From 3944158a6d33f94668dbd6bdc32ff5c67bb53ec2 Mon Sep 17 00:00:00 2001 From: Marc Fiuczynski Date: Mon, 13 Nov 2006 16:33:04 +0000 Subject: [PATCH] Merge to Fedora kernel-2.6.18-1.2224_FC5-vs2.0.2.2-rc4 patched with stable patch-2.6.18.1-vs2.0.2.2-rc4.diff + deltas for rc5 and rc6 --- .gitignore | 8 + CREDITS | 27 +- Documentation/Changes | 15 +- Documentation/CodingStyle | 100 +- Documentation/DMA-mapping.txt | 8 +- Documentation/DocBook/Makefile | 3 +- Documentation/DocBook/kernel-api.tmpl | 65 +- Documentation/DocBook/kernel-locking.tmpl | 2 +- Documentation/DocBook/libata.tmpl | 104 +- Documentation/DocBook/mtdnand.tmpl | 17 +- Documentation/DocBook/videobook.tmpl | 2 +- Documentation/IPMI.txt | 4 +- Documentation/RCU/checklist.txt | 44 +- Documentation/RCU/torture.txt | 34 +- Documentation/RCU/whatisRCU.txt | 18 +- Documentation/README.DAC960 | 6 +- Documentation/SubmittingPatches | 12 +- Documentation/arm/IXP4xx | 2 +- .../arm/Samsung-S3C24XX/Overview.txt | 35 +- Documentation/atomic_ops.txt | 55 +- Documentation/cciss.txt | 1 + Documentation/cpu-freq/user-guide.txt | 5 +- Documentation/cpu-hotplug.txt | 12 +- Documentation/cpusets.txt | 250 +- Documentation/devices.txt | 148 +- Documentation/digiepca.txt | 2 +- Documentation/dontdiff | 6 + Documentation/driver-model/overview.txt | 2 +- Documentation/drivers/edac/edac.txt | 152 +- Documentation/fb/fbcon.txt | 180 +- Documentation/feature-removal-schedule.txt | 321 +- Documentation/filesystems/00-INDEX | 4 +- Documentation/filesystems/Locking | 9 +- .../filesystems/automount-support.txt | 2 +- .../filesystems/configfs/configfs_example.c | 19 +- Documentation/filesystems/devfs/ChangeLog | 1977 -- Documentation/filesystems/devfs/README | 1959 -- Documentation/filesystems/devfs/ToDo | 40 - Documentation/filesystems/devfs/boot-options | 65 - Documentation/filesystems/ext3.txt | 8 + Documentation/filesystems/fuse.txt | 118 +- Documentation/filesystems/inotify.txt | 130 +- Documentation/filesystems/porting | 7 +- .../filesystems/ramfs-rootfs-initramfs.txt | 146 +- Documentation/filesystems/relayfs.txt | 442 - Documentation/filesystems/vfs.txt | 6 +- Documentation/hwmon/lm83 | 17 +- Documentation/hwmon/sysfs-interface | 274 +- Documentation/hwmon/userspace-tools | 17 +- Documentation/i2c/busses/i2c-i801 | 3 +- Documentation/i2c/busses/i2c-nforce2 | 5 +- Documentation/i2c/busses/i2c-piix4 | 42 +- Documentation/i2c/busses/i2c-sis96x | 4 +- Documentation/i2c/busses/scx200_acb | 24 +- Documentation/i386/boot.txt | 1 + Documentation/i386/zero-page.txt | 4 + Documentation/infiniband/ipoib.txt | 14 +- Documentation/initrd.txt | 40 +- Documentation/input/joystick.txt | 1 - Documentation/ioctl-number.txt | 3 +- Documentation/isdn/README.gigaset | 7 +- Documentation/kbuild/makefiles.txt | 22 + Documentation/kdump/gdbmacros.txt | 2 +- Documentation/kdump/kdump.txt | 420 +- Documentation/kernel-parameters.txt | 69 +- Documentation/keys-request-key.txt | 54 +- Documentation/keys.txt | 89 +- Documentation/kobject.txt | 2 +- Documentation/md.txt | 67 + Documentation/memory-barriers.txt | 41 +- Documentation/mips/time.README | 10 +- Documentation/networking/README.ipw2200 | 464 +- Documentation/networking/bonding.txt | 323 +- Documentation/networking/ip-sysctl.txt | 25 +- Documentation/networking/pktgen.txt | 2 +- Documentation/networking/tuntap.txt | 11 +- Documentation/nfsroot.txt | 275 +- Documentation/pci.txt | 18 +- Documentation/pcmcia/devicetable.txt | 36 +- Documentation/power/devices.txt | 90 - Documentation/power/swsusp.txt | 84 +- Documentation/power/video.txt | 4 + Documentation/powerpc/booting-without-of.txt | 20 +- Documentation/ramdisk.txt | 12 +- Documentation/robust-futexes.txt | 2 +- Documentation/rtc.txt | 7 +- Documentation/scsi/00-INDEX | 2 - Documentation/scsi/ChangeLog.megaraid | 123 + Documentation/scsi/ChangeLog.megaraid_sas | 29 + Documentation/scsi/aacraid.txt | 8 +- Documentation/scsi/cpqfc.txt | 272 - Documentation/scsi/ppa.txt | 2 - Documentation/scsi/tmscsim.txt | 2 +- .../sound/alsa/ALSA-Configuration.txt | 123 +- .../alsa/DocBook/writing-an-alsa-driver.tmpl | 62 +- Documentation/sparc/sbus_drivers.txt | 95 +- Documentation/sparse.txt | 40 +- Documentation/sysctl/fs.txt | 20 + Documentation/sysctl/kernel.txt | 25 +- Documentation/sysctl/vm.txt | 53 +- Documentation/sysrq.txt | 5 +- Documentation/tty.txt | 7 - Documentation/usb/proc_usb_info.txt | 2 +- Documentation/usb/usb-help.txt | 3 +- Documentation/usb/usb-serial.txt | 4 +- Documentation/usb/usbmon.txt | 55 +- Documentation/video4linux/CARDLIST.bttv | 4 +- Documentation/video4linux/CARDLIST.cx88 | 10 +- Documentation/video4linux/CARDLIST.saa7134 | 1 + Documentation/video4linux/CARDLIST.tuner | 3 +- Documentation/video4linux/CQcam.txt | 203 +- Documentation/video4linux/Zoran | 23 + Documentation/video4linux/bttv/CONTRIBUTORS | 8 +- Documentation/video4linux/et61x251.txt | 52 +- Documentation/video4linux/ibmcam.txt | 168 +- Documentation/video4linux/ov511.txt | 32 +- Documentation/video4linux/sn9c102.txt | 78 +- Documentation/video4linux/w9968cf.txt | 162 +- Documentation/video4linux/zc0301.txt | 80 +- Documentation/vm/page_migration | 114 +- Documentation/w1/w1.generic | 119 +- Documentation/watchdog/pcwd-watchdog.txt | 75 +- Documentation/watchdog/watchdog-api.txt | 56 +- Documentation/watchdog/watchdog.txt | 23 +- Documentation/x86_64/boot-options.txt | 28 + MAINTAINERS | 218 +- Makefile | 303 +- arch/alpha/boot/bootp.c | 2 +- arch/alpha/boot/bootpz.c | 2 +- arch/alpha/boot/main.c | 2 +- arch/alpha/kernel/alpha_ksyms.c | 14 +- arch/alpha/kernel/asm-offsets.c | 2 +- arch/alpha/kernel/console.c | 1 - arch/alpha/kernel/entry.S | 1 - arch/alpha/kernel/err_ev7.c | 8 +- arch/alpha/kernel/gct.c | 1 - arch/alpha/kernel/head.S | 1 - arch/alpha/kernel/irq.c | 13 +- arch/alpha/kernel/irq_alpha.c | 5 +- arch/alpha/kernel/irq_i8259.c | 3 +- arch/alpha/kernel/irq_pyxis.c | 2 +- arch/alpha/kernel/irq_srm.c | 2 +- arch/alpha/kernel/machvec_impl.h | 1 - arch/alpha/kernel/osf_sys.c | 10 +- arch/alpha/kernel/pci.c | 5 +- arch/alpha/kernel/process.c | 4 +- arch/alpha/kernel/proto.h | 1 - arch/alpha/kernel/setup.c | 55 +- arch/alpha/kernel/signal.c | 2 +- arch/alpha/kernel/smc37c93x.c | 1 - arch/alpha/kernel/srm_env.c | 1 - arch/alpha/kernel/srmcons.c | 1 - arch/alpha/kernel/sys_alcor.c | 3 +- arch/alpha/kernel/sys_cabriolet.c | 3 +- arch/alpha/kernel/sys_dp264.c | 3 +- arch/alpha/kernel/sys_eb64p.c | 3 +- arch/alpha/kernel/sys_eiger.c | 2 +- arch/alpha/kernel/sys_jensen.c | 12 +- arch/alpha/kernel/sys_marvel.c | 6 +- arch/alpha/kernel/sys_mikasa.c | 3 +- arch/alpha/kernel/sys_noritake.c | 3 +- arch/alpha/kernel/sys_rawhide.c | 2 +- arch/alpha/kernel/sys_ruffian.c | 8 +- arch/alpha/kernel/sys_rx164.c | 2 +- arch/alpha/kernel/sys_sable.c | 3 +- arch/alpha/kernel/sys_sio.c | 3 +- arch/alpha/kernel/sys_takara.c | 2 +- arch/alpha/kernel/sys_titan.c | 17 +- arch/alpha/kernel/sys_wildfire.c | 6 +- arch/alpha/kernel/systbls.S | 1 - arch/alpha/kernel/time.c | 3 +- arch/alpha/kernel/traps.c | 1 - arch/alpha/kernel/vmlinux.lds.S | 1 - arch/alpha/lib/callback_srm.S | 1 - arch/alpha/lib/udelay.c | 1 - arch/alpha/mm/extable.c | 1 - arch/alpha/mm/fault.c | 1 - arch/alpha/mm/init.c | 1 - arch/alpha/mm/numa.c | 1 - arch/alpha/oprofile/common.c | 2 +- arch/arm/Kconfig | 132 +- arch/arm/Makefile | 9 +- arch/arm/boot/compressed/head-at91rm9200.S | 18 + arch/arm/boot/compressed/head-clps7500.S | 1 - arch/arm/boot/compressed/head-l7200.S | 1 - arch/arm/boot/compressed/head-sa1100.S | 1 - arch/arm/boot/compressed/head-sharpsl.S | 112 +- arch/arm/boot/compressed/head-xscale.S | 1 - arch/arm/boot/compressed/head.S | 12 +- arch/arm/boot/compressed/ll_char_wr.S | 6 +- arch/arm/common/Makefile | 1 + arch/arm/common/dmabounce.c | 71 +- arch/arm/common/gic.c | 21 +- arch/arm/common/locomo.c | 248 +- arch/arm/common/rtctime.c | 1 + arch/arm/common/sa1111.c | 19 +- arch/arm/common/sharpsl_pm.c | 30 +- arch/arm/common/time-acorn.c | 3 +- arch/arm/common/uengine.c | 59 +- arch/arm/common/via82c505.c | 1 - arch/arm/common/vic.c | 3 +- arch/arm/configs/at91rm9200dk_defconfig | 1 + arch/arm/configs/at91rm9200ek_defconfig | 1 + arch/arm/configs/csb337_defconfig | 38 +- arch/arm/configs/csb637_defconfig | 1 + arch/arm/configs/ep93xx_defconfig | 75 +- arch/arm/configs/ixp2000_defconfig | 55 +- arch/arm/configs/ixp23xx_defconfig | 59 +- arch/arm/configs/lpd7a400_defconfig | 135 +- arch/arm/configs/lpd7a404_defconfig | 430 +- arch/arm/configs/omap_h2_1610_defconfig | 552 +- arch/arm/configs/s3c2410_defconfig | 118 +- arch/arm/kernel/Makefile | 8 +- arch/arm/kernel/apm.c | 1 - arch/arm/kernel/armksyms.c | 13 +- arch/arm/kernel/asm-offsets.c | 6 +- arch/arm/kernel/bios32.c | 19 +- arch/arm/kernel/compat.c | 1 - arch/arm/kernel/debug.S | 1 - arch/arm/kernel/ecard.c | 10 +- arch/arm/kernel/entry-armv.S | 56 +- arch/arm/kernel/entry-common.S | 5 +- arch/arm/kernel/entry-header.S | 1 - arch/arm/kernel/fiq.c | 1 + arch/arm/kernel/head-nommu.S | 3 +- arch/arm/kernel/head.S | 18 +- arch/arm/kernel/irq.c | 963 +- arch/arm/kernel/isa.c | 63 +- arch/arm/kernel/iwmmxt.S | 27 +- arch/arm/kernel/module.c | 1 - arch/arm/kernel/process.c | 90 +- arch/arm/kernel/ptrace.c | 77 +- arch/arm/kernel/setup.c | 51 +- arch/arm/kernel/signal.c | 266 +- arch/arm/kernel/smp.c | 394 +- arch/arm/kernel/time.c | 25 +- arch/arm/kernel/traps.c | 6 +- arch/arm/kernel/vmlinux.lds.S | 9 +- arch/arm/lib/Makefile | 13 +- arch/arm/lib/backtrace.S | 14 +- arch/arm/lib/bitops.h | 36 +- arch/arm/lib/clear_user.S | 8 +- arch/arm/lib/copy_from_user.S | 4 +- arch/arm/lib/copy_page.S | 2 +- arch/arm/lib/copy_to_user.S | 4 +- arch/arm/lib/csumipv6.S | 2 +- arch/arm/lib/delay.S | 18 +- arch/arm/lib/ecard.S | 4 +- arch/arm/lib/findbit.S | 10 +- arch/arm/lib/io-readsb.S | 6 +- arch/arm/lib/io-readsw-armv3.S | 6 +- arch/arm/lib/io-writesb.S | 6 +- arch/arm/lib/io-writesw-armv3.S | 6 +- arch/arm/lib/memchr.S | 2 +- arch/arm/lib/memset.S | 4 +- arch/arm/lib/memzero.S | 4 +- arch/arm/lib/strchr.S | 2 +- arch/arm/lib/strncpy_from_user.S | 7 +- arch/arm/lib/strnlen_user.S | 9 +- arch/arm/lib/strrchr.S | 2 +- arch/arm/lib/uaccess.S | 16 +- arch/arm/lib/ucmpdi2.S | 1 - arch/arm/mach-aaec2000/core.c | 3 +- arch/arm/mach-at91rm9200/Kconfig | 88 +- arch/arm/mach-at91rm9200/Makefile | 31 +- arch/arm/mach-at91rm9200/board-csb337.c | 46 +- arch/arm/mach-at91rm9200/board-csb637.c | 33 +- arch/arm/mach-at91rm9200/board-dk.c | 60 +- arch/arm/mach-at91rm9200/board-ek.c | 50 +- arch/arm/mach-at91rm9200/clock.c | 126 +- arch/arm/mach-at91rm9200/common.c | 115 - arch/arm/mach-at91rm9200/devices.c | 407 +- arch/arm/mach-at91rm9200/generic.h | 15 +- arch/arm/mach-at91rm9200/gpio.c | 103 +- arch/arm/mach-at91rm9200/irq.c | 110 +- arch/arm/mach-at91rm9200/leds.c | 1 - arch/arm/mach-at91rm9200/time.c | 127 - arch/arm/mach-clps711x/fortunet.c | 1 - arch/arm/mach-clps711x/p720t.c | 1 - arch/arm/mach-clps711x/time.c | 3 +- arch/arm/mach-clps7500/core.c | 3 +- arch/arm/mach-ebsa110/core.c | 2 +- arch/arm/mach-ep93xx/Kconfig | 23 + arch/arm/mach-ep93xx/Makefile | 5 +- arch/arm/mach-ep93xx/core.c | 36 +- arch/arm/mach-ep93xx/gesbc9312.c | 25 +- arch/arm/mach-ep93xx/ts72xx.c | 24 +- arch/arm/mach-footbridge/cats-hw.c | 2 +- arch/arm/mach-footbridge/common.c | 1 - arch/arm/mach-footbridge/dc21285-timer.c | 3 +- arch/arm/mach-footbridge/dc21285.c | 11 +- arch/arm/mach-footbridge/dma.c | 1 - arch/arm/mach-footbridge/ebsa285-leds.c | 1 - arch/arm/mach-footbridge/isa-irq.c | 19 +- arch/arm/mach-footbridge/isa-timer.c | 3 +- arch/arm/mach-footbridge/netwinder-hw.c | 1 - arch/arm/mach-footbridge/netwinder-leds.c | 1 - arch/arm/mach-h720x/cpu-h7201.c | 2 +- arch/arm/mach-h720x/cpu-h7202.c | 2 +- arch/arm/mach-h720x/h7201-eval.c | 1 - arch/arm/mach-h720x/h7202-eval.c | 1 - arch/arm/mach-imx/dma.c | 65 +- arch/arm/mach-imx/irq.c | 6 +- arch/arm/mach-imx/time.c | 4 +- arch/arm/mach-integrator/core.c | 3 +- arch/arm/mach-integrator/integrator_ap.c | 3 +- arch/arm/mach-integrator/integrator_cp.c | 9 +- arch/arm/mach-integrator/pci_v3.c | 3 +- arch/arm/mach-integrator/time.c | 2 +- arch/arm/mach-iop3xx/Kconfig | 15 +- arch/arm/mach-iop3xx/common.c | 1 - arch/arm/mach-iop3xx/iop321-irq.c | 3 +- arch/arm/mach-iop3xx/iop321-setup.c | 1 - arch/arm/mach-iop3xx/iop321-time.c | 2 +- arch/arm/mach-iop3xx/iop331-irq.c | 6 +- arch/arm/mach-iop3xx/iop331-setup.c | 1 - arch/arm/mach-iop3xx/iop331-time.c | 2 +- arch/arm/mach-ixp2000/core.c | 10 +- arch/arm/mach-ixp2000/enp2611.c | 1 - arch/arm/mach-ixp2000/ixdp2400.c | 1 - arch/arm/mach-ixp2000/ixdp2800.c | 1 - arch/arm/mach-ixp2000/ixdp2x00.c | 3 +- arch/arm/mach-ixp2000/ixdp2x01.c | 3 +- arch/arm/mach-ixp23xx/core.c | 10 +- arch/arm/mach-ixp23xx/espresso.c | 23 +- arch/arm/mach-ixp23xx/ixdp2351.c | 33 +- arch/arm/mach-ixp23xx/pci.c | 1 - arch/arm/mach-ixp23xx/roadrunner.c | 23 +- arch/arm/mach-ixp4xx/Kconfig | 30 +- arch/arm/mach-ixp4xx/Makefile | 23 +- arch/arm/mach-ixp4xx/common-pci.c | 34 +- arch/arm/mach-ixp4xx/common.c | 222 +- arch/arm/mach-ixp4xx/coyote-pci.c | 11 +- arch/arm/mach-ixp4xx/gtwx5715-setup.c | 34 +- arch/arm/mach-ixp4xx/ixdp425-pci.c | 19 +- arch/arm/mach-ixp4xx/ixdpg425-pci.c | 2 +- arch/arm/mach-ixp4xx/nas100d-pci.c | 2 +- arch/arm/mach-ixp4xx/nas100d-power.c | 7 +- arch/arm/mach-ixp4xx/nas100d-setup.c | 41 +- arch/arm/mach-ixp4xx/nslu2-pci.c | 2 +- arch/arm/mach-ixp4xx/nslu2-power.c | 8 +- arch/arm/mach-ixp4xx/nslu2-setup.c | 48 +- arch/arm/mach-l7200/core.c | 1 + arch/arm/mach-lh7a40x/Kconfig | 5 + arch/arm/mach-lh7a40x/Makefile | 19 +- arch/arm/mach-lh7a40x/arch-kev7a400.c | 3 +- arch/arm/mach-lh7a40x/arch-lpd7a40x.c | 204 +- arch/arm/mach-lh7a40x/common.h | 1 + arch/arm/mach-lh7a40x/irq-kev7a400.c | 3 +- arch/arm/mach-lh7a40x/irq-lh7a400.c | 6 +- arch/arm/mach-lh7a40x/irq-lh7a404.c | 29 +- arch/arm/mach-lh7a40x/irq-lpd7a40x.c | 3 +- arch/arm/mach-lh7a40x/time.c | 10 +- arch/arm/mach-omap1/Kconfig | 7 + arch/arm/mach-omap1/Makefile | 1 + arch/arm/mach-omap1/board-ams-delta.c | 18 + arch/arm/mach-omap1/board-h3.c | 1 - arch/arm/mach-omap1/board-innovator.c | 75 + arch/arm/mach-omap1/board-osk.c | 151 +- arch/arm/mach-omap1/clock.c | 18 +- arch/arm/mach-omap1/devices.c | 1 - arch/arm/mach-omap1/fpga.c | 9 +- arch/arm/mach-omap1/id.c | 1 - arch/arm/mach-omap1/io.c | 1 - arch/arm/mach-omap1/irq.c | 4 +- arch/arm/mach-omap1/leds-h2p2-debug.c | 1 - arch/arm/mach-omap1/leds-innovator.c | 1 - arch/arm/mach-omap1/leds-osk.c | 1 - arch/arm/mach-omap1/mux.c | 1 - arch/arm/mach-omap1/pm.c | 9 +- arch/arm/mach-omap1/serial.c | 4 +- arch/arm/mach-omap1/sleep.S | 1 - arch/arm/mach-omap1/time.c | 7 +- arch/arm/mach-omap2/Kconfig | 1 + arch/arm/mach-omap2/Makefile | 5 +- arch/arm/mach-omap2/board-apollon.c | 6 +- arch/arm/mach-omap2/clock.c | 38 +- arch/arm/mach-omap2/clock.h | 2 +- arch/arm/mach-omap2/devices.c | 47 +- arch/arm/mach-omap2/id.c | 1 - arch/arm/mach-omap2/io.c | 3 +- arch/arm/mach-omap2/irq.c | 4 +- arch/arm/mach-omap2/memory.c | 1 - arch/arm/mach-omap2/mux.c | 39 +- arch/arm/mach-omap2/pm.c | 271 +- arch/arm/mach-omap2/prcm.c | 1 - arch/arm/mach-omap2/sleep.S | 1 - arch/arm/mach-omap2/sram-fn.S | 1 - arch/arm/mach-omap2/timer-gp.c | 86 +- arch/arm/mach-pxa/Kconfig | 20 + arch/arm/mach-pxa/Makefile | 4 +- arch/arm/mach-pxa/corgi.c | 303 +- arch/arm/mach-pxa/corgi_pm.c | 23 +- arch/arm/mach-pxa/corgi_ssp.c | 130 +- arch/arm/mach-pxa/idp.c | 1 + arch/arm/mach-pxa/irq.c | 16 +- arch/arm/mach-pxa/leds-idp.c | 1 - arch/arm/mach-pxa/leds-lubbock.c | 1 - arch/arm/mach-pxa/leds-mainstone.c | 7 +- arch/arm/mach-pxa/leds.c | 2 + arch/arm/mach-pxa/leds.h | 1 + arch/arm/mach-pxa/lpd270.c | 129 +- arch/arm/mach-pxa/lubbock.c | 89 +- arch/arm/mach-pxa/mainstone.c | 179 +- arch/arm/mach-pxa/pm.c | 1 - arch/arm/mach-pxa/poodle.c | 291 +- arch/arm/mach-pxa/pxa25x.c | 3 +- arch/arm/mach-pxa/pxa27x.c | 22 +- arch/arm/mach-pxa/sharpsl_pm.c | 17 +- arch/arm/mach-pxa/sleep.S | 3 +- arch/arm/mach-pxa/spitz.c | 27 +- arch/arm/mach-pxa/spitz_pm.c | 15 + arch/arm/mach-pxa/ssp.c | 35 +- arch/arm/mach-pxa/standby.S | 1 - arch/arm/mach-pxa/time.c | 71 +- arch/arm/mach-pxa/tosa.c | 28 +- arch/arm/mach-realview/core.c | 3 +- arch/arm/mach-realview/realview_eb.c | 1 - arch/arm/mach-rpc/dma.c | 2 +- arch/arm/mach-s3c2410/Kconfig | 62 + arch/arm/mach-s3c2410/Makefile | 43 +- arch/arm/mach-s3c2410/bast-irq.c | 6 +- arch/arm/mach-s3c2410/clock.c | 249 +- arch/arm/mach-s3c2410/clock.h | 13 +- arch/arm/mach-s3c2410/common-smdk.c | 65 + arch/arm/mach-s3c2410/cpu.c | 114 +- arch/arm/mach-s3c2410/cpu.h | 19 +- arch/arm/mach-s3c2410/devs.c | 90 +- arch/arm/mach-s3c2410/devs.h | 9 +- arch/arm/mach-s3c2410/dma.c | 246 +- arch/arm/mach-s3c2410/irq.c | 61 +- arch/arm/mach-s3c2410/irq.h | 10 + arch/arm/mach-s3c2410/mach-anubis.c | 101 +- arch/arm/mach-s3c2410/mach-bast.c | 27 +- arch/arm/mach-s3c2410/mach-h1940.c | 19 +- arch/arm/mach-s3c2410/mach-nexcoder.c | 13 +- arch/arm/mach-s3c2410/mach-osiris.c | 25 +- arch/arm/mach-s3c2410/mach-otom.c | 13 +- arch/arm/mach-s3c2410/mach-rx3715.c | 9 - arch/arm/mach-s3c2410/mach-smdk2410.c | 26 +- arch/arm/mach-s3c2410/mach-smdk2440.c | 123 +- arch/arm/mach-s3c2410/mach-vr1000.c | 21 +- arch/arm/mach-s3c2410/pm-simtec.c | 3 +- arch/arm/mach-s3c2410/pm.c | 5 +- arch/arm/mach-s3c2410/s3c2400-gpio.c | 5 +- arch/arm/mach-s3c2410/s3c2410-gpio.c | 13 +- arch/arm/mach-s3c2410/s3c2410.c | 108 +- arch/arm/mach-s3c2410/s3c2410.h | 10 +- arch/arm/mach-s3c2410/s3c2440-clock.c | 4 +- arch/arm/mach-s3c2410/s3c2440-irq.c | 80 +- arch/arm/mach-s3c2410/s3c2440.c | 234 +- arch/arm/mach-s3c2410/sleep.S | 5 +- arch/arm/mach-s3c2410/time.c | 18 +- arch/arm/mach-s3c2410/usb-simtec.c | 4 +- arch/arm/mach-sa1100/assabet.c | 1 - arch/arm/mach-sa1100/cerf.c | 2 +- arch/arm/mach-sa1100/collie.c | 137 +- arch/arm/mach-sa1100/collie_pm.c | 73 +- arch/arm/mach-sa1100/cpu-sa1110.c | 131 +- arch/arm/mach-sa1100/dma.c | 2 +- arch/arm/mach-sa1100/generic.c | 1 - arch/arm/mach-sa1100/h3600.c | 5 +- arch/arm/mach-sa1100/irq.c | 12 +- arch/arm/mach-sa1100/leds-assabet.c | 1 - arch/arm/mach-sa1100/leds-badge4.c | 1 - arch/arm/mach-sa1100/leds-cerf.c | 1 - arch/arm/mach-sa1100/leds-hackkit.c | 1 - arch/arm/mach-sa1100/leds-lart.c | 1 - arch/arm/mach-sa1100/leds-simpad.c | 1 - arch/arm/mach-sa1100/pleb.c | 1 + arch/arm/mach-sa1100/shannon.c | 1 - arch/arm/mach-sa1100/simpad.c | 1 - arch/arm/mach-sa1100/sleep.S | 2 +- arch/arm/mach-sa1100/ssp.c | 46 +- arch/arm/mach-sa1100/time.c | 81 +- arch/arm/mach-shark/core.c | 3 +- arch/arm/mach-shark/dma.c | 1 - arch/arm/mach-shark/irq.c | 3 +- arch/arm/mach-shark/leds.c | 1 - arch/arm/mach-versatile/core.c | 19 +- arch/arm/mach-versatile/pci.c | 1 - arch/arm/mach-versatile/versatile_ab.c | 1 - arch/arm/mach-versatile/versatile_pb.c | 1 - arch/arm/mm/Kconfig | 90 +- arch/arm/mm/Makefile | 10 +- arch/arm/mm/alignment.c | 1 - arch/arm/mm/cache-v4wb.S | 1 - arch/arm/mm/copypage-v3.S | 2 +- arch/arm/mm/fault.c | 1 - arch/arm/mm/flush.c | 26 + arch/arm/mm/init.c | 3 - arch/arm/mm/ioremap.c | 269 +- arch/arm/mm/mm-armv.c | 40 +- arch/arm/mm/mmap.c | 1 - arch/arm/mm/proc-arm1020.S | 31 +- arch/arm/mm/proc-arm1020e.S | 51 +- arch/arm/mm/proc-arm1022.S | 51 +- arch/arm/mm/proc-arm1026.S | 51 +- arch/arm/mm/proc-arm6_7.S | 31 + arch/arm/mm/proc-arm720.S | 37 +- arch/arm/mm/proc-arm920.S | 43 +- arch/arm/mm/proc-arm922.S | 43 +- arch/arm/mm/proc-arm925.S | 51 +- arch/arm/mm/proc-arm926.S | 48 +- arch/arm/mm/proc-macros.S | 10 + arch/arm/mm/proc-sa110.S | 32 +- arch/arm/mm/proc-sa1100.S | 34 +- arch/arm/mm/proc-syms.c | 8 + arch/arm/mm/proc-v6.S | 58 +- arch/arm/mm/proc-xsc3.S | 28 +- arch/arm/mm/proc-xscale.S | 93 +- arch/arm/nwfpe/entry26.S | 2 +- arch/arm/nwfpe/fpa11.c | 1 - arch/arm/nwfpe/fpa11.h | 1 - arch/arm/nwfpe/fpa11_cpdo.c | 1 - arch/arm/nwfpe/fpa11_cpdt.c | 1 - arch/arm/nwfpe/fpa11_cprt.c | 1 - arch/arm/nwfpe/fpmodule.c | 26 +- arch/arm/nwfpe/fpopcode.c | 1 - arch/arm/nwfpe/fpopcode.h | 1 - arch/arm/nwfpe/softfloat.h | 3 +- arch/arm/oprofile/op_model_xscale.c | 2 +- arch/arm/plat-omap/Kconfig | 2 +- arch/arm/plat-omap/clock.c | 5 +- arch/arm/plat-omap/common.c | 1 - arch/arm/plat-omap/cpu-omap.c | 18 +- arch/arm/plat-omap/devices.c | 11 +- arch/arm/plat-omap/dma.c | 88 +- arch/arm/plat-omap/dmtimer.c | 428 +- arch/arm/plat-omap/fb.c | 1 - arch/arm/plat-omap/gpio.c | 115 +- arch/arm/plat-omap/mux.c | 1 - arch/arm/plat-omap/ocpi.c | 1 - arch/arm/plat-omap/pm.c | 2 +- arch/arm/plat-omap/sram-fn.S | 1 - arch/arm/plat-omap/sram.c | 10 +- arch/arm/plat-omap/timer32k.c | 128 +- arch/arm/plat-omap/usb.c | 1 - arch/arm/tools/mach-types | 71 +- arch/arm/vfp/Makefile | 5 +- arch/arm/vfp/vfp.h | 33 +- arch/arm/vfp/vfpdouble.c | 80 +- arch/arm/vfp/vfphw.S | 18 +- arch/arm/vfp/vfpmodule.c | 82 +- arch/arm/vfp/vfpsingle.c | 80 +- arch/arm26/Kconfig | 6 +- arch/arm26/boot/compressed/head.S | 1 - arch/arm26/kernel/armksyms.c | 1 - arch/arm26/kernel/asm-offsets.c | 1 - arch/arm26/kernel/compat.c | 1 - arch/arm26/kernel/ecard.c | 1 - arch/arm26/kernel/fiq.c | 1 - arch/arm26/kernel/head.S | 1 - arch/arm26/kernel/irq.c | 21 +- arch/arm26/kernel/process.c | 1 - arch/arm26/kernel/ptrace.c | 33 +- arch/arm26/kernel/semaphore.c | 1 - arch/arm26/kernel/setup.c | 3 +- arch/arm26/kernel/signal.c | 1 - arch/arm26/kernel/time.c | 3 +- arch/arm26/kernel/traps.c | 1 - arch/arm26/kernel/vmlinux.lds.S | 1 - arch/arm26/lib/backtrace.S | 1 - arch/arm26/lib/csumpartialcopyuser.S | 1 - arch/arm26/lib/ecard.S | 1 - arch/arm26/lib/io-acorn.S | 1 - arch/arm26/lib/kbd.c | 1 - arch/arm26/lib/lib1funcs.S | 1 - arch/arm26/machine/dma.c | 1 - arch/arm26/machine/irq.c | 1 - arch/arm26/mm/extable.c | 1 - arch/arm26/mm/fault.c | 1 - arch/arm26/mm/init.c | 1 - arch/arm26/nwfpe/fpmodule.c | 1 - arch/arm26/nwfpe/fpmodule.h | 1 - arch/cris/Kconfig | 4 + arch/cris/arch-v10/boot/compressed/head.S | 1 - arch/cris/arch-v10/boot/compressed/misc.c | 1 - arch/cris/arch-v10/boot/rescue/head.S | 1 - arch/cris/arch-v10/boot/rescue/kimagerescue.S | 1 - arch/cris/arch-v10/drivers/axisflashmap.c | 1 - arch/cris/arch-v10/drivers/ds1302.c | 1 - arch/cris/arch-v10/drivers/eeprom.c | 5 +- arch/cris/arch-v10/drivers/gpio.c | 7 +- arch/cris/arch-v10/drivers/i2c.c | 1 - arch/cris/arch-v10/drivers/pcf8563.c | 1 - arch/cris/arch-v10/kernel/crisksyms.c | 1 - arch/cris/arch-v10/kernel/debugport.c | 3 +- arch/cris/arch-v10/kernel/entry.S | 1 - arch/cris/arch-v10/kernel/fasttimer.c | 1 - arch/cris/arch-v10/kernel/head.S | 1 - arch/cris/arch-v10/kernel/irq.c | 3 +- arch/cris/arch-v10/kernel/process.c | 1 - arch/cris/arch-v10/kernel/setup.c | 1 - arch/cris/arch-v10/kernel/time.c | 7 +- arch/cris/arch-v10/kernel/traps.c | 1 - arch/cris/arch-v10/lib/dram_init.S | 1 - arch/cris/arch-v10/mm/init.c | 1 - arch/cris/arch-v10/vmlinux.lds.S | 1 - arch/cris/arch-v32/boot/compressed/head.S | 1 - arch/cris/arch-v32/boot/compressed/misc.c | 1 - arch/cris/arch-v32/boot/rescue/head.S | 1 - arch/cris/arch-v32/drivers/axisflashmap.c | 1 - arch/cris/arch-v32/drivers/cryptocop.c | 2 +- arch/cris/arch-v32/drivers/gpio.c | 7 +- arch/cris/arch-v32/drivers/i2c.c | 1 - arch/cris/arch-v32/drivers/pcf8563.c | 3 - arch/cris/arch-v32/drivers/pci/bios.c | 6 +- arch/cris/arch-v32/drivers/sync_serial.c | 13 +- arch/cris/arch-v32/kernel/arbiter.c | 11 +- arch/cris/arch-v32/kernel/crisksyms.c | 1 - arch/cris/arch-v32/kernel/debugport.c | 3 +- arch/cris/arch-v32/kernel/dma.c | 4 +- arch/cris/arch-v32/kernel/entry.S | 1 - arch/cris/arch-v32/kernel/fasttimer.c | 3 +- arch/cris/arch-v32/kernel/head.S | 1 - arch/cris/arch-v32/kernel/io.c | 1 - arch/cris/arch-v32/kernel/irq.c | 5 +- arch/cris/arch-v32/kernel/kgdb_asm.S | 1 - arch/cris/arch-v32/kernel/process.c | 1 - arch/cris/arch-v32/kernel/setup.c | 1 - arch/cris/arch-v32/kernel/smp.c | 2 +- arch/cris/arch-v32/kernel/time.c | 13 +- arch/cris/arch-v32/kernel/traps.c | 1 - arch/cris/arch-v32/lib/dram_init.S | 1 - arch/cris/arch-v32/lib/hw_settings.S | 1 - arch/cris/arch-v32/lib/nand_init.S | 1 - arch/cris/arch-v32/mm/init.c | 2 - arch/cris/arch-v32/vmlinux.lds.S | 1 - arch/cris/kernel/crisksyms.c | 25 +- arch/cris/kernel/irq.c | 6 +- arch/cris/kernel/setup.c | 3 +- arch/frv/Kconfig | 43 +- arch/frv/kernel/asm-offsets.c | 116 +- arch/frv/kernel/break.S | 112 +- arch/frv/kernel/cmode.S | 1 - arch/frv/kernel/debug-stub.c | 13 +- arch/frv/kernel/entry-table.S | 40 +- arch/frv/kernel/entry.S | 121 +- arch/frv/kernel/frv_ksyms.c | 47 +- arch/frv/kernel/gdb-stub.c | 161 +- arch/frv/kernel/head-mmu-fr451.S | 1 - arch/frv/kernel/head-uc-fr401.S | 1 - arch/frv/kernel/head-uc-fr451.S | 1 - arch/frv/kernel/head-uc-fr555.S | 1 - arch/frv/kernel/head.S | 5 +- arch/frv/kernel/irq-mb93091.c | 1 - arch/frv/kernel/irq-mb93093.c | 1 - arch/frv/kernel/irq-mb93493.c | 1 - arch/frv/kernel/irq-routing.c | 12 +- arch/frv/kernel/irq.c | 91 +- arch/frv/kernel/local.h | 3 + arch/frv/kernel/pm-mb93093.c | 1 - arch/frv/kernel/pm.c | 47 +- arch/frv/kernel/process.c | 48 +- arch/frv/kernel/ptrace.c | 59 +- arch/frv/kernel/semaphore.c | 3 +- arch/frv/kernel/setup.c | 9 +- arch/frv/kernel/signal.c | 258 +- arch/frv/kernel/sleep.S | 1 - arch/frv/kernel/switch_to.S | 4 +- arch/frv/kernel/sys_frv.c | 2 +- arch/frv/kernel/sysctl.c | 5 +- arch/frv/kernel/time.c | 88 +- arch/frv/kernel/traps.c | 29 +- arch/frv/kernel/uaccess.c | 13 +- arch/frv/mb93090-mb00/pci-frv.c | 12 +- arch/frv/mb93090-mb00/pci-irq.c | 15 +- arch/frv/mb93090-mb00/pci-vdk.c | 12 +- arch/frv/mm/dma-alloc.c | 12 +- arch/frv/mm/extable.c | 35 +- arch/frv/mm/init.c | 10 +- arch/frv/mm/kmap.c | 16 +- arch/frv/mm/mmu-context.c | 1 - arch/frv/mm/tlb-flush.S | 1 - arch/frv/mm/tlb-miss.S | 1 - arch/frv/mm/unaligned.c | 1 - arch/h8300/kernel/gpio.c | 1 - arch/h8300/kernel/h8300_ksyms.c | 1 - arch/h8300/kernel/ints.c | 9 +- arch/h8300/kernel/process.c | 1 - arch/h8300/kernel/ptrace.c | 1 - arch/h8300/kernel/semaphore.c | 1 - arch/h8300/kernel/setup.c | 1 - arch/h8300/kernel/signal.c | 2 +- arch/h8300/kernel/syscalls.S | 1 - arch/h8300/kernel/time.c | 1 - arch/h8300/kernel/vmlinux.lds.S | 1 - arch/h8300/lib/romfs.S | 1 - arch/h8300/mm/init.c | 1 - arch/h8300/mm/kmap.c | 1 - arch/h8300/mm/memory.c | 1 - .../platform/h8300h/aki3068net/crt0_ram.S | 1 - arch/h8300/platform/h8300h/aki3068net/timer.c | 1 - arch/h8300/platform/h8300h/entry.S | 1 - arch/h8300/platform/h8300h/generic/crt0_ram.S | 1 - arch/h8300/platform/h8300h/generic/crt0_rom.S | 1 - arch/h8300/platform/h8300h/generic/timer.c | 1 - arch/h8300/platform/h8300h/h8max/crt0_ram.S | 1 - arch/h8300/platform/h8300h/h8max/timer.c | 1 - arch/h8300/platform/h8300h/ints_h8300h.c | 1 - arch/h8300/platform/h8s/edosk2674/crt0_ram.S | 1 - arch/h8300/platform/h8s/edosk2674/crt0_rom.S | 1 - arch/h8300/platform/h8s/edosk2674/timer.c | 1 - arch/h8300/platform/h8s/entry.S | 1 - arch/h8300/platform/h8s/generic/crt0_ram.S | 1 - arch/h8300/platform/h8s/generic/crt0_rom.S | 1 - arch/h8300/platform/h8s/generic/timer.c | 1 - arch/h8300/platform/h8s/ints.c | 9 +- arch/h8300/platform/h8s/ints_h8s.c | 1 - arch/i386/Kconfig | 97 +- arch/i386/Kconfig.cpu | 7 +- arch/i386/Kconfig.debug | 13 +- arch/i386/boot/Makefile | 9 +- arch/i386/boot/compressed/misc.c | 32 +- arch/i386/boot/setup.S | 3 +- arch/i386/boot/video.S | 31 +- arch/i386/crypto/aes-i586-asm.S | 67 +- arch/i386/crypto/aes.c | 76 +- arch/i386/defconfig | 2 +- arch/i386/kernel/Makefile | 12 +- arch/i386/kernel/acpi/boot.c | 13 +- arch/i386/kernel/acpi/processor.c | 2 +- arch/i386/kernel/acpi/sleep.c | 19 +- arch/i386/kernel/acpi/wakeup.S | 16 +- arch/i386/kernel/alternative.c | 142 +- arch/i386/kernel/apic.c | 94 +- arch/i386/kernel/apm.c | 71 +- arch/i386/kernel/asm-offsets.c | 4 + arch/i386/kernel/bootflag.c | 1 - arch/i386/kernel/cpu/amd.c | 22 +- arch/i386/kernel/cpu/common.c | 27 +- arch/i386/kernel/cpu/cpufreq/Kconfig | 3 +- arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c | 316 +- .../i386/kernel/cpu/cpufreq/cpufreq-nforce2.c | 11 +- arch/i386/kernel/cpu/cpufreq/longhaul.c | 241 +- arch/i386/kernel/cpu/cpufreq/longrun.c | 1 - arch/i386/kernel/cpu/cpufreq/p4-clockmod.c | 1 - arch/i386/kernel/cpu/cpufreq/powernow-k7.c | 9 +- arch/i386/kernel/cpu/cpufreq/powernow-k8.c | 348 +- arch/i386/kernel/cpu/cpufreq/powernow-k8.h | 44 +- .../kernel/cpu/cpufreq/speedstep-centrino.c | 281 +- arch/i386/kernel/cpu/cpufreq/speedstep-smi.c | 3 - arch/i386/kernel/cpu/cyrix.c | 11 +- arch/i386/kernel/cpu/intel.c | 7 +- arch/i386/kernel/cpu/intel_cacheinfo.c | 352 +- arch/i386/kernel/cpu/mcheck/k7.c | 1 - arch/i386/kernel/cpu/mcheck/mce.c | 1 - arch/i386/kernel/cpu/mcheck/mce.h | 2 +- arch/i386/kernel/cpu/mcheck/non-fatal.c | 1 - arch/i386/kernel/cpu/mcheck/p4.c | 1 - arch/i386/kernel/cpu/proc.c | 10 +- arch/i386/kernel/cpuid.c | 9 +- arch/i386/kernel/crash.c | 14 +- arch/i386/kernel/doublefault.c | 3 +- arch/i386/kernel/efi.c | 7 +- arch/i386/kernel/efi_stub.S | 1 - arch/i386/kernel/entry.S | 350 +- arch/i386/kernel/head.S | 15 +- arch/i386/kernel/i386_ksyms.c | 1 - arch/i386/kernel/i387.c | 146 +- arch/i386/kernel/i8259.c | 13 +- arch/i386/kernel/io_apic.c | 102 +- arch/i386/kernel/ioport.c | 1 + arch/i386/kernel/irq.c | 39 +- arch/i386/kernel/kprobes.c | 99 +- arch/i386/kernel/machine_kexec.c | 17 +- arch/i386/kernel/mca.c | 1 - arch/i386/kernel/microcode.c | 74 +- arch/i386/kernel/module.c | 4 - arch/i386/kernel/mpparse.c | 6 +- arch/i386/kernel/msr.c | 12 +- arch/i386/kernel/nmi.c | 76 +- arch/i386/kernel/numaq.c | 11 +- arch/i386/kernel/process.c | 77 +- arch/i386/kernel/ptrace.c | 858 +- arch/i386/kernel/quirks.c | 1 - arch/i386/kernel/reboot.c | 1 - arch/i386/kernel/scx200.c | 67 +- arch/i386/kernel/semaphore.c | 1 - arch/i386/kernel/setup.c | 39 +- arch/i386/kernel/signal.c | 41 +- arch/i386/kernel/smp.c | 12 +- arch/i386/kernel/smpboot.c | 119 +- arch/i386/kernel/srat.c | 20 +- arch/i386/kernel/syscall_table.S | 1 + arch/i386/kernel/sysenter.c | 183 +- arch/i386/kernel/time.c | 165 +- arch/i386/kernel/time_hpet.c | 1 - arch/i386/kernel/timers/Makefile | 9 - arch/i386/kernel/timers/common.c | 172 - arch/i386/kernel/timers/timer.c | 75 - arch/i386/kernel/timers/timer_cyclone.c | 259 - arch/i386/kernel/timers/timer_hpet.c | 217 - arch/i386/kernel/timers/timer_none.c | 39 - arch/i386/kernel/timers/timer_pit.c | 177 - arch/i386/kernel/timers/timer_pm.c | 342 - arch/i386/kernel/timers/timer_tsc.c | 617 - arch/i386/kernel/topology.c | 28 +- arch/i386/kernel/traps.c | 275 +- arch/i386/kernel/vm86.c | 8 - arch/i386/kernel/vmlinux.lds.S | 28 +- arch/i386/kernel/vsyscall-sysenter.S | 6 +- arch/i386/kernel/vsyscall.lds.S | 5 +- arch/i386/lib/checksum.S | 1 - arch/i386/lib/delay.c | 67 +- arch/i386/lib/memcpy.c | 1 - arch/i386/lib/mmx.c | 1 - arch/i386/lib/usercopy.c | 259 +- arch/i386/mach-default/setup.c | 46 +- arch/i386/mach-generic/bigsmp.c | 1 - arch/i386/mach-generic/default.c | 1 - arch/i386/mach-generic/es7000.c | 1 - arch/i386/mach-generic/probe.c | 1 - arch/i386/mach-generic/summit.c | 1 - arch/i386/mach-visws/mpparse.c | 1 - arch/i386/mach-visws/setup.c | 47 +- arch/i386/mach-visws/traps.c | 1 - arch/i386/mach-visws/visws_apic.c | 13 +- arch/i386/mach-voyager/setup.c | 82 +- arch/i386/mach-voyager/voyager_basic.c | 1 - arch/i386/mach-voyager/voyager_cat.c | 1 - arch/i386/mach-voyager/voyager_smp.c | 11 +- arch/i386/mach-voyager/voyager_thread.c | 1 - arch/i386/mm/boot_ioremap.c | 8 +- arch/i386/mm/discontig.c | 3 +- arch/i386/mm/extable.c | 1 - arch/i386/mm/fault.c | 61 +- arch/i386/mm/hugetlbpage.c | 1 - arch/i386/mm/init.c | 18 +- arch/i386/mm/pageattr.c | 21 +- arch/i386/mm/pgtable.c | 27 +- arch/i386/oprofile/nmi_int.c | 11 +- arch/i386/oprofile/op_model_athlon.c | 1 + arch/i386/oprofile/op_model_p4.c | 1 + arch/i386/oprofile/op_model_ppro.c | 1 + arch/i386/pci/common.c | 5 +- arch/i386/pci/i386.c | 17 +- arch/i386/pci/init.c | 9 +- arch/i386/pci/irq.c | 18 +- arch/i386/pci/mmconfig.c | 2 +- arch/i386/pci/pcbios.c | 6 +- arch/i386/pci/pci.h | 3 +- arch/i386/pci/visws.c | 1 - arch/i386/power/cpu.c | 3 +- arch/ia64/Kconfig | 85 +- arch/ia64/Makefile | 18 +- arch/ia64/configs/sn2_defconfig | 2 +- arch/ia64/configs/tiger_defconfig | 2 +- arch/ia64/defconfig | 2 +- arch/ia64/dig/setup.c | 20 +- arch/ia64/hp/common/sba_iommu.c | 5 +- arch/ia64/hp/sim/Makefile | 2 + arch/ia64/hp/sim/boot/bootloader.c | 1 - arch/ia64/hp/sim/boot/fw-emu.c | 1 - arch/ia64/hp/sim/hpsim_console.c | 1 - arch/ia64/hp/sim/hpsim_irq.c | 6 +- arch/ia64/hp/sim/hpsim_setup.c | 1 - arch/ia64/hp/sim/simeth.c | 1 - arch/ia64/hp/sim/simscsi.c | 5 +- arch/ia64/hp/sim/simserial.c | 3 +- arch/ia64/ia32/Makefile | 1 + arch/ia64/ia32/binfmt_elf32.c | 1 - arch/ia64/ia32/ia32_entry.S | 2 +- arch/ia64/ia32/ia32priv.h | 1 - arch/ia64/ia32/sys_ia32.c | 47 +- arch/ia64/kernel/Makefile | 4 +- arch/ia64/kernel/acpi-ext.c | 3 +- arch/ia64/kernel/acpi.c | 56 +- arch/ia64/kernel/asm-offsets.c | 44 +- arch/ia64/kernel/cpufreq/acpi-cpufreq.c | 1 - arch/ia64/kernel/efi.c | 165 +- arch/ia64/kernel/efi_stub.S | 2 +- arch/ia64/kernel/entry.S | 39 +- arch/ia64/kernel/entry.h | 2 +- arch/ia64/kernel/fsys.S | 16 +- arch/ia64/kernel/gate.S | 114 +- arch/ia64/kernel/gate.lds.S | 24 +- arch/ia64/kernel/head.S | 14 +- arch/ia64/kernel/ia64_ksyms.c | 4 +- arch/ia64/kernel/iosapic.c | 90 +- arch/ia64/kernel/irq.c | 24 +- arch/ia64/kernel/irq_ia64.c | 285 +- arch/ia64/kernel/irq_lsapic.c | 10 +- arch/ia64/kernel/ivt.S | 1 - arch/ia64/kernel/kprobes.c | 10 +- arch/ia64/kernel/machvec.c | 1 - arch/ia64/kernel/mca.c | 27 +- arch/ia64/kernel/mca_asm.S | 29 +- arch/ia64/kernel/mca_drv.c | 1 - arch/ia64/kernel/mca_drv_asm.S | 1 - arch/ia64/kernel/minstate.h | 1 - arch/ia64/kernel/module.c | 1 - arch/ia64/kernel/numa.c | 35 +- arch/ia64/kernel/pal.S | 23 +- arch/ia64/kernel/palinfo.c | 46 +- arch/ia64/kernel/patch.c | 71 + arch/ia64/kernel/perfmon.c | 22 +- arch/ia64/kernel/perfmon_default_smpl.c | 1 - arch/ia64/kernel/process.c | 5 +- arch/ia64/kernel/ptrace.c | 1675 +- arch/ia64/kernel/sal.c | 7 +- arch/ia64/kernel/salinfo.c | 6 +- arch/ia64/kernel/setup.c | 129 +- arch/ia64/kernel/signal.c | 5 +- arch/ia64/kernel/smpboot.c | 11 +- arch/ia64/kernel/sys_ia64.c | 3 +- arch/ia64/kernel/time.c | 3 +- arch/ia64/kernel/topology.c | 424 +- arch/ia64/kernel/traps.c | 6 +- arch/ia64/kernel/uncached.c | 256 +- arch/ia64/kernel/vmlinux.lds.S | 1 - arch/ia64/lib/Makefile | 2 +- arch/ia64/lib/clear_page.S | 1 - arch/ia64/lib/io.c | 1 - arch/ia64/lib/memcpy_mck.S | 1 - arch/ia64/mm/contig.c | 17 +- arch/ia64/mm/discontig.c | 135 +- arch/ia64/mm/extable.c | 1 - arch/ia64/mm/fault.c | 36 +- arch/ia64/mm/hugetlbpage.c | 1 - arch/ia64/mm/init.c | 61 +- arch/ia64/mm/ioremap.c | 30 +- arch/ia64/mm/numa.c | 1 - arch/ia64/mm/tlb.c | 1 - arch/ia64/oprofile/perfmon.c | 1 - arch/ia64/pci/pci.c | 25 +- arch/ia64/sn/kernel/bte.c | 1 - arch/ia64/sn/kernel/huberror.c | 15 +- arch/ia64/sn/kernel/io_init.c | 577 +- arch/ia64/sn/kernel/irq.c | 148 +- arch/ia64/sn/kernel/setup.c | 21 +- arch/ia64/sn/kernel/sn2/cache.c | 15 +- arch/ia64/sn/kernel/sn2/prominfo_proc.c | 1 - arch/ia64/sn/kernel/sn2/sn_hwperf.c | 50 +- arch/ia64/sn/kernel/sn2/sn_proc_fs.c | 1 - arch/ia64/sn/kernel/xpc_channel.c | 2 +- arch/ia64/sn/kernel/xpc_main.c | 2 +- arch/ia64/sn/kernel/xpnet.c | 7 +- arch/ia64/sn/pci/pci_dma.c | 75 +- arch/ia64/sn/pci/pcibr/pcibr_dma.c | 201 +- arch/ia64/sn/pci/pcibr/pcibr_provider.c | 138 +- arch/ia64/sn/pci/tioca_provider.c | 116 +- arch/ia64/sn/pci/tioce_provider.c | 77 +- arch/m32r/boot/compressed/head.S | 1 - arch/m32r/boot/compressed/m32r_sio.c | 1 - arch/m32r/boot/compressed/misc.c | 1 - arch/m32r/boot/compressed/vmlinux.lds.S | 1 - arch/m32r/boot/setup.S | 1 - arch/m32r/kernel/align.c | 1 - arch/m32r/kernel/entry.S | 1 - arch/m32r/kernel/head.S | 1 - arch/m32r/kernel/io_m32104ut.c | 1 - arch/m32r/kernel/io_m32700ut.c | 1 - arch/m32r/kernel/io_mappi.c | 1 - arch/m32r/kernel/io_mappi2.c | 1 - arch/m32r/kernel/io_mappi3.c | 1 - arch/m32r/kernel/io_oaks32r.c | 1 - arch/m32r/kernel/io_opsput.c | 1 - arch/m32r/kernel/io_usrv.c | 1 - arch/m32r/kernel/irq.c | 2 +- arch/m32r/kernel/m32r_ksyms.c | 1 - arch/m32r/kernel/module.c | 1 - arch/m32r/kernel/process.c | 1 - arch/m32r/kernel/ptrace.c | 1 - arch/m32r/kernel/semaphore.c | 1 - arch/m32r/kernel/setup.c | 5 +- arch/m32r/kernel/setup_m32104ut.c | 9 +- arch/m32r/kernel/setup_m32700ut.c | 29 +- arch/m32r/kernel/setup_mappi.c | 17 +- arch/m32r/kernel/setup_mappi2.c | 21 +- arch/m32r/kernel/setup_mappi3.c | 21 +- arch/m32r/kernel/setup_oaks32r.c | 13 +- arch/m32r/kernel/setup_opsput.c | 29 +- arch/m32r/kernel/setup_usrv.c | 19 +- arch/m32r/kernel/signal.c | 1 - arch/m32r/kernel/smpboot.c | 1 - arch/m32r/kernel/sys_m32r.c | 1 - arch/m32r/kernel/time.c | 3 +- arch/m32r/kernel/traps.c | 1 - arch/m32r/kernel/vmlinux.lds.S | 1 - arch/m32r/lib/ashxdi3.S | 1 - arch/m32r/lib/checksum.S | 1 - arch/m32r/lib/delay.c | 1 - arch/m32r/lib/memcpy.S | 1 - arch/m32r/lib/memset.S | 1 - arch/m32r/lib/strlen.S | 1 - arch/m32r/lib/usercopy.c | 1 - arch/m32r/mm/cache.c | 1 - arch/m32r/mm/discontig.c | 1 - arch/m32r/mm/fault-nommu.c | 1 - arch/m32r/mm/fault.c | 3 +- arch/m32r/mm/mmu.S | 1 - arch/m68k/amiga/amiga_ksyms.c | 3 - arch/m68k/amiga/amiints.c | 386 +- arch/m68k/amiga/amisound.c | 1 - arch/m68k/amiga/chipram.c | 1 - arch/m68k/amiga/cia.c | 156 +- arch/m68k/amiga/config.c | 16 - arch/m68k/apollo/Makefile | 2 +- arch/m68k/apollo/config.c | 25 +- arch/m68k/apollo/dn_ints.c | 137 +- arch/m68k/atari/ataints.c | 278 +- arch/m68k/atari/config.c | 12 - arch/m68k/atari/debug.c | 1 - arch/m68k/atari/hades-pci.c | 1 - arch/m68k/atari/stram.c | 1 - arch/m68k/bvme6000/Makefile | 2 +- arch/m68k/bvme6000/bvmeints.c | 160 - arch/m68k/bvme6000/config.c | 21 +- arch/m68k/hp300/Makefile | 2 +- arch/m68k/hp300/config.c | 12 +- arch/m68k/hp300/ints.c | 175 - arch/m68k/hp300/ints.h | 9 - arch/m68k/hp300/time.c | 3 +- arch/m68k/kernel/Makefile | 4 +- arch/m68k/kernel/bios32.c | 1 - arch/m68k/kernel/entry.S | 105 +- arch/m68k/kernel/head.S | 1 - arch/m68k/kernel/ints.c | 383 +- arch/m68k/kernel/m68k_ksyms.c | 3 - arch/m68k/kernel/process.c | 1 - arch/m68k/kernel/ptrace.c | 1 - arch/m68k/kernel/semaphore.c | 1 - arch/m68k/kernel/setup.c | 4 - arch/m68k/kernel/signal.c | 2 +- arch/m68k/kernel/time.c | 1 - arch/m68k/kernel/traps.c | 189 +- arch/m68k/kernel/vmlinux.lds.S | 1 - arch/m68k/lib/Makefile | 4 +- arch/m68k/mac/baboon.c | 2 +- arch/m68k/mac/config.c | 34 - arch/m68k/mac/debug.c | 1 - arch/m68k/mac/iop.c | 3 +- arch/m68k/mac/macints.c | 504 +- arch/m68k/mac/misc.c | 1 - arch/m68k/mac/oss.c | 14 +- arch/m68k/mac/psc.c | 10 +- arch/m68k/mac/via.c | 33 +- arch/m68k/math-emu/fp_entry.S | 1 - arch/m68k/math-emu/fp_util.S | 1 - arch/m68k/mm/init.c | 1 - arch/m68k/mm/kmap.c | 7 +- arch/m68k/mm/memory.c | 7 +- arch/m68k/mm/motorola.c | 13 +- arch/m68k/mm/sun3mmu.c | 5 +- arch/m68k/mvme147/147ints.c | 145 - arch/m68k/mvme147/Makefile | 2 +- arch/m68k/mvme147/config.c | 22 +- arch/m68k/mvme16x/16xints.c | 149 - arch/m68k/mvme16x/Makefile | 2 +- arch/m68k/mvme16x/config.c | 23 +- arch/m68k/q40/config.c | 14 - arch/m68k/q40/q40ints.c | 481 +- arch/m68k/sun3/config.c | 9 - arch/m68k/sun3/prom/init.c | 1 - arch/m68k/sun3/prom/printf.c | 1 - arch/m68k/sun3/sun3dvma.c | 7 +- arch/m68k/sun3/sun3ints.c | 209 +- arch/m68k/sun3x/config.c | 8 - arch/m68knommu/Kconfig | 297 +- arch/m68knommu/Makefile | 24 +- arch/m68knommu/defconfig | 207 +- arch/m68knommu/kernel/comempci.c | 4 +- arch/m68knommu/kernel/entry.S | 1 - arch/m68knommu/kernel/m68k_ksyms.c | 1 - arch/m68knommu/kernel/process.c | 1 - arch/m68knommu/kernel/ptrace.c | 1 - arch/m68knommu/kernel/semaphore.c | 1 - arch/m68knommu/kernel/setup.c | 69 +- arch/m68knommu/kernel/signal.c | 6 +- arch/m68knommu/kernel/syscalltable.S | 1 - arch/m68knommu/kernel/time.c | 1 - arch/m68knommu/kernel/traps.c | 5 +- arch/m68knommu/kernel/vmlinux.lds.S | 225 +- arch/m68knommu/lib/semaphore.S | 1 - arch/m68knommu/mm/init.c | 7 +- arch/m68knommu/mm/kmap.c | 1 - arch/m68knommu/mm/memory.c | 1 - arch/m68knommu/platform/5206/config.c | 1 - arch/m68knommu/platform/5206e/config.c | 1 - arch/m68knommu/platform/520x/config.c | 1 - arch/m68knommu/platform/523x/config.c | 1 - arch/m68knommu/platform/5249/config.c | 1 - arch/m68knommu/platform/5272/config.c | 1 - arch/m68knommu/platform/527x/config.c | 1 - arch/m68knommu/platform/528x/config.c | 1 - arch/m68knommu/platform/5307/Makefile | 1 + arch/m68knommu/platform/5307/config.c | 1 - arch/m68knommu/platform/5307/entry.S | 47 +- arch/m68knommu/platform/5307/head.S | 73 +- arch/m68knommu/platform/5307/ints.c | 1 - arch/m68knommu/platform/5307/pit.c | 40 +- arch/m68knommu/platform/5307/timers.c | 54 +- arch/m68knommu/platform/5307/vectors.c | 1 - arch/m68knommu/platform/5407/config.c | 1 - arch/m68knommu/platform/68328/Makefile | 1 + arch/m68knommu/platform/68328/config.c | 1 - arch/m68knommu/platform/68328/entry.S | 1 - arch/m68knommu/platform/68328/head-de2.S | 1 - arch/m68knommu/platform/68328/head-pilot.S | 4 +- arch/m68knommu/platform/68328/head-ram.S | 7 +- arch/m68knommu/platform/68328/head-rom.S | 19 +- arch/m68knommu/platform/68328/ints.c | 20 +- arch/m68knommu/platform/68328/timers.c | 1 - arch/m68knommu/platform/68360/config.c | 15 +- arch/m68knommu/platform/68360/entry.S | 1 - arch/m68knommu/platform/68360/head-ram.S | 20 +- arch/m68knommu/platform/68360/head-rom.S | 18 +- arch/m68knommu/platform/68360/ints.c | 2 +- arch/m68knommu/platform/68EZ328/config.c | 15 +- arch/m68knommu/platform/68VZ328/config.c | 15 +- arch/mips/Kconfig | 351 +- arch/mips/Kconfig.debug | 4 + arch/mips/Makefile | 44 +- arch/mips/arc/identify.c | 1 - arch/mips/au1000/common/au1xxx_irqmap.c | 5 +- arch/mips/au1000/common/dbdma.c | 9 +- arch/mips/au1000/common/dbg_io.c | 1 - arch/mips/au1000/common/dma.c | 1 - arch/mips/au1000/common/gpio.c | 1 - arch/mips/au1000/common/irq.c | 45 +- arch/mips/au1000/common/pci.c | 17 +- arch/mips/au1000/common/platform.c | 1 - arch/mips/au1000/common/power.c | 23 +- arch/mips/au1000/common/prom.c | 26 +- arch/mips/au1000/common/reset.c | 1 - arch/mips/au1000/common/setup.c | 9 +- arch/mips/au1000/common/time.c | 10 +- arch/mips/au1000/common/usbdev.c | 8 +- arch/mips/au1000/csb250/Makefile | 8 - arch/mips/au1000/csb250/board_setup.c | 239 - arch/mips/au1000/csb250/init.c | 94 - arch/mips/au1000/csb250/irqmap.c | 60 - arch/mips/au1000/db1x00/board_setup.c | 1 - arch/mips/au1000/db1x00/init.c | 1 - arch/mips/au1000/db1x00/irqmap.c | 5 +- arch/mips/au1000/db1x00/mirage_ts.c | 1 - arch/mips/au1000/hydrogen3/Makefile | 9 - arch/mips/au1000/hydrogen3/board_setup.c | 70 - arch/mips/au1000/hydrogen3/init.c | 76 - arch/mips/au1000/hydrogen3/irqmap.c | 56 - arch/mips/au1000/mtx-1/board_setup.c | 1 - arch/mips/au1000/mtx-1/irqmap.c | 4 +- arch/mips/au1000/pb1000/board_setup.c | 1 - arch/mips/au1000/pb1000/irqmap.c | 4 +- arch/mips/au1000/pb1100/board_setup.c | 1 - arch/mips/au1000/pb1100/irqmap.c | 4 +- arch/mips/au1000/pb1200/board_setup.c | 1 - arch/mips/au1000/pb1200/irqmap.c | 9 +- arch/mips/au1000/pb1500/board_setup.c | 1 - arch/mips/au1000/pb1500/irqmap.c | 4 +- arch/mips/au1000/pb1550/irqmap.c | 4 +- arch/mips/au1000/xxs1500/board_setup.c | 1 - arch/mips/au1000/xxs1500/irqmap.c | 4 +- arch/mips/cobalt/console.c | 6 +- arch/mips/cobalt/setup.c | 48 +- arch/mips/configs/atlas_defconfig | 79 +- arch/mips/configs/bigsur_defconfig | 66 +- arch/mips/configs/capcella_defconfig | 60 +- arch/mips/configs/cobalt_defconfig | 57 +- arch/mips/configs/db1000_defconfig | 61 +- arch/mips/configs/db1100_defconfig | 63 +- arch/mips/configs/db1200_defconfig | 62 +- arch/mips/configs/db1500_defconfig | 77 +- arch/mips/configs/db1550_defconfig | 62 +- arch/mips/configs/ddb5476_defconfig | 917 - arch/mips/configs/ddb5477_defconfig | 57 +- arch/mips/configs/decstation_defconfig | 68 +- arch/mips/configs/e55_defconfig | 50 +- arch/mips/configs/ev64120_defconfig | 56 +- arch/mips/configs/ev96100_defconfig | 55 +- arch/mips/configs/ip22_defconfig | 68 +- arch/mips/configs/ip27_defconfig | 72 +- arch/mips/configs/ip32_defconfig | 58 +- arch/mips/configs/it8172_defconfig | 56 +- arch/mips/configs/ivr_defconfig | 56 +- arch/mips/configs/jaguar-atx_defconfig | 59 +- arch/mips/configs/jmr3927_defconfig | 59 +- arch/mips/configs/lasat200_defconfig | 57 +- arch/mips/configs/malta_defconfig | 75 +- arch/mips/configs/mipssim_defconfig | 62 +- arch/mips/configs/mpc30x_defconfig | 59 +- arch/mips/configs/ocelot_3_defconfig | 66 +- arch/mips/configs/ocelot_c_defconfig | 57 +- arch/mips/configs/ocelot_defconfig | 56 +- arch/mips/configs/ocelot_g_defconfig | 569 +- arch/mips/configs/pb1100_defconfig | 59 +- arch/mips/configs/pb1500_defconfig | 61 +- arch/mips/configs/pb1550_defconfig | 61 +- arch/mips/configs/pnx8550-jbs_defconfig | 360 +- arch/mips/configs/pnx8550-v2pci_defconfig | 412 +- arch/mips/configs/qemu_defconfig | 55 +- arch/mips/configs/rbhma4500_defconfig | 75 +- arch/mips/configs/rm200_defconfig | 85 +- arch/mips/configs/sb1250-swarm_defconfig | 58 +- arch/mips/configs/sead_defconfig | 49 +- arch/mips/configs/tb0226_defconfig | 66 +- arch/mips/configs/tb0229_defconfig | 66 +- arch/mips/configs/tb0287_defconfig | 66 +- arch/mips/configs/workpad_defconfig | 55 +- arch/mips/configs/yosemite_defconfig | 65 +- arch/mips/ddb5xxx/common/prom.c | 11 +- arch/mips/ddb5xxx/ddb5074/Makefile | 8 - arch/mips/ddb5xxx/ddb5074/irq.c | 169 - arch/mips/ddb5xxx/ddb5074/nile4_pic.c | 286 - arch/mips/ddb5xxx/ddb5074/setup.c | 234 - arch/mips/ddb5xxx/ddb5476/Makefile | 9 - arch/mips/ddb5xxx/ddb5476/dbg_io.c | 136 - arch/mips/ddb5xxx/ddb5476/irq.c | 165 - arch/mips/ddb5xxx/ddb5476/nile4_pic.c | 190 - arch/mips/ddb5xxx/ddb5476/setup.c | 296 - arch/mips/ddb5xxx/ddb5476/vrc5476_irq.c | 109 - arch/mips/ddb5xxx/ddb5477/irq.c | 2 - arch/mips/ddb5xxx/ddb5477/irq_5477.c | 4 +- arch/mips/ddb5xxx/ddb5477/setup.c | 9 +- arch/mips/dec/int-handler.S | 1 - arch/mips/dec/ioasic-irq.c | 8 +- arch/mips/dec/kn02-irq.c | 4 +- arch/mips/dec/prom/init.c | 1 - arch/mips/dec/prom/memory.c | 1 - arch/mips/dec/setup.c | 8 +- arch/mips/dec/time.c | 4 +- arch/mips/defconfig | 68 +- arch/mips/galileo-boards/ev96100/setup.c | 3 +- arch/mips/galileo-boards/ev96100/time.c | 1 - arch/mips/gt64120/common/Makefile | 1 - arch/mips/gt64120/common/pci.c | 147 - arch/mips/gt64120/common/time.c | 3 +- arch/mips/gt64120/ev64120/irq.c | 4 +- arch/mips/gt64120/ev64120/setup.c | 2 +- arch/mips/gt64120/momenco_ocelot/dbg_io.c | 1 - arch/mips/gt64120/momenco_ocelot/setup.c | 6 +- arch/mips/ite-boards/generic/dbg_io.c | 1 - arch/mips/ite-boards/generic/irq.c | 8 +- arch/mips/ite-boards/generic/it8172_cir.c | 1 - arch/mips/ite-boards/generic/it8172_setup.c | 82 +- arch/mips/ite-boards/generic/pmon_prom.c | 1 - arch/mips/ite-boards/generic/time.c | 3 +- arch/mips/jazz/irq.c | 4 +- arch/mips/jazz/setup.c | 6 +- arch/mips/jmr3927/rbhma3100/init.c | 1 - arch/mips/jmr3927/rbhma3100/irq.c | 5 +- arch/mips/jmr3927/rbhma3100/setup.c | 67 +- arch/mips/kernel/Makefile | 2 + arch/mips/kernel/asm-offsets.c | 67 +- arch/mips/kernel/branch.c | 2 +- arch/mips/kernel/cpu-bugs64.c | 1 - arch/mips/kernel/cpu-probe.c | 9 +- arch/mips/kernel/entry.S | 24 +- arch/mips/kernel/gdb-low.S | 7 +- arch/mips/kernel/gdb-stub.c | 1 - arch/mips/kernel/genex.S | 11 +- arch/mips/kernel/head.S | 6 +- arch/mips/kernel/i8259.c | 10 +- arch/mips/kernel/irixelf.c | 2 - arch/mips/kernel/irixsig.c | 5 +- arch/mips/kernel/irq-msc01.c | 8 +- arch/mips/kernel/irq-mv6434x.c | 4 +- arch/mips/kernel/irq-rm7000.c | 4 +- arch/mips/kernel/irq-rm9000.c | 36 +- arch/mips/kernel/irq.c | 5 +- arch/mips/kernel/irq_cpu.c | 8 +- arch/mips/kernel/linux32.c | 3 +- arch/mips/kernel/mips-mt.c | 8 +- arch/mips/kernel/mips_ksyms.c | 1 - arch/mips/kernel/proc.c | 1 - arch/mips/kernel/process.c | 1 - arch/mips/kernel/ptrace.c | 53 +- arch/mips/kernel/ptrace32.c | 16 +- arch/mips/kernel/r2300_switch.S | 1 - arch/mips/kernel/r4k_fpu.S | 1 - arch/mips/kernel/r4k_switch.S | 20 +- arch/mips/kernel/rtlx.c | 2 +- arch/mips/kernel/scall32-o32.S | 21 +- arch/mips/kernel/scall64-64.S | 6 +- arch/mips/kernel/scall64-n32.S | 6 +- arch/mips/kernel/scall64-o32.S | 6 +- arch/mips/kernel/setup.c | 62 +- arch/mips/kernel/signal-common.h | 75 +- arch/mips/kernel/signal.c | 1 - arch/mips/kernel/smp-mt.c | 4 +- arch/mips/kernel/smp.c | 37 +- arch/mips/kernel/smtc-asm.S | 11 +- arch/mips/kernel/smtc.c | 66 +- arch/mips/kernel/syscall.c | 9 +- arch/mips/kernel/sysirix.c | 26 +- arch/mips/kernel/time.c | 8 +- arch/mips/kernel/traps.c | 49 +- arch/mips/kernel/unaligned.c | 1 - arch/mips/kernel/vmlinux.lds.S | 1 - arch/mips/kernel/vpe.c | 1 - arch/mips/lasat/interrupt.c | 4 +- arch/mips/lasat/lasat_board.c | 1 - arch/mips/lasat/reset.c | 1 - arch/mips/lasat/setup.c | 11 +- arch/mips/lasat/sysctl.c | 1 - arch/mips/lib-32/dump_tlb.c | 1 - arch/mips/lib-64/dump_tlb.c | 1 - arch/mips/lib/Makefile | 3 + arch/mips/lib/memcpy.S | 1 - arch/mips/math-emu/cp1emu.c | 15 +- arch/mips/math-emu/ieee754.h | 2 +- arch/mips/math-emu/kernel_linkage.c | 25 +- arch/mips/mips-boards/atlas/atlas_int.c | 4 +- arch/mips/mips-boards/atlas/atlas_setup.c | 5 +- arch/mips/mips-boards/generic/init.c | 1 - arch/mips/mips-boards/generic/memory.c | 44 +- arch/mips/mips-boards/generic/printf.c | 1 - arch/mips/mips-boards/generic/reset.c | 1 - arch/mips/mips-boards/generic/time.c | 9 +- arch/mips/mips-boards/malta/malta_setup.c | 17 +- arch/mips/mips-boards/malta/malta_smp.c | 19 - arch/mips/mips-boards/sead/sead_setup.c | 5 +- arch/mips/mips-boards/sim/Makefile | 3 +- arch/mips/mips-boards/sim/sim_IRQ.c | 148 - arch/mips/mips-boards/sim/sim_irq.S | 101 - arch/mips/mips-boards/sim/sim_setup.c | 5 +- arch/mips/mips-boards/sim/sim_smp.c | 22 - arch/mips/mips-boards/sim/sim_time.c | 5 +- arch/mips/mm/Makefile | 1 + arch/mips/mm/c-r4k.c | 121 +- arch/mips/mm/c-sb1.c | 1 - arch/mips/mm/cache.c | 1 - arch/mips/mm/cerr-sb1.c | 1 - arch/mips/mm/dma-coherent.c | 1 - arch/mips/mm/dma-noncoherent.c | 1 - arch/mips/mm/highmem.c | 1 - arch/mips/mm/init.c | 66 +- arch/mips/mm/pg-sb1.c | 1 - arch/mips/mm/pgtable-32.c | 1 - arch/mips/mm/pgtable.c | 3 +- arch/mips/mm/tlb-r4k.c | 2 - arch/mips/mm/tlb-r8k.c | 1 - arch/mips/mm/tlbex.c | 160 +- arch/mips/momentum/jaguar_atx/dbg_io.c | 1 - arch/mips/momentum/jaguar_atx/irq.c | 2 +- arch/mips/momentum/jaguar_atx/prom.c | 1 - arch/mips/momentum/jaguar_atx/reset.c | 1 - arch/mips/momentum/jaguar_atx/setup.c | 10 +- arch/mips/momentum/ocelot_3/irq.c | 2 +- arch/mips/momentum/ocelot_3/prom.c | 1 - arch/mips/momentum/ocelot_3/setup.c | 5 +- arch/mips/momentum/ocelot_c/cpci-irq.c | 4 +- arch/mips/momentum/ocelot_c/dbg_io.c | 1 - arch/mips/momentum/ocelot_c/irq.c | 4 +- arch/mips/momentum/ocelot_c/ocelot_c_fpga.h | 1 - arch/mips/momentum/ocelot_c/prom.c | 1 - arch/mips/momentum/ocelot_c/reset.c | 1 - arch/mips/momentum/ocelot_c/setup.c | 10 +- arch/mips/momentum/ocelot_c/uart-irq.c | 6 +- arch/mips/momentum/ocelot_g/dbg_io.c | 1 - arch/mips/momentum/ocelot_g/gt-irq.c | 7 +- arch/mips/momentum/ocelot_g/prom.c | 1 - arch/mips/momentum/ocelot_g/setup.c | 7 +- arch/mips/oprofile/common.c | 50 +- arch/mips/oprofile/op_model_mipsxx.c | 150 +- arch/mips/pci/Makefile | 7 +- arch/mips/pci/fixup-atlas.c | 1 - arch/mips/pci/fixup-ddb5074.c | 21 - arch/mips/pci/fixup-mpc30x.c | 3 +- arch/mips/pci/fixup-vr4133.c | 3 +- arch/mips/pci/ops-au1000.c | 1 - arch/mips/pci/ops-ddb5074.c | 271 - arch/mips/pci/ops-ddb5476.c | 286 - arch/mips/pci/ops-it8172.c | 34 +- arch/mips/pci/ops-sni.c | 12 +- arch/mips/pci/ops-titan.c | 25 +- arch/mips/pci/ops-tx4927.c | 8 +- arch/mips/pci/ops-tx4938.c | 8 +- arch/mips/pci/pci-bcm1480.c | 1 - arch/mips/pci/pci-bcm1480ht.c | 1 - arch/mips/pci/pci-ddb5074.c | 79 - arch/mips/pci/pci-ddb5476.c | 93 - arch/mips/pci/pci-ddb5477.c | 32 +- arch/mips/pci/pci-ip27.c | 295 +- arch/mips/pci/pci-ip32.c | 1 - arch/mips/pci/pci-jmr3927.c | 16 +- arch/mips/pci/pci-ocelot.c | 8 +- arch/mips/pci/pci-sb1250.c | 1 - arch/mips/pci/pci-yosemite.c | 10 +- arch/mips/pci/pci.c | 10 +- arch/mips/philips/pnx8550/common/int.c | 17 +- arch/mips/philips/pnx8550/common/pci.c | 16 +- arch/mips/philips/pnx8550/common/setup.c | 33 +- arch/mips/philips/pnx8550/common/time.c | 11 +- arch/mips/pmc-sierra/yosemite/ht.c | 5 +- arch/mips/pmc-sierra/yosemite/irq.c | 1 - arch/mips/pmc-sierra/yosemite/prom.c | 1 - arch/mips/pmc-sierra/yosemite/setup.c | 5 +- arch/mips/qemu/Makefile | 2 +- arch/mips/qemu/q-setup.c | 8 +- arch/mips/sgi-ip22/ip22-eisa.c | 9 +- arch/mips/sgi-ip22/ip22-int.c | 23 +- arch/mips/sgi-ip22/ip22-reset.c | 2 +- arch/mips/sgi-ip22/ip22-setup.c | 3 +- arch/mips/sgi-ip22/ip22-time.c | 10 +- arch/mips/sgi-ip27/Kconfig | 41 +- arch/mips/sgi-ip27/Makefile | 11 +- arch/mips/sgi-ip27/ip27-console.c | 40 +- arch/mips/sgi-ip27/ip27-init.c | 5 +- arch/mips/sgi-ip27/ip27-irq.c | 11 +- arch/mips/sgi-ip27/ip27-klnuma.c | 1 - arch/mips/sgi-ip27/ip27-memory.c | 1 - arch/mips/sgi-ip27/ip27-reset.c | 1 - arch/mips/sgi-ip27/ip27-timer.c | 72 +- arch/mips/sgi-ip32/ip32-irq.c | 18 +- arch/mips/sgi-ip32/ip32-reset.c | 12 +- arch/mips/sgi-ip32/ip32-setup.c | 7 +- arch/mips/sibyte/Kconfig | 3 + arch/mips/sibyte/bcm1480/irq.c | 20 +- arch/mips/sibyte/bcm1480/setup.c | 1 - arch/mips/sibyte/bcm1480/time.c | 18 +- arch/mips/sibyte/cfe/console.c | 1 - arch/mips/sibyte/cfe/setup.c | 1 - arch/mips/sibyte/sb1250/bus_watcher.c | 1 - arch/mips/sibyte/sb1250/irq.c | 29 +- arch/mips/sibyte/sb1250/prom.c | 1 - arch/mips/sibyte/sb1250/setup.c | 1 - arch/mips/sibyte/sb1250/time.c | 1 - arch/mips/sibyte/swarm/setup.c | 10 +- arch/mips/sni/Makefile | 1 + arch/mips/sni/irq.c | 4 +- arch/mips/sni/setup.c | 141 +- arch/mips/tx4927/common/tx4927_irq.c | 9 +- arch/mips/tx4927/common/tx4927_setup.c | 7 +- .../toshiba_rbtx4927/toshiba_rbtx4927_irq.c | 21 +- .../toshiba_rbtx4927/toshiba_rbtx4927_setup.c | 1 - arch/mips/tx4938/common/irq.c | 8 +- arch/mips/tx4938/common/setup.c | 7 +- arch/mips/tx4938/toshiba_rbtx4938/irq.c | 4 +- arch/mips/tx4938/toshiba_rbtx4938/prom.c | 1 - arch/mips/tx4938/toshiba_rbtx4938/setup.c | 6 +- .../mips/tx4938/toshiba_rbtx4938/spi_eeprom.c | 1 - arch/mips/vr41xx/Kconfig | 13 - arch/mips/vr41xx/casio-e55/setup.c | 15 +- arch/mips/vr41xx/common/Makefile | 3 +- arch/mips/vr41xx/common/icu.c | 49 +- arch/mips/vr41xx/common/init.c | 6 +- arch/mips/vr41xx/common/irq.c | 8 +- arch/mips/vr41xx/common/vrc4173.c | 581 - arch/mips/vr41xx/ibm-workpad/setup.c | 15 +- arch/mips/vr41xx/nec-cmbvr4133/init.c | 13 - arch/mips/vr41xx/nec-cmbvr4133/irq.c | 4 +- arch/mips/vr41xx/nec-cmbvr4133/m1535plus.c | 1 - arch/mips/vr41xx/nec-cmbvr4133/setup.c | 6 +- arch/parisc/Kconfig | 4 + arch/parisc/hpux/fs.c | 6 +- arch/parisc/hpux/sys_hpux.c | 10 +- arch/parisc/kernel/cache.c | 28 +- arch/parisc/kernel/entry.S | 7 +- arch/parisc/kernel/firmware.c | 46 +- arch/parisc/kernel/head.S | 2 - arch/parisc/kernel/irq.c | 34 +- arch/parisc/kernel/module.c | 63 +- arch/parisc/kernel/pacache.S | 1 - arch/parisc/kernel/parisc_ksyms.c | 1 - arch/parisc/kernel/pci.c | 3 +- arch/parisc/kernel/pdc_chassis.c | 109 +- arch/parisc/kernel/pdc_cons.c | 3 +- arch/parisc/kernel/perf_asm.S | 1 - arch/parisc/kernel/processor.c | 1 - arch/parisc/kernel/ptrace.c | 8 +- arch/parisc/kernel/real2.S | 10 - arch/parisc/kernel/setup.c | 6 +- arch/parisc/kernel/signal.c | 22 +- arch/parisc/kernel/smp.c | 1 - arch/parisc/kernel/sys_parisc32.c | 20 +- arch/parisc/kernel/syscall.S | 15 +- arch/parisc/kernel/time.c | 19 +- arch/parisc/kernel/topology.c | 3 +- arch/parisc/kernel/traps.c | 85 +- arch/parisc/kernel/unaligned.c | 19 +- arch/parisc/kernel/unwind.c | 3 +- arch/parisc/kernel/vmlinux.lds.S | 2 +- arch/parisc/lib/bitops.c | 1 - arch/parisc/lib/fixup.S | 1 - arch/parisc/lib/memcpy.c | 1 - arch/parisc/mm/init.c | 5 +- arch/powerpc/Kconfig | 110 +- arch/powerpc/Kconfig.debug | 22 +- arch/powerpc/Makefile | 1 - arch/powerpc/boot/Makefile | 4 +- arch/powerpc/boot/main.c | 27 + arch/powerpc/boot/prom.h | 7 + arch/powerpc/configs/cell_defconfig | 89 +- arch/powerpc/configs/g5_defconfig | 125 +- arch/powerpc/configs/iseries_defconfig | 79 +- arch/powerpc/configs/maple_defconfig | 129 +- arch/powerpc/configs/mpc834x_sys_defconfig | 915 - arch/powerpc/configs/mpc8540_ads_defconfig | 84 +- arch/powerpc/configs/pmac32_defconfig | 316 +- arch/powerpc/configs/ppc64_defconfig | 198 +- arch/powerpc/configs/pseries_defconfig | 136 +- arch/powerpc/kernel/Makefile | 13 +- arch/powerpc/kernel/align.c | 189 +- arch/powerpc/kernel/asm-offsets.c | 8 +- arch/powerpc/kernel/binfmt_elf32.c | 1 - arch/powerpc/kernel/btext.c | 21 +- arch/powerpc/kernel/cpu_setup_6xx.S | 3 +- arch/powerpc/kernel/cpu_setup_power4.S | 32 +- arch/powerpc/kernel/cputable.c | 126 +- arch/powerpc/kernel/crash.c | 164 +- arch/powerpc/kernel/crash_dump.c | 11 +- arch/powerpc/kernel/entry_32.S | 1 - arch/powerpc/kernel/entry_64.S | 3 +- arch/powerpc/kernel/firmware.c | 1 - arch/powerpc/kernel/fpu.S | 12 +- arch/powerpc/kernel/head_32.S | 15 +- arch/powerpc/kernel/head_44x.S | 1 - arch/powerpc/kernel/head_4xx.S | 1 - arch/powerpc/kernel/head_64.S | 127 +- arch/powerpc/kernel/head_8xx.S | 1 - arch/powerpc/kernel/head_fsl_booke.S | 1 - arch/powerpc/kernel/ibmebus.c | 9 +- arch/powerpc/kernel/idle.c | 1 - arch/powerpc/kernel/idle_6xx.S | 1 - arch/powerpc/kernel/idle_power4.S | 1 - arch/powerpc/kernel/iomap.c | 2 - arch/powerpc/kernel/iommu.c | 54 +- arch/powerpc/kernel/irq.c | 751 +- arch/powerpc/kernel/kprobes.c | 3 +- arch/powerpc/kernel/l2cr_6xx.S | 1 - arch/powerpc/kernel/legacy_serial.c | 86 +- arch/powerpc/kernel/lparcfg.c | 152 +- arch/powerpc/kernel/machine_kexec.c | 56 + arch/powerpc/kernel/machine_kexec_32.c | 4 +- arch/powerpc/kernel/machine_kexec_64.c | 48 +- arch/powerpc/kernel/misc_32.S | 159 +- arch/powerpc/kernel/misc_64.S | 241 +- arch/powerpc/kernel/nvram_64.c | 2 +- arch/powerpc/kernel/of_device.c | 1 - arch/powerpc/kernel/paca.c | 2 - arch/powerpc/kernel/pci_32.c | 117 +- arch/powerpc/kernel/pci_64.c | 130 +- arch/powerpc/kernel/pci_direct_iommu.c | 18 +- arch/powerpc/kernel/pci_dn.c | 6 + arch/powerpc/kernel/pci_iommu.c | 41 +- arch/powerpc/kernel/perfmon_fsl_booke.c | 1 - arch/powerpc/kernel/pmc.c | 1 - arch/powerpc/kernel/ppc_ksyms.c | 13 +- arch/powerpc/kernel/proc_ppc64.c | 5 +- arch/powerpc/kernel/process.c | 61 +- arch/powerpc/kernel/prom.c | 641 +- arch/powerpc/kernel/prom_init.c | 189 +- arch/powerpc/kernel/prom_parse.c | 474 +- arch/powerpc/kernel/ptrace-common.h | 162 - arch/powerpc/kernel/ptrace.c | 952 +- arch/powerpc/kernel/ptrace32.c | 437 - arch/powerpc/kernel/rtas-rtc.c | 30 +- arch/powerpc/kernel/rtas.c | 244 +- arch/powerpc/kernel/rtas_flash.c | 25 +- arch/powerpc/kernel/rtas_pci.c | 21 +- arch/powerpc/kernel/setup-common.c | 23 +- arch/powerpc/kernel/setup.h | 3 + arch/powerpc/kernel/setup_32.c | 23 +- arch/powerpc/kernel/setup_64.c | 69 +- arch/powerpc/kernel/signal_32.c | 79 +- arch/powerpc/kernel/signal_64.c | 20 +- arch/powerpc/kernel/smp-tbsync.c | 6 +- arch/powerpc/kernel/smp.c | 27 +- arch/powerpc/kernel/swsusp_32.S | 1 - arch/powerpc/kernel/sys_ppc32.c | 21 +- arch/powerpc/kernel/sysfs.c | 32 +- arch/powerpc/kernel/systbl.S | 312 +- arch/powerpc/kernel/tau_6xx.c | 1 - arch/powerpc/kernel/time.c | 118 +- arch/powerpc/kernel/traps.c | 77 +- arch/powerpc/kernel/udbg.c | 15 +- arch/powerpc/kernel/udbg_16550.c | 7 +- arch/powerpc/kernel/vdso.c | 58 +- arch/powerpc/kernel/vdso32/Makefile | 3 +- arch/powerpc/kernel/vdso32/cacheflush.S | 1 - arch/powerpc/kernel/vdso32/datapage.S | 1 - arch/powerpc/kernel/vdso32/gettimeofday.S | 1 - arch/powerpc/kernel/vdso32/sigtramp.S | 1 - arch/powerpc/kernel/vdso32/vdso32.lds.S | 1 + arch/powerpc/kernel/vdso64/Makefile | 3 +- arch/powerpc/kernel/vdso64/cacheflush.S | 1 - arch/powerpc/kernel/vdso64/datapage.S | 1 - arch/powerpc/kernel/vdso64/gettimeofday.S | 1 - arch/powerpc/kernel/vdso64/sigtramp.S | 1 - arch/powerpc/kernel/vdso64/vdso64.lds.S | 1 + arch/powerpc/kernel/vector.S | 5 +- arch/powerpc/kernel/vio.c | 334 +- arch/powerpc/kernel/vmlinux.lds.S | 6 +- arch/powerpc/lib/Makefile | 5 +- arch/powerpc/lib/bitops.c | 150 - arch/powerpc/lib/copy_32.S | 1 - arch/powerpc/lib/locks.c | 1 - arch/powerpc/lib/memcpy_64.S | 11 +- arch/powerpc/lib/sstep.c | 4 +- arch/powerpc/lib/string.S | 1 - arch/powerpc/math-emu/math.c | 1 - arch/powerpc/mm/44x_mmu.c | 5 +- arch/powerpc/mm/4xx_mmu.c | 1 - arch/powerpc/mm/fault.c | 37 +- arch/powerpc/mm/fsl_booke_mmu.c | 1 - arch/powerpc/mm/hash_low_32.S | 35 - arch/powerpc/mm/hash_low_64.S | 32 +- arch/powerpc/mm/hash_native_64.c | 5 +- arch/powerpc/mm/hash_utils_64.c | 191 +- arch/powerpc/mm/hugetlbpage.c | 2 +- arch/powerpc/mm/init_32.c | 1 - arch/powerpc/mm/init_64.c | 4 +- arch/powerpc/mm/lmb.c | 45 +- arch/powerpc/mm/mem.c | 18 +- arch/powerpc/mm/mmu_context_32.c | 3 +- arch/powerpc/mm/mmu_context_64.c | 6 +- arch/powerpc/mm/numa.c | 19 +- arch/powerpc/mm/pgtable_32.c | 1 - arch/powerpc/mm/pgtable_64.c | 1 - arch/powerpc/mm/ppc_mmu_32.c | 17 +- arch/powerpc/mm/slb.c | 33 +- arch/powerpc/mm/slb_low.S | 18 +- arch/powerpc/mm/stab.c | 5 - arch/powerpc/mm/tlb_32.c | 7 +- arch/powerpc/mm/tlb_64.c | 6 +- arch/powerpc/oprofile/Kconfig | 1 - arch/powerpc/oprofile/Makefile | 4 + arch/powerpc/oprofile/common.c | 8 +- arch/powerpc/oprofile/op_model_power4.c | 37 +- arch/powerpc/platforms/83xx/Kconfig | 11 +- arch/powerpc/platforms/83xx/Makefile | 1 + arch/powerpc/platforms/83xx/misc.c | 1 - arch/powerpc/platforms/83xx/mpc834x_sys.c | 57 +- arch/powerpc/platforms/83xx/mpc83xx.h | 1 + arch/powerpc/platforms/83xx/pci.c | 15 +- arch/powerpc/platforms/85xx/Kconfig | 8 +- arch/powerpc/platforms/85xx/Makefile | 1 + arch/powerpc/platforms/85xx/mpc8540_ads.h | 1 - arch/powerpc/platforms/85xx/mpc85xx_ads.c | 163 +- arch/powerpc/platforms/85xx/pci.c | 6 +- arch/powerpc/platforms/Makefile | 2 + arch/powerpc/platforms/cell/Kconfig | 11 +- arch/powerpc/platforms/cell/Makefile | 23 +- arch/powerpc/platforms/cell/interrupt.c | 444 +- arch/powerpc/platforms/cell/interrupt.h | 19 +- arch/powerpc/platforms/cell/iommu.c | 18 +- arch/powerpc/platforms/cell/pervasive.c | 105 +- arch/powerpc/platforms/cell/pervasive.h | 37 +- arch/powerpc/platforms/cell/setup.c | 53 +- arch/powerpc/platforms/cell/smp.c | 1 - arch/powerpc/platforms/cell/spider-pic.c | 400 +- arch/powerpc/platforms/cell/spu_base.c | 304 +- arch/powerpc/platforms/cell/spu_callbacks.c | 314 +- arch/powerpc/platforms/cell/spu_priv1.c | 133 - arch/powerpc/platforms/cell/spufs/Makefile | 14 +- .../platforms/cell/spufs/backing_ops.c | 1 - arch/powerpc/platforms/cell/spufs/context.c | 12 +- arch/powerpc/platforms/cell/spufs/file.c | 79 +- arch/powerpc/platforms/cell/spufs/hw_ops.c | 2 +- arch/powerpc/platforms/cell/spufs/inode.c | 39 +- arch/powerpc/platforms/cell/spufs/run.c | 2 + arch/powerpc/platforms/cell/spufs/sched.c | 4 +- .../cell/spufs/spu_restore_dump.h_shipped | 1122 +- .../cell/spufs/spu_save_dump.h_shipped | 922 +- arch/powerpc/platforms/cell/spufs/switch.c | 59 +- arch/powerpc/platforms/chrp/pci.c | 16 +- arch/powerpc/platforms/chrp/setup.c | 114 +- arch/powerpc/platforms/chrp/smp.c | 2 - arch/powerpc/platforms/embedded6xx/Kconfig | 16 + arch/powerpc/platforms/iseries/Makefile | 6 +- arch/powerpc/platforms/iseries/call_pci.h | 19 + arch/powerpc/platforms/iseries/htab.c | 4 +- arch/powerpc/platforms/iseries/iommu.c | 46 +- arch/powerpc/platforms/iseries/iommu.h | 35 - arch/powerpc/platforms/iseries/irq.c | 117 +- arch/powerpc/platforms/iseries/irq.h | 4 +- arch/powerpc/platforms/iseries/lpardata.c | 1 - arch/powerpc/platforms/iseries/lpevents.c | 55 +- arch/powerpc/platforms/iseries/mf.c | 9 +- arch/powerpc/platforms/iseries/pci.c | 347 +- arch/powerpc/platforms/iseries/proc.c | 1 - arch/powerpc/platforms/iseries/setup.c | 297 +- arch/powerpc/platforms/iseries/setup.h | 2 + arch/powerpc/platforms/iseries/smp.c | 1 - arch/powerpc/platforms/iseries/vio.c | 131 - arch/powerpc/platforms/maple/pci.c | 25 +- arch/powerpc/platforms/maple/setup.c | 113 +- arch/powerpc/platforms/maple/time.c | 1 - arch/powerpc/platforms/powermac/backlight.c | 336 +- arch/powerpc/platforms/powermac/bootx_init.c | 76 +- arch/powerpc/platforms/powermac/cache.S | 1 - arch/powerpc/platforms/powermac/cpufreq_32.c | 7 +- arch/powerpc/platforms/powermac/cpufreq_64.c | 81 +- arch/powerpc/platforms/powermac/feature.c | 3 +- arch/powerpc/platforms/powermac/low_i2c.c | 10 +- arch/powerpc/platforms/powermac/nvram.c | 10 +- arch/powerpc/platforms/powermac/pci.c | 83 +- arch/powerpc/platforms/powermac/pfunc_base.c | 16 +- arch/powerpc/platforms/powermac/pfunc_core.c | 17 +- arch/powerpc/platforms/powermac/pic.c | 427 +- arch/powerpc/platforms/powermac/pmac.h | 2 + arch/powerpc/platforms/powermac/setup.c | 15 +- arch/powerpc/platforms/powermac/sleep.S | 1 - arch/powerpc/platforms/powermac/smp.c | 3 +- arch/powerpc/platforms/powermac/time.c | 1 - arch/powerpc/platforms/powermac/udbg_adb.c | 1 - arch/powerpc/platforms/powermac/udbg_scc.c | 1 - arch/powerpc/platforms/pseries/Makefile | 5 +- arch/powerpc/platforms/pseries/eeh_cache.c | 4 +- arch/powerpc/platforms/pseries/eeh_driver.c | 57 +- arch/powerpc/platforms/pseries/eeh_event.c | 52 +- arch/powerpc/platforms/pseries/iommu.c | 216 +- arch/powerpc/platforms/pseries/lpar.c | 5 +- arch/powerpc/platforms/pseries/ras.c | 81 +- arch/powerpc/platforms/pseries/rtasd.c | 6 +- arch/powerpc/platforms/pseries/scanlog.c | 6 +- arch/powerpc/platforms/pseries/setup.c | 269 +- arch/powerpc/platforms/pseries/smp.c | 33 +- arch/powerpc/platforms/pseries/vio.c | 274 - arch/powerpc/platforms/pseries/xics.c | 730 +- arch/powerpc/platforms/pseries/xics.h | 17 +- arch/powerpc/sysdev/Makefile | 13 +- arch/powerpc/sysdev/dart.h | 6 +- arch/powerpc/sysdev/dart_iommu.c | 57 +- arch/powerpc/sysdev/fsl_soc.c | 109 +- arch/powerpc/sysdev/i8259.c | 163 +- arch/powerpc/sysdev/ipic.c | 303 +- arch/powerpc/sysdev/ipic.h | 23 +- arch/powerpc/sysdev/mmio_nvram.c | 2 +- arch/powerpc/sysdev/mpic.c | 768 +- arch/powerpc/xmon/xmon.c | 4 - arch/ppc/4xx_io/serial_sicc.c | 3 +- arch/ppc/8260_io/fcc_enet.c | 3 +- arch/ppc/8xx_io/commproc.c | 2 +- arch/ppc/8xx_io/cs4218.h | 1 - arch/ppc/8xx_io/cs4218_tdm.c | 1 - arch/ppc/8xx_io/enet.c | 1 - arch/ppc/8xx_io/fec.c | 1 - arch/ppc/8xx_io/micropatch.c | 1 - arch/ppc/Kconfig | 8 +- arch/ppc/amiga/amiints.c | 1 - arch/ppc/amiga/config.c | 1 - arch/ppc/amiga/time.c | 1 - arch/ppc/boot/common/crt0.S | 1 - arch/ppc/boot/common/misc-common.c | 1 - arch/ppc/boot/common/ns16550.c | 1 - arch/ppc/boot/lib/Makefile | 2 +- arch/ppc/boot/simple/embed_config.c | 1 - arch/ppc/boot/simple/head.S | 1 - arch/ppc/boot/simple/m8xx_tty.c | 1 - arch/ppc/boot/simple/misc-chestnut.c | 3 - arch/ppc/boot/simple/misc-embedded.c | 1 - arch/ppc/boot/simple/misc-ev64260.c | 3 - arch/ppc/boot/simple/misc-ev64360.c | 1 - arch/ppc/boot/simple/misc-katana.c | 11 +- arch/ppc/boot/simple/misc-mv64x60.c | 30 +- arch/ppc/boot/simple/misc-prep.c | 1 - arch/ppc/boot/simple/misc-spruce.c | 1 - arch/ppc/boot/simple/misc.c | 1 - arch/ppc/boot/simple/mpc52xx_tty.c | 3 - arch/ppc/boot/simple/mv64x60_tty.c | 1 - arch/ppc/boot/simple/openbios.c | 107 +- arch/ppc/boot/simple/pibs.c | 1 - arch/ppc/boot/simple/relocate.S | 1 - arch/ppc/configs/prep_defconfig | 585 +- arch/ppc/kernel/asm-offsets.c | 3 - arch/ppc/kernel/cpu_setup_power4.S | 1 - arch/ppc/kernel/dma-mapping.c | 21 +- arch/ppc/kernel/entry.S | 1 - arch/ppc/kernel/head.S | 1 - arch/ppc/kernel/head_44x.S | 1 - arch/ppc/kernel/head_4xx.S | 1 - arch/ppc/kernel/head_8xx.S | 1 - arch/ppc/kernel/head_fsl_booke.S | 110 +- arch/ppc/kernel/machine_kexec.c | 4 +- arch/ppc/kernel/misc.S | 1 - arch/ppc/kernel/pci.c | 54 +- arch/ppc/kernel/ppc-stub.c | 1 - arch/ppc/kernel/ppc_htab.c | 1 - arch/ppc/kernel/ppc_ksyms.c | 5 +- arch/ppc/kernel/setup.c | 5 +- arch/ppc/kernel/smp-tbsync.c | 8 +- arch/ppc/kernel/smp.c | 1 - arch/ppc/kernel/time.c | 1 - arch/ppc/kernel/traps.c | 1 - arch/ppc/kernel/vmlinux.lds.S | 1 + arch/ppc/lib/locks.c | 1 - arch/ppc/lib/string.S | 1 - arch/ppc/mm/44x_mmu.c | 1 - arch/ppc/mm/4xx_mmu.c | 1 - arch/ppc/mm/fault.c | 1 - arch/ppc/mm/fsl_booke_mmu.c | 8 +- arch/ppc/mm/hashtable.S | 1 - arch/ppc/mm/init.c | 3 +- arch/ppc/mm/mem_pieces.c | 1 - arch/ppc/mm/mmu_context.c | 3 +- arch/ppc/mm/pgtable.c | 1 - arch/ppc/mm/ppc_mmu.c | 1 - arch/ppc/mm/tlb.c | 7 +- arch/ppc/platforms/4xx/Kconfig | 2 +- arch/ppc/platforms/4xx/bamboo.c | 1 - arch/ppc/platforms/4xx/bamboo.h | 1 - arch/ppc/platforms/4xx/bubinga.c | 7 +- arch/ppc/platforms/4xx/bubinga.h | 61 +- arch/ppc/platforms/4xx/cpci405.c | 140 +- arch/ppc/platforms/4xx/cpci405.h | 31 +- arch/ppc/platforms/4xx/ebony.c | 1 - arch/ppc/platforms/4xx/ebony.h | 1 - arch/ppc/platforms/4xx/ep405.c | 1 - arch/ppc/platforms/4xx/ibm405ep.c | 4 +- arch/ppc/platforms/4xx/ibm405ep.h | 3 - arch/ppc/platforms/4xx/ibm405gp.c | 1 - arch/ppc/platforms/4xx/ibm405gp.h | 1 - arch/ppc/platforms/4xx/ibm405gpr.c | 1 - arch/ppc/platforms/4xx/ibm405gpr.h | 1 - arch/ppc/platforms/4xx/ibm440ep.h | 1 - arch/ppc/platforms/4xx/ibm440gp.h | 1 - arch/ppc/platforms/4xx/ibm440gx.h | 1 - arch/ppc/platforms/4xx/ibm440sp.h | 3 - arch/ppc/platforms/4xx/ibmnp405h.c | 1 - arch/ppc/platforms/4xx/ibmnp405h.h | 1 - arch/ppc/platforms/4xx/ibmstb4.h | 1 - arch/ppc/platforms/4xx/ibmstbx25.h | 1 - arch/ppc/platforms/4xx/luan.c | 28 +- arch/ppc/platforms/4xx/luan.h | 5 +- arch/ppc/platforms/4xx/ocotea.c | 1 - arch/ppc/platforms/4xx/ocotea.h | 1 - arch/ppc/platforms/4xx/ppc440spe.h | 1 - arch/ppc/platforms/4xx/redwood5.c | 1 - arch/ppc/platforms/4xx/redwood6.c | 1 - arch/ppc/platforms/4xx/sycamore.c | 1 - arch/ppc/platforms/4xx/sycamore.h | 1 - arch/ppc/platforms/4xx/walnut.c | 1 - arch/ppc/platforms/4xx/walnut.h | 1 - arch/ppc/platforms/4xx/xilinx_ml300.c | 1 - arch/ppc/platforms/4xx/xilinx_ml403.c | 1 - .../platforms/4xx/xparameters/xparameters.h | 1 - arch/ppc/platforms/4xx/yucca.c | 1 - arch/ppc/platforms/4xx/yucca.h | 1 - arch/ppc/platforms/83xx/mpc834x_sys.c | 106 +- arch/ppc/platforms/83xx/mpc834x_sys.h | 44 +- arch/ppc/platforms/85xx/mpc8540_ads.c | 61 +- arch/ppc/platforms/85xx/mpc8540_ads.h | 5 +- arch/ppc/platforms/85xx/mpc8555_cds.h | 5 +- arch/ppc/platforms/85xx/mpc8560_ads.c | 133 +- arch/ppc/platforms/85xx/mpc8560_ads.h | 5 +- arch/ppc/platforms/85xx/mpc85xx_ads_common.c | 53 +- arch/ppc/platforms/85xx/mpc85xx_ads_common.h | 27 +- arch/ppc/platforms/85xx/mpc85xx_cds_common.c | 135 +- arch/ppc/platforms/85xx/mpc85xx_cds_common.h | 5 +- arch/ppc/platforms/85xx/sbc8560.c | 45 +- arch/ppc/platforms/85xx/sbc8560.h | 3 - arch/ppc/platforms/85xx/sbc85xx.c | 41 +- arch/ppc/platforms/85xx/sbc85xx.h | 3 - arch/ppc/platforms/85xx/stx_gp3.c | 91 +- arch/ppc/platforms/85xx/stx_gp3.h | 5 - arch/ppc/platforms/85xx/tqm85xx.c | 3 +- arch/ppc/platforms/85xx/tqm85xx.h | 1 - arch/ppc/platforms/apus_pci.c | 1 - arch/ppc/platforms/apus_setup.c | 5 +- arch/ppc/platforms/ccm.h | 1 - arch/ppc/platforms/chestnut.c | 7 +- arch/ppc/platforms/cpci690.c | 183 +- arch/ppc/platforms/ev64260.c | 1 - arch/ppc/platforms/ev64360.c | 1 - arch/ppc/platforms/fads.h | 1 - arch/ppc/platforms/gemini_prom.S | 1 - arch/ppc/platforms/gemini_serial.h | 1 - arch/ppc/platforms/gemini_setup.c | 1 - arch/ppc/platforms/hdpu.c | 27 +- arch/ppc/platforms/hermes.h | 1 - arch/ppc/platforms/ip860.h | 1 - arch/ppc/platforms/ivms8.h | 1 - arch/ppc/platforms/katana.c | 265 +- arch/ppc/platforms/lantec.h | 1 - arch/ppc/platforms/lite5200.c | 77 +- arch/ppc/platforms/lopec.c | 1 - arch/ppc/platforms/lwmon.h | 1 - arch/ppc/platforms/mpc8272ads_setup.c | 154 +- arch/ppc/platforms/mpc866ads_setup.c | 193 +- arch/ppc/platforms/mpc885ads.h | 1 - arch/ppc/platforms/mpc885ads_setup.c | 176 +- arch/ppc/platforms/mvme5100.c | 1 - arch/ppc/platforms/pal4_setup.c | 1 - arch/ppc/platforms/pcu_e.h | 1 - arch/ppc/platforms/powerpmc250.c | 1 - arch/ppc/platforms/pplus.c | 1 - arch/ppc/platforms/pq2ads.h | 5 +- arch/ppc/platforms/pq2ads_pd.h | 82 - arch/ppc/platforms/prep_pci.c | 1 - arch/ppc/platforms/prep_setup.c | 3 +- arch/ppc/platforms/prpmc750.c | 1 - arch/ppc/platforms/prpmc800.c | 1 - arch/ppc/platforms/radstone_ppc7d.c | 30 +- arch/ppc/platforms/rpxclassic.h | 1 - arch/ppc/platforms/rpxlite.h | 1 - arch/ppc/platforms/sandpoint.c | 1 - arch/ppc/platforms/sbc82xx.c | 5 +- arch/ppc/platforms/spruce.c | 1 - arch/ppc/platforms/tqm8260.h | 1 - arch/ppc/platforms/tqm8xx.h | 1 - arch/ppc/syslib/Makefile | 4 +- arch/ppc/syslib/btext.c | 3 +- arch/ppc/syslib/cpc700_pic.c | 4 +- arch/ppc/syslib/cpm2_pic.c | 4 +- arch/ppc/syslib/gen550_dbg.c | 1 - arch/ppc/syslib/gen550_kgdb.c | 1 - arch/ppc/syslib/gt64260_pic.c | 8 +- arch/ppc/syslib/i8259.c | 212 + arch/ppc/syslib/ibm440gp_common.c | 1 - arch/ppc/syslib/ibm440gp_common.h | 1 - arch/ppc/syslib/ibm440gx_common.c | 40 +- arch/ppc/syslib/ibm440gx_common.h | 7 +- arch/ppc/syslib/ibm440sp_common.c | 7 +- arch/ppc/syslib/ibm44x_common.c | 1 - arch/ppc/syslib/ipic.c | 646 + arch/ppc/syslib/ipic.h | 47 + arch/ppc/syslib/m8260_pci_erratum9.c | 3 - arch/ppc/syslib/m8260_setup.c | 1 - arch/ppc/syslib/m82xx_pci.c | 17 +- arch/ppc/syslib/m8xx_setup.c | 5 +- arch/ppc/syslib/mpc52xx_pci.c | 104 +- arch/ppc/syslib/mpc52xx_pic.c | 6 +- arch/ppc/syslib/mpc52xx_setup.c | 57 +- arch/ppc/syslib/mpc83xx_devices.c | 39 +- arch/ppc/syslib/mpc85xx_devices.c | 297 +- arch/ppc/syslib/mpc8xx_devices.c | 8 + arch/ppc/syslib/mpc8xx_sys.c | 6 +- arch/ppc/syslib/mv64360_pic.c | 10 +- arch/ppc/syslib/mv64x60_dbg.c | 4 +- arch/ppc/syslib/ocp.c | 12 +- arch/ppc/syslib/open_pic.c | 24 +- arch/ppc/syslib/open_pic2.c | 3 +- arch/ppc/syslib/ppc403_pic.c | 14 +- arch/ppc/syslib/ppc440spe_pcie.c | 1 - arch/ppc/syslib/ppc4xx_dma.c | 1 - arch/ppc/syslib/ppc4xx_pic.c | 3 +- arch/ppc/syslib/ppc4xx_setup.c | 1 - arch/ppc/syslib/ppc4xx_sgdma.c | 3 - arch/ppc/syslib/ppc83xx_setup.c | 259 +- arch/ppc/syslib/ppc83xx_setup.h | 24 +- arch/ppc/syslib/ppc85xx_common.c | 5 +- arch/ppc/syslib/ppc85xx_common.h | 5 +- arch/ppc/syslib/ppc85xx_rio.c | 1 - arch/ppc/syslib/ppc85xx_rio.h | 1 - arch/ppc/syslib/ppc85xx_setup.c | 29 +- arch/ppc/syslib/ppc85xx_setup.h | 5 +- arch/ppc/syslib/ppc8xx_pic.c | 1 - arch/ppc/syslib/ppc8xx_pic.h | 1 - arch/ppc/syslib/pq2_devices.c | 5 + arch/ppc/syslib/pq2_sys.c | 3 +- arch/ppc/syslib/qspan_pci.c | 1 - arch/ppc/syslib/xilinx_pic.c | 2 +- arch/ppc/xmon/privinst.h | 1 - arch/ppc/xmon/start.c | 1 - arch/ppc/xmon/xmon.c | 1 - arch/s390/Kconfig | 29 +- arch/s390/Kconfig.debug | 4 + arch/s390/Makefile | 7 +- arch/s390/appldata/appldata.h | 24 +- arch/s390/appldata/appldata_base.c | 50 +- arch/s390/appldata/appldata_mem.c | 29 +- arch/s390/appldata/appldata_net_sum.c | 6 +- arch/s390/appldata/appldata_os.c | 99 +- arch/s390/crypto/aes_s390.c | 14 +- arch/s390/crypto/des_s390.c | 42 +- arch/s390/crypto/sha1_s390.c | 34 +- arch/s390/crypto/sha256_s390.c | 14 +- arch/s390/defconfig | 44 +- arch/s390/kernel/Makefile | 9 +- arch/s390/kernel/asm-offsets.c | 1 - arch/s390/kernel/binfmt_elf32.c | 6 - arch/s390/kernel/compat_linux.c | 28 +- arch/s390/kernel/compat_linux.h | 1 - arch/s390/kernel/compat_signal.c | 5 +- arch/s390/kernel/debug.c | 3 +- arch/s390/kernel/entry.S | 119 +- arch/s390/kernel/entry64.S | 103 +- arch/s390/kernel/head.S | 23 +- arch/s390/kernel/head31.S | 77 +- arch/s390/kernel/head64.S | 79 +- arch/s390/kernel/irq.c | 8 - arch/s390/kernel/machine_kexec.c | 5 +- arch/s390/kernel/module.c | 2 +- arch/s390/kernel/process.c | 7 +- arch/s390/kernel/profile.c | 2 +- arch/s390/kernel/ptrace.c | 657 +- arch/s390/kernel/s390_ext.c | 6 +- arch/s390/kernel/s390_ksyms.c | 3 - arch/s390/kernel/setup.c | 117 +- arch/s390/kernel/signal.c | 4 +- arch/s390/kernel/smp.c | 2 +- arch/s390/kernel/time.c | 3 +- arch/s390/kernel/traps.c | 33 +- arch/s390/kernel/vmlinux.lds.S | 1 - arch/s390/kernel/vtime.c | 48 +- arch/s390/lib/Makefile | 1 + arch/s390/lib/delay.c | 1 - arch/s390/lib/string.c | 4 +- arch/s390/lib/uaccess.S | 45 +- arch/s390/lib/uaccess64.S | 47 +- arch/s390/math-emu/math.c | 1 - arch/s390/mm/cmm.c | 3 +- arch/s390/mm/fault.c | 3 +- arch/s390/mm/init.c | 42 +- arch/sh/Kconfig | 4 +- arch/sh/Makefile | 4 +- arch/sh/boards/adx/irq_maskreg.c | 3 +- arch/sh/boards/bigsur/io.c | 1 - arch/sh/boards/bigsur/irq.c | 5 +- arch/sh/boards/bigsur/led.c | 1 - arch/sh/boards/bigsur/setup.c | 1 - arch/sh/boards/cat68701/setup.c | 1 - arch/sh/boards/cqreek/irq.c | 4 +- arch/sh/boards/cqreek/setup.c | 1 - arch/sh/boards/dreamcast/setup.c | 2 +- arch/sh/boards/ec3104/setup.c | 2 +- arch/sh/boards/harp/irq.c | 3 +- arch/sh/boards/harp/led.c | 1 - arch/sh/boards/harp/setup.c | 1 - arch/sh/boards/hp6xx/setup.c | 1 - arch/sh/boards/mpc1211/led.c | 1 - arch/sh/boards/mpc1211/pci.c | 5 +- arch/sh/boards/mpc1211/setup.c | 3 +- arch/sh/boards/overdrive/fpga.c | 1 - arch/sh/boards/overdrive/galileo.c | 3 +- arch/sh/boards/overdrive/io.c | 1 - arch/sh/boards/overdrive/irq.c | 3 +- arch/sh/boards/overdrive/led.c | 1 - arch/sh/boards/overdrive/setup.c | 1 - arch/sh/boards/renesas/edosk7705/setup.c | 1 - arch/sh/boards/renesas/hs7751rvoip/io.c | 1 - arch/sh/boards/renesas/hs7751rvoip/irq.c | 17 +- arch/sh/boards/renesas/hs7751rvoip/led.c | 1 - arch/sh/boards/renesas/hs7751rvoip/mach.c | 1 - arch/sh/boards/renesas/hs7751rvoip/pci.c | 1 - arch/sh/boards/renesas/hs7751rvoip/setup.c | 1 - arch/sh/boards/renesas/rts7751r2d/irq.c | 17 +- arch/sh/boards/renesas/rts7751r2d/led.c | 1 - arch/sh/boards/renesas/rts7751r2d/mach.c | 3 +- arch/sh/boards/renesas/systemh/irq.c | 17 +- arch/sh/boards/se/7300/io.c | 1 - arch/sh/boards/se/7300/irq.c | 1 - arch/sh/boards/se/7300/led.c | 1 - arch/sh/boards/se/7300/setup.c | 1 - arch/sh/boards/se/73180/io.c | 1 - arch/sh/boards/se/73180/irq.c | 3 +- arch/sh/boards/se/73180/led.c | 1 - arch/sh/boards/se/73180/setup.c | 1 - arch/sh/boards/se/770x/irq.c | 1 - arch/sh/boards/se/770x/led.c | 1 - arch/sh/boards/se/770x/mach.c | 1 - arch/sh/boards/se/770x/setup.c | 1 - arch/sh/boards/se/7751/irq.c | 1 - arch/sh/boards/se/7751/led.c | 1 - arch/sh/boards/se/7751/mach.c | 1 - arch/sh/boards/se/7751/pci.c | 1 - arch/sh/boards/se/7751/setup.c | 1 - arch/sh/boards/sh03/led.c | 1 - arch/sh/boards/sh03/setup.c | 1 - arch/sh/boards/sh2000/setup.c | 1 - arch/sh/boards/snapgear/setup.c | 3 +- arch/sh/boards/superh/microdev/io.c | 1 - arch/sh/boards/superh/microdev/irq.c | 3 +- arch/sh/boards/superh/microdev/led.c | 1 - arch/sh/boards/superh/microdev/setup.c | 1 - arch/sh/boards/unknown/setup.c | 1 - arch/sh/boot/compressed/head.S | 1 - arch/sh/boot/compressed/misc.c | 1 - arch/sh/cchips/hd6446x/hd64461/io.c | 1 - arch/sh/cchips/hd6446x/hd64461/setup.c | 5 +- arch/sh/cchips/hd6446x/hd64465/gpio.c | 2 +- arch/sh/cchips/hd6446x/hd64465/io.c | 1 - arch/sh/cchips/hd6446x/hd64465/setup.c | 5 +- arch/sh/cchips/voyagergx/irq.c | 24 +- arch/sh/drivers/dma/dma-g2.c | 2 +- arch/sh/drivers/dma/dma-pvr2.c | 2 +- arch/sh/drivers/dma/dma-sh.c | 5 +- arch/sh/drivers/pci/dma-dreamcast.c | 1 - arch/sh/drivers/pci/fixups-dreamcast.c | 1 - arch/sh/drivers/pci/ops-bigsur.c | 1 - arch/sh/drivers/pci/ops-dreamcast.c | 1 - arch/sh/drivers/pci/ops-rts7751r2d.c | 1 - arch/sh/drivers/pci/ops-sh03.c | 1 - arch/sh/drivers/pci/ops-snapgear.c | 1 - arch/sh/drivers/pci/pci-sh7751.c | 1 - arch/sh/drivers/pci/pci-st40.c | 3 +- arch/sh/drivers/pci/pci.c | 6 +- arch/sh/kernel/cf-enabler.c | 1 - arch/sh/kernel/cpu/irq/imask.c | 2 +- arch/sh/kernel/cpu/irq/intc2.c | 2 +- arch/sh/kernel/cpu/irq/ipr.c | 3 +- arch/sh/kernel/cpu/irq/pint.c | 3 +- arch/sh/kernel/cpu/sh3/ex.S | 1 - arch/sh/kernel/cpu/sh4/ex.S | 1 - arch/sh/kernel/cpu/sh4/sq.c | 12 +- arch/sh/kernel/entry.S | 1 - arch/sh/kernel/irq.c | 2 +- arch/sh/kernel/machine_kexec.c | 4 +- arch/sh/kernel/process.c | 1 + arch/sh/kernel/ptrace.c | 1 - arch/sh/kernel/relocate_kernel.S | 1 - arch/sh/kernel/setup.c | 4 +- arch/sh/kernel/sh_ksyms.c | 1 - arch/sh/kernel/smp.c | 1 - arch/sh/kernel/time.c | 1 - arch/sh/kernel/timers/timer-tmu.c | 2 +- arch/sh/kernel/traps.c | 1 - arch/sh/kernel/vmlinux.lds.S | 1 - arch/sh/lib/memcpy-sh4.S | 1 - arch/sh/mm/cache-sh4.c | 1 - arch/sh/mm/clear_page.S | 1 - arch/sh/mm/extable.c | 1 - arch/sh/mm/hugetlbpage.c | 1 - arch/sh/mm/init.c | 1 - arch/sh/mm/pg-sh4.c | 1 - arch/sh/oprofile/op_model_sh7750.c | 2 +- arch/sh64/Makefile | 9 +- arch/sh64/boot/compressed/misc.c | 1 - arch/sh64/boot/compressed/vmlinux.lds.S | 1 - arch/sh64/kernel/alphanum.c | 1 - arch/sh64/kernel/dma.c | 4 +- arch/sh64/kernel/entry.S | 1 - arch/sh64/kernel/head.S | 1 - arch/sh64/kernel/irq.c | 8 +- arch/sh64/kernel/irq_intc.c | 19 +- arch/sh64/kernel/led.c | 1 - arch/sh64/kernel/pci_sh5.c | 5 +- arch/sh64/kernel/pcibios.c | 4 +- arch/sh64/kernel/process.c | 44 +- arch/sh64/kernel/ptrace.c | 84 +- arch/sh64/kernel/setup.c | 6 +- arch/sh64/kernel/sh_ksyms.c | 14 +- arch/sh64/kernel/signal.c | 15 +- arch/sh64/kernel/time.c | 34 +- arch/sh64/kernel/vmlinux.lds.S | 1 - arch/sh64/lib/c-checksum.c | 1 - arch/sh64/lib/dbg.c | 3 +- arch/sh64/lib/io.c | 1 - arch/sh64/lib/iomap.c | 1 - arch/sh64/lib/memcpy.c | 1 - arch/sh64/lib/udelay.c | 1 - arch/sh64/mach-cayman/iomap.c | 1 - arch/sh64/mach-cayman/irq.c | 7 +- arch/sh64/mach-cayman/setup.c | 7 +- arch/sh64/mach-harp/setup.c | 1 - arch/sh64/mach-romram/setup.c | 1 - arch/sh64/mach-sim/setup.c | 1 - arch/sh64/mm/cache.c | 69 +- arch/sh64/mm/extable.c | 1 - arch/sh64/mm/hugetlbpage.c | 1 - arch/sh64/mm/ioremap.c | 8 +- arch/sparc/kernel/Makefile | 2 +- arch/sparc/kernel/asm-offsets.c | 1 - arch/sparc/kernel/auxio.c | 1 - arch/sparc/kernel/cpu.c | 1 - arch/sparc/kernel/devices.c | 26 +- arch/sparc/kernel/ebus.c | 186 +- arch/sparc/kernel/entry.S | 1 - arch/sparc/kernel/head.S | 1 - arch/sparc/kernel/idprom.c | 1 - arch/sparc/kernel/ioport.c | 157 +- arch/sparc/kernel/irq.c | 24 +- arch/sparc/kernel/pcic.c | 16 +- arch/sparc/kernel/process.c | 1 - arch/sparc/kernel/setup.c | 39 +- arch/sparc/kernel/signal.c | 1 - arch/sparc/kernel/smp.c | 133 +- arch/sparc/kernel/sparc_ksyms.c | 3 - arch/sparc/kernel/sun4c_irq.c | 6 +- arch/sparc/kernel/sun4d_irq.c | 29 +- arch/sparc/kernel/sun4d_smp.c | 105 +- arch/sparc/kernel/sun4m_irq.c | 11 +- arch/sparc/kernel/sun4m_smp.c | 11 +- arch/sparc/kernel/sys_solaris.c | 1 - arch/sparc/kernel/sys_sparc.c | 22 +- arch/sparc/kernel/sys_sunos.c | 18 +- arch/sparc/kernel/systbls.S | 1 - arch/sparc/kernel/tick14.c | 2 +- arch/sparc/kernel/time.c | 178 +- arch/sparc/kernel/traps.c | 1 - arch/sparc/lib/Makefile | 2 + arch/sparc/lib/atomic.S | 1 - arch/sparc/lib/bitops.S | 1 - arch/sparc/lib/rwsem.S | 1 - arch/sparc/mm/btfixup.c | 1 - arch/sparc/mm/extable.c | 1 - arch/sparc/mm/hypersparc.S | 1 - arch/sparc/mm/init.c | 3 +- arch/sparc/mm/io-unit.c | 2 +- arch/sparc/mm/iommu.c | 1 - arch/sparc/mm/srmmu.c | 1 - arch/sparc/mm/sun4c.c | 1 - arch/sparc/mm/swift.S | 1 - arch/sparc/mm/tsunami.S | 1 - arch/sparc/mm/viking.S | 1 - arch/sparc/prom/init.c | 1 - arch/sparc/prom/memory.c | 1 - arch/sparc/prom/misc.c | 1 - arch/sparc/prom/tree.c | 18 - arch/sparc64/Kconfig | 10 +- arch/sparc64/defconfig | 72 +- arch/sparc64/kernel/Makefile | 7 +- arch/sparc64/kernel/auxio.c | 97 +- arch/sparc64/kernel/binfmt_aout32.c | 2 - arch/sparc64/kernel/binfmt_elf32.c | 1 - arch/sparc64/kernel/central.c | 131 +- arch/sparc64/kernel/chmc.c | 69 +- arch/sparc64/kernel/cpu.c | 1 - arch/sparc64/kernel/devices.c | 251 +- arch/sparc64/kernel/ebus.c | 276 +- arch/sparc64/kernel/entry.S | 20 +- arch/sparc64/kernel/etrap.S | 1 - arch/sparc64/kernel/head.S | 14 +- arch/sparc64/kernel/irq.c | 1087 +- arch/sparc64/kernel/isa.c | 230 +- arch/sparc64/kernel/kprobes.c | 1 - arch/sparc64/kernel/ktlb.S | 1 - arch/sparc64/kernel/pci.c | 96 +- arch/sparc64/kernel/pci_common.c | 429 +- arch/sparc64/kernel/pci_impl.h | 3 +- arch/sparc64/kernel/pci_iommu.c | 2 +- arch/sparc64/kernel/pci_psycho.c | 354 +- arch/sparc64/kernel/pci_sabre.c | 447 +- arch/sparc64/kernel/pci_schizo.c | 586 +- arch/sparc64/kernel/pci_sun4v.c | 200 +- arch/sparc64/kernel/power.c | 99 +- arch/sparc64/kernel/process.c | 5 - arch/sparc64/kernel/ptrace.c | 1219 +- arch/sparc64/kernel/rtrap.S | 1 - arch/sparc64/kernel/sbus.c | 122 +- arch/sparc64/kernel/setup.c | 9 +- arch/sparc64/kernel/signal.c | 3 +- arch/sparc64/kernel/signal32.c | 2 + arch/sparc64/kernel/smp.c | 41 +- arch/sparc64/kernel/sparc64_ksyms.c | 19 +- arch/sparc64/kernel/starfire.c | 4 +- arch/sparc64/kernel/sun4v_ivec.S | 15 +- arch/sparc64/kernel/sys32.S | 1 - arch/sparc64/kernel/sys_sparc.c | 23 +- arch/sparc64/kernel/sys_sparc32.c | 9 +- arch/sparc64/kernel/sys_sunos32.c | 14 +- arch/sparc64/kernel/systbls.S | 5 +- arch/sparc64/kernel/time.c | 330 +- arch/sparc64/kernel/traps.c | 23 +- arch/sparc64/kernel/tsb.S | 1 - arch/sparc64/kernel/ttable.S | 11 +- arch/sparc64/kernel/unaligned.c | 11 + arch/sparc64/lib/atomic.S | 1 - arch/sparc64/lib/bitops.S | 1 - arch/sparc64/lib/mcount.S | 1 - arch/sparc64/mm/fault.c | 39 +- arch/sparc64/mm/hugetlbpage.c | 1 - arch/sparc64/mm/init.c | 60 +- arch/sparc64/mm/ultra.S | 1 - arch/sparc64/prom/misc.c | 1 - arch/sparc64/prom/tree.c | 85 - arch/sparc64/solaris/fs.c | 11 +- arch/sparc64/solaris/misc.c | 35 +- arch/sparc64/solaris/socksys.c | 4 - arch/um/Kconfig | 5 + arch/um/Kconfig.debug | 10 - arch/um/Makefile-x86_64 | 10 +- arch/um/defconfig | 1 - arch/um/drivers/harddog_kern.c | 1 - arch/um/drivers/hostaudio_kern.c | 1 - arch/um/drivers/line.c | 8 +- arch/um/drivers/mconsole_kern.c | 5 +- arch/um/drivers/mconsole_user.c | 7 +- arch/um/drivers/net_kern.c | 3 +- arch/um/drivers/net_user.c | 80 +- arch/um/drivers/port_kern.c | 4 +- arch/um/drivers/slip_kern.c | 1 - arch/um/drivers/ssl.c | 2 - arch/um/drivers/stderr_console.c | 22 +- arch/um/drivers/stdio_console.c | 2 - arch/um/drivers/tty.c | 31 +- arch/um/drivers/ubd_kern.c | 24 +- arch/um/drivers/xterm_kern.c | 2 +- arch/um/include/common-offsets.h | 8 +- arch/um/include/irq_user.h | 9 +- arch/um/include/kern_util.h | 3 - arch/um/include/line.h | 1 - arch/um/include/longjmp.h | 4 +- arch/um/include/mconsole_kern.h | 1 - arch/um/include/mode_kern.h | 2 - arch/um/include/os.h | 74 +- arch/um/include/skas/mmu-skas.h | 1 - arch/um/include/skas/mode_kern_skas.h | 3 +- arch/um/include/sysdep-i386/kernel-offsets.h | 1 + arch/um/include/sysdep-ppc/ptrace.h | 1 - .../um/include/sysdep-x86_64/kernel-offsets.h | 2 +- arch/um/include/sysdep-x86_64/syscalls.h | 2 +- arch/um/include/tt/mode_kern_tt.h | 3 +- arch/um/include/um_uaccess.h | 1 - arch/um/kernel/Makefile | 10 +- arch/um/kernel/dyn.lds.S | 1 + arch/um/kernel/exec_kern.c | 77 - arch/um/kernel/init_task.c | 1 - arch/um/kernel/irq.c | 80 +- arch/um/kernel/ksyms.c | 7 - arch/um/kernel/mem.c | 11 - arch/um/kernel/physmem.c | 4 +- arch/um/kernel/process_kern.c | 1 - arch/um/kernel/sigio_kern.c | 69 - arch/um/kernel/signal_kern.c | 191 - arch/um/kernel/skas/mem.c | 25 +- arch/um/kernel/skas/mmu.c | 3 +- arch/um/kernel/skas/process_kern.c | 2 +- arch/um/kernel/skas/syscall.c | 7 - arch/um/kernel/skas/tlb.c | 1 - arch/um/kernel/skas/uaccess.c | 15 +- arch/um/kernel/smp.c | 1 - arch/um/kernel/syscall.c | 178 +- arch/um/kernel/syscall_kern.c | 170 - arch/um/kernel/sysrq.c | 1 - arch/um/kernel/time.c | 256 +- arch/um/kernel/time_kern.c | 222 - arch/um/kernel/trap_kern.c | 251 - arch/um/kernel/tt/exec_kern.c | 2 +- arch/um/kernel/tt/gdb_kern.c | 1 - arch/um/kernel/tt/mem.c | 22 +- arch/um/kernel/tt/process_kern.c | 4 +- arch/um/kernel/tt/syscall_kern.c | 12 +- arch/um/kernel/tt/tracer.c | 22 +- arch/um/kernel/um_arch.c | 12 +- arch/um/kernel/uml.lds.S | 13 +- arch/um/kernel/vmlinux.lds.S | 1 - arch/um/os-Linux/file.c | 143 +- arch/um/os-Linux/irq.c | 16 +- arch/um/os-Linux/mem.c | 21 +- arch/um/os-Linux/process.c | 31 +- arch/um/os-Linux/sigio.c | 33 +- arch/um/os-Linux/signal.c | 223 +- arch/um/os-Linux/skas/process.c | 18 +- arch/um/os-Linux/sys-i386/tls.c | 6 +- arch/um/os-Linux/time.c | 23 +- arch/um/os-Linux/tls.c | 9 +- arch/um/os-Linux/uaccess.c | 3 +- arch/um/os-Linux/umid.c | 97 +- arch/um/scripts/Makefile.rules | 34 +- arch/um/sys-i386/checksum.S | 1 - arch/um/sys-i386/ldt.c | 1 - arch/um/sys-i386/ptrace.c | 1 - arch/um/sys-i386/sys_call_table.S | 2 - arch/um/sys-i386/sysrq.c | 1 - arch/um/sys-i386/tls.c | 1 - arch/um/sys-ppc/misc.S | 7 +- arch/um/sys-x86_64/stub_segv.c | 1 - arch/um/sys-x86_64/syscall_table.c | 7 - arch/v850/kernel/anna.c | 1 - arch/v850/kernel/as85ep1.c | 1 - arch/v850/kernel/fpga85e2c.c | 1 - arch/v850/kernel/gbus_int.c | 2 +- arch/v850/kernel/irq.c | 6 +- arch/v850/kernel/ma.c | 1 - arch/v850/kernel/me2.c | 1 - arch/v850/kernel/process.c | 1 - arch/v850/kernel/rte_cb.c | 1 - arch/v850/kernel/rte_cb_leds.c | 1 - arch/v850/kernel/rte_ma1_cb.c | 1 - arch/v850/kernel/rte_mb_a_pci.c | 3 +- arch/v850/kernel/rte_me2_cb.c | 3 +- arch/v850/kernel/rte_nb85e_cb.c | 1 - arch/v850/kernel/setup.c | 6 +- arch/v850/kernel/signal.c | 2 +- arch/v850/kernel/sim.c | 1 - arch/v850/kernel/sim85e2.c | 1 - arch/v850/kernel/syscalls.c | 1 - arch/v850/kernel/teg.c | 1 - arch/v850/kernel/time.c | 3 +- arch/v850/kernel/v850_ksyms.c | 17 - arch/v850/kernel/vmlinux.lds.S | 1 - arch/x86_64/Kconfig | 72 +- arch/x86_64/Kconfig.debug | 22 +- arch/x86_64/Makefile | 4 +- arch/x86_64/boot/Makefile | 9 +- arch/x86_64/boot/compressed/misc.c | 46 +- arch/x86_64/boot/setup.S | 3 +- arch/x86_64/boot/tools/build.c | 6 +- arch/x86_64/boot/video.S | 21 +- arch/x86_64/crypto/aes-x86_64-asm.S | 22 +- arch/x86_64/crypto/aes.c | 20 +- arch/x86_64/defconfig | 254 +- arch/x86_64/ia32/Makefile | 4 + arch/x86_64/ia32/fpu32.c | 93 +- arch/x86_64/ia32/ia32_aout.c | 6 - arch/x86_64/ia32/ia32_binfmt.c | 60 +- arch/x86_64/ia32/ia32_signal.c | 36 +- arch/x86_64/ia32/ia32entry.S | 39 +- arch/x86_64/ia32/ptrace32.c | 699 +- arch/x86_64/ia32/sys_ia32.c | 29 +- arch/x86_64/ia32/vsyscall.lds | 1 + arch/x86_64/kernel/Makefile | 10 +- arch/x86_64/kernel/acpi/Makefile | 1 + arch/x86_64/kernel/acpi/processor.c | 72 - arch/x86_64/kernel/acpi/sleep.c | 8 +- arch/x86_64/kernel/aperture.c | 27 +- arch/x86_64/kernel/apic.c | 35 +- arch/x86_64/kernel/asm-offsets.c | 3 + arch/x86_64/kernel/crash.c | 6 +- arch/x86_64/kernel/e820.c | 58 +- arch/x86_64/kernel/early_printk.c | 2 +- arch/x86_64/kernel/entry.S | 328 +- arch/x86_64/kernel/functionlist | 1 - arch/x86_64/kernel/genapic.c | 1 - arch/x86_64/kernel/genapic_cluster.c | 1 - arch/x86_64/kernel/genapic_flat.c | 31 +- arch/x86_64/kernel/head.S | 1 + arch/x86_64/kernel/head64.c | 7 +- arch/x86_64/kernel/i387.c | 3 +- arch/x86_64/kernel/i8259.c | 23 +- arch/x86_64/kernel/init_task.c | 5 + arch/x86_64/kernel/io_apic.c | 65 +- arch/x86_64/kernel/irq.c | 48 +- arch/x86_64/kernel/kprobes.c | 1 - arch/x86_64/kernel/machine_kexec.c | 17 +- arch/x86_64/kernel/mce.c | 10 +- arch/x86_64/kernel/mce_amd.c | 511 +- arch/x86_64/kernel/module.c | 38 +- arch/x86_64/kernel/mpparse.c | 1 - arch/x86_64/kernel/nmi.c | 94 +- arch/x86_64/kernel/pci-dma.c | 55 +- arch/x86_64/kernel/pci-gart.c | 156 +- arch/x86_64/kernel/pci-nommu.c | 11 +- arch/x86_64/kernel/pci-swiotlb.c | 5 +- arch/x86_64/kernel/pmtimer.c | 4 +- arch/x86_64/kernel/process.c | 23 +- arch/x86_64/kernel/ptrace.c | 648 +- arch/x86_64/kernel/reboot.c | 1 + arch/x86_64/kernel/setup.c | 191 +- arch/x86_64/kernel/setup64.c | 7 +- arch/x86_64/kernel/signal.c | 113 +- arch/x86_64/kernel/smp.c | 14 +- arch/x86_64/kernel/smpboot.c | 39 +- arch/x86_64/kernel/suspend.c | 1 - arch/x86_64/kernel/syscall.c | 1 - arch/x86_64/kernel/time.c | 105 +- arch/x86_64/kernel/traps.c | 284 +- arch/x86_64/kernel/vmlinux.lds.S | 61 +- arch/x86_64/kernel/vsyscall.c | 4 +- arch/x86_64/kernel/x8664_ksyms-xen.c | 155 - arch/x86_64/kernel/x8664_ksyms.c | 115 +- arch/x86_64/lib/Makefile | 2 +- arch/x86_64/lib/clear_page.S | 47 +- arch/x86_64/lib/copy_page.S | 52 +- arch/x86_64/lib/copy_user.S | 39 +- arch/x86_64/lib/csum-copy.S | 26 +- arch/x86_64/lib/csum-partial.c | 1 + arch/x86_64/lib/csum-wrappers.c | 1 + arch/x86_64/lib/delay.c | 6 +- arch/x86_64/lib/getuser.S | 32 +- arch/x86_64/lib/iomap_copy.S | 10 +- arch/x86_64/lib/memcpy.S | 68 +- arch/x86_64/lib/memmove.c | 4 +- arch/x86_64/lib/memset.S | 78 +- arch/x86_64/lib/putuser.S | 32 +- arch/x86_64/lib/thunk.S | 36 +- arch/x86_64/lib/usercopy.c | 13 +- arch/x86_64/mm/extable.c | 1 - arch/x86_64/mm/fault.c | 55 +- arch/x86_64/mm/init.c | 129 +- arch/x86_64/mm/ioremap.c | 5 + arch/x86_64/mm/pageattr.c | 1 - arch/x86_64/mm/srat.c | 347 +- arch/x86_64/pci/mmconfig.c | 4 +- arch/xtensa/Kconfig | 4 - arch/xtensa/Makefile | 2 +- arch/xtensa/boot/boot-elf/bootstrap.S | 1 - arch/xtensa/boot/lib/Makefile | 2 +- arch/xtensa/kernel/coprocessor.S | 1 - arch/xtensa/kernel/entry.S | 2 +- arch/xtensa/kernel/head.S | 1 - arch/xtensa/kernel/irq.c | 6 +- arch/xtensa/kernel/pci.c | 19 +- arch/xtensa/kernel/platform.c | 1 - arch/xtensa/kernel/process.c | 1 - arch/xtensa/kernel/ptrace.c | 3 +- arch/xtensa/kernel/setup.c | 3 +- arch/xtensa/kernel/signal.c | 12 +- arch/xtensa/kernel/syscalls.c | 1 - arch/xtensa/kernel/time.c | 5 +- arch/xtensa/kernel/traps.c | 8 +- arch/xtensa/kernel/vmlinux.lds.S | 1 - arch/xtensa/kernel/xtensa_ksyms.c | 1 - arch/xtensa/mm/init.c | 1 - arch/xtensa/platform-iss/console.c | 1 - arch/xtensa/platform-iss/network.c | 1 - arch/xtensa/platform-iss/setup.c | 1 - block/Kconfig.iosched | 2 +- block/as-iosched.c | 70 +- block/blktrace.c | 8 +- block/cfq-iosched.c | 215 +- block/deadline-iosched.c | 54 +- block/elevator.c | 8 +- block/genhd.c | 8 +- block/ll_rw_blk.c | 60 +- configs/kernel-2.6.17-i586-smp.config | 2896 -- configs/kernel-2.6.17-i586.config | 3015 -- configs/kernel-2.6.17-i686-kdump.config | 3245 -- configs/kernel-2.6.17-i686-smp.config | 3238 -- configs/kernel-2.6.17-i686-xen.config | 3085 -- configs/kernel-2.6.17-i686-xen0.config | 3083 -- configs/kernel-2.6.17-i686-xenU.config | 1531 - configs/kernel-2.6.17-i686.config | 3234 -- crypto/Kconfig | 2 +- crypto/aes.c | 14 +- crypto/anubis.c | 13 +- crypto/api.c | 23 +- crypto/arc4.c | 9 +- crypto/blowfish.c | 19 +- crypto/cast5.c | 14 +- crypto/cast6.c | 15 +- crypto/cipher.c | 14 +- crypto/compress.c | 15 +- crypto/crc32c.c | 19 +- crypto/crypto_null.c | 17 +- crypto/deflate.c | 23 +- crypto/des.c | 27 +- crypto/digest.c | 53 +- crypto/khazad.c | 21 +- crypto/md4.c | 12 +- crypto/md5.c | 12 +- crypto/michael_mic.c | 20 +- crypto/serpent.c | 27 +- crypto/sha1.c | 18 +- crypto/sha256.c | 19 +- crypto/sha512.c | 29 +- crypto/tcrypt.c | 179 +- crypto/tcrypt.h | 36 + crypto/tea.c | 192 +- crypto/tgr192.c | 97 +- crypto/twofish.c | 14 +- crypto/wp512.c | 24 +- drivers/Kconfig | 2 + drivers/Makefile | 2 + drivers/acorn/block/Kconfig | 2 +- drivers/acorn/block/mfmhd.c | 3 +- drivers/acpi/Kconfig | 26 +- drivers/acpi/Makefile | 3 + drivers/acpi/ac.c | 97 +- drivers/acpi/acpi_memhotplug.c | 406 +- drivers/acpi/asus_acpi.c | 367 +- drivers/acpi/battery.c | 171 +- drivers/acpi/bus.c | 153 +- drivers/acpi/button.c | 86 +- drivers/acpi/container.c | 176 +- drivers/acpi/debug.c | 19 +- drivers/acpi/dispatcher/dsfield.c | 13 +- drivers/acpi/dispatcher/dsinit.c | 46 +- drivers/acpi/dispatcher/dsmethod.c | 507 +- drivers/acpi/dispatcher/dsmthdat.c | 43 +- drivers/acpi/dispatcher/dsobject.c | 25 +- drivers/acpi/dispatcher/dsopcode.c | 63 +- drivers/acpi/dispatcher/dsutils.c | 25 +- drivers/acpi/dispatcher/dswexec.c | 34 +- drivers/acpi/dispatcher/dswload.c | 114 +- drivers/acpi/dispatcher/dswscope.c | 10 +- drivers/acpi/dispatcher/dswstate.c | 72 +- drivers/acpi/ec.c | 228 +- drivers/acpi/event.c | 21 +- drivers/acpi/events/evevent.c | 10 +- drivers/acpi/events/evgpe.c | 81 +- drivers/acpi/events/evgpeblk.c | 96 +- drivers/acpi/events/evmisc.c | 41 +- drivers/acpi/events/evregion.c | 159 +- drivers/acpi/events/evrgnini.c | 48 +- drivers/acpi/events/evsci.c | 8 +- drivers/acpi/events/evxface.c | 88 +- drivers/acpi/events/evxfevnt.c | 67 +- drivers/acpi/events/evxfregn.c | 28 +- drivers/acpi/executer/exconfig.c | 63 +- drivers/acpi/executer/exconvrt.c | 15 +- drivers/acpi/executer/excreate.c | 52 +- drivers/acpi/executer/exdump.c | 44 +- drivers/acpi/executer/exfield.c | 18 +- drivers/acpi/executer/exfldio.c | 128 +- drivers/acpi/executer/exmisc.c | 25 +- drivers/acpi/executer/exmutex.c | 29 +- drivers/acpi/executer/exnames.c | 28 +- drivers/acpi/executer/exoparg1.c | 101 +- drivers/acpi/executer/exoparg2.c | 89 +- drivers/acpi/executer/exoparg3.c | 17 +- drivers/acpi/executer/exoparg6.c | 3 +- drivers/acpi/executer/exprep.c | 45 +- drivers/acpi/executer/exregion.c | 40 +- drivers/acpi/executer/exresnte.c | 17 +- drivers/acpi/executer/exresolv.c | 77 +- drivers/acpi/executer/exresop.c | 12 +- drivers/acpi/executer/exstore.c | 15 +- drivers/acpi/executer/exstoren.c | 7 +- drivers/acpi/executer/exstorob.c | 17 +- drivers/acpi/executer/exsystem.c | 96 +- drivers/acpi/executer/exutils.c | 17 +- drivers/acpi/fan.c | 103 +- drivers/acpi/glue.c | 8 +- drivers/acpi/hardware/hwacpi.c | 6 +- drivers/acpi/hardware/hwgpe.c | 8 +- drivers/acpi/hardware/hwregs.c | 223 +- drivers/acpi/hardware/hwsleep.c | 31 +- drivers/acpi/hardware/hwtimer.c | 20 +- drivers/acpi/hotkey.c | 415 +- drivers/acpi/ibm_acpi.c | 70 + drivers/acpi/motherboard.c | 66 +- drivers/acpi/namespace/nsaccess.c | 73 +- drivers/acpi/namespace/nsalloc.c | 131 +- drivers/acpi/namespace/nsdump.c | 15 +- drivers/acpi/namespace/nsdumpdv.c | 6 +- drivers/acpi/namespace/nseval.c | 484 +- drivers/acpi/namespace/nsinit.c | 298 +- drivers/acpi/namespace/nsload.c | 27 +- drivers/acpi/namespace/nsnames.c | 14 +- drivers/acpi/namespace/nsobject.c | 15 +- drivers/acpi/namespace/nsparse.c | 6 +- drivers/acpi/namespace/nssearch.c | 148 +- drivers/acpi/namespace/nsutils.c | 104 +- drivers/acpi/namespace/nswalk.c | 6 +- drivers/acpi/namespace/nsxfeval.c | 200 +- drivers/acpi/namespace/nsxfname.c | 22 +- drivers/acpi/namespace/nsxfobj.c | 11 +- drivers/acpi/numa.c | 62 +- drivers/acpi/osl.c | 200 +- drivers/acpi/parser/psargs.c | 25 +- drivers/acpi/parser/psloop.c | 25 +- drivers/acpi/parser/psopcode.c | 6 +- drivers/acpi/parser/psparse.c | 53 +- drivers/acpi/parser/psscope.c | 17 +- drivers/acpi/parser/pstree.c | 8 +- drivers/acpi/parser/psutils.c | 11 +- drivers/acpi/parser/pswalk.c | 5 +- drivers/acpi/parser/psxface.c | 46 +- drivers/acpi/pci_bind.c | 87 +- drivers/acpi/pci_irq.c | 92 +- drivers/acpi/pci_link.c | 239 +- drivers/acpi/pci_root.c | 59 +- drivers/acpi/power.c | 165 +- drivers/acpi/processor_core.c | 592 +- drivers/acpi/processor_idle.c | 703 +- drivers/acpi/processor_perflib.c | 690 +- drivers/acpi/processor_thermal.c | 240 +- drivers/acpi/processor_throttling.c | 179 +- drivers/acpi/resources/rscalc.c | 108 +- drivers/acpi/resources/rscreate.c | 33 +- drivers/acpi/resources/rsdump.c | 42 +- drivers/acpi/resources/rsinfo.c | 1 + drivers/acpi/resources/rslist.c | 102 +- drivers/acpi/resources/rsmisc.c | 12 +- drivers/acpi/resources/rsutils.c | 155 +- drivers/acpi/resources/rsxface.c | 395 +- drivers/acpi/scan.c | 299 +- drivers/acpi/sleep/main.c | 8 + drivers/acpi/sleep/proc.c | 6 +- drivers/acpi/sleep/wakeup.c | 3 - drivers/acpi/system.c | 37 +- drivers/acpi/tables.c | 5 +- drivers/acpi/tables/tbconvrt.c | 46 +- drivers/acpi/tables/tbget.c | 77 +- drivers/acpi/tables/tbgetall.c | 11 +- drivers/acpi/tables/tbinstal.c | 69 +- drivers/acpi/tables/tbrsdt.c | 73 +- drivers/acpi/tables/tbutils.c | 149 +- drivers/acpi/tables/tbxface.c | 74 +- drivers/acpi/tables/tbxfroot.c | 82 +- drivers/acpi/thermal.c | 317 +- drivers/acpi/utilities/utalloc.c | 636 +- drivers/acpi/utilities/utcache.c | 20 +- drivers/acpi/utilities/utcopy.c | 41 +- drivers/acpi/utilities/utdebug.c | 69 +- drivers/acpi/utilities/utdelete.c | 111 +- drivers/acpi/utilities/uteval.c | 141 +- drivers/acpi/utilities/utglobal.c | 63 +- drivers/acpi/utilities/utinit.c | 26 +- drivers/acpi/utilities/utmath.c | 8 +- drivers/acpi/utilities/utmisc.c | 315 +- drivers/acpi/utilities/utmutex.c | 81 +- drivers/acpi/utilities/utobject.c | 23 +- drivers/acpi/utilities/utresrc.c | 256 +- drivers/acpi/utilities/utstate.c | 43 +- drivers/acpi/utilities/utxface.c | 44 +- drivers/acpi/utils.c | 116 +- drivers/acpi/video.c | 365 +- drivers/amba/bus.c | 5 +- drivers/atm/Kconfig | 2 +- drivers/atm/adummy.c | 1 - drivers/atm/ambassador.c | 8 +- drivers/atm/ambassador.h | 1 - drivers/atm/eni.c | 3 +- drivers/atm/firestream.c | 12 +- drivers/atm/fore200e.c | 7 +- drivers/atm/fore200e.h | 1 - drivers/atm/he.c | 16 +- drivers/atm/horizon.c | 2 +- drivers/atm/horizon.h | 1 - drivers/atm/idt77105.c | 2 +- drivers/atm/idt77105.h | 2 +- drivers/atm/idt77252.c | 6 +- drivers/atm/iphase.c | 6 +- drivers/atm/iphase.h | 1 - drivers/atm/lanai.c | 2 +- drivers/atm/nicstar.c | 3 +- drivers/atm/suni.c | 2 +- drivers/atm/zatm.c | 3 +- drivers/atm/zatm.h | 1 - drivers/base/Kconfig | 6 +- drivers/base/Makefile | 2 + drivers/base/attribute_container.c | 101 +- drivers/base/base.h | 9 + drivers/base/bus.c | 34 +- drivers/base/class.c | 113 +- drivers/base/core.c | 201 +- drivers/base/cpu.c | 28 +- drivers/base/dmapool.c | 3 +- drivers/base/driver.c | 1 - drivers/base/firmware_class.c | 22 +- drivers/base/init.c | 1 + drivers/base/memory.c | 4 +- drivers/base/node.c | 124 +- drivers/base/platform.c | 35 +- drivers/base/power/Makefile | 4 + drivers/base/power/main.c | 1 - drivers/base/power/resume.c | 10 +- drivers/base/power/shutdown.c | 1 - drivers/base/power/suspend.c | 30 +- drivers/base/sys.c | 52 +- drivers/base/topology.c | 6 +- drivers/block/DAC960.c | 20 +- drivers/block/Kconfig | 11 + drivers/block/acsi.c | 6 +- drivers/block/acsi_slm.c | 10 - drivers/block/amiflop.c | 1 + drivers/block/aoe/aoechr.c | 49 +- drivers/block/cciss.c | 3245 +- drivers/block/cciss.h | 2 - drivers/block/cciss_scsi.c | 8 +- drivers/block/cpqarray.c | 18 +- drivers/block/floppy.c | 109 +- drivers/block/loop.c | 24 +- drivers/block/mambo_bd.c | 6 - drivers/block/nbd.c | 60 +- drivers/block/paride/paride.c | 1 - drivers/block/paride/pd.c | 2 +- drivers/block/paride/pf.c | 2 +- drivers/block/paride/pg.c | 18 +- drivers/block/paride/pt.c | 21 - drivers/block/pktcdvd.c | 10 +- drivers/block/ps2esdi.c | 6 +- drivers/block/rd.c | 10 +- drivers/block/swim3.c | 235 +- drivers/block/sx8.c | 129 +- drivers/block/ub.c | 84 +- drivers/block/umem.c | 4 +- drivers/block/viodasd.c | 5 +- drivers/block/xd.c | 1 - drivers/block/z2ram.c | 1 - drivers/bluetooth/bcm203x.c | 2 +- drivers/bluetooth/bfusb.c | 1 - drivers/bluetooth/bluecard_cs.c | 2 +- drivers/bluetooth/bpa10x.c | 37 +- drivers/bluetooth/bt3c_cs.c | 2 +- drivers/bluetooth/btuart_cs.c | 2 +- drivers/bluetooth/dtl1_cs.c | 5 +- drivers/bluetooth/hci_bcsp.c | 1 - drivers/bluetooth/hci_h4.c | 1 - drivers/bluetooth/hci_ldisc.c | 5 +- drivers/bluetooth/hci_usb.c | 100 +- drivers/bluetooth/hci_usb.h | 1 + drivers/bluetooth/hci_vhci.c | 2 - drivers/cdrom/aztcd.c | 1 - drivers/cdrom/cdrom.c | 1 - drivers/cdrom/cdu31a.c | 3 +- drivers/cdrom/cm206.c | 10 +- drivers/cdrom/gscd.c | 3 +- drivers/cdrom/mcdx.c | 5 +- drivers/cdrom/optcd.c | 1 - drivers/cdrom/sbpcd.c | 7 - drivers/cdrom/sjcd.c | 1 - drivers/cdrom/sonycd535.c | 3 +- drivers/cdrom/viocd.c | 5 +- drivers/char/Kconfig | 57 +- drivers/char/Makefile | 4 +- drivers/char/agp/Kconfig | 8 +- drivers/char/agp/agp.h | 2 +- drivers/char/agp/alpha-agp.c | 15 +- drivers/char/agp/amd-k7-agp.c | 2 +- drivers/char/agp/amd64-agp.c | 84 +- drivers/char/agp/ati-agp.c | 35 +- drivers/char/agp/backend.c | 2 +- drivers/char/agp/efficeon-agp.c | 18 +- drivers/char/agp/frontend.c | 29 +- drivers/char/agp/generic.c | 44 +- drivers/char/agp/hp-agp.c | 2 +- drivers/char/agp/intel-agp.c | 175 +- drivers/char/agp/nvidia-agp.c | 27 + drivers/char/agp/sgi-agp.c | 8 +- drivers/char/agp/uninorth-agp.c | 4 +- drivers/char/agp/via-agp.c | 4 +- drivers/char/amiserial.c | 3 +- drivers/char/applicom.c | 55 +- drivers/char/consolemap.c | 1 - drivers/char/crash.c | 35 +- drivers/char/cs5535_gpio.c | 2 +- drivers/char/cyclades.c | 17 +- drivers/char/decserial.c | 1 - drivers/char/drm/drm.h | 1 - drivers/char/drm/drmP.h | 1 - drivers/char/drm/drm_irq.c | 171 +- drivers/char/drm/drm_memory.c | 223 +- drivers/char/drm/drm_memory.h | 1 - drivers/char/drm/drm_memory_debug.h | 3 +- drivers/char/drm/drm_scatter.c | 191 +- drivers/char/drm/drm_sysfs.c | 181 +- drivers/char/drm/ffb_drv.c | 1 - drivers/char/drm/i810_drv.c | 1 - drivers/char/drm/i830_drv.c | 1 - drivers/char/drm/i915_dma.c | 4 +- drivers/char/drm/i915_drm.h | 13 + drivers/char/drm/i915_drv.h | 6 +- drivers/char/drm/i915_irq.c | 69 +- drivers/char/drm/mga_drv.c | 1 - drivers/char/drm/r128_drv.c | 1 - drivers/char/drm/radeon_cp.c | 6 +- drivers/char/drm/radeon_drm.h | 7 +- drivers/char/drm/radeon_drv.c | 1 - drivers/char/drm/radeon_drv.h | 10 +- drivers/char/drm/radeon_state.c | 48 +- drivers/char/drm/savage_drv.c | 1 - drivers/char/drm/sis_drv.c | 1 - drivers/char/drm/tdfx_drv.c | 1 - drivers/char/drm/via_dmablit.c | 2 +- drivers/char/drm/via_drv.c | 1 - drivers/char/ds1286.c | 2 +- drivers/char/ds1302.c | 3 +- drivers/char/ds1620.c | 3 +- drivers/char/dsp56k.c | 12 +- drivers/char/dtlk.c | 7 +- drivers/char/ec3104_keyb.c | 1 - drivers/char/efirtc.c | 2 +- drivers/char/epca.c | 4 +- drivers/char/esp.c | 7 +- drivers/char/ftape/lowlevel/fdc-io.c | 3 +- drivers/char/ftape/lowlevel/ftape-calibr.c | 1 - drivers/char/ftape/lowlevel/ftape-ctl.c | 1 - drivers/char/ftape/lowlevel/ftape-init.c | 1 - drivers/char/ftape/lowlevel/ftape-proc.c | 1 - drivers/char/ftape/lowlevel/ftape-setup.c | 1 - drivers/char/ftape/lowlevel/ftape-tracing.h | 1 - drivers/char/ftape/lowlevel/ftape_syms.c | 1 - drivers/char/ftape/zftape/zftape-ctl.c | 1 - drivers/char/ftape/zftape/zftape-ctl.h | 1 - drivers/char/ftape/zftape/zftape-init.c | 28 +- drivers/char/ftape/zftape/zftape-rw.c | 1 - drivers/char/ftape/zftape/zftape-rw.h | 1 - drivers/char/genrtc.c | 3 +- drivers/char/hangcheck-timer.c | 4 +- drivers/char/hpet.c | 209 +- drivers/char/hvc_console.c | 9 +- drivers/char/hvc_rtas.c | 37 +- drivers/char/hvcs.c | 57 +- drivers/char/hvsi.c | 20 +- drivers/char/hw_random.c | 698 - drivers/char/i8k.c | 2 +- drivers/char/ip2/i2ellis.h | 1 - drivers/char/ip2/ip2main.c | 52 +- drivers/char/ip27-rtc.c | 2 +- drivers/char/ipmi/ipmi_devintf.c | 11 +- drivers/char/ipmi/ipmi_msghandler.c | 25 +- drivers/char/ipmi/ipmi_poweroff.c | 1 - drivers/char/ipmi/ipmi_si_intf.c | 83 +- drivers/char/ipmi/ipmi_watchdog.c | 46 +- drivers/char/isicom.c | 13 +- drivers/char/istallion.c | 1852 +- drivers/char/ite_gpio.c | 4 +- drivers/char/keyboard.c | 167 +- drivers/char/lcd.c | 3 +- drivers/char/lp.c | 10 +- drivers/char/mbcs.c | 16 +- drivers/char/mem.c | 29 +- drivers/char/misc.c | 20 +- drivers/char/mmtimer.c | 7 +- drivers/char/moxa.c | 12 +- drivers/char/mwave/3780i.c | 1 - drivers/char/mwave/mwavedd.c | 2 +- drivers/char/mxser.c | 840 +- drivers/char/n_hdlc.c | 1 - drivers/char/n_r3964.c | 3 +- drivers/char/n_tty.c | 6 +- drivers/char/nvram.c | 3 +- drivers/char/nwbutton.c | 5 +- drivers/char/nwflash.c | 2 +- drivers/char/pcmcia/cm4000_cs.c | 9 +- drivers/char/pcmcia/cm4040_cs.c | 2 +- drivers/char/pcmcia/synclink_cs.c | 73 +- drivers/char/ppdev.c | 17 +- drivers/char/pty.c | 11 +- drivers/char/qtronix.c | 3 +- drivers/char/random.c | 7 +- drivers/char/raw.c | 21 +- drivers/char/rio/daemon.h | 12 +- drivers/char/rio/func.h | 25 +- drivers/char/rio/host.h | 16 +- drivers/char/rio/port.h | 16 +- drivers/char/rio/rio.h | 4 +- drivers/char/rio/rio_linux.c | 36 +- drivers/char/rio/rio_linux.h | 21 +- drivers/char/rio/rioboot.c | 54 +- drivers/char/rio/riocmd.c | 36 +- drivers/char/rio/rioctrl.c | 182 +- drivers/char/rio/rioinit.c | 29 +- drivers/char/rio/riointr.c | 44 +- drivers/char/rio/rioparam.c | 28 +- drivers/char/rio/rioroute.c | 22 +- drivers/char/rio/riotable.c | 24 +- drivers/char/rio/riotty.c | 2 +- drivers/char/rio/unixrup.h | 2 +- drivers/char/riscom8.c | 3 +- drivers/char/rocket.c | 67 +- drivers/char/rtc.c | 71 +- drivers/char/s3c2410-rtc.c | 4 +- drivers/char/scx200_gpio.c | 158 +- drivers/char/serial167.c | 2 - drivers/char/snsc.c | 11 +- drivers/char/snsc_event.c | 57 +- drivers/char/sonypi.c | 15 +- drivers/char/specialix.c | 17 +- drivers/char/stallion.c | 232 +- drivers/char/sx.c | 10 +- drivers/char/synclink.c | 17 +- drivers/char/synclink_gt.c | 150 +- drivers/char/synclinkmp.c | 21 +- drivers/char/sysrq.c | 17 +- drivers/char/tb0219.c | 62 +- drivers/char/tipar.c | 20 +- drivers/char/tlclk.c | 7 +- drivers/char/toshiba.c | 2 +- drivers/char/tpm/tpm.c | 1122 +- drivers/char/tpm/tpm_atmel.c | 202 +- drivers/char/tpm/tpm_infineon.c | 2 +- drivers/char/tpm/tpm_nsc.c | 371 +- drivers/char/tpm/tpm_tis.c | 82 +- drivers/char/tty_io.c | 924 +- drivers/char/tty_ioctl.c | 59 +- drivers/char/vc_screen.c | 14 +- drivers/char/viocons.c | 2 - drivers/char/viotape.c | 15 +- drivers/char/vme_scc.c | 50 +- drivers/char/vr41xx_giu.c | 7 +- drivers/char/vt.c | 584 +- drivers/char/vt_ioctl.c | 3 +- drivers/char/watchdog/Kconfig | 8 +- drivers/char/watchdog/acquirewdt.c | 2 +- drivers/char/watchdog/advantechwdt.c | 2 +- drivers/char/watchdog/alim1535_wdt.c | 2 +- drivers/char/watchdog/alim7101_wdt.c | 2 +- drivers/char/watchdog/at91_wdt.c | 85 +- drivers/char/watchdog/booke_wdt.c | 3 +- drivers/char/watchdog/cpu5wdt.c | 2 +- drivers/char/watchdog/ep93xx_wdt.c | 2 +- drivers/char/watchdog/eurotechwdt.c | 5 +- drivers/char/watchdog/i6300esb.c | 2 +- drivers/char/watchdog/i8xx_tco.c | 30 +- drivers/char/watchdog/ib700wdt.c | 3 +- drivers/char/watchdog/ibmasr.c | 3 +- drivers/char/watchdog/indydog.c | 3 +- drivers/char/watchdog/ixp2000_wdt.c | 20 +- drivers/char/watchdog/ixp4xx_wdt.c | 17 +- drivers/char/watchdog/machzwd.c | 6 +- drivers/char/watchdog/mixcomwd.c | 3 +- drivers/char/watchdog/mpc83xx_wdt.c | 3 +- drivers/char/watchdog/mpc8xx_wdt.c | 3 +- drivers/char/watchdog/mpcore_wdt.c | 5 +- drivers/char/watchdog/mv64x60_wdt.c | 3 +- drivers/char/watchdog/pcwd.c | 5 +- drivers/char/watchdog/pcwd_pci.c | 35 +- drivers/char/watchdog/pcwd_usb.c | 28 +- drivers/char/watchdog/s3c2410_wdt.c | 3 +- drivers/char/watchdog/sa1100_wdt.c | 3 +- drivers/char/watchdog/sbc60xxwdt.c | 2 +- drivers/char/watchdog/sbc8360.c | 7 +- drivers/char/watchdog/sbc_epx_c3.c | 3 +- drivers/char/watchdog/sc1200wdt.c | 12 +- drivers/char/watchdog/sc520_wdt.c | 2 +- drivers/char/watchdog/scx200_wdt.c | 3 +- drivers/char/watchdog/shwdt.c | 3 +- drivers/char/watchdog/softdog.c | 3 +- drivers/char/watchdog/w83627hf_wdt.c | 2 +- drivers/char/watchdog/w83877f_wdt.c | 2 +- drivers/char/watchdog/w83977f_wdt.c | 3 +- drivers/char/watchdog/wafer5823wdt.c | 2 +- drivers/char/watchdog/wd501p.h | 1 - drivers/char/watchdog/wdrtas.c | 5 +- drivers/char/watchdog/wdt.c | 7 +- drivers/char/watchdog/wdt285.c | 2 +- drivers/char/watchdog/wdt977.c | 3 +- drivers/char/watchdog/wdt_pci.c | 7 +- drivers/connector/cn_proc.c | 25 +- drivers/connector/cn_queue.c | 2 +- drivers/connector/connector.c | 21 +- drivers/cpufreq/cpufreq.c | 136 +- drivers/cpufreq/cpufreq_conservative.c | 230 +- drivers/cpufreq/cpufreq_ondemand.c | 275 +- drivers/cpufreq/cpufreq_stats.c | 65 +- drivers/cpufreq/cpufreq_userspace.c | 4 +- drivers/cpufreq/freq_table.c | 16 +- drivers/crypto/padlock-aes.c | 199 +- drivers/edac/Kconfig | 7 + drivers/edac/Makefile | 1 + drivers/edac/amd76x_edac.c | 99 +- drivers/edac/e752x_edac.c | 346 +- drivers/edac/e7xxx_edac.c | 177 +- drivers/edac/edac_mc.c | 1135 +- drivers/edac/edac_mc.h | 25 +- drivers/edac/i82860_edac.c | 133 +- drivers/edac/i82875p_edac.c | 221 +- drivers/edac/r82600_edac.c | 144 +- drivers/eisa/virtual_root.c | 1 - drivers/fc4/fc.c | 4 +- drivers/fc4/fc_syms.c | 1 - drivers/fc4/soc.c | 4 +- drivers/fc4/socal.c | 4 +- drivers/firmware/Kconfig | 3 +- drivers/firmware/dell_rbu.c | 1 - drivers/firmware/dmi_scan.c | 18 +- drivers/firmware/efivars.c | 1 - drivers/firmware/pcdp.c | 61 +- drivers/hwmon/Kconfig | 65 +- drivers/hwmon/Makefile | 4 + drivers/hwmon/asb100.c | 2 +- drivers/hwmon/f71805f.c | 15 +- drivers/hwmon/hdaps.c | 8 +- drivers/hwmon/hwmon-vid.c | 45 +- drivers/hwmon/lm78.c | 2 +- drivers/hwmon/lm80.c | 2 +- drivers/hwmon/lm83.c | 50 +- drivers/hwmon/lm87.c | 2 +- drivers/hwmon/sis5595.c | 2 +- drivers/hwmon/smsc47m1.c | 2 +- drivers/hwmon/w83627ehf.c | 170 +- drivers/hwmon/w83627hf.c | 2 +- drivers/hwmon/w83781d.c | 2 +- drivers/hwmon/w83792d.c | 89 +- drivers/i2c/algos/i2c-algo-bit.c | 4 +- drivers/i2c/algos/i2c-algo-ite.c | 4 +- drivers/i2c/algos/i2c-algo-pca.c | 6 +- drivers/i2c/algos/i2c-algo-pcf.c | 8 +- drivers/i2c/algos/i2c-algo-sibyte.c | 13 +- drivers/i2c/busses/Kconfig | 26 +- drivers/i2c/busses/Makefile | 1 + drivers/i2c/busses/i2c-i801.c | 158 +- drivers/i2c/busses/i2c-ibm_iic.c | 1 - drivers/i2c/busses/i2c-iop3xx.c | 18 +- drivers/i2c/busses/i2c-iop3xx.h | 2 +- drivers/i2c/busses/i2c-mpc.c | 3 +- drivers/i2c/busses/i2c-nforce2.c | 38 +- drivers/i2c/busses/i2c-piix4.c | 33 +- drivers/i2c/busses/i2c-powermac.c | 5 +- drivers/i2c/busses/i2c-pxa.c | 2 +- drivers/i2c/busses/i2c-s3c2410.c | 3 +- drivers/i2c/busses/scx200_acb.c | 209 +- drivers/i2c/busses/scx200_i2c.c | 1 - drivers/i2c/chips/Kconfig | 8 + drivers/i2c/chips/isp1301_omap.c | 5 +- drivers/i2c/chips/m41t00.c | 375 +- drivers/i2c/chips/pca9539.c | 12 +- drivers/i2c/chips/tps65010.c | 19 +- drivers/i2c/i2c-core.c | 4 +- drivers/i2c/i2c-dev.c | 5 +- drivers/ide/Kconfig | 8 +- drivers/ide/arm/icside.c | 1 - drivers/ide/cris/ide-cris.c | 1 - drivers/ide/h8300/ide-h8300.c | 1 - drivers/ide/ide-cd.c | 131 +- drivers/ide/ide-disk.c | 7 +- drivers/ide/ide-dma.c | 9 +- drivers/ide/ide-floppy.c | 18 +- drivers/ide/ide-io.c | 161 +- drivers/ide/ide-iops.c | 19 +- drivers/ide/ide-lib.c | 8 +- drivers/ide/ide-probe.c | 29 +- drivers/ide/ide-proc.c | 3 +- drivers/ide/ide-tape.c | 64 +- drivers/ide/ide-taskfile.c | 6 +- drivers/ide/ide-timing.h | 8 +- drivers/ide/ide.c | 24 +- drivers/ide/legacy/ali14xx.c | 1 - drivers/ide/legacy/dtc2278.c | 1 - drivers/ide/legacy/gayle.c | 1 - drivers/ide/legacy/hd.c | 4 +- drivers/ide/legacy/ht6560b.c | 1 - drivers/ide/legacy/macide.c | 1 - drivers/ide/legacy/q40ide.c | 1 + drivers/ide/legacy/qd65xx.c | 1 - drivers/ide/legacy/umc8672.c | 1 - drivers/ide/pci/aec62xx.c | 8 +- drivers/ide/pci/alim15x3.c | 3 +- drivers/ide/pci/amd74xx.c | 11 +- drivers/ide/pci/atiixp.c | 1 - drivers/ide/pci/cmd640.c | 1 - drivers/ide/pci/cmd64x.c | 16 - drivers/ide/pci/cs5520.c | 1 - drivers/ide/pci/cs5530.c | 1 - drivers/ide/pci/cs5535.c | 1 - drivers/ide/pci/cy82c693.c | 1 - drivers/ide/pci/generic.c | 51 +- drivers/ide/pci/hpt34x.c | 3 +- drivers/ide/pci/hpt366.c | 1 - drivers/ide/pci/it8172.c | 1 - drivers/ide/pci/it821x.c | 79 +- drivers/ide/pci/ns87415.c | 1 - drivers/ide/pci/pdc202xx_new.c | 7 +- drivers/ide/pci/pdc202xx_old.c | 160 +- drivers/ide/pci/piix.c | 16 +- drivers/ide/pci/rz1000.c | 1 - drivers/ide/pci/sc1200.c | 5 +- drivers/ide/pci/serverworks.c | 44 +- drivers/ide/pci/sgiioc4.c | 66 +- drivers/ide/pci/siimage.c | 57 +- drivers/ide/pci/sis5513.c | 3 +- drivers/ide/pci/sl82c105.c | 5 +- drivers/ide/pci/slc90e66.c | 12 +- drivers/ide/pci/triflex.c | 1 - drivers/ide/pci/trm290.c | 4 +- drivers/ide/pci/via82cxxx.c | 1 - drivers/ide/ppc/mpc8xx.c | 1 - drivers/ide/ppc/pmac.c | 128 +- drivers/ide/setup-pci.c | 6 - drivers/ieee1394/Kconfig | 13 +- drivers/ieee1394/config_roms.c | 1 - drivers/ieee1394/csr1212.c | 2 +- drivers/ieee1394/csr1212.h | 1 + drivers/ieee1394/dma.c | 18 +- drivers/ieee1394/dv1394.c | 1 - drivers/ieee1394/eth1394.c | 54 +- drivers/ieee1394/eth1394.h | 2 - drivers/ieee1394/highlevel.c | 446 +- drivers/ieee1394/hosts.c | 20 +- drivers/ieee1394/hosts.h | 17 +- drivers/ieee1394/ieee1394_core.c | 63 +- drivers/ieee1394/ieee1394_core.h | 2 +- drivers/ieee1394/ieee1394_transactions.c | 10 +- drivers/ieee1394/nodemgr.c | 76 +- drivers/ieee1394/ohci1394.c | 60 +- drivers/ieee1394/ohci1394.h | 10 + drivers/ieee1394/oui2c.sh | 1 - drivers/ieee1394/pcilynx.c | 7 +- drivers/ieee1394/pcilynx.h | 1 - drivers/ieee1394/raw1394.c | 57 +- drivers/ieee1394/sbp2.c | 86 +- drivers/ieee1394/sbp2.h | 23 +- drivers/ieee1394/video1394.c | 17 +- drivers/infiniband/Kconfig | 32 + drivers/infiniband/Makefile | 3 + drivers/infiniband/core/Makefile | 20 +- drivers/infiniband/core/cache.c | 42 +- drivers/infiniband/core/cm.c | 145 +- drivers/infiniband/core/fmr_pool.c | 57 +- drivers/infiniband/core/mad.c | 1184 +- drivers/infiniband/core/mad_priv.h | 61 +- drivers/infiniband/core/mad_rmpp.c | 3 +- drivers/infiniband/core/sa_query.c | 517 +- drivers/infiniband/core/ucm.c | 183 +- drivers/infiniband/core/user_mad.c | 889 +- drivers/infiniband/core/uverbs.h | 6 +- drivers/infiniband/core/uverbs_cmd.c | 983 +- drivers/infiniband/core/uverbs_main.c | 56 +- drivers/infiniband/core/verbs.c | 462 +- drivers/infiniband/hw/ipath/Kconfig | 8 +- drivers/infiniband/hw/ipath/Makefile | 2 +- drivers/infiniband/hw/ipath/ipath_common.h | 158 +- drivers/infiniband/hw/ipath/ipath_cq.c | 16 + drivers/infiniband/hw/ipath/ipath_debug.h | 1 + drivers/infiniband/hw/ipath/ipath_diag.c | 98 +- drivers/infiniband/hw/ipath/ipath_driver.c | 454 +- drivers/infiniband/hw/ipath/ipath_eeprom.c | 28 +- drivers/infiniband/hw/ipath/ipath_file_ops.c | 400 +- drivers/infiniband/hw/ipath/ipath_fs.c | 28 +- drivers/infiniband/hw/ipath/ipath_ht400.c | 2 +- drivers/infiniband/hw/ipath/ipath_init_chip.c | 68 +- drivers/infiniband/hw/ipath/ipath_intr.c | 256 +- drivers/infiniband/hw/ipath/ipath_kernel.h | 66 +- drivers/infiniband/hw/ipath/ipath_keys.c | 66 +- drivers/infiniband/hw/ipath/ipath_layer.c | 62 +- drivers/infiniband/hw/ipath/ipath_layer.h | 11 +- drivers/infiniband/hw/ipath/ipath_mad.c | 169 +- drivers/infiniband/hw/ipath/ipath_mr.c | 6 + drivers/infiniband/hw/ipath/ipath_pe800.c | 5 +- drivers/infiniband/hw/ipath/ipath_qp.c | 108 +- drivers/infiniband/hw/ipath/ipath_rc.c | 899 +- drivers/infiniband/hw/ipath/ipath_registers.h | 1 + drivers/infiniband/hw/ipath/ipath_ruc.c | 283 +- drivers/infiniband/hw/ipath/ipath_srq.c | 48 +- drivers/infiniband/hw/ipath/ipath_stats.c | 2 +- drivers/infiniband/hw/ipath/ipath_sysfs.c | 115 +- drivers/infiniband/hw/ipath/ipath_uc.c | 165 +- drivers/infiniband/hw/ipath/ipath_ud.c | 41 +- .../infiniband/hw/ipath/ipath_user_pages.c | 12 +- drivers/infiniband/hw/ipath/ipath_verbs.c | 188 +- drivers/infiniband/hw/ipath/ipath_verbs.h | 82 +- .../infiniband/hw/ipath/ipath_verbs_mcast.c | 39 +- drivers/infiniband/hw/ipath/ipath_wc_x86_64.c | 1 + drivers/infiniband/hw/ipath/ips_common.h | 263 - drivers/infiniband/hw/ipath/verbs_debug.h | 1 + drivers/infiniband/hw/mthca/mthca_allocator.c | 146 +- drivers/infiniband/hw/mthca/mthca_av.c | 179 +- drivers/infiniband/hw/mthca/mthca_cmd.c | 989 +- drivers/infiniband/hw/mthca/mthca_cq.c | 632 +- drivers/infiniband/hw/mthca/mthca_eq.c | 233 +- drivers/infiniband/hw/mthca/mthca_mad.c | 158 +- drivers/infiniband/hw/mthca/mthca_main.c | 313 +- drivers/infiniband/hw/mthca/mthca_provider.c | 811 +- drivers/infiniband/hw/mthca/mthca_provider.h | 156 +- drivers/infiniband/hw/mthca/mthca_qp.c | 1600 +- drivers/infiniband/hw/mthca/mthca_reset.c | 1 - drivers/infiniband/hw/mthca/mthca_srq.c | 16 +- drivers/infiniband/ulp/ipoib/Kconfig | 6 +- drivers/infiniband/ulp/ipoib/ipoib.h | 130 +- drivers/infiniband/ulp/ipoib/ipoib_fs.c | 179 +- drivers/infiniband/ulp/ipoib/ipoib_ib.c | 283 +- drivers/infiniband/ulp/ipoib/ipoib_main.c | 343 +- .../infiniband/ulp/ipoib/ipoib_multicast.c | 26 +- drivers/infiniband/ulp/ipoib/ipoib_verbs.c | 41 +- drivers/infiniband/ulp/srp/ib_srp.c | 512 +- drivers/infiniband/ulp/srp/ib_srp.h | 33 +- drivers/input/Kconfig | 2 +- drivers/input/evdev.c | 20 +- drivers/input/gameport/emu10k1-gp.c | 1 - drivers/input/gameport/fm801-gp.c | 4 +- drivers/input/gameport/gameport.c | 66 +- drivers/input/gameport/ns558.c | 1 - drivers/input/input.c | 139 +- drivers/input/joydev.c | 69 +- drivers/input/joystick/a3d.c | 2 +- drivers/input/joystick/analog.c | 24 +- drivers/input/joystick/cobra.c | 3 +- drivers/input/joystick/db9.c | 5 +- drivers/input/joystick/gamecon.c | 3 +- drivers/input/joystick/gf2k.c | 2 +- drivers/input/joystick/grip.c | 3 +- drivers/input/joystick/guillemot.c | 2 +- drivers/input/joystick/iforce/iforce-ff.c | 8 +- drivers/input/joystick/iforce/iforce-main.c | 25 +- drivers/input/joystick/iforce/iforce.h | 1 - drivers/input/joystick/interact.c | 2 +- drivers/input/joystick/magellan.c | 2 +- drivers/input/joystick/sidewinder.c | 15 +- drivers/input/joystick/spaceball.c | 4 +- drivers/input/joystick/spaceorb.c | 2 +- drivers/input/joystick/stinger.c | 2 +- drivers/input/joystick/twidjoy.c | 2 +- drivers/input/joystick/warrior.c | 2 +- drivers/input/keyboard/amikbd.c | 34 +- drivers/input/keyboard/atkbd.c | 330 +- drivers/input/keyboard/corgikbd.c | 222 +- drivers/input/keyboard/hilkbd.c | 62 +- drivers/input/keyboard/lkkbd.c | 9 +- drivers/input/keyboard/locomokbd.c | 92 +- drivers/input/keyboard/newtonkbd.c | 2 +- drivers/input/keyboard/spitzkbd.c | 12 +- drivers/input/keyboard/sunkbd.c | 2 +- drivers/input/keyboard/xtkbd.c | 2 +- drivers/input/misc/Kconfig | 2 +- drivers/input/misc/ixp4xx-beeper.c | 2 +- drivers/input/misc/sparcspkr.c | 219 +- drivers/input/misc/wistron_btns.c | 23 +- drivers/input/mouse/alps.c | 189 +- drivers/input/mouse/inport.c | 1 - drivers/input/mouse/logips2pp.c | 3 +- drivers/input/mouse/psmouse-base.c | 32 +- drivers/input/mouse/rpcmouse.c | 2 +- drivers/input/mouse/sermouse.c | 3 +- drivers/input/mouse/trackpoint.c | 52 +- drivers/input/mouse/vsxxxaa.c | 23 +- drivers/input/mousedev.c | 43 +- drivers/input/power.c | 1 - drivers/input/serio/ct82c710.c | 7 +- drivers/input/serio/gscps2.c | 3 +- drivers/input/serio/i8042-sparcio.h | 109 +- drivers/input/serio/i8042.c | 5 +- drivers/input/serio/i8042.h | 1 - drivers/input/serio/libps2.c | 151 +- drivers/input/serio/pcips2.c | 2 +- drivers/input/serio/serio.c | 74 +- drivers/input/serio/serio_raw.c | 1 - drivers/input/touchscreen/ads7846.c | 3 +- drivers/input/touchscreen/corgi_ts.c | 254 +- drivers/input/touchscreen/gunze.c | 2 +- drivers/input/touchscreen/h3600_ts_input.c | 8 +- drivers/input/touchscreen/hp680_ts_input.c | 50 +- drivers/input/touchscreen/mtouch.c | 68 +- drivers/input/tsdev.c | 23 +- drivers/isdn/capi/capi.c | 60 +- drivers/isdn/capi/capifs.c | 8 +- drivers/isdn/capi/capiutil.c | 1 - drivers/isdn/divert/divert_procfs.c | 1 - drivers/isdn/divert/isdn_divert.c | 2 +- drivers/isdn/gigaset/bas-gigaset.c | 302 +- drivers/isdn/gigaset/common.c | 19 +- drivers/isdn/gigaset/ev-layer.c | 13 +- drivers/isdn/gigaset/gigaset.h | 5 +- drivers/isdn/gigaset/interface.c | 16 +- drivers/isdn/gigaset/proc.c | 21 +- drivers/isdn/gigaset/usb-gigaset.c | 4 +- drivers/isdn/hardware/avm/b1dma.c | 1 - drivers/isdn/hardware/avm/b1pci.c | 5 +- drivers/isdn/hardware/avm/b1pcmcia.c | 2 +- drivers/isdn/hardware/avm/c4.c | 3 +- drivers/isdn/hardware/avm/t1pci.c | 3 +- drivers/isdn/hardware/eicon/capimain.c | 1 - drivers/isdn/hardware/eicon/diva_didd.c | 1 - drivers/isdn/hardware/eicon/divamnt.c | 4 - drivers/isdn/hardware/eicon/divasi.c | 4 - drivers/isdn/hardware/eicon/divasmain.c | 6 +- drivers/isdn/hardware/eicon/divasproc.c | 1 - drivers/isdn/hardware/eicon/divasync.h | 1 - drivers/isdn/hardware/eicon/platform.h | 1 - drivers/isdn/hisax/asuscom.c | 6 +- drivers/isdn/hisax/avm_a1.c | 2 +- drivers/isdn/hisax/avm_a1p.c | 2 +- drivers/isdn/hisax/avm_pci.c | 11 +- drivers/isdn/hisax/bkm_a4t.c | 7 +- drivers/isdn/hisax/bkm_a8.c | 19 +- drivers/isdn/hisax/config.c | 3 +- drivers/isdn/hisax/diva.c | 17 +- drivers/isdn/hisax/elsa.c | 23 +- drivers/isdn/hisax/elsa_ser.c | 1 - drivers/isdn/hisax/enternow_pci.c | 7 +- drivers/isdn/hisax/gazel.c | 11 +- drivers/isdn/hisax/hfc4s8s_l1.c | 25 +- drivers/isdn/hisax/hfc_2bds0.c | 4 +- drivers/isdn/hisax/hfc_2bs0.c | 4 +- drivers/isdn/hisax/hfc_pci.c | 11 +- drivers/isdn/hisax/hfc_usb.c | 1 - drivers/isdn/hisax/hfcscard.c | 6 +- drivers/isdn/hisax/hisax.h | 1 - drivers/isdn/hisax/hisax_debug.h | 1 - drivers/isdn/hisax/hisax_fcpcipnp.c | 4 +- drivers/isdn/hisax/icc.c | 8 +- drivers/isdn/hisax/icc.h | 2 +- drivers/isdn/hisax/ipacx.c | 19 +- drivers/isdn/hisax/isdnl3.c | 1 - drivers/isdn/hisax/isurf.c | 4 +- drivers/isdn/hisax/ix1_micro.c | 6 +- drivers/isdn/hisax/jade.c | 6 +- drivers/isdn/hisax/l3dss1.c | 1 - drivers/isdn/hisax/mic.c | 2 +- drivers/isdn/hisax/netjet.c | 2 +- drivers/isdn/hisax/niccy.c | 7 +- drivers/isdn/hisax/nj_s.c | 7 +- drivers/isdn/hisax/nj_u.c | 7 +- drivers/isdn/hisax/q931.c | 4 +- drivers/isdn/hisax/s0box.c | 2 +- drivers/isdn/hisax/saphir.c | 2 +- drivers/isdn/hisax/sedlbauer.c | 5 +- drivers/isdn/hisax/sedlbauer_cs.c | 2 +- drivers/isdn/hisax/sportster.c | 4 +- drivers/isdn/hisax/st5481.h | 1 - drivers/isdn/hisax/st5481_init.c | 1 - drivers/isdn/hisax/teleint.c | 2 +- drivers/isdn/hisax/teles0.c | 2 +- drivers/isdn/hisax/teles3.c | 1 + drivers/isdn/hisax/telespci.c | 12 +- drivers/isdn/hisax/w6692.c | 13 +- drivers/isdn/hysdn/boardergo.c | 3 +- drivers/isdn/hysdn/hysdn_defs.h | 1 - drivers/isdn/hysdn/hysdn_init.c | 1 - drivers/isdn/hysdn/hysdn_sched.c | 1 - drivers/isdn/i4l/isdn_common.c | 50 +- drivers/isdn/i4l/isdn_net.c | 1 - drivers/isdn/i4l/isdn_ppp.c | 3 +- drivers/isdn/i4l/isdn_tty.c | 6 +- drivers/isdn/i4l/isdn_tty.h | 1 - drivers/isdn/i4l/isdn_x25iface.c | 4 +- drivers/isdn/isdnloop/isdnloop.c | 1 - drivers/isdn/sc/init.c | 2 +- drivers/isdn/sc/ioctl.c | 1 + drivers/leds/Kconfig | 22 + drivers/leds/Makefile | 3 + drivers/leds/led-class.c | 1 - drivers/leds/led-core.c | 2 +- drivers/leds/led-triggers.c | 3 +- drivers/leds/leds-corgi.c | 1 - drivers/leds/leds-ixp4xx-gpio.c | 1 - drivers/leds/leds-locomo.c | 3 +- drivers/leds/leds-s3c24xx.c | 1 - drivers/leds/leds-spitz.c | 1 - drivers/leds/leds-tosa.c | 1 - drivers/leds/ledtrig-timer.c | 1 - drivers/macintosh/Kconfig | 46 +- drivers/macintosh/Makefile | 4 +- drivers/macintosh/adb.c | 4 - drivers/macintosh/adbhid.c | 41 +- drivers/macintosh/apm_emu.c | 1 - drivers/macintosh/mac_hid.c | 1 - drivers/macintosh/macio-adb.c | 19 +- drivers/macintosh/macio_asic.c | 157 +- drivers/macintosh/macio_sysfs.c | 1 - drivers/macintosh/mediabay.c | 1 - drivers/macintosh/smu.c | 1225 +- drivers/macintosh/therm_adt746x.c | 1 - drivers/macintosh/therm_pm72.c | 219 +- drivers/macintosh/therm_pm72.h | 35 +- drivers/macintosh/therm_windtunnel.c | 1 - drivers/macintosh/via-cuda.c | 25 +- drivers/macintosh/via-pmu.c | 211 +- drivers/macintosh/windfarm_cpufreq_clamp.c | 1 - drivers/macintosh/windfarm_smu_controls.c | 2 +- drivers/macintosh/windfarm_smu_sensors.c | 2 +- drivers/md/Kconfig | 46 +- drivers/md/Makefile | 5 +- drivers/md/bitmap.c | 484 +- drivers/md/dm-crypt.c | 56 +- drivers/md/dm-emc.c | 40 +- drivers/md/dm-exception-store.c | 2 + drivers/md/dm-ioctl.c | 105 +- drivers/md/dm-linear.c | 8 +- drivers/md/dm-log.c | 350 +- drivers/md/dm-log.h | 41 +- drivers/md/dm-mpath.c | 43 +- drivers/md/dm-raid1.c | 772 +- drivers/md/dm-round-robin.c | 6 +- drivers/md/dm-snap.c | 11 +- drivers/md/dm-stripe.c | 25 +- drivers/md/dm-table.c | 57 +- drivers/md/dm-target.c | 2 + drivers/md/dm-zero.c | 8 +- drivers/md/dm.c | 89 +- drivers/md/dm.h | 81 +- drivers/md/kcopyd.c | 56 +- drivers/md/linear.c | 80 +- drivers/md/md.c | 750 +- drivers/md/multipath.c | 2 +- drivers/md/raid1.c | 104 +- drivers/md/raid10.c | 81 +- drivers/md/raid5.c | 1484 +- drivers/md/raid6algos.c | 7 +- drivers/md/raid6main.c | 2427 -- drivers/media/Kconfig | 6 +- drivers/media/common/Makefile | 2 +- drivers/media/common/ir-functions.c | 1 - drivers/media/common/ir-keymaps.c | 82 +- drivers/media/common/saa7146_core.c | 2 +- drivers/media/common/saa7146_fops.c | 4 + drivers/media/common/saa7146_hlp.c | 3 +- drivers/media/common/saa7146_video.c | 4 + drivers/media/common/saa7146_vv_ksyms.c | 12 - drivers/media/dvb/b2c2/Kconfig | 1 + drivers/media/dvb/b2c2/flexcop-common.h | 15 +- drivers/media/dvb/b2c2/flexcop-fe-tuner.c | 256 +- drivers/media/dvb/b2c2/flexcop-pci.c | 143 +- drivers/media/dvb/b2c2/flexcop-usb.c | 14 +- drivers/media/dvb/b2c2/flexcop.c | 53 +- drivers/media/dvb/bt8xx/Kconfig | 1 + drivers/media/dvb/bt8xx/bt878.c | 13 +- drivers/media/dvb/bt8xx/dst.c | 658 +- drivers/media/dvb/bt8xx/dst_ca.c | 897 +- drivers/media/dvb/bt8xx/dst_common.h | 46 +- drivers/media/dvb/bt8xx/dvb-bt8xx.c | 110 +- drivers/media/dvb/bt8xx/dvb-bt8xx.h | 1 + drivers/media/dvb/cinergyT2/Kconfig | 2 +- drivers/media/dvb/cinergyT2/cinergyT2.c | 9 +- drivers/media/dvb/dvb-core/Makefile | 6 +- drivers/media/dvb/dvb-core/dmxdev.c | 3 - drivers/media/dvb/dvb-core/dvb_ca_en50221.c | 25 +- drivers/media/dvb/dvb-core/dvb_demux.c | 4 +- drivers/media/dvb/dvb-core/dvb_frontend.c | 179 +- drivers/media/dvb/dvb-core/dvb_frontend.h | 45 +- drivers/media/dvb/dvb-core/dvb_net.c | 230 +- drivers/media/dvb/dvb-core/dvbdev.c | 18 +- drivers/media/dvb/dvb-core/dvbdev.h | 5 +- drivers/media/dvb/dvb-usb/Kconfig | 11 + drivers/media/dvb/dvb-usb/Makefile | 3 + drivers/media/dvb/dvb-usb/cxusb.c | 48 +- drivers/media/dvb/dvb-usb/dibusb-common.c | 9 +- drivers/media/dvb/dvb-usb/dibusb-mb.c | 7 +- drivers/media/dvb/dvb-usb/digitv.c | 15 +- drivers/media/dvb/dvb-usb/dtt200u-fe.c | 8 +- drivers/media/dvb/dvb-usb/dvb-usb-dvb.c | 17 +- drivers/media/dvb/dvb-usb/dvb-usb-i2c.c | 24 +- drivers/media/dvb/dvb-usb/dvb-usb-ids.h | 4 +- drivers/media/dvb/dvb-usb/dvb-usb.h | 7 +- drivers/media/dvb/dvb-usb/umt-010.c | 2 +- drivers/media/dvb/dvb-usb/vp702x-fe.c | 7 +- drivers/media/dvb/dvb-usb/vp7045-fe.c | 9 +- drivers/media/dvb/frontends/Kconfig | 74 +- drivers/media/dvb/frontends/Makefile | 4 +- drivers/media/dvb/frontends/bcm3510.c | 4 +- drivers/media/dvb/frontends/bsbe1.h | 6 +- drivers/media/dvb/frontends/bsru6.h | 6 +- drivers/media/dvb/frontends/cx22700.c | 32 +- drivers/media/dvb/frontends/cx22700.h | 4 - drivers/media/dvb/frontends/cx22702.c | 29 +- drivers/media/dvb/frontends/cx22702.h | 7 - drivers/media/dvb/frontends/cx24110.c | 26 +- drivers/media/dvb/frontends/cx24110.h | 5 - drivers/media/dvb/frontends/cx24123.c | 199 +- drivers/media/dvb/frontends/cx24123.h | 13 - drivers/media/dvb/frontends/dib3000-common.h | 2 - drivers/media/dvb/frontends/dib3000.h | 4 - drivers/media/dvb/frontends/dib3000mb.c | 12 +- drivers/media/dvb/frontends/dib3000mc.c | 15 +- drivers/media/dvb/frontends/dvb-pll.c | 198 +- drivers/media/dvb/frontends/dvb-pll.h | 44 +- drivers/media/dvb/frontends/dvb_dummy_fe.c | 21 +- drivers/media/dvb/frontends/l64781.c | 11 +- drivers/media/dvb/frontends/l64781.h | 4 - drivers/media/dvb/frontends/lgdt330x.c | 21 +- drivers/media/dvb/frontends/lgdt330x.h | 1 - drivers/media/dvb/frontends/lnbp21.h | 102 +- drivers/media/dvb/frontends/mt312.c | 46 +- drivers/media/dvb/frontends/mt312.h | 4 - drivers/media/dvb/frontends/mt352.c | 23 +- drivers/media/dvb/frontends/mt352.h | 6 - drivers/media/dvb/frontends/nxt200x.c | 24 +- drivers/media/dvb/frontends/nxt200x.h | 4 - drivers/media/dvb/frontends/nxt6000.c | 29 +- drivers/media/dvb/frontends/nxt6000.h | 4 - drivers/media/dvb/frontends/or51132.c | 182 +- drivers/media/dvb/frontends/or51132.h | 2 - drivers/media/dvb/frontends/or51211.c | 21 +- drivers/media/dvb/frontends/s5h1420.c | 43 +- drivers/media/dvb/frontends/s5h1420.h | 4 - drivers/media/dvb/frontends/sp8870.c | 33 +- drivers/media/dvb/frontends/sp8870.h | 4 - drivers/media/dvb/frontends/sp887x.c | 40 +- drivers/media/dvb/frontends/sp887x.h | 6 - drivers/media/dvb/frontends/stv0297.c | 73 +- drivers/media/dvb/frontends/stv0297.h | 6 +- drivers/media/dvb/frontends/stv0299.c | 41 +- drivers/media/dvb/frontends/stv0299.h | 5 - drivers/media/dvb/frontends/tda10021.c | 40 +- drivers/media/dvb/frontends/tda10021.h | 6 +- drivers/media/dvb/frontends/tda1004x.c | 55 +- drivers/media/dvb/frontends/tda1004x.h | 5 - drivers/media/dvb/frontends/tda8083.c | 12 +- drivers/media/dvb/frontends/tda8083.h | 4 - drivers/media/dvb/frontends/ves1820.c | 20 +- drivers/media/dvb/frontends/ves1820.h | 4 - drivers/media/dvb/frontends/ves1x93.c | 29 +- drivers/media/dvb/frontends/ves1x93.h | 4 - drivers/media/dvb/frontends/zl10353.c | 30 +- drivers/media/dvb/frontends/zl10353.h | 6 +- drivers/media/dvb/pluto2/Kconfig | 1 + drivers/media/dvb/pluto2/pluto2.c | 17 +- drivers/media/dvb/ttpci/Kconfig | 8 + drivers/media/dvb/ttpci/Makefile | 6 +- drivers/media/dvb/ttpci/av7110.c | 150 +- drivers/media/dvb/ttpci/av7110.h | 4 - drivers/media/dvb/ttpci/av7110_av.c | 25 +- drivers/media/dvb/ttpci/av7110_v4l.c | 62 +- drivers/media/dvb/ttpci/budget-av.c | 277 +- drivers/media/dvb/ttpci/budget-ci.c | 63 +- drivers/media/dvb/ttpci/budget-core.c | 61 +- drivers/media/dvb/ttpci/budget-patch.c | 47 +- drivers/media/dvb/ttpci/budget.c | 70 +- drivers/media/dvb/ttpci/budget.h | 7 +- drivers/media/dvb/ttusb-budget/Kconfig | 5 +- .../media/dvb/ttusb-budget/dvb-ttusb-budget.c | 277 +- drivers/media/dvb/ttusb-dec/ttusb_dec.c | 6 +- drivers/media/dvb/ttusb-dec/ttusbdecfe.c | 8 +- drivers/media/radio/Kconfig | 14 +- drivers/media/radio/Makefile | 3 + drivers/media/radio/miropcm20-radio.c | 17 +- drivers/media/radio/miropcm20-rds-core.c | 34 +- drivers/media/radio/miropcm20-rds.c | 3 +- drivers/media/radio/radio-aimslab.c | 51 +- drivers/media/radio/radio-aztech.c | 45 +- drivers/media/radio/radio-cadet.c | 317 +- drivers/media/radio/radio-gemtek-pci.c | 48 +- drivers/media/radio/radio-gemtek.c | 33 +- drivers/media/radio/radio-maestro.c | 10 +- drivers/media/radio/radio-maxiradio.c | 81 +- drivers/media/radio/radio-rtrack2.c | 35 +- drivers/media/radio/radio-sf16fmi.c | 41 +- drivers/media/radio/radio-sf16fmr2.c | 5 +- drivers/media/radio/radio-terratec.c | 63 +- drivers/media/radio/radio-trust.c | 27 +- drivers/media/radio/radio-typhoon.c | 5 +- drivers/media/radio/radio-zoltrix.c | 31 +- drivers/media/video/Kconfig | 107 +- drivers/media/video/Makefile | 10 +- drivers/media/video/arv.c | 5 +- drivers/media/video/bt8xx/Kconfig | 2 +- drivers/media/video/bt8xx/bttv-cards.c | 18 +- drivers/media/video/bt8xx/bttv-driver.c | 27 +- drivers/media/video/bt8xx/bttv-gpio.c | 14 - drivers/media/video/bt8xx/bttv-input.c | 3 +- drivers/media/video/bt8xx/bttv-vbi.c | 15 +- drivers/media/video/bt8xx/bttv.h | 1 - drivers/media/video/bt8xx/bttvp.h | 4 +- drivers/media/video/bw-qcam.c | 3 +- drivers/media/video/c-qcam.c | 1 + drivers/media/video/compat_ioctl32.c | 55 +- drivers/media/video/cpia.c | 23 +- drivers/media/video/cpia.h | 3 +- drivers/media/video/cpia2/Kconfig | 2 +- drivers/media/video/cpia2/cpia2.h | 1 + drivers/media/video/cpia2/cpia2_v4l.c | 7 +- drivers/media/video/cpia_pp.c | 9 +- drivers/media/video/cpia_usb.c | 6 - drivers/media/video/cx25840/cx25840-audio.c | 54 +- drivers/media/video/cx25840/cx25840-core.c | 310 +- drivers/media/video/cx25840/cx25840-core.h | 8 +- drivers/media/video/cx25840/cx25840-vbi.c | 177 +- drivers/media/video/cx88/Kconfig | 17 +- drivers/media/video/cx88/Makefile | 5 +- drivers/media/video/cx88/cx88-alsa.c | 15 +- drivers/media/video/cx88/cx88-blackbird.c | 949 +- drivers/media/video/cx88/cx88-cards.c | 174 +- drivers/media/video/cx88/cx88-core.c | 14 +- drivers/media/video/cx88/cx88-dvb.c | 280 +- drivers/media/video/cx88/cx88-i2c.c | 9 +- drivers/media/video/cx88/cx88-input.c | 377 +- drivers/media/video/cx88/cx88-mpeg.c | 56 +- drivers/media/video/cx88/cx88-tvaudio.c | 17 +- drivers/media/video/cx88/cx88-vbi.c | 4 +- drivers/media/video/cx88/cx88-video.c | 78 +- drivers/media/video/cx88/cx88.h | 35 +- drivers/media/video/dsbr100.c | 429 - drivers/media/video/em28xx/em28xx-cards.c | 64 +- drivers/media/video/em28xx/em28xx-core.c | 12 +- drivers/media/video/em28xx/em28xx-i2c.c | 31 +- drivers/media/video/em28xx/em28xx-input.c | 8 +- drivers/media/video/em28xx/em28xx-video.c | 24 +- drivers/media/video/em28xx/em28xx.h | 8 +- drivers/media/video/et61x251/et61x251_core.c | 3 - drivers/media/video/ir-kbd-i2c.c | 60 +- drivers/media/video/meye.c | 8 +- drivers/media/video/meye.h | 1 - drivers/media/video/msp3400-driver.c | 124 +- drivers/media/video/msp3400-driver.h | 5 +- drivers/media/video/msp3400-kthreads.c | 47 +- drivers/media/video/ov511.c | 5 +- drivers/media/video/ov511.h | 1 + drivers/media/video/planb.c | 1 + drivers/media/video/pms.c | 3 +- drivers/media/video/pwc/Kconfig | 13 +- drivers/media/video/pwc/Makefile | 11 +- drivers/media/video/pwc/pwc-ctrl.c | 699 +- drivers/media/video/pwc/pwc-if.c | 1340 +- drivers/media/video/pwc/pwc-kiara.c | 575 +- drivers/media/video/pwc/pwc-kiara.h | 8 +- drivers/media/video/pwc/pwc-misc.c | 67 +- drivers/media/video/pwc/pwc-timon.c | 1132 +- drivers/media/video/pwc/pwc-timon.h | 8 +- drivers/media/video/pwc/pwc-uncompress.c | 154 +- drivers/media/video/pwc/pwc-uncompress.h | 5 +- drivers/media/video/pwc/pwc.h | 175 +- drivers/media/video/saa5246a.c | 1 + drivers/media/video/saa5249.c | 1 + drivers/media/video/saa7110.c | 1 + drivers/media/video/saa7115.c | 137 +- drivers/media/video/saa7127.c | 2 +- drivers/media/video/saa7134/Kconfig | 1 + drivers/media/video/saa7134/saa6752hs.c | 315 +- drivers/media/video/saa7134/saa7134-alsa.c | 14 +- drivers/media/video/saa7134/saa7134-cards.c | 58 +- drivers/media/video/saa7134/saa7134-core.c | 29 +- drivers/media/video/saa7134/saa7134-dvb.c | 259 +- drivers/media/video/saa7134/saa7134-empress.c | 24 +- drivers/media/video/saa7134/saa7134-input.c | 13 +- drivers/media/video/saa7134/saa7134-oss.c | 12 +- drivers/media/video/saa7134/saa7134-video.c | 6 +- drivers/media/video/saa7134/saa7134.h | 7 +- drivers/media/video/se401.c | 1 - drivers/media/video/se401.h | 1 + drivers/media/video/sn9c102/sn9c102_core.c | 3 - drivers/media/video/stradis.c | 7 +- drivers/media/video/stv680.c | 2 +- drivers/media/video/tda9875.c | 3 +- drivers/media/video/tda9887.c | 488 +- drivers/media/video/tea5767.c | 2 +- drivers/media/video/tuner-3036.c | 1 + drivers/media/video/tuner-core.c | 848 +- drivers/media/video/tuner-simple.c | 523 +- drivers/media/video/tuner-types.c | 94 +- drivers/media/video/tvaudio.c | 1 - drivers/media/video/tveeprom.c | 611 +- drivers/media/video/tvmixer.c | 8 - drivers/media/video/tvp5150.c | 45 +- drivers/media/video/usbvideo/Kconfig | 18 +- drivers/media/video/usbvideo/Makefile | 1 + drivers/media/video/usbvideo/konicawc.c | 3 +- drivers/media/video/usbvideo/usbvideo.h | 2 +- drivers/media/video/v4l1-compat.c | 6 +- drivers/media/video/v4l2-common.c | 572 +- drivers/media/video/video-buf-dvb.c | 5 +- drivers/media/video/videocodec.c | 1 - drivers/media/video/videocodec.h | 16 +- drivers/media/video/videodev.c | 1307 +- drivers/media/video/vino.c | 2 +- drivers/media/video/vivi.c | 664 +- drivers/media/video/vpx3220.c | 1 + drivers/media/video/w9966.c | 1 + drivers/media/video/w9968cf.h | 1 - drivers/media/video/zc0301/Kconfig | 6 +- drivers/media/video/zc0301/Makefile | 2 +- drivers/media/video/zc0301/zc0301_core.c | 22 +- drivers/media/video/zc0301/zc0301_pas202bcb.c | 4 +- drivers/media/video/zc0301/zc0301_sensor.h | 26 +- drivers/media/video/zoran.h | 10 +- drivers/media/video/zoran_card.c | 91 +- drivers/media/video/zoran_device.c | 3 +- drivers/media/video/zoran_driver.c | 50 +- drivers/media/video/zoran_procfs.c | 2 +- drivers/media/video/zr36120.c | 2 +- drivers/media/video/zr36120_mem.c | 1 - drivers/message/fusion/Kconfig | 2 - drivers/message/fusion/Makefile | 6 +- drivers/message/fusion/lsi/fc_log.h | 89 - drivers/message/fusion/lsi/mpi.h | 5 +- drivers/message/fusion/lsi/mpi_cnfg.h | 158 +- drivers/message/fusion/lsi/mpi_history.txt | 76 +- drivers/message/fusion/lsi/mpi_init.h | 4 +- drivers/message/fusion/lsi/mpi_ioc.h | 154 +- drivers/message/fusion/lsi/mpi_log_sas.h | 82 +- drivers/message/fusion/lsi/mpi_sas.h | 13 +- drivers/message/fusion/lsi/mpi_targ.h | 5 +- drivers/message/fusion/mptbase.c | 396 +- drivers/message/fusion/mptbase.h | 36 +- drivers/message/fusion/mptctl.c | 4 +- drivers/message/fusion/mptctl.h | 5 - drivers/message/fusion/mptfc.c | 502 +- drivers/message/fusion/mptsas.c | 1048 +- drivers/message/fusion/mptscsih.c | 141 +- drivers/message/fusion/mptspi.c | 14 +- drivers/message/i2o/core.h | 3 + drivers/message/i2o/debug.c | 1 - drivers/message/i2o/i2o_block.c | 1 - drivers/message/i2o/i2o_config.c | 4 +- drivers/message/i2o/i2o_scsi.c | 4 +- drivers/message/i2o/iop.c | 15 +- drivers/message/i2o/pci.c | 2 +- drivers/mfd/ucb1x00-core.c | 9 +- drivers/mfd/ucb1x00-ts.c | 1 - drivers/mfd/ucb1x00.h | 1 + drivers/misc/ibmasm/ibmasm.h | 1 - drivers/misc/ibmasm/ibmasmfs.c | 24 +- drivers/misc/ibmasm/module.c | 4 +- drivers/mmc/at91_mci.c | 144 +- drivers/mmc/au1xmmc.c | 3 +- drivers/mmc/imxmmc.c | 72 +- drivers/mmc/mmc.c | 58 +- drivers/mmc/mmc_block.c | 64 +- drivers/mmc/mmc_queue.c | 3 +- drivers/mmc/mmci.c | 9 +- drivers/mmc/omap.c | 52 +- drivers/mmc/pxamci.c | 1 - drivers/mmc/sdhci.c | 604 +- drivers/mmc/sdhci.h | 34 +- drivers/mmc/wbsd.c | 12 +- drivers/mtd/Kconfig | 8 +- drivers/mtd/chips/Kconfig | 1 - drivers/mtd/chips/Makefile | 7 - drivers/mtd/chips/amd_flash.c | 8 +- drivers/mtd/chips/cfi_cmdset_0001.c | 474 +- drivers/mtd/chips/cfi_cmdset_0002.c | 134 +- drivers/mtd/chips/cfi_cmdset_0020.c | 22 +- drivers/mtd/chips/cfi_probe.c | 9 +- drivers/mtd/chips/chipreg.c | 1 - drivers/mtd/chips/gen_probe.c | 45 +- drivers/mtd/chips/jedec.c | 1 + drivers/mtd/chips/jedec_probe.c | 15 +- drivers/mtd/chips/map_absent.c | 3 +- drivers/mtd/chips/map_ram.c | 3 +- drivers/mtd/chips/map_rom.c | 5 +- drivers/mtd/chips/sharp.c | 1 + drivers/mtd/devices/Kconfig | 6 +- drivers/mtd/devices/Makefile | 7 - drivers/mtd/devices/block2mtd.c | 159 +- drivers/mtd/devices/doc2000.c | 308 +- drivers/mtd/devices/doc2001.c | 239 +- drivers/mtd/devices/doc2001plus.c | 224 +- drivers/mtd/devices/docprobe.c | 27 +- drivers/mtd/devices/lart.c | 1 + drivers/mtd/devices/m25p80.c | 13 +- drivers/mtd/devices/ms02-nv.c | 3 +- drivers/mtd/devices/mtd_dataflash.c | 2 +- drivers/mtd/devices/mtdram.c | 2 +- drivers/mtd/devices/phram.c | 64 +- drivers/mtd/devices/pmc551.c | 16 +- drivers/mtd/devices/slram.c | 4 +- drivers/mtd/inftlcore.c | 193 +- drivers/mtd/inftlmount.c | 60 +- drivers/mtd/maps/Kconfig | 25 +- drivers/mtd/maps/alchemy-flash.c | 1 - drivers/mtd/maps/amd76xrom.c | 6 +- drivers/mtd/maps/ceiva.c | 1 - drivers/mtd/maps/cfi_flagadm.c | 4 +- drivers/mtd/maps/cstm_mips_ixx.c | 1 - drivers/mtd/maps/dbox2-flash.c | 3 +- drivers/mtd/maps/dc21285.c | 1 - drivers/mtd/maps/dilnetpc.c | 1 - drivers/mtd/maps/dmv182.c | 11 +- drivers/mtd/maps/ebony.c | 1 - drivers/mtd/maps/edb7312.c | 1 - drivers/mtd/maps/h720x-flash.c | 1 - drivers/mtd/maps/ichxrom.c | 31 +- drivers/mtd/maps/impa7.c | 1 - drivers/mtd/maps/integrator-flash.c | 1 - drivers/mtd/maps/ipaq-flash.c | 1 - drivers/mtd/maps/ixp2000.c | 2 - drivers/mtd/maps/l440gx.c | 1 - drivers/mtd/maps/lasat.c | 1 - drivers/mtd/maps/mpc1211.c | 1 - drivers/mtd/maps/mtx-1_flash.c | 3 +- drivers/mtd/maps/nettel.c | 4 +- drivers/mtd/maps/ocotea.c | 1 - drivers/mtd/maps/omap-toto-flash.c | 26 +- drivers/mtd/maps/pcmciamtd.c | 1 + drivers/mtd/maps/physmap.c | 256 +- drivers/mtd/maps/redwood.c | 1 - drivers/mtd/maps/sa1100-flash.c | 1 - drivers/mtd/maps/sbc8240.c | 13 +- drivers/mtd/maps/sc520cdp.c | 1 - drivers/mtd/maps/scb2_flash.c | 1 - drivers/mtd/maps/scx200_docflash.c | 6 +- drivers/mtd/maps/solutionengine.c | 1 - drivers/mtd/maps/sun_uflash.c | 198 +- drivers/mtd/maps/tqm834x.c | 1 - drivers/mtd/maps/tqm8xxl.c | 1 - drivers/mtd/maps/ts5500_flash.c | 1 - drivers/mtd/maps/uclinux.c | 1 - drivers/mtd/maps/walnut.c | 18 +- drivers/mtd/maps/wr_sbc82xx_flash.c | 1 - drivers/mtd/mtdblock.c | 17 +- drivers/mtd/mtdblock_ro.c | 4 +- drivers/mtd/mtdchar.c | 339 +- drivers/mtd/mtdconcat.c | 335 +- drivers/mtd/mtdcore.c | 34 +- drivers/mtd/mtdpart.c | 172 +- drivers/mtd/nand/Kconfig | 59 +- drivers/mtd/nand/Makefile | 4 + drivers/mtd/nand/au1550nd.c | 447 +- drivers/mtd/nand/autcpu12.c | 125 +- drivers/mtd/nand/diskonchip.c | 682 +- drivers/mtd/nand/edb7312.c | 97 +- drivers/mtd/nand/h1910.c | 98 +- drivers/mtd/nand/nand_base.c | 3487 +- drivers/mtd/nand/nand_bbt.c | 742 +- drivers/mtd/nand/nand_ecc.c | 226 +- drivers/mtd/nand/nand_ids.c | 177 +- drivers/mtd/nand/nandsim.c | 293 +- drivers/mtd/nand/ppchameleonevb.c | 260 +- drivers/mtd/nand/rtc_from4.c | 351 +- drivers/mtd/nand/s3c2410.c | 378 +- drivers/mtd/nand/sharpsl.c | 173 +- drivers/mtd/nand/spia.c | 101 +- drivers/mtd/nand/toto.c | 131 +- drivers/mtd/nftlcore.c | 222 +- drivers/mtd/nftlmount.c | 91 +- drivers/mtd/onenand/Kconfig | 14 + drivers/mtd/onenand/onenand_base.c | 718 +- drivers/mtd/onenand/onenand_bbt.c | 9 +- drivers/mtd/redboot.c | 18 +- drivers/mtd/rfd_ftl.c | 48 +- drivers/net/3c501.c | 7 +- drivers/net/3c503.c | 2 +- drivers/net/3c505.c | 2 +- drivers/net/3c507.c | 2 +- drivers/net/3c509.c | 1 - drivers/net/3c515.c | 6 +- drivers/net/3c523.c | 4 +- drivers/net/3c527.c | 7 +- drivers/net/3c59x.c | 265 +- drivers/net/8139cp.c | 232 +- drivers/net/8139too.c | 62 +- drivers/net/82596.c | 13 +- drivers/net/8390.c | 14 +- drivers/net/8390.h | 1 - drivers/net/Kconfig | 100 +- drivers/net/Makefile | 6 + drivers/net/Space.c | 1 - drivers/net/a2065.c | 6 +- drivers/net/ac3200.c | 3 +- drivers/net/acenic.c | 9 +- drivers/net/acenic.h | 1 - drivers/net/acenic_firmware.h | 1 - drivers/net/amd8111e.c | 3 +- drivers/net/apne.c | 2 +- drivers/net/appletalk/Kconfig | 2 +- drivers/net/appletalk/cops.c | 3 +- drivers/net/appletalk/cops_ffdrv.h | 1 - drivers/net/appletalk/cops_ltdrv.h | 1 - drivers/net/appletalk/ipddp.c | 1 - drivers/net/arcnet/arcnet.c | 1 - drivers/net/arcnet/com20020-pci.c | 2 +- drivers/net/ariadne.c | 5 +- drivers/net/arm/at91_ether.c | 157 +- drivers/net/arm/at91_ether.h | 1 + drivers/net/arm/ether1.c | 3 +- drivers/net/arm/ether3.c | 3 +- drivers/net/at1700.c | 3 +- drivers/net/atarilance.c | 3 +- drivers/net/au1000_eth.c | 1803 +- drivers/net/au1000_eth.h | 134 +- drivers/net/b44.c | 308 +- drivers/net/b44.h | 7 + drivers/net/bmac.c | 1 - drivers/net/bnx2.c | 296 +- drivers/net/bnx2.h | 269 +- drivers/net/bnx2_fw.h | 4380 ++- drivers/net/bonding/bond_main.c | 6 +- drivers/net/bonding/bond_sysfs.c | 1 - drivers/net/cassini.c | 40 +- drivers/net/chelsio/common.h | 1 - drivers/net/chelsio/cxgb2.c | 3 +- drivers/net/chelsio/sge.c | 1 - drivers/net/cris/eth_v10.c | 3 +- drivers/net/cs89x0.c | 4 +- drivers/net/cs89x0.h | 1 - drivers/net/declance.c | 11 +- drivers/net/defxx.c | 2 +- drivers/net/depca.c | 8 +- drivers/net/dgrs.c | 2 +- drivers/net/dl2k.c | 47 +- drivers/net/dl2k.h | 12 +- drivers/net/dm9000.c | 54 +- drivers/net/dummy.c | 2 +- drivers/net/e100.c | 88 +- drivers/net/e1000/Makefile | 3 +- drivers/net/e1000/e1000.h | 20 +- drivers/net/e1000/e1000_ethtool.c | 188 +- drivers/net/e1000/e1000_hw.c | 1931 +- drivers/net/e1000/e1000_hw.h | 392 +- drivers/net/e1000/e1000_main.c | 820 +- drivers/net/e1000/e1000_osdep.h | 16 +- drivers/net/e1000/e1000_param.c | 202 +- drivers/net/e2100.c | 4 +- drivers/net/eepro.c | 8 +- drivers/net/eepro100.c | 14 +- drivers/net/eexpress.c | 6 +- drivers/net/epic100.c | 165 +- drivers/net/es3210.c | 3 +- drivers/net/eth16i.c | 5 +- drivers/net/fealnx.c | 48 +- drivers/net/fec.c | 311 +- drivers/net/fec.h | 2 +- drivers/net/fec_8xx/fec_8xx-netta.c | 1 - drivers/net/fec_8xx/fec_main.c | 5 +- drivers/net/fec_8xx/fec_mii.c | 43 +- drivers/net/forcedeth.c | 1963 +- drivers/net/fs_enet/Makefile | 6 +- drivers/net/fs_enet/fs_enet-main.c | 210 +- drivers/net/fs_enet/fs_enet-mii.c | 507 - drivers/net/fs_enet/fs_enet.h | 40 +- drivers/net/fs_enet/mac-fcc.c | 33 +- drivers/net/fs_enet/mac-fec.c | 143 +- drivers/net/fs_enet/mac-scc.c | 5 +- drivers/net/fs_enet/mii-bitbang.c | 449 +- drivers/net/fs_enet/mii-fixed.c | 92 - drivers/net/gianfar.c | 1 - drivers/net/gianfar.h | 1 - drivers/net/gianfar_ethtool.c | 1 - drivers/net/gianfar_mii.c | 1 - drivers/net/gianfar_sysfs.c | 1 - drivers/net/gt96100eth.c | 5 +- drivers/net/gt96100eth.h | 3 - drivers/net/hamachi.c | 18 +- drivers/net/hamradio/6pack.c | 1 - drivers/net/hamradio/baycom_ser_fdx.c | 2 +- drivers/net/hamradio/baycom_ser_hdx.c | 2 +- drivers/net/hamradio/bpqether.c | 8 +- drivers/net/hamradio/dmascc.c | 2 +- drivers/net/hamradio/mkiss.c | 1 - drivers/net/hamradio/scc.c | 3 +- drivers/net/hamradio/yam.c | 3 +- drivers/net/hp-plus.c | 2 +- drivers/net/hp.c | 4 +- drivers/net/hp100.c | 10 +- drivers/net/hydra.c | 2 +- drivers/net/ibm_emac/ibm_emac.h | 428 +- drivers/net/ibm_emac/ibm_emac_core.c | 3403 +- drivers/net/ibm_emac/ibm_emac_core.h | 314 +- drivers/net/ibm_emac/ibm_emac_debug.c | 364 +- drivers/net/ibm_emac/ibm_emac_debug.h | 1 - drivers/net/ibm_emac/ibm_emac_mal.c | 675 +- drivers/net/ibm_emac/ibm_emac_mal.h | 332 +- drivers/net/ibm_emac/ibm_emac_phy.c | 348 +- drivers/net/ibm_emac/ibm_emac_rgmii.c | 1 - drivers/net/ibm_emac/ibm_emac_rgmii.h | 63 +- drivers/net/ibm_emac/ibm_emac_tah.c | 1 - drivers/net/ibm_emac/ibm_emac_tah.h | 95 +- drivers/net/ibm_emac/ibm_emac_zmii.c | 1 - drivers/net/ibm_emac/ibm_emac_zmii.h | 107 +- drivers/net/ibmlana.c | 22 +- drivers/net/ibmlana.h | 6 +- drivers/net/ibmveth.c | 294 +- drivers/net/ibmveth.h | 11 +- drivers/net/ifb.c | 2 +- drivers/net/ioc3-eth.c | 5 +- drivers/net/irda/Kconfig | 17 +- drivers/net/irda/Makefile | 1 + drivers/net/irda/ali-ircc.c | 109 +- drivers/net/irda/au1k_ir.c | 1 - drivers/net/irda/donauboe.c | 4 +- drivers/net/irda/irda-usb.c | 327 +- drivers/net/irda/irda-usb.h | 10 +- drivers/net/irda/irport.c | 2 +- drivers/net/irda/nsc-ircc.c | 8 +- drivers/net/irda/pxaficp_ir.c | 1 - drivers/net/irda/sa1100_ir.c | 1 - drivers/net/irda/smsc-ircc2.c | 2 +- drivers/net/irda/stir4200.c | 38 +- drivers/net/irda/vlsi_ir.c | 3 +- drivers/net/irda/vlsi_ir.h | 2 +- drivers/net/irda/w83977af_ir.c | 1 - drivers/net/iseries_veth.c | 28 +- drivers/net/ixgb/Makefile | 2 +- drivers/net/ixgb/ixgb.h | 13 +- drivers/net/ixgb/ixgb_ee.c | 2 +- drivers/net/ixgb/ixgb_ee.h | 2 +- drivers/net/ixgb/ixgb_ethtool.c | 57 +- drivers/net/ixgb/ixgb_hw.c | 2 +- drivers/net/ixgb/ixgb_hw.h | 3 +- drivers/net/ixgb/ixgb_ids.h | 6 +- drivers/net/ixgb/ixgb_main.c | 310 +- drivers/net/ixgb/ixgb_osdep.h | 2 +- drivers/net/ixgb/ixgb_param.c | 26 +- drivers/net/ixp2000/caleb.c | 1 - drivers/net/ixp2000/enp2611.c | 1 - drivers/net/ixp2000/ixp2400-msf.c | 1 - drivers/net/ixp2000/ixpdev.c | 3 +- drivers/net/ixp2000/pm3386.c | 1 - drivers/net/jazzsonic.c | 2 +- drivers/net/lance.c | 5 +- drivers/net/lasi_82596.c | 3 +- drivers/net/lne390.c | 2 +- drivers/net/lp486e.c | 11 +- drivers/net/mace.c | 5 +- drivers/net/mambonet.c | 1 - drivers/net/mipsnet.c | 2 +- drivers/net/mv643xx_eth.c | 4 +- drivers/net/mv643xx_eth.h | 2 +- drivers/net/myri_sbus.c | 119 +- drivers/net/myri_sbus.h | 1 - drivers/net/natsemi.c | 220 +- drivers/net/ne.c | 2 +- drivers/net/ne2.c | 2 +- drivers/net/ne2k-pci.c | 11 +- drivers/net/ni5010.c | 52 +- drivers/net/ni52.c | 2 +- drivers/net/ni65.c | 2 +- drivers/net/ns83820.c | 44 +- drivers/net/pci-skeleton.c | 22 +- drivers/net/pcmcia/axnet_cs.c | 2 +- drivers/net/pcmcia/com20020_cs.c | 5 +- drivers/net/pcmcia/fmvj18x_cs.c | 3 +- drivers/net/pcmcia/pcnet_cs.c | 44 +- drivers/net/pcmcia/smc91c92_cs.c | 2 +- drivers/net/pcmcia/xirc2ps_cs.c | 23 +- drivers/net/pcnet32.c | 553 +- drivers/net/phy/Kconfig | 28 + drivers/net/phy/Makefile | 3 + drivers/net/phy/cicada.c | 43 +- drivers/net/phy/davicom.c | 1 - drivers/net/phy/lxt.c | 9 +- drivers/net/phy/marvell.c | 1 - drivers/net/phy/mdio_bus.c | 2 +- drivers/net/phy/phy.c | 11 +- drivers/net/phy/phy_device.c | 52 +- drivers/net/phy/qsemi.c | 1 - drivers/net/ppp_generic.c | 45 +- drivers/net/ppp_mppe.c | 1 - drivers/net/r8169.c | 46 +- drivers/net/rrunner.c | 3 +- drivers/net/rrunner.h | 1 - drivers/net/s2io-regs.h | 32 +- drivers/net/s2io.c | 2056 +- drivers/net/s2io.h | 72 +- drivers/net/sb1250-mac.c | 3 +- drivers/net/seeq8005.c | 5 +- drivers/net/shaper.c | 1 - drivers/net/sis190.c | 5 +- drivers/net/sis900.c | 28 +- drivers/net/sis900.h | 10 +- drivers/net/sk98lin/h/xmac_ii.h | 2 +- drivers/net/sk98lin/skge.c | 10 +- drivers/net/sk98lin/skvpd.c | 2 +- drivers/net/sk_mca.c | 2 +- drivers/net/skfp/h/sba.h | 2 +- drivers/net/skfp/skfddi.c | 2 +- drivers/net/skge.c | 249 +- drivers/net/skge.h | 10 +- drivers/net/sky2.c | 233 +- drivers/net/sky2.h | 19 +- drivers/net/slhc.c | 1 - drivers/net/slip.c | 1 - drivers/net/slip.h | 1 - drivers/net/smc-ultra.c | 3 +- drivers/net/smc-ultra32.c | 4 +- drivers/net/smc9194.c | 10 +- drivers/net/smc91x.c | 237 +- drivers/net/smc91x.h | 655 +- drivers/net/sonic.c | 3 +- drivers/net/sonic.h | 1 - drivers/net/spider_net.c | 587 +- drivers/net/spider_net.h | 76 +- drivers/net/spider_net_ethtool.c | 13 + drivers/net/starfire.c | 129 +- drivers/net/stnic.c | 1 - drivers/net/sun3lance.c | 4 +- drivers/net/sunbmac.c | 129 +- drivers/net/sunbmac.h | 1 - drivers/net/sundance.c | 112 +- drivers/net/sungem.c | 21 +- drivers/net/sungem_phy.c | 7 +- drivers/net/sunhme.c | 428 +- drivers/net/sunhme.h | 2 - drivers/net/sunlance.c | 173 +- drivers/net/sunqe.c | 468 +- drivers/net/tc35815.c | 2 +- drivers/net/tg3.c | 394 +- drivers/net/tg3.h | 27 +- drivers/net/tlan.c | 2 +- drivers/net/tokenring/3c359.c | 3 +- drivers/net/tokenring/abyss.c | 2 +- drivers/net/tokenring/ibmtr.c | 4 +- drivers/net/tokenring/lanstreamer.c | 3 +- drivers/net/tokenring/madgemc.c | 2 +- drivers/net/tokenring/olympic.c | 7 +- drivers/net/tokenring/smctr.c | 10 +- drivers/net/tokenring/smctr_firmware.h | 1 - drivers/net/tokenring/tmspci.c | 2 +- drivers/net/tulip/de2104x.c | 70 +- drivers/net/tulip/de4x5.c | 721 +- drivers/net/tulip/de4x5.h | 14 +- drivers/net/tulip/dmfe.c | 4 +- drivers/net/tulip/eeprom.c | 8 +- drivers/net/tulip/interrupt.c | 127 +- drivers/net/tulip/media.c | 2 +- drivers/net/tulip/tulip.h | 3 +- drivers/net/tulip/tulip_core.c | 37 +- drivers/net/tulip/uli526x.c | 82 +- drivers/net/tulip/winbond-840.c | 77 +- drivers/net/tulip/xircom_cb.c | 213 +- drivers/net/tulip/xircom_tulip_cb.c | 30 +- drivers/net/tun.c | 5 +- drivers/net/typhoon.c | 7 +- drivers/net/via-rhine.c | 218 +- drivers/net/via-velocity.c | 123 +- drivers/net/via-velocity.h | 10 +- drivers/net/wan/Kconfig | 12 - drivers/net/wan/Makefile | 1 - drivers/net/wan/c101.c | 41 +- drivers/net/wan/cosa.c | 15 +- drivers/net/wan/cycx_main.c | 1 - drivers/net/wan/dlci.c | 1 - drivers/net/wan/dscc4.c | 14 +- drivers/net/wan/farsync.c | 2 +- drivers/net/wan/hd6457x.c | 26 +- drivers/net/wan/hdlc_cisco.c | 14 +- drivers/net/wan/hdlc_fr.c | 14 +- drivers/net/wan/hdlc_generic.c | 90 +- drivers/net/wan/hdlc_ppp.c | 1 + drivers/net/wan/hdlc_raw.c | 1 + drivers/net/wan/hdlc_raw_eth.c | 1 + drivers/net/wan/hdlc_x25.c | 1 + drivers/net/wan/hostess_sv11.c | 2 +- drivers/net/wan/lmc/lmc_main.c | 2 +- drivers/net/wan/lmc/lmc_media.c | 1 - drivers/net/wan/n2.c | 10 +- drivers/net/wan/pc300_drv.c | 6 +- drivers/net/wan/pci200syn.c | 30 +- drivers/net/wan/sbni.c | 3 +- drivers/net/wan/sdla.c | 5 +- drivers/net/wan/sealevel.c | 2 +- drivers/net/wan/syncppp.c | 1 - drivers/net/wan/wanxl.c | 19 +- drivers/net/wd.c | 4 +- drivers/net/wireless/Kconfig | 58 +- drivers/net/wireless/Makefile | 3 + drivers/net/wireless/airo.c | 274 +- drivers/net/wireless/airo_cs.c | 1 - drivers/net/wireless/airport.c | 1 - drivers/net/wireless/arlan-main.c | 1 - drivers/net/wireless/arlan-proc.c | 1 - drivers/net/wireless/arlan.h | 1 - drivers/net/wireless/atmel.c | 3 +- drivers/net/wireless/atmel_cs.c | 1 - drivers/net/wireless/atmel_pci.c | 1 - drivers/net/wireless/bcm43xx/Kconfig | 1 + drivers/net/wireless/bcm43xx/bcm43xx.h | 186 +- .../net/wireless/bcm43xx/bcm43xx_debugfs.c | 93 +- .../net/wireless/bcm43xx/bcm43xx_debugfs.h | 1 + drivers/net/wireless/bcm43xx/bcm43xx_dma.c | 583 +- drivers/net/wireless/bcm43xx/bcm43xx_dma.h | 296 +- .../net/wireless/bcm43xx/bcm43xx_ethtool.c | 2 +- drivers/net/wireless/bcm43xx/bcm43xx_leds.c | 10 +- drivers/net/wireless/bcm43xx/bcm43xx_main.c | 1108 +- drivers/net/wireless/bcm43xx/bcm43xx_main.h | 30 +- drivers/net/wireless/bcm43xx/bcm43xx_phy.c | 57 +- drivers/net/wireless/bcm43xx/bcm43xx_pio.c | 44 +- drivers/net/wireless/bcm43xx/bcm43xx_pio.h | 13 + drivers/net/wireless/bcm43xx/bcm43xx_radio.c | 7 +- drivers/net/wireless/bcm43xx/bcm43xx_sysfs.c | 60 +- drivers/net/wireless/bcm43xx/bcm43xx_wx.c | 140 +- drivers/net/wireless/bcm43xx/bcm43xx_xmit.c | 5 +- drivers/net/wireless/hermes.c | 67 +- drivers/net/wireless/hermes.h | 43 +- drivers/net/wireless/hostap/hostap_80211_tx.c | 1 - drivers/net/wireless/hostap/hostap_ap.c | 11 - drivers/net/wireless/hostap/hostap_cs.c | 9 +- drivers/net/wireless/hostap/hostap_hw.c | 14 +- drivers/net/wireless/hostap/hostap_main.c | 3 - drivers/net/wireless/hostap/hostap_pci.c | 3 +- drivers/net/wireless/hostap/hostap_plx.c | 5 +- drivers/net/wireless/ipw2100.c | 7 +- drivers/net/wireless/ipw2200.c | 914 +- drivers/net/wireless/ipw2200.h | 85 +- drivers/net/wireless/netwave_cs.c | 1 - drivers/net/wireless/orinoco.c | 256 +- drivers/net/wireless/orinoco.h | 19 +- drivers/net/wireless/orinoco_cs.c | 43 +- drivers/net/wireless/orinoco_nortel.c | 174 +- drivers/net/wireless/orinoco_pci.c | 213 +- drivers/net/wireless/orinoco_plx.c | 226 +- drivers/net/wireless/orinoco_tmd.c | 102 +- drivers/net/wireless/prism54/islpci_hotplug.c | 2 +- drivers/net/wireless/prism54/islpci_mgt.c | 1 - drivers/net/wireless/prism54/prismcompat.h | 1 - drivers/net/wireless/ray_cs.c | 4 +- drivers/net/wireless/spectrum_cs.c | 119 +- drivers/net/wireless/strip.c | 7 +- drivers/net/wireless/wavelan.c | 18 +- drivers/net/wireless/wavelan_cs.c | 7 +- drivers/net/wireless/wavelan_cs.p.h | 1 - drivers/net/wireless/wl3501_cs.c | 1 - drivers/net/yellowfin.c | 73 +- drivers/net/znet.c | 4 +- drivers/net/zorro8390.c | 2 +- drivers/nubus/nubus.c | 1 - drivers/nubus/nubus_syms.c | 1 - drivers/oprofile/buffer_sync.c | 8 +- drivers/oprofile/event_buffer.c | 12 +- drivers/oprofile/event_buffer.h | 4 +- drivers/oprofile/oprof.c | 36 +- drivers/oprofile/oprof.h | 4 +- drivers/oprofile/oprofile_files.c | 4 +- drivers/oprofile/oprofilefs.c | 17 +- drivers/parisc/Kconfig | 33 +- drivers/parisc/ccio-dma.c | 1 - drivers/parisc/dino.c | 5 +- drivers/parisc/eisa.c | 4 +- drivers/parisc/gsc.c | 9 +- drivers/parisc/iosapic.c | 2 +- drivers/parisc/led.c | 12 +- drivers/parisc/pdc_stable.c | 612 +- drivers/parisc/power.c | 1 - drivers/parisc/sba_iommu.c | 18 +- drivers/parisc/superio.c | 4 +- drivers/parport/Kconfig | 17 +- drivers/parport/Makefile | 3 +- drivers/parport/daisy.c | 2 +- drivers/parport/ieee1284.c | 1 - drivers/parport/ieee1284_ops.c | 1 - drivers/parport/parport_arc.c | 139 - drivers/parport/parport_gsc.c | 2 +- drivers/parport/parport_gsc.h | 2 +- drivers/parport/parport_mfc3.c | 2 +- drivers/parport/parport_pc.c | 3 +- drivers/parport/parport_sunbpp.c | 136 +- drivers/parport/procfs.c | 3 +- drivers/parport/share.c | 3 +- drivers/pci/Makefile | 6 +- drivers/pci/bus.c | 31 +- drivers/pci/hotplug/Kconfig | 12 +- drivers/pci/hotplug/Makefile | 3 +- drivers/pci/hotplug/acpi_pcihp.c | 257 +- drivers/pci/hotplug/acpiphp.h | 41 +- drivers/pci/hotplug/acpiphp_core.c | 22 +- drivers/pci/hotplug/acpiphp_dock.c | 438 - drivers/pci/hotplug/acpiphp_glue.c | 367 +- drivers/pci/hotplug/cpci_hotplug_core.c | 3 +- drivers/pci/hotplug/cpci_hotplug_pci.c | 55 +- drivers/pci/hotplug/cpcihp_generic.c | 1 - drivers/pci/hotplug/cpcihp_zt5550.c | 15 +- drivers/pci/hotplug/cpqphp_core.c | 13 +- drivers/pci/hotplug/cpqphp_ctrl.c | 1 - drivers/pci/hotplug/cpqphp_nvram.c | 1 - drivers/pci/hotplug/cpqphp_pci.c | 1 - drivers/pci/hotplug/cpqphp_sysfs.c | 3 +- drivers/pci/hotplug/fakephp.c | 1 - drivers/pci/hotplug/ibmphp_core.c | 12 +- drivers/pci/hotplug/pci_hotplug.h | 50 +- drivers/pci/hotplug/pci_hotplug_core.c | 1 - drivers/pci/hotplug/pciehp.h | 7 +- drivers/pci/hotplug/pciehp_core.c | 14 + drivers/pci/hotplug/pciehp_hpc.c | 43 +- drivers/pci/hotplug/pciehp_pci.c | 152 +- drivers/pci/hotplug/pcihp_skeleton.c | 1 - drivers/pci/hotplug/rpaphp_core.c | 1 - drivers/pci/hotplug/sgi_hotplug.c | 46 +- drivers/pci/hotplug/shpchp.h | 8 +- drivers/pci/hotplug/shpchp_core.c | 8 - drivers/pci/hotplug/shpchp_ctrl.c | 32 +- drivers/pci/hotplug/shpchp_hpc.c | 863 +- drivers/pci/hotplug/shpchp_pci.c | 31 +- drivers/pci/hotplug/shpchp_sysfs.c | 18 +- drivers/pci/msi.c | 296 +- drivers/pci/msi.h | 133 +- drivers/pci/pci-acpi.c | 182 +- drivers/pci/pci-driver.c | 3 +- drivers/pci/pci-sysfs.c | 50 +- drivers/pci/pci.c | 38 +- drivers/pci/pci.h | 18 +- drivers/pci/pcie/portdrv_pci.c | 30 +- drivers/pci/probe.c | 46 +- drivers/pci/proc.c | 20 +- drivers/pci/quirks.c | 194 +- drivers/pci/remove.c | 12 +- drivers/pci/rom.c | 11 +- drivers/pci/search.c | 80 +- drivers/pci/setup-bus.c | 11 +- drivers/pci/setup-res.c | 74 +- drivers/pcmcia/Kconfig | 2 +- drivers/pcmcia/at91_cf.c | 79 +- drivers/pcmcia/au1000_db1x00.c | 23 +- drivers/pcmcia/au1000_generic.c | 1 - drivers/pcmcia/au1000_generic.h | 6 +- drivers/pcmcia/au1000_pb1x00.c | 1 - drivers/pcmcia/cs.c | 29 +- drivers/pcmcia/hd64465_ss.c | 8 +- drivers/pcmcia/i82092.c | 2 +- drivers/pcmcia/i82365.c | 11 +- drivers/pcmcia/m32r_cfc.c | 1 - drivers/pcmcia/m32r_pcc.c | 1 - drivers/pcmcia/m8xx_pcmcia.c | 4 +- drivers/pcmcia/omap_cf.c | 2 +- drivers/pcmcia/pcmcia_ioctl.c | 16 +- drivers/pcmcia/pcmcia_resource.c | 42 +- drivers/pcmcia/pd6729.c | 82 +- drivers/pcmcia/pxa2xx_base.c | 30 +- drivers/pcmcia/rsrc_nonstatic.c | 377 +- drivers/pcmcia/sa1100_badge4.c | 4 +- drivers/pcmcia/sa1100_generic.c | 1 - drivers/pcmcia/sa1111_generic.c | 1 - drivers/pcmcia/sa11xx_base.c | 3 +- drivers/pcmcia/soc_common.c | 42 +- drivers/pcmcia/tcic.c | 5 +- drivers/pcmcia/ti113x.h | 1 + drivers/pcmcia/vrc4171_card.c | 113 +- drivers/pcmcia/vrc4173_cardu.c | 59 +- drivers/pcmcia/yenta_socket.c | 87 +- drivers/pnp/card.c | 49 +- drivers/pnp/driver.c | 1 - drivers/pnp/interface.c | 20 +- drivers/pnp/isapnp/compat.c | 1 - drivers/pnp/isapnp/core.c | 5 +- drivers/pnp/isapnp/proc.c | 1 - drivers/pnp/manager.c | 16 +- drivers/pnp/pnpacpi/core.c | 1 - drivers/pnp/pnpacpi/rsparser.c | 218 +- drivers/pnp/pnpbios/core.c | 2 +- drivers/pnp/pnpbios/rsparser.c | 1 - drivers/pnp/quirks.c | 1 - drivers/pnp/resource.c | 11 +- drivers/pnp/support.c | 1 - drivers/rapidio/rio-access.c | 4 +- drivers/rapidio/rio-scan.c | 1 - drivers/rapidio/rio-sysfs.c | 1 - drivers/rapidio/rio.c | 1 - drivers/rtc/Kconfig | 129 +- drivers/rtc/Makefile | 11 + drivers/rtc/class.c | 3 + drivers/rtc/interface.c | 22 +- drivers/rtc/rtc-dev.c | 131 +- drivers/rtc/rtc-lib.c | 19 + drivers/rtc/rtc-pcf8563.c | 4 +- drivers/rtc/rtc-sa1100.c | 12 +- drivers/rtc/rtc-vr41xx.c | 16 +- drivers/s390/block/dasd.c | 302 +- drivers/s390/block/dasd_3370_erp.c | 27 +- drivers/s390/block/dasd_3990_erp.c | 189 +- drivers/s390/block/dasd_9336_erp.c | 27 +- drivers/s390/block/dasd_9343_erp.c | 2 +- drivers/s390/block/dasd_devmap.c | 115 +- drivers/s390/block/dasd_diag.c | 7 +- drivers/s390/block/dasd_diag.h | 2 +- drivers/s390/block/dasd_eckd.c | 366 +- drivers/s390/block/dasd_eckd.h | 24 +- drivers/s390/block/dasd_eer.c | 6 +- drivers/s390/block/dasd_erp.c | 9 +- drivers/s390/block/dasd_fba.c | 54 +- drivers/s390/block/dasd_fba.h | 2 +- drivers/s390/block/dasd_genhd.c | 17 +- drivers/s390/block/dasd_int.h | 40 +- drivers/s390/block/dasd_ioctl.c | 15 +- drivers/s390/block/dasd_proc.c | 1 - drivers/s390/block/xpram.c | 105 +- drivers/s390/char/con3215.c | 3 +- drivers/s390/char/con3270.c | 1 - drivers/s390/char/ctrlchar.c | 3 +- drivers/s390/char/defkeymap.c | 6 +- drivers/s390/char/fs3270.c | 13 +- drivers/s390/char/keyboard.c | 7 +- drivers/s390/char/monreader.c | 1 - drivers/s390/char/raw3270.c | 154 +- drivers/s390/char/raw3270.h | 2 +- drivers/s390/char/sclp.c | 10 +- drivers/s390/char/sclp_con.c | 1 - drivers/s390/char/sclp_cpi.c | 1 - drivers/s390/char/sclp_quiesce.c | 6 +- drivers/s390/char/sclp_rw.c | 1 - drivers/s390/char/sclp_tty.c | 1 - drivers/s390/char/sclp_vt220.c | 1 - drivers/s390/char/tape.h | 1 - drivers/s390/char/tape_34xx.c | 7 +- drivers/s390/char/tape_3590.c | 1 - drivers/s390/char/tape_block.c | 1 - drivers/s390/char/tape_char.c | 1 - drivers/s390/char/tape_class.c | 10 +- drivers/s390/char/tape_core.c | 19 +- drivers/s390/char/tape_proc.c | 1 - drivers/s390/char/tape_std.c | 1 - drivers/s390/char/tty3270.c | 28 +- drivers/s390/char/vmlogrdr.c | 6 +- drivers/s390/char/vmwatchdog.c | 2 +- drivers/s390/cio/blacklist.c | 36 +- drivers/s390/cio/ccwgroup.c | 43 +- drivers/s390/cio/chsc.c | 51 +- drivers/s390/cio/cio.c | 12 +- drivers/s390/cio/cio.h | 3 +- drivers/s390/cio/cmf.c | 628 +- drivers/s390/cio/css.c | 99 +- drivers/s390/cio/css.h | 4 +- drivers/s390/cio/device.c | 38 +- drivers/s390/cio/device.h | 10 + drivers/s390/cio/device_fsm.c | 130 +- drivers/s390/cio/device_id.c | 1 - drivers/s390/cio/device_ops.c | 14 +- drivers/s390/cio/device_pgid.c | 150 +- drivers/s390/cio/device_status.c | 8 +- drivers/s390/cio/qdio.c | 3 +- drivers/s390/crypto/z90crypt.h | 185 +- drivers/s390/crypto/z90main.c | 1 - drivers/s390/net/Kconfig | 9 - drivers/s390/net/Makefile | 2 +- drivers/s390/net/claw.c | 125 +- drivers/s390/net/ctcmain.c | 69 +- drivers/s390/net/ctcmain.h | 16 +- drivers/s390/net/ctctty.c | 1259 - drivers/s390/net/ctctty.h | 35 - drivers/s390/net/fsm.c | 1 - drivers/s390/net/iucv.c | 7 +- drivers/s390/net/lcs.c | 20 +- drivers/s390/net/netiucv.c | 82 +- drivers/s390/net/qeth.h | 73 +- drivers/s390/net/qeth_eddp.c | 6 +- drivers/s390/net/qeth_main.c | 553 +- drivers/s390/net/qeth_proc.c | 23 +- drivers/s390/net/qeth_sys.c | 68 +- drivers/s390/net/qeth_tso.h | 2 +- drivers/s390/net/smsgiucv.c | 14 +- drivers/s390/s390mach.c | 19 +- drivers/s390/scsi/zfcp_aux.c | 211 +- drivers/s390/scsi/zfcp_ccw.c | 19 +- drivers/s390/scsi/zfcp_dbf.c | 10 +- drivers/s390/scsi/zfcp_def.h | 81 +- drivers/s390/scsi/zfcp_erp.c | 509 +- drivers/s390/scsi/zfcp_ext.h | 28 +- drivers/s390/scsi/zfcp_fsf.c | 266 +- drivers/s390/scsi/zfcp_fsf.h | 38 +- drivers/s390/scsi/zfcp_qdio.c | 97 +- drivers/s390/scsi/zfcp_scsi.c | 191 +- drivers/s390/scsi/zfcp_sysfs_adapter.c | 14 +- drivers/s390/scsi/zfcp_sysfs_driver.c | 14 +- drivers/s390/scsi/zfcp_sysfs_port.c | 15 +- drivers/s390/scsi/zfcp_sysfs_unit.c | 15 +- drivers/s390/sysinfo.c | 1 - drivers/sbus/char/aurora.c | 12 +- drivers/sbus/char/bbc_envctrl.c | 4 +- drivers/sbus/char/bbc_i2c.c | 6 +- drivers/sbus/char/bpp.c | 9 - drivers/sbus/char/cpwatchdog.c | 8 +- drivers/sbus/char/display7seg.c | 2 +- drivers/sbus/char/envctrl.c | 72 +- drivers/sbus/char/flash.c | 18 +- drivers/sbus/char/openprom.c | 601 +- drivers/sbus/char/riowatchdog.c | 4 +- drivers/sbus/char/uctrl.c | 2 +- drivers/sbus/char/vfc.h | 2 - drivers/sbus/char/vfc_dev.c | 9 +- drivers/sbus/dvma.c | 1 - drivers/sbus/sbus.c | 583 +- drivers/scsi/3w-9xxx.c | 230 +- drivers/scsi/3w-xxxx.c | 10 +- drivers/scsi/53c700.c | 116 +- drivers/scsi/53c700.h | 42 +- drivers/scsi/53c7xx.c | 31 +- drivers/scsi/BusLogic.c | 3 +- drivers/scsi/BusLogic.h | 1 - drivers/scsi/FlashPoint.c | 1 - drivers/scsi/Kconfig | 22 +- drivers/scsi/Makefile | 6 +- drivers/scsi/NCR5380.c | 6 +- drivers/scsi/NCR53C9x.c | 19 +- drivers/scsi/NCR53C9x.h | 1 - drivers/scsi/NCR53c406a.c | 8 +- drivers/scsi/NCR_D700.c | 16 +- drivers/scsi/NCR_Q720.c | 2 +- drivers/scsi/a100u2w.c | 2 +- drivers/scsi/a2091.c | 2 +- drivers/scsi/a3000.c | 2 +- drivers/scsi/aacraid/aachba.c | 49 +- drivers/scsi/aacraid/aacraid.h | 10 +- drivers/scsi/aacraid/commctrl.c | 2 +- drivers/scsi/aacraid/comminit.c | 24 +- drivers/scsi/aacraid/commsup.c | 12 +- drivers/scsi/aacraid/dpcsup.c | 6 +- drivers/scsi/aacraid/linit.c | 18 +- drivers/scsi/aacraid/rkt.c | 6 +- drivers/scsi/aacraid/rx.c | 6 +- drivers/scsi/aacraid/sa.c | 10 +- drivers/scsi/advansys.c | 35 +- drivers/scsi/aha152x.c | 47 +- drivers/scsi/aha1542.c | 32 +- drivers/scsi/aha1740.c | 2 +- drivers/scsi/ahci.c | 1637 +- drivers/scsi/aic7xxx/aic7770.c | 2 +- drivers/scsi/aic7xxx/aic7770_osm.c | 2 +- drivers/scsi/aic7xxx/aic79xx.h | 3 +- drivers/scsi/aic7xxx/aic79xx_core.c | 40 +- drivers/scsi/aic7xxx/aic79xx_osm.c | 107 +- drivers/scsi/aic7xxx/aic79xx_osm.h | 13 +- drivers/scsi/aic7xxx/aic79xx_osm_pci.c | 2 +- drivers/scsi/aic7xxx/aic79xx_pci.c | 2 +- drivers/scsi/aic7xxx/aic79xx_proc.c | 23 +- drivers/scsi/aic7xxx/aic7xxx.h | 3 +- drivers/scsi/aic7xxx/aic7xxx_core.c | 12 +- drivers/scsi/aic7xxx/aic7xxx_osm.c | 45 +- drivers/scsi/aic7xxx/aic7xxx_osm.h | 1 - drivers/scsi/aic7xxx/aic7xxx_osm_pci.c | 2 +- drivers/scsi/aic7xxx/aic7xxx_pci.c | 83 +- drivers/scsi/aic7xxx/aic7xxx_proc.c | 4 +- drivers/scsi/aic7xxx/aicasm/Makefile | 2 + drivers/scsi/aic7xxx_old.c | 8 +- drivers/scsi/aic7xxx_old/aic7xxx_proc.c | 1 - drivers/scsi/amiga7xx.c | 1 - drivers/scsi/arm/Kconfig | 3 + drivers/scsi/arm/acornscsi.c | 3 +- drivers/scsi/arm/cumana_1.c | 2 +- drivers/scsi/arm/cumana_2.c | 2 +- drivers/scsi/arm/fas216.c | 2 +- drivers/scsi/arm/powertec.c | 2 +- drivers/scsi/arm/queue.c | 6 +- drivers/scsi/arm/scsi.h | 2 +- drivers/scsi/ata_piix.c | 340 +- drivers/scsi/atari_NCR5380.c | 3 +- drivers/scsi/atari_scsi.c | 1 - drivers/scsi/atp870u.c | 167 +- drivers/scsi/blz1230.c | 2 +- drivers/scsi/blz2060.c | 2 +- drivers/scsi/ch.c | 1 - drivers/scsi/constants.c | 172 +- drivers/scsi/cyberstorm.c | 2 +- drivers/scsi/cyberstormII.c | 2 +- drivers/scsi/dc395x.c | 280 +- drivers/scsi/dec_esp.c | 10 +- drivers/scsi/dmx3191d.c | 2 +- drivers/scsi/dpt/dpti_i2o.h | 1 - drivers/scsi/dpt_i2o.c | 3 +- drivers/scsi/dtc.c | 20 +- drivers/scsi/eata.c | 3 +- drivers/scsi/eata_pio.c | 5 +- drivers/scsi/esp.c | 339 +- drivers/scsi/esp.h | 4 - drivers/scsi/fastlane.c | 2 +- drivers/scsi/fcal.c | 1 - drivers/scsi/fd_mcs.c | 4 +- drivers/scsi/fdomain.c | 13 +- drivers/scsi/g_NCR5380.c | 22 +- drivers/scsi/g_NCR5380.h | 1 - drivers/scsi/gdth.c | 523 +- drivers/scsi/gdth.h | 8 +- drivers/scsi/gdth_kcompat.h | 14 +- drivers/scsi/gdth_proc.c | 245 +- drivers/scsi/gdth_proc.h | 16 +- drivers/scsi/gvp11.c | 2 +- drivers/scsi/ibmmca.c | 34 +- drivers/scsi/ibmvscsi/ibmvscsi.c | 67 +- drivers/scsi/ibmvscsi/iseries_vscsi.c | 2 +- drivers/scsi/ibmvscsi/rpa_vscsi.c | 6 +- drivers/scsi/ide-scsi.c | 9 +- drivers/scsi/imm.c | 12 +- drivers/scsi/imm.h | 3 +- drivers/scsi/in2000.c | 6 +- drivers/scsi/initio.c | 6 +- drivers/scsi/initio.h | 13 +- drivers/scsi/ipr.c | 1274 +- drivers/scsi/ips.c | 41 +- drivers/scsi/iscsi_tcp.c | 3309 +- drivers/scsi/iscsi_tcp.h | 192 +- drivers/scsi/jazz_esp.c | 4 +- drivers/scsi/lasi700.c | 2 +- drivers/scsi/libata-bmdma.c | 163 +- drivers/scsi/libata-core.c | 3307 +- drivers/scsi/libata-scsi.c | 888 +- drivers/scsi/libata.h | 33 +- drivers/scsi/libiscsi.c | 1905 + drivers/scsi/lpfc/lpfc.h | 10 +- drivers/scsi/lpfc/lpfc_attr.c | 656 +- drivers/scsi/lpfc/lpfc_crtn.h | 2 + drivers/scsi/lpfc/lpfc_ct.c | 13 +- drivers/scsi/lpfc/lpfc_els.c | 92 +- drivers/scsi/lpfc/lpfc_hbadisc.c | 19 +- drivers/scsi/lpfc/lpfc_init.c | 79 +- drivers/scsi/lpfc/lpfc_mbox.c | 16 + drivers/scsi/lpfc/lpfc_mem.c | 5 + drivers/scsi/lpfc/lpfc_nportdisc.c | 35 +- drivers/scsi/lpfc/lpfc_scsi.c | 823 +- drivers/scsi/lpfc/lpfc_sli.c | 112 +- drivers/scsi/lpfc/lpfc_sli.h | 22 +- drivers/scsi/lpfc/lpfc_version.h | 2 +- drivers/scsi/mac53c94.c | 2 +- drivers/scsi/mac_esp.c | 7 +- drivers/scsi/mac_scsi.c | 7 +- drivers/scsi/megaraid.c | 8 +- drivers/scsi/megaraid/mega_common.h | 6 + drivers/scsi/megaraid/megaraid_ioctl.h | 4 + drivers/scsi/megaraid/megaraid_mbox.c | 46 +- drivers/scsi/megaraid/megaraid_mbox.h | 4 +- drivers/scsi/megaraid/megaraid_mm.c | 2 +- drivers/scsi/megaraid/megaraid_mm.h | 4 +- drivers/scsi/megaraid/megaraid_sas.c | 60 +- drivers/scsi/megaraid/megaraid_sas.h | 24 +- drivers/scsi/mesh.c | 3 +- drivers/scsi/ncr53c8xx.c | 9 +- drivers/scsi/ncr53c8xx.h | 2 - drivers/scsi/nsp32.c | 14 +- drivers/scsi/oktagon_esp.c | 3 +- drivers/scsi/oktagon_io.S | 1 - drivers/scsi/osst.c | 6 +- drivers/scsi/osst.h | 1 - drivers/scsi/pas16.c | 10 +- drivers/scsi/pcmcia/nsp_cs.c | 2 +- drivers/scsi/pcmcia/sym53c500_cs.c | 195 +- drivers/scsi/pdc_adma.c | 17 +- drivers/scsi/pluto.c | 6 +- drivers/scsi/ppa.c | 3 - drivers/scsi/ppa.h | 3 +- drivers/scsi/qla1280.c | 42 +- drivers/scsi/qla2xxx/Kconfig | 45 - drivers/scsi/qla2xxx/Makefile | 17 +- drivers/scsi/qla2xxx/ql2100.c | 91 - drivers/scsi/qla2xxx/ql2100_fw.c | 11253 +++--- drivers/scsi/qla2xxx/ql2200.c | 91 - drivers/scsi/qla2xxx/ql2200_fw.c | 12385 ++++--- drivers/scsi/qla2xxx/ql2300.c | 114 - drivers/scsi/qla2xxx/ql2300_fw.c | 18015 ++++++---- drivers/scsi/qla2xxx/ql2322.c | 119 - drivers/scsi/qla2xxx/ql2322_fw.c | 19460 ++++++----- drivers/scsi/qla2xxx/ql2400.c | 138 - drivers/scsi/qla2xxx/ql2400_fw.c | 29035 +++++++++------- drivers/scsi/qla2xxx/qla_attr.c | 751 +- drivers/scsi/qla2xxx/qla_dbg.c | 973 +- drivers/scsi/qla2xxx/qla_dbg.h | 151 +- drivers/scsi/qla2xxx/qla_def.h | 210 +- drivers/scsi/qla2xxx/qla_devtbl.h | 17 +- drivers/scsi/qla2xxx/qla_fw.h | 7 +- drivers/scsi/qla2xxx/qla_gbl.h | 41 +- drivers/scsi/qla2xxx/qla_init.c | 376 +- drivers/scsi/qla2xxx/qla_iocb.c | 6 +- drivers/scsi/qla2xxx/qla_isr.c | 110 +- drivers/scsi/qla2xxx/qla_mbx.c | 280 +- drivers/scsi/qla2xxx/qla_os.c | 312 +- drivers/scsi/qla2xxx/qla_rscn.c | 1426 - drivers/scsi/qla2xxx/qla_settings.h | 1 - drivers/scsi/qla2xxx/qla_sup.c | 93 +- drivers/scsi/qla2xxx/qla_version.h | 4 +- drivers/scsi/qlogicpti.c | 376 +- drivers/scsi/raid_class.c | 4 +- drivers/scsi/sata_mv.c | 75 +- drivers/scsi/sata_nv.c | 683 +- drivers/scsi/sata_promise.c | 84 +- drivers/scsi/sata_qstor.c | 132 +- drivers/scsi/sata_sil.c | 349 +- drivers/scsi/sata_sil24.c | 755 +- drivers/scsi/sata_sis.c | 14 +- drivers/scsi/sata_svw.c | 19 +- drivers/scsi/sata_sx4.c | 343 +- drivers/scsi/sata_uli.c | 122 +- drivers/scsi/sata_via.c | 142 +- drivers/scsi/sata_vsc.c | 42 +- drivers/scsi/scsi.c | 186 +- drivers/scsi/scsi.h | 3 - drivers/scsi/scsi_debug.c | 1296 +- drivers/scsi/scsi_devinfo.c | 4 +- drivers/scsi/scsi_error.c | 281 +- drivers/scsi/scsi_ioctl.c | 2 +- drivers/scsi/scsi_lib.c | 352 +- drivers/scsi/scsi_logging.h | 9 +- drivers/scsi/scsi_priv.h | 14 +- drivers/scsi/scsi_proc.c | 9 +- drivers/scsi/scsi_sas_internal.h | 10 +- drivers/scsi/scsi_scan.c | 70 +- drivers/scsi/scsi_sysfs.c | 9 +- drivers/scsi/scsi_transport_fc.c | 48 +- drivers/scsi/scsi_transport_iscsi.c | 1052 +- drivers/scsi/scsi_transport_sas.c | 449 +- drivers/scsi/scsi_transport_spi.c | 14 +- drivers/scsi/scsi_typedefs.h | 1 - drivers/scsi/scsicam.c | 3 +- drivers/scsi/sd.c | 175 +- drivers/scsi/seagate.c | 8 +- drivers/scsi/sg.c | 25 +- drivers/scsi/sim710.c | 3 +- drivers/scsi/sr.c | 9 +- drivers/scsi/sr_vendor.c | 1 - drivers/scsi/st.c | 14 +- drivers/scsi/st.h | 1 - drivers/scsi/sun3_NCR5380.c | 3 +- drivers/scsi/sun3x_esp.c | 12 +- drivers/scsi/sym53c8xx_2/sym53c8xx.h | 1 - drivers/scsi/sym53c8xx_2/sym_glue.c | 16 +- drivers/scsi/sym53c8xx_2/sym_glue.h | 1 - drivers/scsi/sym53c8xx_2/sym_hipd.c | 3 +- drivers/scsi/t128.c | 12 +- drivers/scsi/tmscsim.c | 3 +- drivers/scsi/tmscsim.h | 1 - drivers/scsi/u14-34f.c | 3 +- drivers/scsi/wd33c93.c | 9 +- drivers/scsi/wd33c93.h | 1 - drivers/scsi/wd7000.c | 16 +- drivers/scsi/zalon.c | 2 +- drivers/serial/21285.c | 2 - drivers/serial/68328serial.c | 103 +- drivers/serial/68328serial.h | 1 - drivers/serial/68360serial.c | 1 - drivers/serial/8250.c | 18 +- drivers/serial/8250.h | 1 - drivers/serial/8250_mca.c | 1 - drivers/serial/8250_pci.c | 55 +- drivers/serial/8250_pnp.c | 6 +- drivers/serial/Kconfig | 46 +- drivers/serial/Makefile | 1 + drivers/serial/amba-pl010.c | 3 +- drivers/serial/amba-pl011.c | 1 - drivers/serial/at91_serial.c | 468 +- drivers/serial/clps711x.c | 1 - drivers/serial/cpm_uart/cpm_uart.h | 69 +- drivers/serial/cpm_uart/cpm_uart_core.c | 440 +- drivers/serial/cpm_uart/cpm_uart_cpm1.c | 34 +- drivers/serial/cpm_uart/cpm_uart_cpm2.c | 21 +- drivers/serial/crisv10.c | 31 +- drivers/serial/crisv10.h | 1 - drivers/serial/dz.c | 9 +- drivers/serial/icom.c | 3 +- drivers/serial/imx.c | 4 +- drivers/serial/ioc4_serial.c | 804 +- drivers/serial/ip22zilog.c | 5 +- drivers/serial/jsm/jsm_driver.c | 10 +- drivers/serial/jsm/jsm_tty.c | 235 +- drivers/serial/m32r_sio.c | 4 +- drivers/serial/m32r_sio.h | 1 - drivers/serial/m32r_sio_reg.h | 1 - drivers/serial/mcfserial.c | 31 +- drivers/serial/mcfserial.h | 1 - drivers/serial/mpc52xx_uart.c | 140 +- drivers/serial/mpsc.c | 357 +- drivers/serial/mux.c | 1 - drivers/serial/pmac_zilog.c | 10 +- drivers/serial/pxa.c | 5 +- drivers/serial/s3c2410.c | 148 +- drivers/serial/sa1100.c | 2 - drivers/serial/serial_core.c | 36 +- drivers/serial/serial_cs.c | 13 +- drivers/serial/serial_lh7a40x.c | 63 +- drivers/serial/serial_txx9.c | 236 +- drivers/serial/sh-sci.c | 12 +- drivers/serial/sh-sci.h | 1 - drivers/serial/sn_console.c | 150 +- drivers/serial/suncore.c | 1 - drivers/serial/sunhv.c | 166 +- drivers/serial/sunsab.c | 311 +- drivers/serial/sunsu.c | 525 +- drivers/serial/sunzilog.c | 837 +- drivers/serial/v850e_uart.c | 5 +- drivers/serial/vr41xx_siu.c | 89 +- drivers/sn/ioc3.c | 9 +- drivers/sn/ioc4.c | 467 +- drivers/spi/spi.c | 3 +- drivers/spi/spi_bitbang.c | 1 - drivers/spi/spi_butterfly.c | 1 - drivers/spi/spi_s3c24xx.c | 1 - drivers/spi/spi_s3c24xx_gpio.c | 1 - drivers/tc/lk201.c | 1 - drivers/tc/zs.c | 6 +- drivers/telephony/ixj.c | 2 +- drivers/telephony/phonedev.c | 4 - drivers/usb/Kconfig | 3 +- drivers/usb/Makefile | 2 + drivers/usb/atm/usbatm.c | 2 +- drivers/usb/atm/xusbatm.c | 1 - drivers/usb/class/cdc-acm.c | 134 +- drivers/usb/class/cdc-acm.h | 56 +- drivers/usb/core/Kconfig | 3 - drivers/usb/core/Makefile | 3 +- drivers/usb/core/buffer.c | 1 - drivers/usb/core/config.c | 1 - drivers/usb/core/devio.c | 44 +- drivers/usb/core/driver.c | 1 - drivers/usb/core/file.c | 71 +- drivers/usb/core/hcd-pci.c | 3 +- drivers/usb/core/hcd.c | 13 +- drivers/usb/core/hub.c | 164 +- drivers/usb/core/inode.c | 24 +- drivers/usb/core/message.c | 183 +- drivers/usb/core/notify.c | 4 +- drivers/usb/core/sysfs.c | 140 +- drivers/usb/core/urb.c | 1 - drivers/usb/core/usb.c | 4 +- drivers/usb/core/usb.h | 5 + drivers/usb/gadget/Kconfig | 2 +- drivers/usb/gadget/at91_udc.c | 177 +- drivers/usb/gadget/at91_udc.h | 1 + drivers/usb/gadget/dummy_hcd.c | 7 +- drivers/usb/gadget/epautoconf.c | 16 +- drivers/usb/gadget/ether.c | 148 +- drivers/usb/gadget/file_storage.c | 5 +- drivers/usb/gadget/goku_udc.c | 14 +- drivers/usb/gadget/inode.c | 77 +- drivers/usb/gadget/lh7a40x_udc.c | 4 +- drivers/usb/gadget/lh7a40x_udc.h | 1 - drivers/usb/gadget/net2280.c | 34 +- drivers/usb/gadget/omap_udc.c | 11 +- drivers/usb/gadget/pxa2xx_udc.c | 18 +- drivers/usb/gadget/rndis.c | 392 +- drivers/usb/gadget/rndis.h | 28 +- drivers/usb/gadget/serial.c | 111 +- drivers/usb/gadget/zero.c | 3 +- drivers/usb/host/Kconfig | 23 +- drivers/usb/host/ehci-au1xxx.c | 44 +- drivers/usb/host/ehci-fsl.c | 39 +- drivers/usb/host/ehci-hcd.c | 60 +- drivers/usb/host/ehci-pci.c | 59 +- drivers/usb/host/ehci-sched.c | 216 +- drivers/usb/host/hc_crisv10.c | 4 +- drivers/usb/host/isp116x-hcd.c | 8 +- drivers/usb/host/ohci-at91.c | 90 +- drivers/usb/host/ohci-au1xxx.c | 144 +- drivers/usb/host/ohci-hcd.c | 9 +- drivers/usb/host/ohci-hub.c | 4 +- drivers/usb/host/ohci-lh7a404.c | 42 +- drivers/usb/host/ohci-omap.c | 4 +- drivers/usb/host/ohci-ppc-soc.c | 55 +- drivers/usb/host/ohci-pxa27x.c | 2 +- drivers/usb/host/ohci-s3c2410.c | 2 +- drivers/usb/host/ohci-sa1111.c | 2 +- drivers/usb/host/pci-quirks.c | 9 +- drivers/usb/host/sl811-hcd.c | 15 +- drivers/usb/host/sl811_cs.c | 207 +- drivers/usb/host/uhci-debug.c | 48 +- drivers/usb/host/uhci-hcd.c | 140 +- drivers/usb/host/uhci-hcd.h | 81 +- drivers/usb/host/uhci-hub.c | 5 +- drivers/usb/host/uhci-q.c | 949 +- drivers/usb/image/microtek.c | 10 +- drivers/usb/input/acecad.c | 4 +- drivers/usb/input/aiptek.c | 4 +- drivers/usb/input/appletouch.c | 412 +- drivers/usb/input/ati_remote.c | 179 +- drivers/usb/input/ati_remote2.c | 2 +- drivers/usb/input/fixp-arith.h | 15 +- drivers/usb/input/hid-core.c | 236 +- drivers/usb/input/hid-debug.h | 2 +- drivers/usb/input/hid-input.c | 39 +- drivers/usb/input/hid.h | 11 +- drivers/usb/input/hiddev.c | 73 +- drivers/usb/input/itmtouch.c | 5 +- drivers/usb/input/kbtab.c | 5 +- drivers/usb/input/keyspan_remote.c | 5 +- drivers/usb/input/mtouchusb.c | 5 +- drivers/usb/input/pid.c | 1 - drivers/usb/input/powermate.c | 4 +- drivers/usb/input/touchkitusb.c | 283 +- drivers/usb/input/usbkbd.c | 4 +- drivers/usb/input/usbmouse.c | 4 +- drivers/usb/input/usbtouchscreen.c | 5 +- drivers/usb/input/wacom.c | 5 +- drivers/usb/input/xpad.c | 5 +- drivers/usb/input/yealink.c | 17 +- drivers/usb/misc/Kconfig | 23 + drivers/usb/misc/Makefile | 2 + drivers/usb/misc/cytherm.c | 1 - drivers/usb/misc/idmouse.c | 198 +- drivers/usb/misc/ldusb.c | 1 - drivers/usb/misc/legousbtower.c | 1 - drivers/usb/misc/phidgetkit.c | 304 +- drivers/usb/misc/phidgetservo.c | 12 +- drivers/usb/misc/sisusbvga/sisusb.c | 513 +- drivers/usb/misc/sisusbvga/sisusb.h | 76 +- drivers/usb/misc/sisusbvga/sisusb_con.c | 152 +- drivers/usb/misc/sisusbvga/sisusb_init.c | 5 +- drivers/usb/misc/sisusbvga/sisusb_init.h | 20 +- drivers/usb/misc/sisusbvga/sisusb_struct.h | 2 +- drivers/usb/misc/usblcd.c | 6 +- drivers/usb/misc/usbled.c | 1 - drivers/usb/misc/usbtest.c | 44 +- drivers/usb/mon/mon_dma.c | 5 +- drivers/usb/mon/mon_main.c | 72 +- drivers/usb/mon/mon_stat.c | 6 +- drivers/usb/mon/mon_text.c | 155 +- drivers/usb/mon/usb_mon.h | 10 +- drivers/usb/net/Kconfig | 17 - drivers/usb/net/Makefile | 1 - drivers/usb/net/asix.c | 1020 +- drivers/usb/net/cdc_ether.c | 15 +- drivers/usb/net/cdc_subset.c | 1 - drivers/usb/net/gl620a.c | 1 - drivers/usb/net/net1080.c | 1 - drivers/usb/net/pegasus.c | 29 +- drivers/usb/net/pegasus.h | 3 + drivers/usb/net/plusb.c | 1 - drivers/usb/net/rndis_host.c | 3 +- drivers/usb/net/rtl8150.c | 88 +- drivers/usb/net/usbnet.c | 13 +- drivers/usb/net/usbnet.h | 1 + drivers/usb/net/zaurus.c | 20 +- drivers/usb/net/zd1201.c | 1906 - drivers/usb/net/zd1201.h | 147 - drivers/usb/serial/Kconfig | 41 +- drivers/usb/serial/Makefile | 2 +- drivers/usb/serial/airprime.c | 18 +- drivers/usb/serial/anydata.c | 123 - drivers/usb/serial/ark3116.c | 2 +- drivers/usb/serial/belkin_sa.c | 3 +- drivers/usb/serial/bus.c | 3 +- drivers/usb/serial/console.c | 60 +- drivers/usb/serial/cp2101.c | 37 +- drivers/usb/serial/cyberjack.c | 11 +- drivers/usb/serial/cypress_m8.c | 5 +- drivers/usb/serial/digi_acceleport.c | 3 +- drivers/usb/serial/empeg.c | 5 +- drivers/usb/serial/ezusb.c | 3 +- drivers/usb/serial/ftdi_sio.c | 40 +- drivers/usb/serial/ftdi_sio.h | 36 + drivers/usb/serial/funsoft.c | 2 +- drivers/usb/serial/garmin_gps.c | 39 +- drivers/usb/serial/generic.c | 14 +- drivers/usb/serial/hp4x.c | 15 +- drivers/usb/serial/io_edgeport.c | 51 +- drivers/usb/serial/io_ti.c | 3 +- drivers/usb/serial/ipaq.c | 31 +- drivers/usb/serial/ipw.c | 12 +- drivers/usb/serial/ir-usb.c | 14 +- drivers/usb/serial/keyspan.c | 5 +- drivers/usb/serial/keyspan_pda.c | 10 +- drivers/usb/serial/kl5kusb105.c | 6 +- drivers/usb/serial/kobil_sct.c | 3 +- drivers/usb/serial/mct_u232.c | 3 +- drivers/usb/serial/navman.c | 2 +- drivers/usb/serial/omninet.c | 11 +- drivers/usb/serial/option.c | 513 +- drivers/usb/serial/pl2303.c | 11 +- drivers/usb/serial/pl2303.h | 11 +- drivers/usb/serial/safe_serial.c | 9 +- drivers/usb/serial/ti_usb_3410_5052.c | 53 +- drivers/usb/serial/usb-serial.c | 87 +- drivers/usb/serial/usb-serial.h | 298 - drivers/usb/serial/visor.c | 42 +- drivers/usb/serial/whiteheat.c | 26 +- drivers/usb/storage/debug.h | 1 - drivers/usb/storage/dpcm.c | 1 - drivers/usb/storage/freecom.c | 1 - drivers/usb/storage/initializers.h | 1 - drivers/usb/storage/libusual.c | 63 +- drivers/usb/storage/onetouch.c | 4 +- drivers/usb/storage/scsiglue.c | 16 +- drivers/usb/storage/shuttle_usbat.c | 105 +- drivers/usb/storage/shuttle_usbat.h | 4 +- drivers/usb/storage/transport.c | 89 +- drivers/usb/storage/unusual_devs.h | 157 +- drivers/usb/storage/usb.c | 76 +- drivers/usb/storage/usb.h | 8 +- drivers/usb/usb-skeleton.c | 1 - drivers/video/68328fb.c | 1 - drivers/video/Kconfig | 205 +- drivers/video/Makefile | 13 +- drivers/video/S3triofb.c | 2 - drivers/video/acornfb.c | 1 - drivers/video/amifb.c | 2 - drivers/video/arcfb.c | 3 +- drivers/video/asiliantfb.c | 40 +- drivers/video/atafb.c | 1 - drivers/video/aty/Makefile | 1 + drivers/video/aty/aty128fb.c | 377 +- drivers/video/aty/atyfb.h | 2 +- drivers/video/aty/atyfb_base.c | 241 +- drivers/video/aty/mach64_accel.c | 10 - drivers/video/aty/mach64_cursor.c | 33 +- drivers/video/aty/radeon_base.c | 165 +- drivers/video/aty/radeon_i2c.c | 1 - drivers/video/aty/radeon_pm.c | 167 +- drivers/video/aty/radeon_pm_whitelist.h | 78 - drivers/video/aty/radeonfb.h | 18 +- drivers/video/au1100fb.c | 1012 +- drivers/video/au1200fb.c | 2 +- drivers/video/backlight/Kconfig | 20 +- drivers/video/backlight/Makefile | 2 + drivers/video/backlight/hp680_bl.c | 2 +- drivers/video/backlight/locomolcd.c | 124 +- drivers/video/bw2.c | 213 +- drivers/video/cfbcopyarea.c | 1 - drivers/video/cfbfillrect.c | 1 - drivers/video/cfbimgblt.c | 2 +- drivers/video/cg14.c | 326 +- drivers/video/cg3.c | 217 +- drivers/video/cg6.c | 337 +- drivers/video/chipsfb.c | 31 +- drivers/video/cirrusfb.c | 4 - drivers/video/console/bitblit.c | 1 - drivers/video/console/dummycon.c | 3 +- drivers/video/console/fbcon.c | 366 +- drivers/video/console/fbcon.h | 4 +- drivers/video/console/fbcon_ccw.c | 1 - drivers/video/console/fbcon_cw.c | 1 - drivers/video/console/fbcon_rotate.c | 1 - drivers/video/console/fbcon_ud.c | 1 - drivers/video/console/font_acorn_8x8.c | 1 - drivers/video/console/fonts.c | 1 - drivers/video/console/mdacon.c | 9 +- drivers/video/console/newport_con.c | 39 +- drivers/video/console/promcon.c | 6 +- drivers/video/console/softcursor.c | 31 +- drivers/video/console/sticon.c | 3 +- drivers/video/console/sticore.c | 1 - drivers/video/console/tileblit.c | 1 - drivers/video/console/vgacon.c | 62 +- drivers/video/controlfb.c | 2 - drivers/video/cyber2000fb.c | 2 - drivers/video/cyber2000fb.h | 1 - drivers/video/cyberfb.c | 1 - drivers/video/cyblafb.c | 1 - drivers/video/dnfb.c | 1 - drivers/video/epson1355fb.c | 30 +- drivers/video/fbcmap.c | 1 - drivers/video/fbcvt.c | 1 - drivers/video/fbmem.c | 119 +- drivers/video/fbmon.c | 34 +- drivers/video/fbsysfs.c | 152 +- drivers/video/ffb.c | 466 +- drivers/video/g364fb.c | 1 - drivers/video/gbefb.c | 77 +- drivers/video/geode/gx1fb_core.c | 178 +- drivers/video/geode/gxfb_core.c | 4 - drivers/video/hgafb.c | 1 - drivers/video/hitfb.c | 2 - drivers/video/hpfb.c | 1 - drivers/video/i810/i810-i2c.c | 1 - drivers/video/i810/i810_main.c | 5 - drivers/video/igafb.c | 4 - drivers/video/imsttfb.c | 2 - drivers/video/imxfb.c | 74 +- drivers/video/intelfb/intelfb.h | 18 +- drivers/video/intelfb/intelfbdrv.c | 106 +- drivers/video/intelfb/intelfbhw.c | 520 +- drivers/video/intelfb/intelfbhw.h | 25 +- drivers/video/kyro/fbdev.c | 2 - drivers/video/leo.c | 294 +- drivers/video/logo/logo.c | 1 - drivers/video/macfb.c | 1 - drivers/video/macmodes.c | 7 +- drivers/video/macmodes.h | 7 +- drivers/video/matrox/g450_pll.c | 8 + drivers/video/matrox/matroxfb_DAC1064.c | 1 - drivers/video/matrox/matroxfb_DAC1064.h | 1 - drivers/video/matrox/matroxfb_Ti3026.c | 1 - drivers/video/matrox/matroxfb_Ti3026.h | 1 - drivers/video/matrox/matroxfb_base.c | 55 +- drivers/video/matrox/matroxfb_base.h | 2 - drivers/video/matrox/matroxfb_misc.c | 1 - drivers/video/maxinefb.c | 1 - drivers/video/modedb.c | 12 +- drivers/video/neofb.c | 34 +- drivers/video/nvidia/Makefile | 3 +- drivers/video/nvidia/nv_hw.c | 90 +- drivers/video/nvidia/nv_i2c.c | 38 +- drivers/video/nvidia/nv_of.c | 66 +- drivers/video/nvidia/nv_proto.h | 34 +- drivers/video/nvidia/nvidia.c | 768 +- drivers/video/offb.c | 434 +- drivers/video/p9100.c | 251 +- drivers/video/platinumfb.c | 2 - drivers/video/pm2fb.c | 2 - drivers/video/pm3fb.c | 2 - drivers/video/pmag-aa-fb.c | 6 +- drivers/video/pvr2fb.c | 2 - drivers/video/pxafb.c | 227 +- drivers/video/q40fb.c | 1 - drivers/video/retz3fb.c | 1 - drivers/video/riva/fbdev.c | 253 +- drivers/video/riva/rivafb-i2c.c | 12 +- drivers/video/riva/rivafb.h | 1 - drivers/video/s1d13xxxfb.c | 69 +- drivers/video/s3c2410fb.c | 20 +- drivers/video/sa1100fb.c | 3 +- drivers/video/savage/savagefb-i2c.c | 1 - drivers/video/savage/savagefb.h | 45 +- drivers/video/savage/savagefb_driver.c | 1818 +- drivers/video/sgivwfb.c | 7 +- drivers/video/sis/init.h | 1 - drivers/video/sis/init301.c | 4 +- drivers/video/sis/init301.h | 1 - drivers/video/sis/initextlfb.c | 1 - drivers/video/sis/osdef.h | 1 - drivers/video/sis/sis.h | 1 - drivers/video/sis/sis_accel.c | 1 - drivers/video/sis/sis_main.c | 9 +- drivers/video/skeletonfb.c | 6 - drivers/video/sstfb.c | 1 - drivers/video/stifb.c | 1 - drivers/video/sun3fb.c | 2 - drivers/video/tcx.c | 224 +- drivers/video/tdfxfb.c | 2 - drivers/video/tgafb.c | 2 - drivers/video/tridentfb.c | 7 +- drivers/video/tx3912fb.c | 1 - drivers/video/valkyriefb.c | 2 - drivers/video/vesafb.c | 61 +- drivers/video/vfb.c | 30 +- drivers/video/vga16fb.c | 44 +- drivers/video/vgastate.c | 1 - drivers/video/virgefb.c | 1 - drivers/w1/Kconfig | 61 +- drivers/w1/Makefile | 13 +- drivers/w1/masters/Kconfig | 27 +- drivers/w1/masters/Makefile | 7 +- drivers/w1/masters/ds2482.c | 26 +- drivers/w1/masters/ds_w1_bridge.c | 174 - drivers/w1/masters/dscore.c | 795 - drivers/w1/masters/dscore.h | 166 - drivers/w1/slaves/Kconfig | 2 +- drivers/w1/slaves/w1_ds2433.c | 21 +- drivers/w1/slaves/w1_smem.c | 1 - drivers/w1/slaves/w1_therm.c | 13 +- drivers/w1/w1.c | 946 +- drivers/w1/w1.h | 161 +- drivers/w1/w1_family.c | 38 +- drivers/w1/w1_family.h | 28 +- drivers/w1/w1_int.c | 102 +- drivers/w1/w1_io.c | 166 +- drivers/w1/w1_io.h | 39 - drivers/w1/w1_netlink.c | 221 +- drivers/w1/w1_netlink.h | 35 +- drivers/xen/Makefile | 2 + drivers/xen/balloon/balloon.c | 144 +- drivers/xen/blkback/blkback.c | 61 +- drivers/xen/blkback/common.h | 9 +- drivers/xen/blkfront/blkfront.c | 13 +- drivers/xen/blkfront/block.h | 2 - drivers/xen/blkfront/vbd.c | 2 +- drivers/xen/blktap/Makefile | 5 +- drivers/xen/blktap/blktap.c | 1450 - drivers/xen/console/console.c | 115 +- drivers/xen/evtchn/evtchn.c | 4 +- drivers/xen/netback/common.h | 11 +- drivers/xen/netback/interface.c | 29 +- drivers/xen/netback/netback.c | 411 +- drivers/xen/netfront/netfront.c | 653 +- drivers/xen/privcmd/privcmd.c | 191 +- drivers/zorro/names.c | 1 - fs/9p/conv.c | 7 +- fs/9p/error.c | 1 - fs/9p/fcall.c | 1 - fs/9p/fcprint.c | 1 - fs/9p/fid.c | 1 - fs/9p/mux.c | 5 +- fs/9p/trans_fd.c | 1 - fs/9p/v9fs.c | 1 - fs/9p/v9fs_vfs.h | 2 +- fs/9p/vfs_addr.c | 3 +- fs/9p/vfs_file.c | 1 - fs/9p/vfs_inode.c | 24 +- fs/9p/vfs_super.c | 29 +- fs/Kconfig | 197 +- fs/Makefile | 4 +- fs/adfs/dir.c | 1 - fs/adfs/inode.c | 3 +- fs/adfs/super.c | 17 +- fs/affs/affs.h | 12 +- fs/affs/file.c | 4 +- fs/affs/super.c | 24 +- fs/affs/symlink.c | 2 +- fs/afs/cache.h | 27 - fs/afs/cell.c | 112 +- fs/afs/cell.h | 16 +- fs/afs/cmservice.c | 2 +- fs/afs/dir.c | 23 +- fs/afs/file.c | 248 +- fs/afs/fsclient.c | 4 +- fs/afs/inode.c | 46 +- fs/afs/internal.h | 27 +- fs/afs/kafsasyncd.c | 9 +- fs/afs/main.c | 24 +- fs/afs/mntpt.c | 25 +- fs/afs/proc.c | 1 + fs/afs/server.c | 9 +- fs/afs/super.c | 26 +- fs/afs/super.h | 2 + fs/afs/vlocation.c | 185 +- fs/afs/vnode.c | 251 +- fs/afs/vnode.h | 10 +- fs/afs/volume.c | 78 +- fs/afs/volume.h | 28 +- fs/aio.c | 6 +- fs/autofs/init.c | 6 +- fs/autofs/inode.c | 3 +- fs/autofs/symlink.c | 2 +- fs/autofs4/autofs_i.h | 3 +- fs/autofs4/expire.c | 3 +- fs/autofs4/init.c | 8 +- fs/autofs4/inode.c | 23 +- fs/autofs4/root.c | 38 +- fs/autofs4/waitq.c | 1 - fs/befs/linuxvfs.c | 53 +- fs/bfs/bfs.h | 2 +- fs/bfs/dir.c | 2 +- fs/bfs/file.c | 2 +- fs/bfs/inode.c | 10 +- fs/binfmt_aout.c | 6 - fs/binfmt_elf.c | 378 +- fs/binfmt_elf_fdpic.c | 1005 +- fs/binfmt_flat.c | 6 +- fs/binfmt_misc.c | 19 +- fs/binfmt_som.c | 3 - fs/block_dev.c | 52 +- fs/buffer.c | 19 +- fs/char_dev.c | 24 +- fs/cifs/CHANGES | 27 +- fs/cifs/Makefile | 2 +- fs/cifs/README | 41 +- fs/cifs/asn1.c | 11 +- fs/cifs/cifs_debug.c | 134 +- fs/cifs/cifs_debug.h | 4 + fs/cifs/cifs_unicode.c | 1 + fs/cifs/cifsencrypt.c | 141 +- fs/cifs/cifsfs.c | 32 +- fs/cifs/cifsfs.h | 7 +- fs/cifs/cifsglob.h | 87 +- fs/cifs/cifspdu.h | 98 +- fs/cifs/cifsproto.h | 18 +- fs/cifs/cifssmb.c | 313 +- fs/cifs/connect.c | 530 +- fs/cifs/dir.c | 19 +- fs/cifs/fcntl.c | 4 +- fs/cifs/file.c | 179 +- fs/cifs/inode.c | 39 +- fs/cifs/link.c | 7 +- fs/cifs/misc.c | 10 +- fs/cifs/netmisc.c | 5 +- fs/cifs/ntlmssp.c | 143 - fs/cifs/readdir.c | 203 +- fs/cifs/smbencrypt.c | 1 + fs/cifs/smberr.h | 1 + fs/cifs/transport.c | 621 +- fs/cifs/xattr.c | 6 +- fs/coda/coda_linux.c | 2 - fs/coda/file.c | 6 +- fs/coda/inode.c | 12 +- fs/coda/psdev.c | 25 +- fs/coda/symlink.c | 2 +- fs/coda/sysctl.c | 1 - fs/coda/upcall.c | 6 +- fs/compat.c | 42 +- fs/compat_ioctl.c | 36 +- fs/configfs/dir.c | 12 +- fs/configfs/inode.c | 3 +- fs/configfs/mount.c | 8 +- fs/configfs/symlink.c | 2 +- fs/cramfs/inode.c | 20 +- fs/dcache.c | 417 +- fs/dcookies.c | 1 - fs/debugfs/file.c | 128 +- fs/debugfs/inode.c | 41 +- fs/devfs/Makefile | 8 - fs/devfs/base.c | 2836 -- fs/devfs/util.c | 97 - fs/devpts/inode.c | 12 +- fs/direct-io.c | 24 +- fs/dquot.c | 4 +- fs/efs/inode.c | 2 +- fs/efs/super.c | 12 +- fs/efs/symlink.c | 5 +- fs/eventpoll.c | 45 +- fs/exec.c | 176 +- fs/exportfs/expfs.c | 2 +- fs/ext2/Makefile | 2 +- fs/ext2/balloc.c | 26 +- fs/ext2/bitmap.c | 32 - fs/ext2/dir.c | 12 +- fs/ext2/ext2.h | 6 +- fs/ext2/fsync.c | 2 +- fs/ext2/ialloc.c | 4 - fs/ext2/inode.c | 9 +- fs/ext2/super.c | 50 +- fs/ext2/xattr.h | 1 - fs/ext3/acl.h | 3 - fs/ext3/balloc.c | 263 +- fs/ext3/dir.c | 5 +- fs/ext3/ialloc.c | 15 +- fs/ext3/inode.c | 91 +- fs/ext3/ioctl.c | 2 +- fs/ext3/namei.c | 17 +- fs/ext3/resize.c | 99 +- fs/ext3/super.c | 262 +- fs/ext3/xattr.c | 29 +- fs/ext3/xattr.h | 1 - fs/fat/dir.c | 2 +- fs/fat/inode.c | 13 +- fs/fat/misc.c | 1 - fs/fcntl.c | 2 + fs/file.c | 10 +- fs/file_table.c | 6 +- fs/freevxfs/vxfs.h | 6 +- fs/freevxfs/vxfs_fshead.c | 12 +- fs/freevxfs/vxfs_immed.c | 2 +- fs/freevxfs/vxfs_inode.c | 11 +- fs/freevxfs/vxfs_lookup.c | 2 + fs/freevxfs/vxfs_subr.c | 7 +- fs/freevxfs/vxfs_super.c | 20 +- fs/fs-writeback.c | 10 +- fs/fuse/Makefile | 2 +- fs/fuse/dev.c | 418 +- fs/fuse/dir.c | 133 +- fs/fuse/file.c | 232 +- fs/fuse/fuse_i.h | 137 +- fs/fuse/inode.c | 202 +- fs/hfs/bnode.c | 2 +- fs/hfs/btree.c | 2 +- fs/hfs/hfs_fs.h | 4 +- fs/hfs/inode.c | 6 +- fs/hfs/super.c | 12 +- fs/hfsplus/bitmap.c | 15 +- fs/hfsplus/bnode.c | 2 +- fs/hfsplus/btree.c | 2 +- fs/hfsplus/hfsplus_fs.h | 4 +- fs/hfsplus/inode.c | 6 +- fs/hfsplus/super.c | 13 +- fs/hostfs/hostfs_kern.c | 19 +- fs/hpfs/file.c | 2 +- fs/hpfs/hpfs_fn.h | 4 +- fs/hpfs/inode.c | 1 - fs/hpfs/namei.c | 2 +- fs/hpfs/super.c | 10 +- fs/hppfs/hppfs_kern.c | 11 +- fs/hugetlbfs/inode.c | 40 +- fs/inode.c | 18 +- fs/inotify.c | 991 +- fs/ioctl.c | 1 - fs/ioprio.c | 66 +- fs/isofs/compress.c | 3 +- fs/isofs/dir.c | 1 - fs/isofs/inode.c | 19 +- fs/isofs/isofs.h | 18 +- fs/isofs/namei.c | 1 - fs/isofs/rock.c | 2 +- fs/isofs/zisofs.h | 2 +- fs/jbd/checkpoint.c | 419 +- fs/jbd/commit.c | 209 +- fs/jbd/journal.c | 95 +- fs/jbd/recovery.c | 1 + fs/jbd/transaction.c | 35 +- fs/jffs/inode-v23.c | 51 +- fs/jffs/intrep.c | 16 +- fs/jffs/jffs_fm.h | 1 - fs/jffs2/Makefile | 3 + fs/jffs2/README.Locking | 21 + fs/jffs2/build.c | 2 + fs/jffs2/compr.c | 2 +- fs/jffs2/compr.h | 16 +- fs/jffs2/compr_zlib.c | 1 - fs/jffs2/debug.c | 14 +- fs/jffs2/debug.h | 7 +- fs/jffs2/dir.c | 121 +- fs/jffs2/erase.c | 88 +- fs/jffs2/file.c | 37 +- fs/jffs2/fs.c | 70 +- fs/jffs2/gc.c | 131 +- fs/jffs2/histo.h | 3 - fs/jffs2/malloc.c | 129 +- fs/jffs2/nodelist.c | 192 +- fs/jffs2/nodelist.h | 194 +- fs/jffs2/nodemgmt.c | 210 +- fs/jffs2/os-linux.h | 27 +- fs/jffs2/readinode.c | 139 +- fs/jffs2/scan.c | 453 +- fs/jffs2/summary.c | 480 +- fs/jffs2/summary.h | 64 +- fs/jffs2/super.c | 70 +- fs/jffs2/symlink.c | 7 +- fs/jffs2/wbuf.c | 971 +- fs/jffs2/write.c | 147 +- fs/jfs/inode.c | 18 +- fs/jfs/jfs_extent.c | 10 +- fs/jfs/jfs_imap.c | 5 +- fs/jfs/jfs_inode.c | 1 - fs/jfs/jfs_inode.h | 3 +- fs/jfs/jfs_metapage.c | 9 +- fs/jfs/jfs_metapage.h | 2 +- fs/jfs/jfs_txnmgr.c | 4 +- fs/jfs/namei.c | 33 +- fs/jfs/super.c | 130 +- fs/libfs.c | 34 +- fs/lockd/clntlock.c | 39 +- fs/lockd/clntproc.c | 41 +- fs/lockd/host.c | 9 +- fs/lockd/svc.c | 1 - fs/lockd/svclock.c | 13 +- fs/lockd/svcproc.c | 1 - fs/lockd/svcsubs.c | 16 +- fs/lockd/xdr.c | 1 - fs/locks.c | 154 +- fs/minix/bitmap.c | 2 +- fs/minix/dir.c | 3 +- fs/minix/inode.c | 36 +- fs/mpage.c | 22 +- fs/msdos/namei.c | 9 +- fs/namei.c | 99 +- fs/namespace.c | 144 +- fs/ncpfs/dir.c | 1 - fs/ncpfs/inode.c | 15 +- fs/ncpfs/ioctl.c | 1 - fs/ncpfs/mmap.c | 2 +- fs/ncpfs/ncplib_kernel.c | 1 - fs/ncpfs/ncplib_kernel.h | 1 - fs/ncpfs/ncpsign_kernel.c | 1 - fs/ncpfs/sock.c | 1 - fs/ncpfs/symlink.c | 3 +- fs/nfs/Makefile | 9 +- fs/nfs/callback.c | 34 +- fs/nfs/callback.h | 7 +- fs/nfs/callback_proc.c | 14 +- fs/nfs/callback_xdr.c | 3 +- fs/nfs/delegation.c | 36 +- fs/nfs/delegation.h | 10 +- fs/nfs/dir.c | 52 +- fs/nfs/direct.c | 432 +- fs/nfs/file.c | 78 +- fs/nfs/idmap.c | 44 +- fs/nfs/inode.c | 1359 +- fs/nfs/nfs2xdr.c | 6 +- fs/nfs/nfs3acl.c | 11 +- fs/nfs/nfs3proc.c | 15 +- fs/nfs/nfs3xdr.c | 6 +- fs/nfs/nfs4_fs.h | 82 +- fs/nfs/nfs4proc.c | 387 +- fs/nfs/nfs4renewd.c | 20 +- fs/nfs/nfs4state.c | 175 +- fs/nfs/nfs4xdr.c | 281 +- fs/nfs/nfsroot.c | 1 - fs/nfs/pagelist.c | 54 +- fs/nfs/proc.c | 11 +- fs/nfs/read.c | 188 +- fs/nfs/symlink.c | 13 +- fs/nfs/sysctl.c | 54 +- fs/nfs/write.c | 117 +- fs/nfsctl.c | 1 - fs/nfsd/export.c | 2 +- fs/nfsd/nfs4callback.c | 41 +- fs/nfsd/nfs4idmap.c | 1 - fs/nfsd/nfs4proc.c | 8 + fs/nfsd/nfs4recover.c | 2 +- fs/nfsd/nfs4state.c | 37 +- fs/nfsd/nfs4xdr.c | 2 +- fs/nfsd/nfscache.c | 3 +- fs/nfsd/nfsctl.c | 7 +- fs/nfsd/nfsfh.c | 27 +- fs/nfsd/nfsproc.c | 2 +- fs/nfsd/nfssvc.c | 1 - fs/nfsd/stats.c | 10 + fs/nfsd/vfs.c | 25 +- fs/nls/nls_base.c | 1 - fs/ntfs/aops.c | 4 +- fs/ntfs/aops.h | 3 +- fs/ntfs/attrib.c | 6 +- fs/ntfs/file.c | 29 +- fs/ntfs/inode.c | 37 +- fs/ntfs/mft.c | 5 - fs/ntfs/ntfs.h | 4 +- fs/ntfs/super.c | 45 +- fs/ntfs/sysctl.h | 1 - fs/ocfs2/aops.c | 11 +- fs/ocfs2/cluster/heartbeat.c | 22 +- fs/ocfs2/cluster/masklog.h | 22 +- fs/ocfs2/cluster/ocfs2_heartbeat.h | 1 + fs/ocfs2/cluster/tcp.c | 16 +- fs/ocfs2/dir.c | 6 +- fs/ocfs2/dlm/dlmast.c | 15 +- fs/ocfs2/dlm/dlmcommon.h | 65 +- fs/ocfs2/dlm/dlmconvert.c | 33 +- fs/ocfs2/dlm/dlmdebug.c | 6 +- fs/ocfs2/dlm/dlmdebug.h | 30 - fs/ocfs2/dlm/dlmdomain.c | 112 +- fs/ocfs2/dlm/dlmfs.c | 14 +- fs/ocfs2/dlm/dlmlock.c | 73 +- fs/ocfs2/dlm/dlmmaster.c | 449 +- fs/ocfs2/dlm/dlmrecovery.c | 601 +- fs/ocfs2/dlm/dlmthread.c | 74 +- fs/ocfs2/dlm/dlmunlock.c | 56 +- fs/ocfs2/dlm/userdlm.c | 2 +- fs/ocfs2/dlmglue.c | 7 +- fs/ocfs2/extent_map.c | 29 +- fs/ocfs2/inode.c | 4 - fs/ocfs2/inode.h | 2 +- fs/ocfs2/journal.c | 10 +- fs/ocfs2/localalloc.c | 8 + fs/ocfs2/mmap.c | 4 +- fs/ocfs2/ocfs2.h | 6 +- fs/ocfs2/slot_map.c | 2 +- fs/ocfs2/suballoc.c | 261 +- fs/ocfs2/suballoc.h | 2 + fs/ocfs2/super.c | 79 +- fs/ocfs2/symlink.c | 5 +- fs/ocfs2/vote.c | 8 +- fs/open.c | 34 +- fs/openpromfs/inode.c | 1160 +- fs/partitions/Kconfig | 2 +- fs/partitions/Makefile | 1 - fs/partitions/acorn.c | 1 - fs/partitions/check.c | 45 +- fs/partitions/devfs.c | 130 - fs/partitions/devfs.h | 10 - fs/partitions/efi.c | 1 - fs/partitions/efi.h | 1 - fs/partitions/ibm.c | 1 - fs/partitions/mac.c | 1 - fs/partitions/msdos.c | 1 - fs/partitions/sun.c | 2 +- fs/pipe.c | 10 +- fs/pnode.c | 9 +- fs/proc/array.c | 24 +- fs/proc/base.c | 1195 +- fs/proc/inode.c | 13 +- fs/proc/internal.h | 31 +- fs/proc/kcore.c | 5 +- fs/proc/proc_misc.c | 26 +- fs/proc/root.c | 7 +- fs/proc/task_mmu.c | 157 +- fs/proc/task_nommu.c | 23 +- fs/proc/vmcore.c | 1 - fs/qnx4/bitmap.c | 1 - fs/qnx4/dir.c | 1 - fs/qnx4/fsync.c | 1 - fs/qnx4/inode.c | 17 +- fs/qnx4/namei.c | 1 - fs/qnx4/truncate.c | 1 - fs/ramfs/file-mmu.c | 2 +- fs/ramfs/file-nommu.c | 6 +- fs/ramfs/inode.c | 14 +- fs/ramfs/internal.h | 2 +- fs/read_write.c | 2 +- fs/readdir.c | 18 +- fs/reiserfs/bitmap.c | 1 - fs/reiserfs/dir.c | 1 - fs/reiserfs/do_balan.c | 1 - fs/reiserfs/file.c | 16 +- fs/reiserfs/fix_node.c | 1 - fs/reiserfs/ibalance.c | 1 - fs/reiserfs/inode.c | 48 +- fs/reiserfs/ioctl.c | 2 +- fs/reiserfs/journal.c | 7 +- fs/reiserfs/lbalance.c | 1 - fs/reiserfs/namei.c | 1 - fs/reiserfs/objectid.c | 1 - fs/reiserfs/prints.c | 1 - fs/reiserfs/procfs.c | 26 +- fs/reiserfs/stree.c | 1 - fs/reiserfs/super.c | 49 +- fs/reiserfs/tail_conversion.c | 1 - fs/reiserfs/xattr.c | 11 +- fs/romfs/inode.c | 13 +- fs/select.c | 94 +- fs/smbfs/file.c | 2 +- fs/smbfs/inode.c | 15 +- fs/smbfs/proc.c | 5 +- fs/smbfs/proto.h | 4 +- fs/smbfs/request.c | 6 +- fs/smbfs/smbiod.c | 30 +- fs/splice.c | 60 +- fs/squashfs/Makefile | 4 +- fs/squashfs/inode.c | 2365 +- fs/stat.c | 10 +- fs/super.c | 151 +- fs/sync.c | 2 +- fs/sysfs/dir.c | 10 +- fs/sysfs/file.c | 5 - fs/sysfs/inode.c | 15 +- fs/sysfs/mount.c | 6 +- fs/sysv/dir.c | 3 +- fs/sysv/ialloc.c | 2 +- fs/sysv/inode.c | 5 +- fs/sysv/itree.c | 2 +- fs/sysv/super.c | 13 +- fs/sysv/sysv.h | 2 +- fs/udf/file.c | 2 +- fs/udf/ialloc.c | 12 +- fs/udf/inode.c | 4 +- fs/udf/super.c | 20 +- fs/udf/symlink.c | 2 +- fs/udf/udfdecl.h | 7 +- fs/ufs/balloc.c | 406 +- fs/ufs/cylinder.c | 49 +- fs/ufs/dir.c | 1000 +- fs/ufs/file.c | 25 +- fs/ufs/ialloc.c | 64 +- fs/ufs/inode.c | 399 +- fs/ufs/namei.c | 87 +- fs/ufs/super.c | 439 +- fs/ufs/truncate.c | 221 +- fs/ufs/util.c | 103 +- fs/ufs/util.h | 115 +- fs/vfat/namei.c | 9 +- fs/xattr.c | 4 +- fs/xfs/Kconfig | 48 +- fs/xfs/Makefile-linux-2.6 | 4 +- fs/xfs/linux-2.6/kmem.h | 161 +- fs/xfs/linux-2.6/mrlock.h | 40 +- fs/xfs/linux-2.6/sema.h | 55 +- fs/xfs/linux-2.6/xfs_aops.c | 1779 +- fs/xfs/linux-2.6/xfs_aops.h | 10 +- fs/xfs/linux-2.6/xfs_buf.c | 1626 +- fs/xfs/linux-2.6/xfs_buf.h | 755 +- fs/xfs/linux-2.6/xfs_export.c | 93 +- fs/xfs/linux-2.6/xfs_file.c | 467 +- fs/xfs/linux-2.6/xfs_fs_subr.c | 104 +- fs/xfs/linux-2.6/xfs_globals.c | 43 +- fs/xfs/linux-2.6/xfs_ioctl.c | 65 +- fs/xfs/linux-2.6/xfs_ioctl32.c | 5 +- fs/xfs/linux-2.6/xfs_iops.c | 162 +- fs/xfs/linux-2.6/xfs_linux.h | 35 +- fs/xfs/linux-2.6/xfs_lrw.c | 150 +- fs/xfs/linux-2.6/xfs_lrw.h | 67 +- fs/xfs/linux-2.6/xfs_stats.c | 48 +- fs/xfs/linux-2.6/xfs_super.c | 208 +- fs/xfs/linux-2.6/xfs_super.h | 46 +- fs/xfs/linux-2.6/xfs_sysctl.c | 7 +- fs/xfs/linux-2.6/xfs_sysctl.h | 39 +- fs/xfs/linux-2.6/xfs_vfs.c | 95 +- fs/xfs/linux-2.6/xfs_vfs.h | 198 +- fs/xfs/linux-2.6/xfs_vnode.c | 53 +- fs/xfs/linux-2.6/xfs_vnode.h | 376 +- fs/xfs/quota/xfs_dquot.c | 8 +- fs/xfs/quota/xfs_dquot.h | 4 +- fs/xfs/quota/xfs_dquot_item.c | 6 +- fs/xfs/quota/xfs_qm.c | 8 +- fs/xfs/quota/xfs_qm_bhv.c | 88 +- fs/xfs/quota/xfs_qm_stats.c | 2 - fs/xfs/quota/xfs_qm_syscalls.c | 6 +- fs/xfs/quota/xfs_trans_dquot.c | 2 - fs/xfs/support/debug.c | 4 +- fs/xfs/support/debug.h | 3 - fs/xfs/xfs_acl.c | 71 +- fs/xfs/xfs_acl.h | 16 +- fs/xfs/xfs_alloc.c | 120 +- fs/xfs/xfs_alloc.h | 22 + fs/xfs/xfs_alloc_btree.c | 2 - fs/xfs/xfs_attr.c | 66 +- fs/xfs/xfs_attr.h | 14 +- fs/xfs/xfs_attr_leaf.c | 4 +- fs/xfs/xfs_behavior.h | 3 - fs/xfs/xfs_bmap.c | 388 +- fs/xfs/xfs_bmap.h | 22 +- fs/xfs/xfs_bmap_btree.c | 12 +- fs/xfs/xfs_btree.c | 2 - fs/xfs/xfs_buf_item.c | 9 +- fs/xfs/xfs_cap.h | 10 +- fs/xfs/xfs_da_btree.c | 194 +- fs/xfs/xfs_da_btree.h | 4 - fs/xfs/xfs_dfrag.c | 84 +- fs/xfs/xfs_dfrag.h | 3 + fs/xfs/xfs_dinode.h | 10 +- fs/xfs/xfs_dir.c | 1217 - fs/xfs/xfs_dir.h | 142 - fs/xfs/xfs_dir2.c | 396 +- fs/xfs/xfs_dir2.h | 32 +- fs/xfs/xfs_dir2_block.c | 31 +- fs/xfs/xfs_dir2_data.c | 5 +- fs/xfs/xfs_dir2_data.h | 8 +- fs/xfs/xfs_dir2_leaf.c | 14 +- fs/xfs/xfs_dir2_node.c | 14 +- fs/xfs/xfs_dir2_sf.c | 13 +- fs/xfs/xfs_dir2_trace.c | 2 - fs/xfs/xfs_dir_leaf.c | 2213 -- fs/xfs/xfs_dir_leaf.h | 231 - fs/xfs/xfs_dir_sf.h | 155 - fs/xfs/xfs_dmapi.h | 2 +- fs/xfs/xfs_dmops.c | 1 - fs/xfs/xfs_error.c | 2 - fs/xfs/xfs_extfree_item.c | 57 +- fs/xfs/xfs_extfree_item.h | 53 +- fs/xfs/xfs_fs.h | 7 +- fs/xfs/xfs_fsops.c | 36 +- fs/xfs/xfs_ialloc.c | 5 +- fs/xfs/xfs_ialloc_btree.c | 2 - fs/xfs/xfs_iget.c | 24 +- fs/xfs/xfs_inode.c | 111 +- fs/xfs/xfs_inode.h | 7 +- fs/xfs/xfs_inode_item.c | 57 +- fs/xfs/xfs_inode_item.h | 61 +- fs/xfs/xfs_iocore.c | 7 +- fs/xfs/xfs_iomap.c | 26 +- fs/xfs/xfs_itable.c | 20 +- fs/xfs/xfs_itable.h | 1 - fs/xfs/xfs_log.c | 37 +- fs/xfs/xfs_log_recover.c | 115 +- fs/xfs/xfs_mount.c | 67 +- fs/xfs/xfs_mount.h | 70 +- fs/xfs/xfs_qmops.c | 1 - fs/xfs/xfs_quota.h | 2 +- fs/xfs/xfs_rename.c | 68 +- fs/xfs/xfs_rtalloc.c | 18 +- fs/xfs/xfs_rw.c | 124 +- fs/xfs/xfs_rw.h | 10 +- fs/xfs/xfs_trans.c | 48 +- fs/xfs/xfs_trans.h | 11 +- fs/xfs/xfs_trans_ail.c | 6 +- fs/xfs/xfs_trans_buf.c | 12 +- fs/xfs/xfs_trans_extfree.c | 1 - fs/xfs/xfs_trans_inode.c | 2 - fs/xfs/xfs_trans_item.c | 2 +- fs/xfs/xfs_trans_space.h | 11 +- fs/xfs/xfs_utils.c | 13 +- fs/xfs/xfs_utils.h | 7 +- fs/xfs/xfs_vfsops.c | 127 +- fs/xfs/xfs_vnodeops.c | 306 +- include/acpi/acconfig.h | 18 +- include/acpi/acdisasm.h | 173 +- include/acpi/acdispat.h | 8 +- include/acpi/acevents.h | 4 +- include/acpi/acexcep.h | 6 +- include/acpi/acglobal.h | 47 +- include/acpi/acinterp.h | 15 +- include/acpi/aclocal.h | 294 +- include/acpi/acmacros.h | 89 +- include/acpi/acnamesp.h | 28 +- include/acpi/acobject.h | 192 +- include/acpi/acopcode.h | 2 +- include/acpi/acoutput.h | 10 +- include/acpi/acparser.h | 4 +- include/acpi/acpi_bus.h | 12 +- include/acpi/acpi_drivers.h | 17 + include/acpi/acpiosxf.h | 77 +- include/acpi/acpixf.h | 4 +- include/acpi/acresrc.h | 28 +- include/acpi/acstruct.h | 121 +- include/acpi/actables.h | 6 +- include/acpi/actbl.h | 400 +- include/acpi/actbl1.h | 639 +- include/acpi/actbl2.h | 230 +- include/acpi/actypes.h | 119 +- include/acpi/acutils.h | 95 +- include/acpi/amlcode.h | 6 +- include/acpi/amlresrc.h | 85 +- include/acpi/pdc_intel.h | 5 + include/acpi/platform/acenv.h | 47 +- include/acpi/platform/aclinux.h | 49 +- include/acpi/processor.h | 29 +- include/asm-alpha/barrier.h | 3 - include/asm-alpha/bitops.h | 1 - include/asm-alpha/cache.h | 1 - include/asm-alpha/cacheflush.h | 1 - include/asm-alpha/compiler.h | 3 + include/asm-alpha/core_cia.h | 1 - include/asm-alpha/core_t2.h | 3 +- include/asm-alpha/dma-mapping.h | 1 - include/asm-alpha/dma.h | 1 - include/asm-alpha/floppy.h | 6 +- include/asm-alpha/hardirq.h | 1 - include/asm-alpha/hw_irq.h | 3 - include/asm-alpha/ide.h | 1 - include/asm-alpha/io.h | 1 - include/asm-alpha/irq.h | 5 - include/asm-alpha/kmap_types.h | 1 - include/asm-alpha/machvec.h | 1 - include/asm-alpha/mmu_context.h | 1 - include/asm-alpha/mmzone.h | 1 - include/asm-alpha/page.h | 8 +- include/asm-alpha/param.h | 1 - include/asm-alpha/pgalloc.h | 1 - include/asm-alpha/pgtable.h | 1 - include/asm-alpha/rwsem.h | 14 +- include/asm-alpha/serial.h | 1 - include/asm-alpha/signal.h | 2 - include/asm-alpha/smp.h | 1 - include/asm-alpha/socket.h | 1 + include/asm-alpha/spinlock.h | 1 - include/asm-alpha/system.h | 1 - include/asm-alpha/tlbflush.h | 1 - include/asm-alpha/unistd.h | 7 +- include/asm-alpha/vga.h | 2 +- include/asm-arm/apm.h | 1 - include/asm-arm/arch-aaec2000/io.h | 1 - include/asm-arm/arch-aaec2000/memory.h | 1 - .../asm-arm/arch-at91rm9200/at91rm9200_sys.h | 11 +- include/asm-arm/arch-at91rm9200/board.h | 32 +- include/asm-arm/arch-at91rm9200/gpio.h | 5 + include/asm-arm/arch-at91rm9200/hardware.h | 9 +- include/asm-arm/arch-at91rm9200/io.h | 1 - include/asm-arm/arch-at91rm9200/irqs.h | 10 - include/asm-arm/arch-at91rm9200/memory.h | 4 +- include/asm-arm/arch-at91rm9200/pio.h | 115 - include/asm-arm/arch-at91rm9200/system.h | 10 +- include/asm-arm/arch-at91rm9200/timex.h | 2 +- include/asm-arm/arch-at91rm9200/uncompress.h | 2 +- include/asm-arm/arch-at91rm9200/vmalloc.h | 2 +- include/asm-arm/arch-cl7500/acornfb.h | 1 - include/asm-arm/arch-clps711x/hardware.h | 1 - include/asm-arm/arch-clps711x/io.h | 1 - include/asm-arm/arch-clps711x/memory.h | 1 - include/asm-arm/arch-clps711x/uncompress.h | 1 - include/asm-arm/arch-ebsa285/hardware.h | 1 - include/asm-arm/arch-ebsa285/io.h | 8 - include/asm-arm/arch-ebsa285/memory.h | 1 - include/asm-arm/arch-ebsa285/vmalloc.h | 1 - include/asm-arm/arch-ep93xx/ep93xx-regs.h | 2 + include/asm-arm/arch-ep93xx/platform.h | 1 + include/asm-arm/arch-h720x/memory.h | 2 - include/asm-arm/arch-imx/imx-dma.h | 8 +- include/asm-arm/arch-imx/memory.h | 6 +- include/asm-arm/arch-integrator/io.h | 1 - include/asm-arm/arch-integrator/smp.h | 1 - include/asm-arm/arch-iop3xx/io.h | 1 - include/asm-arm/arch-iop3xx/iop331-irqs.h | 4 - include/asm-arm/arch-iop3xx/memory.h | 1 - include/asm-arm/arch-iop3xx/timex.h | 1 - include/asm-arm/arch-iop3xx/uncompress.h | 1 - include/asm-arm/arch-ixp23xx/entry-macro.S | 2 +- include/asm-arm/arch-ixp23xx/ixp23xx.h | 16 +- include/asm-arm/arch-ixp23xx/platform.h | 25 + include/asm-arm/arch-ixp23xx/uncompress.h | 2 +- include/asm-arm/arch-ixp4xx/dma.h | 4 - include/asm-arm/arch-ixp4xx/io.h | 250 +- include/asm-arm/arch-l7200/io.h | 1 - include/asm-arm/arch-lh7a40x/constants.h | 9 +- include/asm-arm/arch-lh7a40x/dma.h | 79 +- include/asm-arm/arch-lh7a40x/entry-macro.S | 72 +- include/asm-arm/arch-lh7a40x/hardware.h | 4 + include/asm-arm/arch-lh7a40x/io.h | 1 - include/asm-arm/arch-lh7a40x/irqs.h | 8 +- include/asm-arm/arch-lh7a40x/registers.h | 65 +- include/asm-arm/arch-lh7a40x/uncompress.h | 2 +- include/asm-arm/arch-omap/board.h | 8 +- include/asm-arm/arch-omap/clock.h | 2 - include/asm-arm/arch-omap/dma.h | 15 +- include/asm-arm/arch-omap/dmtimer.h | 80 +- include/asm-arm/arch-omap/hardware.h | 5 +- include/asm-arm/arch-omap/io.h | 1 - include/asm-arm/arch-omap/irqs.h | 14 + include/asm-arm/arch-omap/mux.h | 26 + include/asm-arm/arch-omap/pm.h | 33 + include/asm-arm/arch-omap/system.h | 1 - include/asm-arm/arch-omap/uncompress.h | 1 - include/asm-arm/arch-pxa/idp.h | 1 - include/asm-arm/arch-pxa/io.h | 1 - include/asm-arm/arch-pxa/irqs.h | 1 - include/asm-arm/arch-pxa/poodle.h | 29 +- include/asm-arm/arch-pxa/pxa-regs.h | 21 +- include/asm-arm/arch-pxa/ssp.h | 4 +- include/asm-arm/arch-pxa/system.h | 1 + include/asm-arm/arch-pxa/timex.h | 1 - include/asm-arm/arch-realview/io.h | 1 - include/asm-arm/arch-realview/smp.h | 1 - include/asm-arm/arch-s3c2410/anubis-cpld.h | 3 - include/asm-arm/arch-s3c2410/anubis-irq.h | 4 +- include/asm-arm/arch-s3c2410/anubis-map.h | 2 - include/asm-arm/arch-s3c2410/audio.h | 4 - include/asm-arm/arch-s3c2410/bast-cpld.h | 5 - include/asm-arm/arch-s3c2410/bast-irq.h | 6 +- include/asm-arm/arch-s3c2410/bast-map.h | 4 - include/asm-arm/arch-s3c2410/bast-pmu.h | 3 - include/asm-arm/arch-s3c2410/debug-macro.S | 19 +- include/asm-arm/arch-s3c2410/dma.h | 152 +- include/asm-arm/arch-s3c2410/entry-macro.S | 145 +- include/asm-arm/arch-s3c2410/fb.h | 7 - include/asm-arm/arch-s3c2410/hardware.h | 10 - include/asm-arm/arch-s3c2410/idle.h | 4 - include/asm-arm/arch-s3c2410/iic.h | 4 - include/asm-arm/arch-s3c2410/io.h | 8 +- include/asm-arm/arch-s3c2410/irqs.h | 9 +- include/asm-arm/arch-s3c2410/map.h | 34 +- include/asm-arm/arch-s3c2410/memory.h | 14 +- include/asm-arm/arch-s3c2410/nand.h | 3 - include/asm-arm/arch-s3c2410/osiris-map.h | 2 - include/asm-arm/arch-s3c2410/regs-adc.h | 3 - include/asm-arm/arch-s3c2410/regs-clock.h | 83 +- include/asm-arm/arch-s3c2410/regs-dsc.h | 15 +- include/asm-arm/arch-s3c2410/regs-gpio.h | 83 +- include/asm-arm/arch-s3c2410/regs-gpioj.h | 9 +- include/asm-arm/arch-s3c2410/regs-iic.h | 4 - include/asm-arm/arch-s3c2410/regs-iis.h | 12 +- include/asm-arm/arch-s3c2410/regs-irq.h | 15 +- include/asm-arm/arch-s3c2410/regs-lcd.h | 8 - include/asm-arm/arch-s3c2410/regs-mem.h | 6 - include/asm-arm/arch-s3c2410/regs-nand.h | 52 +- include/asm-arm/arch-s3c2410/regs-rtc.h | 7 +- include/asm-arm/arch-s3c2410/regs-sdi.h | 5 - include/asm-arm/arch-s3c2410/regs-serial.h | 20 +- include/asm-arm/arch-s3c2410/regs-spi.h | 8 +- include/asm-arm/arch-s3c2410/regs-timer.h | 7 - include/asm-arm/arch-s3c2410/regs-udc.h | 8 +- include/asm-arm/arch-s3c2410/regs-watchdog.h | 7 +- include/asm-arm/arch-s3c2410/system.h | 9 +- include/asm-arm/arch-s3c2410/timex.h | 6 - include/asm-arm/arch-s3c2410/uncompress.h | 15 +- include/asm-arm/arch-s3c2410/usb-control.h | 5 - include/asm-arm/arch-s3c2410/vmalloc.h | 6 +- include/asm-arm/arch-s3c2410/vr1000-cpld.h | 4 - include/asm-arm/arch-s3c2410/vr1000-irq.h | 6 +- include/asm-arm/arch-s3c2410/vr1000-map.h | 6 - include/asm-arm/arch-sa1100/assabet.h | 1 - include/asm-arm/arch-sa1100/cerf.h | 1 - include/asm-arm/arch-sa1100/collie.h | 1 - include/asm-arm/arch-sa1100/dma.h | 1 - include/asm-arm/arch-sa1100/hardware.h | 1 - include/asm-arm/arch-sa1100/ide.h | 1 - include/asm-arm/arch-sa1100/io.h | 1 - include/asm-arm/arch-sa1100/irqs.h | 1 - include/asm-arm/arch-sa1100/memory.h | 1 - include/asm-arm/arch-sa1100/system.h | 1 - include/asm-arm/arch-versatile/io.h | 1 - include/asm-arm/arch-versatile/platform.h | 2 + include/asm-arm/arch-versatile/system.h | 16 +- include/asm-arm/assembler.h | 36 - include/asm-arm/atomic.h | 1 - include/asm-arm/bug.h | 2 - include/asm-arm/bugs.h | 4 + include/asm-arm/byteorder.h | 10 +- include/asm-arm/cacheflush.h | 19 +- include/asm-arm/cpu.h | 2 +- include/asm-arm/dma-mapping.h | 1 - include/asm-arm/dma.h | 1 - include/asm-arm/domain.h | 7 + include/asm-arm/elf.h | 17 +- include/asm-arm/floppy.h | 2 +- include/asm-arm/fpstate.h | 9 +- include/asm-arm/glue.h | 1 - include/asm-arm/hardirq.h | 1 - include/asm-arm/hardware/dec21285.h | 1 - include/asm-arm/hardware/iomd.h | 1 - include/asm-arm/hardware/locomo.h | 5 + include/asm-arm/hardware/sharpsl_pm.h | 11 + include/asm-arm/hardware/ssp.h | 4 +- include/asm-arm/io.h | 7 + include/asm-arm/irq.h | 26 +- include/asm-arm/leds.h | 1 - include/asm-arm/mach/irq.h | 135 +- include/asm-arm/mach/map.h | 9 +- include/asm-arm/mach/pci.h | 2 +- include/asm-arm/mach/serial_at91rm9200.h | 36 - include/asm-arm/mach/serial_sa1100.h | 1 - include/asm-arm/mach/time.h | 23 + include/asm-arm/memory.h | 81 +- include/asm-arm/mmu.h | 17 + include/asm-arm/mmu_context.h | 14 +- include/asm-arm/page.h | 17 +- include/asm-arm/pci.h | 1 - include/asm-arm/pgalloc.h | 8 +- include/asm-arm/pgtable-hwdef.h | 1 + include/asm-arm/pgtable.h | 10 +- include/asm-arm/proc-fns.h | 5 +- include/asm-arm/procinfo.h | 4 +- include/asm-arm/ptrace.h | 6 +- include/asm-arm/signal.h | 6 - include/asm-arm/smp.h | 1 - include/asm-arm/socket.h | 1 + include/asm-arm/spinlock.h | 16 +- include/asm-arm/system.h | 5 +- include/asm-arm/thread_info.h | 9 +- include/asm-arm/tlbflush.h | 1 - include/asm-arm/uaccess.h | 184 +- include/asm-arm/ucontext.h | 93 +- include/asm-arm/unistd.h | 10 +- include/asm-arm/vga.h | 2 +- include/asm-arm26/atomic.h | 1 - include/asm-arm26/bug.h | 1 - include/asm-arm26/dma.h | 1 - include/asm-arm26/floppy.h | 2 +- include/asm-arm26/hardirq.h | 1 - include/asm-arm26/hardware.h | 1 - include/asm-arm26/io.h | 1 - include/asm-arm26/irq.h | 4 - include/asm-arm26/leds.h | 1 - include/asm-arm26/mach-types.h | 1 - include/asm-arm26/page.h | 1 - include/asm-arm26/pgtable.h | 1 - include/asm-arm26/serial.h | 1 - include/asm-arm26/signal.h | 2 - include/asm-arm26/smp.h | 1 - include/asm-arm26/socket.h | 1 + include/asm-arm26/sysirq.h | 1 - include/asm-arm26/system.h | 2 - include/asm-arm26/unistd.h | 10 +- include/asm-cris/arch-v10/io.h | 1 - include/asm-cris/arch-v10/irq.h | 2 +- include/asm-cris/arch-v10/page.h | 1 - include/asm-cris/arch-v10/system.h | 1 - include/asm-cris/arch-v32/arbiter.h | 4 +- include/asm-cris/arch-v32/io.h | 1 - include/asm-cris/arch-v32/irq.h | 3 +- include/asm-cris/arch-v32/page.h | 1 - include/asm-cris/arch-v32/processor.h | 1 - include/asm-cris/arch-v32/system.h | 1 - include/asm-cris/byteorder.h | 3 +- include/asm-cris/elf.h | 8 +- include/asm-cris/eshlibld.h | 1 - include/asm-cris/etraxgpio.h | 1 - include/asm-cris/fasttimer.h | 1 - include/asm-cris/hw_irq.h | 2 - include/asm-cris/irq.h | 5 - include/asm-cris/page.h | 11 +- include/asm-cris/pci.h | 1 - include/asm-cris/pgtable.h | 1 - include/asm-cris/posix_types.h | 9 +- include/asm-cris/processor.h | 1 - include/asm-cris/rtc.h | 1 - include/asm-cris/signal.h | 2 - include/asm-cris/socket.h | 1 + include/asm-cris/system.h | 1 - include/asm-cris/tlbflush.h | 1 - include/asm-cris/unistd.h | 13 +- include/asm-frv/atomic.h | 115 +- include/asm-frv/bitops.h | 174 +- include/asm-frv/bug.h | 2 +- include/asm-frv/cache.h | 1 - include/asm-frv/checksum.h | 2 +- include/asm-frv/dma.h | 1 - include/asm-frv/elf.h | 7 +- include/asm-frv/fpu.h | 1 - include/asm-frv/gdb-stub.h | 22 + include/asm-frv/hardirq.h | 2 +- include/asm-frv/highmem.h | 3 +- include/asm-frv/ide.h | 9 +- include/asm-frv/io.h | 165 +- include/asm-frv/irq-routing.h | 2 +- include/asm-frv/irq.h | 1 - include/asm-frv/mb-regs.h | 31 +- include/asm-frv/mmu_context.h | 1 - include/asm-frv/page.h | 29 +- include/asm-frv/pci.h | 21 +- include/asm-frv/pgalloc.h | 1 - include/asm-frv/pgtable.h | 13 +- include/asm-frv/processor.h | 4 +- include/asm-frv/ptrace.h | 12 +- include/asm-frv/registers.h | 97 +- include/asm-frv/segment.h | 1 - include/asm-frv/serial.h | 1 - include/asm-frv/signal.h | 9 +- include/asm-frv/smp.h | 1 - include/asm-frv/socket.h | 3 + include/asm-frv/system.h | 92 +- include/asm-frv/thread_info.h | 32 +- include/asm-frv/tlbflush.h | 1 - include/asm-frv/types.h | 4 - include/asm-frv/uaccess.h | 65 +- include/asm-frv/unaligned.h | 1 - include/asm-frv/unistd.h | 57 +- include/asm-frv/virtconvert.h | 1 - include/asm-generic/bug.h | 35 +- include/asm-generic/cputime.h | 2 + include/asm-generic/dma-mapping.h | 1 - include/asm-generic/fcntl.h | 1 - include/asm-generic/local.h | 1 - include/asm-generic/memory_model.h | 27 +- include/asm-generic/mman.h | 6 - include/asm-generic/mutex-null.h | 15 +- include/asm-generic/percpu.h | 4 + include/asm-generic/rtc.h | 7 +- include/asm-generic/sections.h | 1 + include/asm-generic/signal.h | 7 + include/asm-generic/tlb.h | 1 - include/asm-generic/vmlinux.lds.h | 31 + include/asm-h8300/bitops.h | 1 - include/asm-h8300/dma.h | 1 - include/asm-h8300/elf.h | 1 - include/asm-h8300/hardirq.h | 1 - include/asm-h8300/io.h | 1 - include/asm-h8300/irq.h | 4 - include/asm-h8300/keyboard.h | 1 - include/asm-h8300/mmu_context.h | 1 - include/asm-h8300/page.h | 11 +- include/asm-h8300/page_offset.h | 1 - include/asm-h8300/param.h | 1 - include/asm-h8300/pgtable.h | 1 - include/asm-h8300/processor.h | 4 +- include/asm-h8300/semaphore-helper.h | 1 - include/asm-h8300/shm.h | 1 - include/asm-h8300/signal.h | 2 - include/asm-h8300/socket.h | 1 + include/asm-h8300/system.h | 2 - include/asm-h8300/unaligned.h | 1 - include/asm-h8300/unistd.h | 7 +- include/asm-h8300/virtconvert.h | 1 - include/asm-i386/alternative.h | 30 +- include/asm-i386/apic.h | 15 +- include/asm-i386/apicdef.h | 1 - include/asm-i386/atomic.h | 31 +- include/asm-i386/bitops.h | 1 - include/asm-i386/bug.h | 1 - include/asm-i386/bugs.h | 1 - include/asm-i386/byteorder.h | 1 - include/asm-i386/cache.h | 1 - include/asm-i386/cpu.h | 2 - include/asm-i386/cpufeature.h | 13 + include/asm-i386/delay.h | 2 + include/asm-i386/dma.h | 1 - include/asm-i386/elf.h | 79 +- include/asm-i386/fixmap.h | 16 +- include/asm-i386/floppy.h | 7 +- include/asm-i386/futex.h | 10 +- include/asm-i386/hardirq.h | 1 - include/asm-i386/highmem.h | 1 - include/asm-i386/hpet.h | 1 - include/asm-i386/hw_irq.h | 13 +- include/asm-i386/i387.h | 15 +- include/asm-i386/ide.h | 1 - include/asm-i386/io.h | 1 - include/asm-i386/io_apic.h | 1 - include/asm-i386/irq.h | 1 - include/asm-i386/kdebug.h | 2 + include/asm-i386/kmap_types.h | 1 - include/asm-i386/kprobes.h | 2 + include/asm-i386/local.h | 40 +- include/asm-i386/mach-default/mach_ipi.h | 7 +- include/asm-i386/mach-default/mach_mpspec.h | 4 + include/asm-i386/mach-default/mach_timer.h | 4 +- .../asm-i386/mach-default/setup_arch_post.h | 40 - .../asm-i386/mach-default/setup_arch_pre.h | 5 - include/asm-i386/mach-summit/mach_apic.h | 1 - include/asm-i386/mach-summit/mach_mpparse.h | 3 + include/asm-i386/mach-visws/setup_arch_post.h | 49 - include/asm-i386/mach-visws/setup_arch_pre.h | 5 - .../asm-i386/mach-voyager/setup_arch_post.h | 73 - .../asm-i386/mach-voyager/setup_arch_pre.h | 10 - include/asm-i386/mach-xen/setup_arch_post.h | 101 - include/asm-i386/mach-xen/setup_arch_pre.h | 5 - include/asm-i386/mmu.h | 1 - include/asm-i386/mmu_context.h | 1 - include/asm-i386/mmzone.h | 2 +- include/asm-i386/msi.h | 10 +- include/asm-i386/mtrr.h | 5 +- include/asm-i386/nmi.h | 28 +- include/asm-i386/node.h | 29 - include/asm-i386/page.h | 12 +- include/asm-i386/param.h | 1 - include/asm-i386/pci.h | 1 - include/asm-i386/pgalloc.h | 1 - include/asm-i386/pgtable.h | 1 - include/asm-i386/posix_types.h | 4 +- include/asm-i386/processor.h | 26 +- include/asm-i386/rwlock.h | 54 +- include/asm-i386/rwsem.h | 77 +- include/asm-i386/semaphore.h | 8 +- include/asm-i386/serial.h | 1 - include/asm-i386/setup.h | 17 + include/asm-i386/signal.h | 10 +- include/asm-i386/smp.h | 1 - include/asm-i386/socket.h | 1 + include/asm-i386/spinlock.h | 42 +- include/asm-i386/string.h | 1 - include/asm-i386/system.h | 54 +- include/asm-i386/thread_info.h | 32 +- include/asm-i386/timer.h | 57 - include/asm-i386/timex.h | 35 +- include/asm-i386/tlbflush.h | 1 - include/asm-i386/topology.h | 11 +- include/asm-i386/types.h | 1 - include/asm-i386/uaccess.h | 70 +- include/asm-i386/unistd.h | 10 +- include/asm-i386/vga.h | 2 +- include/asm-ia64/agp.h | 44 +- include/asm-ia64/asmmacro.h | 1 - include/asm-ia64/cache.h | 1 - include/asm-ia64/delay.h | 1 - include/asm-ia64/dma-mapping.h | 101 +- include/asm-ia64/dma.h | 1 - include/asm-ia64/elf.h | 25 +- include/asm-ia64/gcc_intrin.h | 60 +- include/asm-ia64/hardirq.h | 1 - include/asm-ia64/hw_irq.h | 28 +- include/asm-ia64/ia32.h | 1 - include/asm-ia64/ide.h | 1 - include/asm-ia64/intel_intrin.h | 68 +- include/asm-ia64/intrinsics.h | 1 - include/asm-ia64/io.h | 37 +- include/asm-ia64/iosapic.h | 2 + include/asm-ia64/irq.h | 32 +- include/asm-ia64/kdebug.h | 2 + include/asm-ia64/kmap_types.h | 1 - include/asm-ia64/kprobes.h | 2 + include/asm-ia64/machvec.h | 8 +- include/asm-ia64/machvec_dig.h | 15 + include/asm-ia64/machvec_sn2.h | 7 + include/asm-ia64/mca.h | 9 +- include/asm-ia64/meminit.h | 13 +- include/asm-ia64/mman.h | 16 +- include/asm-ia64/msi.h | 12 + include/asm-ia64/nodedata.h | 13 +- include/asm-ia64/numa.h | 7 +- include/asm-ia64/page.h | 56 +- include/asm-ia64/pal.h | 8 +- include/asm-ia64/param.h | 1 - include/asm-ia64/percpu.h | 4 +- include/asm-ia64/pgalloc.h | 5 +- include/asm-ia64/pgtable.h | 23 +- include/asm-ia64/processor.h | 2 +- include/asm-ia64/ptrace.h | 11 +- include/asm-ia64/rwsem.h | 18 +- include/asm-ia64/signal.h | 4 - include/asm-ia64/smp.h | 1 - include/asm-ia64/sn/intr.h | 8 + include/asm-ia64/sn/pcibr_provider.h | 5 +- include/asm-ia64/sn/pcibus_provider_defs.h | 38 +- include/asm-ia64/sn/simulator.h | 1 - include/asm-ia64/sn/sn_cpuid.h | 1 - include/asm-ia64/sn/sn_sal.h | 19 +- include/asm-ia64/sn/tioca_provider.h | 73 +- include/asm-ia64/sn/tiocp.h | 3 +- include/asm-ia64/sn/xpc.h | 5 +- include/asm-ia64/socket.h | 1 + include/asm-ia64/string.h | 1 - include/asm-ia64/system.h | 10 +- include/asm-ia64/thread_info.h | 7 +- include/asm-ia64/tlb.h | 1 - include/asm-ia64/tlbflush.h | 1 - include/asm-ia64/topology.h | 1 + include/asm-ia64/unistd.h | 6 +- include/asm-ia64/ustack.h | 7 +- include/asm-ia64/vga.h | 2 +- include/asm-m32r/assembler.h | 1 - include/asm-m32r/atomic.h | 1 - include/asm-m32r/bitops.h | 1 - include/asm-m32r/cacheflush.h | 1 - include/asm-m32r/hardirq.h | 1 - include/asm-m32r/hw_irq.h | 5 - include/asm-m32r/ide.h | 1 - include/asm-m32r/irq.h | 1 - include/asm-m32r/kmap_types.h | 1 - include/asm-m32r/m32104ut/m32104ut_pld.h | 1 - include/asm-m32r/m32700ut/m32700ut_lan.h | 1 - include/asm-m32r/m32700ut/m32700ut_lcd.h | 1 - include/asm-m32r/m32700ut/m32700ut_pld.h | 1 - include/asm-m32r/m32r.h | 1 - include/asm-m32r/mmu.h | 1 - include/asm-m32r/mmu_context.h | 2 - include/asm-m32r/opsput/opsput_lan.h | 1 - include/asm-m32r/opsput/opsput_lcd.h | 1 - include/asm-m32r/opsput/opsput_pld.h | 1 - include/asm-m32r/page.h | 4 +- include/asm-m32r/pgalloc.h | 1 - include/asm-m32r/pgtable-2level.h | 1 - include/asm-m32r/pgtable.h | 1 - include/asm-m32r/processor.h | 1 - include/asm-m32r/ptrace.h | 5 +- include/asm-m32r/rtc.h | 1 - include/asm-m32r/semaphore.h | 1 - include/asm-m32r/serial.h | 1 - include/asm-m32r/sigcontext.h | 1 - include/asm-m32r/signal.h | 3 - include/asm-m32r/smp.h | 1 - include/asm-m32r/socket.h | 1 + include/asm-m32r/spinlock.h | 1 - include/asm-m32r/system.h | 6 +- include/asm-m32r/timex.h | 1 - include/asm-m32r/tlbflush.h | 1 - include/asm-m32r/uaccess.h | 1 - include/asm-m32r/unistd.h | 9 +- include/asm-m32r/user.h | 1 - include/asm-m32r/vga.h | 2 +- include/asm-m68k/amigaints.h | 96 +- include/asm-m68k/apollohw.h | 4 + include/asm-m68k/atari_stdma.h | 2 +- include/asm-m68k/atariints.h | 11 - include/asm-m68k/atomic.h | 1 - include/asm-m68k/bug.h | 1 - include/asm-m68k/bvme6000hw.h | 30 +- include/asm-m68k/cacheflush.h | 40 +- include/asm-m68k/dma-mapping.h | 91 +- include/asm-m68k/dma.h | 1 - include/asm-m68k/dvma.h | 1 - include/asm-m68k/elf.h | 1 - include/asm-m68k/entry.h | 1 - include/asm-m68k/floppy.h | 4 +- include/asm-m68k/fpu.h | 1 - include/asm-m68k/hardirq.h | 1 - include/asm-m68k/ide.h | 1 - include/asm-m68k/io.h | 1 - include/asm-m68k/irq.h | 113 +- include/asm-m68k/mac_oss.h | 10 +- include/asm-m68k/machdep.h | 6 - include/asm-m68k/macintosh.h | 10 - include/asm-m68k/macints.h | 14 - include/asm-m68k/mc146818rtc.h | 1 - include/asm-m68k/mmu_context.h | 1 - include/asm-m68k/motorola_pgtable.h | 1 - include/asm-m68k/mvme147hw.h | 44 +- include/asm-m68k/mvme16xhw.h | 40 +- include/asm-m68k/openprom.h | 1 - include/asm-m68k/oplib.h | 5 - include/asm-m68k/page.h | 9 +- include/asm-m68k/page_offset.h | 1 - include/asm-m68k/pgalloc.h | 1 - include/asm-m68k/pgtable.h | 1 - include/asm-m68k/processor.h | 9 +- include/asm-m68k/scatterlist.h | 9 +- include/asm-m68k/semaphore-helper.h | 1 - include/asm-m68k/serial.h | 1 - include/asm-m68k/setup.h | 1 - include/asm-m68k/shm.h | 1 - include/asm-m68k/signal.h | 21 +- include/asm-m68k/socket.h | 1 + include/asm-m68k/sun3ints.h | 22 +- include/asm-m68k/sun3xflop.h | 3 +- include/asm-m68k/system.h | 2 - include/asm-m68k/tlbflush.h | 1 - include/asm-m68k/traps.h | 7 + include/asm-m68k/uaccess.h | 1100 +- include/asm-m68k/unistd.h | 46 +- include/asm-m68k/virtconvert.h | 1 - include/asm-m68knommu/bitops.h | 1 - include/asm-m68knommu/bootstd.h | 12 +- include/asm-m68knommu/cacheflush.h | 13 +- include/asm-m68knommu/coldfire.h | 77 +- include/asm-m68knommu/commproc.h | 1 - include/asm-m68knommu/dma-mapping.h | 1 - include/asm-m68knommu/dma.h | 1 - include/asm-m68knommu/elf.h | 1 - include/asm-m68knommu/elia.h | 1 - include/asm-m68knommu/entry.h | 1 - include/asm-m68knommu/fpu.h | 1 - include/asm-m68knommu/hardirq.h | 1 - include/asm-m68knommu/io.h | 1 - include/asm-m68knommu/irq.h | 11 +- include/asm-m68knommu/m5206sim.h | 1 - include/asm-m68knommu/m520xsim.h | 1 - include/asm-m68knommu/m523xsim.h | 1 - include/asm-m68knommu/m5249sim.h | 2 +- include/asm-m68knommu/m5272sim.h | 1 - include/asm-m68knommu/m527xsim.h | 1 - include/asm-m68knommu/m528xsim.h | 1 - include/asm-m68knommu/mcfcache.h | 55 +- include/asm-m68knommu/mcfdma.h | 1 - include/asm-m68knommu/mcfmbus.h | 1 - include/asm-m68knommu/mcfne.h | 1 - include/asm-m68knommu/mcfpci.h | 1 - include/asm-m68knommu/mcfpit.h | 9 +- include/asm-m68knommu/mcfsim.h | 4 +- include/asm-m68knommu/mcfsmc.h | 1 - include/asm-m68knommu/mcftimer.h | 31 +- include/asm-m68knommu/mcfuart.h | 5 +- include/asm-m68knommu/mcfwdebug.h | 1 - include/asm-m68knommu/mmu_context.h | 1 - include/asm-m68knommu/nettel.h | 1 - include/asm-m68knommu/page.h | 8 +- include/asm-m68knommu/page_offset.h | 44 +- include/asm-m68knommu/param.h | 1 - include/asm-m68knommu/pgtable.h | 1 - include/asm-m68knommu/processor.h | 32 +- include/asm-m68knommu/ptrace.h | 4 +- include/asm-m68knommu/semaphore-helper.h | 1 - include/asm-m68knommu/signal.h | 2 - include/asm-m68knommu/system.h | 2 - include/asm-m68knommu/uaccess.h | 12 +- include/asm-m68knommu/unaligned.h | 1 - include/asm-m68knommu/unistd.h | 7 +- include/asm-mips/a.out.h | 1 - include/asm-mips/addrspace.h | 36 - include/asm-mips/arc/types.h | 1 - include/asm-mips/asm.h | 1 - include/asm-mips/asmmacro-32.h | 4 +- include/asm-mips/asmmacro-64.h | 19 +- include/asm-mips/asmmacro.h | 5 +- include/asm-mips/atomic.h | 3 +- include/asm-mips/bcache.h | 1 - include/asm-mips/bitops.h | 3 +- include/asm-mips/bootinfo.h | 13 + include/asm-mips/bug.h | 1 - include/asm-mips/bugs.h | 1 - include/asm-mips/byteorder.h | 1 - include/asm-mips/cache.h | 1 - include/asm-mips/checksum.h | 1 - include/asm-mips/compat.h | 3 - include/asm-mips/cpu-features.h | 31 +- include/asm-mips/cpu-info.h | 1 - include/asm-mips/cpu.h | 2 +- include/asm-mips/ddb5074.h | 11 - include/asm-mips/ddb5xxx/ddb5074.h | 38 - include/asm-mips/ddb5xxx/ddb5476.h | 157 - include/asm-mips/ddb5xxx/ddb5477.h | 1 - include/asm-mips/ddb5xxx/ddb5xxx.h | 12 +- include/asm-mips/debug.h | 1 - include/asm-mips/dec/prom.h | 1 - include/asm-mips/delay.h | 1 - include/asm-mips/dma.h | 1 - include/asm-mips/elf.h | 1 - include/asm-mips/fcntl.h | 1 - include/asm-mips/fixmap.h | 5 +- include/asm-mips/fpu.h | 4 +- include/asm-mips/fpu_emulator.h | 4 +- include/asm-mips/futex.h | 33 +- include/asm-mips/hazards.h | 5 +- include/asm-mips/highmem.h | 1 - include/asm-mips/hw_irq.h | 8 +- include/asm-mips/inst.h | 2 +- include/asm-mips/interrupt.h | 222 - include/asm-mips/io.h | 1 - include/asm-mips/ip32/machine.h | 1 - include/asm-mips/irq.h | 5 +- include/asm-mips/isadep.h | 1 - include/asm-mips/jmr3927/irq.h | 1 - include/asm-mips/kmap_types.h | 1 - include/asm-mips/local.h | 1 - include/asm-mips/mach-au1x00/au1000.h | 1 - include/asm-mips/mach-au1x00/au1xxx.h | 1 - include/asm-mips/mach-au1x00/au1xxx_dbdma.h | 1 - include/asm-mips/mach-au1x00/au1xxx_ide.h | 1 - include/asm-mips/mach-au1x00/au1xxx_psc.h | 12 +- include/asm-mips/mach-au1x00/ioremap.h | 1 - .../mach-cobalt/cpu-feature-overrides.h | 3 +- include/asm-mips/mach-db1x00/db1x00.h | 13 +- include/asm-mips/mach-ddb5074/mc146818rtc.h | 31 - include/asm-mips/mach-dec/mc146818rtc.h | 2 + include/asm-mips/mach-dec/param.h | 18 - include/asm-mips/mach-generic/floppy.h | 2 +- include/asm-mips/mach-generic/ide.h | 1 - include/asm-mips/mach-generic/kmalloc.h | 1 - include/asm-mips/mach-generic/param.h | 13 - include/asm-mips/mach-generic/spaces.h | 1 - .../mach-ip22/cpu-feature-overrides.h | 2 +- include/asm-mips/mach-ip22/spaces.h | 1 - .../mach-ip27/cpu-feature-overrides.h | 5 +- .../mach-ip32/cpu-feature-overrides.h | 11 +- include/asm-mips/mach-ip32/kmalloc.h | 1 - .../asm-mips/mach-ja/cpu-feature-overrides.h | 2 +- include/asm-mips/mach-jazz/floppy.h | 2 +- include/asm-mips/mach-jazz/param.h | 16 - .../mach-mips/cpu-feature-overrides.h | 9 +- include/asm-mips/mach-mips/irq.h | 7 - include/asm-mips/mach-mips/param.h | 13 - .../mach-ocelot3/cpu-feature-overrides.h | 2 +- include/asm-mips/mach-pb1x00/pb1550.h | 1 - include/asm-mips/mach-qemu/param.h | 13 - .../mach-rm200/cpu-feature-overrides.h | 4 +- .../mach-sibyte/cpu-feature-overrides.h | 2 +- .../asm-mips/mach-sim/cpu-feature-overrides.h | 9 +- .../mach-yosemite/cpu-feature-overrides.h | 12 +- include/asm-mips/mips-boards/generic.h | 1 - include/asm-mips/mipsregs.h | 12 +- include/asm-mips/mmu_context.h | 1 - include/asm-mips/mmzone.h | 13 - include/asm-mips/module.h | 1 - include/asm-mips/msgbuf.h | 1 - include/asm-mips/paccess.h | 1 - include/asm-mips/page.h | 30 +- include/asm-mips/param.h | 2 +- include/asm-mips/pci.h | 1 - include/asm-mips/pci/bridge.h | 3 + include/asm-mips/pgalloc.h | 1 - include/asm-mips/pgtable-32.h | 1 - include/asm-mips/pgtable-64.h | 1 - include/asm-mips/pgtable-bits.h | 1 - include/asm-mips/pgtable.h | 3 - include/asm-mips/prefetch.h | 1 - include/asm-mips/processor.h | 17 +- include/asm-mips/ptrace.h | 1 - include/asm-mips/qemu.h | 6 + include/asm-mips/reg.h | 7 +- include/asm-mips/resource.h | 1 - include/asm-mips/serial.h | 1 - include/asm-mips/sgiarcs.h | 1 - include/asm-mips/sibyte/board.h | 1 - include/asm-mips/sibyte/carmel.h | 1 - include/asm-mips/sibyte/sentosa.h | 1 - include/asm-mips/sibyte/swarm.h | 1 - include/asm-mips/siginfo.h | 1 - include/asm-mips/signal.h | 12 - include/asm-mips/sim.h | 1 - include/asm-mips/smp.h | 1 - include/asm-mips/sn/addrs.h | 28 - include/asm-mips/sn/agent.h | 1 - include/asm-mips/sn/arch.h | 1 - include/asm-mips/sn/io.h | 1 - include/asm-mips/sn/ioc3.h | 2 + include/asm-mips/sn/klconfig.h | 100 +- include/asm-mips/sn/kldir.h | 35 +- include/asm-mips/sn/launch.h | 1 - include/asm-mips/sn/mapped_kernel.h | 1 - include/asm-mips/sn/sn0/addrs.h | 88 +- include/asm-mips/sn/sn0/arch.h | 18 +- include/asm-mips/sn/sn0/hub.h | 4 - include/asm-mips/sn/sn0/hubio.h | 16 - include/asm-mips/sn/sn0/hubmd.h | 3 +- include/asm-mips/sn/sn0/hubpi.h | 18 - include/asm-mips/sn/sn0/ip27.h | 9 +- include/asm-mips/sn/sn0/sn0_fru.h | 44 - include/asm-mips/sni.h | 7 +- include/asm-mips/socket.h | 1 + include/asm-mips/stackframe.h | 17 +- include/asm-mips/string.h | 1 - include/asm-mips/system.h | 6 +- include/asm-mips/thread_info.h | 1 - include/asm-mips/time.h | 4 +- include/asm-mips/tlbflush.h | 1 - include/asm-mips/tx4927/toshiba_rbtx4927.h | 1 - include/asm-mips/types.h | 1 - include/asm-mips/uaccess.h | 1 - include/asm-mips/unistd.h | 28 +- include/asm-mips/vga.h | 2 +- include/asm-mips/vr41xx/capcella.h | 2 +- include/asm-mips/vr41xx/cmbvr4133.h | 6 +- include/asm-mips/vr41xx/e55.h | 43 - include/asm-mips/vr41xx/mpc30x.h | 2 +- include/asm-mips/vr41xx/tb0219.h | 4 +- include/asm-mips/vr41xx/tb0226.h | 2 +- include/asm-mips/vr41xx/tb0287.h | 2 +- include/asm-mips/vr41xx/vr41xx.h | 53 - include/asm-mips/vr41xx/vrc4173.h | 222 - include/asm-mips/vr41xx/workpad.h | 43 - include/asm-mips/war.h | 6 +- include/asm-mips/wbflush.h | 1 - include/asm-parisc/assembly.h | 2 + include/asm-parisc/atomic.h | 1 - include/asm-parisc/cache.h | 1 - include/asm-parisc/cacheflush.h | 1 - include/asm-parisc/compat.h | 11 + include/asm-parisc/dma-mapping.h | 1 - include/asm-parisc/dma.h | 1 - include/asm-parisc/floppy.h | 8 +- include/asm-parisc/hw_irq.h | 9 - include/asm-parisc/io.h | 1 - include/asm-parisc/irq.h | 6 - include/asm-parisc/kmap_types.h | 1 - include/asm-parisc/mmzone.h | 5 - include/asm-parisc/page.h | 21 +- include/asm-parisc/param.h | 1 - include/asm-parisc/pci.h | 1 - include/asm-parisc/pdc.h | 22 +- include/asm-parisc/pgtable.h | 9 +- include/asm-parisc/processor.h | 15 +- include/asm-parisc/psw.h | 1 - include/asm-parisc/signal.h | 2 - include/asm-parisc/smp.h | 1 - include/asm-parisc/socket.h | 1 + include/asm-parisc/system.h | 29 +- include/asm-parisc/tlbflush.h | 1 - include/asm-parisc/uaccess.h | 9 +- include/asm-parisc/unistd.h | 9 +- include/asm-powerpc/abs_addr.h | 1 - include/asm-powerpc/atomic.h | 32 +- include/asm-powerpc/backlight.h | 40 +- include/asm-powerpc/bitops.h | 22 +- include/asm-powerpc/cache.h | 1 - include/asm-powerpc/cputable.h | 130 +- include/asm-powerpc/cputime.h | 18 + include/asm-powerpc/delay.h | 13 + include/asm-powerpc/dma-mapping.h | 1 - include/asm-powerpc/dma.h | 1 - include/asm-powerpc/eeh.h | 19 +- include/asm-powerpc/eeh_event.h | 10 +- include/asm-powerpc/elf.h | 11 +- include/asm-powerpc/floppy.h | 4 +- include/asm-powerpc/futex.h | 28 +- include/asm-powerpc/hvcall.h | 10 + include/asm-powerpc/hw_irq.h | 19 +- include/asm-powerpc/i8259.h | 8 +- include/asm-powerpc/ide.h | 1 - include/asm-powerpc/io.h | 56 +- include/asm-powerpc/iommu.h | 7 +- include/asm-powerpc/ipic.h | 12 +- include/asm-powerpc/irq.h | 437 +- include/asm-powerpc/iseries/iseries_io.h | 1 - include/asm-powerpc/iseries/it_lp_queue.h | 40 +- include/asm-powerpc/kdebug.h | 2 + include/asm-powerpc/kdump.h | 33 +- include/asm-powerpc/kexec.h | 28 +- include/asm-powerpc/kprobes.h | 3 + include/asm-powerpc/machdep.h | 10 +- include/asm-powerpc/mmu.h | 17 +- include/asm-powerpc/mmu_context.h | 19 +- include/asm-powerpc/mmzone.h | 1 - include/asm-powerpc/mpic.h | 198 +- include/asm-powerpc/of_device.h | 2 +- include/asm-powerpc/paca.h | 6 +- include/asm-powerpc/page.h | 12 +- include/asm-powerpc/pci-bridge.h | 13 +- include/asm-powerpc/pci.h | 2 +- include/asm-powerpc/percpu.h | 3 + include/asm-powerpc/pgalloc.h | 2 +- include/asm-powerpc/pgtable-4k.h | 2 + include/asm-powerpc/pgtable-64k.h | 2 + include/asm-powerpc/pgtable.h | 11 +- include/asm-powerpc/pmac_pfunc.h | 2 +- include/asm-powerpc/ppc_asm.h | 1 - include/asm-powerpc/processor.h | 16 +- include/asm-powerpc/prom.h | 110 +- include/asm-powerpc/ptrace.h | 4 - include/asm-powerpc/reg.h | 69 +- include/asm-powerpc/rtas.h | 13 +- include/asm-powerpc/rwsem.h | 18 +- include/asm-powerpc/signal.h | 2 - include/asm-powerpc/smp.h | 1 - include/asm-powerpc/smu.h | 1 - include/asm-powerpc/socket.h | 1 + include/asm-powerpc/spinlock.h | 17 + include/asm-powerpc/spu.h | 31 +- include/asm-powerpc/spu_csa.h | 13 +- include/asm-powerpc/system.h | 26 +- include/asm-powerpc/tce.h | 35 +- include/asm-powerpc/thread_info.h | 1 - include/asm-powerpc/time.h | 11 +- include/asm-powerpc/timex.h | 1 - include/asm-powerpc/tlb.h | 1 - include/asm-powerpc/tlbflush.h | 1 - include/asm-powerpc/topology.h | 15 +- include/asm-powerpc/types.h | 1 - include/asm-powerpc/udbg.h | 6 +- include/asm-powerpc/unistd.h | 8 +- include/asm-powerpc/vga.h | 5 +- include/asm-powerpc/vio.h | 17 +- include/asm-ppc/amigahw.h | 1 - include/asm-ppc/bootinfo.h | 1 - include/asm-ppc/commproc.h | 1 - include/asm-ppc/cpm2.h | 107 +- include/asm-ppc/floppy.h | 8 +- include/asm-ppc/ibm403.h | 1 - include/asm-ppc/ibm44x.h | 1 - include/asm-ppc/ibm4xx.h | 1 - include/asm-ppc/io.h | 21 +- include/asm-ppc/machdep.h | 1 - include/asm-ppc/mmu.h | 24 +- include/asm-ppc/mmu_context.h | 28 +- include/asm-ppc/mpc8260.h | 2 +- include/asm-ppc/mpc83xx.h | 5 +- include/asm-ppc/mpc85xx.h | 74 +- include/asm-ppc/mpc8xx.h | 2 +- include/asm-ppc/mv64x60.h | 1 - include/asm-ppc/ocp.h | 2 - include/asm-ppc/open_pic.h | 1 - include/asm-ppc/page.h | 4 +- include/asm-ppc/pc_serial.h | 1 - include/asm-ppc/pci.h | 2 +- include/asm-ppc/pgalloc.h | 1 - include/asm-ppc/pgtable.h | 3 +- include/asm-ppc/ppc4xx_dma.h | 6 +- include/asm-ppc/ppc4xx_pic.h | 1 - include/asm-ppc/serial.h | 1 - include/asm-ppc/smp.h | 1 - include/asm-ppc/system.h | 1 - include/asm-ppc/time.h | 1 - include/asm-s390/bitops.h | 43 +- include/asm-s390/bug.h | 11 +- include/asm-s390/ccwdev.h | 2 +- include/asm-s390/cio.h | 4 + include/asm-s390/cmb.h | 4 - include/asm-s390/dasd.h | 8 +- include/asm-s390/debug.h | 3 +- include/asm-s390/div64.h | 48 - include/asm-s390/elf.h | 28 +- include/asm-s390/hardirq.h | 1 - include/asm-s390/idals.h | 1 - include/asm-s390/io.h | 5 + include/asm-s390/irq.h | 4 - include/asm-s390/local.h | 1 - include/asm-s390/lowcore.h | 1 - include/asm-s390/page.h | 8 +- include/asm-s390/percpu.h | 3 + include/asm-s390/pgalloc.h | 3 +- include/asm-s390/pgtable.h | 7 - include/asm-s390/posix_types.h | 44 +- include/asm-s390/processor.h | 16 +- include/asm-s390/ptrace.h | 6 +- include/asm-s390/rwsem.h | 31 +- include/asm-s390/semaphore.h | 3 +- include/asm-s390/setup.h | 3 +- include/asm-s390/sfp-machine.h | 1 - include/asm-s390/signal.h | 2 - include/asm-s390/smp.h | 1 - include/asm-s390/socket.h | 1 + include/asm-s390/system.h | 43 +- include/asm-s390/thread_info.h | 1 + include/asm-s390/timex.h | 4 +- include/asm-s390/tlbflush.h | 1 - include/asm-s390/types.h | 1 - include/asm-s390/unistd.h | 10 +- include/asm-s390/vtoc.h | 38 +- include/asm-sh/bug.h | 1 - include/asm-sh/checksum.h | 1 - include/asm-sh/dma-mapping.h | 1 - include/asm-sh/dma.h | 1 - include/asm-sh/fixmap.h | 1 - include/asm-sh/floppy.h | 8 +- include/asm-sh/hardirq.h | 1 - include/asm-sh/hd64461/hd64461.h | 1 - include/asm-sh/hd64465/hd64465.h | 1 - include/asm-sh/hw_irq.h | 5 - include/asm-sh/ide.h | 1 - include/asm-sh/io.h | 1 - include/asm-sh/irq.h | 1 - include/asm-sh/keyboard.h | 1 - include/asm-sh/kmap_types.h | 1 - include/asm-sh/machvec.h | 1 - include/asm-sh/machvec_init.h | 1 - include/asm-sh/mpc1211/dma.h | 1 - include/asm-sh/mpc1211/keyboard.h | 2 +- include/asm-sh/overdrive/overdrive.h | 1 - include/asm-sh/page.h | 10 +- include/asm-sh/pgtable.h | 1 - include/asm-sh/processor.h | 3 +- include/asm-sh/ptrace.h | 2 - include/asm-sh/rwsem.h | 18 +- include/asm-sh/serial.h | 1 - include/asm-sh/signal.h | 2 - include/asm-sh/smp.h | 1 - include/asm-sh/socket.h | 1 + include/asm-sh/system.h | 4 +- include/asm-sh/types.h | 1 - include/asm-sh/unistd.h | 7 +- include/asm-sh/watchdog.h | 1 - include/asm-sh64/bug.h | 17 +- include/asm-sh64/byteorder.h | 4 +- include/asm-sh64/dma-mapping.h | 19 +- include/asm-sh64/hardirq.h | 1 - include/asm-sh64/hw_irq.h | 1 - include/asm-sh64/ide.h | 5 - include/asm-sh64/io.h | 15 +- include/asm-sh64/irq.h | 1 - include/asm-sh64/keyboard.h | 2 +- include/asm-sh64/mmu_context.h | 3 +- include/asm-sh64/page.h | 26 +- include/asm-sh64/param.h | 1 - include/asm-sh64/pgtable.h | 33 +- include/asm-sh64/processor.h | 7 +- include/asm-sh64/ptrace.h | 2 +- include/asm-sh64/shmparam.h | 16 +- include/asm-sh64/signal.h | 3 - include/asm-sh64/system.h | 8 +- include/asm-sh64/uaccess.h | 27 +- include/asm-sh64/unistd.h | 16 +- include/asm-sh64/user.h | 1 - include/asm-sparc/asmmacro.h | 1 - include/asm-sparc/atomic.h | 1 - include/asm-sparc/bugs.h | 1 - include/asm-sparc/cacheflush.h | 1 - include/asm-sparc/delay.h | 1 - include/asm-sparc/dma-mapping.h | 1 - include/asm-sparc/dma.h | 1 - include/asm-sparc/ebus.h | 17 +- include/asm-sparc/elf.h | 1 - include/asm-sparc/fixmap.h | 1 - include/asm-sparc/floppy.h | 3 +- include/asm-sparc/hardirq.h | 1 - include/asm-sparc/ide.h | 1 - include/asm-sparc/io.h | 16 + include/asm-sparc/irq.h | 7 - include/asm-sparc/mman.h | 14 +- include/asm-sparc/mostek.h | 1 - include/asm-sparc/oplib.h | 5 - include/asm-sparc/page.h | 11 +- include/asm-sparc/pbm.h | 3 +- include/asm-sparc/pgalloc.h | 1 - include/asm-sparc/pgtable.h | 1 - include/asm-sparc/sbus.h | 28 +- include/asm-sparc/sfp-machine.h | 1 - include/asm-sparc/signal.h | 5 +- include/asm-sparc/smp.h | 9 +- include/asm-sparc/socket.h | 1 + include/asm-sparc/spinlock.h | 3 + include/asm-sparc/system.h | 3 - include/asm-sparc/timer.h | 1 - include/asm-sparc/tlbflush.h | 1 - include/asm-sparc/unistd.h | 4 +- include/asm-sparc/vac-ops.h | 1 - include/asm-sparc/winmacro.h | 1 - include/asm-sparc64/atomic.h | 1 - include/asm-sparc64/bitops.h | 1 - include/asm-sparc64/bugs.h | 1 - include/asm-sparc64/cacheflush.h | 1 - include/asm-sparc64/cpudata.h | 19 +- include/asm-sparc64/delay.h | 1 - include/asm-sparc64/dma-mapping.h | 58 +- include/asm-sparc64/dma.h | 1 - include/asm-sparc64/ebus.h | 20 +- include/asm-sparc64/fhc.h | 7 +- include/asm-sparc64/floppy.h | 80 +- include/asm-sparc64/hardirq.h | 2 + include/asm-sparc64/hw_irq.h | 2 +- include/asm-sparc64/ide.h | 1 - include/asm-sparc64/irq.h | 97 +- include/asm-sparc64/isa.h | 21 +- include/asm-sparc64/kdebug.h | 2 + include/asm-sparc64/kprobes.h | 3 +- include/asm-sparc64/mc146818rtc.h | 1 - include/asm-sparc64/mman.h | 14 +- include/asm-sparc64/mmu.h | 1 - include/asm-sparc64/openprom.h | 2 +- include/asm-sparc64/oplib.h | 11 +- include/asm-sparc64/page.h | 10 +- include/asm-sparc64/param.h | 1 - include/asm-sparc64/parport.h | 25 +- include/asm-sparc64/pbm.h | 20 +- include/asm-sparc64/percpu.h | 3 + include/asm-sparc64/pgalloc.h | 1 - include/asm-sparc64/pgtable.h | 7 +- include/asm-sparc64/pil.h | 7 +- include/asm-sparc64/processor.h | 1 - include/asm-sparc64/sbus.h | 30 +- include/asm-sparc64/shmparam.h | 2 + include/asm-sparc64/siginfo.h | 1 - include/asm-sparc64/signal.h | 4 - include/asm-sparc64/smp.h | 1 - include/asm-sparc64/socket.h | 1 + include/asm-sparc64/spinlock.h | 1 - include/asm-sparc64/starfire.h | 2 +- include/asm-sparc64/system.h | 3 - include/asm-sparc64/timer.h | 1 - include/asm-sparc64/tlb.h | 1 - include/asm-sparc64/tlbflush.h | 1 - include/asm-sparc64/topology.h | 3 + include/asm-sparc64/ttable.h | 1 - include/asm-sparc64/unistd.h | 4 +- include/asm-sparc64/vdev.h | 16 - include/asm-sparc64/vga.h | 2 +- include/asm-um/a.out.h | 1 - include/asm-um/cache.h | 1 - include/asm-um/elf-ppc.h | 1 - include/asm-um/fixmap.h | 1 - include/asm-um/hardirq.h | 1 - include/asm-um/hw_irq.h | 3 - include/asm-um/io.h | 5 + include/asm-um/kmap_types.h | 20 +- include/asm-um/linkage.h | 1 - include/asm-um/mmu_context.h | 1 - include/asm-um/page.h | 1 - include/asm-um/pgalloc.h | 1 - include/asm-um/processor-generic.h | 1 - include/asm-um/ptrace-generic.h | 1 - include/asm-um/smp.h | 1 - include/asm-um/thread_info.h | 1 - include/asm-v850/atomic.h | 1 - include/asm-v850/bitops.h | 1 - include/asm-v850/dma-mapping.h | 1 - include/asm-v850/hardirq.h | 1 - include/asm-v850/hw_irq.h | 4 - include/asm-v850/irq.h | 2 - include/asm-v850/machdep.h | 1 - include/asm-v850/page.h | 9 +- include/asm-v850/param.h | 4 +- include/asm-v850/pgtable.h | 1 - include/asm-v850/processor.h | 4 +- include/asm-v850/serial.h | 1 - include/asm-v850/signal.h | 2 - include/asm-v850/socket.h | 1 + include/asm-v850/system.h | 1 - include/asm-v850/unistd.h | 12 +- include/asm-v850/v850e_uart.h | 1 - include/asm-x86_64/acpi.h | 2 + include/asm-x86_64/apic.h | 27 +- include/asm-x86_64/apicdef.h | 2 - include/asm-x86_64/atomic.h | 43 +- include/asm-x86_64/bitops.h | 8 +- include/asm-x86_64/bugs.h | 1 - include/asm-x86_64/cache.h | 1 - include/asm-x86_64/calling.h | 1 - include/asm-x86_64/cpufeature.h | 3 + include/asm-x86_64/dma-mapping.h | 18 +- include/asm-x86_64/dma.h | 3 +- include/asm-x86_64/dwarf2.h | 1 - include/asm-x86_64/e820.h | 1 + include/asm-x86_64/elf.h | 20 +- include/asm-x86_64/fixmap.h | 1 - include/asm-x86_64/floppy.h | 8 +- include/asm-x86_64/fpu32.h | 3 + include/asm-x86_64/gart-mapping.h | 16 - include/asm-x86_64/hardirq.h | 1 - include/asm-x86_64/hpet.h | 2 +- include/asm-x86_64/hw_irq.h | 12 - include/asm-x86_64/ia32.h | 1 - include/asm-x86_64/ia32_unistd.h | 308 +- include/asm-x86_64/io.h | 1 - include/asm-x86_64/io_apic.h | 1 - include/asm-x86_64/kdebug.h | 4 +- include/asm-x86_64/kprobes.h | 2 + include/asm-x86_64/local.h | 26 +- include/asm-x86_64/mce.h | 13 +- include/asm-x86_64/mmu_context.h | 1 - include/asm-x86_64/mmzone.h | 2 - include/asm-x86_64/msi.h | 10 +- include/asm-x86_64/mtrr.h | 9 +- include/asm-x86_64/mutex.h | 4 +- include/asm-x86_64/nmi.h | 30 +- include/asm-x86_64/numa.h | 1 - include/asm-x86_64/page.h | 9 +- include/asm-x86_64/param.h | 1 - include/asm-x86_64/pci.h | 5 +- include/asm-x86_64/percpu.h | 4 + include/asm-x86_64/pgtable.h | 6 - include/asm-x86_64/processor.h | 12 +- include/asm-x86_64/proto.h | 15 +- include/asm-x86_64/rwlock.h | 70 +- include/asm-x86_64/semaphore.h | 8 +- include/asm-x86_64/serial.h | 1 - include/asm-x86_64/signal.h | 8 +- include/asm-x86_64/smp.h | 3 - include/asm-x86_64/socket.h | 1 + include/asm-x86_64/spinlock.h | 25 +- include/asm-x86_64/string.h | 3 +- include/asm-x86_64/swiotlb.h | 3 +- include/asm-x86_64/system.h | 126 +- include/asm-x86_64/thread_info.h | 23 +- include/asm-x86_64/tlbflush.h | 1 - include/asm-x86_64/topology.h | 11 +- include/asm-x86_64/uaccess.h | 1 - include/asm-x86_64/unistd.h | 27 +- include/asm-x86_64/vga.h | 2 +- include/asm-x86_64/vsyscall.h | 3 +- include/asm-xtensa/atomic.h | 1 - include/asm-xtensa/checksum.h | 4 +- include/asm-xtensa/delay.h | 1 - include/asm-xtensa/dma.h | 1 - include/asm-xtensa/hardirq.h | 1 - include/asm-xtensa/hw_irq.h | 4 - include/asm-xtensa/ide.h | 1 - include/asm-xtensa/io.h | 1 - include/asm-xtensa/irq.h | 1 - include/asm-xtensa/mmu_context.h | 1 - include/asm-xtensa/page.h | 1 - include/asm-xtensa/pgalloc.h | 1 - include/asm-xtensa/platform.h | 1 - include/asm-xtensa/processor.h | 3 +- include/asm-xtensa/rwsem.h | 25 +- include/asm-xtensa/signal.h | 15 - include/asm-xtensa/socket.h | 1 + include/asm-xtensa/system.h | 2 - include/asm-xtensa/uaccess.h | 34 - include/asm-xtensa/unistd.h | 21 +- include/asm-xtensa/vga.h | 2 +- include/keys/user-type.h | 1 + include/linux/ac97_codec.h | 2 +- include/linux/acct.h | 11 +- include/linux/acpi.h | 16 +- include/linux/affs_hardblocks.h | 72 +- include/linux/agpgart.h | 3 +- include/linux/amba/clcd.h | 1 - include/linux/ata.h | 37 + include/linux/atmdev.h | 5 +- include/linux/audit.h | 166 +- include/linux/bio.h | 2 +- include/linux/bitmap.h | 5 + include/linux/blkdev.h | 22 +- include/linux/blkpg.h | 1 + include/linux/blktrace_api.h | 12 +- include/linux/blockgroup_lock.h | 1 - include/linux/bootmem.h | 4 +- include/linux/buffer_head.h | 2 +- include/linux/cache.h | 1 - include/linux/cn_proc.h | 24 +- include/linux/coda.h | 1 - include/linux/coda_linux.h | 6 +- include/linux/coda_psdev.h | 2 +- include/linux/compat.h | 3 +- include/linux/compat_ioctl.h | 11 +- include/linux/compiler.h | 19 +- include/linux/completion.h | 15 + include/linux/config.h | 1 + include/linux/connector.h | 5 +- include/linux/console.h | 9 +- include/linux/console_struct.h | 1 + include/linux/cpu.h | 30 +- include/linux/cpufreq.h | 10 +- include/linux/cpumask.h | 4 +- include/linux/cramfs_fs.h | 34 +- include/linux/crypto.h | 35 +- include/linux/cyclomx.h | 1 - include/linux/dcache.h | 15 +- include/linux/dcookies.h | 1 - include/linux/delay.h | 16 +- include/linux/devfs_fs.h | 41 - include/linux/devfs_fs_kernel.h | 58 - include/linux/device-mapper.h | 111 +- include/linux/device.h | 26 +- include/linux/divert.h | 20 +- include/linux/dm-ioctl.h | 6 +- include/linux/dmi.h | 43 +- include/linux/dnotify.h | 1 - include/linux/dqblk_xfs.h | 4 +- include/linux/dvb/dmx.h | 26 - include/linux/efi.h | 1 + include/linux/efs_fs.h | 2 +- include/linux/elf.h | 59 +- include/linux/elfcore.h | 10 + include/linux/err.h | 4 +- include/linux/errqueue.h | 1 - include/linux/etherdevice.h | 5 +- include/linux/ethtool.h | 169 +- include/linux/eventpoll.h | 2 +- include/linux/ext2_fs.h | 2 +- include/linux/ext3_fs.h | 41 +- include/linux/ext3_fs_i.h | 16 +- include/linux/fb.h | 48 +- include/linux/fcntl.h | 1 + include/linux/fs.h | 96 +- include/linux/fs_enet_pd.h | 50 +- include/linux/fsnotify.h | 36 +- include/linux/ftape.h | 1 - include/linux/fuse.h | 36 +- include/linux/futex.h | 15 +- include/linux/gameport.h | 6 + include/linux/genalloc.h | 35 +- include/linux/generic_serial.h | 6 +- include/linux/genhd.h | 14 +- include/linux/gfp.h | 1 - include/linux/hardirq.h | 28 +- include/linux/hdlc.h | 4 +- include/linux/highmem.h | 1 - include/linux/highuid.h | 1 - include/linux/hrtimer.h | 7 +- include/linux/hugetlb.h | 8 +- include/linux/i2c-algo-ite.h | 7 +- include/linux/i2c-id.h | 4 + include/linux/i2c.h | 15 +- include/linux/i2o-dev.h | 167 +- include/linux/ide.h | 9 +- include/linux/idr.h | 2 +- include/linux/if_fddi.h | 2 + include/linux/if_frad.h | 1 - include/linux/if_tr.h | 1 - include/linux/if_vlan.h | 10 +- include/linux/igmp.h | 2 +- include/linux/init.h | 1 - include/linux/init_task.h | 20 +- include/linux/inotify.h | 109 +- include/linux/input.h | 35 +- include/linux/interrupt.h | 150 +- include/linux/io.h | 1 + include/linux/ioc4.h | 5 + include/linux/ioport.h | 33 +- include/linux/ioprio.h | 23 +- include/linux/ipmi.h | 6 +- include/linux/ipv6.h | 1 - include/linux/irq.h | 383 +- include/linux/irq_cpustat.h | 1 - include/linux/isapnp.h | 1 - include/linux/isdn.h | 1 - include/linux/isdn/tpam.h | 56 - include/linux/isdn_ppp.h | 1 - include/linux/isdnif.h | 1 - include/linux/jbd.h | 11 +- include/linux/jffs2.h | 57 +- include/linux/jffs2_fs_i.h | 50 - include/linux/jffs2_fs_sb.h | 122 - include/linux/jiffies.h | 4 +- include/linux/joystick.h | 22 +- include/linux/kallsyms.h | 24 +- include/linux/kbd_kern.h | 4 +- include/linux/kernel.h | 16 +- include/linux/kernel_stat.h | 1 - include/linux/kexec.h | 1 + include/linux/key.h | 40 +- include/linux/kmod.h | 1 - include/linux/kobject.h | 2 + include/linux/kprobes.h | 1 - include/linux/kthread.h | 66 +- include/linux/ktime.h | 15 +- include/linux/libata.h | 526 +- include/linux/linkage.h | 1 - include/linux/list.h | 214 +- include/linux/lockd/lockd.h | 6 +- include/linux/lockd/nlm.h | 1 - include/linux/mc146818rtc.h | 7 + include/linux/memory_hotplug.h | 73 +- include/linux/mempolicy.h | 110 +- include/linux/migrate.h | 32 +- include/linux/mii.h | 30 +- include/linux/miscdevice.h | 1 - include/linux/mm.h | 64 +- include/linux/mman.h | 12 +- include/linux/mmc/host.h | 2 +- include/linux/mmc/mmc.h | 2 + include/linux/mmzone.h | 73 +- include/linux/module.h | 51 +- include/linux/mount.h | 13 + include/linux/msg.h | 2 +- include/linux/mtd/bbm.h | 35 +- include/linux/mtd/cfi.h | 14 +- include/linux/mtd/inftl.h | 2 +- include/linux/mtd/map.h | 1 - include/linux/mtd/mtd.h | 98 +- include/linux/mtd/nand.h | 363 +- include/linux/mtd/nftl.h | 2 +- include/linux/mtd/onenand.h | 86 +- include/linux/mtd/onenand_regs.h | 8 + include/linux/mtd/partitions.h | 2 +- include/linux/mtd/physmap.h | 39 +- include/linux/mtd/xip.h | 48 +- include/linux/mutex-debug.h | 18 +- include/linux/mutex.h | 37 +- include/linux/nbd.h | 12 +- include/linux/ncp_fs.h | 5 +- include/linux/net.h | 6 +- include/linux/netdevice.h | 47 +- include/linux/netfilter.h | 1 - include/linux/netfilter/nf_conntrack_common.h | 4 + include/linux/netfilter/nfnetlink_conntrack.h | 4 +- include/linux/netfilter/xt_conntrack.h | 2 +- include/linux/netfilter_arp.h | 1 - include/linux/netfilter_bridge.h | 8 +- include/linux/netfilter_ipv4.h | 1 - include/linux/netfilter_ipv4/ip_conntrack.h | 7 +- .../linux/netfilter_ipv4/ip_conntrack_h323.h | 7 + .../ip_conntrack_helper_h323_types.h | 3 +- include/linux/netfilter_ipv4/listhelp.h | 1 - include/linux/netlink.h | 2 +- include/linux/netpoll.h | 1 + include/linux/nfs.h | 8 +- include/linux/nfs4.h | 13 +- include/linux/nfs4_mount.h | 1 + include/linux/nfs_fs.h | 105 +- include/linux/nfs_fs_sb.h | 95 +- include/linux/nfs_idmap.h | 14 +- include/linux/nfs_mount.h | 3 +- include/linux/nfs_page.h | 5 +- include/linux/nfs_xdr.h | 75 +- include/linux/nfsd/nfsd.h | 1 - include/linux/nfsd/nfsfh.h | 22 +- include/linux/nfsd/stats.h | 6 + include/linux/nfsd/syscall.h | 1 - include/linux/node.h | 25 + include/linux/notifier.h | 2 +- include/linux/numa.h | 1 - include/linux/page-flags.h | 168 +- include/linux/pagemap.h | 69 +- include/linux/parport.h | 6 +- include/linux/pci.h | 25 +- include/linux/pci_ids.h | 56 +- include/linux/pci_regs.h | 17 + include/linux/percpu_counter.h | 39 +- include/linux/pfn.h | 4 + include/linux/phy.h | 1 + include/linux/pid.h | 3 +- include/linux/pm.h | 1 - include/linux/pm_legacy.h | 8 - include/linux/pmu.h | 4 +- include/linux/pnp.h | 7 +- include/linux/ppp_defs.h | 14 +- include/linux/prctl.h | 7 + include/linux/preempt.h | 1 - include/linux/proc_fs.h | 17 +- include/linux/profile.h | 1 - include/linux/ptrace.h | 221 +- include/linux/quota.h | 4 +- include/linux/quotaops.h | 1 - include/linux/radix-tree.h | 5 +- include/linux/raid/bitmap.h | 11 +- include/linux/raid/linear.h | 2 + include/linux/raid/md.h | 4 - include/linux/raid/md_k.h | 13 +- include/linux/raid/md_p.h | 5 +- include/linux/raid/raid10.h | 7 +- include/linux/raid/raid5.h | 1 + include/linux/ramfs.h | 4 +- include/linux/rbtree.h | 30 +- include/linux/rcupdate.h | 28 +- include/linux/reboot.h | 4 +- include/linux/reiserfs_fs.h | 2 +- include/linux/reiserfs_xattr.h | 133 +- include/linux/relay.h | 1 - include/linux/resource.h | 4 + include/linux/rio.h | 1 - include/linux/rio_drv.h | 1 - include/linux/rmap.h | 12 +- include/linux/root_dev.h | 2 + include/linux/rtc.h | 16 +- include/linux/rtnetlink.h | 1 - include/linux/rwsem-spinlock.h | 27 +- include/linux/rwsem.h | 97 +- include/linux/scc.h | 1 - include/linux/sched.h | 343 +- include/linux/scx200.h | 9 +- include/linux/scx200_gpio.h | 21 +- include/linux/seccomp.h | 17 +- include/linux/security.h | 189 +- include/linux/selinux.h | 32 + include/linux/sem.h | 2 +- include/linux/seqlock.h | 13 +- include/linux/serialP.h | 1 - include/linux/serial_core.h | 14 +- include/linux/serio.h | 1 + include/linux/signal.h | 30 +- include/linux/skbuff.h | 86 +- include/linux/slab.h | 51 +- include/linux/smb.h | 1 - include/linux/smb_fs.h | 4 +- include/linux/smp.h | 3 +- include/linux/smp_lock.h | 1 - include/linux/socket.h | 2 - include/linux/spi/spi.h | 6 +- include/linux/spinlock.h | 64 +- include/linux/spinlock_api_smp.h | 2 + include/linux/spinlock_api_up.h | 1 + include/linux/spinlock_types.h | 47 +- include/linux/spinlock_types_up.h | 9 +- include/linux/spinlock_up.h | 1 - include/linux/squashfs_fs.h | 776 +- include/linux/squashfs_fs_i.h | 16 +- include/linux/squashfs_fs_sb.h | 44 +- include/linux/stat.h | 2 +- include/linux/stddef.h | 2 + include/linux/stop_machine.h | 1 - include/linux/string.h | 1 + include/linux/sunrpc/auth.h | 1 - include/linux/sunrpc/debug.h | 24 +- include/linux/sunrpc/gss_api.h | 2 +- include/linux/sunrpc/rpc_pipe_fs.h | 4 +- include/linux/sunrpc/stats.h | 1 - include/linux/sunrpc/svc.h | 4 +- include/linux/sunrpc/xdr.h | 1 + include/linux/sunrpc/xprt.h | 4 +- include/linux/suspend.h | 9 - include/linux/swap.h | 113 +- include/linux/swapops.h | 53 + include/linux/synclink.h | 5 +- include/linux/syscalls.h | 15 +- include/linux/sysctl.h | 16 +- include/linux/sysdev.h | 18 +- include/linux/sysrq.h | 1 - include/linux/tcp.h | 9 +- include/linux/threads.h | 1 - include/linux/time.h | 40 +- include/linux/timer.h | 1 - include/linux/timex.h | 6 +- include/linux/topology.h | 3 +- include/linux/tty.h | 20 +- include/linux/tty_driver.h | 14 +- include/linux/tty_flip.h | 2 +- include/linux/types.h | 8 +- include/linux/udp.h | 3 +- include/linux/ufs_fs.h | 109 +- include/linux/ufs_fs_i.h | 1 + include/linux/unistd.h | 2 + include/linux/usb.h | 18 +- include/linux/usb_cdc.h | 192 - include/linux/usb_ch9.h | 7 + include/linux/usb_gadget.h | 4 +- include/linux/usb_input.h | 25 - include/linux/usb_isp116x.h | 29 - include/linux/usb_sl811.h | 26 - include/linux/usb_usual.h | 5 +- include/linux/usbdevice_fs.h | 2 + include/linux/vermagic.h | 2 +- include/linux/videodev.h | 55 +- include/linux/videodev2.h | 400 +- include/linux/vmalloc.h | 9 + include/linux/vs_context.h | 44 + include/linux/vs_cvirt.h | 48 + include/linux/vs_dlimit.h | 4 +- include/linux/vserver/context.h | 6 + include/linux/vserver/cvirt_def.h | 2 - include/linux/vserver/xid.h | 2 - include/linux/vt.h | 11 + include/linux/vt_buffer.h | 1 - include/linux/vt_kern.h | 2 +- include/linux/wait.h | 11 +- include/linux/wanrouter.h | 4 +- include/linux/watchdog.h | 10 +- include/linux/workqueue.h | 2 + include/linux/writeback.h | 6 +- include/linux/xfrm.h | 4 + include/linux/zconf.h | 12 + include/linux/zlib.h | 209 +- include/linux/zorro.h | 42 - include/linux/zutil.h | 12 - include/media/ir-common.h | 5 +- include/media/ir-kbd-i2c.h | 3 +- include/media/ovcamchip.h | 15 +- include/media/saa7115.h | 11 +- include/media/saa7146_vv.h | 2 +- include/media/tuner-types.h | 55 + include/media/tuner.h | 13 +- include/media/v4l2-common.h | 32 + include/media/video-buf-dvb.h | 3 +- include/media/video-buf.h | 1 + include/mtd/mtd-abi.h | 115 +- include/mtd/mtd-user.h | 1 + include/net/addrconf.h | 1 - include/net/af_unix.h | 8 +- include/net/ax25.h | 25 +- include/net/bluetooth/bluetooth.h | 2 +- include/net/bluetooth/hci.h | 73 +- include/net/bluetooth/hci_core.h | 59 +- include/net/compat.h | 1 - include/net/dst.h | 1 - include/net/genetlink.h | 20 + include/net/icmp.h | 1 - include/net/ieee80211.h | 999 +- include/net/ieee80211softmac.h | 41 +- include/net/ieee80211softmac_wx.h | 5 + include/net/inet6_hashtables.h | 1 - include/net/inet_hashtables.h | 1 - include/net/inet_sock.h | 1 - include/net/inet_timewait_sock.h | 1 - include/net/ip.h | 2 - include/net/ip6_route.h | 14 +- include/net/ip_fib.h | 1 - include/net/ip_mp_alg.h | 1 - include/net/ip_vs.h | 1 - include/net/ipv6.h | 4 +- include/net/irda/irda.h | 1 - include/net/irda/irda_device.h | 3 +- include/net/irda/irlap.h | 1 - include/net/irda/irlmp.h | 1 - include/net/irda/irlmp_frame.h | 1 - include/net/irda/qos.h | 1 - include/net/llc_if.h | 17 +- include/net/ndisc.h | 1 - include/net/netfilter/nf_conntrack.h | 6 +- include/net/netfilter/nf_conntrack_compat.h | 26 + include/net/pkt_act.h | 2 - include/net/pkt_sched.h | 4 +- include/net/protocol.h | 8 +- include/net/raw.h | 3 +- include/net/red.h | 3 +- include/net/route.h | 1 - include/net/sch_generic.h | 1 - include/net/scm.h | 38 + include/net/sctp/sctp.h | 1 - include/net/sctp/structs.h | 11 +- include/net/sctp/user.h | 9 + include/net/sock.h | 81 +- include/net/tcp.h | 23 +- include/net/tcp_ecn.h | 4 +- include/net/tipc/tipc_bearer.h | 12 +- include/net/tux.h | 1 - include/net/xfrm.h | 26 +- include/pcmcia/ss.h | 1 - include/rdma/ib_cache.h | 13 + include/rdma/ib_cm.h | 26 +- include/rdma/ib_fmr_pool.h | 2 +- include/rdma/ib_mad.h | 7 + include/rdma/ib_sa.h | 7 + include/rdma/ib_smi.h | 36 + include/rdma/ib_user_cm.h | 86 +- include/rdma/ib_user_verbs.h | 80 +- include/rdma/ib_verbs.h | 22 +- include/scsi/iscsi_if.h | 151 +- include/scsi/iscsi_proto.h | 2 - include/scsi/libiscsi.h | 310 + include/scsi/scsi_cmnd.h | 22 +- include/scsi/scsi_dbg.h | 5 +- include/scsi/scsi_devinfo.h | 1 + include/scsi/scsi_eh.h | 3 - include/scsi/scsi_host.h | 7 +- include/scsi/scsi_request.h | 54 - include/scsi/scsi_transport_fc.h | 1 - include/scsi/scsi_transport_iscsi.h | 123 +- include/scsi/scsi_transport_sas.h | 42 +- include/scsi/scsi_transport_spi.h | 1 - include/scsi/sg_request.h | 26 - include/scsi/srp.h | 5 + include/sound/ac97_codec.h | 2 + include/sound/ak4xxx-adda.h | 35 +- include/sound/asequencer.h | 4 + include/sound/asound.h | 2 +- include/sound/core.h | 5 +- include/sound/cs46xx.h | 1 + include/sound/driver.h | 1 - include/sound/emu10k1.h | 2 + include/sound/hdsp.h | 12 +- include/sound/info.h | 11 +- include/sound/initval.h | 2 +- include/sound/mpu401.h | 14 +- include/sound/pcm.h | 19 +- include/sound/pcm_params.h | 125 +- include/sound/rawmidi.h | 3 + include/sound/tea575x-tuner.h | 3 +- include/sound/version.h | 4 +- include/video/edid.h | 1 - include/video/vga.h | 1 - include/xen/interface/sched_ctl.h | 69 - init/Kconfig | 139 +- init/Makefile | 1 - init/do_mounts.c | 12 +- init/do_mounts.h | 17 +- init/do_mounts_devfs.c | 137 - init/do_mounts_initrd.c | 6 +- init/do_mounts_md.c | 7 +- init/do_mounts_rd.c | 4 +- init/initramfs.c | 38 +- init/main.c | 60 +- init/version.c | 1 + ipc/compat.c | 1 - ipc/mqueue.c | 33 +- ipc/msg.c | 397 +- ipc/sem.c | 9 +- ipc/shm.c | 6 +- ipc/util.c | 1 - kernel/Makefile | 17 +- kernel/acct.c | 119 +- kernel/audit.c | 219 +- kernel/audit.h | 63 +- kernel/auditfilter.c | 1159 +- kernel/auditsc.c | 896 +- kernel/capability.c | 9 +- kernel/compat.c | 30 +- kernel/configs.c | 1 - kernel/cpu.c | 219 +- kernel/cpuset.c | 106 +- kernel/exec_domain.c | 1 - kernel/exit.c | 347 +- kernel/fork.c | 161 +- kernel/futex.c | 1097 +- kernel/futex_compat.c | 49 +- kernel/hrtimer.c | 31 +- kernel/intermodule.c | 184 - kernel/irq/Makefile | 2 +- kernel/irq/autoprobe.c | 56 +- kernel/irq/handle.c | 172 +- kernel/irq/internals.h | 46 + kernel/irq/manage.c | 220 +- kernel/irq/migration.c | 22 +- kernel/irq/proc.c | 33 +- kernel/irq/spurious.c | 52 +- kernel/kallsyms.c | 4 +- kernel/kexec.c | 12 +- kernel/kmod.c | 8 +- kernel/kprobes.c | 59 +- kernel/ksysfs.c | 20 +- kernel/kthread.c | 63 +- kernel/module-verify-sig.c | 1 - kernel/module-verify.c | 1 - kernel/module.c | 172 +- kernel/mutex-debug.c | 404 +- kernel/mutex-debug.h | 111 +- kernel/mutex.c | 95 +- kernel/mutex.h | 25 +- kernel/panic.c | 4 +- kernel/params.c | 1 - kernel/pid.c | 19 +- kernel/posix-cpu-timers.c | 28 +- kernel/posix-timers.c | 19 +- kernel/power/Kconfig | 36 +- kernel/power/Makefile | 2 - kernel/power/console.c | 32 +- kernel/power/disk.c | 9 +- kernel/power/main.c | 18 +- kernel/power/pm.c | 37 - kernel/power/power.h | 63 +- kernel/power/process.c | 26 +- kernel/power/smp.c | 85 - kernel/power/snapshot.c | 271 +- kernel/power/swap.c | 284 +- kernel/power/swsusp.c | 20 +- kernel/power/user.c | 14 +- kernel/printk.c | 110 +- kernel/profile.c | 3 +- kernel/ptrace.c | 1641 +- kernel/rcupdate.c | 37 +- kernel/rcutorture.c | 201 +- kernel/relay.c | 2 +- kernel/resource.c | 96 +- kernel/sched.c | 2015 +- kernel/signal.c | 232 +- kernel/softirq.c | 171 +- kernel/softlockup.c | 8 +- kernel/spinlock.c | 80 +- kernel/sys.c | 83 +- kernel/sys_ni.c | 2 + kernel/sysctl.c | 99 +- kernel/time.c | 4 + kernel/timer.c | 498 +- kernel/user.c | 4 +- kernel/vserver/Kconfig | 18 +- kernel/vserver/context.c | 10 +- kernel/vserver/cvirt_init.h | 3 - kernel/vserver/limit_init.h | 3 - kernel/vserver/sched_init.h | 5 +- kernel/vserver/switch.c | 4 +- kernel/wait.c | 35 +- kernel/workqueue.c | 186 +- lib/Kconfig | 11 + lib/Kconfig.debug | 180 +- lib/Makefile | 7 +- lib/bitmap.c | 31 +- lib/bust_spinlocks.c | 1 - lib/crc-ccitt.c | 6 +- lib/crc16.c | 10 +- lib/crc32.c | 54 +- lib/extable.c | 1 - lib/genalloc.c | 263 +- lib/idr.c | 16 +- lib/iomap_copy.c | 28 + lib/kernel_lock.c | 11 +- lib/kobject.c | 6 +- lib/libcrc32c.c | 2 +- lib/radix-tree.c | 197 +- lib/rbtree.c | 189 +- lib/reed_solomon/reed_solomon.c | 11 +- lib/rwsem-spinlock.c | 66 +- lib/rwsem.c | 51 +- lib/semaphore-sleepers.c | 1 - lib/spinlock_debug.c | 118 +- lib/string.c | 30 + lib/textsearch.c | 1 - lib/ts_bm.c | 1 - lib/ts_fsm.c | 1 - lib/ts_kmp.c | 1 - lib/vsprintf.c | 88 +- lib/zlib_deflate/deflate.c | 25 +- lib/zlib_deflate/deflate_syms.c | 3 +- lib/zlib_inflate/Makefile | 4 +- lib/zlib_inflate/infblock.c | 365 - lib/zlib_inflate/infblock.h | 48 - lib/zlib_inflate/infcodes.c | 202 - lib/zlib_inflate/infcodes.h | 33 - lib/zlib_inflate/inffast.c | 462 +- lib/zlib_inflate/inffast.h | 12 +- lib/zlib_inflate/inffixed.h | 94 + lib/zlib_inflate/inflate.c | 1089 +- lib/zlib_inflate/inflate_syms.c | 3 +- lib/zlib_inflate/inflate_sync.c | 152 - lib/zlib_inflate/inftrees.c | 677 +- lib/zlib_inflate/inftrees.h | 99 +- lib/zlib_inflate/infutil.c | 88 - lib/zlib_inflate/infutil.h | 176 +- mm/Kconfig | 10 +- mm/Makefile | 2 +- mm/bootmem.c | 4 +- mm/fadvise.c | 15 +- mm/filemap.c | 341 +- mm/filemap.h | 33 +- mm/filemap_xip.c | 4 +- mm/fremap.c | 20 +- mm/highmem.c | 6 +- mm/hugetlb.c | 282 +- mm/memory.c | 183 +- mm/memory_hotplug.c | 186 +- mm/mempolicy.c | 65 +- mm/mempool.c | 9 +- mm/migrate.c | 1080 +- mm/mmap.c | 27 +- mm/mmzone.c | 7 +- mm/mprotect.c | 70 +- mm/mremap.c | 2 +- mm/msync.c | 199 +- mm/nommu.c | 4 +- mm/oom_kill.c | 147 +- mm/page-writeback.c | 125 +- mm/page_alloc.c | 719 +- mm/page_io.c | 31 +- mm/pdflush.c | 3 +- mm/readahead.c | 45 +- mm/rmap.c | 199 +- mm/shmem.c | 35 +- mm/slab.c | 502 +- mm/slob.c | 1 - mm/sparse.c | 25 +- mm/swap.c | 69 +- mm/swap_state.c | 8 +- mm/swapfile.c | 44 +- mm/tiny-shmem.c | 4 - mm/truncate.c | 67 +- mm/vmalloc.c | 131 +- mm/vmscan.c | 487 +- net/802/fc.c | 1 - net/802/fddi.c | 1 - net/802/sysctl_net_802.c | 1 - net/802/tr.c | 1 - net/8021q/vlan.c | 16 +- net/8021q/vlanproc.c | 1 - net/Kconfig | 24 +- net/appletalk/aarp.c | 1 - net/appletalk/atalk_proc.c | 1 - net/appletalk/ddp.c | 7 +- net/appletalk/sysctl_net_atalk.c | 1 - net/atm/Makefile | 2 +- net/atm/br2684.c | 4 +- net/atm/clip.c | 26 +- net/atm/common.c | 8 +- net/atm/common.h | 2 + net/atm/ioctl.c | 1 - net/atm/ipcommon.c | 17 +- net/atm/lec.c | 4 +- net/atm/lec.h | 1 - net/atm/mpc.c | 20 +- net/atm/mpoa_caches.c | 12 +- net/atm/mpoa_proc.c | 1 - net/atm/pppoatm.c | 4 +- net/atm/proc.c | 3 +- net/atm/pvc.c | 1 - net/atm/resources.c | 26 +- net/atm/resources.h | 3 +- net/ax25/af_ax25.c | 18 +- net/ax25/ax25_dev.c | 5 +- net/ax25/ax25_ds_subr.c | 8 +- net/ax25/ax25_ds_timer.c | 4 +- net/ax25/ax25_iface.c | 19 +- net/ax25/ax25_in.c | 2 +- net/ax25/ax25_ip.c | 24 +- net/ax25/ax25_out.c | 1 - net/ax25/ax25_route.c | 49 +- net/ax25/ax25_timer.c | 1 - net/ax25/sysctl_net_ax25.c | 5 +- net/bluetooth/af_bluetooth.c | 21 +- net/bluetooth/bnep/core.c | 1 - net/bluetooth/bnep/netdev.c | 1 - net/bluetooth/bnep/sock.c | 1 - net/bluetooth/cmtp/capi.c | 5 +- net/bluetooth/cmtp/core.c | 4 +- net/bluetooth/cmtp/sock.c | 1 - net/bluetooth/hci_conn.c | 101 +- net/bluetooth/hci_core.c | 46 +- net/bluetooth/hci_event.c | 207 +- net/bluetooth/hci_sock.c | 1 - net/bluetooth/hci_sysfs.c | 212 +- net/bluetooth/hidp/Kconfig | 3 +- net/bluetooth/hidp/core.c | 26 +- net/bluetooth/hidp/sock.c | 4 +- net/bluetooth/l2cap.c | 376 +- net/bluetooth/lib.c | 1 - net/bluetooth/rfcomm/core.c | 56 +- net/bluetooth/rfcomm/sock.c | 5 +- net/bluetooth/rfcomm/tty.c | 18 +- net/bluetooth/sco.c | 17 +- net/bridge/Makefile | 2 +- net/bridge/br.c | 29 +- net/bridge/br_forward.c | 16 +- net/bridge/br_if.c | 7 +- net/bridge/br_ioctl.c | 7 +- net/bridge/br_netfilter.c | 24 +- net/bridge/br_notify.c | 2 + net/bridge/br_private.h | 12 +- net/bridge/br_stp_bpdu.c | 2 +- net/bridge/br_stp_if.c | 4 + net/bridge/netfilter/ebt_ulog.c | 1 - net/core/Makefile | 3 +- net/core/dev.c | 197 +- net/core/dev_mcast.c | 1 - net/core/ethtool.c | 2 +- net/core/link_watch.c | 6 +- net/core/neighbour.c | 18 +- net/core/net-sysfs.c | 1 - net/core/netpoll.c | 52 +- net/core/pktgen.c | 4 +- net/core/rtnetlink.c | 3 +- net/core/skbuff.c | 99 +- net/core/sock.c | 116 +- net/core/stream.c | 39 +- net/core/sysctl_net_core.c | 1 - net/core/utils.c | 7 +- net/core/wireless.c | 25 +- net/dccp/Kconfig | 2 +- net/dccp/ackvec.h | 1 - net/dccp/ccids/ccid2.c | 1 - net/dccp/ccids/ccid3.c | 154 +- net/dccp/ccids/ccid3.h | 10 +- net/dccp/ccids/lib/loss_interval.c | 37 +- net/dccp/ccids/lib/loss_interval.h | 10 +- net/dccp/ccids/lib/packet_history.c | 169 +- net/dccp/ccids/lib/packet_history.h | 18 +- net/dccp/ccids/lib/tfrc.h | 2 +- net/dccp/ccids/lib/tfrc_equation.c | 3 +- net/dccp/dccp.h | 11 +- net/dccp/diag.c | 1 - net/dccp/feat.c | 1 - net/dccp/feat.h | 2 + net/dccp/input.c | 1 - net/dccp/ipv4.c | 4 +- net/dccp/ipv6.c | 9 +- net/dccp/ipv6.h | 1 - net/dccp/minisocks.c | 1 - net/dccp/options.c | 5 +- net/dccp/output.c | 1 - net/dccp/proto.c | 9 +- net/dccp/sysctl.c | 1 - net/dccp/timer.c | 1 - net/decnet/af_decnet.c | 5 +- net/decnet/dn_dev.c | 10 +- net/decnet/dn_fib.c | 4 +- net/decnet/dn_neigh.c | 4 +- net/decnet/dn_nsp_in.c | 1 - net/decnet/dn_route.c | 10 +- net/decnet/dn_rules.c | 4 +- net/decnet/dn_table.c | 12 +- net/decnet/netfilter/dn_rtmsg.c | 2 +- net/decnet/sysctl_net_decnet.c | 1 - net/econet/af_econet.c | 4 +- net/ethernet/eth.c | 1 - net/ieee80211/ieee80211_crypt.c | 3 +- net/ieee80211/ieee80211_crypt_ccmp.c | 4 +- net/ieee80211/ieee80211_crypt_tkip.c | 12 +- net/ieee80211/ieee80211_crypt_wep.c | 4 +- net/ieee80211/ieee80211_geo.c | 1 - net/ieee80211/ieee80211_module.c | 1 - net/ieee80211/ieee80211_rx.c | 19 +- net/ieee80211/ieee80211_tx.c | 96 +- net/ieee80211/ieee80211_wx.c | 51 +- net/ieee80211/softmac/Kconfig | 1 + .../softmac/ieee80211softmac_assoc.c | 125 +- net/ieee80211/softmac/ieee80211softmac_auth.c | 45 +- .../softmac/ieee80211softmac_event.c | 30 +- net/ieee80211/softmac/ieee80211softmac_io.c | 175 +- .../softmac/ieee80211softmac_module.c | 117 +- net/ieee80211/softmac/ieee80211softmac_priv.h | 5 + net/ieee80211/softmac/ieee80211softmac_wx.c | 74 +- net/ipv4/Kconfig | 40 + net/ipv4/Makefile | 5 + net/ipv4/af_inet.c | 15 +- net/ipv4/ah4.c | 20 +- net/ipv4/arp.c | 4 +- net/ipv4/datagram.c | 4 +- net/ipv4/devinet.c | 7 +- net/ipv4/esp4.c | 23 +- net/ipv4/fib_frontend.c | 2 +- net/ipv4/fib_hash.c | 7 +- net/ipv4/fib_rules.c | 4 +- net/ipv4/fib_semantics.c | 16 +- net/ipv4/fib_trie.c | 11 +- net/ipv4/icmp.c | 6 +- net/ipv4/igmp.c | 53 +- net/ipv4/inet_connection_sock.c | 1 - net/ipv4/inet_diag.c | 4 +- net/ipv4/inet_hashtables.c | 1 - net/ipv4/inet_timewait_sock.c | 1 - net/ipv4/inetpeer.c | 2 +- net/ipv4/ip_forward.c | 1 - net/ipv4/ip_fragment.c | 1 - net/ipv4/ip_gre.c | 2 - net/ipv4/ip_input.c | 4 +- net/ipv4/ip_options.c | 1 - net/ipv4/ip_output.c | 14 +- net/ipv4/ip_sockglue.c | 10 +- net/ipv4/ipcomp.c | 30 +- net/ipv4/ipconfig.c | 1 - net/ipv4/ipip.c | 2 - net/ipv4/ipmr.c | 22 +- net/ipv4/ipvs/ip_vs_ctl.c | 10 +- net/ipv4/ipvs/ip_vs_est.c | 4 +- net/ipv4/ipvs/ip_vs_ftp.c | 27 +- net/ipv4/ipvs/ip_vs_sync.c | 2 +- net/ipv4/multipath_drr.c | 3 +- net/ipv4/multipath_random.c | 1 - net/ipv4/multipath_rr.c | 1 - net/ipv4/multipath_wrandom.c | 19 +- net/ipv4/netfilter/Kconfig | 42 +- net/ipv4/netfilter/Makefile | 2 + net/ipv4/netfilter/arp_tables.c | 31 +- net/ipv4/netfilter/ip_conntrack_amanda.c | 143 +- net/ipv4/netfilter/ip_conntrack_core.c | 10 +- net/ipv4/netfilter/ip_conntrack_ftp.c | 78 +- net/ipv4/netfilter/ip_conntrack_helper_h323.c | 112 +- .../ip_conntrack_helper_h323_types.c | 6 +- net/ipv4/netfilter/ip_conntrack_helper_pptp.c | 1 - net/ipv4/netfilter/ip_conntrack_irc.c | 1 - net/ipv4/netfilter/ip_conntrack_netlink.c | 84 +- net/ipv4/netfilter/ip_conntrack_proto_gre.c | 7 +- net/ipv4/netfilter/ip_conntrack_proto_icmp.c | 2 +- net/ipv4/netfilter/ip_conntrack_proto_tcp.c | 3 +- net/ipv4/netfilter/ip_conntrack_proto_udp.c | 2 +- net/ipv4/netfilter/ip_conntrack_standalone.c | 19 +- net/ipv4/netfilter/ip_nat_helper.c | 1 - net/ipv4/netfilter/ip_nat_helper_h323.c | 77 + net/ipv4/netfilter/ip_nat_helper_pptp.c | 1 - net/ipv4/netfilter/ip_nat_proto_gre.c | 1 - net/ipv4/netfilter/ip_nat_proto_udp.c | 3 +- net/ipv4/netfilter/ip_nat_snmp_basic.c | 7 +- net/ipv4/netfilter/ip_nat_standalone.c | 12 +- net/ipv4/netfilter/ip_queue.c | 14 +- net/ipv4/netfilter/ip_tables.c | 39 +- net/ipv4/netfilter/ipt_CLUSTERIP.c | 24 +- net/ipv4/netfilter/ipt_MASQUERADE.c | 1 - net/ipv4/netfilter/ipt_NETMAP.c | 1 - net/ipv4/netfilter/ipt_REJECT.c | 2 +- net/ipv4/netfilter/ipt_ULOG.c | 1 - net/ipv4/netfilter/ipt_hashlimit.c | 87 +- net/ipv4/netfilter/ipt_recent.c | 1276 +- net/ipv4/netfilter/iptable_mangle.c | 1 - .../netfilter/nf_conntrack_l3proto_ipv4.c | 3 +- net/ipv4/netfilter/nf_conntrack_proto_icmp.c | 2 +- net/ipv4/protocol.c | 1 - net/ipv4/raw.c | 6 +- net/ipv4/route.c | 37 +- net/ipv4/sysctl_net_ipv4.c | 27 +- net/ipv4/tcp.c | 139 +- net/ipv4/tcp_bic.c | 8 - net/ipv4/tcp_cong.c | 9 +- net/ipv4/tcp_cubic.c | 13 +- net/ipv4/tcp_diag.c | 6 +- net/ipv4/tcp_highspeed.c | 38 +- net/ipv4/tcp_htcp.c | 10 - net/ipv4/tcp_hybla.c | 1 - net/ipv4/tcp_input.c | 124 +- net/ipv4/tcp_ipv4.c | 33 +- net/ipv4/tcp_minisocks.c | 9 +- net/ipv4/tcp_output.c | 29 +- net/ipv4/tcp_scalable.c | 1 - net/ipv4/tcp_vegas.c | 1 - net/ipv4/tcp_westwood.c | 81 +- net/ipv4/udp.c | 4 +- net/ipv4/xfrm4_input.c | 28 +- net/ipv4/xfrm4_output.c | 61 +- net/ipv4/xfrm4_policy.c | 7 - net/ipv4/xfrm4_state.c | 1 - net/ipv6/Kconfig | 20 + net/ipv6/Makefile | 2 + net/ipv6/addrconf.c | 204 +- net/ipv6/af_inet6.c | 5 +- net/ipv6/ah6.c | 11 +- net/ipv6/anycast.c | 1 - net/ipv6/datagram.c | 2 +- net/ipv6/esp6.c | 21 +- net/ipv6/exthdrs.c | 4 +- net/ipv6/icmp.c | 17 +- net/ipv6/inet6_connection_sock.c | 5 +- net/ipv6/inet6_hashtables.c | 1 - net/ipv6/ip6_fib.c | 1 - net/ipv6/ip6_flowlabel.c | 3 +- net/ipv6/ip6_input.c | 9 +- net/ipv6/ip6_output.c | 137 +- net/ipv6/ip6_tunnel.c | 4 +- net/ipv6/ipcomp6.c | 31 +- net/ipv6/ipv6_sockglue.c | 112 +- net/ipv6/ipv6_syms.c | 1 - net/ipv6/mcast.c | 11 +- net/ipv6/ndisc.c | 1 - net/ipv6/netfilter/ip6_queue.c | 2 +- net/ipv6/netfilter/ip6_tables.c | 41 +- net/ipv6/netfilter/ip6t_REJECT.c | 1 - .../netfilter/nf_conntrack_l3proto_ipv6.c | 3 +- .../netfilter/nf_conntrack_proto_icmpv6.c | 2 +- net/ipv6/netfilter/nf_conntrack_reasm.c | 11 +- net/ipv6/proc.c | 1 - net/ipv6/raw.c | 3 +- net/ipv6/reassembly.c | 1 - net/ipv6/route.c | 14 +- net/ipv6/sit.c | 2 - net/ipv6/sysctl_net_ipv6.c | 1 - net/ipv6/tcp_ipv6.c | 50 +- net/ipv6/udp.c | 3 +- net/ipv6/xfrm6_input.c | 29 +- net/ipv6/xfrm6_output.c | 65 +- net/ipv6/xfrm6_policy.c | 7 - net/ipv6/xfrm6_state.c | 1 - net/ipv6/xfrm6_tunnel.c | 225 +- net/ipx/af_ipx.c | 12 +- net/ipx/ipx_proc.c | 1 - net/ipx/ipx_route.c | 3 +- net/ipx/sysctl_net_ipx.c | 1 - net/irda/af_irda.c | 3 +- net/irda/ircomm/ircomm_core.c | 5 +- net/irda/ircomm/ircomm_lmp.c | 4 +- net/irda/ircomm/ircomm_param.c | 2 +- net/irda/ircomm/ircomm_tty.c | 10 +- net/irda/irda_device.c | 5 +- net/irda/iriap.c | 10 +- net/irda/iriap_event.c | 2 +- net/irda/irias_object.c | 24 +- net/irda/irlan/irlan_client.c | 3 +- net/irda/irlan/irlan_common.c | 17 +- net/irda/irlan/irlan_eth.c | 1 - net/irda/irlan/irlan_provider.c | 2 +- net/irda/irlap.c | 9 +- net/irda/irlap_event.c | 1 - net/irda/irlap_frame.c | 19 +- net/irda/irlmp.c | 18 +- net/irda/irlmp_event.c | 1 - net/irda/irlmp_frame.c | 1 - net/irda/irmod.c | 1 - net/irda/irnet/irnet.h | 2 - net/irda/irnet/irnet_ppp.c | 3 +- net/irda/irsysctl.c | 1 - net/irda/irttp.c | 21 +- net/irda/qos.c | 1 - net/irda/timer.c | 1 - net/key/af_key.c | 18 +- net/lapb/lapb_iface.c | 16 +- net/llc/af_llc.c | 27 +- net/llc/llc_core.c | 3 +- net/llc/llc_if.c | 3 - net/llc/llc_input.c | 10 +- net/llc/llc_proc.c | 1 - net/llc/llc_sap.c | 66 +- net/llc/llc_station.c | 1 - net/llc/sysctl_net_llc.c | 1 - net/netfilter/Kconfig | 55 +- net/netfilter/Makefile | 4 + net/netfilter/core.c | 1 - net/netfilter/nf_conntrack_core.c | 10 +- net/netfilter/nf_conntrack_ftp.c | 78 +- net/netfilter/nf_conntrack_l3proto_generic.c | 1 - net/netfilter/nf_conntrack_netlink.c | 85 +- net/netfilter/nf_conntrack_proto_sctp.c | 2 + net/netfilter/nf_conntrack_proto_tcp.c | 6 +- net/netfilter/nf_conntrack_proto_udp.c | 3 +- net/netfilter/nf_conntrack_standalone.c | 17 +- net/netfilter/nf_internals.h | 1 - net/netfilter/nf_log.c | 1 - net/netfilter/nf_queue.c | 10 +- net/netfilter/nf_sockopt.c | 1 - net/netfilter/nfnetlink.c | 3 +- net/netfilter/nfnetlink_queue.c | 12 +- net/netfilter/x_tables.c | 1 - net/netfilter/xt_connmark.c | 2 +- net/netfilter/xt_dccp.c | 3 +- net/netfilter/xt_mark.c | 2 +- net/netfilter/xt_multiport.c | 7 +- net/netfilter/xt_physdev.c | 16 + net/netfilter/xt_pkttype.c | 12 +- net/netfilter/xt_policy.c | 1 - net/netfilter/xt_sctp.c | 6 +- net/netfilter/xt_string.c | 9 +- net/netfilter/xt_tcpudp.c | 2 +- net/netlink/af_netlink.c | 36 +- net/netlink/attr.c | 1 - net/netlink/genetlink.c | 3 +- net/netrom/af_netrom.c | 30 +- net/netrom/nr_dev.c | 1 - net/netrom/nr_route.c | 12 +- net/netrom/nr_timer.c | 2 +- net/packet/af_packet.c | 5 +- net/rose/af_rose.c | 20 +- net/rose/rose_dev.c | 6 +- net/rxrpc/call.c | 3 +- net/rxrpc/connection.c | 9 +- net/rxrpc/krxsecd.c | 3 +- net/rxrpc/peer.c | 3 +- net/rxrpc/rxrpc_syms.c | 1 - net/rxrpc/sysctl.c | 1 - net/rxrpc/transport.c | 6 +- net/sched/Kconfig | 8 +- net/sched/act_api.c | 14 +- net/sched/act_gact.c | 1 - net/sched/act_ipt.c | 1 - net/sched/act_mirred.c | 1 - net/sched/act_pedit.c | 4 +- net/sched/act_police.c | 7 +- net/sched/act_simple.c | 1 - net/sched/cls_api.c | 5 +- net/sched/cls_basic.c | 9 +- net/sched/cls_fw.c | 7 +- net/sched/cls_route.c | 10 +- net/sched/cls_rsvp.h | 10 +- net/sched/cls_tcindex.c | 13 +- net/sched/cls_u32.c | 18 +- net/sched/em_cmp.c | 1 - net/sched/em_meta.c | 81 +- net/sched/em_nbyte.c | 1 - net/sched/em_text.c | 1 - net/sched/em_u32.c | 1 - net/sched/ematch.c | 10 +- net/sched/estimator.c | 3 +- net/sched/sch_api.c | 19 +- net/sched/sch_atm.c | 1 - net/sched/sch_blackhole.c | 1 - net/sched/sch_cbq.c | 4 +- net/sched/sch_dsmark.c | 1 - net/sched/sch_fifo.c | 1 - net/sched/sch_generic.c | 72 +- net/sched/sch_gred.c | 4 +- net/sched/sch_hfsc.c | 4 +- net/sched/sch_htb.c | 8 +- net/sched/sch_ingress.c | 1 - net/sched/sch_netem.c | 178 +- net/sched/sch_prio.c | 1 - net/sched/sch_red.c | 1 - net/sched/sch_sfq.c | 1 - net/sched/sch_tbf.c | 1 - net/sctp/associola.c | 27 +- net/sctp/bind_addr.c | 8 +- net/sctp/endpointola.c | 11 +- net/sctp/input.c | 6 +- net/sctp/ipv6.c | 3 +- net/sctp/output.c | 48 +- net/sctp/outqueue.c | 9 +- net/sctp/protocol.c | 7 +- net/sctp/sm_make_chunk.c | 18 +- net/sctp/sm_sideeffect.c | 12 +- net/sctp/sm_statefuns.c | 8 +- net/sctp/socket.c | 75 +- net/sctp/transport.c | 9 +- net/socket.c | 19 +- net/sunrpc/auth_gss/auth_gss.c | 12 +- net/sunrpc/auth_gss/gss_krb5_mech.c | 5 +- net/sunrpc/auth_gss/gss_krb5_seal.c | 2 +- net/sunrpc/auth_gss/gss_mech_switch.c | 9 +- net/sunrpc/auth_gss/gss_spkm3_mech.c | 5 +- net/sunrpc/auth_gss/gss_spkm3_token.c | 3 +- net/sunrpc/auth_gss/svcauth_gss.c | 271 +- net/sunrpc/auth_null.c | 2 + net/sunrpc/auth_unix.c | 1 + net/sunrpc/clnt.c | 85 +- net/sunrpc/pmap_clnt.c | 1 - net/sunrpc/rpc_pipe.c | 81 +- net/sunrpc/stats.c | 7 +- net/sunrpc/sunrpc_syms.c | 1 - net/sunrpc/svc.c | 9 +- net/sunrpc/svcsock.c | 38 +- net/sunrpc/sysctl.c | 1 - net/sunrpc/xdr.c | 31 +- net/sunrpc/xprt.c | 28 +- net/sunrpc/xprtsock.c | 79 +- net/sysctl_net.c | 1 - net/tipc/bcast.c | 83 +- net/tipc/bcast.h | 2 +- net/tipc/bearer.c | 78 +- net/tipc/cluster.c | 28 +- net/tipc/config.c | 87 +- net/tipc/core.c | 10 +- net/tipc/core.h | 26 +- net/tipc/dbg.c | 2 +- net/tipc/discover.c | 15 +- net/tipc/eth_media.c | 29 +- net/tipc/handler.c | 2 +- net/tipc/link.c | 233 +- net/tipc/name_distr.c | 30 +- net/tipc/name_table.c | 223 +- net/tipc/net.c | 7 +- net/tipc/node.c | 104 +- net/tipc/node.h | 2 + net/tipc/node_subscr.c | 15 +- net/tipc/port.c | 50 +- net/tipc/ref.c | 37 +- net/tipc/socket.c | 100 +- net/tipc/subscr.c | 23 +- net/tipc/user_reg.c | 5 +- net/tipc/zone.c | 20 +- net/tipc/zone.h | 4 +- net/tux/cachemiss.c | 2 +- net/tux/directory.c | 2 +- net/tux/input.c | 6 +- net/tux/logger.c | 8 +- net/tux/main.c | 6 +- net/tux/mod.c | 2 +- net/tux/output.c | 2 +- net/tux/proc.c | 10 +- net/tux/proto_ftp.c | 22 +- net/tux/proto_http.c | 20 +- net/unix/af_unix.c | 36 +- net/wanrouter/af_wanpipe.c | 10 +- net/wanrouter/wanmain.c | 10 +- net/wanrouter/wanproc.c | 1 - net/x25/af_x25.c | 1 - net/x25/x25_dev.c | 1 - net/x25/x25_proc.c | 1 - net/x25/x25_route.c | 1 - net/xfrm/xfrm_algo.c | 1 - net/xfrm/xfrm_policy.c | 172 +- net/xfrm/xfrm_state.c | 20 +- net/xfrm/xfrm_user.c | 21 +- scripts/Kbuild.include | 14 +- scripts/Makefile.build | 16 +- scripts/Makefile.host | 16 +- scripts/Makefile.lib | 6 +- scripts/Makefile.modinst | 2 +- scripts/Makefile.modpost | 6 +- scripts/basic/Makefile | 6 +- scripts/basic/split-include.c | 226 - scripts/bloat-o-meter | 3 +- scripts/checkstack.pl | 14 +- scripts/checkversion.pl | 7 +- scripts/genksyms/genksyms.c | 77 +- scripts/genksyms/genksyms.h | 1 + scripts/genksyms/lex.c_shipped | 2 +- scripts/genksyms/lex.l | 2 +- scripts/kconfig/conf.c | 23 +- scripts/kconfig/confdata.c | 493 +- scripts/kconfig/expr.c | 53 +- scripts/kconfig/expr.h | 20 +- scripts/kconfig/gconf.c | 12 +- scripts/kconfig/lex.zconf.c_shipped | 91 +- scripts/kconfig/lkc.h | 10 +- scripts/kconfig/lkc_proto.h | 5 +- scripts/kconfig/lxdialog/checklist.c | 7 +- scripts/kconfig/menu.c | 34 +- scripts/kconfig/qconf.cc | 1048 +- scripts/kconfig/qconf.h | 158 +- scripts/kconfig/symbol.c | 50 +- scripts/kconfig/util.c | 8 +- scripts/kconfig/zconf.gperf | 3 + scripts/kconfig/zconf.hash.c_shipped | 181 +- scripts/kconfig/zconf.tab.c_shipped | 930 +- scripts/kconfig/zconf.y | 33 +- scripts/kernel-2.6-planetlab.spec | 8 +- scripts/kernel-doc | 33 +- scripts/mod/file2alias.c | 213 +- scripts/mod/mk_elfconfig.c | 10 +- scripts/mod/modpost.c | 959 +- scripts/mod/modpost.h | 54 +- scripts/package/mkspec | 14 + scripts/setlocalversion | 4 +- security/Kconfig | 20 +- security/capability.c | 1 - security/commoncap.c | 5 +- security/dummy.c | 60 +- security/inode.c | 20 +- security/keys/internal.h | 4 +- security/keys/key.c | 71 +- security/keys/keyctl.c | 63 +- security/keys/keyring.c | 28 +- security/keys/proc.c | 7 + security/keys/process_keys.c | 69 +- security/keys/request_key.c | 64 +- security/keys/request_key_auth.c | 49 +- security/keys/user_defined.c | 25 +- security/root_plug.c | 1 - security/seclvl.c | 1 - security/security.c | 1 - security/selinux/Kconfig | 62 + security/selinux/exports.c | 22 + security/selinux/hooks.c | 653 +- security/selinux/include/av_inherit.h | 1 + security/selinux/include/av_perm_to_string.h | 12 + security/selinux/include/av_permissions.h | 36 + security/selinux/include/class_to_string.h | 3 + security/selinux/include/flask.h | 3 + security/selinux/include/objsec.h | 11 +- security/selinux/include/security.h | 7 +- security/selinux/include/xfrm.h | 4 +- security/selinux/nlmsgtab.c | 27 +- security/selinux/selinuxfs.c | 75 +- security/selinux/ss/mls.c | 21 +- security/selinux/ss/policydb.c | 31 +- security/selinux/ss/policydb.h | 7 +- security/selinux/ss/services.c | 52 +- security/selinux/xfrm.c | 52 +- sound/Kconfig | 2 + sound/Makefile | 1 + sound/arm/aaci.c | 7 +- sound/arm/sa11xx-uda1341.c | 17 +- sound/core/Kconfig | 4 +- sound/core/control.c | 32 + sound/core/device.c | 6 + sound/core/hwdep.c | 4 +- sound/core/info.c | 182 +- sound/core/info_oss.c | 3 +- sound/core/init.c | 78 +- sound/core/isadma.c | 6 + sound/core/memalloc.c | 1 - sound/core/memory.c | 6 +- sound/core/misc.c | 6 + sound/core/oss/mixer_oss.c | 5 +- sound/core/oss/pcm_oss.c | 543 +- sound/core/pcm.c | 90 +- sound/core/pcm_compat.c | 161 +- sound/core/pcm_lib.c | 725 +- sound/core/pcm_memory.c | 14 +- sound/core/pcm_misc.c | 24 + sound/core/pcm_native.c | 113 +- sound/core/rawmidi.c | 3 +- sound/core/rtctimer.c | 17 +- sound/core/seq/oss/seq_oss.c | 1 - sound/core/seq/seq.c | 22 - sound/core/seq/seq_clientmgr.c | 12 + sound/core/seq/seq_device.c | 12 +- sound/core/seq/seq_dummy.c | 6 +- sound/core/seq/seq_info.c | 11 +- sound/core/seq/seq_lock.c | 2 + sound/core/seq/seq_memory.c | 3 + sound/core/seq/seq_memory.h | 2 +- sound/core/seq/seq_midi.c | 11 +- sound/core/seq/seq_ports.c | 9 +- sound/core/seq/seq_virmidi.c | 4 +- sound/core/sgbuf.c | 10 +- sound/core/sound.c | 136 +- sound/core/sound_oss.c | 9 +- sound/core/timer.c | 6 +- sound/drivers/dummy.c | 4 + sound/drivers/mpu401/mpu401.c | 11 +- sound/drivers/mpu401/mpu401_uart.c | 186 +- sound/drivers/mtpav.c | 16 +- sound/drivers/opl3/opl3_lib.c | 19 +- sound/drivers/opl3/opl3_oss.c | 3 +- sound/drivers/opl3/opl3_seq.c | 4 +- sound/drivers/opl3/opl3_synth.c | 4 + sound/drivers/opl4/opl4_lib.c | 12 +- sound/drivers/opl4/opl4_seq.c | 4 +- sound/drivers/serial-u16550.c | 6 +- sound/drivers/virmidi.c | 4 + sound/drivers/vx/vx_core.c | 32 +- sound/drivers/vx/vx_hwdep.c | 3 + sound/drivers/vx/vx_pcm.c | 7 +- sound/i2c/cs8427.c | 116 +- sound/i2c/i2c.c | 17 +- sound/i2c/l3/uda1341.c | 4 +- sound/i2c/other/ak4xxx-adda.c | 284 +- sound/isa/ad1816a/ad1816a.c | 2 +- sound/isa/ad1816a/ad1816a_lib.c | 2 +- sound/isa/ad1848/ad1848_lib.c | 2 +- sound/isa/als100.c | 2 +- sound/isa/azt2320.c | 2 +- sound/isa/cs423x/cs4231.c | 2 +- sound/isa/cs423x/cs4231_lib.c | 2 +- sound/isa/cs423x/cs4236.c | 2 +- sound/isa/dt019x.c | 2 +- sound/isa/es1688/es1688.c | 2 +- sound/isa/es1688/es1688_lib.c | 2 +- sound/isa/es18xx.c | 5 +- sound/isa/gus/gus_irq.c | 2 +- sound/isa/gus/gus_main.c | 2 +- sound/isa/gus/gus_mem.c | 6 +- sound/isa/gus/gus_synth.c | 4 +- sound/isa/gus/gusextreme.c | 4 +- sound/isa/gus/gusmax.c | 2 +- sound/isa/gus/interwave.c | 14 +- sound/isa/opl3sa2.c | 14 +- sound/isa/opti9xx/miro.c | 4 +- sound/isa/opti9xx/opti92x-ad1848.c | 4 +- sound/isa/sb/emu8000.c | 22 +- sound/isa/sb/emu8000_patch.c | 2 +- sound/isa/sb/sb16.c | 5 +- sound/isa/sb/sb16_csp.c | 2 +- sound/isa/sb/sb8_midi.c | 20 +- sound/isa/sb/sb_common.c | 2 +- sound/isa/sgalaxy.c | 2 +- sound/isa/sscape.c | 5 +- sound/isa/wavefront/wavefront.c | 6 +- sound/isa/wavefront/wavefront_fx.c | 36 +- sound/isa/wavefront/wavefront_midi.c | 2 +- sound/isa/wavefront/wavefront_synth.c | 14 +- sound/mips/au1x00.c | 429 +- sound/oss/Kconfig | 60 +- sound/oss/ad1816.c | 1 - sound/oss/ad1848.c | 1 - sound/oss/ad1889.c | 3 +- sound/oss/aedsp16.c | 1 - sound/oss/ali5455.c | 2 +- sound/oss/au1000.c | 4 +- sound/oss/au1550_ac97.c | 99 +- sound/oss/btaudio.c | 2 +- sound/oss/cmpci.c | 2 +- sound/oss/cs4232.c | 3 +- sound/oss/cs4281/cs4281m.c | 2 +- sound/oss/cs46xx.c | 1274 +- sound/oss/dmabuf.c | 6 +- sound/oss/dmasound/dmasound.h | 1 - sound/oss/dmasound/dmasound_awacs.c | 17 +- sound/oss/dmasound/dmasound_paula.c | 1 - sound/oss/emu10k1/main.c | 2 +- sound/oss/emu10k1/midi.c | 2 +- sound/oss/es1370.c | 2 +- sound/oss/es1371.c | 2 +- sound/oss/esssolo1.c | 2 +- sound/oss/forte.c | 7 +- sound/oss/hal2.c | 2 +- sound/oss/i810_audio.c | 2 +- sound/oss/ite8172.c | 2 +- sound/oss/kahlua.c | 1 - sound/oss/maestro.c | 2 +- sound/oss/maestro3.c | 2 +- sound/oss/msnd.c | 2 +- sound/oss/msnd_classic.h | 1 - sound/oss/msnd_pinnacle.c | 1 - sound/oss/msnd_pinnacle.h | 1 - sound/oss/nec_vrc5477.c | 2 +- sound/oss/nm256_audio.c | 2 +- sound/oss/opl3sa2.c | 1 - sound/oss/pas2_card.c | 1 - sound/oss/pss.c | 1 - sound/oss/rme96xx.c | 2 +- sound/oss/sb_card.c | 1 - sound/oss/sb_common.c | 3 +- sound/oss/sb_ess.c | 28 +- sound/oss/sh_dac_audio.c | 3 +- sound/oss/sonicvibes.c | 2 +- sound/oss/sound_config.h | 1 - sound/oss/soundcard.c | 17 +- sound/oss/trident.c | 3 +- sound/oss/via82cxxx_audio.c | 12 +- sound/oss/vidc.c | 1 - sound/oss/waveartist.c | 1 - sound/oss/wavfront.c | 2 +- sound/oss/wf_midi.c | 2 +- sound/oss/ymfpci.c | 2 +- sound/pci/Kconfig | 224 +- sound/pci/Makefile | 1 + sound/pci/ac97/ac97_codec.c | 99 +- sound/pci/ac97/ac97_patch.c | 21 +- sound/pci/ac97/ac97_pcm.c | 10 + sound/pci/ac97/ac97_proc.c | 5 +- sound/pci/ac97/ak4531_codec.c | 2 +- sound/pci/ad1889.c | 12 +- sound/pci/ali5451/ali5451.c | 8 +- sound/pci/als300.c | 4 +- sound/pci/als4000.c | 6 +- sound/pci/atiixp.c | 6 +- sound/pci/atiixp_modem.c | 6 +- sound/pci/au88x0/au8810.c | 2 +- sound/pci/au88x0/au8820.c | 2 +- sound/pci/au88x0/au8830.c | 2 +- sound/pci/au88x0/au88x0.c | 15 +- sound/pci/au88x0/au88x0.h | 3 +- sound/pci/au88x0/au88x0_a3d.c | 29 +- sound/pci/au88x0/au88x0_core.c | 4 +- sound/pci/au88x0/au88x0_mpu401.c | 9 +- sound/pci/au88x0/au88x0_xtalk.c | 29 +- sound/pci/azt3328.c | 238 +- sound/pci/azt3328.h | 36 +- sound/pci/bt87x.c | 17 +- sound/pci/ca0106/ca0106.h | 142 +- sound/pci/ca0106/ca0106_main.c | 715 +- sound/pci/ca0106/ca0106_mixer.c | 685 +- sound/pci/ca0106/ca0106_proc.c | 99 +- sound/pci/cmipci.c | 14 +- sound/pci/cs4281.c | 20 +- sound/pci/cs46xx/cs46xx.c | 6 +- sound/pci/cs46xx/cs46xx_lib.c | 14 +- sound/pci/cs46xx/dsp_spos.c | 7 - sound/pci/cs46xx/dsp_spos_scb_lib.c | 6 +- sound/pci/cs5535audio/Makefile | 4 + sound/pci/cs5535audio/cs5535audio.c | 45 +- sound/pci/cs5535audio/cs5535audio.h | 8 + sound/pci/cs5535audio/cs5535audio_pcm.c | 26 +- sound/pci/emu10k1/emu10k1.c | 10 +- sound/pci/emu10k1/emu10k1_main.c | 96 +- sound/pci/emu10k1/emu10k1x.c | 481 +- sound/pci/emu10k1/emumixer.c | 54 +- sound/pci/emu10k1/emumpu401.c | 35 +- sound/pci/emu10k1/emuproc.c | 27 +- sound/pci/emu10k1/io.c | 4 + sound/pci/emu10k1/irq.c | 6 +- sound/pci/emu10k1/memory.c | 8 + sound/pci/emu10k1/tina2.h | 8 +- sound/pci/emu10k1/voice.c | 4 + sound/pci/ens1370.c | 6 +- sound/pci/es1938.c | 9 +- sound/pci/es1968.c | 9 +- sound/pci/fm801.c | 9 +- sound/pci/hda/Makefile | 2 +- sound/pci/hda/hda_codec.c | 829 +- sound/pci/hda/hda_intel.c | 20 +- sound/pci/hda/hda_patch.h | 9 + sound/pci/hda/hda_proc.c | 82 +- sound/pci/hda/patch_analog.c | 63 +- sound/pci/hda/patch_realtek.c | 1342 +- sound/pci/hda/patch_sigmatel.c | 183 +- sound/pci/ice1712/aureon.c | 28 +- sound/pci/ice1712/aureon.h | 1 + sound/pci/ice1712/ews.c | 3 + sound/pci/ice1712/ice1712.c | 47 +- sound/pci/ice1712/ice1712.h | 5 + sound/pci/ice1712/ice1724.c | 9 +- sound/pci/ice1712/pontis.c | 8 +- sound/pci/ice1712/revo.c | 23 +- sound/pci/intel8x0.c | 22 +- sound/pci/intel8x0m.c | 8 +- sound/pci/korg1212/korg1212.c | 6 +- sound/pci/maestro3.c | 15 +- sound/pci/mixart/mixart.c | 5 +- sound/pci/nm256/nm256.c | 4 +- sound/pci/pcxhr/pcxhr.c | 8 +- sound/pci/riptide/riptide.c | 10 +- sound/pci/rme32.c | 16 +- sound/pci/rme96.c | 48 +- sound/pci/rme9652/hdsp.c | 8 +- sound/pci/rme9652/hdspm.c | 4 +- sound/pci/rme9652/rme9652.c | 8 +- sound/pci/sonicvibes.c | 16 +- sound/pci/trident/trident.c | 5 +- sound/pci/trident/trident_main.c | 24 +- sound/pci/trident/trident_memory.c | 3 + sound/pci/trident/trident_synth.c | 4 +- sound/pci/via82xx.c | 16 +- sound/pci/via82xx_modem.c | 349 +- sound/pci/vx222/vx222.c | 4 +- sound/pci/ymfpci/ymfpci.c | 5 +- sound/pci/ymfpci/ymfpci_main.c | 4 +- sound/pcmcia/pdaudiocf/pdaudiocf.c | 4 +- sound/pcmcia/pdaudiocf/pdaudiocf_core.c | 2 +- sound/pcmcia/vx/vxp_ops.c | 2 +- sound/pcmcia/vx/vxpocket.c | 2 +- sound/ppc/Makefile | 2 +- sound/ppc/awacs.c | 3 +- sound/ppc/daca.c | 3 +- sound/ppc/keywest.c | 6 +- sound/ppc/pmac.c | 91 +- sound/ppc/pmac.h | 3 +- sound/ppc/powermac.c | 14 +- sound/ppc/toonie.c | 379 - sound/ppc/tumbler.c | 11 +- sound/sound_core.c | 7 - sound/sparc/amd7930.c | 146 +- sound/sparc/cs4231.c | 31 +- sound/sparc/dbri.c | 16 +- sound/synth/emux/emux.c | 12 +- sound/synth/emux/emux_proc.c | 1 - sound/synth/emux/emux_seq.c | 3 +- sound/synth/emux/emux_synth.c | 5 + sound/synth/emux/soundfont.c | 6 +- sound/usb/usbaudio.c | 53 +- sound/usb/usbaudio.h | 7 - sound/usb/usbmidi.c | 202 +- sound/usb/usbmixer.c | 70 +- sound/usb/usx2y/usbusx2yaudio.c | 18 +- sound/usb/usx2y/usx2yhwdeppcm.c | 248 +- usr/Makefile | 3 + 8384 files changed, 299747 insertions(+), 276807 deletions(-) delete mode 100644 Documentation/filesystems/devfs/ChangeLog delete mode 100644 Documentation/filesystems/devfs/README delete mode 100644 Documentation/filesystems/devfs/ToDo delete mode 100644 Documentation/filesystems/devfs/boot-options delete mode 100644 Documentation/filesystems/relayfs.txt delete mode 100644 Documentation/scsi/cpqfc.txt delete mode 100644 arch/arm/mach-at91rm9200/common.c delete mode 100644 arch/arm/mach-at91rm9200/time.c delete mode 100644 arch/i386/kernel/timers/Makefile delete mode 100644 arch/i386/kernel/timers/common.c delete mode 100644 arch/i386/kernel/timers/timer.c delete mode 100644 arch/i386/kernel/timers/timer_cyclone.c delete mode 100644 arch/i386/kernel/timers/timer_hpet.c delete mode 100644 arch/i386/kernel/timers/timer_none.c delete mode 100644 arch/i386/kernel/timers/timer_pit.c delete mode 100644 arch/i386/kernel/timers/timer_pm.c delete mode 100644 arch/i386/kernel/timers/timer_tsc.c delete mode 100644 arch/m68k/bvme6000/bvmeints.c delete mode 100644 arch/m68k/hp300/ints.c delete mode 100644 arch/m68k/hp300/ints.h delete mode 100644 arch/m68k/mvme147/147ints.c delete mode 100644 arch/m68k/mvme16x/16xints.c delete mode 100644 arch/mips/au1000/csb250/Makefile delete mode 100644 arch/mips/au1000/csb250/board_setup.c delete mode 100644 arch/mips/au1000/csb250/init.c delete mode 100644 arch/mips/au1000/csb250/irqmap.c delete mode 100644 arch/mips/au1000/hydrogen3/Makefile delete mode 100644 arch/mips/au1000/hydrogen3/board_setup.c delete mode 100644 arch/mips/au1000/hydrogen3/init.c delete mode 100644 arch/mips/au1000/hydrogen3/irqmap.c delete mode 100644 arch/mips/configs/ddb5476_defconfig delete mode 100644 arch/mips/ddb5xxx/ddb5074/Makefile delete mode 100644 arch/mips/ddb5xxx/ddb5074/irq.c delete mode 100644 arch/mips/ddb5xxx/ddb5074/nile4_pic.c delete mode 100644 arch/mips/ddb5xxx/ddb5074/setup.c delete mode 100644 arch/mips/ddb5xxx/ddb5476/Makefile delete mode 100644 arch/mips/ddb5xxx/ddb5476/dbg_io.c delete mode 100644 arch/mips/ddb5xxx/ddb5476/irq.c delete mode 100644 arch/mips/ddb5xxx/ddb5476/nile4_pic.c delete mode 100644 arch/mips/ddb5xxx/ddb5476/setup.c delete mode 100644 arch/mips/ddb5xxx/ddb5476/vrc5476_irq.c delete mode 100644 arch/mips/gt64120/common/pci.c delete mode 100644 arch/mips/mips-boards/sim/sim_IRQ.c delete mode 100644 arch/mips/mips-boards/sim/sim_irq.S delete mode 100644 arch/mips/pci/fixup-ddb5074.c delete mode 100644 arch/mips/pci/ops-ddb5074.c delete mode 100644 arch/mips/pci/ops-ddb5476.c delete mode 100644 arch/mips/pci/pci-ddb5074.c delete mode 100644 arch/mips/pci/pci-ddb5476.c delete mode 100644 arch/mips/vr41xx/common/vrc4173.c delete mode 100644 arch/powerpc/configs/mpc834x_sys_defconfig delete mode 100644 arch/powerpc/lib/bitops.c delete mode 100644 arch/powerpc/platforms/cell/spu_priv1.c delete mode 100644 arch/powerpc/platforms/iseries/iommu.h delete mode 100644 arch/powerpc/platforms/iseries/vio.c delete mode 100644 arch/powerpc/platforms/pseries/vio.c create mode 100644 arch/ppc/syslib/i8259.c create mode 100644 arch/ppc/syslib/ipic.c create mode 100644 arch/ppc/syslib/ipic.h delete mode 100644 arch/um/kernel/exec_kern.c delete mode 100644 arch/um/kernel/sigio_kern.c delete mode 100644 arch/um/kernel/signal_kern.c delete mode 100644 arch/um/kernel/syscall_kern.c delete mode 100644 arch/um/kernel/time_kern.c delete mode 100644 arch/um/kernel/trap_kern.c delete mode 100644 arch/x86_64/kernel/acpi/processor.c delete mode 100644 arch/x86_64/kernel/x8664_ksyms-xen.c delete mode 100644 configs/kernel-2.6.17-i586-smp.config delete mode 100644 configs/kernel-2.6.17-i586.config delete mode 100644 configs/kernel-2.6.17-i686-kdump.config delete mode 100644 configs/kernel-2.6.17-i686-smp.config delete mode 100644 configs/kernel-2.6.17-i686-xen.config delete mode 100644 configs/kernel-2.6.17-i686-xen0.config delete mode 100644 configs/kernel-2.6.17-i686-xenU.config delete mode 100644 configs/kernel-2.6.17-i686.config delete mode 100644 drivers/char/hw_random.c delete mode 100644 drivers/infiniband/hw/ipath/ips_common.h delete mode 100644 drivers/md/raid6main.c delete mode 100644 drivers/media/common/saa7146_vv_ksyms.c delete mode 100644 drivers/media/video/dsbr100.c delete mode 100644 drivers/message/fusion/lsi/fc_log.h delete mode 100644 drivers/net/fs_enet/fs_enet-mii.c delete mode 100644 drivers/net/fs_enet/mii-fixed.c delete mode 100644 drivers/parport/parport_arc.c delete mode 100644 drivers/pci/hotplug/acpiphp_dock.c delete mode 100644 drivers/s390/net/ctctty.c delete mode 100644 drivers/s390/net/ctctty.h create mode 100644 drivers/scsi/libiscsi.c delete mode 100644 drivers/scsi/qla2xxx/ql2100.c delete mode 100644 drivers/scsi/qla2xxx/ql2200.c delete mode 100644 drivers/scsi/qla2xxx/ql2300.c delete mode 100644 drivers/scsi/qla2xxx/ql2322.c delete mode 100644 drivers/scsi/qla2xxx/ql2400.c delete mode 100644 drivers/scsi/qla2xxx/qla_rscn.c delete mode 100644 drivers/usb/net/zd1201.c delete mode 100644 drivers/usb/net/zd1201.h delete mode 100644 drivers/usb/serial/anydata.c delete mode 100644 drivers/usb/serial/usb-serial.h delete mode 100644 drivers/video/aty/radeon_pm_whitelist.h delete mode 100644 drivers/w1/masters/ds_w1_bridge.c delete mode 100644 drivers/w1/masters/dscore.c delete mode 100644 drivers/w1/masters/dscore.h delete mode 100644 drivers/w1/w1_io.h delete mode 100644 drivers/xen/blktap/blktap.c delete mode 100644 fs/afs/cache.h delete mode 100644 fs/cifs/ntlmssp.c delete mode 100644 fs/devfs/Makefile delete mode 100644 fs/devfs/base.c delete mode 100644 fs/devfs/util.c delete mode 100644 fs/ext2/bitmap.c delete mode 100644 fs/jffs2/histo.h delete mode 100644 fs/ocfs2/dlm/dlmdebug.h delete mode 100644 fs/partitions/devfs.c delete mode 100644 fs/partitions/devfs.h delete mode 100644 fs/xfs/xfs_dir.c delete mode 100644 fs/xfs/xfs_dir.h delete mode 100644 fs/xfs/xfs_dir_leaf.c delete mode 100644 fs/xfs/xfs_dir_leaf.h delete mode 100644 fs/xfs/xfs_dir_sf.h delete mode 100644 include/asm-arm/arch-at91rm9200/pio.h delete mode 100644 include/asm-arm/mach/serial_at91rm9200.h delete mode 100644 include/asm-i386/mach-default/setup_arch_post.h delete mode 100644 include/asm-i386/mach-default/setup_arch_pre.h delete mode 100644 include/asm-i386/mach-visws/setup_arch_post.h delete mode 100644 include/asm-i386/mach-visws/setup_arch_pre.h delete mode 100644 include/asm-i386/mach-voyager/setup_arch_post.h delete mode 100644 include/asm-i386/mach-voyager/setup_arch_pre.h delete mode 100644 include/asm-i386/mach-xen/setup_arch_post.h delete mode 100644 include/asm-i386/mach-xen/setup_arch_pre.h delete mode 100644 include/asm-i386/node.h delete mode 100644 include/asm-mips/ddb5074.h delete mode 100644 include/asm-mips/ddb5xxx/ddb5074.h delete mode 100644 include/asm-mips/ddb5xxx/ddb5476.h delete mode 100644 include/asm-mips/interrupt.h delete mode 100644 include/asm-mips/mach-ddb5074/mc146818rtc.h delete mode 100644 include/asm-mips/mach-dec/param.h delete mode 100644 include/asm-mips/mach-generic/param.h delete mode 100644 include/asm-mips/mach-jazz/param.h delete mode 100644 include/asm-mips/mach-mips/param.h delete mode 100644 include/asm-mips/mach-qemu/param.h delete mode 100644 include/asm-mips/sn/sn0/sn0_fru.h delete mode 100644 include/asm-mips/vr41xx/e55.h delete mode 100644 include/asm-mips/vr41xx/vrc4173.h delete mode 100644 include/asm-mips/vr41xx/workpad.h delete mode 100644 include/asm-sparc64/vdev.h delete mode 100644 include/asm-x86_64/gart-mapping.h delete mode 100644 include/linux/devfs_fs.h delete mode 100644 include/linux/devfs_fs_kernel.h delete mode 100644 include/linux/isdn/tpam.h delete mode 100644 include/linux/jffs2_fs_i.h delete mode 100644 include/linux/jffs2_fs_sb.h delete mode 100644 include/linux/usb_cdc.h delete mode 100644 include/linux/usb_input.h delete mode 100644 include/linux/usb_isp116x.h delete mode 100644 include/linux/usb_sl811.h create mode 100644 include/scsi/libiscsi.h delete mode 100644 include/scsi/scsi_request.h delete mode 100644 include/scsi/sg_request.h delete mode 100644 include/xen/interface/sched_ctl.h delete mode 100644 init/do_mounts_devfs.c delete mode 100644 kernel/intermodule.c delete mode 100644 kernel/power/smp.c delete mode 100644 lib/zlib_inflate/infblock.c delete mode 100644 lib/zlib_inflate/infblock.h delete mode 100644 lib/zlib_inflate/infcodes.c delete mode 100644 lib/zlib_inflate/infcodes.h create mode 100644 lib/zlib_inflate/inffixed.h delete mode 100644 lib/zlib_inflate/inflate_sync.c delete mode 100644 lib/zlib_inflate/infutil.c delete mode 100644 scripts/basic/split-include.c delete mode 100644 sound/ppc/toonie.c diff --git a/.gitignore b/.gitignore index 27fd37621..e1d5c17c1 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,9 @@ *.ko *.so *.mod.c +*.i +*.lst +*.symtypes # # Top-level generic files @@ -30,6 +33,11 @@ include/config include/linux/autoconf.h include/linux/compile.h include/linux/version.h +include/linux/utsrelease.h # stgit generated dirs patches-* + +# quilt's files +patches +series diff --git a/CREDITS b/CREDITS index 9bf714a1c..0fe904ebb 100644 --- a/CREDITS +++ b/CREDITS @@ -24,6 +24,11 @@ S: C. Negri 6, bl. D3 S: Iasi 6600 S: Romania +N: Mark Adler +E: madler@alumni.caltech.edu +W: http://alumnus.caltech.edu/~madler/ +D: zlib decompression + N: Monalisa Agrawal E: magrawal@nortelnetworks.com D: Basic Interphase 5575 driver with UBR and ABR support. @@ -523,11 +528,11 @@ S: Oxford S: United Kingdom N: Luiz Fernando N. Capitulino -E: lcapitulino@terra.com.br -E: lcapitulino@prefeitura.sp.gov.br -W: http://www.telecentros.sp.gov.br -D: Little fixes and a lot of janitorial work -S: E-GOV Telecentros SP +E: lcapitulino@mandriva.com.br +E: lcapitulino@gmail.com +W: http://www.cpu.eti.br +D: misc kernel hacking +S: Mandriva S: Brazil N: Remy Card @@ -1573,12 +1578,8 @@ S: 160 00 Praha 6 S: Czech Republic N: Niels Kristian Bech Jensen -E: nkbj@image.dk -W: http://www.image.dk/~nkbj +E: nkbj1970@hotmail.com D: Miscellaneous kernel updates and fixes. -S: Dr. Holsts Vej 34, lejl. 164 -S: DK-8230 Ã…byhøj -S: Denmark N: Michael K. Johnson E: johnsonm@redhat.com @@ -2208,7 +2209,7 @@ S: (address available on request) S: USA N: Ian McDonald -E: iam4@cs.waikato.ac.nz +E: ian.mcdonald@jandi.co.nz E: imcdnzl@gmail.com W: http://wand.net.nz/~iam4 W: http://imcdnzl.blogspot.com @@ -3400,10 +3401,10 @@ S: Czech Republic N: Thibaut Varene E: T-Bone@parisc-linux.org -W: http://www.parisc-linux.org/ +W: http://www.parisc-linux.org/~varenet/ P: 1024D/B7D2F063 E67C 0D43 A75E 12A5 BB1C FA2F 1E32 C3DA B7D2 F063 D: PA-RISC port minion, PDC and GSCPS2 drivers, debuglocks and other bits -D: Some bits in an ARM port, S1D13XXX FB driver, random patches here and there +D: Some ARM at91rm9200 bits, S1D13XXX FB driver, random patches here and there D: AD1889 sound driver S: Paris, France diff --git a/Documentation/Changes b/Documentation/Changes index b02f476c2..488272074 100644 --- a/Documentation/Changes +++ b/Documentation/Changes @@ -181,8 +181,8 @@ Intel IA32 microcode -------------------- A driver has been added to allow updating of Intel IA32 microcode, -accessible as both a devfs regular file and as a normal (misc) -character device. If you are not using devfs you may need to: +accessible as a normal (misc) character device. If you are not using +udev you may need to: mkdir /dev/cpu mknod /dev/cpu/microcode c 10 184 @@ -201,7 +201,9 @@ with programs using shared memory. udev ---- udev is a userspace application for populating /dev dynamically with -only entries for devices actually present. udev replaces devfs. +only entries for devices actually present. udev replaces the basic +functionality of devfs, while allowing persistant device naming for +devices. FUSE ---- @@ -231,18 +233,13 @@ The PPP driver has been restructured to support multilink and to enable it to operate over diverse media layers. If you use PPP, upgrade pppd to at least 2.4.0. -If you are not using devfs, you must have the device file /dev/ppp +If you are not using udev, you must have the device file /dev/ppp which can be made by: mknod /dev/ppp c 108 0 as root. -If you use devfsd and build ppp support as modules, you will need -the following in your /etc/devfsd.conf file: - -LOOKUP PPP MODLOAD - Isdn4k-utils ------------ diff --git a/Documentation/CodingStyle b/Documentation/CodingStyle index ce5d2c038..6d2412ec9 100644 --- a/Documentation/CodingStyle +++ b/Documentation/CodingStyle @@ -155,7 +155,83 @@ problem, which is called the function-growth-hormone-imbalance syndrome. See next chapter. - Chapter 5: Functions + Chapter 5: Typedefs + +Please don't use things like "vps_t". + +It's a _mistake_ to use typedef for structures and pointers. When you see a + + vps_t a; + +in the source, what does it mean? + +In contrast, if it says + + struct virtual_container *a; + +you can actually tell what "a" is. + +Lots of people think that typedefs "help readability". Not so. They are +useful only for: + + (a) totally opaque objects (where the typedef is actively used to _hide_ + what the object is). + + Example: "pte_t" etc. opaque objects that you can only access using + the proper accessor functions. + + NOTE! Opaqueness and "accessor functions" are not good in themselves. + The reason we have them for things like pte_t etc. is that there + really is absolutely _zero_ portably accessible information there. + + (b) Clear integer types, where the abstraction _helps_ avoid confusion + whether it is "int" or "long". + + u8/u16/u32 are perfectly fine typedefs, although they fit into + category (d) better than here. + + NOTE! Again - there needs to be a _reason_ for this. If something is + "unsigned long", then there's no reason to do + + typedef unsigned long myflags_t; + + but if there is a clear reason for why it under certain circumstances + might be an "unsigned int" and under other configurations might be + "unsigned long", then by all means go ahead and use a typedef. + + (c) when you use sparse to literally create a _new_ type for + type-checking. + + (d) New types which are identical to standard C99 types, in certain + exceptional circumstances. + + Although it would only take a short amount of time for the eyes and + brain to become accustomed to the standard types like 'uint32_t', + some people object to their use anyway. + + Therefore, the Linux-specific 'u8/u16/u32/u64' types and their + signed equivalents which are identical to standard types are + permitted -- although they are not mandatory in new code of your + own. + + When editing existing code which already uses one or the other set + of types, you should conform to the existing choices in that code. + + (e) Types safe for use in userspace. + + In certain structures which are visible to userspace, we cannot + require C99 types and cannot use the 'u32' form above. Thus, we + use __u32 and similar types in all structures which are shared + with userspace. + +Maybe there are other cases too, but the rule should basically be to NEVER +EVER use a typedef unless you can clearly match one of those rules. + +In general, a pointer, or a struct that has elements that can reasonably +be directly accessed should _never_ be a typedef. + + + Chapter 6: Functions Functions should be short and sweet, and do just one thing. They should fit on one or two screenfuls of text (the ISO/ANSI screen size is 80x24, @@ -183,7 +259,7 @@ and it gets confused. You know you're brilliant, but maybe you'd like to understand what you did 2 weeks from now. - Chapter 6: Centralized exiting of functions + Chapter 7: Centralized exiting of functions Albeit deprecated by some people, the equivalent of the goto statement is used frequently by compilers in form of the unconditional jump instruction. @@ -220,7 +296,7 @@ out: return result; } - Chapter 7: Commenting + Chapter 8: Commenting Comments are good, but there is also a danger of over-commenting. NEVER try to explain HOW your code works in a comment: it's much better to @@ -240,7 +316,7 @@ When commenting the kernel API functions, please use the kerneldoc format. See the files Documentation/kernel-doc-nano-HOWTO.txt and scripts/kernel-doc for details. - Chapter 8: You've made a mess of it + Chapter 9: You've made a mess of it That's OK, we all do. You've probably been told by your long-time Unix user helper that "GNU emacs" automatically formats the C sources for @@ -288,7 +364,7 @@ re-formatting you may want to take a look at the man page. But remember: "indent" is not a fix for bad programming. - Chapter 9: Configuration-files + Chapter 10: Configuration-files For configuration options (arch/xxx/Kconfig, and all the Kconfig files), somewhat different indentation is used. @@ -313,7 +389,7 @@ support for file-systems, for instance) should be denoted (DANGEROUS), other experimental options should be denoted (EXPERIMENTAL). - Chapter 10: Data structures + Chapter 11: Data structures Data structures that have visibility outside the single-threaded environment they are created and destroyed in should always have @@ -344,7 +420,7 @@ Remember: if another thread can find your data structure, and you don't have a reference count on it, you almost certainly have a bug. - Chapter 11: Macros, Enums and RTL + Chapter 12: Macros, Enums and RTL Names of macros defining constants and labels in enums are capitalized. @@ -399,7 +475,7 @@ The cpp manual deals with macros exhaustively. The gcc internals manual also covers RTL which is used frequently with assembly language in the kernel. - Chapter 12: Printing kernel messages + Chapter 13: Printing kernel messages Kernel developers like to be seen as literate. Do mind the spelling of kernel messages to make a good impression. Do not use crippled @@ -410,7 +486,7 @@ Kernel messages do not have to be terminated with a period. Printing numbers in parentheses (%d) adds no value and should be avoided. - Chapter 13: Allocating memory + Chapter 14: Allocating memory The kernel provides the following general purpose memory allocators: kmalloc(), kzalloc(), kcalloc(), and vmalloc(). Please refer to the API @@ -429,7 +505,7 @@ from void pointer to any other pointer type is guaranteed by the C programming language. - Chapter 14: The inline disease + Chapter 15: The inline disease There appears to be a common misperception that gcc has a magic "make me faster" speedup option called "inline". While the use of inlines can be @@ -457,7 +533,7 @@ something it would have done anyway. - Chapter 15: References + Appendix I: References The C Programming Language, Second Edition by Brian W. Kernighan and Dennis M. Ritchie. @@ -481,4 +557,4 @@ Kernel CodingStyle, by greg@kroah.com at OLS 2002: http://www.kroah.com/linux/talks/ols_2002_kernel_codingstyle_talk/html/ -- -Last updated on 30 December 2005 by a community effort on LKML. +Last updated on 30 April 2006. diff --git a/Documentation/DMA-mapping.txt b/Documentation/DMA-mapping.txt index 7c7176990..63392c913 100644 --- a/Documentation/DMA-mapping.txt +++ b/Documentation/DMA-mapping.txt @@ -698,12 +698,12 @@ these interfaces. Remember that, as defined, consistent mappings are always going to be SAC addressable. The first thing your driver needs to do is query the PCI platform -layer with your devices DAC addressing capabilities: +layer if it is capable of handling your devices DAC addressing +capabilities: - int pci_dac_set_dma_mask(struct pci_dev *pdev, u64 mask); + int pci_dac_dma_supported(struct pci_dev *hwdev, u64 mask); -This routine behaves identically to pci_set_dma_mask. You may not -use the following interfaces if this routine fails. +You may not use the following interfaces if this routine fails. Next, DMA addresses using this API are kept track of using the dma64_addr_t type. It is guaranteed to be big enough to hold any diff --git a/Documentation/DocBook/Makefile b/Documentation/DocBook/Makefile index 5a2882d27..66e1cf733 100644 --- a/Documentation/DocBook/Makefile +++ b/Documentation/DocBook/Makefile @@ -10,7 +10,8 @@ DOCBOOKS := wanbook.xml z8530book.xml mcabook.xml videobook.xml \ kernel-hacking.xml kernel-locking.xml deviceiobook.xml \ procfs-guide.xml writing_usb_driver.xml \ kernel-api.xml journal-api.xml lsm.xml usb.xml \ - gadget.xml libata.xml mtdnand.xml librs.xml rapidio.xml + gadget.xml libata.xml mtdnand.xml librs.xml rapidio.xml \ + genericirq.xml ### # The build process is as follows (targets): diff --git a/Documentation/DocBook/kernel-api.tmpl b/Documentation/DocBook/kernel-api.tmpl index ca02e04a9..f8fe882e3 100644 --- a/Documentation/DocBook/kernel-api.tmpl +++ b/Documentation/DocBook/kernel-api.tmpl @@ -58,10 +58,15 @@ !Iinclude/linux/ktime.h !Iinclude/linux/hrtimer.h !Ekernel/hrtimer.c + + Workqueues and Kevents +!Ekernel/workqueue.c Internal Functions !Ikernel/exit.c !Ikernel/signal.c +!Iinclude/linux/kthread.h +!Ekernel/kthread.c Kernel objects manipulation @@ -114,9 +119,33 @@ X!Ilib/string.c + + Basic Kernel Library Functions + + + The Linux kernel provides more basic utility functions. + + + Bitmap Operations +!Elib/bitmap.c +!Ilib/bitmap.c + + + Command-line Parsing +!Elib/cmdline.c + + + CRC Functions +!Elib/crc16.c +!Elib/crc32.c +!Elib/crc-ccitt.c + + + Memory Management in Linux The Slab Cache +!Iinclude/linux/slab.h !Emm/slab.c User Space Memory Access @@ -274,20 +303,19 @@ X!Ekernel/module.c Resources Management -!Ekernel/resource.c +!Ikernel/resource.c MTRR Handling !Earch/i386/kernel/cpu/mtrr/main.c + PCI Support Library !Edrivers/pci/pci.c !Edrivers/pci/pci-driver.c !Edrivers/pci/remove.c !Edrivers/pci/pci-acpi.c - +!Edrivers/pci/search.c !Edrivers/pci/msi.c !Edrivers/pci/bus.c diff --git a/Documentation/DocBook/videobook.tmpl b/Documentation/DocBook/videobook.tmpl index fdff984a5..b629da339 100644 --- a/Documentation/DocBook/videobook.tmpl +++ b/Documentation/DocBook/videobook.tmpl @@ -976,7 +976,7 @@ static int camera_close(struct video_device *dev) Interrupt Handling Our example handler is for an ISA bus device. If it was PCI you would be - able to share the interrupt and would have set SA_SHIRQ to indicate a + able to share the interrupt and would have set IRQF_SHARED to indicate a shared IRQ. We pass the device pointer as the interrupt routine argument. We don't need to since we only support one card but doing this will make it easier to upgrade the driver for multiple devices in the future. diff --git a/Documentation/IPMI.txt b/Documentation/IPMI.txt index bf1cf98d2..0256805b5 100644 --- a/Documentation/IPMI.txt +++ b/Documentation/IPMI.txt @@ -10,7 +10,7 @@ standard for controlling intelligent devices that monitor a system. It provides for dynamic discovery of sensors in the system and the ability to monitor the sensors and be informed when the sensor's values change or go outside certain boundaries. It also has a -standardized database for field-replacable units (FRUs) and a watchdog +standardized database for field-replaceable units (FRUs) and a watchdog timer. To use this, you need an interface to an IPMI controller in your @@ -64,7 +64,7 @@ situation, you need to read the section below named 'The SI Driver' or IPMI defines a standard watchdog timer. You can enable this with the 'IPMI Watchdog Timer' config option. If you compile the driver into the kernel, then via a kernel command-line option you can have the -watchdog timer start as soon as it intitializes. It also have a lot +watchdog timer start as soon as it initializes. It also have a lot of other options, see the 'Watchdog' section below for more details. Note that you can also have the watchdog continue to run if it is closed (by default it is disabled on close). Go into the 'Watchdog diff --git a/Documentation/RCU/checklist.txt b/Documentation/RCU/checklist.txt index 49e27cc19..1d50cf0c9 100644 --- a/Documentation/RCU/checklist.txt +++ b/Documentation/RCU/checklist.txt @@ -144,9 +144,47 @@ over a rather long period of time, but improvements are always welcome! whether the increased speed is worth it. 8. Although synchronize_rcu() is a bit slower than is call_rcu(), - it usually results in simpler code. So, unless update performance - is important or the updaters cannot block, synchronize_rcu() - should be used in preference to call_rcu(). + it usually results in simpler code. So, unless update + performance is critically important or the updaters cannot block, + synchronize_rcu() should be used in preference to call_rcu(). + + An especially important property of the synchronize_rcu() + primitive is that it automatically self-limits: if grace periods + are delayed for whatever reason, then the synchronize_rcu() + primitive will correspondingly delay updates. In contrast, + code using call_rcu() should explicitly limit update rate in + cases where grace periods are delayed, as failing to do so can + result in excessive realtime latencies or even OOM conditions. + + Ways of gaining this self-limiting property when using call_rcu() + include: + + a. Keeping a count of the number of data-structure elements + used by the RCU-protected data structure, including those + waiting for a grace period to elapse. Enforce a limit + on this number, stalling updates as needed to allow + previously deferred frees to complete. + + Alternatively, limit only the number awaiting deferred + free rather than the total number of elements. + + b. Limiting update rate. For example, if updates occur only + once per hour, then no explicit rate limiting is required, + unless your system is already badly broken. The dcache + subsystem takes this approach -- updates are guarded + by a global lock, limiting their rate. + + c. Trusted update -- if updates can only be done manually by + superuser or some other trusted user, then it might not + be necessary to automatically limit them. The theory + here is that superuser already has lots of ways to crash + the machine. + + d. Use call_rcu_bh() rather than call_rcu(), in order to take + advantage of call_rcu_bh()'s faster grace periods. + + e. Periodically invoke synchronize_rcu(), permitting a limited + number of updates per grace period. 9. All RCU list-traversal primitives, which include list_for_each_rcu(), list_for_each_entry_rcu(), diff --git a/Documentation/RCU/torture.txt b/Documentation/RCU/torture.txt index e4c38152f..a49485916 100644 --- a/Documentation/RCU/torture.txt +++ b/Documentation/RCU/torture.txt @@ -7,7 +7,7 @@ The CONFIG_RCU_TORTURE_TEST config option is available for all RCU implementations. It creates an rcutorture kernel module that can be loaded to run a torture test. The test periodically outputs status messages via printk(), which can be examined via the dmesg -command (perhaps grepping for "rcutorture"). The test is started +command (perhaps grepping for "torture"). The test is started when the module is loaded, and stops when the module is unloaded. However, actually setting this config option to "y" results in the system @@ -35,6 +35,19 @@ stat_interval The number of seconds between output of torture be printed -only- when the module is unloaded, and this is the default. +shuffle_interval + The number of seconds to keep the test threads affinitied + to a particular subset of the CPUs. Used in conjunction + with test_no_idle_hz. + +test_no_idle_hz Whether or not to test the ability of RCU to operate in + a kernel that disables the scheduling-clock interrupt to + idle CPUs. Boolean parameter, "1" to test, "0" otherwise. + +torture_type The type of RCU to test: "rcu" for the rcu_read_lock() + API, "rcu_bh" for the rcu_read_lock_bh() API, and "srcu" + for the "srcu_read_lock()" API. + verbose Enable debug printk()s. Default is disabled. @@ -42,14 +55,14 @@ OUTPUT The statistics output is as follows: - rcutorture: --- Start of test: nreaders=16 stat_interval=0 verbose=0 - rcutorture: rtc: 0000000000000000 ver: 1916 tfle: 0 rta: 1916 rtaf: 0 rtf: 1915 - rcutorture: Reader Pipe: 1466408 9747 0 0 0 0 0 0 0 0 0 - rcutorture: Reader Batch: 1464477 11678 0 0 0 0 0 0 0 0 - rcutorture: Free-Block Circulation: 1915 1915 1915 1915 1915 1915 1915 1915 1915 1915 0 - rcutorture: --- End of test + rcu-torture: --- Start of test: nreaders=16 stat_interval=0 verbose=0 + rcu-torture: rtc: 0000000000000000 ver: 1916 tfle: 0 rta: 1916 rtaf: 0 rtf: 1915 + rcu-torture: Reader Pipe: 1466408 9747 0 0 0 0 0 0 0 0 0 + rcu-torture: Reader Batch: 1464477 11678 0 0 0 0 0 0 0 0 + rcu-torture: Free-Block Circulation: 1915 1915 1915 1915 1915 1915 1915 1915 1915 1915 0 + rcu-torture: --- End of test -The command "dmesg | grep rcutorture:" will extract this information on +The command "dmesg | grep torture:" will extract this information on most systems. On more esoteric configurations, it may be necessary to use other commands to access the output of the printk()s used by the RCU torture test. The printk()s use KERN_ALERT, so they should @@ -115,8 +128,9 @@ The following script may be used to torture RCU: modprobe rcutorture sleep 100 rmmod rcutorture - dmesg | grep rcutorture: + dmesg | grep torture: The output can be manually inspected for the error flag of "!!!". One could of course create a more elaborate script that automatically -checked for such errors. +checked for such errors. The "rmmod" command forces a "SUCCESS" or +"FAILURE" indication to be printk()ed. diff --git a/Documentation/RCU/whatisRCU.txt b/Documentation/RCU/whatisRCU.txt index 07cb93b82..318df4425 100644 --- a/Documentation/RCU/whatisRCU.txt +++ b/Documentation/RCU/whatisRCU.txt @@ -184,7 +184,17 @@ synchronize_rcu() blocking, it registers a function and argument which are invoked after all ongoing RCU read-side critical sections have completed. This callback variant is particularly useful in situations where - it is illegal to block. + it is illegal to block or where update-side performance is + critically important. + + However, the call_rcu() API should not be used lightly, as use + of the synchronize_rcu() API generally results in simpler code. + In addition, the synchronize_rcu() API has the nice property + of automatically limiting update rate should grace periods + be delayed. This property results in system resilience in face + of denial-of-service attacks. Code using call_rcu() should limit + update rate in order to gain this same sort of resilience. See + checklist.txt for some approaches to limiting the update rate. rcu_assign_pointer() @@ -677,8 +687,9 @@ diff shows how closely related RCU and reader-writer locking can be. + spin_lock(&listmutex); list_for_each_entry(p, head, lp) { if (p->key == key) { - list_del(&p->list); + - list_del(&p->list); - write_unlock(&listmutex); + + list_del_rcu(&p->list); + spin_unlock(&listmutex); + synchronize_rcu(); kfree(p); @@ -726,7 +737,7 @@ Or, for those who prefer a side-by-side listing: 5 write_lock(&listmutex); 5 spin_lock(&listmutex); 6 list_for_each_entry(p, head, lp) { 6 list_for_each_entry(p, head, lp) { 7 if (p->key == key) { 7 if (p->key == key) { - 8 list_del(&p->list); 8 list_del(&p->list); + 8 list_del(&p->list); 8 list_del_rcu(&p->list); 9 write_unlock(&listmutex); 9 spin_unlock(&listmutex); 10 synchronize_rcu(); 10 kfree(p); 11 kfree(p); @@ -790,7 +801,6 @@ RCU pointer update: RCU grace period: - synchronize_kernel (deprecated) synchronize_net synchronize_sched synchronize_rcu diff --git a/Documentation/README.DAC960 b/Documentation/README.DAC960 index 98ea617a0..0e8f618ab 100644 --- a/Documentation/README.DAC960 +++ b/Documentation/README.DAC960 @@ -78,9 +78,9 @@ also known as "System Drives", and Drive Groups are also called "Packs". Both terms are in use in the Mylex documentation; I have chosen to standardize on the more generic "Logical Drive" and "Drive Group". -DAC960 RAID disk devices are named in the style of the Device File System -(DEVFS). The device corresponding to Logical Drive D on Controller C is -referred to as /dev/rd/cCdD, and the partitions are called /dev/rd/cCdDp1 +DAC960 RAID disk devices are named in the style of the obsolete Device File +System (DEVFS). The device corresponding to Logical Drive D on Controller C +is referred to as /dev/rd/cCdD, and the partitions are called /dev/rd/cCdDp1 through /dev/rd/cCdDp7. For example, partition 3 of Logical Drive 5 on Controller 2 is referred to as /dev/rd/c2d5p3. Note that unlike with SCSI disks the device names will not change in the event of a disk drive failure. diff --git a/Documentation/SubmittingPatches b/Documentation/SubmittingPatches index c2c85bcb3..d42ab4c9e 100644 --- a/Documentation/SubmittingPatches +++ b/Documentation/SubmittingPatches @@ -10,7 +10,9 @@ kernel, the process can sometimes be daunting if you're not familiar with "the system." This text is a collection of suggestions which can greatly increase the chances of your change being accepted. -If you are submitting a driver, also read Documentation/SubmittingDrivers. +Read Documentation/SubmitChecklist for a list of items to check +before submitting code. If you are submitting a driver, also read +Documentation/SubmittingDrivers. @@ -74,9 +76,6 @@ There are a number of scripts which can aid in this: Quilt: http://savannah.nongnu.org/projects/quilt -Randy Dunlap's patch scripts: -http://www.xenotime.net/linux/scripts/patching-scripts-002.tar.gz - Andrew Morton's patch scripts: http://www.zip.com.au/~akpm/linux/patches/ Instead of these scripts, quilt is the recommended patch management @@ -309,6 +308,8 @@ then you just add a line saying Signed-off-by: Random J Developer +using your real name (sorry, no pseudonyms or anonymous contributions.) + Some people also put extra tags at the end. They'll just be ignored for now, but you can do this to mark internal company procedures or just point out some special detail about the sign-off. @@ -484,7 +485,7 @@ Greg Kroah-Hartman "How to piss off a kernel subsystem maintainer". -NO!!!! No more huge patch bombs to linux-kernel@vger.kernel.org people!. +NO!!!! No more huge patch bombs to linux-kernel@vger.kernel.org people! Kernel Documentation/CodingStyle @@ -493,4 +494,3 @@ Kernel Documentation/CodingStyle Linus Torvald's mail on the canonical patch format: -- -Last updated on 17 Nov 2005. diff --git a/Documentation/arm/IXP4xx b/Documentation/arm/IXP4xx index d4c6d3aa0..43edb4ecf 100644 --- a/Documentation/arm/IXP4xx +++ b/Documentation/arm/IXP4xx @@ -85,7 +85,7 @@ IXP4xx provides two methods of accessing PCI memory space: 2) If > 64MB of memory space is required, the IXP4xx can be configured to use indirect registers to access PCI This allows for up to 128MB (0x48000000 to 0x4fffffff) of memory on the bus. - The disadvantadge of this is that every PCI access requires + The disadvantage of this is that every PCI access requires three local register accesses plus a spinlock, but in some cases the performance hit is acceptable. In addition, you cannot mmap() PCI devices in this case due to the indirect nature diff --git a/Documentation/arm/Samsung-S3C24XX/Overview.txt b/Documentation/arm/Samsung-S3C24XX/Overview.txt index 8c6ee6841..3e46d2a31 100644 --- a/Documentation/arm/Samsung-S3C24XX/Overview.txt +++ b/Documentation/arm/Samsung-S3C24XX/Overview.txt @@ -7,11 +7,13 @@ Introduction ------------ The Samsung S3C24XX range of ARM9 System-on-Chip CPUs are supported - by the 's3c2410' architecture of ARM Linux. Currently the S3C2410 and - the S3C2440 are supported CPUs. + by the 's3c2410' architecture of ARM Linux. Currently the S3C2410, + S3C2440 and S3C2442 devices are supported. Support for the S3C2400 series is in progress. + Support for the S3C2412 and S3C2413 CPUs is being merged. + Configuration ------------- @@ -43,9 +45,18 @@ Machines Samsung's own development board, geared for PDA work. + Samsung/Aiji SMDK2412 + + The S3C2412 version of the SMDK2440. + + Samsung/Aiji SMDK2413 + + The S3C2412 version of the SMDK2440. + Samsung/Meritech SMDK2440 - The S3C2440 compatible version of the SMDK2440 + The S3C2440 compatible version of the SMDK2440, which has the + option of an S3C2440 or S3C2442 CPU module. Thorcom VR1000 @@ -211,24 +222,6 @@ Port Contributors Lucas Correia Villa Real (S3C2400 port) -Document Changes ----------------- - - 05 Sep 2004 - BJD - Added Document Changes section - 05 Sep 2004 - BJD - Added Klaus Fetscher to list of contributors - 25 Oct 2004 - BJD - Added Dimitry Andric to list of contributors - 25 Oct 2004 - BJD - Updated the MTD from the 2.6.9 merge - 21 Jan 2005 - BJD - Added rx3715, added Shannon to contributors - 10 Feb 2005 - BJD - Added Guillaume Gourat to contributors - 02 Mar 2005 - BJD - Added SMDK2440 to list of machines - 06 Mar 2005 - BJD - Added Christer Weinigel - 08 Mar 2005 - BJD - Added LCVR to list of people, updated introduction - 08 Mar 2005 - BJD - Added section on adding machines - 09 Sep 2005 - BJD - Added section on platform data - 11 Feb 2006 - BJD - Added I2C, RTC and Watchdog sections - 11 Feb 2006 - BJD - Added Osiris machine, and S3C2400 information - - Document Author --------------- diff --git a/Documentation/atomic_ops.txt b/Documentation/atomic_ops.txt index 8eedaa24f..2a63d5662 100644 --- a/Documentation/atomic_ops.txt +++ b/Documentation/atomic_ops.txt @@ -115,6 +115,33 @@ boolean is return which indicates whether the resulting counter value is negative. It requires explicit memory barrier semantics around the operation. +Then: + + int atomic_cmpxchg(atomic_t *v, int old, int new); + +This performs an atomic compare exchange operation on the atomic value v, +with the given old and new values. Like all atomic_xxx operations, +atomic_cmpxchg will only satisfy its atomicity semantics as long as all +other accesses of *v are performed through atomic_xxx operations. + +atomic_cmpxchg requires explicit memory barriers around the operation. + +The semantics for atomic_cmpxchg are the same as those defined for 'cas' +below. + +Finally: + + int atomic_add_unless(atomic_t *v, int a, int u); + +If the atomic value v is not equal to u, this function adds a to v, and +returns non zero. If v is equal to u then it returns zero. This is done as +an atomic operation. + +atomic_add_unless requires explicit memory barriers around the operation. + +atomic_inc_not_zero, equivalent to atomic_add_unless(v, 1, 0) + + If a caller requires memory barrier semantics around an atomic_t operation which does not return a value, a set of interfaces are defined which accomplish this: @@ -130,13 +157,13 @@ For example, smp_mb__before_atomic_dec() can be used like so: smp_mb__before_atomic_dec(); atomic_dec(&obj->ref_count); -It makes sure that all memory operations preceeding the atomic_dec() +It makes sure that all memory operations preceding the atomic_dec() call are strongly ordered with respect to the atomic counter -operation. In the above example, it guarentees that the assignment of +operation. In the above example, it guarantees that the assignment of "1" to obj->dead will be globally visible to other cpus before the atomic counter decrement. -Without the explicitl smp_mb__before_atomic_dec() call, the +Without the explicit smp_mb__before_atomic_dec() call, the implementation could legally allow the atomic counter update visible to other cpus before the "obj->dead = 1;" assignment. @@ -146,11 +173,11 @@ ordering with respect to memory operations after an atomic_dec() call (smp_mb__{before,after}_atomic_inc()). A missing memory barrier in the cases where they are required by the -atomic_t implementation above can have disasterous results. Here is -an example, which follows a pattern occuring frequently in the Linux +atomic_t implementation above can have disastrous results. Here is +an example, which follows a pattern occurring frequently in the Linux kernel. It is the use of atomic counters to implement reference counting, and it works such that once the counter falls to zero it can -be guarenteed that no other entity can be accessing the object: +be guaranteed that no other entity can be accessing the object: static void obj_list_add(struct obj *obj) { @@ -264,9 +291,9 @@ to the size of an "unsigned long" C data type, and are least of that size. The endianness of the bits within each "unsigned long" are the native endianness of the cpu. - void set_bit(unsigned long nr, volatils unsigned long *addr); - void clear_bit(unsigned long nr, volatils unsigned long *addr); - void change_bit(unsigned long nr, volatils unsigned long *addr); + void set_bit(unsigned long nr, volatile unsigned long *addr); + void clear_bit(unsigned long nr, volatile unsigned long *addr); + void change_bit(unsigned long nr, volatile unsigned long *addr); These routines set, clear, and change, respectively, the bit number indicated by "nr" on the bit mask pointed to by "ADDR". @@ -274,9 +301,9 @@ indicated by "nr" on the bit mask pointed to by "ADDR". They must execute atomically, yet there are no implicit memory barrier semantics required of these interfaces. - int test_and_set_bit(unsigned long nr, volatils unsigned long *addr); - int test_and_clear_bit(unsigned long nr, volatils unsigned long *addr); - int test_and_change_bit(unsigned long nr, volatils unsigned long *addr); + int test_and_set_bit(unsigned long nr, volatile unsigned long *addr); + int test_and_clear_bit(unsigned long nr, volatile unsigned long *addr); + int test_and_change_bit(unsigned long nr, volatile unsigned long *addr); Like the above, except that these routines return a boolean which indicates whether the changed bit was set _BEFORE_ the atomic bit @@ -308,7 +335,7 @@ subsequent memory operation is made visible. For example: /* ... */; obj->killed = 1; -The implementation of test_and_set_bit() must guarentee that +The implementation of test_and_set_bit() must guarantee that "obj->dead = 1;" is visible to cpus before the atomic memory operation done by test_and_set_bit() becomes visible. Likewise, the atomic memory operation done by test_and_set_bit() must become visible before @@ -447,7 +474,7 @@ Now, as far as memory barriers go, as long as spin_lock() strictly orders all subsequent memory operations (including the cas()) with respect to itself, things will be fine. -Said another way, _atomic_dec_and_lock() must guarentee that +Said another way, _atomic_dec_and_lock() must guarantee that a counter dropping to zero is never made visible before the spinlock being acquired. diff --git a/Documentation/cciss.txt b/Documentation/cciss.txt index 15378422f..9c629ffa0 100644 --- a/Documentation/cciss.txt +++ b/Documentation/cciss.txt @@ -20,6 +20,7 @@ This driver is known to work with the following cards: * SA P400i * SA E200 * SA E200i + * SA E500 If nodes are not already created in the /dev/cciss directory, run as root: diff --git a/Documentation/cpu-freq/user-guide.txt b/Documentation/cpu-freq/user-guide.txt index 7fedc00c3..555c8cf36 100644 --- a/Documentation/cpu-freq/user-guide.txt +++ b/Documentation/cpu-freq/user-guide.txt @@ -153,10 +153,13 @@ scaling_governor, and by "echoing" the name of another that some governors won't load - they only work on some specific architectures or processors. -scaling_min_freq and +scaling_min_freq and scaling_max_freq show the current "policy limits" (in kHz). By echoing new values into these files, you can change these limits. + NOTE: when setting a policy you need to + first set scaling_max_freq, then + scaling_min_freq. If you have selected the "userspace" governor which allows you to diff --git a/Documentation/cpu-hotplug.txt b/Documentation/cpu-hotplug.txt index 1bcf69996..bc107cb15 100644 --- a/Documentation/cpu-hotplug.txt +++ b/Documentation/cpu-hotplug.txt @@ -251,16 +251,24 @@ A: This is what you would need in your kernel code to receive notifications. return NOTIFY_OK; } - static struct notifier_block foobar_cpu_notifer = + static struct notifier_block __cpuinitdata foobar_cpu_notifer = { .notifier_call = foobar_cpu_callback, }; +You need to call register_cpu_notifier() from your init function. +Init functions could be of two types: +1. early init (init function called when only the boot processor is online). +2. late init (init function called _after_ all the CPUs are online). -In your init function, +For the first case, you should add the following to your init function register_cpu_notifier(&foobar_cpu_notifier); +For the second case, you should add the following to your init function + + register_hotcpu_notifier(&foobar_cpu_notifier); + You can fail PREPARE notifiers if something doesn't work to prepare resources. This will stop the activity and send a following CANCELED event back. diff --git a/Documentation/cpusets.txt b/Documentation/cpusets.txt index 2f8f24eae..76b44290c 100644 --- a/Documentation/cpusets.txt +++ b/Documentation/cpusets.txt @@ -4,8 +4,9 @@ Copyright (C) 2004 BULL SA. Written by Simon.Derr@bull.net -Portions Copyright (c) 2004 Silicon Graphics, Inc. +Portions Copyright (c) 2004-2006 Silicon Graphics, Inc. Modified by Paul Jackson +Modified by Christoph Lameter CONTENTS: ========= @@ -14,7 +15,11 @@ CONTENTS: 1.1 What are cpusets ? 1.2 Why are cpusets needed ? 1.3 How are cpusets implemented ? - 1.4 How do I use cpusets ? + 1.4 What are exclusive cpusets ? + 1.5 What does notify_on_release do ? + 1.6 What is memory_pressure ? + 1.7 What is memory spread ? + 1.8 How do I use cpusets ? 2. Usage Examples and Syntax 2.1 Basic Usage 2.2 Adding/removing cpus @@ -49,9 +54,6 @@ its cpus_allowed vector, and the kernel page allocator will not allocate a page on a node that is not allowed in the requesting tasks mems_allowed vector. -If a cpuset is cpu or mem exclusive, no other cpuset, other than a direct -ancestor or descendent, may share any of the same CPUs or Memory Nodes. - User level code may create and destroy cpusets by name in the cpuset virtual file system, manage the attributes and permissions of these cpusets and which CPUs and Memory Nodes are assigned to each cpuset, @@ -74,7 +76,7 @@ the available CPU and Memory resources amongst the requesting tasks. But larger systems, which benefit more from careful processor and memory placement to reduce memory access times and contention, and which typically represent a larger investment for the customer, -can benefit from explictly placing jobs on properly sized subsets of +can benefit from explicitly placing jobs on properly sized subsets of the system. This can be especially valuable on: @@ -84,10 +86,14 @@ This can be especially valuable on: and a database), or * NUMA systems running large HPC applications with demanding performance characteristics. + * Also cpu_exclusive cpusets are useful for servers running orthogonal + workloads such as RT applications requiring low latency and HPC + applications that are throughput sensitive These subsets, or "soft partitions" must be able to be dynamically adjusted, as the job mix changes, without impacting other concurrently -executing jobs. +executing jobs. The location of the running jobs pages may also be moved +when the memory locations are changed. The kernel cpuset patch provides the minimum essential kernel mechanisms required to efficiently implement such subsets. It @@ -99,8 +105,8 @@ memory allocator code. 1.3 How are cpusets implemented ? --------------------------------- -Cpusets provide a Linux kernel (2.6.7 and above) mechanism to constrain -which CPUs and Memory Nodes are used by a process or set of processes. +Cpusets provide a Linux kernel mechanism to constrain which CPUs and +Memory Nodes are used by a process or set of processes. The Linux kernel already has a pair of mechanisms to specify on which CPUs a task may be scheduled (sched_setaffinity) and on which Memory @@ -125,20 +131,25 @@ Cpusets extends these two mechanisms as follows: - A cpuset may be marked exclusive, which ensures that no other cpuset (except direct ancestors and descendents) may contain any overlapping CPUs or Memory Nodes. + Also a cpu_exclusive cpuset would be associated with a sched + domain. - You can list all the tasks (by pid) attached to any cpuset. The implementation of cpusets requires a few, simple hooks into the rest of the kernel, none in performance critical paths: - - in main/init.c, to initialize the root cpuset at system boot. + - in init/main.c, to initialize the root cpuset at system boot. - in fork and exit, to attach and detach a task from its cpuset. - in sched_setaffinity, to mask the requested CPUs by what's allowed in that tasks cpuset. - in sched.c migrate_all_tasks(), to keep migrating tasks within the CPUs allowed by their cpuset, if possible. + - in sched.c, a new API partition_sched_domains for handling + sched domain changes associated with cpu_exclusive cpusets + and related changes in both sched.c and arch/ia64/kernel/domain.c - in the mbind and set_mempolicy system calls, to mask the requested Memory Nodes by what's allowed in that tasks cpuset. - - in page_alloc, to restrict memory to allowed nodes. + - in page_alloc.c, to restrict memory to allowed nodes. - in vmscan.c, to restrict page recovery to the current cpuset. In addition a new file system, of type "cpuset" may be mounted, @@ -164,9 +175,15 @@ containing the following files describing that cpuset: - cpus: list of CPUs in that cpuset - mems: list of Memory Nodes in that cpuset + - memory_migrate flag: if set, move pages to cpusets nodes - cpu_exclusive flag: is cpu placement exclusive? - mem_exclusive flag: is memory placement exclusive? - tasks: list of tasks (by pid) attached to that cpuset + - notify_on_release flag: run /sbin/cpuset_release_agent on exit? + - memory_pressure: measure of how much paging pressure in cpuset + +In addition, the root cpuset only has the following file: + - memory_pressure_enabled flag: compute memory_pressure? New cpusets are created using the mkdir system call or shell command. The properties of a cpuset, such as its flags, allowed @@ -200,7 +217,185 @@ exclusive cpuset. Also, the use of a Linux virtual file system (vfs) to represent the cpuset hierarchy provides for a familiar permission and name space for cpusets, with a minimum of additional kernel code. -1.4 How do I use cpusets ? +The cpus file in the root (top_cpuset) cpuset is read-only. +It automatically tracks the value of cpu_online_map, using a CPU +hotplug notifier. If and when memory nodes can be hotplugged, +we expect to make the mems file in the root cpuset read-only +as well, and have it track the value of node_online_map. + + +1.4 What are exclusive cpusets ? +-------------------------------- + +If a cpuset is cpu or mem exclusive, no other cpuset, other than +a direct ancestor or descendent, may share any of the same CPUs or +Memory Nodes. + +A cpuset that is cpu_exclusive has a scheduler (sched) domain +associated with it. The sched domain consists of all CPUs in the +current cpuset that are not part of any exclusive child cpusets. +This ensures that the scheduler load balancing code only balances +against the CPUs that are in the sched domain as defined above and +not all of the CPUs in the system. This removes any overhead due to +load balancing code trying to pull tasks outside of the cpu_exclusive +cpuset only to be prevented by the tasks' cpus_allowed mask. + +A cpuset that is mem_exclusive restricts kernel allocations for +page, buffer and other data commonly shared by the kernel across +multiple users. All cpusets, whether mem_exclusive or not, restrict +allocations of memory for user space. This enables configuring a +system so that several independent jobs can share common kernel data, +such as file system pages, while isolating each jobs user allocation in +its own cpuset. To do this, construct a large mem_exclusive cpuset to +hold all the jobs, and construct child, non-mem_exclusive cpusets for +each individual job. Only a small amount of typical kernel memory, +such as requests from interrupt handlers, is allowed to be taken +outside even a mem_exclusive cpuset. + + +1.5 What does notify_on_release do ? +------------------------------------ + +If the notify_on_release flag is enabled (1) in a cpuset, then whenever +the last task in the cpuset leaves (exits or attaches to some other +cpuset) and the last child cpuset of that cpuset is removed, then +the kernel runs the command /sbin/cpuset_release_agent, supplying the +pathname (relative to the mount point of the cpuset file system) of the +abandoned cpuset. This enables automatic removal of abandoned cpusets. +The default value of notify_on_release in the root cpuset at system +boot is disabled (0). The default value of other cpusets at creation +is the current value of their parents notify_on_release setting. + + +1.6 What is memory_pressure ? +----------------------------- +The memory_pressure of a cpuset provides a simple per-cpuset metric +of the rate that the tasks in a cpuset are attempting to free up in +use memory on the nodes of the cpuset to satisfy additional memory +requests. + +This enables batch managers monitoring jobs running in dedicated +cpusets to efficiently detect what level of memory pressure that job +is causing. + +This is useful both on tightly managed systems running a wide mix of +submitted jobs, which may choose to terminate or re-prioritize jobs that +are trying to use more memory than allowed on the nodes assigned them, +and with tightly coupled, long running, massively parallel scientific +computing jobs that will dramatically fail to meet required performance +goals if they start to use more memory than allowed to them. + +This mechanism provides a very economical way for the batch manager +to monitor a cpuset for signs of memory pressure. It's up to the +batch manager or other user code to decide what to do about it and +take action. + +==> Unless this feature is enabled by writing "1" to the special file + /dev/cpuset/memory_pressure_enabled, the hook in the rebalance + code of __alloc_pages() for this metric reduces to simply noticing + that the cpuset_memory_pressure_enabled flag is zero. So only + systems that enable this feature will compute the metric. + +Why a per-cpuset, running average: + + Because this meter is per-cpuset, rather than per-task or mm, + the system load imposed by a batch scheduler monitoring this + metric is sharply reduced on large systems, because a scan of + the tasklist can be avoided on each set of queries. + + Because this meter is a running average, instead of an accumulating + counter, a batch scheduler can detect memory pressure with a + single read, instead of having to read and accumulate results + for a period of time. + + Because this meter is per-cpuset rather than per-task or mm, + the batch scheduler can obtain the key information, memory + pressure in a cpuset, with a single read, rather than having to + query and accumulate results over all the (dynamically changing) + set of tasks in the cpuset. + +A per-cpuset simple digital filter (requires a spinlock and 3 words +of data per-cpuset) is kept, and updated by any task attached to that +cpuset, if it enters the synchronous (direct) page reclaim code. + +A per-cpuset file provides an integer number representing the recent +(half-life of 10 seconds) rate of direct page reclaims caused by +the tasks in the cpuset, in units of reclaims attempted per second, +times 1000. + + +1.7 What is memory spread ? +--------------------------- +There are two boolean flag files per cpuset that control where the +kernel allocates pages for the file system buffers and related in +kernel data structures. They are called 'memory_spread_page' and +'memory_spread_slab'. + +If the per-cpuset boolean flag file 'memory_spread_page' is set, then +the kernel will spread the file system buffers (page cache) evenly +over all the nodes that the faulting task is allowed to use, instead +of preferring to put those pages on the node where the task is running. + +If the per-cpuset boolean flag file 'memory_spread_slab' is set, +then the kernel will spread some file system related slab caches, +such as for inodes and dentries evenly over all the nodes that the +faulting task is allowed to use, instead of preferring to put those +pages on the node where the task is running. + +The setting of these flags does not affect anonymous data segment or +stack segment pages of a task. + +By default, both kinds of memory spreading are off, and memory +pages are allocated on the node local to where the task is running, +except perhaps as modified by the tasks NUMA mempolicy or cpuset +configuration, so long as sufficient free memory pages are available. + +When new cpusets are created, they inherit the memory spread settings +of their parent. + +Setting memory spreading causes allocations for the affected page +or slab caches to ignore the tasks NUMA mempolicy and be spread +instead. Tasks using mbind() or set_mempolicy() calls to set NUMA +mempolicies will not notice any change in these calls as a result of +their containing tasks memory spread settings. If memory spreading +is turned off, then the currently specified NUMA mempolicy once again +applies to memory page allocations. + +Both 'memory_spread_page' and 'memory_spread_slab' are boolean flag +files. By default they contain "0", meaning that the feature is off +for that cpuset. If a "1" is written to that file, then that turns +the named feature on. + +The implementation is simple. + +Setting the flag 'memory_spread_page' turns on a per-process flag +PF_SPREAD_PAGE for each task that is in that cpuset or subsequently +joins that cpuset. The page allocation calls for the page cache +is modified to perform an inline check for this PF_SPREAD_PAGE task +flag, and if set, a call to a new routine cpuset_mem_spread_node() +returns the node to prefer for the allocation. + +Similarly, setting 'memory_spread_cache' turns on the flag +PF_SPREAD_SLAB, and appropriately marked slab caches will allocate +pages from the node returned by cpuset_mem_spread_node(). + +The cpuset_mem_spread_node() routine is also simple. It uses the +value of a per-task rotor cpuset_mem_spread_rotor to select the next +node in the current tasks mems_allowed to prefer for the allocation. + +This memory placement policy is also known (in other contexts) as +round-robin or interleave. + +This policy can provide substantial improvements for jobs that need +to place thread local data on the corresponding node, but that need +to access large file system data sets that need to be spread across +the several nodes in the jobs cpuset in order to fit. Without this +policy, especially for jobs that might have one thread reading in the +data set, the memory allocation across the nodes in the jobs cpuset +can become very uneven. + + +1.8 How do I use cpusets ? -------------------------- In order to minimize the impact of cpusets on critical kernel @@ -249,7 +444,26 @@ rewritten to the 'tasks' file of its cpuset. This is done to avoid impacting the scheduler code in the kernel with a check for changes in a tasks processor placement. -There is an exception to the above. If hotplug funtionality is used +Normally, once a page is allocated (given a physical page +of main memory) then that page stays on whatever node it +was allocated, so long as it remains allocated, even if the +cpusets memory placement policy 'mems' subsequently changes. +If the cpuset flag file 'memory_migrate' is set true, then when +tasks are attached to that cpuset, any pages that task had +allocated to it on nodes in its previous cpuset are migrated +to the tasks new cpuset. The relative placement of the page within +the cpuset is preserved during these migration operations if possible. +For example if the page was on the second valid node of the prior cpuset +then the page will be placed on the second valid node of the new cpuset. + +Also if 'memory_migrate' is set true, then if that cpusets +'mems' file is modified, pages allocated to tasks in that +cpuset, that were on nodes in the previous setting of 'mems', +will be moved to nodes in the new setting of 'mems.' +Pages that were not in the tasks prior cpuset, or in the cpusets +prior 'mems' setting, will not be moved. + +There is an exception to the above. If hotplug functionality is used to remove all the CPUs that are currently assigned to a cpuset, then the kernel will automatically update the cpus_allowed of all tasks attached to CPUs in that cpuset to allow all CPUs. When memory @@ -295,16 +509,6 @@ and then start a subshell 'sh' in that cpuset: # The next line should display '/Charlie' cat /proc/self/cpuset -In the case that a change of cpuset includes wanting to move already -allocated memory pages, consider further the work of IWAMOTO -Toshihiro for page remapping and memory -hotremoval, which can be found at: - - http://people.valinux.co.jp/~iwamoto/mh.html - -The integration of cpusets with such memory migration is not yet -available. - In the future, a C library interface to cpusets will likely be available. For now, the only way to query or modify cpusets is via the cpuset file system, using the various cd, mkdir, echo, cat, diff --git a/Documentation/devices.txt b/Documentation/devices.txt index b369a8c46..66c725f53 100644 --- a/Documentation/devices.txt +++ b/Documentation/devices.txt @@ -3,7 +3,7 @@ Maintained by Torben Mathiasen - Last revised: 25 January 2005 + Last revised: 15 May 2006 This list is the Linux Device List, the official registry of allocated device numbers and /dev directory nodes for the Linux operating @@ -94,7 +94,6 @@ Your cooperation is appreciated. 9 = /dev/urandom Faster, less secure random number gen. 10 = /dev/aio Asyncronous I/O notification interface 11 = /dev/kmsg Writes to this come out as printk's - 12 = /dev/oldmem Access to crash dump from kexec kernel 1 block RAM disk 0 = /dev/ram0 First RAM disk 1 = /dev/ram1 Second RAM disk @@ -262,13 +261,13 @@ Your cooperation is appreciated. NOTE: These devices permit both read and write access. 7 block Loopback devices - 0 = /dev/loop0 First loopback device - 1 = /dev/loop1 Second loopback device + 0 = /dev/loop0 First loop device + 1 = /dev/loop1 Second loop device ... - The loopback devices are used to mount filesystems not + The loop devices are used to mount filesystems not associated with block devices. The binding to the - loopback devices is handled by mount(8) or losetup(8). + loop devices is handled by mount(8) or losetup(8). 8 block SCSI disk devices (0-15) 0 = /dev/sda First SCSI disk whole disk @@ -943,7 +942,7 @@ Your cooperation is appreciated. 240 = /dev/ftlp FTL on 16th Memory Technology Device Partitions are handled in the same way as for IDE - disks (see major number 3) expect that the partition + disks (see major number 3) except that the partition limit is 15 rather than 63 per disk (same as SCSI.) 45 char isdn4linux ISDN BRI driver @@ -1168,7 +1167,7 @@ Your cooperation is appreciated. The filename of the encrypted container and the passwords are sent via ioctls (using the sdmount tool) to the master node which then activates them via one of the - /dev/scramdisk/x nodes for loopback mounting (all handled + /dev/scramdisk/x nodes for loop mounting (all handled through the sdmount tool). Requested by: andy@scramdisklinux.org @@ -2538,24 +2537,38 @@ Your cooperation is appreciated. 0 = /dev/usb/lp0 First USB printer ... 15 = /dev/usb/lp15 16th USB printer - 16 = /dev/usb/mouse0 First USB mouse - ... - 31 = /dev/usb/mouse15 16th USB mouse - 32 = /dev/usb/ez0 First USB firmware loader - ... - 47 = /dev/usb/ez15 16th USB firmware loader 48 = /dev/usb/scanner0 First USB scanner ... 63 = /dev/usb/scanner15 16th USB scanner 64 = /dev/usb/rio500 Diamond Rio 500 65 = /dev/usb/usblcd USBLCD Interface (info@usblcd.de) 66 = /dev/usb/cpad0 Synaptics cPad (mouse/LCD) + 96 = /dev/usb/hiddev0 1st USB HID device + ... + 111 = /dev/usb/hiddev15 16th USB HID device + 112 = /dev/usb/auer0 1st auerswald ISDN device + ... + 127 = /dev/usb/auer15 16th auerswald ISDN device + 128 = /dev/usb/brlvgr0 First Braille Voyager device + ... + 131 = /dev/usb/brlvgr3 Fourth Braille Voyager device + 132 = /dev/usb/idmouse ID Mouse (fingerprint scanner) device + 133 = /dev/usb/sisusbvga1 First SiSUSB VGA device + ... + 140 = /dev/usb/sisusbvga8 Eigth SISUSB VGA device + 144 = /dev/usb/lcd USB LCD device + 160 = /dev/usb/legousbtower0 1st USB Legotower device + ... + 175 = /dev/usb/legousbtower15 16th USB Legotower device + 240 = /dev/usb/dabusb0 First daubusb device + ... + 243 = /dev/usb/dabusb3 Fourth dabusb device 180 block USB block devices - 0 = /dev/uba First USB block device - 8 = /dev/ubb Second USB block device - 16 = /dev/ubc Thrid USB block device - ... + 0 = /dev/uba First USB block device + 8 = /dev/ubb Second USB block device + 16 = /dev/ubc Third USB block device + ... 181 char Conrad Electronic parallel port radio clocks 0 = /dev/pcfclock0 First Conrad radio clock @@ -2710,6 +2723,17 @@ Your cooperation is appreciated. 1 = /dev/cpu/1/msr MSRs on CPU 1 ... +202 block Xen Virtual Block Device + 0 = /dev/xvda First Xen VBD whole disk + 16 = /dev/xvdb Second Xen VBD whole disk + 32 = /dev/xvdc Third Xen VBD whole disk + ... + 240 = /dev/xvdp Sixteenth Xen VBD whole disk + + Partitions are handled in the same way as for IDE + disks (see major number 3) except that the limit on + partitions is 15. + 203 char CPU CPUID information 0 = /dev/cpu/0/cpuid CPUID on CPU 0 1 = /dev/cpu/1/cpuid CPUID on CPU 1 @@ -2747,11 +2771,27 @@ Your cooperation is appreciated. 46 = /dev/ttyCPM0 PPC CPM (SCC or SMC) - port 0 ... 47 = /dev/ttyCPM5 PPC CPM (SCC or SMC) - port 5 - 50 = /dev/ttyIOC40 Altix serial card + 50 = /dev/ttyIOC0 Altix serial card + ... + 81 = /dev/ttyIOC31 Altix serial card + 82 = /dev/ttyVR0 NEC VR4100 series SIU + 83 = /dev/ttyVR1 NEC VR4100 series DSIU + 84 = /dev/ttyIOC84 Altix ioc4 serial card + ... + 115 = /dev/ttyIOC115 Altix ioc4 serial card + 116 = /dev/ttySIOC0 Altix ioc3 serial card + ... + 147 = /dev/ttySIOC31 Altix ioc3 serial card + 148 = /dev/ttyPSC0 PPC PSC - port 0 + ... + 153 = /dev/ttyPSC5 PPC PSC - port 5 + 154 = /dev/ttyAT0 ATMEL serial port 0 + ... + 169 = /dev/ttyAT15 ATMEL serial port 15 + 170 = /dev/ttyNX0 Hilscher netX serial port 0 ... - 81 = /dev/ttyIOC431 Altix serial card - 82 = /dev/ttyVR0 NEC VR4100 series SIU - 83 = /dev/ttyVR1 NEC VR4100 series DSIU + 185 = /dev/ttyNX15 Hilscher netX serial port 15 + 186 = /dev/ttyJ0 JTAG1 DCC protocol based serial port emulation 205 char Low-density serial ports (alternate device) 0 = /dev/culu0 Callout device for ttyLU0 @@ -2786,8 +2826,8 @@ Your cooperation is appreciated. 50 = /dev/cuioc40 Callout device for ttyIOC40 ... 81 = /dev/cuioc431 Callout device for ttyIOC431 - 82 = /dev/cuvr0 Callout device for ttyVR0 - 83 = /dev/cuvr1 Callout device for ttyVR1 + 82 = /dev/cuvr0 Callout device for ttyVR0 + 83 = /dev/cuvr1 Callout device for ttyVR1 206 char OnStream SC-x0 tape devices @@ -2897,7 +2937,6 @@ Your cooperation is appreciated. ... 196 = /dev/dvb/adapter3/video0 first video decoder of fourth card - 216 char Bluetooth RFCOMM TTY devices 0 = /dev/rfcomm0 First Bluetooth RFCOMM TTY device 1 = /dev/rfcomm1 Second Bluetooth RFCOMM TTY device @@ -3002,12 +3041,43 @@ Your cooperation is appreciated. ioctl()'s can be used to rewind the tape regardless of the device used to access it. -231 char InfiniBand MAD +231 char InfiniBand 0 = /dev/infiniband/umad0 1 = /dev/infiniband/umad1 - ... + ... + 63 = /dev/infiniband/umad63 63rd InfiniBandMad device + 64 = /dev/infiniband/issm0 First InfiniBand IsSM device + 65 = /dev/infiniband/issm1 Second InfiniBand IsSM device + ... + 127 = /dev/infiniband/issm63 63rd InfiniBand IsSM device + 128 = /dev/infiniband/uverbs0 First InfiniBand verbs device + 129 = /dev/infiniband/uverbs1 Second InfiniBand verbs device + ... + 159 = /dev/infiniband/uverbs31 31st InfiniBand verbs device + +232 char Biometric Devices + 0 = /dev/biometric/sensor0/fingerprint first fingerprint sensor on first device + 1 = /dev/biometric/sensor0/iris first iris sensor on first device + 2 = /dev/biometric/sensor0/retina first retina sensor on first device + 3 = /dev/biometric/sensor0/voiceprint first voiceprint sensor on first device + 4 = /dev/biometric/sensor0/facial first facial sensor on first device + 5 = /dev/biometric/sensor0/hand first hand sensor on first device + ... + 10 = /dev/biometric/sensor1/fingerprint first fingerprint sensor on second device + ... + 20 = /dev/biometric/sensor2/fingerprint first fingerprint sensor on third device + ... + +233 char PathScale InfiniPath interconnect + 0 = /dev/ipath Primary device for programs (any unit) + 1 = /dev/ipath0 Access specifically to unit 0 + 2 = /dev/ipath1 Access specifically to unit 1 + ... + 4 = /dev/ipath3 Access specifically to unit 3 + 129 = /dev/ipath_sma Device used by Subnet Management Agent + 130 = /dev/ipath_diag Device used by diagnostics programs -232-239 UNASSIGNED +234-239 UNASSIGNED 240-254 char LOCAL/EXPERIMENTAL USE 240-254 block LOCAL/EXPERIMENTAL USE @@ -3021,6 +3091,28 @@ Your cooperation is appreciated. This major is reserved to assist the expansion to a larger number space. No device nodes with this major should ever be created on the filesystem. + (This is probaly not true anymore, but I'll leave it + for now /Torben) + +---LARGE MAJORS!!!!!--- + +256 char Equinox SST multi-port serial boards + 0 = /dev/ttyEQ0 First serial port on first Equinox SST board + 127 = /dev/ttyEQ127 Last serial port on first Equinox SST board + 128 = /dev/ttyEQ128 First serial port on second Equinox SST board + ... + 1027 = /dev/ttyEQ1027 Last serial port on eighth Equinox SST board + +256 block Resident Flash Disk Flash Translation Layer + 0 = /dev/rfda First RFD FTL layer + 16 = /dev/rfdb Second RFD FTL layer + ... + 240 = /dev/rfdp 16th RFD FTL layer + +257 char Phoenix Technologies Cryptographic Services Driver + 0 = /dev/ptlsec Crypto Services Driver + + **** ADDITIONAL /dev DIRECTORY ENTRIES diff --git a/Documentation/digiepca.txt b/Documentation/digiepca.txt index 88820fe38..f2560e22f 100644 --- a/Documentation/digiepca.txt +++ b/Documentation/digiepca.txt @@ -2,7 +2,7 @@ NOTE: This driver is obsolete. Digi provides a 2.6 driver (dgdm) at http://www.digi.com for PCI cards. They no longer maintain this driver, and have no 2.6 driver for ISA cards. -This driver requires a number of user-space tools. They can be aquired from +This driver requires a number of user-space tools. They can be acquired from http://www.digi.com, but only works with 2.4 kernels. diff --git a/Documentation/dontdiff b/Documentation/dontdiff index 9a33bb94f..63c2d0c55 100644 --- a/Documentation/dontdiff +++ b/Documentation/dontdiff @@ -41,6 +41,7 @@ COPYING CREDITS CVS ChangeSet +Image Kerntypes MODS.txt Module.symvers @@ -54,6 +55,7 @@ aic7*seq.h* aicasm aicdb.h* asm +asm-offsets.* asm_offsets.* autoconf.h* bbootsect @@ -103,6 +105,8 @@ logo_*.c logo_*_clut224.c logo_*_mono.c lxdialog +mach-types +mach-types.h make_times_h map maui_boot.h @@ -111,6 +115,7 @@ mkdep mktables modpost modversions.h* +offset.h offsets.h oui.c* parse.c* @@ -130,6 +135,7 @@ tags times.h* tkparse trix_boot.h +utsrelease.h* version.h* vmlinux vmlinux-* diff --git a/Documentation/driver-model/overview.txt b/Documentation/driver-model/overview.txt index ac4a7a737..2050c9ffc 100644 --- a/Documentation/driver-model/overview.txt +++ b/Documentation/driver-model/overview.txt @@ -18,7 +18,7 @@ Traditional driver models implemented some sort of tree-like structure (sometimes just a list) for the devices they control. There wasn't any uniformity across the different bus types. -The current driver model provides a comon, uniform data model for describing +The current driver model provides a common, uniform data model for describing a bus and the devices that can appear under the bus. The unified bus model includes a set of common attributes which all busses carry, and a set of common callbacks, such as device discovery during bus probing, bus diff --git a/Documentation/drivers/edac/edac.txt b/Documentation/drivers/edac/edac.txt index 70d96a62e..7b3d969d2 100644 --- a/Documentation/drivers/edac/edac.txt +++ b/Documentation/drivers/edac/edac.txt @@ -35,15 +35,14 @@ the vendor should tie the parity status bits to 0 if they do not intend to generate parity. Some vendors do not do this, and thus the parity bit can "float" giving false positives. -The PCI Parity EDAC device has the ability to "skip" known flaky -cards during the parity scan. These are set by the parity "blacklist" -interface in the sysfs for PCI Parity. (See the PCI section in the sysfs -section below.) There is also a parity "whitelist" which is used as -an explicit list of devices to scan, while the blacklist is a list -of devices to skip. +[There are patches in the kernel queue which will allow for storage of +quirks of PCI devices reporting false parity positives. The 2.6.18 +kernel should have those patches included. When that becomes available, +then EDAC will be patched to utilize that information to "skip" such +devices.] -EDAC will have future error detectors that will be added or integrated -into EDAC in the following list: +EDAC will have future error detectors that will be integrated with +EDAC or added to it, in the following list: MCE Machine Check Exception MCA Machine Check Architecture @@ -93,22 +92,24 @@ EDAC lives in the /sys/devices/system/edac directory. Within this directory there currently reside 2 'edac' components: mc memory controller(s) system - pci PCI status system + pci PCI control and status system ============================================================================ Memory Controller (mc) Model First a background on the memory controller's model abstracted in EDAC. -Each mc device controls a set of DIMM memory modules. These modules are +Each 'mc' device controls a set of DIMM memory modules. These modules are laid out in a Chip-Select Row (csrowX) and Channel table (chX). There can -be multiple csrows and two channels. +be multiple csrows and multiple channels. Memory controllers allow for several csrows, with 8 csrows being a typical value. Yet, the actual number of csrows depends on the electrical "loading" of a given motherboard, memory controller and DIMM characteristics. Dual channels allows for 128 bit data transfers to the CPU from memory. +Some newer chipsets allow for more than 2 channels, like Fully Buffered DIMMs +(FB-DIMMs). The following example will assume 2 channels: Channel 0 Channel 1 @@ -234,23 +235,15 @@ Polling period control file: The time period, in milliseconds, for polling for error information. Too small a value wastes resources. Too large a value might delay necessary handling of errors and might loose valuable information for - locating the error. 1000 milliseconds (once each second) is about - right for most uses. + locating the error. 1000 milliseconds (once each second) is the current + default. Systems which require all the bandwidth they can get, may + increase this. LOAD TIME: module/kernel parameter: poll_msec=[0|1] RUN TIME: echo "1000" >/sys/devices/system/edac/mc/poll_msec -Module Version read-only attribute file: - - 'mc_version' - - The EDAC CORE module's version and compile date are shown here to - indicate what EDAC is running. - - - ============================================================================ 'mcX' DIRECTORIES @@ -284,35 +277,6 @@ Seconds since last counter reset control file: -DIMM capability attribute file: - - 'edac_capability' - - The EDAC (Error Detection and Correction) capabilities/modes of - the memory controller hardware. - - -DIMM Current Capability attribute file: - - 'edac_current_capability' - - The EDAC capabilities available with the hardware - configuration. This may not be the same as "EDAC capability" - if the correct memory is not used. If a memory controller is - capable of EDAC, but DIMMs without check bits are in use, then - Parity, SECDED, S4ECD4ED capabilities will not be available - even though the memory controller might be capable of those - modes with the proper memory loaded. - - -Memory Type supported on this controller attribute file: - - 'supported_mem_type' - - This attribute file displays the memory type, usually - buffered and unbuffered DIMMs. - - Memory Controller name attribute file: 'mc_name' @@ -321,16 +285,6 @@ Memory Controller name attribute file: that is being utilized. -Memory Controller Module name attribute file: - - 'module_name' - - This attribute file displays the memory controller module name, - version and date built. The name of the memory controller - hardware - some drivers work with multiple controllers and - this field shows which hardware is present. - - Total memory managed by this memory controller attribute file: 'size_mb' @@ -432,6 +386,9 @@ Memory Type attribute file: This attribute file will display what type of memory is currently on this csrow. Normally, either buffered or unbuffered memory. + Examples: + Registered-DDR + Unbuffered-DDR EDAC Mode of operation attribute file: @@ -446,8 +403,13 @@ Device type attribute file: 'dev_type' - This attribute file will display what type of DIMM device is - being utilized. Example: x4 + This attribute file will display what type of DRAM device is + being utilized on this DIMM. + Examples: + x1 + x2 + x4 + x8 Channel 0 CE Count attribute file: @@ -522,10 +484,10 @@ SYSTEM LOGGING If logging for UEs and CEs are enabled then system logs will have error notices indicating errors that have been detected: -MC0: CE page 0x283, offset 0xce0, grain 8, syndrome 0x6ec3, row 0, +EDAC MC0: CE page 0x283, offset 0xce0, grain 8, syndrome 0x6ec3, row 0, channel 1 "DIMM_B1": amd76x_edac -MC0: CE page 0x1e5, offset 0xfb0, grain 8, syndrome 0xb741, row 0, +EDAC MC0: CE page 0x1e5, offset 0xfb0, grain 8, syndrome 0xb741, row 0, channel 1 "DIMM_B1": amd76x_edac @@ -610,64 +572,4 @@ Parity Count: -PCI Device Whitelist: - - 'pci_parity_whitelist' - - This control file allows for an explicit list of PCI devices to be - scanned for parity errors. Only devices found on this list will - be examined. The list is a line of hexadecimal VENDOR and DEVICE - ID tuples: - - 1022:7450,1434:16a6 - - One or more can be inserted, separated by a comma. - - To write the above list doing the following as one command line: - - echo "1022:7450,1434:16a6" - > /sys/devices/system/edac/pci/pci_parity_whitelist - - - - To display what the whitelist is, simply 'cat' the same file. - - -PCI Device Blacklist: - - 'pci_parity_blacklist' - - This control file allows for a list of PCI devices to be - skipped for scanning. - The list is a line of hexadecimal VENDOR and DEVICE ID tuples: - - 1022:7450,1434:16a6 - - One or more can be inserted, separated by a comma. - - To write the above list doing the following as one command line: - - echo "1022:7450,1434:16a6" - > /sys/devices/system/edac/pci/pci_parity_blacklist - - - To display what the whitelist currently contains, - simply 'cat' the same file. - ======================================================================= - -PCI Vendor and Devices IDs can be obtained with the lspci command. Using -the -n option lspci will display the vendor and device IDs. The system -administrator will have to determine which devices should be scanned or -skipped. - - - -The two lists (white and black) are prioritized. blacklist is the lower -priority and will NOT be utilized when a whitelist has been set. -Turn OFF a whitelist by an empty echo command: - - echo > /sys/devices/system/edac/pci/pci_parity_whitelist - -and any previous blacklist will be utilized. - diff --git a/Documentation/fb/fbcon.txt b/Documentation/fb/fbcon.txt index 08dce0f63..f373df12e 100644 --- a/Documentation/fb/fbcon.txt +++ b/Documentation/fb/fbcon.txt @@ -135,10 +135,10 @@ C. Boot options The angle can be changed anytime afterwards by 'echoing' the same numbers to any one of the 2 attributes found in - /sys/class/graphics/fb{x} + /sys/class/graphics/fbcon - con_rotate - rotate the display of the active console - con_rotate_all - rotate the display of all consoles + rotate - rotate the display of the active console + rotate_all - rotate the display of all consoles Console rotation will only become available if Console Rotation Support is compiled in your kernel. @@ -148,5 +148,177 @@ C. Boot options Actually, the underlying fb driver is totally ignorant of console rotation. ---- +C. Attaching, Detaching and Unloading + +Before going on on how to attach, detach and unload the framebuffer console, an +illustration of the dependencies may help. + +The console layer, as with most subsystems, needs a driver that interfaces with +the hardware. Thus, in a VGA console: + +console ---> VGA driver ---> hardware. + +Assuming the VGA driver can be unloaded, one must first unbind the VGA driver +from the console layer before unloading the driver. The VGA driver cannot be +unloaded if it is still bound to the console layer. (See +Documentation/console/console.txt for more information). + +This is more complicated in the case of the the framebuffer console (fbcon), +because fbcon is an intermediate layer between the console and the drivers: + +console ---> fbcon ---> fbdev drivers ---> hardware + +The fbdev drivers cannot be unloaded if it's bound to fbcon, and fbcon cannot +be unloaded if it's bound to the console layer. + +So to unload the fbdev drivers, one must first unbind fbcon from the console, +then unbind the fbdev drivers from fbcon. Fortunately, unbinding fbcon from +the console layer will automatically unbind framebuffer drivers from +fbcon. Thus, there is no need to explicitly unbind the fbdev drivers from +fbcon. + +So, how do we unbind fbcon from the console? Part of the answer is in +Documentation/console/console.txt. To summarize: + +Echo a value to the bind file that represents the framebuffer console +driver. So assuming vtcon1 represents fbcon, then: + +echo 1 > sys/class/vtconsole/vtcon1/bind - attach framebuffer console to + console layer +echo 0 > sys/class/vtconsole/vtcon1/bind - detach framebuffer console from + console layer + +If fbcon is detached from the console layer, your boot console driver (which is +usually VGA text mode) will take over. A few drivers (rivafb and i810fb) will +restore VGA text mode for you. With the rest, before detaching fbcon, you +must take a few additional steps to make sure that your VGA text mode is +restored properly. The following is one of the several methods that you can do: + +1. Download or install vbetool. This utility is included with most + distributions nowadays, and is usually part of the suspend/resume tool. + +2. In your kernel configuration, ensure that CONFIG_FRAMEBUFFER_CONSOLE is set + to 'y' or 'm'. Enable one or more of your favorite framebuffer drivers. + +3. Boot into text mode and as root run: + + vbetool vbestate save > + + The above command saves the register contents of your graphics + hardware to . You need to do this step only once as + the state file can be reused. + +4. If fbcon is compiled as a module, load fbcon by doing: + + modprobe fbcon + +5. Now to detach fbcon: + + vbetool vbestate restore < && \ + echo 0 > /sys/class/vtconsole/vtcon1/bind + +6. That's it, you're back to VGA mode. And if you compiled fbcon as a module, + you can unload it by 'rmmod fbcon' + +7. To reattach fbcon: + + echo 1 > /sys/class/vtconsole/vtcon1/bind + +8. Once fbcon is unbound, all drivers registered to the system will also +become unbound. This means that fbcon and individual framebuffer drivers +can be unloaded or reloaded at will. Reloading the drivers or fbcon will +automatically bind the console, fbcon and the drivers together. Unloading +all the drivers without unloading fbcon will make it impossible for the +console to bind fbcon. + +Notes for vesafb users: +======================= + +Unfortunately, if your bootline includes a vga=xxx parameter that sets the +hardware in graphics mode, such as when loading vesafb, vgacon will not load. +Instead, vgacon will replace the default boot console with dummycon, and you +won't get any display after detaching fbcon. Your machine is still alive, so +you can reattach vesafb. However, to reattach vesafb, you need to do one of +the following: + +Variation 1: + + a. Before detaching fbcon, do + + vbetool vbemode save > # do once for each vesafb mode, + # the file can be reused + + b. Detach fbcon as in step 5. + + c. Attach fbcon + + vbetool vbestate restore < && \ + echo 1 > /sys/class/vtconsole/vtcon1/bind + +Variation 2: + + a. Before detaching fbcon, do: + echo > /sys/class/tty/console/bind + + + vbetool vbemode get + + b. Take note of the mode number + + b. Detach fbcon as in step 5. + + c. Attach fbcon: + + vbetool vbemode set && \ + echo 1 > /sys/class/vtconsole/vtcon1/bind + +Samples: +======== + +Here are 2 sample bash scripts that you can use to bind or unbind the +framebuffer console driver if you are in an X86 box: + +--------------------------------------------------------------------------- +#!/bin/bash +# Unbind fbcon + +# Change this to where your actual vgastate file is located +# Or Use VGASTATE=$1 to indicate the state file at runtime +VGASTATE=/tmp/vgastate + +# path to vbetool +VBETOOL=/usr/local/bin + + +for (( i = 0; i < 16; i++)) +do + if test -x /sys/class/vtconsole/vtcon$i; then + if [ `cat /sys/class/vtconsole/vtcon$i/name | grep -c "frame buffer"` \ + = 1 ]; then + if test -x $VBETOOL/vbetool; then + echo Unbinding vtcon$i + $VBETOOL/vbetool vbestate restore < $VGASTATE + echo 0 > /sys/class/vtconsole/vtcon$i/bind + fi + fi + fi +done + +--------------------------------------------------------------------------- +#!/bin/bash +# Bind fbcon + +for (( i = 0; i < 16; i++)) +do + if test -x /sys/class/vtconsole/vtcon$i; then + if [ `cat /sys/class/vtconsole/vtcon$i/name | grep -c "frame buffer"` \ + = 1 ]; then + echo Unbinding vtcon$i + echo 1 > /sys/class/vtconsole/vtcon$i/bind + fi + fi +done +--------------------------------------------------------------------------- + +-- Antonino Daplas diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index b9eb20931..552507fe9 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt @@ -6,80 +6,291 @@ be removed from this file. --------------------------- -What: devfs -When: July 2005 -Files: fs/devfs/*, include/linux/devfs_fs*.h and assorted devfs - function calls throughout the kernel tree -Why: It has been unmaintained for a number of years, has unfixable - races, contains a naming policy within the kernel that is - against the LSB, and can be replaced by using udev. -Who: Greg Kroah-Hartman +What: RAW driver (CONFIG_RAW_DRIVER) +When: December 2005 +Why: declared obsolete since kernel 2.6.3 + O_DIRECT can be used instead +Who: Adrian Bunk --------------------------- -What: ACPI S4bios support -When: May 2005 -Why: Noone uses it, and it probably does not work, anyway. swsusp is - faster, more reliable, and people are actually using it. -Who: Pavel Machek +What: drivers that were depending on OBSOLETE_OSS_DRIVER + (config options already removed) +When: before 2.6.19 +Why: OSS drivers with ALSA replacements +Who: Adrian Bunk --------------------------- -What: PCI Name Database (CONFIG_PCI_NAMES) -When: July 2005 -Why: It bloats the kernel unnecessarily, and is handled by userspace better - (pciutils supports it.) Will eliminate the need to try to keep the - pci.ids file in sync with the sf.net database all of the time. +What: raw1394: requests of type RAW1394_REQ_ISO_SEND, RAW1394_REQ_ISO_LISTEN +When: November 2006 +Why: Deprecated in favour of the new ioctl-based rawiso interface, which is + more efficient. You should really be using libraw1394 for raw1394 + access anyway. +Who: Jody McIntyre + +--------------------------- + +What: sbp2: module parameter "force_inquiry_hack" +When: July 2006 +Why: Superceded by parameter "workarounds". Both parameters are meant to be + used ad-hoc and for single devices only, i.e. not in modprobe.conf, + therefore the impact of this feature replacement should be low. +Who: Stefan Richter + +--------------------------- + +What: Video4Linux API 1 ioctls and video_decoder.h from Video devices. +When: July 2006 +Why: V4L1 AP1 was replaced by V4L2 API. during migration from 2.4 to 2.6 + series. The old API have lots of drawbacks and don't provide enough + means to work with all video and audio standards. The newer API is + already available on the main drivers and should be used instead. + Newer drivers should use v4l_compat_translate_ioctl function to handle + old calls, replacing to newer ones. + Decoder iocts are using internally to allow video drivers to + communicate with video decoders. This should also be improved to allow + V4L2 calls being translated into compatible internal ioctls. +Who: Mauro Carvalho Chehab + +--------------------------- + +What: PCMCIA control ioctl (needed for pcmcia-cs [cardmgr, cardctl]) +When: November 2005 +Files: drivers/pcmcia/: pcmcia_ioctl.c +Why: With the 16-bit PCMCIA subsystem now behaving (almost) like a + normal hotpluggable bus, and with it using the default kernel + infrastructure (hotplug, driver core, sysfs) keeping the PCMCIA + control ioctl needed by cardmgr and cardctl from pcmcia-cs is + unnecessary, and makes further cleanups and integration of the + PCMCIA subsystem into the Linux kernel device driver model more + difficult. The features provided by cardmgr and cardctl are either + handled by the kernel itself now or are available in the new + pcmciautils package available at + http://kernel.org/pub/linux/utils/kernel/pcmcia/ +Who: Dominik Brodowski + +--------------------------- + +What: ip_queue and ip6_queue (old ipv4-only and ipv6-only netfilter queue) +When: December 2005 +Why: This interface has been obsoleted by the new layer3-independent + "nfnetlink_queue". The Kernel interface is compatible, so the old + ip[6]tables "QUEUE" targets still work and will transparently handle + all packets into nfnetlink queue number 0. Userspace users will have + to link against API-compatible library on top of libnfnetlink_queue + instead of the current 'libipq'. +Who: Harald Welte + +--------------------------- + +What: remove EXPORT_SYMBOL(kernel_thread) +When: August 2006 +Files: arch/*/kernel/*_ksyms.c +Why: kernel_thread is a low-level implementation detail. Drivers should + use the API instead which shields them from + implementation details and provides a higherlevel interface that + prevents bugs and code duplication +Who: Christoph Hellwig + +--------------------------- + +What: CONFIG_FORCED_INLINING +When: June 2006 +Why: Config option is there to see if gcc is good enough. (in january + 2006). If it is, the behavior should just be the default. If it's not, + the option should just go away entirely. +Who: Arjan van de Ven + +--------------------------- + +What: START_ARRAY ioctl for md +When: July 2006 +Files: drivers/md/md.c +Why: Not reliable by design - can fail when most needed. + Alternatives exist +Who: NeilBrown + +--------------------------- + +What: eepro100 network driver +When: January 2007 +Why: replaced by the e100 driver +Who: Adrian Bunk + +--------------------------- + +What: drivers depending on OSS_OBSOLETE_DRIVER +When: options in 2.6.20, code in 2.6.22 +Why: OSS drivers with ALSA replacements +Who: Adrian Bunk + +--------------------------- + +What: pci_module_init(driver) +When: January 2007 +Why: Is replaced by pci_register_driver(pci_driver). +Who: Richard Knutsson and Greg Kroah-Hartman + +--------------------------- + +What: Usage of invalid timevals in setitimer +When: March 2007 +Why: POSIX requires to validate timevals in the setitimer call. This + was never done by Linux. The invalid (e.g. negative timevals) were + silently converted to more or less random timeouts and intervals. + Until the removal a per boot limited number of warnings is printed + and the timevals are sanitized. + +Who: Thomas Gleixner + +--------------------------- + +What: I2C interface of the it87 driver +When: January 2007 +Why: The ISA interface is faster and should be always available. The I2C + probing is also known to cause trouble in at least one case (see + bug #5889.) +Who: Jean Delvare + +--------------------------- + +What: Unused EXPORT_SYMBOL/EXPORT_SYMBOL_GPL exports + (temporary transition config option provided until then) + The transition config option will also be removed at the same time. +When: before 2.6.19 +Why: Unused symbols are both increasing the size of the kernel binary + and are often a sign of "wrong API" +Who: Arjan van de Ven + +--------------------------- + +What: mount/umount uevents +When: February 2007 +Why: These events are not correct, and do not properly let userspace know + when a file system has been mounted or unmounted. Userspace should + poll the /proc/mounts file instead to detect this properly. Who: Greg Kroah-Hartman --------------------------- -What: io_remap_page_range() (macro or function) -When: September 2005 -Why: Replaced by io_remap_pfn_range() which allows more memory space - addressabilty (by using a pfn) and supports sparc & sparc64 - iospace as part of the pfn. -Who: Randy Dunlap +What: USB driver API moves to EXPORT_SYMBOL_GPL +When: Febuary 2008 +Files: include/linux/usb.h, drivers/usb/core/driver.c +Why: The USB subsystem has changed a lot over time, and it has been + possible to create userspace USB drivers using usbfs/libusb/gadgetfs + that operate as fast as the USB bus allows. Because of this, the USB + subsystem will not be allowing closed source kernel drivers to + register with it, after this grace period is over. If anyone needs + any help in converting their closed source drivers over to use the + userspace filesystems, please contact the + linux-usb-devel@lists.sourceforge.net mailing list, and the developers + there will be glad to help you out. +Who: Greg Kroah-Hartman --------------------------- -What: register_ioctl32_conversion() / unregister_ioctl32_conversion() -When: April 2005 -Why: Replaced by ->compat_ioctl in file_operations and other method - vecors. -Who: Andi Kleen , Christoph Hellwig +What: find_trylock_page +When: January 2007 +Why: The interface no longer has any callers left in the kernel. It + is an odd interface (compared with other find_*_page functions), in + that it does not take a refcount to the page, only the page lock. + It should be replaced with find_get_page or find_lock_page if possible. + This feature removal can be reevaluated if users of the interface + cannot cleanly use something else. +Who: Nick Piggin --------------------------- -What: RCU API moves to EXPORT_SYMBOL_GPL -When: April 2006 -Files: include/linux/rcupdate.h, kernel/rcupdate.c -Why: Outside of Linux, the only implementations of anything even - vaguely resembling RCU that I am aware of are in DYNIX/ptx, - VM/XA, Tornado, and K42. I do not expect anyone to port binary - drivers or kernel modules from any of these, since the first two - are owned by IBM and the last two are open-source research OSes. - So these will move to GPL after a grace period to allow - people, who might be using implementations that I am not aware - of, to adjust to this upcoming change. -Who: Paul E. McKenney +What: Support for the MIPS EV96100 evaluation board +When: September 2006 +Why: Does no longer build since at least November 15, 2003, apparently + no userbase left. +Who: Ralf Baechle --------------------------- -What: IEEE1394 Audio and Music Data Transmission Protocol driver, - Connection Management Procedures driver -When: November 2005 -Files: drivers/ieee1394/{amdtp,cmp}* -Why: These are incomplete, have never worked, and are better implemented - in userland via raw1394 (see http://freebob.sourceforge.net/ for - example.) -Who: Jody McIntyre +What: Support for the Momentum / PMC-Sierra Jaguar ATX evaluation board +When: September 2006 +Why: Does no longer build since quite some time, and was never popular, + due to the platform being replaced by successor models. Apparently + no user base left. It also is one of the last users of + WANT_PAGE_VIRTUAL. +Who: Ralf Baechle --------------------------- -What: raw1394: requests of type RAW1394_REQ_ISO_SEND, RAW1394_REQ_ISO_LISTEN -When: November 2005 -Why: Deprecated in favour of the new ioctl-based rawiso interface, which is - more efficient. You should really be using libraw1394 for raw1394 - access anyway. -Who: Jody McIntyre +What: Support for the Momentum Ocelot, Ocelot 3, Ocelot C and Ocelot G +When: September 2006 +Why: Some do no longer build and apparently there is no user base left + for these platforms. +Who: Ralf Baechle + +--------------------------- + +What: Support for MIPS Technologies' Altas and SEAD evaluation board +When: September 2006 +Why: Some do no longer build and apparently there is no user base left + for these platforms. Hardware out of production since several years. +Who: Ralf Baechle + +--------------------------- + +What: Support for the IT8172-based platforms, ITE 8172G and Globespan IVR +When: September 2006 +Why: Code does no longer build since at least 2.6.0, apparently there is + no user base left for these platforms. Hardware out of production + since several years and hardly a trace of the manufacturer left on + the net. +Who: Ralf Baechle + +--------------------------- + +What: Interrupt only SA_* flags +When: Januar 2007 +Why: The interrupt related SA_* flags are replaced by IRQF_* to move them + out of the signal namespace. + +Who: Thomas Gleixner + +--------------------------- + +What: i2c-ite and i2c-algo-ite drivers +When: September 2006 +Why: These drivers never compiled since they were added to the kernel + tree 5 years ago. This feature removal can be reevaluated if + someone shows interest in the drivers, fixes them and takes over + maintenance. + http://marc.theaimsgroup.com/?l=linux-mips&m=115040510817448 +Who: Jean Delvare + +--------------------------- + +What: Bridge netfilter deferred IPv4/IPv6 output hook calling +When: January 2007 +Why: The deferred output hooks are a layering violation causing unusual + and broken behaviour on bridge devices. Examples of things they + break include QoS classifation using the MARK or CLASSIFY targets, + the IPsec policy match and connection tracking with VLANs on a + bridge. Their only use is to enable bridge output port filtering + within iptables with the physdev match, which can also be done by + combining iptables and ebtables using netfilter marks. Until it + will get removed the hook deferral is disabled by default and is + only enabled when needed. + +Who: Patrick McHardy + +--------------------------- + +What: frame diverter +When: November 2006 +Why: The frame diverter is included in most distribution kernels, but is + broken. It does not correctly handle many things: + - IPV6 + - non-linear skb's + - network device RCU on removal + - input frames not correctly checked for protocol errors + It also adds allocation overhead even if not enabled. + It is not clear if anyone is still using it. +Who: Stephen Hemminger + diff --git a/Documentation/filesystems/00-INDEX b/Documentation/filesystems/00-INDEX index 66fdc0744..16dec61d7 100644 --- a/Documentation/filesystems/00-INDEX +++ b/Documentation/filesystems/00-INDEX @@ -62,8 +62,8 @@ ramfs-rootfs-initramfs.txt - info on the 'in memory' filesystems ramfs, rootfs and initramfs. reiser4.txt - info on the Reiser4 filesystem based on dancing tree algorithms. -relayfs.txt - - info on relayfs, for efficient streaming from kernel to user space. +relay.txt + - info on relay, for efficient streaming from kernel to user space. romfs.txt - description of the ROMFS filesystem. smbfs.txt diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking index 1045da582..247d7f619 100644 --- a/Documentation/filesystems/Locking +++ b/Documentation/filesystems/Locking @@ -99,7 +99,7 @@ prototypes: int (*sync_fs)(struct super_block *sb, int wait); void (*write_super_lockfs) (struct super_block *); void (*unlockfs) (struct super_block *); - int (*statfs) (struct super_block *, struct kstatfs *); + int (*statfs) (struct dentry *, struct kstatfs *); int (*remount_fs) (struct super_block *, int *, char *); void (*clear_inode) (struct inode *); void (*umount_begin) (struct super_block *); @@ -142,15 +142,16 @@ see also dquot_operations section. --------------------------- file_system_type --------------------------- prototypes: - struct super_block *(*get_sb) (struct file_system_type *, int, - const char *, void *); + int (*get_sb) (struct file_system_type *, int, + const char *, void *, struct vfsmount *); void (*kill_sb) (struct super_block *); locking rules: may block BKL get_sb yes yes kill_sb yes yes -->get_sb() returns error or a locked superblock (exclusive on ->s_umount). +->get_sb() returns error or 0 with locked superblock attached to the vfsmount +(exclusive on ->s_umount). ->kill_sb() takes a write-locked superblock, does all shutdown work on it, unlocks and drops the reference. diff --git a/Documentation/filesystems/automount-support.txt b/Documentation/filesystems/automount-support.txt index 58c65a171..7cac200e2 100644 --- a/Documentation/filesystems/automount-support.txt +++ b/Documentation/filesystems/automount-support.txt @@ -19,7 +19,7 @@ following procedure: (2) Have the follow_link() op do the following steps: - (a) Call do_kern_mount() to call the appropriate filesystem to set up a + (a) Call vfs_kern_mount() to call the appropriate filesystem to set up a superblock and gain a vfsmount structure representing it. (b) Copy the nameidata provided as an argument and substitute the dentry diff --git a/Documentation/filesystems/configfs/configfs_example.c b/Documentation/filesystems/configfs/configfs_example.c index 3d4713a6c..2d6a14a46 100644 --- a/Documentation/filesystems/configfs/configfs_example.c +++ b/Documentation/filesystems/configfs/configfs_example.c @@ -264,6 +264,15 @@ static struct config_item_type simple_child_type = { }; +struct simple_children { + struct config_group group; +}; + +static inline struct simple_children *to_simple_children(struct config_item *item) +{ + return item ? container_of(to_config_group(item), struct simple_children, group) : NULL; +} + static struct config_item *simple_children_make_item(struct config_group *group, const char *name) { struct simple_child *simple_child; @@ -304,7 +313,13 @@ static ssize_t simple_children_attr_show(struct config_item *item, "items have only one attribute that is readable and writeable.\n"); } +static void simple_children_release(struct config_item *item) +{ + kfree(to_simple_children(item)); +} + static struct configfs_item_operations simple_children_item_ops = { + .release = simple_children_release, .show_attribute = simple_children_attr_show, }; @@ -345,10 +360,6 @@ static struct configfs_subsystem simple_children_subsys = { * children of its own. */ -struct simple_children { - struct config_group group; -}; - static struct config_group *group_children_make_group(struct config_group *group, const char *name) { struct simple_children *simple_children; diff --git a/Documentation/filesystems/devfs/ChangeLog b/Documentation/filesystems/devfs/ChangeLog deleted file mode 100644 index e5aba5246..000000000 --- a/Documentation/filesystems/devfs/ChangeLog +++ /dev/null @@ -1,1977 +0,0 @@ -/* -*- auto-fill -*- */ -=============================================================================== -Changes for patch v1 - -- creation of devfs - -- modified miscellaneous character devices to support devfs -=============================================================================== -Changes for patch v2 - -- bug fix with manual inode creation -=============================================================================== -Changes for patch v3 - -- bugfixes - -- documentation improvements - -- created a couple of scripts (one to save&restore a devfs and the - other to set up compatibility symlinks) - -- devfs support for SCSI discs. New name format is: sd_hHcCiIlL -=============================================================================== -Changes for patch v4 - -- bugfix for the directory reading code - -- bugfix for compilation with kerneld - -- devfs support for generic hard discs - -- rationalisation of the various watchdog drivers -=============================================================================== -Changes for patch v5 - -- support for mounting directly from entries in the devfs (it doesn't - need to be mounted to do this), including the root filesystem. - Mounting of swap partitions also works. Hence, now if you set - CONFIG_DEVFS_ONLY to 'Y' then you won't be able to access your discs - via ordinary device nodes. Naturally, the default is 'N' so that you - can still use your old device nodes. If you want to mount from devfs - entries, make sure you use: append = "root=/dev/sd_..." in your - lilo.conf. It seems LILO looks for the device number (major&minor) - and writes that into the kernel image :-( - -- support for character memory devices (/dev/null, /dev/zero, /dev/full - and so on). Thanks to C. Scott Ananian -=============================================================================== -Changes for patch v6 - -- support for subdirectories - -- support for symbolic links (created by devfs_mk_symlink(), no - support yet for creation via symlink(2)) - -- SCSI disc naming now cast in stone, with the format: - /dev/sd/c0b1t2u3 controller=0, bus=1, ID=2, LUN=3, whole disc - /dev/sd/c0b1t2u3p4 controller=0, bus=1, ID=2, LUN=3, 4th partition - -- loop devices now appear in devfs - -- tty devices, console, serial ports, etc. now appear in devfs - Thanks to C. Scott Ananian - -- bugs with mounting devfs-only devices now fixed -=============================================================================== -Changes for patch v7 - -- SCSI CD-ROMS, tapes and generic devices now appear in devfs -=============================================================================== -Changes for patch v8 - -- bugfix with no-rewind SCSI tapes - -- RAMDISCs now appear in devfs - -- better cleaning up of devfs entries created by various modules - -- interface change to -=============================================================================== -Changes for patch v9 - -- the v8 patch was corrupted somehow, which would affect the patch for - linux/fs/filesystems.c - I've also fixed the v8 patch file on the WWW - -- MetaDevices (/dev/md*) should now appear in devfs -=============================================================================== -Changes for patch v10 - -- bugfix in meta device support for devfs - -- created this ChangeLog file - -- added devfs support to the floppy driver - -- added support for creating sockets in a devfs -=============================================================================== -Changes for patch v11 - -- added DEVFS_FL_HIDE_UNREG flag - -- incorporated better patch for ttyname() in libc 5.4.43 from H.J. Lu. - -- interface change to - -- support for creating symlinks with symlink(2) - -- parallel port printer (/dev/lp*) now appears in devfs -=============================================================================== -Changes for patch v12 - -- added inode check to function - -- improved devfs support when mounting from devfs - -- added call to <> operation when removing swap areas on - devfs devices - -- increased NR_SUPER to 128 to support large numbers of devfs mounts - (for chroot(2) gaols) - -- fixed bug in SCSI disc support: was generating incorrect minors if - SCSI ID's did not start at 0 and increase by 1 - -- support symlink traversal when mounting root -=============================================================================== -Changes for patch v13 - -- added devfs support to soundcard driver - Thanks to Eric Dumas and - C. Scott Ananian - -- added devfs support to the joystick driver - -- loop driver now has it's own subdirectory "/dev/loop/" - -- created and functions - -- fix problem with SCSI disc compatibility names (sd{a,b,c,d,e,f}) - which assumes ID's start at 0 and increase by 1. Also only create - devfs entries for SCSI disc partitions which actually exist - Show new names in partition check - Thanks to Jakub Jelinek -=============================================================================== -Changes for patch v14 - -- bug fix in floppy driver: would not compile without - CONFIG_DEVFS_FS='Y' - Thanks to Jurgen Botz - -- bug fix in loop driver - Thanks to C. Scott Ananian - -- do not create devfs entries for printers not configured - Thanks to C. Scott Ananian - -- do not create devfs entries for serial ports not present - Thanks to C. Scott Ananian - -- ensure is exported from tty_io.c - Thanks to C. Scott Ananian - -- allow unregistering of devfs symlink entries - -- fixed bug in SCSI disc naming introduced in last patch version -=============================================================================== -Changes for patch v15 - -- ported to kernel 2.1.81 -=============================================================================== -Changes for patch v16 - -- created function - -- moved DEVFS_SUPER_MAGIC into header file - -- added DEVFS_FL_HIDE flag - -- created - -- created - -- fixed bugs in searching by major&minor - -- changed interface to , and - - -- fixed inode times when symlink created with symlink(2) - -- change tty driver to do auto-creation of devfs entries - Thanks to C. Scott Ananian - -- fixed bug in genhd.c: whole disc (non-SCSI) was not registered to - devfs - -- updated libc 5.4.43 patch for ttyname() -=============================================================================== -Changes for patch v17 - -- added CONFIG_DEVFS_TTY_COMPAT - Thanks to C. Scott Ananian - -- bugfix in devfs support for drivers/char/lp.c - Thanks to C. Scott Ananian - -- clean up serial driver so that PCMCIA devices unregister correctly - Thanks to C. Scott Ananian - -- fixed bug in genhd.c: whole disc (non-SCSI) was not registered to - devfs [was missing in patch v16] - -- updated libc 5.4.43 patch for ttyname() [was missing in patch v16] - -- all SCSI devices now registered in /dev/sg - -- support removal of devfs entries via unlink(2) -=============================================================================== -Changes for patch v18 - -- added floppy/?u720 floppy entry - -- fixed kerneld support for entries in devfs subdirectories - -- incorporated latest patch for ttyname() in libc 5.4.43 from H.J. Lu. -=============================================================================== -Changes for patch v19 - -- bug fix when looking up unregistered entries: kerneld was not called - -- fixes for kernel 2.1.86 (now requires 2.1.86) -=============================================================================== -Changes for patch v20 - -- only create available floppy entries - Thanks to Andrzej Krzysztofowicz - -- new IDE naming scheme following SCSI format (i.e. /dev/id/c0b0t0u0p1 - instead of /dev/hda1) - Thanks to Andrzej Krzysztofowicz - -- new XT disc naming scheme following SCSI format (i.e. /dev/xd/c0t0p1 - instead of /dev/xda1) - Thanks to Andrzej Krzysztofowicz - -- new non-standard CD-ROM names (i.e. /dev/sbp/c#t#) - Thanks to Andrzej Krzysztofowicz - -- allow symlink traversal when mounting the root filesystem - -- Create entries for MD devices at MD init - Thanks to Christophe Leroy -=============================================================================== -Changes for patch v21 - -- ported to kernel 2.1.91 -=============================================================================== -Changes for patch v22 - -- SCSI host number patch ("scsihosts=" kernel option) - Thanks to Andrzej Krzysztofowicz -=============================================================================== -Changes for patch v23 - -- Fixed persistence bug with device numbers for manually created - device files - -- Fixed problem with recreating symlinks with different content - -- Added CONFIG_DEVFS_MOUNT (mount devfs on /dev at boot time) -=============================================================================== -Changes for patch v24 - -- Switched from CONFIG_KERNELD to CONFIG_KMOD: module autoloading - should now work again - -- Hide entries which are manually unlinked - -- Always invalidate devfs dentry cache when registering entries - -- Support removal of devfs directories via rmdir(2) - -- Ensure directories created by are visible - -- Default no access for "other" for floppy device -=============================================================================== -Changes for patch v25 - -- Updates to CREDITS file and minor IDE numbering change - Thanks to Andrzej Krzysztofowicz - -- Invalidate devfs dentry cache when making directories - -- Invalidate devfs dentry cache when removing entries - -- More informative message if root FS mount fails when devfs - configured - -- Fixed persistence bug with fifos -=============================================================================== -Changes for patch v26 - -- ported to kernel 2.1.97 - -- Changed serial directory from "/dev/serial" to "/dev/tts" and - "/dev/consoles" to "/dev/vc" to be more friendly to new procps -=============================================================================== -Changes for patch v27 - -- Added support for IDE4 and IDE5 - Thanks to Andrzej Krzysztofowicz - -- Documented "scsihosts=" boot parameter - -- Print process command when debugging kerneld/kmod - -- Added debugging for register/unregister/change operations - -- Added "devfs=" boot options - -- Hide unregistered entries by default -=============================================================================== -Changes for patch v28 - -- No longer lock/unlock superblock in (cope with - recent VFS interface change) - -- Do not automatically change ownership/protection of /dev/tty - -- Drop negative dentries when they are released - -- Manage dcache more efficiently -=============================================================================== -Changes for patch v29 - -- Added DEVFS_FL_AUTO_DEVNUM flag -=============================================================================== -Changes for patch v30 - -- No longer set unnecessary methods - -- Ported to kernel 2.1.99-pre3 -=============================================================================== -Changes for patch v31 - -- Added PID display to debugging message - -- Added "diread" and "diwrite" options - -- Ported to kernel 2.1.102 - -- Fixed persistence problem with permissions -=============================================================================== -Changes for patch v32 - -- Fixed devfs support in drivers/block/md.c -=============================================================================== -Changes for patch v33 - -- Support legacy device nodes - -- Fixed bug where recreated inodes were hidden - -- New IDE naming scheme: everything is under /dev/ide -=============================================================================== -Changes for patch v34 - -- Improved debugging in - -- Prevent duplicate calls to in SCSI layer - -- No longer free old dentries in - -- Free all dentries for a given entry when deleting inodes -=============================================================================== -Changes for patch v35 - -- Ported to kernel 2.1.105 (sound driver changes) -=============================================================================== -Changes for patch v36 - -- Fixed sound driver port -=============================================================================== -Changes for patch v37 - -- Minor documentation tweaks -=============================================================================== -Changes for patch v38 - -- More documentation tweaks - -- Fix for sound driver port - -- Removed ttyname-patch (grab libc 5.4.44 instead) - -- Ported to kernel 2.1.107-pre2 (loop driver fix) -=============================================================================== -Changes for patch v39 - -- Ported to kernel 2.1.107 (hd.c hunk broke due to spelling "fixes"). Sigh - -- Removed many #ifdef's, replaced with trickery in include/devfs_fs.h -=============================================================================== -Changes for patch v40 - -- Fix for sound driver port - -- Limit auto-device numbering to majors 128 to 239 -=============================================================================== -Changes for patch v41 - -- Fixed inode times persistence problem -=============================================================================== -Changes for patch v42 - -- Ported to kernel 2.1.108 (drivers/scsi/hosts.c hunk broke) -=============================================================================== -Changes for patch v43 - -- Fixed spelling in debug - -- Fixed bug in parsing "dilookup" - -- More #ifdef's removed - -- Supported Sparc keyboard (/dev/kbd) - -- Supported DSP56001 digital signal processor (/dev/dsp56k) - -- Supported Apple Desktop Bus (/dev/adb) - -- Supported Coda network file system (/dev/cfs*) -=============================================================================== -Changes for patch v44 - -- Fixed devfs inode leak when manually recreating inodes - -- Fixed permission persistence problem when recreating inodes -=============================================================================== -Changes for patch v45 - -- Ported to kernel 2.1.110 -=============================================================================== -Changes for patch v46 - -- Ported to kernel 2.1.112-pre1 - -- Removed harmless "unused variable" compiler warning - -- Fixed modes for manually recreated device nodes -=============================================================================== -Changes for patch v47 - -- Added NULL devfs inode warning in - -- Force all inode nlink values to 1 -=============================================================================== -Changes for patch v48 - -- Added "dimknod" option - -- Set inode nlink to 0 when freeing dentries - -- Added support for virtual console capture devices (/dev/vcs*) - Thanks to Dennis Hou - -- Fixed modes for manually recreated symlinks -=============================================================================== -Changes for patch v49 - -- Ported to kernel 2.1.113 -=============================================================================== -Changes for patch v50 - -- Fixed bugs in recreated directories and symlinks -=============================================================================== -Changes for patch v51 - -- Improved robustness of rc.devfs script - Thanks to Roderich Schupp - -- Fixed bugs in recreated device nodes - -- Fixed bug in currently unused - -- Defined new type - -- Improved debugging when getting entries - -- Fixed bug where directories could be emptied - -- Ported to kernel 2.1.115 -=============================================================================== -Changes for patch v52 - -- Replaced dummy .epoch inode with .devfsd character device - -- Modified rc.devfs to take account of above change - -- Removed spurious driver warning messages when CONFIG_DEVFS_FS=n - -- Implemented devfsd protocol revision 0 -=============================================================================== -Changes for patch v53 - -- Ported to kernel 2.1.116 (kmod change broke hunk) - -- Updated Documentation/Configure.help - -- Test and tty pattern patch for rc.devfs script - Thanks to Roderich Schupp - -- Added soothing message to warning in -=============================================================================== -Changes for patch v54 - -- Ported to kernel 2.1.117 - -- Fixed default permissions in sound driver - -- Added support for frame buffer devices (/dev/fb*) -=============================================================================== -Changes for patch v55 - -- Ported to kernel 2.1.119 - -- Use GCC extensions for structure initialisations - -- Implemented async open notification - -- Incremented devfsd protocol revision to 1 -=============================================================================== -Changes for patch v56 - -- Ported to kernel 2.1.120-pre3 - -- Moved async open notification to end of -=============================================================================== -Changes for patch v57 - -- Ported to kernel 2.1.121 - -- Prepended "/dev/" to module load request - -- Renamed to - -- Created sample modules.conf file -=============================================================================== -Changes for patch v58 - -- Fixed typo "AYSNC" -> "ASYNC" -=============================================================================== -Changes for patch v59 - -- Added open flag for files -=============================================================================== -Changes for patch v60 - -- Ported to kernel 2.1.123-pre2 -=============================================================================== -Changes for patch v61 - -- Set i_blocks=0 and i_blksize=1024 in -=============================================================================== -Changes for patch v62 - -- Ported to kernel 2.1.123 -=============================================================================== -Changes for patch v63 - -- Ported to kernel 2.1.124-pre2 -=============================================================================== -Changes for patch v64 - -- Fixed Unix98 pty support - -- Increased buffer size in to avoid crash and - burn -=============================================================================== -Changes for patch v65 - -- More Unix98 pty support fixes - -- Added test for empty <> in - -- Renamed to and published - -- Created /dev/root symlink - Thanks to Roderich Schupp - with further modifications by me -=============================================================================== -Changes for patch v66 - -- Yet more Unix98 pty support fixes (now tested) - -- Created - -- Support media change checks when CONFIG_DEVFS_ONLY=y - -- Abolished Unix98-style PTY names for old PTY devices -=============================================================================== -Changes for patch v67 - -- Added inline declaration for dummy - -- Removed spurious "unable to register... in devfs" messages when - CONFIG_DEVFS_FS=n - -- Fixed misc. devices when CONFIG_DEVFS_FS=n - -- Limit auto-device numbering to majors 144 to 239 -=============================================================================== -Changes for patch v68 - -- Hide unopened virtual consoles from directory listings - -- Added support for video capture devices - -- Ported to kernel 2.1.125 -=============================================================================== -Changes for patch v69 - -- Fix for CONFIG_VT=n -=============================================================================== -Changes for patch v70 - -- Added support for non-OSS/Free sound cards -=============================================================================== -Changes for patch v71 - -- Ported to kernel 2.1.126-pre2 -=============================================================================== -Changes for patch v72 - -- #ifdef's for CONFIG_DEVFS_DISABLE_OLD_NAMES removed -=============================================================================== -Changes for patch v73 - -- CONFIG_DEVFS_DISABLE_OLD_NAMES replaced with "nocompat" boot option - -- CONFIG_DEVFS_BOOT_OPTIONS removed: boot options always available -=============================================================================== -Changes for patch v74 - -- Removed CONFIG_DEVFS_MOUNT and "mount" boot option and replaced with - "nomount" boot option - -- Documentation updates - -- Updated sample modules.conf -=============================================================================== -Changes for patch v75 - -- Updated sample modules.conf - -- Remount devfs after initrd finishes - -- Ported to kernel 2.1.127 - -- Added support for ISDN - Thanks to Christophe Leroy -=============================================================================== -Changes for patch v76 - -- Updated an email address in ChangeLog - -- CONFIG_DEVFS_ONLY replaced with "only" boot option -=============================================================================== -Changes for patch v77 - -- Added DEVFS_FL_REMOVABLE flag - -- Check for disc change when listing directories with removable media - devices - -- Use DEVFS_FL_REMOVABLE in sd.c - -- Ported to kernel 2.1.128 -=============================================================================== -Changes for patch v78 - -- Only call on first call to - -- Ported to kernel 2.1.129-pre5 - -- ISDN support improvements - Thanks to Christophe Leroy -=============================================================================== -Changes for patch v79 - -- Ported to kernel 2.1.130 - -- Renamed miscdevice "apm" to "apm_bios" to be consistent with - devices.txt -=============================================================================== -Changes for patch v80 - -- Ported to kernel 2.1.131 - -- Updated for VFS change in 2.1.131 -=============================================================================== -Changes for patch v81 - -- Fixed permissions on /dev/ptmx -=============================================================================== -Changes for patch v82 - -- Ported to kernel 2.1.132-pre4 - -- Changed initial permissions on /dev/pts/* - -- Created - -- Added "symlinks" boot option - -- Changed devfs_register_blkdev() back to register_blkdev() for IDE - -- Check for partitions on removable media in -=============================================================================== -Changes for patch v83 - -- Fixed support for ramdisc when using string-based root FS name - -- Ported to kernel 2.2.0-pre1 -=============================================================================== -Changes for patch v84 - -- Ported to kernel 2.2.0-pre7 -=============================================================================== -Changes for patch v85 - -- Compile fixes for driver/sound/sound_common.c (non-module) and - drivers/isdn/isdn_common.c - Thanks to Christophe Leroy - -- Added support for registering regular files - -- Created - -- Added /dev/cpu/mtrr as an alternative interface to /proc/mtrr - -- Update devfs inodes from entries if not changed through FS -=============================================================================== -Changes for patch v86 - -- Ported to kernel 2.2.0-pre9 -=============================================================================== -Changes for patch v87 - -- Fixed bug when mounting non-devfs devices in a devfs -=============================================================================== -Changes for patch v88 - -- Fixed to only initialise temporary inodes - -- Trap for NULL fops in - -- Return -ENODEV in for non-driver inodes - -- Fixed bug when unswapping non-devfs devices in a devfs -=============================================================================== -Changes for patch v89 - -- Switched to C data types in include/linux/devfs_fs.h - -- Switched from PATH_MAX to DEVFS_PATHLEN - -- Updated Documentation/filesystems/devfs/modules.conf to take account - of reverse scanning (!) by modprobe - -- Ported to kernel 2.2.0 -=============================================================================== -Changes for patch v90 - -- CONFIG_DEVFS_DISABLE_OLD_TTY_NAMES replaced with "nottycompat" boot - option - -- CONFIG_DEVFS_TTY_COMPAT removed: existing "symlinks" boot option now - controls this. This means you must have libc 5.4.44 or later, or a - recent version of libc 6 if you use the "symlinks" option -=============================================================================== -Changes for patch v91 - -- Switch from to in - drivers/char/vc_screen.c to fix problems with Midnight Commander -=============================================================================== -Changes for patch v92 - -- Ported to kernel 2.2.2-pre5 -=============================================================================== -Changes for patch v93 - -- Modified in drivers/scsi/sd.c to cope with devices that - don't exist (which happens with new RAID autostart code printk()s) -=============================================================================== -Changes for patch v94 - -- Fixed bug in joystick driver: only first joystick was registered -=============================================================================== -Changes for patch v95 - -- Fixed another bug in joystick driver - -- Fixed to not overrun event buffer -=============================================================================== -Changes for patch v96 - -- Ported to kernel 2.2.5-2 - -- Created - -- Fixed bugs: compatibility entries were not unregistered for: - loop driver - floppy driver - RAMDISC driver - IDE tape driver - SCSI CD-ROM driver - SCSI HDD driver -=============================================================================== -Changes for patch v97 - -- Fixed bugs: compatibility entries were not unregistered for: - ALSA sound driver - partitions in generic disc driver - -- Don't return unregistred entries in - -- Panic in if entry unregistered - -- Don't panic in for duplicates -=============================================================================== -Changes for patch v98 - -- Don't unregister already unregistered entries in - -- Register entry in - -- Unregister entry in - -- Changed to in drivers/char/tty_io.c - -- Ported to kernel 2.2.7 -=============================================================================== -Changes for patch v99 - -- Ported to kernel 2.2.8 - -- Fixed bug in drivers/scsi/sd.c when >16 SCSI discs - -- Disable warning messages when unable to read partition table for - removable media -=============================================================================== -Changes for patch v100 - -- Ported to kernel 2.3.1-pre5 - -- Added "oops-on-panic" boot option - -- Improved debugging in and - -- Register entry in - -- Unregister entry in - -- Register entry in - -- Unregister entry in - -- Added support for ALSA drivers -=============================================================================== -Changes for patch v101 - -- Ported to kernel 2.3.2 -=============================================================================== -Changes for patch v102 - -- Update serial driver to register PCMCIA entries - Thanks to Roch-Alexandre Nomine-Beguin - -- Updated an email address in ChangeLog - -- Hide virtual console capture entries from directory listings when - corresponding console device is not open -=============================================================================== -Changes for patch v103 - -- Ported to kernel 2.3.3 -=============================================================================== -Changes for patch v104 - -- Added documentation for some functions - -- Added "doc" target to fs/devfs/Makefile - -- Added "v4l" directory for video4linux devices - -- Replaced call to in with call to - - -- Moved registration for sr and sg drivers from detect() to attach() - methods - -- Register entries in and unregister in - -- Work around IDE driver treating CD-ROM as gendisk - -- Use instead of in rc.devfs - -- Updated ToDo list - -- Removed "oops-on-panic" boot option: now always Oops -=============================================================================== -Changes for patch v105 - -- Unregister SCSI host from in - Thanks to Zoltán Böszörményi - -- Don't save /dev/log in rc.devfs - -- Ported to kernel 2.3.4-pre1 -=============================================================================== -Changes for patch v106 - -- Fixed silly typo in drivers/scsi/st.c - -- Improved debugging in -=============================================================================== -Changes for patch v107 - -- Added "diunlink" and "nokmod" boot options - -- Removed superfluous warning message in -=============================================================================== -Changes for patch v108 - -- Remove entries when unloading sound module -=============================================================================== -Changes for patch v109 - -- Ported to kernel 2.3.6-pre2 -=============================================================================== -Changes for patch v110 - -- Took account of change to -=============================================================================== -Changes for patch v111 - -- Created separate event queue for each mounted devfs - -- Removed - -- Created new ioctl()s for devfsd - -- Incremented devfsd protocol revision to 3 - -- Fixed bug when re-creating directories: contents were lost - -- Block access to inodes until devfsd updates permissions -=============================================================================== -Changes for patch v112 - -- Modified patch so it applies against 2.3.5 and 2.3.6 - -- Updated an email address in ChangeLog - -- Do not automatically change ownership/protection of /dev/tty - -- Updated sample modules.conf - -- Switched to sending process uid/gid to devfsd - -- Renamed to - -- Added DEVFSD_NOTIFY_LOOKUP event - -- Added DEVFSD_NOTIFY_CHANGE event - -- Added DEVFSD_NOTIFY_CREATE event - -- Incremented devfsd protocol revision to 4 - -- Moved kernel-specific stuff to include/linux/devfs_fs_kernel.h -=============================================================================== -Changes for patch v113 - -- Ported to kernel 2.3.9 - -- Restricted permissions on some block devices -=============================================================================== -Changes for patch v114 - -- Added support for /dev/netlink - Thanks to Dennis Hou - -- Return EISDIR rather than EINVAL for read(2) on directories - -- Ported to kernel 2.3.10 -=============================================================================== -Changes for patch v115 - -- Added support for all remaining character devices - Thanks to Dennis Hou - -- Cleaned up netlink support -=============================================================================== -Changes for patch v116 - -- Added support for /dev/parport%d - Thanks to Tim Waugh - -- Fixed parallel port ATAPI tape driver - -- Fixed Atari SLM laser printer driver -=============================================================================== -Changes for patch v117 - -- Added support for COSA card - Thanks to Dennis Hou - -- Fixed drivers/char/ppdev.c: missing #include - -- Fixed drivers/char/ftape/zftape/zftape-init.c - Thanks to Vladimir Popov -=============================================================================== -Changes for patch v118 - -- Ported to kernel 2.3.15-pre3 - -- Fixed bug in loop driver - -- Unregister /dev/lp%d entries in drivers/char/lp.c - Thanks to Maciej W. Rozycki -=============================================================================== -Changes for patch v119 - -- Ported to kernel 2.3.16 -=============================================================================== -Changes for patch v120 - -- Fixed bug in drivers/scsi/scsi.c - -- Added /dev/ppp - Thanks to Dennis Hou - -- Ported to kernel 2.3.17 -=============================================================================== -Changes for patch v121 - -- Fixed bug in drivers/block/loop.c - -- Ported to kernel 2.3.18 -=============================================================================== -Changes for patch v122 - -- Ported to kernel 2.3.19 -=============================================================================== -Changes for patch v123 - -- Ported to kernel 2.3.20 -=============================================================================== -Changes for patch v124 - -- Ported to kernel 2.3.21 -=============================================================================== -Changes for patch v125 - -- Created , , - and - Added <> parameter to , , - and - Work sponsored by SGI - -- Fixed apparent bug in COSA driver - -- Re-instated "scsihosts=" boot option -=============================================================================== -Changes for patch v126 - -- Always create /dev/pts if CONFIG_UNIX98_PTYS=y - -- Fixed call to in drivers/block/ide-disk.c - Thanks to Dennis Hou - -- Allow multiple unregistrations - -- Created /dev/scsi hierarchy - Work sponsored by SGI -=============================================================================== -Changes for patch v127 - -Work sponsored by SGI - -- No longer disable devpts if devfs enabled (caveat emptor) - -- Added flags array to struct gendisk and removed code from - drivers/scsi/sd.c - -- Created /dev/discs hierarchy -=============================================================================== -Changes for patch v128 - -Work sponsored by SGI - -- Created /dev/cdroms hierarchy -=============================================================================== -Changes for patch v129 - -Work sponsored by SGI - -- Removed compatibility entries for sound devices - -- Removed compatibility entries for printer devices - -- Removed compatibility entries for video4linux devices - -- Removed compatibility entries for parallel port devices - -- Removed compatibility entries for frame buffer devices -=============================================================================== -Changes for patch v130 - -Work sponsored by SGI - -- Added major and minor number to devfsd protocol - -- Incremented devfsd protocol revision to 5 - -- Removed compatibility entries for SoundBlaster CD-ROMs - -- Removed compatibility entries for netlink devices - -- Removed compatibility entries for SCSI generic devices - -- Removed compatibility entries for SCSI tape devices -=============================================================================== -Changes for patch v131 - -Work sponsored by SGI - -- Support info pointer for all devfs entry types - -- Added <> parameter to and - -- Removed /dev/st hierarchy - -- Removed /dev/sg hierarchy - -- Removed compatibility entries for loop devices - -- Removed compatibility entries for IDE tape devices - -- Removed compatibility entries for SCSI CD-ROMs - -- Removed /dev/sr hierarchy -=============================================================================== -Changes for patch v132 - -Work sponsored by SGI - -- Removed compatibility entries for floppy devices - -- Removed compatibility entries for RAMDISCs - -- Removed compatibility entries for meta-devices - -- Removed compatibility entries for SCSI discs - -- Created - -- Removed /dev/sd hierarchy - -- Support "../" when searching devfs namespace - -- Created /dev/ide/host* hierarchy - -- Supported IDE hard discs in /dev/ide/host* hierarchy - -- Removed compatibility entries for IDE discs - -- Removed /dev/ide/hd hierarchy - -- Supported IDE CD-ROMs in /dev/ide/host* hierarchy - -- Removed compatibility entries for IDE CD-ROMs - -- Removed /dev/ide/cd hierarchy -=============================================================================== -Changes for patch v133 - -Work sponsored by SGI - -- Created - -- Fixed bug in fs/partitions/check.c when rescanning -=============================================================================== -Changes for patch v134 - -Work sponsored by SGI - -- Removed /dev/sd, /dev/sr, /dev/st and /dev/sg directories - -- Removed /dev/ide/hd directory - -- Exported - -- Created and /dev/tapes hierarchy - -- Removed /dev/ide/mt hierarchy - -- Removed /dev/ide/fd hierarchy - -- Ported to kernel 2.3.25 -=============================================================================== -Changes for patch v135 - -Work sponsored by SGI - -- Removed compatibility entries for virtual console capture devices - -- Removed unused - -- Removed compatibility entries for serial devices - -- Removed compatibility entries for console devices - -- Do not hide entries from devfsd or children - -- Removed DEVFS_FL_TTY_COMPAT flag - -- Removed "nottycompat" boot option - -- Removed -=============================================================================== -Changes for patch v136 - -Work sponsored by SGI - -- Moved BSD pty devices to /dev/pty - -- Added DEVFS_FL_WAIT flag -=============================================================================== -Changes for patch v137 - -Work sponsored by SGI - -- Really fixed bug in fs/partitions/check.c when rescanning - -- Support new "disc" naming scheme in - -- Allow NULL fops in - -- Removed redundant name functions in SCSI disc and IDE drivers -=============================================================================== -Changes for patch v138 - -Work sponsored by SGI - -- Fixed old bugs in drivers/block/paride/pt.c, drivers/char/tpqic02.c, - drivers/net/wan/cosa.c and drivers/scsi/scsi.c - Thanks to Sergey Kubushin - -- Fall back to major table if NULL fops given to -=============================================================================== -Changes for patch v139 - -Work sponsored by SGI - -- Corrected and moved and declarations - from arch/alpha/kernel/osf_sys.c to include/linux/fs.h - -- Removed name function from struct gendisk - -- Updated devfs FAQ -=============================================================================== -Changes for patch v140 - -Work sponsored by SGI - -- Ported to kernel 2.3.27 -=============================================================================== -Changes for patch v141 - -Work sponsored by SGI - -- Bug fix in arch/m68k/atari/joystick.c - -- Moved ISDN and capi devices to /dev/isdn -=============================================================================== -Changes for patch v142 - -Work sponsored by SGI - -- Bug fix in drivers/block/ide-probe.c (patch confusion) -=============================================================================== -Changes for patch v143 - -Work sponsored by SGI - -- Bug fix in drivers/block/blkpg.c:partition_name() -=============================================================================== -Changes for patch v144 - -Work sponsored by SGI - -- Ported to kernel 2.3.29 - -- Removed calls to from cdu31a, cm206, mcd and mcdx - CD-ROM drivers: generic driver handles this now - -- Moved joystick devices to /dev/joysticks -=============================================================================== -Changes for patch v145 - -Work sponsored by SGI - -- Ported to kernel 2.3.30-pre3 - -- Register whole-disc entry even for invalid partition tables - -- Fixed bug in mounting root FS when initrd enabled - -- Fixed device entry leak with IDE CD-ROMs - -- Fixed compile problem with drivers/isdn/isdn_common.c - -- Moved COSA devices to /dev/cosa - -- Support fifos when unregistering - -- Created and used in many drivers - -- Moved Coda devices to /dev/coda - -- Moved parallel port IDE tapes to /dev/pt - -- Moved parallel port IDE generic devices to /dev/pg -=============================================================================== -Changes for patch v146 - -Work sponsored by SGI - -- Removed obsolete DEVFS_FL_COMPAT and DEVFS_FL_TOLERANT flags - -- Fixed compile problem with fs/coda/psdev.c - -- Reinstate change to in - drivers/block/ide-probe.c now that fs/isofs/inode.c is fixed - -- Switched to in drivers/block/floppy.c, - drivers/scsi/sr.c and drivers/block/md.c - -- Moved DAC960 devices to /dev/dac960 -=============================================================================== -Changes for patch v147 - -Work sponsored by SGI - -- Ported to kernel 2.3.32-pre4 -=============================================================================== -Changes for patch v148 - -Work sponsored by SGI - -- Removed kmod support: use devfsd instead - -- Moved miscellaneous character devices to /dev/misc -=============================================================================== -Changes for patch v149 - -Work sponsored by SGI - -- Ensure include/linux/joystick.h is OK for user-space - -- Improved debugging in - -- Ensure dentries created by devfsd will be cleaned up -=============================================================================== -Changes for patch v150 - -Work sponsored by SGI - -- Ported to kernel 2.3.34 -=============================================================================== -Changes for patch v151 - -Work sponsored by SGI - -- Ported to kernel 2.3.35-pre1 - -- Created -=============================================================================== -Changes for patch v152 - -Work sponsored by SGI - -- Updated sample modules.conf - -- Ported to kernel 2.3.36-pre1 -=============================================================================== -Changes for patch v153 - -Work sponsored by SGI - -- Ported to kernel 2.3.42 - -- Removed -=============================================================================== -Changes for patch v154 - -Work sponsored by SGI - -- Took account of device number changes for /dev/fb* -=============================================================================== -Changes for patch v155 - -Work sponsored by SGI - -- Ported to kernel 2.3.43-pre8 - -- Moved /dev/tty0 to /dev/vc/0 - -- Moved sequence number formatting from <_tty_make_name> to drivers -=============================================================================== -Changes for patch v156 - -Work sponsored by SGI - -- Fixed breakage in drivers/scsi/sd.c due to recent SCSI changes -=============================================================================== -Changes for patch v157 - -Work sponsored by SGI - -- Ported to kernel 2.3.45 -=============================================================================== -Changes for patch v158 - -Work sponsored by SGI - -- Ported to kernel 2.3.46-pre2 -=============================================================================== -Changes for patch v159 - -Work sponsored by SGI - -- Fixed drivers/block/md.c - Thanks to Mike Galbraith - -- Documentation fixes - -- Moved device registration from to - Thanks to Tim Waugh -=============================================================================== -Changes for patch v160 - -Work sponsored by SGI - -- Fixed drivers/char/joystick/joystick.c - Thanks to Vojtech Pavlik - -- Documentation updates - -- Fixed arch/i386/kernel/mtrr.c if procfs and devfs not enabled - -- Fixed drivers/char/stallion.c -=============================================================================== -Changes for patch v161 - -Work sponsored by SGI - -- Remove /dev/ide when ide-mod is unloaded - -- Fixed bug in drivers/block/ide-probe.c when secondary but no primary - -- Added DEVFS_FL_NO_PERSISTENCE flag - -- Used new DEVFS_FL_NO_PERSISTENCE flag for Unix98 pty slaves - -- Removed unnecessary call to in - - -- Only set auto-ownership for /dev/pty/s* -=============================================================================== -Changes for patch v162 - -Work sponsored by SGI - -- Set inode->i_size to correct size for symlinks - Thanks to Jeremy Fitzhardinge - -- Only give lookup() method to directories to comply with new VFS - assumptions - -- Remove unnecessary tests in symlink methods - -- Don't kill existing block ops in - -- Restore auto-ownership for /dev/pty/m* -=============================================================================== -Changes for patch v163 - -Work sponsored by SGI - -- Don't create missing directories in - -- Removed Documentation/filesystems/devfs/mk-devlinks - -- Updated Documentation/filesystems/devfs/README -=============================================================================== -Changes for patch v164 - -Work sponsored by SGI - -- Fixed CONFIG_DEVFS breakage in drivers/char/serial.c introduced in - linux-2.3.99-pre6-7 -=============================================================================== -Changes for patch v165 - -Work sponsored by SGI - -- Ported to kernel 2.3.99-pre6 -=============================================================================== -Changes for patch v166 - -Work sponsored by SGI - -- Added CONFIG_DEVFS_MOUNT -=============================================================================== -Changes for patch v167 - -Work sponsored by SGI - -- Updated Documentation/filesystems/devfs/README - -- Updated sample modules.conf -=============================================================================== -Changes for patch v168 - -Work sponsored by SGI - -- Disabled multi-mount capability (use VFS bindings instead) - -- Updated README from master HTML file -=============================================================================== -Changes for patch v169 - -Work sponsored by SGI - -- Removed multi-mount code - -- Removed compatibility macros: VFS has changed too much -=============================================================================== -Changes for patch v170 - -Work sponsored by SGI - -- Updated README from master HTML file - -- Merged devfs inode into devfs entry -=============================================================================== -Changes for patch v171 - -Work sponsored by SGI - -- Updated sample modules.conf - -- Removed dead code in which used to call - - -- Ported to kernel 2.4.0-test2-pre3 -=============================================================================== -Changes for patch v172 - -Work sponsored by SGI - -- Changed interface to - -- Changed interface to -=============================================================================== -Changes for patch v173 - -Work sponsored by SGI - -- Simplified interface to - -- Simplified interface to - -- Simplified interface to -=============================================================================== -Changes for patch v174 - -Work sponsored by SGI - -- Updated README from master HTML file -=============================================================================== -Changes for patch v175 - -Work sponsored by SGI - -- DocBook update for fs/devfs/base.c - Thanks to Tim Waugh - -- Removed stale fs/tunnel.c (was never used or completed) -=============================================================================== -Changes for patch v176 - -Work sponsored by SGI - -- Updated ToDo list - -- Removed sample modules.conf: now distributed with devfsd - -- Updated README from master HTML file - -- Ported to kernel 2.4.0-test3-pre4 (which had devfs-patch-v174) -=============================================================================== -Changes for patch v177 - -- Updated README from master HTML file - -- Documentation cleanups - -- Ensure terminates string for root entry - Thanks to Tim Jansen - -- Exported to modules - -- Make send events to devfsd - -- Cleaned up option processing in - -- Fixed bugs in handling symlinks: could leak or cause Oops - -- Cleaned up directory handling by separating fops - Thanks to Alexander Viro -=============================================================================== -Changes for patch v178 - -- Fixed handling of inverted options in -=============================================================================== -Changes for patch v179 - -- Adjusted to account for fix -=============================================================================== -Changes for patch v180 - -- Fixed !CONFIG_DEVFS_FS stub declaration of -=============================================================================== -Changes for patch v181 - -- Answered question posed by Al Viro and removed his comments from - -- Moved setting of registered flag after other fields are changed - -- Fixed race between and - -- Global VFS changes added bogus BKL to devfsd_close(): removed - -- Widened locking in and - -- Replaced stack usage with kmalloc - -- Simplified locking in and fixed memory leak -=============================================================================== -Changes for patch v182 - -- Created and - -- Removed broken devnum allocation and use - -- Fixed old devnum leak by calling new - -- Created - -- Fixed number leak for /dev/cdroms/cdrom%d - -- Fixed number leak for /dev/discs/disc%d -=============================================================================== -Changes for patch v183 - -- Fixed bug in which could hang boot process -=============================================================================== -Changes for patch v184 - -- Documentation typo fix for fs/devfs/util.c - -- Fixed drivers/char/stallion.c for devfs - -- Added DEVFSD_NOTIFY_DELETE event - -- Updated README from master HTML file - -- Removed #include from fs/devfs/base.c -=============================================================================== -Changes for patch v185 - -- Made and in fs/devfs/util.c - private - -- Fixed inode table races by removing it and using inode->u.generic_ip - instead - -- Moved into - -- Moved into -=============================================================================== -Changes for patch v186 - -- Fixed race in for uni-processor - -- Updated README from master HTML file -=============================================================================== -Changes for patch v187 - -- Fixed drivers/char/stallion.c for devfs - -- Fixed drivers/char/rocket.c for devfs - -- Fixed bug in : limited to 128 numbers -=============================================================================== -Changes for patch v188 - -- Updated major masks in fs/devfs/util.c up to Linus' "no new majors" - proclamation. Block: were 126 now 122 free, char: were 26 now 19 free - -- Updated README from master HTML file - -- Removed remnant of multi-mount support in - -- Removed unused DEVFS_FL_SHOW_UNREG flag -=============================================================================== -Changes for patch v189 - -- Removed nlink field from struct devfs_inode - -- Removed auto-ownership for /dev/pty/* (BSD ptys) and used - DEVFS_FL_CURRENT_OWNER|DEVFS_FL_NO_PERSISTENCE for /dev/pty/s* (just - like Unix98 pty slaves) and made /dev/pty/m* rw-rw-rw- access -=============================================================================== -Changes for patch v190 - -- Updated README from master HTML file - -- Replaced BKL with global rwsem to protect symlink data (quick and - dirty hack) -=============================================================================== -Changes for patch v191 - -- Replaced global rwsem for symlink with per-link refcount -=============================================================================== -Changes for patch v192 - -- Removed unnecessary #ifdef CONFIG_DEVFS_FS from arch/i386/kernel/mtrr.c - -- Ported to kernel 2.4.10-pre11 - -- Set inode->i_mapping->a_ops for block nodes in -=============================================================================== -Changes for patch v193 - -- Went back to global rwsem for symlinks (refcount scheme no good) -=============================================================================== -Changes for patch v194 - -- Fixed overrun in by removing function (not needed) - -- Updated README from master HTML file -=============================================================================== -Changes for patch v195 - -- Fixed buffer underrun in - -- Moved down_read() from to -=============================================================================== -Changes for patch v196 - -- Fixed race in when setting event mask - Thanks to Kari Hurtta - -- Avoid deadlock in by using temporary buffer -=============================================================================== -Changes for patch v197 - -- First release of new locking code for devfs core (v1.0) - -- Fixed bug in drivers/cdrom/cdrom.c -=============================================================================== -Changes for patch v198 - -- Discard temporary buffer, now use "%s" for dentry names - -- Don't generate path in : use fake entry instead - -- Use "existing" directory in <_devfs_make_parent_for_leaf> - -- Use slab cache rather than fixed buffer for devfsd events -=============================================================================== -Changes for patch v199 - -- Removed obsolete usage of DEVFS_FL_NO_PERSISTENCE - -- Send DEVFSD_NOTIFY_REGISTERED events in - -- Fixed locking bug in due to typo - -- Do not send CREATE, CHANGE, ASYNC_OPEN or DELETE events from devfsd - or children -=============================================================================== -Changes for patch v200 - -- Ported to kernel 2.5.1-pre2 -=============================================================================== -Changes for patch v201 - -- Fixed bug in : was dereferencing freed pointer -=============================================================================== -Changes for patch v202 - -- Fixed bug in : was dereferencing freed pointer - -- Added process group check for devfsd privileges -=============================================================================== -Changes for patch v203 - -- Use SLAB_ATOMIC in from -=============================================================================== -Changes for patch v204 - -- Removed long obsolete rc.devfs - -- Return old entry in for 2.4.x kernels - -- Updated README from master HTML file - -- Increment refcount on module in - -- Created and exported - -- Increment refcount on module in - -- Created and used where needed to fix races - -- Added clarifying comments in response to preliminary EMC code review - -- Added poisoning to - -- Improved debugging messages - -- Fixed unregister bugs in drivers/md/lvm-fs.c -=============================================================================== -Changes for patch v205 - -- Corrected (made useful) debugging message in - -- Moved in to - -- Fixed drivers/md/lvm-fs.c to create "lvm" entry - -- Added magic number to guard against scribbling drivers - -- Only return old entry in if a directory - -- Defined macros for error and debug messages - -- Updated README from master HTML file -=============================================================================== -Changes for patch v206 - -- Added support for multiple Compaq cpqarray controllers - -- Fixed (rare, old) race in -=============================================================================== -Changes for patch v207 - -- Fixed deadlock bug in - -- Tag VFS deletable in if handle ignored - -- Updated README from master HTML file -=============================================================================== -Changes for patch v208 - -- Added KERN_* to remaining messages - -- Cleaned up declaration of - -- Updated README from master HTML file -=============================================================================== -Changes for patch v209 - -- Updated README from master HTML file - -- Removed silently introduced calls to lock_kernel() and - unlock_kernel() due to recent VFS locking changes. BKL isn't - required in devfs - -- Changed to allow later additions if not yet empty - -- Added calls to in drivers/block/blkpc.c - and - -- Fixed bug in : was clearing beyond - bitfield - -- Fixed bitfield data type for - -- Made major bitfield type and initialiser 64 bit safe -=============================================================================== -Changes for patch v210 - -- Updated fs/devfs/util.c to fix shift warning on 64 bit machines - Thanks to Anton Blanchard - -- Updated README from master HTML file -=============================================================================== -Changes for patch v211 - -- Do not put miscellaneous character devices in /dev/misc if they - specify their own directory (i.e. contain a '/' character) - -- Copied macro for error messages from fs/devfs/base.c to - fs/devfs/util.c and made use of this macro - -- Removed 2.4.x compatibility code from fs/devfs/base.c -=============================================================================== -Changes for patch v212 - -- Added BKL to because drivers still need it -=============================================================================== -Changes for patch v213 - -- Protected and - from changing directory contents -=============================================================================== -Changes for patch v214 - -- Switched to ISO C structure field initialisers - -- Switch to set_current_state() and move before add_wait_queue() - -- Updated README from master HTML file - -- Fixed devfs entry leak in when *readdir fails -=============================================================================== -Changes for patch v215 - -- Created - -- Switched many functions from to - - -- Switched many functions from to -=============================================================================== -Changes for patch v216 - -- Switched arch/ia64/sn/io/hcl.c from to - - -- Removed deprecated -=============================================================================== -Changes for patch v217 - -- Exported and to modules - -- Updated README from master HTML file - -- Fixed module unload race in -=============================================================================== -Changes for patch v218 - -- Removed DEVFS_FL_AUTO_OWNER flag - -- Switched lingering structure field initialiser to ISO C - -- Added locking when setting/clearing flags - -- Documentation fix in fs/devfs/util.c diff --git a/Documentation/filesystems/devfs/README b/Documentation/filesystems/devfs/README deleted file mode 100644 index aabfba24b..000000000 --- a/Documentation/filesystems/devfs/README +++ /dev/null @@ -1,1959 +0,0 @@ -Devfs (Device File System) FAQ - - -Linux Devfs (Device File System) FAQ -Richard Gooch -20-AUG-2002 - - -Document languages: - - - - - - - ------------------------------------------------------------------------------ - -NOTE: the master copy of this document is available online at: - -http://www.atnf.csiro.au/~rgooch/linux/docs/devfs.html -and looks much better than the text version distributed with the -kernel sources. A mirror site is available at: - -http://www.ras.ucalgary.ca/~rgooch/linux/docs/devfs.html - -There is also an optional daemon that may be used with devfs. You can -find out more about it at: - -http://www.atnf.csiro.au/~rgooch/linux/ - -A mailing list is available which you may subscribe to. Send -email -to majordomo@oss.sgi.com with the following line in the -body of the message: -subscribe devfs -To unsubscribe, send the message body: -unsubscribe devfs -instead. The list is archived at - -http://oss.sgi.com/projects/devfs/archive/. - ------------------------------------------------------------------------------ - -Contents - - -What is it? - -Why do it? - -Who else does it? - -How it works - -Operational issues (essential reading) - -Instructions for the impatient -Permissions persistence across reboots -Dealing with drivers without devfs support -All the way with Devfs -Other Issues -Kernel Naming Scheme -Devfsd Naming Scheme -Old Compatibility Names -SCSI Host Probing Issues - - - -Device drivers currently ported - -Allocation of Device Numbers - -Questions and Answers - -Making things work -Alternatives to devfs -What I don't like about devfs -How to report bugs -Strange kernel messages -Compilation problems with devfsd - - -Other resources - -Translations of this document - - ------------------------------------------------------------------------------ - - -What is it? - -Devfs is an alternative to "real" character and block special devices -on your root filesystem. Kernel device drivers can register devices by -name rather than major and minor numbers. These devices will appear in -devfs automatically, with whatever default ownership and -protection the driver specified. A daemon (devfsd) can be used to -override these defaults. Devfs has been in the kernel since 2.3.46. - -NOTE that devfs is entirely optional. If you prefer the old -disc-based device nodes, then simply leave CONFIG_DEVFS_FS=n (the -default). In this case, nothing will change. ALSO NOTE that if you do -enable devfs, the defaults are such that full compatibility is -maintained with the old devices names. - -There are two aspects to devfs: one is the underlying device -namespace, which is a namespace just like any mounted filesystem. The -other aspect is the filesystem code which provides a view of the -device namespace. The reason I make a distinction is because devfs -can be mounted many times, with each mount showing the same device -namespace. Changes made are global to all mounted devfs filesystems. -Also, because the devfs namespace exists without any devfs mounts, you -can easily mount the root filesystem by referring to an entry in the -devfs namespace. - - -The cost of devfs is a small increase in kernel code size and memory -usage. About 7 pages of code (some of that in __init sections) and 72 -bytes for each entry in the namespace. A modest system has only a -couple of hundred device entries, so this costs a few more -pages. Compare this with the suggestion to put /dev on a ramdisc. - -On a typical machine, the cost is under 0.2 percent. On a modest -system with 64 MBytes of RAM, the cost is under 0.1 percent. The -accusations of "bloatware" levelled at devfs are not justified. - ------------------------------------------------------------------------------ - - -Why do it? - -There are several problems that devfs addresses. Some of these -problems are more serious than others (depending on your point of -view), and some can be solved without devfs. However, the totality of -these problems really calls out for devfs. - -The choice is a patchwork of inefficient user space solutions, which -are complex and likely to be fragile, or to use a simple and efficient -devfs which is robust. - -There have been many counter-proposals to devfs, all seeking to -provide some of the benefits without actually implementing devfs. So -far there has been an absence of code and no proposed alternative has -been able to provide all the features that devfs does. Further, -alternative proposals require far more complexity in user-space (and -still deliver less functionality than devfs). Some people have the -mantra of reducing "kernel bloat", but don't consider the effects on -user-space. - -A good solution limits the total complexity of kernel-space and -user-space. - - -Major&minor allocation - -The existing scheme requires the allocation of major and minor device -numbers for each and every device. This means that a central -co-ordinating authority is required to issue these device numbers -(unless you're developing a "private" device driver), in order to -preserve uniqueness. Devfs shifts the burden to a namespace. This may -not seem like a huge benefit, but actually it is. Since driver authors -will naturally choose a device name which reflects the functionality -of the device, there is far less potential for namespace conflict. -Solving this requires a kernel change. - -/dev management - -Because you currently access devices through device nodes, these must -be created by the system administrator. For standard devices you can -usually find a MAKEDEV programme which creates all these (hundreds!) -of nodes. This means that changes in the kernel must be reflected by -changes in the MAKEDEV programme, or else the system administrator -creates device nodes by hand. - -The basic problem is that there are two separate databases of -major and minor numbers. One is in the kernel and one is in /dev (or -in a MAKEDEV programme, if you want to look at it that way). This is -duplication of information, which is not good practice. -Solving this requires a kernel change. - -/dev growth - -A typical /dev has over 1200 nodes! Most of these devices simply don't -exist because the hardware is not available. A huge /dev increases the -time to access devices (I'm just referring to the dentry lookup times -and the time taken to read inodes off disc: the next subsection shows -some more horrors). - -An example of how big /dev can grow is if we consider SCSI devices: - -host 6 bits (say up to 64 hosts on a really big machine) -channel 4 bits (say up to 16 SCSI buses per host) -id 4 bits -lun 3 bits -partition 6 bits -TOTAL 23 bits - - -This requires 8 Mega (1024*1024) inodes if we want to store all -possible device nodes. Even if we scrap everything but id,partition -and assume a single host adapter with a single SCSI bus and only one -logical unit per SCSI target (id), that's still 10 bits or 1024 -inodes. Each VFS inode takes around 256 bytes (kernel 2.1.78), so -that's 256 kBytes of inode storage on disc (assuming real inodes take -a similar amount of space as VFS inodes). This is actually not so bad, -because disc is cheap these days. Embedded systems would care about -256 kBytes of /dev inodes, but you could argue that embedded systems -would have hand-tuned /dev directories. I've had to do just that on my -embedded systems, but I would rather just leave it to devfs. - -Another issue is the time taken to lookup an inode when first -referenced. Not only does this take time in scanning through a list in -memory, but also the seek times to read the inodes off disc. -This could be solved in user-space using a clever programme which -scanned the kernel logs and deleted /dev entries which are not -available and created them when they were available. This programme -would need to be run every time a new module was loaded, which would -slow things down a lot. - -There is an existing programme called scsidev which will automatically -create device nodes for SCSI devices. It can do this by scanning files -in /proc/scsi. Unfortunately, to extend this idea to other device -nodes would require significant modifications to existing drivers (so -they too would provide information in /proc). This is a non-trivial -change (I should know: devfs has had to do something similar). Once -you go to this much effort, you may as well use devfs itself (which -also provides this information). Furthermore, such a system would -likely be implemented in an ad-hoc fashion, as different drivers will -provide their information in different ways. - -Devfs is much cleaner, because it (naturally) has a uniform mechanism -to provide this information: the device nodes themselves! - - -Node to driver file_operations translation - -There is an important difference between the way disc-based character -and block nodes and devfs entries make the connection between an entry -in /dev and the actual device driver. - -With the current 8 bit major and minor numbers the connection between -disc-based c&b nodes and per-major drivers is done through a -fixed-length table of 128 entries. The various filesystem types set -the inode operations for c&b nodes to {chr,blk}dev_inode_operations, -so when a device is opened a few quick levels of indirection bring us -to the driver file_operations. - -For miscellaneous character devices a second step is required: there -is a scan for the driver entry with the same minor number as the file -that was opened, and the appropriate minor open method is called. This -scanning is done *every time* you open a device node. Potentially, you -may be searching through dozens of misc. entries before you find your -open method. While not an enormous performance overhead, this does -seem pointless. - -Linux *must* move beyond the 8 bit major and minor barrier, -somehow. If we simply increase each to 16 bits, then the indexing -scheme used for major driver lookup becomes untenable, because the -major tables (one each for character and block devices) would need to -be 64 k entries long (512 kBytes on x86, 1 MByte for 64 bit -systems). So we would have to use a scheme like that used for -miscellaneous character devices, which means the search time goes up -linearly with the average number of major device drivers on your -system. Not all "devices" are hardware, some are higher-level drivers -like KGI, so you can get more "devices" without adding hardware -You can improve this by creating an ordered (balanced:-) -binary tree, in which case your search time becomes log(N). -Alternatively, you can use hashing to speed up the search. -But why do that search at all if you don't have to? Once again, it -seems pointless. - -Note that devfs doesn't use the major&minor system. For devfs -entries, the connection is done when you lookup the /dev entry. When -devfs_register() is called, an internal table is appended which has -the entry name and the file_operations. If the dentry cache doesn't -have the /dev entry already, this internal table is scanned to get the -file_operations, and an inode is created. If the dentry cache already -has the entry, there is *no lookup time* (other than the dentry scan -itself, but we can't avoid that anyway, and besides Linux dentries -cream other OS's which don't have them:-). Furthermore, the number of -node entries in a devfs is only the number of available device -entries, not the number of *conceivable* entries. Even if you remove -unnecessary entries in a disc-based /dev, the number of conceivable -entries remains the same: you just limit yourself in order to save -space. - -Devfs provides a fast connection between a VFS node and the device -driver, in a scalable way. - -/dev as a system administration tool - -Right now /dev contains a list of conceivable devices, most of which I -don't have. Devfs only shows those devices available on my -system. This means that listing /dev is a handy way of checking what -devices are available. - -Major&minor size - -Existing major and minor numbers are limited to 8 bits each. This is -now a limiting factor for some drivers, particularly the SCSI disc -driver, which consumes a single major number. Only 16 discs are -supported, and each disc may have only 15 partitions. Maybe this isn't -a problem for you, but some of us are building huge Linux systems with -disc arrays. With devfs an arbitrary pointer can be associated with -each device entry, which can be used to give an effective 32 bit -device identifier (i.e. that's like having a 32 bit minor -number). Since this is private to the kernel, there are no C library -compatibility issues which you would have with increasing major and -minor number sizes. See the section on "Allocation of Device Numbers" -for details on maintaining compatibility with userspace. - -Solving this requires a kernel change. - -Since writing this, the kernel has been modified so that the SCSI disc -driver has more major numbers allocated to it and now supports up to -128 discs. Since these major numbers are non-contiguous (a result of -unplanned expansion), the implementation is a little more cumbersome -than originally. - -Just like the changes to IPv4 to fix impending limitations in the -address space, people find ways around the limitations. In the long -run, however, solutions like IPv6 or devfs can't be put off forever. - -Read-only root filesystem - -Having your device nodes on the root filesystem means that you can't -operate properly with a read-only root filesystem. This is because you -want to change ownerships and protections of tty devices. Existing -practice prevents you using a CD-ROM as your root filesystem for a -*real* system. Sure, you can boot off a CD-ROM, but you can't change -tty ownerships, so it's only good for installing. - -Also, you can't use a shared NFS root filesystem for a cluster of -discless Linux machines (having tty ownerships changed on a common -/dev is not good). Nor can you embed your root filesystem in a -ROM-FS. - -You can get around this by creating a RAMDISC at boot time, making -an ext2 filesystem in it, mounting it somewhere and copying the -contents of /dev into it, then unmounting it and mounting it over -/dev. - -A devfs is a cleaner way of solving this. - -Non-Unix root filesystem - -Non-Unix filesystems (such as NTFS) can't be used for a root -filesystem because they variously don't support character and block -special files or symbolic links. You can't have a separate disc-based -or RAMDISC-based filesystem mounted on /dev because you need device -nodes before you can mount these. Devfs can be mounted without any -device nodes. Devlinks won't work because symlinks aren't supported. -An alternative solution is to use initrd to mount a RAMDISC initial -root filesystem (which is populated with a minimal set of device -nodes), and then construct a new /dev in another RAMDISC, and finally -switch to your non-Unix root filesystem. This requires clever boot -scripts and a fragile and conceptually complex boot procedure. - -Devfs solves this in a robust and conceptually simple way. - -PTY security - -Current pseudo-tty (pty) devices are owned by root and read-writable -by everyone. The user of a pty-pair cannot change -ownership/protections without being suid-root. - -This could be solved with a secure user-space daemon which runs as -root and does the actual creation of pty-pairs. Such a daemon would -require modification to *every* programme that wants to use this new -mechanism. It also slows down creation of pty-pairs. - -An alternative is to create a new open_pty() syscall which does much -the same thing as the user-space daemon. Once again, this requires -modifications to pty-handling programmes. - -The devfs solution allows a device driver to "tag" certain device -files so that when an unopened device is opened, the ownerships are -changed to the current euid and egid of the opening process, and the -protections are changed to the default registered by the driver. When -the device is closed ownership is set back to root and protections are -set back to read-write for everybody. No programme need be changed. -The devpts filesystem provides this auto-ownership feature for Unix98 -ptys. It doesn't support old-style pty devices, nor does it have all -the other features of devfs. - -Intelligent device management - -Devfs implements a simple yet powerful protocol for communication with -a device management daemon (devfsd) which runs in user space. It is -possible to send a message (either synchronously or asynchronously) to -devfsd on any event, such as registration/unregistration of device -entries, opening and closing devices, looking up inodes, scanning -directories and more. This has many possibilities. Some of these are -already implemented. See: - - -http://www.atnf.csiro.au/~rgooch/linux/ - -Device entry registration events can be used by devfsd to change -permissions of newly-created device nodes. This is one mechanism to -control device permissions. - -Device entry registration/unregistration events can be used to run -programmes or scripts. This can be used to provide automatic mounting -of filesystems when a new block device media is inserted into the -drive. - -Asynchronous device open and close events can be used to implement -clever permissions management. For example, the default permissions on -/dev/dsp do not allow everybody to read from the device. This is -sensible, as you don't want some remote user recording what you say at -your console. However, the console user is also prevented from -recording. This behaviour is not desirable. With asynchronous device -open and close events, you can have devfsd run a programme or script -when console devices are opened to change the ownerships for *other* -device nodes (such as /dev/dsp). On closure, you can run a different -script to restore permissions. An advantage of this scheme over -modifying the C library tty handling is that this works even if your -programme crashes (how many times have you seen the utmp database with -lingering entries for non-existent logins?). - -Synchronous device open events can be used to perform intelligent -device access protections. Before the device driver open() method is -called, the daemon must first validate the open attempt, by running an -external programme or script. This is far more flexible than access -control lists, as access can be determined on the basis of other -system conditions instead of just the UID and GID. - -Inode lookup events can be used to authenticate module autoload -requests. Instead of using kmod directly, the event is sent to -devfsd which can implement an arbitrary authentication before loading -the module itself. - -Inode lookup events can also be used to construct arbitrary -namespaces, without having to resort to populating devfs with symlinks -to devices that don't exist. - -Speculative Device Scanning - -Consider an application (like cdparanoia) that wants to find all -CD-ROM devices on the system (SCSI, IDE and other types), whether or -not their respective modules are loaded. The application must -speculatively open certain device nodes (such as /dev/sr0 for the SCSI -CD-ROMs) in order to make sure the module is loaded. This requires -that all Linux distributions follow the standard device naming scheme -(last time I looked RedHat did things differently). Devfs solves the -naming problem. - -The same application also wants to see which devices are actually -available on the system. With the existing system it needs to read the -/dev directory and speculatively open each /dev/sr* device to -determine if the device exists or not. With a large /dev this is an -inefficient operation, especially if there are many /dev/sr* nodes. A -solution like scsidev could reduce the number of /dev/sr* entries (but -of course that also requires all that inefficient directory scanning). - -With devfs, the application can open the /dev/sr directory -(which triggers the module autoloading if required), and proceed to -read /dev/sr. Since only the available devices will have -entries, there are no inefficencies in directory scanning or device -openings. - ------------------------------------------------------------------------------ - -Who else does it? - -FreeBSD has a devfs implementation. Solaris and AIX each have a -pseudo-devfs (something akin to scsidev but for all devices, with some -unspecified kernel support). BeOS, Plan9 and QNX also have it. SGI's -IRIX 6.4 and above also have a device filesystem. - -While we shouldn't just automatically do something because others do -it, we should not ignore the work of others either. FreeBSD has a lot -of competent people working on it, so their opinion should not be -blithely ignored. - ------------------------------------------------------------------------------ - - -How it works - -Registering device entries - -For every entry (device node) in a devfs-based /dev a driver must call -devfs_register(). This adds the name of the device entry, the -file_operations structure pointer and a few other things to an -internal table. Device entries may be added and removed at any -time. When a device entry is registered, it automagically appears in -any mounted devfs'. - -Inode lookup - -When a lookup operation on an entry is performed and if there is no -driver information for that entry devfs will attempt to call -devfsd. If still no driver information can be found then a negative -dentry is yielded and the next stage operation will be called by the -VFS (such as create() or mknod() inode methods). If driver information -can be found, an inode is created (if one does not exist already) and -all is well. - -Manually creating device nodes - -The mknod() method allows you to create an ordinary named pipe in the -devfs, or you can create a character or block special inode if one -does not already exist. You may wish to create a character or block -special inode so that you can set permissions and ownership. Later, if -a device driver registers an entry with the same name, the -permissions, ownership and times are retained. This is how you can set -the protections on a device even before the driver is loaded. Once you -create an inode it appears in the directory listing. - -Unregistering device entries - -A device driver calls devfs_unregister() to unregister an entry. - -Chroot() gaols - -2.2.x kernels - -The semantics of inode creation are different when devfs is mounted -with the "explicit" option. Now, when a device entry is registered, it -will not appear until you use mknod() to create the device. It doesn't -matter if you mknod() before or after the device is registered with -devfs_register(). The purpose of this behaviour is to support -chroot(2) gaols, where you want to mount a minimal devfs inside the -gaol. Only the devices you specifically want to be available (through -your mknod() setup) will be accessible. - -2.4.x kernels - -As of kernel 2.3.99, the VFS has had the ability to rebind parts of -the global filesystem namespace into another part of the namespace. -This now works even at the leaf-node level, which means that -individual files and device nodes may be bound into other parts of the -namespace. This is like making links, but better, because it works -across filesystems (unlike hard links) and works through chroot() -gaols (unlike symbolic links). - -Because of these improvements to the VFS, the multi-mount capability -in devfs is no longer needed. The administrator may create a minimal -device tree inside a chroot(2) gaol by using VFS bindings. As this -provides most of the features of the devfs multi-mount capability, I -removed the multi-mount support code (after issuing an RFC). This -yielded code size reductions and simplifications. - -If you want to construct a minimal chroot() gaol, the following -command should suffice: - -mount --bind /dev/null /gaol/dev/null - - -Repeat for other device nodes you want to expose. Simple! - ------------------------------------------------------------------------------ - - -Operational issues - - -Instructions for the impatient - -Nobody likes reading documentation. People just want to get in there -and play. So this section tells you quickly the steps you need to take -to run with devfs mounted over /dev. Skip these steps and you will end -up with a nearly unbootable system. Subsequent sections describe the -issues in more detail, and discuss non-essential configuration -options. - -Devfsd -OK, if you're reading this, I assume you want to play with -devfs. First you should ensure that /usr/src/linux contains a -recent kernel source tree. Then you need to compile devfsd, the device -management daemon, available at - -http://www.atnf.csiro.au/~rgooch/linux/. -Because the kernel has a naming scheme -which is quite different from the old naming scheme, you need to -install devfsd so that software and configuration files that use the -old naming scheme will not break. - -Compile and install devfsd. You will be provided with a default -configuration file /etc/devfsd.conf which will provide -compatibility symlinks for the old naming scheme. Don't change this -config file unless you know what you're doing. Even if you think you -do know what you're doing, don't change it until you've followed all -the steps below and booted a devfs-enabled system and verified that it -works. - -Now edit your main system boot script so that devfsd is started at the -very beginning (before any filesystem -checks). /etc/rc.d/rc.sysinit is often the main boot script -on systems with SysV-style boot scripts. On systems with BSD-style -boot scripts it is often /etc/rc. Also check -/sbin/rc. - -NOTE that the line you put into the boot -script should be exactly: - -/sbin/devfsd /dev - -DO NOT use some special daemon-launching -programme, otherwise the boot script may not wait for devfsd to finish -initialising. - -System Libraries -There may still be some problems because of broken software making -assumptions about device names. In particular, some software does not -handle devices which are symbolic links. If you are running a libc 5 -based system, install libc 5.4.44 (if you have libc 5.4.46, go back to -libc 5.4.44, which is actually correct). If you are running a glibc -based system, make sure you have glibc 2.1.3 or later. - -/etc/securetty -PAM (Pluggable Authentication Modules) is supposed to be a flexible -mechanism for providing better user authentication and access to -services. Unfortunately, it's also fragile, complex and undocumented -(check out RedHat 6.1, and probably other distributions as well). PAM -has problems with symbolic links. Append the following lines to your -/etc/securetty file: - -vc/1 -vc/2 -vc/3 -vc/4 -vc/5 -vc/6 -vc/7 -vc/8 - -This will not weaken security. If you have a version of util-linux -earlier than 2.10.h, please upgrade to 2.10.h or later. If you -absolutely cannot upgrade, then also append the following lines to -your /etc/securetty file: - -1 -2 -3 -4 -5 -6 -7 -8 - -This may potentially weaken security by allowing root logins over the -network (a password is still required, though). However, since there -are problems with dealing with symlinks, I'm suspicious of the level -of security offered in any case. - -XFree86 -While not essential, it's probably a good idea to upgrade to XFree86 -4.0, as patches went in to make it more devfs-friendly. If you don't, -you'll probably need to apply the following patch to -/etc/security/console.perms so that ordinary users can run -startx. Note that not all distributions have this file (e.g. Debian), -so if it's not present, don't worry about it. - ---- /etc/security/console.perms.orig Sat Apr 17 16:26:47 1999 -+++ /etc/security/console.perms Fri Feb 25 23:53:55 2000 -@@ -14,7 +14,7 @@ - # man 5 console.perms - - # file classes -- these are regular expressions --=tty[0-9][0-9]* :[0-9]\.[0-9] :[0-9] -+=tty[0-9][0-9]* vc/[0-9][0-9]* :[0-9]\.[0-9] :[0-9] - - # device classes -- these are shell-style globs - =/dev/fd[0-1]* - -If the patch does not apply, then change the line: - -=tty[0-9][0-9]* :[0-9]\.[0-9] :[0-9] - -with: - -=tty[0-9][0-9]* vc/[0-9][0-9]* :[0-9]\.[0-9] :[0-9] - - -Disable devpts -I've had a report of devpts mounted on /dev/pts not working -correctly. Since devfs will also manage /dev/pts, there is no -need to mount devpts as well. You should either edit your -/etc/fstab so devpts is not mounted, or disable devpts from -your kernel configuration. - -Unsupported drivers -Not all drivers have devfs support. If you depend on one of these -drivers, you will need to create a script or tarfile that you can use -at boot time to create device nodes as appropriate. There is a -section which describes this. Another -section lists the drivers which have -devfs support. - -/dev/mouse - -Many disributions configure /dev/mouse to be the mouse device -for XFree86 and GPM. I actually think this is a bad idea, because it -adds another level of indirection. When looking at a config file, if -you see /dev/mouse you're left wondering which mouse -is being referred to. Hence I recommend putting the actual mouse -device (for example /dev/psaux) into your -/etc/X11/XF86Config file (and similarly for the GPM -configuration file). - -Alternatively, use the same technique used for unsupported drivers -described above. - -The Kernel -Finally, you need to make sure devfs is compiled into your kernel. Set -CONFIG_EXPERIMENTAL=y, CONFIG_DEVFS_FS=y and CONFIG_DEVFS_MOUNT=y by -using favourite configuration tool (i.e. make config or -make xconfig) and then make clean and then recompile your kernel and -modules. At boot, devfs will be mounted onto /dev. - -If you encounter problems booting (for example if you forgot a -configuration step), you can pass devfs=nomount at the kernel -boot command line. This will prevent the kernel from mounting devfs at -boot time onto /dev. - -In general, a kernel built with CONFIG_DEVFS_FS=y but without mounting -devfs onto /dev is completely safe, and requires no -configuration changes. One exception to take note of is when -LABEL= directives are used in /etc/fstab. In this -case you will be unable to boot properly. This is because the -mount(8) programme uses /proc/partitions as part of -the volume label search process, and the device names it finds are not -available, because setting CONFIG_DEVFS_FS=y changes the names in -/proc/partitions, irrespective of whether devfs is mounted. - -Now you've finished all the steps required. You're now ready to boot -your shiny new kernel. Enjoy. - -Changing the configuration - -OK, you've now booted a devfs-enabled system, and everything works. -Now you may feel like changing the configuration (common targets are -/etc/fstab and /etc/devfsd.conf). Since you have a -system that works, if you make any changes and it doesn't work, you -now know that you only have to restore your configuration files to the -default and it will work again. - - -Permissions persistence across reboots - -If you don't use mknod(2) to create a device file, nor use chmod(2) or -chown(2) to change the ownerships/permissions, the inode ctime will -remain at 0 (the epoch, 12 am, 1-JAN-1970, GMT). Anything with a ctime -later than this has had it's ownership/permissions changed. Hence, a -simple script or programme may be used to tar up all changed inodes, -prior to shutdown. Although effective, many consider this approach a -kludge. - -A much better approach is to use devfsd to save and restore -permissions. It may be configured to record changes in permissions and -will save them in a database (in fact a directory tree), and restore -these upon boot. This is an efficient method and results in immediate -saving of current permissions (unlike the tar approach, which saves -permissions at some unspecified future time). - -The default configuration file supplied with devfsd has config entries -which you may uncomment to enable persistence management. - -If you decide to use the tar approach anyway, be aware that tar will -first unlink(2) an inode before creating a new device node. The -unlink(2) has the effect of breaking the connection between a devfs -entry and the device driver. If you use the "devfs=only" boot option, -you lose access to the device driver, requiring you to reload the -module. I consider this a bug in tar (there is no real need to -unlink(2) the inode first). - -Alternatively, you can use devfsd to provide more sophisticated -management of device permissions. You can use devfsd to store -permissions for whole groups of devices with a single configuration -entry, rather than the conventional single entry per device entry. - -Permissions database stored in mounted-over /dev - -If you wish to save and restore your device permissions into the -disc-based /dev while still mounting devfs onto /dev -you may do so. This requires a 2.4.x kernel (in fact, 2.3.99 or -later), which has the VFS binding facility. You need to do the -following to set this up: - - - -make sure the kernel does not mount devfs at boot time - - -make sure you have a correct /dev/console entry in your -root file-system (where your disc-based /dev lives) - -create the /dev-state directory - - -add the following lines near the very beginning of your boot -scripts: - -mount --bind /dev /dev-state -mount -t devfs none /dev -devfsd /dev - - - - -add the following lines to your /etc/devfsd.conf file: - -REGISTER ^pt[sy] IGNORE -CREATE ^pt[sy] IGNORE -CHANGE ^pt[sy] IGNORE -DELETE ^pt[sy] IGNORE -REGISTER .* COPY /dev-state/$devname $devpath -CREATE .* COPY $devpath /dev-state/$devname -CHANGE .* COPY $devpath /dev-state/$devname -DELETE .* CFUNCTION GLOBAL unlink /dev-state/$devname -RESTORE /dev-state - -Note that the sample devfsd.conf file contains these lines, -as well as other sample configurations you may find useful. See the -devfsd distribution - - -reboot. - - - - -Permissions database stored in normal directory - -If you are using an older kernel which doesn't support VFS binding, -then you won't be able to have the permissions database in a -mounted-over /dev. However, you can still use a regular -directory to store the database. The sample /etc/devfsd.conf -file above may still be used. You will need to create the -/dev-state directory prior to installing devfsd. If you have -old permissions in /dev, then just copy (or move) the device -nodes over to the new directory. - -Which method is better? - -The best method is to have the permissions database stored in the -mounted-over /dev. This is because you will not need to copy -device nodes over to /dev-state, and because it allows you to -switch between devfs and non-devfs kernels, without requiring you to -copy permissions between /dev-state (for devfs) and -/dev (for non-devfs). - - -Dealing with drivers without devfs support - -Currently, not all device drivers in the kernel have been modified to -use devfs. Device drivers which do not yet have devfs support will not -automagically appear in devfs. The simplest way to create device nodes -for these drivers is to unpack a tarfile containing the required -device nodes. You can do this in your boot scripts. All your drivers -will now work as before. - -Hopefully for most people devfs will have enough support so that they -can mount devfs directly over /dev without losing most functionality -(i.e. losing access to various devices). As of 22-JAN-1998 (devfs -patch version 10) I am now running this way. All the devices I have -are available in devfs, so I don't lose anything. - -WARNING: if your configuration requires the old-style device names -(i.e. /dev/hda1 or /dev/sda1), you must install devfsd and configure -it to maintain compatibility entries. It is almost certain that you -will require this. Note that the kernel creates a compatibility entry -for the root device, so you don't need initrd. - -Note that you no longer need to mount devpts if you use Unix98 PTYs, -as devfs can manage /dev/pts itself. This saves you some RAM, as you -don't need to compile and install devpts. Note that some versions of -glibc have a bug with Unix98 pty handling on devfs systems. Contact -the glibc maintainers for a fix. Glibc 2.1.3 has the fix. - -Note also that apart from editing /etc/fstab, other things will need -to be changed if you *don't* install devfsd. Some software (like the X -server) hard-wire device names in their source. It really is much -easier to install devfsd so that compatibility entries are created. -You can then slowly migrate your system to using the new device names -(for example, by starting with /etc/fstab), and then limiting the -compatibility entries that devfsd creates. - -IF YOU CONFIGURE TO MOUNT DEVFS AT BOOT, MAKE SURE YOU INSTALL DEVFSD -BEFORE YOU BOOT A DEVFS-ENABLED KERNEL! - -Now that devfs has gone into the 2.3.46 kernel, I'm getting a lot of -reports back. Many of these are because people are trying to run -without devfsd, and hence some things break. Please just run devfsd if -things break. I want to concentrate on real bugs rather than -misconfiguration problems at the moment. If people are willing to fix -bugs/false assumptions in other code (i.e. glibc, X server) and submit -that to the respective maintainers, that would be great. - - -All the way with Devfs - -The devfs kernel patch creates a rationalised device tree. As stated -above, if you want to keep using the old /dev naming scheme, -you just need to configure devfsd appopriately (see the man -page). People who prefer the old names can ignore this section. For -those of us who like the rationalised names and an uncluttered -/dev, read on. - -If you don't run devfsd, or don't enable compatibility entry -management, then you will have to configure your system to use the new -names. For example, you will then need to edit your -/etc/fstab to use the new disc naming scheme. If you want to -be able to boot non-devfs kernels, you will need compatibility -symlinks in the underlying disc-based /dev pointing back to -the old-style names for when you boot a kernel without devfs. - -You can selectively decide which devices you want compatibility -entries for. For example, you may only want compatibility entries for -BSD pseudo-terminal devices (otherwise you'll have to patch you C -library or use Unix98 ptys instead). It's just a matter of putting in -the correct regular expression into /dev/devfsd.conf. - -There are other choices of naming schemes that you may prefer. For -example, I don't use the kernel-supplied -names, because they are too verbose. A common misconception is -that the kernel-supplied names are meant to be used directly in -configuration files. This is not the case. They are designed to -reflect the layout of the devices attached and to provide easy -classification. - -If you like the kernel-supplied names, that's fine. If you don't then -you should be using devfsd to construct a namespace more to your -liking. Devfsd has built-in code to construct a -namespace that is both logical and easy to -manage. In essence, it creates a convenient abbreviation of the -kernel-supplied namespace. - -You are of course free to build your own namespace. Devfsd has all the -infrastructure required to make this easy for you. All you need do is -write a script. You can even write some C code and devfsd can load the -shared object as a callable extension. - - -Other Issues - -The init programme -Another thing to take note of is whether your init programme -creates a Unix socket /dev/telinit. Some versions of init -create /dev/telinit so that the telinit programme can -communicate with the init process. If you have such a system you need -to make sure that devfs is mounted over /dev *before* init -starts. In other words, you can't leave the mounting of devfs to -/etc/rc, since this is executed after init. Other -versions of init require a named pipe /dev/initctl -which must exist *before* init starts. Once again, you need to -mount devfs and then create the named pipe *before* init -starts. - -The default behaviour now is not to mount devfs onto /dev at -boot time for 2.3.x and later kernels. You can correct this with the -"devfs=mount" boot option. This solves any problems with init, -and also prevents the dreaded: - -Cannot open initial console - -message. For 2.2.x kernels where you need to apply the devfs patch, -the default is to mount. - -If you have automatic mounting of devfs onto /dev then you -may need to create /dev/initctl in your boot scripts. The -following lines should suffice: - -mknod /dev/initctl p -kill -SIGUSR1 1 # tell init that /dev/initctl now exists - -Alternatively, if you don't want the kernel to mount devfs onto -/dev then you could use the following procedure is a -guideline for how to get around /dev/initctl problems: - -# cd /sbin -# mv init init.real -# cat > init -#! /bin/sh -mount -n -t devfs none /dev -mknod /dev/initctl p -exec /sbin/init.real $* -[control-D] -# chmod a+x init - -Note that newer versions of init create /dev/initctl -automatically, so you don't have to worry about this. - -Module autoloading -You will need to configure devfsd to enable module -autoloading. The following lines should be placed in your -/etc/devfsd.conf file: - -LOOKUP .* MODLOAD - - -As of devfsd-v1.3.10, a generic /etc/modules.devfs -configuration file is installed, which is used by the MODLOAD -action. This should be sufficient for most configurations. If you -require further configuration, edit your /etc/modules.conf -file. The way module autoloading work with devfs is: - - -a process attempts to lookup a device node (e.g. /dev/fred) - - -if that device node does not exist, the full pathname is passed to -devfsd as a string - - -devfsd will pass the string to the modprobe programme (provided the -configuration line shown above is present), and specifies that -/etc/modules.devfs is the configuration file - - -/etc/modules.devfs includes /etc/modules.conf to -access local configurations - -modprobe will search it's configuration files, looking for an alias -that translates the pathname into a module name - - -the translated pathname is then used to load the module. - - -If you wanted a lookup of /dev/fred to load the -mymod module, you would require the following configuration -line in /etc/modules.conf: - -alias /dev/fred mymod - -The /etc/modules.devfs configuration file provides many such -aliases for standard device names. If you look closely at this file, -you will note that some modules require multiple alias configuration -lines. This is required to support module autoloading for old and new -device names. - -Mounting root off a devfs device -If you wish to mount root off a devfs device when you pass the -"devfs=only" boot option, then you need to pass in the -"root=" option to the kernel when booting. If you use -LILO, then you must have this in lilo.conf: - -append = "root=" - -Surprised? Yep, so was I. It turns out if you have (as most people -do): - -root = - - -then LILO will determine the device number of and will -write that device number into a special place in the kernel image -before starting the kernel, and the kernel will use that device number -to mount the root filesystem. So, using the "append" variety ensures -that LILO passes the root filesystem device as a string, which devfs -can then use. - -Note that this isn't an issue if you don't pass "devfs=only". - -TTY issues -The ttyname(3) function in some versions of the C library makes -false assumptions about device entries which are symbolic links. The -tty(1) programme is one that depends on this function. I've -written a patch to libc 5.4.43 which fixes this. This has been -included in libc 5.4.44 and a similar fix is in glibc 2.1.3. - - -Kernel Naming Scheme - -The kernel provides a default naming scheme. This scheme is designed -to make it easy to search for specific devices or device types, and to -view the available devices. Some device types (such as hard discs), -have a directory of entries, making it easy to see what devices of -that class are available. Often, the entries are symbolic links into a -directory tree that reflects the topology of available devices. The -topological tree is useful for finding how your devices are arranged. - -Below is a list of the naming schemes for the most common drivers. A -list of reserved device names is -available for reference. Please send email to -rgooch@atnf.csiro.au to obtain an allocation. Please be -patient (the maintainer is busy). An alternative name may be allocated -instead of the requested name, at the discretion of the maintainer. - -Disc Devices - -All discs, whether SCSI, IDE or whatever, are placed under the -/dev/discs hierarchy: - - /dev/discs/disc0 first disc - /dev/discs/disc1 second disc - - -Each of these entries is a symbolic link to the directory for that -device. The device directory contains: - - disc for the whole disc - part* for individual partitions - - -CD-ROM Devices - -All CD-ROMs, whether SCSI, IDE or whatever, are placed under the -/dev/cdroms hierarchy: - - /dev/cdroms/cdrom0 first CD-ROM - /dev/cdroms/cdrom1 second CD-ROM - - -Each of these entries is a symbolic link to the real device entry for -that device. - -Tape Devices - -All tapes, whether SCSI, IDE or whatever, are placed under the -/dev/tapes hierarchy: - - /dev/tapes/tape0 first tape - /dev/tapes/tape1 second tape - - -Each of these entries is a symbolic link to the directory for that -device. The device directory contains: - - mt for mode 0 - mtl for mode 1 - mtm for mode 2 - mta for mode 3 - mtn for mode 0, no rewind - mtln for mode 1, no rewind - mtmn for mode 2, no rewind - mtan for mode 3, no rewind - - -SCSI Devices - -To uniquely identify any SCSI device requires the following -information: - - controller (host adapter) - bus (SCSI channel) - target (SCSI ID) - unit (Logical Unit Number) - - -All SCSI devices are placed under /dev/scsi (assuming devfs -is mounted on /dev). Hence, a SCSI device with the following -parameters: c=1,b=2,t=3,u=4 would appear as: - - /dev/scsi/host1/bus2/target3/lun4 device directory - - -Inside this directory, a number of device entries may be created, -depending on which SCSI device-type drivers were installed. - -See the section on the disc naming scheme to see what entries the SCSI -disc driver creates. - -See the section on the tape naming scheme to see what entries the SCSI -tape driver creates. - -The SCSI CD-ROM driver creates: - - cd - - -The SCSI generic driver creates: - - generic - - -IDE Devices - -To uniquely identify any IDE device requires the following -information: - - controller - bus (aka. primary/secondary) - target (aka. master/slave) - unit - - -All IDE devices are placed under /dev/ide, and uses a similar -naming scheme to the SCSI subsystem. - -XT Hard Discs - -All XT discs are placed under /dev/xd. The first XT disc has -the directory /dev/xd/disc0. - -TTY devices - -The tty devices now appear as: - - New name Old-name Device Type - -------- -------- ----------- - /dev/tts/{0,1,...} /dev/ttyS{0,1,...} Serial ports - /dev/cua/{0,1,...} /dev/cua{0,1,...} Call out devices - /dev/vc/0 /dev/tty Current virtual console - /dev/vc/{1,2,...} /dev/tty{1...63} Virtual consoles - /dev/vcc/{0,1,...} /dev/vcs{1...63} Virtual consoles - /dev/pty/m{0,1,...} /dev/ptyp?? PTY masters - /dev/pty/s{0,1,...} /dev/ttyp?? PTY slaves - - -RAMDISCS - -The RAMDISCS are placed in their own directory, and are named thus: - - /dev/rd/{0,1,2,...} - - -Meta Devices - -The meta devices are placed in their own directory, and are named -thus: - - /dev/md/{0,1,2,...} - - -Floppy discs - -Floppy discs are placed in the /dev/floppy directory. - -Loop devices - -Loop devices are placed in the /dev/loop directory. - -Sound devices - -Sound devices are placed in the /dev/sound directory -(audio, sequencer, ...). - - -Devfsd Naming Scheme - -Devfsd provides a naming scheme which is a convenient abbreviation of -the kernel-supplied namespace. In some -cases, the kernel-supplied naming scheme is quite convenient, so -devfsd does not provide another naming scheme. The convenience names -that devfsd creates are in fact the same names as the original devfs -kernel patch created (before Linus mandated the Big Name -Change). These are referred to as "new compatibility entries". - -In order to configure devfsd to create these convenience names, the -following lines should be placed in your /etc/devfsd.conf: - -REGISTER .* MKNEWCOMPAT -UNREGISTER .* RMNEWCOMPAT - -This will cause devfsd to create (and destroy) symbolic links which -point to the kernel-supplied names. - -SCSI Hard Discs - -All SCSI discs are placed under /dev/sd (assuming devfs is -mounted on /dev). Hence, a SCSI disc with the following -parameters: c=1,b=2,t=3,u=4 would appear as: - - /dev/sd/c1b2t3u4 for the whole disc - /dev/sd/c1b2t3u4p5 for the 5th partition - /dev/sd/c1b2t3u4p5s6 for the 6th slice in the 5th partition - - -SCSI Tapes - -All SCSI tapes are placed under /dev/st. A similar naming -scheme is used as for SCSI discs. A SCSI tape with the -parameters:c=1,b=2,t=3,u=4 would appear as: - - /dev/st/c1b2t3u4m0 for mode 0 - /dev/st/c1b2t3u4m1 for mode 1 - /dev/st/c1b2t3u4m2 for mode 2 - /dev/st/c1b2t3u4m3 for mode 3 - /dev/st/c1b2t3u4m0n for mode 0, no rewind - /dev/st/c1b2t3u4m1n for mode 1, no rewind - /dev/st/c1b2t3u4m2n for mode 2, no rewind - /dev/st/c1b2t3u4m3n for mode 3, no rewind - - -SCSI CD-ROMs - -All SCSI CD-ROMs are placed under /dev/sr. A similar naming -scheme is used as for SCSI discs. A SCSI CD-ROM with the -parameters:c=1,b=2,t=3,u=4 would appear as: - - /dev/sr/c1b2t3u4 - - -SCSI Generic Devices - -The generic (aka. raw) interface for all SCSI devices are placed under -/dev/sg. A similar naming scheme is used as for SCSI discs. A -SCSI generic device with the parameters:c=1,b=2,t=3,u=4 would appear -as: - - /dev/sg/c1b2t3u4 - - -IDE Hard Discs - -All IDE discs are placed under /dev/ide/hd, using a similar -convention to SCSI discs. The following mappings exist between the new -and the old names: - - /dev/hda /dev/ide/hd/c0b0t0u0 - /dev/hdb /dev/ide/hd/c0b0t1u0 - /dev/hdc /dev/ide/hd/c0b1t0u0 - /dev/hdd /dev/ide/hd/c0b1t1u0 - - -IDE Tapes - -A similar naming scheme is used as for IDE discs. The entries will -appear in the /dev/ide/mt directory. - -IDE CD-ROM - -A similar naming scheme is used as for IDE discs. The entries will -appear in the /dev/ide/cd directory. - -IDE Floppies - -A similar naming scheme is used as for IDE discs. The entries will -appear in the /dev/ide/fd directory. - -XT Hard Discs - -All XT discs are placed under /dev/xd. The first XT disc -would appear as /dev/xd/c0t0. - - -Old Compatibility Names - -The old compatibility names are the legacy device names, such as -/dev/hda, /dev/sda, /dev/rtc and so on. -Devfsd can be configured to create compatibility symlinks so that you -may continue to use the old names in your configuration files and so -that old applications will continue to function correctly. - -In order to configure devfsd to create these legacy names, the -following lines should be placed in your /etc/devfsd.conf: - -REGISTER .* MKOLDCOMPAT -UNREGISTER .* RMOLDCOMPAT - -This will cause devfsd to create (and destroy) symbolic links which -point to the kernel-supplied names. - - ------------------------------------------------------------------------------ - - -Device drivers currently ported - -- All miscellaneous character devices support devfs (this is done - transparently through misc_register()) - -- SCSI discs and generic hard discs - -- Character memory devices (null, zero, full and so on) - Thanks to C. Scott Ananian - -- Loop devices (/dev/loop?) - -- TTY devices (console, serial ports, terminals and pseudo-terminals) - Thanks to C. Scott Ananian - -- SCSI tapes (/dev/scsi and /dev/tapes) - -- SCSI CD-ROMs (/dev/scsi and /dev/cdroms) - -- SCSI generic devices (/dev/scsi) - -- RAMDISCS (/dev/ram?) - -- Meta Devices (/dev/md*) - -- Floppy discs (/dev/floppy) - -- Parallel port printers (/dev/printers) - -- Sound devices (/dev/sound) - Thanks to Eric Dumas and - C. Scott Ananian - -- Joysticks (/dev/joysticks) - -- Sparc keyboard (/dev/kbd) - -- DSP56001 digital signal processor (/dev/dsp56k) - -- Apple Desktop Bus (/dev/adb) - -- Coda network file system (/dev/cfs*) - -- Virtual console capture devices (/dev/vcc) - Thanks to Dennis Hou - -- Frame buffer devices (/dev/fb) - -- Video capture devices (/dev/v4l) - - ------------------------------------------------------------------------------ - - -Allocation of Device Numbers - -Devfs allows you to write a driver which doesn't need to allocate a -device number (major&minor numbers) for the internal operation of the -kernel. However, there are a number of userspace programmes that use -the device number as a unique handle for a device. An example is the -find programme, which uses device numbers to determine whether -an inode is on a different filesystem than another inode. The device -number used is the one for the block device which a filesystem is -using. To preserve compatibility with userspace programmes, block -devices using devfs need to have unique device numbers allocated to -them. Furthermore, POSIX specifies device numbers, so some kind of -device number needs to be presented to userspace. - -The simplest option (especially when porting drivers to devfs) is to -keep using the old major and minor numbers. Devfs will take whatever -values are given for major&minor and pass them onto userspace. - -This device number is a 16 bit number, so this leaves plenty of space -for large numbers of discs and partitions. This scheme can also be -used for character devices, in particular the tty devices, which are -currently limited to 256 pseudo-ttys (this limits the total number of -simultaneous xterms and remote logins). Note that the device number -is limited to the range 36864-61439 (majors 144-239), in order to -avoid any possible conflicts with existing official allocations. - -Please note that using dynamically allocated block device numbers may -break the NFS daemons (both user and kernel mode), which expect dev_t -for a given device to be constant over the lifetime of remote mounts. - -A final note on this scheme: since it doesn't increase the size of -device numbers, there are no compatibility issues with userspace. - ------------------------------------------------------------------------------ - - -Questions and Answers - - -Making things work -Alternatives to devfs -What I don't like about devfs -How to report bugs -Strange kernel messages -Compilation problems with devfsd - - - -Making things work - -Here are some common questions and answers. - - - -Devfsd doesn't start - -Make sure you have compiled and installed devfsd -Make sure devfsd is being started from your boot -scripts -Make sure you have configured your kernel to enable devfs (see -below) -Make sure devfs is mounted (see below) - - -Devfsd is not managing all my permissions - -Make sure you are capturing the appropriate events. For example, -device entries created by the kernel generate REGISTER events, -but those created by devfsd generate CREATE events. - - -Devfsd is not capturing all REGISTER events - -See the previous entry: you may need to capture CREATE events. - - -X will not start - -Make sure you followed the steps -outlined above. - - -Why don't my network devices appear in devfs? - -This is not a bug. Network devices have their own, completely separate -namespace. They are accessed via socket(2) and -setsockopt(2) calls, and thus require no device nodes. I have -raised the possibilty of moving network devices into the device -namespace, but have had no response. - - -How can I test if I have devfs compiled into my kernel? - -All filesystems built-in or currently loaded are listed in -/proc/filesystems. If you see a devfs entry, then -you know that devfs was compiled into your kernel. If you have -correctly configured and rebuilt your kernel, then devfs will be -built-in. If you think you've configured it in, but -/proc/filesystems doesn't show it, you've made a mistake. -Common mistakes include: - -Using a 2.2.x kernel without applying the devfs patch (if you -don't know how to patch your kernel, use 2.4.x instead, don't bother -asking me how to patch) -Forgetting to set CONFIG_EXPERIMENTAL=y -Forgetting to set CONFIG_DEVFS_FS=y -Forgetting to set CONFIG_DEVFS_MOUNT=y (if you want devfs -to be automatically mounted at boot) -Editing your .config manually, instead of using make -config or make xconfig -Forgetting to run make dep; make clean after changing the -configuration and before compiling -Forgetting to compile your kernel and modules -Forgetting to install your kernel -Forgetting to install your modules - -Please check twice that you've done all these steps before sending in -a bug report. - - - -How can I test if devfs is mounted on /dev? - -The device filesystem will always create an entry called -".devfsd", which is used to communicate with the daemon. Even -if the daemon is not running, this entry will exist. Testing for the -existence of this entry is the approved method of determining if devfs -is mounted or not. Note that the type of entry (i.e. regular file, -character device, named pipe, etc.) may change without notice. Only -the existence of the entry should be relied upon. - - -When I start devfsd, I see the error: -Error opening file: ".devfsd" No such file or directory? - -This means that devfs is not mounted. Make sure you have devfs mounted. - - -How do I mount devfs? - -First make sure you have devfs compiled into your kernel (see -above). Then you will either need to: - -set CONFIG_DEVFS_MOUNT=y in your kernel config -pass devfs=mount to your boot loader -mount devfs manually in your boot scripts with: -mount -t none devfs /dev - - - -Mount by volume LABEL= where a is the interrupt number and b is a field that represents an encoding of the sense and level @@ -1216,7 +1216,7 @@ platforms are moved over to use the flattened-device-tree model. model = "TSEC"; compatible = "gianfar"; reg = <24000 1000>; - address = [ 00 E0 0C 00 73 00 ]; + mac-address = [ 00 E0 0C 00 73 00 ]; interrupts = ; interrupt-parent = <40000>; phy-handle = <2452000> @@ -1436,9 +1436,9 @@ platforms are moved over to use the flattened-device-tree model. interrupts = <1d 3>; interrupt-parent = <40000>; num-channels = <4>; - channel-fifo-len = <24>; + channel-fifo-len = <18>; exec-units-mask = <000000fe>; - descriptor-types-mask = <073f1127>; + descriptor-types-mask = <012b0ebf>; }; @@ -1498,7 +1498,7 @@ not necessary as they are usually the same as the root node. model = "TSEC"; compatible = "gianfar"; reg = <24000 1000>; - address = [ 00 E0 0C 00 73 00 ]; + mac-address = [ 00 E0 0C 00 73 00 ]; interrupts = ; interrupt-parent = <40000>; phy-handle = <2452000>; @@ -1511,7 +1511,7 @@ not necessary as they are usually the same as the root node. model = "TSEC"; compatible = "gianfar"; reg = <25000 1000>; - address = [ 00 E0 0C 00 73 01 ]; + mac-address = [ 00 E0 0C 00 73 01 ]; interrupts = <13 3 14 3 18 3>; interrupt-parent = <40000>; phy-handle = <2452001>; @@ -1524,7 +1524,7 @@ not necessary as they are usually the same as the root node. model = "FEC"; compatible = "gianfar"; reg = <26000 1000>; - address = [ 00 E0 0C 00 73 02 ]; + mac-address = [ 00 E0 0C 00 73 02 ]; interrupts = <19 3>; interrupt-parent = <40000>; phy-handle = <2452002>; diff --git a/Documentation/ramdisk.txt b/Documentation/ramdisk.txt index 7c25584e0..52f75b7d5 100644 --- a/Documentation/ramdisk.txt +++ b/Documentation/ramdisk.txt @@ -6,7 +6,7 @@ Contents: 1) Overview 2) Kernel Command Line Parameters 3) Using "rdev -r" - 4) An Example of Creating a Compressed RAM Disk + 4) An Example of Creating a Compressed RAM Disk 1) Overview @@ -34,7 +34,7 @@ make it clearer. The original "ramdisk=" has been kept around for compatibility reasons, but it may be removed in the future. The new RAM disk also has the ability to load compressed RAM disk images, -allowing one to squeeze more programs onto an average installation or +allowing one to squeeze more programs onto an average installation or rescue floppy disk. @@ -51,7 +51,7 @@ default is 4096 (4 MB) (8192 (8 MB) on S390). =================== This parameter tells the RAM disk driver how many bytes to use per block. The -default is 512. +default is 1024 (BLOCK_SIZE). 3) Using "rdev -r" @@ -70,7 +70,7 @@ These numbers are no magical secrets, as seen below: ./arch/i386/kernel/setup.c:#define RAMDISK_PROMPT_FLAG 0x8000 ./arch/i386/kernel/setup.c:#define RAMDISK_LOAD_FLAG 0x4000 -Consider a typical two floppy disk setup, where you will have the +Consider a typical two floppy disk setup, where you will have the kernel on disk one, and have already put a RAM disk image onto disk #2. Hence you want to set bits 0 to 13 as 0, meaning that your RAM disk @@ -97,12 +97,12 @@ Since the default start = 0 and the default prompt = 1, you could use: append = "load_ramdisk=1" -4) An Example of Creating a Compressed RAM Disk +4) An Example of Creating a Compressed RAM Disk ---------------------------------------------- To create a RAM disk image, you will need a spare block device to construct it on. This can be the RAM disk device itself, or an -unused disk partition (such as an unmounted swap partition). For this +unused disk partition (such as an unmounted swap partition). For this example, we will use the RAM disk device, "/dev/ram0". Note: This technique should not be done on a machine with less than 8 MB diff --git a/Documentation/robust-futexes.txt b/Documentation/robust-futexes.txt index df82d7524..76e8064b8 100644 --- a/Documentation/robust-futexes.txt +++ b/Documentation/robust-futexes.txt @@ -95,7 +95,7 @@ comparison. If the thread has registered a list, then normally the list is empty. If the thread/process crashed or terminated in some incorrect way then the list might be non-empty: in this case the kernel carefully walks the list [not trusting it], and marks all locks that are owned by -this thread with the FUTEX_OWNER_DEAD bit, and wakes up one waiter (if +this thread with the FUTEX_OWNER_DIED bit, and wakes up one waiter (if any). The list is guaranteed to be private and per-thread at do_exit() time, diff --git a/Documentation/rtc.txt b/Documentation/rtc.txt index 95d17b3e2..2a58f9857 100644 --- a/Documentation/rtc.txt +++ b/Documentation/rtc.txt @@ -44,8 +44,10 @@ normal timer interrupt, which is 100Hz. Programming and/or enabling interrupt frequencies greater than 64Hz is only allowed by root. This is perhaps a bit conservative, but we don't want an evil user generating lots of IRQs on a slow 386sx-16, where it might have -a negative impact on performance. Note that the interrupt handler is only -a few lines of code to minimize any possibility of this effect. +a negative impact on performance. This 64Hz limit can be changed by writing +a different value to /proc/sys/dev/rtc/max-user-freq. Note that the +interrupt handler is only a few lines of code to minimize any possibility +of this effect. Also, if the kernel time is synchronized with an external source, the kernel will write the time back to the CMOS clock every 11 minutes. In @@ -81,6 +83,7 @@ that will be using this driver. */ #include +#include #include #include #include diff --git a/Documentation/scsi/00-INDEX b/Documentation/scsi/00-INDEX index e7da8c3a2..12354830c 100644 --- a/Documentation/scsi/00-INDEX +++ b/Documentation/scsi/00-INDEX @@ -30,8 +30,6 @@ aic7xxx.txt - info on driver for Adaptec controllers aic7xxx_old.txt - info on driver for Adaptec controllers, old generation -cpqfc.txt - - info on driver for Compaq Tachyon TS adapters dpti.txt - info on driver for DPT SmartRAID and Adaptec I2O RAID based adapters dtc3x80.txt diff --git a/Documentation/scsi/ChangeLog.megaraid b/Documentation/scsi/ChangeLog.megaraid index c173806c9..a056bbe67 100644 --- a/Documentation/scsi/ChangeLog.megaraid +++ b/Documentation/scsi/ChangeLog.megaraid @@ -1,3 +1,126 @@ +Release Date : Fri May 19 09:31:45 EST 2006 - Seokmann Ju +Current Version : 2.20.4.9 (scsi module), 2.20.2.6 (cmm module) +Older Version : 2.20.4.8 (scsi module), 2.20.2.6 (cmm module) + +1. Fixed a bug in megaraid_init_mbox(). + Customer reported "garbage in file on x86_64 platform". + Root Cause: the driver registered controllers as 64-bit DMA capable + for those which are not support it. + Fix: Made change in the function inserting identification machanism + identifying 64-bit DMA capable controllers. + + > -----Original Message----- + > From: Vasily Averin [mailto:vvs@sw.ru] + > Sent: Thursday, May 04, 2006 2:49 PM + > To: linux-scsi@vger.kernel.org; Kolli, Neela; Mukker, Atul; + > Ju, Seokmann; Bagalkote, Sreenivas; + > James.Bottomley@SteelEye.com; devel@openvz.org + > Subject: megaraid_mbox: garbage in file + > + > Hello all, + > + > I've investigated customers claim on the unstable work of + > their node and found a + > strange effect: reading from some files leads to the + > "attempt to access beyond end of device" messages. + > + > I've checked filesystem, memory on the node, motherboard BIOS + > version, but it + > does not help and issue still has been reproduced by simple + > file reading. + > + > Reproducer is simple: + > + > echo 0xffffffff >/proc/sys/dev/scsi/logging_level ; + > cat /vz/private/101/root/etc/ld.so.cache >/tmp/ttt ; + > echo 0 >/proc/sys/dev/scsi/logging + > + > It leads to the following messages in dmesg + > + > sd_init_command: disk=sda, block=871769260, count=26 + > sda : block=871769260 + > sda : reading 26/26 512 byte blocks. + > scsi_add_timer: scmd: f79ed980, time: 7500, (c02b1420) + > sd 0:1:0:0: send 0xf79ed980 sd 0:1:0:0: + > command: Read (10): 28 00 33 f6 24 ac 00 00 1a 00 + > buffer = 0xf7cfb540, bufflen = 13312, done = 0xc0366b40, + > queuecommand 0xc0344010 + > leaving scsi_dispatch_cmnd() + > scsi_delete_timer: scmd: f79ed980, rtn: 1 + > sd 0:1:0:0: done 0xf79ed980 SUCCESS 0 sd 0:1:0:0: + > command: Read (10): 28 00 33 f6 24 ac 00 00 1a 00 + > scsi host busy 1 failed 0 + > sd 0:1:0:0: Notifying upper driver of completion (result 0) + > sd_rw_intr: sda: res=0x0 + > 26 sectors total, 13312 bytes done. + > use_sg is 4 + > attempt to access beyond end of device + > sda6: rw=0, want=1044134458, limit=951401367 + > Buffer I/O error on device sda6, logical block 522067228 + > attempt to access beyond end of device + +2. When INQUIRY with EVPD bit set issued to the MegaRAID controller, + system memory gets corrupted. + Root Cause: MegaRAID F/W handle the INQUIRY with EVPD bit set + incorrectly. + Fix: MegaRAID F/W has fixed the problem and being process of release, + soon. Meanwhile, driver will filter out the request. + +3. One of member in the data structure of the driver leads unaligne + issue on 64-bit platform. + Customer reporeted "kernel unaligned access addrss" issue when + application communicates with MegaRAID HBA driver. + Root Cause: in uioc_t structure, one of member had misaligned and it + led system to display the error message. + Fix: A patch submitted to community from following folk. + + > -----Original Message----- + > From: linux-scsi-owner@vger.kernel.org + > [mailto:linux-scsi-owner@vger.kernel.org] On Behalf Of Sakurai Hiroomi + > Sent: Wednesday, July 12, 2006 4:20 AM + > To: linux-scsi@vger.kernel.org; linux-kernel@vger.kernel.org + > Subject: Re: Help: strange messages from kernel on IA64 platform + > + > Hi, + > + > I saw same message. + > + > When GAM(Global Array Manager) is started, The following + > message output. + > kernel: kernel unaligned access to 0xe0000001fe1080d4, + > ip=0xa000000200053371 + > + > The uioc structure used by ioctl is defined by packed, + > the allignment of each member are disturbed. + > In a 64 bit structure, the allignment of member doesn't fit 64 bit + > boundary. this causes this messages. + > In a 32 bit structure, we don't see the message because the allinment + > of member fit 32 bit boundary even if packed is specified. + > + > patch + > I Add 32 bit dummy member to fit 64 bit boundary. I tested. + > We confirmed this patch fix the problem by IA64 server. + > + > ************************************************************** + > **************** + > --- linux-2.6.9/drivers/scsi/megaraid/megaraid_ioctl.h.orig + > 2006-04-03 17:13:03.000000000 +0900 + > +++ linux-2.6.9/drivers/scsi/megaraid/megaraid_ioctl.h + > 2006-04-03 17:14:09.000000000 +0900 + > @@ -132,6 +132,10 @@ + > /* Driver Data: */ + > void __user * user_data; + > uint32_t user_data_len; + > + + > + /* 64bit alignment */ + > + uint32_t pad_0xBC; + > + + > mraid_passthru_t __user *user_pthru; + > + > mraid_passthru_t *pthru32; + > ************************************************************** + > **************** + Release Date : Mon Apr 11 12:27:22 EST 2006 - Seokmann Ju Current Version : 2.20.4.8 (scsi module), 2.20.2.6 (cmm module) Older Version : 2.20.4.7 (scsi module), 2.20.2.6 (cmm module) diff --git a/Documentation/scsi/ChangeLog.megaraid_sas b/Documentation/scsi/ChangeLog.megaraid_sas index 2dafa63bd..d9e5960da 100644 --- a/Documentation/scsi/ChangeLog.megaraid_sas +++ b/Documentation/scsi/ChangeLog.megaraid_sas @@ -1,3 +1,32 @@ + +1 Release Date : Sun May 14 22:49:52 PDT 2006 - Sumant Patro +2 Current Version : 00.00.03.01 +3 Older Version : 00.00.02.04 + +i. Added support for ZCR controller. + + New device id 0x413 added. + +ii. Bug fix : Disable controller interrupt before firing INIT cmd to FW. + + Interrupt is enabled after required initialization is over. + This is done to ensure that driver is ready to handle interrupts when + it is generated by the controller. + + -Sumant Patro + +1 Release Date : Wed Feb 03 14:31:44 PST 2006 - Sumant Patro +2 Current Version : 00.00.02.04 +3 Older Version : 00.00.02.04 + +i. Remove superflous instance_lock + + gets rid of the otherwise superflous instance_lock and avoids an unsave + unsynchronized access in the error handler. + + - Christoph Hellwig + + 1 Release Date : Wed Feb 03 14:31:44 PST 2006 - Sumant Patro 2 Current Version : 00.00.02.04 3 Older Version : 00.00.02.04 diff --git a/Documentation/scsi/aacraid.txt b/Documentation/scsi/aacraid.txt index 820fd0793..be5567085 100644 --- a/Documentation/scsi/aacraid.txt +++ b/Documentation/scsi/aacraid.txt @@ -24,10 +24,10 @@ Supported Cards/Chipsets 9005:0285:9005:0296 Adaptec 2240S (SabreExpress) 9005:0285:9005:0290 Adaptec 2410SA (Jaguar) 9005:0285:9005:0293 Adaptec 21610SA (Corsair-16) - 9005:0285:103c:3227 Adaptec 2610SA (Bearcat) + 9005:0285:103c:3227 Adaptec 2610SA (Bearcat HP release) 9005:0285:9005:0292 Adaptec 2810SA (Corsair-8) 9005:0285:9005:0294 Adaptec Prowler - 9005:0286:9005:029d Adaptec 2420SA (Intruder) + 9005:0286:9005:029d Adaptec 2420SA (Intruder HP release) 9005:0286:9005:029c Adaptec 2620SA (Intruder) 9005:0286:9005:029b Adaptec 2820SA (Intruder) 9005:0286:9005:02a7 Adaptec 2830SA (Skyray) @@ -38,7 +38,7 @@ Supported Cards/Chipsets 9005:0285:9005:0297 Adaptec 4005SAS (AvonPark) 9005:0285:9005:0299 Adaptec 4800SAS (Marauder-X) 9005:0285:9005:029a Adaptec 4805SAS (Marauder-E) - 9005:0286:9005:02a2 Adaptec 4810SAS (Hurricane) + 9005:0286:9005:02a2 Adaptec 3800SAS (Hurricane44) 1011:0046:9005:0364 Adaptec 5400S (Mustang) 1011:0046:9005:0365 Adaptec 5400S (Mustang) 9005:0283:9005:0283 Adaptec Catapult (3210S with arc firmware) @@ -72,7 +72,7 @@ Supported Cards/Chipsets 9005:0286:9005:02a1 ICP ICP9087MA (Lancer) 9005:0286:9005:02a4 ICP ICP9085LI (Marauder-X) 9005:0286:9005:02a5 ICP ICP5085BR (Marauder-E) - 9005:0286:9005:02a3 ICP ICP5085AU (Hurricane) + 9005:0286:9005:02a3 ICP ICP5445AU (Hurricane44) 9005:0286:9005:02a6 ICP ICP9067MA (Intruder-6) 9005:0286:9005:02a9 ICP ICP5087AU (Skyray) 9005:0286:9005:02aa ICP ICP5047AU (Skyray) diff --git a/Documentation/scsi/cpqfc.txt b/Documentation/scsi/cpqfc.txt deleted file mode 100644 index dd33e61c0..000000000 --- a/Documentation/scsi/cpqfc.txt +++ /dev/null @@ -1,272 +0,0 @@ -Notes for CPQFCTS driver for Compaq Tachyon TS -Fibre Channel Host Bus Adapter, PCI 64-bit, 66MHz -for Linux (RH 6.1, 6.2 kernel 2.2.12-32, 2.2.14-5) -SMP tested -Tested in single and dual HBA configuration, 32 and 64bit busses, -33 and 66MHz. Only supports FC-AL. -SEST size 512 Exchanges (simultaneous I/Os) limited by module kmalloc() - max of 128k bytes contiguous. - -Ver 2.5.4 Oct 03, 2002 - * fixed memcpy of sense buffer in ioctl to copy the smaller defined size -Ver 2.5.3 Aug 01, 2002 - * fix the passthru ioctl to handle the Scsi_Cmnd->request being a pointer -Ver 2.5.1 Jul 30, 2002 - * fix ioctl to pay attention to the specified LUN. -Ver 2.5.0 Nov 29, 2001 - * eliminated io_request_lock. This change makes the driver specific - to the 2.5.x kernels. - * silenced excessively noisy printks. - -Ver 2.1.2 July 23, 2002 - * initialize DumCmnd->lun in cpqfcTS_ioctl (used in fcFindLoggedInPorts as LUN index) - -Ver 2.1.1 Oct 18, 2001 - * reinitialize Cmnd->SCp.sent_command (used to identify commands as - passthrus) on calling scsi_done, since the scsi mid layer does not - use (or reinitialize) this field to prevent subsequent comands from - having it set incorrectly. - -Ver 2.1.0 Aug 27, 2001 - * Revise driver to use new kernel 2.4.x PCI DMA API, instead of - virt_to_bus(). (enables driver to work w/ ia64 systems with >2Gb RAM.) - Rework main scatter-gather code to handle cases where SG element - lengths are larger than 0x7FFFF bytes and use as many scatter - gather pages as necessary. (Steve Cameron) - * Makefile changes to bring cpqfc into line w/ rest of SCSI drivers - (thanks to Keith Owens) - -Ver 2.0.5 Aug 06, 2001 - * Reject non-existent luns in the driver rather than letting the - hardware do it. (some HW behaves differently than others in this area.) - * Changed Makefile to rely on "make dep" instead of explicit dependencies - * ifdef'ed out fibre channel analyzer triggering debug code - * fixed a jiffies wrapping issue - -Ver 2.0.4 Aug 01, 2001 - * Incorporated fix for target device reset from Steeleye - * Fixed passthrough ioctl so it doesn't hang. - * Fixed hang in launch_FCworker_thread() that occurred on some machines. - * Avoid problem when number of volumes in a single cabinet > 8 - -Ver 2.0.2 July 23, 2001 - Changed the semiphore changes so the driver would compile in 2.4.7. - This version is for 2.4.7 and beyond. - -Ver 2.0.1 May 7, 2001 - Merged version 1.3.6 fixes into version 2.0.0. - -Ver 2.0.0 May 7, 2001 - Fixed problem so spinlock is being initialized to UNLOCKED. - Fixed updated driver so it compiles in the 2.4 tree. - - Ver 1.3.6 Feb 27, 2001 - Added Target_Device_Reset function for SCSI error handling - Fixed problem with not reseting addressing mode after implicit logout - - -Ver 1.3.4 Sep 7, 2000 - Added Modinfo information - Fixed problem with statically linking the driver - -Ver 1.3.3, Aug 23, 2000 - Fixed device/function number in ioctl - -Ver 1.3.2, July 27, 2000 - Add include for Alpha compile on 2.2.14 kernel (cpq*i2c.c) - Change logic for different FCP-RSP sense_buffer location for HSG80 target - And search for Agilent Tachyon XL2 HBAs (not finished! - in test) - -Tested with -(storage): - Compaq RA-4x000, RAID firmware ver 2.40 - 2.54 - Seagate FC drives model ST39102FC, rev 0006 - Hitachi DK31CJ-72FC rev J8A8 - IBM DDYF-T18350R rev F60K - Compaq FC-SCSI bridge w/ DLT 35/70 Gb DLT (tape) -(servers): - Compaq PL-1850R - Compaq PL-6500 Xeon (400MHz) - Compaq PL-8500 (500MHz, 66MHz, 64bit PCI) - Compaq Alpha DS20 (RH 6.1) -(hubs): - Vixel Rapport 1000 (7-port "dumb") - Gadzoox Gibralter (12-port "dumb") - Gadzoox Capellix 2000, 3000 -(switches): - Brocade 2010, 2400, 2800, rev 2.0.3a (& later) - Gadzoox 3210 (Fabric blade beta) - Vixel 7100 (Fabric beta firmare - known hot plug issues) -using "qa_test" (esp. io_test script) suite modified from Unix tests. - -Installation: -make menuconfig - (select SCSI low-level, Compaq FC HBA) -make modules -make modules_install - -e.g. insmod -f cpqfc - -Due to Fabric/switch delays, driver requires 4 seconds -to initialize. If adapters are found, there will be a entries at -/proc/scsi/cpqfcTS/* - -sample contents of startup messages - -************************* - scsi_register allocating 3596 bytes for CPQFCHBA - ioremap'd Membase: c887e600 - HBA Tachyon RevId 1.2 -Allocating 119808 for 576 Exchanges @ c0dc0000 -Allocating 112904 for LinkQ @ c0c20000 (576 elements) -Allocating 110600 for TachSEST for 512 Exchanges - cpqfcTS: writing IMQ BASE 7C0000h PI 7C4000h - cpqfcTS: SEST c0e40000(virt): Wrote base E40000h @ c887e740 -cpqfcTS: New FC port 0000E8h WWN: 500507650642499D SCSI Chan/Trgt 0/0 -cpqfcTS: New FC port 0000EFh WWN: 50000E100000D5A6 SCSI Chan/Trgt 0/1 -cpqfcTS: New FC port 0000E4h WWN: 21000020370097BB SCSI Chan/Trgt 0/2 -cpqfcTS: New FC port 0000E2h WWN: 2100002037009946 SCSI Chan/Trgt 0/3 -cpqfcTS: New FC port 0000E1h WWN: 21000020370098FE SCSI Chan/Trgt 0/4 -cpqfcTS: New FC port 0000E0h WWN: 21000020370097B2 SCSI Chan/Trgt 0/5 -cpqfcTS: New FC port 0000DCh WWN: 2100002037006CC1 SCSI Chan/Trgt 0/6 -cpqfcTS: New FC port 0000DAh WWN: 21000020370059F6 SCSI Chan/Trgt 0/7 -cpqfcTS: New FC port 00000Fh WWN: 500805F1FADB0E20 SCSI Chan/Trgt 0/8 -cpqfcTS: New FC port 000008h WWN: 500805F1FADB0EBA SCSI Chan/Trgt 0/9 -cpqfcTS: New FC port 000004h WWN: 500805F1FADB1EB9 SCSI Chan/Trgt 0/10 -cpqfcTS: New FC port 000002h WWN: 500805F1FADB1ADE SCSI Chan/Trgt 0/11 -cpqfcTS: New FC port 000001h WWN: 500805F1FADBA2CA SCSI Chan/Trgt 0/12 -scsi4 : Compaq FibreChannel HBA Tachyon TS HPFC-5166A/1.2: WWN 500508B200193F50 - on PCI bus 0 device 0xa0fc irq 5 IObaseL 0x3400, MEMBASE 0xc6ef8600 -PCI bus width 32 bits, bus speed 33 MHz -FCP-SCSI Driver v1.3.0 -GBIC detected: Short-wave. LPSM 0h Monitor -scsi : 5 hosts. - Vendor: IBM Model: DDYF-T18350R Rev: F60K - Type: Direct-Access ANSI SCSI revision: 03 -Detected scsi disk sdb at scsi4, channel 0, id 0, lun 0 - Vendor: HITACHI Model: DK31CJ-72FC Rev: J8A8 - Type: Direct-Access ANSI SCSI revision: 02 -Detected scsi disk sdc at scsi4, channel 0, id 1, lun 0 - Vendor: SEAGATE Model: ST39102FC Rev: 0006 - Type: Direct-Access ANSI SCSI revision: 02 -Detected scsi disk sdd at scsi4, channel 0, id 2, lun 0 - Vendor: SEAGATE Model: ST39102FC Rev: 0006 - Type: Direct-Access ANSI SCSI revision: 02 -Detected scsi disk sde at scsi4, channel 0, id 3, lun 0 - Vendor: SEAGATE Model: ST39102FC Rev: 0006 - Type: Direct-Access ANSI SCSI revision: 02 -Detected scsi disk sdf at scsi4, channel 0, id 4, lun 0 - Vendor: SEAGATE Model: ST39102FC Rev: 0006 - Type: Direct-Access ANSI SCSI revision: 02 -Detected scsi disk sdg at scsi4, channel 0, id 5, lun 0 - Vendor: SEAGATE Model: ST39102FC Rev: 0006 - Type: Direct-Access ANSI SCSI revision: 02 -Detected scsi disk sdh at scsi4, channel 0, id 6, lun 0 - Vendor: SEAGATE Model: ST39102FC Rev: 0006 - Type: Direct-Access ANSI SCSI revision: 02 -Detected scsi disk sdi at scsi4, channel 0, id 7, lun 0 - Vendor: COMPAQ Model: LOGICAL VOLUME Rev: 2.48 - Type: Direct-Access ANSI SCSI revision: 02 -Detected scsi disk sdj at scsi4, channel 0, id 8, lun 0 - Vendor: COMPAQ Model: LOGICAL VOLUME Rev: 2.48 - Type: Direct-Access ANSI SCSI revision: 02 -Detected scsi disk sdk at scsi4, channel 0, id 8, lun 1 - Vendor: COMPAQ Model: LOGICAL VOLUME Rev: 2.40 - Type: Direct-Access ANSI SCSI revision: 02 -Detected scsi disk sdl at scsi4, channel 0, id 9, lun 0 - Vendor: COMPAQ Model: LOGICAL VOLUME Rev: 2.40 - Type: Direct-Access ANSI SCSI revision: 02 -Detected scsi disk sdm at scsi4, channel 0, id 9, lun 1 - Vendor: COMPAQ Model: LOGICAL VOLUME Rev: 2.54 - Type: Direct-Access ANSI SCSI revision: 02 -Detected scsi disk sdn at scsi4, channel 0, id 10, lun 0 - Vendor: COMPAQ Model: LOGICAL VOLUME Rev: 2.54 - Type: Direct-Access ANSI SCSI revision: 02 -Detected scsi disk sdo at scsi4, channel 0, id 11, lun 0 - Vendor: COMPAQ Model: LOGICAL VOLUME Rev: 2.54 - Type: Direct-Access ANSI SCSI revision: 02 -Detected scsi disk sdp at scsi4, channel 0, id 11, lun 1 - Vendor: COMPAQ Model: LOGICAL VOLUME Rev: 2.54 - Type: Direct-Access ANSI SCSI revision: 02 -Detected scsi disk sdq at scsi4, channel 0, id 12, lun 0 - Vendor: COMPAQ Model: LOGICAL VOLUME Rev: 2.54 - Type: Direct-Access ANSI SCSI revision: 02 -Detected scsi disk sdr at scsi4, channel 0, id 12, lun 1 -resize_dma_pool: unknown device type 12 -resize_dma_pool: unknown device type 12 -SCSI device sdb: hdwr sector= 512 bytes. Sectors= 35843670 [17501 MB] [17.5 GB] - sdb: sdb1 -SCSI device sdc: hdwr sector= 512 bytes. Sectors= 144410880 [70513 MB] [70.5 GB] - sdc: sdc1 -SCSI device sdd: hdwr sector= 512 bytes. Sectors= 17783240 [8683 MB] [8.7 GB] - sdd: sdd1 -SCSI device sde: hdwr sector= 512 bytes. Sectors= 17783240 [8683 MB] [8.7 GB] - sde: sde1 -SCSI device sdf: hdwr sector= 512 bytes. Sectors= 17783240 [8683 MB] [8.7 GB] - sdf: sdf1 -SCSI device sdg: hdwr sector= 512 bytes. Sectors= 17783240 [8683 MB] [8.7 GB] - sdg: sdg1 -SCSI device sdh: hdwr sector= 512 bytes. Sectors= 17783240 [8683 MB] [8.7 GB] - sdh: sdh1 -SCSI device sdi: hdwr sector= 512 bytes. Sectors= 17783240 [8683 MB] [8.7 GB] - sdi: sdi1 -SCSI device sdj: hdwr sector= 512 bytes. Sectors= 2056160 [1003 MB] [1.0 GB] - sdj: sdj1 -SCSI device sdk: hdwr sector= 512 bytes. Sectors= 2052736 [1002 MB] [1.0 GB] - sdk: sdk1 -SCSI device sdl: hdwr sector= 512 bytes. Sectors= 17764320 [8673 MB] [8.7 GB] - sdl: sdl1 -SCSI device sdm: hdwr sector= 512 bytes. Sectors= 8380320 [4091 MB] [4.1 GB] - sdm: sdm1 -SCSI device sdn: hdwr sector= 512 bytes. Sectors= 17764320 [8673 MB] [8.7 GB] - sdn: sdn1 -SCSI device sdo: hdwr sector= 512 bytes. Sectors= 17764320 [8673 MB] [8.7 GB] - sdo: sdo1 -SCSI device sdp: hdwr sector= 512 bytes. Sectors= 17764320 [8673 MB] [8.7 GB] - sdp: sdp1 -SCSI device sdq: hdwr sector= 512 bytes. Sectors= 2056160 [1003 MB] [1.0 GB] - sdq: sdq1 -SCSI device sdr: hdwr sector= 512 bytes. Sectors= 2052736 [1002 MB] [1.0 GB] - sdr: sdr1 - -************************* - -If a GBIC of type Short-wave, Long-wave, or Copper is detected, it will -print out; otherwise, "none" is displayed. If the cabling is correct -and a loop circuit is completed, you should see "Monitor"; otherwise, -"LoopFail" (on open circuit) or some LPSM number/state with bit 3 set. - - -ERRATA: -1. Normally, Linux Scsi queries FC devices with INQUIRY strings. All LUNs -found according to INQUIRY should get READ commands at sector 0 to find -partition table, etc. Older kernels only query the first 4 devices. Some -Linux kernels only look for one LUN per target (i.e. FC device). - -2. Physically removing a device, or a malfunctioning system which hides a -device, leads to a 30-second timeout and subsequent _abort call. -In some process contexts, this will hang the kernel (crashing the system). -Single bit errors in frames and virtually all hot plugging events are -gracefully handled with internal driver timer and Abort processing. - -3. Some SCSI drives with error conditions will not handle the 7 second timeout -in this software driver, leading to infinite retries on timed out SCSI commands. -The 7 secs balances the need to quickly recover from lost frames (esp. on sequence -initiatives) and time needed by older/slower/error-state drives in responding. -This can be easily changed in "Exchanges[].timeOut". - -4. Due to the nature of FC soft addressing, there is no assurance that the -same LUNs (drives) will have the same path (e.g. /dev/sdb1) from one boot to -next. Dynamic soft address changes (i.e. 24-bit FC port_id) are -supported during run time (e.g. due to hot plug event) by the use of WWN to -SCSI Nexus (channel/target/LUN) mapping. - -5. Compaq RA4x00 firmware version 2.54 and later supports SSP (Selective -Storage Presentation), which maps LUNs to a WWN. If RA4x00 firmware prior -2.54 (e.g. older controller) is used, or the FC HBA is replaced (another WWN -is used), logical volumes on the RA4x00 will no longer be visible. - - -Send questions/comments to: -Amy Vanzant-Hodge (fibrechannel@compaq.com) - diff --git a/Documentation/scsi/ppa.txt b/Documentation/scsi/ppa.txt index 0dac88d86..5d9223bc1 100644 --- a/Documentation/scsi/ppa.txt +++ b/Documentation/scsi/ppa.txt @@ -12,5 +12,3 @@ http://www.torque.net/parport/ Email list for Linux Parport linux-parport@torque.net -Email for problems with ZIP or ZIP Plus drivers -campbell@torque.net diff --git a/Documentation/scsi/tmscsim.txt b/Documentation/scsi/tmscsim.txt index e165229ad..df7a02bfb 100644 --- a/Documentation/scsi/tmscsim.txt +++ b/Documentation/scsi/tmscsim.txt @@ -109,7 +109,7 @@ than the 33.33 MHz being in the PCI spec. If you want to share the IRQ with another device and the driver refuses to do so, you might succeed with changing the DC390_IRQ type in tmscsim.c to -SA_SHIRQ | SA_INTERRUPT. +IRQF_SHARED | IRQF_DISABLED. 3.Features diff --git a/Documentation/sound/alsa/ALSA-Configuration.txt b/Documentation/sound/alsa/ALSA-Configuration.txt index 0ee2c7dfc..f61af23dd 100644 --- a/Documentation/sound/alsa/ALSA-Configuration.txt +++ b/Documentation/sound/alsa/ALSA-Configuration.txt @@ -366,7 +366,9 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. Module for C-Media CMI8338 and 8738 PCI sound cards. - mpu_port - 0x300,0x310,0x320,0x330, 0 = disable (default) + mpu_port - 0x300,0x310,0x320,0x330 = legacy port, + 1 = integrated PCI port, + 0 = disable (default) fm_port - 0x388 (default), 0 = disable (default) soft_ac3 - Software-conversion of raw SPDIF packets (model 033 only) (default = 1) @@ -468,7 +470,23 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. Module for multifunction CS5535 companion PCI device + The power-management is supported. + + Module snd-darla20 + ------------------ + + Module for Echoaudio Darla20 + + This module supports multiple cards. + The driver requires the firmware loader support on kernel. + + Module snd-darla24 + ------------------ + + Module for Echoaudio Darla24 + This module supports multiple cards. + The driver requires the firmware loader support on kernel. Module snd-dt019x ----------------- @@ -497,6 +515,14 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. The power-management is supported. + Module snd-echo3g + ----------------- + + Module for Echoaudio 3G cards (Gina3G/Layla3G) + + This module supports multiple cards. + The driver requires the firmware loader support on kernel. + Module snd-emu10k1 ------------------ @@ -655,6 +681,22 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. The power-management is supported. + Module snd-gina20 + ----------------- + + Module for Echoaudio Gina20 + + This module supports multiple cards. + The driver requires the firmware loader support on kernel. + + Module snd-gina24 + ----------------- + + Module for Echoaudio Gina24 + + This module supports multiple cards. + The driver requires the firmware loader support on kernel. + Module snd-gusclassic --------------------- @@ -707,8 +749,10 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. Module snd-hda-intel -------------------- - Module for Intel HD Audio (ICH6, ICH6M, ICH7), ATI SB450, - VIA VT8251/VT8237A + Module for Intel HD Audio (ICH6, ICH6M, ESB2, ICH7, ICH8), + ATI SB450, SB600, RS600, + VIA VT8251/VT8237A, + SIS966, ULI M5461 model - force the model name position_fix - Fix DMA pointer (0 = auto, 1 = none, 2 = POSBUF, 3 = FIFO size) @@ -756,12 +800,18 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. basic fixed pin assignment w/o SPDIF auto auto-config reading BIOS (default) - ALC882/883/885 + ALC882/885 3stack-dig 3-jack with SPDIF I/O 6stck-dig 6-jack digital with SPDIF I/O auto auto-config reading BIOS (default) - ALC861 + ALC883/888 + 3stack-dig 3-jack with SPDIF I/O + 6stack-dig 6-jack digital with SPDIF I/O + 6stack-dig-demo 6-stack digital for Intel demo board + auto auto-config reading BIOS (default) + + ALC861/660 3stack 3-jack 3stack-dig 3-jack with SPDIF I/O 6stack-dig 6-jack with SPDIF I/O @@ -778,6 +828,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. AD1981 basic 3-jack (default) hp HP nx6320 + thinkpad Lenovo Thinkpad T60/X60/Z60 AD1986A 6stack 6-jack, separate surrounds (default) @@ -932,6 +983,30 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. driver isn't configured properly or you want to try another type for testing. + Module snd-indigo + ----------------- + + Module for Echoaudio Indigo + + This module supports multiple cards. + The driver requires the firmware loader support on kernel. + + Module snd-indigodj + ------------------- + + Module for Echoaudio Indigo DJ + + This module supports multiple cards. + The driver requires the firmware loader support on kernel. + + Module snd-indigoio + ------------------- + + Module for Echoaudio Indigo IO + + This module supports multiple cards. + The driver requires the firmware loader support on kernel. + Module snd-intel8x0 ------------------- @@ -1031,6 +1106,22 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. This module supports multiple cards. + Module snd-layla20 + ------------------ + + Module for Echoaudio Layla20 + + This module supports multiple cards. + The driver requires the firmware loader support on kernel. + + Module snd-layla24 + ------------------ + + Module for Echoaudio Layla24 + + This module supports multiple cards. + The driver requires the firmware loader support on kernel. + Module snd-maestro3 ------------------- @@ -1051,6 +1142,14 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. The power-management is supported. + Module snd-mia + --------------- + + Module for Echoaudio Mia + + This module supports multiple cards. + The driver requires the firmware loader support on kernel. + Module snd-miro --------------- @@ -1083,6 +1182,14 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. When no hotplug fw loader is available, you need to load the firmware via mixartloader utility in alsa-tools package. + Module snd-mona + --------------- + + Module for Echoaudio Mona + + This module supports multiple cards. + The driver requires the firmware loader support on kernel. + Module snd-mpu401 ----------------- @@ -1633,9 +1740,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. About capture IBL, see the description of snd-vx222 module. - Note: the driver is build only when CONFIG_ISA is set. - - Note2: snd-vxp440 driver is merged to snd-vxpocket driver since + Note: snd-vxp440 driver is merged to snd-vxpocket driver since ALSA 1.0.10. The power-management is supported. @@ -1662,8 +1767,6 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. Module for Sound Core PDAudioCF sound card. - Note: the driver is build only when CONFIG_ISA is set. - The power-management is supported. diff --git a/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl b/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl index 1faf76383..b8dc51ca7 100644 --- a/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl +++ b/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl @@ -1149,7 +1149,7 @@ } chip->port = pci_resource_start(pci, 0); if (request_irq(pci->irq, snd_mychip_interrupt, - SA_INTERRUPT|SA_SHIRQ, "My Chip", chip)) { + IRQF_DISABLED|IRQF_SHARED, "My Chip", chip)) { printk(KERN_ERR "cannot grab irq %d\n", pci->irq); snd_mychip_free(chip); return -EBUSY; @@ -1172,7 +1172,7 @@ } /* PCI IDs */ - static struct pci_device_id snd_mychip_ids[] __devinitdata = { + static struct pci_device_id snd_mychip_ids[] = { { PCI_VENDOR_ID_FOO, PCI_DEVICE_ID_BAR, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, .... @@ -1323,7 +1323,7 @@ irq, snd_mychip_interrupt, - SA_INTERRUPT|SA_SHIRQ, "My Chip", chip)) { + IRQF_DISABLED|IRQF_SHARED, "My Chip", chip)) { printk(KERN_ERR "cannot grab irq %d\n", pci->irq); snd_mychip_free(chip); return -EBUSY; @@ -1342,7 +1342,7 @@ On the PCI bus, the interrupts can be shared. Thus, - SA_SHIRQ is given as the interrupt flag of + IRQF_SHARED is given as the interrupt flag of request_irq(). @@ -1565,7 +1565,7 @@ - If you aquire a spinlock in the interrupt handler, and the + If you acquire a spinlock in the interrupt handler, and the lock is used in other pcm callbacks, too, then you have to release the lock before calling snd_pcm_period_elapsed(), because @@ -4215,7 +4215,7 @@ struct _snd_pcm_runtime { @@ -4242,15 +4242,36 @@ struct _snd_pcm_runtime { + The 5th argument is bitflags for additional information. When the i/o port address above is a part of the PCI i/o region, the MPU401 i/o port might have been already allocated - (reserved) by the driver itself. In such a case, pass non-zero - to the 5th argument - (integrated). Otherwise, pass 0 to it, + (reserved) by the driver itself. In such a case, pass a bit flag + MPU401_INFO_INTEGRATED, and the mpu401-uart layer will allocate the i/o ports by itself. + + When the controller supports only the input or output MIDI stream, + pass MPU401_INFO_INPUT or + MPU401_INFO_OUTPUT bitflag, respectively. + Then the rawmidi instance is created as a single stream. + + + + MPU401_INFO_MMIO bitflag is used to change + the access method to MMIO (via readb and writeb) instead of + iob and outb. In this case, you have to pass the iomapped address + to snd_mpu401_uart_new(). + + + + When MPU401_INFO_TX_IRQ is set, the output + stream isn't checked in the default interrupt handler. The driver + needs to call snd_mpu401_uart_interrupt_tx() + by itself to start processing the output stream in irq handler. + + Usually, the port address corresponds to the command port and port + 1 corresponds to the data port. If not, you may change @@ -5333,7 +5354,7 @@ struct _snd_pcm_runtime { @@ -5394,29 +5415,12 @@ struct _snd_pcm_runtime { c.text.write_size = 256; entry->c.text.write = my_proc_write; ]]> - - The buffer size for read is set to 1024 implicitly by - snd_info_set_text_ops(). It should suffice - in most cases (the size will be aligned to - PAGE_SIZE anyway), but if you need to handle - very large text files, you can set it explicitly, too. - - - -c.text.read_size = 65536; -]]> - - - - For the write callback, you can use snd_info_get_line() to get a text line, and @@ -5562,7 +5566,7 @@ struct _snd_pcm_runtime { power status. Call snd_pcm_suspend_all() to suspend the running PCM streams. If AC97 codecs are used, call - snd_ac97_resume() for each codec. + snd_ac97_suspend() for each codec. Save the register values if necessary. Stop the hardware if necessary. Disable the PCI device by calling diff --git a/Documentation/sparc/sbus_drivers.txt b/Documentation/sparc/sbus_drivers.txt index 876195dc2..4b9351624 100644 --- a/Documentation/sparc/sbus_drivers.txt +++ b/Documentation/sparc/sbus_drivers.txt @@ -25,42 +25,84 @@ the bits necessary to run your device. The most commonly used members of this structure, and their typical usage, will be detailed below. - Here is how probing is performed by an SBUS driver -under Linux: + Here is a piece of skeleton code for perofming a device +probe in an SBUS driverunder Linux: - static void init_one_mydevice(struct sbus_dev *sdev) + static int __devinit mydevice_probe_one(struct sbus_dev *sdev) { + struct mysdevice *mp = kzalloc(sizeof(*mp), GFP_KERNEL); + + if (!mp) + return -ENODEV; + + ... + dev_set_drvdata(&sdev->ofdev.dev, mp); + return 0; ... } - static int mydevice_match(struct sbus_dev *sdev) + static int __devinit mydevice_probe(struct of_device *dev, + const struct of_device_id *match) { - if (some_criteria(sdev)) - return 1; - return 0; + struct sbus_dev *sdev = to_sbus_device(&dev->dev); + + return mydevice_probe_one(sdev); } - static void mydevice_probe(void) + static int __devexit mydevice_remove(struct of_device *dev) { - struct sbus_bus *sbus; - struct sbus_dev *sdev; + struct sbus_dev *sdev = to_sbus_device(&dev->dev); + struct mydevice *mp = dev_get_drvdata(&dev->dev); - for_each_sbus(sbus) { - for_each_sbusdev(sdev, sbus) { - if (mydevice_match(sdev)) - init_one_mydevice(sdev); - } - } + return mydevice_remove_one(sdev, mp); } - All this does is walk through all SBUS devices in the -system, checks each to see if it is of the type which -your driver is written for, and if so it calls the init -routine to attach the device and prepare to drive it. + static struct of_device_id mydevice_match[] = { + { + .name = "mydevice", + }, + {}, + }; + + MODULE_DEVICE_TABLE(of, mydevice_match); - "init_one_mydevice" might do things like allocate software -state structures, map in I/O registers, place the hardware -into an initialized state, etc. + static struct of_platform_driver mydevice_driver = { + .name = "mydevice", + .match_table = mydevice_match, + .probe = mydevice_probe, + .remove = __devexit_p(mydevice_remove), + }; + + static int __init mydevice_init(void) + { + return of_register_driver(&mydevice_driver, &sbus_bus_type); + } + + static void __exit mydevice_exit(void) + { + of_unregister_driver(&mydevice_driver); + } + + module_init(mydevice_init); + module_exit(mydevice_exit); + + The mydevice_match table is a series of entries which +describes what SBUS devices your driver is meant for. In the +simplest case you specify a string for the 'name' field. Every +SBUS device with a 'name' property matching your string will +be passed one-by-one to your .probe method. + + You should store away your device private state structure +pointer in the drvdata area so that you can retrieve it later on +in your .remove method. + + Any memory allocated, registers mapped, IRQs registered, +etc. must be undone by your .remove method so that all resources +of your device are relased by the time it returns. + + You should _NOT_ use the for_each_sbus(), for_each_sbusdev(), +and for_all_sbusdev() interfaces. They are deprecated, will be +removed, and no new driver should reference them ever. Mapping and Accessing I/O Registers @@ -263,10 +305,3 @@ discussed above and plus it handles both PCI and SBUS boards. Lance driver abuses consistent mappings for data transfer. It is a nifty trick which we do not particularly recommend... Just check it out and know that it's legal. - - Bad examples, do NOT use - - drivers/video/cgsix.c - This one uses result of sbus_ioremap as if it is an address. -This does NOT work on sparc64 and therefore is broken. We will -convert it at a later date. diff --git a/Documentation/sparse.txt b/Documentation/sparse.txt index f97841478..5a311c38d 100644 --- a/Documentation/sparse.txt +++ b/Documentation/sparse.txt @@ -1,5 +1,6 @@ Copyright 2004 Linus Torvalds Copyright 2004 Pavel Machek +Copyright 2006 Bob Copeland Using sparse for typechecking ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -41,23 +42,16 @@ sure that bitwise types don't get mixed up (little-endian vs big-endian vs cpu-endian vs whatever), and there the constant "0" really _is_ special. -Modify top-level Makefile to say +Getting sparse +~~~~~~~~~~~~~~ -CHECK = sparse -Wbitwise +With git, you can just get it from -or you don't get any checking at all. - - -Where to get sparse -~~~~~~~~~~~~~~~~~~~ - -With BK, you can just get it from - - bk://sparse.bkbits.net/sparse + rsync://rsync.kernel.org/pub/scm/devel/sparse/sparse.git and DaveJ has tar-balls at - http://www.codemonkey.org.uk/projects/bitkeeper/sparse/ + http://www.codemonkey.org.uk/projects/git-snapshots/sparse/ Once you have it, just do @@ -65,8 +59,20 @@ Once you have it, just do make make install -as your regular user, and it will install sparse in your ~/bin directory. -After that, doing a kernel make with "make C=1" will run sparse on all the -C files that get recompiled, or with "make C=2" will run sparse on the -files whether they need to be recompiled or not (ie the latter is fast way -to check the whole tree if you have already built it). +as a regular user, and it will install sparse in your ~/bin directory. + +Using sparse +~~~~~~~~~~~~ + +Do a kernel make with "make C=1" to run sparse on all the C files that get +recompiled, or use "make C=2" to run sparse on the files whether they need to +be recompiled or not. The latter is a fast way to check the whole tree if you +have already built it. + +The optional make variable CF can be used to pass arguments to sparse. The +build system passes -Wbitwise to sparse automatically. To perform endianness +checks, you may define __CHECK_ENDIAN__: + + make C=2 CF="-D__CHECK_ENDIAN__" + +These checks are disabled by default as they generate a host of warnings. diff --git a/Documentation/sysctl/fs.txt b/Documentation/sysctl/fs.txt index 0b62c6214..5c3a51905 100644 --- a/Documentation/sysctl/fs.txt +++ b/Documentation/sysctl/fs.txt @@ -25,6 +25,7 @@ Currently, these files are in /proc/sys/fs: - inode-state - overflowuid - overflowgid +- suid_dumpable - super-max - super-nr @@ -131,6 +132,25 @@ The default is 65534. ============================================================== +suid_dumpable: + +This value can be used to query and set the core dump mode for setuid +or otherwise protected/tainted binaries. The modes are + +0 - (default) - traditional behaviour. Any process which has changed + privilege levels or is execute only will not be dumped +1 - (debug) - all processes dump core when possible. The core dump is + owned by the current user and no security is applied. This is + intended for system debugging situations only. Ptrace is unchecked. +2 - (suidsafe) - any binary which normally would not be dumped is dumped + readable by root only. This allows the end user to remove + such a dump but not access it directly. For security reasons + core dumps in this mode will not overwrite one another or + other files. This mode is appropriate when adminstrators are + attempting to debug problems in a normal environment. + +============================================================== + super-max & super-nr: These numbers control the maximum number of superblocks, and diff --git a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt index b0c7ab93d..89bf8c20a 100644 --- a/Documentation/sysctl/kernel.txt +++ b/Documentation/sysctl/kernel.txt @@ -50,7 +50,6 @@ show up in /proc/sys/kernel: - shmmax [ sysv ipc ] - shmmni - stop-a [ SPARC only ] -- suid_dumpable - sysrq ==> Documentation/sysrq.txt - tainted - threads-max @@ -211,9 +210,8 @@ Controls the kernel's behaviour when an oops or BUG is encountered. 0: try to continue operation -1: delay a few seconds (to give klogd time to record the oops output) and - then panic. If the `panic' sysctl is also non-zero then the machine will - be rebooted. +1: panic immediatly. If the `panic' sysctl is also non-zero then the + machine will be rebooted. ============================================================== @@ -311,25 +309,6 @@ kernel. This value defaults to SHMMAX. ============================================================== -suid_dumpable: - -This value can be used to query and set the core dump mode for setuid -or otherwise protected/tainted binaries. The modes are - -0 - (default) - traditional behaviour. Any process which has changed - privilege levels or is execute only will not be dumped -1 - (debug) - all processes dump core when possible. The core dump is - owned by the current user and no security is applied. This is - intended for system debugging situations only. Ptrace is unchecked. -2 - (suidsafe) - any binary which normally would not be dumped is dumped - readable by root only. This allows the end user to remove - such a dump but not access it directly. For security reasons - core dumps in this mode will not overwrite one another or - other files. This mode is appropriate when adminstrators are - attempting to debug problems in a normal environment. - -============================================================== - tainted: Non-zero if the kernel has been tainted. Numeric values, which diff --git a/Documentation/sysctl/vm.txt b/Documentation/sysctl/vm.txt index a46c10fcd..20d0d797f 100644 --- a/Documentation/sysctl/vm.txt +++ b/Documentation/sysctl/vm.txt @@ -28,7 +28,9 @@ Currently, these files are in /proc/sys/vm: - block_dump - drop-caches - zone_reclaim_mode -- zone_reclaim_interval +- min_unmapped_ratio +- min_slab_ratio +- panic_on_oom ============================================================== @@ -137,7 +139,6 @@ This is value ORed together of 1 = Zone reclaim on 2 = Zone reclaim writes dirty pages out 4 = Zone reclaim swaps pages -8 = Also do a global slab reclaim pass zone_reclaim_mode is set during bootup to 1 if it is determined that pages from remote zones will cause a measurable performance reduction. The @@ -161,20 +162,46 @@ Allowing regular swap effectively restricts allocations to the local node unless explicitly overridden by memory policies or cpuset configurations. -It may be advisable to allow slab reclaim if the system makes heavy -use of files and builds up large slab caches. However, the slab -shrink operation is global, may take a long time and free slabs -in all nodes of the system. +============================================================= -================================================================ +min_unmapped_ratio: -zone_reclaim_interval: +This is available only on NUMA kernels. -The time allowed for off node allocations after zone reclaim -has failed to reclaim enough pages to allow a local allocation. +A percentage of the total pages in each zone. Zone reclaim will only +occur if more than this percentage of pages are file backed and unmapped. +This is to insure that a minimal amount of local pages is still available for +file I/O even if the node is overallocated. -Time is set in seconds and set by default to 30 seconds. +The default is 1 percent. -Reduce the interval if undesired off node allocations occur. However, too -frequent scans will have a negative impact onoff node allocation performance. +============================================================= + +min_slab_ratio: + +This is available only on NUMA kernels. + +A percentage of the total pages in each zone. On Zone reclaim +(fallback from the local zone occurs) slabs will be reclaimed if more +than this percentage of pages in a zone are reclaimable slab pages. +This insures that the slab growth stays under control even in NUMA +systems that rarely perform global reclaim. + +The default is 5 percent. + +Note that slab reclaim is triggered in a per zone / node fashion. +The process of reclaiming slab memory is currently not node specific +and may not be fast. + +============================================================= + +panic_on_oom + +This enables or disables panic on out-of-memory feature. If this is set to 1, +the kernel panics when out-of-memory happens. If this is set to 0, the kernel +will kill some rogue process, called oom_killer. Usually, oom_killer can kill +rogue processes and system will survive. If you want to panic the system +rather than killing rogue processes, set this to 1. + +The default value is 0. diff --git a/Documentation/sysrq.txt b/Documentation/sysrq.txt index ad0bedf67..e0188a23f 100644 --- a/Documentation/sysrq.txt +++ b/Documentation/sysrq.txt @@ -115,8 +115,9 @@ trojan program is running at console and which could grab your password when you would try to login. It will kill all programs on given console and thus letting you make sure that the login prompt you see is actually the one from init, not some trojan program. -IMPORTANT:In its true form it is not a true SAK like the one in :IMPORTANT -IMPORTANT:c2 compliant systems, and it should be mistook as such. :IMPORTANT +IMPORTANT: In its true form it is not a true SAK like the one in a :IMPORTANT +IMPORTANT: c2 compliant system, and it should not be mistaken as :IMPORTANT +IMPORTANT: such. :IMPORTANT It seems other find it useful as (System Attention Key) which is useful when you want to exit a program that will not let you switch consoles. (For example, X or a svgalib program.) diff --git a/Documentation/tty.txt b/Documentation/tty.txt index 8ff7bc2a0..dab566047 100644 --- a/Documentation/tty.txt +++ b/Documentation/tty.txt @@ -80,13 +80,6 @@ receive_buf() - Hand buffers of bytes from the driver to the ldisc for processing. Semantics currently rather mysterious 8( -receive_room() - Can be called by the driver layer at any time when - the ldisc is opened. The ldisc must be able to - handle the reported amount of data at that instant. - Synchronization between active receive_buf and - receive_room calls is down to the driver not the - ldisc. Must not sleep. - write_wakeup() - May be called at any point between open and close. The TTY_DO_WRITE_WAKEUP flag indicates if a call is needed but always races versus calls. Thus the diff --git a/Documentation/usb/proc_usb_info.txt b/Documentation/usb/proc_usb_info.txt index f86550fe3..22c533126 100644 --- a/Documentation/usb/proc_usb_info.txt +++ b/Documentation/usb/proc_usb_info.txt @@ -59,7 +59,7 @@ bind to an interface (or perhaps several) using an ioctl call. You would issue more ioctls to the device to communicate to it using control, bulk, or other kinds of USB transfers. The IOCTLs are listed in the file, and at this writing the -source code (linux/drivers/usb/devio.c) is the primary reference +source code (linux/drivers/usb/core/devio.c) is the primary reference for how to access devices through those files. Note that since by default these BBB/DDD files are writable only by diff --git a/Documentation/usb/usb-help.txt b/Documentation/usb/usb-help.txt index b7c324973..a74085938 100644 --- a/Documentation/usb/usb-help.txt +++ b/Documentation/usb/usb-help.txt @@ -5,8 +5,7 @@ For USB help other than the readme files that are located in Documentation/usb/*, see the following: Linux-USB project: http://www.linux-usb.org - mirrors at http://www.suse.cz/development/linux-usb/ - and http://usb.in.tum.de/linux-usb/ + mirrors at http://usb.in.tum.de/linux-usb/ and http://it.linux-usb.org Linux USB Guide: http://linux-usb.sourceforge.net Linux-USB device overview (working devices and drivers): diff --git a/Documentation/usb/usb-serial.txt b/Documentation/usb/usb-serial.txt index f001cd93b..02b0f7beb 100644 --- a/Documentation/usb/usb-serial.txt +++ b/Documentation/usb/usb-serial.txt @@ -399,10 +399,10 @@ REINER SCT cyberJack pinpad/e-com USB chipcard reader Prolific PL2303 Driver - This driver support any device that has the PL2303 chip from Prolific + This driver supports any device that has the PL2303 chip from Prolific in it. This includes a number of single port USB to serial converters and USB GPS devices. Devices from Aten (the UC-232) and - IO-Data work with this driver. + IO-Data work with this driver, as does the DCU-11 mobile-phone cable. For any questions or problems with this driver, please contact Greg Kroah-Hartman at greg@kroah.com diff --git a/Documentation/usb/usbmon.txt b/Documentation/usb/usbmon.txt index 2f8431f92..e65ec828d 100644 --- a/Documentation/usb/usbmon.txt +++ b/Documentation/usb/usbmon.txt @@ -29,14 +29,13 @@ if usbmon is built into the kernel. # mount -t debugfs none_debugs /sys/kernel/debug # modprobe usbmon +# Verify that bus sockets are present. -[root@lembas zaitcev]# ls /sys/kernel/debug/usbmon +# ls /sys/kernel/debug/usbmon 1s 1t 2s 2t 3s 3t 4s 4t -[root@lembas zaitcev]# - -# ls /sys/kernel +# 2. Find which bus connects to the desired device @@ -76,7 +75,7 @@ that the file size is not excessive for your favourite editor. * Raw text data format -The '0t' type data consists of a stream of events, such as URB submission, +The '1t' type data consists of a stream of events, such as URB submission, URB callback, submission error. Every event is a text line, which consists of whitespace separated words. The number of position of words may depend on the event type, but there is a set of words, common for all types. @@ -97,13 +96,25 @@ Here is the list of words, from left to right: Zi Zo Isochronous input and output Ii Io Interrupt input and output Bi Bo Bulk input and output - Device address and Endpoint number are decimal numbers with leading zeroes - or 3 and 2 positions, correspondingly. -- URB Status. This field makes no sense for submissions, but is present - to help scripts with parsing. In error case, it contains the error code. -- Data Length. This is the actual length in the URB. + Device address and Endpoint number are 3-digit and 2-digit (respectively) + decimal numbers, with leading zeroes. +- URB Status. In most cases, this field contains a number, sometimes negative, + which represents a "status" field of the URB. This field makes no sense for + submissions, but is present anyway to help scripts with parsing. When an + error occurs, the field contains the error code. In case of a submission of + a Control packet, this field contains a Setup Tag instead of an error code. + It is easy to tell whether the Setup Tag is present because it is never a + number. Thus if scripts find a number in this field, they proceed to read + Data Length. If they find something else, like a letter, they read the setup + packet before reading the Data Length. +- Setup packet, if present, consists of 5 words: one of each for bmRequestType, + bRequest, wValue, wIndex, wLength, as specified by the USB Specification 2.0. + These words are safe to decode if Setup Tag was 's'. Otherwise, the setup + packet was present, but not captured, and the fields contain filler. +- Data Length. For submissions, this is the requested length. For callbacks, + this is the actual length. - Data tag. The usbmon may not always capture data, even if length is nonzero. - Only if tag is '=', the data words are present. + The data words are present only if this tag is '='. - Data words follow, in big endian hexadecimal format. Notice that they are not machine words, but really just a byte stream split into words to make it easier to read. Thus, the last word may contain from one to four bytes. @@ -125,25 +136,31 @@ class ParsedLine { String data_str = st.nextToken(); int len = data_str.length() / 2; int i; + int b; // byte is signed, apparently?! XXX for (i = 0; i < len; i++) { - data[data_len] = Byte.parseByte( - data_str.substring(i*2, i*2 + 2), - 16); + // data[data_len] = Byte.parseByte( + // data_str.substring(i*2, i*2 + 2), + // 16); + b = Integer.parseInt( + data_str.substring(i*2, i*2 + 2), + 16); + if (b >= 128) + b *= -1; + data[data_len] = (byte) b; data_len++; } } } } -This format is obviously deficient. For example, the setup packet for control -transfers is not delivered. This will change in the future. +This format may be changed in the future. Examples: -An input control transfer to get a port status: +An input control transfer to get a port status. -d74ff9a0 2640288196 S Ci:001:00 -115 4 < -d74ff9a0 2640288202 C Ci:001:00 0 4 = 01010100 +d5ea89a0 3575914555 S Ci:001:00 s a3 00 0000 0003 0004 4 < +d5ea89a0 3575914560 C Ci:001:00 0 4 = 01050000 An output bulk transfer to send a SCSI command 0x5E in a 31-byte Bulk wrapper to a storage device at address 5: diff --git a/Documentation/video4linux/CARDLIST.bttv b/Documentation/video4linux/CARDLIST.bttv index b72706c58..4efa46458 100644 --- a/Documentation/video4linux/CARDLIST.bttv +++ b/Documentation/video4linux/CARDLIST.bttv @@ -87,7 +87,7 @@ 86 -> Osprey 101/151 w/ svid 87 -> Osprey 200/201/250/251 88 -> Osprey 200/250 [0070:ff01] - 89 -> Osprey 210/220 + 89 -> Osprey 210/220/230 90 -> Osprey 500 [0070:ff02] 91 -> Osprey 540 [0070:ff04] 92 -> Osprey 2000 [0070:ff03] @@ -111,7 +111,7 @@ 110 -> IVC-100 [ff00:a132] 111 -> IVC-120G [ff00:a182,ff01:a182,ff02:a182,ff03:a182,ff04:a182,ff05:a182,ff06:a182,ff07:a182,ff08:a182,ff09:a182,ff0a:a182,ff0b:a182,ff0c:a182,ff0d:a182,ff0e:a182,ff0f:a182] 112 -> pcHDTV HD-2000 TV [7063:2000] -113 -> Twinhan DST + clones [11bd:0026,1822:0001,270f:fc00] +113 -> Twinhan DST + clones [11bd:0026,1822:0001,270f:fc00,1822:0026] 114 -> Winfast VC100 [107d:6607] 115 -> Teppro TEV-560/InterVision IV-560 116 -> SIMUS GVC1100 [aa6a:82b2] diff --git a/Documentation/video4linux/CARDLIST.cx88 b/Documentation/video4linux/CARDLIST.cx88 index 3b39a91b2..00d9a1f2a 100644 --- a/Documentation/video4linux/CARDLIST.cx88 +++ b/Documentation/video4linux/CARDLIST.cx88 @@ -15,7 +15,7 @@ 14 -> KWorld/VStream XPert DVB-T [17de:08a6] 15 -> DViCO FusionHDTV DVB-T1 [18ac:db00] 16 -> KWorld LTV883RF - 17 -> DViCO FusionHDTV 3 Gold-Q [18ac:d810] + 17 -> DViCO FusionHDTV 3 Gold-Q [18ac:d810,18ac:d800] 18 -> Hauppauge Nova-T DVB-T [0070:9002,0070:9001] 19 -> Conexant DVB-T reference design [14f1:0187] 20 -> Provideo PV259 [1540:2580] @@ -40,8 +40,14 @@ 39 -> KWorld DVB-S 100 [17de:08b2] 40 -> Hauppauge WinTV-HVR1100 DVB-T/Hybrid [0070:9400,0070:9402] 41 -> Hauppauge WinTV-HVR1100 DVB-T/Hybrid (Low Profile) [0070:9800,0070:9802] - 42 -> digitalnow DNTV Live! DVB-T Pro [1822:0025] + 42 -> digitalnow DNTV Live! DVB-T Pro [1822:0025,1822:0019] 43 -> KWorld/VStream XPert DVB-T with cx22702 [17de:08a1] 44 -> DViCO FusionHDTV DVB-T Dual Digital [18ac:db50,18ac:db54] 45 -> KWorld HardwareMpegTV XPert [17de:0840] 46 -> DViCO FusionHDTV DVB-T Hybrid [18ac:db40,18ac:db44] + 47 -> pcHDTV HD5500 HDTV [7063:5500] + 48 -> Kworld MCE 200 Deluxe [17de:0841] + 49 -> PixelView PlayTV P7000 [1554:4813] + 50 -> NPG Tech Real TV FM Top 10 [14f1:0842] + 51 -> WinFast DTV2000 H [107d:665e] + 52 -> Geniatech DVB-S [14f1:0084] diff --git a/Documentation/video4linux/CARDLIST.saa7134 b/Documentation/video4linux/CARDLIST.saa7134 index bca509032..9068b669f 100644 --- a/Documentation/video4linux/CARDLIST.saa7134 +++ b/Documentation/video4linux/CARDLIST.saa7134 @@ -93,3 +93,4 @@ 92 -> AVerMedia A169 B1 [1461:6360] 93 -> Medion 7134 Bridge #2 [16be:0005] 94 -> LifeView FlyDVB-T Hybrid Cardbus [5168:3306,5168:3502] + 95 -> LifeView FlyVIDEO3000 (NTSC) [5169:0138] diff --git a/Documentation/video4linux/CARDLIST.tuner b/Documentation/video4linux/CARDLIST.tuner index 1bcdac67d..44134f04b 100644 --- a/Documentation/video4linux/CARDLIST.tuner +++ b/Documentation/video4linux/CARDLIST.tuner @@ -62,7 +62,7 @@ tuner=60 - Thomson DTT 761X (ATSC/NTSC) tuner=61 - Tena TNF9533-D/IF/TNF9533-B/DF tuner=62 - Philips TEA5767HN FM Radio tuner=63 - Philips FMD1216ME MK3 Hybrid Tuner -tuner=64 - LG TDVS-H062F/TUA6034 +tuner=64 - LG TDVS-H06xF tuner=65 - Ymec TVF66T5-B/DFF tuner=66 - LG TALN series tuner=67 - Philips TD1316 Hybrid Tuner @@ -71,3 +71,4 @@ tuner=69 - Tena TNF 5335 and similar models tuner=70 - Samsung TCPN 2121P30A tuner=71 - Xceive xc3028 tuner=72 - Thomson FE6600 +tuner=73 - Samsung TCPG 6121P30A diff --git a/Documentation/video4linux/CQcam.txt b/Documentation/video4linux/CQcam.txt index 464e4cec9..ade8651e2 100644 --- a/Documentation/video4linux/CQcam.txt +++ b/Documentation/video4linux/CQcam.txt @@ -185,207 +185,10 @@ this work is documented at the video4linux2 site listed below. 9.0 --- A sample program using v4lgrabber, -This program is a simple image grabber that will copy a frame from the +v4lgrab is a simple image grabber that will copy a frame from the first video device, /dev/video0 to standard output in portable pixmap -format (.ppm) Using this like: 'v4lgrab | convert - c-qcam.jpg' -produced this picture of me at - http://mug.sys.virginia.edu/~drf5n/extras/c-qcam.jpg - --------------------- 8< ---------------- 8< ----------------------------- - -/* Simple Video4Linux image grabber. */ -/* - * Video4Linux Driver Test/Example Framegrabbing Program - * - * Compile with: - * gcc -s -Wall -Wstrict-prototypes v4lgrab.c -o v4lgrab - * Use as: - * v4lgrab >image.ppm - * - * Copyright (C) 1998-05-03, Phil Blundell - * Copied from http://www.tazenda.demon.co.uk/phil/vgrabber.c - * with minor modifications (Dave Forrest, drf5n@virginia.edu). - * - */ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#define FILE "/dev/video0" - -/* Stole this from tvset.c */ - -#define READ_VIDEO_PIXEL(buf, format, depth, r, g, b) \ -{ \ - switch (format) \ - { \ - case VIDEO_PALETTE_GREY: \ - switch (depth) \ - { \ - case 4: \ - case 6: \ - case 8: \ - (r) = (g) = (b) = (*buf++ << 8);\ - break; \ - \ - case 16: \ - (r) = (g) = (b) = \ - *((unsigned short *) buf); \ - buf += 2; \ - break; \ - } \ - break; \ - \ - \ - case VIDEO_PALETTE_RGB565: \ - { \ - unsigned short tmp = *(unsigned short *)buf; \ - (r) = tmp&0xF800; \ - (g) = (tmp<<5)&0xFC00; \ - (b) = (tmp<<11)&0xF800; \ - buf += 2; \ - } \ - break; \ - \ - case VIDEO_PALETTE_RGB555: \ - (r) = (buf[0]&0xF8)<<8; \ - (g) = ((buf[0] << 5 | buf[1] >> 3)&0xF8)<<8; \ - (b) = ((buf[1] << 2 ) & 0xF8)<<8; \ - buf += 2; \ - break; \ - \ - case VIDEO_PALETTE_RGB24: \ - (r) = buf[0] << 8; (g) = buf[1] << 8; \ - (b) = buf[2] << 8; \ - buf += 3; \ - break; \ - \ - default: \ - fprintf(stderr, \ - "Format %d not yet supported\n", \ - format); \ - } \ -} - -int get_brightness_adj(unsigned char *image, long size, int *brightness) { - long i, tot = 0; - for (i=0;i= 126 && (tot/(size*3)) <= 130); -} - -int main(int argc, char ** argv) -{ - int fd = open(FILE, O_RDONLY), f; - struct video_capability cap; - struct video_window win; - struct video_picture vpic; - - unsigned char *buffer, *src; - int bpp = 24, r, g, b; - unsigned int i, src_depth; - - if (fd < 0) { - perror(FILE); - exit(1); - } - - if (ioctl(fd, VIDIOCGCAP, &cap) < 0) { - perror("VIDIOGCAP"); - fprintf(stderr, "(" FILE " not a video4linux device?)\n"); - close(fd); - exit(1); - } - - if (ioctl(fd, VIDIOCGWIN, &win) < 0) { - perror("VIDIOCGWIN"); - close(fd); - exit(1); - } - - if (ioctl(fd, VIDIOCGPICT, &vpic) < 0) { - perror("VIDIOCGPICT"); - close(fd); - exit(1); - } - - if (cap.type & VID_TYPE_MONOCHROME) { - vpic.depth=8; - vpic.palette=VIDEO_PALETTE_GREY; /* 8bit grey */ - if(ioctl(fd, VIDIOCSPICT, &vpic) < 0) { - vpic.depth=6; - if(ioctl(fd, VIDIOCSPICT, &vpic) < 0) { - vpic.depth=4; - if(ioctl(fd, VIDIOCSPICT, &vpic) < 0) { - fprintf(stderr, "Unable to find a supported capture format.\n"); - close(fd); - exit(1); - } - } - } - } else { - vpic.depth=24; - vpic.palette=VIDEO_PALETTE_RGB24; - - if(ioctl(fd, VIDIOCSPICT, &vpic) < 0) { - vpic.palette=VIDEO_PALETTE_RGB565; - vpic.depth=16; - - if(ioctl(fd, VIDIOCSPICT, &vpic)==-1) { - vpic.palette=VIDEO_PALETTE_RGB555; - vpic.depth=15; - - if(ioctl(fd, VIDIOCSPICT, &vpic)==-1) { - fprintf(stderr, "Unable to find a supported capture format.\n"); - return -1; - } - } - } - } - - buffer = malloc(win.width * win.height * bpp); - if (!buffer) { - fprintf(stderr, "Out of memory.\n"); - exit(1); - } - - do { - int newbright; - read(fd, buffer, win.width * win.height * bpp); - f = get_brightness_adj(buffer, win.width * win.height, &newbright); - if (f) { - vpic.brightness += (newbright << 8); - if(ioctl(fd, VIDIOCSPICT, &vpic)==-1) { - perror("VIDIOSPICT"); - break; - } - } - } while (f); - - fprintf(stdout, "P6\n%d %d 255\n", win.width, win.height); - - src = buffer; - - for (i = 0; i < win.width * win.height; i++) { - READ_VIDEO_PIXEL(src, vpic.palette, src_depth, r, g, b); - fputc(r>>8, stdout); - fputc(g>>8, stdout); - fputc(b>>8, stdout); - } - - close(fd); - return 0; -} --------------------- 8< ---------------- 8< ----------------------------- +format (.ppm) To produce .jpg output, you can use it like this: +'v4lgrab | convert - c-qcam.jpg' 10.0 --- Other Information diff --git a/Documentation/video4linux/Zoran b/Documentation/video4linux/Zoran index be9f21b84..040a2c841 100644 --- a/Documentation/video4linux/Zoran +++ b/Documentation/video4linux/Zoran @@ -33,6 +33,21 @@ Inputs/outputs: Composite and S-video Norms: PAL, SECAM (720x576 @ 25 fps), NTSC (720x480 @ 29.97 fps) Card number: 7 +AverMedia 6 Eyes AVS6EYES: +* Zoran zr36067 PCI controller +* Zoran zr36060 MJPEG codec +* Samsung ks0127 TV decoder +* Conexant bt866 TV encoder +Drivers to use: videodev, i2c-core, i2c-algo-bit, + videocodec, ks0127, bt866, zr36060, zr36067 +Inputs/outputs: Six physical inputs. 1-6 are composite, + 1-2, 3-4, 5-6 doubles as S-video, + 1-3 triples as component. + One composite output. +Norms: PAL, SECAM (720x576 @ 25 fps), NTSC (720x480 @ 29.97 fps) +Card number: 8 +Not autodetected, card=8 is necessary. + Linux Media Labs LML33: * Zoran zr36067 PCI controller * Zoran zr36060 MJPEG codec @@ -192,6 +207,10 @@ Micronas vpx3220a TV decoder was introduced in 1996, is used in the DC30 and DC30+ and can handle: PAL B/G/H/I, PAL N, PAL M, NTSC M, NTSC 44, PAL 60, SECAM,NTSC Comb +Samsung ks0127 TV decoder +is used in the AVS6EYES card and +can handle: NTSC-M/N/44, PAL-M/N/B/G/H/I/D/K/L and SECAM + =========================== 1.2 What the TV encoder can do an what not @@ -221,6 +240,10 @@ ITT mse3000 TV encoder was introduced in 1991, is used in the DC10 old can generate: PAL , NTSC , SECAM +Conexant bt866 TV encoder +is used in AVS6EYES, and +can generate: NTSC/PAL, PAL­M, PAL­N + The adv717x, should be able to produce PAL N. But you find nothing PAL N specific in the registers. Seem that you have to reuse a other standard to generate PAL N, maybe it would work if you use the PAL M settings. diff --git a/Documentation/video4linux/bttv/CONTRIBUTORS b/Documentation/video4linux/bttv/CONTRIBUTORS index aef49db88..8aad6dd93 100644 --- a/Documentation/video4linux/bttv/CONTRIBUTORS +++ b/Documentation/video4linux/bttv/CONTRIBUTORS @@ -1,4 +1,4 @@ -Contributors to bttv: +Contributors to bttv: Michael Chu AverMedia fix and more flexible card recognition @@ -8,8 +8,8 @@ Alan Cox Chris Kleitsch Hardware I2C - -Gerd Knorr + +Gerd Knorr Radio card (ITT sound processor) bigfoot @@ -18,7 +18,7 @@ Ragnar Hojland Espinosa + many more (please mail me if you are missing in this list and would - like to be mentioned) + like to be mentioned) diff --git a/Documentation/video4linux/et61x251.txt b/Documentation/video4linux/et61x251.txt index 29340282a..cd584f20a 100644 --- a/Documentation/video4linux/et61x251.txt +++ b/Documentation/video4linux/et61x251.txt @@ -1,9 +1,9 @@ - ET61X[12]51 PC Camera Controllers - Driver for Linux - ================================= + ET61X[12]51 PC Camera Controllers + Driver for Linux + ================================= - - Documentation - + - Documentation - Index @@ -156,46 +156,46 @@ Name: video_nr Type: short array (min = 0, max = 64) Syntax: <-1|n[,...]> Description: Specify V4L2 minor mode number: - -1 = use next available - n = use minor number n - You can specify up to 64 cameras this way. - For example: - video_nr=-1,2,-1 would assign minor number 2 to the second - registered camera and use auto for the first one and for every - other camera. + -1 = use next available + n = use minor number n + You can specify up to 64 cameras this way. + For example: + video_nr=-1,2,-1 would assign minor number 2 to the second + registered camera and use auto for the first one and for every + other camera. Default: -1 ------------------------------------------------------------------------------- Name: force_munmap Type: bool array (min = 0, max = 64) Syntax: <0|1[,...]> Description: Force the application to unmap previously mapped buffer memory - before calling any VIDIOC_S_CROP or VIDIOC_S_FMT ioctl's. Not - all the applications support this feature. This parameter is - specific for each detected camera. - 0 = do not force memory unmapping - 1 = force memory unmapping (save memory) + before calling any VIDIOC_S_CROP or VIDIOC_S_FMT ioctl's. Not + all the applications support this feature. This parameter is + specific for each detected camera. + 0 = do not force memory unmapping + 1 = force memory unmapping (save memory) Default: 0 ------------------------------------------------------------------------------- Name: frame_timeout Type: uint array (min = 0, max = 64) Syntax: Description: Timeout for a video frame in seconds. This parameter is - specific for each detected camera. This parameter can be - changed at runtime thanks to the /sys filesystem interface. + specific for each detected camera. This parameter can be + changed at runtime thanks to the /sys filesystem interface. Default: 2 ------------------------------------------------------------------------------- Name: debug Type: ushort Syntax: Description: Debugging information level, from 0 to 3: - 0 = none (use carefully) - 1 = critical errors - 2 = significant informations - 3 = more verbose messages - Level 3 is useful for testing only, when only one device - is used at the same time. It also shows some more informations - about the hardware being detected. This module parameter can be - changed at runtime thanks to the /sys filesystem interface. + 0 = none (use carefully) + 1 = critical errors + 2 = significant informations + 3 = more verbose messages + Level 3 is useful for testing only, when only one device + is used at the same time. It also shows some more informations + about the hardware being detected. This module parameter can be + changed at runtime thanks to the /sys filesystem interface. Default: 2 ------------------------------------------------------------------------------- diff --git a/Documentation/video4linux/ibmcam.txt b/Documentation/video4linux/ibmcam.txt index 4a40a2e99..397a94eb7 100644 --- a/Documentation/video4linux/ibmcam.txt +++ b/Documentation/video4linux/ibmcam.txt @@ -21,7 +21,7 @@ Internal interface: Video For Linux (V4L) Supported controls: - by V4L: Contrast, Brightness, Color, Hue - by driver options: frame rate, lighting conditions, video format, - default picture settings, sharpness. + default picture settings, sharpness. SUPPORTED CAMERAS: @@ -191,66 +191,66 @@ init_model2_sat Integer 0..255 [0x34] init_model2_sat=65 init_model2_yb Integer 0..255 [0xa0] init_model2_yb=200 debug You don't need this option unless you are a developer. - If you are a developer then you will see in the code - what values do what. 0=off. + If you are a developer then you will see in the code + what values do what. 0=off. flags This is a bit mask, and you can combine any number of - bits to produce what you want. Usually you don't want - any of extra features this option provides: - - FLAGS_RETRY_VIDIOCSYNC 1 This bit allows to retry failed - VIDIOCSYNC ioctls without failing. - Will work with xawtv, will not - with xrealproducer. Default is - not set. - FLAGS_MONOCHROME 2 Activates monochrome (b/w) mode. - FLAGS_DISPLAY_HINTS 4 Shows colored pixels which have - magic meaning to developers. - FLAGS_OVERLAY_STATS 8 Shows tiny numbers on screen, - useful only for debugging. - FLAGS_FORCE_TESTPATTERN 16 Shows blue screen with numbers. - FLAGS_SEPARATE_FRAMES 32 Shows each frame separately, as - it was received from the camera. - Default (not set) is to mix the - preceding frame in to compensate - for occasional loss of Isoc data - on high frame rates. - FLAGS_CLEAN_FRAMES 64 Forces "cleanup" of each frame - prior to use; relevant only if - FLAGS_SEPARATE_FRAMES is set. - Default is not to clean frames, - this is a little faster but may - produce flicker if frame rate is - too high and Isoc data gets lost. - FLAGS_NO_DECODING 128 This flag turns the video stream - decoder off, and dumps the raw - Isoc data from the camera into - the reading process. Useful to - developers, but not to users. + bits to produce what you want. Usually you don't want + any of extra features this option provides: + + FLAGS_RETRY_VIDIOCSYNC 1 This bit allows to retry failed + VIDIOCSYNC ioctls without failing. + Will work with xawtv, will not + with xrealproducer. Default is + not set. + FLAGS_MONOCHROME 2 Activates monochrome (b/w) mode. + FLAGS_DISPLAY_HINTS 4 Shows colored pixels which have + magic meaning to developers. + FLAGS_OVERLAY_STATS 8 Shows tiny numbers on screen, + useful only for debugging. + FLAGS_FORCE_TESTPATTERN 16 Shows blue screen with numbers. + FLAGS_SEPARATE_FRAMES 32 Shows each frame separately, as + it was received from the camera. + Default (not set) is to mix the + preceding frame in to compensate + for occasional loss of Isoc data + on high frame rates. + FLAGS_CLEAN_FRAMES 64 Forces "cleanup" of each frame + prior to use; relevant only if + FLAGS_SEPARATE_FRAMES is set. + Default is not to clean frames, + this is a little faster but may + produce flicker if frame rate is + too high and Isoc data gets lost. + FLAGS_NO_DECODING 128 This flag turns the video stream + decoder off, and dumps the raw + Isoc data from the camera into + the reading process. Useful to + developers, but not to users. framerate This setting controls frame rate of the camera. This is - an approximate setting (in terms of "worst" ... "best") - because camera changes frame rate depending on amount - of light available. Setting 0 is slowest, 6 is fastest. - Beware - fast settings are very demanding and may not - work well with all video sizes. Be conservative. + an approximate setting (in terms of "worst" ... "best") + because camera changes frame rate depending on amount + of light available. Setting 0 is slowest, 6 is fastest. + Beware - fast settings are very demanding and may not + work well with all video sizes. Be conservative. hue_correction This highly optional setting allows to adjust the - hue of the image in a way slightly different from - what usual "hue" control does. Both controls affect - YUV colorspace: regular "hue" control adjusts only - U component, and this "hue_correction" option similarly - adjusts only V component. However usually it is enough - to tweak only U or V to compensate for colored light or - color temperature; this option simply allows more - complicated correction when and if it is necessary. + hue of the image in a way slightly different from + what usual "hue" control does. Both controls affect + YUV colorspace: regular "hue" control adjusts only + U component, and this "hue_correction" option similarly + adjusts only V component. However usually it is enough + to tweak only U or V to compensate for colored light or + color temperature; this option simply allows more + complicated correction when and if it is necessary. init_brightness These settings specify _initial_ values which will be init_contrast used to set up the camera. If your V4L application has init_color its own controls to adjust the picture then these init_hue controls will be used too. These options allow you to - preconfigure the camera when it gets connected, before - any V4L application connects to it. Good for webcams. + preconfigure the camera when it gets connected, before + any V4L application connects to it. Good for webcams. init_model2_rg These initial settings alter color balance of the init_model2_rg2 camera on hardware level. All four settings may be used @@ -258,47 +258,47 @@ init_model2_sat to tune the camera to specific lighting conditions. These init_model2_yb settings only apply to Model 2 cameras. lighting This option selects one of three hardware-defined - photosensitivity settings of the camera. 0=bright light, - 1=Medium (default), 2=Low light. This setting affects - frame rate: the dimmer the lighting the lower the frame - rate (because longer exposition time is needed). The - Model 2 cameras allow values more than 2 for this option, - thus enabling extremely high sensitivity at cost of frame - rate, color saturation and imaging sensor noise. + photosensitivity settings of the camera. 0=bright light, + 1=Medium (default), 2=Low light. This setting affects + frame rate: the dimmer the lighting the lower the frame + rate (because longer exposition time is needed). The + Model 2 cameras allow values more than 2 for this option, + thus enabling extremely high sensitivity at cost of frame + rate, color saturation and imaging sensor noise. sharpness This option controls smoothing (noise reduction) - made by camera. Setting 0 is most smooth, setting 6 - is most sharp. Be aware that CMOS sensor used in the - camera is pretty noisy, so if you choose 6 you will - be greeted with "snowy" image. Default is 4. Model 2 - cameras do not support this feature. + made by camera. Setting 0 is most smooth, setting 6 + is most sharp. Be aware that CMOS sensor used in the + camera is pretty noisy, so if you choose 6 you will + be greeted with "snowy" image. Default is 4. Model 2 + cameras do not support this feature. size This setting chooses one of several image sizes that are - supported by this driver. Cameras may support more, but - it's difficult to reverse-engineer all formats. - Following video sizes are supported: - - size=0 128x96 (Model 1 only) - size=1 160x120 - size=2 176x144 - size=3 320x240 (Model 2 only) - size=4 352x240 (Model 2 only) - size=5 352x288 - size=6 640x480 (Model 3 only) - - The 352x288 is the native size of the Model 1 sensor - array, so it's the best resolution the camera can - yield. The best resolution of Model 2 is 176x144, and - larger images are produced by stretching the bitmap. - Model 3 has sensor with 640x480 grid, and it works too, - but the frame rate will be exceptionally low (1-2 FPS); - it may be still OK for some applications, like security. - Choose the image size you need. The smaller image can - support faster frame rate. Default is 352x288. + supported by this driver. Cameras may support more, but + it's difficult to reverse-engineer all formats. + Following video sizes are supported: + + size=0 128x96 (Model 1 only) + size=1 160x120 + size=2 176x144 + size=3 320x240 (Model 2 only) + size=4 352x240 (Model 2 only) + size=5 352x288 + size=6 640x480 (Model 3 only) + + The 352x288 is the native size of the Model 1 sensor + array, so it's the best resolution the camera can + yield. The best resolution of Model 2 is 176x144, and + larger images are produced by stretching the bitmap. + Model 3 has sensor with 640x480 grid, and it works too, + but the frame rate will be exceptionally low (1-2 FPS); + it may be still OK for some applications, like security. + Choose the image size you need. The smaller image can + support faster frame rate. Default is 352x288. For more information and the Troubleshooting FAQ visit this URL: - http://www.linux-usb.org/ibmcam/ + http://www.linux-usb.org/ibmcam/ WHAT NEEDS TO BE DONE: diff --git a/Documentation/video4linux/ov511.txt b/Documentation/video4linux/ov511.txt index 142741e3c..79af610d4 100644 --- a/Documentation/video4linux/ov511.txt +++ b/Documentation/video4linux/ov511.txt @@ -81,7 +81,7 @@ MODULE PARAMETERS: TYPE: integer (Boolean) DEFAULT: 1 DESC: Brightness is normally under automatic control and can't be set - manually by the video app. Set to 0 for manual control. + manually by the video app. Set to 0 for manual control. NAME: autogain TYPE: integer (Boolean) @@ -97,13 +97,13 @@ MODULE PARAMETERS: TYPE: integer (0-6) DEFAULT: 3 DESC: Sets the threshold for printing debug messages. The higher the value, - the more is printed. The levels are cumulative, and are as follows: - 0=no debug messages - 1=init/detection/unload and other significant messages - 2=some warning messages - 3=config/control function calls - 4=most function calls and data parsing messages - 5=highly repetitive mesgs + the more is printed. The levels are cumulative, and are as follows: + 0=no debug messages + 1=init/detection/unload and other significant messages + 2=some warning messages + 3=config/control function calls + 4=most function calls and data parsing messages + 5=highly repetitive mesgs NAME: snapshot TYPE: integer (Boolean) @@ -116,24 +116,24 @@ MODULE PARAMETERS: TYPE: integer (1-4 for OV511, 1-31 for OV511+) DEFAULT: 1 DESC: Number of cameras allowed to stream simultaneously on a single bus. - Values higher than 1 reduce the data rate of each camera, allowing two - or more to be used at once. If you have a complicated setup involving - both OV511 and OV511+ cameras, trial-and-error may be necessary for - finding the optimum setting. + Values higher than 1 reduce the data rate of each camera, allowing two + or more to be used at once. If you have a complicated setup involving + both OV511 and OV511+ cameras, trial-and-error may be necessary for + finding the optimum setting. NAME: compress TYPE: integer (Boolean) DEFAULT: 0 DESC: Set this to 1 to turn on the camera's compression engine. This can - potentially increase the frame rate at the expense of quality, if you - have a fast CPU. You must load the proper compression module for your - camera before starting your application (ov511_decomp or ov518_decomp). + potentially increase the frame rate at the expense of quality, if you + have a fast CPU. You must load the proper compression module for your + camera before starting your application (ov511_decomp or ov518_decomp). NAME: testpat TYPE: integer (Boolean) DEFAULT: 0 DESC: This configures the camera's sensor to transmit a colored test-pattern - instead of an image. This does not work correctly yet. + instead of an image. This does not work correctly yet. NAME: dumppix TYPE: integer (0-2) diff --git a/Documentation/video4linux/sn9c102.txt b/Documentation/video4linux/sn9c102.txt index 142920bc0..1d20895b4 100644 --- a/Documentation/video4linux/sn9c102.txt +++ b/Documentation/video4linux/sn9c102.txt @@ -1,9 +1,9 @@ - SN9C10x PC Camera Controllers - Driver for Linux - ============================= + SN9C10x PC Camera Controllers + Driver for Linux + ============================= - - Documentation - + - Documentation - Index @@ -176,46 +176,46 @@ Name: video_nr Type: short array (min = 0, max = 64) Syntax: <-1|n[,...]> Description: Specify V4L2 minor mode number: - -1 = use next available - n = use minor number n - You can specify up to 64 cameras this way. - For example: - video_nr=-1,2,-1 would assign minor number 2 to the second - recognized camera and use auto for the first one and for every - other camera. + -1 = use next available + n = use minor number n + You can specify up to 64 cameras this way. + For example: + video_nr=-1,2,-1 would assign minor number 2 to the second + recognized camera and use auto for the first one and for every + other camera. Default: -1 ------------------------------------------------------------------------------- Name: force_munmap Type: bool array (min = 0, max = 64) Syntax: <0|1[,...]> Description: Force the application to unmap previously mapped buffer memory - before calling any VIDIOC_S_CROP or VIDIOC_S_FMT ioctl's. Not - all the applications support this feature. This parameter is - specific for each detected camera. - 0 = do not force memory unmapping - 1 = force memory unmapping (save memory) + before calling any VIDIOC_S_CROP or VIDIOC_S_FMT ioctl's. Not + all the applications support this feature. This parameter is + specific for each detected camera. + 0 = do not force memory unmapping + 1 = force memory unmapping (save memory) Default: 0 ------------------------------------------------------------------------------- Name: frame_timeout Type: uint array (min = 0, max = 64) Syntax: Description: Timeout for a video frame in seconds. This parameter is - specific for each detected camera. This parameter can be - changed at runtime thanks to the /sys filesystem interface. + specific for each detected camera. This parameter can be + changed at runtime thanks to the /sys filesystem interface. Default: 2 ------------------------------------------------------------------------------- Name: debug Type: ushort Syntax: Description: Debugging information level, from 0 to 3: - 0 = none (use carefully) - 1 = critical errors - 2 = significant informations - 3 = more verbose messages - Level 3 is useful for testing only, when only one device - is used. It also shows some more informations about the - hardware being detected. This parameter can be changed at - runtime thanks to the /sys filesystem interface. + 0 = none (use carefully) + 1 = critical errors + 2 = significant informations + 3 = more verbose messages + Level 3 is useful for testing only, when only one device + is used. It also shows some more informations about the + hardware being detected. This parameter can be changed at + runtime thanks to the /sys filesystem interface. Default: 2 ------------------------------------------------------------------------------- @@ -280,24 +280,24 @@ Byte # Value Description 0x04 0xC4 Frame synchronisation pattern. 0x05 0x96 Frame synchronisation pattern. 0x06 0xXX Unknown meaning. The exact value depends on the chip; - possible values are 0x00, 0x01 and 0x20. + possible values are 0x00, 0x01 and 0x20. 0x07 0xXX Variable value, whose bits are ff00uzzc, where ff is a - frame counter, u is unknown, zz is a size indicator - (00 = VGA, 01 = SIF, 10 = QSIF) and c stands for - "compression enabled" (1 = yes, 0 = no). + frame counter, u is unknown, zz is a size indicator + (00 = VGA, 01 = SIF, 10 = QSIF) and c stands for + "compression enabled" (1 = yes, 0 = no). 0x08 0xXX Brightness sum inside Auto-Exposure area (low-byte). 0x09 0xXX Brightness sum inside Auto-Exposure area (high-byte). - For a pure white image, this number will be equal to 500 - times the area of the specified AE area. For images - that are not pure white, the value scales down according - to relative whiteness. + For a pure white image, this number will be equal to 500 + times the area of the specified AE area. For images + that are not pure white, the value scales down according + to relative whiteness. 0x0A 0xXX Brightness sum outside Auto-Exposure area (low-byte). 0x0B 0xXX Brightness sum outside Auto-Exposure area (high-byte). - For a pure white image, this number will be equal to 125 - times the area outside of the specified AE area. For - images that are not pure white, the value scales down - according to relative whiteness. - according to relative whiteness. + For a pure white image, this number will be equal to 125 + times the area outside of the specified AE area. For + images that are not pure white, the value scales down + according to relative whiteness. + according to relative whiteness. The following bytes are used by the SN9C103 bridge only: diff --git a/Documentation/video4linux/w9968cf.txt b/Documentation/video4linux/w9968cf.txt index 3b704f2aa..0d53ce774 100644 --- a/Documentation/video4linux/w9968cf.txt +++ b/Documentation/video4linux/w9968cf.txt @@ -1,9 +1,9 @@ - W996[87]CF JPEG USB Dual Mode Camera Chip - Driver for Linux 2.6 (basic version) - ========================================= + W996[87]CF JPEG USB Dual Mode Camera Chip + Driver for Linux 2.6 (basic version) + ========================================= - - Documentation - + - Documentation - Index @@ -188,57 +188,57 @@ Name: ovmod_load Type: bool Syntax: <0|1> Description: Automatic 'ovcamchip' module loading: 0 disabled, 1 enabled. - If enabled, 'insmod' searches for the required 'ovcamchip' - module in the system, according to its configuration, and - loads that module automatically. This action is performed as - once soon as the 'w9968cf' module is loaded into memory. + If enabled, 'insmod' searches for the required 'ovcamchip' + module in the system, according to its configuration, and + loads that module automatically. This action is performed as + once soon as the 'w9968cf' module is loaded into memory. Default: 1 Note: The kernel must be compiled with the CONFIG_KMOD option - enabled for the 'ovcamchip' module to be loaded and for - this parameter to be present. + enabled for the 'ovcamchip' module to be loaded and for + this parameter to be present. ------------------------------------------------------------------------------- Name: simcams Type: int Syntax: Description: Number of cameras allowed to stream simultaneously. - n may vary from 0 to 32. + n may vary from 0 to 32. Default: 32 ------------------------------------------------------------------------------- Name: video_nr Type: int array (min = 0, max = 32) Syntax: <-1|n[,...]> Description: Specify V4L minor mode number. - -1 = use next available - n = use minor number n - You can specify up to 32 cameras this way. - For example: - video_nr=-1,2,-1 would assign minor number 2 to the second - recognized camera and use auto for the first one and for every - other camera. + -1 = use next available + n = use minor number n + You can specify up to 32 cameras this way. + For example: + video_nr=-1,2,-1 would assign minor number 2 to the second + recognized camera and use auto for the first one and for every + other camera. Default: -1 ------------------------------------------------------------------------------- Name: packet_size Type: int array (min = 0, max = 32) Syntax: Description: Specify the maximum data payload size in bytes for alternate - settings, for each device. n is scaled between 63 and 1023. + settings, for each device. n is scaled between 63 and 1023. Default: 1023 ------------------------------------------------------------------------------- Name: max_buffers Type: int array (min = 0, max = 32) Syntax: Description: For advanced users. - Specify the maximum number of video frame buffers to allocate - for each device, from 2 to 32. + Specify the maximum number of video frame buffers to allocate + for each device, from 2 to 32. Default: 2 ------------------------------------------------------------------------------- Name: double_buffer Type: bool array (min = 0, max = 32) Syntax: <0|1[,...]> Description: Hardware double buffering: 0 disabled, 1 enabled. - It should be enabled if you want smooth video output: if you - obtain out of sync. video, disable it, or try to - decrease the 'clockdiv' module parameter value. + It should be enabled if you want smooth video output: if you + obtain out of sync. video, disable it, or try to + decrease the 'clockdiv' module parameter value. Default: 1 for every device. ------------------------------------------------------------------------------- Name: clamping @@ -251,9 +251,9 @@ Name: filter_type Type: int array (min = 0, max = 32) Syntax: <0|1|2[,...]> Description: Video filter type. - 0 none, 1 (1-2-1) 3-tap filter, 2 (2-3-6-3-2) 5-tap filter. - The filter is used to reduce noise and aliasing artifacts - produced by the CCD or CMOS image sensor. + 0 none, 1 (1-2-1) 3-tap filter, 2 (2-3-6-3-2) 5-tap filter. + The filter is used to reduce noise and aliasing artifacts + produced by the CCD or CMOS image sensor. Default: 0 for every device. ------------------------------------------------------------------------------- Name: largeview @@ -266,9 +266,9 @@ Name: upscaling Type: bool array (min = 0, max = 32) Syntax: <0|1[,...]> Description: Software scaling (for non-compressed video only): - 0 disabled, 1 enabled. - Disable it if you have a slow CPU or you don't have enough - memory. + 0 disabled, 1 enabled. + Disable it if you have a slow CPU or you don't have enough + memory. Default: 0 for every device. Note: If 'w9968cf-vpp' is not present, this parameter is set to 0. ------------------------------------------------------------------------------- @@ -276,36 +276,36 @@ Name: decompression Type: int array (min = 0, max = 32) Syntax: <0|1|2[,...]> Description: Software video decompression: - 0 = disables decompression - (doesn't allow formats needing decompression). - 1 = forces decompression - (allows formats needing decompression only). - 2 = allows any permitted formats. - Formats supporting (de)compressed video are YUV422P and - YUV420P/YUV420 in any resolutions where width and height are - multiples of 16. + 0 = disables decompression + (doesn't allow formats needing decompression). + 1 = forces decompression + (allows formats needing decompression only). + 2 = allows any permitted formats. + Formats supporting (de)compressed video are YUV422P and + YUV420P/YUV420 in any resolutions where width and height are + multiples of 16. Default: 2 for every device. Note: If 'w9968cf-vpp' is not present, forcing decompression is not - allowed; in this case this parameter is set to 2. + allowed; in this case this parameter is set to 2. ------------------------------------------------------------------------------- Name: force_palette Type: int array (min = 0, max = 32) Syntax: <0|9|10|13|15|8|7|1|6|3|4|5[,...]> Description: Force picture palette. - In order: - 0 = Off - allows any of the following formats: - 9 = UYVY 16 bpp - Original video, compression disabled - 10 = YUV420 12 bpp - Original video, compression enabled - 13 = YUV422P 16 bpp - Original video, compression enabled - 15 = YUV420P 12 bpp - Original video, compression enabled - 8 = YUVY 16 bpp - Software conversion from UYVY - 7 = YUV422 16 bpp - Software conversion from UYVY - 1 = GREY 8 bpp - Software conversion from UYVY - 6 = RGB555 16 bpp - Software conversion from UYVY - 3 = RGB565 16 bpp - Software conversion from UYVY - 4 = RGB24 24 bpp - Software conversion from UYVY - 5 = RGB32 32 bpp - Software conversion from UYVY - When not 0, this parameter will override 'decompression'. + In order: + 0 = Off - allows any of the following formats: + 9 = UYVY 16 bpp - Original video, compression disabled + 10 = YUV420 12 bpp - Original video, compression enabled + 13 = YUV422P 16 bpp - Original video, compression enabled + 15 = YUV420P 12 bpp - Original video, compression enabled + 8 = YUVY 16 bpp - Software conversion from UYVY + 7 = YUV422 16 bpp - Software conversion from UYVY + 1 = GREY 8 bpp - Software conversion from UYVY + 6 = RGB555 16 bpp - Software conversion from UYVY + 3 = RGB565 16 bpp - Software conversion from UYVY + 4 = RGB24 24 bpp - Software conversion from UYVY + 5 = RGB32 32 bpp - Software conversion from UYVY + When not 0, this parameter will override 'decompression'. Default: 0 for every device. Initial palette is 9 (UYVY). Note: If 'w9968cf-vpp' is not present, this parameter is set to 9. ------------------------------------------------------------------------------- @@ -313,77 +313,77 @@ Name: force_rgb Type: bool array (min = 0, max = 32) Syntax: <0|1[,...]> Description: Read RGB video data instead of BGR: - 1 = use RGB component ordering. - 0 = use BGR component ordering. - This parameter has effect when using RGBX palettes only. + 1 = use RGB component ordering. + 0 = use BGR component ordering. + This parameter has effect when using RGBX palettes only. Default: 0 for every device. ------------------------------------------------------------------------------- Name: autobright Type: bool array (min = 0, max = 32) Syntax: <0|1[,...]> Description: Image sensor automatically changes brightness: - 0 = no, 1 = yes + 0 = no, 1 = yes Default: 0 for every device. ------------------------------------------------------------------------------- Name: autoexp Type: bool array (min = 0, max = 32) Syntax: <0|1[,...]> Description: Image sensor automatically changes exposure: - 0 = no, 1 = yes + 0 = no, 1 = yes Default: 1 for every device. ------------------------------------------------------------------------------- Name: lightfreq Type: int array (min = 0, max = 32) Syntax: <50|60[,...]> Description: Light frequency in Hz: - 50 for European and Asian lighting, 60 for American lighting. + 50 for European and Asian lighting, 60 for American lighting. Default: 50 for every device. ------------------------------------------------------------------------------- Name: bandingfilter Type: bool array (min = 0, max = 32) Syntax: <0|1[,...]> Description: Banding filter to reduce effects of fluorescent - lighting: - 0 disabled, 1 enabled. - This filter tries to reduce the pattern of horizontal - light/dark bands caused by some (usually fluorescent) lighting. + lighting: + 0 disabled, 1 enabled. + This filter tries to reduce the pattern of horizontal + light/dark bands caused by some (usually fluorescent) lighting. Default: 0 for every device. ------------------------------------------------------------------------------- Name: clockdiv Type: int array (min = 0, max = 32) Syntax: <-1|n[,...]> Description: Force pixel clock divisor to a specific value (for experts): - n may vary from 0 to 127. - -1 for automatic value. - See also the 'double_buffer' module parameter. + n may vary from 0 to 127. + -1 for automatic value. + See also the 'double_buffer' module parameter. Default: -1 for every device. ------------------------------------------------------------------------------- Name: backlight Type: bool array (min = 0, max = 32) Syntax: <0|1[,...]> Description: Objects are lit from behind: - 0 = no, 1 = yes + 0 = no, 1 = yes Default: 0 for every device. ------------------------------------------------------------------------------- Name: mirror Type: bool array (min = 0, max = 32) Syntax: <0|1[,...]> Description: Reverse image horizontally: - 0 = no, 1 = yes + 0 = no, 1 = yes Default: 0 for every device. ------------------------------------------------------------------------------- Name: monochrome Type: bool array (min = 0, max = 32) Syntax: <0|1[,...]> Description: The image sensor is monochrome: - 0 = no, 1 = yes + 0 = no, 1 = yes Default: 0 for every device. ------------------------------------------------------------------------------- Name: brightness Type: long array (min = 0, max = 32) Syntax: Description: Set picture brightness (0-65535). - This parameter has no effect if 'autobright' is enabled. + This parameter has no effect if 'autobright' is enabled. Default: 31000 for every device. ------------------------------------------------------------------------------- Name: hue @@ -414,23 +414,23 @@ Name: debug Type: int Syntax: Description: Debugging information level, from 0 to 6: - 0 = none (use carefully) - 1 = critical errors - 2 = significant informations - 3 = configuration or general messages - 4 = warnings - 5 = called functions - 6 = function internals - Level 5 and 6 are useful for testing only, when only one - device is used. + 0 = none (use carefully) + 1 = critical errors + 2 = significant informations + 3 = configuration or general messages + 4 = warnings + 5 = called functions + 6 = function internals + Level 5 and 6 are useful for testing only, when only one + device is used. Default: 2 ------------------------------------------------------------------------------- Name: specific_debug Type: bool Syntax: <0|1> Description: Enable or disable specific debugging messages: - 0 = print messages concerning every level <= 'debug' level. - 1 = print messages concerning the level indicated by 'debug'. + 0 = print messages concerning every level <= 'debug' level. + 1 = print messages concerning the level indicated by 'debug'. Default: 0 ------------------------------------------------------------------------------- diff --git a/Documentation/video4linux/zc0301.txt b/Documentation/video4linux/zc0301.txt index f55262c67..f406f5e80 100644 --- a/Documentation/video4linux/zc0301.txt +++ b/Documentation/video4linux/zc0301.txt @@ -1,9 +1,9 @@ - ZC0301 Image Processor and Control Chip - Driver for Linux - ======================================= + ZC0301 and ZC0301P Image Processor and Control Chip + Driver for Linux + =================================================== - - Documentation - + - Documentation - Index @@ -51,13 +51,13 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 4. Overview and features ======================== -This driver supports the video interface of the devices mounting the ZC0301 -Image Processor and Control Chip. +This driver supports the video interface of the devices mounting the ZC0301 or +ZC0301P Image Processors and Control Chips. The driver relies on the Video4Linux2 and USB core modules. It has been designed to run properly on SMP systems as well. -The latest version of the ZC0301 driver can be found at the following URL: +The latest version of the ZC0301[P] driver can be found at the following URL: http://www.linux-projects.org/ Some of the features of the driver are: @@ -117,7 +117,7 @@ supported by the USB Audio driver thanks to the ALSA API: And finally: - # USB Multimedia devices + # V4L USB devices # CONFIG_USB_ZC0301=m @@ -146,46 +146,46 @@ Name: video_nr Type: short array (min = 0, max = 64) Syntax: <-1|n[,...]> Description: Specify V4L2 minor mode number: - -1 = use next available - n = use minor number n - You can specify up to 64 cameras this way. - For example: - video_nr=-1,2,-1 would assign minor number 2 to the second - registered camera and use auto for the first one and for every - other camera. + -1 = use next available + n = use minor number n + You can specify up to 64 cameras this way. + For example: + video_nr=-1,2,-1 would assign minor number 2 to the second + registered camera and use auto for the first one and for every + other camera. Default: -1 ------------------------------------------------------------------------------- Name: force_munmap Type: bool array (min = 0, max = 64) Syntax: <0|1[,...]> Description: Force the application to unmap previously mapped buffer memory - before calling any VIDIOC_S_CROP or VIDIOC_S_FMT ioctl's. Not - all the applications support this feature. This parameter is - specific for each detected camera. - 0 = do not force memory unmapping - 1 = force memory unmapping (save memory) + before calling any VIDIOC_S_CROP or VIDIOC_S_FMT ioctl's. Not + all the applications support this feature. This parameter is + specific for each detected camera. + 0 = do not force memory unmapping + 1 = force memory unmapping (save memory) Default: 0 ------------------------------------------------------------------------------- Name: frame_timeout Type: uint array (min = 0, max = 64) Syntax: Description: Timeout for a video frame in seconds. This parameter is - specific for each detected camera. This parameter can be - changed at runtime thanks to the /sys filesystem interface. + specific for each detected camera. This parameter can be + changed at runtime thanks to the /sys filesystem interface. Default: 2 ------------------------------------------------------------------------------- Name: debug Type: ushort Syntax: Description: Debugging information level, from 0 to 3: - 0 = none (use carefully) - 1 = critical errors - 2 = significant informations - 3 = more verbose messages - Level 3 is useful for testing only, when only one device - is used at the same time. It also shows some more informations - about the hardware being detected. This module parameter can be - changed at runtime thanks to the /sys filesystem interface. + 0 = none (use carefully) + 1 = critical errors + 2 = significant informations + 3 = more verbose messages + Level 3 is useful for testing only, when only one device + is used at the same time. It also shows some more informations + about the hardware being detected. This module parameter can be + changed at runtime thanks to the /sys filesystem interface. Default: 2 ------------------------------------------------------------------------------- @@ -204,11 +204,25 @@ Vendor ID Product ID 0x041e 0x4017 0x041e 0x401c 0x041e 0x401e +0x041e 0x401f +0x041e 0x4022 0x041e 0x4034 0x041e 0x4035 +0x041e 0x4036 +0x041e 0x403a +0x0458 0x7007 +0x0458 0x700C +0x0458 0x700f +0x046d 0x08ae +0x055f 0xd003 +0x055f 0xd004 0x046d 0x08ae 0x0ac8 0x0301 +0x0ac8 0x301b +0x0ac8 0x303b +0x10fd 0x0128 0x10fd 0x8050 +0x10fd 0x804e The list above does not imply that all those devices work with this driver: up until now only the ones that mount the following image sensors are supported; @@ -217,6 +231,7 @@ kernel messages will always tell you whether this is the case: Model Manufacturer ----- ------------ PAS202BCB PixArt Imaging, Inc. +PB-0330 Photobit Corporation 9. Notes for V4L2 application developers @@ -250,5 +265,6 @@ the fingerprint is: '88E8 F32F 7244 68BA 3958 5D40 99DA 5D2A FCE6 35A4'. been taken from the documentation of the ZC030x Video4Linux1 driver written by Andrew Birkett ; - The initialization values of the ZC0301 controller connected to the PAS202BCB - image sensor have been taken from the SPCA5XX driver maintained by - Michel Xhaard . + and PB-0330 image sensors have been taken from the SPCA5XX driver maintained + by Michel Xhaard ; +- Stanislav Lechev donated one camera. diff --git a/Documentation/vm/page_migration b/Documentation/vm/page_migration index 0dd4ef30c..99f89aa10 100644 --- a/Documentation/vm/page_migration +++ b/Documentation/vm/page_migration @@ -26,8 +26,13 @@ a process are located. See also the numa_maps manpage in the numactl package. Manual migration is useful if for example the scheduler has relocated a process to a processor on a distant node. A batch scheduler or an administrator may detect the situation and move the pages of the process -nearer to the new processor. At some point in the future we may have -some mechanism in the scheduler that will automatically move the pages. +nearer to the new processor. The kernel itself does only provide +manual page migration support. Automatic page migration may be implemented +through user space processes that move pages. A special function call +"move_pages" allows the moving of individual pages within a process. +A NUMA profiler may f.e. obtain a log showing frequent off node +accesses and may use the result to move pages to more advantageous +locations. Larger installations usually partition the system using cpusets into sections of nodes. Paul Jackson has equipped cpusets with the ability to @@ -62,22 +67,14 @@ A. In kernel use of migrate_pages() It also prevents the swapper or other scans to encounter the page. -2. Generate a list of newly allocates page. These pages will contain the - contents of the pages from the first list after page migration is - complete. +2. We need to have a function of type new_page_t that can be + passed to migrate_pages(). This function should figure out + how to allocate the correct new page given the old page. 3. The migrate_pages() function is called which attempts - to do the migration. It returns the moved pages in the - list specified as the third parameter and the failed - migrations in the fourth parameter. The first parameter - will contain the pages that could still be retried. - -4. The leftover pages of various types are returned - to the LRU using putback_to_lru_pages() or otherwise - disposed of. The pages will still have the refcount as - increased by isolate_lru_pages() if putback_to_lru_pages() is not - used! The kernel may want to handle the various cases of failures in - different ways. + to do the migration. It will call the function to allocate + the new page for each page that is considered for + moving. B. How migrate_pages() works ---------------------------- @@ -93,83 +90,58 @@ Steps: 2. Insure that writeback is complete. -3. Make sure that the page has assigned swap cache entry if - it is an anonyous page. The swap cache reference is necessary - to preserve the information contain in the page table maps while - page migration occurs. - -4. Prep the new page that we want to move to. It is locked +3. Prep the new page that we want to move to. It is locked and set to not being uptodate so that all accesses to the new page immediately lock while the move is in progress. -5. All the page table references to the page are either dropped (file - backed pages) or converted to swap references (anonymous pages). - This should decrease the reference count. +4. The new page is prepped with some settings from the old page so that + accesses to the new page will discover a page with the correct settings. + +5. All the page table references to the page are converted + to migration entries or dropped (nonlinear vmas). + This decrease the mapcount of a page. If the resulting + mapcount is not zero then we do not migrate the page. + All user space processes that attempt to access the page + will now wait on the page lock. 6. The radix tree lock is taken. This will cause all processes trying - to reestablish a pte to block on the radix tree spinlock. + to access the page via the mapping to block on the radix tree spinlock. 7. The refcount of the page is examined and we back out if references remain otherwise we know that we are the only one referencing this page. 8. The radix tree is checked and if it does not contain the pointer to this - page then we back out because someone else modified the mapping first. - -9. The mapping is checked. If the mapping is gone then a truncate action may - be in progress and we back out. - -10. The new page is prepped with some settings from the old page so that - accesses to the new page will be discovered to have the correct settings. + page then we back out because someone else modified the radix tree. -11. The radix tree is changed to point to the new page. +9. The radix tree is changed to point to the new page. -12. The reference count of the old page is dropped because the radix tree - reference is gone. +10. The reference count of the old page is dropped because the radix tree + reference is gone. A reference to the new page is established because + the new page is referenced to by the radix tree. -13. The radix tree lock is dropped. With that lookups become possible again - and other processes will move from spinning on the tree lock to sleeping on - the locked new page. +11. The radix tree lock is dropped. With that lookups in the mapping + become possible again. Processes will move from spinning on the tree_lock + to sleeping on the locked new page. -14. The page contents are copied to the new page. +12. The page contents are copied to the new page. -15. The remaining page flags are copied to the new page. +13. The remaining page flags are copied to the new page. -16. The old page flags are cleared to indicate that the page does - not use any information anymore. +14. The old page flags are cleared to indicate that the page does + not provide any information anymore. -17. Queued up writeback on the new page is triggered. +15. Queued up writeback on the new page is triggered. -18. If swap pte's were generated for the page then replace them with real - ptes. This will reenable access for processes not blocked by the page lock. +16. If migration entries were page then replace them with real ptes. Doing + so will enable access for user space processes not already waiting for + the page lock. 19. The page locks are dropped from the old and new page. - Processes waiting on the page lock can continue. + Processes waiting on the page lock will redo their page faults + and will reach the new page. 20. The new page is moved to the LRU and can be scanned by the swapper etc again. -TODO list ---------- - -- Page migration requires the use of swap handles to preserve the - information of the anonymous page table entries. This means that swap - space is reserved but never used. The maximum number of swap handles used - is determined by CHUNK_SIZE (see mm/mempolicy.c) per ongoing migration. - Reservation of pages could be avoided by having a special type of swap - handle that does not require swap space and that would only track the page - references. Something like that was proposed by Marcelo Tosatti in the - past (search for migration cache on lkml or linux-mm@kvack.org). - -- Page migration unmaps ptes for file backed pages and requires page - faults to reestablish these ptes. This could be optimized by somehow - recording the references before migration and then reestablish them later. - However, there are several locking challenges that have to be overcome - before this is possible. - -- Page migration generates read ptes for anonymous pages. Dirty page - faults are required to make the pages writable again. It may be possible - to generate a pte marked dirty if it is known that the page is dirty and - that this process has the only reference to that page. - -Christoph Lameter, March 8, 2006. +Christoph Lameter, May 8, 2006. diff --git a/Documentation/w1/w1.generic b/Documentation/w1/w1.generic index eace3046a..4c6509dd4 100644 --- a/Documentation/w1/w1.generic +++ b/Documentation/w1/w1.generic @@ -1,19 +1,104 @@ -Any w1 device must be connected to w1 bus master device - for example -ds9490 usb device or w1-over-GPIO or RS232 converter. -Driver for w1 bus master must provide several functions(you can find -them in struct w1_bus_master definition in w1.h) which then will be -called by w1 core to send various commands over w1 bus(by default it is -reset and search commands). When some device is found on the bus, w1 core -checks if driver for it's family is loaded. -If driver is loaded w1 core creates new w1_slave object and registers it -in the system(creates some generic sysfs files(struct w1_family_ops in -w1_family.h), notifies any registered listener and so on...). -It is device driver's business to provide any communication method -upstream. -For example w1_therm driver(ds18?20 thermal sensor family driver) -provides temperature reading function which is bound to ->rbin() method -of the above w1_family_ops structure. -w1_smem - driver for simple 64bit memory cell provides ID reading -method. +The 1-wire (w1) subsystem +------------------------------------------------------------------ +The 1-wire bus is a simple master-slave bus that communicates via a single +signal wire (plus ground, so two wires). + +Devices communicate on the bus by pulling the signal to ground via an open +drain output and by sampling the logic level of the signal line. + +The w1 subsystem provides the framework for managing w1 masters and +communication with slaves. + +All w1 slave devices must be connected to a w1 bus master device. + +Example w1 master devices: + DS9490 usb device + W1-over-GPIO + DS2482 (i2c to w1 bridge) + Emulated devices, such as a RS232 converter, parallel port adapter, etc + + +What does the w1 subsystem do? +------------------------------------------------------------------ +When a w1 master driver registers with the w1 subsystem, the following occurs: + + - sysfs entries for that w1 master are created + - the w1 bus is periodically searched for new slave devices + +When a device is found on the bus, w1 core checks if driver for it's family is +loaded. If so, the family driver is attached to the slave. +If there is no driver for the family, default one is assigned, which allows to perform +almost any kind of operations. Each logical operation is a transaction +in nature, which can contain several (two or one) low-level operations. +Let's see how one can read EEPROM context: +1. one must write control buffer, i.e. buffer containing command byte +and two byte address. At this step bus is reset and appropriate device +is selected using either W1_SKIP_ROM or W1_MATCH_ROM command. +Then provided control buffer is being written to the wire. +2. reading. This will issue reading eeprom response. + +It is possible that between 1. and 2. w1 master thread will reset bus for searching +and slave device will be even removed, but in this case 0xff will +be read, since no device was selected. + + +W1 device families +------------------------------------------------------------------ +Slave devices are handled by a driver written for a family of w1 devices. + +A family driver populates a struct w1_family_ops (see w1_family.h) and +registers with the w1 subsystem. + +Current family drivers: +w1_therm - (ds18?20 thermal sensor family driver) + provides temperature reading function which is bound to ->rbin() method + of the above w1_family_ops structure. + +w1_smem - driver for simple 64bit memory cell provides ID reading method. You can call above methods by reading appropriate sysfs files. + + +What does a w1 master driver need to implement? +------------------------------------------------------------------ + +The driver for w1 bus master must provide at minimum two functions. + +Emulated devices must provide the ability to set the output signal level +(write_bit) and sample the signal level (read_bit). + +Devices that support the 1-wire natively must provide the ability to write and +sample a bit (touch_bit) and reset the bus (reset_bus). + +Most hardware provides higher-level functions that offload w1 handling. +See struct w1_bus_master definition in w1.h for details. + + +w1 master sysfs interface +------------------------------------------------------------------ + - a directory for a found device. The format is family-serial +bus - (standard) symlink to the w1 bus +driver - (standard) symlink to the w1 driver +w1_master_attempts - the number of times a search was attempted +w1_master_max_slave_count + - the maximum slaves that may be attached to a master +w1_master_name - the name of the device (w1_bus_masterX) +w1_master_search - the number of searches left to do, -1=continual (default) +w1_master_slave_count + - the number of slaves found +w1_master_slaves - the names of the slaves, one per line +w1_master_timeout - the delay in seconds between searches + +If you have a w1 bus that never changes (you don't add or remove devices), +you can set w1_master_search to a positive value to disable searches. + + +w1 slave sysfs interface +------------------------------------------------------------------ +bus - (standard) symlink to the w1 bus +driver - (standard) symlink to the w1 driver +name - the device name, usually the same as the directory name +w1_slave - (optional) a binary file whose meaning depends on the + family driver +rw - (optional) created for slave devices which do not have + appropriate family driver. Allows to read/write binary data. diff --git a/Documentation/watchdog/pcwd-watchdog.txt b/Documentation/watchdog/pcwd-watchdog.txt index 12187a33e..d9ee6336c 100644 --- a/Documentation/watchdog/pcwd-watchdog.txt +++ b/Documentation/watchdog/pcwd-watchdog.txt @@ -22,78 +22,9 @@ to run the program with an "&" to run it in the background!) If you want to write a program to be compatible with the PC Watchdog - driver, simply do the following: - --- Snippet of code -- -/* - * Watchdog Driver Test Program - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -int fd; - -/* - * This function simply sends an IOCTL to the driver, which in turn ticks - * the PC Watchdog card to reset its internal timer so it doesn't trigger - * a computer reset. - */ -void keep_alive(void) -{ - int dummy; - - ioctl(fd, WDIOC_KEEPALIVE, &dummy); -} - -/* - * The main program. Run the program with "-d" to disable the card, - * or "-e" to enable the card. - */ -int main(int argc, char *argv[]) -{ - fd = open("/dev/watchdog", O_WRONLY); - - if (fd == -1) { - fprintf(stderr, "Watchdog device not enabled.\n"); - fflush(stderr); - exit(-1); - } - - if (argc > 1) { - if (!strncasecmp(argv[1], "-d", 2)) { - ioctl(fd, WDIOC_SETOPTIONS, WDIOS_DISABLECARD); - fprintf(stderr, "Watchdog card disabled.\n"); - fflush(stderr); - exit(0); - } else if (!strncasecmp(argv[1], "-e", 2)) { - ioctl(fd, WDIOC_SETOPTIONS, WDIOS_ENABLECARD); - fprintf(stderr, "Watchdog card enabled.\n"); - fflush(stderr); - exit(0); - } else { - fprintf(stderr, "-d to disable, -e to enable.\n"); - fprintf(stderr, "run by itself to tick the card.\n"); - fflush(stderr); - exit(0); - } - } else { - fprintf(stderr, "Watchdog Ticking Away!\n"); - fflush(stderr); - } - - while(1) { - keep_alive(); - sleep(1); - } -} --- End snippet -- + driver, simply use of modify the watchdog test program: + Documentation/watchdog/src/watchdog-test.c + Other IOCTL functions include: diff --git a/Documentation/watchdog/watchdog-api.txt b/Documentation/watchdog/watchdog-api.txt index 21ed51173..958ff3d48 100644 --- a/Documentation/watchdog/watchdog-api.txt +++ b/Documentation/watchdog/watchdog-api.txt @@ -34,22 +34,7 @@ activates as soon as /dev/watchdog is opened and will reboot unless the watchdog is pinged within a certain time, this time is called the timeout or margin. The simplest way to ping the watchdog is to write some data to the device. So a very simple watchdog daemon would look -like this: - -#include -#include - -int main(int argc, const char *argv[]) { - int fd=open("/dev/watchdog",O_WRONLY); - if (fd==-1) { - perror("watchdog"); - exit(1); - } - while(1) { - write(fd, "\0", 1); - sleep(10); - } -} +like this source file: see Documentation/watchdog/src/watchdog-simple.c A more advanced driver could for example check that a HTTP server is still responding before doing the write call to ping the watchdog. @@ -110,7 +95,40 @@ current timeout using the GETTIMEOUT ioctl. ioctl(fd, WDIOC_GETTIMEOUT, &timeout); printf("The timeout was is %d seconds\n", timeout); -Envinronmental monitoring: +Pretimeouts: + +Some watchdog timers can be set to have a trigger go off before the +actual time they will reset the system. This can be done with an NMI, +interrupt, or other mechanism. This allows Linux to record useful +information (like panic information and kernel coredumps) before it +resets. + + pretimeout = 10; + ioctl(fd, WDIOC_SETPRETIMEOUT, &pretimeout); + +Note that the pretimeout is the number of seconds before the time +when the timeout will go off. It is not the number of seconds until +the pretimeout. So, for instance, if you set the timeout to 60 seconds +and the pretimeout to 10 seconds, the pretimout will go of in 50 +seconds. Setting a pretimeout to zero disables it. + +There is also a get function for getting the pretimeout: + + ioctl(fd, WDIOC_GETPRETIMEOUT, &timeout); + printf("The pretimeout was is %d seconds\n", timeout); + +Not all watchdog drivers will support a pretimeout. + +Get the number of seconds before reboot: + +Some watchdog drivers have the ability to report the remaining time +before the system will reboot. The WDIOC_GETTIMELEFT is the ioctl +that returns the number of seconds before reboot. + + ioctl(fd, WDIOC_GETTIMELEFT, &timeleft); + printf("The timeout was is %d seconds\n", timeleft); + +Environmental monitoring: All watchdog drivers are required return more information about the system, some do temperature, fan and power level monitoring, some can tell you @@ -169,6 +187,10 @@ The watchdog saw a keepalive ping since it was last queried. WDIOF_SETTIMEOUT Can set/get the timeout +The watchdog can do pretimeouts. + + WDIOF_PRETIMEOUT Pretimeout (in seconds), get/set + For those drivers that return any bits set in the option field, the GETSTATUS and GETBOOTSTATUS ioctls can be used to ask for the current diff --git a/Documentation/watchdog/watchdog.txt b/Documentation/watchdog/watchdog.txt index dffda29c8..4b1ff69cc 100644 --- a/Documentation/watchdog/watchdog.txt +++ b/Documentation/watchdog/watchdog.txt @@ -65,28 +65,7 @@ The external event interfaces on the WDT boards are not currently supported. Minor numbers are however allocated for it. -Example Watchdog Driver ------------------------ - -#include -#include -#include - -int main(int argc, const char *argv[]) -{ - int fd=open("/dev/watchdog",O_WRONLY); - if(fd==-1) - { - perror("watchdog"); - exit(1); - } - while(1) - { - write(fd,"\0",1); - fsync(fd); - sleep(10); - } -} +Example Watchdog Driver: see Documentation/watchdog/src/watchdog-simple.c Contact Information diff --git a/Documentation/x86_64/boot-options.txt b/Documentation/x86_64/boot-options.txt index f2cd6ef53..6da24e7a5 100644 --- a/Documentation/x86_64/boot-options.txt +++ b/Documentation/x86_64/boot-options.txt @@ -205,6 +205,27 @@ IOMMU pages Prereserve that many 128K pages for the software IO bounce buffering. force Force all IO through the software TLB. + calgary=[64k,128k,256k,512k,1M,2M,4M,8M] + calgary=[translate_empty_slots] + calgary=[disable=] + + 64k,...,8M - Set the size of each PCI slot's translation table + when using the Calgary IOMMU. This is the size of the translation + table itself in main memory. The smallest table, 64k, covers an IO + space of 32MB; the largest, 8MB table, can cover an IO space of + 4GB. Normally the kernel will make the right choice by itself. + + translate_empty_slots - Enable translation even on slots that have + no devices attached to them, in case a device will be hotplugged + in the future. + + disable= - Disable translation on a given PHB. For + example, the built-in graphics adapter resides on the first bridge + (PCI bus number 0); if translation (isolation) is enabled on this + bridge, X servers that access the hardware directly from user + space might stop working. Use this option if you have devices that + are accessed from userspace directly on some PCI host bridge. + Debugging oops=panic Always panic on oopses. Default is to just kill the process, @@ -217,6 +238,13 @@ Debugging pagefaulttrace Dump all page faults. Only useful for extreme debugging and will create a lot of output. + call_trace=[old|both|newfallback|new] + old: use old inexact backtracer + new: use new exact dwarf2 unwinder + both: print entries from both + newfallback: use new unwinder but fall back to old if it gets + stuck (default) + Misc noreplacement Don't replace instructions with more appropriate ones diff --git a/MAINTAINERS b/MAINTAINERS index 6a1bb87d8..c5e32622c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -181,6 +181,12 @@ M: bcrl@kvack.org L: linux-aio@kvack.org S: Supported +ABIT UGURU HARDWARE MONITOR DRIVER +P: Hans de Goede +M: j.w.r.degoede@hhs.nl +L: lm-sensors@lm-sensors.org +S: Maintained + ACENIC DRIVER P: Jes Sorensen M: jes@trained-monkey.org @@ -208,6 +214,12 @@ W: http://acpi.sourceforge.net/ T: git kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git S: Maintained +ACPI PCI HOTPLUG DRIVER +P: Kristen Carlson Accardi +M: kristen.c.accardi@intel.com +L: pcihpd-discuss@lists.sourceforge.net +S: Maintained + AD1816 SOUND DRIVER P: Thorsten Knabe M: Thorsten Knabe @@ -268,7 +280,7 @@ S: Maintained ALI1563 I2C DRIVER P: Rudolf Marek M: r.marek@sh.cvut.cz -L: lm-sensors@lm-sensors.org +L: i2c@lm-sensors.org S: Maintained ALPHA PORT @@ -286,6 +298,13 @@ L: info-linux@geode.amd.com W: http://www.amd.com/us-en/ConnectivitySolutions/TechnicalResources/0,,50_2334_2452_11363,00.html S: Supported +AOA (Apple Onboard Audio) ALSA DRIVER +P: Johannes Berg +M: johannes@sipsolutions.net +L: linuxppc-dev@ozlabs.org +L: alsa-devel@alsa-project.org +S: Maintained + APM DRIVER P: Stephen Rothwell M: sfr@canb.auug.org.au @@ -397,7 +416,7 @@ S: Supported ATM P: Chas Williams M: chas@cmf.nrl.navy.mil -L: linux-atm-general@lists.sourceforge.net +L: linux-atm-general@lists.sourceforge.net (subscribers-only) W: http://linux-atm.sourceforge.net S: Maintained @@ -568,6 +587,12 @@ L: linuxppc-dev@ozlabs.org W: http://www.penguinppc.org/ppc64/ S: Supported +BROADCOM B44 10/100 ETHERNET DRIVER +P: Gary Zambrano +M: zambrano@broadcom.com +L: netdev@vger.kernel.org +S: Supported + BROADCOM BNX2 GIGABIT ETHERNET DRIVER P: Michael Chan M: mchan@broadcom.com @@ -589,6 +614,15 @@ W: http://linuxtv.org T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb.git S: Maintained +CALGARY x86-64 IOMMU +P: Muli Ben-Yehuda +M: muli@il.ibm.com +P: Jon D. Mason +M: jdmason@us.ibm.com +L: linux-kernel@vger.kernel.org +L: discuss@x86-64.org +S: Maintained + COMMON INTERNET FILE SYSTEM (CIFS) P: Steve French M: sfrench@samba.org @@ -750,6 +784,7 @@ M: aliakc@web.de P: Jamie Lenehan M: lenehan@twibble.org W: http://twibble.org/dist/dc395x/ +L: dc395x@twibble.org L: http://lists.twibble.org/mailman/listinfo/dc395x/ S: Maintained @@ -849,9 +884,17 @@ S: Maintained DOCBOOK FOR DOCUMENTATION P: Martin Waitz M: tali@admingilde.org +P: Randy Dunlap +M: rdunlap@xenotime.net T: git http://tali.admingilde.org/git/linux-docbook.git S: Maintained +DOCKING STATION DRIVER +P: Kristen Carlson Accardi +M: kristen.c.accardi@intel.com +L: linux-acpi@vger.kernel.org +S: Maintained + DOUBLETALK DRIVER P: James R. Van Zandt M: jrv@vanzandt.mv.com @@ -913,23 +956,27 @@ S: Maintained EDAC-CORE P: Doug Thompson -M: norsk5@xmission.com, dthompson@linuxnetworx.com -P: Dave Peterson -M: dsp@llnl.gov, dave_peterson@pobox.com +M: norsk5@xmission.com +L: bluesmoke-devel@lists.sourceforge.net +W: bluesmoke.sourceforge.net +S: Supported + +EDAC-K8 +P: Doug Thompson +M: norsk5@xmission.com L: bluesmoke-devel@lists.sourceforge.net W: bluesmoke.sourceforge.net -S: Maintained EDAC-E752X -P: Dave Peterson -M: dsp@llnl.gov, dave_peterson@pobox.com +P: Mark Gross +M: mark.gross@intel.com L: bluesmoke-devel@lists.sourceforge.net W: bluesmoke.sourceforge.net S: Maintained EDAC-E7XXX -P: Dave Peterson -M: dsp@llnl.gov, dave_peterson@pobox.com +P: Doug Thompson +M: norsk5@xmission.com L: bluesmoke-devel@lists.sourceforge.net W: bluesmoke.sourceforge.net S: Maintained @@ -946,6 +993,10 @@ P: Andrey V. Savochkin M: saw@saw.sw.com.sg S: Maintained +EFS FILESYSTEM +W: http://aeschi.ch.eu.org/efs/ +S: Orphan + EMU10K1 SOUND DRIVER P: James Courtier-Dutton M: James@superbug.demon.co.uk @@ -1106,6 +1157,11 @@ L: lm-sensors@lm-sensors.org W: http://www.lm-sensors.nu/ S: Maintained +HARDWARE RANDOM NUMBER GENERATOR CORE +P: Michael Buesch +M: mb@bu3sch.de +S: Maintained + HARD DRIVE ACTIVE PROTECTION SYSTEM (HDAPS) DRIVER P: Robert Love M: rlove@rlove.org @@ -1147,6 +1203,12 @@ L: linux-hams@vger.kernel.org W: http://www.nt.tuwien.ac.at/~kkudielk/Linux/ S: Maintained +HIGHPOINT ROCKETRAID 3xxx RAID DRIVER +P: HighPoint Linux Team +M: linux@highpoint-tech.com +W: http://www.highpoint-tech.com +S: Supported + HIPPI P: Jes Sorensen M: jes@trained-monkey.org @@ -1217,7 +1279,7 @@ S: Maintained I2C SUBSYSTEM P: Jean Delvare M: khali@linux-fr.org -L: lm-sensors@lm-sensors.org +L: i2c@lm-sensors.org W: http://www.lm-sensors.nu/ T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/ S: Maintained @@ -1378,7 +1440,8 @@ S: Supported INPUT (KEYBOARD, MOUSE, JOYSTICK) DRIVERS P: Dmitry Torokhov -M: dtor_core@ameritech.net +M: dmitry.torokhov@gmail.com +M: dtor@mail.ru 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 @@ -1418,6 +1481,11 @@ P: Tigran Aivazian M: tigran@veritas.com S: Maintained +INTEL IXP4XX RANDOM NUMBER GENERATOR SUPPORT +P: Deepak Saxena +M: dsaxena@plexity.net +S: Maintained + INTEL PRO/100 ETHERNET SUPPORT P: John Ronciak M: john.ronciak@intel.com @@ -1425,6 +1493,8 @@ P: Jesse Brandeburg M: jesse.brandeburg@intel.com P: Jeff Kirsher M: jeffrey.t.kirsher@intel.com +P: Auke Kok +M: auke-jan.h.kok@intel.com W: http://sourceforge.net/projects/e1000/ S: Supported @@ -1437,6 +1507,8 @@ P: Jesse Brandeburg M: jesse.brandeburg@intel.com P: Jeff Kirsher M: jeffrey.t.kirsher@intel.com +P: Auke Kok +M: auke-jan.h.kok@intel.com W: http://sourceforge.net/projects/e1000/ S: Supported @@ -1449,6 +1521,8 @@ P: John Ronciak M: john.ronciak@intel.com P: Jesse Brandeburg M: jesse.brandeburg@intel.com +P: Auke Kok +M: auke-jan.h.kok@intel.com W: http://sourceforge.net/projects/e1000/ S: Supported @@ -1457,6 +1531,7 @@ P: Yi Zhu M: yi.zhu@intel.com P: James Ketrenos M: jketreno@linux.intel.com +L: ipw2100-devel@lists.sourceforge.net L: http://lists.sourceforge.net/mailman/listinfo/ipw2100-devel W: http://ipw2100.sourceforge.net S: Supported @@ -1466,6 +1541,7 @@ P: Yi Zhu M: yi.zhu@intel.com P: James Ketrenos M: jketreno@linux.intel.com +L: ipw2100-devel@lists.sourceforge.net L: http://lists.sourceforge.net/mailman/listinfo/ipw2100-devel W: http://ipw2200.sourceforge.net S: Supported @@ -1551,7 +1627,7 @@ W: http://jfs.sourceforge.net/ T: git kernel.org:/pub/scm/linux/kernel/git/shaggy/jfs-2.6.git S: Supported -JOURNALLING LAYER FOR BLOCK DEVICS (JBD) +JOURNALLING LAYER FOR BLOCK DEVICES (JBD) P: Stephen Tweedie, Andrew Morton M: sct@redhat.com, akpm@osdl.org L: ext2-devel@lists.sourceforge.net @@ -1595,9 +1671,8 @@ S: Maintained KERNEL JANITORS P: Several -L: kernel-janitors@osdl.org +L: kernel-janitors@lists.osdl.org W: http://www.kerneljanitors.org/ -W: http://sf.net/projects/kernel-janitor/ S: Maintained KERNEL NFSD @@ -1629,10 +1704,8 @@ L: linux-kernel@vger.kernel.org S: Maintained LAPB module -P: Henner Eisen -M: eis@baty.hanse.de L: linux-x25@vger.kernel.org -S: Maintained +S: Orphan LASI 53c700 driver for PARISC P: James E.J. Bottomley @@ -1837,12 +1910,18 @@ S: linux-scsi@vger.kernel.org W: http://megaraid.lsilogic.com S: Maintained -MEMORY TECHNOLOGY DEVICES +MEMORY MANAGEMENT +L: linux-mm@kvack.org +L: linux-kernel@vger.kernel.org +W: http://www.linux-mm.org +S: Maintained + +MEMORY TECHNOLOGY DEVICES (MTD) 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 +T: git git://git.infradead.org/mtd-2.6.git S: Maintained MICROTEK X6 SCANNER @@ -1889,7 +1968,7 @@ L: linux-kernel@vger.kernel.org W: http://www.atnf.csiro.au/~rgooch/linux/kernel-patches.html S: Maintained -MULTIMEDIA CARD SUBSYSTEM +MULTIMEDIA CARD (MMC) SUBSYSTEM P: Russell King M: rmk+mmc@arm.linux.org.uk S: Maintained @@ -2004,9 +2083,10 @@ L: linux-kernel@vger.kernel.org S: Maintained NI5010 NETWORK DRIVER -P: Jan-Pascal van Best and Andreas Mohr -M: Jan-Pascal van Best -M: Andreas Mohr <100.30936@germany.net> +P: Jan-Pascal van Best +M: janpascal@vanbest.org +P: Andreas Mohr +M: andi@lisas.de L: netdev@vger.kernel.org S: Maintained @@ -2045,6 +2125,12 @@ M: adaplas@pol.net L: linux-fbdev-devel@lists.sourceforge.net S: Maintained +OPENCORES I2C BUS DRIVER +P: Peter Korsgaard +M: jacmet@sunsite.dk +L: i2c@lm-sensors.org +S: Maintained + ORACLE CLUSTER FILESYSTEM 2 (OCFS2) P: Mark Fasheh M: mark.fasheh@oracle.com @@ -2175,6 +2261,7 @@ S: Maintained PCMCIA SUBSYSTEM P: Linux PCMCIA Team +L: linux-pcmcia@lists.infradead.org L: http://lists.infradead.org/mailman/listinfo/linux-pcmcia T: git kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git S: Maintained @@ -2185,6 +2272,12 @@ M: tsbogend@alpha.franken.de L: netdev@vger.kernel.org S: Maintained +PER-TASK DELAY ACCOUNTING +P: Shailabh Nagar +M: nagar@watson.ibm.com +L: linux-kernel@vger.kernel.org +S: Maintained + PERSONALITY HANDLING P: Christoph Hellwig M: hch@infradead.org @@ -2259,6 +2352,14 @@ M: promise@pnd-pc.demon.co.uk W: http://www.pnd-pc.demon.co.uk/promise/ S: Maintained +PVRUSB2 VIDEO4LINUX DRIVER +P: Mike Isely +M: isely@pobox.com +L: pvrusb2@isely.net +L: video4linux-list@redhat.com +W: http://www.isely.net/pvrusb2/ +S: Maintained + PXA2xx SUPPORT P: Nicolas Pitre M: nico@cam.org @@ -2516,19 +2617,6 @@ M: thomas@winischhofer.net W: http://www.winischhofer.at/linuxsisusbvga.shtml S: Maintained -SMSC47M1 HARDWARE MONITOR DRIVER -P: Jean Delvare -M: khali@linux-fr.org -L: lm-sensors@lm-sensors.org -S: Odd Fixes - -SMB FILESYSTEM -P: Urban Widmark -M: urban@teststation.com -W: http://samba.org/ -L: samba@samba.org -S: Maintained - SMC91x ETHERNET DRIVER P: Nicolas Pitre M: nico@cam.org @@ -2580,6 +2668,14 @@ M: chrisw@sous-sol.org L: stable@kernel.org S: Maintained +STABLE BRANCH: +P: Greg Kroah-Hartman +M: greg@kroah.com +P: Chris Wright +M: chrisw@sous-sol.org +L: stable@kernel.org +S: Maintained + TPM DEVICE DRIVER P: Kylene Hall M: kjhall@us.ibm.com @@ -2637,6 +2733,11 @@ M: shemminger@osdl.org L: netdev@vger.kernel.org S: Maintained +SOEKRIS NET48XX LED SUPPORT +P: Chris Boot +M: bootc@bootc.net +S: Maintained + SPARC (sparc32): P: William L. Irwin M: wli@holomorphy.com @@ -2709,6 +2810,31 @@ P: Christoph Hellwig M: hch@infradead.org S: Maintained +TC CLASSIFIER +P: Jamal Hadi Salim +M: hadi@cyberus.ca +L: netdev@vger.kernel.org +S: Maintained + +TCP LOW PRIORITY MODULE +P: Wong Hoi Sing, Edison +M: hswong3i@gmail.com +P: Hung Hing Lun, Mike +M: hlhung3i@gmail.com +W: http://tcp-lp-mod.sourceforge.net/ +S: Maintained + +TI OMAP RANDOM NUMBER GENERATOR SUPPORT +P: Deepak Saxena +M: dsaxena@plexity.net +S: Maintained + +TASKSTATS STATISTICS INTERFACE +P: Shailabh Nagar +M: nagar@watson.ibm.com +L: linux-kernel@vger.kernel.org +S: Maintained + TI PARALLEL LINK CABLE DRIVER P: Romain Lievin M: roms@lpg.ticalc.org @@ -3084,7 +3210,7 @@ S: Maintained VIAPRO SMBUS DRIVER P: Jean Delvare M: khali@linux-fr.org -L: lm-sensors@lm-sensors.org +L: i2c@lm-sensors.org S: Maintained UCLINUX (AND M68KNOMMU) @@ -3132,6 +3258,11 @@ S: Maintained W1 DALLAS'S 1-WIRE BUS P: Evgeniy Polyakov M: johnpol@2ka.mipt.ru +S: Maintained + +W83791D HARDWARE MONITORING DRIVER +P: Charles Spirakis +M: bezaur@gmail.com L: lm-sensors@lm-sensors.org S: Maintained @@ -3142,12 +3273,6 @@ L: wbsd-devel@list.drzeus.cx W: http://projects.drzeus.cx/wbsd S: Maintained -W83L785TS HARDWARE MONITOR DRIVER -P: Jean Delvare -M: khali@linux-fr.org -L: lm-sensors@lm-sensors.org -S: Odd Fixes - WATCHDOG DEVICE DRIVERS P: Wim Van Sebroeck M: wim@iguana.be @@ -3185,10 +3310,11 @@ S: Maintained XFS FILESYSTEM P: Silicon Graphics Inc +P: Tim Shimmin, David Chatterton M: xfs-masters@oss.sgi.com -M: nathans@sgi.com -L: linux-xfs@oss.sgi.com +L: xfs@oss.sgi.com W: http://oss.sgi.com/projects/xfs +T: git git://oss.sgi.com:8090/xfs/xfs-2.6 S: Supported X86 3-LEVEL PAGING (PAE) SUPPORT diff --git a/Makefile b/Makefile index 4aa61270d..2a5c9cbfb 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,8 @@ VERSION = 2 PATCHLEVEL = 6 -SUBLEVEL = 17 -EXTRAVERSION = -1.2187_FC5 -NAME=Crazed Snow-Weasel +SUBLEVEL = 18 +EXTRAVERSION = -1.2224_FC5.vs2.0.2.2-rc6 +NAME=Avast! A bilge rat! # *DOCUMENTATION* # To see a list of typical targets execute "make help" @@ -41,8 +41,9 @@ ifndef KBUILD_VERBOSE KBUILD_VERBOSE = 0 endif -# Call sparse as part of compilation of C files -# Use 'make C=1' to enable sparse checking +# Call checker as part of compilation of C files +# Use 'make C=1' to enable checking (sparse, by default) +# Override with 'make C=1 CHECK=checker_executable CHECKFLAGS=....' ifdef C ifeq ("$(origin C)", "command line") @@ -71,7 +72,7 @@ endif # In both cases the working directory must be the root of the kernel src. # 1) O= # Use "make O=dir/to/store/output/files/" -# +# # 2) Set KBUILD_OUTPUT # Set the environment variable KBUILD_OUTPUT to point to the directory # where the output files shall be placed. @@ -178,18 +179,20 @@ CROSS_COMPILE ?= # Architecture as present in compile.h UTS_MACHINE := $(ARCH) +KCONFIG_CONFIG ?= .config + # SHELL used by kbuild CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ else if [ -x /bin/bash ]; then echo /bin/bash; \ else echo sh; fi ; fi) -HOSTCC = gcc -HOSTCXX = g++ -HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -HOSTCXXFLAGS = -O2 +HOSTCC = gcc +HOSTCXX = g++ +HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer +HOSTCXXFLAGS = -O2 -# Decide whether to build built-in, modular, or both. -# Normally, just do built-in. +# Decide whether to build built-in, modular, or both. +# Normally, just do built-in. KBUILD_MODULES := KBUILD_BUILTIN := 1 @@ -197,7 +200,7 @@ KBUILD_BUILTIN := 1 # If we have only "make modules", don't compile built-in objects. # When we're building modules with modversions, we need to consider # the built-in objects during the descend as well, in order to -# make sure the checksums are uptodate before we record them. +# make sure the checksums are up to date before we record them. ifeq ($(MAKECMDGOALS),modules) KBUILD_BUILTIN := $(if $(CONFIG_MODVERSIONS),1) @@ -230,7 +233,7 @@ export KBUILD_CHECKSRC KBUILD_SRC KBUILD_EXTMOD # # If $(quiet) is empty, the whole command will be printed. # If it is set to "quiet_", only the short version will be printed. -# If it is set to "silent_", nothing wil be printed at all, since +# If it is set to "silent_", nothing will be printed at all, since # the variable $(silent_cmd_cc_o_c) doesn't exist. # # A simple variant is to prefix commands with $(Q) - that's useful @@ -265,11 +268,6 @@ MAKEFLAGS += --include-dir=$(srctree) # We need some generic definitions include $(srctree)/scripts/Kbuild.include -# For maximum performance (+ possibly random breakage, uncomment -# the following) - -#MAKEFLAGS += -rR - # Make variables (CC, etc...) AS = $(CROSS_COMPILE)as @@ -305,21 +303,21 @@ LINUXINCLUDE := -Iinclude \ CPPFLAGS := -D__KERNEL__ $(LINUXINCLUDE) -CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ - -fno-strict-aliasing -fno-common -Wstrict-prototypes -Wundef -Werror-implicit-function-declaration -AFLAGS := -D__ASSEMBLY__ +CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ + -fno-strict-aliasing -fno-common -Wstrict-prototypes -Wundef -Werror-implicit-function-declaration +AFLAGS := -D__ASSEMBLY__ -# Read KERNELRELEASE from .kernelrelease (if it exists) -KERNELRELEASE = $(shell cat .kernelrelease 2> /dev/null) +# Read KERNELRELEASE from include/config/kernel.release (if it exists) +KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null) KERNELVERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) -export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION \ - ARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC \ - CPP AR NM STRIP OBJCOPY OBJDUMP MAKE AWK GENKSYMS PERL UTS_MACHINE \ - HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS +export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION +export ARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC +export CPP AR NM STRIP OBJCOPY OBJDUMP MAKE AWK GENKSYMS PERL UTS_MACHINE +export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS export CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS LDFLAGS -export CFLAGS CFLAGS_KERNEL CFLAGS_MODULE +export CFLAGS CFLAGS_KERNEL CFLAGS_MODULE export AFLAGS AFLAGS_KERNEL AFLAGS_MODULE # When compiling out-of-tree modules, put MODVERDIR in the module @@ -357,12 +355,14 @@ endif # catch them early, and hand them over to scripts/kconfig/Makefile # It is allowed to specify more targets when calling make, including # mixing *config targets and build targets. -# For example 'make oldconfig all'. +# For example 'make oldconfig all'. # Detect when mixed targets is specified, and make a second invocation # 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% + cscope TAGS tags help %docs check% \ + include/linux/version.h headers_% \ + kernelrelease kernelversion config-targets := 0 mixed-targets := 0 @@ -404,9 +404,8 @@ include $(srctree)/arch/$(ARCH)/Makefile export KBUILD_DEFCONFIG config %config: scripts_basic outputmakefile FORCE - $(Q)mkdir -p include/linux + $(Q)mkdir -p include/linux include/config $(Q)$(MAKE) $(build)=scripts/kconfig $@ - $(Q)$(MAKE) -C $(srctree) KBUILD_SRC= .kernelrelease else # =========================================================================== @@ -416,13 +415,11 @@ else ifeq ($(KBUILD_EXTMOD),) # Additional helpers built in scripts/ # Carefully list dependencies so we do not try to build scripts twice -# in parrallel +# in parallel PHONY += scripts -scripts: scripts_basic include/config/MARKER +scripts: scripts_basic include/config/auto.conf $(Q)$(MAKE) $(build)=$(@) -scripts_basic: include/linux/autoconf.h - # Objects we will link into vmlinux / subdirs we need to visit init-y := init/ drivers-y := drivers/ sound/ @@ -432,35 +429,48 @@ core-y := usr/ endif # KBUILD_EXTMOD ifeq ($(dot-config),1) -# In this section, we need .config +# Read in config +-include include/config/auto.conf +ifeq ($(KBUILD_EXTMOD),) # Read in dependencies to all Kconfig* files, make sure to run # oldconfig if changes are detected. --include .kconfig.d - -include .config +-include include/config/auto.conf.cmd -# If .config needs to be updated, it will be done via the dependency -# that autoconf has on .config. # To avoid any implicit rule to kick in, define an empty command -.config .kconfig.d: ; +$(KCONFIG_CONFIG) include/config/auto.conf.cmd: ; -# If .config is newer than include/linux/autoconf.h, someone tinkered +# If .config is newer than include/config/auto.conf, someone tinkered # with it and forgot to run make oldconfig. -# If kconfig.d is missing then we are probarly in a cleaned tree so +# if auto.conf.cmd is missing then we are probably in a cleaned tree so # we execute the config step to be sure to catch updated Kconfig files -include/linux/autoconf.h: .kconfig.d .config - $(Q)mkdir -p include/linux +include/config/auto.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd $(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig +else +# external modules needs include/linux/autoconf.h and include/config/auto.conf +# but do not care if they are up-to-date. Use auto.conf to trigger the test +PHONY += include/config/auto.conf + +include/config/auto.conf: + $(Q)test -e include/linux/autoconf.h -a -e $@ || ( \ + echo; \ + echo " ERROR: Kernel configuration is invalid."; \ + echo " include/linux/autoconf.h or $@ are missing."; \ + echo " Run 'make oldconfig && make prepare' on kernel src to fix it."; \ + echo; \ + /bin/false) + +endif # KBUILD_EXTMOD + else # Dummy target needed, because used as prerequisite -include/linux/autoconf.h: ; -endif +include/config/auto.conf: ; +endif # $(dot-config) # The all: target is the default when no target is given on the # command line. # This allow a user to issue only 'make' to build a kernel including modules -# Defaults vmlinux but it is usually overriden in the arch makefile +# Defaults vmlinux but it is usually overridden in the arch makefile all: vmlinux ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE @@ -469,6 +479,8 @@ else CFLAGS += -O2 endif +include $(srctree)/arch/$(ARCH)/Makefile + ifdef CONFIG_FRAME_POINTER CFLAGS += -fno-omit-frame-pointer $(call cc-option,-fno-optimize-sibling-calls,) else @@ -483,7 +495,8 @@ ifdef CONFIG_DEBUG_INFO CFLAGS += -g endif -include $(srctree)/arch/$(ARCH)/Makefile +# Force gcc to behave correct even for buggy distributions +CFLAGS += $(call cc-option, -fno-stack-protector) # arch Makefile may override CC so keep this after arch Makefile is included NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include) @@ -492,11 +505,11 @@ CHECKFLAGS += $(NOSTDINC_FLAGS) # warn about C99 declaration after statement CFLAGS += $(call cc-option,-Wdeclaration-after-statement,) -# disable pointer signedness warnings in gcc 4.0 +# disable pointer signed / unsigned warnings in gcc 4.0 CFLAGS += $(call cc-option,-Wno-pointer-sign,) # Default kernel image to build when no specific target is given. -# KBUILD_IMAGE may be overruled on the commandline or +# KBUILD_IMAGE may be overruled on the command line or # set in the environment # Also any assignments in arch/$(ARCH)/Makefile take precedence over # this default value @@ -510,12 +523,29 @@ export INSTALL_PATH ?= /boot # # INSTALL_MOD_PATH specifies a prefix to MODLIB for module directory # relocations required by build roots. This is not defined in the -# makefile but the arguement can be passed to make if needed. +# makefile but the argument can be passed to make if needed. # MODLIB = $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE) export MODLIB +# +# INSTALL_MOD_STRIP, if defined, will cause modules to be +# stripped after they are installed. If INSTALL_MOD_STRIP is '1', then +# the default option --strip-debug will be used. Otherwise, +# INSTALL_MOD_STRIP will used as the options to the strip command. + +ifdef INSTALL_MOD_STRIP +ifeq ($(INSTALL_MOD_STRIP),1) +mod_strip_cmd = $(STRIP) --strip-debug +else +mod_strip_cmd = $(STRIP) $(INSTALL_MOD_STRIP) +endif # INSTALL_MOD_STRIP=1 +else +mod_strip_cmd = true +endif # INSTALL_MOD_STRIP +export mod_strip_cmd + ifeq ($(KBUILD_EXTMOD),) core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ @@ -539,7 +569,7 @@ libs-y := $(libs-y1) $(libs-y2) # Build vmlinux # --------------------------------------------------------------------------- -# vmlinux is build from the objects selected by $(vmlinux-init) and +# vmlinux is built from the objects selected by $(vmlinux-init) and # $(vmlinux-main). Most are built-in.o files from top-level directories # in the kernel tree, others are specified in arch/$(ARCH)Makefile. # Ordering when linking is important, and $(vmlinux-init) must be first. @@ -590,7 +620,7 @@ quiet_cmd_vmlinux_version = GEN .version $(MAKE) $(build)=init # Generate System.map -quiet_cmd_sysmap = SYSMAP +quiet_cmd_sysmap = SYSMAP cmd_sysmap = $(CONFIG_SHELL) $(srctree)/scripts/mksysmap # Link of vmlinux @@ -719,7 +749,7 @@ $(vmlinux-dirs): prepare scripts $(Q)$(MAKE) $(build)=$@ # Build the kernel release string -# The KERNELRELEASE is stored in a file named .kernelrelease +# The KERNELRELEASE is stored in a file named include/config/kernel.release # to be used when executing for example make install or make modules_install # # Take the contents of any files called localversion* and the config @@ -737,10 +767,10 @@ _localver = $(foreach f, $(__localver), $(if $(findstring ~, $(f)),,$(f))) localver = $(subst $(space),, \ $(shell cat /dev/null $(_localver)) \ $(patsubst "%",%,$(CONFIG_LOCALVERSION))) - + # If CONFIG_LOCALVERSION_AUTO is set scripts/setlocalversion is called # and if the SCM is know a tag from the SCM is appended. -# The appended tag is determinded by the SCM used. +# The appended tag is determined by the SCM used. # # Currently, only git is supported. # Other SCMs can edit scripts/setlocalversion and add the appropriate @@ -753,9 +783,9 @@ endif localver-full = $(localver)$(localver-auto) -# Store (new) KERNELRELASE string in .kernelrelease +# Store (new) KERNELRELASE string in include/config/kernel.release kernelrelease = $(KERNELVERSION)$(localver-full) -.kernelrelease: FORCE +include/config/kernel.release: include/config/auto.conf FORCE $(Q)rm -f $@ $(Q)echo $(kernelrelease) > $@ @@ -776,10 +806,10 @@ PHONY += prepare-all # and if so do: # 1) Check that make has not been executed in the kernel src $(srctree) # 2) Create the include2 directory, used for the second asm symlink -prepare3: .kernelrelease +prepare3: include/config/kernel.release ifneq ($(KBUILD_SRC),) @echo ' Using $(srctree) as source for kernel' - $(Q)if [ -f $(srctree)/.config ]; then \ + $(Q)if [ -f $(srctree)/.config -o -d $(srctree)/include/config ]; then \ echo " $(srctree) is not clean, please run 'make mrproper'";\ echo " in the '$(srctree)' directory.";\ /bin/false; \ @@ -791,8 +821,8 @@ endif # prepare2 creates a makefile if using a separate output directory prepare2: prepare3 outputmakefile -prepare1: prepare2 include/linux/version.h include/asm \ - include/config/MARKER +prepare1: prepare2 include/linux/version.h include/linux/utsrelease.h \ + include/asm include/config/auto.conf ifneq ($(KBUILD_MODULES),) $(Q)mkdir -p $(MODVERDIR) $(Q)rm -f $(MODVERDIR)/* @@ -806,27 +836,20 @@ prepare0: archprepare FORCE # All the preparing.. prepare prepare-all: prepare0 -# Leave this as default for preprocessing vmlinux.lds.S, which is now -# done in arch/$(ARCH)/kernel/Makefile +# Leave this as default for preprocessing vmlinux.lds.S, which is now +# done in arch/$(ARCH)/kernel/Makefile export CPPFLAGS_vmlinux.lds += -P -C -U$(ARCH) -# FIXME: The asm symlink changes when $(ARCH) changes. That's -# hard to detect, but I suppose "make mrproper" is a good idea -# before switching between archs anyway. +# FIXME: The asm symlink changes when $(ARCH) changes. That's +# hard to detect, but I suppose "make mrproper" is a good idea +# before switching between archs anyway. include/asm: @echo ' SYMLINK $@ -> include/asm-$(ARCH)' $(Q)if [ ! -d include ]; then mkdir -p include; fi; @ln -fsn asm-$(ARCH) $@ -# Split autoconf.h into include/linux/config/* - -include/config/MARKER: scripts/basic/split-include include/linux/autoconf.h - @echo ' SPLIT include/linux/autoconf.h -> include/config/*' - @scripts/basic/split-include include/linux/autoconf.h include/config - @touch $@ - # Generate some files # --------------------------------------------------------------------------- @@ -834,33 +857,56 @@ include/config/MARKER: scripts/basic/split-include include/linux/autoconf.h # needs to be updated, so this check is forced on all builds uts_len := 64 +define filechk_utsrelease.h + if [ `echo -n "$(KERNELRELEASE)" | wc -c ` -gt $(uts_len) ]; then \ + echo '"$(KERNELRELEASE)" exceeds $(uts_len) characters' >&2; \ + exit 1; \ + fi; \ + (echo \#define UTS_RELEASE \"$(KERNELRELEASE)\";) +endef define filechk_version.h - if [ `echo -n "$(KERNELRELEASE)" | wc -c ` -gt $(uts_len) ]; then \ - echo '"$(KERNELRELEASE)" exceeds $(uts_len) characters' >&2; \ - exit 1; \ - fi; \ - (echo \#define UTS_RELEASE \"$(KERNELRELEASE)\"; \ - echo \#define LINUX_VERSION_CODE `expr $(VERSION) \\* 65536 + $(PATCHLEVEL) \\* 256 + $(SUBLEVEL)`; \ - echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))'; \ - ) + (echo \#define LINUX_VERSION_CODE $(shell \ + expr $(VERSION) \* 65536 + $(PATCHLEVEL) \* 256 + $(SUBLEVEL)); \ + echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))';) endef -include/linux/version.h: $(srctree)/Makefile .config .kernelrelease FORCE +include/linux/version.h: $(srctree)/Makefile FORCE $(call filechk,version.h) +include/linux/utsrelease.h: include/config/kernel.release FORCE + $(call filechk,utsrelease.h) + # --------------------------------------------------------------------------- PHONY += depend dep depend dep: @echo '*** Warning: make $@ is unnecessary now.' +# --------------------------------------------------------------------------- +# Kernel headers +INSTALL_HDR_PATH=$(objtree)/usr +export INSTALL_HDR_PATH + +PHONY += headers_install +headers_install: include/linux/version.h + @if [ ! -r include/asm-$(ARCH)/Kbuild ]; then \ + echo '*** Error: Headers not exportable for this architecture ($(ARCH))'; \ + exit 1 ; fi + $(Q)unifdef -Ux /dev/null + $(Q)rm -rf $(INSTALL_HDR_PATH)/include + $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.headersinst obj=include + +PHONY += headers_check +headers_check: headers_install + $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.headersinst obj=include HDRCHECK=1 + # --------------------------------------------------------------------------- # Modules ifdef CONFIG_MODULES -# By default, build modules as well +# By default, build modules as well all: modules @@ -939,10 +985,11 @@ CLEAN_FILES += vmlinux System.map \ .tmp_kallsyms* .tmp_version .tmp_vmlinux* .tmp_System.map # Directories & files removed with 'make mrproper' -MRPROPER_DIRS += include/config include2 +MRPROPER_DIRS += include/config include2 usr/include MRPROPER_FILES += .config .config.old include/asm .version .old_version \ - include/linux/autoconf.h include/linux/version.h \ - .kernelrelease Module.symvers tags TAGS cscope* + include/linux/autoconf.h include/linux/version.h \ + include/linux/utsrelease.h \ + Module.symvers tags TAGS cscope* # clean - Delete most, but leave enough to build external modules # @@ -958,8 +1005,9 @@ clean: archclean $(clean-dirs) $(call cmd,rmdirs) $(call cmd,rmfiles) @find . $(RCS_FIND_IGNORE) \ - \( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \ - -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \) \ + \( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \ + -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \ + -o -name '*.symtypes' \) \ -type f -print | xargs rm -f # mrproper - Delete all generated files, including .config @@ -982,9 +1030,9 @@ PHONY += distclean distclean: mrproper @find $(srctree) $(RCS_FIND_IGNORE) \ - \( -name '*.orig' -o -name '*.rej' -o -name '*~' \ + \( -name '*.orig' -o -name '*.rej' -o -name '*~' \ -o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \ - -o -name '.*.rej' -o -size 0 \ + -o -name '.*.rej' -o -size 0 \ -o -name '*%' -o -name '.*.cmd' -o -name 'core' \) \ -type f -print | xargs rm -f @@ -994,9 +1042,9 @@ distclean: mrproper # rpm target kept for backward compatibility package-dir := $(srctree)/scripts/package -%pkg: FORCE +%pkg: include/config/kernel.release FORCE $(Q)$(MAKE) $(build)=$(package-dir) $@ -rpm: FORCE +rpm: include/config/kernel.release FORCE $(Q)$(MAKE) $(build)=$(package-dir) $@ @@ -1027,10 +1075,17 @@ help: @echo ' cscope - Generate cscope index' @echo ' kernelrelease - Output the release version string' @echo ' kernelversion - Output the version stored in Makefile' + @if [ -r include/asm-$(ARCH)/Kbuild ]; then \ + echo ' headers_install - Install sanitised kernel headers to INSTALL_HDR_PATH'; \ + fi + @echo ' (default: $(INSTALL_HDR_PATH))' @echo '' @echo 'Static analysers' @echo ' checkstack - Generate a list of stack hogs' @echo ' namespacecheck - Name space analysis on compiled kernel' + @if [ -r include/asm-$(ARCH)/Kbuild ]; then \ + echo ' headers_check - Sanity check on exported headers'; \ + fi @echo '' @echo 'Kernel packaging:' @$(MAKE) $(build)=$(package-dir) help @@ -1049,8 +1104,8 @@ help: @echo ' make V=0|1 [targets] 0 => quiet build (default), 1 => verbose build' @echo ' make O=dir [targets] Locate all output files in "dir", including .config' - @echo ' make C=1 [targets] Check all c source with $$CHECK (sparse)' - @echo ' make C=2 [targets] Force check of all c source with $$CHECK (sparse)' + @echo ' make C=1 [targets] Check all c source with $$CHECK (sparse by default)' + @echo ' make C=2 [targets] Force check of all c source with $$CHECK' @echo '' @echo 'Execute "make" or "make all" to build all targets marked with [*] ' @echo 'For further info see the ./README file' @@ -1077,7 +1132,7 @@ else # KBUILD_EXTMOD # make M=dir modules Make all modules in specified dir # make M=dir Same as 'make M=dir modules' # make M=dir modules_install -# Install the modules build in the module directory +# Install the modules built in the module directory # Assumes install directory is already created # We are always building modules @@ -1136,7 +1191,7 @@ clean: rm-dirs := $(MODVERDIR) clean: $(clean-dirs) $(call cmd,rmdirs) @find $(KBUILD_EXTMOD) $(RCS_FIND_IGNORE) \ - \( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \ + \( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \ -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \) \ -type f -print | xargs rm -f @@ -1175,31 +1230,41 @@ else ALLINCLUDE_ARCHS := $(ARCH) endif else -#Allow user to specify only ALLSOURCE_PATHS on the command line, keeping existing behaviour. +#Allow user to specify only ALLSOURCE_PATHS on the command line, keeping existing behavour. ALLINCLUDE_ARCHS := $(ALLSOURCE_ARCHS) endif ALLSOURCE_ARCHS := $(ARCH) -define all-sources - ( find $(__srctree) $(RCS_FIND_IGNORE) \ +define find-sources + ( find $(__srctree) $(RCS_FIND_IGNORE) \ \( -name include -o -name arch \) -prune -o \ - -name '*.[chS]' -print; \ + -name $1 -print; \ for ARCH in $(ALLSOURCE_ARCHS) ; do \ find $(__srctree)arch/$${ARCH} $(RCS_FIND_IGNORE) \ - -name '*.[chS]' -print; \ + -name $1 -print; \ done ; \ find $(__srctree)security/selinux/include $(RCS_FIND_IGNORE) \ - -name '*.[chS]' -print; \ + -name $1 -print; \ find $(__srctree)include $(RCS_FIND_IGNORE) \ \( -name config -o -name 'asm-*' \) -prune \ - -o -name '*.[chS]' -print; \ + -o -name $1 -print; \ for ARCH in $(ALLINCLUDE_ARCHS) ; do \ find $(__srctree)include/asm-$${ARCH} $(RCS_FIND_IGNORE) \ - -name '*.[chS]' -print; \ + -name $1 -print; \ done ; \ find $(__srctree)include/asm-generic $(RCS_FIND_IGNORE) \ - -name '*.[chS]' -print ) + -name $1 -print ) +endef + +define all-sources + $(call find-sources,'*.[chS]') +endef +define all-kconfigs + $(call find-sources,'Kconfig*') +endef +define all-defconfigs + $(call find-sources,'defconfig') endef quiet_cmd_cscope-file = FILELST cscope.files @@ -1219,7 +1284,13 @@ define cmd_TAGS echo "-I __initdata,__exitdata,__acquires,__releases \ -I EXPORT_SYMBOL,EXPORT_SYMBOL_GPL \ --extra=+f --c-kinds=+px"`; \ - $(all-sources) | xargs etags $$ETAGSF -a + $(all-sources) | xargs etags $$ETAGSF -a; \ + if test "x$$ETAGSF" = x; then \ + $(all-kconfigs) | xargs etags -a \ + --regex='/^config[ \t]+\([a-zA-Z0-9_]+\)/\1/'; \ + $(all-defconfigs) | xargs etags -a \ + --regex='/^#?[ \t]?\(CONFIG_[a-zA-Z0-9_]+\)/\1/'; \ + fi endef TAGS: FORCE @@ -1259,14 +1330,14 @@ namespacecheck: endif #ifeq ($(config-targets),1) endif #ifeq ($(mixed-targets),1) -PHONY += checkstack +PHONY += checkstack kernelrelease kernelversion checkstack: $(OBJDUMP) -d vmlinux $$(find . -name '*.ko') | \ $(PERL) $(src)/scripts/checkstack.pl $(ARCH) kernelrelease: - $(if $(wildcard .kernelrelease), $(Q)echo $(KERNELRELEASE), \ - $(error kernelrelease not valid - run 'make *config' to update it)) + $(if $(wildcard include/config/kernel.release), $(Q)echo $(KERNELRELEASE), \ + $(error kernelrelease not valid - run 'make prepare' to update it)) kernelversion: @echo $(KERNELVERSION) @@ -1301,6 +1372,8 @@ endif $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@) %.o: %.S prepare scripts FORCE $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@) +%.symtypes: %.c prepare scripts FORCE + $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@) # Modules / %/: prepare scripts FORCE @@ -1323,7 +1396,7 @@ quiet_cmd_rmfiles = $(if $(wildcard $(rm-files)),CLEAN $(wildcard $(rm-files)) a_flags = -Wp,-MD,$(depfile) $(AFLAGS) $(AFLAGS_KERNEL) \ $(NOSTDINC_FLAGS) $(CPPFLAGS) \ - $(modkern_aflags) $(EXTRA_AFLAGS) $(AFLAGS_$(*F).o) + $(modkern_aflags) $(EXTRA_AFLAGS) $(AFLAGS_$(basetarget).o) quiet_cmd_as_o_S = AS $@ cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $< diff --git a/arch/alpha/boot/bootp.c b/arch/alpha/boot/bootp.c index ec53c28e3..3af21c789 100644 --- a/arch/alpha/boot/bootp.c +++ b/arch/alpha/boot/bootp.c @@ -9,7 +9,7 @@ */ #include #include -#include +#include #include #include diff --git a/arch/alpha/boot/bootpz.c b/arch/alpha/boot/bootpz.c index a6657f2cf..4307bde80 100644 --- a/arch/alpha/boot/bootpz.c +++ b/arch/alpha/boot/bootpz.c @@ -11,7 +11,7 @@ */ #include #include -#include +#include #include #include diff --git a/arch/alpha/boot/main.c b/arch/alpha/boot/main.c index 78c9b0b6e..90ed55b66 100644 --- a/arch/alpha/boot/main.c +++ b/arch/alpha/boot/main.c @@ -7,7 +7,7 @@ */ #include #include -#include +#include #include #include diff --git a/arch/alpha/kernel/alpha_ksyms.c b/arch/alpha/kernel/alpha_ksyms.c index 2b245ad73..f042cc42b 100644 --- a/arch/alpha/kernel/alpha_ksyms.c +++ b/arch/alpha/kernel/alpha_ksyms.c @@ -5,7 +5,6 @@ * modules. */ -#include #include #include #include @@ -15,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -53,10 +53,6 @@ extern void __divqu (void); extern void __remqu (void); EXPORT_SYMBOL(alpha_mv); -EXPORT_SYMBOL(enable_irq); -EXPORT_SYMBOL(disable_irq); -EXPORT_SYMBOL(disable_irq_nosync); -EXPORT_SYMBOL(probe_irq_mask); EXPORT_SYMBOL(screen_info); EXPORT_SYMBOL(perf_irq); EXPORT_SYMBOL(callback_getenv); @@ -68,19 +64,13 @@ EXPORT_SYMBOL(alpha_using_srm); /* platform dependent support */ EXPORT_SYMBOL(strcat); -EXPORT_SYMBOL(strcmp); EXPORT_SYMBOL(strcpy); EXPORT_SYMBOL(strlen); -EXPORT_SYMBOL(strncmp); EXPORT_SYMBOL(strncpy); -EXPORT_SYMBOL(strnlen); EXPORT_SYMBOL(strncat); -EXPORT_SYMBOL(strstr); EXPORT_SYMBOL(strchr); EXPORT_SYMBOL(strrchr); -EXPORT_SYMBOL(memcmp); EXPORT_SYMBOL(memmove); -EXPORT_SYMBOL(memscan); EXPORT_SYMBOL(__memcpy); EXPORT_SYMBOL(__memset); EXPORT_SYMBOL(__memsetw); @@ -122,11 +112,9 @@ EXPORT_SYMBOL(alpha_write_fp_reg_s); /* In-kernel system calls. */ EXPORT_SYMBOL(kernel_thread); -EXPORT_SYMBOL(sys_open); EXPORT_SYMBOL(sys_dup); EXPORT_SYMBOL(sys_exit); EXPORT_SYMBOL(sys_write); -EXPORT_SYMBOL(sys_read); EXPORT_SYMBOL(sys_lseek); EXPORT_SYMBOL(execve); EXPORT_SYMBOL(sys_setsid); diff --git a/arch/alpha/kernel/asm-offsets.c b/arch/alpha/kernel/asm-offsets.c index 6c56c754a..1dd2f02e6 100644 --- a/arch/alpha/kernel/asm-offsets.c +++ b/arch/alpha/kernel/asm-offsets.c @@ -27,7 +27,7 @@ void foo(void) DEFINE(TASK_EUID, offsetof(struct task_struct, euid)); DEFINE(TASK_GID, offsetof(struct task_struct, gid)); DEFINE(TASK_EGID, offsetof(struct task_struct, egid)); - DEFINE(TASK_REAL_PARENT, offsetof(struct task_struct, real_parent)); + DEFINE(TASK_PARENT, offsetof(struct task_struct, parent)); DEFINE(TASK_GROUP_LEADER, offsetof(struct task_struct, group_leader)); DEFINE(TASK_TGID, offsetof(struct task_struct, tgid)); BLANK(); diff --git a/arch/alpha/kernel/console.c b/arch/alpha/kernel/console.c index cb3e739fb..f313b3493 100644 --- a/arch/alpha/kernel/console.c +++ b/arch/alpha/kernel/console.c @@ -5,7 +5,6 @@ * non-0 I/O hose */ -#include #include #include #include diff --git a/arch/alpha/kernel/entry.S b/arch/alpha/kernel/entry.S index 780cb9368..428333baf 100644 --- a/arch/alpha/kernel/entry.S +++ b/arch/alpha/kernel/entry.S @@ -4,7 +4,6 @@ * Kernel entry-points. */ -#include #include #include #include diff --git a/arch/alpha/kernel/err_ev7.c b/arch/alpha/kernel/err_ev7.c index bf52ba691..fed6b3d1b 100644 --- a/arch/alpha/kernel/err_ev7.c +++ b/arch/alpha/kernel/err_ev7.c @@ -274,16 +274,14 @@ ev7_process_pal_subpacket(struct el_subpacket *header) struct el_subpacket_handler ev7_pal_subpacket_handler = SUBPACKET_HANDLER_INIT(EL_CLASS__PAL, ev7_process_pal_subpacket); -void +void ev7_register_error_handlers(void) { int i; - for(i = 0; - i #include #include #include diff --git a/arch/alpha/kernel/head.S b/arch/alpha/kernel/head.S index 0905721fc..1e2a62a1f 100644 --- a/arch/alpha/kernel/head.S +++ b/arch/alpha/kernel/head.S @@ -7,7 +7,6 @@ * the kernel global pointer and jump to the kernel entry-point. */ -#include #include #include diff --git a/arch/alpha/kernel/irq.c b/arch/alpha/kernel/irq.c index da677f829..729c475d2 100644 --- a/arch/alpha/kernel/irq.c +++ b/arch/alpha/kernel/irq.c @@ -10,7 +10,6 @@ * should be easier. */ -#include #include #include #include @@ -49,15 +48,15 @@ select_smp_affinity(unsigned int irq) static int last_cpu; int cpu = last_cpu + 1; - if (!irq_desc[irq].handler->set_affinity || irq_user_affinity[irq]) + if (!irq_desc[irq].chip->set_affinity || irq_user_affinity[irq]) return 1; while (!cpu_possible(cpu)) cpu = (cpu < (NR_CPUS-1) ? cpu + 1 : 0); last_cpu = cpu; - irq_affinity[irq] = cpumask_of_cpu(cpu); - irq_desc[irq].handler->set_affinity(irq, cpumask_of_cpu(cpu)); + irq_desc[irq].affinity = cpumask_of_cpu(cpu); + irq_desc[irq].chip->set_affinity(irq, cpumask_of_cpu(cpu)); return 0; } #endif /* CONFIG_SMP */ @@ -93,14 +92,14 @@ show_interrupts(struct seq_file *p, void *v) for_each_online_cpu(j) seq_printf(p, "%10u ", kstat_cpu(j).irqs[irq]); #endif - seq_printf(p, " %14s", irq_desc[irq].handler->typename); + seq_printf(p, " %14s", irq_desc[irq].chip->typename); seq_printf(p, " %c%s", - (action->flags & SA_INTERRUPT)?'+':' ', + (action->flags & IRQF_DISABLED)?'+':' ', action->name); for (action=action->next; action; action = action->next) { seq_printf(p, ", %c%s", - (action->flags & SA_INTERRUPT)?'+':' ', + (action->flags & IRQF_DISABLED)?'+':' ', action->name); } diff --git a/arch/alpha/kernel/irq_alpha.c b/arch/alpha/kernel/irq_alpha.c index 9d34ce26e..ddf5cf8dc 100644 --- a/arch/alpha/kernel/irq_alpha.c +++ b/arch/alpha/kernel/irq_alpha.c @@ -2,7 +2,6 @@ * Alpha specific irq code. */ -#include #include #include #include @@ -215,7 +214,7 @@ static unsigned int rtc_startup(unsigned int irq) { return 0; } struct irqaction timer_irqaction = { .handler = timer_interrupt, - .flags = SA_INTERRUPT, + .flags = IRQF_DISABLED, .name = "timer", }; @@ -233,7 +232,7 @@ void __init init_rtc_irq(void) { irq_desc[RTC_IRQ].status = IRQ_DISABLED; - irq_desc[RTC_IRQ].handler = &rtc_irq_type; + irq_desc[RTC_IRQ].chip = &rtc_irq_type; setup_irq(RTC_IRQ, &timer_irqaction); } diff --git a/arch/alpha/kernel/irq_i8259.c b/arch/alpha/kernel/irq_i8259.c index b188683b8..ebbadbc0c 100644 --- a/arch/alpha/kernel/irq_i8259.c +++ b/arch/alpha/kernel/irq_i8259.c @@ -7,7 +7,6 @@ * Started hacking from linux-2.3.30pre6/arch/i386/kernel/i8259.c. */ -#include #include #include #include @@ -109,7 +108,7 @@ init_i8259a_irqs(void) for (i = 0; i < 16; i++) { irq_desc[i].status = IRQ_DISABLED; - irq_desc[i].handler = &i8259a_irq_type; + irq_desc[i].chip = &i8259a_irq_type; } setup_irq(2, &cascade); diff --git a/arch/alpha/kernel/irq_pyxis.c b/arch/alpha/kernel/irq_pyxis.c index 146a20b9e..3b581415b 100644 --- a/arch/alpha/kernel/irq_pyxis.c +++ b/arch/alpha/kernel/irq_pyxis.c @@ -120,7 +120,7 @@ init_pyxis_irqs(unsigned long ignore_mask) if ((ignore_mask >> i) & 1) continue; irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; - irq_desc[i].handler = &pyxis_irq_type; + irq_desc[i].chip = &pyxis_irq_type; } setup_irq(16+7, &isa_cascade_irqaction); diff --git a/arch/alpha/kernel/irq_srm.c b/arch/alpha/kernel/irq_srm.c index 0a87e4669..8e4d121f8 100644 --- a/arch/alpha/kernel/irq_srm.c +++ b/arch/alpha/kernel/irq_srm.c @@ -67,7 +67,7 @@ init_srm_irqs(long max, unsigned long ignore_mask) if (i < 64 && ((ignore_mask >> i) & 1)) continue; irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; - irq_desc[i].handler = &srm_irq_type; + irq_desc[i].chip = &srm_irq_type; } } diff --git a/arch/alpha/kernel/machvec_impl.h b/arch/alpha/kernel/machvec_impl.h index 11f996f24..08b8302e6 100644 --- a/arch/alpha/kernel/machvec_impl.h +++ b/arch/alpha/kernel/machvec_impl.h @@ -6,7 +6,6 @@ * This file has goodies to help simplify instantiation of machine vectors. */ -#include #include /* Whee. These systems don't have an HAE: diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c index a693bd29d..67cd383a1 100644 --- a/arch/alpha/kernel/osf_sys.c +++ b/arch/alpha/kernel/osf_sys.c @@ -117,17 +117,21 @@ osf_filldir(void *__buf, const char *name, int namlen, loff_t offset, struct osf_dirent __user *dirent; struct osf_dirent_callback *buf = (struct osf_dirent_callback *) __buf; unsigned int reclen = ROUND_UP(NAME_OFFSET + namlen + 1); + unsigned int d_ino; buf->error = -EINVAL; /* only used if we fail */ if (reclen > buf->count) return -EINVAL; + d_ino = ino; + if (sizeof(d_ino) < sizeof(ino) && d_ino != ino) + return -EOVERFLOW; if (buf->basep) { if (put_user(offset, buf->basep)) return -EFAULT; buf->basep = NULL; } dirent = buf->dirent; - put_user(ino, &dirent->d_ino); + put_user(d_ino, &dirent->d_ino); put_user(namlen, &dirent->d_namlen); put_user(reclen, &dirent->d_reclen); if (copy_to_user(dirent->d_name, name, namlen) || @@ -245,7 +249,7 @@ do_osf_statfs(struct dentry * dentry, struct osf_statfs __user *buffer, unsigned long bufsiz) { struct kstatfs linux_stat; - int error = vfs_statfs(dentry->d_inode->i_sb, &linux_stat); + int error = vfs_statfs(dentry, &linux_stat); if (!error) error = linux_to_osf_statfs(&linux_stat, buffer, bufsiz); return error; @@ -622,7 +626,7 @@ osf_sysinfo(int command, char __user *buf, long count) printk("sysinfo(%d)", command); goto out; } - + down_read(&uts_sem); switch (offset) { diff --git a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c index 2a8b364c8..ffb7d5423 100644 --- a/arch/alpha/kernel/pci.c +++ b/arch/alpha/kernel/pci.c @@ -12,7 +12,6 @@ * Nov 2000, Ivan Kokshaysky * PCI-PCI bridges cleanup */ -#include #include #include #include @@ -124,12 +123,12 @@ DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_final); void pcibios_align_resource(void *data, struct resource *res, - unsigned long size, unsigned long align) + resource_size_t size, resource_size_t align) { struct pci_dev *dev = data; struct pci_controller *hose = dev->sysdata; unsigned long alignto; - unsigned long start = res->start; + resource_size_t start = res->start; if (res->flags & IORESOURCE_IO) { /* Make sure we start at our min on all hoses */ diff --git a/arch/alpha/kernel/process.c b/arch/alpha/kernel/process.c index c760a831f..b3a8a2980 100644 --- a/arch/alpha/kernel/process.c +++ b/arch/alpha/kernel/process.c @@ -8,7 +8,6 @@ * This file handles the architecture-dependent parts of process handling. */ -#include #include #include #include @@ -26,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -475,7 +475,7 @@ out: */ unsigned long -thread_saved_pc(task_t *t) +thread_saved_pc(struct task_struct *t) { unsigned long base = (unsigned long)task_stack_page(t); unsigned long fp, sp = task_thread_info(t)->pcb.ksp; diff --git a/arch/alpha/kernel/proto.h b/arch/alpha/kernel/proto.h index e1560fb15..2a6e3da81 100644 --- a/arch/alpha/kernel/proto.h +++ b/arch/alpha/kernel/proto.h @@ -1,4 +1,3 @@ -#include #include diff --git a/arch/alpha/kernel/setup.c b/arch/alpha/kernel/setup.c index 558b83368..a94e6d93e 100644 --- a/arch/alpha/kernel/setup.c +++ b/arch/alpha/kernel/setup.c @@ -19,9 +19,8 @@ #include #include #include -#include +#include #include -#include /* CONFIG_ALPHA_LCA etc */ #include #include #include @@ -114,8 +113,6 @@ struct alpha_machine_vector alpha_mv; int alpha_using_srm; #endif -#define N(a) (sizeof(a)/sizeof(a[0])) - static struct alpha_machine_vector *get_sysvec(unsigned long, unsigned long, unsigned long); static struct alpha_machine_vector *get_sysvec_byname(const char *); @@ -240,7 +237,7 @@ reserve_std_resources(void) standard_io_resources[0].start = RTC_PORT(0); standard_io_resources[0].end = RTC_PORT(0) + 0x10; - for (i = 0; i < N(standard_io_resources); ++i) + for (i = 0; i < ARRAY_SIZE(standard_io_resources); ++i) request_resource(io, standard_io_resources+i); } @@ -481,7 +478,7 @@ register_cpus(void) struct cpu *p = kzalloc(sizeof(*p), GFP_KERNEL); if (!p) return -ENOMEM; - register_cpu(p, i, NULL); + register_cpu(p, i); } return 0; } @@ -918,13 +915,13 @@ get_sysvec(unsigned long type, unsigned long variation, unsigned long cpu) /* Search the system tables first... */ vec = NULL; - if (type < N(systype_vecs)) { + if (type < ARRAY_SIZE(systype_vecs)) { vec = systype_vecs[type]; } else if ((type > ST_API_BIAS) && - (type - ST_API_BIAS) < N(api_vecs)) { + (type - ST_API_BIAS) < ARRAY_SIZE(api_vecs)) { vec = api_vecs[type - ST_API_BIAS]; } else if ((type > ST_UNOFFICIAL_BIAS) && - (type - ST_UNOFFICIAL_BIAS) < N(unofficial_vecs)) { + (type - ST_UNOFFICIAL_BIAS) < ARRAY_SIZE(unofficial_vecs)) { vec = unofficial_vecs[type - ST_UNOFFICIAL_BIAS]; } @@ -938,11 +935,11 @@ get_sysvec(unsigned long type, unsigned long variation, unsigned long cpu) switch (type) { case ST_DEC_ALCOR: - if (member < N(alcor_indices)) + if (member < ARRAY_SIZE(alcor_indices)) vec = alcor_vecs[alcor_indices[member]]; break; case ST_DEC_EB164: - if (member < N(eb164_indices)) + if (member < ARRAY_SIZE(eb164_indices)) vec = eb164_vecs[eb164_indices[member]]; /* PC164 may show as EB164 variation with EV56 CPU, but, since no true EB164 had anything but EV5... */ @@ -950,24 +947,24 @@ get_sysvec(unsigned long type, unsigned long variation, unsigned long cpu) vec = &pc164_mv; break; case ST_DEC_EB64P: - if (member < N(eb64p_indices)) + if (member < ARRAY_SIZE(eb64p_indices)) vec = eb64p_vecs[eb64p_indices[member]]; break; case ST_DEC_EB66: - if (member < N(eb66_indices)) + if (member < ARRAY_SIZE(eb66_indices)) vec = eb66_vecs[eb66_indices[member]]; break; case ST_DEC_MARVEL: - if (member < N(marvel_indices)) + if (member < ARRAY_SIZE(marvel_indices)) vec = marvel_vecs[marvel_indices[member]]; break; case ST_DEC_TITAN: vec = titan_vecs[0]; /* default */ - if (member < N(titan_indices)) + if (member < ARRAY_SIZE(titan_indices)) vec = titan_vecs[titan_indices[member]]; break; case ST_DEC_TSUNAMI: - if (member < N(tsunami_indices)) + if (member < ARRAY_SIZE(tsunami_indices)) vec = tsunami_vecs[tsunami_indices[member]]; break; case ST_DEC_1000: @@ -1039,7 +1036,7 @@ get_sysvec_byname(const char *name) size_t i; - for (i = 0; i < N(all_vecs); ++i) { + for (i = 0; i < ARRAY_SIZE(all_vecs); ++i) { struct alpha_machine_vector *mv = all_vecs[i]; if (strcasecmp(mv->vector_name, name) == 0) return mv; @@ -1055,13 +1052,13 @@ get_sysnames(unsigned long type, unsigned long variation, unsigned long cpu, /* If not in the tables, make it UNKNOWN, else set type name to family */ - if (type < N(systype_names)) { + if (type < ARRAY_SIZE(systype_names)) { *type_name = systype_names[type]; } else if ((type > ST_API_BIAS) && - (type - ST_API_BIAS) < N(api_names)) { + (type - ST_API_BIAS) < ARRAY_SIZE(api_names)) { *type_name = api_names[type - ST_API_BIAS]; } else if ((type > ST_UNOFFICIAL_BIAS) && - (type - ST_UNOFFICIAL_BIAS) < N(unofficial_names)) { + (type - ST_UNOFFICIAL_BIAS) < ARRAY_SIZE(unofficial_names)) { *type_name = unofficial_names[type - ST_UNOFFICIAL_BIAS]; } else { *type_name = sys_unknown; @@ -1083,7 +1080,7 @@ get_sysnames(unsigned long type, unsigned long variation, unsigned long cpu, default: /* default to variation "0" for now */ break; case ST_DEC_EB164: - if (member < N(eb164_indices)) + if (member < ARRAY_SIZE(eb164_indices)) *variation_name = eb164_names[eb164_indices[member]]; /* PC164 may show as EB164 variation, but with EV56 CPU, so, since no true EB164 had anything but EV5... */ @@ -1091,32 +1088,32 @@ get_sysnames(unsigned long type, unsigned long variation, unsigned long cpu, *variation_name = eb164_names[1]; /* make it PC164 */ break; case ST_DEC_ALCOR: - if (member < N(alcor_indices)) + if (member < ARRAY_SIZE(alcor_indices)) *variation_name = alcor_names[alcor_indices[member]]; break; case ST_DEC_EB64P: - if (member < N(eb64p_indices)) + if (member < ARRAY_SIZE(eb64p_indices)) *variation_name = eb64p_names[eb64p_indices[member]]; break; case ST_DEC_EB66: - if (member < N(eb66_indices)) + if (member < ARRAY_SIZE(eb66_indices)) *variation_name = eb66_names[eb66_indices[member]]; break; case ST_DEC_MARVEL: - if (member < N(marvel_indices)) + if (member < ARRAY_SIZE(marvel_indices)) *variation_name = marvel_names[marvel_indices[member]]; break; case ST_DEC_RAWHIDE: - if (member < N(rawhide_indices)) + if (member < ARRAY_SIZE(rawhide_indices)) *variation_name = rawhide_names[rawhide_indices[member]]; break; case ST_DEC_TITAN: *variation_name = titan_names[0]; /* default */ - if (member < N(titan_indices)) + if (member < ARRAY_SIZE(titan_indices)) *variation_name = titan_names[titan_indices[member]]; break; case ST_DEC_TSUNAMI: - if (member < N(tsunami_indices)) + if (member < ARRAY_SIZE(tsunami_indices)) *variation_name = tsunami_names[tsunami_indices[member]]; break; } @@ -1211,7 +1208,7 @@ show_cpuinfo(struct seq_file *f, void *slot) cpu_index = (unsigned) (cpu->type - 1); cpu_name = "Unknown"; - if (cpu_index < N(cpu_names)) + if (cpu_index < ARRAY_SIZE(cpu_names)) cpu_name = cpu_names[cpu_index]; get_sysnames(hwrpb->sys_type, hwrpb->sys_variation, diff --git a/arch/alpha/kernel/signal.c b/arch/alpha/kernel/signal.c index 2e45e8604..741da0945 100644 --- a/arch/alpha/kernel/signal.c +++ b/arch/alpha/kernel/signal.c @@ -375,7 +375,7 @@ give_sigsegv: static inline void __user * get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size) { - if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! on_sig_stack(sp)) + if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! sas_ss_flags(sp)) sp = current->sas_ss_sp + current->sas_ss_size; return (void __user *)((sp - frame_size) & -32ul); diff --git a/arch/alpha/kernel/smc37c93x.c b/arch/alpha/kernel/smc37c93x.c index 421e51ea6..2636cc028 100644 --- a/arch/alpha/kernel/smc37c93x.c +++ b/arch/alpha/kernel/smc37c93x.c @@ -2,7 +2,6 @@ * SMC 37C93X initialization code */ -#include #include #include diff --git a/arch/alpha/kernel/srm_env.c b/arch/alpha/kernel/srm_env.c index 5c98fc83e..990ac6102 100644 --- a/arch/alpha/kernel/srm_env.c +++ b/arch/alpha/kernel/srm_env.c @@ -57,7 +57,6 @@ */ #include -#include #include #include #include diff --git a/arch/alpha/kernel/srmcons.c b/arch/alpha/kernel/srmcons.c index 3b30d4f1f..9d7dff27f 100644 --- a/arch/alpha/kernel/srmcons.c +++ b/arch/alpha/kernel/srmcons.c @@ -5,7 +5,6 @@ * (TTY driver and console driver) */ -#include #include #include #include diff --git a/arch/alpha/kernel/sys_alcor.c b/arch/alpha/kernel/sys_alcor.c index d7f0e97fe..d6926b7b1 100644 --- a/arch/alpha/kernel/sys_alcor.c +++ b/arch/alpha/kernel/sys_alcor.c @@ -8,7 +8,6 @@ * Code supporting the ALCOR and XLT (XL-300/366/433). */ -#include #include #include #include @@ -144,7 +143,7 @@ alcor_init_irq(void) if (i >= 16+20 && i <= 16+30) continue; irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; - irq_desc[i].handler = &alcor_irq_type; + irq_desc[i].chip = &alcor_irq_type; } i8259a_irq_type.ack = alcor_isa_mask_and_ack_irq; diff --git a/arch/alpha/kernel/sys_cabriolet.c b/arch/alpha/kernel/sys_cabriolet.c index 8e3374d34..25a215067 100644 --- a/arch/alpha/kernel/sys_cabriolet.c +++ b/arch/alpha/kernel/sys_cabriolet.c @@ -9,7 +9,6 @@ * PC164 and LX164. */ -#include #include #include #include @@ -124,7 +123,7 @@ common_init_irq(void (*srm_dev_int)(unsigned long v, struct pt_regs *r)) for (i = 16; i < 35; ++i) { irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; - irq_desc[i].handler = &cabriolet_irq_type; + irq_desc[i].chip = &cabriolet_irq_type; } } diff --git a/arch/alpha/kernel/sys_dp264.c b/arch/alpha/kernel/sys_dp264.c index d5da6b1b2..dd6103b86 100644 --- a/arch/alpha/kernel/sys_dp264.c +++ b/arch/alpha/kernel/sys_dp264.c @@ -12,7 +12,6 @@ * Code supporting the DP264 (EV6+TSUNAMI). */ -#include #include #include #include @@ -300,7 +299,7 @@ init_tsunami_irqs(struct hw_interrupt_type * ops, int imin, int imax) long i; for (i = imin; i <= imax; ++i) { irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; - irq_desc[i].handler = ops; + irq_desc[i].chip = ops; } } diff --git a/arch/alpha/kernel/sys_eb64p.c b/arch/alpha/kernel/sys_eb64p.c index 61a79c354..ed108b66e 100644 --- a/arch/alpha/kernel/sys_eb64p.c +++ b/arch/alpha/kernel/sys_eb64p.c @@ -8,7 +8,6 @@ * Code supporting the EB64+ and EB66. */ -#include #include #include #include @@ -137,7 +136,7 @@ eb64p_init_irq(void) for (i = 16; i < 32; ++i) { irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; - irq_desc[i].handler = &eb64p_irq_type; + irq_desc[i].chip = &eb64p_irq_type; } common_init_isa_dma(); diff --git a/arch/alpha/kernel/sys_eiger.c b/arch/alpha/kernel/sys_eiger.c index bd6e5f0e4..64a785baf 100644 --- a/arch/alpha/kernel/sys_eiger.c +++ b/arch/alpha/kernel/sys_eiger.c @@ -154,7 +154,7 @@ eiger_init_irq(void) for (i = 16; i < 128; ++i) { irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; - irq_desc[i].handler = &eiger_irq_type; + irq_desc[i].chip = &eiger_irq_type; } } diff --git a/arch/alpha/kernel/sys_jensen.c b/arch/alpha/kernel/sys_jensen.c index fcabb7c96..4ac2b328b 100644 --- a/arch/alpha/kernel/sys_jensen.c +++ b/arch/alpha/kernel/sys_jensen.c @@ -74,7 +74,7 @@ jensen_local_startup(unsigned int irq) * the IPL from being dropped during handler processing. */ if (irq_desc[irq].action) - irq_desc[irq].action->flags |= SA_INTERRUPT; + irq_desc[irq].action->flags |= IRQF_DISABLED; return 0; } @@ -206,11 +206,11 @@ jensen_init_irq(void) { init_i8259a_irqs(); - irq_desc[1].handler = &jensen_local_irq_type; - irq_desc[4].handler = &jensen_local_irq_type; - irq_desc[3].handler = &jensen_local_irq_type; - irq_desc[7].handler = &jensen_local_irq_type; - irq_desc[9].handler = &jensen_local_irq_type; + irq_desc[1].chip = &jensen_local_irq_type; + irq_desc[4].chip = &jensen_local_irq_type; + irq_desc[3].chip = &jensen_local_irq_type; + irq_desc[7].chip = &jensen_local_irq_type; + irq_desc[9].chip = &jensen_local_irq_type; common_init_isa_dma(); } diff --git a/arch/alpha/kernel/sys_marvel.c b/arch/alpha/kernel/sys_marvel.c index e32fee505..36d215954 100644 --- a/arch/alpha/kernel/sys_marvel.c +++ b/arch/alpha/kernel/sys_marvel.c @@ -303,7 +303,7 @@ init_io7_irqs(struct io7 *io7, /* Set up the lsi irqs. */ for (i = 0; i < 128; ++i) { irq_desc[base + i].status = IRQ_DISABLED | IRQ_LEVEL; - irq_desc[base + i].handler = lsi_ops; + irq_desc[base + i].chip = lsi_ops; } /* Disable the implemented irqs in hardware. */ @@ -317,7 +317,7 @@ init_io7_irqs(struct io7 *io7, /* Set up the msi irqs. */ for (i = 128; i < (128 + 512); ++i) { irq_desc[base + i].status = IRQ_DISABLED | IRQ_LEVEL; - irq_desc[base + i].handler = msi_ops; + irq_desc[base + i].chip = msi_ops; } for (i = 0; i < 16; ++i) @@ -335,7 +335,7 @@ marvel_init_irq(void) /* Reserve the legacy irqs. */ for (i = 0; i < 16; ++i) { irq_desc[i].status = IRQ_DISABLED; - irq_desc[i].handler = &marvel_legacy_irq_type; + irq_desc[i].chip = &marvel_legacy_irq_type; } /* Init the io7 irqs. */ diff --git a/arch/alpha/kernel/sys_mikasa.c b/arch/alpha/kernel/sys_mikasa.c index d78a0daa6..cc4c58111 100644 --- a/arch/alpha/kernel/sys_mikasa.c +++ b/arch/alpha/kernel/sys_mikasa.c @@ -8,7 +8,6 @@ * Code supporting the MIKASA (AlphaServer 1000). */ -#include #include #include #include @@ -117,7 +116,7 @@ mikasa_init_irq(void) for (i = 16; i < 32; ++i) { irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; - irq_desc[i].handler = &mikasa_irq_type; + irq_desc[i].chip = &mikasa_irq_type; } init_i8259a_irqs(); diff --git a/arch/alpha/kernel/sys_noritake.c b/arch/alpha/kernel/sys_noritake.c index 65061f5d7..2d3cff7e8 100644 --- a/arch/alpha/kernel/sys_noritake.c +++ b/arch/alpha/kernel/sys_noritake.c @@ -9,7 +9,6 @@ * CORELLE (AlphaServer 800), and ALCOR Primo (AlphaStation 600A). */ -#include #include #include #include @@ -139,7 +138,7 @@ noritake_init_irq(void) for (i = 16; i < 48; ++i) { irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; - irq_desc[i].handler = &noritake_irq_type; + irq_desc[i].chip = &noritake_irq_type; } init_i8259a_irqs(); diff --git a/arch/alpha/kernel/sys_rawhide.c b/arch/alpha/kernel/sys_rawhide.c index 05888a02a..949607e3d 100644 --- a/arch/alpha/kernel/sys_rawhide.c +++ b/arch/alpha/kernel/sys_rawhide.c @@ -180,7 +180,7 @@ rawhide_init_irq(void) for (i = 16; i < 128; ++i) { irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; - irq_desc[i].handler = &rawhide_irq_type; + irq_desc[i].chip = &rawhide_irq_type; } init_i8259a_irqs(); diff --git a/arch/alpha/kernel/sys_ruffian.c b/arch/alpha/kernel/sys_ruffian.c index 78c30decf..5b99cf3cd 100644 --- a/arch/alpha/kernel/sys_ruffian.c +++ b/arch/alpha/kernel/sys_ruffian.c @@ -182,16 +182,16 @@ static unsigned long __init ruffian_get_bank_size(unsigned long offset) { unsigned long bank_addr, bank, ret = 0; - + /* Valid offsets are: 0x800, 0x840 and 0x880 since Ruffian only uses three banks. */ bank_addr = (unsigned long)PYXIS_MCR + offset; bank = *(vulp)bank_addr; - + /* Check BANK_ENABLE */ if (bank & 0x01) { static unsigned long size[] __initdata = { - 0x40000000UL, /* 0x00, 1G */ + 0x40000000UL, /* 0x00, 1G */ 0x20000000UL, /* 0x02, 512M */ 0x10000000UL, /* 0x04, 256M */ 0x08000000UL, /* 0x06, 128M */ @@ -203,7 +203,7 @@ ruffian_get_bank_size(unsigned long offset) }; bank = (bank & 0x1e) >> 1; - if (bank < sizeof(size)/sizeof(*size)) + if (bank < ARRAY_SIZE(size)) ret = size[bank]; } diff --git a/arch/alpha/kernel/sys_rx164.c b/arch/alpha/kernel/sys_rx164.c index 584042430..6ae506052 100644 --- a/arch/alpha/kernel/sys_rx164.c +++ b/arch/alpha/kernel/sys_rx164.c @@ -117,7 +117,7 @@ rx164_init_irq(void) rx164_update_irq_hw(0); for (i = 16; i < 40; ++i) { irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; - irq_desc[i].handler = &rx164_irq_type; + irq_desc[i].chip = &rx164_irq_type; } init_i8259a_irqs(); diff --git a/arch/alpha/kernel/sys_sable.c b/arch/alpha/kernel/sys_sable.c index a7ff84474..a7a14647b 100644 --- a/arch/alpha/kernel/sys_sable.c +++ b/arch/alpha/kernel/sys_sable.c @@ -8,7 +8,6 @@ * Code supporting the Sable, Sable-Gamma, and Lynx systems. */ -#include #include #include #include @@ -537,7 +536,7 @@ sable_lynx_init_irq(int nr_irqs) for (i = 0; i < nr_irqs; ++i) { irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; - irq_desc[i].handler = &sable_lynx_irq_type; + irq_desc[i].chip = &sable_lynx_irq_type; } common_init_isa_dma(); diff --git a/arch/alpha/kernel/sys_sio.c b/arch/alpha/kernel/sys_sio.c index 131a2d9f7..a654014d2 100644 --- a/arch/alpha/kernel/sys_sio.c +++ b/arch/alpha/kernel/sys_sio.c @@ -10,14 +10,13 @@ * Kenetics's Platform 2000, Avanti (AlphaStation), XL, and AlphaBook1. */ -#include #include #include #include #include #include #include -#include +#include #include #include diff --git a/arch/alpha/kernel/sys_takara.c b/arch/alpha/kernel/sys_takara.c index 7955bdfc2..2c75cd1fd 100644 --- a/arch/alpha/kernel/sys_takara.c +++ b/arch/alpha/kernel/sys_takara.c @@ -154,7 +154,7 @@ takara_init_irq(void) for (i = 16; i < 128; ++i) { irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; - irq_desc[i].handler = &takara_irq_type; + irq_desc[i].chip = &takara_irq_type; } common_init_isa_dma(); diff --git a/arch/alpha/kernel/sys_titan.c b/arch/alpha/kernel/sys_titan.c index 2551fb49a..302aab38d 100644 --- a/arch/alpha/kernel/sys_titan.c +++ b/arch/alpha/kernel/sys_titan.c @@ -12,7 +12,6 @@ * Granite */ -#include #include #include #include @@ -189,7 +188,7 @@ init_titan_irqs(struct hw_interrupt_type * ops, int imin, int imax) long i; for (i = imin; i <= imax; ++i) { irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; - irq_desc[i].handler = ops; + irq_desc[i].chip = ops; } } @@ -280,15 +279,15 @@ titan_late_init(void) * all reported to the kernel as machine checks, so the handler * is a nop so it can be called to count the individual events. */ - request_irq(63+16, titan_intr_nop, SA_INTERRUPT, + request_irq(63+16, titan_intr_nop, IRQF_DISABLED, "CChip Error", NULL); - request_irq(62+16, titan_intr_nop, SA_INTERRUPT, + request_irq(62+16, titan_intr_nop, IRQF_DISABLED, "PChip 0 H_Error", NULL); - request_irq(61+16, titan_intr_nop, SA_INTERRUPT, + request_irq(61+16, titan_intr_nop, IRQF_DISABLED, "PChip 1 H_Error", NULL); - request_irq(60+16, titan_intr_nop, SA_INTERRUPT, + request_irq(60+16, titan_intr_nop, IRQF_DISABLED, "PChip 0 C_Error", NULL); - request_irq(59+16, titan_intr_nop, SA_INTERRUPT, + request_irq(59+16, titan_intr_nop, IRQF_DISABLED, "PChip 1 C_Error", NULL); /* @@ -349,9 +348,9 @@ privateer_init_pci(void) * Hook a couple of extra err interrupts that the * common titan code won't. */ - request_irq(53+16, titan_intr_nop, SA_INTERRUPT, + request_irq(53+16, titan_intr_nop, IRQF_DISABLED, "NMI", NULL); - request_irq(50+16, titan_intr_nop, SA_INTERRUPT, + request_irq(50+16, titan_intr_nop, IRQF_DISABLED, "Temperature Warning", NULL); /* diff --git a/arch/alpha/kernel/sys_wildfire.c b/arch/alpha/kernel/sys_wildfire.c index 1553f4702..22c5798fe 100644 --- a/arch/alpha/kernel/sys_wildfire.c +++ b/arch/alpha/kernel/sys_wildfire.c @@ -199,14 +199,14 @@ wildfire_init_irq_per_pca(int qbbno, int pcano) if (i == 2) continue; irq_desc[i+irq_bias].status = IRQ_DISABLED | IRQ_LEVEL; - irq_desc[i+irq_bias].handler = &wildfire_irq_type; + irq_desc[i+irq_bias].chip = &wildfire_irq_type; } irq_desc[36+irq_bias].status = IRQ_DISABLED | IRQ_LEVEL; - irq_desc[36+irq_bias].handler = &wildfire_irq_type; + irq_desc[36+irq_bias].chip = &wildfire_irq_type; for (i = 40; i < 64; ++i) { irq_desc[i+irq_bias].status = IRQ_DISABLED | IRQ_LEVEL; - irq_desc[i+irq_bias].handler = &wildfire_irq_type; + irq_desc[i+irq_bias].chip = &wildfire_irq_type; } setup_irq(32+irq_bias, &isa_enable); diff --git a/arch/alpha/kernel/systbls.S b/arch/alpha/kernel/systbls.S index 1c8da544d..fa818f41f 100644 --- a/arch/alpha/kernel/systbls.S +++ b/arch/alpha/kernel/systbls.S @@ -4,7 +4,6 @@ * The system call table. */ -#include /* CONFIG_OSF4_COMPAT */ #include .data diff --git a/arch/alpha/kernel/time.c b/arch/alpha/kernel/time.c index 385974981..b191cc759 100644 --- a/arch/alpha/kernel/time.c +++ b/arch/alpha/kernel/time.c @@ -27,7 +27,6 @@ * 2003-06-03 R. Scott Bailey * Tighten sanity in time_init from 1% (10,000 PPM) to 250 PPM */ -#include #include #include #include @@ -234,7 +233,7 @@ validate_cc_value(unsigned long cc) index = cpu->type & 0xffffffff; /* If index out of bounds, no way to validate. */ - if (index >= sizeof(cpu_hz)/sizeof(cpu_hz[0])) + if (index >= ARRAY_SIZE(cpu_hz)) return cc; /* If index contains no data, no way to validate. */ diff --git a/arch/alpha/kernel/traps.c b/arch/alpha/kernel/traps.c index f9d12319e..d6e665d56 100644 --- a/arch/alpha/kernel/traps.c +++ b/arch/alpha/kernel/traps.c @@ -8,7 +8,6 @@ * This file initializes the trap entry points */ -#include #include #include #include diff --git a/arch/alpha/kernel/vmlinux.lds.S b/arch/alpha/kernel/vmlinux.lds.S index 0922e0785..71470e9d9 100644 --- a/arch/alpha/kernel/vmlinux.lds.S +++ b/arch/alpha/kernel/vmlinux.lds.S @@ -1,4 +1,3 @@ -#include #include OUTPUT_FORMAT("elf64-alpha") diff --git a/arch/alpha/lib/callback_srm.S b/arch/alpha/lib/callback_srm.S index 0528acd0d..8804bec2c 100644 --- a/arch/alpha/lib/callback_srm.S +++ b/arch/alpha/lib/callback_srm.S @@ -2,7 +2,6 @@ * arch/alpha/lib/callback_srm.S */ -#include #include .text diff --git a/arch/alpha/lib/udelay.c b/arch/alpha/lib/udelay.c index 1c879bbce..69d52aa37 100644 --- a/arch/alpha/lib/udelay.c +++ b/arch/alpha/lib/udelay.c @@ -4,7 +4,6 @@ * Delay routines, using a pre-computed "loops_per_jiffy" value. */ -#include #include #include /* for udelay's use of smp_processor_id */ #include diff --git a/arch/alpha/mm/extable.c b/arch/alpha/mm/extable.c index c3849baeb..dc7aeda15 100644 --- a/arch/alpha/mm/extable.c +++ b/arch/alpha/mm/extable.c @@ -2,7 +2,6 @@ * linux/arch/alpha/mm/extable.c */ -#include #include #include diff --git a/arch/alpha/mm/fault.c b/arch/alpha/mm/fault.c index 64ace5a9c..622dabd84 100644 --- a/arch/alpha/mm/fault.c +++ b/arch/alpha/mm/fault.c @@ -4,7 +4,6 @@ * Copyright (C) 1995 Linus Torvalds */ -#include #include #include #include diff --git a/arch/alpha/mm/init.c b/arch/alpha/mm/init.c index d513caec5..f45b42f69 100644 --- a/arch/alpha/mm/init.c +++ b/arch/alpha/mm/init.c @@ -6,7 +6,6 @@ /* 2.3.x zone allocator, 1999 Andrea Arcangeli */ -#include #include #include #include diff --git a/arch/alpha/mm/numa.c b/arch/alpha/mm/numa.c index bf6b65c81..b826f58c6 100644 --- a/arch/alpha/mm/numa.c +++ b/arch/alpha/mm/numa.c @@ -6,7 +6,6 @@ * Copyright (C) 2001 Andrea Arcangeli SuSE */ -#include #include #include #include diff --git a/arch/alpha/oprofile/common.c b/arch/alpha/oprofile/common.c index ba788cfdc..9fc0eeb4f 100644 --- a/arch/alpha/oprofile/common.c +++ b/arch/alpha/oprofile/common.c @@ -112,7 +112,7 @@ op_axp_create_files(struct super_block * sb, struct dentry * root) for (i = 0; i < model->num_counters; ++i) { struct dentry *dir; - char buf[3]; + char buf[4]; snprintf(buf, sizeof buf, "%d", i); dir = oprofilefs_mkdir(sb, root, buf); diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 4c43ee0d9..1ab0864f0 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -47,6 +47,18 @@ config MCA (and especially the web page given there) before attempting to build an MCA bus kernel. +config GENERIC_HARDIRQS + bool + default y + +config HARDIRQS_SW_RESEND + bool + default y + +config GENERIC_IRQ_PROBE + bool + default y + config RWSEM_GENERIC_SPINLOCK bool default y @@ -93,15 +105,49 @@ choice prompt "ARM system type" default ARCH_VERSATILE +config ARCH_AAEC2000 + bool "Agilent AAEC-2000 based" + select ARM_AMBA + help + This enables support for systems based on the Agilent AAEC-2000 + +config ARCH_INTEGRATOR + bool "ARM Ltd. Integrator family" + select ARM_AMBA + select ICST525 + help + Support for ARM's Integrator platform. + +config ARCH_REALVIEW + bool "ARM Ltd. RealView family" + select ARM_AMBA + select ICST307 + help + This enables support for ARM Ltd RealView boards. + +config ARCH_VERSATILE + bool "ARM Ltd. Versatile family" + select ARM_AMBA + select ARM_VIC + select ICST307 + help + This enables support for ARM Ltd Versatile board. + +config ARCH_AT91 + bool "Atmel AT91" + help + This enables support for systems based on the Atmel AT91RM9200 + and AT91SAM9xxx processors. + config ARCH_CLPS7500 - bool "Cirrus-CL-PS7500FE" + bool "Cirrus CL-PS7500FE" select TIMER_ACORN select ISA help Support for the Cirrus Logic PS7500FE system-on-a-chip. config ARCH_CLPS711X - bool "CLPS711x/EP721x-based" + bool "Cirrus Logic CLPS711x/EP721x-based" help Support for Cirrus Logic 711x/721x based boards. @@ -135,32 +181,46 @@ config ARCH_FOOTBRIDGE Support for systems based on the DC21285 companion chip ("FootBridge"), such as the Simtec CATS and the Rebel NetWinder. -config ARCH_INTEGRATOR - bool "Integrator" - select ARM_AMBA - select ICST525 +config ARCH_NETX + bool "Hilscher NetX based" + select ARM_VIC help - Support for ARM's Integrator platform. + This enables support for systems based on the Hilscher NetX Soc + +config ARCH_H720X + bool "Hynix HMS720x-based" + select ISA_DMA_API + help + This enables support for systems based on the Hynix HMS720x + +config ARCH_IMX + bool "IMX" + help + Support for Motorola's i.MX family of processors (MX1, MXL). config ARCH_IOP3XX bool "IOP3xx-based" + depends on MMU select PCI help Support for Intel's IOP3XX (XScale) family of processors. config ARCH_IXP4XX bool "IXP4xx-based" + depends on MMU help Support for Intel's IXP4XX (XScale) family of processors. config ARCH_IXP2000 bool "IXP2400/2800-based" + depends on MMU select PCI help Support for Intel's IXP2400/2800 (XScale) family of processors. config ARCH_IXP23XX bool "IXP23XX-based" + depends on MMU select PCI help Support for Intel's IXP23xx (XScale) family of processors. @@ -178,8 +238,14 @@ config ARCH_L7200 If you have any questions or comments about the Linux kernel port to this board, send e-mail to . +config ARCH_PNX4008 + bool "Philips Nexperia PNX4008 Mobile" + help + This enables support for Philips PNX4008 mobile platform. + config ARCH_PXA bool "PXA2xx-based" + depends on MMU select ARCH_MTD_XIP help Support for Intel's PXA2XX processor line. @@ -204,7 +270,7 @@ config ARCH_SA1100 Support for StrongARM 11x0 based boards. config ARCH_S3C2410 - bool "Samsung S3C2410" + bool "Samsung S3C2410, S3C2412, S3C2413, S3C2440, S3C2442" help Samsung S3C2410X CPU based systems, such as the Simtec Electronics BAST (), the IPAQ 1940 or @@ -232,44 +298,6 @@ config ARCH_OMAP help Support for TI's OMAP platform (OMAP1 and OMAP2). -config ARCH_VERSATILE - bool "Versatile" - select ARM_AMBA - select ARM_VIC - select ICST307 - help - This enables support for ARM Ltd Versatile board. - -config ARCH_REALVIEW - bool "RealView" - select ARM_AMBA - select ICST307 - help - This enables support for ARM Ltd RealView boards. - -config ARCH_IMX - bool "IMX" - help - Support for Motorola's i.MX family of processors (MX1, MXL). - -config ARCH_H720X - bool "Hynix-HMS720x-based" - select ISA_DMA_API - help - This enables support for systems based on the Hynix HMS720x - -config ARCH_AAEC2000 - bool "Agilent AAEC-2000 based" - select ARM_AMBA - help - This enables support for systems based on the Agilent AAEC-2000 - -config ARCH_AT91RM9200 - bool "AT91RM9200" - help - Say Y here if you intend to run this kernel on an Atmel - AT91RM9200-based board. - endchoice source "arch/arm/mach-clps711x/Kconfig" @@ -314,6 +342,8 @@ source "arch/arm/mach-realview/Kconfig" source "arch/arm/mach-at91rm9200/Kconfig" +source "arch/arm/mach-netx/Kconfig" + # Definitions to make life easier config ARCH_ACORN bool @@ -326,6 +356,10 @@ config XSCALE_PMU depends on CPU_XSCALE && !XSCALE_PMU_TIMER default y +if !MMU +source "arch/arm/Kconfig-nommu" +endif + endmenu source "arch/arm/common/Kconfig" @@ -359,7 +393,7 @@ config ISA_DMA_API bool config PCI - bool "PCI support" if ARCH_INTEGRATOR_AP || ARCH_VERSATILE_PB + bool "PCI support" if ARCH_INTEGRATOR_AP || ARCH_VERSATILE_PB || ARCH_IXP4XX help Find out whether you have a PCI motherboard. PCI is the name of a bus system, i.e. the way the CPU talks to the other stuff inside @@ -525,7 +559,7 @@ config LEDS ARCH_LUBBOCK || MACH_MAINSTONE || ARCH_NETWINDER || \ ARCH_OMAP || ARCH_P720T || ARCH_PXA_IDP || \ ARCH_SA1100 || ARCH_SHARK || ARCH_VERSATILE || \ - ARCH_AT91RM9200 + ARCH_AT91RM9200 || MACH_TRIZEPS4 help If you say Y here, the LEDs on your machine will be used to provide useful information about your current system status. @@ -656,7 +690,7 @@ config XIP_PHYS_ADDR endmenu -if (ARCH_SA1100 || ARCH_INTEGRATOR || ARCH_OMAP1) +if (ARCH_SA1100 || ARCH_INTEGRATOR || ARCH_OMAP) menu "CPU Frequency scaling" diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 6f8e84c1c..92873cdee 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -47,7 +47,8 @@ comma = , # testing for a specific architecture or later rather impossible. arch-$(CONFIG_CPU_32v6) :=-D__LINUX_ARM_ARCH__=6 $(call cc-option,-march=armv6,-march=armv5t -Wa$(comma)-march=armv6) arch-$(CONFIG_CPU_32v6K) :=-D__LINUX_ARM_ARCH__=6 $(call cc-option,-march=armv6k,-march=armv5t -Wa$(comma)-march=armv6k) -arch-$(CONFIG_CPU_32v5) :=-D__LINUX_ARM_ARCH__=5 $(call cc-option,-march=armv5te,-march=armv4) +arch-$(CONFIG_CPU_32v5) :=-D__LINUX_ARM_ARCH__=5 $(call cc-option,-march=armv5te,-march=armv4t) +arch-$(CONFIG_CPU_32v4T) :=-D__LINUX_ARM_ARCH__=4 -march=armv4t arch-$(CONFIG_CPU_32v4) :=-D__LINUX_ARM_ARCH__=4 -march=armv4 arch-$(CONFIG_CPU_32v3) :=-D__LINUX_ARM_ARCH__=3 -march=armv3 @@ -114,8 +115,10 @@ endif machine-$(CONFIG_ARCH_H720X) := h720x machine-$(CONFIG_ARCH_AAEC2000) := aaec2000 machine-$(CONFIG_ARCH_REALVIEW) := realview - machine-$(CONFIG_ARCH_AT91RM9200) := at91rm9200 + machine-$(CONFIG_ARCH_AT91) := at91rm9200 machine-$(CONFIG_ARCH_EP93XX) := ep93xx + machine-$(CONFIG_ARCH_PNX4008) := pnx4008 + machine-$(CONFIG_ARCH_NETX) := netx ifeq ($(CONFIG_ARCH_EBSA110),y) # This is what happens if you forget the IOCS16 line. @@ -175,7 +178,7 @@ boot := arch/arm/boot # them changed. We use .arch to indicate when they were updated # last, otherwise make uses the target directory mtime. -include/asm-arm/.arch: $(wildcard include/config/arch/*.h) include/config/MARKER +include/asm-arm/.arch: $(wildcard include/config/arch/*.h) include/config/auto.conf @echo ' SYMLINK include/asm-arm/arch -> include/asm-arm/$(INCDIR)' ifneq ($(KBUILD_SRC),) $(Q)mkdir -p include/asm-arm diff --git a/arch/arm/boot/compressed/head-at91rm9200.S b/arch/arm/boot/compressed/head-at91rm9200.S index 2119ea62b..d68b9acd8 100644 --- a/arch/arm/boot/compressed/head-at91rm9200.S +++ b/arch/arm/boot/compressed/head-at91rm9200.S @@ -49,6 +49,24 @@ cmp r7, r3 beq 99f + @ Embest ATEB9200 : 923 + mov r3, #(MACH_TYPE_ATEB9200 & 0xff) + orr r3, r3, #(MACH_TYPE_ATEB9200 & 0xff00) + cmp r7, r3 + beq 99f + + @ Sperry-Sun KAFA : 662 + mov r3, #(MACH_TYPE_KAFA & 0xff) + orr r3, r3, #(MACH_TYPE_KAFA & 0xff00) + cmp r7, r3 + beq 99f + + @ Ajeco 1ARM : 1075 + mov r3, #(MACH_TYPE_ONEARM & 0xff) + orr r3, r3, #(MACH_TYPE_ONEARM & 0xff00) + cmp r7, r3 + beq 99f + @ Unknown board, use the AT91RM9200DK board @ mov r7, #MACH_TYPE_AT91RM9200 mov r7, #(MACH_TYPE_AT91RM9200DK & 0xff) diff --git a/arch/arm/boot/compressed/head-clps7500.S b/arch/arm/boot/compressed/head-clps7500.S index 4a8a689d1..941c5f5cb 100644 --- a/arch/arm/boot/compressed/head-clps7500.S +++ b/arch/arm/boot/compressed/head-clps7500.S @@ -4,7 +4,6 @@ * Copyright (C) 1999, 2000, 2001 Nexus Electronics Ltd */ -#include /* There are three different ways the kernel can be booted on a 7500 system: from Angel (loaded in RAM), from diff --git a/arch/arm/boot/compressed/head-l7200.S b/arch/arm/boot/compressed/head-l7200.S index b08bd23f8..d0e3b2085 100644 --- a/arch/arm/boot/compressed/head-l7200.S +++ b/arch/arm/boot/compressed/head-l7200.S @@ -7,7 +7,6 @@ * is merged with head.S by the linker. */ -#include #include #ifndef CONFIG_ARCH_L7200 diff --git a/arch/arm/boot/compressed/head-sa1100.S b/arch/arm/boot/compressed/head-sa1100.S index 5aefffd46..4c8c0e460 100644 --- a/arch/arm/boot/compressed/head-sa1100.S +++ b/arch/arm/boot/compressed/head-sa1100.S @@ -7,7 +7,6 @@ * */ -#include #include #include diff --git a/arch/arm/boot/compressed/head-sharpsl.S b/arch/arm/boot/compressed/head-sharpsl.S index d6bf8a2b0..eb0084ea1 100644 --- a/arch/arm/boot/compressed/head-sharpsl.S +++ b/arch/arm/boot/compressed/head-sharpsl.S @@ -7,11 +7,11 @@ * so we have to figure out the machine for ourselves... * * Support for Poodle, Corgi (SL-C700), Shepherd (SL-C750) - * and Husky (SL-C760). + * Husky (SL-C760), Tosa (SL-C6000), Spitz (SL-C3000), + * Akita (SL-C1000) and Borzoi (SL-C3100). * */ -#include #include #include @@ -23,6 +23,22 @@ __SharpSL_start: +/* Check for TC6393 - if found we have a Tosa */ + ldr r7, .TOSAID + mov r1, #0x10000000 @ Base address of TC6393 chip + mov r6, #0x03 + ldrh r3, [r1, #8] @ Load TC6393XB Revison: This is 0x0003 + cmp r6, r3 + beq .SHARPEND @ Success -> tosa + +/* Check for pxa270 - if found, branch */ + mrc p15, 0, r4, c0, c0 @ Get Processor ID + and r4, r4, #0xffffff00 + ldr r3, .PXA270ID + cmp r4, r3 + beq .PXA270 + +/* Check for w100 - if not found we have a Poodle */ ldr r1, .W100ADDR @ Base address of w100 chip + regs offset mov r6, #0x31 @ Load Magic Init value @@ -30,7 +46,7 @@ __SharpSL_start: mov r5, #0x3000 .W100LOOP: subs r5, r5, #1 - bne .W100LOOP + bne .W100LOOP mov r6, #0x30 @ Load 2nd Magic Init value str r6, [r1, #0x280] @ to SCRATCH_UMSK @@ -40,45 +56,52 @@ __SharpSL_start: cmp r6, r3 bne .SHARPEND @ We have no w100 - Poodle - mrc p15, 0, r6, c0, c0 @ Get Processor ID - and r6, r6, #0xffffff00 +/* Check for pxa250 - if found we have a Corgi */ ldr r7, .CORGIID ldr r3, .PXA255ID - cmp r6, r3 + cmp r4, r3 blo .SHARPEND @ We have a PXA250 - Corgi - mov r1, #0x0c000000 @ Base address of NAND chip - ldrb r3, [r1, #24] @ Load FLASHCTL - bic r3, r3, #0x11 @ SET NCE - orr r3, r3, #0x0a @ SET CLR + FLWP - strb r3, [r1, #24] @ Save to FLASHCTL - mov r2, #0x90 @ Command "readid" - strb r2, [r1, #20] @ Save to FLASHIO - bic r3, r3, #2 @ CLR CLE - orr r3, r3, #4 @ SET ALE - strb r3, [r1, #24] @ Save to FLASHCTL - mov r2, #0 @ Address 0x00 - strb r2, [r1, #20] @ Save to FLASHIO - bic r3, r3, #4 @ CLR ALE - strb r3, [r1, #24] @ Save to FLASHCTL -.SHARP1: - ldrb r3, [r1, #24] @ Load FLASHCTL - tst r3, #32 @ Is chip ready? - beq .SHARP1 - ldrb r2, [r1, #20] @ NAND Manufacturer ID - ldrb r3, [r1, #20] @ NAND Chip ID +/* Check for 64MiB flash - if found we have a Shepherd */ + bl get_flash_ids ldr r7, .SHEPHERDID cmp r3, #0x76 @ 64MiB flash beq .SHARPEND @ We have Shepherd + +/* Must be a Husky */ ldr r7, .HUSKYID @ Must be Husky b .SHARPEND +.PXA270: +/* Check for 16MiB flash - if found we have Spitz */ + bl get_flash_ids + ldr r7, .SPITZID + cmp r3, #0x73 @ 16MiB flash + beq .SHARPEND @ We have Spitz + +/* Check for a second SCOOP chip - if found we have Borzoi */ + ldr r1, .SCOOP2ADDR + ldr r7, .BORZOIID + mov r6, #0x0140 + strh r6, [r1] + ldrh r6, [r1] + cmp r6, #0x0140 + beq .SHARPEND @ We have Borzoi + +/* Must be Akita */ + ldr r7, .AKITAID + b .SHARPEND @ We have Borzoi + .PXA255ID: .word 0x69052d00 @ PXA255 Processor ID +.PXA270ID: + .word 0x69054100 @ PXA270 Processor ID .W100ID: .word 0x57411002 @ w100 Chip ID .W100ADDR: .word 0x08010000 @ w100 Chip ID Reg Address +.SCOOP2ADDR: + .word 0x08800040 .POODLEID: .word MACH_TYPE_POODLE .CORGIID: @@ -87,6 +110,41 @@ __SharpSL_start: .word MACH_TYPE_SHEPHERD .HUSKYID: .word MACH_TYPE_HUSKY -.SHARPEND: +.TOSAID: + .word MACH_TYPE_TOSA +.SPITZID: + .word MACH_TYPE_SPITZ +.AKITAID: + .word MACH_TYPE_AKITA +.BORZOIID: + .word MACH_TYPE_BORZOI +/* + * Return: r2 - NAND Manufacturer ID + * r3 - NAND Chip ID + * Corrupts: r1 + */ +get_flash_ids: + mov r1, #0x0c000000 @ Base address of NAND chip + ldrb r3, [r1, #24] @ Load FLASHCTL + bic r3, r3, #0x11 @ SET NCE + orr r3, r3, #0x0a @ SET CLR + FLWP + strb r3, [r1, #24] @ Save to FLASHCTL + mov r2, #0x90 @ Command "readid" + strb r2, [r1, #20] @ Save to FLASHIO + bic r3, r3, #2 @ CLR CLE + orr r3, r3, #4 @ SET ALE + strb r3, [r1, #24] @ Save to FLASHCTL + mov r2, #0 @ Address 0x00 + strb r2, [r1, #20] @ Save to FLASHIO + bic r3, r3, #4 @ CLR ALE + strb r3, [r1, #24] @ Save to FLASHCTL +.fids1: + ldrb r3, [r1, #24] @ Load FLASHCTL + tst r3, #32 @ Is chip ready? + beq .fids1 + ldrb r2, [r1, #20] @ NAND Manufacturer ID + ldrb r3, [r1, #20] @ NAND Chip ID + mov pc, lr +.SHARPEND: diff --git a/arch/arm/boot/compressed/head-xscale.S b/arch/arm/boot/compressed/head-xscale.S index d3fe25339..73c5d9e02 100644 --- a/arch/arm/boot/compressed/head-xscale.S +++ b/arch/arm/boot/compressed/head-xscale.S @@ -5,7 +5,6 @@ * */ -#include #include #include diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S index b56f5e691..14a9ff9c6 100644 --- a/arch/arm/boot/compressed/head.S +++ b/arch/arm/boot/compressed/head.S @@ -8,7 +8,6 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ -#include #include /* @@ -448,8 +447,11 @@ __common_mmu_cache_on: mov r1, #-1 mcr p15, 0, r3, c2, c0, 0 @ load page table pointer mcr p15, 0, r1, c3, c0, 0 @ load domain access control - mcr p15, 0, r0, c1, c0, 0 @ load control register - mov pc, lr + b 1f + .align 5 @ cache line aligned +1: mcr p15, 0, r0, c1, c0, 0 @ load control register + mrc p15, 0, r0, c1, c0, 0 @ and read it back to + sub pc, lr, r0, lsr #32 @ properly flush pipeline /* * All code following this line is relocatable. It is relocated by @@ -605,8 +607,8 @@ proc_types: b __armv4_mmu_cache_off b __armv4_mmu_cache_flush - .word 0x00070000 @ ARMv6 - .word 0x000f0000 + .word 0x0007b000 @ ARMv6 + .word 0x0007f000 b __armv4_mmu_cache_on b __armv4_mmu_cache_off b __armv6_mmu_cache_flush diff --git a/arch/arm/boot/compressed/ll_char_wr.S b/arch/arm/boot/compressed/ll_char_wr.S index d7bbd9da2..8517c8606 100644 --- a/arch/arm/boot/compressed/ll_char_wr.S +++ b/arch/arm/boot/compressed/ll_char_wr.S @@ -77,7 +77,7 @@ Lrow4bpplp: subne r1, r1, #1 ldrneb r7, [r6, r1] bne Lrow4bpplp - LOADREGS(fd, sp!, {r4 - r7, pc}) + ldmfd sp!, {r4 - r7, pc} @ @ Smashable regs: {r0 - r3}, [r4], {r5 - r7}, (r8 - fp), [ip], (sp), {lr}, (pc) @@ -105,7 +105,7 @@ Lrow8bpplp: subne r1, r1, #1 ldrneb r7, [r6, r1] bne Lrow8bpplp - LOADREGS(fd, sp!, {r4 - r7, pc}) + ldmfd sp!, {r4 - r7, pc} @ @ Smashable regs: {r0 - r3}, [r4], {r5, r6}, [r7], (r8 - fp), [ip], (sp), [lr], (pc) @@ -127,7 +127,7 @@ Lrow1bpp: strb r7, [r0], r5 mov r7, r7, lsr #8 strb r7, [r0], r5 - LOADREGS(fd, sp!, {r4 - r7, pc}) + ldmfd sp!, {r4 - r7, pc} .bss ENTRY(con_charconvtable) diff --git a/arch/arm/common/Makefile b/arch/arm/common/Makefile index 847e3e635..e1289a256 100644 --- a/arch/arm/common/Makefile +++ b/arch/arm/common/Makefile @@ -16,3 +16,4 @@ obj-$(CONFIG_SHARP_PARAM) += sharpsl_param.o obj-$(CONFIG_SHARPSL_PM) += sharpsl_pm.o obj-$(CONFIG_SHARP_SCOOP) += scoop.o obj-$(CONFIG_ARCH_IXP2000) += uengine.o +obj-$(CONFIG_ARCH_IXP23XX) += uengine.o diff --git a/arch/arm/common/dmabounce.c b/arch/arm/common/dmabounce.c index 7971d0dc6..028bdc922 100644 --- a/arch/arm/common/dmabounce.c +++ b/arch/arm/common/dmabounce.c @@ -77,6 +77,8 @@ struct dmabounce_device_info { #endif struct dmabounce_pool small; struct dmabounce_pool large; + + rwlock_t lock; }; static LIST_HEAD(dmabounce_devs); @@ -116,6 +118,7 @@ alloc_safe_buffer(struct dmabounce_device_info *device_info, void *ptr, struct safe_buffer *buf; struct dmabounce_pool *pool; struct device *dev = device_info->dev; + unsigned long flags; dev_dbg(dev, "%s(ptr=%p, size=%d, dir=%d)\n", __func__, ptr, size, dir); @@ -163,8 +166,12 @@ alloc_safe_buffer(struct dmabounce_device_info *device_info, void *ptr, print_alloc_stats(device_info); #endif + write_lock_irqsave(&device_info->lock, flags); + list_add(&buf->node, &device_info->safe_buffers); + write_unlock_irqrestore(&device_info->lock, flags); + return buf; } @@ -172,22 +179,34 @@ alloc_safe_buffer(struct dmabounce_device_info *device_info, void *ptr, static inline struct safe_buffer * find_safe_buffer(struct dmabounce_device_info *device_info, dma_addr_t safe_dma_addr) { - struct safe_buffer *b; + struct safe_buffer *b, *rb = NULL; + unsigned long flags; + + read_lock_irqsave(&device_info->lock, flags); list_for_each_entry(b, &device_info->safe_buffers, node) - if (b->safe_dma_addr == safe_dma_addr) - return b; + if (b->safe_dma_addr == safe_dma_addr) { + rb = b; + break; + } - return NULL; + read_unlock_irqrestore(&device_info->lock, flags); + return rb; } static inline void free_safe_buffer(struct dmabounce_device_info *device_info, struct safe_buffer *buf) { + unsigned long flags; + dev_dbg(device_info->dev, "%s(buf=%p)\n", __func__, buf); + write_lock_irqsave(&device_info->lock, flags); + list_del(&buf->node); + write_unlock_irqrestore(&device_info->lock, flags); + if (buf->pool) dma_pool_free(buf->pool->pool, buf->safe, buf->safe_dma_addr); else @@ -396,7 +415,6 @@ dma_addr_t dma_map_single(struct device *dev, void *ptr, size_t size, enum dma_data_direction dir) { - unsigned long flags; dma_addr_t dma_addr; dev_dbg(dev, "%s(ptr=%p,size=%d,dir=%x)\n", @@ -404,12 +422,8 @@ dma_map_single(struct device *dev, void *ptr, size_t size, BUG_ON(dir == DMA_NONE); - local_irq_save(flags); - dma_addr = map_single(dev, ptr, size, dir); - local_irq_restore(flags); - return dma_addr; } @@ -424,25 +438,18 @@ void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, enum dma_data_direction dir) { - unsigned long flags; - dev_dbg(dev, "%s(ptr=%p,size=%d,dir=%x)\n", __func__, (void *) dma_addr, size, dir); BUG_ON(dir == DMA_NONE); - local_irq_save(flags); - unmap_single(dev, dma_addr, size, dir); - - local_irq_restore(flags); } int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, enum dma_data_direction dir) { - unsigned long flags; int i; dev_dbg(dev, "%s(sg=%p,nents=%d,dir=%x)\n", @@ -450,8 +457,6 @@ dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, BUG_ON(dir == DMA_NONE); - local_irq_save(flags); - for (i = 0; i < nents; i++, sg++) { struct page *page = sg->page; unsigned int offset = sg->offset; @@ -462,8 +467,6 @@ dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, map_single(dev, ptr, length, dir); } - local_irq_restore(flags); - return nents; } @@ -471,7 +474,6 @@ void dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nents, enum dma_data_direction dir) { - unsigned long flags; int i; dev_dbg(dev, "%s(sg=%p,nents=%d,dir=%x)\n", @@ -479,55 +481,38 @@ dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nents, BUG_ON(dir == DMA_NONE); - local_irq_save(flags); - for (i = 0; i < nents; i++, sg++) { dma_addr_t dma_addr = sg->dma_address; unsigned int length = sg->length; unmap_single(dev, dma_addr, length, dir); } - - local_irq_restore(flags); } void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_addr, size_t size, enum dma_data_direction dir) { - unsigned long flags; - dev_dbg(dev, "%s(ptr=%p,size=%d,dir=%x)\n", __func__, (void *) dma_addr, size, dir); - local_irq_save(flags); - sync_single(dev, dma_addr, size, dir); - - local_irq_restore(flags); } void dma_sync_single_for_device(struct device *dev, dma_addr_t dma_addr, size_t size, enum dma_data_direction dir) { - unsigned long flags; - dev_dbg(dev, "%s(ptr=%p,size=%d,dir=%x)\n", __func__, (void *) dma_addr, size, dir); - local_irq_save(flags); - sync_single(dev, dma_addr, size, dir); - - local_irq_restore(flags); } void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nents, enum dma_data_direction dir) { - unsigned long flags; int i; dev_dbg(dev, "%s(sg=%p,nents=%d,dir=%x)\n", @@ -535,23 +520,18 @@ dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nents, BUG_ON(dir == DMA_NONE); - local_irq_save(flags); - for (i = 0; i < nents; i++, sg++) { dma_addr_t dma_addr = sg->dma_address; unsigned int length = sg->length; sync_single(dev, dma_addr, length, dir); } - - local_irq_restore(flags); } void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nents, enum dma_data_direction dir) { - unsigned long flags; int i; dev_dbg(dev, "%s(sg=%p,nents=%d,dir=%x)\n", @@ -559,16 +539,12 @@ dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nents, BUG_ON(dir == DMA_NONE); - local_irq_save(flags); - for (i = 0; i < nents; i++, sg++) { dma_addr_t dma_addr = sg->dma_address; unsigned int length = sg->length; sync_single(dev, dma_addr, length, dir); } - - local_irq_restore(flags); } static int @@ -622,6 +598,7 @@ dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size, device_info->dev = dev; INIT_LIST_HEAD(&device_info->safe_buffers); + rwlock_init(&device_info->lock); #ifdef STATS device_info->total_allocs = 0; diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c index c02dc8116..f3e020f22 100644 --- a/arch/arm/common/gic.c +++ b/arch/arm/common/gic.c @@ -33,6 +33,7 @@ static void __iomem *gic_dist_base; static void __iomem *gic_cpu_base; +static DEFINE_SPINLOCK(irq_controller_lock); /* * Routines to acknowledge, disable and enable interrupts @@ -52,41 +53,55 @@ static void __iomem *gic_cpu_base; static void gic_ack_irq(unsigned int irq) { u32 mask = 1 << (irq % 32); + + spin_lock(&irq_controller_lock); writel(mask, gic_dist_base + GIC_DIST_ENABLE_CLEAR + (irq / 32) * 4); writel(irq, gic_cpu_base + GIC_CPU_EOI); + spin_unlock(&irq_controller_lock); } static void gic_mask_irq(unsigned int irq) { u32 mask = 1 << (irq % 32); + + spin_lock(&irq_controller_lock); writel(mask, gic_dist_base + GIC_DIST_ENABLE_CLEAR + (irq / 32) * 4); + spin_unlock(&irq_controller_lock); } static void gic_unmask_irq(unsigned int irq) { u32 mask = 1 << (irq % 32); + + spin_lock(&irq_controller_lock); writel(mask, gic_dist_base + GIC_DIST_ENABLE_SET + (irq / 32) * 4); + spin_unlock(&irq_controller_lock); } #ifdef CONFIG_SMP -static void gic_set_cpu(struct irqdesc *desc, unsigned int irq, unsigned int cpu) +static void gic_set_cpu(unsigned int irq, cpumask_t mask_val) { void __iomem *reg = gic_dist_base + GIC_DIST_TARGET + (irq & ~3); unsigned int shift = (irq % 4) * 8; + unsigned int cpu = first_cpu(mask_val); u32 val; + spin_lock(&irq_controller_lock); + irq_desc[irq].cpu = cpu; val = readl(reg) & ~(0xff << shift); val |= 1 << (cpu + shift); writel(val, reg); + spin_unlock(&irq_controller_lock); } #endif -static struct irqchip gic_chip = { +static struct irq_chip gic_chip = { + .name = "GIC", .ack = gic_ack_irq, .mask = gic_mask_irq, .unmask = gic_unmask_irq, #ifdef CONFIG_SMP - .set_cpu = gic_set_cpu, + .set_affinity = gic_set_cpu, #endif }; diff --git a/arch/arm/common/locomo.c b/arch/arm/common/locomo.c index 41f12658c..4e0dcaef6 100644 --- a/arch/arm/common/locomo.c +++ b/arch/arm/common/locomo.c @@ -15,19 +15,17 @@ * Based on sa1111.c */ -#include #include #include #include #include #include #include -#include +#include #include #include #include -#include #include #include #include @@ -61,7 +59,7 @@ struct locomo { unsigned long phys; unsigned int irq; spinlock_t lock; - void *base; + void __iomem *base; }; struct locomo_dev_info { @@ -163,7 +161,7 @@ static void locomo_handler(unsigned int irq, struct irqdesc *desc, { int req, i; struct irqdesc *d; - void *mapbase = get_irq_chipdata(irq); + void __iomem *mapbase = get_irq_chipdata(irq); /* Acknowledge the parent IRQ */ desc->chip->ack(irq); @@ -177,7 +175,7 @@ static void locomo_handler(unsigned int irq, struct irqdesc *desc, d = irq_desc + irq; for (i = 0; i <= 3; i++, d++, irq++) { if (req & (0x0100 << i)) { - d->handle(irq, d, regs); + desc_handle_irq(irq, d, regs); } } @@ -190,7 +188,7 @@ static void locomo_ack_irq(unsigned int irq) static void locomo_mask_irq(unsigned int irq) { - void *mapbase = get_irq_chipdata(irq); + void __iomem *mapbase = get_irq_chipdata(irq); unsigned int r; r = locomo_readl(mapbase + LOCOMO_ICR); r &= ~(0x0010 << (irq - LOCOMO_IRQ_START)); @@ -199,14 +197,15 @@ static void locomo_mask_irq(unsigned int irq) static void locomo_unmask_irq(unsigned int irq) { - void *mapbase = get_irq_chipdata(irq); + void __iomem *mapbase = get_irq_chipdata(irq); unsigned int r; r = locomo_readl(mapbase + LOCOMO_ICR); r |= (0x0010 << (irq - LOCOMO_IRQ_START)); locomo_writel(r, mapbase + LOCOMO_ICR); } -static struct irqchip locomo_chip = { +static struct irq_chip locomo_chip = { + .name = "LOCOMO", .ack = locomo_ack_irq, .mask = locomo_mask_irq, .unmask = locomo_unmask_irq, @@ -216,17 +215,17 @@ static void locomo_key_handler(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs) { struct irqdesc *d; - void *mapbase = get_irq_chipdata(irq); + void __iomem *mapbase = get_irq_chipdata(irq); if (locomo_readl(mapbase + LOCOMO_KEYBOARD + LOCOMO_KIC) & 0x0001) { d = irq_desc + LOCOMO_IRQ_KEY_START; - d->handle(LOCOMO_IRQ_KEY_START, d, regs); + desc_handle_irq(LOCOMO_IRQ_KEY_START, d, regs); } } static void locomo_key_ack_irq(unsigned int irq) { - void *mapbase = get_irq_chipdata(irq); + void __iomem *mapbase = get_irq_chipdata(irq); unsigned int r; r = locomo_readl(mapbase + LOCOMO_KEYBOARD + LOCOMO_KIC); r &= ~(0x0100 << (irq - LOCOMO_IRQ_KEY_START)); @@ -235,7 +234,7 @@ static void locomo_key_ack_irq(unsigned int irq) static void locomo_key_mask_irq(unsigned int irq) { - void *mapbase = get_irq_chipdata(irq); + void __iomem *mapbase = get_irq_chipdata(irq); unsigned int r; r = locomo_readl(mapbase + LOCOMO_KEYBOARD + LOCOMO_KIC); r &= ~(0x0010 << (irq - LOCOMO_IRQ_KEY_START)); @@ -244,14 +243,15 @@ static void locomo_key_mask_irq(unsigned int irq) static void locomo_key_unmask_irq(unsigned int irq) { - void *mapbase = get_irq_chipdata(irq); + void __iomem *mapbase = get_irq_chipdata(irq); unsigned int r; r = locomo_readl(mapbase + LOCOMO_KEYBOARD + LOCOMO_KIC); r |= (0x0010 << (irq - LOCOMO_IRQ_KEY_START)); locomo_writel(r, mapbase + LOCOMO_KEYBOARD + LOCOMO_KIC); } -static struct irqchip locomo_key_chip = { +static struct irq_chip locomo_key_chip = { + .name = "LOCOMO-key", .ack = locomo_key_ack_irq, .mask = locomo_key_mask_irq, .unmask = locomo_key_unmask_irq, @@ -262,7 +262,7 @@ static void locomo_gpio_handler(unsigned int irq, struct irqdesc *desc, { int req, i; struct irqdesc *d; - void *mapbase = get_irq_chipdata(irq); + void __iomem *mapbase = get_irq_chipdata(irq); req = locomo_readl(mapbase + LOCOMO_GIR) & locomo_readl(mapbase + LOCOMO_GPD) & @@ -273,7 +273,7 @@ static void locomo_gpio_handler(unsigned int irq, struct irqdesc *desc, d = irq_desc + LOCOMO_IRQ_GPIO_START; for (i = 0; i <= 15; i++, irq++, d++) { if (req & (0x0001 << i)) { - d->handle(irq, d, regs); + desc_handle_irq(irq, d, regs); } } } @@ -281,7 +281,7 @@ static void locomo_gpio_handler(unsigned int irq, struct irqdesc *desc, static void locomo_gpio_ack_irq(unsigned int irq) { - void *mapbase = get_irq_chipdata(irq); + void __iomem *mapbase = get_irq_chipdata(irq); unsigned int r; r = locomo_readl(mapbase + LOCOMO_GWE); r |= (0x0001 << (irq - LOCOMO_IRQ_GPIO_START)); @@ -298,7 +298,7 @@ static void locomo_gpio_ack_irq(unsigned int irq) static void locomo_gpio_mask_irq(unsigned int irq) { - void *mapbase = get_irq_chipdata(irq); + void __iomem *mapbase = get_irq_chipdata(irq); unsigned int r; r = locomo_readl(mapbase + LOCOMO_GIE); r &= ~(0x0001 << (irq - LOCOMO_IRQ_GPIO_START)); @@ -307,14 +307,15 @@ static void locomo_gpio_mask_irq(unsigned int irq) static void locomo_gpio_unmask_irq(unsigned int irq) { - void *mapbase = get_irq_chipdata(irq); + void __iomem *mapbase = get_irq_chipdata(irq); unsigned int r; r = locomo_readl(mapbase + LOCOMO_GIE); r |= (0x0001 << (irq - LOCOMO_IRQ_GPIO_START)); locomo_writel(r, mapbase + LOCOMO_GIE); } -static struct irqchip locomo_gpio_chip = { +static struct irq_chip locomo_gpio_chip = { + .name = "LOCOMO-gpio", .ack = locomo_gpio_ack_irq, .mask = locomo_gpio_mask_irq, .unmask = locomo_gpio_unmask_irq, @@ -324,17 +325,17 @@ static void locomo_lt_handler(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs) { struct irqdesc *d; - void *mapbase = get_irq_chipdata(irq); + void __iomem *mapbase = get_irq_chipdata(irq); if (locomo_readl(mapbase + LOCOMO_LTINT) & 0x0001) { d = irq_desc + LOCOMO_IRQ_LT_START; - d->handle(LOCOMO_IRQ_LT_START, d, regs); + desc_handle_irq(LOCOMO_IRQ_LT_START, d, regs); } } static void locomo_lt_ack_irq(unsigned int irq) { - void *mapbase = get_irq_chipdata(irq); + void __iomem *mapbase = get_irq_chipdata(irq); unsigned int r; r = locomo_readl(mapbase + LOCOMO_LTINT); r &= ~(0x0100 << (irq - LOCOMO_IRQ_LT_START)); @@ -343,7 +344,7 @@ static void locomo_lt_ack_irq(unsigned int irq) static void locomo_lt_mask_irq(unsigned int irq) { - void *mapbase = get_irq_chipdata(irq); + void __iomem *mapbase = get_irq_chipdata(irq); unsigned int r; r = locomo_readl(mapbase + LOCOMO_LTINT); r &= ~(0x0010 << (irq - LOCOMO_IRQ_LT_START)); @@ -352,14 +353,15 @@ static void locomo_lt_mask_irq(unsigned int irq) static void locomo_lt_unmask_irq(unsigned int irq) { - void *mapbase = get_irq_chipdata(irq); + void __iomem *mapbase = get_irq_chipdata(irq); unsigned int r; r = locomo_readl(mapbase + LOCOMO_LTINT); r |= (0x0010 << (irq - LOCOMO_IRQ_LT_START)); locomo_writel(r, mapbase + LOCOMO_LTINT); } -static struct irqchip locomo_lt_chip = { +static struct irq_chip locomo_lt_chip = { + .name = "LOCOMO-lt", .ack = locomo_lt_ack_irq, .mask = locomo_lt_mask_irq, .unmask = locomo_lt_unmask_irq, @@ -370,7 +372,7 @@ static void locomo_spi_handler(unsigned int irq, struct irqdesc *desc, { int req, i; struct irqdesc *d; - void *mapbase = get_irq_chipdata(irq); + void __iomem *mapbase = get_irq_chipdata(irq); req = locomo_readl(mapbase + LOCOMO_SPIIR) & 0x000F; if (req) { @@ -379,7 +381,7 @@ static void locomo_spi_handler(unsigned int irq, struct irqdesc *desc, for (i = 0; i <= 3; i++, irq++, d++) { if (req & (0x0001 << i)) { - d->handle(irq, d, regs); + desc_handle_irq(irq, d, regs); } } } @@ -387,7 +389,7 @@ static void locomo_spi_handler(unsigned int irq, struct irqdesc *desc, static void locomo_spi_ack_irq(unsigned int irq) { - void *mapbase = get_irq_chipdata(irq); + void __iomem *mapbase = get_irq_chipdata(irq); unsigned int r; r = locomo_readl(mapbase + LOCOMO_SPIWE); r |= (0x0001 << (irq - LOCOMO_IRQ_SPI_START)); @@ -404,7 +406,7 @@ static void locomo_spi_ack_irq(unsigned int irq) static void locomo_spi_mask_irq(unsigned int irq) { - void *mapbase = get_irq_chipdata(irq); + void __iomem *mapbase = get_irq_chipdata(irq); unsigned int r; r = locomo_readl(mapbase + LOCOMO_SPIIE); r &= ~(0x0001 << (irq - LOCOMO_IRQ_SPI_START)); @@ -413,14 +415,15 @@ static void locomo_spi_mask_irq(unsigned int irq) static void locomo_spi_unmask_irq(unsigned int irq) { - void *mapbase = get_irq_chipdata(irq); + void __iomem *mapbase = get_irq_chipdata(irq); unsigned int r; r = locomo_readl(mapbase + LOCOMO_SPIIE); r |= (0x0001 << (irq - LOCOMO_IRQ_SPI_START)); locomo_writel(r, mapbase + LOCOMO_SPIIE); } -static struct irqchip locomo_spi_chip = { +static struct irq_chip locomo_spi_chip = { + .name = "LOCOMO-spi", .ack = locomo_spi_ack_irq, .mask = locomo_spi_mask_irq, .unmask = locomo_spi_unmask_irq, @@ -429,7 +432,7 @@ static struct irqchip locomo_spi_chip = { static void locomo_setup_irq(struct locomo *lchip) { int irq; - void *irqbase = lchip->base; + void __iomem *irqbase = lchip->base; /* * Install handler for IRQ_LOCOMO_HW. @@ -502,14 +505,13 @@ locomo_init_one_child(struct locomo *lchip, struct locomo_dev_info *info) struct locomo_dev *dev; int ret; - dev = kmalloc(sizeof(struct locomo_dev), GFP_KERNEL); + dev = kzalloc(sizeof(struct locomo_dev), GFP_KERNEL); if (!dev) { ret = -ENOMEM; goto out; } - memset(dev, 0, sizeof(struct locomo_dev)); - strncpy(dev->dev.bus_id,info->name,sizeof(dev->dev.bus_id)); + strncpy(dev->dev.bus_id, info->name, sizeof(dev->dev.bus_id)); /* * If the parent device has a DMA mask associated with it, * propagate it down to the children. @@ -541,6 +543,96 @@ locomo_init_one_child(struct locomo *lchip, struct locomo_dev_info *info) return ret; } +#ifdef CONFIG_PM + +struct locomo_save_data { + u16 LCM_GPO; + u16 LCM_SPICT; + u16 LCM_GPE; + u16 LCM_ASD; + u16 LCM_SPIMD; +}; + +static int locomo_suspend(struct platform_device *dev, pm_message_t state) +{ + struct locomo *lchip = platform_get_drvdata(dev); + struct locomo_save_data *save; + unsigned long flags; + + save = kmalloc(sizeof(struct locomo_save_data), GFP_KERNEL); + if (!save) + return -ENOMEM; + + dev->dev.power.saved_state = (void *) save; + + spin_lock_irqsave(&lchip->lock, flags); + + save->LCM_GPO = locomo_readl(lchip->base + LOCOMO_GPO); /* GPIO */ + locomo_writel(0x00, lchip->base + LOCOMO_GPO); + save->LCM_SPICT = locomo_readl(lchip->base + LOCOMO_SPICT); /* SPI */ + locomo_writel(0x40, lchip->base + LOCOMO_SPICT); + save->LCM_GPE = locomo_readl(lchip->base + LOCOMO_GPE); /* GPIO */ + locomo_writel(0x00, lchip->base + LOCOMO_GPE); + save->LCM_ASD = locomo_readl(lchip->base + LOCOMO_ASD); /* ADSTART */ + locomo_writel(0x00, lchip->base + LOCOMO_ASD); + save->LCM_SPIMD = locomo_readl(lchip->base + LOCOMO_SPIMD); /* SPI */ + locomo_writel(0x3C14, lchip->base + LOCOMO_SPIMD); + + locomo_writel(0x00, lchip->base + LOCOMO_PAIF); + locomo_writel(0x00, lchip->base + LOCOMO_DAC); + locomo_writel(0x00, lchip->base + LOCOMO_BACKLIGHT + LOCOMO_TC); + + if ( (locomo_readl(lchip->base + LOCOMO_LED + LOCOMO_LPT0) & 0x88) && (locomo_readl(lchip->base + LOCOMO_LED + LOCOMO_LPT1) & 0x88) ) + locomo_writel(0x00, lchip->base + LOCOMO_C32K); /* CLK32 off */ + else + /* 18MHz already enabled, so no wait */ + locomo_writel(0xc1, lchip->base + LOCOMO_C32K); /* CLK32 on */ + + locomo_writel(0x00, lchip->base + LOCOMO_TADC); /* 18MHz clock off*/ + locomo_writel(0x00, lchip->base + LOCOMO_AUDIO + LOCOMO_ACC); /* 22MHz/24MHz clock off */ + locomo_writel(0x00, lchip->base + LOCOMO_FRONTLIGHT + LOCOMO_ALS); /* FL */ + + spin_unlock_irqrestore(&lchip->lock, flags); + + return 0; +} + +static int locomo_resume(struct platform_device *dev) +{ + struct locomo *lchip = platform_get_drvdata(dev); + struct locomo_save_data *save; + unsigned long r; + unsigned long flags; + + save = (struct locomo_save_data *) dev->dev.power.saved_state; + if (!save) + return 0; + + spin_lock_irqsave(&lchip->lock, flags); + + locomo_writel(save->LCM_GPO, lchip->base + LOCOMO_GPO); + locomo_writel(save->LCM_SPICT, lchip->base + LOCOMO_SPICT); + locomo_writel(save->LCM_GPE, lchip->base + LOCOMO_GPE); + locomo_writel(save->LCM_ASD, lchip->base + LOCOMO_ASD); + locomo_writel(save->LCM_SPIMD, lchip->base + LOCOMO_SPIMD); + + locomo_writel(0x00, lchip->base + LOCOMO_C32K); + locomo_writel(0x90, lchip->base + LOCOMO_TADC); + + locomo_writel(0, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KSC); + r = locomo_readl(lchip->base + LOCOMO_KEYBOARD + LOCOMO_KIC); + r &= 0xFEFF; + locomo_writel(r, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KIC); + locomo_writel(0x1, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KCMD); + + spin_unlock_irqrestore(&lchip->lock, flags); + kfree(save); + + return 0; +} +#endif + + /** * locomo_probe - probe for a single LoCoMo chip. * @phys_addr: physical address of device. @@ -560,12 +652,10 @@ __locomo_probe(struct device *me, struct resource *mem, int irq) unsigned long r; int i, ret = -ENODEV; - lchip = kmalloc(sizeof(struct locomo), GFP_KERNEL); + lchip = kzalloc(sizeof(struct locomo), GFP_KERNEL); if (!lchip) return -ENOMEM; - memset(lchip, 0, sizeof(struct locomo)); - spin_lock_init(&lchip->lock); lchip->dev = me; @@ -597,9 +687,10 @@ __locomo_probe(struct device *me, struct resource *mem, int irq) , lchip->base + LOCOMO_GPD); locomo_writel(0, lchip->base + LOCOMO_GIE); - /* FrontLight */ + /* Frontlight */ locomo_writel(0, lchip->base + LOCOMO_FRONTLIGHT + LOCOMO_ALS); locomo_writel(0, lchip->base + LOCOMO_FRONTLIGHT + LOCOMO_ALD); + /* Longtime timer */ locomo_writel(0, lchip->base + LOCOMO_LTINT); /* SPI */ @@ -643,7 +734,6 @@ __locomo_probe(struct device *me, struct resource *mem, int irq) for (i = 0; i < ARRAY_SIZE(locomo_devices); i++) locomo_init_one_child(lchip, &locomo_devices[i]); - return 0; out: @@ -651,15 +741,15 @@ __locomo_probe(struct device *me, struct resource *mem, int irq) return ret; } -static void __locomo_remove(struct locomo *lchip) +static int locomo_remove_child(struct device *dev, void *data) { - struct list_head *l, *n; - - list_for_each_safe(l, n, &lchip->dev->children) { - struct device *d = list_to_dev(l); + device_unregister(dev); + return 0; +} - device_unregister(d); - } +static void __locomo_remove(struct locomo *lchip) +{ + device_for_each_child(lchip->dev, NULL, locomo_remove_child); if (lchip->irq != NO_IRQ) { set_irq_chained_handler(lchip->irq, NULL); @@ -670,27 +760,28 @@ static void __locomo_remove(struct locomo *lchip) kfree(lchip); } -static int locomo_probe(struct device *dev) +static int locomo_probe(struct platform_device *dev) { - struct platform_device *pdev = to_platform_device(dev); struct resource *mem; int irq; - mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); + mem = platform_get_resource(dev, IORESOURCE_MEM, 0); if (!mem) return -EINVAL; - irq = platform_get_irq(pdev, 0); + irq = platform_get_irq(dev, 0); + if (irq < 0) + return -ENXIO; - return __locomo_probe(dev, mem, irq); + return __locomo_probe(&dev->dev, mem, irq); } -static int locomo_remove(struct device *dev) +static int locomo_remove(struct platform_device *dev) { - struct locomo *lchip = dev_get_drvdata(dev); + struct locomo *lchip = platform_get_drvdata(dev); if (lchip) { __locomo_remove(lchip); - dev_set_drvdata(dev, NULL); + platform_set_drvdata(dev, NULL); } return 0; @@ -702,11 +793,16 @@ static int locomo_remove(struct device *dev) * the per-machine level, and then have this driver pick * up the registered devices. */ -static struct device_driver locomo_device_driver = { - .name = "locomo", - .bus = &platform_bus_type, +static struct platform_driver locomo_device_driver = { .probe = locomo_probe, .remove = locomo_remove, +#ifdef CONFIG_PM + .suspend = locomo_suspend, + .resume = locomo_resume, +#endif + .driver = { + .name = "locomo", + }, }; /* @@ -950,6 +1046,30 @@ void locomo_m62332_senddata(struct locomo_dev *ldev, unsigned int dac_data, int spin_unlock_irqrestore(&lchip->lock, flags); } +/* + * Frontlight control + */ + +static struct locomo *locomo_chip_driver(struct locomo_dev *ldev); + +void locomo_frontlight_set(struct locomo_dev *dev, int duty, int vr, int bpwf) +{ + unsigned long flags; + struct locomo *lchip = locomo_chip_driver(dev); + + if (vr) + locomo_gpio_write(dev, LOCOMO_GPIO_FL_VR, 1); + else + locomo_gpio_write(dev, LOCOMO_GPIO_FL_VR, 0); + + spin_lock_irqsave(&lchip->lock, flags); + locomo_writel(bpwf, lchip->base + LOCOMO_FRONTLIGHT + LOCOMO_ALS); + udelay(100); + locomo_writel(duty, lchip->base + LOCOMO_FRONTLIGHT + LOCOMO_ALD); + locomo_writel(bpwf | LOCOMO_ALC_EN, lchip->base + LOCOMO_FRONTLIGHT + LOCOMO_ALS); + spin_unlock_irqrestore(&lchip->lock, flags); +} + /* * LoCoMo "Register Access Bus." * @@ -1011,14 +1131,14 @@ static int locomo_bus_remove(struct device *dev) struct bus_type locomo_bus_type = { .name = "locomo-bus", .match = locomo_match, + .probe = locomo_bus_probe, + .remove = locomo_bus_remove, .suspend = locomo_bus_suspend, .resume = locomo_bus_resume, }; int locomo_driver_register(struct locomo_driver *driver) { - driver->drv.probe = locomo_bus_probe; - driver->drv.remove = locomo_bus_remove; driver->drv.bus = &locomo_bus_type; return driver_register(&driver->drv); } @@ -1032,13 +1152,13 @@ static int __init locomo_init(void) { int ret = bus_register(&locomo_bus_type); if (ret == 0) - driver_register(&locomo_device_driver); + platform_driver_register(&locomo_device_driver); return ret; } static void __exit locomo_exit(void) { - driver_unregister(&locomo_device_driver); + platform_driver_unregister(&locomo_device_driver); bus_unregister(&locomo_bus_type); } diff --git a/arch/arm/common/rtctime.c b/arch/arm/common/rtctime.c index 35c9a64ac..4e5445cfb 100644 --- a/arch/arm/common/rtctime.c +++ b/arch/arm/common/rtctime.c @@ -68,6 +68,7 @@ void rtc_next_alarm_time(struct rtc_time *next, struct rtc_time *now, struct rtc rtc_time_to_tm(next_time, next); } } +EXPORT_SYMBOL(rtc_next_alarm_time); static inline int rtc_arm_read_time(struct rtc_ops *ops, struct rtc_time *tm) { diff --git a/arch/arm/common/sa1111.c b/arch/arm/common/sa1111.c index 3f68db84e..29818bd32 100644 --- a/arch/arm/common/sa1111.c +++ b/arch/arm/common/sa1111.c @@ -14,7 +14,6 @@ * All initialization functions provided here are intended to be called * from machine specific code with proper arguments when required. */ -#include #include #include #include @@ -151,7 +150,7 @@ static void sa1111_irq_handler(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs) { unsigned int stat0, stat1, i; - void __iomem *base = desc->data; + void __iomem *base = get_irq_data(irq); stat0 = sa1111_readl(base + SA1111_INTSTATCLR0); stat1 = sa1111_readl(base + SA1111_INTSTATCLR1); @@ -169,11 +168,11 @@ sa1111_irq_handler(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs) for (i = IRQ_SA1111_START; stat0; i++, stat0 >>= 1) if (stat0 & 1) - do_edge_IRQ(i, irq_desc + i, regs); + handle_edge_irq(i, irq_desc + i, regs); for (i = IRQ_SA1111_START + 32; stat1; i++, stat1 >>= 1) if (stat1 & 1) - do_edge_IRQ(i, irq_desc + i, regs); + handle_edge_irq(i, irq_desc + i, regs); /* For level-based interrupts */ desc->chip->unmask(irq); @@ -273,7 +272,8 @@ static int sa1111_wake_lowirq(unsigned int irq, unsigned int on) return 0; } -static struct irqchip sa1111_low_chip = { +static struct irq_chip sa1111_low_chip = { + .name = "SA1111-l", .ack = sa1111_ack_irq, .mask = sa1111_mask_lowirq, .unmask = sa1111_unmask_lowirq, @@ -369,7 +369,8 @@ static int sa1111_wake_highirq(unsigned int irq, unsigned int on) return 0; } -static struct irqchip sa1111_high_chip = { +static struct irq_chip sa1111_high_chip = { + .name = "SA1111-h", .ack = sa1111_ack_irq, .mask = sa1111_mask_highirq, .unmask = sa1111_unmask_highirq, @@ -617,7 +618,7 @@ __sa1111_probe(struct device *me, struct resource *mem, int irq) { struct sa1111 *sachip; unsigned long id; - unsigned int has_devs, val; + unsigned int has_devs; int i, ret = -ENODEV; sachip = kzalloc(sizeof(struct sa1111), GFP_KERNEL); @@ -668,6 +669,9 @@ __sa1111_probe(struct device *me, struct resource *mem, int irq) sa1111_wake(sachip); #ifdef CONFIG_ARCH_SA1100 + { + unsigned int val; + /* * The SDRAM configuration of the SA1110 and the SA1111 must * match. This is very important to ensure that SA1111 accesses @@ -691,6 +695,7 @@ __sa1111_probe(struct device *me, struct resource *mem, int irq) * Enable the SA1110 memory bus request and grant signals. */ sa1110_mb_enable(); + } #endif /* diff --git a/arch/arm/common/sharpsl_pm.c b/arch/arm/common/sharpsl_pm.c index 3cd8c9ee4..59b5ddec4 100644 --- a/arch/arm/common/sharpsl_pm.c +++ b/arch/arm/common/sharpsl_pm.c @@ -49,13 +49,6 @@ #define SHARPSL_CHARGE_CO_CHECK_TIME 5 /* 5 msec */ #define SHARPSL_CHARGE_RETRY_CNT 1 /* eqv. 10 min */ -#define SHARPSL_CHARGE_ON_VOLT 0x99 /* 2.9V */ -#define SHARPSL_CHARGE_ON_TEMP 0xe0 /* 2.9V */ -#define SHARPSL_CHARGE_ON_ACIN_HIGH 0x9b /* 6V */ -#define SHARPSL_CHARGE_ON_ACIN_LOW 0x34 /* 2V */ -#define SHARPSL_FATAL_ACIN_VOLT 182 /* 3.45V */ -#define SHARPSL_FATAL_NOACIN_VOLT 170 /* 3.40V */ - /* * Prototypes */ @@ -82,12 +75,13 @@ DEFINE_LED_TRIGGER(sharpsl_charge_led_trigger); static int get_percentage(int voltage) { int i = sharpsl_pm.machinfo->bat_levels - 1; + int bl_status = sharpsl_pm.machinfo->backlight_get_status ? sharpsl_pm.machinfo->backlight_get_status() : 0; struct battery_thresh *thresh; if (sharpsl_pm.charge_mode == CHRG_ON) - thresh=sharpsl_pm.machinfo->bat_levels_acin; + thresh = bl_status ? sharpsl_pm.machinfo->bat_levels_acin_bl : sharpsl_pm.machinfo->bat_levels_acin; else - thresh=sharpsl_pm.machinfo->bat_levels_noac; + thresh = bl_status ? sharpsl_pm.machinfo->bat_levels_noac_bl : sharpsl_pm.machinfo->bat_levels_noac; while (i > 0 && (voltage > thresh[i].voltage)) i--; @@ -131,7 +125,7 @@ static void sharpsl_battery_thread(void *private_) sharpsl_pm.battstat.ac_status = (sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_ACIN) ? APM_AC_ONLINE : APM_AC_OFFLINE); /* Corgi cannot confirm when battery fully charged so periodically kick! */ - if (machine_is_corgi() && (sharpsl_pm.charge_mode == CHRG_ON) + if (!sharpsl_pm.machinfo->batfull_irq && (sharpsl_pm.charge_mode == CHRG_ON) && time_after(jiffies, sharpsl_pm.charge_start_time + SHARPSL_CHARGE_ON_TIME_INTERVAL)) schedule_work(&toggle_charger); @@ -166,11 +160,11 @@ static void sharpsl_battery_thread(void *private_) && ((sharpsl_pm.battstat.mainbat_status == APM_BATTERY_STATUS_LOW) || (sharpsl_pm.battstat.mainbat_status == APM_BATTERY_STATUS_CRITICAL))) { if (!(sharpsl_pm.flags & SHARPSL_BL_LIMIT)) { - corgibl_limit_intensity(1); + sharpsl_pm.machinfo->backlight_limit(1); sharpsl_pm.flags |= SHARPSL_BL_LIMIT; } } else if (sharpsl_pm.flags & SHARPSL_BL_LIMIT) { - corgibl_limit_intensity(0); + sharpsl_pm.machinfo->backlight_limit(0); sharpsl_pm.flags &= ~SHARPSL_BL_LIMIT; } @@ -418,8 +412,10 @@ static int sharpsl_check_battery_temp(void) val = get_select_val(buff); dev_dbg(sharpsl_pm.dev, "Temperature: %d\n", val); - if (val > SHARPSL_CHARGE_ON_TEMP) + if (val > sharpsl_pm.machinfo->charge_on_temp) { + printk(KERN_WARNING "Not charging: temperature out of limits.\n"); return -1; + } return 0; } @@ -450,7 +446,7 @@ static int sharpsl_check_battery_voltage(void) val = get_select_val(buff); dev_dbg(sharpsl_pm.dev, "Battery Voltage: %d\n", val); - if (val < SHARPSL_CHARGE_ON_VOLT) + if (val < sharpsl_pm.machinfo->charge_on_volt) return -1; return 0; @@ -468,7 +464,7 @@ static int sharpsl_ac_check(void) temp = get_select_val(buff); dev_dbg(sharpsl_pm.dev, "AC Voltage: %d\n",temp); - if ((temp > SHARPSL_CHARGE_ON_ACIN_HIGH) || (temp < SHARPSL_CHARGE_ON_ACIN_LOW)) { + if ((temp > sharpsl_pm.machinfo->charge_acin_high) || (temp < sharpsl_pm.machinfo->charge_acin_low)) { dev_err(sharpsl_pm.dev, "Error: AC check failed.\n"); return -1; } @@ -627,8 +623,8 @@ static int sharpsl_fatal_check(void) temp = get_select_val(buff); dev_dbg(sharpsl_pm.dev, "sharpsl_fatal_check: acin: %d, discharge voltage: %d, no discharge: %d\n", acin, temp, sharpsl_pm.machinfo->read_devdata(SHARPSL_BATT_VOLT)); - if ((acin && (temp < SHARPSL_FATAL_ACIN_VOLT)) || - (!acin && (temp < SHARPSL_FATAL_NOACIN_VOLT))) + if ((acin && (temp < sharpsl_pm.machinfo->fatal_acin_volt)) || + (!acin && (temp < sharpsl_pm.machinfo->fatal_noacin_volt))) return -1; return 0; } diff --git a/arch/arm/common/time-acorn.c b/arch/arm/common/time-acorn.c index 486add853..3f60dd9ac 100644 --- a/arch/arm/common/time-acorn.c +++ b/arch/arm/common/time-acorn.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -76,7 +77,7 @@ ioc_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) static struct irqaction ioc_timer_irq = { .name = "timer", - .flags = SA_INTERRUPT, + .flags = IRQF_DISABLED, .handler = ioc_timer_interrupt }; diff --git a/arch/arm/common/uengine.c b/arch/arm/common/uengine.c index a1310b710..95c8508c2 100644 --- a/arch/arm/common/uengine.c +++ b/arch/arm/common/uengine.c @@ -11,17 +11,32 @@ * License, or (at your option) any later version. */ -#include #include #include #include #include #include #include -#include +#include #include #include +#if defined(CONFIG_ARCH_IXP2000) +#define IXP_UENGINE_CSR_VIRT_BASE IXP2000_UENGINE_CSR_VIRT_BASE +#define IXP_PRODUCT_ID IXP2000_PRODUCT_ID +#define IXP_MISC_CONTROL IXP2000_MISC_CONTROL +#define IXP_RESET1 IXP2000_RESET1 +#else +#if defined(CONFIG_ARCH_IXP23XX) +#define IXP_UENGINE_CSR_VIRT_BASE IXP23XX_UENGINE_CSR_VIRT_BASE +#define IXP_PRODUCT_ID IXP23XX_PRODUCT_ID +#define IXP_MISC_CONTROL IXP23XX_MISC_CONTROL +#define IXP_RESET1 IXP23XX_RESET1 +#else +#error unknown platform +#endif +#endif + #define USTORE_ADDRESS 0x000 #define USTORE_DATA_LOWER 0x004 #define USTORE_DATA_UPPER 0x008 @@ -43,7 +58,7 @@ u32 ixp2000_uengine_mask; static void *ixp2000_uengine_csr_area(int uengine) { - return ((void *)IXP2000_UENGINE_CSR_VIRT_BASE) + (uengine << 10); + return ((void *)IXP_UENGINE_CSR_VIRT_BASE) + (uengine << 10); } /* @@ -91,8 +106,13 @@ EXPORT_SYMBOL(ixp2000_uengine_csr_write); void ixp2000_uengine_reset(u32 uengine_mask) { - ixp2000_reg_wrb(IXP2000_RESET1, uengine_mask & ixp2000_uengine_mask); - ixp2000_reg_wrb(IXP2000_RESET1, 0); + u32 value; + + value = ixp2000_reg_read(IXP_RESET1) & ~ixp2000_uengine_mask; + + uengine_mask &= ixp2000_uengine_mask; + ixp2000_reg_wrb(IXP_RESET1, value | uengine_mask); + ixp2000_reg_wrb(IXP_RESET1, value); } EXPORT_SYMBOL(ixp2000_uengine_reset); @@ -235,11 +255,12 @@ static int check_ixp_type(struct ixp2000_uengine_code *c) u32 product_id; u32 rev; - product_id = ixp2000_reg_read(IXP2000_PRODUCT_ID); + product_id = ixp2000_reg_read(IXP_PRODUCT_ID); if (((product_id >> 16) & 0x1f) != 0) return 0; switch ((product_id >> 8) & 0xff) { +#ifdef CONFIG_ARCH_IXP2000 case 0: /* IXP2800 */ if (!(c->cpu_model_bitmask & 4)) return 0; @@ -254,6 +275,14 @@ static int check_ixp_type(struct ixp2000_uengine_code *c) if (!(c->cpu_model_bitmask & 2)) return 0; break; +#endif + +#ifdef CONFIG_ARCH_IXP23XX + case 4: /* IXP23xx */ + if (!(c->cpu_model_bitmask & 0x3f0)) + return 0; + break; +#endif default: return 0; @@ -432,7 +461,8 @@ static int __init ixp2000_uengine_init(void) /* * Determine number of microengines present. */ - switch ((ixp2000_reg_read(IXP2000_PRODUCT_ID) >> 8) & 0x1fff) { + switch ((ixp2000_reg_read(IXP_PRODUCT_ID) >> 8) & 0x1fff) { +#ifdef CONFIG_ARCH_IXP2000 case 0: /* IXP2800 */ case 1: /* IXP2850 */ ixp2000_uengine_mask = 0x00ff00ff; @@ -441,10 +471,17 @@ static int __init ixp2000_uengine_init(void) case 2: /* IXP2400 */ ixp2000_uengine_mask = 0x000f000f; break; +#endif + +#ifdef CONFIG_ARCH_IXP23XX + case 4: /* IXP23xx */ + ixp2000_uengine_mask = (*IXP23XX_EXP_CFG_FUSE >> 8) & 0xf; + break; +#endif default: printk(KERN_INFO "Detected unknown IXP2000 model (%.8x)\n", - (unsigned int)ixp2000_reg_read(IXP2000_PRODUCT_ID)); + (unsigned int)ixp2000_reg_read(IXP_PRODUCT_ID)); ixp2000_uengine_mask = 0x00000000; break; } @@ -457,15 +494,15 @@ static int __init ixp2000_uengine_init(void) /* * Synchronise timestamp counters across all microengines. */ - value = ixp2000_reg_read(IXP2000_MISC_CONTROL); - ixp2000_reg_wrb(IXP2000_MISC_CONTROL, value & ~0x80); + value = ixp2000_reg_read(IXP_MISC_CONTROL); + ixp2000_reg_wrb(IXP_MISC_CONTROL, value & ~0x80); for (uengine = 0; uengine < 32; uengine++) { if (ixp2000_uengine_mask & (1 << uengine)) { ixp2000_uengine_csr_write(uengine, TIMESTAMP_LOW, 0); ixp2000_uengine_csr_write(uengine, TIMESTAMP_HIGH, 0); } } - ixp2000_reg_wrb(IXP2000_MISC_CONTROL, value | 0x80); + ixp2000_reg_wrb(IXP_MISC_CONTROL, value | 0x80); return 0; } diff --git a/arch/arm/common/via82c505.c b/arch/arm/common/via82c505.c index ef716a5b0..ba2e62986 100644 --- a/arch/arm/common/via82c505.c +++ b/arch/arm/common/via82c505.c @@ -1,4 +1,3 @@ -#include #include #include #include diff --git a/arch/arm/common/vic.c b/arch/arm/common/vic.c index a19bc4a61..43d278134 100644 --- a/arch/arm/common/vic.c +++ b/arch/arm/common/vic.c @@ -39,7 +39,8 @@ static void vic_unmask_irq(unsigned int irq) writel(1 << irq, base + VIC_INT_ENABLE); } -static struct irqchip vic_chip = { +static struct irq_chip vic_chip = { + .name = "VIC", .ack = vic_mask_irq, .mask = vic_mask_irq, .unmask = vic_unmask_irq, diff --git a/arch/arm/configs/at91rm9200dk_defconfig b/arch/arm/configs/at91rm9200dk_defconfig index 9e1c1cceb..4f3d8d377 100644 --- a/arch/arm/configs/at91rm9200dk_defconfig +++ b/arch/arm/configs/at91rm9200dk_defconfig @@ -103,6 +103,7 @@ CONFIG_DEFAULT_IOSCHED="anticipatory" # CONFIG_ARCH_IMX is not set # CONFIG_ARCH_H720X is not set # CONFIG_ARCH_AAEC2000 is not set +CONFIG_ARCH_AT91=y CONFIG_ARCH_AT91RM9200=y # diff --git a/arch/arm/configs/at91rm9200ek_defconfig b/arch/arm/configs/at91rm9200ek_defconfig index 6e0805a97..08b5dc388 100644 --- a/arch/arm/configs/at91rm9200ek_defconfig +++ b/arch/arm/configs/at91rm9200ek_defconfig @@ -103,6 +103,7 @@ CONFIG_DEFAULT_IOSCHED="anticipatory" # CONFIG_ARCH_IMX is not set # CONFIG_ARCH_H720X is not set # CONFIG_ARCH_AAEC2000 is not set +CONFIG_ARCH_AT91=y CONFIG_ARCH_AT91RM9200=y # diff --git a/arch/arm/configs/csb337_defconfig b/arch/arm/configs/csb337_defconfig index 94bd9932a..cf3fa5cb2 100644 --- a/arch/arm/configs/csb337_defconfig +++ b/arch/arm/configs/csb337_defconfig @@ -103,6 +103,7 @@ CONFIG_DEFAULT_IOSCHED="anticipatory" # CONFIG_ARCH_IMX is not set # CONFIG_ARCH_H720X is not set # CONFIG_ARCH_AAEC2000 is not set +CONFIG_ARCH_AT91=y CONFIG_ARCH_AT91RM9200=y # @@ -620,9 +621,8 @@ CONFIG_AT91_WATCHDOG=y # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set +# CONFIG_HW_RANDOM is not set # CONFIG_NVRAM is not set -CONFIG_RTC=y -# CONFIG_AT91_RTC is not set # CONFIG_DTLK is not set # CONFIG_R3964 is not set @@ -955,9 +955,41 @@ CONFIG_USB_AT91=y CONFIG_MMC=y # CONFIG_MMC_DEBUG is not set CONFIG_MMC_BLOCK=y -# CONFIG_MMC_WBSD is not set CONFIG_MMC_AT91RM9200=y +# +# Real Time Clock +# +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc1" + +# +# RTC interfaces +# +# CONFIG_RTC_INTF_SYSFS is not set +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set + +# +# RTC drivers +# +# CONFIG_RTC_DRV_X1205 is not set +CONFIG_RTC_DRV_DS1307=y +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_ISL1208 is not set +# CONFIG_RTC_DRV_DS1672 is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_PCF8563 is not set +# CONFIG_RTC_DRV_PCF8583 is not set +# CONFIG_RTC_DRV_RS5C372 is not set +# CONFIG_RTC_DRV_M48T86 is not set +CONFIG_RTC_DRV_AT91=y +# CONFIG_RTC_DRV_TEST is not set +# CONFIG_RTC_DRV_V3020 is not set + # # File systems # diff --git a/arch/arm/configs/csb637_defconfig b/arch/arm/configs/csb637_defconfig index 1519124c5..640d70c1f 100644 --- a/arch/arm/configs/csb637_defconfig +++ b/arch/arm/configs/csb637_defconfig @@ -103,6 +103,7 @@ CONFIG_DEFAULT_IOSCHED="anticipatory" # CONFIG_ARCH_IMX is not set # CONFIG_ARCH_H720X is not set # CONFIG_ARCH_AAEC2000 is not set +CONFIG_ARCH_AT91=y CONFIG_ARCH_AT91RM9200=y # diff --git a/arch/arm/configs/ep93xx_defconfig b/arch/arm/configs/ep93xx_defconfig index b69e88bbc..2948b4589 100644 --- a/arch/arm/configs/ep93xx_defconfig +++ b/arch/arm/configs/ep93xx_defconfig @@ -1,14 +1,18 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.17-rc2 -# Wed Apr 19 21:21:01 2006 +# Linux kernel version: 2.6.18-rc1-git9 +# Sat Jul 15 15:08:10 2006 # CONFIG_ARM=y CONFIG_MMU=y +CONFIG_GENERIC_HARDIRQS=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_GENERIC_IRQ_PROBE=y CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_VECTORS_BASE=0xffff0000 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" # # Code maturity level options @@ -26,6 +30,7 @@ CONFIG_SWAP=y CONFIG_SYSVIPC=y # CONFIG_POSIX_MQUEUE is not set # CONFIG_BSD_PROCESS_ACCT is not set +# CONFIG_TASKSTATS is not set CONFIG_SYSCTL=y # CONFIG_AUDIT is not set CONFIG_IKCONFIG=y @@ -43,14 +48,15 @@ CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y +CONFIG_RT_MUTEXES=y CONFIG_FUTEX=y CONFIG_EPOLL=y CONFIG_SHMEM=y CONFIG_SLAB=y +CONFIG_VM_EVENT_COUNTERS=y # CONFIG_TINY_SHMEM is not set CONFIG_BASE_SMALL=0 # CONFIG_SLOB is not set -CONFIG_OBSOLETE_INTERMODULE=y # # Loadable module support @@ -83,18 +89,26 @@ CONFIG_DEFAULT_IOSCHED="deadline" # # System Type # +# CONFIG_ARCH_AAEC2000 is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_REALVIEW is not set +# CONFIG_ARCH_VERSATILE is not set +# CONFIG_ARCH_AT91 is not set # 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_EP93XX=y # CONFIG_ARCH_FOOTBRIDGE is not set -# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_NETX is not set +# CONFIG_ARCH_H720X is not set +# CONFIG_ARCH_IMX is not set # CONFIG_ARCH_IOP3XX is not set # CONFIG_ARCH_IXP4XX is not set # CONFIG_ARCH_IXP2000 is not set # CONFIG_ARCH_IXP23XX is not set # CONFIG_ARCH_L7200 is not set +# CONFIG_ARCH_PNX4008 is not set # CONFIG_ARCH_PXA is not set # CONFIG_ARCH_RPC is not set # CONFIG_ARCH_SA1100 is not set @@ -102,20 +116,18 @@ CONFIG_ARCH_EP93XX=y # 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_REALVIEW is not set -# CONFIG_ARCH_IMX is not set -# CONFIG_ARCH_H720X is not set -# CONFIG_ARCH_AAEC2000 is not set -# CONFIG_ARCH_AT91RM9200 is not set # # Cirrus EP93xx Implementation Options # +CONFIG_CRUNCH=y # # EP93xx Platforms # +CONFIG_MACH_EDB9302=y +CONFIG_MACH_EDB9315=y +CONFIG_MACH_EDB9315A=y CONFIG_MACH_GESBC9312=y CONFIG_MACH_TS72XX=y @@ -166,6 +178,7 @@ CONFIG_FLATMEM=y CONFIG_FLAT_NODE_MEM_MAP=y # CONFIG_SPARSEMEM_STATIC is not set CONFIG_SPLIT_PTLOCK_CPUS=4096 +# CONFIG_RESOURCES_64BIT is not set CONFIG_ALIGNMENT_TRAP=y # @@ -233,6 +246,8 @@ CONFIG_SYN_COOKIES=y # CONFIG_INET_IPCOMP is not set # CONFIG_INET_XFRM_TUNNEL is not set # CONFIG_INET_TUNNEL is not set +CONFIG_INET_XFRM_MODE_TRANSPORT=y +CONFIG_INET_XFRM_MODE_TUNNEL=y CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_TCP_CONG_ADVANCED is not set @@ -240,6 +255,7 @@ CONFIG_TCP_CONG_BIC=y # CONFIG_IPV6 is not set # CONFIG_INET6_XFRM_TUNNEL is not set # CONFIG_INET6_TUNNEL is not set +# CONFIG_NETWORK_SECMARK is not set # CONFIG_NETFILTER is not set # @@ -294,6 +310,7 @@ CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y # CONFIG_FW_LOADER is not set # CONFIG_DEBUG_DRIVER is not set +# CONFIG_SYS_HYPERVISOR is not set # # Connector - unified userspace <-> kernelspace linker @@ -386,6 +403,8 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=1 # CONFIG_MTD_NAND=y CONFIG_MTD_NAND_VERIFY_WRITE=y +# CONFIG_MTD_NAND_ECC_SMC is not set +CONFIG_MTD_NAND_TS7250=y CONFIG_MTD_NAND_IDS=y # CONFIG_MTD_NAND_DISKONCHIP is not set # CONFIG_MTD_NAND_NANDSIM is not set @@ -582,6 +601,7 @@ CONFIG_EP93XX_WATCHDOG=y # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set +# CONFIG_HW_RANDOM is not set # CONFIG_NVRAM is not set # CONFIG_DTLK is not set # CONFIG_R3964 is not set @@ -613,6 +633,7 @@ CONFIG_I2C_ALGOBIT=y # # I2C Hardware Bus support # +# CONFIG_I2C_OCORES is not set # CONFIG_I2C_PARPORT_LIGHT is not set # CONFIG_I2C_STUB is not set # CONFIG_I2C_PCA_ISA is not set @@ -641,13 +662,13 @@ CONFIG_I2C_DEBUG_CHIP=y # # Dallas's 1-wire bus # -# CONFIG_W1 is not set # # Hardware Monitoring support # CONFIG_HWMON=y # CONFIG_HWMON_VID is not set +# CONFIG_SENSORS_ABITUGURU is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set @@ -675,8 +696,10 @@ CONFIG_HWMON=y # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_SMSC47M1 is not set +# CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_W83781D is not set +# CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83627HF is not set @@ -704,6 +727,7 @@ CONFIG_HWMON=y # Multimedia devices # # CONFIG_VIDEO_DEV is not set +CONFIG_VIDEO_V4L2=y # # Digital Video Broadcasting Devices @@ -714,6 +738,7 @@ CONFIG_HWMON=y # # Graphics support # +# CONFIG_FIRMWARE_EDID is not set # CONFIG_FB is not set # @@ -725,7 +750,7 @@ CONFIG_HWMON=y # USB support # CONFIG_USB_ARCH_HAS_HCD=y -# CONFIG_USB_ARCH_HAS_OHCI is not set +CONFIG_USB_ARCH_HAS_OHCI=y # CONFIG_USB_ARCH_HAS_EHCI is not set CONFIG_USB=y CONFIG_USB_DEBUG=y @@ -742,6 +767,9 @@ CONFIG_USB_DYNAMIC_MINORS=y # USB Host Controller Drivers # # CONFIG_USB_ISP116X_HCD is not set +CONFIG_USB_OHCI_HCD=y +# CONFIG_USB_OHCI_BIG_ENDIAN is not set +CONFIG_USB_OHCI_LITTLE_ENDIAN=y # CONFIG_USB_SL811_HCD is not set # @@ -806,6 +834,7 @@ CONFIG_USB_SERIAL_CONSOLE=y # CONFIG_USB_SERIAL_GENERIC is not set # CONFIG_USB_SERIAL_AIRPRIME is not set # CONFIG_USB_SERIAL_ANYDATA is not set +# CONFIG_USB_SERIAL_ARK3116 is not set # CONFIG_USB_SERIAL_BELKIN is not set # CONFIG_USB_SERIAL_WHITEHEAT is not set # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set @@ -830,9 +859,11 @@ CONFIG_USB_SERIAL_CONSOLE=y CONFIG_USB_SERIAL_PL2303=y # CONFIG_USB_SERIAL_HP4X is not set # CONFIG_USB_SERIAL_SAFE is not set +# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set # CONFIG_USB_SERIAL_TI is not set # CONFIG_USB_SERIAL_CYBERJACK is not set # CONFIG_USB_SERIAL_XIRCOM is not set +# CONFIG_USB_SERIAL_OPTION is not set # CONFIG_USB_SERIAL_OMNINET is not set # @@ -845,10 +876,12 @@ CONFIG_USB_SERIAL_PL2303=y # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_LED is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_PHIDGETKIT is not set # CONFIG_USB_PHIDGETSERVO is not set # CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_APPLEDISPLAY is not set # CONFIG_USB_LD is not set # CONFIG_USB_TEST is not set @@ -880,17 +913,25 @@ CONFIG_RTC_HCTOSYS_DEVICE="rtc0" CONFIG_RTC_INTF_SYSFS=y CONFIG_RTC_INTF_PROC=y CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set # # RTC drivers # # CONFIG_RTC_DRV_X1205 is not set +# CONFIG_RTC_DRV_DS1307 is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_DS1672 is not set +# CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_PCF8563 is not set +# CONFIG_RTC_DRV_PCF8583 is not set # CONFIG_RTC_DRV_RS5C372 is not set CONFIG_RTC_DRV_M48T86=y CONFIG_RTC_DRV_EP93XX=y +# CONFIG_RTC_DRV_PL031 is not set # CONFIG_RTC_DRV_TEST is not set +# CONFIG_RTC_DRV_V3020 is not set # # File systems @@ -910,6 +951,7 @@ CONFIG_JBD=y # CONFIG_MINIX_FS is not set # CONFIG_ROMFS_FS is not set CONFIG_INOTIFY=y +CONFIG_INOTIFY_USER=y # CONFIG_QUOTA is not set CONFIG_DNOTIFY=y # CONFIG_AUTOFS_FS is not set @@ -957,6 +999,7 @@ CONFIG_JFFS2_FS=y CONFIG_JFFS2_FS_DEBUG=0 CONFIG_JFFS2_FS_WRITEBUFFER=y # CONFIG_JFFS2_SUMMARY is not set +# CONFIG_JFFS2_FS_XATTR is not set # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set CONFIG_JFFS2_ZLIB=y CONFIG_JFFS2_RTIME=y @@ -1066,15 +1109,20 @@ CONFIG_NLS_ISO8859_1=y # # CONFIG_PRINTK_TIME is not set CONFIG_MAGIC_SYSRQ=y +# CONFIG_UNUSED_SYMBOLS is not set CONFIG_DEBUG_KERNEL=y CONFIG_LOG_BUF_SHIFT=14 CONFIG_DETECT_SOFTLOCKUP=y # CONFIG_SCHEDSTATS is not set CONFIG_DEBUG_SLAB=y # CONFIG_DEBUG_SLAB_LEAK is not set -CONFIG_DEBUG_MUTEXES=y +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_RT_MUTEX_TESTER is not set CONFIG_DEBUG_SPINLOCK=y +CONFIG_DEBUG_MUTEXES=y +# CONFIG_DEBUG_RWSEMS is not set # CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_DEBUG_KOBJECT is not set CONFIG_DEBUG_BUGVERBOSE=y # CONFIG_DEBUG_INFO is not set @@ -1114,3 +1162,4 @@ CONFIG_CRC32=y CONFIG_LIBCRC32C=y CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y +CONFIG_PLIST=y diff --git a/arch/arm/configs/ixp2000_defconfig b/arch/arm/configs/ixp2000_defconfig index e6f3e4873..27b3e31a8 100644 --- a/arch/arm/configs/ixp2000_defconfig +++ b/arch/arm/configs/ixp2000_defconfig @@ -1,14 +1,18 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.17-rc2 -# Wed Apr 19 21:12:49 2006 +# Linux kernel version: 2.6.18-rc1 +# Sun Jul 9 15:28:50 2006 # CONFIG_ARM=y CONFIG_MMU=y +CONFIG_GENERIC_HARDIRQS=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_GENERIC_IRQ_PROBE=y CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_VECTORS_BASE=0xffff0000 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" # # Code maturity level options @@ -43,14 +47,15 @@ CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y +CONFIG_RT_MUTEXES=y CONFIG_FUTEX=y CONFIG_EPOLL=y CONFIG_SHMEM=y CONFIG_SLAB=y +CONFIG_VM_EVENT_COUNTERS=y # CONFIG_TINY_SHMEM is not set CONFIG_BASE_SMALL=0 # CONFIG_SLOB is not set -CONFIG_OBSOLETE_INTERMODULE=y # # Loadable module support @@ -83,18 +88,26 @@ CONFIG_DEFAULT_IOSCHED="anticipatory" # # System Type # +# CONFIG_ARCH_AAEC2000 is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_REALVIEW is not set +# CONFIG_ARCH_VERSATILE is not set +# CONFIG_ARCH_AT91 is not set # 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_EP93XX is not set # CONFIG_ARCH_FOOTBRIDGE is not set -# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_NETX is not set +# CONFIG_ARCH_H720X is not set +# CONFIG_ARCH_IMX is not set # CONFIG_ARCH_IOP3XX is not set # CONFIG_ARCH_IXP4XX is not set CONFIG_ARCH_IXP2000=y # CONFIG_ARCH_IXP23XX is not set # CONFIG_ARCH_L7200 is not set +# CONFIG_ARCH_PNX4008 is not set # CONFIG_ARCH_PXA is not set # CONFIG_ARCH_RPC is not set # CONFIG_ARCH_SA1100 is not set @@ -102,12 +115,6 @@ CONFIG_ARCH_IXP2000=y # 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_REALVIEW is not set -# CONFIG_ARCH_IMX is not set -# CONFIG_ARCH_H720X is not set -# CONFIG_ARCH_AAEC2000 is not set -# CONFIG_ARCH_AT91RM9200 is not set CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y # @@ -171,6 +178,7 @@ CONFIG_FLATMEM=y CONFIG_FLAT_NODE_MEM_MAP=y # CONFIG_SPARSEMEM_STATIC is not set CONFIG_SPLIT_PTLOCK_CPUS=4096 +# CONFIG_RESOURCES_64BIT is not set CONFIG_ALIGNMENT_TRAP=y # @@ -218,6 +226,8 @@ CONFIG_NET=y CONFIG_PACKET=y CONFIG_PACKET_MMAP=y CONFIG_UNIX=y +CONFIG_XFRM=y +# CONFIG_XFRM_USER is not set # CONFIG_NET_KEY is not set CONFIG_INET=y # CONFIG_IP_MULTICAST is not set @@ -236,6 +246,8 @@ CONFIG_SYN_COOKIES=y # CONFIG_INET_IPCOMP is not set # CONFIG_INET_XFRM_TUNNEL is not set # CONFIG_INET_TUNNEL is not set +CONFIG_INET_XFRM_MODE_TRANSPORT=y +CONFIG_INET_XFRM_MODE_TUNNEL=y CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_TCP_CONG_ADVANCED is not set @@ -243,6 +255,7 @@ CONFIG_TCP_CONG_BIC=y # CONFIG_IPV6 is not set # CONFIG_INET6_XFRM_TUNNEL is not set # CONFIG_INET6_TUNNEL is not set +# CONFIG_NETWORK_SECMARK is not set # CONFIG_NETFILTER is not set # @@ -297,6 +310,7 @@ CONFIG_STANDALONE=y # CONFIG_PREVENT_FIRMWARE_BUILD is not set # CONFIG_FW_LOADER is not set # CONFIG_DEBUG_DRIVER is not set +# CONFIG_SYS_HYPERVISOR is not set # # Connector - unified userspace <-> kernelspace linker @@ -525,6 +539,7 @@ CONFIG_ENP2611_MSF_NET=y # CONFIG_CHELSIO_T1 is not set # CONFIG_IXGB is not set # CONFIG_S2IO is not set +# CONFIG_MYRI10GE is not set # # Token Ring devices @@ -542,7 +557,6 @@ CONFIG_ENP2611_MSF_NET=y CONFIG_WAN=y # CONFIG_DSCC4 is not set # CONFIG_LANMEDIA is not set -# CONFIG_SYNCLINK_SYNCPPP is not set CONFIG_HDLC=y CONFIG_HDLC_RAW=y # CONFIG_HDLC_RAW_ETH is not set @@ -654,6 +668,7 @@ CONFIG_IXP2000_WATCHDOG=y # # CONFIG_PCIPCWATCHDOG is not set # CONFIG_WDTPCI is not set +# CONFIG_HW_RANDOM is not set # CONFIG_NVRAM is not set # CONFIG_DTLK is not set # CONFIG_R3964 is not set @@ -697,6 +712,7 @@ CONFIG_I2C_ALGOBIT=y # CONFIG_I2C_PIIX4 is not set CONFIG_I2C_IXP2000=y # CONFIG_I2C_NFORCE2 is not set +# CONFIG_I2C_OCORES is not set # CONFIG_I2C_PARPORT_LIGHT is not set # CONFIG_I2C_PROSAVAGE is not set # CONFIG_I2C_SAVAGE4 is not set @@ -733,13 +749,13 @@ CONFIG_SENSORS_EEPROM=y # # Dallas's 1-wire bus # -# CONFIG_W1 is not set # # Hardware Monitoring support # CONFIG_HWMON=y # CONFIG_HWMON_VID is not set +# CONFIG_SENSORS_ABITUGURU is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set @@ -768,10 +784,12 @@ CONFIG_HWMON=y # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_SIS5595 is not set # CONFIG_SENSORS_SMSC47M1 is not set +# CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_VT8231 is not set # CONFIG_SENSORS_W83781D is not set +# CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83627HF is not set @@ -799,6 +817,7 @@ CONFIG_HWMON=y # Multimedia devices # # CONFIG_VIDEO_DEV is not set +CONFIG_VIDEO_V4L2=y # # Digital Video Broadcasting Devices @@ -808,6 +827,7 @@ CONFIG_HWMON=y # # Graphics support # +# CONFIG_FIRMWARE_EDID is not set # CONFIG_FB is not set # @@ -866,6 +886,7 @@ CONFIG_FS_POSIX_ACL=y # CONFIG_MINIX_FS is not set # CONFIG_ROMFS_FS is not set CONFIG_INOTIFY=y +CONFIG_INOTIFY_USER=y # CONFIG_QUOTA is not set CONFIG_DNOTIFY=y # CONFIG_AUTOFS_FS is not set @@ -910,6 +931,7 @@ CONFIG_JFFS2_FS=y CONFIG_JFFS2_FS_DEBUG=0 CONFIG_JFFS2_FS_WRITEBUFFER=y # CONFIG_JFFS2_SUMMARY is not set +# CONFIG_JFFS2_FS_XATTR is not set # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set CONFIG_JFFS2_ZLIB=y CONFIG_JFFS2_RTIME=y @@ -939,6 +961,7 @@ CONFIG_SUNRPC=y # CONFIG_RPCSEC_GSS_SPKM3 is not set # CONFIG_SMB_FS is not set # CONFIG_CIFS is not set +# CONFIG_CIFS_DEBUG2 is not set # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set @@ -980,14 +1003,19 @@ CONFIG_MSDOS_PARTITION=y # # CONFIG_PRINTK_TIME is not set CONFIG_MAGIC_SYSRQ=y +# CONFIG_UNUSED_SYMBOLS is not set CONFIG_DEBUG_KERNEL=y CONFIG_LOG_BUF_SHIFT=14 CONFIG_DETECT_SOFTLOCKUP=y # CONFIG_SCHEDSTATS is not set # CONFIG_DEBUG_SLAB is not set -CONFIG_DEBUG_MUTEXES=y +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_RT_MUTEX_TESTER is not set # CONFIG_DEBUG_SPINLOCK is not set +CONFIG_DEBUG_MUTEXES=y +# CONFIG_DEBUG_RWSEMS is not set # CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_DEBUG_KOBJECT is not set CONFIG_DEBUG_BUGVERBOSE=y # CONFIG_DEBUG_INFO is not set @@ -1027,3 +1055,4 @@ CONFIG_CRC32=y # CONFIG_LIBCRC32C is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y +CONFIG_PLIST=y diff --git a/arch/arm/configs/ixp23xx_defconfig b/arch/arm/configs/ixp23xx_defconfig index 9ce898a6c..7b1899708 100644 --- a/arch/arm/configs/ixp23xx_defconfig +++ b/arch/arm/configs/ixp23xx_defconfig @@ -1,14 +1,18 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.17-rc2 -# Wed Apr 19 21:13:50 2006 +# Linux kernel version: 2.6.18-rc1 +# Sun Jul 9 14:13:35 2006 # CONFIG_ARM=y CONFIG_MMU=y +CONFIG_GENERIC_HARDIRQS=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_GENERIC_IRQ_PROBE=y CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_VECTORS_BASE=0xffff0000 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" # # Code maturity level options @@ -43,14 +47,15 @@ CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y +CONFIG_RT_MUTEXES=y CONFIG_FUTEX=y CONFIG_EPOLL=y CONFIG_SHMEM=y CONFIG_SLAB=y +CONFIG_VM_EVENT_COUNTERS=y # CONFIG_TINY_SHMEM is not set CONFIG_BASE_SMALL=0 # CONFIG_SLOB is not set -CONFIG_OBSOLETE_INTERMODULE=y # # Loadable module support @@ -83,18 +88,26 @@ CONFIG_DEFAULT_IOSCHED="anticipatory" # # System Type # +# CONFIG_ARCH_AAEC2000 is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_REALVIEW is not set +# CONFIG_ARCH_VERSATILE is not set +# CONFIG_ARCH_AT91 is not set # 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_EP93XX is not set # CONFIG_ARCH_FOOTBRIDGE is not set -# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_NETX is not set +# CONFIG_ARCH_H720X is not set +# CONFIG_ARCH_IMX is not set # CONFIG_ARCH_IOP3XX is not set # CONFIG_ARCH_IXP4XX is not set # CONFIG_ARCH_IXP2000 is not set CONFIG_ARCH_IXP23XX=y # CONFIG_ARCH_L7200 is not set +# CONFIG_ARCH_PNX4008 is not set # CONFIG_ARCH_PXA is not set # CONFIG_ARCH_RPC is not set # CONFIG_ARCH_SA1100 is not set @@ -102,12 +115,6 @@ CONFIG_ARCH_IXP23XX=y # 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_REALVIEW is not set -# CONFIG_ARCH_IMX is not set -# CONFIG_ARCH_H720X is not set -# CONFIG_ARCH_AAEC2000 is not set -# CONFIG_ARCH_AT91RM9200 is not set CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y # @@ -165,6 +172,7 @@ CONFIG_FLATMEM=y CONFIG_FLAT_NODE_MEM_MAP=y # CONFIG_SPARSEMEM_STATIC is not set CONFIG_SPLIT_PTLOCK_CPUS=4096 +CONFIG_RESOURCES_64BIT=y CONFIG_ALIGNMENT_TRAP=y # @@ -212,6 +220,8 @@ CONFIG_NET=y CONFIG_PACKET=y CONFIG_PACKET_MMAP=y CONFIG_UNIX=y +CONFIG_XFRM=y +# CONFIG_XFRM_USER is not set # CONFIG_NET_KEY is not set CONFIG_INET=y # CONFIG_IP_MULTICAST is not set @@ -230,6 +240,8 @@ CONFIG_SYN_COOKIES=y # CONFIG_INET_IPCOMP is not set # CONFIG_INET_XFRM_TUNNEL is not set # CONFIG_INET_TUNNEL is not set +CONFIG_INET_XFRM_MODE_TRANSPORT=y +CONFIG_INET_XFRM_MODE_TUNNEL=y CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_TCP_CONG_ADVANCED is not set @@ -237,6 +249,7 @@ CONFIG_TCP_CONG_BIC=y # CONFIG_IPV6 is not set # CONFIG_INET6_XFRM_TUNNEL is not set # CONFIG_INET6_TUNNEL is not set +# CONFIG_NETWORK_SECMARK is not set # CONFIG_NETFILTER is not set # @@ -291,6 +304,7 @@ CONFIG_STANDALONE=y # CONFIG_PREVENT_FIRMWARE_BUILD is not set # CONFIG_FW_LOADER is not set # CONFIG_DEBUG_DRIVER is not set +# CONFIG_SYS_HYPERVISOR is not set # # Connector - unified userspace <-> kernelspace linker @@ -520,6 +534,7 @@ CONFIG_BLK_DEV_SD=y # CONFIG_MEGARAID_LEGACY is not set # CONFIG_MEGARAID_SAS is not set # CONFIG_SCSI_SATA is not set +# CONFIG_SCSI_HPTIOP is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_FUTURE_DOMAIN is not set # CONFIG_SCSI_IPS is not set @@ -641,6 +656,7 @@ CONFIG_E1000_NAPI=y # CONFIG_CHELSIO_T1 is not set # CONFIG_IXGB is not set # CONFIG_S2IO is not set +# CONFIG_MYRI10GE is not set # # Token Ring devices @@ -658,7 +674,6 @@ CONFIG_E1000_NAPI=y CONFIG_WAN=y # CONFIG_DSCC4 is not set # CONFIG_LANMEDIA is not set -# CONFIG_SYNCLINK_SYNCPPP is not set CONFIG_HDLC=y CONFIG_HDLC_RAW=y # CONFIG_HDLC_RAW_ETH is not set @@ -775,6 +790,7 @@ CONFIG_WATCHDOG=y # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set +# CONFIG_HW_RANDOM is not set # CONFIG_NVRAM is not set # CONFIG_DTLK is not set # CONFIG_R3964 is not set @@ -817,6 +833,7 @@ CONFIG_I2C_ALGOBIT=y # CONFIG_I2C_I810 is not set # CONFIG_I2C_PIIX4 is not set # CONFIG_I2C_NFORCE2 is not set +# CONFIG_I2C_OCORES is not set # CONFIG_I2C_PARPORT_LIGHT is not set # CONFIG_I2C_PROSAVAGE is not set # CONFIG_I2C_SAVAGE4 is not set @@ -853,13 +870,13 @@ CONFIG_SENSORS_EEPROM=y # # Dallas's 1-wire bus # -# CONFIG_W1 is not set # # Hardware Monitoring support # CONFIG_HWMON=y # CONFIG_HWMON_VID is not set +# CONFIG_SENSORS_ABITUGURU is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set @@ -888,10 +905,12 @@ CONFIG_HWMON=y # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_SIS5595 is not set # CONFIG_SENSORS_SMSC47M1 is not set +# CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_VT8231 is not set # CONFIG_SENSORS_W83781D is not set +# CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83627HF is not set @@ -919,6 +938,7 @@ CONFIG_HWMON=y # Multimedia devices # # CONFIG_VIDEO_DEV is not set +CONFIG_VIDEO_V4L2=y # # Digital Video Broadcasting Devices @@ -929,6 +949,7 @@ CONFIG_HWMON=y # # Graphics support # +# CONFIG_FIRMWARE_EDID is not set # CONFIG_FB is not set # @@ -959,6 +980,7 @@ CONFIG_USB=y CONFIG_USB_EHCI_HCD=y # CONFIG_USB_EHCI_SPLIT_ISO is not set # CONFIG_USB_EHCI_ROOT_HUB_TT is not set +# CONFIG_USB_EHCI_TT_NEWSCHED is not set # CONFIG_USB_ISP116X_HCD is not set CONFIG_USB_OHCI_HCD=y # CONFIG_USB_OHCI_BIG_ENDIAN is not set @@ -1050,10 +1072,12 @@ CONFIG_USB_MON=y # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_LED is not set +# CONFIG_USB_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_PHIDGETKIT is not set # CONFIG_USB_PHIDGETSERVO is not set # CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_APPLEDISPLAY is not set # CONFIG_USB_SISUSBVGA is not set # CONFIG_USB_LD is not set @@ -1100,6 +1124,7 @@ CONFIG_FS_POSIX_ACL=y # CONFIG_MINIX_FS is not set # CONFIG_ROMFS_FS is not set CONFIG_INOTIFY=y +CONFIG_INOTIFY_USER=y # CONFIG_QUOTA is not set CONFIG_DNOTIFY=y # CONFIG_AUTOFS_FS is not set @@ -1146,6 +1171,7 @@ CONFIG_JFFS2_FS=y CONFIG_JFFS2_FS_DEBUG=0 CONFIG_JFFS2_FS_WRITEBUFFER=y # CONFIG_JFFS2_SUMMARY is not set +# CONFIG_JFFS2_FS_XATTR is not set # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set CONFIG_JFFS2_ZLIB=y CONFIG_JFFS2_RTIME=y @@ -1175,6 +1201,7 @@ CONFIG_SUNRPC=y # CONFIG_RPCSEC_GSS_SPKM3 is not set # CONFIG_SMB_FS is not set # CONFIG_CIFS is not set +# CONFIG_CIFS_DEBUG2 is not set # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set @@ -1255,14 +1282,19 @@ CONFIG_NLS_CODEPAGE_437=y # # CONFIG_PRINTK_TIME is not set CONFIG_MAGIC_SYSRQ=y +# CONFIG_UNUSED_SYMBOLS is not set CONFIG_DEBUG_KERNEL=y CONFIG_LOG_BUF_SHIFT=14 CONFIG_DETECT_SOFTLOCKUP=y # CONFIG_SCHEDSTATS is not set # CONFIG_DEBUG_SLAB is not set -CONFIG_DEBUG_MUTEXES=y +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_RT_MUTEX_TESTER is not set # CONFIG_DEBUG_SPINLOCK is not set +CONFIG_DEBUG_MUTEXES=y +# CONFIG_DEBUG_RWSEMS is not set # CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_DEBUG_KOBJECT is not set CONFIG_DEBUG_BUGVERBOSE=y # CONFIG_DEBUG_INFO is not set @@ -1302,3 +1334,4 @@ CONFIG_CRC32=y # CONFIG_LIBCRC32C is not set CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y +CONFIG_PLIST=y diff --git a/arch/arm/configs/lpd7a400_defconfig b/arch/arm/configs/lpd7a400_defconfig index 67eaa26c2..bf9cf9c6d 100644 --- a/arch/arm/configs/lpd7a400_defconfig +++ b/arch/arm/configs/lpd7a400_defconfig @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.12-rc1-bk2 -# Mon Mar 28 00:06:33 2005 +# Linux kernel version: 2.6.12 +# Thu Nov 3 14:15:32 2005 # CONFIG_ARM=y CONFIG_MMU=y @@ -17,6 +17,7 @@ CONFIG_EXPERIMENTAL=y CONFIG_CLEAN_COMPILE=y CONFIG_BROKEN_ON_SMP=y CONFIG_LOCK_KERNEL=y +CONFIG_INIT_ENV_ARG_LIMIT=32 # # General setup @@ -36,6 +37,8 @@ CONFIG_EMBEDDED=y CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set # CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_PRINTK=y +CONFIG_BUG=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y # CONFIG_EPOLL is not set @@ -71,6 +74,7 @@ CONFIG_BASE_SMALL=0 # CONFIG_ARCH_SA1100 is not set # CONFIG_ARCH_S3C2410 is not set # CONFIG_ARCH_SHARK is not set +# CONFIG_ARCH_LH7952X is not set CONFIG_ARCH_LH7A40X=y # CONFIG_ARCH_OMAP is not set # CONFIG_ARCH_VERSATILE is not set @@ -84,6 +88,7 @@ CONFIG_ARCH_LH7A40X=y CONFIG_MACH_LPD7A400=y # CONFIG_MACH_LPD7A404 is not set CONFIG_ARCH_LH7A400=y +CONFIG_LPD7A40X_CPLD_SSP=y # CONFIG_LH7A40X_CONTIGMEM is not set # CONFIG_LH7A40X_ONE_BANK_PER_NODE is not set @@ -110,6 +115,8 @@ CONFIG_ARM_THUMB=y # # Bus support # +CONFIG_ARM_AMBA=y +CONFIG_ISA_DMA_API=y # # PCCARD (PCMCIA/CardBus) support @@ -119,6 +126,7 @@ CONFIG_ARM_THUMB=y # # Kernel Features # +# CONFIG_SMP is not set CONFIG_PREEMPT=y CONFIG_DISCONTIGMEM=y CONFIG_ALIGNMENT_TRAP=y @@ -175,7 +183,7 @@ CONFIG_MTD=y # 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_CMDLINE_PARTS=y # CONFIG_MTD_AFS_PARTS is not set # @@ -217,7 +225,10 @@ CONFIG_MTD_CFI_UTIL=y # Mapping drivers for chip access # # CONFIG_MTD_COMPLEX_MAPPINGS is not set -# CONFIG_MTD_PHYSMAP is not set +CONFIG_MTD_PHYSMAP=y +CONFIG_MTD_PHYSMAP_START=0x00000000 +CONFIG_MTD_PHYSMAP_LEN=0x04000000 +CONFIG_MTD_PHYSMAP_BANKWIDTH=4 # CONFIG_MTD_ARM_INTEGRATOR is not set # CONFIG_MTD_EDB7312 is not set @@ -254,7 +265,6 @@ CONFIG_MTD_CFI_UTIL=y # # Block devices # -# CONFIG_BLK_DEV_FD is not set # CONFIG_BLK_DEV_COW_COMMON is not set CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_CRYPTOLOOP is not set @@ -288,13 +298,15 @@ CONFIG_BLK_DEV_IDEDISK=y # CONFIG_BLK_DEV_IDECD is not set # CONFIG_BLK_DEV_IDETAPE is not set # CONFIG_BLK_DEV_IDEFLOPPY is not set +# CONFIG_BLK_DEV_IDESCSI is not set # CONFIG_IDE_TASK_IOCTL is not set +CONFIG_IDE_POLL=y # # IDE chipset support/bugfixes # CONFIG_IDE_GENERIC=y -# CONFIG_IDE_ARM is not set +CONFIG_IDE_ARM=y # CONFIG_BLK_DEV_IDEDMA is not set # CONFIG_IDEDMA_AUTO is not set # CONFIG_BLK_DEV_HD is not set @@ -302,7 +314,37 @@ CONFIG_IDE_GENERIC=y # # SCSI device support # -# CONFIG_SCSI is not set +CONFIG_SCSI=y +# CONFIG_SCSI_PROC_FS is not set + +# +# SCSI support type (disk, tape, CD-ROM) +# +# CONFIG_BLK_DEV_SD is not set +# CONFIG_CHR_DEV_ST is not set +# CONFIG_CHR_DEV_OSST is not set +# CONFIG_BLK_DEV_SR is not set +# CONFIG_CHR_DEV_SG is not set + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +# CONFIG_SCSI_MULTI_LUN is not set +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set + +# +# SCSI Transport Attributes +# +# CONFIG_SCSI_SPI_ATTRS is not set +# CONFIG_SCSI_FC_ATTRS is not set +# CONFIG_SCSI_ISCSI_ATTRS is not set + +# +# SCSI low-level drivers +# +# CONFIG_SCSI_SATA is not set +# CONFIG_SCSI_DEBUG is not set # # Multi-device support (RAID and LVM) @@ -331,7 +373,6 @@ CONFIG_NET=y # CONFIG_PACKET=y # CONFIG_PACKET_MMAP is not set -# CONFIG_NETLINK_DEV is not set CONFIG_UNIX=y # CONFIG_NET_KEY is not set CONFIG_INET=y @@ -438,13 +479,10 @@ CONFIG_INPUT=y # # Userland interfaces # -CONFIG_INPUT_MOUSEDEV=y -CONFIG_INPUT_MOUSEDEV_PSAUX=y -CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 -CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +# CONFIG_INPUT_MOUSEDEV is not set # CONFIG_INPUT_JOYDEV is not set # CONFIG_INPUT_TSDEV is not set -# CONFIG_INPUT_EVDEV is not set +CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # @@ -453,7 +491,13 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 # CONFIG_INPUT_KEYBOARD is not set # CONFIG_INPUT_MOUSE is not set # CONFIG_INPUT_JOYSTICK is not set -# CONFIG_INPUT_TOUCHSCREEN is not set +CONFIG_INPUT_TOUCHSCREEN=y +# CONFIG_TOUCHSCREEN_GUNZE is not set +# CONFIG_TOUCHSCREEN_ELO is not set +# CONFIG_TOUCHSCREEN_MTOUCH is not set +# CONFIG_TOUCHSCREEN_MK712 is not set +CONFIG_TOUCHSCREEN_ADS7843_LH7=y +CONFIG_HAS_TOUCHSCREEN_ADS7843_LH7=y # CONFIG_INPUT_MISC is not set # @@ -461,7 +505,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 # # CONFIG_SERIO is not set # CONFIG_GAMEPORT is not set -CONFIG_SOUND_GAMEPORT=y # # Character devices @@ -479,6 +522,8 @@ CONFIG_HW_CONSOLE=y # # Non-8250 serial port support # +# CONFIG_SERIAL_AMBA_PL010 is not set +# CONFIG_SERIAL_AMBA_PL011 is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y CONFIG_SERIAL_LH7A40X=y @@ -510,7 +555,6 @@ CONFIG_RTC=y # # TPM devices # -# CONFIG_TCG_TPM is not set # # I2C support @@ -534,18 +578,73 @@ CONFIG_RTC=y # # Graphics support # -# CONFIG_FB is not set +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_ARMCLCD=y +CONFIG_FB_ARMCLCD_SHARP_LQ035Q7DB02_HRTFT=y +# CONFIG_FB_ARMCLCD_SHARP_LQ057Q3DC02 is not set +# CONFIG_FB_ARMCLCD_SHARP_LQ64D343 is not set +# CONFIG_FB_ARMCLCD_SHARP_LQ10D368 is not set +# CONFIG_FB_ARMCLCD_SHARP_LQ121S1DG41 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 is not set + +# +# Logo configuration +# +# CONFIG_LOGO is not set +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set # # Sound # -# CONFIG_SOUND is not set +CONFIG_SOUND=y + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=y +CONFIG_SND_TIMER=y +CONFIG_SND_PCM=y +# CONFIG_SND_SEQUENCER is not set +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=y +CONFIG_SND_PCM_OSS=y +# CONFIG_SND_RTCTIMER is not set +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set + +# +# Generic devices +# +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set +CONFIG_SND_AC97_CODEC=y + +# +# ALSA ARM devices +# +CONFIG_SND_LH7A40X_AC97=y + +# +# Open Sound System +# +# CONFIG_SOUND_PRIME is not set # # USB support diff --git a/arch/arm/configs/lpd7a404_defconfig b/arch/arm/configs/lpd7a404_defconfig index 208d591eb..3a57be32e 100644 --- a/arch/arm/configs/lpd7a404_defconfig +++ b/arch/arm/configs/lpd7a404_defconfig @@ -1,58 +1,81 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.12-rc1-bk2 -# Mon Mar 28 00:14:08 2005 +# Linux kernel version: 2.6.16 +# Thu Mar 23 17:50:31 2006 # CONFIG_ARM=y CONFIG_MMU=y -CONFIG_UID16=y CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_GENERIC_CALIBRATE_DELAY=y -CONFIG_GENERIC_IOMAP=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 is not set 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 is not set +CONFIG_INITRAMFS_SOURCE="" +CONFIG_UID16=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_EMBEDDED=y CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set # CONFIG_KALLSYMS_EXTRA_PASS is not set +# CONFIG_HOTPLUG is not set +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y # CONFIG_EPOLL is not set -CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_SHMEM=y CONFIG_CC_ALIGN_FUNCTIONS=0 CONFIG_CC_ALIGN_LABELS=0 CONFIG_CC_ALIGN_LOOPS=0 CONFIG_CC_ALIGN_JUMPS=0 +CONFIG_SLAB=y # CONFIG_TINY_SHMEM is not set CONFIG_BASE_SMALL=0 +# CONFIG_SLOB is not set +CONFIG_OBSOLETE_INTERMODULE=y # # Loadable module support # # CONFIG_MODULES is not set +# +# Block layer +# + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +# CONFIG_IOSCHED_AS is not set +# CONFIG_IOSCHED_DEADLINE is not set +CONFIG_IOSCHED_CFQ=y +# CONFIG_DEFAULT_AS is not set +# CONFIG_DEFAULT_DEADLINE is not set +CONFIG_DEFAULT_CFQ=y +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="cfq" + # # System Type # @@ -71,11 +94,15 @@ CONFIG_BASE_SMALL=0 # CONFIG_ARCH_SA1100 is not set # CONFIG_ARCH_S3C2410 is not set # CONFIG_ARCH_SHARK is not set +# CONFIG_ARCH_LH7952X is not set CONFIG_ARCH_LH7A40X=y # 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 +# CONFIG_ARCH_AT91RM9200 is not set # # LH7A40X Implementations @@ -110,6 +137,7 @@ CONFIG_ARM_THUMB=y # # Bus support # +CONFIG_ARM_AMBA=y # # PCCARD (PCMCIA/CardBus) support @@ -120,7 +148,18 @@ CONFIG_ARM_THUMB=y # Kernel Features # CONFIG_PREEMPT=y +# CONFIG_NO_IDLE_HZ is not set +# CONFIG_AEABI is not set +CONFIG_ARCH_DISCONTIGMEM_ENABLE=y +CONFIG_SELECT_MEMORY_MODEL=y +# CONFIG_FLATMEM_MANUAL is not set +CONFIG_DISCONTIGMEM_MANUAL=y +# CONFIG_SPARSEMEM_MANUAL is not set CONFIG_DISCONTIGMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +CONFIG_NEED_MULTIPLE_NODES=y +# CONFIG_SPARSEMEM_STATIC is not set +CONFIG_SPLIT_PTLOCK_CPUS=4096 CONFIG_ALIGNMENT_TRAP=y # @@ -154,6 +193,84 @@ CONFIG_BINFMT_ELF=y # Power management options # # CONFIG_PM is not set +# CONFIG_APM is not set + +# +# Networking +# +CONFIG_NET=y + +# +# Networking options +# +# CONFIG_NETDEBUG is not set +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +CONFIG_UNIX=y +# CONFIG_NET_KEY is not set +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_FIB_HASH=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_BOOTP=y +CONFIG_IP_PNP_RARP=y +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_ARPD is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_TUNNEL is not set +CONFIG_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 + +# +# TIPC Configuration (EXPERIMENTAL) +# +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_BRIDGE is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_NET_DIVERT is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set + +# +# QoS and/or fair queueing +# +# CONFIG_NET_SCHED is not set + +# +# 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 @@ -167,6 +284,11 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y # CONFIG_FW_LOADER is not set # CONFIG_DEBUG_DRIVER is not set +# +# Connector - unified userspace <-> kernelspace linker +# +# CONFIG_CONNECTOR is not set + # # Memory Technology Devices (MTD) # @@ -175,7 +297,7 @@ CONFIG_MTD=y # 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_CMDLINE_PARTS=y # CONFIG_MTD_AFS_PARTS is not set # @@ -186,6 +308,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 @@ -211,15 +334,18 @@ CONFIG_MTD_CFI_UTIL=y # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set # CONFIG_MTD_ABSENT is not set -# CONFIG_MTD_XIP is not set +# CONFIG_MTD_OBSOLETE_CHIPS is not set # # Mapping drivers for chip access # # CONFIG_MTD_COMPLEX_MAPPINGS is not set -# CONFIG_MTD_PHYSMAP is not set +CONFIG_MTD_PHYSMAP=y +CONFIG_MTD_PHYSMAP_START=0x00000000 +CONFIG_MTD_PHYSMAP_LEN=0x04000000 +CONFIG_MTD_PHYSMAP_BANKWIDTH=4 # CONFIG_MTD_ARM_INTEGRATOR is not set -# CONFIG_MTD_EDB7312 is not set +# CONFIG_MTD_PLATRAM is not set # # Self-contained MTD device drivers @@ -242,6 +368,11 @@ CONFIG_MTD_CFI_UTIL=y # # CONFIG_MTD_NAND is not set +# +# OneNAND Flash Device Drivers +# +# CONFIG_MTD_ONENAND is not set + # # Parallel port support # @@ -254,7 +385,6 @@ CONFIG_MTD_CFI_UTIL=y # # Block devices # -# CONFIG_BLK_DEV_FD is not set # CONFIG_BLK_DEV_COW_COMMON is not set CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_CRYPTOLOOP is not set @@ -262,16 +392,7 @@ CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_UB is not set # CONFIG_BLK_DEV_RAM is not set CONFIG_BLK_DEV_RAM_COUNT=16 -CONFIG_INITRAMFS_SOURCE="" # CONFIG_CDROM_PKTCDVD is not set - -# -# IO Schedulers -# -CONFIG_IOSCHED_NOOP=y -# CONFIG_IOSCHED_AS is not set -# CONFIG_IOSCHED_DEADLINE is not set -CONFIG_IOSCHED_CFQ=y # CONFIG_ATA_OVER_ETH is not set # @@ -291,12 +412,13 @@ CONFIG_BLK_DEV_IDEDISK=y # CONFIG_BLK_DEV_IDEFLOPPY is not set # CONFIG_BLK_DEV_IDESCSI is not set # CONFIG_IDE_TASK_IOCTL is not set +CONFIG_IDE_POLL=y # # IDE chipset support/bugfixes # CONFIG_IDE_GENERIC=y -# CONFIG_IDE_ARM is not set +CONFIG_IDE_ARM=y # CONFIG_BLK_DEV_IDEDMA is not set # CONFIG_IDEDMA_AUTO is not set # CONFIG_BLK_DEV_HD is not set @@ -304,6 +426,7 @@ CONFIG_IDE_GENERIC=y # # SCSI device support # +# CONFIG_RAID_ATTRS is not set CONFIG_SCSI=y # CONFIG_SCSI_PROC_FS is not set @@ -315,6 +438,7 @@ CONFIG_SCSI=y # CONFIG_CHR_DEV_OSST is not set # CONFIG_BLK_DEV_SR is not set # CONFIG_CHR_DEV_SG is not set +# CONFIG_CHR_DEV_SCH is not set # # Some SCSI devices (e.g. CD jukebox) support multiple LUNs @@ -329,10 +453,12 @@ CONFIG_SCSI=y # CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set +# CONFIG_SCSI_SAS_ATTRS is not set # # SCSI low-level drivers # +# CONFIG_ISCSI_TCP is not set # CONFIG_SCSI_SATA is not set # CONFIG_SCSI_DEBUG is not set @@ -344,6 +470,7 @@ CONFIG_SCSI=y # # Fusion MPT device support # +# CONFIG_FUSION is not set # # IEEE 1394 (FireWire) support @@ -354,82 +481,26 @@ CONFIG_SCSI=y # # -# Networking support +# Network device support # -CONFIG_NET=y - -# -# Networking options -# -CONFIG_PACKET=y -# CONFIG_PACKET_MMAP is not set -# CONFIG_NETLINK_DEV is not set -CONFIG_UNIX=y -# CONFIG_NET_KEY is not set -CONFIG_INET=y -# CONFIG_IP_MULTICAST is not set -# CONFIG_IP_ADVANCED_ROUTER is not set -CONFIG_IP_PNP=y -CONFIG_IP_PNP_DHCP=y -CONFIG_IP_PNP_BOOTP=y -CONFIG_IP_PNP_RARP=y -# CONFIG_NET_IPIP is not set -# CONFIG_NET_IPGRE is not set -# CONFIG_ARPD is not set -# CONFIG_SYN_COOKIES is not set -# CONFIG_INET_AH is not set -# CONFIG_INET_ESP is not set -# CONFIG_INET_IPCOMP is not set -# CONFIG_INET_TUNNEL is not set -# CONFIG_IP_TCPDIAG is not set -# CONFIG_IP_TCPDIAG_IPV6 is not set -# CONFIG_IPV6 is not set -# CONFIG_NETFILTER is not set - -# -# SCTP Configuration (EXPERIMENTAL) -# -# CONFIG_IP_SCTP is not set -# CONFIG_ATM is not set -# CONFIG_BRIDGE is not set -# CONFIG_VLAN_8021Q is not set -# CONFIG_DECNET is not set -# CONFIG_LLC2 is not set -# CONFIG_IPX is not set -# CONFIG_ATALK is not set -# CONFIG_X25 is not set -# CONFIG_LAPB is not set -# CONFIG_NET_DIVERT is not set -# CONFIG_ECONET is not set -# CONFIG_WAN_ROUTER is not set - -# -# QoS and/or fair queueing -# -# CONFIG_NET_SCHED is not set -# CONFIG_NET_CLS_ROUTE is not set - -# -# Network testing -# -# CONFIG_NET_PKTGEN is not set -# CONFIG_NETPOLL is not set -# CONFIG_NET_POLL_CONTROLLER is not set -# CONFIG_HAMRADIO is not set -# CONFIG_IRDA is not set -# CONFIG_BT is not set CONFIG_NETDEVICES=y # CONFIG_DUMMY is not set # CONFIG_BONDING is not set # CONFIG_EQUALIZER is not set # CONFIG_TUN is not set +# +# PHY device support +# +# CONFIG_PHYLIB is not set + # # Ethernet (10 or 100Mbit) # CONFIG_NET_ETHERNET=y CONFIG_MII=y CONFIG_SMC91X=y +# CONFIG_DM9000 is not set # # Ethernet (1000 Mbit) @@ -456,6 +527,8 @@ CONFIG_SMC91X=y # 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 @@ -470,10 +543,13 @@ CONFIG_INPUT=y # # Userland interfaces # -# CONFIG_INPUT_MOUSEDEV is not set +CONFIG_INPUT_MOUSEDEV=y +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 # CONFIG_INPUT_JOYDEV is not set # CONFIG_INPUT_TSDEV is not set -# CONFIG_INPUT_EVDEV is not set +CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # @@ -482,7 +558,13 @@ CONFIG_INPUT=y # CONFIG_INPUT_KEYBOARD is not set # CONFIG_INPUT_MOUSE is not set # CONFIG_INPUT_JOYSTICK is not set -# CONFIG_INPUT_TOUCHSCREEN is not set +CONFIG_INPUT_TOUCHSCREEN=y +# CONFIG_TOUCHSCREEN_GUNZE is not set +# CONFIG_TOUCHSCREEN_ELO is not set +# CONFIG_TOUCHSCREEN_MTOUCH is not set +# CONFIG_TOUCHSCREEN_MK712 is not set +CONFIG_TOUCHSCREEN_ADC_LH7=y +CONFIG_HAS_TOUCHSCREEN_ADC_LH7=y # CONFIG_INPUT_MISC is not set # @@ -490,7 +572,6 @@ CONFIG_INPUT=y # # CONFIG_SERIO is not set # CONFIG_GAMEPORT is not set -CONFIG_SOUND_GAMEPORT=y # # Character devices @@ -508,6 +589,8 @@ CONFIG_HW_CONSOLE=y # # Non-8250 serial port support # +# CONFIG_SERIAL_AMBA_PL010 is not set +# CONFIG_SERIAL_AMBA_PL011 is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y CONFIG_SERIAL_LH7A40X=y @@ -533,23 +616,46 @@ CONFIG_RTC=y # # Ftape, the floppy tape device driver # -# CONFIG_DRM 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 +# +# SPI support +# +# CONFIG_SPI is not set +# CONFIG_SPI_MASTER is not set + +# +# Dallas's 1-wire bus +# +# CONFIG_W1 is not set + +# +# Hardware Monitoring support +# +CONFIG_HWMON=y +# CONFIG_HWMON_VID is not set +# CONFIG_SENSORS_F71805F is not set +# CONFIG_HWMON_DEBUG_CHIP is not set + # # Misc devices # +# +# Multimedia Capabilities Port drivers +# + # # Multimedia devices # @@ -563,18 +669,83 @@ CONFIG_RTC=y # # Graphics support # -# CONFIG_FB is not set +CONFIG_FB=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +# CONFIG_FB_MACMODES is not set +# CONFIG_FB_MODE_HELPERS is not set +# CONFIG_FB_TILEBLITTING is not set +CONFIG_FB_ARMCLCD=y +CONFIG_FB_ARMCLCD_SHARP_LQ035Q7DB02_HRTFT=y +# CONFIG_FB_ARMCLCD_SHARP_LQ057Q3DC02 is not set +# CONFIG_FB_ARMCLCD_SHARP_LQ64D343 is not set +# CONFIG_FB_ARMCLCD_SHARP_LQ10D368 is not set +# CONFIG_FB_ARMCLCD_SHARP_LQ121S1DG41 is not set +# CONFIG_FB_ARMCLCD_AUO_A070VW01_WIDE is not set +# CONFIG_FB_ARMCLCD_HITACHI 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 is not set + +# +# Logo configuration +# +# CONFIG_LOGO is not set +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set # # Sound # -# CONFIG_SOUND is not set +CONFIG_SOUND=y + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=y +CONFIG_SND_TIMER=y +CONFIG_SND_PCM=y +# CONFIG_SND_SEQUENCER is not set +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=y +CONFIG_SND_PCM_OSS=y +# CONFIG_SND_RTCTIMER is not set +# CONFIG_SND_DYNAMIC_MINORS is not set +CONFIG_SND_SUPPORT_OLD_API=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set + +# +# Generic devices +# +CONFIG_SND_AC97_CODEC=y +CONFIG_SND_AC97_BUS=y +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set + +# +# ALSA ARM devices +# +# CONFIG_SND_ARMAACI is not set +CONFIG_SND_LH7A40X_AC97=y + +# +# USB devices +# +# CONFIG_SND_USB_AUDIO is not set + +# +# Open Sound System +# +# CONFIG_SOUND_PRIME is not set # # USB support @@ -595,6 +766,7 @@ CONFIG_USB_DEVICEFS=y # # USB Host Controller Drivers # +# CONFIG_USB_ISP116X_HCD is not set CONFIG_USB_OHCI_HCD=y # CONFIG_USB_OHCI_BIG_ENDIAN is not set CONFIG_USB_OHCI_LITTLE_ENDIAN=y @@ -603,16 +775,19 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y # # USB Device Class drivers # -# CONFIG_USB_BLUETOOTH_TTY is not set +# CONFIG_OBSOLETE_OSS_USB_DRIVER 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=y CONFIG_USB_STORAGE_DEBUG=y -# CONFIG_USB_STORAGE_RW_DETECT is not set CONFIG_USB_STORAGE_DATAFAB=y # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set @@ -621,22 +796,32 @@ CONFIG_USB_STORAGE_DATAFAB=y # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_STORAGE_ALAUDA is not set +# CONFIG_USB_STORAGE_ONETOUCH is not set +# CONFIG_USB_LIBUSUAL is not set # # USB Input Devices # CONFIG_USB_HID=y CONFIG_USB_HIDINPUT=y +# CONFIG_USB_HIDINPUT_POWERBOOK is not set # CONFIG_HID_FF is not set # CONFIG_USB_HIDDEV is not set # CONFIG_USB_AIPTEK is not set # CONFIG_USB_WACOM is not set +# CONFIG_USB_ACECAD is not set # CONFIG_USB_KBTAB is not set # CONFIG_USB_POWERMATE is not set # 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_ATI_REMOTE2 is not set +# CONFIG_USB_KEYSPAN_REMOTE is not set +# CONFIG_USB_APPLETOUCH is not set # # USB Imaging devices @@ -686,16 +871,33 @@ CONFIG_USB_MON=y # CONFIG_USB_PHIDGETKIT is not set # CONFIG_USB_PHIDGETSERVO is not set # CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_LD is not set # CONFIG_USB_TEST is not set # -# USB ATM/DSL drivers +# USB DSL modem support # # # USB Gadget Support # -# CONFIG_USB_GADGET is not set +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 is not set +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_LH7A40X is not set +CONFIG_USB_GADGET_LH7=y +CONFIG_USB_LH7=y +# 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=y +# CONFIG_USB_ETH is not set +# CONFIG_USB_GADGETFS is not set +# CONFIG_USB_FILE_STORAGE is not set +# CONFIG_USB_G_SERIAL is not set # # MMC/SD Card support @@ -707,6 +909,7 @@ CONFIG_USB_MON=y # CONFIG_EXT2_FS=y # CONFIG_EXT2_FS_XATTR is not set +# CONFIG_EXT2_FS_XIP is not set CONFIG_EXT3_FS=y CONFIG_EXT3_FS_XATTR=y # CONFIG_EXT3_FS_POSIX_ACL is not set @@ -716,17 +919,17 @@ CONFIG_JBD=y CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set - -# -# XFS support -# +# CONFIG_FS_POSIX_ACL is not set # CONFIG_XFS_FS is not set +# CONFIG_OCFS2_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 @@ -749,12 +952,11 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" # CONFIG_PROC_FS=y CONFIG_SYSFS=y -# CONFIG_DEVFS_FS is not set -# CONFIG_DEVPTS_FS_XATTR is not set CONFIG_TMPFS=y -# CONFIG_TMPFS_XATTR is not set # CONFIG_HUGETLB_PAGE is not set CONFIG_RAMFS=y +# CONFIG_RELAYFS_FS is not set +# CONFIG_CONFIGFS_FS is not set # # Miscellaneous filesystems @@ -769,8 +971,8 @@ CONFIG_RAMFS=y # CONFIG_JFFS_FS is not set CONFIG_JFFS2_FS=y CONFIG_JFFS2_FS_DEBUG=0 -# CONFIG_JFFS2_FS_NAND is not set -# CONFIG_JFFS2_FS_NOR_ECC is not set +CONFIG_JFFS2_FS_WRITEBUFFER=y +# CONFIG_JFFS2_SUMMARY is not set # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set CONFIG_JFFS2_ZLIB=y CONFIG_JFFS2_RTIME=y @@ -787,12 +989,14 @@ CONFIG_CRAMFS=y # CONFIG_NFS_FS=y CONFIG_NFS_V3=y +# CONFIG_NFS_V3_ACL is not set # CONFIG_NFS_V4 is not set # CONFIG_NFS_DIRECTIO is not set # CONFIG_NFSD is not set CONFIG_ROOT_NFS=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y +CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y # CONFIG_RPCSEC_GSS_KRB5 is not set # CONFIG_RPCSEC_GSS_SPKM3 is not set @@ -801,6 +1005,7 @@ CONFIG_SUNRPC=y # 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 @@ -820,6 +1025,7 @@ CONFIG_MSDOS_PARTITION=y # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set +# CONFIG_KARMA_PARTITION is not set # CONFIG_EFI_PARTITION is not set # @@ -875,19 +1081,24 @@ CONFIG_NLS_DEFAULT="iso8859-1" # Kernel hacking # # CONFIG_PRINTK_TIME is not set -CONFIG_DEBUG_KERNEL=y CONFIG_MAGIC_SYSRQ=y -CONFIG_LOG_BUF_SHIFT=14 +CONFIG_DEBUG_KERNEL=y +CONFIG_LOG_BUF_SHIFT=16 +CONFIG_DETECT_SOFTLOCKUP=y # CONFIG_SCHEDSTATS is not set # CONFIG_DEBUG_SLAB is not set CONFIG_DEBUG_PREEMPT=y +CONFIG_DEBUG_MUTEXES=y # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_SPINLOCK_SLEEP is not set # CONFIG_DEBUG_KOBJECT is not set CONFIG_DEBUG_BUGVERBOSE=y CONFIG_DEBUG_INFO=y # CONFIG_DEBUG_FS is not set +# CONFIG_DEBUG_VM is not set CONFIG_FRAME_POINTER=y +CONFIG_FORCED_INLINING=y +# CONFIG_RCU_TORTURE_TEST is not set CONFIG_DEBUG_USER=y # CONFIG_DEBUG_WAITQ is not set CONFIG_DEBUG_ERRORS=y @@ -912,6 +1123,7 @@ CONFIG_DEBUG_ERRORS=y # Library routines # # CONFIG_CRC_CCITT is not set +# CONFIG_CRC16 is not set CONFIG_CRC32=y # CONFIG_LIBCRC32C is not set CONFIG_ZLIB_INFLATE=y diff --git a/arch/arm/configs/omap_h2_1610_defconfig b/arch/arm/configs/omap_h2_1610_defconfig index 4e58d9341..05adb0b34 100644 --- a/arch/arm/configs/omap_h2_1610_defconfig +++ b/arch/arm/configs/omap_h2_1610_defconfig @@ -1,51 +1,55 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.12-rc1-bk2 -# Sun Mar 27 17:52:41 2005 +# Linux kernel version: 2.6.17 +# Thu Jun 29 15:25:18 2006 # CONFIG_ARM=y CONFIG_MMU=y -CONFIG_UID16=y CONFIG_RWSEM_GENERIC_SPINLOCK=y +CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CALIBRATE_DELAY=y -CONFIG_GENERIC_IOMAP=y +CONFIG_VECTORS_BASE=0xffff0000 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" # # 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 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_RELAY is not set +CONFIG_INITRAMFS_SOURCE="" +CONFIG_UID16=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y # CONFIG_EMBEDDED is not set CONFIG_KALLSYMS=y -# CONFIG_KALLSYMS_ALL is not set # CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_HOTPLUG=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y -CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_SHMEM=y -CONFIG_CC_ALIGN_FUNCTIONS=0 -CONFIG_CC_ALIGN_LABELS=0 -CONFIG_CC_ALIGN_LOOPS=0 -CONFIG_CC_ALIGN_JUMPS=0 +CONFIG_SLAB=y # CONFIG_TINY_SHMEM is not set CONFIG_BASE_SMALL=0 +# CONFIG_SLOB is not set # # Loadable module support @@ -53,25 +57,51 @@ CONFIG_BASE_SMALL=0 CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set -CONFIG_OBSOLETE_MODPARM=y # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_KMOD is not set +# +# Block layer +# +# CONFIG_BLK_DEV_IO_TRACE 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" + # # System Type # +# CONFIG_ARCH_AAEC2000 is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_REALVIEW is not set +# CONFIG_ARCH_VERSATILE is not set +# CONFIG_ARCH_AT91RM9200 is not set # 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_EP93XX is not set # CONFIG_ARCH_FOOTBRIDGE is not set -# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_NETX is not set +# CONFIG_ARCH_H720X is not set +# CONFIG_ARCH_IMX is not set # CONFIG_ARCH_IOP3XX is not set # CONFIG_ARCH_IXP4XX is not set # CONFIG_ARCH_IXP2000 is not set +# CONFIG_ARCH_IXP23XX is not set # CONFIG_ARCH_L7200 is not set +# CONFIG_ARCH_PNX4008 is not set # CONFIG_ARCH_PXA is not set # CONFIG_ARCH_RPC is not set # CONFIG_ARCH_SA1100 is not set @@ -79,21 +109,36 @@ CONFIG_OBSOLETE_MODPARM=y # CONFIG_ARCH_SHARK is not set # CONFIG_ARCH_LH7A40X is not set CONFIG_ARCH_OMAP=y -# CONFIG_ARCH_VERSATILE is not set -# CONFIG_ARCH_IMX is not set -# CONFIG_ARCH_H720X is not set # # TI OMAP Implementations # +CONFIG_ARCH_OMAP_OTG=y +CONFIG_ARCH_OMAP1=y +# CONFIG_ARCH_OMAP2 is not set + +# +# OMAP Feature Selections +# +# CONFIG_OMAP_RESET_CLOCKS is not set +CONFIG_OMAP_MUX=y +# CONFIG_OMAP_MUX_DEBUG is not set +CONFIG_OMAP_MUX_WARNINGS=y +# CONFIG_OMAP_MPU_TIMER is not set +CONFIG_OMAP_32K_TIMER=y +CONFIG_OMAP_32K_TIMER_HZ=128 +# CONFIG_OMAP_DM_TIMER is not set +CONFIG_OMAP_LL_DEBUG_UART1=y +# CONFIG_OMAP_LL_DEBUG_UART2 is not set +# CONFIG_OMAP_LL_DEBUG_UART3 is not set +CONFIG_OMAP_SERIAL_WAKE=y # # OMAP Core Type # # CONFIG_ARCH_OMAP730 is not set -# CONFIG_ARCH_OMAP1510 is not set +# CONFIG_ARCH_OMAP15XX is not set CONFIG_ARCH_OMAP16XX=y -CONFIG_ARCH_OMAP_OTG=y # # OMAP Board Type @@ -101,21 +146,15 @@ CONFIG_ARCH_OMAP_OTG=y # CONFIG_MACH_OMAP_INNOVATOR is not set CONFIG_MACH_OMAP_H2=y # CONFIG_MACH_OMAP_H3 is not set -# CONFIG_MACH_OMAP_H4 is not set # CONFIG_MACH_OMAP_OSK is not set +# CONFIG_MACH_NOKIA770 is not set # CONFIG_MACH_OMAP_GENERIC is not set # -# OMAP Feature Selections +# OMAP CPU Speed # -CONFIG_OMAP_MUX=y -# CONFIG_OMAP_MUX_DEBUG is not set -CONFIG_OMAP_MUX_WARNINGS=y -CONFIG_OMAP_MPU_TIMER=y -# CONFIG_OMAP_32K_TIMER is not set -CONFIG_OMAP_LL_DEBUG_UART1=y -# CONFIG_OMAP_LL_DEBUG_UART2 is not set -# CONFIG_OMAP_LL_DEBUG_UART3 is not set +# CONFIG_OMAP_CLOCKS_SET_BY_BOOTLOADER is not set +# CONFIG_OMAP_ARM_216MHZ is not set CONFIG_OMAP_ARM_192MHZ=y # CONFIG_OMAP_ARM_168MHZ is not set # CONFIG_OMAP_ARM_120MHZ is not set @@ -155,6 +194,18 @@ CONFIG_ARM_THUMB=y # Kernel Features # CONFIG_PREEMPT=y +CONFIG_NO_IDLE_HZ=y +CONFIG_HZ=128 +# CONFIG_AEABI 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_SPLIT_PTLOCK_CPUS=4096 # CONFIG_LEDS is not set CONFIG_ALIGNMENT_TRAP=y @@ -166,6 +217,22 @@ CONFIG_ZBOOT_ROM_BSS=0x0 CONFIG_CMDLINE="mem=32M console=ttyS0,115200n8 root=0801 ro init=/bin/sh" # CONFIG_XIP_KERNEL is not set +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_TABLE=y +# CONFIG_CPU_FREQ_DEBUG is not set +CONFIG_CPU_FREQ_STAT=y +# CONFIG_CPU_FREQ_STAT_DETAILS is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y +# CONFIG_CPU_FREQ_GOV_PERFORMANCE is not set +# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set +CONFIG_CPU_FREQ_GOV_USERSPACE=y +# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set +# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set + # # Floating point emulation # @@ -190,95 +257,116 @@ CONFIG_BINFMT_AOUT=y # Power management options # CONFIG_PM=y +CONFIG_PM_LEGACY=y +# CONFIG_PM_DEBUG is not set # CONFIG_APM is not set # -# Device Drivers +# Networking # +CONFIG_NET=y # -# Generic Driver Options +# Networking options # -CONFIG_STANDALONE=y -CONFIG_PREVENT_FIRMWARE_BUILD=y -# CONFIG_FW_LOADER is not set -CONFIG_DEBUG_DRIVER=y +# CONFIG_NETDEBUG is not set +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +CONFIG_UNIX=y +CONFIG_XFRM=y +# CONFIG_XFRM_USER is not set +# CONFIG_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=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_BOOTP=y +# CONFIG_IP_PNP_RARP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_ARPD is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_XFRM_TUNNEL is not set +# CONFIG_INET_TUNNEL is not set +CONFIG_INET_XFRM_MODE_TRANSPORT=y +CONFIG_INET_XFRM_MODE_TUNNEL=y +CONFIG_INET_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_INET6_XFRM_TUNNEL is not set +# CONFIG_INET6_TUNNEL is not set +# CONFIG_NETWORK_SECMARK is not set +# CONFIG_NETFILTER is not set # -# Memory Technology Devices (MTD) +# DCCP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_DCCP is not set + +# +# SCTP Configuration (EXPERIMENTAL) # -CONFIG_MTD=y -CONFIG_MTD_DEBUG=y -CONFIG_MTD_DEBUG_VERBOSE=3 -# CONFIG_MTD_CONCAT is not set -CONFIG_MTD_PARTITIONS=y -# CONFIG_MTD_REDBOOT_PARTS is not set -CONFIG_MTD_CMDLINE_PARTS=y -# CONFIG_MTD_AFS_PARTS is not set +# CONFIG_IP_SCTP is not set # -# User Modules And Translation Layers +# TIPC Configuration (EXPERIMENTAL) # -CONFIG_MTD_CHAR=y -CONFIG_MTD_BLOCK=y -# CONFIG_FTL is not set -# CONFIG_NFTL is not set -# CONFIG_INFTL is not set +# CONFIG_TIPC 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 # -# RAM/ROM/Flash chip drivers +# QoS and/or fair queueing # -CONFIG_MTD_CFI=y -# CONFIG_MTD_JEDECPROBE is not set -CONFIG_MTD_GEN_PROBE=y -# CONFIG_MTD_CFI_ADV_OPTIONS is not set -CONFIG_MTD_MAP_BANK_WIDTH_1=y -CONFIG_MTD_MAP_BANK_WIDTH_2=y -CONFIG_MTD_MAP_BANK_WIDTH_4=y -# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set -# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set -# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set -CONFIG_MTD_CFI_I1=y -CONFIG_MTD_CFI_I2=y -# CONFIG_MTD_CFI_I4 is not set -# CONFIG_MTD_CFI_I8 is not set -CONFIG_MTD_CFI_INTELEXT=y -# CONFIG_MTD_CFI_AMDSTD is not set -# CONFIG_MTD_CFI_STAA is not set -CONFIG_MTD_CFI_UTIL=y -# CONFIG_MTD_RAM is not set -# CONFIG_MTD_ROM is not set -# CONFIG_MTD_ABSENT is not set -# CONFIG_MTD_XIP is not set +# CONFIG_NET_SCHED is not set # -# Mapping drivers for chip access +# Network testing # -# CONFIG_MTD_COMPLEX_MAPPINGS is not set -# CONFIG_MTD_PHYSMAP is not set -# CONFIG_MTD_ARM_INTEGRATOR is not set -# CONFIG_MTD_EDB7312 is not set +# 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 # -# Self-contained MTD device drivers +# 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 +# Generic Driver Options # -# CONFIG_MTD_DOC2000 is not set -# CONFIG_MTD_DOC2001 is not set -# CONFIG_MTD_DOC2001PLUS is not set +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +# CONFIG_FW_LOADER is not set +# CONFIG_SYS_HYPERVISOR is not set # -# NAND Flash Device Drivers +# Connector - unified userspace <-> kernelspace linker # -# CONFIG_MTD_NAND is not set +# CONFIG_CONNECTOR is not set + +# +# Memory Technology Devices (MTD) +# +# CONFIG_MTD is not set # # Parallel port support @@ -292,7 +380,6 @@ CONFIG_MTD_CFI_UTIL=y # # Block devices # -# CONFIG_BLK_DEV_FD is not set # CONFIG_BLK_DEV_COW_COMMON is not set CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_CRYPTOLOOP is not set @@ -301,21 +388,13 @@ CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=8192 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 # # SCSI device support # +# CONFIG_RAID_ATTRS is not set CONFIG_SCSI=y CONFIG_SCSI_PROC_FS=y @@ -327,6 +406,7 @@ CONFIG_SCSI_PROC_FS=y # CONFIG_CHR_DEV_OSST is not set # CONFIG_BLK_DEV_SR is not set # CONFIG_CHR_DEV_SG is not set +# CONFIG_CHR_DEV_SCH is not set # # Some SCSI devices (e.g. CD jukebox) support multiple LUNs @@ -341,10 +421,12 @@ CONFIG_SCSI_PROC_FS=y # CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set +# CONFIG_SCSI_SAS_ATTRS is not set # # SCSI low-level drivers # +# CONFIG_ISCSI_TCP is not set # CONFIG_SCSI_SATA is not set # CONFIG_SCSI_DEBUG is not set @@ -356,6 +438,7 @@ CONFIG_SCSI_PROC_FS=y # # Fusion MPT device support # +# CONFIG_FUSION is not set # # IEEE 1394 (FireWire) support @@ -366,82 +449,26 @@ CONFIG_SCSI_PROC_FS=y # # -# Networking support -# -CONFIG_NET=y - -# -# Networking options -# -CONFIG_PACKET=y -# CONFIG_PACKET_MMAP is not set -# CONFIG_NETLINK_DEV is not set -CONFIG_UNIX=y -# CONFIG_NET_KEY is not set -CONFIG_INET=y -# CONFIG_IP_MULTICAST is not set -# CONFIG_IP_ADVANCED_ROUTER is not set -CONFIG_IP_PNP=y -CONFIG_IP_PNP_DHCP=y -CONFIG_IP_PNP_BOOTP=y -# CONFIG_IP_PNP_RARP is not set -# CONFIG_NET_IPIP is not set -# CONFIG_NET_IPGRE is not set -# CONFIG_ARPD is not set -# CONFIG_SYN_COOKIES is not set -# CONFIG_INET_AH is not set -# CONFIG_INET_ESP is not set -# CONFIG_INET_IPCOMP is not set -# CONFIG_INET_TUNNEL is not set -CONFIG_IP_TCPDIAG=y -# CONFIG_IP_TCPDIAG_IPV6 is not set -# CONFIG_IPV6 is not set -# CONFIG_NETFILTER is not set - -# -# SCTP Configuration (EXPERIMENTAL) +# Network device support # -# CONFIG_IP_SCTP is not set -# CONFIG_ATM is not set -# CONFIG_BRIDGE is not set -# CONFIG_VLAN_8021Q is not set -# CONFIG_DECNET is not set -# CONFIG_LLC2 is not set -# CONFIG_IPX is not set -# CONFIG_ATALK is not set -# CONFIG_X25 is not set -# CONFIG_LAPB is not set -# CONFIG_NET_DIVERT is not set -# CONFIG_ECONET is not set -# CONFIG_WAN_ROUTER is not set - -# -# QoS and/or fair queueing -# -# CONFIG_NET_SCHED is not set -# CONFIG_NET_CLS_ROUTE is not set - -# -# Network testing -# -# CONFIG_NET_PKTGEN is not set -# CONFIG_NETPOLL is not set -# CONFIG_NET_POLL_CONTROLLER is not set -# CONFIG_HAMRADIO is not set -# CONFIG_IRDA is not set -# CONFIG_BT is not set CONFIG_NETDEVICES=y # CONFIG_DUMMY is not set # CONFIG_BONDING is not set # CONFIG_EQUALIZER is not set # CONFIG_TUN is not set +# +# PHY device support +# +# CONFIG_PHYLIB is not set + # # Ethernet (10 or 100Mbit) # CONFIG_NET_ETHERNET=y CONFIG_MII=y CONFIG_SMC91X=y +# CONFIG_DM9000 is not set # # Ethernet (1000 Mbit) @@ -471,6 +498,7 @@ CONFIG_PPP=y # CONFIG_PPP_SYNC_TTY is not set # CONFIG_PPP_DEFLATE is not set # CONFIG_PPP_BSDCOMP is not set +# CONFIG_PPP_MPPE is not set # CONFIG_PPPOE is not set CONFIG_SLIP=y CONFIG_SLIP_COMPRESSED=y @@ -478,6 +506,8 @@ CONFIG_SLIP_COMPRESSED=y # CONFIG_SLIP_MODE_SLIP6 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 @@ -518,7 +548,6 @@ CONFIG_SERIO=y CONFIG_SERIO_SERPORT=y # CONFIG_SERIO_RAW is not set # CONFIG_GAMEPORT is not set -CONFIG_SOUND_GAMEPORT=y # # Character devices @@ -526,6 +555,7 @@ CONFIG_SOUND_GAMEPORT=y CONFIG_VT=y CONFIG_VT_CONSOLE=y CONFIG_HW_CONSOLE=y +# CONFIG_VT_HW_CONSOLE_BINDING is not set # CONFIG_SERIAL_NONSTANDARD is not set # @@ -534,6 +564,7 @@ CONFIG_HW_CONSOLE=y CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_RUNTIME_UARTS=4 # CONFIG_SERIAL_8250_EXTENDED is not set # @@ -559,96 +590,68 @@ CONFIG_WATCHDOG_NOWAYOUT=y # Watchdog Device Drivers # # CONFIG_SOFT_WATCHDOG is not set +# CONFIG_HW_RANDOM 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 # -# CONFIG_DRM 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=y -CONFIG_I2C_CHARDEV=y - -# -# I2C Algorithms -# -# CONFIG_I2C_ALGOBIT is not set -# CONFIG_I2C_ALGOPCF is not set -# CONFIG_I2C_ALGOPCA is not set - -# -# I2C Hardware Bus support -# -# CONFIG_I2C_ISA is not set -# CONFIG_I2C_PARPORT_LIGHT is not set -# CONFIG_I2C_STUB is not set -# CONFIG_I2C_PCA_ISA is not set - -# -# Hardware Sensors Chip support -# -# CONFIG_I2C_SENSOR is not set -# CONFIG_SENSORS_ADM1021 is not set -# CONFIG_SENSORS_ADM1025 is not set -# CONFIG_SENSORS_ADM1026 is not set -# CONFIG_SENSORS_ADM1031 is not set -# CONFIG_SENSORS_ASB100 is not set -# CONFIG_SENSORS_DS1621 is not set -# CONFIG_SENSORS_FSCHER is not set -# CONFIG_SENSORS_FSCPOS is not set -# CONFIG_SENSORS_GL518SM is not set -# CONFIG_SENSORS_GL520SM is not set -# CONFIG_SENSORS_IT87 is not set -# CONFIG_SENSORS_LM63 is not set -# CONFIG_SENSORS_LM75 is not set -# CONFIG_SENSORS_LM77 is not set -# CONFIG_SENSORS_LM78 is not set -# CONFIG_SENSORS_LM80 is not set -# CONFIG_SENSORS_LM83 is not set -# CONFIG_SENSORS_LM85 is not set -# CONFIG_SENSORS_LM87 is not set -# CONFIG_SENSORS_LM90 is not set -# CONFIG_SENSORS_MAX1619 is not set -# CONFIG_SENSORS_PC87360 is not set -# CONFIG_SENSORS_SMSC47B397 is not set -# CONFIG_SENSORS_SMSC47M1 is not set -# CONFIG_SENSORS_W83781D is not set -# CONFIG_SENSORS_W83L785TS is not set -# CONFIG_SENSORS_W83627HF is not set - -# -# Other I2C Chip support -# -# CONFIG_SENSORS_EEPROM is not set -# CONFIG_SENSORS_PCF8574 is not set -# CONFIG_SENSORS_PCF8591 is not set -# CONFIG_SENSORS_RTC8564 is not set -CONFIG_ISP1301_OMAP=y -# CONFIG_I2C_DEBUG_CORE is not set -# CONFIG_I2C_DEBUG_ALGO is not set -# CONFIG_I2C_DEBUG_BUS is not set -# CONFIG_I2C_DEBUG_CHIP is not set +# CONFIG_I2C is not set + +# +# SPI support +# +# CONFIG_SPI is not set +# CONFIG_SPI_MASTER is not set + +# +# Dallas's 1-wire bus +# + +# +# Hardware Monitoring support +# +CONFIG_HWMON=y +# CONFIG_HWMON_VID is not set +# CONFIG_SENSORS_ABITUGURU is not set +# CONFIG_SENSORS_F71805F is not set +# CONFIG_HWMON_DEBUG_CHIP is not set # # Misc devices # +# +# LED devices +# +# CONFIG_NEW_LEDS is not set + +# +# LED drivers +# + +# +# LED Triggers +# + # # Multimedia devices # # CONFIG_VIDEO_DEV is not set +CONFIG_VIDEO_V4L2=y # # Digital Video Broadcasting Devices @@ -658,13 +661,16 @@ CONFIG_ISP1301_OMAP=y # # Graphics support # +CONFIG_FIRMWARE_EDID=y CONFIG_FB=y # CONFIG_FB_CFB_FILLRECT is not set # CONFIG_FB_CFB_COPYAREA is not set # CONFIG_FB_CFB_IMAGEBLIT is not set -# CONFIG_FB_SOFT_CURSOR is not set +# CONFIG_FB_MACMODES is not set +# CONFIG_FB_BACKLIGHT is not set CONFIG_FB_MODE_HELPERS=y # CONFIG_FB_TILEBLITTING is not set +# CONFIG_FB_S1D13XXX is not set # CONFIG_FB_VIRTUAL is not set # @@ -673,15 +679,18 @@ CONFIG_FB_MODE_HELPERS=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 # 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 @@ -706,70 +715,58 @@ CONFIG_SOUND=y # Open Sound System # CONFIG_SOUND_PRIME=y -# CONFIG_SOUND_BT878 is not set -# CONFIG_SOUND_FUSION is not set -# CONFIG_SOUND_CS4281 is not set -# CONFIG_SOUND_SONICVIBES is not set -# CONFIG_SOUND_TRIDENT is not set # CONFIG_SOUND_MSNDCLAS is not set # CONFIG_SOUND_MSNDPIN is not set -# CONFIG_SOUND_OSS is not set -# CONFIG_SOUND_TVMIXER is not set -# CONFIG_SOUND_AD1980 is not set # # USB support # CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB_ARCH_HAS_OHCI=y +# CONFIG_USB_ARCH_HAS_EHCI is not set # CONFIG_USB is not set +# +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# + # # USB Gadget Support # -CONFIG_USB_GADGET=y -# CONFIG_USB_GADGET_DEBUG_FILES is not set -# CONFIG_USB_GADGET_NET2280 is not set -# CONFIG_USB_GADGET_PXA2XX is not set -# CONFIG_USB_GADGET_GOKU is not set -# CONFIG_USB_GADGET_SA1100 is not set -# CONFIG_USB_GADGET_LH7A40X is not set -# CONFIG_USB_GADGET_DUMMY_HCD is not set -CONFIG_USB_GADGET_OMAP=y -CONFIG_USB_OMAP=y -# 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 +# CONFIG_USB_GADGET is not set # # MMC/SD Card support # # CONFIG_MMC is not set +# +# Real Time Clock +# +CONFIG_RTC_LIB=y +# CONFIG_RTC_CLASS is not set + # # File systems # CONFIG_EXT2_FS=y # CONFIG_EXT2_FS_XATTR is not set +# CONFIG_EXT2_FS_XIP is not set # CONFIG_EXT3_FS is not set -# CONFIG_JBD is not set # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set - -# -# XFS support -# +# CONFIG_FS_POSIX_ACL is not set # CONFIG_XFS_FS is not set +# CONFIG_OCFS2_FS is not set # CONFIG_MINIX_FS is not set CONFIG_ROMFS_FS=y +CONFIG_INOTIFY=y +CONFIG_INOTIFY_USER=y # CONFIG_QUOTA is not set CONFIG_DNOTIFY=y # CONFIG_AUTOFS_FS is not set # CONFIG_AUTOFS4_FS is not set +# CONFIG_FUSE_FS is not set # # CD-ROM/DVD Filesystems @@ -791,11 +788,10 @@ CONFIG_FAT_DEFAULT_CODEPAGE=437 # CONFIG_PROC_FS=y CONFIG_SYSFS=y -# CONFIG_DEVFS_FS is not set -# CONFIG_DEVPTS_FS_XATTR is not set # CONFIG_TMPFS is not set # CONFIG_HUGETLB_PAGE is not set CONFIG_RAMFS=y +# CONFIG_CONFIGFS_FS is not set # # Miscellaneous filesystems @@ -807,15 +803,6 @@ CONFIG_RAMFS=y # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set -# CONFIG_JFFS_FS is not set -CONFIG_JFFS2_FS=y -CONFIG_JFFS2_FS_DEBUG=2 -# CONFIG_JFFS2_FS_NAND is not set -# CONFIG_JFFS2_FS_NOR_ECC is not set -# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set -CONFIG_JFFS2_ZLIB=y -CONFIG_JFFS2_RTIME=y -# CONFIG_JFFS2_RUBIN is not set CONFIG_CRAMFS=y # CONFIG_VXFS_FS is not set # CONFIG_HPFS_FS is not set @@ -828,12 +815,14 @@ CONFIG_CRAMFS=y # CONFIG_NFS_FS=y CONFIG_NFS_V3=y +# CONFIG_NFS_V3_ACL is not set CONFIG_NFS_V4=y # CONFIG_NFS_DIRECTIO is not set # CONFIG_NFSD is not set CONFIG_ROOT_NFS=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y +CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y CONFIG_RPCSEC_GSS_KRB5=y @@ -843,6 +832,7 @@ CONFIG_RPCSEC_GSS_KRB5=y # 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 @@ -903,24 +893,14 @@ CONFIG_NLS_DEFAULT="iso8859-1" # Kernel hacking # # CONFIG_PRINTK_TIME is not set -CONFIG_DEBUG_KERNEL=y # CONFIG_MAGIC_SYSRQ is not set +# CONFIG_DEBUG_KERNEL is not set CONFIG_LOG_BUF_SHIFT=14 -# 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=y -CONFIG_DEBUG_INFO=y # CONFIG_DEBUG_FS is not set CONFIG_FRAME_POINTER=y -CONFIG_DEBUG_USER=y -# CONFIG_DEBUG_WAITQ is not set -CONFIG_DEBUG_ERRORS=y -CONFIG_DEBUG_LL=y -# CONFIG_DEBUG_ICEDCC is not set +# CONFIG_UNWIND_INFO is not set +# CONFIG_DEBUG_USER is not set # # Security options @@ -965,7 +945,7 @@ CONFIG_CRYPTO_DES=y # Library routines # # CONFIG_CRC_CCITT is not set +# CONFIG_CRC16 is not set CONFIG_CRC32=y # CONFIG_LIBCRC32C is not set CONFIG_ZLIB_INFLATE=y -CONFIG_ZLIB_DEFLATE=y diff --git a/arch/arm/configs/s3c2410_defconfig b/arch/arm/configs/s3c2410_defconfig index 3cec29d56..f20814e6f 100644 --- a/arch/arm/configs/s3c2410_defconfig +++ b/arch/arm/configs/s3c2410_defconfig @@ -1,12 +1,14 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.16 -# Mon Mar 20 20:36:02 2006 +# Linux kernel version: 2.6.17-git9 +# Sun Jun 25 23:56:32 2006 # CONFIG_ARM=y CONFIG_MMU=y CONFIG_RWSEM_GENERIC_SPINLOCK=y +CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_VECTORS_BASE=0xffff0000 # # Code maturity level options @@ -27,6 +29,7 @@ CONFIG_SYSVIPC=y CONFIG_SYSCTL=y # CONFIG_AUDIT is not set # CONFIG_IKCONFIG is not set +# CONFIG_RELAY is not set CONFIG_INITRAMFS_SOURCE="" CONFIG_UID16=y CONFIG_CC_OPTIMIZE_FOR_SIZE=y @@ -42,22 +45,16 @@ CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y CONFIG_SHMEM=y -CONFIG_CC_ALIGN_FUNCTIONS=0 -CONFIG_CC_ALIGN_LABELS=0 -CONFIG_CC_ALIGN_LOOPS=0 -CONFIG_CC_ALIGN_JUMPS=0 CONFIG_SLAB=y # CONFIG_TINY_SHMEM is not set CONFIG_BASE_SMALL=0 # CONFIG_SLOB is not set -CONFIG_OBSOLETE_INTERMODULE=y # # 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 @@ -65,6 +62,7 @@ CONFIG_KMOD=y # # Block layer # +# CONFIG_BLK_DEV_IO_TRACE is not set # # IO Schedulers @@ -82,17 +80,26 @@ CONFIG_DEFAULT_IOSCHED="anticipatory" # # System Type # +# CONFIG_ARCH_AAEC2000 is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_REALVIEW is not set +# CONFIG_ARCH_VERSATILE is not set +# CONFIG_ARCH_AT91RM9200 is not set # 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_EP93XX is not set # CONFIG_ARCH_FOOTBRIDGE is not set -# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_NETX is not set +# CONFIG_ARCH_H720X is not set +# CONFIG_ARCH_IMX is not set # CONFIG_ARCH_IOP3XX is not set # CONFIG_ARCH_IXP4XX is not set # CONFIG_ARCH_IXP2000 is not set +# CONFIG_ARCH_IXP23XX is not set # CONFIG_ARCH_L7200 is not set +# CONFIG_ARCH_PNX4008 is not set # CONFIG_ARCH_PXA is not set # CONFIG_ARCH_RPC is not set # CONFIG_ARCH_SA1100 is not set @@ -100,12 +107,6 @@ CONFIG_ARCH_S3C2410=y # 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_REALVIEW is not set -# CONFIG_ARCH_IMX is not set -# CONFIG_ARCH_H720X is not set -# CONFIG_ARCH_AAEC2000 is not set -# CONFIG_ARCH_AT91RM9200 is not set # # S3C24XX Implementations @@ -116,14 +117,22 @@ CONFIG_ARCH_BAST=y CONFIG_BAST_PC104_IRQ=y CONFIG_ARCH_H1940=y CONFIG_MACH_N30=y +CONFIG_MACH_SMDK=y CONFIG_ARCH_SMDK2410=y CONFIG_ARCH_S3C2440=y +CONFIG_SMDK2440_CPU2440=y +CONFIG_SMDK2440_CPU2442=y +CONFIG_MACH_SMDK2413=y CONFIG_MACH_VR1000=y CONFIG_MACH_RX3715=y CONFIG_MACH_OTOM=y CONFIG_MACH_NEXCODER_2440=y +CONFIG_S3C2410_CLOCK=y CONFIG_CPU_S3C2410=y +CONFIG_CPU_S3C2412=y +CONFIG_CPU_S3C244X=y CONFIG_CPU_S3C2440=y +CONFIG_CPU_S3C2442=y # # S3C2410 Boot @@ -146,8 +155,11 @@ CONFIG_S3C2410_LOWLEVEL_UART_PORT=0 # CONFIG_CPU_32=y CONFIG_CPU_ARM920T=y +CONFIG_CPU_ARM926T=y CONFIG_CPU_32v4=y +CONFIG_CPU_32v5=y CONFIG_CPU_ABRT_EV4T=y +CONFIG_CPU_ABRT_EV5TJ=y CONFIG_CPU_CACHE_V4WT=y CONFIG_CPU_CACHE_VIVT=y CONFIG_CPU_COPY_V4WB=y @@ -160,6 +172,7 @@ CONFIG_CPU_TLB_V4WBI=y # CONFIG_CPU_ICACHE_DISABLE is not set # CONFIG_CPU_DCACHE_DISABLE is not set # CONFIG_CPU_DCACHE_WRITETHROUGH is not set +# CONFIG_CPU_CACHE_ROUND_ROBIN is not set # # Bus support @@ -207,6 +220,7 @@ CONFIG_CMDLINE="root=/dev/hda1 ro init=/bin/bash console=ttySAC0" CONFIG_FPE_NWFPE=y # CONFIG_FPE_NWFPE_XP is not set # CONFIG_FPE_FASTFPE is not set +# CONFIG_VFP is not set # # Userspace binary formats @@ -235,6 +249,8 @@ CONFIG_NET=y # CONFIG_NETDEBUG is not set # CONFIG_PACKET is not set CONFIG_UNIX=y +CONFIG_XFRM=y +# CONFIG_XFRM_USER is not set # CONFIG_NET_KEY is not set CONFIG_INET=y # CONFIG_IP_MULTICAST is not set @@ -251,12 +267,18 @@ CONFIG_IP_PNP_BOOTP=y # CONFIG_INET_AH is not set # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set +# CONFIG_INET_XFRM_TUNNEL is not set # CONFIG_INET_TUNNEL is not set +CONFIG_INET_XFRM_MODE_TRANSPORT=y +CONFIG_INET_XFRM_MODE_TUNNEL=y CONFIG_INET_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_INET6_XFRM_TUNNEL is not set +# CONFIG_INET6_TUNNEL is not set +# CONFIG_NETWORK_SECMARK is not set # CONFIG_NETFILTER is not set # @@ -311,6 +333,7 @@ CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y # CONFIG_FW_LOADER is not set # CONFIG_DEBUG_DRIVER is not set +# CONFIG_SYS_HYPERVISOR is not set # # Connector - unified userspace <-> kernelspace linker @@ -360,7 +383,6 @@ CONFIG_MTD_CFI_I2=y # CONFIG_MTD_CFI_I8 is not set CONFIG_MTD_CFI_INTELEXT=y CONFIG_MTD_CFI_AMDSTD=y -CONFIG_MTD_CFI_AMDSTD_RETRY=0 # CONFIG_MTD_CFI_STAA is not set CONFIG_MTD_CFI_UTIL=y # CONFIG_MTD_RAM is not set @@ -385,7 +407,6 @@ CONFIG_MTD_BAST_MAXSIZE=4 # 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 # @@ -400,10 +421,12 @@ CONFIG_MTD_BAST_MAXSIZE=4 # CONFIG_MTD_NAND=y # CONFIG_MTD_NAND_VERIFY_WRITE is not set +# CONFIG_MTD_NAND_ECC_SMC is not set CONFIG_MTD_NAND_IDS=y CONFIG_MTD_NAND_S3C2410=y # CONFIG_MTD_NAND_S3C2410_DEBUG is not set # CONFIG_MTD_NAND_S3C2410_HWECC is not set +# CONFIG_MTD_NAND_S3C2410_CLKSTOP is not set # CONFIG_MTD_NAND_DISKONCHIP is not set # CONFIG_MTD_NAND_NANDSIM is not set @@ -417,8 +440,8 @@ CONFIG_MTD_NAND_S3C2410=y # CONFIG_PARPORT=y # CONFIG_PARPORT_PC is not set -# CONFIG_PARPORT_ARC is not set # CONFIG_PARPORT_GSC is not set +# CONFIG_PARPORT_AX88796 is not set CONFIG_PARPORT_1284=y # @@ -694,7 +717,6 @@ CONFIG_S3C2410_WATCHDOG=y # # CONFIG_USBPCWATCHDOG is not set # CONFIG_NVRAM is not set -# CONFIG_RTC is not set CONFIG_S3C2410_RTC=y # CONFIG_DTLK is not set # CONFIG_R3964 is not set @@ -728,6 +750,7 @@ CONFIG_I2C_ALGOBIT=m # # CONFIG_I2C_ELEKTOR is not set CONFIG_I2C_ISA=m +# CONFIG_I2C_OCORES is not set # CONFIG_I2C_PARPORT is not set # CONFIG_I2C_PARPORT_LIGHT is not set CONFIG_I2C_S3C2410=y @@ -743,9 +766,7 @@ CONFIG_SENSORS_EEPROM=m # 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_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 @@ -760,13 +781,13 @@ CONFIG_SENSORS_EEPROM=m # # Dallas's 1-wire bus # -# CONFIG_W1 is not set # # Hardware Monitoring support # CONFIG_HWMON=y CONFIG_HWMON_VID=m +# CONFIG_SENSORS_ABITUGURU is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set @@ -794,8 +815,10 @@ CONFIG_SENSORS_LM85=m # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_SMSC47M1 is not set +# CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_W83781D is not set +# CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83627HF is not set @@ -807,18 +830,29 @@ CONFIG_SENSORS_LM85=m # # -# Multimedia Capabilities Port drivers +# LED devices +# +# CONFIG_NEW_LEDS is not set + +# +# LED drivers +# + +# +# LED Triggers # # # Multimedia devices # # CONFIG_VIDEO_DEV is not set +CONFIG_VIDEO_V4L2=y # # Digital Video Broadcasting Devices # # CONFIG_DVB is not set +# CONFIG_USB_DABUSB is not set # # Graphics support @@ -828,6 +862,8 @@ CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y # CONFIG_FB_MACMODES is not set +CONFIG_FB_FIRMWARE_EDID=y +# CONFIG_FB_BACKLIGHT is not set CONFIG_FB_MODE_HELPERS=y # CONFIG_FB_TILEBLITTING is not set # CONFIG_FB_S1D13XXX is not set @@ -863,6 +899,7 @@ CONFIG_FONT_8x16=y # CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB_ARCH_HAS_OHCI=y +# CONFIG_USB_ARCH_HAS_EHCI is not set CONFIG_USB=y # CONFIG_USB_DEBUG is not set @@ -915,9 +952,7 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y # CONFIG_USB_ACECAD is not set # CONFIG_USB_KBTAB is not set # CONFIG_USB_POWERMATE is not set -# CONFIG_USB_MTOUCH is not set -# CONFIG_USB_ITMTOUCH is not set -# CONFIG_USB_EGALAX is not set +# CONFIG_USB_TOUCHSCREEN is not set # CONFIG_USB_YEALINK is not set # CONFIG_USB_XPAD is not set # CONFIG_USB_ATI_REMOTE is not set @@ -930,15 +965,6 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y # # CONFIG_USB_MDC800 is not set -# -# USB Multimedia devices -# -# CONFIG_USB_DABUSB is not set - -# -# Video4Linux support is needed for USB Multimedia device support -# - # # USB Network Adapters # @@ -969,10 +995,12 @@ CONFIG_USB_MON=y # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_LED is not set +# CONFIG_USB_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_PHIDGETKIT is not set # CONFIG_USB_PHIDGETSERVO is not set # CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_APPLEDISPLAY is not set # CONFIG_USB_LD is not set # CONFIG_USB_TEST is not set @@ -984,23 +1012,18 @@ CONFIG_USB_MON=y # USB Gadget Support # # CONFIG_USB_GADGET is not set -# CONFIG_USB_GADGET_NET2280 is not set -# CONFIG_USB_GADGET_PXA2XX 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_ZERO is not set -# CONFIG_USB_ETH is not set -# 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 is not set +# +# Real Time Clock +# +CONFIG_RTC_LIB=y +# CONFIG_RTC_CLASS is not set + # # File systems # @@ -1022,6 +1045,7 @@ CONFIG_FS_MBCACHE=y # CONFIG_MINIX_FS is not set CONFIG_ROMFS_FS=y CONFIG_INOTIFY=y +CONFIG_INOTIFY_USER=y # CONFIG_QUOTA is not set CONFIG_DNOTIFY=y # CONFIG_AUTOFS_FS is not set @@ -1052,7 +1076,6 @@ CONFIG_SYSFS=y # CONFIG_TMPFS is not set # CONFIG_HUGETLB_PAGE is not set CONFIG_RAMFS=y -# CONFIG_RELAYFS_FS is not set # CONFIG_CONFIGFS_FS is not set # @@ -1193,6 +1216,7 @@ CONFIG_DEBUG_INFO=y # CONFIG_DEBUG_FS is not set # CONFIG_DEBUG_VM is not set CONFIG_FRAME_POINTER=y +# CONFIG_UNWIND_INFO is not set CONFIG_FORCED_INLINING=y # CONFIG_RCU_TORTURE_TEST is not set CONFIG_DEBUG_USER=y diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile index a601b8b55..1320a0efc 100644 --- a/arch/arm/kernel/Makefile +++ b/arch/arm/kernel/Makefile @@ -13,16 +13,18 @@ obj-y := compat.o entry-armv.o entry-common.o irq.o \ obj-$(CONFIG_APM) += apm.o obj-$(CONFIG_ISA_DMA_API) += dma.o obj-$(CONFIG_ARCH_ACORN) += ecard.o -obj-$(CONFIG_FOOTBRIDGE) += isa.o obj-$(CONFIG_FIQ) += fiq.o obj-$(CONFIG_MODULES) += armksyms.o module.o obj-$(CONFIG_ARTHUR) += arthur.o obj-$(CONFIG_ISA_DMA) += dma-isa.o -obj-$(CONFIG_PCI) += bios32.o +obj-$(CONFIG_PCI) += bios32.o isa.o obj-$(CONFIG_SMP) += smp.o obj-$(CONFIG_OABI_COMPAT) += sys_oabi-compat.o -obj-$(CONFIG_IWMMXT) += iwmmxt.o +obj-$(CONFIG_CRUNCH) += crunch.o crunch-bits.o +AFLAGS_crunch-bits.o := -Wa,-mcpu=ep9312 + +obj-$(CONFIG_IWMMXT) += iwmmxt.o iwmmxt-notifier.o AFLAGS_iwmmxt.o := -Wa,-mcpu=iwmmxt ifneq ($(CONFIG_ARCH_EBSA110),y) diff --git a/arch/arm/kernel/apm.c b/arch/arm/kernel/apm.c index 2bed290fe..33c55689f 100644 --- a/arch/arm/kernel/apm.c +++ b/arch/arm/kernel/apm.c @@ -10,7 +10,6 @@ * [This document is available from Microsoft at: * http://www.microsoft.com/hwdev/busbios/amp_12.htm] */ -#include #include #include #include diff --git a/arch/arm/kernel/armksyms.c b/arch/arm/kernel/armksyms.c index c49b5d4d7..da69e6605 100644 --- a/arch/arm/kernel/armksyms.c +++ b/arch/arm/kernel/armksyms.c @@ -109,11 +109,13 @@ EXPORT_SYMBOL(memchr); EXPORT_SYMBOL(__memzero); /* user mem (segment) */ -EXPORT_SYMBOL(__arch_copy_from_user); -EXPORT_SYMBOL(__arch_copy_to_user); -EXPORT_SYMBOL(__arch_clear_user); -EXPORT_SYMBOL(__arch_strnlen_user); -EXPORT_SYMBOL(__arch_strncpy_from_user); +EXPORT_SYMBOL(__strnlen_user); +EXPORT_SYMBOL(__strncpy_from_user); + +#ifdef CONFIG_MMU +EXPORT_SYMBOL(__copy_from_user); +EXPORT_SYMBOL(__copy_to_user); +EXPORT_SYMBOL(__clear_user); EXPORT_SYMBOL(__get_user_1); EXPORT_SYMBOL(__get_user_2); @@ -123,6 +125,7 @@ EXPORT_SYMBOL(__put_user_1); EXPORT_SYMBOL(__put_user_2); EXPORT_SYMBOL(__put_user_4); EXPORT_SYMBOL(__put_user_8); +#endif /* crypto hash */ EXPORT_SYMBOL(sha_transform); diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c index 396efba9b..cc2d58d02 100644 --- a/arch/arm/kernel/asm-offsets.c +++ b/arch/arm/kernel/asm-offsets.c @@ -59,6 +59,9 @@ int main(void) DEFINE(TI_VFPSTATE, offsetof(struct thread_info, vfpstate)); #ifdef CONFIG_IWMMXT DEFINE(TI_IWMMXT_STATE, offsetof(struct thread_info, fpstate.iwmmxt)); +#endif +#ifdef CONFIG_CRUNCH + DEFINE(TI_CRUNCH_STATE, offsetof(struct thread_info, crunchstate)); #endif BLANK(); DEFINE(S_R0, offsetof(struct pt_regs, ARM_r0)); @@ -102,6 +105,7 @@ int main(void) BLANK(); DEFINE(PROC_INFO_SZ, sizeof(struct proc_info_list)); DEFINE(PROCINFO_INITFUNC, offsetof(struct proc_info_list, __cpu_flush)); - DEFINE(PROCINFO_MMUFLAGS, offsetof(struct proc_info_list, __cpu_mmu_flags)); + DEFINE(PROCINFO_MM_MMUFLAGS, offsetof(struct proc_info_list, __cpu_mm_mmu_flags)); + DEFINE(PROCINFO_IO_MMUFLAGS, offsetof(struct proc_info_list, __cpu_io_mmu_flags)); return 0; } diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c index de606dfa8..240c448ec 100644 --- a/arch/arm/kernel/bios32.c +++ b/arch/arm/kernel/bios32.c @@ -5,7 +5,6 @@ * * Bits taken from various places. */ -#include #include #include #include @@ -304,7 +303,7 @@ static inline int pdev_bad_for_parity(struct pci_dev *dev) static void __devinit pdev_fixup_device_resources(struct pci_sys_data *root, struct pci_dev *dev) { - unsigned long offset; + resource_size_t offset; int i; for (i = 0; i < PCI_NUM_RESOURCES; i++) { @@ -371,17 +370,6 @@ void __devinit pcibios_fixup_bus(struct pci_bus *bus) features &= ~(PCI_COMMAND_SERR | PCI_COMMAND_PARITY); switch (dev->class >> 8) { -#if defined(CONFIG_ISA) || defined(CONFIG_EISA) - case PCI_CLASS_BRIDGE_ISA: - case PCI_CLASS_BRIDGE_EISA: - /* - * If this device is an ISA bridge, set isa_bridge - * to point at this device. We will then go looking - * for things like keyboard, etc. - */ - isa_bridge = dev; - break; -#endif case PCI_CLASS_BRIDGE_PCI: pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &status); status |= PCI_BRIDGE_CTL_PARITY|PCI_BRIDGE_CTL_MASTER_ABORT; @@ -634,9 +622,9 @@ char * __init pcibios_setup(char *str) * which might be mirrored at 0x0100-0x03ff.. */ void pcibios_align_resource(void *data, struct resource *res, - unsigned long size, unsigned long align) + resource_size_t size, resource_size_t align) { - unsigned long start = res->start; + resource_size_t start = res->start; if (res->flags & IORESOURCE_IO && start & 0x300) start = (start + 0x3ff) & ~0x3ff; @@ -702,7 +690,6 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, /* * Mark this as IO */ - vma->vm_flags |= VM_SHM | VM_LOCKED | VM_IO; vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); if (remap_pfn_range(vma, vma->vm_start, phys, diff --git a/arch/arm/kernel/compat.c b/arch/arm/kernel/compat.c index 60cfa7f32..0a1385442 100644 --- a/arch/arm/kernel/compat.c +++ b/arch/arm/kernel/compat.c @@ -15,7 +15,6 @@ * the kernel for 5 years from now (2001). This will allow boot loaders * to convert to the new struct tag way. */ -#include #include #include #include diff --git a/arch/arm/kernel/debug.S b/arch/arm/kernel/debug.S index da280bae3..a5747e58a 100644 --- a/arch/arm/kernel/debug.S +++ b/arch/arm/kernel/debug.S @@ -9,7 +9,6 @@ * * 32-bit debugging code */ -#include #include .text diff --git a/arch/arm/kernel/ecard.c b/arch/arm/kernel/ecard.c index 00aa225e8..3e14b1348 100644 --- a/arch/arm/kernel/ecard.c +++ b/arch/arm/kernel/ecard.c @@ -27,7 +27,6 @@ */ #define ECARD_C -#include #include #include #include @@ -296,7 +295,7 @@ ecard_task(void * unused) */ static void ecard_call(struct ecard_request *req) { - DECLARE_COMPLETION(completion); + DECLARE_COMPLETION_ONSTACK(completion); req->complete = &completion; @@ -471,7 +470,8 @@ static void ecard_irq_mask(unsigned int irqnr) } } -static struct irqchip ecard_chip = { +static struct irq_chip ecard_chip = { + .name = "ECARD", .ack = ecard_irq_mask, .mask = ecard_irq_mask, .unmask = ecard_irq_unmask, @@ -620,7 +620,7 @@ ecard_irqexp_handler(unsigned int irq, struct irqdesc *desc, struct pt_regs *reg ecard_t *ec = slot_to_ecard(slot); if (ec->claimed) { - struct irqdesc *d = irqdesc + ec->irq; + struct irq_desc *d = irq_desc + ec->irq; /* * this ugly code is so that we can operate a * prioritorising system: @@ -884,7 +884,7 @@ static ssize_t ecard_show_resources(struct device *dev, struct device_attribute int i; for (i = 0; i < ECARD_NUM_RESOURCES; i++) - str += sprintf(str, "%08lx %08lx %08lx\n", + str += sprintf(str, "%08x %08x %08lx\n", ec->resource[i].start, ec->resource[i].end, ec->resource[i].flags); diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index ab8e600c1..de4e33137 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S @@ -14,12 +14,12 @@ * Note: there is a StrongARM bug in the STMIA rn, {regs}^ instruction that causes * it to save wrong values... Be aware! */ -#include #include #include #include #include +#include #include "entry-header.S" @@ -491,9 +491,15 @@ call_fpe: b do_fpe @ CP#1 (FPE) b do_fpe @ CP#2 (FPE) mov pc, lr @ CP#3 +#ifdef CONFIG_CRUNCH + b crunch_task_enable @ CP#4 (MaverickCrunch) + b crunch_task_enable @ CP#5 (MaverickCrunch) + b crunch_task_enable @ CP#6 (MaverickCrunch) +#else mov pc, lr @ CP#4 mov pc, lr @ CP#5 mov pc, lr @ CP#6 +#endif mov pc, lr @ CP#7 mov pc, lr @ CP#8 mov pc, lr @ CP#9 @@ -560,10 +566,8 @@ ENTRY(__switch_to) add ip, r1, #TI_CPU_SAVE ldr r3, [r2, #TI_TP_VALUE] stmia ip!, {r4 - sl, fp, sp, lr} @ Store most regs on stack -#ifndef CONFIG_MMU - add r2, r2, #TI_CPU_DOMAIN -#else - ldr r6, [r2, #TI_CPU_DOMAIN]! +#ifdef CONFIG_MMU + ldr r6, [r2, #TI_CPU_DOMAIN] #endif #if __LINUX_ARM_ARCH__ >= 6 #ifdef CONFIG_CPU_32v6K @@ -585,21 +589,18 @@ ENTRY(__switch_to) #ifdef CONFIG_MMU mcr p15, 0, r6, c3, c0, 0 @ Set domain register #endif -#ifdef CONFIG_VFP - @ Always disable VFP so we can lazily save/restore the old - @ state. This occurs in the context of the previous thread. - VFPFMRX r4, FPEXC - bic r4, r4, #FPEXC_ENABLE - VFPFMXR FPEXC, r4 -#endif -#if defined(CONFIG_IWMMXT) - bl iwmmxt_task_switch -#elif defined(CONFIG_CPU_XSCALE) - add r4, r2, #40 @ cpu_context_save->extra +#if defined(CONFIG_CPU_XSCALE) && !defined(CONFIG_IWMMXT) + add r4, r2, #TI_CPU_DOMAIN + 40 @ cpu_context_save->extra ldmib r4, {r4, r5} mar acc0, r4, r5 #endif - ldmib r2, {r4 - sl, fp, sp, pc} @ Load all regs saved previously + mov r5, r0 + add r4, r2, #TI_CPU_SAVE + ldr r0, =thread_notify_head + mov r1, #THREAD_NOTIFY_SWITCH + bl atomic_notifier_call_chain + mov r0, r5 + ldmia r4, {r4 - sl, fp, sp, pc} @ Load all regs saved previously __INIT @@ -633,6 +634,14 @@ ENTRY(__switch_to) * purpose. */ + .macro usr_ret, reg +#ifdef CONFIG_ARM_THUMB + bx \reg +#else + mov pc, \reg +#endif + .endm + .align 5 .globl __kuser_helper_start __kuser_helper_start: @@ -674,7 +683,7 @@ __kuser_memory_barrier: @ 0xffff0fa0 #if __LINUX_ARM_ARCH__ >= 6 && defined(CONFIG_SMP) mcr p15, 0, r0, c7, c10, 5 @ dmb #endif - mov pc, lr + usr_ret lr .align 5 @@ -777,7 +786,7 @@ __kuser_cmpxchg: @ 0xffff0fc0 mov r0, #-1 adds r0, r0, #0 #endif - mov pc, lr + usr_ret lr #else @@ -791,7 +800,7 @@ __kuser_cmpxchg: @ 0xffff0fc0 #ifdef CONFIG_SMP mcr p15, 0, r0, c7, c10, 5 @ dmb #endif - mov pc, lr + usr_ret lr #endif @@ -833,16 +842,11 @@ __kuser_cmpxchg: @ 0xffff0fc0 __kuser_get_tls: @ 0xffff0fe0 #if !defined(CONFIG_HAS_TLS_REG) && !defined(CONFIG_TLS_REG_EMUL) - ldr r0, [pc, #(16 - 8)] @ TLS stored at 0xffff0ff0 - mov pc, lr - #else - mrc p15, 0, r0, c13, c0, 3 @ read TLS register - mov pc, lr - #endif + usr_ret lr .rep 5 .word 0 @ pad up to __kuser_helper_version diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index dbcb11a31..6f5e7c50d 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -7,7 +7,6 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ -#include #include @@ -271,7 +270,7 @@ ENTRY(sys_call_table) @ r8 = syscall table .type sys_syscall, #function sys_syscall: - eor scno, r0, #__NR_OABI_SYSCALL_BASE + bic scno, r0, #__NR_OABI_SYSCALL_BASE cmp scno, #__NR_syscall - __NR_SYSCALL_BASE cmpne scno, #NR_syscalls @ check range stmloia sp, {r5, r6} @ shuffle args @@ -340,7 +339,7 @@ sys_mmap2: streq r5, [sp, #4] beq do_mmap2 mov r0, #-EINVAL - RETINSTR(mov,pc, lr) + mov pc, lr #else str r5, [sp, #4] b do_mmap2 diff --git a/arch/arm/kernel/entry-header.S b/arch/arm/kernel/entry-header.S index f1c2fd5b6..87ab4e157 100644 --- a/arch/arm/kernel/entry-header.S +++ b/arch/arm/kernel/entry-header.S @@ -1,4 +1,3 @@ -#include #include #include diff --git a/arch/arm/kernel/fiq.c b/arch/arm/kernel/fiq.c index 1ec3f7faa..e8e90346f 100644 --- a/arch/arm/kernel/fiq.c +++ b/arch/arm/kernel/fiq.c @@ -38,6 +38,7 @@ #include #include #include +#include #include #include diff --git a/arch/arm/kernel/head-nommu.S b/arch/arm/kernel/head-nommu.S index adf62e5ea..ac9eb3d30 100644 --- a/arch/arm/kernel/head-nommu.S +++ b/arch/arm/kernel/head-nommu.S @@ -12,7 +12,6 @@ * for 32-bit CPUs which has a process ID register(CP15). * */ -#include #include #include @@ -39,7 +38,7 @@ __INIT .type stext, %function ENTRY(stext) - msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | MODE_SVC @ ensure svc mode + msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode @ and irqs disabled mrc p15, 0, r9, c0, c0 @ get processor id bl __lookup_processor_type @ r5=procinfo r9=cpuid diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index 04f7344e3..5365d4e59 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S @@ -11,7 +11,6 @@ * * Kernel startup code for all 32-bit CPUs */ -#include #include #include @@ -71,7 +70,7 @@ __INIT .type stext, %function ENTRY(stext) - msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | MODE_SVC @ ensure svc mode + msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode @ and irqs disabled mrc p15, 0, r9, c0, c0 @ get processor id bl __lookup_processor_type @ r5=procinfo r9=cpuid @@ -104,7 +103,7 @@ ENTRY(secondary_startup) * the processor type - there is no need to check the machine type * as it has already been validated by the primary processor. */ - msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | MODE_SVC + msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE mrc p15, 0, r9, c0, c0 @ get processor id bl __lookup_processor_type movs r10, r5 @ invalid processor? @@ -115,18 +114,18 @@ ENTRY(secondary_startup) * Use the page tables supplied from __cpu_up. */ adr r4, __secondary_data - ldmia r4, {r5, r6, r13} @ address to jump to after + ldmia r4, {r5, r7, r13} @ address to jump to after sub r4, r4, r5 @ mmu has been enabled - ldr r4, [r6, r4] @ get secondary_data.pgdir + ldr r4, [r7, r4] @ get secondary_data.pgdir adr lr, __enable_mmu @ return address - add pc, r10, #12 @ initialise processor + add pc, r10, #PROCINFO_INITFUNC @ initialise processor @ (return control reg) /* * r6 = &secondary_data */ ENTRY(__secondary_switched) - ldr sp, [r6, #4] @ get secondary_data.stack + ldr sp, [r7, #4] @ get secondary_data.stack mov fp, #0 b secondary_start_kernel @@ -221,7 +220,7 @@ __create_page_tables: teq r0, r6 bne 1b - ldr r7, [r10, #PROCINFO_MMUFLAGS] @ mmuflags + ldr r7, [r10, #PROCINFO_MM_MMUFLAGS] @ mm_mmuflags /* * Create identity mapping for first MB of kernel to @@ -272,8 +271,7 @@ __create_page_tables: #endif #ifdef CONFIG_DEBUG_LL - bic r7, r7, #0x0c @ turn off cacheable - @ and bufferable bits + ldr r7, [r10, #PROCINFO_IO_MMUFLAGS] @ io_mmuflags /* * Map in IO space for serial debugging. * This allows debug messages to be output diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c index 2d5896b36..4b9757f3b 100644 --- a/arch/arm/kernel/irq.c +++ b/arch/arm/kernel/irq.c @@ -21,12 +21,12 @@ * IRQ's are in fact implemented a bit like signal handlers for the kernel. * Naturally it's not a 1:1 relation, but there are similarities. */ -#include #include #include #include #include #include +#include #include #include #include @@ -37,29 +37,11 @@ #include #include #include +#include -#include #include -#include #include -/* - * Maximum IRQ count. Currently, this is arbitary. However, it should - * not be set too low to prevent false triggering. Conversely, if it - * is set too high, then you could miss a stuck IRQ. - * - * Maybe we ought to set a timer and re-enable the IRQ at a later time? - */ -#define MAX_IRQ_CNT 100000 - -static int noirqdebug; -static volatile unsigned long irq_err_count; -static DEFINE_SPINLOCK(irq_controller_lock); -static LIST_HEAD(irq_pending); - -struct irqdesc irq_desc[NR_IRQS]; -void (*init_arch_irq)(void) __initdata = NULL; - /* * No architecture-specific irq_finish function defined in arm/arch/irqs.h. */ @@ -67,163 +49,8 @@ void (*init_arch_irq)(void) __initdata = NULL; #define irq_finish(irq) do { } while (0) #endif -/* - * Dummy mask/unmask handler - */ -void dummy_mask_unmask_irq(unsigned int irq) -{ -} - -irqreturn_t no_action(int irq, void *dev_id, struct pt_regs *regs) -{ - return IRQ_NONE; -} - -void do_bad_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs) -{ - irq_err_count += 1; - printk(KERN_ERR "IRQ: spurious interrupt %d\n", irq); -} - -static struct irqchip bad_chip = { - .ack = dummy_mask_unmask_irq, - .mask = dummy_mask_unmask_irq, - .unmask = dummy_mask_unmask_irq, -}; - -static struct irqdesc bad_irq_desc = { - .chip = &bad_chip, - .handle = do_bad_IRQ, - .pend = LIST_HEAD_INIT(bad_irq_desc.pend), - .disable_depth = 1, -}; - -#ifdef CONFIG_SMP -void synchronize_irq(unsigned int irq) -{ - struct irqdesc *desc = irq_desc + irq; - - while (desc->running) - barrier(); -} -EXPORT_SYMBOL(synchronize_irq); - -#define smp_set_running(desc) do { desc->running = 1; } while (0) -#define smp_clear_running(desc) do { desc->running = 0; } while (0) -#else -#define smp_set_running(desc) do { } while (0) -#define smp_clear_running(desc) do { } while (0) -#endif - -/** - * disable_irq_nosync - disable an irq without waiting - * @irq: Interrupt to disable - * - * Disable the selected interrupt line. Enables and disables - * are nested. We do this lazily. - * - * This function may be called from IRQ context. - */ -void disable_irq_nosync(unsigned int irq) -{ - struct irqdesc *desc = irq_desc + irq; - unsigned long flags; - - spin_lock_irqsave(&irq_controller_lock, flags); - desc->disable_depth++; - list_del_init(&desc->pend); - spin_unlock_irqrestore(&irq_controller_lock, flags); -} -EXPORT_SYMBOL(disable_irq_nosync); - -/** - * disable_irq - disable an irq and wait for completion - * @irq: Interrupt to disable - * - * Disable the selected interrupt line. Enables and disables - * are nested. This functions waits for any pending IRQ - * handlers for this interrupt to complete before returning. - * If you use this function while holding a resource the IRQ - * handler may need you will deadlock. - * - * This function may be called - with care - from IRQ context. - */ -void disable_irq(unsigned int irq) -{ - struct irqdesc *desc = irq_desc + irq; - - disable_irq_nosync(irq); - if (desc->action) - synchronize_irq(irq); -} -EXPORT_SYMBOL(disable_irq); - -/** - * enable_irq - enable interrupt handling on an irq - * @irq: Interrupt to enable - * - * Re-enables the processing of interrupts on this IRQ line. - * Note that this may call the interrupt handler, so you may - * get unexpected results if you hold IRQs disabled. - * - * This function may be called from IRQ context. - */ -void enable_irq(unsigned int irq) -{ - struct irqdesc *desc = irq_desc + irq; - unsigned long flags; - - spin_lock_irqsave(&irq_controller_lock, flags); - if (unlikely(!desc->disable_depth)) { - printk("enable_irq(%u) unbalanced from %p\n", irq, - __builtin_return_address(0)); - } else if (!--desc->disable_depth) { - desc->probing = 0; - desc->chip->unmask(irq); - - /* - * If the interrupt is waiting to be processed, - * try to re-run it. We can't directly run it - * from here since the caller might be in an - * interrupt-protected region. - */ - if (desc->pending && list_empty(&desc->pend)) { - desc->pending = 0; - if (!desc->chip->retrigger || - desc->chip->retrigger(irq)) - list_add(&desc->pend, &irq_pending); - } - } - spin_unlock_irqrestore(&irq_controller_lock, flags); -} -EXPORT_SYMBOL(enable_irq); - -/* - * Enable wake on selected irq - */ -void enable_irq_wake(unsigned int irq) -{ - struct irqdesc *desc = irq_desc + irq; - unsigned long flags; - - spin_lock_irqsave(&irq_controller_lock, flags); - if (desc->chip->set_wake) - desc->chip->set_wake(irq, 1); - spin_unlock_irqrestore(&irq_controller_lock, flags); -} -EXPORT_SYMBOL(enable_irq_wake); - -void disable_irq_wake(unsigned int irq) -{ - struct irqdesc *desc = irq_desc + irq; - unsigned long flags; - - spin_lock_irqsave(&irq_controller_lock, flags); - if (desc->chip->set_wake) - desc->chip->set_wake(irq, 0); - spin_unlock_irqrestore(&irq_controller_lock, flags); -} -EXPORT_SYMBOL(disable_irq_wake); +void (*init_arch_irq)(void) __initdata = NULL; +unsigned long irq_err_count; int show_interrupts(struct seq_file *p, void *v) { @@ -243,21 +70,22 @@ int show_interrupts(struct seq_file *p, void *v) } if (i < NR_IRQS) { - spin_lock_irqsave(&irq_controller_lock, flags); - action = irq_desc[i].action; + spin_lock_irqsave(&irq_desc[i].lock, flags); + action = irq_desc[i].action; if (!action) goto unlock; seq_printf(p, "%3d: ", i); for_each_present_cpu(cpu) seq_printf(p, "%10u ", kstat_cpu(cpu).irqs[i]); + seq_printf(p, " %10s", irq_desc[i].chip->name ? : "-"); seq_printf(p, " %s", action->name); for (action = action->next; action; action = action->next) seq_printf(p, ", %s", action->name); seq_putc(p, '\n'); unlock: - spin_unlock_irqrestore(&irq_controller_lock, flags); + spin_unlock_irqrestore(&irq_desc[i].lock, flags); } else if (i == NR_IRQS) { #ifdef CONFIG_ARCH_ACORN show_fiq_list(p, v); @@ -271,267 +99,11 @@ unlock: return 0; } -/* - * IRQ lock detection. - * - * Hopefully, this should get us out of a few locked situations. - * However, it may take a while for this to happen, since we need - * a large number if IRQs to appear in the same jiffie with the - * same instruction pointer (or within 2 instructions). - */ -static int check_irq_lock(struct irqdesc *desc, int irq, struct pt_regs *regs) -{ - unsigned long instr_ptr = instruction_pointer(regs); - - if (desc->lck_jif == jiffies && - desc->lck_pc >= instr_ptr && desc->lck_pc < instr_ptr + 8) { - desc->lck_cnt += 1; - - if (desc->lck_cnt > MAX_IRQ_CNT) { - printk(KERN_ERR "IRQ LOCK: IRQ%d is locking the system, disabled\n", irq); - return 1; - } - } else { - desc->lck_cnt = 0; - desc->lck_pc = instruction_pointer(regs); - desc->lck_jif = jiffies; - } - return 0; -} - -static void -report_bad_irq(unsigned int irq, struct pt_regs *regs, struct irqdesc *desc, int ret) -{ - static int count = 100; - struct irqaction *action; - - if (noirqdebug) - return; - - if (ret != IRQ_HANDLED && ret != IRQ_NONE) { - if (!count) - return; - count--; - printk("irq%u: bogus retval mask %x\n", irq, ret); - } else { - desc->irqs_unhandled++; - if (desc->irqs_unhandled <= 99900) - return; - desc->irqs_unhandled = 0; - printk("irq%u: nobody cared\n", irq); - } - show_regs(regs); - dump_stack(); - printk(KERN_ERR "handlers:"); - action = desc->action; - do { - printk("\n" KERN_ERR "[<%p>]", action->handler); - print_symbol(" (%s)", (unsigned long)action->handler); - action = action->next; - } while (action); - printk("\n"); -} - -static int -__do_irq(unsigned int irq, struct irqaction *action, struct pt_regs *regs) -{ - unsigned int status; - int ret, retval = 0; - - spin_unlock(&irq_controller_lock); - -#ifdef CONFIG_NO_IDLE_HZ - if (!(action->flags & SA_TIMER) && system_timer->dyn_tick != NULL) { - write_seqlock(&xtime_lock); - if (system_timer->dyn_tick->state & DYN_TICK_ENABLED) - system_timer->dyn_tick->handler(irq, 0, regs); - write_sequnlock(&xtime_lock); - } -#endif - - if (!(action->flags & SA_INTERRUPT)) - local_irq_enable(); - - status = 0; - do { - ret = action->handler(irq, action->dev_id, regs); - if (ret == IRQ_HANDLED) - status |= action->flags; - retval |= ret; - action = action->next; - } while (action); - - if (status & SA_SAMPLE_RANDOM) - add_interrupt_randomness(irq); - - spin_lock_irq(&irq_controller_lock); - - return retval; -} - -/* - * This is for software-decoded IRQs. The caller is expected to - * handle the ack, clear, mask and unmask issues. - */ -void -do_simple_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs) -{ - struct irqaction *action; - const unsigned int cpu = smp_processor_id(); - - desc->triggered = 1; - - kstat_cpu(cpu).irqs[irq]++; - - smp_set_running(desc); - - action = desc->action; - if (action) { - int ret = __do_irq(irq, action, regs); - if (ret != IRQ_HANDLED) - report_bad_irq(irq, regs, desc, ret); - } - - smp_clear_running(desc); -} - -/* - * Most edge-triggered IRQ implementations seem to take a broken - * approach to this. Hence the complexity. - */ -void -do_edge_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs) -{ - const unsigned int cpu = smp_processor_id(); - - desc->triggered = 1; - - /* - * If we're currently running this IRQ, or its disabled, - * we shouldn't process the IRQ. Instead, turn on the - * hardware masks. - */ - if (unlikely(desc->running || desc->disable_depth)) - goto running; - - /* - * Acknowledge and clear the IRQ, but don't mask it. - */ - desc->chip->ack(irq); - - /* - * Mark the IRQ currently in progress. - */ - desc->running = 1; - - kstat_cpu(cpu).irqs[irq]++; - - do { - struct irqaction *action; - - action = desc->action; - if (!action) - break; - - if (desc->pending && !desc->disable_depth) { - desc->pending = 0; - desc->chip->unmask(irq); - } - - __do_irq(irq, action, regs); - } while (desc->pending && !desc->disable_depth); - - desc->running = 0; - - /* - * If we were disabled or freed, shut down the handler. - */ - if (likely(desc->action && !check_irq_lock(desc, irq, regs))) - return; - - running: - /* - * We got another IRQ while this one was masked or - * currently running. Delay it. - */ - desc->pending = 1; - desc->chip->mask(irq); - desc->chip->ack(irq); -} - -/* - * Level-based IRQ handler. Nice and simple. - */ -void -do_level_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs) -{ - struct irqaction *action; - const unsigned int cpu = smp_processor_id(); - - desc->triggered = 1; - - /* - * Acknowledge, clear _AND_ disable the interrupt. - */ - desc->chip->ack(irq); - - if (likely(!desc->disable_depth)) { - kstat_cpu(cpu).irqs[irq]++; - - smp_set_running(desc); - - /* - * Return with this interrupt masked if no action - */ - action = desc->action; - if (action) { - int ret = __do_irq(irq, desc->action, regs); - - if (ret != IRQ_HANDLED) - report_bad_irq(irq, regs, desc, ret); - - if (likely(!desc->disable_depth && - !check_irq_lock(desc, irq, regs))) - desc->chip->unmask(irq); - } - - smp_clear_running(desc); - } -} - -static void do_pending_irqs(struct pt_regs *regs) -{ - struct list_head head, *l, *n; - - do { - struct irqdesc *desc; - - /* - * First, take the pending interrupts off the list. - * The act of calling the handlers may add some IRQs - * back onto the list. - */ - head = irq_pending; - INIT_LIST_HEAD(&irq_pending); - head.next->prev = &head; - head.prev->next = &head; - - /* - * Now run each entry. We must delete it from our - * list before calling the handler. - */ - list_for_each_safe(l, n, &head) { - desc = list_entry(l, struct irqdesc, pend); - list_del_init(&desc->pend); - desc_handle_irq(desc - irq_desc, desc, regs); - } - - /* - * The list must be empty. - */ - BUG_ON(!list_empty(&head)); - } while (!list_empty(&irq_pending)); -} +/* Handle bad interrupts */ +static struct irq_desc bad_irq_desc = { + .handle_irq = handle_bad_irq, + .lock = SPIN_LOCK_UNLOCKED +}; /* * do_IRQ handles all hardware IRQ's. Decoded IRQs should not @@ -541,6 +113,7 @@ static void do_pending_irqs(struct pt_regs *regs) asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs) { struct irqdesc *desc = irq_desc + irq; + struct vx_info_save vxis; /* * Some hardware gives randomly wrong interrupts. Rather @@ -550,96 +123,15 @@ asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs) desc = &bad_irq_desc; irq_enter(); - spin_lock(&irq_controller_lock); + __enter_vx_admin(&vxis); desc_handle_irq(irq, desc, regs); - /* - * Now re-run any pending interrupts. - */ - if (!list_empty(&irq_pending)) - do_pending_irqs(regs); - + /* AT91 specific workaround */ irq_finish(irq); - - spin_unlock(&irq_controller_lock); + __leave_vx_admin(&vxis); irq_exit(); } -void __set_irq_handler(unsigned int irq, irq_handler_t handle, int is_chained) -{ - struct irqdesc *desc; - unsigned long flags; - - if (irq >= NR_IRQS) { - printk(KERN_ERR "Trying to install handler for IRQ%d\n", irq); - return; - } - - if (handle == NULL) - handle = do_bad_IRQ; - - desc = irq_desc + irq; - - if (is_chained && desc->chip == &bad_chip) - printk(KERN_WARNING "Trying to install chained handler for IRQ%d\n", irq); - - spin_lock_irqsave(&irq_controller_lock, flags); - if (handle == do_bad_IRQ) { - desc->chip->mask(irq); - desc->chip->ack(irq); - desc->disable_depth = 1; - } - desc->handle = handle; - if (handle != do_bad_IRQ && is_chained) { - desc->valid = 0; - desc->probe_ok = 0; - desc->disable_depth = 0; - desc->chip->unmask(irq); - } - spin_unlock_irqrestore(&irq_controller_lock, flags); -} - -void set_irq_chip(unsigned int irq, struct irqchip *chip) -{ - struct irqdesc *desc; - unsigned long flags; - - if (irq >= NR_IRQS) { - printk(KERN_ERR "Trying to install chip for IRQ%d\n", irq); - return; - } - - if (chip == NULL) - chip = &bad_chip; - - desc = irq_desc + irq; - spin_lock_irqsave(&irq_controller_lock, flags); - desc->chip = chip; - spin_unlock_irqrestore(&irq_controller_lock, flags); -} - -int set_irq_type(unsigned int irq, unsigned int type) -{ - struct irqdesc *desc; - unsigned long flags; - int ret = -ENXIO; - - if (irq >= NR_IRQS) { - printk(KERN_ERR "Trying to set irq type for IRQ%d\n", irq); - return -ENODEV; - } - - desc = irq_desc + irq; - if (desc->chip->set_type) { - spin_lock_irqsave(&irq_controller_lock, flags); - ret = desc->chip->set_type(irq, type); - spin_unlock_irqrestore(&irq_controller_lock, flags); - } - - return ret; -} -EXPORT_SYMBOL(set_irq_type); - void set_irq_flags(unsigned int irq, unsigned int iflags) { struct irqdesc *desc; @@ -651,422 +143,43 @@ void set_irq_flags(unsigned int irq, unsigned int iflags) } desc = irq_desc + irq; - spin_lock_irqsave(&irq_controller_lock, flags); - desc->valid = (iflags & IRQF_VALID) != 0; - desc->probe_ok = (iflags & IRQF_PROBE) != 0; - desc->noautoenable = (iflags & IRQF_NOAUTOEN) != 0; - spin_unlock_irqrestore(&irq_controller_lock, flags); -} - -int setup_irq(unsigned int irq, struct irqaction *new) -{ - int shared = 0; - struct irqaction *old, **p; - unsigned long flags; - struct irqdesc *desc; - - /* - * Some drivers like serial.c use request_irq() heavily, - * so we have to be careful not to interfere with a - * running system. - */ - if (new->flags & SA_SAMPLE_RANDOM) { - /* - * This function might sleep, we want to call it first, - * outside of the atomic block. - * Yes, this might clear the entropy pool if the wrong - * driver is attempted to be loaded, without actually - * installing a new handler, but is this really a problem, - * only the sysadmin is able to do this. - */ - rand_initialize_irq(irq); - } - - /* - * The following block of code has to be executed atomically - */ - desc = irq_desc + irq; - spin_lock_irqsave(&irq_controller_lock, flags); - p = &desc->action; - if ((old = *p) != NULL) { - /* - * Can't share interrupts unless both agree to and are - * the same type. - */ - if (!(old->flags & new->flags & SA_SHIRQ) || - (~old->flags & new->flags) & SA_TRIGGER_MASK) { - spin_unlock_irqrestore(&irq_controller_lock, flags); - return -EBUSY; - } - - /* add new interrupt at end of irq queue */ - do { - p = &old->next; - old = *p; - } while (old); - shared = 1; - } - - *p = new; - - if (!shared) { - desc->probing = 0; - desc->running = 0; - desc->pending = 0; - desc->disable_depth = 1; - - if (new->flags & SA_TRIGGER_MASK && - desc->chip->set_type) { - unsigned int type = new->flags & SA_TRIGGER_MASK; - desc->chip->set_type(irq, type); - } - - if (!desc->noautoenable) { - desc->disable_depth = 0; - desc->chip->unmask(irq); - } - } - - spin_unlock_irqrestore(&irq_controller_lock, flags); - return 0; -} - -/** - * request_irq - allocate an interrupt line - * @irq: Interrupt line to allocate - * @handler: Function to be called when the IRQ occurs - * @irqflags: Interrupt type flags - * @devname: An ascii name for the claiming device - * @dev_id: A cookie passed back to the handler function - * - * This call allocates interrupt resources and enables the - * interrupt line and IRQ handling. From the point this - * call is made your handler function may be invoked. Since - * your handler function must clear any interrupt the board - * raises, you must take care both to initialise your hardware - * and to set up the interrupt handler in the right order. - * - * Dev_id must be globally unique. Normally the address of the - * device data structure is used as the cookie. Since the handler - * receives this value it makes sense to use it. - * - * If your interrupt is shared you must pass a non NULL dev_id - * as this is required when freeing the interrupt. - * - * Flags: - * - * SA_SHIRQ Interrupt is shared - * - * SA_INTERRUPT Disable local interrupts while processing - * - * SA_SAMPLE_RANDOM The interrupt can be used for entropy - * - */ -int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), - unsigned long irq_flags, const char * devname, void *dev_id) -{ - unsigned long retval; - struct irqaction *action; - - if (irq >= NR_IRQS || !irq_desc[irq].valid || !handler || - (irq_flags & SA_SHIRQ && !dev_id)) - return -EINVAL; - - action = (struct irqaction *)kmalloc(sizeof(struct irqaction), GFP_KERNEL); - if (!action) - return -ENOMEM; - - action->handler = handler; - action->flags = irq_flags; - cpus_clear(action->mask); - action->name = devname; - action->next = NULL; - action->dev_id = dev_id; - - retval = setup_irq(irq, action); - - if (retval) - kfree(action); - return retval; -} - -EXPORT_SYMBOL(request_irq); - -/** - * free_irq - free an interrupt - * @irq: Interrupt line to free - * @dev_id: Device identity to free - * - * Remove an interrupt handler. The handler is removed and if the - * interrupt line is no longer in use by any driver it is disabled. - * On a shared IRQ the caller must ensure the interrupt is disabled - * on the card it drives before calling this function. - * - * This function must not be called from interrupt context. - */ -void free_irq(unsigned int irq, void *dev_id) -{ - struct irqaction * action, **p; - unsigned long flags; - - if (irq >= NR_IRQS || !irq_desc[irq].valid) { - printk(KERN_ERR "Trying to free IRQ%d\n",irq); - dump_stack(); - return; - } - - spin_lock_irqsave(&irq_controller_lock, flags); - for (p = &irq_desc[irq].action; (action = *p) != NULL; p = &action->next) { - if (action->dev_id != dev_id) - continue; - - /* Found it - now free it */ - *p = action->next; - break; - } - spin_unlock_irqrestore(&irq_controller_lock, flags); - - if (!action) { - printk(KERN_ERR "Trying to free free IRQ%d\n",irq); - dump_stack(); - } else { - synchronize_irq(irq); - kfree(action); - } -} - -EXPORT_SYMBOL(free_irq); - -static DECLARE_MUTEX(probe_sem); - -/* Start the interrupt probing. Unlike other architectures, - * we don't return a mask of interrupts from probe_irq_on, - * but return the number of interrupts enabled for the probe. - * The interrupts which have been enabled for probing is - * instead recorded in the irq_desc structure. - */ -unsigned long probe_irq_on(void) -{ - unsigned int i, irqs = 0; - unsigned long delay; - - down(&probe_sem); - - /* - * first snaffle up any unassigned but - * probe-able interrupts - */ - spin_lock_irq(&irq_controller_lock); - for (i = 0; i < NR_IRQS; i++) { - if (!irq_desc[i].probe_ok || irq_desc[i].action) - continue; - - irq_desc[i].probing = 1; - irq_desc[i].triggered = 0; - if (irq_desc[i].chip->set_type) - irq_desc[i].chip->set_type(i, IRQT_PROBE); - irq_desc[i].chip->unmask(i); - irqs += 1; - } - spin_unlock_irq(&irq_controller_lock); - - /* - * wait for spurious interrupts to mask themselves out again - */ - for (delay = jiffies + HZ/10; time_before(jiffies, delay); ) - /* min 100ms delay */; - - /* - * now filter out any obviously spurious interrupts - */ - spin_lock_irq(&irq_controller_lock); - for (i = 0; i < NR_IRQS; i++) { - if (irq_desc[i].probing && irq_desc[i].triggered) { - irq_desc[i].probing = 0; - irqs -= 1; - } - } - spin_unlock_irq(&irq_controller_lock); - - return irqs; -} - -EXPORT_SYMBOL(probe_irq_on); - -unsigned int probe_irq_mask(unsigned long irqs) -{ - unsigned int mask = 0, i; - - spin_lock_irq(&irq_controller_lock); - for (i = 0; i < 16 && i < NR_IRQS; i++) - if (irq_desc[i].probing && irq_desc[i].triggered) - mask |= 1 << i; - spin_unlock_irq(&irq_controller_lock); - - up(&probe_sem); - - return mask; -} -EXPORT_SYMBOL(probe_irq_mask); - -/* - * Possible return values: - * >= 0 - interrupt number - * -1 - no interrupt/many interrupts - */ -int probe_irq_off(unsigned long irqs) -{ - unsigned int i; - int irq_found = NO_IRQ; - - /* - * look at the interrupts, and find exactly one - * that we were probing has been triggered - */ - spin_lock_irq(&irq_controller_lock); - for (i = 0; i < NR_IRQS; i++) { - if (irq_desc[i].probing && - irq_desc[i].triggered) { - if (irq_found != NO_IRQ) { - irq_found = NO_IRQ; - goto out; - } - irq_found = i; - } - } - - if (irq_found == -1) - irq_found = NO_IRQ; -out: - spin_unlock_irq(&irq_controller_lock); - - up(&probe_sem); - - return irq_found; -} - -EXPORT_SYMBOL(probe_irq_off); - -#ifdef CONFIG_SMP -static void route_irq(struct irqdesc *desc, unsigned int irq, unsigned int cpu) -{ - pr_debug("IRQ%u: moving from cpu%u to cpu%u\n", irq, desc->cpu, cpu); - - spin_lock_irq(&irq_controller_lock); - desc->cpu = cpu; - desc->chip->set_cpu(desc, irq, cpu); - spin_unlock_irq(&irq_controller_lock); -} - -#ifdef CONFIG_PROC_FS -static int -irq_affinity_read_proc(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - struct irqdesc *desc = irq_desc + ((int)data); - int len = cpumask_scnprintf(page, count, desc->affinity); - - if (count - len < 2) - return -EINVAL; - page[len++] = '\n'; - page[len] = '\0'; - - return len; -} - -static int -irq_affinity_write_proc(struct file *file, const char __user *buffer, - unsigned long count, void *data) -{ - unsigned int irq = (unsigned int)data; - struct irqdesc *desc = irq_desc + irq; - cpumask_t affinity, tmp; - int ret = -EIO; - - if (!desc->chip->set_cpu) - goto out; - - ret = cpumask_parse(buffer, count, affinity); - if (ret) - goto out; - - cpus_and(tmp, affinity, cpu_online_map); - if (cpus_empty(tmp)) { - ret = -EINVAL; - goto out; - } - - desc->affinity = affinity; - route_irq(desc, irq, first_cpu(tmp)); - ret = count; - - out: - return ret; -} -#endif -#endif - -void __init init_irq_proc(void) -{ -#if defined(CONFIG_SMP) && defined(CONFIG_PROC_FS) - struct proc_dir_entry *dir; - int irq; - - dir = proc_mkdir("irq", NULL); - if (!dir) - return; - - for (irq = 0; irq < NR_IRQS; irq++) { - struct proc_dir_entry *entry; - struct irqdesc *desc; - char name[16]; - - desc = irq_desc + irq; - memset(name, 0, sizeof(name)); - snprintf(name, sizeof(name) - 1, "%u", irq); - - desc->procdir = proc_mkdir(name, dir); - if (!desc->procdir) - continue; - - entry = create_proc_entry("smp_affinity", 0600, desc->procdir); - if (entry) { - entry->nlink = 1; - entry->data = (void *)irq; - entry->read_proc = irq_affinity_read_proc; - entry->write_proc = irq_affinity_write_proc; - } - } -#endif + spin_lock_irqsave(&desc->lock, flags); + desc->status |= IRQ_NOREQUEST | IRQ_NOPROBE | IRQ_NOAUTOEN; + if (iflags & IRQF_VALID) + desc->status &= ~IRQ_NOREQUEST; + if (iflags & IRQF_PROBE) + desc->status &= ~IRQ_NOPROBE; + if (!(iflags & IRQF_NOAUTOEN)) + desc->status &= ~IRQ_NOAUTOEN; + spin_unlock_irqrestore(&desc->lock, flags); } void __init init_IRQ(void) { - struct irqdesc *desc; int irq; + for (irq = 0; irq < NR_IRQS; irq++) + irq_desc[irq].status |= IRQ_NOREQUEST | IRQ_DELAYED_DISABLE | + IRQ_NOPROBE; + #ifdef CONFIG_SMP bad_irq_desc.affinity = CPU_MASK_ALL; bad_irq_desc.cpu = smp_processor_id(); #endif - - for (irq = 0, desc = irq_desc; irq < NR_IRQS; irq++, desc++) { - *desc = bad_irq_desc; - INIT_LIST_HEAD(&desc->pend); - } - init_arch_irq(); } -static int __init noirqdebug_setup(char *str) +#ifdef CONFIG_HOTPLUG_CPU + +static void route_irq(struct irqdesc *desc, unsigned int irq, unsigned int cpu) { - noirqdebug = 1; - return 1; -} + pr_debug("IRQ%u: moving from cpu%u to cpu%u\n", irq, desc->cpu, cpu); -__setup("noirqdebug", noirqdebug_setup); + spin_lock_irq(&desc->lock); + desc->chip->set_affinity(irq, cpumask_of_cpu(cpu)); + spin_unlock_irq(&desc->lock); +} -#ifdef CONFIG_HOTPLUG_CPU /* * The CPU has been marked offline. Migrate IRQs off this CPU. If * the affinity settings do not allow other CPUs, force them onto any diff --git a/arch/arm/kernel/isa.c b/arch/arm/kernel/isa.c index 685c3e591..54bbd9fe2 100644 --- a/arch/arm/kernel/isa.c +++ b/arch/arm/kernel/isa.c @@ -3,21 +3,14 @@ * * Copyright (C) 1999 Phil Blundell * - * ISA shared memory and I/O port support - */ - -/* * 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. + * + * ISA shared memory and I/O port support, and is required to support + * iopl, inb, outb and friends in userspace via glibc emulation. */ - -/* - * Nothing about this is actually ARM specific. One day we could move - * it into kernel/resource.c or some place like that. - */ - #include #include #include @@ -27,21 +20,49 @@ static unsigned int isa_membase, isa_portbase, isa_portshift; static ctl_table ctl_isa_vars[4] = { - {BUS_ISA_MEM_BASE, "membase", &isa_membase, - sizeof(isa_membase), 0444, NULL, &proc_dointvec}, - {BUS_ISA_PORT_BASE, "portbase", &isa_portbase, - sizeof(isa_portbase), 0444, NULL, &proc_dointvec}, - {BUS_ISA_PORT_SHIFT, "portshift", &isa_portshift, - sizeof(isa_portshift), 0444, NULL, &proc_dointvec}, - {0} + { + .ctl_name = BUS_ISA_MEM_BASE, + .procname = "membase", + .data = &isa_membase, + .maxlen = sizeof(isa_membase), + .mode = 0444, + .proc_handler = &proc_dointvec, + }, { + .ctl_name = BUS_ISA_PORT_BASE, + .procname = "portbase", + .data = &isa_portbase, + .maxlen = sizeof(isa_portbase), + .mode = 0444, + .proc_handler = &proc_dointvec, + }, { + .ctl_name = BUS_ISA_PORT_SHIFT, + .procname = "portshift", + .data = &isa_portshift, + .maxlen = sizeof(isa_portshift), + .mode = 0444, + .proc_handler = &proc_dointvec, + }, {0} }; static struct ctl_table_header *isa_sysctl_header; -static ctl_table ctl_isa[2] = {{CTL_BUS_ISA, "isa", NULL, 0, 0555, ctl_isa_vars}, - {0}}; -static ctl_table ctl_bus[2] = {{CTL_BUS, "bus", NULL, 0, 0555, ctl_isa}, - {0}}; +static ctl_table ctl_isa[2] = { + { + .ctl_name = CTL_BUS_ISA, + .procname = "isa", + .mode = 0555, + .child = ctl_isa_vars, + }, {0} +}; + +static ctl_table ctl_bus[2] = { + { + .ctl_name = CTL_BUS, + .procname = "bus", + .mode = 0555, + .child = ctl_isa, + }, {0} +}; void __init register_isa_ports(unsigned int membase, unsigned int portbase, unsigned int portshift) diff --git a/arch/arm/kernel/iwmmxt.S b/arch/arm/kernel/iwmmxt.S index 24c7b0477..b63b528f2 100644 --- a/arch/arm/kernel/iwmmxt.S +++ b/arch/arm/kernel/iwmmxt.S @@ -271,30 +271,27 @@ ENTRY(iwmmxt_task_restore) /* * Concan handling on task switch * - * r0 = previous task_struct pointer (must be preserved) - * r1 = previous thread_info pointer - * r2 = next thread_info.cpu_domain pointer (must be preserved) + * r0 = next thread_info pointer * - * Called only from __switch_to with task preemption disabled. - * No need to care about preserving r4 and above. + * Called only from the iwmmxt notifier with task preemption disabled. */ ENTRY(iwmmxt_task_switch) - mrc p15, 0, r4, c15, c1, 0 - tst r4, #0x3 @ CP0 and CP1 accessible? + mrc p15, 0, r1, c15, c1, 0 + tst r1, #0x3 @ CP0 and CP1 accessible? bne 1f @ yes: block them for next task - ldr r5, =concan_owner - add r6, r2, #(TI_IWMMXT_STATE - TI_CPU_DOMAIN) @ get next task Concan save area - ldr r5, [r5] @ get current Concan owner - teq r5, r6 @ next task owns it? + ldr r2, =concan_owner + add r3, r0, #TI_IWMMXT_STATE @ get next task Concan save area + ldr r2, [r2] @ get current Concan owner + teq r2, r3 @ next task owns it? movne pc, lr @ no: leave Concan disabled -1: eor r4, r4, #3 @ flip Concan access - mcr p15, 0, r4, c15, c1, 0 +1: eor r1, r1, #3 @ flip Concan access + mcr p15, 0, r1, c15, c1, 0 - mrc p15, 0, r4, c2, c0, 0 - sub pc, lr, r4, lsr #32 @ cpwait and return + mrc p15, 0, r1, c2, c0, 0 + sub pc, lr, r1, lsr #32 @ cpwait and return /* * Remove Concan ownership of given task diff --git a/arch/arm/kernel/module.c b/arch/arm/kernel/module.c index 055bf5d28..298363d97 100644 --- a/arch/arm/kernel/module.c +++ b/arch/arm/kernel/module.c @@ -9,7 +9,6 @@ * * Module allocation method suggested by Andi Kleen. */ -#include #include #include #include diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 7df6e1aaa..3079535af 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c @@ -10,7 +10,6 @@ */ #include -#include #include #include #include @@ -28,10 +27,12 @@ #include #include #include +#include #include #include #include +#include #include #include @@ -71,8 +72,36 @@ static int __init hlt_setup(char *__unused) __setup("nohlt", nohlt_setup); __setup("hlt", hlt_setup); +void arm_machine_restart(char mode) +{ + /* + * Clean and disable cache, and turn off interrupts + */ + cpu_proc_fin(); + + /* + * Tell the mm system that we are going to reboot - + * we may need it to insert some 1:1 mappings so that + * soft boot works. + */ + setup_mm_for_reboot(mode); + + /* + * Now call the architecture specific reboot code. + */ + arch_reset(mode); + + /* + * Whoops - the architecture was unable to reboot. + * Tell the user! + */ + mdelay(1000); + printk("Reboot failed -- System halted\n"); + while (1); +} + /* - * The following aren't currently used. + * Function pointers to optional machine specific functions */ void (*pm_idle)(void); EXPORT_SYMBOL(pm_idle); @@ -80,6 +109,10 @@ EXPORT_SYMBOL(pm_idle); void (*pm_power_off)(void); EXPORT_SYMBOL(pm_power_off); +void (*arm_pm_restart)(char str) = arm_machine_restart; +EXPORT_SYMBOL_GPL(arm_pm_restart); + + /* * This is our default idle handler. We need to disable * interrupts here to ensure we don't miss a wakeup call. @@ -151,33 +184,9 @@ void machine_power_off(void) pm_power_off(); } - void machine_restart(char * __unused) { - /* - * Clean and disable cache, and turn off interrupts - */ - cpu_proc_fin(); - - /* - * Tell the mm system that we are going to reboot - - * we may need it to insert some 1:1 mappings so that - * soft boot works. - */ - setup_mm_for_reboot(reboot_mode); - - /* - * Now call the architecture specific reboot code. - */ - arch_reset(reboot_mode); - - /* - * Whoops - the architecture was unable to reboot. - * Tell the user! - */ - mdelay(1000); - printk("Reboot failed -- System halted\n"); - while (1); + arm_pm_restart(reboot_mode); } void __show_regs(struct pt_regs *regs) @@ -329,13 +338,9 @@ void exit_thread(void) { } -static void default_fp_init(union fp_state *fp) -{ - memset(fp, 0, sizeof(union fp_state)); -} +ATOMIC_NOTIFIER_HEAD(thread_notify_head); -void (*fp_init)(union fp_state *) = default_fp_init; -EXPORT_SYMBOL(fp_init); +EXPORT_SYMBOL_GPL(thread_notify_head); void flush_thread(void) { @@ -344,23 +349,16 @@ void flush_thread(void) memset(thread->used_cp, 0, sizeof(thread->used_cp)); memset(&tsk->thread.debug, 0, sizeof(struct debug_info)); -#if defined(CONFIG_IWMMXT) - iwmmxt_task_release(thread); -#endif - fp_init(&thread->fpstate); -#if defined(CONFIG_VFP) - vfp_flush_thread(&thread->vfpstate); -#endif + memset(&thread->fpstate, 0, sizeof(union fp_state)); + + thread_notify(THREAD_NOTIFY_FLUSH, thread); } void release_thread(struct task_struct *dead_task) { -#if defined(CONFIG_VFP) - vfp_release_thread(&task_thread_info(dead_task)->vfpstate); -#endif -#if defined(CONFIG_IWMMXT) - iwmmxt_task_release(task_thread_info(dead_task)); -#endif + struct thread_info *thread = task_thread_info(dead_task); + + thread_notify(THREAD_NOTIFY_RELEASE, thread); } asmlinkage void ret_from_fork(void) __asm__("ret_from_fork"); diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index a1d1b2906..b145c7e1f 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c @@ -9,7 +9,6 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ -#include #include #include #include @@ -634,6 +633,32 @@ static int ptrace_setwmmxregs(struct task_struct *tsk, void __user *ufp) #endif +#ifdef CONFIG_CRUNCH +/* + * Get the child Crunch state. + */ +static int ptrace_getcrunchregs(struct task_struct *tsk, void __user *ufp) +{ + struct thread_info *thread = task_thread_info(tsk); + + crunch_task_disable(thread); /* force it to ram */ + return copy_to_user(ufp, &thread->crunchstate, CRUNCH_SIZE) + ? -EFAULT : 0; +} + +/* + * Set the child Crunch state. + */ +static int ptrace_setcrunchregs(struct task_struct *tsk, void __user *ufp) +{ + struct thread_info *thread = task_thread_info(tsk); + + crunch_task_release(thread); /* force a reload */ + return copy_from_user(&thread->crunchstate, ufp, CRUNCH_SIZE) + ? -EFAULT : 0; +} +#endif + long arch_ptrace(struct task_struct *child, long request, long addr, long data) { unsigned long tmp; @@ -765,6 +790,16 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) child->ptrace_message = data; break; +#ifdef CONFIG_CRUNCH + case PTRACE_GETCRUNCHREGS: + ret = ptrace_getcrunchregs(child, (void __user *)data); + break; + + case PTRACE_SETCRUNCHREGS: + ret = ptrace_setcrunchregs(child, (void __user *)data); + break; +#endif + default: ret = ptrace_request(child, request, addr, data); break; @@ -777,34 +812,18 @@ asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno) { unsigned long ip; - if (!test_thread_flag(TIF_SYSCALL_TRACE)) - return scno; - if (!(current->ptrace & PT_PTRACED)) - return scno; - - /* - * Save IP. IP is used to denote syscall entry/exit: - * IP = 0 -> entry, = 1 -> exit - */ - ip = regs->ARM_ip; - regs->ARM_ip = why; - - current->ptrace_message = scno; - - /* the 0x80 provides a way for the tracing parent to distinguish - between a syscall stop and SIGTRAP delivery */ - ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) - ? 0x80 : 0)); - /* - * this isn't the same as continuing with a signal, but it will do - * for normal use. strace only continues with a signal if the - * stopping signal is not SIGTRAP. -brl - */ - if (current->exit_code) { - send_sig(current->exit_code, current, 1); - current->exit_code = 0; + if (test_thread_flag(TIF_SYSCALL_TRACE)) { + /* + * Save IP. IP is used to denote syscall entry/exit: + * IP = 0 -> entry, = 1 -> exit + */ + ip = regs->ARM_ip; + regs->ARM_ip = why; + + tracehook_report_syscall(regs, why); + + regs->ARM_ip = ip; } - regs->ARM_ip = ip; - return current->ptrace_message; + return scno; } diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 9fc9af88c..0a722e77c 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -7,7 +7,6 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ -#include #include #include #include @@ -18,7 +17,7 @@ #include #include #include -#include +#include #include #include #include @@ -119,9 +118,24 @@ DEFINE_PER_CPU(struct cpuinfo_arm, cpu_data); * Standard memory resources */ static struct resource mem_res[] = { - { "Video RAM", 0, 0, IORESOURCE_MEM }, - { "Kernel text", 0, 0, IORESOURCE_MEM }, - { "Kernel data", 0, 0, IORESOURCE_MEM } + { + .name = "Video RAM", + .start = 0, + .end = 0, + .flags = IORESOURCE_MEM + }, + { + .name = "Kernel text", + .start = 0, + .end = 0, + .flags = IORESOURCE_MEM + }, + { + .name = "Kernel data", + .start = 0, + .end = 0, + .flags = IORESOURCE_MEM + } }; #define video_ram mem_res[0] @@ -129,9 +143,24 @@ static struct resource mem_res[] = { #define kernel_data mem_res[2] static struct resource io_res[] = { - { "reserved", 0x3bc, 0x3be, IORESOURCE_IO | IORESOURCE_BUSY }, - { "reserved", 0x378, 0x37f, IORESOURCE_IO | IORESOURCE_BUSY }, - { "reserved", 0x278, 0x27f, IORESOURCE_IO | IORESOURCE_BUSY } + { + .name = "reserved", + .start = 0x3bc, + .end = 0x3be, + .flags = IORESOURCE_IO | IORESOURCE_BUSY + }, + { + .name = "reserved", + .start = 0x378, + .end = 0x37f, + .flags = IORESOURCE_IO | IORESOURCE_BUSY + }, + { + .name = "reserved", + .start = 0x278, + .end = 0x27f, + .flags = IORESOURCE_IO | IORESOURCE_BUSY + } }; #define lp0 io_res[0] @@ -315,9 +344,9 @@ static void __init setup_processor(void) cpu_cache = *list->cache; #endif - printk("CPU: %s [%08x] revision %d (ARMv%s)\n", + printk("CPU: %s [%08x] revision %d (ARMv%s), cr=%08lx\n", cpu_name, processor_id, (int)processor_id & 15, - proc_arch[cpu_architecture()]); + proc_arch[cpu_architecture()], cr_alignment); sprintf(system_utsname.machine, "%s%c", list->arch_name, ENDIANNESS); sprintf(elf_platform, "%s%c", list->elf_name, ENDIANNESS); @@ -808,7 +837,7 @@ static int __init topology_init(void) int cpu; for_each_possible_cpu(cpu) - register_cpu(&per_cpu(cpu_data, cpu).cpu, cpu, NULL); + register_cpu(&per_cpu(cpu_data, cpu).cpu, cpu); return 0; } diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index a0cd0a90a..48cf7fffd 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c @@ -7,7 +7,6 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ -#include #include #include #include @@ -132,18 +131,38 @@ sys_sigaction(int sig, const struct old_sigaction __user *act, return ret; } -#ifdef CONFIG_IWMMXT +#ifdef CONFIG_CRUNCH +static int preserve_crunch_context(struct crunch_sigframe *frame) +{ + char kbuf[sizeof(*frame) + 8]; + struct crunch_sigframe *kframe; -/* iwmmxt_area is 0x98 bytes long, preceeded by 8 bytes of signature */ -#define IWMMXT_STORAGE_SIZE (0x98 + 8) -#define IWMMXT_MAGIC0 0x12ef842a -#define IWMMXT_MAGIC1 0x1c07ca71 + /* the crunch context must be 64 bit aligned */ + kframe = (struct crunch_sigframe *)((unsigned long)(kbuf + 8) & ~7); + kframe->magic = CRUNCH_MAGIC; + kframe->size = CRUNCH_STORAGE_SIZE; + crunch_task_copy(current_thread_info(), &kframe->storage); + return __copy_to_user(frame, kframe, sizeof(*frame)); +} -struct iwmmxt_sigframe { - unsigned long magic0; - unsigned long magic1; - unsigned long storage[0x98/4]; -}; +static int restore_crunch_context(struct crunch_sigframe *frame) +{ + char kbuf[sizeof(*frame) + 8]; + struct crunch_sigframe *kframe; + + /* the crunch context must be 64 bit aligned */ + kframe = (struct crunch_sigframe *)((unsigned long)(kbuf + 8) & ~7); + if (__copy_from_user(kframe, frame, sizeof(*frame))) + return -1; + if (kframe->magic != CRUNCH_MAGIC || + kframe->size != CRUNCH_STORAGE_SIZE) + return -1; + crunch_task_restore(current_thread_info(), &kframe->storage); + return 0; +} +#endif + +#ifdef CONFIG_IWMMXT static int preserve_iwmmxt_context(struct iwmmxt_sigframe *frame) { @@ -152,8 +171,8 @@ static int preserve_iwmmxt_context(struct iwmmxt_sigframe *frame) /* the iWMMXt context must be 64 bit aligned */ kframe = (struct iwmmxt_sigframe *)((unsigned long)(kbuf + 8) & ~7); - kframe->magic0 = IWMMXT_MAGIC0; - kframe->magic1 = IWMMXT_MAGIC1; + kframe->magic = IWMMXT_MAGIC; + kframe->size = IWMMXT_STORAGE_SIZE; iwmmxt_task_copy(current_thread_info(), &kframe->storage); return __copy_to_user(frame, kframe, sizeof(*frame)); } @@ -167,8 +186,8 @@ static int restore_iwmmxt_context(struct iwmmxt_sigframe *frame) kframe = (struct iwmmxt_sigframe *)((unsigned long)(kbuf + 8) & ~7); if (__copy_from_user(kframe, frame, sizeof(*frame))) return -1; - if (kframe->magic0 != IWMMXT_MAGIC0 || - kframe->magic1 != IWMMXT_MAGIC1) + if (kframe->magic != IWMMXT_MAGIC || + kframe->size != IWMMXT_STORAGE_SIZE) return -1; iwmmxt_task_restore(current_thread_info(), &kframe->storage); return 0; @@ -176,71 +195,66 @@ static int restore_iwmmxt_context(struct iwmmxt_sigframe *frame) #endif -/* - * Auxiliary signal frame. This saves stuff like FP state. - * The layout of this structure is not part of the user ABI. - */ -struct aux_sigframe { -#ifdef CONFIG_IWMMXT - struct iwmmxt_sigframe iwmmxt; -#endif -#ifdef CONFIG_VFP - union vfp_state vfp; -#endif -}; - /* * Do a signal return; undo the signal stack. These are aligned to 64-bit. */ struct sigframe { - struct sigcontext sc; - unsigned long extramask[_NSIG_WORDS-1]; + struct ucontext uc; unsigned long retcode[2]; - struct aux_sigframe aux __attribute__((aligned(8))); }; struct rt_sigframe { - struct siginfo __user *pinfo; - void __user *puc; struct siginfo info; - struct ucontext uc; - unsigned long retcode[2]; - struct aux_sigframe aux __attribute__((aligned(8))); + struct sigframe sig; }; -static int -restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, - struct aux_sigframe __user *aux) +static int restore_sigframe(struct pt_regs *regs, struct sigframe __user *sf) { - int err = 0; + struct aux_sigframe __user *aux; + sigset_t set; + int err; - __get_user_error(regs->ARM_r0, &sc->arm_r0, err); - __get_user_error(regs->ARM_r1, &sc->arm_r1, err); - __get_user_error(regs->ARM_r2, &sc->arm_r2, err); - __get_user_error(regs->ARM_r3, &sc->arm_r3, err); - __get_user_error(regs->ARM_r4, &sc->arm_r4, err); - __get_user_error(regs->ARM_r5, &sc->arm_r5, err); - __get_user_error(regs->ARM_r6, &sc->arm_r6, err); - __get_user_error(regs->ARM_r7, &sc->arm_r7, err); - __get_user_error(regs->ARM_r8, &sc->arm_r8, err); - __get_user_error(regs->ARM_r9, &sc->arm_r9, err); - __get_user_error(regs->ARM_r10, &sc->arm_r10, err); - __get_user_error(regs->ARM_fp, &sc->arm_fp, err); - __get_user_error(regs->ARM_ip, &sc->arm_ip, err); - __get_user_error(regs->ARM_sp, &sc->arm_sp, err); - __get_user_error(regs->ARM_lr, &sc->arm_lr, err); - __get_user_error(regs->ARM_pc, &sc->arm_pc, err); - __get_user_error(regs->ARM_cpsr, &sc->arm_cpsr, err); + err = __copy_from_user(&set, &sf->uc.uc_sigmask, sizeof(set)); + if (err == 0) { + sigdelsetmask(&set, ~_BLOCKABLE); + spin_lock_irq(¤t->sighand->siglock); + current->blocked = set; + recalc_sigpending(); + spin_unlock_irq(¤t->sighand->siglock); + } + + __get_user_error(regs->ARM_r0, &sf->uc.uc_mcontext.arm_r0, err); + __get_user_error(regs->ARM_r1, &sf->uc.uc_mcontext.arm_r1, err); + __get_user_error(regs->ARM_r2, &sf->uc.uc_mcontext.arm_r2, err); + __get_user_error(regs->ARM_r3, &sf->uc.uc_mcontext.arm_r3, err); + __get_user_error(regs->ARM_r4, &sf->uc.uc_mcontext.arm_r4, err); + __get_user_error(regs->ARM_r5, &sf->uc.uc_mcontext.arm_r5, err); + __get_user_error(regs->ARM_r6, &sf->uc.uc_mcontext.arm_r6, err); + __get_user_error(regs->ARM_r7, &sf->uc.uc_mcontext.arm_r7, err); + __get_user_error(regs->ARM_r8, &sf->uc.uc_mcontext.arm_r8, err); + __get_user_error(regs->ARM_r9, &sf->uc.uc_mcontext.arm_r9, err); + __get_user_error(regs->ARM_r10, &sf->uc.uc_mcontext.arm_r10, err); + __get_user_error(regs->ARM_fp, &sf->uc.uc_mcontext.arm_fp, err); + __get_user_error(regs->ARM_ip, &sf->uc.uc_mcontext.arm_ip, err); + __get_user_error(regs->ARM_sp, &sf->uc.uc_mcontext.arm_sp, err); + __get_user_error(regs->ARM_lr, &sf->uc.uc_mcontext.arm_lr, err); + __get_user_error(regs->ARM_pc, &sf->uc.uc_mcontext.arm_pc, err); + __get_user_error(regs->ARM_cpsr, &sf->uc.uc_mcontext.arm_cpsr, err); err |= !valid_user_regs(regs); + aux = (struct aux_sigframe __user *) sf->uc.uc_regspace; +#ifdef CONFIG_CRUNCH + if (err == 0) + err |= restore_crunch_context(&aux->crunch); +#endif #ifdef CONFIG_IWMMXT if (err == 0 && test_thread_flag(TIF_USING_IWMMXT)) err |= restore_iwmmxt_context(&aux->iwmmxt); #endif #ifdef CONFIG_VFP // if (err == 0) -// err |= vfp_restore_state(&aux->vfp); +// err |= vfp_restore_state(&sf->aux.vfp); #endif return err; @@ -249,7 +263,6 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, asmlinkage int sys_sigreturn(struct pt_regs *regs) { struct sigframe __user *frame; - sigset_t set; /* Always make any pending restarted system calls return -EINTR */ current_thread_info()->restart_block.fn = do_no_restart_syscall; @@ -266,19 +279,8 @@ asmlinkage int sys_sigreturn(struct pt_regs *regs) if (!access_ok(VERIFY_READ, frame, sizeof (*frame))) goto badframe; - if (__get_user(set.sig[0], &frame->sc.oldmask) - || (_NSIG_WORDS > 1 - && __copy_from_user(&set.sig[1], &frame->extramask, - sizeof(frame->extramask)))) - goto badframe; - sigdelsetmask(&set, ~_BLOCKABLE); - spin_lock_irq(¤t->sighand->siglock); - current->blocked = set; - recalc_sigpending(); - spin_unlock_irq(¤t->sighand->siglock); - - if (restore_sigcontext(regs, &frame->sc, &frame->aux)) + if (restore_sigframe(regs, frame)) goto badframe; /* Send SIGTRAP if we're single-stepping */ @@ -297,7 +299,6 @@ badframe: asmlinkage int sys_rt_sigreturn(struct pt_regs *regs) { struct rt_sigframe __user *frame; - sigset_t set; /* Always make any pending restarted system calls return -EINTR */ current_thread_info()->restart_block.fn = do_no_restart_syscall; @@ -314,19 +315,11 @@ asmlinkage int sys_rt_sigreturn(struct pt_regs *regs) if (!access_ok(VERIFY_READ, frame, sizeof (*frame))) goto badframe; - if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set))) - goto badframe; - - sigdelsetmask(&set, ~_BLOCKABLE); - spin_lock_irq(¤t->sighand->siglock); - current->blocked = set; - recalc_sigpending(); - spin_unlock_irq(¤t->sighand->siglock); - if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &frame->aux)) + if (restore_sigframe(regs, &frame->sig)) goto badframe; - if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->ARM_sp) == -EFAULT) + if (do_sigaltstack(&frame->sig.uc.uc_stack, NULL, regs->ARM_sp) == -EFAULT) goto badframe; /* Send SIGTRAP if we're single-stepping */ @@ -343,42 +336,50 @@ badframe: } static int -setup_sigcontext(struct sigcontext __user *sc, struct aux_sigframe __user *aux, - struct pt_regs *regs, unsigned long mask) +setup_sigframe(struct sigframe __user *sf, struct pt_regs *regs, sigset_t *set) { + struct aux_sigframe __user *aux; int err = 0; - __put_user_error(regs->ARM_r0, &sc->arm_r0, err); - __put_user_error(regs->ARM_r1, &sc->arm_r1, err); - __put_user_error(regs->ARM_r2, &sc->arm_r2, err); - __put_user_error(regs->ARM_r3, &sc->arm_r3, err); - __put_user_error(regs->ARM_r4, &sc->arm_r4, err); - __put_user_error(regs->ARM_r5, &sc->arm_r5, err); - __put_user_error(regs->ARM_r6, &sc->arm_r6, err); - __put_user_error(regs->ARM_r7, &sc->arm_r7, err); - __put_user_error(regs->ARM_r8, &sc->arm_r8, err); - __put_user_error(regs->ARM_r9, &sc->arm_r9, err); - __put_user_error(regs->ARM_r10, &sc->arm_r10, err); - __put_user_error(regs->ARM_fp, &sc->arm_fp, err); - __put_user_error(regs->ARM_ip, &sc->arm_ip, err); - __put_user_error(regs->ARM_sp, &sc->arm_sp, err); - __put_user_error(regs->ARM_lr, &sc->arm_lr, err); - __put_user_error(regs->ARM_pc, &sc->arm_pc, err); - __put_user_error(regs->ARM_cpsr, &sc->arm_cpsr, err); - - __put_user_error(current->thread.trap_no, &sc->trap_no, err); - __put_user_error(current->thread.error_code, &sc->error_code, err); - __put_user_error(current->thread.address, &sc->fault_address, err); - __put_user_error(mask, &sc->oldmask, err); - + __put_user_error(regs->ARM_r0, &sf->uc.uc_mcontext.arm_r0, err); + __put_user_error(regs->ARM_r1, &sf->uc.uc_mcontext.arm_r1, err); + __put_user_error(regs->ARM_r2, &sf->uc.uc_mcontext.arm_r2, err); + __put_user_error(regs->ARM_r3, &sf->uc.uc_mcontext.arm_r3, err); + __put_user_error(regs->ARM_r4, &sf->uc.uc_mcontext.arm_r4, err); + __put_user_error(regs->ARM_r5, &sf->uc.uc_mcontext.arm_r5, err); + __put_user_error(regs->ARM_r6, &sf->uc.uc_mcontext.arm_r6, err); + __put_user_error(regs->ARM_r7, &sf->uc.uc_mcontext.arm_r7, err); + __put_user_error(regs->ARM_r8, &sf->uc.uc_mcontext.arm_r8, err); + __put_user_error(regs->ARM_r9, &sf->uc.uc_mcontext.arm_r9, err); + __put_user_error(regs->ARM_r10, &sf->uc.uc_mcontext.arm_r10, err); + __put_user_error(regs->ARM_fp, &sf->uc.uc_mcontext.arm_fp, err); + __put_user_error(regs->ARM_ip, &sf->uc.uc_mcontext.arm_ip, err); + __put_user_error(regs->ARM_sp, &sf->uc.uc_mcontext.arm_sp, err); + __put_user_error(regs->ARM_lr, &sf->uc.uc_mcontext.arm_lr, err); + __put_user_error(regs->ARM_pc, &sf->uc.uc_mcontext.arm_pc, err); + __put_user_error(regs->ARM_cpsr, &sf->uc.uc_mcontext.arm_cpsr, err); + + __put_user_error(current->thread.trap_no, &sf->uc.uc_mcontext.trap_no, err); + __put_user_error(current->thread.error_code, &sf->uc.uc_mcontext.error_code, err); + __put_user_error(current->thread.address, &sf->uc.uc_mcontext.fault_address, err); + __put_user_error(set->sig[0], &sf->uc.uc_mcontext.oldmask, err); + + err |= __copy_to_user(&sf->uc.uc_sigmask, set, sizeof(*set)); + + aux = (struct aux_sigframe __user *) sf->uc.uc_regspace; +#ifdef CONFIG_CRUNCH + if (err == 0) + err |= preserve_crunch_context(&aux->crunch); +#endif #ifdef CONFIG_IWMMXT if (err == 0 && test_thread_flag(TIF_USING_IWMMXT)) err |= preserve_iwmmxt_context(&aux->iwmmxt); #endif #ifdef CONFIG_VFP // if (err == 0) -// err |= vfp_save_state(&aux->vfp); +// err |= vfp_save_state(&sf->aux.vfp); #endif + __put_user_error(0, &aux->end_magic, err); return err; } @@ -487,13 +488,12 @@ setup_frame(int usig, struct k_sigaction *ka, sigset_t *set, struct pt_regs *reg if (!frame) return 1; - err |= setup_sigcontext(&frame->sc, &frame->aux, regs, set->sig[0]); - - if (_NSIG_WORDS > 1) { - err |= __copy_to_user(frame->extramask, &set->sig[1], - sizeof(frame->extramask)); - } + /* + * Set uc.uc_flags to a value which sc.trap_no would never have. + */ + __put_user_error(0x5ac3c35a, &frame->uc.uc_flags, err); + err |= setup_sigframe(frame, regs, set); if (err == 0) err = setup_return(regs, ka, frame->retcode, frame, usig); @@ -511,25 +511,20 @@ setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info, if (!frame) return 1; - __put_user_error(&frame->info, &frame->pinfo, err); - __put_user_error(&frame->uc, &frame->puc, err); err |= copy_siginfo_to_user(&frame->info, info); - __put_user_error(0, &frame->uc.uc_flags, err); - __put_user_error(NULL, &frame->uc.uc_link, err); + __put_user_error(0, &frame->sig.uc.uc_flags, err); + __put_user_error(NULL, &frame->sig.uc.uc_link, err); memset(&stack, 0, sizeof(stack)); stack.ss_sp = (void __user *)current->sas_ss_sp; stack.ss_flags = sas_ss_flags(regs->ARM_sp); stack.ss_size = current->sas_ss_size; - err |= __copy_to_user(&frame->uc.uc_stack, &stack, sizeof(stack)); - - err |= setup_sigcontext(&frame->uc.uc_mcontext, &frame->aux, - regs, set->sig[0]); - err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); + err |= __copy_to_user(&frame->sig.uc.uc_stack, &stack, sizeof(stack)); + err |= setup_sigframe(&frame->sig, regs, set); if (err == 0) - err = setup_return(regs, ka, frame->retcode, frame, usig); + err = setup_return(regs, ka, frame->sig.retcode, frame, usig); if (err == 0) { /* @@ -538,7 +533,7 @@ setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info, * -- Peter Maydell 2000-12-06 */ regs->ARM_r1 = (unsigned long)&frame->info; - regs->ARM_r2 = (unsigned long)&frame->uc; + regs->ARM_r2 = (unsigned long)&frame->sig.uc; } return err; @@ -665,17 +660,33 @@ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall) if (syscall) { if (regs->ARM_r0 == -ERESTART_RESTARTBLOCK) { if (thumb_mode(regs)) { - regs->ARM_r7 = __NR_restart_syscall; + regs->ARM_r7 = __NR_restart_syscall - __NR_SYSCALL_BASE; regs->ARM_pc -= 2; } else { +#if defined(CONFIG_AEABI) && !defined(CONFIG_OABI_COMPAT) + regs->ARM_r7 = __NR_restart_syscall; + regs->ARM_pc -= 4; +#else u32 __user *usp; + u32 swival = __NR_restart_syscall; regs->ARM_sp -= 12; usp = (u32 __user *)regs->ARM_sp; + /* + * Either we supports OABI only, or we have + * EABI with the OABI compat layer enabled. + * In the later case we don't know if user + * space is EABI or not, and if not we must + * not clobber r7. Always using the OABI + * syscall solves that issue and works for + * all those cases. + */ + swival = swival - __NR_SYSCALL_BASE + __NR_OABI_SYSCALL_BASE; + put_user(regs->ARM_pc, &usp[0]); /* swi __NR_restart_syscall */ - put_user(0xef000000 | __NR_restart_syscall, &usp[1]); + put_user(0xef000000 | swival, &usp[1]); /* ldr pc, [sp], #12 */ put_user(0xe49df00c, &usp[2]); @@ -683,6 +694,7 @@ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall) (unsigned long)(usp + 3)); regs->ARM_pc = regs->ARM_sp + 4; +#endif } } if (regs->ARM_r0 == -ERESTARTNOHAND || diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index ecc8c3332..68e9634d2 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c @@ -7,7 +7,6 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ -#include #include #include #include @@ -24,6 +23,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -33,9 +35,16 @@ * The present bitmask indicates that the CPU is physically present. * The online bitmask indicates that the CPU is up and running. */ -cpumask_t cpu_present_mask; +cpumask_t cpu_possible_map; cpumask_t cpu_online_map; +/* + * as from 2.5, kernels no longer have an init_tasks structure + * so we need some other way of telling a new secondary core + * where to place its SVC stack + */ +struct secondary_data secondary_data; + /* * structures for inter-processor calls * - A collection of single bit ipi messages. @@ -68,27 +77,79 @@ struct smp_call_struct { static struct smp_call_struct * volatile smp_call_function_data; static DEFINE_SPINLOCK(smp_call_function_lock); -int __init __cpu_up(unsigned int cpu) +int __cpuinit __cpu_up(unsigned int cpu) { - struct task_struct *idle; + struct cpuinfo_arm *ci = &per_cpu(cpu_data, cpu); + struct task_struct *idle = ci->idle; + pgd_t *pgd; + pmd_t *pmd; int ret; /* - * Spawn a new process manually. Grab a pointer to - * its task struct so we can mess with it + * Spawn a new process manually, if not already done. + * Grab a pointer to its task struct so we can mess with it */ - idle = fork_idle(cpu); - if (IS_ERR(idle)) { - printk(KERN_ERR "CPU%u: fork() failed\n", cpu); - return PTR_ERR(idle); + if (!idle) { + idle = fork_idle(cpu); + if (IS_ERR(idle)) { + printk(KERN_ERR "CPU%u: fork() failed\n", cpu); + return PTR_ERR(idle); + } + ci->idle = idle; } + /* + * Allocate initial page tables to allow the new CPU to + * enable the MMU safely. This essentially means a set + * of our "standard" page tables, with the addition of + * a 1:1 mapping for the physical address of the kernel. + */ + pgd = pgd_alloc(&init_mm); + pmd = pmd_offset(pgd, PHYS_OFFSET); + *pmd = __pmd((PHYS_OFFSET & PGDIR_MASK) | + PMD_TYPE_SECT | PMD_SECT_AP_WRITE); + + /* + * We need to tell the secondary core where to find + * its stack and the page tables. + */ + secondary_data.stack = task_stack_page(idle) + THREAD_START_SP; + secondary_data.pgdir = virt_to_phys(pgd); + wmb(); + /* * Now bring the CPU into our world. */ ret = boot_secondary(cpu, idle); + if (ret == 0) { + unsigned long timeout; + + /* + * CPU was successfully started, wait for it + * to come online or time out. + */ + timeout = jiffies + HZ; + while (time_before(jiffies, timeout)) { + if (cpu_online(cpu)) + break; + + udelay(10); + barrier(); + } + + if (!cpu_online(cpu)) + ret = -EIO; + } + + secondary_data.stack = NULL; + secondary_data.pgdir = 0; + + *pmd_offset(pgd, PHYS_OFFSET) = __pmd(0); + pgd_free(pgd); + if (ret) { - printk(KERN_CRIT "cpu_up: processor %d failed to boot\n", cpu); + printk(KERN_CRIT "CPU%u: processor failed to boot\n", cpu); + /* * FIXME: We need to clean up the new idle thread. --rmk */ @@ -97,11 +158,158 @@ int __init __cpu_up(unsigned int cpu) return ret; } +#ifdef CONFIG_HOTPLUG_CPU +/* + * __cpu_disable runs on the processor to be shutdown. + */ +int __cpuexit __cpu_disable(void) +{ + unsigned int cpu = smp_processor_id(); + struct task_struct *p; + int ret; + + ret = mach_cpu_disable(cpu); + if (ret) + return ret; + + /* + * Take this CPU offline. Once we clear this, we can't return, + * and we must not schedule until we're ready to give up the cpu. + */ + cpu_clear(cpu, cpu_online_map); + + /* + * OK - migrate IRQs away from this CPU + */ + migrate_irqs(); + + /* + * Stop the local timer for this CPU. + */ + local_timer_stop(cpu); + + /* + * Flush user cache and TLB mappings, and then remove this CPU + * from the vm mask set of all processes. + */ + flush_cache_all(); + local_flush_tlb_all(); + + read_lock(&tasklist_lock); + for_each_process(p) { + if (p->mm) + cpu_clear(cpu, p->mm->cpu_vm_mask); + } + read_unlock(&tasklist_lock); + + return 0; +} + +/* + * called on the thread which is asking for a CPU to be shutdown - + * waits until shutdown has completed, or it is timed out. + */ +void __cpuexit __cpu_die(unsigned int cpu) +{ + if (!platform_cpu_kill(cpu)) + printk("CPU%u: unable to kill\n", cpu); +} + +/* + * Called from the idle thread for the CPU which has been shutdown. + * + * Note that we disable IRQs here, but do not re-enable them + * before returning to the caller. This is also the behaviour + * of the other hotplug-cpu capable cores, so presumably coming + * out of idle fixes this. + */ +void __cpuexit cpu_die(void) +{ + unsigned int cpu = smp_processor_id(); + + local_irq_disable(); + idle_task_exit(); + + /* + * actual CPU shutdown procedure is at least platform (if not + * CPU) specific + */ + platform_cpu_die(cpu); + + /* + * Do not return to the idle loop - jump back to the secondary + * cpu initialisation. There's some initialisation which needs + * to be repeated to undo the effects of taking the CPU offline. + */ + __asm__("mov sp, %0\n" + " b secondary_start_kernel" + : + : "r" (task_stack_page(current) + THREAD_SIZE - 8)); +} +#endif /* CONFIG_HOTPLUG_CPU */ + +/* + * This is the secondary CPU boot entry. We're using this CPUs + * idle thread stack, but a set of temporary page tables. + */ +asmlinkage void __cpuinit secondary_start_kernel(void) +{ + struct mm_struct *mm = &init_mm; + unsigned int cpu = smp_processor_id(); + + printk("CPU%u: Booted secondary processor\n", cpu); + + /* + * All kernel threads share the same mm context; grab a + * reference and switch to it. + */ + atomic_inc(&mm->mm_users); + atomic_inc(&mm->mm_count); + current->active_mm = mm; + cpu_set(cpu, mm->cpu_vm_mask); + cpu_switch_mm(mm->pgd, mm); + enter_lazy_tlb(mm, current); + local_flush_tlb_all(); + + cpu_init(); + preempt_disable(); + + /* + * Give the platform a chance to do its own initialisation. + */ + platform_secondary_init(cpu); + + /* + * Enable local interrupts. + */ + local_irq_enable(); + local_fiq_enable(); + + calibrate_delay(); + + smp_store_cpu_info(cpu); + + /* + * OK, now it's safe to let the boot CPU continue + */ + cpu_set(cpu, cpu_online_map); + + /* + * Setup local timer for this CPU. + */ + local_timer_setup(cpu); + + /* + * OK, it's off to the idle thread for us + */ + cpu_idle(); +} + /* * Called by both boot and secondaries to move global data into * per-processor storage. */ -void __init smp_store_cpu_info(unsigned int cpuid) +void __cpuinit smp_store_cpu_info(unsigned int cpuid) { struct cpuinfo_arm *cpu_info = &per_cpu(cpu_data, cpuid); @@ -127,8 +335,7 @@ void __init smp_prepare_boot_cpu(void) { unsigned int cpu = smp_processor_id(); - cpu_set(cpu, cpu_present_mask); - cpu_set(cpu, cpu_online_map); + per_cpu(cpu_data, cpu).idle = current; } static void send_ipi_message(cpumask_t callmap, enum ipi_msg_type msg) @@ -158,8 +365,8 @@ static void send_ipi_message(cpumask_t callmap, enum ipi_msg_type msg) * You must not call this function with disabled interrupts, from a * hardware interrupt handler, nor from a bottom half handler. */ -int smp_call_function_on_cpu(void (*func)(void *info), void *info, int retry, - int wait, cpumask_t callmap) +static int smp_call_function_on_cpu(void (*func)(void *info), void *info, + int retry, int wait, cpumask_t callmap) { struct smp_call_struct data; unsigned long timeout; @@ -199,8 +406,8 @@ int smp_call_function_on_cpu(void (*func)(void *info), void *info, int retry, printk(KERN_CRIT "CPU%u: smp_call_function timeout for %p(%p)\n" " callmap %lx pending %lx, %swait\n", - smp_processor_id(), func, info, callmap, data.pending, - wait ? "" : "no "); + smp_processor_id(), func, info, *cpus_addr(callmap), + *cpus_addr(data.pending), wait ? "" : "no "); /* * TRACE @@ -247,12 +454,24 @@ void show_ipi_list(struct seq_file *p) seq_puts(p, "IPI:"); - for_each_online_cpu(cpu) + for_each_present_cpu(cpu) seq_printf(p, " %10lu", per_cpu(ipi_data, cpu).ipi_count); seq_putc(p, '\n'); } +void show_local_irqs(struct seq_file *p) +{ + unsigned int cpu; + + seq_printf(p, "LOC: "); + + for_each_present_cpu(cpu) + seq_printf(p, "%10u ", irq_stat[cpu].local_timer_irqs); + + seq_putc(p, '\n'); +} + static void ipi_timer(struct pt_regs *regs) { int user = user_mode(regs); @@ -263,6 +482,18 @@ static void ipi_timer(struct pt_regs *regs) irq_exit(); } +#ifdef CONFIG_LOCAL_TIMERS +asmlinkage void do_local_timer(struct pt_regs *regs) +{ + int cpu = smp_processor_id(); + + if (local_timer_ack()) { + irq_stat[cpu].local_timer_irqs++; + ipi_timer(regs); + } +} +#endif + /* * ipi_call_function - handle IPI from smp_call_function() * @@ -314,7 +545,7 @@ static void ipi_cpu_stop(unsigned int cpu) * * Bit 0 - Inter-processor function call */ -void do_IPI(struct pt_regs *regs) +asmlinkage void do_IPI(struct pt_regs *regs) { unsigned int cpu = smp_processor_id(); struct ipi_data *ipi = &per_cpu(ipi_data, cpu); @@ -394,3 +625,126 @@ int __init setup_profiling_timer(unsigned int multiplier) { return -EINVAL; } + +static int +on_each_cpu_mask(void (*func)(void *), void *info, int retry, int wait, + cpumask_t mask) +{ + int ret = 0; + + preempt_disable(); + + ret = smp_call_function_on_cpu(func, info, retry, wait, mask); + if (cpu_isset(smp_processor_id(), mask)) + func(info); + + preempt_enable(); + + return ret; +} + +/**********************************************************************/ + +/* + * TLB operations + */ +struct tlb_args { + struct vm_area_struct *ta_vma; + unsigned long ta_start; + unsigned long ta_end; +}; + +static inline void ipi_flush_tlb_all(void *ignored) +{ + local_flush_tlb_all(); +} + +static inline void ipi_flush_tlb_mm(void *arg) +{ + struct mm_struct *mm = (struct mm_struct *)arg; + + local_flush_tlb_mm(mm); +} + +static inline void ipi_flush_tlb_page(void *arg) +{ + struct tlb_args *ta = (struct tlb_args *)arg; + + local_flush_tlb_page(ta->ta_vma, ta->ta_start); +} + +static inline void ipi_flush_tlb_kernel_page(void *arg) +{ + struct tlb_args *ta = (struct tlb_args *)arg; + + local_flush_tlb_kernel_page(ta->ta_start); +} + +static inline void ipi_flush_tlb_range(void *arg) +{ + struct tlb_args *ta = (struct tlb_args *)arg; + + local_flush_tlb_range(ta->ta_vma, ta->ta_start, ta->ta_end); +} + +static inline void ipi_flush_tlb_kernel_range(void *arg) +{ + struct tlb_args *ta = (struct tlb_args *)arg; + + local_flush_tlb_kernel_range(ta->ta_start, ta->ta_end); +} + +void flush_tlb_all(void) +{ + on_each_cpu(ipi_flush_tlb_all, NULL, 1, 1); +} + +void flush_tlb_mm(struct mm_struct *mm) +{ + cpumask_t mask = mm->cpu_vm_mask; + + on_each_cpu_mask(ipi_flush_tlb_mm, mm, 1, 1, mask); +} + +void flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr) +{ + cpumask_t mask = vma->vm_mm->cpu_vm_mask; + struct tlb_args ta; + + ta.ta_vma = vma; + ta.ta_start = uaddr; + + on_each_cpu_mask(ipi_flush_tlb_page, &ta, 1, 1, mask); +} + +void flush_tlb_kernel_page(unsigned long kaddr) +{ + struct tlb_args ta; + + ta.ta_start = kaddr; + + on_each_cpu(ipi_flush_tlb_kernel_page, &ta, 1, 1); +} + +void flush_tlb_range(struct vm_area_struct *vma, + unsigned long start, unsigned long end) +{ + cpumask_t mask = vma->vm_mm->cpu_vm_mask; + struct tlb_args ta; + + ta.ta_vma = vma; + ta.ta_start = start; + ta.ta_end = end; + + on_each_cpu_mask(ipi_flush_tlb_range, &ta, 1, 1, mask); +} + +void flush_tlb_kernel_range(unsigned long start, unsigned long end) +{ + struct tlb_args ta; + + ta.ta_start = start; + ta.ta_end = end; + + on_each_cpu(ipi_flush_tlb_kernel_range, &ta, 1, 1); +} diff --git a/arch/arm/kernel/time.c b/arch/arm/kernel/time.c index d6bd435a6..09a67d771 100644 --- a/arch/arm/kernel/time.c +++ b/arch/arm/kernel/time.c @@ -16,7 +16,6 @@ * 1998-12-20 Updated NTP code according to technical memorandum Jan '96 * "A Kernel Model for Precision Timekeeping" by Dave Mills */ -#include #include #include #include @@ -379,7 +378,7 @@ static int timer_dyn_tick_enable(void) int ret = -ENODEV; if (dyn_tick) { - write_seqlock_irqsave(&xtime_lock, flags); + spin_lock_irqsave(&dyn_tick->lock, flags); ret = 0; if (!(dyn_tick->state & DYN_TICK_ENABLED)) { ret = dyn_tick->enable(); @@ -387,7 +386,7 @@ static int timer_dyn_tick_enable(void) if (ret == 0) dyn_tick->state |= DYN_TICK_ENABLED; } - write_sequnlock_irqrestore(&xtime_lock, flags); + spin_unlock_irqrestore(&dyn_tick->lock, flags); } return ret; @@ -400,7 +399,7 @@ static int timer_dyn_tick_disable(void) int ret = -ENODEV; if (dyn_tick) { - write_seqlock_irqsave(&xtime_lock, flags); + spin_lock_irqsave(&dyn_tick->lock, flags); ret = 0; if (dyn_tick->state & DYN_TICK_ENABLED) { ret = dyn_tick->disable(); @@ -408,7 +407,7 @@ static int timer_dyn_tick_disable(void) if (ret == 0) dyn_tick->state &= ~DYN_TICK_ENABLED; } - write_sequnlock_irqrestore(&xtime_lock, flags); + spin_unlock_irqrestore(&dyn_tick->lock, flags); } return ret; @@ -422,15 +421,20 @@ static int timer_dyn_tick_disable(void) void timer_dyn_reprogram(void) { struct dyn_tick_timer *dyn_tick = system_timer->dyn_tick; - unsigned long next, seq; + unsigned long next, seq, flags; - if (dyn_tick && (dyn_tick->state & DYN_TICK_ENABLED)) { + if (!dyn_tick) + return; + + spin_lock_irqsave(&dyn_tick->lock, flags); + if (dyn_tick->state & DYN_TICK_ENABLED) { next = next_timer_interrupt(); do { seq = read_seqbegin(&xtime_lock); - dyn_tick->reprogram(next_timer_interrupt() - jiffies); + dyn_tick->reprogram(next - jiffies); } while (read_seqretry(&xtime_lock, seq)); } + spin_unlock_irqrestore(&dyn_tick->lock, flags); } static ssize_t timer_show_dyn_tick(struct sys_device *dev, char *buf) @@ -499,5 +503,10 @@ void __init time_init(void) if (system_timer->offset == NULL) system_timer->offset = dummy_gettimeoffset; system_timer->init(); + +#ifdef CONFIG_NO_IDLE_HZ + if (system_timer->dyn_tick) + system_timer->dyn_tick->lock = SPIN_LOCK_UNLOCKED; +#endif } diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 35230a060..aeeed806f 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c @@ -12,7 +12,6 @@ * 'linux/arch/arm/lib/traps.S'. Mostly a debugging aid, but will probably * kill the offending process. */ -#include #include #include #include @@ -233,11 +232,8 @@ NORET_TYPE void die(const char *str, struct pt_regs *regs, int err) bust_spinlocks(0); spin_unlock_irq(&die_lock); - if (panic_on_oops) { - printk(KERN_EMERG "Fatal exception: panic in 5 seconds\n"); - ssleep(5); + if (panic_on_oops) panic("Fatal exception"); - } do_exit(SIGSEGV); } diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index 2b254e885..3ca574ee2 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S @@ -4,7 +4,6 @@ */ #include -#include #include #include @@ -80,6 +79,10 @@ SECTIONS *(.exit.text) *(.exit.data) *(.exitcall.exit) +#ifndef CONFIG_MMU + *(.fixup) + *(__ex_table) +#endif } .text : { /* Real text segment */ @@ -87,7 +90,9 @@ SECTIONS *(.text) SCHED_TEXT LOCK_TEXT +#ifdef CONFIG_MMU *(.fixup) +#endif *(.gnu.warning) *(.rodata) *(.rodata.*) @@ -142,7 +147,9 @@ SECTIONS */ . = ALIGN(32); __start___ex_table = .; +#ifdef CONFIG_MMU *(__ex_table) +#endif __stop___ex_table = .; /* diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile index 7b726b627..30351cd45 100644 --- a/arch/arm/lib/Makefile +++ b/arch/arm/lib/Makefile @@ -6,28 +6,31 @@ lib-y := backtrace.o changebit.o csumipv6.o csumpartial.o \ csumpartialcopy.o csumpartialcopyuser.o clearbit.o \ - copy_page.o delay.o findbit.o memchr.o memcpy.o \ + delay.o findbit.o memchr.o memcpy.o \ memmove.o memset.o memzero.o setbit.o \ strncpy_from_user.o strnlen_user.o \ strchr.o strrchr.o \ testchangebit.o testclearbit.o testsetbit.o \ - getuser.o putuser.o clear_user.o \ ashldi3.o ashrdi3.o lshrdi3.o muldi3.o \ ucmpdi2.o lib1funcs.o div64.o sha1.o \ io-readsb.o io-writesb.o io-readsl.o io-writesl.o +mmu-y := clear_user.o copy_page.o getuser.o putuser.o + # the code in uaccess.S is not preemption safe and # probably faster on ARMv3 only ifeq ($(CONFIG_PREEMPT),y) - lib-y += copy_from_user.o copy_to_user.o + mmu-y += copy_from_user.o copy_to_user.o else ifneq ($(CONFIG_CPU_32v3),y) - lib-y += copy_from_user.o copy_to_user.o + mmu-y += copy_from_user.o copy_to_user.o else - lib-y += uaccess.o + mmu-y += uaccess.o endif endif +lib-$(CONFIG_MMU) += $(mmu-y) + ifeq ($(CONFIG_CPU_32v3),y) lib-y += io-readsw-armv3.o io-writesw-armv3.o else diff --git a/arch/arm/lib/backtrace.S b/arch/arm/lib/backtrace.S index 16153c86c..74230083c 100644 --- a/arch/arm/lib/backtrace.S +++ b/arch/arm/lib/backtrace.S @@ -10,7 +10,6 @@ * 27/03/03 Ian Molton Clean up CONFIG_CPU * */ -#include #include #include .text @@ -41,7 +40,7 @@ ENTRY(c_backtrace) movne r0, #0 movs frame, r0 1: moveq r0, #-2 - LOADREGS(eqfd, sp!, {r4 - r8, pc}) + ldmeqfd sp!, {r4 - r8, pc} 2: stmfd sp!, {pc} @ calculate offset of PC in STMIA instruction ldr r0, [sp], #4 @@ -85,7 +84,7 @@ ENTRY(c_backtrace) * A zero next framepointer means we're done. */ teq next, #0 - LOADREGS(eqfd, sp!, {r4 - r8, pc}) + ldmeqfd sp!, {r4 - r8, pc} /* * The next framepointer must be above the @@ -97,16 +96,13 @@ ENTRY(c_backtrace) b 1007f /* - * Fixup for LDMDB + * Fixup for LDMDB. Note that this must not be in the fixup section. */ - .section .fixup,"ax" - .align 0 1007: ldr r0, =.Lbad mov r1, frame bl printk - LOADREGS(fd, sp!, {r4 - r8, pc}) + ldmfd sp!, {r4 - r8, pc} .ltorg - .previous .section __ex_table,"a" .align 3 @@ -145,7 +141,7 @@ ENTRY(c_backtrace) adrne r0, .Lcr blne printk mov r0, stack - LOADREGS(fd, sp!, {instr, reg, stack, r7, r8, pc}) + ldmfd sp!, {instr, reg, stack, r7, r8, pc} .Lfp: .asciz " r%d = %08X%c" .Lcr: .asciz "\n" diff --git a/arch/arm/lib/bitops.h b/arch/arm/lib/bitops.h index 4a83ab6cd..542251021 100644 --- a/arch/arm/lib/bitops.h +++ b/arch/arm/lib/bitops.h @@ -1,8 +1,39 @@ + +#if __LINUX_ARM_ARCH__ >= 6 && defined(CONFIG_CPU_32v6K) + .macro bitop, instr + mov r2, #1 + and r3, r0, #7 @ Get bit offset + add r1, r1, r0, lsr #3 @ Get byte offset + mov r3, r2, lsl r3 +1: ldrexb r2, [r1] + \instr r2, r2, r3 + strexb r0, r2, [r1] + cmp r0, #0 + bne 1b + mov pc, lr + .endm + + .macro testop, instr, store + and r3, r0, #7 @ Get bit offset + mov r2, #1 + add r1, r1, r0, lsr #3 @ Get byte offset + mov r3, r2, lsl r3 @ create mask +1: ldrexb r2, [r1] + ands r0, r2, r3 @ save old value of bit + \instr r2, r2, r3 @ toggle bit + strexb ip, r2, [r1] + cmp ip, #0 + bne 1b + cmp r0, #0 + movne r0, #1 +2: mov pc, lr + .endm +#else .macro bitop, instr and r2, r0, #7 mov r3, #1 mov r3, r3, lsl r2 - save_and_disable_irqs ip, r2 + save_and_disable_irqs ip ldrb r2, [r1, r0, lsr #3] \instr r2, r2, r3 strb r2, [r1, r0, lsr #3] @@ -22,7 +53,7 @@ add r1, r1, r0, lsr #3 and r3, r0, #7 mov r0, #1 - save_and_disable_irqs ip, r2 + save_and_disable_irqs ip ldrb r2, [r1] tst r2, r0, lsl r3 \instr r2, r2, r0, lsl r3 @@ -31,3 +62,4 @@ moveq r0, #0 mov pc, lr .endm +#endif diff --git a/arch/arm/lib/clear_user.S b/arch/arm/lib/clear_user.S index 7ff9f831b..ecb28dcda 100644 --- a/arch/arm/lib/clear_user.S +++ b/arch/arm/lib/clear_user.S @@ -12,13 +12,13 @@ .text -/* Prototype: int __arch_clear_user(void *addr, size_t sz) +/* Prototype: int __clear_user(void *addr, size_t sz) * Purpose : clear some user memory * Params : addr - user memory address to clear * : sz - number of bytes to clear * Returns : number of bytes NOT cleared */ -ENTRY(__arch_clear_user) +ENTRY(__clear_user) stmfd sp!, {r1, lr} mov r2, #0 cmp r1, #4 @@ -43,10 +43,10 @@ USER( strnebt r2, [r0], #1) tst r1, #1 @ x1 x0 x1 x0 x1 x0 x1 USER( strnebt r2, [r0], #1) mov r0, #0 - LOADREGS(fd,sp!, {r1, pc}) + ldmfd sp!, {r1, pc} .section .fixup,"ax" .align 0 -9001: LOADREGS(fd,sp!, {r0, pc}) +9001: ldmfd sp!, {r0, pc} .previous diff --git a/arch/arm/lib/copy_from_user.S b/arch/arm/lib/copy_from_user.S index 7497393a0..6b7363ce7 100644 --- a/arch/arm/lib/copy_from_user.S +++ b/arch/arm/lib/copy_from_user.S @@ -16,7 +16,7 @@ /* * Prototype: * - * size_t __arch_copy_from_user(void *to, const void *from, size_t n) + * size_t __copy_from_user(void *to, const void *from, size_t n) * * Purpose: * @@ -83,7 +83,7 @@ .text -ENTRY(__arch_copy_from_user) +ENTRY(__copy_from_user) #include "copy_template.S" diff --git a/arch/arm/lib/copy_page.S b/arch/arm/lib/copy_page.S index 681179684..666c99cc0 100644 --- a/arch/arm/lib/copy_page.S +++ b/arch/arm/lib/copy_page.S @@ -43,4 +43,4 @@ ENTRY(copy_page) bgt 1b @ 1 PLD( ldmeqia r1!, {r3, r4, ip, lr} ) PLD( beq 2b ) - LOADREGS(fd, sp!, {r4, pc}) @ 3 + ldmfd sp!, {r4, pc} @ 3 diff --git a/arch/arm/lib/copy_to_user.S b/arch/arm/lib/copy_to_user.S index 4a6d8ea14..5224d9468 100644 --- a/arch/arm/lib/copy_to_user.S +++ b/arch/arm/lib/copy_to_user.S @@ -16,7 +16,7 @@ /* * Prototype: * - * size_t __arch_copy_to_user(void *to, const void *from, size_t n) + * size_t __copy_to_user(void *to, const void *from, size_t n) * * Purpose: * @@ -86,7 +86,7 @@ .text -ENTRY(__arch_copy_to_user) +ENTRY(__copy_to_user) #include "copy_template.S" diff --git a/arch/arm/lib/csumipv6.S b/arch/arm/lib/csumipv6.S index 7065a20ee..9621469be 100644 --- a/arch/arm/lib/csumipv6.S +++ b/arch/arm/lib/csumipv6.S @@ -28,5 +28,5 @@ ENTRY(__csum_ipv6_magic) adcs r0, r0, r3 adcs r0, r0, r2 adcs r0, r0, #0 - LOADREGS(fd, sp!, {pc}) + ldmfd sp!, {pc} diff --git a/arch/arm/lib/delay.S b/arch/arm/lib/delay.S index 9183b06c0..930a70259 100644 --- a/arch/arm/lib/delay.S +++ b/arch/arm/lib/delay.S @@ -31,7 +31,7 @@ ENTRY(__const_udelay) @ 0 <= r0 <= 0x7fffff06 mov r2, r2, lsr #10 @ max = 0x00007fff mul r0, r2, r0 @ max = 2^32-1 movs r0, r0, lsr #6 - RETINSTR(moveq,pc,lr) + moveq pc, lr /* * loops = r0 * HZ * loops_per_jiffy / 1000000 @@ -43,20 +43,20 @@ ENTRY(__const_udelay) @ 0 <= r0 <= 0x7fffff06 ENTRY(__delay) subs r0, r0, #1 #if 0 - RETINSTR(movls,pc,lr) + movls pc, lr subs r0, r0, #1 - RETINSTR(movls,pc,lr) + movls pc, lr subs r0, r0, #1 - RETINSTR(movls,pc,lr) + movls pc, lr subs r0, r0, #1 - RETINSTR(movls,pc,lr) + movls pc, lr subs r0, r0, #1 - RETINSTR(movls,pc,lr) + movls pc, lr subs r0, r0, #1 - RETINSTR(movls,pc,lr) + movls pc, lr subs r0, r0, #1 - RETINSTR(movls,pc,lr) + movls pc, lr subs r0, r0, #1 #endif bhi __delay - RETINSTR(mov,pc,lr) + mov pc, lr diff --git a/arch/arm/lib/ecard.S b/arch/arm/lib/ecard.S index fb7b602a6..c55aaa2a2 100644 --- a/arch/arm/lib/ecard.S +++ b/arch/arm/lib/ecard.S @@ -29,7 +29,7 @@ ENTRY(ecard_loader_read) CPSR2SPSR(r0) mov lr, pc mov pc, r2 - LOADREGS(fd, sp!, {r4 - r12, pc}) + ldmfd sp!, {r4 - r12, pc} @ Purpose: call an expansion card loader to reset the card @ Proto : void read_loader(int card_base, char *loader); @@ -41,5 +41,5 @@ ENTRY(ecard_loader_reset) CPSR2SPSR(r0) mov lr, pc add pc, r1, #8 - LOADREGS(fd, sp!, {r4 - r12, pc}) + ldmfd sp!, {r4 - r12, pc} diff --git a/arch/arm/lib/findbit.S b/arch/arm/lib/findbit.S index 6f8e27a58..a5ca0248a 100644 --- a/arch/arm/lib/findbit.S +++ b/arch/arm/lib/findbit.S @@ -32,7 +32,7 @@ ENTRY(_find_first_zero_bit_le) 2: cmp r2, r1 @ any more? blo 1b 3: mov r0, r1 @ no free bits - RETINSTR(mov,pc,lr) + mov pc, lr /* * Purpose : Find next 'zero' bit @@ -66,7 +66,7 @@ ENTRY(_find_first_bit_le) 2: cmp r2, r1 @ any more? blo 1b 3: mov r0, r1 @ no free bits - RETINSTR(mov,pc,lr) + mov pc, lr /* * Purpose : Find next 'one' bit @@ -98,7 +98,7 @@ ENTRY(_find_first_zero_bit_be) 2: cmp r2, r1 @ any more? blo 1b 3: mov r0, r1 @ no free bits - RETINSTR(mov,pc,lr) + mov pc, lr ENTRY(_find_next_zero_bit_be) teq r1, #0 @@ -126,7 +126,7 @@ ENTRY(_find_first_bit_be) 2: cmp r2, r1 @ any more? blo 1b 3: mov r0, r1 @ no free bits - RETINSTR(mov,pc,lr) + mov pc, lr ENTRY(_find_next_bit_be) teq r1, #0 @@ -164,5 +164,5 @@ ENTRY(_find_next_bit_be) addeq r2, r2, #1 mov r0, r2 #endif - RETINSTR(mov,pc,lr) + mov pc, lr diff --git a/arch/arm/lib/io-readsb.S b/arch/arm/lib/io-readsb.S index d3d8de71a..fb966ad02 100644 --- a/arch/arm/lib/io-readsb.S +++ b/arch/arm/lib/io-readsb.S @@ -72,7 +72,7 @@ ENTRY(__raw_readsb) bpl .Linsb_16_lp tst r2, #15 - LOADREGS(eqfd, sp!, {r4 - r6, pc}) + ldmeqfd sp!, {r4 - r6, pc} .Linsb_no_16: tst r2, #8 beq .Linsb_no_8 @@ -109,7 +109,7 @@ ENTRY(__raw_readsb) str r3, [r1], #4 .Linsb_no_4: ands r2, r2, #3 - LOADREGS(eqfd, sp!, {r4 - r6, pc}) + ldmeqfd sp!, {r4 - r6, pc} cmp r2, #2 ldrb r3, [r0] @@ -119,4 +119,4 @@ ENTRY(__raw_readsb) ldrgtb r3, [r0] strgtb r3, [r1] - LOADREGS(fd, sp!, {r4 - r6, pc}) + ldmfd sp!, {r4 - r6, pc} diff --git a/arch/arm/lib/io-readsw-armv3.S b/arch/arm/lib/io-readsw-armv3.S index 146d47c15..4ef904185 100644 --- a/arch/arm/lib/io-readsw-armv3.S +++ b/arch/arm/lib/io-readsw-armv3.S @@ -28,7 +28,7 @@ strb r3, [r1], #1 subs r2, r2, #1 - RETINSTR(moveq, pc, lr) + moveq pc, lr ENTRY(__raw_readsw) teq r2, #0 @ do we have to check for the zero len? @@ -69,7 +69,7 @@ ENTRY(__raw_readsw) bpl .Linsw_8_lp tst r2, #7 - LOADREGS(eqfd, sp!, {r4, r5, r6, pc}) + ldmeqfd sp!, {r4, r5, r6, pc} .Lno_insw_8: tst r2, #4 beq .Lno_insw_4 @@ -102,6 +102,6 @@ ENTRY(__raw_readsw) movne r3, r3, lsr #8 strneb r3, [r1] - LOADREGS(fd, sp!, {r4, r5, r6, pc}) + ldmfd sp!, {r4, r5, r6, pc} diff --git a/arch/arm/lib/io-writesb.S b/arch/arm/lib/io-writesb.S index 08209fc64..7eba2b6cc 100644 --- a/arch/arm/lib/io-writesb.S +++ b/arch/arm/lib/io-writesb.S @@ -64,7 +64,7 @@ ENTRY(__raw_writesb) bpl .Loutsb_16_lp tst r2, #15 - LOADREGS(eqfd, sp!, {r4, r5, pc}) + ldmeqfd sp!, {r4, r5, pc} .Loutsb_no_16: tst r2, #8 beq .Loutsb_no_8 @@ -80,7 +80,7 @@ ENTRY(__raw_writesb) outword r3 .Loutsb_no_4: ands r2, r2, #3 - LOADREGS(eqfd, sp!, {r4, r5, pc}) + ldmeqfd sp!, {r4, r5, pc} cmp r2, #2 ldrb r3, [r1], #1 @@ -90,4 +90,4 @@ ENTRY(__raw_writesb) ldrgtb r3, [r1] strgtb r3, [r0] - LOADREGS(fd, sp!, {r4, r5, pc}) + ldmfd sp!, {r4, r5, pc} diff --git a/arch/arm/lib/io-writesw-armv3.S b/arch/arm/lib/io-writesw-armv3.S index 52d62b481..1607a29f4 100644 --- a/arch/arm/lib/io-writesw-armv3.S +++ b/arch/arm/lib/io-writesw-armv3.S @@ -29,7 +29,7 @@ orr r3, r3, r3, lsl #16 str r3, [r0] subs r2, r2, #1 - RETINSTR(moveq, pc, lr) + moveq pc, lr ENTRY(__raw_writesw) teq r2, #0 @ do we have to check for the zero len? @@ -80,7 +80,7 @@ ENTRY(__raw_writesw) bpl .Loutsw_8_lp tst r2, #7 - LOADREGS(eqfd, sp!, {r4, r5, r6, pc}) + ldmeqfd sp!, {r4, r5, r6, pc} .Lno_outsw_8: tst r2, #4 beq .Lno_outsw_4 @@ -124,4 +124,4 @@ ENTRY(__raw_writesw) orrne ip, ip, ip, lsr #16 strne ip, [r0] - LOADREGS(fd, sp!, {r4, r5, r6, pc}) + ldmfd sp!, {r4, r5, r6, pc} diff --git a/arch/arm/lib/memchr.S b/arch/arm/lib/memchr.S index ac34fe55d..e7ab1ea8e 100644 --- a/arch/arm/lib/memchr.S +++ b/arch/arm/lib/memchr.S @@ -22,4 +22,4 @@ ENTRY(memchr) bne 1b sub r0, r0, #1 2: movne r0, #0 - RETINSTR(mov,pc,lr) + mov pc, lr diff --git a/arch/arm/lib/memset.S b/arch/arm/lib/memset.S index a1795f599..95b110b07 100644 --- a/arch/arm/lib/memset.S +++ b/arch/arm/lib/memset.S @@ -53,7 +53,7 @@ ENTRY(memset) stmgeia r0!, {r1, r3, ip, lr} stmgeia r0!, {r1, r3, ip, lr} bgt 2b - LOADREGS(eqfd, sp!, {pc}) @ Now <64 bytes to go. + ldmeqfd sp!, {pc} @ Now <64 bytes to go. /* * No need to correct the count; we're only testing bits from now on */ @@ -77,4 +77,4 @@ ENTRY(memset) strneb r1, [r0], #1 tst r2, #1 strneb r1, [r0], #1 - RETINSTR(mov,pc,lr) + mov pc, lr diff --git a/arch/arm/lib/memzero.S b/arch/arm/lib/memzero.S index 51ccc6016..abf2508e8 100644 --- a/arch/arm/lib/memzero.S +++ b/arch/arm/lib/memzero.S @@ -53,7 +53,7 @@ ENTRY(__memzero) stmgeia r0!, {r2, r3, ip, lr} @ 4 stmgeia r0!, {r2, r3, ip, lr} @ 4 bgt 3b @ 1 - LOADREGS(eqfd, sp!, {pc}) @ 1/2 quick exit + ldmeqfd sp!, {pc} @ 1/2 quick exit /* * No need to correct the count; we're only testing bits from now on */ @@ -77,4 +77,4 @@ ENTRY(__memzero) strneb r2, [r0], #1 @ 1 tst r1, #1 @ 1 a byte left over strneb r2, [r0], #1 @ 1 - RETINSTR(mov,pc,lr) @ 1 + mov pc, lr @ 1 diff --git a/arch/arm/lib/strchr.S b/arch/arm/lib/strchr.S index 5b9b49373..9f18d6fde 100644 --- a/arch/arm/lib/strchr.S +++ b/arch/arm/lib/strchr.S @@ -23,4 +23,4 @@ ENTRY(strchr) teq r2, r1 movne r0, #0 subeq r0, r0, #1 - RETINSTR(mov,pc,lr) + mov pc, lr diff --git a/arch/arm/lib/strncpy_from_user.S b/arch/arm/lib/strncpy_from_user.S index 629cc8775..36e3741a3 100644 --- a/arch/arm/lib/strncpy_from_user.S +++ b/arch/arm/lib/strncpy_from_user.S @@ -20,8 +20,7 @@ * returns the number of characters copied (strlen of copied string), * -EFAULT on exception, or "len" if we fill the whole buffer */ -ENTRY(__arch_strncpy_from_user) - save_lr +ENTRY(__strncpy_from_user) mov ip, r1 1: subs r2, r2, #1 USER( ldrplbt r3, [r1], #1) @@ -31,13 +30,13 @@ USER( ldrplbt r3, [r1], #1) bne 1b sub r1, r1, #1 @ take NUL character out of count 2: sub r0, r1, ip - restore_pc + mov pc, lr .section .fixup,"ax" .align 0 9001: mov r3, #0 strb r3, [r0, #0] @ null terminate mov r0, #-EFAULT - restore_pc + mov pc, lr .previous diff --git a/arch/arm/lib/strnlen_user.S b/arch/arm/lib/strnlen_user.S index 67bcd8268..18d8fa4f9 100644 --- a/arch/arm/lib/strnlen_user.S +++ b/arch/arm/lib/strnlen_user.S @@ -14,14 +14,13 @@ .text .align 5 -/* Prototype: unsigned long __arch_strnlen_user(const char *str, long n) +/* Prototype: unsigned long __strnlen_user(const char *str, long n) * Purpose : get length of a string in user memory * Params : str - address of string in user memory * Returns : length of string *including terminator* * or zero on exception, or n + 1 if too long */ -ENTRY(__arch_strnlen_user) - save_lr +ENTRY(__strnlen_user) mov r2, r0 1: USER( ldrbt r3, [r0], #1) @@ -31,10 +30,10 @@ USER( ldrbt r3, [r0], #1) bne 1b add r0, r0, #1 2: sub r0, r0, r2 - restore_pc + mov pc, lr .section .fixup,"ax" .align 0 9001: mov r0, #0 - restore_pc + mov pc, lr .previous diff --git a/arch/arm/lib/strrchr.S b/arch/arm/lib/strrchr.S index fa923f026..538df220a 100644 --- a/arch/arm/lib/strrchr.S +++ b/arch/arm/lib/strrchr.S @@ -22,4 +22,4 @@ ENTRY(strrchr) teq r2, #0 bne 1b mov r0, r3 - RETINSTR(mov,pc,lr) + mov pc, lr diff --git a/arch/arm/lib/uaccess.S b/arch/arm/lib/uaccess.S index 0cc450f86..b48bd6d5f 100644 --- a/arch/arm/lib/uaccess.S +++ b/arch/arm/lib/uaccess.S @@ -19,7 +19,7 @@ #define PAGE_SHIFT 12 -/* Prototype: int __arch_copy_to_user(void *to, const char *from, size_t n) +/* Prototype: int __copy_to_user(void *to, const char *from, size_t n) * Purpose : copy a block to user memory from kernel memory * Params : to - user memory * : from - kernel memory @@ -39,7 +39,7 @@ USER( strgtbt r3, [r0], #1) @ May fault sub r2, r2, ip b .Lc2u_dest_aligned -ENTRY(__arch_copy_to_user) +ENTRY(__copy_to_user) stmfd sp!, {r2, r4 - r7, lr} cmp r2, #4 blt .Lc2u_not_enough @@ -105,7 +105,7 @@ USER( strgtbt r3, [r0], #1) @ May fault movs ip, r2 bne .Lc2u_nowords .Lc2u_finished: mov r0, #0 - LOADREGS(fd,sp!,{r2, r4 - r7, pc}) + ldmfd sp!, {r2, r4 - r7, pc} .Lc2u_src_not_aligned: bic r1, r1, #3 @@ -280,10 +280,10 @@ USER( strgtbt r3, [r0], #1) @ May fault .section .fixup,"ax" .align 0 -9001: LOADREGS(fd,sp!, {r0, r4 - r7, pc}) +9001: ldmfd sp!, {r0, r4 - r7, pc} .previous -/* Prototype: unsigned long __arch_copy_from_user(void *to,const void *from,unsigned long n); +/* Prototype: unsigned long __copy_from_user(void *to,const void *from,unsigned long n); * Purpose : copy a block from user memory to kernel memory * Params : to - kernel memory * : from - user memory @@ -302,7 +302,7 @@ USER( ldrgtbt r3, [r1], #1) @ May fault sub r2, r2, ip b .Lcfu_dest_aligned -ENTRY(__arch_copy_from_user) +ENTRY(__copy_from_user) stmfd sp!, {r0, r2, r4 - r7, lr} cmp r2, #4 blt .Lcfu_not_enough @@ -369,7 +369,7 @@ USER( ldrgtbt r3, [r1], #1) @ May fault bne .Lcfu_nowords .Lcfu_finished: mov r0, #0 add sp, sp, #8 - LOADREGS(fd,sp!,{r4 - r7, pc}) + ldmfd sp!, {r4 - r7, pc} .Lcfu_src_not_aligned: bic r1, r1, #3 @@ -556,6 +556,6 @@ USER( ldrgtbt r3, [r1], #1) @ May fault movne r1, r4 blne __memzero mov r0, r4 - LOADREGS(fd,sp!, {r4 - r7, pc}) + ldmfd sp!, {r4 - r7, pc} .previous diff --git a/arch/arm/lib/ucmpdi2.S b/arch/arm/lib/ucmpdi2.S index d847a6283..f76de07ac 100644 --- a/arch/arm/lib/ucmpdi2.S +++ b/arch/arm/lib/ucmpdi2.S @@ -10,7 +10,6 @@ * published by the Free Software Foundation. */ -#include #include #ifdef __ARMEB__ diff --git a/arch/arm/mach-aaec2000/core.c b/arch/arm/mach-aaec2000/core.c index 65be5efd6..baa997c85 100644 --- a/arch/arm/mach-aaec2000/core.c +++ b/arch/arm/mach-aaec2000/core.c @@ -9,7 +9,6 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ -#include #include #include #include @@ -143,7 +142,7 @@ aaec2000_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) static struct irqaction aaec2000_timer_irq = { .name = "AAEC-2000 Timer Tick", - .flags = SA_INTERRUPT | SA_TIMER, + .flags = IRQF_DISABLED | IRQF_TIMER, .handler = aaec2000_timer_interrupt, }; diff --git a/arch/arm/mach-at91rm9200/Kconfig b/arch/arm/mach-at91rm9200/Kconfig index 4b7218fc3..2f85e8693 100644 --- a/arch/arm/mach-at91rm9200/Kconfig +++ b/arch/arm/mach-at91rm9200/Kconfig @@ -1,47 +1,109 @@ -if ARCH_AT91RM9200 +if ARCH_AT91 + +menu "Atmel AT91 System-on-Chip" + +comment "Atmel AT91 Processors" + +config ARCH_AT91RM9200 + bool "AT91RM9200" -menu "AT91RM9200 Implementations" +config ARCH_AT91SAM9260 + bool "AT91SAM9260" + +config ARCH_AT91SAM9261 + bool "AT91SAM9261" + +# ---------------------------------------------------------- + +if ARCH_AT91RM9200 comment "AT91RM9200 Board Type" +config MACH_ONEARM + bool "Ajeco 1ARM Single Board Computer" + depends on ARCH_AT91RM9200 + help + Select this if you are using Ajeco's 1ARM Single Board Computer. + + config ARCH_AT91RM9200DK bool "Atmel AT91RM9200-DK Development board" depends on ARCH_AT91RM9200 help - Select this if you are using Atmel's AT91RM9200-DK Development board + Select this if you are using Atmel's AT91RM9200-DK Development board. + (Discontinued) + config MACH_AT91RM9200EK bool "Atmel AT91RM9200-EK Evaluation Kit" depends on ARCH_AT91RM9200 help - Select this if you are using Atmel's AT91RM9200-EK Evaluation Kit + Select this if you are using Atmel's AT91RM9200-EK Evaluation Kit. + config MACH_CSB337 - bool "Cogent CSB337 board" + bool "Cogent CSB337" depends on ARCH_AT91RM9200 help - Select this if you are using Cogent's CSB337 board + Select this if you are using Cogent's CSB337 board. + config MACH_CSB637 - bool "Cogent CSB637 board" + bool "Cogent CSB637" depends on ARCH_AT91RM9200 help - Select this if you are using Cogent's CSB637 board + Select this if you are using Cogent's CSB637 board. + config MACH_CARMEVA - bool "Conitec's ARM&EVA" + bool "Conitec ARM&EVA" depends on ARCH_AT91RM9200 help - Select this if you are using Conitec's AT91RM9200-MCU-Module + Select this if you are using Conitec's AT91RM9200-MCU-Module. + + +config MACH_ATEB9200 + bool "Embest ATEB9200" + depends on ARCH_AT91RM9200 + help + Select this if you are using Embest's ATEB9200 board. + config MACH_KB9200 - bool "KwikByte's KB920x" + bool "KwikByte KB920x" depends on ARCH_AT91RM9200 help - Select this if you are using KwikByte's KB920x board + Select this if you are using KwikByte's KB920x board. + + +config MACH_KAFA + bool "Sperry-Sun KAFA board" + depends on ARCH_AT91RM9200 + help + Select this if you are using Sperry-Sun's KAFA board. + +endif + +# ---------------------------------------------------------- + +if ARCH_AT91SAM9260 + +comment "AT91SAM9260 Board Type" + +endif + +# ---------------------------------------------------------- + +if ARCH_AT91SAM9261 + +comment "AT91SAM9261 Board Type" + +endif + +# ---------------------------------------------------------- -comment "AT91RM9200 Feature Selections" +comment "AT91 Feature Selections" config AT91_PROGRAMMABLE_CLOCKS bool "Programmable Clocks" diff --git a/arch/arm/mach-at91rm9200/Makefile b/arch/arm/mach-at91rm9200/Makefile index ef88c4128..c174805c2 100644 --- a/arch/arm/mach-at91rm9200/Makefile +++ b/arch/arm/mach-at91rm9200/Makefile @@ -2,27 +2,46 @@ # Makefile for the linux kernel. # -obj-y := clock.o irq.o time.o gpio.o common.o devices.o +obj-y := clock.o irq.o gpio.o devices.o obj-m := obj-n := obj- := -# Board-specific support +obj-$(CONFIG_PM) += pm.o + +# CPU-specific support +obj-$(CONFIG_ARCH_AT91RM9200) += at91rm9200.o at91rm9200_time.o +obj-$(CONFIG_ARCH_AT91SAM9260) += +obj-$(CONFIG_ARCH_AT91SAM9261) += + +# AT91RM9200 Board-specific support +obj-$(CONFIG_MACH_ONEARM) += board-1arm.o obj-$(CONFIG_ARCH_AT91RM9200DK) += board-dk.o obj-$(CONFIG_MACH_AT91RM9200EK) += board-ek.o obj-$(CONFIG_MACH_CSB337) += board-csb337.o obj-$(CONFIG_MACH_CSB637) += board-csb637.o -#obj-$(CONFIG_MACH_CARMEVA) += board-carmeva.o -#obj-$(CONFIG_MACH_KB9200) += board-kb9202.o +obj-$(CONFIG_MACH_CARMEVA) += board-carmeva.o +obj-$(CONFIG_MACH_KB9200) += board-kb9202.o +obj-$(CONFIG_MACH_ATEB9200) += board-eb9200.o +obj-$(CONFIG_MACH_KAFA) += board-kafa.o + +# AT91SAM9260 board-specific support + +# AT91SAM9261 board-specific support # LEDs support led-$(CONFIG_ARCH_AT91RM9200DK) += leds.o led-$(CONFIG_MACH_AT91RM9200EK) += leds.o led-$(CONFIG_MACH_CSB337) += leds.o led-$(CONFIG_MACH_CSB637) += leds.o -#led-$(CONFIG_MACH_KB9200) += leds.o -#led-$(CONFIG_MACH_KAFA) += leds.o +led-$(CONFIG_MACH_KB9200) += leds.o +led-$(CONFIG_MACH_KAFA) += leds.o obj-$(CONFIG_LEDS) += $(led-y) # VGA support #obj-$(CONFIG_FB_S1D13XXX) += ics1523.o + + +ifeq ($(CONFIG_PM_DEBUG),y) +CFLAGS_pm.o += -DDEBUG +endif diff --git a/arch/arm/mach-at91rm9200/board-csb337.c b/arch/arm/mach-at91rm9200/board-csb337.c index f45104cee..794d3fbb4 100644 --- a/arch/arm/mach-at91rm9200/board-csb337.c +++ b/arch/arm/mach-at91rm9200/board-csb337.c @@ -18,12 +18,12 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include #include #include #include #include #include +#include #include #include @@ -34,9 +34,9 @@ #include #include -#include -#include +#include #include +#include #include "generic.h" @@ -54,32 +54,24 @@ static void __init csb337_init_irq(void) * 0 .. 3 = USART0 .. USART3 * 4 = DBGU */ -#define CSB337_UART_MAP { 4, 1, -1, -1, -1 } /* ttyS0, ..., ttyS4 */ -#define CSB337_SERIAL_CONSOLE 0 /* ttyS0 */ +static struct at91_uart_config __initdata csb337_uart_config = { + .console_tty = 0, /* ttyS0 */ + .nr_tty = 2, + .tty_map = { 4, 1, -1, -1, -1 } /* ttyS0, ..., ttyS4 */ +}; static void __init csb337_map_io(void) { - int serial[AT91_NR_UART] = CSB337_UART_MAP; - int i; - at91rm9200_map_io(); /* Initialize clocks: 3.6864 MHz crystal */ at91_clock_init(3686400); /* Setup the LEDs */ - at91_init_leds(AT91_PIN_PB2, AT91_PIN_PB2); - -#ifdef CONFIG_SERIAL_AT91 - at91_console_port = CSB337_SERIAL_CONSOLE; - memcpy(at91_serial_map, serial, sizeof(serial)); - - /* Register UARTs */ - for (i = 0; i < AT91_NR_UART; i++) { - if (serial[i] >= 0) - at91_register_uart(i, serial[i]); - } -#endif + at91_init_leds(AT91_PIN_PB0, AT91_PIN_PB1); + + /* Setup the serial ports and console */ + at91_init_serial(&csb337_uart_config); } static struct at91_eth_data __initdata csb337_eth_data = { @@ -118,17 +110,31 @@ static struct at91_mmc_data __initdata csb337_mmc_data = { .wp_pin = AT91_PIN_PD6, }; +static struct spi_board_info csb337_spi_devices[] = { + { /* CAN controller */ + .modalias = "sak82c900", + .chip_select = 0, + .max_speed_hz = 6 * 1000 * 1000, + }, +}; + static void __init csb337_board_init(void) { + /* Serial */ + at91_add_device_serial(); /* Ethernet */ at91_add_device_eth(&csb337_eth_data); /* USB Host */ at91_add_device_usbh(&csb337_usbh_data); /* USB Device */ at91_add_device_udc(&csb337_udc_data); + /* I2C */ + at91_add_device_i2c(); /* Compact Flash */ at91_set_gpio_input(AT91_PIN_PB22, 1); /* IOIS16 */ at91_add_device_cf(&csb337_cf_data); + /* SPI */ + at91_add_device_spi(csb337_spi_devices, ARRAY_SIZE(csb337_spi_devices)); /* MMC */ at91_add_device_mmc(&csb337_mmc_data); } diff --git a/arch/arm/mach-at91rm9200/board-csb637.c b/arch/arm/mach-at91rm9200/board-csb637.c index f2c2d6e79..c8b6f3342 100644 --- a/arch/arm/mach-at91rm9200/board-csb637.c +++ b/arch/arm/mach-at91rm9200/board-csb637.c @@ -18,7 +18,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include #include #include #include @@ -34,9 +33,9 @@ #include #include -#include -#include +#include #include +#include #include "generic.h" @@ -54,14 +53,14 @@ static void __init csb637_init_irq(void) * 0 .. 3 = USART0 .. USART3 * 4 = DBGU */ -#define CSB637_UART_MAP { 4, 1, -1, -1, -1 } /* ttyS0, ..., ttyS4 */ -#define CSB637_SERIAL_CONSOLE 0 /* ttyS0 */ +static struct at91_uart_config __initdata csb637_uart_config = { + .console_tty = 0, /* ttyS0 */ + .nr_tty = 2, + .tty_map = { 4, 1, -1, -1, -1 } /* ttyS0, ..., ttyS4 */ +}; static void __init csb637_map_io(void) { - int serial[AT91_NR_UART] = CSB637_UART_MAP; - int i; - at91rm9200_map_io(); /* Initialize clocks: 3.6864 MHz crystal */ @@ -70,16 +69,8 @@ static void __init csb637_map_io(void) /* Setup the LEDs */ at91_init_leds(AT91_PIN_PB2, AT91_PIN_PB2); -#ifdef CONFIG_SERIAL_AT91 - at91_console_port = CSB637_SERIAL_CONSOLE; - memcpy(at91_serial_map, serial, sizeof(serial)); - - /* Register UARTs */ - for (i = 0; i < AT91_NR_UART; i++) { - if (serial[i] >= 0) - at91_register_uart(i, serial[i]); - } -#endif + /* Setup the serial ports and console */ + at91_init_serial(&csb637_uart_config); } static struct at91_eth_data __initdata csb637_eth_data = { @@ -98,12 +89,18 @@ static struct at91_udc_data __initdata csb637_udc_data = { static void __init csb637_board_init(void) { + /* Serial */ + at91_add_device_serial(); /* Ethernet */ at91_add_device_eth(&csb637_eth_data); /* USB Host */ at91_add_device_usbh(&csb637_usbh_data); /* USB Device */ at91_add_device_udc(&csb637_udc_data); + /* I2C */ + at91_add_device_i2c(); + /* SPI */ + at91_add_device_spi(NULL, 0); } MACHINE_START(CSB637, "Cogent CSB637") diff --git a/arch/arm/mach-at91rm9200/board-dk.c b/arch/arm/mach-at91rm9200/board-dk.c index 2d7200ed6..65873037e 100644 --- a/arch/arm/mach-at91rm9200/board-dk.c +++ b/arch/arm/mach-at91rm9200/board-dk.c @@ -21,12 +21,12 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include #include #include #include #include #include +#include #include #include @@ -37,9 +37,9 @@ #include #include -#include -#include +#include #include +#include #include "generic.h" @@ -57,14 +57,14 @@ static void __init dk_init_irq(void) * 0 .. 3 = USART0 .. USART3 * 4 = DBGU */ -#define DK_UART_MAP { 4, 1, -1, -1, -1 } /* ttyS0, ..., ttyS4 */ -#define DK_SERIAL_CONSOLE 0 /* ttyS0 */ +static struct at91_uart_config __initdata dk_uart_config = { + .console_tty = 0, /* ttyS0 */ + .nr_tty = 2, + .tty_map = { 4, 1, -1, -1, -1 } /* ttyS0, ..., ttyS4 */ +}; static void __init dk_map_io(void) { - int serial[AT91_NR_UART] = DK_UART_MAP; - int i; - at91rm9200_map_io(); /* Initialize clocks: 18.432 MHz crystal */ @@ -73,16 +73,8 @@ static void __init dk_map_io(void) /* Setup the LEDs */ at91_init_leds(AT91_PIN_PB2, AT91_PIN_PB2); -#ifdef CONFIG_SERIAL_AT91 - at91_console_port = DK_SERIAL_CONSOLE; - memcpy(at91_serial_map, serial, sizeof(serial)); - - /* Register UARTs */ - for (i = 0; i < AT91_NR_UART; i++) { - if (at91_serial_map[i] >= 0) - at91_register_uart(i, at91_serial_map[i]); - } -#endif + /* Setup the serial ports and console */ + at91_init_serial(&dk_uart_config); } static struct at91_eth_data __initdata dk_eth_data = { @@ -111,16 +103,48 @@ static struct at91_mmc_data __initdata dk_mmc_data = { .wire4 = 1, }; +static struct spi_board_info dk_spi_devices[] = { + { /* DataFlash chip */ + .modalias = "mtd_dataflash", + .chip_select = 0, + .max_speed_hz = 15 * 1000 * 1000, + }, + { /* UR6HCPS2-SP40 PS2-to-SPI adapter */ + .modalias = "ur6hcps2", + .chip_select = 1, + .max_speed_hz = 250 * 1000, + }, + { /* TLV1504 ADC, 4 channels, 10 bits; one is a temp sensor */ + .modalias = "tlv1504", + .chip_select = 2, + .max_speed_hz = 20 * 1000 * 1000, + }, +#ifdef CONFIG_MTD_AT91_DATAFLASH_CARD + { /* DataFlash card */ + .modalias = "mtd_dataflash", + .chip_select = 3, + .max_speed_hz = 15 * 1000 * 1000, + } +#endif +}; + static void __init dk_board_init(void) { + /* Serial */ + at91_add_device_serial(); /* Ethernet */ at91_add_device_eth(&dk_eth_data); /* USB Host */ at91_add_device_usbh(&dk_usbh_data); /* USB Device */ at91_add_device_udc(&dk_udc_data); + at91_set_multi_drive(dk_udc_data.pullup_pin, 1); /* pullup_pin is connected to reset */ /* Compact Flash */ at91_add_device_cf(&dk_cf_data); + /* I2C */ + at91_add_device_i2c(); + /* SPI */ + at91_add_device_spi(dk_spi_devices, ARRAY_SIZE(dk_spi_devices)); #ifdef CONFIG_MTD_AT91_DATAFLASH_CARD /* DataFlash card */ at91_set_gpio_output(AT91_PIN_PB7, 0); diff --git a/arch/arm/mach-at91rm9200/board-ek.c b/arch/arm/mach-at91rm9200/board-ek.c index 80d90f513..868192351 100644 --- a/arch/arm/mach-at91rm9200/board-ek.c +++ b/arch/arm/mach-at91rm9200/board-ek.c @@ -21,12 +21,12 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include #include #include #include #include #include +#include #include #include @@ -37,9 +37,9 @@ #include #include -#include -#include +#include #include +#include #include "generic.h" @@ -57,14 +57,14 @@ static void __init ek_init_irq(void) * 0 .. 3 = USART0 .. USART3 * 4 = DBGU */ -#define EK_UART_MAP { 4, 1, -1, -1, -1 } /* ttyS0, ..., ttyS4 */ -#define EK_SERIAL_CONSOLE 0 /* ttyS0 */ +static struct at91_uart_config __initdata ek_uart_config = { + .console_tty = 0, /* ttyS0 */ + .nr_tty = 2, + .tty_map = { 4, 1, -1, -1, -1 } /* ttyS0, ..., ttyS4 */ +}; static void __init ek_map_io(void) { - int serial[AT91_NR_UART] = EK_UART_MAP; - int i; - at91rm9200_map_io(); /* Initialize clocks: 18.432 MHz crystal */ @@ -73,16 +73,8 @@ static void __init ek_map_io(void) /* Setup the LEDs */ at91_init_leds(AT91_PIN_PB1, AT91_PIN_PB2); -#ifdef CONFIG_SERIAL_AT91 - at91_console_port = EK_SERIAL_CONSOLE; - memcpy(at91_serial_map, serial, sizeof(serial)); - - /* Register UARTs */ - for (i = 0; i < AT91_NR_UART; i++) { - if (serial[i] >= 0) - at91_register_uart(i, serial[i]); - } -#endif + /* Setup the serial ports and console */ + at91_init_serial(&ek_uart_config); } static struct at91_eth_data __initdata ek_eth_data = { @@ -106,14 +98,36 @@ static struct at91_mmc_data __initdata ek_mmc_data = { .wp_pin = AT91_PIN_PA17, }; +static struct spi_board_info ek_spi_devices[] = { + { /* DataFlash chip */ + .modalias = "mtd_dataflash", + .chip_select = 0, + .max_speed_hz = 15 * 1000 * 1000, + }, +#ifdef CONFIG_MTD_AT91_DATAFLASH_CARD + { /* DataFlash card */ + .modalias = "mtd_dataflash", + .chip_select = 3, + .max_speed_hz = 15 * 1000 * 1000, + }, +#endif +}; + static void __init ek_board_init(void) { + /* Serial */ + at91_add_device_serial(); /* Ethernet */ at91_add_device_eth(&ek_eth_data); /* USB Host */ at91_add_device_usbh(&ek_usbh_data); /* USB Device */ at91_add_device_udc(&ek_udc_data); + at91_set_multi_drive(ek_udc_data.pullup_pin, 1); /* pullup_pin is connected to reset */ + /* I2C */ + at91_add_device_i2c(); + /* SPI */ + at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices)); #ifdef CONFIG_MTD_AT91_DATAFLASH_CARD /* DataFlash card */ at91_set_gpio_output(AT91_PIN_PB22, 0); diff --git a/arch/arm/mach-at91rm9200/clock.c b/arch/arm/mach-at91rm9200/clock.c index 8b95467c6..edc2cc837 100644 --- a/arch/arm/mach-at91rm9200/clock.c +++ b/arch/arm/mach-at91rm9200/clock.c @@ -27,12 +27,10 @@ #include #include -#include -#include /* for master clock global */ +#include #include "generic.h" -#undef DEBUG /* * There's a lot more which can be done with clocks, including cpufreq @@ -41,7 +39,9 @@ */ struct clk { - const char *name; + const char *name; /* unique clock name */ + const char *function; /* function of the clock */ + struct device *dev; /* device associated with function */ unsigned long rate_hz; struct clk *parent; u32 pmc_mask; @@ -71,15 +71,14 @@ static struct clk clk32k = { }; static struct clk main_clk = { .name = "main", - .pmc_mask = 1 << 0, /* in PMC_SR */ - .users = 1, + .pmc_mask = AT91_PMC_MOSCS, /* in PMC_SR */ .id = 1, .primary = 1, }; static struct clk plla = { .name = "plla", .parent = &main_clk, - .pmc_mask = 1 << 1, /* in PMC_SR */ + .pmc_mask = AT91_PMC_LOCKA, /* in PMC_SR */ .id = 2, .primary = 1, .pll = 1, @@ -105,7 +104,7 @@ static void pllb_mode(struct clk *clk, int is_on) static struct clk pllb = { .name = "pllb", .parent = &main_clk, - .pmc_mask = 1 << 2, /* in PMC_SR */ + .pmc_mask = AT91_PMC_LOCKB, /* in PMC_SR */ .mode = pllb_mode, .id = 3, .primary = 1, @@ -177,8 +176,7 @@ static struct clk pck3 = { */ static struct clk mck = { .name = "mck", - .pmc_mask = 1 << 3, /* in PMC_SR */ - .users = 1, /* (must be) always on */ + .pmc_mask = AT91_PMC_MCKRDY, /* in PMC_SR */ }; static void pmc_periph_mode(struct clk *clk, int is_on) @@ -249,6 +247,30 @@ static struct clk spi_clk = { .pmc_mask = 1 << AT91_ID_SPI, .mode = pmc_periph_mode, }; +static struct clk pioA_clk = { + .name = "pioA_clk", + .parent = &mck, + .pmc_mask = 1 << AT91_ID_PIOA, + .mode = pmc_periph_mode, +}; +static struct clk pioB_clk = { + .name = "pioB_clk", + .parent = &mck, + .pmc_mask = 1 << AT91_ID_PIOB, + .mode = pmc_periph_mode, +}; +static struct clk pioC_clk = { + .name = "pioC_clk", + .parent = &mck, + .pmc_mask = 1 << AT91_ID_PIOC, + .mode = pmc_periph_mode, +}; +static struct clk pioD_clk = { + .name = "pioD_clk", + .parent = &mck, + .pmc_mask = 1 << AT91_ID_PIOD, + .mode = pmc_periph_mode, +}; static struct clk *const clock_list[] = { /* four primary clocks -- MUST BE FIRST! */ @@ -279,21 +301,46 @@ static struct clk *const clock_list[] = { &udc_clk, &twi_clk, &spi_clk, + &pioA_clk, + &pioB_clk, + &pioC_clk, + &pioD_clk, // ssc0..ssc2 // tc0..tc5 + // irq0..irq6 &ohci_clk, ðer_clk, }; +/* + * Associate a particular clock with a function (eg, "uart") and device. + * The drivers can then request the same 'function' with several different + * devices and not care about which clock name to use. + */ +void __init at91_clock_associate(const char *id, struct device *dev, const char *func) +{ + struct clk *clk = clk_get(NULL, id); + + if (!dev || !clk || !IS_ERR(clk_get(dev, func))) + return; + + clk->function = func; + clk->dev = dev; +} + /* clocks are all static for now; no refcounting necessary */ struct clk *clk_get(struct device *dev, const char *id) { int i; for (i = 0; i < ARRAY_SIZE(clock_list); i++) { - if (strcmp(id, clock_list[i]->name) == 0) - return clock_list[i]; + struct clk *clk = clock_list[i]; + + if (strcmp(id, clk->name) == 0) + return clk; + if (clk->function && (dev == clk->dev) && strcmp(id, clk->function) == 0) + return clk; } return ERR_PTR(-ENOENT); @@ -593,6 +640,30 @@ fail: return 0; } + +/* + * Several unused clocks may be active. Turn them off. + */ +static void at91_periphclk_reset(void) +{ + unsigned long reg; + int i; + + reg = at91_sys_read(AT91_PMC_PCSR); + + for (i = 0; i < ARRAY_SIZE(clock_list); i++) { + struct clk *clk = clock_list[i]; + + if (clk->mode != pmc_periph_mode) + continue; + + if (clk->users > 0) + reg &= ~clk->pmc_mask; + } + + at91_sys_write(AT91_PMC_PCDR, reg); +} + int __init at91_clock_init(unsigned long main_clock) { unsigned tmp, freq, mckr; @@ -626,7 +697,6 @@ int __init at91_clock_init(unsigned long main_clock) */ at91_pllb_usb_init = at91_pll_calc(main_clock, 48000000 * 2) | AT91_PMC_USB96M; pllb.rate_hz = at91_pll_rate(&pllb, main_clock, at91_pllb_usb_init); - at91_sys_write(AT91_PMC_PCDR, (1 << AT91_ID_UHP) | (1 << AT91_ID_UDP)); at91_sys_write(AT91_PMC_SCDR, AT91_PMC_UHP | AT91_PMC_UDP); at91_sys_write(AT91_CKGR_PLLBR, 0); at91_sys_write(AT91_PMC_SCER, AT91_PMC_MCKUDP); @@ -640,19 +710,18 @@ int __init at91_clock_init(unsigned long main_clock) */ mckr = at91_sys_read(AT91_PMC_MCKR); mck.parent = clock_list[mckr & AT91_PMC_CSS]; - mck.parent->users++; freq = mck.parent->rate_hz; freq /= (1 << ((mckr >> 2) & 3)); /* prescale */ mck.rate_hz = freq / (1 + ((mckr >> 8) & 3)); /* mdiv */ + /* MCK and CPU clock are "always on" */ + clk_enable(&mck); + printk("Clocks: CPU %u MHz, master %u MHz, main %u.%03u MHz\n", freq / 1000000, (unsigned) mck.rate_hz / 1000000, (unsigned) main_clock / 1000000, ((unsigned) main_clock % 1000000) / 1000); - /* FIXME get rid of master_clock global */ - at91_master_clock = mck.rate_hz; - #ifdef CONFIG_AT91_PROGRAMMABLE_CLOCKS /* establish PCK0..PCK3 parentage */ for (tmp = 0; tmp < ARRAY_SIZE(clock_list); tmp++) { @@ -663,19 +732,28 @@ int __init at91_clock_init(unsigned long main_clock) continue; pckr = at91_sys_read(AT91_PMC_PCKR(clk->id)); - parent = clock_list[pckr & 3]; + parent = clock_list[pckr & AT91_PMC_CSS]; clk->parent = parent; clk->rate_hz = parent->rate_hz / (1 << ((pckr >> 2) & 3)); + + if (clk->users == 0) { + /* not being used, so switch it off */ + at91_sys_write(AT91_PMC_SCDR, clk->pmc_mask); + } } #else - /* disable unused clocks */ + /* disable all programmable clocks */ at91_sys_write(AT91_PMC_SCDR, AT91_PMC_PCK0 | AT91_PMC_PCK1 | AT91_PMC_PCK2 | AT91_PMC_PCK3); -#endif /* CONFIG_AT91_PROGRAMMABLE_CLOCKS */ +#endif - /* FIXME several unused clocks may still be active... provide - * a CONFIG option to turn off all unused clocks at some point - * before driver init starts. - */ + /* enable the PIO clocks */ + clk_enable(&pioA_clk); + clk_enable(&pioB_clk); + clk_enable(&pioC_clk); + clk_enable(&pioD_clk); + + /* disable all other unused peripheral clocks */ + at91_periphclk_reset(); return 0; } diff --git a/arch/arm/mach-at91rm9200/common.c b/arch/arm/mach-at91rm9200/common.c deleted file mode 100644 index 3848fd2d5..000000000 --- a/arch/arm/mach-at91rm9200/common.c +++ /dev/null @@ -1,115 +0,0 @@ -/* - * arch/arm/mach-at91rm9200/common.c - * - * Copyright (C) 2005 SAN People - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - */ - -#include -#include - -#include -#include - -#include - -static struct map_desc at91rm9200_io_desc[] __initdata = { - { - .virtual = AT91_VA_BASE_SYS, - .pfn = __phys_to_pfn(AT91_BASE_SYS), - .length = SZ_4K, - .type = MT_DEVICE, - }, { - .virtual = AT91_VA_BASE_SPI, - .pfn = __phys_to_pfn(AT91_BASE_SPI), - .length = SZ_16K, - .type = MT_DEVICE, - }, { - .virtual = AT91_VA_BASE_SSC2, - .pfn = __phys_to_pfn(AT91_BASE_SSC2), - .length = SZ_16K, - .type = MT_DEVICE, - }, { - .virtual = AT91_VA_BASE_SSC1, - .pfn = __phys_to_pfn(AT91_BASE_SSC1), - .length = SZ_16K, - .type = MT_DEVICE, - }, { - .virtual = AT91_VA_BASE_SSC0, - .pfn = __phys_to_pfn(AT91_BASE_SSC0), - .length = SZ_16K, - .type = MT_DEVICE, - }, { - .virtual = AT91_VA_BASE_US3, - .pfn = __phys_to_pfn(AT91_BASE_US3), - .length = SZ_16K, - .type = MT_DEVICE, - }, { - .virtual = AT91_VA_BASE_US2, - .pfn = __phys_to_pfn(AT91_BASE_US2), - .length = SZ_16K, - .type = MT_DEVICE, - }, { - .virtual = AT91_VA_BASE_US1, - .pfn = __phys_to_pfn(AT91_BASE_US1), - .length = SZ_16K, - .type = MT_DEVICE, - }, { - .virtual = AT91_VA_BASE_US0, - .pfn = __phys_to_pfn(AT91_BASE_US0), - .length = SZ_16K, - .type = MT_DEVICE, - }, { - .virtual = AT91_VA_BASE_EMAC, - .pfn = __phys_to_pfn(AT91_BASE_EMAC), - .length = SZ_16K, - .type = MT_DEVICE, - }, { - .virtual = AT91_VA_BASE_TWI, - .pfn = __phys_to_pfn(AT91_BASE_TWI), - .length = SZ_16K, - .type = MT_DEVICE, - }, { - .virtual = AT91_VA_BASE_MCI, - .pfn = __phys_to_pfn(AT91_BASE_MCI), - .length = SZ_16K, - .type = MT_DEVICE, - }, { - .virtual = AT91_VA_BASE_UDP, - .pfn = __phys_to_pfn(AT91_BASE_UDP), - .length = SZ_16K, - .type = MT_DEVICE, - }, { - .virtual = AT91_VA_BASE_TCB1, - .pfn = __phys_to_pfn(AT91_BASE_TCB1), - .length = SZ_16K, - .type = MT_DEVICE, - }, { - .virtual = AT91_VA_BASE_TCB0, - .pfn = __phys_to_pfn(AT91_BASE_TCB0), - .length = SZ_16K, - .type = MT_DEVICE, - }, -}; - -void __init at91rm9200_map_io(void) -{ - iotable_init(at91rm9200_io_desc, ARRAY_SIZE(at91rm9200_io_desc)); -} - - -unsigned long at91_master_clock; - -EXPORT_SYMBOL(at91_master_clock); - - -int at91_serial_map[AT91_NR_UART]; -int at91_console_port; - -EXPORT_SYMBOL(at91_serial_map); -EXPORT_SYMBOL(at91_console_port); diff --git a/arch/arm/mach-at91rm9200/devices.c b/arch/arm/mach-at91rm9200/devices.c index bfe47bd6e..4352acb88 100644 --- a/arch/arm/mach-at91rm9200/devices.c +++ b/arch/arm/mach-at91rm9200/devices.c @@ -13,12 +13,17 @@ #include #include -#include #include +#include #include -#include +#include +#include "generic.h" + +#define SZ_512 0x00000200 +#define SZ_256 0x00000100 +#define SZ_16 0x00000010 /* -------------------------------------------------------------------- * USB Host @@ -28,7 +33,7 @@ static u64 ohci_dmamask = 0xffffffffUL; static struct at91_usbh_data usbh_data; -static struct resource at91_usbh_resource[] = { +static struct resource at91_usbh_resources[] = { [0] = { .start = AT91_UHP_BASE, .end = AT91_UHP_BASE + SZ_1M - 1, @@ -42,15 +47,15 @@ static struct resource at91_usbh_resource[] = { }; static struct platform_device at91rm9200_usbh_device = { - .name = "at91rm9200-ohci", + .name = "at91_ohci", .id = -1, .dev = { .dma_mask = &ohci_dmamask, .coherent_dma_mask = 0xffffffff, .platform_data = &usbh_data, }, - .resource = at91_usbh_resource, - .num_resources = ARRAY_SIZE(at91_usbh_resource), + .resource = at91_usbh_resources, + .num_resources = ARRAY_SIZE(at91_usbh_resources), }; void __init at91_add_device_usbh(struct at91_usbh_data *data) @@ -74,11 +79,16 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) {} static struct at91_udc_data udc_data; static struct resource at91_udc_resources[] = { - { + [0] = { .start = AT91_BASE_UDP, .end = AT91_BASE_UDP + SZ_16K - 1, .flags = IORESOURCE_MEM, - } + }, + [1] = { + .start = AT91_ID_UDP, + .end = AT91_ID_UDP, + .flags = IORESOURCE_IRQ, + }, }; static struct platform_device at91rm9200_udc_device = { @@ -100,10 +110,8 @@ void __init at91_add_device_udc(struct at91_udc_data *data) at91_set_gpio_input(data->vbus_pin, 0); at91_set_deglitch(data->vbus_pin, 1); } - if (data->pullup_pin) { + if (data->pullup_pin) at91_set_gpio_output(data->pullup_pin, 0); - at91_set_multi_drive(data->pullup_pin, 1); - } udc_data = *data; platform_device_register(&at91rm9200_udc_device); @@ -197,7 +205,7 @@ static struct at91_cf_data cf_data; static struct resource at91_cf_resources[] = { [0] = { .start = AT91_CF_BASE, - /* ties up CS4, CS5, and CS6 */ + /* ties up CS4, CS5 and CS6 */ .end = AT91_CF_BASE + (0x30000000 - 1), .flags = IORESOURCE_MEM | IORESOURCE_MEM_8AND16BIT, }, @@ -231,6 +239,12 @@ void __init at91_add_device_cf(struct at91_cf_data *data) at91_set_gpio_output(data->vcc_pin, 0); at91_set_gpio_output(data->rst_pin, 0); + /* force poweron defaults for these pins ... */ + at91_set_A_periph(AT91_PIN_PC9, 0); /* A25/CFRNW */ + at91_set_A_periph(AT91_PIN_PC10, 0); /* NCS4/CFCS */ + at91_set_A_periph(AT91_PIN_PC11, 0); /* NCS5/CFCE1 */ + at91_set_A_periph(AT91_PIN_PC12, 0); /* NCS6/CFCE2 */ + cf_data = *data; platform_device_register(&at91rm9200_cf_device); } @@ -319,6 +333,7 @@ void __init at91_add_device_mmc(struct at91_mmc_data *data) void __init at91_add_device_mmc(struct at91_mmc_data *data) {} #endif + /* -------------------------------------------------------------------- * NAND / SmartMedia * -------------------------------------------------------------------- */ @@ -399,23 +414,111 @@ void __init at91_add_device_i2c(void) {} #endif +/* -------------------------------------------------------------------- + * SPI + * -------------------------------------------------------------------- */ + +#if defined(CONFIG_SPI_AT91) || defined(CONFIG_SPI_AT91_MODULE) || defined(CONFIG_AT91_SPI) || defined(CONFIG_AT91_SPI_MODULE) +static u64 spi_dmamask = 0xffffffffUL; + +static struct resource at91_spi_resources[] = { + [0] = { + .start = AT91_BASE_SPI, + .end = AT91_BASE_SPI + SZ_16K - 1, + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = AT91_ID_SPI, + .end = AT91_ID_SPI, + .flags = IORESOURCE_IRQ, + }, +}; + +static struct platform_device at91rm9200_spi_device = { + .name = "at91_spi", + .id = 0, + .dev = { + .dma_mask = &spi_dmamask, + .coherent_dma_mask = 0xffffffff, + }, + .resource = at91_spi_resources, + .num_resources = ARRAY_SIZE(at91_spi_resources), +}; + +static const unsigned at91_spi_standard_cs[4] = { AT91_PIN_PA3, AT91_PIN_PA4, AT91_PIN_PA5, AT91_PIN_PA6 }; + +void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) +{ + int i; + unsigned long cs_pin; + + at91_set_A_periph(AT91_PIN_PA0, 0); /* MISO */ + at91_set_A_periph(AT91_PIN_PA1, 0); /* MOSI */ + at91_set_A_periph(AT91_PIN_PA2, 0); /* SPCK */ + + /* Enable SPI chip-selects */ + for (i = 0; i < nr_devices; i++) { + if (devices[i].controller_data) + cs_pin = (unsigned long) devices[i].controller_data; + else + cs_pin = at91_spi_standard_cs[devices[i].chip_select]; + +#ifdef CONFIG_SPI_AT91_MANUAL_CS + at91_set_gpio_output(cs_pin, 1); +#else + at91_set_A_periph(cs_pin, 0); +#endif + + /* pass chip-select pin to driver */ + devices[i].controller_data = (void *) cs_pin; + } + + spi_register_board_info(devices, nr_devices); + at91_clock_associate("spi0_clk", &at91rm9200_spi_device.dev, "spi"); + platform_device_register(&at91rm9200_spi_device); +} +#else +void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) {} +#endif + + /* -------------------------------------------------------------------- * RTC * -------------------------------------------------------------------- */ -#if defined(CONFIG_AT91_RTC) || defined(CONFIG_AT91_RTC_MODULE) +#if defined(CONFIG_RTC_DRV_AT91) || defined(CONFIG_RTC_DRV_AT91_MODULE) static struct platform_device at91rm9200_rtc_device = { .name = "at91_rtc", .id = -1, .num_resources = 0, }; -void __init at91_add_device_rtc(void) +static void __init at91_add_device_rtc(void) { platform_device_register(&at91rm9200_rtc_device); } #else -void __init at91_add_device_rtc(void) {} +static void __init at91_add_device_rtc(void) {} +#endif + + +/* -------------------------------------------------------------------- + * Watchdog + * -------------------------------------------------------------------- */ + +#if defined(CONFIG_AT91_WATCHDOG) || defined(CONFIG_AT91_WATCHDOG_MODULE) +static struct platform_device at91rm9200_wdt_device = { + .name = "at91_wdt", + .id = -1, + .num_resources = 0, +}; + +static void __init at91_add_device_watchdog(void) +{ + platform_device_register(&at91rm9200_wdt_device); +} +#else +static void __init at91_add_device_watchdog(void) {} #endif @@ -429,13 +532,281 @@ u8 at91_leds_timer; void __init at91_init_leds(u8 cpu_led, u8 timer_led) { - at91_leds_cpu = cpu_led; - at91_leds_timer = timer_led; + at91_leds_cpu = cpu_led; + at91_leds_timer = timer_led; } - #else void __init at91_init_leds(u8 cpu_led, u8 timer_led) {} #endif +/* -------------------------------------------------------------------- + * UART + * -------------------------------------------------------------------- */ + +#if defined(CONFIG_SERIAL_AT91) +static struct resource dbgu_resources[] = { + [0] = { + .start = AT91_VA_BASE_SYS + AT91_DBGU, + .end = AT91_VA_BASE_SYS + AT91_DBGU + SZ_512 - 1, + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = AT91_ID_SYS, + .end = AT91_ID_SYS, + .flags = IORESOURCE_IRQ, + }, +}; + +static struct at91_uart_data dbgu_data = { + .use_dma_tx = 0, + .use_dma_rx = 0, /* DBGU not capable of receive DMA */ +}; + +static struct platform_device at91rm9200_dbgu_device = { + .name = "at91_usart", + .id = 0, + .dev = { + .platform_data = &dbgu_data, + .coherent_dma_mask = 0xffffffff, + }, + .resource = dbgu_resources, + .num_resources = ARRAY_SIZE(dbgu_resources), +}; + +static inline void configure_dbgu_pins(void) +{ + at91_set_A_periph(AT91_PIN_PA30, 0); /* DRXD */ + at91_set_A_periph(AT91_PIN_PA31, 1); /* DTXD */ +} + +static struct resource uart0_resources[] = { + [0] = { + .start = AT91_BASE_US0, + .end = AT91_BASE_US0 + SZ_16K - 1, + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = AT91_ID_US0, + .end = AT91_ID_US0, + .flags = IORESOURCE_IRQ, + }, +}; + +static struct at91_uart_data uart0_data = { + .use_dma_tx = 1, + .use_dma_rx = 1, +}; + +static struct platform_device at91rm9200_uart0_device = { + .name = "at91_usart", + .id = 1, + .dev = { + .platform_data = &uart0_data, + .coherent_dma_mask = 0xffffffff, + }, + .resource = uart0_resources, + .num_resources = ARRAY_SIZE(uart0_resources), +}; + +static inline void configure_usart0_pins(void) +{ + at91_set_A_periph(AT91_PIN_PA17, 1); /* TXD0 */ + at91_set_A_periph(AT91_PIN_PA18, 0); /* RXD0 */ + at91_set_A_periph(AT91_PIN_PA20, 0); /* CTS0 */ + + /* + * AT91RM9200 Errata #39 - RTS0 is not internally connected to PA21. + * We need to drive the pin manually. Default is off (RTS is active low). + */ + at91_set_gpio_output(AT91_PIN_PA21, 1); +} + +static struct resource uart1_resources[] = { + [0] = { + .start = AT91_BASE_US1, + .end = AT91_BASE_US1 + SZ_16K - 1, + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = AT91_ID_US1, + .end = AT91_ID_US1, + .flags = IORESOURCE_IRQ, + }, +}; + +static struct at91_uart_data uart1_data = { + .use_dma_tx = 1, + .use_dma_rx = 1, +}; + +static struct platform_device at91rm9200_uart1_device = { + .name = "at91_usart", + .id = 2, + .dev = { + .platform_data = &uart1_data, + .coherent_dma_mask = 0xffffffff, + }, + .resource = uart1_resources, + .num_resources = ARRAY_SIZE(uart1_resources), +}; + +static inline void configure_usart1_pins(void) +{ + at91_set_A_periph(AT91_PIN_PB18, 0); /* RI1 */ + at91_set_A_periph(AT91_PIN_PB19, 0); /* DTR1 */ + at91_set_A_periph(AT91_PIN_PB20, 1); /* TXD1 */ + at91_set_A_periph(AT91_PIN_PB21, 0); /* RXD1 */ + at91_set_A_periph(AT91_PIN_PB23, 0); /* DCD1 */ + at91_set_A_periph(AT91_PIN_PB24, 0); /* CTS1 */ + at91_set_A_periph(AT91_PIN_PB25, 0); /* DSR1 */ + at91_set_A_periph(AT91_PIN_PB26, 0); /* RTS1 */ +} + +static struct resource uart2_resources[] = { + [0] = { + .start = AT91_BASE_US2, + .end = AT91_BASE_US2 + SZ_16K - 1, + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = AT91_ID_US2, + .end = AT91_ID_US2, + .flags = IORESOURCE_IRQ, + }, +}; + +static struct at91_uart_data uart2_data = { + .use_dma_tx = 1, + .use_dma_rx = 1, +}; + +static struct platform_device at91rm9200_uart2_device = { + .name = "at91_usart", + .id = 3, + .dev = { + .platform_data = &uart2_data, + .coherent_dma_mask = 0xffffffff, + }, + .resource = uart2_resources, + .num_resources = ARRAY_SIZE(uart2_resources), +}; + +static inline void configure_usart2_pins(void) +{ + at91_set_A_periph(AT91_PIN_PA22, 0); /* RXD2 */ + at91_set_A_periph(AT91_PIN_PA23, 1); /* TXD2 */ +} + +static struct resource uart3_resources[] = { + [0] = { + .start = AT91_BASE_US3, + .end = AT91_BASE_US3 + SZ_16K - 1, + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = AT91_ID_US3, + .end = AT91_ID_US3, + .flags = IORESOURCE_IRQ, + }, +}; + +static struct at91_uart_data uart3_data = { + .use_dma_tx = 1, + .use_dma_rx = 1, +}; + +static struct platform_device at91rm9200_uart3_device = { + .name = "at91_usart", + .id = 4, + .dev = { + .platform_data = &uart3_data, + .coherent_dma_mask = 0xffffffff, + }, + .resource = uart3_resources, + .num_resources = ARRAY_SIZE(uart3_resources), +}; + +static inline void configure_usart3_pins(void) +{ + at91_set_B_periph(AT91_PIN_PA5, 1); /* TXD3 */ + at91_set_B_periph(AT91_PIN_PA6, 0); /* RXD3 */ +} + +struct platform_device *at91_uarts[AT91_NR_UART]; /* the UARTs to use */ +struct platform_device *at91_default_console_device; /* the serial console device */ + +void __init at91_init_serial(struct at91_uart_config *config) +{ + int i; + + /* Fill in list of supported UARTs */ + for (i = 0; i < config->nr_tty; i++) { + switch (config->tty_map[i]) { + case 0: + configure_usart0_pins(); + at91_uarts[i] = &at91rm9200_uart0_device; + at91_clock_associate("usart0_clk", &at91rm9200_uart0_device.dev, "usart"); + break; + case 1: + configure_usart1_pins(); + at91_uarts[i] = &at91rm9200_uart1_device; + at91_clock_associate("usart1_clk", &at91rm9200_uart1_device.dev, "usart"); + break; + case 2: + configure_usart2_pins(); + at91_uarts[i] = &at91rm9200_uart2_device; + at91_clock_associate("usart2_clk", &at91rm9200_uart2_device.dev, "usart"); + break; + case 3: + configure_usart3_pins(); + at91_uarts[i] = &at91rm9200_uart3_device; + at91_clock_associate("usart3_clk", &at91rm9200_uart3_device.dev, "usart"); + break; + case 4: + configure_dbgu_pins(); + at91_uarts[i] = &at91rm9200_dbgu_device; + at91_clock_associate("mck", &at91rm9200_dbgu_device.dev, "usart"); + break; + default: + continue; + } + at91_uarts[i]->id = i; /* update ID number to mapped ID */ + } + + /* Set serial console device */ + if (config->console_tty < AT91_NR_UART) + at91_default_console_device = at91_uarts[config->console_tty]; + if (!at91_default_console_device) + printk(KERN_INFO "AT91: No default serial console defined.\n"); +} + +void __init at91_add_device_serial(void) +{ + int i; + + for (i = 0; i < AT91_NR_UART; i++) { + if (at91_uarts[i]) + platform_device_register(at91_uarts[i]); + } +} +#else +void __init at91_init_serial(struct at91_uart_config *config) {} +void __init at91_add_device_serial(void) {} +#endif + + /* -------------------------------------------------------------------- */ + +/* + * These devices are always present and don't need any board-specific + * setup. + */ +static int __init at91_add_standard_devices(void) +{ + at91_add_device_rtc(); + at91_add_device_watchdog(); + return 0; +} + +arch_initcall(at91_add_standard_devices); diff --git a/arch/arm/mach-at91rm9200/generic.h b/arch/arm/mach-at91rm9200/generic.h index 9bd541eba..7979d8ab7 100644 --- a/arch/arm/mach-at91rm9200/generic.h +++ b/arch/arm/mach-at91rm9200/generic.h @@ -8,11 +8,24 @@ * published by the Free Software Foundation. */ -void at91_gpio_irq_setup(unsigned banks); + /* Interrupts */ +extern void __init at91rm9200_init_irq(unsigned int priority[]); +extern void __init at91_aic_init(unsigned int priority[]); +extern void __init at91_gpio_irq_setup(unsigned banks); + /* Timer */ struct sys_timer; extern struct sys_timer at91rm9200_timer; + /* Memory Map */ extern void __init at91rm9200_map_io(void); + /* Clocks */ extern int __init at91_clock_init(unsigned long main_clock); +struct device; +extern void __init at91_clock_associate(const char *id, struct device *dev, const char *func); + + /* Power Management */ +extern void at91_irq_suspend(void); +extern void at91_irq_resume(void); + diff --git a/arch/arm/mach-at91rm9200/gpio.c b/arch/arm/mach-at91rm9200/gpio.c index 5ab46274e..cec199fd6 100644 --- a/arch/arm/mach-at91rm9200/gpio.c +++ b/arch/arm/mach-at91rm9200/gpio.c @@ -10,13 +10,14 @@ */ #include +#include +#include #include #include #include #include -#include -#include +#include #include static const u32 pio_controller_offset[4] = { @@ -213,6 +214,84 @@ EXPORT_SYMBOL(at91_get_gpio_value); /*--------------------------------------------------------------------------*/ +#ifdef CONFIG_PM + +static u32 wakeups[BGA_GPIO_BANKS]; +static u32 backups[BGA_GPIO_BANKS]; + +static int gpio_irq_set_wake(unsigned pin, unsigned state) +{ + unsigned mask = pin_to_mask(pin); + + pin -= PIN_BASE; + pin /= 32; + + if (unlikely(pin >= BGA_GPIO_BANKS)) + return -EINVAL; + + if (state) + wakeups[pin] |= mask; + else + wakeups[pin] &= ~mask; + + return 0; +} + +void at91_gpio_suspend(void) +{ + int i; + + for (i = 0; i < BGA_GPIO_BANKS; i++) { + u32 pio = pio_controller_offset[i]; + + /* + * Note: drivers should have disabled GPIO interrupts that + * aren't supposed to be wakeup sources. + * But that is not much good on ARM..... disable_irq() does + * not update the hardware immediately, so the hardware mask + * (IMR) has the wrong value (not current, too much is + * permitted). + * + * Our workaround is to disable all non-wakeup IRQs ... + * which is exactly what correct drivers asked for in the + * first place! + */ + backups[i] = at91_sys_read(pio + PIO_IMR); + at91_sys_write(pio_controller_offset[i] + PIO_IDR, backups[i]); + at91_sys_write(pio_controller_offset[i] + PIO_IER, wakeups[i]); + + if (!wakeups[i]) { + disable_irq_wake(AT91_ID_PIOA + i); + at91_sys_write(AT91_PMC_PCDR, 1 << (AT91_ID_PIOA + i)); + } else { + enable_irq_wake(AT91_ID_PIOA + i); +#ifdef CONFIG_PM_DEBUG + printk(KERN_DEBUG "GPIO-%c may wake for %08x\n", "ABCD"[i], wakeups[i]); +#endif + } + } +} + +void at91_gpio_resume(void) +{ + int i; + + for (i = 0; i < BGA_GPIO_BANKS; i++) { + at91_sys_write(pio_controller_offset[i] + PIO_IDR, wakeups[i]); + at91_sys_write(pio_controller_offset[i] + PIO_IER, backups[i]); + } + + at91_sys_write(AT91_PMC_PCER, + (1 << AT91_ID_PIOA) + | (1 << AT91_ID_PIOB) + | (1 << AT91_ID_PIOC) + | (1 << AT91_ID_PIOD)); +} + +#else +#define gpio_irq_set_wake NULL +#endif + /* Several AIC controller irqs are dispatched through this GPIO handler. * To use any AT91_PIN_* as an externally triggered IRQ, first call @@ -248,10 +327,12 @@ static int gpio_irq_type(unsigned pin, unsigned type) return (type == IRQT_BOTHEDGE) ? 0 : -EINVAL; } -static struct irqchip gpio_irqchip = { +static struct irq_chip gpio_irqchip = { + .name = "GPIO", .mask = gpio_irq_mask, .unmask = gpio_irq_unmask, .set_type = gpio_irq_type, + .set_wake = gpio_irq_set_wake, }; static void gpio_irq_handler(unsigned irq, struct irqdesc *desc, struct pt_regs *regs) @@ -261,21 +342,22 @@ static void gpio_irq_handler(unsigned irq, struct irqdesc *desc, struct pt_regs void __iomem *pio; u32 isr; - pio = desc->base; + pio = get_irq_chip_data(irq); /* temporarily mask (level sensitive) parent IRQ */ desc->chip->ack(irq); for (;;) { + /* reading ISR acks the pending (edge triggered) GPIO interrupt */ isr = __raw_readl(pio + PIO_ISR) & __raw_readl(pio + PIO_IMR); if (!isr) break; - pin = (unsigned) desc->data; + pin = (unsigned) get_irq_data(irq); gpio = &irq_desc[pin]; while (isr) { if (isr & 1) { - if (unlikely(gpio->disable_depth)) { + if (unlikely(gpio->depth)) { /* * The core ARM interrupt handler lazily disables IRQs so * another IRQ must be generated before it actually gets @@ -284,7 +366,7 @@ static void gpio_irq_handler(unsigned irq, struct irqdesc *desc, struct pt_regs gpio_irq_mask(pin); } else - gpio->handle(pin, gpio, regs); + desc_handle_irq(pin, gpio, regs); } pin++; gpio++; @@ -315,15 +397,16 @@ void __init at91_gpio_irq_setup(unsigned banks) set_irq_chipdata(id, controller); for (i = 0; i < 32; i++, pin++) { + /* + * Can use the "simple" and not "edge" handler since it's + * shorter, and the AIC handles interupts sanely. + */ set_irq_chip(pin, &gpio_irqchip); set_irq_handler(pin, do_simple_IRQ); set_irq_flags(pin, IRQF_VALID); } set_irq_chained_handler(id, gpio_irq_handler); - - /* enable the PIO peripheral clock */ - at91_sys_write(AT91_PMC_PCER, 1 << id); } pr_info("AT91: %d gpio irqs in %d banks\n", pin - PIN_BASE, banks); } diff --git a/arch/arm/mach-at91rm9200/irq.c b/arch/arm/mach-at91rm9200/irq.c index cb62bc83a..c3a5e777f 100644 --- a/arch/arm/mach-at91rm9200/irq.c +++ b/arch/arm/mach-at91rm9200/irq.c @@ -20,7 +20,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include #include #include #include @@ -37,65 +36,23 @@ #include "generic.h" -/* - * The default interrupt priority levels (0 = lowest, 7 = highest). - */ -static unsigned int at91rm9200_default_irq_priority[NR_AIC_IRQS] __initdata = { - 7, /* Advanced Interrupt Controller */ - 7, /* System Peripheral */ - 0, /* Parallel IO Controller A */ - 0, /* Parallel IO Controller B */ - 0, /* Parallel IO Controller C */ - 0, /* Parallel IO Controller D */ - 6, /* USART 0 */ - 6, /* USART 1 */ - 6, /* USART 2 */ - 6, /* USART 3 */ - 0, /* Multimedia Card Interface */ - 4, /* USB Device Port */ - 0, /* Two-Wire Interface */ - 6, /* Serial Peripheral Interface */ - 5, /* Serial Synchronous Controller */ - 5, /* Serial Synchronous Controller */ - 5, /* Serial Synchronous Controller */ - 0, /* Timer Counter 0 */ - 0, /* Timer Counter 1 */ - 0, /* Timer Counter 2 */ - 0, /* Timer Counter 3 */ - 0, /* Timer Counter 4 */ - 0, /* Timer Counter 5 */ - 3, /* USB Host port */ - 3, /* Ethernet MAC */ - 0, /* Advanced Interrupt Controller */ - 0, /* Advanced Interrupt Controller */ - 0, /* Advanced Interrupt Controller */ - 0, /* Advanced Interrupt Controller */ - 0, /* Advanced Interrupt Controller */ - 0, /* Advanced Interrupt Controller */ - 0 /* Advanced Interrupt Controller */ -}; - -static void at91rm9200_mask_irq(unsigned int irq) +static void at91_aic_mask_irq(unsigned int irq) { /* Disable interrupt on AIC */ at91_sys_write(AT91_AIC_IDCR, 1 << irq); } -static void at91rm9200_unmask_irq(unsigned int irq) +static void at91_aic_unmask_irq(unsigned int irq) { /* Enable interrupt on AIC */ at91_sys_write(AT91_AIC_IECR, 1 << irq); } -static int at91rm9200_irq_type(unsigned irq, unsigned type) +static int at91_aic_set_type(unsigned irq, unsigned type) { unsigned int smr, srctype; - /* change triggering only for FIQ and external IRQ0..IRQ6 */ - if ((irq < AT91_ID_IRQ0) && (irq != AT91_ID_FIQ)) - return -EINVAL; - switch (type) { case IRQT_HIGH: srctype = AT91_AIC_SRCTYPE_HIGH; @@ -104,9 +61,13 @@ static int at91rm9200_irq_type(unsigned irq, unsigned type) srctype = AT91_AIC_SRCTYPE_RISING; break; case IRQT_LOW: + if ((irq > AT91_ID_FIQ) && (irq < AT91_ID_IRQ0)) /* only supported on external interrupts */ + return -EINVAL; srctype = AT91_AIC_SRCTYPE_LOW; break; case IRQT_FALLING: + if ((irq > AT91_ID_FIQ) && (irq < AT91_ID_IRQ0)) /* only supported on external interrupts */ + return -EINVAL; srctype = AT91_AIC_SRCTYPE_FALLING; break; default: @@ -118,24 +79,57 @@ static int at91rm9200_irq_type(unsigned irq, unsigned type) return 0; } -static struct irqchip at91rm9200_irq_chip = { - .ack = at91rm9200_mask_irq, - .mask = at91rm9200_mask_irq, - .unmask = at91rm9200_unmask_irq, - .set_type = at91rm9200_irq_type, +#ifdef CONFIG_PM + +static u32 wakeups; +static u32 backups; + +static int at91_aic_set_wake(unsigned irq, unsigned value) +{ + if (unlikely(irq >= 32)) + return -EINVAL; + + if (value) + wakeups |= (1 << irq); + else + wakeups &= ~(1 << irq); + + return 0; +} + +void at91_irq_suspend(void) +{ + backups = at91_sys_read(AT91_AIC_IMR); + at91_sys_write(AT91_AIC_IDCR, backups); + at91_sys_write(AT91_AIC_IECR, wakeups); +} + +void at91_irq_resume(void) +{ + at91_sys_write(AT91_AIC_IDCR, wakeups); + at91_sys_write(AT91_AIC_IECR, backups); +} + +#else +#define at91_aic_set_wake NULL +#endif + +static struct irq_chip at91_aic_chip = { + .name = "AIC", + .ack = at91_aic_mask_irq, + .mask = at91_aic_mask_irq, + .unmask = at91_aic_unmask_irq, + .set_type = at91_aic_set_type, + .set_wake = at91_aic_set_wake, }; /* * Initialize the AIC interrupt controller. */ -void __init at91rm9200_init_irq(unsigned int priority[NR_AIC_IRQS]) +void __init at91_aic_init(unsigned int priority[NR_AIC_IRQS]) { unsigned int i; - /* No priority list specified for this board -> use defaults */ - if (priority == NULL) - priority = at91rm9200_default_irq_priority; - /* * The IVR is used by macro get_irqnr_and_base to read and verify. * The irq number is NR_AIC_IRQS when a spurious interrupt has occurred. @@ -143,10 +137,10 @@ void __init at91rm9200_init_irq(unsigned int priority[NR_AIC_IRQS]) for (i = 0; i < NR_AIC_IRQS; i++) { /* Put irq number in Source Vector Register: */ at91_sys_write(AT91_AIC_SVR(i), i); - /* Store the Source Mode Register as defined in table above */ + /* Active Low interrupt, with the specified priority */ at91_sys_write(AT91_AIC_SMR(i), AT91_AIC_SRCTYPE_LOW | priority[i]); - set_irq_chip(i, &at91rm9200_irq_chip); + set_irq_chip(i, &at91_aic_chip); set_irq_handler(i, do_level_IRQ); set_irq_flags(i, IRQF_VALID | IRQF_PROBE); diff --git a/arch/arm/mach-at91rm9200/leds.c b/arch/arm/mach-at91rm9200/leds.c index 28150e890..1a3337304 100644 --- a/arch/arm/mach-at91rm9200/leds.c +++ b/arch/arm/mach-at91rm9200/leds.c @@ -9,7 +9,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include diff --git a/arch/arm/mach-at91rm9200/time.c b/arch/arm/mach-at91rm9200/time.c deleted file mode 100644 index 7ffcf443b..000000000 --- a/arch/arm/mach-at91rm9200/time.c +++ /dev/null @@ -1,127 +0,0 @@ -/* - * linux/arch/arm/mach-at91rm9200/time.c - * - * Copyright (C) 2003 SAN People - * Copyright (C) 2003 ATMEL - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -/* - * The ST_CRTR is updated asynchronously to the master clock. It is therefore - * necessary to read it twice (with the same value) to ensure accuracy. - */ -static inline unsigned long read_CRTR(void) { - unsigned long x1, x2; - - do { - x1 = at91_sys_read(AT91_ST_CRTR); - x2 = at91_sys_read(AT91_ST_CRTR); - } while (x1 != x2); - - return x1; -} - -/* - * Returns number of microseconds since last timer interrupt. Note that interrupts - * will have been disabled by do_gettimeofday() - * 'LATCH' is hwclock ticks (see CLOCK_TICK_RATE in timex.h) per jiffy. - * 'tick' is usecs per jiffy (linux/timex.h). - */ -static unsigned long at91rm9200_gettimeoffset(void) -{ - unsigned long elapsed; - - elapsed = (read_CRTR() - at91_sys_read(AT91_ST_RTAR)) & AT91_ST_ALMV; - - return (unsigned long)(elapsed * (tick_nsec / 1000)) / LATCH; -} - -/* - * IRQ handler for the timer. - */ -static irqreturn_t at91rm9200_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) -{ - unsigned long rtar; - - if (at91_sys_read(AT91_ST_SR) & AT91_ST_PITS) { /* This is a shared interrupt */ - write_seqlock(&xtime_lock); - - while (((read_CRTR() - at91_sys_read(AT91_ST_RTAR)) & AT91_ST_ALMV) >= LATCH) { - timer_tick(regs); - rtar = (at91_sys_read(AT91_ST_RTAR) + LATCH) & AT91_ST_ALMV; - at91_sys_write(AT91_ST_RTAR, rtar); - } - - write_sequnlock(&xtime_lock); - - return IRQ_HANDLED; - } - else - return IRQ_NONE; /* not handled */ -} - -static struct irqaction at91rm9200_timer_irq = { - .name = "at91_tick", - .flags = SA_SHIRQ | SA_INTERRUPT, - .handler = at91rm9200_timer_interrupt -}; - -/* - * Set up timer interrupt. - */ -void __init at91rm9200_timer_init(void) -{ - /* Disable all timer interrupts */ - at91_sys_write(AT91_ST_IDR, AT91_ST_PITS | AT91_ST_WDOVF | AT91_ST_RTTINC | AT91_ST_ALMS); - (void) at91_sys_read(AT91_ST_SR); /* Clear any pending interrupts */ - - /* - * Make IRQs happen for the system timer. - */ - setup_irq(AT91_ID_SYS, &at91rm9200_timer_irq); - - /* Set initial alarm to 0 */ - at91_sys_write(AT91_ST_RTAR, 0); - - /* Real time counter incremented every 30.51758 microseconds */ - at91_sys_write(AT91_ST_RTMR, 1); - - /* Set Period Interval timer */ - at91_sys_write(AT91_ST_PIMR, LATCH); - - /* Change the kernel's 'tick' value to 10009 usec. (the default is 10000) */ - tick_usec = (LATCH * 1000000) / CLOCK_TICK_RATE; - - /* Enable Period Interval Timer interrupt */ - at91_sys_write(AT91_ST_IER, AT91_ST_PITS); -} - -struct sys_timer at91rm9200_timer = { - .init = at91rm9200_timer_init, - .offset = at91rm9200_gettimeoffset, -}; diff --git a/arch/arm/mach-clps711x/fortunet.c b/arch/arm/mach-clps711x/fortunet.c index ff26a85aa..3792ab4f0 100644 --- a/arch/arm/mach-clps711x/fortunet.c +++ b/arch/arm/mach-clps711x/fortunet.c @@ -19,7 +19,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include #include #include #include diff --git a/arch/arm/mach-clps711x/p720t.c b/arch/arm/mach-clps711x/p720t.c index 9ba45f4d5..c8ecd2480 100644 --- a/arch/arm/mach-clps711x/p720t.c +++ b/arch/arm/mach-clps711x/p720t.c @@ -17,7 +17,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include #include #include #include diff --git a/arch/arm/mach-clps711x/time.c b/arch/arm/mach-clps711x/time.c index 1a23f0dcd..a071eac4a 100644 --- a/arch/arm/mach-clps711x/time.c +++ b/arch/arm/mach-clps711x/time.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -57,7 +58,7 @@ p720t_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) static struct irqaction clps711x_timer_irq = { .name = "CLPS711x Timer Tick", - .flags = SA_INTERRUPT | SA_TIMER, + .flags = IRQF_DISABLED | IRQF_TIMER, .handler = p720t_timer_interrupt, }; diff --git a/arch/arm/mach-clps7500/core.c b/arch/arm/mach-clps7500/core.c index 5b12cab0e..92eaebdd5 100644 --- a/arch/arm/mach-clps7500/core.c +++ b/arch/arm/mach-clps7500/core.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -315,7 +316,7 @@ clps7500_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) static struct irqaction clps7500_timer_irq = { .name = "CLPS7500 Timer Tick", - .flags = SA_INTERRUPT | SA_TIMER, + .flags = IRQF_DISABLED | IRQF_TIMER, .handler = clps7500_timer_interrupt, }; diff --git a/arch/arm/mach-ebsa110/core.c b/arch/arm/mach-ebsa110/core.c index 6d620d826..70dd12ef3 100644 --- a/arch/arm/mach-ebsa110/core.c +++ b/arch/arm/mach-ebsa110/core.c @@ -199,7 +199,7 @@ ebsa110_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) static struct irqaction ebsa110_timer_irq = { .name = "EBSA110 Timer Tick", - .flags = SA_INTERRUPT | SA_TIMER, + .flags = IRQF_DISABLED | IRQF_TIMER, .handler = ebsa110_timer_interrupt, }; diff --git a/arch/arm/mach-ep93xx/Kconfig b/arch/arm/mach-ep93xx/Kconfig index cec5a21ca..f1b740083 100644 --- a/arch/arm/mach-ep93xx/Kconfig +++ b/arch/arm/mach-ep93xx/Kconfig @@ -2,8 +2,31 @@ if ARCH_EP93XX menu "Cirrus EP93xx Implementation Options" +config CRUNCH + bool "Support for MaverickCrunch" + help + Enable kernel support for MaverickCrunch. + comment "EP93xx Platforms" +config MACH_EDB9302 + bool "Support Cirrus Logic EDB9302" + help + Say 'Y' here if you want your kernel to support the Cirrus + Logic EDB9302 Evaluation Board. + +config MACH_EDB9315 + bool "Support Cirrus Logic EDB9315" + help + Say 'Y' here if you want your kernel to support the Cirrus + Logic EDB9315 Evaluation Board. + +config MACH_EDB9315A + bool "Support Cirrus Logic EDB9315A" + help + Say 'Y' here if you want your kernel to support the Cirrus + Logic EDB9315A Evaluation Board. + config MACH_GESBC9312 bool "Support Glomation GESBC-9312-sx" help diff --git a/arch/arm/mach-ep93xx/Makefile b/arch/arm/mach-ep93xx/Makefile index 5393af989..1f5a6b048 100644 --- a/arch/arm/mach-ep93xx/Makefile +++ b/arch/arm/mach-ep93xx/Makefile @@ -1,10 +1,13 @@ # # Makefile for the linux kernel. # -obj-y := core.o +obj-y := core.o clock.o obj-m := obj-n := obj- := +obj-$(CONFIG_MACH_EDB9302) += edb9302.o +obj-$(CONFIG_MACH_EDB9315) += edb9315.o +obj-$(CONFIG_MACH_EDB9315A) += edb9315a.o obj-$(CONFIG_MACH_GESBC9312) += gesbc9312.o obj-$(CONFIG_MACH_TS72XX) += ts72xx.o diff --git a/arch/arm/mach-ep93xx/core.c b/arch/arm/mach-ep93xx/core.c index dcd417625..a87a784b9 100644 --- a/arch/arm/mach-ep93xx/core.c +++ b/arch/arm/mach-ep93xx/core.c @@ -13,7 +13,6 @@ * your option) any later version. */ -#include #include #include #include @@ -103,7 +102,8 @@ static int ep93xx_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) write_seqlock(&xtime_lock); __raw_writel(1, EP93XX_TIMER1_CLEAR); - while (__raw_readl(EP93XX_TIMER4_VALUE_LOW) - last_jiffy_time + while ((signed long) + (__raw_readl(EP93XX_TIMER4_VALUE_LOW) - last_jiffy_time) >= TIMER4_TICKS_PER_JIFFY) { last_jiffy_time += TIMER4_TICKS_PER_JIFFY; timer_tick(regs); @@ -116,7 +116,7 @@ static int ep93xx_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) static struct irqaction ep93xx_timer_irq = { .name = "ep93xx timer", - .flags = SA_INTERRUPT | SA_TIMER, + .flags = IRQF_DISABLED | IRQF_TIMER, .handler = ep93xx_timer_interrupt, }; @@ -124,7 +124,7 @@ static void __init ep93xx_timer_init(void) { /* Enable periodic HZ timer. */ __raw_writel(0x48, EP93XX_TIMER1_CONTROL); - __raw_writel((508000 / HZ) - 1, EP93XX_TIMER1_LOAD); + __raw_writel((508469 / HZ) - 1, EP93XX_TIMER1_LOAD); __raw_writel(0xc8, EP93XX_TIMER1_CONTROL); /* Enable lost jiffy timer. */ @@ -432,10 +432,37 @@ static struct platform_device ep93xx_rtc_device = { }; +static struct resource ep93xx_ohci_resources[] = { + [0] = { + .start = EP93XX_USB_PHYS_BASE, + .end = EP93XX_USB_PHYS_BASE + 0x0fff, + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = IRQ_EP93XX_USB, + .end = IRQ_EP93XX_USB, + .flags = IORESOURCE_IRQ, + }, +}; + +static struct platform_device ep93xx_ohci_device = { + .name = "ep93xx-ohci", + .id = -1, + .dev = { + .dma_mask = (void *)0xffffffff, + .coherent_dma_mask = 0xffffffff, + }, + .num_resources = ARRAY_SIZE(ep93xx_ohci_resources), + .resource = ep93xx_ohci_resources, +}; + + void __init ep93xx_init_devices(void) { unsigned int v; + ep93xx_clock_init(); + /* * Disallow access to MaverickCrunch initially. */ @@ -449,4 +476,5 @@ void __init ep93xx_init_devices(void) amba_device_register(&uart3_device, &iomem_resource); platform_device_register(&ep93xx_rtc_device); + platform_device_register(&ep93xx_ohci_device); } diff --git a/arch/arm/mach-ep93xx/gesbc9312.c b/arch/arm/mach-ep93xx/gesbc9312.c index d18fcb1a2..e760fd4f3 100644 --- a/arch/arm/mach-ep93xx/gesbc9312.c +++ b/arch/arm/mach-ep93xx/gesbc9312.c @@ -10,22 +10,43 @@ * your option) any later version. */ -#include #include #include #include #include #include +#include #include +#include #include #include #include #include +static struct physmap_flash_data gesbc9312_flash_data = { + .width = 4, +}; + +static struct resource gesbc9312_flash_resource = { + .start = 0x60000000, + .end = 0x607fffff, + .flags = IORESOURCE_MEM, +}; + +static struct platform_device gesbc9312_flash = { + .name = "physmap-flash", + .id = 0, + .dev = { + .platform_data = &gesbc9312_flash_data, + }, + .num_resources = 1, + .resource = &gesbc9312_flash_resource, +}; + static void __init gesbc9312_init_machine(void) { ep93xx_init_devices(); - physmap_configure(0x60000000, 0x00800000, 4, NULL); + platform_device_register(&gesbc9312_flash); } MACHINE_START(GESBC9312, "Glomation GESBC-9312-sx") diff --git a/arch/arm/mach-ep93xx/ts72xx.c b/arch/arm/mach-ep93xx/ts72xx.c index e24566b88..df315f2e9 100644 --- a/arch/arm/mach-ep93xx/ts72xx.c +++ b/arch/arm/mach-ep93xx/ts72xx.c @@ -10,12 +10,12 @@ * your option) any later version. */ -#include #include #include #include #include #include +#include #include #include #include @@ -111,6 +111,26 @@ static void __init ts72xx_map_io(void) } } +static struct physmap_flash_data ts72xx_flash_data = { + .width = 1, +}; + +static struct resource ts72xx_flash_resource = { + .start = TS72XX_NOR_PHYS_BASE, + .end = TS72XX_NOR_PHYS_BASE + 0x00ffffff, + .flags = IORESOURCE_MEM, +}; + +static struct platform_device ts72xx_flash = { + .name = "physmap-flash", + .id = 0, + .dev = { + .platform_data = &ts72xx_flash_data, + }, + .num_resources = 1, + .resource = &ts72xx_flash_resource, +}; + static unsigned char ts72xx_rtc_readbyte(unsigned long addr) { __raw_writeb(addr, TS72XX_RTC_INDEX_VIRT_BASE); @@ -141,7 +161,7 @@ static void __init ts72xx_init_machine(void) { ep93xx_init_devices(); if (board_is_ts7200()) - physmap_configure(TS72XX_NOR_PHYS_BASE, 0x01000000, 1, NULL); + platform_device_register(&ts72xx_flash); platform_device_register(&ts72xx_rtc_device); } diff --git a/arch/arm/mach-footbridge/cats-hw.c b/arch/arm/mach-footbridge/cats-hw.c index 5b64d5c5b..ef6ccc899 100644 --- a/arch/arm/mach-footbridge/cats-hw.c +++ b/arch/arm/mach-footbridge/cats-hw.c @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include #include diff --git a/arch/arm/mach-footbridge/common.c b/arch/arm/mach-footbridge/common.c index bbe6e4a0b..af900f475 100644 --- a/arch/arm/mach-footbridge/common.c +++ b/arch/arm/mach-footbridge/common.c @@ -7,7 +7,6 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ -#include #include #include #include diff --git a/arch/arm/mach-footbridge/dc21285-timer.c b/arch/arm/mach-footbridge/dc21285-timer.c index 14a62d600..2af610811 100644 --- a/arch/arm/mach-footbridge/dc21285-timer.c +++ b/arch/arm/mach-footbridge/dc21285-timer.c @@ -6,6 +6,7 @@ */ #include #include +#include #include @@ -43,7 +44,7 @@ timer1_interrupt(int irq, void *dev_id, struct pt_regs *regs) static struct irqaction footbridge_timer_irq = { .name = "Timer1 timer tick", .handler = timer1_interrupt, - .flags = SA_INTERRUPT | SA_TIMER, + .flags = IRQF_DISABLED | IRQF_TIMER, }; /* diff --git a/arch/arm/mach-footbridge/dc21285.c b/arch/arm/mach-footbridge/dc21285.c index 5dace2597..823e25d45 100644 --- a/arch/arm/mach-footbridge/dc21285.c +++ b/arch/arm/mach-footbridge/dc21285.c @@ -35,7 +35,6 @@ extern int setup_arm_irq(int, struct irqaction *); extern void pcibios_report_status(u_int status_mask, int warn); -extern void register_isa_ports(unsigned int, unsigned int, unsigned int); static unsigned long dc21285_base_address(struct pci_bus *bus, unsigned int devfn) @@ -332,15 +331,15 @@ void __init dc21285_preinit(void) /* * We don't care if these fail. */ - request_irq(IRQ_PCI_SERR, dc21285_serr_irq, SA_INTERRUPT, + request_irq(IRQ_PCI_SERR, dc21285_serr_irq, IRQF_DISABLED, "PCI system error", &serr_timer); - request_irq(IRQ_PCI_PERR, dc21285_parity_irq, SA_INTERRUPT, + request_irq(IRQ_PCI_PERR, dc21285_parity_irq, IRQF_DISABLED, "PCI parity error", &perr_timer); - request_irq(IRQ_PCI_ABORT, dc21285_abort_irq, SA_INTERRUPT, + request_irq(IRQ_PCI_ABORT, dc21285_abort_irq, IRQF_DISABLED, "PCI abort", NULL); - request_irq(IRQ_DISCARD_TIMER, dc21285_discard_irq, SA_INTERRUPT, + request_irq(IRQ_DISCARD_TIMER, dc21285_discard_irq, IRQF_DISABLED, "Discard timer", NULL); - request_irq(IRQ_PCI_DPERR, dc21285_dparity_irq, SA_INTERRUPT, + request_irq(IRQ_PCI_DPERR, dc21285_dparity_irq, IRQF_DISABLED, "PCI data parity", NULL); if (cfn_mode) { diff --git a/arch/arm/mach-footbridge/dma.c b/arch/arm/mach-footbridge/dma.c index 7a54578b5..1f9b09b8e 100644 --- a/arch/arm/mach-footbridge/dma.c +++ b/arch/arm/mach-footbridge/dma.c @@ -10,7 +10,6 @@ * 17-Mar-1999 RMK Allow any EBSA285-like architecture to have * ISA DMA controllers. */ -#include #include #include diff --git a/arch/arm/mach-footbridge/ebsa285-leds.c b/arch/arm/mach-footbridge/ebsa285-leds.c index 2c7c36304..a64e22226 100644 --- a/arch/arm/mach-footbridge/ebsa285-leds.c +++ b/arch/arm/mach-footbridge/ebsa285-leds.c @@ -16,7 +16,6 @@ * Changelog: * 02-05-1999 RMK Various cleanups */ -#include #include #include #include diff --git a/arch/arm/mach-footbridge/isa-irq.c b/arch/arm/mach-footbridge/isa-irq.c index e1c43b331..87448c2d6 100644 --- a/arch/arm/mach-footbridge/isa-irq.c +++ b/arch/arm/mach-footbridge/isa-irq.c @@ -98,9 +98,22 @@ isa_irq_handler(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs) desc_handle_irq(isa_irq, desc, regs); } -static struct irqaction irq_cascade = { .handler = no_action, .name = "cascade", }; -static struct resource pic1_resource = { "pic1", 0x20, 0x3f }; -static struct resource pic2_resource = { "pic2", 0xa0, 0xbf }; +static struct irqaction irq_cascade = { + .handler = no_action, + .name = "cascade", +}; + +static struct resource pic1_resource = { + .name = "pic1", + .start = 0x20, + .end = 0x3f, +}; + +static struct resource pic2_resource = { + .name = "pic2", + .start = 0xa0, + .end = 0xbf, +}; void __init isa_init_irq(unsigned int host_irq) { diff --git a/arch/arm/mach-footbridge/isa-timer.c b/arch/arm/mach-footbridge/isa-timer.c index c1d74f7ab..c4810a40c 100644 --- a/arch/arm/mach-footbridge/isa-timer.c +++ b/arch/arm/mach-footbridge/isa-timer.c @@ -6,6 +6,7 @@ */ #include #include +#include #include #include @@ -72,7 +73,7 @@ isa_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) static struct irqaction isa_timer_irq = { .name = "ISA timer tick", .handler = isa_timer_interrupt, - .flags = SA_INTERRUPT | SA_TIMER, + .flags = IRQF_DISABLED | IRQF_TIMER, }; static void __init isa_timer_init(void) diff --git a/arch/arm/mach-footbridge/netwinder-hw.c b/arch/arm/mach-footbridge/netwinder-hw.c index 229bf0585..a1f381c64 100644 --- a/arch/arm/mach-footbridge/netwinder-hw.c +++ b/arch/arm/mach-footbridge/netwinder-hw.c @@ -5,7 +5,6 @@ * * Copyright (C) 1998, 1999 Russell King, Phil Blundell */ -#include #include #include #include diff --git a/arch/arm/mach-footbridge/netwinder-leds.c b/arch/arm/mach-footbridge/netwinder-leds.c index 7451fc07b..8e9cac5a2 100644 --- a/arch/arm/mach-footbridge/netwinder-leds.c +++ b/arch/arm/mach-footbridge/netwinder-leds.c @@ -16,7 +16,6 @@ * Changelog: * 02-05-1999 RMK Various cleanups */ -#include #include #include #include diff --git a/arch/arm/mach-h720x/cpu-h7201.c b/arch/arm/mach-h720x/cpu-h7201.c index af9e4a5d5..a9a8255a3 100644 --- a/arch/arm/mach-h720x/cpu-h7201.c +++ b/arch/arm/mach-h720x/cpu-h7201.c @@ -41,7 +41,7 @@ h7201_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) static struct irqaction h7201_timer_irq = { .name = "h7201 Timer Tick", - .flags = SA_INTERRUPT | SA_TIMER, + .flags = IRQF_DISABLED | IRQF_TIMER, .handler = h7201_timer_interrupt, }; diff --git a/arch/arm/mach-h720x/cpu-h7202.c b/arch/arm/mach-h720x/cpu-h7202.c index a4a7c0125..da678d163 100644 --- a/arch/arm/mach-h720x/cpu-h7202.c +++ b/arch/arm/mach-h720x/cpu-h7202.c @@ -171,7 +171,7 @@ static struct irqchip h7202_timerx_chip = { static struct irqaction h7202_timer_irq = { .name = "h7202 Timer Tick", - .flags = SA_INTERRUPT | SA_TIMER, + .flags = IRQF_DISABLED | IRQF_TIMER, .handler = h7202_timer_interrupt, }; diff --git a/arch/arm/mach-h720x/h7201-eval.c b/arch/arm/mach-h720x/h7201-eval.c index 193f968ed..407cd4c0a 100644 --- a/arch/arm/mach-h720x/h7201-eval.c +++ b/arch/arm/mach-h720x/h7201-eval.c @@ -13,7 +13,6 @@ * */ -#include #include #include #include diff --git a/arch/arm/mach-h720x/h7202-eval.c b/arch/arm/mach-h720x/h7202-eval.c index 362668969..bf2acdce6 100644 --- a/arch/arm/mach-h720x/h7202-eval.c +++ b/arch/arm/mach-h720x/h7202-eval.c @@ -13,7 +13,6 @@ * */ -#include #include #include #include diff --git a/arch/arm/mach-imx/dma.c b/arch/arm/mach-imx/dma.c index 4ca51dcf1..36578871e 100644 --- a/arch/arm/mach-imx/dma.c +++ b/arch/arm/mach-imx/dma.c @@ -15,6 +15,9 @@ * Changed to support scatter gather DMA * by taking Russell's code from RiscPC * + * 2006-05-31 Pavel Pisa + * Corrected error handling code. + * */ #undef DEBUG @@ -277,7 +280,7 @@ imx_dma_setup_sg(imx_dmach_t dma_ch, int imx_dma_setup_handlers(imx_dmach_t dma_ch, void (*irq_handler) (int, void *, struct pt_regs *), - void (*err_handler) (int, void *, struct pt_regs *), + void (*err_handler) (int, void *, struct pt_regs *, int), void *data) { struct imx_dma_channel *imxdma = &imx_dma_channels[dma_ch]; @@ -463,43 +466,53 @@ static irqreturn_t dma_err_handler(int irq, void *dev_id, struct pt_regs *regs) int i, disr = DISR; struct imx_dma_channel *channel; unsigned int err_mask = DBTOSR | DRTOSR | DSESR | DBOSR; + int errcode; - DISR = disr; + DISR = disr & err_mask; for (i = 0; i < IMX_DMA_CHANNELS; i++) { - channel = &imx_dma_channels[i]; - - if ((err_mask & 1 << i) && channel->name - && channel->err_handler) { - channel->err_handler(i, channel->data, regs); + if(!(err_mask & (1 << i))) continue; - } - - imx_dma_channels[i].sg = NULL; + channel = &imx_dma_channels[i]; + errcode = 0; if (DBTOSR & (1 << i)) { - printk(KERN_WARNING - "Burst timeout on channel %d (%s)\n", - i, channel->name); - DBTOSR |= (1 << i); + DBTOSR = (1 << i); + errcode |= IMX_DMA_ERR_BURST; } if (DRTOSR & (1 << i)) { - printk(KERN_WARNING - "Request timeout on channel %d (%s)\n", - i, channel->name); - DRTOSR |= (1 << i); + DRTOSR = (1 << i); + errcode |= IMX_DMA_ERR_REQUEST; } if (DSESR & (1 << i)) { - printk(KERN_WARNING - "Transfer timeout on channel %d (%s)\n", - i, channel->name); - DSESR |= (1 << i); + DSESR = (1 << i); + errcode |= IMX_DMA_ERR_TRANSFER; } if (DBOSR & (1 << i)) { - printk(KERN_WARNING - "Buffer overflow timeout on channel %d (%s)\n", - i, channel->name); - DBOSR |= (1 << i); + DBOSR = (1 << i); + errcode |= IMX_DMA_ERR_BUFFER; } + + /* + * The cleaning of @sg field would be questionable + * there, because its value can help to compute + * remaining/transfered bytes count in the handler + */ + /*imx_dma_channels[i].sg = NULL;*/ + + if (channel->name && channel->err_handler) { + channel->err_handler(i, channel->data, regs, errcode); + continue; + } + + imx_dma_channels[i].sg = NULL; + + printk(KERN_WARNING + "DMA timeout on channel %d (%s) -%s%s%s%s\n", + i, channel->name, + errcode&IMX_DMA_ERR_BURST? " burst":"", + errcode&IMX_DMA_ERR_REQUEST? " request":"", + errcode&IMX_DMA_ERR_TRANSFER? " transfer":"", + errcode&IMX_DMA_ERR_BUFFER? " buffer":""); } return IRQ_HANDLED; } diff --git a/arch/arm/mach-imx/irq.c b/arch/arm/mach-imx/irq.c index a5de5f1da..2688bd82c 100644 --- a/arch/arm/mach-imx/irq.c +++ b/arch/arm/mach-imx/irq.c @@ -204,13 +204,15 @@ imx_gpiod_demux_handler(unsigned int irq_unused, struct irqdesc *desc, imx_gpio_handler(mask, irq, desc, regs); } -static struct irqchip imx_internal_chip = { +static struct irq_chip imx_internal_chip = { + .name = "MPU", .ack = imx_mask_irq, .mask = imx_mask_irq, .unmask = imx_unmask_irq, }; -static struct irqchip imx_gpio_chip = { +static struct irq_chip imx_gpio_chip = { + .name = "GPIO", .ack = imx_gpio_ack_irq, .mask = imx_gpio_mask_irq, .unmask = imx_gpio_unmask_irq, diff --git a/arch/arm/mach-imx/time.c b/arch/arm/mach-imx/time.c index ea805bfa5..6ed7523c6 100644 --- a/arch/arm/mach-imx/time.c +++ b/arch/arm/mach-imx/time.c @@ -8,11 +8,11 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ -#include #include #include #include #include +#include #include #include @@ -72,7 +72,7 @@ imx_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) static struct irqaction imx_timer_irq = { .name = "i.MX Timer Tick", - .flags = SA_INTERRUPT | SA_TIMER, + .flags = IRQF_DISABLED | IRQF_TIMER, .handler = imx_timer_interrupt, }; diff --git a/arch/arm/mach-integrator/core.c b/arch/arm/mach-integrator/core.c index 576a5e979..42021fdfa 100644 --- a/arch/arm/mach-integrator/core.c +++ b/arch/arm/mach-integrator/core.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -281,7 +282,7 @@ integrator_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) static struct irqaction integrator_timer_irq = { .name = "Integrator Timer Tick", - .flags = SA_INTERRUPT | SA_TIMER, + .flags = IRQF_DISABLED | IRQF_TIMER, .handler = integrator_timer_interrupt, }; diff --git a/arch/arm/mach-integrator/integrator_ap.c b/arch/arm/mach-integrator/integrator_ap.c index 6d65c96eb..191c57a3b 100644 --- a/arch/arm/mach-integrator/integrator_ap.c +++ b/arch/arm/mach-integrator/integrator_ap.c @@ -161,7 +161,8 @@ static void sc_unmask_irq(unsigned int irq) writel(1 << irq, VA_IC_BASE + IRQ_ENABLE_SET); } -static struct irqchip sc_chip = { +static struct irq_chip sc_chip = { + .name = "SC", .ack = sc_mask_irq, .mask = sc_mask_irq, .unmask = sc_unmask_irq, diff --git a/arch/arm/mach-integrator/integrator_cp.c b/arch/arm/mach-integrator/integrator_cp.c index 9f55f5ae1..678b6ba2b 100644 --- a/arch/arm/mach-integrator/integrator_cp.c +++ b/arch/arm/mach-integrator/integrator_cp.c @@ -156,7 +156,8 @@ static void cic_unmask_irq(unsigned int irq) cic_writel(1 << irq, INTCP_VA_CIC_BASE + IRQ_ENABLE_SET); } -static struct irqchip cic_chip = { +static struct irq_chip cic_chip = { + .name = "CIC", .ack = cic_mask_irq, .mask = cic_mask_irq, .unmask = cic_unmask_irq, @@ -174,7 +175,8 @@ static void pic_unmask_irq(unsigned int irq) pic_writel(1 << irq, INTCP_VA_PIC_BASE + IRQ_ENABLE_SET); } -static struct irqchip pic_chip = { +static struct irq_chip pic_chip = { + .name = "PIC", .ack = pic_mask_irq, .mask = pic_mask_irq, .unmask = pic_unmask_irq, @@ -192,7 +194,8 @@ static void sic_unmask_irq(unsigned int irq) sic_writel(1 << irq, INTCP_VA_SIC_BASE + IRQ_ENABLE_SET); } -static struct irqchip sic_chip = { +static struct irq_chip sic_chip = { + .name = "SIC", .ack = sic_mask_irq, .mask = sic_mask_irq, .unmask = sic_unmask_irq, diff --git a/arch/arm/mach-integrator/pci_v3.c b/arch/arm/mach-integrator/pci_v3.c index 229a63a52..4418f6d75 100644 --- a/arch/arm/mach-integrator/pci_v3.c +++ b/arch/arm/mach-integrator/pci_v3.c @@ -20,7 +20,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include #include #include #include @@ -601,4 +600,6 @@ void __init pci_v3_postinit(void) printk(KERN_ERR "PCI: unable to grab local bus timeout " "interrupt: %d\n", ret); #endif + + register_isa_ports(PHYS_PCI_MEM_BASE, PHYS_PCI_IO_BASE, 0); } diff --git a/arch/arm/mach-integrator/time.c b/arch/arm/mach-integrator/time.c index bc07f52a6..ee49cf790 100644 --- a/arch/arm/mach-integrator/time.c +++ b/arch/arm/mach-integrator/time.c @@ -125,7 +125,7 @@ static int rtc_probe(struct amba_device *dev, void *id) xtime.tv_sec = __raw_readl(rtc_base + RTC_DR); - ret = request_irq(dev->irq[0], arm_rtc_interrupt, SA_INTERRUPT, + ret = request_irq(dev->irq[0], arm_rtc_interrupt, IRQF_DISABLED, "rtc-pl030", dev); if (ret) goto map_out; diff --git a/arch/arm/mach-iop3xx/Kconfig b/arch/arm/mach-iop3xx/Kconfig index 2bfe8c729..4422f2388 100644 --- a/arch/arm/mach-iop3xx/Kconfig +++ b/arch/arm/mach-iop3xx/Kconfig @@ -30,12 +30,15 @@ config MACH_IQ80332 select ARCH_IOP331 help Say Y here if you want to run your kernel on the Intel IQ80332 - evaluation kit for the IOP332 chipset + evaluation kit for the IOP332 chipset. config ARCH_EP80219 - bool "Enable support for EP80219" - select ARCH_IOP321 - select ARCH_IQ31244 + bool "Enable support for EP80219" + select ARCH_IOP321 + select ARCH_IQ31244 + help + Say Y here if you want to run your kernel on the Intel EP80219 + evaluation kit for the Intel 80219 chipset (a IOP321 variant). # Which IOP variant are we running? config ARCH_IOP321 @@ -56,8 +59,8 @@ config IOP331_STEPD bool "Chip stepping D of the IOP80331 processor or IOP80333" depends on (ARCH_IOP331) help - Say Y here if you have StepD of the IOP80331 or IOP8033 - based platforms. + Say Y here if you have StepD of the IOP80331 or IOP8033 + based platforms. endmenu endif diff --git a/arch/arm/mach-iop3xx/common.c b/arch/arm/mach-iop3xx/common.c index fdeeef489..d7f50e57e 100644 --- a/arch/arm/mach-iop3xx/common.c +++ b/arch/arm/mach-iop3xx/common.c @@ -12,7 +12,6 @@ * warranty of any kind, whether express or implied. */ -#include #include #include diff --git a/arch/arm/mach-iop3xx/iop321-irq.c b/arch/arm/mach-iop3xx/iop321-irq.c index d42aae6ae..88ac33347 100644 --- a/arch/arm/mach-iop3xx/iop321-irq.c +++ b/arch/arm/mach-iop3xx/iop321-irq.c @@ -52,7 +52,8 @@ iop321_irq_unmask (unsigned int irq) intctl_write(iop321_mask); } -struct irqchip ext_chip = { +struct irq_chip ext_chip = { + .name = "IOP", .ack = iop321_irq_mask, .mask = iop321_irq_mask, .unmask = iop321_irq_unmask, diff --git a/arch/arm/mach-iop3xx/iop321-setup.c b/arch/arm/mach-iop3xx/iop321-setup.c index 0ebbcb20c..b6d096903 100644 --- a/arch/arm/mach-iop3xx/iop321-setup.c +++ b/arch/arm/mach-iop3xx/iop321-setup.c @@ -12,7 +12,6 @@ */ #include #include -#include #include #include #include diff --git a/arch/arm/mach-iop3xx/iop321-time.c b/arch/arm/mach-iop3xx/iop321-time.c index d67ac0e5d..04b1a6f7e 100644 --- a/arch/arm/mach-iop3xx/iop321-time.c +++ b/arch/arm/mach-iop3xx/iop321-time.c @@ -85,7 +85,7 @@ iop321_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) static struct irqaction iop321_timer_irq = { .name = "IOP321 Timer Tick", .handler = iop321_timer_interrupt, - .flags = SA_INTERRUPT | SA_TIMER, + .flags = IRQF_DISABLED | IRQF_TIMER, }; static void __init iop321_timer_init(void) diff --git a/arch/arm/mach-iop3xx/iop331-irq.c b/arch/arm/mach-iop3xx/iop331-irq.c index f4d432173..cab11722c 100644 --- a/arch/arm/mach-iop3xx/iop331-irq.c +++ b/arch/arm/mach-iop3xx/iop331-irq.c @@ -77,13 +77,15 @@ iop331_irq_unmask2(unsigned int irq) intctl_write1(iop331_mask1); } -struct irqchip iop331_irqchip1 = { +struct irq_chip iop331_irqchip1 = { + .name = "IOP-1", .ack = iop331_irq_mask1, .mask = iop331_irq_mask1, .unmask = iop331_irq_unmask1, }; -struct irqchip iop331_irqchip2 = { +struct irq_chip iop331_irqchip2 = { + .name = "IOP-2", .ack = iop331_irq_mask2, .mask = iop331_irq_mask2, .unmask = iop331_irq_unmask2, diff --git a/arch/arm/mach-iop3xx/iop331-setup.c b/arch/arm/mach-iop3xx/iop331-setup.c index 7b7b6eea3..3cc98d892 100644 --- a/arch/arm/mach-iop3xx/iop331-setup.c +++ b/arch/arm/mach-iop3xx/iop331-setup.c @@ -11,7 +11,6 @@ */ #include #include -#include #include #include #include diff --git a/arch/arm/mach-iop3xx/iop331-time.c b/arch/arm/mach-iop3xx/iop331-time.c index 3c1f0ebbd..0c09e74c5 100644 --- a/arch/arm/mach-iop3xx/iop331-time.c +++ b/arch/arm/mach-iop3xx/iop331-time.c @@ -82,7 +82,7 @@ iop331_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) static struct irqaction iop331_timer_irq = { .name = "IOP331 Timer Tick", .handler = iop331_timer_interrupt, - .flags = SA_INTERRUPT | SA_TIMER, + .flags = IRQF_DISABLED | IRQF_TIMER, }; static void __init iop331_timer_init(void) diff --git a/arch/arm/mach-ixp2000/core.c b/arch/arm/mach-ixp2000/core.c index 6e8d504ac..7f91f689a 100644 --- a/arch/arm/mach-ixp2000/core.c +++ b/arch/arm/mach-ixp2000/core.c @@ -14,12 +14,12 @@ * warranty of any kind, whether express or implied. */ -#include #include #include #include #include #include +#include #include #include #include @@ -211,7 +211,8 @@ static int ixp2000_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) /* clear timer 1 */ ixp2000_reg_wrb(IXP2000_T1_CLR, 1); - while ((next_jiffy_time - *missing_jiffy_timer_csr) > ticks_per_jiffy) { + while ((signed long)(next_jiffy_time - *missing_jiffy_timer_csr) + >= ticks_per_jiffy) { timer_tick(regs); next_jiffy_time -= ticks_per_jiffy; } @@ -223,7 +224,7 @@ static int ixp2000_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) static struct irqaction ixp2000_timer_irq = { .name = "IXP2000 Timer Tick", - .flags = SA_INTERRUPT | SA_TIMER, + .flags = IRQF_DISABLED | IRQF_TIMER, .handler = ixp2000_timer_interrupt, }; @@ -301,6 +302,7 @@ void gpio_line_config(int line, int direction) } local_irq_restore(flags); } +EXPORT_SYMBOL(gpio_line_config); /************************************************************************* @@ -407,7 +409,7 @@ static void ixp2000_err_irq_handler(unsigned int irq, struct irqdesc *desc, str for(i = 31; i >= 0; i--) { if(status & (1 << i)) { desc = irq_desc + IRQ_IXP2000_DRAM0_MIN_ERR + i; - desc->handle(IRQ_IXP2000_DRAM0_MIN_ERR + i, desc, regs); + desc_handle_irq(IRQ_IXP2000_DRAM0_MIN_ERR + i, desc, regs); } } } diff --git a/arch/arm/mach-ixp2000/enp2611.c b/arch/arm/mach-ixp2000/enp2611.c index 52fac89e9..ac29298c5 100644 --- a/arch/arm/mach-ixp2000/enp2611.c +++ b/arch/arm/mach-ixp2000/enp2611.c @@ -18,7 +18,6 @@ * option) any later version. */ -#include #include #include #include diff --git a/arch/arm/mach-ixp2000/ixdp2400.c b/arch/arm/mach-ixp2000/ixdp2400.c index 091012712..a6f148018 100644 --- a/arch/arm/mach-ixp2000/ixdp2400.c +++ b/arch/arm/mach-ixp2000/ixdp2400.c @@ -14,7 +14,6 @@ * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. */ -#include #include #include #include diff --git a/arch/arm/mach-ixp2000/ixdp2800.c b/arch/arm/mach-ixp2000/ixdp2800.c index 076e3f8ac..91d36d91d 100644 --- a/arch/arm/mach-ixp2000/ixdp2800.c +++ b/arch/arm/mach-ixp2000/ixdp2800.c @@ -14,7 +14,6 @@ * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. */ -#include #include #include #include diff --git a/arch/arm/mach-ixp2000/ixdp2x00.c b/arch/arm/mach-ixp2000/ixdp2x00.c index d628da56b..40eef8b36 100644 --- a/arch/arm/mach-ixp2000/ixdp2x00.c +++ b/arch/arm/mach-ixp2000/ixdp2x00.c @@ -14,7 +14,6 @@ * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. */ -#include #include #include #include @@ -168,7 +167,7 @@ void ixdp2x00_init_irq(volatile unsigned long *stat_reg, volatile unsigned long } /* Hook into PCI interrupt */ - set_irq_chained_handler(IRQ_IXP2000_PCIB, &ixdp2x00_irq_handler); + set_irq_chained_handler(IRQ_IXP2000_PCIB, ixdp2x00_irq_handler); } /************************************************************************* diff --git a/arch/arm/mach-ixp2000/ixdp2x01.c b/arch/arm/mach-ixp2000/ixdp2x01.c index 66915282a..7f42366f6 100644 --- a/arch/arm/mach-ixp2000/ixdp2x01.c +++ b/arch/arm/mach-ixp2000/ixdp2x01.c @@ -15,7 +15,6 @@ * option) any later version. */ -#include #include #include #include @@ -128,7 +127,7 @@ void __init ixdp2x01_init_irq(void) } /* Hook into PCI interrupts */ - set_irq_chained_handler(IRQ_IXP2000_PCIB, &ixdp2x01_irq_handler); + set_irq_chained_handler(IRQ_IXP2000_PCIB, ixdp2x01_irq_handler); } diff --git a/arch/arm/mach-ixp23xx/core.c b/arch/arm/mach-ixp23xx/core.c index affd1d5d7..566a07821 100644 --- a/arch/arm/mach-ixp23xx/core.c +++ b/arch/arm/mach-ixp23xx/core.c @@ -14,7 +14,6 @@ * warranty of any kind, whether express or implied. */ -#include #include #include #include @@ -272,7 +271,7 @@ static void pci_handler(unsigned int irq, struct irqdesc *desc, struct pt_regs * } int_desc = irq_desc + irqno; - int_desc->handle(irqno, int_desc, regs); + desc_handle_irq(irqno, int_desc, regs); desc->chip->unmask(irq); } @@ -334,7 +333,7 @@ void __init ixp23xx_init_irq(void) /************************************************************************* * Timer-tick functions for IXP23xx *************************************************************************/ -#define CLOCK_TICKS_PER_USEC CLOCK_TICK_RATE / (USEC_PER_SEC) +#define CLOCK_TICKS_PER_USEC (CLOCK_TICK_RATE / USEC_PER_SEC) static unsigned long next_jiffy_time; @@ -353,7 +352,7 @@ ixp23xx_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) { /* Clear Pending Interrupt by writing '1' to it */ *IXP23XX_TIMER_STATUS = IXP23XX_TIMER1_INT_PEND; - while ((*IXP23XX_TIMER_CONT - next_jiffy_time) > LATCH) { + while ((signed long)(*IXP23XX_TIMER_CONT - next_jiffy_time) >= LATCH) { timer_tick(regs); next_jiffy_time += LATCH; } @@ -364,7 +363,7 @@ ixp23xx_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) static struct irqaction ixp23xx_timer_irq = { .name = "IXP23xx Timer Tick", .handler = ixp23xx_timer_interrupt, - .flags = SA_INTERRUPT | SA_TIMER, + .flags = IRQF_DISABLED | IRQF_TIMER, }; void __init ixp23xx_init_timer(void) @@ -439,5 +438,6 @@ static struct platform_device *ixp23xx_devices[] __initdata = { void __init ixp23xx_sys_init(void) { + *IXP23XX_EXP_UNIT_FUSE |= 0xf; platform_add_devices(ixp23xx_devices, ARRAY_SIZE(ixp23xx_devices)); } diff --git a/arch/arm/mach-ixp23xx/espresso.c b/arch/arm/mach-ixp23xx/espresso.c index bf688c128..7a85ced56 100644 --- a/arch/arm/mach-ixp23xx/espresso.c +++ b/arch/arm/mach-ixp23xx/espresso.c @@ -10,7 +10,6 @@ * warranty of any kind, whether express or implied. */ -#include #include #include #include @@ -53,9 +52,29 @@ static int __init espresso_pci_init(void) }; subsys_initcall(espresso_pci_init); +static struct physmap_flash_data espresso_flash_data = { + .width = 2, +}; + +static struct resource espresso_flash_resource = { + .start = 0x90000000, + .end = 0x91ffffff, + .flags = IORESOURCE_MEM, +}; + +static struct platform_device espresso_flash = { + .name = "physmap-flash", + .id = 0, + .dev = { + .platform_data = &espresso_flash_data, + }, + .num_resources = 1, + .resource = &espresso_flash_resource, +}; + static void __init espresso_init(void) { - physmap_configure(0x90000000, 0x02000000, 2, NULL); + platform_device_register(&espresso_flash); /* * Mark flash as writeable. diff --git a/arch/arm/mach-ixp23xx/ixdp2351.c b/arch/arm/mach-ixp23xx/ixdp2351.c index 00146c35d..37a32e6bc 100644 --- a/arch/arm/mach-ixp23xx/ixdp2351.c +++ b/arch/arm/mach-ixp23xx/ixdp2351.c @@ -14,12 +14,12 @@ * warranty of any kind, whether express or implied. */ -#include #include #include #include #include #include +#include #include #include #include @@ -37,7 +37,6 @@ #include #include #include -#include #include #include #include @@ -75,7 +74,7 @@ static void ixdp2351_inta_handler(unsigned int irq, struct irqdesc *desc, struct int cpld_irq = IXP23XX_MACH_IRQ(IXDP2351_INTA_IRQ_BASE + i); cpld_desc = irq_desc + cpld_irq; - cpld_desc->handle(cpld_irq, cpld_desc, regs); + desc_handle_irq(cpld_irq, cpld_desc, regs); } } @@ -112,7 +111,7 @@ static void ixdp2351_intb_handler(unsigned int irq, struct irqdesc *desc, struct int cpld_irq = IXP23XX_MACH_IRQ(IXDP2351_INTB_IRQ_BASE + i); cpld_desc = irq_desc + cpld_irq; - cpld_desc->handle(cpld_irq, cpld_desc, regs); + desc_handle_irq(cpld_irq, cpld_desc, regs); } } @@ -159,8 +158,8 @@ void ixdp2351_init_irq(void) } } - set_irq_chained_handler(IRQ_IXP23XX_INTA, &ixdp2351_inta_handler); - set_irq_chained_handler(IRQ_IXP23XX_INTB, &ixdp2351_intb_handler); + set_irq_chained_handler(IRQ_IXP23XX_INTA, ixdp2351_inta_handler); + set_irq_chained_handler(IRQ_IXP23XX_INTB, ixdp2351_intb_handler); } /* @@ -298,9 +297,29 @@ static void __init ixdp2351_map_io(void) iotable_init(ixdp2351_io_desc, ARRAY_SIZE(ixdp2351_io_desc)); } +static struct physmap_flash_data ixdp2351_flash_data = { + .width = 1, +}; + +static struct resource ixdp2351_flash_resource = { + .start = 0x90000000, + .end = 0x93ffffff, + .flags = IORESOURCE_MEM, +}; + +static struct platform_device ixdp2351_flash = { + .name = "physmap-flash", + .id = 0, + .dev = { + .platform_data = &ixdp2351_flash_data, + }, + .num_resources = 1, + .resource = &ixdp2351_flash_resource, +}; + static void __init ixdp2351_init(void) { - physmap_configure(0x90000000, 0x04000000, 1, NULL); + platform_device_register(&ixdp2351_flash); /* * Mark flash as writeable diff --git a/arch/arm/mach-ixp23xx/pci.c b/arch/arm/mach-ixp23xx/pci.c index ac72f94c5..3b34fa35e 100644 --- a/arch/arm/mach-ixp23xx/pci.c +++ b/arch/arm/mach-ixp23xx/pci.c @@ -16,7 +16,6 @@ * option) any later version. */ -#include #include #include #include diff --git a/arch/arm/mach-ixp23xx/roadrunner.c b/arch/arm/mach-ixp23xx/roadrunner.c index 43c14e740..d06e21b70 100644 --- a/arch/arm/mach-ixp23xx/roadrunner.c +++ b/arch/arm/mach-ixp23xx/roadrunner.c @@ -14,7 +14,6 @@ * warranty of any kind, whether express or implied. */ -#include #include #include #include @@ -137,9 +136,29 @@ static int __init roadrunner_pci_init(void) subsys_initcall(roadrunner_pci_init); +static struct physmap_flash_data roadrunner_flash_data = { + .width = 2, +}; + +static struct resource roadrunner_flash_resource = { + .start = 0x90000000, + .end = 0x93ffffff, + .flags = IORESOURCE_MEM, +}; + +static struct platform_device roadrunner_flash = { + .name = "physmap-flash", + .id = 0, + .dev = { + .platform_data = &roadrunner_flash_data, + }, + .num_resources = 1, + .resource = &roadrunner_flash_resource, +}; + static void __init roadrunner_init(void) { - physmap_configure(0x90000000, 0x04000000, 2, NULL); + platform_device_register(&roadrunner_flash); /* * Mark flash as writeable diff --git a/arch/arm/mach-ixp4xx/Kconfig b/arch/arm/mach-ixp4xx/Kconfig index 89762a264..57f23b465 100644 --- a/arch/arm/mach-ixp4xx/Kconfig +++ b/arch/arm/mach-ixp4xx/Kconfig @@ -8,8 +8,18 @@ menu "Intel IXP4xx Implementation Options" comment "IXP4xx Platforms" +config MACH_NSLU2 + bool + prompt "Linksys NSLU2" + select PCI + help + Say 'Y' here if you want your kernel to support Linksys's + NSLU2 NAS device. For more information on this platform, + see http://www.nslu2-linux.org + config ARCH_AVILA bool "Avila" + select PCI help Say 'Y' here if you want your kernel to support the Gateworks Avila Network Platform. For more information on this platform, @@ -17,6 +27,7 @@ config ARCH_AVILA config ARCH_ADI_COYOTE bool "Coyote" + select PCI help Say 'Y' here if you want your kernel to support the ADI Engineering Coyote Gateway Reference Platform. For more @@ -61,6 +72,15 @@ config ARCH_PRPMC1100 PrPCM1100 Processor Mezanine Module. For more information on this platform, see . +config MACH_NAS100D + bool + prompt "NAS100D" + select PCI + help + Say 'Y' here if you want your kernel to support Iomega's + NAS 100d device. For more information on this platform, + see http://www.nslu2-linux.org/wiki/NAS100d/HomePage + # # Avila and IXDP share the same source for now. Will change in future # @@ -80,6 +100,7 @@ config CPU_IXP46X config MACH_GTWX5715 bool "Gemtek WX5715 (Linksys WRV54G)" depends on ARCH_IXP4XX + select PCI help This board is currently inside the Linksys WRV54G Gateways. @@ -94,11 +115,16 @@ config MACH_GTWX5715 "High Speed" UART is n/c (as far as I can tell) 20 Pin ARM/Xscale JTAG interface on J2 - comment "IXP4xx Options" +config DMABOUNCE + bool + default y + depends on PCI + config IXP4XX_INDIRECT_PCI bool "Use indirect PCI memory access" + depends on PCI help IXP4xx provides two methods of accessing PCI memory space: @@ -112,7 +138,7 @@ config IXP4XX_INDIRECT_PCI 2) If > 64MB of memory space is required, the IXP4xx can be configured to use indirect registers to access PCI This allows for up to 128MB (0x48000000 to 0x4fffffff) of memory on the bus. - The disadvantadge of this is that every PCI access requires + The disadvantage of this is that every PCI access requires three local register accesses plus a spinlock, but in some cases the performance hit is acceptable. In addition, you cannot mmap() PCI devices in this case due to the indirect nature diff --git a/arch/arm/mach-ixp4xx/Makefile b/arch/arm/mach-ixp4xx/Makefile index ddecbda4a..640315d8b 100644 --- a/arch/arm/mach-ixp4xx/Makefile +++ b/arch/arm/mach-ixp4xx/Makefile @@ -2,10 +2,23 @@ # Makefile for the linux kernel. # -obj-y += common.o common-pci.o +obj-pci-y := +obj-pci-n := -obj-$(CONFIG_ARCH_IXDP4XX) += ixdp425-pci.o ixdp425-setup.o -obj-$(CONFIG_MACH_IXDPG425) += ixdpg425-pci.o coyote-setup.o -obj-$(CONFIG_ARCH_ADI_COYOTE) += coyote-pci.o coyote-setup.o -obj-$(CONFIG_MACH_GTWX5715) += gtwx5715-pci.o gtwx5715-setup.o +obj-pci-$(CONFIG_ARCH_IXDP4XX) += ixdp425-pci.o +obj-pci-$(CONFIG_MACH_IXDPG425) += ixdpg425-pci.o +obj-pci-$(CONFIG_ARCH_ADI_COYOTE) += coyote-pci.o +obj-pci-$(CONFIG_MACH_GTWX5715) += gtwx5715-pci.o +obj-pci-$(CONFIG_MACH_NSLU2) += nslu2-pci.o +obj-pci-$(CONFIG_MACH_NAS100D) += nas100d-pci.o +obj-y += common.o + +obj-$(CONFIG_ARCH_IXDP4XX) += ixdp425-setup.o +obj-$(CONFIG_MACH_IXDPG425) += coyote-setup.o +obj-$(CONFIG_ARCH_ADI_COYOTE) += coyote-setup.o +obj-$(CONFIG_MACH_GTWX5715) += gtwx5715-setup.o +obj-$(CONFIG_MACH_NSLU2) += nslu2-setup.o nslu2-power.o +obj-$(CONFIG_MACH_NAS100D) += nas100d-setup.o nas100d-power.o + +obj-$(CONFIG_PCI) += $(obj-pci-$(CONFIG_PCI)) common-pci.o diff --git a/arch/arm/mach-ixp4xx/common-pci.c b/arch/arm/mach-ixp4xx/common-pci.c index aa92e3708..9562177b5 100644 --- a/arch/arm/mach-ixp4xx/common-pci.c +++ b/arch/arm/mach-ixp4xx/common-pci.c @@ -341,6 +341,29 @@ int dma_needs_bounce(struct device *dev, dma_addr_t dma_addr, size_t size) return (dev->bus == &pci_bus_type ) && ((dma_addr + size) >= SZ_64M); } +/* + * Only first 64MB of memory can be accessed via PCI. + * We use GFP_DMA to allocate safe buffers to do map/unmap. + * This is really ugly and we need a better way of specifying + * DMA-capable regions of memory. + */ +void __init ixp4xx_adjust_zones(int node, unsigned long *zone_size, + unsigned long *zhole_size) +{ + unsigned int sz = SZ_64M >> PAGE_SHIFT; + + /* + * Only adjust if > 64M on current system + */ + if (node || (zone_size[0] <= sz)) + return; + + zone_size[1] = zone_size[0] - sz; + zone_size[0] = sz; + zhole_size[1] = zhole_size[0]; + zhole_size[0] = 0; +} + void __init ixp4xx_pci_preinit(void) { unsigned long processor_id; @@ -427,7 +450,7 @@ void __init ixp4xx_pci_preinit(void) #ifdef __ARMEB__ *PCI_CSR = PCI_CSR_IC | PCI_CSR_ABE | PCI_CSR_PDS | PCI_CSR_ADS; #else - *PCI_CSR = PCI_CSR_IC; + *PCI_CSR = PCI_CSR_IC | PCI_CSR_ABE; #endif pr_debug("DONE\n"); @@ -440,7 +463,7 @@ int ixp4xx_setup(int nr, struct pci_sys_data *sys) if (nr >= 1) return 0; - res = kmalloc(sizeof(*res) * 2, GFP_KERNEL); + res = kzalloc(sizeof(*res) * 2, GFP_KERNEL); if (res == NULL) { /* * If we're out of memory this early, something is wrong, @@ -448,13 +471,12 @@ int ixp4xx_setup(int nr, struct pci_sys_data *sys) */ panic("PCI: unable to allocate resources?\n"); } - memset(res, 0, sizeof(*res) * 2); local_write_config(PCI_COMMAND, 2, PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY); res[0].name = "PCI I/O Space"; - res[0].start = 0x00001000; - res[0].end = 0xffff0000; + res[0].start = 0x00000000; + res[0].end = 0x0000ffff; res[0].flags = IORESOURCE_IO; res[1].name = "PCI Memory Space"; @@ -510,8 +532,6 @@ pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask) return -EIO; } -EXPORT_SYMBOL(pci_set_dma_mask); -EXPORT_SYMBOL(pci_set_consistent_dma_mask); EXPORT_SYMBOL(ixp4xx_pci_read); EXPORT_SYMBOL(ixp4xx_pci_write); diff --git a/arch/arm/mach-ixp4xx/common.c b/arch/arm/mach-ixp4xx/common.c index 267ba02d7..7c25dbd5a 100644 --- a/arch/arm/mach-ixp4xx/common.c +++ b/arch/arm/mach-ixp4xx/common.c @@ -13,13 +13,13 @@ * warranty of any kind, whether express or implied. */ -#include #include #include #include #include #include #include +#include #include #include #include @@ -38,110 +38,34 @@ #include #include -enum ixp4xx_irq_type { - IXP4XX_IRQ_LEVEL, IXP4XX_IRQ_EDGE -}; -static void ixp4xx_config_irq(unsigned irq, enum ixp4xx_irq_type type); - -/************************************************************************* - * GPIO acces functions - *************************************************************************/ - -/* - * Configure GPIO line for input, interrupt, or output operation - * - * TODO: Enable/disable the irq_desc based on interrupt or output mode. - * TODO: Should these be named ixp4xx_gpio_? - */ -void gpio_line_config(u8 line, u32 style) -{ - static const int gpio2irq[] = { - 6, 7, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 - }; - u32 enable; - volatile u32 *int_reg; - u32 int_style; - enum ixp4xx_irq_type irq_type; - - enable = *IXP4XX_GPIO_GPOER; - - if (style & IXP4XX_GPIO_OUT) { - enable &= ~((1) << line); - } else if (style & IXP4XX_GPIO_IN) { - enable |= ((1) << line); - - switch (style & IXP4XX_GPIO_INTSTYLE_MASK) - { - case (IXP4XX_GPIO_ACTIVE_HIGH): - int_style = IXP4XX_GPIO_STYLE_ACTIVE_HIGH; - irq_type = IXP4XX_IRQ_LEVEL; - break; - case (IXP4XX_GPIO_ACTIVE_LOW): - int_style = IXP4XX_GPIO_STYLE_ACTIVE_LOW; - irq_type = IXP4XX_IRQ_LEVEL; - break; - case (IXP4XX_GPIO_RISING_EDGE): - int_style = IXP4XX_GPIO_STYLE_RISING_EDGE; - irq_type = IXP4XX_IRQ_EDGE; - break; - case (IXP4XX_GPIO_FALLING_EDGE): - int_style = IXP4XX_GPIO_STYLE_FALLING_EDGE; - irq_type = IXP4XX_IRQ_EDGE; - break; - case (IXP4XX_GPIO_TRANSITIONAL): - int_style = IXP4XX_GPIO_STYLE_TRANSITIONAL; - irq_type = IXP4XX_IRQ_EDGE; - break; - default: - int_style = IXP4XX_GPIO_STYLE_ACTIVE_HIGH; - irq_type = IXP4XX_IRQ_LEVEL; - break; - } - - if (style & IXP4XX_GPIO_INTSTYLE_MASK) - ixp4xx_config_irq(gpio2irq[line], irq_type); - - if (line >= 8) { /* pins 8-15 */ - line -= 8; - int_reg = IXP4XX_GPIO_GPIT2R; - } - else { /* pins 0-7 */ - int_reg = IXP4XX_GPIO_GPIT1R; - } - - /* Clear the style for the appropriate pin */ - *int_reg &= ~(IXP4XX_GPIO_STYLE_CLEAR << - (line * IXP4XX_GPIO_STYLE_SIZE)); - - /* Set the new style */ - *int_reg |= (int_style << (line * IXP4XX_GPIO_STYLE_SIZE)); - } - - *IXP4XX_GPIO_GPOER = enable; -} - -EXPORT_SYMBOL(gpio_line_config); - /************************************************************************* * IXP4xx chipset I/O mapping *************************************************************************/ static struct map_desc ixp4xx_io_desc[] __initdata = { { /* UART, Interrupt ctrl, GPIO, timers, NPEs, MACs, USB .... */ .virtual = IXP4XX_PERIPHERAL_BASE_VIRT, - .physical = IXP4XX_PERIPHERAL_BASE_PHYS, + .pfn = __phys_to_pfn(IXP4XX_PERIPHERAL_BASE_PHYS), .length = IXP4XX_PERIPHERAL_REGION_SIZE, .type = MT_DEVICE }, { /* Expansion Bus Config Registers */ .virtual = IXP4XX_EXP_CFG_BASE_VIRT, - .physical = IXP4XX_EXP_CFG_BASE_PHYS, + .pfn = __phys_to_pfn(IXP4XX_EXP_CFG_BASE_PHYS), .length = IXP4XX_EXP_CFG_REGION_SIZE, .type = MT_DEVICE }, { /* PCI Registers */ .virtual = IXP4XX_PCI_CFG_BASE_VIRT, - .physical = IXP4XX_PCI_CFG_BASE_PHYS, + .pfn = __phys_to_pfn(IXP4XX_PCI_CFG_BASE_PHYS), .length = IXP4XX_PCI_CFG_REGION_SIZE, .type = MT_DEVICE + }, +#ifdef CONFIG_DEBUG_LL + { /* Debug UART mapping */ + .virtual = IXP4XX_DEBUG_UART_BASE_VIRT, + .pfn = __phys_to_pfn(IXP4XX_DEBUG_UART_BASE_PHYS), + .length = IXP4XX_DEBUG_UART_REGION_SIZE, + .type = MT_DEVICE } +#endif }; void __init ixp4xx_map_io(void) @@ -157,6 +81,83 @@ void __init ixp4xx_map_io(void) * (be it PCI or something else) configures that GPIO line * as an IRQ. **************************************************************************/ +enum ixp4xx_irq_type { + IXP4XX_IRQ_LEVEL, IXP4XX_IRQ_EDGE +}; + +static void ixp4xx_config_irq(unsigned irq, enum ixp4xx_irq_type type); + +/* + * IRQ -> GPIO mapping table + */ +static signed char irq2gpio[32] = { + -1, -1, -1, -1, -1, -1, 0, 1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, -1, -1, +}; + +static int ixp4xx_set_irq_type(unsigned int irq, unsigned int type) +{ + int line = irq2gpio[irq]; + u32 int_style; + enum ixp4xx_irq_type irq_type; + volatile u32 *int_reg; + + /* + * Only for GPIO IRQs + */ + if (line < 0) + return -EINVAL; + + switch (type){ + case IRQT_BOTHEDGE: + int_style = IXP4XX_GPIO_STYLE_TRANSITIONAL; + irq_type = IXP4XX_IRQ_EDGE; + break; + case IRQT_RISING: + int_style = IXP4XX_GPIO_STYLE_RISING_EDGE; + irq_type = IXP4XX_IRQ_EDGE; + break; + case IRQT_FALLING: + int_style = IXP4XX_GPIO_STYLE_FALLING_EDGE; + irq_type = IXP4XX_IRQ_EDGE; + break; + case IRQT_HIGH: + int_style = IXP4XX_GPIO_STYLE_ACTIVE_HIGH; + irq_type = IXP4XX_IRQ_LEVEL; + break; + case IRQT_LOW: + int_style = IXP4XX_GPIO_STYLE_ACTIVE_LOW; + irq_type = IXP4XX_IRQ_LEVEL; + break; + default: + return -EINVAL; + } + ixp4xx_config_irq(irq, irq_type); + + if (line >= 8) { /* pins 8-15 */ + line -= 8; + int_reg = IXP4XX_GPIO_GPIT2R; + } else { /* pins 0-7 */ + int_reg = IXP4XX_GPIO_GPIT1R; + } + + /* Clear the style for the appropriate pin */ + *int_reg &= ~(IXP4XX_GPIO_STYLE_CLEAR << + (line * IXP4XX_GPIO_STYLE_SIZE)); + + *IXP4XX_GPIO_GPISR = (1 << line); + + /* Set the new style */ + *int_reg |= (int_style << (line * IXP4XX_GPIO_STYLE_SIZE)); + + /* Configure the line as an input */ + gpio_line_config(line, IXP4XX_GPIO_IN); + + return 0; +} + static void ixp4xx_irq_mask(unsigned int irq) { if (cpu_is_ixp46x() && irq >= 32) @@ -175,16 +176,10 @@ static void ixp4xx_irq_unmask(unsigned int irq) static void ixp4xx_irq_ack(unsigned int irq) { - static int irq2gpio[32] = { - -1, -1, -1, -1, -1, -1, 0, 1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, -1, -1, - }; int line = (irq < 32) ? irq2gpio[irq] : -1; if (line >= 0) - gpio_line_isr_clear(line); + *IXP4XX_GPIO_GPISR = (1 << line); } /* @@ -198,15 +193,17 @@ static void ixp4xx_irq_level_unmask(unsigned int irq) } static struct irqchip ixp4xx_irq_level_chip = { - .ack = ixp4xx_irq_mask, - .mask = ixp4xx_irq_mask, - .unmask = ixp4xx_irq_level_unmask, + .ack = ixp4xx_irq_mask, + .mask = ixp4xx_irq_mask, + .unmask = ixp4xx_irq_level_unmask, + .set_type = ixp4xx_set_irq_type, }; static struct irqchip ixp4xx_irq_edge_chip = { - .ack = ixp4xx_irq_ack, - .mask = ixp4xx_irq_mask, - .unmask = ixp4xx_irq_unmask, + .ack = ixp4xx_irq_ack, + .mask = ixp4xx_irq_mask, + .unmask = ixp4xx_irq_unmask, + .set_type = ixp4xx_set_irq_type, }; static void ixp4xx_config_irq(unsigned irq, enum ixp4xx_irq_type type) @@ -278,7 +275,7 @@ static irqreturn_t ixp4xx_timer_interrupt(int irq, void *dev_id, struct pt_regs /* * Catch up with the real idea of time */ - while ((*IXP4XX_OSTS - last_jiffy_time) > LATCH) { + while ((signed long)(*IXP4XX_OSTS - last_jiffy_time) >= LATCH) { timer_tick(regs); last_jiffy_time += LATCH; } @@ -290,8 +287,8 @@ static irqreturn_t ixp4xx_timer_interrupt(int irq, void *dev_id, struct pt_regs static struct irqaction ixp4xx_timer_irq = { .name = "IXP4xx Timer Tick", - .flags = SA_INTERRUPT, - .handler = ixp4xx_timer_interrupt + .flags = IRQF_DISABLED | IRQF_TIMER, + .handler = ixp4xx_timer_interrupt, }; static void __init ixp4xx_timer_init(void) @@ -343,11 +340,28 @@ static struct platform_device *ixp46x_devices[] __initdata = { &ixp46x_i2c_controller }; +unsigned long ixp4xx_exp_bus_size; +EXPORT_SYMBOL(ixp4xx_exp_bus_size); + void __init ixp4xx_sys_init(void) { + ixp4xx_exp_bus_size = SZ_16M; + if (cpu_is_ixp46x()) { + int region; + platform_add_devices(ixp46x_devices, ARRAY_SIZE(ixp46x_devices)); + + for (region = 0; region < 7; region++) { + if((*(IXP4XX_EXP_REG(0x4 * region)) & 0x200)) { + ixp4xx_exp_bus_size = SZ_32M; + break; + } + } } + + printk("IXP4xx: Using %luMiB expansion bus window size\n", + ixp4xx_exp_bus_size >> 20); } diff --git a/arch/arm/mach-ixp4xx/coyote-pci.c b/arch/arm/mach-ixp4xx/coyote-pci.c index afafb42ae..2cebb2878 100644 --- a/arch/arm/mach-ixp4xx/coyote-pci.c +++ b/arch/arm/mach-ixp4xx/coyote-pci.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -30,14 +31,8 @@ extern struct pci_bus *ixp4xx_scan_bus(int nr, struct pci_sys_data *sys); void __init coyote_pci_preinit(void) { - gpio_line_config(COYOTE_PCI_SLOT0_PIN, - IXP4XX_GPIO_IN | IXP4XX_GPIO_ACTIVE_LOW); - - gpio_line_config(COYOTE_PCI_SLOT1_PIN, - IXP4XX_GPIO_IN | IXP4XX_GPIO_ACTIVE_LOW); - - gpio_line_isr_clear(COYOTE_PCI_SLOT0_PIN); - gpio_line_isr_clear(COYOTE_PCI_SLOT1_PIN); + set_irq_type(IRQ_COYOTE_PCI_SLOT0, IRQT_LOW); + set_irq_type(IRQ_COYOTE_PCI_SLOT1, IRQT_LOW); ixp4xx_pci_preinit(); } diff --git a/arch/arm/mach-ixp4xx/gtwx5715-setup.c b/arch/arm/mach-ixp4xx/gtwx5715-setup.c index e77c86efd..30f1300e0 100644 --- a/arch/arm/mach-ixp4xx/gtwx5715-setup.c +++ b/arch/arm/mach-ixp4xx/gtwx5715-setup.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include @@ -83,7 +84,7 @@ static struct plat_serial8250_port gtwx5715_uart_platform_data[] = { .mapbase = IXP4XX_UART2_BASE_PHYS, .membase = (char *)IXP4XX_UART2_BASE_VIRT + REG_OFFSET, .irq = IRQ_IXP4XX_UART2, - .flags = UPF_BOOT_AUTOCONF, + .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, .iotype = UPIO_MEM, .regshift = 2, .uartclk = IXP4XX_UART_XTAL, @@ -93,7 +94,7 @@ static struct plat_serial8250_port gtwx5715_uart_platform_data[] = { static struct platform_device gtwx5715_uart_device = { .name = "serial8250", - .id = 0, + .id = PLAT8250_DEV_PLATFORM, .dev = { .platform_data = gtwx5715_uart_platform_data, }, @@ -101,20 +102,12 @@ static struct platform_device gtwx5715_uart_device = { .resource = gtwx5715_uart_resources, }; - -void __init gtwx5715_map_io(void) -{ - ixp4xx_map_io(); -} - static struct flash_platform_data gtwx5715_flash_data = { .map_name = "cfi_probe", .width = 2, }; static struct resource gtwx5715_flash_resource = { - .start = GTWX5715_FLASH_BASE, - .end = GTWX5715_FLASH_BASE + GTWX5715_FLASH_SIZE, .flags = IORESOURCE_MEM, }; @@ -135,19 +128,24 @@ static struct platform_device *gtwx5715_devices[] __initdata = { static void __init gtwx5715_init(void) { + ixp4xx_sys_init(); + + gtwx5715_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); + gtwx5715_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + SZ_8M - 1; + platform_add_devices(gtwx5715_devices, ARRAY_SIZE(gtwx5715_devices)); } MACHINE_START(GTWX5715, "Gemtek GTWX5715 (Linksys WRV54G)") - MAINTAINER("George Joseph") - BOOT_MEM(PHYS_OFFSET, IXP4XX_UART2_BASE_PHYS, - IXP4XX_UART2_BASE_VIRT) - MAPIO(gtwx5715_map_io) - INITIRQ(ixp4xx_init_irq) - .timer = &ixp4xx_timer, - BOOT_PARAMS(0x0100) - INIT_MACHINE(gtwx5715_init) + /* Maintainer: George Joseph */ + .phys_io = IXP4XX_UART2_BASE_PHYS, + .io_pg_offst = ((IXP4XX_UART2_BASE_VIRT) >> 18) & 0xfffc, + .map_io = ixp4xx_map_io, + .init_irq = ixp4xx_init_irq, + .timer = &ixp4xx_timer, + .boot_params = 0x0100, + .init_machine = gtwx5715_init, MACHINE_END diff --git a/arch/arm/mach-ixp4xx/ixdp425-pci.c b/arch/arm/mach-ixp4xx/ixdp425-pci.c index c2ab9ebb5..d5156c043 100644 --- a/arch/arm/mach-ixp4xx/ixdp425-pci.c +++ b/arch/arm/mach-ixp4xx/ixdp425-pci.c @@ -15,9 +15,9 @@ */ #include -#include #include #include +#include #include #include @@ -27,19 +27,10 @@ void __init ixdp425_pci_preinit(void) { - gpio_line_config(IXDP425_PCI_INTA_PIN, - IXP4XX_GPIO_IN | IXP4XX_GPIO_ACTIVE_LOW); - gpio_line_config(IXDP425_PCI_INTB_PIN, - IXP4XX_GPIO_IN | IXP4XX_GPIO_ACTIVE_LOW); - gpio_line_config(IXDP425_PCI_INTC_PIN, - IXP4XX_GPIO_IN | IXP4XX_GPIO_ACTIVE_LOW); - gpio_line_config(IXDP425_PCI_INTD_PIN, - IXP4XX_GPIO_IN | IXP4XX_GPIO_ACTIVE_LOW); - - gpio_line_isr_clear(IXDP425_PCI_INTA_PIN); - gpio_line_isr_clear(IXDP425_PCI_INTB_PIN); - gpio_line_isr_clear(IXDP425_PCI_INTC_PIN); - gpio_line_isr_clear(IXDP425_PCI_INTD_PIN); + set_irq_type(IRQ_IXDP425_PCI_INTA, IRQT_LOW); + set_irq_type(IRQ_IXDP425_PCI_INTB, IRQT_LOW); + set_irq_type(IRQ_IXDP425_PCI_INTC, IRQT_LOW); + set_irq_type(IRQ_IXDP425_PCI_INTD, IRQT_LOW); ixp4xx_pci_preinit(); } diff --git a/arch/arm/mach-ixp4xx/ixdpg425-pci.c b/arch/arm/mach-ixp4xx/ixdpg425-pci.c index 526fb6175..ed5270800 100644 --- a/arch/arm/mach-ixp4xx/ixdpg425-pci.c +++ b/arch/arm/mach-ixp4xx/ixdpg425-pci.c @@ -16,10 +16,10 @@ #include #include #include +#include #include #include -#include #include diff --git a/arch/arm/mach-ixp4xx/nas100d-pci.c b/arch/arm/mach-ixp4xx/nas100d-pci.c index 26b7c001f..b8ebaf4a9 100644 --- a/arch/arm/mach-ixp4xx/nas100d-pci.c +++ b/arch/arm/mach-ixp4xx/nas100d-pci.c @@ -15,9 +15,9 @@ * */ -#include #include #include +#include #include #include diff --git a/arch/arm/mach-ixp4xx/nas100d-power.c b/arch/arm/mach-ixp4xx/nas100d-power.c index 99d333d7e..81ffcae1f 100644 --- a/arch/arm/mach-ixp4xx/nas100d-power.c +++ b/arch/arm/mach-ixp4xx/nas100d-power.c @@ -17,14 +17,13 @@ * */ +#include +#include #include #include -#include #include -extern void ctrl_alt_del(void); - static irqreturn_t nas100d_reset_handler(int irq, void *dev_id, struct pt_regs *regs) { /* Signal init to do the ctrlaltdel action, this will bypass init if @@ -43,7 +42,7 @@ static int __init nas100d_power_init(void) set_irq_type(NAS100D_RB_IRQ, IRQT_LOW); if (request_irq(NAS100D_RB_IRQ, &nas100d_reset_handler, - SA_INTERRUPT, "NAS100D reset button", NULL) < 0) { + IRQF_DISABLED, "NAS100D reset button", NULL) < 0) { printk(KERN_DEBUG "Reset Button IRQ %d not available\n", NAS100D_RB_IRQ); diff --git a/arch/arm/mach-ixp4xx/nas100d-setup.c b/arch/arm/mach-ixp4xx/nas100d-setup.c index a3b4c6ac5..9a31444d9 100644 --- a/arch/arm/mach-ixp4xx/nas100d-setup.c +++ b/arch/arm/mach-ixp4xx/nas100d-setup.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -37,6 +38,36 @@ static struct platform_device nas100d_flash = { .resource = &nas100d_flash_resource, }; +#ifdef CONFIG_LEDS_IXP4XX +static struct resource nas100d_led_resources[] = { + { + .name = "wlan", /* green led */ + .start = 0, + .end = 0, + .flags = IXP4XX_GPIO_LOW, + }, + { + .name = "ready", /* blue power led (off is flashing!) */ + .start = 15, + .end = 15, + .flags = IXP4XX_GPIO_LOW, + }, + { + .name = "disk", /* yellow led */ + .start = 3, + .end = 3, + .flags = IXP4XX_GPIO_LOW, + }, +}; + +static struct platform_device nas100d_leds = { + .name = "IXP4XX-GPIO-LED", + .id = -1, + .num_resources = ARRAY_SIZE(nas100d_led_resources), + .resource = nas100d_led_resources, +}; +#endif + static struct ixp4xx_i2c_pins nas100d_i2c_gpio_pins = { .sda_pin = NAS100D_SDA_PIN, .scl_pin = NAS100D_SCL_PIN, @@ -95,7 +126,9 @@ static struct platform_device nas100d_uart = { static struct platform_device *nas100d_devices[] __initdata = { &nas100d_i2c_controller, &nas100d_flash, - &nas100d_uart, +#ifdef CONFIG_LEDS_IXP4XX + &nas100d_leds, +#endif }; static void nas100d_power_off(void) @@ -122,6 +155,12 @@ static void __init nas100d_init(void) pm_power_off = nas100d_power_off; + /* This is only useful on a modified machine, but it is valuable + * to have it first in order to see debug messages, and so that + * it does *not* get removed if platform_add_devices fails! + */ + (void)platform_device_register(&nas100d_uart); + platform_add_devices(nas100d_devices, ARRAY_SIZE(nas100d_devices)); } diff --git a/arch/arm/mach-ixp4xx/nslu2-pci.c b/arch/arm/mach-ixp4xx/nslu2-pci.c index ece860444..04661fef9 100644 --- a/arch/arm/mach-ixp4xx/nslu2-pci.c +++ b/arch/arm/mach-ixp4xx/nslu2-pci.c @@ -15,9 +15,9 @@ * */ -#include #include #include +#include #include #include diff --git a/arch/arm/mach-ixp4xx/nslu2-power.c b/arch/arm/mach-ixp4xx/nslu2-power.c index d80c362bc..a29b3b2b6 100644 --- a/arch/arm/mach-ixp4xx/nslu2-power.c +++ b/arch/arm/mach-ixp4xx/nslu2-power.c @@ -19,12 +19,12 @@ #include #include +#include #include +#include #include -extern void ctrl_alt_del(void); - static irqreturn_t nslu2_power_handler(int irq, void *dev_id, struct pt_regs *regs) { /* Signal init to do the ctrlaltdel action, this will bypass init if @@ -55,7 +55,7 @@ static int __init nslu2_power_init(void) set_irq_type(NSLU2_PB_IRQ, IRQT_HIGH); if (request_irq(NSLU2_RB_IRQ, &nslu2_reset_handler, - SA_INTERRUPT, "NSLU2 reset button", NULL) < 0) { + IRQF_DISABLED, "NSLU2 reset button", NULL) < 0) { printk(KERN_DEBUG "Reset Button IRQ %d not available\n", NSLU2_RB_IRQ); @@ -64,7 +64,7 @@ static int __init nslu2_power_init(void) } if (request_irq(NSLU2_PB_IRQ, &nslu2_power_handler, - SA_INTERRUPT, "NSLU2 power button", NULL) < 0) { + IRQF_DISABLED, "NSLU2 power button", NULL) < 0) { printk(KERN_DEBUG "Power Button IRQ %d not available\n", NSLU2_PB_IRQ); diff --git a/arch/arm/mach-ixp4xx/nslu2-setup.c b/arch/arm/mach-ixp4xx/nslu2-setup.c index 55411f21d..749a33749 100644 --- a/arch/arm/mach-ixp4xx/nslu2-setup.c +++ b/arch/arm/mach-ixp4xx/nslu2-setup.c @@ -7,6 +7,7 @@ * Copyright (C) 2003-2004 MontaVista Software, Inc. * * Author: Mark Rakes + * Author: Rod Whitby * Maintainers: http://www.nslu2-linux.org/ * * Fixed missing init_time in MACHINE_START kas11 10/22/04 @@ -16,6 +17,7 @@ #include #include #include +#include #include #include @@ -43,6 +45,42 @@ static struct ixp4xx_i2c_pins nslu2_i2c_gpio_pins = { .scl_pin = NSLU2_SCL_PIN, }; +#ifdef CONFIG_LEDS_IXP4XX +static struct resource nslu2_led_resources[] = { + { + .name = "ready", /* green led */ + .start = NSLU2_LED_GRN, + .end = NSLU2_LED_GRN, + .flags = IXP4XX_GPIO_HIGH, + }, + { + .name = "status", /* red led */ + .start = NSLU2_LED_RED, + .end = NSLU2_LED_RED, + .flags = IXP4XX_GPIO_HIGH, + }, + { + .name = "disk-1", + .start = NSLU2_LED_DISK1, + .end = NSLU2_LED_DISK1, + .flags = IXP4XX_GPIO_LOW, + }, + { + .name = "disk-2", + .start = NSLU2_LED_DISK2, + .end = NSLU2_LED_DISK2, + .flags = IXP4XX_GPIO_LOW, + }, +}; + +static struct platform_device nslu2_leds = { + .name = "IXP4XX-GPIO-LED", + .id = -1, + .num_resources = ARRAY_SIZE(nslu2_led_resources), + .resource = nslu2_led_resources, +}; +#endif + static struct platform_device nslu2_i2c_controller = { .name = "IXP4XX-I2C", .id = 0, @@ -102,8 +140,10 @@ static struct platform_device nslu2_uart = { static struct platform_device *nslu2_devices[] __initdata = { &nslu2_i2c_controller, &nslu2_flash, - &nslu2_uart, &nslu2_beeper, +#ifdef CONFIG_LEDS_IXP4XX + &nslu2_leds, +#endif }; static void nslu2_power_off(void) @@ -127,6 +167,12 @@ static void __init nslu2_init(void) pm_power_off = nslu2_power_off; + /* This is only useful on a modified machine, but it is valuable + * to have it first in order to see debug messages, and so that + * it does *not* get removed if platform_add_devices fails! + */ + (void)platform_device_register(&nslu2_uart); + platform_add_devices(nslu2_devices, ARRAY_SIZE(nslu2_devices)); } diff --git a/arch/arm/mach-l7200/core.c b/arch/arm/mach-l7200/core.c index ac626436e..b7af5640e 100644 --- a/arch/arm/mach-l7200/core.c +++ b/arch/arm/mach-l7200/core.c @@ -7,6 +7,7 @@ */ #include #include +#include #include #include diff --git a/arch/arm/mach-lh7a40x/Kconfig b/arch/arm/mach-lh7a40x/Kconfig index 8a17867a6..558a34f53 100644 --- a/arch/arm/mach-lh7a40x/Kconfig +++ b/arch/arm/mach-lh7a40x/Kconfig @@ -14,6 +14,7 @@ config MACH_LPD7A400 bool "LPD7A400 Card Engine" select ARCH_LH7A400 # select IDE_POLL + select HAS_TOUCHSCREEN_ADS7843_LH7 help Say Y here if you are using Logic Product Development's LPD7A400 CardEngine. For the time being, the LPD7A400 and @@ -23,6 +24,7 @@ config MACH_LPD7A404 bool "LPD7A404 Card Engine" select ARCH_LH7A404 # select IDE_POLL + select HAS_TOUCHSCREEN_ADC_LH7 help Say Y here if you are using Logic Product Development's LPD7A404 CardEngine. For the time being, the LPD7A400 and @@ -34,6 +36,9 @@ config ARCH_LH7A400 config ARCH_LH7A404 bool +config LPD7A40X_CPLD_SSP + bool + config LH7A40X_CONTIGMEM bool "Disable NUMA Support" depends on ARCH_LH7A40X diff --git a/arch/arm/mach-lh7a40x/Makefile b/arch/arm/mach-lh7a40x/Makefile index e90512dbc..94b8615fb 100644 --- a/arch/arm/mach-lh7a40x/Makefile +++ b/arch/arm/mach-lh7a40x/Makefile @@ -4,11 +4,14 @@ # Object file lists. -obj-y := time.o -obj-$(CONFIG_MACH_KEV7A400) += arch-kev7a400.o irq-lh7a400.o -obj-$(CONFIG_MACH_LPD7A400) += arch-lpd7a40x.o irq-lh7a400.o -obj-$(CONFIG_MACH_LPD7A404) += arch-lpd7a40x.o irq-lh7a404.o - -obj-m := -obj-n := -obj- := +obj-y := time.o clocks.o +obj-m := +obj-n := +obj- := + +obj-$(CONFIG_MACH_KEV7A400) += arch-kev7a400.o irq-lh7a400.o +obj-$(CONFIG_MACH_LPD7A400) += arch-lpd7a40x.o irq-lh7a400.o +obj-$(CONFIG_MACH_LPD7A404) += arch-lpd7a40x.o irq-lh7a404.o +obj-$(CONFIG_LPD7A40X_CPLD_SSP) += ssp-cpld.o +obj-$(CONFIG_FB_ARMCLCD) += clcd.o + diff --git a/arch/arm/mach-lh7a40x/arch-kev7a400.c b/arch/arm/mach-lh7a40x/arch-kev7a400.c index 2cccc27c6..4f2ab4880 100644 --- a/arch/arm/mach-lh7a40x/arch-kev7a400.c +++ b/arch/arm/mach-lh7a40x/arch-kev7a400.c @@ -63,7 +63,8 @@ static void kev7a400_unmask_cpld_irq (u32 irq) CPLD_WR_PB_INT_MASK = CPLD_IRQ_mask; } -static struct irqchip kev7a400_cpld_chip = { +static struct irq_chip kev7a400_cpld_chip = { + .name = "CPLD", .ack = kev7a400_ack_cpld_irq, .mask = kev7a400_mask_cpld_irq, .unmask = kev7a400_unmask_cpld_irq, diff --git a/arch/arm/mach-lh7a40x/arch-lpd7a40x.c b/arch/arm/mach-lh7a40x/arch-lpd7a40x.c index 12e23277c..a6910114b 100644 --- a/arch/arm/mach-lh7a40x/arch-lpd7a40x.c +++ b/arch/arm/mach-lh7a40x/arch-lpd7a40x.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -23,6 +24,28 @@ #include "common.h" +#define CPLD_INT_NETHERNET (1<<0) +#define CPLD_INTMASK_ETHERNET (1<<2) +#if defined (CONFIG_MACH_LPD7A400) +# define CPLD_INT_NTOUCH (1<<1) +# define CPLD_INTMASK_TOUCH (1<<3) +# define CPLD_INT_PEN (1<<4) +# define CPLD_INTMASK_PEN (1<<4) +# define CPLD_INT_PIRQ (1<<4) +#endif +#define CPLD_INTMASK_CPLD (1<<7) +#define CPLD_INT_CPLD (1<<6) + +#define CPLD_CONTROL_SWINT (1<<7) /* Disable all CPLD IRQs */ +#define CPLD_CONTROL_OCMSK (1<<6) /* Mask USB1 connect IRQ */ +#define CPLD_CONTROL_PDRV (1<<5) /* PCC_nDRV high */ +#define CPLD_CONTROL_USB1C (1<<4) /* USB1 connect IRQ active */ +#define CPLD_CONTROL_USB1P (1<<3) /* USB1 power disable */ +#define CPLD_CONTROL_AWKP (1<<2) /* Auto-wakeup disabled */ +#define CPLD_CONTROL_LCD_ENABLE (1<<1) /* LCD Vee enable */ +#define CPLD_CONTROL_WRLAN_NENABLE (1<<0) /* SMC91x power disable */ + + static struct resource smc91x_resources[] = { [0] = { .start = CPLD00_PHYS, @@ -48,12 +71,12 @@ static struct platform_device smc91x_device = { static struct resource lh7a40x_usbclient_resources[] = { [0] = { .start = USB_PHYS, - .end = (USB_PHYS + 0xFF), + .end = (USB_PHYS + PAGE_SIZE), .flags = IORESOURCE_MEM, }, [1] = { - .start = IRQ_USBINTR, - .end = IRQ_USBINTR, + .start = IRQ_USB, + .end = IRQ_USB, .flags = IORESOURCE_IRQ, }, }; @@ -61,7 +84,8 @@ static struct resource lh7a40x_usbclient_resources[] = { static u64 lh7a40x_usbclient_dma_mask = 0xffffffffUL; static struct platform_device lh7a40x_usbclient_device = { - .name = "lh7a40x_udc", +// .name = "lh7a40x_udc", + .name = "lh7-udc", .id = 0, .dev = { .dma_mask = &lh7a40x_usbclient_dma_mask, @@ -101,7 +125,7 @@ static struct platform_device lh7a404_usbhost_device = { #endif -static struct platform_device *lpd7a40x_devs[] __initdata = { +static struct platform_device* lpd7a40x_devs[] __initdata = { &smc91x_device, &lh7a40x_usbclient_device, #if defined (CONFIG_ARCH_LH7A404) @@ -113,29 +137,52 @@ extern void lpd7a400_map_io (void); static void __init lpd7a40x_init (void) { - CPLD_CONTROL |= (1<<6); /* Mask USB1 connection IRQ */ +#if defined (CONFIG_MACH_LPD7A400) + CPLD_CONTROL |= 0 + | CPLD_CONTROL_SWINT /* Disable software interrupt */ + | CPLD_CONTROL_OCMSK; /* Mask USB1 connection IRQ */ CPLD_CONTROL &= ~(0 - | (1<<1) /* Disable LCD */ - | (1<<0) /* Enable WLAN */ + | CPLD_CONTROL_LCD_ENABLE /* Disable LCD */ + | CPLD_CONTROL_WRLAN_NENABLE /* Enable SMC91x */ ); +#endif + +#if defined (CONFIG_MACH_LPD7A404) + CPLD_CONTROL &= ~(0 + | CPLD_CONTROL_WRLAN_NENABLE /* Enable SMC91x */ + ); +#endif platform_add_devices (lpd7a40x_devs, ARRAY_SIZE (lpd7a40x_devs)); +#if defined (CONFIG_FB_ARMCLCD) + lh7a40x_clcd_init (); +#endif } static void lh7a40x_ack_cpld_irq (u32 irq) { - /* CPLD doesn't have ack capability */ + /* CPLD doesn't have ack capability, but some devices may */ + +#if defined (CPLD_INTMASK_TOUCH) + /* The touch control *must* mask the the interrupt because the + * interrupt bit is read by the driver to determine if the pen + * is still down. */ + if (irq == IRQ_TOUCH) + CPLD_INTERRUPTS |= CPLD_INTMASK_TOUCH; +#endif } static void lh7a40x_mask_cpld_irq (u32 irq) { switch (irq) { case IRQ_LPD7A40X_ETH_INT: - CPLD_INTERRUPTS = CPLD_INTERRUPTS | 0x4; + CPLD_INTERRUPTS |= CPLD_INTMASK_ETHERNET; break; - case IRQ_LPD7A400_TS: - CPLD_INTERRUPTS = CPLD_INTERRUPTS | 0x8; +#if defined (IRQ_TOUCH) + case IRQ_TOUCH: + CPLD_INTERRUPTS |= CPLD_INTMASK_TOUCH; break; +#endif } } @@ -143,15 +190,18 @@ static void lh7a40x_unmask_cpld_irq (u32 irq) { switch (irq) { case IRQ_LPD7A40X_ETH_INT: - CPLD_INTERRUPTS = CPLD_INTERRUPTS & ~ 0x4; + CPLD_INTERRUPTS &= ~CPLD_INTMASK_ETHERNET; break; - case IRQ_LPD7A400_TS: - CPLD_INTERRUPTS = CPLD_INTERRUPTS & ~ 0x8; +#if defined (IRQ_TOUCH) + case IRQ_TOUCH: + CPLD_INTERRUPTS &= ~CPLD_INTMASK_TOUCH; break; +#endif } } -static struct irqchip lpd7a40x_cpld_chip = { +static struct irq_chip lpd7a40x_cpld_chip = { + .name = "CPLD", .ack = lh7a40x_ack_cpld_irq, .mask = lh7a40x_mask_cpld_irq, .unmask = lh7a40x_unmask_cpld_irq, @@ -164,11 +214,13 @@ static void lpd7a40x_cpld_handler (unsigned int irq, struct irqdesc *desc, desc->chip->ack (irq); - if ((mask & 0x1) == 0) /* WLAN */ + if ((mask & (1<<0)) == 0) /* WLAN */ IRQ_DISPATCH (IRQ_LPD7A40X_ETH_INT); - if ((mask & 0x2) == 0) /* Touch */ - IRQ_DISPATCH (IRQ_LPD7A400_TS); +#if defined (IRQ_TOUCH) + if ((mask & (1<<1)) == 0) /* Touch */ + IRQ_DISPATCH (IRQ_TOUCH); +#endif desc->chip->unmask (irq); /* Level-triggered need this */ } @@ -204,9 +256,21 @@ void __init lh7a40x_init_board_irq (void) /* Then, configure CPLD interrupt */ - CPLD_INTERRUPTS = 0x9c; /* Disable all CPLD interrupts */ + /* Disable all CPLD interrupts */ +#if defined (CONFIG_MACH_LPD7A400) + CPLD_INTERRUPTS = CPLD_INTMASK_TOUCH | CPLD_INTMASK_PEN + | CPLD_INTMASK_ETHERNET; + /* *** FIXME: don't know why we need 7 and 4. 7 is way wrong + and 4 is uncefined. */ + // (1<<7)|(1<<4)|(1<<3)|(1<<2); +#endif +#if defined (CONFIG_MACH_LPD7A404) + CPLD_INTERRUPTS = CPLD_INTMASK_ETHERNET; + /* *** FIXME: don't know why we need 6 and 5, neither is defined. */ + // (1<<6)|(1<<5)|(1<<3); +#endif GPIO_PFDD &= ~(1 << pinCPLD); /* Make input */ - GPIO_INTTYPE1 |= (1 << pinCPLD); /* Edge triggered */ + GPIO_INTTYPE1 &= ~(1 << pinCPLD); /* Level triggered */ GPIO_INTTYPE2 &= ~(1 << pinCPLD); /* Active low */ barrier (); GPIO_GPIOFINTEN |= (1 << pinCPLD); /* Enable */ @@ -216,7 +280,7 @@ void __init lh7a40x_init_board_irq (void) for (irq = IRQ_BOARD_START; irq < IRQ_BOARD_START + NR_IRQ_BOARD; ++irq) { set_irq_chip (irq, &lpd7a40x_cpld_chip); - set_irq_handler (irq, do_edge_IRQ); + set_irq_handler (irq, do_level_IRQ); set_irq_flags (irq, IRQF_VALID); } @@ -226,91 +290,109 @@ void __init lh7a40x_init_board_irq (void) lpd7a40x_cpld_handler); } -static struct map_desc lpd7a400_io_desc[] __initdata = { +static struct map_desc lpd7a40x_io_desc[] __initdata = { { - .virtual = IO_VIRT, + .virtual = IO_VIRT, .pfn = __phys_to_pfn(IO_PHYS), - .length = IO_SIZE, + .length = IO_SIZE, .type = MT_DEVICE - }, { /* Mapping added to work around chip select problems */ + }, + { /* Mapping added to work around chip select problems */ .virtual = IOBARRIER_VIRT, .pfn = __phys_to_pfn(IOBARRIER_PHYS), .length = IOBARRIER_SIZE, .type = MT_DEVICE - }, { + }, + { .virtual = CF_VIRT, .pfn = __phys_to_pfn(CF_PHYS), - .length = CF_SIZE, + .length = CF_SIZE, .type = MT_DEVICE - }, { + }, + { .virtual = CPLD02_VIRT, .pfn = __phys_to_pfn(CPLD02_PHYS), - .length = CPLD02_SIZE, + .length = CPLD02_SIZE, .type = MT_DEVICE - }, { + }, + { .virtual = CPLD06_VIRT, .pfn = __phys_to_pfn(CPLD06_PHYS), - .length = CPLD06_SIZE, + .length = CPLD06_SIZE, + .type = MT_DEVICE + }, + { + .virtual = CPLD08_VIRT, + .pfn = __phys_to_pfn(CPLD08_PHYS), + .length = CPLD08_SIZE, .type = MT_DEVICE - }, { + }, + { .virtual = CPLD08_VIRT, .pfn = __phys_to_pfn(CPLD08_PHYS), - .length = CPLD08_SIZE, + .length = CPLD08_SIZE, .type = MT_DEVICE - }, { + }, + { + .virtual = CPLD0A_VIRT, + .pfn = __phys_to_pfn(CPLD0A_PHYS), + .length = CPLD0A_SIZE, + .type = MT_DEVICE + }, + { .virtual = CPLD0C_VIRT, .pfn = __phys_to_pfn(CPLD0C_PHYS), - .length = CPLD0C_SIZE, + .length = CPLD0C_SIZE, .type = MT_DEVICE - }, { + }, + { .virtual = CPLD0E_VIRT, .pfn = __phys_to_pfn(CPLD0E_PHYS), - .length = CPLD0E_SIZE, + .length = CPLD0E_SIZE, .type = MT_DEVICE - }, { + }, + { .virtual = CPLD10_VIRT, .pfn = __phys_to_pfn(CPLD10_PHYS), - .length = CPLD10_SIZE, + .length = CPLD10_SIZE, .type = MT_DEVICE - }, { + }, + { .virtual = CPLD12_VIRT, .pfn = __phys_to_pfn(CPLD12_PHYS), - .length = CPLD12_SIZE, + .length = CPLD12_SIZE, .type = MT_DEVICE - }, { + }, + { .virtual = CPLD14_VIRT, .pfn = __phys_to_pfn(CPLD14_PHYS), - .length = CPLD14_SIZE, + .length = CPLD14_SIZE, .type = MT_DEVICE - }, { + }, + { .virtual = CPLD16_VIRT, .pfn = __phys_to_pfn(CPLD16_PHYS), - .length = CPLD16_SIZE, + .length = CPLD16_SIZE, .type = MT_DEVICE - }, { + }, + { .virtual = CPLD18_VIRT, .pfn = __phys_to_pfn(CPLD18_PHYS), - .length = CPLD18_SIZE, + .length = CPLD18_SIZE, .type = MT_DEVICE - }, { + }, + { .virtual = CPLD1A_VIRT, .pfn = __phys_to_pfn(CPLD1A_PHYS), - .length = CPLD1A_SIZE, + .length = CPLD1A_SIZE, .type = MT_DEVICE }, - /* This mapping is redundant since the smc driver performs another. */ -/* { CPLD00_VIRT, CPLD00_PHYS, CPLD00_SIZE, MT_DEVICE }, */ }; void __init -lpd7a400_map_io(void) +lpd7a40x_map_io(void) { - iotable_init (lpd7a400_io_desc, ARRAY_SIZE (lpd7a400_io_desc)); - - /* Fixup (improve) Static Memory Controller settings */ - SMC_BCR0 = 0x200039af; /* Boot Flash */ - SMC_BCR6 = 0x1000fbe0; /* CPLD */ - SMC_BCR7 = 0x1000b2c2; /* Compact Flash */ + iotable_init (lpd7a40x_io_desc, ARRAY_SIZE (lpd7a40x_io_desc)); } #ifdef CONFIG_MACH_LPD7A400 @@ -320,7 +402,7 @@ MACHINE_START (LPD7A400, "Logic Product Development LPD7A400-10") .phys_io = 0x80000000, .io_pg_offst = ((io_p2v (0x80000000))>>18) & 0xfffc, .boot_params = 0xc0000100, - .map_io = lpd7a400_map_io, + .map_io = lpd7a40x_map_io, .init_irq = lh7a400_init_irq, .timer = &lh7a40x_timer, .init_machine = lpd7a40x_init, @@ -335,7 +417,7 @@ MACHINE_START (LPD7A404, "Logic Product Development LPD7A404-10") .phys_io = 0x80000000, .io_pg_offst = ((io_p2v (0x80000000))>>18) & 0xfffc, .boot_params = 0xc0000100, - .map_io = lpd7a400_map_io, + .map_io = lpd7a40x_map_io, .init_irq = lh7a404_init_irq, .timer = &lh7a40x_timer, .init_machine = lpd7a40x_init, diff --git a/arch/arm/mach-lh7a40x/common.h b/arch/arm/mach-lh7a40x/common.h index ea8de7e3a..18e8bb4eb 100644 --- a/arch/arm/mach-lh7a40x/common.h +++ b/arch/arm/mach-lh7a40x/common.h @@ -12,6 +12,7 @@ extern struct sys_timer lh7a40x_timer; extern void lh7a400_init_irq (void); extern void lh7a404_init_irq (void); +extern void lh7a40x_clcd_init (void); extern void lh7a40x_init_board_irq (void); #define IRQ_DISPATCH(irq) desc_handle_irq((irq),(irq_desc + irq), regs) diff --git a/arch/arm/mach-lh7a40x/irq-kev7a400.c b/arch/arm/mach-lh7a40x/irq-kev7a400.c index 8535764d8..f9b3fe917 100644 --- a/arch/arm/mach-lh7a40x/irq-kev7a400.c +++ b/arch/arm/mach-lh7a40x/irq-kev7a400.c @@ -43,7 +43,8 @@ lh7a400_unmask_cpld_irq (u32 irq) } static struct -irqchip lh7a400_cpld_chip = { +irq_chip lh7a400_cpld_chip = { + .name = "CPLD", .ack = lh7a400_ack_cpld_irq, .mask = lh7a400_mask_cpld_irq, .unmask = lh7a400_unmask_cpld_irq, diff --git a/arch/arm/mach-lh7a40x/irq-lh7a400.c b/arch/arm/mach-lh7a40x/irq-lh7a400.c index f9fdefef6..091b2dc58 100644 --- a/arch/arm/mach-lh7a40x/irq-lh7a400.c +++ b/arch/arm/mach-lh7a40x/irq-lh7a400.c @@ -38,13 +38,15 @@ static void lh7a400_ack_gpio_irq (u32 irq) INTC_INTENC = (1 << irq); } -static struct irqchip lh7a400_internal_chip = { +static struct irq_chip lh7a400_internal_chip = { + .name = "MPU", .ack = lh7a400_mask_irq, /* Level triggering -> mask is ack */ .mask = lh7a400_mask_irq, .unmask = lh7a400_unmask_irq, }; -static struct irqchip lh7a400_gpio_chip = { +static struct irq_chip lh7a400_gpio_chip = { + .name = "GPIO", .ack = lh7a400_ack_gpio_irq, .mask = lh7a400_mask_irq, .unmask = lh7a400_unmask_irq, diff --git a/arch/arm/mach-lh7a40x/irq-lh7a404.c b/arch/arm/mach-lh7a40x/irq-lh7a404.c index e902e3d87..7059b9837 100644 --- a/arch/arm/mach-lh7a40x/irq-lh7a404.c +++ b/arch/arm/mach-lh7a40x/irq-lh7a404.c @@ -28,13 +28,17 @@ static unsigned char irq_pri_vic1[] = { #if defined (USE_PRIORITIES) -IRQ_GPIO3INTR, + IRQ_GPIO3INTR, /* CPLD */ + IRQ_DMAM2P4, IRQ_DMAM2P5, /* AC97 */ #endif }; static unsigned char irq_pri_vic2[] = { #if defined (USE_PRIORITIES) - IRQ_T3UI, IRQ_GPIO7INTR, + IRQ_T3UI, /* Timer */ + IRQ_GPIO7INTR, /* CPLD */ IRQ_UART1INTR, IRQ_UART2INTR, IRQ_UART3INTR, + IRQ_LCDINTR, /* LCD */ + IRQ_TSCINTR, /* ADC/Touchscreen */ #endif }; @@ -72,25 +76,29 @@ static void lh7a404_vic2_ack_gpio_irq (u32 irq) VIC2_INTENCLR = (1 << irq); } -static struct irqchip lh7a404_vic1_chip = { +static struct irq_chip lh7a404_vic1_chip = { + .name = "VIC1", .ack = lh7a404_vic1_mask_irq, /* Because level-triggered */ .mask = lh7a404_vic1_mask_irq, .unmask = lh7a404_vic1_unmask_irq, }; -static struct irqchip lh7a404_vic2_chip = { +static struct irq_chip lh7a404_vic2_chip = { + .name = "VIC2", .ack = lh7a404_vic2_mask_irq, /* Because level-triggered */ .mask = lh7a404_vic2_mask_irq, .unmask = lh7a404_vic2_unmask_irq, }; -static struct irqchip lh7a404_gpio_vic1_chip = { +static struct irq_chip lh7a404_gpio_vic1_chip = { + .name = "GPIO-VIC1", .ack = lh7a404_vic1_ack_gpio_irq, .mask = lh7a404_vic1_mask_irq, .unmask = lh7a404_vic1_unmask_irq, }; -static struct irqchip lh7a404_gpio_vic2_chip = { +static struct irq_chip lh7a404_gpio_vic2_chip = { + .name = "GPIO-VIC2", .ack = lh7a404_vic2_ack_gpio_irq, .mask = lh7a404_vic2_mask_irq, .unmask = lh7a404_vic2_unmask_irq, @@ -98,10 +106,19 @@ static struct irqchip lh7a404_gpio_vic2_chip = { /* IRQ initialization */ +#if defined (CONFIG_ARCH_LH7A400) && defined (CONFIG_ARCH_LH7A404) +extern void* branch_irq_lh7a400; +#endif + void __init lh7a404_init_irq (void) { int irq; +#if defined (CONFIG_ARCH_LH7A400) && defined (CONFIG_ARCH_LH7A404) +#define NOP 0xe1a00000 /* mov r0, r0 */ + branch_irq_lh7a400 = NOP; +#endif + VIC1_INTENCLR = 0xffffffff; VIC2_INTENCLR = 0xffffffff; VIC1_INTSEL = 0; /* All IRQs */ diff --git a/arch/arm/mach-lh7a40x/irq-lpd7a40x.c b/arch/arm/mach-lh7a40x/irq-lpd7a40x.c index dcb4e17b9..d6055dde6 100644 --- a/arch/arm/mach-lh7a40x/irq-lpd7a40x.c +++ b/arch/arm/mach-lh7a40x/irq-lpd7a40x.c @@ -50,7 +50,8 @@ static void lh7a40x_unmask_cpld_irq (u32 irq) } } -static struct irqchip lh7a40x_cpld_chip = { +static struct irq_chip lh7a40x_cpld_chip = { + .name = "CPLD", .ack = lh7a40x_ack_cpld_irq, .mask = lh7a40x_mask_cpld_irq, .unmask = lh7a40x_unmask_cpld_irq, diff --git a/arch/arm/mach-lh7a40x/time.c b/arch/arm/mach-lh7a40x/time.c index 51e1c814b..ad5652e01 100644 --- a/arch/arm/mach-lh7a40x/time.c +++ b/arch/arm/mach-lh7a40x/time.c @@ -1,4 +1,4 @@ -/* +/* * arch/arm/mach-lh7a40x/time.c * * Copyright (C) 2004 Logic Product Development @@ -8,10 +8,10 @@ * version 2 as published by the Free Software Foundation. * */ -#include #include #include #include +#include #include #include @@ -53,11 +53,11 @@ lh7a40x_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) static struct irqaction lh7a40x_timer_irq = { .name = "LHA740x Timer Tick", - .flags = SA_INTERRUPT, - .handler = lh7a40x_timer_interrupt + .flags = IRQF_DISABLED | IRQF_TIMER, + .handler = lh7a40x_timer_interrupt, }; -static void __init lh7a40x_timer_init(void) +static void __init lh7a40x_timer_init (void) { /* Stop/disable all timers */ TIMER_CONTROL1 = 0; diff --git a/arch/arm/mach-omap1/Kconfig b/arch/arm/mach-omap1/Kconfig index f8d716ccc..d135568dc 100644 --- a/arch/arm/mach-omap1/Kconfig +++ b/arch/arm/mach-omap1/Kconfig @@ -62,6 +62,13 @@ config MACH_OMAP_PERSEUS2 Support for TI OMAP 730 Perseus2 board. Say Y here if you have such a board. +config MACH_OMAP_FSAMPLE + bool "TI F-Sample" + depends on ARCH_OMAP1 && ARCH_OMAP730 + help + Support for TI OMAP 850 F-Sample board. Say Y here if you have such + a board. + config MACH_VOICEBLUE bool "Voiceblue" depends on ARCH_OMAP1 && ARCH_OMAP15XX diff --git a/arch/arm/mach-omap1/Makefile b/arch/arm/mach-omap1/Makefile index 9ea719550..7165f74f7 100644 --- a/arch/arm/mach-omap1/Makefile +++ b/arch/arm/mach-omap1/Makefile @@ -17,6 +17,7 @@ obj-$(CONFIG_MACH_OMAP_H2) += board-h2.o obj-$(CONFIG_MACH_OMAP_INNOVATOR) += board-innovator.o obj-$(CONFIG_MACH_OMAP_GENERIC) += board-generic.o obj-$(CONFIG_MACH_OMAP_PERSEUS2) += board-perseus2.o +obj-$(CONFIG_MACH_OMAP_FSAMPLE) += board-fsample.o obj-$(CONFIG_MACH_OMAP_OSK) += board-osk.o obj-$(CONFIG_MACH_OMAP_H3) += board-h3.o obj-$(CONFIG_MACH_VOICEBLUE) += board-voiceblue.o diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c index 6178f046f..8437d065a 100644 --- a/arch/arm/mach-omap1/board-ams-delta.c +++ b/arch/arm/mach-omap1/board-ams-delta.c @@ -80,8 +80,24 @@ static struct omap_uart_config ams_delta_uart_config __initdata = { .enabled_uarts = 1, }; +static struct omap_usb_config ams_delta_usb_config __initdata = { + .register_host = 1, + .hmc_mode = 16, + .pins[0] = 2, +}; + static struct omap_board_config_kernel ams_delta_config[] = { { OMAP_TAG_UART, &ams_delta_uart_config }, + { OMAP_TAG_USB, &ams_delta_usb_config }, +}; + +static struct platform_device ams_delta_led_device = { + .name = "ams-delta-led", + .id = -1 +}; + +static struct platform_device *ams_delta_devices[] __initdata = { + &ams_delta_led_device, }; static void __init ams_delta_init(void) @@ -94,6 +110,8 @@ static void __init ams_delta_init(void) /* Clear latch2 (NAND, LCD, modem enable) */ ams_delta_latch2_write(~0, 0); + + platform_add_devices(ams_delta_devices, ARRAY_SIZE(ams_delta_devices)); } static void __init ams_delta_map_io(void) diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c index 4b8d0ec73..7b206116c 100644 --- a/arch/arm/mach-omap1/board-h3.c +++ b/arch/arm/mach-omap1/board-h3.c @@ -14,7 +14,6 @@ * published by the Free Software Foundation. */ -#include #include #include #include diff --git a/arch/arm/mach-omap1/board-innovator.c b/arch/arm/mach-omap1/board-innovator.c index e90c137a4..4cbc62db5 100644 --- a/arch/arm/mach-omap1/board-innovator.c +++ b/arch/arm/mach-omap1/board-innovator.c @@ -37,6 +37,8 @@ #include #include #include +#include +#include static int innovator_keymap[] = { KEY(0, 0, KEY_F1), @@ -112,6 +114,42 @@ static struct platform_device innovator_flash_device = { .resource = &innovator_flash_resource, }; +#define DEFAULT_BITPERSAMPLE 16 + +static struct omap_mcbsp_reg_cfg mcbsp_regs = { + .spcr2 = FREE | FRST | GRST | XRST | XINTM(3), + .spcr1 = RINTM(3) | RRST, + .rcr2 = RPHASE | RFRLEN2(OMAP_MCBSP_WORD_8) | + RWDLEN2(OMAP_MCBSP_WORD_16) | RDATDLY(0), + .rcr1 = RFRLEN1(OMAP_MCBSP_WORD_8) | RWDLEN1(OMAP_MCBSP_WORD_16), + .xcr2 = XPHASE | XFRLEN2(OMAP_MCBSP_WORD_8) | + XWDLEN2(OMAP_MCBSP_WORD_16) | XDATDLY(0) | XFIG, + .xcr1 = XFRLEN1(OMAP_MCBSP_WORD_8) | XWDLEN1(OMAP_MCBSP_WORD_16), + .srgr1 = FWID(DEFAULT_BITPERSAMPLE - 1), + .srgr2 = GSYNC | CLKSP | FSGM | FPER(DEFAULT_BITPERSAMPLE * 2 - 1), + /*.pcr0 = FSXM | FSRM | CLKXM | CLKRM | CLKXP | CLKRP,*/ /* mcbsp: master */ + .pcr0 = CLKXP | CLKRP, /* mcbsp: slave */ +}; + +static struct omap_alsa_codec_config alsa_config = { + .name = "OMAP Innovator AIC23", + .mcbsp_regs_alsa = &mcbsp_regs, + .codec_configure_dev = NULL, // aic23_configure, + .codec_set_samplerate = NULL, // aic23_set_samplerate, + .codec_clock_setup = NULL, // aic23_clock_setup, + .codec_clock_on = NULL, // aic23_clock_on, + .codec_clock_off = NULL, // aic23_clock_off, + .get_default_samplerate = NULL, // aic23_get_default_samplerate, +}; + +static struct platform_device innovator_mcbsp1_device = { + .name = "omap_alsa_mcbsp", + .id = 1, + .dev = { + .platform_data = &alsa_config, + }, +}; + static struct resource innovator_kp_resources[] = { [0] = { .start = INT_KEYBOARD, @@ -139,6 +177,10 @@ static struct platform_device innovator_kp_device = { #ifdef CONFIG_ARCH_OMAP15XX +#include +#include + + /* Only FPGA needs to be mapped here. All others are done with ioremap */ static struct map_desc innovator1510_io_desc[] __initdata = { { @@ -174,13 +216,44 @@ static struct platform_device innovator1510_lcd_device = { .id = -1, }; +static struct platform_device innovator1510_spi_device = { + .name = "spi_inn1510", + .id = -1, +}; + static struct platform_device *innovator1510_devices[] __initdata = { &innovator_flash_device, &innovator1510_smc91x_device, + &innovator_mcbsp1_device, &innovator_kp_device, &innovator1510_lcd_device, + &innovator1510_spi_device, }; +static int innovator_get_pendown_state(void) +{ + return !(fpga_read(OMAP1510_FPGA_TOUCHSCREEN) & (1 << 5)); +} + +static const struct ads7846_platform_data innovator1510_ts_info = { + .model = 7846, + .vref_delay_usecs = 100, /* internal, no capacitor */ + .x_plate_ohms = 419, + .y_plate_ohms = 486, + .get_pendown_state = innovator_get_pendown_state, +}; + +static struct spi_board_info __initdata innovator1510_boardinfo[] = { { + /* FPGA (bus "10") CS0 has an ads7846e */ + .modalias = "ads7846", + .platform_data = &innovator1510_ts_info, + .irq = OMAP1510_INT_FPGA_TS, + .max_speed_hz = 120000 /* max sample rate at 3V */ + * 26 /* command + data + overhead */, + .bus_num = 10, + .chip_select = 0, +} }; + #endif /* CONFIG_ARCH_OMAP15XX */ #ifdef CONFIG_ARCH_OMAP16XX @@ -311,6 +384,8 @@ static void __init innovator_init(void) #ifdef CONFIG_ARCH_OMAP15XX if (cpu_is_omap1510()) { platform_add_devices(innovator1510_devices, ARRAY_SIZE(innovator1510_devices)); + spi_register_board_info(innovator1510_boardinfo, + ARRAY_SIZE(innovator1510_boardinfo)); } #endif #ifdef CONFIG_ARCH_OMAP16XX diff --git a/arch/arm/mach-omap1/board-osk.c b/arch/arm/mach-omap1/board-osk.c index 1160093e8..b742261c9 100644 --- a/arch/arm/mach-omap1/board-osk.c +++ b/arch/arm/mach-omap1/board-osk.c @@ -29,11 +29,10 @@ #include #include #include -#include +#include #include #include -#include #include #include @@ -45,25 +44,10 @@ #include #include #include -#include #include #include #include -static int osk_keymap[] = { - KEY(0, 0, KEY_F1), - KEY(0, 3, KEY_UP), - KEY(1, 1, KEY_LEFTCTRL), - KEY(1, 2, KEY_LEFT), - KEY(2, 0, KEY_SPACE), - KEY(2, 1, KEY_ESC), - KEY(2, 2, KEY_DOWN), - KEY(3, 2, KEY_ENTER), - KEY(3, 3, KEY_RIGHT), - 0 -}; - - static struct mtd_partition osk_partitions[] = { /* bootloader (U-Boot, etc) in first sector */ { @@ -181,48 +165,17 @@ static struct omap_alsa_codec_config alsa_config = { static struct platform_device osk5912_mcbsp1_device = { .name = "omap_alsa_mcbsp", - .id = 1, + .id = 1, .dev = { .platform_data = &alsa_config, }, }; -static struct resource osk5912_kp_resources[] = { - [0] = { - .start = INT_KEYBOARD, - .end = INT_KEYBOARD, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct omap_kp_platform_data osk_kp_data = { - .rows = 8, - .cols = 8, - .keymap = osk_keymap, -}; - -static struct platform_device osk5912_kp_device = { - .name = "omap-keypad", - .id = -1, - .dev = { - .platform_data = &osk_kp_data, - }, - .num_resources = ARRAY_SIZE(osk5912_kp_resources), - .resource = osk5912_kp_resources, -}; - -static struct platform_device osk5912_lcd_device = { - .name = "lcd_osk", - .id = -1, -}; - static struct platform_device *osk5912_devices[] __initdata = { &osk5912_flash_device, &osk5912_smc91x_device, &osk5912_cf_device, &osk5912_mcbsp1_device, - &osk5912_kp_device, - &osk5912_lcd_device, }; static void __init osk_init_smc91x(void) @@ -276,18 +229,100 @@ static struct omap_uart_config osk_uart_config __initdata = { .enabled_uarts = (1 << 0), }; +#ifdef CONFIG_OMAP_OSK_MISTRAL static struct omap_lcd_config osk_lcd_config __initdata = { .ctrl_name = "internal", }; +#endif static struct omap_board_config_kernel osk_config[] = { { OMAP_TAG_USB, &osk_usb_config }, { OMAP_TAG_UART, &osk_uart_config }, +#ifdef CONFIG_OMAP_OSK_MISTRAL { OMAP_TAG_LCD, &osk_lcd_config }, +#endif }; #ifdef CONFIG_OMAP_OSK_MISTRAL +#include +#include +#include + +#include + +static const int osk_keymap[] = { + /* KEY(col, row, code) */ + KEY(0, 0, KEY_F1), /* SW4 */ + KEY(0, 3, KEY_UP), /* (sw2/up) */ + KEY(1, 1, KEY_LEFTCTRL), /* SW5 */ + KEY(1, 2, KEY_LEFT), /* (sw2/left) */ + KEY(2, 0, KEY_SPACE), /* SW3 */ + KEY(2, 1, KEY_ESC), /* SW6 */ + KEY(2, 2, KEY_DOWN), /* (sw2/down) */ + KEY(3, 2, KEY_ENTER), /* (sw2/select) */ + KEY(3, 3, KEY_RIGHT), /* (sw2/right) */ + 0 +}; + +static struct omap_kp_platform_data osk_kp_data = { + .rows = 8, + .cols = 8, + .keymap = (int *) osk_keymap, +}; + +static struct resource osk5912_kp_resources[] = { + [0] = { + .start = INT_KEYBOARD, + .end = INT_KEYBOARD, + .flags = IORESOURCE_IRQ, + }, +}; + +static struct platform_device osk5912_kp_device = { + .name = "omap-keypad", + .id = -1, + .dev = { + .platform_data = &osk_kp_data, + }, + .num_resources = ARRAY_SIZE(osk5912_kp_resources), + .resource = osk5912_kp_resources, +}; + +static struct platform_device osk5912_lcd_device = { + .name = "lcd_osk", + .id = -1, +}; + +static struct platform_device *mistral_devices[] __initdata = { + &osk5912_kp_device, + &osk5912_lcd_device, +}; + +static int mistral_get_pendown_state(void) +{ + return !omap_get_gpio_datain(4); +} + +static const struct ads7846_platform_data mistral_ts_info = { + .model = 7846, + .vref_delay_usecs = 100, /* internal, no capacitor */ + .x_plate_ohms = 419, + .y_plate_ohms = 486, + .get_pendown_state = mistral_get_pendown_state, +}; + +static struct spi_board_info __initdata mistral_boardinfo[] = { { + /* MicroWire (bus 2) CS0 has an ads7846e */ + .modalias = "ads7846", + .platform_data = &mistral_ts_info, + .irq = OMAP_GPIO_IRQ(4), + .max_speed_hz = 120000 /* max sample rate at 3V */ + * 26 /* command + data + overhead */, + .bus_num = 2, + .chip_select = 0, +} }; + #ifdef CONFIG_PM static irqreturn_t osk_mistral_wake_interrupt(int irq, void *ignored, struct pt_regs *regs) @@ -298,14 +333,18 @@ osk_mistral_wake_interrupt(int irq, void *ignored, struct pt_regs *regs) static void __init osk_mistral_init(void) { - /* FIXME here's where to feed in framebuffer, touchpad, and - * keyboard setup ... not in the drivers for those devices! - * - * NOTE: we could actually tell if there's a Mistral board + /* NOTE: we could actually tell if there's a Mistral board * attached, e.g. by trying to read something from the ads7846. - * But this is too early for that... + * But this arch_init() code is too early for that, since we + * can't talk to the ads or even the i2c eeprom. */ + // omap_cfg_reg(P19_1610_GPIO6); // BUSY + omap_cfg_reg(P20_1610_GPIO4); // PENIRQ + set_irq_type(OMAP_GPIO_IRQ(4), IRQT_FALLING); + spi_register_board_info(mistral_boardinfo, + ARRAY_SIZE(mistral_boardinfo)); + /* the sideways button (SW1) is for use as a "wakeup" button */ omap_cfg_reg(N15_1610_MPUIO2); if (omap_request_gpio(OMAP_MPUIO(2)) == 0) { @@ -318,7 +357,7 @@ static void __init osk_mistral_init(void) */ ret = request_irq(OMAP_GPIO_IRQ(OMAP_MPUIO(2)), &osk_mistral_wake_interrupt, - SA_SHIRQ, "mistral_wakeup", + IRQF_SHARED, "mistral_wakeup", &osk_mistral_wake_interrupt); if (ret != 0) { omap_free_gpio(OMAP_MPUIO(2)); @@ -329,6 +368,8 @@ static void __init osk_mistral_init(void) #endif } else printk(KERN_ERR "OSK+Mistral: wakeup button is awol\n"); + + platform_add_devices(mistral_devices, ARRAY_SIZE(mistral_devices)); } #else static void __init osk_mistral_init(void) { } diff --git a/arch/arm/mach-omap1/clock.c b/arch/arm/mach-omap1/clock.c index 619db1814..f1958e882 100644 --- a/arch/arm/mach-omap1/clock.c +++ b/arch/arm/mach-omap1/clock.c @@ -1,3 +1,4 @@ +//kernel/linux-omap-fsample/arch/arm/mach-omap1/clock.c#2 - edit change 3808 (text) /* * linux/arch/arm/mach-omap1/clock.c * @@ -20,6 +21,7 @@ #include +#include #include #include #include @@ -270,8 +272,12 @@ static int omap1_select_table_rate(struct clk * clk, unsigned long rate) /* * In most cases we should not need to reprogram DPLL. * Reprogramming the DPLL is tricky, it must be done from SRAM. + * (on 730, bit 13 must always be 1) */ - omap_sram_reprogram_clock(ptr->dpllctl_val, ptr->ckctl_val); + if (cpu_is_omap730()) + omap_sram_reprogram_clock(ptr->dpllctl_val, ptr->ckctl_val | 0x2000); + else + omap_sram_reprogram_clock(ptr->dpllctl_val, ptr->ckctl_val); ck_dpll1.rate = ptr->pll_rate; propagate_rate(&ck_dpll1); @@ -748,7 +754,7 @@ int __init omap1_clk_init(void) printk(KERN_ERR "System frequencies not set. Check your config.\n"); /* Guess sane values (60MHz) */ omap_writew(0x2290, DPLL_CTL); - omap_writew(0x1005, ARM_CKCTL); + omap_writew(cpu_is_omap730() ? 0x3005 : 0x1005, ARM_CKCTL); ck_dpll1.rate = 60000000; propagate_rate(&ck_dpll1); } @@ -761,13 +767,17 @@ int __init omap1_clk_init(void) ck_dpll1.rate / 1000000, (ck_dpll1.rate / 100000) % 10, arm_ck.rate / 1000000, (arm_ck.rate / 100000) % 10); -#ifdef CONFIG_MACH_OMAP_PERSEUS2 +#if defined(CONFIG_MACH_OMAP_PERSEUS2) || defined(CONFIG_MACH_OMAP_FSAMPLE) /* Select slicer output as OMAP input clock */ omap_writew(omap_readw(OMAP730_PCC_UPLD_CTRL) & ~0x1, OMAP730_PCC_UPLD_CTRL); #endif /* Turn off DSP and ARM_TIMXO. Make sure ARM_INTHCK is not divided */ - omap_writew(omap_readw(ARM_CKCTL) & 0x0fff, ARM_CKCTL); + /* (on 730, bit 13 must not be cleared) */ + if (cpu_is_omap730()) + omap_writew(omap_readw(ARM_CKCTL) & 0x2fff, ARM_CKCTL); + else + omap_writew(omap_readw(ARM_CKCTL) & 0x0fff, ARM_CKCTL); /* Put DSP/MPUI into reset until needed */ omap_writew(0, ARM_RSTCT1); diff --git a/arch/arm/mach-omap1/devices.c b/arch/arm/mach-omap1/devices.c index 847329caf..a611c3b63 100644 --- a/arch/arm/mach-omap1/devices.c +++ b/arch/arm/mach-omap1/devices.c @@ -9,7 +9,6 @@ * (at your option) any later version. */ -#include #include #include #include diff --git a/arch/arm/mach-omap1/fpga.c b/arch/arm/mach-omap1/fpga.c index aca2a1208..efe9bfc6e 100644 --- a/arch/arm/mach-omap1/fpga.c +++ b/arch/arm/mach-omap1/fpga.c @@ -16,7 +16,6 @@ * published by the Free Software Foundation. */ -#include #include #include #include @@ -107,14 +106,16 @@ void innovator_fpga_IRQ_demux(unsigned int irq, struct irqdesc *desc, } } -static struct irqchip omap_fpga_irq_ack = { +static struct irq_chip omap_fpga_irq_ack = { + .name = "FPGA-ack", .ack = fpga_mask_ack_irq, .mask = fpga_mask_irq, .unmask = fpga_unmask_irq, }; -static struct irqchip omap_fpga_irq = { +static struct irq_chip omap_fpga_irq = { + .name = "FPGA", .ack = fpga_ack_irq, .mask = fpga_mask_irq, .unmask = fpga_unmask_irq, @@ -134,7 +135,7 @@ static struct irqchip omap_fpga_irq = { * mask_ack routine for all of the FPGA interrupts has been changed from * fpga_mask_ack_irq() to fpga_ack_irq() so that the specific FPGA interrupt * being serviced is left unmasked. We can do this because the FPGA cascade - * interrupt is installed with the SA_INTERRUPT flag, which leaves all + * interrupt is installed with the IRQF_DISABLED flag, which leaves all * interrupts masked at the CPU while an FPGA interrupt handler executes. * * Limited testing indicates that this workaround appears to be effective diff --git a/arch/arm/mach-omap1/id.c b/arch/arm/mach-omap1/id.c index 5c637c048..da13c3e82 100644 --- a/arch/arm/mach-omap1/id.c +++ b/arch/arm/mach-omap1/id.c @@ -11,7 +11,6 @@ * published by the Free Software Foundation. */ -#include #include #include #include diff --git a/arch/arm/mach-omap1/io.c b/arch/arm/mach-omap1/io.c index be3a2a4ee..fab8b0b27 100644 --- a/arch/arm/mach-omap1/io.c +++ b/arch/arm/mach-omap1/io.c @@ -8,7 +8,6 @@ * published by the Free Software Foundation. */ -#include #include #include #include diff --git a/arch/arm/mach-omap1/irq.c b/arch/arm/mach-omap1/irq.c index a0431c00f..3ea140bb9 100644 --- a/arch/arm/mach-omap1/irq.c +++ b/arch/arm/mach-omap1/irq.c @@ -36,7 +36,6 @@ * 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include #include #include @@ -169,7 +168,8 @@ static struct omap_irq_bank omap1610_irq_banks[] = { }; #endif -static struct irqchip omap_irq_chip = { +static struct irq_chip omap_irq_chip = { + .name = "MPU", .ack = omap_mask_ack_irq, .mask = omap_mask_irq, .unmask = omap_unmask_irq, diff --git a/arch/arm/mach-omap1/leds-h2p2-debug.c b/arch/arm/mach-omap1/leds-h2p2-debug.c index 650650815..8976fbb21 100644 --- a/arch/arm/mach-omap1/leds-h2p2-debug.c +++ b/arch/arm/mach-omap1/leds-h2p2-debug.c @@ -9,7 +9,6 @@ * The "surfer" expansion board and H2 sample board also have two-color * green+red LEDs (in parallel), used here for timer and idle indicators. */ -#include #include #include #include diff --git a/arch/arm/mach-omap1/leds-innovator.c b/arch/arm/mach-omap1/leds-innovator.c index c8ffd1ddc..a0cd001ac 100644 --- a/arch/arm/mach-omap1/leds-innovator.c +++ b/arch/arm/mach-omap1/leds-innovator.c @@ -1,7 +1,6 @@ /* * linux/arch/arm/mach-omap1/leds-innovator.c */ -#include #include #include diff --git a/arch/arm/mach-omap1/leds-osk.c b/arch/arm/mach-omap1/leds-osk.c index 2c8bda847..3b29e59b0 100644 --- a/arch/arm/mach-omap1/leds-osk.c +++ b/arch/arm/mach-omap1/leds-osk.c @@ -3,7 +3,6 @@ * * LED driver for OSK, and optionally Mistral QVGA, boards */ -#include #include #include diff --git a/arch/arm/mach-omap1/mux.c b/arch/arm/mach-omap1/mux.c index 10fe0b3ef..fa74ef7af 100644 --- a/arch/arm/mach-omap1/mux.c +++ b/arch/arm/mach-omap1/mux.c @@ -22,7 +22,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ -#include #include #include #include diff --git a/arch/arm/mach-omap1/pm.c b/arch/arm/mach-omap1/pm.c index ddf6b07dc..cd76185ba 100644 --- a/arch/arm/mach-omap1/pm.c +++ b/arch/arm/mach-omap1/pm.c @@ -1,3 +1,4 @@ +//kernel/linux-omap-fsample/arch/arm/mach-omap1/pm.c#3 - integrate change 4545 (text) /* * linux/arch/arm/mach-omap1/pm.c * @@ -50,6 +51,7 @@ #include #include +#include #include #include #include @@ -326,8 +328,9 @@ void omap_pm_suspend(void) /* stop DSP */ omap_writew(omap_readw(ARM_RSTCT1) & ~(1 << DSP_EN), ARM_RSTCT1); - /* shut down dsp_ck */ - omap_writew(omap_readw(ARM_CKCTL) & ~(1 << EN_DSPCK), ARM_CKCTL); + /* shut down dsp_ck */ + if (!cpu_is_omap730()) + omap_writew(omap_readw(ARM_CKCTL) & ~(1 << EN_DSPCK), ARM_CKCTL); /* temporarily enabling api_ck to access DSP registers */ omap_writew(omap_readw(ARM_IDLECT2) | 1 << EN_APICK, ARM_IDLECT2); @@ -687,7 +690,7 @@ static irqreturn_t omap_wakeup_interrupt(int irq, void * dev, static struct irqaction omap_wakeup_irq = { .name = "peripheral wakeup", - .flags = SA_INTERRUPT, + .flags = IRQF_DISABLED, .handler = omap_wakeup_interrupt }; diff --git a/arch/arm/mach-omap1/serial.c b/arch/arm/mach-omap1/serial.c index 9b4cd698b..976edfb88 100644 --- a/arch/arm/mach-omap1/serial.c +++ b/arch/arm/mach-omap1/serial.c @@ -8,10 +8,10 @@ * published by the Free Software Foundation. */ -#include #include #include #include +#include #include #include #include @@ -253,7 +253,7 @@ static void __init omap_serial_set_port_wakeup(int gpio_nr) } omap_set_gpio_direction(gpio_nr, 1); ret = request_irq(OMAP_GPIO_IRQ(gpio_nr), &omap_serial_wake_interrupt, - SA_TRIGGER_RISING, "serial wakeup", NULL); + IRQF_TRIGGER_RISING, "serial wakeup", NULL); if (ret) { omap_free_gpio(gpio_nr); printk(KERN_ERR "No interrupt for UART wake GPIO: %i\n", diff --git a/arch/arm/mach-omap1/sleep.S b/arch/arm/mach-omap1/sleep.S index e58295e2d..abef33d10 100644 --- a/arch/arm/mach-omap1/sleep.S +++ b/arch/arm/mach-omap1/sleep.S @@ -32,7 +32,6 @@ * 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include #include #include diff --git a/arch/arm/mach-omap1/time.c b/arch/arm/mach-omap1/time.c index a85fe6066..4d91b9f51 100644 --- a/arch/arm/mach-omap1/time.c +++ b/arch/arm/mach-omap1/time.c @@ -33,7 +33,6 @@ * 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include #include #include @@ -94,7 +93,7 @@ static inline unsigned long long cycles_2_ns(unsigned long long cyc) * will break. On P2, the timer count rate is 6.5 MHz after programming PTV * with 0. This divides the 13MHz input by 2, and is undocumented. */ -#ifdef CONFIG_MACH_OMAP_PERSEUS2 +#if defined(CONFIG_MACH_OMAP_PERSEUS2) || defined(CONFIG_MACH_OMAP_FSAMPLE) /* REVISIT: This ifdef construct should be replaced by a query to clock * framework to see if timer base frequency is 12.0, 13.0 or 19.2 MHz. */ @@ -178,7 +177,7 @@ static irqreturn_t omap_mpu_timer_interrupt(int irq, void *dev_id, static struct irqaction omap_mpu_timer_irq = { .name = "mpu timer", - .flags = SA_INTERRUPT | SA_TIMER, + .flags = IRQF_DISABLED | IRQF_TIMER, .handler = omap_mpu_timer_interrupt, }; @@ -192,7 +191,7 @@ static irqreturn_t omap_mpu_timer1_interrupt(int irq, void *dev_id, static struct irqaction omap_mpu_timer1_irq = { .name = "mpu timer1 overflow", - .flags = SA_INTERRUPT, + .flags = IRQF_DISABLED, .handler = omap_mpu_timer1_interrupt, }; diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index 537dd2e6d..aab97ccf1 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig @@ -8,6 +8,7 @@ config ARCH_OMAP24XX config ARCH_OMAP2420 bool "OMAP2420 support" depends on ARCH_OMAP24XX + select OMAP_DM_TIMER comment "OMAP Board Type" depends on ARCH_OMAP2 diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index 111eaa642..266d88e77 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile @@ -3,12 +3,13 @@ # # Common support -obj-y := irq.o id.o io.o sram-fn.o memory.o prcm.o clock.o mux.o devices.o serial.o +obj-y := irq.o id.o io.o sram-fn.o memory.o prcm.o clock.o mux.o devices.o \ + serial.o gpmc.o obj-$(CONFIG_OMAP_MPU_TIMER) += timer-gp.o # Power Management -obj-$(CONFIG_PM) += pm.o sleep.o +obj-$(CONFIG_PM) += pm.o pm-domain.o sleep.o # Specific board support obj-$(CONFIG_MACH_OMAP_GENERIC) += board-generic.o diff --git a/arch/arm/mach-omap2/board-apollon.c b/arch/arm/mach-omap2/board-apollon.c index 6c6ba172c..7993b7bae 100644 --- a/arch/arm/mach-omap2/board-apollon.c +++ b/arch/arm/mach-omap2/board-apollon.c @@ -234,17 +234,17 @@ static void __init apollon_sw_init(void) set_irq_type(OMAP_GPIO_IRQ(SW_ENTER_GPIO16), IRQT_RISING); if (request_irq(OMAP_GPIO_IRQ(SW_ENTER_GPIO16), &apollon_sw_interrupt, - SA_SHIRQ, "enter sw", + IRQF_SHARED, "enter sw", &apollon_sw_interrupt)) return; set_irq_type(OMAP_GPIO_IRQ(SW_UP_GPIO17), IRQT_RISING); if (request_irq(OMAP_GPIO_IRQ(SW_UP_GPIO17), &apollon_sw_interrupt, - SA_SHIRQ, "up sw", + IRQF_SHARED, "up sw", &apollon_sw_interrupt)) return; set_irq_type(OMAP_GPIO_IRQ(SW_DOWN_GPIO58), IRQT_RISING); if (request_irq(OMAP_GPIO_IRQ(SW_DOWN_GPIO58), &apollon_sw_interrupt, - SA_SHIRQ, "down sw", + IRQF_SHARED, "down sw", &apollon_sw_interrupt)) return; } diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c index 72eb4bf57..d1b648a4e 100644 --- a/arch/arm/mach-omap2/clock.c +++ b/arch/arm/mach-omap2/clock.c @@ -15,7 +15,6 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ -#include #include #include #include @@ -660,26 +659,35 @@ static int omap2_clk_set_rate(struct clk *clk, unsigned long rate) /* Isolate control register */ div_sel = (SRC_RATE_SEL_MASK & clk->flags); - div_off = clk->src_offset; + div_off = clk->rate_offset; validrate = omap2_clksel_round_rate(clk, rate, &new_div); - if(validrate != rate) + if (validrate != rate) return(ret); field_val = omap2_get_clksel(&div_sel, &field_mask, clk); if (div_sel == 0) return ret; - if(clk->flags & CM_SYSCLKOUT_SEL1){ - switch(new_div){ - case 16: field_val = 4; break; - case 8: field_val = 3; break; - case 4: field_val = 2; break; - case 2: field_val = 1; break; - case 1: field_val = 0; break; + if (clk->flags & CM_SYSCLKOUT_SEL1) { + switch (new_div) { + case 16: + field_val = 4; + break; + case 8: + field_val = 3; + break; + case 4: + field_val = 2; + break; + case 2: + field_val = 1; + break; + case 1: + field_val = 0; + break; } - } - else + } else field_val = new_div; reg = (void __iomem *)div_sel; @@ -744,7 +752,7 @@ static u32 omap2_get_src_field(u32 *type_to_addr, u32 reg_offset, val = 0x2; break; case CM_WKUP_SEL1: - src_reg_addr = (u32)&CM_CLKSEL2_CORE; + src_reg_addr = (u32)&CM_CLKSEL_WKUP; mask = 0x3; if (src_clk == &func_32k_ck) val = 0x0; @@ -784,9 +792,9 @@ static u32 omap2_get_src_field(u32 *type_to_addr, u32 reg_offset, val = 0; if (src_clk == &sys_ck) val = 1; - if (src_clk == &func_54m_ck) - val = 2; if (src_clk == &func_96m_ck) + val = 2; + if (src_clk == &func_54m_ck) val = 3; break; } diff --git a/arch/arm/mach-omap2/clock.h b/arch/arm/mach-omap2/clock.h index 6c78d471f..2781dfbc5 100644 --- a/arch/arm/mach-omap2/clock.h +++ b/arch/arm/mach-omap2/clock.h @@ -1062,7 +1062,7 @@ static struct clk gpt2_ick = { .parent = &l4_ck, .flags = CLOCK_IN_OMAP242X | CLOCK_IN_OMAP243X, .enable_reg = (void __iomem *)&CM_ICLKEN1_CORE, /* Bit4 */ - .enable_bit = 0, + .enable_bit = 4, .recalc = &omap2_followparent_recalc, }; diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index fb7f91da1..aa4322451 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c @@ -9,7 +9,6 @@ * (at your option) any later version. */ -#include #include #include #include @@ -105,6 +104,51 @@ static inline void omap_init_sti(void) static inline void omap_init_sti(void) {} #endif +#if defined(CONFIG_SPI_OMAP24XX) + +#include + +#define OMAP2_MCSPI1_BASE 0x48098000 +#define OMAP2_MCSPI2_BASE 0x4809a000 + +/* FIXME: use resources instead */ + +static struct omap2_mcspi_platform_config omap2_mcspi1_config = { + .base = io_p2v(OMAP2_MCSPI1_BASE), + .num_cs = 4, +}; + +struct platform_device omap2_mcspi1 = { + .name = "omap2_mcspi", + .id = 1, + .dev = { + .platform_data = &omap2_mcspi1_config, + }, +}; + +static struct omap2_mcspi_platform_config omap2_mcspi2_config = { + .base = io_p2v(OMAP2_MCSPI2_BASE), + .num_cs = 2, +}; + +struct platform_device omap2_mcspi2 = { + .name = "omap2_mcspi", + .id = 2, + .dev = { + .platform_data = &omap2_mcspi2_config, + }, +}; + +static void omap_init_mcspi(void) +{ + platform_device_register(&omap2_mcspi1); + platform_device_register(&omap2_mcspi2); +} + +#else +static inline void omap_init_mcspi(void) {} +#endif + /*-------------------------------------------------------------------------*/ static int __init omap2_init_devices(void) @@ -113,6 +157,7 @@ static int __init omap2_init_devices(void) * in alphabetical order so they're easier to sort through. */ omap_init_i2c(); + omap_init_mcspi(); omap_init_sti(); return 0; diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index 76187300f..871ace4fc 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c @@ -11,7 +11,6 @@ * published by the Free Software Foundation. */ -#include #include #include #include diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 7d5711611..a0728c33e 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c @@ -11,7 +11,6 @@ * published by the Free Software Foundation. */ -#include #include #include #include @@ -27,6 +26,7 @@ extern void omap_sram_init(void); extern int omap2_clk_init(void); extern void omap2_check_revision(void); +extern void gpmc_init(void); /* * The machine specific code may provide the extra mapping besides the @@ -67,4 +67,5 @@ void __init omap2_init_common_hw(void) { omap2_mux_init(); omap2_clk_init(); + gpmc_init(); } diff --git a/arch/arm/mach-omap2/irq.c b/arch/arm/mach-omap2/irq.c index d7baff675..dfc3b35cc 100644 --- a/arch/arm/mach-omap2/irq.c +++ b/arch/arm/mach-omap2/irq.c @@ -12,7 +12,6 @@ */ #include #include -#include #include #include #include @@ -95,7 +94,8 @@ static void omap_mask_ack_irq(unsigned int irq) omap_ack_irq(irq); } -static struct irqchip omap_irq_chip = { +static struct irq_chip omap_irq_chip = { + .name = "INTC", .ack = omap_mask_ack_irq, .mask = omap_mask_irq, .unmask = omap_unmask_irq, diff --git a/arch/arm/mach-omap2/memory.c b/arch/arm/mach-omap2/memory.c index 1d925d69f..85cbc2a2e 100644 --- a/arch/arm/mach-omap2/memory.c +++ b/arch/arm/mach-omap2/memory.c @@ -14,7 +14,6 @@ * published by the Free Software Foundation. */ -#include #include #include #include diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c index 1197dc38c..60ef084fa 100644 --- a/arch/arm/mach-omap2/mux.c +++ b/arch/arm/mach-omap2/mux.c @@ -22,7 +22,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ -#include #include #include #include @@ -53,6 +52,12 @@ MUX_CFG_24XX("W19_24XX_SYS_NIRQ", 0x12c, 0, 1, 1, 1) /* 24xx clocks */ MUX_CFG_24XX("W14_24XX_SYS_CLKOUT", 0x137, 0, 1, 1, 1) +/* 24xx GPMC wait pin monitoring */ +MUX_CFG_24XX("L3_GPMC_WAIT0", 0x09a, 0, 1, 1, 1) +MUX_CFG_24XX("N7_GPMC_WAIT1", 0x09b, 0, 1, 1, 1) +MUX_CFG_24XX("M1_GPMC_WAIT2", 0x09c, 0, 1, 1, 1) +MUX_CFG_24XX("P1_GPMC_WAIT3", 0x09d, 0, 1, 1, 1) + /* 24xx McBSP */ MUX_CFG_24XX("Y15_24XX_MCBSP2_CLKX", 0x124, 1, 1, 0, 1) MUX_CFG_24XX("R14_24XX_MCBSP2_FSX", 0x125, 1, 1, 0, 1) @@ -60,18 +65,38 @@ MUX_CFG_24XX("W15_24XX_MCBSP2_DR", 0x126, 1, 1, 0, 1) MUX_CFG_24XX("V15_24XX_MCBSP2_DX", 0x127, 1, 1, 0, 1) /* 24xx GPIO */ -MUX_CFG_24XX("M21_242X_GPIO11", 0x0c9, 3, 1, 1, 1) +MUX_CFG_24XX("M21_242X_GPIO11", 0x0c9, 3, 1, 1, 1) MUX_CFG_24XX("AA10_242X_GPIO13", 0x0e5, 3, 0, 0, 1) -MUX_CFG_24XX("AA6_242X_GPIO14", 0x0e6, 3, 0, 0, 1) -MUX_CFG_24XX("AA4_242X_GPIO15", 0x0e7, 3, 0, 0, 1) -MUX_CFG_24XX("Y11_242X_GPIO16", 0x0e8, 3, 0, 0, 1) +MUX_CFG_24XX("AA6_242X_GPIO14", 0x0e6, 3, 0, 0, 1) +MUX_CFG_24XX("AA4_242X_GPIO15", 0x0e7, 3, 0, 0, 1) +MUX_CFG_24XX("Y11_242X_GPIO16", 0x0e8, 3, 0, 0, 1) MUX_CFG_24XX("AA12_242X_GPIO17", 0x0e9, 3, 0, 0, 1) -MUX_CFG_24XX("AA8_242X_GPIO58", 0x0ea, 3, 0, 0, 1) +MUX_CFG_24XX("AA8_242X_GPIO58", 0x0ea, 3, 0, 0, 1) MUX_CFG_24XX("Y20_24XX_GPIO60", 0x12c, 3, 0, 0, 1) -MUX_CFG_24XX("W4__24XX_GPIO74", 0x0f2, 3, 0, 0, 1) +MUX_CFG_24XX("W4__24XX_GPIO74", 0x0f2, 3, 0, 0, 1) MUX_CFG_24XX("M15_24XX_GPIO92", 0x10a, 3, 0, 0, 1) MUX_CFG_24XX("V14_24XX_GPIO117", 0x128, 3, 1, 0, 1) +/* 242x DBG GPIO */ +MUX_CFG_24XX("V4_242X_GPIO49", 0xd3, 3, 0, 0, 1) +MUX_CFG_24XX("W2_242X_GPIO50", 0xd4, 3, 0, 0, 1) +MUX_CFG_24XX("U4_242X_GPIO51", 0xd5, 3, 0, 0, 1) +MUX_CFG_24XX("V3_242X_GPIO52", 0xd6, 3, 0, 0, 1) +MUX_CFG_24XX("V2_242X_GPIO53", 0xd7, 3, 0, 0, 1) +MUX_CFG_24XX("V6_242X_GPIO53", 0xcf, 3, 0, 0, 1) +MUX_CFG_24XX("T4_242X_GPIO54", 0xd8, 3, 0, 0, 1) +MUX_CFG_24XX("Y4_242X_GPIO54", 0xd0, 3, 0, 0, 1) +MUX_CFG_24XX("T3_242X_GPIO55", 0xd9, 3, 0, 0, 1) +MUX_CFG_24XX("U2_242X_GPIO56", 0xda, 3, 0, 0, 1) + +/* 24xx external DMA requests */ +MUX_CFG_24XX("AA10_242X_DMAREQ0", 0x0e5, 2, 0, 0, 1) +MUX_CFG_24XX("AA6_242X_DMAREQ1", 0x0e6, 2, 0, 0, 1) +MUX_CFG_24XX("E4_242X_DMAREQ2", 0x074, 2, 0, 0, 1) +MUX_CFG_24XX("G4_242X_DMAREQ3", 0x073, 2, 0, 0, 1) +MUX_CFG_24XX("D3_242X_DMAREQ4", 0x072, 2, 0, 0, 1) +MUX_CFG_24XX("E3_242X_DMAREQ5", 0x071, 2, 0, 0, 1) + /* TSC IRQ */ MUX_CFG_24XX("P20_24XX_TSC_IRQ", 0x108, 0, 0, 0, 1) diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c index 562168fa2..d7eee99b7 100644 --- a/arch/arm/mach-omap2/pm.c +++ b/arch/arm/mach-omap2/pm.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -36,11 +37,18 @@ #include #include +#include "prcm-regs.h" + static struct clk *vclk; static void (*omap2_sram_idle)(void); static void (*omap2_sram_suspend)(int dllctrl, int cpu_rev); static void (*saved_idle)(void); +extern void __init pmdomain_init(void); +extern void pmdomain_set_autoidle(void); + +static unsigned int omap24xx_sleep_save[OMAP24XX_SLEEP_SAVE_SIZE]; + void omap2_pm_idle(void) { local_irq_disable(); @@ -87,23 +95,272 @@ static int omap2_pm_prepare(suspend_state_t state) return error; } +#define INT0_WAKE_MASK (OMAP_IRQ_BIT(INT_24XX_GPIO_BANK1) | \ + OMAP_IRQ_BIT(INT_24XX_GPIO_BANK2) | \ + OMAP_IRQ_BIT(INT_24XX_GPIO_BANK3)) + +#define INT1_WAKE_MASK (OMAP_IRQ_BIT(INT_24XX_GPIO_BANK4)) + +#define INT2_WAKE_MASK (OMAP_IRQ_BIT(INT_24XX_UART1_IRQ) | \ + OMAP_IRQ_BIT(INT_24XX_UART2_IRQ) | \ + OMAP_IRQ_BIT(INT_24XX_UART3_IRQ)) + +#define preg(reg) printk("%s\t(0x%p):\t0x%08x\n", #reg, ®, reg); + +static void omap2_pm_debug(char * desc) +{ + printk("%s:\n", desc); + + preg(CM_CLKSTCTRL_MPU); + preg(CM_CLKSTCTRL_CORE); + preg(CM_CLKSTCTRL_GFX); + preg(CM_CLKSTCTRL_DSP); + preg(CM_CLKSTCTRL_MDM); + + preg(PM_PWSTCTRL_MPU); + preg(PM_PWSTCTRL_CORE); + preg(PM_PWSTCTRL_GFX); + preg(PM_PWSTCTRL_DSP); + preg(PM_PWSTCTRL_MDM); + + preg(PM_PWSTST_MPU); + preg(PM_PWSTST_CORE); + preg(PM_PWSTST_GFX); + preg(PM_PWSTST_DSP); + preg(PM_PWSTST_MDM); + + preg(CM_AUTOIDLE1_CORE); + preg(CM_AUTOIDLE2_CORE); + preg(CM_AUTOIDLE3_CORE); + preg(CM_AUTOIDLE4_CORE); + preg(CM_AUTOIDLE_WKUP); + preg(CM_AUTOIDLE_PLL); + preg(CM_AUTOIDLE_DSP); + preg(CM_AUTOIDLE_MDM); + + preg(CM_ICLKEN1_CORE); + preg(CM_ICLKEN2_CORE); + preg(CM_ICLKEN3_CORE); + preg(CM_ICLKEN4_CORE); + preg(CM_ICLKEN_GFX); + preg(CM_ICLKEN_WKUP); + preg(CM_ICLKEN_DSP); + preg(CM_ICLKEN_MDM); + + preg(CM_IDLEST1_CORE); + preg(CM_IDLEST2_CORE); + preg(CM_IDLEST3_CORE); + preg(CM_IDLEST4_CORE); + preg(CM_IDLEST_GFX); + preg(CM_IDLEST_WKUP); + preg(CM_IDLEST_CKGEN); + preg(CM_IDLEST_DSP); + preg(CM_IDLEST_MDM); + + preg(RM_RSTST_MPU); + preg(RM_RSTST_GFX); + preg(RM_RSTST_WKUP); + preg(RM_RSTST_DSP); + preg(RM_RSTST_MDM); + + preg(PM_WKDEP_MPU); + preg(PM_WKDEP_CORE); + preg(PM_WKDEP_GFX); + preg(PM_WKDEP_DSP); + preg(PM_WKDEP_MDM); + + preg(CM_FCLKEN_WKUP); + preg(CM_ICLKEN_WKUP); + preg(CM_IDLEST_WKUP); + preg(CM_AUTOIDLE_WKUP); + preg(CM_CLKSEL_WKUP); + + preg(PM_WKEN_WKUP); + preg(PM_WKST_WKUP); +} + +static inline void omap2_pm_save_registers(void) +{ + /* Save interrupt registers */ + OMAP24XX_SAVE(INTC_MIR0); + OMAP24XX_SAVE(INTC_MIR1); + OMAP24XX_SAVE(INTC_MIR2); + + /* Save power control registers */ + OMAP24XX_SAVE(CM_CLKSTCTRL_MPU); + OMAP24XX_SAVE(CM_CLKSTCTRL_CORE); + OMAP24XX_SAVE(CM_CLKSTCTRL_GFX); + OMAP24XX_SAVE(CM_CLKSTCTRL_DSP); + OMAP24XX_SAVE(CM_CLKSTCTRL_MDM); + + /* Save power state registers */ + OMAP24XX_SAVE(PM_PWSTCTRL_MPU); + OMAP24XX_SAVE(PM_PWSTCTRL_CORE); + OMAP24XX_SAVE(PM_PWSTCTRL_GFX); + OMAP24XX_SAVE(PM_PWSTCTRL_DSP); + OMAP24XX_SAVE(PM_PWSTCTRL_MDM); + + /* Save autoidle registers */ + OMAP24XX_SAVE(CM_AUTOIDLE1_CORE); + OMAP24XX_SAVE(CM_AUTOIDLE2_CORE); + OMAP24XX_SAVE(CM_AUTOIDLE3_CORE); + OMAP24XX_SAVE(CM_AUTOIDLE4_CORE); + OMAP24XX_SAVE(CM_AUTOIDLE_WKUP); + OMAP24XX_SAVE(CM_AUTOIDLE_PLL); + OMAP24XX_SAVE(CM_AUTOIDLE_DSP); + OMAP24XX_SAVE(CM_AUTOIDLE_MDM); + + /* Save idle state registers */ + OMAP24XX_SAVE(CM_IDLEST1_CORE); + OMAP24XX_SAVE(CM_IDLEST2_CORE); + OMAP24XX_SAVE(CM_IDLEST3_CORE); + OMAP24XX_SAVE(CM_IDLEST4_CORE); + OMAP24XX_SAVE(CM_IDLEST_GFX); + OMAP24XX_SAVE(CM_IDLEST_WKUP); + OMAP24XX_SAVE(CM_IDLEST_CKGEN); + OMAP24XX_SAVE(CM_IDLEST_DSP); + OMAP24XX_SAVE(CM_IDLEST_MDM); + + /* Save clock registers */ + OMAP24XX_SAVE(CM_FCLKEN1_CORE); + OMAP24XX_SAVE(CM_FCLKEN2_CORE); + OMAP24XX_SAVE(CM_ICLKEN1_CORE); + OMAP24XX_SAVE(CM_ICLKEN2_CORE); + OMAP24XX_SAVE(CM_ICLKEN3_CORE); + OMAP24XX_SAVE(CM_ICLKEN4_CORE); +} + +static inline void omap2_pm_restore_registers(void) +{ + /* Restore clock state registers */ + OMAP24XX_RESTORE(CM_CLKSTCTRL_MPU); + OMAP24XX_RESTORE(CM_CLKSTCTRL_CORE); + OMAP24XX_RESTORE(CM_CLKSTCTRL_GFX); + OMAP24XX_RESTORE(CM_CLKSTCTRL_DSP); + OMAP24XX_RESTORE(CM_CLKSTCTRL_MDM); + + /* Restore power state registers */ + OMAP24XX_RESTORE(PM_PWSTCTRL_MPU); + OMAP24XX_RESTORE(PM_PWSTCTRL_CORE); + OMAP24XX_RESTORE(PM_PWSTCTRL_GFX); + OMAP24XX_RESTORE(PM_PWSTCTRL_DSP); + OMAP24XX_RESTORE(PM_PWSTCTRL_MDM); + + /* Restore idle state registers */ + OMAP24XX_RESTORE(CM_IDLEST1_CORE); + OMAP24XX_RESTORE(CM_IDLEST2_CORE); + OMAP24XX_RESTORE(CM_IDLEST3_CORE); + OMAP24XX_RESTORE(CM_IDLEST4_CORE); + OMAP24XX_RESTORE(CM_IDLEST_GFX); + OMAP24XX_RESTORE(CM_IDLEST_WKUP); + OMAP24XX_RESTORE(CM_IDLEST_CKGEN); + OMAP24XX_RESTORE(CM_IDLEST_DSP); + OMAP24XX_RESTORE(CM_IDLEST_MDM); + + /* Restore autoidle registers */ + OMAP24XX_RESTORE(CM_AUTOIDLE1_CORE); + OMAP24XX_RESTORE(CM_AUTOIDLE2_CORE); + OMAP24XX_RESTORE(CM_AUTOIDLE3_CORE); + OMAP24XX_RESTORE(CM_AUTOIDLE4_CORE); + OMAP24XX_RESTORE(CM_AUTOIDLE_WKUP); + OMAP24XX_RESTORE(CM_AUTOIDLE_PLL); + OMAP24XX_RESTORE(CM_AUTOIDLE_DSP); + OMAP24XX_RESTORE(CM_AUTOIDLE_MDM); + + /* Restore clock registers */ + OMAP24XX_RESTORE(CM_FCLKEN1_CORE); + OMAP24XX_RESTORE(CM_FCLKEN2_CORE); + OMAP24XX_RESTORE(CM_ICLKEN1_CORE); + OMAP24XX_RESTORE(CM_ICLKEN2_CORE); + OMAP24XX_RESTORE(CM_ICLKEN3_CORE); + OMAP24XX_RESTORE(CM_ICLKEN4_CORE); + + /* REVISIT: Clear interrupts here */ + + /* Restore interrupt registers */ + OMAP24XX_RESTORE(INTC_MIR0); + OMAP24XX_RESTORE(INTC_MIR1); + OMAP24XX_RESTORE(INTC_MIR2); +} + +static int omap2_pm_suspend(void) +{ + int processor_type = 0; + + /* REVISIT: 0x21 or 0x26? */ + if (cpu_is_omap2420()) + processor_type = 0x21; + + if (!processor_type) + return -ENOTSUPP; + + local_irq_disable(); + local_fiq_disable(); + + omap2_pm_save_registers(); + + /* Disable interrupts except for the wake events */ + INTC_MIR_SET0 = 0xffffffff & ~INT0_WAKE_MASK; + INTC_MIR_SET1 = 0xffffffff & ~INT1_WAKE_MASK; + INTC_MIR_SET2 = 0xffffffff & ~INT2_WAKE_MASK; + + pmdomain_set_autoidle(); + + /* Clear old wake-up events */ + PM_WKST1_CORE = 0; + PM_WKST2_CORE = 0; + PM_WKST_WKUP = 0; + + /* Enable wake-up events */ + PM_WKEN1_CORE = (1 << 22) | (1 << 21); /* UART1 & 2 */ + PM_WKEN2_CORE = (1 << 2); /* UART3 */ + PM_WKEN_WKUP = (1 << 2) | (1 << 0); /* GPIO & GPT1 */ + + /* Disable clocks except for CM_ICLKEN2_CORE. It gets disabled + * in the SRAM suspend code */ + CM_FCLKEN1_CORE = 0; + CM_FCLKEN2_CORE = 0; + CM_ICLKEN1_CORE = 0; + CM_ICLKEN3_CORE = 0; + CM_ICLKEN4_CORE = 0; + + omap2_pm_debug("Status before suspend"); + + /* Must wait for serial buffers to clear */ + mdelay(200); + + /* Jump to SRAM suspend code + * REVISIT: When is this SDRC_DLLB_CTRL? + */ + omap2_sram_suspend(SDRC_DLLA_CTRL, processor_type); + + /* Back from sleep */ + omap2_pm_restore_registers(); + + local_fiq_enable(); + local_irq_enable(); + + return 0; +} + static int omap2_pm_enter(suspend_state_t state) { + int ret = 0; + switch (state) { case PM_SUSPEND_STANDBY: case PM_SUSPEND_MEM: - /* FIXME: Add suspend */ + ret = omap2_pm_suspend(); break; - case PM_SUSPEND_DISK: - return -ENOTSUPP; - + ret = -ENOTSUPP; + break; default: - return -EINVAL; + ret = -EINVAL; } - return 0; + return ret; } static int omap2_pm_finish(suspend_state_t state) @@ -143,6 +400,8 @@ int __init omap2_pm_init(void) pm_set_ops(&omap_pm_ops); pm_idle = omap2_pm_idle; + pmdomain_init(); + return 0; } diff --git a/arch/arm/mach-omap2/prcm.c b/arch/arm/mach-omap2/prcm.c index 8893479dc..c2bf57ef6 100644 --- a/arch/arm/mach-omap2/prcm.c +++ b/arch/arm/mach-omap2/prcm.c @@ -13,7 +13,6 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ -#include #include #include #include diff --git a/arch/arm/mach-omap2/sleep.S b/arch/arm/mach-omap2/sleep.S index 00299cbeb..16247d557 100644 --- a/arch/arm/mach-omap2/sleep.S +++ b/arch/arm/mach-omap2/sleep.S @@ -21,7 +21,6 @@ * MA 02111-1307 USA */ -#include #include #include #include diff --git a/arch/arm/mach-omap2/sram-fn.S b/arch/arm/mach-omap2/sram-fn.S index d261e4ff4..a5ef7f611 100644 --- a/arch/arm/mach-omap2/sram-fn.S +++ b/arch/arm/mach-omap2/sram-fn.S @@ -22,7 +22,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA */ -#include #include #include #include diff --git a/arch/arm/mach-omap2/timer-gp.c b/arch/arm/mach-omap2/timer-gp.c index 1d2f5ac2f..fe5fd6d42 100644 --- a/arch/arm/mach-omap2/timer-gp.c +++ b/arch/arm/mach-omap2/timer-gp.c @@ -6,6 +6,7 @@ * Copyright (C) 2005 Nokia Corporation * Author: Paul Mundt * Juha Yrjölä + * OMAP Dual-mode timer framework support by Timo Teras * * Some parts based off of TI's 24xx code: * @@ -22,54 +23,18 @@ #include #include #include +#include #include -#include -#include +#include -#define OMAP2_GP_TIMER1_BASE 0x48028000 -#define OMAP2_GP_TIMER2_BASE 0x4802a000 -#define OMAP2_GP_TIMER3_BASE 0x48078000 -#define OMAP2_GP_TIMER4_BASE 0x4807a000 +static struct omap_dm_timer *gptimer; -#define GP_TIMER_TIDR 0x00 -#define GP_TIMER_TISR 0x18 -#define GP_TIMER_TIER 0x1c -#define GP_TIMER_TCLR 0x24 -#define GP_TIMER_TCRR 0x28 -#define GP_TIMER_TLDR 0x2c -#define GP_TIMER_TSICR 0x40 - -#define OS_TIMER_NR 1 /* GP timer 2 */ - -static unsigned long timer_base[] = { - IO_ADDRESS(OMAP2_GP_TIMER1_BASE), - IO_ADDRESS(OMAP2_GP_TIMER2_BASE), - IO_ADDRESS(OMAP2_GP_TIMER3_BASE), - IO_ADDRESS(OMAP2_GP_TIMER4_BASE), -}; - -static inline unsigned int timer_read_reg(int nr, unsigned int reg) -{ - return __raw_readl(timer_base[nr] + reg); -} - -static inline void timer_write_reg(int nr, unsigned int reg, unsigned int val) -{ - __raw_writel(val, timer_base[nr] + reg); -} - -/* Note that we always enable the clock prescale divider bit */ -static inline void omap2_gp_timer_start(int nr, unsigned long load_val) +static inline void omap2_gp_timer_start(unsigned long load_val) { - unsigned int tmp; - - tmp = 0xffffffff - load_val; - - timer_write_reg(nr, GP_TIMER_TLDR, tmp); - timer_write_reg(nr, GP_TIMER_TCRR, tmp); - timer_write_reg(nr, GP_TIMER_TIER, 1 << 1); - timer_write_reg(nr, GP_TIMER_TCLR, (1 << 5) | (1 << 1) | 1); + omap_dm_timer_set_load(gptimer, 1, 0xffffffff - load_val); + omap_dm_timer_set_int_enable(gptimer, OMAP_TIMER_INT_OVERFLOW); + omap_dm_timer_start(gptimer); } static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id, @@ -77,7 +42,7 @@ static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id, { write_seqlock(&xtime_lock); - timer_write_reg(OS_TIMER_NR, GP_TIMER_TISR, 1 << 1); + omap_dm_timer_write_status(gptimer, OMAP_TIMER_INT_OVERFLOW); timer_tick(regs); write_sequnlock(&xtime_lock); @@ -87,41 +52,26 @@ static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id, static struct irqaction omap2_gp_timer_irq = { .name = "gp timer", - .flags = SA_INTERRUPT, + .flags = IRQF_DISABLED | IRQF_TIMER, .handler = omap2_gp_timer_interrupt, }; static void __init omap2_gp_timer_init(void) { - struct clk * sys_ck; - u32 tick_period = 120000; - u32 l; + u32 tick_period; - /* Reset clock and prescale value */ - timer_write_reg(OS_TIMER_NR, GP_TIMER_TCLR, 0); + omap_dm_timer_init(); + gptimer = omap_dm_timer_request_specific(1); + BUG_ON(gptimer == NULL); - sys_ck = clk_get(NULL, "sys_ck"); - if (IS_ERR(sys_ck)) - printk(KERN_ERR "Could not get sys_ck\n"); - else { - clk_enable(sys_ck); - tick_period = clk_get_rate(sys_ck) / 100; - clk_put(sys_ck); - } - - tick_period /= 2; /* Minimum prescale divider is 2 */ + omap_dm_timer_set_source(gptimer, OMAP_TIMER_SRC_SYS_CLK); + tick_period = clk_get_rate(omap_dm_timer_get_fclk(gptimer)) / 100; tick_period -= 1; - l = timer_read_reg(OS_TIMER_NR, GP_TIMER_TIDR); - printk(KERN_INFO "OMAP2 GP timer (HW version %d.%d)\n", - (l >> 4) & 0x0f, l & 0x0f); - - setup_irq(38, &omap2_gp_timer_irq); - - omap2_gp_timer_start(OS_TIMER_NR, tick_period); + setup_irq(omap_dm_timer_get_irq(gptimer), &omap2_gp_timer_irq); + omap2_gp_timer_start(tick_period); } struct sys_timer omap_timer = { .init = omap2_gp_timer_init, }; - diff --git a/arch/arm/mach-pxa/Kconfig b/arch/arm/mach-pxa/Kconfig index 0104fd142..03d07cae2 100644 --- a/arch/arm/mach-pxa/Kconfig +++ b/arch/arm/mach-pxa/Kconfig @@ -35,6 +35,10 @@ config PXA_SHARPSL SL-C3000 (Spitz), SL-C3100 (Borzoi) or SL-C6000x (Tosa) handheld computer. +config MACH_TRIZEPS4 + bool "Keith und Koep Trizeps4 DIMM-Module" + select PXA27x + endchoice if PXA_SHARPSL @@ -55,12 +59,28 @@ endchoice endif +if MACH_TRIZEPS4 + +choice + prompt "Select base board for Trizeps 4 module" + +config MACH_TRIZEPS4_CONXS + bool "ConXS Eval Board" + +config MACH_TRIZEPS4_ANY + bool "another Board" + +endchoice + +endif + endmenu config MACH_POODLE bool "Enable Sharp SL-5600 (Poodle) Support" depends PXA_SHARPSL_25x select SHARP_LOCOMO + select PXA_SSP config MACH_CORGI bool "Enable Sharp SL-C700 (Corgi) Support" diff --git a/arch/arm/mach-pxa/Makefile b/arch/arm/mach-pxa/Makefile index 4e8a983e2..9093eb1c9 100644 --- a/arch/arm/mach-pxa/Makefile +++ b/arch/arm/mach-pxa/Makefile @@ -12,10 +12,11 @@ obj-$(CONFIG_ARCH_LUBBOCK) += lubbock.o obj-$(CONFIG_MACH_LOGICPD_PXA270) += lpd270.o obj-$(CONFIG_MACH_MAINSTONE) += mainstone.o obj-$(CONFIG_ARCH_PXA_IDP) += idp.o +obj-$(CONFIG_MACH_TRIZEPS4) += trizeps4.o obj-$(CONFIG_PXA_SHARP_C7xx) += corgi.o corgi_ssp.o corgi_lcd.o sharpsl_pm.o corgi_pm.o obj-$(CONFIG_PXA_SHARP_Cxx00) += spitz.o corgi_ssp.o corgi_lcd.o sharpsl_pm.o spitz_pm.o obj-$(CONFIG_MACH_AKITA) += akita-ioexp.o -obj-$(CONFIG_MACH_POODLE) += poodle.o +obj-$(CONFIG_MACH_POODLE) += poodle.o corgi_ssp.o obj-$(CONFIG_MACH_TOSA) += tosa.o # Support for blinky lights @@ -23,6 +24,7 @@ led-y := leds.o led-$(CONFIG_ARCH_LUBBOCK) += leds-lubbock.o led-$(CONFIG_MACH_MAINSTONE) += leds-mainstone.o led-$(CONFIG_ARCH_PXA_IDP) += leds-idp.o +led-$(CONFIG_MACH_TRIZEPS4) += leds-trizeps4.o obj-$(CONFIG_LEDS) += $(led-y) diff --git a/arch/arm/mach-pxa/corgi.c b/arch/arm/mach-pxa/corgi.c index f691cf77d..cce265769 100644 --- a/arch/arm/mach-pxa/corgi.c +++ b/arch/arm/mach-pxa/corgi.c @@ -14,11 +14,12 @@ #include #include -#include +#include #include #include #include #include +#include #include #include @@ -26,22 +27,24 @@ #include #include #include +#include #include #include #include #include -#include +#include #include #include #include +#include #include #include -#include
- * + * * It is supposed that this pattern must either match one operation on * none. There can't be ambiguity in that case. * @@ -711,15 +710,15 @@ find_operation(struct nandsim *ns, uint32_t flag) { int opsfound = 0; int i, j, idx = 0; - + for (i = 0; i < NS_OPER_NUM; i++) { int found = 1; - + if (!(ns->options & ops[i].reqopts)) /* Ignore operations we can't perform */ continue; - + if (flag) { if (!(ops[i].states[ns->npstates] & STATE_ADDR_MASK)) continue; @@ -728,7 +727,7 @@ find_operation(struct nandsim *ns, uint32_t flag) continue; } - for (j = 0; j < ns->npstates; j++) + for (j = 0; j < ns->npstates; j++) if (NS_STATE(ops[i].states[j]) != NS_STATE(ns->pstates[j]) && (ns->options & ops[idx].reqopts)) { found = 0; @@ -745,7 +744,7 @@ find_operation(struct nandsim *ns, uint32_t flag) /* Exact match */ ns->op = &ops[idx].states[0]; if (flag) { - /* + /* * In this case the find_operation function was * called when address has just began input. But it isn't * yet fully input and the current state must @@ -763,7 +762,7 @@ find_operation(struct nandsim *ns, uint32_t flag) idx, get_state_name(ns->state), get_state_name(ns->nxstate)); return 0; } - + if (opsfound == 0) { /* Nothing was found. Try to ignore previous commands (if any) and search again */ if (ns->npstates != 0) { @@ -777,13 +776,13 @@ find_operation(struct nandsim *ns, uint32_t flag) switch_to_ready_state(ns, NS_STATUS_FAILED(ns)); return -2; } - + if (flag) { /* This shouldn't happen */ NS_DBG("find_operation: BUG, operation must be known if address is input\n"); return -2; } - + NS_DBG("find_operation: there is still ambiguity\n"); ns->pstates[ns->npstates++] = ns->state; @@ -803,7 +802,7 @@ do_state_action(struct nandsim *ns, uint32_t action) int busdiv = ns->busw == 8 ? 1 : 2; action &= ACTION_MASK; - + /* Check that page address input is correct */ if (action != ACTION_SECERASE && ns->regs.row >= ns->geom.pgnum) { NS_WARN("do_state_action: wrong page number (%#x)\n", ns->regs.row); @@ -827,14 +826,14 @@ do_state_action(struct nandsim *ns, uint32_t action) NS_DBG("do_state_action: (ACTION_CPY:) copy %d bytes to int buf, raw offset %d\n", num, NS_RAW_OFFSET(ns) + ns->regs.off); - + if (ns->regs.off == 0) NS_LOG("read page %d\n", ns->regs.row); else if (ns->regs.off < ns->geom.pgsz) NS_LOG("read page %d (second half)\n", ns->regs.row); else NS_LOG("read OOB of page %d\n", ns->regs.row); - + NS_UDELAY(access_delay); NS_UDELAY(input_cycle * ns->geom.pgsz / 1000 / busdiv); @@ -844,30 +843,30 @@ do_state_action(struct nandsim *ns, uint32_t action) /* * Erase sector. */ - + if (ns->lines.wp) { NS_ERR("do_state_action: device is write-protected, ignore sector erase\n"); return -1; } - + if (ns->regs.row >= ns->geom.pgnum - ns->geom.pgsec || (ns->regs.row & ~(ns->geom.secsz - 1))) { NS_ERR("do_state_action: wrong sector address (%#x)\n", ns->regs.row); return -1; } - + ns->regs.row = (ns->regs.row << 8 * (ns->geom.pgaddrbytes - ns->geom.secaddrbytes)) | ns->regs.column; ns->regs.column = 0; - + NS_DBG("do_state_action: erase sector at address %#x, off = %d\n", ns->regs.row, NS_RAW_OFFSET(ns)); NS_LOG("erase sector %d\n", ns->regs.row >> (ns->geom.secshift - ns->geom.pgshift)); memset(ns->mem.byte + NS_RAW_OFFSET(ns), 0xFF, ns->geom.secszoob); - + NS_MDELAY(erase_delay); - + break; case ACTION_PRGPAGE: @@ -893,12 +892,12 @@ do_state_action(struct nandsim *ns, uint32_t action) NS_DBG("do_state_action: copy %d bytes from int buf to (%#x, %#x), raw off = %d\n", num, ns->regs.row, ns->regs.column, NS_RAW_OFFSET(ns) + ns->regs.off); NS_LOG("programm page %d\n", ns->regs.row); - + NS_UDELAY(programm_delay); NS_UDELAY(output_cycle * ns->geom.pgsz / 1000 / busdiv); - + break; - + case ACTION_ZEROOFF: NS_DBG("do_state_action: set internal offset to 0\n"); ns->regs.off = 0; @@ -918,7 +917,7 @@ do_state_action(struct nandsim *ns, uint32_t action) NS_DBG("do_state_action: set internal offset to %d\n", ns->geom.pgsz); ns->regs.off = ns->geom.pgsz; break; - + default: NS_DBG("do_state_action: BUG! unknown action\n"); } @@ -937,7 +936,7 @@ switch_state(struct nandsim *ns) * The current operation have already been identified. * Just follow the states chain. */ - + ns->stateidx += 1; ns->state = ns->nxstate; ns->nxstate = ns->op[ns->stateidx + 1]; @@ -951,14 +950,14 @@ switch_state(struct nandsim *ns) switch_to_ready_state(ns, NS_STATUS_FAILED(ns)); return; } - + } else { /* * We don't yet know which operation we perform. * Try to identify it. */ - /* + /* * The only event causing the switch_state function to * be called with yet unknown operation is new command. */ @@ -987,7 +986,7 @@ switch_state(struct nandsim *ns) */ u_char status = NS_STATUS_OK(ns); - + /* In case of data states, see if all bytes were input/output */ if ((ns->state & (STATE_DATAIN_MASK | STATE_DATAOUT_MASK)) && ns->regs.count != ns->regs.num) { @@ -995,17 +994,17 @@ switch_state(struct nandsim *ns) ns->regs.num - ns->regs.count); status = NS_STATUS_FAILED(ns); } - + NS_DBG("switch_state: operation complete, switch to STATE_READY state\n"); switch_to_ready_state(ns, status); return; } else if (ns->nxstate & (STATE_DATAIN_MASK | STATE_DATAOUT_MASK)) { - /* + /* * If the next state is data input/output, switch to it now */ - + ns->state = ns->nxstate; ns->nxstate = ns->op[++ns->stateidx + 1]; ns->regs.num = ns->regs.count = 0; @@ -1023,16 +1022,16 @@ switch_state(struct nandsim *ns) case STATE_DATAOUT: ns->regs.num = ns->geom.pgszoob - ns->regs.off - ns->regs.column; break; - + case STATE_DATAOUT_ID: ns->regs.num = ns->geom.idbytes; break; - + case STATE_DATAOUT_STATUS: case STATE_DATAOUT_STATUS_M: ns->regs.count = ns->regs.num = 0; break; - + default: NS_ERR("switch_state: BUG! unknown data state\n"); } @@ -1044,16 +1043,16 @@ switch_state(struct nandsim *ns) */ ns->regs.count = 0; - + switch (NS_STATE(ns->nxstate)) { case STATE_ADDR_PAGE: ns->regs.num = ns->geom.pgaddrbytes; - + break; case STATE_ADDR_SEC: ns->regs.num = ns->geom.secaddrbytes; break; - + case STATE_ADDR_ZERO: ns->regs.num = 1; break; @@ -1062,7 +1061,7 @@ switch_state(struct nandsim *ns) NS_ERR("switch_state: BUG! unknown address state\n"); } } else { - /* + /* * Just reset internal counters. */ @@ -1071,68 +1070,6 @@ switch_state(struct nandsim *ns) } } -static void -ns_hwcontrol(struct mtd_info *mtd, int cmd) -{ - struct nandsim *ns = (struct nandsim *)((struct nand_chip *)mtd->priv)->priv; - - switch (cmd) { - - /* set CLE line high */ - case NAND_CTL_SETCLE: - NS_DBG("ns_hwcontrol: start command latch cycles\n"); - ns->lines.cle = 1; - break; - - /* set CLE line low */ - case NAND_CTL_CLRCLE: - NS_DBG("ns_hwcontrol: stop command latch cycles\n"); - ns->lines.cle = 0; - break; - - /* set ALE line high */ - case NAND_CTL_SETALE: - NS_DBG("ns_hwcontrol: start address latch cycles\n"); - ns->lines.ale = 1; - break; - - /* set ALE line low */ - case NAND_CTL_CLRALE: - NS_DBG("ns_hwcontrol: stop address latch cycles\n"); - ns->lines.ale = 0; - break; - - /* set WP line high */ - case NAND_CTL_SETWP: - NS_DBG("ns_hwcontrol: enable write protection\n"); - ns->lines.wp = 1; - break; - - /* set WP line low */ - case NAND_CTL_CLRWP: - NS_DBG("ns_hwcontrol: disable write protection\n"); - ns->lines.wp = 0; - break; - - /* set CE line low */ - case NAND_CTL_SETNCE: - NS_DBG("ns_hwcontrol: enable chip\n"); - ns->lines.ce = 1; - break; - - /* set CE line high */ - case NAND_CTL_CLRNCE: - NS_DBG("ns_hwcontrol: disable chip\n"); - ns->lines.ce = 0; - break; - - default: - NS_ERR("hwcontrol: unknown command\n"); - } - - return; -} - static u_char ns_nand_read_byte(struct mtd_info *mtd) { @@ -1184,7 +1121,7 @@ ns_nand_read_byte(struct mtd_info *mtd) default: BUG(); } - + if (ns->regs.count == ns->regs.num) { NS_DBG("read_byte: all bytes were read\n"); @@ -1201,9 +1138,9 @@ ns_nand_read_byte(struct mtd_info *mtd) } else if (NS_STATE(ns->nxstate) == STATE_READY) switch_state(ns); - + } - + return outb; } @@ -1211,7 +1148,7 @@ static void ns_nand_write_byte(struct mtd_info *mtd, u_char byte) { struct nandsim *ns = (struct nandsim *)((struct nand_chip *)mtd->priv)->priv; - + /* Sanity and correctness checks */ if (!ns->lines.ce) { NS_ERR("write_byte: chip is disabled, ignore write\n"); @@ -1221,7 +1158,7 @@ ns_nand_write_byte(struct mtd_info *mtd, u_char byte) NS_ERR("write_byte: ALE and CLE pins are high simultaneously, ignore write\n"); return; } - + if (ns->lines.cle == 1) { /* * The byte written is a command. @@ -1233,7 +1170,7 @@ ns_nand_write_byte(struct mtd_info *mtd, u_char byte) return; } - /* + /* * Chip might still be in STATE_DATAOUT * (if OPT_AUTOINCR feature is supported), STATE_DATAOUT_STATUS or * STATE_DATAOUT_STATUS_M state. If so, switch state. @@ -1254,13 +1191,13 @@ ns_nand_write_byte(struct mtd_info *mtd, u_char byte) "ignore previous states\n", (uint)byte, get_state_name(ns->nxstate)); switch_to_ready_state(ns, NS_STATUS_FAILED(ns)); } - + /* Check that the command byte is correct */ if (check_command(byte)) { NS_ERR("write_byte: unknown command %#x\n", (uint)byte); return; } - + NS_DBG("command byte corresponding to %s state accepted\n", get_state_name(get_state_by_command(byte))); ns->regs.command = byte; @@ -1277,12 +1214,12 @@ ns_nand_write_byte(struct mtd_info *mtd, u_char byte) if (find_operation(ns, 1) < 0) return; - + if ((ns->state & ACTION_MASK) && do_state_action(ns, ns->state) < 0) { switch_to_ready_state(ns, NS_STATUS_FAILED(ns)); return; } - + ns->regs.count = 0; switch (NS_STATE(ns->nxstate)) { case STATE_ADDR_PAGE: @@ -1306,7 +1243,7 @@ ns_nand_write_byte(struct mtd_info *mtd, u_char byte) switch_to_ready_state(ns, NS_STATUS_FAILED(ns)); return; } - + /* Check if this is expected byte */ if (ns->regs.count == ns->regs.num) { NS_ERR("write_byte: no more address bytes expected\n"); @@ -1325,12 +1262,12 @@ ns_nand_write_byte(struct mtd_info *mtd, u_char byte) NS_DBG("address (%#x, %#x) is accepted\n", ns->regs.row, ns->regs.column); switch_state(ns); } - + } else { /* * The byte written is an input data. */ - + /* Check that chip is expecting data input */ if (!(ns->state & STATE_DATAIN_MASK)) { NS_ERR("write_byte: data input (%#x) isn't expected, state is %s, " @@ -1359,6 +1296,18 @@ ns_nand_write_byte(struct mtd_info *mtd, u_char byte) return; } +static void ns_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int bitmask) +{ + struct nandsim *ns = ((struct nand_chip *)mtd->priv)->priv; + + ns->lines.cle = bitmask & NAND_CLE ? 1 : 0; + ns->lines.ale = bitmask & NAND_ALE ? 1 : 0; + ns->lines.ce = bitmask & NAND_NCE ? 1 : 0; + + if (cmd != NAND_CMD_NONE) + ns_nand_write_byte(mtd, cmd); +} + static int ns_device_ready(struct mtd_info *mtd) { @@ -1372,22 +1321,11 @@ ns_nand_read_word(struct mtd_info *mtd) struct nand_chip *chip = (struct nand_chip *)mtd->priv; NS_DBG("read_word\n"); - + return chip->read_byte(mtd) | (chip->read_byte(mtd) << 8); } static void -ns_nand_write_word(struct mtd_info *mtd, uint16_t word) -{ - struct nand_chip *chip = (struct nand_chip *)mtd->priv; - - NS_DBG("write_word\n"); - - chip->write_byte(mtd, word & 0xFF); - chip->write_byte(mtd, word >> 8); -} - -static void ns_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int len) { struct nandsim *ns = (struct nandsim *)((struct nand_chip *)mtd->priv)->priv; @@ -1409,13 +1347,13 @@ ns_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int len) memcpy(ns->buf.byte + ns->regs.count, buf, len); ns->regs.count += len; - + if (ns->regs.count == ns->regs.num) { NS_DBG("write_buf: %d bytes were written\n", ns->regs.count); } } -static void +static void ns_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len) { struct nandsim *ns = (struct nandsim *)((struct nand_chip *)mtd->priv)->priv; @@ -1453,7 +1391,7 @@ ns_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len) memcpy(buf, ns->buf.byte + ns->regs.count, len); ns->regs.count += len; - + if (ns->regs.count == ns->regs.num) { if ((ns->options & OPT_AUTOINCR) && NS_STATE(ns->state) == STATE_DATAOUT) { ns->regs.count = 0; @@ -1465,11 +1403,11 @@ ns_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len) else if (NS_STATE(ns->nxstate) == STATE_READY) switch_state(ns); } - + return; } -static int +static int ns_nand_verify_buf(struct mtd_info *mtd, const u_char *buf, int len) { ns_nand_read_buf(mtd, (u_char *)&ns_verify_buf[0], len); @@ -1483,37 +1421,10 @@ ns_nand_verify_buf(struct mtd_info *mtd, const u_char *buf, int len) } } -/* - * Having only NAND chip IDs we call nand_scan which detects NAND flash - * parameters and then calls scan_bbt in order to scan/find/build the - * NAND flash bad block table. But since at that moment the NAND flash - * image isn't allocated in the simulator, errors arise. To avoid this - * we redefine the scan_bbt callback and initialize the nandsim structure - * before the flash media scanning. - */ -int ns_scan_bbt(struct mtd_info *mtd) -{ - struct nand_chip *chip = (struct nand_chip *)mtd->priv; - struct nandsim *ns = (struct nandsim *)(chip->priv); - int retval; - - if (!NS_IS_INITIALIZED(ns)) - if ((retval = init_nandsim(mtd)) != 0) { - NS_ERR("scan_bbt: can't initialize the nandsim structure\n"); - return retval; - } - if ((retval = nand_default_bbt(mtd)) != 0) { - free_nandsim(ns); - return retval; - } - - return 0; -} - /* * Module initialization function */ -int __init ns_init_module(void) +static int __init ns_init_module(void) { struct nand_chip *chip; struct nandsim *nand; @@ -1523,7 +1434,7 @@ int __init ns_init_module(void) NS_ERR("wrong bus width (%d), use only 8 or 16\n", bus_width); return -EINVAL; } - + /* Allocate and initialize mtd_info, nand_chip and nandsim structures */ nsmtd = kmalloc(sizeof(struct mtd_info) + sizeof(struct nand_chip) + sizeof(struct nandsim), GFP_KERNEL); @@ -1536,26 +1447,24 @@ int __init ns_init_module(void) chip = (struct nand_chip *)(nsmtd + 1); nsmtd->priv = (void *)chip; nand = (struct nandsim *)(chip + 1); - chip->priv = (void *)nand; + chip->priv = (void *)nand; /* * Register simulator's callbacks. */ - chip->hwcontrol = ns_hwcontrol; + chip->cmd_ctrl = ns_hwcontrol; chip->read_byte = ns_nand_read_byte; chip->dev_ready = ns_device_ready; - chip->scan_bbt = ns_scan_bbt; - chip->write_byte = ns_nand_write_byte; chip->write_buf = ns_nand_write_buf; chip->read_buf = ns_nand_read_buf; chip->verify_buf = ns_nand_verify_buf; - chip->write_word = ns_nand_write_word; chip->read_word = ns_nand_read_word; - chip->eccmode = NAND_ECC_SOFT; + chip->ecc.mode = NAND_ECC_SOFT; + chip->options |= NAND_SKIP_BBTSCAN; - /* + /* * Perform minimum nandsim structure initialization to handle - * the initial ID read command correctly + * the initial ID read command correctly */ if (third_id_byte != 0xFF || fourth_id_byte != 0xFF) nand->geom.idbytes = 4; @@ -1573,6 +1482,8 @@ int __init ns_init_module(void) chip->options |= NAND_BUSWIDTH_16; } + nsmtd->owner = THIS_MODULE; + if ((retval = nand_scan(nsmtd, 1)) != 0) { NS_ERR("can't register NAND Simulator\n"); if (retval > 0) @@ -1580,6 +1491,16 @@ int __init ns_init_module(void) goto error; } + if ((retval = init_nandsim(nsmtd)) != 0) { + NS_ERR("scan_bbt: can't initialize the nandsim structure\n"); + goto error; + } + + if ((retval = nand_default_bbt(nsmtd)) != 0) { + free_nandsim(nand); + goto error; + } + /* Register NAND as one big partition */ add_mtd_partitions(nsmtd, &nand->part, 1); diff --git a/drivers/mtd/nand/ppchameleonevb.c b/drivers/mtd/nand/ppchameleonevb.c index e510a83d7..22fa65c12 100644 --- a/drivers/mtd/nand/ppchameleonevb.c +++ b/drivers/mtd/nand/ppchameleonevb.c @@ -6,7 +6,7 @@ * Derived from drivers/mtd/nand/edb7312.c * * - * $Id: ppchameleonevb.c,v 1.6 2004/11/05 16:07:16 kalev Exp $ + * $Id: ppchameleonevb.c,v 1.7 2005/11/07 11:14:31 gleixner Exp $ * * 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 @@ -58,21 +58,21 @@ /* * MTD structure for PPChameleonEVB board */ -static struct mtd_info *ppchameleon_mtd = NULL; +static struct mtd_info *ppchameleon_mtd = NULL; static struct mtd_info *ppchameleonevb_mtd = NULL; /* * Module stuff */ -static unsigned long ppchameleon_fio_pbase = CFG_NAND0_PADDR; +static unsigned long ppchameleon_fio_pbase = CFG_NAND0_PADDR; static unsigned long ppchameleonevb_fio_pbase = CFG_NAND1_PADDR; #ifdef MODULE module_param(ppchameleon_fio_pbase, ulong, 0); module_param(ppchameleonevb_fio_pbase, ulong, 0); #else -__setup("ppchameleon_fio_pbase=",ppchameleon_fio_pbase); -__setup("ppchameleonevb_fio_pbase=",ppchameleonevb_fio_pbase); +__setup("ppchameleon_fio_pbase=", ppchameleon_fio_pbase); +__setup("ppchameleonevb_fio_pbase=", ppchameleonevb_fio_pbase); #endif #ifdef CONFIG_MTD_PARTITIONS @@ -80,82 +80,96 @@ __setup("ppchameleonevb_fio_pbase=",ppchameleonevb_fio_pbase); * Define static partitions for flash devices */ static struct mtd_partition partition_info_hi[] = { - { name: "PPChameleon HI Nand Flash", - offset: 0, - size: 128*1024*1024 } + { .name = "PPChameleon HI Nand Flash", + offset = 0, + .size = 128 * 1024 * 1024 + } }; static struct mtd_partition partition_info_me[] = { - { name: "PPChameleon ME Nand Flash", - offset: 0, - size: 32*1024*1024 } + { .name = "PPChameleon ME Nand Flash", + .offset = 0, + .size = 32 * 1024 * 1024 + } }; static struct mtd_partition partition_info_evb[] = { - { name: "PPChameleonEVB Nand Flash", - offset: 0, - size: 32*1024*1024 } + { .name = "PPChameleonEVB Nand Flash", + .offset = 0, + .size = 32 * 1024 * 1024 + } }; #define NUM_PARTITIONS 1 -extern int parse_cmdline_partitions(struct mtd_info *master, - struct mtd_partition **pparts, - const char *mtd_id); +extern int parse_cmdline_partitions(struct mtd_info *master, struct mtd_partition **pparts, const char *mtd_id); #endif - /* * hardware specific access to control-lines */ -static void ppchameleon_hwcontrol(struct mtd_info *mtdinfo, int cmd) +static void ppchameleon_hwcontrol(struct mtd_info *mtdinfo, int cmd, + unsigned int ctrl) { - switch(cmd) { - - case NAND_CTL_SETCLE: - MACRO_NAND_CTL_SETCLE((unsigned long)CFG_NAND0_PADDR); - break; - case NAND_CTL_CLRCLE: - MACRO_NAND_CTL_CLRCLE((unsigned long)CFG_NAND0_PADDR); - break; - case NAND_CTL_SETALE: - MACRO_NAND_CTL_SETALE((unsigned long)CFG_NAND0_PADDR); - break; - case NAND_CTL_CLRALE: - MACRO_NAND_CTL_CLRALE((unsigned long)CFG_NAND0_PADDR); - break; - case NAND_CTL_SETNCE: + struct nand_chip *chip = mtd->priv; + + if (ctrl & NAND_CTRL_CHANGE) { +#error Missing headerfiles. No way to fix this. -tglx + switch (cmd) { + case NAND_CTL_SETCLE: + MACRO_NAND_CTL_SETCLE((unsigned long)CFG_NAND0_PADDR); + break; + case NAND_CTL_CLRCLE: + MACRO_NAND_CTL_CLRCLE((unsigned long)CFG_NAND0_PADDR); + break; + case NAND_CTL_SETALE: + MACRO_NAND_CTL_SETALE((unsigned long)CFG_NAND0_PADDR); + break; + case NAND_CTL_CLRALE: + MACRO_NAND_CTL_CLRALE((unsigned long)CFG_NAND0_PADDR); + break; + case NAND_CTL_SETNCE: MACRO_NAND_ENABLE_CE((unsigned long)CFG_NAND0_PADDR); - break; - case NAND_CTL_CLRNCE: + break; + case NAND_CTL_CLRNCE: MACRO_NAND_DISABLE_CE((unsigned long)CFG_NAND0_PADDR); - break; + break; + } } + if (cmd != NAND_CMD_NONE) + writeb(cmd, chip->IO_ADDR_W); } -static void ppchameleonevb_hwcontrol(struct mtd_info *mtdinfo, int cmd) +static void ppchameleonevb_hwcontrol(struct mtd_info *mtdinfo, int cmd, + unsigned int ctrl) { - switch(cmd) { - - case NAND_CTL_SETCLE: - MACRO_NAND_CTL_SETCLE((unsigned long)CFG_NAND1_PADDR); - break; - case NAND_CTL_CLRCLE: - MACRO_NAND_CTL_CLRCLE((unsigned long)CFG_NAND1_PADDR); - break; - case NAND_CTL_SETALE: - MACRO_NAND_CTL_SETALE((unsigned long)CFG_NAND1_PADDR); - break; - case NAND_CTL_CLRALE: - MACRO_NAND_CTL_CLRALE((unsigned long)CFG_NAND1_PADDR); - break; - case NAND_CTL_SETNCE: - MACRO_NAND_ENABLE_CE((unsigned long)CFG_NAND1_PADDR); - break; - case NAND_CTL_CLRNCE: - MACRO_NAND_DISABLE_CE((unsigned long)CFG_NAND1_PADDR); - break; + struct nand_chip *chip = mtd->priv; + + if (ctrl & NAND_CTRL_CHANGE) { +#error Missing headerfiles. No way to fix this. -tglx + switch (cmd) { + case NAND_CTL_SETCLE: + MACRO_NAND_CTL_SETCLE((unsigned long)CFG_NAND1_PADDR); + break; + case NAND_CTL_CLRCLE: + MACRO_NAND_CTL_CLRCLE((unsigned long)CFG_NAND1_PADDR); + break; + case NAND_CTL_SETALE: + MACRO_NAND_CTL_SETALE((unsigned long)CFG_NAND1_PADDR); + break; + case NAND_CTL_CLRALE: + MACRO_NAND_CTL_CLRALE((unsigned long)CFG_NAND1_PADDR); + break; + case NAND_CTL_SETNCE: + MACRO_NAND_ENABLE_CE((unsigned long)CFG_NAND1_PADDR); + break; + case NAND_CTL_CLRNCE: + MACRO_NAND_DISABLE_CE((unsigned long)CFG_NAND1_PADDR); + break; + } } + if (cmd != NAND_CMD_NONE) + writeb(cmd, chip->IO_ADDR_W); } #ifdef USE_READY_BUSY_PIN @@ -164,15 +178,15 @@ static void ppchameleonevb_hwcontrol(struct mtd_info *mtdinfo, int cmd) */ static int ppchameleon_device_ready(struct mtd_info *minfo) { - if (in_be32((volatile unsigned*)GPIO0_IR) & NAND_RB_GPIO_PIN) + if (in_be32((volatile unsigned *)GPIO0_IR) & NAND_RB_GPIO_PIN) return 1; return 0; } static int ppchameleonevb_device_ready(struct mtd_info *minfo) { - if (in_be32((volatile unsigned*)GPIO0_IR) & NAND_EVB_RB_GPIO_PIN) - return 1; + if (in_be32((volatile unsigned *)GPIO0_IR) & NAND_EVB_RB_GPIO_PIN) + return 1; return 0; } #endif @@ -185,7 +199,7 @@ const char *part_probes_evb[] = { "cmdlinepart", NULL }; /* * Main initialization routine */ -static int __init ppchameleonevb_init (void) +static int __init ppchameleonevb_init(void) { struct nand_chip *this; const char *part_type = 0; @@ -194,13 +208,11 @@ static int __init ppchameleonevb_init (void) void __iomem *ppchameleon_fio_base; void __iomem *ppchameleonevb_fio_base; - /********************************* * Processor module NAND (if any) * *********************************/ /* Allocate memory for MTD device structure and private data */ - ppchameleon_mtd = kmalloc(sizeof(struct mtd_info) + - sizeof(struct nand_chip), GFP_KERNEL); + ppchameleon_mtd = kmalloc(sizeof(struct mtd_info) + sizeof(struct nand_chip), GFP_KERNEL); if (!ppchameleon_mtd) { printk("Unable to allocate PPChameleon NAND MTD device structure.\n"); return -ENOMEM; @@ -208,63 +220,65 @@ static int __init ppchameleonevb_init (void) /* map physical address */ ppchameleon_fio_base = ioremap(ppchameleon_fio_pbase, SZ_4M); - if(!ppchameleon_fio_base) { + if (!ppchameleon_fio_base) { printk("ioremap PPChameleon NAND flash failed\n"); kfree(ppchameleon_mtd); return -EIO; } /* Get pointer to private data */ - this = (struct nand_chip *) (&ppchameleon_mtd[1]); + this = (struct nand_chip *)(&ppchameleon_mtd[1]); /* Initialize structures */ - memset((char *) ppchameleon_mtd, 0, sizeof(struct mtd_info)); - memset((char *) this, 0, sizeof(struct nand_chip)); + memset(ppchameleon_mtd, 0, sizeof(struct mtd_info)); + memset(this, 0, sizeof(struct nand_chip)); /* Link the private data with the MTD structure */ ppchameleon_mtd->priv = this; + ppchameleon_mtd->owner = THIS_MODULE; - /* Initialize GPIOs */ + /* Initialize GPIOs */ /* Pin mapping for NAND chip */ /* - CE GPIO_01 - CLE GPIO_02 - ALE GPIO_03 - R/B GPIO_04 - */ + CE GPIO_01 + CLE GPIO_02 + ALE GPIO_03 + R/B GPIO_04 + */ /* output select */ - out_be32((volatile unsigned*)GPIO0_OSRH, in_be32((volatile unsigned*)GPIO0_OSRH) & 0xC0FFFFFF); + out_be32((volatile unsigned *)GPIO0_OSRH, in_be32((volatile unsigned *)GPIO0_OSRH) & 0xC0FFFFFF); /* three-state select */ - out_be32((volatile unsigned*)GPIO0_TSRH, in_be32((volatile unsigned*)GPIO0_TSRH) & 0xC0FFFFFF); + out_be32((volatile unsigned *)GPIO0_TSRH, in_be32((volatile unsigned *)GPIO0_TSRH) & 0xC0FFFFFF); /* enable output driver */ - out_be32((volatile unsigned*)GPIO0_TCR, in_be32((volatile unsigned*)GPIO0_TCR) | NAND_nCE_GPIO_PIN | NAND_CLE_GPIO_PIN | NAND_ALE_GPIO_PIN); + out_be32((volatile unsigned *)GPIO0_TCR, + in_be32((volatile unsigned *)GPIO0_TCR) | NAND_nCE_GPIO_PIN | NAND_CLE_GPIO_PIN | NAND_ALE_GPIO_PIN); #ifdef USE_READY_BUSY_PIN /* three-state select */ - out_be32((volatile unsigned*)GPIO0_TSRH, in_be32((volatile unsigned*)GPIO0_TSRH) & 0xFF3FFFFF); + out_be32((volatile unsigned *)GPIO0_TSRH, in_be32((volatile unsigned *)GPIO0_TSRH) & 0xFF3FFFFF); /* high-impedecence */ - out_be32((volatile unsigned*)GPIO0_TCR, in_be32((volatile unsigned*)GPIO0_TCR) & (~NAND_RB_GPIO_PIN)); + out_be32((volatile unsigned *)GPIO0_TCR, in_be32((volatile unsigned *)GPIO0_TCR) & (~NAND_RB_GPIO_PIN)); /* input select */ - out_be32((volatile unsigned*)GPIO0_ISR1H, (in_be32((volatile unsigned*)GPIO0_ISR1H) & 0xFF3FFFFF) | 0x00400000); + out_be32((volatile unsigned *)GPIO0_ISR1H, + (in_be32((volatile unsigned *)GPIO0_ISR1H) & 0xFF3FFFFF) | 0x00400000); #endif /* insert callbacks */ this->IO_ADDR_R = ppchameleon_fio_base; this->IO_ADDR_W = ppchameleon_fio_base; - this->hwcontrol = ppchameleon_hwcontrol; + this->cmd_ctrl = ppchameleon_hwcontrol; #ifdef USE_READY_BUSY_PIN this->dev_ready = ppchameleon_device_ready; #endif this->chip_delay = NAND_BIG_DELAY_US; /* ECC mode */ - this->eccmode = NAND_ECC_SOFT; + this->ecc.mode = NAND_ECC_SOFT; /* Scan to find existence of the device (it could not be mounted) */ - if (nand_scan (ppchameleon_mtd, 1)) { + if (nand_scan(ppchameleon_mtd, 1)) { iounmap((void *)ppchameleon_fio_base); - kfree (ppchameleon_mtd); + kfree(ppchameleon_mtd); goto nand_evb_init; } - #ifndef USE_READY_BUSY_PIN /* Adjust delay if necessary */ if (ppchameleon_mtd->size == NAND_SMALL_SIZE) @@ -275,12 +289,11 @@ static int __init ppchameleonevb_init (void) ppchameleon_mtd->name = "ppchameleon-nand"; mtd_parts_nb = parse_mtd_partitions(ppchameleon_mtd, part_probes, &mtd_parts, 0); if (mtd_parts_nb > 0) - part_type = "command line"; + part_type = "command line"; else - mtd_parts_nb = 0; + mtd_parts_nb = 0; #endif - if (mtd_parts_nb == 0) - { + if (mtd_parts_nb == 0) { if (ppchameleon_mtd->size == NAND_SMALL_SIZE) mtd_parts = partition_info_me; else @@ -293,13 +306,12 @@ static int __init ppchameleonevb_init (void) printk(KERN_NOTICE "Using %s partition definition\n", part_type); add_mtd_partitions(ppchameleon_mtd, mtd_parts, mtd_parts_nb); -nand_evb_init: + nand_evb_init: /**************************** * EVB NAND (always present) * ****************************/ /* Allocate memory for MTD device structure and private data */ - ppchameleonevb_mtd = kmalloc(sizeof(struct mtd_info) + - sizeof(struct nand_chip), GFP_KERNEL); + ppchameleonevb_mtd = kmalloc(sizeof(struct mtd_info) + sizeof(struct nand_chip), GFP_KERNEL); if (!ppchameleonevb_mtd) { printk("Unable to allocate PPChameleonEVB NAND MTD device structure.\n"); return -ENOMEM; @@ -307,77 +319,76 @@ nand_evb_init: /* map physical address */ ppchameleonevb_fio_base = ioremap(ppchameleonevb_fio_pbase, SZ_4M); - if(!ppchameleonevb_fio_base) { + if (!ppchameleonevb_fio_base) { printk("ioremap PPChameleonEVB NAND flash failed\n"); kfree(ppchameleonevb_mtd); return -EIO; } /* Get pointer to private data */ - this = (struct nand_chip *) (&ppchameleonevb_mtd[1]); + this = (struct nand_chip *)(&ppchameleonevb_mtd[1]); /* Initialize structures */ - memset((char *) ppchameleonevb_mtd, 0, sizeof(struct mtd_info)); - memset((char *) this, 0, sizeof(struct nand_chip)); + memset(ppchameleonevb_mtd, 0, sizeof(struct mtd_info)); + memset(this, 0, sizeof(struct nand_chip)); /* Link the private data with the MTD structure */ ppchameleonevb_mtd->priv = this; - /* Initialize GPIOs */ + /* Initialize GPIOs */ /* Pin mapping for NAND chip */ /* - CE GPIO_14 - CLE GPIO_15 - ALE GPIO_16 - R/B GPIO_31 - */ + CE GPIO_14 + CLE GPIO_15 + ALE GPIO_16 + R/B GPIO_31 + */ /* output select */ - out_be32((volatile unsigned*)GPIO0_OSRH, in_be32((volatile unsigned*)GPIO0_OSRH) & 0xFFFFFFF0); - out_be32((volatile unsigned*)GPIO0_OSRL, in_be32((volatile unsigned*)GPIO0_OSRL) & 0x3FFFFFFF); + out_be32((volatile unsigned *)GPIO0_OSRH, in_be32((volatile unsigned *)GPIO0_OSRH) & 0xFFFFFFF0); + out_be32((volatile unsigned *)GPIO0_OSRL, in_be32((volatile unsigned *)GPIO0_OSRL) & 0x3FFFFFFF); /* three-state select */ - out_be32((volatile unsigned*)GPIO0_TSRH, in_be32((volatile unsigned*)GPIO0_TSRH) & 0xFFFFFFF0); - out_be32((volatile unsigned*)GPIO0_TSRL, in_be32((volatile unsigned*)GPIO0_TSRL) & 0x3FFFFFFF); + out_be32((volatile unsigned *)GPIO0_TSRH, in_be32((volatile unsigned *)GPIO0_TSRH) & 0xFFFFFFF0); + out_be32((volatile unsigned *)GPIO0_TSRL, in_be32((volatile unsigned *)GPIO0_TSRL) & 0x3FFFFFFF); /* enable output driver */ - out_be32((volatile unsigned*)GPIO0_TCR, in_be32((volatile unsigned*)GPIO0_TCR) | NAND_EVB_nCE_GPIO_PIN | + out_be32((volatile unsigned *)GPIO0_TCR, in_be32((volatile unsigned *)GPIO0_TCR) | NAND_EVB_nCE_GPIO_PIN | NAND_EVB_CLE_GPIO_PIN | NAND_EVB_ALE_GPIO_PIN); #ifdef USE_READY_BUSY_PIN /* three-state select */ - out_be32((volatile unsigned*)GPIO0_TSRL, in_be32((volatile unsigned*)GPIO0_TSRL) & 0xFFFFFFFC); + out_be32((volatile unsigned *)GPIO0_TSRL, in_be32((volatile unsigned *)GPIO0_TSRL) & 0xFFFFFFFC); /* high-impedecence */ - out_be32((volatile unsigned*)GPIO0_TCR, in_be32((volatile unsigned*)GPIO0_TCR) & (~NAND_EVB_RB_GPIO_PIN)); + out_be32((volatile unsigned *)GPIO0_TCR, in_be32((volatile unsigned *)GPIO0_TCR) & (~NAND_EVB_RB_GPIO_PIN)); /* input select */ - out_be32((volatile unsigned*)GPIO0_ISR1L, (in_be32((volatile unsigned*)GPIO0_ISR1L) & 0xFFFFFFFC) | 0x00000001); + out_be32((volatile unsigned *)GPIO0_ISR1L, + (in_be32((volatile unsigned *)GPIO0_ISR1L) & 0xFFFFFFFC) | 0x00000001); #endif /* insert callbacks */ this->IO_ADDR_R = ppchameleonevb_fio_base; this->IO_ADDR_W = ppchameleonevb_fio_base; - this->hwcontrol = ppchameleonevb_hwcontrol; + this->cmd_ctrl = ppchameleonevb_hwcontrol; #ifdef USE_READY_BUSY_PIN this->dev_ready = ppchameleonevb_device_ready; #endif this->chip_delay = NAND_SMALL_DELAY_US; /* ECC mode */ - this->eccmode = NAND_ECC_SOFT; + this->ecc.mode = NAND_ECC_SOFT; /* Scan to find existence of the device */ - if (nand_scan (ppchameleonevb_mtd, 1)) { + if (nand_scan(ppchameleonevb_mtd, 1)) { iounmap((void *)ppchameleonevb_fio_base); - kfree (ppchameleonevb_mtd); + kfree(ppchameleonevb_mtd); return -ENXIO; } - #ifdef CONFIG_MTD_PARTITIONS ppchameleonevb_mtd->name = NAND_EVB_MTD_NAME; mtd_parts_nb = parse_mtd_partitions(ppchameleonevb_mtd, part_probes_evb, &mtd_parts, 0); if (mtd_parts_nb > 0) - part_type = "command line"; + part_type = "command line"; else - mtd_parts_nb = 0; + mtd_parts_nb = 0; #endif - if (mtd_parts_nb == 0) - { + if (mtd_parts_nb == 0) { mtd_parts = partition_info_evb; mtd_parts_nb = NUM_PARTITIONS; part_type = "static"; @@ -390,19 +401,20 @@ nand_evb_init: /* Return happy */ return 0; } + module_init(ppchameleonevb_init); /* * Clean up routine */ -static void __exit ppchameleonevb_cleanup (void) +static void __exit ppchameleonevb_cleanup(void) { struct nand_chip *this; /* Release resources, unregister device(s) */ - nand_release (ppchameleon_mtd); - nand_release (ppchameleonevb_mtd); - + nand_release(ppchameleon_mtd); + nand_release(ppchameleonevb_mtd); + /* Release iomaps */ this = (struct nand_chip *) &ppchameleon_mtd[1]; iounmap((void *) this->IO_ADDR_R; diff --git a/drivers/mtd/nand/rtc_from4.c b/drivers/mtd/nand/rtc_from4.c index 4129c03df..f8c496453 100644 --- a/drivers/mtd/nand/rtc_from4.c +++ b/drivers/mtd/nand/rtc_from4.c @@ -97,12 +97,12 @@ static struct mtd_info *rtc_from4_mtd = NULL; static void __iomem *rtc_from4_fio_base = (void *)P2SEGADDR(RTC_FROM4_FIO_BASE); static const struct mtd_partition partition_info[] = { - { - .name = "Renesas flash partition 1", - .offset = 0, - .size = MTDPART_SIZ_FULL - }, + { + .name = "Renesas flash partition 1", + .offset = 0, + .size = MTDPART_SIZ_FULL}, }; + #define NUM_PARTITIONS 1 /* @@ -111,8 +111,8 @@ static const struct mtd_partition partition_info[] = { * NAND_BBT_CREATE and/or NAND_BBT_WRITE * */ -static uint8_t bbt_pattern[] = {'B', 'b', 't', '0' }; -static uint8_t mirror_pattern[] = {'1', 't', 'b', 'B' }; +static uint8_t bbt_pattern[] = { 'B', 'b', 't', '0' }; +static uint8_t mirror_pattern[] = { '1', 't', 'b', 'B' }; static struct nand_bbt_descr rtc_from4_bbt_main_descr = { .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE @@ -134,8 +134,6 @@ static struct nand_bbt_descr rtc_from4_bbt_mirror_descr = { .pattern = mirror_pattern }; - - #ifdef RTC_FROM4_HWECC /* the Reed Solomon control structure */ @@ -144,15 +142,14 @@ static struct rs_control *rs_decoder; /* * hardware specific Out Of Band information */ -static struct nand_oobinfo rtc_from4_nand_oobinfo = { - .useecc = MTD_NANDECC_AUTOPLACE, +static struct nand_ecclayout rtc_from4_nand_oobinfo = { .eccbytes = 32, .eccpos = { - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31}, - .oobfree = { {32, 32} } + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31}, + .oobfree = {{32, 32}} }; /* Aargh. I missed the reversed bit order, when I @@ -162,44 +159,42 @@ static struct nand_oobinfo rtc_from4_nand_oobinfo = { * of the ecc byte which we get from the FPGA */ static uint8_t revbits[256] = { - 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, - 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, - 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, - 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, - 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, - 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, - 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, - 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, - 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, - 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, - 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, - 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, - 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, - 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, - 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, - 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, - 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, - 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, - 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, - 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, - 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, - 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, - 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, - 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, - 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, - 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, - 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, - 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, - 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, - 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, - 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, - 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff, + 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, + 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, + 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, + 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, + 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, + 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, + 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, + 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, + 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, + 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, + 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, + 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, + 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, + 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, + 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, + 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, + 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, + 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, + 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, + 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, + 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, + 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, + 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, + 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, + 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, + 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, + 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, + 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, + 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, + 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, + 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, + 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff, }; #endif - - /* * rtc_from4_hwcontrol - hardware specific access to control-lines * @mtd: MTD device structure @@ -212,35 +207,20 @@ static uint8_t revbits[256] = { * Address lines (A24-A22), so no action is required here. * */ -static void rtc_from4_hwcontrol(struct mtd_info *mtd, int cmd) +static void rtc_from4_hwcontrol(struct mtd_info *mtd, int cmd, + unsigned int ctrl) { - struct nand_chip* this = (struct nand_chip *) (mtd->priv); - - switch(cmd) { + struct nand_chip *chip = (mtd->priv); - case NAND_CTL_SETCLE: - this->IO_ADDR_W = (void __iomem *)((unsigned long)this->IO_ADDR_W | RTC_FROM4_CLE); - break; - case NAND_CTL_CLRCLE: - this->IO_ADDR_W = (void __iomem *)((unsigned long)this->IO_ADDR_W & ~RTC_FROM4_CLE); - break; - - case NAND_CTL_SETALE: - this->IO_ADDR_W = (void __iomem *)((unsigned long)this->IO_ADDR_W | RTC_FROM4_ALE); - break; - case NAND_CTL_CLRALE: - this->IO_ADDR_W = (void __iomem *)((unsigned long)this->IO_ADDR_W & ~RTC_FROM4_ALE); - break; + if (cmd == NAND_CMD_NONE) + return; - case NAND_CTL_SETNCE: - break; - case NAND_CTL_CLRNCE: - break; - - } + if (ctrl & NAND_CLE) + writeb(cmd, chip->IO_ADDR_W | RTC_FROM4_CLE); + else + writeb(cmd, chip->IO_ADDR_W | RTC_FROM4_ALE); } - /* * rtc_from4_nand_select_chip - hardware specific chip select * @mtd: MTD device structure @@ -252,26 +232,25 @@ static void rtc_from4_hwcontrol(struct mtd_info *mtd, int cmd) */ static void rtc_from4_nand_select_chip(struct mtd_info *mtd, int chip) { - struct nand_chip *this = mtd->priv; + struct nand_chip *this = mtd->priv; this->IO_ADDR_R = (void __iomem *)((unsigned long)this->IO_ADDR_R & ~RTC_FROM4_NAND_ADDR_MASK); this->IO_ADDR_W = (void __iomem *)((unsigned long)this->IO_ADDR_W & ~RTC_FROM4_NAND_ADDR_MASK); - switch(chip) { + switch (chip) { - case 0: /* select slot 3 chip */ + case 0: /* select slot 3 chip */ this->IO_ADDR_R = (void __iomem *)((unsigned long)this->IO_ADDR_R | RTC_FROM4_NAND_ADDR_SLOT3); this->IO_ADDR_W = (void __iomem *)((unsigned long)this->IO_ADDR_W | RTC_FROM4_NAND_ADDR_SLOT3); - break; - case 1: /* select slot 4 chip */ + break; + case 1: /* select slot 4 chip */ this->IO_ADDR_R = (void __iomem *)((unsigned long)this->IO_ADDR_R | RTC_FROM4_NAND_ADDR_SLOT4); this->IO_ADDR_W = (void __iomem *)((unsigned long)this->IO_ADDR_W | RTC_FROM4_NAND_ADDR_SLOT4); - break; + break; - } + } } - /* * rtc_from4_nand_device_ready - hardware specific ready/busy check * @mtd: MTD device structure @@ -290,7 +269,6 @@ static int rtc_from4_nand_device_ready(struct mtd_info *mtd) } - /* * deplete - code to perform device recovery in case there was a power loss * @mtd: MTD device structure @@ -306,24 +284,23 @@ static int rtc_from4_nand_device_ready(struct mtd_info *mtd) */ static void deplete(struct mtd_info *mtd, int chip) { - struct nand_chip *this = mtd->priv; + struct nand_chip *this = mtd->priv; - /* wait until device is ready */ - while (!this->dev_ready(mtd)); + /* wait until device is ready */ + while (!this->dev_ready(mtd)) ; this->select_chip(mtd, chip); /* Send the commands for device recovery, phase 1 */ - this->cmdfunc (mtd, NAND_CMD_DEPLETE1, 0x0000, 0x0000); - this->cmdfunc (mtd, NAND_CMD_DEPLETE2, -1, -1); + this->cmdfunc(mtd, NAND_CMD_DEPLETE1, 0x0000, 0x0000); + this->cmdfunc(mtd, NAND_CMD_DEPLETE2, -1, -1); /* Send the commands for device recovery, phase 2 */ - this->cmdfunc (mtd, NAND_CMD_DEPLETE1, 0x0000, 0x0004); - this->cmdfunc (mtd, NAND_CMD_DEPLETE2, -1, -1); + this->cmdfunc(mtd, NAND_CMD_DEPLETE1, 0x0000, 0x0004); + this->cmdfunc(mtd, NAND_CMD_DEPLETE2, -1, -1); } - #ifdef RTC_FROM4_HWECC /* * rtc_from4_enable_hwecc - hardware specific hardware ECC enable function @@ -335,39 +312,35 @@ static void deplete(struct mtd_info *mtd, int chip) */ static void rtc_from4_enable_hwecc(struct mtd_info *mtd, int mode) { - volatile unsigned short * rs_ecc_ctl = (volatile unsigned short *)(rtc_from4_fio_base + RTC_FROM4_RS_ECC_CTL); + volatile unsigned short *rs_ecc_ctl = (volatile unsigned short *)(rtc_from4_fio_base + RTC_FROM4_RS_ECC_CTL); unsigned short status; switch (mode) { - case NAND_ECC_READ : - status = RTC_FROM4_RS_ECC_CTL_CLR - | RTC_FROM4_RS_ECC_CTL_FD_E; + case NAND_ECC_READ: + status = RTC_FROM4_RS_ECC_CTL_CLR | RTC_FROM4_RS_ECC_CTL_FD_E; *rs_ecc_ctl = status; break; - case NAND_ECC_READSYN : - status = 0x00; + case NAND_ECC_READSYN: + status = 0x00; *rs_ecc_ctl = status; break; - case NAND_ECC_WRITE : - status = RTC_FROM4_RS_ECC_CTL_CLR - | RTC_FROM4_RS_ECC_CTL_GEN - | RTC_FROM4_RS_ECC_CTL_FD_E; + case NAND_ECC_WRITE: + status = RTC_FROM4_RS_ECC_CTL_CLR | RTC_FROM4_RS_ECC_CTL_GEN | RTC_FROM4_RS_ECC_CTL_FD_E; *rs_ecc_ctl = status; break; - default: + default: BUG(); break; } } - /* * rtc_from4_calculate_ecc - hardware specific code to read ECC code * @mtd: MTD device structure @@ -383,7 +356,7 @@ static void rtc_from4_enable_hwecc(struct mtd_info *mtd, int mode) */ static void rtc_from4_calculate_ecc(struct mtd_info *mtd, const u_char *dat, u_char *ecc_code) { - volatile unsigned short * rs_eccn = (volatile unsigned short *)(rtc_from4_fio_base + RTC_FROM4_RS_ECCN); + volatile unsigned short *rs_eccn = (volatile unsigned short *)(rtc_from4_fio_base + RTC_FROM4_RS_ECCN); unsigned short value; int i; @@ -395,7 +368,6 @@ static void rtc_from4_calculate_ecc(struct mtd_info *mtd, const u_char *dat, u_c ecc_code[7] |= 0x0f; /* set the last four bits (not used) */ } - /* * rtc_from4_correct_data - hardware specific code to correct data using ECC code * @mtd: MTD device structure @@ -414,7 +386,7 @@ static int rtc_from4_correct_data(struct mtd_info *mtd, const u_char *buf, u_cha unsigned short status; uint16_t par[6], syn[6]; uint8_t ecc[8]; - volatile unsigned short *rs_ecc; + volatile unsigned short *rs_ecc; status = *((volatile unsigned short *)(rtc_from4_fio_base + RTC_FROM4_RS_ECC_CHK)); @@ -424,23 +396,18 @@ static int rtc_from4_correct_data(struct mtd_info *mtd, const u_char *buf, u_cha /* Read the syndrom pattern from the FPGA and correct the bitorder */ rs_ecc = (volatile unsigned short *)(rtc_from4_fio_base + RTC_FROM4_RS_ECC); - for (i = 0; i < 8; i++) { - ecc[i] = revbits[(*rs_ecc) & 0xFF]; - rs_ecc++; - } + for (i = 0; i < 8; i++) { + ecc[i] = revbits[(*rs_ecc) & 0xFF]; + rs_ecc++; + } /* convert into 6 10bit syndrome fields */ - par[5] = rs_decoder->index_of[(((uint16_t)ecc[0] >> 0) & 0x0ff) | - (((uint16_t)ecc[1] << 8) & 0x300)]; - par[4] = rs_decoder->index_of[(((uint16_t)ecc[1] >> 2) & 0x03f) | - (((uint16_t)ecc[2] << 6) & 0x3c0)]; - par[3] = rs_decoder->index_of[(((uint16_t)ecc[2] >> 4) & 0x00f) | - (((uint16_t)ecc[3] << 4) & 0x3f0)]; - par[2] = rs_decoder->index_of[(((uint16_t)ecc[3] >> 6) & 0x003) | - (((uint16_t)ecc[4] << 2) & 0x3fc)]; - par[1] = rs_decoder->index_of[(((uint16_t)ecc[5] >> 0) & 0x0ff) | - (((uint16_t)ecc[6] << 8) & 0x300)]; - par[0] = (((uint16_t)ecc[6] >> 2) & 0x03f) | (((uint16_t)ecc[7] << 6) & 0x3c0); + par[5] = rs_decoder->index_of[(((uint16_t) ecc[0] >> 0) & 0x0ff) | (((uint16_t) ecc[1] << 8) & 0x300)]; + par[4] = rs_decoder->index_of[(((uint16_t) ecc[1] >> 2) & 0x03f) | (((uint16_t) ecc[2] << 6) & 0x3c0)]; + par[3] = rs_decoder->index_of[(((uint16_t) ecc[2] >> 4) & 0x00f) | (((uint16_t) ecc[3] << 4) & 0x3f0)]; + par[2] = rs_decoder->index_of[(((uint16_t) ecc[3] >> 6) & 0x003) | (((uint16_t) ecc[4] << 2) & 0x3fc)]; + par[1] = rs_decoder->index_of[(((uint16_t) ecc[5] >> 0) & 0x0ff) | (((uint16_t) ecc[6] << 8) & 0x300)]; + par[0] = (((uint16_t) ecc[6] >> 2) & 0x03f) | (((uint16_t) ecc[7] << 6) & 0x3c0); /* Convert to computable syndrome */ for (i = 0; i < 6; i++) { @@ -453,16 +420,14 @@ static int rtc_from4_correct_data(struct mtd_info *mtd, const u_char *buf, u_cha syn[i] = rs_decoder->index_of[syn[i]]; } - /* Let the library code do its magic.*/ - res = decode_rs8(rs_decoder, (uint8_t *)buf, par, 512, syn, 0, NULL, 0xff, NULL); + /* Let the library code do its magic. */ + res = decode_rs8(rs_decoder, (uint8_t *) buf, par, 512, syn, 0, NULL, 0xff, NULL); if (res > 0) { - DEBUG (MTD_DEBUG_LEVEL0, "rtc_from4_correct_data: " - "ECC corrected %d errors on read\n", res); + DEBUG(MTD_DEBUG_LEVEL0, "rtc_from4_correct_data: " "ECC corrected %d errors on read\n", res); } return res; } - /** * rtc_from4_errstat - perform additional error status checks * @mtd: MTD device structure @@ -478,54 +443,66 @@ static int rtc_from4_correct_data(struct mtd_info *mtd, const u_char *buf, u_cha * note: see pages 34..37 of data sheet for details. * */ -static int rtc_from4_errstat(struct mtd_info *mtd, struct nand_chip *this, int state, int status, int page) +static int rtc_from4_errstat(struct mtd_info *mtd, struct nand_chip *this, + int state, int status, int page) { - int er_stat=0; - int rtn, retlen; - size_t len; + int er_stat = 0; + int rtn, retlen; + size_t len; uint8_t *buf; - int i; - - this->cmdfunc (mtd, NAND_CMD_STATUS_CLEAR, -1, -1); - - if (state == FL_ERASING) { - for (i=0; i<4; i++) { - if (status & 1<<(i+1)) { - this->cmdfunc (mtd, (NAND_CMD_STATUS_ERROR + i + 1), -1, -1); - rtn = this->read_byte(mtd); - this->cmdfunc (mtd, NAND_CMD_STATUS_RESET, -1, -1); - if (!(rtn & ERR_STAT_ECC_AVAILABLE)) { - er_stat |= 1<<(i+1); /* err_ecc_not_avail */ - } - } + int i; + + this->cmdfunc(mtd, NAND_CMD_STATUS_CLEAR, -1, -1); + + if (state == FL_ERASING) { + + for (i = 0; i < 4; i++) { + if (!(status & 1 << (i + 1))) + continue; + this->cmdfunc(mtd, (NAND_CMD_STATUS_ERROR + i + 1), + -1, -1); + rtn = this->read_byte(mtd); + this->cmdfunc(mtd, NAND_CMD_STATUS_RESET, -1, -1); + + /* err_ecc_not_avail */ + if (!(rtn & ERR_STAT_ECC_AVAILABLE)) + er_stat |= 1 << (i + 1); } + } else if (state == FL_WRITING) { + + unsigned long corrected = mtd->ecc_stats.corrected; + /* single bank write logic */ - this->cmdfunc (mtd, NAND_CMD_STATUS_ERROR, -1, -1); + this->cmdfunc(mtd, NAND_CMD_STATUS_ERROR, -1, -1); rtn = this->read_byte(mtd); - this->cmdfunc (mtd, NAND_CMD_STATUS_RESET, -1, -1); + this->cmdfunc(mtd, NAND_CMD_STATUS_RESET, -1, -1); + if (!(rtn & ERR_STAT_ECC_AVAILABLE)) { - er_stat |= 1<<1; /* err_ecc_not_avail */ - } else { - len = mtd->oobblock; - buf = kmalloc (len, GFP_KERNEL); - if (!buf) { - printk (KERN_ERR "rtc_from4_errstat: Out of memory!\n"); - er_stat = 1; /* if we can't check, assume failed */ - } else { - /* recovery read */ - /* page read */ - rtn = nand_do_read_ecc (mtd, page, len, &retlen, buf, NULL, this->autooob, 1); - if (rtn) { /* if read failed or > 1-bit error corrected */ - er_stat |= 1<<1; /* ECC read failed */ - } - kfree(buf); - } + /* err_ecc_not_avail */ + er_stat |= 1 << 1; + goto out; + } + + len = mtd->writesize; + buf = kmalloc(len, GFP_KERNEL); + if (!buf) { + printk(KERN_ERR "rtc_from4_errstat: Out of memory!\n"); + er_stat = 1; + goto out; } + + /* recovery read */ + rtn = nand_do_read(mtd, page, len, &retlen, buf); + + /* if read failed or > 1-bit error corrected */ + if (rtn || (mtd->ecc_stats.corrected - corrected) > 1) { + er_stat |= 1 << 1; + kfree(buf); } rtn = status; - if (er_stat == 0) { /* if ECC is available */ + if (er_stat == 0) { /* if ECC is available */ rtn = (status & ~NAND_STATUS_FAIL); /* clear the error bit */ } @@ -533,33 +510,32 @@ static int rtc_from4_errstat(struct mtd_info *mtd, struct nand_chip *this, int s } #endif - /* * Main initialization routine */ -int __init rtc_from4_init (void) +static int __init rtc_from4_init(void) { struct nand_chip *this; unsigned short bcr1, bcr2, wcr2; int i; /* Allocate memory for MTD device structure and private data */ - rtc_from4_mtd = kmalloc(sizeof(struct mtd_info) + sizeof (struct nand_chip), - GFP_KERNEL); + rtc_from4_mtd = kmalloc(sizeof(struct mtd_info) + sizeof(struct nand_chip), GFP_KERNEL); if (!rtc_from4_mtd) { - printk ("Unable to allocate Renesas NAND MTD device structure.\n"); + printk("Unable to allocate Renesas NAND MTD device structure.\n"); return -ENOMEM; } /* Get pointer to private data */ - this = (struct nand_chip *) (&rtc_from4_mtd[1]); + this = (struct nand_chip *)(&rtc_from4_mtd[1]); /* Initialize structures */ - memset((char *) rtc_from4_mtd, 0, sizeof(struct mtd_info)); - memset((char *) this, 0, sizeof(struct nand_chip)); + memset(rtc_from4_mtd, 0, sizeof(struct mtd_info)); + memset(this, 0, sizeof(struct nand_chip)); /* Link the private data with the MTD structure */ rtc_from4_mtd->priv = this; + rtc_from4_mtd->owner = THIS_MODULE; /* set area 5 as PCMCIA mode to clear the spec of tDH(Data hold time;9ns min) */ bcr1 = *SH77X9_BCR1 & ~0x0002; @@ -580,9 +556,9 @@ int __init rtc_from4_init (void) this->IO_ADDR_R = rtc_from4_fio_base; this->IO_ADDR_W = rtc_from4_fio_base; /* Set address of hardware control function */ - this->hwcontrol = rtc_from4_hwcontrol; + this->cmd_ctrl = rtc_from4_hwcontrol; /* Set address of chip select function */ - this->select_chip = rtc_from4_nand_select_chip; + this->select_chip = rtc_from4_nand_select_chip; /* command delay time (in us) */ this->chip_delay = 100; /* return the status of the Ready/Busy line */ @@ -591,19 +567,20 @@ int __init rtc_from4_init (void) #ifdef RTC_FROM4_HWECC printk(KERN_INFO "rtc_from4_init: using hardware ECC detection.\n"); - this->eccmode = NAND_ECC_HW8_512; - this->options |= NAND_HWECC_SYNDROME; + this->ecc.mode = NAND_ECC_HW_SYNDROME; + this->ecc.size = 512; + this->ecc.bytes = 8; /* return the status of extra status and ECC checks */ this->errstat = rtc_from4_errstat; /* set the nand_oobinfo to support FPGA H/W error detection */ - this->autooob = &rtc_from4_nand_oobinfo; - this->enable_hwecc = rtc_from4_enable_hwecc; - this->calculate_ecc = rtc_from4_calculate_ecc; - this->correct_data = rtc_from4_correct_data; + this->ecc.layout = &rtc_from4_nand_oobinfo; + this->ecc.hwctl = rtc_from4_enable_hwecc; + this->ecc.calculate = rtc_from4_calculate_ecc; + this->ecc.correct = rtc_from4_correct_data; #else printk(KERN_INFO "rtc_from4_init: using software ECC detection.\n"); - this->eccmode = NAND_ECC_SOFT; + this->ecc.mode = NAND_ECC_SOFT; #endif /* set the bad block tables to support debugging */ @@ -617,7 +594,7 @@ int __init rtc_from4_init (void) } /* Perform 'device recovery' for each chip in case there was a power loss. */ - for (i=0; i < this->numchips; i++) { + for (i = 0; i < this->numchips; i++) { deplete(rtc_from4_mtd, i); } @@ -643,7 +620,7 @@ int __init rtc_from4_init (void) */ rs_decoder = init_rs(10, 0x409, 0, 1, 6); if (!rs_decoder) { - printk (KERN_ERR "Could not create a RS decoder\n"); + printk(KERN_ERR "Could not create a RS decoder\n"); nand_release(rtc_from4_mtd); kfree(rtc_from4_mtd); return -ENOMEM; @@ -652,20 +629,19 @@ int __init rtc_from4_init (void) /* Return happy */ return 0; } -module_init(rtc_from4_init); +module_init(rtc_from4_init); /* * Clean up routine */ -#ifdef MODULE -static void __exit rtc_from4_cleanup (void) +static void __exit rtc_from4_cleanup(void) { /* Release resource, unregister partitions */ nand_release(rtc_from4_mtd); /* Free the MTD device structure */ - kfree (rtc_from4_mtd); + kfree(rtc_from4_mtd); #ifdef RTC_FROM4_HWECC /* Free the reed solomon resources */ @@ -674,10 +650,9 @@ static void __exit rtc_from4_cleanup (void) } #endif } + module_exit(rtc_from4_cleanup); -#endif MODULE_LICENSE("GPL"); MODULE_AUTHOR("d.marlin -#include - #ifdef CONFIG_MTD_NAND_S3C2410_DEBUG #define DEBUG #endif @@ -65,22 +63,26 @@ #include #include -#define PFX "s3c2410-nand: " - #ifdef CONFIG_MTD_NAND_S3C2410_HWECC static int hardware_ecc = 1; #else static int hardware_ecc = 0; #endif +#ifdef CONFIG_MTD_NAND_S3C2410_CLKSTOP +static int clock_stop = 1; +#else +static const int clock_stop = 0; +#endif + + /* new oob placement block for use with hardware ecc generation */ -static struct nand_oobinfo nand_hw_eccoob = { - .useecc = MTD_NANDECC_AUTOPLACE, - .eccbytes = 3, - .eccpos = {0, 1, 2 }, - .oobfree = { {8, 8} } +static struct nand_ecclayout nand_hw_eccoob = { + .eccbytes = 3, + .eccpos = {0, 1, 2}, + .oobfree = {{8, 8}} }; /* controller and mtd information */ @@ -95,6 +97,12 @@ struct s3c2410_nand_mtd { int scan_res; }; +enum s3c_cpu_type { + TYPE_S3C2410, + TYPE_S3C2412, + TYPE_S3C2440, +}; + /* overview of the s3c2410 nand state */ struct s3c2410_nand_info { @@ -108,9 +116,11 @@ struct s3c2410_nand_info { struct resource *area; struct clk *clk; void __iomem *regs; + void __iomem *sel_reg; + int sel_bit; int mtd_count; - unsigned char is_s3c2440; + enum s3c_cpu_type cpu_type; }; /* conversion functions */ @@ -135,11 +145,16 @@ static struct s3c2410_platform_nand *to_nand_plat(struct platform_device *dev) return dev->dev.platform_data; } +static inline int allow_clk_stop(struct s3c2410_nand_info *info) +{ + return clock_stop; +} + /* timing calculations */ #define NS_IN_KHZ 1000000 -static int s3c2410_nand_calc_rate(int wanted, unsigned long clk, int max) +static int s3c_nand_calc_rate(int wanted, unsigned long clk, int max) { int result; @@ -149,8 +164,7 @@ static int s3c2410_nand_calc_rate(int wanted, unsigned long clk, int max) pr_debug("result %d from %ld, %d\n", result, clk, wanted); if (result > max) { - printk("%d ns is too big for current clock rate %ld\n", - wanted, clk); + printk("%d ns is too big for current clock rate %ld\n", wanted, clk); return -1; } @@ -169,46 +183,53 @@ static int s3c2410_nand_inithw(struct s3c2410_nand_info *info, { struct s3c2410_platform_nand *plat = to_nand_plat(pdev); unsigned long clkrate = clk_get_rate(info->clk); + int tacls_max = (info->cpu_type == TYPE_S3C2412) ? 8 : 4; int tacls, twrph0, twrph1; - unsigned long cfg; + unsigned long cfg = 0; /* calculate the timing information for the controller */ clkrate /= 1000; /* turn clock into kHz for ease of use */ if (plat != NULL) { - tacls = s3c2410_nand_calc_rate(plat->tacls, clkrate, 4); - twrph0 = s3c2410_nand_calc_rate(plat->twrph0, clkrate, 8); - twrph1 = s3c2410_nand_calc_rate(plat->twrph1, clkrate, 8); + tacls = s3c_nand_calc_rate(plat->tacls, clkrate, tacls_max); + twrph0 = s3c_nand_calc_rate(plat->twrph0, clkrate, 8); + twrph1 = s3c_nand_calc_rate(plat->twrph1, clkrate, 8); } else { /* default timings */ - tacls = 4; + tacls = tacls_max; twrph0 = 8; twrph1 = 8; } if (tacls < 0 || twrph0 < 0 || twrph1 < 0) { - printk(KERN_ERR PFX "cannot get timings suitable for board\n"); + dev_err(info->device, "cannot get suitable timings\n"); return -EINVAL; } - printk(KERN_INFO PFX "Tacls=%d, %dns Twrph0=%d %dns, Twrph1=%d %dns\n", - tacls, to_ns(tacls, clkrate), - twrph0, to_ns(twrph0, clkrate), - twrph1, to_ns(twrph1, clkrate)); + dev_info(info->device, "Tacls=%d, %dns Twrph0=%d %dns, Twrph1=%d %dns\n", + tacls, to_ns(tacls, clkrate), twrph0, to_ns(twrph0, clkrate), twrph1, to_ns(twrph1, clkrate)); - if (!info->is_s3c2440) { - cfg = S3C2410_NFCONF_EN; - cfg |= S3C2410_NFCONF_TACLS(tacls-1); - cfg |= S3C2410_NFCONF_TWRPH0(twrph0-1); - cfg |= S3C2410_NFCONF_TWRPH1(twrph1-1); - } else { - cfg = S3C2440_NFCONF_TACLS(tacls-1); - cfg |= S3C2440_NFCONF_TWRPH0(twrph0-1); - cfg |= S3C2440_NFCONF_TWRPH1(twrph1-1); + switch (info->cpu_type) { + case TYPE_S3C2410: + cfg = S3C2410_NFCONF_EN; + cfg |= S3C2410_NFCONF_TACLS(tacls - 1); + cfg |= S3C2410_NFCONF_TWRPH0(twrph0 - 1); + cfg |= S3C2410_NFCONF_TWRPH1(twrph1 - 1); + break; + + case TYPE_S3C2440: + case TYPE_S3C2412: + cfg = S3C2440_NFCONF_TACLS(tacls - 1); + cfg |= S3C2440_NFCONF_TWRPH0(twrph0 - 1); + cfg |= S3C2440_NFCONF_TWRPH1(twrph1 - 1); + + /* enable the controller and de-assert nFCE */ + + writel(S3C2440_NFCONT_ENABLE, info->regs + S3C2440_NFCONT); } - pr_debug(PFX "NF_CONF is 0x%lx\n", cfg); + dev_dbg(info->device, "NF_CONF is 0x%lx\n", cfg); writel(cfg, info->regs + S3C2410_NFCONF); return 0; @@ -221,99 +242,71 @@ static void s3c2410_nand_select_chip(struct mtd_info *mtd, int chip) struct s3c2410_nand_info *info; struct s3c2410_nand_mtd *nmtd; struct nand_chip *this = mtd->priv; - void __iomem *reg; unsigned long cur; - unsigned long bit; nmtd = this->priv; info = nmtd->info; - bit = (info->is_s3c2440) ? S3C2440_NFCONT_nFCE : S3C2410_NFCONF_nFCE; - reg = info->regs+((info->is_s3c2440) ? S3C2440_NFCONT:S3C2410_NFCONF); + if (chip != -1 && allow_clk_stop(info)) + clk_enable(info->clk); - cur = readl(reg); + cur = readl(info->sel_reg); if (chip == -1) { - cur |= bit; + cur |= info->sel_bit; } else { if (nmtd->set != NULL && chip > nmtd->set->nr_chips) { - printk(KERN_ERR PFX "chip %d out of range\n", chip); + dev_err(info->device, "invalid chip %d\n", chip); return; } if (info->platform != NULL) { if (info->platform->select_chip != NULL) - (info->platform->select_chip)(nmtd->set, chip); + (info->platform->select_chip) (nmtd->set, chip); } - cur &= ~bit; + cur &= ~info->sel_bit; } - writel(cur, reg); + writel(cur, info->sel_reg); + + if (chip == -1 && allow_clk_stop(info)) + clk_disable(info->clk); } -/* command and control functions - * - * Note, these all use tglx's method of changing the IO_ADDR_W field - * to make the code simpler, and use the nand layer's code to issue the - * command and address sequences via the proper IO ports. +/* s3c2410_nand_hwcontrol * + * Issue command and address cycles to the chip */ -static void s3c2410_nand_hwcontrol(struct mtd_info *mtd, int cmd) +static void s3c2410_nand_hwcontrol(struct mtd_info *mtd, int cmd, + unsigned int ctrl) { struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd); - struct nand_chip *chip = mtd->priv; - - switch (cmd) { - case NAND_CTL_SETNCE: - case NAND_CTL_CLRNCE: - printk(KERN_ERR "%s: called for NCE\n", __FUNCTION__); - break; - - case NAND_CTL_SETCLE: - chip->IO_ADDR_W = info->regs + S3C2410_NFCMD; - break; - - case NAND_CTL_SETALE: - chip->IO_ADDR_W = info->regs + S3C2410_NFADDR; - break; - - /* NAND_CTL_CLRCLE: */ - /* NAND_CTL_CLRALE: */ - default: - chip->IO_ADDR_W = info->regs + S3C2410_NFDATA; - break; - } + + if (cmd == NAND_CMD_NONE) + return; + + if (ctrl & NAND_CLE) + writeb(cmd, info->regs + S3C2410_NFCMD); + else + writeb(cmd, info->regs + S3C2410_NFADDR); } /* command and control functions */ -static void s3c2440_nand_hwcontrol(struct mtd_info *mtd, int cmd) +static void s3c2440_nand_hwcontrol(struct mtd_info *mtd, int cmd, + unsigned int ctrl) { struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd); - struct nand_chip *chip = mtd->priv; - switch (cmd) { - case NAND_CTL_SETNCE: - case NAND_CTL_CLRNCE: - printk(KERN_ERR "%s: called for NCE\n", __FUNCTION__); - break; - - case NAND_CTL_SETCLE: - chip->IO_ADDR_W = info->regs + S3C2440_NFCMD; - break; - - case NAND_CTL_SETALE: - chip->IO_ADDR_W = info->regs + S3C2440_NFADDR; - break; + if (cmd == NAND_CMD_NONE) + return; - /* NAND_CTL_CLRCLE: */ - /* NAND_CTL_CLRALE: */ - default: - chip->IO_ADDR_W = info->regs + S3C2440_NFDATA; - break; - } + if (ctrl & NAND_CLE) + writeb(cmd, info->regs + S3C2440_NFCMD); + else + writeb(cmd, info->regs + S3C2440_NFADDR); } /* s3c2410_nand_devready() @@ -324,28 +317,32 @@ static void s3c2440_nand_hwcontrol(struct mtd_info *mtd, int cmd) static int s3c2410_nand_devready(struct mtd_info *mtd) { struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd); - - if (info->is_s3c2440) - return readb(info->regs + S3C2440_NFSTAT) & S3C2440_NFSTAT_READY; return readb(info->regs + S3C2410_NFSTAT) & S3C2410_NFSTAT_BUSY; } +static int s3c2440_nand_devready(struct mtd_info *mtd) +{ + struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd); + return readb(info->regs + S3C2440_NFSTAT) & S3C2440_NFSTAT_READY; +} + +static int s3c2412_nand_devready(struct mtd_info *mtd) +{ + struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd); + return readb(info->regs + S3C2412_NFSTAT) & S3C2412_NFSTAT_READY; +} /* ECC handling functions */ static int s3c2410_nand_correct_data(struct mtd_info *mtd, u_char *dat, u_char *read_ecc, u_char *calc_ecc) { - pr_debug("s3c2410_nand_correct_data(%p,%p,%p,%p)\n", - mtd, dat, read_ecc, calc_ecc); + pr_debug("s3c2410_nand_correct_data(%p,%p,%p,%p)\n", mtd, dat, read_ecc, calc_ecc); pr_debug("eccs: read %02x,%02x,%02x vs calc %02x,%02x,%02x\n", - read_ecc[0], read_ecc[1], read_ecc[2], - calc_ecc[0], calc_ecc[1], calc_ecc[2]); + read_ecc[0], read_ecc[1], read_ecc[2], calc_ecc[0], calc_ecc[1], calc_ecc[2]); - if (read_ecc[0] == calc_ecc[0] && - read_ecc[1] == calc_ecc[1] && - read_ecc[2] == calc_ecc[2]) + if (read_ecc[0] == calc_ecc[0] && read_ecc[1] == calc_ecc[1] && read_ecc[2] == calc_ecc[2]) return 0; /* we curently have no method for correcting the error */ @@ -378,8 +375,7 @@ static void s3c2440_nand_enable_hwecc(struct mtd_info *mtd, int mode) writel(ctrl | S3C2440_NFCONT_INITECC, info->regs + S3C2440_NFCONT); } -static int s3c2410_nand_calculate_ecc(struct mtd_info *mtd, - const u_char *dat, u_char *ecc_code) +static int s3c2410_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat, u_char *ecc_code) { struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd); @@ -387,15 +383,12 @@ static int s3c2410_nand_calculate_ecc(struct mtd_info *mtd, ecc_code[1] = readb(info->regs + S3C2410_NFECC + 1); ecc_code[2] = readb(info->regs + S3C2410_NFECC + 2); - pr_debug("calculate_ecc: returning ecc %02x,%02x,%02x\n", - ecc_code[0], ecc_code[1], ecc_code[2]); + pr_debug("calculate_ecc: returning ecc %02x,%02x,%02x\n", ecc_code[0], ecc_code[1], ecc_code[2]); return 0; } - -static int s3c2440_nand_calculate_ecc(struct mtd_info *mtd, - const u_char *dat, u_char *ecc_code) +static int s3c2440_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat, u_char *ecc_code) { struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd); unsigned long ecc = readl(info->regs + S3C2440_NFMECC0); @@ -404,13 +397,11 @@ static int s3c2440_nand_calculate_ecc(struct mtd_info *mtd, ecc_code[1] = ecc >> 8; ecc_code[2] = ecc >> 16; - pr_debug("calculate_ecc: returning ecc %02x,%02x,%02x\n", - ecc_code[0], ecc_code[1], ecc_code[2]); + pr_debug("calculate_ecc: returning ecc %02x,%02x,%02x\n", ecc_code[0], ecc_code[1], ecc_code[2]); return 0; } - /* over-ride the standard functions for a little more speed. We can * use read/write block to move the data buffers to/from the controller */ @@ -421,8 +412,7 @@ static void s3c2410_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len) readsb(this->IO_ADDR_R, buf, len); } -static void s3c2410_nand_write_buf(struct mtd_info *mtd, - const u_char *buf, int len) +static void s3c2410_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int len) { struct nand_chip *this = mtd->priv; writesb(this->IO_ADDR_W, buf, len); @@ -459,7 +449,8 @@ static int s3c2410_nand_remove(struct platform_device *pdev) /* free the common resources */ if (info->clk != NULL && !IS_ERR(info->clk)) { - clk_disable(info->clk); + if (!allow_clk_stop(info)) + clk_disable(info->clk); clk_put(info->clk); } @@ -488,9 +479,7 @@ static int s3c2410_nand_add_partition(struct s3c2410_nand_info *info, return add_mtd_device(&mtd->mtd); if (set->nr_partitions > 0 && set->partitions != NULL) { - return add_mtd_partitions(&mtd->mtd, - set->partitions, - set->nr_partitions); + return add_mtd_partitions(&mtd->mtd, set->partitions, set->nr_partitions); } return add_mtd_device(&mtd->mtd); @@ -514,11 +503,8 @@ static void s3c2410_nand_init_chip(struct s3c2410_nand_info *info, struct s3c2410_nand_set *set) { struct nand_chip *chip = &nmtd->chip; + void __iomem *regs = info->regs; - chip->IO_ADDR_R = info->regs + S3C2410_NFDATA; - chip->IO_ADDR_W = info->regs + S3C2410_NFDATA; - chip->hwcontrol = s3c2410_nand_hwcontrol; - chip->dev_ready = s3c2410_nand_devready; chip->write_buf = s3c2410_nand_write_buf; chip->read_buf = s3c2410_nand_read_buf; chip->select_chip = s3c2410_nand_select_chip; @@ -527,29 +513,66 @@ static void s3c2410_nand_init_chip(struct s3c2410_nand_info *info, chip->options = 0; chip->controller = &info->controller; - if (info->is_s3c2440) { - chip->IO_ADDR_R = info->regs + S3C2440_NFDATA; - chip->IO_ADDR_W = info->regs + S3C2440_NFDATA; - chip->hwcontrol = s3c2440_nand_hwcontrol; - } + switch (info->cpu_type) { + case TYPE_S3C2410: + chip->IO_ADDR_W = regs + S3C2410_NFDATA; + info->sel_reg = regs + S3C2410_NFCONF; + info->sel_bit = S3C2410_NFCONF_nFCE; + chip->cmd_ctrl = s3c2410_nand_hwcontrol; + chip->dev_ready = s3c2410_nand_devready; + break; + + case TYPE_S3C2440: + chip->IO_ADDR_W = regs + S3C2440_NFDATA; + info->sel_reg = regs + S3C2440_NFCONT; + info->sel_bit = S3C2440_NFCONT_nFCE; + chip->cmd_ctrl = s3c2440_nand_hwcontrol; + chip->dev_ready = s3c2440_nand_devready; + break; + + case TYPE_S3C2412: + chip->IO_ADDR_W = regs + S3C2440_NFDATA; + info->sel_reg = regs + S3C2440_NFCONT; + info->sel_bit = S3C2412_NFCONT_nFCE0; + chip->cmd_ctrl = s3c2440_nand_hwcontrol; + chip->dev_ready = s3c2412_nand_devready; + + if (readl(regs + S3C2410_NFCONF) & S3C2412_NFCONF_NANDBOOT) + dev_info(info->device, "System booted from NAND\n"); + + break; + } + + chip->IO_ADDR_R = chip->IO_ADDR_W; nmtd->info = info; nmtd->mtd.priv = chip; + nmtd->mtd.owner = THIS_MODULE; nmtd->set = set; if (hardware_ecc) { - chip->correct_data = s3c2410_nand_correct_data; - chip->enable_hwecc = s3c2410_nand_enable_hwecc; - chip->calculate_ecc = s3c2410_nand_calculate_ecc; - chip->eccmode = NAND_ECC_HW3_512; - chip->autooob = &nand_hw_eccoob; - - if (info->is_s3c2440) { - chip->enable_hwecc = s3c2440_nand_enable_hwecc; - chip->calculate_ecc = s3c2440_nand_calculate_ecc; + chip->ecc.calculate = s3c2410_nand_calculate_ecc; + chip->ecc.correct = s3c2410_nand_correct_data; + chip->ecc.mode = NAND_ECC_HW; + chip->ecc.size = 512; + chip->ecc.bytes = 3; + chip->ecc.layout = &nand_hw_eccoob; + + switch (info->cpu_type) { + case TYPE_S3C2410: + chip->ecc.hwctl = s3c2410_nand_enable_hwecc; + chip->ecc.calculate = s3c2410_nand_calculate_ecc; + break; + + case TYPE_S3C2412: + case TYPE_S3C2440: + chip->ecc.hwctl = s3c2440_nand_enable_hwecc; + chip->ecc.calculate = s3c2440_nand_calculate_ecc; + break; + } } else { - chip->eccmode = NAND_ECC_SOFT; + chip->ecc.mode = NAND_ECC_SOFT; } } @@ -561,7 +584,8 @@ static void s3c2410_nand_init_chip(struct s3c2410_nand_info *info, * nand layer to look for devices */ -static int s3c24xx_nand_probe(struct platform_device *pdev, int is_s3c2440) +static int s3c24xx_nand_probe(struct platform_device *pdev, + enum s3c_cpu_type cpu_type) { struct s3c2410_platform_nand *plat = to_nand_plat(pdev); struct s3c2410_nand_info *info; @@ -616,7 +640,7 @@ static int s3c24xx_nand_probe(struct platform_device *pdev, int is_s3c2440) info->device = &pdev->dev; info->platform = plat; info->regs = ioremap(res->start, size); - info->is_s3c2440 = is_s3c2440; + info->cpu_type = cpu_type; if (info->regs == NULL) { dev_err(&pdev->dev, "cannot reserve register region\n"); @@ -654,13 +678,11 @@ static int s3c24xx_nand_probe(struct platform_device *pdev, int is_s3c2440) nmtd = info->mtds; for (setno = 0; setno < nr_sets; setno++, nmtd++) { - pr_debug("initialising set %d (%p, info %p)\n", - setno, nmtd, info); + pr_debug("initialising set %d (%p, info %p)\n", setno, nmtd, info); s3c2410_nand_init_chip(info, nmtd, sets); - nmtd->scan_res = nand_scan(&nmtd->mtd, - (sets) ? sets->nr_chips : 1); + nmtd->scan_res = nand_scan(&nmtd->mtd, (sets) ? sets->nr_chips : 1); if (nmtd->scan_res == 0) { s3c2410_nand_add_partition(info, nmtd, sets); @@ -670,6 +692,11 @@ static int s3c24xx_nand_probe(struct platform_device *pdev, int is_s3c2440) sets++; } + if (allow_clk_stop(info)) { + dev_info(&pdev->dev, "clock idle support enabled\n"); + clk_disable(info->clk); + } + pr_debug("initialised ok\n"); return 0; @@ -681,21 +708,63 @@ static int s3c24xx_nand_probe(struct platform_device *pdev, int is_s3c2440) return err; } +/* PM Support */ +#ifdef CONFIG_PM + +static int s3c24xx_nand_suspend(struct platform_device *dev, pm_message_t pm) +{ + struct s3c2410_nand_info *info = platform_get_drvdata(dev); + + if (info) { + if (!allow_clk_stop(info)) + clk_disable(info->clk); + } + + return 0; +} + +static int s3c24xx_nand_resume(struct platform_device *dev) +{ + struct s3c2410_nand_info *info = platform_get_drvdata(dev); + + if (info) { + clk_enable(info->clk); + s3c2410_nand_inithw(info, dev); + + if (allow_clk_stop(info)) + clk_disable(info->clk); + } + + return 0; +} + +#else +#define s3c24xx_nand_suspend NULL +#define s3c24xx_nand_resume NULL +#endif + /* driver device registration */ static int s3c2410_nand_probe(struct platform_device *dev) { - return s3c24xx_nand_probe(dev, 0); + return s3c24xx_nand_probe(dev, TYPE_S3C2410); } static int s3c2440_nand_probe(struct platform_device *dev) { - return s3c24xx_nand_probe(dev, 1); + return s3c24xx_nand_probe(dev, TYPE_S3C2440); +} + +static int s3c2412_nand_probe(struct platform_device *dev) +{ + return s3c24xx_nand_probe(dev, TYPE_S3C2412); } static struct platform_driver s3c2410_nand_driver = { .probe = s3c2410_nand_probe, .remove = s3c2410_nand_remove, + .suspend = s3c24xx_nand_suspend, + .resume = s3c24xx_nand_resume, .driver = { .name = "s3c2410-nand", .owner = THIS_MODULE, @@ -705,22 +774,37 @@ static struct platform_driver s3c2410_nand_driver = { static struct platform_driver s3c2440_nand_driver = { .probe = s3c2440_nand_probe, .remove = s3c2410_nand_remove, + .suspend = s3c24xx_nand_suspend, + .resume = s3c24xx_nand_resume, .driver = { .name = "s3c2440-nand", .owner = THIS_MODULE, }, }; +static struct platform_driver s3c2412_nand_driver = { + .probe = s3c2412_nand_probe, + .remove = s3c2410_nand_remove, + .suspend = s3c24xx_nand_suspend, + .resume = s3c24xx_nand_resume, + .driver = { + .name = "s3c2412-nand", + .owner = THIS_MODULE, + }, +}; + static int __init s3c2410_nand_init(void) { printk("S3C24XX NAND Driver, (c) 2004 Simtec Electronics\n"); + platform_driver_register(&s3c2412_nand_driver); platform_driver_register(&s3c2440_nand_driver); return platform_driver_register(&s3c2410_nand_driver); } static void __exit s3c2410_nand_exit(void) { + platform_driver_unregister(&s3c2412_nand_driver); platform_driver_unregister(&s3c2440_nand_driver); platform_driver_unregister(&s3c2410_nand_driver); } diff --git a/drivers/mtd/nand/sharpsl.c b/drivers/mtd/nand/sharpsl.c index 295727933..51c7288ab 100755 --- a/drivers/mtd/nand/sharpsl.c +++ b/drivers/mtd/nand/sharpsl.c @@ -3,7 +3,7 @@ * * Copyright (C) 2004 Richard Purdie * - * $Id: sharpsl.c,v 1.3 2005/01/03 14:53:50 rpurdie Exp $ + * $Id: sharpsl.c,v 1.7 2005/11/07 11:14:31 gleixner Exp $ * * Based on Sharp's NAND driver sharp_sl.c * @@ -46,7 +46,6 @@ static int sharpsl_phys_base = 0x0C000000; #define FLCLE (1 << 1) #define FLCE0 (1 << 0) - /* * MTD structure for SharpSL */ @@ -60,50 +59,47 @@ static struct mtd_info *sharpsl_mtd = NULL; static int nr_partitions; static struct mtd_partition sharpsl_nand_default_partition_info[] = { { - .name = "System Area", - .offset = 0, - .size = 7 * 1024 * 1024, - }, + .name = "System Area", + .offset = 0, + .size = 7 * 1024 * 1024, + }, { - .name = "Root Filesystem", - .offset = 7 * 1024 * 1024, - .size = 30 * 1024 * 1024, - }, + .name = "Root Filesystem", + .offset = 7 * 1024 * 1024, + .size = 30 * 1024 * 1024, + }, { - .name = "Home Filesystem", - .offset = MTDPART_OFS_APPEND , - .size = MTDPART_SIZ_FULL , - }, + .name = "Home Filesystem", + .offset = MTDPART_OFS_APPEND, + .size = MTDPART_SIZ_FULL, + }, }; -/* +/* * hardware specific access to control-lines + * ctrl: + * NAND_CNE: bit 0 -> ! bit 0 & 4 + * NAND_CLE: bit 1 -> bit 1 + * NAND_ALE: bit 2 -> bit 2 + * */ -static void -sharpsl_nand_hwcontrol(struct mtd_info* mtd, int cmd) +static void sharpsl_nand_hwcontrol(struct mtd_info *mtd, int cmd, + unsigned int ctrl) { - switch (cmd) { - case NAND_CTL_SETCLE: - writeb(readb(FLASHCTL) | FLCLE, FLASHCTL); - break; - case NAND_CTL_CLRCLE: - writeb(readb(FLASHCTL) & ~FLCLE, FLASHCTL); - break; - - case NAND_CTL_SETALE: - writeb(readb(FLASHCTL) | FLALE, FLASHCTL); - break; - case NAND_CTL_CLRALE: - writeb(readb(FLASHCTL) & ~FLALE, FLASHCTL); - break; - - case NAND_CTL_SETNCE: - writeb(readb(FLASHCTL) & ~(FLCE0|FLCE1), FLASHCTL); - break; - case NAND_CTL_CLRNCE: - writeb(readb(FLASHCTL) | (FLCE0|FLCE1), FLASHCTL); - break; + struct nand_chip *chip = mtd->priv; + + if (ctrl & NAND_CTRL_CHANGE) { + unsigned char bits = ctrl & 0x07; + + bits |= (ctrl & 0x01) << 4; + + bits ^= 0x11; + + writeb((readb(FLASHCTL) & ~0x17) | bits, FLASHCTL); } + + if (cmd != NAND_CMD_NONE) + writeb(cmd, chip->IO_ADDR_W); } static uint8_t scan_ff_pattern[] = { 0xff, 0xff }; @@ -115,21 +111,33 @@ static struct nand_bbt_descr sharpsl_bbt = { .pattern = scan_ff_pattern }; -static int -sharpsl_nand_dev_ready(struct mtd_info* mtd) +static struct nand_bbt_descr sharpsl_akita_bbt = { + .options = 0, + .offs = 4, + .len = 1, + .pattern = scan_ff_pattern +}; + +static struct nand_ecclayout akita_oobinfo = { + .eccbytes = 24, + .eccpos = { + 0x5, 0x1, 0x2, 0x3, 0x6, 0x7, 0x15, 0x11, + 0x12, 0x13, 0x16, 0x17, 0x25, 0x21, 0x22, 0x23, + 0x26, 0x27, 0x35, 0x31, 0x32, 0x33, 0x36, 0x37}, + .oobfree = {{0x08, 0x09}} +}; + +static int sharpsl_nand_dev_ready(struct mtd_info *mtd) { return !((readb(FLASHCTL) & FLRYBY) == 0); } -static void -sharpsl_nand_enable_hwecc(struct mtd_info* mtd, int mode) +static void sharpsl_nand_enable_hwecc(struct mtd_info *mtd, int mode) { - writeb(0 ,ECCCLRR); + writeb(0, ECCCLRR); } -static int -sharpsl_nand_calculate_ecc(struct mtd_info* mtd, const u_char* dat, - u_char* ecc_code) +static int sharpsl_nand_calculate_ecc(struct mtd_info *mtd, const u_char * dat, u_char * ecc_code) { ecc_code[0] = ~readb(ECCLPUB); ecc_code[1] = ~readb(ECCLPLB); @@ -137,47 +145,44 @@ sharpsl_nand_calculate_ecc(struct mtd_info* mtd, const u_char* dat, return readb(ECCCNTR) != 0; } - #ifdef CONFIG_MTD_PARTITIONS const char *part_probes[] = { "cmdlinepart", NULL }; #endif - /* * Main initialization routine */ -int __init -sharpsl_nand_init(void) +static int __init sharpsl_nand_init(void) { struct nand_chip *this; - struct mtd_partition* sharpsl_partition_info; + struct mtd_partition *sharpsl_partition_info; int err = 0; /* Allocate memory for MTD device structure and private data */ - sharpsl_mtd = kmalloc(sizeof(struct mtd_info) + sizeof(struct nand_chip), - GFP_KERNEL); + sharpsl_mtd = kmalloc(sizeof(struct mtd_info) + sizeof(struct nand_chip), GFP_KERNEL); if (!sharpsl_mtd) { - printk ("Unable to allocate SharpSL NAND MTD device structure.\n"); + printk("Unable to allocate SharpSL NAND MTD device structure.\n"); return -ENOMEM; } - + /* map physical adress */ sharpsl_io_base = ioremap(sharpsl_phys_base, 0x1000); - if(!sharpsl_io_base){ + if (!sharpsl_io_base) { printk("ioremap to access Sharp SL NAND chip failed\n"); kfree(sharpsl_mtd); return -EIO; } - + /* Get pointer to private data */ - this = (struct nand_chip *) (&sharpsl_mtd[1]); + this = (struct nand_chip *)(&sharpsl_mtd[1]); /* Initialize structures */ - memset((char *) sharpsl_mtd, 0, sizeof(struct mtd_info)); - memset((char *) this, 0, sizeof(struct nand_chip)); + memset(sharpsl_mtd, 0, sizeof(struct mtd_info)); + memset(this, 0, sizeof(struct nand_chip)); /* Link the private data with the MTD structure */ sharpsl_mtd->priv = this; + sharpsl_mtd->owner = THIS_MODULE; /* * PXA initialize @@ -188,19 +193,25 @@ sharpsl_nand_init(void) this->IO_ADDR_R = FLASHIO; this->IO_ADDR_W = FLASHIO; /* Set address of hardware control function */ - this->hwcontrol = sharpsl_nand_hwcontrol; + this->cmd_ctrl = sharpsl_nand_hwcontrol; this->dev_ready = sharpsl_nand_dev_ready; /* 15 us command delay time */ this->chip_delay = 15; /* set eccmode using hardware ECC */ - this->eccmode = NAND_ECC_HW3_256; - this->enable_hwecc = sharpsl_nand_enable_hwecc; - this->calculate_ecc = sharpsl_nand_calculate_ecc; - this->correct_data = nand_correct_data; + this->ecc.mode = NAND_ECC_HW; + this->ecc.size = 256; + this->ecc.bytes = 3; this->badblock_pattern = &sharpsl_bbt; + if (machine_is_akita() || machine_is_borzoi()) { + this->badblock_pattern = &sharpsl_akita_bbt; + this->ecc.layout = &akita_oobinfo; + } + this->ecc.hwctl = sharpsl_nand_enable_hwecc; + this->ecc.calculate = sharpsl_nand_calculate_ecc; + this->ecc.correct = nand_correct_data; /* Scan to find existence of the device */ - err=nand_scan(sharpsl_mtd,1); + err = nand_scan(sharpsl_mtd, 1); if (err) { iounmap(sharpsl_io_base); kfree(sharpsl_mtd); @@ -209,24 +220,24 @@ sharpsl_nand_init(void) /* Register the partitions */ sharpsl_mtd->name = "sharpsl-nand"; - nr_partitions = parse_mtd_partitions(sharpsl_mtd, part_probes, - &sharpsl_partition_info, 0); - + nr_partitions = parse_mtd_partitions(sharpsl_mtd, part_probes, &sharpsl_partition_info, 0); + if (nr_partitions <= 0) { nr_partitions = DEFAULT_NUM_PARTITIONS; sharpsl_partition_info = sharpsl_nand_default_partition_info; if (machine_is_poodle()) { - sharpsl_partition_info[1].size=22 * 1024 * 1024; + sharpsl_partition_info[1].size = 22 * 1024 * 1024; } else if (machine_is_corgi() || machine_is_shepherd()) { - sharpsl_partition_info[1].size=25 * 1024 * 1024; + sharpsl_partition_info[1].size = 25 * 1024 * 1024; } else if (machine_is_husky()) { - sharpsl_partition_info[1].size=53 * 1024 * 1024; - } - } - - if (machine_is_husky()) { - /* Need to use small eraseblock size for backward compatibility */ - sharpsl_mtd->flags |= MTD_NO_VIRTBLOCKS; + sharpsl_partition_info[1].size = 53 * 1024 * 1024; + } else if (machine_is_spitz()) { + sharpsl_partition_info[1].size = 5 * 1024 * 1024; + } else if (machine_is_akita()) { + sharpsl_partition_info[1].size = 58 * 1024 * 1024; + } else if (machine_is_borzoi()) { + sharpsl_partition_info[1].size = 32 * 1024 * 1024; + } } add_mtd_partitions(sharpsl_mtd, sharpsl_partition_info, nr_partitions); @@ -234,16 +245,14 @@ sharpsl_nand_init(void) /* Return happy */ return 0; } + module_init(sharpsl_nand_init); /* * Clean up routine */ -#ifdef MODULE static void __exit sharpsl_nand_cleanup(void) { - struct nand_chip *this = (struct nand_chip *) &sharpsl_mtd[1]; - /* Release resources, unregister device */ nand_release(sharpsl_mtd); @@ -252,8 +261,8 @@ static void __exit sharpsl_nand_cleanup(void) /* Free the MTD device structure */ kfree(sharpsl_mtd); } + module_exit(sharpsl_nand_cleanup); -#endif MODULE_LICENSE("GPL"); MODULE_AUTHOR("Richard Purdie "); diff --git a/drivers/mtd/nand/spia.c b/drivers/mtd/nand/spia.c index 9cf1ce718..1f6d429b1 100644 --- a/drivers/mtd/nand/spia.c +++ b/drivers/mtd/nand/spia.c @@ -39,16 +39,16 @@ static struct mtd_info *spia_mtd = NULL; */ #define SPIA_IO_BASE 0xd0000000 /* Start of EP7212 IO address space */ #define SPIA_FIO_BASE 0xf0000000 /* Address where flash is mapped */ -#define SPIA_PEDR 0x0080 /* - * IO offset to Port E data register - * where the CLE, ALE and NCE pins - * are wired to. - */ -#define SPIA_PEDDR 0x00c0 /* - * IO offset to Port E data direction - * register so we can control the IO - * lines. - */ +#define SPIA_PEDR 0x0080 /* + * IO offset to Port E data register + * where the CLE, ALE and NCE pins + * are wired to. + */ +#define SPIA_PEDDR 0x00c0 /* + * IO offset to Port E data direction + * register so we can control the IO + * lines. + */ /* * Module stuff @@ -69,79 +69,84 @@ module_param(spia_peddr, int, 0); */ static const struct mtd_partition partition_info[] = { { - .name = "SPIA flash partition 1", - .offset = 0, - .size = 2*1024*1024 - }, + .name = "SPIA flash partition 1", + .offset = 0, + .size = 2 * 1024 * 1024}, { - .name = "SPIA flash partition 2", - .offset = 2*1024*1024, - .size = 6*1024*1024 - } + .name = "SPIA flash partition 2", + .offset = 2 * 1024 * 1024, + .size = 6 * 1024 * 1024} }; -#define NUM_PARTITIONS 2 +#define NUM_PARTITIONS 2 /* * hardware specific access to control-lines -*/ -static void spia_hwcontrol(struct mtd_info *mtd, int cmd){ - - switch(cmd){ + * + * ctrl: + * NAND_CNE: bit 0 -> bit 2 + * NAND_CLE: bit 1 -> bit 0 + * NAND_ALE: bit 2 -> bit 1 + */ +static void spia_hwcontrol(struct mtd_info *mtd, int cmd) +{ + struct nand_chip *chip = mtd->priv; - case NAND_CTL_SETCLE: (*(volatile unsigned char *) (spia_io_base + spia_pedr)) |= 0x01; break; - case NAND_CTL_CLRCLE: (*(volatile unsigned char *) (spia_io_base + spia_pedr)) &= ~0x01; break; + if (ctrl & NAND_CTRL_CHANGE) { + void __iomem *addr = spia_io_base + spia_pedr; + unsigned char bits; - case NAND_CTL_SETALE: (*(volatile unsigned char *) (spia_io_base + spia_pedr)) |= 0x02; break; - case NAND_CTL_CLRALE: (*(volatile unsigned char *) (spia_io_base + spia_pedr)) &= ~0x02; break; + bits = (ctrl & NAND_CNE) << 2; + bits |= (ctrl & NAND_CLE | NAND_ALE) >> 1; + writeb((readb(addr) & ~0x7) | bits, addr); + } - case NAND_CTL_SETNCE: (*(volatile unsigned char *) (spia_io_base + spia_pedr)) &= ~0x04; break; - case NAND_CTL_CLRNCE: (*(volatile unsigned char *) (spia_io_base + spia_pedr)) |= 0x04; break; - } + if (cmd != NAND_CMD_NONE) + writeb(cmd, chip->IO_ADDR_W); } /* * Main initialization routine */ -int __init spia_init (void) +static int __init spia_init(void) { struct nand_chip *this; /* Allocate memory for MTD device structure and private data */ - spia_mtd = kmalloc (sizeof(struct mtd_info) + sizeof (struct nand_chip), - GFP_KERNEL); + spia_mtd = kmalloc(sizeof(struct mtd_info) + sizeof(struct nand_chip), GFP_KERNEL); if (!spia_mtd) { - printk ("Unable to allocate SPIA NAND MTD device structure.\n"); + printk("Unable to allocate SPIA NAND MTD device structure.\n"); return -ENOMEM; } /* Get pointer to private data */ - this = (struct nand_chip *) (&spia_mtd[1]); + this = (struct nand_chip *)(&spia_mtd[1]); /* Initialize structures */ - memset((char *) spia_mtd, 0, sizeof(struct mtd_info)); - memset((char *) this, 0, sizeof(struct nand_chip)); + memset(spia_mtd, 0, sizeof(struct mtd_info)); + memset(this, 0, sizeof(struct nand_chip)); /* Link the private data with the MTD structure */ spia_mtd->priv = this; + spia_mtd->owner = THIS_MODULE; /* * Set GPIO Port E control register so that the pins are configured * to be outputs for controlling the NAND flash. */ - (*(volatile unsigned char *) (spia_io_base + spia_peddr)) = 0x07; + (*(volatile unsigned char *)(spia_io_base + spia_peddr)) = 0x07; /* Set address of NAND IO lines */ - this->IO_ADDR_R = (void __iomem *) spia_fio_base; - this->IO_ADDR_W = (void __iomem *) spia_fio_base; + this->IO_ADDR_R = (void __iomem *)spia_fio_base; + this->IO_ADDR_W = (void __iomem *)spia_fio_base; /* Set address of hardware control function */ - this->hwcontrol = spia_hwcontrol; + this->cmd_ctrl = spia_hwcontrol; /* 15 us command delay time */ this->chip_delay = 15; /* Scan to find existence of the device */ - if (nand_scan (spia_mtd, 1)) { - kfree (spia_mtd); + if (nand_scan(spia_mtd, 1)) { + kfree(spia_mtd); return -ENXIO; } @@ -151,22 +156,22 @@ int __init spia_init (void) /* Return happy */ return 0; } + module_init(spia_init); /* * Clean up routine */ -#ifdef MODULE -static void __exit spia_cleanup (void) +static void __exit spia_cleanup(void) { /* Release resources, unregister device */ - nand_release (spia_mtd); + nand_release(spia_mtd); /* Free the MTD device structure */ - kfree (spia_mtd); + kfree(spia_mtd); } + module_exit(spia_cleanup); -#endif MODULE_LICENSE("GPL"); MODULE_AUTHOR("Steven J. Hill @@ -32,6 +32,8 @@ #include #include +#define CONFIG_NAND_WORKAROUND 1 + /* * MTD structure for TOTO board */ @@ -39,25 +41,6 @@ static struct mtd_info *toto_mtd = NULL; static unsigned long toto_io_base = OMAP_FLASH_1_BASE; -#define CONFIG_NAND_WORKAROUND 1 - -#define NAND_NCE 0x4000 -#define NAND_CLE 0x1000 -#define NAND_ALE 0x0002 -#define NAND_MASK (NAND_CLE | NAND_ALE | NAND_NCE) - -#define T_NAND_CTL_CLRALE(iob) gpiosetout(NAND_ALE, 0) -#define T_NAND_CTL_SETALE(iob) gpiosetout(NAND_ALE, NAND_ALE) -#ifdef CONFIG_NAND_WORKAROUND /* "some" dev boards busted, blue wired to rts2 :( */ -#define T_NAND_CTL_CLRCLE(iob) gpiosetout(NAND_CLE, 0); rts2setout(2, 2) -#define T_NAND_CTL_SETCLE(iob) gpiosetout(NAND_CLE, NAND_CLE); rts2setout(2, 0) -#else -#define T_NAND_CTL_CLRCLE(iob) gpiosetout(NAND_CLE, 0) -#define T_NAND_CTL_SETCLE(iob) gpiosetout(NAND_CLE, NAND_CLE) -#endif -#define T_NAND_CTL_SETNCE(iob) gpiosetout(NAND_NCE, 0) -#define T_NAND_CTL_CLRNCE(iob) gpiosetout(NAND_NCE, NAND_NCE) - /* * Define partitions for flash devices */ @@ -91,91 +74,110 @@ static struct mtd_partition partition_info32M[] = { #define NUM_PARTITIONS32M 3 #define NUM_PARTITIONS64M 4 -/* - * hardware specific access to control-lines -*/ -static void toto_hwcontrol(struct mtd_info *mtd, int cmd) +/* + * hardware specific access to control-lines + * + * ctrl: + * NAND_NCE: bit 0 -> bit 14 (0x4000) + * NAND_CLE: bit 1 -> bit 12 (0x1000) + * NAND_ALE: bit 2 -> bit 1 (0x0002) + */ +static void toto_hwcontrol(struct mtd_info *mtd, int cmd, + unsigned int ctrl) { + struct nand_chip *chip = mtd->priv; - udelay(1); /* hopefully enough time for tc make proceding write to clear */ - switch(cmd){ + if (ctrl & NAND_CTRL_CHANGE) { + unsigned long bits; - case NAND_CTL_SETCLE: T_NAND_CTL_SETCLE(cmd); break; - case NAND_CTL_CLRCLE: T_NAND_CTL_CLRCLE(cmd); break; + /* hopefully enough time for tc make proceding write to clear */ + udelay(1); - case NAND_CTL_SETALE: T_NAND_CTL_SETALE(cmd); break; - case NAND_CTL_CLRALE: T_NAND_CTL_CLRALE(cmd); break; + bits = (~ctrl & NAND_NCE) << 14; + bits |= (ctrl & NAND_CLE) << 12; + bits |= (ctrl & NAND_ALE) >> 1; - case NAND_CTL_SETNCE: T_NAND_CTL_SETNCE(cmd); break; - case NAND_CTL_CLRNCE: T_NAND_CTL_CLRNCE(cmd); break; +#warning Wild guess as gpiosetout() is nowhere defined in the kernel source - tglx + gpiosetout(0x5002, bits); + +#ifdef CONFIG_NAND_WORKAROUND + /* "some" dev boards busted, blue wired to rts2 :( */ + rts2setout(2, (ctrl & NAND_CLE) << 1); +#endif + /* allow time to ensure gpio state to over take memory write */ + udelay(1); } - udelay(1); /* allow time to ensure gpio state to over take memory write */ + + if (cmd != NAND_CMD_NONE) + writeb(cmd, chip->IO_ADDR_W); } /* * Main initialization routine */ -int __init toto_init (void) +static int __init toto_init(void) { struct nand_chip *this; int err = 0; /* Allocate memory for MTD device structure and private data */ - toto_mtd = kmalloc (sizeof(struct mtd_info) + sizeof (struct nand_chip), - GFP_KERNEL); + toto_mtd = kmalloc(sizeof(struct mtd_info) + sizeof(struct nand_chip), GFP_KERNEL); if (!toto_mtd) { - printk (KERN_WARNING "Unable to allocate toto NAND MTD device structure.\n"); + printk(KERN_WARNING "Unable to allocate toto NAND MTD device structure.\n"); err = -ENOMEM; goto out; } /* Get pointer to private data */ - this = (struct nand_chip *) (&toto_mtd[1]); + this = (struct nand_chip *)(&toto_mtd[1]); /* Initialize structures */ - memset((char *) toto_mtd, 0, sizeof(struct mtd_info)); - memset((char *) this, 0, sizeof(struct nand_chip)); + memset(toto_mtd, 0, sizeof(struct mtd_info)); + memset(this, 0, sizeof(struct nand_chip)); /* Link the private data with the MTD structure */ toto_mtd->priv = this; + toto_mtd->owner = THIS_MODULE; /* Set address of NAND IO lines */ this->IO_ADDR_R = toto_io_base; this->IO_ADDR_W = toto_io_base; - this->hwcontrol = toto_hwcontrol; + this->cmd_ctrl = toto_hwcontrol; this->dev_ready = NULL; /* 25 us command delay time */ - this->chip_delay = 30; - this->eccmode = NAND_ECC_SOFT; + this->chip_delay = 30; + this->ecc.mode = NAND_ECC_SOFT; - /* Scan to find existance of the device */ - if (nand_scan (toto_mtd, 1)) { + /* Scan to find existance of the device */ + if (nand_scan(toto_mtd, 1)) { err = -ENXIO; goto out_mtd; } /* Register the partitions */ - switch(toto_mtd->size){ - case SZ_64M: add_mtd_partitions(toto_mtd, partition_info64M, NUM_PARTITIONS64M); break; - case SZ_32M: add_mtd_partitions(toto_mtd, partition_info32M, NUM_PARTITIONS32M); break; - default: { - printk (KERN_WARNING "Unsupported Nand device\n"); + switch (toto_mtd->size) { + case SZ_64M: + add_mtd_partitions(toto_mtd, partition_info64M, NUM_PARTITIONS64M); + break; + case SZ_32M: + add_mtd_partitions(toto_mtd, partition_info32M, NUM_PARTITIONS32M); + break; + default:{ + printk(KERN_WARNING "Unsupported Nand device\n"); err = -ENXIO; goto out_buf; } } - gpioreserve(NAND_MASK); /* claim our gpios */ - archflashwp(0,0); /* open up flash for writing */ + gpioreserve(NAND_MASK); /* claim our gpios */ + archflashwp(0, 0); /* open up flash for writing */ goto out; - -out_buf: - kfree (this->data_buf); -out_mtd: - kfree (toto_mtd); -out: + + out_mtd: + kfree(toto_mtd); + out: return err; } @@ -184,20 +186,21 @@ module_init(toto_init); /* * Clean up routine */ -static void __exit toto_cleanup (void) +static void __exit toto_cleanup(void) { /* Release resources, unregister device */ - nand_release (toto_mtd); + nand_release(toto_mtd); /* Free the MTD device structure */ - kfree (toto_mtd); + kfree(toto_mtd); /* stop flash writes */ - archflashwp(0,1); - + archflashwp(0, 1); + /* release gpios to system */ - gpiorelease(NAND_MASK); + gpiorelease(NAND_MASK); } + module_exit(toto_cleanup); MODULE_LICENSE("GPL"); diff --git a/drivers/mtd/nftlcore.c b/drivers/mtd/nftlcore.c index d7cd5fa16..dd5cea8b4 100644 --- a/drivers/mtd/nftlcore.c +++ b/drivers/mtd/nftlcore.c @@ -11,7 +11,6 @@ #define PRERELEASE -#include #include #include #include @@ -70,8 +69,6 @@ static void nftl_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd) nftl->mbd.devnum = -1; nftl->mbd.blksize = 512; nftl->mbd.tr = tr; - memcpy(&nftl->oobinfo, &mtd->oobinfo, sizeof(struct nand_oobinfo)); - nftl->oobinfo.useecc = MTD_NANDECC_PLACEONLY; if (NFTL_mount(nftl) < 0) { printk(KERN_WARNING "NFTL: could not mount device\n"); @@ -136,6 +133,69 @@ static void nftl_remove_dev(struct mtd_blktrans_dev *dev) kfree(nftl); } +/* + * Read oob data from flash + */ +int nftl_read_oob(struct mtd_info *mtd, loff_t offs, size_t len, + size_t *retlen, uint8_t *buf) +{ + struct mtd_oob_ops ops; + int res; + + ops.mode = MTD_OOB_PLACE; + ops.ooboffs = offs & (mtd->writesize - 1); + ops.ooblen = len; + ops.oobbuf = buf; + ops.datbuf = NULL; + ops.len = len; + + res = mtd->read_oob(mtd, offs & ~(mtd->writesize - 1), &ops); + *retlen = ops.retlen; + return res; +} + +/* + * Write oob data to flash + */ +int nftl_write_oob(struct mtd_info *mtd, loff_t offs, size_t len, + size_t *retlen, uint8_t *buf) +{ + struct mtd_oob_ops ops; + int res; + + ops.mode = MTD_OOB_PLACE; + ops.ooboffs = offs & (mtd->writesize - 1); + ops.ooblen = len; + ops.oobbuf = buf; + ops.datbuf = NULL; + ops.len = len; + + res = mtd->write_oob(mtd, offs & ~(mtd->writesize - 1), &ops); + *retlen = ops.retlen; + return res; +} + +/* + * Write data and oob to flash + */ +static int nftl_write(struct mtd_info *mtd, loff_t offs, size_t len, + size_t *retlen, uint8_t *buf, uint8_t *oob) +{ + struct mtd_oob_ops ops; + int res; + + ops.mode = MTD_OOB_PLACE; + ops.ooboffs = offs; + ops.ooblen = mtd->oobsize; + ops.oobbuf = oob; + ops.datbuf = buf; + ops.len = len; + + res = mtd->write_oob(mtd, offs & ~(mtd->writesize - 1), &ops); + *retlen = ops.retlen; + return res; +} + #ifdef CONFIG_NFTL_RW /* Actual NFTL access routines */ @@ -185,6 +245,7 @@ static u16 NFTL_findfreeblock(struct NFTLrecord *nftl, int desperate ) static u16 NFTL_foldchain (struct NFTLrecord *nftl, unsigned thisVUC, unsigned pendingblock ) { + struct mtd_info *mtd = nftl->mbd.mtd; u16 BlockMap[MAX_SECTORS_PER_UNIT]; unsigned char BlockLastState[MAX_SECTORS_PER_UNIT]; unsigned char BlockFreeFound[MAX_SECTORS_PER_UNIT]; @@ -194,7 +255,7 @@ static u16 NFTL_foldchain (struct NFTLrecord *nftl, unsigned thisVUC, unsigned p unsigned int targetEUN; struct nftl_oob oob; int inplace = 1; - size_t retlen; + size_t retlen; memset(BlockMap, 0xff, sizeof(BlockMap)); memset(BlockFreeFound, 0, sizeof(BlockFreeFound)); @@ -210,21 +271,21 @@ static u16 NFTL_foldchain (struct NFTLrecord *nftl, unsigned thisVUC, unsigned p /* Scan to find the Erase Unit which holds the actual data for each 512-byte block within the Chain. */ - silly = MAX_LOOPS; + silly = MAX_LOOPS; targetEUN = BLOCK_NIL; while (thisEUN <= nftl->lastEUN ) { - unsigned int status, foldmark; + unsigned int status, foldmark; targetEUN = thisEUN; for (block = 0; block < nftl->EraseSize / 512; block ++) { - MTD_READOOB(nftl->mbd.mtd, - (thisEUN * nftl->EraseSize) + (block * 512), - 16 , &retlen, (char *)&oob); + nftl_read_oob(mtd, (thisEUN * nftl->EraseSize) + + (block * 512), 16 , &retlen, + (char *)&oob); if (block == 2) { - foldmark = oob.u.c.FoldMark | oob.u.c.FoldMark1; - if (foldmark == FOLD_MARK_IN_PROGRESS) { - DEBUG(MTD_DEBUG_LEVEL1, - "Write Inhibited on EUN %d\n", thisEUN); + foldmark = oob.u.c.FoldMark | oob.u.c.FoldMark1; + if (foldmark == FOLD_MARK_IN_PROGRESS) { + DEBUG(MTD_DEBUG_LEVEL1, + "Write Inhibited on EUN %d\n", thisEUN); inplace = 0; } else { /* There's no other reason not to do inplace, @@ -233,7 +294,7 @@ static u16 NFTL_foldchain (struct NFTLrecord *nftl, unsigned thisVUC, unsigned p inplace = 1; } } - status = oob.b.Status | oob.b.Status1; + status = oob.b.Status | oob.b.Status1; BlockLastState[block] = status; switch(status) { @@ -328,15 +389,15 @@ static u16 NFTL_foldchain (struct NFTLrecord *nftl, unsigned thisVUC, unsigned p return BLOCK_NIL; } } else { - /* We put a fold mark in the chain we are folding only if - we fold in place to help the mount check code. If we do - not fold in place, it is possible to find the valid - chain by selecting the longer one */ - oob.u.c.FoldMark = oob.u.c.FoldMark1 = cpu_to_le16(FOLD_MARK_IN_PROGRESS); - oob.u.c.unused = 0xffffffff; - MTD_WRITEOOB(nftl->mbd.mtd, (nftl->EraseSize * targetEUN) + 2 * 512 + 8, - 8, &retlen, (char *)&oob.u); - } + /* We put a fold mark in the chain we are folding only if we + fold in place to help the mount check code. If we do not fold in + place, it is possible to find the valid chain by selecting the + longer one */ + oob.u.c.FoldMark = oob.u.c.FoldMark1 = cpu_to_le16(FOLD_MARK_IN_PROGRESS); + oob.u.c.unused = 0xffffffff; + nftl_write_oob(mtd, (nftl->EraseSize * targetEUN) + 2 * 512 + 8, + 8, &retlen, (char *)&oob.u); + } /* OK. We now know the location of every block in the Virtual Unit Chain, and the Erase Unit into which we are supposed to be copying. @@ -353,33 +414,33 @@ static u16 NFTL_foldchain (struct NFTLrecord *nftl, unsigned thisVUC, unsigned p continue; } - /* copy only in non free block (free blocks can only + /* copy only in non free block (free blocks can only happen in case of media errors or deleted blocks) */ - if (BlockMap[block] == BLOCK_NIL) - continue; - - ret = MTD_READ(nftl->mbd.mtd, (nftl->EraseSize * BlockMap[block]) + (block * 512), - 512, &retlen, movebuf); - if (ret < 0) { - ret = MTD_READ(nftl->mbd.mtd, (nftl->EraseSize * BlockMap[block]) - + (block * 512), 512, &retlen, - movebuf); - if (ret != -EIO) - printk("Error went away on retry.\n"); - } + if (BlockMap[block] == BLOCK_NIL) + continue; + + ret = mtd->read(mtd, (nftl->EraseSize * BlockMap[block]) + (block * 512), + 512, &retlen, movebuf); + if (ret < 0 && ret != -EUCLEAN) { + ret = mtd->read(mtd, (nftl->EraseSize * BlockMap[block]) + + (block * 512), 512, &retlen, + movebuf); + if (ret != -EIO) + printk("Error went away on retry.\n"); + } memset(&oob, 0xff, sizeof(struct nftl_oob)); oob.b.Status = oob.b.Status1 = SECTOR_USED; - MTD_WRITEECC(nftl->mbd.mtd, (nftl->EraseSize * targetEUN) + (block * 512), - 512, &retlen, movebuf, (char *)&oob, &nftl->oobinfo); + + nftl_write(nftl->mbd.mtd, (nftl->EraseSize * targetEUN) + + (block * 512), 512, &retlen, movebuf, (char *)&oob); } - /* add the header so that it is now a valid chain */ - oob.u.a.VirtUnitNum = oob.u.a.SpareVirtUnitNum - = cpu_to_le16(thisVUC); - oob.u.a.ReplUnitNum = oob.u.a.SpareReplUnitNum = 0xffff; + /* add the header so that it is now a valid chain */ + oob.u.a.VirtUnitNum = oob.u.a.SpareVirtUnitNum = cpu_to_le16(thisVUC); + oob.u.a.ReplUnitNum = oob.u.a.SpareReplUnitNum = 0xffff; - MTD_WRITEOOB(nftl->mbd.mtd, (nftl->EraseSize * targetEUN) + 8, - 8, &retlen, (char *)&oob.u); + nftl_write_oob(mtd, (nftl->EraseSize * targetEUN) + 8, + 8, &retlen, (char *)&oob.u); /* OK. We've moved the whole lot into the new block. Now we have to free the original blocks. */ @@ -396,18 +457,18 @@ static u16 NFTL_foldchain (struct NFTLrecord *nftl, unsigned thisVUC, unsigned p while (thisEUN <= nftl->lastEUN && thisEUN != targetEUN) { unsigned int EUNtmp; - EUNtmp = nftl->ReplUnitTable[thisEUN]; + EUNtmp = nftl->ReplUnitTable[thisEUN]; - if (NFTL_formatblock(nftl, thisEUN) < 0) { + if (NFTL_formatblock(nftl, thisEUN) < 0) { /* could not erase : mark block as reserved */ nftl->ReplUnitTable[thisEUN] = BLOCK_RESERVED; - } else { + } else { /* correctly erased : mark it as free */ nftl->ReplUnitTable[thisEUN] = BLOCK_FREE; nftl->numfreeEUNs++; - } - thisEUN = EUNtmp; + } + thisEUN = EUNtmp; } /* Make this the new start of chain for thisVUC */ @@ -473,6 +534,7 @@ static inline u16 NFTL_findwriteunit(struct NFTLrecord *nftl, unsigned block) { u16 lastEUN; u16 thisVUC = block / (nftl->EraseSize / 512); + struct mtd_info *mtd = nftl->mbd.mtd; unsigned int writeEUN; unsigned long blockofs = (block * 512) & (nftl->EraseSize -1); size_t retlen; @@ -489,21 +551,22 @@ static inline u16 NFTL_findwriteunit(struct NFTLrecord *nftl, unsigned block) */ lastEUN = BLOCK_NIL; writeEUN = nftl->EUNtable[thisVUC]; - silly = MAX_LOOPS; + silly = MAX_LOOPS; while (writeEUN <= nftl->lastEUN) { struct nftl_bci bci; size_t retlen; - unsigned int status; + unsigned int status; lastEUN = writeEUN; - MTD_READOOB(nftl->mbd.mtd, (writeEUN * nftl->EraseSize) + blockofs, - 8, &retlen, (char *)&bci); + nftl_read_oob(mtd, + (writeEUN * nftl->EraseSize) + blockofs, + 8, &retlen, (char *)&bci); DEBUG(MTD_DEBUG_LEVEL2, "Status of block %d in EUN %d is %x\n", block , writeEUN, le16_to_cpu(bci.Status)); - status = bci.Status | bci.Status1; + status = bci.Status | bci.Status1; switch(status) { case SECTOR_FREE: return writeEUN; @@ -574,10 +637,10 @@ static inline u16 NFTL_findwriteunit(struct NFTLrecord *nftl, unsigned block) /* We've found a free block. Insert it into the chain. */ if (lastEUN != BLOCK_NIL) { - thisVUC |= 0x8000; /* It's a replacement block */ + thisVUC |= 0x8000; /* It's a replacement block */ } else { - /* The first block in a new chain */ - nftl->EUNtable[thisVUC] = writeEUN; + /* The first block in a new chain */ + nftl->EUNtable[thisVUC] = writeEUN; } /* set up the actual EUN we're writing into */ @@ -585,29 +648,29 @@ static inline u16 NFTL_findwriteunit(struct NFTLrecord *nftl, unsigned block) nftl->ReplUnitTable[writeEUN] = BLOCK_NIL; /* ... and on the flash itself */ - MTD_READOOB(nftl->mbd.mtd, writeEUN * nftl->EraseSize + 8, 8, - &retlen, (char *)&oob.u); + nftl_read_oob(mtd, writeEUN * nftl->EraseSize + 8, 8, + &retlen, (char *)&oob.u); oob.u.a.VirtUnitNum = oob.u.a.SpareVirtUnitNum = cpu_to_le16(thisVUC); - MTD_WRITEOOB(nftl->mbd.mtd, writeEUN * nftl->EraseSize + 8, 8, - &retlen, (char *)&oob.u); + nftl_write_oob(mtd, writeEUN * nftl->EraseSize + 8, 8, + &retlen, (char *)&oob.u); - /* we link the new block to the chain only after the + /* we link the new block to the chain only after the block is ready. It avoids the case where the chain could point to a free block */ - if (lastEUN != BLOCK_NIL) { + if (lastEUN != BLOCK_NIL) { /* Both in our cache... */ nftl->ReplUnitTable[lastEUN] = writeEUN; /* ... and on the flash itself */ - MTD_READOOB(nftl->mbd.mtd, (lastEUN * nftl->EraseSize) + 8, - 8, &retlen, (char *)&oob.u); + nftl_read_oob(mtd, (lastEUN * nftl->EraseSize) + 8, + 8, &retlen, (char *)&oob.u); oob.u.a.ReplUnitNum = oob.u.a.SpareReplUnitNum = cpu_to_le16(writeEUN); - MTD_WRITEOOB(nftl->mbd.mtd, (lastEUN * nftl->EraseSize) + 8, - 8, &retlen, (char *)&oob.u); + nftl_write_oob(mtd, (lastEUN * nftl->EraseSize) + 8, + 8, &retlen, (char *)&oob.u); } return writeEUN; @@ -639,10 +702,9 @@ static int nftl_writeblock(struct mtd_blktrans_dev *mbd, unsigned long block, memset(&oob, 0xff, sizeof(struct nftl_oob)); oob.b.Status = oob.b.Status1 = SECTOR_USED; - MTD_WRITEECC(nftl->mbd.mtd, (writeEUN * nftl->EraseSize) + blockofs, - 512, &retlen, (char *)buffer, (char *)&oob, &nftl->oobinfo); - /* need to write SECTOR_USED flags since they are not written in mtd_writeecc */ + nftl_write(nftl->mbd.mtd, (writeEUN * nftl->EraseSize) + blockofs, + 512, &retlen, (char *)buffer, (char *)&oob); return 0; } #endif /* CONFIG_NFTL_RW */ @@ -651,20 +713,22 @@ static int nftl_readblock(struct mtd_blktrans_dev *mbd, unsigned long block, char *buffer) { struct NFTLrecord *nftl = (void *)mbd; + struct mtd_info *mtd = nftl->mbd.mtd; u16 lastgoodEUN; u16 thisEUN = nftl->EUNtable[block / (nftl->EraseSize / 512)]; unsigned long blockofs = (block * 512) & (nftl->EraseSize - 1); - unsigned int status; + unsigned int status; int silly = MAX_LOOPS; - size_t retlen; - struct nftl_bci bci; + size_t retlen; + struct nftl_bci bci; lastgoodEUN = BLOCK_NIL; - if (thisEUN != BLOCK_NIL) { + if (thisEUN != BLOCK_NIL) { while (thisEUN < nftl->nb_blocks) { - if (MTD_READOOB(nftl->mbd.mtd, (thisEUN * nftl->EraseSize) + blockofs, - 8, &retlen, (char *)&bci) < 0) + if (nftl_read_oob(mtd, (thisEUN * nftl->EraseSize) + + blockofs, 8, &retlen, + (char *)&bci) < 0) status = SECTOR_IGNORE; else status = bci.Status | bci.Status1; @@ -694,7 +758,7 @@ static int nftl_readblock(struct mtd_blktrans_dev *mbd, unsigned long block, } thisEUN = nftl->ReplUnitTable[thisEUN]; } - } + } the_end: if (lastgoodEUN == BLOCK_NIL) { @@ -703,7 +767,9 @@ static int nftl_readblock(struct mtd_blktrans_dev *mbd, unsigned long block, } else { loff_t ptr = (lastgoodEUN * nftl->EraseSize) + blockofs; size_t retlen; - if (MTD_READ(nftl->mbd.mtd, ptr, 512, &retlen, buffer)) + int res = mtd->read(mtd, ptr, 512, &retlen, buffer); + + if (res < 0 && res != -EUCLEAN) return -EIO; } return 0; diff --git a/drivers/mtd/nftlmount.c b/drivers/mtd/nftlmount.c index 3b104ebb2..067262ee8 100644 --- a/drivers/mtd/nftlmount.c +++ b/drivers/mtd/nftlmount.c @@ -33,6 +33,11 @@ char nftlmountrev[]="$Revision: 1.41 $"; +extern int nftl_read_oob(struct mtd_info *mtd, loff_t offs, size_t len, + size_t *retlen, uint8_t *buf); +extern int nftl_write_oob(struct mtd_info *mtd, loff_t offs, size_t len, + size_t *retlen, uint8_t *buf); + /* find_boot_record: Find the NFTL Media Header and its Spare copy which contains the * various device information of the NFTL partition and Bad Unit Table. Update * the ReplUnitTable[] table accroding to the Bad Unit Table. ReplUnitTable[] @@ -45,6 +50,7 @@ static int find_boot_record(struct NFTLrecord *nftl) size_t retlen; u8 buf[SECTORSIZE]; struct NFTLMediaHeader *mh = &nftl->MediaHdr; + struct mtd_info *mtd = nftl->mbd.mtd; unsigned int i; /* Assume logical EraseSize == physical erasesize for starting the scan. @@ -65,7 +71,8 @@ static int find_boot_record(struct NFTLrecord *nftl) /* Check for ANAND header first. Then can whinge if it's found but later checks fail */ - ret = MTD_READ(nftl->mbd.mtd, block * nftl->EraseSize, SECTORSIZE, &retlen, buf); + ret = mtd->read(mtd, block * nftl->EraseSize, SECTORSIZE, + &retlen, buf); /* We ignore ret in case the ECC of the MediaHeader is invalid (which is apparently acceptable) */ if (retlen != SECTORSIZE) { @@ -90,8 +97,9 @@ static int find_boot_record(struct NFTLrecord *nftl) } /* To be safer with BIOS, also use erase mark as discriminant */ - if ((ret = MTD_READOOB(nftl->mbd.mtd, block * nftl->EraseSize + SECTORSIZE + 8, - 8, &retlen, (char *)&h1) < 0)) { + if ((ret = nftl_read_oob(mtd, block * nftl->EraseSize + + SECTORSIZE + 8, 8, &retlen, + (char *)&h1) < 0)) { printk(KERN_WARNING "ANAND header found at 0x%x in mtd%d, but OOB data read failed (err %d)\n", block * nftl->EraseSize, nftl->mbd.mtd->index, ret); continue; @@ -109,8 +117,8 @@ static int find_boot_record(struct NFTLrecord *nftl) } /* Finally reread to check ECC */ - if ((ret = MTD_READECC(nftl->mbd.mtd, block * nftl->EraseSize, SECTORSIZE, - &retlen, buf, (char *)&oob, NULL) < 0)) { + if ((ret = mtd->read(mtd, block * nftl->EraseSize, SECTORSIZE, + &retlen, buf) < 0)) { printk(KERN_NOTICE "ANAND header found at 0x%x in mtd%d, but ECC read failed (err %d)\n", block * nftl->EraseSize, nftl->mbd.mtd->index, ret); continue; @@ -228,9 +236,9 @@ device is already correct. The new DiskOnChip driver already scanned the bad block table. Just query it. if ((i & (SECTORSIZE - 1)) == 0) { /* read one sector for every SECTORSIZE of blocks */ - if ((ret = MTD_READECC(nftl->mbd.mtd, block * nftl->EraseSize + - i + SECTORSIZE, SECTORSIZE, &retlen, buf, - (char *)&oob, NULL)) < 0) { + if ((ret = mtd->read(nftl->mbd.mtd, block * nftl->EraseSize + + i + SECTORSIZE, SECTORSIZE, &retlen, + buf)) < 0) { printk(KERN_NOTICE "Read of bad sector table failed (err %d)\n", ret); kfree(nftl->ReplUnitTable); @@ -268,18 +276,22 @@ static int memcmpb(void *a, int c, int n) static int check_free_sectors(struct NFTLrecord *nftl, unsigned int address, int len, int check_oob) { - int i; - size_t retlen; u8 buf[SECTORSIZE + nftl->mbd.mtd->oobsize]; + struct mtd_info *mtd = nftl->mbd.mtd; + size_t retlen; + int i; for (i = 0; i < len; i += SECTORSIZE) { - if (MTD_READECC(nftl->mbd.mtd, address, SECTORSIZE, &retlen, buf, &buf[SECTORSIZE], &nftl->oobinfo) < 0) + if (mtd->read(mtd, address, SECTORSIZE, &retlen, buf)) return -1; if (memcmpb(buf, 0xff, SECTORSIZE) != 0) return -1; if (check_oob) { - if (memcmpb(buf + SECTORSIZE, 0xff, nftl->mbd.mtd->oobsize) != 0) + if(nftl_read_oob(mtd, address, mtd->oobsize, + &retlen, &buf[SECTORSIZE]) < 0) + return -1; + if (memcmpb(buf + SECTORSIZE, 0xff, mtd->oobsize) != 0) return -1; } address += SECTORSIZE; @@ -301,10 +313,11 @@ int NFTL_formatblock(struct NFTLrecord *nftl, int block) unsigned int nb_erases, erase_mark; struct nftl_uci1 uci; struct erase_info *instr = &nftl->instr; + struct mtd_info *mtd = nftl->mbd.mtd; /* Read the Unit Control Information #1 for Wear-Leveling */ - if (MTD_READOOB(nftl->mbd.mtd, block * nftl->EraseSize + SECTORSIZE + 8, - 8, &retlen, (char *)&uci) < 0) + if (nftl_read_oob(mtd, block * nftl->EraseSize + SECTORSIZE + 8, + 8, &retlen, (char *)&uci) < 0) goto default_uci1; erase_mark = le16_to_cpu ((uci.EraseMark | uci.EraseMark1)); @@ -321,7 +334,7 @@ int NFTL_formatblock(struct NFTLrecord *nftl, int block) instr->mtd = nftl->mbd.mtd; instr->addr = block * nftl->EraseSize; instr->len = nftl->EraseSize; - MTD_ERASE(nftl->mbd.mtd, instr); + mtd->erase(mtd, instr); if (instr->state == MTD_ERASE_FAILED) { printk("Error while formatting block %d\n", block); @@ -343,8 +356,8 @@ int NFTL_formatblock(struct NFTLrecord *nftl, int block) goto fail; uci.WearInfo = le32_to_cpu(nb_erases); - if (MTD_WRITEOOB(nftl->mbd.mtd, block * nftl->EraseSize + SECTORSIZE + 8, 8, - &retlen, (char *)&uci) < 0) + if (nftl_write_oob(mtd, block * nftl->EraseSize + SECTORSIZE + + 8, 8, &retlen, (char *)&uci) < 0) goto fail; return 0; fail: @@ -365,6 +378,7 @@ fail: * case. */ static void check_sectors_in_chain(struct NFTLrecord *nftl, unsigned int first_block) { + struct mtd_info *mtd = nftl->mbd.mtd; unsigned int block, i, status; struct nftl_bci bci; int sectors_per_block; @@ -374,8 +388,9 @@ static void check_sectors_in_chain(struct NFTLrecord *nftl, unsigned int first_b block = first_block; for (;;) { for (i = 0; i < sectors_per_block; i++) { - if (MTD_READOOB(nftl->mbd.mtd, block * nftl->EraseSize + i * SECTORSIZE, - 8, &retlen, (char *)&bci) < 0) + if (nftl_read_oob(mtd, + block * nftl->EraseSize + i * SECTORSIZE, + 8, &retlen, (char *)&bci) < 0) status = SECTOR_IGNORE; else status = bci.Status | bci.Status1; @@ -394,9 +409,10 @@ static void check_sectors_in_chain(struct NFTLrecord *nftl, unsigned int first_b /* sector not free actually : mark it as SECTOR_IGNORE */ bci.Status = SECTOR_IGNORE; bci.Status1 = SECTOR_IGNORE; - MTD_WRITEOOB(nftl->mbd.mtd, - block * nftl->EraseSize + i * SECTORSIZE, - 8, &retlen, (char *)&bci); + nftl_write_oob(mtd, block * + nftl->EraseSize + + i * SECTORSIZE, 8, + &retlen, (char *)&bci); } break; default: @@ -481,13 +497,14 @@ static void format_chain(struct NFTLrecord *nftl, unsigned int first_block) * 1. */ static int check_and_mark_free_block(struct NFTLrecord *nftl, int block) { + struct mtd_info *mtd = nftl->mbd.mtd; struct nftl_uci1 h1; unsigned int erase_mark; size_t retlen; /* check erase mark. */ - if (MTD_READOOB(nftl->mbd.mtd, block * nftl->EraseSize + SECTORSIZE + 8, 8, - &retlen, (char *)&h1) < 0) + if (nftl_read_oob(mtd, block * nftl->EraseSize + SECTORSIZE + 8, 8, + &retlen, (char *)&h1) < 0) return -1; erase_mark = le16_to_cpu ((h1.EraseMark | h1.EraseMark1)); @@ -501,8 +518,9 @@ static int check_and_mark_free_block(struct NFTLrecord *nftl, int block) h1.EraseMark = cpu_to_le16(ERASE_MARK); h1.EraseMark1 = cpu_to_le16(ERASE_MARK); h1.WearInfo = cpu_to_le32(0); - if (MTD_WRITEOOB(nftl->mbd.mtd, block * nftl->EraseSize + SECTORSIZE + 8, 8, - &retlen, (char *)&h1) < 0) + if (nftl_write_oob(mtd, + block * nftl->EraseSize + SECTORSIZE + 8, 8, + &retlen, (char *)&h1) < 0) return -1; } else { #if 0 @@ -513,8 +531,8 @@ static int check_and_mark_free_block(struct NFTLrecord *nftl, int block) SECTORSIZE, 0) != 0) return -1; - if (MTD_READOOB(nftl->mbd.mtd, block * nftl->EraseSize + i, - 16, &retlen, buf) < 0) + if (nftl_read_oob(mtd, block * nftl->EraseSize + i, + 16, &retlen, buf) < 0) return -1; if (i == SECTORSIZE) { /* skip erase mark */ @@ -540,11 +558,12 @@ static int check_and_mark_free_block(struct NFTLrecord *nftl, int block) */ static int get_fold_mark(struct NFTLrecord *nftl, unsigned int block) { + struct mtd_info *mtd = nftl->mbd.mtd; struct nftl_uci2 uci; size_t retlen; - if (MTD_READOOB(nftl->mbd.mtd, block * nftl->EraseSize + 2 * SECTORSIZE + 8, - 8, &retlen, (char *)&uci) < 0) + if (nftl_read_oob(mtd, block * nftl->EraseSize + 2 * SECTORSIZE + 8, + 8, &retlen, (char *)&uci) < 0) return 0; return le16_to_cpu((uci.FoldMark | uci.FoldMark1)); @@ -558,6 +577,7 @@ int NFTL_mount(struct NFTLrecord *s) int chain_length, do_format_chain; struct nftl_uci0 h0; struct nftl_uci1 h1; + struct mtd_info *mtd = s->mbd.mtd; size_t retlen; /* search for NFTL MediaHeader and Spare NFTL Media Header */ @@ -582,10 +602,13 @@ int NFTL_mount(struct NFTLrecord *s) for (;;) { /* read the block header. If error, we format the chain */ - if (MTD_READOOB(s->mbd.mtd, block * s->EraseSize + 8, 8, - &retlen, (char *)&h0) < 0 || - MTD_READOOB(s->mbd.mtd, block * s->EraseSize + SECTORSIZE + 8, 8, - &retlen, (char *)&h1) < 0) { + if (nftl_read_oob(mtd, + block * s->EraseSize + 8, 8, + &retlen, (char *)&h0) < 0 || + nftl_read_oob(mtd, + block * s->EraseSize + + SECTORSIZE + 8, 8, + &retlen, (char *)&h1) < 0) { s->ReplUnitTable[block] = BLOCK_NIL; do_format_chain = 1; break; diff --git a/drivers/mtd/onenand/Kconfig b/drivers/mtd/onenand/Kconfig index 126ff6bf6..5930a0373 100644 --- a/drivers/mtd/onenand/Kconfig +++ b/drivers/mtd/onenand/Kconfig @@ -29,6 +29,20 @@ config MTD_ONENAND_GENERIC help Support for OneNAND flash via platform device driver. +config MTD_ONENAND_OTP + bool "OneNAND OTP Support" + depends on MTD_ONENAND + help + One Block of the NAND Flash Array memory is reserved as + a One-Time Programmable Block memory area. + Also, 1st Block of NAND Flash Array can be used as OTP. + + The OTP block can be read, programmed and locked using the same + operations as any other NAND Flash Array memory block. + OTP block cannot be erased. + + OTP block is fully-guaranteed to be a valid block. + config MTD_ONENAND_SYNC_READ bool "OneNAND Sync. Burst Read Support" depends on ARCH_OMAP diff --git a/drivers/mtd/onenand/onenand_base.c b/drivers/mtd/onenand/onenand_base.c index a53a73fc2..84ec40d25 100644 --- a/drivers/mtd/onenand/onenand_base.c +++ b/drivers/mtd/onenand/onenand_base.c @@ -23,8 +23,7 @@ /** * onenand_oob_64 - oob info for large (2KB) page */ -static struct nand_oobinfo onenand_oob_64 = { - .useecc = MTD_NANDECC_AUTOPLACE, +static struct nand_ecclayout onenand_oob_64 = { .eccbytes = 20, .eccpos = { 8, 9, 10, 11, 12, @@ -34,14 +33,14 @@ static struct nand_oobinfo onenand_oob_64 = { }, .oobfree = { {2, 3}, {14, 2}, {18, 3}, {30, 2}, - {24, 3}, {46, 2}, {40, 3}, {62, 2} } + {34, 3}, {46, 2}, {50, 3}, {62, 2} + } }; /** * onenand_oob_32 - oob info for middle (1KB) page */ -static struct nand_oobinfo onenand_oob_32 = { - .useecc = MTD_NANDECC_AUTOPLACE, +static struct nand_ecclayout onenand_oob_32 = { .eccbytes = 10, .eccpos = { 8, 9, 10, 11, 12, @@ -190,7 +189,7 @@ static int onenand_buffer_address(int dataram1, int sectors, int count) static int onenand_command(struct mtd_info *mtd, int cmd, loff_t addr, size_t len) { struct onenand_chip *this = mtd->priv; - int value, readcmd = 0; + int value, readcmd = 0, block_cmd = 0; int block, page; /* Now we use page size operation */ int sectors = 4, count = 4; @@ -206,6 +205,8 @@ static int onenand_command(struct mtd_info *mtd, int cmd, loff_t addr, size_t le case ONENAND_CMD_ERASE: case ONENAND_CMD_BUFFERRAM: + case ONENAND_CMD_OTP_ACCESS: + block_cmd = 1; block = (int) (addr >> this->erase_shift); page = -1; break; @@ -233,6 +234,12 @@ static int onenand_command(struct mtd_info *mtd, int cmd, loff_t addr, size_t le /* Write 'DFS, FBA' of Flash */ value = onenand_block_address(this, block); this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1); + + if (block_cmd) { + /* Select DataRAM for DDP */ + value = onenand_bufferram_address(this, block); + this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2); + } } if (page != -1) { @@ -301,6 +308,7 @@ static int onenand_wait(struct mtd_info *mtd, int state) if (state != FL_READING) cond_resched(); + touch_softlockup_watchdog(); } /* To get correct interrupt status in timeout case */ interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT); @@ -344,7 +352,7 @@ static inline int onenand_bufferram_offset(struct mtd_info *mtd, int area) if (ONENAND_CURRENT_BUFFERRAM(this)) { if (area == ONENAND_DATARAM) - return mtd->oobblock; + return mtd->writesize; if (area == ONENAND_SPARERAM) return mtd->oobsize; } @@ -372,6 +380,17 @@ static int onenand_read_bufferram(struct mtd_info *mtd, int area, bufferram += onenand_bufferram_offset(mtd, area); + if (ONENAND_CHECK_BYTE_ACCESS(count)) { + unsigned short word; + + /* Align with word(16-bit) size */ + count--; + + /* Read word and save byte */ + word = this->read_word(bufferram + offset + count); + buffer[count] = (word & 0xff); + } + memcpy(buffer, bufferram + offset, count); return 0; @@ -399,6 +418,17 @@ static int onenand_sync_read_bufferram(struct mtd_info *mtd, int area, this->mmcontrol(mtd, ONENAND_SYS_CFG1_SYNC_READ); + if (ONENAND_CHECK_BYTE_ACCESS(count)) { + unsigned short word; + + /* Align with word(16-bit) size */ + count--; + + /* Read word and save byte */ + word = this->read_word(bufferram + offset + count); + buffer[count] = (word & 0xff); + } + memcpy(buffer, bufferram + offset, count); this->mmcontrol(mtd, 0); @@ -426,6 +456,22 @@ static int onenand_write_bufferram(struct mtd_info *mtd, int area, bufferram += onenand_bufferram_offset(mtd, area); + if (ONENAND_CHECK_BYTE_ACCESS(count)) { + unsigned short word; + int byte_offset; + + /* Align with word(16-bit) size */ + count--; + + /* Calculate byte access offset */ + byte_offset = offset + count; + + /* Read word and save byte */ + word = this->read_word(bufferram + byte_offset); + word = (word & ~0xff) | buffer[count]; + this->write_word(word, bufferram + byte_offset); + } + memcpy(bufferram + offset, buffer, count); return 0; @@ -549,31 +595,28 @@ static void onenand_release_device(struct mtd_info *mtd) } /** - * onenand_read_ecc - [MTD Interface] Read data with ECC + * onenand_read - [MTD Interface] Read data from flash * @param mtd MTD device structure * @param from offset to read from * @param len number of bytes to read * @param retlen pointer to variable to store the number of read bytes * @param buf the databuffer to put data - * @param oob_buf filesystem supplied oob data buffer - * @param oobsel oob selection structure * - * OneNAND read with ECC - */ -static int onenand_read_ecc(struct mtd_info *mtd, loff_t from, size_t len, - size_t *retlen, u_char *buf, - u_char *oob_buf, struct nand_oobinfo *oobsel) + * Read with ecc +*/ +static int onenand_read(struct mtd_info *mtd, loff_t from, size_t len, + size_t *retlen, u_char *buf) { struct onenand_chip *this = mtd->priv; int read = 0, column; int thislen; int ret = 0; - DEBUG(MTD_DEBUG_LEVEL3, "onenand_read_ecc: from = 0x%08x, len = %i\n", (unsigned int) from, (int) len); + DEBUG(MTD_DEBUG_LEVEL3, "onenand_read: from = 0x%08x, len = %i\n", (unsigned int) from, (int) len); /* Do not allow reads past end of device */ if ((from + len) > mtd->size) { - DEBUG(MTD_DEBUG_LEVEL0, "onenand_read_ecc: Attempt read beyond end of device\n"); + DEBUG(MTD_DEBUG_LEVEL0, "onenand_read: Attempt read beyond end of device\n"); *retlen = 0; return -EINVAL; } @@ -584,14 +627,14 @@ static int onenand_read_ecc(struct mtd_info *mtd, loff_t from, size_t len, /* TODO handling oob */ while (read < len) { - thislen = min_t(int, mtd->oobblock, len - read); + thislen = min_t(int, mtd->writesize, len - read); - column = from & (mtd->oobblock - 1); - if (column + thislen > mtd->oobblock) - thislen = mtd->oobblock - column; + column = from & (mtd->writesize - 1); + if (column + thislen > mtd->writesize) + thislen = mtd->writesize - column; if (!onenand_check_bufferram(mtd, from)) { - this->command(mtd, ONENAND_CMD_READ, from, mtd->oobblock); + this->command(mtd, ONENAND_CMD_READ, from, mtd->writesize); ret = this->wait(mtd, FL_READING); /* First copy data and check return value for ECC handling */ @@ -606,7 +649,7 @@ static int onenand_read_ecc(struct mtd_info *mtd, loff_t from, size_t len, break; if (ret) { - DEBUG(MTD_DEBUG_LEVEL0, "onenand_read_ecc: read failed = %d\n", ret); + DEBUG(MTD_DEBUG_LEVEL0, "onenand_read: read failed = %d\n", ret); goto out; } @@ -628,23 +671,7 @@ out: } /** - * onenand_read - [MTD Interface] MTD compability function for onenand_read_ecc - * @param mtd MTD device structure - * @param from offset to read from - * @param len number of bytes to read - * @param retlen pointer to variable to store the number of read bytes - * @param buf the databuffer to put data - * - * This function simply calls onenand_read_ecc with oob buffer and oobsel = NULL -*/ -static int onenand_read(struct mtd_info *mtd, loff_t from, size_t len, - size_t *retlen, u_char *buf) -{ - return onenand_read_ecc(mtd, from, len, retlen, buf, NULL, NULL); -} - -/** - * onenand_read_oob - [MTD Interface] OneNAND read out-of-band + * onenand_do_read_oob - [MTD Interface] OneNAND read out-of-band * @param mtd MTD device structure * @param from offset to read from * @param len number of bytes to read @@ -653,8 +680,8 @@ static int onenand_read(struct mtd_info *mtd, loff_t from, size_t len, * * OneNAND read out-of-band data from the spare area */ -static int onenand_read_oob(struct mtd_info *mtd, loff_t from, size_t len, - size_t *retlen, u_char *buf) +int onenand_do_read_oob(struct mtd_info *mtd, loff_t from, size_t len, + size_t *retlen, u_char *buf) { struct onenand_chip *this = mtd->priv; int read = 0, thislen, column; @@ -704,7 +731,7 @@ static int onenand_read_oob(struct mtd_info *mtd, loff_t from, size_t len, /* Read more? */ if (read < len) { /* Page size */ - from += mtd->oobblock; + from += mtd->writesize; column = 0; } } @@ -717,7 +744,52 @@ out: return ret; } +/** + * onenand_read_oob - [MTD Interface] NAND write data and/or out-of-band + * @mtd: MTD device structure + * @from: offset to read from + * @ops: oob operation description structure + */ +static int onenand_read_oob(struct mtd_info *mtd, loff_t from, + struct mtd_oob_ops *ops) +{ + BUG_ON(ops->mode != MTD_OOB_PLACE); + + return onenand_do_read_oob(mtd, from + ops->ooboffs, ops->len, + &ops->retlen, ops->oobbuf); +} + #ifdef CONFIG_MTD_ONENAND_VERIFY_WRITE +/** + * onenand_verify_oob - [GENERIC] verify the oob contents after a write + * @param mtd MTD device structure + * @param buf the databuffer to verify + * @param to offset to read from + * @param len number of bytes to read and compare + * + */ +static int onenand_verify_oob(struct mtd_info *mtd, const u_char *buf, loff_t to, int len) +{ + struct onenand_chip *this = mtd->priv; + char *readp = this->page_buf; + int column = to & (mtd->oobsize - 1); + int status, i; + + this->command(mtd, ONENAND_CMD_READOOB, to, mtd->oobsize); + onenand_update_bufferram(mtd, to, 0); + status = this->wait(mtd, FL_READING); + if (status) + return status; + + this->read_bufferram(mtd, ONENAND_SPARERAM, readp, column, len); + + for(i = 0; i < len; i++) + if (buf[i] != 0xFF && buf[i] != readp[i]) + return -EBADMSG; + + return 0; +} + /** * onenand_verify_page - [GENERIC] verify the chip contents after a write * @param mtd MTD device structure @@ -731,7 +803,7 @@ static int onenand_verify_page(struct mtd_info *mtd, u_char *buf, loff_t addr) void __iomem *dataram0, *dataram1; int ret = 0; - this->command(mtd, ONENAND_CMD_READ, addr, mtd->oobblock); + this->command(mtd, ONENAND_CMD_READ, addr, mtd->writesize); ret = this->wait(mtd, FL_READING); if (ret) @@ -741,53 +813,51 @@ static int onenand_verify_page(struct mtd_info *mtd, u_char *buf, loff_t addr) /* Check, if the two dataram areas are same */ dataram0 = this->base + ONENAND_DATARAM; - dataram1 = dataram0 + mtd->oobblock; + dataram1 = dataram0 + mtd->writesize; - if (memcmp(dataram0, dataram1, mtd->oobblock)) + if (memcmp(dataram0, dataram1, mtd->writesize)) return -EBADMSG; return 0; } #else #define onenand_verify_page(...) (0) +#define onenand_verify_oob(...) (0) #endif -#define NOTALIGNED(x) ((x & (mtd->oobblock - 1)) != 0) +#define NOTALIGNED(x) ((x & (mtd->writesize - 1)) != 0) /** - * onenand_write_ecc - [MTD Interface] OneNAND write with ECC + * onenand_write - [MTD Interface] write buffer to FLASH * @param mtd MTD device structure * @param to offset to write to * @param len number of bytes to write * @param retlen pointer to variable to store the number of written bytes * @param buf the data to write - * @param eccbuf filesystem supplied oob data buffer - * @param oobsel oob selection structure * - * OneNAND write with ECC + * Write with ECC */ -static int onenand_write_ecc(struct mtd_info *mtd, loff_t to, size_t len, - size_t *retlen, const u_char *buf, - u_char *eccbuf, struct nand_oobinfo *oobsel) +static int onenand_write(struct mtd_info *mtd, loff_t to, size_t len, + size_t *retlen, const u_char *buf) { struct onenand_chip *this = mtd->priv; int written = 0; int ret = 0; - DEBUG(MTD_DEBUG_LEVEL3, "onenand_write_ecc: to = 0x%08x, len = %i\n", (unsigned int) to, (int) len); + DEBUG(MTD_DEBUG_LEVEL3, "onenand_write: to = 0x%08x, len = %i\n", (unsigned int) to, (int) len); /* Initialize retlen, in case of early exit */ *retlen = 0; /* Do not allow writes past end of device */ if (unlikely((to + len) > mtd->size)) { - DEBUG(MTD_DEBUG_LEVEL0, "onenand_write_ecc: Attempt write to past end of device\n"); + DEBUG(MTD_DEBUG_LEVEL0, "onenand_write: Attempt write to past end of device\n"); return -EINVAL; } /* Reject writes, which are not page aligned */ if (unlikely(NOTALIGNED(to)) || unlikely(NOTALIGNED(len))) { - DEBUG(MTD_DEBUG_LEVEL0, "onenand_write_ecc: Attempt to write not page aligned data\n"); + DEBUG(MTD_DEBUG_LEVEL0, "onenand_write: Attempt to write not page aligned data\n"); return -EINVAL; } @@ -796,20 +866,20 @@ static int onenand_write_ecc(struct mtd_info *mtd, loff_t to, size_t len, /* Loop until all data write */ while (written < len) { - int thislen = min_t(int, mtd->oobblock, len - written); + int thislen = min_t(int, mtd->writesize, len - written); - this->command(mtd, ONENAND_CMD_BUFFERRAM, to, mtd->oobblock); + this->command(mtd, ONENAND_CMD_BUFFERRAM, to, mtd->writesize); this->write_bufferram(mtd, ONENAND_DATARAM, buf, 0, thislen); this->write_bufferram(mtd, ONENAND_SPARERAM, ffchars, 0, mtd->oobsize); - this->command(mtd, ONENAND_CMD_PROG, to, mtd->oobblock); + this->command(mtd, ONENAND_CMD_PROG, to, mtd->writesize); onenand_update_bufferram(mtd, to, 1); ret = this->wait(mtd, FL_WRITING); if (ret) { - DEBUG(MTD_DEBUG_LEVEL0, "onenand_write_ecc: write filaed %d\n", ret); + DEBUG(MTD_DEBUG_LEVEL0, "onenand_write: write filaed %d\n", ret); goto out; } @@ -818,7 +888,7 @@ static int onenand_write_ecc(struct mtd_info *mtd, loff_t to, size_t len, /* Only check verify write turn on */ ret = onenand_verify_page(mtd, (u_char *) buf, to); if (ret) { - DEBUG(MTD_DEBUG_LEVEL0, "onenand_write_ecc: verify failed %d\n", ret); + DEBUG(MTD_DEBUG_LEVEL0, "onenand_write: verify failed %d\n", ret); goto out; } @@ -839,24 +909,7 @@ out: } /** - * onenand_write - [MTD Interface] compability function for onenand_write_ecc - * @param mtd MTD device structure - * @param to offset to write to - * @param len number of bytes to write - * @param retlen pointer to variable to store the number of written bytes - * @param buf the data to write - * - * This function simply calls onenand_write_ecc - * with oob buffer and oobsel = NULL - */ -static int onenand_write(struct mtd_info *mtd, loff_t to, size_t len, - size_t *retlen, const u_char *buf) -{ - return onenand_write_ecc(mtd, to, len, retlen, buf, NULL, NULL); -} - -/** - * onenand_write_oob - [MTD Interface] OneNAND write out-of-band + * onenand_do_write_oob - [Internal] OneNAND write out-of-band * @param mtd MTD device structure * @param to offset to write to * @param len number of bytes to write @@ -865,11 +918,11 @@ static int onenand_write(struct mtd_info *mtd, loff_t to, size_t len, * * OneNAND write out-of-band */ -static int onenand_write_oob(struct mtd_info *mtd, loff_t to, size_t len, - size_t *retlen, const u_char *buf) +static int onenand_do_write_oob(struct mtd_info *mtd, loff_t to, size_t len, + size_t *retlen, const u_char *buf) { struct onenand_chip *this = mtd->priv; - int column, status; + int column, ret = 0; int written = 0; DEBUG(MTD_DEBUG_LEVEL3, "onenand_write_oob: to = 0x%08x, len = %i\n", (unsigned int) to, (int) len); @@ -894,16 +947,27 @@ static int onenand_write_oob(struct mtd_info *mtd, loff_t to, size_t len, this->command(mtd, ONENAND_CMD_BUFFERRAM, to, mtd->oobsize); - this->write_bufferram(mtd, ONENAND_SPARERAM, ffchars, 0, mtd->oobsize); - this->write_bufferram(mtd, ONENAND_SPARERAM, buf, column, thislen); + /* We send data to spare ram with oobsize + * to prevent byte access */ + memset(this->page_buf, 0xff, mtd->oobsize); + memcpy(this->page_buf + column, buf, thislen); + this->write_bufferram(mtd, ONENAND_SPARERAM, this->page_buf, 0, mtd->oobsize); this->command(mtd, ONENAND_CMD_PROGOOB, to, mtd->oobsize); onenand_update_bufferram(mtd, to, 0); - status = this->wait(mtd, FL_WRITING); - if (status) + ret = this->wait(mtd, FL_WRITING); + if (ret) { + DEBUG(MTD_DEBUG_LEVEL0, "onenand_write_oob: write filaed %d\n", ret); + goto out; + } + + ret = onenand_verify_oob(mtd, buf, to, thislen); + if (ret) { + DEBUG(MTD_DEBUG_LEVEL0, "onenand_write_oob: verify failed %d\n", ret); goto out; + } written += thislen; @@ -920,145 +984,22 @@ out: *retlen = written; - return 0; + return ret; } /** - * onenand_writev_ecc - [MTD Interface] write with iovec with ecc - * @param mtd MTD device structure - * @param vecs the iovectors to write - * @param count number of vectors - * @param to offset to write to - * @param retlen pointer to variable to store the number of written bytes - * @param eccbuf filesystem supplied oob data buffer - * @param oobsel oob selection structure - * - * OneNAND write with iovec with ecc + * onenand_write_oob - [MTD Interface] NAND write data and/or out-of-band + * @mtd: MTD device structure + * @from: offset to read from + * @ops: oob operation description structure */ -static int onenand_writev_ecc(struct mtd_info *mtd, const struct kvec *vecs, - unsigned long count, loff_t to, size_t *retlen, - u_char *eccbuf, struct nand_oobinfo *oobsel) +static int onenand_write_oob(struct mtd_info *mtd, loff_t to, + struct mtd_oob_ops *ops) { - struct onenand_chip *this = mtd->priv; - unsigned char *pbuf; - size_t total_len, len; - int i, written = 0; - int ret = 0; - - /* Preset written len for early exit */ - *retlen = 0; - - /* Calculate total length of data */ - total_len = 0; - for (i = 0; i < count; i++) - total_len += vecs[i].iov_len; - - DEBUG(MTD_DEBUG_LEVEL3, "onenand_writev_ecc: to = 0x%08x, len = %i, count = %ld\n", (unsigned int) to, (unsigned int) total_len, count); - - /* Do not allow write past end of the device */ - if (unlikely((to + total_len) > mtd->size)) { - DEBUG(MTD_DEBUG_LEVEL0, "onenand_writev_ecc: Attempted write past end of device\n"); - return -EINVAL; - } - - /* Reject writes, which are not page aligned */ - if (unlikely(NOTALIGNED(to)) || unlikely(NOTALIGNED(total_len))) { - DEBUG(MTD_DEBUG_LEVEL0, "onenand_writev_ecc: Attempt to write not page aligned data\n"); - return -EINVAL; - } - - /* Grab the lock and see if the device is available */ - onenand_get_device(mtd, FL_WRITING); - - /* TODO handling oob */ - - /* Loop until all keve's data has been written */ - len = 0; - while (count) { - pbuf = this->page_buf; - /* - * If the given tuple is >= pagesize then - * write it out from the iov - */ - if ((vecs->iov_len - len) >= mtd->oobblock) { - pbuf = vecs->iov_base + len; - - len += mtd->oobblock; - - /* Check, if we have to switch to the next tuple */ - if (len >= (int) vecs->iov_len) { - vecs++; - len = 0; - count--; - } - } else { - int cnt = 0, thislen; - while (cnt < mtd->oobblock) { - thislen = min_t(int, mtd->oobblock - cnt, vecs->iov_len - len); - memcpy(this->page_buf + cnt, vecs->iov_base + len, thislen); - cnt += thislen; - len += thislen; - - /* Check, if we have to switch to the next tuple */ - if (len >= (int) vecs->iov_len) { - vecs++; - len = 0; - count--; - } - } - } - - this->command(mtd, ONENAND_CMD_BUFFERRAM, to, mtd->oobblock); + BUG_ON(ops->mode != MTD_OOB_PLACE); - this->write_bufferram(mtd, ONENAND_DATARAM, pbuf, 0, mtd->oobblock); - this->write_bufferram(mtd, ONENAND_SPARERAM, ffchars, 0, mtd->oobsize); - - this->command(mtd, ONENAND_CMD_PROG, to, mtd->oobblock); - - onenand_update_bufferram(mtd, to, 1); - - ret = this->wait(mtd, FL_WRITING); - if (ret) { - DEBUG(MTD_DEBUG_LEVEL0, "onenand_writev_ecc: write failed %d\n", ret); - goto out; - } - - - /* Only check verify write turn on */ - ret = onenand_verify_page(mtd, (u_char *) pbuf, to); - if (ret) { - DEBUG(MTD_DEBUG_LEVEL0, "onenand_writev_ecc: verify failed %d\n", ret); - goto out; - } - - written += mtd->oobblock; - - to += mtd->oobblock; - } - -out: - /* Deselect and wakt up anyone waiting on the device */ - onenand_release_device(mtd); - - *retlen = written; - - return 0; -} - -/** - * onenand_writev - [MTD Interface] compabilty function for onenand_writev_ecc - * @param mtd MTD device structure - * @param vecs the iovectors to write - * @param count number of vectors - * @param to offset to write to - * @param retlen pointer to variable to store the number of written bytes - * - * OneNAND write with kvec. This just calls the ecc function - */ -static int onenand_writev(struct mtd_info *mtd, const struct kvec *vecs, - unsigned long count, loff_t to, size_t *retlen) -{ - return onenand_writev_ecc(mtd, vecs, count, to, retlen, NULL, NULL); + return onenand_do_write_oob(mtd, to + ops->ooboffs, ops->len, + &ops->retlen, ops->oobbuf); } /** @@ -1227,7 +1168,7 @@ static int onenand_default_block_markbad(struct mtd_info *mtd, loff_t ofs) /* We write two bytes, so we dont have to mess with 16 bit access */ ofs += mtd->oobsize + (bbm->badblockpos & ~0x01); - return mtd->write_oob(mtd, ofs , 2, &retlen, buf); + return onenand_do_write_oob(mtd, ofs , 2, &retlen, buf); } /** @@ -1324,6 +1265,304 @@ static int onenand_unlock(struct mtd_info *mtd, loff_t ofs, size_t len) return 0; } +#ifdef CONFIG_MTD_ONENAND_OTP + +/* Interal OTP operation */ +typedef int (*otp_op_t)(struct mtd_info *mtd, loff_t form, size_t len, + size_t *retlen, u_char *buf); + +/** + * do_otp_read - [DEFAULT] Read OTP block area + * @param mtd MTD device structure + * @param from The offset to read + * @param len number of bytes to read + * @param retlen pointer to variable to store the number of readbytes + * @param buf the databuffer to put/get data + * + * Read OTP block area. + */ +static int do_otp_read(struct mtd_info *mtd, loff_t from, size_t len, + size_t *retlen, u_char *buf) +{ + struct onenand_chip *this = mtd->priv; + int ret; + + /* Enter OTP access mode */ + this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0); + this->wait(mtd, FL_OTPING); + + ret = mtd->read(mtd, from, len, retlen, buf); + + /* Exit OTP access mode */ + this->command(mtd, ONENAND_CMD_RESET, 0, 0); + this->wait(mtd, FL_RESETING); + + return ret; +} + +/** + * do_otp_write - [DEFAULT] Write OTP block area + * @param mtd MTD device structure + * @param from The offset to write + * @param len number of bytes to write + * @param retlen pointer to variable to store the number of write bytes + * @param buf the databuffer to put/get data + * + * Write OTP block area. + */ +static int do_otp_write(struct mtd_info *mtd, loff_t from, size_t len, + size_t *retlen, u_char *buf) +{ + struct onenand_chip *this = mtd->priv; + unsigned char *pbuf = buf; + int ret; + + /* Force buffer page aligned */ + if (len < mtd->writesize) { + memcpy(this->page_buf, buf, len); + memset(this->page_buf + len, 0xff, mtd->writesize - len); + pbuf = this->page_buf; + len = mtd->writesize; + } + + /* Enter OTP access mode */ + this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0); + this->wait(mtd, FL_OTPING); + + ret = mtd->write(mtd, from, len, retlen, pbuf); + + /* Exit OTP access mode */ + this->command(mtd, ONENAND_CMD_RESET, 0, 0); + this->wait(mtd, FL_RESETING); + + return ret; +} + +/** + * do_otp_lock - [DEFAULT] Lock OTP block area + * @param mtd MTD device structure + * @param from The offset to lock + * @param len number of bytes to lock + * @param retlen pointer to variable to store the number of lock bytes + * @param buf the databuffer to put/get data + * + * Lock OTP block area. + */ +static int do_otp_lock(struct mtd_info *mtd, loff_t from, size_t len, + size_t *retlen, u_char *buf) +{ + struct onenand_chip *this = mtd->priv; + int ret; + + /* Enter OTP access mode */ + this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0); + this->wait(mtd, FL_OTPING); + + ret = onenand_do_write_oob(mtd, from, len, retlen, buf); + + /* Exit OTP access mode */ + this->command(mtd, ONENAND_CMD_RESET, 0, 0); + this->wait(mtd, FL_RESETING); + + return ret; +} + +/** + * onenand_otp_walk - [DEFAULT] Handle OTP operation + * @param mtd MTD device structure + * @param from The offset to read/write + * @param len number of bytes to read/write + * @param retlen pointer to variable to store the number of read bytes + * @param buf the databuffer to put/get data + * @param action do given action + * @param mode specify user and factory + * + * Handle OTP operation. + */ +static int onenand_otp_walk(struct mtd_info *mtd, loff_t from, size_t len, + size_t *retlen, u_char *buf, + otp_op_t action, int mode) +{ + struct onenand_chip *this = mtd->priv; + int otp_pages; + int density; + int ret = 0; + + *retlen = 0; + + density = this->device_id >> ONENAND_DEVICE_DENSITY_SHIFT; + if (density < ONENAND_DEVICE_DENSITY_512Mb) + otp_pages = 20; + else + otp_pages = 10; + + if (mode == MTD_OTP_FACTORY) { + from += mtd->writesize * otp_pages; + otp_pages = 64 - otp_pages; + } + + /* Check User/Factory boundary */ + if (((mtd->writesize * otp_pages) - (from + len)) < 0) + return 0; + + while (len > 0 && otp_pages > 0) { + if (!action) { /* OTP Info functions */ + struct otp_info *otpinfo; + + len -= sizeof(struct otp_info); + if (len <= 0) + return -ENOSPC; + + otpinfo = (struct otp_info *) buf; + otpinfo->start = from; + otpinfo->length = mtd->writesize; + otpinfo->locked = 0; + + from += mtd->writesize; + buf += sizeof(struct otp_info); + *retlen += sizeof(struct otp_info); + } else { + size_t tmp_retlen; + int size = len; + + ret = action(mtd, from, len, &tmp_retlen, buf); + + buf += size; + len -= size; + *retlen += size; + + if (ret < 0) + return ret; + } + otp_pages--; + } + + return 0; +} + +/** + * onenand_get_fact_prot_info - [MTD Interface] Read factory OTP info + * @param mtd MTD device structure + * @param buf the databuffer to put/get data + * @param len number of bytes to read + * + * Read factory OTP info. + */ +static int onenand_get_fact_prot_info(struct mtd_info *mtd, + struct otp_info *buf, size_t len) +{ + size_t retlen; + int ret; + + ret = onenand_otp_walk(mtd, 0, len, &retlen, (u_char *) buf, NULL, MTD_OTP_FACTORY); + + return ret ? : retlen; +} + +/** + * onenand_read_fact_prot_reg - [MTD Interface] Read factory OTP area + * @param mtd MTD device structure + * @param from The offset to read + * @param len number of bytes to read + * @param retlen pointer to variable to store the number of read bytes + * @param buf the databuffer to put/get data + * + * Read factory OTP area. + */ +static int onenand_read_fact_prot_reg(struct mtd_info *mtd, loff_t from, + size_t len, size_t *retlen, u_char *buf) +{ + return onenand_otp_walk(mtd, from, len, retlen, buf, do_otp_read, MTD_OTP_FACTORY); +} + +/** + * onenand_get_user_prot_info - [MTD Interface] Read user OTP info + * @param mtd MTD device structure + * @param buf the databuffer to put/get data + * @param len number of bytes to read + * + * Read user OTP info. + */ +static int onenand_get_user_prot_info(struct mtd_info *mtd, + struct otp_info *buf, size_t len) +{ + size_t retlen; + int ret; + + ret = onenand_otp_walk(mtd, 0, len, &retlen, (u_char *) buf, NULL, MTD_OTP_USER); + + return ret ? : retlen; +} + +/** + * onenand_read_user_prot_reg - [MTD Interface] Read user OTP area + * @param mtd MTD device structure + * @param from The offset to read + * @param len number of bytes to read + * @param retlen pointer to variable to store the number of read bytes + * @param buf the databuffer to put/get data + * + * Read user OTP area. + */ +static int onenand_read_user_prot_reg(struct mtd_info *mtd, loff_t from, + size_t len, size_t *retlen, u_char *buf) +{ + return onenand_otp_walk(mtd, from, len, retlen, buf, do_otp_read, MTD_OTP_USER); +} + +/** + * onenand_write_user_prot_reg - [MTD Interface] Write user OTP area + * @param mtd MTD device structure + * @param from The offset to write + * @param len number of bytes to write + * @param retlen pointer to variable to store the number of write bytes + * @param buf the databuffer to put/get data + * + * Write user OTP area. + */ +static int onenand_write_user_prot_reg(struct mtd_info *mtd, loff_t from, + size_t len, size_t *retlen, u_char *buf) +{ + return onenand_otp_walk(mtd, from, len, retlen, buf, do_otp_write, MTD_OTP_USER); +} + +/** + * onenand_lock_user_prot_reg - [MTD Interface] Lock user OTP area + * @param mtd MTD device structure + * @param from The offset to lock + * @param len number of bytes to unlock + * + * Write lock mark on spare area in page 0 in OTP block + */ +static int onenand_lock_user_prot_reg(struct mtd_info *mtd, loff_t from, + size_t len) +{ + unsigned char oob_buf[64]; + size_t retlen; + int ret; + + memset(oob_buf, 0xff, mtd->oobsize); + /* + * Note: OTP lock operation + * OTP block : 0xXXFC + * 1st block : 0xXXF3 (If chip support) + * Both : 0xXXF0 (If chip support) + */ + oob_buf[ONENAND_OTP_LOCK_OFFSET] = 0xFC; + + /* + * Write lock mark to 8th word of sector0 of page0 of the spare0. + * We write 16 bytes spare area instead of 2 bytes. + */ + from = 0; + len = 16; + + ret = onenand_otp_walk(mtd, from, len, &retlen, oob_buf, do_otp_lock, MTD_OTP_USER); + + return ret ? : retlen; +} +#endif /* CONFIG_MTD_ONENAND_OTP */ + /** * onenand_print_device_info - Print device ID * @param device device ID @@ -1423,15 +1662,15 @@ static int onenand_probe(struct mtd_info *mtd) /* OneNAND page size & block size */ /* The data buffer size is equal to page size */ - mtd->oobblock = this->read_word(this->base + ONENAND_REG_DATA_BUFFER_SIZE); - mtd->oobsize = mtd->oobblock >> 5; + mtd->writesize = this->read_word(this->base + ONENAND_REG_DATA_BUFFER_SIZE); + mtd->oobsize = mtd->writesize >> 5; /* Pagers per block is always 64 in OneNAND */ - mtd->erasesize = mtd->oobblock << 6; + mtd->erasesize = mtd->writesize << 6; this->erase_shift = ffs(mtd->erasesize) - 1; - this->page_shift = ffs(mtd->oobblock) - 1; + this->page_shift = ffs(mtd->writesize) - 1; this->ppb_shift = (this->erase_shift - this->page_shift); - this->page_mask = (mtd->erasesize / mtd->oobblock) - 1; + this->page_mask = (mtd->erasesize / mtd->writesize) - 1; /* REVIST: Multichip handling */ @@ -1475,7 +1714,6 @@ static void onenand_resume(struct mtd_info *mtd) "in suspended state\n"); } - /** * onenand_scan - [OneNAND Interface] Scan for the OneNAND device * @param mtd MTD device structure @@ -1522,7 +1760,7 @@ int onenand_scan(struct mtd_info *mtd, int maxchips) /* Allocate buffers, if necessary */ if (!this->page_buf) { size_t len; - len = mtd->oobblock + mtd->oobsize; + len = mtd->writesize + mtd->oobsize; this->page_buf = kmalloc(len, GFP_KERNEL); if (!this->page_buf) { printk(KERN_ERR "onenand_scan(): Can't allocate page_buf\n"); @@ -1537,40 +1775,42 @@ int onenand_scan(struct mtd_info *mtd, int maxchips) switch (mtd->oobsize) { case 64: - this->autooob = &onenand_oob_64; + this->ecclayout = &onenand_oob_64; break; case 32: - this->autooob = &onenand_oob_32; + this->ecclayout = &onenand_oob_32; break; default: printk(KERN_WARNING "No OOB scheme defined for oobsize %d\n", mtd->oobsize); /* To prevent kernel oops */ - this->autooob = &onenand_oob_32; + this->ecclayout = &onenand_oob_32; break; } - memcpy(&mtd->oobinfo, this->autooob, sizeof(mtd->oobinfo)); + mtd->ecclayout = this->ecclayout; /* Fill in remaining MTD driver data */ mtd->type = MTD_NANDFLASH; - mtd->flags = MTD_CAP_NANDFLASH | MTD_ECC; + mtd->flags = MTD_CAP_NANDFLASH; mtd->ecctype = MTD_ECC_SW; mtd->erase = onenand_erase; mtd->point = NULL; mtd->unpoint = NULL; mtd->read = onenand_read; mtd->write = onenand_write; - mtd->read_ecc = onenand_read_ecc; - mtd->write_ecc = onenand_write_ecc; mtd->read_oob = onenand_read_oob; mtd->write_oob = onenand_write_oob; - mtd->readv = NULL; - mtd->readv_ecc = NULL; - mtd->writev = onenand_writev; - mtd->writev_ecc = onenand_writev_ecc; +#ifdef CONFIG_MTD_ONENAND_OTP + mtd->get_fact_prot_info = onenand_get_fact_prot_info; + mtd->read_fact_prot_reg = onenand_read_fact_prot_reg; + mtd->get_user_prot_info = onenand_get_user_prot_info; + mtd->read_user_prot_reg = onenand_read_user_prot_reg; + mtd->write_user_prot_reg = onenand_write_user_prot_reg; + mtd->lock_user_prot_reg = onenand_lock_user_prot_reg; +#endif mtd->sync = onenand_sync; mtd->lock = NULL; mtd->unlock = onenand_unlock; diff --git a/drivers/mtd/onenand/onenand_bbt.c b/drivers/mtd/onenand/onenand_bbt.c index 4510d3361..1b00dac3d 100644 --- a/drivers/mtd/onenand/onenand_bbt.c +++ b/drivers/mtd/onenand/onenand_bbt.c @@ -17,6 +17,9 @@ #include #include +extern int onenand_do_read_oob(struct mtd_info *mtd, loff_t from, size_t len, + size_t *retlen, u_char *buf); + /** * check_short_pattern - [GENERIC] check if a pattern is in the buffer * @param buf the buffer to search @@ -87,13 +90,13 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr /* No need to read pages fully, * just read required OOB bytes */ - ret = mtd->read_oob(mtd, from + j * mtd->oobblock + bd->offs, - readlen, &retlen, &buf[0]); + ret = onenand_do_read_oob(mtd, from + j * mtd->writesize + bd->offs, + readlen, &retlen, &buf[0]); if (ret) return ret; - if (check_short_pattern(&buf[j * scanlen], scanlen, mtd->oobblock, bd)) { + if (check_short_pattern(&buf[j * scanlen], scanlen, mtd->writesize, bd)) { bbm->bbt[i >> 3] |= 0x03 << (i & 0x6); printk(KERN_WARNING "Bad eraseblock %d at 0x%08x\n", i >> 1, (unsigned int) from); diff --git a/drivers/mtd/redboot.c b/drivers/mtd/redboot.c index c077d2ec9..5b58523e4 100644 --- a/drivers/mtd/redboot.c +++ b/drivers/mtd/redboot.c @@ -1,5 +1,5 @@ /* - * $Id: redboot.c,v 1.19 2005/12/01 10:03:51 dwmw2 Exp $ + * $Id: redboot.c,v 1.21 2006/03/30 18:34:37 bjd Exp $ * * Parse RedBoot-style Flash Image System (FIS) tables and * produce a Linux partition array to match. @@ -15,14 +15,14 @@ struct fis_image_desc { unsigned char name[16]; // Null terminated name - unsigned long flash_base; // Address within FLASH of image - unsigned long mem_base; // Address in memory where it executes - unsigned long size; // Length of image - unsigned long entry_point; // Execution entry point - unsigned long data_length; // Length of actual data - unsigned char _pad[256-(16+7*sizeof(unsigned long))]; - unsigned long desc_cksum; // Checksum over image descriptor - unsigned long file_cksum; // Checksum over image data + uint32_t flash_base; // Address within FLASH of image + uint32_t mem_base; // Address in memory where it executes + uint32_t size; // Length of image + uint32_t entry_point; // Execution entry point + uint32_t data_length; // Length of actual data + unsigned char _pad[256-(16+7*sizeof(uint32_t))]; + uint32_t desc_cksum; // Checksum over image descriptor + uint32_t file_cksum; // Checksum over image data }; struct fis_list { diff --git a/drivers/mtd/rfd_ftl.c b/drivers/mtd/rfd_ftl.c index a3e00a463..fa4362fb4 100644 --- a/drivers/mtd/rfd_ftl.c +++ b/drivers/mtd/rfd_ftl.c @@ -3,7 +3,7 @@ * * Copyright (C) 2005 Sean Young * - * $Id: rfd_ftl.c,v 1.5 2005/11/07 11:14:21 gleixner Exp $ + * $Id: rfd_ftl.c,v 1.8 2006/01/15 12:51:44 sean Exp $ * * This type of flash translation layer (FTL) is used by the Embedded BIOS * by General Software. It is known as the Resident Flash Disk (RFD), see: @@ -61,6 +61,7 @@ struct block { BLOCK_OK, BLOCK_ERASING, BLOCK_ERASED, + BLOCK_UNUSED, BLOCK_FAILED } state; int free_sectors; @@ -99,10 +100,8 @@ static int build_block_map(struct partition *part, int block_no) block->offset = part->block_size * block_no; if (le16_to_cpu(part->header_cache[0]) != RFD_MAGIC) { - block->state = BLOCK_ERASED; /* assumption */ - block->free_sectors = part->data_sectors_per_block; - part->reserved_block = block_no; - return 1; + block->state = BLOCK_UNUSED; + return -ENOENT; } block->state = BLOCK_OK; @@ -124,7 +123,7 @@ static int build_block_map(struct partition *part, int block_no) entry = 0; if (entry >= part->sector_count) { - printk(KERN_NOTICE PREFIX + printk(KERN_WARNING PREFIX "'%s': unit #%d: entry %d corrupt, " "sector %d out of range\n", part->mbd.mtd->name, block_no, i, entry); @@ -132,7 +131,7 @@ static int build_block_map(struct partition *part, int block_no) } if (part->sector_map[entry] != -1) { - printk(KERN_NOTICE PREFIX + printk(KERN_WARNING PREFIX "'%s': more than one entry for sector %d\n", part->mbd.mtd->name, entry); part->errors = 1; @@ -167,7 +166,7 @@ static int scan_header(struct partition *part) /* each erase block has three bytes header, followed by the map */ part->header_sectors_per_block = ((HEADER_MAP_OFFSET + sectors_per_block) * - sizeof(u16) + SECTOR_SIZE - 1) / SECTOR_SIZE; + sizeof(u16) + SECTOR_SIZE - 1) / SECTOR_SIZE; part->data_sectors_per_block = sectors_per_block - part->header_sectors_per_block; @@ -226,7 +225,7 @@ static int scan_header(struct partition *part) } if (part->reserved_block == -1) { - printk(KERN_NOTICE PREFIX "'%s': no empty erase unit found\n", + printk(KERN_WARNING PREFIX "'%s': no empty erase unit found\n", part->mbd.mtd->name); part->errors = 1; @@ -315,7 +314,7 @@ static void erase_callback(struct erase_info *erase) rc = -EIO; if (rc) { - printk(KERN_NOTICE PREFIX "'%s': unable to write RFD " + printk(KERN_ERR PREFIX "'%s': unable to write RFD " "header at 0x%lx\n", part->mbd.mtd->name, part->blocks[i].offset); @@ -348,7 +347,7 @@ static int erase_block(struct partition *part, int block) rc = part->mbd.mtd->erase(part->mbd.mtd, erase); if (rc) { - printk(KERN_WARNING PREFIX "erase of region %x,%x on '%s' " + printk(KERN_ERR PREFIX "erase of region %x,%x on '%s' " "failed\n", erase->addr, erase->len, part->mbd.mtd->name); kfree(erase); @@ -383,7 +382,7 @@ static int move_block_contents(struct partition *part, int block_no, u_long *old rc = -EIO; if (rc) { - printk(KERN_NOTICE PREFIX "error reading '%s' at " + printk(KERN_ERR PREFIX "error reading '%s' at " "0x%lx\n", part->mbd.mtd->name, part->blocks[block_no].offset); @@ -423,7 +422,7 @@ static int move_block_contents(struct partition *part, int block_no, u_long *old rc = -EIO; if (rc) { - printk(KERN_NOTICE PREFIX "'%s': Unable to " + printk(KERN_ERR PREFIX "'%s': Unable to " "read sector for relocation\n", part->mbd.mtd->name); @@ -520,7 +519,7 @@ static int reclaim_block(struct partition *part, u_long *old_sector) * because if we fill that one up first it'll have the most chance of having * the least live sectors at reclaim. */ -static int find_free_block(const struct partition *part) +static int find_free_block(struct partition *part) { int block, stop; @@ -533,6 +532,9 @@ static int find_free_block(const struct partition *part) block != part->reserved_block) return block; + if (part->blocks[block].state == BLOCK_UNUSED) + erase_block(part, block); + if (++block >= part->total_blocks) block = 0; @@ -541,7 +543,7 @@ static int find_free_block(const struct partition *part) return -1; } -static int find_writeable_block(struct partition *part, u_long *old_sector) +static int find_writable_block(struct partition *part, u_long *old_sector) { int rc, block; size_t retlen; @@ -570,7 +572,7 @@ static int find_writeable_block(struct partition *part, u_long *old_sector) rc = -EIO; if (rc) { - printk(KERN_NOTICE PREFIX "'%s': unable to read header at " + printk(KERN_ERR PREFIX "'%s': unable to read header at " "0x%lx\n", part->mbd.mtd->name, part->blocks[block].offset); goto err; @@ -602,7 +604,7 @@ static int mark_sector_deleted(struct partition *part, u_long old_addr) rc = -EIO; if (rc) { - printk(KERN_WARNING PREFIX "error writing '%s' at " + printk(KERN_ERR PREFIX "error writing '%s' at " "0x%lx\n", part->mbd.mtd->name, addr); if (rc) goto err; @@ -652,7 +654,7 @@ static int do_writesect(struct mtd_blktrans_dev *dev, u_long sector, char *buf, if (part->current_block == -1 || !part->blocks[part->current_block].free_sectors) { - rc = find_writeable_block(part, old_addr); + rc = find_writable_block(part, old_addr); if (rc) goto err; } @@ -675,7 +677,7 @@ static int do_writesect(struct mtd_blktrans_dev *dev, u_long sector, char *buf, rc = -EIO; if (rc) { - printk(KERN_WARNING PREFIX "error writing '%s' at 0x%lx\n", + printk(KERN_ERR PREFIX "error writing '%s' at 0x%lx\n", part->mbd.mtd->name, addr); if (rc) goto err; @@ -695,7 +697,7 @@ static int do_writesect(struct mtd_blktrans_dev *dev, u_long sector, char *buf, rc = -EIO; if (rc) { - printk(KERN_WARNING PREFIX "error writing '%s' at 0x%lx\n", + printk(KERN_ERR PREFIX "error writing '%s' at 0x%lx\n", part->mbd.mtd->name, addr); if (rc) goto err; @@ -776,7 +778,7 @@ static void rfd_ftl_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd) part->block_size = block_size; else { if (!mtd->erasesize) { - printk(KERN_NOTICE PREFIX "please provide block_size"); + printk(KERN_WARNING PREFIX "please provide block_size"); return; } else @@ -791,8 +793,8 @@ static void rfd_ftl_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd) if (!(mtd->flags & MTD_WRITEABLE)) part->mbd.readonly = 1; else if (part->errors) { - printk(KERN_NOTICE PREFIX "'%s': errors found, " - "setting read-only", mtd->name); + printk(KERN_WARNING PREFIX "'%s': errors found, " + "setting read-only\n", mtd->name); part->mbd.readonly = 1; } diff --git a/drivers/net/3c501.c b/drivers/net/3c501.c index f6d51ce34..d7b115a35 100644 --- a/drivers/net/3c501.c +++ b/drivers/net/3c501.c @@ -120,7 +120,6 @@ static const char version[] = #include #include #include -#include /* for CONFIG_IP_MULTICAST */ #include #include #include @@ -508,11 +507,11 @@ static int el_start_xmit(struct sk_buff *skb, struct net_device *dev) * speak of. We simply pull the packet out of its PIO buffer (which is slow) * and queue it for the kernel. Then we reset the card for the next packet. * - * We sometimes get suprise interrupts late both because the SMP IRQ delivery + * We sometimes get surprise interrupts late both because the SMP IRQ delivery * is message passing and because the card sometimes seems to deliver late. I * think if it is part way through a receive and the mode is changed it carries * on receiving and sends us an interrupt. We have to band aid all these cases - * to get a sensible 150kbytes/second performance. Even then you want a small + * to get a sensible 150kBytes/second performance. Even then you want a small * TCP window. */ @@ -909,7 +908,7 @@ MODULE_PARM_DESC(irq, "EtherLink IRQ number"); * here also causes the module to be unloaded */ -int init_module(void) +int __init init_module(void) { dev_3c501 = el1_probe(-1); if (IS_ERR(dev_3c501)) diff --git a/drivers/net/3c503.c b/drivers/net/3c503.c index dcc98afa6..cb5ef7545 100644 --- a/drivers/net/3c503.c +++ b/drivers/net/3c503.c @@ -688,7 +688,7 @@ MODULE_LICENSE("GPL"); /* This is set up so that only a single autoprobe takes place per call. ISA device autoprobes on a running machine are not recommended. */ -int +int __init init_module(void) { struct net_device *dev; diff --git a/drivers/net/3c505.c b/drivers/net/3c505.c index 111601ca4..19c0b856c 100644 --- a/drivers/net/3c505.c +++ b/drivers/net/3c505.c @@ -1633,7 +1633,7 @@ MODULE_PARM_DESC(io, "EtherLink Plus I/O base address(es)"); MODULE_PARM_DESC(irq, "EtherLink Plus IRQ number(s) (assigned)"); MODULE_PARM_DESC(dma, "EtherLink Plus DMA channel(s)"); -int init_module(void) +int __init init_module(void) { int this_dev, found = 0; diff --git a/drivers/net/3c507.c b/drivers/net/3c507.c index 4db828939..603904925 100644 --- a/drivers/net/3c507.c +++ b/drivers/net/3c507.c @@ -932,7 +932,7 @@ module_param(irq, int, 0); MODULE_PARM_DESC(io, "EtherLink16 I/O base address"); MODULE_PARM_DESC(irq, "(ignored)"); -int init_module(void) +int __init init_module(void) { if (io == 0) printk("3c507: You should not use auto-probing with insmod!\n"); diff --git a/drivers/net/3c509.c b/drivers/net/3c509.c index dc845f36f..cbdae54f7 100644 --- a/drivers/net/3c509.c +++ b/drivers/net/3c509.c @@ -68,7 +68,6 @@ /* Maximum events (Rx packets, etc.) to handle at each interrupt. */ static int max_interrupt_work = 10; -#include #include #ifdef CONFIG_MCA #include diff --git a/drivers/net/3c515.c b/drivers/net/3c515.c index 91d1c4c24..aedfddf20 100644 --- a/drivers/net/3c515.c +++ b/drivers/net/3c515.c @@ -57,7 +57,6 @@ static int max_interrupt_work = 20; #define RX_RING_SIZE 16 #define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer. */ -#include #include #include #include @@ -761,7 +760,7 @@ static int corkscrew_open(struct net_device *dev) vp->product_name, dev)) return -EAGAIN; enable_dma(dev->dma); set_dma_mode(dev->dma, DMA_MODE_CASCADE); - } else if (request_irq(dev->irq, &corkscrew_interrupt, SA_SHIRQ, + } else if (request_irq(dev->irq, &corkscrew_interrupt, IRQF_SHARED, vp->product_name, dev)) { return -EAGAIN; } @@ -1004,7 +1003,8 @@ static int corkscrew_start_xmit(struct sk_buff *skb, /* Calculate the next Tx descriptor entry. */ int entry = vp->cur_tx % TX_RING_SIZE; struct boom_tx_desc *prev_entry; - unsigned long flags, i; + unsigned long flags; + int i; if (vp->tx_full) /* No room to transmit with */ return 1; diff --git a/drivers/net/3c523.c b/drivers/net/3c523.c index b40885d41..5dfd97f0b 100644 --- a/drivers/net/3c523.c +++ b/drivers/net/3c523.c @@ -289,7 +289,7 @@ static int elmc_open(struct net_device *dev) elmc_id_attn586(); /* disable interrupts */ - ret = request_irq(dev->irq, &elmc_interrupt, SA_SHIRQ | SA_SAMPLE_RANDOM, + ret = request_irq(dev->irq, &elmc_interrupt, IRQF_SHARED | IRQF_SAMPLE_RANDOM, dev->name, dev); if (ret) { printk(KERN_ERR "%s: couldn't get irq %d\n", dev->name, dev->irq); @@ -1277,7 +1277,7 @@ MODULE_PARM_DESC(io, "EtherLink/MC I/O base address(es)"); MODULE_PARM_DESC(irq, "EtherLink/MC IRQ number(s)"); MODULE_LICENSE("GPL"); -int init_module(void) +int __init init_module(void) { int this_dev,found = 0; diff --git a/drivers/net/3c527.c b/drivers/net/3c527.c index 6db3301e7..03c0f7176 100644 --- a/drivers/net/3c527.c +++ b/drivers/net/3c527.c @@ -435,7 +435,7 @@ static int __init mc32_probe1(struct net_device *dev, int slot) * Grab the IRQ */ - err = request_irq(dev->irq, &mc32_interrupt, SA_SHIRQ | SA_SAMPLE_RANDOM, DRV_NAME, dev); + err = request_irq(dev->irq, &mc32_interrupt, IRQF_SHARED | IRQF_SAMPLE_RANDOM, DRV_NAME, dev); if (err) { release_region(dev->base_addr, MC32_IO_EXTENT); printk(KERN_ERR "%s: unable to get IRQ %d.\n", DRV_NAME, dev->irq); @@ -1031,8 +1031,7 @@ static int mc32_send_packet(struct sk_buff *skb, struct net_device *dev) return 1; } - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) { + if (skb_padto(skb, ETH_ZLEN)) { netif_wake_queue(dev); return 0; } @@ -1646,7 +1645,7 @@ static struct net_device *this_device; * insmod multiple modules for now but it's a hack. */ -int init_module(void) +int __init init_module(void) { this_device = mc32_probe(-1); if (IS_ERR(this_device)) diff --git a/drivers/net/3c59x.c b/drivers/net/3c59x.c index 274b0138d..80e8ca013 100644 --- a/drivers/net/3c59x.c +++ b/drivers/net/3c59x.c @@ -17,172 +17,6 @@ 410 Severn Ave., Suite 210 Annapolis MD 21403 - Linux Kernel Additions: - - 0.99H+lk0.9 - David S. Miller - softnet, PCI DMA updates - 0.99H+lk1.0 - Jeff Garzik - Remove compatibility defines for kernel versions < 2.2.x. - Update for new 2.3.x module interface - LK1.1.2 (March 19, 2000) - * New PCI interface (jgarzik) - - LK1.1.3 25 April 2000, Andrew Morton - - Merged with 3c575_cb.c - - Don't set RxComplete in boomerang interrupt enable reg - - spinlock in vortex_timer to protect mdio functions - - disable local interrupts around call to vortex_interrupt in - vortex_tx_timeout() (So vortex_interrupt can use spin_lock()) - - Select window 3 in vortex_timer()'s write to Wn3_MAC_Ctrl - - In vortex_start_xmit(), move the lock to _after_ we've altered - vp->cur_tx and vp->tx_full. This defeats the race between - vortex_start_xmit() and vortex_interrupt which was identified - by Bogdan Costescu. - - Merged back support for six new cards from various sources - - Set vortex_have_pci if pci_module_init returns zero (fixes cardbus - insertion oops) - - Tell it that 3c905C has NWAY for 100bT autoneg - - Fix handling of SetStatusEnd in 'Too much work..' code, as - per 2.3.99's 3c575_cb (Dave Hinds). - - Split ISR into two for vortex & boomerang - - Fix MOD_INC/DEC races - - Handle resource allocation failures. - - Fix 3CCFE575CT LED polarity - - Make tx_interrupt_mitigation the default - - LK1.1.4 25 April 2000, Andrew Morton - - Add extra TxReset to vortex_up() to fix 575_cb hotplug initialisation probs. - - Put vortex_info_tbl into __devinitdata - - In the vortex_error StatsFull HACK, disable stats in vp->intr_enable as well - as in the hardware. - - Increased the loop counter in issue_and_wait from 2,000 to 4,000. - - LK1.1.5 28 April 2000, andrewm - - Added powerpc defines (John Daniel said these work...) - - Some extra diagnostics - - In vortex_error(), reset the Tx on maxCollisions. Otherwise most - chips usually get a Tx timeout. - - Added extra_reset module parm - - Replaced some inline timer manip with mod_timer - (Franois romieu ) - - In vortex_up(), don't make Wn3_config initialisation dependent upon has_nway - (this came across from 3c575_cb). - - LK1.1.6 06 Jun 2000, andrewm - - Backed out the PPC defines. - - Use del_timer_sync(), mod_timer(). - - Fix wrapped ulong comparison in boomerang_rx() - - Add IS_TORNADO, use it to suppress 3c905C checksum error msg - (Donald Becker, I Lee Hetherington ) - - Replace union wn3_config with BFINS/BFEXT manipulation for - sparc64 (Pete Zaitcev, Peter Jones) - - In vortex_error, do_tx_reset and vortex_tx_timeout(Vortex): - do a netif_wake_queue() to better recover from errors. (Anders Pedersen, - Donald Becker) - - Print a warning on out-of-memory (rate limited to 1 per 10 secs) - - Added two more Cardbus 575 NICs: 5b57 and 6564 (Paul Wagland) - - LK1.1.7 2 Jul 2000 andrewm - - Better handling of shared IRQs - - Reset the transmitter on a Tx reclaim error - - Fixed crash under OOM during vortex_open() (Mark Hemment) - - Fix Rx cessation problem during OOM (help from Mark Hemment) - - The spinlocks around the mdio access were blocking interrupts for 300uS. - Fix all this to use spin_lock_bh() within mdio_read/write - - Only write to TxFreeThreshold if it's a boomerang - other NICs don't - have one. - - Added 802.3x MAC-layer flow control support - - LK1.1.8 13 Aug 2000 andrewm - - Ignore request_region() return value - already reserved if Cardbus. - - Merged some additional Cardbus flags from Don's 0.99Qk - - Some fixes for 3c556 (Fred Maciel) - - Fix for EISA initialisation (Jan Rekorajski) - - Renamed MII_XCVR_PWR and EEPROM_230 to align with 3c575_cb and D. Becker's drivers - - Fixed MII_XCVR_PWR for 3CCFE575CT - - Added INVERT_LED_PWR, used it. - - Backed out the extra_reset stuff - - LK1.1.9 12 Sep 2000 andrewm - - Backed out the tx_reset_resume flags. It was a no-op. - - In vortex_error, don't reset the Tx on txReclaim errors - - In vortex_error, don't reset the Tx on maxCollisions errors. - Hence backed out all the DownListPtr logic here. - - In vortex_error, give Tornado cards a partial TxReset on - maxCollisions (David Hinds). Defined MAX_COLLISION_RESET for this. - - Redid some driver flags and device names based on pcmcia_cs-3.1.20. - - Fixed a bug where, if vp->tx_full is set when the interface - is downed, it remains set when the interface is upped. Bad - things happen. - - LK1.1.10 17 Sep 2000 andrewm - - Added EEPROM_8BIT for 3c555 (Fred Maciel) - - Added experimental support for the 3c556B Laptop Hurricane (Louis Gerbarg) - - Add HAS_NWAY to "3c900 Cyclone 10Mbps TPO" - - LK1.1.11 13 Nov 2000 andrewm - - Dump MOD_INC/DEC_USE_COUNT, use SET_MODULE_OWNER - - LK1.1.12 1 Jan 2001 andrewm (2.4.0-pre1) - - Call pci_enable_device before we request our IRQ (Tobias Ringstrom) - - Add 3c590 PCI latency timer hack to vortex_probe1 (from 0.99Ra) - - Added extended issue_and_wait for the 3c905CX. - - Look for an MII on PHY index 24 first (3c905CX oddity). - - Add HAS_NWAY to 3cSOHO100-TX (Brett Frankenberger) - - Don't free skbs we don't own on oom path in vortex_open(). - - LK1.1.13 27 Jan 2001 - - Added explicit `medialock' flag so we can truly - lock the media type down with `options'. - - "check ioremap return and some tidbits" (Arnaldo Carvalho de Melo ) - - Added and used EEPROM_NORESET for 3c556B PM resumes. - - Fixed leakage of vp->rx_ring. - - Break out separate HAS_HWCKSM device capability flag. - - Kill vp->tx_full (ANK) - - Merge zerocopy fragment handling (ANK?) - - LK1.1.14 15 Feb 2001 - - Enable WOL. Can be turned on with `enable_wol' module option. - - EISA and PCI initialisation fixes (jgarzik, Manfred Spraul) - - If a device's internalconfig register reports it has NWAY, - use it, even if autoselect is enabled. - - LK1.1.15 6 June 2001 akpm - - Prevent double counting of received bytes (Lars Christensen) - - Add ethtool support (jgarzik) - - Add module parm descriptions (Andrzej M. Krzysztofowicz) - - Implemented alloc_etherdev() API - - Special-case the 'Tx error 82' message. - - LK1.1.16 18 July 2001 akpm - - Make NETIF_F_SG dependent upon nr_free_highpages(), not on CONFIG_HIGHMEM - - Lessen verbosity of bootup messages - - Fix WOL - use new PM API functions. - - Use netif_running() instead of vp->open in suspend/resume. - - Don't reset the interface logic on open/close/rmmod. It upsets - autonegotiation, and hence DHCP (from 0.99T). - - Back out EEPROM_NORESET flag because of the above (we do it for all - NICs). - - Correct 3c982 identification string - - Rename wait_for_completion() to issue_and_wait() to avoid completion.h - clash. - - LK1.1.17 18Dec01 akpm - - PCI ID 9805 is a Python-T, not a dual-port Cyclone. Apparently. - And it has NWAY. - - Mask our advertised modes (vp->advertising) with our capabilities - (MII reg5) when deciding which duplex mode to use. - - Add `global_options' as default for options[]. Ditto global_enable_wol, - global_full_duplex. - - LK1.1.18 01Jul02 akpm - - Fix for undocumented transceiver power-up bit on some 3c566B's - (Donald Becker, Rahul Karnik) - - - See http://www.zip.com.au/~akpm/linux/#3c59x-2.3 for more details. - - Also see Documentation/networking/vortex.txt - - LK1.1.19 10Nov02 Marc Zyngier - - EISA sysfs integration. */ /* @@ -236,7 +70,6 @@ static int vortex_debug = VORTEX_DEBUG; static int vortex_debug = 1; #endif -#include #include #include #include @@ -375,8 +208,7 @@ limit of 4K. of the drivers, and will likely be provided by some future kernel. */ enum pci_flags_bit { - PCI_USES_IO=1, PCI_USES_MEM=2, PCI_USES_MASTER=4, - PCI_ADDR0=0x10<<0, PCI_ADDR1=0x10<<1, PCI_ADDR2=0x10<<2, PCI_ADDR3=0x10<<3, + PCI_USES_MASTER=4, }; enum { IS_VORTEX=1, IS_BOOMERANG=2, IS_CYCLONE=4, IS_TORNADO=8, @@ -446,95 +278,95 @@ static struct vortex_chip_info { int io_size; } vortex_info_tbl[] __devinitdata = { {"3c590 Vortex 10Mbps", - PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, }, + PCI_USES_MASTER, IS_VORTEX, 32, }, {"3c592 EISA 10Mbps Demon/Vortex", /* AKPM: from Don's 3c59x_cb.c 0.49H */ - PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, }, + PCI_USES_MASTER, IS_VORTEX, 32, }, {"3c597 EISA Fast Demon/Vortex", /* AKPM: from Don's 3c59x_cb.c 0.49H */ - PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, }, + PCI_USES_MASTER, IS_VORTEX, 32, }, {"3c595 Vortex 100baseTx", - PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, }, + PCI_USES_MASTER, IS_VORTEX, 32, }, {"3c595 Vortex 100baseT4", - PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, }, + PCI_USES_MASTER, IS_VORTEX, 32, }, {"3c595 Vortex 100base-MII", - PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, }, + PCI_USES_MASTER, IS_VORTEX, 32, }, {"3c900 Boomerang 10baseT", - PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|EEPROM_RESET, 64, }, + PCI_USES_MASTER, IS_BOOMERANG|EEPROM_RESET, 64, }, {"3c900 Boomerang 10Mbps Combo", - PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|EEPROM_RESET, 64, }, + PCI_USES_MASTER, IS_BOOMERANG|EEPROM_RESET, 64, }, {"3c900 Cyclone 10Mbps TPO", /* AKPM: from Don's 0.99M */ - PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, + PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, {"3c900 Cyclone 10Mbps Combo", - PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, + PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, {"3c900 Cyclone 10Mbps TPC", /* AKPM: from Don's 0.99M */ - PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, + PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, {"3c900B-FL Cyclone 10base-FL", - PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, + PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, {"3c905 Boomerang 100baseTx", - PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_RESET, 64, }, + PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_RESET, 64, }, {"3c905 Boomerang 100baseT4", - PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_RESET, 64, }, + PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_RESET, 64, }, {"3c905B Cyclone 100baseTx", - PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM|EXTRA_PREAMBLE, 128, }, + PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM|EXTRA_PREAMBLE, 128, }, {"3c905B Cyclone 10/100/BNC", - PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM, 128, }, + PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM, 128, }, {"3c905B-FX Cyclone 100baseFx", - PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, + PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, {"3c905C Tornado", - PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_HWCKSM|EXTRA_PREAMBLE, 128, }, + PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_HWCKSM|EXTRA_PREAMBLE, 128, }, {"3c920B-EMB-WNM (ATI Radeon 9100 IGP)", - PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_MII|HAS_HWCKSM, 128, }, + PCI_USES_MASTER, IS_TORNADO|HAS_MII|HAS_HWCKSM, 128, }, {"3c980 Cyclone", - PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, + PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, {"3c980C Python-T", - PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM, 128, }, + PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM, 128, }, {"3cSOHO100-TX Hurricane", - PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM, 128, }, + PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM, 128, }, {"3c555 Laptop Hurricane", - PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|EEPROM_8BIT|HAS_HWCKSM, 128, }, + PCI_USES_MASTER, IS_CYCLONE|EEPROM_8BIT|HAS_HWCKSM, 128, }, {"3c556 Laptop Tornado", - PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|EEPROM_8BIT|HAS_CB_FNS|INVERT_MII_PWR| + PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|EEPROM_8BIT|HAS_CB_FNS|INVERT_MII_PWR| HAS_HWCKSM, 128, }, {"3c556B Laptop Hurricane", - PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|EEPROM_OFFSET|HAS_CB_FNS|INVERT_MII_PWR| + PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|EEPROM_OFFSET|HAS_CB_FNS|INVERT_MII_PWR| WNO_XCVR_PWR|HAS_HWCKSM, 128, }, {"3c575 [Megahertz] 10/100 LAN CardBus", - PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_8BIT, 128, }, + PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_8BIT, 128, }, {"3c575 Boomerang CardBus", - PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_8BIT, 128, }, + PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_8BIT, 128, }, {"3CCFE575BT Cyclone CardBus", - PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_CB_FNS|EEPROM_8BIT| + PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_CB_FNS|EEPROM_8BIT| INVERT_LED_PWR|HAS_HWCKSM, 128, }, {"3CCFE575CT Tornado CardBus", - PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_CB_FNS|EEPROM_8BIT|INVERT_MII_PWR| + PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_CB_FNS|EEPROM_8BIT|INVERT_MII_PWR| MAX_COLLISION_RESET|HAS_HWCKSM, 128, }, {"3CCFE656 Cyclone CardBus", - PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_CB_FNS|EEPROM_8BIT|INVERT_MII_PWR| + PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_CB_FNS|EEPROM_8BIT|INVERT_MII_PWR| INVERT_LED_PWR|HAS_HWCKSM, 128, }, {"3CCFEM656B Cyclone+Winmodem CardBus", - PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_CB_FNS|EEPROM_8BIT|INVERT_MII_PWR| + PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_CB_FNS|EEPROM_8BIT|INVERT_MII_PWR| INVERT_LED_PWR|HAS_HWCKSM, 128, }, {"3CXFEM656C Tornado+Winmodem CardBus", /* From pcmcia-cs-3.1.5 */ - PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_CB_FNS|EEPROM_8BIT|INVERT_MII_PWR| + PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_CB_FNS|EEPROM_8BIT|INVERT_MII_PWR| MAX_COLLISION_RESET|HAS_HWCKSM, 128, }, {"3c450 HomePNA Tornado", /* AKPM: from Don's 0.99Q */ - PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_HWCKSM, 128, }, + PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_HWCKSM, 128, }, {"3c920 Tornado", - PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_HWCKSM, 128, }, + PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_HWCKSM, 128, }, {"3c982 Hydra Dual Port A", - PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_HWCKSM|HAS_NWAY, 128, }, + PCI_USES_MASTER, IS_TORNADO|HAS_HWCKSM|HAS_NWAY, 128, }, {"3c982 Hydra Dual Port B", - PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_HWCKSM|HAS_NWAY, 128, }, + PCI_USES_MASTER, IS_TORNADO|HAS_HWCKSM|HAS_NWAY, 128, }, {"3c905B-T4", - PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM|EXTRA_PREAMBLE, 128, }, + PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM|EXTRA_PREAMBLE, 128, }, {"3c920B-EMB-WNM Tornado", - PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_HWCKSM, 128, }, + PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_HWCKSM, 128, }, {NULL,}, /* NULL terminated list. */ }; @@ -998,7 +830,7 @@ static int vortex_resume(struct pci_dev *pdev) pci_enable_device(pdev); pci_set_master(pdev); if (request_irq(dev->irq, vp->full_bus_master_rx ? - &boomerang_interrupt : &vortex_interrupt, SA_SHIRQ, dev->name, dev)) { + &boomerang_interrupt : &vortex_interrupt, IRQF_SHARED, dev->name, dev)) { printk(KERN_WARNING "%s: Could not reserve IRQ %d\n", dev->name, dev->irq); pci_disable_device(pdev); return -EBUSY; @@ -1382,17 +1214,12 @@ static int __devinit vortex_probe1(struct device *gendev, for (i = 0; i < 6; i++) iowrite8(dev->dev_addr[i], ioaddr + i); -#ifdef __sparc__ - if (print_info) - printk(", IRQ %s\n", __irq_itoa(dev->irq)); -#else if (print_info) printk(", IRQ %d\n", dev->irq); /* Tell them about an invalid IRQ. */ if (dev->irq <= 0 || dev->irq >= NR_IRQS) printk(KERN_WARNING " *** Warning: IRQ %d is unlikely to work! ***\n", dev->irq); -#endif EL3WINDOW(4); step = (ioread8(ioaddr + Wn4_NetDiag) & 0x1e) >> 1; @@ -1413,8 +1240,10 @@ static int __devinit vortex_probe1(struct device *gendev, } if (print_info) { - printk(KERN_INFO "%s: CardBus functions mapped %8.8lx->%p\n", - print_name, pci_resource_start(pdev, 2), + printk(KERN_INFO "%s: CardBus functions mapped " + "%16.16llx->%p\n", + print_name, + (unsigned long long)pci_resource_start(pdev, 2), vp->cb_fn_base); } EL3WINDOW(2); @@ -1838,7 +1667,7 @@ vortex_open(struct net_device *dev) /* Use the now-standard shared IRQ implementation. */ if ((retval = request_irq(dev->irq, vp->full_bus_master_rx ? - &boomerang_interrupt : &vortex_interrupt, SA_SHIRQ, dev->name, dev))) { + &boomerang_interrupt : &vortex_interrupt, IRQF_SHARED, dev->name, dev))) { printk(KERN_ERR "%s: Could not reserve IRQ %d\n", dev->name, dev->irq); goto out; } @@ -1902,7 +1731,7 @@ vortex_timer(unsigned long data) printk(KERN_DEBUG "dev->watchdog_timeo=%d\n", dev->watchdog_timeo); } - disable_irq(dev->irq); + disable_irq_lockdep(dev->irq); old_window = ioread16(ioaddr + EL3_CMD) >> 13; EL3WINDOW(4); media_status = ioread16(ioaddr + Wn4_Media); @@ -1983,7 +1812,7 @@ leave_media_alone: dev->name, media_tbl[dev->if_port].name); EL3WINDOW(old_window); - enable_irq(dev->irq); + enable_irq_lockdep(dev->irq); mod_timer(&vp->timer, RUN_AT(next_tick)); if (vp->deferred) iowrite16(FakeIntr, ioaddr + EL3_CMD); diff --git a/drivers/net/8139cp.c b/drivers/net/8139cp.c index 365a07494..1428bb771 100644 --- a/drivers/net/8139cp.c +++ b/drivers/net/8139cp.c @@ -19,11 +19,11 @@ See the file COPYING in this distribution for more information. Contributors: - + Wake-on-LAN support - Felipe Damasio PCI suspend/resume - Felipe Damasio LinkChg interrupt - Felipe Damasio - + TODO: * Test Tx checksumming thoroughly * Implement dev->tx_timeout @@ -52,7 +52,6 @@ #define DRV_RELDATE "Mar 22, 2004" -#include #include #include #include @@ -401,6 +400,11 @@ static void cp_clean_rings (struct cp_private *cp); #ifdef CONFIG_NET_POLL_CONTROLLER static void cp_poll_controller(struct net_device *dev); #endif +static int cp_get_eeprom_len(struct net_device *dev); +static int cp_get_eeprom(struct net_device *dev, + struct ethtool_eeprom *eeprom, u8 *data); +static int cp_set_eeprom(struct net_device *dev, + struct ethtool_eeprom *eeprom, u8 *data); static struct pci_device_id cp_pci_tbl[] = { { PCI_VENDOR_ID_REALTEK, PCI_DEVICE_ID_REALTEK_8139, @@ -461,7 +465,7 @@ static void cp_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) static inline void cp_set_rxbufsize (struct cp_private *cp) { unsigned int mtu = cp->dev->mtu; - + if (mtu > ETH_DATA_LEN) /* MTU + ethernet header + FCS + optional VLAN tag */ cp->rx_buf_sz = mtu + ETH_HLEN + 8; @@ -510,7 +514,7 @@ static void cp_rx_err_acct (struct cp_private *cp, unsigned rx_tail, static inline unsigned int cp_rx_csum_ok (u32 status) { unsigned int protocol = (status >> 16) & 0x3; - + if (likely((protocol == RxProtoTCP) && (!(status & TCPFail)))) return 1; else if ((protocol == RxProtoUDP) && (!(status & UDPFail))) @@ -1061,7 +1065,7 @@ static void cp_init_hw (struct cp_private *cp) cpw8(Config3, PARMEnable); cp->wol_enabled = 0; - cpw8(Config5, cpr8(Config5) & PMEStatus); + cpw8(Config5, cpr8(Config5) & PMEStatus); cpw32_f(HiTxRingAddr, 0); cpw32_f(HiTxRingAddr + 4, 0); @@ -1199,7 +1203,7 @@ static int cp_open (struct net_device *dev) cp_init_hw(cp); - rc = request_irq(dev->irq, cp_interrupt, SA_SHIRQ, dev->name, dev); + rc = request_irq(dev->irq, cp_interrupt, IRQF_SHARED, dev->name, dev); if (rc) goto err_out_hw; @@ -1351,7 +1355,7 @@ static void netdev_get_wol (struct cp_private *cp, WAKE_MCAST | WAKE_UCAST; /* We don't need to go on if WOL is disabled */ if (!cp->wol_enabled) return; - + options = cpr8 (Config3); if (options & LinkUp) wol->wolopts |= WAKE_PHY; if (options & MagicPacket) wol->wolopts |= WAKE_MAGIC; @@ -1577,6 +1581,9 @@ static struct ethtool_ops cp_ethtool_ops = { .get_strings = cp_get_strings, .get_ethtool_stats = cp_get_ethtool_stats, .get_perm_addr = ethtool_op_get_perm_addr, + .get_eeprom_len = cp_get_eeprom_len, + .get_eeprom = cp_get_eeprom, + .set_eeprom = cp_set_eeprom, }; static int cp_ioctl (struct net_device *dev, struct ifreq *rq, int cmd) @@ -1612,24 +1619,32 @@ static int cp_ioctl (struct net_device *dev, struct ifreq *rq, int cmd) #define eeprom_delay() readl(ee_addr) /* The EEPROM commands include the alway-set leading bit. */ +#define EE_EXTEND_CMD (4) #define EE_WRITE_CMD (5) #define EE_READ_CMD (6) #define EE_ERASE_CMD (7) -static int read_eeprom (void __iomem *ioaddr, int location, int addr_len) -{ - int i; - unsigned retval = 0; - void __iomem *ee_addr = ioaddr + Cfg9346; - int read_cmd = location | (EE_READ_CMD << addr_len); +#define EE_EWDS_ADDR (0) +#define EE_WRAL_ADDR (1) +#define EE_ERAL_ADDR (2) +#define EE_EWEN_ADDR (3) +#define CP_EEPROM_MAGIC PCI_DEVICE_ID_REALTEK_8139 + +static void eeprom_cmd_start(void __iomem *ee_addr) +{ writeb (EE_ENB & ~EE_CS, ee_addr); writeb (EE_ENB, ee_addr); eeprom_delay (); +} + +static void eeprom_cmd(void __iomem *ee_addr, int cmd, int cmd_len) +{ + int i; - /* Shift the read command bits out. */ - for (i = 4 + addr_len; i >= 0; i--) { - int dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0; + /* Shift the command bits out. */ + for (i = cmd_len - 1; i >= 0; i--) { + int dataval = (cmd & (1 << i)) ? EE_DATA_WRITE : 0; writeb (EE_ENB | dataval, ee_addr); eeprom_delay (); writeb (EE_ENB | dataval | EE_SHIFT_CLK, ee_addr); @@ -1637,6 +1652,33 @@ static int read_eeprom (void __iomem *ioaddr, int location, int addr_len) } writeb (EE_ENB, ee_addr); eeprom_delay (); +} + +static void eeprom_cmd_end(void __iomem *ee_addr) +{ + writeb (~EE_CS, ee_addr); + eeprom_delay (); +} + +static void eeprom_extend_cmd(void __iomem *ee_addr, int extend_cmd, + int addr_len) +{ + int cmd = (EE_EXTEND_CMD << addr_len) | (extend_cmd << (addr_len - 2)); + + eeprom_cmd_start(ee_addr); + eeprom_cmd(ee_addr, cmd, 3 + addr_len); + eeprom_cmd_end(ee_addr); +} + +static u16 read_eeprom (void __iomem *ioaddr, int location, int addr_len) +{ + int i; + u16 retval = 0; + void __iomem *ee_addr = ioaddr + Cfg9346; + int read_cmd = location | (EE_READ_CMD << addr_len); + + eeprom_cmd_start(ee_addr); + eeprom_cmd(ee_addr, read_cmd, 3 + addr_len); for (i = 16; i > 0; i--) { writeb (EE_ENB | EE_SHIFT_CLK, ee_addr); @@ -1648,13 +1690,125 @@ static int read_eeprom (void __iomem *ioaddr, int location, int addr_len) eeprom_delay (); } - /* Terminate the EEPROM access. */ - writeb (~EE_CS, ee_addr); - eeprom_delay (); + eeprom_cmd_end(ee_addr); return retval; } +static void write_eeprom(void __iomem *ioaddr, int location, u16 val, + int addr_len) +{ + int i; + void __iomem *ee_addr = ioaddr + Cfg9346; + int write_cmd = location | (EE_WRITE_CMD << addr_len); + + eeprom_extend_cmd(ee_addr, EE_EWEN_ADDR, addr_len); + + eeprom_cmd_start(ee_addr); + eeprom_cmd(ee_addr, write_cmd, 3 + addr_len); + eeprom_cmd(ee_addr, val, 16); + eeprom_cmd_end(ee_addr); + + eeprom_cmd_start(ee_addr); + for (i = 0; i < 20000; i++) + if (readb(ee_addr) & EE_DATA_READ) + break; + eeprom_cmd_end(ee_addr); + + eeprom_extend_cmd(ee_addr, EE_EWDS_ADDR, addr_len); +} + +static int cp_get_eeprom_len(struct net_device *dev) +{ + struct cp_private *cp = netdev_priv(dev); + int size; + + spin_lock_irq(&cp->lock); + size = read_eeprom(cp->regs, 0, 8) == 0x8129 ? 256 : 128; + spin_unlock_irq(&cp->lock); + + return size; +} + +static int cp_get_eeprom(struct net_device *dev, + struct ethtool_eeprom *eeprom, u8 *data) +{ + struct cp_private *cp = netdev_priv(dev); + unsigned int addr_len; + u16 val; + u32 offset = eeprom->offset >> 1; + u32 len = eeprom->len; + u32 i = 0; + + eeprom->magic = CP_EEPROM_MAGIC; + + spin_lock_irq(&cp->lock); + + addr_len = read_eeprom(cp->regs, 0, 8) == 0x8129 ? 8 : 6; + + if (eeprom->offset & 1) { + val = read_eeprom(cp->regs, offset, addr_len); + data[i++] = (u8)(val >> 8); + offset++; + } + + while (i < len - 1) { + val = read_eeprom(cp->regs, offset, addr_len); + data[i++] = (u8)val; + data[i++] = (u8)(val >> 8); + offset++; + } + + if (i < len) { + val = read_eeprom(cp->regs, offset, addr_len); + data[i] = (u8)val; + } + + spin_unlock_irq(&cp->lock); + return 0; +} + +static int cp_set_eeprom(struct net_device *dev, + struct ethtool_eeprom *eeprom, u8 *data) +{ + struct cp_private *cp = netdev_priv(dev); + unsigned int addr_len; + u16 val; + u32 offset = eeprom->offset >> 1; + u32 len = eeprom->len; + u32 i = 0; + + if (eeprom->magic != CP_EEPROM_MAGIC) + return -EINVAL; + + spin_lock_irq(&cp->lock); + + addr_len = read_eeprom(cp->regs, 0, 8) == 0x8129 ? 8 : 6; + + if (eeprom->offset & 1) { + val = read_eeprom(cp->regs, offset, addr_len) & 0xff; + val |= (u16)data[i++] << 8; + write_eeprom(cp->regs, offset, val, addr_len); + offset++; + } + + while (i < len - 1) { + val = (u16)data[i++]; + val |= (u16)data[i++] << 8; + write_eeprom(cp->regs, offset, val, addr_len); + offset++; + } + + if (i < len) { + val = read_eeprom(cp->regs, offset, addr_len) & 0xff00; + val |= (u16)data[i]; + write_eeprom(cp->regs, offset, val, addr_len); + } + + spin_unlock_irq(&cp->lock); + return 0; +} + /* Put the board into D3cold state and wait for WakeUp signal */ static void cp_set_d3_state (struct cp_private *cp) { @@ -1668,7 +1822,7 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) struct cp_private *cp; int rc; void __iomem *regs; - long pciaddr; + resource_size_t pciaddr; unsigned int addr_len, i, pci_using_dac; u8 pci_rev; @@ -1682,9 +1836,10 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) if (pdev->vendor == PCI_VENDOR_ID_REALTEK && pdev->device == PCI_DEVICE_ID_REALTEK_8139 && pci_rev < 0x20) { - printk(KERN_ERR PFX "pci dev %s (id %04x:%04x rev %02x) is not an 8139C+ compatible chip\n", - pci_name(pdev), pdev->vendor, pdev->device, pci_rev); - printk(KERN_ERR PFX "Try the \"8139too\" driver instead.\n"); + dev_err(&pdev->dev, + "This (id %04x:%04x rev %02x) is not an 8139C+ compatible chip\n", + pdev->vendor, pdev->device, pci_rev); + dev_err(&pdev->dev, "Try the \"8139too\" driver instead.\n"); return -ENODEV; } @@ -1722,14 +1877,13 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) pciaddr = pci_resource_start(pdev, 1); if (!pciaddr) { rc = -EIO; - printk(KERN_ERR PFX "no MMIO resource for pci dev %s\n", - pci_name(pdev)); + dev_err(&pdev->dev, "no MMIO resource\n"); goto err_out_res; } if (pci_resource_len(pdev, 1) < CP_REGS_SIZE) { rc = -EIO; - printk(KERN_ERR PFX "MMIO resource (%lx) too small on pci dev %s\n", - pci_resource_len(pdev, 1), pci_name(pdev)); + dev_err(&pdev->dev, "MMIO resource (%llx) too small\n", + (unsigned long long)pci_resource_len(pdev, 1)); goto err_out_res; } @@ -1743,14 +1897,15 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK); if (rc) { - printk(KERN_ERR PFX "No usable DMA configuration, " - "aborting.\n"); + dev_err(&pdev->dev, + "No usable DMA configuration, aborting.\n"); goto err_out_res; } rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK); if (rc) { - printk(KERN_ERR PFX "No usable consistent DMA configuration, " - "aborting.\n"); + dev_err(&pdev->dev, + "No usable consistent DMA configuration, " + "aborting.\n"); goto err_out_res; } } @@ -1761,8 +1916,9 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) regs = ioremap(pciaddr, CP_REGS_SIZE); if (!regs) { rc = -EIO; - printk(KERN_ERR PFX "Cannot map PCI MMIO (%lx@%lx) on pci dev %s\n", - pci_resource_len(pdev, 1), pciaddr, pci_name(pdev)); + dev_err(&pdev->dev, "Cannot map PCI MMIO (%Lx@%Lx)\n", + (unsigned long long)pci_resource_len(pdev, 1), + (unsigned long long)pciaddr); goto err_out_res; } dev->base_addr = (unsigned long) regs; @@ -1831,7 +1987,8 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) /* enable busmastering and memory-write-invalidate */ pci_set_master(pdev); - if (cp->wol_enabled) cp_set_d3_state (cp); + if (cp->wol_enabled) + cp_set_d3_state (cp); return 0; @@ -1856,7 +2013,8 @@ static void cp_remove_one (struct pci_dev *pdev) BUG_ON(!dev); unregister_netdev(dev); iounmap(cp->regs); - if (cp->wol_enabled) pci_set_power_state (pdev, PCI_D0); + if (cp->wol_enabled) + pci_set_power_state (pdev, PCI_D0); pci_release_regions(pdev); pci_clear_mwi(pdev); pci_disable_device(pdev); @@ -1919,7 +2077,7 @@ static int cp_resume (struct pci_dev *pdev) mii_check_media(&cp->mii_if, netif_msg_link(cp), FALSE); spin_unlock_irqrestore (&cp->lock, flags); - + return 0; } #endif /* CONFIG_PM */ diff --git a/drivers/net/8139too.c b/drivers/net/8139too.c index feae7832f..e4f4eaff7 100644 --- a/drivers/net/8139too.c +++ b/drivers/net/8139too.c @@ -93,7 +93,6 @@ #define DRV_VERSION "0.9.27" -#include #include #include #include @@ -165,7 +164,7 @@ static int multicast_filter_limit = 32; static int debug = -1; /* - * Receive ring size + * Receive ring size * Warning: 64K ring has hardware issues and may lock up. */ #if defined(CONFIG_SH_DREAMCAST) @@ -257,7 +256,7 @@ static struct pci_device_id rtl8139_pci_tbl[] = { {0x018a, 0x0106, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 }, {0x126c, 0x1211, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 }, {0x1743, 0x8139, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 }, - {0x021b, 0x8139, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 }, + {0x021b, 0x8139, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 }, #ifdef CONFIG_SH_SECUREEDGE5410 /* Bogus 8139 silicon reports 8129 without external PROM :-( */ @@ -769,7 +768,7 @@ static int __devinit rtl8139_init_board (struct pci_dev *pdev, /* dev and priv zeroed in alloc_etherdev */ dev = alloc_etherdev (sizeof (*tp)); if (dev == NULL) { - printk (KERN_ERR PFX "%s: Unable to alloc new net device\n", pci_name(pdev)); + dev_err(&pdev->dev, "Unable to alloc new net device\n"); return -ENOMEM; } SET_MODULE_OWNER(dev); @@ -801,31 +800,31 @@ static int __devinit rtl8139_init_board (struct pci_dev *pdev, #ifdef USE_IO_OPS /* make sure PCI base addr 0 is PIO */ if (!(pio_flags & IORESOURCE_IO)) { - printk (KERN_ERR PFX "%s: region #0 not a PIO resource, aborting\n", pci_name(pdev)); + dev_err(&pdev->dev, "region #0 not a PIO resource, aborting\n"); rc = -ENODEV; goto err_out; } /* check for weird/broken PCI region reporting */ if (pio_len < RTL_MIN_IO_SIZE) { - printk (KERN_ERR PFX "%s: Invalid PCI I/O region size(s), aborting\n", pci_name(pdev)); + dev_err(&pdev->dev, "Invalid PCI I/O region size(s), aborting\n"); rc = -ENODEV; goto err_out; } #else /* make sure PCI base addr 1 is MMIO */ if (!(mmio_flags & IORESOURCE_MEM)) { - printk (KERN_ERR PFX "%s: region #1 not an MMIO resource, aborting\n", pci_name(pdev)); + dev_err(&pdev->dev, "region #1 not an MMIO resource, aborting\n"); rc = -ENODEV; goto err_out; } if (mmio_len < RTL_MIN_IO_SIZE) { - printk (KERN_ERR PFX "%s: Invalid PCI mem region size(s), aborting\n", pci_name(pdev)); + dev_err(&pdev->dev, "Invalid PCI mem region size(s), aborting\n"); rc = -ENODEV; goto err_out; } #endif - rc = pci_request_regions (pdev, "8139too"); + rc = pci_request_regions (pdev, DRV_NAME); if (rc) goto err_out; disable_dev_on_err = 1; @@ -836,7 +835,7 @@ static int __devinit rtl8139_init_board (struct pci_dev *pdev, #ifdef USE_IO_OPS ioaddr = ioport_map(pio_start, pio_len); if (!ioaddr) { - printk (KERN_ERR PFX "%s: cannot map PIO, aborting\n", pci_name(pdev)); + dev_err(&pdev->dev, "cannot map PIO, aborting\n"); rc = -EIO; goto err_out; } @@ -847,7 +846,7 @@ static int __devinit rtl8139_init_board (struct pci_dev *pdev, /* ioremap MMIO region */ ioaddr = pci_iomap(pdev, 1, 0); if (ioaddr == NULL) { - printk (KERN_ERR PFX "%s: cannot remap MMIO, aborting\n", pci_name(pdev)); + dev_err(&pdev->dev, "cannot remap MMIO, aborting\n"); rc = -EIO; goto err_out; } @@ -861,8 +860,7 @@ static int __devinit rtl8139_init_board (struct pci_dev *pdev, /* check for missing/broken hardware */ if (RTL_R32 (TxConfig) == 0xFFFFFFFF) { - printk (KERN_ERR PFX "%s: Chip not responding, ignoring board\n", - pci_name(pdev)); + dev_err(&pdev->dev, "Chip not responding, ignoring board\n"); rc = -EIO; goto err_out; } @@ -876,9 +874,10 @@ static int __devinit rtl8139_init_board (struct pci_dev *pdev, } /* if unknown chip, assume array element #0, original RTL-8139 in this case */ - printk (KERN_DEBUG PFX "%s: unknown chip version, assuming RTL-8139\n", - pci_name(pdev)); - printk (KERN_DEBUG PFX "%s: TxConfig = 0x%lx\n", pci_name(pdev), RTL_R32 (TxConfig)); + dev_printk (KERN_DEBUG, &pdev->dev, + "unknown chip version, assuming RTL-8139\n"); + dev_printk (KERN_DEBUG, &pdev->dev, + "TxConfig = 0x%lx\n", RTL_R32 (TxConfig)); tp->chipset = 0; match: @@ -955,9 +954,11 @@ static int __devinit rtl8139_init_one (struct pci_dev *pdev, if (pdev->vendor == PCI_VENDOR_ID_REALTEK && pdev->device == PCI_DEVICE_ID_REALTEK_8139 && pci_rev >= 0x20) { - printk(KERN_INFO PFX "pci dev %s (id %04x:%04x rev %02x) is an enhanced 8139C+ chip\n", - pci_name(pdev), pdev->vendor, pdev->device, pci_rev); - printk(KERN_INFO PFX "Use the \"8139cp\" driver for improved performance and stability.\n"); + dev_info(&pdev->dev, + "This (id %04x:%04x rev %02x) is an enhanced 8139C+ chip\n", + pdev->vendor, pdev->device, pci_rev); + dev_info(&pdev->dev, + "Use the \"8139cp\" driver for improved performance and stability.\n"); } i = rtl8139_init_board (pdev, &dev); @@ -1311,7 +1312,7 @@ static int rtl8139_open (struct net_device *dev) int retval; void __iomem *ioaddr = tp->mmio_addr; - retval = request_irq (dev->irq, rtl8139_interrupt, SA_SHIRQ, dev->name, dev); + retval = request_irq (dev->irq, rtl8139_interrupt, IRQF_SHARED, dev->name, dev); if (retval) return retval; @@ -1341,9 +1342,9 @@ static int rtl8139_open (struct net_device *dev) netif_start_queue (dev); if (netif_msg_ifup(tp)) - printk(KERN_DEBUG "%s: rtl8139_open() ioaddr %#lx IRQ %d" - " GP Pins %2.2x %s-duplex.\n", - dev->name, pci_resource_start (tp->pci_dev, 1), + printk(KERN_DEBUG "%s: rtl8139_open() ioaddr %#llx IRQ %d" + " GP Pins %2.2x %s-duplex.\n", dev->name, + (unsigned long long)pci_resource_start (tp->pci_dev, 1), dev->irq, RTL_R8 (MediaStatus), tp->mii.full_duplex ? "full" : "half"); @@ -1708,6 +1709,7 @@ static int rtl8139_start_xmit (struct sk_buff *skb, struct net_device *dev) void __iomem *ioaddr = tp->mmio_addr; unsigned int entry; unsigned int len = skb->len; + unsigned long flags; /* Calculate the next Tx descriptor entry. */ entry = tp->cur_tx % NUM_TX_DESC; @@ -1724,7 +1726,7 @@ static int rtl8139_start_xmit (struct sk_buff *skb, struct net_device *dev) return 0; } - spin_lock_irq(&tp->lock); + spin_lock_irqsave(&tp->lock, flags); RTL_W32_F (TxStatus0 + (entry * sizeof (u32)), tp->tx_flag | max(len, (unsigned int)ETH_ZLEN)); @@ -1735,7 +1737,7 @@ static int rtl8139_start_xmit (struct sk_buff *skb, struct net_device *dev) if ((tp->cur_tx - NUM_TX_DESC) == tp->dirty_tx) netif_stop_queue (dev); - spin_unlock_irq(&tp->lock); + spin_unlock_irqrestore(&tp->lock, flags); if (netif_msg_tx_queued(tp)) printk (KERN_DEBUG "%s: Queued Tx packet size %u to slot %d.\n", @@ -1824,7 +1826,7 @@ static void rtl8139_rx_err (u32 rx_status, struct net_device *dev, int tmp_work; #endif - if (netif_msg_rx_err (tp)) + if (netif_msg_rx_err (tp)) printk(KERN_DEBUG "%s: Ethernet frame had errors, status %8.8x.\n", dev->name, rx_status); tp->stats.rx_errors++; @@ -1944,7 +1946,7 @@ static int rtl8139_rx(struct net_device *dev, struct rtl8139_private *tp, RTL_R16 (RxBufAddr), RTL_R16 (RxBufPtr), RTL_R8 (ChipCmd)); - while (netif_running(dev) && received < budget + while (netif_running(dev) && received < budget && (RTL_R8 (ChipCmd) & RxBufEmpty) == 0) { u32 ring_offset = cur_rx % RX_BUF_LEN; u32 rx_status; @@ -2031,7 +2033,7 @@ no_early_rx: netif_receive_skb (skb); } else { - if (net_ratelimit()) + if (net_ratelimit()) printk (KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name); @@ -2158,13 +2160,13 @@ static irqreturn_t rtl8139_interrupt (int irq, void *dev_instance, status = RTL_R16 (IntrStatus); /* shared irq? */ - if (unlikely((status & rtl8139_intr_mask) == 0)) + if (unlikely((status & rtl8139_intr_mask) == 0)) goto out; handled = 1; /* h/w no longer present (hotplug?) or major error, bail */ - if (unlikely(status == 0xFFFF)) + if (unlikely(status == 0xFFFF)) goto out; /* close possible race's with dev_close */ diff --git a/drivers/net/82596.c b/drivers/net/82596.c index da0c878dc..257d3bce3 100644 --- a/drivers/net/82596.c +++ b/drivers/net/82596.c @@ -40,7 +40,6 @@ */ -#include #include #include #include @@ -900,7 +899,7 @@ memory_squeeze: } -static inline void i596_cleanup_cmd(struct net_device *dev, struct i596_private *lp) +static void i596_cleanup_cmd(struct net_device *dev, struct i596_private *lp) { struct i596_cmd *ptr; @@ -933,7 +932,8 @@ static inline void i596_cleanup_cmd(struct net_device *dev, struct i596_private lp->scb.cmd = I596_NULL; } -static inline void i596_reset(struct net_device *dev, struct i596_private *lp, int ioaddr) +static void i596_reset(struct net_device *dev, struct i596_private *lp, + int ioaddr) { unsigned long flags; @@ -1070,8 +1070,7 @@ static int i596_start_xmit(struct sk_buff *skb, struct net_device *dev) skb->len, (unsigned int)skb->data)); if (skb->len < ETH_ZLEN) { - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) + if (skb_padto(skb, ETH_ZLEN)) return 0; length = ETH_ZLEN; } @@ -1580,7 +1579,7 @@ static int debug = -1; module_param(debug, int, 0); MODULE_PARM_DESC(debug, "i82596 debug mask"); -int init_module(void) +int __init init_module(void) { if (debug >= 0) i596_debug = debug; @@ -1590,7 +1589,7 @@ int init_module(void) return 0; } -void cleanup_module(void) +void __exit cleanup_module(void) { unregister_netdev(dev_82596); #ifdef __mc68000__ diff --git a/drivers/net/8390.c b/drivers/net/8390.c index f87027420..d2935ae39 100644 --- a/drivers/net/8390.c +++ b/drivers/net/8390.c @@ -249,7 +249,7 @@ void ei_tx_timeout(struct net_device *dev) /* Ugly but a reset can be slow, yet must be protected */ - disable_irq_nosync(dev->irq); + disable_irq_nosync_lockdep(dev->irq); spin_lock(&ei_local->page_lock); /* Try to restart the card. Perhaps the user has fixed something. */ @@ -257,7 +257,7 @@ void ei_tx_timeout(struct net_device *dev) NS8390_init(dev, 1); spin_unlock(&ei_local->page_lock); - enable_irq(dev->irq); + enable_irq_lockdep(dev->irq); netif_wake_queue(dev); } @@ -275,12 +275,14 @@ static int ei_start_xmit(struct sk_buff *skb, struct net_device *dev) struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); int send_length = skb->len, output_page; unsigned long flags; + char buf[ETH_ZLEN]; + char *data = skb->data; if (skb->len < ETH_ZLEN) { - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) - return 0; + memset(buf, 0, ETH_ZLEN); /* more efficient than doing just the needed bits */ + memcpy(buf, data, skb->len); send_length = ETH_ZLEN; + data = buf; } /* Mask interrupts from the ethercard. @@ -347,7 +349,7 @@ static int ei_start_xmit(struct sk_buff *skb, struct net_device *dev) * trigger the send later, upon receiving a Tx done interrupt. */ - ei_block_output(dev, send_length, skb->data, output_page); + ei_block_output(dev, send_length, data, output_page); if (! ei_local->txing) { diff --git a/drivers/net/8390.h b/drivers/net/8390.h index 51e39dcd0..a9a58f518 100644 --- a/drivers/net/8390.h +++ b/drivers/net/8390.h @@ -7,7 +7,6 @@ #ifndef _8390_h #define _8390_h -#include #include #include #include diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index b7c3e118e..6739af850 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig @@ -447,6 +447,7 @@ config MIPS_GT96100ETH config MIPS_AU1X00_ENET bool "MIPS AU1000 Ethernet support" depends on NET_ETHERNET && SOC_AU1X00 + select PHYLIB select CRC32 help If you have an Alchemy Semi AU1X00 based system @@ -853,6 +854,17 @@ config SMC9194 . The module will be called smc9194. +config NET_NETX + tristate "NetX Ethernet support" + select MII + depends on NET_ETHERNET && ARCH_NETX + help + This is support for the Hilscher netX builtin Ethernet ports + + To compile this driver as a module, choose M here and read + . The module + will be called netx-eth. + config DM9000 tristate "DM9000 support" depends on (ARM || MIPS) && NET_ETHERNET @@ -865,6 +877,22 @@ config DM9000 . The module will be called dm9000. +config SMC911X + tristate "SMSC LAN911[5678] support" + select CRC32 + select MII + depends on NET_ETHERNET && ARCH_PXA + help + This is a driver for SMSC's LAN911x series of Ethernet chipsets + including the new LAN9115, LAN9116, LAN9117, and LAN9118. + Say Y if you want it compiled into the kernel, + and read the Ethernet-HOWTO, available from + . + + This driver is also available as a module. The module will be + called smc911x. If you want to compile it as a module, say M + here and read + config NET_VENDOR_RACAL bool "Racal-Interlan (Micom) NI cards" depends on NET_ETHERNET && ISA @@ -1359,8 +1387,8 @@ config APRICOT called apricot. config B44 - tristate "Broadcom 4400 ethernet support (EXPERIMENTAL)" - depends on NET_PCI && PCI && EXPERIMENTAL + tristate "Broadcom 4400 ethernet support" + depends on NET_PCI && PCI select MII help If you have a network (Ethernet) controller of this type, say Y and @@ -1696,6 +1724,20 @@ config VIA_RHINE_MMIO If unsure, say Y. +config VIA_RHINE_NAPI + bool "Use Rx Polling (NAPI)" + depends on VIA_RHINE + help + NAPI is a new driver API designed to reduce CPU and interrupt load + when the driver is receiving lots of packets from the card. + + If your estimated Rx load is 10kpps or more, or if the card will be + deployed on potentially unfriendly networks (e.g. in a firewall), + then say Y here. + + See for more + information. + config LAN_SAA9730 bool "Philips SAA9730 Ethernet support (EXPERIMENTAL)" depends on NET_PCI && EXPERIMENTAL && MIPS @@ -2163,6 +2205,8 @@ config TIGON3 config BNX2 tristate "Broadcom NetXtremeII support" depends on PCI + select CRC32 + select ZLIB_INFLATE help This driver supports Broadcom NetXtremeII gigabit Ethernet cards. @@ -2200,7 +2244,7 @@ config BCM5700 config SPIDER_NET tristate "Spider Gigabit Ethernet driver" - depends on PCI && PPC_CELL + depends on PCI && PPC_IBM_CELL_BLADE select FW_LOADER help This driver supports the Gigabit Ethernet chips present on the @@ -2208,16 +2252,43 @@ config SPIDER_NET config GIANFAR tristate "Gianfar Ethernet" - depends on 85xx || 83xx + depends on 85xx || 83xx || PPC_86xx select PHYLIB help - This driver supports the Gigabit TSEC on the MPC85xx - family of chips, and the FEC on the 8540 + This driver supports the Gigabit TSEC on the MPC83xx, MPC85xx, + and MPC86xx family of chips, and the FEC on the 8540. config GFAR_NAPI bool "NAPI Support" depends on GIANFAR +config UCC_GETH + tristate "Freescale QE UCC GETH" + depends on QUICC_ENGINE && UCC_FAST + help + This driver supports the Gigabit Ethernet mode of QE UCC. + QE can be found on MPC836x CPUs. + +config UGETH_NAPI + bool "NAPI Support" + depends on UCC_GETH + +config UGETH_MAGIC_PACKET + bool "Magic Packet detection support" + depends on UCC_GETH + +config UGETH_FILTERING + bool "Mac address filtering support" + depends on UCC_GETH + +config UGETH_TX_ON_DEMOND + bool "Transmit on Demond support" + depends on UCC_GETH + +config UGETH_HAS_GIGA + bool + depends on UCC_GETH && MPC836x + config MV643XX_ETH tristate "MV-643XX Ethernet support" depends on MOMENCO_OCELOT_C || MOMENCO_JAGUAR_ATX || MV64360 || MOMENCO_OCELOT_3 || PPC_MULTIPLATFORM @@ -2340,6 +2411,23 @@ config S2IO_NAPI If in doubt, say N. +config MYRI10GE + tristate "Myricom Myri-10G Ethernet support" + depends on PCI + select FW_LOADER + select CRC32 + ---help--- + This driver supports Myricom Myri-10G Dual Protocol interface in + Ethernet mode. If the eeprom on your board is not recent enough, + you will need a newer firmware image. + You may get this image or more information, at: + + + + To compile this driver as a module, choose M here and read + . The module + will be called myri10ge. + endmenu source "drivers/net/tokenring/Kconfig" diff --git a/drivers/net/Makefile b/drivers/net/Makefile index 0e455ffeb..cbc186c6f 100644 --- a/drivers/net/Makefile +++ b/drivers/net/Makefile @@ -19,6 +19,9 @@ gianfar_driver-objs := gianfar.o \ gianfar_mii.o \ gianfar_sysfs.o +obj-$(CONFIG_UCC_GETH) += ucc_geth_driver.o +ucc_geth_driver-objs := ucc_geth.o ucc_geth_phy.o + # # link order important here # @@ -189,12 +192,15 @@ obj-$(CONFIG_MACSONIC) += macsonic.o obj-$(CONFIG_MACMACE) += macmace.o obj-$(CONFIG_MAC89x0) += mac89x0.o obj-$(CONFIG_TUN) += tun.o +obj-$(CONFIG_NET_NETX) += netx-eth.o obj-$(CONFIG_DL2K) += dl2k.o obj-$(CONFIG_R8169) += r8169.o obj-$(CONFIG_AMD8111_ETH) += amd8111e.o obj-$(CONFIG_IBMVETH) += ibmveth.o obj-$(CONFIG_S2IO) += s2io.o +obj-$(CONFIG_MYRI10GE) += myri10ge/ obj-$(CONFIG_SMC91X) += smc91x.o +obj-$(CONFIG_SMC911X) += smc911x.o obj-$(CONFIG_DM9000) += dm9000.o obj-$(CONFIG_FEC_8XX) += fec_8xx/ diff --git a/drivers/net/Space.c b/drivers/net/Space.c index 60304f7e7..a8c245a82 100644 --- a/drivers/net/Space.c +++ b/drivers/net/Space.c @@ -27,7 +27,6 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ -#include #include #include #include diff --git a/drivers/net/a2065.c b/drivers/net/a2065.c index 79bb56b8d..f4ea62641 100644 --- a/drivers/net/a2065.c +++ b/drivers/net/a2065.c @@ -48,7 +48,6 @@ #include #include #include -#include #include #include #include @@ -496,7 +495,7 @@ static int lance_open (struct net_device *dev) ll->rdp = LE_C0_STOP; /* Install the Interrupt handler */ - ret = request_irq(IRQ_AMIGA_PORTS, lance_interrupt, SA_SHIRQ, + ret = request_irq(IRQ_AMIGA_PORTS, lance_interrupt, IRQF_SHARED, dev->name, dev); if (ret) return ret; @@ -573,8 +572,7 @@ static int lance_start_xmit (struct sk_buff *skb, struct net_device *dev) if (len < ETH_ZLEN) { len = ETH_ZLEN; - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) + if (skb_padto(skb, ETH_ZLEN)) return 0; } diff --git a/drivers/net/ac3200.c b/drivers/net/ac3200.c index 7952dc6d7..0fbbcb75a 100644 --- a/drivers/net/ac3200.c +++ b/drivers/net/ac3200.c @@ -370,8 +370,7 @@ MODULE_PARM_DESC(mem, "Memory base address(es)"); MODULE_DESCRIPTION("Ansel AC3200 EISA ethernet driver"); MODULE_LICENSE("GPL"); -int -init_module(void) +int __init init_module(void) { struct net_device *dev; int this_dev, found = 0; diff --git a/drivers/net/acenic.c b/drivers/net/acenic.c index b508812e9..1c01e9b3d 100644 --- a/drivers/net/acenic.c +++ b/drivers/net/acenic.c @@ -50,7 +50,6 @@ * Grant Grundler : PCI write posting fixes. */ -#include #include #include #include @@ -579,11 +578,7 @@ static int __devinit acenic_probe_one(struct pci_dev *pdev, } printk("Gigabit Ethernet at 0x%08lx, ", dev->base_addr); -#ifdef __sparc__ - printk("irq %s\n", __irq_itoa(pdev->irq)); -#else - printk("irq %i\n", pdev->irq); -#endif + printk("irq %d\n", pdev->irq); #ifdef CONFIG_ACENIC_OMIT_TIGON_I if ((readl(&ap->regs->HostCtrl) >> 28) == 4) { @@ -1199,7 +1194,7 @@ static int __devinit ace_init(struct net_device *dev) goto init_error; } - ecode = request_irq(pdev->irq, ace_interrupt, SA_SHIRQ, + ecode = request_irq(pdev->irq, ace_interrupt, IRQF_SHARED, DRV_NAME, dev); if (ecode) { printk(KERN_WARNING "%s: Requested IRQ %d is busy\n", diff --git a/drivers/net/acenic.h b/drivers/net/acenic.h index a97107023..62ec8ceee 100644 --- a/drivers/net/acenic.h +++ b/drivers/net/acenic.h @@ -1,7 +1,6 @@ #ifndef _ACENIC_H_ #define _ACENIC_H_ -#include /* * Generate TX index update each time, when TX ring is closed. diff --git a/drivers/net/acenic_firmware.h b/drivers/net/acenic_firmware.h index d7882dd78..ec146f60d 100644 --- a/drivers/net/acenic_firmware.h +++ b/drivers/net/acenic_firmware.h @@ -1,4 +1,3 @@ -#include /* * Declare these here even if Tigon I support is disabled to avoid * the compiler complaining about undefined symbols. diff --git a/drivers/net/amd8111e.c b/drivers/net/amd8111e.c index d9ba8be72..ed322a769 100755 --- a/drivers/net/amd8111e.c +++ b/drivers/net/amd8111e.c @@ -69,7 +69,6 @@ Revision History: */ -#include #include #include #include @@ -1377,7 +1376,7 @@ static int amd8111e_open(struct net_device * dev ) { struct amd8111e_priv *lp = netdev_priv(dev); - if(dev->irq ==0 || request_irq(dev->irq, amd8111e_interrupt, SA_SHIRQ, + if(dev->irq ==0 || request_irq(dev->irq, amd8111e_interrupt, IRQF_SHARED, dev->name, dev)) return -EAGAIN; diff --git a/drivers/net/apne.c b/drivers/net/apne.c index b9820b86c..9cc13a025 100644 --- a/drivers/net/apne.c +++ b/drivers/net/apne.c @@ -313,7 +313,7 @@ static int __init apne_probe1(struct net_device *dev, int ioaddr) dev->base_addr = ioaddr; /* Install the Interrupt handler */ - i = request_irq(IRQ_AMIGA_PORTS, apne_interrupt, SA_SHIRQ, DRV_NAME, dev); + i = request_irq(IRQ_AMIGA_PORTS, apne_interrupt, IRQF_SHARED, DRV_NAME, dev); if (i) return i; for(i = 0; i < ETHER_ADDR_LEN; i++) { diff --git a/drivers/net/appletalk/Kconfig b/drivers/net/appletalk/Kconfig index b14e89004..0a0e0cd81 100644 --- a/drivers/net/appletalk/Kconfig +++ b/drivers/net/appletalk/Kconfig @@ -29,7 +29,7 @@ config ATALK even politically correct people are allowed to say Y here. config DEV_APPLETALK - bool "Appletalk interfaces support" + tristate "Appletalk interfaces support" depends on ATALK help AppleTalk is the protocol that Apple computers can use to communicate diff --git a/drivers/net/appletalk/cops.c b/drivers/net/appletalk/cops.c index 9edaa1832..ae7f82834 100644 --- a/drivers/net/appletalk/cops.c +++ b/drivers/net/appletalk/cops.c @@ -48,7 +48,6 @@ static const char *version = * the driver figure it out. */ -#include #include #include #include @@ -1031,7 +1030,7 @@ module_param(io, int, 0); module_param(irq, int, 0); module_param(board_type, int, 0); -int init_module(void) +int __init init_module(void) { if (io == 0) printk(KERN_WARNING "%s: You shouldn't autoprobe with insmod\n", diff --git a/drivers/net/appletalk/cops_ffdrv.h b/drivers/net/appletalk/cops_ffdrv.h index 31cf8c9c9..b02005087 100644 --- a/drivers/net/appletalk/cops_ffdrv.h +++ b/drivers/net/appletalk/cops_ffdrv.h @@ -24,7 +24,6 @@ * - Jay Schulist */ -#include #ifdef CONFIG_COPS_DAYNA diff --git a/drivers/net/appletalk/cops_ltdrv.h b/drivers/net/appletalk/cops_ltdrv.h index 4afb8e18b..c699b1ad3 100644 --- a/drivers/net/appletalk/cops_ltdrv.h +++ b/drivers/net/appletalk/cops_ltdrv.h @@ -23,7 +23,6 @@ * - Jay Schulist */ -#include #ifdef CONFIG_COPS_TANGENT diff --git a/drivers/net/appletalk/ipddp.c b/drivers/net/appletalk/ipddp.c index 1a44a79ed..7f7dd4502 100644 --- a/drivers/net/appletalk/ipddp.c +++ b/drivers/net/appletalk/ipddp.c @@ -23,7 +23,6 @@ * of the GNU General Public License, incorporated herein by reference. */ -#include #include #include #include diff --git a/drivers/net/arcnet/arcnet.c b/drivers/net/arcnet/arcnet.c index fabc0607b..5a9500525 100644 --- a/drivers/net/arcnet/arcnet.c +++ b/drivers/net/arcnet/arcnet.c @@ -44,7 +44,6 @@ #define VERSION "arcnet: v3.93 BETA 2000/04/29 - by Avery Pennarun et al.\n" #include -#include #include #include #include diff --git a/drivers/net/arcnet/com20020-pci.c b/drivers/net/arcnet/com20020-pci.c index 96636ca87..979a33df0 100644 --- a/drivers/net/arcnet/com20020-pci.c +++ b/drivers/net/arcnet/com20020-pci.c @@ -120,7 +120,7 @@ static int __devinit com20020pci_probe(struct pci_dev *pdev, const struct pci_de goto out_port; } - if ((err = com20020_found(dev, SA_SHIRQ)) != 0) + if ((err = com20020_found(dev, IRQF_SHARED)) != 0) goto out_port; return 0; diff --git a/drivers/net/ariadne.c b/drivers/net/ariadne.c index d1b6b1f79..cc721addd 100644 --- a/drivers/net/ariadne.c +++ b/drivers/net/ariadne.c @@ -320,7 +320,7 @@ static int ariadne_open(struct net_device *dev) netif_start_queue(dev); - i = request_irq(IRQ_AMIGA_PORTS, ariadne_interrupt, SA_SHIRQ, + i = request_irq(IRQ_AMIGA_PORTS, ariadne_interrupt, IRQF_SHARED, dev->name, dev); if (i) return i; @@ -607,8 +607,7 @@ static int ariadne_start_xmit(struct sk_buff *skb, struct net_device *dev) /* FIXME: is the 79C960 new enough to do its own padding right ? */ if (skb->len < ETH_ZLEN) { - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) + if (skb_padto(skb, ETH_ZLEN)) return 0; len = ETH_ZLEN; } diff --git a/drivers/net/arm/at91_ether.c b/drivers/net/arm/at91_ether.c index 5503dc8a6..85493b7b9 100644 --- a/drivers/net/arm/at91_ether.c +++ b/drivers/net/arm/at91_ether.c @@ -19,7 +19,6 @@ #include #include -#include #include #include #include @@ -43,7 +42,9 @@ #define DRV_VERSION "1.0" static struct net_device *at91_dev; -static struct clk *ether_clk; + +static struct timer_list check_timer; +#define LINK_POLL_INTERVAL (HZ) /* ..................................................................... */ @@ -143,7 +144,7 @@ static void read_phy(unsigned char phy_addr, unsigned char address, unsigned int * MAC accordingly. * If no link or auto-negotiation is busy, then no changes are made. */ -static void update_linkspeed(struct net_device *dev) +static void update_linkspeed(struct net_device *dev, int silent) { struct at91_private *lp = (struct at91_private *) dev->priv; unsigned int bmsr, bmcr, lpa, mac_cfg; @@ -151,7 +152,8 @@ static void update_linkspeed(struct net_device *dev) if (!mii_link_ok(&lp->mii)) { /* no link */ netif_carrier_off(dev); - printk(KERN_INFO "%s: Link down.\n", dev->name); + if (!silent) + printk(KERN_INFO "%s: Link down.\n", dev->name); return; } @@ -186,7 +188,8 @@ static void update_linkspeed(struct net_device *dev) } at91_emac_write(AT91_EMAC_CFG, mac_cfg); - printk(KERN_INFO "%s: Link now %i-%s\n", dev->name, speed, (duplex == DUPLEX_FULL) ? "FullDuplex" : "HalfDuplex"); + if (!silent) + printk(KERN_INFO "%s: Link now %i-%s\n", dev->name, speed, (duplex == DUPLEX_FULL) ? "FullDuplex" : "HalfDuplex"); netif_carrier_on(dev); } @@ -226,7 +229,7 @@ static irqreturn_t at91ether_phy_interrupt(int irq, void *dev_id, struct pt_regs goto done; } - update_linkspeed(dev); + update_linkspeed(dev, 0); done: disable_mdi(); @@ -243,14 +246,17 @@ static void enable_phyirq(struct net_device *dev) unsigned int dsintr, irq_number; int status; - if (lp->phy_type == MII_RTL8201_ID) /* RTL8201 does not have an interrupt */ - return; - if (lp->phy_type == MII_DP83847_ID) /* DP83847 does not have an interrupt */ - return; - if (lp->phy_type == MII_AC101L_ID) /* AC101L interrupt not supported yet */ + irq_number = lp->board_data.phy_irq_pin; + if (!irq_number) { + /* + * PHY doesn't have an IRQ pin (RTL8201, DP83847, AC101L), + * or board does not have it connected. + */ + check_timer.expires = jiffies + LINK_POLL_INTERVAL; + add_timer(&check_timer); return; + } - irq_number = lp->board_data.phy_irq_pin; status = request_irq(irq_number, at91ether_phy_interrupt, 0, dev->name, dev); if (status) { printk(KERN_ERR "at91_ether: PHY IRQ %d request failed - status %d!\n", irq_number, status); @@ -292,12 +298,11 @@ static void disable_phyirq(struct net_device *dev) unsigned int dsintr; unsigned int irq_number; - if (lp->phy_type == MII_RTL8201_ID) /* RTL8201 does not have an interrupt */ - return; - if (lp->phy_type == MII_DP83847_ID) /* DP83847 does not have an interrupt */ - return; - if (lp->phy_type == MII_AC101L_ID) /* AC101L interrupt not supported yet */ + irq_number = lp->board_data.phy_irq_pin; + if (!irq_number) { + del_timer_sync(&check_timer); return; + } spin_lock_irq(&lp->lock); enable_mdi(); @@ -326,7 +331,6 @@ static void disable_phyirq(struct net_device *dev) disable_mdi(); spin_unlock_irq(&lp->lock); - irq_number = lp->board_data.phy_irq_pin; free_irq(irq_number, dev); /* Free interrupt handler */ } @@ -355,6 +359,18 @@ static void reset_phy(struct net_device *dev) } #endif +static void at91ether_check_link(unsigned long dev_id) +{ + struct net_device *dev = (struct net_device *) dev_id; + + enable_mdi(); + update_linkspeed(dev, 1); + disable_mdi(); + + check_timer.expires = jiffies + LINK_POLL_INTERVAL; + add_timer(&check_timer); +} + /* ......................... ADDRESS MANAGEMENT ........................ */ /* @@ -501,7 +517,7 @@ static int hash_get_index(__u8 *addr) hash_index |= (bitval << j); } - return hash_index; + return hash_index; } /* @@ -557,10 +573,8 @@ static void at91ether_set_rx_mode(struct net_device *dev) at91_emac_write(AT91_EMAC_CFG, cfg); } - /* ......................... ETHTOOL SUPPORT ........................... */ - static int mdio_read(struct net_device *dev, int phy_id, int location) { unsigned int value; @@ -642,6 +656,22 @@ static struct ethtool_ops at91ether_ethtool_ops = { .get_link = ethtool_op_get_link, }; +static int at91ether_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) +{ + struct at91_private *lp = (struct at91_private *) dev->priv; + int res; + + if (!netif_running(dev)) + return -EINVAL; + + spin_lock_irq(&lp->lock); + enable_mdi(); + res = generic_mii_ioctl(&lp->mii, if_mii(rq), cmd, NULL); + disable_mdi(); + spin_unlock_irq(&lp->lock); + + return res; +} /* ................................ MAC ................................ */ @@ -685,10 +715,10 @@ static int at91ether_open(struct net_device *dev) struct at91_private *lp = (struct at91_private *) dev->priv; unsigned long ctl; - if (!is_valid_ether_addr(dev->dev_addr)) - return -EADDRNOTAVAIL; + if (!is_valid_ether_addr(dev->dev_addr)) + return -EADDRNOTAVAIL; - clk_enable(ether_clk); /* Re-enable Peripheral clock */ + clk_enable(lp->ether_clk); /* Re-enable Peripheral clock */ /* Clear internal statistics */ ctl = at91_emac_read(AT91_EMAC_CTL); @@ -708,7 +738,7 @@ static int at91ether_open(struct net_device *dev) /* Determine current link speed */ spin_lock_irq(&lp->lock); enable_mdi(); - update_linkspeed(dev); + update_linkspeed(dev, 0); disable_mdi(); spin_unlock_irq(&lp->lock); @@ -722,6 +752,7 @@ static int at91ether_open(struct net_device *dev) */ static int at91ether_close(struct net_device *dev) { + struct at91_private *lp = (struct at91_private *) dev->priv; unsigned long ctl; /* Disable Receiver and Transmitter */ @@ -738,7 +769,7 @@ static int at91ether_close(struct net_device *dev) netif_stop_queue(dev); - clk_disable(ether_clk); /* Disable Peripheral clock */ + clk_disable(lp->ether_clk); /* Disable Peripheral clock */ return 0; } @@ -870,7 +901,7 @@ static irqreturn_t at91ether_interrupt(int irq, void *dev_id, struct pt_regs *re if (intstatus & AT91_EMAC_RCOM) /* Receive complete */ at91ether_rx(dev); - if (intstatus & AT91_EMAC_TCOM) { /* Transmit complete */ + if (intstatus & AT91_EMAC_TCOM) { /* Transmit complete */ /* The TCOM bit is set even if the transmission failed. */ if (intstatus & (AT91_EMAC_TUND | AT91_EMAC_RTRY)) lp->stats.tx_errors += 1; @@ -899,7 +930,8 @@ static irqreturn_t at91ether_interrupt(int irq, void *dev_id, struct pt_regs *re /* * Initialize the ethernet interface */ -static int __init at91ether_setup(unsigned long phy_type, unsigned short phy_address, struct platform_device *pdev) +static int __init at91ether_setup(unsigned long phy_type, unsigned short phy_address, + struct platform_device *pdev, struct clk *ether_clk) { struct at91_eth_data *board_data = pdev->dev.platform_data; struct net_device *dev; @@ -933,6 +965,7 @@ static int __init at91ether_setup(unsigned long phy_type, unsigned short phy_add return -ENOMEM; } lp->board_data = *board_data; + lp->ether_clk = ether_clk; platform_set_drvdata(pdev, dev); spin_lock_init(&lp->lock); @@ -945,6 +978,7 @@ static int __init at91ether_setup(unsigned long phy_type, unsigned short phy_add dev->set_multicast_list = at91ether_set_rx_mode; dev->set_mac_address = set_mac_address; dev->ethtool_ops = &at91ether_ethtool_ops; + dev->do_ioctl = at91ether_ioctl; SET_NETDEV_DEV(dev, &pdev->dev); @@ -975,6 +1009,9 @@ static int __init at91ether_setup(unsigned long phy_type, unsigned short phy_add lp->mii.dev = dev; /* Support for ethtool */ lp->mii.mdio_read = mdio_read; lp->mii.mdio_write = mdio_write; + lp->mii.phy_id = phy_address; + lp->mii.phy_id_mask = 0x1f; + lp->mii.reg_num_mask = 0x1f; lp->phy_type = phy_type; /* Type of PHY connected */ lp->phy_address = phy_address; /* MDI address of PHY */ @@ -992,11 +1029,18 @@ static int __init at91ether_setup(unsigned long phy_type, unsigned short phy_add /* Determine current link speed */ spin_lock_irq(&lp->lock); enable_mdi(); - update_linkspeed(dev); + update_linkspeed(dev, 0); disable_mdi(); spin_unlock_irq(&lp->lock); netif_carrier_off(dev); /* will be enabled in open() */ + /* If board has no PHY IRQ, use a timer to poll the PHY */ + if (!lp->board_data.phy_irq_pin) { + init_timer(&check_timer); + check_timer.data = (unsigned long)dev; + check_timer.function = at91ether_check_link; + } + /* Display ethernet banner */ printk(KERN_INFO "%s: AT91 ethernet at 0x%08x int=%d %s%s (%02x:%02x:%02x:%02x:%02x:%02x)\n", dev->name, (uint) dev->base_addr, dev->irq, @@ -1005,7 +1049,7 @@ static int __init at91ether_setup(unsigned long phy_type, unsigned short phy_add dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2], dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]); if ((phy_type == MII_DM9161_ID) || (lp->phy_type == MII_DM9161A_ID)) - printk(KERN_INFO "%s: Davicom 9196 PHY %s\n", dev->name, (lp->phy_media == PORT_FIBRE) ? "(Fiber)" : "(Copper)"); + printk(KERN_INFO "%s: Davicom 9161 PHY %s\n", dev->name, (lp->phy_media == PORT_FIBRE) ? "(Fiber)" : "(Copper)"); else if (phy_type == MII_LXT971A_ID) printk(KERN_INFO "%s: Intel LXT971A PHY\n", dev->name); else if (phy_type == MII_RTL8201_ID) @@ -1031,9 +1075,10 @@ static int __init at91ether_probe(struct platform_device *pdev) int detected = -1; unsigned long phy_id; unsigned short phy_address = 0; + struct clk *ether_clk; ether_clk = clk_get(&pdev->dev, "ether_clk"); - if (!ether_clk) { + if (IS_ERR(ether_clk)) { printk(KERN_ERR "at91_ether: no clock defined\n"); return -ENODEV; } @@ -1056,7 +1101,7 @@ static int __init at91ether_probe(struct platform_device *pdev) case MII_DP83847_ID: /* National Semiconductor DP83847: */ case MII_AC101L_ID: /* Altima AC101L: PHY_ID1 = 0x22, PHY_ID2 = 0x5520 */ case MII_KS8721_ID: /* Micrel KS8721: PHY_ID1 = 0x22, PHY_ID2 = 0x1610 */ - detected = at91ether_setup(phy_id, phy_address, pdev); + detected = at91ether_setup(phy_id, phy_address, pdev, ether_clk); break; } @@ -1075,17 +1120,61 @@ static int __devexit at91ether_remove(struct platform_device *pdev) unregister_netdev(at91_dev); free_irq(at91_dev->irq, at91_dev); dma_free_coherent(NULL, sizeof(struct recv_desc_bufs), lp->dlist, (dma_addr_t)lp->dlist_phys); - clk_put(ether_clk); + clk_put(lp->ether_clk); free_netdev(at91_dev); at91_dev = NULL; return 0; } +#ifdef CONFIG_PM + +static int at91ether_suspend(struct platform_device *pdev, pm_message_t mesg) +{ + struct at91_private *lp = (struct at91_private *) at91_dev->priv; + struct net_device *net_dev = platform_get_drvdata(pdev); + int phy_irq = lp->board_data.phy_irq_pin; + + if (netif_running(net_dev)) { + if (phy_irq) + disable_irq(phy_irq); + + netif_stop_queue(net_dev); + netif_device_detach(net_dev); + + clk_disable(lp->ether_clk); + } + return 0; +} + +static int at91ether_resume(struct platform_device *pdev) +{ + struct at91_private *lp = (struct at91_private *) at91_dev->priv; + struct net_device *net_dev = platform_get_drvdata(pdev); + int phy_irq = lp->board_data.phy_irq_pin; + + if (netif_running(net_dev)) { + clk_enable(lp->ether_clk); + + netif_device_attach(net_dev); + netif_start_queue(net_dev); + + if (phy_irq) + enable_irq(phy_irq); + } + return 0; +} + +#else +#define at91ether_suspend NULL +#define at91ether_resume NULL +#endif + static struct platform_driver at91ether_driver = { .probe = at91ether_probe, .remove = __devexit_p(at91ether_remove), - /* FIXME: support suspend and resume */ + .suspend = at91ether_suspend, + .resume = at91ether_resume, .driver = { .name = DRV_NAME, .owner = THIS_MODULE, diff --git a/drivers/net/arm/at91_ether.h b/drivers/net/arm/at91_ether.h index 9885735c9..d1e72e02b 100644 --- a/drivers/net/arm/at91_ether.h +++ b/drivers/net/arm/at91_ether.h @@ -80,6 +80,7 @@ struct at91_private struct net_device_stats stats; struct mii_if_info mii; /* ethtool support */ struct at91_eth_data board_data; /* board-specific configuration */ + struct clk *ether_clk; /* clock */ /* PHY */ unsigned long phy_type; /* type of PHY (PHY_ID) */ diff --git a/drivers/net/arm/ether1.c b/drivers/net/arm/ether1.c index 36475eb27..312955d07 100644 --- a/drivers/net/arm/ether1.c +++ b/drivers/net/arm/ether1.c @@ -700,8 +700,7 @@ ether1_sendpacket (struct sk_buff *skb, struct net_device *dev) } if (skb->len < ETH_ZLEN) { - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) + if (skb_padto(skb, ETH_ZLEN)) goto out; } diff --git a/drivers/net/arm/ether3.c b/drivers/net/arm/ether3.c index f1d5b1027..081074180 100644 --- a/drivers/net/arm/ether3.c +++ b/drivers/net/arm/ether3.c @@ -518,8 +518,7 @@ ether3_sendpacket(struct sk_buff *skb, struct net_device *dev) length = (length + 1) & ~1; if (length != skb->len) { - skb = skb_padto(skb, length); - if (skb == NULL) + if (skb_padto(skb, length)) goto out; } diff --git a/drivers/net/at1700.c b/drivers/net/at1700.c index e613cc289..4ca061c2d 100644 --- a/drivers/net/at1700.c +++ b/drivers/net/at1700.c @@ -35,7 +35,6 @@ response to inb()s from other device probes! */ -#include #include #include #include @@ -902,7 +901,7 @@ MODULE_PARM_DESC(io, "AT1700/FMV18X I/O base address"); MODULE_PARM_DESC(irq, "AT1700/FMV18X IRQ number"); MODULE_PARM_DESC(net_debug, "AT1700/FMV18X debug level (0-6)"); -int init_module(void) +int __init init_module(void) { if (io == 0) printk("at1700: You should not use auto-probing with insmod!\n"); diff --git a/drivers/net/atarilance.c b/drivers/net/atarilance.c index 442b2cbeb..91783a800 100644 --- a/drivers/net/atarilance.c +++ b/drivers/net/atarilance.c @@ -804,8 +804,7 @@ static int lance_start_xmit( struct sk_buff *skb, struct net_device *dev ) ++len; if (len > skb->len) { - skb = skb_padto(skb, len); - if (skb == NULL) + if (skb_padto(skb, len)) return 0; } diff --git a/drivers/net/au1000_eth.c b/drivers/net/au1000_eth.c index 14dbad14a..55f6e3f65 100644 --- a/drivers/net/au1000_eth.c +++ b/drivers/net/au1000_eth.c @@ -2,13 +2,16 @@ * * Alchemy Au1x00 ethernet driver * - * Copyright 2001,2002,2003 MontaVista Software Inc. + * Copyright 2001-2003, 2006 MontaVista Software Inc. * Copyright 2002 TimeSys Corp. * Added ethtool/mii-tool support, * Copyright 2004 Matt Porter * Update: 2004 Bjoern Riemer, riemer@fokus.fraunhofer.de * or riemer@riemer-nt.de: fixed the link beat detection with * ioctls (SIOCGMIIPHY) + * Copyright 2006 Herbert Valerio Riedel + * converted to use linux-2.6.x's PHY framework + * * Author: MontaVista Software, Inc. * ppopov@mvista.com or source@mvista.com * @@ -32,7 +35,6 @@ * */ -#include #include #include #include @@ -53,6 +55,7 @@ #include #include #include +#include #include #include #include @@ -68,7 +71,7 @@ static int au1000_debug = 5; static int au1000_debug = 3; #endif -#define DRV_NAME "au1000eth" +#define DRV_NAME "au1000_eth" #define DRV_VERSION "1.5" #define DRV_AUTHOR "Pete Popov " #define DRV_DESC "Au1xxx on-chip Ethernet driver" @@ -80,7 +83,7 @@ MODULE_LICENSE("GPL"); // prototypes static void hard_stop(struct net_device *); static void enable_rx_tx(struct net_device *dev); -static struct net_device * au1000_probe(u32 ioaddr, int irq, int port_num); +static struct net_device * au1000_probe(int port_num); static int au1000_init(struct net_device *); static int au1000_open(struct net_device *); static int au1000_close(struct net_device *); @@ -88,17 +91,15 @@ static int au1000_tx(struct sk_buff *, struct net_device *); static int au1000_rx(struct net_device *); static irqreturn_t au1000_interrupt(int, void *, struct pt_regs *); static void au1000_tx_timeout(struct net_device *); -static int au1000_set_config(struct net_device *dev, struct ifmap *map); static void set_rx_mode(struct net_device *); static struct net_device_stats *au1000_get_stats(struct net_device *); -static void au1000_timer(unsigned long); static int au1000_ioctl(struct net_device *, struct ifreq *, int); static int mdio_read(struct net_device *, int, int); static void mdio_write(struct net_device *, int, int, u16); -static void dump_mii(struct net_device *dev, int phy_id); +static void au1000_adjust_link(struct net_device *); +static void enable_mac(struct net_device *, int); // externs -extern void ack_rise_edge_irq(unsigned int); extern int get_ethernet_addr(char *ethernet_addr); extern void str2eaddr(unsigned char *ea, unsigned char *str); extern char * __init prom_getcmdline(void); @@ -126,705 +127,83 @@ static unsigned char au1000_mac_addr[6] __devinitdata = { 0x00, 0x50, 0xc2, 0x0c, 0x30, 0x00 }; -#define nibswap(x) ((((x) >> 4) & 0x0f) | (((x) << 4) & 0xf0)) -#define RUN_AT(x) (jiffies + (x)) - -// For reading/writing 32-bit words from/to DMA memory -#define cpu_to_dma32 cpu_to_be32 -#define dma32_to_cpu be32_to_cpu - struct au1000_private *au_macs[NUM_ETH_INTERFACES]; -/* FIXME - * All of the PHY code really should be detached from the MAC - * code. +/* + * board-specific configurations + * + * PHY detection algorithm + * + * If AU1XXX_PHY_STATIC_CONFIG is undefined, the PHY setup is + * autodetected: + * + * mii_probe() first searches the current MAC's MII bus for a PHY, + * selecting the first (or last, if AU1XXX_PHY_SEARCH_HIGHEST_ADDR is + * defined) PHY address not already claimed by another netdev. + * + * If nothing was found that way when searching for the 2nd ethernet + * controller's PHY and AU1XXX_PHY1_SEARCH_ON_MAC0 is defined, then + * the first MII bus is searched as well for an unclaimed PHY; this is + * needed in case of a dual-PHY accessible only through the MAC0's MII + * bus. + * + * Finally, if no PHY is found, then the corresponding ethernet + * controller is not registered to the network subsystem. */ -/* Default advertise */ -#define GENMII_DEFAULT_ADVERTISE \ - ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full | \ - ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full | \ - ADVERTISED_Autoneg - -#define GENMII_DEFAULT_FEATURES \ - SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | \ - SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | \ - SUPPORTED_Autoneg - -int bcm_5201_init(struct net_device *dev, int phy_addr) -{ - s16 data; - - /* Stop auto-negotiation */ - data = mdio_read(dev, phy_addr, MII_CONTROL); - mdio_write(dev, phy_addr, MII_CONTROL, data & ~MII_CNTL_AUTO); - - /* Set advertisement to 10/100 and Half/Full duplex - * (full capabilities) */ - data = mdio_read(dev, phy_addr, MII_ANADV); - data |= MII_NWAY_TX | MII_NWAY_TX_FDX | MII_NWAY_T_FDX | MII_NWAY_T; - mdio_write(dev, phy_addr, MII_ANADV, data); - - /* Restart auto-negotiation */ - data = mdio_read(dev, phy_addr, MII_CONTROL); - data |= MII_CNTL_RST_AUTO | MII_CNTL_AUTO; - mdio_write(dev, phy_addr, MII_CONTROL, data); - - if (au1000_debug > 4) - dump_mii(dev, phy_addr); - return 0; -} - -int bcm_5201_reset(struct net_device *dev, int phy_addr) -{ - s16 mii_control, timeout; - - mii_control = mdio_read(dev, phy_addr, MII_CONTROL); - mdio_write(dev, phy_addr, MII_CONTROL, mii_control | MII_CNTL_RESET); - mdelay(1); - for (timeout = 100; timeout > 0; --timeout) { - mii_control = mdio_read(dev, phy_addr, MII_CONTROL); - if ((mii_control & MII_CNTL_RESET) == 0) - break; - mdelay(1); - } - if (mii_control & MII_CNTL_RESET) { - printk(KERN_ERR "%s PHY reset timeout !\n", dev->name); - return -1; - } - return 0; -} - -int -bcm_5201_status(struct net_device *dev, int phy_addr, u16 *link, u16 *speed) -{ - u16 mii_data; - struct au1000_private *aup; - - if (!dev) { - printk(KERN_ERR "bcm_5201_status error: NULL dev\n"); - return -1; - } - aup = (struct au1000_private *) dev->priv; - - mii_data = mdio_read(dev, aup->phy_addr, MII_STATUS); - if (mii_data & MII_STAT_LINK) { - *link = 1; - mii_data = mdio_read(dev, aup->phy_addr, MII_AUX_CNTRL); - if (mii_data & MII_AUX_100) { - if (mii_data & MII_AUX_FDX) { - *speed = IF_PORT_100BASEFX; - dev->if_port = IF_PORT_100BASEFX; - } - else { - *speed = IF_PORT_100BASETX; - dev->if_port = IF_PORT_100BASETX; - } - } - else { - *speed = IF_PORT_10BASET; - dev->if_port = IF_PORT_10BASET; - } - - } - else { - *link = 0; - *speed = 0; - dev->if_port = IF_PORT_UNKNOWN; - } - return 0; -} - -int lsi_80227_init(struct net_device *dev, int phy_addr) -{ - if (au1000_debug > 4) - printk("lsi_80227_init\n"); - - /* restart auto-negotiation */ - mdio_write(dev, phy_addr, MII_CONTROL, - MII_CNTL_F100 | MII_CNTL_AUTO | MII_CNTL_RST_AUTO); // | MII_CNTL_FDX); - mdelay(1); - - /* set up LEDs to correct display */ -#ifdef CONFIG_MIPS_MTX1 - mdio_write(dev, phy_addr, 17, 0xff80); -#else - mdio_write(dev, phy_addr, 17, 0xffc0); -#endif - - if (au1000_debug > 4) - dump_mii(dev, phy_addr); - return 0; -} - -int lsi_80227_reset(struct net_device *dev, int phy_addr) -{ - s16 mii_control, timeout; - - if (au1000_debug > 4) { - printk("lsi_80227_reset\n"); - dump_mii(dev, phy_addr); - } - - mii_control = mdio_read(dev, phy_addr, MII_CONTROL); - mdio_write(dev, phy_addr, MII_CONTROL, mii_control | MII_CNTL_RESET); - mdelay(1); - for (timeout = 100; timeout > 0; --timeout) { - mii_control = mdio_read(dev, phy_addr, MII_CONTROL); - if ((mii_control & MII_CNTL_RESET) == 0) - break; - mdelay(1); - } - if (mii_control & MII_CNTL_RESET) { - printk(KERN_ERR "%s PHY reset timeout !\n", dev->name); - return -1; - } - return 0; -} - -int -lsi_80227_status(struct net_device *dev, int phy_addr, u16 *link, u16 *speed) -{ - u16 mii_data; - struct au1000_private *aup; - - if (!dev) { - printk(KERN_ERR "lsi_80227_status error: NULL dev\n"); - return -1; - } - aup = (struct au1000_private *) dev->priv; - - mii_data = mdio_read(dev, aup->phy_addr, MII_STATUS); - if (mii_data & MII_STAT_LINK) { - *link = 1; - mii_data = mdio_read(dev, aup->phy_addr, MII_LSI_PHY_STAT); - if (mii_data & MII_LSI_PHY_STAT_SPD) { - if (mii_data & MII_LSI_PHY_STAT_FDX) { - *speed = IF_PORT_100BASEFX; - dev->if_port = IF_PORT_100BASEFX; - } - else { - *speed = IF_PORT_100BASETX; - dev->if_port = IF_PORT_100BASETX; - } - } - else { - *speed = IF_PORT_10BASET; - dev->if_port = IF_PORT_10BASET; - } - - } - else { - *link = 0; - *speed = 0; - dev->if_port = IF_PORT_UNKNOWN; - } - return 0; -} - -int am79c901_init(struct net_device *dev, int phy_addr) -{ - printk("am79c901_init\n"); - return 0; -} - -int am79c901_reset(struct net_device *dev, int phy_addr) -{ - printk("am79c901_reset\n"); - return 0; -} - -int -am79c901_status(struct net_device *dev, int phy_addr, u16 *link, u16 *speed) -{ - return 0; -} - -int am79c874_init(struct net_device *dev, int phy_addr) -{ - s16 data; - - /* 79c874 has quit resembled bit assignments to BCM5201 */ - if (au1000_debug > 4) - printk("am79c847_init\n"); - - /* Stop auto-negotiation */ - data = mdio_read(dev, phy_addr, MII_CONTROL); - mdio_write(dev, phy_addr, MII_CONTROL, data & ~MII_CNTL_AUTO); - - /* Set advertisement to 10/100 and Half/Full duplex - * (full capabilities) */ - data = mdio_read(dev, phy_addr, MII_ANADV); - data |= MII_NWAY_TX | MII_NWAY_TX_FDX | MII_NWAY_T_FDX | MII_NWAY_T; - mdio_write(dev, phy_addr, MII_ANADV, data); - - /* Restart auto-negotiation */ - data = mdio_read(dev, phy_addr, MII_CONTROL); - data |= MII_CNTL_RST_AUTO | MII_CNTL_AUTO; - - mdio_write(dev, phy_addr, MII_CONTROL, data); - - if (au1000_debug > 4) dump_mii(dev, phy_addr); - return 0; -} - -int am79c874_reset(struct net_device *dev, int phy_addr) -{ - s16 mii_control, timeout; - - if (au1000_debug > 4) - printk("am79c874_reset\n"); - - mii_control = mdio_read(dev, phy_addr, MII_CONTROL); - mdio_write(dev, phy_addr, MII_CONTROL, mii_control | MII_CNTL_RESET); - mdelay(1); - for (timeout = 100; timeout > 0; --timeout) { - mii_control = mdio_read(dev, phy_addr, MII_CONTROL); - if ((mii_control & MII_CNTL_RESET) == 0) - break; - mdelay(1); - } - if (mii_control & MII_CNTL_RESET) { - printk(KERN_ERR "%s PHY reset timeout !\n", dev->name); - return -1; - } - return 0; -} - -int -am79c874_status(struct net_device *dev, int phy_addr, u16 *link, u16 *speed) -{ - u16 mii_data; - struct au1000_private *aup; - - // printk("am79c874_status\n"); - if (!dev) { - printk(KERN_ERR "am79c874_status error: NULL dev\n"); - return -1; - } - - aup = (struct au1000_private *) dev->priv; - mii_data = mdio_read(dev, aup->phy_addr, MII_STATUS); - - if (mii_data & MII_STAT_LINK) { - *link = 1; - mii_data = mdio_read(dev, aup->phy_addr, MII_AMD_PHY_STAT); - if (mii_data & MII_AMD_PHY_STAT_SPD) { - if (mii_data & MII_AMD_PHY_STAT_FDX) { - *speed = IF_PORT_100BASEFX; - dev->if_port = IF_PORT_100BASEFX; - } - else { - *speed = IF_PORT_100BASETX; - dev->if_port = IF_PORT_100BASETX; - } - } - else { - *speed = IF_PORT_10BASET; - dev->if_port = IF_PORT_10BASET; - } - - } - else { - *link = 0; - *speed = 0; - dev->if_port = IF_PORT_UNKNOWN; - } - return 0; -} - -int lxt971a_init(struct net_device *dev, int phy_addr) -{ - if (au1000_debug > 4) - printk("lxt971a_init\n"); - - /* restart auto-negotiation */ - mdio_write(dev, phy_addr, MII_CONTROL, - MII_CNTL_F100 | MII_CNTL_AUTO | MII_CNTL_RST_AUTO | MII_CNTL_FDX); - - /* set up LEDs to correct display */ - mdio_write(dev, phy_addr, 20, 0x0422); - - if (au1000_debug > 4) - dump_mii(dev, phy_addr); - return 0; -} - -int lxt971a_reset(struct net_device *dev, int phy_addr) -{ - s16 mii_control, timeout; - - if (au1000_debug > 4) { - printk("lxt971a_reset\n"); - dump_mii(dev, phy_addr); - } - - mii_control = mdio_read(dev, phy_addr, MII_CONTROL); - mdio_write(dev, phy_addr, MII_CONTROL, mii_control | MII_CNTL_RESET); - mdelay(1); - for (timeout = 100; timeout > 0; --timeout) { - mii_control = mdio_read(dev, phy_addr, MII_CONTROL); - if ((mii_control & MII_CNTL_RESET) == 0) - break; - mdelay(1); - } - if (mii_control & MII_CNTL_RESET) { - printk(KERN_ERR "%s PHY reset timeout !\n", dev->name); - return -1; - } - return 0; -} - -int -lxt971a_status(struct net_device *dev, int phy_addr, u16 *link, u16 *speed) -{ - u16 mii_data; - struct au1000_private *aup; - - if (!dev) { - printk(KERN_ERR "lxt971a_status error: NULL dev\n"); - return -1; - } - aup = (struct au1000_private *) dev->priv; - - mii_data = mdio_read(dev, aup->phy_addr, MII_STATUS); - if (mii_data & MII_STAT_LINK) { - *link = 1; - mii_data = mdio_read(dev, aup->phy_addr, MII_INTEL_PHY_STAT); - if (mii_data & MII_INTEL_PHY_STAT_SPD) { - if (mii_data & MII_INTEL_PHY_STAT_FDX) { - *speed = IF_PORT_100BASEFX; - dev->if_port = IF_PORT_100BASEFX; - } - else { - *speed = IF_PORT_100BASETX; - dev->if_port = IF_PORT_100BASETX; - } - } - else { - *speed = IF_PORT_10BASET; - dev->if_port = IF_PORT_10BASET; - } - - } - else { - *link = 0; - *speed = 0; - dev->if_port = IF_PORT_UNKNOWN; - } - return 0; -} - -int ks8995m_init(struct net_device *dev, int phy_addr) -{ - s16 data; - -// printk("ks8995m_init\n"); - /* Stop auto-negotiation */ - data = mdio_read(dev, phy_addr, MII_CONTROL); - mdio_write(dev, phy_addr, MII_CONTROL, data & ~MII_CNTL_AUTO); - - /* Set advertisement to 10/100 and Half/Full duplex - * (full capabilities) */ - data = mdio_read(dev, phy_addr, MII_ANADV); - data |= MII_NWAY_TX | MII_NWAY_TX_FDX | MII_NWAY_T_FDX | MII_NWAY_T; - mdio_write(dev, phy_addr, MII_ANADV, data); - - /* Restart auto-negotiation */ - data = mdio_read(dev, phy_addr, MII_CONTROL); - data |= MII_CNTL_RST_AUTO | MII_CNTL_AUTO; - mdio_write(dev, phy_addr, MII_CONTROL, data); - - if (au1000_debug > 4) dump_mii(dev, phy_addr); - - return 0; -} - -int ks8995m_reset(struct net_device *dev, int phy_addr) -{ - s16 mii_control, timeout; - -// printk("ks8995m_reset\n"); - mii_control = mdio_read(dev, phy_addr, MII_CONTROL); - mdio_write(dev, phy_addr, MII_CONTROL, mii_control | MII_CNTL_RESET); - mdelay(1); - for (timeout = 100; timeout > 0; --timeout) { - mii_control = mdio_read(dev, phy_addr, MII_CONTROL); - if ((mii_control & MII_CNTL_RESET) == 0) - break; - mdelay(1); - } - if (mii_control & MII_CNTL_RESET) { - printk(KERN_ERR "%s PHY reset timeout !\n", dev->name); - return -1; - } - return 0; -} - -int ks8995m_status(struct net_device *dev, int phy_addr, u16 *link, u16 *speed) -{ - u16 mii_data; - struct au1000_private *aup; - - if (!dev) { - printk(KERN_ERR "ks8995m_status error: NULL dev\n"); - return -1; - } - aup = (struct au1000_private *) dev->priv; - - mii_data = mdio_read(dev, aup->phy_addr, MII_STATUS); - if (mii_data & MII_STAT_LINK) { - *link = 1; - mii_data = mdio_read(dev, aup->phy_addr, MII_AUX_CNTRL); - if (mii_data & MII_AUX_100) { - if (mii_data & MII_AUX_FDX) { - *speed = IF_PORT_100BASEFX; - dev->if_port = IF_PORT_100BASEFX; - } - else { - *speed = IF_PORT_100BASETX; - dev->if_port = IF_PORT_100BASETX; - } - } - else { - *speed = IF_PORT_10BASET; - dev->if_port = IF_PORT_10BASET; - } - - } - else { - *link = 0; - *speed = 0; - dev->if_port = IF_PORT_UNKNOWN; - } - return 0; -} - -int -smsc_83C185_init (struct net_device *dev, int phy_addr) -{ - s16 data; - - if (au1000_debug > 4) - printk("smsc_83C185_init\n"); - - /* Stop auto-negotiation */ - data = mdio_read(dev, phy_addr, MII_CONTROL); - mdio_write(dev, phy_addr, MII_CONTROL, data & ~MII_CNTL_AUTO); - - /* Set advertisement to 10/100 and Half/Full duplex - * (full capabilities) */ - data = mdio_read(dev, phy_addr, MII_ANADV); - data |= MII_NWAY_TX | MII_NWAY_TX_FDX | MII_NWAY_T_FDX | MII_NWAY_T; - mdio_write(dev, phy_addr, MII_ANADV, data); - - /* Restart auto-negotiation */ - data = mdio_read(dev, phy_addr, MII_CONTROL); - data |= MII_CNTL_RST_AUTO | MII_CNTL_AUTO; - - mdio_write(dev, phy_addr, MII_CONTROL, data); - - if (au1000_debug > 4) dump_mii(dev, phy_addr); - return 0; -} - -int -smsc_83C185_reset (struct net_device *dev, int phy_addr) -{ - s16 mii_control, timeout; - - if (au1000_debug > 4) - printk("smsc_83C185_reset\n"); - - mii_control = mdio_read(dev, phy_addr, MII_CONTROL); - mdio_write(dev, phy_addr, MII_CONTROL, mii_control | MII_CNTL_RESET); - mdelay(1); - for (timeout = 100; timeout > 0; --timeout) { - mii_control = mdio_read(dev, phy_addr, MII_CONTROL); - if ((mii_control & MII_CNTL_RESET) == 0) - break; - mdelay(1); - } - if (mii_control & MII_CNTL_RESET) { - printk(KERN_ERR "%s PHY reset timeout !\n", dev->name); - return -1; - } - return 0; -} - -int -smsc_83C185_status (struct net_device *dev, int phy_addr, u16 *link, u16 *speed) -{ - u16 mii_data; - struct au1000_private *aup; - - if (!dev) { - printk(KERN_ERR "smsc_83C185_status error: NULL dev\n"); - return -1; - } - - aup = (struct au1000_private *) dev->priv; - mii_data = mdio_read(dev, aup->phy_addr, MII_STATUS); - - if (mii_data & MII_STAT_LINK) { - *link = 1; - mii_data = mdio_read(dev, aup->phy_addr, 0x1f); - if (mii_data & (1<<3)) { - if (mii_data & (1<<4)) { - *speed = IF_PORT_100BASEFX; - dev->if_port = IF_PORT_100BASEFX; - } - else { - *speed = IF_PORT_100BASETX; - dev->if_port = IF_PORT_100BASETX; - } - } - else { - *speed = IF_PORT_10BASET; - dev->if_port = IF_PORT_10BASET; - } - } - else { - *link = 0; - *speed = 0; - dev->if_port = IF_PORT_UNKNOWN; - } - return 0; -} - - -#ifdef CONFIG_MIPS_BOSPORUS -int stub_init(struct net_device *dev, int phy_addr) -{ - //printk("PHY stub_init\n"); - return 0; -} +/* autodetection defaults */ +#undef AU1XXX_PHY_SEARCH_HIGHEST_ADDR +#define AU1XXX_PHY1_SEARCH_ON_MAC0 -int stub_reset(struct net_device *dev, int phy_addr) -{ - //printk("PHY stub_reset\n"); - return 0; -} - -int -stub_status(struct net_device *dev, int phy_addr, u16 *link, u16 *speed) -{ - //printk("PHY stub_status\n"); - *link = 1; - /* hmmm, revisit */ - *speed = IF_PORT_100BASEFX; - dev->if_port = IF_PORT_100BASEFX; - return 0; -} -#endif - -struct phy_ops bcm_5201_ops = { - bcm_5201_init, - bcm_5201_reset, - bcm_5201_status, -}; - -struct phy_ops am79c874_ops = { - am79c874_init, - am79c874_reset, - am79c874_status, -}; - -struct phy_ops am79c901_ops = { - am79c901_init, - am79c901_reset, - am79c901_status, -}; - -struct phy_ops lsi_80227_ops = { - lsi_80227_init, - lsi_80227_reset, - lsi_80227_status, -}; - -struct phy_ops lxt971a_ops = { - lxt971a_init, - lxt971a_reset, - lxt971a_status, -}; +/* static PHY setup + * + * most boards PHY setup should be detectable properly with the + * autodetection algorithm in mii_probe(), but in some cases (e.g. if + * you have a switch attached, or want to use the PHY's interrupt + * notification capabilities) you can provide a static PHY + * configuration here + * + * IRQs may only be set, if a PHY address was configured + * If a PHY address is given, also a bus id is required to be set + * + * ps: make sure the used irqs are configured properly in the board + * specific irq-map + */ -struct phy_ops ks8995m_ops = { - ks8995m_init, - ks8995m_reset, - ks8995m_status, -}; +#if defined(CONFIG_MIPS_BOSPORUS) +/* + * Micrel/Kendin 5 port switch attached to MAC0, + * MAC0 is associated with PHY address 5 (== WAN port) + * MAC1 is not associated with any PHY, since it's connected directly + * to the switch. + * no interrupts are used + */ +# define AU1XXX_PHY_STATIC_CONFIG -struct phy_ops smsc_83C185_ops = { - smsc_83C185_init, - smsc_83C185_reset, - smsc_83C185_status, -}; +# define AU1XXX_PHY0_ADDR 5 +# define AU1XXX_PHY0_BUSID 0 +# undef AU1XXX_PHY0_IRQ -#ifdef CONFIG_MIPS_BOSPORUS -struct phy_ops stub_ops = { - stub_init, - stub_reset, - stub_status, -}; +# undef AU1XXX_PHY1_ADDR +# undef AU1XXX_PHY1_BUSID +# undef AU1XXX_PHY1_IRQ #endif -static struct mii_chip_info { - const char * name; - u16 phy_id0; - u16 phy_id1; - struct phy_ops *phy_ops; - int dual_phy; -} mii_chip_table[] = { - {"Broadcom BCM5201 10/100 BaseT PHY",0x0040,0x6212, &bcm_5201_ops,0}, - {"Broadcom BCM5221 10/100 BaseT PHY",0x0040,0x61e4, &bcm_5201_ops,0}, - {"Broadcom BCM5222 10/100 BaseT PHY",0x0040,0x6322, &bcm_5201_ops,1}, - {"NS DP83847 PHY", 0x2000, 0x5c30, &bcm_5201_ops ,0}, - {"AMD 79C901 HomePNA PHY",0x0000,0x35c8, &am79c901_ops,0}, - {"AMD 79C874 10/100 BaseT PHY",0x0022,0x561b, &am79c874_ops,0}, - {"LSI 80227 10/100 BaseT PHY",0x0016,0xf840, &lsi_80227_ops,0}, - {"Intel LXT971A Dual Speed PHY",0x0013,0x78e2, &lxt971a_ops,0}, - {"Kendin KS8995M 10/100 BaseT PHY",0x0022,0x1450, &ks8995m_ops,0}, - {"SMSC LAN83C185 10/100 BaseT PHY",0x0007,0xc0a3, &smsc_83C185_ops,0}, -#ifdef CONFIG_MIPS_BOSPORUS - {"Stub", 0x1234, 0x5678, &stub_ops }, +#if defined(AU1XXX_PHY0_BUSID) && (AU1XXX_PHY0_BUSID > 0) +# error MAC0-associated PHY attached 2nd MACs MII bus not supported yet #endif - {0,}, -}; -static int mdio_read(struct net_device *dev, int phy_id, int reg) +/* + * MII operations + */ +static int mdio_read(struct net_device *dev, int phy_addr, int reg) { struct au1000_private *aup = (struct au1000_private *) dev->priv; - volatile u32 *mii_control_reg; - volatile u32 *mii_data_reg; + volatile u32 *const mii_control_reg = &aup->mac->mii_control; + volatile u32 *const mii_data_reg = &aup->mac->mii_data; u32 timedout = 20; u32 mii_control; - #ifdef CONFIG_BCM5222_DUAL_PHY - /* First time we probe, it's for the mac0 phy. - * Since we haven't determined yet that we have a dual phy, - * aup->mii->mii_control_reg won't be setup and we'll - * default to the else statement. - * By the time we probe for the mac1 phy, the mii_control_reg - * will be setup to be the address of the mac0 phy control since - * both phys are controlled through mac0. - */ - if (aup->mii && aup->mii->mii_control_reg) { - mii_control_reg = aup->mii->mii_control_reg; - mii_data_reg = aup->mii->mii_data_reg; - } - else if (au_macs[0]->mii && au_macs[0]->mii->mii_control_reg) { - /* assume both phys are controlled through mac0 */ - mii_control_reg = au_macs[0]->mii->mii_control_reg; - mii_data_reg = au_macs[0]->mii->mii_data_reg; - } - else - #endif - { - /* default control and data reg addresses */ - mii_control_reg = &aup->mac->mii_control; - mii_data_reg = &aup->mac->mii_data; - } - while (*mii_control_reg & MAC_MII_BUSY) { mdelay(1); if (--timedout == 0) { @@ -835,7 +214,7 @@ static int mdio_read(struct net_device *dev, int phy_id, int reg) } mii_control = MAC_SET_MII_SELECT_REG(reg) | - MAC_SET_MII_SELECT_PHY(phy_id) | MAC_MII_READ; + MAC_SET_MII_SELECT_PHY(phy_addr) | MAC_MII_READ; *mii_control_reg = mii_control; @@ -851,32 +230,14 @@ static int mdio_read(struct net_device *dev, int phy_id, int reg) return (int)*mii_data_reg; } -static void mdio_write(struct net_device *dev, int phy_id, int reg, u16 value) +static void mdio_write(struct net_device *dev, int phy_addr, int reg, u16 value) { struct au1000_private *aup = (struct au1000_private *) dev->priv; - volatile u32 *mii_control_reg; - volatile u32 *mii_data_reg; + volatile u32 *const mii_control_reg = &aup->mac->mii_control; + volatile u32 *const mii_data_reg = &aup->mac->mii_data; u32 timedout = 20; u32 mii_control; - #ifdef CONFIG_BCM5222_DUAL_PHY - if (aup->mii && aup->mii->mii_control_reg) { - mii_control_reg = aup->mii->mii_control_reg; - mii_data_reg = aup->mii->mii_data_reg; - } - else if (au_macs[0]->mii && au_macs[0]->mii->mii_control_reg) { - /* assume both phys are controlled through mac0 */ - mii_control_reg = au_macs[0]->mii->mii_control_reg; - mii_data_reg = au_macs[0]->mii->mii_data_reg; - } - else - #endif - { - /* default control and data reg addresses */ - mii_control_reg = &aup->mac->mii_control; - mii_data_reg = &aup->mac->mii_data; - } - while (*mii_control_reg & MAC_MII_BUSY) { mdelay(1); if (--timedout == 0) { @@ -887,165 +248,145 @@ static void mdio_write(struct net_device *dev, int phy_id, int reg, u16 value) } mii_control = MAC_SET_MII_SELECT_REG(reg) | - MAC_SET_MII_SELECT_PHY(phy_id) | MAC_MII_WRITE; + MAC_SET_MII_SELECT_PHY(phy_addr) | MAC_MII_WRITE; *mii_data_reg = value; *mii_control_reg = mii_control; } +static int mdiobus_read(struct mii_bus *bus, int phy_addr, int regnum) +{ + /* WARNING: bus->phy_map[phy_addr].attached_dev == dev does + * _NOT_ hold (e.g. when PHY is accessed through other MAC's MII bus) */ + struct net_device *const dev = bus->priv; + + enable_mac(dev, 0); /* make sure the MAC associated with this + * mii_bus is enabled */ + return mdio_read(dev, phy_addr, regnum); +} -static void dump_mii(struct net_device *dev, int phy_id) +static int mdiobus_write(struct mii_bus *bus, int phy_addr, int regnum, + u16 value) { - int i, val; + struct net_device *const dev = bus->priv; - for (i = 0; i < 7; i++) { - if ((val = mdio_read(dev, phy_id, i)) >= 0) - printk("%s: MII Reg %d=%x\n", dev->name, i, val); - } - for (i = 16; i < 25; i++) { - if ((val = mdio_read(dev, phy_id, i)) >= 0) - printk("%s: MII Reg %d=%x\n", dev->name, i, val); - } + enable_mac(dev, 0); /* make sure the MAC associated with this + * mii_bus is enabled */ + mdio_write(dev, phy_addr, regnum, value); + return 0; } -static int mii_probe (struct net_device * dev) +static int mdiobus_reset(struct mii_bus *bus) { - struct au1000_private *aup = (struct au1000_private *) dev->priv; - int phy_addr; -#ifdef CONFIG_MIPS_BOSPORUS - int phy_found=0; -#endif + struct net_device *const dev = bus->priv; - /* search for total of 32 possible mii phy addresses */ - for (phy_addr = 0; phy_addr < 32; phy_addr++) { - u16 mii_status; - u16 phy_id0, phy_id1; - int i; + enable_mac(dev, 0); /* make sure the MAC associated with this + * mii_bus is enabled */ + return 0; +} - #ifdef CONFIG_BCM5222_DUAL_PHY - /* Mask the already found phy, try next one */ - if (au_macs[0]->mii && au_macs[0]->mii->mii_control_reg) { - if (au_macs[0]->phy_addr == phy_addr) - continue; - } - #endif - - mii_status = mdio_read(dev, phy_addr, MII_STATUS); - if (mii_status == 0xffff || mii_status == 0x0000) - /* the mii is not accessable, try next one */ - continue; - - phy_id0 = mdio_read(dev, phy_addr, MII_PHY_ID0); - phy_id1 = mdio_read(dev, phy_addr, MII_PHY_ID1); - - /* search our mii table for the current mii */ - for (i = 0; mii_chip_table[i].phy_id1; i++) { - if (phy_id0 == mii_chip_table[i].phy_id0 && - phy_id1 == mii_chip_table[i].phy_id1) { - struct mii_phy * mii_phy = aup->mii; - - printk(KERN_INFO "%s: %s at phy address %d\n", - dev->name, mii_chip_table[i].name, - phy_addr); -#ifdef CONFIG_MIPS_BOSPORUS - phy_found = 1; -#endif - mii_phy->chip_info = mii_chip_table+i; - aup->phy_addr = phy_addr; - aup->want_autoneg = 1; - aup->phy_ops = mii_chip_table[i].phy_ops; - aup->phy_ops->phy_init(dev,phy_addr); - - // Check for dual-phy and then store required - // values and set indicators. We need to do - // this now since mdio_{read,write} need the - // control and data register addresses. - #ifdef CONFIG_BCM5222_DUAL_PHY - if ( mii_chip_table[i].dual_phy) { - - /* assume both phys are controlled - * through MAC0. Board specific? */ - - /* sanity check */ - if (!au_macs[0] || !au_macs[0]->mii) - return -1; - aup->mii->mii_control_reg = (u32 *) - &au_macs[0]->mac->mii_control; - aup->mii->mii_data_reg = (u32 *) - &au_macs[0]->mac->mii_data; - } - #endif - goto found; - } +static int mii_probe (struct net_device *dev) +{ + struct au1000_private *const aup = (struct au1000_private *) dev->priv; + struct phy_device *phydev = NULL; + +#if defined(AU1XXX_PHY_STATIC_CONFIG) + BUG_ON(aup->mac_id < 0 || aup->mac_id > 1); + + if(aup->mac_id == 0) { /* get PHY0 */ +# if defined(AU1XXX_PHY0_ADDR) + phydev = au_macs[AU1XXX_PHY0_BUSID]->mii_bus.phy_map[AU1XXX_PHY0_ADDR]; +# else + printk (KERN_INFO DRV_NAME ":%s: using PHY-less setup\n", + dev->name); + return 0; +# endif /* defined(AU1XXX_PHY0_ADDR) */ + } else if (aup->mac_id == 1) { /* get PHY1 */ +# if defined(AU1XXX_PHY1_ADDR) + phydev = au_macs[AU1XXX_PHY1_BUSID]->mii_bus.phy_map[AU1XXX_PHY1_ADDR]; +# else + printk (KERN_INFO DRV_NAME ":%s: using PHY-less setup\n", + dev->name); + return 0; +# endif /* defined(AU1XXX_PHY1_ADDR) */ + } + +#else /* defined(AU1XXX_PHY_STATIC_CONFIG) */ + int phy_addr; + + /* find the first (lowest address) PHY on the current MAC's MII bus */ + for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) + if (aup->mii_bus.phy_map[phy_addr]) { + phydev = aup->mii_bus.phy_map[phy_addr]; +# if !defined(AU1XXX_PHY_SEARCH_HIGHEST_ADDR) + break; /* break out with first one found */ +# endif } - } -found: - -#ifdef CONFIG_MIPS_BOSPORUS - /* This is a workaround for the Micrel/Kendin 5 port switch - The second MAC doesn't see a PHY connected... so we need to - trick it into thinking we have one. - - If this kernel is run on another Au1500 development board - the stub will be found as well as the actual PHY. However, - the last found PHY will be used... usually at Addr 31 (Db1500). - */ - if ( (!phy_found) ) - { - u16 phy_id0, phy_id1; - int i; - phy_id0 = 0x1234; - phy_id1 = 0x5678; - - /* search our mii table for the current mii */ - for (i = 0; mii_chip_table[i].phy_id1; i++) { - if (phy_id0 == mii_chip_table[i].phy_id0 && - phy_id1 == mii_chip_table[i].phy_id1) { - struct mii_phy * mii_phy; - - printk(KERN_INFO "%s: %s at phy address %d\n", - dev->name, mii_chip_table[i].name, - phy_addr); - mii_phy = kmalloc(sizeof(struct mii_phy), - GFP_KERNEL); - if (mii_phy) { - mii_phy->chip_info = mii_chip_table+i; - aup->phy_addr = phy_addr; - mii_phy->next = aup->mii; - aup->phy_ops = - mii_chip_table[i].phy_ops; - aup->mii = mii_phy; - aup->phy_ops->phy_init(dev,phy_addr); - } else { - printk(KERN_ERR "%s: out of memory\n", - dev->name); - return -1; - } - mii_phy->chip_info = mii_chip_table+i; - aup->phy_addr = phy_addr; - aup->phy_ops = mii_chip_table[i].phy_ops; - aup->phy_ops->phy_init(dev,phy_addr); - break; - } +# if defined(AU1XXX_PHY1_SEARCH_ON_MAC0) + /* try harder to find a PHY */ + if (!phydev && (aup->mac_id == 1)) { + /* no PHY found, maybe we have a dual PHY? */ + printk (KERN_INFO DRV_NAME ": no PHY found on MAC1, " + "let's see if it's attached to MAC0...\n"); + + BUG_ON(!au_macs[0]); + + /* find the first (lowest address) non-attached PHY on + * the MAC0 MII bus */ + for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) { + struct phy_device *const tmp_phydev = + au_macs[0]->mii_bus.phy_map[phy_addr]; + + if (!tmp_phydev) + continue; /* no PHY here... */ + + if (tmp_phydev->attached_dev) + continue; /* already claimed by MAC0 */ + + phydev = tmp_phydev; + break; /* found it */ } } - if (aup->mac_id == 0) { - /* the Bosporus phy responds to addresses 0-5 but - * 5 is the correct one. - */ - aup->phy_addr = 5; - } -#endif +# endif /* defined(AU1XXX_PHY1_SEARCH_OTHER_BUS) */ - if (aup->mii->chip_info == NULL) { - printk(KERN_ERR "%s: Au1x No known MII transceivers found!\n", - dev->name); +#endif /* defined(AU1XXX_PHY_STATIC_CONFIG) */ + if (!phydev) { + printk (KERN_ERR DRV_NAME ":%s: no PHY found\n", dev->name); return -1; } - printk(KERN_INFO "%s: Using %s as default\n", - dev->name, aup->mii->chip_info->name); + /* now we are supposed to have a proper phydev, to attach to... */ + BUG_ON(!phydev); + BUG_ON(phydev->attached_dev); + + phydev = phy_connect(dev, phydev->dev.bus_id, &au1000_adjust_link, 0); + + if (IS_ERR(phydev)) { + printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name); + return PTR_ERR(phydev); + } + + /* mask with MAC supported features */ + phydev->supported &= (SUPPORTED_10baseT_Half + | SUPPORTED_10baseT_Full + | SUPPORTED_100baseT_Half + | SUPPORTED_100baseT_Full + | SUPPORTED_Autoneg + /* | SUPPORTED_Pause | SUPPORTED_Asym_Pause */ + | SUPPORTED_MII + | SUPPORTED_TP); + + phydev->advertising = phydev->supported; + + aup->old_link = 0; + aup->old_speed = 0; + aup->old_duplex = -1; + aup->phy_dev = phydev; + + printk(KERN_INFO "%s: attached PHY driver [%s] " + "(mii_bus:phy_addr=%s, irq=%d)\n", + dev->name, phydev->drv->name, phydev->dev.bus_id, phydev->irq); return 0; } @@ -1097,35 +438,38 @@ static void hard_stop(struct net_device *dev) au_sync_delay(10); } - -static void reset_mac(struct net_device *dev) +static void enable_mac(struct net_device *dev, int force_reset) { - int i; - u32 flags; + unsigned long flags; struct au1000_private *aup = (struct au1000_private *) dev->priv; - if (au1000_debug > 4) - printk(KERN_INFO "%s: reset mac, aup %x\n", - dev->name, (unsigned)aup); - spin_lock_irqsave(&aup->lock, flags); - if (aup->timer.function == &au1000_timer) {/* check if timer initted */ - del_timer(&aup->timer); - } - hard_stop(dev); - #ifdef CONFIG_BCM5222_DUAL_PHY - if (aup->mac_id != 0) { - #endif - /* If BCM5222, we can't leave MAC0 in reset because then - * we can't access the dual phy for ETH1 */ + if(force_reset || (!aup->mac_enabled)) { *aup->enable = MAC_EN_CLOCK_ENABLE; au_sync_delay(2); - *aup->enable = 0; + *aup->enable = (MAC_EN_RESET0 | MAC_EN_RESET1 | MAC_EN_RESET2 + | MAC_EN_CLOCK_ENABLE); au_sync_delay(2); - #ifdef CONFIG_BCM5222_DUAL_PHY + + aup->mac_enabled = 1; } - #endif + + spin_unlock_irqrestore(&aup->lock, flags); +} + +static void reset_mac_unlocked(struct net_device *dev) +{ + struct au1000_private *const aup = (struct au1000_private *) dev->priv; + int i; + + hard_stop(dev); + + *aup->enable = MAC_EN_CLOCK_ENABLE; + au_sync_delay(2); + *aup->enable = 0; + au_sync_delay(2); + aup->tx_full = 0; for (i = 0; i < NUM_RX_DMA; i++) { /* reset control bits */ @@ -1135,9 +479,26 @@ static void reset_mac(struct net_device *dev) /* reset control bits */ aup->tx_dma_ring[i]->buff_stat &= ~0xf; } - spin_unlock_irqrestore(&aup->lock, flags); + + aup->mac_enabled = 0; + } +static void reset_mac(struct net_device *dev) +{ + struct au1000_private *const aup = (struct au1000_private *) dev->priv; + unsigned long flags; + + if (au1000_debug > 4) + printk(KERN_INFO "%s: reset mac, aup %x\n", + dev->name, (unsigned)aup); + + spin_lock_irqsave(&aup->lock, flags); + + reset_mac_unlocked (dev); + + spin_unlock_irqrestore(&aup->lock, flags); +} /* * Setup the receive and transmit "rings". These pointers are the addresses @@ -1160,12 +521,27 @@ setup_hw_rings(struct au1000_private *aup, u32 rx_base, u32 tx_base) } static struct { - int port; u32 base_addr; u32 macen_addr; int irq; struct net_device *dev; -} iflist[2]; +} iflist[2] = { +#ifdef CONFIG_SOC_AU1000 + {AU1000_ETH0_BASE, AU1000_MAC0_ENABLE, AU1000_MAC0_DMA_INT}, + {AU1000_ETH1_BASE, AU1000_MAC1_ENABLE, AU1000_MAC1_DMA_INT} +#endif +#ifdef CONFIG_SOC_AU1100 + {AU1100_ETH0_BASE, AU1100_MAC0_ENABLE, AU1100_MAC0_DMA_INT} +#endif +#ifdef CONFIG_SOC_AU1500 + {AU1500_ETH0_BASE, AU1500_MAC0_ENABLE, AU1500_MAC0_DMA_INT}, + {AU1500_ETH1_BASE, AU1500_MAC1_ENABLE, AU1500_MAC1_DMA_INT} +#endif +#ifdef CONFIG_SOC_AU1550 + {AU1550_ETH0_BASE, AU1550_MAC0_ENABLE, AU1550_MAC0_DMA_INT}, + {AU1550_ETH1_BASE, AU1550_MAC1_ENABLE, AU1550_MAC1_DMA_INT} +#endif +}; static int num_ifs; @@ -1176,58 +552,14 @@ static int num_ifs; */ static int __init au1000_init_module(void) { - struct cpuinfo_mips *c = ¤t_cpu_data; int ni = (int)((au_readl(SYS_PINFUNC) & (u32)(SYS_PF_NI2)) >> 4); struct net_device *dev; int i, found_one = 0; - switch (c->cputype) { -#ifdef CONFIG_SOC_AU1000 - case CPU_AU1000: - num_ifs = 2 - ni; - iflist[0].base_addr = AU1000_ETH0_BASE; - iflist[1].base_addr = AU1000_ETH1_BASE; - iflist[0].macen_addr = AU1000_MAC0_ENABLE; - iflist[1].macen_addr = AU1000_MAC1_ENABLE; - iflist[0].irq = AU1000_MAC0_DMA_INT; - iflist[1].irq = AU1000_MAC1_DMA_INT; - break; -#endif -#ifdef CONFIG_SOC_AU1100 - case CPU_AU1100: - num_ifs = 1 - ni; - iflist[0].base_addr = AU1100_ETH0_BASE; - iflist[0].macen_addr = AU1100_MAC0_ENABLE; - iflist[0].irq = AU1100_MAC0_DMA_INT; - break; -#endif -#ifdef CONFIG_SOC_AU1500 - case CPU_AU1500: - num_ifs = 2 - ni; - iflist[0].base_addr = AU1500_ETH0_BASE; - iflist[1].base_addr = AU1500_ETH1_BASE; - iflist[0].macen_addr = AU1500_MAC0_ENABLE; - iflist[1].macen_addr = AU1500_MAC1_ENABLE; - iflist[0].irq = AU1500_MAC0_DMA_INT; - iflist[1].irq = AU1500_MAC1_DMA_INT; - break; -#endif -#ifdef CONFIG_SOC_AU1550 - case CPU_AU1550: - num_ifs = 2 - ni; - iflist[0].base_addr = AU1550_ETH0_BASE; - iflist[1].base_addr = AU1550_ETH1_BASE; - iflist[0].macen_addr = AU1550_MAC0_ENABLE; - iflist[1].macen_addr = AU1550_MAC1_ENABLE; - iflist[0].irq = AU1550_MAC0_DMA_INT; - iflist[1].irq = AU1550_MAC1_DMA_INT; - break; -#endif - default: - num_ifs = 0; - } + num_ifs = NUM_ETH_INTERFACES - ni; + for(i = 0; i < num_ifs; i++) { - dev = au1000_probe(iflist[i].base_addr, iflist[i].irq, i); + dev = au1000_probe(i); iflist[i].dev = dev; if (dev) found_one++; @@ -1237,178 +569,31 @@ static int __init au1000_init_module(void) return 0; } -static int au1000_setup_aneg(struct net_device *dev, u32 advertise) -{ - struct au1000_private *aup = (struct au1000_private *)dev->priv; - u16 ctl, adv; - - /* Setup standard advertise */ - adv = mdio_read(dev, aup->phy_addr, MII_ADVERTISE); - adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4); - if (advertise & ADVERTISED_10baseT_Half) - adv |= ADVERTISE_10HALF; - if (advertise & ADVERTISED_10baseT_Full) - adv |= ADVERTISE_10FULL; - if (advertise & ADVERTISED_100baseT_Half) - adv |= ADVERTISE_100HALF; - if (advertise & ADVERTISED_100baseT_Full) - adv |= ADVERTISE_100FULL; - mdio_write(dev, aup->phy_addr, MII_ADVERTISE, adv); - - /* Start/Restart aneg */ - ctl = mdio_read(dev, aup->phy_addr, MII_BMCR); - ctl |= (BMCR_ANENABLE | BMCR_ANRESTART); - mdio_write(dev, aup->phy_addr, MII_BMCR, ctl); - - return 0; -} +/* + * ethtool operations + */ -static int au1000_setup_forced(struct net_device *dev, int speed, int fd) +static int au1000_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) { struct au1000_private *aup = (struct au1000_private *)dev->priv; - u16 ctl; - - ctl = mdio_read(dev, aup->phy_addr, MII_BMCR); - ctl &= ~(BMCR_FULLDPLX | BMCR_SPEED100 | BMCR_ANENABLE); - - /* First reset the PHY */ - mdio_write(dev, aup->phy_addr, MII_BMCR, ctl | BMCR_RESET); - - /* Select speed & duplex */ - switch (speed) { - case SPEED_10: - break; - case SPEED_100: - ctl |= BMCR_SPEED100; - break; - case SPEED_1000: - default: - return -EINVAL; - } - if (fd == DUPLEX_FULL) - ctl |= BMCR_FULLDPLX; - mdio_write(dev, aup->phy_addr, MII_BMCR, ctl); - - return 0; -} + if (aup->phy_dev) + return phy_ethtool_gset(aup->phy_dev, cmd); -static void -au1000_start_link(struct net_device *dev, struct ethtool_cmd *cmd) -{ - struct au1000_private *aup = (struct au1000_private *)dev->priv; - u32 advertise; - int autoneg; - int forced_speed; - int forced_duplex; - - /* Default advertise */ - advertise = GENMII_DEFAULT_ADVERTISE; - autoneg = aup->want_autoneg; - forced_speed = SPEED_100; - forced_duplex = DUPLEX_FULL; - - /* Setup link parameters */ - if (cmd) { - if (cmd->autoneg == AUTONEG_ENABLE) { - advertise = cmd->advertising; - autoneg = 1; - } else { - autoneg = 0; - - forced_speed = cmd->speed; - forced_duplex = cmd->duplex; - } - } - - /* Configure PHY & start aneg */ - aup->want_autoneg = autoneg; - if (autoneg) - au1000_setup_aneg(dev, advertise); - else - au1000_setup_forced(dev, forced_speed, forced_duplex); - mod_timer(&aup->timer, jiffies + HZ); + return -EINVAL; } -static int au1000_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) +static int au1000_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) { struct au1000_private *aup = (struct au1000_private *)dev->priv; - u16 link, speed; - - cmd->supported = GENMII_DEFAULT_FEATURES; - cmd->advertising = GENMII_DEFAULT_ADVERTISE; - cmd->port = PORT_MII; - cmd->transceiver = XCVR_EXTERNAL; - cmd->phy_address = aup->phy_addr; - spin_lock_irq(&aup->lock); - cmd->autoneg = aup->want_autoneg; - aup->phy_ops->phy_status(dev, aup->phy_addr, &link, &speed); - if ((speed == IF_PORT_100BASETX) || (speed == IF_PORT_100BASEFX)) - cmd->speed = SPEED_100; - else if (speed == IF_PORT_10BASET) - cmd->speed = SPEED_10; - if (link && (dev->if_port == IF_PORT_100BASEFX)) - cmd->duplex = DUPLEX_FULL; - else - cmd->duplex = DUPLEX_HALF; - spin_unlock_irq(&aup->lock); - return 0; -} -static int au1000_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) -{ - struct au1000_private *aup = (struct au1000_private *)dev->priv; - unsigned long features = GENMII_DEFAULT_FEATURES; - - if (!capable(CAP_NET_ADMIN)) - return -EPERM; - - if (cmd->autoneg != AUTONEG_ENABLE && cmd->autoneg != AUTONEG_DISABLE) - return -EINVAL; - if (cmd->autoneg == AUTONEG_ENABLE && cmd->advertising == 0) - return -EINVAL; - if (cmd->duplex != DUPLEX_HALF && cmd->duplex != DUPLEX_FULL) - return -EINVAL; - if (cmd->autoneg == AUTONEG_DISABLE) - switch (cmd->speed) { - case SPEED_10: - if (cmd->duplex == DUPLEX_HALF && - (features & SUPPORTED_10baseT_Half) == 0) - return -EINVAL; - if (cmd->duplex == DUPLEX_FULL && - (features & SUPPORTED_10baseT_Full) == 0) - return -EINVAL; - break; - case SPEED_100: - if (cmd->duplex == DUPLEX_HALF && - (features & SUPPORTED_100baseT_Half) == 0) - return -EINVAL; - if (cmd->duplex == DUPLEX_FULL && - (features & SUPPORTED_100baseT_Full) == 0) - return -EINVAL; - break; - default: - return -EINVAL; - } - else if ((features & SUPPORTED_Autoneg) == 0) - return -EINVAL; - - spin_lock_irq(&aup->lock); - au1000_start_link(dev, cmd); - spin_unlock_irq(&aup->lock); - return 0; -} + if (!capable(CAP_NET_ADMIN)) + return -EPERM; -static int au1000_nway_reset(struct net_device *dev) -{ - struct au1000_private *aup = (struct au1000_private *)dev->priv; + if (aup->phy_dev) + return phy_ethtool_sset(aup->phy_dev, cmd); - if (!aup->want_autoneg) - return -EINVAL; - spin_lock_irq(&aup->lock); - au1000_start_link(dev, NULL); - spin_unlock_irq(&aup->lock); - return 0; + return -EINVAL; } static void @@ -1423,21 +608,14 @@ au1000_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) info->regdump_len = 0; } -static u32 au1000_get_link(struct net_device *dev) -{ - return netif_carrier_ok(dev); -} - static struct ethtool_ops au1000_ethtool_ops = { .get_settings = au1000_get_settings, .set_settings = au1000_set_settings, .get_drvinfo = au1000_get_drvinfo, - .nway_reset = au1000_nway_reset, - .get_link = au1000_get_link + .get_link = ethtool_op_get_link, }; -static struct net_device * -au1000_probe(u32 ioaddr, int irq, int port_num) +static struct net_device * au1000_probe(int port_num) { static unsigned version_printed = 0; struct au1000_private *aup = NULL; @@ -1445,106 +623,115 @@ au1000_probe(u32 ioaddr, int irq, int port_num) db_dest_t *pDB, *pDBfree; char *pmac, *argptr; char ethaddr[6]; - int i, err; + int irq, i, err; + u32 base, macen; + + if (port_num >= NUM_ETH_INTERFACES) + return NULL; - if (!request_mem_region(CPHYSADDR(ioaddr), MAC_IOSIZE, "Au1x00 ENET")) + base = CPHYSADDR(iflist[port_num].base_addr ); + macen = CPHYSADDR(iflist[port_num].macen_addr); + irq = iflist[port_num].irq; + + if (!request_mem_region( base, MAC_IOSIZE, "Au1x00 ENET") || + !request_mem_region(macen, 4, "Au1x00 ENET")) return NULL; - if (version_printed++ == 0) + if (version_printed++ == 0) printk("%s version %s %s\n", DRV_NAME, DRV_VERSION, DRV_AUTHOR); dev = alloc_etherdev(sizeof(struct au1000_private)); if (!dev) { - printk (KERN_ERR "au1000 eth: alloc_etherdev failed\n"); + printk(KERN_ERR "%s: alloc_etherdev failed\n", DRV_NAME); return NULL; } - if ((err = register_netdev(dev))) { - printk(KERN_ERR "Au1x_eth Cannot register net device err %d\n", - err); + if ((err = register_netdev(dev)) != 0) { + printk(KERN_ERR "%s: Cannot register net device, error %d\n", + DRV_NAME, err); free_netdev(dev); return NULL; } - printk("%s: Au1x Ethernet found at 0x%x, irq %d\n", - dev->name, ioaddr, irq); + printk("%s: Au1xx0 Ethernet found at 0x%x, irq %d\n", + dev->name, base, irq); aup = dev->priv; /* Allocate the data buffers */ /* Snooping works fine with eth on all au1xxx */ - aup->vaddr = (u32)dma_alloc_noncoherent(NULL, - MAX_BUF_SIZE * (NUM_TX_BUFFS+NUM_RX_BUFFS), - &aup->dma_addr, - 0); + aup->vaddr = (u32)dma_alloc_noncoherent(NULL, MAX_BUF_SIZE * + (NUM_TX_BUFFS + NUM_RX_BUFFS), + &aup->dma_addr, 0); if (!aup->vaddr) { free_netdev(dev); - release_mem_region(CPHYSADDR(ioaddr), MAC_IOSIZE); + release_mem_region( base, MAC_IOSIZE); + release_mem_region(macen, 4); return NULL; } /* aup->mac is the base address of the MAC's registers */ - aup->mac = (volatile mac_reg_t *)((unsigned long)ioaddr); + aup->mac = (volatile mac_reg_t *)iflist[port_num].base_addr; + /* Setup some variables for quick register address access */ - if (ioaddr == iflist[0].base_addr) - { - /* check env variables first */ - if (!get_ethernet_addr(ethaddr)) { + aup->enable = (volatile u32 *)iflist[port_num].macen_addr; + aup->mac_id = port_num; + au_macs[port_num] = aup; + + if (port_num == 0) { + /* Check the environment variables first */ + if (get_ethernet_addr(ethaddr) == 0) memcpy(au1000_mac_addr, ethaddr, sizeof(au1000_mac_addr)); - } else { + else { /* Check command line */ argptr = prom_getcmdline(); - if ((pmac = strstr(argptr, "ethaddr=")) == NULL) { - printk(KERN_INFO "%s: No mac address found\n", - dev->name); - /* use the hard coded mac addresses */ - } else { + if ((pmac = strstr(argptr, "ethaddr=")) == NULL) + printk(KERN_INFO "%s: No MAC address found\n", + dev->name); + /* Use the hard coded MAC addresses */ + else { str2eaddr(ethaddr, pmac + strlen("ethaddr=")); memcpy(au1000_mac_addr, ethaddr, - sizeof(au1000_mac_addr)); + sizeof(au1000_mac_addr)); } } - aup->enable = (volatile u32 *) - ((unsigned long)iflist[0].macen_addr); - memcpy(dev->dev_addr, au1000_mac_addr, sizeof(au1000_mac_addr)); + setup_hw_rings(aup, MAC0_RX_DMA_ADDR, MAC0_TX_DMA_ADDR); - aup->mac_id = 0; - au_macs[0] = aup; - } - else - if (ioaddr == iflist[1].base_addr) - { - aup->enable = (volatile u32 *) - ((unsigned long)iflist[1].macen_addr); - memcpy(dev->dev_addr, au1000_mac_addr, sizeof(au1000_mac_addr)); - dev->dev_addr[4] += 0x10; + } else if (port_num == 1) setup_hw_rings(aup, MAC1_RX_DMA_ADDR, MAC1_TX_DMA_ADDR); - aup->mac_id = 1; - au_macs[1] = aup; - } - else - { - printk(KERN_ERR "%s: bad ioaddr\n", dev->name); - } - - /* bring the device out of reset, otherwise probing the mii - * will hang */ - *aup->enable = MAC_EN_CLOCK_ENABLE; - au_sync_delay(2); - *aup->enable = MAC_EN_RESET0 | MAC_EN_RESET1 | - MAC_EN_RESET2 | MAC_EN_CLOCK_ENABLE; - au_sync_delay(2); - aup->mii = kmalloc(sizeof(struct mii_phy), GFP_KERNEL); - if (!aup->mii) { - printk(KERN_ERR "%s: out of memory\n", dev->name); - goto err_out; - } - aup->mii->next = NULL; - aup->mii->chip_info = NULL; - aup->mii->status = 0; - aup->mii->mii_control_reg = 0; - aup->mii->mii_data_reg = 0; + /* + * Assign to the Ethernet ports two consecutive MAC addresses + * to match those that are printed on their stickers + */ + memcpy(dev->dev_addr, au1000_mac_addr, sizeof(au1000_mac_addr)); + dev->dev_addr[5] += port_num; + + *aup->enable = 0; + aup->mac_enabled = 0; + + aup->mii_bus.priv = dev; + aup->mii_bus.read = mdiobus_read; + aup->mii_bus.write = mdiobus_write; + aup->mii_bus.reset = mdiobus_reset; + aup->mii_bus.name = "au1000_eth_mii"; + aup->mii_bus.id = aup->mac_id; + aup->mii_bus.irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL); + for(i = 0; i < PHY_MAX_ADDR; ++i) + aup->mii_bus.irq[i] = PHY_POLL; + + /* if known, set corresponding PHY IRQs */ +#if defined(AU1XXX_PHY_STATIC_CONFIG) +# if defined(AU1XXX_PHY0_IRQ) + if (AU1XXX_PHY0_BUSID == aup->mii_bus.id) + aup->mii_bus.irq[AU1XXX_PHY0_ADDR] = AU1XXX_PHY0_IRQ; +# endif +# if defined(AU1XXX_PHY1_IRQ) + if (AU1XXX_PHY1_BUSID == aup->mii_bus.id) + aup->mii_bus.irq[AU1XXX_PHY1_ADDR] = AU1XXX_PHY1_IRQ; +# endif +#endif + mdiobus_register(&aup->mii_bus); if (mii_probe(dev) != 0) { goto err_out; @@ -1581,7 +768,7 @@ au1000_probe(u32 ioaddr, int irq, int port_num) } spin_lock_init(&aup->lock); - dev->base_addr = ioaddr; + dev->base_addr = base; dev->irq = irq; dev->open = au1000_open; dev->hard_start_xmit = au1000_tx; @@ -1590,7 +777,6 @@ au1000_probe(u32 ioaddr, int irq, int port_num) dev->set_multicast_list = &set_rx_mode; dev->do_ioctl = &au1000_ioctl; SET_ETHTOOL_OPS(dev, &au1000_ethtool_ops); - dev->set_config = &au1000_set_config; dev->tx_timeout = au1000_tx_timeout; dev->watchdog_timeo = ETH_TX_TIMEOUT; @@ -1606,7 +792,7 @@ err_out: /* here we should have a valid dev plus aup-> register addresses * so we can reset the mac properly.*/ reset_mac(dev); - kfree(aup->mii); + for (i = 0; i < NUM_RX_DMA; i++) { if (aup->rx_db_inuse[i]) ReleaseDB(aup, aup->rx_db_inuse[i]); @@ -1615,13 +801,12 @@ err_out: if (aup->tx_db_inuse[i]) ReleaseDB(aup, aup->tx_db_inuse[i]); } - dma_free_noncoherent(NULL, - MAX_BUF_SIZE * (NUM_TX_BUFFS+NUM_RX_BUFFS), - (void *)aup->vaddr, - aup->dma_addr); + dma_free_noncoherent(NULL, MAX_BUF_SIZE * (NUM_TX_BUFFS + NUM_RX_BUFFS), + (void *)aup->vaddr, aup->dma_addr); unregister_netdev(dev); free_netdev(dev); - release_mem_region(CPHYSADDR(ioaddr), MAC_IOSIZE); + release_mem_region( base, MAC_IOSIZE); + release_mem_region(macen, 4); return NULL; } @@ -1640,19 +825,14 @@ static int au1000_init(struct net_device *dev) u32 flags; int i; u32 control; - u16 link, speed; if (au1000_debug > 4) printk("%s: au1000_init\n", dev->name); - spin_lock_irqsave(&aup->lock, flags); - /* bring the device out of reset */ - *aup->enable = MAC_EN_CLOCK_ENABLE; - au_sync_delay(2); - *aup->enable = MAC_EN_RESET0 | MAC_EN_RESET1 | - MAC_EN_RESET2 | MAC_EN_CLOCK_ENABLE; - au_sync_delay(20); + enable_mac(dev, 1); + + spin_lock_irqsave(&aup->lock, flags); aup->mac->control = 0; aup->tx_head = (aup->tx_dma_ring[0]->buff_stat & 0xC) >> 2; @@ -1668,12 +848,16 @@ static int au1000_init(struct net_device *dev) } au_sync(); - aup->phy_ops->phy_status(dev, aup->phy_addr, &link, &speed); - control = MAC_DISABLE_RX_OWN | MAC_RX_ENABLE | MAC_TX_ENABLE; + control = MAC_RX_ENABLE | MAC_TX_ENABLE; #ifndef CONFIG_CPU_LITTLE_ENDIAN control |= MAC_BIG_ENDIAN; #endif - if (link && (dev->if_port == IF_PORT_100BASEFX)) { + if (aup->phy_dev) { + if (aup->phy_dev->link && (DUPLEX_FULL == aup->phy_dev->duplex)) + control |= MAC_FULL_DUPLEX; + else + control |= MAC_DISABLE_RX_OWN; + } else { /* PHY-less op, assume full-duplex */ control |= MAC_FULL_DUPLEX; } @@ -1685,57 +869,84 @@ static int au1000_init(struct net_device *dev) return 0; } -static void au1000_timer(unsigned long data) +static void +au1000_adjust_link(struct net_device *dev) { - struct net_device *dev = (struct net_device *)data; struct au1000_private *aup = (struct au1000_private *) dev->priv; - unsigned char if_port; - u16 link, speed; + struct phy_device *phydev = aup->phy_dev; + unsigned long flags; - if (!dev) { - /* fatal error, don't restart the timer */ - printk(KERN_ERR "au1000_timer error: NULL dev\n"); - return; - } + int status_change = 0; - if_port = dev->if_port; - if (aup->phy_ops->phy_status(dev, aup->phy_addr, &link, &speed) == 0) { - if (link) { - if (!netif_carrier_ok(dev)) { - netif_carrier_on(dev); - printk(KERN_INFO "%s: link up\n", dev->name); - } - } - else { - if (netif_carrier_ok(dev)) { - netif_carrier_off(dev); - dev->if_port = 0; - printk(KERN_INFO "%s: link down\n", dev->name); - } + BUG_ON(!aup->phy_dev); + + spin_lock_irqsave(&aup->lock, flags); + + if (phydev->link && (aup->old_speed != phydev->speed)) { + // speed changed + + switch(phydev->speed) { + case SPEED_10: + case SPEED_100: + break; + default: + printk(KERN_WARNING + "%s: Speed (%d) is not 10/100 ???\n", + dev->name, phydev->speed); + break; } + + aup->old_speed = phydev->speed; + + status_change = 1; } - if (link && (dev->if_port != if_port) && - (dev->if_port != IF_PORT_UNKNOWN)) { + if (phydev->link && (aup->old_duplex != phydev->duplex)) { + // duplex mode changed + + /* switching duplex mode requires to disable rx and tx! */ hard_stop(dev); - if (dev->if_port == IF_PORT_100BASEFX) { - printk(KERN_INFO "%s: going to full duplex\n", - dev->name); - aup->mac->control |= MAC_FULL_DUPLEX; - au_sync_delay(1); - } - else { - aup->mac->control &= ~MAC_FULL_DUPLEX; - au_sync_delay(1); - } + + if (DUPLEX_FULL == phydev->duplex) + aup->mac->control = ((aup->mac->control + | MAC_FULL_DUPLEX) + & ~MAC_DISABLE_RX_OWN); + else + aup->mac->control = ((aup->mac->control + & ~MAC_FULL_DUPLEX) + | MAC_DISABLE_RX_OWN); + au_sync_delay(1); + enable_rx_tx(dev); + aup->old_duplex = phydev->duplex; + + status_change = 1; + } + + if(phydev->link != aup->old_link) { + // link state changed + + if (phydev->link) // link went up + netif_schedule(dev); + else { // link went down + aup->old_speed = 0; + aup->old_duplex = -1; + } + + aup->old_link = phydev->link; + status_change = 1; } - aup->timer.expires = RUN_AT((1*HZ)); - aup->timer.data = (unsigned long)dev; - aup->timer.function = &au1000_timer; /* timer handler */ - add_timer(&aup->timer); + spin_unlock_irqrestore(&aup->lock, flags); + if (status_change) { + if (phydev->link) + printk(KERN_INFO "%s: link up (%d/%s)\n", + dev->name, phydev->speed, + DUPLEX_FULL == phydev->duplex ? "Full" : "Half"); + else + printk(KERN_INFO "%s: link down\n", dev->name); + } } static int au1000_open(struct net_device *dev) @@ -1746,25 +957,26 @@ static int au1000_open(struct net_device *dev) if (au1000_debug > 4) printk("%s: open: dev=%p\n", dev->name, dev); + if ((retval = request_irq(dev->irq, &au1000_interrupt, 0, + dev->name, dev))) { + printk(KERN_ERR "%s: unable to get IRQ %d\n", + dev->name, dev->irq); + return retval; + } + if ((retval = au1000_init(dev))) { printk(KERN_ERR "%s: error in au1000_init\n", dev->name); free_irq(dev->irq, dev); return retval; } - netif_start_queue(dev); - if ((retval = request_irq(dev->irq, &au1000_interrupt, 0, - dev->name, dev))) { - printk(KERN_ERR "%s: unable to get IRQ %d\n", - dev->name, dev->irq); - return retval; + if (aup->phy_dev) { + /* cause the PHY state machine to schedule a link state check */ + aup->phy_dev->state = PHY_CHANGELINK; + phy_start(aup->phy_dev); } - init_timer(&aup->timer); /* used in ioctl() */ - aup->timer.expires = RUN_AT((3*HZ)); - aup->timer.data = (unsigned long)dev; - aup->timer.function = &au1000_timer; /* timer handler */ - add_timer(&aup->timer); + netif_start_queue(dev); if (au1000_debug > 4) printk("%s: open: Initialization done.\n", dev->name); @@ -1774,16 +986,19 @@ static int au1000_open(struct net_device *dev) static int au1000_close(struct net_device *dev) { - u32 flags; - struct au1000_private *aup = (struct au1000_private *) dev->priv; + unsigned long flags; + struct au1000_private *const aup = (struct au1000_private *) dev->priv; if (au1000_debug > 4) printk("%s: close: dev=%p\n", dev->name, dev); - reset_mac(dev); + if (aup->phy_dev) + phy_stop(aup->phy_dev); spin_lock_irqsave(&aup->lock, flags); - + + reset_mac_unlocked (dev); + /* stop the device */ netif_stop_queue(dev); @@ -1805,21 +1020,18 @@ static void __exit au1000_cleanup_module(void) if (dev) { aup = (struct au1000_private *) dev->priv; unregister_netdev(dev); - kfree(aup->mii); - for (j = 0; j < NUM_RX_DMA; j++) { + for (j = 0; j < NUM_RX_DMA; j++) if (aup->rx_db_inuse[j]) ReleaseDB(aup, aup->rx_db_inuse[j]); - } - for (j = 0; j < NUM_TX_DMA; j++) { + for (j = 0; j < NUM_TX_DMA; j++) if (aup->tx_db_inuse[j]) ReleaseDB(aup, aup->tx_db_inuse[j]); - } - dma_free_noncoherent(NULL, - MAX_BUF_SIZE * (NUM_TX_BUFFS+NUM_RX_BUFFS), - (void *)aup->vaddr, - aup->dma_addr); + dma_free_noncoherent(NULL, MAX_BUF_SIZE * + (NUM_TX_BUFFS + NUM_RX_BUFFS), + (void *)aup->vaddr, aup->dma_addr); + release_mem_region(dev->base_addr, MAC_IOSIZE); + release_mem_region(CPHYSADDR(iflist[i].macen_addr), 4); free_netdev(dev); - release_mem_region(CPHYSADDR(iflist[i].base_addr), MAC_IOSIZE); } } } @@ -1830,7 +1042,7 @@ static void update_tx_stats(struct net_device *dev, u32 status) struct net_device_stats *ps = &aup->stats; if (status & TX_FRAME_ABORTED) { - if (dev->if_port == IF_PORT_100BASEFX) { + if (!aup->phy_dev || (DUPLEX_FULL == aup->phy_dev->duplex)) { if (status & (TX_JAB_TIMEOUT | TX_UNDERRUN)) { /* any other tx errors are only valid * in half duplex mode */ @@ -2104,126 +1316,15 @@ static void set_rx_mode(struct net_device *dev) } } - static int au1000_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { struct au1000_private *aup = (struct au1000_private *)dev->priv; - u16 *data = (u16 *)&rq->ifr_ifru; - - switch(cmd) { - case SIOCDEVPRIVATE: /* Get the address of the PHY in use. */ - case SIOCGMIIPHY: - if (!netif_running(dev)) return -EINVAL; - data[0] = aup->phy_addr; - case SIOCDEVPRIVATE+1: /* Read the specified MII register. */ - case SIOCGMIIREG: - data[3] = mdio_read(dev, data[0], data[1]); - return 0; - case SIOCDEVPRIVATE+2: /* Write the specified MII register */ - case SIOCSMIIREG: - if (!capable(CAP_NET_ADMIN)) - return -EPERM; - mdio_write(dev, data[0], data[1],data[2]); - return 0; - default: - return -EOPNOTSUPP; - } - -} - - -static int au1000_set_config(struct net_device *dev, struct ifmap *map) -{ - struct au1000_private *aup = (struct au1000_private *) dev->priv; - u16 control; - if (au1000_debug > 4) { - printk("%s: set_config called: dev->if_port %d map->port %x\n", - dev->name, dev->if_port, map->port); - } + if (!netif_running(dev)) return -EINVAL; - switch(map->port){ - case IF_PORT_UNKNOWN: /* use auto here */ - printk(KERN_INFO "%s: config phy for aneg\n", - dev->name); - dev->if_port = map->port; - /* Link Down: the timer will bring it up */ - netif_carrier_off(dev); - - /* read current control */ - control = mdio_read(dev, aup->phy_addr, MII_CONTROL); - control &= ~(MII_CNTL_FDX | MII_CNTL_F100); - - /* enable auto negotiation and reset the negotiation */ - mdio_write(dev, aup->phy_addr, MII_CONTROL, - control | MII_CNTL_AUTO | - MII_CNTL_RST_AUTO); + if (!aup->phy_dev) return -EINVAL; // PHY not controllable - break; - - case IF_PORT_10BASET: /* 10BaseT */ - printk(KERN_INFO "%s: config phy for 10BaseT\n", - dev->name); - dev->if_port = map->port; - - /* Link Down: the timer will bring it up */ - netif_carrier_off(dev); - - /* set Speed to 10Mbps, Half Duplex */ - control = mdio_read(dev, aup->phy_addr, MII_CONTROL); - control &= ~(MII_CNTL_F100 | MII_CNTL_AUTO | - MII_CNTL_FDX); - - /* disable auto negotiation and force 10M/HD mode*/ - mdio_write(dev, aup->phy_addr, MII_CONTROL, control); - break; - - case IF_PORT_100BASET: /* 100BaseT */ - case IF_PORT_100BASETX: /* 100BaseTx */ - printk(KERN_INFO "%s: config phy for 100BaseTX\n", - dev->name); - dev->if_port = map->port; - - /* Link Down: the timer will bring it up */ - netif_carrier_off(dev); - - /* set Speed to 100Mbps, Half Duplex */ - /* disable auto negotiation and enable 100MBit Mode */ - control = mdio_read(dev, aup->phy_addr, MII_CONTROL); - control &= ~(MII_CNTL_AUTO | MII_CNTL_FDX); - control |= MII_CNTL_F100; - mdio_write(dev, aup->phy_addr, MII_CONTROL, control); - break; - - case IF_PORT_100BASEFX: /* 100BaseFx */ - printk(KERN_INFO "%s: config phy for 100BaseFX\n", - dev->name); - dev->if_port = map->port; - - /* Link Down: the timer will bring it up */ - netif_carrier_off(dev); - - /* set Speed to 100Mbps, Full Duplex */ - /* disable auto negotiation and enable 100MBit Mode */ - control = mdio_read(dev, aup->phy_addr, MII_CONTROL); - control &= ~MII_CNTL_AUTO; - control |= MII_CNTL_F100 | MII_CNTL_FDX; - mdio_write(dev, aup->phy_addr, MII_CONTROL, control); - break; - case IF_PORT_10BASE2: /* 10Base2 */ - case IF_PORT_AUI: /* AUI */ - /* These Modes are not supported (are they?)*/ - printk(KERN_ERR "%s: 10Base2/AUI not supported", - dev->name); - return -EOPNOTSUPP; - break; - - default: - printk(KERN_ERR "%s: Invalid media selected", - dev->name); - return -EINVAL; - } - return 0; + return phy_mii_ioctl(aup->phy_dev, if_mii(rq), cmd); } static struct net_device_stats *au1000_get_stats(struct net_device *dev) diff --git a/drivers/net/au1000_eth.h b/drivers/net/au1000_eth.h index 7f9326e39..41c2f848d 100644 --- a/drivers/net/au1000_eth.h +++ b/drivers/net/au1000_eth.h @@ -40,120 +40,6 @@ #define MULTICAST_FILTER_LIMIT 64 -/* FIXME - * The PHY defines should be in a separate file. - */ - -/* MII register offsets */ -#define MII_CONTROL 0x0000 -#define MII_STATUS 0x0001 -#define MII_PHY_ID0 0x0002 -#define MII_PHY_ID1 0x0003 -#define MII_ANADV 0x0004 -#define MII_ANLPAR 0x0005 -#define MII_AEXP 0x0006 -#define MII_ANEXT 0x0007 -#define MII_LSI_PHY_CONFIG 0x0011 -/* Status register */ -#define MII_LSI_PHY_STAT 0x0012 -#define MII_AMD_PHY_STAT MII_LSI_PHY_STAT -#define MII_INTEL_PHY_STAT 0x0011 - -#define MII_AUX_CNTRL 0x0018 -/* mii registers specific to AMD 79C901 */ -#define MII_STATUS_SUMMARY = 0x0018 - -/* MII Control register bit definitions. */ -#define MII_CNTL_FDX 0x0100 -#define MII_CNTL_RST_AUTO 0x0200 -#define MII_CNTL_ISOLATE 0x0400 -#define MII_CNTL_PWRDWN 0x0800 -#define MII_CNTL_AUTO 0x1000 -#define MII_CNTL_F100 0x2000 -#define MII_CNTL_LPBK 0x4000 -#define MII_CNTL_RESET 0x8000 - -/* MII Status register bit */ -#define MII_STAT_EXT 0x0001 -#define MII_STAT_JAB 0x0002 -#define MII_STAT_LINK 0x0004 -#define MII_STAT_CAN_AUTO 0x0008 -#define MII_STAT_FAULT 0x0010 -#define MII_STAT_AUTO_DONE 0x0020 -#define MII_STAT_CAN_T 0x0800 -#define MII_STAT_CAN_T_FDX 0x1000 -#define MII_STAT_CAN_TX 0x2000 -#define MII_STAT_CAN_TX_FDX 0x4000 -#define MII_STAT_CAN_T4 0x8000 - - -#define MII_ID1_OUI_LO 0xFC00 /* low bits of OUI mask */ -#define MII_ID1_MODEL 0x03F0 /* model number */ -#define MII_ID1_REV 0x000F /* model number */ - -/* MII NWAY Register Bits ... - valid for the ANAR (Auto-Negotiation Advertisement) and - ANLPAR (Auto-Negotiation Link Partner) registers */ -#define MII_NWAY_NODE_SEL 0x001f -#define MII_NWAY_CSMA_CD 0x0001 -#define MII_NWAY_T 0x0020 -#define MII_NWAY_T_FDX 0x0040 -#define MII_NWAY_TX 0x0080 -#define MII_NWAY_TX_FDX 0x0100 -#define MII_NWAY_T4 0x0200 -#define MII_NWAY_PAUSE 0x0400 -#define MII_NWAY_RF 0x2000 /* Remote Fault */ -#define MII_NWAY_ACK 0x4000 /* Remote Acknowledge */ -#define MII_NWAY_NP 0x8000 /* Next Page (Enable) */ - -/* mii stsout register bits */ -#define MII_STSOUT_LINK_FAIL 0x4000 -#define MII_STSOUT_SPD 0x0080 -#define MII_STSOUT_DPLX 0x0040 - -/* mii stsics register bits */ -#define MII_STSICS_SPD 0x8000 -#define MII_STSICS_DPLX 0x4000 -#define MII_STSICS_LINKSTS 0x0001 - -/* mii stssum register bits */ -#define MII_STSSUM_LINK 0x0008 -#define MII_STSSUM_DPLX 0x0004 -#define MII_STSSUM_AUTO 0x0002 -#define MII_STSSUM_SPD 0x0001 - -/* lsi phy status register */ -#define MII_LSI_PHY_STAT_FDX 0x0040 -#define MII_LSI_PHY_STAT_SPD 0x0080 - -/* amd phy status register */ -#define MII_AMD_PHY_STAT_FDX 0x0800 -#define MII_AMD_PHY_STAT_SPD 0x0400 - -/* intel phy status register */ -#define MII_INTEL_PHY_STAT_FDX 0x0200 -#define MII_INTEL_PHY_STAT_SPD 0x4000 - -/* Auxilliary Control/Status Register */ -#define MII_AUX_FDX 0x0001 -#define MII_AUX_100 0x0002 -#define MII_AUX_F100 0x0004 -#define MII_AUX_ANEG 0x0008 - -typedef struct mii_phy { - struct mii_phy * next; - struct mii_chip_info * chip_info; - u16 status; - u32 *mii_control_reg; - u32 *mii_data_reg; -} mii_phy_t; - -struct phy_ops { - int (*phy_init) (struct net_device *, int); - int (*phy_reset) (struct net_device *, int); - int (*phy_status) (struct net_device *, int, u16 *, u16 *); -}; - /* * Data Buffer Descriptor. Data buffers must be aligned on 32 byte * boundary for both, receive and transmit. @@ -200,7 +86,6 @@ typedef struct mac_reg { struct au1000_private { - db_dest_t *pDBfree; db_dest_t db[NUM_RX_BUFFS+NUM_TX_BUFFS]; volatile rx_dma_t *rx_dma_ring[NUM_RX_DMA]; @@ -213,8 +98,15 @@ struct au1000_private { u32 tx_full; int mac_id; - mii_phy_t *mii; - struct phy_ops *phy_ops; + + int mac_enabled; /* whether MAC is currently enabled and running (req. for mdio) */ + + int old_link; /* used by au1000_adjust_link */ + int old_speed; + int old_duplex; + + struct phy_device *phy_dev; + struct mii_bus mii_bus; /* These variables are just for quick access to certain regs addresses. */ volatile mac_reg_t *mac; /* mac registers */ @@ -223,14 +115,6 @@ struct au1000_private { u32 vaddr; /* virtual address of rx/tx buffers */ dma_addr_t dma_addr; /* dma address of rx/tx buffers */ - u8 *hash_table; - u32 hash_mode; - u32 intr_work_done; /* number of Rx and Tx pkts processed in the isr */ - int phy_addr; /* phy address */ - u32 options; /* User-settable misc. driver options. */ - u32 drv_flags; - int want_autoneg; struct net_device_stats stats; - struct timer_list timer; spinlock_t lock; /* Serialise access to device */ }; diff --git a/drivers/net/b44.c b/drivers/net/b44.c index 6e3e5a297..e83c73e98 100644 --- a/drivers/net/b44.c +++ b/drivers/net/b44.c @@ -29,8 +29,8 @@ #define DRV_MODULE_NAME "b44" #define PFX DRV_MODULE_NAME ": " -#define DRV_MODULE_VERSION "1.00" -#define DRV_MODULE_RELDATE "Apr 7, 2006" +#define DRV_MODULE_VERSION "1.01" +#define DRV_MODULE_RELDATE "Jun 16, 2006" #define B44_DEF_MSG_ENABLE \ (NETIF_MSG_DRV | \ @@ -75,6 +75,15 @@ /* minimum number of free TX descriptors required to wake up TX process */ #define B44_TX_WAKEUP_THRESH (B44_TX_RING_SIZE / 4) +/* b44 internal pattern match filter info */ +#define B44_PATTERN_BASE 0x400 +#define B44_PATTERN_SIZE 0x80 +#define B44_PMASK_BASE 0x600 +#define B44_PMASK_SIZE 0x10 +#define B44_MAX_PATTERNS 16 +#define B44_ETHIPV6UDP_HLEN 62 +#define B44_ETHIPV4UDP_HLEN 42 + static char version[] __devinitdata = DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; @@ -102,7 +111,7 @@ MODULE_DEVICE_TABLE(pci, b44_pci_tbl); static void b44_halt(struct b44 *); static void b44_init_rings(struct b44 *); -static void b44_init_hw(struct b44 *); +static void b44_init_hw(struct b44 *, int); static int dma_desc_align_mask; static int dma_desc_sync_size; @@ -874,7 +883,7 @@ static int b44_poll(struct net_device *netdev, int *budget) spin_lock_irq(&bp->lock); b44_halt(bp); b44_init_rings(bp); - b44_init_hw(bp); + b44_init_hw(bp, 1); netif_wake_queue(bp->dev); spin_unlock_irq(&bp->lock); done = 1; @@ -943,7 +952,7 @@ static void b44_tx_timeout(struct net_device *dev) b44_halt(bp); b44_init_rings(bp); - b44_init_hw(bp); + b44_init_hw(bp, 1); spin_unlock_irq(&bp->lock); @@ -1060,7 +1069,7 @@ static int b44_change_mtu(struct net_device *dev, int new_mtu) b44_halt(bp); dev->mtu = new_mtu; b44_init_rings(bp); - b44_init_hw(bp); + b44_init_hw(bp, 1); spin_unlock_irq(&bp->lock); b44_enable_ints(bp); @@ -1357,13 +1366,15 @@ static int b44_set_mac_addr(struct net_device *dev, void *p) * packet processing. Invoked with bp->lock held. */ static void __b44_set_rx_mode(struct net_device *); -static void b44_init_hw(struct b44 *bp) +static void b44_init_hw(struct b44 *bp, int full_reset) { u32 val; b44_chip_reset(bp); - b44_phy_reset(bp); - b44_setup_phy(bp); + if (full_reset) { + b44_phy_reset(bp); + b44_setup_phy(bp); + } /* Enable CRC32, set proper LED modes and power on PHY */ bw32(bp, B44_MAC_CTRL, MAC_CTRL_CRC32_ENAB | MAC_CTRL_PHY_LEDCTRL); @@ -1377,16 +1388,21 @@ static void b44_init_hw(struct b44 *bp) bw32(bp, B44_TXMAXLEN, bp->dev->mtu + ETH_HLEN + 8 + RX_HEADER_LEN); bw32(bp, B44_TX_WMARK, 56); /* XXX magic */ - bw32(bp, B44_DMATX_CTRL, DMATX_CTRL_ENABLE); - bw32(bp, B44_DMATX_ADDR, bp->tx_ring_dma + bp->dma_offset); - bw32(bp, B44_DMARX_CTRL, (DMARX_CTRL_ENABLE | - (bp->rx_offset << DMARX_CTRL_ROSHIFT))); - bw32(bp, B44_DMARX_ADDR, bp->rx_ring_dma + bp->dma_offset); + if (full_reset) { + bw32(bp, B44_DMATX_CTRL, DMATX_CTRL_ENABLE); + bw32(bp, B44_DMATX_ADDR, bp->tx_ring_dma + bp->dma_offset); + bw32(bp, B44_DMARX_CTRL, (DMARX_CTRL_ENABLE | + (bp->rx_offset << DMARX_CTRL_ROSHIFT))); + bw32(bp, B44_DMARX_ADDR, bp->rx_ring_dma + bp->dma_offset); - bw32(bp, B44_DMARX_PTR, bp->rx_pending); - bp->rx_prod = bp->rx_pending; + bw32(bp, B44_DMARX_PTR, bp->rx_pending); + bp->rx_prod = bp->rx_pending; - bw32(bp, B44_MIB_CTRL, MIB_CTRL_CLR_ON_READ); + bw32(bp, B44_MIB_CTRL, MIB_CTRL_CLR_ON_READ); + } else { + bw32(bp, B44_DMARX_CTRL, (DMARX_CTRL_ENABLE | + (bp->rx_offset << DMARX_CTRL_ROSHIFT))); + } val = br32(bp, B44_ENET_CTRL); bw32(bp, B44_ENET_CTRL, (val | ENET_CTRL_ENABLE)); @@ -1402,11 +1418,11 @@ static int b44_open(struct net_device *dev) goto out; b44_init_rings(bp); - b44_init_hw(bp); + b44_init_hw(bp, 1); b44_check_phy(bp); - err = request_irq(dev->irq, b44_interrupt, SA_SHIRQ, dev->name, dev); + err = request_irq(dev->irq, b44_interrupt, IRQF_SHARED, dev->name, dev); if (unlikely(err < 0)) { b44_chip_reset(bp); b44_free_rings(bp); @@ -1451,6 +1467,140 @@ static void b44_poll_controller(struct net_device *dev) } #endif +static void bwfilter_table(struct b44 *bp, u8 *pp, u32 bytes, u32 table_offset) +{ + u32 i; + u32 *pattern = (u32 *) pp; + + for (i = 0; i < bytes; i += sizeof(u32)) { + bw32(bp, B44_FILT_ADDR, table_offset + i); + bw32(bp, B44_FILT_DATA, pattern[i / sizeof(u32)]); + } +} + +static int b44_magic_pattern(u8 *macaddr, u8 *ppattern, u8 *pmask, int offset) +{ + int magicsync = 6; + int k, j, len = offset; + int ethaddr_bytes = ETH_ALEN; + + memset(ppattern + offset, 0xff, magicsync); + for (j = 0; j < magicsync; j++) + set_bit(len++, (unsigned long *) pmask); + + for (j = 0; j < B44_MAX_PATTERNS; j++) { + if ((B44_PATTERN_SIZE - len) >= ETH_ALEN) + ethaddr_bytes = ETH_ALEN; + else + ethaddr_bytes = B44_PATTERN_SIZE - len; + if (ethaddr_bytes <=0) + break; + for (k = 0; k< ethaddr_bytes; k++) { + ppattern[offset + magicsync + + (j * ETH_ALEN) + k] = macaddr[k]; + len++; + set_bit(len, (unsigned long *) pmask); + } + } + return len - 1; +} + +/* Setup magic packet patterns in the b44 WOL + * pattern matching filter. + */ +static void b44_setup_pseudo_magicp(struct b44 *bp) +{ + + u32 val; + int plen0, plen1, plen2; + u8 *pwol_pattern; + u8 pwol_mask[B44_PMASK_SIZE]; + + pwol_pattern = kmalloc(B44_PATTERN_SIZE, GFP_KERNEL); + if (!pwol_pattern) { + printk(KERN_ERR PFX "Memory not available for WOL\n"); + return; + } + + /* Ipv4 magic packet pattern - pattern 0.*/ + memset(pwol_pattern, 0, B44_PATTERN_SIZE); + memset(pwol_mask, 0, B44_PMASK_SIZE); + plen0 = b44_magic_pattern(bp->dev->dev_addr, pwol_pattern, pwol_mask, + B44_ETHIPV4UDP_HLEN); + + bwfilter_table(bp, pwol_pattern, B44_PATTERN_SIZE, B44_PATTERN_BASE); + bwfilter_table(bp, pwol_mask, B44_PMASK_SIZE, B44_PMASK_BASE); + + /* Raw ethernet II magic packet pattern - pattern 1 */ + memset(pwol_pattern, 0, B44_PATTERN_SIZE); + memset(pwol_mask, 0, B44_PMASK_SIZE); + plen1 = b44_magic_pattern(bp->dev->dev_addr, pwol_pattern, pwol_mask, + ETH_HLEN); + + bwfilter_table(bp, pwol_pattern, B44_PATTERN_SIZE, + B44_PATTERN_BASE + B44_PATTERN_SIZE); + bwfilter_table(bp, pwol_mask, B44_PMASK_SIZE, + B44_PMASK_BASE + B44_PMASK_SIZE); + + /* Ipv6 magic packet pattern - pattern 2 */ + memset(pwol_pattern, 0, B44_PATTERN_SIZE); + memset(pwol_mask, 0, B44_PMASK_SIZE); + plen2 = b44_magic_pattern(bp->dev->dev_addr, pwol_pattern, pwol_mask, + B44_ETHIPV6UDP_HLEN); + + bwfilter_table(bp, pwol_pattern, B44_PATTERN_SIZE, + B44_PATTERN_BASE + B44_PATTERN_SIZE + B44_PATTERN_SIZE); + bwfilter_table(bp, pwol_mask, B44_PMASK_SIZE, + B44_PMASK_BASE + B44_PMASK_SIZE + B44_PMASK_SIZE); + + kfree(pwol_pattern); + + /* set these pattern's lengths: one less than each real length */ + val = plen0 | (plen1 << 8) | (plen2 << 16) | WKUP_LEN_ENABLE_THREE; + bw32(bp, B44_WKUP_LEN, val); + + /* enable wakeup pattern matching */ + val = br32(bp, B44_DEVCTRL); + bw32(bp, B44_DEVCTRL, val | DEVCTRL_PFE); + +} + +static void b44_setup_wol(struct b44 *bp) +{ + u32 val; + u16 pmval; + + bw32(bp, B44_RXCONFIG, RXCONFIG_ALLMULTI); + + if (bp->flags & B44_FLAG_B0_ANDLATER) { + + bw32(bp, B44_WKUP_LEN, WKUP_LEN_DISABLE); + + val = bp->dev->dev_addr[2] << 24 | + bp->dev->dev_addr[3] << 16 | + bp->dev->dev_addr[4] << 8 | + bp->dev->dev_addr[5]; + bw32(bp, B44_ADDR_LO, val); + + val = bp->dev->dev_addr[0] << 8 | + bp->dev->dev_addr[1]; + bw32(bp, B44_ADDR_HI, val); + + val = br32(bp, B44_DEVCTRL); + bw32(bp, B44_DEVCTRL, val | DEVCTRL_MPM | DEVCTRL_PFE); + + } else { + b44_setup_pseudo_magicp(bp); + } + + val = br32(bp, B44_SBTMSLOW); + bw32(bp, B44_SBTMSLOW, val | SBTMSLOW_PE); + + pci_read_config_word(bp->pdev, SSB_PMCSR, &pmval); + pci_write_config_word(bp->pdev, SSB_PMCSR, pmval | SSB_PE); + +} + static int b44_close(struct net_device *dev) { struct b44 *bp = netdev_priv(dev); @@ -1476,6 +1626,11 @@ static int b44_close(struct net_device *dev) netif_poll_enable(dev); + if (bp->flags & B44_FLAG_WOL_ENABLE) { + b44_init_hw(bp, 0); + b44_setup_wol(bp); + } + b44_free_consistent(bp); return 0; @@ -1621,8 +1776,6 @@ static int b44_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) { struct b44 *bp = netdev_priv(dev); - if (!netif_running(dev)) - return -EAGAIN; cmd->supported = (SUPPORTED_Autoneg); cmd->supported |= (SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | @@ -1650,6 +1803,12 @@ static int b44_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) XCVR_INTERNAL : XCVR_EXTERNAL; cmd->autoneg = (bp->flags & B44_FLAG_FORCE_LINK) ? AUTONEG_DISABLE : AUTONEG_ENABLE; + if (cmd->autoneg == AUTONEG_ENABLE) + cmd->advertising |= ADVERTISED_Autoneg; + if (!netif_running(dev)){ + cmd->speed = 0; + cmd->duplex = 0xff; + } cmd->maxtxpkt = 0; cmd->maxrxpkt = 0; return 0; @@ -1659,9 +1818,6 @@ static int b44_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) { struct b44 *bp = netdev_priv(dev); - if (!netif_running(dev)) - return -EAGAIN; - /* We do not support gigabit. */ if (cmd->autoneg == AUTONEG_ENABLE) { if (cmd->advertising & @@ -1678,28 +1834,39 @@ static int b44_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) spin_lock_irq(&bp->lock); if (cmd->autoneg == AUTONEG_ENABLE) { - bp->flags &= ~B44_FLAG_FORCE_LINK; - bp->flags &= ~(B44_FLAG_ADV_10HALF | + bp->flags &= ~(B44_FLAG_FORCE_LINK | + B44_FLAG_100_BASE_T | + B44_FLAG_FULL_DUPLEX | + B44_FLAG_ADV_10HALF | B44_FLAG_ADV_10FULL | B44_FLAG_ADV_100HALF | B44_FLAG_ADV_100FULL); - if (cmd->advertising & ADVERTISE_10HALF) - bp->flags |= B44_FLAG_ADV_10HALF; - if (cmd->advertising & ADVERTISE_10FULL) - bp->flags |= B44_FLAG_ADV_10FULL; - if (cmd->advertising & ADVERTISE_100HALF) - bp->flags |= B44_FLAG_ADV_100HALF; - if (cmd->advertising & ADVERTISE_100FULL) - bp->flags |= B44_FLAG_ADV_100FULL; + if (cmd->advertising == 0) { + bp->flags |= (B44_FLAG_ADV_10HALF | + B44_FLAG_ADV_10FULL | + B44_FLAG_ADV_100HALF | + B44_FLAG_ADV_100FULL); + } else { + if (cmd->advertising & ADVERTISED_10baseT_Half) + bp->flags |= B44_FLAG_ADV_10HALF; + if (cmd->advertising & ADVERTISED_10baseT_Full) + bp->flags |= B44_FLAG_ADV_10FULL; + if (cmd->advertising & ADVERTISED_100baseT_Half) + bp->flags |= B44_FLAG_ADV_100HALF; + if (cmd->advertising & ADVERTISED_100baseT_Full) + bp->flags |= B44_FLAG_ADV_100FULL; + } } else { bp->flags |= B44_FLAG_FORCE_LINK; + bp->flags &= ~(B44_FLAG_100_BASE_T | B44_FLAG_FULL_DUPLEX); if (cmd->speed == SPEED_100) bp->flags |= B44_FLAG_100_BASE_T; if (cmd->duplex == DUPLEX_FULL) bp->flags |= B44_FLAG_FULL_DUPLEX; } - b44_setup_phy(bp); + if (netif_running(dev)) + b44_setup_phy(bp); spin_unlock_irq(&bp->lock); @@ -1735,7 +1902,7 @@ static int b44_set_ringparam(struct net_device *dev, b44_halt(bp); b44_init_rings(bp); - b44_init_hw(bp); + b44_init_hw(bp, 1); netif_wake_queue(bp->dev); spin_unlock_irq(&bp->lock); @@ -1778,7 +1945,7 @@ static int b44_set_pauseparam(struct net_device *dev, if (bp->flags & B44_FLAG_PAUSE_AUTO) { b44_halt(bp); b44_init_rings(bp); - b44_init_hw(bp); + b44_init_hw(bp, 1); } else { __b44_set_flow_ctrl(bp, bp->flags); } @@ -1820,12 +1987,40 @@ static void b44_get_ethtool_stats(struct net_device *dev, spin_unlock_irq(&bp->lock); } +static void b44_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) +{ + struct b44 *bp = netdev_priv(dev); + + wol->supported = WAKE_MAGIC; + if (bp->flags & B44_FLAG_WOL_ENABLE) + wol->wolopts = WAKE_MAGIC; + else + wol->wolopts = 0; + memset(&wol->sopass, 0, sizeof(wol->sopass)); +} + +static int b44_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) +{ + struct b44 *bp = netdev_priv(dev); + + spin_lock_irq(&bp->lock); + if (wol->wolopts & WAKE_MAGIC) + bp->flags |= B44_FLAG_WOL_ENABLE; + else + bp->flags &= ~B44_FLAG_WOL_ENABLE; + spin_unlock_irq(&bp->lock); + + return 0; +} + static struct ethtool_ops b44_ethtool_ops = { .get_drvinfo = b44_get_drvinfo, .get_settings = b44_get_settings, .set_settings = b44_set_settings, .nway_reset = b44_nway_reset, .get_link = ethtool_op_get_link, + .get_wol = b44_get_wol, + .set_wol = b44_set_wol, .get_ringparam = b44_get_ringparam, .set_ringparam = b44_set_ringparam, .get_pauseparam = b44_get_pauseparam, @@ -1904,6 +2099,10 @@ static int __devinit b44_get_invariants(struct b44 *bp) /* XXX - really required? bp->flags |= B44_FLAG_BUGGY_TXPTR; */ + + if (ssb_get_core_rev(bp) >= 7) + bp->flags |= B44_FLAG_B0_ANDLATER; + out: return err; } @@ -1922,13 +2121,14 @@ static int __devinit b44_init_one(struct pci_dev *pdev, err = pci_enable_device(pdev); if (err) { - printk(KERN_ERR PFX "Cannot enable PCI device, " + dev_err(&pdev->dev, "Cannot enable PCI device, " "aborting.\n"); return err; } if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) { - printk(KERN_ERR PFX "Cannot find proper PCI device " + dev_err(&pdev->dev, + "Cannot find proper PCI device " "base address, aborting.\n"); err = -ENODEV; goto err_out_disable_pdev; @@ -1936,8 +2136,8 @@ static int __devinit b44_init_one(struct pci_dev *pdev, err = pci_request_regions(pdev, DRV_MODULE_NAME); if (err) { - printk(KERN_ERR PFX "Cannot obtain PCI resources, " - "aborting.\n"); + dev_err(&pdev->dev, + "Cannot obtain PCI resources, aborting.\n"); goto err_out_disable_pdev; } @@ -1945,15 +2145,13 @@ static int __devinit b44_init_one(struct pci_dev *pdev, err = pci_set_dma_mask(pdev, (u64) B44_DMA_MASK); if (err) { - printk(KERN_ERR PFX "No usable DMA configuration, " - "aborting.\n"); + dev_err(&pdev->dev, "No usable DMA configuration, aborting.\n"); goto err_out_free_res; } err = pci_set_consistent_dma_mask(pdev, (u64) B44_DMA_MASK); if (err) { - printk(KERN_ERR PFX "No usable DMA configuration, " - "aborting.\n"); + dev_err(&pdev->dev, "No usable DMA configuration, aborting.\n"); goto err_out_free_res; } @@ -1962,7 +2160,7 @@ static int __devinit b44_init_one(struct pci_dev *pdev, dev = alloc_etherdev(sizeof(*bp)); if (!dev) { - printk(KERN_ERR PFX "Etherdev alloc failed, aborting.\n"); + dev_err(&pdev->dev, "Etherdev alloc failed, aborting.\n"); err = -ENOMEM; goto err_out_free_res; } @@ -1983,8 +2181,7 @@ static int __devinit b44_init_one(struct pci_dev *pdev, bp->regs = ioremap(b44reg_base, b44reg_len); if (bp->regs == 0UL) { - printk(KERN_ERR PFX "Cannot map device registers, " - "aborting.\n"); + dev_err(&pdev->dev, "Cannot map device registers, aborting.\n"); err = -ENOMEM; goto err_out_free_dev; } @@ -2014,8 +2211,8 @@ static int __devinit b44_init_one(struct pci_dev *pdev, err = b44_get_invariants(bp); if (err) { - printk(KERN_ERR PFX "Problem fetching invariants of chip, " - "aborting.\n"); + dev_err(&pdev->dev, + "Problem fetching invariants of chip, aborting.\n"); goto err_out_iounmap; } @@ -2035,8 +2232,7 @@ static int __devinit b44_init_one(struct pci_dev *pdev, err = register_netdev(dev); if (err) { - printk(KERN_ERR PFX "Cannot register net device, " - "aborting.\n"); + dev_err(&pdev->dev, "Cannot register net device, aborting.\n"); goto err_out_iounmap; } @@ -2104,6 +2300,10 @@ static int b44_suspend(struct pci_dev *pdev, pm_message_t state) spin_unlock_irq(&bp->lock); free_irq(dev->irq, dev); + if (bp->flags & B44_FLAG_WOL_ENABLE) { + b44_init_hw(bp, 0); + b44_setup_wol(bp); + } pci_disable_device(pdev); return 0; } @@ -2120,13 +2320,13 @@ static int b44_resume(struct pci_dev *pdev) if (!netif_running(dev)) return 0; - if (request_irq(dev->irq, b44_interrupt, SA_SHIRQ, dev->name, dev)) + if (request_irq(dev->irq, b44_interrupt, IRQF_SHARED, dev->name, dev)) printk(KERN_ERR PFX "%s: request_irq failed\n", dev->name); spin_lock_irq(&bp->lock); b44_init_rings(bp); - b44_init_hw(bp); + b44_init_hw(bp, 1); netif_device_attach(bp->dev); spin_unlock_irq(&bp->lock); diff --git a/drivers/net/b44.h b/drivers/net/b44.h index b17866297..4944507fa 100644 --- a/drivers/net/b44.h +++ b/drivers/net/b44.h @@ -24,6 +24,9 @@ #define WKUP_LEN_P3_MASK 0x7f000000 /* Pattern 3 */ #define WKUP_LEN_P3_SHIFT 24 #define WKUP_LEN_D3 0x80000000 +#define WKUP_LEN_DISABLE 0x80808080 +#define WKUP_LEN_ENABLE_TWO 0x80800000 +#define WKUP_LEN_ENABLE_THREE 0x80000000 #define B44_ISTAT 0x0020UL /* Interrupt Status */ #define ISTAT_LS 0x00000020 /* Link Change (B0 only) */ #define ISTAT_PME 0x00000040 /* Power Management Event */ @@ -264,6 +267,8 @@ #define SBIDHIGH_VC_SHIFT 16 /* SSB PCI config space registers. */ +#define SSB_PMCSR 0x44 +#define SSB_PE 0x100 #define SSB_BAR0_WIN 0x80 #define SSB_BAR1_WIN 0x84 #define SSB_SPROM_CONTROL 0x88 @@ -420,6 +425,7 @@ struct b44 { u32 dma_offset; u32 flags; +#define B44_FLAG_B0_ANDLATER 0x00000001 #define B44_FLAG_BUGGY_TXPTR 0x00000002 #define B44_FLAG_REORDER_BUG 0x00000004 #define B44_FLAG_PAUSE_AUTO 0x00008000 @@ -435,6 +441,7 @@ struct b44 { #define B44_FLAG_INTERNAL_PHY 0x10000000 #define B44_FLAG_RX_RING_HACK 0x20000000 #define B44_FLAG_TX_RING_HACK 0x40000000 +#define B44_FLAG_WOL_ENABLE 0x80000000 u32 rx_offset; diff --git a/drivers/net/bmac.c b/drivers/net/bmac.c index bbca8ae80..6fad83f24 100644 --- a/drivers/net/bmac.c +++ b/drivers/net/bmac.c @@ -7,7 +7,6 @@ * May 1999, Al Viro: proper release of /proc/net/bmac entry, switched to * dynamic procfs inode. */ -#include #include #include #include diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index a8f95e511..652eb05a6 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c @@ -9,7 +9,6 @@ * Written by: Michael Chan (mchan@broadcom.com) */ -#include #include #include @@ -32,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -49,14 +49,15 @@ #include #include #include +#include #include "bnx2.h" #include "bnx2_fw.h" #define DRV_MODULE_NAME "bnx2" #define PFX DRV_MODULE_NAME ": " -#define DRV_MODULE_VERSION "1.4.40" -#define DRV_MODULE_RELDATE "May 22, 2006" +#define DRV_MODULE_VERSION "1.4.44" +#define DRV_MODULE_RELDATE "August 10, 2006" #define RUN_AT(x) (jiffies + (x)) @@ -208,8 +209,10 @@ MODULE_DEVICE_TABLE(pci, bnx2_pci_tbl); static inline u32 bnx2_tx_avail(struct bnx2 *bp) { - u32 diff = TX_RING_IDX(bp->tx_prod) - TX_RING_IDX(bp->tx_cons); + u32 diff; + smp_mb(); + diff = TX_RING_IDX(bp->tx_prod) - TX_RING_IDX(bp->tx_cons); if (diff > MAX_TX_DESC_CNT) diff = (diff & MAX_TX_DESC_CNT) - 1; return (bp->tx_ring_size - diff); @@ -1568,7 +1571,7 @@ bnx2_alloc_rx_skb(struct bnx2 *bp, u16 index) struct rx_bd *rxbd = &bp->rx_desc_ring[RX_RING(index)][RX_IDX(index)]; unsigned long align; - skb = dev_alloc_skb(bp->rx_buf_size); + skb = netdev_alloc_skb(bp->dev, bp->rx_buf_size); if (skb == NULL) { return -ENOMEM; } @@ -1577,7 +1580,6 @@ bnx2_alloc_rx_skb(struct bnx2 *bp, u16 index) skb_reserve(skb, 8 - align); } - skb->dev = bp->dev; mapping = pci_map_single(bp->pdev, skb->data, bp->rx_buf_use_size, PCI_DMA_FROMDEVICE); @@ -1674,7 +1676,7 @@ bnx2_tx_int(struct bnx2 *bp) tx_free_bd += last + 1; - dev_kfree_skb_irq(skb); + dev_kfree_skb(skb); hw_cons = bp->hw_tx_cons = sblk->status_tx_quick_consumer_index0; @@ -1685,15 +1687,20 @@ bnx2_tx_int(struct bnx2 *bp) } bp->tx_cons = sw_cons; + /* Need to make the tx_cons update visible to bnx2_start_xmit() + * before checking for netif_queue_stopped(). Without the + * memory barrier, there is a small possibility that bnx2_start_xmit() + * will miss it and cause the queue to be stopped forever. + */ + smp_mb(); - if (unlikely(netif_queue_stopped(bp->dev))) { - spin_lock(&bp->tx_lock); + if (unlikely(netif_queue_stopped(bp->dev)) && + (bnx2_tx_avail(bp) > bp->tx_wake_thresh)) { + netif_tx_lock(bp->dev); if ((netif_queue_stopped(bp->dev)) && - (bnx2_tx_avail(bp) > MAX_SKB_FRAGS)) { - + (bnx2_tx_avail(bp) > bp->tx_wake_thresh)) netif_wake_queue(bp->dev); - } - spin_unlock(&bp->tx_lock); + netif_tx_unlock(bp->dev); } } @@ -1785,7 +1792,7 @@ bnx2_rx_int(struct bnx2 *bp, int budget) if ((bp->dev->mtu > 1500) && (len <= RX_COPY_THRESH)) { struct sk_buff *new_skb; - new_skb = dev_alloc_skb(len + 2); + new_skb = netdev_alloc_skb(bp->dev, len + 2); if (new_skb == NULL) goto reuse_rx; @@ -1796,7 +1803,6 @@ bnx2_rx_int(struct bnx2 *bp, int budget) skb_reserve(new_skb, 2); skb_put(new_skb, len); - new_skb->dev = bp->dev; bnx2_reuse_rx_skb(bp, skb, sw_ring_cons, sw_ring_prod); @@ -1820,9 +1826,9 @@ reuse_rx: skb->protocol = eth_type_trans(skb, bp->dev); if ((len > (bp->dev->mtu + ETH_HLEN)) && - (htons(skb->protocol) != 0x8100)) { + (ntohs(skb->protocol) != 0x8100)) { - dev_kfree_skb_irq(skb); + dev_kfree_skb(skb); goto next_rx; } @@ -2083,6 +2089,92 @@ bnx2_set_rx_mode(struct net_device *dev) spin_unlock_bh(&bp->phy_lock); } +#define FW_BUF_SIZE 0x8000 + +static int +bnx2_gunzip_init(struct bnx2 *bp) +{ + if ((bp->gunzip_buf = vmalloc(FW_BUF_SIZE)) == NULL) + goto gunzip_nomem1; + + if ((bp->strm = kmalloc(sizeof(*bp->strm), GFP_KERNEL)) == NULL) + goto gunzip_nomem2; + + bp->strm->workspace = kmalloc(zlib_inflate_workspacesize(), GFP_KERNEL); + if (bp->strm->workspace == NULL) + goto gunzip_nomem3; + + return 0; + +gunzip_nomem3: + kfree(bp->strm); + bp->strm = NULL; + +gunzip_nomem2: + vfree(bp->gunzip_buf); + bp->gunzip_buf = NULL; + +gunzip_nomem1: + printk(KERN_ERR PFX "%s: Cannot allocate firmware buffer for " + "uncompression.\n", bp->dev->name); + return -ENOMEM; +} + +static void +bnx2_gunzip_end(struct bnx2 *bp) +{ + kfree(bp->strm->workspace); + + kfree(bp->strm); + bp->strm = NULL; + + if (bp->gunzip_buf) { + vfree(bp->gunzip_buf); + bp->gunzip_buf = NULL; + } +} + +static int +bnx2_gunzip(struct bnx2 *bp, u8 *zbuf, int len, void **outbuf, int *outlen) +{ + int n, rc; + + /* check gzip header */ + if ((zbuf[0] != 0x1f) || (zbuf[1] != 0x8b) || (zbuf[2] != Z_DEFLATED)) + return -EINVAL; + + n = 10; + +#define FNAME 0x8 + if (zbuf[3] & FNAME) + while ((zbuf[n++] != 0) && (n < len)); + + bp->strm->next_in = zbuf + n; + bp->strm->avail_in = len - n; + bp->strm->next_out = bp->gunzip_buf; + bp->strm->avail_out = FW_BUF_SIZE; + + rc = zlib_inflateInit2(bp->strm, -MAX_WBITS); + if (rc != Z_OK) + return rc; + + rc = zlib_inflate(bp->strm, Z_FINISH); + + *outlen = FW_BUF_SIZE - bp->strm->avail_out; + *outbuf = bp->gunzip_buf; + + if ((rc != Z_OK) && (rc != Z_STREAM_END)) + printk(KERN_ERR PFX "%s: Firmware decompression error: %s\n", + bp->dev->name, bp->strm->msg); + + zlib_inflateEnd(bp->strm); + + if (rc == Z_STREAM_END) + return 0; + + return rc; +} + static void load_rv2p_fw(struct bnx2 *bp, u32 *rv2p_code, u32 rv2p_code_len, u32 rv2p_proc) @@ -2092,9 +2184,9 @@ load_rv2p_fw(struct bnx2 *bp, u32 *rv2p_code, u32 rv2p_code_len, for (i = 0; i < rv2p_code_len; i += 8) { - REG_WR(bp, BNX2_RV2P_INSTR_HIGH, *rv2p_code); + REG_WR(bp, BNX2_RV2P_INSTR_HIGH, cpu_to_le32(*rv2p_code)); rv2p_code++; - REG_WR(bp, BNX2_RV2P_INSTR_LOW, *rv2p_code); + REG_WR(bp, BNX2_RV2P_INSTR_LOW, cpu_to_le32(*rv2p_code)); rv2p_code++; if (rv2p_proc == RV2P_PROC1) { @@ -2134,7 +2226,7 @@ load_cpu_fw(struct bnx2 *bp, struct cpu_reg *cpu_reg, struct fw_info *fw) int j; for (j = 0; j < (fw->text_len / 4); j++, offset += 4) { - REG_WR_IND(bp, offset, fw->text[j]); + REG_WR_IND(bp, offset, cpu_to_le32(fw->text[j])); } } @@ -2190,15 +2282,32 @@ load_cpu_fw(struct bnx2 *bp, struct cpu_reg *cpu_reg, struct fw_info *fw) REG_WR_IND(bp, cpu_reg->mode, val); } -static void +static int bnx2_init_cpus(struct bnx2 *bp) { struct cpu_reg cpu_reg; struct fw_info fw; + int rc = 0; + void *text; + u32 text_len; + + if ((rc = bnx2_gunzip_init(bp)) != 0) + return rc; /* Initialize the RV2P processor. */ - load_rv2p_fw(bp, bnx2_rv2p_proc1, sizeof(bnx2_rv2p_proc1), RV2P_PROC1); - load_rv2p_fw(bp, bnx2_rv2p_proc2, sizeof(bnx2_rv2p_proc2), RV2P_PROC2); + rc = bnx2_gunzip(bp, bnx2_rv2p_proc1, sizeof(bnx2_rv2p_proc1), &text, + &text_len); + if (rc) + goto init_cpu_err; + + load_rv2p_fw(bp, text, text_len, RV2P_PROC1); + + rc = bnx2_gunzip(bp, bnx2_rv2p_proc2, sizeof(bnx2_rv2p_proc2), &text, + &text_len); + if (rc) + goto init_cpu_err; + + load_rv2p_fw(bp, text, text_len, RV2P_PROC2); /* Initialize the RX Processor. */ cpu_reg.mode = BNX2_RXP_CPU_MODE; @@ -2222,7 +2331,13 @@ bnx2_init_cpus(struct bnx2 *bp) fw.text_addr = bnx2_RXP_b06FwTextAddr; fw.text_len = bnx2_RXP_b06FwTextLen; fw.text_index = 0; - fw.text = bnx2_RXP_b06FwText; + + rc = bnx2_gunzip(bp, bnx2_RXP_b06FwText, sizeof(bnx2_RXP_b06FwText), + &text, &text_len); + if (rc) + goto init_cpu_err; + + fw.text = text; fw.data_addr = bnx2_RXP_b06FwDataAddr; fw.data_len = bnx2_RXP_b06FwDataLen; @@ -2268,7 +2383,13 @@ bnx2_init_cpus(struct bnx2 *bp) fw.text_addr = bnx2_TXP_b06FwTextAddr; fw.text_len = bnx2_TXP_b06FwTextLen; fw.text_index = 0; - fw.text = bnx2_TXP_b06FwText; + + rc = bnx2_gunzip(bp, bnx2_TXP_b06FwText, sizeof(bnx2_TXP_b06FwText), + &text, &text_len); + if (rc) + goto init_cpu_err; + + fw.text = text; fw.data_addr = bnx2_TXP_b06FwDataAddr; fw.data_len = bnx2_TXP_b06FwDataLen; @@ -2314,7 +2435,13 @@ bnx2_init_cpus(struct bnx2 *bp) fw.text_addr = bnx2_TPAT_b06FwTextAddr; fw.text_len = bnx2_TPAT_b06FwTextLen; fw.text_index = 0; - fw.text = bnx2_TPAT_b06FwText; + + rc = bnx2_gunzip(bp, bnx2_TPAT_b06FwText, sizeof(bnx2_TPAT_b06FwText), + &text, &text_len); + if (rc) + goto init_cpu_err; + + fw.text = text; fw.data_addr = bnx2_TPAT_b06FwDataAddr; fw.data_len = bnx2_TPAT_b06FwDataLen; @@ -2360,7 +2487,13 @@ bnx2_init_cpus(struct bnx2 *bp) fw.text_addr = bnx2_COM_b06FwTextAddr; fw.text_len = bnx2_COM_b06FwTextLen; fw.text_index = 0; - fw.text = bnx2_COM_b06FwText; + + rc = bnx2_gunzip(bp, bnx2_COM_b06FwText, sizeof(bnx2_COM_b06FwText), + &text, &text_len); + if (rc) + goto init_cpu_err; + + fw.text = text; fw.data_addr = bnx2_COM_b06FwDataAddr; fw.data_len = bnx2_COM_b06FwDataLen; @@ -2384,6 +2517,9 @@ bnx2_init_cpus(struct bnx2 *bp) load_cpu_fw(bp, &cpu_reg, &fw); +init_cpu_err: + bnx2_gunzip_end(bp); + return rc; } static int @@ -3256,7 +3392,9 @@ bnx2_init_chip(struct bnx2 *bp) * context block must have already been enabled. */ bnx2_init_context(bp); - bnx2_init_cpus(bp); + if ((rc = bnx2_init_cpus(bp)) != 0) + return rc; + bnx2_init_nvram(bp); bnx2_set_mac_addr(bp); @@ -3370,6 +3508,8 @@ bnx2_init_tx_ring(struct bnx2 *bp) struct tx_bd *txbd; u32 val; + bp->tx_wake_thresh = bp->tx_ring_size / 2; + txbd = &bp->tx_desc_ring[MAX_TX_DESC_CNT]; txbd->tx_bd_haddr_hi = (u64) bp->tx_desc_mapping >> 32; @@ -3509,7 +3649,7 @@ bnx2_free_tx_skbs(struct bnx2 *bp) skb_shinfo(skb)->frags[j].size, PCI_DMA_TODEVICE); } - dev_kfree_skb_any(skb); + dev_kfree_skb(skb); i += j + 1; } @@ -3535,7 +3675,7 @@ bnx2_free_rx_skbs(struct bnx2 *bp) rx_buf->skb = NULL; - dev_kfree_skb_any(skb); + dev_kfree_skb(skb); } } @@ -3556,7 +3696,9 @@ bnx2_reset_nic(struct bnx2 *bp, u32 reset_code) if (rc) return rc; - bnx2_init_chip(bp); + if ((rc = bnx2_init_chip(bp)) != 0) + return rc; + bnx2_init_tx_ring(bp); bnx2_init_rx_ring(bp); return 0; @@ -3817,7 +3959,7 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode) return -EINVAL; pkt_size = 1514; - skb = dev_alloc_skb(pkt_size); + skb = netdev_alloc_skb(bp->dev, pkt_size); if (!skb) return -ENOMEM; packet = skb_put(skb, pkt_size); @@ -3863,7 +4005,7 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode) udelay(5); pci_unmap_single(bp->pdev, map, pkt_size, PCI_DMA_TODEVICE); - dev_kfree_skb_irq(skb); + dev_kfree_skb(skb); if (bp->status_blk->status_tx_quick_consumer_index0 != bp->tx_prod) { goto loopback_test_done; @@ -4034,6 +4176,8 @@ bnx2_timer(unsigned long data) msg = (u32) ++bp->fw_drv_pulse_wr_seq; REG_WR_IND(bp, bp->shmem_base + BNX2_DRV_PULSE_MB, msg); + bp->stats_blk->stat_FwRxDrop = REG_RD_IND(bp, BNX2_FW_RX_DROP_COUNT); + if ((bp->phy_flags & PHY_SERDES_FLAG) && (CHIP_NUM(bp) == CHIP_NUM_5706)) { @@ -4123,11 +4267,11 @@ bnx2_open(struct net_device *dev) } else { rc = request_irq(bp->pdev->irq, bnx2_interrupt, - SA_SHIRQ, dev->name, dev); + IRQF_SHARED, dev->name, dev); } } else { - rc = request_irq(bp->pdev->irq, bnx2_interrupt, SA_SHIRQ, + rc = request_irq(bp->pdev->irq, bnx2_interrupt, IRQF_SHARED, dev->name, dev); } if (rc) { @@ -4174,7 +4318,7 @@ bnx2_open(struct net_device *dev) if (!rc) { rc = request_irq(bp->pdev->irq, bnx2_interrupt, - SA_SHIRQ, dev->name, dev); + IRQF_SHARED, dev->name, dev); } if (rc) { bnx2_free_skbs(bp); @@ -4253,10 +4397,8 @@ bnx2_vlan_rx_kill_vid(struct net_device *dev, uint16_t vid) #endif /* Called with netif_tx_lock. - * hard_start_xmit is pseudo-lockless - a lock is only required when - * the tx queue is full. This way, we get the benefit of lockless - * operations most of the time without the complexities to handle - * netif_stop_queue/wake_queue race conditions. + * bnx2_tx_int() runs without netif_tx_lock unless it needs to call + * netif_wake_queue(). */ static int bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev) @@ -4310,7 +4452,7 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev) ip_tcp_len = (skb->nh.iph->ihl << 2) + sizeof(struct tcphdr); skb->nh.iph->check = 0; - skb->nh.iph->tot_len = ntohs(mss + ip_tcp_len + tcp_opt_len); + skb->nh.iph->tot_len = htons(mss + ip_tcp_len + tcp_opt_len); skb->h.th->check = ~csum_tcpudp_magic(skb->nh.iph->saddr, skb->nh.iph->daddr, @@ -4375,12 +4517,9 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev) dev->trans_start = jiffies; if (unlikely(bnx2_tx_avail(bp) <= MAX_SKB_FRAGS)) { - spin_lock(&bp->tx_lock); netif_stop_queue(dev); - - if (bnx2_tx_avail(bp) > MAX_SKB_FRAGS) + if (bnx2_tx_avail(bp) > bp->tx_wake_thresh) netif_wake_queue(dev); - spin_unlock(&bp->tx_lock); } return NETDEV_TX_OK; @@ -4403,7 +4542,7 @@ bnx2_close(struct net_device *dev) bnx2_netif_stop(bp); del_timer_sync(&bp->timer); if (bp->flags & NO_WOL_FLAG) - reset_code = BNX2_DRV_MSG_CODE_UNLOAD; + reset_code = BNX2_DRV_MSG_CODE_UNLOAD_LNK_DN; else if (bp->wol) reset_code = BNX2_DRV_MSG_CODE_SUSPEND_WOL; else @@ -4504,6 +4643,10 @@ bnx2_get_stats(struct net_device *dev) net_stats->tx_aborted_errors + net_stats->tx_carrier_errors; + net_stats->rx_missed_errors = + (unsigned long) (stats_blk->stat_IfInMBUFDiscards + + stats_blk->stat_FwRxDrop); + return net_stats; } @@ -4986,7 +5129,17 @@ bnx2_set_rx_csum(struct net_device *dev, u32 data) return 0; } -#define BNX2_NUM_STATS 45 +static int +bnx2_set_tso(struct net_device *dev, u32 data) +{ + if (data) + dev->features |= NETIF_F_TSO | NETIF_F_TSO_ECN; + else + dev->features &= ~(NETIF_F_TSO | NETIF_F_TSO_ECN); + return 0; +} + +#define BNX2_NUM_STATS 46 static struct { char string[ETH_GSTRING_LEN]; @@ -5036,6 +5189,7 @@ static struct { { "rx_mac_ctrl_frames" }, { "rx_filtered_packets" }, { "rx_discards" }, + { "rx_fw_discards" }, }; #define STATS_OFFSET32(offset_name) (offsetof(struct statistics_block, offset_name) / 4) @@ -5086,6 +5240,7 @@ static const unsigned long bnx2_stats_offset_arr[BNX2_NUM_STATS] = { STATS_OFFSET32(stat_MacControlFramesReceived), STATS_OFFSET32(stat_IfInFramesL2FilterDiscards), STATS_OFFSET32(stat_IfInMBUFDiscards), + STATS_OFFSET32(stat_FwRxDrop), }; /* stat_IfHCInBadOctets and stat_Dot3StatsCarrierSenseErrors are @@ -5096,7 +5251,7 @@ static u8 bnx2_5706_stats_len_arr[BNX2_NUM_STATS] = { 4,0,4,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4, + 4,4,4,4,4,4, }; static u8 bnx2_5708_stats_len_arr[BNX2_NUM_STATS] = { @@ -5104,7 +5259,7 @@ static u8 bnx2_5708_stats_len_arr[BNX2_NUM_STATS] = { 4,4,4,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,4,4, - 4,4,4,4,4, + 4,4,4,4,4,4, }; #define BNX2_NUM_TESTS 6 @@ -5301,7 +5456,7 @@ static struct ethtool_ops bnx2_ethtool_ops = { .set_sg = ethtool_op_set_sg, #ifdef BCM_TSO .get_tso = ethtool_op_get_tso, - .set_tso = ethtool_op_set_tso, + .set_tso = bnx2_set_tso, #endif .self_test_count = bnx2_self_test_count, .self_test = bnx2_self_test, @@ -5422,20 +5577,20 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) /* enable device (incl. PCI PM wakeup), and bus-mastering */ rc = pci_enable_device(pdev); if (rc) { - printk(KERN_ERR PFX "Cannot enable PCI device, aborting."); + dev_err(&pdev->dev, "Cannot enable PCI device, aborting."); goto err_out; } if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) { - printk(KERN_ERR PFX "Cannot find PCI device base address, " - "aborting.\n"); + dev_err(&pdev->dev, + "Cannot find PCI device base address, aborting.\n"); rc = -ENODEV; goto err_out_disable; } rc = pci_request_regions(pdev, DRV_MODULE_NAME); if (rc) { - printk(KERN_ERR PFX "Cannot obtain PCI resources, aborting.\n"); + dev_err(&pdev->dev, "Cannot obtain PCI resources, aborting.\n"); goto err_out_disable; } @@ -5443,15 +5598,15 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) bp->pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM); if (bp->pm_cap == 0) { - printk(KERN_ERR PFX "Cannot find power management capability, " - "aborting.\n"); + dev_err(&pdev->dev, + "Cannot find power management capability, aborting.\n"); rc = -EIO; goto err_out_release; } bp->pcix_cap = pci_find_capability(pdev, PCI_CAP_ID_PCIX); if (bp->pcix_cap == 0) { - printk(KERN_ERR PFX "Cannot find PCIX capability, aborting.\n"); + dev_err(&pdev->dev, "Cannot find PCIX capability, aborting.\n"); rc = -EIO; goto err_out_release; } @@ -5459,14 +5614,14 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) if (pci_set_dma_mask(pdev, DMA_64BIT_MASK) == 0) { bp->flags |= USING_DAC_FLAG; if (pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK) != 0) { - printk(KERN_ERR PFX "pci_set_consistent_dma_mask " - "failed, aborting.\n"); + dev_err(&pdev->dev, + "pci_set_consistent_dma_mask failed, aborting.\n"); rc = -EIO; goto err_out_release; } } else if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) != 0) { - printk(KERN_ERR PFX "System does not support DMA, aborting.\n"); + dev_err(&pdev->dev, "System does not support DMA, aborting.\n"); rc = -EIO; goto err_out_release; } @@ -5475,7 +5630,6 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) bp->pdev = pdev; spin_lock_init(&bp->phy_lock); - spin_lock_init(&bp->tx_lock); INIT_WORK(&bp->reset_task, bnx2_reset_task, bp); dev->base_addr = dev->mem_start = pci_resource_start(pdev, 0); @@ -5486,7 +5640,7 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) bp->regview = ioremap_nocache(dev->base_addr, mem_len); if (!bp->regview) { - printk(KERN_ERR PFX "Cannot map register space, aborting.\n"); + dev_err(&pdev->dev, "Cannot map register space, aborting.\n"); rc = -ENOMEM; goto err_out_release; } @@ -5558,8 +5712,8 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) else if ((CHIP_ID(bp) == CHIP_ID_5706_A1) && !(bp->flags & PCIX_FLAG)) { - printk(KERN_ERR PFX "5706 A1 can only be used in a PCIX bus, " - "aborting.\n"); + dev_err(&pdev->dev, + "5706 A1 can only be used in a PCIX bus, aborting.\n"); goto err_out_unmap; } @@ -5580,7 +5734,7 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) if ((reg & BNX2_DEV_INFO_SIGNATURE_MAGIC_MASK) != BNX2_DEV_INFO_SIGNATURE_MAGIC) { - printk(KERN_ERR PFX "Firmware not running, aborting.\n"); + dev_err(&pdev->dev, "Firmware not running, aborting.\n"); rc = -ENODEV; goto err_out_unmap; } @@ -5598,7 +5752,7 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) bp->mac_addr[5] = (u8) reg; bp->tx_ring_size = MAX_TX_DESC_CNT; - bnx2_set_rx_ring_size(bp, 100); + bnx2_set_rx_ring_size(bp, 255); bp->rx_csum = 1; @@ -5634,7 +5788,9 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) } } - if (CHIP_NUM(bp) == CHIP_NUM_5708) + if ((CHIP_ID(bp) == CHIP_ID_5708_A0) || + (CHIP_ID(bp) == CHIP_ID_5708_B0) || + (CHIP_ID(bp) == CHIP_ID_5708_B1)) bp->flags |= NO_WOL_FLAG; if (CHIP_ID(bp) == CHIP_ID_5706_A0) { @@ -5740,7 +5896,7 @@ bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) #endif if ((rc = register_netdev(dev))) { - printk(KERN_ERR PFX "Cannot register net device\n"); + dev_err(&pdev->dev, "Cannot register net device\n"); if (bp->regview) iounmap(bp->regview); pci_release_regions(pdev); @@ -5780,7 +5936,7 @@ bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; #endif #ifdef BCM_TSO - dev->features |= NETIF_F_TSO; + dev->features |= NETIF_F_TSO | NETIF_F_TSO_ECN; #endif netif_carrier_off(bp->dev); @@ -5822,7 +5978,7 @@ bnx2_suspend(struct pci_dev *pdev, pm_message_t state) netif_device_detach(dev); del_timer_sync(&bp->timer); if (bp->flags & NO_WOL_FLAG) - reset_code = BNX2_DRV_MSG_CODE_UNLOAD; + reset_code = BNX2_DRV_MSG_CODE_UNLOAD_LNK_DN; else if (bp->wol) reset_code = BNX2_DRV_MSG_CODE_SUSPEND_WOL; else diff --git a/drivers/net/bnx2.h b/drivers/net/bnx2.h index 8214a2853..fe804763c 100644 --- a/drivers/net/bnx2.h +++ b/drivers/net/bnx2.h @@ -1,6 +1,6 @@ /* bnx2.h: Broadcom NX2 network driver. * - * Copyright (c) 2004, 2005 Broadcom Corporation + * Copyright (c) 2004, 2005, 2006 Broadcom Corporation * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -13,44 +13,6 @@ #ifndef BNX2_H #define BNX2_H -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef NETIF_F_HW_VLAN_TX -#include -#define BCM_VLAN 1 -#endif -#ifdef NETIF_F_TSO -#include -#include -#include -#define BCM_TSO 1 -#endif -#include -#include - /* Hardware data structures and register definitions automatically * generated from RTL code. Do not modify. */ @@ -269,6 +231,7 @@ struct statistics_block { u32 stat_GenStat13; u32 stat_GenStat14; u32 stat_GenStat15; + u32 stat_FwRxDrop; }; @@ -276,19 +239,7 @@ struct statistics_block { * l2_fhdr definition */ struct l2_fhdr { -#if defined(__BIG_ENDIAN) - u16 l2_fhdr_errors; - u16 l2_fhdr_status; -#elif defined(__LITTLE_ENDIAN) - u16 l2_fhdr_status; - u16 l2_fhdr_errors; -#endif - #define L2_FHDR_ERRORS_BAD_CRC (1<<1) - #define L2_FHDR_ERRORS_PHY_DECODE (1<<2) - #define L2_FHDR_ERRORS_ALIGNMENT (1<<3) - #define L2_FHDR_ERRORS_TOO_SHORT (1<<4) - #define L2_FHDR_ERRORS_GIANT_FRAME (1<<5) - + u32 l2_fhdr_status; #define L2_FHDR_STATUS_RULE_CLASS (0x7<<0) #define L2_FHDR_STATUS_RULE_P2 (1<<3) #define L2_FHDR_STATUS_RULE_P3 (1<<4) @@ -300,6 +251,14 @@ struct l2_fhdr { #define L2_FHDR_STATUS_TCP_SEGMENT (1<<14) #define L2_FHDR_STATUS_UDP_DATAGRAM (1<<15) + #define L2_FHDR_ERRORS_BAD_CRC (1<<17) + #define L2_FHDR_ERRORS_PHY_DECODE (1<<18) + #define L2_FHDR_ERRORS_ALIGNMENT (1<<19) + #define L2_FHDR_ERRORS_TOO_SHORT (1<<20) + #define L2_FHDR_ERRORS_GIANT_FRAME (1<<21) + #define L2_FHDR_ERRORS_TCP_XSUM (1<<28) + #define L2_FHDR_ERRORS_UDP_XSUM (1<<31) + u32 l2_fhdr_hash; #if defined(__BIG_ENDIAN) u16 l2_fhdr_pkt_len; @@ -1448,8 +1407,9 @@ struct l2_fhdr { #define BNX2_EMAC_MODE_PORT_NONE (0L<<2) #define BNX2_EMAC_MODE_PORT_MII (1L<<2) #define BNX2_EMAC_MODE_PORT_GMII (2L<<2) -#define BNX2_EMAC_MODE_PORT_UNDEF (3L<<2) +#define BNX2_EMAC_MODE_PORT_MII_10 (3L<<2) #define BNX2_EMAC_MODE_MAC_LOOP (1L<<4) +#define BNX2_EMAC_MODE_25G (1L<<5) #define BNX2_EMAC_MODE_TAGGED_MAC_CTL (1L<<7) #define BNX2_EMAC_MODE_TX_BURST (1L<<8) #define BNX2_EMAC_MODE_MAX_DEFER_DROP_ENA (1L<<9) @@ -3522,6 +3482,8 @@ struct l2_fhdr { #define BNX2_COM_SCRATCH 0x00120000 +#define BNX2_FW_RX_DROP_COUNT 0x00120084 + /* * cp_reg definition @@ -3713,6 +3675,15 @@ struct l2_fhdr { #define BNX2_MCP_ROM 0x00150000 #define BNX2_MCP_SCRATCH 0x00160000 +#define BNX2_SHM_HDR_SIGNATURE BNX2_MCP_SCRATCH +#define BNX2_SHM_HDR_SIGNATURE_SIG_MASK 0xffff0000 +#define BNX2_SHM_HDR_SIGNATURE_SIG 0x53530000 +#define BNX2_SHM_HDR_SIGNATURE_VER_MASK 0x000000ff +#define BNX2_SHM_HDR_SIGNATURE_VER_ONE 0x00000001 + +#define BNX2_SHM_HDR_ADDR_0 BNX2_MCP_SCRATCH + 4 +#define BNX2_SHM_HDR_ADDR_1 BNX2_MCP_SCRATCH + 8 + #define NUM_MC_HASH_REGISTERS 8 @@ -3723,6 +3694,53 @@ struct l2_fhdr { #define PHY_ID(id) ((id) & 0xfffffff0) #define PHY_REV_ID(id) ((id) & 0xf) +/* 5708 Serdes PHY registers */ + +#define BCM5708S_UP1 0xb + +#define BCM5708S_UP1_2G5 0x1 + +#define BCM5708S_BLK_ADDR 0x1f + +#define BCM5708S_BLK_ADDR_DIG 0x0000 +#define BCM5708S_BLK_ADDR_DIG3 0x0002 +#define BCM5708S_BLK_ADDR_TX_MISC 0x0005 + +/* Digital Block */ +#define BCM5708S_1000X_CTL1 0x10 + +#define BCM5708S_1000X_CTL1_FIBER_MODE 0x0001 +#define BCM5708S_1000X_CTL1_AUTODET_EN 0x0010 + +#define BCM5708S_1000X_CTL2 0x11 + +#define BCM5708S_1000X_CTL2_PLLEL_DET_EN 0x0001 + +#define BCM5708S_1000X_STAT1 0x14 + +#define BCM5708S_1000X_STAT1_SGMII 0x0001 +#define BCM5708S_1000X_STAT1_LINK 0x0002 +#define BCM5708S_1000X_STAT1_FD 0x0004 +#define BCM5708S_1000X_STAT1_SPEED_MASK 0x0018 +#define BCM5708S_1000X_STAT1_SPEED_10 0x0000 +#define BCM5708S_1000X_STAT1_SPEED_100 0x0008 +#define BCM5708S_1000X_STAT1_SPEED_1G 0x0010 +#define BCM5708S_1000X_STAT1_SPEED_2G5 0x0018 +#define BCM5708S_1000X_STAT1_TX_PAUSE 0x0020 +#define BCM5708S_1000X_STAT1_RX_PAUSE 0x0040 + +/* Digital3 Block */ +#define BCM5708S_DIG_3_0 0x10 + +#define BCM5708S_DIG_3_0_USE_IEEE 0x0001 + +/* Tx/Misc Block */ +#define BCM5708S_TX_ACTL1 0x15 + +#define BCM5708S_TX_ACTL1_DRIVER_VCM 0x30 + +#define BCM5708S_TX_ACTL3 0x17 + #define MIN_ETHERNET_PACKET_SIZE 60 #define MAX_ETHERNET_PACKET_SIZE 1514 #define MAX_ETHERNET_JUMBO_PACKET_SIZE 9014 @@ -3732,14 +3750,21 @@ struct l2_fhdr { #define DMA_READ_CHANS 5 #define DMA_WRITE_CHANS 3 -#define BCM_PAGE_BITS 12 +/* Use CPU native page size up to 16K for the ring sizes. */ +#if (PAGE_SHIFT > 14) +#define BCM_PAGE_BITS 14 +#else +#define BCM_PAGE_BITS PAGE_SHIFT +#endif #define BCM_PAGE_SIZE (1 << BCM_PAGE_BITS) #define TX_DESC_CNT (BCM_PAGE_SIZE / sizeof(struct tx_bd)) #define MAX_TX_DESC_CNT (TX_DESC_CNT - 1) +#define MAX_RX_RINGS 4 #define RX_DESC_CNT (BCM_PAGE_SIZE / sizeof(struct rx_bd)) #define MAX_RX_DESC_CNT (RX_DESC_CNT - 1) +#define MAX_TOTAL_RX_DESC_CNT (MAX_RX_DESC_CNT * MAX_RX_RINGS) #define NEXT_TX_BD(x) (((x) & (MAX_TX_DESC_CNT - 1)) == \ (MAX_TX_DESC_CNT - 1)) ? \ @@ -3751,8 +3776,10 @@ struct l2_fhdr { (MAX_RX_DESC_CNT - 1)) ? \ (x) + 2 : (x) + 1 -#define RX_RING_IDX(x) ((x) & MAX_RX_DESC_CNT) +#define RX_RING_IDX(x) ((x) & bp->rx_max_ring_idx) +#define RX_RING(x) (((x) & ~MAX_RX_DESC_CNT) >> (BCM_PAGE_BITS - 4)) +#define RX_IDX(x) ((x) & MAX_RX_DESC_CNT) /* Context size. */ #define CTX_SHIFT 7 @@ -3798,7 +3825,7 @@ struct sw_bd { #define BUFFERED_FLASH_PHY_PAGE_SIZE (1 << BUFFERED_FLASH_PAGE_BITS) #define BUFFERED_FLASH_BYTE_ADDR_MASK (BUFFERED_FLASH_PHY_PAGE_SIZE-1) #define BUFFERED_FLASH_PAGE_SIZE 264 -#define BUFFERED_FLASH_TOTAL_SIZE 131072 +#define BUFFERED_FLASH_TOTAL_SIZE 0x21000 #define SAIFUN_FLASH_PAGE_BITS 8 #define SAIFUN_FLASH_PHY_PAGE_SIZE (1 << SAIFUN_FLASH_PAGE_BITS) @@ -3806,6 +3833,12 @@ struct sw_bd { #define SAIFUN_FLASH_PAGE_SIZE 256 #define SAIFUN_FLASH_BASE_TOTAL_SIZE 65536 +#define ST_MICRO_FLASH_PAGE_BITS 8 +#define ST_MICRO_FLASH_PHY_PAGE_SIZE (1 << ST_MICRO_FLASH_PAGE_BITS) +#define ST_MICRO_FLASH_BYTE_ADDR_MASK (ST_MICRO_FLASH_PHY_PAGE_SIZE-1) +#define ST_MICRO_FLASH_PAGE_SIZE 256 +#define ST_MICRO_FLASH_BASE_TOTAL_SIZE 65536 + #define NVRAM_TIMEOUT_COUNT 30000 @@ -3814,6 +3847,8 @@ struct sw_bd { BNX2_NVM_CFG1_PROTECT_MODE | \ BNX2_NVM_CFG1_FLASH_SIZE) +#define FLASH_BACKUP_STRAP_MASK (0xf << 26) + struct flash_spec { u32 strapping; u32 config1; @@ -3841,12 +3876,22 @@ struct bnx2 { struct status_block *status_blk; u32 last_status_idx; - atomic_t tx_avail_bd; - struct tx_bd *tx_desc_ring; - struct sw_bd *tx_buf_ring; - u32 tx_prod_bseq; - u16 tx_prod; - u16 tx_cons; + u32 flags; +#define PCIX_FLAG 1 +#define PCI_32BIT_FLAG 2 +#define ONE_TDMA_FLAG 4 /* no longer used */ +#define NO_WOL_FLAG 8 +#define USING_DAC_FLAG 0x10 +#define USING_MSI_FLAG 0x20 +#define ASF_ENABLE_FLAG 0x40 + + /* Put tx producer and consumer fields in separate cache lines. */ + + u32 tx_prod_bseq __attribute__((aligned(L1_CACHE_BYTES))); + u16 tx_prod; + + u16 tx_cons __attribute__((aligned(L1_CACHE_BYTES))); + u16 hw_tx_cons; #ifdef BCM_VLAN struct vlan_group *vlgrp; @@ -3855,41 +3900,42 @@ struct bnx2 { u32 rx_offset; u32 rx_buf_use_size; /* useable size */ u32 rx_buf_size; /* with alignment */ - struct rx_bd *rx_desc_ring; - struct sw_bd *rx_buf_ring; + u32 rx_max_ring_idx; + u32 rx_prod_bseq; u16 rx_prod; u16 rx_cons; + u16 hw_rx_cons; u32 rx_csum; - /* Only used to synchronize netif_stop_queue/wake_queue when tx */ - /* ring is full */ - spinlock_t tx_lock; + struct sw_bd *rx_buf_ring; + struct rx_bd *rx_desc_ring[MAX_RX_RINGS]; + + /* TX constants */ + struct tx_bd *tx_desc_ring; + struct sw_bd *tx_buf_ring; + int tx_ring_size; + u32 tx_wake_thresh; - /* End of fileds used in the performance code paths. */ + /* End of fields used in the performance code paths. */ char *name; int timer_interval; + int current_interval; struct timer_list timer; struct work_struct reset_task; + int in_reset_task; /* Used to synchronize phy accesses. */ spinlock_t phy_lock; - u32 flags; -#define PCIX_FLAG 1 -#define PCI_32BIT_FLAG 2 -#define ONE_TDMA_FLAG 4 /* no longer used */ -#define NO_WOL_FLAG 8 -#define USING_DAC_FLAG 0x10 -#define USING_MSI_FLAG 0x20 - u32 phy_flags; #define PHY_SERDES_FLAG 1 #define PHY_CRC_FIX_FLAG 2 #define PHY_PARALLEL_DETECT_FLAG 4 +#define PHY_2_5G_CAPABLE_FLAG 8 #define PHY_INT_MODE_MASK_FLAG 0x300 #define PHY_INT_MODE_AUTO_POLLING_FLAG 0x100 #define PHY_INT_MODE_LINK_READY_FLAG 0x200 @@ -3898,6 +3944,7 @@ struct bnx2 { /* chip num:16-31, rev:12-15, metal:4-11, bond_id:0-3 */ #define CHIP_NUM(bp) (((bp)->chip_id) & 0xffff0000) #define CHIP_NUM_5706 0x57060000 +#define CHIP_NUM_5708 0x57080000 #define CHIP_REV(bp) (((bp)->chip_id) & 0x0000f000) #define CHIP_REV_Ax 0x00000000 @@ -3910,6 +3957,10 @@ struct bnx2 { #define CHIP_ID(bp) (((bp)->chip_id) & 0xfffffff0) #define CHIP_ID_5706_A0 0x57060000 #define CHIP_ID_5706_A1 0x57060010 +#define CHIP_ID_5706_A2 0x57060020 +#define CHIP_ID_5708_A0 0x57080000 +#define CHIP_ID_5708_B0 0x57081000 +#define CHIP_ID_5708_B1 0x57081010 #define CHIP_BOND_ID(bp) (((bp)->chip_id) & 0xf) @@ -3922,17 +3973,17 @@ struct bnx2 { u16 bus_speed_mhz; u8 wol; - u8 fw_timed_out; + u8 pad; u16 fw_wr_seq; u16 fw_drv_pulse_wr_seq; - int tx_ring_size; dma_addr_t tx_desc_mapping; + int rx_max_ring; int rx_ring_size; - dma_addr_t rx_desc_mapping; + dma_addr_t rx_desc_mapping[MAX_RX_RINGS]; u16 tx_quick_cons_trip; u16 tx_quick_cons_trip_int; @@ -3956,6 +4007,7 @@ struct bnx2 { struct statistics_block *stats_blk; dma_addr_t stats_blk_mapping; + u32 hc_cmd; u32 rx_mode; u16 req_line_speed; @@ -3985,10 +4037,12 @@ struct bnx2 { #define PHY_LOOPBACK 2 u8 serdes_an_pending; -#define SERDES_AN_TIMEOUT (2 * HZ) +#define SERDES_AN_TIMEOUT (HZ / 3) u8 mac_addr[8]; + u32 shmem_base; + u32 fw_ver; int pm_cap; @@ -3997,6 +4051,12 @@ struct bnx2 { struct net_device_stats net_stats; struct flash_spec *flash_info; + u32 flash_size; + + int status_stats_size; + + struct z_stream_s *strm; + void *gunzip_buf; }; static u32 bnx2_reg_rd_ind(struct bnx2 *bp, u32 offset); @@ -4095,7 +4155,7 @@ struct fw_info { * the firmware has timed out, the driver will assume there is no firmware * running and there won't be any firmware-driver synchronization during a * driver reset. */ -#define FW_ACK_TIME_OUT_MS 50 +#define FW_ACK_TIME_OUT_MS 100 #define BNX2_DRV_RESET_SIGNATURE 0x00000000 @@ -4112,6 +4172,7 @@ struct fw_info { #define BNX2_DRV_MSG_CODE_PULSE 0x06000000 #define BNX2_DRV_MSG_CODE_DIAG 0x07000000 #define BNX2_DRV_MSG_CODE_SUSPEND_NO_WOL 0x09000000 +#define BNX2_DRV_MSG_CODE_UNLOAD_LNK_DN 0x0b000000 #define BNX2_DRV_MSG_DATA 0x00ff0000 #define BNX2_DRV_MSG_DATA_WAIT0 0x00010000 @@ -4128,14 +4189,46 @@ struct fw_info { #define BNX2_FW_MSG_STATUS_FAILURE 0x00ff0000 #define BNX2_LINK_STATUS 0x0000000c +#define BNX2_LINK_STATUS_INIT_VALUE 0xffffffff +#define BNX2_LINK_STATUS_LINK_UP 0x1 +#define BNX2_LINK_STATUS_LINK_DOWN 0x0 +#define BNX2_LINK_STATUS_SPEED_MASK 0x1e +#define BNX2_LINK_STATUS_AN_INCOMPLETE (0<<1) +#define BNX2_LINK_STATUS_10HALF (1<<1) +#define BNX2_LINK_STATUS_10FULL (2<<1) +#define BNX2_LINK_STATUS_100HALF (3<<1) +#define BNX2_LINK_STATUS_100BASE_T4 (4<<1) +#define BNX2_LINK_STATUS_100FULL (5<<1) +#define BNX2_LINK_STATUS_1000HALF (6<<1) +#define BNX2_LINK_STATUS_1000FULL (7<<1) +#define BNX2_LINK_STATUS_2500HALF (8<<1) +#define BNX2_LINK_STATUS_2500FULL (9<<1) +#define BNX2_LINK_STATUS_AN_ENABLED (1<<5) +#define BNX2_LINK_STATUS_AN_COMPLETE (1<<6) +#define BNX2_LINK_STATUS_PARALLEL_DET (1<<7) +#define BNX2_LINK_STATUS_RESERVED (1<<8) +#define BNX2_LINK_STATUS_PARTNER_AD_1000FULL (1<<9) +#define BNX2_LINK_STATUS_PARTNER_AD_1000HALF (1<<10) +#define BNX2_LINK_STATUS_PARTNER_AD_100BT4 (1<<11) +#define BNX2_LINK_STATUS_PARTNER_AD_100FULL (1<<12) +#define BNX2_LINK_STATUS_PARTNER_AD_100HALF (1<<13) +#define BNX2_LINK_STATUS_PARTNER_AD_10FULL (1<<14) +#define BNX2_LINK_STATUS_PARTNER_AD_10HALF (1<<15) +#define BNX2_LINK_STATUS_TX_FC_ENABLED (1<<16) +#define BNX2_LINK_STATUS_RX_FC_ENABLED (1<<17) +#define BNX2_LINK_STATUS_PARTNER_SYM_PAUSE_CAP (1<<18) +#define BNX2_LINK_STATUS_PARTNER_ASYM_PAUSE_CAP (1<<19) +#define BNX2_LINK_STATUS_SERDES_LINK (1<<20) +#define BNX2_LINK_STATUS_PARTNER_AD_2500FULL (1<<21) +#define BNX2_LINK_STATUS_PARTNER_AD_2500HALF (1<<22) #define BNX2_DRV_PULSE_MB 0x00000010 -#define BNX2_DRV_PULSE_SEQ_MASK 0x0000ffff +#define BNX2_DRV_PULSE_SEQ_MASK 0x00007fff /* Indicate to the firmware not to go into the * OS absent when it is not getting driver pulse. * This is used for debugging. */ -#define BNX2_DRV_MSG_DATA_PULSE_CODE_ALWAYS_ALIVE 0x00010000 +#define BNX2_DRV_MSG_DATA_PULSE_CODE_ALWAYS_ALIVE 0x00080000 #define BNX2_DEV_INFO_SIGNATURE 0x00000020 #define BNX2_DEV_INFO_SIGNATURE_MAGIC 0x44564900 @@ -4158,12 +4251,17 @@ struct fw_info { #define BNX2_SHARED_HW_CFG_DESIGN_LOM 0x1 #define BNX2_SHARED_HW_CFG_PHY_COPPER 0 #define BNX2_SHARED_HW_CFG_PHY_FIBER 0x2 +#define BNX2_SHARED_HW_CFG_PHY_2_5G 0x20 +#define BNX2_SHARED_HW_CFG_PHY_BACKPLANE 0x40 #define BNX2_SHARED_HW_CFG_LED_MODE_SHIFT_BITS 8 #define BNX2_SHARED_HW_CFG_LED_MODE_MASK 0x300 #define BNX2_SHARED_HW_CFG_LED_MODE_MAC 0 #define BNX2_SHARED_HW_CFG_LED_MODE_GPHY1 0x100 #define BNX2_SHARED_HW_CFG_LED_MODE_GPHY2 0x200 +#define BNX2_SHARED_HW_CFG_CONFIG2 0x00000040 +#define BNX2_SHARED_HW_CFG2_NVM_SIZE_MASK 0x00fff000 + #define BNX2_DEV_INFO_BC_REV 0x0000004c #define BNX2_PORT_HW_CFG_MAC_UPPER 0x00000050 @@ -4171,6 +4269,11 @@ struct fw_info { #define BNX2_PORT_HW_CFG_MAC_LOWER 0x00000054 #define BNX2_PORT_HW_CFG_CONFIG 0x00000058 +#define BNX2_PORT_HW_CFG_CFG_TXCTL3_MASK 0x0000ffff +#define BNX2_PORT_HW_CFG_CFG_DFLT_LINK_MASK 0x001f0000 +#define BNX2_PORT_HW_CFG_CFG_DFLT_LINK_AN 0x00000000 +#define BNX2_PORT_HW_CFG_CFG_DFLT_LINK_1G 0x00030000 +#define BNX2_PORT_HW_CFG_CFG_DFLT_LINK_2_5G 0x00040000 #define BNX2_PORT_HW_CFG_IMD_MAC_A_UPPER 0x00000068 #define BNX2_PORT_HW_CFG_IMD_MAC_A_LOWER 0x0000006c diff --git a/drivers/net/bnx2_fw.h b/drivers/net/bnx2_fw.h index 35f3a2ae5..2d753dca0 100644 --- a/drivers/net/bnx2_fw.h +++ b/drivers/net/bnx2_fw.h @@ -1,2468 +1,1966 @@ /* bnx2_fw.h: Broadcom NX2 network driver. * - * Copyright (c) 2004, 2005 Broadcom Corporation + * Copyright (c) 2004, 2005, 2006 Broadcom Corporation * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, except as noted below. * * This file contains firmware data derived from proprietary unpublished - * source code, Copyright (c) 2004, 2005 Broadcom Corporation. + * source code, Copyright (c) 2004, 2005, 2006 Broadcom Corporation. * * Permission is hereby granted for the distribution of this firmware data * in hexadecimal or equivalent format, provided this copyright notice is * accompanying it. */ +static const int bnx2_COM_b06FwReleaseMajor = 0x1; +static const int bnx2_COM_b06FwReleaseMinor = 0x0; +static const int bnx2_COM_b06FwReleaseFix = 0x0; +static const u32 bnx2_COM_b06FwStartAddr = 0x080008b4; +static const u32 bnx2_COM_b06FwTextAddr = 0x08000000; +static const int bnx2_COM_b06FwTextLen = 0x57bc; +static const u32 bnx2_COM_b06FwDataAddr = 0x08005840; +static const int bnx2_COM_b06FwDataLen = 0x0; +static const u32 bnx2_COM_b06FwRodataAddr = 0x080057c0; +static const int bnx2_COM_b06FwRodataLen = 0x58; +static const u32 bnx2_COM_b06FwBssAddr = 0x08005860; +static const int bnx2_COM_b06FwBssLen = 0x88; +static const u32 bnx2_COM_b06FwSbssAddr = 0x08005840; +static const int bnx2_COM_b06FwSbssLen = 0x1c; +static u8 bnx2_COM_b06FwText[] = { + 0x1f, 0x8b, 0x08, 0x08, 0x09, 0x83, 0x41, 0x44, 0x00, 0x03, 0x74, 0x65, + 0x73, 0x74, 0x31, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0xec, 0x5b, 0x7d, 0x6c, + 0x5b, 0xd7, 0x75, 0x3f, 0xef, 0xf1, 0x51, 0x7a, 0x96, 0x68, 0xf9, 0x99, + 0x7e, 0x96, 0x59, 0x4f, 0xb1, 0x49, 0xf1, 0xc9, 0xd2, 0x62, 0x2d, 0x63, + 0x34, 0x35, 0xd1, 0x3a, 0x26, 0x66, 0x48, 0xda, 0x71, 0x36, 0x67, 0xa0, + 0x1d, 0x05, 0x51, 0x51, 0xaf, 0xd0, 0x48, 0xd9, 0xcd, 0xb2, 0x0c, 0x73, + 0x96, 0xb4, 0x70, 0xbc, 0xb4, 0xa1, 0x25, 0x79, 0xf5, 0x06, 0x45, 0xcf, + 0xb3, 0x34, 0x39, 0xc0, 0x82, 0x41, 0x10, 0x9d, 0x3a, 0x7f, 0x30, 0xa5, + 0xed, 0x7c, 0x19, 0xe8, 0x12, 0x29, 0xb2, 0x93, 0xb5, 0x43, 0xd0, 0xa6, + 0x68, 0xff, 0xe8, 0x8a, 0x6e, 0x30, 0x52, 0x0c, 0xf3, 0x3a, 0xa0, 0x30, + 0xfa, 0xc7, 0xe6, 0x2d, 0x1f, 0xdc, 0xef, 0xdc, 0x77, 0x1f, 0xf9, 0x48, + 0x51, 0x96, 0x1c, 0x34, 0x5d, 0xb7, 0x99, 0x80, 0xf0, 0xde, 0xbd, 0xf7, + 0xbc, 0x7b, 0xcf, 0x3d, 0xdf, 0xe7, 0xdc, 0xab, 0x5f, 0x53, 0xa9, 0x85, + 0xe4, 0x6f, 0x2d, 0xfe, 0xc2, 0x7f, 0xf4, 0xc7, 0xb9, 0xdb, 0x3e, 0x7d, + 0x5b, 0x1f, 0x5e, 0x07, 0x54, 0xdd, 0xaf, 0x72, 0xbf, 0x0f, 0x7f, 0x26, + 0xfe, 0xfa, 0xe4, 0x7b, 0xa3, 0x9f, 0x81, 0xbf, 0x2b, 0x18, 0x1c, 0xfe, + 0x09, 0x91, 0xb2, 0x0c, 0x8c, 0xf7, 0x57, 0x2e, 0x5f, 0x7f, 0x9c, 0x17, + 0x0e, 0xaf, 0x62, 0x9e, 0x9b, 0xbf, 0x9b, 0xbf, 0x9b, 0xbf, 0x9b, 0xbf, + 0x9b, 0xbf, 0x9b, 0xbf, 0x9b, 0xbf, 0xff, 0x3f, 0x3f, 0x9f, 0x13, 0x72, + 0x88, 0x98, 0x85, 0xff, 0x48, 0x57, 0xe3, 0x89, 0xa1, 0xa4, 0x45, 0xba, + 0x2f, 0x7e, 0x65, 0x28, 0x67, 0x11, 0x25, 0x8a, 0xdb, 0xc3, 0x29, 0xfa, + 0xb0, 0x9c, 0x37, 0x35, 0xe2, 0xfe, 0x5b, 0xe2, 0x1f, 0x3c, 0xfd, 0xfa, + 0x9d, 0x91, 0xab, 0xb3, 0x3e, 0xd2, 0x8d, 0xf8, 0xcb, 0xba, 0xb1, 0x8d, + 0xf4, 0x0e, 0x7c, 0xf3, 0x5c, 0xf7, 0x7f, 0xa8, 0xd4, 0xe6, 0xce, 0x75, + 0xa5, 0xfc, 0x7a, 0x37, 0xe5, 0x37, 0xc7, 0x75, 0x52, 0xe3, 0x5d, 0x3f, + 0x48, 0xfa, 0x8c, 0x61, 0x5f, 0xdc, 0xa0, 0xf9, 0x12, 0x65, 0x0e, 0x4c, + 0xf0, 0x1a, 0xb1, 0x75, 0xf7, 0x62, 0x2e, 0x2d, 0x3e, 0x3c, 0xf4, 0x67, + 0xd6, 0xd3, 0x65, 0xd5, 0xb2, 0x7a, 0xe6, 0x28, 0x30, 0xf0, 0x7c, 0x3f, + 0xc6, 0x8b, 0x91, 0x1e, 0xa2, 0x3b, 0x49, 0xb5, 0xf2, 0x01, 0x9f, 0xa5, + 0x53, 0xb2, 0x64, 0x51, 0xaa, 0x44, 0xf4, 0x77, 0x45, 0x85, 0x9e, 0xb7, + 0xda, 0x69, 0xae, 0xf7, 0x83, 0x72, 0x02, 0xb8, 0xbc, 0x6d, 0x0d, 0x0f, + 0x8d, 0x5b, 0x3c, 0x57, 0x7c, 0x9d, 0x83, 0x6f, 0x6f, 0x5b, 0xce, 0xd2, + 0x68, 0xb4, 0xc8, 0x7d, 0xbd, 0x2d, 0xdc, 0xe7, 0x8f, 0x3f, 0x1c, 0x7c, + 0xde, 0x0a, 0xc8, 0xbe, 0x1f, 0xa5, 0x92, 0x98, 0x6f, 0xac, 0xc8, 0xb0, + 0xcf, 0xde, 0x91, 0xb3, 0x4c, 0xd9, 0x6f, 0xc5, 0x93, 0x56, 0x08, 0xfd, + 0x1d, 0x72, 0x2c, 0xbd, 0x2e, 0x67, 0x59, 0x72, 0xac, 0x88, 0x6f, 0x7a, + 0x65, 0xff, 0x3b, 0xa9, 0x9c, 0x15, 0x93, 0xfd, 0x57, 0x93, 0x49, 0xab, + 0x5f, 0xf6, 0x1f, 0xbe, 0x2b, 0x67, 0xc5, 0x65, 0xff, 0xf7, 0x81, 0x8b, + 0x41, 0xc7, 0x8a, 0x61, 0xfc, 0x25, 0x30, 0xfe, 0x9a, 0x41, 0x6d, 0x19, + 0x8c, 0x61, 0xef, 0xb6, 0x4e, 0x97, 0x7d, 0x21, 0x7a, 0xbd, 0xfb, 0x32, + 0x68, 0x63, 0xd0, 0xd9, 0x12, 0x29, 0x99, 0xee, 0x10, 0x68, 0x62, 0xd2, + 0xb9, 0x52, 0x2b, 0xf9, 0x4e, 0xfa, 0xb0, 0xe7, 0xcf, 0x51, 0xd6, 0xd4, + 0x69, 0xfd, 0x8c, 0x42, 0x9d, 0x7d, 0x6b, 0x28, 0x61, 0xe4, 0x29, 0xd5, + 0x8d, 0x28, 0x6e, 0xd2, 0x24, 0x6d, 0x66, 0x71, 0xbd, 0x8a, 0x1e, 0x95, + 0x22, 0xa1, 0x2c, 0x28, 0x3c, 0x72, 0xfa, 0x5d, 0x8e, 0x39, 0xb1, 0x26, + 0xff, 0x85, 0x29, 0x35, 0x71, 0x2b, 0x0d, 0x1b, 0x8c, 0x0f, 0x80, 0x05, + 0x1f, 0x74, 0x25, 0x79, 0x2a, 0x44, 0xc7, 0xec, 0x80, 0x92, 0x3a, 0x75, + 0x37, 0x25, 0x63, 0x64, 0xaa, 0xd4, 0x25, 0xbe, 0x2d, 0x14, 0x43, 0x34, + 0x6e, 0x93, 0x92, 0xb4, 0x99, 0x5e, 0xed, 0x18, 0x6f, 0x13, 0xb0, 0xe8, + 0xeb, 0xf0, 0x51, 0x97, 0x91, 0x22, 0x9d, 0x71, 0x46, 0x7f, 0x50, 0x49, + 0x8b, 0x39, 0x44, 0x7f, 0x78, 0x8c, 0x02, 0x74, 0xba, 0x68, 0x4a, 0xd8, + 0x72, 0x39, 0x19, 0x33, 0x00, 0x07, 0xda, 0xd9, 0x26, 0x0d, 0xe3, 0x39, + 0x6a, 0xf3, 0xfa, 0x21, 0xc8, 0xcc, 0xb7, 0x87, 0xb2, 0xd3, 0x62, 0xbe, + 0xb0, 0x2f, 0xce, 0xf3, 0x75, 0x00, 0xee, 0x1d, 0xe0, 0xa5, 0x90, 0x26, + 0x78, 0x95, 0xa0, 0xec, 0x84, 0x02, 0x79, 0xc2, 0x53, 0xd0, 0x2d, 0x0d, + 0xfc, 0x35, 0xb2, 0xfa, 0x14, 0xca, 0x59, 0x9b, 0x28, 0x6f, 0xa0, 0x5d, + 0xbc, 0xa0, 0x26, 0xed, 0x66, 0x4a, 0x69, 0x61, 0xec, 0x5f, 0xc8, 0x0a, + 0x8d, 0xe1, 0x1b, 0xd5, 0x62, 0x98, 0x9f, 0x61, 0xef, 0xc3, 0x82, 0xfe, + 0x4d, 0xf1, 0xfd, 0x74, 0x69, 0x22, 0xaf, 0x26, 0x4b, 0xed, 0xe4, 0x9b, + 0x89, 0x40, 0x9a, 0xc7, 0xd5, 0xd4, 0x19, 0x8d, 0xfc, 0x93, 0x0a, 0x41, + 0x3e, 0x0c, 0x5f, 0xfc, 0xb8, 0xba, 0xb3, 0x74, 0x41, 0x4d, 0x95, 0xf8, + 0x1b, 0xc0, 0x16, 0x55, 0xd0, 0x96, 0xdf, 0xb7, 0x83, 0x96, 0x34, 0xac, + 0xc6, 0x75, 0x3d, 0x51, 0x64, 0x99, 0xe5, 0x6f, 0xc1, 0x0f, 0xec, 0xe5, + 0x9c, 0x0d, 0xfe, 0x08, 0x7e, 0x85, 0xc1, 0xaf, 0x6f, 0x82, 0x5f, 0xfd, + 0xe0, 0x53, 0x8c, 0xde, 0x28, 0xf5, 0xd2, 0x6b, 0xa5, 0x1e, 0x7a, 0x15, + 0x32, 0xf9, 0x4a, 0x29, 0x4c, 0x2f, 0x97, 0x3a, 0xe8, 0xa5, 0x52, 0x88, + 0xce, 0x0b, 0x1e, 0xa6, 0x21, 0xff, 0x82, 0xaf, 0xfa, 0x26, 0xf0, 0xa4, + 0x1d, 0x3c, 0x59, 0x0f, 0x79, 0xd9, 0x08, 0xf9, 0x9b, 0xee, 0xd6, 0x69, + 0xaa, 0x9b, 0x12, 0x41, 0xf4, 0x6f, 0x89, 0x6b, 0x82, 0x4e, 0x1a, 0xc6, + 0xc7, 0x26, 0xfc, 0x94, 0x32, 0x4e, 0xd3, 0x7b, 0x93, 0x1a, 0x8d, 0x95, + 0xa6, 0x36, 0x3a, 0x7c, 0xe3, 0xf6, 0x2c, 0x5d, 0x44, 0x5f, 0xca, 0x98, + 0xa5, 0x4b, 0xdb, 0x54, 0x1a, 0x9d, 0xfe, 0x1b, 0x4a, 0x9e, 0x39, 0x4d, + 0x3f, 0xfe, 0x3a, 0x51, 0x06, 0x34, 0x51, 0xfb, 0x7e, 0x5a, 0x4e, 0x18, + 0xa0, 0x45, 0x5f, 0xaf, 0x90, 0x08, 0xb5, 0x8f, 0x79, 0x19, 0x86, 0xae, + 0x68, 0x4a, 0xca, 0x7e, 0x01, 0xfa, 0xd2, 0xaa, 0x24, 0xa7, 0x88, 0x72, + 0x53, 0x65, 0xca, 0xc5, 0xfc, 0xf4, 0x98, 0x51, 0xa6, 0x74, 0xac, 0x89, + 0xbe, 0x68, 0xb4, 0xd3, 0x68, 0xef, 0x6f, 0xf8, 0xdc, 0x5c, 0x65, 0xba, + 0xd4, 0x8f, 0x77, 0xee, 0x23, 0x9a, 0x12, 0xef, 0x4e, 0x7f, 0xbe, 0xe4, + 0xa7, 0x84, 0x99, 0x0f, 0x69, 0xf4, 0x8e, 0xcf, 0xc1, 0x29, 0xe1, 0x8e, + 0x81, 0x57, 0xc3, 0xb0, 0x0f, 0x8e, 0x0c, 0x66, 0x27, 0xd6, 0x5c, 0x4b, + 0x88, 0x6e, 0xc0, 0x0b, 0xd9, 0xd3, 0x18, 0x8f, 0x61, 0x25, 0x6e, 0x52, + 0xa7, 0xd0, 0x8d, 0x7e, 0xc0, 0x0c, 0x28, 0xfb, 0x4a, 0xcc, 0x6b, 0xbc, + 0x17, 0x19, 0xd7, 0xcd, 0x80, 0xd5, 0xf0, 0x4c, 0x48, 0x9c, 0xbd, 0x78, + 0xf2, 0x5c, 0x8c, 0x27, 0x3f, 0x7f, 0xcf, 0x83, 0xe7, 0xe7, 0x2b, 0xef, + 0x53, 0x9e, 0xf7, 0x7c, 0xe9, 0x4f, 0x03, 0x0e, 0x7e, 0x4c, 0xcf, 0x01, + 0x1a, 0x9d, 0x38, 0x2c, 0xd7, 0xc2, 0x7b, 0x91, 0xd7, 0x38, 0x0d, 0x3a, + 0x09, 0xc8, 0x15, 0xd6, 0x3a, 0xec, 0x59, 0xeb, 0x49, 0xcf, 0x5a, 0x4f, + 0x7a, 0xd6, 0xca, 0x83, 0xb6, 0xb4, 0x4e, 0xb5, 0xfc, 0xd0, 0x51, 0xee, + 0x39, 0x8e, 0x39, 0x9f, 0x03, 0x5f, 0xbe, 0x0a, 0x98, 0x38, 0x2d, 0xda, + 0xa0, 0xc7, 0x94, 0x46, 0x7b, 0x4d, 0x7e, 0x7f, 0xb1, 0xd5, 0xc1, 0x8b, + 0xdf, 0x2f, 0x48, 0x9c, 0x5a, 0x1d, 0xb8, 0xd2, 0x15, 0xa1, 0xff, 0xf3, + 0x25, 0xd6, 0x4f, 0x8a, 0xf9, 0x2c, 0x3a, 0x94, 0x8e, 0xb5, 0xd3, 0x98, + 0xa1, 0xc4, 0x46, 0x7b, 0x9a, 0x99, 0x8e, 0x09, 0xd5, 0x6a, 0x85, 0x0e, + 0x50, 0x58, 0x65, 0xdb, 0x25, 0xf0, 0x7b, 0x49, 0xe2, 0x61, 0x70, 0x3b, + 0xa3, 0x5a, 0xc1, 0xba, 0x7e, 0x96, 0xdf, 0x57, 0xf0, 0xce, 0x32, 0x9c, + 0xd4, 0x9c, 0xb5, 0x5f, 0x45, 0x9b, 0xed, 0xce, 0x66, 0xd9, 0x76, 0xc7, + 0xff, 0xa0, 0xa9, 0xb6, 0xfd, 0x05, 0xb3, 0xb6, 0xed, 0xea, 0x82, 0xd7, + 0x66, 0xf1, 0xde, 0xc2, 0xe4, 0xb3, 0x58, 0x8e, 0xfc, 0xc0, 0x35, 0x06, + 0x3d, 0x6c, 0x96, 0x38, 0x7c, 0x4b, 0xe2, 0x00, 0x5c, 0x01, 0x37, 0x5a, + 0xe2, 0x6f, 0x04, 0x4b, 0xea, 0xda, 0x4c, 0x43, 0xf7, 0x7d, 0xad, 0x18, + 0xbf, 0xec, 0xe3, 0x75, 0xdc, 0x27, 0x29, 0x69, 0xe8, 0xc9, 0xd8, 0xb4, + 0x46, 0xd9, 0xd8, 0x26, 0x21, 0xd7, 0xd9, 0x58, 0xd5, 0x06, 0x8c, 0x4e, + 0xd4, 0xdb, 0x00, 0xfe, 0x8e, 0x6d, 0x80, 0xa3, 0xfb, 0x63, 0xd3, 0x6c, + 0x0b, 0x1c, 0xdd, 0x3f, 0x36, 0xc1, 0x36, 0x41, 0xcc, 0x09, 0xfd, 0x67, + 0x3b, 0xe0, 0xda, 0x00, 0xfe, 0x86, 0x6d, 0x80, 0x0f, 0xf2, 0xcd, 0xf3, + 0xb9, 0x6b, 0x8f, 0xd7, 0xcd, 0x3b, 0xce, 0xb6, 0x45, 0xd9, 0xd9, 0xcd, + 0x30, 0xc7, 0xb1, 0x76, 0x80, 0x0a, 0xd3, 0xcc, 0xc3, 0x48, 0xe8, 0x08, + 0x1d, 0x17, 0x36, 0xef, 0xf4, 0x04, 0x25, 0x0e, 0x9e, 0x18, 0xa0, 0x34, + 0x6c, 0xc0, 0xdc, 0xc4, 0xb5, 0x32, 0xf8, 0x78, 0x47, 0x13, 0x59, 0xb0, + 0x75, 0xf0, 0x93, 0xfd, 0x7e, 0xf2, 0xc5, 0xe3, 0x90, 0xb7, 0x98, 0xf0, + 0x5d, 0xd5, 0x9f, 0xa6, 0xed, 0xaa, 0x69, 0x37, 0xc1, 0x3f, 0x62, 0xde, + 0xfe, 0x98, 0x90, 0x4d, 0xef, 0x2f, 0x09, 0x1b, 0x94, 0x8c, 0x7d, 0x08, + 0xf9, 0x75, 0x69, 0xe4, 0xea, 0x1f, 0xdb, 0xfa, 0x2b, 0x1e, 0x1f, 0xb2, + 0x05, 0x76, 0xdf, 0x84, 0x3c, 0xb9, 0x76, 0x9f, 0xed, 0x71, 0x88, 0x6d, + 0x26, 0xf4, 0x8d, 0x6d, 0x70, 0x80, 0xd4, 0x19, 0x4d, 0xda, 0x69, 0x5d, + 0xda, 0xe9, 0x00, 0x6c, 0x34, 0xb7, 0x0d, 0xd9, 0x36, 0x45, 0x1b, 0xf6, + 0x1a, 0xf6, 0x70, 0x77, 0x3a, 0x35, 0xc1, 0xfe, 0x10, 0xbe, 0x7b, 0x86, + 0x75, 0xf8, 0xdb, 0x43, 0x23, 0xd3, 0xc2, 0x07, 0xb0, 0xff, 0x80, 0x65, + 0x66, 0x1b, 0xce, 0xb6, 0x1c, 0xfb, 0x2e, 0x62, 0xdd, 0x8a, 0xad, 0x64, + 0x39, 0xf1, 0xe2, 0xc5, 0x38, 0xad, 0x21, 0xf5, 0xa4, 0x43, 0x6b, 0x35, + 0xfe, 0xa8, 0x46, 0x2d, 0x4c, 0x63, 0xc6, 0x7f, 0x2b, 0x70, 0xe6, 0x7d, + 0xfd, 0x4f, 0xe0, 0xcc, 0xeb, 0xd6, 0xe3, 0x4d, 0x7a, 0x6b, 0xfc, 0xac, + 0xfe, 0xf0, 0x33, 0xa4, 0x37, 0xc7, 0xcf, 0xd2, 0xbf, 0x58, 0x74, 0x9f, + 0x0e, 0x3f, 0xdb, 0xad, 0xc0, 0xcf, 0x16, 0xa1, 0xef, 0x53, 0x3a, 0x1d, + 0x3c, 0x15, 0xc9, 0xfc, 0x2b, 0x45, 0x61, 0x3f, 0x76, 0xd0, 0xc8, 0x94, + 0x42, 0x7a, 0x17, 0xb5, 0xc3, 0x7f, 0xf4, 0x37, 0x61, 0xfe, 0x5d, 0x44, + 0x9b, 0x1d, 0xbf, 0xd9, 0x15, 0x1e, 0x05, 0xff, 0xd3, 0x2f, 0x7e, 0x05, + 0xdf, 0x3c, 0x4d, 0x07, 0xa7, 0x0e, 0x2b, 0x39, 0xfb, 0x08, 0xe0, 0x97, + 0x83, 0xd5, 0x01, 0x9b, 0x07, 0xec, 0x97, 0x31, 0xef, 0xd3, 0xa4, 0xdf, + 0x1e, 0x19, 0x48, 0x28, 0xc0, 0xe3, 0x45, 0x01, 0x2f, 0x7d, 0x71, 0x97, + 0xb1, 0x53, 0xf0, 0x3f, 0x40, 0xef, 0x15, 0x2f, 0x80, 0xbe, 0xbd, 0xf0, + 0x39, 0x91, 0x67, 0x61, 0x93, 0xe1, 0x8f, 0x22, 0x57, 0x31, 0x2d, 0x7c, + 0x11, 0x29, 0x0f, 0x76, 0xa7, 0x41, 0xef, 0x38, 0xfc, 0xd3, 0x00, 0xfc, + 0x53, 0x0c, 0xbe, 0xa9, 0x07, 0x7e, 0xc9, 0x82, 0x5f, 0x0a, 0x83, 0x1f, + 0x06, 0xcd, 0xc2, 0x47, 0xcd, 0x42, 0xfe, 0xe7, 0x66, 0x48, 0x19, 0x04, + 0xad, 0xcf, 0xc1, 0x3f, 0x26, 0x63, 0x77, 0x42, 0xcf, 0x22, 0x17, 0x66, + 0xd5, 0x41, 0xca, 0xc1, 0x9f, 0x77, 0x6e, 0x8b, 0x62, 0xbd, 0x26, 0x4a, + 0x84, 0x5c, 0x1d, 0xe5, 0xdf, 0x7e, 0x85, 0xac, 0x7f, 0x06, 0xef, 0x22, + 0x61, 0xa2, 0x3d, 0x94, 0xb5, 0xa3, 0x46, 0xa7, 0xda, 0x03, 0x18, 0x6e, + 0x87, 0x95, 0x03, 0x53, 0x11, 0x05, 0xfb, 0x03, 0xcd, 0x27, 0x60, 0xeb, + 0xcb, 0x34, 0x1e, 0x63, 0x3d, 0x29, 0xd3, 0xf3, 0xb1, 0xc8, 0x40, 0x9e, + 0x5a, 0xe9, 0x98, 0x39, 0x21, 0x7c, 0xbc, 0x16, 0x3f, 0x21, 0x74, 0x2c, + 0x67, 0xe1, 0x59, 0xec, 0x54, 0xb2, 0x53, 0xbc, 0x7e, 0x14, 0x5a, 0xee, + 0xc7, 0x93, 0xe7, 0x07, 0xdd, 0xfa, 0x49, 0x39, 0xd8, 0x9d, 0x87, 0x77, + 0x88, 0x18, 0x8b, 0x58, 0x39, 0x35, 0x11, 0x0d, 0x45, 0x55, 0x8d, 0x86, + 0x35, 0x85, 0x46, 0x61, 0x6f, 0xd2, 0xb1, 0xff, 0x2c, 0x1f, 0x33, 0x79, + 0xbc, 0x99, 0xbe, 0x2a, 0xfc, 0x0d, 0xd6, 0x2e, 0x4c, 0x63, 0x5d, 0x3f, + 0xf8, 0xcb, 0xeb, 0xf2, 0x3c, 0x68, 0xc3, 0xf6, 0x6b, 0x56, 0xe4, 0xd9, + 0x3c, 0xed, 0x00, 0x6d, 0xd9, 0x66, 0xc1, 0x3e, 0x0c, 0x60, 0xed, 0x5e, + 0xd8, 0x4f, 0x3c, 0x93, 0xbd, 0x1c, 0x07, 0x05, 0x68, 0xd8, 0x64, 0x79, + 0xd4, 0xe5, 0x98, 0xe9, 0x19, 0xf3, 0xcb, 0xb1, 0x20, 0xfe, 0xe0, 0x7f, + 0x4d, 0x96, 0x19, 0x6e, 0x73, 0x4c, 0xc6, 0x34, 0x09, 0xd3, 0xdc, 0x64, + 0x02, 0x34, 0x8b, 0x9c, 0x4d, 0x10, 0xd3, 0x0c, 0x46, 0x7b, 0x7f, 0x82, + 0xbe, 0x64, 0xaf, 0xf7, 0x3b, 0xb6, 0xb0, 0x55, 0x49, 0xc1, 0x17, 0xa8, + 0x56, 0x0b, 0x7c, 0x45, 0x98, 0x5e, 0x15, 0xb0, 0x64, 0xa8, 0xf1, 0x68, + 0xe8, 0x4b, 0x74, 0xab, 0xb0, 0x11, 0x09, 0xc3, 0x4b, 0xe3, 0xff, 0x52, + 0xc9, 0x72, 0xbf, 0x69, 0xa5, 0xec, 0x20, 0xf3, 0x89, 0xd7, 0x33, 0x68, + 0xae, 0xe4, 0xbc, 0xfb, 0x10, 0xa3, 0x16, 0x60, 0x6b, 0xce, 0x4f, 0xaa, + 0xf4, 0xf8, 0x1d, 0xf0, 0x65, 0xb1, 0x6d, 0x58, 0xcb, 0xc4, 0x78, 0x1e, + 0x6d, 0x15, 0x6d, 0xe8, 0x99, 0x11, 0x02, 0x8f, 0xb9, 0x9f, 0xe1, 0x4c, + 0xfc, 0xbd, 0xcf, 0xb1, 0x75, 0x3e, 0xab, 0xde, 0x4a, 0x14, 0x64, 0x7a, + 0xc5, 0x40, 0x2b, 0xcb, 0x50, 0xd5, 0x6d, 0xc2, 0x5f, 0x3b, 0xb6, 0xc4, + 0x82, 0x2e, 0xc2, 0xe6, 0xf6, 0x79, 0x75, 0x91, 0xe3, 0x09, 0x57, 0x17, + 0x23, 0xa1, 0x84, 0x0a, 0x5b, 0xdc, 0xa7, 0xd1, 0x09, 0xd1, 0x56, 0x28, + 0x31, 0x18, 0x09, 0x2d, 0xa8, 0x1c, 0x4b, 0x33, 0x6c, 0x18, 0xf1, 0x4a, + 0x40, 0xc2, 0x22, 0x9e, 0xb3, 0xdd, 0x98, 0x30, 0x84, 0x7e, 0x53, 0xf4, + 0x1f, 0xab, 0xe8, 0xa8, 0x13, 0xff, 0xa9, 0x88, 0x11, 0x0b, 0x88, 0x11, + 0x53, 0x42, 0x47, 0x8d, 0x04, 0x72, 0x04, 0xd0, 0xdc, 0xd1, 0xcf, 0x42, + 0x91, 0x71, 0xc9, 0xb1, 0x5c, 0x0e, 0x00, 0x99, 0x13, 0x8e, 0x7d, 0xa4, + 0x3c, 0xc7, 0x91, 0xa3, 0xea, 0x53, 0x34, 0x5c, 0x60, 0x3f, 0x8e, 0x3f, + 0x9b, 0x6d, 0x2d, 0xec, 0xa3, 0xf0, 0xc5, 0x51, 0xf0, 0x39, 0x0f, 0x1a, + 0xac, 0x97, 0x74, 0xdd, 0x4f, 0x07, 0xec, 0x3d, 0xa0, 0x79, 0x9c, 0x46, + 0x4e, 0x8d, 0xb0, 0xcc, 0xf6, 0x14, 0x28, 0xd2, 0x73, 0x8c, 0xb6, 0x1b, + 0x73, 0x2c, 0xdf, 0x83, 0xe5, 0x1d, 0xe0, 0x85, 0xd0, 0x51, 0xc8, 0x20, + 0x65, 0x0b, 0x23, 0xf4, 0x58, 0x89, 0xfb, 0xf2, 0xa0, 0x1d, 0xe2, 0xda, + 0xfe, 0xfd, 0x52, 0xce, 0x31, 0x9f, 0xe6, 0xce, 0x37, 0x22, 0xe7, 0x63, + 0x38, 0x86, 0xe1, 0x6f, 0xaa, 0xf3, 0xee, 0x14, 0x3c, 0x8d, 0x18, 0x5d, + 0x6a, 0x79, 0x87, 0x1f, 0xe3, 0xcf, 0xf7, 0xf3, 0x3b, 0xe6, 0x81, 0xef, + 0x6f, 0xb6, 0xf6, 0x00, 0x76, 0x10, 0x73, 0xfa, 0xa9, 0xb3, 0xdd, 0xc5, + 0x37, 0x81, 0xb5, 0xd9, 0xcf, 0x31, 0x9f, 0x1f, 0xa1, 0xec, 0xa9, 0x7c, + 0x8f, 0x0a, 0x19, 0x9b, 0xcd, 0x28, 0xe4, 0xb7, 0x1e, 0xa6, 0xdc, 0xa9, + 0xa3, 0x6c, 0x37, 0x40, 0xab, 0x3d, 0xb4, 0x6b, 0x22, 0xd2, 0x73, 0x80, + 0x34, 0xb1, 0xce, 0x5b, 0x24, 0xe8, 0x1f, 0x9b, 0x15, 0xbe, 0x20, 0x43, + 0xe9, 0x89, 0xed, 0xa1, 0x4b, 0xe8, 0x1b, 0x1e, 0x8c, 0x84, 0x17, 0xe8, + 0x09, 0xd0, 0xe5, 0x23, 0xf8, 0x22, 0xab, 0x67, 0x0c, 0x3a, 0x84, 0x9c, + 0x0a, 0xeb, 0x8f, 0x4a, 0xda, 0xe0, 0xbb, 0xcc, 0x51, 0xd0, 0x8f, 0xf2, + 0x0e, 0x4d, 0x99, 0x9e, 0x4c, 0xcb, 0xaf, 0xc0, 0xf6, 0x1c, 0x11, 0xb1, + 0x4b, 0x56, 0xd0, 0xee, 0xd2, 0x06, 0x47, 0x0e, 0x60, 0x8b, 0x30, 0xef, + 0xe5, 0x41, 0x85, 0xb6, 0x20, 0x4e, 0x3f, 0x24, 0x78, 0xeb, 0xa3, 0x7d, + 0x66, 0xd4, 0xd8, 0x47, 0xf3, 0x7e, 0x27, 0x56, 0xc0, 0x3c, 0x3d, 0xf7, + 0x60, 0x0f, 0x90, 0x53, 0xfb, 0xeb, 0xeb, 0xa8, 0x2d, 0x12, 0x4e, 0xa8, + 0x09, 0xfa, 0x93, 0xd2, 0xdd, 0xe4, 0xe8, 0x77, 0x2b, 0xdb, 0x7e, 0xf0, + 0xb0, 0xd3, 0x69, 0x5b, 0x78, 0x16, 0x3a, 0xb1, 0x1e, 0xe3, 0xfe, 0xac, + 0xc0, 0x7d, 0x84, 0xba, 0xa1, 0x6b, 0x22, 0x8f, 0x39, 0x51, 0x8b, 0x17, + 0xf3, 0xbc, 0x9e, 0xcf, 0x5f, 0xc6, 0x3c, 0xdc, 0xcf, 0x70, 0x78, 0x2f, + 0x3c, 0x41, 0x23, 0x90, 0xc7, 0x5c, 0x7f, 0x57, 0x68, 0x0c, 0xdf, 0xa4, + 0x4a, 0x4d, 0x74, 0x54, 0xe3, 0xf1, 0x48, 0x38, 0xaf, 0x1e, 0x42, 0xdc, + 0xf3, 0xb8, 0xea, 0xb7, 0x7e, 0xe6, 0x67, 0xbf, 0xe3, 0xb7, 0xae, 0x29, + 0xd5, 0xb9, 0x10, 0x87, 0x8a, 0xdc, 0x60, 0x41, 0x19, 0x2c, 0x5d, 0x52, + 0x92, 0x85, 0x6b, 0x4a, 0xaa, 0xc4, 0x30, 0x8e, 0xce, 0x67, 0xcf, 0x74, + 0x82, 0x4e, 0x1f, 0x89, 0xef, 0xe6, 0x7a, 0x8f, 0x50, 0xea, 0xd4, 0xad, + 0x94, 0x9e, 0xe6, 0xbc, 0x34, 0x02, 0x7c, 0x3f, 0x2a, 0xe7, 0x62, 0x41, + 0xca, 0x9d, 0xe1, 0x31, 0xb6, 0x5f, 0xd6, 0xd5, 0x45, 0x1f, 0xef, 0x9f, + 0xf9, 0x6f, 0x52, 0xc1, 0x7e, 0x53, 0xd2, 0x8f, 0xdf, 0x7d, 0x9c, 0x93, + 0xe1, 0xf7, 0x6f, 0x86, 0xd3, 0xb7, 0x95, 0x16, 0x36, 0xdc, 0xc8, 0x3e, + 0x57, 0xb3, 0xc7, 0x47, 0x7d, 0x7e, 0x6b, 0x7b, 0x13, 0xb5, 0x84, 0x80, + 0xc3, 0x4a, 0x7b, 0x64, 0x98, 0x5f, 0x87, 0x1c, 0xb0, 0x4d, 0xd9, 0x0d, + 0x7e, 0x5a, 0x6c, 0xc3, 0x60, 0x93, 0x76, 0x53, 0xae, 0xc4, 0xb2, 0x1d, + 0x35, 0x32, 0x90, 0xb1, 0x34, 0x75, 0xb1, 0x1e, 0xb9, 0xba, 0x07, 0xdb, + 0x9d, 0x87, 0xed, 0x46, 0x3c, 0x64, 0x53, 0xbe, 0x29, 0xce, 0x36, 0xbc, + 0x0b, 0xb2, 0x85, 0xbe, 0x62, 0x55, 0x17, 0x77, 0x2d, 0xc1, 0x5d, 0x5b, + 0xc2, 0xa3, 0x02, 0xd5, 0xe2, 0x3f, 0x4b, 0x8c, 0xff, 0x5f, 0x00, 0xff, + 0xcf, 0x01, 0x7f, 0xc6, 0xa9, 0x31, 0xfe, 0x3b, 0x2b, 0xf8, 0x33, 0x0c, + 0xfc, 0x1c, 0x64, 0xf1, 0x0d, 0xe8, 0xe2, 0x6b, 0x36, 0x7c, 0x9d, 0x0d, + 0xff, 0x67, 0xc3, 0xdf, 0xd9, 0xf0, 0x8b, 0x36, 0x7c, 0x1e, 0xf6, 0x74, + 0x0e, 0x36, 0xe9, 0xac, 0x9d, 0x34, 0x58, 0x9f, 0x92, 0x31, 0xf6, 0x9d, + 0xbb, 0x65, 0xde, 0x1d, 0x92, 0x71, 0xf7, 0xa7, 0x64, 0x2c, 0x7b, 0x00, + 0xb1, 0xec, 0x66, 0x1a, 0xed, 0xe1, 0x9c, 0xa4, 0x05, 0xcf, 0x75, 0x78, + 0x22, 0x6e, 0xed, 0x49, 0x48, 0xbd, 0xfc, 0x0c, 0x62, 0x5c, 0xd8, 0xff, + 0x1e, 0xe4, 0x37, 0x19, 0xc4, 0x6a, 0x56, 0x1f, 0xc7, 0xe5, 0xb0, 0x65, + 0xef, 0x37, 0x39, 0x76, 0xfe, 0x2e, 0x19, 0x03, 0xbb, 0xed, 0x56, 0xc0, + 0xa4, 0xd1, 0xd7, 0x8a, 0x6f, 0x7e, 0x07, 0xb2, 0xdf, 0x86, 0xf6, 0xce, + 0x3a, 0x18, 0xe4, 0xb3, 0x56, 0x16, 0x7d, 0x11, 0xc0, 0xb4, 0x61, 0x9d, + 0x0e, 0xb4, 0xf7, 0xa0, 0x7d, 0x8b, 0xb3, 0x8e, 0xf1, 0x2b, 0x68, 0xa7, + 0xea, 0xbe, 0xd9, 0x8a, 0xbe, 0x4c, 0x5d, 0xdf, 0x9b, 0xe8, 0x4b, 0xa2, + 0x6f, 0x51, 0x7e, 0x97, 0x47, 0x3b, 0x52, 0x07, 0xb3, 0x88, 0x3e, 0xc6, + 0xf1, 0x5b, 0x78, 0xde, 0x47, 0xa3, 0x19, 0x8e, 0x03, 0xdc, 0xb1, 0xdc, + 0x7a, 0x6a, 0xe3, 0xdc, 0xf7, 0x43, 0x21, 0x3b, 0xf3, 0xd2, 0x46, 0xa7, + 0x27, 0xd8, 0x4f, 0x8c, 0x20, 0xee, 0xe1, 0x71, 0xe1, 0x9c, 0x3c, 0xfd, + 0x1f, 0x00, 0xf6, 0x61, 0x8c, 0x21, 0x56, 0xb7, 0xcb, 0x4d, 0x8d, 0xc7, + 0x1f, 0xc5, 0xf8, 0x5f, 0xca, 0x6f, 0x2b, 0x73, 0x03, 0xfe, 0x1b, 0x75, + 0x7d, 0x6a, 0xb0, 0xb6, 0xbd, 0xd6, 0xf3, 0xbe, 0x4d, 0x5f, 0xfa, 0xfd, + 0x48, 0x1d, 0xfc, 0xef, 0x6e, 0xa8, 0x6d, 0x3f, 0xc5, 0xdf, 0x20, 0x87, + 0x70, 0xdb, 0x09, 0xc8, 0x1d, 0xdb, 0xa4, 0xfa, 0x79, 0x3e, 0x6b, 0xd4, + 0xf6, 0x6d, 0x32, 0x6b, 0xdb, 0x1c, 0x27, 0x31, 0x5c, 0x08, 0xf2, 0xde, + 0xa1, 0xec, 0xb2, 0x7f, 0x13, 0xe3, 0x61, 0xe5, 0x5e, 0xdb, 0x8b, 0x67, + 0x48, 0xe6, 0x46, 0xe1, 0x4a, 0xcc, 0x3b, 0x5f, 0x0a, 0x40, 0xae, 0x3e, + 0x0f, 0x9e, 0x73, 0xdc, 0x53, 0xd5, 0xf1, 0xf7, 0x68, 0x39, 0x1d, 0x67, + 0x1f, 0xc0, 0x31, 0xfe, 0x36, 0x11, 0x1f, 0xfb, 0xe2, 0x4f, 0x70, 0x0c, + 0xf6, 0xb4, 0xe3, 0x5b, 0x2c, 0xf8, 0x43, 0xb4, 0x4b, 0x7e, 0xc7, 0x6e, + 0x22, 0x9f, 0xc8, 0x16, 0xd8, 0x9f, 0xb1, 0x0f, 0x89, 0xc0, 0x4e, 0xb3, + 0x1f, 0xfd, 0x24, 0x7d, 0xc6, 0x5d, 0xcd, 0x6c, 0xfb, 0x34, 0xeb, 0x05, + 0xc4, 0x0b, 0x1c, 0xe7, 0xb1, 0xed, 0xc6, 0x7b, 0xd1, 0x8d, 0x57, 0xee, + 0xd7, 0xc8, 0xaa, 0xfa, 0x11, 0x67, 0x8f, 0x5b, 0x59, 0x37, 0x56, 0xb1, + 0xef, 0xc6, 0xb6, 0xed, 0xc7, 0x75, 0xb6, 0xe1, 0xb2, 0xb0, 0x0d, 0x0f, + 0x6a, 0x7e, 0xeb, 0xf7, 0x9b, 0x1d, 0x79, 0x6d, 0x6c, 0x1b, 0xee, 0xad, + 0xd8, 0x06, 0x57, 0x5e, 0xbd, 0x79, 0xeb, 0x0f, 0xc0, 0x1b, 0x0b, 0xbc, + 0xa9, 0xaf, 0xd5, 0x70, 0x8e, 0xe2, 0x87, 0x1f, 0xe2, 0x18, 0x91, 0x73, + 0xd9, 0x18, 0xe5, 0x62, 0x45, 0xc4, 0x6a, 0x91, 0xd9, 0xd9, 0x4a, 0x8e, + 0xf5, 0x35, 0x69, 0xbb, 0x6b, 0xe2, 0x22, 0x7a, 0xbc, 0x78, 0x09, 0xf8, + 0x73, 0xbc, 0xa5, 0x49, 0x1b, 0xc1, 0xfd, 0xe3, 0x12, 0x47, 0x7e, 0xe7, + 0x3a, 0x1e, 0x7c, 0x69, 0xf1, 0x47, 0xe0, 0x15, 0xc7, 0x7d, 0x51, 0x27, + 0xde, 0xab, 0x89, 0xa9, 0xd7, 0xf8, 0xc9, 0xe2, 0x78, 0x89, 0x61, 0x74, + 0x19, 0x2f, 0x05, 0x64, 0x5e, 0x63, 0xc8, 0x3c, 0x87, 0x63, 0x6d, 0xae, + 0xb1, 0xd6, 0xc7, 0x50, 0x0b, 0x43, 0xc1, 0x6d, 0xcc, 0x13, 0x8e, 0xa1, + 0xda, 0x28, 0x39, 0xe3, 0xc4, 0x50, 0x4e, 0x9d, 0xcd, 0xcd, 0x71, 0x5c, + 0x5c, 0xd9, 0x0f, 0xef, 0xc0, 0x3e, 0x45, 0x9e, 0x14, 0x74, 0xea, 0x7f, + 0x1a, 0xec, 0xf6, 0x51, 0xf4, 0x8f, 0xba, 0xfd, 0x9e, 0x5c, 0xc3, 0xc5, + 0x85, 0x7d, 0xbd, 0x1b, 0xd3, 0xed, 0x96, 0x31, 0x1d, 0x62, 0x18, 0xdb, + 0xc9, 0xbb, 0xf6, 0x16, 0x33, 0xe8, 0xe3, 0x75, 0x11, 0x1b, 0x12, 0xc7, + 0x49, 0x90, 0xaf, 0xfd, 0x91, 0x50, 0x58, 0xad, 0xc7, 0xab, 0x75, 0xa1, + 0x16, 0xaf, 0x41, 0xf1, 0xdd, 0xf8, 0x92, 0xef, 0x48, 0xc4, 0x92, 0xe3, + 0xf6, 0x10, 0xe8, 0xc5, 0xf8, 0xb9, 0xba, 0xe1, 0xc6, 0xc9, 0x8c, 0xd3, + 0x3f, 0x82, 0xc6, 0xbb, 0x15, 0xfe, 0x7e, 0xcc, 0xde, 0x2f, 0xe8, 0x96, + 0x15, 0xb8, 0x0e, 0x7b, 0x70, 0x1d, 0x91, 0xb8, 0xb2, 0x2e, 0xb0, 0x7e, + 0x78, 0x6b, 0x9a, 0xa6, 0xd8, 0x1b, 0x70, 0x0e, 0xf3, 0xb9, 0xb9, 0x6a, + 0x2d, 0x0c, 0xf9, 0xb6, 0xc1, 0x1f, 0x02, 0xd7, 0xac, 0x88, 0x43, 0x03, + 0x0b, 0xf5, 0x34, 0x1c, 0xc7, 0x5a, 0x88, 0xdb, 0x81, 0x8f, 0xcb, 0xf3, + 0x26, 0x89, 0xcf, 0x37, 0xc5, 0xdc, 0x63, 0xa2, 0x06, 0xea, 0xd3, 0x39, + 0x77, 0xc9, 0x0a, 0xde, 0x69, 0x92, 0x77, 0x8f, 0x56, 0xf0, 0x73, 0x78, + 0x1c, 0x90, 0x74, 0xe5, 0xdc, 0x95, 0x75, 0x5a, 0xf0, 0xa7, 0x9d, 0x73, + 0xd3, 0x41, 0x6a, 0x14, 0x23, 0x2f, 0x0c, 0xa9, 0xdb, 0x1c, 0x3a, 0x3a, + 0x31, 0xf2, 0xda, 0xba, 0x18, 0xf9, 0xb6, 0x20, 0xc7, 0x5a, 0xc3, 0x50, + 0x82, 0x79, 0xf8, 0xba, 0x97, 0x6d, 0xc8, 0x36, 0x70, 0x3d, 0x5f, 0x53, + 0xbb, 0xec, 0x59, 0xa6, 0xd6, 0x1c, 0x20, 0xdf, 0x0c, 0xfb, 0x0e, 0x0b, + 0x79, 0x06, 0x91, 0x36, 0xc9, 0x3a, 0xcb, 0xbe, 0xbd, 0x1a, 0x67, 0xcf, + 0x51, 0xa3, 0x18, 0xfb, 0x46, 0xfd, 0xfa, 0x79, 0xbf, 0xdf, 0x3a, 0xac, + 0x3b, 0x36, 0x73, 0x25, 0xbf, 0xee, 0xc2, 0xed, 0x41, 0x9c, 0xad, 0x50, + 0x93, 0x55, 0xc0, 0xfe, 0xde, 0xf0, 0x37, 0x5b, 0xae, 0x2e, 0x06, 0x68, + 0xfd, 0xcc, 0x2d, 0x42, 0x1f, 0x8d, 0xc9, 0xaa, 0x3e, 0x8e, 0x82, 0x37, + 0x19, 0xa7, 0x06, 0x60, 0xae, 0xa7, 0xeb, 0xd7, 0x0b, 0xc6, 0xed, 0x37, + 0xfd, 0xaa, 0xe5, 0xca, 0xc0, 0xf5, 0xf2, 0x91, 0x4f, 0xd5, 0xd1, 0xba, + 0x51, 0x4d, 0xf8, 0x2c, 0xe8, 0x1a, 0x47, 0xde, 0x1d, 0x79, 0x81, 0x10, + 0x3b, 0x39, 0x79, 0x78, 0x1a, 0xb9, 0x77, 0xe4, 0x02, 0xe7, 0xe3, 0x6e, + 0x7e, 0xfe, 0x6a, 0x29, 0x72, 0x36, 0x8f, 0x9c, 0x79, 0x1e, 0x39, 0xf9, + 0xcb, 0xc8, 0xc9, 0xcf, 0x97, 0x7a, 0x41, 0xff, 0x1e, 0x99, 0x8f, 0xb3, + 0x8e, 0x99, 0x74, 0x11, 0xb9, 0xd3, 0x77, 0x67, 0xd8, 0x46, 0x74, 0xd1, + 0x3d, 0xc8, 0x35, 0xbe, 0x3f, 0xa9, 0x68, 0x9d, 0x7d, 0x01, 0x5f, 0xc2, + 0xb8, 0x91, 0x38, 0x71, 0x29, 0x4f, 0x1a, 0xc7, 0x8a, 0x23, 0x4d, 0x7e, + 0x6b, 0xae, 0x95, 0x5a, 0xf6, 0x2c, 0xcb, 0x93, 0x6a, 0xac, 0xe8, 0xc2, + 0x19, 0xd4, 0xd9, 0xf7, 0x87, 0x9c, 0xdb, 0xc4, 0x48, 0xe4, 0xd3, 0xeb, + 0xe8, 0xed, 0x93, 0x65, 0xda, 0x19, 0xbb, 0x56, 0xbe, 0x68, 0xad, 0xa3, + 0x6c, 0xef, 0x43, 0x32, 0x97, 0x5c, 0x78, 0x28, 0x69, 0xe5, 0x43, 0x3e, + 0xf7, 0x7c, 0x62, 0x42, 0x47, 0x84, 0xc8, 0xbf, 0x20, 0xcd, 0x0d, 0x20, + 0x71, 0x6e, 0xd9, 0xfe, 0x02, 0x1f, 0x10, 0xb1, 0x6d, 0x9c, 0x33, 0x03, + 0xa2, 0xd6, 0xb6, 0xd1, 0xe2, 0x7e, 0x03, 0xfc, 0xbe, 0x8f, 0xe6, 0x90, + 0x43, 0x14, 0x44, 0x1e, 0xde, 0x0e, 0x78, 0x37, 0x0f, 0xbf, 0x1f, 0xb9, + 0x01, 0xd3, 0xd8, 0x04, 0xfc, 0x6f, 0x03, 0xc6, 0x6b, 0x43, 0x9f, 0x6b, + 0x22, 0xf1, 0x3d, 0x8f, 0xb7, 0x13, 0xd7, 0x65, 0xab, 0xf3, 0xf2, 0x9c, + 0x3c, 0xf6, 0x61, 0xf9, 0xf6, 0xbe, 0x3e, 0xcf, 0xdc, 0x6d, 0x9e, 0xb9, + 0xef, 0xf0, 0xcc, 0xed, 0xc3, 0xb7, 0x2e, 0x3e, 0x41, 0x7c, 0xeb, 0xae, + 0xf1, 0xb7, 0x9e, 0x35, 0x5c, 0xdc, 0xdb, 0x3d, 0xb8, 0xbf, 0x8f, 0xf9, + 0xb9, 0xcf, 0xf4, 0xf4, 0xf1, 0x9a, 0x1b, 0x68, 0x6e, 0xb0, 0x8d, 0x16, + 0x4f, 0x72, 0x5f, 0xd0, 0x83, 0x0b, 0xe3, 0x17, 0x90, 0x63, 0x6d, 0x74, + 0xf1, 0x64, 0x8b, 0xc0, 0x9b, 0xfd, 0xf9, 0xc6, 0xca, 0x9a, 0x57, 0xb0, + 0xa6, 0x3b, 0x97, 0x89, 0x6f, 0x19, 0x96, 0xf1, 0xe3, 0x31, 0xee, 0xe3, + 0xb1, 0x37, 0xcb, 0x5f, 0x33, 0x82, 0xce, 0x9e, 0x0d, 0xc6, 0xcd, 0xfd, + 0x56, 0x6b, 0x26, 0x8b, 0xdb, 0x9d, 0x34, 0x1b, 0xd4, 0xc0, 0x37, 0x55, + 0xfa, 0x28, 0xae, 0x23, 0xa8, 0x4a, 0xb4, 0x8f, 0xf9, 0xbc, 0x4e, 0xd6, + 0xaf, 0x5b, 0x30, 0x6f, 0xd8, 0xcd, 0xd1, 0x88, 0xe5, 0x38, 0x27, 0xec, + 0xbe, 0x26, 0xc7, 0xd9, 0xee, 0xb3, 0xdf, 0xc7, 0x53, 0xc8, 0xaa, 0x3c, + 0xaf, 0x29, 0xed, 0xa0, 0x83, 0x50, 0xcf, 0x8b, 0xb2, 0x9e, 0xb2, 0xe8, + 0xad, 0x99, 0x18, 0x4e, 0x1c, 0xe3, 0x9c, 0xed, 0xac, 0x85, 0xfe, 0xe0, + 0xbd, 0x98, 0x00, 0x1e, 0x61, 0x8a, 0xe2, 0xaf, 0x50, 0xca, 0xe3, 0x69, + 0xe1, 0xa9, 0xe0, 0xc9, 0xf5, 0x0c, 0x1d, 0x4f, 0xe8, 0x18, 0xec, 0x53, + 0xb4, 0xef, 0x92, 0x93, 0x3f, 0x41, 0x37, 0xde, 0x9e, 0x74, 0xea, 0x51, + 0x8b, 0xd6, 0x72, 0xf5, 0xa8, 0x3f, 0x67, 0x9e, 0x9c, 0x70, 0xeb, 0x51, + 0x8b, 0x24, 0xea, 0x51, 0x27, 0x56, 0xa8, 0x47, 0x25, 0x56, 0x5f, 0x8f, + 0xe2, 0xf9, 0x35, 0xda, 0xd7, 0x4f, 0xca, 0x17, 0x64, 0x3d, 0xea, 0x3d, + 0x72, 0xea, 0x51, 0x17, 0xa9, 0x71, 0x3d, 0xea, 0x78, 0x5d, 0x3d, 0x2a, + 0x28, 0xea, 0x51, 0x3c, 0x8f, 0x53, 0x8f, 0x12, 0xed, 0xbe, 0x88, 0xa7, + 0xee, 0x42, 0xf4, 0xee, 0x64, 0x07, 0x68, 0x66, 0xd0, 0xf7, 0x1a, 0xda, + 0x34, 0x45, 0xc8, 0xdb, 0x4a, 0x35, 0xd0, 0x07, 0x6e, 0xb8, 0xbe, 0xa2, + 0xd0, 0x06, 0xcc, 0x9b, 0xec, 0x7b, 0xd8, 0x53, 0x63, 0x61, 0x9a, 0xff, + 0x62, 0xea, 0x2c, 0x07, 0x45, 0x9d, 0xe5, 0x87, 0x6b, 0xbc, 0x75, 0x96, + 0x45, 0xba, 0x7e, 0x9d, 0xe5, 0x60, 0x83, 0x3a, 0xcb, 0x5b, 0x54, 0xad, + 0xb3, 0xbc, 0x45, 0xd5, 0x3a, 0xcb, 0xc1, 0x12, 0xe7, 0xe2, 0x3e, 0x89, + 0x5f, 0x06, 0xed, 0x41, 0xf1, 0xc7, 0xb5, 0x97, 0xc5, 0xca, 0x1e, 0x7e, + 0xd9, 0x6a, 0x2f, 0x6c, 0x03, 0x22, 0x17, 0x2e, 0xd7, 0xd4, 0x5e, 0xb8, + 0x0d, 0x9d, 0xb1, 0xd7, 0x08, 0x19, 0x99, 0x83, 0x7f, 0x5f, 0x9c, 0x0c, + 0x61, 0xce, 0x0e, 0xf8, 0x8c, 0x0e, 0xe4, 0x06, 0x61, 0xb4, 0x15, 0xda, + 0x64, 0x0d, 0xa1, 0x8f, 0xc7, 0xd9, 0x0e, 0x43, 0xb7, 0x6c, 0x77, 0x7f, + 0x0f, 0x48, 0x1a, 0x44, 0x68, 0xb8, 0x9d, 0xf4, 0x20, 0xfb, 0x8e, 0xc9, + 0x3d, 0x74, 0xc8, 0xde, 0x22, 0xf6, 0xbd, 0xc1, 0xaa, 0x95, 0xb9, 0xc1, + 0x1b, 0x90, 0xb9, 0xcc, 0xaa, 0x65, 0x8e, 0xe5, 0xcd, 0x39, 0xf7, 0xdd, + 0x60, 0xf1, 0xfa, 0x1d, 0x02, 0xa7, 0x77, 0x1b, 0xc8, 0xfb, 0x18, 0xec, + 0x8e, 0x33, 0xbf, 0x2e, 0xd7, 0xab, 0x8f, 0x87, 0x9f, 0x6d, 0x66, 0xff, + 0xbd, 0x72, 0x3d, 0xb1, 0xde, 0x7f, 0xaf, 0xe4, 0x47, 0x15, 0x61, 0x93, + 0xb3, 0x25, 0xae, 0xed, 0x7b, 0xf9, 0x33, 0x8f, 0x9c, 0x00, 0x7d, 0x42, + 0x0f, 0x98, 0xae, 0x41, 0xf0, 0x01, 0xeb, 0xd8, 0x4f, 0xc9, 0x5a, 0x16, + 0x9e, 0x05, 0x97, 0x7f, 0xad, 0xb0, 0x99, 0xee, 0x18, 0xdb, 0x01, 0x0b, + 0xfe, 0x8f, 0xeb, 0x28, 0x7c, 0x8e, 0xca, 0xfd, 0x2e, 0x5f, 0xbb, 0x2e, + 0xbc, 0xa7, 0x72, 0xbb, 0x5c, 0xce, 0x8a, 0x7a, 0x2d, 0xa9, 0x9d, 0x7d, + 0xd3, 0x2d, 0x6c, 0x6b, 0xb6, 0x58, 0xae, 0xcc, 0x26, 0xf0, 0xce, 0x7c, + 0x7d, 0x17, 0x36, 0x9c, 0xcf, 0xaa, 0xbf, 0x23, 0x6a, 0x04, 0x73, 0x36, + 0xdb, 0x6b, 0x8e, 0x41, 0x7f, 0x0b, 0xb2, 0xc4, 0xef, 0x51, 0x71, 0x2e, + 0x21, 0x6a, 0xf8, 0x83, 0xdc, 0x76, 0xed, 0x4a, 0x94, 0xed, 0x30, 0xf6, + 0x5c, 0xa5, 0x31, 0xe2, 0x23, 0xc8, 0x0c, 0xc7, 0xb1, 0x0c, 0xe7, 0xc6, + 0x9e, 0x9a, 0xa7, 0x66, 0xab, 0xcb, 0xb8, 0x88, 0x75, 0x39, 0x00, 0x9a, + 0xed, 0x10, 0x31, 0xea, 0xb8, 0x5d, 0xa6, 0xea, 0x19, 0x3f, 0xd3, 0xdc, + 0x39, 0xe7, 0x3f, 0x66, 0x2f, 0x47, 0xfb, 0xcd, 0x37, 0x48, 0x7b, 0x47, + 0x1f, 0x6b, 0xe9, 0xae, 0x23, 0x7e, 0x71, 0xe9, 0xee, 0xfa, 0xa8, 0x49, + 0x49, 0x83, 0xa8, 0xac, 0x2b, 0x7e, 0x5a, 0x9e, 0x29, 0xfd, 0x5f, 0xd8, + 0xaf, 0xe2, 0xd9, 0xaf, 0xab, 0xbb, 0xfb, 0xe4, 0x7e, 0xc3, 0x75, 0xba, + 0x1b, 0x97, 0x75, 0xb9, 0x5f, 0x84, 0xee, 0xba, 0x7b, 0xe2, 0xb5, 0xb7, + 0x5c, 0x67, 0xdd, 0x67, 0x48, 0x8d, 0xaf, 0x14, 0x7b, 0xff, 0xb4, 0xf9, + 0xe3, 0xc5, 0xde, 0x1f, 0x87, 0x9e, 0x5e, 0xbd, 0x65, 0x1a, 0xb6, 0x89, + 0xb8, 0xc2, 0xd1, 0x1f, 0xd8, 0xe3, 0x82, 0x9f, 0x16, 0x1e, 0xd2, 0xe9, + 0x9f, 0xee, 0xe4, 0xfa, 0xac, 0x26, 0x73, 0x7c, 0x6e, 0x7f, 0xb1, 0x95, + 0x63, 0xab, 0x4d, 0xd6, 0x77, 0x44, 0x6e, 0x95, 0x57, 0x4d, 0x8f, 0x1f, + 0x31, 0x30, 0xce, 0x63, 0x61, 0xba, 0x1c, 0xbc, 0x91, 0xb8, 0xbc, 0xcb, + 0x58, 0xf4, 0xad, 0x26, 0x2e, 0xbf, 0x55, 0xf7, 0x5b, 0x7f, 0xdd, 0x7a, + 0xbd, 0x3a, 0x47, 0x35, 0x2e, 0xe7, 0x7c, 0x3e, 0xe8, 0xd4, 0x18, 0x4c, + 0x8e, 0xcf, 0xd7, 0x4a, 0x9e, 0xf0, 0x3b, 0x72, 0x11, 0x1b, 0x79, 0x08, + 0x64, 0xfc, 0x55, 0xc8, 0xca, 0x2b, 0x36, 0xf2, 0x0e, 0x1b, 0xf9, 0x88, + 0x8d, 0xdc, 0xc3, 0x46, 0xee, 0x61, 0xf7, 0xc8, 0x1c, 0x26, 0x23, 0xeb, + 0x56, 0x7c, 0x46, 0xcb, 0xf9, 0x61, 0x5e, 0xc9, 0xd8, 0xe3, 0x7c, 0x1f, + 0x41, 0x4d, 0xc6, 0x36, 0xca, 0x78, 0xf0, 0x38, 0xdf, 0x77, 0x28, 0xab, + 0x71, 0xae, 0x45, 0x91, 0xaa, 0xc6, 0x6f, 0x87, 0x8f, 0xda, 0x0e, 0xbc, + 0x9a, 0x79, 0xdc, 0xa7, 0xc6, 0x5b, 0x99, 0x76, 0x8a, 0x1a, 0x5f, 0x2b, + 0xcf, 0x0d, 0x7a, 0x03, 0x0e, 0xfe, 0xdd, 0xdc, 0xd6, 0xd4, 0xf8, 0xdd, + 0xec, 0xd3, 0xc2, 0xa4, 0xba, 0xfd, 0xb7, 0x07, 0x98, 0xae, 0xa4, 0xde, + 0x16, 0xe0, 0xb8, 0x76, 0xde, 0xf6, 0x8b, 0x3b, 0x05, 0xc9, 0x18, 0xd7, + 0xcc, 0xb8, 0x5d, 0xa5, 0xab, 0xba, 0x2c, 0x5d, 0xfd, 0x95, 0xfa, 0x3f, + 0xd3, 0xd2, 0xc7, 0x70, 0xa2, 0x36, 0xc6, 0x34, 0x75, 0xe7, 0xe3, 0xf3, + 0x66, 0x5e, 0x47, 0xdc, 0x63, 0xc0, 0xf3, 0x60, 0x33, 0xb5, 0x0d, 0x0e, + 0xf9, 0x2d, 0xef, 0xba, 0x6c, 0x43, 0x76, 0x90, 0x37, 0xc7, 0x5a, 0x7e, + 0xcd, 0xa8, 0x38, 0x1b, 0x49, 0xf6, 0x47, 0x85, 0xec, 0xb0, 0xac, 0x69, + 0xe2, 0xce, 0xd5, 0x47, 0xe2, 0x1e, 0x09, 0xcb, 0x19, 0xcb, 0xf2, 0x78, + 0x7f, 0x57, 0x58, 0x53, 0x5b, 0xb0, 0x46, 0x98, 0xd2, 0x25, 0x71, 0x56, + 0x80, 0x7c, 0xe9, 0xdc, 0x3a, 0x6a, 0xfb, 0x07, 0xbd, 0x9a, 0xc7, 0x46, + 0x9d, 0xb3, 0x7a, 0xbb, 0xde, 0xff, 0x8d, 0x8a, 0x73, 0x65, 0xc7, 0x06, + 0xb9, 0xe7, 0xc3, 0xab, 0x3b, 0xff, 0xbe, 0xbe, 0x3e, 0xb5, 0xd4, 0xd7, + 0x0d, 0x24, 0x0d, 0x98, 0x36, 0x8d, 0xcf, 0xee, 0xe7, 0x4b, 0x7c, 0xaf, + 0x25, 0x12, 0xe3, 0xdc, 0x6d, 0x44, 0xdc, 0xf9, 0x50, 0x21, 0x85, 0x3a, + 0x8d, 0x19, 0x9c, 0xf3, 0x85, 0x86, 0x7d, 0x71, 0xca, 0x64, 0x27, 0x48, + 0x43, 0xac, 0x98, 0xa9, 0xd6, 0x03, 0x1f, 0x5c, 0x43, 0x96, 0x2b, 0x97, + 0x51, 0xce, 0x1f, 0x6a, 0xce, 0xed, 0x16, 0xe9, 0xb0, 0x72, 0xa0, 0x74, + 0x84, 0x0e, 0x34, 0x8c, 0x29, 0x1b, 0xd7, 0x03, 0x2f, 0xd6, 0xd5, 0x14, + 0x16, 0x44, 0x4d, 0x21, 0xb7, 0xc6, 0x6f, 0x3d, 0x19, 0x70, 0xee, 0xb5, + 0x34, 0xd6, 0x93, 0x5d, 0x15, 0x3d, 0x71, 0xe1, 0xf8, 0x2c, 0xbe, 0x8d, + 0x76, 0x8a, 0xb5, 0x0e, 0x2b, 0x59, 0xbb, 0x95, 0x76, 0x1a, 0x0e, 0xd6, + 0xa3, 0x36, 0xe3, 0x75, 0x58, 0x39, 0x68, 0xe7, 0x95, 0xb4, 0xa8, 0x3d, + 0x70, 0x8c, 0xbf, 0xe6, 0xda, 0x30, 0x95, 0xe9, 0xed, 0x98, 0xfb, 0x3d, + 0xc3, 0x78, 0x6b, 0x8a, 0x2e, 0x9d, 0xf8, 0x2e, 0x51, 0x58, 0xe6, 0x6f, + 0xce, 0x7c, 0xb9, 0x29, 0xae, 0x25, 0xde, 0x8f, 0xfd, 0x33, 0xfc, 0x6e, + 0x25, 0x39, 0x55, 0x2e, 0xa7, 0x31, 0x3e, 0xd6, 0x7b, 0xaf, 0xc8, 0x8d, + 0xd4, 0x38, 0x0d, 0x71, 0x8e, 0xac, 0x2d, 0xc9, 0x91, 0xd3, 0xd0, 0x35, + 0xc4, 0x20, 0x76, 0x13, 0xbe, 0x75, 0xe3, 0x91, 0xcf, 0xae, 0x75, 0x64, + 0xe4, 0xbb, 0x12, 0x0f, 0x1e, 0xff, 0xfb, 0x80, 0x7b, 0x0f, 0x28, 0x77, + 0x2a, 0x8d, 0xfd, 0x37, 0x51, 0xca, 0x74, 0xf2, 0xbb, 0xec, 0x99, 0x23, + 0x1b, 0x6a, 0xe1, 0xd1, 0x77, 0xca, 0x85, 0x0f, 0xd6, 0xc1, 0xf3, 0x19, + 0xd7, 0x5f, 0xd5, 0xc1, 0x07, 0x3d, 0xf0, 0x66, 0x1d, 0x3c, 0xe2, 0xae, + 0x33, 0xdf, 0xa8, 0x83, 0x37, 0x3d, 0xf0, 0xed, 0x75, 0xf0, 0xed, 0x80, + 0x7f, 0xa3, 0x0e, 0x1e, 0x7d, 0xa7, 0x90, 0x13, 0x08, 0xda, 0x70, 0x8c, + 0x74, 0x48, 0xe6, 0x89, 0x78, 0x2e, 0xb9, 0x1f, 0xc9, 0xf2, 0xd3, 0x01, + 0x1a, 0x7b, 0xeb, 0xb5, 0x09, 0xd8, 0xa8, 0xaa, 0x4c, 0x39, 0xfa, 0xea, + 0x95, 0x25, 0x96, 0xbd, 0x3c, 0xe4, 0x15, 0x7a, 0x54, 0x80, 0x3e, 0x15, + 0x5c, 0x5f, 0xca, 0x77, 0xaa, 0x22, 0xc7, 0x1d, 0x3d, 0x56, 0x68, 0xbd, + 0x35, 0x2f, 0x73, 0x91, 0xab, 0x8c, 0x3b, 0xfc, 0x86, 0xeb, 0x3b, 0xe8, + 0x84, 0x63, 0x57, 0x58, 0xbf, 0x79, 0x7e, 0x69, 0x5f, 0x4a, 0x2c, 0x87, + 0xce, 0x3a, 0xe9, 0x25, 0x32, 0x1b, 0x5e, 0x52, 0x77, 0xf1, 0xd5, 0xd9, + 0x77, 0x12, 0xf6, 0x3d, 0xd7, 0xe2, 0xb7, 0x36, 0xac, 0xbd, 0x9e, 0x7d, + 0xcf, 0x78, 0xec, 0x7b, 0x38, 0x58, 0xf5, 0xf9, 0x8f, 0x09, 0x9f, 0xdf, + 0xd1, 0xc0, 0x66, 0xac, 0xde, 0xe7, 0xef, 0xfd, 0xd8, 0x3e, 0x7f, 0xb9, + 0x75, 0x57, 0xe3, 0xf3, 0x1f, 0x69, 0xf9, 0x78, 0x3e, 0x9f, 0xd7, 0xac, + 0xaf, 0x65, 0x7a, 0xcf, 0x59, 0x8e, 0xca, 0x18, 0x7b, 0xb7, 0x27, 0xc6, + 0x66, 0xfc, 0xbe, 0x27, 0xef, 0x02, 0x9e, 0x5e, 0xeb, 0xc8, 0xdb, 0x51, + 0x19, 0xa7, 0x73, 0xec, 0x8d, 0xf7, 0xc2, 0x23, 0x90, 0xd1, 0x7c, 0x8f, + 0x8f, 0x54, 0x9a, 0x35, 0x9d, 0xb3, 0xed, 0x9f, 0x6f, 0xae, 0x17, 0xa1, + 0xcb, 0xc2, 0x9f, 0x24, 0x3e, 0x81, 0x5a, 0xea, 0x49, 0xc8, 0x8f, 0xbb, + 0xaf, 0x95, 0x6a, 0xa9, 0xf5, 0xe7, 0x1f, 0x7c, 0xee, 0x41, 0xca, 0x03, + 0x95, 0x73, 0x10, 0xaf, 0x4e, 0xe9, 0x94, 0x9d, 0x21, 0xdd, 0x8c, 0x93, + 0xb2, 0x8f, 0x71, 0x8e, 0xfd, 0xb0, 0x52, 0x6f, 0x3f, 0x24, 0x6b, 0x30, + 0xea, 0xb2, 0x77, 0x82, 0x7e, 0x02, 0x7c, 0x58, 0xaf, 0x9c, 0x1a, 0x8c, + 0xea, 0xdc, 0x09, 0x3a, 0xfe, 0xf3, 0xbb, 0x13, 0xc4, 0xf3, 0x6b, 0xb4, + 0xb7, 0xc1, 0x9d, 0x20, 0xdf, 0x2a, 0xef, 0x04, 0xad, 0x17, 0x35, 0x18, + 0x9e, 0xc7, 0xa9, 0xc1, 0x70, 0xbb, 0xb3, 0x8f, 0xe5, 0x3a, 0x4c, 0xa3, + 0x93, 0xb7, 0x88, 0x7b, 0xa8, 0x9d, 0x7d, 0xb5, 0xf2, 0xbd, 0xef, 0x13, + 0x8d, 0xa5, 0x79, 0xbd, 0xa3, 0x0d, 0xef, 0xb6, 0x24, 0x3f, 0xc1, 0x9a, + 0xcb, 0x21, 0x51, 0x73, 0xb9, 0xb3, 0xcd, 0x5b, 0x73, 0x51, 0x57, 0xb8, + 0xdb, 0x72, 0xa8, 0x41, 0xcd, 0xc5, 0xef, 0xb9, 0xdb, 0xe2, 0xf7, 0xdc, + 0x6d, 0x39, 0x24, 0xeb, 0x2b, 0xea, 0x2f, 0xd1, 0xdd, 0x96, 0xe4, 0x8a, + 0x77, 0x5b, 0xb6, 0x4a, 0x7d, 0xf5, 0xc2, 0xaf, 0xfe, 0xbc, 0x32, 0x55, + 0x67, 0xe7, 0x13, 0xc2, 0xce, 0xdf, 0xd5, 0xea, 0xb7, 0x9e, 0x69, 0xbb, + 0x9e, 0x9d, 0xdf, 0x57, 0xd1, 0x53, 0xbe, 0xa3, 0xcd, 0x77, 0xbe, 0x58, + 0x16, 0xf9, 0x7c, 0xa6, 0x89, 0x72, 0x03, 0xbf, 0x2a, 0x68, 0xf6, 0x58, + 0x6f, 0xed, 0x99, 0x63, 0xf5, 0x5e, 0xa4, 0xee, 0xb9, 0x17, 0x69, 0xa2, + 0x5f, 0xaf, 0xab, 0x87, 0x04, 0xe4, 0xdd, 0x7e, 0xf8, 0xc2, 0x19, 0x43, + 0xda, 0x5e, 0xc4, 0x70, 0x98, 0xae, 0x50, 0xe4, 0x3b, 0x95, 0x6d, 0xe4, + 0x9b, 0x71, 0xce, 0x4b, 0x54, 0x11, 0x63, 0x42, 0x8e, 0x8b, 0x7e, 0xe1, + 0x6f, 0xd4, 0xb8, 0x23, 0xb3, 0xe3, 0xf6, 0x05, 0xe0, 0xbf, 0x21, 0x51, + 0x6d, 0x9b, 0x95, 0x5a, 0xce, 0x58, 0xe5, 0x0e, 0xbf, 0x09, 0xfb, 0xe0, + 0xdc, 0x07, 0xca, 0x98, 0x7c, 0x67, 0xe4, 0x62, 0x5b, 0xf5, 0x3e, 0xd0, + 0x67, 0xa4, 0x9c, 0x3a, 0xf7, 0x81, 0x48, 0x4d, 0x40, 0x3e, 0x6e, 0xe4, + 0x3e, 0x50, 0xd7, 0x92, 0xfb, 0x40, 0x2b, 0xf3, 0x66, 0xe9, 0x7d, 0xa0, + 0xc6, 0xfc, 0xe1, 0xfb, 0x40, 0xff, 0xde, 0xe6, 0xdc, 0x43, 0x5d, 0x89, + 0x3f, 0x6e, 0x9c, 0xf4, 0x11, 0xe0, 0xf9, 0x3e, 0x50, 0xe5, 0x1e, 0x90, + 0xe7, 0x0e, 0x10, 0xdf, 0x25, 0x59, 0xee, 0x0c, 0xce, 0x7b, 0xff, 0xa4, + 0xa7, 0x72, 0xff, 0xe4, 0x7c, 0xc9, 0xf5, 0xed, 0xee, 0xb9, 0x1c, 0xc7, + 0x39, 0xbb, 0x44, 0x8e, 0x7a, 0xae, 0x54, 0x5b, 0xc3, 0x60, 0xbe, 0x8f, + 0x16, 0xcf, 0x81, 0x3e, 0x6f, 0x89, 0xdc, 0x00, 0x7c, 0xde, 0xe2, 0x23, + 0xe6, 0x1d, 0x29, 0xa0, 0x8b, 0x38, 0xcb, 0x75, 0xf8, 0xdd, 0x21, 0x64, + 0xc1, 0x91, 0x8b, 0xdd, 0x9e, 0xf3, 0xd0, 0xaa, 0x1c, 0x38, 0x67, 0xba, + 0x0e, 0xef, 0x6a, 0x65, 0x46, 0x9c, 0xdd, 0x0c, 0xed, 0xb5, 0x9c, 0xf3, + 0xc6, 0xa8, 0x38, 0xb7, 0x6d, 0xaf, 0xb3, 0x5b, 0x3a, 0xe4, 0x06, 0x31, + 0x67, 0x8c, 0xeb, 0xd5, 0x8c, 0xfb, 0x66, 0xc1, 0xe3, 0x46, 0x67, 0x71, + 0x2b, 0xd7, 0xf1, 0xdc, 0x9a, 0x0a, 0x21, 0x97, 0xd8, 0x9d, 0xce, 0x09, + 0xbb, 0xe9, 0xac, 0xdd, 0x29, 0xd6, 0xde, 0x58, 0x77, 0x96, 0xcd, 0x72, + 0xb5, 0x5c, 0x4c, 0x70, 0x3d, 0x9a, 0xde, 0xb3, 0x84, 0xa6, 0xb5, 0xba, + 0x84, 0xdc, 0xb5, 0x62, 0xe3, 0x3b, 0x2a, 0xba, 0x34, 0x2e, 0xee, 0x21, + 0xbb, 0xe7, 0xb5, 0x0e, 0xfd, 0xaa, 0xba, 0xb7, 0x5c, 0x3c, 0x53, 0x4f, + 0xbf, 0x4d, 0xff, 0x4b, 0xe8, 0x77, 0x15, 0xf4, 0xe3, 0x77, 0x03, 0xef, + 0xef, 0x8a, 0x7a, 0xc0, 0xb9, 0x52, 0xe4, 0x78, 0x9e, 0x38, 0x4e, 0x88, + 0xcc, 0x2e, 0x50, 0x0f, 0xe8, 0xc8, 0xff, 0xeb, 0xe2, 0xde, 0x9d, 0x60, + 0xfa, 0xb2, 0x7d, 0x8f, 0xbc, 0x70, 0x99, 0xd8, 0xc6, 0xdf, 0x8d, 0x7d, + 0x94, 0xcb, 0x2f, 0xc5, 0x5c, 0xfa, 0xb3, 0xee, 0x73, 0x9d, 0xaa, 0x76, + 0x5f, 0x7b, 0x57, 0xed, 0x53, 0x1d, 0xf9, 0xcc, 0x34, 0x90, 0xcf, 0x8c, + 0xdc, 0xa3, 0x6f, 0xa6, 0x71, 0xbc, 0x9a, 0x9a, 0xfc, 0xef, 0x5e, 0xae, + 0x26, 0xb6, 0x8d, 0x22, 0x0a, 0xbf, 0xac, 0xd7, 0x4e, 0xe3, 0xa4, 0x61, + 0x93, 0x3a, 0xad, 0x69, 0xd2, 0x60, 0xc7, 0x4b, 0x12, 0x29, 0xa5, 0xa4, + 0x52, 0x55, 0x45, 0x60, 0xa9, 0x21, 0x4e, 0xda, 0x0a, 0x71, 0x70, 0x0b, + 0x48, 0x51, 0xc5, 0x21, 0x4d, 0xd3, 0x7b, 0x85, 0x84, 0x54, 0xa1, 0x8a, + 0x46, 0x4e, 0x02, 0x15, 0x4a, 0xe5, 0x0a, 0x96, 0x72, 0x41, 0xa2, 0xd8, + 0x8e, 0x02, 0x52, 0x2a, 0xf7, 0xca, 0x85, 0xba, 0xbf, 0x08, 0x89, 0x03, + 0x70, 0x06, 0x29, 0x2a, 0x3f, 0xe2, 0xc0, 0x8d, 0x1b, 0x54, 0x5d, 0xde, + 0x37, 0xb3, 0x63, 0xaf, 0x77, 0xd7, 0x8e, 0x03, 0x11, 0x07, 0x27, 0xbb, + 0xf6, 0xcc, 0xce, 0xec, 0xcc, 0x37, 0x6f, 0xbe, 0xf7, 0x37, 0xfd, 0xbe, + 0x78, 0x8d, 0x5a, 0xdb, 0x5b, 0xf3, 0x55, 0xec, 0xe7, 0xaf, 0x37, 0x18, + 0x57, 0xed, 0xba, 0xe4, 0xa9, 0xf5, 0xe3, 0x9a, 0x72, 0xd9, 0x1b, 0xf0, + 0xfe, 0xc7, 0x68, 0x51, 0xd8, 0x86, 0x94, 0xad, 0xee, 0xc5, 0x40, 0x9b, + 0xd9, 0xff, 0x33, 0x16, 0x03, 0x3e, 0x9b, 0x68, 0xad, 0x6d, 0x8a, 0xed, + 0x71, 0xd9, 0x16, 0xde, 0xda, 0xc2, 0xb6, 0x10, 0x3c, 0x16, 0xfd, 0x9e, + 0xb1, 0xa8, 0xc9, 0xea, 0xa1, 0x16, 0xed, 0x74, 0x88, 0x21, 0xbf, 0x9d, + 0x67, 0x6c, 0x05, 0xca, 0xce, 0x4f, 0x5d, 0x36, 0x3c, 0xe0, 0x73, 0xdc, + 0x59, 0xeb, 0xc0, 0x27, 0xb5, 0x9d, 0x1a, 0x51, 0xed, 0x01, 0x8f, 0xc9, + 0xc5, 0x45, 0x82, 0xbe, 0x86, 0x36, 0xe3, 0x82, 0xe3, 0xfa, 0x39, 0x14, + 0x8f, 0xf1, 0xfa, 0x1b, 0x88, 0xe5, 0x70, 0xda, 0x3f, 0xd9, 0x76, 0xae, + 0x9c, 0xe5, 0xbd, 0x42, 0xd4, 0x63, 0xbd, 0xef, 0x52, 0xdb, 0x82, 0xa8, + 0x27, 0xe3, 0x20, 0x1c, 0x1d, 0xd0, 0xe1, 0xe2, 0x8d, 0x74, 0x3f, 0xff, + 0x9e, 0x13, 0xcc, 0xdd, 0x7f, 0xdd, 0x1d, 0x36, 0x3f, 0x34, 0x64, 0xae, + 0xde, 0x56, 0xdc, 0x5d, 0xd9, 0x89, 0x06, 0x85, 0xaf, 0xc1, 0xad, 0x7b, + 0x41, 0x76, 0x5d, 0xe0, 0x3d, 0x7c, 0xa8, 0xba, 0x7f, 0xef, 0x84, 0x7d, + 0xe8, 0x99, 0x16, 0x62, 0x1d, 0x44, 0x8e, 0xe5, 0x2b, 0x53, 0xc8, 0x45, + 0xaa, 0xe6, 0xef, 0x78, 0xf3, 0x3c, 0x20, 0x3f, 0x55, 0x9e, 0x87, 0xca, + 0x23, 0xc5, 0x7b, 0x24, 0x02, 0xf2, 0x3c, 0xdc, 0x32, 0x18, 0xf5, 0xea, + 0xdf, 0xc3, 0x2d, 0x7f, 0x57, 0x1c, 0xf9, 0x5b, 0xf0, 0xd8, 0xe3, 0x97, + 0xf3, 0x6a, 0x2d, 0x20, 0xe7, 0x43, 0xf1, 0x94, 0xde, 0x00, 0x9e, 0x12, + 0x9c, 0xeb, 0xa1, 0xa5, 0x2f, 0xf2, 0x5e, 0x7e, 0x08, 0x7b, 0xb9, 0x51, + 0x8b, 0xe9, 0x95, 0x72, 0xf0, 0xdc, 0x3a, 0x64, 0xa2, 0xca, 0xb9, 0x81, + 0x5c, 0x44, 0x2c, 0x3c, 0xe6, 0xba, 0xe4, 0x60, 0x11, 0xbf, 0xa9, 0x58, + 0x52, 0xa5, 0x47, 0xbd, 0x23, 0xf2, 0x0c, 0xbe, 0x1b, 0x3f, 0xcc, 0x1c, + 0x18, 0xf2, 0x13, 0x76, 0xa6, 0x43, 0x0e, 0x1f, 0xbe, 0xcc, 0xbf, 0x8d, + 0x39, 0xd7, 0x92, 0x8b, 0xca, 0x6b, 0xa5, 0x4b, 0xfd, 0xd0, 0x41, 0xe6, + 0x6f, 0x0e, 0x2f, 0xad, 0xb3, 0x41, 0xc4, 0x53, 0xda, 0xdb, 0x74, 0xa1, + 0xd8, 0x0c, 0x83, 0xf5, 0xf8, 0x4b, 0x79, 0x38, 0x4f, 0x42, 0x70, 0x9e, + 0x9f, 0x3a, 0xc2, 0xe6, 0x44, 0x4f, 0xb3, 0x38, 0x9c, 0x53, 0x55, 0xfc, + 0xa9, 0x72, 0xaa, 0x6f, 0x8f, 0x3a, 0x10, 0xa7, 0xe6, 0xc7, 0x04, 0xe6, + 0x1f, 0xfa, 0x9c, 0x5a, 0x87, 0xd0, 0xeb, 0x10, 0xf3, 0x87, 0x76, 0x8d, + 0x06, 0x6b, 0xb0, 0x66, 0x13, 0x2f, 0x50, 0x2b, 0xb1, 0x7f, 0xc9, 0xd1, + 0x0a, 0x9d, 0xed, 0x69, 0xa6, 0xf3, 0x9e, 0x08, 0xd4, 0x79, 0x83, 0x72, + 0xa4, 0xcc, 0x80, 0x1c, 0x29, 0x37, 0x0e, 0x75, 0x17, 0x0e, 0xe3, 0x2e, + 0x2e, 0x30, 0xc0, 0xdc, 0xb9, 0x8b, 0xf1, 0x04, 0xee, 0x1c, 0xa5, 0xd0, + 0x07, 0x6e, 0xee, 0xec, 0xf7, 0x13, 0x49, 0x5c, 0xfe, 0xdb, 0xdc, 0xa9, + 0xa0, 0x7e, 0x27, 0x7c, 0xfd, 0x86, 0x1c, 0x9f, 0x6c, 0xc8, 0x13, 0x82, + 0x38, 0xfe, 0x4e, 0xf7, 0xd3, 0xbb, 0xf6, 0xd1, 0xa6, 0x09, 0xfd, 0x70, + 0x74, 0xb1, 0xba, 0xee, 0x5f, 0xf0, 0xd9, 0xb9, 0xc1, 0x67, 0x43, 0xc2, + 0x27, 0xd7, 0x25, 0xf6, 0x90, 0x9d, 0x93, 0x61, 0x9d, 0x1e, 0x19, 0x66, + 0xf7, 0xd4, 0xec, 0xfc, 0x88, 0x21, 0xec, 0x73, 0x74, 0x0e, 0xb9, 0xef, + 0x14, 0x1a, 0xc6, 0xa5, 0xe2, 0x3b, 0xe9, 0x1b, 0x38, 0x77, 0x04, 0xb2, + 0x1b, 0xf2, 0xfc, 0xf4, 0x6c, 0xd8, 0x34, 0x1c, 0x1f, 0x03, 0xfc, 0x08, + 0xc0, 0xa9, 0x7a, 0x7e, 0x90, 0x0d, 0x3d, 0x68, 0x0e, 0x87, 0x7c, 0x73, + 0x28, 0xf1, 0x06, 0x6e, 0x8f, 0x58, 0xbc, 0x83, 0x9e, 0x38, 0xc5, 0x9d, + 0x18, 0x93, 0xee, 0x80, 0x78, 0x41, 0xc4, 0xfa, 0xf9, 0xfa, 0xcb, 0xef, + 0x7c, 0x51, 0xf3, 0xaf, 0xad, 0x49, 0x6d, 0xba, 0x3c, 0xad, 0x4d, 0x15, + 0x51, 0xee, 0xa2, 0x56, 0xdb, 0x97, 0x36, 0x5d, 0x1c, 0x11, 0x7c, 0x30, + 0x79, 0xad, 0x42, 0x78, 0x4f, 0xdb, 0xbe, 0x25, 0xb8, 0xed, 0x80, 0x0f, + 0xab, 0x8a, 0x73, 0x18, 0x2d, 0xbc, 0x97, 0xb4, 0xbd, 0xb8, 0xb9, 0x8e, + 0x5b, 0xbe, 0x3f, 0x1d, 0x20, 0xdf, 0x9b, 0xd9, 0x0a, 0x91, 0xbf, 0x29, + 0xe2, 0xb2, 0xa9, 0x68, 0x21, 0xde, 0xf1, 0x30, 0xe2, 0x7b, 0xe1, 0xd7, + 0xa8, 0x62, 0xe1, 0x6e, 0x30, 0x16, 0xaa, 0xf6, 0x60, 0x1d, 0xb9, 0xa3, + 0x2c, 0x8b, 0xc3, 0xe9, 0x5e, 0x0a, 0x99, 0x28, 0xff, 0x6c, 0xe2, 0x3e, + 0x1d, 0x73, 0x78, 0x09, 0xfc, 0x3c, 0xb2, 0xde, 0x4c, 0x0b, 0x76, 0xe1, + 0x60, 0x7f, 0x46, 0x84, 0x65, 0xf3, 0x67, 0xbd, 0xad, 0xf9, 0x33, 0x54, + 0x39, 0xd4, 0xed, 0xa2, 0x35, 0x0b, 0x71, 0x92, 0xf0, 0x2f, 0x75, 0x77, + 0xb4, 0x9b, 0x41, 0xf2, 0x4f, 0xc5, 0x7e, 0x82, 0x1f, 0xc9, 0xb9, 0xba, + 0x41, 0x98, 0x3b, 0x9b, 0xbe, 0x6f, 0x30, 0x57, 0xdb, 0xb1, 0x29, 0x37, + 0x9f, 0x2b, 0xc3, 0x33, 0x57, 0xd8, 0x8b, 0x9a, 0xcd, 0x95, 0xf2, 0x43, + 0x2a, 0xdf, 0xdc, 0x51, 0xc8, 0x93, 0x45, 0xf7, 0x5c, 0xed, 0x8c, 0x7f, + 0x4e, 0xce, 0xd9, 0x4e, 0xfb, 0xe0, 0x1a, 0x8f, 0x43, 0x34, 0xd0, 0x76, + 0x12, 0x2c, 0x33, 0xfc, 0x6b, 0xeb, 0x86, 0x5c, 0x5b, 0xcc, 0x2b, 0x9e, + 0x6f, 0xb8, 0xb6, 0xb0, 0x0f, 0x5c, 0x70, 0xf6, 0x81, 0xd3, 0x3e, 0x7d, + 0x51, 0xd9, 0xbc, 0xff, 0xab, 0xed, 0x0d, 0xcf, 0x7d, 0x22, 0xce, 0xe9, + 0xc8, 0x91, 0xdc, 0x47, 0xce, 0x37, 0xe4, 0x61, 0x3d, 0xdb, 0x5c, 0xa7, + 0x6a, 0xee, 0x91, 0x73, 0x01, 0x79, 0x99, 0xa5, 0xf3, 0xf9, 0xc7, 0x06, + 0x75, 0xf7, 0x53, 0xa4, 0x1a, 0xd3, 0x72, 0x40, 0xf0, 0x61, 0xb7, 0xbe, + 0xbc, 0xec, 0xe4, 0x28, 0xe6, 0x5c, 0x63, 0xb0, 0x9c, 0xcf, 0x36, 0x89, + 0xa7, 0x6f, 0x25, 0x9e, 0x63, 0xc0, 0x23, 0x37, 0xbd, 0x73, 0x35, 0xa1, + 0x65, 0xf2, 0xa8, 0xb3, 0x87, 0xce, 0xea, 0x9f, 0xf0, 0x18, 0x3d, 0xb1, + 0x23, 0xe2, 0x9c, 0x11, 0xe0, 0xd2, 0xb6, 0x97, 0xcd, 0x0e, 0x5a, 0x94, + 0x7e, 0x46, 0x9a, 0xfa, 0xf8, 0x12, 0x15, 0x85, 0x7f, 0x0b, 0xb9, 0x51, + 0xb0, 0x71, 0xc3, 0x47, 0x87, 0xe7, 0xf0, 0xf7, 0x1b, 0x13, 0x8e, 0xcc, + 0xfd, 0x93, 0x31, 0x8c, 0x7a, 0x38, 0x0b, 0x01, 0xeb, 0x9d, 0x34, 0xc9, + 0x31, 0xb9, 0x1d, 0x71, 0x4e, 0x80, 0x8c, 0xcd, 0xbb, 0x5d, 0xde, 0x8e, + 0x4f, 0xa1, 0x55, 0xbd, 0xe4, 0xeb, 0x68, 0xd8, 0xfc, 0x72, 0xcf, 0xf6, + 0x7d, 0x0a, 0x2a, 0x77, 0x5f, 0x71, 0x58, 0x75, 0x2d, 0x73, 0x69, 0xc1, + 0x99, 0xe7, 0xd7, 0x55, 0xde, 0x6d, 0x77, 0x40, 0xde, 0x6d, 0x88, 0xe6, + 0x84, 0xaf, 0x2e, 0x44, 0x39, 0x47, 0x37, 0x93, 0x9c, 0x5a, 0xd9, 0x6a, + 0x23, 0x4e, 0xfc, 0x29, 0xee, 0xdd, 0x39, 0xf9, 0x7c, 0x5f, 0x04, 0xcf, + 0x46, 0x4e, 0xb5, 0x2d, 0x62, 0xf1, 0x33, 0xa2, 0x5c, 0xa7, 0xa7, 0x1c, + 0xdf, 0x17, 0xd5, 0x33, 0x3b, 0xb9, 0x7c, 0x8a, 0x64, 0x0e, 0x7d, 0x27, + 0xcd, 0x15, 0x9b, 0xf5, 0x6b, 0x1f, 0xe2, 0x81, 0xe3, 0xf0, 0x95, 0x0a, + 0xbf, 0x95, 0xa1, 0xfa, 0x80, 0x3e, 0xb5, 0x57, 0xfb, 0x04, 0xf9, 0x14, + 0x12, 0x7e, 0x05, 0xbe, 0x76, 0xda, 0x99, 0x23, 0x77, 0xbf, 0xc2, 0xdc, + 0x2f, 0x3c, 0xa7, 0xd3, 0x55, 0xb6, 0xd3, 0x55, 0xb6, 0x36, 0x5e, 0x3a, + 0xeb, 0x54, 0x0b, 0xe5, 0x1f, 0x59, 0x2f, 0xfd, 0x56, 0xd8, 0xe6, 0xe6, + 0xb3, 0x06, 0x2d, 0xac, 0xf7, 0xf2, 0x27, 0xc6, 0x1f, 0x94, 0xdb, 0xcb, + 0xff, 0xdd, 0x9c, 0xa2, 0x5f, 0xc4, 0x02, 0xb6, 0xce, 0x07, 0x83, 0xf1, + 0x1f, 0xbc, 0x6e, 0x13, 0x01, 0xeb, 0xb6, 0xf9, 0xbe, 0x22, 0xf7, 0x93, + 0xe4, 0x95, 0x8a, 0x23, 0xaf, 0x36, 0x69, 0xd0, 0x27, 0xa7, 0x82, 0xd6, + 0x29, 0xfa, 0x78, 0xca, 0xe9, 0xe3, 0x9b, 0xa2, 0x3f, 0xe3, 0x54, 0xa8, + 0xe6, 0x0d, 0x1f, 0xe1, 0xeb, 0x98, 0xb2, 0xd1, 0x35, 0x90, 0xab, 0xdf, + 0x6c, 0x43, 0xc6, 0x04, 0x71, 0xb2, 0x03, 0x01, 0xfa, 0x80, 0xee, 0xd2, + 0x07, 0xe2, 0x55, 0x7d, 0x60, 0x45, 0xe8, 0x09, 0xbb, 0x1c, 0x1d, 0x34, + 0xd8, 0x16, 0x97, 0xcb, 0xe3, 0xcc, 0x1b, 0xd8, 0xf8, 0xa4, 0x1d, 0x7d, + 0xda, 0xaa, 0x9e, 0x99, 0xc3, 0xba, 0x65, 0x8d, 0x4b, 0xfb, 0xe5, 0x09, + 0xce, 0xac, 0xa8, 0xcc, 0x3e, 0x30, 0xa3, 0xa4, 0xa5, 0x93, 0xf1, 0xa9, + 0x50, 0x84, 0x16, 0xac, 0x28, 0x15, 0xac, 0x14, 0x73, 0x70, 0xf0, 0xe3, + 0xd0, 0x80, 0x46, 0x11, 0x96, 0x35, 0x11, 0x2a, 0x95, 0x94, 0x4e, 0x76, + 0x86, 0xc8, 0x2c, 0xc6, 0xa4, 0x0d, 0x9b, 0x71, 0x9a, 0x1f, 0x33, 0xe6, + 0x49, 0x43, 0xcc, 0x8b, 0x93, 0xa3, 0x0e, 0x0c, 0x8a, 0x38, 0x4b, 0xfd, + 0xe5, 0x91, 0x28, 0xb5, 0xa7, 0xa5, 0xcd, 0x68, 0x86, 0xdb, 0xf8, 0xc2, + 0x8a, 0xd1, 0x95, 0x7c, 0xd2, 0x38, 0xc1, 0xed, 0x64, 0xac, 0x64, 0x62, + 0x92, 0x9f, 0x5d, 0x2c, 0x45, 0x28, 0x67, 0x45, 0xa8, 0x50, 0x4a, 0x19, + 0x43, 0x6d, 0xa2, 0xcd, 0x18, 0xda, 0x7c, 0x49, 0x1f, 0x33, 0x4e, 0x92, + 0xbb, 0xcd, 0xaf, 0x9c, 0x36, 0xbd, 0x6d, 0xfd, 0x61, 0xe3, 0xfe, 0x44, + 0xa8, 0x32, 0x7b, 0x9f, 0xf1, 0x92, 0x5b, 0x9d, 0x60, 0xd9, 0x14, 0x13, + 0x67, 0xdb, 0x68, 0xe9, 0x34, 0xcb, 0x1d, 0x9c, 0x6d, 0x61, 0xd0, 0x62, + 0x39, 0x4e, 0xef, 0x57, 0xed, 0x07, 0x12, 0x43, 0x39, 0x91, 0x43, 0x84, + 0x33, 0x17, 0x2a, 0xb3, 0xbf, 0x9b, 0x5e, 0x7f, 0x3f, 0xeb, 0x5b, 0x1f, + 0xc5, 0x28, 0x72, 0x15, 0x71, 0xdd, 0x36, 0x5d, 0x1b, 0x4f, 0x5e, 0xd9, + 0x14, 0x79, 0x68, 0x09, 0x5a, 0x33, 0xa5, 0x3c, 0xcd, 0x71, 0xf9, 0x15, + 0x94, 0x5b, 0x4b, 0xd0, 0x3d, 0x91, 0x8f, 0xd6, 0x4e, 0x77, 0xf4, 0x18, + 0x85, 0x6e, 0x9a, 0xc6, 0xbc, 0xf0, 0x0b, 0x57, 0x66, 0x87, 0x86, 0x0d, + 0xd2, 0xae, 0xa2, 0x1e, 0xff, 0xbf, 0x89, 0xfb, 0x28, 0x61, 0x7e, 0x66, + 0xac, 0x31, 0x5e, 0x49, 0xc3, 0xf1, 0x12, 0x64, 0xf3, 0x41, 0x89, 0xa5, + 0x39, 0x23, 0x42, 0xd0, 0x5f, 0x61, 0x7b, 0xeb, 0x35, 0x27, 0x7b, 0xa4, + 0xfe, 0xe4, 0x3b, 0x9b, 0x43, 0x9f, 0x19, 0x71, 0x9f, 0xcf, 0x51, 0x7b, + 0x66, 0xc6, 0x92, 0xef, 0xb9, 0x52, 0xee, 0xa5, 0x25, 0x6e, 0x7b, 0x64, + 0xf8, 0x8c, 0x73, 0xa6, 0x0f, 0xff, 0xd9, 0x8b, 0x7b, 0x85, 0xb7, 0x7d, + 0x7d, 0x14, 0xc5, 0x3d, 0x0d, 0xe8, 0x3c, 0xc7, 0xb0, 0xe9, 0x87, 0xc5, + 0xb8, 0xa7, 0xe2, 0x98, 0xcb, 0xb9, 0xb8, 0x3a, 0x97, 0x08, 0x65, 0xba, + 0xe9, 0x91, 0xd5, 0x45, 0x3f, 0x8b, 0xf3, 0x47, 0xf8, 0xba, 0x84, 0x9c, + 0xa3, 0x36, 0xca, 0x64, 0xbb, 0x69, 0xb3, 0x14, 0x66, 0x71, 0x05, 0xec, + 0x44, 0xb9, 0x4c, 0x81, 0xa6, 0xd6, 0x5f, 0xeb, 0x83, 0x1f, 0x66, 0x52, + 0xab, 0x61, 0xe9, 0x51, 0x00, 0x96, 0x7e, 0xa9, 0xc3, 0xd2, 0xd1, 0xbe, + 0xe6, 0x58, 0xea, 0x77, 0x62, 0xd6, 0xa3, 0x14, 0x71, 0x70, 0xf4, 0x39, + 0xe3, 0xe8, 0x3d, 0xc6, 0xd1, 0xf1, 0x06, 0x38, 0xd2, 0x3c, 0x38, 0x3a, + 0x51, 0x87, 0xa3, 0x6c, 0x5f, 0x33, 0x1c, 0x1d, 0x0f, 0xa1, 0xff, 0xcd, + 0xd6, 0x32, 0xfa, 0xb0, 0x9f, 0x39, 0xbd, 0x49, 0xa5, 0xd5, 0xe4, 0xf8, + 0x24, 0x55, 0x90, 0x73, 0x92, 0x58, 0xa2, 0xb4, 0xe0, 0x76, 0x05, 0x81, + 0xbf, 0x2c, 0x8f, 0xc9, 0xae, 0x06, 0xe7, 0xaa, 0x24, 0x9c, 0x79, 0x93, + 0x73, 0x99, 0xc9, 0x57, 0x66, 0x1f, 0x32, 0x36, 0xee, 0x6d, 0xe8, 0x3a, + 0x7e, 0x0b, 0xb1, 0x8c, 0xbc, 0xbb, 0x81, 0x73, 0x5b, 0xe2, 0x74, 0xdf, + 0x1a, 0xa0, 0x7b, 0xd6, 0x7e, 0xba, 0x6b, 0x0d, 0xd2, 0x03, 0x0b, 0x6d, + 0x60, 0x0e, 0xf8, 0x5e, 0xcc, 0x81, 0x46, 0x33, 0x31, 0x2e, 0x53, 0xda, + 0x4f, 0x95, 0x92, 0xc2, 0x35, 0xb0, 0x03, 0x0c, 0x35, 0xc6, 0x4e, 0xa6, + 0x0e, 0x3b, 0xb2, 0x0e, 0x30, 0xb3, 0xe4, 0xb7, 0xad, 0xed, 0x32, 0xf8, + 0x5d, 0x0d, 0xc6, 0x56, 0x58, 0xc4, 0x91, 0x24, 0x47, 0x67, 0x42, 0x90, + 0x59, 0xb7, 0x18, 0x53, 0x3c, 0x17, 0x3c, 0x7e, 0xda, 0xf5, 0x41, 0x96, + 0x39, 0x4f, 0x09, 0x1b, 0xf4, 0x94, 0xa9, 0xc7, 0x33, 0x64, 0x5f, 0xd6, + 0xcc, 0x31, 0x91, 0xeb, 0xb6, 0x54, 0xf6, 0x9e, 0x31, 0x91, 0xe1, 0xb1, + 0x57, 0x78, 0xf4, 0xca, 0xa1, 0x76, 0xaa, 0x38, 0x31, 0x4c, 0x85, 0x55, + 0xdb, 0x7e, 0xc8, 0xfc, 0x7f, 0xcd, 0x84, 0xcc, 0xfe, 0xdb, 0xae, 0xc4, + 0x74, 0x5a, 0x36, 0x55, 0xdf, 0xee, 0x08, 0x7c, 0x31, 0x47, 0xa4, 0x77, + 0x37, 0xaa, 0xaf, 0xc4, 0xbf, 0xe3, 0xbb, 0xbf, 0x04, 0x97, 0x59, 0xab, + 0x96, 0x85, 0xed, 0xf8, 0xd2, 0xd8, 0xc2, 0x2a, 0xce, 0x7e, 0x7b, 0xfc, + 0xea, 0xf9, 0xd5, 0x5c, 0x1f, 0x4b, 0xd8, 0x94, 0x4e, 0x76, 0x68, 0x79, + 0x3c, 0xf7, 0x5c, 0x98, 0x86, 0x19, 0x97, 0x38, 0x83, 0x6b, 0x6c, 0x34, + 0x2c, 0xce, 0x38, 0xd9, 0xcd, 0x78, 0xc8, 0x0a, 0x3b, 0xfd, 0xd4, 0x91, + 0x09, 0x9a, 0x2c, 0xa7, 0xf9, 0x53, 0x3f, 0x7e, 0xb5, 0xb9, 0xe3, 0xe1, + 0x48, 0xe3, 0x37, 0x37, 0xff, 0xa8, 0xd5, 0x9d, 0xe6, 0xba, 0x33, 0x5b, + 0xd6, 0x55, 0xe7, 0x12, 0xfd, 0x03, 0x69, 0xae, 0x1b, 0xa3, 0xbc, 0x57, + 0x00, 0x00, 0x00 }; -static int bnx2_COM_b06FwReleaseMajor = 0x0; -static int bnx2_COM_b06FwReleaseMinor = 0x0; -static int bnx2_COM_b06FwReleaseFix = 0x0; -static u32 bnx2_COM_b06FwStartAddr = 0x080004a0; -static u32 bnx2_COM_b06FwTextAddr = 0x08000000; -static int bnx2_COM_b06FwTextLen = 0x4594; -static u32 bnx2_COM_b06FwDataAddr = 0x080045e0; -static int bnx2_COM_b06FwDataLen = 0x0; -static u32 bnx2_COM_b06FwRodataAddr = 0x08004598; -static int bnx2_COM_b06FwRodataLen = 0x18; -static u32 bnx2_COM_b06FwBssAddr = 0x08004600; -static int bnx2_COM_b06FwBssLen = 0x88; -static u32 bnx2_COM_b06FwSbssAddr = 0x080045e0; -static int bnx2_COM_b06FwSbssLen = 0x1c; -static u32 bnx2_COM_b06FwText[(0x4594/4) + 1] = { - 0x0a000128, 0x00000000, 0x00000000, 0x0000000d, 0x636f6d20, 0x302e362e, - 0x39000000, 0x00060902, 0x00000000, 0x00000003, 0x00000014, 0x00000032, - 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000010, 0x000003e8, 0x0000ea60, 0x00000001, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x0000ffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000002, 0x00000020, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x10000003, 0x00000000, 0x0000000d, - 0x0000000d, 0x3c020800, 0x244245e0, 0x3c030800, 0x24634688, 0xac400000, - 0x0043202b, 0x1480fffd, 0x24420004, 0x3c1d0800, 0x37bd7ffc, 0x03a0f021, - 0x3c100800, 0x261004a0, 0x3c1c0800, 0x279c45e0, 0x0e0001f2, 0x00000000, - 0x0000000d, 0x27bdffe8, 0x3c1a8000, 0x3c020008, 0x0342d825, 0x3c036010, - 0xafbf0010, 0x8c655000, 0x3c020800, 0x24470ac8, 0x3c040800, 0x24864600, - 0x2402ff7f, 0x00a22824, 0x34a5380c, 0xac655000, 0x00002821, 0x24020037, - 0x24030c80, 0xaf420008, 0xaf430024, 0xacc70000, 0x24a50001, 0x2ca20016, - 0x1440fffc, 0x24c60004, 0x24844600, 0x3c020800, 0x24420ad4, 0x3c030800, - 0x246309d4, 0xac820004, 0x3c020800, 0x24420618, 0x3c050800, 0x24a50ca0, - 0xac82000c, 0x3c020800, 0x24423100, 0xac830008, 0x3c030800, 0x246325c8, - 0xac820014, 0x3c020800, 0x24422b0c, 0xac830018, 0xac83001c, 0x3c030800, - 0x24630adc, 0xac820024, 0x3c020800, 0x24423040, 0xac83002c, 0x3c030800, - 0x24633060, 0xac820030, 0x3c020800, 0x24422f6c, 0xac830034, 0x3c030800, - 0x24632c60, 0xac82003c, 0x3c020800, 0x24420b6c, 0xac850010, 0xac850020, - 0xac830040, 0x0e000bd6, 0xac820050, 0x8fbf0010, 0x03e00008, 0x27bd0018, - 0x27bdffe0, 0xafb00010, 0x27500100, 0xafbf0018, 0xafb10014, 0x9203000b, - 0x24020003, 0x1462005b, 0x96110008, 0x32220001, 0x10400009, 0x27430080, - 0x8e020000, 0x96040014, 0x000211c2, 0x00021040, 0x00621821, 0xa4640000, - 0x0a0001cb, 0x3c020800, 0x3c020800, 0x8c430020, 0x1060002a, 0x3c030800, - 0x0e001006, 0x00000000, 0x97420108, 0x8f850018, 0x9743010c, 0x3042003e, - 0x00021400, 0x00621825, 0xaca30000, 0x8f840018, 0x8f420100, 0xac820004, - 0x97430116, 0x9742010e, 0x8f840018, 0x00031c00, 0x00431025, 0xac820008, - 0x97430110, 0x97440112, 0x8f850018, 0x00031c00, 0x00832025, 0xaca4000c, - 0x97420114, 0x8f840018, 0x3042ffff, 0xac820010, 0x8f830018, 0xac600014, - 0x8f820018, 0x3c030800, 0xac400018, 0x9462466e, 0x8f840018, 0x3c032000, - 0x00431025, 0xac82001c, 0x0e001044, 0x24040001, 0x3c030800, 0x8c620040, - 0x24420001, 0xac620040, 0x3c020800, 0x8c430044, 0x32240004, 0x24630001, - 0x10800017, 0xac430044, 0x8f4202b8, 0x04430007, 0x8e020020, 0x3c040800, - 0x8c830060, 0x24020001, 0x24630001, 0x0a0001ed, 0xac830060, 0x3c060800, - 0x8cc4005c, 0xaf420280, 0x96030016, 0x00001021, 0xa7430284, 0x8e050004, - 0x24840001, 0x3c031000, 0xaf450288, 0xaf4302b8, 0x0a0001ed, 0xacc4005c, - 0x32220002, 0x0a0001ed, 0x0002102b, 0x3c026000, 0xac400808, 0x0000000d, - 0x00001021, 0x8fbf0018, 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020, - 0x27bdffc8, 0xafbf0034, 0xafbe0030, 0xafb7002c, 0xafb60028, 0xafb50024, - 0xafb40020, 0xafb3001c, 0xafb20018, 0xafb10014, 0x0e00013f, 0xafb00010, - 0x24110020, 0x24150030, 0x2794000c, 0x27930008, 0x3c124000, 0x3c1e0800, - 0x3c170800, 0x3c160800, 0x8f820004, 0x3c040800, 0x8c830020, 0x10430004, - 0x00000000, 0xaf830004, 0x0e00110b, 0x00000000, 0x8f500000, 0x32020007, - 0x1040fff5, 0x32020001, 0x1040002b, 0x32020002, 0x8f420100, 0xaf420020, - 0x8f430104, 0xaf4300a8, 0x9342010b, 0x93630000, 0x306300ff, 0x10710005, - 0x304400ff, 0x10750006, 0x2c820016, 0x0a000227, 0x00000000, 0xaf940000, - 0x0a000228, 0x2c820016, 0xaf930000, 0x0a000228, 0x00000000, 0xaf800000, - 0x14400005, 0x00041880, 0x0e0002b2, 0x00000000, 0x0a000234, 0x00000000, - 0x3c020800, 0x24424600, 0x00621821, 0x8c620000, 0x0040f809, 0x00000000, - 0x10400005, 0x8fc20034, 0x8f420104, 0x3c016020, 0xac220014, 0x8fc20034, - 0xaf520138, 0x24420001, 0xafc20034, 0x32020002, 0x10400019, 0x32020004, - 0x8f420140, 0xaf420020, 0x93630000, 0x306300ff, 0x10710005, 0x00000000, - 0x10750006, 0x00000000, 0x0a000250, 0x00000000, 0xaf940000, 0x0a000251, - 0x00000000, 0xaf930000, 0x0a000251, 0x00000000, 0xaf800000, 0x0e0008b9, - 0x00000000, 0x8ee20038, 0xaf520178, 0x24420001, 0xaee20038, 0x32020004, - 0x1040ffad, 0x00000000, 0x8f420180, 0xaf420020, 0x93630000, 0x306300ff, - 0x10710005, 0x00000000, 0x10750006, 0x00000000, 0x0a00026a, 0x00000000, - 0xaf940000, 0x0a00026b, 0x00000000, 0xaf930000, 0x0a00026b, 0x00000000, - 0xaf800000, 0x93620000, 0x14510004, 0x8ec2003c, 0x0e000835, 0x00000000, - 0x8ec2003c, 0xaf5201b8, 0x24420001, 0x0a000206, 0xaec2003c, 0x27bdffe8, - 0xafbf0010, 0x97420108, 0x24033000, 0x30447000, 0x10830012, 0x28823001, - 0x10400007, 0x24024000, 0x1080000b, 0x24022000, 0x1082001a, 0x24020001, - 0x0a000299, 0x00000000, 0x1082000c, 0x24025000, 0x1082000e, 0x00000000, - 0x0a000299, 0x00000000, 0x0000000d, 0x0a00029b, 0x00001021, 0x0e000300, - 0x00000000, 0x0a00029b, 0x00001021, 0x0e00048f, 0x00000000, 0x0a00029b, - 0x00001021, 0x0e000fdf, 0x00000000, 0x0a00029b, 0x00001021, 0x0000000d, - 0x00001021, 0x8fbf0010, 0x03e00008, 0x27bd0018, 0x93620000, 0x24030020, - 0x304400ff, 0x10830005, 0x24020030, 0x10820007, 0x00000000, 0x0a0002af, - 0x00000000, 0x2782000c, 0xaf820000, 0x03e00008, 0x00000000, 0x27820008, - 0xaf820000, 0x03e00008, 0x00000000, 0xaf800000, 0x03e00008, 0x00000000, - 0x0000000d, 0x03e00008, 0x00001021, 0x03e00008, 0x00001021, 0x27440100, - 0x94830008, 0x30620004, 0x10400017, 0x30620002, 0x8f4202b8, 0x04430007, - 0x8c820020, 0x3c040800, 0x8c830060, 0x24020001, 0x24630001, 0x03e00008, - 0xac830060, 0xaf420280, 0x94830016, 0x3c060800, 0xa7430284, 0x8c850004, - 0x8cc4005c, 0x00001021, 0x3c031000, 0x24840001, 0xaf450288, 0xaf4302b8, - 0x03e00008, 0xacc4005c, 0x14400003, 0x3c040800, 0x03e00008, 0x00001021, - 0x8c830084, 0x24020001, 0x24630001, 0x03e00008, 0xac830084, 0x27450100, - 0x3c040800, 0x8c820088, 0x94a3000c, 0x24420001, 0x007a1821, 0xac820088, - 0x8ca40018, 0x90664000, 0xaf440038, 0x8ca2001c, 0x2403fff8, 0x00063600, - 0x00431024, 0x34420004, 0x3c030005, 0xaf42003c, 0xaf430030, 0x00000000, - 0x00000000, 0x00000000, 0xaf460404, 0x00000000, 0x00000000, 0x00000000, - 0x3c020006, 0x34420001, 0xaf420030, 0x00000000, 0x00000000, 0x00000000, - 0x8f420000, 0x30420010, 0x1040fffd, 0x00001021, 0x03e00008, 0x00000000, - 0x3c020800, 0x8c430020, 0x27bdffe8, 0xafb00010, 0x27500100, 0x1060001e, - 0xafbf0014, 0x0e001006, 0x00000000, 0x8f830018, 0x8e020018, 0xac620000, - 0x8f840018, 0x9602000c, 0xac820004, 0x8f830018, 0xac600008, 0x8f820018, - 0xac40000c, 0x8f830018, 0xac600010, 0x8f820018, 0xac400014, 0x8f840018, - 0x3c026000, 0x8c434448, 0xac830018, 0x96020008, 0x3c030800, 0x9464466e, - 0x8f850018, 0x00021400, 0x00441025, 0x24040001, 0x0e001044, 0xaca2001c, - 0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, 0x27bdffc8, 0xafb3001c, - 0x00009821, 0xafb7002c, 0x0000b821, 0xafbe0030, 0x0000f021, 0xafb50024, - 0x27550100, 0xafbf0034, 0xafb60028, 0xafb40020, 0xafb20018, 0xafb10014, - 0xafb00010, 0x96a20008, 0x8f540100, 0x8eb20018, 0x30420001, 0x10400037, - 0x02a0b021, 0x8f630054, 0x2642ffff, 0x00431023, 0x18400006, 0x00000000, - 0x0000000d, 0x00000000, 0x24000128, 0x0a000372, 0x00002021, 0x8f62004c, - 0x02421023, 0x18400028, 0x00002021, 0x93650120, 0x93640121, 0x3c030800, - 0x8c62008c, 0x308400ff, 0x24420001, 0x30a500ff, 0x00803821, 0x1485000b, - 0xac62008c, 0x3c040800, 0x8c830090, 0x24630001, 0xac830090, 0x93620122, - 0x30420001, 0x00021023, 0x30420005, 0x0a000372, 0x34440004, 0x27660100, - 0x00041080, 0x00c21021, 0x8c430000, 0x02431823, 0x04600004, 0x24820001, - 0x30440007, 0x1485fff9, 0x00041080, 0x10870007, 0x3c030800, 0xa3640121, - 0x8c620094, 0x24040005, 0x24420001, 0x0a000372, 0xac620094, 0x24040004, - 0x00809821, 0x9362003f, 0x304400ff, 0x38830016, 0x2c630001, 0x38820010, - 0x2c420001, 0x00621825, 0x1460000c, 0x24020001, 0x38830008, 0x2c630001, - 0x38820014, 0x2c420001, 0x00621825, 0x14600005, 0x24020001, 0x24020012, - 0x14820002, 0x00001021, 0x24020001, 0x50400007, 0x8eb10020, 0x8ea20020, - 0x8f630040, 0x00408821, 0x00431023, 0x5c400001, 0x8f710040, 0x9343010b, - 0x24020004, 0x54620005, 0x36730080, 0x96a20008, 0x36730002, 0x24170001, - 0x305e0020, 0x2402fffb, 0x02628024, 0x1200002a, 0x3c030800, 0x8c620030, - 0x02021024, 0x10400026, 0x3c020800, 0x8c430020, 0x10600024, 0x32620004, - 0x0e001006, 0x00000000, 0x8f830018, 0x8f420100, 0xac620000, 0x8f840018, - 0x02201821, 0x32620002, 0xac900004, 0x8f840018, 0x50400001, 0x8ec30014, - 0xac830008, 0x8f830018, 0x8ec20020, 0xac62000c, 0x8f840018, 0x8f620040, - 0xac820010, 0x8f830018, 0x8ec20018, 0xac620014, 0x8f840018, 0x3c026000, - 0x8c434448, 0x3c020800, 0xac830018, 0x9443466e, 0x8f840018, 0x3c024010, - 0x00621825, 0xac83001c, 0x0e001044, 0x24040001, 0x32620004, 0x10400076, - 0x00003821, 0x3c029000, 0x34420001, 0x3c038000, 0x02821025, 0xa360007c, - 0xaf420020, 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x93620023, - 0x30420080, 0x10400011, 0x00000000, 0x8f65005c, 0x8f63004c, 0x9764003c, - 0x8f620064, 0x00a32823, 0x00852821, 0x00a2102b, 0x54400006, 0x3c023fff, - 0x93620023, 0x3042007f, 0xa3620023, 0xaf720064, 0x3c023fff, 0x0a0003f1, - 0x3442ffff, 0x8f62005c, 0x02421023, 0x04400011, 0x00000000, 0x8f65005c, - 0x8f630064, 0x9764003c, 0x3c023fff, 0x3442ffff, 0xaf720064, 0x00a32823, - 0x00852821, 0x0045102b, 0x10400004, 0x02451021, 0x3c053fff, 0x34a5ffff, - 0x02451021, 0xaf62005c, 0x24070001, 0xaf72004c, 0x8f620054, 0x16420005, - 0x00000000, 0x93620023, 0x30420040, 0x10400017, 0x24020001, 0x9762006a, - 0x00022880, 0x50a00001, 0x24050001, 0x97630068, 0x93640081, 0x3c020800, - 0x8c46004c, 0x00652821, 0x00852804, 0x00c5102b, 0x54400001, 0x00a03021, - 0x3c020800, 0x8c440050, 0x00c4182b, 0x54600001, 0x00c02021, 0x8f420074, - 0x2403fffe, 0x00832824, 0x00a21021, 0xaf62000c, 0x3c028000, 0x34420001, - 0x02821025, 0xa3600081, 0xaf420020, 0x9363007e, 0x9362007a, 0x10620004, - 0x00000000, 0x0e000f2a, 0x00000000, 0x00403821, 0x10e00017, 0x3c029000, - 0x34420001, 0x02821025, 0xaf420020, 0x3c038000, 0x8f420020, 0x00431024, - 0x1440fffd, 0x3c028000, 0x9363007d, 0x34420001, 0x3c048000, 0x02821025, - 0xa363007d, 0xaf420020, 0x8f4201f8, 0x00441024, 0x1440fffd, 0x24020002, - 0x3c031000, 0xaf5401c0, 0xa34201c4, 0xaf4301f8, 0x8ea30014, 0x8f620040, - 0x14430003, 0x00431023, 0x0a000443, 0x00001021, 0x28420001, 0x10400034, - 0x00000000, 0x8f620040, 0xaf630040, 0x9362003e, 0x30420001, 0x1440000b, - 0x3c029000, 0x93620022, 0x24420001, 0xa3620022, 0x93630022, 0x3c020800, - 0x8c440098, 0x0064182b, 0x1460001e, 0x3c020800, 0x3c029000, 0x34420001, - 0x02821025, 0xaf420020, 0x3c038000, 0x8f420020, 0x00431024, 0x1440fffd, - 0x00000000, 0x3c038000, 0x9362007d, 0x34630001, 0x3c048000, 0x02831825, - 0x34420001, 0xa362007d, 0xaf430020, 0x8f4201f8, 0x00441024, 0x1440fffd, - 0x24020002, 0x3c031000, 0xaf5401c0, 0xa34201c4, 0x24020001, 0xaf4301f8, - 0xa7620012, 0x0a000476, 0xa3600022, 0x9743007a, 0x9444002a, 0x00641821, - 0x3063fffe, 0xa7630012, 0x0e000b68, 0x00000000, 0x12e00003, 0x00000000, - 0x0e000f27, 0x00000000, 0x53c00004, 0x96a20008, 0x0e000c10, 0x00000000, - 0x96a20008, 0x8fbf0034, 0x8fbe0030, 0x8fb7002c, 0x8fb60028, 0x8fb50024, - 0x8fb40020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x00021042, - 0x30420001, 0x03e00008, 0x27bd0038, 0x27bdffe8, 0xafbf0010, 0x97420108, - 0x2403000b, 0x304400ff, 0x1083004e, 0x2882000c, 0x10400011, 0x24020006, - 0x1082003e, 0x28820007, 0x10400007, 0x28820008, 0x1080002b, 0x24020001, - 0x1082002e, 0x3c026000, 0x0a000504, 0x00000000, 0x14400061, 0x2882000a, - 0x1440002b, 0x00000000, 0x0a0004ec, 0x00000000, 0x2402001c, 0x1082004e, - 0x2882001d, 0x1040000e, 0x24020019, 0x10820041, 0x2882001a, 0x10400005, - 0x2402000e, 0x10820036, 0x00000000, 0x0a000504, 0x00000000, 0x2402001b, - 0x1082003c, 0x00000000, 0x0a000504, 0x00000000, 0x240200c1, 0x10820040, - 0x288200c2, 0x10400005, 0x24020080, 0x1082001f, 0x00000000, 0x0a000504, - 0x00000000, 0x240200c2, 0x1082003b, 0x00000000, 0x0a000504, 0x00000000, - 0x3c026000, 0x0e000c7d, 0xac400808, 0x0a000506, 0x8fbf0010, 0x8c444448, - 0x3c030800, 0xac640064, 0x0e000c7d, 0x00000000, 0x3c026000, 0x8c444448, - 0x3c030800, 0x0a000505, 0xac640068, 0x8f440100, 0x0e000508, 0x00000000, - 0x3c026000, 0x8c444448, 0x3c030800, 0x0a000505, 0xac64006c, 0x0e000cab, - 0x00000000, 0x0a000506, 0x8fbf0010, 0x8f440100, 0x0e000cd5, 0x00000000, - 0x0a000506, 0x8fbf0010, 0x0e000d1c, 0x00000000, 0x0a000506, 0x8fbf0010, - 0x0000000d, 0x0a000506, 0x8fbf0010, 0x0e0005d7, 0x00000000, 0x0a000506, - 0x8fbf0010, 0x8f440100, 0x0e000d7e, 0x00000000, 0x0a000506, 0x8fbf0010, - 0x0e000e95, 0x00000000, 0x0a000506, 0x8fbf0010, 0x0e000626, 0x00000000, - 0x0a000506, 0x8fbf0010, 0x0e000b68, 0x00000000, 0x0a000506, 0x8fbf0010, - 0x0000000d, 0x8fbf0010, 0x03e00008, 0x27bd0018, 0x27bdffe8, 0x3c029000, - 0x34420001, 0xafb00010, 0x00808021, 0x02021025, 0x3c038000, 0xafbf0014, - 0xaf420020, 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x93620005, - 0x34420001, 0xa3620005, 0x8f63004c, 0x8f620054, 0x10620019, 0x3c028000, - 0x9762006a, 0x00022880, 0x50a00001, 0x24050001, 0x97630068, 0x93640081, - 0x3c020800, 0x8c46004c, 0x00652821, 0x00852804, 0x00c5102b, 0x54400001, - 0x00a03021, 0x3c020800, 0x8c440050, 0x00c4182b, 0x54600001, 0x00c02021, - 0x8f420074, 0x2403fffe, 0x00832824, 0x00a21021, 0xaf62000c, 0x3c028000, - 0x34420001, 0x02021025, 0x0e000c7d, 0xaf420020, 0x3c029000, 0x34420001, - 0x3c038000, 0x02021025, 0xaf420020, 0x8f420020, 0x00431024, 0x1440fffd, - 0x3c028000, 0x9363007d, 0x34420001, 0x3c048000, 0x02021025, 0xa363007d, - 0xaf420020, 0x8f4201f8, 0x00441024, 0x1440fffd, 0x8fbf0014, 0xaf5001c0, - 0x8fb00010, 0x24020002, 0x3c031000, 0xa34201c4, 0xaf4301f8, 0x03e00008, - 0x27bd0018, 0x27bdffd8, 0xafbf0020, 0xafb3001c, 0xafb20018, 0xafb10014, - 0xafb00010, 0x93630005, 0x00809021, 0x24020030, 0x30630030, 0x14620072, - 0x00a09821, 0x3c020800, 0x8c430020, 0x1060006c, 0x00000000, 0x0e001006, - 0x00000000, 0x8f820018, 0xac520000, 0x9363003e, 0x9362003f, 0x8f840018, - 0x00031a00, 0x00431025, 0xac820004, 0x93630081, 0x93620082, 0x8f850018, - 0x00031e00, 0x00021400, 0x00621825, 0xaca30008, 0x8f840018, 0x8f620040, - 0xac82000c, 0x8f830018, 0x8f620048, 0xac620010, 0x8f840018, 0x8f62004c, - 0x3c110800, 0xac820014, 0x8f830018, 0x8f620050, 0x26304660, 0x00002021, - 0xac620018, 0x9602000e, 0x8f850018, 0x3c03c00b, 0x00431025, 0x0e001044, - 0xaca2001c, 0x8f830018, 0x8f620054, 0xac620000, 0x8f840018, 0x8f620058, - 0xac820004, 0x8f830018, 0x8f62005c, 0xac620008, 0x8f840018, 0x8f620060, - 0xac82000c, 0x8f850018, 0x8f620064, 0xaca20010, 0x97630068, 0x9762006a, - 0x8f840018, 0x00031c00, 0x00431025, 0xac820014, 0x8f830018, 0x00002021, - 0xac600018, 0x9602000e, 0x8f850018, 0x3c03c00c, 0x00431025, 0x0e001044, - 0xaca2001c, 0x8f840018, 0x8f630018, 0xac830000, 0x936200c4, 0x30420002, - 0x10400006, 0x00000000, 0x976200c8, 0x8f830018, 0x3042ffff, 0x0a0005b5, - 0xac620004, 0x8f820018, 0xac400004, 0x8f830018, 0x8f62006c, 0xac620008, - 0x8f840018, 0x8f6200dc, 0xac82000c, 0x8f830018, 0xac600010, 0x93620005, - 0x8f830018, 0x00021600, 0x00531025, 0xac620014, 0x8f850018, 0x3c026000, - 0x8c434448, 0x24040001, 0x26224660, 0xaca30018, 0x9443000e, 0x8f850018, - 0x3c02400d, 0x00621825, 0x0e001044, 0xaca3001c, 0x0e000d48, 0x02402021, - 0x8fbf0020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x03e00008, - 0x27bd0028, 0x27bdffe0, 0xafb00010, 0x27500100, 0xafbf0018, 0xafb10014, - 0x9603000c, 0x240200c1, 0x5462001d, 0x8e040000, 0x3c029000, 0x8f440100, - 0x34420001, 0x3c038000, 0x00821025, 0xaf420020, 0x8f420020, 0x00431024, - 0x1440fffd, 0x00000000, 0x3c038000, 0x9362007d, 0x34630001, 0x3c058000, - 0x00831825, 0x34420004, 0xa362007d, 0xaf430020, 0x8f4201f8, 0x00451024, - 0x1440fffd, 0x24020002, 0x3c031000, 0xaf4401c0, 0xa34201c4, 0xaf4301f8, - 0x0a000622, 0x8fbf0018, 0x8f65004c, 0x24060001, 0x0e000db5, 0x2407049f, - 0x3c020800, 0x8c430020, 0x9611000c, 0x1060001d, 0x8e100000, 0x0e001006, - 0x00000000, 0x8f820018, 0xac500000, 0x8f840018, 0x00111400, 0xac820004, - 0x8f830018, 0xac600008, 0x8f820018, 0xac40000c, 0x8f830018, 0xac600010, - 0x8f840018, 0x240204a2, 0xac820014, 0x8f850018, 0x3c026000, 0x8c434448, - 0x24040001, 0x3c020800, 0xaca30018, 0x9443466e, 0x8f850018, 0x3c024019, - 0x00621825, 0x0e001044, 0xaca3001c, 0x8fbf0018, 0x8fb10014, 0x8fb00010, - 0x03e00008, 0x27bd0020, 0x27bdffb0, 0xafb1002c, 0x27510100, 0xafbf004c, - 0xafbe0048, 0xafb70044, 0xafb60040, 0xafb5003c, 0xafb40038, 0xafb30034, - 0xafb20030, 0xafb00028, 0x8e350000, 0x9634000c, 0x3c026000, 0x8c434448, - 0x0000f021, 0xaf630170, 0x8f620040, 0x8e230014, 0x0000b821, 0x00431023, - 0x044001ec, 0x0000b021, 0x32820010, 0x1040002e, 0x3c026000, 0x9363003f, - 0x9222000e, 0x10430006, 0x2402000c, 0x9223000f, 0x10620003, 0x24020014, - 0x14620025, 0x3c026000, 0x32820004, 0x10400007, 0x241e0001, 0x8f620050, - 0x24420001, 0xaf620050, 0x8f630054, 0x24630001, 0xaf630054, 0x32830102, - 0x24020002, 0x5462000d, 0x9222000f, 0x8f620040, 0x24420001, 0xaf620040, - 0x8f630048, 0x8f620040, 0x24630001, 0x54620005, 0x9222000f, 0x8f620048, - 0x24420001, 0xaf620048, 0x9222000f, 0xa362003f, 0x9223000f, 0x24020012, - 0x14620007, 0x3c026000, 0x3c030800, 0x8c620074, 0x24420001, 0x0e000f6e, - 0xac620074, 0x3c026000, 0x8c434448, 0x32820040, 0xaf630174, 0x32830020, - 0xafa30010, 0x32830080, 0xafa30014, 0x32830001, 0xafa3001c, 0x32830008, - 0xafa30020, 0x32830100, 0x104000bb, 0xafa30018, 0x8e260010, 0x8f630054, - 0x24c2ffff, 0x00431023, 0x18400006, 0x00000000, 0x0000000d, 0x00000000, - 0x24000128, 0x0a0006b2, 0x00009021, 0x8f62004c, 0x00c21023, 0x18400028, - 0x00009021, 0x93650120, 0x93640121, 0x3c030800, 0x8c62008c, 0x308400ff, - 0x24420001, 0x30a500ff, 0x00804021, 0x1485000b, 0xac62008c, 0x3c040800, - 0x8c830090, 0x24630001, 0xac830090, 0x93620122, 0x30420001, 0x00021023, - 0x30420005, 0x0a0006b2, 0x34520004, 0x27670100, 0x00041080, 0x00e21021, - 0x8c430000, 0x00c31823, 0x04600004, 0x24820001, 0x30440007, 0x1485fff9, - 0x00041080, 0x10880007, 0x3c030800, 0xa3640121, 0x8c620094, 0x24120005, - 0x24420001, 0x0a0006b2, 0xac620094, 0x24120004, 0x32420001, 0x10400020, - 0x3c020800, 0x8c430020, 0x8e300000, 0x1060001c, 0x8e330010, 0x0e001006, - 0x00000000, 0x8f820018, 0xac500000, 0x8f840018, 0x24020001, 0xac820004, - 0x8f830018, 0xac600008, 0x8f820018, 0xac40000c, 0x8f830018, 0xac600010, - 0x8f820018, 0xac530014, 0x8f850018, 0x3c026000, 0x8c434448, 0x24040001, - 0x3c020800, 0xaca30018, 0x9443466e, 0x8f850018, 0x3c024010, 0x00621825, - 0x0e001044, 0xaca3001c, 0x32420004, 0x10400060, 0x00003821, 0x3c029000, - 0x8e260010, 0x34420001, 0x3c038000, 0x02a21025, 0xa360007c, 0xaf420020, - 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x93620023, 0x30420080, - 0x10400011, 0x00000000, 0x8f65005c, 0x8f63004c, 0x9764003c, 0x8f620064, - 0x00a32823, 0x00852821, 0x00a2102b, 0x54400006, 0x3c023fff, 0x93620023, - 0x3042007f, 0xa3620023, 0xaf660064, 0x3c023fff, 0x0a000702, 0x3442ffff, - 0x8f62005c, 0x00c21023, 0x04400011, 0x00000000, 0x8f65005c, 0x8f630064, - 0x9764003c, 0x3c023fff, 0x3442ffff, 0xaf660064, 0x00a32823, 0x00852821, - 0x0045102b, 0x10400004, 0x00c51021, 0x3c053fff, 0x34a5ffff, 0x00c51021, - 0xaf62005c, 0x24070001, 0xaf66004c, 0x8f620054, 0x14c20005, 0x00000000, - 0x93620023, 0x30420040, 0x10400017, 0x24020001, 0x9762006a, 0x00022880, - 0x50a00001, 0x24050001, 0x97630068, 0x93640081, 0x3c020800, 0x8c46004c, - 0x00652821, 0x00852804, 0x00c5102b, 0x54400001, 0x00a03021, 0x3c020800, - 0x8c440050, 0x00c4182b, 0x54600001, 0x00c02021, 0x8f420074, 0x2403fffe, - 0x00832824, 0x00a21021, 0xaf62000c, 0x3c028000, 0x34420001, 0x02a21025, - 0xa3600081, 0xaf420020, 0x9363007e, 0x9362007a, 0x10620005, 0x00e0b021, - 0x0e000f2a, 0x00000000, 0x00403821, 0x00e0b021, 0x8fa20010, 0x10400008, - 0x00000000, 0x8e220018, 0xaf620018, 0x8e23001c, 0xaf63001c, 0x8e220020, - 0x24160001, 0xaf620058, 0x13c00036, 0x32820004, 0x10400035, 0x8fa30014, - 0x93620023, 0x30420040, 0x10400031, 0x3c020800, 0x8c430020, 0x1060001c, - 0x8e300000, 0x0e001006, 0x00000000, 0x8f820018, 0xac500000, 0x8f830018, - 0xac600004, 0x8f820018, 0xac400008, 0x8f830018, 0xac60000c, 0x8f820018, - 0xac400010, 0x8f830018, 0x24020587, 0xac620014, 0x8f850018, 0x3c026000, - 0x8c434448, 0x24040001, 0x3c020800, 0xaca30018, 0x9443466e, 0x8f850018, - 0x3c024019, 0x00621825, 0x0e001044, 0xaca3001c, 0x3c029000, 0x34420001, - 0x02a21025, 0xaf420020, 0x3c038000, 0x8f420020, 0x00431024, 0x1440fffd, - 0x24020001, 0xaf62000c, 0x93630023, 0x3c028000, 0x34420001, 0x02a21025, - 0x306300bf, 0xa3630023, 0xaf420020, 0x8fa30014, 0x10600012, 0x8fa3001c, - 0x9362007c, 0x24420001, 0xa362007c, 0x9363007e, 0x9362007a, 0x1462000b, - 0x8fa3001c, 0x9362007c, 0x3c030800, 0x8c640024, 0x0044102b, 0x14400005, - 0x8fa3001c, 0x0e000f2a, 0x00000000, 0x02c2b025, 0x8fa3001c, 0x3062ffff, - 0x10400003, 0x32820200, 0x0a000793, 0x24170004, 0x10400003, 0x00000000, - 0x24170040, 0x24160001, 0x13c0005d, 0x32820002, 0x1040005c, 0x8fa20020, - 0x9222000a, 0x30420020, 0x10400033, 0x3c100800, 0x93620023, 0x30420040, - 0x1040002f, 0x8e020020, 0x1040001e, 0x3c029000, 0x0e001006, 0x00000000, - 0x8f820018, 0xac550000, 0x8f840018, 0x3c02008d, 0xac820004, 0x8f830018, - 0xac600008, 0x8f820018, 0xac40000c, 0x8f830018, 0xac600010, 0x8f840018, - 0x240205bf, 0xac820014, 0x8f850018, 0x3c026000, 0x8c434448, 0x24040001, - 0x3c020800, 0xaca30018, 0x9443466e, 0x8f850018, 0x3c024019, 0x00621825, - 0x0e001044, 0xaca3001c, 0x3c029000, 0x34420001, 0x02a21025, 0xaf420020, - 0x3c038000, 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x93630023, - 0x3c028000, 0x34420001, 0x02a21025, 0x306300bf, 0xa3630023, 0xaf420020, - 0x8e020020, 0x10400023, 0x8fa20020, 0x0e001006, 0x00000000, 0x8f840018, - 0x8e230000, 0xac830000, 0x9222000a, 0x8f830018, 0x00021600, 0xac620004, - 0x8f840018, 0x8f620040, 0xac820008, 0x8f850018, 0x8f63004c, 0xaca3000c, - 0x9362003f, 0x8f840018, 0x304200ff, 0xac820010, 0x8f830018, 0x3c026000, - 0xac600014, 0x8f850018, 0x8c434448, 0x24040001, 0x3c020800, 0xaca30018, - 0x9443466e, 0x8f850018, 0x3c02401a, 0x00621825, 0x0e001044, 0xaca3001c, - 0x8fa20020, 0x1040000e, 0x8fa20018, 0x9222000a, 0xa3620082, 0x56e00005, - 0x36f70008, 0x8fa30018, 0x10600004, 0x00000000, 0x36f70008, 0x0a000801, - 0x24160001, 0x0e000de1, 0x02a02021, 0x8fa20018, 0x10400003, 0x00000000, - 0x36f70010, 0x24160001, 0x12c00019, 0x3c029000, 0x34420001, 0x02a21025, - 0xaf420020, 0x3c038000, 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, - 0x3c038000, 0x9362007d, 0x34630001, 0x3c048000, 0x02a31825, 0x02e21025, - 0xa362007d, 0xaf430020, 0x8f4201f8, 0x00441024, 0x1440fffd, 0x24020002, - 0x3c031000, 0xaf5501c0, 0xa34201c4, 0xaf4301f8, 0x9363003f, 0x24020012, - 0x14620004, 0x3c026000, 0x0e000f6e, 0x00000000, 0x3c026000, 0x8c434448, - 0xaf630178, 0x8fbf004c, 0x8fbe0048, 0x8fb70044, 0x8fb60040, 0x8fb5003c, - 0x8fb40038, 0x8fb30034, 0x8fb20030, 0x8fb1002c, 0x8fb00028, 0x03e00008, - 0x27bd0050, 0x27bdffe8, 0xafbf0014, 0xafb00010, 0x8f500180, 0x97420184, - 0x30420200, 0x14400015, 0x00000000, 0x8f430188, 0x3c02ff00, 0x00621824, - 0x3c020200, 0x10620031, 0x0043102b, 0x14400007, 0x3c020300, 0x1060000b, - 0x3c020100, 0x1062000d, 0x00000000, 0x0a0008b4, 0x00000000, 0x10620027, - 0x3c020400, 0x1062003e, 0x02002021, 0x0a0008b4, 0x00000000, 0x0e000e1e, - 0x02002021, 0x0a0008b6, 0x8fbf0014, 0x93620005, 0x30420020, 0x1440005e, - 0x8fbf0014, 0x3c029000, 0x34420001, 0x02021025, 0xaf420020, 0x3c038000, - 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x93620005, 0x3c038000, - 0x34630001, 0x02031825, 0x34420020, 0xa3620005, 0xaf430020, 0x93620005, - 0x30420020, 0x14400003, 0x02002021, 0x0000000d, 0x02002021, 0x0e000553, - 0x24055854, 0x0a0008b6, 0x8fbf0014, 0x93620005, 0x30420001, 0x1040003f, - 0x3c029000, 0x34420001, 0x02021025, 0xaf420020, 0x3c038000, 0x8f420020, - 0x00431024, 0x1440fffd, 0x00000000, 0x93620005, 0x3c048000, 0x3c030800, - 0x304200fe, 0xa3620005, 0x8c620020, 0x34840001, 0x02042025, 0xaf440020, - 0x1040002d, 0x8fbf0014, 0x0a000894, 0x00000000, 0x00002821, 0x00003021, - 0x0e000f78, 0x240706a4, 0x3c020800, 0x8c430020, 0x10600023, 0x8fbf0014, - 0x0e001006, 0x00000000, 0x8f820018, 0xac500000, 0x93630082, 0x9362003f, - 0x8f840018, 0x00031a00, 0x00431025, 0xac820004, 0x8f830018, 0xac600008, - 0x8f820018, 0xac40000c, 0x8f830018, 0xac600010, 0x8f820018, 0xac400014, - 0x8f850018, 0x3c026000, 0x8c434448, 0x24040001, 0x3c020800, 0xaca30018, - 0x9443466e, 0x8f850018, 0x3c02400a, 0x00621825, 0x0e001044, 0xaca3001c, - 0x0a0008b6, 0x8fbf0014, 0x0000000d, 0x8fbf0014, 0x8fb00010, 0x03e00008, - 0x27bd0018, 0x27bdffe8, 0xafbf0010, 0x93420148, 0x2444ffff, 0x2c830005, - 0x10600047, 0x3c020800, 0x24424598, 0x00041880, 0x00621821, 0x8c640000, - 0x00800008, 0x00000000, 0x8f430144, 0x8f62000c, 0x14620006, 0x24020001, - 0xaf62000c, 0x0e000909, 0x00000000, 0x0a000907, 0x8fbf0010, 0x8f62000c, - 0x0a000900, 0x00000000, 0x97630010, 0x8f420144, 0x14430006, 0x24020001, - 0xa7620010, 0x0e000eeb, 0x00000000, 0x0a000907, 0x8fbf0010, 0x97620010, - 0x0a000900, 0x00000000, 0x97630012, 0x8f420144, 0x14430006, 0x24020001, - 0xa7620012, 0x0e000f06, 0x00000000, 0x0a000907, 0x8fbf0010, 0x97620012, - 0x0a000900, 0x00000000, 0x97630014, 0x8f420144, 0x14430006, 0x24020001, - 0xa7620014, 0x0e000f21, 0x00000000, 0x0a000907, 0x8fbf0010, 0x97620014, - 0x0a000900, 0x00000000, 0x97630016, 0x8f420144, 0x14430006, 0x24020001, - 0xa7620016, 0x0e000f24, 0x00000000, 0x0a000907, 0x8fbf0010, 0x97620016, - 0x14400006, 0x8fbf0010, 0x3c030800, 0x8c620070, 0x24420001, 0xac620070, - 0x8fbf0010, 0x03e00008, 0x27bd0018, 0x27bdffe8, 0xafbf0010, 0x93620081, - 0x3c030800, 0x8c640048, 0x0044102b, 0x14400028, 0x3c029000, 0x8f460140, - 0x34420001, 0x3c038000, 0x00c21025, 0xaf420020, 0x8f420020, 0x00431024, - 0x1440fffd, 0x3c048000, 0x34840001, 0x3c059000, 0x34a50001, 0x3c078000, - 0x24020012, 0x24030080, 0x00c42025, 0x00c52825, 0xa362003f, 0xa3630082, - 0xaf440020, 0xaf450020, 0x8f420020, 0x00471024, 0x1440fffd, 0x3c038000, - 0x9362007d, 0x34630001, 0x3c048000, 0x00c31825, 0x34420020, 0xa362007d, - 0xaf430020, 0x8f4201f8, 0x00441024, 0x1440fffd, 0x24020002, 0x3c031000, - 0x0a00096d, 0xaf4601c0, 0x93620081, 0x24420001, 0x0e000f2a, 0xa3620081, - 0x9763006a, 0x00032880, 0x14a00002, 0x00403821, 0x24050001, 0x97630068, - 0x93640081, 0x3c020800, 0x8c46004c, 0x00652821, 0x00852804, 0x00c5102b, - 0x54400001, 0x00a03021, 0x3c020800, 0x8c440050, 0x00c4182b, 0x54600001, - 0x00c02021, 0x8f420074, 0x2403fffe, 0x00832824, 0x00a21021, 0xaf62000c, - 0x10e0001a, 0x3c029000, 0x8f440140, 0x34420001, 0x3c038000, 0x00821025, - 0xaf420020, 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x3c038000, - 0x9362007d, 0x34630001, 0x3c058000, 0x00831825, 0x34420004, 0xa362007d, - 0xaf430020, 0x8f4201f8, 0x00451024, 0x1440fffd, 0x24020002, 0x3c031000, - 0xaf4401c0, 0xa34201c4, 0xaf4301f8, 0x8fbf0010, 0x03e00008, 0x27bd0018, - 0x27bdffd8, 0xafb3001c, 0x27530100, 0xafbf0024, 0xafb40020, 0xafb20018, - 0xafb10014, 0xafb00010, 0x96620008, 0x3c140800, 0x8f520100, 0x30420001, - 0x104000cf, 0x00000000, 0x8e700018, 0x8f630054, 0x2602ffff, 0x00431023, - 0x18400006, 0x00000000, 0x0000000d, 0x00000000, 0x24000128, 0x0a0009b6, - 0x00008821, 0x8f62004c, 0x02021023, 0x18400028, 0x00008821, 0x93650120, - 0x93640121, 0x3c030800, 0x8c62008c, 0x308400ff, 0x24420001, 0x30a500ff, - 0x00803821, 0x1485000b, 0xac62008c, 0x3c040800, 0x8c830090, 0x24630001, - 0xac830090, 0x93620122, 0x30420001, 0x00021023, 0x30420005, 0x0a0009b6, - 0x34510004, 0x27660100, 0x00041080, 0x00c21021, 0x8c430000, 0x02031823, - 0x04600004, 0x24820001, 0x30440007, 0x1485fff9, 0x00041080, 0x10870007, - 0x3c030800, 0xa3640121, 0x8c620094, 0x24110005, 0x24420001, 0x0a0009b6, - 0xac620094, 0x24110004, 0x32220001, 0x1040001e, 0x8e820020, 0x1040001d, - 0x32220004, 0x0e001006, 0x00000000, 0x8f820018, 0xac520000, 0x8f840018, - 0x24020001, 0xac820004, 0x8f830018, 0xac600008, 0x8f820018, 0xac40000c, - 0x8f830018, 0xac600010, 0x8f820018, 0xac500014, 0x8f850018, 0x3c026000, - 0x8c434448, 0x24040001, 0x3c020800, 0xaca30018, 0x9443466e, 0x8f850018, - 0x3c024010, 0x00621825, 0x0e001044, 0xaca3001c, 0x32220004, 0x10400076, - 0x00003821, 0x3c029000, 0x34420001, 0x3c038000, 0x02421025, 0xa360007c, - 0xaf420020, 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x93620023, - 0x30420080, 0x10400011, 0x00000000, 0x8f65005c, 0x8f63004c, 0x9764003c, - 0x8f620064, 0x00a32823, 0x00852821, 0x00a2102b, 0x54400006, 0x3c023fff, - 0x93620023, 0x3042007f, 0xa3620023, 0xaf700064, 0x3c023fff, 0x0a000a03, - 0x3442ffff, 0x8f62005c, 0x02021023, 0x04400011, 0x00000000, 0x8f65005c, - 0x8f630064, 0x9764003c, 0x3c023fff, 0x3442ffff, 0xaf700064, 0x00a32823, - 0x00852821, 0x0045102b, 0x10400004, 0x02051021, 0x3c053fff, 0x34a5ffff, - 0x02051021, 0xaf62005c, 0x24070001, 0xaf70004c, 0x8f620054, 0x16020005, - 0x00000000, 0x93620023, 0x30420040, 0x10400017, 0x24020001, 0x9762006a, - 0x00022880, 0x50a00001, 0x24050001, 0x97630068, 0x93640081, 0x3c020800, - 0x8c46004c, 0x00652821, 0x00852804, 0x00c5102b, 0x54400001, 0x00a03021, - 0x3c020800, 0x8c440050, 0x00c4182b, 0x54600001, 0x00c02021, 0x8f420074, - 0x2403fffe, 0x00832824, 0x00a21021, 0xaf62000c, 0x3c028000, 0x34420001, - 0x02421025, 0xa3600081, 0xaf420020, 0x9363007e, 0x9362007a, 0x10620004, - 0x00000000, 0x0e000f2a, 0x00000000, 0x00403821, 0x10e00017, 0x3c029000, - 0x34420001, 0x02421025, 0xaf420020, 0x3c038000, 0x8f420020, 0x00431024, - 0x1440fffd, 0x3c028000, 0x9363007d, 0x34420001, 0x3c048000, 0x02421025, - 0xa363007d, 0xaf420020, 0x8f4201f8, 0x00441024, 0x1440fffd, 0x24020002, - 0x3c031000, 0xaf5201c0, 0xa34201c4, 0xaf4301f8, 0x9342010b, 0x8e830020, - 0x27500100, 0x38420006, 0x10600029, 0x2c510001, 0x0e001006, 0x00000000, - 0x8f830018, 0x8e020000, 0xac620000, 0x8f840018, 0x96020008, 0xac820004, - 0x8f830018, 0x8e020014, 0xac620008, 0x8f850018, 0x3c026000, 0x8c434448, - 0xaca3000c, 0x8f840018, 0x96020012, 0xac820010, 0x8f850018, 0x8e030020, - 0xaca30014, 0x9602000c, 0x9603000e, 0x8f840018, 0x00021400, 0x00431025, - 0xac820018, 0x12200005, 0x3c020800, 0x9443466e, 0x8f840018, 0x0a000a78, - 0x3c024013, 0x9443466e, 0x8f840018, 0x3c024014, 0x00621825, 0xac83001c, - 0x0e001044, 0x24040001, 0x8e630014, 0x8f620040, 0x14430003, 0x00431023, - 0x0a000a83, 0x00001021, 0x28420001, 0x10400034, 0x00000000, 0x8f620040, - 0xaf630040, 0x9362003e, 0x30420001, 0x1440000b, 0x3c029000, 0x93620022, - 0x24420001, 0xa3620022, 0x93630022, 0x3c020800, 0x8c440098, 0x0064182b, - 0x1460001e, 0x3c020800, 0x3c029000, 0x34420001, 0x02421025, 0xaf420020, - 0x3c038000, 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x3c038000, - 0x9362007d, 0x34630001, 0x3c048000, 0x02431825, 0x34420001, 0xa362007d, - 0xaf430020, 0x8f4201f8, 0x00441024, 0x1440fffd, 0x24020002, 0x3c031000, - 0xaf5201c0, 0xa34201c4, 0x24020001, 0xaf4301f8, 0xa7620012, 0x0a000ab6, - 0xa3600022, 0x9743007a, 0x9444002a, 0x00641821, 0x3063fffe, 0xa7630012, - 0x0e000b68, 0x00000000, 0x97420108, 0x8fbf0024, 0x8fb40020, 0x8fb3001c, - 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x00021042, 0x30420001, 0x03e00008, - 0x27bd0028, 0x27bdffe0, 0xafb20018, 0x3c120800, 0x8e420020, 0xafb00010, - 0x27500100, 0xafbf001c, 0x10400046, 0xafb10014, 0x0e001006, 0x00000000, - 0x8f840018, 0x8e020000, 0xac820000, 0x936300b1, 0x936200c5, 0x8f850018, - 0x00031e00, 0x00021400, 0x34420100, 0x00621825, 0xaca30004, 0x8f840018, - 0x8e02001c, 0xac820008, 0x8f830018, 0x8f620048, 0xac62000c, 0x8f840018, - 0x96020012, 0xac820010, 0x8f830018, 0x8f620040, 0x24040001, 0xac620014, - 0x8f850018, 0x3c026000, 0x8c434448, 0x3c020800, 0x24514660, 0xaca30018, - 0x9623000e, 0x8f850018, 0x3c024016, 0x00621825, 0x0e001044, 0xaca3001c, - 0x96030008, 0x30630010, 0x1060001c, 0x8e420020, 0x1040001a, 0x8e100000, - 0x0e001006, 0x00000000, 0x8f820018, 0xac500000, 0x8f830018, 0xac600004, - 0x8f820018, 0xac400008, 0x8f830018, 0xac60000c, 0x8f820018, 0xac400010, - 0x8f830018, 0xac600014, 0x8f850018, 0x3c036000, 0x8c634448, 0x24040001, - 0xaca30018, 0x9622000e, 0x8f850018, 0x3c034015, 0x00431025, 0x0e001044, - 0xaca2001c, 0x00001021, 0x8fbf001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, - 0x03e00008, 0x27bd0020, 0x27bdffe0, 0xafb20018, 0x3c120800, 0x8e420020, - 0xafb00010, 0x27500100, 0xafbf001c, 0x10400041, 0xafb10014, 0x0e001006, - 0x00000000, 0x8f830018, 0x8e020000, 0xac620000, 0x8f840018, 0x24020100, - 0xac820004, 0x8f830018, 0x8e02001c, 0xac620008, 0x8f840018, 0x8e020018, - 0xac82000c, 0x8f830018, 0x96020012, 0xac620010, 0x8f840018, 0x96020008, - 0xac820014, 0x8f850018, 0x3c026000, 0x8c434448, 0x24040001, 0x3c020800, - 0x24514660, 0xaca30018, 0x9623000e, 0x8f850018, 0x3c024017, 0x00621825, - 0x0e001044, 0xaca3001c, 0x96030008, 0x30630010, 0x1060001c, 0x8e420020, - 0x1040001a, 0x8e100000, 0x0e001006, 0x00000000, 0x8f820018, 0xac500000, - 0x8f830018, 0xac600004, 0x8f820018, 0xac400008, 0x8f830018, 0xac60000c, - 0x8f820018, 0xac400010, 0x8f830018, 0xac600014, 0x8f850018, 0x3c036000, - 0x8c634448, 0x24040001, 0xaca30018, 0x9622000e, 0x8f850018, 0x3c034015, - 0x00431025, 0x0e001044, 0xaca2001c, 0x00001021, 0x8fbf001c, 0x8fb20018, - 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020, 0x27bdffe8, 0xafbf0010, - 0x936200c4, 0x30420002, 0x10400019, 0x00000000, 0x936200c5, 0x936300b1, - 0x00431023, 0x304400ff, 0x30830080, 0x10600004, 0x00000000, 0x0000000d, - 0x00000000, 0x24000a6a, 0x93620004, 0x00441023, 0x304400ff, 0x30830080, - 0x10600004, 0x2482ffff, 0x8f650024, 0x0a000b82, 0x00000000, 0x00022b00, - 0x8f620024, 0x0045102b, 0x10400002, 0x00000000, 0x8f650024, 0x8f620048, - 0x8f630040, 0x00431823, 0x0065202b, 0x10800004, 0x00000000, 0x8f620040, - 0x00451021, 0xaf620048, 0x9762003c, 0x0062102b, 0x10400041, 0x8fbf0010, - 0x10a0003f, 0x3c029000, 0x34420001, 0x3c040800, 0x8c830080, 0x8f450100, - 0x3c068000, 0x24630001, 0x00a21025, 0xac830080, 0xaf420020, 0x8f420020, - 0x00461024, 0x1440fffd, 0x3c038000, 0x9362007d, 0x34630001, 0x3c048000, - 0x00a31825, 0x34420004, 0xa362007d, 0xaf430020, 0x8f4201f8, 0x00441024, - 0x1440fffd, 0x24020002, 0x3c030800, 0xaf4501c0, 0xa34201c4, 0x8c640020, - 0x3c021000, 0xaf4201f8, 0x1080001f, 0x8fbf0010, 0x0e001006, 0x00000000, - 0x8f830018, 0x8f420100, 0xac620000, 0x8f840018, 0x8f620040, 0xac820004, - 0x8f850018, 0x8f620048, 0xaca20008, 0x8f830018, 0xac60000c, 0x8f820018, - 0xac400010, 0x8f830018, 0x3c026000, 0xac600014, 0x8f840018, 0x8c434448, - 0x3c020800, 0xac830018, 0x9443466e, 0x8f840018, 0x3c0240c2, 0x00621825, - 0xac83001c, 0x0e001044, 0x24040001, 0x8fbf0010, 0x03e00008, 0x27bd0018, - 0x3c020800, 0x24423958, 0xaf82000c, 0x03e00008, 0x00000000, 0x27bdffe8, - 0xafb00010, 0x27500100, 0xafbf0014, 0x8e02001c, 0x14400003, 0x3c020800, - 0x0000000d, 0x3c020800, 0x8c430020, 0x10600026, 0x00001021, 0x0e001006, - 0x00000000, 0x8f830018, 0x8e020000, 0xac620000, 0x8f840018, 0x8e02001c, - 0xac820004, 0x8f830018, 0xac600008, 0x8f840018, 0x8e020018, 0xac82000c, - 0x8f850018, 0x96020012, 0xaca20010, 0x8f830018, 0x3c106000, 0xac600014, - 0x8f840018, 0x8e024448, 0x3c030800, 0xac820018, 0x9462466e, 0x8f840018, - 0x3c034012, 0x00431025, 0xac82001c, 0x0e001044, 0x24040001, 0x8e036800, - 0x00001021, 0x3c040001, 0x00641825, 0xae036800, 0x0a000c0d, 0x8fbf0014, - 0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, 0x3c020800, 0x97430078, - 0x9444002e, 0x00001021, 0x00641821, 0x3063fffe, 0x03e00008, 0xa7630010, - 0x27450100, 0x8f640048, 0x8ca30018, 0x00641023, 0x18400021, 0x00000000, - 0xaf630048, 0x8f620040, 0x9763003c, 0x00821023, 0x0043102a, 0x1040001a, - 0x3c029000, 0x8ca40000, 0x34420001, 0x3c038000, 0x00821025, 0xaf420020, - 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x3c038000, 0x9362007d, - 0x34630001, 0x3c058000, 0x00831825, 0x34420004, 0xa362007d, 0xaf430020, - 0x8f4201f8, 0x00451024, 0x1440fffd, 0x24020002, 0x3c031000, 0xaf4401c0, - 0xa34201c4, 0xaf4301f8, 0x03e00008, 0x00001021, 0x8f420100, 0x34420001, - 0xaf4200a4, 0x03e00008, 0x00001021, 0x27bdffe0, 0xafbf0018, 0xafb10014, - 0xafb00010, 0x9362007e, 0x30d000ff, 0x16020029, 0x00808821, 0x93620080, - 0x16020026, 0x00000000, 0x9362007f, 0x16020023, 0x00000000, 0x9362007a, - 0x16020004, 0x00000000, 0x0000000d, 0x00000000, 0x24000771, 0x0e000f49, - 0x00000000, 0x3c039000, 0x34630001, 0x3c048000, 0x02231825, 0xa370007a, - 0xaf430020, 0x8f420020, 0x00441024, 0x1440fffd, 0x3c028000, 0x9363007d, - 0x34420001, 0x3c048000, 0x02221025, 0xa363007d, 0xaf420020, 0x8f4201f8, - 0x00441024, 0x1440fffd, 0x24020002, 0x3c031000, 0xaf5101c0, 0xa34201c4, - 0xaf4301f8, 0x0a000c79, 0x8fbf0018, 0x0000000d, 0x00000000, 0x24000781, - 0x8fbf0018, 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020, 0x3c020800, - 0x8c430020, 0x27bdffe8, 0xafb00010, 0x27500100, 0x10600024, 0xafbf0014, - 0x0e001006, 0x00000000, 0x8f830018, 0x8e020000, 0xac620000, 0x8f840018, - 0x8e020004, 0xac820004, 0x8f830018, 0x8e020018, 0xac620008, 0x8f840018, - 0x8e03001c, 0xac83000c, 0x9602000c, 0x9203000a, 0x8f840018, 0x00021400, - 0x00431025, 0xac820010, 0x8f830018, 0x3c026000, 0xac600014, 0x8f840018, - 0x8c434448, 0xac830018, 0x96020008, 0x3c030800, 0x9464466e, 0x8f850018, - 0x00021400, 0x00441025, 0x24040001, 0x0e001044, 0xaca2001c, 0x8fbf0014, - 0x8fb00010, 0x03e00008, 0x27bd0018, 0x3c020800, 0x8c430020, 0x27bdffe8, - 0xafb00010, 0x27500100, 0x10600020, 0xafbf0014, 0x0e001006, 0x00000000, - 0x8f820018, 0xac400000, 0x8f830018, 0xac600004, 0x8f820018, 0xac400008, - 0x8f830018, 0xac60000c, 0x9602000c, 0x9603000e, 0x8f840018, 0x00021400, - 0x00431025, 0xac820010, 0x8f830018, 0x3c026000, 0xac600014, 0x8f840018, - 0x8c434448, 0xac830018, 0x96020008, 0x3c030800, 0x9464466e, 0x8f850018, - 0x00021400, 0x00441025, 0x24040001, 0x0e001044, 0xaca2001c, 0x8fbf0014, - 0x8fb00010, 0x03e00008, 0x27bd0018, 0x27bdffe8, 0xafb00010, 0x27500100, - 0xafbf0014, 0x9602000c, 0x10400024, 0x00802821, 0x3c020800, 0x8c430020, - 0x1060003a, 0x8fbf0014, 0x0e001006, 0x00000000, 0x8f840018, 0x8e030000, - 0xac830000, 0x9602000c, 0x8f840018, 0x00021400, 0xac820004, 0x8f830018, - 0xac600008, 0x8f820018, 0xac40000c, 0x8f830018, 0xac600010, 0x8f820018, - 0xac400014, 0x8f850018, 0x3c026000, 0x8c434448, 0x24040001, 0x3c020800, - 0xaca30018, 0x9443466e, 0x8f850018, 0x3c02400b, 0x00621825, 0x0e001044, - 0xaca3001c, 0x0a000d19, 0x8fbf0014, 0x93620005, 0x30420010, 0x14400015, - 0x3c029000, 0x34420001, 0x00a21025, 0xaf420020, 0x3c038000, 0x8f420020, - 0x00431024, 0x1440fffd, 0x00000000, 0x3c038000, 0x93620005, 0x34630001, - 0x00a02021, 0x00a31825, 0x24055852, 0x34420010, 0xa3620005, 0x0e000553, - 0xaf430020, 0x0a000d19, 0x8fbf0014, 0x0000000d, 0x8fbf0014, 0x8fb00010, - 0x03e00008, 0x27bd0018, 0x3c020800, 0x8c430020, 0x27bdffe8, 0xafb00010, - 0x27500100, 0x10600022, 0xafbf0014, 0x0e001006, 0x00000000, 0x8f840018, - 0x8e020004, 0xac820000, 0x9603000c, 0x9762002c, 0x8f840018, 0x00031c00, - 0x00431025, 0xac820004, 0x8f830018, 0xac600008, 0x8f820018, 0xac40000c, - 0x8f830018, 0xac600010, 0x8f820018, 0xac400014, 0x8f850018, 0x3c026000, - 0x8c434448, 0x24040001, 0x3c020800, 0xaca30018, 0x9443466e, 0x8f850018, - 0x3c02400e, 0x00621825, 0x0e001044, 0xaca3001c, 0x0e000d48, 0x8e040000, - 0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, 0x3c038000, 0x8f420278, - 0x00431024, 0x1440fffd, 0x24020002, 0x3c031000, 0xaf440240, 0xa3420244, - 0x03e00008, 0xaf430278, 0x3c020800, 0x8c430020, 0x27bdffe0, 0xafb10014, - 0x00808821, 0xafb20018, 0x00c09021, 0xafb00010, 0x30b0ffff, 0x1060001c, - 0xafbf001c, 0x0e001006, 0x00000000, 0x8f820018, 0xac510000, 0x8f840018, - 0x00101400, 0xac820004, 0x8f830018, 0xac600008, 0x8f820018, 0xac40000c, - 0x8f830018, 0xac600010, 0x8f820018, 0xac520014, 0x8f840018, 0x3c026000, - 0x8c434448, 0x3c020800, 0xac830018, 0x9443466e, 0x8f840018, 0x3c024019, - 0x00621825, 0xac83001c, 0x0e001044, 0x24040001, 0x8fbf001c, 0x8fb20018, - 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020, 0x27bdffe8, 0x27450100, - 0xafbf0010, 0x94a3000c, 0x240200c1, 0x14620029, 0x00803021, 0x3c029000, - 0x34420001, 0x00c21025, 0xaf420020, 0x3c038000, 0x8f420020, 0x00431024, - 0x1440fffd, 0x3c028000, 0x34420001, 0x3c049000, 0x34840001, 0x3c058000, - 0x24030012, 0x00c21025, 0x00c42025, 0xa363003f, 0xaf420020, 0xaf440020, - 0x8f420020, 0x00451024, 0x1440fffd, 0x3c038000, 0x9362007d, 0x34630001, - 0x3c048000, 0x00c31825, 0x34420020, 0xa362007d, 0xaf430020, 0x8f4201f8, - 0x00441024, 0x1440fffd, 0x24020002, 0x3c031000, 0xaf4601c0, 0xa34201c4, - 0xaf4301f8, 0x0a000db3, 0x8fbf0010, 0x00c02021, 0x94a5000c, 0x24060001, - 0x0e000f78, 0x240706d8, 0x8fbf0010, 0x03e00008, 0x27bd0018, 0x3c020800, - 0x8c430020, 0x27bdffe0, 0xafb00010, 0x00808021, 0xafb20018, 0x00a09021, - 0xafb10014, 0x30d100ff, 0x1060001c, 0xafbf001c, 0x0e001006, 0x00000000, - 0x8f820018, 0xac500000, 0x8f840018, 0x24020001, 0xac820004, 0x8f830018, - 0xac600008, 0x8f820018, 0xac40000c, 0x8f830018, 0xac600010, 0x8f820018, - 0xac520014, 0x8f840018, 0x3c026000, 0x8c434448, 0x3c020800, 0xac830018, - 0x9443466e, 0x8f840018, 0x3c024010, 0x00621825, 0xac83001c, 0x0e001044, - 0x02202021, 0x8fbf001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x03e00008, - 0x27bd0020, 0x27bdffe8, 0xafbf0014, 0xafb00010, 0x93620005, 0x30420001, - 0x10400033, 0x00808021, 0x3c029000, 0x34420001, 0x02021025, 0xaf420020, - 0x3c038000, 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x93620005, - 0x3c048000, 0x3c030800, 0x304200fe, 0xa3620005, 0x8c620020, 0x34840001, - 0x02042025, 0xaf440020, 0x10400020, 0x8fbf0014, 0x0e001006, 0x00000000, - 0x8f820018, 0xac500000, 0x93630082, 0x9362003f, 0x8f840018, 0x00031a00, - 0x00431025, 0xac820004, 0x8f830018, 0xac600008, 0x8f820018, 0xac40000c, - 0x8f830018, 0xac600010, 0x8f820018, 0xac400014, 0x8f840018, 0x3c026000, - 0x8c434448, 0x3c020800, 0xac830018, 0x9443466e, 0x8f840018, 0x3c02400a, - 0x00621825, 0xac83001c, 0x0e001044, 0x24040001, 0x8fbf0014, 0x8fb00010, - 0x03e00008, 0x27bd0018, 0x27bdffe8, 0xafbf0010, 0x8f420188, 0x00803021, - 0x9364003f, 0x24030012, 0x00021402, 0x1483001c, 0x304500ff, 0x3c029000, - 0x34420001, 0x3c038000, 0x00c21025, 0xa3650080, 0xa365007a, 0xaf420020, - 0x8f420020, 0x00431024, 0x1440fffd, 0x3c028000, 0x9363007d, 0x34420001, - 0x3c048000, 0x00c21025, 0xa363007d, 0xaf420020, 0x8f4201f8, 0x00441024, - 0x1440fffd, 0x24020002, 0x3c031000, 0xaf4601c0, 0xa34201c4, 0xaf4301f8, - 0x0a000e54, 0x8fbf0010, 0x9362007e, 0x1445000e, 0x00000000, 0x93620080, - 0x1045000b, 0x00000000, 0xa3650080, 0x8f820000, 0x93660080, 0x8f440180, - 0x8f65004c, 0x8c430000, 0x0060f809, 0x00000000, 0x0a000e54, 0x8fbf0010, - 0xa3650080, 0x8fbf0010, 0x03e00008, 0x27bd0018, 0x3c020800, 0x8c430020, - 0x27bdffe0, 0xafb10014, 0x00808821, 0xafb20018, 0x00a09021, 0xafb00010, - 0x30d000ff, 0x1060002f, 0xafbf001c, 0x0e001006, 0x00000000, 0x8f820018, - 0xac510000, 0x8f830018, 0xac700004, 0x8f820018, 0xac520008, 0x8f830018, - 0xac60000c, 0x8f820018, 0xac400010, 0x9763006a, 0x00032880, 0x50a00001, - 0x24050001, 0x97630068, 0x93640081, 0x3c020800, 0x8c46004c, 0x00652821, - 0x00852804, 0x00c5102b, 0x54400001, 0x00a03021, 0x3c020800, 0x8c440050, - 0x00c4182b, 0x54600001, 0x00c02021, 0x8f830018, 0x2402fffe, 0x00822824, - 0x3c026000, 0xac650014, 0x8f840018, 0x8c434448, 0x3c020800, 0xac830018, - 0x9443466e, 0x8f840018, 0x3c024011, 0x00621825, 0xac83001c, 0x0e001044, - 0x24040001, 0x8fbf001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x03e00008, - 0x27bd0020, 0x27bdffe8, 0xafbf0014, 0xafb00010, 0x8f440100, 0x27500100, - 0x8f650050, 0x0e000c45, 0x9206001b, 0x3c020800, 0x8c430020, 0x1060001d, - 0x8e100018, 0x0e001006, 0x00000000, 0x8f840018, 0x8f420100, 0xac820000, - 0x8f830018, 0xac700004, 0x8f840018, 0x8f620050, 0xac820008, 0x8f830018, - 0xac60000c, 0x8f820018, 0xac400010, 0x8f830018, 0x3c026000, 0xac600014, - 0x8f850018, 0x8c434448, 0x24040001, 0x3c020800, 0xaca30018, 0x9443466e, - 0x8f850018, 0x3c02401c, 0x00621825, 0x0e001044, 0xaca3001c, 0x8fbf0014, - 0x8fb00010, 0x03e00008, 0x27bd0018, 0x3c029000, 0x8f460140, 0x34420001, - 0x3c038000, 0x00c21025, 0xaf420020, 0x8f420020, 0x00431024, 0x1440fffd, - 0x3c048000, 0x34840001, 0x3c059000, 0x34a50001, 0x3c078000, 0x24020012, - 0x24030080, 0x00c42025, 0x00c52825, 0xa362003f, 0xa3630082, 0xaf440020, - 0xaf450020, 0x8f420020, 0x00471024, 0x1440fffd, 0x3c038000, 0x9362007d, - 0x34630001, 0x3c048000, 0x00c31825, 0x34420020, 0xa362007d, 0xaf430020, - 0x8f4201f8, 0x00441024, 0x1440fffd, 0x24020002, 0x3c031000, 0xaf4601c0, - 0xa34201c4, 0x03e00008, 0xaf4301f8, 0x8f430238, 0x3c020800, 0x04610013, - 0x8c44009c, 0x2406fffe, 0x3c050800, 0x3c038000, 0x2484ffff, 0x14800009, - 0x00000000, 0x97420078, 0x8ca3007c, 0x24420001, 0x00461024, 0x24630001, - 0xa7620010, 0x03e00008, 0xaca3007c, 0x8f420238, 0x00431024, 0x1440fff3, - 0x2484ffff, 0x8f420140, 0x3c031000, 0xaf420200, 0x03e00008, 0xaf430238, - 0x3c029000, 0x8f440140, 0x34420001, 0x3c038000, 0x00821025, 0xaf420020, - 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x3c038000, 0x9362007d, - 0x34630001, 0x3c058000, 0x00831825, 0x34420001, 0xa362007d, 0xaf430020, - 0x8f4201f8, 0x00451024, 0x1440fffd, 0x24020002, 0x3c031000, 0xaf4401c0, - 0xa34201c4, 0x03e00008, 0xaf4301f8, 0x0000000d, 0x03e00008, 0x00000000, - 0x0000000d, 0x03e00008, 0x00000000, 0x24020001, 0x03e00008, 0xa7620010, - 0x9362003f, 0x304400ff, 0x3883000e, 0x2c630001, 0x38820010, 0x2c420001, - 0x00621825, 0x14600003, 0x24020012, 0x14820003, 0x00000000, 0x03e00008, - 0x00001021, 0x9363007e, 0x9362007a, 0x14620006, 0x00000000, 0x9363007e, - 0x24020001, 0x24630001, 0x03e00008, 0xa363007e, 0x9363007e, 0x93620080, - 0x14620004, 0x24020001, 0xa362000b, 0x03e00008, 0x24020001, 0x03e00008, - 0x00001021, 0x9362000b, 0x10400021, 0x00001021, 0xa360000b, 0x9362003f, - 0x304400ff, 0x3883000e, 0x2c630001, 0x38820010, 0x2c420001, 0x00621825, - 0x14600015, 0x00001821, 0x24020012, 0x10820012, 0x00000000, 0x9363007e, - 0x9362007a, 0x14620007, 0x00000000, 0x9362007e, 0x24030001, 0x24420001, - 0xa362007e, 0x03e00008, 0x00601021, 0x9363007e, 0x93620080, 0x14620004, - 0x00001821, 0x24020001, 0xa362000b, 0x24030001, 0x03e00008, 0x00601021, - 0x03e00008, 0x00000000, 0x24040001, 0xaf64000c, 0x8f6300dc, 0x8f6200cc, - 0x50620001, 0xa7640010, 0xa7640012, 0xa7640014, 0x03e00008, 0xa7640016, - 0x27bdffd8, 0xafb00010, 0x00808021, 0xafb3001c, 0x00c09821, 0xafbf0020, - 0xafb20018, 0xafb10014, 0x93620023, 0x00e09021, 0x30420040, 0x10400020, - 0x30b1ffff, 0x3c020800, 0x8c430020, 0x1060001c, 0x00000000, 0x0e001006, - 0x00000000, 0x8f820018, 0xac500000, 0x8f840018, 0x3c02008d, 0xac820004, - 0x8f830018, 0xac600008, 0x8f820018, 0xac40000c, 0x8f830018, 0xac600010, - 0x8f820018, 0xac520014, 0x8f850018, 0x3c026000, 0x8c434448, 0x24040001, - 0x3c020800, 0xaca30018, 0x9443466e, 0x8f850018, 0x3c024019, 0x00621825, - 0x0e001044, 0xaca3001c, 0x93620023, 0x30420020, 0x14400003, 0x3c020800, - 0x52600020, 0x3c029000, 0x8c430020, 0x1060001d, 0x3c029000, 0x0e001006, - 0x00000000, 0x8f820018, 0xac500000, 0x8f840018, 0x00111400, 0xac820004, - 0x8f830018, 0xac720008, 0x8f820018, 0xac40000c, 0x8f830018, 0xac600010, - 0x8f820018, 0xac400014, 0x8f850018, 0x3c026000, 0x8c434448, 0x24040001, - 0x3c020800, 0xaca30018, 0x9443466e, 0x8f850018, 0x3c02401b, 0x00621825, - 0x0e001044, 0xaca3001c, 0x3c029000, 0x34420001, 0x02021025, 0xaf420020, - 0x3c038000, 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x93630023, - 0x3c028000, 0x34420001, 0x02021025, 0x8fbf0020, 0x8fb3001c, 0x8fb20018, - 0x8fb10014, 0x8fb00010, 0x3063009f, 0xa3630023, 0xaf420020, 0x03e00008, - 0x27bd0028, 0x3c020800, 0x8c430020, 0x27bdffe8, 0xafb00010, 0x27500100, - 0x1060001d, 0xafbf0014, 0x0e001006, 0x00000000, 0x8f830018, 0x8e020004, - 0xac620000, 0x8f840018, 0x8e020018, 0xac820004, 0x8f850018, 0x8e020000, - 0xaca20008, 0x8f830018, 0xac60000c, 0x8f820018, 0xac400010, 0x8f830018, - 0xac600014, 0x8f820018, 0xac400018, 0x96030008, 0x3c020800, 0x9444466e, - 0x8f850018, 0x00031c00, 0x00641825, 0x24040001, 0x0e001044, 0xaca3001c, - 0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, 0x3c060800, 0x24c54660, - 0x3c02000a, 0x03421821, 0x94640006, 0x94a2000a, 0x00441023, 0x00021400, - 0x00021c03, 0x04610006, 0xa4a40006, 0x0000000d, 0x00000000, 0x2400005a, - 0x0a00101b, 0x24020001, 0x8f820014, 0x0062102b, 0x14400002, 0x00001021, - 0x24020001, 0x304200ff, 0x1040001c, 0x274a0400, 0x3c07000a, 0x3c020800, - 0x24454660, 0x94a9000a, 0x8f880014, 0x03471021, 0x94430006, 0x00402021, - 0xa4a30006, 0x94820006, 0xa4a20006, 0x01221023, 0x00021400, 0x00021403, - 0x04410006, 0x0048102b, 0x0000000d, 0x00000000, 0x2400005a, 0x0a001036, - 0x24020001, 0x14400002, 0x00001021, 0x24020001, 0x304200ff, 0x1440ffec, - 0x03471021, 0x24c44660, 0x8c820010, 0xaf420038, 0x8c830014, 0x3c020005, - 0xaf43003c, 0xaf420030, 0xaf800010, 0xaf8a0018, 0x03e00008, 0x00000000, - 0x27bdffe0, 0x8f820010, 0x8f850018, 0x3c070800, 0x24e84660, 0xafbf001c, - 0xafb20018, 0xafb10014, 0xafb00010, 0x9503000a, 0x8d060014, 0x00009021, - 0x309000ff, 0x00e08821, 0x24420001, 0x24a50020, 0x24630001, 0xaf820010, - 0xaf850018, 0xa503000a, 0x24c30020, 0x3c028000, 0x04c10007, 0xad030014, - 0x00621024, 0x14400005, 0x26224660, 0x8d020010, 0x24420001, 0xad020010, - 0x26224660, 0x9444000a, 0x94450018, 0x0010102b, 0x00a41826, 0x2c630001, - 0x00621825, 0x1060001c, 0x3c030006, 0x8f820010, 0x24120001, 0x00021140, - 0x00431025, 0xaf420030, 0x00000000, 0x00000000, 0x00000000, 0x27450400, - 0x8f420000, 0x30420010, 0x1040fffd, 0x26224660, 0x9444000a, 0x94430018, - 0xaf800010, 0xaf850018, 0x14830012, 0x26274660, 0x0e0010d2, 0x00000000, - 0x1600000e, 0x26274660, 0x0e001006, 0x00000000, 0x0a00108f, 0x26274660, - 0x00041c00, 0x00031c03, 0x00051400, 0x00021403, 0x00621823, 0x18600002, - 0x3c026000, 0xac400808, 0x26274660, 0x94e2000e, 0x94e3000c, 0x24420001, - 0xa4e2000e, 0x3042ffff, 0x50430001, 0xa4e0000e, 0x12000005, 0x3c02000a, - 0x94e2000a, 0xa74200a2, 0x0a0010cc, 0x02401021, 0x03421821, 0x94640006, - 0x94e2000a, 0x00441023, 0x00021400, 0x00021c03, 0x04610006, 0xa4e40006, - 0x0000000d, 0x00000000, 0x2400005a, 0x0a0010ae, 0x24020001, 0x8f820014, - 0x0062102b, 0x14400002, 0x00001021, 0x24020001, 0x304200ff, 0x1040001b, - 0x3c020800, 0x3c06000a, 0x24454660, 0x94a8000a, 0x8f870014, 0x03461021, - 0x94430006, 0x00402021, 0xa4a30006, 0x94820006, 0xa4a20006, 0x01021023, - 0x00021400, 0x00021403, 0x04410006, 0x0047102b, 0x0000000d, 0x00000000, - 0x2400005a, 0x0a0010c8, 0x24020001, 0x14400002, 0x00001021, 0x24020001, - 0x304200ff, 0x1440ffec, 0x03461021, 0x02401021, 0x8fbf001c, 0x8fb20018, - 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020, 0x3c020800, 0x24454660, - 0x94a3001a, 0x8ca40024, 0x00403021, 0x000318c0, 0x00832021, 0xaf44003c, - 0x8ca20020, 0xaf420038, 0x3c020050, 0x34420008, 0xaf420030, 0x00000000, - 0x00000000, 0x00000000, 0x8f420000, 0x30420020, 0x1040fffd, 0x00000000, - 0x8f430400, 0x24c64660, 0xacc30010, 0x8f420404, 0x3c030020, 0xacc20014, - 0xaf430030, 0x94c40018, 0x94c3001c, 0x94c2001a, 0x94c5001e, 0x00832021, - 0x24420001, 0xa4c2001a, 0x3042ffff, 0x14450002, 0xa4c40018, 0xa4c0001a, - 0x03e00008, 0x00000000, 0x8f820010, 0x3c030006, 0x00021140, 0x00431025, - 0xaf420030, 0x00000000, 0x00000000, 0x00000000, 0x27430400, 0x8f420000, - 0x30420010, 0x1040fffd, 0x00000000, 0xaf800010, 0xaf830018, 0x03e00008, - 0x00000000, 0x27bdffe8, 0xafb00010, 0x3c100800, 0x26104660, 0x3c05000a, - 0x02002021, 0x03452821, 0xafbf0014, 0x0e001128, 0x2406000a, 0x96020002, - 0x9603001e, 0x3042000f, 0x24420003, 0x00431804, 0x24027fff, 0x0043102b, - 0xaf830014, 0x10400004, 0x00000000, 0x0000000d, 0x00000000, 0x24000043, - 0x0e0010d2, 0x00000000, 0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, - 0x10c00007, 0x00000000, 0x8ca20000, 0x24c6ffff, 0x24a50004, 0xac820000, - 0x14c0fffb, 0x24840004, 0x03e00008, 0x00000000, 0x0a001137, 0x00a01021, - 0xac860000, 0x24840004, 0x00a01021, 0x1440fffc, 0x24a5ffff, 0x03e00008, - 0x00000000, 0x3c036000, 0x8c642b7c, 0x3c036010, 0x8c6553fc, 0x00041582, - 0x00042302, 0x308403ff, 0x00052d82, 0x00441026, 0x0002102b, 0x0005282b, - 0x00451025, 0x1440000d, 0x3c020050, 0x34420004, 0xaf400038, 0xaf40003c, - 0xaf420030, 0x00000000, 0x00000000, 0x8f420000, 0x30420020, 0x1040fffd, - 0x3c020020, 0xaf420030, 0x0000000d, 0x03e00008, 0x00000000, 0x3c020050, - 0x34420004, 0xaf440038, 0xaf45003c, 0xaf420030, 0x00000000, 0x00000000, - 0x8f420000, 0x30420020, 0x1040fffd, 0x3c020020, 0xaf420030, 0x03e00008, - 0x00000000, 0x00000000 }; +static u32 bnx2_COM_b06FwData[(0x0/4) + 1] = { 0x0 }; +static u32 bnx2_COM_b06FwRodata[(0x58/4) + 1] = { + 0x08002428, 0x0800245c, 0x0800245c, 0x0800245c, 0x0800245c, 0x0800245c, + 0x08002380, 0x0800245c, 0x080023e4, 0x0800245c, 0x0800231c, 0x0800245c, + 0x0800245c, 0x0800245c, 0x08002328, 0x00000000, 0x08003240, 0x08003270, + 0x080032a0, 0x080032d0, 0x08003300, 0x00000000, 0x00000000 }; +static u32 bnx2_COM_b06FwBss[(0x88/4) + 1] = { 0x0 }; +static u32 bnx2_COM_b06FwSbss[(0x1c/4) + 1] = { 0x0 }; -static u32 bnx2_COM_b06FwData[(0x0/4) + 1] = { 0x00000000 }; -static u32 bnx2_COM_b06FwRodata[(0x18/4) + 1] = { - 0x08002318, 0x08002348, 0x08002378, 0x080023a8, 0x080023d8, 0x00000000, - 0x00000000 }; - -static u32 bnx2_COM_b06FwBss[(0x88/4) + 1] = { 0x00000000 }; -static u32 bnx2_COM_b06FwSbss[(0x1c/4) + 1] = { 0x00000000 }; - -static int bnx2_RXP_b06FwReleaseMajor = 0x0; +static int bnx2_RXP_b06FwReleaseMajor = 0x1; static int bnx2_RXP_b06FwReleaseMinor = 0x0; static int bnx2_RXP_b06FwReleaseFix = 0x0; -static u32 bnx2_RXP_b06FwStartAddr = 0x08000060; +static u32 bnx2_RXP_b06FwStartAddr = 0x08003184; static u32 bnx2_RXP_b06FwTextAddr = 0x08000000; -static int bnx2_RXP_b06FwTextLen = 0x20b8; -static u32 bnx2_RXP_b06FwDataAddr = 0x080020e0; +static int bnx2_RXP_b06FwTextLen = 0x588c; +static u32 bnx2_RXP_b06FwDataAddr = 0x080058e0; static int bnx2_RXP_b06FwDataLen = 0x0; -static u32 bnx2_RXP_b06FwRodataAddr = 0x00000000; -static int bnx2_RXP_b06FwRodataLen = 0x0; -static u32 bnx2_RXP_b06FwBssAddr = 0x08002100; -static int bnx2_RXP_b06FwBssLen = 0x239c; -static u32 bnx2_RXP_b06FwSbssAddr = 0x080020e0; -static int bnx2_RXP_b06FwSbssLen = 0x14; - -static u32 bnx2_RXP_b06FwText[(0x20b8/4) + 1] = { - 0x0a000018, 0x00000000, 0x00000000, 0x0000000d, 0x72787020, 0x302e362e, - 0x39000000, 0x00060903, 0x00000000, 0x0000000d, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x10000003, 0x00000000, 0x0000000d, 0x0000000d, 0x3c020800, - 0x244220e0, 0x3c030800, 0x2463449c, 0xac400000, 0x0043202b, 0x1480fffd, - 0x24420004, 0x3c1d0800, 0x37bd3ffc, 0x03a0f021, 0x3c100800, 0x26100060, - 0x3c1c0800, 0x279c20e0, 0x0e000329, 0x00000000, 0x0000000d, 0x8f870008, - 0x2ce20080, 0x10400018, 0x3c030800, 0x24633490, 0x8f460100, 0x00072140, - 0x00831021, 0xac460000, 0x8f450104, 0x00641021, 0xac450004, 0x8f460108, - 0xac460008, 0x8f45010c, 0xac45000c, 0x8f460114, 0xac460010, 0x8f450118, - 0xac450014, 0x8f460124, 0xac460018, 0x8f450128, 0x00641821, 0x24e20001, - 0xaf820008, 0xac65001c, 0x03e00008, 0x00000000, 0x00804021, 0x8f830000, - 0x24070001, 0x3c020001, 0x00621024, 0x10400037, 0x00603021, 0x9742010e, - 0x3c038000, 0x3045ffff, 0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020003, - 0xa342018b, 0x8f840004, 0x24020080, 0x24030002, 0xaf420180, 0xa743018c, - 0x10800005, 0xa745018e, 0x9743011c, 0x9742011e, 0x0a000069, 0x00021400, - 0x9743011e, 0x9742011c, 0x00021400, 0x00621825, 0xaf4301a8, 0x8f84000c, - 0x24020003, 0x30838000, 0x1060000d, 0xa7420188, 0x93420116, 0x304200fc, - 0x005a1021, 0x24424004, 0x8c430000, 0x3063ffff, 0x14600005, 0x00000000, - 0x3c02ffff, 0x34427fff, 0x00821024, 0xaf82000c, 0x9782000e, 0x9743010c, - 0x8f440104, 0x3042bfff, 0x00031c00, 0x3084ffff, 0x00641825, 0xa74201a6, - 0xaf4301ac, 0x3c021000, 0xaf4201b8, 0x03e00008, 0x00001021, 0x30c21000, - 0x1040000f, 0x00000000, 0x9742010c, 0x3042fc00, 0x5440000b, 0x24070005, - 0x3c021000, 0x00c21024, 0x10400007, 0x3c030dff, 0x3463ffff, 0x3c020e00, - 0x00c21024, 0x0062182b, 0x54600001, 0x24070005, 0x8f82000c, 0x30434000, - 0x10600016, 0x00404821, 0x3c020f00, 0x00c21024, 0x14400012, 0x00000000, - 0x93420116, 0x34424000, 0x03421821, 0x94650002, 0x2ca21389, 0x1040000b, - 0x3c020800, 0x24422100, 0x00051942, 0x00031880, 0x00621821, 0x30a5001f, - 0x8c640000, 0x24020001, 0x00a21004, 0x00822024, 0x01044025, 0x11000037, - 0x3c021000, 0x9742010e, 0x34e60002, 0x3c038000, 0x24420004, 0x3045ffff, - 0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020003, 0xa342018b, 0x8f840004, - 0x24020180, 0x24030002, 0xaf420180, 0xa743018c, 0x10800005, 0xa745018e, - 0x9743011c, 0x9742011e, 0x0a0000cd, 0x00021400, 0x9743011e, 0x9742011c, - 0x00021400, 0x00621825, 0xaf4301a8, 0x8f84000c, 0x30828000, 0x1040000c, - 0xa7460188, 0x93420116, 0x304200fc, 0x005a1021, 0x24424004, 0x8c430000, - 0x3063ffff, 0x14600004, 0x3c02ffff, 0x34427fff, 0x00821024, 0xaf82000c, - 0x9782000e, 0x9743010c, 0x8f440104, 0x3042bfff, 0x00031c00, 0x3084ffff, - 0x00641825, 0xa74201a6, 0xaf4301ac, 0x3c021000, 0xaf4201b8, 0x03e00008, - 0x00001021, 0x00c21024, 0x104000ba, 0x3c020800, 0x8c430030, 0x1060003e, - 0x31224000, 0x1040003c, 0x3c030f00, 0x00c31824, 0x3c020100, 0x0043102b, - 0x14400038, 0x3c030800, 0x9742010e, 0x34e60002, 0x3c038000, 0x24420004, - 0x3045ffff, 0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020003, 0xa342018b, - 0x8f840004, 0x24020080, 0x24030002, 0xaf420180, 0xa743018c, 0x10800005, - 0xa745018e, 0x9743011c, 0x9742011e, 0x0a000110, 0x00021400, 0x9743011e, - 0x9742011c, 0x00021400, 0x00621825, 0xaf4301a8, 0x8f84000c, 0x30828000, - 0x1040000c, 0xa7460188, 0x93420116, 0x304200fc, 0x005a1021, 0x24424004, - 0x8c430000, 0x3063ffff, 0x14600004, 0x3c02ffff, 0x34427fff, 0x00821024, - 0xaf82000c, 0x9782000e, 0x9743010c, 0x8f440104, 0x3042bfff, 0x00031c00, - 0x3084ffff, 0x00641825, 0xa74201a6, 0xaf4301ac, 0x3c021000, 0xaf4201b8, - 0x03e00008, 0x00001021, 0x3c030800, 0x8c620024, 0x30420008, 0x1040003d, - 0x34e80002, 0x3c020f00, 0x00c21024, 0x5440003a, 0x3107ffff, 0x9742010c, - 0x30420200, 0x50400036, 0x3107ffff, 0x9742010e, 0x30e6fffb, 0x3c038000, - 0x24420004, 0x3045ffff, 0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020003, - 0xa342018b, 0x8f840004, 0x24020180, 0x24030002, 0xaf420180, 0xa743018c, - 0x10800005, 0xa745018e, 0x9743011c, 0x9742011e, 0x0a000153, 0x00021400, - 0x9743011e, 0x9742011c, 0x00021400, 0x00621825, 0xaf4301a8, 0x8f84000c, - 0x30828000, 0x1040000c, 0xa7460188, 0x93420116, 0x304200fc, 0x005a1021, - 0x24424004, 0x8c430000, 0x3063ffff, 0x14600004, 0x3c02ffff, 0x34427fff, - 0x00821024, 0xaf82000c, 0x9782000e, 0x9743010c, 0x8f440104, 0x3042bfff, - 0x00031c00, 0x3084ffff, 0x00641825, 0xa74201a6, 0xaf4301ac, 0x3c021000, - 0xaf4201b8, 0x3107ffff, 0x8f820000, 0x3c068000, 0x9743010e, 0x00021442, - 0x30440780, 0x24630004, 0x3065ffff, 0x8f4201b8, 0x00461024, 0x1440fffd, - 0x24020003, 0xa342018b, 0x8f830004, 0x24020002, 0xaf440180, 0xa742018c, - 0x10600005, 0xa745018e, 0x9743011c, 0x9742011e, 0x0a000189, 0x00021400, - 0x9743011e, 0x9742011c, 0x00021400, 0x00621825, 0xaf4301a8, 0x8f84000c, - 0x30828000, 0x1040000c, 0xa7470188, 0x93420116, 0x304200fc, 0x005a1021, - 0x24424004, 0x8c430000, 0x3063ffff, 0x14600004, 0x3c02ffff, 0x34427fff, - 0x00821024, 0xaf82000c, 0x9782000e, 0x9743010c, 0x8f440104, 0x3042bfff, - 0x00031c00, 0x3084ffff, 0x00641825, 0xa74201a6, 0xaf4301ac, 0x3c021000, - 0xaf4201b8, 0x03e00008, 0x00001021, 0x8f424000, 0x30420100, 0x104000ef, - 0x3c020800, 0x8c440024, 0x24030001, 0x14830036, 0x00404021, 0x9742010e, - 0x34e50002, 0x3c038000, 0x24420004, 0x3044ffff, 0x8f4201b8, 0x00431024, - 0x1440fffd, 0x24020003, 0xa342018b, 0x8f830004, 0x24020002, 0xaf400180, - 0xa742018c, 0x10600005, 0xa744018e, 0x9743011c, 0x9742011e, 0x0a0001c6, - 0x00021400, 0x9743011e, 0x9742011c, 0x00021400, 0x00621825, 0xaf4301a8, - 0x8f84000c, 0x30828000, 0x1040000c, 0xa7450188, 0x93420116, 0x304200fc, - 0x005a1021, 0x24424004, 0x8c430000, 0x3063ffff, 0x14600004, 0x3c02ffff, - 0x34427fff, 0x00821024, 0xaf82000c, 0x9782000e, 0x9743010c, 0x8f440104, - 0x3042bfff, 0x00031c00, 0x3084ffff, 0x00641825, 0xa74201a6, 0xaf4301ac, - 0x3c021000, 0xaf4201b8, 0x03e00008, 0x00001021, 0x30820001, 0x10400035, - 0x30e90004, 0x9742010e, 0x30e6fffb, 0x3c038000, 0x24420004, 0x3044ffff, - 0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020003, 0xa342018b, 0x8f830004, - 0x24020002, 0xaf400180, 0xa742018c, 0x10600005, 0xa744018e, 0x9743011c, - 0x9742011e, 0x0a0001fe, 0x00021400, 0x9743011e, 0x9742011c, 0x00021400, - 0x00621825, 0xaf4301a8, 0x8f84000c, 0x30828000, 0x1040000c, 0xa7470188, - 0x93420116, 0x304200fc, 0x005a1021, 0x24424004, 0x8c430000, 0x3063ffff, - 0x14600004, 0x3c02ffff, 0x34427fff, 0x00821024, 0xaf82000c, 0x9782000e, - 0x9743010c, 0x8f440104, 0x3042bfff, 0x00031c00, 0x3084ffff, 0x00641825, - 0xa74201a6, 0xaf4301ac, 0x3c021000, 0xaf4201b8, 0x30c7ffff, 0x8d020024, - 0x30420004, 0x10400037, 0x8d020024, 0x9742010e, 0x30e6fffb, 0x3c038000, - 0x24420004, 0x3045ffff, 0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020003, - 0xa342018b, 0x8f840004, 0x24020100, 0x24030002, 0xaf420180, 0xa743018c, - 0x10800005, 0xa745018e, 0x9743011c, 0x9742011e, 0x0a000237, 0x00021400, - 0x9743011e, 0x9742011c, 0x00021400, 0x00621825, 0xaf4301a8, 0x8f84000c, - 0x30828000, 0x1040000c, 0xa7470188, 0x93420116, 0x304200fc, 0x005a1021, - 0x24424004, 0x8c430000, 0x3063ffff, 0x14600004, 0x3c02ffff, 0x34427fff, - 0x00821024, 0xaf82000c, 0x9782000e, 0x9743010c, 0x8f440104, 0x3042bfff, - 0x00031c00, 0x3084ffff, 0x00641825, 0xa74201a6, 0xaf4301ac, 0x3c021000, - 0xaf4201b8, 0x30c7ffff, 0x8d020024, 0x30420008, 0x10400034, 0x00000000, - 0x9742010e, 0x3c038000, 0x24420004, 0x3045ffff, 0x8f4201b8, 0x00431024, - 0x1440fffd, 0x24020003, 0xa342018b, 0x8f840004, 0x24020180, 0x24030002, - 0xaf420180, 0xa743018c, 0x10800005, 0xa745018e, 0x9743011c, 0x9742011e, - 0x0a00026f, 0x00021400, 0x9743011e, 0x9742011c, 0x00021400, 0x00621825, - 0xaf4301a8, 0x8f84000c, 0x30828000, 0x1040000c, 0xa7470188, 0x93420116, - 0x304200fc, 0x005a1021, 0x24424004, 0x8c430000, 0x3063ffff, 0x14600004, - 0x3c02ffff, 0x34427fff, 0x00821024, 0xaf82000c, 0x9782000e, 0x9743010c, - 0x8f440104, 0x3042bfff, 0x00031c00, 0x3084ffff, 0x00641825, 0xa74201a6, - 0xaf4301ac, 0x3c021000, 0xaf4201b8, 0x15200046, 0x00001021, 0x3c038000, - 0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020002, 0x24032000, 0xa342018b, - 0xa7430188, 0x3c021000, 0xaf4201b8, 0x03e00008, 0x00001021, 0x3c030800, - 0x8c620024, 0x30420001, 0x10400035, 0x00001021, 0x9742010e, 0x34e50002, - 0x3c038000, 0x24420004, 0x3044ffff, 0x8f4201b8, 0x00431024, 0x1440fffd, - 0x24020003, 0xa342018b, 0x8f830004, 0x24020002, 0xaf400180, 0xa742018c, - 0x10600005, 0xa744018e, 0x9743011c, 0x9742011e, 0x0a0002b5, 0x00021400, - 0x9743011e, 0x9742011c, 0x00021400, 0x00621825, 0xaf4301a8, 0x8f84000c, - 0x30828000, 0x1040000c, 0xa7450188, 0x93420116, 0x304200fc, 0x005a1021, - 0x24424004, 0x8c430000, 0x3063ffff, 0x14600004, 0x3c02ffff, 0x34427fff, - 0x00821024, 0xaf82000c, 0x9782000e, 0x9743010c, 0x8f440104, 0x3042bfff, - 0x00031c00, 0x3084ffff, 0x00641825, 0xa74201a6, 0xaf4301ac, 0x3c021000, - 0xaf4201b8, 0x00001021, 0x03e00008, 0x00000000, 0x27bdffe0, 0xafbf0018, - 0xafb10014, 0xafb00010, 0x8f420140, 0xaf420020, 0x8f430148, 0x3c027000, - 0x00621824, 0x3c024000, 0x1062000c, 0x0043102b, 0x14400006, 0x3c025000, - 0x3c023000, 0x1062000b, 0x3c024000, 0x0a00031f, 0x00000000, 0x10620034, - 0x3c024000, 0x0a00031f, 0x00000000, 0x0e00067c, 0x00000000, 0x0a00031f, - 0x3c024000, 0x8f420148, 0x24030002, 0x3044ffff, 0x00021402, 0x305000ff, - 0x1203000c, 0x27510180, 0x2a020003, 0x10400005, 0x24020003, 0x0600001d, - 0x36053000, 0x0a00030a, 0x3c038000, 0x12020007, 0x00000000, 0x0a000317, - 0x00000000, 0x0e000423, 0x00000000, 0x0a000308, 0x00402021, 0x0e000435, - 0x00000000, 0x00402021, 0x36053000, 0x3c038000, 0x8f4201b8, 0x00431024, - 0x1440fffd, 0x24020002, 0xa6250008, 0xa222000b, 0xa6240010, 0x8f420144, - 0x3c031000, 0xae220024, 0xaf4301b8, 0x0a00031f, 0x3c024000, 0x0000000d, - 0x00000000, 0x240001c3, 0x0a00031f, 0x3c024000, 0x0e0007f7, 0x00000000, - 0x3c024000, 0xaf420178, 0x00000000, 0x8fbf0018, 0x8fb10014, 0x8fb00010, - 0x03e00008, 0x27bd0020, 0x24020800, 0x03e00008, 0xaf4201b8, 0x27bdffe8, - 0x3c04600c, 0xafbf0014, 0xafb00010, 0x8c825000, 0x3c1a8000, 0x2403ff7f, - 0x3c106000, 0x00431024, 0x3442380c, 0x24030003, 0xac825000, 0x3c040008, - 0xaf430008, 0x8e020808, 0x3c030800, 0xac600020, 0x3042fff0, 0x2c420001, - 0xaf820004, 0x0e000819, 0x0344d825, 0x0e000781, 0x00000000, 0x3c020400, - 0x3442000c, 0x3c03ffff, 0x34630806, 0xae021948, 0xae03194c, 0x8e021980, - 0x34420200, 0xae021980, 0x8f500000, 0x32020003, 0x1040fffd, 0x32020001, - 0x10400004, 0x32020002, 0x0e0003bd, 0x00000000, 0x32020002, 0x1040fff6, - 0x00000000, 0x0e0002d4, 0x00000000, 0x0a00034a, 0x00000000, 0x27bdffe8, - 0x3c04600c, 0xafbf0014, 0xafb00010, 0x8c825000, 0x3c1a8000, 0x2403ff7f, - 0x3c106000, 0x00431024, 0x3442380c, 0x24030003, 0xac825000, 0x3c040008, - 0xaf430008, 0x8e020808, 0x3c030800, 0xac600020, 0x3042fff0, 0x2c420001, - 0xaf820004, 0x0e000819, 0x0344d825, 0x0e000781, 0x00000000, 0x3c020400, - 0x3442000c, 0x3c03ffff, 0x34630806, 0xae021948, 0xae03194c, 0x8e021980, - 0x8fbf0014, 0x34420200, 0xae021980, 0x8fb00010, 0x03e00008, 0x27bd0018, - 0x30a5ffff, 0x30c6ffff, 0x30e7ffff, 0x3c038000, 0x8f4201b8, 0x00431024, - 0x1440fffd, 0x24020003, 0xa342018b, 0x8f830004, 0xaf440180, 0xa745018c, - 0x10600005, 0xa746018e, 0x9743011c, 0x9742011e, 0x0a000393, 0x00021400, - 0x9743011e, 0x9742011c, 0x00021400, 0x00621825, 0xaf4301a8, 0x8f84000c, - 0x30828000, 0x1040000c, 0xa7470188, 0x93420116, 0x304200fc, 0x005a1021, - 0x24424004, 0x8c430000, 0x3063ffff, 0x14600004, 0x3c02ffff, 0x34427fff, - 0x00821024, 0xaf82000c, 0x9782000e, 0x9743010c, 0x8f440104, 0x3042bfff, - 0x00031c00, 0x3084ffff, 0x00641825, 0xa74201a6, 0xaf4301ac, 0x3c021000, - 0xaf4201b8, 0x03e00008, 0x00000000, 0x3c038000, 0x8f4201b8, 0x00431024, - 0x1440fffd, 0x24020002, 0x24032000, 0xa342018b, 0xa7430188, 0x3c021000, - 0xaf4201b8, 0x03e00008, 0x00000000, 0x27bdffe8, 0xafbf0010, 0x8f460128, - 0xaf460020, 0x8f420104, 0x8f450100, 0x24030800, 0x3c040010, 0xaf820000, - 0x00441024, 0xaf85000c, 0xaf4301b8, 0x14400005, 0x3c02001f, 0x3c030800, - 0x8c620020, 0x0a0003d5, 0x00002021, 0x3442ff00, 0x14c20009, 0x2402bfff, - 0x3c030800, 0x8c620020, 0x24040001, 0x24420001, 0x0e00004c, 0xac620020, - 0x0a0003e4, 0x00000000, 0x00a21024, 0x14400006, 0x00000000, 0xaf400048, - 0x0e000448, 0xaf400040, 0x0a0003e4, 0x00000000, 0x0e000783, 0x00000000, - 0x10400005, 0x3c024000, 0x8f430124, 0x3c026020, 0xac430014, 0x3c024000, - 0xaf420138, 0x00000000, 0x8fbf0010, 0x03e00008, 0x27bd0018, 0x27bdffe0, - 0xafbf0018, 0xafb10014, 0xafb00010, 0x8f420148, 0x24030002, 0x3044ffff, - 0x00021402, 0x305000ff, 0x1203000c, 0x27510180, 0x2a020003, 0x10400005, - 0x24020003, 0x0600001d, 0x36053000, 0x0a00040e, 0x3c038000, 0x12020007, - 0x00000000, 0x0a00041b, 0x00000000, 0x0e000423, 0x00000000, 0x0a00040c, - 0x00402021, 0x0e000435, 0x00000000, 0x00402021, 0x36053000, 0x3c038000, - 0x8f4201b8, 0x00431024, 0x1440fffd, 0x24020002, 0xa6250008, 0xa222000b, - 0xa6240010, 0x8f420144, 0x3c031000, 0xae220024, 0xaf4301b8, 0x0a00041f, - 0x8fbf0018, 0x0000000d, 0x00000000, 0x240001c3, 0x8fbf0018, 0x8fb10014, - 0x8fb00010, 0x03e00008, 0x27bd0020, 0x3084ffff, 0x2c821389, 0x1040000d, - 0x00001021, 0x3c030800, 0x24632100, 0x00042942, 0x00052880, 0x00a32821, - 0x3086001f, 0x8ca40000, 0x24030001, 0x00c31804, 0x00832025, 0x03e00008, - 0xaca40000, 0x03e00008, 0x24020091, 0x3084ffff, 0x2c821389, 0x1040000e, - 0x00001021, 0x3c030800, 0x24632100, 0x00042942, 0x00052880, 0x00a32821, - 0x3086001f, 0x24030001, 0x8ca40000, 0x00c31804, 0x00031827, 0x00832024, - 0x03e00008, 0xaca40000, 0x03e00008, 0x24020091, 0x27bdffb0, 0x3c026000, - 0xafbf0048, 0x8c434448, 0xaf630140, 0x93620005, 0x30420001, 0x14400005, - 0x00000000, 0x0e0007ed, 0x00000000, 0x0a00067a, 0x8fbf0048, 0x93420116, - 0x93430112, 0x8f430104, 0x3c040020, 0x34424000, 0x00641824, 0x1060000d, - 0x03426021, 0x8f430128, 0x27420180, 0xac430000, 0x8f650040, 0x24040008, - 0x240340c1, 0xa4430008, 0x24030002, 0xa043000b, 0x3c031000, 0x0a000563, - 0xa044000a, 0x8f420104, 0x3c030040, 0x00431024, 0x10400007, 0x00000000, - 0x8f430128, 0x27420180, 0xac430000, 0x8f650040, 0x0a00055c, 0x24040010, - 0xaf400048, 0xaf400054, 0xaf400040, 0x8f630048, 0x8f620040, 0x00624823, - 0x05210004, 0x00000000, 0x0000000d, 0x00000000, 0x24000132, 0x9742011a, - 0x3046ffff, 0x10c00004, 0x8d880004, 0x01061021, 0x0a000487, 0x2445ffff, - 0x01002821, 0x918a000d, 0xa7a00020, 0xafa00028, 0x9364003f, 0x3c026000, - 0x8c434448, 0x308700ff, 0x31420004, 0x10400033, 0xaf630144, 0x24090012, - 0x14e90006, 0x3c040800, 0x8c830028, 0x24020001, 0x24630001, 0x0a00054e, - 0xac830028, 0x8f620044, 0x15020012, 0x97a20020, 0x27a60010, 0x27450180, - 0x3442001a, 0xa7a20020, 0x8f630040, 0x3c048000, 0x24020020, 0xa3a70022, - 0xa3a90023, 0xa3a2001a, 0xafa30028, 0x8f4201b8, 0x00441024, 0x1440fffd, - 0x00000000, 0x0a000533, 0x00000000, 0x8f620044, 0x01021023, 0x0440009e, - 0x24020001, 0x8f620048, 0x01021023, 0x0441009a, 0x24020001, 0x97a20020, - 0x27a60010, 0x34420001, 0xa7a20020, 0x8f630040, 0x27450180, 0x3c048000, - 0xafa30028, 0x8f4201b8, 0x00441024, 0x1440fffd, 0x00000000, 0x0a000533, - 0x00000000, 0x3c026000, 0x8c424448, 0xaf620148, 0x8f630040, 0x00685823, - 0x19600013, 0x00cb102a, 0x54400007, 0x314a00fe, 0x5566000c, 0x010b4021, - 0x31420001, 0x54400009, 0x010b4021, 0x314a00fe, 0x24020001, 0xa7a20020, - 0x8f630040, 0x00c05821, 0x00003021, 0x0a0004dd, 0xafa30028, 0x00cb1023, - 0x0a0004dd, 0x3046ffff, 0x00005821, 0x8f620048, 0x2442ffff, 0x00a21823, - 0x18600019, 0x0066102a, 0x14400013, 0x24020001, 0xa7a20020, 0x8f630040, - 0xafa30028, 0x8f620040, 0x55020005, 0x27a60010, 0x55200003, 0x27a60010, - 0x0a0004f6, 0x00c01821, 0x27450180, 0x3c038000, 0x8f4201b8, 0x00431024, - 0x1440fffd, 0x00000000, 0x0a000533, 0x00000000, 0x8f650048, 0x00c31023, - 0x3046ffff, 0x314a00f6, 0x3c046000, 0x8c824448, 0x31430002, 0x1060001e, - 0xaf62014c, 0x8f620044, 0x1502000e, 0x97a20020, 0x27a60010, 0x34420200, - 0xa7a20020, 0x8f630040, 0x27450180, 0x3c048000, 0xafa30028, 0x8f4201b8, - 0x00441024, 0x1440fffd, 0x00000000, 0x0a000533, 0x00000000, 0x27a60010, - 0x34420001, 0xa7a20020, 0x8f630040, 0x27450180, 0x3c048000, 0xafa30028, - 0x8f4201b8, 0x00441024, 0x1440fffd, 0x00000000, 0x0a000533, 0x00000000, - 0x3c026000, 0x8c424448, 0x31430010, 0xaf620150, 0x54600003, 0x8d890008, - 0x0a00054e, 0x24020001, 0x8f630054, 0x2522ffff, 0x00431023, 0x1840002a, - 0x24020001, 0x27a60010, 0xa7a20020, 0x8f630040, 0x27450180, 0x3c048000, - 0xafa30028, 0x8f4201b8, 0x00441024, 0x1440fffd, 0x00000000, 0x8f420128, - 0xaca20000, 0x8cc30018, 0x240240c1, 0xa4a20008, 0xaca30018, 0x90c4000a, - 0x24020002, 0xa0a2000b, 0xa0a4000a, 0x94c20010, 0xa4a20010, 0x90c30012, - 0xa0a30012, 0x90c20013, 0xa0a20013, 0x8cc30014, 0xaca30014, 0x8cc20024, - 0xaca20024, 0x8cc30028, 0xaca30028, 0x8cc4002c, 0x24020001, 0x3c031000, - 0xaca4002c, 0xaf4301b8, 0xaf400044, 0xaf400050, 0x0a00067a, 0x8fbf0048, - 0x3c026000, 0x8c424448, 0x31430020, 0x10600019, 0xaf620154, 0x8f430128, - 0x27420180, 0xac430000, 0x8f650040, 0x24040004, 0x240340c1, 0xa4430008, - 0x24030002, 0xa044000a, 0x24040008, 0xa043000b, 0x3c031000, 0xa4440010, - 0xa0400012, 0xa0400013, 0xac400014, 0xac400024, 0xac400028, 0xac40002c, - 0xac450018, 0x0e0007ed, 0xaf4301b8, 0x0a00067a, 0x8fbf0048, 0x8f430104, - 0x8c824448, 0x38e3000a, 0x2c630001, 0xaf620158, 0x38e2000c, 0x2c420001, - 0x00621825, 0x14600003, 0x2402000e, 0x14e2002a, 0x00000000, 0x50c00008, - 0x9584000e, 0x10c00004, 0xa7a60040, 0x01061021, 0x0a000583, 0x2445ffff, - 0x01002821, 0x9584000e, 0x93630035, 0x8f62004c, 0x00642004, 0x00892021, - 0x00821023, 0x1840001f, 0x3c026000, 0x8f620018, 0x01021023, 0x1c40000f, - 0x97a20020, 0x8f620018, 0x15020018, 0x3c026000, 0x8f62001c, 0x01221023, - 0x1c400008, 0x97a20020, 0x8f62001c, 0x15220011, 0x3c026000, 0x8f620058, - 0x00821023, 0x1840000c, 0x97a20020, 0xafa50028, 0xafa80034, 0xafa90038, - 0xafa4003c, 0x34420020, 0x0a0005a8, 0xa7a20020, 0x8f680040, 0x00003021, - 0x8f640058, 0x01002821, 0x3c026000, 0x8c434448, 0xaf63015c, 0x8f62004c, - 0x01221023, 0x18400009, 0x00000000, 0x8f620054, 0x01221023, 0x1c400005, - 0x97a20020, 0xafa50028, 0xafa90024, 0x0a0005c3, 0x34420040, 0x9742011a, - 0x1440000c, 0x24020014, 0x8f620058, 0x14820009, 0x24020014, 0x8f63004c, - 0x8f620054, 0x10620004, 0x97a20020, 0xafa50028, 0x34420080, 0xa7a20020, - 0x24020014, 0x10e2000a, 0x28e20015, 0x10400005, 0x2402000c, 0x10e20006, - 0x3c026000, 0x0a000600, 0x00000000, 0x24020016, 0x14e20031, 0x3c026000, - 0x8f620054, 0x24420001, 0x1522002d, 0x3c026000, 0x24020014, 0x10e2001e, - 0x28e20015, 0x10400005, 0x2402000c, 0x10e20008, 0x3c026000, 0x0a000600, - 0x00000000, 0x24020016, 0x10e2000c, 0x97a20020, 0x0a000600, 0x3c026000, - 0x97a30020, 0x2402000e, 0xafa50028, 0xa3a70022, 0xa3a20023, 0xafa90024, - 0x34630054, 0x0a0005ff, 0xa7a30020, 0x24030010, 0x24040002, 0xafa50028, - 0xa3a70022, 0xa3a30023, 0xa3a4001a, 0xafa90024, 0x0a0005fe, 0x3442005d, - 0x97a20020, 0x24030012, 0x24040002, 0xafa50028, 0xa3a70022, 0xa3a30023, - 0xa3a4001a, 0xafa90024, 0x3042fffe, 0x3442005c, 0xa7a20020, 0x3c026000, - 0x8c434448, 0x31420001, 0xaf630160, 0x1040002c, 0x2402000c, 0x10e20014, - 0x28e2000d, 0x10400005, 0x2402000a, 0x10e20008, 0x97a20020, 0x0a000631, - 0x3c026000, 0x2402000e, 0x10e20018, 0x3c026000, 0x0a000631, 0x00000000, - 0x24030008, 0x24040002, 0xafa50028, 0xa3a70022, 0xa3a30023, 0xa3a4001a, - 0x0a00062f, 0x34420013, 0x97a30020, 0x30620004, 0x1440000b, 0x97a20020, - 0x3462001b, 0xa7a20020, 0x24020016, 0x24030002, 0xafa50028, 0xa3a70022, - 0xa3a20023, 0x0a000630, 0xa3a3001a, 0x97a20020, 0x24030010, 0x24040002, - 0xafa50028, 0xa3a70022, 0xa3a30023, 0xa3a4001a, 0x3442001b, 0xa7a20020, - 0x3c026000, 0x8c434448, 0x31420009, 0x0002102b, 0x00021023, 0x30420007, - 0x34440003, 0xaf630164, 0x10c00016, 0x24030800, 0x8f820010, 0x27450180, - 0x24420001, 0xaf820010, 0x24020004, 0xaf4301b8, 0xa4a40008, 0xa0a2000b, - 0x93440120, 0x3c031000, 0xa4a6000e, 0xaca90024, 0xaca80028, 0x008b2021, - 0xa4a4000c, 0xaf4301b8, 0x97a20020, 0x00003021, 0x3042ffbf, 0x0a000650, - 0xa7a20020, 0x24060001, 0x3c026000, 0x8c434448, 0xaf630168, 0x97a20020, - 0x10400020, 0x27450180, 0x3c038000, 0x8f4201b8, 0x00431024, 0x1440fffd, - 0x00000000, 0x8f420128, 0xaca20000, 0x8fa30028, 0x240240c1, 0xa4a20008, - 0xaca30018, 0x93a4001a, 0x24020002, 0xa0a2000b, 0xa0a4000a, 0x97a20020, - 0xa4a20010, 0x93a30022, 0xa0a30012, 0x93a20023, 0xa0a20013, 0x8fa30024, - 0xaca30014, 0x8fa20034, 0xaca20024, 0x8fa30038, 0xaca30028, 0x8fa2003c, - 0x3c031000, 0xaca2002c, 0xaf4301b8, 0x3c026000, 0x8c434448, 0x00c01021, - 0xaf63016c, 0x8fbf0048, 0x03e00008, 0x27bd0050, 0x8f460140, 0x8f470148, - 0x3c028000, 0x00e24024, 0x00072c02, 0x30a300ff, 0x2402000b, 0x1062008f, - 0x27440180, 0x2862000c, 0x10400011, 0x24020006, 0x1062005a, 0x28620007, - 0x10400007, 0x24020008, 0x10600024, 0x24020001, 0x10620037, 0x00000000, - 0x0a00077e, 0x00000000, 0x106200a9, 0x24020009, 0x106200bb, 0x00071c02, - 0x0a00077e, 0x00000000, 0x2402001b, 0x106200c7, 0x2862001c, 0x10400007, - 0x2402000e, 0x106200b1, 0x24020019, 0x106200c2, 0x00071c02, 0x0a00077e, - 0x00000000, 0x24020080, 0x10620060, 0x28620081, 0x10400005, 0x2402001c, - 0x10620094, 0x00071c02, 0x0a00077e, 0x00000000, 0x240200c2, 0x106200c5, - 0x00a01821, 0x0a00077e, 0x00000000, 0x00a01821, 0x3c058000, 0x8f4201b8, - 0x00451024, 0x1440fffd, 0x24020001, 0xa4830008, 0x24030002, 0xac860000, - 0xac800004, 0xa082000a, 0xa083000b, 0xa4870010, 0x8f430144, 0x3c021000, - 0xac800028, 0xac830024, 0x3c036000, 0xaf4201b8, 0x03e00008, 0xac600808, - 0x11000009, 0x00a01821, 0x3c020800, 0x24030002, 0xa0434490, 0x24424490, - 0xac460008, 0x8f430144, 0x03e00008, 0xac430004, 0x3c058000, 0x8f4201b8, - 0x00451024, 0x1440fffd, 0x24020002, 0xac800000, 0xac860004, 0xa4830008, - 0xa082000a, 0xa082000b, 0xa4870010, 0xac800024, 0x8f420144, 0x3c031000, - 0xac820028, 0x3c026000, 0xaf4301b8, 0x03e00008, 0xac400808, 0x00a01821, - 0x3c080800, 0x3c058000, 0x8f4201b8, 0x00451024, 0x1440fffd, 0x00000000, - 0xac860000, 0x91024490, 0x00002821, 0x10400002, 0x25064490, 0x8cc50008, - 0xac850004, 0xa4830008, 0x91034490, 0x24020002, 0xa082000b, 0xa4870010, - 0x34630001, 0xa083000a, 0x8f420144, 0xac820024, 0x91034490, 0x10600002, - 0x00001021, 0x8cc20004, 0xac820028, 0x3c021000, 0xaf4201b8, 0x3c026000, - 0xa1004490, 0x03e00008, 0xac400808, 0x00a01821, 0x3c058000, 0x8f4201b8, - 0x00451024, 0x1440fffd, 0x24020002, 0xa082000b, 0xa4830008, 0xa4870010, - 0x8f420144, 0x3c031000, 0xa4820012, 0x03e00008, 0xaf4301b8, 0x30e2ffff, - 0x14400028, 0x00071c02, 0x93620005, 0x30420004, 0x14400020, 0x3c029000, - 0x34420001, 0x00c21025, 0xaf420020, 0x3c038000, 0x8f420020, 0x00431024, - 0x1440fffd, 0x00000000, 0x93620005, 0x3c038000, 0x34630001, 0x00c31825, - 0x34420004, 0xa3620005, 0xaf430020, 0x93620005, 0x30420004, 0x14400003, - 0x3c038000, 0x0000000d, 0x3c038000, 0x8f4201b8, 0x00431024, 0x1440fffd, - 0x24020005, 0x3c031000, 0xac860000, 0xa082000b, 0xaf4301b8, 0x0a00073d, - 0x00071c02, 0x0000000d, 0x03e00008, 0x00000000, 0x00071c02, 0x3c058000, - 0x8f4201b8, 0x00451024, 0x1440fffd, 0x24020001, 0xa4830008, 0x24030002, - 0xac860000, 0xac800004, 0xa082000a, 0xa083000b, 0xa4870010, 0x8f430144, - 0x3c021000, 0xac800028, 0xac830024, 0x03e00008, 0xaf4201b8, 0x00071c02, - 0x3c058000, 0x8f4201b8, 0x00451024, 0x1440fffd, 0x24020002, 0xac800000, - 0xac860004, 0xa4830008, 0xa082000a, 0xa082000b, 0xa4870010, 0xac800024, - 0x8f420144, 0x3c031000, 0xac820028, 0x03e00008, 0xaf4301b8, 0x00071c02, - 0x3c058000, 0x8f4201b8, 0x00451024, 0x1440fffd, 0x24020001, 0xa4830008, - 0x24030002, 0xa082000a, 0x3c021000, 0xac860000, 0xac800004, 0xa083000b, - 0xa4870010, 0xac800024, 0xac800028, 0x03e00008, 0xaf4201b8, 0x3c058000, - 0x8f4201b8, 0x00451024, 0x1440fffd, 0x24020002, 0xac860000, 0xac800004, - 0xa4830008, 0xa080000a, 0x0a000748, 0xa082000b, 0x0000000d, 0x03e00008, - 0x00000000, 0x03e00008, 0x00000000, 0x8f420100, 0x3042003e, 0x14400011, - 0x24020001, 0xaf400048, 0x8f420100, 0x304207c0, 0x10400005, 0x00000000, - 0xaf40004c, 0xaf400050, 0x03e00008, 0x24020001, 0xaf400054, 0xaf400040, - 0x8f420100, 0x30423800, 0x54400001, 0xaf400044, 0x24020001, 0x03e00008, - 0x00000000, 0x3c029000, 0x34420001, 0x00822025, 0xaf440020, 0x3c038000, - 0x8f420020, 0x00431024, 0x1440fffd, 0x00000000, 0x03e00008, 0x00000000, - 0x3c028000, 0x34420001, 0x00822025, 0x03e00008, 0xaf440020, 0x8f430128, - 0x27420180, 0xac430000, 0x8f650040, 0x240340c1, 0xa4430008, 0x24030002, - 0xa044000a, 0x24040008, 0xa043000b, 0x3c031000, 0xa4440010, 0xa0400012, - 0xa0400013, 0xac400014, 0xac400024, 0xac400028, 0xac40002c, 0xac450018, - 0x03e00008, 0xaf4301b8, 0x24020001, 0xacc40000, 0x03e00008, 0xa4e50000, - 0x03e00008, 0x24020001, 0x24020001, 0xaf400044, 0x03e00008, 0xaf400050, - 0x00803021, 0x27450180, 0x3c038000, 0x8f4201b8, 0x00431024, 0x1440fffd, - 0x00000000, 0x8f420128, 0xaca20000, 0x8cc30018, 0x240240c1, 0xa4a20008, - 0xaca30018, 0x90c4000a, 0x24020002, 0xa0a2000b, 0xa0a4000a, 0x94c20010, - 0xa4a20010, 0x90c30012, 0xa0a30012, 0x90c20013, 0xa0a20013, 0x8cc30014, - 0xaca30014, 0x8cc20024, 0xaca20024, 0x8cc30028, 0xaca30028, 0x8cc2002c, - 0x3c031000, 0xaca2002c, 0x24020001, 0xaf4301b8, 0xaf400044, 0x03e00008, - 0xaf400050, 0x27bdffe8, 0xafbf0010, 0x0e000326, 0x00000000, 0x00002021, - 0x0e00004c, 0xaf400180, 0x8fbf0010, 0x03e00008, 0x27bd0018, 0x8f460148, - 0x27450180, 0x3c038000, 0x00061402, 0x304700ff, 0x8f4201b8, 0x00431024, - 0x1440fffd, 0x00000000, 0x8f440140, 0x00061202, 0x304200ff, 0x00061c02, - 0xaca20004, 0x24020002, 0xa4a30008, 0x30c300ff, 0xa0a2000b, 0xaca30024, - 0x10e0000a, 0xaca40000, 0x28e20004, 0x14400005, 0x24020001, 0x24020005, - 0x54e20005, 0xa0a0000a, 0x24020001, 0x0a000816, 0xa0a2000a, 0xa0a0000a, - 0x3c021000, 0x03e00008, 0xaf4201b8, 0x03e00008, 0x00001021, 0x10c00007, - 0x00000000, 0x8ca20000, 0x24c6ffff, 0x24a50004, 0xac820000, 0x14c0fffb, - 0x24840004, 0x03e00008, 0x00000000, 0x0a00082a, 0x00a01021, 0xac860000, - 0x24840004, 0x00a01021, 0x1440fffc, 0x24a5ffff, 0x03e00008, 0x00000000, - 0x00000000 }; - -static u32 bnx2_RXP_b06FwData[(0x0/4) + 1] = { 0x00000000 }; -static u32 bnx2_RXP_b06FwRodata[(0x0/4) + 1] = { 0x00000000 }; -static u32 bnx2_RXP_b06FwBss[(0x239c/4) + 1] = { 0x00000000 }; -static u32 bnx2_RXP_b06FwSbss[(0x14/4) + 1] = { 0x00000000 }; - -static u32 bnx2_rv2p_proc1[] = { - 0x00000008, 0xac000001, 0x0000000c, 0x2f800001, 0x00000010, 0x213f0004, - 0x00000010, 0x20bf002c, 0x00000010, 0x203f0143, 0x00000018, 0x8000fffd, - 0x00000010, 0xb1b8b017, 0x0000000b, 0x2fdf0002, 0x00000000, 0x03d80000, - 0x00000000, 0x2c380000, 0x00000008, 0x2c800000, 0x00000008, 0x2d000000, - 0x00000010, 0x91d40000, 0x00000008, 0x2d800108, 0x00000008, 0x02000002, - 0x00000010, 0x91de0000, 0x0000000f, 0x42e0001c, 0x00000010, 0x91840a08, - 0x00000008, 0x2c8000b0, 0x00000008, 0x2d000008, 0x00000008, 0x2d800150, - 0x00000000, 0x00000000, 0x00000010, 0x91de0000, 0x00000010, 0x2c620002, - 0x00000018, 0x80000012, 0x0000000b, 0x2fdf0002, 0x0000000c, 0x1f800002, - 0x00000000, 0x2c070000, 0x00000018, 0x8000ffe6, 0x00000008, 0x02000002, - 0x0000000f, 0x42e0001c, 0x00000010, 0x91840a08, 0x00000008, 0x2c8000b0, - 0x00000008, 0x2d000008, 0x00000010, 0x91d40000, 0x00000008, 0x2d800108, - 0x00000000, 0x00000000, 0x00000010, 0x91de0000, 0x00000018, 0x80000004, - 0x0000000c, 0x1f800002, 0x00000000, 0x00000000, 0x00000018, 0x8000ffd9, - 0x0000000c, 0x29800002, 0x0000000c, 0x1f800002, 0x00000000, 0x2adf0000, - 0x00000008, 0x2a000005, 0x00000018, 0x8000ffd4, 0x00000008, 0x02240030, - 0x00000018, 0x00040000, 0x00000018, 0x80000015, 0x00000018, 0x80000017, - 0x00000018, 0x8000001b, 0x00000018, 0x8000004c, 0x00000018, 0x8000008c, - 0x00000018, 0x8000000f, 0x00000018, 0x8000000e, 0x00000018, 0x8000000d, - 0x00000018, 0x8000000c, 0x00000018, 0x800000c2, 0x00000018, 0x8000000a, - 0x00000018, 0x80000009, 0x00000018, 0x80000008, 0x00000018, 0x800000fd, - 0x00000018, 0x80000006, 0x00000018, 0x80000005, 0x00000018, 0x800000ff, - 0x00000018, 0x80000104, 0x00000018, 0x80000002, 0x00000018, 0x80000098, - 0x00000018, 0x80000000, 0x0000000c, 0x1f800001, 0x00000000, 0x00000000, - 0x00000018, 0x8000ffba, 0x00000010, 0x91d40000, 0x0000000c, 0x29800001, - 0x0000000c, 0x1f800001, 0x00000008, 0x2a000002, 0x00000018, 0x8000ffb5, - 0x00000010, 0xb1a0b012, 0x0000000b, 0x2fdf0002, 0x00000000, 0x2c200000, - 0x00000008, 0x2c800000, 0x00000008, 0x2d000000, 0x00000010, 0x91d40000, - 0x00000008, 0x2d80011c, 0x00000000, 0x00000000, 0x00000010, 0x91de0000, - 0x0000000f, 0x47600008, 0x0000000f, 0x060e0001, 0x00000010, 0x001f0000, - 0x00000000, 0x0f580000, 0x00000000, 0x0a640000, 0x00000000, 0x0ae50000, - 0x00000000, 0x0b660000, 0x00000000, 0x0d610000, 0x00000018, 0x80000013, - 0x0000000f, 0x47600008, 0x0000000b, 0x2fdf0002, 0x00000008, 0x2c800000, - 0x00000008, 0x2d000000, 0x00000010, 0x91d40000, 0x00000008, 0x2d80011c, - 0x0000000f, 0x060e0001, 0x00000010, 0x001f0000, 0x00000000, 0x0f580000, - 0x00000010, 0x91de0000, 0x00000000, 0x0a640000, 0x00000000, 0x0ae50000, - 0x00000000, 0x0b660000, 0x00000000, 0x0d610000, 0x00000000, 0x02620000, - 0x0000000b, 0x2fdf0002, 0x00000000, 0x309a0000, 0x00000000, 0x31040000, - 0x00000000, 0x0c961800, 0x00000009, 0x0c99ffff, 0x00000004, 0xcc993400, - 0x00000010, 0xb1963202, 0x00000008, 0x0f800000, 0x0000000c, 0x29800001, - 0x00000010, 0x00220002, 0x0000000c, 0x29520001, 0x0000000c, 0x29520000, - 0x00000008, 0x22000001, 0x0000000c, 0x1f800001, 0x00000000, 0x2adf0000, - 0x00000008, 0x2a000003, 0x00000018, 0x8000ff83, 0x00000010, 0xb1a0b01d, - 0x0000000b, 0x2fdf0002, 0x00000000, 0x2c200000, 0x00000008, 0x2c8000b0, - 0x00000008, 0x2d000008, 0x00000010, 0x91d40000, 0x00000008, 0x2d800150, - 0x00000000, 0x00000000, 0x00000010, 0x205f0000, 0x00000008, 0x2c800000, - 0x00000008, 0x2d000000, 0x00000008, 0x2d800108, 0x00000000, 0x00000000, - 0x00000010, 0x91de0000, 0x0000000f, 0x47600008, 0x00000000, 0x060e0000, - 0x00000010, 0x001f0000, 0x00000000, 0x0f580000, 0x00000010, 0x91de0000, - 0x00000000, 0x0a640000, 0x00000000, 0x0ae50000, 0x00000000, 0x0b670000, - 0x00000000, 0x0d620000, 0x00000000, 0x0ce71800, 0x00000009, 0x0c99ffff, - 0x00000004, 0xcc993400, 0x00000010, 0xb1963220, 0x00000008, 0x0f800000, - 0x00000018, 0x8000001e, 0x0000000f, 0x47600008, 0x0000000b, 0x2fdf0002, - 0x00000008, 0x2c8000b0, 0x00000008, 0x2d000008, 0x00000010, 0x91d40000, - 0x00000008, 0x2d80012c, 0x0000000f, 0x060e0001, 0x00000010, 0x001f0000, - 0x00000000, 0x0f580000, 0x00000010, 0x91de0000, 0x00000000, 0x0a640000, - 0x00000000, 0x0ae50000, 0x00000000, 0x0b670000, 0x00000000, 0x0d620000, - 0x00000000, 0x02630000, 0x0000000f, 0x47620010, 0x00000000, 0x0ce71800, - 0x0000000b, 0x2fdf0002, 0x00000000, 0x311a0000, 0x00000000, 0x31840000, - 0x0000000b, 0xc20000ff, 0x00000002, 0x42040000, 0x00000001, 0x31620800, - 0x0000000f, 0x020e0010, 0x00000002, 0x31620800, 0x00000009, 0x0c99ffff, - 0x00000004, 0xcc993400, 0x00000010, 0xb1963202, 0x00000008, 0x0f800000, - 0x0000000c, 0x29800001, 0x0000000c, 0x1f800001, 0x0000000c, 0x61420006, - 0x00000008, 0x22000008, 0x00000000, 0x2adf0000, 0x00000008, 0x2a000004, - 0x00000018, 0x8000ff42, 0x00000008, 0x2c8000b0, 0x00000008, 0x2d000008, - 0x00000010, 0x91a0b008, 0x00000010, 0x91d40000, 0x0000000c, 0x31620018, - 0x00000008, 0x2d800001, 0x00000000, 0x00000000, 0x00000010, 0x91de0000, - 0x00000008, 0xac000001, 0x00000018, 0x8000000e, 0x00000000, 0x0380b000, - 0x0000000b, 0x2fdf0002, 0x00000000, 0x2c004000, 0x00000010, 0x91d40000, - 0x00000008, 0x2d800101, 0x00000000, 0x00000000, 0x00000010, 0x91de0000, - 0x0000000c, 0x31620018, 0x00000008, 0x2d800001, 0x00000000, 0x00000000, - 0x00000010, 0x91de0000, 0x0000000b, 0x2fdf0002, 0x00000000, 0x2c000e00, - 0x0000000c, 0x29800001, 0x0000000c, 0x1f800001, 0x00000008, 0x2a000007, - 0x00000018, 0x8000ff27, 0x00000010, 0xb1a0b016, 0x0000000b, 0x2fdf0002, - 0x00000000, 0x03d80000, 0x00000000, 0x2c200000, 0x00000008, 0x2c8000b0, - 0x00000008, 0x2d000008, 0x00000010, 0x91d40000, 0x00000008, 0x2d800150, - 0x00000000, 0x00000000, 0x00000010, 0x205f0000, 0x00000008, 0x2c800000, - 0x00000008, 0x2d000000, 0x00000008, 0x2d800108, 0x00000008, 0x07000001, - 0x00000010, 0xb5de1c00, 0x00000010, 0x2c620002, 0x00000018, 0x8000000a, - 0x0000000b, 0x2fdf0002, 0x00000000, 0x2c070000, 0x0000000c, 0x1f800001, - 0x00000010, 0x91de0000, 0x00000018, 0x8000ff11, 0x00000008, 0x2c8000b0, - 0x00000008, 0x2d000008, 0x00000010, 0x91d40000, 0x00000008, 0x2d800108, - 0x0000000c, 0x29800001, 0x0000000c, 0x1f800001, 0x00000010, 0x91de0000, - 0x00000000, 0x2adf0000, 0x00000008, 0x2a00000a, 0x00000018, 0x8000ff07, - 0x00000000, 0x82265600, 0x0000000f, 0x47220008, 0x00000009, 0x070e000f, - 0x00000008, 0x070e0008, 0x00000008, 0x02800001, 0x00000007, 0x02851c00, - 0x00000008, 0x82850001, 0x00000000, 0x02840a00, 0x00000007, 0x42851c00, - 0x00000003, 0xc3aa5200, 0x00000000, 0x03b10e00, 0x00000010, 0x001f0000, - 0x0000000f, 0x0f280007, 0x00000007, 0x4b071c00, 0x00000000, 0x00000000, - 0x0000000f, 0x0a960003, 0x00000000, 0x0a955c00, 0x00000000, 0x4a005a00, - 0x00000000, 0x0c960a00, 0x00000009, 0x0c99ffff, 0x00000008, 0x0d00ffff, - 0x00000010, 0xb1963202, 0x00000008, 0x0f800005, 0x00000010, 0x00220020, - 0x00000000, 0x02a70000, 0x00000010, 0xb1850002, 0x00000008, 0x82850200, - 0x00000000, 0x02000000, 0x00000000, 0x03a60000, 0x00000018, 0x8000004e, - 0x00000000, 0x072b0000, 0x00000001, 0x878c1c00, 0x00000000, 0x870e1e00, - 0x00000000, 0x860c1e00, 0x00000000, 0x03061e00, 0x00000010, 0xb18e0003, - 0x00000018, 0x80000047, 0x00000018, 0x8000fffa, 0x00000010, 0x918c0003, - 0x00000010, 0xb1870002, 0x00000018, 0x80000043, 0x00000010, 0x91d40000, - 0x0000000c, 0x29800001, 0x00000000, 0x2a860000, 0x00000000, 0x230c0000, - 0x00000000, 0x2b070000, 0x00000010, 0xb187000e, 0x00000008, 0x2a000008, - 0x00000018, 0x8000003b, 0x00000010, 0x91d40000, 0x00000000, 0x28d18c00, - 0x00000000, 0x2a860000, 0x00000000, 0x230c0000, 0x00000000, 0x2b070000, - 0x00000018, 0x8000fff8, 0x00000010, 0x91d40000, 0x0000000c, 0x29800001, - 0x00000000, 0x2aab0000, 0x00000000, 0xa3265600, 0x00000000, 0x2b000000, - 0x0000000c, 0x1f800001, 0x00000008, 0x2a000008, 0x00000018, 0x8000fec8, - 0x00000010, 0x91d40000, 0x0000000c, 0x29800001, 0x0000000c, 0x1f800001, - 0x00000008, 0x2a000009, 0x00000018, 0x8000fec3, 0x00000010, 0x91d40000, - 0x0000000c, 0x29800001, 0x0000000c, 0x1f800001, 0x00000000, 0x29420000, - 0x00000008, 0x2a000002, 0x00000018, 0x8000febd, 0x00000018, 0x8000febc, - 0x00000010, 0xb1bcb016, 0x0000000b, 0x2fdf0002, 0x00000000, 0x03d80000, - 0x00000000, 0x2c3c0000, 0x00000008, 0x2c8000b0, 0x00000008, 0x2d000008, - 0x00000010, 0x91d40000, 0x00000008, 0x2d800150, 0x00000000, 0x00000000, - 0x00000010, 0x205f0000, 0x00000008, 0x2c800000, 0x00000008, 0x2d000000, - 0x00000008, 0x2d800108, 0x00000008, 0x07000001, 0x00000010, 0xb5de1c00, - 0x00000010, 0x2c620002, 0x00000018, 0x8000000a, 0x0000000b, 0x2fdf0002, - 0x00000000, 0x2c070000, 0x0000000c, 0x1f800000, 0x00000010, 0x91de0000, - 0x00000018, 0x8000fea6, 0x00000008, 0x2c8000b0, 0x00000008, 0x2d000008, - 0x00000010, 0x91d40000, 0x00000008, 0x2d800108, 0x0000000c, 0x29800000, - 0x0000000c, 0x1f800000, 0x00000010, 0x91de0000, 0x00000000, 0x2adf0000, - 0x00000008, 0x2a000006, 0x00000018, 0x8000fe9c, 0x00000008, 0x03050004, - 0x00000006, 0x83040c00, 0x00000008, 0x02850200, 0x00000000, 0x86050c00, - 0x00000001, 0x860c0e00, 0x00000008, 0x02040004, 0x00000000, 0x02041800, - 0x00000000, 0x83871800, 0x00000018, 0x00020000 }; +static u32 bnx2_RXP_b06FwRodataAddr = 0x08005890; +static int bnx2_RXP_b06FwRodataLen = 0x28; +static u32 bnx2_RXP_b06FwBssAddr = 0x08005900; +static int bnx2_RXP_b06FwBssLen = 0x13a4; +static u32 bnx2_RXP_b06FwSbssAddr = 0x080058e0; +static int bnx2_RXP_b06FwSbssLen = 0x1c; +static u8 bnx2_RXP_b06FwText[] = { + 0x1f, 0x8b, 0x08, 0x08, 0x07, 0x87, 0x41, 0x44, 0x00, 0x03, 0x74, 0x65, + 0x73, 0x74, 0x31, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0xed, 0x5c, 0x5d, 0x6c, + 0x1c, 0xd7, 0x75, 0x3e, 0xf3, 0x43, 0x71, 0x49, 0x91, 0xd4, 0x70, 0xb9, + 0x62, 0x57, 0x12, 0x65, 0xed, 0x8a, 0x43, 0x71, 0x6d, 0x31, 0xce, 0x50, + 0x58, 0xdb, 0x82, 0xb1, 0x48, 0xc7, 0xb3, 0xa4, 0xc8, 0x24, 0x02, 0x42, + 0x1b, 0x42, 0xab, 0xa4, 0xa9, 0xc1, 0x90, 0x72, 0x91, 0x22, 0x2c, 0xa0, + 0x1a, 0x79, 0xf0, 0x43, 0x10, 0x2f, 0x56, 0x3f, 0xa6, 0xd1, 0x8d, 0x96, + 0xb6, 0x1c, 0x53, 0x08, 0x82, 0x82, 0xe5, 0x52, 0x52, 0x0b, 0x2c, 0xb4, + 0x96, 0xed, 0x36, 0x7e, 0xa8, 0x23, 0x9a, 0x92, 0x8d, 0xa6, 0x68, 0x81, + 0x22, 0xad, 0xd1, 0xf4, 0x4d, 0x95, 0x9a, 0x4a, 0x75, 0x5f, 0xd4, 0xa2, + 0x48, 0xda, 0x46, 0xcd, 0xf4, 0xfb, 0xee, 0xcc, 0x88, 0xd4, 0x9a, 0xb2, + 0x2c, 0x3b, 0x0d, 0x62, 0x74, 0x0e, 0x30, 0xd8, 0xb9, 0x7f, 0xe7, 0xef, + 0x9e, 0x73, 0xee, 0x39, 0x77, 0x28, 0x7d, 0xa5, 0x43, 0xda, 0x25, 0x84, + 0x4e, 0x3c, 0x99, 0xc3, 0xcf, 0x3c, 0xfd, 0xe0, 0xc3, 0x0f, 0xee, 0xc1, + 0xeb, 0xb0, 0xa1, 0x6d, 0xd0, 0xa3, 0xfe, 0x18, 0x62, 0x88, 0x21, 0x86, + 0x18, 0x62, 0x88, 0x21, 0x86, 0x18, 0x62, 0x88, 0x21, 0x86, 0x18, 0x62, + 0x88, 0x21, 0x86, 0x18, 0x62, 0x88, 0x21, 0x86, 0x18, 0x62, 0x88, 0x21, + 0x86, 0x18, 0x62, 0x88, 0x21, 0x86, 0x18, 0x62, 0x88, 0x21, 0x86, 0x18, + 0x62, 0x88, 0x21, 0x86, 0x18, 0x62, 0x88, 0x21, 0x86, 0x18, 0x62, 0x88, + 0x21, 0x86, 0x18, 0x62, 0x88, 0x21, 0x86, 0xff, 0xef, 0x60, 0x88, 0x58, + 0xfc, 0xed, 0x0c, 0x1f, 0x49, 0xe8, 0x85, 0xcb, 0x07, 0x3d, 0x5b, 0x12, + 0x46, 0x61, 0x69, 0x66, 0xda, 0x16, 0x71, 0xeb, 0xbb, 0x33, 0x45, 0xf9, + 0x1f, 0xbf, 0x94, 0x32, 0x85, 0xfd, 0xdb, 0x0b, 0x37, 0x9f, 0x7d, 0xf3, + 0x91, 0xec, 0x8d, 0x05, 0x43, 0x12, 0x56, 0xe1, 0xe8, 0xb0, 0xb5, 0x4b, + 0x12, 0x7d, 0x58, 0xf3, 0xdd, 0xc1, 0xcf, 0x59, 0xd2, 0x15, 0xe1, 0xba, + 0xee, 0xbf, 0x39, 0x68, 0xc9, 0x2b, 0x8d, 0x94, 0x5c, 0x68, 0x6c, 0xdf, + 0x24, 0x5d, 0xd9, 0x52, 0x09, 0xfd, 0x6e, 0x8a, 0xe3, 0x96, 0x94, 0xab, + 0x2d, 0xe2, 0x2a, 0xba, 0x7d, 0x5a, 0x71, 0xfe, 0x3e, 0xcd, 0x9b, 0x7f, + 0x9e, 0xff, 0x1e, 0x24, 0xa5, 0xcb, 0x7d, 0x68, 0xf7, 0xa1, 0xcd, 0xf7, + 0x81, 0xf4, 0x94, 0x98, 0x72, 0xa4, 0x91, 0x90, 0xa3, 0xd5, 0x8c, 0xe8, + 0x05, 0x71, 0xbd, 0xbc, 0x9d, 0x2e, 0xa3, 0x6f, 0xea, 0x00, 0xdb, 0x29, + 0xe0, 0xf9, 0x0e, 0xd7, 0x59, 0x5e, 0x5e, 0x4a, 0xb7, 0xc6, 0x14, 0x0d, + 0x8e, 0xb1, 0x0f, 0xbf, 0x58, 0x5f, 0xae, 0x76, 0x00, 0x6f, 0xd6, 0x71, + 0x41, 0xdc, 0x73, 0x2c, 0xd0, 0xf6, 0xfd, 0xdf, 0x75, 0x32, 0xb2, 0xe2, + 0x74, 0x81, 0xa7, 0x16, 0x69, 0xb5, 0xc5, 0xd2, 0x0b, 0xb6, 0xb5, 0x22, + 0x6d, 0x1c, 0xeb, 0x34, 0x0a, 0xbe, 0x3f, 0x9d, 0x97, 0xae, 0xa0, 0x6f, + 0xb7, 0xe2, 0x63, 0x72, 0x42, 0xc3, 0xbc, 0x57, 0x49, 0x0f, 0x3a, 0xe2, + 0x3b, 0x7f, 0xf3, 0x52, 0xac, 0x6c, 0x97, 0xc9, 0x54, 0xf6, 0xa0, 0x1b, + 0xd0, 0x74, 0x3d, 0x67, 0x2b, 0x70, 0x6a, 0xe0, 0x4f, 0xdb, 0x81, 0xf5, + 0xee, 0x0a, 0x68, 0x1a, 0x85, 0xcd, 0x62, 0x6c, 0x66, 0x9f, 0xe8, 0x3b, + 0x87, 0x93, 0xe1, 0x78, 0x97, 0x36, 0x32, 0x6f, 0x88, 0x6e, 0xff, 0x81, + 0xe6, 0xd5, 0x7a, 0xe5, 0xd8, 0xbc, 0x8e, 0x77, 0x5d, 0xae, 0xe6, 0x4b, + 0x9a, 0xdb, 0xa8, 0x68, 0xde, 0xd9, 0x59, 0xad, 0x78, 0xd6, 0x94, 0xa3, + 0xb6, 0x7f, 0xe1, 0xb4, 0x73, 0x42, 0x1b, 0x39, 0x7b, 0x46, 0x1b, 0x3d, + 0xfb, 0x86, 0x36, 0xde, 0xd8, 0xb2, 0x49, 0xda, 0xb3, 0xd0, 0x1e, 0x71, + 0x90, 0xbf, 0x4f, 0x87, 0xba, 0xec, 0xa2, 0xde, 0x4a, 0xe4, 0x7d, 0x9f, + 0xf3, 0x86, 0xe6, 0x55, 0x6d, 0x8b, 0xfb, 0xe6, 0xa6, 0x22, 0x1a, 0xed, + 0x72, 0x74, 0xde, 0x94, 0x63, 0xd5, 0x94, 0x3c, 0x57, 0x2d, 0x29, 0x5a, + 0x86, 0x5d, 0xd2, 0xbc, 0x06, 0xc7, 0x2b, 0xa0, 0x75, 0x42, 0xdb, 0x07, + 0x9a, 0xde, 0x59, 0x29, 0x5d, 0x71, 0xe6, 0x40, 0xaf, 0x03, 0x78, 0xff, + 0x58, 0x1b, 0x6d, 0xf4, 0x6a, 0xde, 0xc9, 0x9b, 0xe2, 0x39, 0x59, 0xeb, + 0x4b, 0x62, 0xba, 0xb0, 0x01, 0xc8, 0x0c, 0xfd, 0x38, 0xd0, 0x49, 0xca, + 0xf7, 0xf5, 0x82, 0xff, 0x2c, 0x74, 0x6f, 0x5d, 0xa1, 0xfc, 0x8d, 0x5e, + 0x29, 0xcf, 0x53, 0xd7, 0xa6, 0x36, 0x52, 0xf5, 0x2f, 0x78, 0x8e, 0xf4, + 0x19, 0xe2, 0xfb, 0x47, 0x9d, 0x81, 0xf4, 0x21, 0x39, 0x03, 0xdc, 0x75, + 0xad, 0xd8, 0xa0, 0xae, 0xc1, 0xdf, 0x2d, 0x39, 0x02, 0xbd, 0x15, 0x9d, + 0x5e, 0x99, 0xb4, 0xb2, 0x2e, 0xf6, 0x68, 0x53, 0x20, 0x57, 0x32, 0xb4, + 0x17, 0xd2, 0xe7, 0xde, 0x67, 0xd3, 0x9e, 0xa1, 0xcb, 0x53, 0x2f, 0x3d, + 0xdf, 0xb3, 0x38, 0xb4, 0x91, 0x32, 0x43, 0xff, 0xf2, 0x45, 0xcf, 0xf6, + 0xb6, 0xb4, 0x48, 0x29, 0x6d, 0x48, 0x16, 0xfb, 0xb4, 0x43, 0x4e, 0x3b, + 0x22, 0x87, 0x2a, 0xd0, 0x8d, 0x6d, 0x5a, 0x8b, 0x62, 0x67, 0xca, 0x32, + 0x50, 0x32, 0x75, 0x74, 0x26, 0x49, 0x97, 0x3a, 0xd2, 0xe5, 0x7a, 0x9e, + 0x7a, 0xa2, 0x3d, 0x7f, 0x28, 0x5d, 0x69, 0xab, 0xba, 0x5a, 0xd5, 0xd3, + 0xf8, 0x2f, 0x5d, 0x4f, 0xd4, 0xc9, 0x72, 0x28, 0xb7, 0x03, 0xdc, 0x8f, + 0x40, 0x5f, 0xe2, 0xea, 0xc3, 0x0f, 0xb1, 0x6f, 0x93, 0x51, 0xb0, 0xd3, + 0x17, 0x61, 0x14, 0x7a, 0x61, 0x37, 0x64, 0x19, 0xa6, 0xee, 0xe0, 0xc3, + 0x1f, 0x49, 0x5e, 0xf9, 0xd5, 0x90, 0x97, 0xfc, 0xdb, 0x32, 0x55, 0x49, + 0x80, 0x06, 0x65, 0xd4, 0xe5, 0xbd, 0x7c, 0x64, 0x1b, 0x7b, 0x20, 0x5f, + 0x5e, 0xa6, 0xbe, 0x45, 0x7f, 0xa2, 0xfd, 0xf3, 0x9d, 0xb2, 0xfe, 0xcc, + 0xbf, 0xee, 0x7c, 0x92, 0xf6, 0x96, 0x7c, 0x27, 0xe4, 0x78, 0x35, 0xc9, + 0x3d, 0xd4, 0x56, 0x54, 0x6c, 0x8a, 0x64, 0x14, 0xdd, 0x28, 0x74, 0x48, + 0x51, 0xed, 0xf7, 0x5e, 0xd0, 0x43, 0x2c, 0xa8, 0xf2, 0xbd, 0xa0, 0x64, + 0x9b, 0xb6, 0xed, 0xcc, 0x11, 0xc9, 0xc2, 0xbe, 0x45, 0x8e, 0xcc, 0x99, + 0x32, 0x6d, 0xff, 0x63, 0xa7, 0xb4, 0x2f, 0xdf, 0x6f, 0xa8, 0xb8, 0xae, + 0xf7, 0x6e, 0x90, 0x4d, 0xe0, 0x77, 0xf9, 0x7e, 0x5d, 0xe4, 0xa6, 0x59, + 0xc8, 0x5a, 0x23, 0x08, 0xf6, 0x46, 0x81, 0xb1, 0x4c, 0x43, 0x2c, 0x93, + 0x44, 0x8b, 0x4d, 0x7d, 0xf9, 0xfe, 0xf8, 0xf0, 0xdd, 0xf5, 0x75, 0x64, + 0x9e, 0xb4, 0xa9, 0x2f, 0xc6, 0xa8, 0x12, 0xf4, 0xc1, 0xf8, 0x74, 0xbb, + 0xae, 0x8a, 0xa1, 0xae, 0x46, 0xfe, 0xef, 0xed, 0xc2, 0xf5, 0xaa, 0xa2, + 0x79, 0xce, 0xbb, 0xa1, 0x2f, 0xd8, 0x32, 0x02, 0x7f, 0x37, 0xec, 0x4f, + 0xcb, 0x91, 0x54, 0x76, 0xc2, 0x95, 0xc0, 0xe6, 0xaf, 0xad, 0xb1, 0xf9, + 0xd1, 0xbb, 0xc8, 0x75, 0x3c, 0x94, 0xcb, 0x0d, 0xe5, 0x1a, 0x85, 0x5c, + 0x63, 0x90, 0x6b, 0xe5, 0x23, 0xc8, 0xb5, 0xf2, 0x91, 0xe5, 0xd2, 0xa4, + 0xec, 0x3c, 0x08, 0x5a, 0xa6, 0xfc, 0xab, 0x13, 0xd8, 0xf2, 0xbf, 0x38, + 0x9f, 0x14, 0x19, 0x7c, 0x7f, 0x70, 0xd8, 0x16, 0xef, 0x5b, 0xe0, 0xd5, + 0x71, 0x40, 0x8b, 0xef, 0xef, 0x97, 0xe1, 0x6e, 0xfe, 0x38, 0x8b, 0x7d, + 0x5d, 0xcf, 0x1f, 0x29, 0x87, 0x3e, 0x7c, 0xef, 0xfe, 0xa8, 0x6b, 0x1f, + 0x55, 0x0e, 0xc6, 0x9c, 0x4f, 0x35, 0x9d, 0xab, 0x1f, 0x56, 0x86, 0xf5, + 0x63, 0xca, 0x2f, 0x4f, 0x86, 0xc7, 0x64, 0x72, 0x33, 0xed, 0xa9, 0xa4, + 0x8d, 0x0c, 0x92, 0xef, 0xb5, 0xfc, 0x4a, 0x26, 0xe0, 0x0d, 0x39, 0xd1, + 0xd2, 0x46, 0x39, 0xb2, 0x60, 0x49, 0x69, 0xe9, 0x4e, 0x71, 0x57, 0x03, + 0x6f, 0xb4, 0x47, 0xf6, 0x7d, 0xd2, 0x7c, 0x2a, 0xc8, 0x2b, 0x2e, 0x54, + 0x91, 0x83, 0x56, 0x13, 0x72, 0xd9, 0x48, 0xcb, 0x9b, 0x83, 0x87, 0xe5, + 0xf3, 0xd5, 0x24, 0xe8, 0x31, 0x9f, 0x2c, 0xe7, 0x10, 0x17, 0xb5, 0xb2, + 0x63, 0x08, 0x79, 0xaf, 0xd9, 0x9c, 0x13, 0xc4, 0x96, 0x72, 0x10, 0x83, + 0x5d, 0x6f, 0x50, 0xe5, 0x14, 0x90, 0x4f, 0x64, 0x0c, 0xb1, 0xb7, 0x66, + 0xb3, 0xcd, 0xfe, 0xa0, 0xef, 0xb3, 0x95, 0x5e, 0xad, 0xc8, 0xbc, 0x64, + 0xf0, 0xa6, 0x4c, 0x3b, 0x41, 0xdf, 0xe7, 0x2a, 0xa3, 0x9b, 0x98, 0x1f, + 0x1a, 0x05, 0xc9, 0x94, 0x9d, 0xf7, 0x7c, 0xd7, 0xba, 0x7d, 0xcd, 0xfa, + 0x78, 0xb2, 0x13, 0x81, 0xce, 0x45, 0xfb, 0xaa, 0xad, 0xf7, 0xb6, 0x4a, + 0x09, 0x27, 0x5d, 0xd6, 0x1a, 0x47, 0xe7, 0xbe, 0x4a, 0x79, 0x5b, 0xab, + 0xdc, 0x34, 0x80, 0x3f, 0x6d, 0x68, 0x62, 0x1e, 0xaa, 0x94, 0xbb, 0xd9, + 0xa6, 0xbe, 0x74, 0x4d, 0x12, 0xa3, 0x15, 0x5f, 0xae, 0x3a, 0x41, 0xee, + 0x63, 0x68, 0x7a, 0x6f, 0x5b, 0xb8, 0x56, 0xd7, 0x76, 0x39, 0x97, 0x44, + 0x3a, 0x0e, 0x55, 0xc4, 0x2a, 0x56, 0x76, 0x39, 0x6f, 0x4b, 0xb9, 0xa7, + 0x6d, 0x75, 0x5d, 0x8a, 0xeb, 0x76, 0x0e, 0xaf, 0x9d, 0xbb, 0xcb, 0xb9, + 0x28, 0xe5, 0x2d, 0x6d, 0xab, 0xb4, 0xd2, 0x58, 0xdb, 0x17, 0xac, 0xe5, + 0xf8, 0x66, 0x71, 0xbb, 0x39, 0x47, 0xef, 0x6d, 0xbf, 0x45, 0x43, 0x32, + 0xc5, 0x4a, 0xb9, 0xa7, 0x7d, 0x15, 0xaf, 0x4d, 0xbc, 0xde, 0x1a, 0xbc, + 0xc4, 0xd9, 0xbe, 0x8a, 0x33, 0x07, 0x9c, 0x43, 0xab, 0x38, 0x39, 0x7e, + 0x58, 0x8a, 0x38, 0xd3, 0x5a, 0x0a, 0x32, 0xbc, 0x54, 0xc9, 0x48, 0x79, + 0x28, 0x01, 0xdd, 0xf7, 0x1f, 0xfc, 0x9a, 0xaa, 0x43, 0xcc, 0x61, 0x0f, + 0xba, 0x32, 0x55, 0x5e, 0x87, 0xd8, 0x08, 0xdb, 0xf8, 0x5a, 0x5d, 0x86, + 0x17, 0xeb, 0xa6, 0x1c, 0x6f, 0x70, 0xbf, 0x98, 0xe3, 0x05, 0x75, 0xc6, + 0x85, 0x46, 0x4e, 0xdb, 0x87, 0xbd, 0x66, 0x9d, 0xb0, 0xaf, 0x61, 0x6a, + 0xa3, 0x3c, 0x1f, 0x80, 0x97, 0x76, 0x7e, 0xac, 0x41, 0xdb, 0x79, 0x03, + 0xb6, 0x41, 0xce, 0xa3, 0x9c, 0xbd, 0x95, 0xb9, 0x53, 0x66, 0xd1, 0x51, + 0x75, 0x88, 0x56, 0xcb, 0x77, 0x20, 0x07, 0x4d, 0xa0, 0xd6, 0x80, 0xcd, + 0xdb, 0x78, 0x6f, 0x70, 0xde, 0x32, 0xe6, 0x6d, 0xe0, 0x3c, 0xec, 0xcd, + 0x25, 0xe5, 0x0f, 0xa6, 0xcd, 0xf1, 0x77, 0xb1, 0xc7, 0x68, 0xd7, 0x59, + 0x57, 0x58, 0x02, 0x5f, 0xc1, 0x3e, 0xa2, 0x6e, 0x48, 0xed, 0x60, 0x7e, + 0x8f, 0xb9, 0x19, 0xcc, 0xcd, 0x66, 0x18, 0xcf, 0x3d, 0xfb, 0x99, 0x0e, + 0xe9, 0x42, 0xbb, 0xce, 0x35, 0xd9, 0x0c, 0x72, 0x5b, 0xdf, 0xcb, 0xb7, + 0xc9, 0x4a, 0xca, 0xbf, 0x60, 0xd8, 0xd1, 0xdc, 0x08, 0x6f, 0xf3, 0x5c, + 0xe6, 0xc5, 0xc4, 0xbd, 0x21, 0xcc, 0x83, 0xc7, 0xc5, 0x6d, 0xfc, 0x49, + 0xb7, 0x74, 0xb9, 0xf8, 0x8d, 0xe6, 0x4c, 0x6f, 0x0e, 0x6a, 0x2e, 0xbe, + 0xb7, 0x50, 0x3e, 0x17, 0xe7, 0xa1, 0x56, 0xac, 0x66, 0x26, 0x59, 0x1f, + 0x15, 0xeb, 0x6c, 0xef, 0x85, 0x3f, 0x04, 0x75, 0xd7, 0x85, 0x5b, 0xbe, + 0x70, 0x19, 0x7a, 0x4b, 0x43, 0x6f, 0x29, 0x39, 0xdf, 0x60, 0x9d, 0xe6, + 0x42, 0x5f, 0x19, 0xf1, 0x1a, 0xe3, 0x58, 0x2b, 0x87, 0x81, 0x03, 0x3a, + 0x17, 0x47, 0x2f, 0x64, 0x65, 0xca, 0xda, 0x1d, 0xf1, 0x00, 0x5c, 0x88, + 0x1f, 0x85, 0x36, 0xf4, 0xf1, 0x1d, 0x9a, 0x53, 0xff, 0x86, 0x7f, 0x94, + 0xed, 0x09, 0xbd, 0x30, 0xd6, 0xd4, 0xbf, 0x6e, 0xfc, 0xa1, 0x1c, 0x68, + 0x33, 0x06, 0x31, 0xfe, 0xe8, 0xa8, 0xf3, 0x18, 0x8b, 0x48, 0xd7, 0x92, + 0x23, 0x4b, 0x23, 0xdc, 0x37, 0x8b, 0xf1, 0xa7, 0x5c, 0xe7, 0x9e, 0x29, + 0x5c, 0xc0, 0x19, 0xad, 0xf1, 0xfd, 0x11, 0x87, 0x6b, 0x7c, 0x99, 0x70, + 0x3a, 0xc4, 0x48, 0x96, 0xb4, 0xc7, 0x07, 0x11, 0x7b, 0x1e, 0xe0, 0x3e, + 0x32, 0x06, 0x6d, 0x17, 0xb0, 0xea, 0xb4, 0x3c, 0x3c, 0xc8, 0x75, 0xa0, + 0xdd, 0x2a, 0x7a, 0x92, 0x34, 0xf3, 0x21, 0x4f, 0x43, 0xdd, 0x81, 0xbe, + 0x06, 0xac, 0x40, 0x7f, 0x9f, 0xe9, 0x5e, 0xd5, 0x1f, 0xd7, 0x35, 0xf3, + 0xcb, 0x18, 0x96, 0x90, 0x81, 0x33, 0x1b, 0x65, 0xe7, 0xa2, 0x25, 0xf6, + 0x99, 0x55, 0xfe, 0x76, 0x9e, 0x5b, 0xcb, 0x5f, 0xf4, 0x7f, 0x15, 0x5c, + 0xd0, 0xc5, 0x8e, 0xfa, 0x1e, 0x4b, 0x05, 0xb8, 0xa3, 0xf6, 0x7b, 0xe1, + 0x5e, 0xf1, 0xfd, 0x99, 0x70, 0x4f, 0xb0, 0x07, 0x88, 0x95, 0xe7, 0x6f, + 0xc5, 0xa9, 0x0c, 0xf6, 0x06, 0xb6, 0xa7, 0xe2, 0x11, 0xe3, 0x18, 0xed, + 0xbb, 0x63, 0xd2, 0x2c, 0xb0, 0x8e, 0xe6, 0x3e, 0xc9, 0x44, 0xb9, 0x22, + 0xa5, 0xad, 0x85, 0x67, 0x7d, 0xd8, 0xcf, 0xa4, 0xa5, 0x6c, 0xaf, 0x63, + 0xaf, 0x97, 0x37, 0xa0, 0x1b, 0x8c, 0xc1, 0x26, 0xf5, 0x42, 0x42, 0x8a, + 0x8d, 0x44, 0xc2, 0x3c, 0x31, 0xf0, 0x23, 0xcf, 0x48, 0x24, 0xf4, 0x13, + 0x81, 0x9d, 0x4d, 0xd6, 0x6f, 0x20, 0x56, 0x6a, 0x72, 0x74, 0xe8, 0x86, + 0xcf, 0x1a, 0xd8, 0xdb, 0x0b, 0x9b, 0x1b, 0x82, 0xcf, 0x80, 0x8f, 0x72, + 0xa3, 0xa3, 0x37, 0xe0, 0xed, 0x2b, 0x11, 0x8f, 0xa6, 0x8e, 0xdc, 0xd3, + 0xcb, 0xfb, 0xbe, 0x51, 0xd8, 0x90, 0x98, 0xce, 0x8f, 0x6f, 0xd1, 0xcf, + 0xed, 0xdf, 0x62, 0x9c, 0x2b, 0x6d, 0x01, 0x3e, 0xdd, 0xcb, 0xe3, 0xf7, + 0x9c, 0xc8, 0x44, 0x15, 0x3a, 0xdf, 0x03, 0x3d, 0x59, 0xf0, 0xc5, 0x3d, + 0xa6, 0xca, 0xd1, 0xf5, 0x3d, 0x2f, 0x6e, 0x0a, 0x70, 0xf0, 0xfd, 0x27, + 0x7e, 0x70, 0x86, 0x5e, 0x0e, 0xfb, 0x7e, 0x3f, 0xdc, 0x87, 0x5f, 0x45, + 0xb9, 0x78, 0x5e, 0x44, 0xb2, 0xad, 0x3d, 0x37, 0xb2, 0xe3, 0x25, 0x9c, + 0x33, 0xa7, 0x1d, 0xdf, 0x7f, 0x07, 0xcf, 0x35, 0xa7, 0xd9, 0x46, 0xde, + 0x7f, 0xf6, 0x31, 0x07, 0xf8, 0x2c, 0xce, 0xbd, 0xd1, 0xa6, 0xb3, 0xff, + 0x5e, 0xcf, 0xbd, 0x7b, 0x3f, 0xfb, 0xc9, 0xf3, 0x1d, 0x7d, 0xef, 0x03, + 0xce, 0xfe, 0x0f, 0x5c, 0x77, 0x0f, 0x3e, 0x1b, 0xd8, 0x6d, 0xb1, 0xd1, + 0x1c, 0x5f, 0xee, 0xd5, 0x7f, 0x7f, 0xad, 0xfb, 0x76, 0xff, 0xb5, 0xbb, + 0x6f, 0xf7, 0xdf, 0xcd, 0xdd, 0xbf, 0x18, 0xff, 0xcd, 0x01, 0x0f, 0x7d, + 0x70, 0xad, 0xff, 0xae, 0xe7, 0x93, 0xd4, 0xf7, 0xf3, 0x3d, 0xe5, 0xa1, + 0xce, 0x30, 0x1f, 0x52, 0xe7, 0xf5, 0x17, 0xa7, 0x6d, 0xef, 0x7e, 0x53, + 0x4a, 0xb9, 0x16, 0xc9, 0xe6, 0x6a, 0xb2, 0x43, 0x8e, 0x3b, 0x22, 0x4b, + 0xaa, 0x16, 0x31, 0x51, 0x8b, 0x0f, 0xa0, 0x3e, 0x0b, 0xf4, 0xba, 0xa4, + 0xf4, 0xf2, 0x02, 0x78, 0x89, 0xf0, 0x74, 0xdd, 0x05, 0x0f, 0x71, 0x10, + 0x17, 0xf1, 0x0c, 0xe2, 0x7c, 0xb7, 0xd7, 0xc1, 0x85, 0x73, 0xea, 0x25, + 0xd4, 0x64, 0xb6, 0xde, 0xa3, 0x07, 0x67, 0xb2, 0x5b, 0x96, 0xdd, 0xe9, + 0xeb, 0xf2, 0x05, 0x9e, 0x59, 0x0a, 0xae, 0xce, 0x21, 0x56, 0x0f, 0x8d, + 0x85, 0x75, 0xd2, 0xdc, 0x41, 0xcf, 0x8e, 0xee, 0x49, 0x78, 0x47, 0x92, + 0x90, 0x92, 0x9a, 0xb5, 0x04, 0x1d, 0x68, 0x72, 0x0d, 0x67, 0xd0, 0xd5, + 0xb9, 0x76, 0xe0, 0x45, 0xee, 0x77, 0x20, 0xbb, 0x57, 0xb4, 0x7e, 0xab, + 0x55, 0x6b, 0x87, 0x2f, 0x65, 0xc4, 0x55, 0x6d, 0x9e, 0xd3, 0xa7, 0x66, + 0x16, 0x2b, 0xc8, 0x03, 0x6d, 0x9c, 0xaf, 0x79, 0xbc, 0xd7, 0x49, 0x43, + 0x93, 0x2b, 0x73, 0xba, 0xfc, 0xd3, 0x9c, 0x21, 0xff, 0x8c, 0x3a, 0xf4, + 0x9a, 0x7d, 0x6a, 0xe6, 0xb4, 0x2d, 0xf7, 0x81, 0xd5, 0xf0, 0x0e, 0x4f, + 0x76, 0x9a, 0x42, 0x5b, 0x1d, 0x48, 0xff, 0x8e, 0x20, 0xff, 0xc1, 0x9a, + 0x2b, 0x73, 0xa4, 0xb5, 0x76, 0x8d, 0xf4, 0x22, 0x1f, 0x83, 0x5d, 0x0f, + 0x30, 0x27, 0xe2, 0x7c, 0xd4, 0xab, 0x03, 0xd6, 0x3e, 0xc5, 0x5b, 0x42, + 0x16, 0xeb, 0x9c, 0x6f, 0x82, 0xb7, 0x2e, 0x9c, 0x31, 0x59, 0x6b, 0x52, + 0xfe, 0xb0, 0x5b, 0xe5, 0xaa, 0x1a, 0xfb, 0x0d, 0xb5, 0xc7, 0xef, 0xef, + 0xe7, 0xde, 0x1b, 0x32, 0x95, 0x62, 0x9b, 0x63, 0x59, 0xd4, 0x9c, 0xc4, + 0x97, 0xdd, 0xeb, 0x0a, 0x79, 0x0e, 0xde, 0xaf, 0x08, 0x65, 0xdb, 0x6d, + 0x5d, 0x97, 0xd7, 0x7d, 0xf7, 0x00, 0xe5, 0x89, 0x72, 0x8b, 0x39, 0x9f, + 0xb1, 0xd8, 0x28, 0xcc, 0xc0, 0x8e, 0xbf, 0x2a, 0xdf, 0x6f, 0x1c, 0x92, + 0xef, 0x35, 0x26, 0xe5, 0xcf, 0x1a, 0x5f, 0x96, 0x3f, 0x6d, 0x1c, 0x94, + 0xd7, 0x1b, 0x07, 0xe4, 0xb5, 0xc6, 0x84, 0xbc, 0xda, 0xd8, 0x0f, 0x1b, + 0x1f, 0x87, 0x8d, 0x9f, 0x9a, 0x99, 0xac, 0xf7, 0xcb, 0xd4, 0x49, 0xc4, + 0x20, 0xe7, 0x1b, 0xba, 0xba, 0xe3, 0xb3, 0xe9, 0xe7, 0x2d, 0x32, 0xad, + 0xee, 0xaf, 0x34, 0xe4, 0x89, 0x2d, 0xbc, 0x2b, 0x7c, 0xc5, 0x33, 0x2e, + 0x87, 0xf1, 0xe8, 0xe1, 0x94, 0xb4, 0x03, 0xbf, 0xca, 0x4b, 0x4d, 0x9e, + 0xdb, 0x62, 0x86, 0xf7, 0x9c, 0x87, 0x24, 0xc9, 0xfb, 0xb0, 0x9c, 0x67, + 0xa0, 0xde, 0x5e, 0xd7, 0x27, 0x73, 0xb4, 0x65, 0xe8, 0xc6, 0x95, 0x43, + 0xb0, 0x53, 0xc3, 0x7e, 0xcb, 0xa5, 0x1e, 0x16, 0x97, 0x28, 0xf7, 0x46, + 0x59, 0x5c, 0xa0, 0x6f, 0xff, 0x1b, 0x64, 0x6c, 0x97, 0xda, 0x82, 0x89, + 0xb9, 0x6e, 0x98, 0xab, 0x6c, 0xa7, 0x3d, 0x00, 0x1f, 0xf1, 0x7e, 0x10, + 0x4e, 0xab, 0x09, 0x27, 0xf1, 0x24, 0x54, 0x0c, 0x08, 0x70, 0x5b, 0x52, + 0x5b, 0x4a, 0xca, 0xc2, 0x42, 0x0f, 0x9e, 0x94, 0x2c, 0xd4, 0x6d, 0x3c, + 0x39, 0x3c, 0x43, 0x78, 0xd2, 0xb0, 0x53, 0xca, 0xc8, 0xd8, 0x12, 0xc9, + 0x88, 0x78, 0x5c, 0xed, 0x0d, 0x6b, 0x2a, 0xf2, 0xa3, 0x85, 0xfc, 0x74, + 0x87, 0x7d, 0x1d, 0x52, 0xab, 0x38, 0x32, 0x55, 0xfd, 0x94, 0x3e, 0xa5, + 0x74, 0x07, 0xfc, 0x95, 0x21, 0xb4, 0xef, 0x0f, 0xdb, 0x8f, 0xca, 0xf4, + 0xbc, 0xc8, 0xca, 0xcb, 0x03, 0x7a, 0x51, 0xb5, 0xf7, 0xa2, 0xad, 0xa3, + 0x9d, 0x0d, 0xdb, 0xcc, 0x8f, 0x0e, 0xe0, 0x71, 0xd5, 0xf3, 0xf5, 0xea, + 0xb8, 0x3c, 0x55, 0xed, 0x77, 0x5e, 0x87, 0xcd, 0xbd, 0x65, 0x46, 0xf7, + 0xd2, 0x04, 0x24, 0x79, 0xf6, 0x56, 0x75, 0xf7, 0xf1, 0x04, 0xe2, 0xad, + 0x9b, 0x34, 0xe5, 0x6f, 0x4f, 0x64, 0xad, 0xa7, 0xf5, 0x5c, 0x52, 0xda, + 0x7d, 0xff, 0x71, 0x3b, 0x3b, 0x3b, 0xa9, 0x77, 0xca, 0xdf, 0xbf, 0x98, + 0x91, 0x85, 0xb3, 0x5b, 0x65, 0xa1, 0x06, 0x99, 0x1a, 0xbf, 0x8e, 0x7d, + 0x35, 0xe5, 0xea, 0x9e, 0x47, 0xb1, 0x27, 0x8c, 0x5d, 0x49, 0xe4, 0x6c, + 0x1b, 0xc4, 0xec, 0x25, 0x5d, 0x49, 0x98, 0x85, 0x9c, 0x1c, 0x81, 0xdf, + 0x4f, 0xdb, 0xb9, 0x1e, 0x69, 0xc7, 0x7b, 0x7d, 0x04, 0x7c, 0x5b, 0x32, + 0xd5, 0x6b, 0xc9, 0x99, 0xc1, 0x68, 0xff, 0xb6, 0x62, 0x6e, 0x46, 0x16, + 0xcf, 0x66, 0xf0, 0x9b, 0x83, 0xfd, 0xec, 0x94, 0x57, 0x6a, 0xfd, 0xb2, + 0x54, 0xdb, 0x2a, 0x8b, 0xb5, 0xe6, 0x7d, 0xe8, 0xec, 0x09, 0xe2, 0x1d, + 0xf1, 0xf4, 0x5b, 0x53, 0xfa, 0x56, 0x71, 0xcd, 0x7e, 0xeb, 0x29, 0xfd, + 0x1f, 0xe4, 0x31, 0x33, 0xa0, 0xa9, 0x17, 0x7e, 0xa4, 0xee, 0x84, 0x26, + 0x79, 0xf6, 0x2a, 0xbc, 0x4f, 0x26, 0x49, 0xfb, 0xf5, 0xc6, 0x07, 0xd1, + 0x59, 0xcb, 0xcf, 0x9d, 0x68, 0x52, 0x06, 0xe2, 0xec, 0xbf, 0x71, 0x52, + 0xef, 0x95, 0xe5, 0x6d, 0x0f, 0x58, 0x4f, 0xea, 0xad, 0x88, 0x01, 0x3f, + 0x97, 0x9f, 0xee, 0xd9, 0x24, 0x3f, 0xfc, 0xcd, 0xec, 0xa9, 0x6f, 0x22, + 0xd9, 0xbf, 0xb2, 0xa7, 0x83, 0x71, 0x01, 0xef, 0xec, 0xcf, 0xde, 0x70, + 0x75, 0xea, 0xe1, 0x2f, 0xa0, 0x87, 0xec, 0x9c, 0xba, 0x9b, 0x56, 0x3c, + 0x90, 0x3e, 0xf5, 0x52, 0x06, 0x6f, 0x18, 0xab, 0xf7, 0x03, 0x57, 0x59, + 0xe9, 0xf9, 0x09, 0x27, 0x7b, 0x03, 0xe9, 0xb0, 0xbf, 0x68, 0xf7, 0xa7, + 0x77, 0xea, 0x3b, 0x64, 0x32, 0xfd, 0x80, 0xf5, 0xb4, 0x6c, 0x21, 0xce, + 0xd9, 0x05, 0xc1, 0xda, 0x79, 0xe2, 0xfb, 0x2b, 0xe0, 0x0b, 0x70, 0x28, + 0xff, 0x51, 0x38, 0x77, 0x59, 0x5f, 0xd7, 0x79, 0xc6, 0x63, 0x0c, 0x71, + 0xe1, 0xe2, 0x10, 0x65, 0x40, 0x82, 0x95, 0xca, 0xa6, 0x5d, 0xfd, 0xc3, + 0xc8, 0x47, 0xfc, 0xfd, 0x56, 0x51, 0x27, 0x0f, 0xe7, 0xc0, 0xcb, 0x4f, + 0xc0, 0x7f, 0x3f, 0x70, 0xa2, 0xf6, 0x48, 0x47, 0x74, 0xff, 0x4e, 0xd1, + 0x7d, 0xad, 0x21, 0xe6, 0x2a, 0x5d, 0xf4, 0xd5, 0x75, 0xc8, 0xdd, 0x07, + 0x7b, 0xb5, 0xf0, 0xcb, 0xbd, 0xe9, 0x0c, 0xf7, 0x98, 0xeb, 0x22, 0xba, + 0x11, 0xbf, 0x5c, 0x73, 0x27, 0x1e, 0xee, 0x75, 0x3e, 0xea, 0xd4, 0x03, + 0x09, 0x79, 0xf7, 0x44, 0xb4, 0x37, 0x07, 0x64, 0xba, 0x0a, 0xdd, 0xed, + 0xea, 0x0f, 0xfc, 0x27, 0x1d, 0xf1, 0x40, 0xde, 0xff, 0x06, 0xbc, 0x07, + 0xb8, 0x5b, 0x0b, 0xcd, 0xba, 0xc3, 0x58, 0x3d, 0xa0, 0x31, 0xb6, 0x0e, + 0x4f, 0x57, 0xf6, 0x44, 0xbe, 0x98, 0x84, 0x5f, 0xed, 0xb6, 0x9e, 0x10, + 0xd6, 0x63, 0xc4, 0x9b, 0x94, 0x1f, 0xbe, 0x0c, 0x1e, 0x92, 0xf4, 0x93, + 0x7f, 0x5f, 0xe3, 0x27, 0x1c, 0xdb, 0x2a, 0x35, 0xd4, 0xd4, 0x5e, 0xde, + 0x94, 0x69, 0x25, 0x03, 0xda, 0x35, 0xfa, 0x77, 0x29, 0xf4, 0xef, 0x47, + 0x80, 0xa3, 0x5d, 0x8c, 0x47, 0x1f, 0xc7, 0x59, 0x9d, 0xcd, 0x2c, 0xeb, + 0xcc, 0x03, 0x76, 0x4b, 0x51, 0xdd, 0x4f, 0xdf, 0x8b, 0xee, 0xa2, 0xd8, + 0x94, 0x96, 0x8b, 0x95, 0x28, 0x2e, 0xa5, 0x71, 0x9e, 0xb4, 0xcb, 0xa5, + 0xb9, 0x28, 0xe6, 0xb5, 0xcb, 0x12, 0xf2, 0x9a, 0x95, 0x97, 0x2c, 0x8c, + 0x25, 0xe5, 0xe2, 0x5c, 0x12, 0x31, 0xab, 0x47, 0x56, 0xe6, 0x7a, 0x30, + 0x96, 0xc2, 0xba, 0x14, 0xe6, 0xdb, 0xb2, 0x52, 0xb1, 0x81, 0x27, 0x87, + 0x76, 0x0e, 0xed, 0x21, 0xb9, 0xa4, 0xbe, 0x17, 0x30, 0x2f, 0x18, 0x42, + 0xdc, 0x62, 0x5e, 0x30, 0x82, 0x18, 0x32, 0x81, 0x27, 0x8a, 0x5d, 0xa7, + 0x66, 0xa6, 0x2a, 0xbc, 0x73, 0x84, 0x0e, 0xac, 0x53, 0x33, 0xd3, 0xb6, + 0x89, 0xba, 0xed, 0x1b, 0xda, 0x54, 0x83, 0x72, 0x41, 0xb7, 0x43, 0x1d, + 0xa2, 0x3f, 0x4a, 0x9b, 0xe4, 0x79, 0x67, 0x20, 0xc6, 0x77, 0x01, 0x9f, + 0x23, 0xfa, 0x6f, 0xd0, 0x17, 0xa0, 0xc3, 0x27, 0xba, 0xe4, 0xd2, 0xcb, + 0x8c, 0x35, 0xae, 0xbc, 0x7a, 0x96, 0x3a, 0x2c, 0xf6, 0xac, 0xea, 0x90, + 0x63, 0x0f, 0xe1, 0x8c, 0xd8, 0x0f, 0x7b, 0x32, 0x33, 0x87, 0x90, 0xcb, + 0x7c, 0x1b, 0xf6, 0x59, 0x66, 0xcd, 0x9d, 0x0e, 0x6a, 0x84, 0x20, 0x06, + 0xa0, 0xdd, 0x47, 0x5d, 0xb1, 0xdd, 0x07, 0xbb, 0xe3, 0x58, 0x9f, 0x1a, + 0x5b, 0x04, 0x8e, 0x60, 0x8c, 0xed, 0xcd, 0xb2, 0xa8, 0xc6, 0x0e, 0xaa, + 0xb1, 0xb2, 0xb2, 0x0f, 0x8e, 0x1d, 0x52, 0xb1, 0xe9, 0x7c, 0x23, 0xea, + 0xdf, 0x88, 0x58, 0xc2, 0x7e, 0xf6, 0xe5, 0x61, 0xeb, 0x7b, 0x71, 0xae, + 0x15, 0x64, 0xa9, 0x81, 0x3a, 0x30, 0xff, 0x7b, 0x98, 0xcb, 0x3d, 0xc8, + 0x9e, 0x2a, 0xe9, 0xe4, 0xf1, 0x20, 0xce, 0x83, 0xfd, 0x21, 0xad, 0xb6, + 0x90, 0xaf, 0x03, 0x61, 0xbb, 0x25, 0xa4, 0x4d, 0x3c, 0x36, 0x70, 0x1c, + 0xc3, 0x5a, 0x17, 0x38, 0x18, 0x63, 0x11, 0x23, 0x52, 0x29, 0xe8, 0x82, + 0x34, 0xdb, 0xa4, 0xac, 0xde, 0xf7, 0xc3, 0x76, 0xb9, 0x16, 0x3a, 0xb4, + 0xa2, 0x75, 0xa5, 0x70, 0xcf, 0x53, 0xea, 0x9c, 0xd1, 0x93, 0x9b, 0xc3, + 0x9c, 0x10, 0x7a, 0x45, 0x9c, 0xd5, 0x93, 0x8c, 0x37, 0xef, 0x84, 0x76, + 0xda, 0x8b, 0xbe, 0x87, 0x44, 0xef, 0x65, 0xdf, 0x51, 0xe0, 0x61, 0xed, + 0x3c, 0x0c, 0x99, 0xd9, 0xe6, 0xfa, 0x6c, 0xd3, 0xfa, 0xc4, 0x3a, 0xeb, + 0x3b, 0x9a, 0xfa, 0x32, 0x52, 0x9b, 0xef, 0x52, 0xf1, 0xf2, 0x7c, 0x18, + 0x2f, 0x17, 0x6b, 0x94, 0x05, 0x7e, 0x96, 0x7f, 0x5b, 0xe9, 0xa2, 0x76, + 0x36, 0xb0, 0xf5, 0xa5, 0x93, 0x3c, 0x17, 0x57, 0xe7, 0xd5, 0xd4, 0xbc, + 0xdf, 0x06, 0xff, 0xba, 0x1c, 0x55, 0x32, 0x70, 0x3e, 0xe6, 0xd5, 0x02, + 0xbf, 0x31, 0x6c, 0xce, 0xa1, 0x8f, 0x44, 0x6b, 0x38, 0xff, 0xe7, 0xa8, + 0x55, 0xbe, 0xac, 0xd6, 0xac, 0xfa, 0x0c, 0xf9, 0x71, 0x42, 0x9e, 0x7b, + 0xc0, 0x5f, 0x67, 0x28, 0x43, 0x7b, 0x28, 0x03, 0xf1, 0xfd, 0x27, 0x70, + 0xb7, 0x61, 0x1e, 0x79, 0xdd, 0x86, 0x3e, 0xbe, 0xff, 0x17, 0xfa, 0x76, + 0x23, 0xff, 0x23, 0x6f, 0x89, 0x26, 0xde, 0xfe, 0x03, 0x63, 0x3d, 0x4a, + 0xb7, 0x35, 0xd4, 0x26, 0x53, 0xbc, 0xef, 0x48, 0xe1, 0x1c, 0x38, 0xb9, + 0x4d, 0xd1, 0xad, 0x9d, 0xbd, 0x86, 0xf1, 0x5e, 0xac, 0x89, 0xda, 0xcd, + 0xb2, 0xe9, 0x58, 0xfb, 0x53, 0x25, 0xcf, 0x62, 0xed, 0x4e, 0xf2, 0x6f, + 0x5b, 0x23, 0x3b, 0xe5, 0x26, 0x4f, 0xe4, 0xa7, 0x1f, 0x4f, 0x2b, 0x72, + 0x21, 0xd8, 0x6d, 0xd2, 0x90, 0xd1, 0x7c, 0x9a, 0xdf, 0xf9, 0x12, 0xbc, + 0x17, 0x1d, 0x19, 0xe4, 0x9e, 0xa1, 0xdd, 0x60, 0x4e, 0x47, 0x7f, 0x4b, + 0xc8, 0x31, 0xd4, 0x24, 0xe5, 0x85, 0x8c, 0x56, 0x3c, 0x99, 0x45, 0x16, + 0xad, 0xbe, 0xd5, 0xc9, 0x8b, 0x4b, 0xb6, 0x7c, 0x1b, 0x7e, 0x7a, 0xb2, + 0x9e, 0x4d, 0x7f, 0x13, 0xf9, 0xc1, 0x91, 0x25, 0xe6, 0x13, 0x3d, 0x29, + 0x65, 0x9b, 0xf3, 0x9a, 0x6c, 0x60, 0x4c, 0x9b, 0x47, 0x7e, 0x6a, 0xdd, + 0x2d, 0x47, 0x82, 0x9f, 0x57, 0xd7, 0xc6, 0x0c, 0xca, 0xb1, 0x36, 0x66, + 0x10, 0x0f, 0x63, 0xc6, 0x4e, 0xec, 0x13, 0x63, 0x06, 0xf6, 0xff, 0x24, + 0x63, 0x86, 0x8d, 0x75, 0x8c, 0x19, 0x79, 0x59, 0xac, 0x32, 0x66, 0xec, + 0x45, 0x9b, 0x31, 0xa3, 0x80, 0x76, 0x10, 0x2f, 0x16, 0x55, 0xbc, 0xc8, + 0x5a, 0xcb, 0xc2, 0x38, 0x81, 0x3c, 0xb1, 0x8a, 0x3c, 0xb1, 0x8a, 0x3c, + 0xb1, 0x8a, 0x3c, 0xb1, 0x8a, 0x3c, 0x11, 0xb6, 0xfe, 0x5a, 0x15, 0x79, + 0x22, 0xfc, 0xe7, 0x3c, 0x72, 0x92, 0xa0, 0xa6, 0x38, 0x8c, 0x9a, 0xc2, + 0xd5, 0xc6, 0xaa, 0xe3, 0xda, 0xbe, 0x2a, 0x6a, 0x43, 0xf5, 0x9d, 0x58, + 0x1f, 0xda, 0x80, 0xba, 0xa8, 0xe6, 0x6c, 0x01, 0x5f, 0xd7, 0xe0, 0x1b, + 0xd4, 0xd3, 0x56, 0x99, 0xca, 0xed, 0x80, 0x7c, 0xd8, 0x7f, 0xfb, 0xfb, + 0xe8, 0x43, 0x3e, 0x9f, 0x63, 0x0d, 0xc2, 0x78, 0xb5, 0x0f, 0x6d, 0x1d, + 0x6d, 0xec, 0xe9, 0x04, 0x7c, 0xc4, 0x7e, 0x90, 0xf9, 0x62, 0x7a, 0x41, + 0x9e, 0xdc, 0x1c, 0xd8, 0xf4, 0x6f, 0x31, 0x27, 0x5e, 0xd3, 0xde, 0x88, + 0x39, 0xf0, 0x17, 0xd8, 0x97, 0x5a, 0x03, 0x5c, 0xba, 0xfd, 0xe7, 0xc4, + 0xd1, 0xb7, 0xe1, 0xd6, 0x1c, 0xda, 0xd5, 0xf7, 0x9a, 0xfa, 0xb2, 0x98, + 0xcf, 0xef, 0xe2, 0x3b, 0xf0, 0xfb, 0x16, 0x7e, 0x61, 0x77, 0xf6, 0x05, + 0xcc, 0xe9, 0xc3, 0xef, 0x77, 0x9a, 0xe6, 0x42, 0x0a, 0xfb, 0x2f, 0xd1, + 0x77, 0x31, 0xa4, 0xc1, 0x6f, 0x89, 0x5f, 0x6a, 0xe2, 0xe3, 0x07, 0xe8, + 0xfb, 0x6b, 0xf4, 0xf9, 0xfe, 0xdb, 0x4e, 0xd4, 0x27, 0xa5, 0x96, 0x70, + 0xef, 0x46, 0xd5, 0xde, 0x69, 0xca, 0xe6, 0x8f, 0x2c, 0xe9, 0xaa, 0x0e, + 0x7a, 0xae, 0x8e, 0xea, 0x08, 0x71, 0xbe, 0xbc, 0x10, 0xd4, 0xad, 0xc7, + 0x51, 0x73, 0x16, 0xab, 0xb4, 0x91, 0x1c, 0xfa, 0x6d, 0x9c, 0x69, 0x32, + 0x69, 0xdc, 0xaa, 0x63, 0x13, 0x89, 0xc9, 0x7a, 0x9b, 0x48, 0x37, 0x69, + 0x32, 0x4f, 0x22, 0x8e, 0xd9, 0x99, 0xe2, 0xc2, 0xec, 0x8c, 0x07, 0x9c, + 0x63, 0x75, 0xae, 0xe5, 0x3c, 0x93, 0xf7, 0x63, 0x4d, 0x74, 0x69, 0x13, + 0x60, 0x06, 0xf4, 0x9e, 0xab, 0x93, 0x7e, 0x40, 0xb3, 0xac, 0x68, 0xda, + 0xe8, 0x8f, 0xea, 0xc7, 0x1c, 0x6a, 0x5d, 0x99, 0x64, 0xed, 0x5c, 0x0c, + 0x69, 0xba, 0x75, 0x49, 0x24, 0x0a, 0xcd, 0xf8, 0x82, 0x8c, 0xf3, 0xb9, + 0xfa, 0xec, 0x8c, 0xfe, 0x42, 0x36, 0xc7, 0x3b, 0x11, 0xd7, 0x9a, 0x9d, + 0x69, 0x1d, 0x48, 0xc8, 0x8f, 0x91, 0xbb, 0x1d, 0x53, 0x34, 0x66, 0x67, + 0x8c, 0x17, 0x02, 0x5b, 0x0c, 0xe8, 0xe0, 0x3c, 0xc9, 0xb7, 0x43, 0x4e, + 0xd2, 0x62, 0x4d, 0x1d, 0x8c, 0x4f, 0xaa, 0x7a, 0xd1, 0x94, 0x2b, 0x15, + 0x45, 0x3b, 0xac, 0xdb, 0xc9, 0xc3, 0xec, 0x8c, 0xfc, 0xd1, 0x2d, 0x1e, + 0xd6, 0x91, 0x87, 0x78, 0x49, 0x27, 0xd0, 0x5b, 0xc0, 0x7f, 0x12, 0xf5, + 0x7b, 0x54, 0xab, 0xfb, 0xfe, 0x8a, 0x93, 0x43, 0x5c, 0xe0, 0x3e, 0xb6, + 0xa8, 0x3c, 0xd7, 0x73, 0x32, 0xbc, 0xef, 0x9b, 0xe3, 0xdf, 0x39, 0x78, + 0xf9, 0x01, 0xd4, 0x4d, 0xbc, 0x1b, 0xa4, 0x7f, 0xe1, 0xf7, 0x36, 0xff, + 0xe2, 0x7c, 0xf6, 0x93, 0xe7, 0x81, 0xf4, 0x55, 0xf0, 0xe7, 0xe5, 0xd1, + 0x87, 0x58, 0x51, 0x6c, 0x44, 0xb8, 0x78, 0xc7, 0xce, 0x39, 0x2a, 0xff, + 0x6e, 0xf2, 0xd1, 0x96, 0xf0, 0xdc, 0xa5, 0x8e, 0xc8, 0x27, 0xf9, 0xe9, + 0x84, 0x4d, 0x90, 0x17, 0xce, 0x8f, 0xee, 0x25, 0xd8, 0xfe, 0xb8, 0x36, + 0x12, 0xdd, 0xa9, 0x7d, 0x9c, 0x3d, 0x8f, 0x74, 0x76, 0x37, 0x7e, 0x88, + 0x83, 0xb4, 0x23, 0xbe, 0x22, 0x9e, 0x88, 0x8f, 0xfc, 0x44, 0xbc, 0x28, + 0x1b, 0x5d, 0x97, 0x9f, 0x60, 0x5d, 0xc0, 0x4f, 0x69, 0x21, 0x0d, 0x9d, + 0x90, 0xa7, 0x11, 0x6d, 0xa4, 0xba, 0xde, 0x1d, 0xc7, 0x0f, 0x5c, 0xc6, + 0xd5, 0xb1, 0x06, 0xef, 0xa1, 0x48, 0x97, 0x7f, 0x3b, 0xb2, 0xa4, 0x8d, + 0x34, 0xf8, 0x9d, 0xa9, 0xae, 0xb9, 0x8d, 0x88, 0xde, 0x5a, 0x9d, 0x46, + 0xbf, 0xbc, 0x2b, 0xff, 0x0c, 0xf6, 0xa9, 0x3b, 0xf8, 0xbb, 0x14, 0x55, + 0x47, 0xb1, 0x6f, 0xb9, 0xd5, 0x73, 0xa2, 0xbf, 0xd3, 0xd9, 0x1f, 0xe6, + 0x43, 0x51, 0x6d, 0x1c, 0xd5, 0x59, 0xea, 0x9e, 0x7d, 0xaf, 0xe7, 0x68, + 0xc8, 0x4f, 0x99, 0x33, 0x05, 0x3a, 0x08, 0xf1, 0xde, 0x91, 0xcf, 0x91, + 0x26, 0x3e, 0x47, 0xc1, 0xe7, 0x3e, 0xf0, 0x39, 0x76, 0x8b, 0xcf, 0x5b, + 0xb6, 0x97, 0x29, 0xc3, 0xf6, 0x46, 0xd6, 0xb5, 0xbd, 0x55, 0x3a, 0xab, + 0x73, 0x83, 0xfb, 0x9a, 0x91, 0x86, 0x2f, 0xc7, 0x9d, 0x8f, 0x53, 0x37, + 0xb7, 0xcb, 0x99, 0x85, 0xbb, 0xd5, 0xb7, 0x11, 0xaf, 0x2a, 0x77, 0x94, + 0x4b, 0xf5, 0x80, 0x9f, 0x1f, 0x2f, 0xb1, 0x3d, 0x12, 0xea, 0x8a, 0x3a, + 0xcb, 0x3a, 0x25, 0xb9, 0x1b, 0x2f, 0xbf, 0xf8, 0x9c, 0x76, 0xa5, 0x12, + 0x9d, 0x4f, 0x5a, 0x78, 0xc6, 0xae, 0xe5, 0x29, 0xfa, 0x6e, 0x32, 0x66, + 0x45, 0xf7, 0x67, 0x22, 0xfc, 0xfe, 0xc0, 0xef, 0x75, 0x6b, 0xbf, 0x13, + 0xf0, 0x7c, 0x8a, 0x78, 0xd7, 0x53, 0x3c, 0x9f, 0xc6, 0x9c, 0x66, 0x19, + 0x5c, 0xd8, 0xa4, 0x9e, 0xe4, 0x98, 0xe7, 0xd0, 0x2f, 0x4c, 0xd0, 0x0c, + 0xee, 0xdd, 0x6a, 0x4b, 0xbe, 0x5c, 0x74, 0x36, 0x06, 0xe7, 0x28, 0x64, + 0xba, 0x6c, 0xf1, 0xfe, 0x0a, 0x31, 0x8c, 0x67, 0x83, 0xb2, 0xb5, 0x16, + 0xf5, 0x5c, 0x39, 0xd0, 0x0e, 0x1d, 0xb3, 0xdd, 0xd6, 0xcb, 0xfb, 0x0a, + 0xca, 0xbc, 0xa0, 0xf6, 0x21, 0xd2, 0x71, 0xf4, 0x7d, 0xae, 0x55, 0x96, + 0xc3, 0xbb, 0xad, 0xc5, 0x8a, 0xef, 0xbf, 0x83, 0x3c, 0xfc, 0x34, 0x74, + 0x5f, 0xae, 0xff, 0xcc, 0x5f, 0x4e, 0xf1, 0x6f, 0xa5, 0x22, 0x9b, 0xd8, + 0xd1, 0xcb, 0x7b, 0x20, 0xf8, 0x96, 0x1c, 0xaf, 0x87, 0x65, 0xbf, 0x70, + 0x9c, 0x7d, 0xff, 0x0d, 0xbe, 0x7d, 0xff, 0xf4, 0xaa, 0x9d, 0x02, 0xfe, + 0x17, 0x33, 0xe1, 0x9b, 0xdd, 0x90, 0x58, 0x00, 0x00, 0x00 }; -static u32 bnx2_rv2p_proc2[] = { - 0x00000000, 0x2a000000, 0x00000010, 0xb1d40000, 0x00000008, 0x02540003, - 0x00000018, 0x00040000, 0x00000018, 0x8000000a, 0x00000018, 0x8000000a, - 0x00000018, 0x8000000e, 0x00000018, 0x80000056, 0x00000018, 0x800001b9, - 0x00000018, 0x800001e1, 0x00000018, 0x8000019b, 0x00000018, 0x800001f9, - 0x00000018, 0x8000019f, 0x00000018, 0x800001a6, 0x00000018, 0x80000000, - 0x0000000c, 0x29800001, 0x00000000, 0x2a000000, 0x0000000c, 0x29800000, - 0x00000010, 0x20530000, 0x00000018, 0x8000ffee, 0x0000000c, 0x29800001, - 0x00000010, 0x91de0000, 0x00000010, 0x001f0000, 0x00000000, 0x2f80aa00, - 0x00000000, 0x2a000000, 0x00000000, 0x0d610000, 0x00000000, 0x03620000, - 0x00000000, 0x2c400000, 0x00000000, 0x02638c00, 0x00000000, 0x26460000, - 0x00000010, 0x00420002, 0x00000008, 0x02040012, 0x00000010, 0xb9060836, - 0x00000000, 0x0f580000, 0x00000000, 0x0a640000, 0x00000000, 0x0ae50000, - 0x00000000, 0x0b660000, 0x00000000, 0x0c000000, 0x00000000, 0x0b800000, - 0x00000010, 0x00420009, 0x00000008, 0x0cc60012, 0x00000008, 0x0f800003, - 0x00000000, 0x00000000, 0x00000010, 0x009f0000, 0x00000008, 0x27110012, - 0x00000000, 0x66900000, 0x00000008, 0xa31b0012, 0x00000018, 0x80000008, - 0x00000000, 0x0cc60000, 0x00000008, 0x0f800003, 0x00000000, 0x00000000, - 0x00000010, 0x009f0000, 0x00000000, 0x27110000, 0x00000000, 0x66900000, - 0x00000000, 0x231b0000, 0x00000010, 0xb197320e, 0x00000000, 0x25960000, - 0x00000000, 0x021b0000, 0x00000010, 0x001f0000, 0x00000008, 0x0f800003, - 0x0000000c, 0x29800000, 0x00000010, 0x20530000, 0x00000000, 0x22c50800, - 0x00000010, 0x009f0000, 0x00000000, 0x27002200, 0x00000000, 0x26802000, - 0x00000000, 0x231b0000, 0x0000000c, 0x69520001, 0x00000018, 0x8000fff3, - 0x00000010, 0x01130002, 0x00000010, 0xb1980003, 0x00000010, 0x001f0000, - 0x00000008, 0x0f800004, 0x00000008, 0x22000003, 0x00000008, 0x2c80000c, - 0x00000008, 0x2d00000c, 0x00000010, 0x009f0000, 0x00000000, 0x25960000, - 0x0000000c, 0x29800000, 0x00000000, 0x32140000, 0x00000000, 0x32950000, - 0x00000000, 0x33160000, 0x00000000, 0x31e32e00, 0x00000008, 0x2d800010, - 0x00000010, 0x20530000, 0x00000018, 0x8000ffac, 0x00000000, 0x23000000, - 0x00000000, 0x25e60000, 0x00000008, 0x2200000b, 0x0000000c, 0x69520000, - 0x0000000c, 0x29800000, 0x00000010, 0x20530000, 0x00000018, 0x8000ffa5, - 0x0000000c, 0x29800001, 0x00000010, 0x91de0000, 0x00000000, 0x2fd50000, - 0x00000010, 0x001f0000, 0x00000000, 0x02700000, 0x00000000, 0x0d620000, - 0x00000000, 0xbb630800, 0x00000000, 0x2a000000, 0x00000009, 0x076000ff, - 0x0000000f, 0x2c0e0007, 0x00000008, 0x2c800000, 0x00000008, 0x2d000064, - 0x00000008, 0x2d80011c, 0x00000009, 0x06420002, 0x0000000c, 0x61420001, - 0x00000000, 0x0f400000, 0x00000000, 0x02d08c00, 0x00000000, 0x23000000, - 0x00000004, 0x826da000, 0x00000000, 0x8304a000, 0x00000000, 0x22c50c00, - 0x00000000, 0x03760000, 0x00000004, 0x83860a00, 0x00000000, 0x83870c00, - 0x00000010, 0x91de0000, 0x00000000, 0x037c0000, 0x00000000, 0x837b0c00, - 0x00000001, 0x83060e00, 0x00000000, 0x83870c00, 0x00000000, 0x82850e00, - 0x00000010, 0xb1860016, 0x0000000f, 0x47610018, 0x00000000, 0x068e0000, - 0x0000000f, 0x47670010, 0x0000000f, 0x47e20010, 0x00000000, 0x870e1e00, - 0x00000010, 0xb70e1a10, 0x00000010, 0x0ce7000e, 0x00000008, 0x22000009, - 0x00000000, 0x286d0000, 0x0000000f, 0x65680010, 0x00000003, 0xf66c9400, - 0x00000010, 0xb972a003, 0x0000000c, 0x73e70019, 0x0000000c, 0x21420004, - 0x00000018, 0x8000023f, 0x00000000, 0x37ed0000, 0x0000000c, 0x73e7001a, - 0x00000010, 0x20530000, 0x00000008, 0x22000008, 0x0000000c, 0x61420004, - 0x00000000, 0x02f60000, 0x00000004, 0x82840a00, 0x00000010, 0xb1840a2b, - 0x00000010, 0x2d67000a, 0x00000010, 0xb96d0804, 0x00000004, 0xb6ed0a00, - 0x00000000, 0x37ed0000, 0x00000018, 0x80000029, 0x0000000c, 0x61420000, - 0x00000000, 0x37040000, 0x00000000, 0x37850000, 0x0000000c, 0x33e7001a, - 0x00000018, 0x80000024, 0x00000010, 0xb96d0809, 0x00000004, 0xb6ed0a00, - 0x00000000, 0x036d0000, 0x00000004, 0xb76e0c00, 0x00000010, 0x91ee0c1f, - 0x0000000c, 0x73e7001a, 0x00000004, 0xb6ef0c00, 0x00000000, 0x37ed0000, - 0x00000018, 0x8000001b, 0x0000000c, 0x61420000, 0x00000010, 0xb7ee0a05, - 0x00000010, 0xb96f0815, 0x00000003, 0xb76e0800, 0x00000004, 0xb7ef0a00, - 0x00000018, 0x80000015, 0x00000010, 0x0ce7000c, 0x00000008, 0x22000009, - 0x00000000, 0x286d0000, 0x0000000f, 0x65680010, 0x00000003, 0xf66c9400, - 0x00000010, 0xb972a003, 0x0000000c, 0x73e70019, 0x0000000c, 0x21420004, - 0x00000018, 0x80000215, 0x00000010, 0x20530000, 0x00000008, 0x22000008, - 0x0000000c, 0x61420004, 0x00000000, 0x37040000, 0x00000000, 0x37850000, - 0x00000000, 0x036d0000, 0x00000003, 0xb8f10c00, 0x00000018, 0x80000004, - 0x00000000, 0x02840000, 0x00000002, 0x21421800, 0x0000000c, 0x61420000, - 0x00000000, 0x286d0000, 0x0000000f, 0x65ed0010, 0x00000009, 0x266dffff, - 0x00000000, 0x23000000, 0x00000010, 0xb1840a3d, 0x00000010, 0x01420002, - 0x00000004, 0xb8f10a00, 0x00000003, 0x83760a00, 0x00000010, 0xb8040c39, - 0x00000010, 0xb7e6080a, 0x00000000, 0x0a640000, 0x00000000, 0x0ae50000, - 0x00000009, 0x0c68ffff, 0x00000009, 0x0b67ffff, 0x00000000, 0x0be60000, - 0x00000000, 0x0c840000, 0x00000010, 0xb197320c, 0x00000008, 0x0f800002, - 0x00000018, 0x8000000a, 0x00000000, 0x0a6a0000, 0x00000000, 0x0aeb0000, - 0x00000000, 0x0c000000, 0x00000009, 0x0b6cffff, 0x00000000, 0x0be90000, - 0x00000000, 0x0c840000, 0x00000010, 0xb1973203, 0x00000008, 0x0f800002, - 0x00000018, 0x80000001, 0x00000010, 0x001f0000, 0x00000000, 0x0c860000, - 0x00000000, 0x06980000, 0x00000008, 0x0f800003, 0x00000000, 0x00000000, - 0x00000010, 0x009f0000, 0x00000010, 0xb1973210, 0x00000000, 0x231b0000, - 0x00000000, 0x02043600, 0x00000003, 0x8384a000, 0x0000000f, 0x65870010, - 0x00000009, 0x2607ffff, 0x00000000, 0x27111a00, 0x00000000, 0x66900000, - 0x0000000c, 0x29000000, 0x00000018, 0x800001de, 0x00000000, 0x06980000, - 0x00000010, 0x20530000, 0x00000000, 0x22c58c00, 0x00000010, 0x001f0000, - 0x00000008, 0x0f800003, 0x00000018, 0x8000fff0, 0x00000000, 0x02043600, - 0x00000000, 0x231b0000, 0x00000003, 0x8384a000, 0x0000000f, 0x65870010, - 0x00000009, 0x2607ffff, 0x00000000, 0x27111a00, 0x00000000, 0x66900000, - 0x0000000c, 0x29000000, 0x00000010, 0x91840a02, 0x00000002, 0x21421800, - 0x00000000, 0x32140000, 0x00000000, 0x32950000, 0x00000005, 0x73e72c00, - 0x00000005, 0x74683000, 0x00000000, 0x33170000, 0x00000018, 0x80000138, - 0x00000010, 0x91c60004, 0x00000008, 0x07000004, 0x00000010, 0xb1c41c02, - 0x00000010, 0x91840a04, 0x00000018, 0x800001c3, 0x00000010, 0x20530000, - 0x00000000, 0x22c58c00, 0x00000010, 0xb1840a8e, 0x0000000c, 0x21420006, - 0x00000010, 0x0ce7001a, 0x0000000f, 0x43680010, 0x00000000, 0x03f30c00, - 0x00000010, 0x91870850, 0x0000000f, 0x46ec0010, 0x00000010, 0xb68d0c4e, - 0x00000000, 0x838d0c00, 0x00000000, 0xa3050800, 0x00000001, 0xa3460e00, - 0x00000000, 0x02048c00, 0x00000010, 0x91840a02, 0x00000002, 0x21421800, - 0x00000010, 0x001f0000, 0x00000008, 0x22000008, 0x00000003, 0x8384a000, - 0x0000000f, 0x65870010, 0x00000009, 0x2607ffff, 0x00000000, 0x27750c00, - 0x00000000, 0x66f40000, 0x0000000c, 0x29000000, 0x00000018, 0x800001aa, - 0x00000000, 0x03068c00, 0x00000003, 0xf4680c00, 0x00000010, 0x20530000, - 0x00000000, 0x22c58c00, 0x00000018, 0x8000ffe5, 0x00000000, 0x39760000, - 0x00000000, 0x39840000, 0x0000000c, 0x33e70019, 0x00000010, 0x001f0000, - 0x00000000, 0x031e0000, 0x00000000, 0x0760fe00, 0x0000000f, 0x0f0e0007, - 0x00000000, 0x83850800, 0x00000000, 0x0a7d0000, 0x00000000, 0x0afe0000, - 0x00000000, 0x0b7f0000, 0x00000000, 0x0d7a0000, 0x00000000, 0x0c000000, - 0x00000000, 0x0bfc0000, 0x00000000, 0x0c970e00, 0x00000008, 0x0f800003, - 0x0000000f, 0x47670010, 0x00000008, 0x070e0001, 0x0000000b, 0xc38000ff, - 0x00000002, 0x43870000, 0x00000001, 0x33e70e00, 0x0000000f, 0x038e0010, - 0x00000002, 0x33e70e00, 0x00000000, 0x28f30000, 0x00000010, 0x009f0000, - 0x00000000, 0x02043600, 0x00000010, 0x91840a02, 0x00000002, 0x21421800, - 0x00000008, 0x22000006, 0x00000000, 0x231b0000, 0x00000000, 0x23ff0000, - 0x00000000, 0x241b0000, 0x00000003, 0x8384a000, 0x0000000f, 0x65870010, - 0x00000009, 0x2607ffff, 0x00000000, 0x27110000, 0x00000000, 0x26900000, - 0x0000000c, 0x29000000, 0x00000018, 0x8000017e, 0x00000003, 0xf4683600, - 0x00000000, 0x3a100000, 0x00000000, 0x3a910000, 0x00000003, 0xf66c2400, - 0x00000010, 0x001f0000, 0x00000010, 0xb1923604, 0x00000008, 0x0f800004, - 0x00000000, 0x00000000, 0x00000010, 0x009f0000, 0x00000000, 0x3e170000, - 0x00000000, 0x3e940000, 0x00000000, 0x3f150000, 0x00000000, 0x3f960000, - 0x00000010, 0x001f0000, 0x00000000, 0x0f060000, 0x00000010, 0x20530000, - 0x00000000, 0x22c53600, 0x00000018, 0x8000ffac, 0x00000010, 0x001f0000, - 0x00000000, 0x031e0000, 0x00000000, 0x83850800, 0x00000009, 0x076000ff, - 0x0000000f, 0x0f0e0007, 0x00000000, 0x0c000000, 0x00000000, 0x0a7d0000, - 0x00000000, 0x0afe0000, 0x00000000, 0x0b7f0000, 0x00000000, 0x0d7a0000, - 0x00000000, 0x0bfc0000, 0x00000000, 0x0c970e00, 0x00000008, 0x0f800003, - 0x0000000f, 0x47670010, 0x00000008, 0x070e0001, 0x0000000b, 0xc38000ff, - 0x00000002, 0x43870000, 0x00000001, 0x33e70e00, 0x0000000f, 0x038e0010, - 0x00000002, 0x33e70e00, 0x00000000, 0x39840000, 0x00000003, 0xb9720800, - 0x00000000, 0x28f30000, 0x0000000f, 0x65680010, 0x00000010, 0x009f0000, - 0x00000000, 0x02043600, 0x00000010, 0x91840a02, 0x00000002, 0x21421800, - 0x00000008, 0x22000007, 0x00000000, 0x231b0000, 0x00000000, 0x23ff0000, - 0x00000000, 0x241b0000, 0x00000003, 0x8384a000, 0x0000000f, 0x65870010, - 0x00000009, 0x2607ffff, 0x00000000, 0x27110000, 0x00000000, 0x26900000, - 0x0000000c, 0x29000000, 0x00000018, 0x80000145, 0x00000003, 0xf4683600, - 0x00000000, 0x3a100000, 0x00000000, 0x3a910000, 0x00000003, 0xf66c2400, - 0x00000010, 0x001f0000, 0x00000010, 0xb1923604, 0x00000008, 0x0f800004, - 0x00000000, 0x00000000, 0x00000010, 0x009f0000, 0x00000000, 0x3e170000, - 0x00000000, 0x3e940000, 0x00000000, 0x3f150000, 0x00000000, 0x3f960000, - 0x00000010, 0x001f0000, 0x00000000, 0x0f060000, 0x00000010, 0x20530000, - 0x00000000, 0x22c53600, 0x00000018, 0x8000ff73, 0x00000010, 0x0ce70005, - 0x00000008, 0x2c80000c, 0x00000008, 0x2d000070, 0x00000008, 0x2d800010, - 0x00000000, 0x00000000, 0x00000010, 0x205f0000, 0x00000018, 0x8000011d, - 0x00000000, 0x2c1e0000, 0x00000008, 0x2c8000b8, 0x00000008, 0x2d000010, - 0x00000008, 0x2d800048, 0x00000000, 0x00000000, 0x00000010, 0x91de0000, - 0x00000018, 0x8000fe5d, 0x0000000c, 0x29800001, 0x00000000, 0x2a000000, - 0x00000010, 0x001f0000, 0x00000000, 0x0f008000, 0x00000008, 0x0f800007, - 0x00000018, 0x80000006, 0x0000000c, 0x29800001, 0x00000000, 0x2a000000, - 0x00000010, 0x001f0000, 0x0000000f, 0x0f470007, 0x00000008, 0x0f800008, - 0x00000018, 0x80000119, 0x00000010, 0x20530000, 0x00000018, 0x8000fe4f, - 0x0000000c, 0x29800001, 0x00000010, 0x91de0000, 0x00000000, 0x2fd50000, - 0x00000000, 0x2a000000, 0x00000009, 0x0261ffff, 0x0000000d, 0x70e10001, - 0x00000018, 0x80000101, 0x00000000, 0x2c400000, 0x00000008, 0x2c8000c4, - 0x00000008, 0x2d00001c, 0x00000008, 0x2d800001, 0x00000005, 0x70e10800, - 0x00000010, 0x91de0000, 0x00000018, 0x8000fe41, 0x0000000c, 0x29800001, - 0x00000010, 0x91de0000, 0x00000000, 0x2fd50000, 0x00000010, 0x001f0000, - 0x00000000, 0x02700000, 0x00000000, 0x0d620000, 0x00000000, 0xbb630800, - 0x00000000, 0x2a000000, 0x00000000, 0x0f400000, 0x00000000, 0x2c400000, - 0x0000000c, 0x73e7001b, 0x00000010, 0x0ce7000e, 0x00000000, 0x286d0000, - 0x0000000f, 0x65ed0010, 0x00000009, 0x266dffff, 0x00000018, 0x80000069, - 0x00000008, 0x02000004, 0x00000010, 0x91c40803, 0x00000018, 0x800000f6, - 0x00000010, 0x20530000, 0x00000018, 0x800000e5, 0x00000008, 0x2c8000b8, - 0x00000008, 0x2d000010, 0x00000008, 0x2d800048, 0x00000018, 0x80000005, - 0x00000008, 0x2c8000c4, 0x00000008, 0x2d00001c, 0x00000008, 0x2d800001, - 0x00000000, 0x00000000, 0x00000010, 0x205f0000, 0x00000008, 0x2c800048, - 0x00000008, 0x2d000068, 0x00000008, 0x2d800104, 0x00000000, 0x00000000, - 0x00000010, 0x91de0000, 0x00000000, 0x27f60000, 0x00000010, 0xb87a9e04, - 0x00000008, 0x2200000d, 0x00000018, 0x800000e2, 0x00000010, 0x20530000, - 0x00000018, 0x8000fe18, 0x0000000c, 0x29800001, 0x00000010, 0x91de0000, - 0x00000000, 0x2fd50000, 0x00000010, 0x001f0000, 0x00000000, 0x02700000, - 0x00000000, 0x0d620000, 0x00000000, 0xbb630800, 0x00000000, 0x2a000000, - 0x00000010, 0x0e670011, 0x00000000, 0x286d0000, 0x0000000f, 0x65ed0010, - 0x00000009, 0x266dffff, 0x00000004, 0xb8f1a000, 0x00000000, 0x0f400000, - 0x0000000c, 0x73e7001c, 0x00000018, 0x80000040, 0x00000008, 0x02000004, - 0x00000010, 0x91c40802, 0x00000018, 0x800000cd, 0x00000000, 0x2c1e0000, - 0x00000008, 0x2c8000b8, 0x00000008, 0x2d000010, 0x00000008, 0x2d800048, - 0x00000010, 0x20530000, 0x00000010, 0x91de0000, 0x00000018, 0x8000fdfe, - 0x0000000c, 0x29800001, 0x00000000, 0x03550000, 0x00000000, 0x06460000, - 0x00000000, 0x03d60000, 0x00000000, 0x2a000000, 0x0000000f, 0x0f480007, - 0x00000010, 0xb18c0027, 0x0000000f, 0x47420008, 0x00000009, 0x070e000f, - 0x00000008, 0x070e0008, 0x00000010, 0x001f0000, 0x00000008, 0x09000001, - 0x00000007, 0x09121c00, 0x00000003, 0xcbca9200, 0x00000000, 0x0b97a200, - 0x00000007, 0x4b171c00, 0x0000000f, 0x0a960003, 0x00000000, 0x0a959c00, - 0x00000000, 0x4a009a00, 0x00000008, 0x82120001, 0x00000001, 0x0c170800, - 0x00000000, 0x02180000, 0x00000000, 0x0c971800, 0x00000008, 0x0d00ffff, - 0x00000008, 0x0f800006, 0x0000000c, 0x29000000, 0x00000008, 0x22000001, - 0x00000000, 0x22c50c00, 0x00000010, 0x009f0000, 0x00000010, 0xb197320b, - 0x00000000, 0x231b0000, 0x00000000, 0x27110800, 0x00000000, 0x66900000, - 0x00000018, 0x800000a4, 0x00000000, 0x02180000, 0x00000010, 0x20530000, - 0x00000000, 0x22c53600, 0x00000010, 0x001f0000, 0x00000008, 0x0f800006, - 0x00000018, 0x8000fff5, 0x00000010, 0x91870002, 0x00000008, 0x2200000a, - 0x00000000, 0x231b0000, 0x00000000, 0x27110800, 0x00000000, 0x66900000, - 0x00000018, 0x80000098, 0x00000008, 0x0200000a, 0x00000010, 0x91c40804, - 0x00000010, 0x02c20003, 0x00000010, 0x001f0000, 0x00000008, 0x0f800008, - 0x00000010, 0x20530000, 0x00000018, 0x8000fdc9, 0x00000000, 0x06820000, - 0x00000010, 0x001f0000, 0x00000010, 0x0ce70028, 0x00000000, 0x03720000, - 0x00000000, 0xa8760c00, 0x00000000, 0x0cf60000, 0x00000010, 0xb8723224, - 0x00000000, 0x03440000, 0x00000008, 0x22000010, 0x00000000, 0x03ca0000, - 0x0000000f, 0x65680010, 0x00000000, 0x0bcf0000, 0x00000000, 0x27f20000, - 0x00000010, 0xb7ef3203, 0x0000000c, 0x21420004, 0x0000000c, 0x73e70019, - 0x00000000, 0x07520000, 0x00000000, 0x29000000, 0x00000018, 0x8000007e, - 0x00000004, 0xb9723200, 0x00000010, 0x20530000, 0x00000000, 0x22060000, - 0x0000000c, 0x61420004, 0x00000000, 0x25070000, 0x00000000, 0x27970000, - 0x00000000, 0x290e0000, 0x00000010, 0x0ce70010, 0x00000010, 0xb873320f, - 0x0000000f, 0x436c0010, 0x00000000, 0x03f30c00, 0x00000000, 0x03f30000, - 0x00000000, 0x83990e00, 0x00000001, 0x83860e00, 0x00000000, 0x83060e00, - 0x00000003, 0xf66c0c00, 0x00000000, 0x39f30e00, 0x00000000, 0x3af50e00, - 0x00000000, 0x7a740000, 0x0000000f, 0x43680010, 0x00000001, 0x83860e00, - 0x00000000, 0x83060e00, 0x00000003, 0xf4680c00, 0x00000000, 0x286d0000, - 0x00000000, 0x03690000, 0x00000010, 0xb1f60c54, 0x00000000, 0x0a6a0000, - 0x00000000, 0x0aeb0000, 0x00000009, 0x0b6cffff, 0x00000000, 0x0c000000, - 0x00000000, 0x0be90000, 0x00000003, 0x8cf6a000, 0x0000000c, 0x09800002, - 0x00000010, 0x009f0000, 0x00000010, 0xb8173209, 0x00000000, 0x35140000, - 0x00000000, 0x35950000, 0x00000005, 0x766c2c00, 0x00000000, 0x34970000, - 0x00000004, 0xb8f12e00, 0x00000010, 0x001f0000, 0x00000008, 0x0f800004, - 0x00000018, 0x8000fff7, 0x00000000, 0x03e90000, 0x00000010, 0xb8f6a01a, - 0x00000010, 0x20130019, 0x00000010, 0xb1f10e18, 0x00000000, 0x83973200, - 0x00000000, 0x38700e00, 0x00000000, 0xbb760e00, 0x00000000, 0x37d00000, - 0x0000000c, 0x73e7001a, 0x00000003, 0xb8f1a000, 0x00000000, 0x32140000, - 0x00000000, 0x32950000, 0x00000005, 0x73e72c00, 0x00000000, 0x33190000, - 0x00000005, 0x74680000, 0x00000010, 0x0ce7000d, 0x00000008, 0x22000009, - 0x00000000, 0x07520000, 0x00000000, 0x29000000, 0x0000000c, 0x73e70019, - 0x0000000f, 0x65680010, 0x0000000c, 0x21420004, 0x00000018, 0x8000003c, - 0x00000010, 0x20530000, 0x0000000c, 0x61420004, 0x00000000, 0x290e0000, - 0x00000018, 0x80000002, 0x00000010, 0x91973206, 0x00000000, 0x35140000, - 0x00000000, 0x35950000, 0x00000005, 0x766c2c00, 0x00000000, 0x34990000, - 0x00000004, 0xb8f13200, 0x00000000, 0x83690c00, 0x00000010, 0xb1860013, - 0x00000000, 0x28e90000, 0x00000008, 0x22000004, 0x00000000, 0x23ec0000, - 0x00000000, 0x03690000, 0x00000010, 0xb8660c07, 0x00000009, 0x036cffff, - 0x00000000, 0x326a0000, 0x00000000, 0x32eb0000, 0x00000005, 0x73e70c00, - 0x00000000, 0x33690000, 0x00000005, 0x74680000, 0x0000000c, 0x73e7001c, - 0x00000000, 0x03690000, 0x00000010, 0xb1f60c12, 0x00000010, 0xb1d00c11, - 0x0000000c, 0x21420005, 0x0000000c, 0x33e7001c, 0x00000018, 0x8000000e, - 0x00000010, 0x2e67000d, 0x00000000, 0x03690000, 0x00000010, 0xb1f60c0b, - 0x00000010, 0xb1d00c0a, 0x00000000, 0x03440000, 0x00000008, 0x2200000c, - 0x00000000, 0x07520000, 0x00000000, 0x29000000, 0x00000018, 0x80000015, - 0x0000000c, 0x33e7001c, 0x00000010, 0x20530000, 0x00000000, 0x22060000, - 0x00000000, 0x290e0000, 0x00000018, 0x000d0000, 0x00000000, 0x06820000, - 0x00000010, 0x2de7000d, 0x00000010, 0x0ce7000c, 0x00000000, 0x27f20000, - 0x00000010, 0xb96d9e0a, 0x00000000, 0xa86d9e00, 0x00000009, 0x0361ffff, - 0x00000010, 0xb7500c07, 0x00000008, 0x2200000f, 0x0000000f, 0x65680010, - 0x00000000, 0x29000000, 0x00000018, 0x80000004, 0x0000000c, 0x33e7001b, - 0x00000010, 0x20530000, 0x00000018, 0x000d0000, 0x00000000, 0x2b820000, - 0x00000010, 0x20d2002f, 0x00000010, 0x0052002e, 0x00000009, 0x054e0007, - 0x00000010, 0xb18a002c, 0x00000000, 0x050a8c00, 0x00000008, 0x850a0008, - 0x00000010, 0x918a0029, 0x00000003, 0xc5008800, 0x00000008, 0xa3460001, - 0x00000010, 0xb1c60007, 0x00000008, 0x22000001, 0x0000000c, 0x29800000, - 0x00000010, 0x20530000, 0x00000000, 0x274e8c00, 0x00000000, 0x66cd0000, - 0x00000000, 0x22c58c00, 0x00000008, 0x22000014, 0x00000003, 0x22c58e00, - 0x00000003, 0x23c58e00, 0x00000003, 0x22c58e00, 0x00000003, 0x26cd9e00, - 0x00000003, 0x27cd9e00, 0x00000003, 0x26cd9e00, 0x00000003, 0x274ea000, - 0x00000003, 0x284ea000, 0x00000003, 0x274ea000, 0x0000000c, 0x69520000, - 0x0000000c, 0x29800000, 0x00000010, 0x20530000, 0x00000003, 0x22c58e00, - 0x00000003, 0x23c58e00, 0x00000003, 0x22c58e00, 0x00000003, 0x26cd9e00, - 0x00000003, 0x27cd9e00, 0x00000003, 0x26cd9e00, 0x00000003, 0x274ea000, - 0x00000003, 0x284ea000, 0x00000003, 0x274ea000, 0x00000000, 0xa2c58c00, - 0x00000000, 0xa74e8c00, 0x00000000, 0xe6cd0000, 0x0000000f, 0x620a0010, - 0x00000008, 0x23460001, 0x0000000c, 0x29800000, 0x00000010, 0x20530000, - 0x0000000c, 0x29520000, 0x00000018, 0x80000002, 0x0000000c, 0x29800000, - 0x00000018, 0x00570000 }; +static u32 bnx2_RXP_b06FwData[(0x0/4) + 1] = { 0x0 }; +static u32 bnx2_RXP_b06FwRodata[(0x28/4) + 1] = { + 0x0800468c, 0x0800458c, 0x08004630, 0x08004648, 0x08004660, 0x08004680, + 0x0800468c, 0x0800468c, 0x08004594, 0x00000000, 0x00000000 }; +static u32 bnx2_RXP_b06FwBss[(0x13a4/4) + 1] = { 0x0 }; +static u32 bnx2_RXP_b06FwSbss[(0x1c/4) + 1] = { 0x0 }; -static int bnx2_TPAT_b06FwReleaseMajor = 0x0; -static int bnx2_TPAT_b06FwReleaseMinor = 0x0; -static int bnx2_TPAT_b06FwReleaseFix = 0x0; -static u32 bnx2_TPAT_b06FwStartAddr = 0x08000858; -static u32 bnx2_TPAT_b06FwTextAddr = 0x08000800; -static int bnx2_TPAT_b06FwTextLen = 0x1314; -static u32 bnx2_TPAT_b06FwDataAddr = 0x08001b40; -static int bnx2_TPAT_b06FwDataLen = 0x0; -static u32 bnx2_TPAT_b06FwRodataAddr = 0x00000000; -static int bnx2_TPAT_b06FwRodataLen = 0x0; -static u32 bnx2_TPAT_b06FwBssAddr = 0x08001b90; -static int bnx2_TPAT_b06FwBssLen = 0x80; -static u32 bnx2_TPAT_b06FwSbssAddr = 0x08001b40; -static int bnx2_TPAT_b06FwSbssLen = 0x48; +static u8 bnx2_rv2p_proc1[] = { + 0x1f, 0x8b, 0x08, 0x08, 0x5e, 0xd0, 0x41, 0x44, 0x00, 0x03, 0x74, 0x65, + 0x73, 0x74, 0x31, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0xc5, 0x56, 0xcf, 0x6b, + 0x13, 0x51, 0x10, 0x9e, 0xec, 0x6e, 0xb2, 0xdb, 0x74, 0xbb, 0x1b, 0x2b, + 0xda, 0xa0, 0xb1, 0x8d, 0x51, 0x6a, 0x7f, 0xa4, 0xb4, 0x11, 0x0f, 0x82, + 0x42, 0x25, 0x3d, 0x04, 0x54, 0x44, 0x7a, 0x28, 0x22, 0x82, 0x36, 0x8a, + 0xfe, 0x1b, 0xa1, 0x3f, 0xd2, 0x4b, 0x10, 0x7a, 0xb0, 0x58, 0xf1, 0x50, + 0x10, 0x2a, 0x68, 0x0f, 0xc9, 0xa1, 0x20, 0x52, 0x11, 0xda, 0x8b, 0x07, + 0x2f, 0x42, 0x0f, 0x7a, 0x69, 0xbd, 0xa8, 0xff, 0x82, 0x08, 0x4d, 0x7c, + 0x6f, 0x66, 0x9e, 0xee, 0x6e, 0xb2, 0x4d, 0x15, 0xc1, 0x85, 0xf6, 0xe3, + 0xbd, 0x9d, 0x79, 0x33, 0xf3, 0xcd, 0x37, 0xfb, 0x62, 0x01, 0x40, 0x04, + 0x60, 0xcd, 0x46, 0x2c, 0x8d, 0x26, 0x04, 0x1a, 0x30, 0x7e, 0x52, 0x62, + 0x16, 0xde, 0xa6, 0x25, 0x4e, 0x44, 0xc6, 0xd3, 0x49, 0x81, 0x7b, 0x0d, + 0x28, 0xc9, 0x75, 0x4f, 0xf5, 0x55, 0xad, 0x53, 0xa0, 0x06, 0xbb, 0xa3, + 0x80, 0xcf, 0x47, 0x9d, 0xf0, 0x7c, 0xd6, 0x42, 0x2c, 0x31, 0xc2, 0x48, + 0x02, 0x61, 0x7b, 0x51, 0xae, 0xad, 0x48, 0x69, 0xc4, 0x42, 0x3f, 0xd0, + 0x68, 0x7f, 0x67, 0xd1, 0x15, 0xff, 0x53, 0xf0, 0x39, 0x2f, 0xd7, 0x56, + 0x7c, 0x0e, 0xed, 0xaa, 0xec, 0x2f, 0xfe, 0xd0, 0xfe, 0xba, 0xf0, 0x03, + 0x7e, 0x94, 0x5f, 0x02, 0xcf, 0x29, 0x66, 0x65, 0x5e, 0xdd, 0x22, 0xa0, + 0xca, 0xc7, 0x46, 0x2c, 0xf5, 0x91, 0xb5, 0x89, 0xef, 0xbf, 0x8a, 0xbc, + 0x55, 0xdc, 0x76, 0xf1, 0x82, 0xf9, 0x06, 0xe3, 0x26, 0x91, 0x1f, 0x28, + 0xf9, 0xe3, 0x00, 0xc8, 0xfd, 0x4f, 0x8d, 0x5f, 0xfb, 0x83, 0xfe, 0xf7, + 0xbb, 0x43, 0xf2, 0xbc, 0x28, 0xc0, 0x90, 0xb4, 0xdb, 0xe6, 0x7c, 0xc6, + 0xe0, 0xb4, 0x96, 0xc4, 0xf7, 0x06, 0xfa, 0x1f, 0x11, 0xe7, 0x4a, 0xec, + 0x61, 0x3c, 0xce, 0x78, 0x95, 0xb1, 0xc2, 0xe8, 0x32, 0x3a, 0x8c, 0x5d, + 0x8c, 0x36, 0xe3, 0x26, 0x63, 0x9c, 0xb1, 0x83, 0xd1, 0x62, 0xdc, 0x63, + 0x8c, 0x31, 0x46, 0x19, 0x1b, 0x8c, 0x46, 0x84, 0x50, 0xe3, 0xf5, 0x63, + 0x46, 0xe0, 0xba, 0x23, 0x81, 0xba, 0x5f, 0xb3, 0x2e, 0x24, 0x6f, 0xfc, + 0x7e, 0x50, 0xd9, 0x31, 0xef, 0x58, 0xf7, 0x3a, 0xdb, 0x75, 0x57, 0x57, + 0x02, 0xfa, 0x49, 0xef, 0xab, 0x9b, 0x54, 0x8b, 0x3e, 0xb8, 0x58, 0xcf, + 0x9d, 0x82, 0x8b, 0x71, 0x9c, 0x18, 0xed, 0xab, 0xb4, 0x6e, 0xb8, 0x84, + 0xf7, 0xe2, 0x84, 0x5f, 0x18, 0xef, 0x77, 0x12, 0x4e, 0x77, 0xc9, 0x7c, + 0x0e, 0x8b, 0x80, 0xea, 0x1c, 0x95, 0x4f, 0xbb, 0x3c, 0xc2, 0xe2, 0xa9, + 0xbc, 0xda, 0xc5, 0x25, 0x2c, 0x6a, 0xfe, 0xfa, 0x9f, 0x8c, 0x11, 0x1a, + 0x39, 0x22, 0x75, 0xc9, 0x16, 0x3d, 0x83, 0x46, 0x63, 0xd9, 0x36, 0xe4, + 0xfa, 0xdc, 0xf2, 0x7b, 0xd4, 0xfb, 0xd9, 0xa5, 0x1a, 0xe7, 0xe7, 0x2a, + 0x9e, 0x69, 0x0e, 0x32, 0x40, 0xeb, 0x49, 0xe4, 0x1d, 0x04, 0x5a, 0xb8, + 0x86, 0x8c, 0xbf, 0x5f, 0xa4, 0x43, 0x9d, 0xfb, 0x31, 0xcb, 0xfd, 0x38, + 0x11, 0xd2, 0x8f, 0xb0, 0xb9, 0x68, 0x9e, 0xc7, 0xdb, 0xe9, 0x20, 0x6f, + 0x61, 0xf3, 0xa3, 0xf8, 0xa6, 0xdd, 0x3f, 0xe5, 0xf1, 0x01, 0xf3, 0x58, + 0x24, 0x1e, 0x93, 0xdf, 0x5a, 0xf2, 0x94, 0xf6, 0xf0, 0x24, 0xeb, 0xec, + 0x0d, 0xe9, 0x73, 0x58, 0x7d, 0xd9, 0xbf, 0xee, 0x73, 0x20, 0x3f, 0xb8, + 0x8b, 0xdf, 0x9b, 0x04, 0x14, 0x0b, 0x2a, 0x5f, 0x3f, 0xcf, 0xc7, 0xa8, + 0xdf, 0x30, 0x97, 0x93, 0xfb, 0x62, 0xfe, 0x36, 0x35, 0x5c, 0x1b, 0xf9, + 0x88, 0x04, 0xab, 0x98, 0x23, 0x7f, 0x47, 0xd3, 0x78, 0x7d, 0x50, 0x5d, + 0xa8, 0xbe, 0x4b, 0x8c, 0x41, 0x7e, 0x9a, 0xeb, 0xcc, 0x50, 0x3c, 0xd2, + 0x81, 0xc1, 0x3a, 0xc8, 0xf3, 0xf7, 0x28, 0xc8, 0x87, 0x55, 0x5d, 0x59, + 0xf4, 0xce, 0x75, 0x12, 0x8a, 0x39, 0xd2, 0x55, 0x73, 0x5f, 0x59, 0x6f, + 0x6b, 0xea, 0xbb, 0x84, 0xdb, 0xd5, 0x92, 0xee, 0xab, 0xf7, 0x12, 0x64, + 0xbd, 0x3c, 0x47, 0x5a, 0xe8, 0xa3, 0x5d, 0x1c, 0xdf, 0x79, 0x0e, 0x64, + 0x5b, 0x7d, 0x6f, 0x4c, 0xae, 0xeb, 0x0c, 0xeb, 0xfb, 0x68, 0x93, 0xbe, + 0xd5, 0x7d, 0xf5, 0xef, 0x74, 0xce, 0xf5, 0x9b, 0x68, 0x97, 0xda, 0x59, + 0xf7, 0xde, 0x4f, 0x71, 0xcf, 0xfd, 0x44, 0x6e, 0xa6, 0xca, 0xbb, 0xcf, + 0x7b, 0xaf, 0x1c, 0x0a, 0xe9, 0x83, 0xf7, 0x3e, 0x0a, 0xd6, 0xeb, 0xd7, + 0x23, 0xf5, 0x35, 0xce, 0xf5, 0x9b, 0x0d, 0xee, 0xc3, 0x54, 0xff, 0x0c, + 0xe9, 0x3f, 0x53, 0x90, 0xfa, 0x71, 0xc1, 0x31, 0xe9, 0x7c, 0x42, 0x71, + 0x8e, 0x66, 0x62, 0xde, 0xf3, 0x1a, 0xad, 0xe7, 0x67, 0xd0, 0x2f, 0x3e, + 0xa7, 0xf6, 0xf3, 0x48, 0xd8, 0xe4, 0x8b, 0x2d, 0xe2, 0xbd, 0xa6, 0xab, + 0xb9, 0x70, 0x91, 0xef, 0x01, 0x97, 0xec, 0xcc, 0x2b, 0x8a, 0x2f, 0xb9, + 0xaf, 0xc3, 0x12, 0xcd, 0xc5, 0xad, 0x47, 0x84, 0x37, 0xe1, 0x32, 0x9d, + 0xfb, 0xfb, 0xfb, 0x66, 0x21, 0x42, 0x97, 0x57, 0xc7, 0x51, 0xa1, 0x63, + 0x9c, 0x63, 0x25, 0x57, 0x78, 0xae, 0x11, 0x9f, 0xf3, 0xa4, 0x73, 0x8d, + 0xf3, 0xc3, 0xab, 0x45, 0x3e, 0xab, 0xba, 0xac, 0xf7, 0x9a, 0xd2, 0x1d, + 0x0c, 0x9b, 0x38, 0x3f, 0xa9, 0xca, 0x02, 0x2e, 0x7b, 0x1d, 0x46, 0xbb, + 0x4c, 0x18, 0xc3, 0xfc, 0x75, 0x78, 0x58, 0x93, 0x7e, 0x05, 0xbe, 0xdf, + 0x7e, 0xb0, 0x5e, 0x74, 0xa8, 0xf0, 0xef, 0x8b, 0x05, 0x7c, 0x3f, 0x01, + 0xcd, 0xf7, 0x1b, 0xc5, 0x29, 0x0f, 0x11, 0xda, 0xa7, 0xb8, 0xaf, 0xc3, + 0xd2, 0xce, 0x11, 0x7e, 0xdc, 0x3f, 0xec, 0xc3, 0x05, 0x8f, 0x3f, 0x42, + 0xe5, 0xc3, 0x40, 0x98, 0xbf, 0xb4, 0xff, 0xde, 0xe2, 0x3e, 0xa5, 0xf7, + 0x2f, 0xc9, 0x7e, 0xaa, 0xff, 0x19, 0xd7, 0x3f, 0xec, 0xd5, 0xbd, 0x8a, + 0xf7, 0xae, 0xbe, 0xff, 0x7d, 0xdc, 0xc1, 0x76, 0x5b, 0xfb, 0xd8, 0xd1, + 0xf1, 0xf9, 0x41, 0xef, 0xfd, 0xfd, 0xa6, 0x4e, 0x3c, 0x6d, 0xd4, 0xd5, + 0x5c, 0x6d, 0x84, 0xcc, 0xd5, 0xc5, 0xff, 0x3a, 0x57, 0x10, 0x98, 0xab, + 0xd5, 0xfa, 0xc1, 0xe6, 0x0a, 0xb8, 0x7e, 0x08, 0x99, 0xab, 0x18, 0xf3, + 0xf0, 0x94, 0xcf, 0x33, 0x20, 0xaa, 0xc7, 0xb0, 0x7d, 0xc6, 0x2c, 0xeb, + 0x92, 0xf4, 0x68, 0x47, 0xcb, 0xa8, 0x3f, 0xc7, 0x2e, 0x93, 0x9d, 0x41, + 0xfb, 0x49, 0x85, 0x0b, 0xb3, 0xf4, 0x7b, 0x4a, 0x83, 0x9f, 0x94, 0x15, + 0x12, 0x3d, 0x80, 0x0b, 0x00, 0x00, 0x00 }; -static u32 bnx2_TPAT_b06FwText[(0x1314/4) + 1] = { - 0x0a000216, 0x00000000, 0x00000000, 0x0000000d, 0x74706174, 0x20302e36, - 0x2e390000, 0x00060901, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000003, - 0x00000000, 0x0000000d, 0x0000000d, 0x3c020800, 0x24421b40, 0x3c030800, - 0x24631c10, 0xac400000, 0x0043202b, 0x1480fffd, 0x24420004, 0x3c1d0800, - 0x37bd3ffc, 0x03a0f021, 0x3c100800, 0x26100858, 0x3c1c0800, 0x279c1b40, - 0x0e00051f, 0x00000000, 0x0000000d, 0x8f820024, 0x27bdffe8, 0xafbf0014, - 0x10400004, 0xafb00010, 0x0000000d, 0x00000000, 0x2400015f, 0x8f82001c, - 0x8c450008, 0x24030800, 0xaf430178, 0x97430104, 0x3c020008, 0xaf420140, - 0x8f820034, 0x30420001, 0x10400006, 0x3070ffff, 0x24020002, 0x2603fffe, - 0xa7420146, 0x0a000246, 0xa7430148, 0xa7400146, 0x8f850034, 0x30a20020, - 0x0002102b, 0x00021023, 0x30460009, 0x30a30c00, 0x24020400, 0x14620002, - 0x34c40001, 0x34c40005, 0xa744014a, 0x3c020800, 0x8c440820, 0x3c030048, - 0x24020002, 0x00832025, 0x30a30006, 0x1062000d, 0x2c620003, 0x50400005, - 0x24020004, 0x10600012, 0x3c020001, 0x0a000271, 0x00000000, 0x10620007, - 0x24020006, 0x1462000f, 0x3c020111, 0x0a000269, 0x00821025, 0x0a000268, - 0x3c020101, 0x3c020011, 0x00821025, 0x24030001, 0xaf421000, 0xaf830030, - 0x0a000271, 0x00000000, 0x00821025, 0xaf421000, 0xaf800030, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x8f830030, 0x1060003f, 0x3c048000, - 0x8f421000, 0x00441024, 0x1040fffd, 0x00000000, 0x10600039, 0x00000000, - 0x8f421000, 0x3c030020, 0x00431024, 0x10400034, 0x00000000, 0x97421014, - 0x14400031, 0x00000000, 0x97421008, 0x8f84001c, 0x24420006, 0x00024082, - 0x00081880, 0x00643821, 0x8ce50000, 0x30430003, 0x30420001, 0x10400004, - 0x00000000, 0x0000000d, 0x0a0002b0, 0x00081080, 0x5460000f, 0x30a5ffff, - 0x3c06ffff, 0x00a62824, 0x0005182b, 0x00a61026, 0x0002102b, 0x00621824, - 0x10600004, 0x00000000, 0x0000000d, 0x00000000, 0x240001fc, 0x8ce20000, - 0x0a0002af, 0x00462825, 0x0005182b, 0x38a2ffff, 0x0002102b, 0x00621824, - 0x10600004, 0x00000000, 0x0000000d, 0x00000000, 0x24000206, 0x8ce20000, - 0x3445ffff, 0x00081080, 0x00441021, 0x3c030800, 0xac450000, 0x8c620840, - 0x24420001, 0xac620840, 0x8f820008, 0x10400003, 0x00000000, 0x0e000660, - 0x00000000, 0x8f840028, 0x02002821, 0x24820008, 0x30421fff, 0x24434000, - 0x0343d821, 0x30a30007, 0xaf840018, 0xaf820028, 0xaf420084, 0x10600002, - 0x24a20007, 0x3045fff8, 0x8f820044, 0x8f840004, 0x00451821, 0xaf82002c, - 0x0064102b, 0xaf830044, 0x14400002, 0x00641023, 0xaf820044, 0x8f840044, - 0x34028000, 0x8fbf0014, 0x8fb00010, 0x00821021, 0x03421821, 0x3c021000, - 0xaf83001c, 0xaf440080, 0xaf420178, 0x03e00008, 0x27bd0018, 0x8f820024, - 0x27bdffe8, 0xafbf0014, 0x10400004, 0xafb00010, 0x0000000d, 0x00000000, - 0x24000249, 0x8f85001c, 0x24020001, 0xaf820024, 0x8ca70008, 0xa3800023, - 0x8f620004, 0x3c100800, 0x26041b90, 0x00021402, 0xa3820010, 0x304600ff, - 0x24c60005, 0x0e00064a, 0x00063082, 0x8f640004, 0x8f430108, 0x3c021000, - 0x00621824, 0xa7840020, 0x10600008, 0x00000000, 0x97420104, 0x93830023, - 0x2442ffec, 0x34630002, 0xa3830023, 0x0a000304, 0x3045ffff, 0x97420104, - 0x2442fff0, 0x3045ffff, 0x8f620004, 0x3042ffff, 0x2c420013, 0x14400004, - 0x00000000, 0x93820023, 0x34420001, 0xa3820023, 0x93830023, 0x24020001, - 0x10620009, 0x28620002, 0x14400014, 0x24020002, 0x10620012, 0x24020003, - 0x1062000a, 0x00000000, 0x0a000325, 0x00000000, 0x8f82001c, 0x8c43000c, - 0x3c04ffff, 0x00641824, 0x00651825, 0x0a000325, 0xac43000c, 0x8f82001c, - 0x8c430010, 0x3c04ffff, 0x00641824, 0x00651825, 0xac430010, 0x8f620004, - 0x3042ffff, 0x24420002, 0x00021083, 0xa3820038, 0x304500ff, 0x8f82001c, - 0x3c04ffff, 0x00052880, 0x00a22821, 0x8ca70000, 0x97820020, 0x97430104, - 0x00e42024, 0x24420002, 0x00621823, 0x00833825, 0xaca70000, 0x93840038, - 0x26061b90, 0x00041080, 0x00461021, 0x90430000, 0x3063000f, 0x00832021, - 0xa3840022, 0x308200ff, 0x3c04fff6, 0x24420003, 0x00021080, 0x00461021, - 0x8c450000, 0x93830022, 0x8f82001c, 0x3484ffff, 0x00a43824, 0x00031880, - 0x00621821, 0xaf850000, 0xac67000c, 0x93820022, 0x93830022, 0x8f84001c, - 0x24420003, 0x00021080, 0x00461021, 0x24630004, 0x00031880, 0xac470000, - 0x93820022, 0x00661821, 0x94670002, 0x00021080, 0x00441021, 0xac670000, - 0x24030010, 0xac470010, 0xa7430140, 0x24030002, 0xa7400142, 0xa7400144, - 0xa7430146, 0x97420104, 0x8f840034, 0x24030001, 0x2442fffe, 0x30840006, - 0xa7420148, 0x24020002, 0xa743014a, 0x1082000d, 0x2c820003, 0x10400005, - 0x24020004, 0x10800011, 0x3c020009, 0x0a000383, 0x00000000, 0x10820007, - 0x24020006, 0x1482000d, 0x3c020119, 0x0a00037d, 0x24030001, 0x0a00037c, - 0x3c020109, 0x3c020019, 0x24030001, 0xaf421000, 0xaf830030, 0x0a000383, - 0x00000000, 0xaf421000, 0xaf800030, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x93820010, 0x24030008, 0x8f840030, 0x24420002, 0x30420007, - 0x00621823, 0x30630007, 0xaf83000c, 0x10800005, 0x3c038000, 0x8f421000, - 0x00431024, 0x1040fffd, 0x00000000, 0x8f820028, 0xaf820018, 0x24420010, - 0x30421fff, 0xaf820028, 0xaf420084, 0x97430104, 0x24424000, 0x0342d821, - 0x3063ffff, 0x30620007, 0x10400002, 0x24620007, 0x3043fff8, 0x8f820044, - 0x8f840004, 0x00431821, 0xaf82002c, 0x0064102b, 0xaf830044, 0x14400002, - 0x00641023, 0xaf820044, 0x8f840044, 0x34028000, 0x8fbf0014, 0x8fb00010, - 0x00821021, 0x03421821, 0x3c021000, 0xaf83001c, 0xaf440080, 0xaf420178, - 0x03e00008, 0x27bd0018, 0x8f820024, 0x27bdffe8, 0xafbf0014, 0x14400004, - 0xafb00010, 0x0000000d, 0x00000000, 0x240002db, 0x8f620004, 0x04410009, - 0x3c050800, 0x93820022, 0x8f830000, 0x24a41b90, 0xaf800024, 0x24420003, - 0x00021080, 0x00441021, 0xac430000, 0x93820038, 0x24a51b90, 0x93860010, - 0x3c040001, 0x27700008, 0x24420001, 0x00021080, 0x00451021, 0x8c430000, - 0x24c60005, 0x00063082, 0x00641821, 0x02002021, 0x0e00064a, 0xac430000, - 0x93840022, 0x3c057fff, 0x8f620004, 0x00042080, 0x00902021, 0x8c830004, - 0x34a5ffff, 0x00451024, 0x00621821, 0xac830004, 0x93850038, 0x3c07ffff, - 0x93840010, 0x00052880, 0x00b02821, 0x8ca30000, 0x97420104, 0x97860020, - 0x00671824, 0x00441021, 0x00461023, 0x3042ffff, 0x00621825, 0xaca30000, - 0x93830023, 0x24020001, 0x10620009, 0x28620002, 0x1440001a, 0x24020002, - 0x10620018, 0x24020003, 0x1062000d, 0x00000000, 0x0a000411, 0x00000000, - 0x93820010, 0x97430104, 0x8e04000c, 0x00621821, 0x2463fff2, 0x3063ffff, - 0x00872024, 0x00832025, 0x0a000411, 0xae04000c, 0x93820010, 0x97430104, - 0x8e040010, 0x00621821, 0x2463ffee, 0x3063ffff, 0x00872024, 0x00832025, - 0xae040010, 0x9783000e, 0x8f840034, 0x2402000a, 0xa7420140, 0xa7430142, - 0x93820010, 0xa7420144, 0xa7400146, 0x97430104, 0x30840006, 0x24020001, - 0xa7430148, 0xa742014a, 0x24020002, 0x1082000d, 0x2c820003, 0x10400005, - 0x24020004, 0x10800011, 0x3c020041, 0x0a000437, 0x00000000, 0x10820007, - 0x24020006, 0x1482000d, 0x3c020151, 0x0a000431, 0x24030001, 0x0a000430, - 0x3c020141, 0x3c020051, 0x24030001, 0xaf421000, 0xaf830030, 0x0a000437, - 0x00000000, 0xaf421000, 0xaf800030, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x8f820030, 0x93840010, 0x8f850028, 0x10400005, 0x3c038000, - 0x8f421000, 0x00431024, 0x1040fffd, 0x00000000, 0x2483000a, 0x30620007, - 0x10400002, 0x24620007, 0x304303f8, 0x00a31021, 0x30421fff, 0xaf850018, - 0xaf820028, 0xaf420084, 0x97430104, 0x24424000, 0x0342d821, 0x3063ffff, - 0x30620007, 0x10400002, 0x24620007, 0x3043fff8, 0x8f820044, 0x8f840004, - 0x00431821, 0xaf82002c, 0x0064102b, 0xaf830044, 0x14400002, 0x00641023, - 0xaf820044, 0x8f840044, 0x34028000, 0x8fbf0014, 0x8fb00010, 0x00821021, - 0x03421821, 0x3c021000, 0xaf83001c, 0xaf440080, 0xaf420178, 0x03e00008, - 0x27bd0018, 0x3c026000, 0x8c444448, 0x3c030800, 0xac64082c, 0x8f620000, - 0x97430104, 0x3c048000, 0x3046ffff, 0x3067ffff, 0x8f420178, 0x00441024, - 0x1440fffd, 0x2402000a, 0x30c30007, 0xa7420140, 0x24020008, 0x00431023, - 0x30420007, 0x24c3fffe, 0xa7420142, 0xa7430144, 0xa7400146, 0xa7470148, - 0x8f420108, 0x3c036000, 0x8f850034, 0x30420020, 0x0002102b, 0x00021023, - 0x30420009, 0x34420001, 0xa742014a, 0x8c644448, 0x3c020800, 0x30a50006, - 0xac440830, 0x24020002, 0x10a2000d, 0x2ca20003, 0x10400005, 0x24020004, - 0x10a00011, 0x3c020041, 0x0a0004a8, 0x00000000, 0x10a20007, 0x24020006, - 0x14a2000d, 0x3c020151, 0x0a0004a2, 0x24030001, 0x0a0004a1, 0x3c020141, - 0x3c020051, 0x24030001, 0xaf421000, 0xaf830030, 0x0a0004a8, 0x00000000, - 0xaf421000, 0xaf800030, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x8f820030, 0x24c30008, 0x10400006, 0x30e6ffff, 0x3c048000, 0x8f421000, - 0x00441024, 0x1040fffd, 0x00000000, 0x3c026000, 0x8c444448, 0x3065ffff, - 0x3c020800, 0x30a30007, 0x10600003, 0xac440834, 0x24a20007, 0x3045fff8, - 0x8f840028, 0x00851021, 0x30421fff, 0x24434000, 0x0343d821, 0x30c30007, - 0xaf840018, 0xaf820028, 0xaf420084, 0x10600002, 0x24c20007, 0x3046fff8, - 0x8f820044, 0x8f840004, 0x00461821, 0xaf82002c, 0x0064102b, 0xaf830044, - 0x14400002, 0x00641023, 0xaf820044, 0x8f840044, 0x34028000, 0x3c030800, - 0x8c650844, 0x00821021, 0x03421821, 0xaf83001c, 0xaf440080, 0x10a00006, - 0x2402000e, 0x93830043, 0x14620004, 0x3c021000, 0x2402043f, 0xa7420148, - 0x3c021000, 0x3c036000, 0xaf420178, 0x8c644448, 0x3c020800, 0x03e00008, - 0xac440838, 0x8f820034, 0x30424000, 0x10400005, 0x24020800, 0x0000000d, - 0x00000000, 0x24000405, 0x24020800, 0xaf420178, 0x97440104, 0x3c030008, - 0xaf430140, 0x8f820034, 0x30420001, 0x10400006, 0x3085ffff, 0x24020002, - 0x24a3fffe, 0xa7420146, 0x0a0004ff, 0xa7430148, 0xa7400146, 0x8f840028, - 0x2402000d, 0xa742014a, 0x24830008, 0x30631fff, 0x24624000, 0x0342d821, - 0x30a20007, 0xaf840018, 0xaf830028, 0xaf430084, 0x10400002, 0x24a20007, - 0x3045fff8, 0x8f820044, 0x8f840004, 0x00451821, 0xaf82002c, 0x0064102b, - 0xaf830044, 0x14400002, 0x00641023, 0xaf820044, 0x8f840044, 0x34028000, - 0x00821021, 0x03421821, 0x3c021000, 0xaf83001c, 0xaf440080, 0x03e00008, - 0xaf420178, 0x27bdffe8, 0x3c046008, 0xafbf0014, 0xafb00010, 0x8c825000, - 0x3c1a8000, 0x2403ff7f, 0x375b4000, 0x00431024, 0x3442380c, 0xac825000, - 0x8f430008, 0x3c100800, 0x37428000, 0x34630001, 0xaf430008, 0xaf82001c, - 0x3c02601c, 0xaf800028, 0xaf400080, 0xaf400084, 0x8c450008, 0x3c036000, - 0x8c620808, 0x3c040800, 0x3c030080, 0xac830820, 0x3042fff0, 0x38420010, - 0x2c420001, 0xaf850004, 0xaf820008, 0x0e00062f, 0x00000000, 0x8f420000, - 0x30420001, 0x1040fffb, 0x00000000, 0x8f440108, 0x30822000, 0xaf840034, - 0x10400004, 0x8e02083c, 0x24420001, 0x0a00059d, 0xae02083c, 0x30820200, - 0x10400027, 0x00000000, 0x97420104, 0x1040001c, 0x30824000, 0x14400005, - 0x00000000, 0x0e00022d, 0x00000000, 0x0a000592, 0x00000000, 0x8f620008, - 0x8f630000, 0x24020030, 0x00031e02, 0x306300f0, 0x10620007, 0x28620031, - 0x14400031, 0x24020040, 0x10620007, 0x00000000, 0x0a000592, 0x00000000, - 0x0e0002dd, 0x00000000, 0x0a000592, 0x00000000, 0x0e0003b8, 0x00000000, - 0x0a000592, 0x00000000, 0x30820040, 0x1440002d, 0x00000000, 0x0000000d, - 0x00000000, 0x240004a6, 0x0a00059d, 0x00000000, 0x8f430100, 0x24020d00, - 0x1462000f, 0x30820006, 0x97420104, 0x10400005, 0x30820040, 0x0e0004e9, - 0x00000000, 0x0a000592, 0x00000000, 0x1440001b, 0x00000000, 0x0000000d, - 0x00000000, 0x240004b8, 0x0a00059d, 0x00000000, 0x1040000e, 0x30821000, - 0x10400005, 0x00000000, 0x0e00065d, 0x00000000, 0x0a000592, 0x00000000, - 0x0e00046b, 0x00000000, 0x8f820040, 0x24420001, 0xaf820040, 0x0a00059d, - 0x00000000, 0x30820040, 0x14400004, 0x00000000, 0x0000000d, 0x00000000, - 0x240004cf, 0x8f420138, 0x3c034000, 0x00431025, 0xaf420138, 0x0a00053f, - 0x00000000, 0x3c046008, 0x8c835000, 0x3c1a8000, 0x2402ff7f, 0x375b4000, - 0x00621824, 0x3463380c, 0xac835000, 0x8f420008, 0x3c056000, 0x3c03601c, - 0x34420001, 0xaf420008, 0x37428000, 0xaf800028, 0xaf82001c, 0xaf400080, - 0xaf400084, 0x8c660008, 0x8ca20808, 0x3c040800, 0x3c030080, 0xac830820, - 0x3042fff0, 0x38420010, 0x2c420001, 0xaf860004, 0xaf820008, 0x03e00008, - 0x00000000, 0x3084ffff, 0x30820007, 0x10400002, 0x24820007, 0x3044fff8, - 0x8f820028, 0x00441821, 0x30631fff, 0x24644000, 0x0344d821, 0xaf820018, - 0xaf830028, 0x03e00008, 0xaf430084, 0x3084ffff, 0x30820007, 0x10400002, - 0x24820007, 0x3044fff8, 0x8f820044, 0x8f830004, 0x00442021, 0xaf82002c, - 0x0083102b, 0xaf840044, 0x14400002, 0x00831023, 0xaf820044, 0x8f820044, - 0x34038000, 0x00431821, 0x03432021, 0xaf84001c, 0x03e00008, 0xaf420080, - 0x8f830034, 0x24020002, 0x30630006, 0x1062000d, 0x2c620003, 0x50400005, - 0x24020004, 0x10600012, 0x3c020001, 0x0a000601, 0x00000000, 0x10620007, - 0x24020006, 0x1462000f, 0x3c020111, 0x0a0005f9, 0x00821025, 0x0a0005f8, - 0x3c020101, 0x3c020011, 0x00821025, 0x24030001, 0xaf421000, 0xaf830030, - 0x0a000601, 0x00000000, 0x00821025, 0xaf421000, 0xaf800030, 0x00000000, - 0x00000000, 0x00000000, 0x03e00008, 0x00000000, 0x8f820030, 0x10400005, - 0x3c038000, 0x8f421000, 0x00431024, 0x1040fffd, 0x00000000, 0x03e00008, - 0x00000000, 0x8f820034, 0x27bdffe8, 0x30424000, 0x14400005, 0xafbf0010, - 0x0e00022d, 0x00000000, 0x0a00062d, 0x8fbf0010, 0x8f620008, 0x8f630000, - 0x24020030, 0x00031e02, 0x306300f0, 0x10620008, 0x28620031, 0x1440000d, - 0x8fbf0010, 0x24020040, 0x10620007, 0x00000000, 0x0a00062d, 0x00000000, - 0x0e0002dd, 0x00000000, 0x0a00062d, 0x8fbf0010, 0x0e0003b8, 0x00000000, - 0x8fbf0010, 0x03e00008, 0x27bd0018, 0x8f84003c, 0x1080000f, 0x3c026000, - 0x8c430c3c, 0x30630fff, 0xaf830014, 0x14600011, 0x3082000f, 0x10400005, - 0x308200f0, 0x10400003, 0x30820f00, 0x14400006, 0x00000000, 0x0000000d, - 0x00000000, 0x2400050e, 0x03e00008, 0x00000000, 0x0000000d, 0x00000000, - 0x24000513, 0x03e00008, 0x00000000, 0xaf83003c, 0x03e00008, 0x00000000, - 0x10c00007, 0x00000000, 0x8ca20000, 0x24c6ffff, 0x24a50004, 0xac820000, - 0x14c0fffb, 0x24840004, 0x03e00008, 0x00000000, 0x0a000659, 0x00a01021, - 0xac860000, 0x24840004, 0x00a01021, 0x1440fffc, 0x24a5ffff, 0x03e00008, - 0x00000000, 0x0000000d, 0x03e00008, 0x00000000, 0x3c040800, 0x8c82084c, - 0x54400007, 0xac80084c, 0x8f820034, 0x24030400, 0x30420c00, 0x1443005b, - 0x00000000, 0xac80084c, 0x0000000d, 0x00000000, 0x2400003c, 0x3c026000, - 0x8c444448, 0x3c030800, 0xac640850, 0x24000043, 0x97420104, 0x3045ffff, - 0x000530c2, 0x24a2007f, 0x000239c2, 0x2400004e, 0x3c046020, 0x24030020, - 0xac830000, 0x8c820000, 0x30420020, 0x10400005, 0x3c036020, 0x8c620000, - 0x30420020, 0x1440fffd, 0x00000000, 0x3c026020, 0x8c430010, 0x24040001, - 0x0087102b, 0x30ea007f, 0x24abfffe, 0x10400010, 0x00034240, 0x3c056020, - 0x24090020, 0xaca90000, 0x8ca20000, 0x30420020, 0x10400006, 0x24840001, - 0x3c036020, 0x8c620000, 0x30420020, 0x1440fffd, 0x00000000, 0x0087102b, - 0x1440fff4, 0x00000000, 0x8f85001c, 0x3c026020, 0x8c430010, 0x3c046020, - 0x34848000, 0x006a1825, 0x01034025, 0x2400006b, 0x10c0000b, 0x00000000, - 0x8ca30000, 0x24a50004, 0x8ca20000, 0x24a50004, 0x24c6ffff, 0xac820000, - 0x24840004, 0xac830000, 0x14c0fff7, 0x24840004, 0x24000077, 0x3c020007, - 0x34427700, 0x3c036000, 0xac6223c8, 0xac6b23cc, 0xac6823e4, 0x24000086, - 0x3c046000, 0x3c038000, 0x8c8223f8, 0x00431024, 0x1440fffd, 0x3c021000, - 0x3c056000, 0x24030019, 0xaca223f8, 0xa743014a, 0x8ca44448, 0x3c020800, - 0xac440854, 0x03e00008, 0x00000000, 0x00000000 }; +static u8 bnx2_rv2p_proc2[] = { + 0x1f, 0x8b, 0x08, 0x08, 0x7e, 0xd1, 0x41, 0x44, 0x00, 0x03, 0x74, 0x65, + 0x73, 0x74, 0x31, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0xcd, 0x58, 0x5b, 0x6c, + 0x54, 0x55, 0x14, 0x3d, 0xf3, 0xe8, 0xcc, 0x9d, 0xe9, 0xed, 0x9d, 0xf2, + 0xb2, 0x03, 0xad, 0x08, 0xe5, 0xd1, 0x56, 0x29, 0xe8, 0x54, 0xab, 0x18, + 0x15, 0x2c, 0x5a, 0x8c, 0x26, 0x68, 0xf0, 0xf9, 0x63, 0x14, 0x04, 0xda, + 0x9a, 0x56, 0x9b, 0x16, 0xfb, 0x81, 0xaf, 0x09, 0x14, 0x6a, 0x4c, 0x25, + 0xd6, 0x08, 0xc5, 0x47, 0xa0, 0x11, 0x1f, 0x84, 0xf0, 0xd3, 0x1f, 0x3b, + 0x8d, 0x7f, 0x0a, 0x24, 0x6a, 0x88, 0xc4, 0xa8, 0x9f, 0x24, 0x68, 0xa0, + 0x21, 0x0a, 0x58, 0x8b, 0x63, 0x4c, 0xb4, 0xf5, 0xec, 0xbd, 0xf6, 0xb9, + 0x73, 0xef, 0x6d, 0x8b, 0x1a, 0xf9, 0x70, 0x3e, 0xba, 0x7b, 0xce, 0xd9, + 0x67, 0x3f, 0xd6, 0xde, 0x67, 0x9f, 0x7d, 0xae, 0x52, 0xfc, 0xbb, 0xb6, + 0x94, 0xc9, 0x37, 0x83, 0x96, 0xfe, 0x1b, 0x51, 0x0f, 0x85, 0xd3, 0x3c, + 0x8e, 0x2a, 0xa2, 0x49, 0xa5, 0xb2, 0x5e, 0xea, 0x08, 0x7d, 0x44, 0xe8, + 0x70, 0x08, 0xf4, 0xb4, 0xd0, 0x77, 0x84, 0xfe, 0x2e, 0xf4, 0x80, 0xd0, + 0x0f, 0x85, 0xea, 0x5f, 0xd6, 0xd6, 0x7f, 0xf4, 0xb0, 0x46, 0x89, 0x7e, + 0x1b, 0xd3, 0x35, 0xb0, 0xe3, 0xc1, 0x05, 0xc4, 0x77, 0x61, 0xa2, 0xc0, + 0x87, 0xf9, 0x53, 0x7d, 0xa0, 0xd7, 0x60, 0xd7, 0xe1, 0xec, 0x0a, 0xb3, + 0x1f, 0x64, 0x43, 0x09, 0xe8, 0xc6, 0x08, 0xe8, 0xea, 0x65, 0x4c, 0x7a, + 0x9f, 0x0a, 0x63, 0xdc, 0xb8, 0x94, 0xf6, 0x87, 0x55, 0x83, 0x22, 0x3f, + 0x67, 0xaa, 0x68, 0x98, 0xc6, 0xf5, 0x56, 0x6c, 0x18, 0xeb, 0x8f, 0xa5, + 0x40, 0x37, 0x25, 0x41, 0xcf, 0x08, 0xdd, 0x52, 0x2c, 0x7a, 0x6c, 0x31, + 0xbf, 0x98, 0xf6, 0x25, 0x5c, 0x39, 0xc7, 0x6d, 0xe0, 0x96, 0x95, 0xfd, + 0x4a, 0xc1, 0xce, 0x03, 0xb2, 0x3e, 0xa3, 0x0a, 0xb3, 0xaf, 0x6f, 0xc1, + 0xb8, 0xfc, 0x20, 0xf9, 0xa7, 0xff, 0xcf, 0x62, 0x7e, 0xfa, 0xfd, 0xf8, + 0x15, 0xf6, 0x83, 0x96, 0x2f, 0xa2, 0x75, 0x27, 0xd3, 0x3f, 0x88, 0xf1, + 0xde, 0x25, 0x32, 0x1f, 0x36, 0xf8, 0x18, 0x79, 0x41, 0x5c, 0x99, 0x58, + 0xc7, 0x2a, 0x7d, 0xf2, 0x2b, 0x15, 0xe4, 0x2f, 0xc8, 0x2e, 0x35, 0xf2, + 0x81, 0xfb, 0xfa, 0x16, 0xb2, 0x73, 0x4c, 0xc7, 0x01, 0xb8, 0xcd, 0x0a, + 0x95, 0xb2, 0xdc, 0x7d, 0x83, 0x5e, 0x3d, 0x51, 0xad, 0x07, 0xfa, 0x54, + 0xa5, 0xc5, 0x20, 0x65, 0x97, 0x81, 0xaa, 0x5a, 0xbf, 0x1f, 0x7b, 0x97, + 0x18, 0x7b, 0x30, 0x9e, 0x9d, 0x01, 0xdd, 0x23, 0xf4, 0xaa, 0x3a, 0x26, + 0xcb, 0x7f, 0xb8, 0xc1, 0x62, 0x0c, 0xb2, 0xb5, 0xde, 0x7c, 0x38, 0x32, + 0x61, 0xf0, 0x52, 0x8b, 0x40, 0xce, 0x2e, 0x21, 0x3e, 0x1d, 0x9c, 0x4a, + 0xc8, 0x5d, 0xdf, 0x32, 0x55, 0x1e, 0x7d, 0x30, 0x45, 0x1e, 0x61, 0xff, + 0xb7, 0x2b, 0x7c, 0xf9, 0xa4, 0xda, 0x25, 0x4f, 0x36, 0x22, 0x8f, 0xac, + 0xa7, 0x3e, 0x91, 0x85, 0x6b, 0x13, 0xfa, 0xcf, 0x84, 0x7a, 0x32, 0x4e, + 0x01, 0x8a, 0x2b, 0x87, 0xfd, 0x53, 0xe2, 0xe7, 0x26, 0xed, 0x27, 0xd1, + 0x8a, 0x50, 0xb6, 0x36, 0xc1, 0x38, 0x35, 0xc4, 0xa0, 0xaf, 0x61, 0x03, + 0xb6, 0xaf, 0x46, 0x5c, 0x7b, 0x4f, 0x86, 0x8d, 0xfd, 0x51, 0xfa, 0x3b, + 0xd0, 0xb6, 0x9d, 0x47, 0x03, 0xd1, 0x1d, 0x4c, 0xed, 0x63, 0x95, 0x58, + 0xee, 0x8a, 0xf0, 0x7a, 0x72, 0x97, 0xcc, 0xf7, 0xec, 0xf0, 0xdb, 0xfd, + 0x02, 0xf2, 0xdb, 0x7e, 0x7e, 0x47, 0x88, 0xa8, 0x13, 0x73, 0xf9, 0x98, + 0x3a, 0x3b, 0xb7, 0x13, 0xff, 0x55, 0x6a, 0xd7, 0x20, 0x29, 0x4e, 0xab, + 0x0d, 0x6b, 0xb1, 0x6f, 0x77, 0x2c, 0xc5, 0xb8, 0x36, 0xad, 0x05, 0xfd, + 0x1e, 0xf3, 0xf3, 0x9d, 0x1e, 0xe2, 0x2f, 0x9d, 0xe7, 0x0c, 0x71, 0x5e, + 0xa9, 0x11, 0xce, 0xc7, 0x04, 0x65, 0x06, 0xff, 0xda, 0xaa, 0xc1, 0xdf, + 0xbc, 0x99, 0x15, 0xbf, 0xd9, 0x9a, 0xe7, 0x3c, 0x18, 0xe8, 0x18, 0x26, + 0x3f, 0xe7, 0xaa, 0x91, 0x4e, 0xa2, 0x51, 0xd5, 0xb0, 0x90, 0xf0, 0x5e, + 0x15, 0x36, 0x71, 0x3a, 0x7f, 0x33, 0xcd, 0xcf, 0xd3, 0xeb, 0x26, 0x1e, + 0x24, 0xd7, 0x92, 0x78, 0x45, 0x5d, 0x7c, 0xf2, 0x61, 0xf8, 0xdb, 0xcd, + 0x76, 0x5f, 0x97, 0xec, 0xe6, 0xfc, 0x4a, 0xaa, 0x26, 0x8e, 0x7f, 0xd4, + 0x6a, 0x1b, 0xc6, 0xfa, 0xf9, 0x8f, 0x8d, 0x5c, 0xd2, 0x53, 0x23, 0x75, + 0x44, 0xb9, 0x72, 0xa2, 0x37, 0x83, 0xee, 0x34, 0x7a, 0xeb, 0x88, 0x6f, + 0xb1, 0x42, 0xfe, 0x26, 0x26, 0xc9, 0x69, 0x03, 0xce, 0xf6, 0x33, 0xec, + 0xf7, 0x35, 0xf6, 0x85, 0x3e, 0x63, 0x2f, 0xe6, 0x2f, 0xfa, 0xf4, 0x95, + 0x7b, 0xf4, 0x11, 0x7f, 0x51, 0xf2, 0x02, 0xef, 0x9b, 0x63, 0x3d, 0x3b, + 0xcc, 0xb8, 0x58, 0xcf, 0x0c, 0x41, 0xfe, 0xc5, 0x21, 0xe2, 0x9f, 0x23, + 0x7a, 0xed, 0xff, 0x88, 0xe7, 0x9c, 0x30, 0xe4, 0x4c, 0x8f, 0x5f, 0xc1, + 0x6f, 0xe3, 0x17, 0xcb, 0xb5, 0x47, 0x73, 0x69, 0xe6, 0x33, 0xf1, 0xe8, + 0x0e, 0x73, 0x02, 0xa6, 0x1b, 0x16, 0xfa, 0x71, 0x33, 0xf6, 0x9c, 0xdf, + 0xcc, 0x79, 0x3e, 0xd1, 0x26, 0x75, 0x40, 0x71, 0x9d, 0xb9, 0x5d, 0xe2, + 0xa1, 0xf3, 0x3a, 0x04, 0xff, 0x46, 0x73, 0x2c, 0x3f, 0xd9, 0xc5, 0x79, + 0xb9, 0xd2, 0x8e, 0xe6, 0x38, 0x5e, 0xd6, 0xd9, 0x21, 0x6c, 0x2b, 0xd4, + 0x4f, 0xc8, 0x6b, 0xb6, 0x41, 0x9b, 0xa4, 0x8e, 0x9e, 0x15, 0xda, 0x6d, + 0x33, 0x3e, 0xba, 0x8e, 0x59, 0x2c, 0x3f, 0x9b, 0x32, 0xf7, 0x0c, 0xd6, + 0x9f, 0x16, 0x39, 0x3f, 0x0a, 0x55, 0x22, 0xa7, 0x55, 0xf6, 0x9f, 0xf3, + 0xc9, 0x89, 0x04, 0xe4, 0x84, 0x94, 0xc1, 0xcd, 0x9c, 0xef, 0x5d, 0x52, + 0xbf, 0xf7, 0xc5, 0xa6, 0xab, 0xb7, 0x7c, 0x0e, 0xdc, 0xba, 0x5a, 0x8e, + 0x3a, 0x53, 0x1f, 0x0d, 0xb3, 0xbf, 0x03, 0xdd, 0x3b, 0x80, 0x53, 0x8f, + 0xe0, 0x14, 0x07, 0x4e, 0xf3, 0x0a, 0xf5, 0x59, 0x14, 0xd4, 0x90, 0xfe, + 0x53, 0x21, 0xe3, 0xc7, 0xbe, 0x98, 0xaf, 0xfe, 0xf6, 0x9a, 0xfa, 0x5b, + 0xa8, 0xd3, 0xc4, 0xff, 0xb3, 0xa9, 0x6f, 0x5a, 0x9f, 0xd1, 0xff, 0x6f, + 0xf5, 0x72, 0x9c, 0x92, 0xdd, 0x7d, 0x26, 0xce, 0x98, 0x2e, 0xd4, 0xd9, + 0x22, 0x22, 0xcb, 0x46, 0x3a, 0x99, 0x5e, 0xdf, 0xbc, 0x15, 0xf3, 0x65, + 0x7c, 0x4e, 0x6e, 0x09, 0x01, 0xaf, 0xa8, 0x3a, 0xde, 0x87, 0xba, 0xae, + 0xe2, 0x2c, 0xaf, 0xe2, 0x28, 0xc7, 0x3f, 0xaa, 0xe5, 0x12, 0xdf, 0x67, + 0xa1, 0x42, 0x3e, 0x7a, 0xfd, 0xd9, 0xad, 0xf3, 0x84, 0xec, 0x88, 0xe9, + 0xbc, 0xa5, 0xb1, 0x3e, 0x47, 0xb6, 0xe4, 0xf9, 0x1a, 0xe6, 0xb3, 0xc7, + 0x22, 0x34, 0xff, 0x80, 0xd5, 0xd3, 0x87, 0xf9, 0x9f, 0x1a, 0x69, 0xbc, + 0xce, 0x7e, 0x0d, 0xe7, 0xcc, 0x7e, 0x0d, 0xf5, 0xcb, 0x2a, 0x3a, 0x88, + 0xba, 0xd6, 0x78, 0x10, 0xf2, 0x71, 0x4f, 0x7b, 0xfd, 0xf2, 0xe2, 0x47, + 0xe7, 0xe1, 0xb2, 0x38, 0xd9, 0xcf, 0x09, 0x4e, 0x97, 0x7c, 0xf1, 0x39, + 0x6c, 0xe2, 0xd3, 0x1b, 0x93, 0xf3, 0xd2, 0x7c, 0x29, 0xe8, 0x17, 0xf1, + 0x9d, 0x71, 0xef, 0x9d, 0xae, 0x95, 0xa0, 0xdd, 0x2b, 0xe5, 0x9c, 0xd6, + 0xf9, 0xf3, 0x6b, 0x3e, 0xea, 0xf2, 0xb8, 0x7b, 0x4f, 0x20, 0xbf, 0xac, + 0x9d, 0xf0, 0x4b, 0xbd, 0x28, 0x79, 0x3c, 0x2e, 0xf4, 0x65, 0xc9, 0xdf, + 0x6d, 0xd2, 0xb7, 0x98, 0xfe, 0xe2, 0x0f, 0xcc, 0x3b, 0xfd, 0x6e, 0x5f, + 0x60, 0xea, 0x36, 0x8d, 0x43, 0xca, 0x89, 0x13, 0x83, 0x36, 0xeb, 0x33, + 0x24, 0x4a, 0xcf, 0x1a, 0xe0, 0x35, 0x52, 0x07, 0xbe, 0xdd, 0x91, 0xb0, + 0x8c, 0x21, 0x6f, 0xac, 0xda, 0x77, 0x0f, 0xd7, 0x4f, 0xc6, 0x93, 0xe4, + 0xc6, 0xdc, 0xfa, 0x24, 0x79, 0xaf, 0x26, 0x84, 0x96, 0x2f, 0xbe, 0x2c, + 0xbe, 0x85, 0xfe, 0x64, 0xa9, 0x17, 0xdf, 0x97, 0x34, 0xbe, 0xbc, 0xaf, + 0xbe, 0xf9, 0x12, 0xa6, 0x4b, 0x6f, 0x05, 0xed, 0xbb, 0x95, 0xe7, 0x17, + 0xa3, 0xee, 0x11, 0x7e, 0x9c, 0x5f, 0xf5, 0x6f, 0x0c, 0x9a, 0x7e, 0x42, + 0xf0, 0x08, 0xf4, 0x41, 0x65, 0x77, 0x80, 0xbe, 0x29, 0x74, 0xce, 0x2a, + 0xd0, 0xbd, 0xab, 0xfc, 0x71, 0x88, 0xa5, 0x7c, 0x71, 0xac, 0x47, 0x1c, + 0x8f, 0x4c, 0x04, 0xeb, 0x81, 0xc4, 0x4b, 0xc7, 0x27, 0x70, 0xbf, 0x1b, + 0xfd, 0xe2, 0xce, 0xdf, 0xc5, 0xed, 0x4a, 0xc7, 0xab, 0x7b, 0x25, 0xee, + 0x93, 0x0e, 0xe9, 0x4b, 0xc7, 0xdc, 0xfb, 0xe2, 0x9f, 0xc4, 0x31, 0x7e, + 0x85, 0xe3, 0x78, 0xf7, 0xff, 0x2c, 0x8e, 0x9d, 0x12, 0xc7, 0x22, 0xb9, + 0x57, 0x4d, 0xbf, 0xd9, 0x2e, 0x7d, 0x18, 0xf5, 0x8d, 0x7e, 0xbd, 0x4f, + 0x70, 0x1f, 0x78, 0xb5, 0x5b, 0x8f, 0xe7, 0x33, 0x7f, 0x4e, 0xf6, 0x95, + 0xca, 0xbe, 0x7b, 0x26, 0xed, 0x3b, 0xc5, 0xf5, 0xee, 0xf1, 0xf1, 0xc9, + 0xef, 0x15, 0x9f, 0x9d, 0x59, 0x95, 0x02, 0xee, 0xa8, 0xe3, 0xb1, 0x29, + 0xde, 0x37, 0x86, 0x1f, 0xf9, 0xb5, 0x36, 0x85, 0xba, 0x05, 0xfe, 0xb9, + 0x9e, 0x7a, 0x4a, 0xe3, 0xfb, 0xc7, 0xa7, 0xef, 0x57, 0x8d, 0x3c, 0xc4, + 0x6d, 0x43, 0xb8, 0x84, 0xf9, 0x4e, 0xb7, 0xf3, 0x7d, 0xe7, 0xfa, 0xb7, + 0x9a, 0xfd, 0x3a, 0x2a, 0xfe, 0x55, 0x88, 0x7f, 0x7a, 0xb9, 0x96, 0xeb, + 0xbe, 0x75, 0xba, 0xdd, 0xeb, 0xdf, 0x9d, 0x97, 0xd1, 0xf7, 0x4f, 0xfb, + 0x63, 0xd1, 0x9b, 0x32, 0xfa, 0x49, 0x5e, 0xb9, 0xf4, 0x7d, 0xd4, 0x4f, + 0x62, 0x7e, 0x72, 0x9f, 0x41, 0xfa, 0x5b, 0x34, 0x5e, 0x72, 0xdf, 0x70, + 0x3e, 0x47, 0xac, 0xa3, 0x6c, 0x57, 0x5e, 0xf9, 0x71, 0x39, 0x23, 0x7c, + 0x53, 0xc5, 0x8d, 0xd6, 0x8b, 0x64, 0x7d, 0x2a, 0xbf, 0xc5, 0x4e, 0x37, + 0x1f, 0x64, 0x1f, 0xf3, 0x35, 0x0b, 0x5f, 0x34, 0x34, 0x39, 0xfe, 0x18, + 0xe5, 0xab, 0x38, 0xaf, 0xf7, 0x6f, 0xcb, 0x11, 0x9f, 0x76, 0x9e, 0xf3, + 0xf0, 0xfb, 0x80, 0x7d, 0xe9, 0x2b, 0x80, 0x23, 0xf1, 0xcd, 0x50, 0x4d, + 0xce, 0x74, 0x78, 0xe1, 0xdd, 0x30, 0x9a, 0x33, 0x78, 0xdb, 0xec, 0xe7, + 0x48, 0x27, 0xe9, 0x5f, 0x1d, 0xc0, 0x31, 0x2c, 0x38, 0x9e, 0x50, 0x7f, + 0x9f, 0xf7, 0xc6, 0x0f, 0x6f, 0x5e, 0x8c, 0xff, 0x19, 0xcc, 0xe3, 0x87, + 0xe5, 0x5d, 0xdd, 0x18, 0x03, 0xfd, 0x2e, 0x62, 0xec, 0x46, 0x5e, 0xdf, + 0xc3, 0xe7, 0xb5, 0x4a, 0xf5, 0xf2, 0xbb, 0xc3, 0x52, 0x0d, 0x6b, 0xc9, + 0xee, 0x94, 0xae, 0x7f, 0xc8, 0x77, 0x27, 0xee, 0xbd, 0xb7, 0x75, 0x0d, + 0x4c, 0xc4, 0x69, 0x58, 0x31, 0x33, 0xc1, 0x82, 0xde, 0xf8, 0xe2, 0x4b, + 0x5e, 0x7e, 0xaf, 0xbf, 0x18, 0xf3, 0x65, 0xf7, 0x91, 0x9c, 0x88, 0xda, + 0x8b, 0xba, 0xfb, 0xee, 0x1e, 0xd0, 0xb7, 0xd5, 0xbd, 0xd8, 0x3f, 0x73, + 0x3b, 0xd7, 0x51, 0xab, 0x4c, 0xf2, 0x2b, 0x0d, 0x5c, 0xd3, 0xa8, 0xc3, + 0x13, 0x13, 0xaa, 0x04, 0xf7, 0x9a, 0x79, 0x07, 0xab, 0x1a, 0xd1, 0x8b, + 0xfa, 0x68, 0x17, 0xde, 0xc1, 0x44, 0x8b, 0x83, 0x7d, 0x9f, 0x55, 0xe8, + 0xaf, 0x08, 0x8f, 0xf7, 0x5d, 0x1c, 0xd3, 0xe1, 0x60, 0x5d, 0xf2, 0xfa, + 0x15, 0x93, 0x73, 0xfd, 0xab, 0xfb, 0x6e, 0xee, 0xe1, 0x7e, 0x2a, 0x19, + 0xac, 0xcb, 0x01, 0xf9, 0xfb, 0x24, 0x7e, 0x49, 0x89, 0x5f, 0x54, 0xc7, + 0x0f, 0xef, 0xed, 0x4f, 0x7d, 0xef, 0x7a, 0xaa, 0x1b, 0xde, 0xbc, 0xfb, + 0xfc, 0x4f, 0x63, 0xd7, 0xf6, 0x98, 0xb7, 0x0e, 0x57, 0xbb, 0xe7, 0xae, + 0x43, 0xde, 0x8b, 0x5d, 0x87, 0x30, 0xce, 0x73, 0xbf, 0xbc, 0x38, 0xd3, + 0x21, 0x79, 0x74, 0x57, 0x44, 0xf2, 0x41, 0xec, 0xfb, 0x22, 0x62, 0xee, + 0x1b, 0x8c, 0xbf, 0x92, 0xfb, 0xee, 0x97, 0x2a, 0xf4, 0xd9, 0x17, 0x87, + 0xcc, 0xfb, 0xc4, 0xbc, 0x57, 0xb0, 0xbe, 0x3e, 0xae, 0x04, 0x67, 0xbe, + 0xff, 0xb5, 0x3f, 0x9c, 0xaf, 0x99, 0x8e, 0x61, 0x1f, 0x5e, 0x2a, 0x16, + 0x78, 0xbf, 0xc4, 0xe5, 0xfb, 0x45, 0xbf, 0xe0, 0xe1, 0xf0, 0xf9, 0x29, + 0xd5, 0xf6, 0x13, 0x4d, 0x65, 0x3a, 0x73, 0xb0, 0xa7, 0xd5, 0xed, 0x23, + 0xc1, 0x27, 0xd4, 0x79, 0x4b, 0xde, 0xc1, 0xf2, 0x5e, 0xd6, 0xef, 0x61, + 0xf4, 0x73, 0xad, 0x79, 0x8c, 0xc7, 0xd0, 0xb7, 0x39, 0xbf, 0xca, 0xbd, + 0xb5, 0x75, 0x9b, 0xe9, 0x4b, 0xa7, 0xde, 0x67, 0xee, 0xb9, 0xb6, 0x6a, + 0xd0, 0x16, 0xee, 0x5b, 0x1f, 0xb2, 0xf3, 0x92, 0x1f, 0x85, 0x77, 0x89, + 0xff, 0x3d, 0x62, 0xfa, 0x85, 0x73, 0xc5, 0xb8, 0x67, 0xf3, 0xbd, 0x34, + 0xa1, 0xdf, 0x23, 0x09, 0x6f, 0x9e, 0x25, 0x32, 0x65, 0x82, 0xfb, 0xec, + 0x9b, 0x40, 0xf7, 0xdc, 0x84, 0xbe, 0xbc, 0xb5, 0x4b, 0x70, 0xb8, 0x91, + 0x71, 0x5b, 0x3e, 0x9a, 0x0b, 0x7e, 0x67, 0x21, 0x5c, 0x7f, 0x73, 0xfb, + 0xd1, 0x73, 0x6c, 0xd7, 0xbc, 0x81, 0x3c, 0xf3, 0xcd, 0x55, 0xb3, 0xf8, + 0xfc, 0xa6, 0x9d, 0x51, 0xd8, 0x99, 0xe9, 0x17, 0xbf, 0xda, 0x6f, 0x01, + 0xed, 0x92, 0x3a, 0x73, 0xd2, 0x7d, 0x97, 0xc3, 0x4e, 0x53, 0x4f, 0x26, + 0xbf, 0x13, 0x30, 0x9e, 0x5b, 0xc7, 0x63, 0xd5, 0xbc, 0x95, 0xe4, 0x97, + 0x4c, 0x7a, 0xcf, 0x16, 0xe2, 0x6e, 0xf2, 0xc1, 0xe4, 0x8f, 0xf7, 0x1d, + 0x7b, 0x9b, 0xa7, 0x5e, 0xfa, 0xe3, 0xef, 0x70, 0xbe, 0x84, 0x65, 0x3d, + 0x96, 0xe9, 0xef, 0xbb, 0x3c, 0x3e, 0x6f, 0x01, 0x9f, 0x8c, 0xd8, 0x6d, + 0xb7, 0xf0, 0x3b, 0x74, 0x96, 0xda, 0x25, 0xf1, 0x39, 0x57, 0x2d, 0x75, + 0x50, 0xec, 0xfb, 0x49, 0xfa, 0x1f, 0xc4, 0x31, 0x6e, 0x6f, 0xc9, 0x49, + 0xdc, 0x24, 0x8f, 0x9e, 0x16, 0xbf, 0x7f, 0x84, 0xdf, 0xb6, 0xf1, 0xbb, + 0xc5, 0xf5, 0xdb, 0xd4, 0x59, 0xaf, 0x9c, 0x99, 0x3a, 0x1f, 0xb8, 0x5e, + 0xdb, 0x27, 0xf9, 0xdd, 0x53, 0x24, 0xe7, 0xa1, 0x42, 0xbe, 0x3b, 0x38, + 0xe2, 0x4f, 0x89, 0x6a, 0x5a, 0xee, 0xdd, 0x57, 0x2c, 0xfb, 0x92, 0x7a, + 0x1f, 0xe6, 0x71, 0xfe, 0xec, 0x29, 0xf0, 0x34, 0xdf, 0x11, 0x8c, 0xdc, + 0xe0, 0x39, 0xf2, 0xe2, 0xc7, 0x37, 0x13, 0xff, 0x50, 0x07, 0x74, 0x9c, + 0x6a, 0xcd, 0xf7, 0x07, 0xcc, 0xe3, 0xfc, 0x26, 0xf7, 0xb7, 0xa1, 0xaf, + 0xdc, 0xdf, 0x76, 0x48, 0xfa, 0x08, 0xc1, 0xe5, 0x81, 0x21, 0xb2, 0x43, + 0xc7, 0xae, 0xd2, 0x7f, 0xfe, 0x61, 0x47, 0x54, 0xec, 0x28, 0xf7, 0xd8, + 0x11, 0xd0, 0x7b, 0x1d, 0xcd, 0xaf, 0x50, 0x5f, 0x73, 0x1e, 0x2e, 0x57, + 0xeb, 0x29, 0x47, 0xf4, 0xbd, 0xb0, 0xae, 0x88, 0xc6, 0xcb, 0xd4, 0xab, + 0xf0, 0xb7, 0x37, 0x59, 0x84, 0x3a, 0x96, 0xdc, 0x49, 0xf3, 0x35, 0xea, + 0xd5, 0x3e, 0x0e, 0xc4, 0x2b, 0xea, 0x18, 0xea, 0x73, 0xe3, 0x41, 0xb6, + 0x47, 0x1d, 0x1f, 0x34, 0xf5, 0x7a, 0xca, 0xef, 0x98, 0xbd, 0xeb, 0xa4, + 0x5e, 0x9c, 0xc0, 0x77, 0x51, 0xfd, 0x5e, 0x23, 0xfe, 0xd9, 0xe6, 0x3d, + 0xb8, 0xfb, 0x98, 0xa1, 0x8b, 0x7c, 0xe3, 0xfd, 0x27, 0x96, 0x0a, 0xad, + 0xf2, 0x8d, 0x07, 0xd6, 0x55, 0x09, 0xad, 0x36, 0xe3, 0xe9, 0xbe, 0x2b, + 0x5e, 0x29, 0xf9, 0x62, 0xf7, 0x7b, 0xe2, 0xcf, 0x47, 0xe2, 0xcf, 0x59, + 0xe0, 0x9f, 0xdc, 0x28, 0x78, 0x2c, 0x0a, 0xea, 0x17, 0xbb, 0xdc, 0x73, + 0x63, 0xd6, 0x11, 0x8f, 0x47, 0xd5, 0x5f, 0x3f, 0x97, 0x8f, 0x31, 0xd8, + 0x17, 0x00, 0x00, 0x00 }; -static u32 bnx2_TPAT_b06FwData[(0x0/4) + 1] = { 0x00000000 }; -static u32 bnx2_TPAT_b06FwRodata[(0x0/4) + 1] = { 0x00000000 }; -static u32 bnx2_TPAT_b06FwBss[(0x80/4) + 1] = { 0x00000000 }; -static u32 bnx2_TPAT_b06FwSbss[(0x48/4) + 1] = { 0x00000000 }; +static const int bnx2_TPAT_b06FwReleaseMajor = 0x1; +static const int bnx2_TPAT_b06FwReleaseMinor = 0x0; +static const int bnx2_TPAT_b06FwReleaseFix = 0x0; +static const u32 bnx2_TPAT_b06FwStartAddr = 0x08000860; +static const u32 bnx2_TPAT_b06FwTextAddr = 0x08000800; +static const int bnx2_TPAT_b06FwTextLen = 0x122c; +static const u32 bnx2_TPAT_b06FwDataAddr = 0x08001a60; +static const int bnx2_TPAT_b06FwDataLen = 0x0; +static const u32 bnx2_TPAT_b06FwRodataAddr = 0x00000000; +static const int bnx2_TPAT_b06FwRodataLen = 0x0; +static const u32 bnx2_TPAT_b06FwBssAddr = 0x08001aa0; +static const int bnx2_TPAT_b06FwBssLen = 0x250; +static const u32 bnx2_TPAT_b06FwSbssAddr = 0x08001a60; +static const int bnx2_TPAT_b06FwSbssLen = 0x34; +static u8 bnx2_TPAT_b06FwText[] = { + 0x1f, 0x8b, 0x08, 0x08, 0x47, 0xd2, 0x41, 0x44, 0x00, 0x03, 0x74, 0x65, + 0x73, 0x74, 0x31, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0xc5, 0x57, 0x4d, 0x68, + 0x1c, 0xe7, 0x19, 0x7e, 0xe7, 0x77, 0x47, 0x62, 0x25, 0x8d, 0x93, 0x3d, + 0xac, 0x5d, 0xa5, 0x99, 0x91, 0x46, 0x3f, 0x54, 0x26, 0x9e, 0x84, 0xa5, + 0x56, 0x61, 0x20, 0xe3, 0x99, 0x95, 0x2c, 0x0c, 0x05, 0x07, 0x42, 0x08, + 0xe4, 0xb2, 0x1d, 0x49, 0x36, 0x85, 0x1e, 0x5a, 0x9a, 0x43, 0xa0, 0x05, + 0x0f, 0x33, 0xeb, 0x34, 0x87, 0xc5, 0xdb, 0xaa, 0xc5, 0xbe, 0x94, 0xd6, + 0x95, 0xea, 0xe8, 0xb2, 0x68, 0xe2, 0x53, 0x0f, 0xc5, 0xd8, 0xb4, 0x54, + 0xd0, 0x53, 0x7b, 0x0a, 0x85, 0x5c, 0x4c, 0x69, 0x20, 0x85, 0x12, 0x44, + 0x0f, 0x21, 0xd4, 0xad, 0xa7, 0xcf, 0xfb, 0xcd, 0x8c, 0xbc, 0xbb, 0x95, + 0x5b, 0x1f, 0x02, 0x15, 0xac, 0x66, 0xe6, 0xfb, 0xde, 0xf7, 0xfb, 0x79, + 0x9f, 0xe7, 0x79, 0xbf, 0xf7, 0x6b, 0xca, 0x34, 0x49, 0xe5, 0xdf, 0x14, + 0x7e, 0x6f, 0x7f, 0xe3, 0xdb, 0x6f, 0x7f, 0xf5, 0xa5, 0x57, 0x2c, 0xa2, + 0x57, 0x5e, 0x92, 0x64, 0x5d, 0xa6, 0x2f, 0xe0, 0x4f, 0x21, 0x32, 0xab, + 0xf1, 0xf9, 0x47, 0x86, 0xec, 0x75, 0xce, 0x04, 0x0e, 0x19, 0x8a, 0x77, + 0x34, 0xbb, 0xe9, 0x10, 0xf9, 0x83, 0x15, 0x2b, 0xa4, 0x7f, 0xe5, 0x71, + 0x43, 0x25, 0x6e, 0x7f, 0xc1, 0xfb, 0xe7, 0xb9, 0x7b, 0xe7, 0xed, 0xa3, + 0xdb, 0x0a, 0x19, 0xa6, 0xd7, 0x31, 0xcc, 0x45, 0x32, 0x66, 0xe1, 0xf3, + 0xd3, 0xa5, 0x75, 0x8d, 0xa6, 0xab, 0xb1, 0x4c, 0x4a, 0xfa, 0x06, 0xad, + 0xf5, 0x30, 0x8e, 0xf3, 0x8e, 0x14, 0x66, 0xaa, 0x14, 0xde, 0x32, 0x48, + 0xf6, 0x7c, 0x29, 0xc8, 0x1c, 0xf4, 0x49, 0x14, 0xb8, 0x35, 0xf2, 0xcd, + 0x3c, 0xff, 0xa6, 0x2b, 0x93, 0xec, 0x3c, 0xce, 0xe7, 0x17, 0xd6, 0xa5, + 0x60, 0x7f, 0x43, 0x0a, 0xf7, 0x03, 0xde, 0x37, 0xd6, 0xb1, 0x2e, 0xf9, + 0xfb, 0xfc, 0xf4, 0x8c, 0xb0, 0x37, 0x4d, 0x9d, 0x06, 0xcd, 0xc8, 0x0e, + 0xfb, 0x5a, 0x14, 0xba, 0x2b, 0x4d, 0x85, 0xe6, 0xf1, 0x9b, 0xa0, 0x6d, + 0x97, 0xea, 0x81, 0x4b, 0xaa, 0xe2, 0xc8, 0x14, 0x36, 0x24, 0xfa, 0x65, + 0x4b, 0xc3, 0xef, 0x92, 0xd4, 0xde, 0xdf, 0x2a, 0xc7, 0x69, 0x50, 0x8a, + 0xb5, 0x44, 0x0d, 0x5e, 0x5b, 0xe1, 0x1f, 0xb8, 0x2b, 0xa6, 0x4c, 0xf3, + 0xf8, 0x4d, 0xe1, 0x3d, 0x82, 0x9d, 0x46, 0x41, 0x6b, 0xbc, 0x6f, 0x02, + 0xef, 0x58, 0x27, 0xc6, 0x0a, 0xc4, 0x3a, 0x2c, 0xac, 0xc3, 0xa1, 0x6e, + 0x7f, 0x03, 0xfb, 0x58, 0x68, 0x46, 0xa4, 0x53, 0x57, 0xac, 0x7d, 0x8a, + 0x12, 0x53, 0xa1, 0xe4, 0xac, 0x46, 0xfe, 0x65, 0x15, 0xdf, 0xcf, 0x51, + 0x6c, 0x4a, 0xb0, 0xe9, 0x96, 0xf8, 0xd5, 0xd0, 0xaf, 0xa3, 0x7d, 0x86, + 0x92, 0xc6, 0x29, 0x49, 0xf6, 0xbe, 0x8f, 0xf6, 0x05, 0x33, 0xa2, 0xef, + 0xe1, 0x29, 0xe1, 0xfb, 0x14, 0x8f, 0x87, 0x6f, 0x89, 0x14, 0x87, 0xcc, + 0x20, 0xb3, 0x28, 0xcd, 0x2a, 0x5f, 0x6e, 0x2f, 0xda, 0xe2, 0x6c, 0x1c, + 0x3b, 0xd8, 0xf5, 0x5f, 0xa5, 0x8e, 0x49, 0xb1, 0xea, 0xc1, 0xa6, 0xef, + 0x98, 0x6d, 0xe0, 0xe4, 0x0b, 0x3c, 0xbf, 0xc6, 0xed, 0xfc, 0x87, 0x76, + 0x8b, 0x14, 0xcf, 0x31, 0x43, 0x6a, 0x51, 0xd1, 0xd7, 0x30, 0x83, 0x5b, + 0x2f, 0x93, 0x2f, 0xe2, 0x61, 0xe0, 0xdd, 0xc4, 0x9e, 0x74, 0x60, 0x9b, + 0xf8, 0x32, 0xc5, 0x4d, 0x83, 0xec, 0xd5, 0x2d, 0xf4, 0x7c, 0xdc, 0x53, + 0x10, 0x67, 0xc6, 0x49, 0x2d, 0xfd, 0x18, 0xd7, 0xdf, 0x62, 0x5d, 0xb1, + 0x69, 0xd0, 0x0c, 0x75, 0x5e, 0xcf, 0xf3, 0x3b, 0x6e, 0x9e, 0xeb, 0x9e, + 0xb3, 0xfc, 0x3e, 0xad, 0x34, 0x35, 0x5a, 0x34, 0xf1, 0x44, 0xdc, 0x1c, + 0xc4, 0x46, 0x2d, 0xe7, 0x9f, 0x2a, 0xd7, 0xfa, 0x48, 0x42, 0xe8, 0xe9, + 0xcf, 0xbd, 0xdf, 0xf0, 0xde, 0x97, 0xd7, 0x85, 0x7d, 0x9e, 0xef, 0xae, + 0x3e, 0xcd, 0x5e, 0x93, 0x0b, 0xfb, 0x3c, 0x5f, 0x6b, 0xf1, 0x7c, 0x36, + 0xf6, 0xc6, 0x9c, 0x24, 0x5a, 0x1b, 0xb8, 0x46, 0xd4, 0xc3, 0xba, 0x1c, + 0x3c, 0x07, 0x4d, 0xac, 0xdd, 0x5e, 0xb6, 0x24, 0x83, 0x12, 0x27, 0x7f, + 0x11, 0x3c, 0xf0, 0x43, 0xc7, 0xfe, 0x53, 0xa8, 0xd4, 0x68, 0xcf, 0xad, + 0x53, 0x37, 0x6b, 0x52, 0x92, 0x75, 0x29, 0xc8, 0x64, 0x8c, 0x5f, 0xa3, + 0x5d, 0xe7, 0xf3, 0x7c, 0xcd, 0x75, 0x81, 0x33, 0xb1, 0x5f, 0x73, 0x8d, + 0x66, 0xd1, 0xbf, 0x62, 0x6e, 0x91, 0x8b, 0x98, 0xcb, 0x88, 0xc9, 0xbc, + 0x78, 0x4f, 0x32, 0x17, 0xfd, 0x14, 0xcb, 0x2d, 0xdb, 0x4c, 0xc8, 0x6e, + 0x06, 0x0a, 0x99, 0xb2, 0x67, 0xc2, 0x26, 0xa6, 0x76, 0x66, 0xd0, 0x43, + 0xe5, 0x1d, 0xc1, 0xe3, 0xb4, 0xff, 0x30, 0xbf, 0xb7, 0xd4, 0xa4, 0xfb, + 0x59, 0x83, 0xee, 0x66, 0x24, 0x47, 0x1c, 0xab, 0x86, 0x49, 0x1f, 0x64, + 0xd5, 0x3e, 0xc0, 0x65, 0x27, 0x39, 0xa3, 0x40, 0x67, 0x9b, 0xee, 0x03, + 0xb0, 0xc4, 0x06, 0x0e, 0x31, 0xf6, 0x5c, 0x3d, 0x79, 0x4f, 0xb7, 0xcf, + 0x6c, 0x3a, 0xf6, 0x7b, 0x21, 0xb3, 0xf3, 0x86, 0x8a, 0xd6, 0xe1, 0x38, + 0x7c, 0x1d, 0xfe, 0x26, 0x5d, 0x87, 0x5e, 0x64, 0xc4, 0x63, 0xee, 0xc0, + 0xa0, 0xfd, 0x5e, 0x8d, 0xac, 0x5d, 0x95, 0xa2, 0x7e, 0x83, 0xdc, 0x45, + 0xdb, 0x22, 0x59, 0x6e, 0xc8, 0x88, 0xdf, 0xdc, 0x6e, 0x4e, 0xeb, 0xae, + 0x46, 0x87, 0xce, 0x77, 0x75, 0x9a, 0x4e, 0x5c, 0x9d, 0xd8, 0xc6, 0xa0, + 0xb9, 0xf7, 0x0d, 0x29, 0xec, 0xf3, 0xfa, 0x39, 0xce, 0x46, 0x19, 0x67, + 0x55, 0x0a, 0x6e, 0xd5, 0x68, 0x7e, 0xe7, 0x6f, 0x79, 0xe0, 0x20, 0xc6, + 0xe0, 0xf1, 0x66, 0xcb, 0x56, 0x68, 0x12, 0x6d, 0xbb, 0xdc, 0x77, 0x54, + 0xb6, 0xf3, 0x18, 0x79, 0x1e, 0xb8, 0xcf, 0x53, 0xc0, 0xfc, 0x7e, 0x9d, + 0x7d, 0x6a, 0x34, 0xb7, 0xc3, 0xba, 0xc0, 0x73, 0x97, 0xbf, 0x79, 0x6d, + 0x13, 0x14, 0x61, 0x37, 0xd1, 0x72, 0x03, 0xfb, 0x97, 0x85, 0x06, 0x22, + 0xec, 0x56, 0x76, 0x26, 0xf1, 0x14, 0x71, 0x50, 0x0a, 0x3e, 0x73, 0x5e, + 0xa8, 0x53, 0x08, 0x5c, 0x55, 0xac, 0x67, 0x8b, 0x16, 0x9a, 0xdb, 0xa2, + 0x0f, 0x6d, 0x03, 0xee, 0x33, 0xc7, 0xfa, 0xf0, 0x3d, 0xa8, 0xd6, 0x20, + 0x03, 0xf3, 0x14, 0xb3, 0x68, 0x62, 0xaf, 0x6b, 0x2e, 0xdb, 0xb3, 0x6d, + 0xbc, 0xac, 0x91, 0xbd, 0xbc, 0x8b, 0xd1, 0xf7, 0x7b, 0xd8, 0xef, 0x4d, + 0xce, 0x35, 0x8e, 0xf5, 0x17, 0x62, 0xfb, 0x79, 0xec, 0x79, 0x61, 0x35, + 0xe5, 0xbe, 0x81, 0x46, 0xce, 0x4e, 0x6c, 0xaa, 0x88, 0xbd, 0x8c, 0xc0, + 0x87, 0x3f, 0xfc, 0x2c, 0xd7, 0x3c, 0x70, 0xb8, 0x35, 0x03, 0x6c, 0x6c, + 0x2b, 0x85, 0x9e, 0x1d, 0x8c, 0x9b, 0xb8, 0x0a, 0xfc, 0x0a, 0x8c, 0xd8, + 0x6e, 0xbd, 0x97, 0x53, 0x2a, 0xe6, 0xba, 0xc6, 0x73, 0x21, 0xe7, 0x38, + 0xab, 0xbf, 0x03, 0x27, 0x22, 0xaa, 0xd3, 0xe2, 0x41, 0x9d, 0xae, 0x0e, + 0xea, 0x34, 0x77, 0x43, 0x47, 0x1c, 0xf2, 0xbc, 0xdb, 0x62, 0x0d, 0x02, + 0x6b, 0x87, 0xed, 0xec, 0xa6, 0x22, 0xf3, 0x3a, 0xd0, 0x7f, 0x40, 0xb4, + 0x35, 0xd0, 0x11, 0x37, 0x75, 0x68, 0x6c, 0x99, 0x2e, 0xfe, 0x84, 0xe8, + 0xe2, 0x80, 0x7d, 0x79, 0xfc, 0xc2, 0x27, 0xc2, 0x9e, 0x65, 0x60, 0x7e, + 0x75, 0x20, 0x23, 0x1f, 0x20, 0x5f, 0xee, 0x07, 0xc8, 0x83, 0x6d, 0xfc, + 0xd6, 0x91, 0x1b, 0x19, 0x1b, 0xce, 0x13, 0x8f, 0x81, 0xcf, 0x06, 0xfa, + 0x2e, 0xa1, 0x8d, 0xf3, 0x16, 0xdb, 0xea, 0xd4, 0x76, 0xa7, 0x28, 0xad, + 0x72, 0x91, 0xc9, 0xb9, 0xe8, 0x14, 0xf8, 0x34, 0x81, 0xfc, 0x72, 0x47, + 0x19, 0xcd, 0x45, 0xc8, 0x59, 0x8d, 0xd3, 0xc8, 0x3d, 0x3f, 0x47, 0x3b, + 0x8f, 0xf7, 0x33, 0x3c, 0x27, 0xf0, 0x7d, 0x1a, 0xb6, 0xc3, 0x79, 0xa8, + 0xf2, 0x7b, 0x5a, 0x0e, 0x02, 0xef, 0x76, 0x0c, 0xd8, 0x5b, 0xd0, 0x0b, + 0xc7, 0xbb, 0x86, 0x7c, 0xc1, 0x31, 0xaf, 0x21, 0xa6, 0x3a, 0xe6, 0x36, + 0x69, 0xfe, 0x80, 0x62, 0xa5, 0xcc, 0x4f, 0xe1, 0x71, 0x7e, 0x6a, 0x0a, + 0x1e, 0x24, 0x99, 0x09, 0x1f, 0xd6, 0x6d, 0xa5, 0x53, 0xc6, 0x8e, 0xfc, + 0x00, 0x1a, 0x0e, 0x94, 0x3c, 0xdf, 0xc4, 0x19, 0x11, 0x01, 0x77, 0x1f, + 0xda, 0x8d, 0xa0, 0xdd, 0x70, 0x48, 0xbb, 0xe1, 0xff, 0xd4, 0x2e, 0x74, + 0x09, 0x8d, 0xdc, 0x05, 0xa7, 0x3e, 0xe8, 0x9f, 0xa4, 0x63, 0xd6, 0x30, + 0x6b, 0xd9, 0xa2, 0x7b, 0x4b, 0xcf, 0xa2, 0xe5, 0xbf, 0x3e, 0xab, 0x96, + 0x63, 0xd6, 0xb2, 0xca, 0x5a, 0x6e, 0x0c, 0x6b, 0xf9, 0x53, 0xf8, 0x17, + 0x9a, 0xbc, 0xa0, 0x36, 0x48, 0x5b, 0x04, 0x0e, 0x3b, 0x75, 0x52, 0x6e, + 0x3c, 0xe1, 0x1b, 0x73, 0x38, 0x1c, 0xe0, 0xdf, 0x81, 0x86, 0x3e, 0x69, + 0xb4, 0x1d, 0x39, 0x4f, 0xf5, 0xec, 0xe6, 0x96, 0xb0, 0x51, 0x49, 0x47, + 0xdc, 0xbf, 0xb3, 0x64, 0x5b, 0x96, 0x3c, 0xac, 0x79, 0xa8, 0x7e, 0x27, + 0xbf, 0xa6, 0x79, 0x3c, 0x4f, 0x6c, 0x81, 0xeb, 0xd6, 0x8f, 0x80, 0x51, + 0xda, 0x63, 0x9e, 0x3b, 0xe6, 0x9a, 0xe0, 0x17, 0xbe, 0xa1, 0x05, 0x0d, + 0x7c, 0xad, 0xc1, 0x4e, 0xdd, 0x29, 0xf4, 0x73, 0x17, 0xe3, 0xee, 0xf5, + 0x98, 0x5f, 0x06, 0xe9, 0x37, 0x9d, 0xe6, 0x55, 0x91, 0x73, 0xe7, 0xcd, + 0x75, 0x62, 0xed, 0xf1, 0x79, 0x87, 0xfe, 0x41, 0x8d, 0x14, 0xa1, 0xf7, + 0xc9, 0x52, 0xef, 0x2f, 0x20, 0x46, 0x93, 0xf8, 0x66, 0xcd, 0x9f, 0x2e, + 0x35, 0x3f, 0x8d, 0x27, 0xb7, 0x5d, 0x54, 0x0b, 0xee, 0x80, 0x87, 0x3b, + 0x8c, 0x6b, 0x1d, 0xf9, 0x8d, 0xe7, 0xff, 0x7b, 0xbe, 0xe9, 0x30, 0xb6, + 0x8e, 0xf5, 0x03, 0x5a, 0x80, 0xee, 0xd0, 0x7e, 0xc0, 0xb6, 0xec, 0x53, + 0xd9, 0x9a, 0xa5, 0xed, 0xa7, 0x63, 0xb6, 0x68, 0x3f, 0x60, 0x3b, 0xd6, + 0xc5, 0x73, 0xa4, 0xdc, 0xe4, 0xf3, 0x38, 0x60, 0x5d, 0xc0, 0xaf, 0x8d, + 0x36, 0xae, 0x19, 0xd8, 0x9f, 0xcf, 0x66, 0x5e, 0x27, 0xd7, 0x13, 0x7c, + 0x7e, 0x8f, 0x9d, 0xd3, 0xc7, 0xda, 0xb8, 0x00, 0xbe, 0x7f, 0x4b, 0xfd, + 0x4f, 0x6d, 0xbc, 0x06, 0x2d, 0x5c, 0x51, 0x0b, 0x6d, 0x6c, 0xe3, 0x79, + 0x01, 0xdf, 0xaf, 0x8d, 0x69, 0xa3, 0xf2, 0x7b, 0xfa, 0xf9, 0x9c, 0xf4, + 0x9b, 0xe2, 0x6c, 0xe5, 0xf9, 0x94, 0x1d, 0x8a, 0xb5, 0x52, 0x07, 0x6b, + 0xc7, 0x3a, 0x98, 0x44, 0xae, 0x18, 0xe1, 0xb8, 0x12, 0xba, 0xb6, 0x99, + 0x12, 0x6b, 0x62, 0xf8, 0xfc, 0xfa, 0x7f, 0xe9, 0x82, 0xc0, 0x23, 0x31, + 0x37, 0x6a, 0x0c, 0x3e, 0x0f, 0xf2, 0xfc, 0x8a, 0x8b, 0xfe, 0xaa, 0xd6, + 0x10, 0xd8, 0xf3, 0x59, 0xcb, 0x78, 0xa0, 0xbe, 0x73, 0xe6, 0xa1, 0x05, + 0xce, 0x01, 0x8f, 0xf3, 0x3d, 0x27, 0x40, 0x5b, 0x1b, 0xf1, 0x67, 0x4c, + 0x36, 0xa4, 0xf5, 0x7d, 0x83, 0xfd, 0xa0, 0xb3, 0x93, 0x6a, 0x2c, 0x1d, + 0x9a, 0x7a, 0x82, 0x13, 0xf3, 0x28, 0x1a, 0xc2, 0xa9, 0x23, 0x70, 0xfa, + 0xf0, 0x18, 0xa7, 0xa8, 0xc4, 0x29, 0x12, 0x38, 0xfd, 0xb1, 0xc4, 0xe9, + 0x0f, 0x4f, 0xc1, 0xe9, 0xc3, 0x67, 0xc0, 0xc9, 0xa0, 0x3d, 0xa7, 0x89, + 0x73, 0x56, 0x17, 0x35, 0xe9, 0xa1, 0x7b, 0x52, 0x4d, 0x75, 0x52, 0xdc, + 0x6d, 0x73, 0x8f, 0x86, 0xeb, 0x0e, 0xdb, 0x7a, 0x80, 0xf5, 0xa5, 0xc0, + 0xee, 0xfa, 0x58, 0xed, 0x91, 0xc0, 0xbe, 0x5d, 0xe2, 0x74, 0x1d, 0x38, + 0xb5, 0x4b, 0x9c, 0xb6, 0x87, 0x70, 0xda, 0x1e, 0xc1, 0x89, 0xf3, 0x49, + 0xcb, 0xd8, 0xee, 0x55, 0x18, 0x55, 0xf8, 0xe8, 0x74, 0xdb, 0x9c, 0xc6, + 0xfe, 0xcf, 0x51, 0xfa, 0x63, 0x95, 0xeb, 0x5a, 0x60, 0xf7, 0xaa, 0x2a, + 0x8b, 0xf3, 0x80, 0xdf, 0x9f, 0xd4, 0x27, 0x98, 0xcb, 0x0f, 0x5c, 0x8e, + 0x23, 0xea, 0x57, 0xa7, 0xca, 0x43, 0xcf, 0xab, 0xa8, 0xad, 0xf0, 0xcd, + 0x36, 0xaa, 0xd4, 0x86, 0xde, 0x15, 0xd4, 0xe5, 0xe1, 0x71, 0x5d, 0x5e, + 0xc4, 0xe0, 0x7a, 0x59, 0x97, 0xef, 0x39, 0x5c, 0x97, 0x2f, 0x6a, 0x34, + 0xb9, 0x51, 0x62, 0xc9, 0x9c, 0x9e, 0x42, 0xdf, 0x25, 0x81, 0x79, 0x8a, + 0xfc, 0xbd, 0x89, 0xfd, 0x47, 0x82, 0x9b, 0xa8, 0xb1, 0x4a, 0xde, 0xa2, + 0x86, 0xa5, 0x30, 0x2b, 0x62, 0xf5, 0xc5, 0xd6, 0x5d, 0x9f, 0x20, 0x4f, + 0x1b, 0x1d, 0x15, 0x75, 0xfd, 0xfd, 0x8c, 0xf3, 0x33, 0x5d, 0x4e, 0x7a, + 0x14, 0x9f, 0xf1, 0xae, 0xe5, 0xc0, 0xdc, 0x7f, 0xeb, 0x3c, 0x9f, 0x33, + 0xf5, 0xd5, 0xa0, 0x85, 0xf6, 0x81, 0x41, 0xa8, 0x7d, 0x70, 0x4f, 0xa1, + 0x38, 0x38, 0x2f, 0xa1, 0xc6, 0xc1, 0x37, 0x7c, 0x92, 0x6c, 0xb6, 0x23, + 0x7b, 0x4d, 0x70, 0x21, 0x26, 0x1f, 0xeb, 0xf4, 0x33, 0x71, 0x57, 0xe9, + 0x28, 0x9e, 0x81, 0xda, 0x92, 0x0c, 0x9c, 0xf3, 0x88, 0x89, 0x65, 0xa4, + 0x03, 0xd4, 0x41, 0x38, 0xfb, 0x83, 0x55, 0xc4, 0xe5, 0x2c, 0x70, 0xcb, + 0x54, 0xf8, 0xbe, 0xa9, 0x17, 0xf7, 0x1c, 0x54, 0x35, 0x22, 0x5e, 0x8f, + 0x4a, 0x7e, 0x88, 0x3a, 0x4b, 0x6a, 0xf7, 0xc9, 0x8a, 0x5c, 0xf0, 0x1c, + 0xe7, 0x48, 0x37, 0xe3, 0xda, 0xf9, 0xac, 0x21, 0xdf, 0xe0, 0x5c, 0x7e, + 0x88, 0x18, 0xe2, 0xfd, 0x80, 0xcf, 0x16, 0x85, 0xeb, 0x6f, 0xdc, 0x67, + 0x96, 0x90, 0x6b, 0x68, 0x0a, 0x79, 0x0f, 0x79, 0x77, 0x96, 0x71, 0xf2, + 0x23, 0xc6, 0x4b, 0x9c, 0x1b, 0xe7, 0xe4, 0x62, 0x9e, 0x5f, 0x6b, 0x05, + 0x7f, 0x71, 0x87, 0x41, 0xfc, 0x36, 0xfb, 0x2e, 0xe7, 0xdb, 0x2f, 0x2b, + 0x74, 0x44, 0x82, 0x8f, 0xe6, 0xcb, 0xc8, 0xc3, 0xe7, 0xe0, 0xe3, 0x0b, + 0x2d, 0x16, 0xf5, 0x56, 0xe5, 0xf3, 0xc9, 0xd8, 0x18, 0x1f, 0x29, 0xa3, + 0xdf, 0x3e, 0xf8, 0xbc, 0x52, 0xce, 0x57, 0xf1, 0xe3, 0x57, 0xe0, 0xc7, + 0x61, 0xd9, 0xcf, 0x77, 0x16, 0x1d, 0x36, 0xbc, 0x3e, 0xe6, 0x11, 0xdb, + 0x9b, 0xda, 0xe8, 0x18, 0x5f, 0x1a, 0xf3, 0xff, 0xfd, 0x90, 0xff, 0x34, + 0xef, 0xc9, 0x8c, 0x0a, 0x0e, 0xe2, 0xef, 0x3d, 0x7d, 0xd4, 0xf7, 0x17, + 0x6a, 0xf1, 0x7d, 0xb6, 0xe0, 0x9e, 0x83, 0x67, 0x76, 0x38, 0xb4, 0x36, + 0x75, 0x6c, 0xec, 0x87, 0x18, 0x7b, 0x15, 0x79, 0x84, 0x7c, 0x05, 0x77, + 0xa6, 0x90, 0xf0, 0x9e, 0x5d, 0xa9, 0xe2, 0x03, 0x4e, 0xd0, 0xe5, 0xb4, + 0xe4, 0x82, 0x5c, 0x70, 0x81, 0xeb, 0xb4, 0xd5, 0x4d, 0x70, 0x21, 0x05, + 0x17, 0xe0, 0xd7, 0xd1, 0xbc, 0x59, 0xe0, 0xcc, 0x39, 0x07, 0xdf, 0x19, + 0xf3, 0x82, 0x79, 0xc0, 0x9c, 0x78, 0xc2, 0x85, 0x2b, 0x3d, 0xc3, 0xd8, + 0xfd, 0x2f, 0x3c, 0x78, 0x57, 0xf0, 0x80, 0xf9, 0x58, 0xe4, 0x85, 0x2e, + 0x70, 0x48, 0xca, 0xbc, 0x50, 0xe8, 0x9c, 0xeb, 0x1b, 0xd6, 0x78, 0xa1, + 0x8d, 0x2d, 0x68, 0xa3, 0xad, 0x70, 0xbd, 0xc3, 0xba, 0x60, 0x3f, 0xd6, + 0xc6, 0x49, 0x7e, 0x85, 0x46, 0xd2, 0xbe, 0x6d, 0x55, 0xf9, 0x21, 0x85, + 0x2e, 0xba, 0xa5, 0x46, 0xd2, 0x52, 0x23, 0xb0, 0x89, 0x95, 0x16, 0xe7, + 0x7a, 0xdb, 0x0a, 0x91, 0x17, 0xba, 0x62, 0xcc, 0x98, 0x8a, 0x3b, 0x09, + 0xeb, 0x96, 0xf3, 0xe9, 0x50, 0x1e, 0x2d, 0xef, 0xa5, 0x1d, 0x71, 0x2f, + 0xfd, 0x8a, 0x3e, 0x9a, 0x47, 0x67, 0x90, 0x43, 0xf8, 0x5e, 0x3a, 0xa7, + 0xf3, 0xbd, 0x14, 0xba, 0xd3, 0x87, 0xef, 0xa5, 0xc9, 0xc8, 0xbd, 0xb4, + 0xf2, 0xe5, 0xf6, 0x93, 0xf2, 0x69, 0x15, 0x13, 0xce, 0xa9, 0x02, 0xf3, + 0x13, 0x6a, 0xbf, 0xca, 0x86, 0xf3, 0x0d, 0x6b, 0xb9, 0xcc, 0x51, 0xa8, + 0xb5, 0xee, 0x67, 0x15, 0xe7, 0xdf, 0xc0, 0x3c, 0xf8, 0xee, 0x9f, 0xc4, + 0x79, 0xa3, 0xe4, 0xfc, 0x54, 0xe1, 0xd3, 0x1f, 0xe6, 0xfd, 0x1b, 0xfa, + 0x28, 0xef, 0xab, 0x71, 0x2a, 0xde, 0x17, 0x63, 0x3e, 0x54, 0x9a, 0x38, + 0xdb, 0x96, 0x91, 0x6b, 0x66, 0xf8, 0xbe, 0x85, 0x5c, 0xe0, 0xd5, 0x71, + 0xef, 0x98, 0xe1, 0xb1, 0xd3, 0x0c, 0xe7, 0x4d, 0x03, 0xbc, 0x17, 0x9c, + 0x3d, 0x12, 0xf7, 0x01, 0xac, 0x7b, 0x86, 0xab, 0xab, 0x51, 0x2e, 0xbe, + 0x88, 0x0b, 0x45, 0xb5, 0x97, 0xaa, 0xcd, 0x19, 0x6a, 0x5b, 0x2e, 0xb1, + 0x2e, 0x62, 0xfd, 0xa0, 0xb8, 0x8f, 0xd3, 0x2e, 0x6a, 0xb1, 0x43, 0xd4, + 0x39, 0x77, 0x70, 0x9f, 0x4b, 0x06, 0x8f, 0xf2, 0x07, 0x0d, 0x95, 0xba, + 0xc7, 0x3e, 0x5d, 0xac, 0xd7, 0x36, 0x6f, 0xe3, 0xed, 0xdd, 0x41, 0x15, + 0x53, 0xee, 0xe7, 0xb6, 0x7f, 0xe0, 0xbc, 0x45, 0x1d, 0x37, 0x32, 0x67, + 0xf5, 0xce, 0x7f, 0xff, 0x06, 0x63, 0xe1, 0x4b, 0x7b, 0x30, 0x12, 0x00, + 0x00, 0x00 }; -static int bnx2_TXP_b06FwReleaseMajor = 0x0; -static int bnx2_TXP_b06FwReleaseMinor = 0x0; -static int bnx2_TXP_b06FwReleaseFix = 0x0; -static u32 bnx2_TXP_b06FwStartAddr = 0x08002090; -static u32 bnx2_TXP_b06FwTextAddr = 0x08000000; -static int bnx2_TXP_b06FwTextLen = 0x3ffc; -static u32 bnx2_TXP_b06FwDataAddr = 0x08004020; -static int bnx2_TXP_b06FwDataLen = 0x0; -static u32 bnx2_TXP_b06FwRodataAddr = 0x00000000; -static int bnx2_TXP_b06FwRodataLen = 0x0; -static u32 bnx2_TXP_b06FwBssAddr = 0x08004060; -static int bnx2_TXP_b06FwBssLen = 0x194; -static u32 bnx2_TXP_b06FwSbssAddr = 0x08004020; -static int bnx2_TXP_b06FwSbssLen = 0x34; -static u32 bnx2_TXP_b06FwText[(0x3ffc/4) + 1] = { - 0x0a000824, 0x00000000, 0x00000000, 0x0000000d, 0x74787020, 0x302e362e, - 0x39000000, 0x00060900, 0x0000000a, 0x000003e8, 0x0000ea60, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x10000003, 0x00000000, 0x0000000d, - 0x0000000d, 0x3c020800, 0x24424020, 0x3c030800, 0x246341f4, 0xac400000, - 0x0043202b, 0x1480fffd, 0x24420004, 0x3c1d0800, 0x37bd7ffc, 0x03a0f021, - 0x3c100800, 0x26102090, 0x3c1c0800, 0x279c4020, 0x0e000a0e, 0x00000000, - 0x0000000d, 0x8f840014, 0x27bdffe8, 0xafb00010, 0x8f460104, 0x8f830008, - 0x8c8500ac, 0xaf430080, 0x948200a8, 0xa7420e10, 0x948300aa, 0xa7430e12, - 0x8c8200ac, 0xaf420e18, 0x97430e10, 0xa7430e14, 0x97420e12, 0xa7420e16, - 0x8f430e18, 0x00005021, 0x00c53023, 0x10c001a3, 0xaf430e1c, 0x240f0800, - 0x3c0e1000, 0x2419fff8, 0x24100010, 0x3c188100, 0x93620008, 0x10400009, - 0x00000000, 0x97620010, 0x00c2102b, 0x14400005, 0x00000000, 0x97620010, - 0x3042ffff, 0x0a000862, 0xaf420e00, 0xaf460e00, 0x8f420000, 0x30420008, - 0x1040fffd, 0x00000000, 0x97420e08, 0x8f450e04, 0x3044ffff, 0x30820001, - 0x14400005, 0x00000000, 0x14a00005, 0x3083a040, 0x0a0009e6, 0x00000000, - 0x0000000d, 0x3083a040, 0x24020040, 0x14620049, 0x3082a000, 0x8f87000c, - 0x30880036, 0x30890008, 0xaf4f0178, 0x00e01821, 0x9742008a, 0x00431023, - 0x2442ffff, 0x30421fff, 0x2c420008, 0x1440fffa, 0x00000000, 0x8f830018, - 0x00a05021, 0x00c53023, 0x24e24000, 0x03422821, 0x306b00ff, 0x24630001, - 0xaf830018, 0x93840012, 0x000b1400, 0x3c030100, 0x00431025, 0xaca20000, - 0x8f820018, 0x30840007, 0x00042240, 0x34870001, 0x00e83825, 0x1120000f, - 0xaca20004, 0x97430e0a, 0x8f84000c, 0x00ee3825, 0x2402000e, 0x00781825, - 0xaf430160, 0x25430006, 0x24840008, 0x30841fff, 0xa742015a, 0xa7430158, - 0xaf84000c, 0x0a0008a9, 0x00000000, 0x8f83000c, 0x25420002, 0xa7420158, - 0x24630008, 0x30631fff, 0xaf83000c, 0x54c0000c, 0x8f420e14, 0x97420e10, - 0x97430e12, 0x8f840014, 0x00021400, 0x00621825, 0xac8300a8, 0x8f850014, - 0x8f420e18, 0x34e70040, 0xaca200ac, 0x8f420e14, 0x8f430e1c, 0xaf420144, - 0xaf430148, 0xa34b0152, 0xaf470154, 0x0a0009f1, 0xaf4e0178, 0x10400128, - 0x00000000, 0x97620010, 0x00a2102b, 0x10400003, 0x30820040, 0x10400122, - 0x00000000, 0xafa60008, 0xa7840010, 0xaf850004, 0x93620008, 0x1440005e, - 0x27ac0008, 0xaf60000c, 0x97820010, 0x30424000, 0x10400002, 0x2403000e, - 0x24030016, 0xa363000a, 0x24034007, 0xaf630014, 0x93820012, 0x8f630014, - 0x30420007, 0x00021240, 0x00621825, 0xaf630014, 0x97820010, 0x8f630014, - 0x30420010, 0x00621825, 0xaf630014, 0x97820010, 0x30420008, 0x5040000e, - 0x00002821, 0x8f620014, 0x004e1025, 0xaf620014, 0x97430e0a, 0x2402000e, - 0x00781825, 0xaf630004, 0xa3620002, 0x9363000a, 0x3405fffc, 0x24630004, - 0x0a0008f2, 0xa363000a, 0xaf600004, 0xa3600002, 0x97820010, 0x9363000a, - 0x30421f00, 0x00021182, 0x24420028, 0x00621821, 0xa3630009, 0x97420e0c, - 0xa7620010, 0x93630009, 0x24020008, 0x24630002, 0x30630007, 0x00431023, - 0x30420007, 0xa362000b, 0x93640009, 0x97620010, 0x8f890004, 0x97830010, - 0x00441021, 0x00a21021, 0x30630040, 0x10600006, 0x3045ffff, 0x15250005, - 0x0125102b, 0x3c068000, 0x0a000925, 0x00005821, 0x0125102b, 0x144000c8, - 0x00005021, 0x97420e14, 0xa7420e10, 0x97430e16, 0xa7430e12, 0x8f420e1c, - 0xaf420e18, 0xaf450e00, 0x8f420000, 0x30420008, 0x1040fffd, 0x00000000, - 0x97420e08, 0x00a04821, 0xa7820010, 0x8f430e04, 0x00003021, 0x240b0001, - 0xaf830004, 0x97620010, 0x0a000936, 0x304dffff, 0x8f890004, 0x97820010, - 0x30420040, 0x10400004, 0x01206821, 0x3c068000, 0x0a000936, 0x00005821, - 0x97630010, 0x8f820004, 0x144300a7, 0x00005021, 0x00003021, 0x240b0001, - 0x8d820000, 0x00491023, 0x1440000d, 0xad820000, 0x8f620014, 0x34420040, - 0xaf620014, 0x97430e10, 0x97420e12, 0x8f840014, 0x00031c00, 0x00431025, - 0xac8200a8, 0x8f830014, 0x8f420e18, 0xac6200ac, 0x93620008, 0x1440003f, - 0x00000000, 0x25260002, 0x8f84000c, 0x9743008a, 0x3063ffff, 0xafa30000, - 0x8fa20000, 0x00441023, 0x2442ffff, 0x30421fff, 0x2c420010, 0x1440fff7, - 0x00000000, 0x8f82000c, 0x8f830018, 0x00021082, 0x00021080, 0x24424000, - 0x03422821, 0x00605021, 0x24630001, 0x314200ff, 0x00021400, 0xaf830018, - 0x3c033200, 0x00431025, 0xaca20000, 0x93630009, 0x9362000a, 0x00031c00, - 0x00431025, 0xaca20004, 0x8f830018, 0xaca30008, 0x97820010, 0x30420008, - 0x10400002, 0x00c04021, 0x25280006, 0x97430e14, 0x93640002, 0x8f450e1c, - 0x8f660004, 0x8f670014, 0xaf4f0178, 0x3063ffff, 0xa7430144, 0x97420e16, - 0xa7420146, 0xaf450148, 0xa34a0152, 0x8f82000c, 0x308400ff, 0xa744015a, - 0xaf460160, 0xa7480158, 0xaf470154, 0xaf4e0178, 0x00501021, 0x30421fff, - 0xaf82000c, 0x0a0009c5, 0x8d820000, 0x93620009, 0x9363000b, 0x8f85000c, - 0x2463000a, 0x00435021, 0x25440007, 0x00992024, 0x9743008a, 0x3063ffff, - 0xafa30000, 0x8fa20000, 0x00451023, 0x2442ffff, 0x30421fff, 0x0044102b, - 0x1440fff7, 0x00000000, 0x8f82000c, 0x8f840018, 0x00021082, 0x00021080, - 0x24424000, 0x03422821, 0x00804021, 0x24840001, 0xaf840018, 0x93630009, - 0x310200ff, 0x00022400, 0x3c024100, 0x24630002, 0x00621825, 0x00832025, - 0xaca40000, 0x8f62000c, 0x00461025, 0xaca20004, 0x97430e14, 0x93640002, - 0x8f450e1c, 0x8f660004, 0x8f670014, 0xaf4f0178, 0x3063ffff, 0xa7430144, - 0x97420e16, 0x308400ff, 0xa7420146, 0xaf450148, 0xa3480152, 0x8f83000c, - 0x25420007, 0x00591024, 0xa744015a, 0xaf460160, 0xa7490158, 0xaf470154, - 0xaf4e0178, 0x00621821, 0x30631fff, 0xaf83000c, 0x8d820000, 0x14400005, - 0x00000000, 0x8f620014, 0x2403ffbf, 0x00431024, 0xaf620014, 0x8f62000c, - 0x004d1021, 0xaf62000c, 0x93630008, 0x14600008, 0x00000000, 0x11600006, - 0x00000000, 0x8f630014, 0x3c02efff, 0x3442fffe, 0x00621824, 0xaf630014, - 0xa36b0008, 0x01205021, 0x15400016, 0x8fa60008, 0x97420e14, 0x97430e16, - 0x8f850014, 0x00021400, 0x00621825, 0xaca300a8, 0x8f840014, 0x8f420e1c, - 0x0a0009f3, 0xac8200ac, 0x97420e14, 0x97430e16, 0x8f840014, 0x00021400, - 0x00621825, 0xac8300a8, 0x8f850014, 0x8f420e1c, 0x00005021, 0x0a0009f3, - 0xaca200ac, 0x14c0fe64, 0x00000000, 0x55400018, 0x8fb00010, 0x3c038000, - 0x8f420178, 0x00431024, 0x1440fffd, 0x00000000, 0x97430e14, 0x8f440e1c, - 0x24020800, 0xaf420178, 0x3063ffff, 0xa7430144, 0x97420e16, 0x3c031000, - 0xa7420146, 0x24020240, 0xaf440148, 0xa3400152, 0xa740015a, 0xaf400160, - 0xa7400158, 0xaf420154, 0xaf430178, 0x8fb00010, 0x03e00008, 0x27bd0018, - 0x27bdffd8, 0x3c1a8000, 0x3c0420ff, 0x3484fffd, 0x3c020008, 0x03421821, - 0xafbf0020, 0xafb3001c, 0xafb20018, 0xafb10014, 0xafb00010, 0xaf830014, - 0xaf440e00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x3c0200ff, 0x3442fffd, 0x3c046004, 0xaf420e00, 0x8c835000, 0x24130d00, - 0x3c120800, 0x3c114000, 0x2402ff7f, 0x00621824, 0x3463380c, 0x24020009, - 0xac835000, 0xaf420008, 0xaf800018, 0xaf80000c, 0x0e000fa1, 0x00000000, - 0x0e000a96, 0x00000000, 0x3c020800, 0x24504080, 0x8f420000, 0x30420001, - 0x1040fffd, 0x00000000, 0x8f440100, 0xaf840008, 0xaf440020, 0x93430108, - 0xa3830012, 0x93820012, 0x30420001, 0x10400008, 0x00000000, 0x93820012, - 0x30420006, 0x00021100, 0x0e00083b, 0x0050d821, 0x0a000a52, 0x00000000, - 0x14930005, 0x00000000, 0x0e00083b, 0x265b4100, 0x0a000a52, 0x00000000, - 0x0e000ba3, 0x00000000, 0xaf510138, 0x0a000a36, 0x00000000, 0x27bdfff8, - 0x3084ffff, 0x24820007, 0x3044fff8, 0x8f85000c, 0x9743008a, 0x3063ffff, - 0xafa30000, 0x8fa20000, 0x00451023, 0x2442ffff, 0x30421fff, 0x0044102b, - 0x1440fff7, 0x00000000, 0x8f82000c, 0x00021082, 0x00021080, 0x24424000, - 0x03421021, 0x03e00008, 0x27bd0008, 0x3084ffff, 0x8f82000c, 0x24840007, - 0x3084fff8, 0x00441021, 0x30421fff, 0xaf82000c, 0x03e00008, 0x00000000, - 0x27bdffe8, 0x3c1a8000, 0x3c0420ff, 0x3484fffd, 0x3c020008, 0x03421821, - 0xafbf0010, 0xaf830014, 0xaf440e00, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x3c0200ff, 0x3442fffd, 0x3c046004, 0xaf420e00, - 0x8c825000, 0x2403ff7f, 0x00431024, 0x3442380c, 0x24030009, 0xac825000, - 0xaf430008, 0xaf800018, 0xaf80000c, 0x0e000fa1, 0x00000000, 0x0e000a96, - 0x00000000, 0x8fbf0010, 0x03e00008, 0x27bd0018, 0x27bdffe8, 0x3c02000a, - 0x03421821, 0x3c040800, 0x24844120, 0x24050018, 0xafbf0010, 0xaf830024, - 0x0e000fad, 0x00003021, 0x3c050800, 0x3c020800, 0x24423d60, 0xaca24180, - 0x24a54180, 0x3c020800, 0x24423e18, 0x3c030800, 0x24633e2c, 0x3c040800, - 0xaca20004, 0x3c020800, 0x24423d68, 0xaca30008, 0xac824190, 0x24844190, - 0x3c020800, 0x24423da4, 0x3c070800, 0x24e73de4, 0x3c060800, 0x24c63e40, - 0x3c050800, 0x24a52b28, 0x3c030800, 0xac820004, 0x3c020800, 0x24423e48, - 0xac870008, 0xac86000c, 0xac850010, 0xac6241b0, 0x246341b0, 0x8fbf0010, - 0x3c020800, 0x24423e60, 0xac620004, 0xac670008, 0xac66000c, 0xac650010, - 0x03e00008, 0x27bd0018, 0x27bdffc8, 0x3c020800, 0x24424120, 0xafbf0030, - 0xafb3002c, 0xafb20028, 0xafb10024, 0xafb00020, 0x90470021, 0x8c510008, - 0x8c45001c, 0x8f900020, 0x3c060800, 0x3c038000, 0x8f420178, 0x00431024, - 0x1440fffd, 0x8cc2414c, 0x24c3414c, 0x2473ffd4, 0xaf420144, 0x8e620030, - 0x30b22000, 0xaf420148, 0x3c021000, 0xaf50014c, 0xa3470152, 0xa7510158, - 0xaf450154, 0xaf420178, 0x12400004, 0x3c030800, 0x8c620030, 0x24420001, - 0xac620030, 0x93420109, 0x9344010a, 0x00111c00, 0xafa30018, 0x00071a00, - 0xafa50014, 0x8cc5414c, 0x00021600, 0x00042400, 0x00441025, 0x00431025, - 0xafa20010, 0x8f440100, 0x8e660030, 0x0e000fe1, 0x02003821, 0x1640000e, - 0x8fbf0030, 0x8f820000, 0x8e630030, 0x8c44017c, 0x02031823, 0x00711823, - 0x00641823, 0x2c630002, 0x14600006, 0x8fb3002c, 0x0000000d, 0x00000000, - 0x240000ca, 0x8fbf0030, 0x8fb3002c, 0x8fb20028, 0x8fb10024, 0x8fb00020, - 0x03e00008, 0x27bd0038, 0x974309da, 0x00804021, 0xad030000, 0x8f4209dc, - 0xad020004, 0x8f4309e0, 0xad030008, 0x934409d9, 0x24020001, 0x30840003, - 0x1082001f, 0x30a900ff, 0x28820002, 0x10400005, 0x24020002, 0x10800009, - 0x3c0a0800, 0x0a000b64, 0x93420934, 0x1082000b, 0x24020003, 0x10820026, - 0x3c0a0800, 0x0a000b64, 0x93420934, 0x974209e4, 0x00021400, 0x34420800, - 0xad02000c, 0x0a000b63, 0x25080010, 0x974209e4, 0x00021400, 0x34428100, - 0xad02000c, 0x974309e8, 0x3c0a0800, 0x00031c00, 0x34630800, 0xad030010, - 0x0a000b63, 0x25080014, 0x974409e4, 0x3c050800, 0x24a24120, 0x94430018, - 0x94460010, 0x9447000c, 0x00a05021, 0x24020800, 0xad000010, 0xad020014, - 0x00042400, 0x00661821, 0x00671823, 0x2463fff2, 0x00832025, 0xad04000c, - 0x0a000b63, 0x25080018, 0x974209e4, 0x3c050800, 0x00021400, 0x34428100, - 0xad02000c, 0x974409e8, 0x24a24120, 0x94430018, 0x94460010, 0x9447000c, - 0x00a05021, 0x24020800, 0xad000014, 0xad020018, 0x00042400, 0x00661821, - 0x00671823, 0x2463ffee, 0x00832025, 0xad040010, 0x2508001c, 0x93420934, - 0x93450921, 0x3c074000, 0x25444120, 0x94830014, 0x94860010, 0x00021082, - 0x00021600, 0x00052c00, 0x00a72825, 0x00451025, 0x00661821, 0x00431025, - 0xad020000, 0x97830028, 0x974209ea, 0x00621821, 0x00031c00, 0xad030004, - 0x97820028, 0x24420001, 0x30427fff, 0xa7820028, 0x93430920, 0x3c020006, - 0x00031e00, 0x00621825, 0xad030008, 0x8f42092c, 0xad02000c, 0x8f430930, - 0xad030010, 0x8f440938, 0x25080014, 0xad040000, 0x8f820020, 0x11200004, - 0xad020004, 0x8f420940, 0x0a000b8d, 0x2442ffff, 0x8f420940, 0xad020008, - 0x8f440948, 0x8f420940, 0x93430936, 0x00822823, 0x00652806, 0x3402ffff, - 0x0045102b, 0x54400001, 0x3405ffff, 0x93420937, 0x25444120, 0x90830020, - 0xad000010, 0x00021700, 0x34630010, 0x00031c00, 0x00431025, 0x00451025, - 0xad02000c, 0x03e00008, 0x25020014, 0x27bdffb0, 0x3c020008, 0x03421821, - 0xafbf004c, 0xafbe0048, 0xafb70044, 0xafb60040, 0xafb5003c, 0xafb40038, - 0xafb30034, 0xafb20030, 0xafb1002c, 0xafb00028, 0xaf830000, 0x24020040, - 0xaf420814, 0xaf400810, 0x8f420944, 0x8f430950, 0x8f440954, 0x8f45095c, - 0xaf820030, 0xaf830020, 0xaf84001c, 0xaf85002c, 0x93430900, 0x24020020, - 0x10620005, 0x24020030, 0x10620022, 0x3c030800, 0x0a000bf1, 0x8c62002c, - 0x24020088, 0xaf420818, 0x3c020800, 0x24424180, 0xafa20020, 0x93430109, - 0x3c020800, 0x10600009, 0x24574190, 0x3c026000, 0x24030100, 0xac43081c, - 0x3c030001, 0xac43081c, 0x0000000d, 0x00000000, 0x2400031d, 0x9342010a, - 0x30420080, 0x1440001c, 0x00000000, 0x3c026000, 0x24030100, 0xac43081c, - 0x3c030001, 0xac43081c, 0x0000000d, 0x00000000, 0x24000324, 0x0a000bf4, - 0x00000000, 0x93430109, 0x3063007f, 0x00031140, 0x000318c0, 0x00431021, - 0x24430088, 0xaf430818, 0x0000000d, 0x3c020800, 0x244241d0, 0x3c030800, - 0x247741e0, 0x0a000bf4, 0xafa20020, 0x24420001, 0x0a000f4c, 0xac62002c, - 0x8f840000, 0x8f850020, 0x24020800, 0xaf420178, 0x8f4209a4, 0x8c83017c, - 0x00a21023, 0x00431023, 0x2c420002, 0x14400004, 0x00000000, 0x0000000d, - 0x00000000, 0x24000349, 0x8f420104, 0x8f430988, 0x00431023, 0x58400005, - 0x8f4209a0, 0x0000000d, 0x00000000, 0x2400034d, 0x8f4209a0, 0x3c100800, - 0xae02414c, 0x8f4309a4, 0x2604414c, 0x2491ffd4, 0xae230030, 0x8f420104, - 0xae250024, 0x00431023, 0xac82ffd4, 0x8fa30020, 0x8c620000, 0x0040f809, - 0x0200b021, 0x00409021, 0x32440010, 0x32420002, 0x10400007, 0xafa40024, - 0x8e22001c, 0x32500040, 0x2403ffbf, 0x00431024, 0x0a000f13, 0xae22001c, - 0x32420020, 0x10400002, 0x3c020800, 0x245741b0, 0x32420001, 0x14400007, - 0x00000000, 0x8f820008, 0xaf420080, 0x8ec3414c, 0xaf430e10, 0x8e220030, - 0xaf420e18, 0x9343010b, 0x93420905, 0x30420008, 0x1040003c, 0x307400ff, - 0x8f820000, 0x8c430074, 0x0460000a, 0x00000000, 0x3c026000, 0x24030100, - 0xac43081c, 0x3c030001, 0xac43081c, 0x0000000d, 0x00000000, 0x24000384, - 0x8f820000, 0x9044007b, 0x9343010a, 0x14830027, 0x32500040, 0x24072000, - 0x3c090800, 0x3c038000, 0x8f420178, 0x00431024, 0x1440fffd, 0x8ec2414c, - 0x26c4414c, 0x2484ffd4, 0xaf420144, 0x8c820030, 0x3c030100, 0xaf420148, - 0x24020047, 0xaf43014c, 0x00001821, 0xa3420152, 0x3c021000, 0xa7430158, - 0xaf470154, 0xaf420178, 0x8ec5414c, 0x8d230030, 0x8c860030, 0x24630001, - 0xad230030, 0x93420109, 0x9343010a, 0xafa70014, 0xafa00018, 0x00021600, - 0x00031c00, 0x00431025, 0x34424700, 0xafa20010, 0x8f440100, 0x0e000fe1, - 0x3c070100, 0x3c030800, 0x24624120, 0x0a000d01, 0x8c43001c, 0x32820002, - 0x10400047, 0x3c039000, 0x34630001, 0x8f820008, 0x32500040, 0x3c048000, - 0x00431025, 0xaf420020, 0x8f420020, 0x00441024, 0x1440fffd, 0x00000000, - 0x8f830000, 0x90620005, 0x3c058000, 0x34420008, 0xa0620005, 0x8f860000, - 0x34a50001, 0x8f840008, 0x8cc20074, 0x3c038000, 0x00852025, 0x00431025, - 0xacc20074, 0xaf440020, 0x90c3007b, 0x9342010a, 0x14620028, 0x3c040800, - 0x24072000, 0x3c090800, 0x3c038000, 0x8f420178, 0x00431024, 0x1440fffd, - 0x8ec2414c, 0x26c4414c, 0x2484ffd4, 0xaf420144, 0x8c820030, 0x3c030100, - 0xaf420148, 0x24020046, 0xaf43014c, 0x00001821, 0xa3420152, 0x3c021000, - 0xa7430158, 0xaf470154, 0xaf420178, 0x8ec5414c, 0x8d230030, 0x8c860030, - 0x24630001, 0xad230030, 0x93420109, 0x9343010a, 0xafa70014, 0xafa00018, - 0x00021600, 0x00031c00, 0x00431025, 0x34424600, 0xafa20010, 0x8f440100, - 0x0e000fe1, 0x3c070100, 0x3c040800, 0x24824120, 0x0a000d01, 0x8c43001c, - 0x93420108, 0x30420010, 0x50400050, 0x9343093f, 0x8f860000, 0x90c3007f, - 0x90c2007e, 0x90c40080, 0x306800ff, 0x00021600, 0x00081c00, 0x00431025, - 0x00042200, 0x90c3007a, 0x90c5000a, 0x00441025, 0x11050028, 0x00623825, - 0xa0c8000a, 0x24086000, 0x3c090800, 0x3c038000, 0x8f420178, 0x00431024, - 0x1440fffd, 0x8ec2414c, 0x26c4414c, 0x2484ffd4, 0xaf420144, 0x8c820030, - 0x00001821, 0xaf420148, 0x24020052, 0xaf47014c, 0xa3420152, 0x3c021000, - 0xa7430158, 0xaf480154, 0xaf420178, 0x8ec5414c, 0x8d230030, 0x8c860030, - 0x24630001, 0xad230030, 0x93420109, 0x9343010a, 0xafa80014, 0xafa00018, - 0x00021600, 0x00031c00, 0x00431025, 0x34425200, 0xafa20010, 0x0e000fe1, - 0x8f440100, 0x0a000cfb, 0x00000000, 0x3c026000, 0x24030100, 0xac43081c, - 0x3c030001, 0xac43081c, 0x0000000d, 0x00000000, 0x240003cd, 0x16800009, - 0x3c040800, 0x3c030800, 0x24624120, 0x8c43001c, 0x32500040, 0x2404ffbf, - 0x00641824, 0x0a000f13, 0xac43001c, 0x8c824120, 0x10400005, 0x3c030800, - 0x8c620034, 0xac804120, 0x24420001, 0xac620034, 0x9343093f, 0x24020012, - 0x1462000f, 0x329e0038, 0x17c0000c, 0x3c030800, 0x8f830000, 0x8c62004c, - 0xac62005c, 0x3c020800, 0x24444120, 0x8c82001c, 0x32500040, 0x2403ffbf, - 0x00431024, 0x0a000f13, 0xac82001c, 0xac604120, 0x97420908, 0x000211c0, - 0xaf420024, 0x97420908, 0x3c030080, 0x34630003, 0x000211c0, 0xaf42080c, - 0xaf43081c, 0x974209ec, 0x8f4309a4, 0xa7820028, 0x3c020800, 0x24444120, - 0xac830028, 0x93420937, 0x93430934, 0x00021080, 0x00621821, 0xa4830014, - 0x934209d8, 0x00621821, 0xa4830016, 0x934209d8, 0x93430934, 0x00809821, - 0x00431021, 0x24420010, 0xa4820012, 0x0000a821, 0x24020006, 0x13c00003, - 0xae62001c, 0x0a000d82, 0x24120008, 0x8f420958, 0x8f830020, 0x8f84002c, - 0x00431023, 0x00832023, 0x04800003, 0xae620004, 0x04410003, 0x0082102b, - 0x0a000d4e, 0xae600004, 0x54400001, 0xae640004, 0x8ee20000, 0x0040f809, - 0x00000000, 0x00409021, 0x32420001, 0x5440001e, 0x8ee20004, 0x8e630008, - 0x1060002b, 0x3c02c000, 0x00621025, 0xaf420e00, 0x8f420000, 0x30420008, - 0x1040fffd, 0x00000000, 0x97420e08, 0xa7820010, 0x8f430e04, 0x8e620008, - 0xaf830004, 0x8f840004, 0x0044102b, 0x1040000b, 0x24150001, 0x24020100, - 0x3c016000, 0xac22081c, 0x3c020001, 0x3c016000, 0xac22081c, 0x0000000d, - 0x00000000, 0x24000449, 0x24150001, 0x8ee20004, 0x0040f809, 0x00000000, - 0x02429025, 0x32420002, 0x5040001d, 0x8f470940, 0x12a00006, 0x8ec2414c, - 0x8f830000, 0xac6200a8, 0x8f840000, 0x8e620030, 0xac8200ac, 0x32420004, - 0x50400013, 0x8f470940, 0x3c020800, 0x3283007d, 0x106000fe, 0x245741b0, - 0x32820001, 0x50400006, 0x36520002, 0x8f830030, 0x8f420940, 0x106200f7, - 0x00000000, 0x36520002, 0x24020008, 0xa660000c, 0xa662000e, 0xae600008, - 0xa2600020, 0x8f470940, 0x3c030800, 0x24684120, 0x8d020028, 0x8d050008, - 0x9504000c, 0x9506000a, 0x95030022, 0x00451021, 0x00862021, 0x00641821, - 0xaf870030, 0xad020028, 0x32820030, 0x10400006, 0xa5030010, 0x91020020, - 0x32910040, 0x34420004, 0x0a000dd4, 0xa1020020, 0x93420923, 0x30420040, - 0x10400029, 0x32910040, 0x8f830000, 0x8f840020, 0x8c620084, 0x00441023, - 0x0442000a, 0x3c039000, 0x95020010, 0x8c630084, 0x00821021, 0x00621823, - 0x1c600004, 0x3c039000, 0x91020020, 0x34420001, 0xa1020020, 0x34630001, - 0x8f820008, 0x32910040, 0x3c048000, 0x00431025, 0xaf420020, 0x8f420020, - 0x00441024, 0x1440fffd, 0x00000000, 0x8f840000, 0x9083003f, 0x2402000a, - 0x10620005, 0x2402000c, 0x9083003f, 0x24020008, 0x14620002, 0x24020014, - 0xa082003f, 0x8f830008, 0x3c028000, 0x34420001, 0x00621825, 0xaf430020, - 0x3c040800, 0x24904120, 0x9602000c, 0x96030016, 0x9604000e, 0x00431021, - 0x00442021, 0x24840002, 0x3084ffff, 0x0e000a55, 0xa6020018, 0x8f850018, - 0x00a01821, 0xa2030021, 0x8ee60008, 0x00402021, 0x24a50001, 0xaf850018, - 0x00c0f809, 0x00000000, 0x00402021, 0x0e000b12, 0x02202821, 0x8ee3000c, - 0x0060f809, 0x00402021, 0x96040018, 0x9602000e, 0x00822021, 0x24840002, - 0x0e000a6b, 0x3084ffff, 0x3c030800, 0x8c624120, 0x8e030008, 0x3c040800, - 0x00431023, 0x14400012, 0xac824120, 0x54600006, 0x8e02001c, 0x3243004a, - 0x24020002, 0x14620005, 0x00000000, 0x8e02001c, 0x34420040, 0x0a000e0b, - 0xae02001c, 0x52a00006, 0x36520002, 0x8e02002c, 0xaf420e10, 0x8e030030, - 0xaf430e18, 0x36520002, 0x52a00008, 0x96670010, 0x8f830000, 0x8f420e10, - 0xac6200a8, 0x8f840000, 0x8f420e18, 0xac8200ac, 0x96670010, 0x92680020, - 0x24020040, 0xaf420814, 0x8f830020, 0x8f82001c, 0x00671821, 0x00621023, - 0xaf830020, 0x58400005, 0x8f42095c, 0x8f820000, 0xaf83001c, 0xac430054, - 0x8f42095c, 0x31030008, 0xaf82002c, 0x1060001a, 0x00000000, 0x8f840000, - 0x90820120, 0x90830121, 0x304600ff, 0x00c31823, 0x30630007, 0x24020007, - 0x1062000e, 0x00000000, 0x90820122, 0x304200fe, 0xa0820122, 0x8f850000, - 0x00061880, 0x8f840020, 0x24a20100, 0x00431021, 0x24c30001, 0x30630007, - 0xac440000, 0x0a000e40, 0xa0a30120, 0x90820122, 0x34420001, 0xa0820122, - 0x14e00003, 0x31020001, 0x10400031, 0x32510002, 0x8f820000, 0x8c43000c, - 0x30630001, 0x1060002c, 0x32510002, 0x3c029000, 0x8f830008, 0x34420001, - 0x3c048000, 0x00621825, 0xaf430020, 0x8f420020, 0x00441024, 0x1440fffd, - 0x00000000, 0x8f870000, 0x8ce2000c, 0x30420001, 0x10400018, 0x00000000, - 0x94e2006a, 0x00022880, 0x50a00001, 0x24050001, 0x94e30068, 0x90e40081, - 0x3c020800, 0x8c460024, 0x00652821, 0x00852804, 0x00c5102b, 0x54400001, - 0x00a03021, 0x3c020800, 0x8c440028, 0x00c4182b, 0x54600001, 0x00c02021, - 0x8f430074, 0x2402fffe, 0x00822824, 0x00a31821, 0xace3000c, 0x8f830008, - 0x3c028000, 0x34420001, 0x00621825, 0xaf430020, 0x8f830020, 0x3c020800, - 0x24504120, 0xae030024, 0x8ee20010, 0x0040f809, 0x00000000, 0x12a00005, - 0x00000000, 0x8f420e10, 0xae02002c, 0x8f430e18, 0xae030030, 0x1220feba, - 0x0000a821, 0x8f870024, 0x97860028, 0x8f830000, 0x8f820030, 0x8f840020, - 0x8f85001c, 0x32500040, 0xa4e6002c, 0xac620044, 0x32420008, 0xac640050, - 0xac650054, 0x1040007a, 0x32820020, 0x10400027, 0x32910010, 0x24072000, - 0x3c090800, 0x3c038000, 0x8f420178, 0x00431024, 0x1440fffd, 0x8ec2414c, - 0x26c4414c, 0x2484ffd4, 0xaf420144, 0x8c820030, 0x3c030400, 0xaf420148, - 0x24020041, 0xaf43014c, 0x00001821, 0xa3420152, 0x3c021000, 0xa7430158, - 0xaf470154, 0xaf420178, 0x8ec5414c, 0x8d230030, 0x8c860030, 0x24630001, - 0xad230030, 0x93420109, 0x9343010a, 0xafa70014, 0xafa00018, 0x00021600, - 0x00031c00, 0x00431025, 0x34424100, 0xafa20010, 0x8f440100, 0x0e000fe1, - 0x3c070400, 0x12200028, 0x24072000, 0x3c090800, 0x3c038000, 0x8f420178, - 0x00431024, 0x1440fffd, 0x8ec2414c, 0x26c4414c, 0x2484ffd4, 0xaf420144, - 0x8c820030, 0x3c030300, 0xaf420148, 0x2402004e, 0xaf43014c, 0x00001821, - 0xa3420152, 0x3c021000, 0xa7430158, 0xaf470154, 0xaf420178, 0x8ec5414c, - 0x8d230030, 0x8c860030, 0x24630001, 0xad230030, 0x93420109, 0x9343010a, - 0xafa70014, 0xafa00018, 0x00021600, 0x00031c00, 0x00431025, 0x34424e00, - 0xafa20010, 0x8f440100, 0x0e000fe1, 0x3c070300, 0x0a000f0b, 0x8fa30024, - 0x32820008, 0x10400026, 0x3c090800, 0x24072000, 0x3c038000, 0x8f420178, - 0x00431024, 0x1440fffd, 0x8ec2414c, 0x26c4414c, 0x2484ffd4, 0xaf420144, - 0x8c820030, 0x3c030200, 0xaf420148, 0x2402004b, 0xaf43014c, 0x00001821, - 0xa3420152, 0x3c021000, 0xa7430158, 0xaf470154, 0xaf420178, 0x8ec5414c, - 0x8d230030, 0x8c860030, 0x24630001, 0xad230030, 0x93420109, 0x9343010a, - 0xafa70014, 0xafa00018, 0x00021600, 0x00031c00, 0x00431025, 0x34424b00, - 0xafa20010, 0x8f440100, 0x0e000fe1, 0x3c070200, 0x8fa30024, 0x14600004, - 0x8fa40020, 0x32420010, 0x10400004, 0x00000000, 0x8c820004, 0x0040f809, - 0x00000000, 0x12000006, 0x8fa30020, 0x8c620008, 0x0040f809, 0x00000000, - 0x0a000f4d, 0x8fbf004c, 0x3c030800, 0x8c62413c, 0x30420040, 0x1440002f, - 0x8fbf004c, 0x24040040, 0x8f910020, 0x3c038000, 0x8f420178, 0x00431024, - 0x1440fffd, 0x8ec2414c, 0x26d0414c, 0x2610ffd4, 0xaf420144, 0x8e020030, - 0x00001821, 0xaf420148, 0x24020049, 0xaf51014c, 0xa3420152, 0x3c021000, - 0xa7430158, 0xaf440154, 0xaf420178, 0x8ec5414c, 0x8e060030, 0x93420109, - 0x9343010a, 0xafa40014, 0xafa00018, 0x00021600, 0x00031c00, 0x00431025, - 0x34424900, 0xafa20010, 0x8f440100, 0x0e000fe1, 0x02203821, 0x8f830000, - 0x8e020030, 0x8c64017c, 0x02221023, 0x00441023, 0x2c420002, 0x14400005, - 0x8fbf004c, 0x0000000d, 0x00000000, 0x240000ca, 0x8fbf004c, 0x8fbe0048, - 0x8fb70044, 0x8fb60040, 0x8fb5003c, 0x8fb40038, 0x8fb30034, 0x8fb20030, - 0x8fb1002c, 0x8fb00028, 0x03e00008, 0x27bd0050, 0x03e00008, 0x00001021, - 0x3c030800, 0x24654120, 0x8ca40004, 0x8c634120, 0x0064102b, 0x54400001, - 0x00602021, 0x9743093c, 0x0083102b, 0x54400001, 0x00801821, 0x00001021, - 0xaca30008, 0x03e00008, 0xa4a00022, 0x8f850004, 0x97840010, 0x3c030800, - 0x24634120, 0x24020008, 0xa462000e, 0x8f820004, 0xa460000c, 0x000420c2, - 0x30840008, 0x2c420001, 0x00021023, 0x30420006, 0xac650008, 0x03e00008, - 0xa0640020, 0x3c020800, 0x24424120, 0x90450021, 0x94430018, 0x3c021100, - 0xac800004, 0x00052c00, 0x24630002, 0x00621825, 0x00a32825, 0x24820008, - 0x03e00008, 0xac850000, 0x0000000d, 0x00000000, 0x2400016f, 0x03e00008, - 0x00000000, 0x0000000d, 0x00000000, 0x2400017b, 0x03e00008, 0x00000000, - 0x03e00008, 0x00000000, 0x3c020800, 0x24424120, 0xac400008, 0xa4400022, - 0x03e00008, 0x24020001, 0x3c020800, 0x24424120, 0x24030008, 0xac400008, - 0xa440000c, 0xa443000e, 0xa0400020, 0x03e00008, 0x24020004, 0x03e00008, - 0x00001021, 0x10c00007, 0x00000000, 0x8ca20000, 0x24c6ffff, 0x24a50004, - 0xac820000, 0x14c0fffb, 0x24840004, 0x03e00008, 0x00000000, 0x0a000fb2, - 0x00a01021, 0xac860000, 0x24840004, 0x00a01021, 0x1440fffc, 0x24a5ffff, - 0x03e00008, 0x00000000, 0x3c0a0800, 0x8d490068, 0x3c050800, 0x24a51090, - 0x00093140, 0x00c51021, 0xac440000, 0x8f440e04, 0x00a61021, 0xac440004, - 0x97430e08, 0x97420e0c, 0x00a62021, 0x00031c00, 0x00431025, 0xac820008, - 0x8f430e10, 0x00801021, 0xac43000c, 0x8f440e14, 0xac440010, 0x8f430e18, - 0x3c0800ff, 0xac430014, 0x8f470e1c, 0x3508ffff, 0x25290001, 0xac470018, - 0x3c070800, 0x8ce3006c, 0x9344010a, 0x3c026000, 0x24630001, 0xace3006c, - 0x8c434448, 0x3129007f, 0x00a62821, 0xad490068, 0x00042600, 0x00681824, - 0x00832025, 0x03e00008, 0xaca4001c, 0x8fac0010, 0x8fad0014, 0x8fae0018, - 0x3c0b0800, 0x8d6a0060, 0x3c080800, 0x25080078, 0x000a4940, 0x01281021, - 0x01091821, 0xac440000, 0x00601021, 0xac650004, 0xac460008, 0xac67000c, - 0xac4c0010, 0xac6d0014, 0x3c036000, 0xac4e0018, 0x8c654448, 0x3c040800, - 0x8c820064, 0x254a0001, 0x314a007f, 0x01094021, 0xad6a0060, 0x24420001, - 0xac820064, 0x03e00008, 0xad05001c, 0x00000000 }; +static u32 bnx2_TPAT_b06FwData[(0x0/4) + 1] = { 0x0 }; +static u32 bnx2_TPAT_b06FwRodata[(0x0/4) + 1] = { 0x0 }; +static u32 bnx2_TPAT_b06FwBss[(0x250/4) + 1] = { 0x0 }; +static u32 bnx2_TPAT_b06FwSbss[(0x34/4) + 1] = { 0x0 }; -static u32 bnx2_TXP_b06FwData[(0x0/4) + 1] = { 0x00000000 }; -static u32 bnx2_TXP_b06FwRodata[(0x0/4) + 1] = { 0x00000000 }; -static u32 bnx2_TXP_b06FwBss[(0x194/4) + 1] = { 0x00000000 }; -static u32 bnx2_TXP_b06FwSbss[(0x34/4) + 1] = { 0x00000000 }; +static const int bnx2_TXP_b06FwReleaseMajor = 0x1; +static const int bnx2_TXP_b06FwReleaseMinor = 0x0; +static const int bnx2_TXP_b06FwReleaseFix = 0x0; +static const u32 bnx2_TXP_b06FwStartAddr = 0x080034b0; +static const u32 bnx2_TXP_b06FwTextAddr = 0x08000000; +static const int bnx2_TXP_b06FwTextLen = 0x5748; +static const u32 bnx2_TXP_b06FwDataAddr = 0x08005760; +static const int bnx2_TXP_b06FwDataLen = 0x0; +static const u32 bnx2_TXP_b06FwRodataAddr = 0x00000000; +static const int bnx2_TXP_b06FwRodataLen = 0x0; +static const u32 bnx2_TXP_b06FwBssAddr = 0x080057a0; +static const int bnx2_TXP_b06FwBssLen = 0x1c4; +static const u32 bnx2_TXP_b06FwSbssAddr = 0x08005760; +static const int bnx2_TXP_b06FwSbssLen = 0x38; +static u8 bnx2_TXP_b06FwText[] = { + 0x1f, 0x8b, 0x08, 0x08, 0x21, 0xd3, 0x41, 0x44, 0x00, 0x03, 0x74, 0x65, + 0x73, 0x74, 0x31, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0xed, 0x5c, 0x6d, 0x6c, + 0x1b, 0xf7, 0x79, 0x7f, 0xee, 0x85, 0xd2, 0x51, 0x96, 0xe9, 0x93, 0xc2, + 0x78, 0x6c, 0xc0, 0xa6, 0x77, 0xd6, 0x51, 0x66, 0x20, 0xb5, 0xa0, 0x05, + 0x36, 0x55, 0x87, 0x43, 0x73, 0x3e, 0x52, 0x2f, 0x4e, 0x5c, 0x57, 0x71, + 0x94, 0x86, 0x6e, 0x0d, 0x8c, 0xa0, 0xec, 0xd8, 0xeb, 0x5a, 0x2c, 0x1f, + 0x8c, 0xd5, 0x68, 0xd1, 0x99, 0xa1, 0x68, 0xc7, 0xc9, 0x68, 0x51, 0xa9, + 0xe5, 0xa8, 0x43, 0x57, 0x80, 0x95, 0x64, 0xcb, 0x29, 0x4e, 0x3a, 0x65, + 0xcb, 0x16, 0x0c, 0x58, 0x16, 0xcd, 0x2f, 0x5d, 0x3f, 0x74, 0x80, 0x3f, + 0xec, 0x43, 0x3a, 0xec, 0x83, 0x91, 0x14, 0xad, 0x11, 0x6c, 0x59, 0xb0, + 0x2f, 0x33, 0xd6, 0x26, 0xb7, 0xdf, 0x73, 0x77, 0x94, 0x95, 0xc4, 0x4e, + 0xab, 0x7d, 0xbe, 0x07, 0x20, 0xee, 0x7f, 0xff, 0xd7, 0xe7, 0xfd, 0xe5, + 0x7f, 0x90, 0x06, 0xb7, 0x53, 0x17, 0x85, 0xb0, 0x1d, 0x3f, 0xed, 0x99, + 0x93, 0x27, 0x3e, 0xf7, 0xf9, 0xcf, 0x0d, 0xa1, 0x39, 0x4c, 0x4a, 0x4c, + 0xe4, 0xc1, 0x5b, 0x12, 0x51, 0xf9, 0x1d, 0x8a, 0x20, 0x82, 0x08, 0x22, + 0x88, 0x20, 0x82, 0x08, 0x22, 0x88, 0x20, 0x82, 0x08, 0x22, 0x88, 0x20, + 0x82, 0x08, 0x22, 0x88, 0x20, 0x82, 0x08, 0x22, 0x88, 0x20, 0x82, 0x08, + 0x22, 0x88, 0x20, 0x82, 0x08, 0x22, 0x88, 0x20, 0x82, 0x08, 0x22, 0x88, + 0x20, 0x82, 0x08, 0x22, 0x88, 0x20, 0x82, 0x08, 0x22, 0x88, 0x20, 0x82, + 0x08, 0x22, 0x88, 0x20, 0x82, 0x08, 0x22, 0x88, 0x20, 0x82, 0x08, 0x22, + 0xf8, 0x9d, 0x20, 0x11, 0xa9, 0xfc, 0xdc, 0x1e, 0xfe, 0x48, 0x11, 0xcd, + 0xf2, 0x53, 0xb6, 0x41, 0x8a, 0x64, 0x1e, 0x39, 0x34, 0x65, 0x10, 0x59, + 0xce, 0x80, 0x56, 0xa0, 0xf7, 0xbd, 0x6a, 0x52, 0x26, 0xee, 0xff, 0xb4, + 0xf9, 0xdb, 0x53, 0xaf, 0x7f, 0x41, 0x7f, 0xaf, 0x25, 0x91, 0xa2, 0x9a, + 0x6b, 0x79, 0xb5, 0x9f, 0x94, 0x34, 0xd6, 0xfc, 0xd5, 0xee, 0xaf, 0xef, + 0xa0, 0x44, 0x7b, 0xaf, 0x24, 0xd5, 0x9b, 0xb7, 0xbc, 0xd7, 0x77, 0x27, + 0xe9, 0x15, 0x57, 0xa5, 0x35, 0x57, 0x16, 0x46, 0x9b, 0x0a, 0x4d, 0x37, + 0x1d, 0x3a, 0xdd, 0xa8, 0x52, 0xc1, 0xbd, 0x4c, 0xb5, 0x39, 0x35, 0x61, + 0x2f, 0xff, 0x84, 0xa6, 0xe7, 0x7a, 0x13, 0x85, 0x65, 0x87, 0x6a, 0x8d, + 0x54, 0xc2, 0x76, 0xd5, 0x44, 0x61, 0x3e, 0x89, 0xf7, 0xde, 0x84, 0x3d, + 0xaf, 0x57, 0x89, 0x76, 0x62, 0x4e, 0x2a, 0x51, 0x68, 0xea, 0x65, 0xa2, + 0xbe, 0xdc, 0x75, 0x4a, 0x27, 0x0a, 0xee, 0x82, 0xb0, 0xae, 0x0a, 0x54, + 0xfb, 0x2c, 0xa9, 0x09, 0xf3, 0xb6, 0xf7, 0x29, 0x43, 0xa5, 0x1e, 0x83, + 0x76, 0xec, 0x30, 0xe8, 0xd9, 0x94, 0xa9, 0x50, 0xe5, 0x7c, 0x9c, 0x2c, + 0x9f, 0x26, 0x95, 0x2a, 0xf3, 0x03, 0xea, 0x15, 0x8a, 0x91, 0x95, 0x6c, + 0xbf, 0x7b, 0x9e, 0x9d, 0xfb, 0x16, 0xff, 0x9d, 0x16, 0xce, 0xa2, 0xc4, + 0xa8, 0x4b, 0x64, 0x03, 0x2f, 0x3b, 0xf7, 0xbe, 0x17, 0xac, 0x51, 0x70, + 0xae, 0x9c, 0x18, 0x69, 0x7a, 0x5e, 0x31, 0x87, 0x33, 0x72, 0xed, 0xb5, + 0x31, 0x6a, 0x25, 0xad, 0xd6, 0x74, 0x2e, 0xbf, 0x23, 0xf8, 0x1b, 0x2f, + 0xa6, 0x91, 0xdf, 0x2d, 0x12, 0x8d, 0xaf, 0x50, 0x25, 0x49, 0xad, 0x5a, + 0xee, 0x61, 0x7a, 0x21, 0xd7, 0x4d, 0x67, 0xb1, 0xdf, 0xf3, 0x39, 0xf0, + 0xd1, 0x38, 0x29, 0xd8, 0xae, 0x9e, 0x22, 0xe1, 0x05, 0xb2, 0xe7, 0xfb, + 0xd4, 0x02, 0xe1, 0x6c, 0xc3, 0xfb, 0x8c, 0x9d, 0xc3, 0x79, 0x83, 0xff, + 0xeb, 0x59, 0x49, 0xbd, 0xdc, 0xa2, 0x14, 0xd5, 0x9a, 0x7d, 0xb9, 0x9f, + 0x93, 0x40, 0x9d, 0x06, 0xf3, 0xc7, 0xa3, 0xc7, 0x70, 0xae, 0x6d, 0xa0, + 0xdf, 0x25, 0x4b, 0xcc, 0xc4, 0xe8, 0x4f, 0x55, 0x5d, 0xb3, 0xa5, 0x5e, + 0xaa, 0x9d, 0xef, 0x04, 0x9e, 0x56, 0xaf, 0x88, 0xb9, 0x63, 0x79, 0x4a, + 0x6e, 0x23, 0x12, 0x24, 0x33, 0x83, 0x7d, 0x89, 0x6a, 0x4e, 0x0a, 0x6b, + 0x33, 0xc3, 0xef, 0xd0, 0x0e, 0xd2, 0x7a, 0x64, 0x9a, 0x76, 0xba, 0xc0, + 0xc7, 0x6e, 0xc8, 0x20, 0x33, 0xfc, 0x2e, 0x84, 0x22, 0x1a, 0x99, 0xd4, + 0x49, 0x2a, 0x0b, 0x05, 0xb7, 0x83, 0xa6, 0x33, 0x0a, 0xd5, 0x81, 0x47, + 0x3d, 0xf7, 0x35, 0xc1, 0x5e, 0x2e, 0x09, 0x85, 0x65, 0xcc, 0x73, 0x5f, + 0x0b, 0xff, 0x76, 0xad, 0x1b, 0xfb, 0x88, 0x54, 0xcb, 0x94, 0x30, 0xa6, + 0xd0, 0x14, 0xe6, 0x4d, 0x81, 0xa6, 0x69, 0x77, 0x07, 0xad, 0x4f, 0x26, + 0x13, 0xcc, 0xab, 0x1a, 0xc6, 0xbf, 0x32, 0x21, 0x90, 0x6a, 0x58, 0xf4, + 0xeb, 0x3c, 0x64, 0x38, 0xdf, 0xcb, 0x32, 0xa3, 0xd3, 0x4d, 0x4a, 0x8a, + 0x94, 0x49, 0x55, 0xe8, 0x32, 0x2d, 0x3a, 0x2c, 0x7f, 0xc8, 0x13, 0xf2, + 0xae, 0x39, 0xbc, 0x0e, 0x72, 0x6b, 0x16, 0xc1, 0x8f, 0x71, 0xe0, 0x70, + 0x50, 0x78, 0x6c, 0x71, 0x52, 0x18, 0x73, 0x7f, 0x93, 0xa0, 0xae, 0x93, + 0xc2, 0x01, 0xf7, 0xa8, 0x10, 0xf2, 0x1e, 0xb2, 0x53, 0xc8, 0x9a, 0x50, + 0xe8, 0x92, 0x1b, 0xc8, 0x6e, 0x01, 0xfa, 0x69, 0xa9, 0x16, 0xe4, 0x70, + 0x78, 0x63, 0x0e, 0x8f, 0xd5, 0x97, 0x65, 0x3a, 0xed, 0xf2, 0xfc, 0x3f, + 0x82, 0x7c, 0x14, 0x72, 0x76, 0x77, 0x53, 0x19, 0xfd, 0xb5, 0x79, 0xb2, + 0xec, 0x9c, 0x88, 0x35, 0x09, 0x92, 0x8c, 0x9d, 0xf8, 0x75, 0xd1, 0xd4, + 0x62, 0xa7, 0x25, 0x19, 0x49, 0x9a, 0x72, 0x99, 0x87, 0x78, 0x36, 0xdb, + 0x7c, 0x64, 0x5c, 0xb9, 0x9f, 0xd7, 0x71, 0xbf, 0x8a, 0xfe, 0xcd, 0x7d, + 0xac, 0x17, 0x09, 0xe0, 0xa3, 0x67, 0x59, 0x9f, 0x2b, 0xcd, 0x8c, 0x7a, + 0x80, 0x9f, 0x2e, 0xf3, 0xb6, 0xcd, 0x53, 0x19, 0x73, 0x45, 0xaa, 0x2c, + 0xe2, 0x9c, 0xf3, 0xbf, 0xf5, 0x62, 0x79, 0xbc, 0x1b, 0x1d, 0xa0, 0x8b, + 0xcf, 0x95, 0x81, 0x93, 0x48, 0xe5, 0x45, 0xde, 0x8b, 0xc7, 0x09, 0xb2, + 0xaf, 0xf5, 0x88, 0x94, 0x85, 0x7c, 0x75, 0x9c, 0x13, 0xc7, 0x9c, 0x6e, + 0xf0, 0x0f, 0xb4, 0x2e, 0xa3, 0x0d, 0xda, 0x45, 0x43, 0xc4, 0xfa, 0x4e, + 0x9a, 0xca, 0xb1, 0xbe, 0x30, 0x9e, 0xdb, 0xb0, 0x77, 0x9c, 0x8e, 0x9c, + 0x67, 0x7e, 0xc8, 0xf4, 0x3c, 0x70, 0x9c, 0x9e, 0xd7, 0xd5, 0x22, 0xe9, + 0xe0, 0x8d, 0x85, 0x79, 0x9d, 0x54, 0x56, 0x3d, 0x6f, 0x24, 0x37, 0xa0, + 0xbe, 0xec, 0xeb, 0xf9, 0x80, 0x9a, 0x11, 0xa8, 0xda, 0x61, 0xfe, 0x21, + 0x70, 0xd0, 0x4b, 0x44, 0xfc, 0xfe, 0xcf, 0x64, 0x4d, 0xb2, 0xfd, 0x24, + 0xf9, 0x2c, 0xd8, 0xd3, 0x4e, 0xe0, 0xcf, 0x36, 0x97, 0x86, 0x5c, 0x52, + 0xbe, 0x1d, 0x8c, 0xdc, 0xd5, 0x0e, 0xf4, 0xf1, 0x16, 0x6c, 0xa6, 0xb6, + 0x2c, 0xb3, 0xfd, 0xe5, 0xa0, 0x6e, 0xb4, 0xcd, 0x80, 0x6e, 0xf9, 0xb2, + 0xd9, 0x8f, 0xfd, 0x3d, 0xef, 0xcb, 0xb9, 0x00, 0xa7, 0xda, 0xbc, 0x85, + 0xb5, 0x32, 0xf8, 0xae, 0x1f, 0xd7, 0xfc, 0xf3, 0xf7, 0x87, 0xe7, 0xab, + 0x34, 0x05, 0xbc, 0x6b, 0x4d, 0x89, 0x0a, 0x2a, 0xef, 0xf1, 0x2e, 0xf7, + 0x97, 0x83, 0xbd, 0xa0, 0xb7, 0xe7, 0xfa, 0xd4, 0x7d, 0xb0, 0x25, 0xb6, + 0xb1, 0xda, 0x0a, 0xf3, 0x18, 0xfb, 0xe4, 0x99, 0xc7, 0xaa, 0x8f, 0xa3, + 0x3d, 0xcf, 0x7a, 0x44, 0x69, 0x89, 0x58, 0xcf, 0x2f, 0xb3, 0x2e, 0x41, + 0x3f, 0x03, 0xbd, 0xaa, 0x38, 0x2c, 0xff, 0x2f, 0x85, 0xf6, 0x29, 0x52, + 0x7f, 0x86, 0xf5, 0xfd, 0x05, 0x2a, 0xc0, 0xc6, 0xa7, 0x70, 0xd2, 0x22, + 0x68, 0x5a, 0x68, 0xf6, 0x81, 0x57, 0x6d, 0xbb, 0x83, 0x7c, 0x07, 0xff, + 0xc7, 0x0b, 0xe6, 0x77, 0x03, 0x27, 0xb6, 0x99, 0x9a, 0x2a, 0x52, 0x15, + 0x3f, 0xe8, 0x8d, 0xa1, 0x67, 0x6d, 0x49, 0x9f, 0x28, 0x03, 0x37, 0xe8, + 0x3d, 0xd9, 0x7b, 0x58, 0x9f, 0x31, 0xc7, 0xa5, 0xa1, 0xb6, 0x9d, 0x2d, + 0x38, 0x2c, 0xa7, 0x2e, 0x9c, 0xdb, 0xc6, 0x49, 0x46, 0x1f, 0xef, 0xa3, + 0x40, 0xe7, 0xdb, 0x3a, 0xc3, 0xfa, 0xa7, 0x5b, 0xeb, 0xd4, 0x41, 0xd9, + 0x0c, 0x7c, 0xd9, 0xbc, 0x08, 0xf9, 0xa5, 0xe1, 0x53, 0x64, 0x7a, 0xba, + 0x99, 0xa4, 0x63, 0x4d, 0xc6, 0xaf, 0x08, 0xbb, 0x83, 0x6f, 0x9b, 0x1f, + 0x85, 0x9d, 0x8d, 0x0b, 0x23, 0xb0, 0x89, 0x47, 0x17, 0x19, 0x27, 0x8f, + 0xd8, 0x2e, 0x8b, 0xcb, 0x65, 0x61, 0xd4, 0x2d, 0x09, 0xe3, 0xcb, 0x6c, + 0x27, 0x6c, 0x23, 0xba, 0xfa, 0x38, 0x31, 0x0d, 0x98, 0xe3, 0xfe, 0x22, + 0xc1, 0xb6, 0x5a, 0x3b, 0x17, 0x07, 0x1e, 0xdb, 0x80, 0x4f, 0x37, 0x6c, + 0x0f, 0xfa, 0x65, 0xe8, 0x13, 0xac, 0x33, 0xc5, 0x8c, 0xa1, 0xfd, 0x25, + 0x7d, 0x9c, 0x0f, 0x23, 0x1b, 0x7c, 0x18, 0x00, 0x4f, 0x3e, 0xcc, 0x87, + 0xfa, 0xc7, 0xf9, 0x60, 0x55, 0xc1, 0x87, 0x3a, 0xfc, 0x50, 0xdd, 0x65, + 0x9a, 0x3d, 0x12, 0xf7, 0x10, 0xb4, 0x93, 0xf6, 0x8a, 0x26, 0xeb, 0x28, + 0xdb, 0x49, 0x46, 0x9b, 0xc6, 0x0e, 0x4b, 0x4e, 0xb7, 0x6f, 0x1b, 0xa3, + 0x3e, 0x2f, 0x7e, 0x17, 0xbd, 0x4c, 0xdf, 0x1d, 0x9a, 0xc7, 0x17, 0xd9, + 0xdf, 0x40, 0xcf, 0x33, 0x86, 0x7a, 0x88, 0xee, 0xd0, 0xbd, 0xef, 0x0e, + 0xdd, 0x38, 0xa7, 0xed, 0x83, 0x98, 0xe6, 0xb6, 0x3f, 0x66, 0x5d, 0x79, + 0xc3, 0x93, 0x0c, 0x03, 0x32, 0x60, 0x7d, 0x61, 0x1c, 0x74, 0xf5, 0xcb, + 0xa0, 0xa7, 0x02, 0xbf, 0xc0, 0xb6, 0x54, 0xf6, 0xe7, 0x75, 0x50, 0xb9, + 0x27, 0x98, 0x3f, 0xd5, 0xf4, 0xfe, 0x4b, 0x34, 0x3f, 0xf0, 0xec, 0xbc, + 0x11, 0xda, 0xb8, 0x42, 0x7f, 0xb2, 0xa8, 0x97, 0x35, 0xa1, 0x9b, 0xaa, + 0xf7, 0xc3, 0xaf, 0x34, 0xd9, 0x3e, 0x76, 0xde, 0xc3, 0x97, 0xa5, 0x43, + 0x5f, 0xf6, 0x3e, 0x78, 0xcf, 0xb1, 0xe7, 0xe8, 0x07, 0xeb, 0x49, 0x7e, + 0x66, 0xd4, 0x09, 0x2a, 0x71, 0xbc, 0xd9, 0x21, 0xfa, 0xfe, 0xbb, 0x8f, + 0x63, 0x41, 0x55, 0x36, 0xe3, 0x54, 0xed, 0xa1, 0xaa, 0x64, 0xb2, 0x1d, + 0xb1, 0x6d, 0xb4, 0xf1, 0xde, 0x1e, 0xc6, 0xdd, 0x41, 0x89, 0x0c, 0x1e, + 0x47, 0x8c, 0x68, 0x32, 0x0d, 0xef, 0x87, 0xf2, 0x60, 0x7f, 0x4a, 0xb1, + 0x40, 0xdf, 0xf6, 0xc3, 0x5f, 0x32, 0x3f, 0x37, 0xeb, 0x0a, 0xfb, 0x51, + 0xd2, 0x44, 0x83, 0xfd, 0x28, 0xa9, 0x92, 0x79, 0x50, 0xb0, 0x16, 0xbf, + 0x26, 0x58, 0xe0, 0x9b, 0x05, 0xbe, 0x59, 0xe0, 0x9b, 0x0d, 0xbe, 0x15, + 0x5c, 0xc6, 0x85, 0xf1, 0x08, 0xf6, 0x2f, 0x06, 0xfb, 0x03, 0xc7, 0x9d, + 0x54, 0xf1, 0xed, 0x9b, 0x69, 0x85, 0x3f, 0xf6, 0x7d, 0xc1, 0xa8, 0x10, + 0xf8, 0x02, 0xde, 0x6f, 0x1c, 0xeb, 0x1f, 0x47, 0x8c, 0xb3, 0x44, 0xd1, + 0xb8, 0xc3, 0x8f, 0xfa, 0x26, 0x7e, 0x4c, 0x3b, 0xcc, 0x1f, 0x9e, 0xcf, + 0x76, 0xec, 0x40, 0xe6, 0x6d, 0x9e, 0xec, 0x07, 0x0e, 0x9d, 0x4c, 0x77, + 0x48, 0x07, 0xef, 0xdf, 0x1b, 0xee, 0x7f, 0x00, 0x7b, 0xb2, 0xdd, 0xde, + 0xed, 0x5c, 0x3e, 0x93, 0xe3, 0xe8, 0x27, 0xd1, 0x83, 0x3c, 0x02, 0x7e, + 0x66, 0x0d, 0x76, 0x76, 0x53, 0x4a, 0xd1, 0xeb, 0xbb, 0x6f, 0x20, 0xb7, + 0xa0, 0xea, 0x03, 0xa6, 0xa7, 0xc9, 0xe6, 0xfb, 0x5e, 0x3d, 0x0f, 0xdf, + 0x69, 0xea, 0x29, 0x5b, 0x1a, 0xa4, 0x37, 0xdc, 0x2c, 0xfd, 0x9d, 0x6b, + 0xd0, 0xdf, 0xba, 0x1a, 0xbd, 0xea, 0xa6, 0xe9, 0x6f, 0xdc, 0x14, 0xfd, + 0xb5, 0xdb, 0xce, 0x43, 0x92, 0xac, 0x47, 0x89, 0xa2, 0x7b, 0xb7, 0x5c, + 0x08, 0x3a, 0x8e, 0xbd, 0xec, 0xbc, 0x5c, 0x96, 0x4d, 0x3f, 0x3f, 0x98, + 0x98, 0x6e, 0x90, 0xb2, 0xd3, 0xa0, 0xed, 0xf7, 0x23, 0xef, 0x49, 0x9a, + 0xb4, 0xe3, 0x3e, 0x3c, 0x7b, 0x4d, 0xb2, 0x7a, 0xcc, 0x53, 0x9e, 0x68, + 0xb0, 0x1e, 0x75, 0x0f, 0x4f, 0xe5, 0xe3, 0x8c, 0xfb, 0xc4, 0x34, 0xfc, + 0x91, 0x8d, 0xb3, 0xaa, 0xd0, 0xc5, 0xaa, 0x7b, 0xe8, 0xfe, 0x20, 0x17, + 0x7a, 0x2f, 0xcc, 0x89, 0x38, 0xaf, 0x5a, 0x7f, 0x6a, 0xc2, 0x60, 0x3f, + 0x2b, 0x6c, 0xf2, 0xb3, 0x24, 0x14, 0x41, 0x53, 0x1d, 0xb8, 0x16, 0x41, + 0xe7, 0x57, 0x5d, 0x45, 0x28, 0x9c, 0xef, 0xa5, 0xe9, 0x45, 0x8e, 0x55, + 0x3c, 0x4f, 0x09, 0x73, 0x19, 0x7e, 0xef, 0xc0, 0x3b, 0x21, 0x7e, 0x14, + 0xb6, 0x53, 0x42, 0x7f, 0x73, 0x82, 0x9c, 0x30, 0x17, 0x89, 0xd1, 0x05, + 0x5f, 0x77, 0xb8, 0xdf, 0x2a, 0xfd, 0xb0, 0xff, 0x4e, 0xff, 0xf9, 0x8d, + 0xfe, 0x72, 0xe9, 0xeb, 0x1b, 0xfd, 0xef, 0xa8, 0x01, 0x4e, 0xc3, 0xc2, + 0xe3, 0xee, 0xf3, 0x61, 0xdf, 0x6d, 0xf0, 0xd3, 0xf3, 0xea, 0x88, 0x27, + 0x35, 0xe3, 0x36, 0x72, 0x1f, 0xf6, 0x29, 0x5b, 0xf1, 0x21, 0x1f, 0xf2, + 0x1f, 0xaa, 0x2d, 0xb1, 0x9c, 0x14, 0x0a, 0xf6, 0xe4, 0xf1, 0x4e, 0xf8, + 0x92, 0xdb, 0x68, 0x73, 0xec, 0x6a, 0xfb, 0x31, 0x9e, 0xc3, 0xeb, 0x6f, + 0xdd, 0x43, 0x96, 0x2a, 0x64, 0xb9, 0x35, 0x79, 0xd5, 0x1a, 0xa7, 0x42, + 0x9f, 0xd0, 0x3d, 0x6c, 0x43, 0x2e, 0x12, 0xe4, 0x52, 0x83, 0x5c, 0x0a, + 0xf7, 0x94, 0x0b, 0xce, 0xd8, 0xd0, 0x29, 0xc6, 0xa3, 0x2b, 0x3c, 0x9b, + 0x14, 0xd9, 0xac, 0x96, 0xea, 0xc6, 0xa7, 0x28, 0x66, 0x30, 0x1e, 0x06, + 0xf0, 0x38, 0x8a, 0xb5, 0x1c, 0xc3, 0x48, 0x89, 0x99, 0x2c, 0xcf, 0xdc, + 0x13, 0xb6, 0x71, 0xab, 0xb4, 0xe0, 0xdc, 0x2a, 0x5d, 0x34, 0xf8, 0xfd, + 0xf6, 0x64, 0x90, 0x37, 0x77, 0x3f, 0x89, 0xbc, 0x19, 0xeb, 0xd9, 0x1f, + 0x72, 0xff, 0x30, 0xe6, 0x71, 0x7c, 0xa0, 0x43, 0x35, 0xfc, 0xea, 0xfe, + 0xdc, 0x6b, 0x4f, 0xf0, 0xdc, 0x4e, 0x53, 0x9e, 0xfc, 0x35, 0x9e, 0x1d, + 0xa6, 0xf6, 0xe4, 0x4f, 0x0d, 0xde, 0x77, 0x78, 0xf2, 0xa2, 0xbf, 0x07, + 0x62, 0xa6, 0xbf, 0x36, 0xfb, 0x24, 0xaf, 0x7d, 0x0e, 0x3e, 0xf6, 0x0c, + 0xe2, 0xcb, 0x69, 0x47, 0x3b, 0x54, 0xc1, 0x6f, 0x8a, 0x71, 0x6a, 0xf2, + 0xb8, 0x85, 0x71, 0x19, 0xb1, 0x90, 0xdb, 0x0a, 0x1d, 0xc3, 0xbc, 0xa7, + 0x31, 0xef, 0xa8, 0x33, 0x8e, 0xbc, 0xbd, 0x4d, 0xd7, 0xbf, 0xc5, 0x0b, + 0xf3, 0xec, 0xcf, 0x91, 0xed, 0xaf, 0xfc, 0x7b, 0xdc, 0x86, 0x5f, 0x16, + 0x57, 0x6e, 0xc6, 0x0b, 0xa0, 0x5b, 0x5a, 0xf9, 0x45, 0xbc, 0x08, 0x3d, + 0x13, 0x0d, 0x09, 0x7e, 0xf9, 0x33, 0x54, 0x53, 0x3d, 0x7a, 0x19, 0xf1, + 0xab, 0x96, 0x85, 0xbf, 0x82, 0x34, 0x45, 0x03, 0x7e, 0x4c, 0x25, 0xa5, + 0xcb, 0x3c, 0xa9, 0x52, 0x57, 0x3e, 0x6e, 0x23, 0xde, 0xd4, 0x54, 0x09, + 0xfd, 0xfd, 0x78, 0x6e, 0xee, 0xff, 0x65, 0x1c, 0x7e, 0x0b, 0x3e, 0x82, + 0x14, 0x3b, 0xdf, 0x8d, 0xfd, 0xbf, 0x8d, 0x7e, 0x4c, 0xc8, 0x6c, 0xf4, + 0x3f, 0x1b, 0xf4, 0xdf, 0x02, 0x2e, 0xbc, 0x8e, 0xe3, 0x27, 0x29, 0x53, + 0x79, 0x15, 0x38, 0xf0, 0xdc, 0xa4, 0x3f, 0xb7, 0x38, 0xcf, 0x3c, 0xa8, + 0x96, 0x16, 0x8c, 0x34, 0x15, 0xe6, 0x92, 0x34, 0x3a, 0xa7, 0xd2, 0xd8, + 0x9c, 0x3e, 0xd1, 0x62, 0xfb, 0x01, 0xcd, 0x84, 0x1c, 0x41, 0x5c, 0x21, + 0x50, 0xac, 0xa7, 0x9e, 0xa6, 0xbe, 0xd4, 0x31, 0xfa, 0x6f, 0x0f, 0xb1, + 0x08, 0x71, 0xa8, 0x9b, 0x64, 0x7f, 0x9f, 0x54, 0xfb, 0x4c, 0x96, 0xd1, + 0x87, 0xce, 0x2d, 0xce, 0xdf, 0x6b, 0x5f, 0x28, 0xf1, 0x4a, 0xea, 0x23, + 0xfb, 0xbe, 0x1b, 0xee, 0xab, 0x62, 0xdf, 0x34, 0xf6, 0x64, 0x1a, 0xf5, + 0xf8, 0xc8, 0x79, 0xb2, 0x3a, 0x81, 0x5f, 0x31, 0x83, 0x98, 0x8f, 0x7d, + 0xce, 0xcc, 0xb1, 0xde, 0xd3, 0x4e, 0xfc, 0x06, 0x63, 0x94, 0xc9, 0x2e, + 0x23, 0x27, 0x18, 0xf1, 0xf7, 0x08, 0xf2, 0x05, 0x71, 0x65, 0x10, 0xf9, + 0xda, 0x3b, 0xc0, 0x87, 0xe3, 0x18, 0xd3, 0x2c, 0x83, 0xde, 0x41, 0xe4, + 0x09, 0x9c, 0xe3, 0x7b, 0xa7, 0xec, 0x1c, 0xda, 0xcb, 0x5a, 0xbc, 0x00, + 0xdb, 0x16, 0x4d, 0x7a, 0x50, 0xf2, 0x7d, 0x2c, 0xcb, 0x65, 0x10, 0x72, + 0x62, 0xbc, 0x73, 0x90, 0x13, 0xf3, 0x68, 0x38, 0x5e, 0x6c, 0x32, 0x8f, + 0x08, 0xf8, 0x68, 0xb0, 0x27, 0xd9, 0xcf, 0xf3, 0xc5, 0x15, 0x0b, 0xf3, + 0x7e, 0xac, 0x72, 0x2e, 0x66, 0x1b, 0xdc, 0x86, 0xed, 0xac, 0x8c, 0x63, + 0x2e, 0xb7, 0x1f, 0xc6, 0xbe, 0x7d, 0xb9, 0x1a, 0x75, 0xe4, 0x9e, 0x86, + 0xdd, 0x8a, 0xf9, 0x01, 0xc4, 0x68, 0x01, 0xb9, 0xa0, 0xe7, 0x75, 0xe4, + 0xbf, 0x00, 0x7a, 0x98, 0x0e, 0xe8, 0xf5, 0x2c, 0xf3, 0x95, 0xfe, 0x40, + 0xe4, 0x5c, 0x2d, 0xdf, 0xce, 0x6b, 0x38, 0x9e, 0xf3, 0xf9, 0x88, 0x23, + 0x8d, 0x3d, 0x88, 0xa5, 0xfe, 0xd9, 0xd0, 0xb1, 0x71, 0x2a, 0x34, 0x3e, + 0x8b, 0x9c, 0x93, 0x6d, 0x67, 0x9b, 0x60, 0x9f, 0x67, 0x1a, 0x09, 0xb1, + 0x66, 0x8d, 0x2a, 0x0d, 0x39, 0x6c, 0xbf, 0x8a, 0xb6, 0x12, 0xb6, 0xd7, + 0xd1, 0xee, 0x0e, 0xdb, 0xd7, 0xd0, 0x56, 0xc3, 0xf6, 0xcf, 0xd0, 0x4e, + 0x86, 0xed, 0x9f, 0xa3, 0x9d, 0x0a, 0xdb, 0x37, 0xd1, 0x4e, 0x87, 0xed, + 0x5b, 0x68, 0x6b, 0x61, 0xfb, 0x3d, 0xb4, 0x13, 0xb0, 0x73, 0x03, 0xef, + 0x37, 0x50, 0x2b, 0x66, 0xf1, 0xfc, 0x57, 0xe0, 0x36, 0x08, 0xde, 0x64, + 0xc1, 0x8f, 0x5e, 0x8c, 0xe5, 0xd0, 0x87, 0x1c, 0xb1, 0x91, 0xc7, 0xd3, + 0xc1, 0x18, 0x95, 0x61, 0x7b, 0x18, 0x1f, 0x2f, 0x16, 0x1a, 0x26, 0x9e, + 0x6c, 0x0f, 0xba, 0x4a, 0xc2, 0x65, 0xd8, 0xb9, 0xef, 0x63, 0x72, 0xb6, + 0x34, 0x09, 0xdb, 0x9e, 0xa0, 0x7f, 0x74, 0xf7, 0xd3, 0x6b, 0xee, 0x38, + 0xe2, 0x46, 0x11, 0x71, 0xc3, 0x42, 0xdc, 0x30, 0x11, 0x37, 0x86, 0x11, + 0x37, 0xf2, 0x88, 0x1b, 0x39, 0xc4, 0x0d, 0xa2, 0x33, 0x7e, 0x8c, 0x4a, + 0x2a, 0xa8, 0x51, 0x15, 0xcb, 0x2d, 0x82, 0xbf, 0x13, 0x90, 0xcd, 0x24, + 0x78, 0x7d, 0x38, 0x3e, 0xd2, 0xcc, 0xc3, 0x9f, 0x69, 0xf0, 0x11, 0x69, + 0xf8, 0xf2, 0x1c, 0x6a, 0x13, 0xa2, 0x2b, 0xb3, 0x1a, 0xfc, 0x8f, 0x47, + 0x45, 0xc4, 0xfe, 0x69, 0x15, 0xb8, 0x19, 0xbb, 0x7c, 0x9b, 0x91, 0xcc, + 0x2f, 0xf6, 0x50, 0xd7, 0x20, 0xe8, 0x39, 0x8b, 0xbe, 0x14, 0xf6, 0x63, + 0xbe, 0xde, 0x2a, 0xd9, 0x86, 0x46, 0x0b, 0x6e, 0x1c, 0xfe, 0x9f, 0xdf, + 0xe3, 0xcc, 0xe3, 0x43, 0x4f, 0x19, 0x4c, 0x03, 0xea, 0x3c, 0x23, 0xad, + 0x14, 0x1c, 0x81, 0x24, 0x93, 0x9f, 0xed, 0x1c, 0xe2, 0xcf, 0x90, 0x43, + 0x74, 0x41, 0x06, 0x55, 0xc4, 0x05, 0x9d, 0xf3, 0x0b, 0xe8, 0xf2, 0x27, + 0xcd, 0xff, 0x1e, 0xe6, 0xef, 0xc5, 0xd9, 0x3c, 0x8f, 0xcf, 0x39, 0x85, + 0xfa, 0xc1, 0xea, 0x91, 0x68, 0x3d, 0x25, 0xa1, 0x9e, 0x28, 0xd0, 0x59, + 0x2a, 0x00, 0x9f, 0x82, 0xdb, 0xbe, 0x07, 0xb0, 0x0e, 0x05, 0xfe, 0x6c, + 0xe2, 0xd0, 0xb7, 0x0d, 0x0b, 0xeb, 0x18, 0x3f, 0xd6, 0x5b, 0xe0, 0xbe, + 0xb1, 0xe7, 0x05, 0xec, 0xf9, 0x4f, 0x49, 0xea, 0x9a, 0x0c, 0xfc, 0x91, + 0x5f, 0xf3, 0xca, 0xc2, 0x48, 0xf3, 0x2c, 0xf8, 0xd3, 0x87, 0x1a, 0x05, + 0x7e, 0xa4, 0xd4, 0x02, 0x9f, 0xda, 0xf3, 0x5f, 0xc1, 0x7c, 0x7e, 0xf7, + 0xef, 0x0e, 0x4a, 0xd2, 0xea, 0x12, 0xe6, 0x69, 0xac, 0x3f, 0x25, 0xb9, + 0xff, 0x86, 0xf7, 0xa2, 0x91, 0xa7, 0x5d, 0xab, 0xbc, 0x2e, 0x4b, 0x7d, + 0xab, 0x37, 0xbc, 0x9a, 0xa3, 0xd1, 0x62, 0x93, 0xc0, 0xab, 0xf8, 0x6d, + 0x8b, 0xf4, 0x35, 0x12, 0xf5, 0x59, 0x0b, 0x7a, 0x5a, 0x1c, 0x12, 0xc9, + 0x1e, 0xea, 0x84, 0x8f, 0x32, 0x68, 0x09, 0x7c, 0xdf, 0x35, 0x63, 0xd1, + 0x13, 0x43, 0xed, 0x7c, 0x10, 0x51, 0x0f, 0xb8, 0xee, 0x5a, 0xd5, 0x30, + 0x87, 0x73, 0x71, 0xa6, 0x45, 0x03, 0x2f, 0x85, 0x60, 0x8d, 0x1f, 0xb3, + 0xb8, 0x8e, 0x05, 0xdf, 0xdc, 0xb5, 0xd2, 0xd5, 0x19, 0xd4, 0x1a, 0x90, + 0xf3, 0xae, 0x19, 0xae, 0x85, 0xb6, 0x81, 0x2f, 0x31, 0xd8, 0x06, 0xe7, + 0xf1, 0x08, 0xf4, 0xf0, 0x87, 0x27, 0xe0, 0xf1, 0x6b, 0xcd, 0x13, 0xd0, + 0xfb, 0x2e, 0x2a, 0xcb, 0x3e, 0x11, 0x9f, 0xc0, 0xe3, 0xff, 0xe4, 0xbc, + 0x0e, 0xf3, 0xbf, 0x4b, 0xc5, 0xd9, 0x2e, 0xec, 0xb5, 0x9b, 0xa6, 0x93, + 0x8c, 0x9b, 0x3e, 0x8c, 0x41, 0x2d, 0x06, 0x7e, 0xc6, 0xcd, 0x8f, 0xe6, + 0x7d, 0x6b, 0xa5, 0x2b, 0x33, 0x6b, 0xa5, 0x6b, 0xa0, 0xbf, 0x6e, 0x70, + 0x8d, 0x0c, 0x5d, 0x6a, 0x70, 0x6d, 0xcf, 0x79, 0xd1, 0x18, 0x74, 0x64, + 0xbf, 0x5f, 0x33, 0xdb, 0x8b, 0x39, 0xea, 0x3b, 0x47, 0xaa, 0x68, 0x96, + 0x84, 0x31, 0xe4, 0x45, 0x23, 0xee, 0x49, 0x7f, 0xee, 0x99, 0x06, 0xd7, + 0x2b, 0x18, 0x5b, 0x61, 0x5d, 0x18, 0x03, 0x3e, 0x49, 0xba, 0xe8, 0xb2, + 0x4f, 0x0a, 0xec, 0x78, 0x0c, 0xfc, 0x5a, 0xf0, 0xe9, 0x4a, 0x71, 0x1c, + 0x47, 0xbe, 0xc1, 0xf2, 0xf9, 0x21, 0xc7, 0x41, 0xa1, 0xd3, 0x6c, 0xfb, + 0xdb, 0x89, 0x5e, 0xe6, 0x59, 0xa1, 0x01, 0xdf, 0x3f, 0x34, 0x11, 0xe6, + 0x1c, 0x7f, 0x8f, 0x39, 0x8c, 0x3b, 0xcd, 0x4a, 0x26, 0xce, 0xc8, 0x33, + 0xcf, 0x38, 0xa7, 0xe4, 0x7d, 0xc1, 0x5b, 0xf0, 0x7d, 0x53, 0x6e, 0xe9, + 0xc3, 0x74, 0x33, 0x46, 0x95, 0x59, 0xf0, 0x2e, 0x8f, 0x27, 0x9c, 0x6b, + 0x1d, 0x7c, 0x03, 0x2d, 0xd5, 0x20, 0x9f, 0x3d, 0xc1, 0x31, 0x0d, 0xfe, + 0x06, 0x36, 0xcd, 0x31, 0x6b, 0xe3, 0xde, 0xc9, 0xf7, 0x25, 0x32, 0x19, + 0x41, 0xce, 0x2a, 0xe2, 0x2c, 0x3b, 0xcf, 0x7e, 0x10, 0xf8, 0xb8, 0xdf, + 0xa5, 0xfa, 0x2c, 0xd3, 0x05, 0x1b, 0x4f, 0xb2, 0x2e, 0xfe, 0x7f, 0xf9, + 0x38, 0xba, 0x45, 0x3e, 0x8e, 0x6e, 0x99, 0x8f, 0x12, 0xf8, 0x58, 0xd9, + 0xe0, 0xa3, 0x82, 0x3d, 0xf8, 0x3e, 0xe1, 0xab, 0x64, 0x4d, 0x3c, 0x02, + 0x3f, 0x0c, 0xff, 0xd1, 0x3c, 0x05, 0x9f, 0x70, 0x52, 0xb8, 0xda, 0xf0, + 0x68, 0x1c, 0xb5, 0xb2, 0x74, 0xff, 0x66, 0xfa, 0x33, 0xa0, 0xff, 0xcf, + 0x31, 0x5e, 0xa5, 0x6b, 0xb3, 0x94, 0x56, 0xa8, 0x7d, 0x2e, 0xed, 0x92, + 0xe9, 0x3b, 0x74, 0x75, 0xb6, 0x8b, 0xae, 0xcf, 0x66, 0xc0, 0xeb, 0x2c, + 0xc5, 0x7a, 0x32, 0xc3, 0x15, 0x18, 0xf1, 0xcf, 0x5a, 0xba, 0xc5, 0xba, + 0xf8, 0xfb, 0xf3, 0x82, 0xf9, 0x70, 0xd0, 0xe7, 0xc3, 0xd8, 0x47, 0xf8, + 0x30, 0x7e, 0x4f, 0x3e, 0x1c, 0xfc, 0x18, 0x1f, 0xc6, 0x3f, 0xc6, 0x07, + 0xe6, 0x01, 0xf3, 0xe2, 0xd1, 0xde, 0xf0, 0xff, 0x1f, 0x7d, 0x82, 0x7d, + 0x7c, 0x09, 0x74, 0x22, 0xa7, 0xd8, 0x19, 0xe4, 0x50, 0x9c, 0x63, 0xd5, + 0x0c, 0xe6, 0x57, 0x60, 0xbf, 0x32, 0x72, 0xea, 0x23, 0xa1, 0xfd, 0x16, + 0x1c, 0xe8, 0x65, 0x23, 0xe6, 0xdb, 0xaf, 0x64, 0xe6, 0xe1, 0x03, 0xaa, + 0xa5, 0x96, 0xc3, 0xfe, 0x07, 0x6d, 0x87, 0x79, 0xda, 0x0b, 0x5a, 0x12, + 0x54, 0x99, 0x54, 0x10, 0x5f, 0x87, 0xa1, 0xb7, 0x71, 0xdf, 0x07, 0x4a, + 0x26, 0xeb, 0xe1, 0x7e, 0xcc, 0x3f, 0x1c, 0xe6, 0x45, 0x88, 0x73, 0x38, + 0xa3, 0xd6, 0x38, 0x0d, 0xfc, 0xf8, 0x9c, 0x6a, 0xa9, 0xec, 0xf0, 0x9a, + 0x34, 0x62, 0x21, 0x3f, 0x37, 0xeb, 0xb7, 0xaf, 0xef, 0xf7, 0xd2, 0x71, + 0xe8, 0x26, 0xeb, 0xb4, 0x82, 0xdc, 0x78, 0x02, 0xf1, 0xc5, 0xd7, 0xd3, + 0xec, 0x02, 0xb1, 0xdf, 0x7f, 0x06, 0x75, 0xd1, 0x61, 0xfc, 0x34, 0x1a, + 0x71, 0x03, 0x9b, 0x5a, 0xf2, 0xcf, 0xfc, 0xb0, 0x4f, 0xaa, 0x39, 0xeb, + 0xc8, 0xdf, 0x0d, 0xec, 0xcb, 0xe7, 0x56, 0xc1, 0x1b, 0x09, 0xe7, 0x72, + 0x5f, 0x37, 0xe2, 0x00, 0xf8, 0xe4, 0xfe, 0x07, 0xfa, 0x97, 0xe0, 0x1f, + 0x39, 0x2f, 0x68, 0xe3, 0x8e, 0x1c, 0xc2, 0xe1, 0x78, 0x9d, 0x07, 0xcd, + 0x9c, 0x63, 0x73, 0x2e, 0x81, 0xfc, 0x63, 0xe9, 0x4d, 0xf4, 0x0d, 0xd3, + 0xe9, 0xa1, 0x2c, 0xe4, 0xc3, 0x7d, 0x0f, 0x84, 0x7d, 0x3c, 0x8f, 0x94, + 0x07, 0x4d, 0xfd, 0x07, 0x55, 0xdf, 0xaf, 0x43, 0x0f, 0x51, 0xf7, 0xd5, + 0x96, 0x90, 0x63, 0x00, 0xa7, 0xca, 0x6a, 0x16, 0xb9, 0x3c, 0xdf, 0xab, + 0xe9, 0x97, 0x91, 0x07, 0x83, 0x27, 0x0a, 0xf5, 0x1a, 0xa5, 0xd0, 0x0f, + 0xe7, 0x40, 0x1f, 0xdf, 0x3d, 0xf5, 0x21, 0xf7, 0x91, 0xc0, 0x08, 0xd8, + 0xe9, 0xaa, 0x44, 0x7b, 0xe5, 0x01, 0xb5, 0x46, 0xff, 0x80, 0xb9, 0x32, + 0x95, 0x57, 0x39, 0x87, 0x90, 0xe9, 0xc8, 0x2a, 0xd1, 0x5b, 0x33, 0xec, + 0x97, 0x19, 0xd8, 0x2f, 0xb3, 0x7f, 0x7d, 0xd0, 0x1f, 0x7b, 0x6b, 0x06, + 0x35, 0xf8, 0xcc, 0x00, 0xc7, 0xb0, 0x75, 0x11, 0xbc, 0x44, 0xee, 0xc3, + 0xf9, 0xf9, 0x5d, 0xee, 0x98, 0xda, 0xf7, 0x4b, 0x0a, 0x55, 0x66, 0xf8, + 0x6e, 0x49, 0xc6, 0xf9, 0x5c, 0x5b, 0x6c, 0x03, 0x7e, 0x02, 0xa1, 0xee, + 0x12, 0x38, 0xa6, 0x09, 0xd0, 0xa1, 0x5d, 0x90, 0x3d, 0xf8, 0x1f, 0xb6, + 0xdb, 0xfa, 0xf4, 0x2f, 0xd0, 0x27, 0x9e, 0x27, 0x6f, 0xc2, 0x25, 0x33, + 0x6b, 0x8b, 0x1c, 0x1f, 0x3e, 0x0d, 0xdb, 0xb3, 0xe2, 0x63, 0xcd, 0x0e, + 0x6a, 0xf5, 0xb2, 0x3d, 0xb0, 0x5e, 0x5c, 0x66, 0x9d, 0xc0, 0x19, 0xd0, + 0xa1, 0x19, 0xae, 0xe7, 0x65, 0xcc, 0xbb, 0x2f, 0x9c, 0xc7, 0xfc, 0xfe, + 0x1e, 0x4d, 0x0f, 0xa9, 0x42, 0x59, 0x0d, 0xe2, 0x45, 0x6d, 0xa8, 0x03, + 0x63, 0x22, 0x1d, 0x7c, 0x38, 0x8f, 0xb5, 0x9c, 0x53, 0xc5, 0x85, 0xc0, + 0x6f, 0x71, 0x1f, 0xdf, 0xd7, 0xa9, 0x54, 0xbe, 0xd4, 0x4b, 0x95, 0x4b, + 0x0a, 0xf8, 0x02, 0x44, 0x17, 0x82, 0x7d, 0xd8, 0x17, 0x1c, 0x87, 0xdc, + 0xc4, 0x73, 0x0a, 0xc5, 0xce, 0x21, 0x87, 0xbc, 0xd0, 0x45, 0x1d, 0x17, + 0xfa, 0x49, 0xba, 0xa0, 0x73, 0x7e, 0xa8, 0x9d, 0x81, 0x0c, 0x8f, 0x50, + 0x9e, 0x9e, 0x73, 0x07, 0x39, 0xc7, 0xc3, 0x39, 0x5c, 0xe7, 0x25, 0x49, + 0x42, 0xf2, 0x2f, 0xbe, 0x68, 0xd1, 0x8b, 0x43, 0xc0, 0x2b, 0x8f, 0xf6, + 0x8f, 0x91, 0xc7, 0xbb, 0x23, 0xf7, 0x71, 0xcc, 0x96, 0xcd, 0x3e, 0xc8, + 0x16, 0x74, 0xe5, 0x1e, 0xf2, 0xef, 0x44, 0x5f, 0x1c, 0x62, 0x7a, 0x34, + 0xd0, 0x52, 0x87, 0xae, 0xf3, 0x3d, 0x57, 0x17, 0xd9, 0x32, 0xeb, 0x32, + 0xf2, 0xaa, 0x0b, 0x75, 0x9a, 0x6a, 0xe8, 0x90, 0x59, 0x1f, 0xf4, 0x02, + 0x32, 0x4b, 0x73, 0x3f, 0xef, 0x2d, 0x84, 0xfb, 0xde, 0xd1, 0xf7, 0x17, + 0xef, 0xad, 0xef, 0x3e, 0xd4, 0x9b, 0x8f, 0xc0, 0x67, 0xa3, 0x2e, 0x32, + 0xe0, 0xd3, 0x55, 0xe4, 0x72, 0x06, 0xbf, 0x07, 0x77, 0x95, 0x15, 0xe4, + 0x85, 0xfc, 0x5e, 0x6b, 0xdd, 0xcd, 0x77, 0x07, 0xf6, 0x7d, 0x06, 0x3c, + 0xba, 0x32, 0xf7, 0x00, 0x5d, 0x9d, 0x53, 0xe8, 0x5a, 0x43, 0xcf, 0x16, + 0xa8, 0x83, 0xaa, 0xc9, 0x34, 0x5d, 0x5f, 0x6a, 0xe7, 0x93, 0x22, 0xf4, + 0xc4, 0x22, 0xce, 0xcd, 0xaf, 0x2c, 0x55, 0x4b, 0x37, 0x76, 0xa7, 0x49, + 0x7e, 0x09, 0xb6, 0xfd, 0x92, 0xae, 0xd5, 0xc0, 0xe7, 0xba, 0xe1, 0xa2, + 0x56, 0xe3, 0x3a, 0x32, 0x05, 0xbb, 0xd3, 0x53, 0x2d, 0xca, 0x90, 0xb4, + 0xa0, 0xd0, 0xaf, 0x66, 0x74, 0x8d, 0x75, 0xee, 0xa2, 0x81, 0x7e, 0x37, + 0x7e, 0x7b, 0x3d, 0xd0, 0x43, 0xf4, 0xf5, 0xa3, 0xbe, 0xd5, 0xb3, 0x9a, + 0xd8, 0x4d, 0x6f, 0x43, 0x27, 0xca, 0x7e, 0xdf, 0x47, 0xf7, 0xbc, 0x1e, + 0xee, 0x59, 0x2d, 0x5d, 0xe1, 0x3a, 0x68, 0x86, 0x75, 0xbe, 0x17, 0xfe, + 0x03, 0xef, 0x6e, 0x07, 0x95, 0x27, 0x11, 0xa3, 0x66, 0x1e, 0xa5, 0xc2, + 0x90, 0x18, 0xd0, 0xed, 0xf3, 0x82, 0xfb, 0xf8, 0x7e, 0xb2, 0x76, 0x1f, + 0xdb, 0xb2, 0xb8, 0x0a, 0xbd, 0x3a, 0xc8, 0x7a, 0x80, 0xdc, 0x0e, 0x39, + 0x04, 0xfb, 0x4e, 0x09, 0x39, 0x44, 0xc1, 0x0d, 0x74, 0xa3, 0x75, 0x30, + 0x49, 0xc7, 0x5e, 0x62, 0x19, 0x61, 0x6c, 0x43, 0xef, 0x36, 0xee, 0xc4, + 0x31, 0x66, 0xd0, 0xf1, 0xef, 0xb7, 0x73, 0x4a, 0xb6, 0xbd, 0x34, 0xe4, + 0xa1, 0xa3, 0xf6, 0xe8, 0x53, 0x2b, 0xbe, 0x4f, 0x81, 0x4e, 0xa4, 0x02, + 0x19, 0xd4, 0x30, 0x36, 0xed, 0x4e, 0xc2, 0x27, 0xc6, 0xe8, 0xe6, 0xa4, + 0x05, 0x9d, 0x68, 0x01, 0x87, 0xc3, 0x71, 0xbe, 0x4b, 0xb8, 0x39, 0x59, + 0xc4, 0xfb, 0x61, 0x3f, 0xf7, 0x97, 0xf6, 0x40, 0x97, 0xdc, 0x07, 0xc2, + 0xfc, 0x9c, 0xcf, 0xd3, 0x84, 0xda, 0xac, 0x2e, 0x4c, 0xcf, 0x7a, 0x34, + 0x9a, 0xeb, 0x4b, 0x5d, 0xa5, 0x4e, 0xff, 0xce, 0xd8, 0xf7, 0x9b, 0xfe, + 0x9c, 0x5d, 0x18, 0xff, 0x00, 0x3a, 0x85, 0x27, 0xe2, 0xf5, 0xe9, 0x66, + 0x35, 0xd5, 0x41, 0xac, 0x53, 0x24, 0x2c, 0x18, 0xec, 0x3b, 0x04, 0xba, + 0xea, 0xdf, 0x47, 0x13, 0x15, 0x9d, 0xd7, 0x99, 0x6e, 0x61, 0xb1, 0xc5, + 0x6b, 0x58, 0xce, 0xbc, 0x46, 0xa2, 0x9b, 0x49, 0xd8, 0xe5, 0x9e, 0x3d, + 0x7e, 0xbd, 0xf8, 0xf8, 0x10, 0xe3, 0xda, 0x0d, 0x99, 0x42, 0xbf, 0x50, + 0xdb, 0x94, 0x83, 0xbe, 0x59, 0xae, 0x4d, 0xa7, 0xf9, 0xde, 0x23, 0xef, + 0xeb, 0x5a, 0xa8, 0x1f, 0x1f, 0xd7, 0xb5, 0xe7, 0xb0, 0xf6, 0x2d, 0xf6, + 0xab, 0x90, 0x75, 0xe0, 0x23, 0xbe, 0x41, 0x6f, 0xcd, 0x55, 0xb3, 0xfc, + 0xcd, 0xa3, 0x35, 0x21, 0xa0, 0x16, 0x3f, 0x4e, 0x6f, 0xcf, 0x3d, 0x4b, + 0xbf, 0x9c, 0x65, 0xdd, 0x31, 0x68, 0x14, 0xfa, 0x74, 0x94, 0xe4, 0xec, + 0x69, 0x1a, 0x50, 0xaf, 0xfb, 0xb5, 0x8d, 0x9e, 0xf3, 0x6b, 0x3a, 0x33, + 0x4b, 0xc5, 0xc6, 0x40, 0xea, 0x1a, 0xfa, 0xca, 0x93, 0xba, 0xb6, 0x8e, + 0xdc, 0xa3, 0xd0, 0xfc, 0x80, 0xef, 0x6c, 0xb2, 0x35, 0xd8, 0xde, 0x22, + 0x6a, 0x9b, 0xb7, 0x9d, 0xbb, 0xe9, 0x2c, 0xd7, 0x56, 0x81, 0xff, 0x5e, + 0x33, 0x50, 0x63, 0xac, 0xaa, 0xa1, 0x0e, 0x31, 0x70, 0x9d, 0xc1, 0xf1, + 0x07, 0x4f, 0x37, 0x06, 0x9f, 0xb2, 0x1f, 0x7c, 0x67, 0xd9, 0x42, 0xfe, + 0xab, 0xfc, 0x8d, 0x0a, 0xf2, 0x5f, 0x5d, 0xfe, 0x40, 0xeb, 0x65, 0x3f, + 0x6b, 0x80, 0x96, 0x41, 0x3a, 0x33, 0xcf, 0xf2, 0x47, 0xec, 0xf5, 0xed, + 0x34, 0x0d, 0xfe, 0x72, 0x7c, 0x19, 0xa4, 0x5f, 0x2d, 0x15, 0xfd, 0xfb, + 0x6b, 0x1b, 0xb9, 0xd6, 0x11, 0x67, 0x12, 0xf5, 0xfa, 0x77, 0x40, 0x2f, + 0xce, 0x1e, 0xda, 0x8d, 0xa7, 0x0a, 0x9b, 0xdc, 0x72, 0x9e, 0x23, 0x07, + 0x79, 0xce, 0xde, 0x2d, 0xe6, 0x39, 0x7b, 0xb7, 0x92, 0xe7, 0xc8, 0x9d, + 0xe0, 0xab, 0xd6, 0xbb, 0x65, 0xdc, 0xa4, 0x00, 0xb7, 0x03, 0x5b, 0xc4, + 0xed, 0xc0, 0x56, 0x70, 0x93, 0x3a, 0xcd, 0xbf, 0x40, 0x8c, 0x35, 0x10, + 0xdb, 0xe0, 0xd7, 0x86, 0xfa, 0x59, 0x7f, 0x80, 0xa3, 0x8f, 0xeb, 0xef, + 0x8b, 0xa7, 0x18, 0xe0, 0xf9, 0xd8, 0x16, 0xf1, 0x7c, 0x6c, 0x2b, 0x78, + 0x8a, 0x9d, 0x26, 0xe3, 0x28, 0xc3, 0xd7, 0x70, 0x6d, 0x83, 0xd8, 0x3c, + 0x24, 0x87, 0xba, 0x2e, 0x87, 0x75, 0x0e, 0x03, 0x7c, 0x50, 0xaf, 0x46, + 0x4b, 0x4c, 0xcb, 0x46, 0xdf, 0x9d, 0x3a, 0x4b, 0x32, 0x5b, 0xa5, 0x4a, + 0x83, 0xef, 0x95, 0xfb, 0xb0, 0x0f, 0xf7, 0xf1, 0x37, 0x2a, 0x8b, 0x64, + 0xc4, 0xf7, 0xe7, 0x9a, 0x77, 0xa7, 0xf5, 0x2a, 0x68, 0x9d, 0x0a, 0x69, + 0xad, 0xf8, 0xb9, 0xe0, 0xbe, 0x4d, 0xb9, 0x60, 0x40, 0xe3, 0x08, 0x68, + 0x2c, 0x86, 0x34, 0x3e, 0xdd, 0x60, 0xda, 0xf6, 0xf9, 0xb4, 0x2d, 0x6d, + 0xa2, 0x6d, 0xe4, 0x9e, 0xf9, 0x1f, 0xe3, 0x81, 0x5a, 0x1a, 0xb9, 0xd7, + 0x6b, 0x4d, 0xd4, 0xd2, 0x4d, 0xd4, 0xd2, 0xd0, 0xf7, 0x57, 0x9b, 0xa8, + 0xa5, 0x9b, 0xa8, 0xa5, 0x61, 0x07, 0xaf, 0xc0, 0x56, 0x82, 0x3b, 0xdc, + 0x12, 0x71, 0x0d, 0xee, 0xd7, 0xe3, 0x14, 0xe4, 0x39, 0x05, 0xc4, 0xf0, + 0xa3, 0xc8, 0xf1, 0xd8, 0x6e, 0x4f, 0x13, 0xc7, 0x04, 0x3d, 0x87, 0x9a, + 0x2f, 0x5b, 0x25, 0x33, 0x5e, 0x9c, 0x1f, 0x50, 0x97, 0x02, 0xfb, 0xd6, + 0x5a, 0xc4, 0x71, 0x70, 0x20, 0x85, 0x08, 0xa9, 0xb2, 0x5f, 0xb0, 0x73, + 0x4c, 0xe7, 0x76, 0xf0, 0x10, 0xbe, 0xdb, 0x60, 0x1f, 0xc6, 0xbe, 0xb4, + 0x4e, 0x0b, 0x8d, 0xf0, 0x1b, 0x9a, 0xcc, 0xfd, 0xfc, 0xce, 0x31, 0xb7, + 0xcf, 0xf7, 0x69, 0x76, 0xb6, 0x0f, 0x71, 0x80, 0xfb, 0x15, 0xf8, 0x35, + 0xe8, 0xca, 0x52, 0x1b, 0x17, 0x19, 0xeb, 0x55, 0xaa, 0xcf, 0x07, 0x31, + 0x7c, 0xca, 0xe0, 0x38, 0x87, 0xf8, 0xbe, 0xc4, 0xdf, 0xb0, 0x10, 0xeb, + 0x97, 0xae, 0x68, 0x32, 0x6a, 0xc7, 0x3a, 0x7f, 0xa3, 0x1d, 0xec, 0xc3, + 0xf9, 0x1d, 0xfe, 0x1d, 0xed, 0x51, 0xff, 0xae, 0xcd, 0xa0, 0x23, 0xad, + 0x80, 0x16, 0xdb, 0xc8, 0xd0, 0xc8, 0x2c, 0xdf, 0x35, 0x51, 0x8f, 0x68, + 0xca, 0x54, 0x75, 0xf8, 0x7e, 0x68, 0xe3, 0xbb, 0x49, 0x76, 0x91, 0xeb, + 0x4f, 0x23, 0xb8, 0xff, 0x3c, 0xed, 0xbc, 0xc9, 0xf7, 0x9f, 0xe1, 0x3a, + 0x8d, 0xde, 0x70, 0x33, 0x34, 0x8e, 0xf8, 0x5a, 0x6c, 0x68, 0xf0, 0x6f, + 0xbe, 0x3c, 0x39, 0xa7, 0xad, 0xc6, 0x42, 0x99, 0x8e, 0x84, 0x32, 0xad, + 0x34, 0xd6, 0x80, 0xdf, 0x0d, 0xef, 0x8f, 0x43, 0x99, 0xee, 0x3a, 0x47, + 0xda, 0xd5, 0x1c, 0xcb, 0x95, 0x65, 0x19, 0xc8, 0x75, 0x7c, 0xb1, 0x24, + 0x14, 0x21, 0xd3, 0x51, 0x5f, 0xa6, 0x32, 0xc7, 0x05, 0xec, 0x95, 0x83, + 0xfc, 0xd9, 0x8f, 0xe1, 0xe9, 0xb0, 0x8c, 0xb9, 0xde, 0xe0, 0x58, 0x98, + 0xa4, 0x4b, 0x9b, 0xe4, 0x5c, 0xbc, 0xa7, 0x0e, 0xe7, 0xa9, 0xff, 0x9c, + 0x16, 0xde, 0x9b, 0x66, 0x21, 0xc7, 0x76, 0x2e, 0xf6, 0x23, 0x81, 0x8c, + 0xf6, 0x9d, 0x6e, 0xbb, 0xef, 0xe5, 0x4d, 0x7d, 0xed, 0x67, 0x9b, 0x56, + 0xc4, 0xb7, 0x0d, 0xde, 0xf3, 0x1d, 0xe4, 0x9d, 0x7e, 0xc9, 0x1f, 0x53, + 0x31, 0xd6, 0x4b, 0x85, 0x25, 0x83, 0xac, 0x16, 0xcf, 0x91, 0x49, 0x34, + 0xda, 0x72, 0xea, 0xa4, 0xf5, 0x30, 0xc6, 0x2d, 0x34, 0x3c, 0xef, 0xa7, + 0xd0, 0x9d, 0x8b, 0x5c, 0x77, 0x3b, 0xbf, 0xf1, 0xd6, 0x93, 0xc8, 0x21, + 0x37, 0xce, 0xfc, 0xe6, 0xfd, 0xd4, 0xa5, 0xab, 0x88, 0x09, 0x74, 0xc6, + 0x09, 0x51, 0x22, 0x1e, 0xe7, 0x3e, 0xfe, 0x06, 0xef, 0x79, 0x17, 0x8d, + 0x3b, 0x78, 0x75, 0x99, 0xc7, 0x69, 0xdf, 0x39, 0xf6, 0xff, 0x3f, 0xd0, + 0x2e, 0x1a, 0xd6, 0x9e, 0x38, 0xf2, 0xe7, 0xeb, 0xc4, 0xb1, 0x4f, 0x4e, + 0x14, 0x9b, 0xba, 0x7a, 0x09, 0x6b, 0x8b, 0x8e, 0xc2, 0xdf, 0xd6, 0xf9, + 0xfb, 0xa8, 0x76, 0x89, 0xda, 0xf7, 0x65, 0x90, 0xa7, 0xa3, 0xf2, 0x77, + 0x52, 0xb5, 0x8a, 0xd8, 0x52, 0x70, 0x92, 0x98, 0xaf, 0x62, 0x2e, 0xc7, + 0x05, 0x8f, 0x14, 0xd8, 0x50, 0xc1, 0x49, 0x27, 0xc6, 0x9a, 0x9e, 0xa7, + 0x7c, 0x5e, 0xa0, 0x87, 0x32, 0x29, 0x1a, 0x73, 0xf8, 0xfe, 0xf7, 0x9b, + 0xf4, 0x36, 0xec, 0xac, 0x78, 0x9e, 0x6b, 0x26, 0xf6, 0x29, 0x78, 0x77, + 0xf8, 0xbe, 0xea, 0x14, 0x3d, 0xb4, 0x47, 0xcf, 0x5e, 0x22, 0xe0, 0xb3, + 0x42, 0xfd, 0x48, 0x72, 0x53, 0xc7, 0xfd, 0xef, 0x6d, 0x8c, 0x6b, 0x9a, + 0x96, 0xc0, 0x1b, 0xa7, 0x99, 0xa4, 0x95, 0x66, 0x8a, 0x56, 0xa1, 0x1f, + 0xdb, 0xcc, 0x32, 0x7d, 0x03, 0x78, 0x2b, 0x66, 0x95, 0x94, 0x8c, 0xb5, + 0xaf, 0x0b, 0x78, 0x67, 0x05, 0x3d, 0x15, 0x17, 0x18, 0x77, 0x5d, 0x2d, + 0x03, 0x6f, 0xd6, 0xd1, 0x51, 0xa7, 0x9b, 0x8e, 0x61, 0xed, 0x7e, 0xe4, + 0x1f, 0xdf, 0x72, 0xa8, 0x2c, 0x99, 0x29, 0x3a, 0x80, 0xf3, 0x8e, 0x36, + 0x38, 0x57, 0x3b, 0x02, 0x5f, 0x23, 0xd0, 0xa3, 0x19, 0x8f, 0x1e, 0xdd, + 0xa3, 0x5b, 0x71, 0x01, 0x7b, 0xae, 0xb0, 0x9e, 0xa0, 0xdf, 0x09, 0xce, + 0x8d, 0xad, 0xf8, 0xba, 0x08, 0x7f, 0xfa, 0x0c, 0x65, 0xce, 0xad, 0xe5, + 0xa6, 0x90, 0x9f, 0x8f, 0x36, 0xe9, 0x8b, 0x31, 0x9c, 0xf7, 0x36, 0xf8, + 0x34, 0xea, 0xc8, 0x02, 0xf3, 0xe9, 0x58, 0xc0, 0x27, 0x8c, 0xf1, 0xb7, + 0x23, 0xce, 0xd1, 0xf8, 0xec, 0x13, 0x74, 0xb6, 0xc1, 0x77, 0xdd, 0x27, + 0xe8, 0x4a, 0xe3, 0x11, 0xba, 0x98, 0xe3, 0x5c, 0x07, 0xfb, 0xf8, 0x67, + 0xa0, 0xcf, 0x3f, 0xa3, 0x9b, 0x8e, 0xfb, 0x72, 0xfa, 0x3f, 0xc3, 0x06, + 0xd0, 0x70, 0x4c, 0x57, 0x00, 0x00, 0x00 }; +static u32 bnx2_TXP_b06FwData[(0x0/4) + 1] = { 0x0 }; +static u32 bnx2_TXP_b06FwRodata[(0x0/4) + 1] = { 0x0 }; +static u32 bnx2_TXP_b06FwBss[(0x1c4/4) + 1] = { 0x0 }; +static u32 bnx2_TXP_b06FwSbss[(0x38/4) + 1] = { 0x0 }; diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 8171cae06..61bd17923 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -33,7 +33,6 @@ //#define BONDING_DEBUG 1 -#include #include #include #include @@ -4533,6 +4532,8 @@ static int bond_check_params(struct bond_params *params) return 0; } +static struct lock_class_key bonding_netdev_xmit_lock_key; + /* 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. @@ -4568,6 +4569,9 @@ int bond_create(char *name, struct bond_params *params, struct bonding **newbond if (res < 0) { goto out_bond; } + + lockdep_set_class(&bond_dev->_xmit_lock, &bonding_netdev_xmit_lock_key); + if (newbond) *newbond = bond_dev->priv; diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c index 5a9bd9588..cfe4dc3a9 100644 --- a/drivers/net/bonding/bond_sysfs.c +++ b/drivers/net/bonding/bond_sysfs.c @@ -20,7 +20,6 @@ * file called LICENSE. * */ -#include #include #include #include diff --git a/drivers/net/cassini.c b/drivers/net/cassini.c index ac48f7543..a31544ccb 100644 --- a/drivers/net/cassini.c +++ b/drivers/net/cassini.c @@ -66,7 +66,6 @@ * by default, the selective clear mask is set up to process rx packets. */ -#include #include #include @@ -2915,8 +2914,7 @@ static int cas_start_xmit(struct sk_buff *skb, struct net_device *dev) */ static int ring; - skb = skb_padto(skb, cp->min_frame_size); - if (!skb) + if (skb_padto(skb, cp->min_frame_size)) return 0; /* XXX: we need some higher-level QoS hooks to steer packets to @@ -4351,7 +4349,7 @@ static int cas_open(struct net_device *dev) * mapping to expose them */ if (request_irq(cp->pdev->irq, cas_interrupt, - SA_SHIRQ, dev->name, (void *) dev)) { + IRQF_SHARED, dev->name, (void *) dev)) { printk(KERN_ERR "%s: failed to request irq !\n", cp->dev->name); err = -EAGAIN; @@ -4877,7 +4875,7 @@ static int __devinit cas_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) { static int cas_version_printed = 0; - unsigned long casreg_base, casreg_len; + unsigned long casreg_len; struct net_device *dev; struct cas *cp; int i, err, pci_using_dac; @@ -4889,13 +4887,12 @@ static int __devinit cas_init_one(struct pci_dev *pdev, err = pci_enable_device(pdev); if (err) { - printk(KERN_ERR PFX "Cannot enable PCI device, " - "aborting.\n"); + dev_err(&pdev->dev, "Cannot enable PCI device, aborting.\n"); return err; } if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) { - printk(KERN_ERR PFX "Cannot find proper PCI device " + dev_err(&pdev->dev, "Cannot find proper PCI device " "base address, aborting.\n"); err = -ENODEV; goto err_out_disable_pdev; @@ -4903,7 +4900,7 @@ static int __devinit cas_init_one(struct pci_dev *pdev, dev = alloc_etherdev(sizeof(*cp)); if (!dev) { - printk(KERN_ERR PFX "Etherdev alloc failed, aborting.\n"); + dev_err(&pdev->dev, "Etherdev alloc failed, aborting.\n"); err = -ENOMEM; goto err_out_disable_pdev; } @@ -4912,8 +4909,7 @@ static int __devinit cas_init_one(struct pci_dev *pdev, err = pci_request_regions(pdev, dev->name); if (err) { - printk(KERN_ERR PFX "Cannot obtain PCI resources, " - "aborting.\n"); + dev_err(&pdev->dev, "Cannot obtain PCI resources, aborting.\n"); goto err_out_free_netdev; } pci_set_master(pdev); @@ -4943,7 +4939,7 @@ static int __devinit cas_init_one(struct pci_dev *pdev, if (pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, cas_cacheline_size)) { - printk(KERN_ERR PFX "Could not set PCI cache " + dev_err(&pdev->dev, "Could not set PCI cache " "line size\n"); goto err_write_cacheline; } @@ -4957,7 +4953,7 @@ static int __devinit cas_init_one(struct pci_dev *pdev, err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK); if (err < 0) { - printk(KERN_ERR PFX "Unable to obtain 64-bit DMA " + dev_err(&pdev->dev, "Unable to obtain 64-bit DMA " "for consistent allocations\n"); goto err_out_free_res; } @@ -4965,14 +4961,13 @@ static int __devinit cas_init_one(struct pci_dev *pdev, } else { err = pci_set_dma_mask(pdev, DMA_32BIT_MASK); if (err) { - printk(KERN_ERR PFX "No usable DMA configuration, " + dev_err(&pdev->dev, "No usable DMA configuration, " "aborting.\n"); goto err_out_free_res; } pci_using_dac = 0; } - casreg_base = pci_resource_start(pdev, 0); casreg_len = pci_resource_len(pdev, 0); cp = netdev_priv(dev); @@ -5024,10 +5019,9 @@ static int __devinit cas_init_one(struct pci_dev *pdev, cp->timer_ticks = 0; /* give us access to cassini registers */ - cp->regs = ioremap(casreg_base, casreg_len); + cp->regs = pci_iomap(pdev, 0, casreg_len); if (cp->regs == 0UL) { - printk(KERN_ERR PFX "Cannot map device registers, " - "aborting.\n"); + dev_err(&pdev->dev, "Cannot map device registers, aborting.\n"); goto err_out_free_res; } cp->casreg_len = casreg_len; @@ -5043,8 +5037,7 @@ static int __devinit cas_init_one(struct pci_dev *pdev, pci_alloc_consistent(pdev, sizeof(struct cas_init_block), &cp->block_dvma); if (!cp->init_block) { - printk(KERN_ERR PFX "Cannot allocate init block, " - "aborting.\n"); + dev_err(&pdev->dev, "Cannot allocate init block, aborting.\n"); goto err_out_iounmap; } @@ -5088,8 +5081,7 @@ static int __devinit cas_init_one(struct pci_dev *pdev, dev->features |= NETIF_F_HIGHDMA; if (register_netdev(dev)) { - printk(KERN_ERR PFX "Cannot register net device, " - "aborting.\n"); + dev_err(&pdev->dev, "Cannot register net device, aborting.\n"); goto err_out_free_consistent; } @@ -5123,7 +5115,7 @@ err_out_iounmap: cas_shutdown(cp); mutex_unlock(&cp->pm_mutex); - iounmap(cp->regs); + pci_iounmap(pdev, cp->regs); err_out_free_res: @@ -5171,7 +5163,7 @@ static void __devexit cas_remove_one(struct pci_dev *pdev) #endif pci_free_consistent(pdev, sizeof(struct cas_init_block), cp->init_block, cp->block_dvma); - iounmap(cp->regs); + pci_iounmap(pdev, cp->regs); free_netdev(dev); pci_release_regions(pdev); pci_disable_device(pdev); diff --git a/drivers/net/chelsio/common.h b/drivers/net/chelsio/common.h index bf3e7b6a7..5d9dd1442 100644 --- a/drivers/net/chelsio/common.h +++ b/drivers/net/chelsio/common.h @@ -39,7 +39,6 @@ #ifndef _CXGB_COMMON_H_ #define _CXGB_COMMON_H_ -#include #include #include #include diff --git a/drivers/net/chelsio/cxgb2.c b/drivers/net/chelsio/cxgb2.c index 7fe2638ae..e67872433 100644 --- a/drivers/net/chelsio/cxgb2.c +++ b/drivers/net/chelsio/cxgb2.c @@ -37,7 +37,6 @@ ****************************************************************************/ #include "common.h" -#include #include #include #include @@ -219,7 +218,7 @@ static int cxgb_up(struct adapter *adapter) t1_interrupts_clear(adapter); if ((err = request_irq(adapter->pdev->irq, - t1_select_intr_handler(adapter), SA_SHIRQ, + t1_select_intr_handler(adapter), IRQF_SHARED, adapter->name, adapter))) { goto out_err; } diff --git a/drivers/net/chelsio/sge.c b/drivers/net/chelsio/sge.c index 722be62f3..61b3754f5 100644 --- a/drivers/net/chelsio/sge.c +++ b/drivers/net/chelsio/sge.c @@ -39,7 +39,6 @@ #include "common.h" -#include #include #include #include diff --git a/drivers/net/cris/eth_v10.c b/drivers/net/cris/eth_v10.c index 64105e4ea..0eb1f8787 100644 --- a/drivers/net/cris/eth_v10.c +++ b/drivers/net/cris/eth_v10.c @@ -218,7 +218,6 @@ * */ -#include #include @@ -672,7 +671,7 @@ e100_open(struct net_device *dev) /* allocate the irq corresponding to the receiving DMA */ if (request_irq(NETWORK_DMA_RX_IRQ_NBR, e100rxtx_interrupt, - SA_SAMPLE_RANDOM, cardname, (void *)dev)) { + IRQF_SAMPLE_RANDOM, cardname, (void *)dev)) { goto grace_exit0; } diff --git a/drivers/net/cs89x0.c b/drivers/net/cs89x0.c index ef54ebeb2..2dcca79b1 100644 --- a/drivers/net/cs89x0.c +++ b/drivers/net/cs89x0.c @@ -100,7 +100,6 @@ /* Always include 'config.h' first in case the user wants to turn on or override something. */ -#include #include /* @@ -1906,8 +1905,7 @@ MODULE_LICENSE("GPL"); */ -int -init_module(void) +int __init init_module(void) { struct net_device *dev = alloc_etherdev(sizeof(struct net_local)); struct net_local *lp; diff --git a/drivers/net/cs89x0.h b/drivers/net/cs89x0.h index bd954aaa6..968fe11a0 100644 --- a/drivers/net/cs89x0.h +++ b/drivers/net/cs89x0.h @@ -14,7 +14,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #define PP_ChipID 0x0000 /* offset 0h -> Corp -ID */ /* offset 2h -> Model/Product Number */ diff --git a/drivers/net/declance.c b/drivers/net/declance.c index f130bdab3..6ad579612 100644 --- a/drivers/net/declance.c +++ b/drivers/net/declance.c @@ -42,7 +42,6 @@ * bits. macro */ -#include #include #include #include @@ -704,8 +703,8 @@ static irqreturn_t lance_dma_merr_int(const int irq, void *dev_id, return IRQ_HANDLED; } -static irqreturn_t -lance_interrupt(const int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t lance_interrupt(const int irq, void *dev_id, + struct pt_regs *regs) { struct net_device *dev = (struct net_device *) dev_id; struct lance_private *lp = netdev_priv(dev); @@ -885,8 +884,7 @@ static int lance_start_xmit(struct sk_buff *skb, struct net_device *dev) len = skblen; if (len < ETH_ZLEN) { - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) + if (skb_padto(skb, ETH_ZLEN)) return 0; len = ETH_ZLEN; } @@ -1255,7 +1253,7 @@ static int __init dec_lance_init(const int type, const int slot) return 0; err_out_free_dev: - kfree(dev); + free_netdev(dev); err_out: return ret; @@ -1301,6 +1299,7 @@ static void __exit dec_lance_cleanup(void) while (root_lance_dev) { struct net_device *dev = root_lance_dev; struct lance_private *lp = netdev_priv(dev); + unregister_netdev(dev); #ifdef CONFIG_TC if (lp->slot >= 0) diff --git a/drivers/net/defxx.c b/drivers/net/defxx.c index 5acd35c31..91cc8cbdd 100644 --- a/drivers/net/defxx.c +++ b/drivers/net/defxx.c @@ -1228,7 +1228,7 @@ static int dfx_open(struct net_device *dev) /* Register IRQ - support shared interrupts by passing device ptr */ - ret = request_irq(dev->irq, dfx_interrupt, SA_SHIRQ, dev->name, dev); + ret = request_irq(dev->irq, dfx_interrupt, IRQF_SHARED, dev->name, dev); if (ret) { printk(KERN_ERR "%s: Requested IRQ %d is busy\n", dev->name, dev->irq); return ret; diff --git a/drivers/net/depca.c b/drivers/net/depca.c index 0941d40f0..b1cbe9924 100644 --- a/drivers/net/depca.c +++ b/drivers/net/depca.c @@ -235,7 +235,6 @@ ========================================================================= */ -#include #include #include #include @@ -938,11 +937,8 @@ static int depca_start_xmit(struct sk_buff *skb, struct net_device *dev) if (skb->len < 1) goto out; - if (skb->len < ETH_ZLEN) { - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) - goto out; - } + if (skb_padto(skb, ETH_ZLEN)) + goto out; netif_stop_queue(dev); diff --git a/drivers/net/dgrs.c b/drivers/net/dgrs.c index e175d4876..fa4f09432 100644 --- a/drivers/net/dgrs.c +++ b/drivers/net/dgrs.c @@ -1191,7 +1191,7 @@ dgrs_probe1(struct net_device *dev) if (priv->plxreg) OUTL(dev->base_addr + PLX_LCL2PCI_DOORBELL, 1); - rc = request_irq(dev->irq, &dgrs_intr, SA_SHIRQ, "RightSwitch", dev); + rc = request_irq(dev->irq, &dgrs_intr, IRQF_SHARED, "RightSwitch", dev); if (rc) goto err_out; diff --git a/drivers/net/dl2k.c b/drivers/net/dl2k.c index 038447fb5..402961e68 100644 --- a/drivers/net/dl2k.c +++ b/drivers/net/dl2k.c @@ -9,49 +9,10 @@ the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ -/* - Rev Date Description - ========================================================================== - 0.01 2001/05/03 Created DL2000-based linux driver - 0.02 2001/05/21 Added VLAN and hardware checksum support. - 1.00 2001/06/26 Added jumbo frame support. - 1.01 2001/08/21 Added two parameters, rx_coalesce and rx_timeout. - 1.02 2001/10/08 Supported fiber media. - Added flow control parameters. - 1.03 2001/10/12 Changed the default media to 1000mbps_fd for - the fiber devices. - 1.04 2001/11/08 Fixed Tx stopped when tx very busy. - 1.05 2001/11/22 Fixed Tx stopped when unidirectional tx busy. - 1.06 2001/12/13 Fixed disconnect bug at 10Mbps mode. - Fixed tx_full flag incorrect. - Added tx_coalesce paramter. - 1.07 2002/01/03 Fixed miscount of RX frame error. - 1.08 2002/01/17 Fixed the multicast bug. - 1.09 2002/03/07 Move rx-poll-now to re-fill loop. - Added rio_timer() to watch rx buffers. - 1.10 2002/04/16 Fixed miscount of carrier error. - 1.11 2002/05/23 Added ISR schedule scheme - Fixed miscount of rx frame error for DGE-550SX. - Fixed VLAN bug. - 1.12 2002/06/13 Lock tx_coalesce=1 on 10/100Mbps mode. - 1.13 2002/08/13 1. Fix disconnection (many tx:carrier/rx:frame - errs) with some mainboards. - 2. Use definition "DRV_NAME" "DRV_VERSION" - "DRV_RELDATE" for flexibility. - 1.14 2002/08/14 Support ethtool. - 1.15 2002/08/27 Changed the default media to Auto-Negotiation - for the fiber devices. - 1.16 2002/09/04 More power down time for fiber devices auto- - negotiation. - Fix disconnect bug after ifup and ifdown. - 1.17 2002/10/03 Fix RMON statistics overflow. - Always use I/O mapping to access eeprom, - avoid system freezing with some chipsets. -*/ #define DRV_NAME "D-Link DL2000-based linux driver" -#define DRV_VERSION "v1.17b" -#define DRV_RELDATE "2006/03/10" +#define DRV_VERSION "v1.18" +#define DRV_RELDATE "2006/06/27" #include "dl2k.h" #include @@ -390,7 +351,7 @@ parse_eeprom (struct net_device *dev) for (i = 0; i < 6; i++) dev->dev_addr[i] = psrom->mac_addr[i]; - /* Parse Software Infomation Block */ + /* Parse Software Information Block */ i = 0x30; psib = (u8 *) sromdata; do { @@ -440,7 +401,7 @@ rio_open (struct net_device *dev) int i; u16 macctrl; - i = request_irq (dev->irq, &rio_interrupt, SA_SHIRQ, dev->name, dev); + i = request_irq (dev->irq, &rio_interrupt, IRQF_SHARED, dev->name, dev); if (i) return i; diff --git a/drivers/net/dl2k.h b/drivers/net/dl2k.h index 6e75482d7..53449207e 100644 --- a/drivers/net/dl2k.h +++ b/drivers/net/dl2k.h @@ -683,11 +683,6 @@ struct netdev_private { }; /* The station address location in the EEPROM. */ -#ifdef MEM_MAPPING -#define PCI_IOTYPE (PCI_USES_MASTER | PCI_USES_MEM | PCI_ADDR1) -#else -#define PCI_IOTYPE (PCI_USES_MASTER | PCI_USES_IO | PCI_ADDR0) -#endif /* The struct pci_device_id consist of: vendor, device Vendor and device ID to match (or PCI_ANY_ID) subvendor, subdevice Subsystem vendor and device ID to match (or PCI_ANY_ID) @@ -695,9 +690,10 @@ struct netdev_private { class_mask of the class are honored during the comparison. driver_data Data private to the driver. */ -static struct pci_device_id rio_pci_tbl[] = { - {0x1186, 0x4000, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, - {0,} + +static const struct pci_device_id rio_pci_tbl[] = { + {0x1186, 0x4000, PCI_ANY_ID, PCI_ANY_ID, }, + { } }; MODULE_DEVICE_TABLE (pci, rio_pci_tbl); #define TX_TIMEOUT (4*HZ) diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c index 24996da4c..a860ebbbf 100644 --- a/drivers/net/dm9000.c +++ b/drivers/net/dm9000.c @@ -339,6 +339,17 @@ static void dm9000_timeout(struct net_device *dev) spin_unlock_irqrestore(&db->lock,flags); } +#ifdef CONFIG_NET_POLL_CONTROLLER +/* + *Used by netconsole + */ +static void dm9000_poll_controller(struct net_device *dev) +{ + disable_irq(dev->irq); + dm9000_interrupt(dev->irq,dev,NULL); + enable_irq(dev->irq); +} +#endif /* dm9000_release_board * @@ -366,8 +377,8 @@ dm9000_release_board(struct platform_device *pdev, struct board_info *db) kfree(db->data_req); } - if (db->addr_res != NULL) { - release_resource(db->addr_res); + if (db->addr_req != NULL) { + release_resource(db->addr_req); kfree(db->addr_req); } } @@ -410,10 +421,7 @@ dm9000_probe(struct platform_device *pdev) if (pdev->num_resources < 2) { ret = -ENODEV; goto out; - } - - switch (pdev->num_resources) { - case 2: + } else if (pdev->num_resources == 2) { base = pdev->resource[0].start; if (!request_mem_region(base, 4, ndev->name)) { @@ -423,17 +431,16 @@ dm9000_probe(struct platform_device *pdev) ndev->base_addr = base; ndev->irq = pdev->resource[1].start; - db->io_addr = (void *)base; - db->io_data = (void *)(base + 4); - - break; + db->io_addr = (void __iomem *)base; + db->io_data = (void __iomem *)(base + 4); - case 3: + } else { db->addr_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); db->data_res = platform_get_resource(pdev, IORESOURCE_MEM, 1); db->irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); - if (db->addr_res == NULL || db->data_res == NULL) { + if (db->addr_res == NULL || db->data_res == NULL || + db->irq_res == NULL) { printk(KERN_ERR PFX "insufficient resources\n"); ret = -ENOENT; goto out; @@ -482,7 +489,6 @@ dm9000_probe(struct platform_device *pdev) /* ensure at least we have a default set of IO routines */ dm9000_set_io(db, iosize); - } /* check to see if anything is being over-ridden */ @@ -543,6 +549,9 @@ dm9000_probe(struct platform_device *pdev) ndev->stop = &dm9000_stop; ndev->get_stats = &dm9000_get_stats; ndev->set_multicast_list = &dm9000_hash_table; +#ifdef CONFIG_NET_POLL_CONTROLLER + ndev->poll_controller = &dm9000_poll_controller; +#endif #ifdef DM9000_PROGRAM_EEPROM program_eeprom(db); @@ -564,6 +573,13 @@ dm9000_probe(struct platform_device *pdev) for (i = 0; i < 6; i++) ndev->dev_addr[i] = db->srom[i]; + if (!is_valid_ether_addr(ndev->dev_addr)) { + /* try reading from mac */ + + for (i = 0; i < 6; i++) + ndev->dev_addr[i] = ior(db, i+DM9000_PAR); + } + if (!is_valid_ether_addr(ndev->dev_addr)) printk("%s: Invalid ethernet MAC address. Please " "set using ifconfig\n", ndev->name); @@ -601,7 +617,7 @@ dm9000_open(struct net_device *dev) PRINTK2("entering dm9000_open\n"); - if (request_irq(dev->irq, &dm9000_interrupt, SA_SHIRQ, dev->name, dev)) + if (request_irq(dev->irq, &dm9000_interrupt, IRQF_SHARED, dev->name, dev)) return -EAGAIN; /* Initialize DM9000 board */ @@ -663,7 +679,6 @@ dm9000_init_dm9000(struct net_device *dev) db->tx_pkt_cnt = 0; db->queue_pkt_len = 0; dev->trans_start = 0; - spin_lock_init(&db->lock); } /* @@ -767,7 +782,7 @@ dm9000_stop(struct net_device *ndev) * receive the packet to upper layer, free the transmitted packet */ -void +static void dm9000_tx_done(struct net_device *dev, board_info_t * db) { int tx_status = ior(db, DM9000_NSR); /* Got TX status */ @@ -1187,13 +1202,14 @@ dm9000_drv_remove(struct platform_device *pdev) } static struct platform_driver dm9000_driver = { + .driver = { + .name = "dm9000", + .owner = THIS_MODULE, + }, .probe = dm9000_probe, .remove = dm9000_drv_remove, .suspend = dm9000_drv_suspend, .resume = dm9000_drv_resume, - .driver = { - .name = "dm9000", - }, }; static int __init diff --git a/drivers/net/dummy.c b/drivers/net/dummy.c index dd8c15ac5..2146cf744 100644 --- a/drivers/net/dummy.c +++ b/drivers/net/dummy.c @@ -28,7 +28,6 @@ Alan Cox, 30th May 1994 */ -#include #include #include #include @@ -133,6 +132,7 @@ static int __init dummy_init_module(void) for (i = 0; i < numdummies && !err; i++) err = dummy_init_one(i); if (err) { + i--; while (--i >= 0) dummy_free_one(i); } diff --git a/drivers/net/e100.c b/drivers/net/e100.c index 31ac001f5..ce850f107 100644 --- a/drivers/net/e100.c +++ b/drivers/net/e100.c @@ -138,7 +138,6 @@ * - Stratus87247: protect MDI control register manipulations */ -#include #include #include #include @@ -174,8 +173,11 @@ MODULE_LICENSE("GPL"); MODULE_VERSION(DRV_VERSION); static int debug = 3; +static int eeprom_bad_csum_allow = 0; module_param(debug, int, 0); +module_param(eeprom_bad_csum_allow, int, 0); MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)"); +MODULE_PARM_DESC(eeprom_bad_csum_allow, "Allow bad eeprom checksums"); #define DPRINTK(nlevel, klevel, fmt, args...) \ (void)((NETIF_MSG_##nlevel & nic->msg_enable) && \ printk(KERN_##klevel PFX "%s: %s: " fmt, nic->netdev->name, \ @@ -757,7 +759,8 @@ static int e100_eeprom_load(struct nic *nic) checksum = le16_to_cpu(0xBABA - checksum); if(checksum != nic->eeprom[nic->eeprom_wc - 1]) { DPRINTK(PROBE, ERR, "EEPROM corrupted\n"); - return -EAGAIN; + if (!eeprom_bad_csum_allow) + return -EAGAIN; } return 0; @@ -2064,7 +2067,7 @@ static int e100_up(struct nic *nic) e100_set_multicast_list(nic->netdev); e100_start_receiver(nic, NULL); mod_timer(&nic->watchdog, jiffies); - if((err = request_irq(nic->pdev->irq, e100_intr, SA_SHIRQ, + if((err = request_irq(nic->pdev->irq, e100_intr, IRQF_SHARED, nic->netdev->name, nic->netdev))) goto err_no_irq; netif_wake_queue(nic->netdev); @@ -2678,9 +2681,9 @@ static int __devinit e100_probe(struct pci_dev *pdev, goto err_out_free; } - DPRINTK(PROBE, INFO, "addr 0x%lx, irq %d, " + DPRINTK(PROBE, INFO, "addr 0x%llx, irq %d, " "MAC addr %02X:%02X:%02X:%02X:%02X:%02X\n", - pci_resource_start(pdev, 0), pdev->irq, + (unsigned long long)pci_resource_start(pdev, 0), pdev->irq, netdev->dev_addr[0], netdev->dev_addr[1], netdev->dev_addr[2], netdev->dev_addr[3], netdev->dev_addr[4], netdev->dev_addr[5]); @@ -2780,6 +2783,80 @@ static void e100_shutdown(struct pci_dev *pdev) DPRINTK(PROBE,ERR, "Error enabling wake\n"); } +/* ------------------ PCI Error Recovery infrastructure -------------- */ +/** + * e100_io_error_detected - called when PCI error is detected. + * @pdev: Pointer to PCI device + * @state: The current pci conneection state + */ +static pci_ers_result_t e100_io_error_detected(struct pci_dev *pdev, pci_channel_state_t state) +{ + struct net_device *netdev = pci_get_drvdata(pdev); + + /* Similar to calling e100_down(), but avoids adpater I/O. */ + netdev->stop(netdev); + + /* Detach; put netif into state similar to hotplug unplug. */ + netif_poll_enable(netdev); + netif_device_detach(netdev); + + /* Request a slot reset. */ + return PCI_ERS_RESULT_NEED_RESET; +} + +/** + * e100_io_slot_reset - called after the pci bus has been reset. + * @pdev: Pointer to PCI device + * + * Restart the card from scratch. + */ +static pci_ers_result_t e100_io_slot_reset(struct pci_dev *pdev) +{ + struct net_device *netdev = pci_get_drvdata(pdev); + struct nic *nic = netdev_priv(netdev); + + if (pci_enable_device(pdev)) { + printk(KERN_ERR "e100: Cannot re-enable PCI device after reset.\n"); + return PCI_ERS_RESULT_DISCONNECT; + } + pci_set_master(pdev); + + /* Only one device per card can do a reset */ + if (0 != PCI_FUNC(pdev->devfn)) + return PCI_ERS_RESULT_RECOVERED; + e100_hw_reset(nic); + e100_phy_init(nic); + + return PCI_ERS_RESULT_RECOVERED; +} + +/** + * e100_io_resume - resume normal operations + * @pdev: Pointer to PCI device + * + * Resume normal operations after an error recovery + * sequence has been completed. + */ +static void e100_io_resume(struct pci_dev *pdev) +{ + struct net_device *netdev = pci_get_drvdata(pdev); + struct nic *nic = netdev_priv(netdev); + + /* ack any pending wake events, disable PME */ + pci_enable_wake(pdev, 0, 0); + + netif_device_attach(netdev); + if (netif_running(netdev)) { + e100_open(netdev); + mod_timer(&nic->watchdog, jiffies); + } +} + +static struct pci_error_handlers e100_err_handler = { + .error_detected = e100_io_error_detected, + .slot_reset = e100_io_slot_reset, + .resume = e100_io_resume, +}; static struct pci_driver e100_driver = { .name = DRV_NAME, @@ -2791,6 +2868,7 @@ static struct pci_driver e100_driver = { .resume = e100_resume, #endif .shutdown = e100_shutdown, + .err_handler = &e100_err_handler, }; static int __init e100_init_module(void) diff --git a/drivers/net/e1000/Makefile b/drivers/net/e1000/Makefile index ca9f89552..5dea2b7de 100644 --- a/drivers/net/e1000/Makefile +++ b/drivers/net/e1000/Makefile @@ -1,7 +1,7 @@ ################################################################################ # # -# Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved. +# Copyright(c) 1999 - 2006 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 @@ -22,6 +22,7 @@ # # Contact Information: # Linux NICS +# e1000-devel Mailing List # Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 # ################################################################################ diff --git a/drivers/net/e1000/e1000.h b/drivers/net/e1000/e1000.h index 281de41d0..d304297c4 100644 --- a/drivers/net/e1000/e1000.h +++ b/drivers/net/e1000/e1000.h @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2006 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 @@ -22,6 +22,7 @@ Contact Information: Linux NICS + e1000-devel Mailing List Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 *******************************************************************************/ @@ -33,7 +34,6 @@ #define _E1000_H_ #include -#include #include #include #include @@ -68,7 +68,6 @@ #ifdef NETIF_F_TSO #include #endif -#include #include #include #include @@ -111,9 +110,14 @@ struct e1000_adapter; #define E1000_MIN_RXD 80 #define E1000_MAX_82544_RXD 4096 +/* this is the size past which hardware will drop packets when setting LPE=0 */ +#define MAXIMUM_ETHERNET_VLAN_SIZE 1522 + /* Supported Rx Buffer Sizes */ #define E1000_RXBUFFER_128 128 /* Used for packet split */ #define E1000_RXBUFFER_256 256 /* Used for packet split */ +#define E1000_RXBUFFER_512 512 +#define E1000_RXBUFFER_1024 1024 #define E1000_RXBUFFER_2048 2048 #define E1000_RXBUFFER_4096 4096 #define E1000_RXBUFFER_8192 8192 @@ -141,6 +145,7 @@ struct e1000_adapter; #define AUTO_ALL_MODES 0 #define E1000_EEPROM_82544_APM 0x0004 +#define E1000_EEPROM_ICH8_APME 0x0004 #define E1000_EEPROM_APME 0x0400 #ifndef E1000_MASTER_SLAVE @@ -252,7 +257,6 @@ struct e1000_adapter { spinlock_t tx_queue_lock; #endif atomic_t irq_sem; - struct work_struct watchdog_task; struct work_struct reset_task; uint8_t fc_autoneg; @@ -334,12 +338,17 @@ struct e1000_adapter { boolean_t have_msi; #endif /* to not mess up cache alignment, always add to the bottom */ - boolean_t txb2b; #ifdef NETIF_F_TSO boolean_t tso_force; #endif + boolean_t smart_power_down; /* phy smart power down */ + unsigned long flags; }; +enum e1000_state_t { + __E1000_DRIVER_TESTING, + __E1000_RESETTING, +}; /* e1000_main.c */ extern char e1000_driver_name[]; @@ -347,6 +356,7 @@ extern char e1000_driver_version[]; int e1000_up(struct e1000_adapter *adapter); void e1000_down(struct e1000_adapter *adapter); void e1000_reset(struct e1000_adapter *adapter); +void e1000_reinit_locked(struct e1000_adapter *adapter); int e1000_setup_all_tx_resources(struct e1000_adapter *adapter); void e1000_free_all_tx_resources(struct e1000_adapter *adapter); int e1000_setup_all_rx_resources(struct e1000_adapter *adapter); diff --git a/drivers/net/e1000/e1000_ethtool.c b/drivers/net/e1000/e1000_ethtool.c index d1c705b41..88a82ba88 100644 --- a/drivers/net/e1000/e1000_ethtool.c +++ b/drivers/net/e1000/e1000_ethtool.c @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2006 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 @@ -22,6 +22,7 @@ Contact Information: Linux NICS + e1000-devel Mailing List Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 *******************************************************************************/ @@ -108,7 +109,8 @@ e1000_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) SUPPORTED_1000baseT_Full| SUPPORTED_Autoneg | SUPPORTED_TP); - + if (hw->phy_type == e1000_phy_ife) + ecmd->supported &= ~SUPPORTED_1000baseT_Full; ecmd->advertising = ADVERTISED_TP; if (hw->autoneg == 1) { @@ -202,11 +204,9 @@ e1000_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) /* reset the link */ - if (netif_running(adapter->netdev)) { - e1000_down(adapter); - e1000_reset(adapter); - e1000_up(adapter); - } else + if (netif_running(adapter->netdev)) + e1000_reinit_locked(adapter); + else e1000_reset(adapter); return 0; @@ -253,10 +253,9 @@ e1000_set_pauseparam(struct net_device *netdev, hw->original_fc = hw->fc; if (adapter->fc_autoneg == AUTONEG_ENABLE) { - if (netif_running(adapter->netdev)) { - e1000_down(adapter); - e1000_up(adapter); - } else + if (netif_running(adapter->netdev)) + e1000_reinit_locked(adapter); + else e1000_reset(adapter); } else return ((hw->media_type == e1000_media_type_fiber) ? @@ -278,10 +277,9 @@ e1000_set_rx_csum(struct net_device *netdev, uint32_t data) struct e1000_adapter *adapter = netdev_priv(netdev); adapter->rx_csum = data; - if (netif_running(netdev)) { - e1000_down(adapter); - e1000_up(adapter); - } else + if (netif_running(netdev)) + e1000_reinit_locked(adapter); + else e1000_reset(adapter); return 0; } @@ -576,6 +574,7 @@ e1000_get_drvinfo(struct net_device *netdev, case e1000_82572: case e1000_82573: case e1000_80003es2lan: + case e1000_ich8lan: sprintf(firmware_version, "%d.%d-%d", (eeprom_data & 0xF000) >> 12, (eeprom_data & 0x0FF0) >> 4, @@ -630,6 +629,9 @@ e1000_set_ringparam(struct net_device *netdev, tx_ring_size = sizeof(struct e1000_tx_ring) * adapter->num_tx_queues; rx_ring_size = sizeof(struct e1000_rx_ring) * adapter->num_rx_queues; + while (test_and_set_bit(__E1000_RESETTING, &adapter->flags)) + msleep(1); + if (netif_running(adapter->netdev)) e1000_down(adapter); @@ -690,9 +692,11 @@ e1000_set_ringparam(struct net_device *netdev, adapter->rx_ring = rx_new; adapter->tx_ring = tx_new; if ((err = e1000_up(adapter))) - return err; + goto err_setup; } + clear_bit(__E1000_RESETTING, &adapter->flags); + return 0; err_setup_tx: e1000_free_all_rx_resources(adapter); @@ -700,6 +704,8 @@ err_setup_rx: adapter->rx_ring = rx_old; adapter->tx_ring = tx_old; e1000_up(adapter); +err_setup: + clear_bit(__E1000_RESETTING, &adapter->flags); return err; } @@ -753,6 +759,7 @@ e1000_reg_test(struct e1000_adapter *adapter, uint64_t *data) toggle = 0x7FFFF3FF; break; case e1000_82573: + case e1000_ich8lan: toggle = 0x7FFFF033; break; default: @@ -772,11 +779,12 @@ e1000_reg_test(struct e1000_adapter *adapter, uint64_t *data) } /* restore previous status */ E1000_WRITE_REG(&adapter->hw, STATUS, before); - - REG_PATTERN_TEST(FCAL, 0xFFFFFFFF, 0xFFFFFFFF); - REG_PATTERN_TEST(FCAH, 0x0000FFFF, 0xFFFFFFFF); - REG_PATTERN_TEST(FCT, 0x0000FFFF, 0xFFFFFFFF); - REG_PATTERN_TEST(VET, 0x0000FFFF, 0xFFFFFFFF); + if (adapter->hw.mac_type != e1000_ich8lan) { + REG_PATTERN_TEST(FCAL, 0xFFFFFFFF, 0xFFFFFFFF); + REG_PATTERN_TEST(FCAH, 0x0000FFFF, 0xFFFFFFFF); + REG_PATTERN_TEST(FCT, 0x0000FFFF, 0xFFFFFFFF); + REG_PATTERN_TEST(VET, 0x0000FFFF, 0xFFFFFFFF); + } REG_PATTERN_TEST(RDTR, 0x0000FFFF, 0xFFFFFFFF); REG_PATTERN_TEST(RDBAH, 0xFFFFFFFF, 0xFFFFFFFF); REG_PATTERN_TEST(RDLEN, 0x000FFF80, 0x000FFFFF); @@ -789,20 +797,22 @@ e1000_reg_test(struct e1000_adapter *adapter, uint64_t *data) REG_PATTERN_TEST(TDLEN, 0x000FFF80, 0x000FFFFF); REG_SET_AND_CHECK(RCTL, 0xFFFFFFFF, 0x00000000); - REG_SET_AND_CHECK(RCTL, 0x06DFB3FE, 0x003FFFFB); + before = (adapter->hw.mac_type == e1000_ich8lan ? + 0x06C3B33E : 0x06DFB3FE); + REG_SET_AND_CHECK(RCTL, before, 0x003FFFFB); REG_SET_AND_CHECK(TCTL, 0xFFFFFFFF, 0x00000000); if (adapter->hw.mac_type >= e1000_82543) { - REG_SET_AND_CHECK(RCTL, 0x06DFB3FE, 0xFFFFFFFF); + REG_SET_AND_CHECK(RCTL, before, 0xFFFFFFFF); REG_PATTERN_TEST(RDBAL, 0xFFFFFFF0, 0xFFFFFFFF); - REG_PATTERN_TEST(TXCW, 0xC000FFFF, 0x0000FFFF); + if (adapter->hw.mac_type != e1000_ich8lan) + REG_PATTERN_TEST(TXCW, 0xC000FFFF, 0x0000FFFF); REG_PATTERN_TEST(TDBAL, 0xFFFFFFF0, 0xFFFFFFFF); REG_PATTERN_TEST(TIDV, 0x0000FFFF, 0x0000FFFF); - - for (i = 0; i < E1000_RAR_ENTRIES; i++) { - REG_PATTERN_TEST(RA + ((i << 1) << 2), 0xFFFFFFFF, - 0xFFFFFFFF); + value = (adapter->hw.mac_type == e1000_ich8lan ? + E1000_RAR_ENTRIES_ICH8LAN : E1000_RAR_ENTRIES); + for (i = 0; i < value; i++) { REG_PATTERN_TEST(RA + (((i << 1) + 1) << 2), 0x8003FFFF, 0xFFFFFFFF); } @@ -816,7 +826,9 @@ e1000_reg_test(struct e1000_adapter *adapter, uint64_t *data) } - for (i = 0; i < E1000_MC_TBL_SIZE; i++) + value = (adapter->hw.mac_type == e1000_ich8lan ? + E1000_MC_TBL_SIZE_ICH8LAN : E1000_MC_TBL_SIZE); + for (i = 0; i < value; i++) REG_PATTERN_TEST(MTA + (i << 2), 0xFFFFFFFF, 0xFFFFFFFF); *data = 0; @@ -864,16 +876,16 @@ static int e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data) { struct net_device *netdev = adapter->netdev; - uint32_t mask, i=0, shared_int = TRUE; - uint32_t irq = adapter->pdev->irq; + uint32_t mask, i=0, shared_int = TRUE; + uint32_t irq = adapter->pdev->irq; *data = 0; /* Hook up test interrupt handler just for this test */ - if (!request_irq(irq, &e1000_test_intr, SA_PROBEIRQ, netdev->name, - netdev)) { + if (!request_irq(irq, &e1000_test_intr, IRQF_PROBE_SHARED, + netdev->name, netdev)) { shared_int = FALSE; - } else if (request_irq(irq, &e1000_test_intr, SA_SHIRQ, + } else if (request_irq(irq, &e1000_test_intr, IRQF_SHARED, netdev->name, netdev)){ *data = 1; return -1; @@ -888,25 +900,27 @@ e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data) /* Test each interrupt */ for (; i < 10; i++) { + if (adapter->hw.mac_type == e1000_ich8lan && i == 8) + continue; /* Interrupt to test */ mask = 1 << i; - if (!shared_int) { - /* Disable the interrupt to be reported in - * the cause register and then force the same - * interrupt and see if one gets posted. If - * an interrupt was posted to the bus, the - * test failed. - */ - adapter->test_icr = 0; - E1000_WRITE_REG(&adapter->hw, IMC, mask); - E1000_WRITE_REG(&adapter->hw, ICS, mask); - msec_delay(10); - - if (adapter->test_icr & mask) { - *data = 3; - break; - } + if (!shared_int) { + /* Disable the interrupt to be reported in + * the cause register and then force the same + * interrupt and see if one gets posted. If + * an interrupt was posted to the bus, the + * test failed. + */ + adapter->test_icr = 0; + E1000_WRITE_REG(&adapter->hw, IMC, mask); + E1000_WRITE_REG(&adapter->hw, ICS, mask); + msec_delay(10); + + if (adapter->test_icr & mask) { + *data = 3; + break; + } } /* Enable the interrupt to be reported in @@ -925,7 +939,7 @@ e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data) break; } - if (!shared_int) { + if (!shared_int) { /* Disable the other interrupts to be reported in * the cause register and then force the other * interrupts and see if any get posted. If @@ -1245,18 +1259,33 @@ e1000_integrated_phy_loopback(struct e1000_adapter *adapter) } else if (adapter->hw.phy_type == e1000_phy_gg82563) { e1000_write_phy_reg(&adapter->hw, GG82563_PHY_KMRN_MODE_CTRL, - 0x1CE); + 0x1CC); } - /* force 1000, set loopback */ - e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x4140); - /* Now set up the MAC to the same speed/duplex as the PHY. */ ctrl_reg = E1000_READ_REG(&adapter->hw, CTRL); - ctrl_reg &= ~E1000_CTRL_SPD_SEL; /* Clear the speed sel bits */ - ctrl_reg |= (E1000_CTRL_FRCSPD | /* Set the Force Speed Bit */ - E1000_CTRL_FRCDPX | /* Set the Force Duplex Bit */ - E1000_CTRL_SPD_1000 |/* Force Speed to 1000 */ - E1000_CTRL_FD); /* Force Duplex to FULL */ + + if (adapter->hw.phy_type == e1000_phy_ife) { + /* force 100, set loopback */ + e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x6100); + + /* Now set up the MAC to the same speed/duplex as the PHY. */ + ctrl_reg &= ~E1000_CTRL_SPD_SEL; /* Clear the speed sel bits */ + ctrl_reg |= (E1000_CTRL_FRCSPD | /* Set the Force Speed Bit */ + E1000_CTRL_FRCDPX | /* Set the Force Duplex Bit */ + E1000_CTRL_SPD_100 |/* Force Speed to 100 */ + E1000_CTRL_FD); /* Force Duplex to FULL */ + } else { + /* force 1000, set loopback */ + e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x4140); + + /* Now set up the MAC to the same speed/duplex as the PHY. */ + ctrl_reg = E1000_READ_REG(&adapter->hw, CTRL); + ctrl_reg &= ~E1000_CTRL_SPD_SEL; /* Clear the speed sel bits */ + ctrl_reg |= (E1000_CTRL_FRCSPD | /* Set the Force Speed Bit */ + E1000_CTRL_FRCDPX | /* Set the Force Duplex Bit */ + E1000_CTRL_SPD_1000 |/* Force Speed to 1000 */ + E1000_CTRL_FD); /* Force Duplex to FULL */ + } if (adapter->hw.media_type == e1000_media_type_copper && adapter->hw.phy_type == e1000_phy_m88) { @@ -1316,6 +1345,7 @@ e1000_set_phy_loopback(struct e1000_adapter *adapter) case e1000_82572: case e1000_82573: case e1000_80003es2lan: + case e1000_ich8lan: return e1000_integrated_phy_loopback(adapter); break; @@ -1567,6 +1597,7 @@ e1000_diag_test(struct net_device *netdev, struct e1000_adapter *adapter = netdev_priv(netdev); boolean_t if_running = netif_running(netdev); + set_bit(__E1000_DRIVER_TESTING, &adapter->flags); if (eth_test->flags == ETH_TEST_FL_OFFLINE) { /* Offline tests */ @@ -1581,7 +1612,8 @@ e1000_diag_test(struct net_device *netdev, eth_test->flags |= ETH_TEST_FL_FAILED; if (if_running) - e1000_down(adapter); + /* indicate we're in test mode */ + dev_close(netdev); else e1000_reset(adapter); @@ -1606,8 +1638,9 @@ e1000_diag_test(struct net_device *netdev, adapter->hw.autoneg = autoneg; e1000_reset(adapter); + clear_bit(__E1000_DRIVER_TESTING, &adapter->flags); if (if_running) - e1000_up(adapter); + dev_open(netdev); } else { /* Online tests */ if (e1000_link_test(adapter, &data[4])) @@ -1618,6 +1651,8 @@ e1000_diag_test(struct net_device *netdev, data[1] = 0; data[2] = 0; data[3] = 0; + + clear_bit(__E1000_DRIVER_TESTING, &adapter->flags); } msleep_interruptible(4 * 1000); } @@ -1777,21 +1812,18 @@ e1000_phys_id(struct net_device *netdev, uint32_t data) mod_timer(&adapter->blink_timer, jiffies); 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))); + } else if (adapter->hw.phy_type == e1000_phy_ife) { + if (!adapter->blink_timer.function) { + init_timer(&adapter->blink_timer); + adapter->blink_timer.function = e1000_led_blink_callback; + adapter->blink_timer.data = (unsigned long) adapter; + } + mod_timer(&adapter->blink_timer, jiffies); msleep_interruptible(data * 1000); + del_timer_sync(&adapter->blink_timer); + e1000_write_phy_reg(&(adapter->hw), IFE_PHY_SPECIAL_CONTROL_LED, 0); } else { - E1000_WRITE_REG(&adapter->hw, LEDCTL, - (E1000_LEDCTL_LED2_BLINK_RATE | - E1000_LEDCTL_LED1_BLINK | E1000_LEDCTL_LED2_BLINK | - (E1000_LEDCTL_MODE_LED_ON << E1000_LEDCTL_LED2_MODE_SHIFT) | - (E1000_LEDCTL_MODE_LINK_ACTIVITY << E1000_LEDCTL_LED1_MODE_SHIFT) | - (E1000_LEDCTL_MODE_LED_OFF << E1000_LEDCTL_LED0_MODE_SHIFT))); + e1000_blink_led_start(&adapter->hw); msleep_interruptible(data * 1000); } @@ -1806,10 +1838,8 @@ static int e1000_nway_reset(struct net_device *netdev) { struct e1000_adapter *adapter = netdev_priv(netdev); - if (netif_running(netdev)) { - e1000_down(adapter); - e1000_up(adapter); - } + if (netif_running(netdev)) + e1000_reinit_locked(adapter); return 0; } diff --git a/drivers/net/e1000/e1000_hw.c b/drivers/net/e1000/e1000_hw.c index c5e702349..b3b919116 100644 --- a/drivers/net/e1000/e1000_hw.c +++ b/drivers/net/e1000/e1000_hw.c @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2006 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 @@ -22,6 +22,7 @@ Contact Information: Linux NICS + e1000-devel Mailing List Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 *******************************************************************************/ @@ -100,9 +101,37 @@ static void e1000_write_reg_io(struct e1000_hw *hw, uint32_t offset, #define E1000_WRITE_REG_IO(a, reg, val) \ e1000_write_reg_io((a), E1000_##reg, val) -static int32_t e1000_configure_kmrn_for_10_100(struct e1000_hw *hw); +static int32_t e1000_configure_kmrn_for_10_100(struct e1000_hw *hw, + uint16_t duplex); static int32_t e1000_configure_kmrn_for_1000(struct e1000_hw *hw); +static int32_t e1000_erase_ich8_4k_segment(struct e1000_hw *hw, + uint32_t segment); +static int32_t e1000_get_software_flag(struct e1000_hw *hw); +static int32_t e1000_get_software_semaphore(struct e1000_hw *hw); +static int32_t e1000_init_lcd_from_nvm(struct e1000_hw *hw); +static int32_t e1000_kumeran_lock_loss_workaround(struct e1000_hw *hw); +static int32_t e1000_read_eeprom_ich8(struct e1000_hw *hw, uint16_t offset, + uint16_t words, uint16_t *data); +static int32_t e1000_read_ich8_byte(struct e1000_hw *hw, uint32_t index, + uint8_t* data); +static int32_t e1000_read_ich8_word(struct e1000_hw *hw, uint32_t index, + uint16_t *data); +static int32_t e1000_read_kmrn_reg(struct e1000_hw *hw, uint32_t reg_addr, + uint16_t *data); +static void e1000_release_software_flag(struct e1000_hw *hw); +static void e1000_release_software_semaphore(struct e1000_hw *hw); +static int32_t e1000_set_pci_ex_no_snoop(struct e1000_hw *hw, + uint32_t no_snoop); +static int32_t e1000_verify_write_ich8_byte(struct e1000_hw *hw, + uint32_t index, uint8_t byte); +static int32_t e1000_write_eeprom_ich8(struct e1000_hw *hw, uint16_t offset, + uint16_t words, uint16_t *data); +static int32_t e1000_write_ich8_byte(struct e1000_hw *hw, uint32_t index, + uint8_t data); +static int32_t e1000_write_kmrn_reg(struct e1000_hw *hw, uint32_t reg_addr, + uint16_t data); + /* IGP cable length table */ static const uint16_t e1000_igp_cable_length_table[IGP01E1000_AGC_LENGTH_TABLE_SIZE] = @@ -155,6 +184,14 @@ e1000_set_phy_type(struct e1000_hw *hw) hw->phy_type = e1000_phy_igp; break; } + case IGP03E1000_E_PHY_ID: + hw->phy_type = e1000_phy_igp_3; + break; + case IFE_E_PHY_ID: + case IFE_PLUS_E_PHY_ID: + case IFE_C_E_PHY_ID: + hw->phy_type = e1000_phy_ife; + break; case GG82563_E_PHY_ID: if (hw->mac_type == e1000_80003es2lan) { hw->phy_type = e1000_phy_gg82563; @@ -331,6 +368,7 @@ e1000_set_mac_type(struct e1000_hw *hw) break; case E1000_DEV_ID_82541EI: case E1000_DEV_ID_82541EI_MOBILE: + case E1000_DEV_ID_82541ER_LOM: hw->mac_type = e1000_82541; break; case E1000_DEV_ID_82541ER: @@ -340,6 +378,7 @@ e1000_set_mac_type(struct e1000_hw *hw) hw->mac_type = e1000_82541_rev_2; break; case E1000_DEV_ID_82547EI: + case E1000_DEV_ID_82547EI_MOBILE: hw->mac_type = e1000_82547; break; case E1000_DEV_ID_82547GI: @@ -361,16 +400,29 @@ e1000_set_mac_type(struct e1000_hw *hw) case E1000_DEV_ID_82573L: hw->mac_type = e1000_82573; break; + case E1000_DEV_ID_80003ES2LAN_COPPER_SPT: + case E1000_DEV_ID_80003ES2LAN_SERDES_SPT: case E1000_DEV_ID_80003ES2LAN_COPPER_DPT: case E1000_DEV_ID_80003ES2LAN_SERDES_DPT: hw->mac_type = e1000_80003es2lan; break; + case E1000_DEV_ID_ICH8_IGP_M_AMT: + case E1000_DEV_ID_ICH8_IGP_AMT: + case E1000_DEV_ID_ICH8_IGP_C: + case E1000_DEV_ID_ICH8_IFE: + case E1000_DEV_ID_ICH8_IGP_M: + hw->mac_type = e1000_ich8lan; + break; default: /* Should never have loaded on this device */ return -E1000_ERR_MAC_TYPE; } switch(hw->mac_type) { + case e1000_ich8lan: + hw->swfwhw_semaphore_present = TRUE; + hw->asf_firmware_present = TRUE; + break; case e1000_80003es2lan: hw->swfw_sync_present = TRUE; /* fall through */ @@ -423,6 +475,7 @@ e1000_set_media_type(struct e1000_hw *hw) case e1000_82542_rev2_1: hw->media_type = e1000_media_type_fiber; break; + case e1000_ich8lan: case e1000_82573: /* The STATUS_TBIMODE bit is reserved or reused for the this * device. @@ -527,6 +580,14 @@ e1000_reset_hw(struct e1000_hw *hw) } while(timeout); } + /* Workaround for ICH8 bit corruption issue in FIFO memory */ + if (hw->mac_type == e1000_ich8lan) { + /* Set Tx and Rx buffer allocation to 8k apiece. */ + E1000_WRITE_REG(hw, PBA, E1000_PBA_8K); + /* Set Packet Buffer Size to 16k. */ + E1000_WRITE_REG(hw, PBS, E1000_PBS_16K); + } + /* Issue a global reset to the MAC. This will reset the chip's * transmit, receive, DMA, and link units. It will not effect * the current PCI configuration. The global reset bit is self- @@ -550,6 +611,20 @@ e1000_reset_hw(struct e1000_hw *hw) /* Reset is performed on a shadow of the control register */ E1000_WRITE_REG(hw, CTRL_DUP, (ctrl | E1000_CTRL_RST)); break; + case e1000_ich8lan: + if (!hw->phy_reset_disable && + e1000_check_phy_reset_block(hw) == E1000_SUCCESS) { + /* e1000_ich8lan PHY HW reset requires MAC CORE reset + * at the same time to make sure the interface between + * MAC and the external PHY is reset. + */ + ctrl |= E1000_CTRL_PHY_RST; + } + + e1000_get_software_flag(hw); + E1000_WRITE_REG(hw, CTRL, (ctrl | E1000_CTRL_RST)); + msec_delay(5); + break; default: E1000_WRITE_REG(hw, CTRL, (ctrl | E1000_CTRL_RST)); break; @@ -591,6 +666,7 @@ e1000_reset_hw(struct e1000_hw *hw) /* fall through */ case e1000_82571: case e1000_82572: + case e1000_ich8lan: case e1000_80003es2lan: ret_val = e1000_get_auto_rd_done(hw); if(ret_val) @@ -633,6 +709,12 @@ e1000_reset_hw(struct e1000_hw *hw) e1000_pci_set_mwi(hw); } + if (hw->mac_type == e1000_ich8lan) { + uint32_t kab = E1000_READ_REG(hw, KABGTXD); + kab |= E1000_KABGTXD_BGSQLBIAS; + E1000_WRITE_REG(hw, KABGTXD, kab); + } + return E1000_SUCCESS; } @@ -675,9 +757,12 @@ e1000_init_hw(struct e1000_hw *hw) /* Disabling VLAN filtering. */ DEBUGOUT("Initializing the IEEE VLAN\n"); - if (hw->mac_type < e1000_82545_rev_3) - E1000_WRITE_REG(hw, VET, 0); - e1000_clear_vfta(hw); + /* VET hardcoded to standard value and VFTA removed in ICH8 LAN */ + if (hw->mac_type != e1000_ich8lan) { + if (hw->mac_type < e1000_82545_rev_3) + E1000_WRITE_REG(hw, VET, 0); + e1000_clear_vfta(hw); + } /* For 82542 (rev 2.0), disable MWI and put the receiver into reset */ if(hw->mac_type == e1000_82542_rev2_0) { @@ -705,8 +790,14 @@ e1000_init_hw(struct e1000_hw *hw) /* Zero out the Multicast HASH table */ DEBUGOUT("Zeroing the MTA\n"); mta_size = E1000_MC_TBL_SIZE; - for(i = 0; i < mta_size; i++) + if (hw->mac_type == e1000_ich8lan) + mta_size = E1000_MC_TBL_SIZE_ICH8LAN; + for(i = 0; i < mta_size; i++) { E1000_WRITE_REG_ARRAY(hw, MTA, i, 0); + /* use write flush to prevent Memory Write Block (MWB) from + * occuring when accessing our register space */ + E1000_WRITE_FLUSH(hw); + } /* Set the PCI priority bit correctly in the CTRL register. This * determines if the adapter gives priority to receives, or if it @@ -744,6 +835,10 @@ e1000_init_hw(struct e1000_hw *hw) break; } + /* More time needed for PHY to initialize */ + if (hw->mac_type == e1000_ich8lan) + msec_delay(15); + /* Call a subroutine to configure the link and setup flow control. */ ret_val = e1000_setup_link(hw); @@ -757,6 +852,7 @@ e1000_init_hw(struct e1000_hw *hw) case e1000_82571: case e1000_82572: case e1000_82573: + case e1000_ich8lan: case e1000_80003es2lan: ctrl |= E1000_TXDCTL_COUNT_DESC; break; @@ -765,7 +861,7 @@ e1000_init_hw(struct e1000_hw *hw) } if (hw->mac_type == e1000_82573) { - e1000_enable_tx_pkt_filtering(hw); + e1000_enable_tx_pkt_filtering(hw); } switch (hw->mac_type) { @@ -795,6 +891,7 @@ e1000_init_hw(struct e1000_hw *hw) /* Fall through */ case e1000_82571: case e1000_82572: + case e1000_ich8lan: ctrl = E1000_READ_REG(hw, TXDCTL1); ctrl = (ctrl & ~E1000_TXDCTL_WTHRESH) | E1000_TXDCTL_FULL_TX_DESC_WB; if(hw->mac_type >= e1000_82571) @@ -818,6 +915,11 @@ e1000_init_hw(struct e1000_hw *hw) */ e1000_clear_hw_cntrs(hw); + /* ICH8 No-snoop bits are opposite polarity. + * Set to snoop by default after reset. */ + if (hw->mac_type == e1000_ich8lan) + e1000_set_pci_ex_no_snoop(hw, PCI_EX_82566_SNOOP_ALL); + if (hw->device_id == E1000_DEV_ID_82546GB_QUAD_COPPER || hw->device_id == E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3) { ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); @@ -861,7 +963,7 @@ e1000_adjust_serdes_amplitude(struct e1000_hw *hw) if(eeprom_data != EEPROM_RESERVED_WORD) { /* Adjust SERDES output amplitude only. */ - eeprom_data &= EEPROM_SERDES_AMPLITUDE_MASK; + eeprom_data &= EEPROM_SERDES_AMPLITUDE_MASK; ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_EXT_CTRL, eeprom_data); if(ret_val) return ret_val; @@ -905,6 +1007,7 @@ e1000_setup_link(struct e1000_hw *hw) */ if (hw->fc == e1000_fc_default) { switch (hw->mac_type) { + case e1000_ich8lan: case e1000_82573: hw->fc = e1000_fc_full; break; @@ -971,9 +1074,12 @@ e1000_setup_link(struct e1000_hw *hw) */ DEBUGOUT("Initializing the Flow Control address, type and timer regs\n"); - E1000_WRITE_REG(hw, FCAL, FLOW_CONTROL_ADDRESS_LOW); - E1000_WRITE_REG(hw, FCAH, FLOW_CONTROL_ADDRESS_HIGH); - E1000_WRITE_REG(hw, FCT, FLOW_CONTROL_TYPE); + /* FCAL/H and FCT are hardcoded to standard values in e1000_ich8lan. */ + if (hw->mac_type != e1000_ich8lan) { + E1000_WRITE_REG(hw, FCT, FLOW_CONTROL_TYPE); + E1000_WRITE_REG(hw, FCAH, FLOW_CONTROL_ADDRESS_HIGH); + E1000_WRITE_REG(hw, FCAL, FLOW_CONTROL_ADDRESS_LOW); + } E1000_WRITE_REG(hw, FCTTV, hw->fc_pause_time); @@ -1228,7 +1334,7 @@ e1000_copper_link_igp_setup(struct e1000_hw *hw) if (hw->phy_reset_disable) return E1000_SUCCESS; - + ret_val = e1000_phy_reset(hw); if (ret_val) { DEBUGOUT("Error Resetting the PHY\n"); @@ -1237,12 +1343,13 @@ e1000_copper_link_igp_setup(struct e1000_hw *hw) /* Wait 10ms for MAC to configure PHY from eeprom settings */ msec_delay(15); - + if (hw->mac_type != e1000_ich8lan) { /* Configure activity LED after PHY reset */ led_ctrl = E1000_READ_REG(hw, LEDCTL); led_ctrl &= IGP_ACTIVITY_LED_MASK; led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE); E1000_WRITE_REG(hw, LEDCTL, led_ctrl); + } /* disable lplu d3 during driver init */ ret_val = e1000_set_d3_lplu_state(hw, FALSE); @@ -1370,7 +1477,7 @@ e1000_copper_link_ggp_setup(struct e1000_hw *hw) DEBUGFUNC("e1000_copper_link_ggp_setup"); if(!hw->phy_reset_disable) { - + /* Enable CRS on TX for half-duplex operation. */ ret_val = e1000_read_phy_reg(hw, GG82563_PHY_MAC_SPEC_CTRL, &phy_data); @@ -1478,8 +1585,7 @@ e1000_copper_link_ggp_setup(struct e1000_hw *hw) if (ret_val) return ret_val; - /* Enable Pass False Carrier on the PHY */ - phy_data |= GG82563_KMCR_PASS_FALSE_CARRIER; + phy_data &= ~GG82563_KMCR_PASS_FALSE_CARRIER; ret_val = e1000_write_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, phy_data); @@ -1519,7 +1625,7 @@ e1000_copper_link_mgp_setup(struct e1000_hw *hw) if(hw->phy_reset_disable) return E1000_SUCCESS; - + /* Enable CRS on TX. This must be set for half-duplex operation. */ ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data); if(ret_val) @@ -1561,28 +1667,40 @@ e1000_copper_link_mgp_setup(struct e1000_hw *hw) phy_data &= ~M88E1000_PSCR_POLARITY_REVERSAL; if(hw->disable_polarity_correction == 1) phy_data |= M88E1000_PSCR_POLARITY_REVERSAL; - ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data); - if(ret_val) - return ret_val; - - /* Force TX_CLK in the Extended PHY Specific Control Register - * to 25MHz clock. - */ - ret_val = e1000_read_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_data); - if(ret_val) + ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data); + if (ret_val) return ret_val; - phy_data |= M88E1000_EPSCR_TX_CLK_25; - if (hw->phy_revision < M88E1011_I_REV_4) { - /* Configure Master and Slave downshift values */ - phy_data &= ~(M88E1000_EPSCR_MASTER_DOWNSHIFT_MASK | + /* Force TX_CLK in the Extended PHY Specific Control Register + * to 25MHz clock. + */ + ret_val = e1000_read_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_data); + if (ret_val) + return ret_val; + + phy_data |= M88E1000_EPSCR_TX_CLK_25; + + if ((hw->phy_revision == E1000_REVISION_2) && + (hw->phy_id == M88E1111_I_PHY_ID)) { + /* Vidalia Phy, set the downshift counter to 5x */ + phy_data &= ~(M88EC018_EPSCR_DOWNSHIFT_COUNTER_MASK); + phy_data |= M88EC018_EPSCR_DOWNSHIFT_COUNTER_5X; + ret_val = e1000_write_phy_reg(hw, + M88E1000_EXT_PHY_SPEC_CTRL, phy_data); + if (ret_val) + return ret_val; + } else { + /* Configure Master and Slave downshift values */ + phy_data &= ~(M88E1000_EPSCR_MASTER_DOWNSHIFT_MASK | M88E1000_EPSCR_SLAVE_DOWNSHIFT_MASK); - phy_data |= (M88E1000_EPSCR_MASTER_DOWNSHIFT_1X | + phy_data |= (M88E1000_EPSCR_MASTER_DOWNSHIFT_1X | M88E1000_EPSCR_SLAVE_DOWNSHIFT_1X); - ret_val = e1000_write_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, phy_data); - if(ret_val) - return ret_val; + ret_val = e1000_write_phy_reg(hw, + M88E1000_EXT_PHY_SPEC_CTRL, phy_data); + if (ret_val) + return ret_val; + } } /* SW Reset the PHY so all changes take effect */ @@ -1620,6 +1738,10 @@ e1000_copper_link_autoneg(struct e1000_hw *hw) if(hw->autoneg_advertised == 0) hw->autoneg_advertised = AUTONEG_ADVERTISE_SPEED_DEFAULT; + /* IFE phy only supports 10/100 */ + if (hw->phy_type == e1000_phy_ife) + hw->autoneg_advertised &= AUTONEG_ADVERTISE_10_100_ALL; + DEBUGOUT("Reconfiguring auto-neg advertisement params\n"); ret_val = e1000_phy_setup_autoneg(hw); if(ret_val) { @@ -1665,7 +1787,7 @@ e1000_copper_link_autoneg(struct e1000_hw *hw) * collision distance in the Transmit Control Register. * 2) Set up flow control on the MAC to that established with * the link partner. -* 3) Config DSP to improve Gigabit link quality for some PHY revisions. +* 3) Config DSP to improve Gigabit link quality for some PHY revisions. * * hw - Struct containing variables accessed by shared code ******************************************************************************/ @@ -1674,7 +1796,7 @@ e1000_copper_link_postconfig(struct e1000_hw *hw) { int32_t ret_val; DEBUGFUNC("e1000_copper_link_postconfig"); - + if(hw->mac_type >= e1000_82544) { e1000_config_collision_dist(hw); } else { @@ -1698,7 +1820,7 @@ e1000_copper_link_postconfig(struct e1000_hw *hw) return ret_val; } } - + return E1000_SUCCESS; } @@ -1717,6 +1839,26 @@ e1000_setup_copper_link(struct e1000_hw *hw) DEBUGFUNC("e1000_setup_copper_link"); + switch (hw->mac_type) { + case e1000_80003es2lan: + case e1000_ich8lan: + /* Set the mac to wait the maximum time between each + * iteration and increase the max iterations when + * polling the phy; this fixes erroneous timeouts at 10Mbps. */ + ret_val = e1000_write_kmrn_reg(hw, GG82563_REG(0x34, 4), 0xFFFF); + if (ret_val) + return ret_val; + ret_val = e1000_read_kmrn_reg(hw, GG82563_REG(0x34, 9), ®_data); + if (ret_val) + return ret_val; + reg_data |= 0x3F; + ret_val = e1000_write_kmrn_reg(hw, GG82563_REG(0x34, 9), reg_data); + if (ret_val) + return ret_val; + default: + break; + } + /* Check if it is a valid PHY and set PHY mode if necessary. */ ret_val = e1000_copper_link_preconfig(hw); if(ret_val) @@ -1724,10 +1866,8 @@ e1000_setup_copper_link(struct e1000_hw *hw) switch (hw->mac_type) { case e1000_80003es2lan: - ret_val = e1000_read_kmrn_reg(hw, E1000_KUMCTRLSTA_OFFSET_INB_CTRL, - ®_data); - if (ret_val) - return ret_val; + /* Kumeran registers are written-only */ + reg_data = E1000_KUMCTRLSTA_INB_CTRL_LINK_STATUS_TX_TIMEOUT_DEFAULT; reg_data |= E1000_KUMCTRLSTA_INB_CTRL_DIS_PADDING; ret_val = e1000_write_kmrn_reg(hw, E1000_KUMCTRLSTA_OFFSET_INB_CTRL, reg_data); @@ -1739,6 +1879,7 @@ e1000_setup_copper_link(struct e1000_hw *hw) } if (hw->phy_type == e1000_phy_igp || + hw->phy_type == e1000_phy_igp_3 || hw->phy_type == e1000_phy_igp_2) { ret_val = e1000_copper_link_igp_setup(hw); if(ret_val) @@ -1754,11 +1895,11 @@ e1000_setup_copper_link(struct e1000_hw *hw) } if(hw->autoneg) { - /* Setup autoneg and flow control advertisement - * and perform autonegotiation */ + /* Setup autoneg and flow control advertisement + * and perform autonegotiation */ ret_val = e1000_copper_link_autoneg(hw); if(ret_val) - return ret_val; + return ret_val; } else { /* PHY will be set to 10H, 10F, 100H,or 100F * depending on value from forced_speed_duplex. */ @@ -1786,7 +1927,7 @@ e1000_setup_copper_link(struct e1000_hw *hw) ret_val = e1000_copper_link_postconfig(hw); if(ret_val) return ret_val; - + DEBUGOUT("Valid link established!!!\n"); return E1000_SUCCESS; } @@ -1803,7 +1944,7 @@ e1000_setup_copper_link(struct e1000_hw *hw) * hw - Struct containing variables accessed by shared code ******************************************************************************/ static int32_t -e1000_configure_kmrn_for_10_100(struct e1000_hw *hw) +e1000_configure_kmrn_for_10_100(struct e1000_hw *hw, uint16_t duplex) { int32_t ret_val = E1000_SUCCESS; uint32_t tipg; @@ -1823,6 +1964,18 @@ e1000_configure_kmrn_for_10_100(struct e1000_hw *hw) tipg |= DEFAULT_80003ES2LAN_TIPG_IPGT_10_100; E1000_WRITE_REG(hw, TIPG, tipg); + ret_val = e1000_read_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, ®_data); + + if (ret_val) + return ret_val; + + if (duplex == HALF_DUPLEX) + reg_data |= GG82563_KMCR_PASS_FALSE_CARRIER; + else + reg_data &= ~GG82563_KMCR_PASS_FALSE_CARRIER; + + ret_val = e1000_write_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, reg_data); + return ret_val; } @@ -1847,6 +2000,14 @@ e1000_configure_kmrn_for_1000(struct e1000_hw *hw) tipg |= DEFAULT_80003ES2LAN_TIPG_IPGT_1000; E1000_WRITE_REG(hw, TIPG, tipg); + ret_val = e1000_read_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, ®_data); + + if (ret_val) + return ret_val; + + reg_data &= ~GG82563_KMCR_PASS_FALSE_CARRIER; + ret_val = e1000_write_phy_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, reg_data); + return ret_val; } @@ -1869,10 +2030,13 @@ e1000_phy_setup_autoneg(struct e1000_hw *hw) if(ret_val) return ret_val; - /* Read the MII 1000Base-T Control Register (Address 9). */ - ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &mii_1000t_ctrl_reg); - if(ret_val) - return ret_val; + if (hw->phy_type != e1000_phy_ife) { + /* Read the MII 1000Base-T Control Register (Address 9). */ + ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &mii_1000t_ctrl_reg); + if (ret_val) + return ret_val; + } else + mii_1000t_ctrl_reg=0; /* Need to parse both autoneg_advertised and fc and set up * the appropriate PHY registers. First we will parse for @@ -1923,6 +2087,9 @@ e1000_phy_setup_autoneg(struct e1000_hw *hw) if(hw->autoneg_advertised & ADVERTISE_1000_FULL) { DEBUGOUT("Advertise 1000mb Full duplex\n"); mii_1000t_ctrl_reg |= CR_1000T_FD_CAPS; + if (hw->phy_type == e1000_phy_ife) { + DEBUGOUT("e1000_phy_ife is a 10/100 PHY. Gigabit speed is not supported.\n"); + } } /* Check for a software override of the flow control settings, and @@ -1984,9 +2151,11 @@ e1000_phy_setup_autoneg(struct e1000_hw *hw) DEBUGOUT1("Auto-Neg Advertising %x\n", mii_autoneg_adv_reg); - ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, mii_1000t_ctrl_reg); - if(ret_val) - return ret_val; + if (hw->phy_type != e1000_phy_ife) { + ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, mii_1000t_ctrl_reg); + if (ret_val) + return ret_val; + } return E1000_SUCCESS; } @@ -2089,6 +2258,18 @@ e1000_phy_force_speed_duplex(struct e1000_hw *hw) /* Need to reset the PHY or these changes will be ignored */ mii_ctrl_reg |= MII_CR_RESET; + /* Disable MDI-X support for 10/100 */ + } else if (hw->phy_type == e1000_phy_ife) { + ret_val = e1000_read_phy_reg(hw, IFE_PHY_MDIX_CONTROL, &phy_data); + if (ret_val) + return ret_val; + + phy_data &= ~IFE_PMC_AUTO_MDIX; + phy_data &= ~IFE_PMC_FORCE_MDIX; + + ret_val = e1000_write_phy_reg(hw, IFE_PHY_MDIX_CONTROL, phy_data); + if (ret_val) + return ret_val; } else { /* Clear Auto-Crossover to force MDI manually. IGP requires MDI * forced whenever speed or duplex are forced. @@ -2273,7 +2454,7 @@ e1000_config_mac_to_phy(struct e1000_hw *hw) DEBUGFUNC("e1000_config_mac_to_phy"); - /* 82544 or newer MAC, Auto Speed Detection takes care of + /* 82544 or newer MAC, Auto Speed Detection takes care of * MAC speed/duplex configuration.*/ if (hw->mac_type >= e1000_82544) return E1000_SUCCESS; @@ -2292,9 +2473,9 @@ e1000_config_mac_to_phy(struct e1000_hw *hw) if(ret_val) return ret_val; - if(phy_data & M88E1000_PSSR_DPLX) + if(phy_data & M88E1000_PSSR_DPLX) ctrl |= E1000_CTRL_FD; - else + else ctrl &= ~E1000_CTRL_FD; e1000_config_collision_dist(hw); @@ -2493,10 +2674,10 @@ e1000_config_fc_after_link_up(struct e1000_hw *hw) */ if(hw->original_fc == e1000_fc_full) { hw->fc = e1000_fc_full; - DEBUGOUT("Flow Control = FULL.\r\n"); + DEBUGOUT("Flow Control = FULL.\n"); } else { hw->fc = e1000_fc_rx_pause; - DEBUGOUT("Flow Control = RX PAUSE frames only.\r\n"); + DEBUGOUT("Flow Control = RX PAUSE frames only.\n"); } } /* For receiving PAUSE frames ONLY. @@ -2512,7 +2693,7 @@ e1000_config_fc_after_link_up(struct e1000_hw *hw) (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) && (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) { hw->fc = e1000_fc_tx_pause; - DEBUGOUT("Flow Control = TX PAUSE frames only.\r\n"); + DEBUGOUT("Flow Control = TX PAUSE frames only.\n"); } /* For transmitting PAUSE frames ONLY. * @@ -2527,7 +2708,7 @@ e1000_config_fc_after_link_up(struct e1000_hw *hw) !(mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) && (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) { hw->fc = e1000_fc_rx_pause; - DEBUGOUT("Flow Control = RX PAUSE frames only.\r\n"); + DEBUGOUT("Flow Control = RX PAUSE frames only.\n"); } /* Per the IEEE spec, at this point flow control should be * disabled. However, we want to consider that we could @@ -2553,10 +2734,10 @@ e1000_config_fc_after_link_up(struct e1000_hw *hw) hw->original_fc == e1000_fc_tx_pause) || hw->fc_strict_ieee) { hw->fc = e1000_fc_none; - DEBUGOUT("Flow Control = NONE.\r\n"); + DEBUGOUT("Flow Control = NONE.\n"); } else { hw->fc = e1000_fc_rx_pause; - DEBUGOUT("Flow Control = RX PAUSE frames only.\r\n"); + DEBUGOUT("Flow Control = RX PAUSE frames only.\n"); } /* Now we need to do one last check... If we auto- @@ -2581,7 +2762,7 @@ e1000_config_fc_after_link_up(struct e1000_hw *hw) return ret_val; } } else { - DEBUGOUT("Copper PHY and Auto Neg has not completed.\r\n"); + DEBUGOUT("Copper PHY and Auto Neg has not completed.\n"); } } return E1000_SUCCESS; @@ -2721,8 +2902,12 @@ e1000_check_for_link(struct e1000_hw *hw) */ if(hw->tbi_compatibility_en) { uint16_t speed, duplex; - e1000_get_speed_and_duplex(hw, &speed, &duplex); - if(speed != SPEED_1000) { + ret_val = e1000_get_speed_and_duplex(hw, &speed, &duplex); + if (ret_val) { + DEBUGOUT("Error getting link speed and duplex\n"); + return ret_val; + } + if (speed != SPEED_1000) { /* If link speed is not set to gigabit speed, we do not need * to enable TBI compatibility. */ @@ -2764,7 +2949,7 @@ e1000_check_for_link(struct e1000_hw *hw) hw->autoneg_failed = 1; return 0; } - DEBUGOUT("NOT RXing /C/, disable AutoNeg and force link.\r\n"); + DEBUGOUT("NOT RXing /C/, disable AutoNeg and force link.\n"); /* Disable auto-negotiation in the TXCW register */ E1000_WRITE_REG(hw, TXCW, (hw->txcw & ~E1000_TXCW_ANE)); @@ -2789,7 +2974,7 @@ e1000_check_for_link(struct e1000_hw *hw) else if(((hw->media_type == e1000_media_type_fiber) || (hw->media_type == e1000_media_type_internal_serdes)) && (ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) { - DEBUGOUT("RXing /C/, enable AutoNeg and stop forcing link.\r\n"); + DEBUGOUT("RXing /C/, enable AutoNeg and stop forcing link.\n"); E1000_WRITE_REG(hw, TXCW, hw->txcw); E1000_WRITE_REG(hw, CTRL, (ctrl & ~E1000_CTRL_SLU)); @@ -2852,13 +3037,13 @@ e1000_get_speed_and_duplex(struct e1000_hw *hw, if(status & E1000_STATUS_FD) { *duplex = FULL_DUPLEX; - DEBUGOUT("Full Duplex\r\n"); + DEBUGOUT("Full Duplex\n"); } else { *duplex = HALF_DUPLEX; - DEBUGOUT(" Half Duplex\r\n"); + DEBUGOUT(" Half Duplex\n"); } } else { - DEBUGOUT("1000 Mbs, Full Duplex\r\n"); + DEBUGOUT("1000 Mbs, Full Duplex\n"); *speed = SPEED_1000; *duplex = FULL_DUPLEX; } @@ -2884,12 +3069,18 @@ e1000_get_speed_and_duplex(struct e1000_hw *hw, } } - if ((hw->mac_type == e1000_80003es2lan) && + if ((hw->mac_type == e1000_80003es2lan) && (hw->media_type == e1000_media_type_copper)) { if (*speed == SPEED_1000) ret_val = e1000_configure_kmrn_for_1000(hw); else - ret_val = e1000_configure_kmrn_for_10_100(hw); + ret_val = e1000_configure_kmrn_for_10_100(hw, *duplex); + if (ret_val) + return ret_val; + } + + if ((hw->phy_type == e1000_phy_igp_3) && (*speed == SPEED_1000)) { + ret_val = e1000_kumeran_lock_loss_workaround(hw); if (ret_val) return ret_val; } @@ -3069,7 +3260,7 @@ e1000_shift_in_mdi_bits(struct e1000_hw *hw) return data; } -int32_t +static int32_t e1000_swfw_sync_acquire(struct e1000_hw *hw, uint16_t mask) { uint32_t swfw_sync = 0; @@ -3079,6 +3270,9 @@ e1000_swfw_sync_acquire(struct e1000_hw *hw, uint16_t mask) DEBUGFUNC("e1000_swfw_sync_acquire"); + if (hw->swfwhw_semaphore_present) + return e1000_get_software_flag(hw); + if (!hw->swfw_sync_present) return e1000_get_hw_eeprom_semaphore(hw); @@ -3110,7 +3304,7 @@ e1000_swfw_sync_acquire(struct e1000_hw *hw, uint16_t mask) return E1000_SUCCESS; } -void +static void e1000_swfw_sync_release(struct e1000_hw *hw, uint16_t mask) { uint32_t swfw_sync; @@ -3118,6 +3312,11 @@ e1000_swfw_sync_release(struct e1000_hw *hw, uint16_t mask) DEBUGFUNC("e1000_swfw_sync_release"); + if (hw->swfwhw_semaphore_present) { + e1000_release_software_flag(hw); + return; + } + if (!hw->swfw_sync_present) { e1000_put_hw_eeprom_semaphore(hw); return; @@ -3160,7 +3359,8 @@ e1000_read_phy_reg(struct e1000_hw *hw, if (e1000_swfw_sync_acquire(hw, swfw)) return -E1000_ERR_SWFW_SYNC; - if((hw->phy_type == e1000_phy_igp || + if ((hw->phy_type == e1000_phy_igp || + hw->phy_type == e1000_phy_igp_3 || hw->phy_type == e1000_phy_igp_2) && (reg_addr > MAX_PHY_MULTI_PAGE_REG)) { ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT, @@ -3299,7 +3499,8 @@ e1000_write_phy_reg(struct e1000_hw *hw, if (e1000_swfw_sync_acquire(hw, swfw)) return -E1000_ERR_SWFW_SYNC; - if((hw->phy_type == e1000_phy_igp || + if ((hw->phy_type == e1000_phy_igp || + hw->phy_type == e1000_phy_igp_3 || hw->phy_type == e1000_phy_igp_2) && (reg_addr > MAX_PHY_MULTI_PAGE_REG)) { ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT, @@ -3401,7 +3602,7 @@ e1000_write_phy_reg_ex(struct e1000_hw *hw, return E1000_SUCCESS; } -int32_t +static int32_t e1000_read_kmrn_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t *data) @@ -3434,7 +3635,7 @@ e1000_read_kmrn_reg(struct e1000_hw *hw, return E1000_SUCCESS; } -int32_t +static int32_t e1000_write_kmrn_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t data) @@ -3497,24 +3698,24 @@ e1000_phy_hw_reset(struct e1000_hw *hw) } /* 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 + * For pre-e1000_82571 hardware, we delay for 10ms between the assert * and deassert. For e1000_82571 hardware and later, we instead delay * for 50us between and 10ms after the deassertion. */ ctrl = E1000_READ_REG(hw, CTRL); E1000_WRITE_REG(hw, CTRL, ctrl | E1000_CTRL_PHY_RST); E1000_WRITE_FLUSH(hw); - - if (hw->mac_type < e1000_82571) + + if (hw->mac_type < e1000_82571) msec_delay(10); else udelay(100); - + E1000_WRITE_REG(hw, CTRL, ctrl); E1000_WRITE_FLUSH(hw); - + if (hw->mac_type >= e1000_82571) - msec_delay(10); + msec_delay_irq(10); e1000_swfw_sync_release(hw, swfw); } else { /* Read the Extended Device Control Register, assert the PHY_RESET_DIR @@ -3544,6 +3745,12 @@ e1000_phy_hw_reset(struct e1000_hw *hw) ret_val = e1000_get_phy_cfg_done(hw); e1000_release_software_semaphore(hw); + if ((hw->mac_type == e1000_ich8lan) && + (hw->phy_type == e1000_phy_igp_3)) { + ret_val = e1000_init_lcd_from_nvm(hw); + if (ret_val) + return ret_val; + } return ret_val; } @@ -3572,9 +3779,11 @@ e1000_phy_reset(struct e1000_hw *hw) case e1000_82541_rev_2: case e1000_82571: case e1000_82572: + case e1000_ich8lan: ret_val = e1000_phy_hw_reset(hw); if(ret_val) return ret_val; + break; default: ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &phy_data); @@ -3596,12 +3805,121 @@ e1000_phy_reset(struct e1000_hw *hw) return E1000_SUCCESS; } +/****************************************************************************** +* Work-around for 82566 power-down: on D3 entry- +* 1) disable gigabit link +* 2) write VR power-down enable +* 3) read it back +* if successful continue, else issue LCD reset and repeat +* +* hw - struct containing variables accessed by shared code +******************************************************************************/ +void +e1000_phy_powerdown_workaround(struct e1000_hw *hw) +{ + int32_t reg; + uint16_t phy_data; + int32_t retry = 0; + + DEBUGFUNC("e1000_phy_powerdown_workaround"); + + if (hw->phy_type != e1000_phy_igp_3) + return; + + do { + /* Disable link */ + reg = E1000_READ_REG(hw, PHY_CTRL); + E1000_WRITE_REG(hw, PHY_CTRL, reg | E1000_PHY_CTRL_GBE_DISABLE | + E1000_PHY_CTRL_NOND0A_GBE_DISABLE); + + /* Write VR power-down enable */ + e1000_read_phy_reg(hw, IGP3_VR_CTRL, &phy_data); + e1000_write_phy_reg(hw, IGP3_VR_CTRL, phy_data | + IGP3_VR_CTRL_MODE_SHUT); + + /* Read it back and test */ + e1000_read_phy_reg(hw, IGP3_VR_CTRL, &phy_data); + if ((phy_data & IGP3_VR_CTRL_MODE_SHUT) || retry) + break; + + /* Issue PHY reset and repeat at most one more time */ + reg = E1000_READ_REG(hw, CTRL); + E1000_WRITE_REG(hw, CTRL, reg | E1000_CTRL_PHY_RST); + retry++; + } while (retry); + + return; + +} + +/****************************************************************************** +* Work-around for 82566 Kumeran PCS lock loss: +* On link status change (i.e. PCI reset, speed change) and link is up and +* speed is gigabit- +* 0) if workaround is optionally disabled do nothing +* 1) wait 1ms for Kumeran link to come up +* 2) check Kumeran Diagnostic register PCS lock loss bit +* 3) if not set the link is locked (all is good), otherwise... +* 4) reset the PHY +* 5) repeat up to 10 times +* Note: this is only called for IGP3 copper when speed is 1gb. +* +* hw - struct containing variables accessed by shared code +******************************************************************************/ +static int32_t +e1000_kumeran_lock_loss_workaround(struct e1000_hw *hw) +{ + int32_t ret_val; + int32_t reg; + int32_t cnt; + uint16_t phy_data; + + if (hw->kmrn_lock_loss_workaround_disabled) + return E1000_SUCCESS; + + /* Make sure link is up before proceeding. If not just return. + * Attempting this while link is negotiating fouls up link + * stability */ + ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data); + ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data); + + if (phy_data & MII_SR_LINK_STATUS) { + for (cnt = 0; cnt < 10; cnt++) { + /* read once to clear */ + ret_val = e1000_read_phy_reg(hw, IGP3_KMRN_DIAG, &phy_data); + if (ret_val) + return ret_val; + /* and again to get new status */ + ret_val = e1000_read_phy_reg(hw, IGP3_KMRN_DIAG, &phy_data); + if (ret_val) + return ret_val; + + /* check for PCS lock */ + if (!(phy_data & IGP3_KMRN_DIAG_PCS_LOCK_LOSS)) + return E1000_SUCCESS; + + /* Issue PHY reset */ + e1000_phy_hw_reset(hw); + msec_delay_irq(5); + } + /* Disable GigE link negotiation */ + reg = E1000_READ_REG(hw, PHY_CTRL); + E1000_WRITE_REG(hw, PHY_CTRL, reg | E1000_PHY_CTRL_GBE_DISABLE | + E1000_PHY_CTRL_NOND0A_GBE_DISABLE); + + /* unable to acquire PCS lock */ + return E1000_ERR_PHY; + } + + return E1000_SUCCESS; +} + /****************************************************************************** * Probes the expected PHY address for known PHY IDs * * hw - Struct containing variables accessed by shared code ******************************************************************************/ -static int32_t +int32_t e1000_detect_gig_phy(struct e1000_hw *hw) { int32_t phy_init_status, ret_val; @@ -3613,8 +3931,8 @@ e1000_detect_gig_phy(struct e1000_hw *hw) /* The 82571 firmware may still be configuring the PHY. In this * case, we cannot access the PHY until the configuration is done. So * we explicitly set the PHY values. */ - if(hw->mac_type == e1000_82571 || - hw->mac_type == e1000_82572) { + if (hw->mac_type == e1000_82571 || + hw->mac_type == e1000_82572) { hw->phy_id = IGP01E1000_I_PHY_ID; hw->phy_type = e1000_phy_igp_2; return E1000_SUCCESS; @@ -3631,7 +3949,7 @@ e1000_detect_gig_phy(struct e1000_hw *hw) /* Read the PHY ID Registers to identify which PHY is onboard. */ ret_val = e1000_read_phy_reg(hw, PHY_ID1, &phy_id_high); - if(ret_val) + if (ret_val) return ret_val; hw->phy_id = (uint32_t) (phy_id_high << 16); @@ -3669,6 +3987,12 @@ e1000_detect_gig_phy(struct e1000_hw *hw) case e1000_80003es2lan: if (hw->phy_id == GG82563_E_PHY_ID) match = TRUE; break; + case e1000_ich8lan: + if (hw->phy_id == IGP03E1000_E_PHY_ID) match = TRUE; + if (hw->phy_id == IFE_E_PHY_ID) match = TRUE; + if (hw->phy_id == IFE_PLUS_E_PHY_ID) match = TRUE; + if (hw->phy_id == IFE_C_E_PHY_ID) match = TRUE; + break; default: DEBUGOUT1("Invalid MAC type %d\n", hw->mac_type); return -E1000_ERR_CONFIG; @@ -3783,6 +4107,53 @@ e1000_phy_igp_get_info(struct e1000_hw *hw, return E1000_SUCCESS; } +/****************************************************************************** +* Get PHY information from various PHY registers for ife PHY only. +* +* hw - Struct containing variables accessed by shared code +* phy_info - PHY information structure +******************************************************************************/ +static int32_t +e1000_phy_ife_get_info(struct e1000_hw *hw, + struct e1000_phy_info *phy_info) +{ + int32_t ret_val; + uint16_t phy_data, polarity; + + DEBUGFUNC("e1000_phy_ife_get_info"); + + phy_info->downshift = (e1000_downshift)hw->speed_downgraded; + phy_info->extended_10bt_distance = e1000_10bt_ext_dist_enable_normal; + + ret_val = e1000_read_phy_reg(hw, IFE_PHY_SPECIAL_CONTROL, &phy_data); + if (ret_val) + return ret_val; + phy_info->polarity_correction = + (phy_data & IFE_PSC_AUTO_POLARITY_DISABLE) >> + IFE_PSC_AUTO_POLARITY_DISABLE_SHIFT; + + if (phy_info->polarity_correction == e1000_polarity_reversal_enabled) { + ret_val = e1000_check_polarity(hw, &polarity); + if (ret_val) + return ret_val; + } else { + /* Polarity is forced. */ + polarity = (phy_data & IFE_PSC_FORCE_POLARITY) >> + IFE_PSC_FORCE_POLARITY_SHIFT; + } + phy_info->cable_polarity = polarity; + + ret_val = e1000_read_phy_reg(hw, IFE_PHY_MDIX_CONTROL, &phy_data); + if (ret_val) + return ret_val; + + phy_info->mdix_mode = + (phy_data & (IFE_PMC_AUTO_MDIX | IFE_PMC_FORCE_MDIX)) >> + IFE_PMC_MDIX_MODE_SHIFT; + + return E1000_SUCCESS; +} + /****************************************************************************** * Get PHY information from various PHY registers fot m88 PHY only. * @@ -3816,7 +4187,7 @@ e1000_phy_m88_get_info(struct e1000_hw *hw, /* Check polarity status */ ret_val = e1000_check_polarity(hw, &polarity); if(ret_val) - return ret_val; + return ret_val; phy_info->cable_polarity = polarity; ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data); @@ -3898,9 +4269,12 @@ e1000_phy_get_info(struct e1000_hw *hw, return -E1000_ERR_CONFIG; } - if(hw->phy_type == e1000_phy_igp || + if (hw->phy_type == e1000_phy_igp || + hw->phy_type == e1000_phy_igp_3 || hw->phy_type == e1000_phy_igp_2) return e1000_phy_igp_get_info(hw, phy_info); + else if (hw->phy_type == e1000_phy_ife) + return e1000_phy_ife_get_info(hw, phy_info); else return e1000_phy_m88_get_info(hw, phy_info); } @@ -4049,6 +4423,35 @@ e1000_init_eeprom_params(struct e1000_hw *hw) eeprom->use_eerd = TRUE; eeprom->use_eewr = FALSE; break; + case e1000_ich8lan: + { + int32_t i = 0; + uint32_t flash_size = E1000_READ_ICH8_REG(hw, ICH8_FLASH_GFPREG); + + eeprom->type = e1000_eeprom_ich8; + eeprom->use_eerd = FALSE; + eeprom->use_eewr = FALSE; + eeprom->word_size = E1000_SHADOW_RAM_WORDS; + + /* Zero the shadow RAM structure. But don't load it from NVM + * so as to save time for driver init */ + if (hw->eeprom_shadow_ram != NULL) { + for (i = 0; i < E1000_SHADOW_RAM_WORDS; i++) { + hw->eeprom_shadow_ram[i].modified = FALSE; + hw->eeprom_shadow_ram[i].eeprom_word = 0xFFFF; + } + } + + hw->flash_base_addr = (flash_size & ICH8_GFPREG_BASE_MASK) * + ICH8_FLASH_SECTOR_SIZE; + + hw->flash_bank_size = ((flash_size >> 16) & ICH8_GFPREG_BASE_MASK) + 1; + hw->flash_bank_size -= (flash_size & ICH8_GFPREG_BASE_MASK); + hw->flash_bank_size *= ICH8_FLASH_SECTOR_SIZE; + hw->flash_bank_size /= 2 * sizeof(uint16_t); + + break; + } default: break; } @@ -4469,7 +4872,10 @@ e1000_read_eeprom(struct e1000_hw *hw, return ret_val; } - if(eeprom->type == e1000_eeprom_spi) { + if (eeprom->type == e1000_eeprom_ich8) + return e1000_read_eeprom_ich8(hw, offset, words, data); + + if (eeprom->type == e1000_eeprom_spi) { uint16_t word_in; uint8_t read_opcode = EEPROM_READ_OPCODE_SPI; @@ -4541,14 +4947,14 @@ e1000_read_eeprom_eerd(struct e1000_hw *hw, E1000_WRITE_REG(hw, EERD, eerd); error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_READ); - + if(error) { break; } data[i] = (E1000_READ_REG(hw, EERD) >> E1000_EEPROM_RW_REG_DATA); - + } - + return error; } @@ -4574,24 +4980,24 @@ e1000_write_eeprom_eewr(struct e1000_hw *hw, return -E1000_ERR_SWFW_SYNC; for (i = 0; i < words; i++) { - register_value = (data[i] << E1000_EEPROM_RW_REG_DATA) | - ((offset+i) << E1000_EEPROM_RW_ADDR_SHIFT) | + register_value = (data[i] << E1000_EEPROM_RW_REG_DATA) | + ((offset+i) << E1000_EEPROM_RW_ADDR_SHIFT) | E1000_EEPROM_RW_REG_START; error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_WRITE); if(error) { break; - } + } E1000_WRITE_REG(hw, EEWR, register_value); - + error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_WRITE); - + if(error) { break; - } + } } - + e1000_swfw_sync_release(hw, E1000_SWFW_EEP_SM); return error; } @@ -4611,7 +5017,7 @@ e1000_poll_eerd_eewr_done(struct e1000_hw *hw, int eerd) for(i = 0; i < attempts; i++) { if(eerd == E1000_EEPROM_POLL_READ) reg = E1000_READ_REG(hw, EERD); - else + else reg = E1000_READ_REG(hw, EEWR); if(reg & E1000_EEPROM_RW_REG_DONE) { @@ -4636,7 +5042,10 @@ e1000_is_onboard_nvm_eeprom(struct e1000_hw *hw) DEBUGFUNC("e1000_is_onboard_nvm_eeprom"); - if(hw->mac_type == e1000_82573) { + if (hw->mac_type == e1000_ich8lan) + return FALSE; + + if (hw->mac_type == e1000_82573) { eecd = E1000_READ_REG(hw, EECD); /* Isolate bits 15 & 16 */ @@ -4686,8 +5095,22 @@ e1000_validate_eeprom_checksum(struct e1000_hw *hw) } } - for(i = 0; i < (EEPROM_CHECKSUM_REG + 1); i++) { - if(e1000_read_eeprom(hw, i, 1, &eeprom_data) < 0) { + if (hw->mac_type == e1000_ich8lan) { + /* Drivers must allocate the shadow ram structure for the + * EEPROM checksum to be updated. Otherwise, this bit as well + * as the checksum must both be set correctly for this + * validation to pass. + */ + e1000_read_eeprom(hw, 0x19, 1, &eeprom_data); + if ((eeprom_data & 0x40) == 0) { + eeprom_data |= 0x40; + e1000_write_eeprom(hw, 0x19, 1, &eeprom_data); + e1000_update_eeprom_checksum(hw); + } + } + + for (i = 0; i < (EEPROM_CHECKSUM_REG + 1); i++) { + if (e1000_read_eeprom(hw, i, 1, &eeprom_data) < 0) { DEBUGOUT("EEPROM Read Error\n"); return -E1000_ERR_EEPROM; } @@ -4713,6 +5136,7 @@ e1000_validate_eeprom_checksum(struct e1000_hw *hw) int32_t e1000_update_eeprom_checksum(struct e1000_hw *hw) { + uint32_t ctrl_ext; uint16_t checksum = 0; uint16_t i, eeprom_data; @@ -4731,6 +5155,14 @@ e1000_update_eeprom_checksum(struct e1000_hw *hw) return -E1000_ERR_EEPROM; } else if (hw->eeprom.type == e1000_eeprom_flash) { e1000_commit_shadow_ram(hw); + } else if (hw->eeprom.type == e1000_eeprom_ich8) { + e1000_commit_shadow_ram(hw); + /* Reload the EEPROM, or else modifications will not appear + * until after next adapter reset. */ + ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); + ctrl_ext |= E1000_CTRL_EXT_EE_RST; + E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext); + msec_delay(10); } return E1000_SUCCESS; } @@ -4770,6 +5202,9 @@ e1000_write_eeprom(struct e1000_hw *hw, if(eeprom->use_eewr == TRUE) return e1000_write_eeprom_eewr(hw, offset, words, data); + if (eeprom->type == e1000_eeprom_ich8) + return e1000_write_eeprom_ich8(hw, offset, words, data); + /* Prepare the EEPROM for writing */ if (e1000_acquire_eeprom(hw) != E1000_SUCCESS) return -E1000_ERR_EEPROM; @@ -4957,11 +5392,17 @@ e1000_commit_shadow_ram(struct e1000_hw *hw) uint32_t flop = 0; uint32_t i = 0; int32_t error = E1000_SUCCESS; - - /* The flop register will be used to determine if flash type is STM */ - flop = E1000_READ_REG(hw, FLOP); + uint32_t old_bank_offset = 0; + uint32_t new_bank_offset = 0; + uint32_t sector_retries = 0; + uint8_t low_byte = 0; + uint8_t high_byte = 0; + uint8_t temp_byte = 0; + boolean_t sector_write_failed = FALSE; if (hw->mac_type == e1000_82573) { + /* The flop register will be used to determine if flash type is STM */ + flop = E1000_READ_REG(hw, FLOP); for (i=0; i < attempts; i++) { eecd = E1000_READ_REG(hw, EECD); if ((eecd & E1000_EECD_FLUPD) == 0) { @@ -4995,10 +5436,110 @@ e1000_commit_shadow_ram(struct e1000_hw *hw) } } - return error; -} + if (hw->mac_type == e1000_ich8lan && hw->eeprom_shadow_ram != NULL) { + /* We're writing to the opposite bank so if we're on bank 1, + * write to bank 0 etc. We also need to erase the segment that + * is going to be written */ + if (!(E1000_READ_REG(hw, EECD) & E1000_EECD_SEC1VAL)) { + new_bank_offset = hw->flash_bank_size * 2; + old_bank_offset = 0; + e1000_erase_ich8_4k_segment(hw, 1); + } else { + old_bank_offset = hw->flash_bank_size * 2; + new_bank_offset = 0; + e1000_erase_ich8_4k_segment(hw, 0); + } -/****************************************************************************** + do { + sector_write_failed = FALSE; + /* Loop for every byte in the shadow RAM, + * which is in units of words. */ + for (i = 0; i < E1000_SHADOW_RAM_WORDS; i++) { + /* Determine whether to write the value stored + * in the other NVM bank or a modified value stored + * in the shadow RAM */ + if (hw->eeprom_shadow_ram[i].modified == TRUE) { + low_byte = (uint8_t)hw->eeprom_shadow_ram[i].eeprom_word; + e1000_read_ich8_byte(hw, (i << 1) + old_bank_offset, + &temp_byte); + udelay(100); + error = e1000_verify_write_ich8_byte(hw, + (i << 1) + new_bank_offset, + low_byte); + if (error != E1000_SUCCESS) + sector_write_failed = TRUE; + high_byte = + (uint8_t)(hw->eeprom_shadow_ram[i].eeprom_word >> 8); + e1000_read_ich8_byte(hw, (i << 1) + old_bank_offset + 1, + &temp_byte); + udelay(100); + } else { + e1000_read_ich8_byte(hw, (i << 1) + old_bank_offset, + &low_byte); + udelay(100); + error = e1000_verify_write_ich8_byte(hw, + (i << 1) + new_bank_offset, low_byte); + if (error != E1000_SUCCESS) + sector_write_failed = TRUE; + e1000_read_ich8_byte(hw, (i << 1) + old_bank_offset + 1, + &high_byte); + } + + /* If the word is 0x13, then make sure the signature bits + * (15:14) are 11b until the commit has completed. + * This will allow us to write 10b which indicates the + * signature is valid. We want to do this after the write + * has completed so that we don't mark the segment valid + * while the write is still in progress */ + if (i == E1000_ICH8_NVM_SIG_WORD) + high_byte = E1000_ICH8_NVM_SIG_MASK | high_byte; + + error = e1000_verify_write_ich8_byte(hw, + (i << 1) + new_bank_offset + 1, high_byte); + if (error != E1000_SUCCESS) + sector_write_failed = TRUE; + + if (sector_write_failed == FALSE) { + /* Clear the now not used entry in the cache */ + hw->eeprom_shadow_ram[i].modified = FALSE; + hw->eeprom_shadow_ram[i].eeprom_word = 0xFFFF; + } + } + + /* Don't bother writing the segment valid bits if sector + * programming failed. */ + if (sector_write_failed == FALSE) { + /* Finally validate the new segment by setting bit 15:14 + * to 10b in word 0x13 , this can be done without an + * erase as well since these bits are 11 to start with + * and we need to change bit 14 to 0b */ + e1000_read_ich8_byte(hw, + E1000_ICH8_NVM_SIG_WORD * 2 + 1 + new_bank_offset, + &high_byte); + high_byte &= 0xBF; + error = e1000_verify_write_ich8_byte(hw, + E1000_ICH8_NVM_SIG_WORD * 2 + 1 + new_bank_offset, + high_byte); + if (error != E1000_SUCCESS) + sector_write_failed = TRUE; + + /* And invalidate the previously valid segment by setting + * its signature word (0x13) high_byte to 0b. This can be + * done without an erase because flash erase sets all bits + * to 1's. We can write 1's to 0's without an erase */ + error = e1000_verify_write_ich8_byte(hw, + E1000_ICH8_NVM_SIG_WORD * 2 + 1 + old_bank_offset, + 0); + if (error != E1000_SUCCESS) + sector_write_failed = TRUE; + } + } while (++sector_retries < 10 && sector_write_failed == TRUE); + } + + return error; +} + +/****************************************************************************** * Reads the adapter's part number from the EEPROM * * hw - Struct containing variables accessed by shared code @@ -5102,15 +5643,19 @@ e1000_init_rx_addrs(struct e1000_hw *hw) * the other port. */ if ((hw->mac_type == e1000_82571) && (hw->laa_is_present == TRUE)) rar_num -= 1; + if (hw->mac_type == e1000_ich8lan) + rar_num = E1000_RAR_ENTRIES_ICH8LAN; + /* Zero out the other 15 receive addresses. */ DEBUGOUT("Clearing RAR[1-15]\n"); for(i = 1; i < rar_num; i++) { E1000_WRITE_REG_ARRAY(hw, RA, (i << 1), 0); + E1000_WRITE_FLUSH(hw); E1000_WRITE_REG_ARRAY(hw, RA, ((i << 1) + 1), 0); + E1000_WRITE_FLUSH(hw); } } -#if 0 /****************************************************************************** * Updates the MAC's list of multicast addresses. * @@ -5125,6 +5670,7 @@ e1000_init_rx_addrs(struct e1000_hw *hw) * for the first 15 multicast addresses, and hashes the rest into the * multicast table. *****************************************************************************/ +#if 0 void e1000_mc_addr_list_update(struct e1000_hw *hw, uint8_t *mc_addr_list, @@ -5136,7 +5682,7 @@ e1000_mc_addr_list_update(struct e1000_hw *hw, uint32_t i; uint32_t num_rar_entry; uint32_t num_mta_entry; - + DEBUGFUNC("e1000_mc_addr_list_update"); /* Set the new number of MC addresses that we are being requested to use. */ @@ -5145,6 +5691,8 @@ e1000_mc_addr_list_update(struct e1000_hw *hw, /* Clear RAR[1-15] */ DEBUGOUT(" Clearing RAR[1-15]\n"); num_rar_entry = E1000_RAR_ENTRIES; + if (hw->mac_type == e1000_ich8lan) + num_rar_entry = E1000_RAR_ENTRIES_ICH8LAN; /* Reserve a spot for the Locally Administered Address to work around * an 82571 issue in which a reset on one port will reload the MAC on * the other port. */ @@ -5153,14 +5701,19 @@ e1000_mc_addr_list_update(struct e1000_hw *hw, for(i = rar_used_count; i < num_rar_entry; i++) { E1000_WRITE_REG_ARRAY(hw, RA, (i << 1), 0); + E1000_WRITE_FLUSH(hw); E1000_WRITE_REG_ARRAY(hw, RA, ((i << 1) + 1), 0); + E1000_WRITE_FLUSH(hw); } /* Clear the MTA */ DEBUGOUT(" Clearing MTA\n"); num_mta_entry = E1000_NUM_MTA_REGISTERS; + if (hw->mac_type == e1000_ich8lan) + num_mta_entry = E1000_NUM_MTA_REGISTERS_ICH8LAN; for(i = 0; i < num_mta_entry; i++) { E1000_WRITE_REG_ARRAY(hw, MTA, i, 0); + E1000_WRITE_FLUSH(hw); } /* Add the new addresses */ @@ -5217,24 +5770,46 @@ e1000_hash_mc_addr(struct e1000_hw *hw, * LSB MSB */ case 0: - /* [47:36] i.e. 0x563 for above example address */ - hash_value = ((mc_addr[4] >> 4) | (((uint16_t) mc_addr[5]) << 4)); + if (hw->mac_type == e1000_ich8lan) { + /* [47:38] i.e. 0x158 for above example address */ + hash_value = ((mc_addr[4] >> 6) | (((uint16_t) mc_addr[5]) << 2)); + } else { + /* [47:36] i.e. 0x563 for above example address */ + hash_value = ((mc_addr[4] >> 4) | (((uint16_t) mc_addr[5]) << 4)); + } break; case 1: - /* [46:35] i.e. 0xAC6 for above example address */ - hash_value = ((mc_addr[4] >> 3) | (((uint16_t) mc_addr[5]) << 5)); + if (hw->mac_type == e1000_ich8lan) { + /* [46:37] i.e. 0x2B1 for above example address */ + hash_value = ((mc_addr[4] >> 5) | (((uint16_t) mc_addr[5]) << 3)); + } else { + /* [46:35] i.e. 0xAC6 for above example address */ + hash_value = ((mc_addr[4] >> 3) | (((uint16_t) mc_addr[5]) << 5)); + } break; case 2: - /* [45:34] i.e. 0x5D8 for above example address */ - hash_value = ((mc_addr[4] >> 2) | (((uint16_t) mc_addr[5]) << 6)); + if (hw->mac_type == e1000_ich8lan) { + /*[45:36] i.e. 0x163 for above example address */ + hash_value = ((mc_addr[4] >> 4) | (((uint16_t) mc_addr[5]) << 4)); + } else { + /* [45:34] i.e. 0x5D8 for above example address */ + hash_value = ((mc_addr[4] >> 2) | (((uint16_t) mc_addr[5]) << 6)); + } break; case 3: - /* [43:32] i.e. 0x634 for above example address */ - hash_value = ((mc_addr[4]) | (((uint16_t) mc_addr[5]) << 8)); + if (hw->mac_type == e1000_ich8lan) { + /* [43:34] i.e. 0x18D for above example address */ + hash_value = ((mc_addr[4] >> 2) | (((uint16_t) mc_addr[5]) << 6)); + } else { + /* [43:32] i.e. 0x634 for above example address */ + hash_value = ((mc_addr[4]) | (((uint16_t) mc_addr[5]) << 8)); + } break; } hash_value &= 0xFFF; + if (hw->mac_type == e1000_ich8lan) + hash_value &= 0x3FF; return hash_value; } @@ -5262,6 +5837,8 @@ e1000_mta_set(struct e1000_hw *hw, * register are determined by the lower 5 bits of the value. */ hash_reg = (hash_value >> 5) & 0x7F; + if (hw->mac_type == e1000_ich8lan) + hash_reg &= 0x1F; hash_bit = hash_value & 0x1F; mta = E1000_READ_REG_ARRAY(hw, MTA, hash_reg); @@ -5275,9 +5852,12 @@ e1000_mta_set(struct e1000_hw *hw, if((hw->mac_type == e1000_82544) && ((hash_reg & 0x1) == 1)) { temp = E1000_READ_REG_ARRAY(hw, MTA, (hash_reg - 1)); E1000_WRITE_REG_ARRAY(hw, MTA, hash_reg, mta); + E1000_WRITE_FLUSH(hw); E1000_WRITE_REG_ARRAY(hw, MTA, (hash_reg - 1), temp); + E1000_WRITE_FLUSH(hw); } else { E1000_WRITE_REG_ARRAY(hw, MTA, hash_reg, mta); + E1000_WRITE_FLUSH(hw); } } @@ -5334,7 +5914,9 @@ e1000_rar_set(struct e1000_hw *hw, } E1000_WRITE_REG_ARRAY(hw, RA, (index << 1), rar_low); + E1000_WRITE_FLUSH(hw); E1000_WRITE_REG_ARRAY(hw, RA, ((index << 1) + 1), rar_high); + E1000_WRITE_FLUSH(hw); } /****************************************************************************** @@ -5351,12 +5933,18 @@ e1000_write_vfta(struct e1000_hw *hw, { uint32_t temp; - if((hw->mac_type == e1000_82544) && ((offset & 0x1) == 1)) { + if (hw->mac_type == e1000_ich8lan) + return; + + if ((hw->mac_type == e1000_82544) && ((offset & 0x1) == 1)) { temp = E1000_READ_REG_ARRAY(hw, VFTA, (offset - 1)); E1000_WRITE_REG_ARRAY(hw, VFTA, offset, value); + E1000_WRITE_FLUSH(hw); E1000_WRITE_REG_ARRAY(hw, VFTA, (offset - 1), temp); + E1000_WRITE_FLUSH(hw); } else { E1000_WRITE_REG_ARRAY(hw, VFTA, offset, value); + E1000_WRITE_FLUSH(hw); } } @@ -5373,6 +5961,9 @@ e1000_clear_vfta(struct e1000_hw *hw) uint32_t vfta_offset = 0; uint32_t vfta_bit_in_reg = 0; + if (hw->mac_type == e1000_ich8lan) + return; + if (hw->mac_type == e1000_82573) { if (hw->mng_cookie.vlan_id != 0) { /* The VFTA is a 4096b bit-field, each identifying a single VLAN @@ -5392,6 +5983,7 @@ e1000_clear_vfta(struct e1000_hw *hw) * manageability unit */ vfta_value = (offset == vfta_offset) ? vfta_bit_in_reg : 0; E1000_WRITE_REG_ARRAY(hw, VFTA, offset, vfta_value); + E1000_WRITE_FLUSH(hw); } } @@ -5421,9 +6013,18 @@ e1000_id_led_init(struct e1000_hw * hw) DEBUGOUT("EEPROM Read Error\n"); return -E1000_ERR_EEPROM; } - if((eeprom_data== ID_LED_RESERVED_0000) || - (eeprom_data == ID_LED_RESERVED_FFFF)) eeprom_data = ID_LED_DEFAULT; - for(i = 0; i < 4; i++) { + + if ((hw->mac_type == e1000_82573) && + (eeprom_data == ID_LED_RESERVED_82573)) + eeprom_data = ID_LED_DEFAULT_82573; + else if ((eeprom_data == ID_LED_RESERVED_0000) || + (eeprom_data == ID_LED_RESERVED_FFFF)) { + if (hw->mac_type == e1000_ich8lan) + eeprom_data = ID_LED_DEFAULT_ICH8LAN; + else + eeprom_data = ID_LED_DEFAULT; + } + for (i = 0; i < 4; i++) { temp = (eeprom_data >> (i << 2)) & led_mask; switch(temp) { case ID_LED_ON1_DEF2: @@ -5518,6 +6119,44 @@ e1000_setup_led(struct e1000_hw *hw) return E1000_SUCCESS; } +/****************************************************************************** + * Used on 82571 and later Si that has LED blink bits. + * Callers must use their own timer and should have already called + * e1000_id_led_init() + * Call e1000_cleanup led() to stop blinking + * + * hw - Struct containing variables accessed by shared code + *****************************************************************************/ +int32_t +e1000_blink_led_start(struct e1000_hw *hw) +{ + int16_t i; + uint32_t ledctl_blink = 0; + + DEBUGFUNC("e1000_id_led_blink_on"); + + if (hw->mac_type < e1000_82571) { + /* Nothing to do */ + return E1000_SUCCESS; + } + if (hw->media_type == e1000_media_type_fiber) { + /* always blink LED0 for PCI-E fiber */ + ledctl_blink = E1000_LEDCTL_LED0_BLINK | + (E1000_LEDCTL_MODE_LED_ON << E1000_LEDCTL_LED0_MODE_SHIFT); + } else { + /* set the blink bit for each LED that's "on" (0x0E) in ledctl_mode2 */ + ledctl_blink = hw->ledctl_mode2; + for (i=0; i < 4; i++) + if (((hw->ledctl_mode2 >> (i * 8)) & 0xFF) == + E1000_LEDCTL_MODE_LED_ON) + ledctl_blink |= (E1000_LEDCTL_LED0_BLINK << (i * 8)); + } + + E1000_WRITE_REG(hw, LEDCTL, ledctl_blink); + + return E1000_SUCCESS; +} + /****************************************************************************** * Restores the saved state of the SW controlable LED. * @@ -5548,6 +6187,10 @@ e1000_cleanup_led(struct e1000_hw *hw) return ret_val; /* Fall Through */ default: + if (hw->phy_type == e1000_phy_ife) { + e1000_write_phy_reg(hw, IFE_PHY_SPECIAL_CONTROL_LED, 0); + break; + } /* Restore LEDCTL settings */ E1000_WRITE_REG(hw, LEDCTL, hw->ledctl_default); break; @@ -5592,7 +6235,10 @@ e1000_led_on(struct e1000_hw *hw) /* Clear SW Defineable Pin 0 to turn on the LED */ ctrl &= ~E1000_CTRL_SWDPIN0; ctrl |= E1000_CTRL_SWDPIO0; - } else if(hw->media_type == e1000_media_type_copper) { + } else if (hw->phy_type == e1000_phy_ife) { + e1000_write_phy_reg(hw, IFE_PHY_SPECIAL_CONTROL_LED, + (IFE_PSCL_PROBE_MODE | IFE_PSCL_PROBE_LEDS_ON)); + } else if (hw->media_type == e1000_media_type_copper) { E1000_WRITE_REG(hw, LEDCTL, hw->ledctl_mode2); return E1000_SUCCESS; } @@ -5640,7 +6286,10 @@ e1000_led_off(struct e1000_hw *hw) /* Set SW Defineable Pin 0 to turn off the LED */ ctrl |= E1000_CTRL_SWDPIN0; ctrl |= E1000_CTRL_SWDPIO0; - } else if(hw->media_type == e1000_media_type_copper) { + } else if (hw->phy_type == e1000_phy_ife) { + e1000_write_phy_reg(hw, IFE_PHY_SPECIAL_CONTROL_LED, + (IFE_PSCL_PROBE_MODE | IFE_PSCL_PROBE_LEDS_OFF)); + } else if (hw->media_type == e1000_media_type_copper) { E1000_WRITE_REG(hw, LEDCTL, hw->ledctl_mode1); return E1000_SUCCESS; } @@ -5678,12 +6327,16 @@ e1000_clear_hw_cntrs(struct e1000_hw *hw) temp = E1000_READ_REG(hw, XOFFRXC); temp = E1000_READ_REG(hw, XOFFTXC); temp = E1000_READ_REG(hw, FCRUC); + + if (hw->mac_type != e1000_ich8lan) { temp = E1000_READ_REG(hw, PRC64); temp = E1000_READ_REG(hw, PRC127); temp = E1000_READ_REG(hw, PRC255); temp = E1000_READ_REG(hw, PRC511); temp = E1000_READ_REG(hw, PRC1023); temp = E1000_READ_REG(hw, PRC1522); + } + temp = E1000_READ_REG(hw, GPRC); temp = E1000_READ_REG(hw, BPRC); temp = E1000_READ_REG(hw, MPRC); @@ -5703,12 +6356,16 @@ e1000_clear_hw_cntrs(struct e1000_hw *hw) temp = E1000_READ_REG(hw, TOTH); temp = E1000_READ_REG(hw, TPR); temp = E1000_READ_REG(hw, TPT); + + if (hw->mac_type != e1000_ich8lan) { temp = E1000_READ_REG(hw, PTC64); temp = E1000_READ_REG(hw, PTC127); temp = E1000_READ_REG(hw, PTC255); temp = E1000_READ_REG(hw, PTC511); temp = E1000_READ_REG(hw, PTC1023); temp = E1000_READ_REG(hw, PTC1522); + } + temp = E1000_READ_REG(hw, MPTC); temp = E1000_READ_REG(hw, BPTC); @@ -5731,6 +6388,9 @@ e1000_clear_hw_cntrs(struct e1000_hw *hw) temp = E1000_READ_REG(hw, IAC); temp = E1000_READ_REG(hw, ICRXOC); + + if (hw->mac_type == e1000_ich8lan) return; + temp = E1000_READ_REG(hw, ICRXPTC); temp = E1000_READ_REG(hw, ICRXATC); temp = E1000_READ_REG(hw, ICTXPTC); @@ -5911,6 +6571,7 @@ e1000_get_bus_info(struct e1000_hw *hw) hw->bus_width = e1000_bus_width_pciex_1; break; case e1000_82571: + case e1000_ich8lan: case e1000_80003es2lan: hw->bus_type = e1000_bus_type_pci_express; hw->bus_speed = e1000_bus_speed_2500; @@ -5948,8 +6609,6 @@ e1000_get_bus_info(struct e1000_hw *hw) break; } } - -#if 0 /****************************************************************************** * Reads a value from one of the devices registers using port I/O (as opposed * memory mapped I/O). Only 82544 and newer devices support port I/O. @@ -5957,6 +6616,7 @@ e1000_get_bus_info(struct e1000_hw *hw) * hw - Struct containing variables accessed by shared code * offset - offset to read from *****************************************************************************/ +#if 0 uint32_t e1000_read_reg_io(struct e1000_hw *hw, uint32_t offset) @@ -6012,8 +6672,6 @@ e1000_get_cable_length(struct e1000_hw *hw, { int32_t ret_val; uint16_t agc_value = 0; - uint16_t cur_agc, min_agc = IGP01E1000_AGC_LENGTH_TABLE_SIZE; - uint16_t max_agc = 0; uint16_t i, phy_data; uint16_t cable_length; @@ -6086,6 +6744,8 @@ e1000_get_cable_length(struct e1000_hw *hw, break; } } else if(hw->phy_type == e1000_phy_igp) { /* For IGP PHY */ + uint16_t cur_agc_value; + uint16_t min_agc_value = IGP01E1000_AGC_LENGTH_TABLE_SIZE; uint16_t agc_reg_array[IGP01E1000_PHY_CHANNEL_NUM] = {IGP01E1000_PHY_AGC_A, IGP01E1000_PHY_AGC_B, @@ -6098,23 +6758,23 @@ e1000_get_cable_length(struct e1000_hw *hw, if(ret_val) return ret_val; - cur_agc = phy_data >> IGP01E1000_AGC_LENGTH_SHIFT; + cur_agc_value = phy_data >> IGP01E1000_AGC_LENGTH_SHIFT; - /* Array bound check. */ - if((cur_agc >= IGP01E1000_AGC_LENGTH_TABLE_SIZE - 1) || - (cur_agc == 0)) + /* Value bound check. */ + if ((cur_agc_value >= IGP01E1000_AGC_LENGTH_TABLE_SIZE - 1) || + (cur_agc_value == 0)) return -E1000_ERR_PHY; - agc_value += cur_agc; + agc_value += cur_agc_value; /* Update minimal AGC value. */ - if(min_agc > cur_agc) - min_agc = cur_agc; + if (min_agc_value > cur_agc_value) + min_agc_value = cur_agc_value; } /* Remove the minimal AGC result for length < 50m */ - if(agc_value < IGP01E1000_PHY_CHANNEL_NUM * e1000_igp_cable_length_50) { - agc_value -= min_agc; + if (agc_value < IGP01E1000_PHY_CHANNEL_NUM * e1000_igp_cable_length_50) { + agc_value -= min_agc_value; /* Get the average length of the remaining 3 channels */ agc_value /= (IGP01E1000_PHY_CHANNEL_NUM - 1); @@ -6130,7 +6790,10 @@ e1000_get_cable_length(struct e1000_hw *hw, IGP01E1000_AGC_RANGE) : 0; *max_length = e1000_igp_cable_length_table[agc_value] + IGP01E1000_AGC_RANGE; - } else if (hw->phy_type == e1000_phy_igp_2) { + } else if (hw->phy_type == e1000_phy_igp_2 || + hw->phy_type == e1000_phy_igp_3) { + uint16_t cur_agc_index, max_agc_index = 0; + uint16_t min_agc_index = IGP02E1000_AGC_LENGTH_TABLE_SIZE - 1; uint16_t agc_reg_array[IGP02E1000_PHY_CHANNEL_NUM] = {IGP02E1000_PHY_AGC_A, IGP02E1000_PHY_AGC_B, @@ -6145,19 +6808,27 @@ e1000_get_cable_length(struct e1000_hw *hw, /* Getting bits 15:9, which represent the combination of course and * fine gain values. The result is a number that can be put into * the lookup table to obtain the approximate cable length. */ - cur_agc = (phy_data >> IGP02E1000_AGC_LENGTH_SHIFT) & - IGP02E1000_AGC_LENGTH_MASK; + cur_agc_index = (phy_data >> IGP02E1000_AGC_LENGTH_SHIFT) & + IGP02E1000_AGC_LENGTH_MASK; - /* Remove min & max AGC values from calculation. */ - if (e1000_igp_2_cable_length_table[min_agc] > e1000_igp_2_cable_length_table[cur_agc]) - min_agc = cur_agc; - if (e1000_igp_2_cable_length_table[max_agc] < e1000_igp_2_cable_length_table[cur_agc]) - max_agc = cur_agc; + /* Array index bound check. */ + if ((cur_agc_index >= IGP02E1000_AGC_LENGTH_TABLE_SIZE) || + (cur_agc_index == 0)) + return -E1000_ERR_PHY; - agc_value += e1000_igp_2_cable_length_table[cur_agc]; + /* Remove min & max AGC values from calculation. */ + if (e1000_igp_2_cable_length_table[min_agc_index] > + e1000_igp_2_cable_length_table[cur_agc_index]) + min_agc_index = cur_agc_index; + if (e1000_igp_2_cable_length_table[max_agc_index] < + e1000_igp_2_cable_length_table[cur_agc_index]) + max_agc_index = cur_agc_index; + + agc_value += e1000_igp_2_cable_length_table[cur_agc_index]; } - agc_value -= (e1000_igp_2_cable_length_table[min_agc] + e1000_igp_2_cable_length_table[max_agc]); + agc_value -= (e1000_igp_2_cable_length_table[min_agc_index] + + e1000_igp_2_cable_length_table[max_agc_index]); agc_value /= (IGP02E1000_PHY_CHANNEL_NUM - 2); /* Calculate cable length with the error range of +/- 10 meters. */ @@ -6203,7 +6874,8 @@ e1000_check_polarity(struct e1000_hw *hw, return ret_val; *polarity = (phy_data & M88E1000_PSSR_REV_POLARITY) >> M88E1000_PSSR_REV_POLARITY_SHIFT; - } else if(hw->phy_type == e1000_phy_igp || + } else if (hw->phy_type == e1000_phy_igp || + hw->phy_type == e1000_phy_igp_3 || hw->phy_type == e1000_phy_igp_2) { /* Read the Status register to check the speed */ ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_STATUS, @@ -6229,6 +6901,13 @@ e1000_check_polarity(struct e1000_hw *hw, * 100 Mbps this bit is always 0) */ *polarity = phy_data & IGP01E1000_PSSR_POLARITY_REVERSED; } + } else if (hw->phy_type == e1000_phy_ife) { + ret_val = e1000_read_phy_reg(hw, IFE_PHY_EXTENDED_STATUS_CONTROL, + &phy_data); + if (ret_val) + return ret_val; + *polarity = (phy_data & IFE_PESC_POLARITY_REVERSED) >> + IFE_PESC_POLARITY_REVERSED_SHIFT; } return E1000_SUCCESS; } @@ -6241,7 +6920,7 @@ e1000_check_polarity(struct e1000_hw *hw, * 1 - Downshift ocured. * * returns: - E1000_ERR_XXX - * E1000_SUCCESS + * E1000_SUCCESS * * For phy's older then IGP, this function reads the Downshift bit in the Phy * Specific Status register. For IGP phy's, it reads the Downgrade bit in the @@ -6256,7 +6935,8 @@ e1000_check_downshift(struct e1000_hw *hw) DEBUGFUNC("e1000_check_downshift"); - if(hw->phy_type == e1000_phy_igp || + if (hw->phy_type == e1000_phy_igp || + hw->phy_type == e1000_phy_igp_3 || hw->phy_type == e1000_phy_igp_2) { ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_LINK_HEALTH, &phy_data); @@ -6273,6 +6953,9 @@ e1000_check_downshift(struct e1000_hw *hw) hw->speed_downgraded = (phy_data & M88E1000_PSSR_DOWNSHIFT) >> M88E1000_PSSR_DOWNSHIFT_SHIFT; + } else if (hw->phy_type == e1000_phy_ife) { + /* e1000_phy_ife supports 10/100 speed only */ + hw->speed_downgraded = FALSE; } return E1000_SUCCESS; @@ -6317,7 +7000,9 @@ e1000_config_dsp_after_link_change(struct e1000_hw *hw, if(speed == SPEED_1000) { - e1000_get_cable_length(hw, &min_length, &max_length); + ret_val = e1000_get_cable_length(hw, &min_length, &max_length); + if (ret_val) + return ret_val; if((hw->dsp_config_state == e1000_dsp_config_enabled) && min_length >= e1000_igp_cable_length_50) { @@ -6525,20 +7210,27 @@ static int32_t e1000_set_d3_lplu_state(struct e1000_hw *hw, boolean_t active) { + uint32_t phy_ctrl = 0; int32_t ret_val; uint16_t phy_data; DEBUGFUNC("e1000_set_d3_lplu_state"); - if(hw->phy_type != e1000_phy_igp && hw->phy_type != e1000_phy_igp_2) + if (hw->phy_type != e1000_phy_igp && hw->phy_type != e1000_phy_igp_2 + && hw->phy_type != e1000_phy_igp_3) return E1000_SUCCESS; /* During driver activity LPLU should not be used or it will attain link * from the lowest speeds starting from 10Mbps. The capability is used for * Dx transitions and states */ - if(hw->mac_type == e1000_82541_rev_2 || hw->mac_type == e1000_82547_rev_2) { + if (hw->mac_type == e1000_82541_rev_2 || hw->mac_type == e1000_82547_rev_2) { ret_val = e1000_read_phy_reg(hw, IGP01E1000_GMII_FIFO, &phy_data); - if(ret_val) + if (ret_val) return ret_val; + } else if (hw->mac_type == e1000_ich8lan) { + /* MAC writes into PHY register based on the state transition + * and start auto-negotiation. SW driver can overwrite the settings + * in CSR PHY power control E1000_PHY_CTRL register. */ + phy_ctrl = E1000_READ_REG(hw, PHY_CTRL); } else { ret_val = e1000_read_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, &phy_data); if(ret_val) @@ -6553,11 +7245,16 @@ e1000_set_d3_lplu_state(struct e1000_hw *hw, if(ret_val) return ret_val; } else { + if (hw->mac_type == e1000_ich8lan) { + phy_ctrl &= ~E1000_PHY_CTRL_NOND0A_LPLU; + E1000_WRITE_REG(hw, PHY_CTRL, phy_ctrl); + } else { phy_data &= ~IGP02E1000_PM_D3_LPLU; ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, phy_data); if (ret_val) return ret_val; + } } /* LPLU and SmartSpeed are mutually exclusive. LPLU is used during @@ -6593,17 +7290,22 @@ e1000_set_d3_lplu_state(struct e1000_hw *hw, (hw->autoneg_advertised == AUTONEG_ADVERTISE_10_100_ALL)) { if(hw->mac_type == e1000_82541_rev_2 || - hw->mac_type == e1000_82547_rev_2) { + hw->mac_type == e1000_82547_rev_2) { phy_data |= IGP01E1000_GMII_FLEX_SPD; ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO, phy_data); if(ret_val) return ret_val; } else { + if (hw->mac_type == e1000_ich8lan) { + phy_ctrl |= E1000_PHY_CTRL_NOND0A_LPLU; + E1000_WRITE_REG(hw, PHY_CTRL, phy_ctrl); + } else { phy_data |= IGP02E1000_PM_D3_LPLU; ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, phy_data); if (ret_val) return ret_val; + } } /* When LPLU is enabled we should disable SmartSpeed */ @@ -6638,6 +7340,7 @@ static int32_t e1000_set_d0_lplu_state(struct e1000_hw *hw, boolean_t active) { + uint32_t phy_ctrl = 0; int32_t ret_val; uint16_t phy_data; DEBUGFUNC("e1000_set_d0_lplu_state"); @@ -6645,15 +7348,24 @@ e1000_set_d0_lplu_state(struct e1000_hw *hw, if(hw->mac_type <= e1000_82547_rev_2) return E1000_SUCCESS; + if (hw->mac_type == e1000_ich8lan) { + phy_ctrl = E1000_READ_REG(hw, PHY_CTRL); + } else { ret_val = e1000_read_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, &phy_data); if(ret_val) return ret_val; + } if (!active) { + if (hw->mac_type == e1000_ich8lan) { + phy_ctrl &= ~E1000_PHY_CTRL_D0A_LPLU; + E1000_WRITE_REG(hw, PHY_CTRL, phy_ctrl); + } else { phy_data &= ~IGP02E1000_PM_D0_LPLU; ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, phy_data); if (ret_val) return ret_val; + } /* LPLU and SmartSpeed are mutually exclusive. LPLU is used during * Dx states where the power conservation is most important. During @@ -6685,11 +7397,16 @@ e1000_set_d0_lplu_state(struct e1000_hw *hw, } else { - - phy_data |= IGP02E1000_PM_D0_LPLU; + + if (hw->mac_type == e1000_ich8lan) { + phy_ctrl |= E1000_PHY_CTRL_D0A_LPLU; + E1000_WRITE_REG(hw, PHY_CTRL, phy_ctrl); + } else { + phy_data |= IGP02E1000_PM_D0_LPLU; ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, phy_data); if (ret_val) return ret_val; + } /* When LPLU is enabled we should disable SmartSpeed */ ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, &phy_data); @@ -6778,7 +7495,7 @@ int32_t e1000_host_if_read_cookie(struct e1000_hw * hw, uint8_t *buffer) { uint8_t i; - uint32_t offset = E1000_MNG_DHCP_COOKIE_OFFSET; + uint32_t offset = E1000_MNG_DHCP_COOKIE_OFFSET; uint8_t length = E1000_MNG_DHCP_COOKIE_LENGTH; length = (length >> 2); @@ -6797,7 +7514,7 @@ e1000_host_if_read_cookie(struct e1000_hw * hw, uint8_t *buffer) * and also checks whether the previous command is completed. * It busy waits in case of previous command is not completed. * - * returns: - E1000_ERR_HOST_INTERFACE_COMMAND in case if is not ready or + * returns: - E1000_ERR_HOST_INTERFACE_COMMAND in case if is not ready or * timeout * - E1000_SUCCESS for success. ****************************************************************************/ @@ -6821,7 +7538,7 @@ e1000_mng_enable_host_if(struct e1000_hw * hw) msec_delay_irq(1); } - if (i == E1000_MNG_DHCP_COMMAND_TIMEOUT) { + if (i == E1000_MNG_DHCP_COMMAND_TIMEOUT) { DEBUGOUT("Previous command timeout failed .\n"); return -E1000_ERR_HOST_INTERFACE_COMMAND; } @@ -6928,8 +7645,10 @@ e1000_mng_write_cmd_header(struct e1000_hw * hw, length >>= 2; /* The device driver writes the relevant command block into the ram area. */ - for (i = 0; i < length; i++) + for (i = 0; i < length; i++) { E1000_WRITE_REG_ARRAY_DWORD(hw, HOST_IF, i, *((uint32_t *) hdr + i)); + E1000_WRITE_FLUSH(hw); + } return E1000_SUCCESS; } @@ -6961,15 +7680,18 @@ e1000_mng_write_commit( * returns - TRUE when the mode is IAMT or FALSE. ****************************************************************************/ boolean_t -e1000_check_mng_mode( - struct e1000_hw *hw) +e1000_check_mng_mode(struct e1000_hw *hw) { uint32_t fwsm; fwsm = E1000_READ_REG(hw, FWSM); - if((fwsm & E1000_FWSM_MODE_MASK) == - (E1000_MNG_IAMT_MODE << E1000_FWSM_MODE_SHIFT)) + if (hw->mac_type == e1000_ich8lan) { + if ((fwsm & E1000_FWSM_MODE_MASK) == + (E1000_MNG_ICH_IAMT_MODE << E1000_FWSM_MODE_SHIFT)) + return TRUE; + } else if ((fwsm & E1000_FWSM_MODE_MASK) == + (E1000_MNG_IAMT_MODE << E1000_FWSM_MODE_SHIFT)) return TRUE; return FALSE; @@ -7209,7 +7931,6 @@ e1000_set_pci_express_master_disable(struct e1000_hw *hw) E1000_WRITE_REG(hw, CTRL, ctrl); } -#if 0 /*************************************************************************** * * Enables PCI-Express master access. @@ -7219,6 +7940,7 @@ e1000_set_pci_express_master_disable(struct e1000_hw *hw) * returns: - none. * ***************************************************************************/ +#if 0 void e1000_enable_pciex_master(struct e1000_hw *hw) { @@ -7299,8 +8021,10 @@ e1000_get_auto_rd_done(struct e1000_hw *hw) case e1000_82572: case e1000_82573: case e1000_80003es2lan: - while(timeout) { - if (E1000_READ_REG(hw, EECD) & E1000_EECD_AUTO_RD) break; + case e1000_ich8lan: + while (timeout) { + if (E1000_READ_REG(hw, EECD) & E1000_EECD_AUTO_RD) + break; else msec_delay(1); timeout--; } @@ -7340,7 +8064,7 @@ e1000_get_phy_cfg_done(struct e1000_hw *hw) switch (hw->mac_type) { default: - msec_delay(10); + msec_delay_irq(10); break; case e1000_80003es2lan: /* Separate *_CFG_DONE_* bit for each port */ @@ -7457,7 +8181,7 @@ e1000_put_hw_eeprom_semaphore(struct e1000_hw *hw) * E1000_SUCCESS at any other case. * ***************************************************************************/ -int32_t +static int32_t e1000_get_software_semaphore(struct e1000_hw *hw) { int32_t timeout = hw->eeprom.word_size + 1; @@ -7492,7 +8216,7 @@ e1000_get_software_semaphore(struct e1000_hw *hw) * hw: Struct containing variables accessed by shared code * ***************************************************************************/ -void +static void e1000_release_software_semaphore(struct e1000_hw *hw) { uint32_t swsm; @@ -7523,6 +8247,13 @@ int32_t e1000_check_phy_reset_block(struct e1000_hw *hw) { uint32_t manc = 0; + uint32_t fwsm = 0; + + if (hw->mac_type == e1000_ich8lan) { + fwsm = E1000_READ_REG(hw, FWSM); + return (fwsm & E1000_FWSM_RSPCIPHY) ? E1000_SUCCESS + : E1000_BLK_PHY_RESET; + } if (hw->mac_type > e1000_82547_rev_2) manc = E1000_READ_REG(hw, MANC); @@ -7549,6 +8280,8 @@ e1000_arc_subsystem_valid(struct e1000_hw *hw) if((fwsm & E1000_FWSM_MODE_MASK) != 0) return TRUE; break; + case e1000_ich8lan: + return TRUE; default: break; } @@ -7556,4 +8289,854 @@ e1000_arc_subsystem_valid(struct e1000_hw *hw) } +/****************************************************************************** + * Configure PCI-Ex no-snoop + * + * hw - Struct containing variables accessed by shared code. + * no_snoop - Bitmap of no-snoop events. + * + * returns: E1000_SUCCESS + * + *****************************************************************************/ +static int32_t +e1000_set_pci_ex_no_snoop(struct e1000_hw *hw, uint32_t no_snoop) +{ + uint32_t gcr_reg = 0; + + DEBUGFUNC("e1000_set_pci_ex_no_snoop"); + + if (hw->bus_type == e1000_bus_type_unknown) + e1000_get_bus_info(hw); + + if (hw->bus_type != e1000_bus_type_pci_express) + return E1000_SUCCESS; + + if (no_snoop) { + gcr_reg = E1000_READ_REG(hw, GCR); + gcr_reg &= ~(PCI_EX_NO_SNOOP_ALL); + gcr_reg |= no_snoop; + E1000_WRITE_REG(hw, GCR, gcr_reg); + } + if (hw->mac_type == e1000_ich8lan) { + uint32_t ctrl_ext; + + E1000_WRITE_REG(hw, GCR, PCI_EX_82566_SNOOP_ALL); + + ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); + ctrl_ext |= E1000_CTRL_EXT_RO_DIS; + E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext); + } + + return E1000_SUCCESS; +} + +/*************************************************************************** + * + * Get software semaphore FLAG bit (SWFLAG). + * SWFLAG is used to synchronize the access to all shared resource between + * SW, FW and HW. + * + * hw: Struct containing variables accessed by shared code + * + ***************************************************************************/ +static int32_t +e1000_get_software_flag(struct e1000_hw *hw) +{ + int32_t timeout = PHY_CFG_TIMEOUT; + uint32_t extcnf_ctrl; + + DEBUGFUNC("e1000_get_software_flag"); + + if (hw->mac_type == e1000_ich8lan) { + while (timeout) { + extcnf_ctrl = E1000_READ_REG(hw, EXTCNF_CTRL); + extcnf_ctrl |= E1000_EXTCNF_CTRL_SWFLAG; + E1000_WRITE_REG(hw, EXTCNF_CTRL, extcnf_ctrl); + + extcnf_ctrl = E1000_READ_REG(hw, EXTCNF_CTRL); + if (extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG) + break; + msec_delay_irq(1); + timeout--; + } + + if (!timeout) { + DEBUGOUT("FW or HW locks the resource too long.\n"); + return -E1000_ERR_CONFIG; + } + } + + return E1000_SUCCESS; +} + +/*************************************************************************** + * + * Release software semaphore FLAG bit (SWFLAG). + * SWFLAG is used to synchronize the access to all shared resource between + * SW, FW and HW. + * + * hw: Struct containing variables accessed by shared code + * + ***************************************************************************/ +static void +e1000_release_software_flag(struct e1000_hw *hw) +{ + uint32_t extcnf_ctrl; + + DEBUGFUNC("e1000_release_software_flag"); + + if (hw->mac_type == e1000_ich8lan) { + extcnf_ctrl= E1000_READ_REG(hw, EXTCNF_CTRL); + extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG; + E1000_WRITE_REG(hw, EXTCNF_CTRL, extcnf_ctrl); + } + + return; +} + +/*************************************************************************** + * + * Disable dynamic power down mode in ife PHY. + * It can be used to workaround band-gap problem. + * + * hw: Struct containing variables accessed by shared code + * + ***************************************************************************/ +#if 0 +int32_t +e1000_ife_disable_dynamic_power_down(struct e1000_hw *hw) +{ + uint16_t phy_data; + int32_t ret_val = E1000_SUCCESS; + + DEBUGFUNC("e1000_ife_disable_dynamic_power_down"); + + if (hw->phy_type == e1000_phy_ife) { + ret_val = e1000_read_phy_reg(hw, IFE_PHY_SPECIAL_CONTROL, &phy_data); + if (ret_val) + return ret_val; + + phy_data |= IFE_PSC_DISABLE_DYNAMIC_POWER_DOWN; + ret_val = e1000_write_phy_reg(hw, IFE_PHY_SPECIAL_CONTROL, phy_data); + } + + return ret_val; +} +#endif /* 0 */ + +/*************************************************************************** + * + * Enable dynamic power down mode in ife PHY. + * It can be used to workaround band-gap problem. + * + * hw: Struct containing variables accessed by shared code + * + ***************************************************************************/ +#if 0 +int32_t +e1000_ife_enable_dynamic_power_down(struct e1000_hw *hw) +{ + uint16_t phy_data; + int32_t ret_val = E1000_SUCCESS; + + DEBUGFUNC("e1000_ife_enable_dynamic_power_down"); + + if (hw->phy_type == e1000_phy_ife) { + ret_val = e1000_read_phy_reg(hw, IFE_PHY_SPECIAL_CONTROL, &phy_data); + if (ret_val) + return ret_val; + + phy_data &= ~IFE_PSC_DISABLE_DYNAMIC_POWER_DOWN; + ret_val = e1000_write_phy_reg(hw, IFE_PHY_SPECIAL_CONTROL, phy_data); + } + + return ret_val; +} +#endif /* 0 */ + +/****************************************************************************** + * Reads a 16 bit word or words from the EEPROM using the ICH8's flash access + * register. + * + * hw - Struct containing variables accessed by shared code + * offset - offset of word in the EEPROM to read + * data - word read from the EEPROM + * words - number of words to read + *****************************************************************************/ +static int32_t +e1000_read_eeprom_ich8(struct e1000_hw *hw, uint16_t offset, uint16_t words, + uint16_t *data) +{ + int32_t error = E1000_SUCCESS; + uint32_t flash_bank = 0; + uint32_t act_offset = 0; + uint32_t bank_offset = 0; + uint16_t word = 0; + uint16_t i = 0; + + /* We need to know which is the valid flash bank. In the event + * that we didn't allocate eeprom_shadow_ram, we may not be + * managing flash_bank. So it cannot be trusted and needs + * to be updated with each read. + */ + /* Value of bit 22 corresponds to the flash bank we're on. */ + flash_bank = (E1000_READ_REG(hw, EECD) & E1000_EECD_SEC1VAL) ? 1 : 0; + + /* Adjust offset appropriately if we're on bank 1 - adjust for word size */ + bank_offset = flash_bank * (hw->flash_bank_size * 2); + + error = e1000_get_software_flag(hw); + if (error != E1000_SUCCESS) + return error; + + for (i = 0; i < words; i++) { + if (hw->eeprom_shadow_ram != NULL && + hw->eeprom_shadow_ram[offset+i].modified == TRUE) { + data[i] = hw->eeprom_shadow_ram[offset+i].eeprom_word; + } else { + /* The NVM part needs a byte offset, hence * 2 */ + act_offset = bank_offset + ((offset + i) * 2); + error = e1000_read_ich8_word(hw, act_offset, &word); + if (error != E1000_SUCCESS) + break; + data[i] = word; + } + } + + e1000_release_software_flag(hw); + + return error; +} + +/****************************************************************************** + * Writes a 16 bit word or words to the EEPROM using the ICH8's flash access + * register. Actually, writes are written to the shadow ram cache in the hw + * structure hw->e1000_shadow_ram. e1000_commit_shadow_ram flushes this to + * the NVM, which occurs when the NVM checksum is updated. + * + * hw - Struct containing variables accessed by shared code + * offset - offset of word in the EEPROM to write + * words - number of words to write + * data - words to write to the EEPROM + *****************************************************************************/ +static int32_t +e1000_write_eeprom_ich8(struct e1000_hw *hw, uint16_t offset, uint16_t words, + uint16_t *data) +{ + uint32_t i = 0; + int32_t error = E1000_SUCCESS; + + error = e1000_get_software_flag(hw); + if (error != E1000_SUCCESS) + return error; + + /* A driver can write to the NVM only if it has eeprom_shadow_ram + * allocated. Subsequent reads to the modified words are read from + * this cached structure as well. Writes will only go into this + * cached structure unless it's followed by a call to + * e1000_update_eeprom_checksum() where it will commit the changes + * and clear the "modified" field. + */ + if (hw->eeprom_shadow_ram != NULL) { + for (i = 0; i < words; i++) { + if ((offset + i) < E1000_SHADOW_RAM_WORDS) { + hw->eeprom_shadow_ram[offset+i].modified = TRUE; + hw->eeprom_shadow_ram[offset+i].eeprom_word = data[i]; + } else { + error = -E1000_ERR_EEPROM; + break; + } + } + } else { + /* Drivers have the option to not allocate eeprom_shadow_ram as long + * as they don't perform any NVM writes. An attempt in doing so + * will result in this error. + */ + error = -E1000_ERR_EEPROM; + } + + e1000_release_software_flag(hw); + + return error; +} + +/****************************************************************************** + * This function does initial flash setup so that a new read/write/erase cycle + * can be started. + * + * hw - The pointer to the hw structure + ****************************************************************************/ +static int32_t +e1000_ich8_cycle_init(struct e1000_hw *hw) +{ + union ich8_hws_flash_status hsfsts; + int32_t error = E1000_ERR_EEPROM; + int32_t i = 0; + + DEBUGFUNC("e1000_ich8_cycle_init"); + + hsfsts.regval = E1000_READ_ICH8_REG16(hw, ICH8_FLASH_HSFSTS); + + /* May be check the Flash Des Valid bit in Hw status */ + if (hsfsts.hsf_status.fldesvalid == 0) { + DEBUGOUT("Flash descriptor invalid. SW Sequencing must be used."); + return error; + } + + /* Clear FCERR in Hw status by writing 1 */ + /* Clear DAEL in Hw status by writing a 1 */ + hsfsts.hsf_status.flcerr = 1; + hsfsts.hsf_status.dael = 1; + + E1000_WRITE_ICH8_REG16(hw, ICH8_FLASH_HSFSTS, hsfsts.regval); + + /* Either we should have a hardware SPI cycle in progress bit to check + * against, in order to start a new cycle or FDONE bit should be changed + * in the hardware so that it is 1 after harware reset, which can then be + * used as an indication whether a cycle is in progress or has been + * completed .. we should also have some software semaphore mechanism to + * guard FDONE or the cycle in progress bit so that two threads access to + * those bits can be sequentiallized or a way so that 2 threads dont + * start the cycle at the same time */ + + if (hsfsts.hsf_status.flcinprog == 0) { + /* There is no cycle running at present, so we can start a cycle */ + /* Begin by setting Flash Cycle Done. */ + hsfsts.hsf_status.flcdone = 1; + E1000_WRITE_ICH8_REG16(hw, ICH8_FLASH_HSFSTS, hsfsts.regval); + error = E1000_SUCCESS; + } else { + /* otherwise poll for sometime so the current cycle has a chance + * to end before giving up. */ + for (i = 0; i < ICH8_FLASH_COMMAND_TIMEOUT; i++) { + hsfsts.regval = E1000_READ_ICH8_REG16(hw, ICH8_FLASH_HSFSTS); + if (hsfsts.hsf_status.flcinprog == 0) { + error = E1000_SUCCESS; + break; + } + udelay(1); + } + if (error == E1000_SUCCESS) { + /* Successful in waiting for previous cycle to timeout, + * now set the Flash Cycle Done. */ + hsfsts.hsf_status.flcdone = 1; + E1000_WRITE_ICH8_REG16(hw, ICH8_FLASH_HSFSTS, hsfsts.regval); + } else { + DEBUGOUT("Flash controller busy, cannot get access"); + } + } + return error; +} + +/****************************************************************************** + * This function starts a flash cycle and waits for its completion + * + * hw - The pointer to the hw structure + ****************************************************************************/ +static int32_t +e1000_ich8_flash_cycle(struct e1000_hw *hw, uint32_t timeout) +{ + union ich8_hws_flash_ctrl hsflctl; + union ich8_hws_flash_status hsfsts; + int32_t error = E1000_ERR_EEPROM; + uint32_t i = 0; + + /* Start a cycle by writing 1 in Flash Cycle Go in Hw Flash Control */ + hsflctl.regval = E1000_READ_ICH8_REG16(hw, ICH8_FLASH_HSFCTL); + hsflctl.hsf_ctrl.flcgo = 1; + E1000_WRITE_ICH8_REG16(hw, ICH8_FLASH_HSFCTL, hsflctl.regval); + + /* wait till FDONE bit is set to 1 */ + do { + hsfsts.regval = E1000_READ_ICH8_REG16(hw, ICH8_FLASH_HSFSTS); + if (hsfsts.hsf_status.flcdone == 1) + break; + udelay(1); + i++; + } while (i < timeout); + if (hsfsts.hsf_status.flcdone == 1 && hsfsts.hsf_status.flcerr == 0) { + error = E1000_SUCCESS; + } + return error; +} + +/****************************************************************************** + * Reads a byte or word from the NVM using the ICH8 flash access registers. + * + * hw - The pointer to the hw structure + * index - The index of the byte or word to read. + * size - Size of data to read, 1=byte 2=word + * data - Pointer to the word to store the value read. + *****************************************************************************/ +static int32_t +e1000_read_ich8_data(struct e1000_hw *hw, uint32_t index, + uint32_t size, uint16_t* data) +{ + union ich8_hws_flash_status hsfsts; + union ich8_hws_flash_ctrl hsflctl; + uint32_t flash_linear_address; + uint32_t flash_data = 0; + int32_t error = -E1000_ERR_EEPROM; + int32_t count = 0; + + DEBUGFUNC("e1000_read_ich8_data"); + + if (size < 1 || size > 2 || data == 0x0 || + index > ICH8_FLASH_LINEAR_ADDR_MASK) + return error; + + flash_linear_address = (ICH8_FLASH_LINEAR_ADDR_MASK & index) + + hw->flash_base_addr; + + do { + udelay(1); + /* Steps */ + error = e1000_ich8_cycle_init(hw); + if (error != E1000_SUCCESS) + break; + + hsflctl.regval = E1000_READ_ICH8_REG16(hw, ICH8_FLASH_HSFCTL); + /* 0b/1b corresponds to 1 or 2 byte size, respectively. */ + hsflctl.hsf_ctrl.fldbcount = size - 1; + hsflctl.hsf_ctrl.flcycle = ICH8_CYCLE_READ; + E1000_WRITE_ICH8_REG16(hw, ICH8_FLASH_HSFCTL, hsflctl.regval); + + /* Write the last 24 bits of index into Flash Linear address field in + * Flash Address */ + /* TODO: TBD maybe check the index against the size of flash */ + + E1000_WRITE_ICH8_REG(hw, ICH8_FLASH_FADDR, flash_linear_address); + + error = e1000_ich8_flash_cycle(hw, ICH8_FLASH_COMMAND_TIMEOUT); + + /* Check if FCERR is set to 1, if set to 1, clear it and try the whole + * sequence a few more times, else read in (shift in) the Flash Data0, + * the order is least significant byte first msb to lsb */ + if (error == E1000_SUCCESS) { + flash_data = E1000_READ_ICH8_REG(hw, ICH8_FLASH_FDATA0); + if (size == 1) { + *data = (uint8_t)(flash_data & 0x000000FF); + } else if (size == 2) { + *data = (uint16_t)(flash_data & 0x0000FFFF); + } + break; + } else { + /* If we've gotten here, then things are probably completely hosed, + * but if the error condition is detected, it won't hurt to give + * it another try...ICH8_FLASH_CYCLE_REPEAT_COUNT times. + */ + hsfsts.regval = E1000_READ_ICH8_REG16(hw, ICH8_FLASH_HSFSTS); + if (hsfsts.hsf_status.flcerr == 1) { + /* Repeat for some time before giving up. */ + continue; + } else if (hsfsts.hsf_status.flcdone == 0) { + DEBUGOUT("Timeout error - flash cycle did not complete."); + break; + } + } + } while (count++ < ICH8_FLASH_CYCLE_REPEAT_COUNT); + + return error; +} + +/****************************************************************************** + * Writes One /two bytes to the NVM using the ICH8 flash access registers. + * + * hw - The pointer to the hw structure + * index - The index of the byte/word to read. + * size - Size of data to read, 1=byte 2=word + * data - The byte(s) to write to the NVM. + *****************************************************************************/ +static int32_t +e1000_write_ich8_data(struct e1000_hw *hw, uint32_t index, uint32_t size, + uint16_t data) +{ + union ich8_hws_flash_status hsfsts; + union ich8_hws_flash_ctrl hsflctl; + uint32_t flash_linear_address; + uint32_t flash_data = 0; + int32_t error = -E1000_ERR_EEPROM; + int32_t count = 0; + + DEBUGFUNC("e1000_write_ich8_data"); + + if (size < 1 || size > 2 || data > size * 0xff || + index > ICH8_FLASH_LINEAR_ADDR_MASK) + return error; + + flash_linear_address = (ICH8_FLASH_LINEAR_ADDR_MASK & index) + + hw->flash_base_addr; + + do { + udelay(1); + /* Steps */ + error = e1000_ich8_cycle_init(hw); + if (error != E1000_SUCCESS) + break; + + hsflctl.regval = E1000_READ_ICH8_REG16(hw, ICH8_FLASH_HSFCTL); + /* 0b/1b corresponds to 1 or 2 byte size, respectively. */ + hsflctl.hsf_ctrl.fldbcount = size -1; + hsflctl.hsf_ctrl.flcycle = ICH8_CYCLE_WRITE; + E1000_WRITE_ICH8_REG16(hw, ICH8_FLASH_HSFCTL, hsflctl.regval); + + /* Write the last 24 bits of index into Flash Linear address field in + * Flash Address */ + E1000_WRITE_ICH8_REG(hw, ICH8_FLASH_FADDR, flash_linear_address); + + if (size == 1) + flash_data = (uint32_t)data & 0x00FF; + else + flash_data = (uint32_t)data; + + E1000_WRITE_ICH8_REG(hw, ICH8_FLASH_FDATA0, flash_data); + + /* check if FCERR is set to 1 , if set to 1, clear it and try the whole + * sequence a few more times else done */ + error = e1000_ich8_flash_cycle(hw, ICH8_FLASH_COMMAND_TIMEOUT); + if (error == E1000_SUCCESS) { + break; + } else { + /* If we're here, then things are most likely completely hosed, + * but if the error condition is detected, it won't hurt to give + * it another try...ICH8_FLASH_CYCLE_REPEAT_COUNT times. + */ + hsfsts.regval = E1000_READ_ICH8_REG16(hw, ICH8_FLASH_HSFSTS); + if (hsfsts.hsf_status.flcerr == 1) { + /* Repeat for some time before giving up. */ + continue; + } else if (hsfsts.hsf_status.flcdone == 0) { + DEBUGOUT("Timeout error - flash cycle did not complete."); + break; + } + } + } while (count++ < ICH8_FLASH_CYCLE_REPEAT_COUNT); + + return error; +} + +/****************************************************************************** + * Reads a single byte from the NVM using the ICH8 flash access registers. + * + * hw - pointer to e1000_hw structure + * index - The index of the byte to read. + * data - Pointer to a byte to store the value read. + *****************************************************************************/ +static int32_t +e1000_read_ich8_byte(struct e1000_hw *hw, uint32_t index, uint8_t* data) +{ + int32_t status = E1000_SUCCESS; + uint16_t word = 0; + + status = e1000_read_ich8_data(hw, index, 1, &word); + if (status == E1000_SUCCESS) { + *data = (uint8_t)word; + } + + return status; +} + +/****************************************************************************** + * Writes a single byte to the NVM using the ICH8 flash access registers. + * Performs verification by reading back the value and then going through + * a retry algorithm before giving up. + * + * hw - pointer to e1000_hw structure + * index - The index of the byte to write. + * byte - The byte to write to the NVM. + *****************************************************************************/ +static int32_t +e1000_verify_write_ich8_byte(struct e1000_hw *hw, uint32_t index, uint8_t byte) +{ + int32_t error = E1000_SUCCESS; + int32_t program_retries; + uint8_t temp_byte; + + e1000_write_ich8_byte(hw, index, byte); + udelay(100); + + for (program_retries = 0; program_retries < 100; program_retries++) { + e1000_read_ich8_byte(hw, index, &temp_byte); + if (temp_byte == byte) + break; + udelay(10); + e1000_write_ich8_byte(hw, index, byte); + udelay(100); + } + if (program_retries == 100) + error = E1000_ERR_EEPROM; + + return error; +} + +/****************************************************************************** + * Writes a single byte to the NVM using the ICH8 flash access registers. + * + * hw - pointer to e1000_hw structure + * index - The index of the byte to read. + * data - The byte to write to the NVM. + *****************************************************************************/ +static int32_t +e1000_write_ich8_byte(struct e1000_hw *hw, uint32_t index, uint8_t data) +{ + int32_t status = E1000_SUCCESS; + uint16_t word = (uint16_t)data; + + status = e1000_write_ich8_data(hw, index, 1, word); + + return status; +} + +/****************************************************************************** + * Reads a word from the NVM using the ICH8 flash access registers. + * + * hw - pointer to e1000_hw structure + * index - The starting byte index of the word to read. + * data - Pointer to a word to store the value read. + *****************************************************************************/ +static int32_t +e1000_read_ich8_word(struct e1000_hw *hw, uint32_t index, uint16_t *data) +{ + int32_t status = E1000_SUCCESS; + status = e1000_read_ich8_data(hw, index, 2, data); + return status; +} + +/****************************************************************************** + * Writes a word to the NVM using the ICH8 flash access registers. + * + * hw - pointer to e1000_hw structure + * index - The starting byte index of the word to read. + * data - The word to write to the NVM. + *****************************************************************************/ +#if 0 +int32_t +e1000_write_ich8_word(struct e1000_hw *hw, uint32_t index, uint16_t data) +{ + int32_t status = E1000_SUCCESS; + status = e1000_write_ich8_data(hw, index, 2, data); + return status; +} +#endif /* 0 */ + +/****************************************************************************** + * Erases the bank specified. Each bank is a 4k block. Segments are 0 based. + * segment N is 4096 * N + flash_reg_addr. + * + * hw - pointer to e1000_hw structure + * segment - 0 for first segment, 1 for second segment, etc. + *****************************************************************************/ +static int32_t +e1000_erase_ich8_4k_segment(struct e1000_hw *hw, uint32_t segment) +{ + union ich8_hws_flash_status hsfsts; + union ich8_hws_flash_ctrl hsflctl; + uint32_t flash_linear_address; + int32_t count = 0; + int32_t error = E1000_ERR_EEPROM; + int32_t iteration, seg_size; + int32_t sector_size; + int32_t j = 0; + int32_t error_flag = 0; + + hsfsts.regval = E1000_READ_ICH8_REG16(hw, ICH8_FLASH_HSFSTS); + + /* Determine HW Sector size: Read BERASE bits of Hw flash Status register */ + /* 00: The Hw sector is 256 bytes, hence we need to erase 16 + * consecutive sectors. The start index for the nth Hw sector can be + * calculated as = segment * 4096 + n * 256 + * 01: The Hw sector is 4K bytes, hence we need to erase 1 sector. + * The start index for the nth Hw sector can be calculated + * as = segment * 4096 + * 10: Error condition + * 11: The Hw sector size is much bigger than the size asked to + * erase...error condition */ + if (hsfsts.hsf_status.berasesz == 0x0) { + /* Hw sector size 256 */ + sector_size = seg_size = ICH8_FLASH_SEG_SIZE_256; + iteration = ICH8_FLASH_SECTOR_SIZE / ICH8_FLASH_SEG_SIZE_256; + } else if (hsfsts.hsf_status.berasesz == 0x1) { + sector_size = seg_size = ICH8_FLASH_SEG_SIZE_4K; + iteration = 1; + } else if (hsfsts.hsf_status.berasesz == 0x3) { + sector_size = seg_size = ICH8_FLASH_SEG_SIZE_64K; + iteration = 1; + } else { + return error; + } + + for (j = 0; j < iteration ; j++) { + do { + count++; + /* Steps */ + error = e1000_ich8_cycle_init(hw); + if (error != E1000_SUCCESS) { + error_flag = 1; + break; + } + + /* Write a value 11 (block Erase) in Flash Cycle field in Hw flash + * Control */ + hsflctl.regval = E1000_READ_ICH8_REG16(hw, ICH8_FLASH_HSFCTL); + hsflctl.hsf_ctrl.flcycle = ICH8_CYCLE_ERASE; + E1000_WRITE_ICH8_REG16(hw, ICH8_FLASH_HSFCTL, hsflctl.regval); + + /* Write the last 24 bits of an index within the block into Flash + * Linear address field in Flash Address. This probably needs to + * be calculated here based off the on-chip segment size and the + * software segment size assumed (4K) */ + /* TBD */ + flash_linear_address = segment * sector_size + j * seg_size; + flash_linear_address &= ICH8_FLASH_LINEAR_ADDR_MASK; + flash_linear_address += hw->flash_base_addr; + + E1000_WRITE_ICH8_REG(hw, ICH8_FLASH_FADDR, flash_linear_address); + + error = e1000_ich8_flash_cycle(hw, 1000000); + /* Check if FCERR is set to 1. If 1, clear it and try the whole + * sequence a few more times else Done */ + if (error == E1000_SUCCESS) { + break; + } else { + hsfsts.regval = E1000_READ_ICH8_REG16(hw, ICH8_FLASH_HSFSTS); + if (hsfsts.hsf_status.flcerr == 1) { + /* repeat for some time before giving up */ + continue; + } else if (hsfsts.hsf_status.flcdone == 0) { + error_flag = 1; + break; + } + } + } while ((count < ICH8_FLASH_CYCLE_REPEAT_COUNT) && !error_flag); + if (error_flag == 1) + break; + } + if (error_flag != 1) + error = E1000_SUCCESS; + return error; +} + +/****************************************************************************** + * + * Reverse duplex setting without breaking the link. + * + * hw: Struct containing variables accessed by shared code + * + *****************************************************************************/ +#if 0 +int32_t +e1000_duplex_reversal(struct e1000_hw *hw) +{ + int32_t ret_val; + uint16_t phy_data; + + if (hw->phy_type != e1000_phy_igp_3) + return E1000_SUCCESS; + + ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &phy_data); + if (ret_val) + return ret_val; + + phy_data ^= MII_CR_FULL_DUPLEX; + + ret_val = e1000_write_phy_reg(hw, PHY_CTRL, phy_data); + if (ret_val) + return ret_val; + + ret_val = e1000_read_phy_reg(hw, IGP3E1000_PHY_MISC_CTRL, &phy_data); + if (ret_val) + return ret_val; + + phy_data |= IGP3_PHY_MISC_DUPLEX_MANUAL_SET; + ret_val = e1000_write_phy_reg(hw, IGP3E1000_PHY_MISC_CTRL, phy_data); + + return ret_val; +} +#endif /* 0 */ + +static int32_t +e1000_init_lcd_from_nvm_config_region(struct e1000_hw *hw, + uint32_t cnf_base_addr, uint32_t cnf_size) +{ + uint32_t ret_val = E1000_SUCCESS; + uint16_t word_addr, reg_data, reg_addr; + uint16_t i; + + /* cnf_base_addr is in DWORD */ + word_addr = (uint16_t)(cnf_base_addr << 1); + + /* cnf_size is returned in size of dwords */ + for (i = 0; i < cnf_size; i++) { + ret_val = e1000_read_eeprom(hw, (word_addr + i*2), 1, ®_data); + if (ret_val) + return ret_val; + + ret_val = e1000_read_eeprom(hw, (word_addr + i*2 + 1), 1, ®_addr); + if (ret_val) + return ret_val; + + ret_val = e1000_get_software_flag(hw); + if (ret_val != E1000_SUCCESS) + return ret_val; + + ret_val = e1000_write_phy_reg_ex(hw, (uint32_t)reg_addr, reg_data); + + e1000_release_software_flag(hw); + } + + return ret_val; +} + + +static int32_t +e1000_init_lcd_from_nvm(struct e1000_hw *hw) +{ + uint32_t reg_data, cnf_base_addr, cnf_size, ret_val, loop; + + if (hw->phy_type != e1000_phy_igp_3) + return E1000_SUCCESS; + + /* Check if SW needs configure the PHY */ + reg_data = E1000_READ_REG(hw, FEXTNVM); + if (!(reg_data & FEXTNVM_SW_CONFIG)) + return E1000_SUCCESS; + + /* Wait for basic configuration completes before proceeding*/ + loop = 0; + do { + reg_data = E1000_READ_REG(hw, STATUS) & E1000_STATUS_LAN_INIT_DONE; + udelay(100); + loop++; + } while ((!reg_data) && (loop < 50)); + + /* Clear the Init Done bit for the next init event */ + reg_data = E1000_READ_REG(hw, STATUS); + reg_data &= ~E1000_STATUS_LAN_INIT_DONE; + E1000_WRITE_REG(hw, STATUS, reg_data); + + /* Make sure HW does not configure LCD from PHY extended configuration + before SW configuration */ + reg_data = E1000_READ_REG(hw, EXTCNF_CTRL); + if ((reg_data & E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE) == 0x0000) { + reg_data = E1000_READ_REG(hw, EXTCNF_SIZE); + cnf_size = reg_data & E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH; + cnf_size >>= 16; + if (cnf_size) { + reg_data = E1000_READ_REG(hw, EXTCNF_CTRL); + cnf_base_addr = reg_data & E1000_EXTCNF_CTRL_EXT_CNF_POINTER; + /* cnf_base_addr is in DWORD */ + cnf_base_addr >>= 16; + + /* Configure LCD from extended configuration region. */ + ret_val = e1000_init_lcd_from_nvm_config_region(hw, cnf_base_addr, + cnf_size); + if (ret_val) + return ret_val; + } + } + + return E1000_SUCCESS; +} + + diff --git a/drivers/net/e1000/e1000_hw.h b/drivers/net/e1000/e1000_hw.h index c01e5d2e5..375b95518 100644 --- a/drivers/net/e1000/e1000_hw.h +++ b/drivers/net/e1000/e1000_hw.h @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2006 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 @@ -22,6 +22,7 @@ Contact Information: Linux NICS + e1000-devel Mailing List Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 *******************************************************************************/ @@ -61,6 +62,7 @@ typedef enum { e1000_82572, e1000_82573, e1000_80003es2lan, + e1000_ich8lan, e1000_num_macs } e1000_mac_type; @@ -69,6 +71,7 @@ typedef enum { e1000_eeprom_spi, e1000_eeprom_microwire, e1000_eeprom_flash, + e1000_eeprom_ich8, e1000_eeprom_none, /* No NVM support */ e1000_num_eeprom_types } e1000_eeprom_type; @@ -97,6 +100,11 @@ typedef enum { e1000_fc_default = 0xFF } e1000_fc_type; +struct e1000_shadow_ram { + uint16_t eeprom_word; + boolean_t modified; +}; + /* PCI bus types */ typedef enum { e1000_bus_type_unknown = 0, @@ -217,6 +225,8 @@ typedef enum { e1000_phy_igp, e1000_phy_igp_2, e1000_phy_gg82563, + e1000_phy_igp_3, + e1000_phy_ife, e1000_phy_undefined = 0xFF } e1000_phy_type; @@ -312,10 +322,9 @@ int32_t e1000_read_phy_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t *phy int32_t e1000_write_phy_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t data); int32_t e1000_phy_hw_reset(struct e1000_hw *hw); int32_t e1000_phy_reset(struct e1000_hw *hw); +void e1000_phy_powerdown_workaround(struct e1000_hw *hw); int32_t e1000_phy_get_info(struct e1000_hw *hw, struct e1000_phy_info *phy_info); int32_t e1000_validate_mdi_setting(struct e1000_hw *hw); -int32_t e1000_read_kmrn_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t *data); -int32_t e1000_write_kmrn_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t data); /* EEPROM Functions */ int32_t e1000_init_eeprom_params(struct e1000_hw *hw); @@ -330,6 +339,7 @@ uint32_t e1000_enable_mng_pass_thru(struct e1000_hw *hw); #define E1000_MNG_DHCP_COOKIE_OFFSET 0x6F0 /* Cookie offset */ #define E1000_MNG_DHCP_COOKIE_LENGTH 0x10 /* Cookie length */ #define E1000_MNG_IAMT_MODE 0x3 +#define E1000_MNG_ICH_IAMT_MODE 0x2 #define E1000_IAMT_SIGNATURE 0x544D4149 /* Intel(R) Active Management Technology signature */ #define E1000_MNG_DHCP_COOKIE_STATUS_PARSING_SUPPORT 0x1 /* DHCP parsing enabled */ @@ -374,7 +384,7 @@ struct e1000_host_mng_dhcp_cookie{ }; #endif -int32_t e1000_mng_write_dhcp_info(struct e1000_hw *hw, uint8_t *buffer, +int32_t e1000_mng_write_dhcp_info(struct e1000_hw *hw, uint8_t *buffer, uint16_t length); boolean_t e1000_check_mng_mode(struct e1000_hw *hw); boolean_t e1000_enable_tx_pkt_filtering(struct e1000_hw *hw); @@ -385,11 +395,8 @@ int32_t e1000_update_eeprom_checksum(struct e1000_hw *hw); int32_t e1000_write_eeprom(struct e1000_hw *hw, uint16_t reg, uint16_t words, uint16_t *data); int32_t e1000_read_part_num(struct e1000_hw *hw, uint32_t * part_num); int32_t e1000_read_mac_addr(struct e1000_hw * hw); -int32_t e1000_swfw_sync_acquire(struct e1000_hw *hw, uint16_t mask); -void e1000_swfw_sync_release(struct e1000_hw *hw, uint16_t mask); /* Filters (multicast, vlan, receive) */ -void e1000_mc_addr_list_update(struct e1000_hw *hw, uint8_t * mc_addr_list, uint32_t mc_addr_count, uint32_t pad, uint32_t rar_used_count); uint32_t e1000_hash_mc_addr(struct e1000_hw *hw, uint8_t * mc_addr); void e1000_mta_set(struct e1000_hw *hw, uint32_t hash_value); void e1000_rar_set(struct e1000_hw *hw, uint8_t * mc_addr, uint32_t rar_index); @@ -400,6 +407,7 @@ int32_t e1000_setup_led(struct e1000_hw *hw); int32_t e1000_cleanup_led(struct e1000_hw *hw); int32_t e1000_led_on(struct e1000_hw *hw); int32_t e1000_led_off(struct e1000_hw *hw); +int32_t e1000_blink_led_start(struct e1000_hw *hw); /* Adaptive IFS Functions */ @@ -413,15 +421,16 @@ void e1000_pci_clear_mwi(struct e1000_hw *hw); void e1000_read_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t * value); void e1000_write_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t * value); /* Port I/O is only supported on 82544 and newer */ -uint32_t e1000_io_read(struct e1000_hw *hw, unsigned long port); -uint32_t e1000_read_reg_io(struct e1000_hw *hw, uint32_t offset); void e1000_io_write(struct e1000_hw *hw, unsigned long port, uint32_t value); -void e1000_enable_pciex_master(struct e1000_hw *hw); int32_t e1000_disable_pciex_master(struct e1000_hw *hw); -int32_t e1000_get_software_semaphore(struct e1000_hw *hw); -void e1000_release_software_semaphore(struct e1000_hw *hw); int32_t e1000_check_phy_reset_block(struct e1000_hw *hw); + +#define E1000_READ_REG_IO(a, reg) \ + e1000_read_reg_io((a), E1000_##reg) +#define E1000_WRITE_REG_IO(a, reg, val) \ + e1000_write_reg_io((a), E1000_##reg, val) + /* PCI Device IDs */ #define E1000_DEV_ID_82542 0x1000 #define E1000_DEV_ID_82543GC_FIBER 0x1001 @@ -445,6 +454,7 @@ int32_t e1000_check_phy_reset_block(struct e1000_hw *hw); #define E1000_DEV_ID_82546EB_QUAD_COPPER 0x101D #define E1000_DEV_ID_82541EI 0x1013 #define E1000_DEV_ID_82541EI_MOBILE 0x1018 +#define E1000_DEV_ID_82541ER_LOM 0x1014 #define E1000_DEV_ID_82541ER 0x1078 #define E1000_DEV_ID_82547GI 0x1075 #define E1000_DEV_ID_82541GI 0x1076 @@ -456,6 +466,7 @@ int32_t e1000_check_phy_reset_block(struct e1000_hw *hw); #define E1000_DEV_ID_82546GB_PCIE 0x108A #define E1000_DEV_ID_82546GB_QUAD_COPPER 0x1099 #define E1000_DEV_ID_82547EI 0x1019 +#define E1000_DEV_ID_82547EI_MOBILE 0x101A #define E1000_DEV_ID_82571EB_COPPER 0x105E #define E1000_DEV_ID_82571EB_FIBER 0x105F #define E1000_DEV_ID_82571EB_SERDES 0x1060 @@ -469,6 +480,14 @@ int32_t e1000_check_phy_reset_block(struct e1000_hw *hw); #define E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3 0x10B5 #define E1000_DEV_ID_80003ES2LAN_COPPER_DPT 0x1096 #define E1000_DEV_ID_80003ES2LAN_SERDES_DPT 0x1098 +#define E1000_DEV_ID_80003ES2LAN_COPPER_SPT 0x10BA +#define E1000_DEV_ID_80003ES2LAN_SERDES_SPT 0x10BB + +#define E1000_DEV_ID_ICH8_IGP_M_AMT 0x1049 +#define E1000_DEV_ID_ICH8_IGP_AMT 0x104A +#define E1000_DEV_ID_ICH8_IGP_C 0x104B +#define E1000_DEV_ID_ICH8_IFE 0x104C +#define E1000_DEV_ID_ICH8_IGP_M 0x104D #define NODE_ADDRESS_SIZE 6 @@ -539,6 +558,14 @@ int32_t e1000_check_phy_reset_block(struct e1000_hw *hw); E1000_IMS_RXSEQ | \ E1000_IMS_LSC) +/* Additional interrupts need to be handled for e1000_ich8lan: + DSW = The FW changed the status of the DISSW bit in FWSM + PHYINT = The LAN connected device generates an interrupt + EPRST = Manageability reset event */ +#define IMS_ICH8LAN_ENABLE_MASK (\ + E1000_IMS_DSW | \ + E1000_IMS_PHYINT | \ + E1000_IMS_EPRST) /* Number of high/low register pairs in the RAR. The RAR (Receive Address * Registers) holds the directed and multicast addresses that we monitor. We @@ -546,6 +573,7 @@ int32_t e1000_check_phy_reset_block(struct e1000_hw *hw); * E1000_RAR_ENTRIES - 1 multicast addresses. */ #define E1000_RAR_ENTRIES 15 +#define E1000_RAR_ENTRIES_ICH8LAN 7 #define MIN_NUMBER_OF_DESCRIPTORS 8 #define MAX_NUMBER_OF_DESCRIPTORS 0xFFF8 @@ -767,6 +795,9 @@ struct e1000_data_desc { #define E1000_MC_TBL_SIZE 128 /* Multicast Filter Table (4096 bits) */ #define E1000_VLAN_FILTER_TBL_SIZE 128 /* VLAN Filter Table (4096 bits) */ +#define E1000_NUM_UNICAST_ICH8LAN 7 +#define E1000_MC_TBL_SIZE_ICH8LAN 32 + /* Receive Address Register */ struct e1000_rar { @@ -776,6 +807,7 @@ struct e1000_rar { /* Number of entries in the Multicast Table Array (MTA). */ #define E1000_NUM_MTA_REGISTERS 128 +#define E1000_NUM_MTA_REGISTERS_ICH8LAN 32 /* IPv4 Address Table Entry */ struct e1000_ipv4_at_entry { @@ -786,6 +818,7 @@ struct e1000_ipv4_at_entry { /* Four wakeup IP addresses are supported */ #define E1000_WAKEUP_IP_ADDRESS_COUNT_MAX 4 #define E1000_IP4AT_SIZE E1000_WAKEUP_IP_ADDRESS_COUNT_MAX +#define E1000_IP4AT_SIZE_ICH8LAN 3 #define E1000_IP6AT_SIZE 1 /* IPv6 Address Table Entry */ @@ -844,6 +877,7 @@ struct e1000_ffvt_entry { #define E1000_FLA 0x0001C /* Flash Access - RW */ #define E1000_MDIC 0x00020 /* MDI Control - RW */ #define E1000_SCTL 0x00024 /* SerDes Control - RW */ +#define E1000_FEXTNVM 0x00028 /* Future Extended NVM register */ #define E1000_FCAL 0x00028 /* Flow Control Address Low - RW */ #define E1000_FCAH 0x0002C /* Flow Control Address High -RW */ #define E1000_FCT 0x00030 /* Flow Control Type - RW */ @@ -872,6 +906,8 @@ struct e1000_ffvt_entry { #define E1000_LEDCTL 0x00E00 /* LED Control - RW */ #define E1000_EXTCNF_CTRL 0x00F00 /* Extended Configuration Control */ #define E1000_EXTCNF_SIZE 0x00F08 /* Extended Configuration Size */ +#define E1000_PHY_CTRL 0x00F10 /* PHY Control Register in CSR */ +#define FEXTNVM_SW_CONFIG 0x0001 #define E1000_PBA 0x01000 /* Packet Buffer Allocation - RW */ #define E1000_PBS 0x01008 /* Packet Buffer Size */ #define E1000_EEMNGCTL 0x01010 /* MNG EEprom Control */ @@ -899,11 +935,13 @@ struct e1000_ffvt_entry { #define E1000_RDH0 E1000_RDH /* RX Desc Head (0) - RW */ #define E1000_RDT0 E1000_RDT /* RX Desc Tail (0) - RW */ #define E1000_RDTR0 E1000_RDTR /* RX Delay Timer (0) - RW */ -#define E1000_RXDCTL 0x02828 /* RX Descriptor Control - RW */ +#define E1000_RXDCTL 0x02828 /* RX Descriptor Control queue 0 - RW */ +#define E1000_RXDCTL1 0x02928 /* RX Descriptor Control queue 1 - RW */ #define E1000_RADV 0x0282C /* RX Interrupt Absolute Delay Timer - RW */ #define E1000_RSRPD 0x02C00 /* RX Small Packet Detect - RW */ #define E1000_RAID 0x02C08 /* Receive Ack Interrupt Delay - RW */ #define E1000_TXDMAC 0x03000 /* TX DMA Control - RW */ +#define E1000_KABGTXD 0x03004 /* AFE Band Gap Transmit Ref Data */ #define E1000_TDFH 0x03410 /* TX Data FIFO Head - RW */ #define E1000_TDFT 0x03418 /* TX Data FIFO Tail - RW */ #define E1000_TDFHS 0x03420 /* TX Data FIFO Head Saved - RW */ @@ -1050,6 +1088,7 @@ struct e1000_ffvt_entry { #define E1000_82542_FLA E1000_FLA #define E1000_82542_MDIC E1000_MDIC #define E1000_82542_SCTL E1000_SCTL +#define E1000_82542_FEXTNVM E1000_FEXTNVM #define E1000_82542_FCAL E1000_FCAL #define E1000_82542_FCAH E1000_FCAH #define E1000_82542_FCT E1000_FCT @@ -1073,6 +1112,19 @@ struct e1000_ffvt_entry { #define E1000_82542_RDLEN0 E1000_82542_RDLEN #define E1000_82542_RDH0 E1000_82542_RDH #define E1000_82542_RDT0 E1000_82542_RDT +#define E1000_82542_SRRCTL(_n) (0x280C + ((_n) << 8)) /* Split and Replication + * RX Control - RW */ +#define E1000_82542_DCA_RXCTRL(_n) (0x02814 + ((_n) << 8)) +#define E1000_82542_RDBAH3 0x02B04 /* RX Desc Base High Queue 3 - RW */ +#define E1000_82542_RDBAL3 0x02B00 /* RX Desc Low Queue 3 - RW */ +#define E1000_82542_RDLEN3 0x02B08 /* RX Desc Length Queue 3 - RW */ +#define E1000_82542_RDH3 0x02B10 /* RX Desc Head Queue 3 - RW */ +#define E1000_82542_RDT3 0x02B18 /* RX Desc Tail Queue 3 - RW */ +#define E1000_82542_RDBAL2 0x02A00 /* RX Desc Base Low Queue 2 - RW */ +#define E1000_82542_RDBAH2 0x02A04 /* RX Desc Base High Queue 2 - RW */ +#define E1000_82542_RDLEN2 0x02A08 /* RX Desc Length Queue 2 - RW */ +#define E1000_82542_RDH2 0x02A10 /* RX Desc Head Queue 2 - RW */ +#define E1000_82542_RDT2 0x02A18 /* RX Desc Tail Queue 2 - RW */ #define E1000_82542_RDTR1 0x00130 #define E1000_82542_RDBAL1 0x00138 #define E1000_82542_RDBAH1 0x0013C @@ -1110,11 +1162,14 @@ struct e1000_ffvt_entry { #define E1000_82542_FLOP E1000_FLOP #define E1000_82542_EXTCNF_CTRL E1000_EXTCNF_CTRL #define E1000_82542_EXTCNF_SIZE E1000_EXTCNF_SIZE +#define E1000_82542_PHY_CTRL E1000_PHY_CTRL #define E1000_82542_ERT E1000_ERT #define E1000_82542_RXDCTL E1000_RXDCTL +#define E1000_82542_RXDCTL1 E1000_RXDCTL1 #define E1000_82542_RADV E1000_RADV #define E1000_82542_RSRPD E1000_RSRPD #define E1000_82542_TXDMAC E1000_TXDMAC +#define E1000_82542_KABGTXD E1000_KABGTXD #define E1000_82542_TDFHS E1000_TDFHS #define E1000_82542_TDFTS E1000_TDFTS #define E1000_82542_TDFPC E1000_TDFPC @@ -1310,13 +1365,16 @@ struct e1000_hw_stats { /* Structure containing variables used by the shared code (e1000_hw.c) */ struct e1000_hw { - uint8_t __iomem *hw_addr; + uint8_t *hw_addr; uint8_t *flash_address; e1000_mac_type mac_type; e1000_phy_type phy_type; uint32_t phy_init_script; e1000_media_type media_type; void *back; + struct e1000_shadow_ram *eeprom_shadow_ram; + uint32_t flash_bank_size; + uint32_t flash_base_addr; e1000_fc_type fc; e1000_bus_speed bus_speed; e1000_bus_width bus_width; @@ -1328,6 +1386,7 @@ struct e1000_hw { uint32_t asf_firmware_present; uint32_t eeprom_semaphore_present; uint32_t swfw_sync_present; + uint32_t swfwhw_semaphore_present; unsigned long io_base; uint32_t phy_id; uint32_t phy_revision; @@ -1387,6 +1446,7 @@ struct e1000_hw { boolean_t in_ifs_mode; boolean_t mng_reg_access_disabled; boolean_t leave_av_bit_off; + boolean_t kmrn_lock_loss_workaround_disabled; }; @@ -1435,6 +1495,7 @@ struct e1000_hw { #define E1000_CTRL_RTE 0x20000000 /* Routing tag enable */ #define E1000_CTRL_VME 0x40000000 /* IEEE VLAN mode enable */ #define E1000_CTRL_PHY_RST 0x80000000 /* PHY Reset */ +#define E1000_CTRL_SW2FW_INT 0x02000000 /* Initiate an interrupt to manageability engine */ /* Device Status */ #define E1000_STATUS_FD 0x00000001 /* Full duplex.0=half,1=full */ @@ -1449,6 +1510,8 @@ struct e1000_hw { #define E1000_STATUS_SPEED_10 0x00000000 /* Speed 10Mb/s */ #define E1000_STATUS_SPEED_100 0x00000040 /* Speed 100Mb/s */ #define E1000_STATUS_SPEED_1000 0x00000080 /* Speed 1000Mb/s */ +#define E1000_STATUS_LAN_INIT_DONE 0x00000200 /* Lan Init Completion + by EEPROM/Flash */ #define E1000_STATUS_ASDV 0x00000300 /* Auto speed detect value */ #define E1000_STATUS_DOCK_CI 0x00000800 /* Change in Dock/Undock state. Clear on write '0'. */ #define E1000_STATUS_GIO_MASTER_ENABLE 0x00080000 /* Status of Master requests. */ @@ -1506,6 +1569,10 @@ struct e1000_hw { #define E1000_STM_OPCODE 0xDB00 #define E1000_HICR_FW_RESET 0xC0 +#define E1000_SHADOW_RAM_WORDS 2048 +#define E1000_ICH8_NVM_SIG_WORD 0x13 +#define E1000_ICH8_NVM_SIG_MASK 0xC0 + /* EEPROM Read */ #define E1000_EERD_START 0x00000001 /* Start Read */ #define E1000_EERD_DONE 0x00000010 /* Read Done */ @@ -1551,7 +1618,6 @@ struct e1000_hw { #define E1000_CTRL_EXT_WR_WMARK_320 0x01000000 #define E1000_CTRL_EXT_WR_WMARK_384 0x02000000 #define E1000_CTRL_EXT_WR_WMARK_448 0x03000000 -#define E1000_CTRL_EXT_CANC 0x04000000 /* Interrupt delay cancellation */ #define E1000_CTRL_EXT_DRV_LOAD 0x10000000 /* Driver loaded bit for FW */ #define E1000_CTRL_EXT_IAME 0x08000000 /* Interrupt acknowledge Auto-mask */ #define E1000_CTRL_EXT_INT_TIMER_CLR 0x20000000 /* Clear Interrupt timers after IMS clear */ @@ -1591,12 +1657,31 @@ struct e1000_hw { #define E1000_KUMCTRLSTA_FIFO_CTRL_TX_BYPASS 0x00000800 /* In-Band Control */ +#define E1000_KUMCTRLSTA_INB_CTRL_LINK_STATUS_TX_TIMEOUT_DEFAULT 0x00000500 #define E1000_KUMCTRLSTA_INB_CTRL_DIS_PADDING 0x00000010 /* Half-Duplex Control */ #define E1000_KUMCTRLSTA_HD_CTRL_10_100_DEFAULT 0x00000004 #define E1000_KUMCTRLSTA_HD_CTRL_1000_DEFAULT 0x00000000 +#define E1000_KUMCTRLSTA_OFFSET_K0S_CTRL 0x0000001E + +#define E1000_KUMCTRLSTA_DIAG_FELPBK 0x2000 +#define E1000_KUMCTRLSTA_DIAG_NELPBK 0x1000 + +#define E1000_KUMCTRLSTA_K0S_100_EN 0x2000 +#define E1000_KUMCTRLSTA_K0S_GBE_EN 0x1000 +#define E1000_KUMCTRLSTA_K0S_ENTRY_LATENCY_MASK 0x0003 + +#define E1000_KABGTXD_BGSQLBIAS 0x00050000 + +#define E1000_PHY_CTRL_SPD_EN 0x00000001 +#define E1000_PHY_CTRL_D0A_LPLU 0x00000002 +#define E1000_PHY_CTRL_NOND0A_LPLU 0x00000004 +#define E1000_PHY_CTRL_NOND0A_GBE_DISABLE 0x00000008 +#define E1000_PHY_CTRL_GBE_DISABLE 0x00000040 +#define E1000_PHY_CTRL_B2B_EN 0x00000080 + /* LED Control */ #define E1000_LEDCTL_LED0_MODE_MASK 0x0000000F #define E1000_LEDCTL_LED0_MODE_SHIFT 0 @@ -1666,6 +1751,9 @@ struct e1000_hw { #define E1000_ICR_RXD_FIFO_PAR1 0x01000000 /* queue 1 Rx descriptor FIFO parity error */ #define E1000_ICR_TXD_FIFO_PAR1 0x02000000 /* queue 1 Tx descriptor FIFO parity error */ #define E1000_ICR_ALL_PARITY 0x03F00000 /* all parity error bits */ +#define E1000_ICR_DSW 0x00000020 /* FW changed the status of DISSW bit in the FWSM */ +#define E1000_ICR_PHYINT 0x00001000 /* LAN connected device generates an interrupt */ +#define E1000_ICR_EPRST 0x00100000 /* ME handware reset occurs */ /* Interrupt Cause Set */ #define E1000_ICS_TXDW E1000_ICR_TXDW /* Transmit desc written back */ @@ -1692,6 +1780,9 @@ struct e1000_hw { #define E1000_ICS_PB_PAR E1000_ICR_PB_PAR /* packet buffer parity error */ #define E1000_ICS_RXD_FIFO_PAR1 E1000_ICR_RXD_FIFO_PAR1 /* queue 1 Rx descriptor FIFO parity error */ #define E1000_ICS_TXD_FIFO_PAR1 E1000_ICR_TXD_FIFO_PAR1 /* queue 1 Tx descriptor FIFO parity error */ +#define E1000_ICS_DSW E1000_ICR_DSW +#define E1000_ICS_PHYINT E1000_ICR_PHYINT +#define E1000_ICS_EPRST E1000_ICR_EPRST /* Interrupt Mask Set */ #define E1000_IMS_TXDW E1000_ICR_TXDW /* Transmit desc written back */ @@ -1718,6 +1809,9 @@ struct e1000_hw { #define E1000_IMS_PB_PAR E1000_ICR_PB_PAR /* packet buffer parity error */ #define E1000_IMS_RXD_FIFO_PAR1 E1000_ICR_RXD_FIFO_PAR1 /* queue 1 Rx descriptor FIFO parity error */ #define E1000_IMS_TXD_FIFO_PAR1 E1000_ICR_TXD_FIFO_PAR1 /* queue 1 Tx descriptor FIFO parity error */ +#define E1000_IMS_DSW E1000_ICR_DSW +#define E1000_IMS_PHYINT E1000_ICR_PHYINT +#define E1000_IMS_EPRST E1000_ICR_EPRST /* Interrupt Mask Clear */ #define E1000_IMC_TXDW E1000_ICR_TXDW /* Transmit desc written back */ @@ -1744,6 +1838,9 @@ struct e1000_hw { #define E1000_IMC_PB_PAR E1000_ICR_PB_PAR /* packet buffer parity error */ #define E1000_IMC_RXD_FIFO_PAR1 E1000_ICR_RXD_FIFO_PAR1 /* queue 1 Rx descriptor FIFO parity error */ #define E1000_IMC_TXD_FIFO_PAR1 E1000_ICR_TXD_FIFO_PAR1 /* queue 1 Tx descriptor FIFO parity error */ +#define E1000_IMC_DSW E1000_ICR_DSW +#define E1000_IMC_PHYINT E1000_ICR_PHYINT +#define E1000_IMC_EPRST E1000_ICR_EPRST /* Receive Control */ #define E1000_RCTL_RST 0x00000001 /* Software reset */ @@ -1802,7 +1899,7 @@ struct e1000_hw { * value2 = [0..64512], default=4096 * value3 = [0..64512], default=0 */ - + #define E1000_PSRCTL_BSIZE0_MASK 0x0000007F #define E1000_PSRCTL_BSIZE1_MASK 0x00003F00 #define E1000_PSRCTL_BSIZE2_MASK 0x003F0000 @@ -1918,9 +2015,10 @@ struct e1000_hw { #define E1000_MRQC_RSS_FIELD_MASK 0xFFFF0000 #define E1000_MRQC_RSS_FIELD_IPV4_TCP 0x00010000 #define E1000_MRQC_RSS_FIELD_IPV4 0x00020000 -#define E1000_MRQC_RSS_FIELD_IPV6_TCP 0x00040000 +#define E1000_MRQC_RSS_FIELD_IPV6_TCP_EX 0x00040000 #define E1000_MRQC_RSS_FIELD_IPV6_EX 0x00080000 #define E1000_MRQC_RSS_FIELD_IPV6 0x00100000 +#define E1000_MRQC_RSS_FIELD_IPV6_TCP 0x00200000 /* Definitions for power management and wakeup registers */ /* Wake Up Control */ @@ -2010,6 +2108,15 @@ struct e1000_hw { #define E1000_FWSM_MODE_SHIFT 1 #define E1000_FWSM_FW_VALID 0x00008000 /* FW established a valid mode */ +#define E1000_FWSM_RSPCIPHY 0x00000040 /* Reset PHY on PCI reset */ +#define E1000_FWSM_DISSW 0x10000000 /* FW disable SW Write Access */ +#define E1000_FWSM_SKUSEL_MASK 0x60000000 /* LAN SKU select */ +#define E1000_FWSM_SKUEL_SHIFT 29 +#define E1000_FWSM_SKUSEL_EMB 0x0 /* Embedded SKU */ +#define E1000_FWSM_SKUSEL_CONS 0x1 /* Consumer SKU */ +#define E1000_FWSM_SKUSEL_PERF_100 0x2 /* Perf & Corp 10/100 SKU */ +#define E1000_FWSM_SKUSEL_PERF_GBE 0x3 /* Perf & Copr GbE SKU */ + /* FFLT Debug Register */ #define E1000_FFLT_DBG_INVC 0x00100000 /* Invalid /C/ code handling */ @@ -2082,6 +2189,8 @@ struct e1000_host_command_info { E1000_GCR_TXDSCW_NO_SNOOP | \ E1000_GCR_TXDSCR_NO_SNOOP) +#define PCI_EX_82566_SNOOP_ALL PCI_EX_NO_SNOOP_ALL + #define E1000_GCR_L1_ACT_WITHOUT_L0S_RX 0x08000000 /* Function Active and Power State to MNG */ #define E1000_FACTPS_FUNC0_POWER_STATE_MASK 0x00000003 @@ -2140,8 +2249,10 @@ struct e1000_host_command_info { #define EEPROM_PHY_CLASS_WORD 0x0007 #define EEPROM_INIT_CONTROL1_REG 0x000A #define EEPROM_INIT_CONTROL2_REG 0x000F +#define EEPROM_SWDEF_PINS_CTRL_PORT_1 0x0010 #define EEPROM_INIT_CONTROL3_PORT_B 0x0014 #define EEPROM_INIT_3GIO_3 0x001A +#define EEPROM_SWDEF_PINS_CTRL_PORT_0 0x0020 #define EEPROM_INIT_CONTROL3_PORT_A 0x0024 #define EEPROM_CFG 0x0012 #define EEPROM_FLASH_VERSION 0x0032 @@ -2153,10 +2264,16 @@ struct e1000_host_command_info { /* Word definitions for ID LED Settings */ #define ID_LED_RESERVED_0000 0x0000 #define ID_LED_RESERVED_FFFF 0xFFFF +#define ID_LED_RESERVED_82573 0xF746 +#define ID_LED_DEFAULT_82573 0x1811 #define ID_LED_DEFAULT ((ID_LED_OFF1_ON2 << 12) | \ (ID_LED_OFF1_OFF2 << 8) | \ (ID_LED_DEF1_DEF2 << 4) | \ (ID_LED_DEF1_DEF2)) +#define ID_LED_DEFAULT_ICH8LAN ((ID_LED_DEF1_DEF2 << 12) | \ + (ID_LED_DEF1_OFF2 << 8) | \ + (ID_LED_DEF1_ON2 << 4) | \ + (ID_LED_DEF1_DEF2)) #define ID_LED_DEF1_DEF2 0x1 #define ID_LED_DEF1_ON2 0x2 #define ID_LED_DEF1_OFF2 0x3 @@ -2191,6 +2308,11 @@ struct e1000_host_command_info { #define EEPROM_WORD0F_ASM_DIR 0x2000 #define EEPROM_WORD0F_ANE 0x0800 #define EEPROM_WORD0F_SWPDIO_EXT 0x00F0 +#define EEPROM_WORD0F_LPLU 0x0001 + +/* Mask bits for fields in Word 0x10/0x20 of the EEPROM */ +#define EEPROM_WORD1020_GIGA_DISABLE 0x0010 +#define EEPROM_WORD1020_GIGA_DISABLE_NON_D0A 0x0008 /* Mask bits for fields in Word 0x1a of the EEPROM */ #define EEPROM_WORD1A_ASPM_MASK 0x000C @@ -2265,23 +2387,29 @@ struct e1000_host_command_info { #define E1000_EXTCNF_CTRL_D_UD_OWNER 0x00000010 #define E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP 0x00000020 #define E1000_EXTCNF_CTRL_MDIO_HW_OWNERSHIP 0x00000040 -#define E1000_EXTCNF_CTRL_EXT_CNF_POINTER 0x1FFF0000 +#define E1000_EXTCNF_CTRL_EXT_CNF_POINTER 0x0FFF0000 #define E1000_EXTCNF_SIZE_EXT_PHY_LENGTH 0x000000FF #define E1000_EXTCNF_SIZE_EXT_DOCK_LENGTH 0x0000FF00 #define E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH 0x00FF0000 +#define E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE 0x00000001 +#define E1000_EXTCNF_CTRL_SWFLAG 0x00000020 /* PBA constants */ +#define E1000_PBA_8K 0x0008 /* 8KB, default Rx allocation */ #define E1000_PBA_12K 0x000C /* 12KB, default Rx allocation */ #define E1000_PBA_16K 0x0010 /* 16KB, default TX allocation */ #define E1000_PBA_22K 0x0016 #define E1000_PBA_24K 0x0018 #define E1000_PBA_30K 0x001E #define E1000_PBA_32K 0x0020 +#define E1000_PBA_34K 0x0022 #define E1000_PBA_38K 0x0026 #define E1000_PBA_40K 0x0028 #define E1000_PBA_48K 0x0030 /* 48KB, default RX allocation */ +#define E1000_PBS_16K E1000_PBA_16K + /* Flow Control Constants */ #define FLOW_CONTROL_ADDRESS_LOW 0x00C28001 #define FLOW_CONTROL_ADDRESS_HIGH 0x00000100 @@ -2336,7 +2464,7 @@ struct e1000_host_command_info { /* Number of milliseconds we wait for Eeprom auto read bit done after MAC reset */ #define AUTO_READ_DONE_TIMEOUT 10 /* Number of milliseconds we wait for PHY configuration done after MAC reset */ -#define PHY_CFG_TIMEOUT 40 +#define PHY_CFG_TIMEOUT 100 #define E1000_TX_BUFFER_SIZE ((uint32_t)1514) @@ -2764,6 +2892,17 @@ struct e1000_host_command_info { #define M88E1000_EPSCR_TX_CLK_25 0x0070 /* 25 MHz TX_CLK */ #define M88E1000_EPSCR_TX_CLK_0 0x0000 /* NO TX_CLK */ +/* M88EC018 Rev 2 specific DownShift settings */ +#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_MASK 0x0E00 +#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_1X 0x0000 +#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_2X 0x0200 +#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_3X 0x0400 +#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_4X 0x0600 +#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_5X 0x0800 +#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_6X 0x0A00 +#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_7X 0x0C00 +#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_8X 0x0E00 + /* IGP01E1000 Specific Port Config Register - R/W */ #define IGP01E1000_PSCFR_AUTO_MDIX_PAR_DETECT 0x0010 #define IGP01E1000_PSCFR_PRE_EN 0x0020 @@ -2990,6 +3129,221 @@ struct e1000_host_command_info { #define L1LXT971A_PHY_ID 0x001378E0 #define GG82563_E_PHY_ID 0x01410CA0 + +/* Bits... + * 15-5: page + * 4-0: register offset + */ +#define PHY_PAGE_SHIFT 5 +#define PHY_REG(page, reg) \ + (((page) << PHY_PAGE_SHIFT) | ((reg) & MAX_PHY_REG_ADDRESS)) + +#define IGP3_PHY_PORT_CTRL \ + PHY_REG(769, 17) /* Port General Configuration */ +#define IGP3_PHY_RATE_ADAPT_CTRL \ + PHY_REG(769, 25) /* Rate Adapter Control Register */ + +#define IGP3_KMRN_FIFO_CTRL_STATS \ + PHY_REG(770, 16) /* KMRN FIFO's control/status register */ +#define IGP3_KMRN_POWER_MNG_CTRL \ + PHY_REG(770, 17) /* KMRN Power Management Control Register */ +#define IGP3_KMRN_INBAND_CTRL \ + PHY_REG(770, 18) /* KMRN Inband Control Register */ +#define IGP3_KMRN_DIAG \ + PHY_REG(770, 19) /* KMRN Diagnostic register */ +#define IGP3_KMRN_DIAG_PCS_LOCK_LOSS 0x0002 /* RX PCS is not synced */ +#define IGP3_KMRN_ACK_TIMEOUT \ + PHY_REG(770, 20) /* KMRN Acknowledge Timeouts register */ + +#define IGP3_VR_CTRL \ + PHY_REG(776, 18) /* Voltage regulator control register */ +#define IGP3_VR_CTRL_MODE_SHUT 0x0200 /* Enter powerdown, shutdown VRs */ + +#define IGP3_CAPABILITY \ + PHY_REG(776, 19) /* IGP3 Capability Register */ + +/* Capabilities for SKU Control */ +#define IGP3_CAP_INITIATE_TEAM 0x0001 /* Able to initiate a team */ +#define IGP3_CAP_WFM 0x0002 /* Support WoL and PXE */ +#define IGP3_CAP_ASF 0x0004 /* Support ASF */ +#define IGP3_CAP_LPLU 0x0008 /* Support Low Power Link Up */ +#define IGP3_CAP_DC_AUTO_SPEED 0x0010 /* Support AC/DC Auto Link Speed */ +#define IGP3_CAP_SPD 0x0020 /* Support Smart Power Down */ +#define IGP3_CAP_MULT_QUEUE 0x0040 /* Support 2 tx & 2 rx queues */ +#define IGP3_CAP_RSS 0x0080 /* Support RSS */ +#define IGP3_CAP_8021PQ 0x0100 /* Support 802.1Q & 802.1p */ +#define IGP3_CAP_AMT_CB 0x0200 /* Support active manageability and circuit breaker */ + +#define IGP3_PPC_JORDAN_EN 0x0001 +#define IGP3_PPC_JORDAN_GIGA_SPEED 0x0002 + +#define IGP3_KMRN_PMC_EE_IDLE_LINK_DIS 0x0001 +#define IGP3_KMRN_PMC_K0S_ENTRY_LATENCY_MASK 0x001E +#define IGP3_KMRN_PMC_K0S_MODE1_EN_GIGA 0x0020 +#define IGP3_KMRN_PMC_K0S_MODE1_EN_100 0x0040 + +#define IGP3E1000_PHY_MISC_CTRL 0x1B /* Misc. Ctrl register */ +#define IGP3_PHY_MISC_DUPLEX_MANUAL_SET 0x1000 /* Duplex Manual Set */ + +#define IGP3_KMRN_EXT_CTRL PHY_REG(770, 18) +#define IGP3_KMRN_EC_DIS_INBAND 0x0080 + +#define IGP03E1000_E_PHY_ID 0x02A80390 +#define IFE_E_PHY_ID 0x02A80330 /* 10/100 PHY */ +#define IFE_PLUS_E_PHY_ID 0x02A80320 +#define IFE_C_E_PHY_ID 0x02A80310 + +#define IFE_PHY_EXTENDED_STATUS_CONTROL 0x10 /* 100BaseTx Extended Status, Control and Address */ +#define IFE_PHY_SPECIAL_CONTROL 0x11 /* 100BaseTx PHY special control register */ +#define IFE_PHY_RCV_FALSE_CARRIER 0x13 /* 100BaseTx Receive False Carrier Counter */ +#define IFE_PHY_RCV_DISCONNECT 0x14 /* 100BaseTx Receive Disconnet Counter */ +#define IFE_PHY_RCV_ERROT_FRAME 0x15 /* 100BaseTx Receive Error Frame Counter */ +#define IFE_PHY_RCV_SYMBOL_ERR 0x16 /* Receive Symbol Error Counter */ +#define IFE_PHY_PREM_EOF_ERR 0x17 /* 100BaseTx Receive Premature End Of Frame Error Counter */ +#define IFE_PHY_RCV_EOF_ERR 0x18 /* 10BaseT Receive End Of Frame Error Counter */ +#define IFE_PHY_TX_JABBER_DETECT 0x19 /* 10BaseT Transmit Jabber Detect Counter */ +#define IFE_PHY_EQUALIZER 0x1A /* PHY Equalizer Control and Status */ +#define IFE_PHY_SPECIAL_CONTROL_LED 0x1B /* PHY special control and LED configuration */ +#define IFE_PHY_MDIX_CONTROL 0x1C /* MDI/MDI-X Control register */ +#define IFE_PHY_HWI_CONTROL 0x1D /* Hardware Integrity Control (HWI) */ + +#define IFE_PESC_REDUCED_POWER_DOWN_DISABLE 0x2000 /* Defaut 1 = Disable auto reduced power down */ +#define IFE_PESC_100BTX_POWER_DOWN 0x0400 /* Indicates the power state of 100BASE-TX */ +#define IFE_PESC_10BTX_POWER_DOWN 0x0200 /* Indicates the power state of 10BASE-T */ +#define IFE_PESC_POLARITY_REVERSED 0x0100 /* Indicates 10BASE-T polarity */ +#define IFE_PESC_PHY_ADDR_MASK 0x007C /* Bit 6:2 for sampled PHY address */ +#define IFE_PESC_SPEED 0x0002 /* Auto-negotiation speed result 1=100Mbs, 0=10Mbs */ +#define IFE_PESC_DUPLEX 0x0001 /* Auto-negotiation duplex result 1=Full, 0=Half */ +#define IFE_PESC_POLARITY_REVERSED_SHIFT 8 + +#define IFE_PSC_DISABLE_DYNAMIC_POWER_DOWN 0x0100 /* 1 = Dyanmic Power Down disabled */ +#define IFE_PSC_FORCE_POLARITY 0x0020 /* 1=Reversed Polarity, 0=Normal */ +#define IFE_PSC_AUTO_POLARITY_DISABLE 0x0010 /* 1=Auto Polarity Disabled, 0=Enabled */ +#define IFE_PSC_JABBER_FUNC_DISABLE 0x0001 /* 1=Jabber Disabled, 0=Normal Jabber Operation */ +#define IFE_PSC_FORCE_POLARITY_SHIFT 5 +#define IFE_PSC_AUTO_POLARITY_DISABLE_SHIFT 4 + +#define IFE_PMC_AUTO_MDIX 0x0080 /* 1=enable MDI/MDI-X feature, default 0=disabled */ +#define IFE_PMC_FORCE_MDIX 0x0040 /* 1=force MDIX-X, 0=force MDI */ +#define IFE_PMC_MDIX_STATUS 0x0020 /* 1=MDI-X, 0=MDI */ +#define IFE_PMC_AUTO_MDIX_COMPLETE 0x0010 /* Resolution algorthm is completed */ +#define IFE_PMC_MDIX_MODE_SHIFT 6 +#define IFE_PHC_MDIX_RESET_ALL_MASK 0x0000 /* Disable auto MDI-X */ + +#define IFE_PHC_HWI_ENABLE 0x8000 /* Enable the HWI feature */ +#define IFE_PHC_ABILITY_CHECK 0x4000 /* 1= Test Passed, 0=failed */ +#define IFE_PHC_TEST_EXEC 0x2000 /* PHY launch test pulses on the wire */ +#define IFE_PHC_HIGHZ 0x0200 /* 1 = Open Circuit */ +#define IFE_PHC_LOWZ 0x0400 /* 1 = Short Circuit */ +#define IFE_PHC_LOW_HIGH_Z_MASK 0x0600 /* Mask for indication type of problem on the line */ +#define IFE_PHC_DISTANCE_MASK 0x01FF /* Mask for distance to the cable problem, in 80cm granularity */ +#define IFE_PHC_RESET_ALL_MASK 0x0000 /* Disable HWI */ +#define IFE_PSCL_PROBE_MODE 0x0020 /* LED Probe mode */ +#define IFE_PSCL_PROBE_LEDS_OFF 0x0006 /* Force LEDs 0 and 2 off */ +#define IFE_PSCL_PROBE_LEDS_ON 0x0007 /* Force LEDs 0 and 2 on */ + +#define ICH8_FLASH_COMMAND_TIMEOUT 500 /* 500 ms , should be adjusted */ +#define ICH8_FLASH_CYCLE_REPEAT_COUNT 10 /* 10 cycles , should be adjusted */ +#define ICH8_FLASH_SEG_SIZE_256 256 +#define ICH8_FLASH_SEG_SIZE_4K 4096 +#define ICH8_FLASH_SEG_SIZE_64K 65536 + +#define ICH8_CYCLE_READ 0x0 +#define ICH8_CYCLE_RESERVED 0x1 +#define ICH8_CYCLE_WRITE 0x2 +#define ICH8_CYCLE_ERASE 0x3 + +#define ICH8_FLASH_GFPREG 0x0000 +#define ICH8_FLASH_HSFSTS 0x0004 +#define ICH8_FLASH_HSFCTL 0x0006 +#define ICH8_FLASH_FADDR 0x0008 +#define ICH8_FLASH_FDATA0 0x0010 +#define ICH8_FLASH_FRACC 0x0050 +#define ICH8_FLASH_FREG0 0x0054 +#define ICH8_FLASH_FREG1 0x0058 +#define ICH8_FLASH_FREG2 0x005C +#define ICH8_FLASH_FREG3 0x0060 +#define ICH8_FLASH_FPR0 0x0074 +#define ICH8_FLASH_FPR1 0x0078 +#define ICH8_FLASH_SSFSTS 0x0090 +#define ICH8_FLASH_SSFCTL 0x0092 +#define ICH8_FLASH_PREOP 0x0094 +#define ICH8_FLASH_OPTYPE 0x0096 +#define ICH8_FLASH_OPMENU 0x0098 + +#define ICH8_FLASH_REG_MAPSIZE 0x00A0 +#define ICH8_FLASH_SECTOR_SIZE 4096 +#define ICH8_GFPREG_BASE_MASK 0x1FFF +#define ICH8_FLASH_LINEAR_ADDR_MASK 0x00FFFFFF + +/* ICH8 GbE Flash Hardware Sequencing Flash Status Register bit breakdown */ +/* Offset 04h HSFSTS */ +union ich8_hws_flash_status { + struct ich8_hsfsts { +#ifdef E1000_BIG_ENDIAN + uint16_t reserved2 :6; + uint16_t fldesvalid :1; + uint16_t flockdn :1; + uint16_t flcdone :1; + uint16_t flcerr :1; + uint16_t dael :1; + uint16_t berasesz :2; + uint16_t flcinprog :1; + uint16_t reserved1 :2; +#else + uint16_t flcdone :1; /* bit 0 Flash Cycle Done */ + uint16_t flcerr :1; /* bit 1 Flash Cycle Error */ + uint16_t dael :1; /* bit 2 Direct Access error Log */ + uint16_t berasesz :2; /* bit 4:3 Block/Sector Erase Size */ + uint16_t flcinprog :1; /* bit 5 flash SPI cycle in Progress */ + uint16_t reserved1 :2; /* bit 13:6 Reserved */ + uint16_t reserved2 :6; /* bit 13:6 Reserved */ + uint16_t fldesvalid :1; /* bit 14 Flash Descriptor Valid */ + uint16_t flockdn :1; /* bit 15 Flash Configuration Lock-Down */ +#endif + } hsf_status; + uint16_t regval; +}; + +/* ICH8 GbE Flash Hardware Sequencing Flash control Register bit breakdown */ +/* Offset 06h FLCTL */ +union ich8_hws_flash_ctrl { + struct ich8_hsflctl { +#ifdef E1000_BIG_ENDIAN + uint16_t fldbcount :2; + uint16_t flockdn :6; + uint16_t flcgo :1; + uint16_t flcycle :2; + uint16_t reserved :5; +#else + uint16_t flcgo :1; /* 0 Flash Cycle Go */ + uint16_t flcycle :2; /* 2:1 Flash Cycle */ + uint16_t reserved :5; /* 7:3 Reserved */ + uint16_t fldbcount :2; /* 9:8 Flash Data Byte Count */ + uint16_t flockdn :6; /* 15:10 Reserved */ +#endif + } hsf_ctrl; + uint16_t regval; +}; + +/* ICH8 Flash Region Access Permissions */ +union ich8_hws_flash_regacc { + struct ich8_flracc { +#ifdef E1000_BIG_ENDIAN + uint32_t gmwag :8; + uint32_t gmrag :8; + uint32_t grwa :8; + uint32_t grra :8; +#else + uint32_t grra :8; /* 0:7 GbE region Read Access */ + uint32_t grwa :8; /* 8:15 GbE region Write Access */ + uint32_t gmrag :8; /* 23:16 GbE Master Read Access Grant */ + uint32_t gmwag :8; /* 31:24 GbE Master Write Access Grant */ +#endif + } hsf_flregacc; + uint16_t regval; +}; + /* Miscellaneous PHY bit definitions. */ #define PHY_PREAMBLE 0xFFFFFFFF #define PHY_SOF 0x01 diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index 43e647284..98ef9f854 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2006 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 @@ -22,51 +22,13 @@ Contact Information: Linux NICS + e1000-devel Mailing List Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 *******************************************************************************/ #include "e1000.h" -/* Change Log - * 7.0.33 3-Feb-2006 - * o Added another fix for the pass false carrier bit - * 7.0.32 24-Jan-2006 - * o Need to rebuild with noew version number for the pass false carrier - * fix in e1000_hw.c - * 7.0.30 18-Jan-2006 - * o fixup for tso workaround to disable it for pci-x - * o fix mem leak on 82542 - * o fixes for 10 Mb/s connections and incorrect stats - * 7.0.28 01/06/2006 - * o hardware workaround to only set "speed mode" bit for 1G link. - * 7.0.26 12/23/2005 - * o wake on lan support modified for device ID 10B5 - * o fix dhcp + vlan issue not making it to the iAMT firmware - * 7.0.24 12/9/2005 - * o New hardware support for the Gigabit NIC embedded in the south bridge - * o Fixes to the recycling logic (skb->tail) from IBM LTC - * 6.3.9 12/16/2005 - * o incorporate fix for recycled skbs from IBM LTC - * 6.3.7 11/18/2005 - * o Honor eeprom setting for enabling/disabling Wake On Lan - * 6.3.5 11/17/2005 - * o Fix memory leak in rx ring handling for PCI Express adapters - * 6.3.4 11/8/05 - * o Patch from Jesper Juhl to remove redundant NULL checks for kfree - * 6.3.2 9/20/05 - * o Render logic that sets/resets DRV_LOAD as inline functions to - * avoid code replication. If f/w is AMT then set DRV_LOAD only when - * network interface is open. - * o Handle DRV_LOAD set/reset in cases where AMT uses VLANs. - * o Adjust PBA partioning for Jumbo frames using MTU size and not - * rx_buffer_len - * 6.3.1 9/19/05 - * o Use adapter->tx_timeout_factor in Tx Hung Detect logic - * (e1000_clean_tx_irq) - * o Support for 8086:10B5 device (Quad Port) - */ - char e1000_driver_name[] = "e1000"; static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver"; #ifndef CONFIG_E1000_NAPI @@ -74,9 +36,9 @@ static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver"; #else #define DRIVERNAPI "-NAPI" #endif -#define DRV_VERSION "7.0.33-k2"DRIVERNAPI +#define DRV_VERSION "7.1.9-k4"DRIVERNAPI char e1000_driver_version[] = DRV_VERSION; -static char e1000_copyright[] = "Copyright (c) 1999-2005 Intel Corporation."; +static char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation."; /* e1000_pci_tbl - PCI Device ID Table * @@ -111,6 +73,11 @@ static struct pci_device_id e1000_pci_tbl[] = { INTEL_E1000_ETHERNET_DEVICE(0x1026), INTEL_E1000_ETHERNET_DEVICE(0x1027), INTEL_E1000_ETHERNET_DEVICE(0x1028), + INTEL_E1000_ETHERNET_DEVICE(0x1049), + INTEL_E1000_ETHERNET_DEVICE(0x104A), + INTEL_E1000_ETHERNET_DEVICE(0x104B), + INTEL_E1000_ETHERNET_DEVICE(0x104C), + INTEL_E1000_ETHERNET_DEVICE(0x104D), INTEL_E1000_ETHERNET_DEVICE(0x105E), INTEL_E1000_ETHERNET_DEVICE(0x105F), INTEL_E1000_ETHERNET_DEVICE(0x1060), @@ -134,6 +101,8 @@ static struct pci_device_id e1000_pci_tbl[] = { INTEL_E1000_ETHERNET_DEVICE(0x109A), INTEL_E1000_ETHERNET_DEVICE(0x10B5), INTEL_E1000_ETHERNET_DEVICE(0x10B9), + INTEL_E1000_ETHERNET_DEVICE(0x10BA), + INTEL_E1000_ETHERNET_DEVICE(0x10BB), /* required last entry */ {0,} }; @@ -171,7 +140,6 @@ static void e1000_clean_rx_ring(struct e1000_adapter *adapter, static void e1000_set_multi(struct net_device *netdev); static void e1000_update_phy_info(unsigned long data); static void e1000_watchdog(unsigned long data); -static void e1000_watchdog_task(struct e1000_adapter *adapter); static void e1000_82547_tx_fifo_stall(unsigned long data); static int e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev); static struct net_device_stats * e1000_get_stats(struct net_device *netdev); @@ -208,16 +176,16 @@ static void e1000_leave_82542_rst(struct e1000_adapter *adapter); static void e1000_tx_timeout(struct net_device *dev); static void e1000_reset_task(struct net_device *dev); static void e1000_smartspeed(struct e1000_adapter *adapter); -static inline int e1000_82547_fifo_workaround(struct e1000_adapter *adapter, - struct sk_buff *skb); +static int e1000_82547_fifo_workaround(struct e1000_adapter *adapter, + struct sk_buff *skb); static void e1000_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp); static void e1000_vlan_rx_add_vid(struct net_device *netdev, uint16_t vid); static void e1000_vlan_rx_kill_vid(struct net_device *netdev, uint16_t vid); static void e1000_restore_vlan(struct e1000_adapter *adapter); -#ifdef CONFIG_PM static int e1000_suspend(struct pci_dev *pdev, pm_message_t state); +#ifdef CONFIG_PM static int e1000_resume(struct pci_dev *pdev); #endif static void e1000_shutdown(struct pci_dev *pdev); @@ -227,6 +195,16 @@ static void e1000_shutdown(struct pci_dev *pdev); static void e1000_netpoll (struct net_device *netdev); #endif +static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev, + pci_channel_state_t state); +static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev); +static void e1000_io_resume(struct pci_dev *pdev); + +static struct pci_error_handlers e1000_err_handler = { + .error_detected = e1000_io_error_detected, + .slot_reset = e1000_io_slot_reset, + .resume = e1000_io_resume, +}; static struct pci_driver e1000_driver = { .name = e1000_driver_name, @@ -234,11 +212,12 @@ static struct pci_driver e1000_driver = { .probe = e1000_probe, .remove = __devexit_p(e1000_remove), /* Power Managment Hooks */ -#ifdef CONFIG_PM .suspend = e1000_suspend, +#ifdef CONFIG_PM .resume = e1000_resume, #endif - .shutdown = e1000_shutdown + .shutdown = e1000_shutdown, + .err_handler = &e1000_err_handler }; MODULE_AUTHOR("Intel Corporation, "); @@ -288,12 +267,50 @@ e1000_exit_module(void) module_exit(e1000_exit_module); +static int e1000_request_irq(struct e1000_adapter *adapter) +{ + struct net_device *netdev = adapter->netdev; + int flags, err = 0; + + flags = IRQF_SHARED; +#ifdef CONFIG_PCI_MSI + if (adapter->hw.mac_type > e1000_82547_rev_2) { + adapter->have_msi = TRUE; + if ((err = pci_enable_msi(adapter->pdev))) { + DPRINTK(PROBE, ERR, + "Unable to allocate MSI interrupt Error: %d\n", err); + adapter->have_msi = FALSE; + } + } + if (adapter->have_msi) + flags &= ~IRQF_SHARED; +#endif + if ((err = request_irq(adapter->pdev->irq, &e1000_intr, flags, + netdev->name, netdev))) + DPRINTK(PROBE, ERR, + "Unable to allocate interrupt Error: %d\n", err); + + return err; +} + +static void e1000_free_irq(struct e1000_adapter *adapter) +{ + struct net_device *netdev = adapter->netdev; + + free_irq(adapter->pdev->irq, netdev); + +#ifdef CONFIG_PCI_MSI + if (adapter->have_msi) + pci_disable_msi(adapter->pdev); +#endif +} + /** * e1000_irq_disable - Mask off interrupt generation on the NIC * @adapter: board private structure **/ -static inline void +static void e1000_irq_disable(struct e1000_adapter *adapter) { atomic_inc(&adapter->irq_sem); @@ -307,7 +324,7 @@ e1000_irq_disable(struct e1000_adapter *adapter) * @adapter: board private structure **/ -static inline void +static void e1000_irq_enable(struct e1000_adapter *adapter) { if (likely(atomic_dec_and_test(&adapter->irq_sem))) { @@ -348,19 +365,21 @@ e1000_update_mng_vlan(struct e1000_adapter *adapter) * For ASF and Pass Through versions of f/w this means that the * driver is no longer loaded. For AMT version (only with 82573) i * of the f/w this means that the netowrk i/f is closed. - * + * **/ -static inline void +static void e1000_release_hw_control(struct e1000_adapter *adapter) { uint32_t ctrl_ext; uint32_t swsm; + uint32_t extcnf; /* Let firmware taken over control of h/w */ switch (adapter->hw.mac_type) { case e1000_82571: case e1000_82572: + case e1000_80003es2lan: ctrl_ext = E1000_READ_REG(&adapter->hw, CTRL_EXT); E1000_WRITE_REG(&adapter->hw, CTRL_EXT, ctrl_ext & ~E1000_CTRL_EXT_DRV_LOAD); @@ -369,6 +388,11 @@ e1000_release_hw_control(struct e1000_adapter *adapter) swsm = E1000_READ_REG(&adapter->hw, SWSM); E1000_WRITE_REG(&adapter->hw, SWSM, swsm & ~E1000_SWSM_DRV_LOAD); + case e1000_ich8lan: + extcnf = E1000_READ_REG(&adapter->hw, CTRL_EXT); + E1000_WRITE_REG(&adapter->hw, CTRL_EXT, + extcnf & ~E1000_CTRL_EXT_DRV_LOAD); + break; default: break; } @@ -379,21 +403,23 @@ e1000_release_hw_control(struct e1000_adapter *adapter) * @adapter: address of board private structure * * e1000_get_hw_control sets {CTRL_EXT|FWSM}:DRV_LOAD bit. - * For ASF and Pass Through versions of f/w this means that - * the driver is loaded. For AMT version (only with 82573) + * For ASF and Pass Through versions of f/w this means that + * the driver is loaded. For AMT version (only with 82573) * of the f/w this means that the netowrk i/f is open. - * + * **/ -static inline void +static void e1000_get_hw_control(struct e1000_adapter *adapter) { uint32_t ctrl_ext; uint32_t swsm; + uint32_t extcnf; /* Let firmware know the driver has taken over */ switch (adapter->hw.mac_type) { case e1000_82571: case e1000_82572: + case e1000_80003es2lan: ctrl_ext = E1000_READ_REG(&adapter->hw, CTRL_EXT); E1000_WRITE_REG(&adapter->hw, CTRL_EXT, ctrl_ext | E1000_CTRL_EXT_DRV_LOAD); @@ -403,6 +429,11 @@ e1000_get_hw_control(struct e1000_adapter *adapter) E1000_WRITE_REG(&adapter->hw, SWSM, swsm | E1000_SWSM_DRV_LOAD); break; + case e1000_ich8lan: + extcnf = E1000_READ_REG(&adapter->hw, EXTCNF_CTRL); + E1000_WRITE_REG(&adapter->hw, EXTCNF_CTRL, + extcnf | E1000_EXTCNF_CTRL_SWFLAG); + break; default: break; } @@ -412,18 +443,10 @@ int e1000_up(struct e1000_adapter *adapter) { struct net_device *netdev = adapter->netdev; - int i, err; + int i; /* hardware has been reset, we need to reload some things */ - /* Reset the PHY if it was previously powered down */ - if (adapter->hw.media_type == e1000_media_type_copper) { - uint16_t mii_reg; - e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &mii_reg); - if (mii_reg & MII_CR_POWER_DOWN) - e1000_phy_reset(&adapter->hw); - } - e1000_set_multi(netdev); e1000_restore_vlan(adapter); @@ -440,24 +463,6 @@ e1000_up(struct e1000_adapter *adapter) E1000_DESC_UNUSED(ring)); } -#ifdef CONFIG_PCI_MSI - if (adapter->hw.mac_type > e1000_82547_rev_2) { - adapter->have_msi = TRUE; - if ((err = pci_enable_msi(adapter->pdev))) { - DPRINTK(PROBE, ERR, - "Unable to allocate MSI interrupt Error: %d\n", err); - adapter->have_msi = FALSE; - } - } -#endif - if ((err = request_irq(adapter->pdev->irq, &e1000_intr, - SA_SHIRQ | SA_SAMPLE_RANDOM, - netdev->name, netdev))) { - DPRINTK(PROBE, ERR, - "Unable to allocate interrupt Error: %d\n", err); - return err; - } - adapter->tx_queue_len = netdev->tx_queue_len; mod_timer(&adapter->watchdog_timer, jiffies); @@ -470,21 +475,60 @@ e1000_up(struct e1000_adapter *adapter) return 0; } +/** + * e1000_power_up_phy - restore link in case the phy was powered down + * @adapter: address of board private structure + * + * The phy may be powered down to save power and turn off link when the + * driver is unloaded and wake on lan is not enabled (among others) + * *** this routine MUST be followed by a call to e1000_reset *** + * + **/ + +static void e1000_power_up_phy(struct e1000_adapter *adapter) +{ + uint16_t mii_reg = 0; + + /* Just clear the power down bit to wake the phy back up */ + if (adapter->hw.media_type == e1000_media_type_copper) { + /* according to the manual, the phy will retain its + * settings across a power-down/up cycle */ + e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &mii_reg); + mii_reg &= ~MII_CR_POWER_DOWN; + e1000_write_phy_reg(&adapter->hw, PHY_CTRL, mii_reg); + } +} + +static void e1000_power_down_phy(struct e1000_adapter *adapter) +{ + boolean_t mng_mode_enabled = (adapter->hw.mac_type >= e1000_82571) && + e1000_check_mng_mode(&adapter->hw); + /* Power down the PHY so no link is implied when interface is down + * The PHY cannot be powered down if any of the following is TRUE + * (a) WoL is enabled + * (b) AMT is active + * (c) SoL/IDER session is active */ + if (!adapter->wol && adapter->hw.mac_type >= e1000_82540 && + adapter->hw.mac_type != e1000_ich8lan && + adapter->hw.media_type == e1000_media_type_copper && + !(E1000_READ_REG(&adapter->hw, MANC) & E1000_MANC_SMBUS_EN) && + !mng_mode_enabled && + !e1000_check_phy_reset_block(&adapter->hw)) { + uint16_t mii_reg = 0; + e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &mii_reg); + mii_reg |= MII_CR_POWER_DOWN; + e1000_write_phy_reg(&adapter->hw, PHY_CTRL, mii_reg); + mdelay(1); + } +} + void e1000_down(struct e1000_adapter *adapter) { struct net_device *netdev = adapter->netdev; - boolean_t mng_mode_enabled = (adapter->hw.mac_type >= e1000_82571) && - e1000_check_mng_mode(&adapter->hw); e1000_irq_disable(adapter); - free_irq(adapter->pdev->irq, netdev); -#ifdef CONFIG_PCI_MSI - if (adapter->hw.mac_type > e1000_82547_rev_2 && - adapter->have_msi == TRUE) - pci_disable_msi(adapter->pdev); -#endif del_timer_sync(&adapter->tx_fifo_stall_timer); del_timer_sync(&adapter->watchdog_timer); del_timer_sync(&adapter->phy_info_timer); @@ -501,23 +545,17 @@ e1000_down(struct e1000_adapter *adapter) e1000_reset(adapter); e1000_clean_all_tx_rings(adapter); e1000_clean_all_rx_rings(adapter); +} - /* Power down the PHY so no link is implied when interface is down * - * The PHY cannot be powered down if any of the following is TRUE * - * (a) WoL is enabled - * (b) AMT is active - * (c) SoL/IDER session is active */ - if (!adapter->wol && adapter->hw.mac_type >= e1000_82540 && - adapter->hw.media_type == e1000_media_type_copper && - !(E1000_READ_REG(&adapter->hw, MANC) & E1000_MANC_SMBUS_EN) && - !mng_mode_enabled && - !e1000_check_phy_reset_block(&adapter->hw)) { - uint16_t mii_reg; - e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &mii_reg); - mii_reg |= MII_CR_POWER_DOWN; - e1000_write_phy_reg(&adapter->hw, PHY_CTRL, mii_reg); - mdelay(1); - } +void +e1000_reinit_locked(struct e1000_adapter *adapter) +{ + WARN_ON(in_interrupt()); + while (test_and_set_bit(__E1000_RESETTING, &adapter->flags)) + msleep(1); + e1000_down(adapter); + e1000_up(adapter); + clear_bit(__E1000_RESETTING, &adapter->flags); } void @@ -543,6 +581,9 @@ e1000_reset(struct e1000_adapter *adapter) case e1000_82573: pba = E1000_PBA_12K; break; + case e1000_ich8lan: + pba = E1000_PBA_8K; + break; default: pba = E1000_PBA_48K; break; @@ -567,6 +608,12 @@ e1000_reset(struct e1000_adapter *adapter) /* Set the FC high water mark to 90% of the FIFO size. * Required to clear last 3 LSB */ fc_high_water_mark = ((pba * 9216)/10) & 0xFFF8; + /* We can't use 90% on small FIFOs because the remainder + * would be less than 1 full frame. In this case, we size + * it to allow at least a full frame above the high water + * mark. */ + if (pba < E1000_PBA_16K) + fc_high_water_mark = (pba * 1024) - 1600; adapter->hw.fc_high_water = fc_high_water_mark; adapter->hw.fc_low_water = fc_high_water_mark - 8; @@ -589,6 +636,23 @@ e1000_reset(struct e1000_adapter *adapter) e1000_reset_adaptive(&adapter->hw); e1000_phy_get_info(&adapter->hw, &adapter->phy_info); + + if (!adapter->smart_power_down && + (adapter->hw.mac_type == e1000_82571 || + adapter->hw.mac_type == e1000_82572)) { + uint16_t phy_data = 0; + /* speed up time to link by disabling smart power down, ignore + * the return value of this function because there is nothing + * different we would do if it failed */ + e1000_read_phy_reg(&adapter->hw, IGP02E1000_PHY_POWER_MGMT, + &phy_data); + phy_data &= ~IGP02E1000_PM_SPD; + e1000_write_phy_reg(&adapter->hw, IGP02E1000_PHY_POWER_MGMT, + phy_data); + } + + if (adapter->hw.mac_type < e1000_ich8lan) + /* FIXME: this code is duplicate and wrong for PCI Express */ if (adapter->en_mng_pt) { manc = E1000_READ_REG(&adapter->hw, MANC); manc |= (E1000_MANC_ARP_EN | E1000_MANC_EN_MNG2HOST); @@ -615,6 +679,7 @@ e1000_probe(struct pci_dev *pdev, struct net_device *netdev; struct e1000_adapter *adapter; unsigned long mmio_start, mmio_len; + unsigned long flash_start, flash_len; static int cards_found = 0; static int e1000_ksp3_port_a = 0; /* global ksp3 port a indication */ @@ -624,10 +689,12 @@ e1000_probe(struct pci_dev *pdev, if ((err = pci_enable_device(pdev))) return err; - if (!(err = pci_set_dma_mask(pdev, DMA_64BIT_MASK))) { + if (!(err = pci_set_dma_mask(pdev, DMA_64BIT_MASK)) && + !(err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK))) { pci_using_dac = 1; } else { - if ((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK))) { + if ((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK)) && + (err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK))) { E1000_ERR("No usable DMA configuration, aborting\n"); return err; } @@ -707,12 +774,25 @@ e1000_probe(struct pci_dev *pdev, if ((err = e1000_sw_init(adapter))) goto err_sw_init; + /* Flash BAR mapping must happen after e1000_sw_init + * because it depends on mac_type */ + if ((adapter->hw.mac_type == e1000_ich8lan) && + (pci_resource_flags(pdev, 1) & IORESOURCE_MEM)) { + flash_start = pci_resource_start(pdev, 1); + flash_len = pci_resource_len(pdev, 1); + adapter->hw.flash_address = ioremap(flash_start, flash_len); + if (!adapter->hw.flash_address) { + err = -EIO; + goto err_flashmap; + } + } + if ((err = e1000_check_phy_reset_block(&adapter->hw))) DPRINTK(PROBE, INFO, "PHY reset is blocked due to SOL/IDER session.\n"); /* if ksp3, indicate if it's port a being setup */ - if (pdev->device == E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3 && - e1000_ksp3_port_a == 0) + if (pdev->device == E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3 && + e1000_ksp3_port_a == 0) adapter->ksp3_port_a = 1; e1000_ksp3_port_a++; /* Reset for multiple KP3 adapters */ @@ -725,6 +805,8 @@ e1000_probe(struct pci_dev *pdev, NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_FILTER; + if (adapter->hw.mac_type == e1000_ich8lan) + netdev->features &= ~NETIF_F_HW_VLAN_FILTER; } #ifdef NETIF_F_TSO @@ -740,11 +822,17 @@ e1000_probe(struct pci_dev *pdev, if (pci_using_dac) netdev->features |= NETIF_F_HIGHDMA; - /* hard_start_xmit is safe against parallel locking */ - netdev->features |= NETIF_F_LLTX; - + netdev->features |= NETIF_F_LLTX; + adapter->en_mng_pt = e1000_enable_mng_pass_thru(&adapter->hw); + /* initialize eeprom parameters */ + + if (e1000_init_eeprom_params(&adapter->hw)) { + E1000_ERR("EEPROM initialization failed\n"); + return -EIO; + } + /* before reading the EEPROM, reset the controller to * put the device in a known good starting state */ @@ -783,9 +871,6 @@ e1000_probe(struct pci_dev *pdev, adapter->watchdog_timer.function = &e1000_watchdog; adapter->watchdog_timer.data = (unsigned long) adapter; - INIT_WORK(&adapter->watchdog_task, - (void (*)(void *))e1000_watchdog_task, adapter); - init_timer(&adapter->phy_info_timer); adapter->phy_info_timer.function = &e1000_update_phy_info; adapter->phy_info_timer.data = (unsigned long) adapter; @@ -815,6 +900,11 @@ e1000_probe(struct pci_dev *pdev, EEPROM_INIT_CONTROL2_REG, 1, &eeprom_data); eeprom_apme_mask = E1000_EEPROM_82544_APM; break; + case e1000_ich8lan: + e1000_read_eeprom(&adapter->hw, + EEPROM_INIT_CONTROL1_REG, 1, &eeprom_data); + eeprom_apme_mask = E1000_EEPROM_ICH8_APME; + break; case e1000_82546: case e1000_82546_rev_3: case e1000_82571: @@ -874,6 +964,9 @@ e1000_probe(struct pci_dev *pdev, return 0; err_register: + if (adapter->hw.flash_address) + iounmap(adapter->hw.flash_address); +err_flashmap: err_sw_init: err_eeprom: iounmap(adapter->hw.hw_addr); @@ -907,6 +1000,7 @@ e1000_remove(struct pci_dev *pdev) flush_scheduled_work(); if (adapter->hw.mac_type >= e1000_82540 && + adapter->hw.mac_type != e1000_ich8lan && adapter->hw.media_type == e1000_media_type_copper) { manc = E1000_READ_REG(&adapter->hw, MANC); if (manc & E1000_MANC_SMBUS_EN) { @@ -935,6 +1029,8 @@ e1000_remove(struct pci_dev *pdev) #endif iounmap(adapter->hw.hw_addr); + if (adapter->hw.flash_address) + iounmap(adapter->hw.flash_address); pci_release_regions(pdev); free_netdev(netdev); @@ -972,8 +1068,8 @@ e1000_sw_init(struct e1000_adapter *adapter) pci_read_config_word(pdev, PCI_COMMAND, &hw->pci_cmd_word); - adapter->rx_buffer_len = E1000_RXBUFFER_2048; - adapter->rx_ps_bsize0 = E1000_RXBUFFER_256; + adapter->rx_buffer_len = MAXIMUM_ETHERNET_VLAN_SIZE; + adapter->rx_ps_bsize0 = E1000_RXBUFFER_128; hw->max_frame_size = netdev->mtu + ENET_HEADER_SIZE + ETHERNET_FCS_SIZE; hw->min_frame_size = MINIMUM_ETHERNET_FRAME_SIZE; @@ -985,13 +1081,6 @@ e1000_sw_init(struct e1000_adapter *adapter) return -EIO; } - /* initialize eeprom parameters */ - - if (e1000_init_eeprom_params(hw)) { - E1000_ERR("EEPROM initialization failed\n"); - return -EIO; - } - switch (hw->mac_type) { default: break; @@ -1103,6 +1192,10 @@ e1000_open(struct net_device *netdev) struct e1000_adapter *adapter = netdev_priv(netdev); int err; + /* disallow open during test */ + if (test_bit(__E1000_DRIVER_TESTING, &adapter->flags)) + return -EBUSY; + /* allocate transmit descriptors */ if ((err = e1000_setup_all_tx_resources(adapter))) @@ -1113,6 +1206,12 @@ e1000_open(struct net_device *netdev) if ((err = e1000_setup_all_rx_resources(adapter))) goto err_setup_rx; + err = e1000_request_irq(adapter); + if (err) + goto err_up; + + e1000_power_up_phy(adapter); + if ((err = e1000_up(adapter))) goto err_up; adapter->mng_vlan_id = E1000_MNG_VLAN_NONE; @@ -1156,7 +1255,10 @@ e1000_close(struct net_device *netdev) { struct e1000_adapter *adapter = netdev_priv(netdev); + WARN_ON(test_bit(__E1000_RESETTING, &adapter->flags)); e1000_down(adapter); + e1000_power_down_phy(adapter); + e1000_free_irq(adapter); e1000_free_all_tx_resources(adapter); e1000_free_all_rx_resources(adapter); @@ -1181,7 +1283,7 @@ e1000_close(struct net_device *netdev) * @start: address of beginning of memory * @len: length of memory **/ -static inline boolean_t +static boolean_t e1000_check_64k_bound(struct e1000_adapter *adapter, void *start, unsigned long len) { @@ -1214,8 +1316,7 @@ e1000_setup_tx_resources(struct e1000_adapter *adapter, int size; size = sizeof(struct e1000_buffer) * txdr->count; - - txdr->buffer_info = vmalloc_node(size, pcibus_to_node(pdev->bus)); + txdr->buffer_info = vmalloc(size); if (!txdr->buffer_info) { DPRINTK(PROBE, ERR, "Unable to allocate memory for the transmit descriptor ring\n"); @@ -1327,13 +1428,13 @@ e1000_configure_tx(struct e1000_adapter *adapter) tdba = adapter->tx_ring[0].dma; tdlen = adapter->tx_ring[0].count * sizeof(struct e1000_tx_desc); - E1000_WRITE_REG(hw, TDBAL, (tdba & 0x00000000ffffffffULL)); - E1000_WRITE_REG(hw, TDBAH, (tdba >> 32)); E1000_WRITE_REG(hw, TDLEN, tdlen); - E1000_WRITE_REG(hw, TDH, 0); + E1000_WRITE_REG(hw, TDBAH, (tdba >> 32)); + E1000_WRITE_REG(hw, TDBAL, (tdba & 0x00000000ffffffffULL)); E1000_WRITE_REG(hw, TDT, 0); - adapter->tx_ring[0].tdh = E1000_TDH; - adapter->tx_ring[0].tdt = E1000_TDT; + E1000_WRITE_REG(hw, TDH, 0); + adapter->tx_ring[0].tdh = ((hw->mac_type >= e1000_82543) ? E1000_TDH : E1000_82542_TDH); + adapter->tx_ring[0].tdt = ((hw->mac_type >= e1000_82543) ? E1000_TDT : E1000_82542_TDT); break; } @@ -1443,7 +1544,7 @@ e1000_setup_rx_resources(struct e1000_adapter *adapter, int size, desc_len; size = sizeof(struct e1000_buffer) * rxdr->count; - rxdr->buffer_info = vmalloc_node(size, pcibus_to_node(pdev->bus)); + rxdr->buffer_info = vmalloc(size); if (!rxdr->buffer_info) { DPRINTK(PROBE, ERR, "Unable to allocate memory for the receive descriptor ring\n"); @@ -1585,9 +1686,6 @@ e1000_setup_rctl(struct e1000_adapter *adapter) E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF | (adapter->hw.mc_filter_type << E1000_RCTL_MO_SHIFT); - if (adapter->hw.mac_type > e1000_82543) - rctl |= E1000_RCTL_SECRC; - if (adapter->hw.tbi_compatibility_on == 1) rctl |= E1000_RCTL_SBP; else @@ -1599,14 +1697,21 @@ e1000_setup_rctl(struct e1000_adapter *adapter) rctl |= E1000_RCTL_LPE; /* Setup buffer sizes */ - if (adapter->hw.mac_type >= e1000_82571) { - /* We can now specify buffers in 1K increments. - * BSIZE and BSEX are ignored in this case. */ - rctl |= adapter->rx_buffer_len << 0x11; - } else { - rctl &= ~E1000_RCTL_SZ_4096; - rctl |= E1000_RCTL_BSEX; - switch (adapter->rx_buffer_len) { + rctl &= ~E1000_RCTL_SZ_4096; + rctl |= E1000_RCTL_BSEX; + switch (adapter->rx_buffer_len) { + case E1000_RXBUFFER_256: + rctl |= E1000_RCTL_SZ_256; + rctl &= ~E1000_RCTL_BSEX; + break; + case E1000_RXBUFFER_512: + rctl |= E1000_RCTL_SZ_512; + rctl &= ~E1000_RCTL_BSEX; + break; + case E1000_RXBUFFER_1024: + rctl |= E1000_RCTL_SZ_1024; + rctl &= ~E1000_RCTL_BSEX; + break; case E1000_RXBUFFER_2048: default: rctl |= E1000_RCTL_SZ_2048; @@ -1621,7 +1726,6 @@ e1000_setup_rctl(struct e1000_adapter *adapter) case E1000_RXBUFFER_16384: rctl |= E1000_RCTL_SZ_16384; break; - } } #ifndef CONFIG_E1000_DISABLE_PACKET_SPLIT @@ -1647,7 +1751,7 @@ e1000_setup_rctl(struct e1000_adapter *adapter) rfctl |= E1000_RFCTL_IPV6_DIS; E1000_WRITE_REG(&adapter->hw, RFCTL, rfctl); - rctl |= E1000_RCTL_DTYP_PS | E1000_RCTL_SECRC; + rctl |= E1000_RCTL_DTYP_PS; psrctl |= adapter->rx_ps_bsize0 >> E1000_PSRCTL_BSIZE0_SHIFT; @@ -1715,7 +1819,7 @@ e1000_configure_rx(struct e1000_adapter *adapter) if (hw->mac_type >= e1000_82571) { ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); /* Reset delay timers after every interrupt */ - ctrl_ext |= E1000_CTRL_EXT_CANC; + ctrl_ext |= E1000_CTRL_EXT_INT_TIMER_CLR; #ifdef CONFIG_E1000_NAPI /* Auto-Mask interrupts upon ICR read. */ ctrl_ext |= E1000_CTRL_EXT_IAME; @@ -1731,13 +1835,13 @@ e1000_configure_rx(struct e1000_adapter *adapter) case 1: default: rdba = adapter->rx_ring[0].dma; - E1000_WRITE_REG(hw, RDBAL, (rdba & 0x00000000ffffffffULL)); - E1000_WRITE_REG(hw, RDBAH, (rdba >> 32)); E1000_WRITE_REG(hw, RDLEN, rdlen); - E1000_WRITE_REG(hw, RDH, 0); + E1000_WRITE_REG(hw, RDBAH, (rdba >> 32)); + E1000_WRITE_REG(hw, RDBAL, (rdba & 0x00000000ffffffffULL)); E1000_WRITE_REG(hw, RDT, 0); - adapter->rx_ring[0].rdh = E1000_RDH; - adapter->rx_ring[0].rdt = E1000_RDT; + E1000_WRITE_REG(hw, RDH, 0); + adapter->rx_ring[0].rdh = ((hw->mac_type >= e1000_82543) ? E1000_RDH : E1000_82542_RDH); + adapter->rx_ring[0].rdt = ((hw->mac_type >= e1000_82543) ? E1000_RDT : E1000_82542_RDT); break; } @@ -1760,9 +1864,6 @@ e1000_configure_rx(struct e1000_adapter *adapter) E1000_WRITE_REG(hw, RXCSUM, rxcsum); } - if (hw->mac_type == e1000_82573) - E1000_WRITE_REG(hw, ERT, 0x0100); - /* Enable Receives */ E1000_WRITE_REG(hw, RCTL, rctl); } @@ -1807,7 +1908,7 @@ e1000_free_all_tx_resources(struct e1000_adapter *adapter) e1000_free_tx_resources(adapter, &adapter->tx_ring[i]); } -static inline void +static void e1000_unmap_and_free_tx_resource(struct e1000_adapter *adapter, struct e1000_buffer *buffer_info) { @@ -2102,6 +2203,12 @@ e1000_set_multi(struct net_device *netdev) uint32_t rctl; uint32_t hash_value; int i, rar_entries = E1000_RAR_ENTRIES; + int mta_reg_count = (hw->mac_type == e1000_ich8lan) ? + E1000_NUM_MTA_REGISTERS_ICH8LAN : + E1000_NUM_MTA_REGISTERS; + + if (adapter->hw.mac_type == e1000_ich8lan) + rar_entries = E1000_RAR_ENTRIES_ICH8LAN; /* reserve RAR[14] for LAA over-write work-around */ if (adapter->hw.mac_type == e1000_82571) @@ -2140,14 +2247,18 @@ e1000_set_multi(struct net_device *netdev) mc_ptr = mc_ptr->next; } else { E1000_WRITE_REG_ARRAY(hw, RA, i << 1, 0); + E1000_WRITE_FLUSH(hw); E1000_WRITE_REG_ARRAY(hw, RA, (i << 1) + 1, 0); + E1000_WRITE_FLUSH(hw); } } /* clear the old settings from the multicast hash table */ - for (i = 0; i < E1000_NUM_MTA_REGISTERS; i++) + for (i = 0; i < mta_reg_count; i++) { E1000_WRITE_REG_ARRAY(hw, MTA, i, 0); + E1000_WRITE_FLUSH(hw); + } /* load any remaining addresses into the hash table */ @@ -2220,19 +2331,19 @@ static void e1000_watchdog(unsigned long data) { struct e1000_adapter *adapter = (struct e1000_adapter *) data; - - /* Do the rest outside of interrupt context */ - schedule_work(&adapter->watchdog_task); -} - -static void -e1000_watchdog_task(struct e1000_adapter *adapter) -{ struct net_device *netdev = adapter->netdev; struct e1000_tx_ring *txdr = adapter->tx_ring; uint32_t link, tctl; - - e1000_check_for_link(&adapter->hw); + int32_t ret_val; + + ret_val = e1000_check_for_link(&adapter->hw); + if ((ret_val == E1000_ERR_PHY) && + (adapter->hw.phy_type == e1000_phy_igp_3) && + (E1000_READ_REG(&adapter->hw, CTRL) & E1000_PHY_CTRL_GBE_DISABLE)) { + /* See e1000_kumeran_lock_loss_workaround() */ + DPRINTK(LINK, INFO, + "Gigabit has been disabled, downgrading speed\n"); + } if (adapter->hw.mac_type == e1000_82573) { e1000_enable_tx_pkt_filtering(&adapter->hw); if (adapter->mng_vlan_id != adapter->hw.mng_cookie.vlan_id) @@ -2247,6 +2358,7 @@ e1000_watchdog_task(struct e1000_adapter *adapter) if (link) { if (!netif_carrier_ok(netdev)) { + boolean_t txb2b = 1; e1000_get_speed_and_duplex(&adapter->hw, &adapter->link_speed, &adapter->link_duplex); @@ -2260,23 +2372,22 @@ e1000_watchdog_task(struct e1000_adapter *adapter) * and adjust the timeout factor */ netdev->tx_queue_len = adapter->tx_queue_len; adapter->tx_timeout_factor = 1; - adapter->txb2b = 1; switch (adapter->link_speed) { case SPEED_10: - adapter->txb2b = 0; + txb2b = 0; netdev->tx_queue_len = 10; adapter->tx_timeout_factor = 8; break; case SPEED_100: - adapter->txb2b = 0; + txb2b = 0; netdev->tx_queue_len = 100; /* maybe add some timeout factor ? */ break; } - if ((adapter->hw.mac_type == e1000_82571 || + if ((adapter->hw.mac_type == e1000_82571 || adapter->hw.mac_type == e1000_82572) && - adapter->txb2b == 0) { + txb2b == 0) { #define SPEED_MODE_BIT (1 << 21) uint32_t tarc0; tarc0 = E1000_READ_REG(&adapter->hw, TARC0); @@ -2400,7 +2511,7 @@ e1000_watchdog_task(struct e1000_adapter *adapter) #define E1000_TX_FLAGS_VLAN_MASK 0xffff0000 #define E1000_TX_FLAGS_VLAN_SHIFT 16 -static inline int +static int e1000_tso(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, struct sk_buff *skb) { @@ -2422,7 +2533,7 @@ e1000_tso(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, hdr_len = ((skb->h.raw - skb->data) + (skb->h.th->doff << 2)); mss = skb_shinfo(skb)->gso_size; - if (skb->protocol == ntohs(ETH_P_IP)) { + if (skb->protocol == htons(ETH_P_IP)) { skb->nh.iph->tot_len = 0; skb->nh.iph->check = 0; skb->h.th->check = @@ -2480,7 +2591,7 @@ e1000_tso(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, return FALSE; } -static inline boolean_t +static boolean_t e1000_tx_csum(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, struct sk_buff *skb) { @@ -2516,7 +2627,7 @@ e1000_tx_csum(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, #define E1000_MAX_TXD_PWR 12 #define E1000_MAX_DATA_PER_TXD (1<tx_fifo_size - adapter->tx_fifo_head; @@ -2716,7 +2827,7 @@ no_fifo_stall_required: } #define MINIMUM_DHCP_PACKET_SIZE 282 -static inline int +static int e1000_transfer_dhcp_info(struct e1000_adapter *adapter, struct sk_buff *skb) { struct e1000_hw *hw = &adapter->hw; @@ -2764,7 +2875,7 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev) unsigned int nr_frags = 0; unsigned int mss = 0; int count = 0; - int tso; + int tso; unsigned int f; len -= skb->data_len; @@ -2777,7 +2888,7 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev) #ifdef NETIF_F_TSO mss = skb_shinfo(skb)->gso_size; - /* The controller does a simple calculation to + /* The controller does a simple calculation to * make sure there is enough room in the FIFO before * initiating the DMA for each buffer. The calc is: * 4 = ceil(buffer len/mss). To make sure we don't @@ -2798,9 +2909,10 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev) case e1000_82571: case e1000_82572: case e1000_82573: + case e1000_ich8lan: pull_size = min((unsigned int)4, skb->data_len); if (!__pskb_pull_tail(skb, pull_size)) { - printk(KERN_ERR + DPRINTK(DRV, ERR, "__pskb_pull_tail failed.\n"); dev_kfree_skb_any(skb); return NETDEV_TX_OK; @@ -2900,7 +3012,7 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev) /* Old method was to assume IPv4 packet by default if TSO was enabled. * 82571 hardware supports TSO capabilities for IPv6 as well... * no longer assume, we must. */ - if (likely(skb->protocol == ntohs(ETH_P_IP))) + if (likely(skb->protocol == htons(ETH_P_IP))) tx_flags |= E1000_TX_FLAGS_IPV4; e1000_tx_queue(adapter, tx_ring, tx_flags, @@ -2937,8 +3049,7 @@ e1000_reset_task(struct net_device *netdev) { struct e1000_adapter *adapter = netdev_priv(netdev); - e1000_down(adapter); - e1000_up(adapter); + e1000_reinit_locked(adapter); } /** @@ -2981,8 +3092,8 @@ e1000_change_mtu(struct net_device *netdev, int new_mtu) /* Adapter-specific max frame size limits. */ switch (adapter->hw.mac_type) { - case e1000_82542_rev2_0: - case e1000_82542_rev2_1: + case e1000_undefined ... e1000_82542_rev2_1: + case e1000_ich8lan: if (max_frame > MAXIMUM_ETHERNET_FRAME_SIZE) { DPRINTK(PROBE, ERR, "Jumbo Frames not supported.\n"); return -EINVAL; @@ -3016,34 +3127,36 @@ e1000_change_mtu(struct net_device *netdev, int new_mtu) break; } - - if (adapter->hw.mac_type > e1000_82547_rev_2) { - adapter->rx_buffer_len = max_frame; - E1000_ROUNDUP(adapter->rx_buffer_len, 1024); - } else { - if(unlikely((adapter->hw.mac_type < e1000_82543) && - (max_frame > MAXIMUM_ETHERNET_FRAME_SIZE))) { - DPRINTK(PROBE, ERR, "Jumbo Frames not supported " - "on 82542\n"); - return -EINVAL; - } else { - if(max_frame <= E1000_RXBUFFER_2048) - adapter->rx_buffer_len = E1000_RXBUFFER_2048; - else if(max_frame <= E1000_RXBUFFER_4096) - adapter->rx_buffer_len = E1000_RXBUFFER_4096; - else if(max_frame <= E1000_RXBUFFER_8192) - adapter->rx_buffer_len = E1000_RXBUFFER_8192; - else if(max_frame <= E1000_RXBUFFER_16384) - adapter->rx_buffer_len = E1000_RXBUFFER_16384; - } - } + /* NOTE: netdev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN + * means we reserve 2 more, this pushes us to allocate from the next + * larger slab size + * i.e. RXBUFFER_2048 --> size-4096 slab */ + + if (max_frame <= E1000_RXBUFFER_256) + adapter->rx_buffer_len = E1000_RXBUFFER_256; + else if (max_frame <= E1000_RXBUFFER_512) + adapter->rx_buffer_len = E1000_RXBUFFER_512; + else if (max_frame <= E1000_RXBUFFER_1024) + adapter->rx_buffer_len = E1000_RXBUFFER_1024; + else if (max_frame <= E1000_RXBUFFER_2048) + adapter->rx_buffer_len = E1000_RXBUFFER_2048; + else if (max_frame <= E1000_RXBUFFER_4096) + adapter->rx_buffer_len = E1000_RXBUFFER_4096; + else if (max_frame <= E1000_RXBUFFER_8192) + adapter->rx_buffer_len = E1000_RXBUFFER_8192; + else if (max_frame <= E1000_RXBUFFER_16384) + adapter->rx_buffer_len = E1000_RXBUFFER_16384; + + /* adjust allocation if LPE protects us, and we aren't using SBP */ + if (!adapter->hw.tbi_compatibility_on && + ((max_frame == MAXIMUM_ETHERNET_FRAME_SIZE) || + (max_frame == MAXIMUM_ETHERNET_VLAN_SIZE))) + adapter->rx_buffer_len = MAXIMUM_ETHERNET_VLAN_SIZE; netdev->mtu = new_mtu; - if (netif_running(netdev)) { - e1000_down(adapter); - e1000_up(adapter); - } + if (netif_running(netdev)) + e1000_reinit_locked(adapter); adapter->hw.max_frame_size = max_frame; @@ -3059,11 +3172,21 @@ void e1000_update_stats(struct e1000_adapter *adapter) { struct e1000_hw *hw = &adapter->hw; + struct pci_dev *pdev = adapter->pdev; unsigned long flags; uint16_t phy_tmp; #define PHY_IDLE_ERROR_COUNT_MASK 0x00FF + /* + * Prevent stats update while adapter is being reset, or if the pci + * connection is down. + */ + if (adapter->link_speed == 0) + return; + if (pdev->error_state && pdev->error_state != pci_channel_io_normal) + return; + spin_lock_irqsave(&adapter->stats_lock, flags); /* these counters are modified from e1000_adjust_tbi_stats, @@ -3078,12 +3201,15 @@ e1000_update_stats(struct e1000_adapter *adapter) adapter->stats.bprc += E1000_READ_REG(hw, BPRC); adapter->stats.mprc += E1000_READ_REG(hw, MPRC); adapter->stats.roc += E1000_READ_REG(hw, ROC); + + if (adapter->hw.mac_type != e1000_ich8lan) { adapter->stats.prc64 += E1000_READ_REG(hw, PRC64); adapter->stats.prc127 += E1000_READ_REG(hw, PRC127); adapter->stats.prc255 += E1000_READ_REG(hw, PRC255); adapter->stats.prc511 += E1000_READ_REG(hw, PRC511); adapter->stats.prc1023 += E1000_READ_REG(hw, PRC1023); adapter->stats.prc1522 += E1000_READ_REG(hw, PRC1522); + } adapter->stats.symerrs += E1000_READ_REG(hw, SYMERRS); adapter->stats.mpc += E1000_READ_REG(hw, MPC); @@ -3111,12 +3237,16 @@ e1000_update_stats(struct e1000_adapter *adapter) adapter->stats.totl += E1000_READ_REG(hw, TOTL); adapter->stats.toth += E1000_READ_REG(hw, TOTH); adapter->stats.tpr += E1000_READ_REG(hw, TPR); + + if (adapter->hw.mac_type != e1000_ich8lan) { adapter->stats.ptc64 += E1000_READ_REG(hw, PTC64); adapter->stats.ptc127 += E1000_READ_REG(hw, PTC127); adapter->stats.ptc255 += E1000_READ_REG(hw, PTC255); adapter->stats.ptc511 += E1000_READ_REG(hw, PTC511); adapter->stats.ptc1023 += E1000_READ_REG(hw, PTC1023); adapter->stats.ptc1522 += E1000_READ_REG(hw, PTC1522); + } + adapter->stats.mptc += E1000_READ_REG(hw, MPTC); adapter->stats.bptc += E1000_READ_REG(hw, BPTC); @@ -3138,6 +3268,8 @@ e1000_update_stats(struct e1000_adapter *adapter) if (hw->mac_type > e1000_82547_rev_2) { adapter->stats.iac += E1000_READ_REG(hw, IAC); adapter->stats.icrxoc += E1000_READ_REG(hw, ICRXOC); + + if (adapter->hw.mac_type != e1000_ich8lan) { adapter->stats.icrxptc += E1000_READ_REG(hw, ICRXPTC); adapter->stats.icrxatc += E1000_READ_REG(hw, ICRXATC); adapter->stats.ictxptc += E1000_READ_REG(hw, ICTXPTC); @@ -3145,6 +3277,7 @@ e1000_update_stats(struct e1000_adapter *adapter) adapter->stats.ictxqec += E1000_READ_REG(hw, ICTXQEC); adapter->stats.ictxqmtc += E1000_READ_REG(hw, ICTXQMTC); adapter->stats.icrxdmtc += E1000_READ_REG(hw, ICRXDMTC); + } } /* Fill out the OS statistics structure */ @@ -3164,7 +3297,6 @@ e1000_update_stats(struct e1000_adapter *adapter) adapter->stats.crcerrs + adapter->stats.algnerrc + adapter->stats.ruc + adapter->stats.roc + adapter->stats.cexterr; - adapter->net_stats.rx_dropped = 0; adapter->net_stats.rx_length_errors = adapter->stats.ruc + adapter->stats.roc; adapter->net_stats.rx_crc_errors = adapter->stats.crcerrs; @@ -3254,8 +3386,8 @@ e1000_intr(int irq, void *data, struct pt_regs *regs) E1000_WRITE_REG(hw, IMC, ~0); E1000_WRITE_FLUSH(hw); } - if (likely(netif_rx_schedule_prep(&adapter->polling_netdev[0]))) - __netif_rx_schedule(&adapter->polling_netdev[0]); + if (likely(netif_rx_schedule_prep(netdev))) + __netif_rx_schedule(netdev); else e1000_irq_enable(adapter); #else @@ -3298,34 +3430,26 @@ e1000_clean(struct net_device *poll_dev, int *budget) { struct e1000_adapter *adapter; int work_to_do = min(*budget, poll_dev->quota); - int tx_cleaned = 0, i = 0, work_done = 0; + int tx_cleaned = 0, work_done = 0; /* Must NOT use netdev_priv macro here. */ adapter = poll_dev->priv; /* Keep link state information with original netdev */ - if (!netif_carrier_ok(adapter->netdev)) + if (!netif_carrier_ok(poll_dev)) goto quit_polling; - while (poll_dev != &adapter->polling_netdev[i]) { - i++; - BUG_ON(i == adapter->num_rx_queues); + /* e1000_clean is called per-cpu. This lock protects + * tx_ring[0] from being cleaned by multiple cpus + * simultaneously. A failure obtaining the lock means + * tx_ring[0] is currently being cleaned anyway. */ + if (spin_trylock(&adapter->tx_queue_lock)) { + tx_cleaned = e1000_clean_tx_irq(adapter, + &adapter->tx_ring[0]); + spin_unlock(&adapter->tx_queue_lock); } - if (likely(adapter->num_tx_queues == 1)) { - /* e1000_clean is called per-cpu. This lock protects - * tx_ring[0] from being cleaned by multiple cpus - * simultaneously. A failure obtaining the lock means - * tx_ring[0] is currently being cleaned anyway. */ - if (spin_trylock(&adapter->tx_queue_lock)) { - tx_cleaned = e1000_clean_tx_irq(adapter, - &adapter->tx_ring[0]); - spin_unlock(&adapter->tx_queue_lock); - } - } else - tx_cleaned = e1000_clean_tx_irq(adapter, &adapter->tx_ring[i]); - - adapter->clean_rx(adapter, &adapter->rx_ring[i], + adapter->clean_rx(adapter, &adapter->rx_ring[0], &work_done, work_to_do); *budget -= work_done; @@ -3333,7 +3457,7 @@ e1000_clean(struct net_device *poll_dev, int *budget) /* If no Tx and not enough Rx work done, exit the polling mode */ if ((!tx_cleaned && (work_done == 0)) || - !netif_running(adapter->netdev)) { + !netif_running(poll_dev)) { quit_polling: netif_rx_complete(poll_dev); e1000_irq_enable(adapter); @@ -3390,13 +3514,15 @@ e1000_clean_tx_irq(struct e1000_adapter *adapter, tx_ring->next_to_clean = i; - spin_lock(&tx_ring->tx_lock); - +#define TX_WAKE_THRESHOLD 32 if (unlikely(cleaned && netif_queue_stopped(netdev) && - netif_carrier_ok(netdev))) - netif_wake_queue(netdev); - - spin_unlock(&tx_ring->tx_lock); + netif_carrier_ok(netdev))) { + spin_lock(&tx_ring->tx_lock); + if (netif_queue_stopped(netdev) && + (E1000_DESC_UNUSED(tx_ring) >= TX_WAKE_THRESHOLD)) + netif_wake_queue(netdev); + spin_unlock(&tx_ring->tx_lock); + } if (adapter->detect_tx_hung) { /* Detect a transmit hang in hardware, this serializes the @@ -3444,7 +3570,7 @@ e1000_clean_tx_irq(struct e1000_adapter *adapter, * @sk_buff: socket buffer with received data **/ -static inline void +static void e1000_rx_checksum(struct e1000_adapter *adapter, uint32_t status_err, uint32_t csum, struct sk_buff *skb) @@ -3546,11 +3672,15 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter, length = le16_to_cpu(rx_desc->length); + /* adjust length to remove Ethernet CRC */ + length -= 4; + if (unlikely(!(status & E1000_RXD_STAT_EOP))) { /* All receives must fit into a single buffer */ E1000_DBG("%s: Receive packet consumed multiple" " buffers\n", netdev->name); - dev_kfree_skb_irq(skb); + /* recycle */ + buffer_info-> skb = skb; goto next_desc; } @@ -3566,7 +3696,8 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter, flags); length--; } else { - dev_kfree_skb_irq(skb); + /* recycle */ + buffer_info->skb = skb; goto next_desc; } } @@ -3577,7 +3708,7 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter, #define E1000_CB_LENGTH 256 if (length < E1000_CB_LENGTH) { struct sk_buff *new_skb = - dev_alloc_skb(length + NET_IP_ALIGN); + netdev_alloc_skb(netdev, length + NET_IP_ALIGN); if (new_skb) { skb_reserve(new_skb, NET_IP_ALIGN); new_skb->dev = netdev; @@ -3674,9 +3805,9 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, i = rx_ring->next_to_clean; rx_desc = E1000_RX_DESC_PS(*rx_ring, i); staterr = le32_to_cpu(rx_desc->wb.middle.status_error); + buffer_info = &rx_ring->buffer_info[i]; while (staterr & E1000_RXD_STAT_DD) { - buffer_info = &rx_ring->buffer_info[i]; ps_page = &rx_ring->ps_page[i]; ps_page_dma = &rx_ring->ps_page_dma[i]; #ifdef CONFIG_E1000_NAPI @@ -3732,9 +3863,9 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, /* page alloc/put takes too long and effects small packet * throughput, so unsplit small packets and save the alloc/put*/ - if (l1 && ((length + l1) < E1000_CB_LENGTH)) { + if (l1 && ((length + l1) <= adapter->rx_ps_bsize0)) { u8 *vaddr; - /* there is no documentation about how to call + /* there is no documentation about how to call * kmap_atomic, so we can't hold the mapping * very long */ pci_dma_sync_single_for_cpu(pdev, @@ -3748,8 +3879,9 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, pci_dma_sync_single_for_device(pdev, ps_page_dma->ps_page_dma[0], PAGE_SIZE, PCI_DMA_FROMDEVICE); + /* remove the CRC */ + l1 -= 4; skb_put(skb, l1); - length += l1; goto copydone; } /* if */ } @@ -3768,6 +3900,10 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, skb->truesize += length; } + /* strip the ethernet crc, problem is we're using pages now so + * this whole operation can get a little cpu intensive */ + pskb_trim(skb, skb->len - 4); + copydone: e1000_rx_checksum(adapter, staterr, le16_to_cpu(rx_desc->wb.lower.hi_dword.csum_ip.csum), skb); @@ -3843,7 +3979,7 @@ e1000_alloc_rx_buffers(struct e1000_adapter *adapter, while (cleaned_count--) { if (!(skb = buffer_info->skb)) - skb = dev_alloc_skb(bufsz); + skb = netdev_alloc_skb(netdev, bufsz); else { skb_trim(skb, 0); goto map_skb; @@ -3861,7 +3997,7 @@ e1000_alloc_rx_buffers(struct e1000_adapter *adapter, DPRINTK(RX_ERR, ERR, "skb align check failed: %u bytes " "at %p\n", bufsz, skb->data); /* Try again, without freeing the previous */ - skb = dev_alloc_skb(bufsz); + skb = netdev_alloc_skb(netdev, bufsz); /* Failed allocation, critical failure */ if (!skb) { dev_kfree_skb(oldskb); @@ -3985,7 +4121,8 @@ e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter, rx_desc->read.buffer_addr[j+1] = ~0; } - skb = dev_alloc_skb(adapter->rx_ps_bsize0 + NET_IP_ALIGN); + skb = netdev_alloc_skb(netdev, + adapter->rx_ps_bsize0 + NET_IP_ALIGN); if (unlikely(!skb)) { adapter->alloc_rx_buff_failed++; @@ -4154,7 +4291,7 @@ e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) spin_unlock_irqrestore(&adapter->stats_lock, flags); return -EIO; } - if (adapter->hw.phy_type == e1000_media_type_copper) { + if (adapter->hw.media_type == e1000_media_type_copper) { switch (data->reg_num) { case PHY_CTRL: if (mii_reg & MII_CR_POWER_DOWN) @@ -4181,10 +4318,9 @@ e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) return retval; } } - if (netif_running(adapter->netdev)) { - e1000_down(adapter); - e1000_up(adapter); - } else + if (netif_running(adapter->netdev)) + e1000_reinit_locked(adapter); + else e1000_reset(adapter); break; case M88E1000_PHY_SPEC_CTRL: @@ -4201,10 +4337,9 @@ e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) case PHY_CTRL: if (mii_reg & MII_CR_POWER_DOWN) break; - if (netif_running(adapter->netdev)) { - e1000_down(adapter); - e1000_up(adapter); - } else + if (netif_running(adapter->netdev)) + e1000_reinit_locked(adapter); + else e1000_reset(adapter); break; } @@ -4251,11 +4386,13 @@ e1000_write_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t *value) pci_write_config_word(adapter->pdev, reg, *value); } +#if 0 uint32_t e1000_io_read(struct e1000_hw *hw, unsigned long port) { return inl(port); } +#endif /* 0 */ void e1000_io_write(struct e1000_hw *hw, unsigned long port, uint32_t value) @@ -4278,18 +4415,21 @@ e1000_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp) ctrl |= E1000_CTRL_VME; E1000_WRITE_REG(&adapter->hw, CTRL, ctrl); + if (adapter->hw.mac_type != e1000_ich8lan) { /* enable VLAN receive filtering */ rctl = E1000_READ_REG(&adapter->hw, RCTL); rctl |= E1000_RCTL_VFE; rctl &= ~E1000_RCTL_CFIEN; E1000_WRITE_REG(&adapter->hw, RCTL, rctl); e1000_update_mng_vlan(adapter); + } } else { /* disable VLAN tag insert/strip */ ctrl = E1000_READ_REG(&adapter->hw, CTRL); ctrl &= ~E1000_CTRL_VME; E1000_WRITE_REG(&adapter->hw, CTRL, ctrl); + if (adapter->hw.mac_type != e1000_ich8lan) { /* disable VLAN filtering */ rctl = E1000_READ_REG(&adapter->hw, RCTL); rctl &= ~E1000_RCTL_VFE; @@ -4298,6 +4438,7 @@ e1000_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp) e1000_vlan_rx_kill_vid(netdev, adapter->mng_vlan_id); adapter->mng_vlan_id = E1000_MNG_VLAN_NONE; } + } } e1000_irq_enable(adapter); @@ -4459,12 +4600,16 @@ e1000_suspend(struct pci_dev *pdev, pm_message_t state) struct e1000_adapter *adapter = netdev_priv(netdev); uint32_t ctrl, ctrl_ext, rctl, manc, status; uint32_t wufc = adapter->wol; +#ifdef CONFIG_PM int retval = 0; +#endif netif_device_detach(netdev); - if (netif_running(netdev)) + if (netif_running(netdev)) { + WARN_ON(test_bit(__E1000_RESETTING, &adapter->flags)); e1000_down(adapter); + } #ifdef CONFIG_PM /* Implement our own version of pci_save_state(pdev) because pci- @@ -4513,48 +4658,38 @@ e1000_suspend(struct pci_dev *pdev, pm_message_t state) E1000_WRITE_REG(&adapter->hw, WUC, E1000_WUC_PME_EN); E1000_WRITE_REG(&adapter->hw, WUFC, wufc); - retval = pci_enable_wake(pdev, PCI_D3hot, 1); - if (retval) - DPRINTK(PROBE, ERR, "Error enabling D3 wake\n"); - retval = pci_enable_wake(pdev, PCI_D3cold, 1); - if (retval) - DPRINTK(PROBE, ERR, "Error enabling D3 cold wake\n"); + pci_enable_wake(pdev, PCI_D3hot, 1); + pci_enable_wake(pdev, PCI_D3cold, 1); } else { E1000_WRITE_REG(&adapter->hw, WUC, 0); E1000_WRITE_REG(&adapter->hw, WUFC, 0); - retval = pci_enable_wake(pdev, PCI_D3hot, 0); - if (retval) - DPRINTK(PROBE, ERR, "Error enabling D3 wake\n"); - retval = pci_enable_wake(pdev, PCI_D3cold, 0); - if (retval) - DPRINTK(PROBE, ERR, "Error enabling D3 cold wake\n"); + pci_enable_wake(pdev, PCI_D3hot, 0); + pci_enable_wake(pdev, PCI_D3cold, 0); } + /* FIXME: this code is incorrect for PCI Express */ if (adapter->hw.mac_type >= e1000_82540 && + adapter->hw.mac_type != e1000_ich8lan && adapter->hw.media_type == e1000_media_type_copper) { manc = E1000_READ_REG(&adapter->hw, MANC); if (manc & E1000_MANC_SMBUS_EN) { manc |= E1000_MANC_ARP_EN; E1000_WRITE_REG(&adapter->hw, MANC, manc); - retval = pci_enable_wake(pdev, PCI_D3hot, 1); - if (retval) - DPRINTK(PROBE, ERR, "Error enabling D3 wake\n"); - retval = pci_enable_wake(pdev, PCI_D3cold, 1); - if (retval) - DPRINTK(PROBE, ERR, - "Error enabling D3 cold wake\n"); + pci_enable_wake(pdev, PCI_D3hot, 1); + pci_enable_wake(pdev, PCI_D3cold, 1); } } + if (adapter->hw.phy_type == e1000_phy_igp_3) + e1000_phy_powerdown_workaround(&adapter->hw); + /* Release control of h/w to f/w. If f/w is AMT enabled, this * would have already happened in close and is redundant. */ e1000_release_hw_control(adapter); pci_disable_device(pdev); - retval = pci_set_power_state(pdev, pci_choose_state(pdev, state)); - if (retval) - DPRINTK(PROBE, ERR, "Error in setting power state\n"); + pci_set_power_state(pdev, pci_choose_state(pdev, state)); return 0; } @@ -4565,22 +4700,15 @@ e1000_resume(struct pci_dev *pdev) { struct net_device *netdev = pci_get_drvdata(pdev); struct e1000_adapter *adapter = netdev_priv(netdev); - int retval; uint32_t manc, ret_val; - retval = pci_set_power_state(pdev, PCI_D0); - if (retval) - DPRINTK(PROBE, ERR, "Error in setting power state\n"); + pci_set_power_state(pdev, PCI_D0); e1000_pci_restore_state(adapter); ret_val = pci_enable_device(pdev); pci_set_master(pdev); - retval = pci_enable_wake(pdev, PCI_D3hot, 0); - if (retval) - DPRINTK(PROBE, ERR, "Error enabling D3 wake\n"); - retval = pci_enable_wake(pdev, PCI_D3cold, 0); - if (retval) - DPRINTK(PROBE, ERR, "Error enabling D3 cold wake\n"); + pci_enable_wake(pdev, PCI_D3hot, 0); + pci_enable_wake(pdev, PCI_D3cold, 0); e1000_reset(adapter); E1000_WRITE_REG(&adapter->hw, WUS, ~0); @@ -4590,7 +4718,9 @@ e1000_resume(struct pci_dev *pdev) netif_device_attach(netdev); + /* FIXME: this code is incorrect for PCI Express */ if (adapter->hw.mac_type >= e1000_82540 && + adapter->hw.mac_type != e1000_ich8lan && adapter->hw.media_type == e1000_media_type_copper) { manc = E1000_READ_REG(&adapter->hw, MANC); manc &= ~(E1000_MANC_ARP_EN); @@ -4624,6 +4754,7 @@ static void e1000_netpoll(struct net_device *netdev) { struct e1000_adapter *adapter = netdev_priv(netdev); + disable_irq(adapter->pdev->irq); e1000_intr(adapter->pdev->irq, netdev, NULL); e1000_clean_tx_irq(adapter, adapter->tx_ring); @@ -4634,4 +4765,101 @@ e1000_netpoll(struct net_device *netdev) } #endif +/** + * e1000_io_error_detected - called when PCI error is detected + * @pdev: Pointer to PCI device + * @state: The current pci conneection state + * + * This function is called after a PCI bus error affecting + * this device has been detected. + */ +static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev, pci_channel_state_t state) +{ + struct net_device *netdev = pci_get_drvdata(pdev); + struct e1000_adapter *adapter = netdev->priv; + + netif_device_detach(netdev); + + if (netif_running(netdev)) + e1000_down(adapter); + + /* Request a slot slot reset. */ + return PCI_ERS_RESULT_NEED_RESET; +} + +/** + * e1000_io_slot_reset - called after the pci bus has been reset. + * @pdev: Pointer to PCI device + * + * Restart the card from scratch, as if from a cold-boot. Implementation + * resembles the first-half of the e1000_resume routine. + */ +static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev) +{ + struct net_device *netdev = pci_get_drvdata(pdev); + struct e1000_adapter *adapter = netdev->priv; + + if (pci_enable_device(pdev)) { + printk(KERN_ERR "e1000: Cannot re-enable PCI device after reset.\n"); + return PCI_ERS_RESULT_DISCONNECT; + } + pci_set_master(pdev); + + pci_enable_wake(pdev, 3, 0); + pci_enable_wake(pdev, 4, 0); /* 4 == D3 cold */ + + /* Perform card reset only on one instance of the card */ + if (PCI_FUNC (pdev->devfn) != 0) + return PCI_ERS_RESULT_RECOVERED; + + e1000_reset(adapter); + E1000_WRITE_REG(&adapter->hw, WUS, ~0); + + return PCI_ERS_RESULT_RECOVERED; +} + +/** + * e1000_io_resume - called when traffic can start flowing again. + * @pdev: Pointer to PCI device + * + * This callback is called when the error recovery driver tells us that + * its OK to resume normal operation. Implementation resembles the + * second-half of the e1000_resume routine. + */ +static void e1000_io_resume(struct pci_dev *pdev) +{ + struct net_device *netdev = pci_get_drvdata(pdev); + struct e1000_adapter *adapter = netdev->priv; + uint32_t manc, swsm; + + if (netif_running(netdev)) { + if (e1000_up(adapter)) { + printk("e1000: can't bring device back up after reset\n"); + return; + } + } + + netif_device_attach(netdev); + + if (adapter->hw.mac_type >= e1000_82540 && + adapter->hw.media_type == e1000_media_type_copper) { + manc = E1000_READ_REG(&adapter->hw, MANC); + manc &= ~(E1000_MANC_ARP_EN); + E1000_WRITE_REG(&adapter->hw, MANC, manc); + } + + switch (adapter->hw.mac_type) { + case e1000_82573: + swsm = E1000_READ_REG(&adapter->hw, SWSM); + E1000_WRITE_REG(&adapter->hw, SWSM, + swsm | E1000_SWSM_DRV_LOAD); + break; + default: + break; + } + + if (netif_running(netdev)) + mod_timer(&adapter->watchdog_timer, jiffies); +} + /* e1000_main.c */ diff --git a/drivers/net/e1000/e1000_osdep.h b/drivers/net/e1000/e1000_osdep.h index 9790db974..2d3e8b06c 100644 --- a/drivers/net/e1000/e1000_osdep.h +++ b/drivers/net/e1000/e1000_osdep.h @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2006 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 @@ -22,6 +22,7 @@ Contact Information: Linux NICS + e1000-devel Mailing List Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 *******************************************************************************/ @@ -126,4 +127,17 @@ typedef enum { #define E1000_WRITE_FLUSH(a) E1000_READ_REG(a, STATUS) +#define E1000_WRITE_ICH8_REG(a, reg, value) ( \ + writel((value), ((a)->flash_address + reg))) + +#define E1000_READ_ICH8_REG(a, reg) ( \ + readl((a)->flash_address + reg)) + +#define E1000_WRITE_ICH8_REG16(a, reg, value) ( \ + writew((value), ((a)->flash_address + reg))) + +#define E1000_READ_ICH8_REG16(a, reg) ( \ + readw((a)->flash_address + reg)) + + #endif /* _E1000_OSDEP_H_ */ diff --git a/drivers/net/e1000/e1000_param.c b/drivers/net/e1000/e1000_param.c index e0a4d37d1..0ef413172 100644 --- a/drivers/net/e1000/e1000_param.c +++ b/drivers/net/e1000/e1000_param.c @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2006 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 @@ -22,6 +22,7 @@ Contact Information: Linux NICS + e1000-devel Mailing List Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 *******************************************************************************/ @@ -44,6 +45,16 @@ */ #define E1000_PARAM_INIT { [0 ... E1000_MAX_NIC] = OPTION_UNSET } +/* Module Parameters are always initialized to -1, so that the driver + * can tell the difference between no user specified value or the + * user asking for the default value. + * The true default values are loaded in when e1000_check_options is called. + * + * This is a GCC extension to ANSI C. + * See the item "Labeled Elements in Initializers" in the section + * "Extensions to the C Language Family" of the GCC documentation. + */ + #define E1000_PARAM(X, desc) \ static int __devinitdata X[E1000_MAX_NIC+1] = E1000_PARAM_INIT; \ static int num_##X = 0; \ @@ -182,6 +193,24 @@ E1000_PARAM(RxAbsIntDelay, "Receive Absolute Interrupt Delay"); E1000_PARAM(InterruptThrottleRate, "Interrupt Throttling Rate"); +/* Enable Smart Power Down of the PHY + * + * Valid Range: 0, 1 + * + * Default Value: 0 (disabled) + */ + +E1000_PARAM(SmartPowerDownEnable, "Enable PHY smart power down"); + +/* Enable Kumeran Lock Loss workaround + * + * Valid Range: 0, 1 + * + * Default Value: 1 (enabled) + */ + +E1000_PARAM(KumeranLockLoss, "Enable Kumeran lock loss workaround"); + #define AUTONEG_ADV_DEFAULT 0x2F #define AUTONEG_ADV_MASK 0x2F #define FLOW_CONTROL_DEFAULT FLOW_CONTROL_FULL @@ -295,6 +324,7 @@ e1000_check_options(struct e1000_adapter *adapter) DPRINTK(PROBE, NOTICE, "Warning: no configuration for board #%i\n", bd); DPRINTK(PROBE, NOTICE, "Using defaults for all values\n"); + bd = E1000_MAX_NIC; } { /* Transmit Descriptor Count */ @@ -312,14 +342,9 @@ e1000_check_options(struct e1000_adapter *adapter) opt.arg.r.max = mac_type < e1000_82544 ? E1000_MAX_TXD : E1000_MAX_82544_TXD; - if (num_TxDescriptors > bd) { - tx_ring->count = TxDescriptors[bd]; - e1000_validate_option(&tx_ring->count, &opt, adapter); - E1000_ROUNDUP(tx_ring->count, - REQ_TX_DESCRIPTOR_MULTIPLE); - } else { - tx_ring->count = opt.def; - } + tx_ring->count = TxDescriptors[bd]; + e1000_validate_option(&tx_ring->count, &opt, adapter); + E1000_ROUNDUP(tx_ring->count, REQ_TX_DESCRIPTOR_MULTIPLE); for (i = 0; i < adapter->num_tx_queues; i++) tx_ring[i].count = tx_ring->count; } @@ -338,14 +363,9 @@ e1000_check_options(struct e1000_adapter *adapter) opt.arg.r.max = mac_type < e1000_82544 ? E1000_MAX_RXD : E1000_MAX_82544_RXD; - if (num_RxDescriptors > bd) { - rx_ring->count = RxDescriptors[bd]; - e1000_validate_option(&rx_ring->count, &opt, adapter); - E1000_ROUNDUP(rx_ring->count, - REQ_RX_DESCRIPTOR_MULTIPLE); - } else { - rx_ring->count = opt.def; - } + rx_ring->count = RxDescriptors[bd]; + e1000_validate_option(&rx_ring->count, &opt, adapter); + E1000_ROUNDUP(rx_ring->count, REQ_RX_DESCRIPTOR_MULTIPLE); for (i = 0; i < adapter->num_rx_queues; i++) rx_ring[i].count = rx_ring->count; } @@ -357,13 +377,9 @@ e1000_check_options(struct e1000_adapter *adapter) .def = OPTION_ENABLED }; - if (num_XsumRX > bd) { - int rx_csum = XsumRX[bd]; - e1000_validate_option(&rx_csum, &opt, adapter); - adapter->rx_csum = rx_csum; - } else { - adapter->rx_csum = opt.def; - } + int rx_csum = XsumRX[bd]; + e1000_validate_option(&rx_csum, &opt, adapter); + adapter->rx_csum = rx_csum; } { /* Flow Control */ @@ -383,13 +399,9 @@ e1000_check_options(struct e1000_adapter *adapter) .p = fc_list }} }; - if (num_FlowControl > bd) { - int fc = FlowControl[bd]; - e1000_validate_option(&fc, &opt, adapter); - adapter->hw.fc = adapter->hw.original_fc = fc; - } else { - adapter->hw.fc = adapter->hw.original_fc = opt.def; - } + int fc = FlowControl[bd]; + e1000_validate_option(&fc, &opt, adapter); + adapter->hw.fc = adapter->hw.original_fc = fc; } { /* Transmit Interrupt Delay */ struct e1000_option opt = { @@ -401,13 +413,8 @@ e1000_check_options(struct e1000_adapter *adapter) .max = MAX_TXDELAY }} }; - if (num_TxIntDelay > bd) { - adapter->tx_int_delay = TxIntDelay[bd]; - e1000_validate_option(&adapter->tx_int_delay, &opt, - adapter); - } else { - adapter->tx_int_delay = opt.def; - } + adapter->tx_int_delay = TxIntDelay[bd]; + e1000_validate_option(&adapter->tx_int_delay, &opt, adapter); } { /* Transmit Absolute Interrupt Delay */ struct e1000_option opt = { @@ -419,13 +426,9 @@ e1000_check_options(struct e1000_adapter *adapter) .max = MAX_TXABSDELAY }} }; - if (num_TxAbsIntDelay > bd) { - adapter->tx_abs_int_delay = TxAbsIntDelay[bd]; - e1000_validate_option(&adapter->tx_abs_int_delay, &opt, - adapter); - } else { - adapter->tx_abs_int_delay = opt.def; - } + adapter->tx_abs_int_delay = TxAbsIntDelay[bd]; + e1000_validate_option(&adapter->tx_abs_int_delay, &opt, + adapter); } { /* Receive Interrupt Delay */ struct e1000_option opt = { @@ -437,13 +440,8 @@ e1000_check_options(struct e1000_adapter *adapter) .max = MAX_RXDELAY }} }; - if (num_RxIntDelay > bd) { - adapter->rx_int_delay = RxIntDelay[bd]; - e1000_validate_option(&adapter->rx_int_delay, &opt, - adapter); - } else { - adapter->rx_int_delay = opt.def; - } + adapter->rx_int_delay = RxIntDelay[bd]; + e1000_validate_option(&adapter->rx_int_delay, &opt, adapter); } { /* Receive Absolute Interrupt Delay */ struct e1000_option opt = { @@ -455,13 +453,9 @@ e1000_check_options(struct e1000_adapter *adapter) .max = MAX_RXABSDELAY }} }; - if (num_RxAbsIntDelay > bd) { - adapter->rx_abs_int_delay = RxAbsIntDelay[bd]; - e1000_validate_option(&adapter->rx_abs_int_delay, &opt, - adapter); - } else { - adapter->rx_abs_int_delay = opt.def; - } + adapter->rx_abs_int_delay = RxAbsIntDelay[bd]; + e1000_validate_option(&adapter->rx_abs_int_delay, &opt, + adapter); } { /* Interrupt Throttling Rate */ struct e1000_option opt = { @@ -473,26 +467,44 @@ e1000_check_options(struct e1000_adapter *adapter) .max = MAX_ITR }} }; - if (num_InterruptThrottleRate > bd) { - adapter->itr = InterruptThrottleRate[bd]; - switch (adapter->itr) { - case 0: - DPRINTK(PROBE, INFO, "%s turned off\n", - opt.name); - break; - case 1: - DPRINTK(PROBE, INFO, "%s set to dynamic mode\n", - opt.name); - break; - default: - e1000_validate_option(&adapter->itr, &opt, - adapter); - break; - } - } else { - adapter->itr = opt.def; + adapter->itr = InterruptThrottleRate[bd]; + switch (adapter->itr) { + case 0: + DPRINTK(PROBE, INFO, "%s turned off\n", opt.name); + break; + case 1: + DPRINTK(PROBE, INFO, "%s set to dynamic mode\n", + opt.name); + break; + default: + e1000_validate_option(&adapter->itr, &opt, adapter); + break; } } + { /* Smart Power Down */ + struct e1000_option opt = { + .type = enable_option, + .name = "PHY Smart Power Down", + .err = "defaulting to Disabled", + .def = OPTION_DISABLED + }; + + int spd = SmartPowerDownEnable[bd]; + e1000_validate_option(&spd, &opt, adapter); + adapter->smart_power_down = spd; + } + { /* Kumeran Lock Loss Workaround */ + struct e1000_option opt = { + .type = enable_option, + .name = "Kumeran Lock Loss Workaround", + .err = "defaulting to Enabled", + .def = OPTION_ENABLED + }; + + int kmrn_lock_loss = KumeranLockLoss[bd]; + e1000_validate_option(&kmrn_lock_loss, &opt, adapter); + adapter->hw.kmrn_lock_loss_workaround_disabled = !kmrn_lock_loss; + } switch (adapter->hw.media_type) { case e1000_media_type_fiber: @@ -518,17 +530,18 @@ static void __devinit e1000_check_fiber_options(struct e1000_adapter *adapter) { int bd = adapter->bd_number; - if (num_Speed > bd) { + bd = bd > E1000_MAX_NIC ? E1000_MAX_NIC : bd; + if ((Speed[bd] != OPTION_UNSET)) { DPRINTK(PROBE, INFO, "Speed not valid for fiber adapters, " "parameter ignored\n"); } - if (num_Duplex > bd) { + if ((Duplex[bd] != OPTION_UNSET)) { DPRINTK(PROBE, INFO, "Duplex not valid for fiber adapters, " "parameter ignored\n"); } - if ((num_AutoNeg > bd) && (AutoNeg[bd] != 0x20)) { + if ((AutoNeg[bd] != OPTION_UNSET) && (AutoNeg[bd] != 0x20)) { DPRINTK(PROBE, INFO, "AutoNeg other than 1000/Full is " "not valid for fiber adapters, " "parameter ignored\n"); @@ -547,6 +560,7 @@ e1000_check_copper_options(struct e1000_adapter *adapter) { int speed, dplx, an; int bd = adapter->bd_number; + bd = bd > E1000_MAX_NIC ? E1000_MAX_NIC : bd; { /* Speed */ struct e1000_opt_list speed_list[] = {{ 0, "" }, @@ -563,12 +577,8 @@ e1000_check_copper_options(struct e1000_adapter *adapter) .p = speed_list }} }; - if (num_Speed > bd) { - speed = Speed[bd]; - e1000_validate_option(&speed, &opt, adapter); - } else { - speed = opt.def; - } + speed = Speed[bd]; + e1000_validate_option(&speed, &opt, adapter); } { /* Duplex */ struct e1000_opt_list dplx_list[] = {{ 0, "" }, @@ -590,15 +600,11 @@ e1000_check_copper_options(struct e1000_adapter *adapter) "Speed/Duplex/AutoNeg parameter ignored.\n"); return; } - if (num_Duplex > bd) { - dplx = Duplex[bd]; - e1000_validate_option(&dplx, &opt, adapter); - } else { - dplx = opt.def; - } + dplx = Duplex[bd]; + e1000_validate_option(&dplx, &opt, adapter); } - if ((num_AutoNeg > bd) && (speed != 0 || dplx != 0)) { + if (AutoNeg[bd] != OPTION_UNSET && (speed != 0 || dplx != 0)) { DPRINTK(PROBE, INFO, "AutoNeg specified along with Speed or Duplex, " "parameter ignored\n"); @@ -647,19 +653,15 @@ e1000_check_copper_options(struct e1000_adapter *adapter) .p = an_list }} }; - if (num_AutoNeg > bd) { - an = AutoNeg[bd]; - e1000_validate_option(&an, &opt, adapter); - } else { - an = opt.def; - } + an = AutoNeg[bd]; + e1000_validate_option(&an, &opt, adapter); adapter->hw.autoneg_advertised = an; } switch (speed + dplx) { case 0: adapter->hw.autoneg = adapter->fc_autoneg = 1; - if ((num_Speed > bd) && (speed != 0 || dplx != 0)) + if (Speed[bd] != OPTION_UNSET || Duplex[bd] != OPTION_UNSET) DPRINTK(PROBE, INFO, "Speed and duplex autonegotiation enabled\n"); break; diff --git a/drivers/net/e2100.c b/drivers/net/e2100.c index e5c5cd2a2..e4e733a38 100644 --- a/drivers/net/e2100.c +++ b/drivers/net/e2100.c @@ -425,8 +425,8 @@ MODULE_LICENSE("GPL"); /* This is set up so that only a single autoprobe takes place per call. ISA device autoprobes on a running machine are not recommended. */ -int -init_module(void) + +int __init init_module(void) { struct net_device *dev; int this_dev, found = 0; diff --git a/drivers/net/eepro.c b/drivers/net/eepro.c index a806dfe54..8dc61d65d 100644 --- a/drivers/net/eepro.c +++ b/drivers/net/eepro.c @@ -920,7 +920,7 @@ static int eepro_grab_irq(struct net_device *dev) eepro_sw2bank0(ioaddr); /* Switch back to Bank 0 */ - if (request_irq (*irqp, NULL, SA_SHIRQ, "bogus", dev) != EBUSY) { + if (request_irq (*irqp, NULL, IRQF_SHARED, "bogus", dev) != EBUSY) { unsigned long irq_mask; /* Twinkle the interrupt, and check if it's seen */ irq_mask = probe_irq_on(); @@ -1154,8 +1154,7 @@ static int eepro_send_packet(struct sk_buff *skb, struct net_device *dev) printk(KERN_DEBUG "%s: entering eepro_send_packet routine.\n", dev->name); if (length < ETH_ZLEN) { - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) + if (skb_padto(skb, ETH_ZLEN)) return 0; length = ETH_ZLEN; } @@ -1808,8 +1807,7 @@ MODULE_PARM_DESC(irq, "EtherExpress Pro/10 IRQ number(s)"); MODULE_PARM_DESC(mem, "EtherExpress Pro/10 Rx buffer size(es) in kB (3-29)"); MODULE_PARM_DESC(autodetect, "EtherExpress Pro/10 force board(s) detection (0-1)"); -int -init_module(void) +int __init init_module(void) { struct net_device *dev; int i; diff --git a/drivers/net/eepro100.c b/drivers/net/eepro100.c index 467fc8613..e445988c9 100644 --- a/drivers/net/eepro100.c +++ b/drivers/net/eepro100.c @@ -87,7 +87,6 @@ static int options[] = {-1, -1, -1, -1, -1, -1, -1, -1}; /* Size of an pre-allocated Rx buffer: + slack.*/ #define PKT_BUF_SZ 1536 -#include #include #include @@ -278,11 +277,6 @@ having to sign an Intel NDA when I'm helping Intel sell their own product! static int speedo_found1(struct pci_dev *pdev, void __iomem *ioaddr, int fnd_cnt, int acpi_idle_state); -enum pci_flags_bit { - PCI_USES_IO=1, PCI_USES_MEM=2, PCI_USES_MASTER=4, - PCI_ADDR0=0x10<<0, PCI_ADDR1=0x10<<1, PCI_ADDR2=0x10<<2, PCI_ADDR3=0x10<<3, -}; - /* Offsets to the various registers. All accesses need not be longword aligned. */ enum speedo_offsets { @@ -561,12 +555,12 @@ static int __devinit eepro100_init_one (struct pci_dev *pdev, if (!request_region(pci_resource_start(pdev, 1), pci_resource_len(pdev, 1), "eepro100")) { - printk (KERN_ERR "eepro100: cannot reserve I/O ports\n"); + dev_err(&pdev->dev, "eepro100: cannot reserve I/O ports\n"); goto err_out_none; } if (!request_mem_region(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0), "eepro100")) { - printk (KERN_ERR "eepro100: cannot reserve MMIO region\n"); + dev_err(&pdev->dev, "eepro100: cannot reserve MMIO region\n"); goto err_out_free_pio_region; } @@ -579,7 +573,7 @@ static int __devinit eepro100_init_one (struct pci_dev *pdev, ioaddr = pci_iomap(pdev, pci_bar, 0); if (!ioaddr) { - printk (KERN_ERR "eepro100: cannot remap IO\n"); + dev_err(&pdev->dev, "eepro100: cannot remap IO\n"); goto err_out_free_mmio_region; } @@ -983,7 +977,7 @@ speedo_open(struct net_device *dev) sp->in_interrupt = 0; /* .. we can safely take handler calls during init. */ - retval = request_irq(dev->irq, &speedo_interrupt, SA_SHIRQ, dev->name, dev); + retval = request_irq(dev->irq, &speedo_interrupt, IRQF_SHARED, dev->name, dev); if (retval) { return retval; } diff --git a/drivers/net/eexpress.c b/drivers/net/eexpress.c index 82bd356e4..0701c1d81 100644 --- a/drivers/net/eexpress.c +++ b/drivers/net/eexpress.c @@ -97,7 +97,6 @@ #define LOCKUP16 0 #endif -#include #include #include #include @@ -677,8 +676,7 @@ static int eexp_xmit(struct sk_buff *buf, struct net_device *dev) #endif if (buf->len < ETH_ZLEN) { - buf = skb_padto(buf, ETH_ZLEN); - if (buf == NULL) + if (skb_padto(buf, ETH_ZLEN)) return 0; length = ETH_ZLEN; } @@ -1700,7 +1698,7 @@ MODULE_LICENSE("GPL"); * are specified, we verify and then use them. If no parameters are given, we * autoprobe for one card only. */ -int init_module(void) +int __init init_module(void) { struct net_device *dev; int this_dev, found = 0; diff --git a/drivers/net/epic100.c b/drivers/net/epic100.c index 2f7b86837..a67650ccf 100644 --- a/drivers/net/epic100.c +++ b/drivers/net/epic100.c @@ -19,62 +19,15 @@ Information and updates available at http://www.scyld.com/network/epic100.html + [this link no longer provides anything useful -jgarzik] --------------------------------------------------------------------- - - Linux kernel-specific changes: - - LK1.1.2 (jgarzik): - * Merge becker version 1.09 (4/08/2000) - - LK1.1.3: - * Major bugfix to 1.09 driver (Francis Romieu) - - LK1.1.4 (jgarzik): - * Merge becker test version 1.09 (5/29/2000) - - LK1.1.5: - * Fix locking (jgarzik) - * Limit 83c175 probe to ethernet-class PCI devices (rgooch) - - LK1.1.6: - * Merge becker version 1.11 - * Move pci_enable_device before any PCI BAR len checks - - LK1.1.7: - * { fill me in } - - LK1.1.8: - * ethtool driver info support (jgarzik) - - LK1.1.9: - * ethtool media get/set support (jgarzik) - - LK1.1.10: - * revert MII transceiver init change (jgarzik) - - LK1.1.11: - * implement ETHTOOL_[GS]SET, _NWAY_RST, _[GS]MSGLVL, _GLINK (jgarzik) - * replace some MII-related magic numbers with constants - - LK1.1.12: - * fix power-up sequence - - LK1.1.13: - * revert version 1.1.12, power-up sequence "fix" - - LK1.1.14 (Kryzsztof Halasa): - * fix spurious bad initializations - * pound phy a la SMSC's app note on the subject - - AC1.1.14ac - * fix power up/down for ethtool that broke in 1.11 */ #define DRV_NAME "epic100" -#define DRV_VERSION "1.11+LK1.1.14+AC1.1.14" -#define DRV_RELDATE "June 2, 2004" +#define DRV_VERSION "2.0" +#define DRV_RELDATE "June 27, 2006" /* The user-configurable values. These may be modified when a driver module is loaded.*/ @@ -114,7 +67,6 @@ static int rx_copybreak; #define TX_FIFO_THRESH 256 #define RX_FIFO_THRESH 1 /* 0-3, 0==32, 64,96, or 3==128 bytes */ -#include #include #include #include @@ -191,23 +143,10 @@ IVc. Errata */ -enum pci_id_flags_bits { - /* Set PCI command register bits before calling probe1(). */ - PCI_USES_IO=1, PCI_USES_MEM=2, PCI_USES_MASTER=4, - /* Read and map the single following PCI BAR. */ - PCI_ADDR0=0<<4, PCI_ADDR1=1<<4, PCI_ADDR2=2<<4, PCI_ADDR3=3<<4, - PCI_ADDR_64BITS=0x100, PCI_NO_ACPI_WAKE=0x200, PCI_NO_MIN_LATENCY=0x400, -}; - enum chip_capability_flags { MII_PWRDWN=1, TYPE2_INTR=2, NO_MII=4 }; #define EPIC_TOTAL_SIZE 0x100 #define USE_IO_OPS 1 -#ifdef USE_IO_OPS -#define EPIC_IOTYPE PCI_USES_MASTER|PCI_USES_IO|PCI_ADDR0 -#else -#define EPIC_IOTYPE PCI_USES_MASTER|PCI_USES_MEM|PCI_ADDR1 -#endif typedef enum { SMSC_83C170_0, @@ -218,20 +157,15 @@ typedef enum { struct epic_chip_info { const char *name; - enum pci_id_flags_bits pci_flags; - int io_size; /* Needed for I/O region check or ioremap(). */ int drv_flags; /* Driver use, intended as capability flags. */ }; /* indexed by chip_t */ static const struct epic_chip_info pci_id_tbl[] = { - { "SMSC EPIC/100 83c170", - EPIC_IOTYPE, EPIC_TOTAL_SIZE, TYPE2_INTR | NO_MII | MII_PWRDWN }, - { "SMSC EPIC/100 83c170", - EPIC_IOTYPE, EPIC_TOTAL_SIZE, TYPE2_INTR }, - { "SMSC EPIC/C 83c175", - EPIC_IOTYPE, EPIC_TOTAL_SIZE, TYPE2_INTR | MII_PWRDWN }, + { "SMSC EPIC/100 83c170", TYPE2_INTR | NO_MII | MII_PWRDWN }, + { "SMSC EPIC/100 83c170", TYPE2_INTR }, + { "SMSC EPIC/C 83c175", TYPE2_INTR | MII_PWRDWN }, }; @@ -244,7 +178,7 @@ static struct pci_device_id epic_pci_tbl[] = { }; MODULE_DEVICE_TABLE (pci, epic_pci_tbl); - + #ifndef USE_IO_OPS #undef inb #undef inw @@ -370,7 +304,7 @@ static int epic_close(struct net_device *dev); static struct net_device_stats *epic_get_stats(struct net_device *dev); static void set_rx_mode(struct net_device *dev); - + static int __devinit epic_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) @@ -392,20 +326,20 @@ static int __devinit epic_init_one (struct pci_dev *pdev, printk (KERN_INFO "%s" KERN_INFO "%s" KERN_INFO "%s", version, version2, version3); #endif - + card_idx++; - + ret = pci_enable_device(pdev); if (ret) goto out; irq = pdev->irq; - if (pci_resource_len(pdev, 0) < pci_id_tbl[chip_idx].io_size) { - printk (KERN_ERR "card %d: no PCI region space\n", card_idx); + if (pci_resource_len(pdev, 0) < EPIC_TOTAL_SIZE) { + dev_err(&pdev->dev, "no PCI region space\n"); ret = -ENODEV; goto err_out_disable; } - + pci_set_master(pdev); ret = pci_request_regions(pdev, DRV_NAME); @@ -416,7 +350,7 @@ static int __devinit epic_init_one (struct pci_dev *pdev, dev = alloc_etherdev(sizeof (*ep)); if (!dev) { - printk (KERN_ERR "card %d: no memory for eth device\n", card_idx); + dev_err(&pdev->dev, "no memory for eth device\n"); goto err_out_free_res; } SET_MODULE_OWNER(dev); @@ -428,7 +362,7 @@ static int __devinit epic_init_one (struct pci_dev *pdev, ioaddr = pci_resource_start (pdev, 1); ioaddr = (long) ioremap (ioaddr, pci_resource_len (pdev, 1)); if (!ioaddr) { - printk (KERN_ERR DRV_NAME " %d: ioremap failed\n", card_idx); + dev_err(&pdev->dev, "ioremap failed\n"); goto err_out_free_netdev; } #endif @@ -488,8 +422,7 @@ static int __devinit epic_init_one (struct pci_dev *pdev, ((u16 *)dev->dev_addr)[i] = le16_to_cpu(inw(ioaddr + LAN0 + i*4)); if (debug > 2) { - printk(KERN_DEBUG DRV_NAME "(%s): EEPROM contents\n", - pci_name(pdev)); + dev_printk(KERN_DEBUG, &pdev->dev, "EEPROM contents:\n"); for (i = 0; i < 64; i++) printk(" %4.4x%s", read_eeprom(ioaddr, i), i % 16 == 15 ? "\n" : ""); @@ -498,7 +431,7 @@ static int __devinit epic_init_one (struct pci_dev *pdev, ep->pci_dev = pdev; ep->chip_id = chip_idx; ep->chip_flags = pci_id_tbl[chip_idx].drv_flags; - ep->irq_mask = + ep->irq_mask = (ep->chip_flags & TYPE2_INTR ? PCIBusErr175 : PCIBusErr170) | CntFull | TxUnderrun | EpicNapiEvent; @@ -511,21 +444,23 @@ static int __devinit epic_init_one (struct pci_dev *pdev, int mii_status = mdio_read(dev, phy, MII_BMSR); if (mii_status != 0xffff && mii_status != 0x0000) { ep->phys[phy_idx++] = phy; - printk(KERN_INFO DRV_NAME "(%s): MII transceiver #%d control " - "%4.4x status %4.4x.\n", - pci_name(pdev), phy, mdio_read(dev, phy, 0), mii_status); + dev_info(&pdev->dev, + "MII transceiver #%d control " + "%4.4x status %4.4x.\n", + phy, mdio_read(dev, phy, 0), mii_status); } } ep->mii_phy_cnt = phy_idx; if (phy_idx != 0) { phy = ep->phys[0]; ep->mii.advertising = mdio_read(dev, phy, MII_ADVERTISE); - printk(KERN_INFO DRV_NAME "(%s): Autonegotiation advertising %4.4x link " + dev_info(&pdev->dev, + "Autonegotiation advertising %4.4x link " "partner %4.4x.\n", - pci_name(pdev), ep->mii.advertising, mdio_read(dev, phy, 5)); + ep->mii.advertising, mdio_read(dev, phy, 5)); } else if ( ! (ep->chip_flags & NO_MII)) { - printk(KERN_WARNING DRV_NAME "(%s): ***WARNING***: No MII transceiver found!\n", - pci_name(pdev)); + dev_warn(&pdev->dev, + "***WARNING***: No MII transceiver found!\n"); /* Use the known PHY address of the EPII. */ ep->phys[0] = 3; } @@ -540,8 +475,7 @@ static int __devinit epic_init_one (struct pci_dev *pdev, /* The lower four bits are the media type. */ if (duplex) { ep->mii.force_media = ep->mii.full_duplex = 1; - printk(KERN_INFO DRV_NAME "(%s): Forced full duplex operation requested.\n", - pci_name(pdev)); + dev_info(&pdev->dev, "Forced full duplex requested.\n"); } dev->if_port = ep->default_port = option; @@ -587,7 +521,7 @@ err_out_disable: pci_disable_device(pdev); goto out; } - + /* Serial EEPROM section. */ /* EEPROM_Ctrl bits. */ @@ -709,7 +643,7 @@ static void mdio_write(struct net_device *dev, int phy_id, int loc, int value) outw(value, ioaddr + MIIData); outl((phy_id << 9) | (loc << 4) | MII_WRITEOP, ioaddr + MIICtrl); - for (i = 10000; i > 0; i--) { + for (i = 10000; i > 0; i--) { barrier(); if ((inl(ioaddr + MIICtrl) & MII_WRITEOP) == 0) break; @@ -717,7 +651,7 @@ static void mdio_write(struct net_device *dev, int phy_id, int loc, int value) return; } - + static int epic_open(struct net_device *dev) { struct epic_private *ep = dev->priv; @@ -728,7 +662,7 @@ static int epic_open(struct net_device *dev) /* Soft reset the chip. */ outl(0x4001, ioaddr + GENCTL); - if ((retval = request_irq(dev->irq, &epic_interrupt, SA_SHIRQ, dev->name, dev))) + if ((retval = request_irq(dev->irq, &epic_interrupt, IRQF_SHARED, dev->name, dev))) return retval; epic_init_ring(dev); @@ -760,7 +694,7 @@ static int epic_open(struct net_device *dev) #endif udelay(20); /* Looks like EPII needs that if you want reliable RX init. FIXME: pci posting bug? */ - + for (i = 0; i < 3; i++) outl(cpu_to_le16(((u16*)dev->dev_addr)[i]), ioaddr + LAN0 + i*4); @@ -803,7 +737,7 @@ static int epic_open(struct net_device *dev) /* Enable interrupts by setting the interrupt mask. */ outl((ep->chip_flags & TYPE2_INTR ? PCIBusErr175 : PCIBusErr170) - | CntFull | TxUnderrun + | CntFull | TxUnderrun | RxError | RxHeader | EpicNapiEvent, ioaddr + INTMASK); if (debug > 1) @@ -831,7 +765,7 @@ static void epic_pause(struct net_device *dev) struct epic_private *ep = dev->priv; netif_stop_queue (dev); - + /* Disable interrupts by clearing the interrupt mask. */ outl(0x00000000, ioaddr + INTMASK); /* Stop the chip's Tx and Rx DMA processes. */ @@ -987,7 +921,7 @@ static void epic_init_ring(struct net_device *dev) for (i = 0; i < RX_RING_SIZE; i++) { ep->rx_ring[i].rxstatus = 0; ep->rx_ring[i].buflength = cpu_to_le32(ep->rx_buf_sz); - ep->rx_ring[i].next = ep->rx_ring_dma + + ep->rx_ring[i].next = ep->rx_ring_dma + (i+1)*sizeof(struct epic_rx_desc); ep->rx_skbuff[i] = NULL; } @@ -1002,7 +936,7 @@ static void epic_init_ring(struct net_device *dev) break; skb->dev = dev; /* Mark as being used by this device. */ skb_reserve(skb, 2); /* 16 byte align the IP header. */ - ep->rx_ring[i].bufaddr = pci_map_single(ep->pci_dev, + ep->rx_ring[i].bufaddr = pci_map_single(ep->pci_dev, skb->data, ep->rx_buf_sz, PCI_DMA_FROMDEVICE); ep->rx_ring[i].rxstatus = cpu_to_le32(DescOwn); } @@ -1013,7 +947,7 @@ static void epic_init_ring(struct net_device *dev) for (i = 0; i < TX_RING_SIZE; i++) { ep->tx_skbuff[i] = NULL; ep->tx_ring[i].txstatus = 0x0000; - ep->tx_ring[i].next = ep->tx_ring_dma + + ep->tx_ring[i].next = ep->tx_ring_dma + (i+1)*sizeof(struct epic_tx_desc); } ep->tx_ring[i-1].next = ep->tx_ring_dma; @@ -1026,12 +960,9 @@ static int epic_start_xmit(struct sk_buff *skb, struct net_device *dev) int entry, free_count; u32 ctrl_word; unsigned long flags; - - if (skb->len < ETH_ZLEN) { - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) - return 0; - } + + if (skb_padto(skb, ETH_ZLEN)) + return 0; /* Caution: the write order is important here, set the field with the "ownership" bit last. */ @@ -1042,7 +973,7 @@ static int epic_start_xmit(struct sk_buff *skb, struct net_device *dev) entry = ep->cur_tx % TX_RING_SIZE; ep->tx_skbuff[entry] = skb; - ep->tx_ring[entry].bufaddr = pci_map_single(ep->pci_dev, skb->data, + ep->tx_ring[entry].bufaddr = pci_map_single(ep->pci_dev, skb->data, skb->len, PCI_DMA_TODEVICE); if (free_count < TX_QUEUE_LEN/2) {/* Typical path */ ctrl_word = cpu_to_le32(0x100000); /* No interrupt */ @@ -1126,7 +1057,7 @@ static void epic_tx(struct net_device *dev, struct epic_private *ep) /* Free the original skb. */ skb = ep->tx_skbuff[entry]; - pci_unmap_single(ep->pci_dev, ep->tx_ring[entry].bufaddr, + pci_unmap_single(ep->pci_dev, ep->tx_ring[entry].bufaddr, skb->len, PCI_DMA_TODEVICE); dev_kfree_skb_irq(skb); ep->tx_skbuff[entry] = NULL; @@ -1281,8 +1212,8 @@ static int epic_rx(struct net_device *dev, int budget) ep->rx_buf_sz, PCI_DMA_FROMDEVICE); } else { - pci_unmap_single(ep->pci_dev, - ep->rx_ring[entry].bufaddr, + pci_unmap_single(ep->pci_dev, + ep->rx_ring[entry].bufaddr, ep->rx_buf_sz, PCI_DMA_FROMDEVICE); skb_put(skb = ep->rx_skbuff[entry], pkt_len); ep->rx_skbuff[entry] = NULL; @@ -1307,7 +1238,7 @@ static int epic_rx(struct net_device *dev, int budget) break; skb->dev = dev; /* Mark as being used by this device. */ skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */ - ep->rx_ring[entry].bufaddr = pci_map_single(ep->pci_dev, + ep->rx_ring[entry].bufaddr = pci_map_single(ep->pci_dev, skb->data, ep->rx_buf_sz, PCI_DMA_FROMDEVICE); work_done++; } @@ -1403,7 +1334,7 @@ static int epic_close(struct net_device *dev) ep->rx_ring[i].rxstatus = 0; /* Not owned by Epic chip. */ ep->rx_ring[i].buflength = 0; if (skb) { - pci_unmap_single(ep->pci_dev, ep->rx_ring[i].bufaddr, + pci_unmap_single(ep->pci_dev, ep->rx_ring[i].bufaddr, ep->rx_buf_sz, PCI_DMA_FROMDEVICE); dev_kfree_skb(skb); } @@ -1414,7 +1345,7 @@ static int epic_close(struct net_device *dev) ep->tx_skbuff[i] = NULL; if (!skb) continue; - pci_unmap_single(ep->pci_dev, ep->tx_ring[i].bufaddr, + pci_unmap_single(ep->pci_dev, ep->tx_ring[i].bufaddr, skb->len, PCI_DMA_TODEVICE); dev_kfree_skb(skb); } @@ -1607,7 +1538,7 @@ static void __devexit epic_remove_one (struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); struct epic_private *ep = dev->priv; - + pci_free_consistent(pdev, TX_TOTAL_SIZE, ep->tx_ring, ep->tx_ring_dma); pci_free_consistent(pdev, RX_TOTAL_SIZE, ep->rx_ring, ep->rx_ring_dma); unregister_netdev(dev); diff --git a/drivers/net/es3210.c b/drivers/net/es3210.c index 6b0ab1eac..fd7b32a24 100644 --- a/drivers/net/es3210.c +++ b/drivers/net/es3210.c @@ -421,8 +421,7 @@ MODULE_PARM_DESC(mem, "memory base address(es)"); MODULE_DESCRIPTION("Racal-Interlan ES3210 EISA ethernet driver"); MODULE_LICENSE("GPL"); -int -init_module(void) +int __init init_module(void) { struct net_device *dev; int this_dev, found = 0; diff --git a/drivers/net/eth16i.c b/drivers/net/eth16i.c index b67545be2..ca42efa91 100644 --- a/drivers/net/eth16i.c +++ b/drivers/net/eth16i.c @@ -1064,8 +1064,7 @@ static int eth16i_tx(struct sk_buff *skb, struct net_device *dev) unsigned long flags; if (length < ETH_ZLEN) { - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) + if (skb_padto(skb, ETH_ZLEN)) return 0; length = ETH_ZLEN; } @@ -1435,7 +1434,7 @@ MODULE_PARM_DESC(mediatype, "eth16i media type of interface(s) (bnc,tp,dix,auto, module_param(debug, int, 0); MODULE_PARM_DESC(debug, "eth16i debug level (0-6)"); -int init_module(void) +int __init init_module(void) { int this_dev, found = 0; struct net_device *dev; diff --git a/drivers/net/fealnx.c b/drivers/net/fealnx.c index a8449265e..567e27413 100644 --- a/drivers/net/fealnx.c +++ b/drivers/net/fealnx.c @@ -92,7 +92,7 @@ static int full_duplex[MAX_UNITS] = { -1, -1, -1, -1, -1, -1, -1, -1 }; #include /* These identify the driver base version and may not be removed. */ -static char version[] __devinitdata = +static char version[] = KERN_INFO DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE "\n"; @@ -124,16 +124,8 @@ MODULE_PARM_DESC(multicast_filter_limit, "fealnx maximum number of filtered mult MODULE_PARM_DESC(options, "fealnx: Bits 0-3: media type, bit 17: full duplex"); MODULE_PARM_DESC(full_duplex, "fealnx full duplex setting(s) (1)"); -#define MIN_REGION_SIZE 136 - -enum pci_flags_bit { - PCI_USES_IO = 1, - PCI_USES_MEM = 2, - PCI_USES_MASTER = 4, - PCI_ADDR0 = 0x10 << 0, - PCI_ADDR1 = 0x10 << 1, - PCI_ADDR2 = 0x10 << 2, - PCI_ADDR3 = 0x10 << 3, +enum { + MIN_REGION_SIZE = 136, }; /* A chip capabilities table, matching the entries in pci_tbl[] above. */ @@ -156,14 +148,13 @@ enum phy_type_flags { struct chip_info { char *chip_name; - int io_size; int flags; }; -static const struct chip_info skel_netdrv_tbl[] = { - {"100/10M Ethernet PCI Adapter", 136, HAS_MII_XCVR}, - {"100/10M Ethernet PCI Adapter", 136, HAS_CHIP_XCVR}, - {"1000/100/10M Ethernet PCI Adapter", 136, HAS_MII_XCVR}, +static const struct chip_info skel_netdrv_tbl[] __devinitdata = { + { "100/10M Ethernet PCI Adapter", HAS_MII_XCVR }, + { "100/10M Ethernet PCI Adapter", HAS_CHIP_XCVR }, + { "1000/100/10M Ethernet PCI Adapter", HAS_MII_XCVR }, }; /* Offsets to the Command and Status Registers. */ @@ -514,13 +505,14 @@ static int __devinit fealnx_init_one(struct pci_dev *pdev, len = pci_resource_len(pdev, bar); if (len < MIN_REGION_SIZE) { - printk(KERN_ERR "%s: region size %ld too small, aborting\n", - boardname, len); + dev_err(&pdev->dev, + "region size %ld too small, aborting\n", len); return -ENODEV; } i = pci_request_regions(pdev, boardname); - if (i) return i; + if (i) + return i; irq = pdev->irq; @@ -586,9 +578,9 @@ static int __devinit fealnx_init_one(struct pci_dev *pdev, if (mii_status != 0xffff && mii_status != 0x0000) { np->phys[phy_idx++] = phy; - printk(KERN_INFO - "%s: MII PHY found at address %d, status " - "0x%4.4x.\n", dev->name, phy, mii_status); + dev_info(&pdev->dev, + "MII PHY found at address %d, status " + "0x%4.4x.\n", phy, mii_status); /* get phy type */ { unsigned int data; @@ -611,10 +603,10 @@ static int __devinit fealnx_init_one(struct pci_dev *pdev, } np->mii_cnt = phy_idx; - if (phy_idx == 0) { - printk(KERN_WARNING "%s: MII PHY not found -- this device may " - "not operate correctly.\n", dev->name); - } + if (phy_idx == 0) + dev_warn(&pdev->dev, + "MII PHY not found -- this device may " + "not operate correctly.\n"); } else { np->phys[0] = 32; /* 89/6/23 add, (begin) */ @@ -640,7 +632,7 @@ static int __devinit fealnx_init_one(struct pci_dev *pdev, np->mii.full_duplex = full_duplex[card_idx]; if (np->mii.full_duplex) { - printk(KERN_INFO "%s: Media type forced to Full Duplex.\n", dev->name); + dev_info(&pdev->dev, "Media type forced to Full Duplex.\n"); /* 89/6/13 add, (begin) */ // if (np->PHYType==MarvellPHY) if ((np->PHYType == MarvellPHY) || (np->PHYType == LevelOnePHY)) { @@ -844,7 +836,7 @@ static int netdev_open(struct net_device *dev) iowrite32(0x00000001, ioaddr + BCR); /* Reset */ - if (request_irq(dev->irq, &intr_handler, SA_SHIRQ, dev->name, dev)) + if (request_irq(dev->irq, &intr_handler, IRQF_SHARED, dev->name, dev)) return -EAGAIN; for (i = 0; i < 3; i++) diff --git a/drivers/net/fec.c b/drivers/net/fec.c index bd6983d1a..9b4030031 100644 --- a/drivers/net/fec.c +++ b/drivers/net/fec.c @@ -22,10 +22,9 @@ * Copyright (c) 2001-2005 Greg Ungerer (gerg@snapgear.com) * * Bug fixes and cleanup by Philippe De Muyter (phdm@macqel.be) - * Copyright (c) 2004-2005 Macq Electronique SA. + * Copyright (c) 2004-2006 Macq Electronique SA. */ -#include #include #include #include @@ -51,7 +50,7 @@ #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || \ defined(CONFIG_M5272) || defined(CONFIG_M528x) || \ - defined(CONFIG_M520x) + defined(CONFIG_M520x) || defined(CONFIG_M532x) #include #include #include "fec.h" @@ -80,6 +79,8 @@ static unsigned int fec_hw[] = { (MCF_MBAR + 0x1000), #elif defined(CONFIG_M520x) (MCF_MBAR+0x30000), +#elif defined(CONFIG_M532x) + (MCF_MBAR+0xfc030000), #else &(((immap_t *)IMAP_ADDR)->im_cpm.cp_fec), #endif @@ -143,7 +144,7 @@ typedef struct { #define TX_RING_MOD_MASK 15 /* for this to work */ #if (((RX_RING_SIZE + TX_RING_SIZE) * 8) > PAGE_SIZE) -#error "FEC: descriptor ring size contants too large" +#error "FEC: descriptor ring size constants too large" #endif /* Interrupt events/masks. @@ -167,12 +168,12 @@ typedef struct { /* - * The 5270/5271/5280/5282 RX control register also contains maximum frame + * The 5270/5271/5280/5282/532x RX control register also contains maximum frame * size bits. Other FEC hardware does not, so we need to take that into * account when setting it. */ #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \ - defined(CONFIG_M520x) + defined(CONFIG_M520x) || defined(CONFIG_M532x) #define OPT_FRAME_SIZE (PKT_MAXBUF_SIZE << 16) #else #define OPT_FRAME_SIZE 0 @@ -308,6 +309,7 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) struct fec_enet_private *fep; volatile fec_t *fecp; volatile cbd_t *bdp; + unsigned short status; fep = netdev_priv(dev); fecp = (volatile fec_t*)dev->base_addr; @@ -320,8 +322,9 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) /* Fill in a Tx ring entry */ bdp = fep->cur_tx; + status = bdp->cbd_sc; #ifndef final_version - if (bdp->cbd_sc & BD_ENET_TX_READY) { + if (status & BD_ENET_TX_READY) { /* Ooops. All transmit buffers are full. Bail out. * This should not happen, since dev->tbusy should be set. */ @@ -332,7 +335,7 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) /* Clear all of the status flags. */ - bdp->cbd_sc &= ~BD_ENET_TX_STATS; + status &= ~BD_ENET_TX_STATS; /* Set buffer length and buffer pointer. */ @@ -366,21 +369,22 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) spin_lock_irq(&fep->lock); - /* Send it on its way. Tell FEC its ready, interrupt when done, - * its the last BD of the frame, and to put the CRC on the end. + /* Send it on its way. Tell FEC it's ready, interrupt when done, + * it's the last BD of the frame, and to put the CRC on the end. */ - bdp->cbd_sc |= (BD_ENET_TX_READY | BD_ENET_TX_INTR + status |= (BD_ENET_TX_READY | BD_ENET_TX_INTR | BD_ENET_TX_LAST | BD_ENET_TX_TC); + bdp->cbd_sc = status; dev->trans_start = jiffies; /* Trigger transmission start */ - fecp->fec_x_des_active = 0x01000000; + fecp->fec_x_des_active = 0; /* If this was the last BD in the ring, start at the beginning again. */ - if (bdp->cbd_sc & BD_ENET_TX_WRAP) { + if (status & BD_ENET_TX_WRAP) { bdp = fep->tx_bd_base; } else { bdp++; @@ -491,43 +495,44 @@ fec_enet_tx(struct net_device *dev) { struct fec_enet_private *fep; volatile cbd_t *bdp; + unsigned short status; struct sk_buff *skb; fep = netdev_priv(dev); spin_lock(&fep->lock); bdp = fep->dirty_tx; - while ((bdp->cbd_sc&BD_ENET_TX_READY) == 0) { + while (((status = bdp->cbd_sc) & BD_ENET_TX_READY) == 0) { if (bdp == fep->cur_tx && fep->tx_full == 0) break; skb = fep->tx_skbuff[fep->skb_dirty]; /* Check for errors. */ - if (bdp->cbd_sc & (BD_ENET_TX_HB | BD_ENET_TX_LC | + if (status & (BD_ENET_TX_HB | BD_ENET_TX_LC | BD_ENET_TX_RL | BD_ENET_TX_UN | BD_ENET_TX_CSL)) { fep->stats.tx_errors++; - if (bdp->cbd_sc & BD_ENET_TX_HB) /* No heartbeat */ + if (status & BD_ENET_TX_HB) /* No heartbeat */ fep->stats.tx_heartbeat_errors++; - if (bdp->cbd_sc & BD_ENET_TX_LC) /* Late collision */ + if (status & BD_ENET_TX_LC) /* Late collision */ fep->stats.tx_window_errors++; - if (bdp->cbd_sc & BD_ENET_TX_RL) /* Retrans limit */ + if (status & BD_ENET_TX_RL) /* Retrans limit */ fep->stats.tx_aborted_errors++; - if (bdp->cbd_sc & BD_ENET_TX_UN) /* Underrun */ + if (status & BD_ENET_TX_UN) /* Underrun */ fep->stats.tx_fifo_errors++; - if (bdp->cbd_sc & BD_ENET_TX_CSL) /* Carrier lost */ + if (status & BD_ENET_TX_CSL) /* Carrier lost */ fep->stats.tx_carrier_errors++; } else { fep->stats.tx_packets++; } #ifndef final_version - if (bdp->cbd_sc & BD_ENET_TX_READY) + if (status & BD_ENET_TX_READY) printk("HEY! Enet xmit interrupt and TX_READY.\n"); #endif /* Deferred means some collisions occurred during transmit, * but we eventually sent the packet OK. */ - if (bdp->cbd_sc & BD_ENET_TX_DEF) + if (status & BD_ENET_TX_DEF) fep->stats.collisions++; /* Free the sk buffer associated with this last transmit. @@ -538,7 +543,7 @@ fec_enet_tx(struct net_device *dev) /* Update pointer to next buffer descriptor to be transmitted. */ - if (bdp->cbd_sc & BD_ENET_TX_WRAP) + if (status & BD_ENET_TX_WRAP) bdp = fep->tx_bd_base; else bdp++; @@ -568,9 +573,14 @@ fec_enet_rx(struct net_device *dev) struct fec_enet_private *fep; volatile fec_t *fecp; volatile cbd_t *bdp; + unsigned short status; struct sk_buff *skb; ushort pkt_len; __u8 *data; + +#ifdef CONFIG_M532x + flush_cache_all(); +#endif fep = netdev_priv(dev); fecp = (volatile fec_t*)dev->base_addr; @@ -580,13 +590,13 @@ fec_enet_rx(struct net_device *dev) */ bdp = fep->cur_rx; -while (!(bdp->cbd_sc & BD_ENET_RX_EMPTY)) { +while (!((status = bdp->cbd_sc) & BD_ENET_RX_EMPTY)) { #ifndef final_version /* Since we have allocated space to hold a complete frame, * the last indicator should be set. */ - if ((bdp->cbd_sc & BD_ENET_RX_LAST) == 0) + if ((status & BD_ENET_RX_LAST) == 0) printk("FEC ENET: rcv is not +last\n"); #endif @@ -594,26 +604,26 @@ while (!(bdp->cbd_sc & BD_ENET_RX_EMPTY)) { goto rx_processing_done; /* Check for errors. */ - if (bdp->cbd_sc & (BD_ENET_RX_LG | BD_ENET_RX_SH | BD_ENET_RX_NO | + if (status & (BD_ENET_RX_LG | BD_ENET_RX_SH | BD_ENET_RX_NO | BD_ENET_RX_CR | BD_ENET_RX_OV)) { fep->stats.rx_errors++; - if (bdp->cbd_sc & (BD_ENET_RX_LG | BD_ENET_RX_SH)) { + if (status & (BD_ENET_RX_LG | BD_ENET_RX_SH)) { /* Frame too long or too short. */ fep->stats.rx_length_errors++; } - if (bdp->cbd_sc & BD_ENET_RX_NO) /* Frame alignment */ + if (status & BD_ENET_RX_NO) /* Frame alignment */ fep->stats.rx_frame_errors++; - if (bdp->cbd_sc & BD_ENET_RX_CR) /* CRC Error */ - fep->stats.rx_crc_errors++; - if (bdp->cbd_sc & BD_ENET_RX_OV) /* FIFO overrun */ + if (status & BD_ENET_RX_CR) /* CRC Error */ fep->stats.rx_crc_errors++; + if (status & BD_ENET_RX_OV) /* FIFO overrun */ + fep->stats.rx_fifo_errors++; } /* Report late collisions as a frame error. * On this error, the BD is closed, but we don't know what we * have in the buffer. So, just drop this frame on the floor. */ - if (bdp->cbd_sc & BD_ENET_RX_CL) { + if (status & BD_ENET_RX_CL) { fep->stats.rx_errors++; fep->stats.rx_frame_errors++; goto rx_processing_done; @@ -639,9 +649,7 @@ while (!(bdp->cbd_sc & BD_ENET_RX_EMPTY)) { } else { skb->dev = dev; skb_put(skb,pkt_len-4); /* Make room */ - eth_copy_and_sum(skb, - (unsigned char *)__va(bdp->cbd_bufaddr), - pkt_len-4, 0); + eth_copy_and_sum(skb, data, pkt_len-4, 0); skb->protocol=eth_type_trans(skb,dev); netif_rx(skb); } @@ -649,15 +657,16 @@ while (!(bdp->cbd_sc & BD_ENET_RX_EMPTY)) { /* Clear the status flags for this buffer. */ - bdp->cbd_sc &= ~BD_ENET_RX_STATS; + status &= ~BD_ENET_RX_STATS; /* Mark the buffer empty. */ - bdp->cbd_sc |= BD_ENET_RX_EMPTY; + status |= BD_ENET_RX_EMPTY; + bdp->cbd_sc = status; /* Update BD pointer to next entry. */ - if (bdp->cbd_sc & BD_ENET_RX_WRAP) + if (status & BD_ENET_RX_WRAP) bdp = fep->rx_bd_base; else bdp++; @@ -667,9 +676,9 @@ while (!(bdp->cbd_sc & BD_ENET_RX_EMPTY)) { * incoming frames. On a heavily loaded network, we should be * able to keep up at the expense of system resources. */ - fecp->fec_r_des_active = 0x01000000; + fecp->fec_r_des_active = 0; #endif - } /* while (!(bdp->cbd_sc & BD_ENET_RX_EMPTY)) */ + } /* while (!((status = bdp->cbd_sc) & BD_ENET_RX_EMPTY)) */ fep->cur_rx = (cbd_t *)bdp; #if 0 @@ -680,11 +689,12 @@ while (!(bdp->cbd_sc & BD_ENET_RX_EMPTY)) { * our way back to the interrupt return only to come right back * here. */ - fecp->fec_r_des_active = 0x01000000; + fecp->fec_r_des_active = 0; #endif } +/* called from interrupt context */ static void fec_enet_mii(struct net_device *dev) { @@ -696,10 +706,12 @@ fec_enet_mii(struct net_device *dev) fep = netdev_priv(dev); ep = fep->hwp; mii_reg = ep->fec_mii_data; + + spin_lock(&fep->lock); if ((mip = mii_head) == NULL) { printk("MII and no head!\n"); - return; + goto unlock; } if (mip->mii_func != NULL) @@ -711,6 +723,9 @@ fec_enet_mii(struct net_device *dev) if ((mip = mii_head) != NULL) ep->fec_mii_data = mip->mii_regval; + +unlock: + spin_unlock(&fep->lock); } static int @@ -728,8 +743,7 @@ mii_queue(struct net_device *dev, int regval, void (*func)(uint, struct net_devi retval = 0; - save_flags(flags); - cli(); + spin_lock_irqsave(&fep->lock,flags); if ((mip = mii_free) != NULL) { mii_free = mip->mii_next; @@ -749,7 +763,7 @@ mii_queue(struct net_device *dev, int regval, void (*func)(uint, struct net_devi retval = 1; } - restore_flags(flags); + spin_unlock_irqrestore(&fep->lock,flags); return(retval); } @@ -1216,7 +1230,7 @@ static phy_info_t const * const phy_info[] = { }; /* ------------------------------------------------------------------------- */ - +#if !defined(CONFIG_M532x) #ifdef CONFIG_RPXCLASSIC static void mii_link_interrupt(void *dev_id); @@ -1224,6 +1238,7 @@ mii_link_interrupt(void *dev_id); static irqreturn_t mii_link_interrupt(int irq, void * dev_id, struct pt_regs * regs); #endif +#endif #if defined(CONFIG_M5272) @@ -1384,13 +1399,13 @@ static void __inline__ fec_request_intrs(struct net_device *dev) { volatile unsigned char *icrp; volatile unsigned long *imrp; - int i; + int i, ilip; b = (fep->index) ? MCFICM_INTC1 : MCFICM_INTC0; icrp = (volatile unsigned char *) (MCF_IPSBAR + b + MCFINTC_ICR0); - for (i = 23; (i < 36); i++) - icrp[i] = 0x23; + for (i = 23, ilip = 0x28; (i < 36); i++) + icrp[i] = ilip--; imrp = (volatile unsigned long *) (MCF_IPSBAR + b + MCFINTC_IMRH); @@ -1618,6 +1633,159 @@ static void __inline__ fec_uncache(unsigned long addr) /* ------------------------------------------------------------------------- */ +#elif defined(CONFIG_M532x) +/* + * Code specific for M532x + */ +static void __inline__ fec_request_intrs(struct net_device *dev) +{ + struct fec_enet_private *fep; + int b; + static const struct idesc { + char *name; + unsigned short irq; + } *idp, id[] = { + { "fec(TXF)", 36 }, + { "fec(TXB)", 37 }, + { "fec(TXFIFO)", 38 }, + { "fec(TXCR)", 39 }, + { "fec(RXF)", 40 }, + { "fec(RXB)", 41 }, + { "fec(MII)", 42 }, + { "fec(LC)", 43 }, + { "fec(HBERR)", 44 }, + { "fec(GRA)", 45 }, + { "fec(EBERR)", 46 }, + { "fec(BABT)", 47 }, + { "fec(BABR)", 48 }, + { NULL }, + }; + + fep = netdev_priv(dev); + b = (fep->index) ? 128 : 64; + + /* Setup interrupt handlers. */ + for (idp = id; idp->name; idp++) { + if (request_irq(b+idp->irq,fec_enet_interrupt,0,idp->name,dev)!=0) + printk("FEC: Could not allocate %s IRQ(%d)!\n", + idp->name, b+idp->irq); + } + + /* Unmask interrupts */ + MCF_INTC0_ICR36 = 0x2; + MCF_INTC0_ICR37 = 0x2; + MCF_INTC0_ICR38 = 0x2; + MCF_INTC0_ICR39 = 0x2; + MCF_INTC0_ICR40 = 0x2; + MCF_INTC0_ICR41 = 0x2; + MCF_INTC0_ICR42 = 0x2; + MCF_INTC0_ICR43 = 0x2; + MCF_INTC0_ICR44 = 0x2; + MCF_INTC0_ICR45 = 0x2; + MCF_INTC0_ICR46 = 0x2; + MCF_INTC0_ICR47 = 0x2; + MCF_INTC0_ICR48 = 0x2; + + MCF_INTC0_IMRH &= ~( + MCF_INTC_IMRH_INT_MASK36 | + MCF_INTC_IMRH_INT_MASK37 | + MCF_INTC_IMRH_INT_MASK38 | + MCF_INTC_IMRH_INT_MASK39 | + MCF_INTC_IMRH_INT_MASK40 | + MCF_INTC_IMRH_INT_MASK41 | + MCF_INTC_IMRH_INT_MASK42 | + MCF_INTC_IMRH_INT_MASK43 | + MCF_INTC_IMRH_INT_MASK44 | + MCF_INTC_IMRH_INT_MASK45 | + MCF_INTC_IMRH_INT_MASK46 | + MCF_INTC_IMRH_INT_MASK47 | + MCF_INTC_IMRH_INT_MASK48 ); + + /* Set up gpio outputs for MII lines */ + MCF_GPIO_PAR_FECI2C |= (0 | + MCF_GPIO_PAR_FECI2C_PAR_MDC_EMDC | + MCF_GPIO_PAR_FECI2C_PAR_MDIO_EMDIO); + MCF_GPIO_PAR_FEC = (0 | + MCF_GPIO_PAR_FEC_PAR_FEC_7W_FEC | + MCF_GPIO_PAR_FEC_PAR_FEC_MII_FEC); +} + +static void __inline__ fec_set_mii(struct net_device *dev, struct fec_enet_private *fep) +{ + volatile fec_t *fecp; + + fecp = fep->hwp; + fecp->fec_r_cntrl = OPT_FRAME_SIZE | 0x04; + fecp->fec_x_cntrl = 0x00; + + /* + * Set MII speed to 2.5 MHz + */ + fep->phy_speed = ((((MCF_CLK / 2) / (2500000 / 10)) + 5) / 10) * 2; + fecp->fec_mii_speed = fep->phy_speed; + + fec_restart(dev, 0); +} + +static void __inline__ fec_get_mac(struct net_device *dev) +{ + struct fec_enet_private *fep = netdev_priv(dev); + volatile fec_t *fecp; + unsigned char *iap, tmpaddr[ETH_ALEN]; + + fecp = fep->hwp; + + if (FEC_FLASHMAC) { + /* + * Get MAC address from FLASH. + * If it is all 1's or 0's, use the default. + */ + iap = FEC_FLASHMAC; + if ((iap[0] == 0) && (iap[1] == 0) && (iap[2] == 0) && + (iap[3] == 0) && (iap[4] == 0) && (iap[5] == 0)) + iap = fec_mac_default; + if ((iap[0] == 0xff) && (iap[1] == 0xff) && (iap[2] == 0xff) && + (iap[3] == 0xff) && (iap[4] == 0xff) && (iap[5] == 0xff)) + iap = fec_mac_default; + } else { + *((unsigned long *) &tmpaddr[0]) = fecp->fec_addr_low; + *((unsigned short *) &tmpaddr[4]) = (fecp->fec_addr_high >> 16); + iap = &tmpaddr[0]; + } + + memcpy(dev->dev_addr, iap, ETH_ALEN); + + /* Adjust MAC if using default MAC address */ + if (iap == fec_mac_default) + dev->dev_addr[ETH_ALEN-1] = fec_mac_default[ETH_ALEN-1] + fep->index; +} + +static void __inline__ fec_enable_phy_intr(void) +{ +} + +static void __inline__ fec_disable_phy_intr(void) +{ +} + +static void __inline__ fec_phy_ack_intr(void) +{ +} + +static void __inline__ fec_localhw_setup(void) +{ +} + +/* + * Do not need to make region uncached on 532x. + */ +static void __inline__ fec_uncache(unsigned long addr) +{ +} + +/* ------------------------------------------------------------------------- */ + + #else /* @@ -1985,9 +2153,12 @@ fec_enet_open(struct net_device *dev) mii_do_cmd(dev, fep->phy->config); mii_do_cmd(dev, phy_cmd_config); /* display configuration */ - /* FIXME: use netif_carrier_{on,off} ; this polls - * until link is up which is wrong... could be - * 30 seconds or more we are trapped in here. -jgarzik + /* Poll until the PHY tells us its configuration + * (not link state). + * Request is initiated by mii_do_cmd above, but answer + * comes by interrupt. + * This should take about 25 usec per register at 2.5 MHz, + * and we read approximately 5 registers. */ while(!fep->sequence_done) schedule(); @@ -2253,15 +2424,11 @@ int __init fec_enet_init(struct net_device *dev) */ fec_request_intrs(dev); - /* Clear and enable interrupts */ - fecp->fec_ievent = 0xffc00000; - fecp->fec_imask = (FEC_ENET_TXF | FEC_ENET_TXB | - FEC_ENET_RXF | FEC_ENET_RXB | FEC_ENET_MII); fecp->fec_hash_table_high = 0; fecp->fec_hash_table_low = 0; fecp->fec_r_buff_size = PKT_MAXBLR_SIZE; fecp->fec_ecntrl = 2; - fecp->fec_r_des_active = 0x01000000; + fecp->fec_r_des_active = 0; dev->base_addr = (unsigned long)fecp; @@ -2281,6 +2448,11 @@ int __init fec_enet_init(struct net_device *dev) /* setup MII interface */ fec_set_mii(dev, fep); + /* Clear and enable interrupts */ + fecp->fec_ievent = 0xffc00000; + fecp->fec_imask = (FEC_ENET_TXF | FEC_ENET_TXB | + FEC_ENET_RXF | FEC_ENET_RXB | FEC_ENET_MII); + /* Queue up command to detect the PHY and initialize the * remainder of the interface. */ @@ -2312,11 +2484,6 @@ fec_restart(struct net_device *dev, int duplex) fecp->fec_ecntrl = 1; udelay(10); - /* Enable interrupts we wish to service. - */ - fecp->fec_imask = (FEC_ENET_TXF | FEC_ENET_TXB | - FEC_ENET_RXF | FEC_ENET_RXB | FEC_ENET_MII); - /* Clear any outstanding interrupt. */ fecp->fec_ievent = 0xffc00000; @@ -2408,7 +2575,12 @@ fec_restart(struct net_device *dev, int duplex) /* And last, enable the transmit and receive processing. */ fecp->fec_ecntrl = 2; - fecp->fec_r_des_active = 0x01000000; + fecp->fec_r_des_active = 0; + + /* Enable interrupts we wish to service. + */ + fecp->fec_imask = (FEC_ENET_TXF | FEC_ENET_TXB | + FEC_ENET_RXF | FEC_ENET_RXB | FEC_ENET_MII); } static void @@ -2420,9 +2592,16 @@ fec_stop(struct net_device *dev) fep = netdev_priv(dev); fecp = fep->hwp; - fecp->fec_x_cntrl = 0x01; /* Graceful transmit stop */ - - while(!(fecp->fec_ievent & FEC_ENET_GRA)); + /* + ** We cannot expect a graceful transmit stop without link !!! + */ + if (fep->link) + { + fecp->fec_x_cntrl = 0x01; /* Graceful transmit stop */ + udelay(10); + if (!(fecp->fec_ievent & FEC_ENET_GRA)) + printk("fec_stop : Graceful transmit stop did not complete !\n"); + } /* Whack a reset. We should wait for this. */ diff --git a/drivers/net/fec.h b/drivers/net/fec.h index 965c5c49f..1d4216069 100644 --- a/drivers/net/fec.h +++ b/drivers/net/fec.h @@ -14,7 +14,7 @@ /****************************************************************************/ #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \ - defined(CONFIG_M520x) + defined(CONFIG_M520x) || defined(CONFIG_M532x) /* * Just figures, Motorola would have to change the offsets for * registers in the same peripheral device on different models diff --git a/drivers/net/fec_8xx/fec_8xx-netta.c b/drivers/net/fec_8xx/fec_8xx-netta.c index 29c275e1d..790d9dbe4 100644 --- a/drivers/net/fec_8xx/fec_8xx-netta.c +++ b/drivers/net/fec_8xx/fec_8xx-netta.c @@ -2,7 +2,6 @@ * FEC instantatiation file for NETTA */ -#include #include #include #include diff --git a/drivers/net/fec_8xx/fec_main.c b/drivers/net/fec_8xx/fec_main.c index b4f3a9f8a..282b1452c 100644 --- a/drivers/net/fec_8xx/fec_main.c +++ b/drivers/net/fec_8xx/fec_main.c @@ -10,7 +10,6 @@ * Released under the GPL */ -#include #include #include #include @@ -55,11 +54,11 @@ MODULE_AUTHOR("Pantelis Antoniou "); MODULE_DESCRIPTION("Motorola 8xx FEC ethernet driver"); MODULE_LICENSE("GPL"); -MODULE_PARM(fec_8xx_debug, "i"); +int fec_8xx_debug = -1; /* -1 == use FEC_8XX_DEF_MSG_ENABLE as value */ +module_param(fec_8xx_debug, int, 0); MODULE_PARM_DESC(fec_8xx_debug, "FEC 8xx bitmapped debugging message enable value"); -int fec_8xx_debug = -1; /* -1 == use FEC_8XX_DEF_MSG_ENABLE as value */ /*************************************************/ diff --git a/drivers/net/fec_8xx/fec_mii.c b/drivers/net/fec_8xx/fec_mii.c index 803eb095c..d3c16b85d 100644 --- a/drivers/net/fec_8xx/fec_mii.c +++ b/drivers/net/fec_8xx/fec_mii.c @@ -10,7 +10,6 @@ * Released under the GPL */ -#include #include #include #include @@ -203,6 +202,39 @@ static void dm9161_shutdown(struct net_device *dev) #endif +#ifdef CONFIG_FEC_8XX_LXT971_PHY + +/* Support for LXT971/972 PHY */ + +#define MII_LXT971_PCR 16 /* Port Control Register */ +#define MII_LXT971_SR2 17 /* Status Register 2 */ +#define MII_LXT971_IER 18 /* Interrupt Enable Register */ +#define MII_LXT971_ISR 19 /* Interrupt Status Register */ +#define MII_LXT971_LCR 20 /* LED Control Register */ +#define MII_LXT971_TCR 30 /* Transmit Control Register */ + +static void lxt971_startup(struct net_device *dev) +{ + struct fec_enet_private *fep = netdev_priv(dev); + + fec_mii_write(dev, fep->mii_if.phy_id, MII_LXT971_IER, 0x00F2); +} + +static void lxt971_ack_int(struct net_device *dev) +{ + struct fec_enet_private *fep = netdev_priv(dev); + + fec_mii_read(dev, fep->mii_if.phy_id, MII_LXT971_ISR); +} + +static void lxt971_shutdown(struct net_device *dev) +{ + struct fec_enet_private *fep = netdev_priv(dev); + + fec_mii_write(dev, fep->mii_if.phy_id, MII_LXT971_IER, 0x0000); +} +#endif + /**********************************************************************************/ static const struct phy_info phy_info[] = { @@ -215,6 +247,15 @@ static const struct phy_info phy_info[] = { .shutdown = dm9161_shutdown, }, #endif +#ifdef CONFIG_FEC_8XX_LXT971_PHY + { + .id = 0x0001378e, + .name = "LXT971/972", + .startup = lxt971_startup, + .ack_int = lxt971_ack_int, + .shutdown = lxt971_shutdown, + }, +#endif #ifdef CONFIG_FEC_8XX_GENERIC_PHY { .id = 0, diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c index 1a556957d..94c38c0c8 100644 --- a/drivers/net/forcedeth.c +++ b/drivers/net/forcedeth.c @@ -107,6 +107,8 @@ * 0.52: 20 Jan 2006: Add MSI/MSIX support. * 0.53: 19 Mar 2006: Fix init from low power mode and add hw reset. * 0.54: 21 Mar 2006: Fix spin locks for multi irqs and cleanup. + * 0.55: 22 Mar 2006: Add flow control (pause frame). + * 0.56: 22 Mar 2006: Additional ethtool config and moduleparam support. * * Known bugs: * We suspect that on some hardware no TX done interrupts are generated. @@ -118,7 +120,7 @@ * DEV_NEED_TIMERIRQ will not harm you on sane hardware, only generating a few * superfluous timer interrupts from the nic. */ -#define FORCEDETH_VERSION "0.54" +#define FORCEDETH_VERSION "0.56" #define DRV_NAME "forcedeth" #include @@ -163,6 +165,9 @@ #define DEV_HAS_MSI 0x0040 /* device supports MSI */ #define DEV_HAS_MSI_X 0x0080 /* device supports MSI-X */ #define DEV_HAS_POWER_CNTRL 0x0100 /* device supports power savings */ +#define DEV_HAS_PAUSEFRAME_TX 0x0200 /* device supports tx pause frames */ +#define DEV_HAS_STATISTICS 0x0400 /* device supports hw statistics */ +#define DEV_HAS_TEST_EXTENDED 0x0800 /* device supports extended diagnostic test */ enum { NvRegIrqStatus = 0x000, @@ -203,6 +208,7 @@ enum { NvRegMSIIrqMask = 0x030, #define NVREG_MSI_VECTOR_0_ENABLED 0x01 NvRegMisc1 = 0x080, +#define NVREG_MISC1_PAUSE_TX 0x01 #define NVREG_MISC1_HD 0x02 #define NVREG_MISC1_FORCE 0x3b0f3c @@ -214,9 +220,11 @@ enum { #define NVREG_XMITSTAT_BUSY 0x01 NvRegPacketFilterFlags = 0x8c, -#define NVREG_PFF_ALWAYS 0x7F0008 +#define NVREG_PFF_PAUSE_RX 0x08 +#define NVREG_PFF_ALWAYS 0x7F0000 #define NVREG_PFF_PROMISC 0x80 #define NVREG_PFF_MYADDR 0x20 +#define NVREG_PFF_LOOPBACK 0x10 NvRegOffloadConfig = 0x90, #define NVREG_OFFLOAD_HOMEPHY 0x601 @@ -232,10 +240,12 @@ enum { #define NVREG_RNDSEED_FORCE2 0x2d00 #define NVREG_RNDSEED_FORCE3 0x7400 - NvRegUnknownSetupReg1 = 0xA0, -#define NVREG_UNKSETUP1_VAL 0x16070f - NvRegUnknownSetupReg2 = 0xA4, -#define NVREG_UNKSETUP2_VAL 0x16 + NvRegTxDeferral = 0xA0, +#define NVREG_TX_DEFERRAL_DEFAULT 0x15050f +#define NVREG_TX_DEFERRAL_RGMII_10_100 0x16070f +#define NVREG_TX_DEFERRAL_RGMII_1000 0x14050f + NvRegRxDeferral = 0xA4, +#define NVREG_RX_DEFERRAL_DEFAULT 0x16 NvRegMacAddrA = 0xA8, NvRegMacAddrB = 0xAC, NvRegMulticastAddrA = 0xB0, @@ -261,8 +271,10 @@ enum { #define NVREG_LINKSPEED_MASK (0xFFF) NvRegUnknownSetupReg5 = 0x130, #define NVREG_UNKSETUP5_BIT31 (1<<31) - NvRegUnknownSetupReg3 = 0x13c, -#define NVREG_UNKSETUP3_VAL1 0x200010 + NvRegTxWatermark = 0x13c, +#define NVREG_TX_WM_DESC1_DEFAULT 0x0200010 +#define NVREG_TX_WM_DESC2_3_DEFAULT 0x1e08000 +#define NVREG_TX_WM_DESC2_3_1000 0xfe08000 NvRegTxRxControl = 0x144, #define NVREG_TXRXCTL_KICK 0x0001 #define NVREG_TXRXCTL_BIT1 0x0002 @@ -277,6 +289,9 @@ enum { #define NVREG_TXRXCTL_VLANINS 0x00080 NvRegTxRingPhysAddrHigh = 0x148, NvRegRxRingPhysAddrHigh = 0x14C, + NvRegTxPauseFrame = 0x170, +#define NVREG_TX_PAUSEFRAME_DISABLE 0x1ff0080 +#define NVREG_TX_PAUSEFRAME_ENABLE 0x0c00030 NvRegMIIStatus = 0x180, #define NVREG_MIISTAT_ERROR 0x0001 #define NVREG_MIISTAT_LINKCHANGE 0x0008 @@ -326,6 +341,33 @@ enum { #define NVREG_POWERSTATE_D1 0x0001 #define NVREG_POWERSTATE_D2 0x0002 #define NVREG_POWERSTATE_D3 0x0003 + NvRegTxCnt = 0x280, + NvRegTxZeroReXmt = 0x284, + NvRegTxOneReXmt = 0x288, + NvRegTxManyReXmt = 0x28c, + NvRegTxLateCol = 0x290, + NvRegTxUnderflow = 0x294, + NvRegTxLossCarrier = 0x298, + NvRegTxExcessDef = 0x29c, + NvRegTxRetryErr = 0x2a0, + NvRegRxFrameErr = 0x2a4, + NvRegRxExtraByte = 0x2a8, + NvRegRxLateCol = 0x2ac, + NvRegRxRunt = 0x2b0, + NvRegRxFrameTooLong = 0x2b4, + NvRegRxOverflow = 0x2b8, + NvRegRxFCSErr = 0x2bc, + NvRegRxFrameAlignErr = 0x2c0, + NvRegRxLenErr = 0x2c4, + NvRegRxUnicast = 0x2c8, + NvRegRxMulticast = 0x2cc, + NvRegRxBroadcast = 0x2d0, + NvRegTxDef = 0x2d4, + NvRegTxFrame = 0x2d8, + NvRegRxCnt = 0x2dc, + NvRegTxPause = 0x2e0, + NvRegRxPause = 0x2e4, + NvRegRxDropFrame = 0x2e8, NvRegVlanControl = 0x300, #define NVREG_VLANCONTROL_ENABLE 0x2000 NvRegMSIXMap0 = 0x3e0, @@ -449,16 +491,18 @@ typedef union _ring_type { /* General driver defaults */ #define NV_WATCHDOG_TIMEO (5*HZ) -#define RX_RING 128 -#define TX_RING 256 -/* - * If your nic mysteriously hangs then try to reduce the limits - * to 1/0: It might be required to set NV_TX_LASTPACKET in the - * last valid ring entry. But this would be impossible to - * implement - probably a disassembly error. +#define RX_RING_DEFAULT 128 +#define TX_RING_DEFAULT 256 +#define RX_RING_MIN 128 +#define TX_RING_MIN 64 +#define RING_MAX_DESC_VER_1 1024 +#define RING_MAX_DESC_VER_2_3 16384 +/* + * Difference between the get and put pointers for the tx ring. + * This is used to throttle the amount of data outstanding in the + * tx ring. */ -#define TX_LIMIT_STOP 255 -#define TX_LIMIT_START 254 +#define TX_LIMIT_DIFFERENCE 1 /* rx/tx mac addr + type + vlan + align + slack*/ #define NV_RX_HEADERS (64) @@ -472,8 +516,9 @@ typedef union _ring_type { #define OOM_REFILL (1+HZ/20) #define POLL_WAIT (1+HZ/100) #define LINK_TIMEOUT (3*HZ) +#define STATS_INTERVAL (10*HZ) -/* +/* * desc_ver values: * The nic supports three different descriptor types: * - DESC_VER_1: Original @@ -506,13 +551,13 @@ typedef union _ring_type { #define PHY_1000 0x2 #define PHY_HALF 0x100 -/* FIXME: MII defines that should be added to */ -#define MII_1000BT_CR 0x09 -#define MII_1000BT_SR 0x0a -#define ADVERTISE_1000FULL 0x0200 -#define ADVERTISE_1000HALF 0x0100 -#define LPA_1000FULL 0x0800 -#define LPA_1000HALF 0x0400 +#define NV_PAUSEFRAME_RX_CAPABLE 0x0001 +#define NV_PAUSEFRAME_TX_CAPABLE 0x0002 +#define NV_PAUSEFRAME_RX_ENABLE 0x0004 +#define NV_PAUSEFRAME_TX_ENABLE 0x0008 +#define NV_PAUSEFRAME_RX_REQ 0x0010 +#define NV_PAUSEFRAME_TX_REQ 0x0020 +#define NV_PAUSEFRAME_AUTONEG 0x0040 /* MSI/MSI-X defines */ #define NV_MSI_X_MAX_VECTORS 8 @@ -527,6 +572,101 @@ typedef union _ring_type { #define NV_MSI_X_VECTOR_TX 0x1 #define NV_MSI_X_VECTOR_OTHER 0x2 +/* statistics */ +struct nv_ethtool_str { + char name[ETH_GSTRING_LEN]; +}; + +static const struct nv_ethtool_str nv_estats_str[] = { + { "tx_bytes" }, + { "tx_zero_rexmt" }, + { "tx_one_rexmt" }, + { "tx_many_rexmt" }, + { "tx_late_collision" }, + { "tx_fifo_errors" }, + { "tx_carrier_errors" }, + { "tx_excess_deferral" }, + { "tx_retry_error" }, + { "tx_deferral" }, + { "tx_packets" }, + { "tx_pause" }, + { "rx_frame_error" }, + { "rx_extra_byte" }, + { "rx_late_collision" }, + { "rx_runt" }, + { "rx_frame_too_long" }, + { "rx_over_errors" }, + { "rx_crc_errors" }, + { "rx_frame_align_error" }, + { "rx_length_error" }, + { "rx_unicast" }, + { "rx_multicast" }, + { "rx_broadcast" }, + { "rx_bytes" }, + { "rx_pause" }, + { "rx_drop_frame" }, + { "rx_packets" }, + { "rx_errors_total" } +}; + +struct nv_ethtool_stats { + u64 tx_bytes; + u64 tx_zero_rexmt; + u64 tx_one_rexmt; + u64 tx_many_rexmt; + u64 tx_late_collision; + u64 tx_fifo_errors; + u64 tx_carrier_errors; + u64 tx_excess_deferral; + u64 tx_retry_error; + u64 tx_deferral; + u64 tx_packets; + u64 tx_pause; + u64 rx_frame_error; + u64 rx_extra_byte; + u64 rx_late_collision; + u64 rx_runt; + u64 rx_frame_too_long; + u64 rx_over_errors; + u64 rx_crc_errors; + u64 rx_frame_align_error; + u64 rx_length_error; + u64 rx_unicast; + u64 rx_multicast; + u64 rx_broadcast; + u64 rx_bytes; + u64 rx_pause; + u64 rx_drop_frame; + u64 rx_packets; + u64 rx_errors_total; +}; + +/* diagnostics */ +#define NV_TEST_COUNT_BASE 3 +#define NV_TEST_COUNT_EXTENDED 4 + +static const struct nv_ethtool_str nv_etests_str[] = { + { "link (online/offline)" }, + { "register (offline) " }, + { "interrupt (offline) " }, + { "loopback (offline) " } +}; + +struct register_test { + u32 reg; + u32 mask; +}; + +static const struct register_test nv_registers_test[] = { + { NvRegUnknownSetupReg6, 0x01 }, + { NvRegMisc1, 0x03c }, + { NvRegOffloadConfig, 0x03ff }, + { NvRegMulticastAddrA, 0xffffffff }, + { NvRegTxWatermark, 0x0ff }, + { NvRegWakeUpFlags, 0x07777 }, + { 0,0 } +}; + /* * SMP locking: * All hardware access under dev->priv->lock, except the performance @@ -545,6 +685,7 @@ struct fe_priv { /* General data: * Locking: spin_lock(&np->lock); */ struct net_device_stats stats; + struct nv_ethtool_stats estats; int in_shutdown; u32 linkspeed; int duplex; @@ -554,6 +695,7 @@ struct fe_priv { int wolenabled; unsigned int phy_oui; u16 gigabit; + int intr_test; /* General data: RO fields */ dma_addr_t ring_addr; @@ -573,13 +715,15 @@ struct fe_priv { */ ring_type rx_ring; unsigned int cur_rx, refill_rx; - struct sk_buff *rx_skbuff[RX_RING]; - dma_addr_t rx_dma[RX_RING]; + struct sk_buff **rx_skbuff; + dma_addr_t *rx_dma; unsigned int rx_buf_sz; unsigned int pkt_limit; struct timer_list oom_kick; struct timer_list nic_poll; + struct timer_list stats_poll; u32 nic_poll_irq; + int rx_ring_size; /* media detection workaround. * Locking: Within irq hander or disable_irq+spin_lock(&np->lock); @@ -591,10 +735,13 @@ struct fe_priv { */ ring_type tx_ring; unsigned int next_tx, nic_tx; - struct sk_buff *tx_skbuff[TX_RING]; - dma_addr_t tx_dma[TX_RING]; - unsigned int tx_dma_len[TX_RING]; + struct sk_buff **tx_skbuff; + dma_addr_t *tx_dma; + unsigned int *tx_dma_len; u32 tx_flags; + int tx_ring_size; + int tx_limit_start; + int tx_limit_stop; /* vlan fields */ struct vlan_group *vlangrp; @@ -602,6 +749,9 @@ struct fe_priv { /* msi/msi-x fields */ u32 msi_flags; struct msix_entry msi_x_entry[NV_MSI_X_MAX_VECTORS]; + + /* flow control */ + u32 pause_flags; }; /* @@ -612,12 +762,14 @@ static int max_interrupt_work = 5; /* * Optimization can be either throuput mode or cpu mode - * + * * Throughput Mode: Every tx and rx packet will generate an interrupt. * CPU Mode: Interrupts are controlled by a timer. */ -#define NV_OPTIMIZATION_MODE_THROUGHPUT 0 -#define NV_OPTIMIZATION_MODE_CPU 1 +enum { + NV_OPTIMIZATION_MODE_THROUGHPUT, + NV_OPTIMIZATION_MODE_CPU +}; static int optimization_mode = NV_OPTIMIZATION_MODE_THROUGHPUT; /* @@ -630,14 +782,31 @@ static int optimization_mode = NV_OPTIMIZATION_MODE_THROUGHPUT; static int poll_interval = -1; /* - * Disable MSI interrupts + * MSI interrupts + */ +enum { + NV_MSI_INT_DISABLED, + NV_MSI_INT_ENABLED +}; +static int msi = NV_MSI_INT_ENABLED; + +/* + * MSIX interrupts */ -static int disable_msi = 0; +enum { + NV_MSIX_INT_DISABLED, + NV_MSIX_INT_ENABLED +}; +static int msix = NV_MSIX_INT_ENABLED; /* - * Disable MSIX interrupts + * DMA 64bit */ -static int disable_msix = 0; +enum { + NV_DMA_64BIT_DISABLED, + NV_DMA_64BIT_ENABLED +}; +static int dma_64bit = NV_DMA_64BIT_ENABLED; static inline struct fe_priv *get_nvpriv(struct net_device *dev) { @@ -697,7 +866,7 @@ static void setup_hw_rings(struct net_device *dev, int rxtx_flags) writel((u32) cpu_to_le64(np->ring_addr), base + NvRegRxRingPhysAddr); } if (rxtx_flags & NV_SETUP_TX_RING) { - writel((u32) cpu_to_le64(np->ring_addr + RX_RING*sizeof(struct ring_desc)), base + NvRegTxRingPhysAddr); + writel((u32) cpu_to_le64(np->ring_addr + np->rx_ring_size*sizeof(struct ring_desc)), base + NvRegTxRingPhysAddr); } } else { if (rxtx_flags & NV_SETUP_RX_RING) { @@ -705,12 +874,37 @@ static void setup_hw_rings(struct net_device *dev, int rxtx_flags) writel((u32) (cpu_to_le64(np->ring_addr) >> 32), base + NvRegRxRingPhysAddrHigh); } if (rxtx_flags & NV_SETUP_TX_RING) { - writel((u32) cpu_to_le64(np->ring_addr + RX_RING*sizeof(struct ring_desc_ex)), base + NvRegTxRingPhysAddr); - writel((u32) (cpu_to_le64(np->ring_addr + RX_RING*sizeof(struct ring_desc_ex)) >> 32), base + NvRegTxRingPhysAddrHigh); + writel((u32) cpu_to_le64(np->ring_addr + np->rx_ring_size*sizeof(struct ring_desc_ex)), base + NvRegTxRingPhysAddr); + writel((u32) (cpu_to_le64(np->ring_addr + np->rx_ring_size*sizeof(struct ring_desc_ex)) >> 32), base + NvRegTxRingPhysAddrHigh); } } } +static void free_rings(struct net_device *dev) +{ + struct fe_priv *np = get_nvpriv(dev); + + if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { + if(np->rx_ring.orig) + pci_free_consistent(np->pci_dev, sizeof(struct ring_desc) * (np->rx_ring_size + np->tx_ring_size), + np->rx_ring.orig, np->ring_addr); + } else { + if (np->rx_ring.ex) + pci_free_consistent(np->pci_dev, sizeof(struct ring_desc_ex) * (np->rx_ring_size + np->tx_ring_size), + np->rx_ring.ex, np->ring_addr); + } + if (np->rx_skbuff) + kfree(np->rx_skbuff); + if (np->rx_dma) + kfree(np->rx_dma); + if (np->tx_skbuff) + kfree(np->tx_skbuff); + if (np->tx_dma) + kfree(np->tx_dma); + if (np->tx_dma_len) + kfree(np->tx_dma_len); +} + static int using_multi_irqs(struct net_device *dev) { struct fe_priv *np = get_nvpriv(dev); @@ -860,7 +1054,7 @@ static int phy_init(struct net_device *dev) /* set advertise register */ reg = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ); - reg |= (ADVERTISE_10HALF|ADVERTISE_10FULL|ADVERTISE_100HALF|ADVERTISE_100FULL|0x800|0x400); + reg |= (ADVERTISE_10HALF|ADVERTISE_10FULL|ADVERTISE_100HALF|ADVERTISE_100FULL|ADVERTISE_PAUSE_ASYM|ADVERTISE_PAUSE_CAP); if (mii_rw(dev, np->phyaddr, MII_ADVERTISE, reg)) { printk(KERN_INFO "%s: phy write to advertise failed.\n", pci_name(np->pci_dev)); return PHY_ERROR; @@ -873,14 +1067,14 @@ static int phy_init(struct net_device *dev) mii_status = mii_rw(dev, np->phyaddr, MII_BMSR, MII_READ); if (mii_status & PHY_GIGABIT) { np->gigabit = PHY_GIGABIT; - mii_control_1000 = mii_rw(dev, np->phyaddr, MII_1000BT_CR, MII_READ); + mii_control_1000 = mii_rw(dev, np->phyaddr, MII_CTRL1000, MII_READ); mii_control_1000 &= ~ADVERTISE_1000HALF; if (phyinterface & PHY_RGMII) mii_control_1000 |= ADVERTISE_1000FULL; else mii_control_1000 &= ~ADVERTISE_1000FULL; - if (mii_rw(dev, np->phyaddr, MII_1000BT_CR, mii_control_1000)) { + if (mii_rw(dev, np->phyaddr, MII_CTRL1000, mii_control_1000)) { printk(KERN_INFO "%s: phy init failed.\n", pci_name(np->pci_dev)); return PHY_ERROR; } @@ -918,6 +1112,8 @@ static int phy_init(struct net_device *dev) return PHY_ERROR; } } + /* some phys clear out pause advertisment on reset, set it back */ + mii_rw(dev, np->phyaddr, MII_ADVERTISE, reg); /* restart auto negotiation */ mii_control = mii_rw(dev, np->phyaddr, MII_BMCR, MII_READ); @@ -1047,7 +1243,7 @@ static int nv_alloc_rx(struct net_device *dev) while (np->cur_rx != refill_rx) { struct sk_buff *skb; - nr = refill_rx % RX_RING; + nr = refill_rx % np->rx_ring_size; if (np->rx_skbuff[nr] == NULL) { skb = dev_alloc_skb(np->rx_buf_sz + NV_RX_ALLOC_PAD); @@ -1076,7 +1272,7 @@ static int nv_alloc_rx(struct net_device *dev) refill_rx++; } np->refill_rx = refill_rx; - if (np->cur_rx - refill_rx == RX_RING) + if (np->cur_rx - refill_rx == np->rx_ring_size) return 1; return 0; } @@ -1110,14 +1306,14 @@ static void nv_do_rx_refill(unsigned long data) } } -static void nv_init_rx(struct net_device *dev) +static void nv_init_rx(struct net_device *dev) { struct fe_priv *np = netdev_priv(dev); int i; - np->cur_rx = RX_RING; + np->cur_rx = np->rx_ring_size; np->refill_rx = 0; - for (i = 0; i < RX_RING; i++) + for (i = 0; i < np->rx_ring_size; i++) if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) np->rx_ring.orig[i].FlagLen = 0; else @@ -1130,7 +1326,7 @@ static void nv_init_tx(struct net_device *dev) int i; np->next_tx = np->nic_tx = 0; - for (i = 0; i < TX_RING; i++) { + for (i = 0; i < np->tx_ring_size; i++) { if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) np->tx_ring.orig[i].FlagLen = 0; else @@ -1174,8 +1370,8 @@ static void nv_drain_tx(struct net_device *dev) { struct fe_priv *np = netdev_priv(dev); unsigned int i; - - for (i = 0; i < TX_RING; i++) { + + for (i = 0; i < np->tx_ring_size; i++) { if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) np->tx_ring.orig[i].FlagLen = 0; else @@ -1189,7 +1385,7 @@ static void nv_drain_rx(struct net_device *dev) { struct fe_priv *np = netdev_priv(dev); int i; - for (i = 0; i < RX_RING; i++) { + for (i = 0; i < np->rx_ring_size; i++) { if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) np->rx_ring.orig[i].FlagLen = 0; else @@ -1221,8 +1417,8 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev) u32 tx_flags = 0; u32 tx_flags_extra = (np->desc_ver == DESC_VER_1 ? NV_TX_LASTPACKET : NV_TX2_LASTPACKET); unsigned int fragments = skb_shinfo(skb)->nr_frags; - unsigned int nr = (np->next_tx - 1) % TX_RING; - unsigned int start_nr = np->next_tx % TX_RING; + unsigned int nr = (np->next_tx - 1) % np->tx_ring_size; + unsigned int start_nr = np->next_tx % np->tx_ring_size; unsigned int i; u32 offset = 0; u32 bcnt; @@ -1238,7 +1434,7 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev) spin_lock_irq(&np->lock); - if ((np->next_tx - np->nic_tx + entries - 1) > TX_LIMIT_STOP) { + if ((np->next_tx - np->nic_tx + entries - 1) > np->tx_limit_stop) { spin_unlock_irq(&np->lock); netif_stop_queue(dev); return NETDEV_TX_BUSY; @@ -1247,7 +1443,7 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev) /* setup the header buffer */ do { bcnt = (size > NV_TX2_TSO_MAX_SIZE) ? NV_TX2_TSO_MAX_SIZE : size; - nr = (nr + 1) % TX_RING; + nr = (nr + 1) % np->tx_ring_size; np->tx_dma[nr] = pci_map_single(np->pci_dev, skb->data + offset, bcnt, PCI_DMA_TODEVICE); @@ -1274,7 +1470,7 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev) do { bcnt = (size > NV_TX2_TSO_MAX_SIZE) ? NV_TX2_TSO_MAX_SIZE : size; - nr = (nr + 1) % TX_RING; + nr = (nr + 1) % np->tx_ring_size; np->tx_dma[nr] = pci_map_page(np->pci_dev, frag->page, frag->page_offset+offset, bcnt, PCI_DMA_TODEVICE); @@ -1320,7 +1516,7 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev) } else { np->tx_ring.ex[start_nr].TxVlan = cpu_to_le32(tx_flags_vlan); np->tx_ring.ex[start_nr].FlagLen |= cpu_to_le32(tx_flags | tx_flags_extra); - } + } dprintk(KERN_DEBUG "%s: nv_start_xmit: packet %d (entries %d) queued for transmission. tx_flags_extra: %x\n", dev->name, np->next_tx, entries, tx_flags_extra); @@ -1356,7 +1552,7 @@ static void nv_tx_done(struct net_device *dev) struct sk_buff *skb; while (np->nic_tx != np->next_tx) { - i = np->nic_tx % TX_RING; + i = np->nic_tx % np->tx_ring_size; if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) Flags = le32_to_cpu(np->tx_ring.orig[i].FlagLen); @@ -1395,13 +1591,13 @@ static void nv_tx_done(struct net_device *dev) } else { np->stats.tx_packets++; np->stats.tx_bytes += skb->len; - } + } } } nv_release_txskb(dev, i); np->nic_tx++; } - if (np->next_tx - np->nic_tx < TX_LIMIT_START) + if (np->next_tx - np->nic_tx < np->tx_limit_start) netif_wake_queue(dev); } @@ -1438,10 +1634,10 @@ static void nv_tx_timeout(struct net_device *dev) readl(base + i + 24), readl(base + i + 28)); } printk(KERN_INFO "%s: Dumping tx ring\n", dev->name); - for (i=0;itx_ring_size;i+= 4) { if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { printk(KERN_INFO "%03x: %08x %08x // %08x %08x // %08x %08x // %08x %08x\n", - i, + i, le32_to_cpu(np->tx_ring.orig[i].PacketBuffer), le32_to_cpu(np->tx_ring.orig[i].FlagLen), le32_to_cpu(np->tx_ring.orig[i+1].PacketBuffer), @@ -1452,7 +1648,7 @@ static void nv_tx_timeout(struct net_device *dev) le32_to_cpu(np->tx_ring.orig[i+3].FlagLen)); } else { printk(KERN_INFO "%03x: %08x %08x %08x // %08x %08x %08x // %08x %08x %08x // %08x %08x %08x\n", - i, + i, le32_to_cpu(np->tx_ring.ex[i].PacketBufferHigh), le32_to_cpu(np->tx_ring.ex[i].PacketBufferLow), le32_to_cpu(np->tx_ring.ex[i].FlagLen), @@ -1550,15 +1746,14 @@ static void nv_rx_process(struct net_device *dev) u32 Flags; u32 vlanflags = 0; - for (;;) { struct sk_buff *skb; int len; int i; - if (np->cur_rx - np->refill_rx >= RX_RING) + if (np->cur_rx - np->refill_rx >= np->rx_ring_size) break; /* we scanned the whole ring - do not continue */ - i = np->cur_rx % RX_RING; + i = np->cur_rx % np->rx_ring_size; if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { Flags = le32_to_cpu(np->rx_ring.orig[i].FlagLen); len = nv_descr_getlength(&np->rx_ring.orig[i], np->desc_ver); @@ -1665,14 +1860,16 @@ static void nv_rx_process(struct net_device *dev) } } } - Flags &= NV_RX2_CHECKSUMMASK; - if (Flags == NV_RX2_CHECKSUMOK1 || - Flags == NV_RX2_CHECKSUMOK2 || - Flags == NV_RX2_CHECKSUMOK3) { - dprintk(KERN_DEBUG "%s: hw checksum hit!.\n", dev->name); - np->rx_skbuff[i]->ip_summed = CHECKSUM_UNNECESSARY; - } else { - dprintk(KERN_DEBUG "%s: hwchecksum miss!.\n", dev->name); + if (np->txrxctl_bits & NVREG_TXRXCTL_RXCHECK) { + Flags &= NV_RX2_CHECKSUMMASK; + if (Flags == NV_RX2_CHECKSUMOK1 || + Flags == NV_RX2_CHECKSUMOK2 || + Flags == NV_RX2_CHECKSUMOK3) { + dprintk(KERN_DEBUG "%s: hw checksum hit!.\n", dev->name); + np->rx_skbuff[i]->ip_summed = CHECKSUM_UNNECESSARY; + } else { + dprintk(KERN_DEBUG "%s: hwchecksum miss!.\n", dev->name); + } } } /* got a valid packet - forward it to the network core */ @@ -1736,7 +1933,7 @@ static int nv_change_mtu(struct net_device *dev, int new_mtu) * guessed, there is probably a simpler approach. * Changing the MTU is a rare event, it shouldn't matter. */ - disable_irq(dev->irq); + nv_disable_irq(dev); netif_tx_lock_bh(dev); spin_lock(&np->lock); /* stop engines */ @@ -1747,18 +1944,15 @@ static int nv_change_mtu(struct net_device *dev, int new_mtu) nv_drain_rx(dev); nv_drain_tx(dev); /* reinit driver view of the rx queue */ - nv_init_rx(dev); - nv_init_tx(dev); - /* alloc new rx buffers */ set_bufsize(dev); - if (nv_alloc_rx(dev)) { + if (nv_init_ring(dev)) { if (!np->in_shutdown) mod_timer(&np->oom_kick, jiffies + OOM_REFILL); } /* reinit nic view of the rx queue */ writel(np->rx_buf_sz, base + NvRegOffloadConfig); setup_hw_rings(dev, NV_SETUP_RX_RING | NV_SETUP_TX_RING); - writel( ((RX_RING-1) << NVREG_RINGSZ_RXSHIFT) + ((TX_RING-1) << NVREG_RINGSZ_TXSHIFT), + writel( ((np->rx_ring_size-1) << NVREG_RINGSZ_RXSHIFT) + ((np->tx_ring_size-1) << NVREG_RINGSZ_TXSHIFT), base + NvRegRingSizes); pci_push(base); writel(NVREG_TXRXCTL_KICK|np->txrxctl_bits, get_hwbase(dev) + NvRegTxRxControl); @@ -1769,7 +1963,7 @@ static int nv_change_mtu(struct net_device *dev, int new_mtu) nv_start_tx(dev); spin_unlock(&np->lock); netif_tx_unlock_bh(dev); - enable_irq(dev->irq); + nv_enable_irq(dev); } return 0; } @@ -1832,16 +2026,16 @@ static void nv_set_multicast(struct net_device *dev) u8 __iomem *base = get_hwbase(dev); u32 addr[2]; u32 mask[2]; - u32 pff; + u32 pff = readl(base + NvRegPacketFilterFlags) & NVREG_PFF_PAUSE_RX; memset(addr, 0, sizeof(addr)); memset(mask, 0, sizeof(mask)); if (dev->flags & IFF_PROMISC) { printk(KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name); - pff = NVREG_PFF_PROMISC; + pff |= NVREG_PFF_PROMISC; } else { - pff = NVREG_PFF_MYADDR; + pff |= NVREG_PFF_MYADDR; if (dev->flags & IFF_ALLMULTI || dev->mc_list) { u32 alwaysOff[2]; @@ -1886,6 +2080,35 @@ static void nv_set_multicast(struct net_device *dev) spin_unlock_irq(&np->lock); } +static void nv_update_pause(struct net_device *dev, u32 pause_flags) +{ + struct fe_priv *np = netdev_priv(dev); + u8 __iomem *base = get_hwbase(dev); + + np->pause_flags &= ~(NV_PAUSEFRAME_TX_ENABLE | NV_PAUSEFRAME_RX_ENABLE); + + if (np->pause_flags & NV_PAUSEFRAME_RX_CAPABLE) { + u32 pff = readl(base + NvRegPacketFilterFlags) & ~NVREG_PFF_PAUSE_RX; + if (pause_flags & NV_PAUSEFRAME_RX_ENABLE) { + writel(pff|NVREG_PFF_PAUSE_RX, base + NvRegPacketFilterFlags); + np->pause_flags |= NV_PAUSEFRAME_RX_ENABLE; + } else { + writel(pff, base + NvRegPacketFilterFlags); + } + } + if (np->pause_flags & NV_PAUSEFRAME_TX_CAPABLE) { + u32 regmisc = readl(base + NvRegMisc1) & ~NVREG_MISC1_PAUSE_TX; + if (pause_flags & NV_PAUSEFRAME_TX_ENABLE) { + writel(NVREG_TX_PAUSEFRAME_ENABLE, base + NvRegTxPauseFrame); + writel(regmisc|NVREG_MISC1_PAUSE_TX, base + NvRegMisc1); + np->pause_flags |= NV_PAUSEFRAME_TX_ENABLE; + } else { + writel(NVREG_TX_PAUSEFRAME_DISABLE, base + NvRegTxPauseFrame); + writel(regmisc, base + NvRegMisc1); + } + } +} + /** * nv_update_linkspeed: Setup the MAC according to the link partner * @dev: Network device to be configured @@ -1901,12 +2124,14 @@ static int nv_update_linkspeed(struct net_device *dev) { struct fe_priv *np = netdev_priv(dev); u8 __iomem *base = get_hwbase(dev); - int adv, lpa; + int adv = 0; + int lpa = 0; + int adv_lpa, adv_pause, lpa_pause; int newls = np->linkspeed; int newdup = np->duplex; int mii_status; int retval = 0; - u32 control_1000, status_1000, phyreg; + u32 control_1000, status_1000, phyreg, pause_flags, txreg; /* BMSR_LSTATUS is latched, read it twice: * we want the current value. @@ -1952,10 +2177,15 @@ static int nv_update_linkspeed(struct net_device *dev) goto set_speed; } + adv = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ); + lpa = mii_rw(dev, np->phyaddr, MII_LPA, MII_READ); + dprintk(KERN_DEBUG "%s: nv_update_linkspeed: PHY advertises 0x%04x, lpa 0x%04x.\n", + dev->name, adv, lpa); + retval = 1; if (np->gigabit == PHY_GIGABIT) { - control_1000 = mii_rw(dev, np->phyaddr, MII_1000BT_CR, MII_READ); - status_1000 = mii_rw(dev, np->phyaddr, MII_1000BT_SR, MII_READ); + control_1000 = mii_rw(dev, np->phyaddr, MII_CTRL1000, MII_READ); + status_1000 = mii_rw(dev, np->phyaddr, MII_STAT1000, MII_READ); if ((control_1000 & ADVERTISE_1000FULL) && (status_1000 & LPA_1000FULL)) { @@ -1967,27 +2197,22 @@ static int nv_update_linkspeed(struct net_device *dev) } } - adv = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ); - lpa = mii_rw(dev, np->phyaddr, MII_LPA, MII_READ); - dprintk(KERN_DEBUG "%s: nv_update_linkspeed: PHY advertises 0x%04x, lpa 0x%04x.\n", - dev->name, adv, lpa); - /* FIXME: handle parallel detection properly */ - lpa = lpa & adv; - if (lpa & LPA_100FULL) { + adv_lpa = lpa & adv; + if (adv_lpa & LPA_100FULL) { newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_100; newdup = 1; - } else if (lpa & LPA_100HALF) { + } else if (adv_lpa & LPA_100HALF) { newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_100; newdup = 0; - } else if (lpa & LPA_10FULL) { + } else if (adv_lpa & LPA_10FULL) { newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10; newdup = 1; - } else if (lpa & LPA_10HALF) { + } else if (adv_lpa & LPA_10HALF) { newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10; newdup = 0; } else { - dprintk(KERN_DEBUG "%s: bad ability %04x - falling back to 10HD.\n", dev->name, lpa); + dprintk(KERN_DEBUG "%s: bad ability %04x - falling back to 10HD.\n", dev->name, adv_lpa); newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10; newdup = 0; } @@ -2024,12 +2249,72 @@ set_speed: phyreg |= PHY_1000; writel(phyreg, base + NvRegPhyInterface); + if (phyreg & PHY_RGMII) { + if ((np->linkspeed & NVREG_LINKSPEED_MASK) == NVREG_LINKSPEED_1000) + txreg = NVREG_TX_DEFERRAL_RGMII_1000; + else + txreg = NVREG_TX_DEFERRAL_RGMII_10_100; + } else { + txreg = NVREG_TX_DEFERRAL_DEFAULT; + } + writel(txreg, base + NvRegTxDeferral); + + if (np->desc_ver == DESC_VER_1) { + txreg = NVREG_TX_WM_DESC1_DEFAULT; + } else { + if ((np->linkspeed & NVREG_LINKSPEED_MASK) == NVREG_LINKSPEED_1000) + txreg = NVREG_TX_WM_DESC2_3_1000; + else + txreg = NVREG_TX_WM_DESC2_3_DEFAULT; + } + writel(txreg, base + NvRegTxWatermark); + writel(NVREG_MISC1_FORCE | ( np->duplex ? 0 : NVREG_MISC1_HD), base + NvRegMisc1); pci_push(base); writel(np->linkspeed, base + NvRegLinkSpeed); pci_push(base); + pause_flags = 0; + /* setup pause frame */ + if (np->duplex != 0) { + if (np->autoneg && np->pause_flags & NV_PAUSEFRAME_AUTONEG) { + adv_pause = adv & (ADVERTISE_PAUSE_CAP| ADVERTISE_PAUSE_ASYM); + lpa_pause = lpa & (LPA_PAUSE_CAP| LPA_PAUSE_ASYM); + + switch (adv_pause) { + case (ADVERTISE_PAUSE_CAP): + if (lpa_pause & LPA_PAUSE_CAP) { + pause_flags |= NV_PAUSEFRAME_RX_ENABLE; + if (np->pause_flags & NV_PAUSEFRAME_TX_REQ) + pause_flags |= NV_PAUSEFRAME_TX_ENABLE; + } + break; + case (ADVERTISE_PAUSE_ASYM): + if (lpa_pause == (LPA_PAUSE_CAP| LPA_PAUSE_ASYM)) + { + pause_flags |= NV_PAUSEFRAME_TX_ENABLE; + } + break; + case (ADVERTISE_PAUSE_CAP| ADVERTISE_PAUSE_ASYM): + if (lpa_pause & LPA_PAUSE_CAP) + { + pause_flags |= NV_PAUSEFRAME_RX_ENABLE; + if (np->pause_flags & NV_PAUSEFRAME_TX_REQ) + pause_flags |= NV_PAUSEFRAME_TX_ENABLE; + } + if (lpa_pause == LPA_PAUSE_ASYM) + { + pause_flags |= NV_PAUSEFRAME_RX_ENABLE; + } + break; + } + } else { + pause_flags = np->pause_flags; + } + } + nv_update_pause(dev, pause_flags); + return retval; } @@ -2090,7 +2375,7 @@ static irqreturn_t nv_nic_irq(int foo, void *data, struct pt_regs *regs) spin_lock(&np->lock); nv_tx_done(dev); spin_unlock(&np->lock); - + nv_rx_process(dev); if (nv_alloc_rx(dev)) { spin_lock(&np->lock); @@ -2098,7 +2383,7 @@ static irqreturn_t nv_nic_irq(int foo, void *data, struct pt_regs *regs) mod_timer(&np->oom_kick, jiffies + OOM_REFILL); spin_unlock(&np->lock); } - + if (events & NVREG_IRQ_LINK) { spin_lock(&np->lock); nv_link_irq(dev); @@ -2149,6 +2434,7 @@ static irqreturn_t nv_nic_irq_tx(int foo, void *data, struct pt_regs *regs) u8 __iomem *base = get_hwbase(dev); u32 events; int i; + unsigned long flags; dprintk(KERN_DEBUG "%s: nv_nic_irq_tx\n", dev->name); @@ -2160,16 +2446,16 @@ static irqreturn_t nv_nic_irq_tx(int foo, void *data, struct pt_regs *regs) if (!(events & np->irqmask)) break; - spin_lock_irq(&np->lock); + spin_lock_irqsave(&np->lock, flags); nv_tx_done(dev); - spin_unlock_irq(&np->lock); - + spin_unlock_irqrestore(&np->lock, flags); + if (events & (NVREG_IRQ_TX_ERR)) { dprintk(KERN_DEBUG "%s: received irq with events 0x%x. Probably TX fail.\n", dev->name, events); } if (i > max_interrupt_work) { - spin_lock_irq(&np->lock); + spin_lock_irqsave(&np->lock, flags); /* disable interrupts on the nic */ writel(NVREG_IRQ_TX_ALL, base + NvRegIrqMask); pci_push(base); @@ -2179,7 +2465,7 @@ static irqreturn_t nv_nic_irq_tx(int foo, void *data, struct pt_regs *regs) mod_timer(&np->nic_poll, jiffies + POLL_WAIT); } printk(KERN_DEBUG "%s: too many iterations (%d) in nv_nic_irq_tx.\n", dev->name, i); - spin_unlock_irq(&np->lock); + spin_unlock_irqrestore(&np->lock, flags); break; } @@ -2196,6 +2482,7 @@ static irqreturn_t nv_nic_irq_rx(int foo, void *data, struct pt_regs *regs) u8 __iomem *base = get_hwbase(dev); u32 events; int i; + unsigned long flags; dprintk(KERN_DEBUG "%s: nv_nic_irq_rx\n", dev->name); @@ -2206,17 +2493,17 @@ static irqreturn_t nv_nic_irq_rx(int foo, void *data, struct pt_regs *regs) dprintk(KERN_DEBUG "%s: rx irq: %08x\n", dev->name, events); if (!(events & np->irqmask)) break; - + nv_rx_process(dev); if (nv_alloc_rx(dev)) { - spin_lock_irq(&np->lock); + spin_lock_irqsave(&np->lock, flags); if (!np->in_shutdown) mod_timer(&np->oom_kick, jiffies + OOM_REFILL); - spin_unlock_irq(&np->lock); + spin_unlock_irqrestore(&np->lock, flags); } - + if (i > max_interrupt_work) { - spin_lock_irq(&np->lock); + spin_lock_irqsave(&np->lock, flags); /* disable interrupts on the nic */ writel(NVREG_IRQ_RX_ALL, base + NvRegIrqMask); pci_push(base); @@ -2226,7 +2513,7 @@ static irqreturn_t nv_nic_irq_rx(int foo, void *data, struct pt_regs *regs) mod_timer(&np->nic_poll, jiffies + POLL_WAIT); } printk(KERN_DEBUG "%s: too many iterations (%d) in nv_nic_irq_rx.\n", dev->name, i); - spin_unlock_irq(&np->lock); + spin_unlock_irqrestore(&np->lock, flags); break; } @@ -2243,6 +2530,7 @@ static irqreturn_t nv_nic_irq_other(int foo, void *data, struct pt_regs *regs) u8 __iomem *base = get_hwbase(dev); u32 events; int i; + unsigned long flags; dprintk(KERN_DEBUG "%s: nv_nic_irq_other\n", dev->name); @@ -2253,16 +2541,16 @@ static irqreturn_t nv_nic_irq_other(int foo, void *data, struct pt_regs *regs) dprintk(KERN_DEBUG "%s: irq: %08x\n", dev->name, events); if (!(events & np->irqmask)) break; - + if (events & NVREG_IRQ_LINK) { - spin_lock_irq(&np->lock); + spin_lock_irqsave(&np->lock, flags); nv_link_irq(dev); - spin_unlock_irq(&np->lock); + spin_unlock_irqrestore(&np->lock, flags); } if (np->need_linktimer && time_after(jiffies, np->link_timeout)) { - spin_lock_irq(&np->lock); + spin_lock_irqsave(&np->lock, flags); nv_linkchange(dev); - spin_unlock_irq(&np->lock); + spin_unlock_irqrestore(&np->lock, flags); np->link_timeout = jiffies + LINK_TIMEOUT; } if (events & (NVREG_IRQ_UNKNOWN)) { @@ -2270,7 +2558,7 @@ static irqreturn_t nv_nic_irq_other(int foo, void *data, struct pt_regs *regs) dev->name, events); } if (i > max_interrupt_work) { - spin_lock_irq(&np->lock); + spin_lock_irqsave(&np->lock, flags); /* disable interrupts on the nic */ writel(NVREG_IRQ_OTHER, base + NvRegIrqMask); pci_push(base); @@ -2280,7 +2568,7 @@ static irqreturn_t nv_nic_irq_other(int foo, void *data, struct pt_regs *regs) mod_timer(&np->nic_poll, jiffies + POLL_WAIT); } printk(KERN_DEBUG "%s: too many iterations (%d) in nv_nic_irq_other.\n", dev->name, i); - spin_unlock_irq(&np->lock); + spin_unlock_irqrestore(&np->lock, flags); break; } @@ -2290,6 +2578,175 @@ static irqreturn_t nv_nic_irq_other(int foo, void *data, struct pt_regs *regs) return IRQ_RETVAL(i); } +static irqreturn_t nv_nic_irq_test(int foo, void *data, struct pt_regs *regs) +{ + struct net_device *dev = (struct net_device *) data; + struct fe_priv *np = netdev_priv(dev); + u8 __iomem *base = get_hwbase(dev); + u32 events; + + dprintk(KERN_DEBUG "%s: nv_nic_irq_test\n", dev->name); + + if (!(np->msi_flags & NV_MSI_X_ENABLED)) { + events = readl(base + NvRegIrqStatus) & NVREG_IRQSTAT_MASK; + writel(NVREG_IRQ_TIMER, base + NvRegIrqStatus); + } else { + events = readl(base + NvRegMSIXIrqStatus) & NVREG_IRQSTAT_MASK; + writel(NVREG_IRQ_TIMER, base + NvRegMSIXIrqStatus); + } + pci_push(base); + dprintk(KERN_DEBUG "%s: irq: %08x\n", dev->name, events); + if (!(events & NVREG_IRQ_TIMER)) + return IRQ_RETVAL(0); + + spin_lock(&np->lock); + np->intr_test = 1; + spin_unlock(&np->lock); + + dprintk(KERN_DEBUG "%s: nv_nic_irq_test completed\n", dev->name); + + return IRQ_RETVAL(1); +} + +static void set_msix_vector_map(struct net_device *dev, u32 vector, u32 irqmask) +{ + u8 __iomem *base = get_hwbase(dev); + int i; + u32 msixmap = 0; + + /* Each interrupt bit can be mapped to a MSIX vector (4 bits). + * MSIXMap0 represents the first 8 interrupts and MSIXMap1 represents + * the remaining 8 interrupts. + */ + for (i = 0; i < 8; i++) { + if ((irqmask >> i) & 0x1) { + msixmap |= vector << (i << 2); + } + } + writel(readl(base + NvRegMSIXMap0) | msixmap, base + NvRegMSIXMap0); + + msixmap = 0; + for (i = 0; i < 8; i++) { + if ((irqmask >> (i + 8)) & 0x1) { + msixmap |= vector << (i << 2); + } + } + writel(readl(base + NvRegMSIXMap1) | msixmap, base + NvRegMSIXMap1); +} + +static int nv_request_irq(struct net_device *dev, int intr_test) +{ + struct fe_priv *np = get_nvpriv(dev); + u8 __iomem *base = get_hwbase(dev); + int ret = 1; + int i; + + if (np->msi_flags & NV_MSI_X_CAPABLE) { + for (i = 0; i < (np->msi_flags & NV_MSI_X_VECTORS_MASK); i++) { + np->msi_x_entry[i].entry = i; + } + if ((ret = pci_enable_msix(np->pci_dev, np->msi_x_entry, (np->msi_flags & NV_MSI_X_VECTORS_MASK))) == 0) { + np->msi_flags |= NV_MSI_X_ENABLED; + if (optimization_mode == NV_OPTIMIZATION_MODE_THROUGHPUT && !intr_test) { + /* Request irq for rx handling */ + if (request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector, &nv_nic_irq_rx, IRQF_SHARED, dev->name, dev) != 0) { + printk(KERN_INFO "forcedeth: request_irq failed for rx %d\n", ret); + pci_disable_msix(np->pci_dev); + np->msi_flags &= ~NV_MSI_X_ENABLED; + goto out_err; + } + /* Request irq for tx handling */ + if (request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_TX].vector, &nv_nic_irq_tx, IRQF_SHARED, dev->name, dev) != 0) { + printk(KERN_INFO "forcedeth: request_irq failed for tx %d\n", ret); + pci_disable_msix(np->pci_dev); + np->msi_flags &= ~NV_MSI_X_ENABLED; + goto out_free_rx; + } + /* Request irq for link and timer handling */ + if (request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_OTHER].vector, &nv_nic_irq_other, IRQF_SHARED, dev->name, dev) != 0) { + printk(KERN_INFO "forcedeth: request_irq failed for link %d\n", ret); + pci_disable_msix(np->pci_dev); + np->msi_flags &= ~NV_MSI_X_ENABLED; + goto out_free_tx; + } + /* map interrupts to their respective vector */ + writel(0, base + NvRegMSIXMap0); + writel(0, base + NvRegMSIXMap1); + set_msix_vector_map(dev, NV_MSI_X_VECTOR_RX, NVREG_IRQ_RX_ALL); + set_msix_vector_map(dev, NV_MSI_X_VECTOR_TX, NVREG_IRQ_TX_ALL); + set_msix_vector_map(dev, NV_MSI_X_VECTOR_OTHER, NVREG_IRQ_OTHER); + } else { + /* Request irq for all interrupts */ + if ((!intr_test && + request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector, &nv_nic_irq, IRQF_SHARED, dev->name, dev) != 0) || + (intr_test && + request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector, &nv_nic_irq_test, IRQF_SHARED, dev->name, dev) != 0)) { + printk(KERN_INFO "forcedeth: request_irq failed %d\n", ret); + pci_disable_msix(np->pci_dev); + np->msi_flags &= ~NV_MSI_X_ENABLED; + goto out_err; + } + + /* map interrupts to vector 0 */ + writel(0, base + NvRegMSIXMap0); + writel(0, base + NvRegMSIXMap1); + } + } + } + if (ret != 0 && np->msi_flags & NV_MSI_CAPABLE) { + if ((ret = pci_enable_msi(np->pci_dev)) == 0) { + np->msi_flags |= NV_MSI_ENABLED; + if ((!intr_test && request_irq(np->pci_dev->irq, &nv_nic_irq, IRQF_SHARED, dev->name, dev) != 0) || + (intr_test && request_irq(np->pci_dev->irq, &nv_nic_irq_test, IRQF_SHARED, dev->name, dev) != 0)) { + printk(KERN_INFO "forcedeth: request_irq failed %d\n", ret); + pci_disable_msi(np->pci_dev); + np->msi_flags &= ~NV_MSI_ENABLED; + goto out_err; + } + + /* map interrupts to vector 0 */ + writel(0, base + NvRegMSIMap0); + writel(0, base + NvRegMSIMap1); + /* enable msi vector 0 */ + writel(NVREG_MSI_VECTOR_0_ENABLED, base + NvRegMSIIrqMask); + } + } + if (ret != 0) { + if ((!intr_test && request_irq(np->pci_dev->irq, &nv_nic_irq, IRQF_SHARED, dev->name, dev) != 0) || + (intr_test && request_irq(np->pci_dev->irq, &nv_nic_irq_test, IRQF_SHARED, dev->name, dev) != 0)) + goto out_err; + + } + + return 0; +out_free_tx: + free_irq(np->msi_x_entry[NV_MSI_X_VECTOR_TX].vector, dev); +out_free_rx: + free_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector, dev); +out_err: + return 1; +} + +static void nv_free_irq(struct net_device *dev) +{ + struct fe_priv *np = get_nvpriv(dev); + int i; + + if (np->msi_flags & NV_MSI_X_ENABLED) { + for (i = 0; i < (np->msi_flags & NV_MSI_X_VECTORS_MASK); i++) { + free_irq(np->msi_x_entry[i].vector, dev); + } + pci_disable_msix(np->pci_dev); + np->msi_flags &= ~NV_MSI_X_ENABLED; + } else { + free_irq(np->pci_dev->irq, dev); + if (np->msi_flags & NV_MSI_ENABLED) { + pci_disable_msi(np->pci_dev); + np->msi_flags &= ~NV_MSI_ENABLED; + } + } +} + static void nv_do_nic_poll(unsigned long data) { struct net_device *dev = (struct net_device *) data; @@ -2305,49 +2762,49 @@ static void nv_do_nic_poll(unsigned long data) if (!using_multi_irqs(dev)) { if (np->msi_flags & NV_MSI_X_ENABLED) - disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector); + disable_irq_lockdep(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector); else - disable_irq(dev->irq); + disable_irq_lockdep(dev->irq); mask = np->irqmask; } else { if (np->nic_poll_irq & NVREG_IRQ_RX_ALL) { - disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector); + disable_irq_lockdep(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector); mask |= NVREG_IRQ_RX_ALL; } if (np->nic_poll_irq & NVREG_IRQ_TX_ALL) { - disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_TX].vector); + disable_irq_lockdep(np->msi_x_entry[NV_MSI_X_VECTOR_TX].vector); mask |= NVREG_IRQ_TX_ALL; } if (np->nic_poll_irq & NVREG_IRQ_OTHER) { - disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_OTHER].vector); + disable_irq_lockdep(np->msi_x_entry[NV_MSI_X_VECTOR_OTHER].vector); mask |= NVREG_IRQ_OTHER; } } np->nic_poll_irq = 0; /* FIXME: Do we need synchronize_irq(dev->irq) here? */ - + writel(mask, base + NvRegIrqMask); pci_push(base); if (!using_multi_irqs(dev)) { - nv_nic_irq((int) 0, (void *) data, (struct pt_regs *) NULL); + nv_nic_irq(0, dev, NULL); if (np->msi_flags & NV_MSI_X_ENABLED) - enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector); + enable_irq_lockdep(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector); else - enable_irq(dev->irq); + enable_irq_lockdep(dev->irq); } else { if (np->nic_poll_irq & NVREG_IRQ_RX_ALL) { - nv_nic_irq_rx((int) 0, (void *) data, (struct pt_regs *) NULL); - enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector); + nv_nic_irq_rx(0, dev, NULL); + enable_irq_lockdep(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector); } if (np->nic_poll_irq & NVREG_IRQ_TX_ALL) { - nv_nic_irq_tx((int) 0, (void *) data, (struct pt_regs *) NULL); - enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_TX].vector); + nv_nic_irq_tx(0, dev, NULL); + enable_irq_lockdep(np->msi_x_entry[NV_MSI_X_VECTOR_TX].vector); } if (np->nic_poll_irq & NVREG_IRQ_OTHER) { - nv_nic_irq_other((int) 0, (void *) data, (struct pt_regs *) NULL); - enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_OTHER].vector); + nv_nic_irq_other(0, dev, NULL); + enable_irq_lockdep(np->msi_x_entry[NV_MSI_X_VECTOR_OTHER].vector); } } } @@ -2359,7 +2816,57 @@ static void nv_poll_controller(struct net_device *dev) } #endif -static void nv_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) +static void nv_do_stats_poll(unsigned long data) +{ + struct net_device *dev = (struct net_device *) data; + struct fe_priv *np = netdev_priv(dev); + u8 __iomem *base = get_hwbase(dev); + + np->estats.tx_bytes += readl(base + NvRegTxCnt); + np->estats.tx_zero_rexmt += readl(base + NvRegTxZeroReXmt); + np->estats.tx_one_rexmt += readl(base + NvRegTxOneReXmt); + np->estats.tx_many_rexmt += readl(base + NvRegTxManyReXmt); + np->estats.tx_late_collision += readl(base + NvRegTxLateCol); + np->estats.tx_fifo_errors += readl(base + NvRegTxUnderflow); + np->estats.tx_carrier_errors += readl(base + NvRegTxLossCarrier); + np->estats.tx_excess_deferral += readl(base + NvRegTxExcessDef); + np->estats.tx_retry_error += readl(base + NvRegTxRetryErr); + np->estats.tx_deferral += readl(base + NvRegTxDef); + np->estats.tx_packets += readl(base + NvRegTxFrame); + np->estats.tx_pause += readl(base + NvRegTxPause); + np->estats.rx_frame_error += readl(base + NvRegRxFrameErr); + np->estats.rx_extra_byte += readl(base + NvRegRxExtraByte); + np->estats.rx_late_collision += readl(base + NvRegRxLateCol); + np->estats.rx_runt += readl(base + NvRegRxRunt); + np->estats.rx_frame_too_long += readl(base + NvRegRxFrameTooLong); + np->estats.rx_over_errors += readl(base + NvRegRxOverflow); + np->estats.rx_crc_errors += readl(base + NvRegRxFCSErr); + np->estats.rx_frame_align_error += readl(base + NvRegRxFrameAlignErr); + np->estats.rx_length_error += readl(base + NvRegRxLenErr); + np->estats.rx_unicast += readl(base + NvRegRxUnicast); + np->estats.rx_multicast += readl(base + NvRegRxMulticast); + np->estats.rx_broadcast += readl(base + NvRegRxBroadcast); + np->estats.rx_bytes += readl(base + NvRegRxCnt); + np->estats.rx_pause += readl(base + NvRegRxPause); + np->estats.rx_drop_frame += readl(base + NvRegRxDropFrame); + np->estats.rx_packets = + np->estats.rx_unicast + + np->estats.rx_multicast + + np->estats.rx_broadcast; + np->estats.rx_errors_total = + np->estats.rx_crc_errors + + np->estats.rx_over_errors + + np->estats.rx_frame_error + + (np->estats.rx_frame_align_error - np->estats.rx_extra_byte) + + np->estats.rx_late_collision + + np->estats.rx_runt + + np->estats.rx_frame_too_long; + + if (!np->in_shutdown) + mod_timer(&np->stats_poll, jiffies + STATS_INTERVAL); +} + +static void nv_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) { struct fe_priv *np = netdev_priv(dev); strcpy(info->driver, "forcedeth"); @@ -2382,17 +2889,19 @@ static int nv_set_wol(struct net_device *dev, struct ethtool_wolinfo *wolinfo) { struct fe_priv *np = netdev_priv(dev); u8 __iomem *base = get_hwbase(dev); + u32 flags = 0; - spin_lock_irq(&np->lock); if (wolinfo->wolopts == 0) { - writel(0, base + NvRegWakeUpFlags); np->wolenabled = 0; - } - if (wolinfo->wolopts & WAKE_MAGIC) { - writel(NVREG_WAKEUPFLAGS_ENABLE, base + NvRegWakeUpFlags); + } else if (wolinfo->wolopts & WAKE_MAGIC) { np->wolenabled = 1; + flags = NVREG_WAKEUPFLAGS_ENABLE; + } + if (netif_running(dev)) { + spin_lock_irq(&np->lock); + writel(flags, base + NvRegWakeUpFlags); + spin_unlock_irq(&np->lock); } - spin_unlock_irq(&np->lock); return 0; } @@ -2406,9 +2915,17 @@ static int nv_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) if (!netif_running(dev)) { /* We do not track link speed / duplex setting if the * interface is disabled. Force a link check */ - nv_update_linkspeed(dev); + if (nv_update_linkspeed(dev)) { + if (!netif_carrier_ok(dev)) + netif_carrier_on(dev); + } else { + if (netif_carrier_ok(dev)) + netif_carrier_off(dev); + } } - switch(np->linkspeed & (NVREG_LINKSPEED_MASK)) { + + if (netif_carrier_ok(dev)) { + switch(np->linkspeed & (NVREG_LINKSPEED_MASK)) { case NVREG_LINKSPEED_10: ecmd->speed = SPEED_10; break; @@ -2418,10 +2935,14 @@ static int nv_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) case NVREG_LINKSPEED_1000: ecmd->speed = SPEED_1000; break; + } + ecmd->duplex = DUPLEX_HALF; + if (np->duplex) + ecmd->duplex = DUPLEX_FULL; + } else { + ecmd->speed = -1; + ecmd->duplex = -1; } - ecmd->duplex = DUPLEX_HALF; - if (np->duplex) - ecmd->duplex = DUPLEX_FULL; ecmd->autoneg = np->autoneg; @@ -2429,23 +2950,20 @@ static int nv_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) if (np->autoneg) { ecmd->advertising |= ADVERTISED_Autoneg; adv = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ); - } else { - adv = np->fixed_mode; - } - if (adv & ADVERTISE_10HALF) - ecmd->advertising |= ADVERTISED_10baseT_Half; - if (adv & ADVERTISE_10FULL) - ecmd->advertising |= ADVERTISED_10baseT_Full; - if (adv & ADVERTISE_100HALF) - ecmd->advertising |= ADVERTISED_100baseT_Half; - if (adv & ADVERTISE_100FULL) - ecmd->advertising |= ADVERTISED_100baseT_Full; - if (np->autoneg && np->gigabit == PHY_GIGABIT) { - adv = mii_rw(dev, np->phyaddr, MII_1000BT_CR, MII_READ); - if (adv & ADVERTISE_1000FULL) - ecmd->advertising |= ADVERTISED_1000baseT_Full; + if (adv & ADVERTISE_10HALF) + ecmd->advertising |= ADVERTISED_10baseT_Half; + if (adv & ADVERTISE_10FULL) + ecmd->advertising |= ADVERTISED_10baseT_Full; + if (adv & ADVERTISE_100HALF) + ecmd->advertising |= ADVERTISED_100baseT_Half; + if (adv & ADVERTISE_100FULL) + ecmd->advertising |= ADVERTISED_100baseT_Full; + if (np->gigabit == PHY_GIGABIT) { + adv = mii_rw(dev, np->phyaddr, MII_CTRL1000, MII_READ); + if (adv & ADVERTISE_1000FULL) + ecmd->advertising |= ADVERTISED_1000baseT_Full; + } } - ecmd->supported = (SUPPORTED_Autoneg | SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | @@ -2497,7 +3015,18 @@ static int nv_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) return -EINVAL; } - spin_lock_irq(&np->lock); + netif_carrier_off(dev); + if (netif_running(dev)) { + nv_disable_irq(dev); + netif_tx_lock_bh(dev); + spin_lock(&np->lock); + /* stop engines */ + nv_stop_rx(dev); + nv_stop_tx(dev); + spin_unlock(&np->lock); + netif_tx_unlock_bh(dev); + } + if (ecmd->autoneg == AUTONEG_ENABLE) { int adv, bmcr; @@ -2505,7 +3034,7 @@ static int nv_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) /* advertise only what has been requested */ adv = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ); - adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4); + adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4 | ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM); if (ecmd->advertising & ADVERTISED_10baseT_Half) adv |= ADVERTISE_10HALF; if (ecmd->advertising & ADVERTISED_10baseT_Full) @@ -2514,16 +3043,22 @@ static int nv_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) adv |= ADVERTISE_100HALF; if (ecmd->advertising & ADVERTISED_100baseT_Full) adv |= ADVERTISE_100FULL; + if (np->pause_flags & NV_PAUSEFRAME_RX_REQ) /* for rx we set both advertisments but disable tx pause */ + adv |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM; + if (np->pause_flags & NV_PAUSEFRAME_TX_REQ) + adv |= ADVERTISE_PAUSE_ASYM; mii_rw(dev, np->phyaddr, MII_ADVERTISE, adv); if (np->gigabit == PHY_GIGABIT) { - adv = mii_rw(dev, np->phyaddr, MII_1000BT_CR, MII_READ); + adv = mii_rw(dev, np->phyaddr, MII_CTRL1000, MII_READ); adv &= ~ADVERTISE_1000FULL; if (ecmd->advertising & ADVERTISED_1000baseT_Full) adv |= ADVERTISE_1000FULL; - mii_rw(dev, np->phyaddr, MII_1000BT_CR, adv); + mii_rw(dev, np->phyaddr, MII_CTRL1000, adv); } + if (netif_running(dev)) + printk(KERN_INFO "%s: link down.\n", dev->name); bmcr = mii_rw(dev, np->phyaddr, MII_BMCR, MII_READ); bmcr |= (BMCR_ANENABLE | BMCR_ANRESTART); mii_rw(dev, np->phyaddr, MII_BMCR, bmcr); @@ -2534,7 +3069,7 @@ static int nv_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) np->autoneg = 0; adv = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ); - adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4); + adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4 | ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM); if (ecmd->speed == SPEED_10 && ecmd->duplex == DUPLEX_HALF) adv |= ADVERTISE_10HALF; if (ecmd->speed == SPEED_10 && ecmd->duplex == DUPLEX_FULL) @@ -2543,89 +3078,758 @@ static int nv_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) adv |= ADVERTISE_100HALF; if (ecmd->speed == SPEED_100 && ecmd->duplex == DUPLEX_FULL) adv |= ADVERTISE_100FULL; + np->pause_flags &= ~(NV_PAUSEFRAME_AUTONEG|NV_PAUSEFRAME_RX_ENABLE|NV_PAUSEFRAME_TX_ENABLE); + if (np->pause_flags & NV_PAUSEFRAME_RX_REQ) {/* for rx we set both advertisments but disable tx pause */ + adv |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM; + np->pause_flags |= NV_PAUSEFRAME_RX_ENABLE; + } + if (np->pause_flags & NV_PAUSEFRAME_TX_REQ) { + adv |= ADVERTISE_PAUSE_ASYM; + np->pause_flags |= NV_PAUSEFRAME_TX_ENABLE; + } mii_rw(dev, np->phyaddr, MII_ADVERTISE, adv); np->fixed_mode = adv; - if (np->gigabit == PHY_GIGABIT) { - adv = mii_rw(dev, np->phyaddr, MII_1000BT_CR, MII_READ); - adv &= ~ADVERTISE_1000FULL; - mii_rw(dev, np->phyaddr, MII_1000BT_CR, adv); - } + if (np->gigabit == PHY_GIGABIT) { + adv = mii_rw(dev, np->phyaddr, MII_CTRL1000, MII_READ); + adv &= ~ADVERTISE_1000FULL; + mii_rw(dev, np->phyaddr, MII_CTRL1000, adv); + } + + bmcr = mii_rw(dev, np->phyaddr, MII_BMCR, MII_READ); + bmcr &= ~(BMCR_ANENABLE|BMCR_SPEED100|BMCR_SPEED1000|BMCR_FULLDPLX); + if (np->fixed_mode & (ADVERTISE_10FULL|ADVERTISE_100FULL)) + bmcr |= BMCR_FULLDPLX; + if (np->fixed_mode & (ADVERTISE_100HALF|ADVERTISE_100FULL)) + bmcr |= BMCR_SPEED100; + mii_rw(dev, np->phyaddr, MII_BMCR, bmcr); + if (np->phy_oui == PHY_OUI_MARVELL) { + /* reset the phy */ + if (phy_reset(dev)) { + printk(KERN_INFO "%s: phy reset failed\n", dev->name); + return -EINVAL; + } + } else if (netif_running(dev)) { + /* Wait a bit and then reconfigure the nic. */ + udelay(10); + nv_linkchange(dev); + } + } + + if (netif_running(dev)) { + nv_start_rx(dev); + nv_start_tx(dev); + nv_enable_irq(dev); + } + + return 0; +} + +#define FORCEDETH_REGS_VER 1 + +static int nv_get_regs_len(struct net_device *dev) +{ + struct fe_priv *np = netdev_priv(dev); + return np->register_size; +} + +static void nv_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *buf) +{ + struct fe_priv *np = netdev_priv(dev); + u8 __iomem *base = get_hwbase(dev); + u32 *rbuf = buf; + int i; + + regs->version = FORCEDETH_REGS_VER; + spin_lock_irq(&np->lock); + for (i = 0;i <= np->register_size/sizeof(u32); i++) + rbuf[i] = readl(base + i*sizeof(u32)); + spin_unlock_irq(&np->lock); +} + +static int nv_nway_reset(struct net_device *dev) +{ + struct fe_priv *np = netdev_priv(dev); + int ret; + + if (np->autoneg) { + int bmcr; + + netif_carrier_off(dev); + if (netif_running(dev)) { + nv_disable_irq(dev); + netif_tx_lock_bh(dev); + spin_lock(&np->lock); + /* stop engines */ + nv_stop_rx(dev); + nv_stop_tx(dev); + spin_unlock(&np->lock); + netif_tx_unlock_bh(dev); + printk(KERN_INFO "%s: link down.\n", dev->name); + } + + bmcr = mii_rw(dev, np->phyaddr, MII_BMCR, MII_READ); + bmcr |= (BMCR_ANENABLE | BMCR_ANRESTART); + mii_rw(dev, np->phyaddr, MII_BMCR, bmcr); + + if (netif_running(dev)) { + nv_start_rx(dev); + nv_start_tx(dev); + nv_enable_irq(dev); + } + ret = 0; + } else { + ret = -EINVAL; + } + + return ret; +} + +static int nv_set_tso(struct net_device *dev, u32 value) +{ + struct fe_priv *np = netdev_priv(dev); + + if ((np->driver_data & DEV_HAS_CHECKSUM)) + return ethtool_op_set_tso(dev, value); + else + return -EOPNOTSUPP; +} + +static void nv_get_ringparam(struct net_device *dev, struct ethtool_ringparam* ring) +{ + struct fe_priv *np = netdev_priv(dev); + + ring->rx_max_pending = (np->desc_ver == DESC_VER_1) ? RING_MAX_DESC_VER_1 : RING_MAX_DESC_VER_2_3; + ring->rx_mini_max_pending = 0; + ring->rx_jumbo_max_pending = 0; + ring->tx_max_pending = (np->desc_ver == DESC_VER_1) ? RING_MAX_DESC_VER_1 : RING_MAX_DESC_VER_2_3; + + ring->rx_pending = np->rx_ring_size; + ring->rx_mini_pending = 0; + ring->rx_jumbo_pending = 0; + ring->tx_pending = np->tx_ring_size; +} + +static int nv_set_ringparam(struct net_device *dev, struct ethtool_ringparam* ring) +{ + struct fe_priv *np = netdev_priv(dev); + u8 __iomem *base = get_hwbase(dev); + u8 *rxtx_ring, *rx_skbuff, *tx_skbuff, *rx_dma, *tx_dma, *tx_dma_len; + dma_addr_t ring_addr; + + if (ring->rx_pending < RX_RING_MIN || + ring->tx_pending < TX_RING_MIN || + ring->rx_mini_pending != 0 || + ring->rx_jumbo_pending != 0 || + (np->desc_ver == DESC_VER_1 && + (ring->rx_pending > RING_MAX_DESC_VER_1 || + ring->tx_pending > RING_MAX_DESC_VER_1)) || + (np->desc_ver != DESC_VER_1 && + (ring->rx_pending > RING_MAX_DESC_VER_2_3 || + ring->tx_pending > RING_MAX_DESC_VER_2_3))) { + return -EINVAL; + } + + /* allocate new rings */ + if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { + rxtx_ring = pci_alloc_consistent(np->pci_dev, + sizeof(struct ring_desc) * (ring->rx_pending + ring->tx_pending), + &ring_addr); + } else { + rxtx_ring = pci_alloc_consistent(np->pci_dev, + sizeof(struct ring_desc_ex) * (ring->rx_pending + ring->tx_pending), + &ring_addr); + } + rx_skbuff = kmalloc(sizeof(struct sk_buff*) * ring->rx_pending, GFP_KERNEL); + rx_dma = kmalloc(sizeof(dma_addr_t) * ring->rx_pending, GFP_KERNEL); + tx_skbuff = kmalloc(sizeof(struct sk_buff*) * ring->tx_pending, GFP_KERNEL); + tx_dma = kmalloc(sizeof(dma_addr_t) * ring->tx_pending, GFP_KERNEL); + tx_dma_len = kmalloc(sizeof(unsigned int) * ring->tx_pending, GFP_KERNEL); + if (!rxtx_ring || !rx_skbuff || !rx_dma || !tx_skbuff || !tx_dma || !tx_dma_len) { + /* fall back to old rings */ + if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { + if(rxtx_ring) + pci_free_consistent(np->pci_dev, sizeof(struct ring_desc) * (ring->rx_pending + ring->tx_pending), + rxtx_ring, ring_addr); + } else { + if (rxtx_ring) + pci_free_consistent(np->pci_dev, sizeof(struct ring_desc_ex) * (ring->rx_pending + ring->tx_pending), + rxtx_ring, ring_addr); + } + if (rx_skbuff) + kfree(rx_skbuff); + if (rx_dma) + kfree(rx_dma); + if (tx_skbuff) + kfree(tx_skbuff); + if (tx_dma) + kfree(tx_dma); + if (tx_dma_len) + kfree(tx_dma_len); + goto exit; + } + + if (netif_running(dev)) { + nv_disable_irq(dev); + netif_tx_lock_bh(dev); + spin_lock(&np->lock); + /* stop engines */ + nv_stop_rx(dev); + nv_stop_tx(dev); + nv_txrx_reset(dev); + /* drain queues */ + nv_drain_rx(dev); + nv_drain_tx(dev); + /* delete queues */ + free_rings(dev); + } + + /* set new values */ + np->rx_ring_size = ring->rx_pending; + np->tx_ring_size = ring->tx_pending; + np->tx_limit_stop = ring->tx_pending - TX_LIMIT_DIFFERENCE; + np->tx_limit_start = ring->tx_pending - TX_LIMIT_DIFFERENCE - 1; + if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { + np->rx_ring.orig = (struct ring_desc*)rxtx_ring; + np->tx_ring.orig = &np->rx_ring.orig[np->rx_ring_size]; + } else { + np->rx_ring.ex = (struct ring_desc_ex*)rxtx_ring; + np->tx_ring.ex = &np->rx_ring.ex[np->rx_ring_size]; + } + np->rx_skbuff = (struct sk_buff**)rx_skbuff; + np->rx_dma = (dma_addr_t*)rx_dma; + np->tx_skbuff = (struct sk_buff**)tx_skbuff; + np->tx_dma = (dma_addr_t*)tx_dma; + np->tx_dma_len = (unsigned int*)tx_dma_len; + np->ring_addr = ring_addr; + + memset(np->rx_skbuff, 0, sizeof(struct sk_buff*) * np->rx_ring_size); + memset(np->rx_dma, 0, sizeof(dma_addr_t) * np->rx_ring_size); + memset(np->tx_skbuff, 0, sizeof(struct sk_buff*) * np->tx_ring_size); + memset(np->tx_dma, 0, sizeof(dma_addr_t) * np->tx_ring_size); + memset(np->tx_dma_len, 0, sizeof(unsigned int) * np->tx_ring_size); + + if (netif_running(dev)) { + /* reinit driver view of the queues */ + set_bufsize(dev); + if (nv_init_ring(dev)) { + if (!np->in_shutdown) + mod_timer(&np->oom_kick, jiffies + OOM_REFILL); + } + + /* reinit nic view of the queues */ + writel(np->rx_buf_sz, base + NvRegOffloadConfig); + setup_hw_rings(dev, NV_SETUP_RX_RING | NV_SETUP_TX_RING); + writel( ((np->rx_ring_size-1) << NVREG_RINGSZ_RXSHIFT) + ((np->tx_ring_size-1) << NVREG_RINGSZ_TXSHIFT), + base + NvRegRingSizes); + pci_push(base); + writel(NVREG_TXRXCTL_KICK|np->txrxctl_bits, get_hwbase(dev) + NvRegTxRxControl); + pci_push(base); + + /* restart engines */ + nv_start_rx(dev); + nv_start_tx(dev); + spin_unlock(&np->lock); + netif_tx_unlock_bh(dev); + nv_enable_irq(dev); + } + return 0; +exit: + return -ENOMEM; +} + +static void nv_get_pauseparam(struct net_device *dev, struct ethtool_pauseparam* pause) +{ + struct fe_priv *np = netdev_priv(dev); + + pause->autoneg = (np->pause_flags & NV_PAUSEFRAME_AUTONEG) != 0; + pause->rx_pause = (np->pause_flags & NV_PAUSEFRAME_RX_ENABLE) != 0; + pause->tx_pause = (np->pause_flags & NV_PAUSEFRAME_TX_ENABLE) != 0; +} + +static int nv_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam* pause) +{ + struct fe_priv *np = netdev_priv(dev); + int adv, bmcr; + + if ((!np->autoneg && np->duplex == 0) || + (np->autoneg && !pause->autoneg && np->duplex == 0)) { + printk(KERN_INFO "%s: can not set pause settings when forced link is in half duplex.\n", + dev->name); + return -EINVAL; + } + if (pause->tx_pause && !(np->pause_flags & NV_PAUSEFRAME_TX_CAPABLE)) { + printk(KERN_INFO "%s: hardware does not support tx pause frames.\n", dev->name); + return -EINVAL; + } + + netif_carrier_off(dev); + if (netif_running(dev)) { + nv_disable_irq(dev); + netif_tx_lock_bh(dev); + spin_lock(&np->lock); + /* stop engines */ + nv_stop_rx(dev); + nv_stop_tx(dev); + spin_unlock(&np->lock); + netif_tx_unlock_bh(dev); + } + + np->pause_flags &= ~(NV_PAUSEFRAME_RX_REQ|NV_PAUSEFRAME_TX_REQ); + if (pause->rx_pause) + np->pause_flags |= NV_PAUSEFRAME_RX_REQ; + if (pause->tx_pause) + np->pause_flags |= NV_PAUSEFRAME_TX_REQ; + + if (np->autoneg && pause->autoneg) { + np->pause_flags |= NV_PAUSEFRAME_AUTONEG; + + adv = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ); + adv &= ~(ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM); + if (np->pause_flags & NV_PAUSEFRAME_RX_REQ) /* for rx we set both advertisments but disable tx pause */ + adv |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM; + if (np->pause_flags & NV_PAUSEFRAME_TX_REQ) + adv |= ADVERTISE_PAUSE_ASYM; + mii_rw(dev, np->phyaddr, MII_ADVERTISE, adv); + + if (netif_running(dev)) + printk(KERN_INFO "%s: link down.\n", dev->name); + bmcr = mii_rw(dev, np->phyaddr, MII_BMCR, MII_READ); + bmcr |= (BMCR_ANENABLE | BMCR_ANRESTART); + mii_rw(dev, np->phyaddr, MII_BMCR, bmcr); + } else { + np->pause_flags &= ~(NV_PAUSEFRAME_AUTONEG|NV_PAUSEFRAME_RX_ENABLE|NV_PAUSEFRAME_TX_ENABLE); + if (pause->rx_pause) + np->pause_flags |= NV_PAUSEFRAME_RX_ENABLE; + if (pause->tx_pause) + np->pause_flags |= NV_PAUSEFRAME_TX_ENABLE; + + if (!netif_running(dev)) + nv_update_linkspeed(dev); + else + nv_update_pause(dev, np->pause_flags); + } + + if (netif_running(dev)) { + nv_start_rx(dev); + nv_start_tx(dev); + nv_enable_irq(dev); + } + return 0; +} + +static u32 nv_get_rx_csum(struct net_device *dev) +{ + struct fe_priv *np = netdev_priv(dev); + return (np->txrxctl_bits & NVREG_TXRXCTL_RXCHECK) != 0; +} + +static int nv_set_rx_csum(struct net_device *dev, u32 data) +{ + struct fe_priv *np = netdev_priv(dev); + u8 __iomem *base = get_hwbase(dev); + int retcode = 0; + + if (np->driver_data & DEV_HAS_CHECKSUM) { + + if (((np->txrxctl_bits & NVREG_TXRXCTL_RXCHECK) && data) || + (!(np->txrxctl_bits & NVREG_TXRXCTL_RXCHECK) && !data)) { + /* already set or unset */ + return 0; + } + + if (data) { + np->txrxctl_bits |= NVREG_TXRXCTL_RXCHECK; + } else if (!(np->vlanctl_bits & NVREG_VLANCONTROL_ENABLE)) { + np->txrxctl_bits &= ~NVREG_TXRXCTL_RXCHECK; + } else { + printk(KERN_INFO "Can not disable rx checksum if vlan is enabled\n"); + return -EINVAL; + } + + if (netif_running(dev)) { + spin_lock_irq(&np->lock); + writel(np->txrxctl_bits, base + NvRegTxRxControl); + spin_unlock_irq(&np->lock); + } + } else { + return -EINVAL; + } + + return retcode; +} + +static int nv_set_tx_csum(struct net_device *dev, u32 data) +{ + struct fe_priv *np = netdev_priv(dev); + + if (np->driver_data & DEV_HAS_CHECKSUM) + return ethtool_op_set_tx_hw_csum(dev, data); + else + return -EOPNOTSUPP; +} + +static int nv_set_sg(struct net_device *dev, u32 data) +{ + struct fe_priv *np = netdev_priv(dev); + + if (np->driver_data & DEV_HAS_CHECKSUM) + return ethtool_op_set_sg(dev, data); + else + return -EOPNOTSUPP; +} + +static int nv_get_stats_count(struct net_device *dev) +{ + struct fe_priv *np = netdev_priv(dev); + + if (np->driver_data & DEV_HAS_STATISTICS) + return (sizeof(struct nv_ethtool_stats)/sizeof(u64)); + else + return 0; +} + +static void nv_get_ethtool_stats(struct net_device *dev, struct ethtool_stats *estats, u64 *buffer) +{ + struct fe_priv *np = netdev_priv(dev); + + /* update stats */ + nv_do_stats_poll((unsigned long)dev); + + memcpy(buffer, &np->estats, nv_get_stats_count(dev)*sizeof(u64)); +} + +static int nv_self_test_count(struct net_device *dev) +{ + struct fe_priv *np = netdev_priv(dev); + + if (np->driver_data & DEV_HAS_TEST_EXTENDED) + return NV_TEST_COUNT_EXTENDED; + else + return NV_TEST_COUNT_BASE; +} + +static int nv_link_test(struct net_device *dev) +{ + struct fe_priv *np = netdev_priv(dev); + int mii_status; + + mii_rw(dev, np->phyaddr, MII_BMSR, MII_READ); + mii_status = mii_rw(dev, np->phyaddr, MII_BMSR, MII_READ); + + /* check phy link status */ + if (!(mii_status & BMSR_LSTATUS)) + return 0; + else + return 1; +} + +static int nv_register_test(struct net_device *dev) +{ + u8 __iomem *base = get_hwbase(dev); + int i = 0; + u32 orig_read, new_read; + + do { + orig_read = readl(base + nv_registers_test[i].reg); + + /* xor with mask to toggle bits */ + orig_read ^= nv_registers_test[i].mask; + + writel(orig_read, base + nv_registers_test[i].reg); + + new_read = readl(base + nv_registers_test[i].reg); + + if ((new_read & nv_registers_test[i].mask) != (orig_read & nv_registers_test[i].mask)) + return 0; + + /* restore original value */ + orig_read ^= nv_registers_test[i].mask; + writel(orig_read, base + nv_registers_test[i].reg); + + } while (nv_registers_test[++i].reg != 0); + + return 1; +} + +static int nv_interrupt_test(struct net_device *dev) +{ + struct fe_priv *np = netdev_priv(dev); + u8 __iomem *base = get_hwbase(dev); + int ret = 1; + int testcnt; + u32 save_msi_flags, save_poll_interval = 0; + + if (netif_running(dev)) { + /* free current irq */ + nv_free_irq(dev); + save_poll_interval = readl(base+NvRegPollingInterval); + } + + /* flag to test interrupt handler */ + np->intr_test = 0; + + /* setup test irq */ + save_msi_flags = np->msi_flags; + np->msi_flags &= ~NV_MSI_X_VECTORS_MASK; + np->msi_flags |= 0x001; /* setup 1 vector */ + if (nv_request_irq(dev, 1)) + return 0; + + /* setup timer interrupt */ + writel(NVREG_POLL_DEFAULT_CPU, base + NvRegPollingInterval); + writel(NVREG_UNKSETUP6_VAL, base + NvRegUnknownSetupReg6); + + nv_enable_hw_interrupts(dev, NVREG_IRQ_TIMER); + + /* wait for at least one interrupt */ + msleep(100); + + spin_lock_irq(&np->lock); + + /* flag should be set within ISR */ + testcnt = np->intr_test; + if (!testcnt) + ret = 2; + + nv_disable_hw_interrupts(dev, NVREG_IRQ_TIMER); + if (!(np->msi_flags & NV_MSI_X_ENABLED)) + writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus); + else + writel(NVREG_IRQSTAT_MASK, base + NvRegMSIXIrqStatus); + + spin_unlock_irq(&np->lock); + + nv_free_irq(dev); + + np->msi_flags = save_msi_flags; + + if (netif_running(dev)) { + writel(save_poll_interval, base + NvRegPollingInterval); + writel(NVREG_UNKSETUP6_VAL, base + NvRegUnknownSetupReg6); + /* restore original irq */ + if (nv_request_irq(dev, 0)) + return 0; + } + + return ret; +} + +static int nv_loopback_test(struct net_device *dev) +{ + struct fe_priv *np = netdev_priv(dev); + u8 __iomem *base = get_hwbase(dev); + struct sk_buff *tx_skb, *rx_skb; + dma_addr_t test_dma_addr; + u32 tx_flags_extra = (np->desc_ver == DESC_VER_1 ? NV_TX_LASTPACKET : NV_TX2_LASTPACKET); + u32 Flags; + int len, i, pkt_len; + u8 *pkt_data; + u32 filter_flags = 0; + u32 misc1_flags = 0; + int ret = 1; + + if (netif_running(dev)) { + nv_disable_irq(dev); + filter_flags = readl(base + NvRegPacketFilterFlags); + misc1_flags = readl(base + NvRegMisc1); + } else { + nv_txrx_reset(dev); + } + + /* reinit driver view of the rx queue */ + set_bufsize(dev); + nv_init_ring(dev); + + /* setup hardware for loopback */ + writel(NVREG_MISC1_FORCE, base + NvRegMisc1); + writel(NVREG_PFF_ALWAYS | NVREG_PFF_LOOPBACK, base + NvRegPacketFilterFlags); + + /* reinit nic view of the rx queue */ + writel(np->rx_buf_sz, base + NvRegOffloadConfig); + setup_hw_rings(dev, NV_SETUP_RX_RING | NV_SETUP_TX_RING); + writel( ((np->rx_ring_size-1) << NVREG_RINGSZ_RXSHIFT) + ((np->tx_ring_size-1) << NVREG_RINGSZ_TXSHIFT), + base + NvRegRingSizes); + pci_push(base); + + /* restart rx engine */ + nv_start_rx(dev); + nv_start_tx(dev); + + /* setup packet for tx */ + pkt_len = ETH_DATA_LEN; + tx_skb = dev_alloc_skb(pkt_len); + pkt_data = skb_put(tx_skb, pkt_len); + for (i = 0; i < pkt_len; i++) + pkt_data[i] = (u8)(i & 0xff); + test_dma_addr = pci_map_single(np->pci_dev, tx_skb->data, + tx_skb->end-tx_skb->data, PCI_DMA_FROMDEVICE); + + if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { + np->tx_ring.orig[0].PacketBuffer = cpu_to_le32(test_dma_addr); + np->tx_ring.orig[0].FlagLen = cpu_to_le32((pkt_len-1) | np->tx_flags | tx_flags_extra); + } else { + np->tx_ring.ex[0].PacketBufferHigh = cpu_to_le64(test_dma_addr) >> 32; + np->tx_ring.ex[0].PacketBufferLow = cpu_to_le64(test_dma_addr) & 0x0FFFFFFFF; + np->tx_ring.ex[0].FlagLen = cpu_to_le32((pkt_len-1) | np->tx_flags | tx_flags_extra); + } + writel(NVREG_TXRXCTL_KICK|np->txrxctl_bits, get_hwbase(dev) + NvRegTxRxControl); + pci_push(get_hwbase(dev)); + + msleep(500); + + /* check for rx of the packet */ + if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { + Flags = le32_to_cpu(np->rx_ring.orig[0].FlagLen); + len = nv_descr_getlength(&np->rx_ring.orig[0], np->desc_ver); - bmcr = mii_rw(dev, np->phyaddr, MII_BMCR, MII_READ); - bmcr |= ~(BMCR_ANENABLE|BMCR_SPEED100|BMCR_FULLDPLX); - if (adv & (ADVERTISE_10FULL|ADVERTISE_100FULL)) - bmcr |= BMCR_FULLDPLX; - if (adv & (ADVERTISE_100HALF|ADVERTISE_100FULL)) - bmcr |= BMCR_SPEED100; - mii_rw(dev, np->phyaddr, MII_BMCR, bmcr); + } else { + Flags = le32_to_cpu(np->rx_ring.ex[0].FlagLen); + len = nv_descr_getlength_ex(&np->rx_ring.ex[0], np->desc_ver); + } - if (netif_running(dev)) { - /* Wait a bit and then reconfigure the nic. */ - udelay(10); - nv_linkchange(dev); + if (Flags & NV_RX_AVAIL) { + ret = 0; + } else if (np->desc_ver == DESC_VER_1) { + if (Flags & NV_RX_ERROR) + ret = 0; + } else { + if (Flags & NV_RX2_ERROR) { + ret = 0; } } - spin_unlock_irq(&np->lock); - return 0; -} + if (ret) { + if (len != pkt_len) { + ret = 0; + dprintk(KERN_DEBUG "%s: loopback len mismatch %d vs %d\n", + dev->name, len, pkt_len); + } else { + rx_skb = np->rx_skbuff[0]; + for (i = 0; i < pkt_len; i++) { + if (rx_skb->data[i] != (u8)(i & 0xff)) { + ret = 0; + dprintk(KERN_DEBUG "%s: loopback pattern check failed on byte %d\n", + dev->name, i); + break; + } + } + } + } else { + dprintk(KERN_DEBUG "%s: loopback - did not receive test packet\n", dev->name); + } -#define FORCEDETH_REGS_VER 1 + pci_unmap_page(np->pci_dev, test_dma_addr, + tx_skb->end-tx_skb->data, + PCI_DMA_TODEVICE); + dev_kfree_skb_any(tx_skb); -static int nv_get_regs_len(struct net_device *dev) -{ - struct fe_priv *np = netdev_priv(dev); - return np->register_size; + /* stop engines */ + nv_stop_rx(dev); + nv_stop_tx(dev); + nv_txrx_reset(dev); + /* drain rx queue */ + nv_drain_rx(dev); + nv_drain_tx(dev); + + if (netif_running(dev)) { + writel(misc1_flags, base + NvRegMisc1); + writel(filter_flags, base + NvRegPacketFilterFlags); + nv_enable_irq(dev); + } + + return ret; } -static void nv_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *buf) +static void nv_self_test(struct net_device *dev, struct ethtool_test *test, u64 *buffer) { struct fe_priv *np = netdev_priv(dev); u8 __iomem *base = get_hwbase(dev); - u32 *rbuf = buf; - int i; + int result; + memset(buffer, 0, nv_self_test_count(dev)*sizeof(u64)); - regs->version = FORCEDETH_REGS_VER; - spin_lock_irq(&np->lock); - for (i = 0;i <= np->register_size/sizeof(u32); i++) - rbuf[i] = readl(base + i*sizeof(u32)); - spin_unlock_irq(&np->lock); -} + if (!nv_link_test(dev)) { + test->flags |= ETH_TEST_FL_FAILED; + buffer[0] = 1; + } -static int nv_nway_reset(struct net_device *dev) -{ - struct fe_priv *np = netdev_priv(dev); - int ret; + if (test->flags & ETH_TEST_FL_OFFLINE) { + if (netif_running(dev)) { + netif_stop_queue(dev); + netif_tx_lock_bh(dev); + spin_lock_irq(&np->lock); + nv_disable_hw_interrupts(dev, np->irqmask); + if (!(np->msi_flags & NV_MSI_X_ENABLED)) { + writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus); + } else { + writel(NVREG_IRQSTAT_MASK, base + NvRegMSIXIrqStatus); + } + /* stop engines */ + nv_stop_rx(dev); + nv_stop_tx(dev); + nv_txrx_reset(dev); + /* drain rx queue */ + nv_drain_rx(dev); + nv_drain_tx(dev); + spin_unlock_irq(&np->lock); + netif_tx_unlock_bh(dev); + } - spin_lock_irq(&np->lock); - if (np->autoneg) { - int bmcr; + if (!nv_register_test(dev)) { + test->flags |= ETH_TEST_FL_FAILED; + buffer[1] = 1; + } - bmcr = mii_rw(dev, np->phyaddr, MII_BMCR, MII_READ); - bmcr |= (BMCR_ANENABLE | BMCR_ANRESTART); - mii_rw(dev, np->phyaddr, MII_BMCR, bmcr); + result = nv_interrupt_test(dev); + if (result != 1) { + test->flags |= ETH_TEST_FL_FAILED; + buffer[2] = 1; + } + if (result == 0) { + /* bail out */ + return; + } - ret = 0; - } else { - ret = -EINVAL; - } - spin_unlock_irq(&np->lock); + if (!nv_loopback_test(dev)) { + test->flags |= ETH_TEST_FL_FAILED; + buffer[3] = 1; + } - return ret; + if (netif_running(dev)) { + /* reinit driver view of the rx queue */ + set_bufsize(dev); + if (nv_init_ring(dev)) { + if (!np->in_shutdown) + mod_timer(&np->oom_kick, jiffies + OOM_REFILL); + } + /* reinit nic view of the rx queue */ + writel(np->rx_buf_sz, base + NvRegOffloadConfig); + setup_hw_rings(dev, NV_SETUP_RX_RING | NV_SETUP_TX_RING); + writel( ((np->rx_ring_size-1) << NVREG_RINGSZ_RXSHIFT) + ((np->tx_ring_size-1) << NVREG_RINGSZ_TXSHIFT), + base + NvRegRingSizes); + pci_push(base); + writel(NVREG_TXRXCTL_KICK|np->txrxctl_bits, get_hwbase(dev) + NvRegTxRxControl); + pci_push(base); + /* restart rx engine */ + nv_start_rx(dev); + nv_start_tx(dev); + netif_start_queue(dev); + nv_enable_hw_interrupts(dev, np->irqmask); + } + } } -#ifdef NETIF_F_TSO -static int nv_set_tso(struct net_device *dev, u32 value) +static void nv_get_strings(struct net_device *dev, u32 stringset, u8 *buffer) { - struct fe_priv *np = netdev_priv(dev); - - if ((np->driver_data & DEV_HAS_CHECKSUM)) - return ethtool_op_set_tso(dev, value); - else - return value ? -EOPNOTSUPP : 0; + switch (stringset) { + case ETH_SS_STATS: + memcpy(buffer, &nv_estats_str, nv_get_stats_count(dev)*sizeof(struct nv_ethtool_str)); + break; + case ETH_SS_TEST: + memcpy(buffer, &nv_etests_str, nv_self_test_count(dev)*sizeof(struct nv_ethtool_str)); + break; + } } -#endif static struct ethtool_ops ops = { .get_drvinfo = nv_get_drvinfo, @@ -2638,10 +3842,23 @@ static struct ethtool_ops ops = { .get_regs = nv_get_regs, .nway_reset = nv_nway_reset, .get_perm_addr = ethtool_op_get_perm_addr, -#ifdef NETIF_F_TSO .get_tso = ethtool_op_get_tso, - .set_tso = nv_set_tso -#endif + .set_tso = nv_set_tso, + .get_ringparam = nv_get_ringparam, + .set_ringparam = nv_set_ringparam, + .get_pauseparam = nv_get_pauseparam, + .set_pauseparam = nv_set_pauseparam, + .get_rx_csum = nv_get_rx_csum, + .set_rx_csum = nv_set_rx_csum, + .get_tx_csum = ethtool_op_get_tx_csum, + .set_tx_csum = nv_set_tx_csum, + .get_sg = ethtool_op_get_sg, + .set_sg = nv_set_sg, + .get_strings = nv_get_strings, + .get_stats_count = nv_get_stats_count, + .get_ethtool_stats = nv_get_ethtool_stats, + .self_test_count = nv_self_test_count, + .self_test = nv_self_test, }; static void nv_vlan_rx_register(struct net_device *dev, struct vlan_group *grp) @@ -2672,139 +3889,6 @@ static void nv_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) /* nothing to do */ }; -static void set_msix_vector_map(struct net_device *dev, u32 vector, u32 irqmask) -{ - u8 __iomem *base = get_hwbase(dev); - int i; - u32 msixmap = 0; - - /* Each interrupt bit can be mapped to a MSIX vector (4 bits). - * MSIXMap0 represents the first 8 interrupts and MSIXMap1 represents - * the remaining 8 interrupts. - */ - for (i = 0; i < 8; i++) { - if ((irqmask >> i) & 0x1) { - msixmap |= vector << (i << 2); - } - } - writel(readl(base + NvRegMSIXMap0) | msixmap, base + NvRegMSIXMap0); - - msixmap = 0; - for (i = 0; i < 8; i++) { - if ((irqmask >> (i + 8)) & 0x1) { - msixmap |= vector << (i << 2); - } - } - writel(readl(base + NvRegMSIXMap1) | msixmap, base + NvRegMSIXMap1); -} - -static int nv_request_irq(struct net_device *dev) -{ - struct fe_priv *np = get_nvpriv(dev); - u8 __iomem *base = get_hwbase(dev); - int ret = 1; - int i; - - if (np->msi_flags & NV_MSI_X_CAPABLE) { - for (i = 0; i < (np->msi_flags & NV_MSI_X_VECTORS_MASK); i++) { - np->msi_x_entry[i].entry = i; - } - if ((ret = pci_enable_msix(np->pci_dev, np->msi_x_entry, (np->msi_flags & NV_MSI_X_VECTORS_MASK))) == 0) { - np->msi_flags |= NV_MSI_X_ENABLED; - if (optimization_mode == NV_OPTIMIZATION_MODE_THROUGHPUT) { - /* Request irq for rx handling */ - if (request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector, &nv_nic_irq_rx, SA_SHIRQ, dev->name, dev) != 0) { - printk(KERN_INFO "forcedeth: request_irq failed for rx %d\n", ret); - pci_disable_msix(np->pci_dev); - np->msi_flags &= ~NV_MSI_X_ENABLED; - goto out_err; - } - /* Request irq for tx handling */ - if (request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_TX].vector, &nv_nic_irq_tx, SA_SHIRQ, dev->name, dev) != 0) { - printk(KERN_INFO "forcedeth: request_irq failed for tx %d\n", ret); - pci_disable_msix(np->pci_dev); - np->msi_flags &= ~NV_MSI_X_ENABLED; - goto out_free_rx; - } - /* Request irq for link and timer handling */ - if (request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_OTHER].vector, &nv_nic_irq_other, SA_SHIRQ, dev->name, dev) != 0) { - printk(KERN_INFO "forcedeth: request_irq failed for link %d\n", ret); - pci_disable_msix(np->pci_dev); - np->msi_flags &= ~NV_MSI_X_ENABLED; - goto out_free_tx; - } - /* map interrupts to their respective vector */ - writel(0, base + NvRegMSIXMap0); - writel(0, base + NvRegMSIXMap1); - set_msix_vector_map(dev, NV_MSI_X_VECTOR_RX, NVREG_IRQ_RX_ALL); - set_msix_vector_map(dev, NV_MSI_X_VECTOR_TX, NVREG_IRQ_TX_ALL); - set_msix_vector_map(dev, NV_MSI_X_VECTOR_OTHER, NVREG_IRQ_OTHER); - } else { - /* Request irq for all interrupts */ - if (request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector, &nv_nic_irq, SA_SHIRQ, dev->name, dev) != 0) { - printk(KERN_INFO "forcedeth: request_irq failed %d\n", ret); - pci_disable_msix(np->pci_dev); - np->msi_flags &= ~NV_MSI_X_ENABLED; - goto out_err; - } - - /* map interrupts to vector 0 */ - writel(0, base + NvRegMSIXMap0); - writel(0, base + NvRegMSIXMap1); - } - } - } - if (ret != 0 && np->msi_flags & NV_MSI_CAPABLE) { - if ((ret = pci_enable_msi(np->pci_dev)) == 0) { - np->msi_flags |= NV_MSI_ENABLED; - if (request_irq(np->pci_dev->irq, &nv_nic_irq, SA_SHIRQ, dev->name, dev) != 0) { - printk(KERN_INFO "forcedeth: request_irq failed %d\n", ret); - pci_disable_msi(np->pci_dev); - np->msi_flags &= ~NV_MSI_ENABLED; - goto out_err; - } - - /* map interrupts to vector 0 */ - writel(0, base + NvRegMSIMap0); - writel(0, base + NvRegMSIMap1); - /* enable msi vector 0 */ - writel(NVREG_MSI_VECTOR_0_ENABLED, base + NvRegMSIIrqMask); - } - } - if (ret != 0) { - if (request_irq(np->pci_dev->irq, &nv_nic_irq, SA_SHIRQ, dev->name, dev) != 0) - goto out_err; - } - - return 0; -out_free_tx: - free_irq(np->msi_x_entry[NV_MSI_X_VECTOR_TX].vector, dev); -out_free_rx: - free_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector, dev); -out_err: - return 1; -} - -static void nv_free_irq(struct net_device *dev) -{ - struct fe_priv *np = get_nvpriv(dev); - int i; - - if (np->msi_flags & NV_MSI_X_ENABLED) { - for (i = 0; i < (np->msi_flags & NV_MSI_X_VECTORS_MASK); i++) { - free_irq(np->msi_x_entry[i].vector, dev); - } - pci_disable_msix(np->pci_dev); - np->msi_flags &= ~NV_MSI_X_ENABLED; - } else { - free_irq(np->pci_dev->irq, dev); - if (np->msi_flags & NV_MSI_ENABLED) { - pci_disable_msi(np->pci_dev); - np->msi_flags &= ~NV_MSI_ENABLED; - } - } -} - static int nv_open(struct net_device *dev) { struct fe_priv *np = netdev_priv(dev); @@ -2829,6 +3913,9 @@ static int nv_open(struct net_device *dev) writel(0, base + NvRegAdapterControl); + if (np->pause_flags & NV_PAUSEFRAME_TX_CAPABLE) + writel(NVREG_TX_PAUSEFRAME_DISABLE, base + NvRegTxPauseFrame); + /* 2) initialize descriptor rings */ set_bufsize(dev); oom = nv_init_ring(dev); @@ -2845,12 +3932,15 @@ static int nv_open(struct net_device *dev) /* 4) give hw rings */ setup_hw_rings(dev, NV_SETUP_RX_RING | NV_SETUP_TX_RING); - writel( ((RX_RING-1) << NVREG_RINGSZ_RXSHIFT) + ((TX_RING-1) << NVREG_RINGSZ_TXSHIFT), + writel( ((np->rx_ring_size-1) << NVREG_RINGSZ_RXSHIFT) + ((np->tx_ring_size-1) << NVREG_RINGSZ_TXSHIFT), base + NvRegRingSizes); /* 5) continue setup */ writel(np->linkspeed, base + NvRegLinkSpeed); - writel(NVREG_UNKSETUP3_VAL1, base + NvRegUnknownSetupReg3); + if (np->desc_ver == DESC_VER_1) + writel(NVREG_TX_WM_DESC1_DEFAULT, base + NvRegTxWatermark); + else + writel(NVREG_TX_WM_DESC2_3_DEFAULT, base + NvRegTxWatermark); writel(np->txrxctl_bits, base + NvRegTxRxControl); writel(np->vlanctl_bits, base + NvRegVlanControl); pci_push(base); @@ -2872,8 +3962,8 @@ static int nv_open(struct net_device *dev) writel(readl(base + NvRegReceiverStatus), base + NvRegReceiverStatus); get_random_bytes(&i, sizeof(i)); writel(NVREG_RNDSEED_FORCE | (i&NVREG_RNDSEED_MASK), base + NvRegRandomSeed); - writel(NVREG_UNKSETUP1_VAL, base + NvRegUnknownSetupReg1); - writel(NVREG_UNKSETUP2_VAL, base + NvRegUnknownSetupReg2); + writel(NVREG_TX_DEFERRAL_DEFAULT, base + NvRegTxDeferral); + writel(NVREG_RX_DEFERRAL_DEFAULT, base + NvRegRxDeferral); if (poll_interval == -1) { if (optimization_mode == NV_OPTIMIZATION_MODE_THROUGHPUT) writel(NVREG_POLL_DEFAULT_THROUGHPUT, base + NvRegPollingInterval); @@ -2887,7 +3977,8 @@ static int nv_open(struct net_device *dev) base + NvRegAdapterControl); writel(NVREG_MIISPEED_BIT8|NVREG_MIIDELAY, base + NvRegMIISpeed); writel(NVREG_UNKSETUP4_VAL, base + NvRegUnknownSetupReg4); - writel(NVREG_WAKEUPFLAGS_VAL, base + NvRegWakeUpFlags); + if (np->wolenabled) + writel(NVREG_WAKEUPFLAGS_ENABLE , base + NvRegWakeUpFlags); i = readl(base + NvRegPowerState); if ( (i & NVREG_POWERSTATE_POWEREDUP) == 0) @@ -2903,7 +3994,7 @@ static int nv_open(struct net_device *dev) writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus); pci_push(base); - if (nv_request_irq(dev)) { + if (nv_request_irq(dev, 0)) { goto out_drain; } @@ -2940,6 +4031,11 @@ static int nv_open(struct net_device *dev) } if (oom) mod_timer(&np->oom_kick, jiffies + OOM_REFILL); + + /* start statistics timer */ + if (np->driver_data & DEV_HAS_STATISTICS) + mod_timer(&np->stats_poll, jiffies + STATS_INTERVAL); + spin_unlock_irq(&np->lock); return 0; @@ -2960,6 +4056,7 @@ static int nv_close(struct net_device *dev) del_timer_sync(&np->oom_kick); del_timer_sync(&np->nic_poll); + del_timer_sync(&np->stats_poll); netif_stop_queue(dev); spin_lock_irq(&np->lock); @@ -3019,6 +4116,9 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i init_timer(&np->nic_poll); np->nic_poll.data = (unsigned long) dev; np->nic_poll.function = &nv_do_nic_poll; /* timer handler */ + init_timer(&np->stats_poll); + np->stats_poll.data = (unsigned long) dev; + np->stats_poll.function = &nv_do_stats_poll; /* timer handler */ err = pci_enable_device(pci_dev); if (err) { @@ -3033,7 +4133,7 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i if (err < 0) goto out_disable; - if (id->driver_data & (DEV_HAS_VLAN|DEV_HAS_MSI_X|DEV_HAS_POWER_CNTRL)) + if (id->driver_data & (DEV_HAS_VLAN|DEV_HAS_MSI_X|DEV_HAS_POWER_CNTRL|DEV_HAS_STATISTICS)) np->register_size = NV_PCI_REGSZ_VER2; else np->register_size = NV_PCI_REGSZ_VER1; @@ -3065,16 +4165,18 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i /* packet format 3: supports 40-bit addressing */ np->desc_ver = DESC_VER_3; np->txrxctl_bits = NVREG_TXRXCTL_DESC_3; - if (pci_set_dma_mask(pci_dev, DMA_39BIT_MASK)) { - printk(KERN_INFO "forcedeth: 64-bit DMA failed, using 32-bit addressing for device %s.\n", - pci_name(pci_dev)); - } else { - dev->features |= NETIF_F_HIGHDMA; - printk(KERN_INFO "forcedeth: using HIGHDMA\n"); - } - if (pci_set_consistent_dma_mask(pci_dev, 0x0000007fffffffffULL)) { - printk(KERN_INFO "forcedeth: 64-bit DMA (consistent) failed for device %s.\n", - pci_name(pci_dev)); + if (dma_64bit) { + if (pci_set_dma_mask(pci_dev, DMA_39BIT_MASK)) { + printk(KERN_INFO "forcedeth: 64-bit DMA failed, using 32-bit addressing for device %s.\n", + pci_name(pci_dev)); + } else { + dev->features |= NETIF_F_HIGHDMA; + printk(KERN_INFO "forcedeth: using HIGHDMA\n"); + } + if (pci_set_consistent_dma_mask(pci_dev, DMA_39BIT_MASK)) { + printk(KERN_INFO "forcedeth: 64-bit DMA (consistent) failed, using 32-bit ring buffers for device %s.\n", + pci_name(pci_dev)); + } } } else if (id->driver_data & DEV_HAS_LARGEDESC) { /* packet format 2: supports jumbo frames */ @@ -3107,13 +4209,19 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i } np->msi_flags = 0; - if ((id->driver_data & DEV_HAS_MSI) && !disable_msi) { + if ((id->driver_data & DEV_HAS_MSI) && msi) { np->msi_flags |= NV_MSI_CAPABLE; } - if ((id->driver_data & DEV_HAS_MSI_X) && !disable_msix) { + if ((id->driver_data & DEV_HAS_MSI_X) && msix) { np->msi_flags |= NV_MSI_X_CAPABLE; } + np->pause_flags = NV_PAUSEFRAME_RX_CAPABLE | NV_PAUSEFRAME_RX_REQ | NV_PAUSEFRAME_AUTONEG; + if (id->driver_data & DEV_HAS_PAUSEFRAME_TX) { + np->pause_flags |= NV_PAUSEFRAME_TX_CAPABLE | NV_PAUSEFRAME_TX_REQ; + } + + err = -ENOMEM; np->base = ioremap(addr, np->register_size); if (!np->base) @@ -3122,21 +4230,38 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i dev->irq = pci_dev->irq; + np->rx_ring_size = RX_RING_DEFAULT; + np->tx_ring_size = TX_RING_DEFAULT; + np->tx_limit_stop = np->tx_ring_size - TX_LIMIT_DIFFERENCE; + np->tx_limit_start = np->tx_ring_size - TX_LIMIT_DIFFERENCE - 1; + if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { np->rx_ring.orig = pci_alloc_consistent(pci_dev, - sizeof(struct ring_desc) * (RX_RING + TX_RING), + sizeof(struct ring_desc) * (np->rx_ring_size + np->tx_ring_size), &np->ring_addr); if (!np->rx_ring.orig) goto out_unmap; - np->tx_ring.orig = &np->rx_ring.orig[RX_RING]; + np->tx_ring.orig = &np->rx_ring.orig[np->rx_ring_size]; } else { np->rx_ring.ex = pci_alloc_consistent(pci_dev, - sizeof(struct ring_desc_ex) * (RX_RING + TX_RING), + sizeof(struct ring_desc_ex) * (np->rx_ring_size + np->tx_ring_size), &np->ring_addr); if (!np->rx_ring.ex) goto out_unmap; - np->tx_ring.ex = &np->rx_ring.ex[RX_RING]; + np->tx_ring.ex = &np->rx_ring.ex[np->rx_ring_size]; } + np->rx_skbuff = kmalloc(sizeof(struct sk_buff*) * np->rx_ring_size, GFP_KERNEL); + np->rx_dma = kmalloc(sizeof(dma_addr_t) * np->rx_ring_size, GFP_KERNEL); + np->tx_skbuff = kmalloc(sizeof(struct sk_buff*) * np->tx_ring_size, GFP_KERNEL); + np->tx_dma = kmalloc(sizeof(dma_addr_t) * np->tx_ring_size, GFP_KERNEL); + np->tx_dma_len = kmalloc(sizeof(unsigned int) * np->tx_ring_size, GFP_KERNEL); + if (!np->rx_skbuff || !np->rx_dma || !np->tx_skbuff || !np->tx_dma || !np->tx_dma_len) + goto out_freering; + memset(np->rx_skbuff, 0, sizeof(struct sk_buff*) * np->rx_ring_size); + memset(np->rx_dma, 0, sizeof(dma_addr_t) * np->rx_ring_size); + memset(np->tx_skbuff, 0, sizeof(struct sk_buff*) * np->tx_ring_size); + memset(np->tx_dma, 0, sizeof(dma_addr_t) * np->tx_ring_size); + memset(np->tx_dma_len, 0, sizeof(unsigned int) * np->tx_ring_size); dev->open = nv_open; dev->stop = nv_close; @@ -3258,9 +4383,9 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i if (i == 33) { printk(KERN_INFO "%s: open: Could not find a valid PHY.\n", pci_name(pci_dev)); - goto out_freering; + goto out_error; } - + /* reset it */ phy_init(dev); @@ -3272,7 +4397,7 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i err = register_netdev(dev); if (err) { printk(KERN_INFO "forcedeth: unable to register netdev: %d\n", err); - goto out_freering; + goto out_error; } printk(KERN_INFO "%s: forcedeth.c: subsystem: %05x:%04x bound to %s\n", dev->name, pci_dev->subsystem_vendor, pci_dev->subsystem_device, @@ -3280,14 +4405,10 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i return 0; -out_freering: - if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) - pci_free_consistent(np->pci_dev, sizeof(struct ring_desc) * (RX_RING + TX_RING), - np->rx_ring.orig, np->ring_addr); - else - pci_free_consistent(np->pci_dev, sizeof(struct ring_desc_ex) * (RX_RING + TX_RING), - np->rx_ring.ex, np->ring_addr); +out_error: pci_set_drvdata(pci_dev, NULL); +out_freering: + free_rings(dev); out_unmap: iounmap(get_hwbase(dev)); out_relreg: @@ -3303,15 +4424,11 @@ out: static void __devexit nv_remove(struct pci_dev *pci_dev) { struct net_device *dev = pci_get_drvdata(pci_dev); - struct fe_priv *np = netdev_priv(dev); unregister_netdev(dev); /* free all structures */ - if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) - pci_free_consistent(np->pci_dev, sizeof(struct ring_desc) * (RX_RING + TX_RING), np->rx_ring.orig, np->ring_addr); - else - pci_free_consistent(np->pci_dev, sizeof(struct ring_desc_ex) * (RX_RING + TX_RING), np->rx_ring.ex, np->ring_addr); + free_rings(dev); iounmap(get_hwbase(dev)); pci_release_regions(pci_dev); pci_disable_device(pci_dev); @@ -3374,11 +4491,43 @@ static struct pci_device_id pci_tbl[] = { }, { /* MCP55 Ethernet Controller */ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_14), - .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_VLAN|DEV_HAS_MSI|DEV_HAS_MSI_X|DEV_HAS_POWER_CNTRL, + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_VLAN|DEV_HAS_MSI|DEV_HAS_MSI_X|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED, }, { /* MCP55 Ethernet Controller */ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_15), - .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_VLAN|DEV_HAS_MSI|DEV_HAS_MSI_X|DEV_HAS_POWER_CNTRL, + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_VLAN|DEV_HAS_MSI|DEV_HAS_MSI_X|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED, + }, + { /* MCP61 Ethernet Controller */ + PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_16), + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED, + }, + { /* MCP61 Ethernet Controller */ + PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_17), + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED, + }, + { /* MCP61 Ethernet Controller */ + PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_18), + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED, + }, + { /* MCP61 Ethernet Controller */ + PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_19), + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED, + }, + { /* MCP65 Ethernet Controller */ + PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_20), + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED, + }, + { /* MCP65 Ethernet Controller */ + PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_21), + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED, + }, + { /* MCP65 Ethernet Controller */ + PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_22), + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED, + }, + { /* MCP65 Ethernet Controller */ + PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_23), + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED, }, {0,}, }; @@ -3408,10 +4557,12 @@ module_param(optimization_mode, int, 0); MODULE_PARM_DESC(optimization_mode, "In throughput mode (0), every tx & rx packet will generate an interrupt. In CPU mode (1), interrupts are controlled by a timer."); module_param(poll_interval, int, 0); MODULE_PARM_DESC(poll_interval, "Interval determines how frequent timer interrupt is generated by [(time_in_micro_secs * 100) / (2^10)]. Min is 0 and Max is 65535."); -module_param(disable_msi, int, 0); -MODULE_PARM_DESC(disable_msi, "Disable MSI interrupts by setting to 1."); -module_param(disable_msix, int, 0); -MODULE_PARM_DESC(disable_msix, "Disable MSIX interrupts by setting to 1."); +module_param(msi, int, 0); +MODULE_PARM_DESC(msi, "MSI interrupts are enabled by setting to 1 and disabled by setting to 0."); +module_param(msix, int, 0); +MODULE_PARM_DESC(msix, "MSIX interrupts are enabled by setting to 1 and disabled by setting to 0."); +module_param(dma_64bit, int, 0); +MODULE_PARM_DESC(dma_64bit, "High DMA is enabled by setting to 1 and disabled by setting to 0."); MODULE_AUTHOR("Manfred Spraul "); MODULE_DESCRIPTION("Reverse Engineered nForce ethernet driver"); diff --git a/drivers/net/fs_enet/Makefile b/drivers/net/fs_enet/Makefile index d6dd3f2fb..02d4dc18b 100644 --- a/drivers/net/fs_enet/Makefile +++ b/drivers/net/fs_enet/Makefile @@ -4,7 +4,7 @@ obj-$(CONFIG_FS_ENET) += fs_enet.o -obj-$(CONFIG_8xx) += mac-fec.o mac-scc.o -obj-$(CONFIG_8260) += mac-fcc.o +obj-$(CONFIG_8xx) += mac-fec.o mac-scc.o mii-fec.o +obj-$(CONFIG_CPM2) += mac-fcc.o mii-bitbang.o -fs_enet-objs := fs_enet-main.o fs_enet-mii.o mii-bitbang.o mii-fixed.o +fs_enet-objs := fs_enet-main.o diff --git a/drivers/net/fs_enet/fs_enet-main.c b/drivers/net/fs_enet/fs_enet-main.c index 196298f33..df62506a1 100644 --- a/drivers/net/fs_enet/fs_enet-main.c +++ b/drivers/net/fs_enet/fs_enet-main.c @@ -15,7 +15,6 @@ * kind, whether express or implied. */ -#include #include #include #include @@ -38,6 +37,7 @@ #include #include #include +#include #include #include @@ -672,7 +672,7 @@ static int fs_request_irq(struct net_device *dev, int irq, const char *name, struct fs_enet_private *fep = netdev_priv(dev); (*fep->ops->pre_request_irq)(dev, irq); - return request_irq(irq, irqf, SA_SHIRQ, name, dev); + return request_irq(irq, irqf, IRQF_SHARED, name, dev); } static void fs_free_irq(struct net_device *dev, int irq) @@ -683,35 +683,6 @@ static void fs_free_irq(struct net_device *dev, int irq) (*fep->ops->post_free_irq)(dev, irq); } -/**********************************************************************************/ - -/* This interrupt occurs when the PHY detects a link change. */ -static irqreturn_t -fs_mii_link_interrupt(int irq, void *dev_id, struct pt_regs *regs) -{ - struct net_device *dev = dev_id; - struct fs_enet_private *fep; - const struct fs_platform_info *fpi; - - fep = netdev_priv(dev); - fpi = fep->fpi; - - /* - * Acknowledge the interrupt if possible. If we have not - * found the PHY yet we can't process or acknowledge the - * interrupt now. Instead we ignore this interrupt for now, - * which we can do since it is edge triggered. It will be - * acknowledged later by fs_enet_open(). - */ - if (!fep->phy) - return IRQ_NONE; - - fs_mii_ack_int(dev); - fs_mii_link_status_change_check(dev, 0); - - return IRQ_HANDLED; -} - static void fs_timeout(struct net_device *dev) { struct fs_enet_private *fep = netdev_priv(dev); @@ -723,10 +694,13 @@ static void fs_timeout(struct net_device *dev) spin_lock_irqsave(&fep->lock, flags); if (dev->flags & IFF_UP) { + phy_stop(fep->phydev); (*fep->ops->stop)(dev); (*fep->ops->restart)(dev); + phy_start(fep->phydev); } + phy_start(fep->phydev); wake = fep->tx_free && !(CBDR_SC(fep->cur_tx) & BD_ENET_TX_READY); spin_unlock_irqrestore(&fep->lock, flags); @@ -734,35 +708,112 @@ static void fs_timeout(struct net_device *dev) netif_wake_queue(dev); } +/*----------------------------------------------------------------------------- + * generic link-change handler - should be sufficient for most cases + *-----------------------------------------------------------------------------*/ +static void generic_adjust_link(struct net_device *dev) +{ + struct fs_enet_private *fep = netdev_priv(dev); + struct phy_device *phydev = fep->phydev; + int new_state = 0; + + if (phydev->link) { + + /* adjust to duplex mode */ + if (phydev->duplex != fep->oldduplex){ + new_state = 1; + fep->oldduplex = phydev->duplex; + } + + if (phydev->speed != fep->oldspeed) { + new_state = 1; + fep->oldspeed = phydev->speed; + } + + if (!fep->oldlink) { + new_state = 1; + fep->oldlink = 1; + netif_schedule(dev); + netif_carrier_on(dev); + netif_start_queue(dev); + } + + if (new_state) + fep->ops->restart(dev); + + } else if (fep->oldlink) { + new_state = 1; + fep->oldlink = 0; + fep->oldspeed = 0; + fep->oldduplex = -1; + netif_carrier_off(dev); + netif_stop_queue(dev); + } + + if (new_state && netif_msg_link(fep)) + phy_print_status(phydev); +} + + +static void fs_adjust_link(struct net_device *dev) +{ + struct fs_enet_private *fep = netdev_priv(dev); + unsigned long flags; + + spin_lock_irqsave(&fep->lock, flags); + + if(fep->ops->adjust_link) + fep->ops->adjust_link(dev); + else + generic_adjust_link(dev); + + spin_unlock_irqrestore(&fep->lock, flags); +} + +static int fs_init_phy(struct net_device *dev) +{ + struct fs_enet_private *fep = netdev_priv(dev); + struct phy_device *phydev; + + fep->oldlink = 0; + fep->oldspeed = 0; + fep->oldduplex = -1; + if(fep->fpi->bus_id) + phydev = phy_connect(dev, fep->fpi->bus_id, &fs_adjust_link, 0); + else { + printk("No phy bus ID specified in BSP code\n"); + return -EINVAL; + } + if (IS_ERR(phydev)) { + printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name); + return PTR_ERR(phydev); + } + + fep->phydev = phydev; + + return 0; +} + + static int fs_enet_open(struct net_device *dev) { struct fs_enet_private *fep = netdev_priv(dev); - const struct fs_platform_info *fpi = fep->fpi; int r; + int err; /* Install our interrupt handler. */ r = fs_request_irq(dev, fep->interrupt, "fs_enet-mac", fs_enet_interrupt); if (r != 0) { printk(KERN_ERR DRV_MODULE_NAME - ": %s Could not allocate FEC IRQ!", dev->name); + ": %s Could not allocate FS_ENET IRQ!", dev->name); return -EINVAL; } - /* Install our phy interrupt handler */ - if (fpi->phy_irq != -1) { - - r = fs_request_irq(dev, fpi->phy_irq, "fs_enet-phy", fs_mii_link_interrupt); - if (r != 0) { - printk(KERN_ERR DRV_MODULE_NAME - ": %s Could not allocate PHY IRQ!", dev->name); - fs_free_irq(dev, fep->interrupt); - return -EINVAL; - } - } + err = fs_init_phy(dev); + if(err) + return err; - fs_mii_startup(dev); - netif_carrier_off(dev); - fs_mii_link_status_change_check(dev, 1); + phy_start(fep->phydev); return 0; } @@ -770,20 +821,19 @@ static int fs_enet_open(struct net_device *dev) static int fs_enet_close(struct net_device *dev) { struct fs_enet_private *fep = netdev_priv(dev); - const struct fs_platform_info *fpi = fep->fpi; unsigned long flags; netif_stop_queue(dev); netif_carrier_off(dev); - fs_mii_shutdown(dev); + phy_stop(fep->phydev); spin_lock_irqsave(&fep->lock, flags); (*fep->ops->stop)(dev); spin_unlock_irqrestore(&fep->lock, flags); /* release any irqs */ - if (fpi->phy_irq != -1) - fs_free_irq(dev, fpi->phy_irq); + phy_disconnect(fep->phydev); + fep->phydev = NULL; fs_free_irq(dev, fep->interrupt); return 0; @@ -831,33 +881,19 @@ static void fs_get_regs(struct net_device *dev, struct ethtool_regs *regs, static int fs_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) { struct fs_enet_private *fep = netdev_priv(dev); - unsigned long flags; - int rc; - - spin_lock_irqsave(&fep->lock, flags); - rc = mii_ethtool_gset(&fep->mii_if, cmd); - spin_unlock_irqrestore(&fep->lock, flags); - - return rc; + return phy_ethtool_gset(fep->phydev, cmd); } static int fs_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) { struct fs_enet_private *fep = netdev_priv(dev); - unsigned long flags; - int rc; - - spin_lock_irqsave(&fep->lock, flags); - rc = mii_ethtool_sset(&fep->mii_if, cmd); - spin_unlock_irqrestore(&fep->lock, flags); - - return rc; + phy_ethtool_sset(fep->phydev, cmd); + return 0; } static int fs_nway_reset(struct net_device *dev) { - struct fs_enet_private *fep = netdev_priv(dev); - return mii_nway_restart(&fep->mii_if); + return 0; } static u32 fs_get_msglevel(struct net_device *dev) @@ -899,7 +935,7 @@ static int fs_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) return -EINVAL; spin_lock_irqsave(&fep->lock, flags); - rc = generic_mii_ioctl(&fep->mii_if, mii, cmd, NULL); + rc = phy_mii_ioctl(fep->phydev, mii, cmd); spin_unlock_irqrestore(&fep->lock, flags); return rc; } @@ -1031,12 +1067,6 @@ static struct net_device *fs_init_instance(struct device *dev, } registered = 1; - err = fs_mii_connect(ndev); - if (err != 0) { - printk(KERN_ERR DRV_MODULE_NAME - ": %s fs_mii_connect failed.\n", ndev->name); - goto err; - } return ndev; @@ -1074,8 +1104,6 @@ static int fs_cleanup_instance(struct net_device *ndev) fpi = fep->fpi; - fs_mii_disconnect(ndev); - unregister_netdev(ndev); dma_free_coherent(fep->dev, (fpi->tx_ring + fpi->rx_ring) * sizeof(cbd_t), @@ -1197,17 +1225,39 @@ static int __init fs_init(void) r = setup_immap(); if (r != 0) return r; - r = driver_register(&fs_enet_fec_driver); + +#ifdef CONFIG_FS_ENET_HAS_FCC + /* let's insert mii stuff */ + r = fs_enet_mdio_bb_init(); + + if (r != 0) { + printk(KERN_ERR DRV_MODULE_NAME + "BB PHY init failed.\n"); + return r; + } + r = driver_register(&fs_enet_fcc_driver); if (r != 0) goto err; +#endif - r = driver_register(&fs_enet_fcc_driver); +#ifdef CONFIG_FS_ENET_HAS_FEC + r = fs_enet_mdio_fec_init(); + if (r != 0) { + printk(KERN_ERR DRV_MODULE_NAME + "FEC PHY init failed.\n"); + return r; + } + + r = driver_register(&fs_enet_fec_driver); if (r != 0) goto err; +#endif +#ifdef CONFIG_FS_ENET_HAS_SCC r = driver_register(&fs_enet_scc_driver); if (r != 0) goto err; +#endif return 0; err: diff --git a/drivers/net/fs_enet/fs_enet-mii.c b/drivers/net/fs_enet/fs_enet-mii.c deleted file mode 100644 index c6770377e..000000000 --- a/drivers/net/fs_enet/fs_enet-mii.c +++ /dev/null @@ -1,507 +0,0 @@ -/* - * Combined Ethernet driver for Motorola MPC8xx and MPC82xx. - * - * Copyright (c) 2003 Intracom S.A. - * by Pantelis Antoniou - * - * 2005 (c) MontaVista Software, Inc. - * Vitaly Bordug - * - * Heavily based on original FEC driver by Dan Malek - * and modifications by Joakim Tjernlund - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "fs_enet.h" - -/*************************************************/ - -/* - * Generic PHY support. - * Should work for all PHYs, but link change is detected by polling - */ - -static void generic_timer_callback(unsigned long data) -{ - struct net_device *dev = (struct net_device *)data; - struct fs_enet_private *fep = netdev_priv(dev); - - fep->phy_timer_list.expires = jiffies + HZ / 2; - - add_timer(&fep->phy_timer_list); - - fs_mii_link_status_change_check(dev, 0); -} - -static void generic_startup(struct net_device *dev) -{ - struct fs_enet_private *fep = netdev_priv(dev); - - fep->phy_timer_list.expires = jiffies + HZ / 2; /* every 500ms */ - fep->phy_timer_list.data = (unsigned long)dev; - fep->phy_timer_list.function = generic_timer_callback; - add_timer(&fep->phy_timer_list); -} - -static void generic_shutdown(struct net_device *dev) -{ - struct fs_enet_private *fep = netdev_priv(dev); - - del_timer_sync(&fep->phy_timer_list); -} - -/* ------------------------------------------------------------------------- */ -/* The Davicom DM9161 is used on the NETTA board */ - -/* register definitions */ - -#define MII_DM9161_ANAR 4 /* Aux. Config Register */ -#define MII_DM9161_ACR 16 /* Aux. Config Register */ -#define MII_DM9161_ACSR 17 /* Aux. Config/Status Register */ -#define MII_DM9161_10TCSR 18 /* 10BaseT Config/Status Reg. */ -#define MII_DM9161_INTR 21 /* Interrupt Register */ -#define MII_DM9161_RECR 22 /* Receive Error Counter Reg. */ -#define MII_DM9161_DISCR 23 /* Disconnect Counter Register */ - -static void dm9161_startup(struct net_device *dev) -{ - struct fs_enet_private *fep = netdev_priv(dev); - - fs_mii_write(dev, fep->mii_if.phy_id, MII_DM9161_INTR, 0x0000); - /* Start autonegotiation */ - fs_mii_write(dev, fep->mii_if.phy_id, MII_BMCR, 0x1200); - - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ*8); -} - -static void dm9161_ack_int(struct net_device *dev) -{ - struct fs_enet_private *fep = netdev_priv(dev); - - fs_mii_read(dev, fep->mii_if.phy_id, MII_DM9161_INTR); -} - -static void dm9161_shutdown(struct net_device *dev) -{ - struct fs_enet_private *fep = netdev_priv(dev); - - fs_mii_write(dev, fep->mii_if.phy_id, MII_DM9161_INTR, 0x0f00); -} - -/**********************************************************************************/ - -static const struct phy_info phy_info[] = { - { - .id = 0x00181b88, - .name = "DM9161", - .startup = dm9161_startup, - .ack_int = dm9161_ack_int, - .shutdown = dm9161_shutdown, - }, { - .id = 0, - .name = "GENERIC", - .startup = generic_startup, - .shutdown = generic_shutdown, - }, -}; - -/**********************************************************************************/ - -static int phy_id_detect(struct net_device *dev) -{ - struct fs_enet_private *fep = netdev_priv(dev); - const struct fs_platform_info *fpi = fep->fpi; - struct fs_enet_mii_bus *bus = fep->mii_bus; - int i, r, start, end, phytype, physubtype; - const struct phy_info *phy; - int phy_hwid, phy_id; - - phy_hwid = -1; - fep->phy = NULL; - - /* auto-detect? */ - if (fpi->phy_addr == -1) { - start = 1; - end = 32; - } else { /* direct */ - start = fpi->phy_addr; - end = start + 1; - } - - for (phy_id = start; phy_id < end; phy_id++) { - /* skip already used phy addresses on this bus */ - if (bus->usage_map & (1 << phy_id)) - continue; - r = fs_mii_read(dev, phy_id, MII_PHYSID1); - if (r == -1 || (phytype = (r & 0xffff)) == 0xffff) - continue; - r = fs_mii_read(dev, phy_id, MII_PHYSID2); - if (r == -1 || (physubtype = (r & 0xffff)) == 0xffff) - continue; - phy_hwid = (phytype << 16) | physubtype; - if (phy_hwid != -1) - break; - } - - if (phy_hwid == -1) { - printk(KERN_ERR DRV_MODULE_NAME - ": %s No PHY detected! range=0x%02x-0x%02x\n", - dev->name, start, end); - return -1; - } - - for (i = 0, phy = phy_info; i < ARRAY_SIZE(phy_info); i++, phy++) - if (phy->id == (phy_hwid >> 4) || phy->id == 0) - break; - - if (i >= ARRAY_SIZE(phy_info)) { - printk(KERN_ERR DRV_MODULE_NAME - ": %s PHY id 0x%08x is not supported!\n", - dev->name, phy_hwid); - return -1; - } - - fep->phy = phy; - - /* mark this address as used */ - bus->usage_map |= (1 << phy_id); - - printk(KERN_INFO DRV_MODULE_NAME - ": %s Phy @ 0x%x, type %s (0x%08x)%s\n", - dev->name, phy_id, fep->phy->name, phy_hwid, - fpi->phy_addr == -1 ? " (auto-detected)" : ""); - - return phy_id; -} - -void fs_mii_startup(struct net_device *dev) -{ - struct fs_enet_private *fep = netdev_priv(dev); - - if (fep->phy->startup) - (*fep->phy->startup) (dev); -} - -void fs_mii_shutdown(struct net_device *dev) -{ - struct fs_enet_private *fep = netdev_priv(dev); - - if (fep->phy->shutdown) - (*fep->phy->shutdown) (dev); -} - -void fs_mii_ack_int(struct net_device *dev) -{ - struct fs_enet_private *fep = netdev_priv(dev); - - if (fep->phy->ack_int) - (*fep->phy->ack_int) (dev); -} - -#define MII_LINK 0x0001 -#define MII_HALF 0x0002 -#define MII_FULL 0x0004 -#define MII_BASE4 0x0008 -#define MII_10M 0x0010 -#define MII_100M 0x0020 -#define MII_1G 0x0040 -#define MII_10G 0x0080 - -/* return full mii info at one gulp, with a usable form */ -static unsigned int mii_full_status(struct mii_if_info *mii) -{ - unsigned int status; - int bmsr, adv, lpa, neg; - struct fs_enet_private* fep = netdev_priv(mii->dev); - - /* first, a dummy read, needed to latch some MII phys */ - (void)mii->mdio_read(mii->dev, mii->phy_id, MII_BMSR); - bmsr = mii->mdio_read(mii->dev, mii->phy_id, MII_BMSR); - - /* no link */ - if ((bmsr & BMSR_LSTATUS) == 0) - return 0; - - status = MII_LINK; - - /* Lets look what ANEG says if it's supported - otherwize we shall - take the right values from the platform info*/ - if(!mii->force_media) { - /* autoneg not completed; don't bother */ - if ((bmsr & BMSR_ANEGCOMPLETE) == 0) - return 0; - - adv = (*mii->mdio_read)(mii->dev, mii->phy_id, MII_ADVERTISE); - lpa = (*mii->mdio_read)(mii->dev, mii->phy_id, MII_LPA); - - neg = lpa & adv; - } else { - neg = fep->fpi->bus_info->lpa; - } - - if (neg & LPA_100FULL) - status |= MII_FULL | MII_100M; - else if (neg & LPA_100BASE4) - status |= MII_FULL | MII_BASE4 | MII_100M; - else if (neg & LPA_100HALF) - status |= MII_HALF | MII_100M; - else if (neg & LPA_10FULL) - status |= MII_FULL | MII_10M; - else - status |= MII_HALF | MII_10M; - - return status; -} - -void fs_mii_link_status_change_check(struct net_device *dev, int init_media) -{ - struct fs_enet_private *fep = netdev_priv(dev); - struct mii_if_info *mii = &fep->mii_if; - unsigned int mii_status; - int ok_to_print, link, duplex, speed; - unsigned long flags; - - ok_to_print = netif_msg_link(fep); - - mii_status = mii_full_status(mii); - - if (!init_media && mii_status == fep->last_mii_status) - return; - - fep->last_mii_status = mii_status; - - link = !!(mii_status & MII_LINK); - duplex = !!(mii_status & MII_FULL); - speed = (mii_status & MII_100M) ? 100 : 10; - - if (link == 0) { - netif_carrier_off(mii->dev); - netif_stop_queue(dev); - if (!init_media) { - spin_lock_irqsave(&fep->lock, flags); - (*fep->ops->stop)(dev); - spin_unlock_irqrestore(&fep->lock, flags); - } - - if (ok_to_print) - printk(KERN_INFO "%s: link down\n", mii->dev->name); - - } else { - - mii->full_duplex = duplex; - - netif_carrier_on(mii->dev); - - spin_lock_irqsave(&fep->lock, flags); - fep->duplex = duplex; - fep->speed = speed; - (*fep->ops->restart)(dev); - spin_unlock_irqrestore(&fep->lock, flags); - - netif_start_queue(dev); - - if (ok_to_print) - printk(KERN_INFO "%s: link up, %dMbps, %s-duplex\n", - dev->name, speed, duplex ? "full" : "half"); - } -} - -/**********************************************************************************/ - -int fs_mii_read(struct net_device *dev, int phy_id, int location) -{ - struct fs_enet_private *fep = netdev_priv(dev); - struct fs_enet_mii_bus *bus = fep->mii_bus; - - unsigned long flags; - int ret; - - spin_lock_irqsave(&bus->mii_lock, flags); - ret = (*bus->mii_read)(bus, phy_id, location); - spin_unlock_irqrestore(&bus->mii_lock, flags); - - return ret; -} - -void fs_mii_write(struct net_device *dev, int phy_id, int location, int value) -{ - struct fs_enet_private *fep = netdev_priv(dev); - struct fs_enet_mii_bus *bus = fep->mii_bus; - unsigned long flags; - - spin_lock_irqsave(&bus->mii_lock, flags); - (*bus->mii_write)(bus, phy_id, location, value); - spin_unlock_irqrestore(&bus->mii_lock, flags); -} - -/*****************************************************************************/ - -/* list of all registered mii buses */ -static LIST_HEAD(fs_mii_bus_list); - -static struct fs_enet_mii_bus *lookup_bus(int method, int id) -{ - struct list_head *ptr; - struct fs_enet_mii_bus *bus; - - list_for_each(ptr, &fs_mii_bus_list) { - bus = list_entry(ptr, struct fs_enet_mii_bus, list); - if (bus->bus_info->method == method && - bus->bus_info->id == id) - return bus; - } - return NULL; -} - -static struct fs_enet_mii_bus *create_bus(const struct fs_mii_bus_info *bi) -{ - struct fs_enet_mii_bus *bus; - int ret = 0; - - bus = kmalloc(sizeof(*bus), GFP_KERNEL); - if (bus == NULL) { - ret = -ENOMEM; - goto err; - } - memset(bus, 0, sizeof(*bus)); - spin_lock_init(&bus->mii_lock); - bus->bus_info = bi; - bus->refs = 0; - bus->usage_map = 0; - - /* perform initialization */ - switch (bi->method) { - - case fsmii_fixed: - ret = fs_mii_fixed_init(bus); - if (ret != 0) - goto err; - break; - - case fsmii_bitbang: - ret = fs_mii_bitbang_init(bus); - if (ret != 0) - goto err; - break; -#ifdef CONFIG_FS_ENET_HAS_FEC - case fsmii_fec: - ret = fs_mii_fec_init(bus); - if (ret != 0) - goto err; - break; -#endif - default: - ret = -EINVAL; - goto err; - } - - list_add(&bus->list, &fs_mii_bus_list); - - return bus; - -err: - if (bus) - kfree(bus); - return ERR_PTR(ret); -} - -static void destroy_bus(struct fs_enet_mii_bus *bus) -{ - /* remove from bus list */ - list_del(&bus->list); - - /* nothing more needed */ - kfree(bus); -} - -int fs_mii_connect(struct net_device *dev) -{ - struct fs_enet_private *fep = netdev_priv(dev); - const struct fs_platform_info *fpi = fep->fpi; - struct fs_enet_mii_bus *bus = NULL; - - /* check method validity */ - switch (fpi->bus_info->method) { - case fsmii_fixed: - case fsmii_bitbang: - break; -#ifdef CONFIG_FS_ENET_HAS_FEC - case fsmii_fec: - break; -#endif - default: - printk(KERN_ERR DRV_MODULE_NAME - ": %s Unknown MII bus method (%d)!\n", - dev->name, fpi->bus_info->method); - return -EINVAL; - } - - bus = lookup_bus(fpi->bus_info->method, fpi->bus_info->id); - - /* if not found create new bus */ - if (bus == NULL) { - bus = create_bus(fpi->bus_info); - if (IS_ERR(bus)) { - printk(KERN_ERR DRV_MODULE_NAME - ": %s MII bus creation failure!\n", dev->name); - return PTR_ERR(bus); - } - } - - bus->refs++; - - fep->mii_bus = bus; - - fep->mii_if.dev = dev; - fep->mii_if.phy_id_mask = 0x1f; - fep->mii_if.reg_num_mask = 0x1f; - fep->mii_if.mdio_read = fs_mii_read; - fep->mii_if.mdio_write = fs_mii_write; - fep->mii_if.force_media = fpi->bus_info->disable_aneg; - fep->mii_if.phy_id = phy_id_detect(dev); - - return 0; -} - -void fs_mii_disconnect(struct net_device *dev) -{ - struct fs_enet_private *fep = netdev_priv(dev); - struct fs_enet_mii_bus *bus = NULL; - - bus = fep->mii_bus; - fep->mii_bus = NULL; - - if (--bus->refs <= 0) - destroy_bus(bus); -} diff --git a/drivers/net/fs_enet/fs_enet.h b/drivers/net/fs_enet/fs_enet.h index e7ec96c96..95022c005 100644 --- a/drivers/net/fs_enet/fs_enet.h +++ b/drivers/net/fs_enet/fs_enet.h @@ -5,6 +5,7 @@ #include #include #include +#include #include @@ -12,12 +13,30 @@ #ifdef CONFIG_CPM1 #include + +struct fec_info { + fec_t* fecp; + u32 mii_speed; +}; #endif #ifdef CONFIG_CPM2 #include #endif +/* This is used to operate with pins. + Note that the actual port size may + be different; cpm(s) handle it OK */ +struct bb_info { + u8 mdio_dat_msk; + u8 mdio_dir_msk; + u8 *mdio_dir; + u8 *mdio_dat; + u8 mdc_msk; + u8 *mdc_dat; + int delay; +}; + /* hw driver ops */ struct fs_ops { int (*setup_data)(struct net_device *dev); @@ -25,6 +44,7 @@ struct fs_ops { void (*free_bd)(struct net_device *dev); void (*cleanup_data)(struct net_device *dev); void (*set_multicast_list)(struct net_device *dev); + void (*adjust_link)(struct net_device *dev); void (*restart)(struct net_device *dev); void (*stop)(struct net_device *dev); void (*pre_request_irq)(struct net_device *dev, int irq); @@ -100,10 +120,6 @@ struct fs_enet_mii_bus { }; }; -int fs_mii_bitbang_init(struct fs_enet_mii_bus *bus); -int fs_mii_fixed_init(struct fs_enet_mii_bus *bus); -int fs_mii_fec_init(struct fs_enet_mii_bus *bus); - struct fs_enet_private { struct device *dev; /* pointer back to the device (must be initialized first) */ spinlock_t lock; /* during all ops except TX pckt processing */ @@ -130,7 +146,8 @@ struct fs_enet_private { struct fs_enet_mii_bus *mii_bus; int interrupt; - int duplex, speed; /* current settings */ + struct phy_device *phydev; + int oldduplex, oldspeed, oldlink; /* current settings */ /* event masks */ u32 ev_napi_rx; /* mask of NAPI rx events */ @@ -168,15 +185,9 @@ struct fs_enet_private { }; /***************************************************************************/ - -int fs_mii_read(struct net_device *dev, int phy_id, int location); -void fs_mii_write(struct net_device *dev, int phy_id, int location, int value); - -void fs_mii_startup(struct net_device *dev); -void fs_mii_shutdown(struct net_device *dev); -void fs_mii_ack_int(struct net_device *dev); - -void fs_mii_link_status_change_check(struct net_device *dev, int init_media); +int fs_enet_mdio_bb_init(void); +int fs_mii_fixed_init(struct fs_enet_mii_bus *bus); +int fs_enet_mdio_fec_init(void); void fs_init_bds(struct net_device *dev); void fs_cleanup_bds(struct net_device *dev); @@ -194,7 +205,6 @@ int fs_enet_platform_init(void); void fs_enet_platform_cleanup(void); /***************************************************************************/ - /* buffer descriptor access macros */ /* access macros */ diff --git a/drivers/net/fs_enet/mac-fcc.c b/drivers/net/fs_enet/mac-fcc.c index 95e2bb8dd..1ff2597b8 100644 --- a/drivers/net/fs_enet/mac-fcc.c +++ b/drivers/net/fs_enet/mac-fcc.c @@ -12,7 +12,6 @@ * kind, whether express or implied. */ -#include #include #include #include @@ -35,6 +34,7 @@ #include #include #include +#include #include #include @@ -123,22 +123,32 @@ static int do_pd_setup(struct fs_enet_private *fep) /* Attach the memory for the FCC Parameter RAM */ r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "fcc_pram"); - fep->fcc.ep = (void *)r->start; - + fep->fcc.ep = (void *)ioremap(r->start, r->end - r->start + 1); if (fep->fcc.ep == NULL) return -EINVAL; r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "fcc_regs"); - fep->fcc.fccp = (void *)r->start; - + fep->fcc.fccp = (void *)ioremap(r->start, r->end - r->start + 1); if (fep->fcc.fccp == NULL) return -EINVAL; - fep->fcc.fcccp = (void *)fep->fpi->fcc_regs_c; + if (fep->fpi->fcc_regs_c) { + + fep->fcc.fcccp = (void *)fep->fpi->fcc_regs_c; + } else { + r = platform_get_resource_byname(pdev, IORESOURCE_MEM, + "fcc_regs_c"); + fep->fcc.fcccp = (void *)ioremap(r->start, + r->end - r->start + 1); + } if (fep->fcc.fcccp == NULL) return -EINVAL; + fep->fcc.mem = (void *)fep->fpi->mem_offset; + if (fep->fcc.mem == NULL) + return -EINVAL; + return 0; } @@ -156,8 +166,6 @@ static int setup_data(struct net_device *dev) if ((unsigned int)fep->fcc.idx >= 3) /* max 3 FCCs */ return -EINVAL; - fep->fcc.mem = (void *)fpi->mem_offset; - if (do_pd_setup(fep) != 0) return -EINVAL; @@ -395,7 +403,7 @@ static void restart(struct net_device *dev) /* adjust to speed (for RMII mode) */ if (fpi->use_rmii) { - if (fep->speed == 100) + if (fep->phydev->speed == 100) C8(fcccp, fcc_gfemr, 0x20); else S8(fcccp, fcc_gfemr, 0x20); @@ -421,7 +429,7 @@ static void restart(struct net_device *dev) S32(fccp, fcc_fpsmr, FCC_PSMR_RMII); /* adjust to duplex mode */ - if (fep->duplex) + if (fep->phydev->duplex) S32(fccp, fcc_fpsmr, FCC_PSMR_FDE | FCC_PSMR_LPB); else C32(fccp, fcc_fpsmr, FCC_PSMR_FDE | FCC_PSMR_LPB); @@ -487,7 +495,10 @@ static void rx_bd_done(struct net_device *dev) static void tx_kickstart(struct net_device *dev) { - /* nothing */ + struct fs_enet_private *fep = netdev_priv(dev); + fcc_t *fccp = fep->fcc.fccp; + + S32(fccp, fcc_ftodr, 0x80); } static u32 get_int_events(struct net_device *dev) diff --git a/drivers/net/fs_enet/mac-fec.c b/drivers/net/fs_enet/mac-fec.c index 3dad69dfd..c2c5fd419 100644 --- a/drivers/net/fs_enet/mac-fec.c +++ b/drivers/net/fs_enet/mac-fec.c @@ -12,7 +12,6 @@ * kind, whether express or implied. */ -#include #include #include #include @@ -47,6 +46,7 @@ #endif #include "fs_enet.h" +#include "fec.h" /*************************************************/ @@ -76,50 +76,8 @@ /* clear bits */ #define FC(_fecp, _reg, _v) FW(_fecp, _reg, FR(_fecp, _reg) & ~(_v)) - -/* CRC polynomium used by the FEC for the multicast group filtering */ -#define FEC_CRC_POLY 0x04C11DB7 - -#define FEC_MAX_MULTICAST_ADDRS 64 - -/* Interrupt events/masks. -*/ -#define FEC_ENET_HBERR 0x80000000U /* Heartbeat error */ -#define FEC_ENET_BABR 0x40000000U /* Babbling receiver */ -#define FEC_ENET_BABT 0x20000000U /* Babbling transmitter */ -#define FEC_ENET_GRA 0x10000000U /* Graceful stop complete */ -#define FEC_ENET_TXF 0x08000000U /* Full frame transmitted */ -#define FEC_ENET_TXB 0x04000000U /* A buffer was transmitted */ -#define FEC_ENET_RXF 0x02000000U /* Full frame received */ -#define FEC_ENET_RXB 0x01000000U /* A buffer was received */ -#define FEC_ENET_MII 0x00800000U /* MII interrupt */ -#define FEC_ENET_EBERR 0x00400000U /* SDMA bus error */ - -#define FEC_ECNTRL_PINMUX 0x00000004 -#define FEC_ECNTRL_ETHER_EN 0x00000002 -#define FEC_ECNTRL_RESET 0x00000001 - -#define FEC_RCNTRL_BC_REJ 0x00000010 -#define FEC_RCNTRL_PROM 0x00000008 -#define FEC_RCNTRL_MII_MODE 0x00000004 -#define FEC_RCNTRL_DRT 0x00000002 -#define FEC_RCNTRL_LOOP 0x00000001 - -#define FEC_TCNTRL_FDEN 0x00000004 -#define FEC_TCNTRL_HBC 0x00000002 -#define FEC_TCNTRL_GTS 0x00000001 - - -/* Make MII read/write commands for the FEC. -*/ -#define mk_mii_read(REG) (0x60020000 | ((REG & 0x1f) << 18)) -#define mk_mii_write(REG, VAL) (0x50020000 | ((REG & 0x1f) << 18) | (VAL & 0xffff)) -#define mk_mii_end 0 - -#define FEC_MII_LOOPS 10000 - /* - * Delay to wait for FEC reset command to complete (in us) + * Delay to wait for FEC reset command to complete (in us) */ #define FEC_RESET_DELAY 50 @@ -304,13 +262,15 @@ static void restart(struct net_device *dev) int r; u32 addrhi, addrlo; + struct mii_bus* mii = fep->phydev->bus; + struct fec_info* fec_inf = mii->priv; + r = whack_reset(fep->fec.fecp); if (r != 0) printk(KERN_ERR DRV_MODULE_NAME ": %s FEC Reset FAILED!\n", dev->name); - /* - * Set station address. + * Set station address. */ addrhi = ((u32) dev->dev_addr[0] << 24) | ((u32) dev->dev_addr[1] << 16) | @@ -351,12 +311,12 @@ static void restart(struct net_device *dev) FW(fecp, fun_code, 0x78000000); /* - * Set MII speed. + * Set MII speed. */ - FW(fecp, mii_speed, fep->mii_bus->fec.mii_speed); + FW(fecp, mii_speed, fec_inf->mii_speed); /* - * Clear any outstanding interrupt. + * Clear any outstanding interrupt. */ FW(fecp, ievent, 0xffc0); FW(fecp, ivec, (fep->interrupt / 2) << 29); @@ -391,11 +351,12 @@ static void restart(struct net_device *dev) } #endif + FW(fecp, r_cntrl, FEC_RCNTRL_MII_MODE); /* MII enable */ /* - * adjust to duplex mode + * adjust to duplex mode */ - if (fep->duplex) { + if (fep->phydev->duplex) { FC(fecp, r_cntrl, FEC_RCNTRL_DRT); FS(fecp, x_cntrl, FEC_TCNTRL_FDEN); /* FD enable */ } else { @@ -419,9 +380,11 @@ static void restart(struct net_device *dev) static void stop(struct net_device *dev) { struct fs_enet_private *fep = netdev_priv(dev); + const struct fs_platform_info *fpi = fep->fpi; fec_t *fecp = fep->fec.fecp; - struct fs_enet_mii_bus *bus = fep->mii_bus; - const struct fs_mii_bus_info *bi = bus->bus_info; + + struct fec_info* feci= fep->phydev->bus->priv; + int i; if ((FR(fecp, ecntrl) & FEC_ECNTRL_ETHER_EN) == 0) @@ -445,11 +408,11 @@ static void stop(struct net_device *dev) fs_cleanup_bds(dev); /* shut down FEC1? that's where the mii bus is */ - if (fep->fec.idx == 0 && bus->refs > 1 && bi->method == fsmii_fec) { + if (fpi->has_phy) { FS(fecp, r_cntrl, FEC_RCNTRL_MII_MODE); /* MII enable */ FS(fecp, ecntrl, FEC_ECNTRL_PINMUX | FEC_ECNTRL_ETHER_EN); FW(fecp, ievent, FEC_ENET_MII); - FW(fecp, mii_speed, bus->fec.mii_speed); + FW(fecp, mii_speed, feci->mii_speed); } } @@ -584,73 +547,3 @@ const struct fs_ops fs_fec_ops = { .free_bd = free_bd, }; -/***********************************************************************/ - -static int mii_read(struct fs_enet_mii_bus *bus, int phy_id, int location) -{ - fec_t *fecp = bus->fec.fecp; - int i, ret = -1; - - if ((FR(fecp, r_cntrl) & FEC_RCNTRL_MII_MODE) == 0) - BUG(); - - /* Add PHY address to register command. */ - FW(fecp, mii_data, (phy_id << 23) | mk_mii_read(location)); - - for (i = 0; i < FEC_MII_LOOPS; i++) - if ((FR(fecp, ievent) & FEC_ENET_MII) != 0) - break; - - if (i < FEC_MII_LOOPS) { - FW(fecp, ievent, FEC_ENET_MII); - ret = FR(fecp, mii_data) & 0xffff; - } - - return ret; -} - -static void mii_write(struct fs_enet_mii_bus *bus, int phy_id, int location, int value) -{ - fec_t *fecp = bus->fec.fecp; - int i; - - /* this must never happen */ - if ((FR(fecp, r_cntrl) & FEC_RCNTRL_MII_MODE) == 0) - BUG(); - - /* Add PHY address to register command. */ - FW(fecp, mii_data, (phy_id << 23) | mk_mii_write(location, value)); - - for (i = 0; i < FEC_MII_LOOPS; i++) - if ((FR(fecp, ievent) & FEC_ENET_MII) != 0) - break; - - if (i < FEC_MII_LOOPS) - FW(fecp, ievent, FEC_ENET_MII); -} - -int fs_mii_fec_init(struct fs_enet_mii_bus *bus) -{ - bd_t *bd = (bd_t *)__res; - const struct fs_mii_bus_info *bi = bus->bus_info; - fec_t *fecp; - - if (bi->id != 0) - return -1; - - bus->fec.fecp = &((immap_t *)fs_enet_immap)->im_cpm.cp_fec; - bus->fec.mii_speed = ((((bd->bi_intfreq + 4999999) / 2500000) / 2) - & 0x3F) << 1; - - fecp = bus->fec.fecp; - - FS(fecp, r_cntrl, FEC_RCNTRL_MII_MODE); /* MII enable */ - FS(fecp, ecntrl, FEC_ECNTRL_PINMUX | FEC_ECNTRL_ETHER_EN); - FW(fecp, ievent, FEC_ENET_MII); - FW(fecp, mii_speed, bus->fec.mii_speed); - - bus->mii_read = mii_read; - bus->mii_write = mii_write; - - return 0; -} diff --git a/drivers/net/fs_enet/mac-scc.c b/drivers/net/fs_enet/mac-scc.c index a772b286f..95ec5872c 100644 --- a/drivers/net/fs_enet/mac-scc.c +++ b/drivers/net/fs_enet/mac-scc.c @@ -12,7 +12,6 @@ * kind, whether express or implied. */ -#include #include #include #include @@ -370,7 +369,7 @@ static void restart(struct net_device *dev) W16(sccp, scc_psmr, SCC_PSMR_ENCRC | SCC_PSMR_NIB22); /* Set full duplex mode if needed */ - if (fep->duplex) + if (fep->phydev->duplex) S16(sccp, scc_psmr, SCC_PSMR_LPB | SCC_PSMR_FDE); S32(sccp, scc_gsmrl, SCC_GSMRL_ENR | SCC_GSMRL_ENT); @@ -501,6 +500,8 @@ static void tx_restart(struct net_device *dev) scc_cr_cmd(fep, CPM_CR_RESTART_TX); } + + /*************************************************************************/ const struct fs_ops fs_scc_ops = { diff --git a/drivers/net/fs_enet/mii-bitbang.c b/drivers/net/fs_enet/mii-bitbang.c index 24a5e2e23..0b9b8b5c8 100644 --- a/drivers/net/fs_enet/mii-bitbang.c +++ b/drivers/net/fs_enet/mii-bitbang.c @@ -13,7 +13,6 @@ */ -#include #include #include #include @@ -34,6 +33,7 @@ #include #include #include +#include #include #include @@ -41,129 +41,25 @@ #include "fs_enet.h" -#ifdef CONFIG_8xx -static int bitbang_prep_bit(u8 **dirp, u8 **datp, u8 *mskp, int port, int bit) +static int bitbang_prep_bit(u8 **datp, u8 *mskp, + struct fs_mii_bit *mii_bit) { - immap_t *im = (immap_t *)fs_enet_immap; - void *dir, *dat, *ppar; + void *dat; int adv; u8 msk; - switch (port) { - case fsiop_porta: - dir = &im->im_ioport.iop_padir; - dat = &im->im_ioport.iop_padat; - ppar = &im->im_ioport.iop_papar; - break; - - case fsiop_portb: - dir = &im->im_cpm.cp_pbdir; - dat = &im->im_cpm.cp_pbdat; - ppar = &im->im_cpm.cp_pbpar; - break; - - case fsiop_portc: - dir = &im->im_ioport.iop_pcdir; - dat = &im->im_ioport.iop_pcdat; - ppar = &im->im_ioport.iop_pcpar; - break; - - case fsiop_portd: - dir = &im->im_ioport.iop_pddir; - dat = &im->im_ioport.iop_pddat; - ppar = &im->im_ioport.iop_pdpar; - break; - - case fsiop_porte: - dir = &im->im_cpm.cp_pedir; - dat = &im->im_cpm.cp_pedat; - ppar = &im->im_cpm.cp_pepar; - break; - - default: - printk(KERN_ERR DRV_MODULE_NAME - "Illegal port value %d!\n", port); - return -EINVAL; - } - - adv = bit >> 3; - dir = (char *)dir + adv; - dat = (char *)dat + adv; - ppar = (char *)ppar + adv; - - msk = 1 << (7 - (bit & 7)); - if ((in_8(ppar) & msk) != 0) { - printk(KERN_ERR DRV_MODULE_NAME - "pin %d on port %d is not general purpose!\n", bit, port); - return -EINVAL; - } - - *dirp = dir; - *datp = dat; - *mskp = msk; - - return 0; -} -#endif - -#ifdef CONFIG_8260 -static int bitbang_prep_bit(u8 **dirp, u8 **datp, u8 *mskp, int port, int bit) -{ - iop_cpm2_t *io = &((cpm2_map_t *)fs_enet_immap)->im_ioport; - void *dir, *dat, *ppar; - int adv; - u8 msk; - - switch (port) { - case fsiop_porta: - dir = &io->iop_pdira; - dat = &io->iop_pdata; - ppar = &io->iop_ppara; - break; - - case fsiop_portb: - dir = &io->iop_pdirb; - dat = &io->iop_pdatb; - ppar = &io->iop_pparb; - break; - - case fsiop_portc: - dir = &io->iop_pdirc; - dat = &io->iop_pdatc; - ppar = &io->iop_pparc; - break; - - case fsiop_portd: - dir = &io->iop_pdird; - dat = &io->iop_pdatd; - ppar = &io->iop_ppard; - break; - - default: - printk(KERN_ERR DRV_MODULE_NAME - "Illegal port value %d!\n", port); - return -EINVAL; - } + dat = (void*) mii_bit->offset; - adv = bit >> 3; - dir = (char *)dir + adv; + adv = mii_bit->bit >> 3; dat = (char *)dat + adv; - ppar = (char *)ppar + adv; - msk = 1 << (7 - (bit & 7)); - if ((in_8(ppar) & msk) != 0) { - printk(KERN_ERR DRV_MODULE_NAME - "pin %d on port %d is not general purpose!\n", bit, port); - return -EINVAL; - } + msk = 1 << (7 - (mii_bit->bit & 7)); - *dirp = dir; *datp = dat; *mskp = msk; return 0; } -#endif static inline void bb_set(u8 *p, u8 m) { @@ -180,44 +76,44 @@ static inline int bb_read(u8 *p, u8 m) return (in_8(p) & m) != 0; } -static inline void mdio_active(struct fs_enet_mii_bus *bus) +static inline void mdio_active(struct bb_info *bitbang) { - bb_set(bus->bitbang.mdio_dir, bus->bitbang.mdio_msk); + bb_set(bitbang->mdio_dir, bitbang->mdio_dir_msk); } -static inline void mdio_tristate(struct fs_enet_mii_bus *bus) +static inline void mdio_tristate(struct bb_info *bitbang ) { - bb_clr(bus->bitbang.mdio_dir, bus->bitbang.mdio_msk); + bb_clr(bitbang->mdio_dir, bitbang->mdio_dir_msk); } -static inline int mdio_read(struct fs_enet_mii_bus *bus) +static inline int mdio_read(struct bb_info *bitbang ) { - return bb_read(bus->bitbang.mdio_dat, bus->bitbang.mdio_msk); + return bb_read(bitbang->mdio_dat, bitbang->mdio_dat_msk); } -static inline void mdio(struct fs_enet_mii_bus *bus, int what) +static inline void mdio(struct bb_info *bitbang , int what) { if (what) - bb_set(bus->bitbang.mdio_dat, bus->bitbang.mdio_msk); + bb_set(bitbang->mdio_dat, bitbang->mdio_dat_msk); else - bb_clr(bus->bitbang.mdio_dat, bus->bitbang.mdio_msk); + bb_clr(bitbang->mdio_dat, bitbang->mdio_dat_msk); } -static inline void mdc(struct fs_enet_mii_bus *bus, int what) +static inline void mdc(struct bb_info *bitbang , int what) { if (what) - bb_set(bus->bitbang.mdc_dat, bus->bitbang.mdc_msk); + bb_set(bitbang->mdc_dat, bitbang->mdc_msk); else - bb_clr(bus->bitbang.mdc_dat, bus->bitbang.mdc_msk); + bb_clr(bitbang->mdc_dat, bitbang->mdc_msk); } -static inline void mii_delay(struct fs_enet_mii_bus *bus) +static inline void mii_delay(struct bb_info *bitbang ) { - udelay(bus->bus_info->i.bitbang.delay); + udelay(bitbang->delay); } /* Utility to send the preamble, address, and register (common to read and write). */ -static void bitbang_pre(struct fs_enet_mii_bus *bus, int read, u8 addr, u8 reg) +static void bitbang_pre(struct bb_info *bitbang , int read, u8 addr, u8 reg) { int j; @@ -229,177 +125,284 @@ static void bitbang_pre(struct fs_enet_mii_bus *bus, int read, u8 addr, u8 reg) * but it is safer and will be much more robust. */ - mdio_active(bus); - mdio(bus, 1); + mdio_active(bitbang); + mdio(bitbang, 1); for (j = 0; j < 32; j++) { - mdc(bus, 0); - mii_delay(bus); - mdc(bus, 1); - mii_delay(bus); + mdc(bitbang, 0); + mii_delay(bitbang); + mdc(bitbang, 1); + mii_delay(bitbang); } /* send the start bit (01) and the read opcode (10) or write (10) */ - mdc(bus, 0); - mdio(bus, 0); - mii_delay(bus); - mdc(bus, 1); - mii_delay(bus); - mdc(bus, 0); - mdio(bus, 1); - mii_delay(bus); - mdc(bus, 1); - mii_delay(bus); - mdc(bus, 0); - mdio(bus, read); - mii_delay(bus); - mdc(bus, 1); - mii_delay(bus); - mdc(bus, 0); - mdio(bus, !read); - mii_delay(bus); - mdc(bus, 1); - mii_delay(bus); + mdc(bitbang, 0); + mdio(bitbang, 0); + mii_delay(bitbang); + mdc(bitbang, 1); + mii_delay(bitbang); + mdc(bitbang, 0); + mdio(bitbang, 1); + mii_delay(bitbang); + mdc(bitbang, 1); + mii_delay(bitbang); + mdc(bitbang, 0); + mdio(bitbang, read); + mii_delay(bitbang); + mdc(bitbang, 1); + mii_delay(bitbang); + mdc(bitbang, 0); + mdio(bitbang, !read); + mii_delay(bitbang); + mdc(bitbang, 1); + mii_delay(bitbang); /* send the PHY address */ for (j = 0; j < 5; j++) { - mdc(bus, 0); - mdio(bus, (addr & 0x10) != 0); - mii_delay(bus); - mdc(bus, 1); - mii_delay(bus); + mdc(bitbang, 0); + mdio(bitbang, (addr & 0x10) != 0); + mii_delay(bitbang); + mdc(bitbang, 1); + mii_delay(bitbang); addr <<= 1; } /* send the register address */ for (j = 0; j < 5; j++) { - mdc(bus, 0); - mdio(bus, (reg & 0x10) != 0); - mii_delay(bus); - mdc(bus, 1); - mii_delay(bus); + mdc(bitbang, 0); + mdio(bitbang, (reg & 0x10) != 0); + mii_delay(bitbang); + mdc(bitbang, 1); + mii_delay(bitbang); reg <<= 1; } } -static int mii_read(struct fs_enet_mii_bus *bus, int phy_id, int location) +static int fs_enet_mii_bb_read(struct mii_bus *bus , int phy_id, int location) { u16 rdreg; int ret, j; u8 addr = phy_id & 0xff; u8 reg = location & 0xff; + struct bb_info* bitbang = bus->priv; - bitbang_pre(bus, 1, addr, reg); + bitbang_pre(bitbang, 1, addr, reg); /* tri-state our MDIO I/O pin so we can read */ - mdc(bus, 0); - mdio_tristate(bus); - mii_delay(bus); - mdc(bus, 1); - mii_delay(bus); + mdc(bitbang, 0); + mdio_tristate(bitbang); + mii_delay(bitbang); + mdc(bitbang, 1); + mii_delay(bitbang); /* check the turnaround bit: the PHY should be driving it to zero */ - if (mdio_read(bus) != 0) { + if (mdio_read(bitbang) != 0) { /* PHY didn't drive TA low */ for (j = 0; j < 32; j++) { - mdc(bus, 0); - mii_delay(bus); - mdc(bus, 1); - mii_delay(bus); + mdc(bitbang, 0); + mii_delay(bitbang); + mdc(bitbang, 1); + mii_delay(bitbang); } ret = -1; goto out; } - mdc(bus, 0); - mii_delay(bus); + mdc(bitbang, 0); + mii_delay(bitbang); /* read 16 bits of register data, MSB first */ rdreg = 0; for (j = 0; j < 16; j++) { - mdc(bus, 1); - mii_delay(bus); + mdc(bitbang, 1); + mii_delay(bitbang); rdreg <<= 1; - rdreg |= mdio_read(bus); - mdc(bus, 0); - mii_delay(bus); + rdreg |= mdio_read(bitbang); + mdc(bitbang, 0); + mii_delay(bitbang); } - mdc(bus, 1); - mii_delay(bus); - mdc(bus, 0); - mii_delay(bus); - mdc(bus, 1); - mii_delay(bus); + mdc(bitbang, 1); + mii_delay(bitbang); + mdc(bitbang, 0); + mii_delay(bitbang); + mdc(bitbang, 1); + mii_delay(bitbang); ret = rdreg; out: return ret; } -static void mii_write(struct fs_enet_mii_bus *bus, int phy_id, int location, int val) +static int fs_enet_mii_bb_write(struct mii_bus *bus, int phy_id, int location, u16 val) { int j; + struct bb_info* bitbang = bus->priv; + u8 addr = phy_id & 0xff; u8 reg = location & 0xff; u16 value = val & 0xffff; - bitbang_pre(bus, 0, addr, reg); + bitbang_pre(bitbang, 0, addr, reg); /* send the turnaround (10) */ - mdc(bus, 0); - mdio(bus, 1); - mii_delay(bus); - mdc(bus, 1); - mii_delay(bus); - mdc(bus, 0); - mdio(bus, 0); - mii_delay(bus); - mdc(bus, 1); - mii_delay(bus); + mdc(bitbang, 0); + mdio(bitbang, 1); + mii_delay(bitbang); + mdc(bitbang, 1); + mii_delay(bitbang); + mdc(bitbang, 0); + mdio(bitbang, 0); + mii_delay(bitbang); + mdc(bitbang, 1); + mii_delay(bitbang); /* write 16 bits of register data, MSB first */ for (j = 0; j < 16; j++) { - mdc(bus, 0); - mdio(bus, (value & 0x8000) != 0); - mii_delay(bus); - mdc(bus, 1); - mii_delay(bus); + mdc(bitbang, 0); + mdio(bitbang, (value & 0x8000) != 0); + mii_delay(bitbang); + mdc(bitbang, 1); + mii_delay(bitbang); value <<= 1; } /* * Tri-state the MDIO line. */ - mdio_tristate(bus); - mdc(bus, 0); - mii_delay(bus); - mdc(bus, 1); - mii_delay(bus); + mdio_tristate(bitbang); + mdc(bitbang, 0); + mii_delay(bitbang); + mdc(bitbang, 1); + mii_delay(bitbang); + return 0; } -int fs_mii_bitbang_init(struct fs_enet_mii_bus *bus) +static int fs_enet_mii_bb_reset(struct mii_bus *bus) +{ + /*nothing here - dunno how to reset it*/ + return 0; +} + +static int fs_mii_bitbang_init(struct bb_info *bitbang, struct fs_mii_bb_platform_info* fmpi) { - const struct fs_mii_bus_info *bi = bus->bus_info; int r; - r = bitbang_prep_bit(&bus->bitbang.mdio_dir, - &bus->bitbang.mdio_dat, - &bus->bitbang.mdio_msk, - bi->i.bitbang.mdio_port, - bi->i.bitbang.mdio_bit); + bitbang->delay = fmpi->delay; + + r = bitbang_prep_bit(&bitbang->mdio_dir, + &bitbang->mdio_dir_msk, + &fmpi->mdio_dir); if (r != 0) return r; - r = bitbang_prep_bit(&bus->bitbang.mdc_dir, - &bus->bitbang.mdc_dat, - &bus->bitbang.mdc_msk, - bi->i.bitbang.mdc_port, - bi->i.bitbang.mdc_bit); + r = bitbang_prep_bit(&bitbang->mdio_dat, + &bitbang->mdio_dat_msk, + &fmpi->mdio_dat); if (r != 0) return r; - bus->mii_read = mii_read; - bus->mii_write = mii_write; + r = bitbang_prep_bit(&bitbang->mdc_dat, + &bitbang->mdc_msk, + &fmpi->mdc_dat); + if (r != 0) + return r; return 0; } + + +static int __devinit fs_enet_mdio_probe(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct fs_mii_bb_platform_info *pdata; + struct mii_bus *new_bus; + struct bb_info *bitbang; + int err = 0; + + if (NULL == dev) + return -EINVAL; + + new_bus = kzalloc(sizeof(struct mii_bus), GFP_KERNEL); + + if (NULL == new_bus) + return -ENOMEM; + + bitbang = kzalloc(sizeof(struct bb_info), GFP_KERNEL); + + if (NULL == bitbang) + return -ENOMEM; + + new_bus->name = "BB MII Bus", + new_bus->read = &fs_enet_mii_bb_read, + new_bus->write = &fs_enet_mii_bb_write, + new_bus->reset = &fs_enet_mii_bb_reset, + new_bus->id = pdev->id; + + new_bus->phy_mask = ~0x9; + pdata = (struct fs_mii_bb_platform_info *)pdev->dev.platform_data; + + if (NULL == pdata) { + printk(KERN_ERR "gfar mdio %d: Missing platform data!\n", pdev->id); + return -ENODEV; + } + + /*set up workspace*/ + fs_mii_bitbang_init(bitbang, pdata); + + new_bus->priv = bitbang; + + new_bus->irq = pdata->irq; + + new_bus->dev = dev; + dev_set_drvdata(dev, new_bus); + + err = mdiobus_register(new_bus); + + if (0 != err) { + printk (KERN_ERR "%s: Cannot register as MDIO bus\n", + new_bus->name); + goto bus_register_fail; + } + + return 0; + +bus_register_fail: + kfree(bitbang); + kfree(new_bus); + + return err; +} + + +static int fs_enet_mdio_remove(struct device *dev) +{ + struct mii_bus *bus = dev_get_drvdata(dev); + + mdiobus_unregister(bus); + + dev_set_drvdata(dev, NULL); + + iounmap((void *) (&bus->priv)); + bus->priv = NULL; + kfree(bus); + + return 0; +} + +static struct device_driver fs_enet_bb_mdio_driver = { + .name = "fsl-bb-mdio", + .bus = &platform_bus_type, + .probe = fs_enet_mdio_probe, + .remove = fs_enet_mdio_remove, +}; + +int fs_enet_mdio_bb_init(void) +{ + return driver_register(&fs_enet_bb_mdio_driver); +} + +void fs_enet_mdio_bb_exit(void) +{ + driver_unregister(&fs_enet_bb_mdio_driver); +} + diff --git a/drivers/net/fs_enet/mii-fixed.c b/drivers/net/fs_enet/mii-fixed.c deleted file mode 100644 index b3e192d61..000000000 --- a/drivers/net/fs_enet/mii-fixed.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Combined Ethernet driver for Motorola MPC8xx and MPC82xx. - * - * Copyright (c) 2003 Intracom S.A. - * by Pantelis Antoniou - * - * 2005 (c) MontaVista Software, Inc. - * Vitaly Bordug - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "fs_enet.h" - -static const u16 mii_regs[7] = { - 0x3100, - 0x786d, - 0x0fff, - 0x0fff, - 0x01e1, - 0x45e1, - 0x0003, -}; - -static int mii_read(struct fs_enet_mii_bus *bus, int phy_id, int location) -{ - int ret = 0; - - if ((unsigned int)location >= ARRAY_SIZE(mii_regs)) - return -1; - - if (location != 5) - ret = mii_regs[location]; - else - ret = bus->fixed.lpa; - - return ret; -} - -static void mii_write(struct fs_enet_mii_bus *bus, int phy_id, int location, int val) -{ - /* do nothing */ -} - -int fs_mii_fixed_init(struct fs_enet_mii_bus *bus) -{ - const struct fs_mii_bus_info *bi = bus->bus_info; - - bus->fixed.lpa = 0x45e1; /* default 100Mb, full duplex */ - - /* if speed is fixed at 10Mb, remove 100Mb modes */ - if (bi->i.fixed.speed == 10) - bus->fixed.lpa &= ~LPA_100; - - /* if duplex is half, remove full duplex modes */ - if (bi->i.fixed.duplex == 0) - bus->fixed.lpa &= ~LPA_DUPLEX; - - bus->mii_read = mii_read; - bus->mii_write = mii_write; - - return 0; -} diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index 218d31764..ebbbd6ca6 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c @@ -64,7 +64,6 @@ * The driver then cleans up the buffer. */ -#include #include #include #include diff --git a/drivers/net/gianfar.h b/drivers/net/gianfar.h index 127c98cf3..f87bbc408 100644 --- a/drivers/net/gianfar.h +++ b/drivers/net/gianfar.h @@ -22,7 +22,6 @@ #ifndef __GIANFAR_H #define __GIANFAR_H -#include #include #include #include diff --git a/drivers/net/gianfar_ethtool.c b/drivers/net/gianfar_ethtool.c index d69698c69..e0f505285 100644 --- a/drivers/net/gianfar_ethtool.c +++ b/drivers/net/gianfar_ethtool.c @@ -15,7 +15,6 @@ * by reference. */ -#include #include #include #include diff --git a/drivers/net/gianfar_mii.c b/drivers/net/gianfar_mii.c index c6b725529..c92e65984 100644 --- a/drivers/net/gianfar_mii.c +++ b/drivers/net/gianfar_mii.c @@ -16,7 +16,6 @@ * */ -#include #include #include #include diff --git a/drivers/net/gianfar_sysfs.c b/drivers/net/gianfar_sysfs.c index a6d5c4319..e8a18f18d 100644 --- a/drivers/net/gianfar_sysfs.c +++ b/drivers/net/gianfar_sysfs.c @@ -19,7 +19,6 @@ * Sysfs file creation and management */ -#include #include #include #include diff --git a/drivers/net/gt96100eth.c b/drivers/net/gt96100eth.c index 2d2435404..2b4db7414 100644 --- a/drivers/net/gt96100eth.c +++ b/drivers/net/gt96100eth.c @@ -699,7 +699,6 @@ static int __init gt96100_probe1(struct pci_dev *pci, int port_num) memset(gp, 0, sizeof(*gp)); // clear it gp->port_num = port_num; - gp->io_size = GT96100_ETH_IO_SIZE; gp->port_offset = port_num * GT96100_ETH_IO_SIZE; gp->phy_addr = phy_addr; gp->chip_rev = chip_rev; @@ -1030,7 +1029,7 @@ gt96100_open(struct net_device *dev) } if ((retval = request_irq(dev->irq, >96100_interrupt, - SA_SHIRQ, dev->name, dev))) { + IRQF_SHARED, dev->name, dev))) { err("unable to get IRQ %d\n", dev->irq); return retval; } @@ -1531,7 +1530,7 @@ static void gt96100_cleanup_module(void) + sizeof(gt96100_td_t) * TX_RING_SIZE, gp->rx_ring); free_netdev(gtif->dev); - release_region(gtif->iobase, gp->io_size); + release_region(gtif->iobase, GT96100_ETH_IO_SIZE); } } } diff --git a/drivers/net/gt96100eth.h b/drivers/net/gt96100eth.h index 395869c5e..3b62a87c7 100644 --- a/drivers/net/gt96100eth.h +++ b/drivers/net/gt96100eth.h @@ -27,7 +27,6 @@ #ifndef _GT96100ETH_H #define _GT96100ETH_H -#include #include #define dbg(lvl, format, arg...) \ @@ -332,7 +331,6 @@ struct gt96100_private { mib_counters_t mib; struct net_device_stats stats; - int io_size; int port_num; // 0 or 1 int chip_rev; u32 port_offset; @@ -341,7 +339,6 @@ struct gt96100_private { u32 last_psr; // last value of the port status register int options; /* User-settable misc. driver options. */ - int drv_flags; struct timer_list timer; spinlock_t lock; /* Serialise access to device */ }; diff --git a/drivers/net/hamachi.c b/drivers/net/hamachi.c index 0ea4cb4a0..409c6aab0 100644 --- a/drivers/net/hamachi.c +++ b/drivers/net/hamachi.c @@ -20,22 +20,15 @@ Support and updates available at http://www.scyld.com/network/hamachi.html + [link no longer provides useful info -jgarzik] or http://www.parl.clemson.edu/~keithu/hamachi.html - - - Linux kernel changelog: - - LK1.0.1: - - fix lack of pci_dev<->dev association - - ethtool support (jgarzik) - */ #define DRV_NAME "hamachi" -#define DRV_VERSION "1.01+LK1.0.1" -#define DRV_RELDATE "5/18/2001" +#define DRV_VERSION "2.0" +#define DRV_RELDATE "June 27, 2006" /* A few user-configurable values. */ @@ -608,7 +601,8 @@ static int __devinit hamachi_init_one (struct pci_dev *pdev, pci_set_master(pdev); i = pci_request_regions(pdev, DRV_NAME); - if (i) return i; + if (i) + return i; irq = pdev->irq; ioaddr = ioremap(base, 0x400); @@ -871,7 +865,7 @@ static int hamachi_open(struct net_device *dev) u32 rx_int_var, tx_int_var; u16 fifo_info; - i = request_irq(dev->irq, &hamachi_interrupt, SA_SHIRQ, dev->name, dev); + i = request_irq(dev->irq, &hamachi_interrupt, IRQF_SHARED, dev->name, dev); if (i) return i; diff --git a/drivers/net/hamradio/6pack.c b/drivers/net/hamradio/6pack.c index d12605f0a..86b3bb9be 100644 --- a/drivers/net/hamradio/6pack.c +++ b/drivers/net/hamradio/6pack.c @@ -12,7 +12,6 @@ * Fred N. van Kempen, */ -#include #include #include #include diff --git a/drivers/net/hamradio/baycom_ser_fdx.c b/drivers/net/hamradio/baycom_ser_fdx.c index 232793d2c..55906c7b4 100644 --- a/drivers/net/hamradio/baycom_ser_fdx.c +++ b/drivers/net/hamradio/baycom_ser_fdx.c @@ -434,7 +434,7 @@ static int ser12_open(struct net_device *dev) outb(0, FCR(dev->base_addr)); /* disable FIFOs */ outb(0x0d, MCR(dev->base_addr)); outb(0, IER(dev->base_addr)); - if (request_irq(dev->irq, ser12_interrupt, SA_INTERRUPT | SA_SHIRQ, + if (request_irq(dev->irq, ser12_interrupt, IRQF_DISABLED | IRQF_SHARED, "baycom_ser_fdx", dev)) { release_region(dev->base_addr, SER12_EXTENT); return -EBUSY; diff --git a/drivers/net/hamradio/baycom_ser_hdx.c b/drivers/net/hamradio/baycom_ser_hdx.c index be596a3eb..de95de898 100644 --- a/drivers/net/hamradio/baycom_ser_hdx.c +++ b/drivers/net/hamradio/baycom_ser_hdx.c @@ -488,7 +488,7 @@ static int ser12_open(struct net_device *dev) outb(0, FCR(dev->base_addr)); /* disable FIFOs */ outb(0x0d, MCR(dev->base_addr)); outb(0, IER(dev->base_addr)); - if (request_irq(dev->irq, ser12_interrupt, SA_INTERRUPT | SA_SHIRQ, + if (request_irq(dev->irq, ser12_interrupt, IRQF_DISABLED | IRQF_SHARED, "baycom_ser12", dev)) { release_region(dev->base_addr, SER12_EXTENT); return -EBUSY; diff --git a/drivers/net/hamradio/bpqether.c b/drivers/net/hamradio/bpqether.c index cb43a9d28..889f33813 100644 --- a/drivers/net/hamradio/bpqether.c +++ b/drivers/net/hamradio/bpqether.c @@ -54,7 +54,6 @@ * BPQ 004 Joerg(DL1BKE) Fixed to not lock up on ifconfig. */ -#include #include #include #include @@ -123,6 +122,12 @@ struct bpqdev { static LIST_HEAD(bpq_devices); +/* + * bpqether network devices are paired with ethernet devices below them, so + * form a special "super class" of normal ethernet devices; split their locks + * off into a separate class since they always nest. + */ +static struct lock_class_key bpq_netdev_xmit_lock_key; /* ------------------------------------------------------------------------ */ @@ -529,6 +534,7 @@ static int bpq_new_device(struct net_device *edev) err = register_netdevice(ndev); if (err) goto error; + lockdep_set_class(&ndev->_xmit_lock, &bpq_netdev_xmit_lock_key); /* List protected by RTNL */ list_add_rcu(&bpq->bpq_list, &bpq_devices); diff --git a/drivers/net/hamradio/dmascc.c b/drivers/net/hamradio/dmascc.c index 0d5fccc98..c9a46b899 100644 --- a/drivers/net/hamradio/dmascc.c +++ b/drivers/net/hamradio/dmascc.c @@ -436,7 +436,7 @@ static int __init dmascc_init(void) module_init(dmascc_init); module_exit(dmascc_exit); -static void dev_setup(struct net_device *dev) +static void __init dev_setup(struct net_device *dev) { dev->type = ARPHRD_AX25; dev->hard_header_len = AX25_MAX_HEADER_LEN; diff --git a/drivers/net/hamradio/mkiss.c b/drivers/net/hamradio/mkiss.c index 3ebbbe56b..d8715b200 100644 --- a/drivers/net/hamradio/mkiss.c +++ b/drivers/net/hamradio/mkiss.c @@ -16,7 +16,6 @@ * Copyright (C) 2004, 05 Ralf Baechle DL5RB * Copyright (C) 2004, 05 Thomas Osterried DL9SAU */ -#include #include #include #include diff --git a/drivers/net/hamradio/scc.c b/drivers/net/hamradio/scc.c index 5927784df..df4b68142 100644 --- a/drivers/net/hamradio/scc.c +++ b/drivers/net/hamradio/scc.c @@ -148,7 +148,6 @@ /* ----------------------------------------------------------------------- */ -#include #include #include #include @@ -1737,7 +1736,7 @@ static int scc_net_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) if (!Ivec[hwcfg.irq].used && hwcfg.irq) { - if (request_irq(hwcfg.irq, scc_isr, SA_INTERRUPT, "AX.25 SCC", NULL)) + if (request_irq(hwcfg.irq, scc_isr, IRQF_DISABLED, "AX.25 SCC", NULL)) printk(KERN_WARNING "z8530drv: warning, cannot get IRQ %d\n", hwcfg.irq); else Ivec[hwcfg.irq].used = 1; diff --git a/drivers/net/hamradio/yam.c b/drivers/net/hamradio/yam.c index b49884048..f98f5777d 100644 --- a/drivers/net/hamradio/yam.c +++ b/drivers/net/hamradio/yam.c @@ -42,7 +42,6 @@ /*****************************************************************************/ -#include #include #include #include @@ -874,7 +873,7 @@ static int yam_open(struct net_device *dev) goto out_release_base; } outb(0, IER(dev->base_addr)); - if (request_irq(dev->irq, yam_interrupt, SA_INTERRUPT | SA_SHIRQ, dev->name, dev)) { + if (request_irq(dev->irq, yam_interrupt, IRQF_DISABLED | IRQF_SHARED, dev->name, dev)) { printk(KERN_ERR "%s: irq %d busy\n", dev->name, dev->irq); ret = -EBUSY; goto out_release_base; diff --git a/drivers/net/hp-plus.c b/drivers/net/hp-plus.c index 0d7a6250e..e26a3e407 100644 --- a/drivers/net/hp-plus.c +++ b/drivers/net/hp-plus.c @@ -446,7 +446,7 @@ MODULE_LICENSE("GPL"); /* This is set up so that only a single autoprobe takes place per call. ISA device autoprobes on a running machine are not recommended. */ -int +int __init init_module(void) { struct net_device *dev; diff --git a/drivers/net/hp.c b/drivers/net/hp.c index cf9fb3698..551a71b3c 100644 --- a/drivers/net/hp.c +++ b/drivers/net/hp.c @@ -384,7 +384,7 @@ hp_block_output(struct net_device *dev, int count, } /* This function resets the ethercard if something screws up. */ -static void +static void __init hp_init_card(struct net_device *dev) { int irq = dev->irq; @@ -409,7 +409,7 @@ MODULE_LICENSE("GPL"); /* This is set up so that only a single autoprobe takes place per call. ISA device autoprobes on a running machine are not recommended. */ -int +int __init init_module(void) { struct net_device *dev; diff --git a/drivers/net/hp100.c b/drivers/net/hp100.c index 247c8ca86..ff5a67d61 100644 --- a/drivers/net/hp100.c +++ b/drivers/net/hp100.c @@ -111,7 +111,6 @@ #include #include #include -#include /* for CONFIG_PCI */ #include #include #include @@ -1079,7 +1078,7 @@ static int hp100_open(struct net_device *dev) /* New: if bus is PCI or EISA, interrupts might be shared interrupts */ if (request_irq(dev->irq, hp100_interrupt, lp->bus == HP100_BUS_PCI || lp->bus == - HP100_BUS_EISA ? SA_SHIRQ : SA_INTERRUPT, + HP100_BUS_EISA ? IRQF_SHARED : IRQF_DISABLED, "hp100", dev)) { printk("hp100: %s: unable to get IRQ %d\n", dev->name, dev->irq); return -EAGAIN; @@ -1487,11 +1486,8 @@ static int hp100_start_xmit_bm(struct sk_buff *skb, struct net_device *dev) if (skb->len <= 0) return 0; - if (skb->len < ETH_ZLEN && lp->chip == HP100_CHIPID_SHASTA) { - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) - return 0; - } + if (lp->chip == HP100_CHIPID_SHASTA && skb_padto(skb, ETH_ZLEN)) + return 0; /* Get Tx ring tail pointer */ if (lp->txrtail->next == lp->txrhead) { diff --git a/drivers/net/hydra.c b/drivers/net/hydra.c index d9fb8e74e..91326ea3e 100644 --- a/drivers/net/hydra.c +++ b/drivers/net/hydra.c @@ -117,7 +117,7 @@ static int __devinit hydra_init(struct zorro_dev *z) dev->irq = IRQ_AMIGA_PORTS; /* Install the Interrupt handler */ - if (request_irq(IRQ_AMIGA_PORTS, ei_interrupt, SA_SHIRQ, "Hydra Ethernet", + if (request_irq(IRQ_AMIGA_PORTS, ei_interrupt, IRQF_SHARED, "Hydra Ethernet", dev)) { free_netdev(dev); return -EAGAIN; diff --git a/drivers/net/ibm_emac/ibm_emac.h b/drivers/net/ibm_emac/ibm_emac.h index 15d5a0e82..97ed22bb4 100644 --- a/drivers/net/ibm_emac/ibm_emac.h +++ b/drivers/net/ibm_emac/ibm_emac.h @@ -1,110 +1,143 @@ /* - * ibm_emac.h + * drivers/net/ibm_emac/ibm_emac.h * + * Register definitions for PowerPC 4xx on-chip ethernet contoller * - * Armin Kuster akuster@mvista.com - * June, 2002 + * Copyright (c) 2004, 2005 Zultys Technologies. + * Eugene Surovegin or * - * Copyright 2002 MontaVista Softare Inc. + * Based on original work by + * Matt Porter + * Armin Kuster + * Copyright 2002-2004 MontaVista Software 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. + * */ +#ifndef __IBM_EMAC_H_ +#define __IBM_EMAC_H_ + +#include + +/* This is a simple check to prevent use of this driver on non-tested SoCs */ +#if !defined(CONFIG_405GP) && !defined(CONFIG_405GPR) && !defined(CONFIG_405EP) && \ + !defined(CONFIG_440GP) && !defined(CONFIG_440GX) && !defined(CONFIG_440SP) && \ + !defined(CONFIG_440EP) && !defined(CONFIG_NP405H) && !defined(CONFIG_440SPE) && \ + !defined(CONFIG_440GR) +#error "Unknown SoC. Please, check chip user manual and make sure EMAC defines are OK" +#endif -#ifndef _IBM_EMAC_H_ -#define _IBM_EMAC_H_ -/* General defines needed for the driver */ +/* EMAC registers Write Access rules */ +struct emac_regs { + u32 mr0; /* special */ + u32 mr1; /* Reset */ + u32 tmr0; /* special */ + u32 tmr1; /* special */ + u32 rmr; /* Reset */ + u32 isr; /* Always */ + u32 iser; /* Reset */ + u32 iahr; /* Reset, R, T */ + u32 ialr; /* Reset, R, T */ + u32 vtpid; /* Reset, R, T */ + u32 vtci; /* Reset, R, T */ + u32 ptr; /* Reset, T */ + u32 iaht1; /* Reset, R */ + u32 iaht2; /* Reset, R */ + u32 iaht3; /* Reset, R */ + u32 iaht4; /* Reset, R */ + u32 gaht1; /* Reset, R */ + u32 gaht2; /* Reset, R */ + u32 gaht3; /* Reset, R */ + u32 gaht4; /* Reset, R */ + u32 lsah; + u32 lsal; + u32 ipgvr; /* Reset, T */ + u32 stacr; /* special */ + u32 trtr; /* special */ + u32 rwmr; /* Reset */ + u32 octx; + u32 ocrx; + u32 ipcr; +}; + +#if !defined(CONFIG_IBM_EMAC4) +#define EMAC_ETHTOOL_REGS_VER 0 +#define EMAC_ETHTOOL_REGS_SIZE (sizeof(struct emac_regs) - sizeof(u32)) +#else +#define EMAC_ETHTOOL_REGS_VER 1 +#define EMAC_ETHTOOL_REGS_SIZE sizeof(struct emac_regs) +#endif -/* Emac */ -typedef struct emac_regs { - u32 em0mr0; - u32 em0mr1; - u32 em0tmr0; - u32 em0tmr1; - u32 em0rmr; - u32 em0isr; - u32 em0iser; - u32 em0iahr; - u32 em0ialr; - u32 em0vtpid; - u32 em0vtci; - u32 em0ptr; - u32 em0iaht1; - u32 em0iaht2; - u32 em0iaht3; - u32 em0iaht4; - u32 em0gaht1; - u32 em0gaht2; - u32 em0gaht3; - u32 em0gaht4; - u32 em0lsah; - u32 em0lsal; - u32 em0ipgvr; - u32 em0stacr; - u32 em0trtr; - u32 em0rwmr; -} emac_t; +/* EMACx_MR0 */ +#define EMAC_MR0_RXI 0x80000000 +#define EMAC_MR0_TXI 0x40000000 +#define EMAC_MR0_SRST 0x20000000 +#define EMAC_MR0_TXE 0x10000000 +#define EMAC_MR0_RXE 0x08000000 +#define EMAC_MR0_WKE 0x04000000 -/* MODE REG 0 */ -#define EMAC_M0_RXI 0x80000000 -#define EMAC_M0_TXI 0x40000000 -#define EMAC_M0_SRST 0x20000000 -#define EMAC_M0_TXE 0x10000000 -#define EMAC_M0_RXE 0x08000000 -#define EMAC_M0_WKE 0x04000000 +/* EMACx_MR1 */ +#define EMAC_MR1_FDE 0x80000000 +#define EMAC_MR1_ILE 0x40000000 +#define EMAC_MR1_VLE 0x20000000 +#define EMAC_MR1_EIFC 0x10000000 +#define EMAC_MR1_APP 0x08000000 +#define EMAC_MR1_IST 0x01000000 -/* MODE Reg 1 */ -#define EMAC_M1_FDE 0x80000000 -#define EMAC_M1_ILE 0x40000000 -#define EMAC_M1_VLE 0x20000000 -#define EMAC_M1_EIFC 0x10000000 -#define EMAC_M1_APP 0x08000000 -#define EMAC_M1_AEMI 0x02000000 -#define EMAC_M1_IST 0x01000000 -#define EMAC_M1_MF_1000GPCS 0x00c00000 /* Internal GPCS */ -#define EMAC_M1_MF_1000MBPS 0x00800000 /* External GPCS */ -#define EMAC_M1_MF_100MBPS 0x00400000 -#define EMAC_M1_RFS_16K 0x00280000 /* 000 for 512 byte */ -#define EMAC_M1_TR 0x00008000 -#ifdef CONFIG_IBM_EMAC4 -#define EMAC_M1_RFS_8K 0x00200000 -#define EMAC_M1_RFS_4K 0x00180000 -#define EMAC_M1_RFS_2K 0x00100000 -#define EMAC_M1_RFS_1K 0x00080000 -#define EMAC_M1_TX_FIFO_16K 0x00050000 /* 0's for 512 byte */ -#define EMAC_M1_TX_FIFO_8K 0x00040000 -#define EMAC_M1_TX_FIFO_4K 0x00030000 -#define EMAC_M1_TX_FIFO_2K 0x00020000 -#define EMAC_M1_TX_FIFO_1K 0x00010000 -#define EMAC_M1_TX_TR 0x00008000 -#define EMAC_M1_TX_MWSW 0x00001000 /* 0 wait for status */ -#define EMAC_M1_JUMBO_ENABLE 0x00000800 /* Upt to 9Kr status */ -#define EMAC_M1_OPB_CLK_66 0x00000008 /* 66Mhz */ -#define EMAC_M1_OPB_CLK_83 0x00000010 /* 83Mhz */ -#define EMAC_M1_OPB_CLK_100 0x00000018 /* 100Mhz */ -#define EMAC_M1_OPB_CLK_100P 0x00000020 /* 100Mhz+ */ -#else /* CONFIG_IBM_EMAC4 */ -#define EMAC_M1_RFS_4K 0x00300000 /* ~4k for 512 byte */ -#define EMAC_M1_RFS_2K 0x00200000 -#define EMAC_M1_RFS_1K 0x00100000 -#define EMAC_M1_TX_FIFO_2K 0x00080000 /* 0's for 512 byte */ -#define EMAC_M1_TX_FIFO_1K 0x00040000 -#define EMAC_M1_TR0_DEPEND 0x00010000 /* 0'x for single packet */ -#define EMAC_M1_TR1_DEPEND 0x00004000 -#define EMAC_M1_TR1_MULTI 0x00002000 -#define EMAC_M1_JUMBO_ENABLE 0x00001000 -#endif /* CONFIG_IBM_EMAC4 */ -#define EMAC_M1_BASE (EMAC_M1_TX_FIFO_2K | \ - EMAC_M1_APP | \ - EMAC_M1_TR | EMAC_M1_VLE) +#define EMAC_MR1_MF_MASK 0x00c00000 +#define EMAC_MR1_MF_10 0x00000000 +#define EMAC_MR1_MF_100 0x00400000 +#if !defined(CONFIG_IBM_EMAC4) +#define EMAC_MR1_MF_1000 0x00000000 +#define EMAC_MR1_MF_1000GPCS 0x00000000 +#define EMAC_MR1_MF_IPPA(id) 0x00000000 +#else +#define EMAC_MR1_MF_1000 0x00800000 +#define EMAC_MR1_MF_1000GPCS 0x00c00000 +#define EMAC_MR1_MF_IPPA(id) (((id) & 0x1f) << 6) +#endif + +#define EMAC_TX_FIFO_SIZE 2048 + +#if !defined(CONFIG_IBM_EMAC4) +#define EMAC_MR1_RFS_4K 0x00300000 +#define EMAC_MR1_RFS_16K 0x00000000 +#define EMAC_RX_FIFO_SIZE(gige) 4096 +#define EMAC_MR1_TFS_2K 0x00080000 +#define EMAC_MR1_TR0_MULT 0x00008000 +#define EMAC_MR1_JPSM 0x00000000 +#define EMAC_MR1_MWSW_001 0x00000000 +#define EMAC_MR1_BASE(opb) (EMAC_MR1_TFS_2K | EMAC_MR1_TR0_MULT) +#else +#define EMAC_MR1_RFS_4K 0x00180000 +#define EMAC_MR1_RFS_16K 0x00280000 +#define EMAC_RX_FIFO_SIZE(gige) ((gige) ? 16384 : 4096) +#define EMAC_MR1_TFS_2K 0x00020000 +#define EMAC_MR1_TR 0x00008000 +#define EMAC_MR1_MWSW_001 0x00001000 +#define EMAC_MR1_JPSM 0x00000800 +#define EMAC_MR1_OBCI_MASK 0x00000038 +#define EMAC_MR1_OBCI_50 0x00000000 +#define EMAC_MR1_OBCI_66 0x00000008 +#define EMAC_MR1_OBCI_83 0x00000010 +#define EMAC_MR1_OBCI_100 0x00000018 +#define EMAC_MR1_OBCI_100P 0x00000020 +#define EMAC_MR1_OBCI(freq) ((freq) <= 50 ? EMAC_MR1_OBCI_50 : \ + (freq) <= 66 ? EMAC_MR1_OBCI_66 : \ + (freq) <= 83 ? EMAC_MR1_OBCI_83 : \ + (freq) <= 100 ? EMAC_MR1_OBCI_100 : EMAC_MR1_OBCI_100P) +#define EMAC_MR1_BASE(opb) (EMAC_MR1_TFS_2K | EMAC_MR1_TR | \ + EMAC_MR1_OBCI(opb)) +#endif -/* Transmit Mode Register 0 */ -#define EMAC_TMR0_GNP0 0x80000000 -#define EMAC_TMR0_GNP1 0x40000000 -#define EMAC_TMR0_GNPD 0x20000000 -#define EMAC_TMR0_FC 0x10000000 +/* EMACx_TMR0 */ +#define EMAC_TMR0_GNP 0x80000000 +#if !defined(CONFIG_IBM_EMAC4) +#define EMAC_TMR0_DEFAULT 0x00000000 +#else #define EMAC_TMR0_TFAE_2_32 0x00000001 #define EMAC_TMR0_TFAE_4_64 0x00000002 #define EMAC_TMR0_TFAE_8_128 0x00000003 @@ -112,14 +145,36 @@ typedef struct emac_regs { #define EMAC_TMR0_TFAE_32_512 0x00000005 #define EMAC_TMR0_TFAE_64_1024 0x00000006 #define EMAC_TMR0_TFAE_128_2048 0x00000007 +#define EMAC_TMR0_DEFAULT EMAC_TMR0_TFAE_2_32 +#endif +#define EMAC_TMR0_XMIT (EMAC_TMR0_GNP | EMAC_TMR0_DEFAULT) + +/* EMACx_TMR1 */ + +/* IBM manuals are not very clear here. + * This is my interpretation of how things are. --ebs + */ +#if defined(CONFIG_40x) +#define EMAC_FIFO_ENTRY_SIZE 8 +#define EMAC_MAL_BURST_SIZE (16 * 4) +#else +#define EMAC_FIFO_ENTRY_SIZE 16 +#define EMAC_MAL_BURST_SIZE (64 * 4) +#endif + +#if !defined(CONFIG_IBM_EMAC4) +#define EMAC_TMR1(l,h) (((l) << 27) | (((h) & 0xff) << 16)) +#else +#define EMAC_TMR1(l,h) (((l) << 27) | (((h) & 0x3ff) << 14)) +#endif -/* Receive Mode Register */ +/* EMACx_RMR */ #define EMAC_RMR_SP 0x80000000 #define EMAC_RMR_SFCS 0x40000000 -#define EMAC_RMR_ARRP 0x20000000 -#define EMAC_RMR_ARP 0x10000000 -#define EMAC_RMR_AROP 0x08000000 -#define EMAC_RMR_ARPI 0x04000000 +#define EMAC_RMR_RRP 0x20000000 +#define EMAC_RMR_RFP 0x10000000 +#define EMAC_RMR_ROP 0x08000000 +#define EMAC_RMR_RPIR 0x04000000 #define EMAC_RMR_PPP 0x02000000 #define EMAC_RMR_PME 0x01000000 #define EMAC_RMR_PMME 0x00800000 @@ -127,6 +182,9 @@ typedef struct emac_regs { #define EMAC_RMR_MIAE 0x00200000 #define EMAC_RMR_BAE 0x00100000 #define EMAC_RMR_MAE 0x00080000 +#if !defined(CONFIG_IBM_EMAC4) +#define EMAC_RMR_BASE 0x00000000 +#else #define EMAC_RMR_RFAF_2_32 0x00000001 #define EMAC_RMR_RFAF_4_64 0x00000002 #define EMAC_RMR_RFAF_8_128 0x00000003 @@ -134,9 +192,21 @@ typedef struct emac_regs { #define EMAC_RMR_RFAF_32_512 0x00000005 #define EMAC_RMR_RFAF_64_1024 0x00000006 #define EMAC_RMR_RFAF_128_2048 0x00000007 -#define EMAC_RMR_BASE (EMAC_RMR_IAE | EMAC_RMR_BAE) +#define EMAC_RMR_BASE EMAC_RMR_RFAF_128_2048 +#endif -/* Interrupt Status & enable Regs */ +/* EMACx_ISR & EMACx_ISER */ +#if !defined(CONFIG_IBM_EMAC4) +#define EMAC_ISR_TXPE 0x00000000 +#define EMAC_ISR_RXPE 0x00000000 +#define EMAC_ISR_TXUE 0x00000000 +#define EMAC_ISR_RXOE 0x00000000 +#else +#define EMAC_ISR_TXPE 0x20000000 +#define EMAC_ISR_RXPE 0x10000000 +#define EMAC_ISR_TXUE 0x08000000 +#define EMAC_ISR_RXOE 0x04000000 +#endif #define EMAC_ISR_OVR 0x02000000 #define EMAC_ISR_PP 0x01000000 #define EMAC_ISR_BP 0x00800000 @@ -147,53 +217,81 @@ typedef struct emac_regs { #define EMAC_ISR_PTLE 0x00040000 #define EMAC_ISR_ORE 0x00020000 #define EMAC_ISR_IRE 0x00010000 -#define EMAC_ISR_DBDM 0x00000200 -#define EMAC_ISR_DB0 0x00000100 -#define EMAC_ISR_SE0 0x00000080 -#define EMAC_ISR_TE0 0x00000040 -#define EMAC_ISR_DB1 0x00000020 -#define EMAC_ISR_SE1 0x00000010 -#define EMAC_ISR_TE1 0x00000008 +#define EMAC_ISR_SQE 0x00000080 +#define EMAC_ISR_TE 0x00000040 #define EMAC_ISR_MOS 0x00000002 #define EMAC_ISR_MOF 0x00000001 -/* STA CONTROL REG */ +/* EMACx_STACR */ +#define EMAC_STACR_PHYD_MASK 0xffff +#define EMAC_STACR_PHYD_SHIFT 16 #define EMAC_STACR_OC 0x00008000 #define EMAC_STACR_PHYE 0x00004000 -#define EMAC_STACR_WRITE 0x00002000 -#define EMAC_STACR_READ 0x00001000 -#define EMAC_STACR_CLK_83MHZ 0x00000800 /* 0's for 50Mhz */ -#define EMAC_STACR_CLK_66MHZ 0x00000400 -#define EMAC_STACR_CLK_100MHZ 0x00000C00 +#define EMAC_STACR_STAC_MASK 0x00003000 +#define EMAC_STACR_STAC_READ 0x00001000 +#define EMAC_STACR_STAC_WRITE 0x00002000 +#if !defined(CONFIG_IBM_EMAC4) +#define EMAC_STACR_OPBC_MASK 0x00000C00 +#define EMAC_STACR_OPBC_50 0x00000000 +#define EMAC_STACR_OPBC_66 0x00000400 +#define EMAC_STACR_OPBC_83 0x00000800 +#define EMAC_STACR_OPBC_100 0x00000C00 +#define EMAC_STACR_OPBC(freq) ((freq) <= 50 ? EMAC_STACR_OPBC_50 : \ + (freq) <= 66 ? EMAC_STACR_OPBC_66 : \ + (freq) <= 83 ? EMAC_STACR_OPBC_83 : EMAC_STACR_OPBC_100) +#define EMAC_STACR_BASE(opb) EMAC_STACR_OPBC(opb) +#else +#define EMAC_STACR_BASE(opb) 0x00000000 +#endif +#define EMAC_STACR_PCDA_MASK 0x1f +#define EMAC_STACR_PCDA_SHIFT 5 +#define EMAC_STACR_PRA_MASK 0x1f -/* Transmit Request Threshold Register */ -#define EMAC_TRTR_1600 0x18000000 /* 0's for 64 Bytes */ -#define EMAC_TRTR_1024 0x0f000000 -#define EMAC_TRTR_512 0x07000000 -#define EMAC_TRTR_256 0x03000000 -#define EMAC_TRTR_192 0x10000000 -#define EMAC_TRTR_128 0x01000000 +/* + * For the 440SPe, AMCC inexplicably changed the polarity of + * the "operation complete" bit in the MII control register. + */ +#if defined(CONFIG_440SPE) +static inline int emac_phy_done(u32 stacr) +{ + return !(stacr & EMAC_STACR_OC); +}; +#define EMAC_STACR_START EMAC_STACR_OC +#else /* CONFIG_440SPE */ +static inline int emac_phy_done(u32 stacr) +{ + return stacr & EMAC_STACR_OC; +}; +#define EMAC_STACR_START 0 +#endif /* !CONFIG_440SPE */ + +/* EMACx_TRTR */ +#if !defined(CONFIG_IBM_EMAC4) +#define EMAC_TRTR_SHIFT 27 +#else +#define EMAC_TRTR_SHIFT 24 +#endif +#define EMAC_TRTR(size) ((((size) >> 6) - 1) << EMAC_TRTR_SHIFT) + +/* EMACx_RWMR */ +#if !defined(CONFIG_IBM_EMAC4) +#define EMAC_RWMR(l,h) (((l) << 23) | ( ((h) & 0x1ff) << 7)) +#else +#define EMAC_RWMR(l,h) (((l) << 22) | ( ((h) & 0x3ff) << 6)) +#endif + +/* EMAC specific TX descriptor control fields (write access) */ #define EMAC_TX_CTRL_GFCS 0x0200 #define EMAC_TX_CTRL_GP 0x0100 #define EMAC_TX_CTRL_ISA 0x0080 #define EMAC_TX_CTRL_RSA 0x0040 #define EMAC_TX_CTRL_IVT 0x0020 #define EMAC_TX_CTRL_RVT 0x0010 -#define EMAC_TX_CTRL_TAH_CSUM 0x000e /* TAH only */ -#define EMAC_TX_CTRL_TAH_SEG4 0x000a /* TAH only */ -#define EMAC_TX_CTRL_TAH_SEG3 0x0008 /* TAH only */ -#define EMAC_TX_CTRL_TAH_SEG2 0x0006 /* TAH only */ -#define EMAC_TX_CTRL_TAH_SEG1 0x0004 /* TAH only */ -#define EMAC_TX_CTRL_TAH_SEG0 0x0002 /* TAH only */ -#define EMAC_TX_CTRL_TAH_DIS 0x0000 /* TAH only */ - -#define EMAC_TX_CTRL_DFLT ( \ - MAL_TX_CTRL_INTR | EMAC_TX_CTRL_GFCS | EMAC_TX_CTRL_GP ) +#define EMAC_TX_CTRL_TAH_CSUM 0x000e -/* madmal transmit status / Control bits */ +/* EMAC specific TX descriptor status fields (read access) */ #define EMAC_TX_ST_BFCS 0x0200 -#define EMAC_TX_ST_BPP 0x0100 #define EMAC_TX_ST_LCS 0x0080 #define EMAC_TX_ST_ED 0x0040 #define EMAC_TX_ST_EC 0x0020 @@ -202,8 +300,16 @@ typedef struct emac_regs { #define EMAC_TX_ST_SC 0x0004 #define EMAC_TX_ST_UR 0x0002 #define EMAC_TX_ST_SQE 0x0001 +#if !defined(CONFIG_IBM_EMAC_TAH) +#define EMAC_IS_BAD_TX(v) ((v) & (EMAC_TX_ST_LCS | EMAC_TX_ST_ED | \ + EMAC_TX_ST_EC | EMAC_TX_ST_LC | \ + EMAC_TX_ST_MC | EMAC_TX_ST_UR)) +#else +#define EMAC_IS_BAD_TX(v) ((v) & (EMAC_TX_ST_LCS | EMAC_TX_ST_ED | \ + EMAC_TX_ST_EC | EMAC_TX_ST_LC)) +#endif -/* madmal receive status / Control bits */ +/* EMAC specific RX descriptor status fields (read access) */ #define EMAC_RX_ST_OE 0x0200 #define EMAC_RX_ST_PP 0x0100 #define EMAC_RX_ST_BP 0x0080 @@ -214,54 +320,10 @@ typedef struct emac_regs { #define EMAC_RX_ST_PTL 0x0004 #define EMAC_RX_ST_ORE 0x0002 #define EMAC_RX_ST_IRE 0x0001 -#define EMAC_BAD_RX_PACKET 0x02ff -#define EMAC_CSUM_VER_ERROR 0x0003 - -/* identify a bad rx packet dependent on emac features */ -#ifdef CONFIG_IBM_EMAC4 -#define EMAC_IS_BAD_RX_PACKET(desc) \ - (((desc & (EMAC_BAD_RX_PACKET & ~EMAC_CSUM_VER_ERROR)) || \ - ((desc & EMAC_CSUM_VER_ERROR) == EMAC_RX_ST_ORE) || \ - ((desc & EMAC_CSUM_VER_ERROR) == EMAC_RX_ST_IRE))) -#else -#define EMAC_IS_BAD_RX_PACKET(desc) \ - (desc & EMAC_BAD_RX_PACKET) -#endif - -/* SoC implementation specific EMAC register defaults */ -#if defined(CONFIG_440GP) -#define EMAC_RWMR_DEFAULT 0x80009000 -#define EMAC_TMR0_DEFAULT 0x00000000 -#define EMAC_TMR1_DEFAULT 0xf8640000 -#elif defined(CONFIG_440GX) -#define EMAC_RWMR_DEFAULT 0x1000a200 -#define EMAC_TMR0_DEFAULT EMAC_TMR0_TFAE_2_32 -#define EMAC_TMR1_DEFAULT 0xa00f0000 -#elif defined(CONFIG_440SP) -#define EMAC_RWMR_DEFAULT 0x08002000 -#define EMAC_TMR0_DEFAULT EMAC_TMR0_TFAE_128_2048 -#define EMAC_TMR1_DEFAULT 0xf8200000 -#else -#define EMAC_RWMR_DEFAULT 0x0f002000 -#define EMAC_TMR0_DEFAULT 0x00000000 -#define EMAC_TMR1_DEFAULT 0x380f0000 -#endif /* CONFIG_440GP */ - -/* Revision specific EMAC register defaults */ -#ifdef CONFIG_IBM_EMAC4 -#define EMAC_M1_DEFAULT (EMAC_M1_BASE | \ - EMAC_M1_OPB_CLK_83 | \ - EMAC_M1_TX_MWSW) -#define EMAC_RMR_DEFAULT (EMAC_RMR_BASE | \ - EMAC_RMR_RFAF_128_2048) -#define EMAC_TMR0_XMIT (EMAC_TMR0_GNP0 | \ - EMAC_TMR0_DEFAULT) -#define EMAC_TRTR_DEFAULT EMAC_TRTR_1024 -#else /* !CONFIG_IBM_EMAC4 */ -#define EMAC_M1_DEFAULT EMAC_M1_BASE -#define EMAC_RMR_DEFAULT EMAC_RMR_BASE -#define EMAC_TMR0_XMIT EMAC_TMR0_GNP0 -#define EMAC_TRTR_DEFAULT EMAC_TRTR_1600 -#endif /* CONFIG_IBM_EMAC4 */ - -#endif +#define EMAC_RX_TAH_BAD_CSUM 0x0003 +#define EMAC_BAD_RX_MASK (EMAC_RX_ST_OE | EMAC_RX_ST_BP | \ + EMAC_RX_ST_RP | EMAC_RX_ST_SE | \ + EMAC_RX_ST_AE | EMAC_RX_ST_BFCS | \ + EMAC_RX_ST_PTL | EMAC_RX_ST_ORE | \ + EMAC_RX_ST_IRE ) +#endif /* __IBM_EMAC_H_ */ diff --git a/drivers/net/ibm_emac/ibm_emac_core.c b/drivers/net/ibm_emac/ibm_emac_core.c index 6482d994d..82468e2dc 100644 --- a/drivers/net/ibm_emac/ibm_emac_core.c +++ b/drivers/net/ibm_emac/ibm_emac_core.c @@ -1,13 +1,14 @@ /* - * ibm_emac_core.c + * drivers/net/ibm_emac/ibm_emac_core.c * - * Ethernet driver for the built in ethernet on the IBM 4xx PowerPC - * processors. - * - * (c) 2003 Benjamin Herrenschmidt + * Driver for PowerPC 4xx on-chip ethernet controller. * - * Based on original work by + * Copyright (c) 2004, 2005 Zultys Technologies. + * Eugene Surovegin or * + * Based on original work by + * Matt Porter + * (c) 2003 Benjamin Herrenschmidt * Armin Kuster * Johnnie Peters * @@ -15,29 +16,23 @@ * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. - * TODO - * - Check for races in the "remove" code path - * - Add some Power Management to the MAC and the PHY - * - Audit remaining of non-rewritten code (--BenH) - * - Cleanup message display using msglevel mecanism - * - Address all errata - * - Audit all register update paths to ensure they - * are being written post soft reset if required. + * */ + #include #include #include #include -#include -#include #include -#include -#include #include #include #include #include -#include +#include +#include +#include +#include +#include #include #include #include @@ -45,1692 +40,1914 @@ #include #include #include -#include #include #include -#include -#include -#include -#include - #include "ibm_emac_core.h" - -//#define MDIO_DEBUG(fmt) printk fmt -#define MDIO_DEBUG(fmt) - -//#define LINK_DEBUG(fmt) printk fmt -#define LINK_DEBUG(fmt) - -//#define PKT_DEBUG(fmt) printk fmt -#define PKT_DEBUG(fmt) - -#define DRV_NAME "emac" -#define DRV_VERSION "2.0" -#define DRV_AUTHOR "Benjamin Herrenschmidt " -#define DRV_DESC "IBM EMAC Ethernet driver" +#include "ibm_emac_debug.h" /* - * When mdio_idx >= 0, contains a list of emac ocp_devs - * that have had their initialization deferred until the - * common MDIO controller has been initialized. + * Lack of dma_unmap_???? calls is intentional. + * + * API-correct usage requires additional support state information to be + * maintained for every RX and TX buffer descriptor (BD). Unfortunately, due to + * EMAC design (e.g. TX buffer passed from network stack can be split into + * several BDs, dma_map_single/dma_map_page can be used to map particular BD), + * maintaining such information will add additional overhead. + * Current DMA API implementation for 4xx processors only ensures cache coherency + * and dma_unmap_???? routines are empty and are likely to stay this way. + * I decided to omit dma_unmap_??? calls because I don't want to add additional + * complexity just for the sake of following some abstract API, when it doesn't + * add any real benefit to the driver. I understand that this decision maybe + * controversial, but I really tried to make code API-correct and efficient + * at the same time and didn't come up with code I liked :(. --ebs */ -LIST_HEAD(emac_init_list); -MODULE_AUTHOR(DRV_AUTHOR); +#define DRV_NAME "emac" +#define DRV_VERSION "3.54" +#define DRV_DESC "PPC 4xx OCP EMAC driver" + MODULE_DESCRIPTION(DRV_DESC); +MODULE_AUTHOR + ("Eugene Surovegin or "); MODULE_LICENSE("GPL"); -static int skb_res = SKB_RES; -module_param(skb_res, int, 0444); -MODULE_PARM_DESC(skb_res, "Amount of data to reserve on skb buffs\n" - "The 405 handles a misaligned IP header fine but\n" - "this can help if you are routing to a tunnel or a\n" - "device that needs aligned data. 0..2"); - -#define RGMII_PRIV(ocpdev) ((struct ibm_ocp_rgmii*)ocp_get_drvdata(ocpdev)) - -static unsigned int rgmii_enable[] = { - RGMII_RTBI, - RGMII_RGMII, - RGMII_TBI, - RGMII_GMII -}; - -static unsigned int rgmii_speed_mask[] = { - RGMII_MII2_SPDMASK, - RGMII_MII3_SPDMASK -}; - -static unsigned int rgmii_speed100[] = { - RGMII_MII2_100MB, - RGMII_MII3_100MB -}; - -static unsigned int rgmii_speed1000[] = { - RGMII_MII2_1000MB, - RGMII_MII3_1000MB -}; - -#define ZMII_PRIV(ocpdev) ((struct ibm_ocp_zmii*)ocp_get_drvdata(ocpdev)) - -static unsigned int zmii_enable[][4] = { - {ZMII_SMII0, ZMII_RMII0, ZMII_MII0, - ~(ZMII_MDI1 | ZMII_MDI2 | ZMII_MDI3)}, - {ZMII_SMII1, ZMII_RMII1, ZMII_MII1, - ~(ZMII_MDI0 | ZMII_MDI2 | ZMII_MDI3)}, - {ZMII_SMII2, ZMII_RMII2, ZMII_MII2, - ~(ZMII_MDI0 | ZMII_MDI1 | ZMII_MDI3)}, - {ZMII_SMII3, ZMII_RMII3, ZMII_MII3, ~(ZMII_MDI0 | ZMII_MDI1 | ZMII_MDI2)} -}; - -static unsigned int mdi_enable[] = { - ZMII_MDI0, - ZMII_MDI1, - ZMII_MDI2, - ZMII_MDI3 -}; +/* minimum number of free TX descriptors required to wake up TX process */ +#define EMAC_TX_WAKEUP_THRESH (NUM_TX_BUFF / 4) -static unsigned int zmii_speed = 0x0; -static unsigned int zmii_speed100[] = { - ZMII_MII0_100MB, - ZMII_MII1_100MB, - ZMII_MII2_100MB, - ZMII_MII3_100MB -}; +/* If packet size is less than this number, we allocate small skb and copy packet + * contents into it instead of just sending original big skb up + */ +#define EMAC_RX_COPY_THRESH CONFIG_IBM_EMAC_RX_COPY_THRESHOLD /* Since multiple EMACs share MDIO lines in various ways, we need * to avoid re-using the same PHY ID in cases where the arch didn't * setup precise phy_map entries */ -static u32 busy_phy_map = 0; - -/* If EMACs share a common MDIO device, this points to it */ -static struct net_device *mdio_ndev = NULL; - -struct emac_def_dev { - struct list_head link; - struct ocp_device *ocpdev; - struct ibm_ocp_mal *mal; -}; - -static struct net_device_stats *emac_stats(struct net_device *dev) +static u32 busy_phy_map; + +#if defined(CONFIG_IBM_EMAC_PHY_RX_CLK_FIX) && \ + (defined(CONFIG_405EP) || defined(CONFIG_440EP) || defined(CONFIG_440GR)) +/* 405EP has "EMAC to PHY Control Register" (CPC0_EPCTL) which can help us + * with PHY RX clock problem. + * 440EP/440GR has more sane SDR0_MFR register implementation than 440GX, which + * also allows controlling each EMAC clock + */ +static inline void EMAC_RX_CLK_TX(int idx) { - struct ocp_enet_private *fep = dev->priv; - return &fep->stats; -}; + unsigned long flags; + local_irq_save(flags); -static int -emac_init_rgmii(struct ocp_device *rgmii_dev, int input, int phy_mode) -{ - struct ibm_ocp_rgmii *rgmii = RGMII_PRIV(rgmii_dev); - const char *mode_name[] = { "RTBI", "RGMII", "TBI", "GMII" }; - int mode = -1; +#if defined(CONFIG_405EP) + mtdcr(0xf3, mfdcr(0xf3) | (1 << idx)); +#else /* CONFIG_440EP || CONFIG_440GR */ + SDR_WRITE(DCRN_SDR_MFR, SDR_READ(DCRN_SDR_MFR) | (0x08000000 >> idx)); +#endif - if (!rgmii) { - rgmii = kmalloc(sizeof(struct ibm_ocp_rgmii), GFP_KERNEL); + local_irq_restore(flags); +} - if (rgmii == NULL) { - printk(KERN_ERR - "rgmii%d: Out of memory allocating RGMII structure!\n", - rgmii_dev->def->index); - return -ENOMEM; - } +static inline void EMAC_RX_CLK_DEFAULT(int idx) +{ + unsigned long flags; + local_irq_save(flags); - memset(rgmii, 0, sizeof(*rgmii)); +#if defined(CONFIG_405EP) + mtdcr(0xf3, mfdcr(0xf3) & ~(1 << idx)); +#else /* CONFIG_440EP */ + SDR_WRITE(DCRN_SDR_MFR, SDR_READ(DCRN_SDR_MFR) & ~(0x08000000 >> idx)); +#endif - rgmii->base = - (struct rgmii_regs *)ioremap(rgmii_dev->def->paddr, - sizeof(*rgmii->base)); - if (rgmii->base == NULL) { - printk(KERN_ERR - "rgmii%d: Cannot ioremap bridge registers!\n", - rgmii_dev->def->index); + local_irq_restore(flags); +} +#else +#define EMAC_RX_CLK_TX(idx) ((void)0) +#define EMAC_RX_CLK_DEFAULT(idx) ((void)0) +#endif - kfree(rgmii); - return -ENOMEM; - } - ocp_set_drvdata(rgmii_dev, rgmii); - } +#if defined(CONFIG_IBM_EMAC_PHY_RX_CLK_FIX) && defined(CONFIG_440GX) +/* We can switch Ethernet clock to the internal source through SDR0_MFR[ECS], + * unfortunately this is less flexible than 440EP case, because it's a global + * setting for all EMACs, therefore we do this clock trick only during probe. + */ +#define EMAC_CLK_INTERNAL SDR_WRITE(DCRN_SDR_MFR, \ + SDR_READ(DCRN_SDR_MFR) | 0x08000000) +#define EMAC_CLK_EXTERNAL SDR_WRITE(DCRN_SDR_MFR, \ + SDR_READ(DCRN_SDR_MFR) & ~0x08000000) +#else +#define EMAC_CLK_INTERNAL ((void)0) +#define EMAC_CLK_EXTERNAL ((void)0) +#endif - if (phy_mode) { - switch (phy_mode) { - case PHY_MODE_GMII: - mode = GMII; - break; - case PHY_MODE_TBI: - mode = TBI; - break; - case PHY_MODE_RTBI: - mode = RTBI; - break; - case PHY_MODE_RGMII: - default: - mode = RGMII; - } - rgmii->base->fer &= ~RGMII_FER_MASK(input); - rgmii->base->fer |= rgmii_enable[mode] << (4 * input); - } else { - switch ((rgmii->base->fer & RGMII_FER_MASK(input)) >> (4 * - input)) { - case RGMII_RTBI: - mode = RTBI; - break; - case RGMII_RGMII: - mode = RGMII; - break; - case RGMII_TBI: - mode = TBI; - break; - case RGMII_GMII: - mode = GMII; - } - } +/* I don't want to litter system log with timeout errors + * when we have brain-damaged PHY. + */ +static inline void emac_report_timeout_error(struct ocp_enet_private *dev, + const char *error) +{ +#if defined(CONFIG_IBM_EMAC_PHY_RX_CLK_FIX) + DBG("%d: %s" NL, dev->def->index, error); +#else + if (net_ratelimit()) + printk(KERN_ERR "emac%d: %s\n", dev->def->index, error); +#endif +} - /* Set mode to RGMII if nothing valid is detected */ - if (mode < 0) - mode = RGMII; +/* PHY polling intervals */ +#define PHY_POLL_LINK_ON HZ +#define PHY_POLL_LINK_OFF (HZ / 5) - printk(KERN_NOTICE "rgmii%d: input %d in %s mode\n", - rgmii_dev->def->index, input, mode_name[mode]); +/* 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", + "tx_packets_csum", "tx_undo", "rx_dropped_stack", "rx_dropped_oom", + "rx_dropped_error", "rx_dropped_resize", "rx_dropped_mtu", + "rx_stopped", "rx_bd_errors", "rx_bd_overrun", "rx_bd_bad_packet", + "rx_bd_runt_packet", "rx_bd_short_event", "rx_bd_alignment_error", + "rx_bd_bad_fcs", "rx_bd_packet_too_long", "rx_bd_out_of_range", + "rx_bd_in_range", "rx_parity", "rx_fifo_overrun", "rx_overrun", + "rx_bad_packet", "rx_runt_packet", "rx_short_event", + "rx_alignment_error", "rx_bad_fcs", "rx_packet_too_long", + "rx_out_of_range", "rx_in_range", "tx_dropped", "tx_bd_errors", + "tx_bd_bad_fcs", "tx_bd_carrier_loss", "tx_bd_excessive_deferral", + "tx_bd_excessive_collisions", "tx_bd_late_collision", + "tx_bd_multple_collisions", "tx_bd_single_collision", + "tx_bd_underrun", "tx_bd_sqe", "tx_parity", "tx_underrun", "tx_sqe", + "tx_errors" +}; - rgmii->mode[input] = mode; - rgmii->users++; +static irqreturn_t emac_irq(int irq, void *dev_instance, struct pt_regs *regs); +static void emac_clean_tx_ring(struct ocp_enet_private *dev); - return 0; +static inline int emac_phy_supports_gige(int phy_mode) +{ + return phy_mode == PHY_MODE_GMII || + phy_mode == PHY_MODE_RGMII || + phy_mode == PHY_MODE_TBI || + phy_mode == PHY_MODE_RTBI; } -static void -emac_rgmii_port_speed(struct ocp_device *ocpdev, int input, int speed) +static inline int emac_phy_gpcs(int phy_mode) { - struct ibm_ocp_rgmii *rgmii = RGMII_PRIV(ocpdev); - unsigned int rgmii_speed; + return phy_mode == PHY_MODE_TBI || + phy_mode == PHY_MODE_RTBI; +} - rgmii_speed = in_be32(&rgmii->base->ssr); +static inline void emac_tx_enable(struct ocp_enet_private *dev) +{ + struct emac_regs __iomem *p = dev->emacp; + unsigned long flags; + u32 r; - rgmii_speed &= ~rgmii_speed_mask[input]; + local_irq_save(flags); - if (speed == 1000) - rgmii_speed |= rgmii_speed1000[input]; - else if (speed == 100) - rgmii_speed |= rgmii_speed100[input]; + DBG("%d: tx_enable" NL, dev->def->index); - out_be32(&rgmii->base->ssr, rgmii_speed); + r = in_be32(&p->mr0); + if (!(r & EMAC_MR0_TXE)) + out_be32(&p->mr0, r | EMAC_MR0_TXE); + local_irq_restore(flags); } -static void emac_close_rgmii(struct ocp_device *ocpdev) +static void emac_tx_disable(struct ocp_enet_private *dev) { - struct ibm_ocp_rgmii *rgmii = RGMII_PRIV(ocpdev); - BUG_ON(!rgmii || rgmii->users == 0); - - if (!--rgmii->users) { - ocp_set_drvdata(ocpdev, NULL); - iounmap((void *)rgmii->base); - kfree(rgmii); + struct emac_regs __iomem *p = dev->emacp; + unsigned long flags; + u32 r; + + local_irq_save(flags); + + DBG("%d: tx_disable" NL, dev->def->index); + + r = in_be32(&p->mr0); + if (r & EMAC_MR0_TXE) { + int n = dev->stop_timeout; + out_be32(&p->mr0, r & ~EMAC_MR0_TXE); + while (!(in_be32(&p->mr0) & EMAC_MR0_TXI) && n) { + udelay(1); + --n; + } + if (unlikely(!n)) + emac_report_timeout_error(dev, "TX disable timeout"); } + local_irq_restore(flags); } -static int emac_init_zmii(struct ocp_device *zmii_dev, int input, int phy_mode) +static void emac_rx_enable(struct ocp_enet_private *dev) { - struct ibm_ocp_zmii *zmii = ZMII_PRIV(zmii_dev); - const char *mode_name[] = { "SMII", "RMII", "MII" }; - int mode = -1; - - if (!zmii) { - zmii = kmalloc(sizeof(struct ibm_ocp_zmii), GFP_KERNEL); - if (zmii == NULL) { - printk(KERN_ERR - "zmii%d: Out of memory allocating ZMII structure!\n", - zmii_dev->def->index); - return -ENOMEM; - } - memset(zmii, 0, sizeof(*zmii)); - - zmii->base = - (struct zmii_regs *)ioremap(zmii_dev->def->paddr, - sizeof(*zmii->base)); - if (zmii->base == NULL) { - printk(KERN_ERR - "zmii%d: Cannot ioremap bridge registers!\n", - zmii_dev->def->index); + struct emac_regs __iomem *p = dev->emacp; + unsigned long flags; + u32 r; - kfree(zmii); - return -ENOMEM; - } - ocp_set_drvdata(zmii_dev, zmii); - } + local_irq_save(flags); + if (unlikely(dev->commac.rx_stopped)) + goto out; - if (phy_mode) { - switch (phy_mode) { - case PHY_MODE_MII: - mode = MII; - break; - case PHY_MODE_RMII: - mode = RMII; - break; - case PHY_MODE_SMII: - default: - mode = SMII; - } - zmii->base->fer &= ~ZMII_FER_MASK(input); - zmii->base->fer |= zmii_enable[input][mode]; - } else { - switch ((zmii->base->fer & ZMII_FER_MASK(input)) << (4 * input)) { - case ZMII_MII0: - mode = MII; - break; - case ZMII_RMII0: - mode = RMII; - break; - case ZMII_SMII0: - mode = SMII; + DBG("%d: rx_enable" NL, dev->def->index); + + r = in_be32(&p->mr0); + if (!(r & EMAC_MR0_RXE)) { + if (unlikely(!(r & EMAC_MR0_RXI))) { + /* Wait if previous async disable is still in progress */ + 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"); } + out_be32(&p->mr0, r | EMAC_MR0_RXE); } - - /* Set mode to SMII if nothing valid is detected */ - if (mode < 0) - mode = SMII; - - printk(KERN_NOTICE "zmii%d: input %d in %s mode\n", - zmii_dev->def->index, input, mode_name[mode]); - - zmii->mode[input] = mode; - zmii->users++; - - return 0; + out: + local_irq_restore(flags); } -static void emac_enable_zmii_port(struct ocp_device *ocpdev, int input) +static void emac_rx_disable(struct ocp_enet_private *dev) { - u32 mask; - struct ibm_ocp_zmii *zmii = ZMII_PRIV(ocpdev); - - mask = in_be32(&zmii->base->fer); - mask &= zmii_enable[input][MDI]; /* turn all non enabled MDI's off */ - mask |= zmii_enable[input][zmii->mode[input]] | mdi_enable[input]; - out_be32(&zmii->base->fer, mask); + struct emac_regs __iomem *p = dev->emacp; + unsigned long flags; + u32 r; + + local_irq_save(flags); + + DBG("%d: rx_disable" NL, dev->def->index); + + r = in_be32(&p->mr0); + if (r & EMAC_MR0_RXE) { + int n = dev->stop_timeout; + out_be32(&p->mr0, r & ~EMAC_MR0_RXE); + while (!(in_be32(&p->mr0) & EMAC_MR0_RXI) && n) { + udelay(1); + --n; + } + if (unlikely(!n)) + emac_report_timeout_error(dev, "RX disable timeout"); + } + local_irq_restore(flags); } -static void -emac_zmii_port_speed(struct ocp_device *ocpdev, int input, int speed) +static inline void emac_rx_disable_async(struct ocp_enet_private *dev) { - struct ibm_ocp_zmii *zmii = ZMII_PRIV(ocpdev); - - if (speed == 100) - zmii_speed |= zmii_speed100[input]; - else - zmii_speed &= ~zmii_speed100[input]; + struct emac_regs __iomem *p = dev->emacp; + unsigned long flags; + u32 r; - out_be32(&zmii->base->ssr, zmii_speed); -} + local_irq_save(flags); -static void emac_close_zmii(struct ocp_device *ocpdev) -{ - struct ibm_ocp_zmii *zmii = ZMII_PRIV(ocpdev); - BUG_ON(!zmii || zmii->users == 0); + DBG("%d: rx_disable_async" NL, dev->def->index); - if (!--zmii->users) { - ocp_set_drvdata(ocpdev, NULL); - iounmap((void *)zmii->base); - kfree(zmii); - } + r = in_be32(&p->mr0); + if (r & EMAC_MR0_RXE) + out_be32(&p->mr0, r & ~EMAC_MR0_RXE); + local_irq_restore(flags); } -int emac_phy_read(struct net_device *dev, int mii_id, int reg) +static int emac_reset(struct ocp_enet_private *dev) { - int count; - uint32_t stacr; - struct ocp_enet_private *fep = dev->priv; - emac_t *emacp = fep->emacp; + struct emac_regs __iomem *p = dev->emacp; + unsigned long flags; + int n = 20; - MDIO_DEBUG(("%s: phy_read, id: 0x%x, reg: 0x%x\n", dev->name, mii_id, - reg)); + DBG("%d: reset" NL, dev->def->index); - /* Enable proper ZMII port */ - if (fep->zmii_dev) - emac_enable_zmii_port(fep->zmii_dev, fep->zmii_input); + local_irq_save(flags); - /* Use the EMAC that has the MDIO port */ - if (fep->mdio_dev) { - dev = fep->mdio_dev; - fep = dev->priv; - emacp = fep->emacp; + if (!dev->reset_failed) { + /* 40x erratum suggests stopping RX channel before reset, + * we stop TX as well + */ + emac_rx_disable(dev); + emac_tx_disable(dev); } - count = 0; - while ((((stacr = in_be32(&emacp->em0stacr)) & EMAC_STACR_OC) == 0) - && (count++ < MDIO_DELAY)) - udelay(1); - MDIO_DEBUG((" (count was %d)\n", count)); + out_be32(&p->mr0, EMAC_MR0_SRST); + while ((in_be32(&p->mr0) & EMAC_MR0_SRST) && n) + --n; + local_irq_restore(flags); - if ((stacr & EMAC_STACR_OC) == 0) { - printk(KERN_WARNING "%s: PHY read timeout #1!\n", dev->name); - return -1; + if (n) { + dev->reset_failed = 0; + return 0; + } else { + emac_report_timeout_error(dev, "reset timeout"); + dev->reset_failed = 1; + return -ETIMEDOUT; } +} - /* Clear the speed bits and make a read request to the PHY */ - stacr = ((EMAC_STACR_READ | (reg & 0x1f)) & ~EMAC_STACR_CLK_100MHZ); - stacr |= ((mii_id & 0x1F) << 5); - - out_be32(&emacp->em0stacr, stacr); +static void emac_hash_mc(struct ocp_enet_private *dev) +{ + struct emac_regs __iomem *p = dev->emacp; + u16 gaht[4] = { 0 }; + struct dev_mc_list *dmi; - count = 0; - while ((((stacr = in_be32(&emacp->em0stacr)) & EMAC_STACR_OC) == 0) - && (count++ < MDIO_DELAY)) - udelay(1); - MDIO_DEBUG((" (count was %d)\n", count)); + DBG("%d: hash_mc %d" NL, dev->def->index, dev->ndev->mc_count); - if ((stacr & EMAC_STACR_OC) == 0) { - printk(KERN_WARNING "%s: PHY read timeout #2!\n", dev->name); - return -1; - } + for (dmi = dev->ndev->mc_list; dmi; dmi = dmi->next) { + int bit; + DBG2("%d: mc %02x:%02x:%02x:%02x:%02x:%02x" NL, + dev->def->index, + dmi->dmi_addr[0], dmi->dmi_addr[1], dmi->dmi_addr[2], + dmi->dmi_addr[3], dmi->dmi_addr[4], dmi->dmi_addr[5]); - /* Check for a read error */ - if (stacr & EMAC_STACR_PHYE) { - MDIO_DEBUG(("EMAC MDIO PHY error !\n")); - return -1; + bit = 63 - (ether_crc(ETH_ALEN, dmi->dmi_addr) >> 26); + gaht[bit >> 4] |= 0x8000 >> (bit & 0x0f); } - - MDIO_DEBUG((" -> 0x%x\n", stacr >> 16)); - - return (stacr >> 16); + out_be32(&p->gaht1, gaht[0]); + out_be32(&p->gaht2, gaht[1]); + out_be32(&p->gaht3, gaht[2]); + out_be32(&p->gaht4, gaht[3]); } -void emac_phy_write(struct net_device *dev, int mii_id, int reg, int data) +static inline u32 emac_iff2rmr(struct net_device *ndev) { - int count; - uint32_t stacr; - struct ocp_enet_private *fep = dev->priv; - emac_t *emacp = fep->emacp; + u32 r = EMAC_RMR_SP | EMAC_RMR_SFCS | EMAC_RMR_IAE | EMAC_RMR_BAE | + EMAC_RMR_BASE; - MDIO_DEBUG(("%s phy_write, id: 0x%x, reg: 0x%x, data: 0x%x\n", - dev->name, mii_id, reg, data)); + if (ndev->flags & IFF_PROMISC) + r |= EMAC_RMR_PME; + else if (ndev->flags & IFF_ALLMULTI || ndev->mc_count > 32) + r |= EMAC_RMR_PMME; + else if (ndev->mc_count > 0) + r |= EMAC_RMR_MAE; - /* Enable proper ZMII port */ - if (fep->zmii_dev) - emac_enable_zmii_port(fep->zmii_dev, fep->zmii_input); + return r; +} - /* Use the EMAC that has the MDIO port */ - if (fep->mdio_dev) { - dev = fep->mdio_dev; - fep = dev->priv; - emacp = fep->emacp; - } +static inline int emac_opb_mhz(void) +{ + return (ocp_sys_info.opb_bus_freq + 500000) / 1000000; +} - count = 0; - while ((((stacr = in_be32(&emacp->em0stacr)) & EMAC_STACR_OC) == 0) - && (count++ < MDIO_DELAY)) - udelay(1); - MDIO_DEBUG((" (count was %d)\n", count)); +/* BHs disabled */ +static int emac_configure(struct ocp_enet_private *dev) +{ + struct emac_regs __iomem *p = dev->emacp; + struct net_device *ndev = dev->ndev; + int gige; + u32 r; - if ((stacr & EMAC_STACR_OC) == 0) { - printk(KERN_WARNING "%s: PHY write timeout #2!\n", dev->name); - return; - } + DBG("%d: configure" NL, dev->def->index); - /* Clear the speed bits and make a read request to the PHY */ + if (emac_reset(dev) < 0) + return -ETIMEDOUT; - stacr = ((EMAC_STACR_WRITE | (reg & 0x1f)) & ~EMAC_STACR_CLK_100MHZ); - stacr |= ((mii_id & 0x1f) << 5) | ((data & 0xffff) << 16); + tah_reset(dev->tah_dev); - out_be32(&emacp->em0stacr, stacr); + /* Mode register */ + r = EMAC_MR1_BASE(emac_opb_mhz()) | EMAC_MR1_VLE | EMAC_MR1_IST; + if (dev->phy.duplex == DUPLEX_FULL) + r |= EMAC_MR1_FDE | EMAC_MR1_MWSW_001; + dev->stop_timeout = STOP_TIMEOUT_10; + switch (dev->phy.speed) { + case SPEED_1000: + if (emac_phy_gpcs(dev->phy.mode)) { + r |= EMAC_MR1_MF_1000GPCS | + EMAC_MR1_MF_IPPA(dev->phy.address); - count = 0; - while ((((stacr = in_be32(&emacp->em0stacr)) & EMAC_STACR_OC) == 0) - && (count++ < MDIO_DELAY)) - udelay(1); - MDIO_DEBUG((" (count was %d)\n", count)); + /* Put some arbitrary OUI, Manuf & Rev IDs so we can + * identify this GPCS PHY later. + */ + out_be32(&p->ipcr, 0xdeadbeef); + } else + r |= EMAC_MR1_MF_1000; + r |= EMAC_MR1_RFS_16K; + gige = 1; + + 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; + gige = 0; + break; + } - if ((stacr & EMAC_STACR_OC) == 0) - printk(KERN_WARNING "%s: PHY write timeout #2!\n", dev->name); + if (dev->rgmii_dev) + rgmii_set_speed(dev->rgmii_dev, dev->rgmii_input, + dev->phy.speed); + else + zmii_set_speed(dev->zmii_dev, dev->zmii_input, dev->phy.speed); - /* Check for a write error */ - if ((stacr & EMAC_STACR_PHYE) != 0) { - MDIO_DEBUG(("EMAC MDIO PHY error !\n")); +#if !defined(CONFIG_40x) + /* on 40x erratum forces us to NOT use integrated flow control, + * let's hope it works on 44x ;) + */ + if (dev->phy.duplex == DUPLEX_FULL) { + if (dev->phy.pause) + r |= EMAC_MR1_EIFC | EMAC_MR1_APP; + else if (dev->phy.asym_pause) + r |= EMAC_MR1_APP; } +#endif + out_be32(&p->mr1, r); + + /* Set individual MAC address */ + out_be32(&p->iahr, (ndev->dev_addr[0] << 8) | ndev->dev_addr[1]); + out_be32(&p->ialr, (ndev->dev_addr[2] << 24) | + (ndev->dev_addr[3] << 16) | (ndev->dev_addr[4] << 8) | + ndev->dev_addr[5]); + + /* VLAN Tag Protocol ID */ + out_be32(&p->vtpid, 0x8100); + + /* Receive mode register */ + r = emac_iff2rmr(ndev); + if (r & EMAC_RMR_MAE) + emac_hash_mc(dev); + out_be32(&p->rmr, r); + + /* FIFOs thresholds */ + r = EMAC_TMR1((EMAC_MAL_BURST_SIZE / EMAC_FIFO_ENTRY_SIZE) + 1, + EMAC_TX_FIFO_SIZE / 2 / EMAC_FIFO_ENTRY_SIZE); + out_be32(&p->tmr1, r); + out_be32(&p->trtr, EMAC_TRTR(EMAC_TX_FIFO_SIZE / 2)); + + /* PAUSE frame is sent when RX FIFO reaches its high-water mark, + there should be still enough space in FIFO to allow the our link + partner time to process this frame and also time to send PAUSE + frame itself. + + Here is the worst case scenario for the RX FIFO "headroom" + (from "The Switch Book") (100Mbps, without preamble, inter-frame gap): + + 1) One maximum-length frame on TX 1522 bytes + 2) One PAUSE frame time 64 bytes + 3) PAUSE frame decode time allowance 64 bytes + 4) One maximum-length frame on RX 1522 bytes + 5) Round-trip propagation delay of the link (100Mb) 15 bytes + ---------- + 3187 bytes + + I chose to set high-water mark to RX_FIFO_SIZE / 4 (1024 bytes) + low-water mark to RX_FIFO_SIZE / 8 (512 bytes) + */ + r = EMAC_RWMR(EMAC_RX_FIFO_SIZE(gige) / 8 / EMAC_FIFO_ENTRY_SIZE, + EMAC_RX_FIFO_SIZE(gige) / 4 / EMAC_FIFO_ENTRY_SIZE); + out_be32(&p->rwmr, r); + + /* Set PAUSE timer to the maximum */ + out_be32(&p->ptr, 0xffff); + + /* IRQ sources */ + out_be32(&p->iser, EMAC_ISR_TXPE | EMAC_ISR_RXPE | /* EMAC_ISR_TXUE | + EMAC_ISR_RXOE | */ EMAC_ISR_OVR | EMAC_ISR_BP | EMAC_ISR_SE | + EMAC_ISR_ALE | EMAC_ISR_BFCS | EMAC_ISR_PTLE | EMAC_ISR_ORE | + EMAC_ISR_IRE | EMAC_ISR_TE); + + /* We need to take GPCS PHY out of isolate mode after EMAC reset */ + if (emac_phy_gpcs(dev->phy.mode)) + mii_reset_phy(&dev->phy); + + return 0; } -static void emac_txeob_dev(void *param, u32 chanmask) +/* BHs disabled */ +static void emac_reinitialize(struct ocp_enet_private *dev) { - struct net_device *dev = param; - struct ocp_enet_private *fep = dev->priv; - unsigned long flags; + DBG("%d: reinitialize" NL, dev->def->index); - spin_lock_irqsave(&fep->lock, flags); + if (!emac_configure(dev)) { + emac_tx_enable(dev); + emac_rx_enable(dev); + } +} - PKT_DEBUG(("emac_txeob_dev() entry, tx_cnt: %d\n", fep->tx_cnt)); +/* BHs disabled */ +static void emac_full_tx_reset(struct net_device *ndev) +{ + struct ocp_enet_private *dev = ndev->priv; + struct ocp_func_emac_data *emacdata = dev->def->additions; - while (fep->tx_cnt && - !(fep->tx_desc[fep->ack_slot].ctrl & MAL_TX_CTRL_READY)) { + DBG("%d: full_tx_reset" NL, dev->def->index); - if (fep->tx_desc[fep->ack_slot].ctrl & MAL_TX_CTRL_LAST) { - /* Tell the system the transmit completed. */ - dma_unmap_single(&fep->ocpdev->dev, - fep->tx_desc[fep->ack_slot].data_ptr, - fep->tx_desc[fep->ack_slot].data_len, - DMA_TO_DEVICE); - dev_kfree_skb_irq(fep->tx_skb[fep->ack_slot]); + emac_tx_disable(dev); + mal_disable_tx_channel(dev->mal, emacdata->mal_tx_chan); + emac_clean_tx_ring(dev); + dev->tx_cnt = dev->tx_slot = dev->ack_slot = 0; - if (fep->tx_desc[fep->ack_slot].ctrl & - (EMAC_TX_ST_EC | EMAC_TX_ST_MC | EMAC_TX_ST_SC)) - fep->stats.collisions++; - } + emac_configure(dev); - fep->tx_skb[fep->ack_slot] = (struct sk_buff *)NULL; - if (++fep->ack_slot == NUM_TX_BUFF) - fep->ack_slot = 0; + mal_enable_tx_channel(dev->mal, emacdata->mal_tx_chan); + emac_tx_enable(dev); + emac_rx_enable(dev); - fep->tx_cnt--; - } - if (fep->tx_cnt < NUM_TX_BUFF) - netif_wake_queue(dev); - - PKT_DEBUG(("emac_txeob_dev() exit, tx_cnt: %d\n", fep->tx_cnt)); - - spin_unlock_irqrestore(&fep->lock, flags); + netif_wake_queue(ndev); } -/* - Fill/Re-fill the rx chain with valid ctrl/ptrs. - This function will fill from rx_slot up to the parm end. - So to completely fill the chain pre-set rx_slot to 0 and - pass in an end of 0. - */ -static void emac_rx_fill(struct net_device *dev, int end) +static int __emac_mdio_read(struct ocp_enet_private *dev, u8 id, u8 reg) { - int i; - struct ocp_enet_private *fep = dev->priv; - - i = fep->rx_slot; - do { - /* We don't want the 16 bytes skb_reserve done by dev_alloc_skb, - * it breaks our cache line alignement. However, we still allocate - * +16 so that we end up allocating the exact same size as - * dev_alloc_skb() would do. - * Also, because of the skb_res, the max DMA size we give to EMAC - * is slighly wrong, causing it to potentially DMA 2 more bytes - * from a broken/oversized packet. These 16 bytes will take care - * that we don't walk on somebody else toes with that. - */ - fep->rx_skb[i] = - alloc_skb(fep->rx_buffer_size + 16, GFP_ATOMIC); - - if (fep->rx_skb[i] == NULL) { - /* Keep rx_slot here, the next time clean/fill is called - * we will try again before the MAL wraps back here - * If the MAL tries to use this descriptor with - * the EMPTY bit off it will cause the - * rxde interrupt. That is where we will - * try again to allocate an sk_buff. - */ - break; + struct emac_regs __iomem *p = dev->emacp; + u32 r; + int n; - } + DBG2("%d: mdio_read(%02x,%02x)" NL, dev->def->index, id, reg); - if (skb_res) - skb_reserve(fep->rx_skb[i], skb_res); + /* Enable proper MDIO port */ + zmii_enable_mdio(dev->zmii_dev, dev->zmii_input); - /* We must NOT dma_map_single the cache line right after the - * buffer, so we must crop our sync size to account for the - * reserved space - */ - fep->rx_desc[i].data_ptr = - (unsigned char *)dma_map_single(&fep->ocpdev->dev, - (void *)fep->rx_skb[i]-> - data, - fep->rx_buffer_size - - skb_res, DMA_FROM_DEVICE); - - /* - * Some 4xx implementations use the previously - * reserved bits in data_len to encode the MS - * 4-bits of a 36-bit physical address (ERPN) - * This must be initialized. - */ - fep->rx_desc[i].data_len = 0; - fep->rx_desc[i].ctrl = MAL_RX_CTRL_EMPTY | MAL_RX_CTRL_INTR | - (i == (NUM_RX_BUFF - 1) ? MAL_RX_CTRL_WRAP : 0); - - } while ((i = (i + 1) % NUM_RX_BUFF) != end); - - fep->rx_slot = i; -} + /* Wait for management interface to become idle */ + n = 10; + while (!emac_phy_done(in_be32(&p->stacr))) { + udelay(1); + if (!--n) + goto to; + } -static void -emac_rx_csum(struct net_device *dev, unsigned short ctrl, struct sk_buff *skb) -{ - struct ocp_enet_private *fep = dev->priv; + /* Issue read command */ + out_be32(&p->stacr, + EMAC_STACR_BASE(emac_opb_mhz()) | EMAC_STACR_STAC_READ | + (reg & EMAC_STACR_PRA_MASK) + | ((id & EMAC_STACR_PCDA_MASK) << EMAC_STACR_PCDA_SHIFT) + | EMAC_STACR_START); - /* Exit if interface has no TAH engine */ - if (!fep->tah_dev) { - skb->ip_summed = CHECKSUM_NONE; - return; + /* Wait for read to complete */ + n = 100; + while (!emac_phy_done(r = in_be32(&p->stacr))) { + udelay(1); + if (!--n) + goto to; } - /* Check for TCP/UDP/IP csum error */ - if (ctrl & EMAC_CSUM_VER_ERROR) { - /* Let the stack verify checksum errors */ - skb->ip_summed = CHECKSUM_NONE; -/* adapter->hw_csum_err++; */ - } else { - /* Csum is good */ - skb->ip_summed = CHECKSUM_UNNECESSARY; -/* adapter->hw_csum_good++; */ + if (unlikely(r & EMAC_STACR_PHYE)) { + DBG("%d: mdio_read(%02x, %02x) failed" NL, dev->def->index, + id, reg); + return -EREMOTEIO; } + + r = ((r >> EMAC_STACR_PHYD_SHIFT) & EMAC_STACR_PHYD_MASK); + DBG2("%d: mdio_read -> %04x" NL, dev->def->index, r); + return r; + to: + DBG("%d: MII management interface timeout (read)" NL, dev->def->index); + return -ETIMEDOUT; } -static int emac_rx_clean(struct net_device *dev) +static void __emac_mdio_write(struct ocp_enet_private *dev, u8 id, u8 reg, + u16 val) { - int i, b, bnum = 0, buf[6]; - int error, frame_length; - struct ocp_enet_private *fep = dev->priv; - unsigned short ctrl; + struct emac_regs __iomem *p = dev->emacp; + int n; - i = fep->rx_slot; + DBG2("%d: mdio_write(%02x,%02x,%04x)" NL, dev->def->index, id, reg, + val); - PKT_DEBUG(("emac_rx_clean() entry, rx_slot: %d\n", fep->rx_slot)); + /* Enable proper MDIO port */ + zmii_enable_mdio(dev->zmii_dev, dev->zmii_input); - do { - if (fep->rx_skb[i] == NULL) - continue; /*we have already handled the packet but haved failed to alloc */ - /* - since rx_desc is in uncached mem we don't keep reading it directly - we pull out a local copy of ctrl and do the checks on the copy. - */ - ctrl = fep->rx_desc[i].ctrl; - if (ctrl & MAL_RX_CTRL_EMPTY) - break; /*we don't have any more ready packets */ - - if (EMAC_IS_BAD_RX_PACKET(ctrl)) { - fep->stats.rx_errors++; - fep->stats.rx_dropped++; - - if (ctrl & EMAC_RX_ST_OE) - fep->stats.rx_fifo_errors++; - if (ctrl & EMAC_RX_ST_AE) - fep->stats.rx_frame_errors++; - if (ctrl & EMAC_RX_ST_BFCS) - fep->stats.rx_crc_errors++; - if (ctrl & (EMAC_RX_ST_RP | EMAC_RX_ST_PTL | - EMAC_RX_ST_ORE | EMAC_RX_ST_IRE)) - fep->stats.rx_length_errors++; - } else { - if ((ctrl & (MAL_RX_CTRL_FIRST | MAL_RX_CTRL_LAST)) == - (MAL_RX_CTRL_FIRST | MAL_RX_CTRL_LAST)) { - /* Single descriptor packet */ - emac_rx_csum(dev, ctrl, fep->rx_skb[i]); - /* Send the skb up the chain. */ - frame_length = fep->rx_desc[i].data_len - 4; - skb_put(fep->rx_skb[i], frame_length); - fep->rx_skb[i]->dev = dev; - fep->rx_skb[i]->protocol = - eth_type_trans(fep->rx_skb[i], dev); - error = netif_rx(fep->rx_skb[i]); - - if ((error == NET_RX_DROP) || - (error == NET_RX_BAD)) { - fep->stats.rx_dropped++; - } else { - fep->stats.rx_packets++; - fep->stats.rx_bytes += frame_length; - } - fep->rx_skb[i] = NULL; - } else { - /* Multiple descriptor packet */ - if (ctrl & MAL_RX_CTRL_FIRST) { - if (fep->rx_desc[(i + 1) % NUM_RX_BUFF]. - ctrl & MAL_RX_CTRL_EMPTY) - break; - bnum = 0; - buf[bnum] = i; - ++bnum; - continue; - } - if (((ctrl & MAL_RX_CTRL_FIRST) != - MAL_RX_CTRL_FIRST) && - ((ctrl & MAL_RX_CTRL_LAST) != - MAL_RX_CTRL_LAST)) { - if (fep->rx_desc[(i + 1) % - NUM_RX_BUFF].ctrl & - MAL_RX_CTRL_EMPTY) { - i = buf[0]; - break; - } - buf[bnum] = i; - ++bnum; - continue; - } - if (ctrl & MAL_RX_CTRL_LAST) { - buf[bnum] = i; - ++bnum; - skb_put(fep->rx_skb[buf[0]], - fep->rx_desc[buf[0]].data_len); - for (b = 1; b < bnum; b++) { - /* - * MAL is braindead, we need - * to copy the remainder - * of the packet from the - * latter descriptor buffers - * to the first skb. Then - * dispose of the source - * skbs. - * - * Once the stack is fixed - * to handle frags on most - * protocols we can generate - * a fragmented skb with - * no copies. - */ - memcpy(fep->rx_skb[buf[0]]-> - data + - fep->rx_skb[buf[0]]->len, - fep->rx_skb[buf[b]]-> - data, - fep->rx_desc[buf[b]]. - data_len); - skb_put(fep->rx_skb[buf[0]], - fep->rx_desc[buf[b]]. - data_len); - dma_unmap_single(&fep->ocpdev-> - dev, - fep-> - rx_desc[buf - [b]]. - data_ptr, - fep-> - rx_desc[buf - [b]]. - data_len, - DMA_FROM_DEVICE); - dev_kfree_skb(fep-> - rx_skb[buf[b]]); - } - emac_rx_csum(dev, ctrl, - fep->rx_skb[buf[0]]); - - fep->rx_skb[buf[0]]->dev = dev; - fep->rx_skb[buf[0]]->protocol = - eth_type_trans(fep->rx_skb[buf[0]], - dev); - error = netif_rx(fep->rx_skb[buf[0]]); - - if ((error == NET_RX_DROP) - || (error == NET_RX_BAD)) { - fep->stats.rx_dropped++; - } else { - fep->stats.rx_packets++; - fep->stats.rx_bytes += - fep->rx_skb[buf[0]]->len; - } - for (b = 0; b < bnum; b++) - fep->rx_skb[buf[b]] = NULL; - } - } - } - } while ((i = (i + 1) % NUM_RX_BUFF) != fep->rx_slot); + /* Wait for management interface to be idle */ + n = 10; + while (!emac_phy_done(in_be32(&p->stacr))) { + udelay(1); + if (!--n) + goto to; + } - PKT_DEBUG(("emac_rx_clean() exit, rx_slot: %d\n", fep->rx_slot)); + /* Issue write command */ + out_be32(&p->stacr, + EMAC_STACR_BASE(emac_opb_mhz()) | EMAC_STACR_STAC_WRITE | + (reg & EMAC_STACR_PRA_MASK) | + ((id & EMAC_STACR_PCDA_MASK) << EMAC_STACR_PCDA_SHIFT) | + (val << EMAC_STACR_PHYD_SHIFT) | EMAC_STACR_START); - return i; + /* Wait for write to complete */ + n = 100; + while (!emac_phy_done(in_be32(&p->stacr))) { + udelay(1); + if (!--n) + goto to; + } + return; + to: + DBG("%d: MII management interface timeout (write)" NL, dev->def->index); } -static void emac_rxeob_dev(void *param, u32 chanmask) +static int emac_mdio_read(struct net_device *ndev, int id, int reg) { - struct net_device *dev = param; - struct ocp_enet_private *fep = dev->priv; - unsigned long flags; - int n; - - spin_lock_irqsave(&fep->lock, flags); - if ((n = emac_rx_clean(dev)) != fep->rx_slot) - emac_rx_fill(dev, n); - spin_unlock_irqrestore(&fep->lock, flags); + struct ocp_enet_private *dev = ndev->priv; + int res; + + local_bh_disable(); + res = __emac_mdio_read(dev->mdio_dev ? dev->mdio_dev : dev, (u8) id, + (u8) reg); + local_bh_enable(); + return res; } -/* - * This interrupt should never occurr, we don't program - * the MAL for contiunous mode. - */ -static void emac_txde_dev(void *param, u32 chanmask) +static void emac_mdio_write(struct net_device *ndev, int id, int reg, int val) { - struct net_device *dev = param; - struct ocp_enet_private *fep = dev->priv; - - printk(KERN_WARNING "%s: transmit descriptor error\n", dev->name); + struct ocp_enet_private *dev = ndev->priv; - emac_mac_dump(dev); - emac_mal_dump(dev); + local_bh_disable(); + __emac_mdio_write(dev->mdio_dev ? dev->mdio_dev : dev, (u8) id, + (u8) reg, (u16) val); + local_bh_enable(); +} - /* Reenable the transmit channel */ - mal_enable_tx_channels(fep->mal, fep->commac.tx_chan_mask); +/* BHs disabled */ +static void emac_set_multicast_list(struct net_device *ndev) +{ + struct ocp_enet_private *dev = ndev->priv; + struct emac_regs __iomem *p = dev->emacp; + u32 rmr = emac_iff2rmr(ndev); + + DBG("%d: multicast %08x" NL, dev->def->index, rmr); + BUG_ON(!netif_running(dev->ndev)); + + /* I decided to relax register access rules here to avoid + * full EMAC reset. + * + * There is a real problem with EMAC4 core if we use MWSW_001 bit + * in MR1 register and do a full EMAC reset. + * One TX BD status update is delayed and, after EMAC reset, it + * never happens, resulting in TX hung (it'll be recovered by TX + * timeout handler eventually, but this is just gross). + * So we either have to do full TX reset or try to cheat here :) + * + * The only required change is to RX mode register, so I *think* all + * we need is just to stop RX channel. This seems to work on all + * tested SoCs. --ebs + */ + emac_rx_disable(dev); + if (rmr & EMAC_RMR_MAE) + emac_hash_mc(dev); + out_be32(&p->rmr, rmr); + emac_rx_enable(dev); } -/* - * This interrupt should be very rare at best. This occurs when - * the hardware has a problem with the receive descriptors. The manual - * states that it occurs when the hardware cannot the receive descriptor - * empty bit is not set. The recovery mechanism will be to - * traverse through the descriptors, handle any that are marked to be - * handled and reinitialize each along the way. At that point the driver - * will be restarted. - */ -static void emac_rxde_dev(void *param, u32 chanmask) +/* BHs disabled */ +static int emac_resize_rx_ring(struct ocp_enet_private *dev, int new_mtu) { - struct net_device *dev = param; - struct ocp_enet_private *fep = dev->priv; - unsigned long flags; + struct ocp_func_emac_data *emacdata = dev->def->additions; + int rx_sync_size = emac_rx_sync_size(new_mtu); + int rx_skb_size = emac_rx_skb_size(new_mtu); + int i, ret = 0; + + emac_rx_disable(dev); + mal_disable_rx_channel(dev->mal, emacdata->mal_rx_chan); + + if (dev->rx_sg_skb) { + ++dev->estats.rx_dropped_resize; + dev_kfree_skb(dev->rx_sg_skb); + dev->rx_sg_skb = NULL; + } - if (net_ratelimit()) { - printk(KERN_WARNING "%s: receive descriptor error\n", - fep->ndev->name); + /* Make a first pass over RX ring and mark BDs ready, dropping + * non-processed packets on the way. We need this as a separate pass + * to simplify error recovery in the case of allocation failure later. + */ + for (i = 0; i < NUM_RX_BUFF; ++i) { + if (dev->rx_desc[i].ctrl & MAL_RX_CTRL_FIRST) + ++dev->estats.rx_dropped_resize; - emac_mac_dump(dev); - emac_mal_dump(dev); - emac_desc_dump(dev); + dev->rx_desc[i].data_len = 0; + dev->rx_desc[i].ctrl = MAL_RX_CTRL_EMPTY | + (i == (NUM_RX_BUFF - 1) ? MAL_RX_CTRL_WRAP : 0); } - /* Disable RX channel */ - spin_lock_irqsave(&fep->lock, flags); - mal_disable_rx_channels(fep->mal, fep->commac.rx_chan_mask); - - /* For now, charge the error against all emacs */ - fep->stats.rx_errors++; + /* Reallocate RX ring only if bigger skb buffers are required */ + if (rx_skb_size <= dev->rx_skb_size) + goto skip; - /* so do we have any good packets still? */ - emac_rx_clean(dev); + /* Second pass, allocate new skbs */ + for (i = 0; i < NUM_RX_BUFF; ++i) { + struct sk_buff *skb = alloc_skb(rx_skb_size, GFP_ATOMIC); + if (!skb) { + ret = -ENOMEM; + goto oom; + } - /* When the interface is restarted it resets processing to the - * first descriptor in the table. - */ + BUG_ON(!dev->rx_skb[i]); + dev_kfree_skb(dev->rx_skb[i]); - fep->rx_slot = 0; - emac_rx_fill(dev, 0); + skb_reserve(skb, EMAC_RX_SKB_HEADROOM + 2); + dev->rx_desc[i].data_ptr = + dma_map_single(dev->ldev, skb->data - 2, rx_sync_size, + DMA_FROM_DEVICE) + 2; + dev->rx_skb[i] = skb; + } + skip: + /* Check if we need to change "Jumbo" bit in MR1 */ + if ((new_mtu > ETH_DATA_LEN) ^ (dev->ndev->mtu > ETH_DATA_LEN)) { + /* This is to prevent starting RX channel in emac_rx_enable() */ + dev->commac.rx_stopped = 1; + + dev->ndev->mtu = new_mtu; + emac_full_tx_reset(dev->ndev); + } - set_mal_dcrn(fep->mal, DCRN_MALRXEOBISR, fep->commac.rx_chan_mask); - set_mal_dcrn(fep->mal, DCRN_MALRXDEIR, fep->commac.rx_chan_mask); + mal_set_rcbs(dev->mal, emacdata->mal_rx_chan, emac_rx_size(new_mtu)); + oom: + /* Restart RX */ + dev->commac.rx_stopped = dev->rx_slot = 0; + mal_enable_rx_channel(dev->mal, emacdata->mal_rx_chan); + emac_rx_enable(dev); - /* Reenable the receive channels */ - mal_enable_rx_channels(fep->mal, fep->commac.rx_chan_mask); - spin_unlock_irqrestore(&fep->lock, flags); + return ret; } -static irqreturn_t -emac_mac_irq(int irq, void *dev_instance, struct pt_regs *regs) +/* Process ctx, rtnl_lock semaphore */ +static int emac_change_mtu(struct net_device *ndev, int new_mtu) { - struct net_device *dev = dev_instance; - struct ocp_enet_private *fep = dev->priv; - emac_t *emacp = fep->emacp; - unsigned long tmp_em0isr; + struct ocp_enet_private *dev = ndev->priv; + int ret = 0; - /* EMAC interrupt */ - tmp_em0isr = in_be32(&emacp->em0isr); - if (tmp_em0isr & (EMAC_ISR_TE0 | EMAC_ISR_TE1)) { - /* This error is a hard transmit error - could retransmit */ - fep->stats.tx_errors++; + if (new_mtu < EMAC_MIN_MTU || new_mtu > EMAC_MAX_MTU) + return -EINVAL; - /* Reenable the transmit channel */ - mal_enable_tx_channels(fep->mal, fep->commac.tx_chan_mask); + DBG("%d: change_mtu(%d)" NL, dev->def->index, new_mtu); - } else { - fep->stats.rx_errors++; + local_bh_disable(); + if (netif_running(ndev)) { + /* Check if we really need to reinitalize RX ring */ + if (emac_rx_skb_size(ndev->mtu) != emac_rx_skb_size(new_mtu)) + ret = emac_resize_rx_ring(dev, new_mtu); } - if (tmp_em0isr & EMAC_ISR_RP) - fep->stats.rx_length_errors++; - if (tmp_em0isr & EMAC_ISR_ALE) - fep->stats.rx_frame_errors++; - if (tmp_em0isr & EMAC_ISR_BFCS) - fep->stats.rx_crc_errors++; - if (tmp_em0isr & EMAC_ISR_PTLE) - fep->stats.rx_length_errors++; - if (tmp_em0isr & EMAC_ISR_ORE) - fep->stats.rx_length_errors++; - if (tmp_em0isr & EMAC_ISR_TE0) - fep->stats.tx_aborted_errors++; - - emac_err_dump(dev, tmp_em0isr); + if (!ret) { + ndev->mtu = new_mtu; + dev->rx_skb_size = emac_rx_skb_size(new_mtu); + dev->rx_sync_size = emac_rx_sync_size(new_mtu); + } + local_bh_enable(); - out_be32(&emacp->em0isr, tmp_em0isr); - - return IRQ_HANDLED; + return ret; } -static int emac_start_xmit(struct sk_buff *skb, struct net_device *dev) +static void emac_clean_tx_ring(struct ocp_enet_private *dev) { - unsigned short ctrl; - unsigned long flags; - struct ocp_enet_private *fep = dev->priv; - emac_t *emacp = fep->emacp; - int len = skb->len; - unsigned int offset = 0, size, f, tx_slot_first; - unsigned int nr_frags = skb_shinfo(skb)->nr_frags; - - spin_lock_irqsave(&fep->lock, flags); - - len -= skb->data_len; - - if ((fep->tx_cnt + nr_frags + len / DESC_BUF_SIZE + 1) > NUM_TX_BUFF) { - PKT_DEBUG(("emac_start_xmit() stopping queue\n")); - netif_stop_queue(dev); - spin_unlock_irqrestore(&fep->lock, flags); - return -EBUSY; + int i; + for (i = 0; i < NUM_TX_BUFF; ++i) { + if (dev->tx_skb[i]) { + dev_kfree_skb(dev->tx_skb[i]); + dev->tx_skb[i] = NULL; + if (dev->tx_desc[i].ctrl & MAL_TX_CTRL_READY) + ++dev->estats.tx_dropped; + } + dev->tx_desc[i].ctrl = 0; + dev->tx_desc[i].data_ptr = 0; } +} - tx_slot_first = fep->tx_slot; +static void emac_clean_rx_ring(struct ocp_enet_private *dev) +{ + int i; + for (i = 0; i < NUM_RX_BUFF; ++i) + if (dev->rx_skb[i]) { + dev->rx_desc[i].ctrl = 0; + dev_kfree_skb(dev->rx_skb[i]); + dev->rx_skb[i] = NULL; + dev->rx_desc[i].data_ptr = 0; + } - while (len) { - size = min(len, DESC_BUF_SIZE); + if (dev->rx_sg_skb) { + dev_kfree_skb(dev->rx_sg_skb); + dev->rx_sg_skb = NULL; + } +} - fep->tx_desc[fep->tx_slot].data_len = (short)size; - fep->tx_desc[fep->tx_slot].data_ptr = - (unsigned char *)dma_map_single(&fep->ocpdev->dev, - (void *)((unsigned int)skb-> - data + offset), - size, DMA_TO_DEVICE); +static inline int emac_alloc_rx_skb(struct ocp_enet_private *dev, int slot, + gfp_t flags) +{ + struct sk_buff *skb = alloc_skb(dev->rx_skb_size, flags); + if (unlikely(!skb)) + return -ENOMEM; - ctrl = EMAC_TX_CTRL_DFLT; - if (fep->tx_slot != tx_slot_first) - ctrl |= MAL_TX_CTRL_READY; - if ((NUM_TX_BUFF - 1) == fep->tx_slot) - ctrl |= MAL_TX_CTRL_WRAP; - if (!nr_frags && (len == size)) { - ctrl |= MAL_TX_CTRL_LAST; - fep->tx_skb[fep->tx_slot] = skb; - } - if (skb->ip_summed == CHECKSUM_HW) - ctrl |= EMAC_TX_CTRL_TAH_CSUM; + dev->rx_skb[slot] = skb; + dev->rx_desc[slot].data_len = 0; - fep->tx_desc[fep->tx_slot].ctrl = ctrl; + skb_reserve(skb, EMAC_RX_SKB_HEADROOM + 2); + dev->rx_desc[slot].data_ptr = + dma_map_single(dev->ldev, skb->data - 2, dev->rx_sync_size, + DMA_FROM_DEVICE) + 2; + barrier(); + dev->rx_desc[slot].ctrl = MAL_RX_CTRL_EMPTY | + (slot == (NUM_RX_BUFF - 1) ? MAL_RX_CTRL_WRAP : 0); - len -= size; - offset += size; + return 0; +} - /* Bump tx count */ - if (++fep->tx_cnt == NUM_TX_BUFF) - netif_stop_queue(dev); +static void emac_print_link_status(struct ocp_enet_private *dev) +{ + if (netif_carrier_ok(dev->ndev)) + printk(KERN_INFO "%s: link is up, %d %s%s\n", + dev->ndev->name, dev->phy.speed, + dev->phy.duplex == DUPLEX_FULL ? "FDX" : "HDX", + dev->phy.pause ? ", pause enabled" : + dev->phy.asym_pause ? ", assymetric pause enabled" : ""); + else + printk(KERN_INFO "%s: link is down\n", dev->ndev->name); +} - /* Next descriptor */ - if (++fep->tx_slot == NUM_TX_BUFF) - fep->tx_slot = 0; +/* Process ctx, rtnl_lock semaphore */ +static int emac_open(struct net_device *ndev) +{ + struct ocp_enet_private *dev = ndev->priv; + struct ocp_func_emac_data *emacdata = dev->def->additions; + int err, i; + + DBG("%d: open" NL, dev->def->index); + + /* Setup error IRQ handler */ + err = request_irq(dev->def->irq, emac_irq, 0, "EMAC", dev); + if (err) { + printk(KERN_ERR "%s: failed to request IRQ %d\n", + ndev->name, dev->def->irq); + return err; } - for (f = 0; f < nr_frags; f++) { - struct skb_frag_struct *frag; + /* Allocate RX ring */ + for (i = 0; i < NUM_RX_BUFF; ++i) + if (emac_alloc_rx_skb(dev, i, GFP_KERNEL)) { + printk(KERN_ERR "%s: failed to allocate RX ring\n", + ndev->name); + goto oom; + } - frag = &skb_shinfo(skb)->frags[f]; - len = frag->size; - offset = 0; - - while (len) { - size = min(len, DESC_BUF_SIZE); - - dma_map_page(&fep->ocpdev->dev, - frag->page, - frag->page_offset + offset, - size, DMA_TO_DEVICE); - - ctrl = EMAC_TX_CTRL_DFLT | MAL_TX_CTRL_READY; - if ((NUM_TX_BUFF - 1) == fep->tx_slot) - ctrl |= MAL_TX_CTRL_WRAP; - if ((f == (nr_frags - 1)) && (len == size)) { - ctrl |= MAL_TX_CTRL_LAST; - fep->tx_skb[fep->tx_slot] = skb; - } + local_bh_disable(); + dev->tx_cnt = dev->tx_slot = dev->ack_slot = dev->rx_slot = + dev->commac.rx_stopped = 0; + dev->rx_sg_skb = NULL; + + if (dev->phy.address >= 0) { + int link_poll_interval; + if (dev->phy.def->ops->poll_link(&dev->phy)) { + dev->phy.def->ops->read_link(&dev->phy); + EMAC_RX_CLK_DEFAULT(dev->def->index); + netif_carrier_on(dev->ndev); + link_poll_interval = PHY_POLL_LINK_ON; + } else { + EMAC_RX_CLK_TX(dev->def->index); + netif_carrier_off(dev->ndev); + link_poll_interval = PHY_POLL_LINK_OFF; + } + mod_timer(&dev->link_timer, jiffies + link_poll_interval); + emac_print_link_status(dev); + } else + netif_carrier_on(dev->ndev); + + emac_configure(dev); + mal_poll_add(dev->mal, &dev->commac); + mal_enable_tx_channel(dev->mal, emacdata->mal_tx_chan); + mal_set_rcbs(dev->mal, emacdata->mal_rx_chan, emac_rx_size(ndev->mtu)); + mal_enable_rx_channel(dev->mal, emacdata->mal_rx_chan); + emac_tx_enable(dev); + emac_rx_enable(dev); + netif_start_queue(ndev); + local_bh_enable(); - if (skb->ip_summed == CHECKSUM_HW) - ctrl |= EMAC_TX_CTRL_TAH_CSUM; + return 0; + oom: + emac_clean_rx_ring(dev); + free_irq(dev->def->irq, dev); + return -ENOMEM; +} - fep->tx_desc[fep->tx_slot].data_len = (short)size; - fep->tx_desc[fep->tx_slot].data_ptr = - (char *)((page_to_pfn(frag->page) << PAGE_SHIFT) + - frag->page_offset + offset); - fep->tx_desc[fep->tx_slot].ctrl = ctrl; +/* BHs disabled */ +static int emac_link_differs(struct ocp_enet_private *dev) +{ + u32 r = in_be32(&dev->emacp->mr1); - len -= size; - offset += size; + int duplex = r & EMAC_MR1_FDE ? DUPLEX_FULL : DUPLEX_HALF; + int speed, pause, asym_pause; - /* Bump tx count */ - if (++fep->tx_cnt == NUM_TX_BUFF) - netif_stop_queue(dev); + if (r & (EMAC_MR1_MF_1000 | EMAC_MR1_MF_1000GPCS)) + speed = SPEED_1000; + else if (r & EMAC_MR1_MF_100) + speed = SPEED_100; + else + speed = SPEED_10; - /* Next descriptor */ - if (++fep->tx_slot == NUM_TX_BUFF) - fep->tx_slot = 0; - } + switch (r & (EMAC_MR1_EIFC | EMAC_MR1_APP)) { + case (EMAC_MR1_EIFC | EMAC_MR1_APP): + pause = 1; + asym_pause = 0; + break; + case EMAC_MR1_APP: + pause = 0; + asym_pause = 1; + break; + default: + pause = asym_pause = 0; } + return speed != dev->phy.speed || duplex != dev->phy.duplex || + pause != dev->phy.pause || asym_pause != dev->phy.asym_pause; +} - /* - * Deferred set READY on first descriptor of packet to - * avoid TX MAL race. - */ - fep->tx_desc[tx_slot_first].ctrl |= MAL_TX_CTRL_READY; +/* BHs disabled */ +static void emac_link_timer(unsigned long data) +{ + struct ocp_enet_private *dev = (struct ocp_enet_private *)data; + int link_poll_interval; - /* Send the packet out. */ - out_be32(&emacp->em0tmr0, EMAC_TMR0_XMIT); + DBG2("%d: link timer" NL, dev->def->index); - fep->stats.tx_packets++; - fep->stats.tx_bytes += skb->len; + if (dev->phy.def->ops->poll_link(&dev->phy)) { + if (!netif_carrier_ok(dev->ndev)) { + EMAC_RX_CLK_DEFAULT(dev->def->index); - PKT_DEBUG(("emac_start_xmit() exitn")); + /* Get new link parameters */ + dev->phy.def->ops->read_link(&dev->phy); - spin_unlock_irqrestore(&fep->lock, flags); + if (dev->tah_dev || emac_link_differs(dev)) + emac_full_tx_reset(dev->ndev); - return 0; + netif_carrier_on(dev->ndev); + emac_print_link_status(dev); + } + link_poll_interval = PHY_POLL_LINK_ON; + } else { + if (netif_carrier_ok(dev->ndev)) { + EMAC_RX_CLK_TX(dev->def->index); +#if defined(CONFIG_IBM_EMAC_PHY_RX_CLK_FIX) + emac_reinitialize(dev); +#endif + netif_carrier_off(dev->ndev); + emac_print_link_status(dev); + } + + /* Retry reset if the previous attempt failed. + * This is needed mostly for CONFIG_IBM_EMAC_PHY_RX_CLK_FIX + * case, but I left it here because it shouldn't trigger for + * sane PHYs anyway. + */ + if (unlikely(dev->reset_failed)) + emac_reinitialize(dev); + + link_poll_interval = PHY_POLL_LINK_OFF; + } + mod_timer(&dev->link_timer, jiffies + link_poll_interval); } -static int emac_adjust_to_link(struct ocp_enet_private *fep) +/* BHs disabled */ +static void emac_force_link_update(struct ocp_enet_private *dev) { - emac_t *emacp = fep->emacp; - unsigned long mode_reg; - int full_duplex, speed; + netif_carrier_off(dev->ndev); + if (timer_pending(&dev->link_timer)) + mod_timer(&dev->link_timer, jiffies + PHY_POLL_LINK_OFF); +} - full_duplex = 0; - speed = SPEED_10; +/* Process ctx, rtnl_lock semaphore */ +static int emac_close(struct net_device *ndev) +{ + struct ocp_enet_private *dev = ndev->priv; + struct ocp_func_emac_data *emacdata = dev->def->additions; - /* set mode register 1 defaults */ - mode_reg = EMAC_M1_DEFAULT; + DBG("%d: close" NL, dev->def->index); - /* Read link mode on PHY */ - if (fep->phy_mii.def->ops->read_link(&fep->phy_mii) == 0) { - /* If an error occurred, we don't deal with it yet */ - full_duplex = (fep->phy_mii.duplex == DUPLEX_FULL); - speed = fep->phy_mii.speed; - } + local_bh_disable(); + if (dev->phy.address >= 0) + del_timer_sync(&dev->link_timer); - /* set speed (default is 10Mb) */ - switch (speed) { - case SPEED_1000: - mode_reg |= EMAC_M1_RFS_16K; - if (fep->rgmii_dev) { - struct ibm_ocp_rgmii *rgmii = RGMII_PRIV(fep->rgmii_dev); - - if ((rgmii->mode[fep->rgmii_input] == RTBI) - || (rgmii->mode[fep->rgmii_input] == TBI)) - mode_reg |= EMAC_M1_MF_1000GPCS; - else - mode_reg |= EMAC_M1_MF_1000MBPS; - - emac_rgmii_port_speed(fep->rgmii_dev, fep->rgmii_input, - 1000); - } - break; - case SPEED_100: - mode_reg |= EMAC_M1_MF_100MBPS | EMAC_M1_RFS_4K; - if (fep->rgmii_dev) - emac_rgmii_port_speed(fep->rgmii_dev, fep->rgmii_input, - 100); - if (fep->zmii_dev) - emac_zmii_port_speed(fep->zmii_dev, fep->zmii_input, - 100); - break; - case SPEED_10: - default: - mode_reg = (mode_reg & ~EMAC_M1_MF_100MBPS) | EMAC_M1_RFS_4K; - if (fep->rgmii_dev) - emac_rgmii_port_speed(fep->rgmii_dev, fep->rgmii_input, - 10); - if (fep->zmii_dev) - emac_zmii_port_speed(fep->zmii_dev, fep->zmii_input, - 10); - } + netif_stop_queue(ndev); + emac_rx_disable(dev); + emac_tx_disable(dev); + mal_disable_rx_channel(dev->mal, emacdata->mal_rx_chan); + mal_disable_tx_channel(dev->mal, emacdata->mal_tx_chan); + mal_poll_del(dev->mal, &dev->commac); + local_bh_enable(); - if (full_duplex) - mode_reg |= EMAC_M1_FDE | EMAC_M1_EIFC | EMAC_M1_IST; - else - mode_reg &= ~(EMAC_M1_FDE | EMAC_M1_EIFC | EMAC_M1_ILE); - - LINK_DEBUG(("%s: adjust to link, speed: %d, duplex: %d, opened: %d\n", - fep->ndev->name, speed, full_duplex, fep->opened)); + emac_clean_tx_ring(dev); + emac_clean_rx_ring(dev); + free_irq(dev->def->irq, dev); - printk(KERN_INFO "%s: Speed: %d, %s duplex.\n", - fep->ndev->name, speed, full_duplex ? "Full" : "Half"); - if (fep->opened) - out_be32(&emacp->em0mr1, mode_reg); + return 0; +} +static inline u16 emac_tx_csum(struct ocp_enet_private *dev, + struct sk_buff *skb) +{ +#if defined(CONFIG_IBM_EMAC_TAH) + if (skb->ip_summed == CHECKSUM_HW) { + ++dev->stats.tx_packets_csum; + return EMAC_TX_CTRL_TAH_CSUM; + } +#endif return 0; } -static int emac_set_mac_address(struct net_device *ndev, void *p) +static inline int emac_xmit_finish(struct ocp_enet_private *dev, int len) { - struct ocp_enet_private *fep = ndev->priv; - emac_t *emacp = fep->emacp; - struct sockaddr *addr = p; - - if (!is_valid_ether_addr(addr->sa_data)) - return -EADDRNOTAVAIL; + struct emac_regs __iomem *p = dev->emacp; + struct net_device *ndev = dev->ndev; - memcpy(ndev->dev_addr, addr->sa_data, ndev->addr_len); + /* Send the packet out */ + out_be32(&p->tmr0, EMAC_TMR0_XMIT); - /* set the high address */ - out_be32(&emacp->em0iahr, - (fep->ndev->dev_addr[0] << 8) | fep->ndev->dev_addr[1]); + if (unlikely(++dev->tx_cnt == NUM_TX_BUFF)) { + netif_stop_queue(ndev); + DBG2("%d: stopped TX queue" NL, dev->def->index); + } - /* set the low address */ - out_be32(&emacp->em0ialr, - (fep->ndev->dev_addr[2] << 24) | (fep->ndev->dev_addr[3] << 16) - | (fep->ndev->dev_addr[4] << 8) | fep->ndev->dev_addr[5]); + ndev->trans_start = jiffies; + ++dev->stats.tx_packets; + dev->stats.tx_bytes += len; return 0; } -static int emac_change_mtu(struct net_device *dev, int new_mtu) +/* BHs disabled */ +static int emac_start_xmit(struct sk_buff *skb, struct net_device *ndev) { - struct ocp_enet_private *fep = dev->priv; - int old_mtu = dev->mtu; - unsigned long mode_reg; - emac_t *emacp = fep->emacp; - u32 em0mr0; - int i, full; - unsigned long flags; - - if ((new_mtu < EMAC_MIN_MTU) || (new_mtu > EMAC_MAX_MTU)) { - printk(KERN_ERR - "emac: Invalid MTU setting, MTU must be between %d and %d\n", - EMAC_MIN_MTU, EMAC_MAX_MTU); - return -EINVAL; - } - - if (old_mtu != new_mtu && netif_running(dev)) { - /* Stop rx engine */ - em0mr0 = in_be32(&emacp->em0mr0); - out_be32(&emacp->em0mr0, em0mr0 & ~EMAC_M0_RXE); - - /* Wait for descriptors to be empty */ - do { - full = 0; - for (i = 0; i < NUM_RX_BUFF; i++) - if (!(fep->rx_desc[i].ctrl & MAL_RX_CTRL_EMPTY)) { - printk(KERN_NOTICE - "emac: RX ring is still full\n"); - full = 1; - } - } while (full); - - spin_lock_irqsave(&fep->lock, flags); - - mal_disable_rx_channels(fep->mal, fep->commac.rx_chan_mask); - - /* Destroy all old rx skbs */ - for (i = 0; i < NUM_RX_BUFF; i++) { - dma_unmap_single(&fep->ocpdev->dev, - fep->rx_desc[i].data_ptr, - fep->rx_desc[i].data_len, - DMA_FROM_DEVICE); - dev_kfree_skb(fep->rx_skb[i]); - fep->rx_skb[i] = NULL; - } + struct ocp_enet_private *dev = ndev->priv; + unsigned int len = skb->len; + int slot; - /* Set new rx_buffer_size, jumbo cap, and advertise new mtu */ - mode_reg = in_be32(&emacp->em0mr1); - if (new_mtu > ENET_DEF_MTU_SIZE) { - mode_reg |= EMAC_M1_JUMBO_ENABLE; - fep->rx_buffer_size = EMAC_MAX_FRAME; - } else { - mode_reg &= ~EMAC_M1_JUMBO_ENABLE; - fep->rx_buffer_size = ENET_DEF_BUF_SIZE; - } - dev->mtu = new_mtu; - out_be32(&emacp->em0mr1, mode_reg); + u16 ctrl = EMAC_TX_CTRL_GFCS | EMAC_TX_CTRL_GP | MAL_TX_CTRL_READY | + MAL_TX_CTRL_LAST | emac_tx_csum(dev, skb); - /* Re-init rx skbs */ - fep->rx_slot = 0; - emac_rx_fill(dev, 0); + slot = dev->tx_slot++; + if (dev->tx_slot == NUM_TX_BUFF) { + dev->tx_slot = 0; + ctrl |= MAL_TX_CTRL_WRAP; + } - /* Restart the rx engine */ - mal_enable_rx_channels(fep->mal, fep->commac.rx_chan_mask); - out_be32(&emacp->em0mr0, em0mr0 | EMAC_M0_RXE); + DBG2("%d: xmit(%u) %d" NL, dev->def->index, len, slot); - spin_unlock_irqrestore(&fep->lock, flags); - } + dev->tx_skb[slot] = skb; + dev->tx_desc[slot].data_ptr = dma_map_single(dev->ldev, skb->data, len, + DMA_TO_DEVICE); + dev->tx_desc[slot].data_len = (u16) len; + barrier(); + dev->tx_desc[slot].ctrl = ctrl; - return 0; + return emac_xmit_finish(dev, len); } -static void __emac_set_multicast_list(struct net_device *dev) +#if defined(CONFIG_IBM_EMAC_TAH) +static inline int emac_xmit_split(struct ocp_enet_private *dev, int slot, + u32 pd, int len, int last, u16 base_ctrl) { - struct ocp_enet_private *fep = dev->priv; - emac_t *emacp = fep->emacp; - u32 rmr = in_be32(&emacp->em0rmr); + while (1) { + u16 ctrl = base_ctrl; + int chunk = min(len, MAL_MAX_TX_SIZE); + len -= chunk; - /* First clear all special bits, they can be set later */ - rmr &= ~(EMAC_RMR_PME | EMAC_RMR_PMME | EMAC_RMR_MAE); + slot = (slot + 1) % NUM_TX_BUFF; - if (dev->flags & IFF_PROMISC) { - rmr |= EMAC_RMR_PME; - } else if (dev->flags & IFF_ALLMULTI || 32 < dev->mc_count) { - /* - * Must be setting up to use multicast - * Now check for promiscuous multicast - */ - rmr |= EMAC_RMR_PMME; - } else if (dev->flags & IFF_MULTICAST && 0 < dev->mc_count) { - unsigned short em0gaht[4] = { 0, 0, 0, 0 }; - struct dev_mc_list *dmi; - - /* Need to hash on the multicast address. */ - for (dmi = dev->mc_list; dmi; dmi = dmi->next) { - unsigned long mc_crc; - unsigned int bit_number; - - mc_crc = ether_crc(6, (char *)dmi->dmi_addr); - bit_number = 63 - (mc_crc >> 26); /* MSB: 0 LSB: 63 */ - em0gaht[bit_number >> 4] |= - 0x8000 >> (bit_number & 0x0f); - } - emacp->em0gaht1 = em0gaht[0]; - emacp->em0gaht2 = em0gaht[1]; - emacp->em0gaht3 = em0gaht[2]; - emacp->em0gaht4 = em0gaht[3]; + if (last && !len) + ctrl |= MAL_TX_CTRL_LAST; + if (slot == NUM_TX_BUFF - 1) + ctrl |= MAL_TX_CTRL_WRAP; - /* Turn on multicast addressing */ - rmr |= EMAC_RMR_MAE; + dev->tx_skb[slot] = NULL; + dev->tx_desc[slot].data_ptr = pd; + dev->tx_desc[slot].data_len = (u16) chunk; + dev->tx_desc[slot].ctrl = ctrl; + ++dev->tx_cnt; + + if (!len) + break; + + pd += chunk; } - out_be32(&emacp->em0rmr, rmr); + return slot; } -static int emac_init_tah(struct ocp_enet_private *fep) +/* BHs disabled (SG version for TAH equipped EMACs) */ +static int emac_start_xmit_sg(struct sk_buff *skb, struct net_device *ndev) { - tah_t *tahp; + struct ocp_enet_private *dev = ndev->priv; + int nr_frags = skb_shinfo(skb)->nr_frags; + int len = skb->len, chunk; + int slot, i; + u16 ctrl; + u32 pd; + + /* This is common "fast" path */ + if (likely(!nr_frags && len <= MAL_MAX_TX_SIZE)) + return emac_start_xmit(skb, ndev); - /* Initialize TAH and enable checksum verification */ - tahp = (tah_t *) ioremap(fep->tah_dev->def->paddr, sizeof(*tahp)); + len -= skb->data_len; - if (tahp == NULL) { - printk(KERN_ERR "tah%d: Cannot ioremap TAH registers!\n", - fep->tah_dev->def->index); + /* Note, this is only an *estimation*, we can still run out of empty + * slots because of the additional fragmentation into + * MAL_MAX_TX_SIZE-sized chunks + */ + if (unlikely(dev->tx_cnt + nr_frags + mal_tx_chunks(len) > NUM_TX_BUFF)) + goto stop_queue; + + ctrl = EMAC_TX_CTRL_GFCS | EMAC_TX_CTRL_GP | MAL_TX_CTRL_READY | + emac_tx_csum(dev, skb); + slot = dev->tx_slot; + + /* skb data */ + dev->tx_skb[slot] = NULL; + chunk = min(len, MAL_MAX_TX_SIZE); + dev->tx_desc[slot].data_ptr = pd = + dma_map_single(dev->ldev, skb->data, len, DMA_TO_DEVICE); + dev->tx_desc[slot].data_len = (u16) chunk; + len -= chunk; + if (unlikely(len)) + slot = emac_xmit_split(dev, slot, pd + chunk, len, !nr_frags, + ctrl); + /* skb fragments */ + for (i = 0; i < nr_frags; ++i) { + struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[i]; + len = frag->size; - return -ENOMEM; + if (unlikely(dev->tx_cnt + mal_tx_chunks(len) >= NUM_TX_BUFF)) + goto undo_frame; + + pd = dma_map_page(dev->ldev, frag->page, frag->page_offset, len, + DMA_TO_DEVICE); + + slot = emac_xmit_split(dev, slot, pd, len, i == nr_frags - 1, + ctrl); } - out_be32(&tahp->tah_mr, TAH_MR_SR); + DBG2("%d: xmit_sg(%u) %d - %d" NL, dev->def->index, skb->len, + dev->tx_slot, slot); - /* wait for reset to complete */ - while (in_be32(&tahp->tah_mr) & TAH_MR_SR) ; + /* Attach skb to the last slot so we don't release it too early */ + dev->tx_skb[slot] = skb; - /* 10KB TAH TX FIFO accomodates the max MTU of 9000 */ - out_be32(&tahp->tah_mr, - TAH_MR_CVR | TAH_MR_ST_768 | TAH_MR_TFS_10KB | TAH_MR_DTFP | - TAH_MR_DIG); + /* Send the packet out */ + if (dev->tx_slot == NUM_TX_BUFF - 1) + ctrl |= MAL_TX_CTRL_WRAP; + barrier(); + dev->tx_desc[dev->tx_slot].ctrl = ctrl; + dev->tx_slot = (slot + 1) % NUM_TX_BUFF; - iounmap(&tahp); + return emac_xmit_finish(dev, skb->len); - return 0; + undo_frame: + /* Well, too bad. Our previous estimation was overly optimistic. + * Undo everything. + */ + while (slot != dev->tx_slot) { + dev->tx_desc[slot].ctrl = 0; + --dev->tx_cnt; + if (--slot < 0) + slot = NUM_TX_BUFF - 1; + } + ++dev->estats.tx_undo; + + stop_queue: + netif_stop_queue(ndev); + DBG2("%d: stopped TX queue" NL, dev->def->index); + return 1; +} +#else +# define emac_start_xmit_sg emac_start_xmit +#endif /* !defined(CONFIG_IBM_EMAC_TAH) */ + +/* BHs disabled */ +static void emac_parse_tx_error(struct ocp_enet_private *dev, u16 ctrl) +{ + struct ibm_emac_error_stats *st = &dev->estats; + DBG("%d: BD TX error %04x" NL, dev->def->index, ctrl); + + ++st->tx_bd_errors; + if (ctrl & EMAC_TX_ST_BFCS) + ++st->tx_bd_bad_fcs; + if (ctrl & EMAC_TX_ST_LCS) + ++st->tx_bd_carrier_loss; + if (ctrl & EMAC_TX_ST_ED) + ++st->tx_bd_excessive_deferral; + if (ctrl & EMAC_TX_ST_EC) + ++st->tx_bd_excessive_collisions; + if (ctrl & EMAC_TX_ST_LC) + ++st->tx_bd_late_collision; + if (ctrl & EMAC_TX_ST_MC) + ++st->tx_bd_multple_collisions; + if (ctrl & EMAC_TX_ST_SC) + ++st->tx_bd_single_collision; + if (ctrl & EMAC_TX_ST_UR) + ++st->tx_bd_underrun; + if (ctrl & EMAC_TX_ST_SQE) + ++st->tx_bd_sqe; } -static void emac_init_rings(struct net_device *dev) +static void emac_poll_tx(void *param) { - struct ocp_enet_private *ep = dev->priv; - int loop; + struct ocp_enet_private *dev = param; + DBG2("%d: poll_tx, %d %d" NL, dev->def->index, dev->tx_cnt, + dev->ack_slot); + + if (dev->tx_cnt) { + u16 ctrl; + int slot = dev->ack_slot, n = 0; + again: + ctrl = dev->tx_desc[slot].ctrl; + if (!(ctrl & MAL_TX_CTRL_READY)) { + struct sk_buff *skb = dev->tx_skb[slot]; + ++n; + + if (skb) { + dev_kfree_skb(skb); + dev->tx_skb[slot] = NULL; + } + slot = (slot + 1) % NUM_TX_BUFF; - ep->tx_desc = (struct mal_descriptor *)((char *)ep->mal->tx_virt_addr + - (ep->mal_tx_chan * - MAL_DT_ALIGN)); - ep->rx_desc = - (struct mal_descriptor *)((char *)ep->mal->rx_virt_addr + - (ep->mal_rx_chan * MAL_DT_ALIGN)); + if (unlikely(EMAC_IS_BAD_TX(ctrl))) + emac_parse_tx_error(dev, ctrl); - /* Fill in the transmit descriptor ring. */ - for (loop = 0; loop < NUM_TX_BUFF; loop++) { - if (ep->tx_skb[loop]) { - dma_unmap_single(&ep->ocpdev->dev, - ep->tx_desc[loop].data_ptr, - ep->tx_desc[loop].data_len, - DMA_TO_DEVICE); - dev_kfree_skb_irq(ep->tx_skb[loop]); + if (--dev->tx_cnt) + goto again; } - ep->tx_skb[loop] = NULL; - ep->tx_desc[loop].ctrl = 0; - ep->tx_desc[loop].data_len = 0; - ep->tx_desc[loop].data_ptr = NULL; - } - ep->tx_desc[loop - 1].ctrl |= MAL_TX_CTRL_WRAP; - - /* Format the receive descriptor ring. */ - ep->rx_slot = 0; - /* Default is MTU=1500 + Ethernet overhead */ - ep->rx_buffer_size = dev->mtu + ENET_HEADER_SIZE + ENET_FCS_SIZE; - emac_rx_fill(dev, 0); - if (ep->rx_slot != 0) { - printk(KERN_ERR - "%s: Not enough mem for RxChain durning Open?\n", - dev->name); - /*We couldn't fill the ring at startup? - *We could clean up and fail to open but right now we will try to - *carry on. It may be a sign of a bad NUM_RX_BUFF value - */ - } + if (n) { + dev->ack_slot = slot; + if (netif_queue_stopped(dev->ndev) && + dev->tx_cnt < EMAC_TX_WAKEUP_THRESH) + netif_wake_queue(dev->ndev); - ep->tx_cnt = 0; - ep->tx_slot = 0; - ep->ack_slot = 0; + DBG2("%d: tx %d pkts" NL, dev->def->index, n); + } + } } -static void emac_reset_configure(struct ocp_enet_private *fep) +static inline void emac_recycle_rx_skb(struct ocp_enet_private *dev, int slot, + int len) { - emac_t *emacp = fep->emacp; - int i; + struct sk_buff *skb = dev->rx_skb[slot]; + DBG2("%d: recycle %d %d" NL, dev->def->index, slot, len); - mal_disable_tx_channels(fep->mal, fep->commac.tx_chan_mask); - mal_disable_rx_channels(fep->mal, fep->commac.rx_chan_mask); + if (len) + dma_map_single(dev->ldev, skb->data - 2, + EMAC_DMA_ALIGN(len + 2), DMA_FROM_DEVICE); - /* - * Check for a link, some PHYs don't provide a clock if - * no link is present. Some EMACs will not come out of - * soft reset without a PHY clock present. - */ - if (fep->phy_mii.def->ops->poll_link(&fep->phy_mii)) { - /* Reset the EMAC */ - out_be32(&emacp->em0mr0, EMAC_M0_SRST); - udelay(20); - for (i = 0; i < 100; i++) { - if ((in_be32(&emacp->em0mr0) & EMAC_M0_SRST) == 0) - break; - udelay(10); - } + dev->rx_desc[slot].data_len = 0; + barrier(); + dev->rx_desc[slot].ctrl = MAL_RX_CTRL_EMPTY | + (slot == (NUM_RX_BUFF - 1) ? MAL_RX_CTRL_WRAP : 0); +} + +static void emac_parse_rx_error(struct ocp_enet_private *dev, u16 ctrl) +{ + struct ibm_emac_error_stats *st = &dev->estats; + DBG("%d: BD RX error %04x" NL, dev->def->index, ctrl); + + ++st->rx_bd_errors; + if (ctrl & EMAC_RX_ST_OE) + ++st->rx_bd_overrun; + if (ctrl & EMAC_RX_ST_BP) + ++st->rx_bd_bad_packet; + if (ctrl & EMAC_RX_ST_RP) + ++st->rx_bd_runt_packet; + if (ctrl & EMAC_RX_ST_SE) + ++st->rx_bd_short_event; + if (ctrl & EMAC_RX_ST_AE) + ++st->rx_bd_alignment_error; + if (ctrl & EMAC_RX_ST_BFCS) + ++st->rx_bd_bad_fcs; + if (ctrl & EMAC_RX_ST_PTL) + ++st->rx_bd_packet_too_long; + if (ctrl & EMAC_RX_ST_ORE) + ++st->rx_bd_out_of_range; + if (ctrl & EMAC_RX_ST_IRE) + ++st->rx_bd_in_range; +} + +static inline void emac_rx_csum(struct ocp_enet_private *dev, + struct sk_buff *skb, u16 ctrl) +{ +#if defined(CONFIG_IBM_EMAC_TAH) + if (!ctrl && dev->tah_dev) { + skb->ip_summed = CHECKSUM_UNNECESSARY; + ++dev->stats.rx_packets_csum; + } +#endif +} - if (i >= 100) { - printk(KERN_ERR "%s: Cannot reset EMAC\n", - fep->ndev->name); - return; +static inline int emac_rx_sg_append(struct ocp_enet_private *dev, int slot) +{ + if (likely(dev->rx_sg_skb != NULL)) { + int len = dev->rx_desc[slot].data_len; + int tot_len = dev->rx_sg_skb->len + len; + + if (unlikely(tot_len + 2 > dev->rx_skb_size)) { + ++dev->estats.rx_dropped_mtu; + dev_kfree_skb(dev->rx_sg_skb); + dev->rx_sg_skb = NULL; + } else { + cacheable_memcpy(dev->rx_sg_skb->tail, + dev->rx_skb[slot]->data, len); + skb_put(dev->rx_sg_skb, len); + emac_recycle_rx_skb(dev, slot, len); + return 0; } } + emac_recycle_rx_skb(dev, slot, 0); + return -1; +} + +/* BHs disabled */ +static int emac_poll_rx(void *param, int budget) +{ + struct ocp_enet_private *dev = param; + int slot = dev->rx_slot, received = 0; + + DBG2("%d: poll_rx(%d)" NL, dev->def->index, budget); - /* Switch IRQs off for now */ - out_be32(&emacp->em0iser, 0); + again: + while (budget > 0) { + int len; + struct sk_buff *skb; + u16 ctrl = dev->rx_desc[slot].ctrl; - /* Configure MAL rx channel */ - mal_set_rcbs(fep->mal, fep->mal_rx_chan, DESC_BUF_SIZE_REG); + if (ctrl & MAL_RX_CTRL_EMPTY) + break; - /* set the high address */ - out_be32(&emacp->em0iahr, - (fep->ndev->dev_addr[0] << 8) | fep->ndev->dev_addr[1]); + skb = dev->rx_skb[slot]; + barrier(); + len = dev->rx_desc[slot].data_len; - /* set the low address */ - out_be32(&emacp->em0ialr, - (fep->ndev->dev_addr[2] << 24) | (fep->ndev->dev_addr[3] << 16) - | (fep->ndev->dev_addr[4] << 8) | fep->ndev->dev_addr[5]); + if (unlikely(!MAL_IS_SINGLE_RX(ctrl))) + goto sg; - /* Adjust to link */ - if (netif_carrier_ok(fep->ndev)) - emac_adjust_to_link(fep); + ctrl &= EMAC_BAD_RX_MASK; + if (unlikely(ctrl && ctrl != EMAC_RX_TAH_BAD_CSUM)) { + emac_parse_rx_error(dev, ctrl); + ++dev->estats.rx_dropped_error; + emac_recycle_rx_skb(dev, slot, 0); + len = 0; + goto next; + } - /* enable broadcast/individual address and RX FIFO defaults */ - out_be32(&emacp->em0rmr, EMAC_RMR_DEFAULT); + if (len && len < EMAC_RX_COPY_THRESH) { + struct sk_buff *copy_skb = + alloc_skb(len + EMAC_RX_SKB_HEADROOM + 2, GFP_ATOMIC); + if (unlikely(!copy_skb)) + goto oom; + + skb_reserve(copy_skb, EMAC_RX_SKB_HEADROOM + 2); + cacheable_memcpy(copy_skb->data - 2, skb->data - 2, + len + 2); + emac_recycle_rx_skb(dev, slot, len); + skb = copy_skb; + } else if (unlikely(emac_alloc_rx_skb(dev, slot, GFP_ATOMIC))) + goto oom; + + skb_put(skb, len); + push_packet: + skb->dev = dev->ndev; + skb->protocol = eth_type_trans(skb, dev->ndev); + emac_rx_csum(dev, skb, ctrl); + + if (unlikely(netif_receive_skb(skb) == NET_RX_DROP)) + ++dev->estats.rx_dropped_stack; + next: + ++dev->stats.rx_packets; + skip: + dev->stats.rx_bytes += len; + slot = (slot + 1) % NUM_RX_BUFF; + --budget; + ++received; + continue; + sg: + if (ctrl & MAL_RX_CTRL_FIRST) { + BUG_ON(dev->rx_sg_skb); + if (unlikely(emac_alloc_rx_skb(dev, slot, GFP_ATOMIC))) { + DBG("%d: rx OOM %d" NL, dev->def->index, slot); + ++dev->estats.rx_dropped_oom; + emac_recycle_rx_skb(dev, slot, 0); + } else { + dev->rx_sg_skb = skb; + skb_put(skb, len); + } + } else if (!emac_rx_sg_append(dev, slot) && + (ctrl & MAL_RX_CTRL_LAST)) { + + skb = dev->rx_sg_skb; + dev->rx_sg_skb = NULL; + + ctrl &= EMAC_BAD_RX_MASK; + if (unlikely(ctrl && ctrl != EMAC_RX_TAH_BAD_CSUM)) { + emac_parse_rx_error(dev, ctrl); + ++dev->estats.rx_dropped_error; + dev_kfree_skb(skb); + len = 0; + } else + goto push_packet; + } + goto skip; + oom: + DBG("%d: rx OOM %d" NL, dev->def->index, slot); + /* Drop the packet and recycle skb */ + ++dev->estats.rx_dropped_oom; + emac_recycle_rx_skb(dev, slot, 0); + goto next; + } - /* set transmit request threshold register */ - out_be32(&emacp->em0trtr, EMAC_TRTR_DEFAULT); + if (received) { + DBG2("%d: rx %d BDs" NL, dev->def->index, received); + dev->rx_slot = slot; + } - /* Reconfigure multicast */ - __emac_set_multicast_list(fep->ndev); + if (unlikely(budget && dev->commac.rx_stopped)) { + struct ocp_func_emac_data *emacdata = dev->def->additions; - /* Set receiver/transmitter defaults */ - out_be32(&emacp->em0rwmr, EMAC_RWMR_DEFAULT); - out_be32(&emacp->em0tmr0, EMAC_TMR0_DEFAULT); - out_be32(&emacp->em0tmr1, EMAC_TMR1_DEFAULT); + barrier(); + if (!(dev->rx_desc[slot].ctrl & MAL_RX_CTRL_EMPTY)) { + DBG2("%d: rx restart" NL, dev->def->index); + received = 0; + goto again; + } - /* set frame gap */ - out_be32(&emacp->em0ipgvr, CONFIG_IBM_EMAC_FGAP); - - /* set VLAN Tag Protocol Identifier */ - out_be32(&emacp->em0vtpid, 0x8100); + if (dev->rx_sg_skb) { + DBG2("%d: dropping partial rx packet" NL, + dev->def->index); + ++dev->estats.rx_dropped_error; + dev_kfree_skb(dev->rx_sg_skb); + dev->rx_sg_skb = NULL; + } - /* Init ring buffers */ - emac_init_rings(fep->ndev); + dev->commac.rx_stopped = 0; + mal_enable_rx_channel(dev->mal, emacdata->mal_rx_chan); + emac_rx_enable(dev); + dev->rx_slot = 0; + } + return received; } -static void emac_kick(struct ocp_enet_private *fep) +/* BHs disabled */ +static int emac_peek_rx(void *param) { - emac_t *emacp = fep->emacp; - unsigned long emac_ier; - - emac_ier = EMAC_ISR_PP | EMAC_ISR_BP | EMAC_ISR_RP | - EMAC_ISR_SE | EMAC_ISR_PTLE | EMAC_ISR_ALE | - EMAC_ISR_BFCS | EMAC_ISR_ORE | EMAC_ISR_IRE; + struct ocp_enet_private *dev = param; + return !(dev->rx_desc[dev->rx_slot].ctrl & MAL_RX_CTRL_EMPTY); +} - out_be32(&emacp->em0iser, emac_ier); +/* BHs disabled */ +static int emac_peek_rx_sg(void *param) +{ + struct ocp_enet_private *dev = param; + int slot = dev->rx_slot; + while (1) { + u16 ctrl = dev->rx_desc[slot].ctrl; + if (ctrl & MAL_RX_CTRL_EMPTY) + return 0; + else if (ctrl & MAL_RX_CTRL_LAST) + return 1; - /* enable all MAL transmit and receive channels */ - mal_enable_tx_channels(fep->mal, fep->commac.tx_chan_mask); - mal_enable_rx_channels(fep->mal, fep->commac.rx_chan_mask); + slot = (slot + 1) % NUM_RX_BUFF; - /* set transmit and receive enable */ - out_be32(&emacp->em0mr0, EMAC_M0_TXE | EMAC_M0_RXE); + /* I'm just being paranoid here :) */ + if (unlikely(slot == dev->rx_slot)) + return 0; + } } -static void -emac_start_link(struct ocp_enet_private *fep, struct ethtool_cmd *ep) +/* Hard IRQ */ +static void emac_rxde(void *param) { - u32 advertise; - int autoneg; - int forced_speed; - int forced_duplex; + struct ocp_enet_private *dev = param; + ++dev->estats.rx_stopped; + emac_rx_disable_async(dev); +} - /* Default advertise */ - advertise = ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full | - ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full | - ADVERTISED_1000baseT_Half | ADVERTISED_1000baseT_Full; - autoneg = fep->want_autoneg; - forced_speed = fep->phy_mii.speed; - forced_duplex = fep->phy_mii.duplex; +/* Hard IRQ */ +static irqreturn_t emac_irq(int irq, void *dev_instance, struct pt_regs *regs) +{ + struct ocp_enet_private *dev = dev_instance; + struct emac_regs __iomem *p = dev->emacp; + struct ibm_emac_error_stats *st = &dev->estats; + + u32 isr = in_be32(&p->isr); + out_be32(&p->isr, isr); + + DBG("%d: isr = %08x" NL, dev->def->index, isr); + + if (isr & EMAC_ISR_TXPE) + ++st->tx_parity; + if (isr & EMAC_ISR_RXPE) + ++st->rx_parity; + if (isr & EMAC_ISR_TXUE) + ++st->tx_underrun; + if (isr & EMAC_ISR_RXOE) + ++st->rx_fifo_overrun; + if (isr & EMAC_ISR_OVR) + ++st->rx_overrun; + if (isr & EMAC_ISR_BP) + ++st->rx_bad_packet; + if (isr & EMAC_ISR_RP) + ++st->rx_runt_packet; + if (isr & EMAC_ISR_SE) + ++st->rx_short_event; + if (isr & EMAC_ISR_ALE) + ++st->rx_alignment_error; + if (isr & EMAC_ISR_BFCS) + ++st->rx_bad_fcs; + if (isr & EMAC_ISR_PTLE) + ++st->rx_packet_too_long; + if (isr & EMAC_ISR_ORE) + ++st->rx_out_of_range; + if (isr & EMAC_ISR_IRE) + ++st->rx_in_range; + if (isr & EMAC_ISR_SQE) + ++st->tx_sqe; + if (isr & EMAC_ISR_TE) + ++st->tx_errors; - /* Setup link parameters */ - if (ep) { - if (ep->autoneg == AUTONEG_ENABLE) { - advertise = ep->advertising; - autoneg = 1; - } else { - autoneg = 0; - forced_speed = ep->speed; - forced_duplex = ep->duplex; - } - } + return IRQ_HANDLED; +} - /* Configure PHY & start aneg */ - fep->want_autoneg = autoneg; - if (autoneg) { - LINK_DEBUG(("%s: start link aneg, advertise: 0x%x\n", - fep->ndev->name, advertise)); - fep->phy_mii.def->ops->setup_aneg(&fep->phy_mii, advertise); - } else { - LINK_DEBUG(("%s: start link forced, speed: %d, duplex: %d\n", - fep->ndev->name, forced_speed, forced_duplex)); - fep->phy_mii.def->ops->setup_forced(&fep->phy_mii, forced_speed, - forced_duplex); - } - fep->timer_ticks = 0; - mod_timer(&fep->link_timer, jiffies + HZ); +static struct net_device_stats *emac_stats(struct net_device *ndev) +{ + struct ocp_enet_private *dev = ndev->priv; + struct ibm_emac_stats *st = &dev->stats; + struct ibm_emac_error_stats *est = &dev->estats; + struct net_device_stats *nst = &dev->nstats; + + DBG2("%d: stats" NL, dev->def->index); + + /* Compute "legacy" statistics */ + local_irq_disable(); + nst->rx_packets = (unsigned long)st->rx_packets; + nst->rx_bytes = (unsigned long)st->rx_bytes; + nst->tx_packets = (unsigned long)st->tx_packets; + nst->tx_bytes = (unsigned long)st->tx_bytes; + nst->rx_dropped = (unsigned long)(est->rx_dropped_oom + + est->rx_dropped_error + + est->rx_dropped_resize + + est->rx_dropped_mtu); + nst->tx_dropped = (unsigned long)est->tx_dropped; + + nst->rx_errors = (unsigned long)est->rx_bd_errors; + nst->rx_fifo_errors = (unsigned long)(est->rx_bd_overrun + + est->rx_fifo_overrun + + est->rx_overrun); + nst->rx_frame_errors = (unsigned long)(est->rx_bd_alignment_error + + est->rx_alignment_error); + nst->rx_crc_errors = (unsigned long)(est->rx_bd_bad_fcs + + est->rx_bad_fcs); + nst->rx_length_errors = (unsigned long)(est->rx_bd_runt_packet + + est->rx_bd_short_event + + est->rx_bd_packet_too_long + + est->rx_bd_out_of_range + + est->rx_bd_in_range + + est->rx_runt_packet + + est->rx_short_event + + est->rx_packet_too_long + + est->rx_out_of_range + + est->rx_in_range); + + nst->tx_errors = (unsigned long)(est->tx_bd_errors + est->tx_errors); + nst->tx_fifo_errors = (unsigned long)(est->tx_bd_underrun + + est->tx_underrun); + nst->tx_carrier_errors = (unsigned long)est->tx_bd_carrier_loss; + nst->collisions = (unsigned long)(est->tx_bd_excessive_deferral + + est->tx_bd_excessive_collisions + + est->tx_bd_late_collision + + est->tx_bd_multple_collisions); + local_irq_enable(); + return nst; } -static void emac_link_timer(unsigned long data) +static void emac_remove(struct ocp_device *ocpdev) { - struct ocp_enet_private *fep = (struct ocp_enet_private *)data; - int link; + struct ocp_enet_private *dev = ocp_get_drvdata(ocpdev); - if (fep->going_away) - return; + DBG("%d: remove" NL, dev->def->index); - spin_lock_irq(&fep->lock); + ocp_set_drvdata(ocpdev, NULL); + unregister_netdev(dev->ndev); - link = fep->phy_mii.def->ops->poll_link(&fep->phy_mii); - LINK_DEBUG(("%s: poll_link: %d\n", fep->ndev->name, link)); + tah_fini(dev->tah_dev); + rgmii_fini(dev->rgmii_dev, dev->rgmii_input); + zmii_fini(dev->zmii_dev, dev->zmii_input); - if (link == netif_carrier_ok(fep->ndev)) { - if (!link && fep->want_autoneg && (++fep->timer_ticks) > 10) - emac_start_link(fep, NULL); - goto out; - } - printk(KERN_INFO "%s: Link is %s\n", fep->ndev->name, - link ? "Up" : "Down"); - if (link) { - netif_carrier_on(fep->ndev); - /* Chip needs a full reset on config change. That sucks, so I - * should ultimately move that to some tasklet to limit - * latency peaks caused by this code - */ - emac_reset_configure(fep); - if (fep->opened) - emac_kick(fep); - } else { - fep->timer_ticks = 0; - netif_carrier_off(fep->ndev); - } - out: - mod_timer(&fep->link_timer, jiffies + HZ); - spin_unlock_irq(&fep->lock); + emac_dbg_register(dev->def->index, NULL); + + mal_unregister_commac(dev->mal, &dev->commac); + iounmap(dev->emacp); + kfree(dev->ndev); } -static void emac_set_multicast_list(struct net_device *dev) -{ - struct ocp_enet_private *fep = dev->priv; +static struct mal_commac_ops emac_commac_ops = { + .poll_tx = &emac_poll_tx, + .poll_rx = &emac_poll_rx, + .peek_rx = &emac_peek_rx, + .rxde = &emac_rxde, +}; - spin_lock_irq(&fep->lock); - __emac_set_multicast_list(dev); - spin_unlock_irq(&fep->lock); -} +static struct mal_commac_ops emac_commac_sg_ops = { + .poll_tx = &emac_poll_tx, + .poll_rx = &emac_poll_rx, + .peek_rx = &emac_peek_rx_sg, + .rxde = &emac_rxde, +}; -static int emac_get_settings(struct net_device *ndev, struct ethtool_cmd *cmd) +/* Ethtool support */ +static int emac_ethtool_get_settings(struct net_device *ndev, + struct ethtool_cmd *cmd) { - struct ocp_enet_private *fep = ndev->priv; + struct ocp_enet_private *dev = ndev->priv; - cmd->supported = fep->phy_mii.def->features; + cmd->supported = dev->phy.features; cmd->port = PORT_MII; - cmd->transceiver = XCVR_EXTERNAL; - cmd->phy_address = fep->mii_phy_addr; - spin_lock_irq(&fep->lock); - cmd->autoneg = fep->want_autoneg; - cmd->speed = fep->phy_mii.speed; - cmd->duplex = fep->phy_mii.duplex; - spin_unlock_irq(&fep->lock); + cmd->phy_address = dev->phy.address; + cmd->transceiver = + dev->phy.address >= 0 ? XCVR_EXTERNAL : XCVR_INTERNAL; + + local_bh_disable(); + cmd->advertising = dev->phy.advertising; + cmd->autoneg = dev->phy.autoneg; + cmd->speed = dev->phy.speed; + cmd->duplex = dev->phy.duplex; + local_bh_enable(); + return 0; } -static int emac_set_settings(struct net_device *ndev, struct ethtool_cmd *cmd) +static int emac_ethtool_set_settings(struct net_device *ndev, + struct ethtool_cmd *cmd) { - struct ocp_enet_private *fep = ndev->priv; - unsigned long features = fep->phy_mii.def->features; + struct ocp_enet_private *dev = ndev->priv; + u32 f = dev->phy.features; - if (!capable(CAP_NET_ADMIN)) - return -EPERM; + DBG("%d: set_settings(%d, %d, %d, 0x%08x)" NL, dev->def->index, + cmd->autoneg, cmd->speed, cmd->duplex, cmd->advertising); + /* Basic sanity checks */ + if (dev->phy.address < 0) + return -EOPNOTSUPP; if (cmd->autoneg != AUTONEG_ENABLE && cmd->autoneg != AUTONEG_DISABLE) return -EINVAL; if (cmd->autoneg == AUTONEG_ENABLE && cmd->advertising == 0) return -EINVAL; if (cmd->duplex != DUPLEX_HALF && cmd->duplex != DUPLEX_FULL) return -EINVAL; - if (cmd->autoneg == AUTONEG_DISABLE) + + if (cmd->autoneg == AUTONEG_DISABLE) { switch (cmd->speed) { case SPEED_10: - if (cmd->duplex == DUPLEX_HALF && - (features & SUPPORTED_10baseT_Half) == 0) + if (cmd->duplex == DUPLEX_HALF + && !(f & SUPPORTED_10baseT_Half)) return -EINVAL; - if (cmd->duplex == DUPLEX_FULL && - (features & SUPPORTED_10baseT_Full) == 0) + if (cmd->duplex == DUPLEX_FULL + && !(f & SUPPORTED_10baseT_Full)) return -EINVAL; break; case SPEED_100: - if (cmd->duplex == DUPLEX_HALF && - (features & SUPPORTED_100baseT_Half) == 0) + if (cmd->duplex == DUPLEX_HALF + && !(f & SUPPORTED_100baseT_Half)) return -EINVAL; - if (cmd->duplex == DUPLEX_FULL && - (features & SUPPORTED_100baseT_Full) == 0) + if (cmd->duplex == DUPLEX_FULL + && !(f & SUPPORTED_100baseT_Full)) return -EINVAL; break; case SPEED_1000: - if (cmd->duplex == DUPLEX_HALF && - (features & SUPPORTED_1000baseT_Half) == 0) + if (cmd->duplex == DUPLEX_HALF + && !(f & SUPPORTED_1000baseT_Half)) return -EINVAL; - if (cmd->duplex == DUPLEX_FULL && - (features & SUPPORTED_1000baseT_Full) == 0) + if (cmd->duplex == DUPLEX_FULL + && !(f & SUPPORTED_1000baseT_Full)) return -EINVAL; break; default: return -EINVAL; - } else if ((features & SUPPORTED_Autoneg) == 0) - return -EINVAL; - spin_lock_irq(&fep->lock); - emac_start_link(fep, cmd); - spin_unlock_irq(&fep->lock); + } + + local_bh_disable(); + dev->phy.def->ops->setup_forced(&dev->phy, cmd->speed, + cmd->duplex); + + } else { + if (!(f & SUPPORTED_Autoneg)) + return -EINVAL; + + local_bh_disable(); + dev->phy.def->ops->setup_aneg(&dev->phy, + (cmd->advertising & f) | + (dev->phy.advertising & + (ADVERTISED_Pause | + ADVERTISED_Asym_Pause))); + } + emac_force_link_update(dev); + local_bh_enable(); + return 0; } -static void -emac_get_drvinfo(struct net_device *ndev, struct ethtool_drvinfo *info) +static void emac_ethtool_get_ringparam(struct net_device *ndev, + struct ethtool_ringparam *rp) { - struct ocp_enet_private *fep = ndev->priv; - - strcpy(info->driver, DRV_NAME); - strcpy(info->version, DRV_VERSION); - info->fw_version[0] = '\0'; - sprintf(info->bus_info, "IBM EMAC %d", fep->ocpdev->def->index); - info->regdump_len = 0; + rp->rx_max_pending = rp->rx_pending = NUM_RX_BUFF; + rp->tx_max_pending = rp->tx_pending = NUM_TX_BUFF; } -static int emac_nway_reset(struct net_device *ndev) +static void emac_ethtool_get_pauseparam(struct net_device *ndev, + struct ethtool_pauseparam *pp) { - struct ocp_enet_private *fep = ndev->priv; + struct ocp_enet_private *dev = ndev->priv; + + local_bh_disable(); + if ((dev->phy.features & SUPPORTED_Autoneg) && + (dev->phy.advertising & (ADVERTISED_Pause | ADVERTISED_Asym_Pause))) + pp->autoneg = 1; + + if (dev->phy.duplex == DUPLEX_FULL) { + if (dev->phy.pause) + pp->rx_pause = pp->tx_pause = 1; + else if (dev->phy.asym_pause) + pp->tx_pause = 1; + } + local_bh_enable(); +} - if (!fep->want_autoneg) - return -EINVAL; - spin_lock_irq(&fep->lock); - emac_start_link(fep, NULL); - spin_unlock_irq(&fep->lock); - return 0; +static u32 emac_ethtool_get_rx_csum(struct net_device *ndev) +{ + struct ocp_enet_private *dev = ndev->priv; + return dev->tah_dev != 0; } -static u32 emac_get_link(struct net_device *ndev) +static int emac_get_regs_len(struct ocp_enet_private *dev) { - return netif_carrier_ok(ndev); + return sizeof(struct emac_ethtool_regs_subhdr) + EMAC_ETHTOOL_REGS_SIZE; } -static struct ethtool_ops emac_ethtool_ops = { - .get_settings = emac_get_settings, - .set_settings = emac_set_settings, - .get_drvinfo = emac_get_drvinfo, - .nway_reset = emac_nway_reset, - .get_link = emac_get_link -}; +static int emac_ethtool_get_regs_len(struct net_device *ndev) +{ + struct ocp_enet_private *dev = ndev->priv; + return sizeof(struct emac_ethtool_regs_hdr) + + emac_get_regs_len(dev) + mal_get_regs_len(dev->mal) + + zmii_get_regs_len(dev->zmii_dev) + + rgmii_get_regs_len(dev->rgmii_dev) + + tah_get_regs_len(dev->tah_dev); +} -static int emac_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) +static void *emac_dump_regs(struct ocp_enet_private *dev, void *buf) { - struct ocp_enet_private *fep = dev->priv; - uint16_t *data = (uint16_t *) & rq->ifr_ifru; + struct emac_ethtool_regs_subhdr *hdr = buf; - switch (cmd) { - case SIOCGMIIPHY: - data[0] = fep->mii_phy_addr; - /* Fall through */ - case SIOCGMIIREG: - data[3] = emac_phy_read(dev, fep->mii_phy_addr, data[1]); - return 0; - case SIOCSMIIREG: - if (!capable(CAP_NET_ADMIN)) - return -EPERM; + hdr->version = EMAC_ETHTOOL_REGS_VER; + hdr->index = dev->def->index; + memcpy_fromio(hdr + 1, dev->emacp, EMAC_ETHTOOL_REGS_SIZE); + return ((void *)(hdr + 1) + EMAC_ETHTOOL_REGS_SIZE); +} - emac_phy_write(dev, fep->mii_phy_addr, data[1], data[2]); - return 0; - default: - return -EOPNOTSUPP; +static void emac_ethtool_get_regs(struct net_device *ndev, + struct ethtool_regs *regs, void *buf) +{ + struct ocp_enet_private *dev = ndev->priv; + struct emac_ethtool_regs_hdr *hdr = buf; + + hdr->components = 0; + buf = hdr + 1; + + local_irq_disable(); + buf = mal_dump_regs(dev->mal, buf); + buf = emac_dump_regs(dev, buf); + if (dev->zmii_dev) { + hdr->components |= EMAC_ETHTOOL_REGS_ZMII; + buf = zmii_dump_regs(dev->zmii_dev, buf); + } + if (dev->rgmii_dev) { + hdr->components |= EMAC_ETHTOOL_REGS_RGMII; + buf = rgmii_dump_regs(dev->rgmii_dev, buf); } + if (dev->tah_dev) { + hdr->components |= EMAC_ETHTOOL_REGS_TAH; + buf = tah_dump_regs(dev->tah_dev, buf); + } + local_irq_enable(); } -static int emac_open(struct net_device *dev) +static int emac_ethtool_nway_reset(struct net_device *ndev) { - struct ocp_enet_private *fep = dev->priv; - int rc; + struct ocp_enet_private *dev = ndev->priv; + int res = 0; - spin_lock_irq(&fep->lock); + DBG("%d: nway_reset" NL, dev->def->index); - fep->opened = 1; - netif_carrier_off(dev); + if (dev->phy.address < 0) + return -EOPNOTSUPP; - /* Reset & configure the chip */ - emac_reset_configure(fep); + local_bh_disable(); + if (!dev->phy.autoneg) { + res = -EINVAL; + goto out; + } - spin_unlock_irq(&fep->lock); + dev->phy.def->ops->setup_aneg(&dev->phy, dev->phy.advertising); + emac_force_link_update(dev); - /* Request our interrupt lines */ - rc = request_irq(dev->irq, emac_mac_irq, 0, "IBM EMAC MAC", dev); - if (rc != 0) { - printk("dev->irq %d failed\n", dev->irq); - goto bail; - } - /* Kick the chip rx & tx channels into life */ - spin_lock_irq(&fep->lock); - emac_kick(fep); - spin_unlock_irq(&fep->lock); + out: + local_bh_enable(); + return res; +} - netif_start_queue(dev); - bail: - return rc; +static int emac_ethtool_get_stats_count(struct net_device *ndev) +{ + return EMAC_ETHTOOL_STATS_COUNT; } -static int emac_close(struct net_device *dev) +static void emac_ethtool_get_strings(struct net_device *ndev, u32 stringset, + u8 * buf) { - struct ocp_enet_private *fep = dev->priv; - emac_t *emacp = fep->emacp; + if (stringset == ETH_SS_STATS) + memcpy(buf, &emac_stats_keys, sizeof(emac_stats_keys)); +} - /* XXX Stop IRQ emitting here */ - spin_lock_irq(&fep->lock); - fep->opened = 0; - mal_disable_tx_channels(fep->mal, fep->commac.tx_chan_mask); - mal_disable_rx_channels(fep->mal, fep->commac.rx_chan_mask); - netif_carrier_off(dev); - netif_stop_queue(dev); +static void emac_ethtool_get_ethtool_stats(struct net_device *ndev, + struct ethtool_stats *estats, + u64 * tmp_stats) +{ + struct ocp_enet_private *dev = ndev->priv; + local_irq_disable(); + memcpy(tmp_stats, &dev->stats, sizeof(dev->stats)); + tmp_stats += sizeof(dev->stats) / sizeof(u64); + memcpy(tmp_stats, &dev->estats, sizeof(dev->estats)); + local_irq_enable(); +} - /* - * Check for a link, some PHYs don't provide a clock if - * no link is present. Some EMACs will not come out of - * soft reset without a PHY clock present. - */ - if (fep->phy_mii.def->ops->poll_link(&fep->phy_mii)) { - out_be32(&emacp->em0mr0, EMAC_M0_SRST); - udelay(10); +static void emac_ethtool_get_drvinfo(struct net_device *ndev, + struct ethtool_drvinfo *info) +{ + struct ocp_enet_private *dev = ndev->priv; - if (emacp->em0mr0 & EMAC_M0_SRST) { - /*not sure what to do here hopefully it clears before another open */ - printk(KERN_ERR - "%s: Phy SoftReset didn't clear, no link?\n", - dev->name); - } - } + strcpy(info->driver, "ibm_emac"); + strcpy(info->version, DRV_VERSION); + info->fw_version[0] = '\0'; + sprintf(info->bus_info, "PPC 4xx EMAC %d", dev->def->index); + info->n_stats = emac_ethtool_get_stats_count(ndev); + info->regdump_len = emac_ethtool_get_regs_len(ndev); +} - /* Free the irq's */ - free_irq(dev->irq, dev); +static struct ethtool_ops emac_ethtool_ops = { + .get_settings = emac_ethtool_get_settings, + .set_settings = emac_ethtool_set_settings, + .get_drvinfo = emac_ethtool_get_drvinfo, - spin_unlock_irq(&fep->lock); + .get_regs_len = emac_ethtool_get_regs_len, + .get_regs = emac_ethtool_get_regs, - return 0; -} + .nway_reset = emac_ethtool_nway_reset, -static void emac_remove(struct ocp_device *ocpdev) -{ - struct net_device *dev = ocp_get_drvdata(ocpdev); - struct ocp_enet_private *ep = dev->priv; + .get_ringparam = emac_ethtool_get_ringparam, + .get_pauseparam = emac_ethtool_get_pauseparam, - /* FIXME: locking, races, ... */ - ep->going_away = 1; - ocp_set_drvdata(ocpdev, NULL); - if (ep->rgmii_dev) - emac_close_rgmii(ep->rgmii_dev); - if (ep->zmii_dev) - emac_close_zmii(ep->zmii_dev); - - unregister_netdev(dev); - del_timer_sync(&ep->link_timer); - mal_unregister_commac(ep->mal, &ep->commac); - iounmap((void *)ep->emacp); - kfree(dev); -} - -struct mal_commac_ops emac_commac_ops = { - .txeob = &emac_txeob_dev, - .txde = &emac_txde_dev, - .rxeob = &emac_rxeob_dev, - .rxde = &emac_rxde_dev, + .get_rx_csum = emac_ethtool_get_rx_csum, + + .get_strings = emac_ethtool_get_strings, + .get_stats_count = emac_ethtool_get_stats_count, + .get_ethtool_stats = emac_ethtool_get_ethtool_stats, + + .get_link = ethtool_op_get_link, + .get_tx_csum = ethtool_op_get_tx_csum, + .get_sg = ethtool_op_get_sg, }; -#ifdef CONFIG_NET_POLL_CONTROLLER -static int emac_netpoll(struct net_device *ndev) +static int emac_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd) { - emac_rxeob_dev((void *)ndev, 0); - emac_txeob_dev((void *)ndev, 0); - return 0; + struct ocp_enet_private *dev = ndev->priv; + uint16_t *data = (uint16_t *) & rq->ifr_ifru; + + DBG("%d: ioctl %08x" NL, dev->def->index, cmd); + + if (dev->phy.address < 0) + return -EOPNOTSUPP; + + switch (cmd) { + case SIOCGMIIPHY: + case SIOCDEVPRIVATE: + data[0] = dev->phy.address; + /* Fall through */ + case SIOCGMIIREG: + case SIOCDEVPRIVATE + 1: + data[3] = emac_mdio_read(ndev, dev->phy.address, data[1]); + return 0; + + case SIOCSMIIREG: + case SIOCDEVPRIVATE + 2: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + emac_mdio_write(ndev, dev->phy.address, data[1], data[2]); + return 0; + default: + return -EOPNOTSUPP; + } } -#endif -static int emac_init_device(struct ocp_device *ocpdev, struct ibm_ocp_mal *mal) +static int __init emac_probe(struct ocp_device *ocpdev) { - int deferred_init = 0; - int rc = 0, i; + struct ocp_func_emac_data *emacdata = ocpdev->def->additions; struct net_device *ndev; - struct ocp_enet_private *ep; - struct ocp_func_emac_data *emacdata; - int commac_reg = 0; - u32 phy_map; + struct ocp_device *maldev; + struct ocp_enet_private *dev; + int err, i; + + DBG("%d: probe" NL, ocpdev->def->index); - emacdata = (struct ocp_func_emac_data *)ocpdev->def->additions; if (!emacdata) { printk(KERN_ERR "emac%d: Missing additional data!\n", ocpdev->def->index); @@ -1739,273 +1956,311 @@ static int emac_init_device(struct ocp_device *ocpdev, struct ibm_ocp_mal *mal) /* Allocate our net_device structure */ ndev = alloc_etherdev(sizeof(struct ocp_enet_private)); - if (ndev == NULL) { - printk(KERN_ERR - "emac%d: Could not allocate ethernet device.\n", + if (!ndev) { + printk(KERN_ERR "emac%d: could not allocate ethernet device!\n", ocpdev->def->index); return -ENOMEM; } - ep = ndev->priv; - ep->ndev = ndev; - ep->ocpdev = ocpdev; - ndev->irq = ocpdev->def->irq; - ep->wol_irq = emacdata->wol_irq; - if (emacdata->mdio_idx >= 0) { - if (emacdata->mdio_idx == ocpdev->def->index) { - /* Set the common MDIO net_device */ - mdio_ndev = ndev; - deferred_init = 1; - } - ep->mdio_dev = mdio_ndev; - } else { - ep->mdio_dev = ndev; - } + dev = ndev->priv; + dev->ndev = ndev; + dev->ldev = &ocpdev->dev; + dev->def = ocpdev->def; + SET_MODULE_OWNER(ndev); - ocp_set_drvdata(ocpdev, ndev); - - spin_lock_init(&ep->lock); - - /* Fill out MAL informations and register commac */ - ep->mal = mal; - ep->mal_tx_chan = emacdata->mal_tx_chan; - ep->mal_rx_chan = emacdata->mal_rx_chan; - ep->commac.ops = &emac_commac_ops; - ep->commac.dev = ndev; - ep->commac.tx_chan_mask = MAL_CHAN_MASK(ep->mal_tx_chan); - ep->commac.rx_chan_mask = MAL_CHAN_MASK(ep->mal_rx_chan); - rc = mal_register_commac(ep->mal, &ep->commac); - if (rc != 0) - goto bail; - commac_reg = 1; - - /* Map our MMIOs */ - ep->emacp = (emac_t *) ioremap(ocpdev->def->paddr, sizeof(emac_t)); - - /* Check if we need to attach to a ZMII */ - if (emacdata->zmii_idx >= 0) { - ep->zmii_input = emacdata->zmii_mux; - ep->zmii_dev = - ocp_find_device(OCP_ANY_ID, OCP_FUNC_ZMII, - emacdata->zmii_idx); - if (ep->zmii_dev == NULL) - printk(KERN_WARNING - "emac%d: ZMII %d requested but not found !\n", - ocpdev->def->index, emacdata->zmii_idx); - else if ((rc = - emac_init_zmii(ep->zmii_dev, ep->zmii_input, - emacdata->phy_mode)) != 0) - goto bail; + /* Find MAL device we are connected to */ + maldev = + ocp_find_device(OCP_VENDOR_IBM, OCP_FUNC_MAL, emacdata->mal_idx); + if (!maldev) { + printk(KERN_ERR "emac%d: unknown mal%d device!\n", + dev->def->index, emacdata->mal_idx); + err = -ENODEV; + goto out; + } + dev->mal = ocp_get_drvdata(maldev); + if (!dev->mal) { + printk(KERN_ERR "emac%d: mal%d hasn't been initialized yet!\n", + dev->def->index, emacdata->mal_idx); + err = -ENODEV; + goto out; } - /* Check if we need to attach to a RGMII */ - if (emacdata->rgmii_idx >= 0) { - ep->rgmii_input = emacdata->rgmii_mux; - ep->rgmii_dev = - ocp_find_device(OCP_ANY_ID, OCP_FUNC_RGMII, - emacdata->rgmii_idx); - if (ep->rgmii_dev == NULL) - printk(KERN_WARNING - "emac%d: RGMII %d requested but not found !\n", - ocpdev->def->index, emacdata->rgmii_idx); - else if ((rc = - emac_init_rgmii(ep->rgmii_dev, ep->rgmii_input, - emacdata->phy_mode)) != 0) - goto bail; + /* Register with MAL */ + dev->commac.ops = &emac_commac_ops; + dev->commac.dev = dev; + dev->commac.tx_chan_mask = MAL_CHAN_MASK(emacdata->mal_tx_chan); + dev->commac.rx_chan_mask = MAL_CHAN_MASK(emacdata->mal_rx_chan); + err = mal_register_commac(dev->mal, &dev->commac); + if (err) { + printk(KERN_ERR "emac%d: failed to register with mal%d!\n", + dev->def->index, emacdata->mal_idx); + goto out; + } + dev->rx_skb_size = emac_rx_skb_size(ndev->mtu); + dev->rx_sync_size = emac_rx_sync_size(ndev->mtu); + + /* Get pointers to BD rings */ + dev->tx_desc = + dev->mal->bd_virt + mal_tx_bd_offset(dev->mal, + emacdata->mal_tx_chan); + dev->rx_desc = + dev->mal->bd_virt + mal_rx_bd_offset(dev->mal, + emacdata->mal_rx_chan); + + DBG("%d: tx_desc %p" NL, ocpdev->def->index, dev->tx_desc); + DBG("%d: rx_desc %p" NL, ocpdev->def->index, dev->rx_desc); + + /* Clean rings */ + memset(dev->tx_desc, 0, NUM_TX_BUFF * sizeof(struct mal_descriptor)); + memset(dev->rx_desc, 0, NUM_RX_BUFF * sizeof(struct mal_descriptor)); + + /* If we depend on another EMAC for MDIO, check whether it was probed already */ + if (emacdata->mdio_idx >= 0 && emacdata->mdio_idx != ocpdev->def->index) { + struct ocp_device *mdiodev = + ocp_find_device(OCP_VENDOR_IBM, OCP_FUNC_EMAC, + emacdata->mdio_idx); + if (!mdiodev) { + printk(KERN_ERR "emac%d: unknown emac%d device!\n", + dev->def->index, emacdata->mdio_idx); + err = -ENODEV; + goto out2; + } + dev->mdio_dev = ocp_get_drvdata(mdiodev); + if (!dev->mdio_dev) { + printk(KERN_ERR + "emac%d: emac%d hasn't been initialized yet!\n", + dev->def->index, emacdata->mdio_idx); + err = -ENODEV; + goto out2; + } } - /* Check if we need to attach to a TAH */ - if (emacdata->tah_idx >= 0) { - ep->tah_dev = - ocp_find_device(OCP_ANY_ID, OCP_FUNC_TAH, - emacdata->tah_idx); - if (ep->tah_dev == NULL) - printk(KERN_WARNING - "emac%d: TAH %d requested but not found !\n", - ocpdev->def->index, emacdata->tah_idx); - else if ((rc = emac_init_tah(ep)) != 0) - goto bail; + /* Attach to ZMII, if needed */ + if ((err = zmii_attach(dev)) != 0) + goto out2; + + /* Attach to RGMII, if needed */ + if ((err = rgmii_attach(dev)) != 0) + goto out3; + + /* Attach to TAH, if needed */ + if ((err = tah_attach(dev)) != 0) + goto out4; + + /* Map EMAC regs */ + dev->emacp = ioremap(dev->def->paddr, sizeof(struct emac_regs)); + if (!dev->emacp) { + printk(KERN_ERR "emac%d: could not ioremap device registers!\n", + dev->def->index); + err = -ENOMEM; + goto out5; } - if (deferred_init) { - if (!list_empty(&emac_init_list)) { - struct list_head *entry; - struct emac_def_dev *ddev; + /* Fill in MAC address */ + for (i = 0; i < 6; ++i) + ndev->dev_addr[i] = emacdata->mac_addr[i]; - list_for_each(entry, &emac_init_list) { - ddev = - list_entry(entry, struct emac_def_dev, - link); - emac_init_device(ddev->ocpdev, ddev->mal); - } + /* Set some link defaults before we can find out real parameters */ + dev->phy.speed = SPEED_100; + 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; + + /* Find PHY if any */ + dev->phy.dev = ndev; + dev->phy.mode = emacdata->phy_mode; + if (emacdata->phy_map != 0xffffffff) { + u32 phy_map = emacdata->phy_map | busy_phy_map; + u32 adv; + + DBG("%d: PHY maps %08x %08x" NL, dev->def->index, + emacdata->phy_map, busy_phy_map); + + EMAC_RX_CLK_TX(dev->def->index); + + dev->phy.mdio_read = emac_mdio_read; + dev->phy.mdio_write = emac_mdio_write; + + /* Configure EMAC with defaults so we can at least use MDIO + * This is needed mostly for 440GX + */ + if (emac_phy_gpcs(dev->phy.mode)) { + /* XXX + * Make GPCS PHY address equal to EMAC index. + * We probably should take into account busy_phy_map + * and/or phy_map here. + */ + dev->phy.address = dev->def->index; } - } + + emac_configure(dev); - /* Init link monitoring timer */ - init_timer(&ep->link_timer); - ep->link_timer.function = emac_link_timer; - ep->link_timer.data = (unsigned long)ep; - ep->timer_ticks = 0; - - /* Fill up the mii_phy structure */ - ep->phy_mii.dev = ndev; - ep->phy_mii.mdio_read = emac_phy_read; - ep->phy_mii.mdio_write = emac_phy_write; - ep->phy_mii.mode = emacdata->phy_mode; - - /* Find PHY */ - phy_map = emacdata->phy_map | busy_phy_map; - for (i = 0; i <= 0x1f; i++, phy_map >>= 1) { - if ((phy_map & 0x1) == 0) { - int val = emac_phy_read(ndev, i, MII_BMCR); - if (val != 0xffff && val != -1) - break; + for (i = 0; i < 0x20; phy_map >>= 1, ++i) + if (!(phy_map & 1)) { + int r; + busy_phy_map |= 1 << i; + + /* Quick check if there is a PHY at the address */ + r = emac_mdio_read(dev->ndev, i, MII_BMCR); + if (r == 0xffff || r < 0) + continue; + if (!mii_phy_probe(&dev->phy, i)) + break; + } + if (i == 0x20) { + printk(KERN_WARNING "emac%d: can't find PHY!\n", + dev->def->index); + goto out6; } - } - if (i == 0x20) { - printk(KERN_WARNING "emac%d: Can't find PHY.\n", - ocpdev->def->index); - rc = -ENODEV; - goto bail; - } - busy_phy_map |= 1 << i; - ep->mii_phy_addr = i; - rc = mii_phy_probe(&ep->phy_mii, i); - if (rc) { - printk(KERN_WARNING "emac%d: Failed to probe PHY type.\n", - ocpdev->def->index); - rc = -ENODEV; - goto bail; - } - /* Setup initial PHY config & startup aneg */ - if (ep->phy_mii.def->ops->init) - ep->phy_mii.def->ops->init(&ep->phy_mii); - netif_carrier_off(ndev); - if (ep->phy_mii.def->features & SUPPORTED_Autoneg) - ep->want_autoneg = 1; - emac_start_link(ep, NULL); + /* Init PHY */ + if (dev->phy.def->ops->init) + dev->phy.def->ops->init(&dev->phy); + + /* Disable any PHY features not supported by the platform */ + dev->phy.def->features &= ~emacdata->phy_feat_exc; + + /* Setup initial link parameters */ + if (dev->phy.features & SUPPORTED_Autoneg) { + adv = dev->phy.features; +#if !defined(CONFIG_40x) + adv |= ADVERTISED_Pause | ADVERTISED_Asym_Pause; +#endif + /* Restart autonegotiation */ + dev->phy.def->ops->setup_aneg(&dev->phy, adv); + } else { + u32 f = dev->phy.def->features; + int speed = SPEED_10, fd = DUPLEX_HALF; + + /* Select highest supported speed/duplex */ + if (f & SUPPORTED_1000baseT_Full) { + speed = SPEED_1000; + fd = DUPLEX_FULL; + } else if (f & SUPPORTED_1000baseT_Half) + speed = SPEED_1000; + else if (f & SUPPORTED_100baseT_Full) { + speed = SPEED_100; + fd = DUPLEX_FULL; + } else if (f & SUPPORTED_100baseT_Half) + speed = SPEED_100; + else if (f & SUPPORTED_10baseT_Full) + fd = DUPLEX_FULL; + + /* Force link parameters */ + dev->phy.def->ops->setup_forced(&dev->phy, speed, fd); + } + } else { + emac_reset(dev); - /* read the MAC Address */ - for (i = 0; i < 6; i++) - ndev->dev_addr[i] = emacdata->mac_addr[i]; + /* PHY-less configuration. + * XXX I probably should move these settings to emacdata + */ + dev->phy.address = -1; + dev->phy.features = SUPPORTED_100baseT_Full | SUPPORTED_MII; + dev->phy.pause = 1; + } /* Fill in the driver function table */ ndev->open = &emac_open; - ndev->hard_start_xmit = &emac_start_xmit; + if (dev->tah_dev) { + ndev->hard_start_xmit = &emac_start_xmit_sg; + ndev->features |= NETIF_F_IP_CSUM | NETIF_F_SG; + } else + ndev->hard_start_xmit = &emac_start_xmit; + ndev->tx_timeout = &emac_full_tx_reset; + ndev->watchdog_timeo = 5 * HZ; ndev->stop = &emac_close; ndev->get_stats = &emac_stats; - if (emacdata->jumbo) - ndev->change_mtu = &emac_change_mtu; - ndev->set_mac_address = &emac_set_mac_address; ndev->set_multicast_list = &emac_set_multicast_list; ndev->do_ioctl = &emac_ioctl; + if (emac_phy_supports_gige(emacdata->phy_mode)) { + ndev->change_mtu = &emac_change_mtu; + dev->commac.ops = &emac_commac_sg_ops; + } SET_ETHTOOL_OPS(ndev, &emac_ethtool_ops); - if (emacdata->tah_idx >= 0) - ndev->features = NETIF_F_IP_CSUM | NETIF_F_SG; -#ifdef CONFIG_NET_POLL_CONTROLLER - ndev->poll_controller = emac_netpoll; -#endif - SET_MODULE_OWNER(ndev); + netif_carrier_off(ndev); + netif_stop_queue(ndev); + + err = register_netdev(ndev); + if (err) { + printk(KERN_ERR "emac%d: failed to register net device (%d)!\n", + dev->def->index, err); + goto out6; + } - rc = register_netdev(ndev); - if (rc != 0) - goto bail; + ocp_set_drvdata(ocpdev, dev); - printk("%s: IBM emac, MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - ndev->name, + printk("%s: emac%d, MAC %02x:%02x:%02x:%02x:%02x:%02x\n", + ndev->name, dev->def->index, ndev->dev_addr[0], ndev->dev_addr[1], ndev->dev_addr[2], ndev->dev_addr[3], ndev->dev_addr[4], ndev->dev_addr[5]); - printk(KERN_INFO "%s: Found %s PHY (0x%02x)\n", - ndev->name, ep->phy_mii.def->name, ep->mii_phy_addr); - - bail: - if (rc && commac_reg) - mal_unregister_commac(ep->mal, &ep->commac); - if (rc && ndev) - kfree(ndev); - - return rc; -} - -static int emac_probe(struct ocp_device *ocpdev) -{ - struct ocp_device *maldev; - struct ibm_ocp_mal *mal; - struct ocp_func_emac_data *emacdata; - - emacdata = (struct ocp_func_emac_data *)ocpdev->def->additions; - if (emacdata == NULL) { - printk(KERN_ERR "emac%d: Missing additional datas !\n", - ocpdev->def->index); - return -ENODEV; - } - /* Get the MAL device */ - maldev = ocp_find_device(OCP_ANY_ID, OCP_FUNC_MAL, emacdata->mal_idx); - if (maldev == NULL) { - printk("No maldev\n"); - return -ENODEV; - } - /* - * Get MAL driver data, it must be here due to link order. - * When the driver is modularized, symbol dependencies will - * ensure the MAL driver is already present if built as a - * module. - */ - mal = (struct ibm_ocp_mal *)ocp_get_drvdata(maldev); - if (mal == NULL) { - printk("No maldrv\n"); - return -ENODEV; - } + if (dev->phy.address >= 0) + printk("%s: found %s PHY (0x%02x)\n", ndev->name, + dev->phy.def->name, dev->phy.address); - /* If we depend on another EMAC for MDIO, wait for it to show up */ - if (emacdata->mdio_idx >= 0 && - (emacdata->mdio_idx != ocpdev->def->index) && !mdio_ndev) { - struct emac_def_dev *ddev; - /* Add this index to the deferred init table */ - ddev = kmalloc(sizeof(struct emac_def_dev), GFP_KERNEL); - ddev->ocpdev = ocpdev; - ddev->mal = mal; - list_add_tail(&ddev->link, &emac_init_list); - } else { - emac_init_device(ocpdev, mal); - } + emac_dbg_register(dev->def->index, dev); return 0; + out6: + iounmap(dev->emacp); + out5: + tah_fini(dev->tah_dev); + out4: + rgmii_fini(dev->rgmii_dev, dev->rgmii_input); + out3: + zmii_fini(dev->zmii_dev, dev->zmii_input); + out2: + mal_unregister_commac(dev->mal, &dev->commac); + out: + kfree(ndev); + return err; } -/* Structure for a device driver */ static struct ocp_device_id emac_ids[] = { - {.vendor = OCP_ANY_ID,.function = OCP_FUNC_EMAC}, - {.vendor = OCP_VENDOR_INVALID} + { .vendor = OCP_VENDOR_IBM, .function = OCP_FUNC_EMAC }, + { .vendor = OCP_VENDOR_INVALID} }; static struct ocp_driver emac_driver = { .name = "emac", .id_table = emac_ids, - .probe = emac_probe, .remove = emac_remove, }; static int __init emac_init(void) { - printk(KERN_INFO DRV_NAME ": " DRV_DESC ", version " DRV_VERSION "\n"); - printk(KERN_INFO "Maintained by " DRV_AUTHOR "\n"); + printk(KERN_INFO DRV_DESC ", version " DRV_VERSION "\n"); + + DBG(": init" NL); - if (skb_res > 2) { - printk(KERN_WARNING "Invalid skb_res: %d, cropping to 2\n", - skb_res); - skb_res = 2; + if (mal_init()) + return -ENODEV; + + EMAC_CLK_INTERNAL; + if (ocp_register_driver(&emac_driver)) { + EMAC_CLK_EXTERNAL; + ocp_unregister_driver(&emac_driver); + mal_exit(); + return -ENODEV; } + EMAC_CLK_EXTERNAL; - return ocp_register_driver(&emac_driver); + emac_init_debug(); + return 0; } static void __exit emac_exit(void) { + DBG(": exit" NL); ocp_unregister_driver(&emac_driver); + mal_exit(); + emac_fini_debug(); } module_init(emac_init); diff --git a/drivers/net/ibm_emac/ibm_emac_core.h b/drivers/net/ibm_emac/ibm_emac_core.h index 97e6e1ea8..dabb94afe 100644 --- a/drivers/net/ibm_emac/ibm_emac_core.h +++ b/drivers/net/ibm_emac/ibm_emac_core.h @@ -1,146 +1,222 @@ /* - * ibm_emac_core.h + * drivers/net/ibm_emac/ibm_emac_core.h * - * Ethernet driver for the built in ethernet on the IBM 405 PowerPC - * processor. + * Driver for PowerPC 4xx on-chip ethernet controller. * - * Armin Kuster akuster@mvista.com - * Sept, 2001 + * Copyright (c) 2004, 2005 Zultys Technologies. + * Eugene Surovegin or * - * Orignial driver - * Johnnie Peters - * jpeters@mvista.com - * - * Copyright 2000 MontaVista Softare Inc. + * Based on original work by + * Armin Kuster + * Johnnie Peters + * Copyright 2000, 2001 MontaVista Softare 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. + * */ - -#ifndef _IBM_EMAC_CORE_H_ -#define _IBM_EMAC_CORE_H_ +#ifndef __IBM_EMAC_CORE_H_ +#define __IBM_EMAC_CORE_H_ #include +#include #include -#include /* For phys_addr_t */ #include "ibm_emac.h" #include "ibm_emac_phy.h" -#include "ibm_emac_rgmii.h" #include "ibm_emac_zmii.h" +#include "ibm_emac_rgmii.h" #include "ibm_emac_mal.h" #include "ibm_emac_tah.h" -#ifndef CONFIG_IBM_EMAC_TXB -#define NUM_TX_BUFF 64 -#define NUM_RX_BUFF 64 -#else -#define NUM_TX_BUFF CONFIG_IBM_EMAC_TXB -#define NUM_RX_BUFF CONFIG_IBM_EMAC_RXB -#endif +#define NUM_TX_BUFF CONFIG_IBM_EMAC_TXB +#define NUM_RX_BUFF CONFIG_IBM_EMAC_RXB -/* This does 16 byte alignment, exactly what we need. - * The packet length includes FCS, but we don't want to - * include that when passing upstream as it messes up - * bridging applications. - */ -#ifndef CONFIG_IBM_EMAC_SKBRES -#define SKB_RES 2 -#else -#define SKB_RES CONFIG_IBM_EMAC_SKBRES +/* Simple sanity check */ +#if NUM_TX_BUFF > 256 || NUM_RX_BUFF > 256 +#error Invalid number of buffer descriptors (greater than 256) #endif -/* Note about alignement. alloc_skb() returns a cache line - * aligned buffer. However, dev_alloc_skb() will add 16 more - * bytes and "reserve" them, so our buffer will actually end - * on a half cache line. What we do is to use directly - * alloc_skb, allocate 16 more bytes to match the total amount - * allocated by dev_alloc_skb(), but we don't reserve. +// XXX +#define EMAC_MIN_MTU 46 +#define EMAC_MAX_MTU 9000 + +/* Maximum L2 header length (VLAN tagged, no FCS) */ +#define EMAC_MTU_OVERHEAD (6 * 2 + 2 + 4) + +/* RX BD size for the given MTU */ +static inline int emac_rx_size(int mtu) +{ + if (mtu > ETH_DATA_LEN) + return MAL_MAX_RX_SIZE; + else + return mal_rx_size(ETH_DATA_LEN + EMAC_MTU_OVERHEAD); +} + +#define EMAC_DMA_ALIGN(x) ALIGN((x), dma_get_cache_alignment()) + +#define EMAC_RX_SKB_HEADROOM \ + EMAC_DMA_ALIGN(CONFIG_IBM_EMAC_RX_SKB_HEADROOM) + +/* Size of RX skb for the given MTU */ +static inline int emac_rx_skb_size(int mtu) +{ + int size = max(mtu + EMAC_MTU_OVERHEAD, emac_rx_size(mtu)); + return EMAC_DMA_ALIGN(size + 2) + EMAC_RX_SKB_HEADROOM; +} + +/* RX DMA sync size */ +static inline int emac_rx_sync_size(int mtu) +{ + return EMAC_DMA_ALIGN(emac_rx_size(mtu) + 2); +} + +/* Driver statistcs is split into two parts to make it more cache friendly: + * - normal statistics (packet count, etc) + * - error statistics + * + * When statistics is requested by ethtool, these parts are concatenated, + * normal one goes first. + * + * Please, keep these structures in sync with emac_stats_keys. */ -#define MAX_NUM_BUF_DESC 255 -#define DESC_BUF_SIZE 4080 /* max 4096-16 */ -#define DESC_BUF_SIZE_REG (DESC_BUF_SIZE / 16) - -/* Transmitter timeout. */ -#define TX_TIMEOUT (2*HZ) - -/* MDIO latency delay */ -#define MDIO_DELAY 250 - -/* Power managment shift registers */ -#define IBM_CPM_EMMII 0 /* Shift value for MII */ -#define IBM_CPM_EMRX 1 /* Shift value for recv */ -#define IBM_CPM_EMTX 2 /* Shift value for MAC */ -#define IBM_CPM_EMAC(x) (((x)>>IBM_CPM_EMMII) | ((x)>>IBM_CPM_EMRX) | ((x)>>IBM_CPM_EMTX)) - -#define ENET_HEADER_SIZE 14 -#define ENET_FCS_SIZE 4 -#define ENET_DEF_MTU_SIZE 1500 -#define ENET_DEF_BUF_SIZE (ENET_DEF_MTU_SIZE + ENET_HEADER_SIZE + ENET_FCS_SIZE) -#define EMAC_MIN_FRAME 64 -#define EMAC_MAX_FRAME 9018 -#define EMAC_MIN_MTU (EMAC_MIN_FRAME - ENET_HEADER_SIZE - ENET_FCS_SIZE) -#define EMAC_MAX_MTU (EMAC_MAX_FRAME - ENET_HEADER_SIZE - ENET_FCS_SIZE) - -#ifdef CONFIG_IBM_EMAC_ERRMSG -void emac_serr_dump_0(struct net_device *dev); -void emac_serr_dump_1(struct net_device *dev); -void emac_err_dump(struct net_device *dev, int em0isr); -void emac_phy_dump(struct net_device *); -void emac_desc_dump(struct net_device *); -void emac_mac_dump(struct net_device *); -void emac_mal_dump(struct net_device *); -#else -#define emac_serr_dump_0(dev) do { } while (0) -#define emac_serr_dump_1(dev) do { } while (0) -#define emac_err_dump(dev,x) do { } while (0) -#define emac_phy_dump(dev) do { } while (0) -#define emac_desc_dump(dev) do { } while (0) -#define emac_mac_dump(dev) do { } while (0) -#define emac_mal_dump(dev) do { } while (0) -#endif + +/* Normal TX/RX Statistics */ +struct ibm_emac_stats { + u64 rx_packets; + u64 rx_bytes; + u64 tx_packets; + u64 tx_bytes; + u64 rx_packets_csum; + u64 tx_packets_csum; +}; + +/* Error statistics */ +struct ibm_emac_error_stats { + u64 tx_undo; + + /* Software RX Errors */ + u64 rx_dropped_stack; + u64 rx_dropped_oom; + u64 rx_dropped_error; + u64 rx_dropped_resize; + u64 rx_dropped_mtu; + u64 rx_stopped; + /* BD reported RX errors */ + u64 rx_bd_errors; + u64 rx_bd_overrun; + u64 rx_bd_bad_packet; + u64 rx_bd_runt_packet; + u64 rx_bd_short_event; + u64 rx_bd_alignment_error; + u64 rx_bd_bad_fcs; + u64 rx_bd_packet_too_long; + u64 rx_bd_out_of_range; + u64 rx_bd_in_range; + /* EMAC IRQ reported RX errors */ + u64 rx_parity; + u64 rx_fifo_overrun; + u64 rx_overrun; + u64 rx_bad_packet; + u64 rx_runt_packet; + u64 rx_short_event; + u64 rx_alignment_error; + u64 rx_bad_fcs; + u64 rx_packet_too_long; + u64 rx_out_of_range; + u64 rx_in_range; + + /* Software TX Errors */ + u64 tx_dropped; + /* BD reported TX errors */ + u64 tx_bd_errors; + u64 tx_bd_bad_fcs; + u64 tx_bd_carrier_loss; + u64 tx_bd_excessive_deferral; + u64 tx_bd_excessive_collisions; + u64 tx_bd_late_collision; + u64 tx_bd_multple_collisions; + u64 tx_bd_single_collision; + u64 tx_bd_underrun; + u64 tx_bd_sqe; + /* EMAC IRQ reported TX errors */ + u64 tx_parity; + u64 tx_underrun; + u64 tx_sqe; + u64 tx_errors; +}; + +#define EMAC_ETHTOOL_STATS_COUNT ((sizeof(struct ibm_emac_stats) + \ + sizeof(struct ibm_emac_error_stats)) \ + / sizeof(u64)) struct ocp_enet_private { - struct sk_buff *tx_skb[NUM_TX_BUFF]; - struct sk_buff *rx_skb[NUM_RX_BUFF]; - struct mal_descriptor *tx_desc; - struct mal_descriptor *rx_desc; - struct mal_descriptor *rx_dirty; - struct net_device_stats stats; - int tx_cnt; - int rx_slot; - int dirty_rx; - int tx_slot; - int ack_slot; - int rx_buffer_size; - - struct mii_phy phy_mii; - int mii_phy_addr; - int want_autoneg; - int timer_ticks; - struct timer_list link_timer; - struct net_device *mdio_dev; - - struct ocp_device *rgmii_dev; - int rgmii_input; - - struct ocp_device *zmii_dev; - int zmii_input; - - struct ibm_ocp_mal *mal; - int mal_tx_chan, mal_rx_chan; - struct mal_commac commac; - - struct ocp_device *tah_dev; - - int opened; - int going_away; - int wol_irq; - emac_t *emacp; - struct ocp_device *ocpdev; - struct net_device *ndev; - spinlock_t lock; + struct net_device *ndev; /* 0 */ + struct emac_regs __iomem *emacp; + + struct mal_descriptor *tx_desc; + int tx_cnt; + int tx_slot; + int ack_slot; + + struct mal_descriptor *rx_desc; + int rx_slot; + struct sk_buff *rx_sg_skb; /* 1 */ + int rx_skb_size; + int rx_sync_size; + + struct ibm_emac_stats stats; + struct ocp_device *tah_dev; + + struct ibm_ocp_mal *mal; + struct mal_commac commac; + + struct sk_buff *tx_skb[NUM_TX_BUFF]; + struct sk_buff *rx_skb[NUM_RX_BUFF]; + + struct ocp_device *zmii_dev; + int zmii_input; + struct ocp_enet_private *mdio_dev; + struct ocp_device *rgmii_dev; + int rgmii_input; + + struct ocp_def *def; + + struct mii_phy phy; + struct timer_list link_timer; + int reset_failed; + + int stop_timeout; /* in us */ + + struct ibm_emac_error_stats estats; + struct net_device_stats nstats; + + struct device* ldev; +}; + +/* Ethtool get_regs complex data. + * We want to get not just EMAC registers, but also MAL, ZMII, RGMII, TAH + * when available. + * + * Returned BLOB consists of the ibm_emac_ethtool_regs_hdr, + * MAL registers, EMAC registers and optional ZMII, RGMII, TAH registers. + * Each register component is preceded with emac_ethtool_regs_subhdr. + * Order of the optional headers follows their relative bit posititions + * in emac_ethtool_regs_hdr.components + */ +#define EMAC_ETHTOOL_REGS_ZMII 0x00000001 +#define EMAC_ETHTOOL_REGS_RGMII 0x00000002 +#define EMAC_ETHTOOL_REGS_TAH 0x00000004 + +struct emac_ethtool_regs_hdr { + u32 components; +}; + +struct emac_ethtool_regs_subhdr { + u32 version; + u32 index; }; -#endif /* _IBM_EMAC_CORE_H_ */ + +#endif /* __IBM_EMAC_CORE_H_ */ diff --git a/drivers/net/ibm_emac/ibm_emac_debug.c b/drivers/net/ibm_emac/ibm_emac_debug.c index c8512046c..c36459080 100644 --- a/drivers/net/ibm_emac/ibm_emac_debug.c +++ b/drivers/net/ibm_emac/ibm_emac_debug.c @@ -1,224 +1,212 @@ /* - * ibm_ocp_debug.c + * drivers/net/ibm_emac/ibm_emac_debug.c * - * This has all the debug routines that where in *_enet.c + * Driver for PowerPC 4xx on-chip ethernet controller, debug print routines. * - * Armin Kuster akuster@mvista.com - * April , 2002 - * - * Copyright 2002 MontaVista Softare Inc. + * Copyright (c) 2004, 2005 Zultys Technologies + * Eugene Surovegin or * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. + * */ - -#include +#include +#include #include #include +#include #include -#include "ibm_ocp_mal.h" -#include "ibm_ocp_zmii.h" -#include "ibm_ocp_enet.h" -extern int emac_phy_read(struct net_device *dev, int mii_id, int reg); +#include "ibm_emac_core.h" + +static void emac_desc_dump(int idx, struct ocp_enet_private *p) +{ + int i; + printk("** EMAC%d TX BDs **\n" + " tx_cnt = %d tx_slot = %d ack_slot = %d\n", + idx, p->tx_cnt, p->tx_slot, p->ack_slot); + for (i = 0; i < NUM_TX_BUFF / 2; ++i) + printk + ("bd[%2d] 0x%08x %c 0x%04x %4u - bd[%2d] 0x%08x %c 0x%04x %4u\n", + i, p->tx_desc[i].data_ptr, p->tx_skb[i] ? 'V' : ' ', + p->tx_desc[i].ctrl, p->tx_desc[i].data_len, + NUM_TX_BUFF / 2 + i, + p->tx_desc[NUM_TX_BUFF / 2 + i].data_ptr, + p->tx_skb[NUM_TX_BUFF / 2 + i] ? 'V' : ' ', + p->tx_desc[NUM_TX_BUFF / 2 + i].ctrl, + p->tx_desc[NUM_TX_BUFF / 2 + i].data_len); + + printk("** EMAC%d RX BDs **\n" + " rx_slot = %d rx_stopped = %d rx_skb_size = %d rx_sync_size = %d\n" + " rx_sg_skb = 0x%p\n", + idx, p->rx_slot, p->commac.rx_stopped, p->rx_skb_size, + p->rx_sync_size, p->rx_sg_skb); + for (i = 0; i < NUM_RX_BUFF / 2; ++i) + printk + ("bd[%2d] 0x%08x %c 0x%04x %4u - bd[%2d] 0x%08x %c 0x%04x %4u\n", + i, p->rx_desc[i].data_ptr, p->rx_skb[i] ? 'V' : ' ', + p->rx_desc[i].ctrl, p->rx_desc[i].data_len, + NUM_RX_BUFF / 2 + i, + p->rx_desc[NUM_RX_BUFF / 2 + i].data_ptr, + p->rx_skb[NUM_RX_BUFF / 2 + i] ? 'V' : ' ', + p->rx_desc[NUM_RX_BUFF / 2 + i].ctrl, + p->rx_desc[NUM_RX_BUFF / 2 + i].data_len); +} + +static void emac_mac_dump(int idx, struct ocp_enet_private *dev) +{ + struct emac_regs __iomem *p = dev->emacp; + + printk("** EMAC%d registers **\n" + "MR0 = 0x%08x MR1 = 0x%08x TMR0 = 0x%08x TMR1 = 0x%08x\n" + "RMR = 0x%08x ISR = 0x%08x ISER = 0x%08x\n" + "IAR = %04x%08x VTPID = 0x%04x VTCI = 0x%04x\n" + "IAHT: 0x%04x 0x%04x 0x%04x 0x%04x " + "GAHT: 0x%04x 0x%04x 0x%04x 0x%04x\n" + "LSA = %04x%08x IPGVR = 0x%04x\n" + "STACR = 0x%08x TRTR = 0x%08x RWMR = 0x%08x\n" + "OCTX = 0x%08x OCRX = 0x%08x IPCR = 0x%08x\n", + idx, in_be32(&p->mr0), in_be32(&p->mr1), + in_be32(&p->tmr0), in_be32(&p->tmr1), + in_be32(&p->rmr), in_be32(&p->isr), in_be32(&p->iser), + in_be32(&p->iahr), in_be32(&p->ialr), in_be32(&p->vtpid), + in_be32(&p->vtci), + in_be32(&p->iaht1), in_be32(&p->iaht2), in_be32(&p->iaht3), + in_be32(&p->iaht4), + in_be32(&p->gaht1), in_be32(&p->gaht2), in_be32(&p->gaht3), + in_be32(&p->gaht4), + in_be32(&p->lsah), in_be32(&p->lsal), in_be32(&p->ipgvr), + in_be32(&p->stacr), in_be32(&p->trtr), in_be32(&p->rwmr), + in_be32(&p->octx), in_be32(&p->ocrx), in_be32(&p->ipcr) + ); + + emac_desc_dump(idx, dev); +} + +static void emac_mal_dump(struct ibm_ocp_mal *mal) +{ + struct ocp_func_mal_data *maldata = mal->def->additions; + int i; + + printk("** MAL%d Registers **\n" + "CFG = 0x%08x ESR = 0x%08x IER = 0x%08x\n" + "TX|CASR = 0x%08x CARR = 0x%08x EOBISR = 0x%08x DEIR = 0x%08x\n" + "RX|CASR = 0x%08x CARR = 0x%08x EOBISR = 0x%08x DEIR = 0x%08x\n", + mal->def->index, + get_mal_dcrn(mal, MAL_CFG), get_mal_dcrn(mal, MAL_ESR), + get_mal_dcrn(mal, MAL_IER), + get_mal_dcrn(mal, MAL_TXCASR), get_mal_dcrn(mal, MAL_TXCARR), + get_mal_dcrn(mal, MAL_TXEOBISR), get_mal_dcrn(mal, MAL_TXDEIR), + get_mal_dcrn(mal, MAL_RXCASR), get_mal_dcrn(mal, MAL_RXCARR), + get_mal_dcrn(mal, MAL_RXEOBISR), get_mal_dcrn(mal, MAL_RXDEIR) + ); + + printk("TX|"); + for (i = 0; i < maldata->num_tx_chans; ++i) { + if (i && !(i % 4)) + printk("\n "); + printk("CTP%d = 0x%08x ", i, get_mal_dcrn(mal, MAL_TXCTPR(i))); + } + printk("\nRX|"); + for (i = 0; i < maldata->num_rx_chans; ++i) { + if (i && !(i % 4)) + printk("\n "); + printk("CTP%d = 0x%08x ", i, get_mal_dcrn(mal, MAL_RXCTPR(i))); + } + printk("\n "); + for (i = 0; i < maldata->num_rx_chans; ++i) { + u32 r = get_mal_dcrn(mal, MAL_RCBS(i)); + if (i && !(i % 3)) + printk("\n "); + printk("RCBS%d = 0x%08x (%d) ", i, r, r * 16); + } + printk("\n"); +} + +static struct ocp_enet_private *__emacs[4]; +static struct ibm_ocp_mal *__mals[1]; -void emac_phy_dump(struct net_device *dev) +void emac_dbg_register(int idx, struct ocp_enet_private *dev) { - struct ocp_enet_private *fep = dev->priv; - unsigned long i; - uint data; - - printk(KERN_DEBUG " Prepare for Phy dump....\n"); - for (i = 0; i < 0x1A; i++) { - data = emac_phy_read(dev, fep->mii_phy_addr, i); - printk(KERN_DEBUG "Phy reg 0x%lx ==> %4x\n", i, data); - if (i == 0x07) - i = 0x0f; + unsigned long flags; + + if (idx >= sizeof(__emacs) / sizeof(__emacs[0])) { + printk(KERN_WARNING + "invalid index %d when registering EMAC for debugging\n", + idx); + return; } + + local_irq_save(flags); + __emacs[idx] = dev; + local_irq_restore(flags); } -void emac_desc_dump(struct net_device *dev) +void mal_dbg_register(int idx, struct ibm_ocp_mal *mal) { - struct ocp_enet_private *fep = dev->priv; - int curr_slot; - - printk(KERN_DEBUG - "dumping the receive descriptors: current slot is %d\n", - fep->rx_slot); - for (curr_slot = 0; curr_slot < NUM_RX_BUFF; curr_slot++) { - printk(KERN_DEBUG - "Desc %02d: status 0x%04x, length %3d, addr 0x%x\n", - curr_slot, fep->rx_desc[curr_slot].ctrl, - fep->rx_desc[curr_slot].data_len, - (unsigned int)fep->rx_desc[curr_slot].data_ptr); + unsigned long flags; + + if (idx >= sizeof(__mals) / sizeof(__mals[0])) { + printk(KERN_WARNING + "invalid index %d when registering MAL for debugging\n", + idx); + return; } + + local_irq_save(flags); + __mals[idx] = mal; + local_irq_restore(flags); } -void emac_mac_dump(struct net_device *dev) +void emac_dbg_dump_all(void) { - struct ocp_enet_private *fep = dev->priv; - volatile emac_t *emacp = fep->emacp; - - printk(KERN_DEBUG "EMAC DEBUG ********** \n"); - printk(KERN_DEBUG "EMAC_M0 ==> 0x%x\n", in_be32(&emacp->em0mr0)); - printk(KERN_DEBUG "EMAC_M1 ==> 0x%x\n", in_be32(&emacp->em0mr1)); - printk(KERN_DEBUG "EMAC_TXM0==> 0x%x\n", in_be32(&emacp->em0tmr0)); - printk(KERN_DEBUG "EMAC_TXM1==> 0x%x\n", in_be32(&emacp->em0tmr1)); - printk(KERN_DEBUG "EMAC_RXM ==> 0x%x\n", in_be32(&emacp->em0rmr)); - printk(KERN_DEBUG "EMAC_ISR ==> 0x%x\n", in_be32(&emacp->em0isr)); - printk(KERN_DEBUG "EMAC_IER ==> 0x%x\n", in_be32(&emacp->em0iser)); - printk(KERN_DEBUG "EMAC_IAH ==> 0x%x\n", in_be32(&emacp->em0iahr)); - printk(KERN_DEBUG "EMAC_IAL ==> 0x%x\n", in_be32(&emacp->em0ialr)); - printk(KERN_DEBUG "EMAC_VLAN_TPID_REG ==> 0x%x\n", - in_be32(&emacp->em0vtpid)); + unsigned int i; + unsigned long flags; + + local_irq_save(flags); + + for (i = 0; i < sizeof(__mals) / sizeof(__mals[0]); ++i) + if (__mals[i]) + emac_mal_dump(__mals[i]); + + for (i = 0; i < sizeof(__emacs) / sizeof(__emacs[0]); ++i) + if (__emacs[i]) + emac_mac_dump(i, __emacs[i]); + + local_irq_restore(flags); } -void emac_mal_dump(struct net_device *dev) +#if defined(CONFIG_MAGIC_SYSRQ) +static void emac_sysrq_handler(int key, struct pt_regs *pt_regs, + struct tty_struct *tty) { - struct ibm_ocp_mal *mal = ((struct ocp_enet_private *)dev->priv)->mal; - - printk(KERN_DEBUG " MAL DEBUG ********** \n"); - printk(KERN_DEBUG " MCR ==> 0x%x\n", - (unsigned int)get_mal_dcrn(mal, DCRN_MALCR)); - printk(KERN_DEBUG " ESR ==> 0x%x\n", - (unsigned int)get_mal_dcrn(mal, DCRN_MALESR)); - printk(KERN_DEBUG " IER ==> 0x%x\n", - (unsigned int)get_mal_dcrn(mal, DCRN_MALIER)); -#ifdef CONFIG_40x - printk(KERN_DEBUG " DBR ==> 0x%x\n", - (unsigned int)get_mal_dcrn(mal, DCRN_MALDBR)); -#endif /* CONFIG_40x */ - printk(KERN_DEBUG " TXCASR ==> 0x%x\n", - (unsigned int)get_mal_dcrn(mal, DCRN_MALTXCASR)); - printk(KERN_DEBUG " TXCARR ==> 0x%x\n", - (unsigned int)get_mal_dcrn(mal, DCRN_MALTXCARR)); - printk(KERN_DEBUG " TXEOBISR ==> 0x%x\n", - (unsigned int)get_mal_dcrn(mal, DCRN_MALTXEOBISR)); - printk(KERN_DEBUG " TXDEIR ==> 0x%x\n", - (unsigned int)get_mal_dcrn(mal, DCRN_MALTXDEIR)); - printk(KERN_DEBUG " RXCASR ==> 0x%x\n", - (unsigned int)get_mal_dcrn(mal, DCRN_MALRXCASR)); - printk(KERN_DEBUG " RXCARR ==> 0x%x\n", - (unsigned int)get_mal_dcrn(mal, DCRN_MALRXCARR)); - printk(KERN_DEBUG " RXEOBISR ==> 0x%x\n", - (unsigned int)get_mal_dcrn(mal, DCRN_MALRXEOBISR)); - printk(KERN_DEBUG " RXDEIR ==> 0x%x\n", - (unsigned int)get_mal_dcrn(mal, DCRN_MALRXDEIR)); - printk(KERN_DEBUG " TXCTP0R ==> 0x%x\n", - (unsigned int)get_mal_dcrn(mal, DCRN_MALTXCTP0R)); - printk(KERN_DEBUG " TXCTP1R ==> 0x%x\n", - (unsigned int)get_mal_dcrn(mal, DCRN_MALTXCTP1R)); - printk(KERN_DEBUG " TXCTP2R ==> 0x%x\n", - (unsigned int)get_mal_dcrn(mal, DCRN_MALTXCTP2R)); - printk(KERN_DEBUG " TXCTP3R ==> 0x%x\n", - (unsigned int)get_mal_dcrn(mal, DCRN_MALTXCTP3R)); - printk(KERN_DEBUG " RXCTP0R ==> 0x%x\n", - (unsigned int)get_mal_dcrn(mal, DCRN_MALRXCTP0R)); - printk(KERN_DEBUG " RXCTP1R ==> 0x%x\n", - (unsigned int)get_mal_dcrn(mal, DCRN_MALRXCTP1R)); - printk(KERN_DEBUG " RCBS0 ==> 0x%x\n", - (unsigned int)get_mal_dcrn(mal, DCRN_MALRCBS0)); - printk(KERN_DEBUG " RCBS1 ==> 0x%x\n", - (unsigned int)get_mal_dcrn(mal, DCRN_MALRCBS1)); + emac_dbg_dump_all(); } -void emac_serr_dump_0(struct net_device *dev) +static struct sysrq_key_op emac_sysrq_op = { + .handler = emac_sysrq_handler, + .help_msg = "emaC", + .action_msg = "Show EMAC(s) status", +}; + +int __init emac_init_debug(void) { - struct ibm_ocp_mal *mal = ((struct ocp_enet_private *)dev->priv)->mal; - unsigned long int mal_error, plb_error, plb_addr; - - mal_error = get_mal_dcrn(mal, DCRN_MALESR); - printk(KERN_DEBUG "ppc405_eth_serr: %s channel %ld \n", - (mal_error & 0x40000000) ? "Receive" : - "Transmit", (mal_error & 0x3e000000) >> 25); - printk(KERN_DEBUG " ----- latched error -----\n"); - if (mal_error & MALESR_DE) - printk(KERN_DEBUG " DE: descriptor error\n"); - if (mal_error & MALESR_OEN) - printk(KERN_DEBUG " ONE: OPB non-fullword error\n"); - if (mal_error & MALESR_OTE) - printk(KERN_DEBUG " OTE: OPB timeout error\n"); - if (mal_error & MALESR_OSE) - printk(KERN_DEBUG " OSE: OPB slave error\n"); - - if (mal_error & MALESR_PEIN) { - plb_error = mfdcr(DCRN_PLB0_BESR); - printk(KERN_DEBUG - " PEIN: PLB error, PLB0_BESR is 0x%x\n", - (unsigned int)plb_error); - plb_addr = mfdcr(DCRN_PLB0_BEAR); - printk(KERN_DEBUG - " PEIN: PLB error, PLB0_BEAR is 0x%x\n", - (unsigned int)plb_addr); - } + return register_sysrq_key('c', &emac_sysrq_op); } -void emac_serr_dump_1(struct net_device *dev) +void __exit emac_fini_debug(void) { - struct ibm_ocp_mal *mal = ((struct ocp_enet_private *)dev->priv)->mal; - int mal_error = get_mal_dcrn(mal, DCRN_MALESR); - - printk(KERN_DEBUG " ----- cumulative errors -----\n"); - if (mal_error & MALESR_DEI) - printk(KERN_DEBUG " DEI: descriptor error interrupt\n"); - if (mal_error & MALESR_ONEI) - printk(KERN_DEBUG " OPB non-fullword error interrupt\n"); - if (mal_error & MALESR_OTEI) - printk(KERN_DEBUG " OTEI: timeout error interrupt\n"); - if (mal_error & MALESR_OSEI) - printk(KERN_DEBUG " OSEI: slave error interrupt\n"); - if (mal_error & MALESR_PBEI) - printk(KERN_DEBUG " PBEI: PLB bus error interrupt\n"); + unregister_sysrq_key('c', &emac_sysrq_op); } -void emac_err_dump(struct net_device *dev, int em0isr) +#else +int __init emac_init_debug(void) +{ + return 0; +} +void __exit emac_fini_debug(void) { - printk(KERN_DEBUG "%s: on-chip ethernet error:\n", dev->name); - - if (em0isr & EMAC_ISR_OVR) - printk(KERN_DEBUG " OVR: overrun\n"); - if (em0isr & EMAC_ISR_PP) - printk(KERN_DEBUG " PP: control pause packet\n"); - if (em0isr & EMAC_ISR_BP) - printk(KERN_DEBUG " BP: packet error\n"); - if (em0isr & EMAC_ISR_RP) - printk(KERN_DEBUG " RP: runt packet\n"); - if (em0isr & EMAC_ISR_SE) - printk(KERN_DEBUG " SE: short event\n"); - if (em0isr & EMAC_ISR_ALE) - printk(KERN_DEBUG " ALE: odd number of nibbles in packet\n"); - if (em0isr & EMAC_ISR_BFCS) - printk(KERN_DEBUG " BFCS: bad FCS\n"); - if (em0isr & EMAC_ISR_PTLE) - printk(KERN_DEBUG " PTLE: oversized packet\n"); - if (em0isr & EMAC_ISR_ORE) - printk(KERN_DEBUG - " ORE: packet length field > max allowed LLC\n"); - if (em0isr & EMAC_ISR_IRE) - printk(KERN_DEBUG " IRE: In Range error\n"); - if (em0isr & EMAC_ISR_DBDM) - printk(KERN_DEBUG " DBDM: xmit error or SQE\n"); - if (em0isr & EMAC_ISR_DB0) - printk(KERN_DEBUG " DB0: xmit error or SQE on TX channel 0\n"); - if (em0isr & EMAC_ISR_SE0) - printk(KERN_DEBUG - " SE0: Signal Quality Error test failure from TX channel 0\n"); - if (em0isr & EMAC_ISR_TE0) - printk(KERN_DEBUG " TE0: xmit channel 0 aborted\n"); - if (em0isr & EMAC_ISR_DB1) - printk(KERN_DEBUG " DB1: xmit error or SQE on TX channel \n"); - if (em0isr & EMAC_ISR_SE1) - printk(KERN_DEBUG - " SE1: Signal Quality Error test failure from TX channel 1\n"); - if (em0isr & EMAC_ISR_TE1) - printk(KERN_DEBUG " TE1: xmit channel 1 aborted\n"); - if (em0isr & EMAC_ISR_MOS) - printk(KERN_DEBUG " MOS\n"); - if (em0isr & EMAC_ISR_MOF) - printk(KERN_DEBUG " MOF\n"); - - emac_mac_dump(dev); - emac_mal_dump(dev); } +#endif /* CONFIG_MAGIC_SYSRQ */ diff --git a/drivers/net/ibm_emac/ibm_emac_debug.h b/drivers/net/ibm_emac/ibm_emac_debug.h index e85fbe0a8..576138949 100644 --- a/drivers/net/ibm_emac/ibm_emac_debug.h +++ b/drivers/net/ibm_emac/ibm_emac_debug.h @@ -15,7 +15,6 @@ #ifndef __IBM_EMAC_DEBUG_H_ #define __IBM_EMAC_DEBUG_H_ -#include #include #include "ibm_emac_core.h" #include "ibm_emac_mal.h" diff --git a/drivers/net/ibm_emac/ibm_emac_mal.c b/drivers/net/ibm_emac/ibm_emac_mal.c index e59f57f36..af50e7b2e 100644 --- a/drivers/net/ibm_emac/ibm_emac_mal.c +++ b/drivers/net/ibm_emac/ibm_emac_mal.c @@ -1,436 +1,564 @@ /* - * ibm_ocp_mal.c + * drivers/net/ibm_emac/ibm_emac_mal.c * - * Armin Kuster akuster@mvista.com - * Juen, 2002 + * Memory Access Layer (MAL) support + * + * Copyright (c) 2004, 2005 Zultys Technologies. + * Eugene Surovegin or * - * Copyright 2002 MontaVista Softare Inc. + * Based on original work by + * Benjamin Herrenschmidt , + * David Gibson , + * + * Armin Kuster + * Copyright 2002 MontaVista Softare 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. + * */ - -#include #include #include #include #include #include +#include #include -#include -#include #include +#include "ibm_emac_core.h" #include "ibm_emac_mal.h" +#include "ibm_emac_debug.h" -// Locking: Should we share a lock with the client ? The client could provide -// a lock pointer (optionally) in the commac structure... I don't think this is -// really necessary though - -/* This lock protects the commac list. On today UP implementations, it's - * really only used as IRQ protection in mal_{register,unregister}_commac() - */ -static DEFINE_RWLOCK(mal_list_lock); - -int mal_register_commac(struct ibm_ocp_mal *mal, struct mal_commac *commac) +int __init mal_register_commac(struct ibm_ocp_mal *mal, + struct mal_commac *commac) { unsigned long flags; + local_irq_save(flags); - write_lock_irqsave(&mal_list_lock, flags); + MAL_DBG("%d: reg(%08x, %08x)" NL, mal->def->index, + commac->tx_chan_mask, commac->rx_chan_mask); - /* Don't let multiple commacs claim the same channel */ + /* Don't let multiple commacs claim the same channel(s) */ if ((mal->tx_chan_mask & commac->tx_chan_mask) || (mal->rx_chan_mask & commac->rx_chan_mask)) { - write_unlock_irqrestore(&mal_list_lock, flags); + local_irq_restore(flags); + printk(KERN_WARNING "mal%d: COMMAC channels conflict!\n", + mal->def->index); return -EBUSY; } mal->tx_chan_mask |= commac->tx_chan_mask; mal->rx_chan_mask |= commac->rx_chan_mask; + list_add(&commac->list, &mal->list); - list_add(&commac->list, &mal->commac); - - write_unlock_irqrestore(&mal_list_lock, flags); - + local_irq_restore(flags); return 0; } -int mal_unregister_commac(struct ibm_ocp_mal *mal, struct mal_commac *commac) +void __exit mal_unregister_commac(struct ibm_ocp_mal *mal, + struct mal_commac *commac) { unsigned long flags; + local_irq_save(flags); - write_lock_irqsave(&mal_list_lock, flags); + MAL_DBG("%d: unreg(%08x, %08x)" NL, mal->def->index, + commac->tx_chan_mask, commac->rx_chan_mask); mal->tx_chan_mask &= ~commac->tx_chan_mask; mal->rx_chan_mask &= ~commac->rx_chan_mask; - list_del_init(&commac->list); - write_unlock_irqrestore(&mal_list_lock, flags); - - return 0; + local_irq_restore(flags); } int mal_set_rcbs(struct ibm_ocp_mal *mal, int channel, unsigned long size) { - switch (channel) { - case 0: - set_mal_dcrn(mal, DCRN_MALRCBS0, size); - break; -#ifdef DCRN_MALRCBS1 - case 1: - set_mal_dcrn(mal, DCRN_MALRCBS1, size); - break; -#endif -#ifdef DCRN_MALRCBS2 - case 2: - set_mal_dcrn(mal, DCRN_MALRCBS2, size); - break; -#endif -#ifdef DCRN_MALRCBS3 - case 3: - set_mal_dcrn(mal, DCRN_MALRCBS3, size); - break; -#endif - default: + struct ocp_func_mal_data *maldata = mal->def->additions; + BUG_ON(channel < 0 || channel >= maldata->num_rx_chans || + size > MAL_MAX_RX_SIZE); + + MAL_DBG("%d: set_rbcs(%d, %lu)" NL, mal->def->index, channel, size); + + if (size & 0xf) { + printk(KERN_WARNING + "mal%d: incorrect RX size %lu for the channel %d\n", + mal->def->index, size, channel); return -EINVAL; } + set_mal_dcrn(mal, MAL_RCBS(channel), size >> 4); return 0; } -static irqreturn_t mal_serr(int irq, void *dev_instance, struct pt_regs *regs) +int mal_tx_bd_offset(struct ibm_ocp_mal *mal, int channel) { - struct ibm_ocp_mal *mal = dev_instance; - unsigned long mal_error; + struct ocp_func_mal_data *maldata = mal->def->additions; + BUG_ON(channel < 0 || channel >= maldata->num_tx_chans); + return channel * NUM_TX_BUFF; +} - /* - * This SERR applies to one of the devices on the MAL, here we charge - * it against the first EMAC registered for the MAL. - */ +int mal_rx_bd_offset(struct ibm_ocp_mal *mal, int channel) +{ + struct ocp_func_mal_data *maldata = mal->def->additions; + BUG_ON(channel < 0 || channel >= maldata->num_rx_chans); + return maldata->num_tx_chans * NUM_TX_BUFF + channel * NUM_RX_BUFF; +} - mal_error = get_mal_dcrn(mal, DCRN_MALESR); +void mal_enable_tx_channel(struct ibm_ocp_mal *mal, int channel) +{ + local_bh_disable(); + MAL_DBG("%d: enable_tx(%d)" NL, mal->def->index, channel); + set_mal_dcrn(mal, MAL_TXCASR, + get_mal_dcrn(mal, MAL_TXCASR) | MAL_CHAN_MASK(channel)); + local_bh_enable(); +} - printk(KERN_ERR "%s: System Error (MALESR=%lx)\n", - "MAL" /* FIXME: get the name right */ , mal_error); +void mal_disable_tx_channel(struct ibm_ocp_mal *mal, int channel) +{ + set_mal_dcrn(mal, MAL_TXCARR, MAL_CHAN_MASK(channel)); + MAL_DBG("%d: disable_tx(%d)" NL, mal->def->index, channel); +} - /* FIXME: decipher error */ - /* DIXME: distribute to commacs, if possible */ +void mal_enable_rx_channel(struct ibm_ocp_mal *mal, int channel) +{ + local_bh_disable(); + MAL_DBG("%d: enable_rx(%d)" NL, mal->def->index, channel); + set_mal_dcrn(mal, MAL_RXCASR, + get_mal_dcrn(mal, MAL_RXCASR) | MAL_CHAN_MASK(channel)); + local_bh_enable(); +} - /* Clear the error status register */ - set_mal_dcrn(mal, DCRN_MALESR, mal_error); +void mal_disable_rx_channel(struct ibm_ocp_mal *mal, int channel) +{ + set_mal_dcrn(mal, MAL_RXCARR, MAL_CHAN_MASK(channel)); + MAL_DBG("%d: disable_rx(%d)" NL, mal->def->index, channel); +} - return IRQ_HANDLED; +void mal_poll_add(struct ibm_ocp_mal *mal, struct mal_commac *commac) +{ + local_bh_disable(); + MAL_DBG("%d: poll_add(%p)" NL, mal->def->index, commac); + list_add_tail(&commac->poll_list, &mal->poll_list); + local_bh_enable(); } -static irqreturn_t mal_txeob(int irq, void *dev_instance, struct pt_regs *regs) +void mal_poll_del(struct ibm_ocp_mal *mal, struct mal_commac *commac) +{ + local_bh_disable(); + MAL_DBG("%d: poll_del(%p)" NL, mal->def->index, commac); + list_del(&commac->poll_list); + local_bh_enable(); +} + +/* synchronized by mal_poll() */ +static inline void mal_enable_eob_irq(struct ibm_ocp_mal *mal) +{ + MAL_DBG2("%d: enable_irq" NL, mal->def->index); + set_mal_dcrn(mal, MAL_CFG, get_mal_dcrn(mal, MAL_CFG) | MAL_CFG_EOPIE); +} + +/* synchronized by __LINK_STATE_RX_SCHED bit in ndev->state */ +static inline void mal_disable_eob_irq(struct ibm_ocp_mal *mal) +{ + set_mal_dcrn(mal, MAL_CFG, get_mal_dcrn(mal, MAL_CFG) & ~MAL_CFG_EOPIE); + MAL_DBG2("%d: disable_irq" NL, mal->def->index); +} + +static irqreturn_t mal_serr(int irq, void *dev_instance, struct pt_regs *regs) { struct ibm_ocp_mal *mal = dev_instance; - struct list_head *l; - unsigned long isr; + u32 esr = get_mal_dcrn(mal, MAL_ESR); - isr = get_mal_dcrn(mal, DCRN_MALTXEOBISR); - set_mal_dcrn(mal, DCRN_MALTXEOBISR, isr); + /* Clear the error status register */ + set_mal_dcrn(mal, MAL_ESR, esr); - read_lock(&mal_list_lock); - list_for_each(l, &mal->commac) { - struct mal_commac *mc = list_entry(l, struct mal_commac, list); + MAL_DBG("%d: SERR %08x" NL, mal->def->index, esr); - if (isr & mc->tx_chan_mask) { - mc->ops->txeob(mc->dev, isr & mc->tx_chan_mask); + if (esr & MAL_ESR_EVB) { + if (esr & MAL_ESR_DE) { + /* We ignore Descriptor error, + * TXDE or RXDE interrupt will be generated anyway. + */ + return IRQ_HANDLED; } + + if (esr & MAL_ESR_PEIN) { + /* PLB error, it's probably buggy hardware or + * incorrect physical address in BD (i.e. bug) + */ + if (net_ratelimit()) + printk(KERN_ERR + "mal%d: system error, PLB (ESR = 0x%08x)\n", + mal->def->index, esr); + return IRQ_HANDLED; + } + + /* OPB error, it's probably buggy hardware or incorrect EBC setup */ + if (net_ratelimit()) + printk(KERN_ERR + "mal%d: system error, OPB (ESR = 0x%08x)\n", + mal->def->index, esr); } - read_unlock(&mal_list_lock); + return IRQ_HANDLED; +} + +static inline void mal_schedule_poll(struct ibm_ocp_mal *mal) +{ + if (likely(netif_rx_schedule_prep(&mal->poll_dev))) { + MAL_DBG2("%d: schedule_poll" NL, mal->def->index); + mal_disable_eob_irq(mal); + __netif_rx_schedule(&mal->poll_dev); + } else + MAL_DBG2("%d: already in poll" NL, mal->def->index); +} +static irqreturn_t mal_txeob(int irq, void *dev_instance, struct pt_regs *regs) +{ + struct ibm_ocp_mal *mal = dev_instance; + u32 r = get_mal_dcrn(mal, MAL_TXEOBISR); + MAL_DBG2("%d: txeob %08x" NL, mal->def->index, r); + mal_schedule_poll(mal); + set_mal_dcrn(mal, MAL_TXEOBISR, r); return IRQ_HANDLED; } static irqreturn_t mal_rxeob(int irq, void *dev_instance, struct pt_regs *regs) { struct ibm_ocp_mal *mal = dev_instance; - struct list_head *l; - unsigned long isr; + u32 r = get_mal_dcrn(mal, MAL_RXEOBISR); + MAL_DBG2("%d: rxeob %08x" NL, mal->def->index, r); + mal_schedule_poll(mal); + set_mal_dcrn(mal, MAL_RXEOBISR, r); + return IRQ_HANDLED; +} - isr = get_mal_dcrn(mal, DCRN_MALRXEOBISR); - set_mal_dcrn(mal, DCRN_MALRXEOBISR, isr); +static irqreturn_t mal_txde(int irq, void *dev_instance, struct pt_regs *regs) +{ + struct ibm_ocp_mal *mal = dev_instance; + u32 deir = get_mal_dcrn(mal, MAL_TXDEIR); + set_mal_dcrn(mal, MAL_TXDEIR, deir); - read_lock(&mal_list_lock); - list_for_each(l, &mal->commac) { - struct mal_commac *mc = list_entry(l, struct mal_commac, list); + MAL_DBG("%d: txde %08x" NL, mal->def->index, deir); - if (isr & mc->rx_chan_mask) { - mc->ops->rxeob(mc->dev, isr & mc->rx_chan_mask); - } - } - read_unlock(&mal_list_lock); + if (net_ratelimit()) + printk(KERN_ERR + "mal%d: TX descriptor error (TXDEIR = 0x%08x)\n", + mal->def->index, deir); return IRQ_HANDLED; } -static irqreturn_t mal_txde(int irq, void *dev_instance, struct pt_regs *regs) +static irqreturn_t mal_rxde(int irq, void *dev_instance, struct pt_regs *regs) { struct ibm_ocp_mal *mal = dev_instance; struct list_head *l; - unsigned long deir; + u32 deir = get_mal_dcrn(mal, MAL_RXDEIR); - deir = get_mal_dcrn(mal, DCRN_MALTXDEIR); + MAL_DBG("%d: rxde %08x" NL, mal->def->index, deir); - /* FIXME: print which MAL correctly */ - printk(KERN_WARNING "%s: Tx descriptor error (MALTXDEIR=%lx)\n", - "MAL", deir); - - read_lock(&mal_list_lock); - list_for_each(l, &mal->commac) { + list_for_each(l, &mal->list) { struct mal_commac *mc = list_entry(l, struct mal_commac, list); - - if (deir & mc->tx_chan_mask) { - mc->ops->txde(mc->dev, deir & mc->tx_chan_mask); + if (deir & mc->rx_chan_mask) { + mc->rx_stopped = 1; + mc->ops->rxde(mc->dev); } } - read_unlock(&mal_list_lock); + + mal_schedule_poll(mal); + set_mal_dcrn(mal, MAL_RXDEIR, deir); return IRQ_HANDLED; } -/* - * This interrupt should be very rare at best. This occurs when - * the hardware has a problem with the receive descriptors. The manual - * states that it occurs when the hardware cannot the receive descriptor - * empty bit is not set. The recovery mechanism will be to - * traverse through the descriptors, handle any that are marked to be - * handled and reinitialize each along the way. At that point the driver - * will be restarted. - */ -static irqreturn_t mal_rxde(int irq, void *dev_instance, struct pt_regs *regs) +static int mal_poll(struct net_device *ndev, int *budget) { - struct ibm_ocp_mal *mal = dev_instance; + struct ibm_ocp_mal *mal = ndev->priv; struct list_head *l; - unsigned long deir; - - deir = get_mal_dcrn(mal, DCRN_MALRXDEIR); + int rx_work_limit = min(ndev->quota, *budget), received = 0, done; + + MAL_DBG2("%d: poll(%d) %d ->" NL, mal->def->index, *budget, + rx_work_limit); + again: + /* Process TX skbs */ + list_for_each(l, &mal->poll_list) { + struct mal_commac *mc = + list_entry(l, struct mal_commac, poll_list); + mc->ops->poll_tx(mc->dev); + } - /* - * This really is needed. This case encountered in stress testing. + /* Process RX skbs. + * We _might_ need something more smart here to enforce polling fairness. */ - if (deir == 0) - return IRQ_HANDLED; - - /* FIXME: print which MAL correctly */ - printk(KERN_WARNING "%s: Rx descriptor error (MALRXDEIR=%lx)\n", - "MAL", deir); - - read_lock(&mal_list_lock); - list_for_each(l, &mal->commac) { - struct mal_commac *mc = list_entry(l, struct mal_commac, list); + list_for_each(l, &mal->poll_list) { + struct mal_commac *mc = + list_entry(l, struct mal_commac, poll_list); + int n = mc->ops->poll_rx(mc->dev, rx_work_limit); + if (n) { + received += n; + rx_work_limit -= n; + if (rx_work_limit <= 0) { + done = 0; + goto more_work; // XXX What if this is the last one ? + } + } + } - if (deir & mc->rx_chan_mask) { - mc->ops->rxde(mc->dev, deir & mc->rx_chan_mask); + /* We need to disable IRQs to protect from RXDE IRQ here */ + local_irq_disable(); + __netif_rx_complete(ndev); + mal_enable_eob_irq(mal); + local_irq_enable(); + + done = 1; + + /* Check for "rotting" packet(s) */ + list_for_each(l, &mal->poll_list) { + struct mal_commac *mc = + list_entry(l, struct mal_commac, poll_list); + if (unlikely(mc->ops->peek_rx(mc->dev) || mc->rx_stopped)) { + MAL_DBG2("%d: rotting packet" NL, mal->def->index); + if (netif_rx_reschedule(ndev, received)) + mal_disable_eob_irq(mal); + else + MAL_DBG2("%d: already in poll list" NL, + mal->def->index); + + if (rx_work_limit > 0) + goto again; + else + goto more_work; } + mc->ops->poll_tx(mc->dev); } - read_unlock(&mal_list_lock); - return IRQ_HANDLED; + more_work: + ndev->quota -= received; + *budget -= received; + + MAL_DBG2("%d: poll() %d <- %d" NL, mal->def->index, *budget, + done ? 0 : 1); + return done ? 0 : 1; +} + +static void mal_reset(struct ibm_ocp_mal *mal) +{ + int n = 10; + MAL_DBG("%d: reset" NL, mal->def->index); + + set_mal_dcrn(mal, MAL_CFG, MAL_CFG_SR); + + /* Wait for reset to complete (1 system clock) */ + while ((get_mal_dcrn(mal, MAL_CFG) & MAL_CFG_SR) && n) + --n; + + if (unlikely(!n)) + printk(KERN_ERR "mal%d: reset timeout\n", mal->def->index); +} + +int mal_get_regs_len(struct ibm_ocp_mal *mal) +{ + return sizeof(struct emac_ethtool_regs_subhdr) + + sizeof(struct ibm_mal_regs); +} + +void *mal_dump_regs(struct ibm_ocp_mal *mal, void *buf) +{ + struct emac_ethtool_regs_subhdr *hdr = buf; + struct ibm_mal_regs *regs = (struct ibm_mal_regs *)(hdr + 1); + struct ocp_func_mal_data *maldata = mal->def->additions; + int i; + + hdr->version = MAL_VERSION; + hdr->index = mal->def->index; + + regs->tx_count = maldata->num_tx_chans; + regs->rx_count = maldata->num_rx_chans; + + regs->cfg = get_mal_dcrn(mal, MAL_CFG); + regs->esr = get_mal_dcrn(mal, MAL_ESR); + regs->ier = get_mal_dcrn(mal, MAL_IER); + regs->tx_casr = get_mal_dcrn(mal, MAL_TXCASR); + regs->tx_carr = get_mal_dcrn(mal, MAL_TXCARR); + regs->tx_eobisr = get_mal_dcrn(mal, MAL_TXEOBISR); + regs->tx_deir = get_mal_dcrn(mal, MAL_TXDEIR); + regs->rx_casr = get_mal_dcrn(mal, MAL_RXCASR); + regs->rx_carr = get_mal_dcrn(mal, MAL_RXCARR); + regs->rx_eobisr = get_mal_dcrn(mal, MAL_RXEOBISR); + regs->rx_deir = get_mal_dcrn(mal, MAL_RXDEIR); + + for (i = 0; i < regs->tx_count; ++i) + regs->tx_ctpr[i] = get_mal_dcrn(mal, MAL_TXCTPR(i)); + + for (i = 0; i < regs->rx_count; ++i) { + regs->rx_ctpr[i] = get_mal_dcrn(mal, MAL_RXCTPR(i)); + regs->rcbs[i] = get_mal_dcrn(mal, MAL_RCBS(i)); + } + return regs + 1; } static int __init mal_probe(struct ocp_device *ocpdev) { - struct ibm_ocp_mal *mal = NULL; + struct ibm_ocp_mal *mal; struct ocp_func_mal_data *maldata; - int err = 0; + int err = 0, i, bd_size; + + MAL_DBG("%d: probe" NL, ocpdev->def->index); - maldata = (struct ocp_func_mal_data *)ocpdev->def->additions; + maldata = ocpdev->def->additions; if (maldata == NULL) { - printk(KERN_ERR "mal%d: Missing additional datas !\n", + printk(KERN_ERR "mal%d: missing additional data!\n", ocpdev->def->index); return -ENODEV; } - mal = kmalloc(sizeof(struct ibm_ocp_mal), GFP_KERNEL); - if (mal == NULL) { + mal = kzalloc(sizeof(struct ibm_ocp_mal), GFP_KERNEL); + if (!mal) { printk(KERN_ERR - "mal%d: Out of memory allocating MAL structure !\n", + "mal%d: out of memory allocating MAL structure!\n", ocpdev->def->index); return -ENOMEM; } - memset(mal, 0, sizeof(*mal)); - - switch (ocpdev->def->index) { - case 0: - mal->dcrbase = DCRN_MAL_BASE; - break; -#ifdef DCRN_MAL1_BASE - case 1: - mal->dcrbase = DCRN_MAL1_BASE; - break; -#endif - default: - BUG(); - } - - /**************************/ + mal->dcrbase = maldata->dcr_base; + mal->def = ocpdev->def; - INIT_LIST_HEAD(&mal->commac); + INIT_LIST_HEAD(&mal->poll_list); + set_bit(__LINK_STATE_START, &mal->poll_dev.state); + mal->poll_dev.weight = CONFIG_IBM_EMAC_POLL_WEIGHT; + mal->poll_dev.poll = mal_poll; + mal->poll_dev.priv = mal; + atomic_set(&mal->poll_dev.refcnt, 1); - set_mal_dcrn(mal, DCRN_MALRXCARR, 0xFFFFFFFF); - set_mal_dcrn(mal, DCRN_MALTXCARR, 0xFFFFFFFF); + INIT_LIST_HEAD(&mal->list); - set_mal_dcrn(mal, DCRN_MALCR, MALCR_MMSR); /* 384 */ - /* FIXME: Add delay */ + /* Load power-on reset defaults */ + mal_reset(mal); /* Set the MAL configuration register */ - set_mal_dcrn(mal, DCRN_MALCR, - MALCR_PLBB | MALCR_OPBBL | MALCR_LEA | - MALCR_PLBLT_DEFAULT); - - /* It would be nice to allocate buffers separately for each - * channel, but we can't because the channels share the upper - * 13 bits of address lines. Each channels buffer must also - * be 4k aligned, so we allocate 4k for each channel. This is - * inefficient FIXME: do better, if possible */ - mal->tx_virt_addr = dma_alloc_coherent(&ocpdev->dev, - MAL_DT_ALIGN * - maldata->num_tx_chans, - &mal->tx_phys_addr, GFP_KERNEL); - if (mal->tx_virt_addr == NULL) { + set_mal_dcrn(mal, MAL_CFG, MAL_CFG_DEFAULT | MAL_CFG_PLBB | + MAL_CFG_OPBBL | MAL_CFG_LEA); + + mal_enable_eob_irq(mal); + + /* Allocate space for BD rings */ + BUG_ON(maldata->num_tx_chans <= 0 || maldata->num_tx_chans > 32); + BUG_ON(maldata->num_rx_chans <= 0 || maldata->num_rx_chans > 32); + bd_size = sizeof(struct mal_descriptor) * + (NUM_TX_BUFF * maldata->num_tx_chans + + NUM_RX_BUFF * maldata->num_rx_chans); + mal->bd_virt = + dma_alloc_coherent(&ocpdev->dev, bd_size, &mal->bd_dma, GFP_KERNEL); + + if (!mal->bd_virt) { printk(KERN_ERR - "mal%d: Out of memory allocating MAL descriptors !\n", - ocpdev->def->index); + "mal%d: out of memory allocating RX/TX descriptors!\n", + mal->def->index); err = -ENOMEM; goto fail; } + memset(mal->bd_virt, 0, bd_size); - /* God, oh, god, I hate DCRs */ - set_mal_dcrn(mal, DCRN_MALTXCTP0R, mal->tx_phys_addr); -#ifdef DCRN_MALTXCTP1R - if (maldata->num_tx_chans > 1) - set_mal_dcrn(mal, DCRN_MALTXCTP1R, - mal->tx_phys_addr + MAL_DT_ALIGN); -#endif /* DCRN_MALTXCTP1R */ -#ifdef DCRN_MALTXCTP2R - if (maldata->num_tx_chans > 2) - set_mal_dcrn(mal, DCRN_MALTXCTP2R, - mal->tx_phys_addr + 2 * MAL_DT_ALIGN); -#endif /* DCRN_MALTXCTP2R */ -#ifdef DCRN_MALTXCTP3R - if (maldata->num_tx_chans > 3) - set_mal_dcrn(mal, DCRN_MALTXCTP3R, - mal->tx_phys_addr + 3 * MAL_DT_ALIGN); -#endif /* DCRN_MALTXCTP3R */ -#ifdef DCRN_MALTXCTP4R - if (maldata->num_tx_chans > 4) - set_mal_dcrn(mal, DCRN_MALTXCTP4R, - mal->tx_phys_addr + 4 * MAL_DT_ALIGN); -#endif /* DCRN_MALTXCTP4R */ -#ifdef DCRN_MALTXCTP5R - if (maldata->num_tx_chans > 5) - set_mal_dcrn(mal, DCRN_MALTXCTP5R, - mal->tx_phys_addr + 5 * MAL_DT_ALIGN); -#endif /* DCRN_MALTXCTP5R */ -#ifdef DCRN_MALTXCTP6R - if (maldata->num_tx_chans > 6) - set_mal_dcrn(mal, DCRN_MALTXCTP6R, - mal->tx_phys_addr + 6 * MAL_DT_ALIGN); -#endif /* DCRN_MALTXCTP6R */ -#ifdef DCRN_MALTXCTP7R - if (maldata->num_tx_chans > 7) - set_mal_dcrn(mal, DCRN_MALTXCTP7R, - mal->tx_phys_addr + 7 * MAL_DT_ALIGN); -#endif /* DCRN_MALTXCTP7R */ - - mal->rx_virt_addr = dma_alloc_coherent(&ocpdev->dev, - MAL_DT_ALIGN * - maldata->num_rx_chans, - &mal->rx_phys_addr, GFP_KERNEL); - - set_mal_dcrn(mal, DCRN_MALRXCTP0R, mal->rx_phys_addr); -#ifdef DCRN_MALRXCTP1R - if (maldata->num_rx_chans > 1) - set_mal_dcrn(mal, DCRN_MALRXCTP1R, - mal->rx_phys_addr + MAL_DT_ALIGN); -#endif /* DCRN_MALRXCTP1R */ -#ifdef DCRN_MALRXCTP2R - if (maldata->num_rx_chans > 2) - set_mal_dcrn(mal, DCRN_MALRXCTP2R, - mal->rx_phys_addr + 2 * MAL_DT_ALIGN); -#endif /* DCRN_MALRXCTP2R */ -#ifdef DCRN_MALRXCTP3R - if (maldata->num_rx_chans > 3) - set_mal_dcrn(mal, DCRN_MALRXCTP3R, - mal->rx_phys_addr + 3 * MAL_DT_ALIGN); -#endif /* DCRN_MALRXCTP3R */ + for (i = 0; i < maldata->num_tx_chans; ++i) + set_mal_dcrn(mal, MAL_TXCTPR(i), mal->bd_dma + + sizeof(struct mal_descriptor) * + mal_tx_bd_offset(mal, i)); + + for (i = 0; i < maldata->num_rx_chans; ++i) + set_mal_dcrn(mal, MAL_RXCTPR(i), mal->bd_dma + + sizeof(struct mal_descriptor) * + mal_rx_bd_offset(mal, i)); err = request_irq(maldata->serr_irq, mal_serr, 0, "MAL SERR", mal); if (err) - goto fail; - err = request_irq(maldata->txde_irq, mal_txde, 0, "MAL TX DE ", mal); + goto fail2; + err = request_irq(maldata->txde_irq, mal_txde, 0, "MAL TX DE", mal); if (err) - goto fail; + goto fail3; err = request_irq(maldata->txeob_irq, mal_txeob, 0, "MAL TX EOB", mal); if (err) - goto fail; + goto fail4; err = request_irq(maldata->rxde_irq, mal_rxde, 0, "MAL RX DE", mal); if (err) - goto fail; + goto fail5; err = request_irq(maldata->rxeob_irq, mal_rxeob, 0, "MAL RX EOB", mal); if (err) - goto fail; + goto fail6; - set_mal_dcrn(mal, DCRN_MALIER, - MALIER_DE | MALIER_NE | MALIER_TE | - MALIER_OPBE | MALIER_PLBE); + /* Enable all MAL SERR interrupt sources */ + set_mal_dcrn(mal, MAL_IER, MAL_IER_EVENTS); - /* Advertise me to the rest of the world */ + /* Advertise this instance to the rest of the world */ ocp_set_drvdata(ocpdev, mal); - printk(KERN_INFO "mal%d: Initialized, %d tx channels, %d rx channels\n", - ocpdev->def->index, maldata->num_tx_chans, - maldata->num_rx_chans); + mal_dbg_register(mal->def->index, mal); + printk(KERN_INFO "mal%d: initialized, %d TX channels, %d RX channels\n", + mal->def->index, maldata->num_tx_chans, maldata->num_rx_chans); return 0; + fail6: + free_irq(maldata->rxde_irq, mal); + fail5: + free_irq(maldata->txeob_irq, mal); + fail4: + free_irq(maldata->txde_irq, mal); + fail3: + free_irq(maldata->serr_irq, mal); + fail2: + dma_free_coherent(&ocpdev->dev, bd_size, mal->bd_virt, mal->bd_dma); fail: - /* FIXME: dispose requested IRQs ! */ - if (err && mal) - kfree(mal); + kfree(mal); return err; } static void __exit mal_remove(struct ocp_device *ocpdev) { struct ibm_ocp_mal *mal = ocp_get_drvdata(ocpdev); - struct ocp_func_mal_data *maldata = ocpdev->def->additions; + struct ocp_func_mal_data *maldata = mal->def->additions; + + MAL_DBG("%d: remove" NL, mal->def->index); - BUG_ON(!maldata); + /* Syncronize with scheduled polling, + stolen from net/core/dev.c:dev_close() + */ + clear_bit(__LINK_STATE_START, &mal->poll_dev.state); + netif_poll_disable(&mal->poll_dev); + + if (!list_empty(&mal->list)) { + /* This is *very* bad */ + printk(KERN_EMERG + "mal%d: commac list is not empty on remove!\n", + mal->def->index); + } ocp_set_drvdata(ocpdev, NULL); - /* FIXME: shut down the MAL, deal with dependency with emac */ free_irq(maldata->serr_irq, mal); free_irq(maldata->txde_irq, mal); free_irq(maldata->txeob_irq, mal); free_irq(maldata->rxde_irq, mal); free_irq(maldata->rxeob_irq, mal); - if (mal->tx_virt_addr) - dma_free_coherent(&ocpdev->dev, - MAL_DT_ALIGN * maldata->num_tx_chans, - mal->tx_virt_addr, mal->tx_phys_addr); + mal_reset(mal); - if (mal->rx_virt_addr) - dma_free_coherent(&ocpdev->dev, - MAL_DT_ALIGN * maldata->num_rx_chans, - mal->rx_virt_addr, mal->rx_phys_addr); + mal_dbg_register(mal->def->index, NULL); + + dma_free_coherent(&ocpdev->dev, + sizeof(struct mal_descriptor) * + (NUM_TX_BUFF * maldata->num_tx_chans + + NUM_RX_BUFF * maldata->num_rx_chans), mal->bd_virt, + mal->bd_dma); kfree(mal); } /* Structure for a device driver */ static struct ocp_device_id mal_ids[] = { - {.vendor = OCP_ANY_ID,.function = OCP_FUNC_MAL}, - {.vendor = OCP_VENDOR_INVALID} + { .vendor = OCP_VENDOR_IBM, .function = OCP_FUNC_MAL }, + { .vendor = OCP_VENDOR_INVALID} }; static struct ocp_driver mal_driver = { @@ -441,23 +569,14 @@ static struct ocp_driver mal_driver = { .remove = mal_remove, }; -static int __init init_mals(void) +int __init mal_init(void) { - int rc; - - rc = ocp_register_driver(&mal_driver); - if (rc < 0) { - ocp_unregister_driver(&mal_driver); - return -ENODEV; - } - - return 0; + MAL_DBG(": init" NL); + return ocp_register_driver(&mal_driver); } -static void __exit exit_mals(void) +void __exit mal_exit(void) { + MAL_DBG(": exit" NL); ocp_unregister_driver(&mal_driver); } - -module_init(init_mals); -module_exit(exit_mals); diff --git a/drivers/net/ibm_emac/ibm_emac_mal.h b/drivers/net/ibm_emac/ibm_emac_mal.h index dd9f0dabc..f73f10a0a 100644 --- a/drivers/net/ibm_emac/ibm_emac_mal.h +++ b/drivers/net/ibm_emac/ibm_emac_mal.h @@ -1,131 +1,267 @@ -#ifndef _IBM_EMAC_MAL_H -#define _IBM_EMAC_MAL_H +/* + * drivers/net/ibm_emac/ibm_emac_mal.h + * + * Memory Access Layer (MAL) support + * + * Copyright (c) 2004, 2005 Zultys Technologies. + * Eugene Surovegin or + * + * Based on original work by + * Armin Kuster + * Copyright 2002 MontaVista Softare 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. + * + */ +#ifndef __IBM_EMAC_MAL_H_ +#define __IBM_EMAC_MAL_H_ +#include #include +#include -#define MAL_DT_ALIGN (4096) /* Alignment for each channel's descriptor table */ +#include -#define MAL_CHAN_MASK(chan) (0x80000000 >> (chan)) +/* + * These MAL "versions" probably aren't the real versions IBM uses for these + * MAL cores, I assigned them just to make #ifdefs in this file nicer and + * reflect the fact that 40x and 44x have slightly different MALs. --ebs + */ +#if defined(CONFIG_405GP) || defined(CONFIG_405GPR) || defined(CONFIG_405EP) || \ + defined(CONFIG_440EP) || defined(CONFIG_440GR) || defined(CONFIG_NP405H) +#define MAL_VERSION 1 +#elif defined(CONFIG_440GP) || defined(CONFIG_440GX) || defined(CONFIG_440SP) || \ + defined(CONFIG_440SPE) +#define MAL_VERSION 2 +#else +#error "Unknown SoC, please check chip manual and choose MAL 'version'" +#endif + +/* MALx DCR registers */ +#define MAL_CFG 0x00 +#define MAL_CFG_SR 0x80000000 +#define MAL_CFG_PLBB 0x00004000 +#define MAL_CFG_OPBBL 0x00000080 +#define MAL_CFG_EOPIE 0x00000004 +#define MAL_CFG_LEA 0x00000002 +#define MAL_CFG_SD 0x00000001 +#if MAL_VERSION == 1 +#define MAL_CFG_PLBP_MASK 0x00c00000 +#define MAL_CFG_PLBP_10 0x00800000 +#define MAL_CFG_GA 0x00200000 +#define MAL_CFG_OA 0x00100000 +#define MAL_CFG_PLBLE 0x00080000 +#define MAL_CFG_PLBT_MASK 0x00078000 +#define MAL_CFG_DEFAULT (MAL_CFG_PLBP_10 | MAL_CFG_PLBT_MASK) +#elif MAL_VERSION == 2 +#define MAL_CFG_RPP_MASK 0x00c00000 +#define MAL_CFG_RPP_10 0x00800000 +#define MAL_CFG_RMBS_MASK 0x00300000 +#define MAL_CFG_WPP_MASK 0x000c0000 +#define MAL_CFG_WPP_10 0x00080000 +#define MAL_CFG_WMBS_MASK 0x00030000 +#define MAL_CFG_PLBLE 0x00008000 +#define MAL_CFG_DEFAULT (MAL_CFG_RMBS_MASK | MAL_CFG_WMBS_MASK | \ + MAL_CFG_RPP_10 | MAL_CFG_WPP_10) +#else +#error "Unknown MAL version" +#endif + +#define MAL_ESR 0x01 +#define MAL_ESR_EVB 0x80000000 +#define MAL_ESR_CIDT 0x40000000 +#define MAL_ESR_CID_MASK 0x3e000000 +#define MAL_ESR_CID_SHIFT 25 +#define MAL_ESR_DE 0x00100000 +#define MAL_ESR_OTE 0x00040000 +#define MAL_ESR_OSE 0x00020000 +#define MAL_ESR_PEIN 0x00010000 +#define MAL_ESR_DEI 0x00000010 +#define MAL_ESR_OTEI 0x00000004 +#define MAL_ESR_OSEI 0x00000002 +#define MAL_ESR_PBEI 0x00000001 +#if MAL_VERSION == 1 +#define MAL_ESR_ONE 0x00080000 +#define MAL_ESR_ONEI 0x00000008 +#elif MAL_VERSION == 2 +#define MAL_ESR_PTE 0x00800000 +#define MAL_ESR_PRE 0x00400000 +#define MAL_ESR_PWE 0x00200000 +#define MAL_ESR_PTEI 0x00000080 +#define MAL_ESR_PREI 0x00000040 +#define MAL_ESR_PWEI 0x00000020 +#else +#error "Unknown MAL version" +#endif + +#define MAL_IER 0x02 +#define MAL_IER_DE 0x00000010 +#define MAL_IER_OTE 0x00000004 +#define MAL_IER_OE 0x00000002 +#define MAL_IER_PE 0x00000001 +#if MAL_VERSION == 1 +#define MAL_IER_NWE 0x00000008 +#define MAL_IER_SOC_EVENTS MAL_IER_NWE +#elif MAL_VERSION == 2 +#define MAL_IER_PT 0x00000080 +#define MAL_IER_PRE 0x00000040 +#define MAL_IER_PWE 0x00000020 +#define MAL_IER_SOC_EVENTS (MAL_IER_PT | MAL_IER_PRE | MAL_IER_PWE) +#else +#error "Unknown MAL version" +#endif +#define MAL_IER_EVENTS (MAL_IER_SOC_EVENTS | MAL_IER_OTE | \ + MAL_IER_OTE | MAL_IER_OE | MAL_IER_PE) + +#define MAL_TXCASR 0x04 +#define MAL_TXCARR 0x05 +#define MAL_TXEOBISR 0x06 +#define MAL_TXDEIR 0x07 +#define MAL_RXCASR 0x10 +#define MAL_RXCARR 0x11 +#define MAL_RXEOBISR 0x12 +#define MAL_RXDEIR 0x13 +#define MAL_TXCTPR(n) ((n) + 0x20) +#define MAL_RXCTPR(n) ((n) + 0x40) +#define MAL_RCBS(n) ((n) + 0x60) + +/* In reality MAL can handle TX buffers up to 4095 bytes long, + * but this isn't a good round number :) --ebs + */ +#define MAL_MAX_TX_SIZE 4080 +#define MAL_MAX_RX_SIZE 4080 + +static inline int mal_rx_size(int len) +{ + len = (len + 0xf) & ~0xf; + return len > MAL_MAX_RX_SIZE ? MAL_MAX_RX_SIZE : len; +} + +static inline int mal_tx_chunks(int len) +{ + return (len + MAL_MAX_TX_SIZE - 1) / MAL_MAX_TX_SIZE; +} + +#define MAL_CHAN_MASK(n) (0x80000000 >> (n)) /* MAL Buffer Descriptor structure */ struct mal_descriptor { - unsigned short ctrl; /* MAL / Commac status control bits */ - short data_len; /* Max length is 4K-1 (12 bits) */ - unsigned char *data_ptr; /* pointer to actual data buffer */ -} __attribute__ ((packed)); + u16 ctrl; /* MAL / Commac status control bits */ + u16 data_len; /* Max length is 4K-1 (12 bits) */ + u32 data_ptr; /* pointer to actual data buffer */ +}; /* the following defines are for the MadMAL status and control registers. */ /* MADMAL transmit and receive status/control bits */ -#define MAL_RX_CTRL_EMPTY 0x8000 -#define MAL_RX_CTRL_WRAP 0x4000 -#define MAL_RX_CTRL_CM 0x2000 -#define MAL_RX_CTRL_LAST 0x1000 -#define MAL_RX_CTRL_FIRST 0x0800 -#define MAL_RX_CTRL_INTR 0x0400 - -#define MAL_TX_CTRL_READY 0x8000 -#define MAL_TX_CTRL_WRAP 0x4000 -#define MAL_TX_CTRL_CM 0x2000 -#define MAL_TX_CTRL_LAST 0x1000 -#define MAL_TX_CTRL_INTR 0x0400 +#define MAL_RX_CTRL_EMPTY 0x8000 +#define MAL_RX_CTRL_WRAP 0x4000 +#define MAL_RX_CTRL_CM 0x2000 +#define MAL_RX_CTRL_LAST 0x1000 +#define MAL_RX_CTRL_FIRST 0x0800 +#define MAL_RX_CTRL_INTR 0x0400 +#define MAL_RX_CTRL_SINGLE (MAL_RX_CTRL_LAST | MAL_RX_CTRL_FIRST) +#define MAL_IS_SINGLE_RX(ctrl) (((ctrl) & MAL_RX_CTRL_SINGLE) == MAL_RX_CTRL_SINGLE) + +#define MAL_TX_CTRL_READY 0x8000 +#define MAL_TX_CTRL_WRAP 0x4000 +#define MAL_TX_CTRL_CM 0x2000 +#define MAL_TX_CTRL_LAST 0x1000 +#define MAL_TX_CTRL_INTR 0x0400 struct mal_commac_ops { - void (*txeob) (void *dev, u32 chanmask); - void (*txde) (void *dev, u32 chanmask); - void (*rxeob) (void *dev, u32 chanmask); - void (*rxde) (void *dev, u32 chanmask); + void (*poll_tx) (void *dev); + int (*poll_rx) (void *dev, int budget); + int (*peek_rx) (void *dev); + void (*rxde) (void *dev); }; struct mal_commac { - struct mal_commac_ops *ops; - void *dev; - u32 tx_chan_mask, rx_chan_mask; - struct list_head list; + struct mal_commac_ops *ops; + void *dev; + struct list_head poll_list; + int rx_stopped; + + u32 tx_chan_mask; + u32 rx_chan_mask; + struct list_head list; }; struct ibm_ocp_mal { - int dcrbase; + int dcrbase; - struct list_head commac; - u32 tx_chan_mask, rx_chan_mask; + struct list_head poll_list; + struct net_device poll_dev; - dma_addr_t tx_phys_addr; - struct mal_descriptor *tx_virt_addr; + struct list_head list; + u32 tx_chan_mask; + u32 rx_chan_mask; - dma_addr_t rx_phys_addr; - struct mal_descriptor *rx_virt_addr; -}; + dma_addr_t bd_dma; + struct mal_descriptor *bd_virt; -#define GET_MAL_STANZA(base,dcrn) \ - case base: \ - x = mfdcr(dcrn(base)); \ - break; - -#define SET_MAL_STANZA(base,dcrn, val) \ - case base: \ - mtdcr(dcrn(base), (val)); \ - break; - -#define GET_MAL0_STANZA(dcrn) GET_MAL_STANZA(DCRN_MAL_BASE,dcrn) -#define SET_MAL0_STANZA(dcrn,val) SET_MAL_STANZA(DCRN_MAL_BASE,dcrn,val) - -#ifdef DCRN_MAL1_BASE -#define GET_MAL1_STANZA(dcrn) GET_MAL_STANZA(DCRN_MAL1_BASE,dcrn) -#define SET_MAL1_STANZA(dcrn,val) SET_MAL_STANZA(DCRN_MAL1_BASE,dcrn,val) -#else /* ! DCRN_MAL1_BASE */ -#define GET_MAL1_STANZA(dcrn) -#define SET_MAL1_STANZA(dcrn,val) -#endif + struct ocp_def *def; +}; -#define get_mal_dcrn(mal, dcrn) ({ \ - u32 x; \ - switch ((mal)->dcrbase) { \ - GET_MAL0_STANZA(dcrn) \ - GET_MAL1_STANZA(dcrn) \ - default: \ - x = 0; \ - BUG(); \ - } \ -x; }) - -#define set_mal_dcrn(mal, dcrn, val) do { \ - switch ((mal)->dcrbase) { \ - SET_MAL0_STANZA(dcrn,val) \ - SET_MAL1_STANZA(dcrn,val) \ - default: \ - BUG(); \ - } } while (0) - -static inline void mal_enable_tx_channels(struct ibm_ocp_mal *mal, u32 chanmask) +static inline u32 get_mal_dcrn(struct ibm_ocp_mal *mal, int reg) { - set_mal_dcrn(mal, DCRN_MALTXCASR, - get_mal_dcrn(mal, DCRN_MALTXCASR) | chanmask); + return mfdcr(mal->dcrbase + reg); } -static inline void mal_disable_tx_channels(struct ibm_ocp_mal *mal, - u32 chanmask) +static inline void set_mal_dcrn(struct ibm_ocp_mal *mal, int reg, u32 val) { - set_mal_dcrn(mal, DCRN_MALTXCARR, chanmask); + mtdcr(mal->dcrbase + reg, val); } -static inline void mal_enable_rx_channels(struct ibm_ocp_mal *mal, u32 chanmask) -{ - set_mal_dcrn(mal, DCRN_MALRXCASR, - get_mal_dcrn(mal, DCRN_MALRXCASR) | chanmask); -} +/* Register MAL devices */ +int mal_init(void) __init; +void mal_exit(void) __exit; -static inline void mal_disable_rx_channels(struct ibm_ocp_mal *mal, - u32 chanmask) -{ - set_mal_dcrn(mal, DCRN_MALRXCARR, chanmask); -} +int mal_register_commac(struct ibm_ocp_mal *mal, + struct mal_commac *commac) __init; +void mal_unregister_commac(struct ibm_ocp_mal *mal, + struct mal_commac *commac) __exit; +int mal_set_rcbs(struct ibm_ocp_mal *mal, int channel, unsigned long size); + +/* Returns BD ring offset for a particular channel + (in 'struct mal_descriptor' elements) +*/ +int mal_tx_bd_offset(struct ibm_ocp_mal *mal, int channel); +int mal_rx_bd_offset(struct ibm_ocp_mal *mal, int channel); + +void mal_enable_tx_channel(struct ibm_ocp_mal *mal, int channel); +void mal_disable_tx_channel(struct ibm_ocp_mal *mal, int channel); +void mal_enable_rx_channel(struct ibm_ocp_mal *mal, int channel); +void mal_disable_rx_channel(struct ibm_ocp_mal *mal, int channel); -extern int mal_register_commac(struct ibm_ocp_mal *mal, - struct mal_commac *commac); -extern int mal_unregister_commac(struct ibm_ocp_mal *mal, - struct mal_commac *commac); +/* Add/remove EMAC to/from MAL polling list */ +void mal_poll_add(struct ibm_ocp_mal *mal, struct mal_commac *commac); +void mal_poll_del(struct ibm_ocp_mal *mal, struct mal_commac *commac); + +/* Ethtool MAL registers */ +struct ibm_mal_regs { + u32 tx_count; + u32 rx_count; + + u32 cfg; + u32 esr; + u32 ier; + u32 tx_casr; + u32 tx_carr; + u32 tx_eobisr; + u32 tx_deir; + u32 rx_casr; + u32 rx_carr; + u32 rx_eobisr; + u32 rx_deir; + u32 tx_ctpr[32]; + u32 rx_ctpr[32]; + u32 rcbs[32]; +}; -extern int mal_set_rcbs(struct ibm_ocp_mal *mal, int channel, - unsigned long size); +int mal_get_regs_len(struct ibm_ocp_mal *mal); +void *mal_dump_regs(struct ibm_ocp_mal *mal, void *buf); -#endif /* _IBM_EMAC_MAL_H */ +#endif /* __IBM_EMAC_MAL_H_ */ diff --git a/drivers/net/ibm_emac/ibm_emac_phy.c b/drivers/net/ibm_emac/ibm_emac_phy.c index 14213f090..4a9702406 100644 --- a/drivers/net/ibm_emac/ibm_emac_phy.c +++ b/drivers/net/ibm_emac/ibm_emac_phy.c @@ -1,96 +1,79 @@ /* - * ibm_ocp_phy.c + * drivers/net/ibm_emac/ibm_emac_phy.c * - * PHY drivers for the ibm ocp ethernet driver. Borrowed - * from sungem_phy.c, though I only kept the generic MII + * Driver for PowerPC 4xx on-chip ethernet controller, PHY support. + * Borrowed from sungem_phy.c, though I only kept the generic MII * driver for now. * * This file should be shared with other drivers or eventually * merged as the "low level" part of miilib * * (c) 2003, Benjamin Herrenscmidt (benh@kernel.crashing.org) + * (c) 2004-2005, Eugene Surovegin * */ - -#include - #include - #include -#include #include #include -#include #include #include #include +#include + #include "ibm_emac_phy.h" -static int reset_one_mii_phy(struct mii_phy *phy, int phy_id) +static inline int phy_read(struct mii_phy *phy, int reg) +{ + return phy->mdio_read(phy->dev, phy->address, reg); +} + +static inline void phy_write(struct mii_phy *phy, int reg, int val) { - u16 val; + phy->mdio_write(phy->dev, phy->address, reg, val); +} + +int mii_reset_phy(struct mii_phy *phy) +{ + int val; int limit = 10000; - val = __phy_read(phy, phy_id, MII_BMCR); + val = phy_read(phy, MII_BMCR); val &= ~BMCR_ISOLATE; val |= BMCR_RESET; - __phy_write(phy, phy_id, MII_BMCR, val); + phy_write(phy, MII_BMCR, val); - udelay(100); + udelay(300); while (limit--) { - val = __phy_read(phy, phy_id, MII_BMCR); - if ((val & BMCR_RESET) == 0) + val = phy_read(phy, MII_BMCR); + if (val >= 0 && (val & BMCR_RESET) == 0) break; udelay(10); } if ((val & BMCR_ISOLATE) && limit > 0) - __phy_write(phy, phy_id, MII_BMCR, val & ~BMCR_ISOLATE); + phy_write(phy, MII_BMCR, val & ~BMCR_ISOLATE); - return (limit <= 0); -} - -static int cis8201_init(struct mii_phy *phy) -{ - u16 epcr; - - epcr = phy_read(phy, MII_CIS8201_EPCR); - epcr &= ~EPCR_MODE_MASK; - - switch (phy->mode) { - case PHY_MODE_TBI: - epcr |= EPCR_TBI_MODE; - break; - case PHY_MODE_RTBI: - epcr |= EPCR_RTBI_MODE; - break; - case PHY_MODE_GMII: - epcr |= EPCR_GMII_MODE; - break; - case PHY_MODE_RGMII: - default: - epcr |= EPCR_RGMII_MODE; - } - - phy_write(phy, MII_CIS8201_EPCR, epcr); - - return 0; + return limit <= 0; } static int genmii_setup_aneg(struct mii_phy *phy, u32 advertise) { - u16 ctl, adv; + int ctl, adv; - phy->autoneg = 1; + phy->autoneg = AUTONEG_ENABLE; phy->speed = SPEED_10; phy->duplex = DUPLEX_HALF; - phy->pause = 0; + phy->pause = phy->asym_pause = 0; phy->advertising = advertise; /* Setup standard advertise */ adv = phy_read(phy, MII_ADVERTISE); - adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4); + if (adv < 0) + return adv; + adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4 | ADVERTISE_PAUSE_CAP | + ADVERTISE_PAUSE_ASYM); if (advertise & ADVERTISED_10baseT_Half) adv |= ADVERTISE_10HALF; if (advertise & ADVERTISED_10baseT_Full) @@ -99,8 +82,25 @@ static int genmii_setup_aneg(struct mii_phy *phy, u32 advertise) adv |= ADVERTISE_100HALF; if (advertise & ADVERTISED_100baseT_Full) adv |= ADVERTISE_100FULL; + if (advertise & ADVERTISED_Pause) + adv |= ADVERTISE_PAUSE_CAP; + if (advertise & ADVERTISED_Asym_Pause) + adv |= ADVERTISE_PAUSE_ASYM; phy_write(phy, MII_ADVERTISE, adv); + if (phy->features & + (SUPPORTED_1000baseT_Full | SUPPORTED_1000baseT_Half)) { + adv = phy_read(phy, MII_CTRL1000); + if (adv < 0) + return adv; + adv &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF); + if (advertise & ADVERTISED_1000baseT_Full) + adv |= ADVERTISE_1000FULL; + if (advertise & ADVERTISED_1000baseT_Half) + adv |= ADVERTISE_1000HALF; + phy_write(phy, MII_CTRL1000, adv); + } + /* Start/Restart aneg */ ctl = phy_read(phy, MII_BMCR); ctl |= (BMCR_ANENABLE | BMCR_ANRESTART); @@ -111,14 +111,16 @@ static int genmii_setup_aneg(struct mii_phy *phy, u32 advertise) static int genmii_setup_forced(struct mii_phy *phy, int speed, int fd) { - u16 ctl; + int ctl; - phy->autoneg = 0; + phy->autoneg = AUTONEG_DISABLE; phy->speed = speed; phy->duplex = fd; - phy->pause = 0; + phy->pause = phy->asym_pause = 0; ctl = phy_read(phy, MII_BMCR); + if (ctl < 0) + return ctl; ctl &= ~(BMCR_FULLDPLX | BMCR_SPEED100 | BMCR_ANENABLE); /* First reset the PHY */ @@ -132,6 +134,8 @@ static int genmii_setup_forced(struct mii_phy *phy, int speed, int fd) ctl |= BMCR_SPEED100; break; case SPEED_1000: + ctl |= BMCR_SPEED1000; + break; default: return -EINVAL; } @@ -144,112 +148,155 @@ static int genmii_setup_forced(struct mii_phy *phy, int speed, int fd) static int genmii_poll_link(struct mii_phy *phy) { - u16 status; + int status; - (void)phy_read(phy, MII_BMSR); + /* Clear latched value with dummy read */ + phy_read(phy, MII_BMSR); status = phy_read(phy, MII_BMSR); - if ((status & BMSR_LSTATUS) == 0) + if (status < 0 || (status & BMSR_LSTATUS) == 0) return 0; - if (phy->autoneg && !(status & BMSR_ANEGCOMPLETE)) + if (phy->autoneg == AUTONEG_ENABLE && !(status & BMSR_ANEGCOMPLETE)) return 0; return 1; } -#define MII_CIS8201_ACSR 0x1c -#define ACSR_DUPLEX_STATUS 0x0020 -#define ACSR_SPEED_1000BASET 0x0010 -#define ACSR_SPEED_100BASET 0x0008 - -static int cis8201_read_link(struct mii_phy *phy) +static int genmii_read_link(struct mii_phy *phy) { - u16 acsr; + if (phy->autoneg == AUTONEG_ENABLE) { + int glpa = 0; + int lpa = phy_read(phy, MII_LPA) & phy_read(phy, MII_ADVERTISE); + if (lpa < 0) + return lpa; + + if (phy->features & + (SUPPORTED_1000baseT_Full | SUPPORTED_1000baseT_Half)) { + int adv = phy_read(phy, MII_CTRL1000); + glpa = phy_read(phy, MII_STAT1000); - if (phy->autoneg) { - acsr = phy_read(phy, MII_CIS8201_ACSR); + if (glpa < 0 || adv < 0) + return adv; - if (acsr & ACSR_DUPLEX_STATUS) + glpa &= adv << 2; + } + + phy->speed = SPEED_10; + phy->duplex = DUPLEX_HALF; + phy->pause = phy->asym_pause = 0; + + if (glpa & (LPA_1000FULL | LPA_1000HALF)) { + phy->speed = SPEED_1000; + if (glpa & LPA_1000FULL) + phy->duplex = DUPLEX_FULL; + } else if (lpa & (LPA_100FULL | LPA_100HALF)) { + phy->speed = SPEED_100; + if (lpa & LPA_100FULL) + phy->duplex = DUPLEX_FULL; + } else if (lpa & LPA_10FULL) + phy->duplex = DUPLEX_FULL; + + if (phy->duplex == DUPLEX_FULL) { + phy->pause = lpa & LPA_PAUSE_CAP ? 1 : 0; + phy->asym_pause = lpa & LPA_PAUSE_ASYM ? 1 : 0; + } + } else { + int bmcr = phy_read(phy, MII_BMCR); + if (bmcr < 0) + return bmcr; + + if (bmcr & BMCR_FULLDPLX) phy->duplex = DUPLEX_FULL; else phy->duplex = DUPLEX_HALF; - if (acsr & ACSR_SPEED_1000BASET) { + if (bmcr & BMCR_SPEED1000) phy->speed = SPEED_1000; - } else if (acsr & ACSR_SPEED_100BASET) + else if (bmcr & BMCR_SPEED100) phy->speed = SPEED_100; else phy->speed = SPEED_10; - phy->pause = 0; - } - /* On non-aneg, we assume what we put in BMCR is the speed, - * though magic-aneg shouldn't prevent this case from occurring - */ + phy->pause = phy->asym_pause = 0; + } return 0; } -static int genmii_read_link(struct mii_phy *phy) +/* Generic implementation for most 10/100/1000 PHYs */ +static struct mii_phy_ops generic_phy_ops = { + .setup_aneg = genmii_setup_aneg, + .setup_forced = genmii_setup_forced, + .poll_link = genmii_poll_link, + .read_link = genmii_read_link +}; + +static struct mii_phy_def genmii_phy_def = { + .phy_id = 0x00000000, + .phy_id_mask = 0x00000000, + .name = "Generic MII", + .ops = &generic_phy_ops +}; + +/* CIS8201 */ +#define MII_CIS8201_10BTCSR 0x16 +#define TENBTCSR_ECHO_DISABLE 0x2000 +#define MII_CIS8201_EPCR 0x17 +#define EPCR_MODE_MASK 0x3000 +#define EPCR_GMII_MODE 0x0000 +#define EPCR_RGMII_MODE 0x1000 +#define EPCR_TBI_MODE 0x2000 +#define EPCR_RTBI_MODE 0x3000 +#define MII_CIS8201_ACSR 0x1c +#define ACSR_PIN_PRIO_SELECT 0x0004 + +static int cis8201_init(struct mii_phy *phy) { - u16 lpa; + int epcr; - if (phy->autoneg) { - lpa = phy_read(phy, MII_LPA) & phy_read(phy, MII_ADVERTISE); + epcr = phy_read(phy, MII_CIS8201_EPCR); + if (epcr < 0) + return epcr; - phy->speed = SPEED_10; - phy->duplex = DUPLEX_HALF; - phy->pause = 0; + epcr &= ~EPCR_MODE_MASK; - if (lpa & (LPA_100FULL | LPA_100HALF)) { - phy->speed = SPEED_100; - if (lpa & LPA_100FULL) - phy->duplex = DUPLEX_FULL; - } else if (lpa & LPA_10FULL) - phy->duplex = DUPLEX_FULL; + switch (phy->mode) { + case PHY_MODE_TBI: + epcr |= EPCR_TBI_MODE; + break; + case PHY_MODE_RTBI: + epcr |= EPCR_RTBI_MODE; + break; + case PHY_MODE_GMII: + epcr |= EPCR_GMII_MODE; + break; + case PHY_MODE_RGMII: + default: + epcr |= EPCR_RGMII_MODE; } - /* On non-aneg, we assume what we put in BMCR is the speed, - * though magic-aneg shouldn't prevent this case from occurring - */ + + phy_write(phy, MII_CIS8201_EPCR, epcr); + + /* MII regs override strap pins */ + phy_write(phy, MII_CIS8201_ACSR, + phy_read(phy, MII_CIS8201_ACSR) | ACSR_PIN_PRIO_SELECT); + + /* Disable TX_EN -> CRS echo mode, otherwise 10/HDX doesn't work */ + phy_write(phy, MII_CIS8201_10BTCSR, + phy_read(phy, MII_CIS8201_10BTCSR) | TENBTCSR_ECHO_DISABLE); return 0; } -#define MII_BASIC_FEATURES (SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | \ - SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | \ - SUPPORTED_Autoneg | SUPPORTED_TP | SUPPORTED_MII) -#define MII_GBIT_FEATURES (MII_BASIC_FEATURES | \ - SUPPORTED_1000baseT_Half | SUPPORTED_1000baseT_Full) - -/* CIS8201 phy ops */ static struct mii_phy_ops cis8201_phy_ops = { - init:cis8201_init, - setup_aneg:genmii_setup_aneg, - setup_forced:genmii_setup_forced, - poll_link:genmii_poll_link, - read_link:cis8201_read_link -}; - -/* Generic implementation for most 10/100 PHYs */ -static struct mii_phy_ops generic_phy_ops = { - setup_aneg:genmii_setup_aneg, - setup_forced:genmii_setup_forced, - poll_link:genmii_poll_link, - read_link:genmii_read_link + .init = cis8201_init, + .setup_aneg = genmii_setup_aneg, + .setup_forced = genmii_setup_forced, + .poll_link = genmii_poll_link, + .read_link = genmii_read_link }; static struct mii_phy_def cis8201_phy_def = { - phy_id:0x000fc410, - phy_id_mask:0x000ffff0, - name:"CIS8201 Gigabit Ethernet", - features:MII_GBIT_FEATURES, - magic_aneg:0, - ops:&cis8201_phy_ops -}; - -static struct mii_phy_def genmii_phy_def = { - phy_id:0x00000000, - phy_id_mask:0x00000000, - name:"Generic MII", - features:MII_BASIC_FEATURES, - magic_aneg:0, - ops:&generic_phy_ops + .phy_id = 0x000fc410, + .phy_id_mask = 0x000ffff0, + .name = "CIS8201 Gigabit Ethernet", + .ops = &cis8201_phy_ops }; static struct mii_phy_def *mii_phy_table[] = { @@ -258,39 +305,60 @@ static struct mii_phy_def *mii_phy_table[] = { NULL }; -int mii_phy_probe(struct mii_phy *phy, int mii_id) +int mii_phy_probe(struct mii_phy *phy, int address) { - int rc; - u32 id; struct mii_phy_def *def; int i; + u32 id; - phy->autoneg = 0; + phy->autoneg = AUTONEG_DISABLE; phy->advertising = 0; - phy->mii_id = mii_id; - phy->speed = 0; - phy->duplex = 0; - phy->pause = 0; - - /* Take PHY out of isloate mode and reset it. */ - rc = reset_one_mii_phy(phy, mii_id); - if (rc) + phy->address = address; + phy->speed = SPEED_10; + phy->duplex = DUPLEX_HALF; + phy->pause = phy->asym_pause = 0; + + /* Take PHY out of isolate mode and reset it. */ + if (mii_reset_phy(phy)) return -ENODEV; /* Read ID and find matching entry */ - id = (phy_read(phy, MII_PHYSID1) << 16 | phy_read(phy, MII_PHYSID2)) - & 0xfffffff0; + id = (phy_read(phy, MII_PHYSID1) << 16) | phy_read(phy, MII_PHYSID2); for (i = 0; (def = mii_phy_table[i]) != NULL; i++) if ((id & def->phy_id_mask) == def->phy_id) break; /* Should never be NULL (we have a generic entry), but... */ - if (def == NULL) + if (!def) return -ENODEV; phy->def = def; + /* Determine PHY features if needed */ + phy->features = def->features; + if (!phy->features) { + u16 bmsr = phy_read(phy, MII_BMSR); + if (bmsr & BMSR_ANEGCAPABLE) + phy->features |= SUPPORTED_Autoneg; + if (bmsr & BMSR_10HALF) + phy->features |= SUPPORTED_10baseT_Half; + if (bmsr & BMSR_10FULL) + phy->features |= SUPPORTED_10baseT_Full; + if (bmsr & BMSR_100HALF) + phy->features |= SUPPORTED_100baseT_Half; + if (bmsr & BMSR_100FULL) + phy->features |= SUPPORTED_100baseT_Full; + if (bmsr & BMSR_ESTATEN) { + u16 esr = phy_read(phy, MII_ESTATUS); + if (esr & ESTATUS_1000_TFULL) + phy->features |= SUPPORTED_1000baseT_Full; + if (esr & ESTATUS_1000_THALF) + phy->features |= SUPPORTED_1000baseT_Half; + } + phy->features |= SUPPORTED_MII; + } + /* Setup default advertising */ - phy->advertising = def->features; + phy->advertising = phy->features; return 0; } diff --git a/drivers/net/ibm_emac/ibm_emac_rgmii.c b/drivers/net/ibm_emac/ibm_emac_rgmii.c index f0b1ffb2d..53d281cb9 100644 --- a/drivers/net/ibm_emac/ibm_emac_rgmii.c +++ b/drivers/net/ibm_emac/ibm_emac_rgmii.c @@ -16,7 +16,6 @@ * option) any later version. * */ -#include #include #include #include diff --git a/drivers/net/ibm_emac/ibm_emac_rgmii.h b/drivers/net/ibm_emac/ibm_emac_rgmii.h index 49f188f4e..94abde55e 100644 --- a/drivers/net/ibm_emac/ibm_emac_rgmii.h +++ b/drivers/net/ibm_emac/ibm_emac_rgmii.h @@ -1,5 +1,7 @@ /* - * Defines for the IBM RGMII bridge + * drivers/net/ibm_emac/ibm_emac_rgmii.c + * + * Driver for PowerPC 4xx on-chip ethernet controller, RGMII bridge support. * * Based on ocp_zmii.h/ibm_emac_zmii.h * Armin Kuster akuster@mvista.com @@ -7,6 +9,9 @@ * Copyright 2004 MontaVista Software, Inc. * Matt Porter * + * Copyright (c) 2004, 2005 Zultys Technologies. + * Eugene Surovegin or + * * 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 @@ -16,50 +21,44 @@ #ifndef _IBM_EMAC_RGMII_H_ #define _IBM_EMAC_RGMII_H_ -#include /* RGMII bridge */ -typedef struct rgmii_regs { +struct rgmii_regs { u32 fer; /* Function enable register */ u32 ssr; /* Speed select register */ -} rgmii_t; - -#define RGMII_INPUTS 4 +}; /* RGMII device */ struct ibm_ocp_rgmii { - struct rgmii_regs *base; - int mode[RGMII_INPUTS]; + struct rgmii_regs __iomem *base; int users; /* number of EMACs using this RGMII bridge */ }; -/* Fuctional Enable Reg */ -#define RGMII_FER_MASK(x) (0x00000007 << (4*x)) -#define RGMII_RTBI 0x00000004 -#define RGMII_RGMII 0x00000005 -#define RGMII_TBI 0x00000006 -#define RGMII_GMII 0x00000007 - -/* Speed Selection reg */ +#ifdef CONFIG_IBM_EMAC_RGMII +int rgmii_attach(void *emac) __init; -#define RGMII_SP2_100 0x00000002 -#define RGMII_SP2_1000 0x00000004 -#define RGMII_SP3_100 0x00000200 -#define RGMII_SP3_1000 0x00000400 +void __rgmii_fini(struct ocp_device *ocpdev, int input) __exit; +static inline void rgmii_fini(struct ocp_device *ocpdev, int input) +{ + if (ocpdev) + __rgmii_fini(ocpdev, input); +} -#define RGMII_MII2_SPDMASK 0x00000007 -#define RGMII_MII3_SPDMASK 0x00000700 +void rgmii_set_speed(struct ocp_device *ocpdev, int input, int speed); -#define RGMII_MII2_100MB RGMII_SP2_100 & ~RGMII_SP2_1000 -#define RGMII_MII2_1000MB RGMII_SP2_1000 & ~RGMII_SP2_100 -#define RGMII_MII2_10MB ~(RGMII_SP2_100 | RGMII_SP2_1000) -#define RGMII_MII3_100MB RGMII_SP3_100 & ~RGMII_SP3_1000 -#define RGMII_MII3_1000MB RGMII_SP3_1000 & ~RGMII_SP3_100 -#define RGMII_MII3_10MB ~(RGMII_SP3_100 | RGMII_SP3_1000) +int __rgmii_get_regs_len(struct ocp_device *ocpdev); +static inline int rgmii_get_regs_len(struct ocp_device *ocpdev) +{ + return ocpdev ? __rgmii_get_regs_len(ocpdev) : 0; +} -#define RTBI 0 -#define RGMII 1 -#define TBI 2 -#define GMII 3 +void *rgmii_dump_regs(struct ocp_device *ocpdev, void *buf); +#else +# define rgmii_attach(x) 0 +# define rgmii_fini(x,y) ((void)0) +# define rgmii_set_speed(x,y,z) ((void)0) +# define rgmii_get_regs_len(x) 0 +# define rgmii_dump_regs(x,buf) (buf) +#endif /* !CONFIG_IBM_EMAC_RGMII */ #endif /* _IBM_EMAC_RGMII_H_ */ diff --git a/drivers/net/ibm_emac/ibm_emac_tah.c b/drivers/net/ibm_emac/ibm_emac_tah.c index af08afc22..e287b451b 100644 --- a/drivers/net/ibm_emac/ibm_emac_tah.c +++ b/drivers/net/ibm_emac/ibm_emac_tah.c @@ -13,7 +13,6 @@ * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. */ -#include #include #include "ibm_emac_core.h" diff --git a/drivers/net/ibm_emac/ibm_emac_tah.h b/drivers/net/ibm_emac/ibm_emac_tah.h index ecfc69805..38153945a 100644 --- a/drivers/net/ibm_emac/ibm_emac_tah.h +++ b/drivers/net/ibm_emac/ibm_emac_tah.h @@ -1,9 +1,13 @@ /* - * Defines for the IBM TAH + * drivers/net/ibm_emac/ibm_emac_tah.h + * + * Driver for PowerPC 4xx on-chip ethernet controller, TAH support. * * Copyright 2004 MontaVista Software, Inc. * Matt Porter * + * Copyright (c) 2005 Eugene Surovegin + * * 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 @@ -13,36 +17,71 @@ #ifndef _IBM_EMAC_TAH_H #define _IBM_EMAC_TAH_H +#include +#include + /* TAH */ -typedef struct tah_regs { - u32 tah_revid; +struct tah_regs { + u32 revid; u32 pad[3]; - u32 tah_mr; - u32 tah_ssr0; - u32 tah_ssr1; - u32 tah_ssr2; - u32 tah_ssr3; - u32 tah_ssr4; - u32 tah_ssr5; - u32 tah_tsr; -} tah_t; + u32 mr; + u32 ssr0; + u32 ssr1; + u32 ssr2; + u32 ssr3; + u32 ssr4; + u32 ssr5; + u32 tsr; +}; /* TAH engine */ -#define TAH_MR_CVR 0x80000000 -#define TAH_MR_SR 0x40000000 -#define TAH_MR_ST_256 0x01000000 -#define TAH_MR_ST_512 0x02000000 -#define TAH_MR_ST_768 0x03000000 -#define TAH_MR_ST_1024 0x04000000 -#define TAH_MR_ST_1280 0x05000000 -#define TAH_MR_ST_1536 0x06000000 -#define TAH_MR_TFS_16KB 0x00000000 -#define TAH_MR_TFS_2KB 0x00200000 -#define TAH_MR_TFS_4KB 0x00400000 -#define TAH_MR_TFS_6KB 0x00600000 -#define TAH_MR_TFS_8KB 0x00800000 -#define TAH_MR_TFS_10KB 0x00a00000 -#define TAH_MR_DTFP 0x00100000 -#define TAH_MR_DIG 0x00080000 +#define TAH_MR_CVR 0x80000000 +#define TAH_MR_SR 0x40000000 +#define TAH_MR_ST_256 0x01000000 +#define TAH_MR_ST_512 0x02000000 +#define TAH_MR_ST_768 0x03000000 +#define TAH_MR_ST_1024 0x04000000 +#define TAH_MR_ST_1280 0x05000000 +#define TAH_MR_ST_1536 0x06000000 +#define TAH_MR_TFS_16KB 0x00000000 +#define TAH_MR_TFS_2KB 0x00200000 +#define TAH_MR_TFS_4KB 0x00400000 +#define TAH_MR_TFS_6KB 0x00600000 +#define TAH_MR_TFS_8KB 0x00800000 +#define TAH_MR_TFS_10KB 0x00a00000 +#define TAH_MR_DTFP 0x00100000 +#define TAH_MR_DIG 0x00080000 + +#ifdef CONFIG_IBM_EMAC_TAH +int tah_attach(void *emac) __init; + +void __tah_fini(struct ocp_device *ocpdev) __exit; +static inline void tah_fini(struct ocp_device *ocpdev) +{ + if (ocpdev) + __tah_fini(ocpdev); +} + +void __tah_reset(struct ocp_device *ocpdev); +static inline void tah_reset(struct ocp_device *ocpdev) +{ + if (ocpdev) + __tah_reset(ocpdev); +} + +int __tah_get_regs_len(struct ocp_device *ocpdev); +static inline int tah_get_regs_len(struct ocp_device *ocpdev) +{ + return ocpdev ? __tah_get_regs_len(ocpdev) : 0; +} + +void *tah_dump_regs(struct ocp_device *ocpdev, void *buf); +#else +# define tah_attach(x) 0 +# define tah_fini(x) ((void)0) +# define tah_reset(x) ((void)0) +# define tah_get_regs_len(x) 0 +# define tah_dump_regs(x,buf) (buf) +#endif /* !CONFIG_IBM_EMAC_TAH */ #endif /* _IBM_EMAC_TAH_H */ diff --git a/drivers/net/ibm_emac/ibm_emac_zmii.c b/drivers/net/ibm_emac/ibm_emac_zmii.c index e129e0aaa..37dc8f342 100644 --- a/drivers/net/ibm_emac/ibm_emac_zmii.c +++ b/drivers/net/ibm_emac/ibm_emac_zmii.c @@ -16,7 +16,6 @@ * option) any later version. * */ -#include #include #include #include diff --git a/drivers/net/ibm_emac/ibm_emac_zmii.h b/drivers/net/ibm_emac/ibm_emac_zmii.h index 6f6cd2a39..972e3a44a 100644 --- a/drivers/net/ibm_emac/ibm_emac_zmii.h +++ b/drivers/net/ibm_emac/ibm_emac_zmii.h @@ -1,23 +1,26 @@ /* - * ocp_zmii.h + * drivers/net/ibm_emac/ibm_emac_zmii.h * - * Defines for the IBM ZMII bridge + * Driver for PowerPC 4xx on-chip ethernet controller, ZMII bridge support. * - * Armin Kuster akuster@mvista.com - * Dec, 2001 + * Copyright (c) 2004, 2005 Zultys Technologies. + * Eugene Surovegin or * - * Copyright 2001 MontaVista Softare Inc. + * Based on original work by + * Armin Kuster + * Copyright 2001 MontaVista Softare 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. + * */ - #ifndef _IBM_EMAC_ZMII_H_ #define _IBM_EMAC_ZMII_H_ -#include +#include +#include /* ZMII bridge registers */ struct zmii_regs { @@ -26,68 +29,54 @@ struct zmii_regs { u32 smiirs; /* SMII status reg */ }; -#define ZMII_INPUTS 4 - /* ZMII device */ struct ibm_ocp_zmii { - struct zmii_regs *base; - int mode[ZMII_INPUTS]; + struct zmii_regs __iomem *base; + int mode; /* subset of PHY_MODE_XXXX */ int users; /* number of EMACs using this ZMII bridge */ + u32 fer_save; /* FER value left by firmware */ }; -/* Fuctional Enable Reg */ - -#define ZMII_FER_MASK(x) (0xf0000000 >> (4*x)) - -#define ZMII_MDI0 0x80000000 -#define ZMII_SMII0 0x40000000 -#define ZMII_RMII0 0x20000000 -#define ZMII_MII0 0x10000000 -#define ZMII_MDI1 0x08000000 -#define ZMII_SMII1 0x04000000 -#define ZMII_RMII1 0x02000000 -#define ZMII_MII1 0x01000000 -#define ZMII_MDI2 0x00800000 -#define ZMII_SMII2 0x00400000 -#define ZMII_RMII2 0x00200000 -#define ZMII_MII2 0x00100000 -#define ZMII_MDI3 0x00080000 -#define ZMII_SMII3 0x00040000 -#define ZMII_RMII3 0x00020000 -#define ZMII_MII3 0x00010000 +#ifdef CONFIG_IBM_EMAC_ZMII +int zmii_attach(void *emac) __init; -/* Speed Selection reg */ +void __zmii_fini(struct ocp_device *ocpdev, int input) __exit; +static inline void zmii_fini(struct ocp_device *ocpdev, int input) +{ + if (ocpdev) + __zmii_fini(ocpdev, input); +} -#define ZMII_SCI0 0x40000000 -#define ZMII_FSS0 0x20000000 -#define ZMII_SP0 0x10000000 -#define ZMII_SCI1 0x04000000 -#define ZMII_FSS1 0x02000000 -#define ZMII_SP1 0x01000000 -#define ZMII_SCI2 0x00400000 -#define ZMII_FSS2 0x00200000 -#define ZMII_SP2 0x00100000 -#define ZMII_SCI3 0x00040000 -#define ZMII_FSS3 0x00020000 -#define ZMII_SP3 0x00010000 +void __zmii_enable_mdio(struct ocp_device *ocpdev, int input); +static inline void zmii_enable_mdio(struct ocp_device *ocpdev, int input) +{ + if (ocpdev) + __zmii_enable_mdio(ocpdev, input); +} -#define ZMII_MII0_100MB ZMII_SP0 -#define ZMII_MII0_10MB ~ZMII_SP0 -#define ZMII_MII1_100MB ZMII_SP1 -#define ZMII_MII1_10MB ~ZMII_SP1 -#define ZMII_MII2_100MB ZMII_SP2 -#define ZMII_MII2_10MB ~ZMII_SP2 -#define ZMII_MII3_100MB ZMII_SP3 -#define ZMII_MII3_10MB ~ZMII_SP3 +void __zmii_set_speed(struct ocp_device *ocpdev, int input, int speed); +static inline void zmii_set_speed(struct ocp_device *ocpdev, int input, + int speed) +{ + if (ocpdev) + __zmii_set_speed(ocpdev, input, speed); +} -/* SMII Status reg */ +int __zmii_get_regs_len(struct ocp_device *ocpdev); +static inline int zmii_get_regs_len(struct ocp_device *ocpdev) +{ + return ocpdev ? __zmii_get_regs_len(ocpdev) : 0; +} -#define ZMII_STS0 0xFF000000 /* EMAC0 smii status mask */ -#define ZMII_STS1 0x00FF0000 /* EMAC1 smii status mask */ +void *zmii_dump_regs(struct ocp_device *ocpdev, void *buf); -#define SMII 0 -#define RMII 1 -#define MII 2 -#define MDI 3 +#else +# define zmii_attach(x) 0 +# define zmii_fini(x,y) ((void)0) +# define zmii_enable_mdio(x,y) ((void)0) +# define zmii_set_speed(x,y,z) ((void)0) +# define zmii_get_regs_len(x) 0 +# define zmii_dump_regs(x,buf) (buf) +#endif /* !CONFIG_IBM_EMAC_ZMII */ #endif /* _IBM_EMAC_ZMII_H_ */ diff --git a/drivers/net/ibmlana.c b/drivers/net/ibmlana.c index 01ad90421..2a95d72fa 100644 --- a/drivers/net/ibmlana.c +++ b/drivers/net/ibmlana.c @@ -1,4 +1,4 @@ -/* +/* net-3-driver for the IBM LAN Adapter/A This is an extension to the Linux operating system, and is covered by the @@ -11,9 +11,9 @@ This driver is based both on the SK_MCA driver, which is itself based on the SK_G16 and 3C523 driver. paper sources: - 'PC Hardware: Aufbau, Funktionsweise, Programmierung' by + 'PC Hardware: Aufbau, Funktionsweise, Programmierung' by Hans-Peter Messmer for the basic Microchannel stuff - + 'Linux Geraetetreiber' by Allesandro Rubini, Kalle Dalheimer for help on Ethernet driver programming @@ -27,14 +27,14 @@ paper sources: special acknowledgements to: - Bob Eager for helping me out with documentation from IBM - - Jim Shorney for his endless patience with me while I was using + - Jim Shorney for his endless patience with me while I was using him as a beta tester to trace down the address filter bug ;-) Missing things: -> set debug level via ioctl instead of compile-time switches -> I didn't follow the development of the 2.1.x kernels, so my - assumptions about which things changed with which kernel version + assumptions about which things changed with which kernel version are probably nonsense History: @@ -275,7 +275,7 @@ static void InitDscrs(struct net_device *dev) priv->rrastart = raddr = priv->txbufstart + (TXBUFCNT * PKTSIZE); priv->rdastart = addr = priv->rrastart + (priv->rxbufcnt * sizeof(rra_t)); priv->rxbufstart = baddr = priv->rdastart + (priv->rxbufcnt * sizeof(rda_t)); - + for (z = 0; z < priv->rxbufcnt; z++) { rra.startlo = baddr; rra.starthi = 0; @@ -570,7 +570,7 @@ static void irqrx_handler(struct net_device *dev) lrdaaddr = priv->rdastart + (priv->lastrxdescr * sizeof(rda_t)); memcpy_fromio(&rda, priv->base + rdaaddr, sizeof(rda_t)); - /* iron out upper word halves of fields we use - SONIC will duplicate + /* iron out upper word halves of fields we use - SONIC will duplicate bits 0..15 to 16..31 */ rda.status &= 0xffff; @@ -782,7 +782,7 @@ static int ibmlana_open(struct net_device *dev) /* register resources - only necessary for IRQ */ - result = request_irq(priv->realirq, irq_handler, SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev); + result = request_irq(priv->realirq, irq_handler, IRQF_SHARED | IRQF_SAMPLE_RANDOM, dev->name, dev); if (result != 0) { printk(KERN_ERR "%s: failed to register irq %d\n", dev->name, dev->irq); return result; @@ -836,9 +836,9 @@ static int ibmlana_tx(struct sk_buff *skb, struct net_device *dev) baddr = priv->txbufstart + (priv->nexttxdescr * PKTSIZE); memcpy_toio(priv->base + baddr, skb->data, skb->len); - /* copy filler into RAM - in case we're filling up... + /* copy filler into RAM - in case we're filling up... we're filling a bit more than necessary, but that doesn't harm - since the buffer is far larger... + since the buffer is far larger... Sorry Linus for the filler string but I couldn't resist ;-) */ if (tmplen > skb->len) { @@ -952,7 +952,7 @@ static int ibmlana_probe(struct net_device *dev) priv->realirq = irq; priv->medium = medium; spin_lock_init(&priv->lock); - + /* set base + irq for this device (irq not allocated so far) */ diff --git a/drivers/net/ibmlana.h b/drivers/net/ibmlana.h index 458ee226e..6b58bab9e 100644 --- a/drivers/net/ibmlana.h +++ b/drivers/net/ibmlana.h @@ -17,7 +17,7 @@ /* media enumeration - defined in a way that it fits onto the LAN/A's POS registers... */ -typedef enum { +typedef enum { Media_10BaseT, Media_10Base5, Media_Unknown, Media_10Base2, Media_Count } ibmlana_medium; @@ -27,7 +27,7 @@ typedef enum { typedef struct { unsigned int slot; /* MCA-Slot-# */ struct net_device_stats stat; /* packet statistics */ - int realirq; /* memorizes actual IRQ, even when + int realirq; /* memorizes actual IRQ, even when currently not allocated */ ibmlana_medium medium; /* physical cannector */ u32 tdastart, txbufstart, /* addresses */ @@ -41,7 +41,7 @@ typedef struct { spinlock_t lock; } ibmlana_priv; -/* this card uses quite a lot of I/O ports...luckily the MCA bus decodes +/* this card uses quite a lot of I/O ports...luckily the MCA bus decodes a full 64K I/O range... */ #define IBM_LANA_IORANGE 0xa0 diff --git a/drivers/net/ibmveth.c b/drivers/net/ibmveth.c index 52d01027d..0464e78f7 100644 --- a/drivers/net/ibmveth.c +++ b/drivers/net/ibmveth.c @@ -24,7 +24,7 @@ /* for use with IBM i/pSeries LPAR Linux. It utilizes the logical LAN */ /* option of the RS/6000 Platform Architechture to interface with virtual */ /* ethernet NICs that are presented to the partition by the hypervisor. */ -/* */ +/* */ /**************************************************************************/ /* TODO: @@ -33,7 +33,6 @@ - possibly remove procfs support */ -#include #include #include #include @@ -61,7 +60,7 @@ #undef DEBUG #define ibmveth_printk(fmt, args...) \ - printk(KERN_INFO "%s: " fmt, __FILE__, ## args) + printk(KERN_DEBUG "%s: " fmt, __FILE__, ## args) #define ibmveth_error_printk(fmt, args...) \ printk(KERN_ERR "(%s:%3.3d ua:%x) ERROR: " fmt, __FILE__, __LINE__ , adapter->vdev->unit_address, ## args) @@ -79,7 +78,7 @@ #else #define ibmveth_debug_printk_no_adapter(fmt, args...) #define ibmveth_debug_printk(fmt, args...) -#define ibmveth_assert(expr) +#define ibmveth_assert(expr) #endif static int ibmveth_open(struct net_device *dev); @@ -96,6 +95,7 @@ static void ibmveth_proc_register_adapter(struct ibmveth_adapter *adapter); static void ibmveth_proc_unregister_adapter(struct ibmveth_adapter *adapter); static irqreturn_t ibmveth_interrupt(int irq, void *dev_instance, struct pt_regs *regs); static inline void ibmveth_rxq_harvest_buffer(struct ibmveth_adapter *adapter); +static struct kobj_type ktype_veth_pool; #ifdef CONFIG_PROC_FS #define IBMVETH_PROC_DIR "net/ibmveth" @@ -133,12 +133,13 @@ static inline int ibmveth_rxq_frame_length(struct ibmveth_adapter *adapter) } /* setup the initial settings for a buffer pool */ -static void ibmveth_init_buffer_pool(struct ibmveth_buff_pool *pool, u32 pool_index, u32 pool_size, u32 buff_size) +static void ibmveth_init_buffer_pool(struct ibmveth_buff_pool *pool, u32 pool_index, u32 pool_size, u32 buff_size, u32 pool_active) { pool->size = pool_size; pool->index = pool_index; pool->buff_size = buff_size; pool->threshold = pool_size / 2; + pool->active = pool_active; } /* allocate and setup an buffer pool - called during open */ @@ -146,13 +147,13 @@ static int ibmveth_alloc_buffer_pool(struct ibmveth_buff_pool *pool) { int i; - pool->free_map = kmalloc(sizeof(u16) * pool->size, GFP_KERNEL); + pool->free_map = kmalloc(sizeof(u16) * pool->size, GFP_KERNEL); if(!pool->free_map) { return -1; } - pool->dma_addr = kmalloc(sizeof(dma_addr_t) * pool->size, GFP_KERNEL); + pool->dma_addr = kmalloc(sizeof(dma_addr_t) * pool->size, GFP_KERNEL); if(!pool->dma_addr) { kfree(pool->free_map); pool->free_map = NULL; @@ -180,7 +181,6 @@ static int ibmveth_alloc_buffer_pool(struct ibmveth_buff_pool *pool) atomic_set(&pool->available, 0); pool->producer_index = 0; pool->consumer_index = 0; - pool->active = 0; return 0; } @@ -214,7 +214,7 @@ static void ibmveth_replenish_buffer_pool(struct ibmveth_adapter *adapter, struc free_index = pool->consumer_index++ % pool->size; index = pool->free_map[free_index]; - + ibmveth_assert(index != IBM_VETH_INVALID_MAP); ibmveth_assert(pool->skbuff[index] == NULL); @@ -231,10 +231,10 @@ static void ibmveth_replenish_buffer_pool(struct ibmveth_adapter *adapter, struc desc.desc = 0; desc.fields.valid = 1; desc.fields.length = pool->buff_size; - desc.fields.address = dma_addr; + desc.fields.address = dma_addr; lpar_rc = h_add_logical_lan_buffer(adapter->vdev->unit_address, desc.desc); - + if(lpar_rc != H_SUCCESS) { pool->free_map[free_index] = index; pool->skbuff[index] = NULL; @@ -250,13 +250,13 @@ static void ibmveth_replenish_buffer_pool(struct ibmveth_adapter *adapter, struc adapter->replenish_add_buff_success++; } } - + mb(); atomic_add(buffers_added, &(pool->available)); } /* replenish routine */ -static void ibmveth_replenish_task(struct ibmveth_adapter *adapter) +static void ibmveth_replenish_task(struct ibmveth_adapter *adapter) { int i; @@ -264,7 +264,7 @@ static void ibmveth_replenish_task(struct ibmveth_adapter *adapter) for(i = 0; i < IbmVethNumBufferPools; i++) if(adapter->rx_buff_pool[i].active) - ibmveth_replenish_buffer_pool(adapter, + ibmveth_replenish_buffer_pool(adapter, &adapter->rx_buff_pool[i]); adapter->rx_no_buffer = *(u64*)(((char*)adapter->buffer_list_addr) + 4096 - 8); @@ -301,7 +301,6 @@ static void ibmveth_free_buffer_pool(struct ibmveth_adapter *adapter, struct ibm kfree(pool->skbuff); pool->skbuff = NULL; } - pool->active = 0; } /* remove a buffer from a pool */ @@ -372,7 +371,7 @@ static void ibmveth_rxq_recycle_buffer(struct ibmveth_adapter *adapter) desc.fields.address = adapter->rx_buff_pool[pool].dma_addr[index]; lpar_rc = h_add_logical_lan_buffer(adapter->vdev->unit_address, desc.desc); - + if(lpar_rc != H_SUCCESS) { ibmveth_debug_printk("h_add_logical_lan_buffer failed during recycle rc=%ld", lpar_rc); ibmveth_remove_buffer_from_pool(adapter, adapter->rx_queue.queue_addr[adapter->rx_queue.index].correlator); @@ -407,7 +406,7 @@ static void ibmveth_cleanup(struct ibmveth_adapter *adapter) } free_page((unsigned long)adapter->buffer_list_addr); adapter->buffer_list_addr = NULL; - } + } if(adapter->filter_list_addr != NULL) { if(!dma_mapping_error(adapter->filter_list_dma)) { @@ -433,7 +432,9 @@ static void ibmveth_cleanup(struct ibmveth_adapter *adapter) } for(i = 0; irx_buff_pool[i]); + if (adapter->rx_buff_pool[i].active) + ibmveth_free_buffer_pool(adapter, + &adapter->rx_buff_pool[i]); } static int ibmveth_open(struct net_device *netdev) @@ -450,10 +451,10 @@ static int ibmveth_open(struct net_device *netdev) for(i = 0; irx_buff_pool[i].size; - + adapter->buffer_list_addr = (void*) get_zeroed_page(GFP_KERNEL); adapter->filter_list_addr = (void*) get_zeroed_page(GFP_KERNEL); - + if(!adapter->buffer_list_addr || !adapter->filter_list_addr) { ibmveth_error_printk("unable to allocate filter or buffer list pages\n"); ibmveth_cleanup(adapter); @@ -489,9 +490,6 @@ static int ibmveth_open(struct net_device *netdev) adapter->rx_queue.num_slots = rxq_entries; adapter->rx_queue.toggle = 1; - /* call change_mtu to init the buffer pools based in initial mtu */ - ibmveth_change_mtu(netdev, netdev->mtu); - memcpy(&mac_address, netdev->dev_addr, netdev->addr_len); mac_address = mac_address >> 16; @@ -504,7 +502,7 @@ static int ibmveth_open(struct net_device *netdev) ibmveth_debug_printk("filter list @ 0x%p\n", adapter->filter_list_addr); ibmveth_debug_printk("receive q @ 0x%p\n", adapter->rx_queue.queue_addr); - + lpar_rc = h_register_logical_lan(adapter->vdev->unit_address, adapter->buffer_list_dma, rxq_desc.desc, @@ -519,7 +517,18 @@ static int ibmveth_open(struct net_device *netdev) rxq_desc.desc, mac_address); ibmveth_cleanup(adapter); - return -ENONET; + return -ENONET; + } + + for(i = 0; irx_buff_pool[i].active) + continue; + if (ibmveth_alloc_buffer_pool(&adapter->rx_buff_pool[i])) { + ibmveth_error_printk("unable to alloc pool\n"); + adapter->rx_buff_pool[i].active = 0; + ibmveth_cleanup(adapter); + return -ENOMEM ; + } } ibmveth_debug_printk("registering irq 0x%x\n", netdev->irq); @@ -547,10 +556,11 @@ static int ibmveth_close(struct net_device *netdev) { struct ibmveth_adapter *adapter = netdev->priv; long lpar_rc; - + ibmveth_debug_printk("close starting\n"); - netif_stop_queue(netdev); + if (!adapter->pool_config) + netif_stop_queue(netdev); free_irq(netdev->irq, netdev); @@ -694,7 +704,7 @@ static int ibmveth_start_xmit(struct sk_buff *skb, struct net_device *netdev) desc[5].desc, correlator); } while ((lpar_rc == H_BUSY) && (retry_count--)); - + if(lpar_rc != H_SUCCESS && lpar_rc != H_DROPPED) { int i; ibmveth_error_printk("tx: h_send_logical_lan failed with rc=%ld\n", lpar_rc); @@ -780,7 +790,7 @@ static int ibmveth_poll(struct net_device *netdev, int *budget) /* more work to do - return that we are not done yet */ netdev->quota -= frames_processed; *budget -= frames_processed; - return 1; + return 1; } /* we think we are done - reenable interrupts, then check once more to make sure we are done */ @@ -806,7 +816,7 @@ static int ibmveth_poll(struct net_device *netdev, int *budget) } static irqreturn_t ibmveth_interrupt(int irq, void *dev_instance, struct pt_regs *regs) -{ +{ struct net_device *netdev = dev_instance; struct ibmveth_adapter *adapter = netdev->priv; unsigned long lpar_rc; @@ -862,7 +872,7 @@ static void ibmveth_set_multicast_list(struct net_device *netdev) ibmveth_error_printk("h_multicast_ctrl rc=%ld when adding an entry to the filter table\n", lpar_rc); } } - + /* re-enable filtering */ lpar_rc = h_multicast_ctrl(adapter->vdev->unit_address, IbmVethMcastEnableFiltering, @@ -876,46 +886,22 @@ static void ibmveth_set_multicast_list(struct net_device *netdev) static int ibmveth_change_mtu(struct net_device *dev, int new_mtu) { struct ibmveth_adapter *adapter = dev->priv; + int new_mtu_oh = new_mtu + IBMVETH_BUFF_OH; int i; - int prev_smaller = 1; - if ((new_mtu < 68) || - (new_mtu > (pool_size[IbmVethNumBufferPools-1]) - IBMVETH_BUFF_OH)) + if (new_mtu < IBMVETH_MAX_MTU) return -EINVAL; + /* Look for an active buffer pool that can hold the new MTU */ for(i = 0; i (pool_size[i] - IBMVETH_BUFF_OH)) { - activate = 1; - prev_smaller= 1; - } else { - if (prev_smaller) - activate = 1; - prev_smaller= 0; + if (!adapter->rx_buff_pool[i].active) + continue; + if (new_mtu_oh < adapter->rx_buff_pool[i].buff_size) { + dev->mtu = new_mtu; + return 0; } - - if (activate && !adapter->rx_buff_pool[i].active) { - struct ibmveth_buff_pool *pool = - &adapter->rx_buff_pool[i]; - if(ibmveth_alloc_buffer_pool(pool)) { - ibmveth_error_printk("unable to alloc pool\n"); - return -ENOMEM; - } - adapter->rx_buff_pool[i].active = 1; - } else if (!activate && adapter->rx_buff_pool[i].active) { - adapter->rx_buff_pool[i].active = 0; - h_free_logical_lan_buffer(adapter->vdev->unit_address, - (u64)pool_size[i]); - } - } - - /* kick the interrupt handler so that the new buffer pools get - replenished or deallocated */ - ibmveth_interrupt(dev->irq, dev, NULL); - - dev->mtu = new_mtu; - return 0; + return -EINVAL; } static int __devinit ibmveth_probe(struct vio_dev *dev, const struct vio_device_id *id) @@ -928,7 +914,7 @@ static int __devinit ibmveth_probe(struct vio_dev *dev, const struct vio_device_ unsigned int *mcastFilterSize_p; - ibmveth_debug_printk_no_adapter("entering ibmveth_probe for UA 0x%x\n", + ibmveth_debug_printk_no_adapter("entering ibmveth_probe for UA 0x%x\n", dev->unit_address); mac_addr_p = (unsigned char *) vio_get_attribute(dev, VETH_MAC_ADDR, 0); @@ -937,7 +923,7 @@ static int __devinit ibmveth_probe(struct vio_dev *dev, const struct vio_device_ "attribute\n", __FILE__, __LINE__); return 0; } - + mcastFilterSize_p= (unsigned int *) vio_get_attribute(dev, VETH_MCAST_FILTER_SIZE, 0); if(!mcastFilterSize_p) { printk(KERN_ERR "(%s:%3.3d) ERROR: Can't find " @@ -945,7 +931,7 @@ static int __devinit ibmveth_probe(struct vio_dev *dev, const struct vio_device_ __FILE__, __LINE__); return 0; } - + netdev = alloc_etherdev(sizeof(struct ibmveth_adapter)); if(!netdev) @@ -960,13 +946,14 @@ static int __devinit ibmveth_probe(struct vio_dev *dev, const struct vio_device_ adapter->vdev = dev; adapter->netdev = netdev; adapter->mcastFilterSize= *mcastFilterSize_p; - + adapter->pool_config = 0; + /* Some older boxes running PHYP non-natively have an OF that - returns a 8-byte local-mac-address field (and the first + returns a 8-byte local-mac-address field (and the first 2 bytes have to be ignored) while newer boxes' OF return - a 6-byte field. Note that IEEE 1275 specifies that + a 6-byte field. Note that IEEE 1275 specifies that local-mac-address must be a 6-byte field. - The RPA doc specifies that the first byte must be 10b, so + The RPA doc specifies that the first byte must be 10b, so we'll just look for it to solve this 8 vs. 6 byte field issue */ if ((*mac_addr_p & 0x3) != 0x02) @@ -976,7 +963,7 @@ static int __devinit ibmveth_probe(struct vio_dev *dev, const struct vio_device_ memcpy(&adapter->mac_addr, mac_addr_p, 6); adapter->liobn = dev->iommu_table->it_index; - + netdev->irq = dev->irq; netdev->open = ibmveth_open; netdev->poll = ibmveth_poll; @@ -989,14 +976,21 @@ static int __devinit ibmveth_probe(struct vio_dev *dev, const struct vio_device_ netdev->ethtool_ops = &netdev_ethtool_ops; netdev->change_mtu = ibmveth_change_mtu; SET_NETDEV_DEV(netdev, &dev->dev); - netdev->features |= NETIF_F_LLTX; + netdev->features |= NETIF_F_LLTX; spin_lock_init(&adapter->stats_lock); memcpy(&netdev->dev_addr, &adapter->mac_addr, netdev->addr_len); - for(i = 0; irx_buff_pool[i], i, - pool_count[i], pool_size[i]); + for(i = 0; irx_buff_pool[i].kobj; + ibmveth_init_buffer_pool(&adapter->rx_buff_pool[i], i, + pool_count[i], pool_size[i], + pool_active[i]); + kobj->parent = &dev->dev.kobj; + sprintf(kobj->name, "pool%d", i); + kobj->ktype = &ktype_veth_pool; + kobject_register(kobj); + } ibmveth_debug_printk("adapter @ 0x%p\n", adapter); @@ -1025,6 +1019,10 @@ static int __devexit ibmveth_remove(struct vio_dev *dev) { struct net_device *netdev = dev->dev.driver_data; struct ibmveth_adapter *adapter = netdev->priv; + int i; + + for(i = 0; irx_buff_pool[i].kobj); unregister_netdev(netdev); @@ -1048,7 +1046,7 @@ static void ibmveth_proc_unregister_driver(void) remove_proc_entry(IBMVETH_PROC_DIR, NULL); } -static void *ibmveth_seq_start(struct seq_file *seq, loff_t *pos) +static void *ibmveth_seq_start(struct seq_file *seq, loff_t *pos) { if (*pos == 0) { return (void *)1; @@ -1063,18 +1061,18 @@ static void *ibmveth_seq_next(struct seq_file *seq, void *v, loff_t *pos) return NULL; } -static void ibmveth_seq_stop(struct seq_file *seq, void *v) +static void ibmveth_seq_stop(struct seq_file *seq, void *v) { } -static int ibmveth_seq_show(struct seq_file *seq, void *v) +static int ibmveth_seq_show(struct seq_file *seq, void *v) { struct ibmveth_adapter *adapter = seq->private; char *current_mac = ((char*) &adapter->netdev->dev_addr); char *firmware_mac = ((char*) &adapter->mac_addr) ; seq_printf(seq, "%s %s\n\n", ibmveth_driver_string, ibmveth_driver_version); - + seq_printf(seq, "Unit Address: 0x%x\n", adapter->vdev->unit_address); seq_printf(seq, "LIOBN: 0x%lx\n", adapter->liobn); seq_printf(seq, "Current MAC: %02X:%02X:%02X:%02X:%02X:%02X\n", @@ -1083,7 +1081,7 @@ static int ibmveth_seq_show(struct seq_file *seq, void *v) seq_printf(seq, "Firmware MAC: %02X:%02X:%02X:%02X:%02X:%02X\n", firmware_mac[0], firmware_mac[1], firmware_mac[2], firmware_mac[3], firmware_mac[4], firmware_mac[5]); - + seq_printf(seq, "\nAdapter Statistics:\n"); seq_printf(seq, " TX: skbuffs linearized: %ld\n", adapter->tx_linearized); seq_printf(seq, " multi-descriptor sends: %ld\n", adapter->tx_multidesc_send); @@ -1095,7 +1093,7 @@ static int ibmveth_seq_show(struct seq_file *seq, void *v) seq_printf(seq, " add buffer failures: %ld\n", adapter->replenish_add_buff_failure); seq_printf(seq, " invalid buffers: %ld\n", adapter->rx_invalid_buffer); seq_printf(seq, " no buffers: %ld\n", adapter->rx_no_buffer); - + return 0; } static struct seq_operations ibmveth_seq_ops = { @@ -1153,11 +1151,11 @@ static void ibmveth_proc_unregister_adapter(struct ibmveth_adapter *adapter) } #else /* CONFIG_PROC_FS */ -static void ibmveth_proc_register_adapter(struct ibmveth_adapter *adapter) +static void ibmveth_proc_register_adapter(struct ibmveth_adapter *adapter) { } -static void ibmveth_proc_unregister_adapter(struct ibmveth_adapter *adapter) +static void ibmveth_proc_unregister_adapter(struct ibmveth_adapter *adapter) { } static void ibmveth_proc_register_driver(void) @@ -1169,6 +1167,132 @@ static void ibmveth_proc_unregister_driver(void) } #endif /* CONFIG_PROC_FS */ +static struct attribute veth_active_attr; +static struct attribute veth_num_attr; +static struct attribute veth_size_attr; + +static ssize_t veth_pool_show(struct kobject * kobj, + struct attribute * attr, char * buf) +{ + struct ibmveth_buff_pool *pool = container_of(kobj, + struct ibmveth_buff_pool, + kobj); + + if (attr == &veth_active_attr) + return sprintf(buf, "%d\n", pool->active); + else if (attr == &veth_num_attr) + return sprintf(buf, "%d\n", pool->size); + else if (attr == &veth_size_attr) + return sprintf(buf, "%d\n", pool->buff_size); + return 0; +} + +static ssize_t veth_pool_store(struct kobject * kobj, struct attribute * attr, +const char * buf, size_t count) +{ + struct ibmveth_buff_pool *pool = container_of(kobj, + struct ibmveth_buff_pool, + kobj); + struct net_device *netdev = + container_of(kobj->parent, struct device, kobj)->driver_data; + struct ibmveth_adapter *adapter = netdev->priv; + long value = simple_strtol(buf, NULL, 10); + long rc; + + if (attr == &veth_active_attr) { + if (value && !pool->active) { + if(ibmveth_alloc_buffer_pool(pool)) { + ibmveth_error_printk("unable to alloc pool\n"); + return -ENOMEM; + } + pool->active = 1; + adapter->pool_config = 1; + ibmveth_close(netdev); + adapter->pool_config = 0; + if ((rc = ibmveth_open(netdev))) + return rc; + } else if (!value && pool->active) { + int mtu = netdev->mtu + IBMVETH_BUFF_OH; + int i; + /* Make sure there is a buffer pool with buffers that + can hold a packet of the size of the MTU */ + for(i = 0; irx_buff_pool[i]) + continue; + if (!adapter->rx_buff_pool[i].active) + continue; + if (mtu < adapter->rx_buff_pool[i].buff_size) { + pool->active = 0; + h_free_logical_lan_buffer(adapter-> + vdev-> + unit_address, + pool-> + buff_size); + } + } + if (pool->active) { + ibmveth_error_printk("no active pool >= MTU\n"); + return -EPERM; + } + } + } else if (attr == &veth_num_attr) { + if (value <= 0 || value > IBMVETH_MAX_POOL_COUNT) + return -EINVAL; + else { + adapter->pool_config = 1; + ibmveth_close(netdev); + adapter->pool_config = 0; + pool->size = value; + if ((rc = ibmveth_open(netdev))) + return rc; + } + } else if (attr == &veth_size_attr) { + if (value <= IBMVETH_BUFF_OH || value > IBMVETH_MAX_BUF_SIZE) + return -EINVAL; + else { + adapter->pool_config = 1; + ibmveth_close(netdev); + adapter->pool_config = 0; + pool->buff_size = value; + if ((rc = ibmveth_open(netdev))) + return rc; + } + } + + /* kick the interrupt handler to allocate/deallocate pools */ + ibmveth_interrupt(netdev->irq, netdev, NULL); + return count; +} + + +#define ATTR(_name, _mode) \ + struct attribute veth_##_name##_attr = { \ + .name = __stringify(_name), .mode = _mode, .owner = THIS_MODULE \ + }; + +static ATTR(active, 0644); +static ATTR(num, 0644); +static ATTR(size, 0644); + +static struct attribute * veth_pool_attrs[] = { + &veth_active_attr, + &veth_num_attr, + &veth_size_attr, + NULL, +}; + +static struct sysfs_ops veth_pool_ops = { + .show = veth_pool_show, + .store = veth_pool_store, +}; + +static struct kobj_type ktype_veth_pool = { + .release = NULL, + .sysfs_ops = &veth_pool_ops, + .default_attrs = veth_pool_attrs, +}; + + static struct vio_device_id ibmveth_device_table[] __devinitdata= { { "network", "IBM,l-lan"}, { "", "" } @@ -1198,7 +1322,7 @@ static void __exit ibmveth_module_exit(void) { vio_unregister_driver(&ibmveth_driver); ibmveth_proc_unregister_driver(); -} +} module_init(ibmveth_module_init); module_exit(ibmveth_module_exit); diff --git a/drivers/net/ibmveth.h b/drivers/net/ibmveth.h index 46919a814..8385bf836 100644 --- a/drivers/net/ibmveth.h +++ b/drivers/net/ibmveth.h @@ -75,10 +75,13 @@ #define IbmVethNumBufferPools 5 #define IBMVETH_BUFF_OH 22 /* Overhead: 14 ethernet header + 8 opaque handle */ +#define IBMVETH_MAX_MTU 68 +#define IBMVETH_MAX_POOL_COUNT 4096 +#define IBMVETH_MAX_BUF_SIZE (1024 * 128) -/* pool_size should be sorted */ static int pool_size[] = { 512, 1024 * 2, 1024 * 16, 1024 * 32, 1024 * 64 }; static int pool_count[] = { 256, 768, 256, 256, 256 }; +static int pool_active[] = { 1, 1, 0, 0, 0}; #define IBM_VETH_INVALID_MAP ((u16)0xffff) @@ -94,6 +97,7 @@ struct ibmveth_buff_pool { dma_addr_t *dma_addr; struct sk_buff **skbuff; int active; + struct kobject kobj; }; struct ibmveth_rx_q { @@ -118,6 +122,7 @@ struct ibmveth_adapter { dma_addr_t filter_list_dma; struct ibmveth_buff_pool rx_buff_pool[IbmVethNumBufferPools]; struct ibmveth_rx_q rx_queue; + int pool_config; /* adapter specific stats */ u64 replenish_task_cycles; @@ -134,7 +139,7 @@ struct ibmveth_adapter { spinlock_t stats_lock; }; -struct ibmveth_buf_desc_fields { +struct ibmveth_buf_desc_fields { u32 valid : 1; u32 toggle : 1; u32 reserved : 6; @@ -143,7 +148,7 @@ struct ibmveth_buf_desc_fields { }; union ibmveth_buf_desc { - u64 desc; + u64 desc; struct ibmveth_buf_desc_fields fields; }; diff --git a/drivers/net/ifb.c b/drivers/net/ifb.c index 2e222ef91..43e3f33ed 100644 --- a/drivers/net/ifb.c +++ b/drivers/net/ifb.c @@ -27,7 +27,6 @@ */ -#include #include #include #include @@ -272,6 +271,7 @@ static int __init ifb_init_module(void) for (i = 0; i < numifbs && !err; i++) err = ifb_init_one(i); if (err) { + i--; while (--i >= 0) ifb_free_one(i); } diff --git a/drivers/net/ioc3-eth.c b/drivers/net/ioc3-eth.c index ae71ed57c..68d8af7df 100644 --- a/drivers/net/ioc3-eth.c +++ b/drivers/net/ioc3-eth.c @@ -30,7 +30,6 @@ #define IOC3_NAME "ioc3-eth" #define IOC3_VERSION "2.6.3-3" -#include #include #include #include @@ -145,7 +144,7 @@ static inline struct sk_buff * ioc3_alloc_skb(unsigned long length, static inline unsigned long ioc3_map(void *ptr, unsigned long vdev) { #ifdef CONFIG_SGI_IP27 - vdev <<= 58; /* Shift to PCI64_ATTR_VIRTUAL */ + vdev <<= 57; /* Shift to PCI64_ATTR_VIRTUAL */ return vdev | (0xaUL << PCI64_ATTR_TARG_SHFT) | PCI64_ATTR_PREF | ((unsigned long)ptr & TO_PHYS_MASK); @@ -1064,7 +1063,7 @@ static int ioc3_open(struct net_device *dev) { struct ioc3_private *ip = netdev_priv(dev); - if (request_irq(dev->irq, ioc3_interrupt, SA_SHIRQ, ioc3_str, dev)) { + if (request_irq(dev->irq, ioc3_interrupt, IRQF_SHARED, ioc3_str, dev)) { printk(KERN_ERR "%s: Can't get irq %d\n", dev->name, dev->irq); return -EAGAIN; diff --git a/drivers/net/irda/Kconfig b/drivers/net/irda/Kconfig index cff8598aa..e9e6d99a9 100644 --- a/drivers/net/irda/Kconfig +++ b/drivers/net/irda/Kconfig @@ -350,7 +350,7 @@ config TOSHIBA_FIR config AU1000_FIR tristate "Alchemy Au1000 SIR/FIR" - depends on MIPS_AU1000 && IRDA + depends on SOC_AU1000 && IRDA config SMC_IRCC_FIR tristate "SMSC IrCC (EXPERIMENTAL)" @@ -417,5 +417,20 @@ config PXA_FICP available capabilities may vary from one PXA2xx target to another. +config MCS_FIR + tristate "MosChip MCS7780 IrDA-USB dongle" + depends on IRDA && USB && EXPERIMENTAL + help + Say Y or M here if you want to build support for the MosChip + MCS7780 IrDA-USB bridge device driver. + + USB bridge based on the MosChip MCS7780 don't conform to the + IrDA-USB device class specification, and therefore need their + own specific driver. Those dongles support SIR and FIR (4Mbps) + speeds. + + To compile it as a module, choose M here: the module will be called + mcs7780. + endmenu diff --git a/drivers/net/irda/Makefile b/drivers/net/irda/Makefile index c1ce2398e..5be09f1b9 100644 --- a/drivers/net/irda/Makefile +++ b/drivers/net/irda/Makefile @@ -19,6 +19,7 @@ obj-$(CONFIG_ALI_FIR) += ali-ircc.o obj-$(CONFIG_VLSI_FIR) += vlsi_ir.o obj-$(CONFIG_VIA_FIR) += via-ircc.o obj-$(CONFIG_PXA_FICP) += pxaficp_ir.o +obj-$(CONFIG_MCS_FIR) += mcs7780.o # Old dongle drivers for old SIR drivers obj-$(CONFIG_ESI_DONGLE_OLD) += esi.o obj-$(CONFIG_TEKRAM_DONGLE_OLD) += tekram.o diff --git a/drivers/net/irda/ali-ircc.c b/drivers/net/irda/ali-ircc.c index 2e7882eb7..e3c8cd5ec 100644 --- a/drivers/net/irda/ali-ircc.c +++ b/drivers/net/irda/ali-ircc.c @@ -34,14 +34,12 @@ #include #include #include +#include #include #include #include -#include -#include - #include #include #include @@ -51,7 +49,19 @@ #define CHIP_IO_EXTENT 8 #define BROKEN_DONGLE_ID -static char *driver_name = "ali-ircc"; +#define ALI_IRCC_DRIVER_NAME "ali-ircc" + +/* Power Management */ +static int ali_ircc_suspend(struct platform_device *dev, pm_message_t state); +static int ali_ircc_resume(struct platform_device *dev); + +static struct platform_driver ali_ircc_driver = { + .suspend = ali_ircc_suspend, + .resume = ali_ircc_resume, + .driver = { + .name = ALI_IRCC_DRIVER_NAME, + }, +}; /* Module parameters */ static int qos_mtt_bits = 0x07; /* 1 ms or more */ @@ -97,10 +107,7 @@ static int ali_ircc_is_receiving(struct ali_ircc_cb *self); static int ali_ircc_net_open(struct net_device *dev); static int ali_ircc_net_close(struct net_device *dev); static int ali_ircc_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); -static int ali_ircc_pmproc(struct pm_dev *dev, pm_request_t rqst, void *data); static void ali_ircc_change_speed(struct ali_ircc_cb *self, __u32 baud); -static void ali_ircc_suspend(struct ali_ircc_cb *self); -static void ali_ircc_wakeup(struct ali_ircc_cb *self); static struct net_device_stats *ali_ircc_net_get_stats(struct net_device *dev); /* SIR function */ @@ -139,12 +146,21 @@ static int __init ali_ircc_init(void) { ali_chip_t *chip; chipio_t info; - int ret = -ENODEV; + int ret; int cfg, cfg_base; int reg, revision; int i = 0; IRDA_DEBUG(2, "%s(), ---------------- Start ----------------\n", __FUNCTION__); + + ret = platform_driver_register(&ali_ircc_driver); + if (ret) { + IRDA_ERROR("%s, Can't register driver!\n", + ALI_IRCC_DRIVER_NAME); + return ret; + } + + ret = -ENODEV; /* Probe for all the ALi chipsets we know about */ for (chip= chips; chip->name; chip++, i++) @@ -214,6 +230,10 @@ static int __init ali_ircc_init(void) } IRDA_DEBUG(2, "%s(), ----------------- End -----------------\n", __FUNCTION__); + + if (ret) + platform_driver_unregister(&ali_ircc_driver); + return ret; } @@ -228,14 +248,14 @@ static void __exit ali_ircc_cleanup(void) int i; IRDA_DEBUG(2, "%s(), ---------------- Start ----------------\n", __FUNCTION__); - - pm_unregister_all(ali_ircc_pmproc); for (i=0; i < 4; i++) { if (dev_self[i]) ali_ircc_close(dev_self[i]); } + platform_driver_unregister(&ali_ircc_driver); + IRDA_DEBUG(2, "%s(), ----------------- End -----------------\n", __FUNCTION__); } @@ -249,7 +269,6 @@ static int ali_ircc_open(int i, chipio_t *info) { struct net_device *dev; struct ali_ircc_cb *self; - struct pm_dev *pmdev; int dongle_id; int err; @@ -284,7 +303,8 @@ static int ali_ircc_open(int i, chipio_t *info) self->io.fifo_size = 16; /* SIR: 16, FIR: 32 Benjamin 2000/11/1 */ /* Reserve the ioports that we need */ - if (!request_region(self->io.fir_base, self->io.fir_ext, driver_name)) { + if (!request_region(self->io.fir_base, self->io.fir_ext, + ALI_IRCC_DRIVER_NAME)) { IRDA_WARNING("%s(), can't get iobase of 0x%03x\n", __FUNCTION__, self->io.fir_base); err = -ENODEV; @@ -354,13 +374,10 @@ static int ali_ircc_open(int i, chipio_t *info) /* Check dongle id */ dongle_id = ali_ircc_read_dongle_id(i, info); - IRDA_MESSAGE("%s(), %s, Found dongle: %s\n", __FUNCTION__, driver_name, dongle_types[dongle_id]); + IRDA_MESSAGE("%s(), %s, Found dongle: %s\n", __FUNCTION__, + ALI_IRCC_DRIVER_NAME, dongle_types[dongle_id]); self->io.dongle_id = dongle_id; - - pmdev = pm_register(PM_SYS_DEV, PM_SYS_IRDA, ali_ircc_pmproc); - if (pmdev) - pmdev->data = self; IRDA_DEBUG(2, "%s(), ----------------- End -----------------\n", __FUNCTION__); @@ -548,12 +565,11 @@ static int ali_ircc_setup(chipio_t *info) /* Should be 0x00 in the M1535/M1535D */ if(version != 0x00) { - IRDA_ERROR("%s, Wrong chip version %02x\n", driver_name, version); + IRDA_ERROR("%s, Wrong chip version %02x\n", + ALI_IRCC_DRIVER_NAME, version); return -1; } - // IRDA_MESSAGE("%s, Found chip at base=0x%03x\n", driver_name, info->cfg_base); - /* Set FIR FIFO Threshold Register */ switch_bank(iobase, BANK1); outb(RX_FIFO_Threshold, iobase+FIR_FIFO_TR); @@ -583,7 +599,8 @@ static int ali_ircc_setup(chipio_t *info) /* Switch to SIR space */ FIR2SIR(iobase); - IRDA_MESSAGE("%s, driver loaded (Benjamin Kong)\n", driver_name); + IRDA_MESSAGE("%s, driver loaded (Benjamin Kong)\n", + ALI_IRCC_DRIVER_NAME); /* Enable receive interrupts */ // outb(UART_IER_RDI, iobase+UART_IER); //benjamin 2000/11/23 01:25PM @@ -647,7 +664,8 @@ static irqreturn_t ali_ircc_interrupt(int irq, void *dev_id, IRDA_DEBUG(2, "%s(), ---------------- Start ----------------\n", __FUNCTION__); if (!dev) { - IRDA_WARNING("%s: irq %d for unknown device.\n", driver_name, irq); + IRDA_WARNING("%s: irq %d for unknown device.\n", + ALI_IRCC_DRIVER_NAME, irq); return IRQ_NONE; } @@ -1328,7 +1346,8 @@ static int ali_ircc_net_open(struct net_device *dev) /* Request IRQ and install Interrupt Handler */ if (request_irq(self->io.irq, ali_ircc_interrupt, 0, dev->name, dev)) { - IRDA_WARNING("%s, unable to allocate irq=%d\n", driver_name, + IRDA_WARNING("%s, unable to allocate irq=%d\n", + ALI_IRCC_DRIVER_NAME, self->io.irq); return -EAGAIN; } @@ -1338,7 +1357,8 @@ static int ali_ircc_net_open(struct net_device *dev) * failure. */ if (request_dma(self->io.dma, dev->name)) { - IRDA_WARNING("%s, unable to allocate dma=%d\n", driver_name, + IRDA_WARNING("%s, unable to allocate dma=%d\n", + ALI_IRCC_DRIVER_NAME, self->io.dma); free_irq(self->io.irq, self); return -EAGAIN; @@ -2108,61 +2128,38 @@ static struct net_device_stats *ali_ircc_net_get_stats(struct net_device *dev) return &self->stats; } -static void ali_ircc_suspend(struct ali_ircc_cb *self) +static int ali_ircc_suspend(struct platform_device *dev, pm_message_t state) { - IRDA_DEBUG(2, "%s(), ---------------- Start ----------------\n", __FUNCTION__ ); + struct ali_ircc_cb *self = platform_get_drvdata(dev); - IRDA_MESSAGE("%s, Suspending\n", driver_name); + IRDA_MESSAGE("%s, Suspending\n", ALI_IRCC_DRIVER_NAME); if (self->io.suspended) - return; + return 0; ali_ircc_net_close(self->netdev); self->io.suspended = 1; - IRDA_DEBUG(2, "%s(), ----------------- End ------------------\n", __FUNCTION__ ); + return 0; } -static void ali_ircc_wakeup(struct ali_ircc_cb *self) +static int ali_ircc_resume(struct platform_device *dev) { - IRDA_DEBUG(2, "%s(), ---------------- Start ----------------\n", __FUNCTION__ ); + struct ali_ircc_cb *self = platform_get_drvdata(dev); if (!self->io.suspended) - return; + return 0; ali_ircc_net_open(self->netdev); - IRDA_MESSAGE("%s, Waking up\n", driver_name); + IRDA_MESSAGE("%s, Waking up\n", ALI_IRCC_DRIVER_NAME); self->io.suspended = 0; - - IRDA_DEBUG(2, "%s(), ----------------- End ------------------\n", __FUNCTION__ ); -} -static int ali_ircc_pmproc(struct pm_dev *dev, pm_request_t rqst, void *data) -{ - struct ali_ircc_cb *self = (struct ali_ircc_cb*) dev->data; - - IRDA_DEBUG(2, "%s(), ---------------- Start ----------------\n", __FUNCTION__ ); - - if (self) { - switch (rqst) { - case PM_SUSPEND: - ali_ircc_suspend(self); - break; - case PM_RESUME: - ali_ircc_wakeup(self); - break; - } - } - - IRDA_DEBUG(2, "%s(), ----------------- End ------------------\n", __FUNCTION__ ); - return 0; } - /* ALi Chip Function */ static void SetCOMInterrupts(struct ali_ircc_cb *self , unsigned char enable) diff --git a/drivers/net/irda/au1k_ir.c b/drivers/net/irda/au1k_ir.c index e6b198576..7b2b4135b 100644 --- a/drivers/net/irda/au1k_ir.c +++ b/drivers/net/irda/au1k_ir.c @@ -18,7 +18,6 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. */ -#include #include #include #include diff --git a/drivers/net/irda/donauboe.c b/drivers/net/irda/donauboe.c index 910c0cab3..33c07d527 100644 --- a/drivers/net/irda/donauboe.c +++ b/drivers/net/irda/donauboe.c @@ -1372,7 +1372,7 @@ toshoboe_net_open (struct net_device *dev) return 0; if (request_irq (self->io.irq, toshoboe_interrupt, - SA_SHIRQ | SA_INTERRUPT, dev->name, (void *) self)) + IRQF_SHARED | IRQF_DISABLED, dev->name, (void *) self)) { return -EAGAIN; } @@ -1573,7 +1573,7 @@ toshoboe_open (struct pci_dev *pci_dev, const struct pci_device_id *pdid) self->io.fir_base = self->base; self->io.fir_ext = OBOE_IO_EXTENT; self->io.irq = pci_dev->irq; - self->io.irqflags = SA_SHIRQ | SA_INTERRUPT; + self->io.irqflags = IRQF_SHARED | IRQF_DISABLED; self->speed = self->io.speed = 9600; self->async = 0; diff --git a/drivers/net/irda/irda-usb.c b/drivers/net/irda/irda-usb.c index cd87593e4..2a0d538b3 100644 --- a/drivers/net/irda/irda-usb.c +++ b/drivers/net/irda/irda-usb.c @@ -83,9 +83,9 @@ static struct usb_device_id dongles[] = { /* Extended Systems, Inc., XTNDAccess IrDA USB (ESI-9685) */ { USB_DEVICE(0x8e9, 0x100), .driver_info = IUC_SPEED_BUG | IUC_NO_WINDOW }, /* SigmaTel STIR4210/4220/4116 USB IrDA (VFIR) Bridge */ - { USB_DEVICE(0x66f, 0x4210), .driver_info = IUC_STIR_4210 | IUC_SPEED_BUG }, - { USB_DEVICE(0x66f, 0x4220), .driver_info = IUC_STIR_4210 | IUC_SPEED_BUG }, - { USB_DEVICE(0x66f, 0x4116), .driver_info = IUC_STIR_4210 | IUC_SPEED_BUG }, + { USB_DEVICE(0x66f, 0x4210), .driver_info = IUC_STIR421X | IUC_SPEED_BUG }, + { USB_DEVICE(0x66f, 0x4220), .driver_info = IUC_STIR421X | IUC_SPEED_BUG }, + { USB_DEVICE(0x66f, 0x4116), .driver_info = IUC_STIR421X | IUC_SPEED_BUG }, { .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS, .bInterfaceClass = USB_CLASS_APP_SPEC, @@ -154,7 +154,7 @@ static void irda_usb_build_header(struct irda_usb_cb *self, * and if either speed or xbofs (or both) needs * to be changed. */ - if (self->capability & IUC_STIR_4210 && + if (self->capability & IUC_STIR421X && ((self->new_speed != -1) || (self->new_xbofs != -1))) { /* With STIR421x, speed and xBOFs must be set at the same @@ -318,7 +318,7 @@ static void irda_usb_change_speed_xbofs(struct irda_usb_cb *self) /* Set the new speed and xbofs in this fake frame */ irda_usb_build_header(self, frame, 1); - if ( self->capability & IUC_STIR_4210 ) { + if (self->capability & IUC_STIR421X) { if (frame[0] == 0) return ; // do nothing if no change frame[1] = 0; // other parameters don't change here frame[2] = 0; @@ -455,7 +455,7 @@ static int irda_usb_hard_xmit(struct sk_buff *skb, struct net_device *netdev) /* Change setting for next frame */ - if ( self->capability & IUC_STIR_4210 ) { + if (self->capability & IUC_STIR421X) { __u8 turnaround_time; __u8* frame; turnaround_time = get_turnaround_time( skb ); @@ -897,10 +897,13 @@ static void irda_usb_receive(struct urb *urb, struct pt_regs *regs) docopy = (urb->actual_length < IRDA_RX_COPY_THRESHOLD); /* Allocate a new skb */ - if ( self->capability & IUC_STIR_4210 ) - newskb = dev_alloc_skb(docopy ? urb->actual_length : IRDA_SKB_MAX_MTU + USB_IRDA_SIGMATEL_HEADER); + if (self->capability & IUC_STIR421X) + newskb = dev_alloc_skb(docopy ? urb->actual_length : + IRDA_SKB_MAX_MTU + + USB_IRDA_STIR421X_HEADER); else - newskb = dev_alloc_skb(docopy ? urb->actual_length : IRDA_SKB_MAX_MTU); + newskb = dev_alloc_skb(docopy ? urb->actual_length : + IRDA_SKB_MAX_MTU); if (!newskb) { self->stats.rx_dropped++; @@ -1022,188 +1025,140 @@ static int irda_usb_is_receiving(struct irda_usb_cb *self) return 0; /* For now */ } - -#define STIR421X_PATCH_PRODUCT_VERSION_STR "Product Version: " -#define STIR421X_PATCH_COMPONENT_VERSION_STR "Component Version: " -#define STIR421X_PATCH_DATA_TAG_STR "STMP" -#define STIR421X_PATCH_FILE_VERSION_MAX_OFFSET 512 /* version info is before here */ -#define STIR421X_PATCH_FILE_IMAGE_MAX_OFFSET 512 /* patch image starts before here */ -#define STIR421X_PATCH_FILE_END_OF_HEADER_TAG 0x1A /* marks end of patch file header (PC DOS text file EOF character) */ +#define STIR421X_PATCH_PRODUCT_VER "Product Version: " +#define STIR421X_PATCH_STMP_TAG "STMP" +#define STIR421X_PATCH_CODE_OFFSET 512 /* patch image starts before here */ +/* marks end of patch file header (PC DOS text file EOF character) */ +#define STIR421X_PATCH_END_OF_HDR_TAG 0x1A +#define STIR421X_PATCH_BLOCK_SIZE 1023 /* - * Known firmware patches for STIR421x dongles + * Function stir421x_fwupload (struct irda_usb_cb *self, + * unsigned char *patch, + * const unsigned int patch_len) + * + * Upload firmware code to SigmaTel 421X IRDA-USB dongle */ -static char * stir421x_patches[] = { - "42101001.sb", - "42101002.sb", -}; - -static int stir421x_get_patch_version(unsigned char * patch, const unsigned long patch_len) +static int stir421x_fw_upload(struct irda_usb_cb *self, + unsigned char *patch, + const unsigned int patch_len) { - unsigned int version_offset; - unsigned long version_major, version_minor, version_build; - unsigned char * version_start; - int version_found = 0; - - for (version_offset = 0; - version_offset < STIR421X_PATCH_FILE_END_OF_HEADER_TAG; - version_offset++) { - if (!memcmp(patch + version_offset, - STIR421X_PATCH_PRODUCT_VERSION_STR, - sizeof(STIR421X_PATCH_PRODUCT_VERSION_STR) - 1)) { - version_found = 1; - version_start = patch + - version_offset + - sizeof(STIR421X_PATCH_PRODUCT_VERSION_STR) - 1; - break; - } + int ret = -ENOMEM; + int actual_len = 0; + unsigned int i; + unsigned int block_size = 0; + unsigned char *patch_block; + + patch_block = kzalloc(STIR421X_PATCH_BLOCK_SIZE, GFP_KERNEL); + if (patch_block == NULL) + return -ENOMEM; + + /* break up patch into 1023-byte sections */ + for (i = 0; i < patch_len; i += block_size) { + block_size = patch_len - i; + + if (block_size > STIR421X_PATCH_BLOCK_SIZE) + block_size = STIR421X_PATCH_BLOCK_SIZE; + + /* upload the patch section */ + memcpy(patch_block, patch + i, block_size); + + ret = usb_bulk_msg(self->usbdev, + usb_sndbulkpipe(self->usbdev, + self->bulk_out_ep), + patch_block, block_size, + &actual_len, msecs_to_jiffies(500)); + IRDA_DEBUG(3,"%s(): Bulk send %u bytes, ret=%d\n", + __FUNCTION__, actual_len, ret); + + if (ret < 0) + break; } - /* We couldn't find a product version on this patch */ - if (!version_found) - return -EINVAL; - - /* Let's check if the product version is dotted */ - if (version_start[3] != '.' || - version_start[7] != '.') - return -EINVAL; - - version_major = simple_strtoul(version_start, NULL, 10); - version_minor = simple_strtoul(version_start + 4, NULL, 10); - version_build = simple_strtoul(version_start + 8, NULL, 10); - - IRDA_DEBUG(2, "%s(), Major: %ld Minor: %ld Build: %ld\n", - __FUNCTION__, - version_major, version_minor, version_build); - - return (((version_major) << 12) + - ((version_minor) << 8) + - ((version_build / 10) << 4) + - (version_build % 10)); - -} - - -static int stir421x_upload_patch (struct irda_usb_cb *self, - unsigned char * patch, - const unsigned int patch_len) -{ - int retval = 0; - int actual_len; - unsigned int i = 0, download_amount = 0; - unsigned char * patch_chunk; - - IRDA_DEBUG (2, "%s(), Uploading STIR421x Patch\n", __FUNCTION__); - - patch_chunk = kzalloc(STIR421X_MAX_PATCH_DOWNLOAD_SIZE, GFP_KERNEL); - if (patch_chunk == NULL) - return -ENOMEM; - - /* break up patch into 1023-byte sections */ - for (i = 0; retval >= 0 && i < patch_len; i += download_amount) { - download_amount = patch_len - i; - if (download_amount > STIR421X_MAX_PATCH_DOWNLOAD_SIZE) - download_amount = STIR421X_MAX_PATCH_DOWNLOAD_SIZE; - - /* download the patch section */ - memcpy(patch_chunk, patch + i, download_amount); - - retval = usb_bulk_msg (self->usbdev, - usb_sndbulkpipe (self->usbdev, - self->bulk_out_ep), - patch_chunk, download_amount, - &actual_len, msecs_to_jiffies (500)); - IRDA_DEBUG (2, "%s(), Sent %u bytes\n", __FUNCTION__, - actual_len); - if (retval == 0) - mdelay(10); - } - - kfree(patch_chunk); - - if (i != patch_len) { - IRDA_ERROR ("%s(), Pushed %d bytes (!= patch_len (%d))\n", - __FUNCTION__, i, patch_len); - retval = -EIO; - } - - if (retval < 0) - /* todo - mark device as not ready */ - IRDA_ERROR ("%s(), STIR421x patch upload failed (%d)\n", - __FUNCTION__, retval); - - return retval; -} + kfree(patch_block); + return ret; + } +/* + * Function stir421x_patch_device(struct irda_usb_cb *self) + * + * Get a firmware code from userspase using hotplug request_firmware() call + */ static int stir421x_patch_device(struct irda_usb_cb *self) { - unsigned int i, patch_found = 0, data_found = 0, data_offset; - int patch_version, ret = 0; - const struct firmware *fw_entry; - - for (i = 0; i < ARRAY_SIZE(stir421x_patches); i++) { - if(request_firmware(&fw_entry, stir421x_patches[i], &self->usbdev->dev) != 0) { - IRDA_ERROR( "%s(), Patch %s is not available\n", __FUNCTION__, stir421x_patches[i]); - continue; - } - - /* We found a patch from userspace */ - patch_version = stir421x_get_patch_version (fw_entry->data, fw_entry->size); - - if (patch_version < 0) { - /* Couldn't fetch a version, let's move on to the next file */ - IRDA_ERROR("%s(), version parsing failed\n", __FUNCTION__); - ret = patch_version; - release_firmware(fw_entry); - continue; - } - - if (patch_version != self->usbdev->descriptor.bcdDevice) { - /* Patch version and device don't match */ - IRDA_ERROR ("%s(), wrong patch version (%d <-> %d)\n", - __FUNCTION__, - patch_version, self->usbdev->descriptor.bcdDevice); - ret = -EINVAL; - release_firmware(fw_entry); - continue; - } - - /* If we're here, we've found a correct patch */ - patch_found = 1; - break; - - } - - /* We couldn't find a valid firmware, let's leave */ - if (!patch_found) - return ret; - - /* The actual image starts after the "STMP" keyword */ - for (data_offset = 0; data_offset < STIR421X_PATCH_FILE_IMAGE_MAX_OFFSET; data_offset++) { - if (!memcmp(fw_entry->data + data_offset, - STIR421X_PATCH_DATA_TAG_STR, - sizeof(STIR421X_PATCH_FILE_IMAGE_MAX_OFFSET))) { - IRDA_DEBUG(2, "%s(), found patch data for STIR421x at offset %d\n", - __FUNCTION__, data_offset); - data_found = 1; - break; - } - } - - /* We couldn't find "STMP" from the header */ - if (!data_found) - return -EINVAL; - - /* Let's upload the patch to the target */ - ret = stir421x_upload_patch(self, - &fw_entry->data[data_offset + sizeof(STIR421X_PATCH_FILE_IMAGE_MAX_OFFSET)], - fw_entry->size - (data_offset + sizeof(STIR421X_PATCH_FILE_IMAGE_MAX_OFFSET))); - - release_firmware(fw_entry); - - return ret; - + unsigned int i; + int ret; + char stir421x_fw_name[11]; + const struct firmware *fw; + unsigned char *fw_version_ptr; /* pointer to version string */ + unsigned long fw_version = 0; + + /* + * Known firmware patch file names for STIR421x dongles + * are "42101001.sb" or "42101002.sb" + */ + sprintf(stir421x_fw_name, "4210%4X.sb", + self->usbdev->descriptor.bcdDevice); + ret = request_firmware(&fw, stir421x_fw_name, &self->usbdev->dev); + if (ret < 0) + return ret; + + /* We get a patch from userspace */ + IRDA_MESSAGE("%s(): Received firmware %s (%zu bytes)\n", + __FUNCTION__, stir421x_fw_name, fw->size); + + ret = -EINVAL; + + /* Get the bcd product version */ + if (!memcmp(fw->data, STIR421X_PATCH_PRODUCT_VER, + sizeof(STIR421X_PATCH_PRODUCT_VER) - 1)) { + fw_version_ptr = fw->data + + sizeof(STIR421X_PATCH_PRODUCT_VER) - 1; + + /* Let's check if the product version is dotted */ + if (fw_version_ptr[3] == '.' && + fw_version_ptr[7] == '.') { + unsigned long major, minor, build; + major = simple_strtoul(fw_version_ptr, NULL, 10); + minor = simple_strtoul(fw_version_ptr + 4, NULL, 10); + build = simple_strtoul(fw_version_ptr + 8, NULL, 10); + + fw_version = (major << 12) + + (minor << 8) + + ((build / 10) << 4) + + (build % 10); + + IRDA_DEBUG(3, "%s(): Firmware Product version %ld\n", + __FUNCTION__, fw_version); + } + } + + if (self->usbdev->descriptor.bcdDevice == fw_version) { + /* + * If we're here, we've found a correct patch + * The actual image starts after the "STMP" keyword + * so forward to the firmware header tag + */ + for (i = 0; (fw->data[i] != STIR421X_PATCH_END_OF_HDR_TAG) + && (i < fw->size); i++) ; + /* here we check for the out of buffer case */ + if ((STIR421X_PATCH_END_OF_HDR_TAG == fw->data[i]) + && (i < STIR421X_PATCH_CODE_OFFSET)) { + if (!memcmp(fw->data + i + 1, STIR421X_PATCH_STMP_TAG, + sizeof(STIR421X_PATCH_STMP_TAG) - 1)) { + + /* We can upload the patch to the target */ + i += sizeof(STIR421X_PATCH_STMP_TAG); + ret = stir421x_fw_upload(self, &fw->data[i], + fw->size - i); + } + } + } + + release_firmware(fw); + + return ret; } @@ -1702,12 +1657,12 @@ static int irda_usb_probe(struct usb_interface *intf, init_timer(&self->rx_defer_timer); self->capability = id->driver_info; - self->needspatch = ((self->capability & IUC_STIR_4210) != 0) ; + self->needspatch = ((self->capability & IUC_STIR421X) != 0); /* Create all of the needed urbs */ - if (self->capability & IUC_STIR_4210) { + if (self->capability & IUC_STIR421X) { self->max_rx_urb = IU_SIGMATEL_MAX_RX_URBS; - self->header_length = USB_IRDA_SIGMATEL_HEADER; + self->header_length = USB_IRDA_STIR421X_HEADER; } else { self->max_rx_urb = IU_MAX_RX_URBS; self->header_length = USB_IRDA_HEADER; @@ -1813,8 +1768,8 @@ static int irda_usb_probe(struct usb_interface *intf, /* Now we fetch and upload the firmware patch */ ret = stir421x_patch_device(self); self->needspatch = (ret < 0); - if (ret < 0) { - printk("patch_device failed\n"); + if (self->needspatch) { + IRDA_ERROR("STIR421X: Couldn't upload patch\n"); goto err_out_5; } diff --git a/drivers/net/irda/irda-usb.h b/drivers/net/irda/irda-usb.h index d833db52c..6b2271f18 100644 --- a/drivers/net/irda/irda-usb.h +++ b/drivers/net/irda/irda-usb.h @@ -34,9 +34,6 @@ #include #include /* struct irlap_cb */ -#define PATCH_FILE_SIZE_MAX 65536 -#define PATCH_FILE_SIZE_MIN 80 - #define RX_COPY_THRESHOLD 200 #define IRDA_USB_MAX_MTU 2051 #define IRDA_USB_SPEED_MTU 64 /* Weird, but work like this */ @@ -107,14 +104,15 @@ #define IUC_SMALL_PKT 0x10 /* Device doesn't behave with big Rx packets */ #define IUC_MAX_WINDOW 0x20 /* Device underestimate the Rx window */ #define IUC_MAX_XBOFS 0x40 /* Device need more xbofs than advertised */ -#define IUC_STIR_4210 0x80 /* SigmaTel 4210/4220/4116 VFIR */ +#define IUC_STIR421X 0x80 /* SigmaTel 4210/4220/4116 VFIR */ /* USB class definitions */ #define USB_IRDA_HEADER 0x01 #define USB_CLASS_IRDA 0x02 /* USB_CLASS_APP_SPEC subclass */ #define USB_DT_IRDA 0x21 -#define USB_IRDA_SIGMATEL_HEADER 0x03 -#define IU_SIGMATEL_MAX_RX_URBS (IU_MAX_ACTIVE_RX_URBS + USB_IRDA_SIGMATEL_HEADER) +#define USB_IRDA_STIR421X_HEADER 0x03 +#define IU_SIGMATEL_MAX_RX_URBS (IU_MAX_ACTIVE_RX_URBS + \ + USB_IRDA_STIR421X_HEADER) struct irda_class_desc { __u8 bLength; diff --git a/drivers/net/irda/irport.c b/drivers/net/irda/irport.c index 98fa5319e..44efd49bf 100644 --- a/drivers/net/irda/irport.c +++ b/drivers/net/irda/irport.c @@ -386,7 +386,7 @@ static int __irport_change_speed(struct irda_task *task) /* Locking notes : this function may be called from irq context with * spinlock, via irport_write_wakeup(), or from non-interrupt without * spinlock (from the task timer). Yuck ! - * This is ugly, and unsafe is the spinlock is not already aquired. + * This is ugly, and unsafe is the spinlock is not already acquired. * This will be fixed when irda-task get rewritten. * Jean II */ if (!spin_is_locked(&self->lock)) { diff --git a/drivers/net/irda/nsc-ircc.c b/drivers/net/irda/nsc-ircc.c index cc7ff8f00..cb62f2a96 100644 --- a/drivers/net/irda/nsc-ircc.c +++ b/drivers/net/irda/nsc-ircc.c @@ -115,8 +115,12 @@ static nsc_chip_t chips[] = { /* Contributed by Jan Frey - IBM A30/A31 */ { "PC8739x", { 0x2e, 0x4e, 0x0 }, 0x20, 0xea, 0xff, nsc_ircc_probe_39x, nsc_ircc_init_39x }, - { "IBM", { 0x2e, 0x4e, 0x0 }, 0x20, 0xf4, 0xff, - nsc_ircc_probe_39x, nsc_ircc_init_39x }, + /* IBM ThinkPads using PC8738x (T60/X60/Z60) */ + { "IBM-PC8738x", { 0x2e, 0x4e, 0x0 }, 0x20, 0xf4, 0xff, + nsc_ircc_probe_39x, nsc_ircc_init_39x }, + /* IBM ThinkPads using PC8394T (T43/R52/?) */ + { "IBM-PC8394T", { 0x2e, 0x4e, 0x0 }, 0x20, 0xf9, 0xff, + nsc_ircc_probe_39x, nsc_ircc_init_39x }, { NULL } }; diff --git a/drivers/net/irda/pxaficp_ir.c b/drivers/net/irda/pxaficp_ir.c index e1aa99105..afb19e8d9 100644 --- a/drivers/net/irda/pxaficp_ir.c +++ b/drivers/net/irda/pxaficp_ir.c @@ -12,7 +12,6 @@ * Infra-red driver (SIR/FIR) for the PXA2xx embedded microprocessor * */ -#include #include #include #include diff --git a/drivers/net/irda/sa1100_ir.c b/drivers/net/irda/sa1100_ir.c index f530686bd..8d5a288d7 100644 --- a/drivers/net/irda/sa1100_ir.c +++ b/drivers/net/irda/sa1100_ir.c @@ -18,7 +18,6 @@ * power_leve:level - set the transmitter power level * tx_lpm:0|1 - set transmit low power mode */ -#include #include #include #include diff --git a/drivers/net/irda/smsc-ircc2.c b/drivers/net/irda/smsc-ircc2.c index a4674044b..2eff45bed 100644 --- a/drivers/net/irda/smsc-ircc2.c +++ b/drivers/net/irda/smsc-ircc2.c @@ -2353,7 +2353,7 @@ static int __init smsc_superio_lpc(unsigned short cfg_base) #ifdef CONFIG_PCI #define PCIID_VENDOR_INTEL 0x8086 #define PCIID_VENDOR_ALI 0x10b9 -static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __devinitdata = { +static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __initdata = { { .vendor = PCIID_VENDOR_INTEL, /* Intel 82801DBM LPC bridge */ .device = 0x24cc, diff --git a/drivers/net/irda/stir4200.c b/drivers/net/irda/stir4200.c index 31867e4b8..d61b208b5 100644 --- a/drivers/net/irda/stir4200.c +++ b/drivers/net/irda/stir4200.c @@ -50,6 +50,7 @@ #include #include #include +#include #include #include #include @@ -173,9 +174,7 @@ struct stir_cb { struct qos_info qos; unsigned speed; /* Current speed */ - wait_queue_head_t thr_wait; /* transmit thread wakeup */ - struct completion thr_exited; - pid_t thr_pid; + struct task_struct *thread; /* transmit thread */ struct sk_buff *tx_pending; void *io_buf; /* transmit/receive buffer */ @@ -577,7 +576,7 @@ static int stir_hard_xmit(struct sk_buff *skb, struct net_device *netdev) SKB_LINEAR_ASSERT(skb); skb = xchg(&stir->tx_pending, skb); - wake_up(&stir->thr_wait); + wake_up_process(stir->thread); /* this should never happen unless stop/wakeup problem */ if (unlikely(skb)) { @@ -753,13 +752,7 @@ static int stir_transmit_thread(void *arg) struct net_device *dev = stir->netdev; struct sk_buff *skb; - daemonize("%s", dev->name); - allow_signal(SIGTERM); - - while (netif_running(dev) - && netif_device_present(dev) - && !signal_pending(current)) - { + while (!kthread_should_stop()) { #ifdef CONFIG_PM /* if suspending, then power off and wait */ if (unlikely(freezing(current))) { @@ -813,10 +806,11 @@ static int stir_transmit_thread(void *arg) } /* sleep if nothing to send */ - wait_event_interruptible(stir->thr_wait, stir->tx_pending); - } + set_current_state(TASK_INTERRUPTIBLE); + schedule(); - complete_and_exit (&stir->thr_exited, 0); + } + return 0; } @@ -859,7 +853,7 @@ static void stir_rcv_irq(struct urb *urb, struct pt_regs *regs) warn("%s: usb receive submit error: %d", stir->netdev->name, err); stir->receiving = 0; - wake_up(&stir->thr_wait); + wake_up_process(stir->thread); } } @@ -928,10 +922,10 @@ static int stir_net_open(struct net_device *netdev) } /** Start kernel thread for transmit. */ - stir->thr_pid = kernel_thread(stir_transmit_thread, stir, - CLONE_FS|CLONE_FILES); - if (stir->thr_pid < 0) { - err = stir->thr_pid; + stir->thread = kthread_run(stir_transmit_thread, stir, + "%s", stir->netdev->name); + if (IS_ERR(stir->thread)) { + err = PTR_ERR(stir->thread); err("stir4200: unable to start kernel thread"); goto err_out6; } @@ -968,8 +962,7 @@ static int stir_net_close(struct net_device *netdev) netif_stop_queue(netdev); /* Kill transmit thread */ - kill_proc(stir->thr_pid, SIGTERM, 1); - wait_for_completion(&stir->thr_exited); + kthread_stop(stir->thread); kfree(stir->fifo_status); /* Mop up receive urb's */ @@ -1084,9 +1077,6 @@ static int stir_probe(struct usb_interface *intf, stir->qos.min_turn_time.bits &= qos_mtt_bits; irda_qos_bits_to_value(&stir->qos); - init_completion (&stir->thr_exited); - init_waitqueue_head (&stir->thr_wait); - /* Override the network functions we need to use */ net->hard_start_xmit = stir_hard_xmit; net->open = stir_net_open; diff --git a/drivers/net/irda/vlsi_ir.c b/drivers/net/irda/vlsi_ir.c index d70b9e8d6..92d646cc9 100644 --- a/drivers/net/irda/vlsi_ir.c +++ b/drivers/net/irda/vlsi_ir.c @@ -21,7 +21,6 @@ * ********************************************************************/ -#include #include #define DRIVER_NAME "vlsi_ir" @@ -1518,7 +1517,7 @@ static int vlsi_open(struct net_device *ndev) outb(IRINTR_INT_MASK, ndev->base_addr+VLSI_PIO_IRINTR); - if (request_irq(ndev->irq, vlsi_interrupt, SA_SHIRQ, + if (request_irq(ndev->irq, vlsi_interrupt, IRQF_SHARED, drivername, ndev)) { IRDA_WARNING("%s: couldn't get IRQ: %d\n", __FUNCTION__, ndev->irq); diff --git a/drivers/net/irda/vlsi_ir.h b/drivers/net/irda/vlsi_ir.h index a82a4ba8d..c37f0bc4c 100644 --- a/drivers/net/irda/vlsi_ir.h +++ b/drivers/net/irda/vlsi_ir.h @@ -58,7 +58,7 @@ typedef void irqreturn_t; /* PDE() introduced in 2.5.4 */ #ifdef CONFIG_PROC_FS -#define PDE(inode) ((inode)->u.generic_ip) +#define PDE(inode) ((inode)->i_private) #endif /* irda crc16 calculation exported in 2.5.42 */ diff --git a/drivers/net/irda/w83977af_ir.c b/drivers/net/irda/w83977af_ir.c index 0ea65c4c6..b69776e00 100644 --- a/drivers/net/irda/w83977af_ir.c +++ b/drivers/net/irda/w83977af_ir.c @@ -40,7 +40,6 @@ ********************************************************************/ #include -#include #include #include #include diff --git a/drivers/net/iseries_veth.c b/drivers/net/iseries_veth.c index f0f04be98..cdc14401c 100644 --- a/drivers/net/iseries_veth.c +++ b/drivers/net/iseries_veth.c @@ -56,7 +56,6 @@ * number of packets outstanding to a remote partition at a time. */ -#include #include #include #include @@ -69,6 +68,7 @@ #include #include #include +#include #include #include @@ -1035,11 +1035,22 @@ static struct ethtool_ops ops = { .get_link = veth_get_link, }; -static struct net_device * __init veth_probe_one(int vlan, struct device *vdev) +static struct net_device * __init veth_probe_one(int vlan, + struct vio_dev *vio_dev) { struct net_device *dev; struct veth_port *port; + struct device *vdev = &vio_dev->dev; int i, rc; + const unsigned char *mac_addr; + + mac_addr = vio_get_attribute(vio_dev, "local-mac-address", NULL); + if (mac_addr == NULL) + mac_addr = vio_get_attribute(vio_dev, "mac-address", NULL); + if (mac_addr == NULL) { + veth_error("Unable to fetch MAC address from device tree.\n"); + return NULL; + } dev = alloc_etherdev(sizeof (struct veth_port)); if (! dev) { @@ -1064,16 +1075,11 @@ static struct net_device * __init veth_probe_one(int vlan, struct device *vdev) } port->dev = vdev; - dev->dev_addr[0] = 0x02; - dev->dev_addr[1] = 0x01; - dev->dev_addr[2] = 0xff; - dev->dev_addr[3] = vlan; - dev->dev_addr[4] = 0xff; - dev->dev_addr[5] = this_lp; + memcpy(dev->dev_addr, mac_addr, ETH_ALEN); dev->mtu = VETH_MAX_MTU; - memcpy(&port->mac_addr, dev->dev_addr, 6); + memcpy(&port->mac_addr, mac_addr, ETH_ALEN); dev->open = veth_open; dev->hard_start_xmit = veth_start_xmit; @@ -1608,7 +1614,7 @@ static int veth_probe(struct vio_dev *vdev, const struct vio_device_id *id) struct net_device *dev; struct veth_port *port; - dev = veth_probe_one(i, &vdev->dev); + dev = veth_probe_one(i, vdev); if (dev == NULL) { veth_remove(vdev); return 1; @@ -1641,7 +1647,7 @@ static int veth_probe(struct vio_dev *vdev, const struct vio_device_id *id) * support. */ static struct vio_device_id veth_device_table[] __devinitdata = { - { "vlan", "" }, + { "network", "IBM,iSeries-l-lan" }, { "", "" } }; MODULE_DEVICE_TABLE(vio, veth_device_table); diff --git a/drivers/net/ixgb/Makefile b/drivers/net/ixgb/Makefile index 7c7aff1ea..a8a2d3d03 100644 --- a/drivers/net/ixgb/Makefile +++ b/drivers/net/ixgb/Makefile @@ -1,7 +1,7 @@ ################################################################################ # # -# Copyright(c) 1999 - 2002 Intel Corporation. All rights reserved. +# Copyright(c) 1999 - 2006 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 diff --git a/drivers/net/ixgb/ixgb.h b/drivers/net/ixgb/ixgb.h index c83271b38..82b67af54 100644 --- a/drivers/net/ixgb/ixgb.h +++ b/drivers/net/ixgb/ixgb.h @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2006 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 @@ -30,7 +30,6 @@ #define _IXGB_H_ #include -#include #include #include #include @@ -84,7 +83,12 @@ struct ixgb_adapter; #define IXGB_DBG(args...) #endif -#define IXGB_ERR(args...) printk(KERN_ERR "ixgb: " args) +#define PFX "ixgb: " +#define DPRINTK(nlevel, klevel, fmt, args...) \ + (void)((NETIF_MSG_##nlevel & adapter->msg_enable) && \ + printk(KERN_##klevel PFX "%s: %s: " fmt, adapter->netdev->name, \ + __FUNCTION__ , ## args)) + /* TX/RX descriptor defines */ #define DEFAULT_TXD 256 @@ -175,6 +179,7 @@ struct ixgb_adapter { uint64_t hw_csum_tx_good; uint64_t hw_csum_tx_error; uint32_t tx_int_delay; + uint32_t tx_timeout_count; boolean_t tx_int_delay_enable; boolean_t detect_tx_hung; @@ -192,7 +197,9 @@ struct ixgb_adapter { /* structs defined in ixgb_hw.h */ struct ixgb_hw hw; + u16 msg_enable; struct ixgb_hw_stats stats; + uint32_t alloc_rx_buff_failed; #ifdef CONFIG_PCI_MSI boolean_t have_msi; #endif diff --git a/drivers/net/ixgb/ixgb_ee.c b/drivers/net/ixgb/ixgb_ee.c index 661a46b95..8357c5590 100644 --- a/drivers/net/ixgb/ixgb_ee.c +++ b/drivers/net/ixgb/ixgb_ee.c @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2006 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 diff --git a/drivers/net/ixgb/ixgb_ee.h b/drivers/net/ixgb/ixgb_ee.h index 5190aa876..bf6fa220f 100644 --- a/drivers/net/ixgb/ixgb_ee.h +++ b/drivers/net/ixgb/ixgb_ee.h @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2006 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 diff --git a/drivers/net/ixgb/ixgb_ethtool.c b/drivers/net/ixgb/ixgb_ethtool.c index d38ade5f2..cf19b898b 100644 --- a/drivers/net/ixgb/ixgb_ethtool.c +++ b/drivers/net/ixgb/ixgb_ethtool.c @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2006 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 @@ -44,6 +44,8 @@ extern void ixgb_free_rx_resources(struct ixgb_adapter *adapter); extern void ixgb_free_tx_resources(struct ixgb_adapter *adapter); extern void ixgb_update_stats(struct ixgb_adapter *adapter); +#define IXGB_ALL_RAR_ENTRIES 16 + struct ixgb_stats { char stat_string[ETH_GSTRING_LEN]; int sizeof_stat; @@ -76,6 +78,7 @@ static struct ixgb_stats ixgb_gstrings_stats[] = { {"tx_heartbeat_errors", IXGB_STAT(net_stats.tx_heartbeat_errors)}, {"tx_window_errors", IXGB_STAT(net_stats.tx_window_errors)}, {"tx_deferred_ok", IXGB_STAT(stats.dc)}, + {"tx_timeout_count", IXGB_STAT(tx_timeout_count) }, {"rx_long_length_errors", IXGB_STAT(stats.roc)}, {"rx_short_length_errors", IXGB_STAT(stats.ruc)}, #ifdef NETIF_F_TSO @@ -117,6 +120,16 @@ ixgb_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) return 0; } +static void ixgb_set_speed_duplex(struct net_device *netdev) +{ + struct ixgb_adapter *adapter = netdev_priv(netdev); + /* be optimistic about our link, since we were up before */ + adapter->link_speed = 10000; + adapter->link_duplex = FULL_DUPLEX; + netif_carrier_on(netdev); + netif_wake_queue(netdev); +} + static int ixgb_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) { @@ -130,12 +143,7 @@ ixgb_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) ixgb_down(adapter, TRUE); ixgb_reset(adapter); ixgb_up(adapter); - /* be optimistic about our link, since we were up before */ - adapter->link_speed = 10000; - adapter->link_duplex = FULL_DUPLEX; - netif_carrier_on(netdev); - netif_wake_queue(netdev); - + ixgb_set_speed_duplex(netdev); } else ixgb_reset(adapter); @@ -183,11 +191,7 @@ ixgb_set_pauseparam(struct net_device *netdev, if(netif_running(adapter->netdev)) { ixgb_down(adapter, TRUE); ixgb_up(adapter); - /* be optimistic about our link, since we were up before */ - adapter->link_speed = 10000; - adapter->link_duplex = FULL_DUPLEX; - netif_carrier_on(netdev); - netif_wake_queue(netdev); + ixgb_set_speed_duplex(netdev); } else ixgb_reset(adapter); @@ -212,11 +216,7 @@ ixgb_set_rx_csum(struct net_device *netdev, uint32_t data) if(netif_running(netdev)) { ixgb_down(adapter,TRUE); ixgb_up(adapter); - /* be optimistic about our link, since we were up before */ - adapter->link_speed = 10000; - adapter->link_duplex = FULL_DUPLEX; - netif_carrier_on(netdev); - netif_wake_queue(netdev); + ixgb_set_speed_duplex(netdev); } else ixgb_reset(adapter); return 0; @@ -251,6 +251,19 @@ ixgb_set_tso(struct net_device *netdev, uint32_t data) } #endif /* NETIF_F_TSO */ +static uint32_t +ixgb_get_msglevel(struct net_device *netdev) +{ + struct ixgb_adapter *adapter = netdev_priv(netdev); + return adapter->msg_enable; +} + +static void +ixgb_set_msglevel(struct net_device *netdev, uint32_t data) +{ + struct ixgb_adapter *adapter = netdev_priv(netdev); + adapter->msg_enable = data; +} #define IXGB_GET_STAT(_A_, _R_) _A_->stats._R_ static int @@ -303,7 +316,7 @@ ixgb_get_regs(struct net_device *netdev, *reg++ = IXGB_READ_REG(hw, RXCSUM); /* 20 */ /* there are 16 RAR entries in hardware, we only use 3 */ - for(i = 0; i < 16; i++) { + for(i = 0; i < IXGB_ALL_RAR_ENTRIES; i++) { *reg++ = IXGB_READ_REG_ARRAY(hw, RAL, (i << 1)); /*21,...,51 */ *reg++ = IXGB_READ_REG_ARRAY(hw, RAH, (i << 1)); /*22,...,52 */ } @@ -593,11 +606,7 @@ ixgb_set_ringparam(struct net_device *netdev, adapter->tx_ring = tx_new; if((err = ixgb_up(adapter))) return err; - /* be optimistic about our link, since we were up before */ - adapter->link_speed = 10000; - adapter->link_duplex = FULL_DUPLEX; - netif_carrier_on(netdev); - netif_wake_queue(netdev); + ixgb_set_speed_duplex(netdev); } return 0; @@ -714,6 +723,8 @@ static struct ethtool_ops ixgb_ethtool_ops = { .set_tx_csum = ixgb_set_tx_csum, .get_sg = ethtool_op_get_sg, .set_sg = ethtool_op_set_sg, + .get_msglevel = ixgb_get_msglevel, + .set_msglevel = ixgb_set_msglevel, #ifdef NETIF_F_TSO .get_tso = ethtool_op_get_tso, .set_tso = ixgb_set_tso, diff --git a/drivers/net/ixgb/ixgb_hw.c b/drivers/net/ixgb/ixgb_hw.c index 620cad48b..f7fa10e47 100644 --- a/drivers/net/ixgb/ixgb_hw.c +++ b/drivers/net/ixgb/ixgb_hw.c @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2006 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 diff --git a/drivers/net/ixgb/ixgb_hw.h b/drivers/net/ixgb/ixgb_hw.h index 382c6300c..cb4568915 100644 --- a/drivers/net/ixgb/ixgb_hw.h +++ b/drivers/net/ixgb/ixgb_hw.h @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -57,6 +57,7 @@ typedef enum { typedef enum { ixgb_media_type_unknown = 0, ixgb_media_type_fiber = 1, + ixgb_media_type_copper = 2, ixgb_num_media_types } ixgb_media_type; diff --git a/drivers/net/ixgb/ixgb_ids.h b/drivers/net/ixgb/ixgb_ids.h index aee207eaa..40a085f94 100644 --- a/drivers/net/ixgb/ixgb_ids.h +++ b/drivers/net/ixgb/ixgb_ids.h @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2006 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 @@ -43,6 +43,8 @@ #define IXGB_SUBDEVICE_ID_A11F 0xA11F #define IXGB_SUBDEVICE_ID_A01F 0xA01F -#endif /* #ifndef _IXGB_IDS_H_ */ +#define IXGB_DEVICE_ID_82597EX_CX4 0x109E +#define IXGB_SUBDEVICE_ID_A00C 0xA00C +#endif /* #ifndef _IXGB_IDS_H_ */ /* End of File */ diff --git a/drivers/net/ixgb/ixgb_main.c b/drivers/net/ixgb/ixgb_main.c index 83852450a..7bbd44728 100644 --- a/drivers/net/ixgb/ixgb_main.c +++ b/drivers/net/ixgb/ixgb_main.c @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2006 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 @@ -28,22 +28,6 @@ #include "ixgb.h" -/* Change Log - * 1.0.96 04/19/05 - * - Make needlessly global code static -- bunk@stusta.de - * - ethtool cleanup -- shemminger@osdl.org - * - Support for MODULE_VERSION -- linville@tuxdriver.com - * - add skb_header_cloned check to the tso path -- herbert@apana.org.au - * 1.0.88 01/05/05 - * - include fix to the condition that determines when to quit NAPI - Robert Olsson - * - use netif_poll_{disable/enable} to synchronize between NAPI and i/f up/down - * 1.0.84 10/26/04 - * - reset buffer_info->dma in Tx resource cleanup logic - * 1.0.83 10/12/04 - * - sparse cleanup - shemminger@osdl.org - * - fix tx resource cleanup logic - */ - char ixgb_driver_name[] = "ixgb"; static char ixgb_driver_string[] = "Intel(R) PRO/10GbE Network Driver"; @@ -52,9 +36,9 @@ static char ixgb_driver_string[] = "Intel(R) PRO/10GbE Network Driver"; #else #define DRIVERNAPI "-NAPI" #endif -#define DRV_VERSION "1.0.100-k2"DRIVERNAPI +#define DRV_VERSION "1.0.109-k2"DRIVERNAPI char ixgb_driver_version[] = DRV_VERSION; -static char ixgb_copyright[] = "Copyright (c) 1999-2005 Intel Corporation."; +static char ixgb_copyright[] = "Copyright (c) 1999-2006 Intel Corporation."; /* ixgb_pci_tbl - PCI Device ID Table * @@ -67,6 +51,8 @@ static char ixgb_copyright[] = "Copyright (c) 1999-2005 Intel Corporation."; static struct pci_device_id ixgb_pci_tbl[] = { {INTEL_VENDOR_ID, IXGB_DEVICE_ID_82597EX, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + {INTEL_VENDOR_ID, IXGB_DEVICE_ID_82597EX_CX4, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {INTEL_VENDOR_ID, IXGB_DEVICE_ID_82597EX_SR, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {INTEL_VENDOR_ID, IXGB_DEVICE_ID_82597EX_LR, @@ -148,6 +134,11 @@ MODULE_DESCRIPTION("Intel(R) PRO/10GbE Network Driver"); MODULE_LICENSE("GPL"); MODULE_VERSION(DRV_VERSION); +#define DEFAULT_DEBUG_LEVEL_SHIFT 3 +static int debug = DEFAULT_DEBUG_LEVEL_SHIFT; +module_param(debug, int, 0); +MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)"); + /* some defines for controlling descriptor fetches in h/w */ #define RXDCTL_WTHRESH_DEFAULT 16 /* chip writes back at this many or RXT0 */ #define RXDCTL_PTHRESH_DEFAULT 0 /* chip considers prefech below @@ -196,7 +187,7 @@ module_exit(ixgb_exit_module); * @adapter: board private structure **/ -static inline void +static void ixgb_irq_disable(struct ixgb_adapter *adapter) { atomic_inc(&adapter->irq_sem); @@ -210,7 +201,7 @@ ixgb_irq_disable(struct ixgb_adapter *adapter) * @adapter: board private structure **/ -static inline void +static void ixgb_irq_enable(struct ixgb_adapter *adapter) { if(atomic_dec_and_test(&adapter->irq_sem)) { @@ -231,6 +222,7 @@ ixgb_up(struct ixgb_adapter *adapter) /* hardware has been reset, we need to reload some things */ + ixgb_rar_set(hw, netdev->dev_addr, 0); ixgb_set_multi(netdev); ixgb_restore_vlan(adapter); @@ -240,6 +232,9 @@ ixgb_up(struct ixgb_adapter *adapter) ixgb_configure_rx(adapter); ixgb_alloc_rx_buffers(adapter); + /* disable interrupts and get the hardware into a known state */ + IXGB_WRITE_REG(&adapter->hw, IMC, 0xffffffff); + #ifdef CONFIG_PCI_MSI { boolean_t pcix = (IXGB_READ_REG(&adapter->hw, STATUS) & @@ -249,7 +244,7 @@ ixgb_up(struct ixgb_adapter *adapter) if (!pcix) adapter->have_msi = FALSE; else if((err = pci_enable_msi(adapter->pdev))) { - printk (KERN_ERR + DPRINTK(PROBE, ERR, "Unable to allocate MSI interrupt Error: %d\n", err); adapter->have_msi = FALSE; /* proceed to try to request regular interrupt */ @@ -258,12 +253,12 @@ ixgb_up(struct ixgb_adapter *adapter) #endif if((err = request_irq(adapter->pdev->irq, &ixgb_intr, - SA_SHIRQ | SA_SAMPLE_RANDOM, - netdev->name, netdev))) + IRQF_SHARED | IRQF_SAMPLE_RANDOM, + netdev->name, netdev))) { + DPRINTK(PROBE, ERR, + "Unable to allocate interrupt Error: %d\n", err); return err; - - /* disable interrupts and get the hardware into a known state */ - IXGB_WRITE_REG(&adapter->hw, IMC, 0xffffffff); + } if((hw->max_frame_size != max_frame) || (hw->max_frame_size != @@ -285,11 +280,12 @@ ixgb_up(struct ixgb_adapter *adapter) } mod_timer(&adapter->watchdog_timer, jiffies); - ixgb_irq_enable(adapter); #ifdef CONFIG_IXGB_NAPI netif_poll_enable(netdev); #endif + ixgb_irq_enable(adapter); + return 0; } @@ -326,7 +322,7 @@ ixgb_reset(struct ixgb_adapter *adapter) ixgb_adapter_stop(&adapter->hw); if(!ixgb_init_hw(&adapter->hw)) - IXGB_DBG("ixgb_init_hw failed.\n"); + DPRINTK(PROBE, ERR, "ixgb_init_hw failed.\n"); } /** @@ -363,7 +359,8 @@ ixgb_probe(struct pci_dev *pdev, } else { if((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK)) || (err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK))) { - IXGB_ERR("No usable DMA configuration, aborting\n"); + printk(KERN_ERR + "ixgb: No usable DMA configuration, aborting\n"); goto err_dma_mask; } pci_using_dac = 0; @@ -388,6 +385,7 @@ ixgb_probe(struct pci_dev *pdev, adapter->netdev = netdev; adapter->pdev = pdev; adapter->hw.back = adapter; + adapter->msg_enable = netif_msg_init(debug, DEFAULT_DEBUG_LEVEL_SHIFT); mmio_start = pci_resource_start(pdev, BAR_0); mmio_len = pci_resource_len(pdev, BAR_0); @@ -416,7 +414,7 @@ ixgb_probe(struct pci_dev *pdev, netdev->change_mtu = &ixgb_change_mtu; ixgb_set_ethtool_ops(netdev); netdev->tx_timeout = &ixgb_tx_timeout; - netdev->watchdog_timeo = HZ; + netdev->watchdog_timeo = 5 * HZ; #ifdef CONFIG_IXGB_NAPI netdev->poll = &ixgb_clean; netdev->weight = 64; @@ -428,6 +426,7 @@ ixgb_probe(struct pci_dev *pdev, netdev->poll_controller = ixgb_netpoll; #endif + strcpy(netdev->name, pci_name(pdev)); netdev->mem_start = mmio_start; netdev->mem_end = mmio_start + mmio_len; netdev->base_addr = adapter->hw.io_base; @@ -449,6 +448,9 @@ ixgb_probe(struct pci_dev *pdev, #ifdef NETIF_F_TSO netdev->features |= NETIF_F_TSO; #endif +#ifdef NETIF_F_LLTX + netdev->features |= NETIF_F_LLTX; +#endif if(pci_using_dac) netdev->features |= NETIF_F_HIGHDMA; @@ -456,7 +458,7 @@ ixgb_probe(struct pci_dev *pdev, /* make sure the EEPROM is good */ if(!ixgb_validate_eeprom_checksum(&adapter->hw)) { - printk(KERN_ERR "The EEPROM Checksum Is Not Valid\n"); + DPRINTK(PROBE, ERR, "The EEPROM Checksum Is Not Valid\n"); err = -EIO; goto err_eeprom; } @@ -465,6 +467,7 @@ ixgb_probe(struct pci_dev *pdev, memcpy(netdev->perm_addr, netdev->dev_addr, netdev->addr_len); if(!is_valid_ether_addr(netdev->perm_addr)) { + DPRINTK(PROBE, ERR, "Invalid MAC Address\n"); err = -EIO; goto err_eeprom; } @@ -478,6 +481,7 @@ ixgb_probe(struct pci_dev *pdev, INIT_WORK(&adapter->tx_timeout_task, (void (*)(void *))ixgb_tx_timeout_task, netdev); + strcpy(netdev->name, "eth%d"); if((err = register_netdev(netdev))) goto err_register; @@ -486,8 +490,7 @@ ixgb_probe(struct pci_dev *pdev, netif_carrier_off(netdev); netif_stop_queue(netdev); - printk(KERN_INFO "%s: Intel(R) PRO/10GbE Network Connection\n", - netdev->name); + DPRINTK(PROBE, INFO, "Intel(R) PRO/10GbE Network Connection\n"); ixgb_check_options(adapter); /* reset the hardware with the new settings */ @@ -557,17 +560,17 @@ ixgb_sw_init(struct ixgb_adapter *adapter) hw->subsystem_vendor_id = pdev->subsystem_vendor; hw->subsystem_id = pdev->subsystem_device; - adapter->rx_buffer_len = IXGB_RXBUFFER_2048; - hw->max_frame_size = netdev->mtu + ENET_HEADER_SIZE + ENET_FCS_LENGTH; + adapter->rx_buffer_len = hw->max_frame_size; if((hw->device_id == IXGB_DEVICE_ID_82597EX) - ||(hw->device_id == IXGB_DEVICE_ID_82597EX_LR) - ||(hw->device_id == IXGB_DEVICE_ID_82597EX_SR)) + || (hw->device_id == IXGB_DEVICE_ID_82597EX_CX4) + || (hw->device_id == IXGB_DEVICE_ID_82597EX_LR) + || (hw->device_id == IXGB_DEVICE_ID_82597EX_SR)) hw->mac_type = ixgb_82597; else { /* should never have loaded on this device */ - printk(KERN_ERR "ixgb: unsupported device id\n"); + DPRINTK(PROBE, ERR, "unsupported device id\n"); } /* enable flow control to be programmed */ @@ -665,6 +668,8 @@ ixgb_setup_tx_resources(struct ixgb_adapter *adapter) size = sizeof(struct ixgb_buffer) * txdr->count; txdr->buffer_info = vmalloc(size); if(!txdr->buffer_info) { + DPRINTK(PROBE, ERR, + "Unable to allocate transmit descriptor ring memory\n"); return -ENOMEM; } memset(txdr->buffer_info, 0, size); @@ -677,6 +682,8 @@ ixgb_setup_tx_resources(struct ixgb_adapter *adapter) txdr->desc = pci_alloc_consistent(pdev, txdr->size, &txdr->dma); if(!txdr->desc) { vfree(txdr->buffer_info); + DPRINTK(PROBE, ERR, + "Unable to allocate transmit descriptor memory\n"); return -ENOMEM; } memset(txdr->desc, 0, txdr->size); @@ -750,6 +757,8 @@ ixgb_setup_rx_resources(struct ixgb_adapter *adapter) size = sizeof(struct ixgb_buffer) * rxdr->count; rxdr->buffer_info = vmalloc(size); if(!rxdr->buffer_info) { + DPRINTK(PROBE, ERR, + "Unable to allocate receive descriptor ring\n"); return -ENOMEM; } memset(rxdr->buffer_info, 0, size); @@ -763,6 +772,8 @@ ixgb_setup_rx_resources(struct ixgb_adapter *adapter) if(!rxdr->desc) { vfree(rxdr->buffer_info); + DPRINTK(PROBE, ERR, + "Unable to allocate receive descriptors\n"); return -ENOMEM; } memset(rxdr->desc, 0, rxdr->size); @@ -794,21 +805,14 @@ ixgb_setup_rctl(struct ixgb_adapter *adapter) rctl |= IXGB_RCTL_SECRC; - switch (adapter->rx_buffer_len) { - case IXGB_RXBUFFER_2048: - default: + if (adapter->rx_buffer_len <= IXGB_RXBUFFER_2048) rctl |= IXGB_RCTL_BSIZE_2048; - break; - case IXGB_RXBUFFER_4096: + else if (adapter->rx_buffer_len <= IXGB_RXBUFFER_4096) rctl |= IXGB_RCTL_BSIZE_4096; - break; - case IXGB_RXBUFFER_8192: + else if (adapter->rx_buffer_len <= IXGB_RXBUFFER_8192) rctl |= IXGB_RCTL_BSIZE_8192; - break; - case IXGB_RXBUFFER_16384: + else if (adapter->rx_buffer_len <= IXGB_RXBUFFER_16384) rctl |= IXGB_RCTL_BSIZE_16384; - break; - } IXGB_WRITE_REG(&adapter->hw, RCTL, rctl); } @@ -898,22 +902,25 @@ ixgb_free_tx_resources(struct ixgb_adapter *adapter) adapter->tx_ring.desc = NULL; } -static inline void +static void ixgb_unmap_and_free_tx_resource(struct ixgb_adapter *adapter, struct ixgb_buffer *buffer_info) { struct pci_dev *pdev = adapter->pdev; - if(buffer_info->dma) { - pci_unmap_page(pdev, - buffer_info->dma, - buffer_info->length, - PCI_DMA_TODEVICE); - buffer_info->dma = 0; - } - if(buffer_info->skb) { + + if (buffer_info->dma) + pci_unmap_page(pdev, buffer_info->dma, buffer_info->length, + PCI_DMA_TODEVICE); + + if (buffer_info->skb) dev_kfree_skb_any(buffer_info->skb); - buffer_info->skb = NULL; - } + + buffer_info->skb = NULL; + buffer_info->dma = 0; + buffer_info->time_stamp = 0; + /* these fields must always be initialized in tx + * buffer_info->length = 0; + * buffer_info->next_to_watch = 0; */ } /** @@ -1112,8 +1119,8 @@ ixgb_watchdog(unsigned long data) if(adapter->hw.link_up) { if(!netif_carrier_ok(netdev)) { - printk(KERN_INFO "ixgb: %s NIC Link is Up %d Mbps %s\n", - netdev->name, 10000, "Full Duplex"); + DPRINTK(LINK, INFO, + "NIC Link is Up 10000 Mbps Full Duplex\n"); adapter->link_speed = 10000; adapter->link_duplex = FULL_DUPLEX; netif_carrier_on(netdev); @@ -1123,9 +1130,7 @@ ixgb_watchdog(unsigned long data) if(netif_carrier_ok(netdev)) { adapter->link_speed = 0; adapter->link_duplex = 0; - printk(KERN_INFO - "ixgb: %s NIC Link is Down\n", - netdev->name); + DPRINTK(LINK, INFO, "NIC Link is Down\n"); netif_carrier_off(netdev); netif_stop_queue(netdev); @@ -1158,7 +1163,7 @@ ixgb_watchdog(unsigned long data) #define IXGB_TX_FLAGS_VLAN 0x00000002 #define IXGB_TX_FLAGS_TSO 0x00000004 -static inline int +static int ixgb_tso(struct ixgb_adapter *adapter, struct sk_buff *skb) { #ifdef NETIF_F_TSO @@ -1220,7 +1225,7 @@ ixgb_tso(struct ixgb_adapter *adapter, struct sk_buff *skb) return 0; } -static inline boolean_t +static boolean_t ixgb_tx_csum(struct ixgb_adapter *adapter, struct sk_buff *skb) { struct ixgb_context_desc *context_desc; @@ -1258,7 +1263,7 @@ ixgb_tx_csum(struct ixgb_adapter *adapter, struct sk_buff *skb) #define IXGB_MAX_TXD_PWR 14 #define IXGB_MAX_DATA_PER_TXD (1<buffer_info[i]; - size = min(len, IXGB_MAX_JUMBO_FRAME_SIZE); + size = min(len, IXGB_MAX_DATA_PER_TXD); buffer_info->length = size; buffer_info->dma = pci_map_single(adapter->pdev, @@ -1284,6 +1289,7 @@ ixgb_tx_map(struct ixgb_adapter *adapter, struct sk_buff *skb, size, PCI_DMA_TODEVICE); buffer_info->time_stamp = jiffies; + buffer_info->next_to_watch = 0; len -= size; offset += size; @@ -1300,7 +1306,7 @@ ixgb_tx_map(struct ixgb_adapter *adapter, struct sk_buff *skb, while(len) { buffer_info = &tx_ring->buffer_info[i]; - size = min(len, IXGB_MAX_JUMBO_FRAME_SIZE); + size = min(len, IXGB_MAX_DATA_PER_TXD); buffer_info->length = size; buffer_info->dma = pci_map_page(adapter->pdev, @@ -1309,6 +1315,7 @@ ixgb_tx_map(struct ixgb_adapter *adapter, struct sk_buff *skb, size, PCI_DMA_TODEVICE); buffer_info->time_stamp = jiffies; + buffer_info->next_to_watch = 0; len -= size; offset += size; @@ -1323,7 +1330,7 @@ ixgb_tx_map(struct ixgb_adapter *adapter, struct sk_buff *skb, return count; } -static inline void +static void ixgb_tx_queue(struct ixgb_adapter *adapter, int count, int vlan_id,int tx_flags) { struct ixgb_desc_ring *tx_ring = &adapter->tx_ring; @@ -1395,13 +1402,26 @@ ixgb_xmit_frame(struct sk_buff *skb, struct net_device *netdev) return 0; } +#ifdef NETIF_F_LLTX + local_irq_save(flags); + if (!spin_trylock(&adapter->tx_lock)) { + /* Collision - tell upper layer to requeue */ + local_irq_restore(flags); + return NETDEV_TX_LOCKED; + } +#else spin_lock_irqsave(&adapter->tx_lock, flags); +#endif + if(unlikely(IXGB_DESC_UNUSED(&adapter->tx_ring) < DESC_NEEDED)) { netif_stop_queue(netdev); spin_unlock_irqrestore(&adapter->tx_lock, flags); - return 1; + return NETDEV_TX_BUSY; } + +#ifndef NETIF_F_LLTX spin_unlock_irqrestore(&adapter->tx_lock, flags); +#endif if(adapter->vlgrp && vlan_tx_tag_present(skb)) { tx_flags |= IXGB_TX_FLAGS_VLAN; @@ -1413,10 +1433,13 @@ ixgb_xmit_frame(struct sk_buff *skb, struct net_device *netdev) tso = ixgb_tso(adapter, skb); if (tso < 0) { dev_kfree_skb_any(skb); +#ifdef NETIF_F_LLTX + spin_unlock_irqrestore(&adapter->tx_lock, flags); +#endif return NETDEV_TX_OK; } - if (tso) + if (likely(tso)) tx_flags |= IXGB_TX_FLAGS_TSO; else if(ixgb_tx_csum(adapter, skb)) tx_flags |= IXGB_TX_FLAGS_CSUM; @@ -1426,7 +1449,15 @@ ixgb_xmit_frame(struct sk_buff *skb, struct net_device *netdev) netdev->trans_start = jiffies; - return 0; +#ifdef NETIF_F_LLTX + /* Make sure there is space in the ring for the next send. */ + if(unlikely(IXGB_DESC_UNUSED(&adapter->tx_ring) < DESC_NEEDED)) + netif_stop_queue(netdev); + + spin_unlock_irqrestore(&adapter->tx_lock, flags); + +#endif + return NETDEV_TX_OK; } /** @@ -1448,6 +1479,7 @@ ixgb_tx_timeout_task(struct net_device *netdev) { struct ixgb_adapter *adapter = netdev_priv(netdev); + adapter->tx_timeout_count++; ixgb_down(adapter, TRUE); ixgb_up(adapter); } @@ -1486,28 +1518,15 @@ ixgb_change_mtu(struct net_device *netdev, int new_mtu) if((max_frame < IXGB_MIN_ENET_FRAME_SIZE_WITHOUT_FCS + ENET_FCS_LENGTH) || (max_frame > IXGB_MAX_JUMBO_FRAME_SIZE + ENET_FCS_LENGTH)) { - IXGB_ERR("Invalid MTU setting\n"); + DPRINTK(PROBE, ERR, "Invalid MTU setting %d\n", new_mtu); return -EINVAL; } - if((max_frame <= IXGB_MAX_ENET_FRAME_SIZE_WITHOUT_FCS + ENET_FCS_LENGTH) - || (max_frame <= IXGB_RXBUFFER_2048)) { - adapter->rx_buffer_len = IXGB_RXBUFFER_2048; - - } else if(max_frame <= IXGB_RXBUFFER_4096) { - adapter->rx_buffer_len = IXGB_RXBUFFER_4096; - - } else if(max_frame <= IXGB_RXBUFFER_8192) { - adapter->rx_buffer_len = IXGB_RXBUFFER_8192; - - } else { - adapter->rx_buffer_len = IXGB_RXBUFFER_16384; - } + adapter->rx_buffer_len = max_frame; netdev->mtu = new_mtu; - if(old_max_frame != max_frame && netif_running(netdev)) { - + if ((old_max_frame != max_frame) && netif_running(netdev)) { ixgb_down(adapter, TRUE); ixgb_up(adapter); } @@ -1765,23 +1784,43 @@ ixgb_clean_tx_irq(struct ixgb_adapter *adapter) tx_ring->next_to_clean = i; - spin_lock(&adapter->tx_lock); - if(cleaned && netif_queue_stopped(netdev) && netif_carrier_ok(netdev) && - (IXGB_DESC_UNUSED(tx_ring) > IXGB_TX_QUEUE_WAKE)) { - - netif_wake_queue(netdev); + if (unlikely(netif_queue_stopped(netdev))) { + spin_lock(&adapter->tx_lock); + if (netif_queue_stopped(netdev) && netif_carrier_ok(netdev) && + (IXGB_DESC_UNUSED(tx_ring) > IXGB_TX_QUEUE_WAKE)) + netif_wake_queue(netdev); + spin_unlock(&adapter->tx_lock); } - spin_unlock(&adapter->tx_lock); if(adapter->detect_tx_hung) { /* detect a transmit hang in hardware, this serializes the * check with the clearing of time_stamp and movement of i */ adapter->detect_tx_hung = FALSE; - if(tx_ring->buffer_info[i].dma && - time_after(jiffies, tx_ring->buffer_info[i].time_stamp + HZ) + if (tx_ring->buffer_info[eop].dma && + time_after(jiffies, tx_ring->buffer_info[eop].time_stamp + HZ) && !(IXGB_READ_REG(&adapter->hw, STATUS) & - IXGB_STATUS_TXOFF)) + IXGB_STATUS_TXOFF)) { + /* detected Tx unit hang */ + DPRINTK(DRV, ERR, "Detected Tx Unit Hang\n" + " TDH <%x>\n" + " TDT <%x>\n" + " next_to_use <%x>\n" + " next_to_clean <%x>\n" + "buffer_info[next_to_clean]\n" + " time_stamp <%lx>\n" + " next_to_watch <%x>\n" + " jiffies <%lx>\n" + " next_to_watch.status <%x>\n", + IXGB_READ_REG(&adapter->hw, TDH), + IXGB_READ_REG(&adapter->hw, TDT), + tx_ring->next_to_use, + tx_ring->next_to_clean, + tx_ring->buffer_info[eop].time_stamp, + eop, + jiffies, + eop_desc->status); netif_stop_queue(netdev); + } } return cleaned; @@ -1794,7 +1833,7 @@ ixgb_clean_tx_irq(struct ixgb_adapter *adapter) * @sk_buff: socket buffer with received data **/ -static inline void +static void ixgb_rx_checksum(struct ixgb_adapter *adapter, struct ixgb_rx_desc *rx_desc, struct sk_buff *skb) @@ -1858,6 +1897,7 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter) #endif status = rx_desc->status; skb = buffer_info->skb; + buffer_info->skb = NULL; prefetch(skb->data); @@ -1902,6 +1942,26 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter) goto rxdesc_done; } + /* code added for copybreak, this should improve + * performance for small packets with large amounts + * of reassembly being done in the stack */ +#define IXGB_CB_LENGTH 256 + if (length < IXGB_CB_LENGTH) { + struct sk_buff *new_skb = + dev_alloc_skb(length + NET_IP_ALIGN); + if (new_skb) { + skb_reserve(new_skb, NET_IP_ALIGN); + new_skb->dev = netdev; + memcpy(new_skb->data - NET_IP_ALIGN, + skb->data - NET_IP_ALIGN, + length + NET_IP_ALIGN); + /* save the skb in buffer_info as good */ + buffer_info->skb = skb; + skb = new_skb; + } + } + /* end copybreak code */ + /* Good Receive */ skb_put(skb, length); @@ -1931,7 +1991,6 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter) rxdesc_done: /* clean up descriptor, might be written over by hw */ rx_desc->status = 0; - buffer_info->skb = NULL; /* use prefetched values */ rx_desc = next_rxd; @@ -1971,12 +2030,18 @@ ixgb_alloc_rx_buffers(struct ixgb_adapter *adapter) /* leave three descriptors unused */ while(--cleancount > 2) { - rx_desc = IXGB_RX_DESC(*rx_ring, i); - - skb = dev_alloc_skb(adapter->rx_buffer_len + NET_IP_ALIGN); + /* recycle! its good for you */ + if (!(skb = buffer_info->skb)) + skb = dev_alloc_skb(adapter->rx_buffer_len + + NET_IP_ALIGN); + else { + skb_trim(skb, 0); + goto map_skb; + } - if(unlikely(!skb)) { + if (unlikely(!skb)) { /* Better luck next round */ + adapter->alloc_rx_buff_failed++; break; } @@ -1990,33 +2055,36 @@ ixgb_alloc_rx_buffers(struct ixgb_adapter *adapter) buffer_info->skb = skb; buffer_info->length = adapter->rx_buffer_len; - buffer_info->dma = - pci_map_single(pdev, - skb->data, - adapter->rx_buffer_len, - PCI_DMA_FROMDEVICE); +map_skb: + buffer_info->dma = pci_map_single(pdev, + skb->data, + adapter->rx_buffer_len, + PCI_DMA_FROMDEVICE); + rx_desc = IXGB_RX_DESC(*rx_ring, i); rx_desc->buff_addr = cpu_to_le64(buffer_info->dma); /* guarantee DD bit not set now before h/w gets descriptor * this is the rest of the workaround for h/w double * writeback. */ rx_desc->status = 0; - if((i & ~(num_group_tail_writes- 1)) == i) { - /* Force memory writes to complete before letting h/w - * know there are new descriptors to fetch. (Only - * applicable for weak-ordered memory model archs, - * such as IA-64). */ - wmb(); - - IXGB_WRITE_REG(&adapter->hw, RDT, i); - } if(++i == rx_ring->count) i = 0; buffer_info = &rx_ring->buffer_info[i]; } - rx_ring->next_to_use = i; + if (likely(rx_ring->next_to_use != i)) { + rx_ring->next_to_use = i; + if (unlikely(i-- == 0)) + i = (rx_ring->count - 1); + + /* Force memory writes to complete before letting h/w + * know there are new descriptors to fetch. (Only + * applicable for weak-ordered memory model archs, such + * as IA-64). */ + wmb(); + IXGB_WRITE_REG(&adapter->hw, RDT, i); + } } /** diff --git a/drivers/net/ixgb/ixgb_osdep.h b/drivers/net/ixgb/ixgb_osdep.h index dba20481e..ee982feac 100644 --- a/drivers/net/ixgb/ixgb_osdep.h +++ b/drivers/net/ixgb/ixgb_osdep.h @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2006 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 diff --git a/drivers/net/ixgb/ixgb_param.c b/drivers/net/ixgb/ixgb_param.c index 8a83dfdf7..39fbed29a 100644 --- a/drivers/net/ixgb/ixgb_param.c +++ b/drivers/net/ixgb/ixgb_param.c @@ -1,7 +1,7 @@ /******************************************************************************* - Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. + Copyright(c) 1999 - 2006 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 @@ -76,7 +76,7 @@ IXGB_PARAM(RxDescriptors, "Number of receive descriptors"); * - 2 - Tx only, generate PAUSE frames but ignore them on receive * - 3 - Full Flow Control Support * - * Default Value: Read flow control settings from the EEPROM + * Default Value: 2 - Tx only (silicon bug avoidance) */ IXGB_PARAM(FlowControl, "Flow Control setting"); @@ -137,7 +137,7 @@ IXGB_PARAM(RxFCLowThresh, "Receive Flow Control Low Threshold"); * * Valid Range: 1 - 65535 * - * Default Value: 256 (0x100) + * Default Value: 65535 (0xffff) (we'll send an xon if we recover) */ IXGB_PARAM(FCReqTimeout, "Flow Control Request Timeout"); @@ -165,8 +165,6 @@ IXGB_PARAM(IntDelayEnable, "Transmit Interrupt Delay Enable"); #define XSUMRX_DEFAULT OPTION_ENABLED -#define FLOW_CONTROL_FULL ixgb_fc_full -#define FLOW_CONTROL_DEFAULT FLOW_CONTROL_FULL #define DEFAULT_FCRTL 0x28000 #define DEFAULT_FCRTH 0x30000 #define MIN_FCRTL 0 @@ -174,9 +172,9 @@ IXGB_PARAM(IntDelayEnable, "Transmit Interrupt Delay Enable"); #define MIN_FCRTH 8 #define MAX_FCRTH 0x3FFF0 -#define DEFAULT_FCPAUSE 0x100 /* this may be too long */ #define MIN_FCPAUSE 1 #define MAX_FCPAUSE 0xffff +#define DEFAULT_FCPAUSE 0xFFFF /* this may be too long */ struct ixgb_option { enum { enable_option, range_option, list_option } type; @@ -336,7 +334,7 @@ ixgb_check_options(struct ixgb_adapter *adapter) .type = list_option, .name = "Flow Control", .err = "reading default settings from EEPROM", - .def = ixgb_fc_full, + .def = ixgb_fc_tx_pause, .arg = { .l = { .nr = LIST_LEN(fc_list), .p = fc_list }} }; @@ -365,8 +363,8 @@ ixgb_check_options(struct ixgb_adapter *adapter) } else { adapter->hw.fc.high_water = opt.def; } - if(!(adapter->hw.fc.type & ixgb_fc_rx_pause) ) - printk (KERN_INFO + if (!(adapter->hw.fc.type & ixgb_fc_tx_pause) ) + printk (KERN_INFO "Ignoring RxFCHighThresh when no RxFC\n"); } { /* Receive Flow Control Low Threshold */ @@ -385,8 +383,8 @@ ixgb_check_options(struct ixgb_adapter *adapter) } else { adapter->hw.fc.low_water = opt.def; } - if(!(adapter->hw.fc.type & ixgb_fc_rx_pause) ) - printk (KERN_INFO + if (!(adapter->hw.fc.type & ixgb_fc_tx_pause) ) + printk (KERN_INFO "Ignoring RxFCLowThresh when no RxFC\n"); } { /* Flow Control Pause Time Request*/ @@ -406,12 +404,12 @@ ixgb_check_options(struct ixgb_adapter *adapter) } else { adapter->hw.fc.pause_time = opt.def; } - if(!(adapter->hw.fc.type & ixgb_fc_rx_pause) ) - printk (KERN_INFO + if (!(adapter->hw.fc.type & ixgb_fc_tx_pause) ) + printk (KERN_INFO "Ignoring FCReqTimeout when no RxFC\n"); } /* high low and spacing check for rx flow control thresholds */ - if (adapter->hw.fc.type & ixgb_fc_rx_pause) { + if (adapter->hw.fc.type & ixgb_fc_tx_pause) { /* high must be greater than low */ if (adapter->hw.fc.high_water < (adapter->hw.fc.low_water + 8)) { /* set defaults */ diff --git a/drivers/net/ixp2000/caleb.c b/drivers/net/ixp2000/caleb.c index 3595e107d..7dea5b950 100644 --- a/drivers/net/ixp2000/caleb.c +++ b/drivers/net/ixp2000/caleb.c @@ -9,7 +9,6 @@ * (at your option) any later version. */ -#include #include #include #include diff --git a/drivers/net/ixp2000/enp2611.c b/drivers/net/ixp2000/enp2611.c index b67f586d7..d3f4235c5 100644 --- a/drivers/net/ixp2000/enp2611.c +++ b/drivers/net/ixp2000/enp2611.c @@ -9,7 +9,6 @@ * (at your option) any later version. */ -#include #include #include #include diff --git a/drivers/net/ixp2000/ixp2400-msf.c b/drivers/net/ixp2000/ixp2400-msf.c index 48a3a891d..9ec38eebf 100644 --- a/drivers/net/ixp2000/ixp2400-msf.c +++ b/drivers/net/ixp2000/ixp2400-msf.c @@ -11,7 +11,6 @@ * License, or (at your option) any later version. */ -#include #include #include #include diff --git a/drivers/net/ixp2000/ixpdev.c b/drivers/net/ixp2000/ixpdev.c index fbc2d2102..6eeb965b4 100644 --- a/drivers/net/ixp2000/ixpdev.c +++ b/drivers/net/ixp2000/ixpdev.c @@ -9,7 +9,6 @@ * (at your option) any later version. */ -#include #include #include #include @@ -236,7 +235,7 @@ static int ixpdev_open(struct net_device *dev) if (!nds_open++) { err = request_irq(IRQ_IXP2000_THDA0, ixpdev_interrupt, - SA_SHIRQ, "ixp2000_eth", nds); + IRQF_SHARED, "ixp2000_eth", nds); if (err) { nds_open--; return err; diff --git a/drivers/net/ixp2000/pm3386.c b/drivers/net/ixp2000/pm3386.c index 5224651c9..e08d3f986 100644 --- a/drivers/net/ixp2000/pm3386.c +++ b/drivers/net/ixp2000/pm3386.c @@ -9,7 +9,6 @@ * (at your option) any later version. */ -#include #include #include #include diff --git a/drivers/net/jazzsonic.c b/drivers/net/jazzsonic.c index 272d331d2..661d75b4c 100644 --- a/drivers/net/jazzsonic.c +++ b/drivers/net/jazzsonic.c @@ -260,7 +260,7 @@ MODULE_DESCRIPTION("Jazz SONIC ethernet driver"); module_param(sonic_debug, int, 0); MODULE_PARM_DESC(sonic_debug, "jazzsonic debug level (1-4)"); -#define SONIC_IRQ_FLAG SA_INTERRUPT +#define SONIC_IRQ_FLAG IRQF_DISABLED #include "sonic.c" diff --git a/drivers/net/lance.c b/drivers/net/lance.c index bb5ad4792..5b4dbfe5f 100644 --- a/drivers/net/lance.c +++ b/drivers/net/lance.c @@ -326,7 +326,7 @@ MODULE_PARM_DESC(dma, "LANCE/PCnet ISA DMA channel (ignored for some devices)"); MODULE_PARM_DESC(irq, "LANCE/PCnet IRQ number (ignored for some devices)"); MODULE_PARM_DESC(lance_debug, "LANCE/PCnet debug level (0-7)"); -int init_module(void) +int __init init_module(void) { struct net_device *dev; int this_dev, found = 0; @@ -968,8 +968,7 @@ static int lance_start_xmit(struct sk_buff *skb, struct net_device *dev) /* The old LANCE chips doesn't automatically pad buffers to min. size. */ if (chip_table[lp->chip_version].flags & LANCE_MUST_PAD) { if (skb->len < ETH_ZLEN) { - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) + if (skb_padto(skb, ETH_ZLEN)) goto out; lp->tx_ring[entry].length = -ETH_ZLEN; } diff --git a/drivers/net/lasi_82596.c b/drivers/net/lasi_82596.c index 957888de3..1ab09447b 100644 --- a/drivers/net/lasi_82596.c +++ b/drivers/net/lasi_82596.c @@ -1083,8 +1083,7 @@ static int i596_start_xmit(struct sk_buff *skb, struct net_device *dev) skb->len, skb->data)); if (length < ETH_ZLEN) { - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) + if (skb_padto(skb, ETH_ZLEN)) return 0; length = ETH_ZLEN; } diff --git a/drivers/net/lne390.c b/drivers/net/lne390.c index 646e89fc3..c0ec7f6ab 100644 --- a/drivers/net/lne390.c +++ b/drivers/net/lne390.c @@ -406,7 +406,7 @@ MODULE_PARM_DESC(mem, "memory base address(es)"); MODULE_DESCRIPTION("Mylex LNE390A/B EISA Ethernet driver"); MODULE_LICENSE("GPL"); -int init_module(void) +int __init init_module(void) { struct net_device *dev; int this_dev, found = 0; diff --git a/drivers/net/lp486e.c b/drivers/net/lp486e.c index 94d5ea1ce..393aba95c 100644 --- a/drivers/net/lp486e.c +++ b/drivers/net/lp486e.c @@ -442,16 +442,16 @@ init_rx_bufs(struct net_device *dev, int num) { if (rbd) { rbd->pad = 0; rbd->count = 0; - rbd->skb = dev_alloc_skb(RX_SKB_SIZE); + rbd->skb = dev_alloc_skb(RX_SKBSIZE); if (!rbd->skb) { printk("dev_alloc_skb failed"); } rbd->next = rfd->rbd; if (i) { rfd->rbd->prev = rbd; - rbd->size = RX_SKB_SIZE; + rbd->size = RX_SKBSIZE; } else { - rbd->size = (RX_SKB_SIZE | RBD_EL); + rbd->size = (RX_SKBSIZE | RBD_EL); lp->rbd_tail = rbd; } @@ -851,7 +851,7 @@ static int i596_open(struct net_device *dev) { int i; - i = request_irq(dev->irq, &i596_interrupt, SA_SHIRQ, dev->name, dev); + i = request_irq(dev->irq, &i596_interrupt, IRQF_SHARED, dev->name, dev); if (i) { printk(KERN_ERR "%s: IRQ %d not free\n", dev->name, dev->irq); return i; @@ -877,8 +877,7 @@ static int i596_start_xmit (struct sk_buff *skb, struct net_device *dev) { length = skb->len; if (length < ETH_ZLEN) { - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) + if (skb_padto(skb, ETH_ZLEN)) return 0; length = ETH_ZLEN; } diff --git a/drivers/net/mace.c b/drivers/net/mace.c index 77792b286..29e4b5aa6 100644 --- a/drivers/net/mace.c +++ b/drivers/net/mace.c @@ -5,7 +5,6 @@ * Copyright (C) 1996 Paul Mackerras. */ -#include #include #include #include @@ -243,12 +242,12 @@ static int __devinit mace_probe(struct macio_dev *mdev, const struct of_device_i } rc = request_irq(mp->tx_dma_intr, mace_txdma_intr, 0, "MACE-txdma", dev); if (rc) { - printk(KERN_ERR "MACE: can't get irq %d\n", mace->intrs[1].line); + printk(KERN_ERR "MACE: can't get irq %d\n", mp->tx_dma_intr); goto err_free_irq; } rc = request_irq(mp->rx_dma_intr, mace_rxdma_intr, 0, "MACE-rxdma", dev); if (rc) { - printk(KERN_ERR "MACE: can't get irq %d\n", mace->intrs[2].line); + printk(KERN_ERR "MACE: can't get irq %d\n", mp->rx_dma_intr); goto err_free_tx_irq; } diff --git a/drivers/net/mambonet.c b/drivers/net/mambonet.c index 1ef4b6a90..9ea039286 100644 --- a/drivers/net/mambonet.c +++ b/drivers/net/mambonet.c @@ -57,7 +57,6 @@ #include /* For ARPHRD_ETHER */ #include #include -#include #include #define MAMBO_BOGUS_NET_PROBE 119 diff --git a/drivers/net/mipsnet.c b/drivers/net/mipsnet.c index bbffb585b..07e58f4a2 100644 --- a/drivers/net/mipsnet.c +++ b/drivers/net/mipsnet.c @@ -179,7 +179,7 @@ static int mipsnet_open(struct net_device *dev) pr_debug("%s: mipsnet_open\n", dev->name); err = request_irq(dev->irq, &mipsnet_interrupt, - SA_SHIRQ, dev->name, (void *) dev); + IRQF_SHARED, dev->name, (void *) dev); if (err) { pr_debug("%s: %s(): can't get irq %d\n", diff --git a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c index 625ff61c9..59de3e74d 100644 --- a/drivers/net/mv643xx_eth.c +++ b/drivers/net/mv643xx_eth.c @@ -385,6 +385,8 @@ static int mv643xx_eth_receive_queue(struct net_device *dev, int budget) struct pkt_info pkt_info; while (budget-- > 0 && eth_port_receive(mp, &pkt_info) == ETH_OK) { + dma_unmap_single(NULL, pkt_info.buf_ptr, ETH_RX_SKB_SIZE, + DMA_FROM_DEVICE); mp->rx_desc_count--; received_packets++; @@ -778,7 +780,7 @@ static int mv643xx_eth_open(struct net_device *dev) int err; err = request_irq(dev->irq, mv643xx_eth_int_handler, - SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev); + IRQF_SHARED | IRQF_SAMPLE_RANDOM, dev->name, dev); if (err) { printk(KERN_ERR "Can not assign IRQ number to MV643XX_eth%d\n", port_num); diff --git a/drivers/net/mv643xx_eth.h b/drivers/net/mv643xx_eth.h index 4262c1da6..33c5fafdb 100644 --- a/drivers/net/mv643xx_eth.h +++ b/drivers/net/mv643xx_eth.h @@ -258,7 +258,7 @@ struct pkt_info { struct sk_buff *return_info; /* User resource return information */ }; -/* Ethernet port specific infomation */ +/* Ethernet port specific information */ struct mv643xx_mib_counters { u64 good_octets_received; diff --git a/drivers/net/myri_sbus.c b/drivers/net/myri_sbus.c index 6c86dca62..1b965a2b5 100644 --- a/drivers/net/myri_sbus.c +++ b/drivers/net/myri_sbus.c @@ -1,13 +1,12 @@ -/* myri_sbus.h: MyriCOM MyriNET SBUS card driver. +/* myri_sbus.c: MyriCOM MyriNET SBUS card driver. * - * Copyright (C) 1996, 1999 David S. Miller (davem@redhat.com) + * Copyright (C) 1996, 1999, 2006 David S. Miller (davem@davemloft.net) */ static char version[] = - "myri_sbus.c:v1.9 12/Sep/99 David S. Miller (davem@redhat.com)\n"; + "myri_sbus.c:v2.0 June 23, 2006 David S. Miller (davem@davemloft.net)\n"; #include -#include #include #include #include @@ -81,10 +80,6 @@ static char version[] = #define DHDR(x) #endif -#ifdef MODULE -static struct myri_eth *root_myri_dev; -#endif - static void myri_reset_off(void __iomem *lp, void __iomem *cregs) { /* Clear IRQ mask. */ @@ -896,8 +891,9 @@ static void dump_eeprom(struct myri_eth *mp) } #endif -static int __init myri_ether_init(struct sbus_dev *sdev, int num) +static int __init myri_ether_init(struct sbus_dev *sdev) { + static int num; static unsigned version_printed; struct net_device *dev; struct myri_eth *mp; @@ -913,6 +909,9 @@ static int __init myri_ether_init(struct sbus_dev *sdev, int num) if (version_printed++ == 0) printk(version); + SET_MODULE_OWNER(dev); + SET_NETDEV_DEV(dev, &sdev->ofdev.dev); + mp = (struct myri_eth *) dev->priv; spin_lock_init(&mp->irq_lock); mp->myri_sdev = sdev; @@ -1070,7 +1069,7 @@ static int __init myri_ether_init(struct sbus_dev *sdev, int num) /* Register interrupt handler now. */ DET(("Requesting MYRIcom IRQ line.\n")); if (request_irq(dev->irq, &myri_interrupt, - SA_SHIRQ, "MyriCOM Ethernet", (void *) dev)) { + IRQF_SHARED, "MyriCOM Ethernet", (void *) dev)) { printk("MyriCOM: Cannot register interrupt handler.\n"); goto err; } @@ -1092,10 +1091,9 @@ static int __init myri_ether_init(struct sbus_dev *sdev, int num) goto err_free_irq; } -#ifdef MODULE - mp->next_module = root_myri_dev; - root_myri_dev = mp; -#endif + dev_set_drvdata(&sdev->ofdev.dev, mp); + + num++; printk("%s: MyriCOM MyriNET Ethernet ", dev->name); @@ -1114,61 +1112,68 @@ err: return -ENODEV; } -static int __init myri_sbus_match(struct sbus_dev *sdev) -{ - char *name = sdev->prom_name; - if (!strcmp(name, "MYRICOM,mlanai") || - !strcmp(name, "myri")) - return 1; +static int __devinit myri_sbus_probe(struct of_device *dev, const struct of_device_id *match) +{ + struct sbus_dev *sdev = to_sbus_device(&dev->dev); - return 0; + return myri_ether_init(sdev); } -static int __init myri_sbus_probe(void) +static int __devexit myri_sbus_remove(struct of_device *dev) { - struct sbus_bus *bus; - struct sbus_dev *sdev = NULL; - static int called; - int cards = 0, v; + struct myri_eth *mp = dev_get_drvdata(&dev->dev); + struct net_device *net_dev = mp->dev; -#ifdef MODULE - root_myri_dev = NULL; -#endif + unregister_netdevice(net_dev); - if (called) - return -ENODEV; - called++; - - for_each_sbus(bus) { - for_each_sbusdev(sdev, bus) { - if (myri_sbus_match(sdev)) { - cards++; - DET(("Found myricom myrinet as %s\n", sdev->prom_name)); - if ((v = myri_ether_init(sdev, (cards - 1)))) - return v; - } - } + free_irq(net_dev->irq, net_dev); + + if (mp->eeprom.cpuvers < CPUVERS_4_0) { + sbus_iounmap(mp->regs, mp->reg_size); + } else { + sbus_iounmap(mp->cregs, PAGE_SIZE); + sbus_iounmap(mp->lregs, (256 * 1024)); + sbus_iounmap(mp->lanai, (512 * 1024)); } - if (!cards) - return -ENODEV; + + free_netdev(net_dev); + + dev_set_drvdata(&dev->dev, NULL); + return 0; } -static void __exit myri_sbus_cleanup(void) +static struct of_device_id myri_sbus_match[] = { + { + .name = "MYRICOM,mlanai", + }, + { + .name = "myri", + }, + {}, +}; + +MODULE_DEVICE_TABLE(of, myri_sbus_match); + +static struct of_platform_driver myri_sbus_driver = { + .name = "myri", + .match_table = myri_sbus_match, + .probe = myri_sbus_probe, + .remove = __devexit_p(myri_sbus_remove), +}; + +static int __init myri_sbus_init(void) +{ + return of_register_driver(&myri_sbus_driver, &sbus_bus_type); +} + +static void __exit myri_sbus_exit(void) { -#ifdef MODULE - while (root_myri_dev) { - struct myri_eth *next = root_myri_dev->next_module; - - unregister_netdev(root_myri_dev->dev); - /* this will also free the co-allocated 'root_myri_dev' */ - free_netdev(root_myri_dev->dev); - root_myri_dev = next; - } -#endif /* MODULE */ + of_unregister_driver(&myri_sbus_driver); } -module_init(myri_sbus_probe); -module_exit(myri_sbus_cleanup); +module_init(myri_sbus_init); +module_exit(myri_sbus_exit); + MODULE_LICENSE("GPL"); diff --git a/drivers/net/myri_sbus.h b/drivers/net/myri_sbus.h index 47722f708..2f69ef7cd 100644 --- a/drivers/net/myri_sbus.h +++ b/drivers/net/myri_sbus.h @@ -290,7 +290,6 @@ struct myri_eth { unsigned int reg_size; /* Size of register space. */ unsigned int shmem_base; /* Offset to shared ram. */ struct sbus_dev *myri_sdev; /* Our SBUS device struct. */ - struct myri_eth *next_module; /* Next in adapter chain. */ }; /* We use this to acquire receive skb's that we can DMA directly into. */ diff --git a/drivers/net/natsemi.c b/drivers/net/natsemi.c index 2e4ecedba..db0475a11 100644 --- a/drivers/net/natsemi.c +++ b/drivers/net/natsemi.c @@ -20,125 +20,13 @@ Support information and updates available at http://www.scyld.com/network/netsemi.html + [link no longer provides useful info -jgarzik] - Linux kernel modifications: - - Version 1.0.1: - - Spinlock fixes - - Bug fixes and better intr performance (Tjeerd) - Version 1.0.2: - - Now reads correct MAC address from eeprom - Version 1.0.3: - - Eliminate redundant priv->tx_full flag - - Call netif_start_queue from dev->tx_timeout - - wmb() in start_tx() to flush data - - Update Tx locking - - Clean up PCI enable (davej) - Version 1.0.4: - - Merge Donald Becker's natsemi.c version 1.07 - Version 1.0.5: - - { fill me in } - Version 1.0.6: - * ethtool support (jgarzik) - * Proper initialization of the card (which sometimes - fails to occur and leaves the card in a non-functional - state). (uzi) - - * Some documented register settings to optimize some - of the 100Mbit autodetection circuitry in rev C cards. (uzi) - - * Polling of the PHY intr for stuff like link state - change and auto- negotiation to finally work properly. (uzi) - - * One-liner removal of a duplicate declaration of - netdev_error(). (uzi) - - Version 1.0.7: (Manfred Spraul) - * pci dma - * SMP locking update - * full reset added into tx_timeout - * correct multicast hash generation (both big and little endian) - [copied from a natsemi driver version - from Myrio Corporation, Greg Smith] - * suspend/resume - - version 1.0.8 (Tim Hockin ) - * ETHTOOL_* support - * Wake on lan support (Erik Gilling) - * MXDMA fixes for serverworks - * EEPROM reload - - version 1.0.9 (Manfred Spraul) - * Main change: fix lack of synchronize - netif_close/netif_suspend against a last interrupt - or packet. - * do not enable superflous interrupts (e.g. the - drivers relies on TxDone - TxIntr not needed) - * wait that the hardware has really stopped in close - and suspend. - * workaround for the (at least) gcc-2.95.1 compiler - problem. Also simplifies the code a bit. - * disable_irq() in tx_timeout - needed to protect - against rx interrupts. - * stop the nic before switching into silent rx mode - for wol (required according to docu). - - version 1.0.10: - * use long for ee_addr (various) - * print pointers properly (DaveM) - * include asm/irq.h (?) - - version 1.0.11: - * check and reset if PHY errors appear (Adrian Sun) - * WoL cleanup (Tim Hockin) - * Magic number cleanup (Tim Hockin) - * Don't reload EEPROM on every reset (Tim Hockin) - * Save and restore EEPROM state across reset (Tim Hockin) - * MDIO Cleanup (Tim Hockin) - * Reformat register offsets/bits (jgarzik) - - version 1.0.12: - * ETHTOOL_* further support (Tim Hockin) - - version 1.0.13: - * ETHTOOL_[G]EEPROM support (Tim Hockin) - - version 1.0.13: - * crc cleanup (Matt Domsch ) - - version 1.0.14: - * Cleanup some messages and autoneg in ethtool (Tim Hockin) - - version 1.0.15: - * Get rid of cable_magic flag - * use new (National provided) solution for cable magic issue - - version 1.0.16: - * call netdev_rx() for RxErrors (Manfred Spraul) - * formatting and cleanups - * change options and full_duplex arrays to be zero - initialized - * enable only the WoL and PHY interrupts in wol mode - - version 1.0.17: - * only do cable_magic on 83815 and early 83816 (Tim Hockin) - * create a function for rx refill (Manfred Spraul) - * combine drain_ring and init_ring (Manfred Spraul) - * oom handling (Manfred Spraul) - * hands_off instead of playing with netif_device_{de,a}ttach - (Manfred Spraul) - * be sure to write the MAC back to the chip (Manfred Spraul) - * lengthen EEPROM timeout, and always warn about timeouts - (Manfred Spraul) - * comments update (Manfred) - * do the right thing on a phy-reset (Manfred and Tim) - TODO: * big endian support with CFG:BEM instead of cpu_to_le32 */ -#include #include #include #include @@ -166,8 +54,8 @@ #include #define DRV_NAME "natsemi" -#define DRV_VERSION "1.07+LK1.0.17" -#define DRV_RELDATE "Sep 27, 2002" +#define DRV_VERSION "2.0" +#define DRV_RELDATE "June 27, 2006" #define RX_OFFSET 2 @@ -226,7 +114,6 @@ static int full_duplex[MAX_UNITS]; NATSEMI_PG1_NREGS) #define NATSEMI_REGS_VER 1 /* v1 added RFDR registers */ #define NATSEMI_REGS_SIZE (NATSEMI_NREGS * sizeof(u32)) -#define NATSEMI_DEF_EEPROM_SIZE 24 /* 12 16-bit values */ /* Buffer sizes: * The nic writes 32-bit values, even if the upper bytes of @@ -344,18 +231,6 @@ None characterised. -enum pcistuff { - PCI_USES_IO = 0x01, - PCI_USES_MEM = 0x02, - PCI_USES_MASTER = 0x04, - PCI_ADDR0 = 0x08, - PCI_ADDR1 = 0x10, -}; - -/* MMIO operations required */ -#define PCI_IOTYPE (PCI_USES_MASTER | PCI_USES_MEM | PCI_ADDR1) - - /* * Support for fibre connections on Am79C874: * This phy needs a special setup when connected to a fibre cable. @@ -363,22 +238,25 @@ enum pcistuff { */ #define PHYID_AM79C874 0x0022561b -#define MII_MCTRL 0x15 /* mode control register */ -#define MII_FX_SEL 0x0001 /* 100BASE-FX (fiber) */ -#define MII_EN_SCRM 0x0004 /* enable scrambler (tp) */ +enum { + MII_MCTRL = 0x15, /* mode control register */ + MII_FX_SEL = 0x0001, /* 100BASE-FX (fiber) */ + MII_EN_SCRM = 0x0004, /* enable scrambler (tp) */ +}; /* array of board data directly indexed by pci_tbl[x].driver_data */ static const struct { const char *name; unsigned long flags; + unsigned int eeprom_size; } natsemi_pci_info[] __devinitdata = { - { "NatSemi DP8381[56]", PCI_IOTYPE }, + { "NatSemi DP8381[56]", 0, 24 }, }; -static struct pci_device_id natsemi_pci_tbl[] = { - { PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_83815, PCI_ANY_ID, PCI_ANY_ID, }, - { 0, }, +static const struct pci_device_id natsemi_pci_tbl[] __devinitdata = { + { PCI_VENDOR_ID_NS, 0x0020, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, + { } /* terminate list */ }; MODULE_DEVICE_TABLE(pci, natsemi_pci_tbl); @@ -813,6 +691,42 @@ static void move_int_phy(struct net_device *dev, int addr) udelay(1); } +static void __devinit natsemi_init_media (struct net_device *dev) +{ + struct netdev_private *np = netdev_priv(dev); + u32 tmp; + + netif_carrier_off(dev); + + /* get the initial settings from hardware */ + tmp = mdio_read(dev, MII_BMCR); + np->speed = (tmp & BMCR_SPEED100)? SPEED_100 : SPEED_10; + np->duplex = (tmp & BMCR_FULLDPLX)? DUPLEX_FULL : DUPLEX_HALF; + np->autoneg = (tmp & BMCR_ANENABLE)? AUTONEG_ENABLE: AUTONEG_DISABLE; + np->advertising= mdio_read(dev, MII_ADVERTISE); + + if ((np->advertising & ADVERTISE_ALL) != ADVERTISE_ALL + && netif_msg_probe(np)) { + printk(KERN_INFO "natsemi %s: Transceiver default autonegotiation %s " + "10%s %s duplex.\n", + pci_name(np->pci_dev), + (mdio_read(dev, MII_BMCR) & BMCR_ANENABLE)? + "enabled, advertise" : "disabled, force", + (np->advertising & + (ADVERTISE_100FULL|ADVERTISE_100HALF))? + "0" : "", + (np->advertising & + (ADVERTISE_100FULL|ADVERTISE_10FULL))? + "full" : "half"); + } + if (netif_msg_probe(np)) + printk(KERN_INFO + "natsemi %s: Transceiver status %#04x advertising %#04x.\n", + pci_name(np->pci_dev), mdio_read(dev, MII_BMSR), + np->advertising); + +} + static int __devinit natsemi_probe1 (struct pci_dev *pdev, const struct pci_device_id *ent) { @@ -852,8 +766,7 @@ static int __devinit natsemi_probe1 (struct pci_dev *pdev, iosize = pci_resource_len(pdev, pcibar); irq = pdev->irq; - if (natsemi_pci_info[chip_idx].flags & PCI_USES_MASTER) - pci_set_master(pdev); + pci_set_master(pdev); dev = alloc_etherdev(sizeof (struct netdev_private)); if (!dev) @@ -892,7 +805,7 @@ static int __devinit natsemi_probe1 (struct pci_dev *pdev, np->msg_enable = (debug >= 0) ? (1<hands_off = 0; np->intr_status = 0; - np->eeprom_size = NATSEMI_DEF_EEPROM_SIZE; + np->eeprom_size = natsemi_pci_info[chip_idx].eeprom_size; /* Initial port: * - If the nic was configured to use an external phy and if find_mii @@ -957,34 +870,7 @@ static int __devinit natsemi_probe1 (struct pci_dev *pdev, if (mtu) dev->mtu = mtu; - netif_carrier_off(dev); - - /* get the initial settings from hardware */ - tmp = mdio_read(dev, MII_BMCR); - np->speed = (tmp & BMCR_SPEED100)? SPEED_100 : SPEED_10; - np->duplex = (tmp & BMCR_FULLDPLX)? DUPLEX_FULL : DUPLEX_HALF; - np->autoneg = (tmp & BMCR_ANENABLE)? AUTONEG_ENABLE: AUTONEG_DISABLE; - np->advertising= mdio_read(dev, MII_ADVERTISE); - - if ((np->advertising & ADVERTISE_ALL) != ADVERTISE_ALL - && netif_msg_probe(np)) { - printk(KERN_INFO "natsemi %s: Transceiver default autonegotiation %s " - "10%s %s duplex.\n", - pci_name(np->pci_dev), - (mdio_read(dev, MII_BMCR) & BMCR_ANENABLE)? - "enabled, advertise" : "disabled, force", - (np->advertising & - (ADVERTISE_100FULL|ADVERTISE_100HALF))? - "0" : "", - (np->advertising & - (ADVERTISE_100FULL|ADVERTISE_10FULL))? - "full" : "half"); - } - if (netif_msg_probe(np)) - printk(KERN_INFO - "natsemi %s: Transceiver status %#04x advertising %#04x.\n", - pci_name(np->pci_dev), mdio_read(dev, MII_BMSR), - np->advertising); + natsemi_init_media(dev); /* save the silicon revision for later querying */ np->srr = readl(ioaddr + SiliconRev); @@ -1577,7 +1463,7 @@ static int netdev_open(struct net_device *dev) /* Reset the chip, just in case. */ natsemi_reset(dev); - i = request_irq(dev->irq, &intr_handler, SA_SHIRQ, dev->name, dev); + i = request_irq(dev->irq, &intr_handler, IRQF_SHARED, dev->name, dev); if (i) return i; if (netif_msg_ifup(np)) diff --git a/drivers/net/ne.c b/drivers/net/ne.c index b32765215..963a11fa9 100644 --- a/drivers/net/ne.c +++ b/drivers/net/ne.c @@ -829,7 +829,7 @@ that the ne2k probe is the last 8390 based probe to take place (as it is at boot) and so the probe will get confused by any other 8390 cards. ISA device autoprobes on a running machine are not recommended anyway. */ -int init_module(void) +int __init init_module(void) { int this_dev, found = 0; diff --git a/drivers/net/ne2.c b/drivers/net/ne2.c index 2aa7b77f8..eebf5f02b 100644 --- a/drivers/net/ne2.c +++ b/drivers/net/ne2.c @@ -780,7 +780,7 @@ MODULE_PARM_DESC(bad, "(ignored)"); /* Module code fixed by David Weinehall */ -int init_module(void) +int __init init_module(void) { struct net_device *dev; int this_dev, found = 0; diff --git a/drivers/net/ne2k-pci.c b/drivers/net/ne2k-pci.c index ced9fdb83..34bdba9ee 100644 --- a/drivers/net/ne2k-pci.c +++ b/drivers/net/ne2k-pci.c @@ -231,12 +231,12 @@ static int __devinit ne2k_pci_init_one (struct pci_dev *pdev, irq = pdev->irq; if (!ioaddr || ((pci_resource_flags (pdev, 0) & IORESOURCE_IO) == 0)) { - printk (KERN_ERR PFX "no I/O resource at PCI BAR #0\n"); + dev_err(&pdev->dev, "no I/O resource at PCI BAR #0\n"); return -ENODEV; } if (request_region (ioaddr, NE_IO_EXTENT, DRV_NAME) == NULL) { - printk (KERN_ERR PFX "I/O resource 0x%x @ 0x%lx busy\n", + dev_err(&pdev->dev, "I/O resource 0x%x @ 0x%lx busy\n", NE_IO_EXTENT, ioaddr); return -EBUSY; } @@ -263,7 +263,7 @@ static int __devinit ne2k_pci_init_one (struct pci_dev *pdev, /* Allocate net_device, dev->priv; fill in 8390 specific dev fields. */ dev = alloc_ei_netdev(); if (!dev) { - printk (KERN_ERR PFX "cannot allocate ethernet device\n"); + dev_err(&pdev->dev, "cannot allocate ethernet device\n"); goto err_out_free_res; } SET_MODULE_OWNER(dev); @@ -281,7 +281,8 @@ static int __devinit ne2k_pci_init_one (struct pci_dev *pdev, while ((inb(ioaddr + EN0_ISR) & ENISR_RESET) == 0) /* Limit wait: '2' avoids jiffy roll-over. */ if (jiffies - reset_start_time > 2) { - printk(KERN_ERR PFX "Card failure (no reset ack).\n"); + dev_err(&pdev->dev, + "Card failure (no reset ack).\n"); goto err_out_free_netdev; } @@ -420,7 +421,7 @@ static int ne2k_pci_set_fdx(struct net_device *dev) static int ne2k_pci_open(struct net_device *dev) { - int ret = request_irq(dev->irq, ei_interrupt, SA_SHIRQ, dev->name, dev); + int ret = request_irq(dev->irq, ei_interrupt, IRQF_SHARED, dev->name, dev); if (ret) return ret; diff --git a/drivers/net/ni5010.c b/drivers/net/ni5010.c index a68bf474f..d4be207d3 100644 --- a/drivers/net/ni5010.c +++ b/drivers/net/ni5010.c @@ -1,17 +1,12 @@ /* ni5010.c: A network driver for the MiCom-Interlan NI5010 ethercard. * - * Copyright 1996,1997 Jan-Pascal van Best and Andreas Mohr. + * Copyright 1996,1997,2006 Jan-Pascal van Best and Andreas Mohr. * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. * * The authors may be reached as: - * jvbest@wi.leidenuniv.nl a.mohr@mailto.de - * or by snail mail as - * Jan-Pascal van Best Andreas Mohr - * Klikspaanweg 58-4 Stauferstr. 6 - * 2324 LZ Leiden D-71272 Renningen - * The Netherlands Germany + * janpascal@vanbest.org andi@lisas.de * * Sources: * Donald Becker's "skeleton.c" @@ -27,8 +22,9 @@ * 970503 v0.93: Fixed auto-irq failure on warm reboot (JB) * 970623 v1.00: First kernel version (AM) * 970814 v1.01: Added detection of onboard receive buffer size (AM) + * 060611 v1.02: slight cleanup: email addresses, driver modernization. * Bugs: - * - None known... + * - not SMP-safe (no locking of I/O accesses) * - Note that you have to patch ifconfig for the new /proc/net/dev * format. It gives incorrect stats otherwise. * @@ -39,7 +35,7 @@ * Complete merge with Andreas' driver * Implement ring buffers (Is this useful? You can't squeeze * too many packet in a 2k buffer!) - * Implement DMA (Again, is this useful? Some docs says DMA is + * Implement DMA (Again, is this useful? Some docs say DMA is * slower than programmed I/O) * * Compile with: @@ -47,7 +43,7 @@ * -DMODULE -c ni5010.c * * Insert with e.g.: - * insmod ni5010.o io=0x300 irq=5 + * insmod ni5010.ko io=0x300 irq=5 */ #include @@ -69,15 +65,15 @@ #include "ni5010.h" -static const char *boardname = "NI5010"; -static char *version = - "ni5010.c: v1.00 06/23/97 Jan-Pascal van Best and Andreas Mohr\n"; +static const char boardname[] = "NI5010"; +static char version[] __initdata = + "ni5010.c: v1.02 20060611 Jan-Pascal van Best and Andreas Mohr\n"; /* bufsize_rcv == 0 means autoprobing */ static unsigned int bufsize_rcv; -#define jumpered_interrupts /* IRQ line jumpered on board */ -#undef jumpered_dma /* No DMA used */ +#define JUMPERED_INTERRUPTS /* IRQ line jumpered on board */ +#undef JUMPERED_DMA /* No DMA used */ #undef FULL_IODETECT /* Only detect in portlist */ #ifndef FULL_IODETECT @@ -281,7 +277,7 @@ static int __init ni5010_probe1(struct net_device *dev, int ioaddr) PRINTK2((KERN_DEBUG "%s: I/O #4 passed!\n", dev->name)); -#ifdef jumpered_interrupts +#ifdef JUMPERED_INTERRUPTS if (dev->irq == 0xff) ; else if (dev->irq < 2) { @@ -305,7 +301,7 @@ static int __init ni5010_probe1(struct net_device *dev, int ioaddr) } else if (dev->irq == 2) { dev->irq = 9; } -#endif /* jumpered_irq */ +#endif /* JUMPERED_INTERRUPTS */ PRINTK2((KERN_DEBUG "%s: I/O #9 passed!\n", dev->name)); /* DMA is not supported (yet?), so no use detecting it */ @@ -334,7 +330,7 @@ static int __init ni5010_probe1(struct net_device *dev, int ioaddr) outw(0, IE_GP); /* Point GP at start of packet */ outb(0, IE_RBUF); /* set buffer byte 0 to 0 again */ } - printk("// bufsize rcv/xmt=%d/%d\n", bufsize_rcv, NI5010_BUFSIZE); + printk("-> bufsize rcv/xmt=%d/%d\n", bufsize_rcv, NI5010_BUFSIZE); memset(dev->priv, 0, sizeof(struct ni5010_local)); dev->open = ni5010_open; @@ -354,11 +350,9 @@ static int __init ni5010_probe1(struct net_device *dev, int ioaddr) outb(0xff, EDLC_XCLR); /* Kill all pending xmt interrupts */ printk(KERN_INFO "%s: NI5010 found at 0x%x, using IRQ %d", dev->name, ioaddr, dev->irq); - if (dev->dma) printk(" & DMA %d", dev->dma); + if (dev->dma) + printk(" & DMA %d", dev->dma); printk(".\n"); - - printk(KERN_INFO "Join the NI5010 driver development team!\n"); - printk(KERN_INFO "Mail to a.mohr@mailto.de or jvbest@wi.leidenuniv.nl\n"); return 0; out: release_region(dev->base_addr, NI5010_IO_EXTENT); @@ -371,7 +365,7 @@ out: * * This routine should set everything up anew at each open, even * registers that "should" only need to be set once at boot, so that - * there is non-reboot way to recover if something goes wrong. + * there is a non-reboot way to recover if something goes wrong. */ static int ni5010_open(struct net_device *dev) @@ -390,13 +384,13 @@ static int ni5010_open(struct net_device *dev) * Always allocate the DMA channel after the IRQ, * and clean up on failure. */ -#ifdef jumpered_dma +#ifdef JUMPERED_DMA if (request_dma(dev->dma, cardname)) { printk(KERN_WARNING "%s: Cannot get dma %#2x\n", dev->name, dev->dma); free_irq(dev->irq, NULL); return -EAGAIN; } -#endif /* jumpered_dma */ +#endif /* JUMPERED_DMA */ PRINTK3((KERN_DEBUG "%s: passed open() #2\n", dev->name)); /* Reset the hardware here. Don't forget to set the station address. */ @@ -633,7 +627,7 @@ static int ni5010_close(struct net_device *dev) int ioaddr = dev->base_addr; PRINTK2((KERN_DEBUG "%s: entering ni5010_close\n", dev->name)); -#ifdef jumpered_interrupts +#ifdef JUMPERED_INTERRUPTS free_irq(dev->irq, NULL); #endif /* Put card in held-RESET state */ @@ -771,7 +765,7 @@ module_param(irq, int, 0); MODULE_PARM_DESC(io, "ni5010 I/O base address"); MODULE_PARM_DESC(irq, "ni5010 IRQ number"); -int init_module(void) +static int __init ni5010_init_module(void) { PRINTK2((KERN_DEBUG "%s: entering init_module\n", boardname)); /* @@ -792,13 +786,15 @@ int init_module(void) return 0; } -void cleanup_module(void) +static void __exit ni5010_cleanup_module(void) { PRINTK2((KERN_DEBUG "%s: entering cleanup_module\n", boardname)); unregister_netdev(dev_ni5010); release_region(dev_ni5010->base_addr, NI5010_IO_EXTENT); free_netdev(dev_ni5010); } +module_init(ni5010_init_module); +module_exit(ni5010_cleanup_module); #endif /* MODULE */ MODULE_LICENSE("GPL"); diff --git a/drivers/net/ni52.c b/drivers/net/ni52.c index fa854c8fd..4d52ecf8a 100644 --- a/drivers/net/ni52.c +++ b/drivers/net/ni52.c @@ -1323,7 +1323,7 @@ MODULE_PARM_DESC(irq, "NI5210 IRQ number,required"); MODULE_PARM_DESC(memstart, "NI5210 memory base address,required"); MODULE_PARM_DESC(memend, "NI5210 memory end address,required"); -int init_module(void) +int __init init_module(void) { if(io <= 0x0 || !memend || !memstart || irq < 2) { printk("ni52: Autoprobing not allowed for modules.\nni52: Set symbols 'io' 'irq' 'memstart' and 'memend'\n"); diff --git a/drivers/net/ni65.c b/drivers/net/ni65.c index bb42ff218..810cc572f 100644 --- a/drivers/net/ni65.c +++ b/drivers/net/ni65.c @@ -1253,7 +1253,7 @@ MODULE_PARM_DESC(irq, "ni6510 IRQ number (ignored for some cards)"); MODULE_PARM_DESC(io, "ni6510 I/O base address"); MODULE_PARM_DESC(dma, "ni6510 ISA DMA channel (ignored for some cards)"); -int init_module(void) +int __init init_module(void) { dev_ni65 = ni65_probe(-1); return IS_ERR(dev_ni65) ? PTR_ERR(dev_ni65) : 0; diff --git a/drivers/net/ns83820.c b/drivers/net/ns83820.c index b6427a81b..23397f994 100644 --- a/drivers/net/ns83820.c +++ b/drivers/net/ns83820.c @@ -96,7 +96,6 @@ //#define dprintk printk #define dprintk(x...) do { } while (0) -#include #include #include #include @@ -804,7 +803,7 @@ static int ns83820_setup_rx(struct net_device *ndev) writel(dev->IMR_cache, dev->base + IMR); writel(1, dev->base + IER); - spin_unlock_irq(&dev->misc_lock); + spin_unlock(&dev->misc_lock); kick_rx(ndev); @@ -1013,8 +1012,6 @@ static void do_tx_done(struct net_device *ndev) struct ns83820 *dev = PRIV(ndev); u32 cmdsts, tx_done_idx, *desc; - spin_lock_irq(&dev->tx_lock); - dprintk("do_tx_done(%p)\n", ndev); tx_done_idx = dev->tx_done_idx; desc = dev->tx_descs + (tx_done_idx * DESC_SIZE); @@ -1070,7 +1067,6 @@ static void do_tx_done(struct net_device *ndev) netif_start_queue(ndev); netif_wake_queue(ndev); } - spin_unlock_irq(&dev->tx_lock); } static void ns83820_cleanup_tx(struct ns83820 *dev) @@ -1282,11 +1278,13 @@ static struct ethtool_ops ops = { .get_link = ns83820_get_link }; +/* this function is called in irq context from the ISR */ static void ns83820_mib_isr(struct ns83820 *dev) { - spin_lock(&dev->misc_lock); + unsigned long flags; + spin_lock_irqsave(&dev->misc_lock, flags); ns83820_update_stats(dev); - spin_unlock(&dev->misc_lock); + spin_unlock_irqrestore(&dev->misc_lock, flags); } static void ns83820_do_isr(struct net_device *ndev, u32 isr); @@ -1308,6 +1306,8 @@ static irqreturn_t ns83820_irq(int foo, void *data, struct pt_regs *regs) static void ns83820_do_isr(struct net_device *ndev, u32 isr) { struct ns83820 *dev = PRIV(ndev); + unsigned long flags; + #ifdef DEBUG if (isr & ~(ISR_PHY | ISR_RXDESC | ISR_RXEARLY | ISR_RXOK | ISR_RXERR | ISR_TXIDLE | ISR_TXOK | ISR_TXDESC)) Dprintk("odd isr? 0x%08x\n", isr); @@ -1322,10 +1322,10 @@ static void ns83820_do_isr(struct net_device *ndev, u32 isr) if ((ISR_RXDESC | ISR_RXOK) & isr) { prefetch(dev->rx_info.next_rx_desc); - spin_lock_irq(&dev->misc_lock); + spin_lock_irqsave(&dev->misc_lock, flags); dev->IMR_cache &= ~(ISR_RXDESC | ISR_RXOK); writel(dev->IMR_cache, dev->base + IMR); - spin_unlock_irq(&dev->misc_lock); + spin_unlock_irqrestore(&dev->misc_lock, flags); tasklet_schedule(&dev->rx_tasklet); //rx_irq(ndev); @@ -1371,16 +1371,18 @@ static void ns83820_do_isr(struct net_device *ndev, u32 isr) * work has accumulated */ if ((ISR_TXDESC | ISR_TXIDLE | ISR_TXOK | ISR_TXERR) & isr) { + spin_lock_irqsave(&dev->tx_lock, flags); do_tx_done(ndev); + spin_unlock_irqrestore(&dev->tx_lock, flags); /* Disable TxOk if there are no outstanding tx packets. */ if ((dev->tx_done_idx == dev->tx_free_idx) && (dev->IMR_cache & ISR_TXOK)) { - spin_lock_irq(&dev->misc_lock); + spin_lock_irqsave(&dev->misc_lock, flags); dev->IMR_cache &= ~ISR_TXOK; writel(dev->IMR_cache, dev->base + IMR); - spin_unlock_irq(&dev->misc_lock); + spin_unlock_irqrestore(&dev->misc_lock, flags); } } @@ -1391,10 +1393,10 @@ static void ns83820_do_isr(struct net_device *ndev, u32 isr) * nature are expected, we must enable TxOk. */ if ((ISR_TXIDLE & isr) && (dev->tx_done_idx != dev->tx_free_idx)) { - spin_lock_irq(&dev->misc_lock); + spin_lock_irqsave(&dev->misc_lock, flags); dev->IMR_cache |= ISR_TXOK; writel(dev->IMR_cache, dev->base + IMR); - spin_unlock_irq(&dev->misc_lock); + spin_unlock_irqrestore(&dev->misc_lock, flags); } /* MIB interrupt: one of the statistics counters is about to overflow */ @@ -1456,7 +1458,7 @@ static void ns83820_tx_timeout(struct net_device *ndev) u32 tx_done_idx, *desc; unsigned long flags; - local_irq_save(flags); + spin_lock_irqsave(&dev->tx_lock, flags); tx_done_idx = dev->tx_done_idx; desc = dev->tx_descs + (tx_done_idx * DESC_SIZE); @@ -1483,7 +1485,7 @@ static void ns83820_tx_timeout(struct net_device *ndev) ndev->name, tx_done_idx, dev->tx_free_idx, le32_to_cpu(desc[DESC_CMDSTS])); - local_irq_restore(flags); + spin_unlock_irqrestore(&dev->tx_lock, flags); } static void ns83820_tx_watch(unsigned long data) @@ -1833,7 +1835,7 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev, const struct pci_ } else if (!pci_set_dma_mask(pci_dev, DMA_32BIT_MASK)) { using_dac = 0; } else { - printk(KERN_WARNING "ns83820.c: pci_set_dma_mask failed!\n"); + dev_warn(&pci_dev->dev, "pci_set_dma_mask failed!\n"); return -ENODEV; } @@ -1856,7 +1858,7 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev, const struct pci_ err = pci_enable_device(pci_dev); if (err) { - printk(KERN_INFO "ns83820: pci_enable_dev failed: %d\n", err); + dev_info(&pci_dev->dev, "pci_enable_dev failed: %d\n", err); goto out_free; } @@ -1882,11 +1884,11 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev, const struct pci_ dev->IMR_cache = 0; - err = request_irq(pci_dev->irq, ns83820_irq, SA_SHIRQ, + err = request_irq(pci_dev->irq, ns83820_irq, IRQF_SHARED, DRV_NAME, ndev); if (err) { - printk(KERN_INFO "ns83820: unable to register irq %d\n", - pci_dev->irq); + dev_info(&pci_dev->dev, "unable to register irq %d, err %d\n", + pci_dev->irq, err); goto out_disable; } @@ -1900,7 +1902,7 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev, const struct pci_ rtnl_lock(); err = dev_alloc_name(ndev, ndev->name); if (err < 0) { - printk(KERN_INFO "ns83820: unable to get netdev name: %d\n", err); + dev_info(&pci_dev->dev, "unable to get netdev name: %d\n", err); goto out_free_irq; } diff --git a/drivers/net/pci-skeleton.c b/drivers/net/pci-skeleton.c index a7bb54df7..e0e293964 100644 --- a/drivers/net/pci-skeleton.c +++ b/drivers/net/pci-skeleton.c @@ -85,7 +85,6 @@ IVc. Errata */ -#include #include #include #include @@ -602,7 +601,7 @@ static int __devinit netdrv_init_board (struct pci_dev *pdev, /* dev zeroed in alloc_etherdev */ dev = alloc_etherdev (sizeof (*tp)); if (dev == NULL) { - printk (KERN_ERR PFX "unable to alloc new ethernet\n"); + dev_err(&pdev->dev, "unable to alloc new ethernet\n"); DPRINTK ("EXIT, returning -ENOMEM\n"); return -ENOMEM; } @@ -632,14 +631,14 @@ static int __devinit netdrv_init_board (struct pci_dev *pdev, /* make sure PCI base addr 0 is PIO */ if (!(pio_flags & IORESOURCE_IO)) { - printk (KERN_ERR PFX "region #0 not a PIO resource, aborting\n"); + dev_err(&pdev->dev, "region #0 not a PIO resource, aborting\n"); rc = -ENODEV; goto err_out; } /* make sure PCI base addr 1 is MMIO */ if (!(mmio_flags & IORESOURCE_MEM)) { - printk (KERN_ERR PFX "region #1 not an MMIO resource, aborting\n"); + dev_err(&pdev->dev, "region #1 not an MMIO resource, aborting\n"); rc = -ENODEV; goto err_out; } @@ -647,12 +646,12 @@ static int __devinit netdrv_init_board (struct pci_dev *pdev, /* check for weird/broken PCI region reporting */ if ((pio_len < NETDRV_MIN_IO_SIZE) || (mmio_len < NETDRV_MIN_IO_SIZE)) { - printk (KERN_ERR PFX "Invalid PCI region size(s), aborting\n"); + dev_err(&pdev->dev, "Invalid PCI region size(s), aborting\n"); rc = -ENODEV; goto err_out; } - rc = pci_request_regions (pdev, "pci-skeleton"); + rc = pci_request_regions (pdev, MODNAME); if (rc) goto err_out; @@ -664,7 +663,7 @@ static int __devinit netdrv_init_board (struct pci_dev *pdev, /* ioremap MMIO region */ ioaddr = ioremap (mmio_start, mmio_len); if (ioaddr == NULL) { - printk (KERN_ERR PFX "cannot remap MMIO, aborting\n"); + dev_err(&pdev->dev, "cannot remap MMIO, aborting\n"); rc = -EIO; goto err_out_free_res; } @@ -700,9 +699,10 @@ static int __devinit netdrv_init_board (struct pci_dev *pdev, } /* if unknown chip, assume array element #0, original RTL-8139 in this case */ - printk (KERN_DEBUG PFX "PCI device %s: unknown chip version, assuming RTL-8139\n", - pci_name(pdev)); - printk (KERN_DEBUG PFX "PCI device %s: TxConfig = 0x%lx\n", pci_name(pdev), NETDRV_R32 (TxConfig)); + dev_printk (KERN_DEBUG, &pdev->dev, + "unknown chip version, assuming RTL-8139\n"); + dev_printk (KERN_DEBUG, &pdev->dev, "TxConfig = 0x%lx\n", + NETDRV_R32 (TxConfig)); tp->chipset = 0; match: @@ -1076,7 +1076,7 @@ static int netdrv_open (struct net_device *dev) DPRINTK ("ENTER\n"); - retval = request_irq (dev->irq, netdrv_interrupt, SA_SHIRQ, dev->name, dev); + retval = request_irq (dev->irq, netdrv_interrupt, IRQF_SHARED, dev->name, dev); if (retval) { DPRINTK ("EXIT, returning %d\n", retval); return retval; diff --git a/drivers/net/pcmcia/axnet_cs.c b/drivers/net/pcmcia/axnet_cs.c index 2ea66aca6..297e9f805 100644 --- a/drivers/net/pcmcia/axnet_cs.c +++ b/drivers/net/pcmcia/axnet_cs.c @@ -535,7 +535,7 @@ static int axnet_open(struct net_device *dev) link->open++; - request_irq(dev->irq, ei_irq_wrapper, SA_SHIRQ, "axnet_cs", dev); + request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, "axnet_cs", dev); info->link_status = 0x00; init_timer(&info->watchdog); diff --git a/drivers/net/pcmcia/com20020_cs.c b/drivers/net/pcmcia/com20020_cs.c index 441de824a..48434d792 100644 --- a/drivers/net/pcmcia/com20020_cs.c +++ b/drivers/net/pcmcia/com20020_cs.c @@ -387,7 +387,10 @@ static int com20020_resume(struct pcmcia_device *link) } static struct pcmcia_device_id com20020_ids[] = { - PCMCIA_DEVICE_PROD_ID12("Contemporary Control Systems, Inc.", "PCM20 Arcnet Adapter", 0x59991666, 0x95dfffaf), + PCMCIA_DEVICE_PROD_ID12("Contemporary Control Systems, Inc.", + "PCM20 Arcnet Adapter", 0x59991666, 0x95dfffaf), + PCMCIA_DEVICE_PROD_ID12("SoHard AG", + "SH ARC PCMCIA", 0xf8991729, 0x69dff0c7), PCMCIA_DEVICE_NULL }; MODULE_DEVICE_TABLE(pcmcia, com20020_ids); diff --git a/drivers/net/pcmcia/fmvj18x_cs.c b/drivers/net/pcmcia/fmvj18x_cs.c index 09b11761c..ea93b8f18 100644 --- a/drivers/net/pcmcia/fmvj18x_cs.c +++ b/drivers/net/pcmcia/fmvj18x_cs.c @@ -831,8 +831,7 @@ static int fjn_start_xmit(struct sk_buff *skb, struct net_device *dev) if (length < ETH_ZLEN) { - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) + if (skb_padto(skb, ETH_ZLEN)) return 0; length = ETH_ZLEN; } diff --git a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c index d090df413..0ecebfc31 100644 --- a/drivers/net/pcmcia/pcnet_cs.c +++ b/drivers/net/pcmcia/pcnet_cs.c @@ -12,7 +12,7 @@ Copyright (C) 1999 David A. Hinds -- dahinds@users.sourceforge.net pcnet_cs.c 1.153 2003/11/09 18:53:09 - + The network driver code is based on Donald Becker's NE2000 code: Written 1992,1993 by Donald Becker. @@ -146,7 +146,7 @@ typedef struct hw_info_t { #define MII_PHYID_REG2 0x03 static hw_info_t hw_info[] = { - { /* Accton EN2212 */ 0x0ff0, 0x00, 0x00, 0xe8, DELAY_OUTPUT }, + { /* Accton EN2212 */ 0x0ff0, 0x00, 0x00, 0xe8, DELAY_OUTPUT }, { /* Allied Telesis LA-PCM */ 0x0ff0, 0x00, 0x00, 0xf4, 0 }, { /* APEX MultiCard */ 0x03f4, 0x00, 0x20, 0xe5, 0 }, { /* ASANTE FriendlyNet */ 0x4910, 0x00, 0x00, 0x94, @@ -193,7 +193,7 @@ static hw_info_t hw_info[] = { { /* NE2000 Compatible */ 0x0ff0, 0x00, 0xa0, 0x0c, 0 }, { /* Network General Sniffer */ 0x0ff0, 0x00, 0x00, 0x65, HAS_MISC_REG | HAS_IBM_MISC }, - { /* Panasonic VEL211 */ 0x0ff0, 0x00, 0x80, 0x45, + { /* Panasonic VEL211 */ 0x0ff0, 0x00, 0x80, 0x45, HAS_MISC_REG | HAS_IBM_MISC }, { /* PreMax PE-200 */ 0x07f0, 0x00, 0x20, 0xe0, 0 }, { /* RPTI EP400 */ 0x0110, 0x00, 0x40, 0x95, 0 }, @@ -330,7 +330,7 @@ static hw_info_t *get_hwinfo(struct pcmcia_device *link) for (j = 0; j < 6; j++) dev->dev_addr[j] = readb(base + (j<<1)); } - + iounmap(virt); j = pcmcia_release_window(link->win); if (j != CS_SUCCESS) @@ -490,7 +490,7 @@ static int try_io_port(struct pcmcia_device *link) if (link->io.NumPorts2 > 0) { /* for master/slave multifunction cards */ link->io.Attributes2 = IO_DATA_PATH_WIDTH_8; - link->irq.Attributes = + link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED; } } else { @@ -543,19 +543,19 @@ static int pcnet_config(struct pcmcia_device *link) manfid = le16_to_cpu(buf[0]); prodid = le16_to_cpu(buf[1]); } - + tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; tuple.Attributes = 0; CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); while (last_ret == CS_SUCCESS) { cistpl_cftable_entry_t *cfg = &(parse.cftable_entry); cistpl_io_t *io = &(parse.cftable_entry.io); - + if (pcmcia_get_tuple_data(link, &tuple) != 0 || pcmcia_parse_tuple(link, &tuple, &parse) != 0 || cfg->index == 0 || cfg->io.nwin == 0) goto next_entry; - + link->conf.ConfigIndex = cfg->index; /* For multifunction cards, by convention, we configure the network function with window 0, and serial with window 1 */ @@ -584,7 +584,7 @@ static int pcnet_config(struct pcmcia_device *link) } CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); - + if (link->io.NumPorts2 == 8) { link->conf.Attributes |= CONF_ENABLE_SPKR; link->conf.Status = CCSR_AUDIO_ENA; @@ -592,7 +592,7 @@ static int pcnet_config(struct pcmcia_device *link) if ((manfid == MANFID_IBM) && (prodid == PRODID_IBM_HOME_AND_AWAY)) link->conf.ConfigIndex |= 0x10; - + CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); dev->irq = link->irq.AssignedIRQ; dev->base_addr = link->io.BasePort1; @@ -614,7 +614,7 @@ static int pcnet_config(struct pcmcia_device *link) hw_info = get_ax88190(link); if (hw_info == NULL) hw_info = get_hwired(link); - + if (hw_info == NULL) { printk(KERN_NOTICE "pcnet_cs: unable to read hardware net" " address for io base %#3lx\n", dev->base_addr); @@ -631,7 +631,7 @@ static int pcnet_config(struct pcmcia_device *link) info->flags &= ~USE_BIG_BUF; if (!use_big_buf) info->flags &= ~USE_BIG_BUF; - + if (info->flags & USE_BIG_BUF) { start_pg = SOCKET_START_PG; stop_pg = SOCKET_STOP_PG; @@ -929,7 +929,7 @@ static void set_misc_reg(struct net_device *dev) kio_addr_t nic_base = dev->base_addr; pcnet_dev_t *info = PRIV(dev); u_char tmp; - + if (info->flags & HAS_MISC_REG) { tmp = inb_p(nic_base + PCNET_MISC) & ~3; if (dev->if_port == 2) @@ -998,7 +998,7 @@ static int pcnet_open(struct net_device *dev) link->open++; set_misc_reg(dev); - request_irq(dev->irq, ei_irq_wrapper, SA_SHIRQ, dev_info, dev); + request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, dev_info, dev); info->phy_id = info->eth_phy; info->link_status = 0x00; @@ -1022,7 +1022,7 @@ static int pcnet_close(struct net_device *dev) ei_close(dev); free_irq(dev->irq, dev); - + link->open--; netif_stop_queue(dev); del_timer_sync(&info->watchdog); @@ -1054,12 +1054,12 @@ static void pcnet_reset_8390(struct net_device *dev) udelay(100); } outb_p(ENISR_RESET, nic_base + EN0_ISR); /* Ack intr. */ - + if (i == 100) printk(KERN_ERR "%s: pcnet_reset_8390() did not complete.\n", dev->name); set_misc_reg(dev); - + } /* pcnet_reset_8390 */ /*====================================================================*/ @@ -1233,7 +1233,7 @@ static void dma_get_8390_hdr(struct net_device *dev, dev->name, ei_status.dmaing, ei_status.irqlock); return; } - + ei_status.dmaing |= 0x01; outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base + PCNET_CMD); outb_p(sizeof(struct e8390_pkt_hdr), nic_base + EN0_RCNTLO); @@ -1458,7 +1458,7 @@ static void shmem_get_8390_hdr(struct net_device *dev, void __iomem *xfer_start = ei_status.mem + (TX_PAGES<<8) + (ring_page << 8) - (ei_status.rx_start_page << 8); - + copyin(hdr, xfer_start, sizeof(struct e8390_pkt_hdr)); /* Fix for big endian systems */ hdr->count = le16_to_cpu(hdr->count); @@ -1473,7 +1473,7 @@ static void shmem_block_input(struct net_device *dev, int count, unsigned long offset = (TX_PAGES<<8) + ring_offset - (ei_status.rx_start_page << 8); char *buf = skb->data; - + if (offset + count > ei_status.priv) { /* We must wrap the input move. */ int semi_count = ei_status.priv - offset; @@ -1541,7 +1541,7 @@ static int setup_shmem_window(struct pcmcia_device *link, int start_pg, info->base = NULL; link->win = NULL; goto failed; } - + ei_status.mem = info->base + offset; ei_status.priv = req.Size; dev->mem_start = (u_long)ei_status.mem; @@ -1768,6 +1768,8 @@ static struct pcmcia_device_id pcnet_ids[] = { PCMCIA_DEVICE_CIS_PROD_ID12("NDC", "Ethernet", 0x01c43ae1, 0x00b2e941, "NE2K.cis"), PCMCIA_DEVICE_CIS_PROD_ID12("PMX ", "PE-200", 0x34f3f1c8, 0x10b59f8c, "PE-200.cis"), PCMCIA_DEVICE_CIS_PROD_ID12("TAMARACK", "Ethernet", 0xcf434fba, 0x00b2e941, "tamarack.cis"), + PCMCIA_DEVICE_PROD_ID123("Fast Ethernet", "CF Size PC Card", "1.0", + 0xb4be14e3, 0x43ac239b, 0x0877b627), PCMCIA_DEVICE_NULL }; MODULE_DEVICE_TABLE(pcmcia, pcnet_ids); diff --git a/drivers/net/pcmcia/smc91c92_cs.c b/drivers/net/pcmcia/smc91c92_cs.c index e74bf5014..a73d54553 100644 --- a/drivers/net/pcmcia/smc91c92_cs.c +++ b/drivers/net/pcmcia/smc91c92_cs.c @@ -1883,7 +1883,7 @@ static void smc_reset(struct net_device *dev) /* Set the Window 1 control, configuration and station addr registers. No point in writing the I/O base register ;-> */ SMC_SELECT_BANK(1); - /* Automatically release succesfully transmitted packets, + /* Automatically release successfully transmitted packets, Accept link errors, counter and Tx error interrupts. */ outw(CTL_AUTO_RELEASE | CTL_TE_ENABLE | CTL_CR_ENABLE, ioaddr + CONTROL); diff --git a/drivers/net/pcmcia/xirc2ps_cs.c b/drivers/net/pcmcia/xirc2ps_cs.c index 71f45056a..4122bb46f 100644 --- a/drivers/net/pcmcia/xirc2ps_cs.c +++ b/drivers/net/pcmcia/xirc2ps_cs.c @@ -345,6 +345,7 @@ typedef struct local_info_t { void __iomem *dingo_ccr; /* only used for CEM56 cards */ unsigned last_ptr_value; /* last packets transmitted value */ const char *manf_str; + struct work_struct tx_timeout_task; } local_info_t; /**************** @@ -352,6 +353,7 @@ typedef struct local_info_t { */ static int do_start_xmit(struct sk_buff *skb, struct net_device *dev); static void do_tx_timeout(struct net_device *dev); +static void xirc2ps_tx_timeout_task(void *data); static struct net_device_stats *do_get_stats(struct net_device *dev); static void set_addresses(struct net_device *dev); static void set_multicast_list(struct net_device *dev); @@ -589,6 +591,7 @@ xirc2ps_probe(struct pcmcia_device *link) #ifdef HAVE_TX_TIMEOUT dev->tx_timeout = do_tx_timeout; dev->watchdog_timeo = TX_TIMEOUT; + INIT_WORK(&local->tx_timeout_task, xirc2ps_tx_timeout_task, dev); #endif return xirc2ps_config(link); @@ -1341,17 +1344,24 @@ xirc2ps_interrupt(int irq, void *dev_id, struct pt_regs *regs) /*====================================================================*/ static void -do_tx_timeout(struct net_device *dev) +xirc2ps_tx_timeout_task(void *data) { - local_info_t *lp = netdev_priv(dev); - printk(KERN_NOTICE "%s: transmit timed out\n", dev->name); - lp->stats.tx_errors++; + struct net_device *dev = data; /* reset the card */ do_reset(dev,1); dev->trans_start = jiffies; netif_wake_queue(dev); } +static void +do_tx_timeout(struct net_device *dev) +{ + local_info_t *lp = netdev_priv(dev); + lp->stats.tx_errors++; + printk(KERN_NOTICE "%s: transmit timed out\n", dev->name); + schedule_work(&lp->tx_timeout_task); +} + static int do_start_xmit(struct sk_buff *skb, struct net_device *dev) { @@ -1359,7 +1369,7 @@ do_start_xmit(struct sk_buff *skb, struct net_device *dev) kio_addr_t ioaddr = dev->base_addr; int okay; unsigned freespace; - unsigned pktlen = skb? skb->len : 0; + unsigned pktlen = skb->len; DEBUG(1, "do_start_xmit(skb=%p, dev=%p) len=%u\n", skb, dev, pktlen); @@ -1374,8 +1384,7 @@ do_start_xmit(struct sk_buff *skb, struct net_device *dev) */ if (pktlen < ETH_ZLEN) { - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) + if (skb_padto(skb, ETH_ZLEN)) return 0; pktlen = ETH_ZLEN; } diff --git a/drivers/net/pcnet32.c b/drivers/net/pcnet32.c index fc08c4af5..d50bcb89d 100644 --- a/drivers/net/pcnet32.c +++ b/drivers/net/pcnet32.c @@ -58,18 +58,15 @@ static const char *const version = * PCI device identifiers for "new style" Linux PCI Device Drivers */ static struct pci_device_id pcnet32_pci_tbl[] = { - { PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_LANCE_HOME, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, - { PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_LANCE, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_LANCE_HOME), }, + { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_LANCE), }, /* * Adapters that were sold with IBM's RS/6000 or pSeries hardware have * the incorrect vendor id. */ - { PCI_VENDOR_ID_TRIDENT, PCI_DEVICE_ID_AMD_LANCE, - PCI_ANY_ID, PCI_ANY_ID, - PCI_CLASS_NETWORK_ETHERNET << 8, 0xffff00, 0}, + { PCI_DEVICE(PCI_VENDOR_ID_TRIDENT, PCI_DEVICE_ID_AMD_LANCE), + .class = (PCI_CLASS_NETWORK_ETHERNET << 8), .class_mask = 0xffff00, }, { } /* terminate list */ }; @@ -188,6 +185,25 @@ static int homepna[MAX_UNITS]; #define PCNET32_TOTAL_SIZE 0x20 +#define CSR0 0 +#define CSR0_INIT 0x1 +#define CSR0_START 0x2 +#define CSR0_STOP 0x4 +#define CSR0_TXPOLL 0x8 +#define CSR0_INTEN 0x40 +#define CSR0_IDON 0x0100 +#define CSR0_NORMAL (CSR0_START | CSR0_INTEN) +#define PCNET32_INIT_LOW 1 +#define PCNET32_INIT_HIGH 2 +#define CSR3 3 +#define CSR4 4 +#define CSR5 5 +#define CSR5_SUSPEND 0x0001 +#define CSR15 15 +#define PCNET32_MC_FILTER 8 + +#define PCNET32_79C970A 0x2621 + /* The PCNET32 Rx and Tx ring descriptors. */ struct pcnet32_rx_head { u32 base; @@ -275,9 +291,9 @@ struct pcnet32_private { /* each bit indicates an available PHY */ u32 phymask; + unsigned short chip_version; /* which variant this is */ }; -static void pcnet32_probe_vlbus(void); static int pcnet32_probe_pci(struct pci_dev *, const struct pci_device_id *); static int pcnet32_probe1(unsigned long, int, struct pci_dev *); static int pcnet32_open(struct net_device *); @@ -309,12 +325,6 @@ static int pcnet32_alloc_ring(struct net_device *dev, char *name); static void pcnet32_free_ring(struct net_device *dev); static void pcnet32_check_media(struct net_device *dev, int verbose); -enum pci_flags_bit { - PCI_USES_IO = 1, PCI_USES_MEM = 2, PCI_USES_MASTER = 4, - PCI_ADDR0 = 0x10 << 0, PCI_ADDR1 = 0x10 << 1, PCI_ADDR2 = - 0x10 << 2, PCI_ADDR3 = 0x10 << 3, -}; - static u16 pcnet32_wio_read_csr(unsigned long addr, int index) { outw(index, addr + PCNET32_WIO_RAP); @@ -425,6 +435,238 @@ static struct pcnet32_access pcnet32_dwio = { .reset = pcnet32_dwio_reset }; +static void pcnet32_netif_stop(struct net_device *dev) +{ + dev->trans_start = jiffies; + netif_poll_disable(dev); + netif_tx_disable(dev); +} + +static void pcnet32_netif_start(struct net_device *dev) +{ + netif_wake_queue(dev); + netif_poll_enable(dev); +} + +/* + * Allocate space for the new sized tx ring. + * Free old resources + * Save new resources. + * Any failure keeps old resources. + * Must be called with lp->lock held. + */ +static void pcnet32_realloc_tx_ring(struct net_device *dev, + struct pcnet32_private *lp, + unsigned int size) +{ + dma_addr_t new_ring_dma_addr; + dma_addr_t *new_dma_addr_list; + struct pcnet32_tx_head *new_tx_ring; + struct sk_buff **new_skb_list; + + pcnet32_purge_tx_ring(dev); + + new_tx_ring = pci_alloc_consistent(lp->pci_dev, + sizeof(struct pcnet32_tx_head) * + (1 << size), + &new_ring_dma_addr); + if (new_tx_ring == NULL) { + if (netif_msg_drv(lp)) + printk("\n" KERN_ERR + "%s: Consistent memory allocation failed.\n", + dev->name); + return; + } + memset(new_tx_ring, 0, sizeof(struct pcnet32_tx_head) * (1 << size)); + + new_dma_addr_list = kcalloc((1 << size), sizeof(dma_addr_t), + GFP_ATOMIC); + if (!new_dma_addr_list) { + if (netif_msg_drv(lp)) + printk("\n" KERN_ERR + "%s: Memory allocation failed.\n", dev->name); + goto free_new_tx_ring; + } + + new_skb_list = kcalloc((1 << size), sizeof(struct sk_buff *), + GFP_ATOMIC); + if (!new_skb_list) { + if (netif_msg_drv(lp)) + printk("\n" KERN_ERR + "%s: Memory allocation failed.\n", dev->name); + goto free_new_lists; + } + + kfree(lp->tx_skbuff); + kfree(lp->tx_dma_addr); + pci_free_consistent(lp->pci_dev, + sizeof(struct pcnet32_tx_head) * + lp->tx_ring_size, lp->tx_ring, + lp->tx_ring_dma_addr); + + lp->tx_ring_size = (1 << size); + lp->tx_mod_mask = lp->tx_ring_size - 1; + lp->tx_len_bits = (size << 12); + lp->tx_ring = new_tx_ring; + lp->tx_ring_dma_addr = new_ring_dma_addr; + lp->tx_dma_addr = new_dma_addr_list; + lp->tx_skbuff = new_skb_list; + return; + + free_new_lists: + kfree(new_dma_addr_list); + free_new_tx_ring: + pci_free_consistent(lp->pci_dev, + sizeof(struct pcnet32_tx_head) * + (1 << size), + new_tx_ring, + new_ring_dma_addr); + return; +} + +/* + * Allocate space for the new sized rx ring. + * Re-use old receive buffers. + * alloc extra buffers + * free unneeded buffers + * free unneeded buffers + * Save new resources. + * Any failure keeps old resources. + * Must be called with lp->lock held. + */ +static void pcnet32_realloc_rx_ring(struct net_device *dev, + struct pcnet32_private *lp, + unsigned int size) +{ + dma_addr_t new_ring_dma_addr; + dma_addr_t *new_dma_addr_list; + struct pcnet32_rx_head *new_rx_ring; + struct sk_buff **new_skb_list; + int new, overlap; + + new_rx_ring = pci_alloc_consistent(lp->pci_dev, + sizeof(struct pcnet32_rx_head) * + (1 << size), + &new_ring_dma_addr); + if (new_rx_ring == NULL) { + if (netif_msg_drv(lp)) + printk("\n" KERN_ERR + "%s: Consistent memory allocation failed.\n", + dev->name); + return; + } + memset(new_rx_ring, 0, sizeof(struct pcnet32_rx_head) * (1 << size)); + + new_dma_addr_list = kcalloc((1 << size), sizeof(dma_addr_t), + GFP_ATOMIC); + if (!new_dma_addr_list) { + if (netif_msg_drv(lp)) + printk("\n" KERN_ERR + "%s: Memory allocation failed.\n", dev->name); + goto free_new_rx_ring; + } + + new_skb_list = kcalloc((1 << size), sizeof(struct sk_buff *), + GFP_ATOMIC); + if (!new_skb_list) { + if (netif_msg_drv(lp)) + printk("\n" KERN_ERR + "%s: Memory allocation failed.\n", dev->name); + goto free_new_lists; + } + + /* first copy the current receive buffers */ + overlap = min(size, lp->rx_ring_size); + for (new = 0; new < overlap; new++) { + new_rx_ring[new] = lp->rx_ring[new]; + new_dma_addr_list[new] = lp->rx_dma_addr[new]; + new_skb_list[new] = lp->rx_skbuff[new]; + } + /* now allocate any new buffers needed */ + for (; new < size; new++ ) { + struct sk_buff *rx_skbuff; + new_skb_list[new] = dev_alloc_skb(PKT_BUF_SZ); + if (!(rx_skbuff = new_skb_list[new])) { + /* keep the original lists and buffers */ + if (netif_msg_drv(lp)) + printk(KERN_ERR + "%s: pcnet32_realloc_rx_ring dev_alloc_skb failed.\n", + dev->name); + goto free_all_new; + } + skb_reserve(rx_skbuff, 2); + + new_dma_addr_list[new] = + pci_map_single(lp->pci_dev, rx_skbuff->data, + PKT_BUF_SZ - 2, PCI_DMA_FROMDEVICE); + new_rx_ring[new].base = (u32) le32_to_cpu(new_dma_addr_list[new]); + new_rx_ring[new].buf_length = le16_to_cpu(2 - PKT_BUF_SZ); + new_rx_ring[new].status = le16_to_cpu(0x8000); + } + /* and free any unneeded buffers */ + for (; new < lp->rx_ring_size; new++) { + if (lp->rx_skbuff[new]) { + pci_unmap_single(lp->pci_dev, lp->rx_dma_addr[new], + PKT_BUF_SZ - 2, PCI_DMA_FROMDEVICE); + dev_kfree_skb(lp->rx_skbuff[new]); + } + } + + kfree(lp->rx_skbuff); + kfree(lp->rx_dma_addr); + pci_free_consistent(lp->pci_dev, + sizeof(struct pcnet32_rx_head) * + lp->rx_ring_size, lp->rx_ring, + lp->rx_ring_dma_addr); + + lp->rx_ring_size = (1 << size); + lp->rx_mod_mask = lp->rx_ring_size - 1; + lp->rx_len_bits = (size << 4); + lp->rx_ring = new_rx_ring; + lp->rx_ring_dma_addr = new_ring_dma_addr; + lp->rx_dma_addr = new_dma_addr_list; + lp->rx_skbuff = new_skb_list; + return; + + free_all_new: + for (; --new >= lp->rx_ring_size; ) { + if (new_skb_list[new]) { + pci_unmap_single(lp->pci_dev, new_dma_addr_list[new], + PKT_BUF_SZ - 2, PCI_DMA_FROMDEVICE); + dev_kfree_skb(new_skb_list[new]); + } + } + kfree(new_skb_list); + free_new_lists: + kfree(new_dma_addr_list); + free_new_rx_ring: + pci_free_consistent(lp->pci_dev, + sizeof(struct pcnet32_rx_head) * + (1 << size), + new_rx_ring, + new_ring_dma_addr); + return; +} + +static void pcnet32_purge_rx_ring(struct net_device *dev) +{ + struct pcnet32_private *lp = dev->priv; + int i; + + /* free all allocated skbuffs */ + for (i = 0; i < lp->rx_ring_size; i++) { + lp->rx_ring[i].status = 0; /* CPU owns buffer */ + wmb(); /* Make sure adapter sees owner change */ + if (lp->rx_skbuff[i]) { + pci_unmap_single(lp->pci_dev, lp->rx_dma_addr[i], + PKT_BUF_SZ - 2, PCI_DMA_FROMDEVICE); + dev_kfree_skb_any(lp->rx_skbuff[i]); + } + lp->rx_skbuff[i] = NULL; + lp->rx_dma_addr[i] = 0; + } +} + #ifdef CONFIG_NET_POLL_CONTROLLER static void pcnet32_poll_controller(struct net_device *dev) { @@ -485,9 +727,11 @@ static u32 pcnet32_get_link(struct net_device *dev) spin_lock_irqsave(&lp->lock, flags); if (lp->mii) { r = mii_link_ok(&lp->mii_if); - } else { + } else if (lp->chip_version >= PCNET32_79C970A) { ulong ioaddr = dev->base_addr; /* card base I/O address */ r = (lp->a.read_bcr(ioaddr, 4) != 0xc0); + } else { /* can not detect link on really old chips */ + r = 1; } spin_unlock_irqrestore(&lp->lock, flags); @@ -525,10 +769,10 @@ static void pcnet32_get_ringparam(struct net_device *dev, { struct pcnet32_private *lp = dev->priv; - ering->tx_max_pending = TX_MAX_RING_SIZE - 1; - ering->tx_pending = lp->tx_ring_size - 1; - ering->rx_max_pending = RX_MAX_RING_SIZE - 1; - ering->rx_pending = lp->rx_ring_size - 1; + ering->tx_max_pending = TX_MAX_RING_SIZE; + ering->tx_pending = lp->tx_ring_size; + ering->rx_max_pending = RX_MAX_RING_SIZE; + ering->rx_pending = lp->rx_ring_size; } static int pcnet32_set_ringparam(struct net_device *dev, @@ -536,56 +780,53 @@ static int pcnet32_set_ringparam(struct net_device *dev, { struct pcnet32_private *lp = dev->priv; unsigned long flags; + unsigned int size; + ulong ioaddr = dev->base_addr; int i; if (ering->rx_mini_pending || ering->rx_jumbo_pending) return -EINVAL; if (netif_running(dev)) - pcnet32_close(dev); + pcnet32_netif_stop(dev); spin_lock_irqsave(&lp->lock, flags); - pcnet32_free_ring(dev); - lp->tx_ring_size = - min(ering->tx_pending, (unsigned int)TX_MAX_RING_SIZE); - lp->rx_ring_size = - min(ering->rx_pending, (unsigned int)RX_MAX_RING_SIZE); + lp->a.write_csr(ioaddr, CSR0, CSR0_STOP); /* stop the chip */ + + size = min(ering->tx_pending, (unsigned int)TX_MAX_RING_SIZE); /* set the minimum ring size to 4, to allow the loopback test to work * unchanged. */ for (i = 2; i <= PCNET32_LOG_MAX_TX_BUFFERS; i++) { - if (lp->tx_ring_size <= (1 << i)) + if (size <= (1 << i)) break; } - lp->tx_ring_size = (1 << i); - lp->tx_mod_mask = lp->tx_ring_size - 1; - lp->tx_len_bits = (i << 12); - + if ((1 << i) != lp->tx_ring_size) + pcnet32_realloc_tx_ring(dev, lp, i); + + size = min(ering->rx_pending, (unsigned int)RX_MAX_RING_SIZE); for (i = 2; i <= PCNET32_LOG_MAX_RX_BUFFERS; i++) { - if (lp->rx_ring_size <= (1 << i)) + if (size <= (1 << i)) break; } - lp->rx_ring_size = (1 << i); - lp->rx_mod_mask = lp->rx_ring_size - 1; - lp->rx_len_bits = (i << 4); + if ((1 << i) != lp->rx_ring_size) + pcnet32_realloc_rx_ring(dev, lp, i); + + dev->weight = lp->rx_ring_size / 2; - if (pcnet32_alloc_ring(dev, dev->name)) { - pcnet32_free_ring(dev); - spin_unlock_irqrestore(&lp->lock, flags); - return -ENOMEM; + if (netif_running(dev)) { + pcnet32_netif_start(dev); + pcnet32_restart(dev, CSR0_NORMAL); } spin_unlock_irqrestore(&lp->lock, flags); - if (pcnet32_debug & NETIF_MSG_DRV) - printk(KERN_INFO PFX + if (netif_msg_drv(lp)) + printk(KERN_INFO "%s: Ring Param Settings: RX: %d, TX: %d\n", dev->name, lp->rx_ring_size, lp->tx_ring_size); - if (netif_running(dev)) - pcnet32_open(dev); - return 0; } @@ -639,29 +880,27 @@ static int pcnet32_loopback_test(struct net_device *dev, uint64_t * data1) unsigned long flags; unsigned long ticks; - *data1 = 1; /* status of test, default to fail */ rc = 1; /* default to fail */ if (netif_running(dev)) pcnet32_close(dev); spin_lock_irqsave(&lp->lock, flags); + lp->a.write_csr(ioaddr, CSR0, CSR0_STOP); /* stop the chip */ + + numbuffs = min(numbuffs, (int)min(lp->rx_ring_size, lp->tx_ring_size)); /* Reset the PCNET32 */ lp->a.reset(ioaddr); + lp->a.write_csr(ioaddr, CSR4, 0x0915); /* switch pcnet32 to 32bit mode */ lp->a.write_bcr(ioaddr, 20, 2); - lp->init_block.mode = - le16_to_cpu((lp->options & PCNET32_PORT_PORTSEL) << 7); - lp->init_block.filter[0] = 0; - lp->init_block.filter[1] = 0; - /* purge & init rings but don't actually restart */ pcnet32_restart(dev, 0x0000); - lp->a.write_csr(ioaddr, 0, 0x0004); /* Set STOP bit */ + lp->a.write_csr(ioaddr, CSR0, CSR0_STOP); /* Set STOP bit */ /* Initialize Transmit buffers. */ size = data_len + 15; @@ -703,14 +942,15 @@ static int pcnet32_loopback_test(struct net_device *dev, uint64_t * data1) } } - x = a->read_bcr(ioaddr, 32); /* set internal loopback in BSR32 */ - x = x | 0x0002; - a->write_bcr(ioaddr, 32, x); + x = a->read_bcr(ioaddr, 32); /* set internal loopback in BCR32 */ + a->write_bcr(ioaddr, 32, x | 0x0002); - lp->a.write_csr(ioaddr, 15, 0x0044); /* set int loopback in CSR15 */ + /* set int loopback in CSR15 */ + x = a->read_csr(ioaddr, CSR15) & 0xfffc; + lp->a.write_csr(ioaddr, CSR15, x | 0x0044); teststatus = le16_to_cpu(0x8000); - lp->a.write_csr(ioaddr, 0, 0x0002); /* Set STRT bit */ + lp->a.write_csr(ioaddr, CSR0, CSR0_START); /* Set STRT bit */ /* Check status of descriptors */ for (x = 0; x < numbuffs; x++) { @@ -718,7 +958,7 @@ static int pcnet32_loopback_test(struct net_device *dev, uint64_t * data1) rmb(); while ((lp->rx_ring[x].status & teststatus) && (ticks < 200)) { spin_unlock_irqrestore(&lp->lock, flags); - mdelay(1); + msleep(1); spin_lock_irqsave(&lp->lock, flags); rmb(); ticks++; @@ -731,7 +971,7 @@ static int pcnet32_loopback_test(struct net_device *dev, uint64_t * data1) } } - lp->a.write_csr(ioaddr, 0, 0x0004); /* Set STOP bit */ + lp->a.write_csr(ioaddr, CSR0, CSR0_STOP); /* Set STOP bit */ wmb(); if (netif_msg_hw(lp) && netif_msg_pktdata(lp)) { printk(KERN_DEBUG "%s: RX loopback packets:\n", dev->name); @@ -764,25 +1004,24 @@ static int pcnet32_loopback_test(struct net_device *dev, uint64_t * data1) } x++; } - if (!rc) { - *data1 = 0; - } clean_up: + *data1 = rc; pcnet32_purge_tx_ring(dev); - x = a->read_csr(ioaddr, 15) & 0xFFFF; - a->write_csr(ioaddr, 15, (x & ~0x0044)); /* reset bits 6 and 2 */ - x = a->read_bcr(ioaddr, 32); /* reset internal loopback */ - x = x & ~0x0002; - a->write_bcr(ioaddr, 32, x); + x = a->read_csr(ioaddr, CSR15); + a->write_csr(ioaddr, CSR15, (x & ~0x0044)); /* reset bits 6 and 2 */ - spin_unlock_irqrestore(&lp->lock, flags); + x = a->read_bcr(ioaddr, 32); /* reset internal loopback */ + a->write_bcr(ioaddr, 32, (x & ~0x0002)); if (netif_running(dev)) { + spin_unlock_irqrestore(&lp->lock, flags); pcnet32_open(dev); } else { + pcnet32_purge_rx_ring(dev); lp->a.write_bcr(ioaddr, 20, 4); /* return to 16bit mode */ + spin_unlock_irqrestore(&lp->lock, flags); } return (rc); @@ -845,6 +1084,47 @@ static int pcnet32_phys_id(struct net_device *dev, u32 data) return 0; } +/* + * lp->lock must be held. + */ +static int pcnet32_suspend(struct net_device *dev, unsigned long *flags, + int can_sleep) +{ + int csr5; + struct pcnet32_private *lp = dev->priv; + struct pcnet32_access *a = &lp->a; + ulong ioaddr = dev->base_addr; + int ticks; + + /* really old chips have to be stopped. */ + if (lp->chip_version < PCNET32_79C970A) + return 0; + + /* set SUSPEND (SPND) - CSR5 bit 0 */ + csr5 = a->read_csr(ioaddr, CSR5); + a->write_csr(ioaddr, CSR5, csr5 | CSR5_SUSPEND); + + /* poll waiting for bit to be set */ + ticks = 0; + while (!(a->read_csr(ioaddr, CSR5) & CSR5_SUSPEND)) { + spin_unlock_irqrestore(&lp->lock, *flags); + if (can_sleep) + msleep(1); + else + mdelay(1); + spin_lock_irqsave(&lp->lock, *flags); + ticks++; + if (ticks > 200) { + if (netif_msg_hw(lp)) + printk(KERN_DEBUG + "%s: Error getting into suspend!\n", + dev->name); + return 0; + } + } + return 1; +} + #define PCNET32_REGS_PER_PHY 32 #define PCNET32_MAX_PHYS 32 static int pcnet32_get_regs_len(struct net_device *dev) @@ -863,32 +1143,13 @@ static void pcnet32_get_regs(struct net_device *dev, struct ethtool_regs *regs, struct pcnet32_private *lp = dev->priv; struct pcnet32_access *a = &lp->a; ulong ioaddr = dev->base_addr; - int ticks; unsigned long flags; spin_lock_irqsave(&lp->lock, flags); - csr0 = a->read_csr(ioaddr, 0); - if (!(csr0 & 0x0004)) { /* If not stopped */ - /* set SUSPEND (SPND) - CSR5 bit 0 */ - a->write_csr(ioaddr, 5, 0x0001); - - /* poll waiting for bit to be set */ - ticks = 0; - while (!(a->read_csr(ioaddr, 5) & 0x0001)) { - spin_unlock_irqrestore(&lp->lock, flags); - mdelay(1); - spin_lock_irqsave(&lp->lock, flags); - ticks++; - if (ticks > 200) { - if (netif_msg_hw(lp)) - printk(KERN_DEBUG - "%s: Error getting into suspend!\n", - dev->name); - break; - } - } - } + csr0 = a->read_csr(ioaddr, CSR0); + if (!(csr0 & CSR0_STOP)) /* If not stopped */ + pcnet32_suspend(dev, &flags, 1); /* read address PROM */ for (i = 0; i < 16; i += 2) @@ -925,9 +1186,12 @@ static void pcnet32_get_regs(struct net_device *dev, struct ethtool_regs *regs, } } - if (!(csr0 & 0x0004)) { /* If not stopped */ + if (!(csr0 & CSR0_STOP)) { /* If not stopped */ + int csr5; + /* clear SUSPEND (SPND) - CSR5 bit 0 */ - a->write_csr(ioaddr, 5, 0x0000); + csr5 = a->read_csr(ioaddr, CSR5); + a->write_csr(ioaddr, CSR5, csr5 & (~CSR5_SUSPEND)); } spin_unlock_irqrestore(&lp->lock, flags); @@ -958,7 +1222,7 @@ static struct ethtool_ops pcnet32_ethtool_ops = { /* only probes for non-PCI devices, the rest are handled by * pci_register_driver via pcnet32_probe_pci */ -static void __devinit pcnet32_probe_vlbus(void) +static void __devinit pcnet32_probe_vlbus(unsigned int *pcnet32_portlist) { unsigned int *port, ioaddr; @@ -1274,6 +1538,7 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) lp->mii_if.reg_num_mask = 0x1f; lp->dxsuflo = dxsuflo; lp->mii = mii; + lp->chip_version = chip_version; lp->msg_enable = pcnet32_debug; if ((cards_found >= MAX_UNITS) || (options[cards_found] > sizeof(options_mapping))) @@ -1442,7 +1707,7 @@ static int pcnet32_alloc_ring(struct net_device *dev, char *name) lp->tx_ring_size, &lp->tx_ring_dma_addr); if (lp->tx_ring == NULL) { - if (pcnet32_debug & NETIF_MSG_DRV) + if (netif_msg_drv(lp)) printk("\n" KERN_ERR PFX "%s: Consistent memory allocation failed.\n", name); @@ -1454,52 +1719,48 @@ static int pcnet32_alloc_ring(struct net_device *dev, char *name) lp->rx_ring_size, &lp->rx_ring_dma_addr); if (lp->rx_ring == NULL) { - if (pcnet32_debug & NETIF_MSG_DRV) + if (netif_msg_drv(lp)) printk("\n" KERN_ERR PFX "%s: Consistent memory allocation failed.\n", name); return -ENOMEM; } - lp->tx_dma_addr = kmalloc(sizeof(dma_addr_t) * lp->tx_ring_size, + lp->tx_dma_addr = kcalloc(lp->tx_ring_size, sizeof(dma_addr_t), GFP_ATOMIC); if (!lp->tx_dma_addr) { - if (pcnet32_debug & NETIF_MSG_DRV) + if (netif_msg_drv(lp)) printk("\n" KERN_ERR PFX "%s: Memory allocation failed.\n", name); return -ENOMEM; } - memset(lp->tx_dma_addr, 0, sizeof(dma_addr_t) * lp->tx_ring_size); - lp->rx_dma_addr = kmalloc(sizeof(dma_addr_t) * lp->rx_ring_size, + lp->rx_dma_addr = kcalloc(lp->rx_ring_size, sizeof(dma_addr_t), GFP_ATOMIC); if (!lp->rx_dma_addr) { - if (pcnet32_debug & NETIF_MSG_DRV) + if (netif_msg_drv(lp)) printk("\n" KERN_ERR PFX "%s: Memory allocation failed.\n", name); return -ENOMEM; } - memset(lp->rx_dma_addr, 0, sizeof(dma_addr_t) * lp->rx_ring_size); - lp->tx_skbuff = kmalloc(sizeof(struct sk_buff *) * lp->tx_ring_size, + lp->tx_skbuff = kcalloc(lp->tx_ring_size, sizeof(struct sk_buff *), GFP_ATOMIC); if (!lp->tx_skbuff) { - if (pcnet32_debug & NETIF_MSG_DRV) + if (netif_msg_drv(lp)) printk("\n" KERN_ERR PFX "%s: Memory allocation failed.\n", name); return -ENOMEM; } - memset(lp->tx_skbuff, 0, sizeof(struct sk_buff *) * lp->tx_ring_size); - lp->rx_skbuff = kmalloc(sizeof(struct sk_buff *) * lp->rx_ring_size, + lp->rx_skbuff = kcalloc(lp->rx_ring_size, sizeof(struct sk_buff *), GFP_ATOMIC); if (!lp->rx_skbuff) { - if (pcnet32_debug & NETIF_MSG_DRV) + if (netif_msg_drv(lp)) printk("\n" KERN_ERR PFX "%s: Memory allocation failed.\n", name); return -ENOMEM; } - memset(lp->rx_skbuff, 0, sizeof(struct sk_buff *) * lp->rx_ring_size); return 0; } @@ -1547,7 +1808,7 @@ static int pcnet32_open(struct net_device *dev) unsigned long flags; if (request_irq(dev->irq, &pcnet32_interrupt, - lp->shared_irq ? SA_SHIRQ : 0, dev->name, + lp->shared_irq ? IRQF_SHARED : 0, dev->name, (void *)dev)) { return -EAGAIN; } @@ -1588,10 +1849,7 @@ static int pcnet32_open(struct net_device *dev) val |= 2; } else if (lp->options & PCNET32_PORT_ASEL) { /* workaround of xSeries250, turn on for 79C975 only */ - i = ((lp->a.read_csr(ioaddr, 88) | - (lp->a. - read_csr(ioaddr, 89) << 16)) >> 12) & 0xffff; - if (i == 0x2627) + if (lp->chip_version == 0x2627) val |= 3; } lp->a.write_bcr(ioaddr, 9, val); @@ -1735,9 +1993,11 @@ static int pcnet32_open(struct net_device *dev) netif_start_queue(dev); - /* Print the link status and start the watchdog */ - pcnet32_check_media(dev, 1); - mod_timer(&(lp->watchdog_timer), PCNET32_WATCHDOG_TIMEOUT); + if (lp->chip_version >= PCNET32_79C970A) { + /* Print the link status and start the watchdog */ + pcnet32_check_media(dev, 1); + mod_timer(&(lp->watchdog_timer), PCNET32_WATCHDOG_TIMEOUT); + } i = 0; while (i++ < 100) @@ -1763,16 +2023,7 @@ static int pcnet32_open(struct net_device *dev) err_free_ring: /* free any allocated skbuffs */ - for (i = 0; i < lp->rx_ring_size; i++) { - lp->rx_ring[i].status = 0; - if (lp->rx_skbuff[i]) { - pci_unmap_single(lp->pci_dev, lp->rx_dma_addr[i], - PKT_BUF_SZ - 2, PCI_DMA_FROMDEVICE); - dev_kfree_skb(lp->rx_skbuff[i]); - } - lp->rx_skbuff[i] = NULL; - lp->rx_dma_addr[i] = 0; - } + pcnet32_purge_rx_ring(dev); /* * Switch back to 16bit mode to avoid problems with dumb @@ -2354,7 +2605,6 @@ static int pcnet32_close(struct net_device *dev) { unsigned long ioaddr = dev->base_addr; struct pcnet32_private *lp = dev->priv; - int i; unsigned long flags; del_timer_sync(&lp->watchdog_timer); @@ -2385,31 +2635,8 @@ static int pcnet32_close(struct net_device *dev) spin_lock_irqsave(&lp->lock, flags); - /* free all allocated skbuffs */ - for (i = 0; i < lp->rx_ring_size; i++) { - lp->rx_ring[i].status = 0; - wmb(); /* Make sure adapter sees owner change */ - if (lp->rx_skbuff[i]) { - pci_unmap_single(lp->pci_dev, lp->rx_dma_addr[i], - PKT_BUF_SZ - 2, PCI_DMA_FROMDEVICE); - dev_kfree_skb(lp->rx_skbuff[i]); - } - lp->rx_skbuff[i] = NULL; - lp->rx_dma_addr[i] = 0; - } - - for (i = 0; i < lp->tx_ring_size; i++) { - lp->tx_ring[i].status = 0; /* CPU owns buffer */ - wmb(); /* Make sure adapter sees owner change */ - if (lp->tx_skbuff[i]) { - pci_unmap_single(lp->pci_dev, lp->tx_dma_addr[i], - lp->tx_skbuff[i]->len, - PCI_DMA_TODEVICE); - dev_kfree_skb(lp->tx_skbuff[i]); - } - lp->tx_skbuff[i] = NULL; - lp->tx_dma_addr[i] = 0; - } + pcnet32_purge_rx_ring(dev); + pcnet32_purge_tx_ring(dev); spin_unlock_irqrestore(&lp->lock, flags); @@ -2439,6 +2666,7 @@ static void pcnet32_load_multicast(struct net_device *dev) volatile struct pcnet32_init_block *ib = &lp->init_block; volatile u16 *mcast_table = (u16 *) & ib->filter; struct dev_mc_list *dmi = dev->mc_list; + unsigned long ioaddr = dev->base_addr; char *addrs; int i; u32 crc; @@ -2447,6 +2675,10 @@ static void pcnet32_load_multicast(struct net_device *dev) if (dev->flags & IFF_ALLMULTI) { ib->filter[0] = 0xffffffff; ib->filter[1] = 0xffffffff; + lp->a.write_csr(ioaddr, PCNET32_MC_FILTER, 0xffff); + lp->a.write_csr(ioaddr, PCNET32_MC_FILTER+1, 0xffff); + lp->a.write_csr(ioaddr, PCNET32_MC_FILTER+2, 0xffff); + lp->a.write_csr(ioaddr, PCNET32_MC_FILTER+3, 0xffff); return; } /* clear the multicast filter */ @@ -2468,6 +2700,9 @@ static void pcnet32_load_multicast(struct net_device *dev) le16_to_cpu(le16_to_cpu(mcast_table[crc >> 4]) | (1 << (crc & 0xf))); } + for (i = 0; i < 4; i++) + lp->a.write_csr(ioaddr, PCNET32_MC_FILTER + i, + le16_to_cpu(mcast_table[i])); return; } @@ -2478,8 +2713,11 @@ static void pcnet32_set_multicast_list(struct net_device *dev) { unsigned long ioaddr = dev->base_addr, flags; struct pcnet32_private *lp = dev->priv; + int csr15, suspended; spin_lock_irqsave(&lp->lock, flags); + suspended = pcnet32_suspend(dev, &flags, 0); + csr15 = lp->a.read_csr(ioaddr, CSR15); if (dev->flags & IFF_PROMISC) { /* Log any net taps. */ if (netif_msg_hw(lp)) @@ -2488,15 +2726,24 @@ static void pcnet32_set_multicast_list(struct net_device *dev) lp->init_block.mode = le16_to_cpu(0x8000 | (lp->options & PCNET32_PORT_PORTSEL) << 7); + lp->a.write_csr(ioaddr, CSR15, csr15 | 0x8000); } else { lp->init_block.mode = le16_to_cpu((lp->options & PCNET32_PORT_PORTSEL) << 7); + lp->a.write_csr(ioaddr, CSR15, csr15 & 0x7fff); pcnet32_load_multicast(dev); } - lp->a.write_csr(ioaddr, 0, 0x0004); /* Temporarily stop the lance. */ - pcnet32_restart(dev, 0x0042); /* Resume normal operation */ - netif_wake_queue(dev); + if (suspended) { + int csr5; + /* clear SUSPEND (SPND) - CSR5 bit 0 */ + csr5 = lp->a.read_csr(ioaddr, CSR5); + lp->a.write_csr(ioaddr, CSR5, csr5 & (~CSR5_SUSPEND)); + } else { + lp->a.write_csr(ioaddr, CSR0, CSR0_STOP); + pcnet32_restart(dev, CSR0_NORMAL); + netif_wake_queue(dev); + } spin_unlock_irqrestore(&lp->lock, flags); } @@ -2736,7 +2983,7 @@ static int __init pcnet32_init_module(void) /* should we find any remaining VLbus devices ? */ if (pcnet32vlb) - pcnet32_probe_vlbus(); + pcnet32_probe_vlbus(pcnet32_portlist); if (cards_found && (pcnet32_debug & NETIF_MSG_PROBE)) printk(KERN_INFO PFX "%d cards_found.\n", cards_found); diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig index fa39b944b..b79ec0d74 100644 --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig @@ -44,6 +44,34 @@ config CICADA_PHY depends on PHYLIB ---help--- Currently supports the cis8204 +config VITESSE_PHY + tristate "Drivers for the Vitesse PHYs" + depends on PHYLIB + ---help--- + Currently supports the vsc8244 + +config SMSC_PHY + tristate "Drivers for SMSC PHYs" + depends on PHYLIB + ---help--- + Currently supports the LAN83C185 PHY + +config FIXED_PHY + tristate "Drivers for PHY emulation on fixed speed/link" + depends on PHYLIB + ---help--- + Adds the driver to PHY layer to cover the boards that do not have any PHY bound, + but with the ability to manipulate with speed/link in software. The relavant MII + speed/duplex parameters could be effectively handled in user-specified fuction. + Currently tested with mpc866ads. + +config FIXED_MII_10_FDX + bool "Emulation for 10M Fdx fixed PHY behavior" + depends on FIXED_PHY + +config FIXED_MII_100_FDX + bool "Emulation for 100M Fdx fixed PHY behavior" + depends on FIXED_PHY endmenu diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile index e4116a5fb..320f83231 100644 --- a/drivers/net/phy/Makefile +++ b/drivers/net/phy/Makefile @@ -8,3 +8,6 @@ obj-$(CONFIG_DAVICOM_PHY) += davicom.o obj-$(CONFIG_CICADA_PHY) += cicada.o obj-$(CONFIG_LXT_PHY) += lxt.o obj-$(CONFIG_QSEMI_PHY) += qsemi.o +obj-$(CONFIG_SMSC_PHY) += smsc.o +obj-$(CONFIG_VITESSE_PHY) += vitesse.o +obj-$(CONFIG_FIXED_PHY) += fixed.o diff --git a/drivers/net/phy/cicada.c b/drivers/net/phy/cicada.c index 7d8d53425..ae60e6e41 100644 --- a/drivers/net/phy/cicada.c +++ b/drivers/net/phy/cicada.c @@ -13,7 +13,6 @@ * option) any later version. * */ -#include #include #include #include @@ -104,7 +103,22 @@ static int cis820x_config_intr(struct phy_device *phydev) return err; } -/* Cicada 820x */ +/* Cicada 8201, a.k.a Vitesse VSC8201 */ +static struct phy_driver cis8201_driver = { + .phy_id = 0x000fc410, + .name = "Cicada Cis8201", + .phy_id_mask = 0x000ffff0, + .features = PHY_GBIT_FEATURES, + .flags = PHY_HAS_INTERRUPT, + .config_init = &cis820x_config_init, + .config_aneg = &genphy_config_aneg, + .read_status = &genphy_read_status, + .ack_interrupt = &cis820x_ack_interrupt, + .config_intr = &cis820x_config_intr, + .driver = { .owner = THIS_MODULE,}, +}; + +/* Cicada 8204 */ static struct phy_driver cis8204_driver = { .phy_id = 0x000fc440, .name = "Cicada Cis8204", @@ -119,15 +133,30 @@ static struct phy_driver cis8204_driver = { .driver = { .owner = THIS_MODULE,}, }; -static int __init cis8204_init(void) +static int __init cicada_init(void) { - return phy_driver_register(&cis8204_driver); + int ret; + + ret = phy_driver_register(&cis8204_driver); + if (ret) + goto err1; + + ret = phy_driver_register(&cis8201_driver); + if (ret) + goto err2; + return 0; + +err2: + phy_driver_unregister(&cis8204_driver); +err1: + return ret; } -static void __exit cis8204_exit(void) +static void __exit cicada_exit(void) { phy_driver_unregister(&cis8204_driver); + phy_driver_unregister(&cis8201_driver); } -module_init(cis8204_init); -module_exit(cis8204_exit); +module_init(cicada_init); +module_exit(cicada_exit); diff --git a/drivers/net/phy/davicom.c b/drivers/net/phy/davicom.c index 5e9002e44..aa7983f55 100644 --- a/drivers/net/phy/davicom.c +++ b/drivers/net/phy/davicom.c @@ -13,7 +13,6 @@ * option) any later version. * */ -#include #include #include #include diff --git a/drivers/net/phy/lxt.c b/drivers/net/phy/lxt.c index bef79e454..69d2325f8 100644 --- a/drivers/net/phy/lxt.c +++ b/drivers/net/phy/lxt.c @@ -13,7 +13,6 @@ * option) any later version. * */ -#include #include #include #include @@ -123,9 +122,9 @@ static int lxt971_config_intr(struct phy_device *phydev) } static struct phy_driver lxt970_driver = { - .phy_id = 0x07810000, + .phy_id = 0x78100000, .name = "LXT970", - .phy_id_mask = 0x0fffffff, + .phy_id_mask = 0xfffffff0, .features = PHY_BASIC_FEATURES, .flags = PHY_HAS_INTERRUPT, .config_init = lxt970_config_init, @@ -137,9 +136,9 @@ static struct phy_driver lxt970_driver = { }; static struct phy_driver lxt971_driver = { - .phy_id = 0x0001378e, + .phy_id = 0x001378e0, .name = "LXT971", - .phy_id_mask = 0x0fffffff, + .phy_id_mask = 0xfffffff0, .features = PHY_BASIC_FEATURES, .flags = PHY_HAS_INTERRUPT, .config_aneg = genphy_config_aneg, diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c index a2d6386d1..0ad253282 100644 --- a/drivers/net/phy/marvell.c +++ b/drivers/net/phy/marvell.c @@ -13,7 +13,6 @@ * option) any later version. * */ -#include #include #include #include diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c index 1b236bdf6..cf6660c93 100644 --- a/drivers/net/phy/mdio_bus.c +++ b/drivers/net/phy/mdio_bus.c @@ -13,7 +13,6 @@ * option) any later version. * */ -#include #include #include #include @@ -160,6 +159,7 @@ struct bus_type mdio_bus_type = { .suspend = mdio_bus_suspend, .resume = mdio_bus_resume, }; +EXPORT_SYMBOL(mdio_bus_type); int __init mdio_bus_init(void) { diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index 33cec2dab..f5aad7728 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -14,7 +14,6 @@ * option) any later version. * */ -#include #include #include #include @@ -420,9 +419,8 @@ void phy_start_machine(struct phy_device *phydev, /* phy_stop_machine * - * description: Stops the state machine timer, sets the state to - * UP (unless it wasn't up yet), and then frees the interrupt, - * if it is in use. This function must be called BEFORE + * description: Stops the state machine timer, sets the state to UP + * (unless it wasn't up yet). This function must be called BEFORE * phy_detach. */ void phy_stop_machine(struct phy_device *phydev) @@ -434,9 +432,6 @@ void phy_stop_machine(struct phy_device *phydev) phydev->state = PHY_UP; spin_unlock(&phydev->lock); - if (phydev->irq != PHY_POLL) - phy_stop_interrupts(phydev); - phydev->adjust_state = NULL; } @@ -557,7 +552,7 @@ int phy_start_interrupts(struct phy_device *phydev) INIT_WORK(&phydev->phy_queue, phy_change, phydev); if (request_irq(phydev->irq, phy_interrupt, - SA_SHIRQ, + IRQF_SHARED, "phy_interrupt", phydev) < 0) { printk(KERN_WARNING "%s: Can't get IRQ %d (PHY)\n", diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index 7da0e3dd5..2d1ecfdc8 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c @@ -14,7 +14,6 @@ * option) any later version. * */ -#include #include #include #include @@ -46,6 +45,35 @@ static struct phy_driver genphy_driver; extern int mdio_bus_init(void); extern void mdio_bus_exit(void); +struct phy_device* phy_device_create(struct mii_bus *bus, int addr, int phy_id) +{ + struct phy_device *dev; + /* We allocate the device, and initialize the + * default values */ + dev = kcalloc(1, sizeof(*dev), GFP_KERNEL); + + if (NULL == dev) + return (struct phy_device*) PTR_ERR((void*)-ENOMEM); + + dev->speed = 0; + dev->duplex = -1; + dev->pause = dev->asym_pause = 0; + dev->link = 1; + + dev->autoneg = AUTONEG_ENABLE; + + dev->addr = addr; + dev->phy_id = phy_id; + dev->bus = bus; + + dev->state = PHY_DOWN; + + spin_lock_init(&dev->lock); + + return dev; +} +EXPORT_SYMBOL(phy_device_create); + /* get_phy_device * * description: Reads the ID registers of the PHY at addr on the @@ -79,27 +107,7 @@ struct phy_device * get_phy_device(struct mii_bus *bus, int addr) if (0xffffffff == phy_id) return NULL; - /* Otherwise, we allocate the device, and initialize the - * default values */ - dev = kcalloc(1, sizeof(*dev), GFP_KERNEL); - - if (NULL == dev) - return ERR_PTR(-ENOMEM); - - dev->speed = 0; - dev->duplex = -1; - dev->pause = dev->asym_pause = 0; - dev->link = 1; - - dev->autoneg = AUTONEG_ENABLE; - - dev->addr = addr; - dev->phy_id = phy_id; - dev->bus = bus; - - dev->state = PHY_DOWN; - - spin_lock_init(&dev->lock); + dev = phy_device_create(bus, addr, phy_id); return dev; } diff --git a/drivers/net/phy/qsemi.c b/drivers/net/phy/qsemi.c index 65d995b02..2b50e1739 100644 --- a/drivers/net/phy/qsemi.c +++ b/drivers/net/phy/qsemi.c @@ -13,7 +13,6 @@ * option) any later version. * */ -#include #include #include #include diff --git a/drivers/net/ppp_generic.c b/drivers/net/ppp_generic.c index b2073fce8..c872f7c6c 100644 --- a/drivers/net/ppp_generic.c +++ b/drivers/net/ppp_generic.c @@ -22,13 +22,11 @@ * ==FILEVERSION 20041108== */ -#include #include #include #include #include #include -#include #include #include #include @@ -194,7 +192,7 @@ struct cardmap { void *ptr[CARDMAP_WIDTH]; }; static void *cardmap_get(struct cardmap *map, unsigned int nr); -static void cardmap_set(struct cardmap **map, unsigned int nr, void *ptr); +static int cardmap_set(struct cardmap **map, unsigned int nr, void *ptr); static unsigned int cardmap_find_first_free(struct cardmap *map); static void cardmap_destroy(struct cardmap **map); @@ -863,10 +861,6 @@ static int __init ppp_init(void) goto out_chrdev; } class_device_create(ppp_class, NULL, MKDEV(PPP_MAJOR, 0), NULL, "ppp"); - err = devfs_mk_cdev(MKDEV(PPP_MAJOR, 0), - S_IFCHR|S_IRUSR|S_IWUSR, "ppp"); - if (err) - goto out_class; } out: @@ -874,9 +868,6 @@ out: printk(KERN_ERR "failed to register PPP device (%d)\n", err); return err; -out_class: - class_device_destroy(ppp_class, MKDEV(PPP_MAJOR,0)); - class_destroy(ppp_class); out_chrdev: unregister_chrdev(PPP_MAJOR, "ppp"); goto out; @@ -1609,8 +1600,6 @@ ppp_receive_nonmp_frame(struct ppp *ppp, struct sk_buff *skb) kfree_skb(skb); skb = ns; } - else if (!pskb_may_pull(skb, skb->len)) - goto err; else skb->ip_summed = CHECKSUM_NONE; @@ -2006,10 +1995,9 @@ ppp_register_channel(struct ppp_channel *chan) { struct channel *pch; - pch = kmalloc(sizeof(struct channel), GFP_KERNEL); + pch = kzalloc(sizeof(struct channel), GFP_KERNEL); if (pch == 0) return -ENOMEM; - memset(pch, 0, sizeof(struct channel)); pch->ppp = NULL; pch->chan = chan; chan->ppp = pch; @@ -2419,13 +2407,12 @@ ppp_create_interface(int unit, int *retp) int ret = -ENOMEM; int i; - ppp = kmalloc(sizeof(struct ppp), GFP_KERNEL); + ppp = kzalloc(sizeof(struct ppp), GFP_KERNEL); if (!ppp) goto out; dev = alloc_netdev(0, "", ppp_setup); if (!dev) goto out1; - memset(ppp, 0, sizeof(struct ppp)); ppp->mru = PPP_MRU; init_ppp_file(&ppp->file, INTERFACE); @@ -2465,11 +2452,16 @@ ppp_create_interface(int unit, int *retp) } atomic_inc(&ppp_unit_count); - cardmap_set(&all_ppp_units, unit, ppp); + ret = cardmap_set(&all_ppp_units, unit, ppp); + if (ret != 0) + goto out3; + mutex_unlock(&all_ppp_mutex); *retp = 0; return ppp; +out3: + atomic_dec(&ppp_unit_count); out2: mutex_unlock(&all_ppp_mutex); free_netdev(dev); @@ -2580,8 +2572,7 @@ ppp_find_channel(int unit) list_for_each_entry(pch, &new_channels, list) { if (pch->file.index == unit) { - list_del(&pch->list); - list_add(&pch->list, &all_channels); + list_move(&pch->list, &all_channels); return pch; } } @@ -2684,7 +2675,6 @@ static void __exit ppp_cleanup(void) cardmap_destroy(&all_ppp_units); if (unregister_chrdev(PPP_MAJOR, "ppp") != 0) printk(KERN_ERR "PPP: failed to unregister PPP device\n"); - devfs_remove("ppp"); class_device_destroy(ppp_class, MKDEV(PPP_MAJOR, 0)); class_destroy(ppp_class); } @@ -2708,7 +2698,7 @@ static void *cardmap_get(struct cardmap *map, unsigned int nr) return NULL; } -static void cardmap_set(struct cardmap **pmap, unsigned int nr, void *ptr) +static int cardmap_set(struct cardmap **pmap, unsigned int nr, void *ptr) { struct cardmap *p; int i; @@ -2717,8 +2707,9 @@ static void cardmap_set(struct cardmap **pmap, unsigned int nr, void *ptr) if (p == NULL || (nr >> p->shift) >= CARDMAP_WIDTH) { do { /* need a new top level */ - struct cardmap *np = kmalloc(sizeof(*np), GFP_KERNEL); - memset(np, 0, sizeof(*np)); + struct cardmap *np = kzalloc(sizeof(*np), GFP_KERNEL); + if (!np) + goto enomem; np->ptr[0] = p; if (p != NULL) { np->shift = p->shift + CARDMAP_ORDER; @@ -2732,8 +2723,9 @@ static void cardmap_set(struct cardmap **pmap, unsigned int nr, void *ptr) while (p->shift > 0) { i = (nr >> p->shift) & CARDMAP_MASK; if (p->ptr[i] == NULL) { - struct cardmap *np = kmalloc(sizeof(*np), GFP_KERNEL); - memset(np, 0, sizeof(*np)); + struct cardmap *np = kzalloc(sizeof(*np), GFP_KERNEL); + if (!np) + goto enomem; np->shift = p->shift - CARDMAP_ORDER; np->parent = p; p->ptr[i] = np; @@ -2748,6 +2740,9 @@ static void cardmap_set(struct cardmap **pmap, unsigned int nr, void *ptr) set_bit(i, &p->inuse); else clear_bit(i, &p->inuse); + return 0; + enomem: + return -ENOMEM; } static unsigned int cardmap_find_first_free(struct cardmap *map) diff --git a/drivers/net/ppp_mppe.c b/drivers/net/ppp_mppe.c index 1985d1b57..51ff9a9d1 100644 --- a/drivers/net/ppp_mppe.c +++ b/drivers/net/ppp_mppe.c @@ -43,7 +43,6 @@ * deprecated in 2.6 */ -#include #include #include #include diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index 43641dd2c..4c2f575fa 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c @@ -184,6 +184,7 @@ static const struct { static struct pci_device_id rtl8169_pci_tbl[] = { { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8169), }, + { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8129), }, { PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4300), }, { PCI_DEVICE(0x16ec, 0x0116), }, { PCI_VENDOR_ID_LINKSYS, 0x1032, PCI_ANY_ID, 0x0024, }, @@ -1405,7 +1406,7 @@ rtl8169_init_board(struct pci_dev *pdev, struct net_device **dev_out, dev = alloc_etherdev(sizeof (*tp)); if (dev == NULL) { if (netif_msg_drv(&debug)) - printk(KERN_ERR PFX "unable to alloc new ethernet\n"); + dev_err(&pdev->dev, "unable to alloc new ethernet\n"); goto err_out; } @@ -1417,10 +1418,8 @@ rtl8169_init_board(struct pci_dev *pdev, struct net_device **dev_out, /* enable device (incl. PCI PM wakeup and hotplug setup) */ rc = pci_enable_device(pdev); if (rc < 0) { - if (netif_msg_probe(tp)) { - printk(KERN_ERR PFX "%s: enable failure\n", - pci_name(pdev)); - } + if (netif_msg_probe(tp)) + dev_err(&pdev->dev, "enable failure\n"); goto err_out_free_dev; } @@ -1436,37 +1435,32 @@ rtl8169_init_board(struct pci_dev *pdev, struct net_device **dev_out, pci_read_config_word(pdev, pm_cap + PCI_PM_CTRL, &pwr_command); acpi_idle_state = pwr_command & PCI_PM_CTRL_STATE_MASK; } else { - if (netif_msg_probe(tp)) { - printk(KERN_ERR PFX + if (netif_msg_probe(tp)) + dev_err(&pdev->dev, "PowerManagement capability not found.\n"); - } } /* make sure PCI base addr 1 is MMIO */ if (!(pci_resource_flags(pdev, 1) & IORESOURCE_MEM)) { - if (netif_msg_probe(tp)) { - printk(KERN_ERR PFX + if (netif_msg_probe(tp)) + dev_err(&pdev->dev, "region #1 not an MMIO resource, aborting\n"); - } rc = -ENODEV; goto err_out_mwi; } /* check for weird/broken PCI region reporting */ if (pci_resource_len(pdev, 1) < R8169_REGS_SIZE) { - if (netif_msg_probe(tp)) { - printk(KERN_ERR PFX + if (netif_msg_probe(tp)) + dev_err(&pdev->dev, "Invalid PCI region size(s), aborting\n"); - } rc = -ENODEV; goto err_out_mwi; } rc = pci_request_regions(pdev, MODULENAME); if (rc < 0) { - if (netif_msg_probe(tp)) { - printk(KERN_ERR PFX "%s: could not request regions.\n", - pci_name(pdev)); - } + if (netif_msg_probe(tp)) + dev_err(&pdev->dev, "could not request regions.\n"); goto err_out_mwi; } @@ -1479,10 +1473,9 @@ rtl8169_init_board(struct pci_dev *pdev, struct net_device **dev_out, } else { rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK); if (rc < 0) { - if (netif_msg_probe(tp)) { - printk(KERN_ERR PFX + if (netif_msg_probe(tp)) + dev_err(&pdev->dev, "DMA configuration failed.\n"); - } goto err_out_free_res; } } @@ -1493,7 +1486,7 @@ rtl8169_init_board(struct pci_dev *pdev, struct net_device **dev_out, ioaddr = ioremap(pci_resource_start(pdev, 1), R8169_REGS_SIZE); if (ioaddr == NULL) { if (netif_msg_probe(tp)) - printk(KERN_ERR PFX "cannot remap MMIO, aborting\n"); + dev_err(&pdev->dev, "cannot remap MMIO, aborting\n"); rc = -EIO; goto err_out_free_res; } @@ -1525,9 +1518,9 @@ rtl8169_init_board(struct pci_dev *pdev, struct net_device **dev_out, if (i < 0) { /* Unknown chip: assume array element #0, original RTL-8169 */ if (netif_msg_probe(tp)) { - printk(KERN_DEBUG PFX "PCI device %s: " + dev_printk(KERN_DEBUG, &pdev->dev, "unknown chip version, assuming %s\n", - pci_name(pdev), rtl_chip_info[0].name); + rtl_chip_info[0].name); } i++; } @@ -1725,7 +1718,7 @@ static int rtl8169_open(struct net_device *dev) rtl8169_set_rxbufsize(tp, dev); retval = - request_irq(dev->irq, rtl8169_interrupt, SA_SHIRQ, dev->name, dev); + request_irq(dev->irq, rtl8169_interrupt, IRQF_SHARED, dev->name, dev); if (retval < 0) goto out; @@ -2221,8 +2214,7 @@ static int rtl8169_start_xmit(struct sk_buff *skb, struct net_device *dev) len = skb->len; if (unlikely(len < ETH_ZLEN)) { - skb = skb_padto(skb, ETH_ZLEN); - if (!skb) + if (skb_padto(skb, ETH_ZLEN)) goto err_update_stats; len = ETH_ZLEN; } diff --git a/drivers/net/rrunner.c b/drivers/net/rrunner.c index 19c2df9c8..c3ed734cb 100644 --- a/drivers/net/rrunner.c +++ b/drivers/net/rrunner.c @@ -28,7 +28,6 @@ #define RX_DMA_SKBUFF 1 #define PKT_COPY_THRESHOLD 512 -#include #include #include #include @@ -1253,7 +1252,7 @@ static int rr_open(struct net_device *dev) readl(®s->HostCtrl); spin_unlock_irqrestore(&rrpriv->lock, flags); - if (request_irq(dev->irq, rr_interrupt, SA_SHIRQ, dev->name, dev)) { + if (request_irq(dev->irq, rr_interrupt, IRQF_SHARED, dev->name, dev)) { printk(KERN_WARNING "%s: Requested IRQ %d is busy\n", dev->name, dev->irq); ecode = -EAGAIN; diff --git a/drivers/net/rrunner.h b/drivers/net/rrunner.h index 10baae559..2c3c91ebd 100644 --- a/drivers/net/rrunner.h +++ b/drivers/net/rrunner.h @@ -1,7 +1,6 @@ #ifndef _RRUNNER_H_ #define _RRUNNER_H_ -#include #include #if ((BITS_PER_LONG != 32) && (BITS_PER_LONG != 64)) diff --git a/drivers/net/s2io-regs.h b/drivers/net/s2io-regs.h index 00179bc34..0ef525899 100644 --- a/drivers/net/s2io-regs.h +++ b/drivers/net/s2io-regs.h @@ -167,6 +167,7 @@ typedef struct _XENA_dev_config { u8 unused4[0x08]; u64 gpio_int_reg; +#define GPIO_INT_REG_DP_ERR_INT BIT(0) #define GPIO_INT_REG_LINK_DOWN BIT(1) #define GPIO_INT_REG_LINK_UP BIT(2) u64 gpio_int_mask; @@ -187,7 +188,7 @@ typedef struct _XENA_dev_config { /* PIC Control registers */ u64 pic_control; #define PIC_CNTL_RX_ALARM_MAP_1 BIT(0) -#define PIC_CNTL_SHARED_SPLITS(n) vBIT(n,11,4) +#define PIC_CNTL_SHARED_SPLITS(n) vBIT(n,11,5) u64 swapper_ctrl; #define SWAPPER_CTRL_PIF_R_FE BIT(0) @@ -267,6 +268,21 @@ typedef struct _XENA_dev_config { /* General Configuration */ u64 mdio_control; +#define MDIO_MMD_INDX_ADDR(val) vBIT(val, 0, 16) +#define MDIO_MMD_DEV_ADDR(val) vBIT(val, 19, 5) +#define MDIO_MMD_PMA_DEV_ADDR 0x1 +#define MDIO_MMD_PMD_DEV_ADDR 0x1 +#define MDIO_MMD_WIS_DEV_ADDR 0x2 +#define MDIO_MMD_PCS_DEV_ADDR 0x3 +#define MDIO_MMD_PHYXS_DEV_ADDR 0x4 +#define MDIO_MMS_PRT_ADDR(val) vBIT(val, 27, 5) +#define MDIO_CTRL_START_TRANS(val) vBIT(val, 56, 4) +#define MDIO_OP(val) vBIT(val, 60, 2) +#define MDIO_OP_ADDR_TRANS 0x0 +#define MDIO_OP_WRITE_TRANS 0x1 +#define MDIO_OP_READ_POST_INC_TRANS 0x2 +#define MDIO_OP_READ_TRANS 0x3 +#define MDIO_MDIO_DATA(val) vBIT(val, 32, 16) u64 dtx_control; @@ -284,9 +300,13 @@ typedef struct _XENA_dev_config { u64 gpio_control; #define GPIO_CTRL_GPIO_0 BIT(8) u64 misc_control; +#define EXT_REQ_EN BIT(1) #define MISC_LINK_STABILITY_PRD(val) vBIT(val,29,3) - u8 unused7_1[0x240 - 0x208]; + u8 unused7_1[0x230 - 0x208]; + + u64 pic_control2; + u64 ini_dperr_ctrl; u64 wreq_split_mask; #define WREQ_SPLIT_MASK_SET_MASK(val) vBIT(val, 52, 12) @@ -493,6 +513,7 @@ typedef struct _XENA_dev_config { #define PRC_CTRL_NO_SNOOP_DESC BIT(22) #define PRC_CTRL_NO_SNOOP_BUFF BIT(23) #define PRC_CTRL_BIMODAL_INTERRUPT BIT(37) +#define PRC_CTRL_GROUP_READS BIT(38) #define PRC_CTRL_RXD_BACKOFF_INTERVAL(val) vBIT(val,40,24) u64 prc_alarm_action; @@ -541,7 +562,12 @@ typedef struct _XENA_dev_config { #define RX_PA_CFG_IGNORE_LLC_CTRL BIT(3) #define RX_PA_CFG_IGNORE_L2_ERR BIT(6) - u8 unused12[0x700 - 0x1D8]; + u64 unused_11_1; + + u64 ring_bump_counter1; + u64 ring_bump_counter2; + + u8 unused12[0x700 - 0x1F0]; u64 rxdma_debug_ctrl; diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c index 0ad01f07e..e72e0e099 100644 --- a/drivers/net/s2io.c +++ b/drivers/net/s2io.c @@ -26,18 +26,24 @@ * * The module loadable parameters that are supported by the driver and a brief * explaination of all the variables. + * * rx_ring_num : This can be used to program the number of receive rings used * in the driver. - * rx_ring_sz: This defines the number of descriptors each ring can have. This - * is also an array of size 8. + * rx_ring_sz: This defines the number of receive blocks each ring can have. + * This is also an array of size 8. * rx_ring_mode: This defines the operation mode of all 8 rings. The valid * values are 1, 2 and 3. * tx_fifo_num: This defines the number of Tx FIFOs thats used int the driver. * tx_fifo_len: This too is an array of 8. Each element defines the number of * Tx descriptors that can be associated with each corresponding FIFO. + * intr_type: This defines the type of interrupt. The values can be 0(INTA), + * 1(MSI), 2(MSI_X). Default value is '0(INTA)' + * lro: Specifies whether to enable Large Receive Offload (LRO) or not. + * Possible values '1' for enable '0' for disable. Default is '0' + * lro_max_pkts: This parameter defines maximum number of packets can be + * aggregated as a single large packet ************************************************************************/ -#include #include #include #include @@ -65,12 +71,13 @@ #include #include #include +#include /* local include */ #include "s2io.h" #include "s2io-regs.h" -#define DRV_VERSION "2.0.11.2" +#define DRV_VERSION "2.0.15.2" /* S2io Driver name & version. */ static char s2io_driver_name[] = "Neterion"; @@ -106,18 +113,14 @@ static inline int RXD_IS_UP2DT(RxD_t *rxdp) #define LOW 2 static inline int rx_buffer_level(nic_t * sp, int rxb_size, int ring) { - int level = 0; mac_info_t *mac_control; mac_control = &sp->mac_control; - if ((mac_control->rings[ring].pkt_cnt - rxb_size) > 16) { - level = LOW; - if (rxb_size <= rxd_count[sp->rxd_mode]) { - level = PANIC; - } - } - - return level; + if (rxb_size <= rxd_count[sp->rxd_mode]) + return PANIC; + else if ((mac_control->rings[ring].pkt_cnt - rxb_size) > 16) + return LOW; + return 0; } /* Ethtool related variables and Macros. */ @@ -136,7 +139,11 @@ static char ethtool_stats_keys[][ETH_GSTRING_LEN] = { {"tmac_mcst_frms"}, {"tmac_bcst_frms"}, {"tmac_pause_ctrl_frms"}, + {"tmac_ttl_octets"}, + {"tmac_ucst_frms"}, + {"tmac_nucst_frms"}, {"tmac_any_err_frms"}, + {"tmac_ttl_less_fb_octets"}, {"tmac_vld_ip_octets"}, {"tmac_vld_ip"}, {"tmac_drop_ip"}, @@ -151,13 +158,27 @@ static char ethtool_stats_keys[][ETH_GSTRING_LEN] = { {"rmac_vld_mcst_frms"}, {"rmac_vld_bcst_frms"}, {"rmac_in_rng_len_err_frms"}, + {"rmac_out_rng_len_err_frms"}, {"rmac_long_frms"}, {"rmac_pause_ctrl_frms"}, + {"rmac_unsup_ctrl_frms"}, + {"rmac_ttl_octets"}, + {"rmac_accepted_ucst_frms"}, + {"rmac_accepted_nucst_frms"}, {"rmac_discarded_frms"}, + {"rmac_drop_events"}, + {"rmac_ttl_less_fb_octets"}, + {"rmac_ttl_frms"}, {"rmac_usized_frms"}, {"rmac_osized_frms"}, {"rmac_frag_frms"}, {"rmac_jabber_frms"}, + {"rmac_ttl_64_frms"}, + {"rmac_ttl_65_127_frms"}, + {"rmac_ttl_128_255_frms"}, + {"rmac_ttl_256_511_frms"}, + {"rmac_ttl_512_1023_frms"}, + {"rmac_ttl_1024_1518_frms"}, {"rmac_ip"}, {"rmac_ip_octets"}, {"rmac_hdr_err_ip"}, @@ -166,12 +187,82 @@ static char ethtool_stats_keys[][ETH_GSTRING_LEN] = { {"rmac_tcp"}, {"rmac_udp"}, {"rmac_err_drp_udp"}, + {"rmac_xgmii_err_sym"}, + {"rmac_frms_q0"}, + {"rmac_frms_q1"}, + {"rmac_frms_q2"}, + {"rmac_frms_q3"}, + {"rmac_frms_q4"}, + {"rmac_frms_q5"}, + {"rmac_frms_q6"}, + {"rmac_frms_q7"}, + {"rmac_full_q0"}, + {"rmac_full_q1"}, + {"rmac_full_q2"}, + {"rmac_full_q3"}, + {"rmac_full_q4"}, + {"rmac_full_q5"}, + {"rmac_full_q6"}, + {"rmac_full_q7"}, {"rmac_pause_cnt"}, + {"rmac_xgmii_data_err_cnt"}, + {"rmac_xgmii_ctrl_err_cnt"}, {"rmac_accepted_ip"}, {"rmac_err_tcp"}, + {"rd_req_cnt"}, + {"new_rd_req_cnt"}, + {"new_rd_req_rtry_cnt"}, + {"rd_rtry_cnt"}, + {"wr_rtry_rd_ack_cnt"}, + {"wr_req_cnt"}, + {"new_wr_req_cnt"}, + {"new_wr_req_rtry_cnt"}, + {"wr_rtry_cnt"}, + {"wr_disc_cnt"}, + {"rd_rtry_wr_ack_cnt"}, + {"txp_wr_cnt"}, + {"txd_rd_cnt"}, + {"txd_wr_cnt"}, + {"rxd_rd_cnt"}, + {"rxd_wr_cnt"}, + {"txf_rd_cnt"}, + {"rxf_wr_cnt"}, + {"rmac_ttl_1519_4095_frms"}, + {"rmac_ttl_4096_8191_frms"}, + {"rmac_ttl_8192_max_frms"}, + {"rmac_ttl_gt_max_frms"}, + {"rmac_osized_alt_frms"}, + {"rmac_jabber_alt_frms"}, + {"rmac_gt_max_alt_frms"}, + {"rmac_vlan_frms"}, + {"rmac_len_discard"}, + {"rmac_fcs_discard"}, + {"rmac_pf_discard"}, + {"rmac_da_discard"}, + {"rmac_red_discard"}, + {"rmac_rts_discard"}, + {"rmac_ingm_full_discard"}, + {"link_fault_cnt"}, {"\n DRIVER STATISTICS"}, {"single_bit_ecc_errs"}, {"double_bit_ecc_errs"}, + {"parity_err_cnt"}, + {"serious_err_cnt"}, + {"soft_reset_cnt"}, + {"fifo_full_cnt"}, + {"ring_full_cnt"}, + ("alarm_transceiver_temp_high"), + ("alarm_transceiver_temp_low"), + ("alarm_laser_bias_current_high"), + ("alarm_laser_bias_current_low"), + ("alarm_laser_output_power_high"), + ("alarm_laser_output_power_low"), + ("warn_transceiver_temp_high"), + ("warn_transceiver_temp_low"), + ("warn_laser_bias_current_high"), + ("warn_laser_bias_current_low"), + ("warn_laser_output_power_high"), + ("warn_laser_output_power_low"), ("lro_aggregated_pkts"), ("lro_flush_both_count"), ("lro_out_of_sequence_pkts"), @@ -220,9 +311,7 @@ static void s2io_vlan_rx_kill_vid(struct net_device *dev, unsigned long vid) * the XAUI. */ -#define SWITCH_SIGN 0xA5A5A5A5A5A5A5A5ULL #define END_SIGN 0x0 - static const u64 herc_act_dtx_cfg[] = { /* Set address */ 0x8000051536750000ULL, 0x80000515367500E0ULL, @@ -244,37 +333,19 @@ static const u64 herc_act_dtx_cfg[] = { END_SIGN }; -static const u64 xena_mdio_cfg[] = { - /* Reset PMA PLL */ - 0xC001010000000000ULL, 0xC0010100000000E0ULL, - 0xC0010100008000E4ULL, - /* Remove Reset from PMA PLL */ - 0xC001010000000000ULL, 0xC0010100000000E0ULL, - 0xC0010100000000E4ULL, - END_SIGN -}; - static const u64 xena_dtx_cfg[] = { + /* Set address */ 0x8000051500000000ULL, 0x80000515000000E0ULL, - 0x80000515D93500E4ULL, 0x8001051500000000ULL, - 0x80010515000000E0ULL, 0x80010515001E00E4ULL, - 0x8002051500000000ULL, 0x80020515000000E0ULL, - 0x80020515F21000E4ULL, - /* Set PADLOOPBACKN */ - 0x8002051500000000ULL, 0x80020515000000E0ULL, - 0x80020515B20000E4ULL, 0x8003051500000000ULL, - 0x80030515000000E0ULL, 0x80030515B20000E4ULL, - 0x8004051500000000ULL, 0x80040515000000E0ULL, - 0x80040515B20000E4ULL, 0x8005051500000000ULL, - 0x80050515000000E0ULL, 0x80050515B20000E4ULL, - SWITCH_SIGN, - /* Remove PADLOOPBACKN */ + /* Write data */ + 0x80000515D9350004ULL, 0x80000515D93500E4ULL, + /* Set address */ + 0x8001051500000000ULL, 0x80010515000000E0ULL, + /* Write data */ + 0x80010515001E0004ULL, 0x80010515001E00E4ULL, + /* Set address */ 0x8002051500000000ULL, 0x80020515000000E0ULL, - 0x80020515F20000E4ULL, 0x8003051500000000ULL, - 0x80030515000000E0ULL, 0x80030515F20000E4ULL, - 0x8004051500000000ULL, 0x80040515000000E0ULL, - 0x80040515F20000E4ULL, 0x8005051500000000ULL, - 0x80050515000000E0ULL, 0x80050515F20000E4ULL, + /* Write data */ + 0x80020515F2100004ULL, 0x80020515F21000E4ULL, END_SIGN }; @@ -300,38 +371,50 @@ static const u64 fix_mac[] = { END_SIGN }; +MODULE_AUTHOR("Raghavendra Koushik "); +MODULE_LICENSE("GPL"); +MODULE_VERSION(DRV_VERSION); + + /* Module Loadable parameters. */ -static unsigned int tx_fifo_num = 1; -static unsigned int tx_fifo_len[MAX_TX_FIFOS] = - {[0 ...(MAX_TX_FIFOS - 1)] = 0 }; -static unsigned int rx_ring_num = 1; -static unsigned int rx_ring_sz[MAX_RX_RINGS] = - {[0 ...(MAX_RX_RINGS - 1)] = 0 }; -static unsigned int rts_frm_len[MAX_RX_RINGS] = - {[0 ...(MAX_RX_RINGS - 1)] = 0 }; -static unsigned int rx_ring_mode = 1; -static unsigned int use_continuous_tx_intrs = 1; -static unsigned int rmac_pause_time = 65535; -static unsigned int mc_pause_threshold_q0q3 = 187; -static unsigned int mc_pause_threshold_q4q7 = 187; -static unsigned int shared_splits; -static unsigned int tmac_util_period = 5; -static unsigned int rmac_util_period = 5; -static unsigned int bimodal = 0; -static unsigned int l3l4hdr_size = 128; -#ifndef CONFIG_S2IO_NAPI -static unsigned int indicate_max_pkts; -#endif +S2IO_PARM_INT(tx_fifo_num, 1); +S2IO_PARM_INT(rx_ring_num, 1); + + +S2IO_PARM_INT(rx_ring_mode, 1); +S2IO_PARM_INT(use_continuous_tx_intrs, 1); +S2IO_PARM_INT(rmac_pause_time, 0x100); +S2IO_PARM_INT(mc_pause_threshold_q0q3, 187); +S2IO_PARM_INT(mc_pause_threshold_q4q7, 187); +S2IO_PARM_INT(shared_splits, 0); +S2IO_PARM_INT(tmac_util_period, 5); +S2IO_PARM_INT(rmac_util_period, 5); +S2IO_PARM_INT(bimodal, 0); +S2IO_PARM_INT(l3l4hdr_size, 128); /* Frequency of Rx desc syncs expressed as power of 2 */ -static unsigned int rxsync_frequency = 3; +S2IO_PARM_INT(rxsync_frequency, 3); /* Interrupt type. Values can be 0(INTA), 1(MSI), 2(MSI_X) */ -static unsigned int intr_type = 0; +S2IO_PARM_INT(intr_type, 0); /* Large receive offload feature */ -static unsigned int lro = 0; +S2IO_PARM_INT(lro, 0); /* Max pkts to be aggregated by LRO at one time. If not specified, * aggregation happens until we hit max IP pkt size(64K) */ -static unsigned int lro_max_pkts = 0xFFFF; +S2IO_PARM_INT(lro_max_pkts, 0xFFFF); +#ifndef CONFIG_S2IO_NAPI +S2IO_PARM_INT(indicate_max_pkts, 0); +#endif + +static unsigned int tx_fifo_len[MAX_TX_FIFOS] = + {DEFAULT_FIFO_0_LEN, [1 ...(MAX_TX_FIFOS - 1)] = DEFAULT_FIFO_1_7_LEN}; +static unsigned int rx_ring_sz[MAX_RX_RINGS] = + {[0 ...(MAX_RX_RINGS - 1)] = SMALL_BLK_CNT}; +static unsigned int rts_frm_len[MAX_RX_RINGS] = + {[0 ...(MAX_RX_RINGS - 1)] = 0 }; + +module_param_array(tx_fifo_len, uint, NULL, 0); +module_param_array(rx_ring_sz, uint, NULL, 0); +module_param_array(rts_frm_len, uint, NULL, 0); /* * S2IO device table. @@ -394,10 +477,9 @@ static int init_shared_mem(struct s2io_nic *nic) size += config->tx_cfg[i].fifo_len; } if (size > MAX_AVAILABLE_TXDS) { - DBG_PRINT(ERR_DBG, "%s: Requested TxDs too high, ", - __FUNCTION__); + DBG_PRINT(ERR_DBG, "s2io: Requested TxDs too high, "); DBG_PRINT(ERR_DBG, "Requested: %d, max supported: 8192\n", size); - return FAILURE; + return -EINVAL; } lst_size = (sizeof(TxD_t) * config->max_txds); @@ -477,6 +559,7 @@ 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; + memset(nic->ufo_in_band_v, 0, size); /* Allocation and initialization of RXDs in Rings */ size = 0; @@ -549,11 +632,6 @@ static int init_shared_mem(struct s2io_nic *nic) rx_blocks->block_dma_addr + (rxd_size[nic->rxd_mode] * l); } - - mac_control->rings[i].rx_blocks[j].block_virt_addr = - tmp_v_addr; - mac_control->rings[i].rx_blocks[j].block_dma_addr = - tmp_p_addr; } /* Interlinking all Rx Blocks */ for (j = 0; j < blk_cnt; j++) { @@ -772,7 +850,21 @@ static int s2io_verify_pci_mode(nic_t *nic) return mode; } +#define NEC_VENID 0x1033 +#define NEC_DEVID 0x0125 +static int s2io_on_nec_bridge(struct pci_dev *s2io_pdev) +{ + struct pci_dev *tdev = NULL; + while ((tdev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, tdev)) != NULL) { + if ((tdev->vendor == NEC_VENID) && (tdev->device == NEC_DEVID)){ + if (tdev->bus == s2io_pdev->bus->parent) + return 1; + } + } + return 0; +} +static int bus_speed[8] = {33, 133, 133, 200, 266, 133, 200, 266}; /** * s2io_print_pci_mode - */ @@ -789,6 +881,14 @@ static int s2io_print_pci_mode(nic_t *nic) if ( val64 & PCI_MODE_UNKNOWN_MODE) return -1; /* Unknown PCI mode */ + config->bus_speed = bus_speed[mode]; + + if (s2io_on_nec_bridge(nic->pdev)) { + DBG_PRINT(ERR_DBG, "%s: Device is on PCI-E bus\n", + nic->dev->name); + return mode; + } + if (val64 & PCI_MODE_32_BITS) { DBG_PRINT(ERR_DBG, "%s: Device is on 32 bit ", nic->dev->name); } else { @@ -798,35 +898,27 @@ static int s2io_print_pci_mode(nic_t *nic) switch(mode) { case PCI_MODE_PCI_33: DBG_PRINT(ERR_DBG, "33MHz PCI bus\n"); - config->bus_speed = 33; break; case PCI_MODE_PCI_66: DBG_PRINT(ERR_DBG, "66MHz PCI bus\n"); - config->bus_speed = 133; break; case PCI_MODE_PCIX_M1_66: DBG_PRINT(ERR_DBG, "66MHz PCIX(M1) bus\n"); - config->bus_speed = 133; /* Herc doubles the clock rate */ break; case PCI_MODE_PCIX_M1_100: DBG_PRINT(ERR_DBG, "100MHz PCIX(M1) bus\n"); - config->bus_speed = 200; break; case PCI_MODE_PCIX_M1_133: DBG_PRINT(ERR_DBG, "133MHz PCIX(M1) bus\n"); - config->bus_speed = 266; break; case PCI_MODE_PCIX_M2_66: DBG_PRINT(ERR_DBG, "133MHz PCIX(M2) bus\n"); - config->bus_speed = 133; break; case PCI_MODE_PCIX_M2_100: DBG_PRINT(ERR_DBG, "200MHz PCIX(M2) bus\n"); - config->bus_speed = 200; break; case PCI_MODE_PCIX_M2_133: DBG_PRINT(ERR_DBG, "266MHz PCIX(M2) bus\n"); - config->bus_speed = 266; break; default: return -1; /* Unsupported bus speed */ @@ -854,7 +946,7 @@ static int init_nic(struct s2io_nic *nic) int i, j; mac_info_t *mac_control; struct config_param *config; - int mdio_cnt = 0, dtx_cnt = 0; + int dtx_cnt = 0; unsigned long long mem_share; int mem_size; @@ -901,20 +993,6 @@ static int init_nic(struct s2io_nic *nic) val64 = dev->mtu; writeq(vBIT(val64, 2, 14), &bar0->rmac_max_pyld_len); - /* - * Configuring the XAUI Interface of Xena. - * *************************************** - * To Configure the Xena's XAUI, one has to write a series - * of 64 bit values into two registers in a particular - * sequence. Hence a macro 'SWITCH_SIGN' has been defined - * which will be defined in the array of configuration values - * (xena_dtx_cfg & xena_mdio_cfg) at appropriate places - * to switch writing from one regsiter to another. We continue - * writing these values until we encounter the 'END_SIGN' macro. - * For example, After making a series of 21 writes into - * dtx_control register the 'SWITCH_SIGN' appears and hence we - * start writing into mdio_control until we encounter END_SIGN. - */ if (nic->device_type & XFRAME_II_DEVICE) { while (herc_act_dtx_cfg[dtx_cnt] != END_SIGN) { SPECIAL_REG_WRITE(herc_act_dtx_cfg[dtx_cnt], @@ -924,35 +1002,11 @@ static int init_nic(struct s2io_nic *nic) dtx_cnt++; } } else { - while (1) { - dtx_cfg: - while (xena_dtx_cfg[dtx_cnt] != END_SIGN) { - if (xena_dtx_cfg[dtx_cnt] == SWITCH_SIGN) { - dtx_cnt++; - goto mdio_cfg; - } - SPECIAL_REG_WRITE(xena_dtx_cfg[dtx_cnt], - &bar0->dtx_control, UF); - val64 = readq(&bar0->dtx_control); - dtx_cnt++; - } - mdio_cfg: - while (xena_mdio_cfg[mdio_cnt] != END_SIGN) { - if (xena_mdio_cfg[mdio_cnt] == SWITCH_SIGN) { - mdio_cnt++; - goto dtx_cfg; - } - SPECIAL_REG_WRITE(xena_mdio_cfg[mdio_cnt], - &bar0->mdio_control, UF); - val64 = readq(&bar0->mdio_control); - mdio_cnt++; - } - if ((xena_dtx_cfg[dtx_cnt] == END_SIGN) && - (xena_mdio_cfg[mdio_cnt] == END_SIGN)) { - break; - } else { - goto dtx_cfg; - } + while (xena_dtx_cfg[dtx_cnt] != END_SIGN) { + SPECIAL_REG_WRITE(xena_dtx_cfg[dtx_cnt], + &bar0->dtx_control, UF); + val64 = readq(&bar0->dtx_control); + dtx_cnt++; } } @@ -994,11 +1048,6 @@ static int init_nic(struct s2io_nic *nic) } } - /* Enable Tx FIFO partition 0. */ - val64 = readq(&bar0->tx_fifo_partition_0); - val64 |= BIT(0); /* To enable the FIFO partition. */ - writeq(val64, &bar0->tx_fifo_partition_0); - /* * Disable 4 PCCs for Xena1, 2 and 3 as per H/W bug * SXE-008 TRANSMIT DMA ARBITRATION ISSUE. @@ -1177,6 +1226,11 @@ static int init_nic(struct s2io_nic *nic) break; } + /* Enable all configured Tx FIFO partitions */ + val64 = readq(&bar0->tx_fifo_partition_0); + val64 |= (TX_FIFO_PARTITION_EN); + writeq(val64, &bar0->tx_fifo_partition_0); + /* Filling the Rx round robin registers as per the * number of Rings and steering based on QoS. */ @@ -1545,19 +1599,26 @@ static int init_nic(struct s2io_nic *nic) val64 |= PIC_CNTL_SHARED_SPLITS(shared_splits); writeq(val64, &bar0->pic_control); + if (nic->config.bus_speed == 266) { + writeq(TXREQTO_VAL(0x7f) | TXREQTO_EN, &bar0->txreqtimeout); + writeq(0x0, &bar0->read_retry_delay); + writeq(0x0, &bar0->write_retry_delay); + } + /* * Programming the Herc to split every write transaction * that does not start on an ADB to reduce disconnects. */ if (nic->device_type == XFRAME_II_DEVICE) { - val64 = WREQ_SPLIT_MASK_SET_MASK(255); - writeq(val64, &bar0->wreq_split_mask); - } - - /* Setting Link stability period to 64 ms */ - if (nic->device_type == XFRAME_II_DEVICE) { - val64 = MISC_LINK_STABILITY_PRD(3); + val64 = EXT_REQ_EN | MISC_LINK_STABILITY_PRD(3); writeq(val64, &bar0->misc_control); + val64 = readq(&bar0->pic_control2); + val64 &= ~(BIT(13)|BIT(14)|BIT(15)); + writeq(val64, &bar0->pic_control2); + } + if (strstr(nic->product_name, "CX4")) { + val64 = TMAC_AVG_IPG(0x17); + writeq(val64, &bar0->tmac_avg_ipg); } return SUCCESS; @@ -1602,7 +1663,7 @@ static void en_dis_able_nic_intrs(struct s2io_nic *nic, u16 mask, int flag) writeq(temp64, &bar0->general_int_mask); /* * If Hercules adapter enable GPIO otherwise - * disabled all PCIX, Flash, MDIO, IIC and GPIO + * disable all PCIX, Flash, MDIO, IIC and GPIO * interrupts for now. * TODO */ @@ -1928,7 +1989,6 @@ static int start_nic(struct s2io_nic *nic) XENA_dev_config_t __iomem *bar0 = nic->bar0; struct net_device *dev = nic->dev; register u64 val64 = 0; - u16 interruptible; u16 subid, i; mac_info_t *mac_control; struct config_param *config; @@ -1948,6 +2008,10 @@ static int start_nic(struct s2io_nic *nic) val64 |= PRC_CTRL_RC_ENABLED; else val64 |= PRC_CTRL_RC_ENABLED | PRC_CTRL_RING_MODE_3; + if (nic->device_type == XFRAME_II_DEVICE) + val64 |= PRC_CTRL_GROUP_READS; + val64 &= ~PRC_CTRL_RXD_BACKOFF_INTERVAL(0xFFFFFF); + val64 |= PRC_CTRL_RXD_BACKOFF_INTERVAL(0x1000); writeq(val64, &bar0->prc_ctrl_n[i]); } @@ -1995,16 +2059,6 @@ static int start_nic(struct s2io_nic *nic) return FAILURE; } - /* Enable select interrupts */ - if (nic->intr_type != INTA) - en_dis_able_nic_intrs(nic, ENA_ALL_INTRS, DISABLE_INTRS); - else { - interruptible = TX_TRAFFIC_INTR | RX_TRAFFIC_INTR; - interruptible |= TX_PIC_INTR | RX_PIC_INTR; - interruptible |= TX_MAC_INTR | RX_MAC_INTR; - en_dis_able_nic_intrs(nic, interruptible, ENABLE_INTRS); - } - /* * With some switches, link might be already up at this point. * Because of this weird behavior, when we enable laser, @@ -2018,6 +2072,13 @@ static int start_nic(struct s2io_nic *nic) val64 |= ADAPTER_EOI_TX_ON; writeq(val64, &bar0->adapter_control); + if (s2io_link_fault_indication(nic) == MAC_RMAC_ERR_TIMER) { + /* + * Dont see link state interrupts initally on some switches, + * so directly scheduling the link state task here. + */ + schedule_work(&nic->set_link_task); + } /* SXE-002: Initialize link and activity LED */ subid = nic->pdev->subsystem_device; if (((subid & 0xFF) >= 0x07) && @@ -2029,12 +2090,6 @@ static int start_nic(struct s2io_nic *nic) writeq(val64, (void __iomem *)bar0 + 0x2700); } - /* - * Don't see link state interrupts on certain switches, so - * directly scheduling a link state task from here. - */ - schedule_work(&nic->set_link_task); - return SUCCESS; } /** @@ -2077,7 +2132,7 @@ static struct sk_buff *s2io_txdl_getskb(fifo_info_t *fifo_data, TxD_t *txdlp, in frag->size, PCI_DMA_TODEVICE); } } - txdlp->Host_Control = 0; + memset(txdlp,0, (sizeof(TxD_t) * fifo_data->max_txds)); return(skb); } @@ -2134,7 +2189,7 @@ static void stop_nic(struct s2io_nic *nic) { XENA_dev_config_t __iomem *bar0 = nic->bar0; register u64 val64 = 0; - u16 interruptible, i; + u16 interruptible; mac_info_t *mac_control; struct config_param *config; @@ -2147,12 +2202,10 @@ static void stop_nic(struct s2io_nic *nic) interruptible |= TX_MAC_INTR | RX_MAC_INTR; en_dis_able_nic_intrs(nic, interruptible, DISABLE_INTRS); - /* Disable PRCs */ - for (i = 0; i < config->rx_ring_num; i++) { - val64 = readq(&bar0->prc_ctrl_n[i]); - val64 &= ~((u64) PRC_CTRL_RC_ENABLED); - writeq(val64, &bar0->prc_ctrl_n[i]); - } + /* Clearing Adapter_En bit of ADAPTER_CONTROL Register */ + val64 = readq(&bar0->adapter_control); + val64 &= ~(ADAPTER_CNTL_EN); + writeq(val64, &bar0->adapter_control); } static int fill_rxd_3buf(nic_t *nic, RxD_t *rxdp, struct sk_buff *skb) @@ -2231,13 +2284,12 @@ static int fill_rx_buffers(struct s2io_nic *nic, int ring_no) alloc_cnt = mac_control->rings[ring_no].pkt_cnt - atomic_read(&nic->rx_bufs_left[ring_no]); + block_no1 = mac_control->rings[ring_no].rx_curr_get_info.block_index; + off1 = mac_control->rings[ring_no].rx_curr_get_info.offset; while (alloc_tab < alloc_cnt) { block_no = mac_control->rings[ring_no].rx_curr_put_info. block_index; - block_no1 = mac_control->rings[ring_no].rx_curr_get_info. - block_index; off = mac_control->rings[ring_no].rx_curr_put_info.offset; - off1 = mac_control->rings[ring_no].rx_curr_get_info.offset; rxdp = mac_control->rings[ring_no]. rx_blocks[block_no].rxds[off].virt_addr; @@ -2307,9 +2359,9 @@ static int fill_rx_buffers(struct s2io_nic *nic, int ring_no) memset(rxdp, 0, sizeof(RxD1_t)); skb_reserve(skb, NET_IP_ALIGN); ((RxD1_t*)rxdp)->Buffer0_ptr = pci_map_single - (nic->pdev, skb->data, size, PCI_DMA_FROMDEVICE); - rxdp->Control_2 &= (~MASK_BUFFER0_SIZE_1); - rxdp->Control_2 |= SET_BUFFER0_SIZE_1(size); + (nic->pdev, skb->data, size - NET_IP_ALIGN, + PCI_DMA_FROMDEVICE); + rxdp->Control_2 = SET_BUFFER0_SIZE_1(size - NET_IP_ALIGN); } else if (nic->rxd_mode >= RXD_MODE_3A) { /* @@ -2332,9 +2384,14 @@ static int fill_rx_buffers(struct s2io_nic *nic, int ring_no) skb->data = (void *) (unsigned long)tmp; skb->tail = (void *) (unsigned long)tmp; - ((RxD3_t*)rxdp)->Buffer0_ptr = - pci_map_single(nic->pdev, ba->ba_0, BUF0_LEN, + if (!(((RxD3_t*)rxdp)->Buffer0_ptr)) + ((RxD3_t*)rxdp)->Buffer0_ptr = + pci_map_single(nic->pdev, ba->ba_0, BUF0_LEN, PCI_DMA_FROMDEVICE); + else + pci_dma_sync_single_for_device(nic->pdev, + (dma_addr_t) ((RxD3_t*)rxdp)->Buffer0_ptr, + BUF0_LEN, PCI_DMA_FROMDEVICE); rxdp->Control_2 = SET_BUFFER0_SIZE_3(BUF0_LEN); if (nic->rxd_mode == RXD_MODE_3B) { /* Two buffer mode */ @@ -2347,10 +2404,13 @@ static int fill_rx_buffers(struct s2io_nic *nic, int ring_no) (nic->pdev, skb->data, dev->mtu + 4, PCI_DMA_FROMDEVICE); - /* Buffer-1 will be dummy buffer not used */ - ((RxD3_t*)rxdp)->Buffer1_ptr = - pci_map_single(nic->pdev, ba->ba_1, BUF1_LEN, - PCI_DMA_FROMDEVICE); + /* Buffer-1 will be dummy buffer. Not used */ + if (!(((RxD3_t*)rxdp)->Buffer1_ptr)) { + ((RxD3_t*)rxdp)->Buffer1_ptr = + pci_map_single(nic->pdev, + ba->ba_1, BUF1_LEN, + PCI_DMA_FROMDEVICE); + } rxdp->Control_2 |= SET_BUFFER1_SIZE_3(1); rxdp->Control_2 |= SET_BUFFER2_SIZE_3 (dev->mtu + 4); @@ -2516,7 +2576,7 @@ static int s2io_poll(struct net_device *dev, int *budget) mac_info_t *mac_control; struct config_param *config; XENA_dev_config_t __iomem *bar0 = nic->bar0; - u64 val64; + u64 val64 = 0xFFFFFFFFFFFFFFFFULL; int i; atomic_inc(&nic->isr_cnt); @@ -2528,8 +2588,8 @@ static int s2io_poll(struct net_device *dev, int *budget) nic->pkts_to_process = dev->quota; org_pkts_to_process = nic->pkts_to_process; - val64 = readq(&bar0->rx_traffic_int); writeq(val64, &bar0->rx_traffic_int); + val64 = readl(&bar0->rx_traffic_int); for (i = 0; i < config->rx_ring_num; i++) { rx_intr_handler(&mac_control->rings[i]); @@ -2554,7 +2614,8 @@ static int s2io_poll(struct net_device *dev, int *budget) } } /* Re enable the Rx interrupts. */ - en_dis_able_nic_intrs(nic, RX_TRAFFIC_INTR, ENABLE_INTRS); + writeq(0x0, &bar0->rx_traffic_mask); + val64 = readl(&bar0->rx_traffic_mask); atomic_dec(&nic->isr_cnt); return 0; @@ -2574,6 +2635,58 @@ no_rx: } #endif +#ifdef CONFIG_NET_POLL_CONTROLLER +/** + * s2io_netpoll - netpoll event handler entry point + * @dev : pointer to the device structure. + * Description: + * This function will be called by upper layer to check for events on the + * interface in situations where interrupts are disabled. It is used for + * specific in-kernel networking tasks, such as remote consoles and kernel + * debugging over the network (example netdump in RedHat). + */ +static void s2io_netpoll(struct net_device *dev) +{ + nic_t *nic = dev->priv; + mac_info_t *mac_control; + struct config_param *config; + XENA_dev_config_t __iomem *bar0 = nic->bar0; + u64 val64 = 0xFFFFFFFFFFFFFFFFULL; + int i; + + disable_irq(dev->irq); + + atomic_inc(&nic->isr_cnt); + mac_control = &nic->mac_control; + config = &nic->config; + + writeq(val64, &bar0->rx_traffic_int); + writeq(val64, &bar0->tx_traffic_int); + + /* we need to free up the transmitted skbufs or else netpoll will + * run out of skbs and will fail and eventually netpoll application such + * as netdump will fail. + */ + for (i = 0; i < config->tx_fifo_num; i++) + tx_intr_handler(&mac_control->fifos[i]); + + /* check for received packet and indicate up to network */ + for (i = 0; i < config->rx_ring_num; i++) + rx_intr_handler(&mac_control->rings[i]); + + for (i = 0; i < config->rx_ring_num; i++) { + if (fill_rx_buffers(nic, i) == -ENOMEM) { + DBG_PRINT(ERR_DBG, "%s:Out of memory", dev->name); + DBG_PRINT(ERR_DBG, " in Rx Netpoll!!\n"); + break; + } + } + atomic_dec(&nic->isr_cnt); + enable_irq(dev->irq); + return; +} +#endif + /** * rx_intr_handler - Rx interrupt handler * @nic: device private variable. @@ -2624,7 +2737,7 @@ static void rx_intr_handler(ring_info_t *ring_data) /* If your are next to put index then it's FIFO full condition */ if ((get_block == put_block) && (get_info.offset + 1) == put_info.offset) { - DBG_PRINT(ERR_DBG, "%s: Ring Full\n",dev->name); + DBG_PRINT(INTR_DBG, "%s: Ring Full\n",dev->name); break; } skb = (struct sk_buff *) ((unsigned long)rxdp->Host_Control); @@ -2644,18 +2757,15 @@ static void rx_intr_handler(ring_info_t *ring_data) HEADER_SNAP_SIZE, PCI_DMA_FROMDEVICE); } else if (nic->rxd_mode == RXD_MODE_3B) { - pci_unmap_single(nic->pdev, (dma_addr_t) + pci_dma_sync_single_for_cpu(nic->pdev, (dma_addr_t) ((RxD3_t*)rxdp)->Buffer0_ptr, BUF0_LEN, PCI_DMA_FROMDEVICE); - pci_unmap_single(nic->pdev, (dma_addr_t) - ((RxD3_t*)rxdp)->Buffer1_ptr, - BUF1_LEN, PCI_DMA_FROMDEVICE); pci_unmap_single(nic->pdev, (dma_addr_t) ((RxD3_t*)rxdp)->Buffer2_ptr, dev->mtu + 4, PCI_DMA_FROMDEVICE); } else { - pci_unmap_single(nic->pdev, (dma_addr_t) + pci_dma_sync_single_for_cpu(nic->pdev, (dma_addr_t) ((RxD3_t*)rxdp)->Buffer0_ptr, BUF0_LEN, PCI_DMA_FROMDEVICE); pci_unmap_single(nic->pdev, (dma_addr_t) @@ -2666,6 +2776,7 @@ static void rx_intr_handler(ring_info_t *ring_data) ((RxD3_t*)rxdp)->Buffer2_ptr, dev->mtu, PCI_DMA_FROMDEVICE); } + prefetch(skb->data); rx_osm_handler(ring_data, rxdp); get_info.offset++; ring_data->rx_curr_get_info.offset = get_info.offset; @@ -2737,6 +2848,10 @@ static void tx_intr_handler(fifo_info_t *fifo_data) if (txdlp->Control_1 & TXD_T_CODE) { unsigned long long err; err = txdlp->Control_1 & TXD_T_CODE; + if (err & 0x1) { + nic->mac_control.stats_info->sw_stat. + parity_err_cnt++; + } if ((err >> 48) == 0xA) { DBG_PRINT(TX_DBG, "TxD returned due \ to loss of link\n"); @@ -2760,7 +2875,8 @@ to loss of link\n"); dev_kfree_skb_irq(skb); get_info.offset++; - get_info.offset %= get_info.fifo_len + 1; + if (get_info.offset == get_info.fifo_len + 1) + get_info.offset = 0; txdlp = (TxD_t *) fifo_data->list_info [get_info.offset].list_virt_addr; fifo_data->tx_curr_get_info.offset = @@ -2773,6 +2889,256 @@ to loss of link\n"); spin_unlock(&nic->tx_lock); } +/** + * s2io_mdio_write - Function to write in to MDIO registers + * @mmd_type : MMD type value (PMA/PMD/WIS/PCS/PHYXS) + * @addr : address value + * @value : data value + * @dev : pointer to net_device structure + * Description: + * This function is used to write values to the MDIO registers + * NONE + */ +static void s2io_mdio_write(u32 mmd_type, u64 addr, u16 value, struct net_device *dev) +{ + u64 val64 = 0x0; + nic_t *sp = dev->priv; + XENA_dev_config_t *bar0 = (XENA_dev_config_t *)sp->bar0; + + //address transaction + val64 = val64 | MDIO_MMD_INDX_ADDR(addr) + | MDIO_MMD_DEV_ADDR(mmd_type) + | MDIO_MMS_PRT_ADDR(0x0); + writeq(val64, &bar0->mdio_control); + val64 = val64 | MDIO_CTRL_START_TRANS(0xE); + writeq(val64, &bar0->mdio_control); + udelay(100); + + //Data transaction + val64 = 0x0; + val64 = val64 | MDIO_MMD_INDX_ADDR(addr) + | MDIO_MMD_DEV_ADDR(mmd_type) + | MDIO_MMS_PRT_ADDR(0x0) + | MDIO_MDIO_DATA(value) + | MDIO_OP(MDIO_OP_WRITE_TRANS); + writeq(val64, &bar0->mdio_control); + val64 = val64 | MDIO_CTRL_START_TRANS(0xE); + writeq(val64, &bar0->mdio_control); + udelay(100); + + val64 = 0x0; + val64 = val64 | MDIO_MMD_INDX_ADDR(addr) + | MDIO_MMD_DEV_ADDR(mmd_type) + | MDIO_MMS_PRT_ADDR(0x0) + | MDIO_OP(MDIO_OP_READ_TRANS); + writeq(val64, &bar0->mdio_control); + val64 = val64 | MDIO_CTRL_START_TRANS(0xE); + writeq(val64, &bar0->mdio_control); + udelay(100); + +} + +/** + * s2io_mdio_read - Function to write in to MDIO registers + * @mmd_type : MMD type value (PMA/PMD/WIS/PCS/PHYXS) + * @addr : address value + * @dev : pointer to net_device structure + * Description: + * This function is used to read values to the MDIO registers + * NONE + */ +static u64 s2io_mdio_read(u32 mmd_type, u64 addr, struct net_device *dev) +{ + u64 val64 = 0x0; + u64 rval64 = 0x0; + nic_t *sp = dev->priv; + XENA_dev_config_t *bar0 = (XENA_dev_config_t *)sp->bar0; + + /* address transaction */ + val64 = val64 | MDIO_MMD_INDX_ADDR(addr) + | MDIO_MMD_DEV_ADDR(mmd_type) + | MDIO_MMS_PRT_ADDR(0x0); + writeq(val64, &bar0->mdio_control); + val64 = val64 | MDIO_CTRL_START_TRANS(0xE); + writeq(val64, &bar0->mdio_control); + udelay(100); + + /* Data transaction */ + val64 = 0x0; + val64 = val64 | MDIO_MMD_INDX_ADDR(addr) + | MDIO_MMD_DEV_ADDR(mmd_type) + | MDIO_MMS_PRT_ADDR(0x0) + | MDIO_OP(MDIO_OP_READ_TRANS); + writeq(val64, &bar0->mdio_control); + val64 = val64 | MDIO_CTRL_START_TRANS(0xE); + writeq(val64, &bar0->mdio_control); + udelay(100); + + /* Read the value from regs */ + rval64 = readq(&bar0->mdio_control); + rval64 = rval64 & 0xFFFF0000; + rval64 = rval64 >> 16; + return rval64; +} +/** + * s2io_chk_xpak_counter - Function to check the status of the xpak counters + * @counter : couter value to be updated + * @flag : flag to indicate the status + * @type : counter type + * Description: + * This function is to check the status of the xpak counters value + * NONE + */ + +static void s2io_chk_xpak_counter(u64 *counter, u64 * regs_stat, u32 index, u16 flag, u16 type) +{ + u64 mask = 0x3; + u64 val64; + int i; + for(i = 0; i 0) + { + *counter = *counter + 1; + val64 = *regs_stat & mask; + val64 = val64 >> (index * 0x2); + val64 = val64 + 1; + if(val64 == 3) + { + switch(type) + { + case 1: + DBG_PRINT(ERR_DBG, "Take Xframe NIC out of " + "service. Excessive temperatures may " + "result in premature transceiver " + "failure \n"); + break; + case 2: + DBG_PRINT(ERR_DBG, "Take Xframe NIC out of " + "service Excessive bias currents may " + "indicate imminent laser diode " + "failure \n"); + break; + case 3: + DBG_PRINT(ERR_DBG, "Take Xframe NIC out of " + "service Excessive laser output " + "power may saturate far-end " + "receiver\n"); + break; + default: + DBG_PRINT(ERR_DBG, "Incorrect XPAK Alarm " + "type \n"); + } + val64 = 0x0; + } + val64 = val64 << (index * 0x2); + *regs_stat = (*regs_stat & (~mask)) | (val64); + + } else { + *regs_stat = *regs_stat & (~mask); + } +} + +/** + * s2io_updt_xpak_counter - Function to update the xpak counters + * @dev : pointer to net_device struct + * Description: + * This function is to upate the status of the xpak counters value + * NONE + */ +static void s2io_updt_xpak_counter(struct net_device *dev) +{ + u16 flag = 0x0; + u16 type = 0x0; + u16 val16 = 0x0; + u64 val64 = 0x0; + u64 addr = 0x0; + + nic_t *sp = dev->priv; + StatInfo_t *stat_info = sp->mac_control.stats_info; + + /* Check the communication with the MDIO slave */ + addr = 0x0000; + val64 = 0x0; + val64 = s2io_mdio_read(MDIO_MMD_PMA_DEV_ADDR, addr, dev); + if((val64 == 0xFFFF) || (val64 == 0x0000)) + { + DBG_PRINT(ERR_DBG, "ERR: MDIO slave access failed - " + "Returned %llx\n", (unsigned long long)val64); + return; + } + + /* Check for the expecte value of 2040 at PMA address 0x0000 */ + if(val64 != 0x2040) + { + DBG_PRINT(ERR_DBG, "Incorrect value at PMA address 0x0000 - "); + DBG_PRINT(ERR_DBG, "Returned: %llx- Expected: 0x2040\n", + (unsigned long long)val64); + return; + } + + /* Loading the DOM register to MDIO register */ + addr = 0xA100; + s2io_mdio_write(MDIO_MMD_PMA_DEV_ADDR, addr, val16, dev); + val64 = s2io_mdio_read(MDIO_MMD_PMA_DEV_ADDR, addr, dev); + + /* Reading the Alarm flags */ + addr = 0xA070; + val64 = 0x0; + val64 = s2io_mdio_read(MDIO_MMD_PMA_DEV_ADDR, addr, dev); + + flag = CHECKBIT(val64, 0x7); + type = 1; + s2io_chk_xpak_counter(&stat_info->xpak_stat.alarm_transceiver_temp_high, + &stat_info->xpak_stat.xpak_regs_stat, + 0x0, flag, type); + + if(CHECKBIT(val64, 0x6)) + stat_info->xpak_stat.alarm_transceiver_temp_low++; + + flag = CHECKBIT(val64, 0x3); + type = 2; + s2io_chk_xpak_counter(&stat_info->xpak_stat.alarm_laser_bias_current_high, + &stat_info->xpak_stat.xpak_regs_stat, + 0x2, flag, type); + + if(CHECKBIT(val64, 0x2)) + stat_info->xpak_stat.alarm_laser_bias_current_low++; + + flag = CHECKBIT(val64, 0x1); + type = 3; + s2io_chk_xpak_counter(&stat_info->xpak_stat.alarm_laser_output_power_high, + &stat_info->xpak_stat.xpak_regs_stat, + 0x4, flag, type); + + if(CHECKBIT(val64, 0x0)) + stat_info->xpak_stat.alarm_laser_output_power_low++; + + /* Reading the Warning flags */ + addr = 0xA074; + val64 = 0x0; + val64 = s2io_mdio_read(MDIO_MMD_PMA_DEV_ADDR, addr, dev); + + if(CHECKBIT(val64, 0x7)) + stat_info->xpak_stat.warn_transceiver_temp_high++; + + if(CHECKBIT(val64, 0x6)) + stat_info->xpak_stat.warn_transceiver_temp_low++; + + if(CHECKBIT(val64, 0x3)) + stat_info->xpak_stat.warn_laser_bias_current_high++; + + if(CHECKBIT(val64, 0x2)) + stat_info->xpak_stat.warn_laser_bias_current_low++; + + if(CHECKBIT(val64, 0x1)) + stat_info->xpak_stat.warn_laser_output_power_high++; + + if(CHECKBIT(val64, 0x0)) + stat_info->xpak_stat.warn_laser_output_power_low++; +} + /** * alarm_intr_handler - Alarm Interrrupt handler * @nic: device private variable @@ -2790,6 +3156,18 @@ static void alarm_intr_handler(struct s2io_nic *nic) struct net_device *dev = (struct net_device *) nic->dev; XENA_dev_config_t __iomem *bar0 = nic->bar0; register u64 val64 = 0, err_reg = 0; + u64 cnt; + int i; + nic->mac_control.stats_info->sw_stat.ring_full_cnt = 0; + /* Handling the XPAK counters update */ + if(nic->mac_control.stats_info->xpak_stat.xpak_timer_count < 72000) { + /* waiting for an hour */ + nic->mac_control.stats_info->xpak_stat.xpak_timer_count++; + } else { + s2io_updt_xpak_counter(dev); + /* reset the count to zero */ + nic->mac_control.stats_info->xpak_stat.xpak_timer_count = 0; + } /* Handling link status change error Intr */ if (s2io_link_fault_indication(nic) == MAC_RMAC_ERR_TIMER) { @@ -2816,6 +3194,8 @@ static void alarm_intr_handler(struct s2io_nic *nic) MC_ERR_REG_MIRI_ECC_DB_ERR_1)) { netif_stop_queue(dev); schedule_work(&nic->rst_timer_task); + nic->mac_control.stats_info->sw_stat. + soft_reset_cnt++; } } } else { @@ -2827,11 +3207,13 @@ static void alarm_intr_handler(struct s2io_nic *nic) /* In case of a serious error, the device will be Reset. */ val64 = readq(&bar0->serr_source); if (val64 & SERR_SOURCE_ANY) { + nic->mac_control.stats_info->sw_stat.serious_err_cnt++; DBG_PRINT(ERR_DBG, "%s: Device indicates ", dev->name); DBG_PRINT(ERR_DBG, "serious error %llx!!\n", (unsigned long long)val64); netif_stop_queue(dev); schedule_work(&nic->rst_timer_task); + nic->mac_control.stats_info->sw_stat.soft_reset_cnt++; } /* @@ -2849,6 +3231,35 @@ static void alarm_intr_handler(struct s2io_nic *nic) ac = readq(&bar0->adapter_control); schedule_work(&nic->set_link_task); } + /* Check for data parity error */ + val64 = readq(&bar0->pic_int_status); + if (val64 & PIC_INT_GPIO) { + val64 = readq(&bar0->gpio_int_reg); + if (val64 & GPIO_INT_REG_DP_ERR_INT) { + nic->mac_control.stats_info->sw_stat.parity_err_cnt++; + schedule_work(&nic->rst_timer_task); + nic->mac_control.stats_info->sw_stat.soft_reset_cnt++; + } + } + + /* Check for ring full counter */ + if (nic->device_type & XFRAME_II_DEVICE) { + val64 = readq(&bar0->ring_bump_counter1); + for (i=0; i<4; i++) { + cnt = ( val64 & vBIT(0xFFFF,(i*16),16)); + cnt >>= 64 - ((i+1)*16); + nic->mac_control.stats_info->sw_stat.ring_full_cnt + += cnt; + } + + val64 = readq(&bar0->ring_bump_counter2); + for (i=0; i<4; i++) { + cnt = ( val64 & vBIT(0xFFFF,(i*16),16)); + cnt >>= 64 - ((i+1)*16); + nic->mac_control.stats_info->sw_stat.ring_full_cnt + += cnt; + } + } /* Other type of interrupts are not being handled now, TODO */ } @@ -2864,23 +3275,26 @@ static void alarm_intr_handler(struct s2io_nic *nic) * SUCCESS on success and FAILURE on failure. */ -static int wait_for_cmd_complete(nic_t * sp) +static int wait_for_cmd_complete(void *addr, u64 busy_bit) { - XENA_dev_config_t __iomem *bar0 = sp->bar0; int ret = FAILURE, cnt = 0; u64 val64; while (TRUE) { - val64 = readq(&bar0->rmac_addr_cmd_mem); - if (!(val64 & RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING)) { + val64 = readq(addr); + if (!(val64 & busy_bit)) { ret = SUCCESS; break; } - msleep(50); + + if(in_interrupt()) + mdelay(50); + else + msleep(50); + if (cnt++ > 10) break; } - return ret; } @@ -2919,6 +3333,9 @@ static void s2io_reset(nic_t * sp) * PCI write to sw_reset register is done by this time. */ msleep(250); + if (strstr(sp->product_name, "CX4")) { + msleep(750); + } /* Restore the PCI state saved during initialization. */ pci_restore_state(sp->pdev); @@ -2936,7 +3353,7 @@ static void s2io_reset(nic_t * sp) /* Clear certain PCI/PCI-X fields after reset */ if (sp->device_type == XFRAME_II_DEVICE) { - /* Clear parity err detect bit */ + /* Clear "detected parity error" bit */ pci_write_config_word(sp->pdev, PCI_STATUS, 0x8000); /* Clearing PCIX Ecc status register */ @@ -3137,7 +3554,7 @@ static void restore_xmsi_data(nic_t *nic) u64 val64; int i; - for (i=0; i< MAX_REQUESTED_MSI_X; i++) { + for (i=0; i < MAX_REQUESTED_MSI_X; i++) { writeq(nic->msix_info[i].addr, &bar0->xmsi_address); writeq(nic->msix_info[i].data, &bar0->xmsi_data); val64 = (BIT(7) | BIT(15) | vBIT(i, 26, 6)); @@ -3156,7 +3573,7 @@ static void store_xmsi_data(nic_t *nic) int i; /* Store and display */ - for (i=0; i< MAX_REQUESTED_MSI_X; i++) { + for (i=0; i < MAX_REQUESTED_MSI_X; i++) { val64 = (BIT(15) | vBIT(i, 26, 6)); writeq(val64, &bar0->xmsi_access); if (wait_for_msix_trans(nic, i)) { @@ -3284,15 +3701,24 @@ static int s2io_enable_msi_x(nic_t *nic) writeq(tx_mat, &bar0->tx_mat0_n[7]); } + nic->avail_msix_vectors = 0; ret = pci_enable_msix(nic->pdev, nic->entries, MAX_REQUESTED_MSI_X); + /* We fail init if error or we get less vectors than min required */ + if (ret >= (nic->config.tx_fifo_num + nic->config.rx_ring_num + 1)) { + nic->avail_msix_vectors = ret; + ret = pci_enable_msix(nic->pdev, nic->entries, ret); + } if (ret) { DBG_PRINT(ERR_DBG, "%s: Enabling MSIX failed\n", nic->dev->name); kfree(nic->entries); kfree(nic->s2io_entries); nic->entries = NULL; nic->s2io_entries = NULL; + nic->avail_msix_vectors = 0; return -ENOMEM; } + if (!nic->avail_msix_vectors) + nic->avail_msix_vectors = MAX_REQUESTED_MSI_X; /* * To enable MSI-X, MSI also needs to be enabled, due to a bug @@ -3325,8 +3751,6 @@ static int s2io_open(struct net_device *dev) { nic_t *sp = dev->priv; int err = 0; - int i; - u16 msi_control; /* Temp variable */ /* * Make sure you have link off by default every time @@ -3336,98 +3760,23 @@ static int s2io_open(struct net_device *dev) sp->last_link_state = 0; /* Initialize H/W and enable interrupts */ - if (s2io_card_up(sp)) { + err = s2io_card_up(sp); + if (err) { DBG_PRINT(ERR_DBG, "%s: H/W initialization failed\n", dev->name); + goto hw_init_failed; + } + + if (s2io_set_mac_addr(dev, dev->dev_addr) == FAILURE) { + DBG_PRINT(ERR_DBG, "Set Mac Address Failed\n"); + s2io_card_down(sp); err = -ENODEV; goto hw_init_failed; } - /* Store the values of the MSIX table in the nic_t structure */ - store_xmsi_data(sp); + netif_start_queue(dev); + return 0; - /* After proper initialization of H/W, register ISR */ - if (sp->intr_type == MSI) { - err = request_irq((int) sp->pdev->irq, s2io_msi_handle, - SA_SHIRQ, sp->name, dev); - if (err) { - DBG_PRINT(ERR_DBG, "%s: MSI registration \ -failed\n", dev->name); - goto isr_registration_failed; - } - } - if (sp->intr_type == MSI_X) { - for (i=1; (sp->s2io_entries[i].in_use == MSIX_FLG); i++) { - if (sp->s2io_entries[i].type == MSIX_FIFO_TYPE) { - sprintf(sp->desc1, "%s:MSI-X-%d-TX", - dev->name, i); - err = request_irq(sp->entries[i].vector, - s2io_msix_fifo_handle, 0, sp->desc1, - sp->s2io_entries[i].arg); - DBG_PRINT(ERR_DBG, "%s @ 0x%llx\n", sp->desc1, - (unsigned long long)sp->msix_info[i].addr); - } else { - sprintf(sp->desc2, "%s:MSI-X-%d-RX", - dev->name, i); - err = request_irq(sp->entries[i].vector, - s2io_msix_ring_handle, 0, sp->desc2, - sp->s2io_entries[i].arg); - DBG_PRINT(ERR_DBG, "%s @ 0x%llx\n", sp->desc2, - (unsigned long long)sp->msix_info[i].addr); - } - if (err) { - DBG_PRINT(ERR_DBG, "%s: MSI-X-%d registration \ -failed\n", dev->name, i); - DBG_PRINT(ERR_DBG, "Returned: %d\n", err); - goto isr_registration_failed; - } - sp->s2io_entries[i].in_use = MSIX_REGISTERED_SUCCESS; - } - } - if (sp->intr_type == INTA) { - err = request_irq((int) sp->pdev->irq, s2io_isr, SA_SHIRQ, - sp->name, dev); - if (err) { - DBG_PRINT(ERR_DBG, "%s: ISR registration failed\n", - dev->name); - goto isr_registration_failed; - } - } - - if (s2io_set_mac_addr(dev, dev->dev_addr) == FAILURE) { - DBG_PRINT(ERR_DBG, "Set Mac Address Failed\n"); - err = -ENODEV; - goto setting_mac_address_failed; - } - - netif_start_queue(dev); - return 0; - -setting_mac_address_failed: - if (sp->intr_type != MSI_X) - free_irq(sp->pdev->irq, dev); -isr_registration_failed: - del_timer_sync(&sp->alarm_timer); - if (sp->intr_type == MSI_X) { - if (sp->device_type == XFRAME_II_DEVICE) { - for (i=1; (sp->s2io_entries[i].in_use == - MSIX_REGISTERED_SUCCESS); i++) { - int vector = sp->entries[i].vector; - void *arg = sp->s2io_entries[i].arg; - - free_irq(vector, arg); - } - pci_disable_msix(sp->pdev); - - /* Temp */ - pci_read_config_word(sp->pdev, 0x42, &msi_control); - msi_control &= 0xFFFE; /* Disable MSI */ - pci_write_config_word(sp->pdev, 0x42, msi_control); - } - } - else if (sp->intr_type == MSI) - pci_disable_msi(sp->pdev); - s2io_reset(sp); hw_init_failed: if (sp->intr_type == MSI_X) { if (sp->entries) @@ -3454,35 +3803,12 @@ hw_init_failed: static int s2io_close(struct net_device *dev) { nic_t *sp = dev->priv; - int i; - u16 msi_control; flush_scheduled_work(); netif_stop_queue(dev); /* Reset card, kill tasklet and free Tx and Rx buffers. */ s2io_card_down(sp); - if (sp->intr_type == MSI_X) { - if (sp->device_type == XFRAME_II_DEVICE) { - for (i=1; (sp->s2io_entries[i].in_use == - MSIX_REGISTERED_SUCCESS); i++) { - int vector = sp->entries[i].vector; - void *arg = sp->s2io_entries[i].arg; - - free_irq(vector, arg); - } - pci_read_config_word(sp->pdev, 0x42, &msi_control); - msi_control &= 0xFFFE; /* Disable MSI */ - pci_write_config_word(sp->pdev, 0x42, msi_control); - - pci_disable_msix(sp->pdev); - } - } - else { - free_irq(sp->pdev->irq, dev); - if (sp->intr_type == MSI) - pci_disable_msi(sp->pdev); - } sp->device_close_flag = TRUE; /* Device is shut down. */ return 0; } @@ -3508,13 +3834,11 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) TxD_t *txdp; TxFIFO_element_t __iomem *tx_fifo; unsigned long flags; -#ifdef NETIF_F_TSO - int mss; -#endif u16 vlan_tag = 0; int vlan_priority = 0; mac_info_t *mac_control; struct config_param *config; + int offload_type; mac_control = &sp->mac_control; config = &sp->config; @@ -3545,7 +3869,8 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) queue_len = mac_control->fifos[queue].tx_curr_put_info.fifo_len + 1; /* Avoid "put" pointer going beyond "get" pointer */ - if (txdp->Host_Control || (((put_off + 1) % queue_len) == get_off)) { + if (txdp->Host_Control || + ((put_off+1) == queue_len ? 0 : (put_off+1)) == get_off) { DBG_PRINT(TX_DBG, "Error in xmit, No free TXDs.\n"); netif_stop_queue(dev); dev_kfree_skb(skb); @@ -3561,13 +3886,11 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) return 0; } - txdp->Control_1 = 0; - txdp->Control_2 = 0; + offload_type = s2io_offload_type(skb); #ifdef NETIF_F_TSO - mss = skb_shinfo(skb)->gso_size; - if (skb_shinfo(skb)->gso_type == SKB_GSO_TCPV4) { + if (offload_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6)) { txdp->Control_1 |= TXD_TCP_LSO_EN; - txdp->Control_1 |= TXD_TCP_LSO_MSS(mss); + txdp->Control_1 |= TXD_TCP_LSO_MSS(s2io_tcp_mss(skb)); } #endif if (skb->ip_summed == CHECKSUM_HW) { @@ -3585,10 +3908,10 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) } frg_len = skb->len - skb->data_len; - if (skb_shinfo(skb)->gso_type == SKB_GSO_UDPV4) { + if (offload_type == SKB_GSO_UDP) { int ufo_size; - ufo_size = skb_shinfo(skb)->gso_size; + ufo_size = s2io_udp_mss(skb); ufo_size &= ~7; txdp->Control_1 |= TXD_UFO_EN; txdp->Control_1 |= TXD_UFO_MSS(ufo_size); @@ -3605,16 +3928,13 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) 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)->gso_type == SKB_GSO_UDPV4) + if (offload_type == SKB_GSO_UDP) txdp->Control_1 |= TXD_UFO_EN; frg_cnt = skb_shinfo(skb)->nr_frags; @@ -3629,12 +3949,12 @@ 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)->gso_type == SKB_GSO_UDPV4) + if (offload_type == SKB_GSO_UDP) txdp->Control_1 |= TXD_UFO_EN; } txdp->Control_1 |= TXD_GATHER_CODE_LAST; - if (skb_shinfo(skb)->gso_type == SKB_GSO_UDPV4) + if (offload_type == SKB_GSO_UDP) frg_cnt++; /* as Txd0 was used for inband header */ tx_fifo = mac_control->tx_FIFO_start[queue]; @@ -3643,23 +3963,21 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) val64 = (TX_FIFO_LAST_TXD_NUM(frg_cnt) | TX_FIFO_FIRST_LIST | TX_FIFO_LAST_LIST); - -#ifdef NETIF_F_TSO - if (mss) - val64 |= TX_FIFO_SPECIAL_FUNC; -#endif - if (skb_shinfo(skb)->gso_type == SKB_GSO_UDPV4) + if (offload_type) val64 |= TX_FIFO_SPECIAL_FUNC; + writeq(val64, &tx_fifo->List_Control); mmiowb(); put_off++; - put_off %= mac_control->fifos[queue].tx_curr_put_info.fifo_len + 1; + if (put_off == mac_control->fifos[queue].tx_curr_put_info.fifo_len + 1) + put_off = 0; mac_control->fifos[queue].tx_curr_put_info.offset = put_off; /* Avoid "put" pointer going beyond "get" pointer */ - if (((put_off + 1) % queue_len) == get_off) { + if (((put_off+1) == queue_len ? 0 : (put_off+1)) == get_off) { + sp->mac_control.stats_info->sw_stat.fifo_full_cnt++; DBG_PRINT(TX_DBG, "No free TxDs for xmit, Put: 0x%x Get:0x%x\n", put_off, get_off); @@ -3681,13 +3999,41 @@ s2io_alarm_handle(unsigned long data) mod_timer(&sp->alarm_timer, jiffies + HZ / 2); } +static int s2io_chk_rx_buffers(nic_t *sp, int rng_n) +{ + int rxb_size, level; + + if (!sp->lro) { + rxb_size = atomic_read(&sp->rx_bufs_left[rng_n]); + level = rx_buffer_level(sp, rxb_size, rng_n); + + if ((level == PANIC) && (!TASKLET_IN_USE)) { + int ret; + DBG_PRINT(INTR_DBG, "%s: Rx BD hit ", __FUNCTION__); + DBG_PRINT(INTR_DBG, "PANIC levels\n"); + if ((ret = fill_rx_buffers(sp, rng_n)) == -ENOMEM) { + DBG_PRINT(ERR_DBG, "Out of memory in %s", + __FUNCTION__); + clear_bit(0, (&sp->tasklet_status)); + return -1; + } + clear_bit(0, (&sp->tasklet_status)); + } else if (level == LOW) + tasklet_schedule(&sp->task); + + } else if (fill_rx_buffers(sp, rng_n) == -ENOMEM) { + DBG_PRINT(ERR_DBG, "%s:Out of memory", sp->dev->name); + DBG_PRINT(ERR_DBG, " in Rx Intr!!\n"); + } + return 0; +} + static irqreturn_t s2io_msi_handle(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *) dev_id; nic_t *sp = dev->priv; int i; - int ret; mac_info_t *mac_control; struct config_param *config; @@ -3709,35 +4055,8 @@ s2io_msi_handle(int irq, void *dev_id, struct pt_regs *regs) * reallocate the buffers from the interrupt handler itself, * else schedule a tasklet to reallocate the buffers. */ - for (i = 0; i < config->rx_ring_num; i++) { - if (!sp->lro) { - int rxb_size = atomic_read(&sp->rx_bufs_left[i]); - int level = rx_buffer_level(sp, rxb_size, i); - - if ((level == PANIC) && (!TASKLET_IN_USE)) { - DBG_PRINT(INTR_DBG, "%s: Rx BD hit ", - dev->name); - DBG_PRINT(INTR_DBG, "PANIC levels\n"); - if ((ret = fill_rx_buffers(sp, i)) == -ENOMEM) { - DBG_PRINT(ERR_DBG, "%s:Out of memory", - dev->name); - DBG_PRINT(ERR_DBG, " in ISR!!\n"); - clear_bit(0, (&sp->tasklet_status)); - atomic_dec(&sp->isr_cnt); - return IRQ_HANDLED; - } - clear_bit(0, (&sp->tasklet_status)); - } else if (level == LOW) { - tasklet_schedule(&sp->task); - } - } - else if (fill_rx_buffers(sp, i) == -ENOMEM) { - DBG_PRINT(ERR_DBG, "%s:Out of memory", - dev->name); - DBG_PRINT(ERR_DBG, " in Rx Intr!!\n"); - break; - } - } + for (i = 0; i < config->rx_ring_num; i++) + s2io_chk_rx_buffers(sp, i); atomic_dec(&sp->isr_cnt); return IRQ_HANDLED; @@ -3748,39 +4067,13 @@ s2io_msix_ring_handle(int irq, void *dev_id, struct pt_regs *regs) { ring_info_t *ring = (ring_info_t *)dev_id; nic_t *sp = ring->nic; - struct net_device *dev = (struct net_device *) dev_id; - int rxb_size, level, rng_n; atomic_inc(&sp->isr_cnt); - rx_intr_handler(ring); - rng_n = ring->ring_no; - if (!sp->lro) { - rxb_size = atomic_read(&sp->rx_bufs_left[rng_n]); - level = rx_buffer_level(sp, rxb_size, rng_n); - - if ((level == PANIC) && (!TASKLET_IN_USE)) { - int ret; - DBG_PRINT(INTR_DBG, "%s: Rx BD hit ", __FUNCTION__); - DBG_PRINT(INTR_DBG, "PANIC levels\n"); - if ((ret = fill_rx_buffers(sp, rng_n)) == -ENOMEM) { - DBG_PRINT(ERR_DBG, "Out of memory in %s", - __FUNCTION__); - clear_bit(0, (&sp->tasklet_status)); - return IRQ_HANDLED; - } - clear_bit(0, (&sp->tasklet_status)); - } else if (level == LOW) { - tasklet_schedule(&sp->task); - } - } - else if (fill_rx_buffers(sp, rng_n) == -ENOMEM) { - DBG_PRINT(ERR_DBG, "%s:Out of memory", dev->name); - DBG_PRINT(ERR_DBG, " in Rx Intr!!\n"); - } + rx_intr_handler(ring); + s2io_chk_rx_buffers(sp, ring->ring_no); atomic_dec(&sp->isr_cnt); - return IRQ_HANDLED; } @@ -3795,7 +4088,6 @@ s2io_msix_fifo_handle(int irq, void *dev_id, struct pt_regs *regs) atomic_dec(&sp->isr_cnt); return IRQ_HANDLED; } - static void s2io_txpic_intr_handle(nic_t *sp) { XENA_dev_config_t __iomem *bar0 = sp->bar0; @@ -3806,41 +4098,56 @@ static void s2io_txpic_intr_handle(nic_t *sp) val64 = readq(&bar0->gpio_int_reg); if ((val64 & GPIO_INT_REG_LINK_DOWN) && (val64 & GPIO_INT_REG_LINK_UP)) { + /* + * This is unstable state so clear both up/down + * interrupt and adapter to re-evaluate the link state. + */ val64 |= GPIO_INT_REG_LINK_DOWN; val64 |= GPIO_INT_REG_LINK_UP; writeq(val64, &bar0->gpio_int_reg); - goto masking; - } - - if (((sp->last_link_state == LINK_UP) && - (val64 & GPIO_INT_REG_LINK_DOWN)) || - ((sp->last_link_state == LINK_DOWN) && - (val64 & GPIO_INT_REG_LINK_UP))) { val64 = readq(&bar0->gpio_int_mask); - val64 |= GPIO_INT_MASK_LINK_DOWN; - val64 |= GPIO_INT_MASK_LINK_UP; + val64 &= ~(GPIO_INT_MASK_LINK_UP | + GPIO_INT_MASK_LINK_DOWN); writeq(val64, &bar0->gpio_int_mask); - s2io_set_link((unsigned long)sp); } -masking: - if (sp->last_link_state == LINK_UP) { - /*enable down interrupt */ - val64 = readq(&bar0->gpio_int_mask); - /* unmasks link down intr */ - val64 &= ~GPIO_INT_MASK_LINK_DOWN; - /* masks link up intr */ - val64 |= GPIO_INT_MASK_LINK_UP; - writeq(val64, &bar0->gpio_int_mask); - } else { - /*enable UP Interrupt */ - val64 = readq(&bar0->gpio_int_mask); - /* unmasks link up interrupt */ - val64 &= ~GPIO_INT_MASK_LINK_UP; - /* masks link down interrupt */ - val64 |= GPIO_INT_MASK_LINK_DOWN; - writeq(val64, &bar0->gpio_int_mask); + else if (val64 & GPIO_INT_REG_LINK_UP) { + val64 = readq(&bar0->adapter_status); + if (verify_xena_quiescence(sp, val64, + sp->device_enabled_once)) { + /* Enable Adapter */ + val64 = readq(&bar0->adapter_control); + val64 |= ADAPTER_CNTL_EN; + writeq(val64, &bar0->adapter_control); + val64 |= ADAPTER_LED_ON; + writeq(val64, &bar0->adapter_control); + if (!sp->device_enabled_once) + sp->device_enabled_once = 1; + + s2io_link(sp, LINK_UP); + /* + * unmask link down interrupt and mask link-up + * intr + */ + val64 = readq(&bar0->gpio_int_mask); + val64 &= ~GPIO_INT_MASK_LINK_DOWN; + val64 |= GPIO_INT_MASK_LINK_UP; + writeq(val64, &bar0->gpio_int_mask); + + } + }else if (val64 & GPIO_INT_REG_LINK_DOWN) { + val64 = readq(&bar0->adapter_status); + if (verify_xena_quiescence(sp, val64, + sp->device_enabled_once)) { + s2io_link(sp, LINK_DOWN); + /* Link is down so unmaks link up interrupt */ + val64 = readq(&bar0->gpio_int_mask); + val64 &= ~GPIO_INT_MASK_LINK_UP; + val64 |= GPIO_INT_MASK_LINK_DOWN; + writeq(val64, &bar0->gpio_int_mask); + } } } + val64 = readq(&bar0->gpio_int_mask); } /** @@ -3863,7 +4170,7 @@ static irqreturn_t s2io_isr(int irq, void *dev_id, struct pt_regs *regs) nic_t *sp = dev->priv; XENA_dev_config_t __iomem *bar0 = sp->bar0; int i; - u64 reason = 0, val64; + u64 reason = 0, val64, org_mask; mac_info_t *mac_control; struct config_param *config; @@ -3887,43 +4194,41 @@ static irqreturn_t s2io_isr(int irq, void *dev_id, struct pt_regs *regs) return IRQ_NONE; } + val64 = 0xFFFFFFFFFFFFFFFFULL; + /* Store current mask before masking all interrupts */ + org_mask = readq(&bar0->general_int_mask); + writeq(val64, &bar0->general_int_mask); + #ifdef CONFIG_S2IO_NAPI if (reason & GEN_INTR_RXTRAFFIC) { if (netif_rx_schedule_prep(dev)) { - en_dis_able_nic_intrs(sp, RX_TRAFFIC_INTR, - DISABLE_INTRS); + writeq(val64, &bar0->rx_traffic_mask); __netif_rx_schedule(dev); } } #else - /* If Intr is because of Rx Traffic */ - if (reason & GEN_INTR_RXTRAFFIC) { - /* - * rx_traffic_int reg is an R1 register, writing all 1's - * will ensure that the actual interrupt causing bit get's - * cleared and hence a read can be avoided. - */ - val64 = 0xFFFFFFFFFFFFFFFFULL; - writeq(val64, &bar0->rx_traffic_int); - for (i = 0; i < config->rx_ring_num; i++) { - rx_intr_handler(&mac_control->rings[i]); - } + /* + * Rx handler is called by default, without checking for the + * cause of interrupt. + * rx_traffic_int reg is an R1 register, writing all 1's + * will ensure that the actual interrupt causing bit get's + * cleared and hence a read can be avoided. + */ + writeq(val64, &bar0->rx_traffic_int); + for (i = 0; i < config->rx_ring_num; i++) { + rx_intr_handler(&mac_control->rings[i]); } #endif - /* If Intr is because of Tx Traffic */ - if (reason & GEN_INTR_TXTRAFFIC) { - /* - * tx_traffic_int reg is an R1 register, writing all 1's - * will ensure that the actual interrupt causing bit get's - * cleared and hence a read can be avoided. - */ - val64 = 0xFFFFFFFFFFFFFFFFULL; - writeq(val64, &bar0->tx_traffic_int); + /* + * tx_traffic_int reg is an R1 register, writing all 1's + * will ensure that the actual interrupt causing bit get's + * cleared and hence a read can be avoided. + */ + writeq(val64, &bar0->tx_traffic_int); - for (i = 0; i < config->tx_fifo_num; i++) - tx_intr_handler(&mac_control->fifos[i]); - } + for (i = 0; i < config->tx_fifo_num; i++) + tx_intr_handler(&mac_control->fifos[i]); if (reason & GEN_INTR_TXPIC) s2io_txpic_intr_handle(sp); @@ -3933,38 +4238,10 @@ static irqreturn_t s2io_isr(int irq, void *dev_id, struct pt_regs *regs) * else schedule a tasklet to reallocate the buffers. */ #ifndef CONFIG_S2IO_NAPI - for (i = 0; i < config->rx_ring_num; i++) { - if (!sp->lro) { - int ret; - int rxb_size = atomic_read(&sp->rx_bufs_left[i]); - int level = rx_buffer_level(sp, rxb_size, i); - - if ((level == PANIC) && (!TASKLET_IN_USE)) { - DBG_PRINT(INTR_DBG, "%s: Rx BD hit ", - dev->name); - DBG_PRINT(INTR_DBG, "PANIC levels\n"); - if ((ret = fill_rx_buffers(sp, i)) == -ENOMEM) { - DBG_PRINT(ERR_DBG, "%s:Out of memory", - dev->name); - DBG_PRINT(ERR_DBG, " in ISR!!\n"); - clear_bit(0, (&sp->tasklet_status)); - atomic_dec(&sp->isr_cnt); - return IRQ_HANDLED; - } - clear_bit(0, (&sp->tasklet_status)); - } else if (level == LOW) { - tasklet_schedule(&sp->task); - } - } - else if (fill_rx_buffers(sp, i) == -ENOMEM) { - DBG_PRINT(ERR_DBG, "%s:Out of memory", - dev->name); - DBG_PRINT(ERR_DBG, " in Rx intr!!\n"); - break; - } - } + for (i = 0; i < config->rx_ring_num; i++) + s2io_chk_rx_buffers(sp, i); #endif - + writeq(org_mask, &bar0->general_int_mask); atomic_dec(&sp->isr_cnt); return IRQ_HANDLED; } @@ -3992,6 +4269,8 @@ static void s2io_updt_stats(nic_t *sp) if (cnt == 5) break; /* Updt failed */ } while(1); + } else { + memset(sp->mac_control.stats_info, 0, sizeof(StatInfo_t)); } } @@ -4067,7 +4346,8 @@ static void s2io_set_multicast(struct net_device *dev) RMAC_ADDR_CMD_MEM_OFFSET(MAC_MC_ALL_MC_ADDR_OFFSET); writeq(val64, &bar0->rmac_addr_cmd_mem); /* Wait till command completes */ - wait_for_cmd_complete(sp); + wait_for_cmd_complete(&bar0->rmac_addr_cmd_mem, + RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING); sp->m_cast_flg = 1; sp->all_multi_pos = MAC_MC_ALL_MC_ADDR_OFFSET; @@ -4082,7 +4362,8 @@ static void s2io_set_multicast(struct net_device *dev) RMAC_ADDR_CMD_MEM_OFFSET(sp->all_multi_pos); writeq(val64, &bar0->rmac_addr_cmd_mem); /* Wait till command completes */ - wait_for_cmd_complete(sp); + wait_for_cmd_complete(&bar0->rmac_addr_cmd_mem, + RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING); sp->m_cast_flg = 0; sp->all_multi_pos = 0; @@ -4147,7 +4428,8 @@ static void s2io_set_multicast(struct net_device *dev) writeq(val64, &bar0->rmac_addr_cmd_mem); /* Wait for command completes */ - if (wait_for_cmd_complete(sp)) { + if (wait_for_cmd_complete(&bar0->rmac_addr_cmd_mem, + RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING)) { DBG_PRINT(ERR_DBG, "%s: Adding ", dev->name); DBG_PRINT(ERR_DBG, "Multicasts failed\n"); @@ -4177,7 +4459,8 @@ static void s2io_set_multicast(struct net_device *dev) writeq(val64, &bar0->rmac_addr_cmd_mem); /* Wait for command completes */ - if (wait_for_cmd_complete(sp)) { + if (wait_for_cmd_complete(&bar0->rmac_addr_cmd_mem, + RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING)) { DBG_PRINT(ERR_DBG, "%s: Adding ", dev->name); DBG_PRINT(ERR_DBG, "Multicasts failed\n"); @@ -4222,7 +4505,8 @@ static int s2io_set_mac_addr(struct net_device *dev, u8 * addr) RMAC_ADDR_CMD_MEM_OFFSET(0); writeq(val64, &bar0->rmac_addr_cmd_mem); /* Wait till command completes */ - if (wait_for_cmd_complete(sp)) { + if (wait_for_cmd_complete(&bar0->rmac_addr_cmd_mem, + RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING)) { DBG_PRINT(ERR_DBG, "%s: set_mac_addr failed\n", dev->name); return FAILURE; } @@ -4619,6 +4903,50 @@ static int write_eeprom(nic_t * sp, int off, u64 data, int cnt) } return ret; } +static void s2io_vpd_read(nic_t *nic) +{ + u8 *vpd_data; + u8 data; + int i=0, cnt, fail = 0; + int vpd_addr = 0x80; + + if (nic->device_type == XFRAME_II_DEVICE) { + strcpy(nic->product_name, "Xframe II 10GbE network adapter"); + vpd_addr = 0x80; + } + else { + strcpy(nic->product_name, "Xframe I 10GbE network adapter"); + vpd_addr = 0x50; + } + + vpd_data = kmalloc(256, GFP_KERNEL); + if (!vpd_data) + return; + + for (i = 0; i < 256; i +=4 ) { + pci_write_config_byte(nic->pdev, (vpd_addr + 2), i); + pci_read_config_byte(nic->pdev, (vpd_addr + 2), &data); + pci_write_config_byte(nic->pdev, (vpd_addr + 3), 0); + for (cnt = 0; cnt <5; cnt++) { + msleep(2); + pci_read_config_byte(nic->pdev, (vpd_addr + 3), &data); + if (data == 0x80) + break; + } + if (cnt >= 5) { + DBG_PRINT(ERR_DBG, "Read of VPD data failed\n"); + fail = 1; + break; + } + pci_read_config_dword(nic->pdev, (vpd_addr + 4), + (u32 *)&vpd_data[i]); + } + if ((!fail) && (vpd_data[1] < VPD_PRODUCT_NAME_LEN)) { + memset(nic->product_name, 0, vpd_data[1]); + memcpy(nic->product_name, &vpd_data[3], vpd_data[1]); + } + kfree(vpd_data); +} /** * s2io_ethtool_geeprom - reads the value stored in the Eeprom. @@ -4931,10 +5259,12 @@ static int s2io_link_test(nic_t * sp, uint64_t * data) u64 val64; val64 = readq(&bar0->adapter_status); - if (val64 & ADAPTER_STATUS_RMAC_LOCAL_FAULT) + if(!(LINK_IS_UP(val64))) *data = 1; + else + *data = 0; - return 0; + return *data; } /** @@ -5112,7 +5442,6 @@ static void s2io_get_ethtool_stats(struct net_device *dev, int i = 0; nic_t *sp = dev->priv; StatInfo_t *stat_info = sp->mac_control.stats_info; - u64 tmp; s2io_updt_stats(sp); tmp_stats[i++] = @@ -5129,9 +5458,19 @@ static void s2io_get_ethtool_stats(struct net_device *dev, (u64)le32_to_cpu(stat_info->tmac_bcst_frms_oflow) << 32 | le32_to_cpu(stat_info->tmac_bcst_frms); tmp_stats[i++] = le64_to_cpu(stat_info->tmac_pause_ctrl_frms); + tmp_stats[i++] = + (u64)le32_to_cpu(stat_info->tmac_ttl_octets_oflow) << 32 | + le32_to_cpu(stat_info->tmac_ttl_octets); + tmp_stats[i++] = + (u64)le32_to_cpu(stat_info->tmac_ucst_frms_oflow) << 32 | + le32_to_cpu(stat_info->tmac_ucst_frms); + tmp_stats[i++] = + (u64)le32_to_cpu(stat_info->tmac_nucst_frms_oflow) << 32 | + le32_to_cpu(stat_info->tmac_nucst_frms); tmp_stats[i++] = (u64)le32_to_cpu(stat_info->tmac_any_err_frms_oflow) << 32 | le32_to_cpu(stat_info->tmac_any_err_frms); + tmp_stats[i++] = le64_to_cpu(stat_info->tmac_ttl_less_fb_octets); tmp_stats[i++] = le64_to_cpu(stat_info->tmac_vld_ip_octets); tmp_stats[i++] = (u64)le32_to_cpu(stat_info->tmac_vld_ip_oflow) << 32 | @@ -5163,11 +5502,27 @@ static void s2io_get_ethtool_stats(struct net_device *dev, (u64)le32_to_cpu(stat_info->rmac_vld_bcst_frms_oflow) << 32 | le32_to_cpu(stat_info->rmac_vld_bcst_frms); tmp_stats[i++] = le32_to_cpu(stat_info->rmac_in_rng_len_err_frms); + tmp_stats[i++] = le32_to_cpu(stat_info->rmac_out_rng_len_err_frms); tmp_stats[i++] = le64_to_cpu(stat_info->rmac_long_frms); tmp_stats[i++] = le64_to_cpu(stat_info->rmac_pause_ctrl_frms); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_unsup_ctrl_frms); + tmp_stats[i++] = + (u64)le32_to_cpu(stat_info->rmac_ttl_octets_oflow) << 32 | + le32_to_cpu(stat_info->rmac_ttl_octets); + tmp_stats[i++] = + (u64)le32_to_cpu(stat_info->rmac_accepted_ucst_frms_oflow) + << 32 | le32_to_cpu(stat_info->rmac_accepted_ucst_frms); + tmp_stats[i++] = + (u64)le32_to_cpu(stat_info->rmac_accepted_nucst_frms_oflow) + << 32 | le32_to_cpu(stat_info->rmac_accepted_nucst_frms); tmp_stats[i++] = (u64)le32_to_cpu(stat_info->rmac_discarded_frms_oflow) << 32 | le32_to_cpu(stat_info->rmac_discarded_frms); + tmp_stats[i++] = + (u64)le32_to_cpu(stat_info->rmac_drop_events_oflow) + << 32 | le32_to_cpu(stat_info->rmac_drop_events); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_ttl_less_fb_octets); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_ttl_frms); tmp_stats[i++] = (u64)le32_to_cpu(stat_info->rmac_usized_frms_oflow) << 32 | le32_to_cpu(stat_info->rmac_usized_frms); @@ -5180,40 +5535,129 @@ static void s2io_get_ethtool_stats(struct net_device *dev, tmp_stats[i++] = (u64)le32_to_cpu(stat_info->rmac_jabber_frms_oflow) << 32 | le32_to_cpu(stat_info->rmac_jabber_frms); - tmp_stats[i++] = (u64)le32_to_cpu(stat_info->rmac_ip_oflow) << 32 | + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_ttl_64_frms); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_ttl_65_127_frms); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_ttl_128_255_frms); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_ttl_256_511_frms); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_ttl_512_1023_frms); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_ttl_1024_1518_frms); + tmp_stats[i++] = + (u64)le32_to_cpu(stat_info->rmac_ip_oflow) << 32 | le32_to_cpu(stat_info->rmac_ip); tmp_stats[i++] = le64_to_cpu(stat_info->rmac_ip_octets); tmp_stats[i++] = le32_to_cpu(stat_info->rmac_hdr_err_ip); - tmp_stats[i++] = (u64)le32_to_cpu(stat_info->rmac_drop_ip_oflow) << 32 | + tmp_stats[i++] = + (u64)le32_to_cpu(stat_info->rmac_drop_ip_oflow) << 32 | le32_to_cpu(stat_info->rmac_drop_ip); - tmp_stats[i++] = (u64)le32_to_cpu(stat_info->rmac_icmp_oflow) << 32 | + tmp_stats[i++] = + (u64)le32_to_cpu(stat_info->rmac_icmp_oflow) << 32 | le32_to_cpu(stat_info->rmac_icmp); tmp_stats[i++] = le64_to_cpu(stat_info->rmac_tcp); - tmp_stats[i++] = (u64)le32_to_cpu(stat_info->rmac_udp_oflow) << 32 | + tmp_stats[i++] = + (u64)le32_to_cpu(stat_info->rmac_udp_oflow) << 32 | le32_to_cpu(stat_info->rmac_udp); tmp_stats[i++] = (u64)le32_to_cpu(stat_info->rmac_err_drp_udp_oflow) << 32 | le32_to_cpu(stat_info->rmac_err_drp_udp); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_xgmii_err_sym); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_frms_q0); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_frms_q1); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_frms_q2); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_frms_q3); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_frms_q4); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_frms_q5); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_frms_q6); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_frms_q7); + tmp_stats[i++] = le16_to_cpu(stat_info->rmac_full_q0); + tmp_stats[i++] = le16_to_cpu(stat_info->rmac_full_q1); + tmp_stats[i++] = le16_to_cpu(stat_info->rmac_full_q2); + tmp_stats[i++] = le16_to_cpu(stat_info->rmac_full_q3); + tmp_stats[i++] = le16_to_cpu(stat_info->rmac_full_q4); + tmp_stats[i++] = le16_to_cpu(stat_info->rmac_full_q5); + tmp_stats[i++] = le16_to_cpu(stat_info->rmac_full_q6); + tmp_stats[i++] = le16_to_cpu(stat_info->rmac_full_q7); tmp_stats[i++] = (u64)le32_to_cpu(stat_info->rmac_pause_cnt_oflow) << 32 | le32_to_cpu(stat_info->rmac_pause_cnt); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_xgmii_data_err_cnt); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_xgmii_ctrl_err_cnt); tmp_stats[i++] = (u64)le32_to_cpu(stat_info->rmac_accepted_ip_oflow) << 32 | le32_to_cpu(stat_info->rmac_accepted_ip); tmp_stats[i++] = le32_to_cpu(stat_info->rmac_err_tcp); + tmp_stats[i++] = le32_to_cpu(stat_info->rd_req_cnt); + tmp_stats[i++] = le32_to_cpu(stat_info->new_rd_req_cnt); + tmp_stats[i++] = le32_to_cpu(stat_info->new_rd_req_rtry_cnt); + tmp_stats[i++] = le32_to_cpu(stat_info->rd_rtry_cnt); + tmp_stats[i++] = le32_to_cpu(stat_info->wr_rtry_rd_ack_cnt); + tmp_stats[i++] = le32_to_cpu(stat_info->wr_req_cnt); + tmp_stats[i++] = le32_to_cpu(stat_info->new_wr_req_cnt); + tmp_stats[i++] = le32_to_cpu(stat_info->new_wr_req_rtry_cnt); + tmp_stats[i++] = le32_to_cpu(stat_info->wr_rtry_cnt); + tmp_stats[i++] = le32_to_cpu(stat_info->wr_disc_cnt); + tmp_stats[i++] = le32_to_cpu(stat_info->rd_rtry_wr_ack_cnt); + tmp_stats[i++] = le32_to_cpu(stat_info->txp_wr_cnt); + tmp_stats[i++] = le32_to_cpu(stat_info->txd_rd_cnt); + tmp_stats[i++] = le32_to_cpu(stat_info->txd_wr_cnt); + tmp_stats[i++] = le32_to_cpu(stat_info->rxd_rd_cnt); + tmp_stats[i++] = le32_to_cpu(stat_info->rxd_wr_cnt); + tmp_stats[i++] = le32_to_cpu(stat_info->txf_rd_cnt); + tmp_stats[i++] = le32_to_cpu(stat_info->rxf_wr_cnt); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_ttl_1519_4095_frms); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_ttl_4096_8191_frms); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_ttl_8192_max_frms); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_ttl_gt_max_frms); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_osized_alt_frms); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_jabber_alt_frms); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_gt_max_alt_frms); + tmp_stats[i++] = le64_to_cpu(stat_info->rmac_vlan_frms); + tmp_stats[i++] = le32_to_cpu(stat_info->rmac_len_discard); + tmp_stats[i++] = le32_to_cpu(stat_info->rmac_fcs_discard); + tmp_stats[i++] = le32_to_cpu(stat_info->rmac_pf_discard); + tmp_stats[i++] = le32_to_cpu(stat_info->rmac_da_discard); + tmp_stats[i++] = le32_to_cpu(stat_info->rmac_red_discard); + tmp_stats[i++] = le32_to_cpu(stat_info->rmac_rts_discard); + tmp_stats[i++] = le32_to_cpu(stat_info->rmac_ingm_full_discard); + tmp_stats[i++] = le32_to_cpu(stat_info->link_fault_cnt); tmp_stats[i++] = 0; tmp_stats[i++] = stat_info->sw_stat.single_ecc_errs; tmp_stats[i++] = stat_info->sw_stat.double_ecc_errs; + tmp_stats[i++] = stat_info->sw_stat.parity_err_cnt; + tmp_stats[i++] = stat_info->sw_stat.serious_err_cnt; + tmp_stats[i++] = stat_info->sw_stat.soft_reset_cnt; + tmp_stats[i++] = stat_info->sw_stat.fifo_full_cnt; + tmp_stats[i++] = stat_info->sw_stat.ring_full_cnt; + tmp_stats[i++] = stat_info->xpak_stat.alarm_transceiver_temp_high; + tmp_stats[i++] = stat_info->xpak_stat.alarm_transceiver_temp_low; + tmp_stats[i++] = stat_info->xpak_stat.alarm_laser_bias_current_high; + tmp_stats[i++] = stat_info->xpak_stat.alarm_laser_bias_current_low; + tmp_stats[i++] = stat_info->xpak_stat.alarm_laser_output_power_high; + tmp_stats[i++] = stat_info->xpak_stat.alarm_laser_output_power_low; + tmp_stats[i++] = stat_info->xpak_stat.warn_transceiver_temp_high; + tmp_stats[i++] = stat_info->xpak_stat.warn_transceiver_temp_low; + tmp_stats[i++] = stat_info->xpak_stat.warn_laser_bias_current_high; + tmp_stats[i++] = stat_info->xpak_stat.warn_laser_bias_current_low; + tmp_stats[i++] = stat_info->xpak_stat.warn_laser_output_power_high; + tmp_stats[i++] = stat_info->xpak_stat.warn_laser_output_power_low; tmp_stats[i++] = stat_info->sw_stat.clubbed_frms_cnt; tmp_stats[i++] = stat_info->sw_stat.sending_both; tmp_stats[i++] = stat_info->sw_stat.outof_sequence_pkts; tmp_stats[i++] = stat_info->sw_stat.flush_max_pkts; - tmp = 0; if (stat_info->sw_stat.num_aggregations) { - tmp = stat_info->sw_stat.sum_avg_pkts_aggregated; - do_div(tmp, stat_info->sw_stat.num_aggregations); + u64 tmp = stat_info->sw_stat.sum_avg_pkts_aggregated; + int count = 0; + /* + * Since 64-bit divide does not work on all platforms, + * do repeated subtraction. + */ + while (tmp >= stat_info->sw_stat.num_aggregations) { + tmp -= stat_info->sw_stat.num_aggregations; + count++; + } + tmp_stats[i++] = count; } - tmp_stats[i++] = tmp; + else + tmp_stats[i++] = 0; } static int s2io_ethtool_get_regs_len(struct net_device *dev) @@ -5278,6 +5722,19 @@ static int s2io_ethtool_op_set_tx_csum(struct net_device *dev, u32 data) return 0; } +static u32 s2io_ethtool_op_get_tso(struct net_device *dev) +{ + return (dev->features & NETIF_F_TSO) != 0; +} +static int s2io_ethtool_op_set_tso(struct net_device *dev, u32 data) +{ + if (data) + dev->features |= (NETIF_F_TSO | NETIF_F_TSO6); + else + dev->features &= ~(NETIF_F_TSO | NETIF_F_TSO6); + + return 0; +} static struct ethtool_ops netdev_ethtool_ops = { .get_settings = s2io_ethtool_gset, @@ -5298,8 +5755,8 @@ static struct ethtool_ops netdev_ethtool_ops = { .get_sg = ethtool_op_get_sg, .set_sg = ethtool_op_set_sg, #ifdef NETIF_F_TSO - .get_tso = ethtool_op_get_tso, - .set_tso = ethtool_op_set_tso, + .get_tso = s2io_ethtool_op_get_tso, + .set_tso = s2io_ethtool_op_set_tso, #endif .get_ufo = ethtool_op_get_ufo, .set_ufo = ethtool_op_set_ufo, @@ -5489,6 +5946,277 @@ static void s2io_set_link(unsigned long data) clear_bit(0, &(nic->link_state)); } +static int set_rxd_buffer_pointer(nic_t *sp, RxD_t *rxdp, buffAdd_t *ba, + struct sk_buff **skb, u64 *temp0, u64 *temp1, + u64 *temp2, int size) +{ + struct net_device *dev = sp->dev; + struct sk_buff *frag_list; + + if ((sp->rxd_mode == RXD_MODE_1) && (rxdp->Host_Control == 0)) { + /* allocate skb */ + if (*skb) { + DBG_PRINT(INFO_DBG, "SKB is not NULL\n"); + /* + * As Rx frame are not going to be processed, + * using same mapped address for the Rxd + * buffer pointer + */ + ((RxD1_t*)rxdp)->Buffer0_ptr = *temp0; + } else { + *skb = dev_alloc_skb(size); + if (!(*skb)) { + DBG_PRINT(ERR_DBG, "%s: Out of ", dev->name); + DBG_PRINT(ERR_DBG, "memory to allocate SKBs\n"); + return -ENOMEM ; + } + /* storing the mapped addr in a temp variable + * such it will be used for next rxd whose + * Host Control is NULL + */ + ((RxD1_t*)rxdp)->Buffer0_ptr = *temp0 = + pci_map_single( sp->pdev, (*skb)->data, + size - NET_IP_ALIGN, + PCI_DMA_FROMDEVICE); + rxdp->Host_Control = (unsigned long) (*skb); + } + } else if ((sp->rxd_mode == RXD_MODE_3B) && (rxdp->Host_Control == 0)) { + /* Two buffer Mode */ + if (*skb) { + ((RxD3_t*)rxdp)->Buffer2_ptr = *temp2; + ((RxD3_t*)rxdp)->Buffer0_ptr = *temp0; + ((RxD3_t*)rxdp)->Buffer1_ptr = *temp1; + } else { + *skb = dev_alloc_skb(size); + ((RxD3_t*)rxdp)->Buffer2_ptr = *temp2 = + pci_map_single(sp->pdev, (*skb)->data, + dev->mtu + 4, + PCI_DMA_FROMDEVICE); + ((RxD3_t*)rxdp)->Buffer0_ptr = *temp0 = + pci_map_single( sp->pdev, ba->ba_0, BUF0_LEN, + PCI_DMA_FROMDEVICE); + rxdp->Host_Control = (unsigned long) (*skb); + + /* Buffer-1 will be dummy buffer not used */ + ((RxD3_t*)rxdp)->Buffer1_ptr = *temp1 = + pci_map_single(sp->pdev, ba->ba_1, BUF1_LEN, + PCI_DMA_FROMDEVICE); + } + } else if ((rxdp->Host_Control == 0)) { + /* Three buffer mode */ + if (*skb) { + ((RxD3_t*)rxdp)->Buffer0_ptr = *temp0; + ((RxD3_t*)rxdp)->Buffer1_ptr = *temp1; + ((RxD3_t*)rxdp)->Buffer2_ptr = *temp2; + } else { + *skb = dev_alloc_skb(size); + + ((RxD3_t*)rxdp)->Buffer0_ptr = *temp0 = + pci_map_single(sp->pdev, ba->ba_0, BUF0_LEN, + PCI_DMA_FROMDEVICE); + /* Buffer-1 receives L3/L4 headers */ + ((RxD3_t*)rxdp)->Buffer1_ptr = *temp1 = + pci_map_single( sp->pdev, (*skb)->data, + l3l4hdr_size + 4, + PCI_DMA_FROMDEVICE); + /* + * skb_shinfo(skb)->frag_list will have L4 + * data payload + */ + skb_shinfo(*skb)->frag_list = dev_alloc_skb(dev->mtu + + ALIGN_SIZE); + if (skb_shinfo(*skb)->frag_list == NULL) { + DBG_PRINT(ERR_DBG, "%s: dev_alloc_skb \ + failed\n ", dev->name); + return -ENOMEM ; + } + frag_list = skb_shinfo(*skb)->frag_list; + frag_list->next = NULL; + /* + * Buffer-2 receives L4 data payload + */ + ((RxD3_t*)rxdp)->Buffer2_ptr = *temp2 = + pci_map_single( sp->pdev, frag_list->data, + dev->mtu, PCI_DMA_FROMDEVICE); + } + } + return 0; +} +static void set_rxd_buffer_size(nic_t *sp, RxD_t *rxdp, int size) +{ + struct net_device *dev = sp->dev; + if (sp->rxd_mode == RXD_MODE_1) { + rxdp->Control_2 = SET_BUFFER0_SIZE_1( size - NET_IP_ALIGN); + } else if (sp->rxd_mode == RXD_MODE_3B) { + rxdp->Control_2 = SET_BUFFER0_SIZE_3(BUF0_LEN); + rxdp->Control_2 |= SET_BUFFER1_SIZE_3(1); + rxdp->Control_2 |= SET_BUFFER2_SIZE_3( dev->mtu + 4); + } else { + rxdp->Control_2 = SET_BUFFER0_SIZE_3(BUF0_LEN); + rxdp->Control_2 |= SET_BUFFER1_SIZE_3(l3l4hdr_size + 4); + rxdp->Control_2 |= SET_BUFFER2_SIZE_3(dev->mtu); + } +} + +static int rxd_owner_bit_reset(nic_t *sp) +{ + int i, j, k, blk_cnt = 0, size; + mac_info_t * mac_control = &sp->mac_control; + struct config_param *config = &sp->config; + struct net_device *dev = sp->dev; + RxD_t *rxdp = NULL; + struct sk_buff *skb = NULL; + buffAdd_t *ba = NULL; + u64 temp0_64 = 0, temp1_64 = 0, temp2_64 = 0; + + /* Calculate the size based on ring mode */ + size = dev->mtu + HEADER_ETHERNET_II_802_3_SIZE + + HEADER_802_2_SIZE + HEADER_SNAP_SIZE; + if (sp->rxd_mode == RXD_MODE_1) + size += NET_IP_ALIGN; + else if (sp->rxd_mode == RXD_MODE_3B) + size = dev->mtu + ALIGN_SIZE + BUF0_LEN + 4; + else + size = l3l4hdr_size + ALIGN_SIZE + BUF0_LEN + 4; + + for (i = 0; i < config->rx_ring_num; i++) { + blk_cnt = config->rx_cfg[i].num_rxd / + (rxd_count[sp->rxd_mode] +1); + + for (j = 0; j < blk_cnt; j++) { + for (k = 0; k < rxd_count[sp->rxd_mode]; k++) { + rxdp = mac_control->rings[i]. + rx_blocks[j].rxds[k].virt_addr; + if(sp->rxd_mode >= RXD_MODE_3A) + ba = &mac_control->rings[i].ba[j][k]; + set_rxd_buffer_pointer(sp, rxdp, ba, + &skb,(u64 *)&temp0_64, + (u64 *)&temp1_64, + (u64 *)&temp2_64, size); + + set_rxd_buffer_size(sp, rxdp, size); + wmb(); + /* flip the Ownership bit to Hardware */ + rxdp->Control_1 |= RXD_OWN_XENA; + } + } + } + return 0; + +} + +static int s2io_add_isr(nic_t * sp) +{ + int ret = 0; + struct net_device *dev = sp->dev; + int err = 0; + + if (sp->intr_type == MSI) + ret = s2io_enable_msi(sp); + else if (sp->intr_type == MSI_X) + ret = s2io_enable_msi_x(sp); + if (ret) { + DBG_PRINT(ERR_DBG, "%s: Defaulting to INTA\n", dev->name); + sp->intr_type = INTA; + } + + /* Store the values of the MSIX table in the nic_t structure */ + store_xmsi_data(sp); + + /* After proper initialization of H/W, register ISR */ + if (sp->intr_type == MSI) { + err = request_irq((int) sp->pdev->irq, s2io_msi_handle, + IRQF_SHARED, sp->name, dev); + if (err) { + pci_disable_msi(sp->pdev); + DBG_PRINT(ERR_DBG, "%s: MSI registration failed\n", + dev->name); + return -1; + } + } + if (sp->intr_type == MSI_X) { + int i; + + for (i=1; (sp->s2io_entries[i].in_use == MSIX_FLG); i++) { + if (sp->s2io_entries[i].type == MSIX_FIFO_TYPE) { + sprintf(sp->desc[i], "%s:MSI-X-%d-TX", + dev->name, i); + err = request_irq(sp->entries[i].vector, + s2io_msix_fifo_handle, 0, sp->desc[i], + sp->s2io_entries[i].arg); + DBG_PRINT(ERR_DBG, "%s @ 0x%llx\n", sp->desc[i], + (unsigned long long)sp->msix_info[i].addr); + } else { + sprintf(sp->desc[i], "%s:MSI-X-%d-RX", + dev->name, i); + err = request_irq(sp->entries[i].vector, + s2io_msix_ring_handle, 0, sp->desc[i], + sp->s2io_entries[i].arg); + DBG_PRINT(ERR_DBG, "%s @ 0x%llx\n", sp->desc[i], + (unsigned long long)sp->msix_info[i].addr); + } + if (err) { + DBG_PRINT(ERR_DBG,"%s:MSI-X-%d registration " + "failed\n", dev->name, i); + DBG_PRINT(ERR_DBG, "Returned: %d\n", err); + return -1; + } + sp->s2io_entries[i].in_use = MSIX_REGISTERED_SUCCESS; + } + } + if (sp->intr_type == INTA) { + err = request_irq((int) sp->pdev->irq, s2io_isr, IRQF_SHARED, + sp->name, dev); + if (err) { + DBG_PRINT(ERR_DBG, "%s: ISR registration failed\n", + dev->name); + return -1; + } + } + return 0; +} +static void s2io_rem_isr(nic_t * sp) +{ + int cnt = 0; + struct net_device *dev = sp->dev; + + if (sp->intr_type == MSI_X) { + int i; + u16 msi_control; + + for (i=1; (sp->s2io_entries[i].in_use == + MSIX_REGISTERED_SUCCESS); i++) { + int vector = sp->entries[i].vector; + void *arg = sp->s2io_entries[i].arg; + + free_irq(vector, arg); + } + pci_read_config_word(sp->pdev, 0x42, &msi_control); + msi_control &= 0xFFFE; /* Disable MSI */ + pci_write_config_word(sp->pdev, 0x42, msi_control); + + pci_disable_msix(sp->pdev); + } else { + free_irq(sp->pdev->irq, dev); + if (sp->intr_type == MSI) { + u16 val; + + pci_disable_msi(sp->pdev); + pci_read_config_word(sp->pdev, 0x4c, &val); + val ^= 0x1; + pci_write_config_word(sp->pdev, 0x4c, val); + } + } + /* Waiting till all Interrupt handlers are complete */ + cnt = 0; + do { + msleep(10); + if (!atomic_read(&sp->isr_cnt)) + break; + cnt++; + } while(cnt < 5); +} + static void s2io_card_down(nic_t * sp) { int cnt = 0; @@ -5506,11 +6234,22 @@ static void s2io_card_down(nic_t * sp) /* disable Tx and Rx traffic on the NIC */ stop_nic(sp); + s2io_rem_isr(sp); + /* Kill tasklet. */ tasklet_kill(&sp->task); /* Check if the device is Quiescent and then Reset the NIC */ do { + /* As per the HW requirement we need to replenish the + * receive buffer to avoid the ring bump. Since there is + * no intention of processing the Rx frame at this pointwe are + * just settting the ownership bit of rxd in Each Rx + * ring to HW and set the appropriate buffer size + * based on the ring mode + */ + rxd_owner_bit_reset(sp); + val64 = readq(&bar0->adapter_status); if (verify_xena_quiescence(sp, val64, sp->device_enabled_once)) { break; @@ -5528,15 +6267,6 @@ static void s2io_card_down(nic_t * sp) } while (1); s2io_reset(sp); - /* Waiting till all Interrupt handlers are complete */ - cnt = 0; - do { - msleep(10); - if (!atomic_read(&sp->isr_cnt)) - break; - cnt++; - } while(cnt < 5); - spin_lock_irqsave(&sp->tx_lock, flags); /* Free all Tx buffers */ free_tx_buffers(sp); @@ -5556,23 +6286,16 @@ static int s2io_card_up(nic_t * sp) mac_info_t *mac_control; struct config_param *config; struct net_device *dev = (struct net_device *) sp->dev; + u16 interruptible; /* Initialize the H/W I/O registers */ if (init_nic(sp) != 0) { DBG_PRINT(ERR_DBG, "%s: H/W initialization failed\n", dev->name); + s2io_reset(sp); return -ENODEV; } - if (sp->intr_type == MSI) - ret = s2io_enable_msi(sp); - else if (sp->intr_type == MSI_X) - ret = s2io_enable_msi_x(sp); - if (ret) { - DBG_PRINT(ERR_DBG, "%s: Defaulting to INTA\n", dev->name); - sp->intr_type = INTA; - } - /* * Initializing the Rx buffers. For now we are considering only 1 * Rx ring and initializing buffers into 30 Rx blocks @@ -5596,28 +6319,46 @@ static int s2io_card_up(nic_t * sp) s2io_set_multicast(dev); if (sp->lro) { - /* Initialize max aggregatable pkts based on MTU */ + /* Initialize max aggregatable pkts per session based on MTU */ sp->lro_max_aggr_per_sess = ((1<<16) - 1) / dev->mtu; /* Check if we can use(if specified) user provided value */ if (lro_max_pkts < sp->lro_max_aggr_per_sess) sp->lro_max_aggr_per_sess = lro_max_pkts; } - /* Enable tasklet for the device */ - tasklet_init(&sp->task, s2io_tasklet, (unsigned long) dev); - /* Enable Rx Traffic and interrupts on the NIC */ if (start_nic(sp)) { DBG_PRINT(ERR_DBG, "%s: Starting NIC failed\n", dev->name); - tasklet_kill(&sp->task); s2io_reset(sp); - free_irq(dev->irq, dev); + free_rx_buffers(sp); + return -ENODEV; + } + + /* Add interrupt service routine */ + if (s2io_add_isr(sp) != 0) { + if (sp->intr_type == MSI_X) + s2io_rem_isr(sp); + s2io_reset(sp); free_rx_buffers(sp); return -ENODEV; } S2IO_TIMER_CONF(sp->alarm_timer, s2io_alarm_handle, sp, (HZ/2)); + /* Enable tasklet for the device */ + tasklet_init(&sp->task, s2io_tasklet, (unsigned long) dev); + + /* Enable select interrupts */ + if (sp->intr_type != INTA) + en_dis_able_nic_intrs(sp, ENA_ALL_INTRS, DISABLE_INTRS); + else { + interruptible = TX_TRAFFIC_INTR | RX_TRAFFIC_INTR; + interruptible |= TX_PIC_INTR | RX_PIC_INTR; + interruptible |= TX_MAC_INTR | RX_MAC_INTR; + en_dis_able_nic_intrs(sp, interruptible, ENABLE_INTRS); + } + + atomic_set(&sp->card_state, CARD_UP); return 0; } @@ -5667,6 +6408,7 @@ static void s2io_tx_watchdog(struct net_device *dev) if (netif_carrier_ok(dev)) { schedule_work(&sp->rst_timer_task); + sp->mac_control.stats_info->sw_stat.soft_reset_cnt++; } } @@ -5678,7 +6420,7 @@ static void s2io_tx_watchdog(struct net_device *dev) * @cksum : FCS checksum of the frame. * @ring_no : the ring from which this RxD was extracted. * Description: - * This function is called by the Tx interrupt serivce routine to perform + * This function is called by the Rx interrupt serivce routine to perform * some OS related operations on the SKB before passing it to the upper * layers. It mainly checks if the checksum is OK, if so adds it to the * SKBs cksum variable, increments the Rx packet count and passes the SKB @@ -5695,18 +6437,33 @@ static int rx_osm_handler(ring_info_t *ring_data, RxD_t * rxdp) ((unsigned long) rxdp->Host_Control); int ring_no = ring_data->ring_no; u16 l3_csum, l4_csum; + unsigned long long err = rxdp->Control_1 & RXD_T_CODE; lro_t *lro; skb->dev = dev; - if (rxdp->Control_1 & RXD_T_CODE) { - unsigned long long err = rxdp->Control_1 & RXD_T_CODE; - DBG_PRINT(ERR_DBG, "%s: Rx error Value: 0x%llx\n", - dev->name, err); - dev_kfree_skb(skb); - sp->stats.rx_crc_errors++; - atomic_dec(&sp->rx_bufs_left[ring_no]); - rxdp->Host_Control = 0; - return 0; + + if (err) { + /* Check for parity error */ + if (err & 0x1) { + sp->mac_control.stats_info->sw_stat.parity_err_cnt++; + } + + /* + * Drop the packet if bad transfer code. Exception being + * 0x5, which could be due to unsupported IPv6 extension header. + * In this case, we let stack handle the packet. + * Note that in this case, since checksum will be incorrect, + * stack will validate the same. + */ + if (err && ((err >> 48) != 0x5)) { + DBG_PRINT(ERR_DBG, "%s: Rx error Value: 0x%llx\n", + dev->name, err); + sp->stats.rx_crc_errors++; + dev_kfree_skb(skb); + atomic_dec(&sp->rx_bufs_left[ring_no]); + rxdp->Host_Control = 0; + return 0; + } } /* Updating statistics */ @@ -5792,6 +6549,9 @@ static int rx_osm_handler(ring_info_t *ring_data, RxD_t * rxdp) clear_lro_session(lro); goto send_up; case 0: /* sessions exceeded */ + case -1: /* non-TCP or not + * L2 aggregatable + */ case 5: /* * First pkt in session not * L3/L4 aggregatable @@ -5918,41 +6678,56 @@ static void s2io_init_pci(nic_t * sp) pci_write_config_word(sp->pdev, PCI_COMMAND, (pci_cmd | PCI_COMMAND_PARITY)); pci_read_config_word(sp->pdev, PCI_COMMAND, &pci_cmd); - - /* Forcibly disabling relaxed ordering capability of the card. */ - pcix_cmd &= 0xfffd; - pci_write_config_word(sp->pdev, PCIX_COMMAND_REGISTER, - pcix_cmd); - pci_read_config_word(sp->pdev, PCIX_COMMAND_REGISTER, - &(pcix_cmd)); } -MODULE_AUTHOR("Raghavendra Koushik "); -MODULE_LICENSE("GPL"); -MODULE_VERSION(DRV_VERSION); - -module_param(tx_fifo_num, int, 0); -module_param(rx_ring_num, int, 0); -module_param(rx_ring_mode, int, 0); -module_param_array(tx_fifo_len, uint, NULL, 0); -module_param_array(rx_ring_sz, uint, NULL, 0); -module_param_array(rts_frm_len, uint, NULL, 0); -module_param(use_continuous_tx_intrs, int, 1); -module_param(rmac_pause_time, int, 0); -module_param(mc_pause_threshold_q0q3, int, 0); -module_param(mc_pause_threshold_q4q7, int, 0); -module_param(shared_splits, int, 0); -module_param(tmac_util_period, int, 0); -module_param(rmac_util_period, int, 0); -module_param(bimodal, bool, 0); -module_param(l3l4hdr_size, int , 0); -#ifndef CONFIG_S2IO_NAPI -module_param(indicate_max_pkts, int, 0); +static int s2io_verify_parm(struct pci_dev *pdev, u8 *dev_intr_type) +{ + if ( tx_fifo_num > 8) { + DBG_PRINT(ERR_DBG, "s2io: Requested number of Tx fifos not " + "supported\n"); + DBG_PRINT(ERR_DBG, "s2io: Default to 8 Tx fifos\n"); + tx_fifo_num = 8; + } + if ( rx_ring_num > 8) { + DBG_PRINT(ERR_DBG, "s2io: Requested number of Rx rings not " + "supported\n"); + DBG_PRINT(ERR_DBG, "s2io: Default to 8 Rx rings\n"); + rx_ring_num = 8; + } +#ifdef CONFIG_S2IO_NAPI + if (*dev_intr_type != INTA) { + DBG_PRINT(ERR_DBG, "s2io: NAPI cannot be enabled when " + "MSI/MSI-X is enabled. Defaulting to INTA\n"); + *dev_intr_type = INTA; + } #endif -module_param(rxsync_frequency, int, 0); -module_param(intr_type, int, 0); -module_param(lro, int, 0); -module_param(lro_max_pkts, int, 0); +#ifndef CONFIG_PCI_MSI + if (*dev_intr_type != INTA) { + DBG_PRINT(ERR_DBG, "s2io: This kernel does not support" + "MSI/MSI-X. Defaulting to INTA\n"); + *dev_intr_type = INTA; + } +#else + if (*dev_intr_type > MSI_X) { + DBG_PRINT(ERR_DBG, "s2io: Wrong intr_type requested. " + "Defaulting to INTA\n"); + *dev_intr_type = INTA; + } +#endif + if ((*dev_intr_type == MSI_X) && + ((pdev->device != PCI_DEVICE_ID_HERC_WIN) && + (pdev->device != PCI_DEVICE_ID_HERC_UNI))) { + DBG_PRINT(ERR_DBG, "s2io: Xframe I does not support MSI_X. " + "Defaulting to INTA\n"); + *dev_intr_type = INTA; + } + if (rx_ring_mode > 3) { + DBG_PRINT(ERR_DBG, "s2io: Requested ring mode not supported\n"); + DBG_PRINT(ERR_DBG, "s2io: Defaulting to 3-buffer mode\n"); + rx_ring_mode = 3; + } + return SUCCESS; +} /** * s2io_init_nic - Initialization of the adapter . @@ -5984,15 +6759,8 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) int mode; u8 dev_intr_type = intr_type; -#ifdef CONFIG_S2IO_NAPI - if (dev_intr_type != INTA) { - DBG_PRINT(ERR_DBG, "NAPI cannot be enabled when MSI/MSI-X \ -is enabled. Defaulting to INTA\n"); - dev_intr_type = INTA; - } - else - DBG_PRINT(ERR_DBG, "NAPI support has been enabled\n"); -#endif + if ((ret = s2io_verify_parm(pdev, &dev_intr_type))) + return ret; if ((ret = pci_enable_device(pdev))) { DBG_PRINT(ERR_DBG, @@ -6017,18 +6785,10 @@ is enabled. Defaulting to INTA\n"); pci_disable_device(pdev); return -ENOMEM; } - - if ((dev_intr_type == MSI_X) && - ((pdev->device != PCI_DEVICE_ID_HERC_WIN) && - (pdev->device != PCI_DEVICE_ID_HERC_UNI))) { - DBG_PRINT(ERR_DBG, "Xframe I does not support MSI_X. \ -Defaulting to INTA\n"); - dev_intr_type = INTA; - } if (dev_intr_type != MSI_X) { if (pci_request_regions(pdev, s2io_driver_name)) { - DBG_PRINT(ERR_DBG, "Request Regions failed\n"), - pci_disable_device(pdev); + DBG_PRINT(ERR_DBG, "Request Regions failed\n"); + pci_disable_device(pdev); return -ENODEV; } } @@ -6100,8 +6860,6 @@ Defaulting to INTA\n"); config = &sp->config; /* Tx side parameters. */ - if (tx_fifo_len[0] == 0) - tx_fifo_len[0] = DEFAULT_FIFO_LEN; /* Default value. */ config->tx_fifo_num = tx_fifo_num; for (i = 0; i < MAX_TX_FIFOS; i++) { config->tx_cfg[i].fifo_len = tx_fifo_len[i]; @@ -6125,8 +6883,6 @@ Defaulting to INTA\n"); config->max_txds = MAX_SKB_FRAGS + 2; /* Rx side parameters. */ - if (rx_ring_sz[0] == 0) - rx_ring_sz[0] = SMALL_BLK_CNT; /* Default value. */ config->rx_ring_num = rx_ring_num; for (i = 0; i < MAX_RX_RINGS; i++) { config->rx_cfg[i].num_rxd = rx_ring_sz[i] * @@ -6156,7 +6912,7 @@ Defaulting to INTA\n"); /* initialize the shared memory used by the NIC and the host */ if (init_shared_mem(sp)) { DBG_PRINT(ERR_DBG, "%s: Memory allocation failed\n", - __FUNCTION__); + dev->name); ret = -ENOMEM; goto mem_alloc_failed; } @@ -6210,11 +6966,18 @@ Defaulting to INTA\n"); dev->weight = 32; #endif +#ifdef CONFIG_NET_POLL_CONTROLLER + dev->poll_controller = s2io_netpoll; +#endif + dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; if (sp->high_dma_flag == TRUE) dev->features |= NETIF_F_HIGHDMA; #ifdef NETIF_F_TSO dev->features |= NETIF_F_TSO; +#endif +#ifdef NETIF_F_TSO6 + dev->features |= NETIF_F_TSO6; #endif if (sp->device_type & XFRAME_II_DEVICE) { dev->features |= NETIF_F_UFO; @@ -6267,8 +7030,8 @@ Defaulting to INTA\n"); val64 = RMAC_ADDR_CMD_MEM_RD | RMAC_ADDR_CMD_MEM_STROBE_NEW_CMD | RMAC_ADDR_CMD_MEM_OFFSET(0 + MAC_MAC_ADDR_START_OFFSET); writeq(val64, &bar0->rmac_addr_cmd_mem); - wait_for_cmd_complete(sp); - + wait_for_cmd_complete(&bar0->rmac_addr_cmd_mem, + RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING); tmp64 = readq(&bar0->rmac_addr_data0_mem); mac_down = (u32) tmp64; mac_up = (u32) (tmp64 >> 32); @@ -6286,6 +7049,9 @@ Defaulting to INTA\n"); dev->addr_len = ETH_ALEN; memcpy(dev->dev_addr, sp->def_mac_addr, ETH_ALEN); + /* reset Nic and bring it to known state */ + s2io_reset(sp); + /* * Initialize the tasklet status and link state flags * and the card state parameter @@ -6322,82 +7088,63 @@ Defaulting to INTA\n"); ret = -ENODEV; goto register_failed; } - - if (sp->device_type & XFRAME_II_DEVICE) { - DBG_PRINT(ERR_DBG, "%s: Neterion Xframe II 10GbE adapter ", - dev->name); - DBG_PRINT(ERR_DBG, "(rev %d), Version %s", - get_xena_rev_id(sp->pdev), - s2io_driver_version); - switch(sp->intr_type) { - case INTA: - DBG_PRINT(ERR_DBG, ", Intr type INTA"); - break; - case MSI: - DBG_PRINT(ERR_DBG, ", Intr type MSI"); - break; - case MSI_X: - DBG_PRINT(ERR_DBG, ", Intr type MSI-X"); - break; - } - - DBG_PRINT(ERR_DBG, "\nCopyright(c) 2002-2005 Neterion Inc.\n"); - DBG_PRINT(ERR_DBG, "MAC ADDR: %02x:%02x:%02x:%02x:%02x:%02x\n", + s2io_vpd_read(sp); + DBG_PRINT(ERR_DBG, "Copyright(c) 2002-2005 Neterion Inc.\n"); + DBG_PRINT(ERR_DBG, "%s: Neterion %s (rev %d)\n",dev->name, + sp->product_name, get_xena_rev_id(sp->pdev)); + DBG_PRINT(ERR_DBG, "%s: Driver version %s\n", dev->name, + s2io_driver_version); + DBG_PRINT(ERR_DBG, "%s: MAC ADDR: " + "%02x:%02x:%02x:%02x:%02x:%02x\n", dev->name, sp->def_mac_addr[0].mac_addr[0], sp->def_mac_addr[0].mac_addr[1], sp->def_mac_addr[0].mac_addr[2], sp->def_mac_addr[0].mac_addr[3], sp->def_mac_addr[0].mac_addr[4], sp->def_mac_addr[0].mac_addr[5]); + if (sp->device_type & XFRAME_II_DEVICE) { mode = s2io_print_pci_mode(sp); if (mode < 0) { - DBG_PRINT(ERR_DBG, " Unsupported PCI bus mode "); + DBG_PRINT(ERR_DBG, " Unsupported PCI bus mode\n"); ret = -EBADSLT; + unregister_netdev(dev); goto set_swap_failed; } - } else { - DBG_PRINT(ERR_DBG, "%s: Neterion Xframe I 10GbE adapter ", - dev->name); - DBG_PRINT(ERR_DBG, "(rev %d), Version %s", - get_xena_rev_id(sp->pdev), - s2io_driver_version); - switch(sp->intr_type) { - case INTA: - DBG_PRINT(ERR_DBG, ", Intr type INTA"); - break; - case MSI: - DBG_PRINT(ERR_DBG, ", Intr type MSI"); - break; - case MSI_X: - DBG_PRINT(ERR_DBG, ", Intr type MSI-X"); - break; - } - DBG_PRINT(ERR_DBG, "\nCopyright(c) 2002-2005 Neterion Inc.\n"); - DBG_PRINT(ERR_DBG, "MAC ADDR: %02x:%02x:%02x:%02x:%02x:%02x\n", - sp->def_mac_addr[0].mac_addr[0], - sp->def_mac_addr[0].mac_addr[1], - sp->def_mac_addr[0].mac_addr[2], - sp->def_mac_addr[0].mac_addr[3], - sp->def_mac_addr[0].mac_addr[4], - sp->def_mac_addr[0].mac_addr[5]); } - if (sp->rxd_mode == RXD_MODE_3B) - DBG_PRINT(ERR_DBG, "%s: 2-Buffer mode support has been " - "enabled\n",dev->name); - if (sp->rxd_mode == RXD_MODE_3A) - DBG_PRINT(ERR_DBG, "%s: 3-Buffer mode support has been " - "enabled\n",dev->name); - + switch(sp->rxd_mode) { + case RXD_MODE_1: + DBG_PRINT(ERR_DBG, "%s: 1-Buffer receive mode enabled\n", + dev->name); + break; + case RXD_MODE_3B: + DBG_PRINT(ERR_DBG, "%s: 2-Buffer receive mode enabled\n", + dev->name); + break; + case RXD_MODE_3A: + DBG_PRINT(ERR_DBG, "%s: 3-Buffer receive mode enabled\n", + dev->name); + break; + } +#ifdef CONFIG_S2IO_NAPI + DBG_PRINT(ERR_DBG, "%s: NAPI enabled\n", dev->name); +#endif + switch(sp->intr_type) { + case INTA: + DBG_PRINT(ERR_DBG, "%s: Interrupt type INTA\n", dev->name); + break; + case MSI: + DBG_PRINT(ERR_DBG, "%s: Interrupt type MSI\n", dev->name); + break; + case MSI_X: + DBG_PRINT(ERR_DBG, "%s: Interrupt type MSI-X\n", dev->name); + break; + } if (sp->lro) DBG_PRINT(ERR_DBG, "%s: Large receive offload enabled\n", - dev->name); + dev->name); /* Initialize device name */ - strcpy(sp->name, dev->name); - if (sp->device_type & XFRAME_II_DEVICE) - strcat(sp->name, ": Neterion Xframe II 10GbE adapter"); - else - strcat(sp->name, ": Neterion Xframe I 10GbE adapter"); + sprintf(sp->name, "%s Neterion %s", dev->name, sp->product_name); /* Initialize bimodal Interrupts */ sp->config.bimodal = bimodal; @@ -6647,8 +7394,13 @@ static int verify_l3_l4_lro_capable(lro_t *l_lro, struct iphdr *ip, if (ip->ihl != 5) /* IP has options */ return -1; + /* If we see CE codepoint in IP header, packet is not mergeable */ + if (INET_ECN_is_ce(ipv4_get_dsfield(ip))) + return -1; + + /* If we see ECE or CWR flags in TCP header, packet is not mergeable */ if (tcp->urg || tcp->psh || tcp->rst || tcp->syn || tcp->fin || - !tcp->ack) { + tcp->ece || tcp->cwr || !tcp->ack) { /* * Currently recognize only the ack control word and * any other control field being set would result in @@ -6802,18 +7554,16 @@ static void queue_rx_frame(struct sk_buff *skb) static void lro_append_pkt(nic_t *sp, lro_t *lro, struct sk_buff *skb, u32 tcp_len) { - struct sk_buff *tmp, *first = lro->parent; + struct sk_buff *first = lro->parent; first->len += tcp_len; first->data_len = lro->frags_len; skb_pull(skb, (skb->len - tcp_len)); - if ((tmp = skb_shinfo(first)->frag_list)) { - while (tmp->next) - tmp = tmp->next; - tmp->next = skb; - } + if (skb_shinfo(first)->frag_list) + lro->last_frag->next = skb; else skb_shinfo(first)->frag_list = skb; + lro->last_frag = skb; sp->mac_control.stats_info->sw_stat.clubbed_frms_cnt++; return; } diff --git a/drivers/net/s2io.h b/drivers/net/s2io.h index 0a0b5b29d..5ed49c3be 100644 --- a/drivers/net/s2io.h +++ b/drivers/net/s2io.h @@ -31,6 +31,8 @@ #define SUCCESS 0 #define FAILURE -1 +#define CHECKBIT(value, nbit) (value & (1 << nbit)) + /* Maximum time to flicker LED when asked to identify NIC using ethtool */ #define MAX_FLICKER_TIME 60000 /* 60 Secs */ @@ -78,6 +80,11 @@ static int debug_level = ERR_DBG; typedef struct { unsigned long long single_ecc_errs; unsigned long long double_ecc_errs; + unsigned long long parity_err_cnt; + unsigned long long serious_err_cnt; + unsigned long long soft_reset_cnt; + unsigned long long fifo_full_cnt; + unsigned long long ring_full_cnt; /* LRO statistics */ unsigned long long clubbed_frms_cnt; unsigned long long sending_both; @@ -87,6 +94,25 @@ typedef struct { unsigned long long num_aggregations; } swStat_t; +/* Xpak releated alarm and warnings */ +typedef struct { + u64 alarm_transceiver_temp_high; + u64 alarm_transceiver_temp_low; + u64 alarm_laser_bias_current_high; + u64 alarm_laser_bias_current_low; + u64 alarm_laser_output_power_high; + u64 alarm_laser_output_power_low; + u64 warn_transceiver_temp_high; + u64 warn_transceiver_temp_low; + u64 warn_laser_bias_current_high; + u64 warn_laser_bias_current_low; + u64 warn_laser_output_power_high; + u64 warn_laser_output_power_low; + u64 xpak_regs_stat; + u32 xpak_timer_count; +} xpakStat_t; + + /* The statistics block of Xena */ typedef struct stat_block { /* Tx MAC statistics counters. */ @@ -263,7 +289,9 @@ typedef struct stat_block { u32 rmac_accepted_ip_oflow; u32 reserved_14; u32 link_fault_cnt; + u8 buffer[20]; swStat_t sw_stat; + xpakStat_t xpak_stat; } StatInfo_t; /* @@ -624,7 +652,7 @@ typedef struct fifo_info { nic_t *nic; }fifo_info_t; -/* Infomation related to the Tx and Rx FIFOs and Rings of Xena +/* Information related to the Tx and Rx FIFOs and Rings of Xena * is maintained in this structure. */ typedef struct mac_info { @@ -659,7 +687,8 @@ typedef struct { } usr_addr_t; /* Default Tunable parameters of the NIC. */ -#define DEFAULT_FIFO_LEN 4096 +#define DEFAULT_FIFO_0_LEN 4096 +#define DEFAULT_FIFO_1_7_LEN 512 #define SMALL_BLK_CNT 30 #define LARGE_BLK_CNT 100 @@ -690,6 +719,7 @@ struct msix_info_st { /* Data structure to represent a LRO session */ typedef struct lro { struct sk_buff *parent; + struct sk_buff *last_frag; u8 *l2h; struct iphdr *iph; struct tcphdr *tcph; @@ -732,7 +762,7 @@ struct s2io_nic { int device_close_flag; int device_enabled_once; - char name[50]; + char name[60]; struct tasklet_struct task; volatile unsigned long tasklet_status; @@ -800,8 +830,9 @@ struct s2io_nic { #define MSIX_FLG 0xA5 struct msix_entry *entries; struct s2io_msix_entry *s2io_entries; - char desc1[35]; - char desc2[35]; + char desc[MAX_REQUESTED_MSI_X][25]; + + int avail_msix_vectors; /* No. of MSI-X vectors granted by system */ struct msix_info_st msix_info[0x3f]; @@ -824,6 +855,8 @@ struct s2io_nic { spinlock_t rx_lock; atomic_t isr_cnt; u64 *ufo_in_band_v; +#define VPD_PRODUCT_NAME_LEN 50 + u8 product_name[VPD_PRODUCT_NAME_LEN]; }; #define RESET_ERROR 1; @@ -848,28 +881,32 @@ static inline void writeq(u64 val, void __iomem *addr) writel((u32) (val), addr); writel((u32) (val >> 32), (addr + 4)); } +#endif -/* In 32 bit modes, some registers have to be written in a - * particular order to expect correct hardware operation. The - * macro SPECIAL_REG_WRITE is used to perform such ordered - * writes. Defines UF (Upper First) and LF (Lower First) will - * be used to specify the required write order. +/* + * Some registers have to be written in a particular order to + * expect correct hardware operation. The macro SPECIAL_REG_WRITE + * is used to perform such ordered writes. Defines UF (Upper First) + * and LF (Lower First) will be used to specify the required write order. */ #define UF 1 #define LF 2 static inline void SPECIAL_REG_WRITE(u64 val, void __iomem *addr, int order) { + u32 ret; + if (order == LF) { writel((u32) (val), addr); + ret = readl(addr); writel((u32) (val >> 32), (addr + 4)); + ret = readl(addr + 4); } else { writel((u32) (val >> 32), (addr + 4)); + ret = readl(addr + 4); writel((u32) (val), addr); + ret = readl(addr); } } -#else -#define SPECIAL_REG_WRITE(val, addr, dummy) writeq(val, addr) -#endif /* Interrupt related values of Xena */ @@ -975,4 +1012,13 @@ static void clear_lro_session(lro_t *lro); static void queue_rx_frame(struct sk_buff *skb); static void update_L3L4_header(nic_t *sp, lro_t *lro); static void lro_append_pkt(nic_t *sp, lro_t *lro, struct sk_buff *skb, u32 tcp_len); + +#define s2io_tcp_mss(skb) skb_shinfo(skb)->gso_size +#define s2io_udp_mss(skb) skb_shinfo(skb)->gso_size +#define s2io_offload_type(skb) skb_shinfo(skb)->gso_type + +#define S2IO_PARM_INT(X, def_val) \ + static unsigned int X = def_val;\ + module_param(X , uint, 0); + #endif /* _S2IO_H */ diff --git a/drivers/net/sb1250-mac.c b/drivers/net/sb1250-mac.c index f2be9f83f..9ab1618e8 100644 --- a/drivers/net/sb1250-mac.c +++ b/drivers/net/sb1250-mac.c @@ -31,7 +31,6 @@ #include #include #include -#include #include #include /* Processor type for cache alignment. */ #include @@ -2451,7 +2450,7 @@ static int sbmac_open(struct net_device *dev) */ __raw_readq(sc->sbm_isr); - if (request_irq(dev->irq, &sbmac_intr, SA_SHIRQ, dev->name, dev)) + if (request_irq(dev->irq, &sbmac_intr, IRQF_SHARED, dev->name, dev)) return -EBUSY; /* diff --git a/drivers/net/seeq8005.c b/drivers/net/seeq8005.c index bcef03feb..01392bca0 100644 --- a/drivers/net/seeq8005.c +++ b/drivers/net/seeq8005.c @@ -396,8 +396,7 @@ static int seeq8005_send_packet(struct sk_buff *skb, struct net_device *dev) unsigned char *buf; if (length < ETH_ZLEN) { - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) + if (skb_padto(skb, ETH_ZLEN)) return 0; length = ETH_ZLEN; } @@ -743,7 +742,7 @@ module_param(irq, int, 0); MODULE_PARM_DESC(io, "SEEQ 8005 I/O base address"); MODULE_PARM_DESC(irq, "SEEQ 8005 IRQ number"); -int init_module(void) +int __init init_module(void) { dev_seeq = seeq8005_probe(-1); if (IS_ERR(dev_seeq)) diff --git a/drivers/net/shaper.c b/drivers/net/shaper.c index 88e212043..c7832e69f 100644 --- a/drivers/net/shaper.c +++ b/drivers/net/shaper.c @@ -69,7 +69,6 @@ * 2000/03 Andi Kleen */ -#include #include #include #include diff --git a/drivers/net/sis190.c b/drivers/net/sis190.c index 31dd3f036..df0cbebb3 100644 --- a/drivers/net/sis190.c +++ b/drivers/net/sis190.c @@ -1054,7 +1054,7 @@ static int sis190_open(struct net_device *dev) sis190_request_timer(dev); - rc = request_irq(dev->irq, sis190_interrupt, SA_SHIRQ, dev->name, dev); + rc = request_irq(dev->irq, sis190_interrupt, IRQF_SHARED, dev->name, dev); if (rc < 0) goto err_release_timer_2; @@ -1156,8 +1156,7 @@ static int sis190_start_xmit(struct sk_buff *skb, struct net_device *dev) dma_addr_t mapping; if (unlikely(skb->len < ETH_ZLEN)) { - skb = skb_padto(skb, ETH_ZLEN); - if (!skb) { + if (skb_padto(skb, ETH_ZLEN)) { tp->stats.tx_dropped++; goto out; } diff --git a/drivers/net/sis900.c b/drivers/net/sis900.c index f5a3bf4d9..29ee7ffed 100644 --- a/drivers/net/sis900.c +++ b/drivers/net/sis900.c @@ -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.09 Sep. 19 2005 + Revision: 1.08.10 Apr. 2 2006 Modified from the driver which is originally written by Donald Becker. @@ -17,9 +17,10 @@ SiS 7014 Single Chip 100BASE-TX/10BASE-T Physical Layer Solution, preliminary Rev. 1.0 Jan. 18, 1998 + Rev 1.08.10 Apr. 2 2006 Daniele Venzano add vlan (jumbo packets) support 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 add suspend/resume support + Rev 1.08.07 Nov. 2 2003 Daniele Venzano add suspend/resume support Rev 1.08.06 Sep. 24 2002 Mufasa Yang bug fix for Tx timeout & add SiS963 support Rev 1.08.05 Jun. 6 2002 Mufasa Yang bug fix for read_eeprom & Tx descriptor over-boundary Rev 1.08.04 Apr. 25 2002 Mufasa Yang added SiS962 support @@ -77,7 +78,7 @@ #include "sis900.h" #define SIS900_MODULE_NAME "sis900" -#define SIS900_DRV_VERSION "v1.08.09 Sep. 19 2005" +#define SIS900_DRV_VERSION "v1.08.10 Apr. 2 2006" static char version[] __devinitdata = KERN_INFO "sis900.c: " SIS900_DRV_VERSION "\n"; @@ -1012,7 +1013,7 @@ sis900_open(struct net_device *net_dev) /* Equalizer workaround Rule */ sis630_set_eq(net_dev, sis_priv->chipset_rev); - ret = request_irq(net_dev->irq, &sis900_interrupt, SA_SHIRQ, + ret = request_irq(net_dev->irq, &sis900_interrupt, IRQF_SHARED, net_dev->name, net_dev); if (ret) return ret; @@ -1402,6 +1403,11 @@ static void sis900_set_mode (long ioaddr, int speed, int duplex) rx_flags |= RxATX; } +#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) + /* Can accept Jumbo packet */ + rx_flags |= RxAJAB; +#endif + outl (tx_flags, ioaddr + txcfg); outl (rx_flags, ioaddr + rxcfg); } @@ -1714,18 +1720,26 @@ static int sis900_rx(struct net_device *net_dev) while (rx_status & OWN) { unsigned int rx_size; + unsigned int data_size; if (--rx_work_limit < 0) break; - rx_size = (rx_status & DSIZE) - CRC_SIZE; + data_size = rx_status & DSIZE; + rx_size = data_size - CRC_SIZE; + +#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) + /* ``TOOLONG'' flag means jumbo packet recived. */ + if ((rx_status & TOOLONG) && data_size <= MAX_FRAME_SIZE) + rx_status &= (~ ((unsigned int)TOOLONG)); +#endif if (rx_status & (ABORT|OVERRUN|TOOLONG|RUNT|RXISERR|CRCERR|FAERR)) { /* corrupted packet received */ if (netif_msg_rx_err(sis_priv)) printk(KERN_DEBUG "%s: Corrupted packet " - "received, buffer status = 0x%8.8x.\n", - net_dev->name, rx_status); + "received, buffer status = 0x%8.8x/%d.\n", + net_dev->name, rx_status, data_size); sis_priv->stats.rx_errors++; if (rx_status & OVERRUN) sis_priv->stats.rx_over_errors++; diff --git a/drivers/net/sis900.h b/drivers/net/sis900.h index 50323941e..4834e3a15 100644 --- a/drivers/net/sis900.h +++ b/drivers/net/sis900.h @@ -310,8 +310,14 @@ enum sis630_revision_id { #define CRC_SIZE 4 #define MAC_HEADER_SIZE 14 -#define TX_BUF_SIZE 1536 -#define RX_BUF_SIZE 1536 +#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) +#define MAX_FRAME_SIZE (1518 + 4) +#else +#define MAX_FRAME_SIZE 1518 +#endif /* CONFIG_VLAN_802_1Q */ + +#define TX_BUF_SIZE (MAX_FRAME_SIZE+18) +#define RX_BUF_SIZE (MAX_FRAME_SIZE+18) #define NUM_TX_DESC 16 /* Number of Tx descriptor registers. */ #define NUM_RX_DESC 16 /* Number of Rx descriptor registers. */ diff --git a/drivers/net/sk98lin/h/xmac_ii.h b/drivers/net/sk98lin/h/xmac_ii.h index 2b19f8ad0..7f8e6d008 100644 --- a/drivers/net/sk98lin/h/xmac_ii.h +++ b/drivers/net/sk98lin/h/xmac_ii.h @@ -1473,7 +1473,7 @@ extern "C" { #define GM_TXCR_FORCE_JAM (1<<15) /* Bit 15: Force Jam / Flow-Control */ #define GM_TXCR_CRC_DIS (1<<14) /* Bit 14: Disable insertion of CRC */ #define GM_TXCR_PAD_DIS (1<<13) /* Bit 13: Disable padding of packets */ -#define GM_TXCR_COL_THR_MSK (1<<10) /* Bit 12..10: Collision Threshold */ +#define GM_TXCR_COL_THR_MSK (7<<10) /* Bit 12..10: Collision Threshold */ #define TX_COL_THR(x) (SHIFT10(x) & GM_TXCR_COL_THR_MSK) diff --git a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c index 38a26df40..ee62845d3 100644 --- a/drivers/net/sk98lin/skge.c +++ b/drivers/net/sk98lin/skge.c @@ -570,9 +570,9 @@ SK_BOOL DualNet; spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); if (pAC->GIni.GIMacsFound == 2) { - Ret = request_irq(dev->irq, SkGeIsr, SA_SHIRQ, "sk98lin", dev); + Ret = request_irq(dev->irq, SkGeIsr, IRQF_SHARED, "sk98lin", dev); } else if (pAC->GIni.GIMacsFound == 1) { - Ret = request_irq(dev->irq, SkGeIsrOnePort, SA_SHIRQ, + Ret = request_irq(dev->irq, SkGeIsrOnePort, IRQF_SHARED, "sk98lin", dev); } else { printk(KERN_WARNING "sk98lin: Illegal number of ports: %d\n", @@ -1525,7 +1525,7 @@ struct sk_buff *pMessage) /* pointer to send-message */ ** This is to resolve faulty padding by the HW with 0xaa bytes. */ if (BytesSend < C_LEN_ETHERNET_MINSIZE) { - if ((pMessage = skb_padto(pMessage, C_LEN_ETHERNET_MINSIZE)) == NULL) { + if (skb_padto(pMessage, C_LEN_ETHERNET_MINSIZE)) { spin_unlock_irqrestore(&pTxPort->TxDesRingLock, Flags); return 0; } @@ -5073,9 +5073,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, "sk98lin", dev); + ret = request_irq(dev->irq, SkGeIsr, IRQF_SHARED, "sk98lin", dev); else - ret = request_irq(dev->irq, SkGeIsrOnePort, SA_SHIRQ, "sk98lin", dev); + ret = request_irq(dev->irq, SkGeIsrOnePort, IRQF_SHARED, "sk98lin", dev); if (ret) { printk(KERN_WARNING "sk98lin: unable to acquire IRQ %d\n", dev->irq); pAC->AllocFlag &= ~SK_ALLOC_IRQ; diff --git a/drivers/net/sk98lin/skvpd.c b/drivers/net/sk98lin/skvpd.c index 17786056c..1e662aaeb 100644 --- a/drivers/net/sk98lin/skvpd.c +++ b/drivers/net/sk98lin/skvpd.c @@ -22,7 +22,7 @@ ******************************************************************************/ /* - Please refer skvpd.txt for infomation how to include this module + Please refer skvpd.txt for information how to include this module */ static const char SysKonnectFileId[] = "@(#)$Id: skvpd.c,v 1.37 2003/01/13 10:42:45 rschmidt Exp $ (C) SK"; diff --git a/drivers/net/sk_mca.c b/drivers/net/sk_mca.c index e5d6d9596..799e09801 100644 --- a/drivers/net/sk_mca.c +++ b/drivers/net/sk_mca.c @@ -824,7 +824,7 @@ static int skmca_open(struct net_device *dev) /* register resources - only necessary for IRQ */ result = request_irq(priv->realirq, irq_handler, - SA_SHIRQ | SA_SAMPLE_RANDOM, "sk_mca", dev); + IRQF_SHARED | IRQF_SAMPLE_RANDOM, "sk_mca", dev); if (result != 0) { printk("%s: failed to register irq %d\n", dev->name, dev->irq); diff --git a/drivers/net/skfp/h/sba.h b/drivers/net/skfp/h/sba.h index df716cd57..638cf0283 100644 --- a/drivers/net/skfp/h/sba.h +++ b/drivers/net/skfp/h/sba.h @@ -13,7 +13,7 @@ ******************************************************************************/ /* - * Synchronous Bandwith Allocation (SBA) structs + * Synchronous Bandwidth Allocation (SBA) structs */ #ifndef _SBA_ diff --git a/drivers/net/skfp/skfddi.c b/drivers/net/skfp/skfddi.c index c7fb61330..b5714a602 100644 --- a/drivers/net/skfp/skfddi.c +++ b/drivers/net/skfp/skfddi.c @@ -497,7 +497,7 @@ static int skfp_open(struct net_device *dev) PRINTK(KERN_INFO "entering skfp_open\n"); /* Register IRQ - support shared interrupts by passing device ptr */ - err = request_irq(dev->irq, (void *) skfp_interrupt, SA_SHIRQ, + err = request_irq(dev->irq, (void *) skfp_interrupt, IRQF_SHARED, dev->name, dev); if (err) return err; diff --git a/drivers/net/skge.c b/drivers/net/skge.c index 5ca5a1b54..ad878dfdd 100644 --- a/drivers/net/skge.c +++ b/drivers/net/skge.c @@ -24,7 +24,6 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include #include #include @@ -44,12 +43,13 @@ #include "skge.h" #define DRV_NAME "skge" -#define DRV_VERSION "1.5" +#define DRV_VERSION "1.6" #define PFX DRV_NAME " " #define DEFAULT_TX_RING_SIZE 128 #define DEFAULT_RX_RING_SIZE 512 #define MAX_TX_RING_SIZE 1024 +#define TX_LOW_WATER (MAX_SKB_FRAGS + 1) #define MAX_RX_RING_SIZE 4096 #define RX_COPY_THRESHOLD 128 #define RX_BUF_SIZE 1536 @@ -401,7 +401,7 @@ static int skge_set_ring_param(struct net_device *dev, int err; if (p->rx_pending == 0 || p->rx_pending > MAX_RX_RING_SIZE || - p->tx_pending < MAX_SKB_FRAGS+1 || p->tx_pending > MAX_TX_RING_SIZE) + p->tx_pending < TX_LOW_WATER || p->tx_pending > MAX_TX_RING_SIZE) return -EINVAL; skge->rx_ring.count = p->rx_pending; @@ -516,10 +516,7 @@ static int skge_set_pauseparam(struct net_device *dev, /* Chip internal frequency for clock calculations */ static inline u32 hwkhz(const struct skge_hw *hw) { - if (hw->chip_id == CHIP_ID_GENESIS) - return 53215; /* or: 53.125 MHz */ - else - return 78215; /* or: 78.125 MHz */ + return (hw->chip_id == CHIP_ID_GENESIS) ? 53125 : 78125; } /* Chip HZ to microseconds */ @@ -603,7 +600,7 @@ static void skge_led(struct skge_port *skge, enum led_mode mode) struct skge_hw *hw = skge->hw; int port = skge->port; - spin_lock_bh(&hw->phy_lock); + mutex_lock(&hw->phy_mutex); if (hw->chip_id == CHIP_ID_GENESIS) { switch (mode) { case LED_MODE_OFF: @@ -663,7 +660,7 @@ static void skge_led(struct skge_port *skge, enum led_mode mode) PHY_M_LED_MO_RX(MO_LED_ON)); } } - spin_unlock_bh(&hw->phy_lock); + mutex_unlock(&hw->phy_mutex); } /* blink LED's for finding board */ @@ -2038,7 +2035,7 @@ static void skge_phy_reset(struct skge_port *skge) netif_stop_queue(skge->netdev); netif_carrier_off(skge->netdev); - spin_lock_bh(&hw->phy_lock); + mutex_lock(&hw->phy_mutex); if (hw->chip_id == CHIP_ID_GENESIS) { genesis_reset(hw, port); genesis_mac_init(hw, port); @@ -2046,7 +2043,7 @@ static void skge_phy_reset(struct skge_port *skge) yukon_reset(hw, port); yukon_init(hw, port); } - spin_unlock_bh(&hw->phy_lock); + mutex_unlock(&hw->phy_mutex); } /* Basic MII support */ @@ -2067,12 +2064,12 @@ static int skge_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /* fallthru */ case SIOCGMIIREG: { u16 val = 0; - spin_lock_bh(&hw->phy_lock); + mutex_lock(&hw->phy_mutex); if (hw->chip_id == CHIP_ID_GENESIS) err = __xm_phy_read(hw, skge->port, data->reg_num & 0x1f, &val); else err = __gm_phy_read(hw, skge->port, data->reg_num & 0x1f, &val); - spin_unlock_bh(&hw->phy_lock); + mutex_unlock(&hw->phy_mutex); data->val_out = val; break; } @@ -2081,14 +2078,14 @@ static int skge_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) if (!capable(CAP_NET_ADMIN)) return -EPERM; - spin_lock_bh(&hw->phy_lock); + mutex_lock(&hw->phy_mutex); if (hw->chip_id == CHIP_ID_GENESIS) err = xm_phy_write(hw, skge->port, data->reg_num & 0x1f, data->val_in); else err = gm_phy_write(hw, skge->port, data->reg_num & 0x1f, data->val_in); - spin_unlock_bh(&hw->phy_lock); + mutex_unlock(&hw->phy_mutex); break; } return err; @@ -2191,12 +2188,12 @@ static int skge_up(struct net_device *dev) goto free_rx_ring; /* Initialize MAC */ - spin_lock_bh(&hw->phy_lock); + mutex_lock(&hw->phy_mutex); if (hw->chip_id == CHIP_ID_GENESIS) genesis_mac_init(hw, port); else yukon_mac_init(hw, port); - spin_unlock_bh(&hw->phy_lock); + mutex_unlock(&hw->phy_mutex); /* Configure RAMbuffers */ chunk = hw->ram_size / ((hw->ports + 1)*2); @@ -2214,6 +2211,7 @@ static int skge_up(struct net_device *dev) skge_write8(hw, Q_ADDR(rxqaddr[port], Q_CSR), CSR_START | CSR_IRQ_CL_F); skge_led(skge, LED_MODE_ON); + netif_poll_enable(dev); return 0; free_rx_ring: @@ -2282,6 +2280,7 @@ static int skge_down(struct net_device *dev) skge_led(skge, LED_MODE_OFF); + netif_poll_disable(dev); skge_tx_clean(skge); skge_rx_clean(skge); @@ -2302,21 +2301,19 @@ static int skge_xmit_frame(struct sk_buff *skb, struct net_device *dev) { struct skge_port *skge = netdev_priv(dev); struct skge_hw *hw = skge->hw; - struct skge_ring *ring = &skge->tx_ring; struct skge_element *e; struct skge_tx_desc *td; int i; u32 control, len; u64 map; + unsigned long flags; - skb = skb_padto(skb, ETH_ZLEN); - if (!skb) + if (skb_padto(skb, ETH_ZLEN)) return NETDEV_TX_OK; - if (!spin_trylock(&skge->tx_lock)) { + if (!spin_trylock_irqsave(&skge->tx_lock, flags)) /* Collision - tell upper layer to requeue */ return NETDEV_TX_LOCKED; - } if (unlikely(skge_avail(&skge->tx_ring) < skb_shinfo(skb)->nr_frags + 1)) { if (!netif_queue_stopped(dev)) { @@ -2325,12 +2322,13 @@ static int skge_xmit_frame(struct sk_buff *skb, struct net_device *dev) printk(KERN_WARNING PFX "%s: ring full when queue awake!\n", dev->name); } - spin_unlock(&skge->tx_lock); + spin_unlock_irqrestore(&skge->tx_lock, flags); return NETDEV_TX_BUSY; } - e = ring->to_use; + e = skge->tx_ring.to_use; td = e->desc; + BUG_ON(td->control & BMU_OWN); e->skb = skb; len = skb_headlen(skb); map = pci_map_single(hw->pdev, skb->data, len, PCI_DMA_TODEVICE); @@ -2371,8 +2369,10 @@ static int skge_xmit_frame(struct sk_buff *skb, struct net_device *dev) frag->size, PCI_DMA_TODEVICE); e = e->next; - e->skb = NULL; + e->skb = skb; tf = e->desc; + BUG_ON(tf->control & BMU_OWN); + tf->dma_lo = map; tf->dma_hi = (u64) map >> 32; pci_unmap_addr_set(e, mapaddr, map); @@ -2389,56 +2389,68 @@ static int skge_xmit_frame(struct sk_buff *skb, struct net_device *dev) skge_write8(hw, Q_ADDR(txqaddr[skge->port], Q_CSR), CSR_START); - if (netif_msg_tx_queued(skge)) + if (unlikely(netif_msg_tx_queued(skge))) printk(KERN_DEBUG "%s: tx queued, slot %td, len %d\n", - dev->name, e - ring->start, skb->len); + dev->name, e - skge->tx_ring.start, skb->len); - ring->to_use = e->next; - if (skge_avail(&skge->tx_ring) <= MAX_SKB_FRAGS + 1) { + skge->tx_ring.to_use = e->next; + if (skge_avail(&skge->tx_ring) <= TX_LOW_WATER) { pr_debug("%s: transmit queue full\n", dev->name); netif_stop_queue(dev); } - mmiowb(); - spin_unlock(&skge->tx_lock); + spin_unlock_irqrestore(&skge->tx_lock, flags); dev->trans_start = jiffies; return NETDEV_TX_OK; } -static void skge_tx_complete(struct skge_port *skge, struct skge_element *last) + +/* Free resources associated with this reing element */ +static void skge_tx_free(struct skge_port *skge, struct skge_element *e, + u32 control) { struct pci_dev *pdev = skge->hw->pdev; - struct skge_element *e; - for (e = skge->tx_ring.to_clean; e != last; e = e->next) { - struct sk_buff *skb = e->skb; - int i; + BUG_ON(!e->skb); - e->skb = NULL; + /* skb header vs. fragment */ + if (control & BMU_STF) pci_unmap_single(pdev, pci_unmap_addr(e, mapaddr), - skb_headlen(skb), PCI_DMA_TODEVICE); + pci_unmap_len(e, maplen), + PCI_DMA_TODEVICE); + else + pci_unmap_page(pdev, pci_unmap_addr(e, mapaddr), + pci_unmap_len(e, maplen), + PCI_DMA_TODEVICE); - for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { - e = e->next; - pci_unmap_page(pdev, pci_unmap_addr(e, mapaddr), - skb_shinfo(skb)->frags[i].size, - PCI_DMA_TODEVICE); - } + if (control & BMU_EOF) { + if (unlikely(netif_msg_tx_done(skge))) + printk(KERN_DEBUG PFX "%s: tx done slot %td\n", + skge->netdev->name, e - skge->tx_ring.start); - dev_kfree_skb(skb); + dev_kfree_skb_any(e->skb); } - skge->tx_ring.to_clean = e; + e->skb = NULL; } +/* Free all buffers in transmit ring */ static void skge_tx_clean(struct skge_port *skge) { + struct skge_element *e; + unsigned long flags; + + spin_lock_irqsave(&skge->tx_lock, flags); + for (e = skge->tx_ring.to_clean; e != skge->tx_ring.to_use; e = e->next) { + struct skge_tx_desc *td = e->desc; + skge_tx_free(skge, e, td->control); + td->control = 0; + } - spin_lock_bh(&skge->tx_lock); - skge_tx_complete(skge, skge->tx_ring.to_use); + skge->tx_ring.to_clean = e; netif_wake_queue(skge->netdev); - spin_unlock_bh(&skge->tx_lock); + spin_unlock_irqrestore(&skge->tx_lock, flags); } static void skge_tx_timeout(struct net_device *dev) @@ -2664,32 +2676,28 @@ resubmit: return NULL; } -static void skge_tx_done(struct skge_port *skge) +/* Free all buffers in Tx ring which are no longer owned by device */ +static void skge_txirq(struct net_device *dev) { + struct skge_port *skge = netdev_priv(dev); struct skge_ring *ring = &skge->tx_ring; - struct skge_element *e, *last; + struct skge_element *e; + + rmb(); spin_lock(&skge->tx_lock); - last = ring->to_clean; for (e = ring->to_clean; e != ring->to_use; e = e->next) { struct skge_tx_desc *td = e->desc; if (td->control & BMU_OWN) break; - if (td->control & BMU_EOF) { - last = e->next; - if (unlikely(netif_msg_tx_done(skge))) - printk(KERN_DEBUG PFX "%s: tx done slot %td\n", - skge->netdev->name, e - ring->start); - } + skge_tx_free(skge, e, td->control); } + skge->tx_ring.to_clean = e; - skge_tx_complete(skge, last); - - skge_write8(skge->hw, Q_ADDR(txqaddr[skge->port], Q_CSR), CSR_IRQ_CL_F); - - if (skge_avail(&skge->tx_ring) > MAX_SKB_FRAGS + 1) + if (netif_queue_stopped(skge->netdev) + && skge_avail(&skge->tx_ring) > TX_LOW_WATER) netif_wake_queue(skge->netdev); spin_unlock(&skge->tx_lock); @@ -2704,8 +2712,6 @@ static int skge_poll(struct net_device *dev, int *budget) int to_do = min(dev->quota, *budget); int work_done = 0; - skge_tx_done(skge); - for (e = ring->to_clean; prefetch(e->next), work_done < to_do; e = e->next) { struct skge_rx_desc *rd = e->desc; struct sk_buff *skb; @@ -2737,10 +2743,12 @@ static int skge_poll(struct net_device *dev, int *budget) return 1; /* not done */ netif_rx_complete(dev); - mmiowb(); - hw->intr_mask |= skge->port == 0 ? (IS_R1_F|IS_XA1_F) : (IS_R2_F|IS_XA2_F); + spin_lock_irq(&hw->hw_lock); + hw->intr_mask |= rxirqmask[skge->port]; skge_write32(hw, B0_IMSK, hw->intr_mask); + mmiowb(); + spin_unlock_irq(&hw->hw_lock); return 0; } @@ -2847,16 +2855,16 @@ static void skge_error_irq(struct skge_hw *hw) } /* - * Interrupt from PHY are handled in tasklet (soft irq) + * Interrupt from PHY are handled in work queue * because accessing phy registers requires spin wait which might * cause excess interrupt latency. */ -static void skge_extirq(unsigned long data) +static void skge_extirq(void *arg) { - struct skge_hw *hw = (struct skge_hw *) data; + struct skge_hw *hw = arg; int port; - spin_lock(&hw->phy_lock); + mutex_lock(&hw->phy_mutex); for (port = 0; port < hw->ports; port++) { struct net_device *dev = hw->dev[port]; struct skge_port *skge = netdev_priv(dev); @@ -2868,10 +2876,12 @@ static void skge_extirq(unsigned long data) bcom_phy_intr(skge); } } - spin_unlock(&hw->phy_lock); + mutex_unlock(&hw->phy_mutex); + spin_lock_irq(&hw->hw_lock); hw->intr_mask |= IS_EXT_REG; skge_write32(hw, B0_IMSK, hw->intr_mask); + spin_unlock_irq(&hw->hw_lock); } static irqreturn_t skge_intr(int irq, void *dev_id, struct pt_regs *regs) @@ -2884,54 +2894,68 @@ static irqreturn_t skge_intr(int irq, void *dev_id, struct pt_regs *regs) if (status == 0) return IRQ_NONE; + spin_lock(&hw->hw_lock); + status &= hw->intr_mask; if (status & IS_EXT_REG) { hw->intr_mask &= ~IS_EXT_REG; - tasklet_schedule(&hw->ext_tasklet); + schedule_work(&hw->phy_work); } - if (status & (IS_R1_F|IS_XA1_F)) { - skge_write8(hw, Q_ADDR(Q_R1, Q_CSR), CSR_IRQ_CL_F); - hw->intr_mask &= ~(IS_R1_F|IS_XA1_F); - netif_rx_schedule(hw->dev[0]); + if (status & IS_XA1_F) { + skge_write8(hw, Q_ADDR(Q_XA1, Q_CSR), CSR_IRQ_CL_F); + skge_txirq(hw->dev[0]); } - if (status & (IS_R2_F|IS_XA2_F)) { - skge_write8(hw, Q_ADDR(Q_R2, Q_CSR), CSR_IRQ_CL_F); - hw->intr_mask &= ~(IS_R2_F|IS_XA2_F); - netif_rx_schedule(hw->dev[1]); + if (status & IS_R1_F) { + skge_write8(hw, Q_ADDR(Q_R1, Q_CSR), CSR_IRQ_CL_F); + hw->intr_mask &= ~IS_R1_F; + netif_rx_schedule(hw->dev[0]); } - if (likely((status & hw->intr_mask) == 0)) - return IRQ_HANDLED; + if (status & IS_PA_TO_TX1) + skge_write16(hw, B3_PA_CTRL, PA_CLR_TO_TX1); if (status & IS_PA_TO_RX1) { struct skge_port *skge = netdev_priv(hw->dev[0]); - ++skge->net_stats.rx_over_errors; - skge_write16(hw, B3_PA_CTRL, PA_CLR_TO_RX1); - } - if (status & IS_PA_TO_RX2) { - struct skge_port *skge = netdev_priv(hw->dev[1]); ++skge->net_stats.rx_over_errors; - skge_write16(hw, B3_PA_CTRL, PA_CLR_TO_RX2); + skge_write16(hw, B3_PA_CTRL, PA_CLR_TO_RX1); } - if (status & IS_PA_TO_TX1) - skge_write16(hw, B3_PA_CTRL, PA_CLR_TO_TX1); - - if (status & IS_PA_TO_TX2) - skge_write16(hw, B3_PA_CTRL, PA_CLR_TO_TX2); if (status & IS_MAC1) skge_mac_intr(hw, 0); - if (status & IS_MAC2) - skge_mac_intr(hw, 1); + if (hw->dev[1]) { + if (status & IS_XA2_F) { + skge_write8(hw, Q_ADDR(Q_XA2, Q_CSR), CSR_IRQ_CL_F); + skge_txirq(hw->dev[1]); + } + + if (status & IS_R2_F) { + skge_write8(hw, Q_ADDR(Q_R2, Q_CSR), CSR_IRQ_CL_F); + hw->intr_mask &= ~IS_R2_F; + netif_rx_schedule(hw->dev[1]); + } + + if (status & IS_PA_TO_RX2) { + struct skge_port *skge = netdev_priv(hw->dev[1]); + ++skge->net_stats.rx_over_errors; + skge_write16(hw, B3_PA_CTRL, PA_CLR_TO_RX2); + } + + if (status & IS_PA_TO_TX2) + skge_write16(hw, B3_PA_CTRL, PA_CLR_TO_TX2); + + if (status & IS_MAC2) + skge_mac_intr(hw, 1); + } if (status & IS_HW_ERR) skge_error_irq(hw); skge_write32(hw, B0_IMSK, hw->intr_mask); + spin_unlock(&hw->hw_lock); return IRQ_HANDLED; } @@ -2957,7 +2981,7 @@ static int skge_set_mac_address(struct net_device *dev, void *p) if (!is_valid_ether_addr(addr->sa_data)) return -EADDRNOTAVAIL; - spin_lock_bh(&hw->phy_lock); + mutex_lock(&hw->phy_mutex); memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); memcpy_toio(hw->regs + B2_MAC_1 + port*8, dev->dev_addr, ETH_ALEN); @@ -2970,7 +2994,7 @@ static int skge_set_mac_address(struct net_device *dev, void *p) gma_set_addr(hw, port, GM_SRC_ADDR_1L, dev->dev_addr); gma_set_addr(hw, port, GM_SRC_ADDR_2L, dev->dev_addr); } - spin_unlock_bh(&hw->phy_lock); + mutex_unlock(&hw->phy_mutex); return 0; } @@ -3082,6 +3106,7 @@ static int skge_reset(struct skge_hw *hw) else hw->ram_size = t8 * 4096; + spin_lock_init(&hw->hw_lock); hw->intr_mask = IS_HW_ERR | IS_EXT_REG | IS_PORT_1; if (hw->ports > 1) hw->intr_mask |= IS_PORT_2; @@ -3150,14 +3175,14 @@ static int skge_reset(struct skge_hw *hw) skge_write32(hw, B0_IMSK, hw->intr_mask); - spin_lock_bh(&hw->phy_lock); + mutex_lock(&hw->phy_mutex); for (i = 0; i < hw->ports; i++) { if (hw->chip_id == CHIP_ID_GENESIS) genesis_reset(hw, i); else yukon_reset(hw, i); } - spin_unlock_bh(&hw->phy_lock); + mutex_unlock(&hw->phy_mutex); return 0; } @@ -3305,8 +3330,8 @@ static int __devinit skge_probe(struct pci_dev *pdev, } hw->pdev = pdev; - spin_lock_init(&hw->phy_lock); - tasklet_init(&hw->ext_tasklet, skge_extirq, (unsigned long) hw); + mutex_init(&hw->phy_mutex); + INIT_WORK(&hw->phy_work, skge_extirq, hw); hw->regs = ioremap_nocache(pci_resource_start(pdev, 0), 0x4000); if (!hw->regs) { @@ -3315,7 +3340,7 @@ static int __devinit skge_probe(struct pci_dev *pdev, goto err_out_free_hw; } - err = request_irq(pdev->irq, skge_intr, SA_SHIRQ, DRV_NAME, hw); + err = request_irq(pdev->irq, skge_intr, IRQF_SHARED, DRV_NAME, hw); if (err) { printk(KERN_ERR PFX "%s: cannot assign irq %d\n", pci_name(pdev), pdev->irq); @@ -3327,13 +3352,21 @@ static int __devinit skge_probe(struct pci_dev *pdev, if (err) goto err_out_free_irq; - printk(KERN_INFO PFX DRV_VERSION " addr 0x%lx irq %d chip %s rev %d\n", - pci_resource_start(pdev, 0), pdev->irq, + printk(KERN_INFO PFX DRV_VERSION " addr 0x%llx irq %d chip %s rev %d\n", + (unsigned long long)pci_resource_start(pdev, 0), pdev->irq, skge_board_name(hw), hw->chip_rev); if ((dev = skge_devinit(hw, 0, using_dac)) == NULL) goto err_out_led_off; + if (!is_valid_ether_addr(dev->dev_addr)) { + printk(KERN_ERR PFX "%s: bad (zero?) ethernet address in rom\n", + pci_name(pdev)); + err = -EIO; + goto err_out_free_netdev; + } + + err = register_netdev(dev); if (err) { printk(KERN_ERR PFX "%s: cannot register net device\n", @@ -3388,11 +3421,15 @@ static void __devexit skge_remove(struct pci_dev *pdev) dev0 = hw->dev[0]; unregister_netdev(dev0); + spin_lock_irq(&hw->hw_lock); + hw->intr_mask = 0; skge_write32(hw, B0_IMSK, 0); + spin_unlock_irq(&hw->hw_lock); + skge_write16(hw, B0_LED, LED_STAT_OFF); skge_write8(hw, B0_CTST, CS_RST_SET); - tasklet_kill(&hw->ext_tasklet); + flush_scheduled_work(); free_irq(pdev->irq, hw); pci_release_regions(pdev); diff --git a/drivers/net/skge.h b/drivers/net/skge.h index 1f1ce88c8..593387b3c 100644 --- a/drivers/net/skge.h +++ b/drivers/net/skge.h @@ -1734,11 +1734,11 @@ 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 */ + GM_TXCR_COL_THR_MSK = 7<<10, /* Bit 12..10: Collision Threshold */ }; #define TX_COL_THR(x) (((x)<<10) & GM_TXCR_COL_THR_MSK) -#define TX_COL_DEF 0x04 +#define TX_COL_DEF 0x04 /* late collision after 64 byte */ /* GM_RX_CTRL 16 bit r/w Receive Control Register */ enum { @@ -2388,6 +2388,7 @@ struct skge_ring { struct skge_hw { void __iomem *regs; struct pci_dev *pdev; + spinlock_t hw_lock; u32 intr_mask; struct net_device *dev[2]; @@ -2399,9 +2400,8 @@ struct skge_hw { u32 ram_size; u32 ram_offset; u16 phy_addr; - - struct tasklet_struct ext_tasklet; - spinlock_t phy_lock; + struct work_struct phy_work; + struct mutex phy_mutex; }; enum { diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 4103e304f..ebe7e2599 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c @@ -23,7 +23,6 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include #include #include @@ -51,7 +50,7 @@ #include "sky2.h" #define DRV_NAME "sky2" -#define DRV_VERSION "1.6.1" +#define DRV_VERSION "1.5" #define PFX DRV_NAME " " /* @@ -66,6 +65,7 @@ #define RX_MAX_PENDING (RX_LE_SIZE/2 - 2) #define RX_DEF_PENDING RX_MAX_PENDING #define RX_SKB_ALIGN 8 +#define RX_BUF_WRITE 16 #define TX_RING_SIZE 512 #define TX_DEF_PENDING (TX_RING_SIZE - 1) @@ -106,6 +106,7 @@ 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) }, /* DGE-560T */ + { PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4001) }, /* DGE-550SX */ { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4340) }, { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4341) }, { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4342) }, @@ -117,10 +118,17 @@ static const struct pci_device_id sky2_id_table[] = { { 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, 0x4353) }, { 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) }, + { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4364) }, + { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4365) }, + { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4366) }, + { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4367) }, + { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4368) }, + { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4369) }, { 0 } }; @@ -237,7 +245,6 @@ static void sky2_set_power_state(struct sky2_hw *hw, pci_power_t state) udelay(100); if (hw->chip_id == CHIP_ID_YUKON_EC_U) { - sky2_write16(hw, B0_CTST, Y2_HW_WOL_ON); sky2_pci_write32(hw, PCI_DEV_REG3, 0); reg1 = sky2_pci_read32(hw, PCI_DEV_REG4); reg1 &= P_ASPM_CONTROL_MSK; @@ -256,6 +263,7 @@ static void sky2_set_power_state(struct sky2_hw *hw, pci_power_t state) else reg1 |= (PCI_Y2_PHY1_POWD | PCI_Y2_PHY2_POWD); sky2_pci_write32(hw, PCI_DEV_REG1, reg1); + udelay(100); if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev > 1) sky2_write8(hw, B2_Y2_CLK_GATE, 0); @@ -321,7 +329,7 @@ static void sky2_phy_init(struct sky2_hw *hw, unsigned port) } ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL); - if (sky2_is_copper(hw)) { + 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; @@ -338,37 +346,25 @@ static void sky2_phy_init(struct sky2_hw *hw, unsigned port) 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); - - /* special setup for PHY 88E1112 Fiber */ - if (hw->chip_id == CHIP_ID_YUKON_XL && !sky2_is_copper(hw)) { - pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR); - - /* 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); - if (hw->pmd_type == 'P') { + 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); - - /* for SFP-module set SIGDET polarity to low */ - ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL); - ctrl |= PHY_M_FIB_SIGD_POL; - gm_phy_write(hw, port, PHY_MARV_CTRL, ctrl); } - - gm_phy_write(hw, port, PHY_MARV_EXT_ADR, pg); } ctrl = gm_phy_read(hw, port, PHY_MARV_CTRL); @@ -385,7 +381,7 @@ static void sky2_phy_init(struct sky2_hw *hw, unsigned port) adv = PHY_AN_CSMA; if (sky2->autoneg == AUTONEG_ENABLE) { - if (sky2_is_copper(hw)) { + if (hw->copper) { if (sky2->advertising & ADVERTISED_1000baseT_Full) ct1000 |= PHY_M_1000C_AFD; if (sky2->advertising & ADVERTISED_1000baseT_Half) @@ -398,12 +394,8 @@ static void sky2_phy_init(struct sky2_hw *hw, unsigned port) adv |= PHY_M_AN_10_FD; if (sky2->advertising & ADVERTISED_10baseT_Half) adv |= PHY_M_AN_10_HD; - } else { /* special defines for FIBER (88E1040S only) */ - if (sky2->advertising & ADVERTISED_1000baseT_Full) - adv |= PHY_M_AN_1000X_AFD; - if (sky2->advertising & ADVERTISED_1000baseT_Half) - adv |= PHY_M_AN_1000X_AHD; - } + } 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) @@ -686,7 +678,7 @@ static void sky2_mac_init(struct sky2_hw *hw, unsigned port) 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_LP_THR), 512/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 */ @@ -698,16 +690,10 @@ static void sky2_mac_init(struct sky2_hw *hw, unsigned port) } -/* Assign Ram Buffer allocation. - * start and end are in units of 4k bytes - * ram registers are in units of 64bit words - */ -static void sky2_ramset(struct sky2_hw *hw, u16 q, u8 startk, u8 endk) +/* Assign Ram Buffer allocation in units of 64bit (8 bytes) */ +static void sky2_ramset(struct sky2_hw *hw, u16 q, u32 start, u32 end) { - u32 start, end; - - start = startk * 4096/8; - end = (endk * 4096/8) - 1; + pr_debug(PFX "q %d %#x %#x\n", q, start, end); sky2_write8(hw, RB_ADDR(q, RB_CTRL), RB_RST_CLR); sky2_write32(hw, RB_ADDR(q, RB_START), start); @@ -716,7 +702,7 @@ static void sky2_ramset(struct sky2_hw *hw, u16 q, u8 startk, u8 endk) sky2_write32(hw, RB_ADDR(q, RB_RP), start); if (q == Q_R1 || q == Q_R2) { - u32 space = (endk - startk) * 4096/8; + u32 space = end - start + 1; u32 tp = space - space/4; /* On receive queue's set the thresholds @@ -965,14 +951,14 @@ static void sky2_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) /* * 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. Also dev_alloc_skb() won't align properly if slab + * is not aligned. ALso alloc_skb() won't align properly if slab * debugging is enabled. */ static inline struct sk_buff *sky2_alloc_skb(unsigned int size, gfp_t gfp_mask) { struct sk_buff *skb; - skb = __dev_alloc_skb(size + RX_SKB_ALIGN, gfp_mask); + skb = alloc_skb(size + RX_SKB_ALIGN, gfp_mask); if (likely(skb)) { unsigned long p = (unsigned long) skb->data; skb_reserve(skb, ALIGN(p, RX_SKB_ALIGN) - p); @@ -1098,19 +1084,16 @@ static int sky2_up(struct net_device *dev) sky2_mac_init(hw, port); - /* Determine available ram buffer space (in 4K blocks). - * Note: not sure about the FE setting below yet - */ - if (hw->chip_id == CHIP_ID_YUKON_FE) - ramsize = 4; - else - ramsize = sky2_read8(hw, B2_E_0); + /* Determine available ram buffer space in qwords. */ + ramsize = sky2_read8(hw, B2_E_0) * 4096/8; - /* Give transmitter one third (rounded up) */ - rxspace = ramsize - (ramsize + 2) / 3; + if (ramsize > 6*1024/8) + rxspace = ramsize - (ramsize + 2) / 3; + else + rxspace = ramsize / 2; - sky2_ramset(hw, rxqaddr[port], 0, rxspace); - sky2_ramset(hw, txqaddr[port], rxspace, ramsize); + sky2_ramset(hw, rxqaddr[port], 0, rxspace-1); + sky2_ramset(hw, txqaddr[port], rxspace, ramsize-1); /* Make sure SyncQ is disabled */ sky2_write8(hw, RB_ADDR(port == 0 ? Q_XS1 : Q_XS2, RB_CTRL), @@ -1406,7 +1389,7 @@ static void sky2_tx_complete(struct sky2_port *sky2, u16 done) } sky2->tx_cons = put; - if (tx_avail(sky2) > MAX_SKB_TX_LE) + if (tx_avail(sky2) > MAX_SKB_TX_LE + 4) netif_wake_queue(dev); } @@ -1437,6 +1420,11 @@ static int sky2_down(struct net_device *dev) /* Stop more packets from being queued */ netif_stop_queue(dev); + /* Disable port IRQ */ + imask = sky2_read32(hw, B0_IMSK); + imask &= ~portirq_msk[port]; + sky2_write32(hw, B0_IMSK, imask); + sky2_phy_reset(hw, port); /* Stop transmitter */ @@ -1480,11 +1468,6 @@ static int sky2_down(struct net_device *dev) 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); - /* Disable port IRQ */ - imask = sky2_read32(hw, B0_IMSK); - imask &= ~portirq_msk[port]; - sky2_write32(hw, B0_IMSK, imask); - /* turn off LED's */ sky2_write16(hw, B0_Y2LED, LED_STAT_OFF); @@ -1513,7 +1496,7 @@ static int sky2_down(struct net_device *dev) static u16 sky2_phy_speed(const struct sky2_hw *hw, u16 aux) { - if (!sky2_is_copper(hw)) + if (!hw->copper) return SPEED_1000; if (hw->chip_id == CHIP_ID_YUKON_FE) @@ -1695,13 +1678,13 @@ static void sky2_phy_intr(struct sky2_hw *hw, unsigned port) struct sky2_port *sky2 = netdev_priv(dev); u16 istatus, phystat; + if (!netif_running(dev)) + return; + spin_lock(&sky2->phy_lock); istatus = gm_phy_read(hw, port, PHY_MARV_INT_STAT); phystat = gm_phy_read(hw, port, PHY_MARV_PHY_STAT); - if (!netif_running(dev)) - goto out; - if (netif_msg_intr(sky2)) printk(KERN_INFO PFX "%s: phy interrupt status 0x%x 0x%x\n", sky2->netdev->name, istatus, phystat); @@ -1871,7 +1854,7 @@ static struct sk_buff *sky2_receive(struct sky2_port *sky2, goto oversize; if (length < copybreak) { - skb = dev_alloc_skb(length + 2); + skb = alloc_skb(length + 2, GFP_ATOMIC); if (!skb) goto resubmit; @@ -1905,9 +1888,6 @@ 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); - return skb; oversize: @@ -1954,7 +1934,9 @@ static inline int sky2_more_work(const struct sky2_hw *hw) /* Process status response ring */ static int sky2_status_intr(struct sky2_hw *hw, int to_do) { + struct sky2_port *sky2; int work_done = 0; + unsigned buf_write[2] = { 0, 0 }; u16 hwidx = sky2_read16(hw, STAT_PUT_IDX); rmb(); @@ -1962,7 +1944,6 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do) while (hw->st_idx != hwidx) { 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; @@ -1995,6 +1976,14 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do) #endif netif_receive_skb(skb); + /* Update receiver after 16 frames */ + if (++buf_write[le->link] == RX_BUF_WRITE) { + sky2_put_idx(hw, rxqaddr[le->link], + sky2->rx_put); + buf_write[le->link] = 0; + } + + /* Stop after net poll weight */ if (++work_done >= to_do) goto exit_loop; break; @@ -2032,10 +2021,17 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do) } } - /* Fully processed status ring so clear irq */ - sky2_write32(hw, STAT_CTRL, SC_STAT_CLR_IRQ); - exit_loop: + if (buf_write[0]) { + sky2 = netdev_priv(hw->dev[0]); + sky2_put_idx(hw, Q_R1, sky2->rx_put); + } + + if (buf_write[1]) { + sky2 = netdev_priv(hw->dev[1]); + sky2_put_idx(hw, Q_R2, sky2->rx_put); + } + return work_done; } @@ -2237,6 +2233,9 @@ static int sky2_poll(struct net_device *dev0, int *budget) *budget -= work_done; dev0->quota -= work_done; + if (status & Y2_IS_STAT_BMU) + sky2_write32(hw, STAT_CTRL, SC_STAT_CLR_IRQ); + if (sky2_more_work(hw)) return 1; @@ -2300,10 +2299,10 @@ static inline u32 sky2_clk2us(const struct sky2_hw *hw, u32 clk) } -static int __devinit sky2_reset(struct sky2_hw *hw) +static int sky2_reset(struct sky2_hw *hw) { u16 status; - u8 t8; + u8 t8, pmd_type; int i; sky2_write8(hw, B0_CTST, CS_RST_CLR); @@ -2349,7 +2348,9 @@ static int __devinit sky2_reset(struct sky2_hw *hw) sky2_pci_write32(hw, PEX_UNC_ERR_STAT, 0xffffffffUL); - hw->pmd_type = sky2_read8(hw, B2_PMD_TYP); + 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) { @@ -2446,22 +2447,21 @@ static int __devinit sky2_reset(struct sky2_hw *hw) static u32 sky2_supported_modes(const struct sky2_hw *hw) { - if (sky2_is_copper(hw)) { - u32 modes = SUPPORTED_10baseT_Half - | SUPPORTED_10baseT_Full - | SUPPORTED_100baseT_Half - | SUPPORTED_100baseT_Full - | SUPPORTED_Autoneg | SUPPORTED_TP; + 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; - return modes; + | SUPPORTED_1000baseT_Full; } else - return SUPPORTED_1000baseT_Half - | SUPPORTED_1000baseT_Full - | SUPPORTED_Autoneg - | SUPPORTED_FIBRE; + modes = SUPPORTED_1000baseT_Full | SUPPORTED_FIBRE + | SUPPORTED_Autoneg; + return modes; } static int sky2_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) @@ -2472,7 +2472,7 @@ static int sky2_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) ecmd->transceiver = XCVR_INTERNAL; ecmd->supported = sky2_supported_modes(hw); ecmd->phy_address = PHY_ADDR_MARV; - if (sky2_is_copper(hw)) { + if (hw->copper) { ecmd->supported = SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | SUPPORTED_100baseT_Half @@ -2481,14 +2481,12 @@ static int sky2_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) | SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_TP; ecmd->port = PORT_TP; - ecmd->speed = sky2->speed; - } else { - ecmd->speed = SPEED_1000; + } else ecmd->port = PORT_FIBRE; - } ecmd->advertising = sky2->advertising; ecmd->autoneg = sky2->autoneg; + ecmd->speed = sky2->speed; ecmd->duplex = sky2->duplex; return 0; } @@ -2738,6 +2736,14 @@ static int sky2_set_mac_address(struct net_device *dev, void *p) return 0; } +static void inline sky2_add_filter(u8 filter[8], const u8 *addr) +{ + u32 bit; + + bit = ether_crc(ETH_ALEN, addr) & 63; + filter[bit >> 3] |= 1 << (bit & 7); +} + static void sky2_set_multicast(struct net_device *dev) { struct sky2_port *sky2 = netdev_priv(dev); @@ -2746,6 +2752,7 @@ static void sky2_set_multicast(struct net_device *dev) struct dev_mc_list *list = dev->mc_list; u16 reg; u8 filter[8]; + static const u8 pause_mc_addr[ETH_ALEN] = { 0x1, 0x80, 0xc2, 0x0, 0x0, 0x1 }; memset(filter, 0, sizeof(filter)); @@ -2756,16 +2763,17 @@ static void sky2_set_multicast(struct net_device *dev) 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 */ + else if (dev->mc_count == 0 && !sky2->rx_pause) 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); - } + if (sky2->rx_pause) + sky2_add_filter(filter, pause_mc_addr); + + for (i = 0; list && i < dev->mc_count; i++, list = list->next) + sky2_add_filter(filter, list->dmi_addr); } gma_write16(hw, port, GM_MC_ADDR_H1, @@ -3205,7 +3213,7 @@ static int __devinit sky2_test_msi(struct sky2_hw *hw) sky2_write32(hw, B0_IMSK, Y2_IS_IRQ_SW); - err = request_irq(pdev->irq, sky2_test_intr, SA_SHIRQ, DRV_NAME, hw); + err = request_irq(pdev->irq, sky2_test_intr, IRQF_SHARED, DRV_NAME, hw); if (err) { printk(KERN_ERR PFX "%s: cannot assign irq %d\n", pci_name(pdev), pdev->irq); @@ -3219,9 +3227,8 @@ static int __devinit sky2_test_msi(struct sky2_hw *hw) if (!hw->msi_detected) { /* MSI test failed, go back to INTx mode */ - printk(KERN_WARNING PFX "%s: No interrupt was generated using MSI, " - "switching to INTx mode. Please report this failure to " - "the PCI maintainer and include system chipset information.\n", + printk(KERN_INFO PFX "%s: No interrupt generated using MSI, " + "switching to INTx mode.\n", pci_name(pdev)); err = -EOPNOTSUPP; @@ -3229,6 +3236,7 @@ static int __devinit sky2_test_msi(struct sky2_hw *hw) } sky2_write32(hw, B0_IMSK, 0); + sky2_read32(hw, B0_IMSK); free_irq(pdev->irq, hw); @@ -3325,9 +3333,9 @@ static int __devinit sky2_probe(struct pci_dev *pdev, 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], + printk(KERN_INFO PFX "v%s addr 0x%llx irq %d Yukon-%s (0x%x) rev %d\n", + DRV_VERSION, (unsigned long long)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); @@ -3363,7 +3371,7 @@ static int __devinit sky2_probe(struct pci_dev *pdev, goto err_out_unregister; } - err = request_irq(pdev->irq, sky2_intr, SA_SHIRQ, DRV_NAME, hw); + err = request_irq(pdev->irq, sky2_intr, IRQF_SHARED, DRV_NAME, hw); if (err) { printk(KERN_ERR PFX "%s: cannot assign irq %d\n", pci_name(pdev), pdev->irq); @@ -3452,17 +3460,14 @@ static int sky2_suspend(struct pci_dev *pdev, pm_message_t state) return -EINVAL; del_timer_sync(&hw->idle_timer); + netif_poll_disable(hw->dev[0]); for (i = 0; i < hw->ports; i++) { struct net_device *dev = hw->dev[i]; - if (dev) { - if (!netif_running(dev)) - continue; - + if (netif_running(dev)) { sky2_down(dev); netif_device_detach(dev); - netif_poll_disable(dev); } } @@ -3489,9 +3494,8 @@ static int sky2_resume(struct pci_dev *pdev) for (i = 0; i < hw->ports; i++) { struct net_device *dev = hw->dev[i]; - if (dev && netif_running(dev)) { + if (netif_running(dev)) { netif_device_attach(dev); - netif_poll_enable(dev); err = sky2_up(dev); if (err) { @@ -3503,6 +3507,7 @@ static int sky2_resume(struct pci_dev *pdev) } } + netif_poll_enable(hw->dev[0]); sky2_idle_start(hw); out: return err; diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h index 9516c1f39..7af549970 100644 --- a/drivers/net/sky2.h +++ b/drivers/net/sky2.h @@ -1317,14 +1317,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 1) 16 bit r/w Fiber Specific Ctrl *****/ -enum { - PHY_M_FIB_FORCE_LNK = 1<<10,/* Force Link Good */ - PHY_M_FIB_SIGD_POL = 1<<9, /* SIGDET Polarity */ - PHY_M_FIB_TX_DIS = 1<<3, /* Transmitter Disable */ -}; - /* for Yukon-2 Gigabit Ethernet PHY (88E1112 only) */ /***** PHY_MARV_PHY_CTRL (page 2) 16 bit r/w MAC Specific Ctrl *****/ enum { @@ -1488,7 +1480,7 @@ 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 */ + GM_TXCR_COL_THR_MSK = 7<<10, /* Bit 12..10: Collision Threshold */ }; #define TX_COL_THR(x) (((x)<<10) & GM_TXCR_COL_THR_MSK) @@ -1574,7 +1566,7 @@ enum { 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_MII_ERR | GMR_FS_GOOD_FC | GMR_FS_BAD_FC | GMR_FS_UN_SIZE | GMR_FS_JABBER, }; @@ -1887,7 +1879,7 @@ struct sky2_hw { int pm_cap; u8 chip_id; u8 chip_rev; - u8 pmd_type; + u8 copper; u8 ports; struct sky2_status_le *st_le; @@ -1899,11 +1891,6 @@ struct sky2_hw { wait_queue_head_t msi_wait; }; -static inline int sky2_is_copper(const struct sky2_hw *hw) -{ - return !(hw->pmd_type == 'L' || hw->pmd_type == 'S' || hw->pmd_type == 'P'); -} - /* Register accessor for memory mapped device */ static inline u32 sky2_read32(const struct sky2_hw *hw, unsigned reg) { diff --git a/drivers/net/slhc.c b/drivers/net/slhc.c index c6fbb1ede..3a1b71316 100644 --- a/drivers/net/slhc.c +++ b/drivers/net/slhc.c @@ -50,7 +50,6 @@ * driver code belonging close to PPP and SLIP */ -#include #include #include #include diff --git a/drivers/net/slip.c b/drivers/net/slip.c index b2e18d288..1588cb7f6 100644 --- a/drivers/net/slip.c +++ b/drivers/net/slip.c @@ -55,7 +55,6 @@ */ #define SL_CHECK_TRANSMIT -#include #include #include diff --git a/drivers/net/slip.h b/drivers/net/slip.h index ab3efe66a..29d87dd45 100644 --- a/drivers/net/slip.h +++ b/drivers/net/slip.h @@ -22,7 +22,6 @@ #ifndef _LINUX_SLIP_H #define _LINUX_SLIP_H -#include #if defined(CONFIG_INET) && defined(CONFIG_SLIP_COMPRESSED) # define SL_INCLUDE_CSLIP diff --git a/drivers/net/smc-ultra.c b/drivers/net/smc-ultra.c index 3db30cd06..45449353a 100644 --- a/drivers/net/smc-ultra.c +++ b/drivers/net/smc-ultra.c @@ -57,7 +57,6 @@ static const char version[] = "smc-ultra.c:v2.02 2/3/98 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n"; -#include #include #include #include @@ -553,7 +552,7 @@ MODULE_LICENSE("GPL"); /* This is set up so that only a single autoprobe takes place per call. ISA device autoprobes on a running machine are not recommended. */ -int +int __init init_module(void) { struct net_device *dev; diff --git a/drivers/net/smc-ultra32.c b/drivers/net/smc-ultra32.c index b3e397d7c..85be22a05 100644 --- a/drivers/net/smc-ultra32.c +++ b/drivers/net/smc-ultra32.c @@ -290,7 +290,7 @@ out: static int ultra32_open(struct net_device *dev) { int ioaddr = dev->base_addr - ULTRA32_NIC_OFFSET; /* ASIC addr */ - int irq_flags = (inb(ioaddr + ULTRA32_CFG5) & 0x08) ? 0 : SA_SHIRQ; + int irq_flags = (inb(ioaddr + ULTRA32_CFG5) & 0x08) ? 0 : IRQF_SHARED; int retval; retval = request_irq(dev->irq, ei_interrupt, irq_flags, dev->name, dev); @@ -421,7 +421,7 @@ static struct net_device *dev_ultra[MAX_ULTRA32_CARDS]; MODULE_DESCRIPTION("SMC Ultra32 EISA ethernet driver"); MODULE_LICENSE("GPL"); -int init_module(void) +int __init init_module(void) { int this_dev, found = 0; diff --git a/drivers/net/smc9194.c b/drivers/net/smc9194.c index f86697da0..8b0321f19 100644 --- a/drivers/net/smc9194.c +++ b/drivers/net/smc9194.c @@ -523,8 +523,7 @@ static int smc_wait_to_send_packet( struct sk_buff * skb, struct net_device * de length = skb->len; if (length < ETH_ZLEN) { - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) { + if (skb_padto(skb, ETH_ZLEN)) { netif_wake_queue(dev); return 0; } @@ -732,12 +731,9 @@ static int ifport; struct net_device * __init smc_init(int unit) { struct net_device *dev = alloc_etherdev(sizeof(struct smc_local)); - static struct devlist *smcdev = smc_devlist; + struct devlist *smcdev = smc_devlist; int err = 0; -#ifndef NO_AUTOPROBE - smcdev = smc_devlist; -#endif if (!dev) return ERR_PTR(-ENODEV); @@ -1607,7 +1603,7 @@ MODULE_PARM_DESC(io, "SMC 99194 I/O base address"); MODULE_PARM_DESC(irq, "SMC 99194 IRQ number"); MODULE_PARM_DESC(ifport, "SMC 99194 interface port (0-default, 1-TP, 2-AUI)"); -int init_module(void) +int __init init_module(void) { if (io == 0) printk(KERN_WARNING diff --git a/drivers/net/smc91x.c b/drivers/net/smc91x.c index 5e561ba44..cf62373b8 100644 --- a/drivers/net/smc91x.c +++ b/drivers/net/smc91x.c @@ -66,7 +66,6 @@ static const char version[] = #endif -#include #include #include #include @@ -77,7 +76,7 @@ static const char version[] = #include #include #include -#include +#include #include #include #include @@ -88,7 +87,6 @@ static const char version[] = #include #include -#include #include "smc91x.h" @@ -129,7 +127,7 @@ MODULE_PARM_DESC(nowait, "set to 1 for no wait state"); /* * Transmit timeout, default 5 seconds. */ -static int watchdog = 5000; +static int watchdog = 1000; module_param(watchdog, int, 0400); MODULE_PARM_DESC(watchdog, "transmit timeout in milliseconds"); @@ -154,6 +152,12 @@ MODULE_LICENSE("GPL"); */ #define MEMORY_WAIT_TIME 16 +/* + * The maximum number of processing loops allowed for each call to the + * IRQ handler. + */ +#define MAX_IRQ_LOOPS 8 + /* * This selects whether TX packets are sent one by one to the SMC91x internal * memory and throttled until transmission completes. This may prevent @@ -210,15 +214,12 @@ struct smc_local { spinlock_t lock; -#ifdef SMC_CAN_USE_DATACS - u32 __iomem *datacs; -#endif - #ifdef SMC_USE_PXA_DMA /* DMA needs the physical address of the chip */ u_long physaddr; #endif void __iomem *base; + void __iomem *datacs; }; #if SMC_DEBUG > 0 @@ -315,14 +316,24 @@ static void smc_reset(struct net_device *dev) struct smc_local *lp = netdev_priv(dev); void __iomem *ioaddr = lp->base; unsigned int ctl, cfg; + struct sk_buff *pending_skb; DBG(2, "%s: %s\n", dev->name, __FUNCTION__); - /* Disable all interrupts */ - spin_lock(&lp->lock); + /* Disable all interrupts, block TX tasklet */ + spin_lock_irq(&lp->lock); SMC_SELECT_BANK(2); SMC_SET_INT_MASK(0); - spin_unlock(&lp->lock); + pending_skb = lp->pending_tx_skb; + lp->pending_tx_skb = NULL; + spin_unlock_irq(&lp->lock); + + /* free any pending tx skb */ + if (pending_skb) { + dev_kfree_skb(pending_skb); + lp->stats.tx_errors++; + lp->stats.tx_aborted_errors++; + } /* * This resets the registers mostly to defaults, but doesn't @@ -389,14 +400,6 @@ static void smc_reset(struct net_device *dev) SMC_SELECT_BANK(2); SMC_SET_MMU_CMD(MC_RESET); SMC_WAIT_MMU_BUSY(); - - /* clear anything saved */ - if (lp->pending_tx_skb != NULL) { - dev_kfree_skb (lp->pending_tx_skb); - lp->pending_tx_skb = NULL; - lp->stats.tx_errors++; - lp->stats.tx_aborted_errors++; - } } /* @@ -440,14 +443,19 @@ static void smc_shutdown(struct net_device *dev) { struct smc_local *lp = netdev_priv(dev); void __iomem *ioaddr = lp->base; + struct sk_buff *pending_skb; DBG(2, "%s: %s\n", CARDNAME, __FUNCTION__); /* no more interrupts for me */ - spin_lock(&lp->lock); + spin_lock_irq(&lp->lock); SMC_SELECT_BANK(2); SMC_SET_INT_MASK(0); - spin_unlock(&lp->lock); + pending_skb = lp->pending_tx_skb; + lp->pending_tx_skb = NULL; + spin_unlock_irq(&lp->lock); + if (pending_skb) + dev_kfree_skb(pending_skb); /* and tell the card to stay away from that nasty outside world */ SMC_SELECT_BANK(0); @@ -627,7 +635,12 @@ static void smc_hardware_send_pkt(unsigned long data) } skb = lp->pending_tx_skb; + if (unlikely(!skb)) { + smc_special_unlock(&lp->lock); + return; + } lp->pending_tx_skb = NULL; + packet_no = SMC_GET_AR(); if (unlikely(packet_no & AR_FAILED)) { printk("%s: Memory allocation failed.\n", dev->name); @@ -660,20 +673,18 @@ static void smc_hardware_send_pkt(unsigned long data) SMC_outw(((len & 1) ? (0x2000 | buf[len-1]) : 0), ioaddr, DATA_REG); /* - * If THROTTLE_TX_PKTS is set, we look at the TX_EMPTY flag - * before queueing this packet for TX, and if it's clear then - * we stop the queue here. This will have the effect of - * having at most 2 packets queued for TX in the chip's memory - * at all time. If THROTTLE_TX_PKTS is not set then the queue - * is stopped only when memory allocation (MC_ALLOC) does not - * succeed right away. + * If THROTTLE_TX_PKTS is set, we stop the queue here. This will + * have the effect of having at most one packet queued for TX + * in the chip's memory at all time. + * + * If THROTTLE_TX_PKTS is not set then the queue is stopped only + * when memory allocation (MC_ALLOC) does not succeed right away. */ - if (THROTTLE_TX_PKTS && !(SMC_GET_INT() & IM_TX_EMPTY_INT)) + if (THROTTLE_TX_PKTS) netif_stop_queue(dev); /* queue the packet for TX */ SMC_SET_MMU_CMD(MC_ENQUEUE); - SMC_ACK_INT(IM_TX_EMPTY_INT); smc_special_unlock(&lp->lock); dev->trans_start = jiffies; @@ -703,7 +714,6 @@ static int smc_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) DBG(3, "%s: %s\n", dev->name, __FUNCTION__); BUG_ON(lp->pending_tx_skb != NULL); - lp->pending_tx_skb = skb; /* * The MMU wants the number of pages to be the number of 256 bytes @@ -719,7 +729,6 @@ static int smc_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) numPages = ((skb->len & ~1) + (6 - 1)) >> 8; if (unlikely(numPages > 7)) { printk("%s: Far too big packet error.\n", dev->name); - lp->pending_tx_skb = NULL; lp->stats.tx_errors++; lp->stats.tx_dropped++; dev_kfree_skb(skb); @@ -746,6 +755,7 @@ static int smc_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) smc_special_unlock(&lp->lock); + lp->pending_tx_skb = skb; if (!poll_count) { /* oh well, wait until the chip finds memory later */ netif_stop_queue(dev); @@ -792,17 +802,20 @@ static void smc_tx(struct net_device *dev) DBG(2, "%s: TX STATUS 0x%04x PNR 0x%02x\n", dev->name, tx_status, packet_no); - if (!(tx_status & TS_SUCCESS)) + if (!(tx_status & ES_TX_SUC)) lp->stats.tx_errors++; - if (tx_status & TS_LOSTCAR) + + if (tx_status & ES_LOSTCARR) lp->stats.tx_carrier_errors++; - if (tx_status & TS_LATCOL) { - PRINTK("%s: late collision occurred on last xmit\n", dev->name); + if (tx_status & (ES_LATCOL | ES_16COL)) { + PRINTK("%s: %s occurred on last xmit\n", dev->name, + (tx_status & ES_LATCOL) ? + "late collision" : "too many collisions"); lp->stats.tx_window_errors++; if (!(lp->stats.tx_window_errors & 63) && net_ratelimit()) { - printk(KERN_INFO "%s: unexpectedly large numbers of " - "late collisions. Please check duplex " + printk(KERN_INFO "%s: unexpectedly large number of " + "bad collisions. Please check duplex " "setting.\n", dev->name); } } @@ -1060,7 +1073,7 @@ static void smc_phy_powerdown(struct net_device *dev) above). linkwatch_event() also wants the netlink semaphore. */ while(lp->work_pending) - schedule(); + yield(); bmcr = smc_phy_read(dev, phy, MII_BMCR); smc_phy_write(dev, phy, MII_BMCR, bmcr | BMCR_PDOWN); @@ -1194,6 +1207,7 @@ static void smc_phy_configure(void *data) smc_phy_check_media(dev, 1); smc_phy_configure_exit: + SMC_SELECT_BANK(2); spin_unlock_irq(&lp->lock); lp->work_pending = 0; } @@ -1236,7 +1250,7 @@ static void smc_10bt_check_media(struct net_device *dev, int init) old_carrier = netif_carrier_ok(dev) ? 1 : 0; SMC_SELECT_BANK(0); - new_carrier = SMC_inw(ioaddr, EPH_STATUS_REG) & ES_LINK_OK ? 1 : 0; + new_carrier = (SMC_GET_EPH_STATUS() & ES_LINK_OK) ? 1 : 0; SMC_SELECT_BANK(2); if (init || (old_carrier != new_carrier)) { @@ -1292,7 +1306,7 @@ static irqreturn_t smc_interrupt(int irq, void *dev_id, struct pt_regs *regs) SMC_SET_INT_MASK(0); /* set a timeout value, so I don't stay here forever */ - timeout = 8; + timeout = MAX_IRQ_LOOPS; do { status = SMC_GET_INT(); @@ -1308,15 +1322,16 @@ static irqreturn_t smc_interrupt(int irq, void *dev_id, struct pt_regs *regs) if (!status) break; - if (status & IM_RCV_INT) { - DBG(3, "%s: RX irq\n", dev->name); - smc_rcv(dev); - } else if (status & IM_TX_INT) { + if (status & IM_TX_INT) { + /* do this before RX as it will free memory quickly */ DBG(3, "%s: TX int\n", dev->name); smc_tx(dev); SMC_ACK_INT(IM_TX_INT); if (THROTTLE_TX_PKTS) netif_wake_queue(dev); + } else if (status & IM_RCV_INT) { + DBG(3, "%s: RX irq\n", dev->name); + smc_rcv(dev); } else if (status & IM_ALLOC_INT) { DBG(3, "%s: Allocation irq\n", dev->name); tasklet_hi_schedule(&lp->tx_task); @@ -1337,7 +1352,10 @@ static irqreturn_t smc_interrupt(int irq, void *dev_id, struct pt_regs *regs) /* multiple collisions */ lp->stats.collisions += card_stats & 0xF; } else if (status & IM_RX_OVRN_INT) { - DBG(1, "%s: RX overrun\n", dev->name); + DBG(1, "%s: RX overrun (EPH_ST 0x%04x)\n", dev->name, + ({ int eph_st; SMC_SELECT_BANK(0); + eph_st = SMC_GET_EPH_STATUS(); + SMC_SELECT_BANK(2); eph_st; }) ); SMC_ACK_INT(IM_RX_OVRN_INT); lp->stats.rx_errors++; lp->stats.rx_fifo_errors++; @@ -1355,10 +1373,13 @@ static irqreturn_t smc_interrupt(int irq, void *dev_id, struct pt_regs *regs) /* restore register states */ SMC_SET_PTR(saved_pointer); SMC_SET_INT_MASK(mask); - spin_unlock(&lp->lock); - DBG(3, "%s: Interrupt done (%d loops)\n", dev->name, 8-timeout); + if (timeout == MAX_IRQ_LOOPS) + PRINTK("%s: spurious interrupt (mask = 0x%02x)\n", + dev->name, mask); + DBG(3, "%s: Interrupt done (%d loops)\n", + dev->name, MAX_IRQ_LOOPS - timeout); /* * We return IRQ_HANDLED unconditionally here even if there was @@ -1389,7 +1410,7 @@ static void smc_timeout(struct net_device *dev) { struct smc_local *lp = netdev_priv(dev); void __iomem *ioaddr = lp->base; - int status, mask, meminfo, fifo; + int status, mask, eph_st, meminfo, fifo; DBG(2, "%s: %s\n", dev->name, __FUNCTION__); @@ -1398,11 +1419,13 @@ static void smc_timeout(struct net_device *dev) mask = SMC_GET_INT_MASK(); fifo = SMC_GET_FIFO(); SMC_SELECT_BANK(0); + eph_st = SMC_GET_EPH_STATUS(); meminfo = SMC_GET_MIR(); SMC_SELECT_BANK(2); spin_unlock_irq(&lp->lock); - PRINTK( "%s: INT 0x%02x MASK 0x%02x MEM 0x%04x FIFO 0x%04x\n", - dev->name, status, mask, meminfo, fifo ); + PRINTK( "%s: TX timeout (INT 0x%02x INTMASK 0x%02x " + "MEM 0x%04x FIFO 0x%04x EPH_ST 0x%04x)\n", + dev->name, status, mask, meminfo, fifo, eph_st ); smc_reset(dev); smc_enable(dev); @@ -1598,14 +1621,8 @@ static int smc_close(struct net_device *dev) /* clear everything */ smc_shutdown(dev); - + tasklet_kill(&lp->tx_task); smc_phy_powerdown(dev); - - if (lp->pending_tx_skb) { - dev_kfree_skb(lp->pending_tx_skb); - lp->pending_tx_skb = NULL; - } - return 0; } @@ -1863,7 +1880,7 @@ static int __init smc_probe(struct net_device *dev, void __iomem *ioaddr) SMC_SELECT_BANK(1); val = SMC_GET_BASE(); val = ((val & 0x1F00) >> 3) << SMC_IO_SHIFT; - if (((unsigned long)ioaddr & ((PAGE_SIZE-1)<version >= (CHIP_91100 << 4)) smc_phy_detect(dev); + /* then shut everything down to save power */ + smc_shutdown(dev); + smc_phy_powerdown(dev); + /* Set default parameters */ lp->msg_enable = NETIF_MSG_LINK; lp->ctl_rfduplx = 0; @@ -1981,12 +2002,10 @@ static int __init smc_probe(struct net_device *dev, void __iomem *ioaddr) } /* Grab the IRQ */ - retval = request_irq(dev->irq, &smc_interrupt, 0, dev->name, dev); + retval = request_irq(dev->irq, &smc_interrupt, SMC_IRQ_FLAGS, dev->name, dev); if (retval) goto err_out; - set_irq_type(dev->irq, IRQT_RISING); - #ifdef SMC_USE_PXA_DMA { int dma = pxa_request_dma(dev->name, DMA_PRIO_LOW, @@ -2081,9 +2100,8 @@ static int smc_enable_device(struct platform_device *pdev) * Set the appropriate byte/word mode. */ ecsr = readb(addr + (ECSR << SMC_IO_SHIFT)) & ~ECSR_IOIS8; -#ifndef SMC_CAN_USE_16BIT - ecsr |= ECSR_IOIS8; -#endif + if (!SMC_CAN_USE_16BIT) + ecsr |= ECSR_IOIS8; writeb(ecsr, addr + (ECSR << SMC_IO_SHIFT)); local_irq_restore(flags); @@ -2120,40 +2138,39 @@ static void smc_release_attrib(struct platform_device *pdev) release_mem_region(res->start, ATTRIB_SIZE); } -#ifdef SMC_CAN_USE_DATACS -static void smc_request_datacs(struct platform_device *pdev, struct net_device *ndev) +static inline void smc_request_datacs(struct platform_device *pdev, struct net_device *ndev) { - struct resource * res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-data32"); - struct smc_local *lp = netdev_priv(ndev); + if (SMC_CAN_USE_DATACS) { + struct resource * res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-data32"); + struct smc_local *lp = netdev_priv(ndev); - if (!res) - return; + if (!res) + return; - if(!request_mem_region(res->start, SMC_DATA_EXTENT, CARDNAME)) { - printk(KERN_INFO "%s: failed to request datacs memory region.\n", CARDNAME); - return; - } + if(!request_mem_region(res->start, SMC_DATA_EXTENT, CARDNAME)) { + printk(KERN_INFO "%s: failed to request datacs memory region.\n", CARDNAME); + return; + } - lp->datacs = ioremap(res->start, SMC_DATA_EXTENT); + lp->datacs = ioremap(res->start, SMC_DATA_EXTENT); + } } static void smc_release_datacs(struct platform_device *pdev, struct net_device *ndev) { - struct smc_local *lp = netdev_priv(ndev); - struct resource * res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-data32"); + if (SMC_CAN_USE_DATACS) { + struct smc_local *lp = netdev_priv(ndev); + struct resource * res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-data32"); - if (lp->datacs) - iounmap(lp->datacs); + if (lp->datacs) + iounmap(lp->datacs); - lp->datacs = NULL; + lp->datacs = NULL; - if (res) - release_mem_region(res->start, SMC_DATA_EXTENT); + if (res) + release_mem_region(res->start, SMC_DATA_EXTENT); + } } -#else -static void smc_request_datacs(struct platform_device *pdev, struct net_device *ndev) {} -static void smc_release_datacs(struct platform_device *pdev, struct net_device *ndev) {} -#endif /* * smc_init(void) @@ -2166,9 +2183,8 @@ static void smc_release_datacs(struct platform_device *pdev, struct net_device * * 0 --> there is a device * anything else, error */ -static int smc_drv_probe(struct device *dev) +static int smc_drv_probe(struct platform_device *pdev) { - struct platform_device *pdev = to_platform_device(dev); struct net_device *ndev; struct resource *res; unsigned int __iomem *addr; @@ -2195,10 +2211,14 @@ static int smc_drv_probe(struct device *dev) goto out_release_io; } SET_MODULE_OWNER(ndev); - SET_NETDEV_DEV(ndev, dev); + SET_NETDEV_DEV(ndev, &pdev->dev); ndev->dma = (unsigned char)-1; ndev->irq = platform_get_irq(pdev, 0); + if (ndev->irq < 0) { + ret = -ENODEV; + goto out_free_netdev; + } ret = smc_request_attrib(pdev); if (ret) @@ -2216,7 +2236,7 @@ static int smc_drv_probe(struct device *dev) goto out_release_attrib; } - dev_set_drvdata(dev, ndev); + platform_set_drvdata(pdev, ndev); ret = smc_probe(ndev, addr); if (ret != 0) goto out_iounmap; @@ -2232,7 +2252,7 @@ static int smc_drv_probe(struct device *dev) return 0; out_iounmap: - dev_set_drvdata(dev, NULL); + platform_set_drvdata(pdev, NULL); iounmap(addr); out_release_attrib: smc_release_attrib(pdev); @@ -2246,14 +2266,13 @@ static int smc_drv_probe(struct device *dev) return ret; } -static int smc_drv_remove(struct device *dev) +static int smc_drv_remove(struct platform_device *pdev) { - struct platform_device *pdev = to_platform_device(dev); - struct net_device *ndev = dev_get_drvdata(dev); + struct net_device *ndev = platform_get_drvdata(pdev); struct smc_local *lp = netdev_priv(ndev); struct resource *res; - dev_set_drvdata(dev, NULL); + platform_set_drvdata(pdev, NULL); unregister_netdev(ndev); @@ -2278,11 +2297,11 @@ static int smc_drv_remove(struct device *dev) return 0; } -static int smc_drv_suspend(struct device *dev, pm_message_t state, u32 level) +static int smc_drv_suspend(struct platform_device *dev, pm_message_t state) { - struct net_device *ndev = dev_get_drvdata(dev); + struct net_device *ndev = platform_get_drvdata(dev); - if (ndev && level == SUSPEND_DISABLE) { + if (ndev) { if (netif_running(ndev)) { netif_device_detach(ndev); smc_shutdown(ndev); @@ -2292,14 +2311,13 @@ static int smc_drv_suspend(struct device *dev, pm_message_t state, u32 level) return 0; } -static int smc_drv_resume(struct device *dev, u32 level) +static int smc_drv_resume(struct platform_device *dev) { - struct platform_device *pdev = to_platform_device(dev); - struct net_device *ndev = dev_get_drvdata(dev); + struct net_device *ndev = platform_get_drvdata(dev); - if (ndev && level == RESUME_ENABLE) { + if (ndev) { struct smc_local *lp = netdev_priv(ndev); - smc_enable_device(pdev); + smc_enable_device(dev); if (netif_running(ndev)) { smc_reset(ndev); smc_enable(ndev); @@ -2311,13 +2329,14 @@ static int smc_drv_resume(struct device *dev, u32 level) return 0; } -static struct device_driver smc_driver = { - .name = CARDNAME, - .bus = &platform_bus_type, +static struct platform_driver smc_driver = { .probe = smc_drv_probe, .remove = smc_drv_remove, .suspend = smc_drv_suspend, .resume = smc_drv_resume, + .driver = { + .name = CARDNAME, + }, }; static int __init smc_init(void) @@ -2331,12 +2350,12 @@ static int __init smc_init(void) #endif #endif - return driver_register(&smc_driver); + return platform_driver_register(&smc_driver); } static void __exit smc_cleanup(void) { - driver_unregister(&smc_driver); + platform_driver_unregister(&smc_driver); } module_init(smc_init); diff --git a/drivers/net/smc91x.h b/drivers/net/smc91x.h index ddd2688e7..7aa7fbac8 100644 --- a/drivers/net/smc91x.h +++ b/drivers/net/smc91x.h @@ -90,7 +90,7 @@ __l--; \ } \ } while (0) -#define set_irq_type(irq, type) +#define SMC_IRQ_FLAGS (0) #elif defined(CONFIG_SA1100_PLEB) /* We can only do 16-bit reads and writes in the static memory space. */ @@ -100,16 +100,16 @@ #define SMC_IO_SHIFT 0 #define SMC_NOWAIT 1 -#define SMC_inb(a, r) inb((a) + (r)) -#define SMC_insb(a, r, p, l) insb((a) + (r), p, (l)) -#define SMC_inw(a, r) inw((a) + (r)) -#define SMC_insw(a, r, p, l) insw((a) + (r), p, l) -#define SMC_outb(v, a, r) outb(v, (a) + (r)) -#define SMC_outsb(a, r, p, l) outsb((a) + (r), p, (l)) -#define SMC_outw(v, a, r) outw(v, (a) + (r)) -#define SMC_outsw(a, r, p, l) outsw((a) + (r), p, l) +#define SMC_inb(a, r) readb((a) + (r)) +#define SMC_insb(a, r, p, l) readsb((a) + (r), p, (l)) +#define SMC_inw(a, r) readw((a) + (r)) +#define SMC_insw(a, r, p, l) readsw((a) + (r), p, l) +#define SMC_outb(v, a, r) writeb(v, (a) + (r)) +#define SMC_outsb(a, r, p, l) writesb((a) + (r), p, (l)) +#define SMC_outw(v, a, r) writew(v, (a) + (r)) +#define SMC_outsw(a, r, p, l) writesw((a) + (r), p, l) -#define set_irq_type(irq, type) do {} while (0) +#define SMC_IRQ_FLAGS (0) #elif defined(CONFIG_SA1100_ASSABET) @@ -129,6 +129,19 @@ #define SMC_insb(a, r, p, l) readsb((a) + (r), p, (l)) #define SMC_outsb(a, r, p, l) writesb((a) + (r), p, (l)) +#elif defined(CONFIG_MACH_LOGICPD_PXA270) + +#define SMC_CAN_USE_8BIT 0 +#define SMC_CAN_USE_16BIT 1 +#define SMC_CAN_USE_32BIT 0 +#define SMC_IO_SHIFT 0 +#define SMC_NOWAIT 1 + +#define SMC_inw(a, r) readw((a) + (r)) +#define SMC_outw(v, a, r) writew(v, (a) + (r)) +#define SMC_insw(a, r, p, l) readsw((a) + (r), p, l) +#define SMC_outsw(a, r, p, l) writesw((a) + (r), p, l) + #elif defined(CONFIG_ARCH_INNOKOM) || \ defined(CONFIG_MACH_MAINSTONE) || \ defined(CONFIG_ARCH_PXA_IDP) || \ @@ -151,7 +164,7 @@ /* We actually can't write halfwords properly if not word aligned */ static inline void -SMC_outw(u16 val, unsigned long ioaddr, int reg) +SMC_outw(u16 val, void __iomem *ioaddr, int reg) { if (reg & 2) { unsigned int v = val << 16; @@ -171,16 +184,20 @@ SMC_outw(u16 val, unsigned long ioaddr, int reg) #define SMC_IO_SHIFT 0 #define SMC_NOWAIT 1 -#define SMC_inb(a, r) readb((a) + (r)) -#define SMC_outb(v, a, r) writeb(v, (a) + (r)) #define SMC_inw(a, r) readw((a) + (r)) #define SMC_outw(v, a, r) writew(v, (a) + (r)) #define SMC_insw(a, r, p, l) readsw((a) + (r), p, l) #define SMC_outsw(a, r, p, l) writesw((a) + (r), p, l) -#define SMC_inl(a, r) readl((a) + (r)) -#define SMC_outl(v, a, r) writel(v, (a) + (r)) -#define SMC_insl(a, r, p, l) readsl((a) + (r), p, l) -#define SMC_outsl(a, r, p, l) writesl((a) + (r), p, l) + +#include +#include + +#define SMC_IRQ_FLAGS (( \ + machine_is_omap_h2() \ + || machine_is_omap_h3() \ + || (machine_is_omap_innovator() && !cpu_is_omap1510()) \ + ) ? IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING) + #elif defined(CONFIG_SH_SH4202_MICRODEV) @@ -199,7 +216,7 @@ SMC_outw(u16 val, unsigned long ioaddr, int reg) #define SMC_insw(a, r, p, l) insw((a) + (r) - 0xa0000000, p, l) #define SMC_outsw(a, r, p, l) outsw((a) + (r) - 0xa0000000, p, l) -#define set_irq_type(irq, type) do {} while(0) +#define SMC_IRQ_FLAGS (0) #elif defined(CONFIG_ISA) @@ -220,27 +237,29 @@ SMC_outw(u16 val, unsigned long ioaddr, int reg) #define SMC_CAN_USE_16BIT 1 #define SMC_CAN_USE_32BIT 0 -#define SMC_inb(a, r) inb((a) + (r) - 0xa0000000) -#define SMC_inw(a, r) inw((a) + (r) - 0xa0000000) -#define SMC_outb(v, a, r) outb(v, (a) + (r) - 0xa0000000) -#define SMC_outw(v, a, r) outw(v, (a) + (r) - 0xa0000000) -#define SMC_insw(a, r, p, l) insw((a) + (r) - 0xa0000000, p, l) -#define SMC_outsw(a, r, p, l) outsw((a) + (r) - 0xa0000000, p, l) +#define SMC_inb(a, r) inb((u32)a) + (r)) +#define SMC_inw(a, r) inw(((u32)a) + (r)) +#define SMC_outb(v, a, r) outb(v, ((u32)a) + (r)) +#define SMC_outw(v, a, r) outw(v, ((u32)a) + (r)) +#define SMC_insw(a, r, p, l) insw(((u32)a) + (r), p, l) +#define SMC_outsw(a, r, p, l) outsw(((u32)a) + (r), p, l) -#define set_irq_type(irq, type) do {} while(0) +#define SMC_IRQ_FLAGS (0) #define RPC_LSA_DEFAULT RPC_LED_TX_RX #define RPC_LSB_DEFAULT RPC_LED_100_10 -#elif defined(CONFIG_MACH_LPD7A400) || defined(CONFIG_MACH_LPD7A404) +#elif defined(CONFIG_MACH_LPD79520) \ + || defined(CONFIG_MACH_LPD7A400) \ + || defined(CONFIG_MACH_LPD7A404) -/* The LPD7A40X_IOBARRIER is necessary to overcome a mismatch between - * the way that the CPU handles chip selects and the way that the SMC - * chip expects the chip select to operate. Refer to +/* The LPD7X_IOBARRIER is necessary to overcome a mismatch between the + * way that the CPU handles chip selects and the way that the SMC chip + * expects the chip select to operate. Refer to * Documentation/arm/Sharp-LH/IOBarrier for details. The read from - * IOBARRIER is a byte as a least-common denominator of possible - * regions to use as the barrier. It would be wasteful to read 32 - * bits from a byte oriented region. + * IOBARRIER is a byte, in order that we read the least-common + * denominator. It would be wasteful to read 32 bits from an 8-bit + * accessible region. * * There is no explicit protection against interrupts intervening * between the writew and the IOBARRIER. In SMC ISR there is a @@ -259,26 +278,107 @@ SMC_outw(u16 val, unsigned long ioaddr, int reg) #define SMC_CAN_USE_16BIT 1 #define SMC_CAN_USE_32BIT 0 #define SMC_NOWAIT 0 -#define LPD7A40X_IOBARRIER readb (IOBARRIER_VIRT) +#define LPD7X_IOBARRIER readb (IOBARRIER_VIRT) -#define SMC_inw(a,r) readw ((void*) ((a) + (r))) -#define SMC_insw(a,r,p,l) readsw ((void*) ((a) + (r)), p, l) -#define SMC_outw(v,a,r) ({ writew ((v), (a) + (r)); LPD7A40X_IOBARRIER; }) +#define SMC_inw(a,r)\ + ({ unsigned short v = readw ((void*) ((a) + (r))); LPD7X_IOBARRIER; v; }) +#define SMC_outw(v,a,r) ({ writew ((v), (a) + (r)); LPD7X_IOBARRIER; }) -static inline void SMC_outsw (unsigned long a, int r, unsigned char* p, int l) +#define SMC_insw LPD7_SMC_insw +static inline void LPD7_SMC_insw (unsigned char* a, int r, + unsigned char* p, int l) +{ + unsigned short* ps = (unsigned short*) p; + while (l-- > 0) { + *ps++ = readw (a + r); + LPD7X_IOBARRIER; + } +} + +#define SMC_outsw LPD7_SMC_outsw +static inline void LPD7_SMC_outsw (unsigned char* a, int r, + unsigned char* p, int l) { unsigned short* ps = (unsigned short*) p; while (l-- > 0) { writew (*ps++, a + r); - LPD7A40X_IOBARRIER; + LPD7X_IOBARRIER; } } -#define SMC_INTERRUPT_PREAMBLE LPD7A40X_IOBARRIER +#define SMC_INTERRUPT_PREAMBLE LPD7X_IOBARRIER #define RPC_LSA_DEFAULT RPC_LED_TX_RX #define RPC_LSB_DEFAULT RPC_LED_100_10 +#elif defined(CONFIG_SOC_AU1X00) + +#include + +/* We can only do 16-bit reads and writes in the static memory space. */ +#define SMC_CAN_USE_8BIT 0 +#define SMC_CAN_USE_16BIT 1 +#define SMC_CAN_USE_32BIT 0 +#define SMC_IO_SHIFT 0 +#define SMC_NOWAIT 1 + +#define SMC_inw(a, r) au_readw((unsigned long)((a) + (r))) +#define SMC_insw(a, r, p, l) \ + do { \ + unsigned long _a = (unsigned long)((a) + (r)); \ + int _l = (l); \ + u16 *_p = (u16 *)(p); \ + while (_l-- > 0) \ + *_p++ = au_readw(_a); \ + } while(0) +#define SMC_outw(v, a, r) au_writew(v, (unsigned long)((a) + (r))) +#define SMC_outsw(a, r, p, l) \ + do { \ + unsigned long _a = (unsigned long)((a) + (r)); \ + int _l = (l); \ + const u16 *_p = (const u16 *)(p); \ + while (_l-- > 0) \ + au_writew(*_p++ , _a); \ + } while(0) + +#define SMC_IRQ_FLAGS (0) + +#elif defined(CONFIG_ARCH_VERSATILE) + +#define SMC_CAN_USE_8BIT 1 +#define SMC_CAN_USE_16BIT 1 +#define SMC_CAN_USE_32BIT 1 +#define SMC_NOWAIT 1 + +#define SMC_inb(a, r) readb((a) + (r)) +#define SMC_inw(a, r) readw((a) + (r)) +#define SMC_inl(a, r) readl((a) + (r)) +#define SMC_outb(v, a, r) writeb(v, (a) + (r)) +#define SMC_outw(v, a, r) writew(v, (a) + (r)) +#define SMC_outl(v, a, r) writel(v, (a) + (r)) +#define SMC_insl(a, r, p, l) readsl((a) + (r), p, l) +#define SMC_outsl(a, r, p, l) writesl((a) + (r), p, l) + +#define SMC_IRQ_FLAGS (0) + +#elif defined(CONFIG_ARCH_VERSATILE) + +#define SMC_CAN_USE_8BIT 1 +#define SMC_CAN_USE_16BIT 1 +#define SMC_CAN_USE_32BIT 1 +#define SMC_NOWAIT 1 + +#define SMC_inb(a, r) readb((a) + (r)) +#define SMC_inw(a, r) readw((a) + (r)) +#define SMC_inl(a, r) readl((a) + (r)) +#define SMC_outb(v, a, r) writeb(v, (a) + (r)) +#define SMC_outw(v, a, r) writew(v, (a) + (r)) +#define SMC_outl(v, a, r) writel(v, (a) + (r)) +#define SMC_insl(a, r, p, l) readsl((a) + (r), p, l) +#define SMC_outsl(a, r, p, l) writesl((a) + (r), p, l) + +#define SMC_IRQ_FLAGS (0) + #else #define SMC_CAN_USE_8BIT 1 @@ -300,7 +400,6 @@ static inline void SMC_outsw (unsigned long a, int r, unsigned char* p, int l) #endif - #ifdef SMC_USE_PXA_DMA /* * Let's use the DMA engine on the XScale PXA2xx for RX packets. This is @@ -317,7 +416,7 @@ static inline void SMC_outsw (unsigned long a, int r, unsigned char* p, int l) #define SMC_insl(a, r, p, l) \ smc_pxa_dma_insl(a, lp->physaddr, r, dev->dma, p, l) static inline void -smc_pxa_dma_insl(u_long ioaddr, u_long physaddr, int reg, int dma, +smc_pxa_dma_insl(void __iomem *ioaddr, u_long physaddr, int reg, int dma, u_char *buf, int len) { dma_addr_t dmabuf; @@ -355,7 +454,7 @@ smc_pxa_dma_insl(u_long ioaddr, u_long physaddr, int reg, int dma, #define SMC_insw(a, r, p, l) \ smc_pxa_dma_insw(a, lp->physaddr, r, dev->dma, p, l) static inline void -smc_pxa_dma_insw(u_long ioaddr, u_long physaddr, int reg, int dma, +smc_pxa_dma_insw(void __iomem *ioaddr, u_long physaddr, int reg, int dma, u_char *buf, int len) { dma_addr_t dmabuf; @@ -396,10 +495,85 @@ smc_pxa_dma_irq(int dma, void *dummy, struct pt_regs *regs) #endif /* SMC_USE_PXA_DMA */ -/* Because of bank switching, the LAN91x uses only 16 I/O ports */ +/* + * Everything a particular hardware setup needs should have been defined + * at this point. Add stubs for the undefined cases, mainly to avoid + * compilation warnings since they'll be optimized away, or to prevent buggy + * use of them. + */ + +#if ! SMC_CAN_USE_32BIT +#define SMC_inl(ioaddr, reg) ({ BUG(); 0; }) +#define SMC_outl(x, ioaddr, reg) BUG() +#define SMC_insl(a, r, p, l) BUG() +#define SMC_outsl(a, r, p, l) BUG() +#endif + +#if !defined(SMC_insl) || !defined(SMC_outsl) +#define SMC_insl(a, r, p, l) BUG() +#define SMC_outsl(a, r, p, l) BUG() +#endif + +#if ! SMC_CAN_USE_16BIT + +/* + * Any 16-bit access is performed with two 8-bit accesses if the hardware + * can't do it directly. Most registers are 16-bit so those are mandatory. + */ +#define SMC_outw(x, ioaddr, reg) \ + do { \ + unsigned int __val16 = (x); \ + SMC_outb( __val16, ioaddr, reg ); \ + SMC_outb( __val16 >> 8, ioaddr, reg + (1 << SMC_IO_SHIFT));\ + } while (0) +#define SMC_inw(ioaddr, reg) \ + ({ \ + unsigned int __val16; \ + __val16 = SMC_inb( ioaddr, reg ); \ + __val16 |= SMC_inb( ioaddr, reg + (1 << SMC_IO_SHIFT)) << 8; \ + __val16; \ + }) + +#define SMC_insw(a, r, p, l) BUG() +#define SMC_outsw(a, r, p, l) BUG() + +#endif + +#if !defined(SMC_insw) || !defined(SMC_outsw) +#define SMC_insw(a, r, p, l) BUG() +#define SMC_outsw(a, r, p, l) BUG() +#endif + +#if ! SMC_CAN_USE_8BIT +#define SMC_inb(ioaddr, reg) ({ BUG(); 0; }) +#define SMC_outb(x, ioaddr, reg) BUG() +#define SMC_insb(a, r, p, l) BUG() +#define SMC_outsb(a, r, p, l) BUG() +#endif + +#if !defined(SMC_insb) || !defined(SMC_outsb) +#define SMC_insb(a, r, p, l) BUG() +#define SMC_outsb(a, r, p, l) BUG() +#endif + +#ifndef SMC_CAN_USE_DATACS +#define SMC_CAN_USE_DATACS 0 +#endif + #ifndef SMC_IO_SHIFT #define SMC_IO_SHIFT 0 #endif + +#ifndef SMC_IRQ_FLAGS +#define SMC_IRQ_FLAGS IRQF_TRIGGER_RISING +#endif + +#ifndef SMC_INTERRUPT_PREAMBLE +#define SMC_INTERRUPT_PREAMBLE +#endif + + +/* Because of bank switching, the LAN91x uses only 16 I/O ports */ #define SMC_IO_EXTENT (16 << SMC_IO_SHIFT) #define SMC_DATA_EXTENT (4) @@ -680,14 +854,6 @@ static const char * chip_ids[ 16 ] = { NULL, NULL, NULL}; -/* - . Transmit status bits -*/ -#define TS_SUCCESS 0x0001 -#define TS_LOSTCAR 0x0400 -#define TS_LATCOL 0x0200 -#define TS_16COL 0x0010 - /* . Receive status bits */ @@ -780,6 +946,11 @@ static const char * chip_ids[ 16 ] = { * Note: the following macros do *not* select the bank -- this must * be done separately as needed in the main code. The SMC_REG() macro * only uses the bank argument for debugging purposes (when enabled). + * + * Note: despite inline functions being safer, everything leading to this + * should preferably be macros to let BUG() display the line number in + * the core source code since we're interested in the top call site + * not in any inline function location. */ #if SMC_DEBUG > 0 @@ -797,61 +968,142 @@ static const char * chip_ids[ 16 ] = { #define SMC_REG(reg, bank) (reg<> 8) -#define SMC_GET_TXFIFO() (SMC_inw( ioaddr, TXFIFO_REG ) & 0xFF) -#define SMC_GET_RXFIFO() (SMC_inw( ioaddr, TXFIFO_REG ) >> 8) -#define SMC_GET_INT() (SMC_inw( ioaddr, INT_REG ) & 0xFF) +/* + * Hack Alert: Some setups just can't write 8 or 16 bits reliably when not + * aligned to a 32 bit boundary. I tell you that does exist! + * Fortunately the affected register accesses can be easily worked around + * since we can write zeroes to the preceeding 16 bits without adverse + * effects and use a 32-bit access. + * + * Enforce it on any 32-bit capable setup for now. + */ +#define SMC_MUST_ALIGN_WRITE SMC_CAN_USE_32BIT + +#define SMC_GET_PN() \ + ( SMC_CAN_USE_8BIT ? (SMC_inb(ioaddr, PN_REG)) \ + : (SMC_inw(ioaddr, PN_REG) & 0xFF) ) + +#define SMC_SET_PN(x) \ + do { \ + if (SMC_MUST_ALIGN_WRITE) \ + SMC_outl((x)<<16, ioaddr, SMC_REG(0, 2)); \ + else if (SMC_CAN_USE_8BIT) \ + SMC_outb(x, ioaddr, PN_REG); \ + else \ + SMC_outw(x, ioaddr, PN_REG); \ + } while (0) + +#define SMC_GET_AR() \ + ( SMC_CAN_USE_8BIT ? (SMC_inb(ioaddr, AR_REG)) \ + : (SMC_inw(ioaddr, PN_REG) >> 8) ) + +#define SMC_GET_TXFIFO() \ + ( SMC_CAN_USE_8BIT ? (SMC_inb(ioaddr, TXFIFO_REG)) \ + : (SMC_inw(ioaddr, TXFIFO_REG) & 0xFF) ) + +#define SMC_GET_RXFIFO() \ + ( SMC_CAN_USE_8BIT ? (SMC_inb(ioaddr, RXFIFO_REG)) \ + : (SMC_inw(ioaddr, TXFIFO_REG) >> 8) ) + +#define SMC_GET_INT() \ + ( SMC_CAN_USE_8BIT ? (SMC_inb(ioaddr, INT_REG)) \ + : (SMC_inw(ioaddr, INT_REG) & 0xFF) ) + #define SMC_ACK_INT(x) \ do { \ - unsigned long __flags; \ - int __mask; \ - local_irq_save(__flags); \ - __mask = SMC_inw( ioaddr, INT_REG ) & ~0xff; \ - SMC_outw( __mask | (x), ioaddr, INT_REG ); \ - local_irq_restore(__flags); \ + if (SMC_CAN_USE_8BIT) \ + SMC_outb(x, ioaddr, INT_REG); \ + else { \ + unsigned long __flags; \ + int __mask; \ + local_irq_save(__flags); \ + __mask = SMC_inw( ioaddr, INT_REG ) & ~0xff; \ + SMC_outw( __mask | (x), ioaddr, INT_REG ); \ + local_irq_restore(__flags); \ + } \ } while (0) -#define SMC_GET_INT_MASK() (SMC_inw( ioaddr, INT_REG ) >> 8) -#define SMC_SET_INT_MASK(x) SMC_outw( (x) << 8, ioaddr, INT_REG ) -#endif -#define SMC_CURRENT_BANK() SMC_inw( ioaddr, BANK_SELECT ) -#define SMC_SELECT_BANK(x) SMC_outw( x, ioaddr, BANK_SELECT ) -#define SMC_GET_BASE() SMC_inw( ioaddr, BASE_REG ) -#define SMC_SET_BASE(x) SMC_outw( x, ioaddr, BASE_REG ) -#define SMC_GET_CONFIG() SMC_inw( ioaddr, CONFIG_REG ) -#define SMC_SET_CONFIG(x) SMC_outw( x, ioaddr, CONFIG_REG ) -#define SMC_GET_COUNTER() SMC_inw( ioaddr, COUNTER_REG ) -#define SMC_GET_CTL() SMC_inw( ioaddr, CTL_REG ) -#define SMC_SET_CTL(x) SMC_outw( x, ioaddr, CTL_REG ) -#define SMC_GET_MII() SMC_inw( ioaddr, MII_REG ) -#define SMC_SET_MII(x) SMC_outw( x, ioaddr, MII_REG ) -#define SMC_GET_MIR() SMC_inw( ioaddr, MIR_REG ) -#define SMC_SET_MIR(x) SMC_outw( x, ioaddr, MIR_REG ) -#define SMC_GET_MMU_CMD() SMC_inw( ioaddr, MMU_CMD_REG ) -#define SMC_SET_MMU_CMD(x) SMC_outw( x, ioaddr, MMU_CMD_REG ) -#define SMC_GET_FIFO() SMC_inw( ioaddr, FIFO_REG ) -#define SMC_GET_PTR() SMC_inw( ioaddr, PTR_REG ) -#define SMC_SET_PTR(x) SMC_outw( x, ioaddr, PTR_REG ) -#define SMC_GET_RCR() SMC_inw( ioaddr, RCR_REG ) -#define SMC_SET_RCR(x) SMC_outw( x, ioaddr, RCR_REG ) -#define SMC_GET_REV() SMC_inw( ioaddr, REV_REG ) -#define SMC_GET_RPC() SMC_inw( ioaddr, RPC_REG ) -#define SMC_SET_RPC(x) SMC_outw( x, ioaddr, RPC_REG ) -#define SMC_GET_TCR() SMC_inw( ioaddr, TCR_REG ) -#define SMC_SET_TCR(x) SMC_outw( x, ioaddr, TCR_REG ) +#define SMC_GET_INT_MASK() \ + ( SMC_CAN_USE_8BIT ? (SMC_inb(ioaddr, IM_REG)) \ + : (SMC_inw( ioaddr, INT_REG ) >> 8) ) + +#define SMC_SET_INT_MASK(x) \ + do { \ + if (SMC_CAN_USE_8BIT) \ + SMC_outb(x, ioaddr, IM_REG); \ + else \ + SMC_outw((x) << 8, ioaddr, INT_REG); \ + } while (0) + +#define SMC_CURRENT_BANK() SMC_inw(ioaddr, BANK_SELECT) + +#define SMC_SELECT_BANK(x) \ + do { \ + if (SMC_MUST_ALIGN_WRITE) \ + SMC_outl((x)<<16, ioaddr, 12<> 16; \ - } while (0) -#else -#define SMC_PUT_PKT_HDR(status, length) \ - do { \ - SMC_outw( status, ioaddr, DATA_REG ); \ - SMC_outw( length, ioaddr, DATA_REG ); \ - } while (0) -#define SMC_GET_PKT_HDR(status, length) \ do { \ - (status) = SMC_inw( ioaddr, DATA_REG ); \ - (length) = SMC_inw( ioaddr, DATA_REG ); \ - } while (0) -#endif - -#if SMC_CAN_USE_32BIT -#define _SMC_PUSH_DATA(p, l) \ - do { \ - char *__ptr = (p); \ - int __len = (l); \ - if (__len >= 2 && (unsigned long)__ptr & 2) { \ - __len -= 2; \ - SMC_outw( *(u16 *)__ptr, ioaddr, DATA_REG ); \ - __ptr += 2; \ - } \ - SMC_outsl( ioaddr, DATA_REG, __ptr, __len >> 2); \ - if (__len & 2) { \ - __ptr += (__len & ~3); \ - SMC_outw( *((u16 *)__ptr), ioaddr, DATA_REG ); \ + if (SMC_CAN_USE_32BIT) \ + SMC_outl((status) | (length)<<16, ioaddr, DATA_REG); \ + else { \ + SMC_outw(status, ioaddr, DATA_REG); \ + SMC_outw(length, ioaddr, DATA_REG); \ } \ } while (0) -#define _SMC_PULL_DATA(p, l) \ + +#define SMC_GET_PKT_HDR(status, length) \ do { \ - char *__ptr = (p); \ - int __len = (l); \ - if ((unsigned long)__ptr & 2) { \ - /* \ - * We want 32bit alignment here. \ - * Since some buses perform a full 32bit \ - * fetch even for 16bit data we can't use \ - * SMC_inw() here. Back both source (on chip \ - * and destination) pointers of 2 bytes. \ - */ \ - __ptr -= 2; \ - __len += 2; \ - SMC_SET_PTR( 2|PTR_READ|PTR_RCV|PTR_AUTOINC ); \ + if (SMC_CAN_USE_32BIT) { \ + unsigned int __val = SMC_inl(ioaddr, DATA_REG); \ + (status) = __val & 0xffff; \ + (length) = __val >> 16; \ + } else { \ + (status) = SMC_inw(ioaddr, DATA_REG); \ + (length) = SMC_inw(ioaddr, DATA_REG); \ } \ - __len += 2; \ - SMC_insl( ioaddr, DATA_REG, __ptr, __len >> 2); \ } while (0) -#elif SMC_CAN_USE_16BIT -#define _SMC_PUSH_DATA(p, l) SMC_outsw( ioaddr, DATA_REG, p, (l) >> 1 ) -#define _SMC_PULL_DATA(p, l) SMC_insw ( ioaddr, DATA_REG, p, (l) >> 1 ) -#elif SMC_CAN_USE_8BIT -#define _SMC_PUSH_DATA(p, l) SMC_outsb( ioaddr, DATA_REG, p, l ) -#define _SMC_PULL_DATA(p, l) SMC_insb ( ioaddr, DATA_REG, p, l ) -#endif -#if ! SMC_CAN_USE_16BIT -#define SMC_outw(x, ioaddr, reg) \ +#define SMC_PUSH_DATA(p, l) \ do { \ - unsigned int __val16 = (x); \ - SMC_outb( __val16, ioaddr, reg ); \ - SMC_outb( __val16 >> 8, ioaddr, reg + (1 << SMC_IO_SHIFT));\ + if (SMC_CAN_USE_32BIT) { \ + void *__ptr = (p); \ + int __len = (l); \ + void *__ioaddr = ioaddr; \ + if (__len >= 2 && (unsigned long)__ptr & 2) { \ + __len -= 2; \ + SMC_outw(*(u16 *)__ptr, ioaddr, DATA_REG); \ + __ptr += 2; \ + } \ + if (SMC_CAN_USE_DATACS && lp->datacs) \ + __ioaddr = lp->datacs; \ + SMC_outsl(__ioaddr, DATA_REG, __ptr, __len>>2); \ + if (__len & 2) { \ + __ptr += (__len & ~3); \ + SMC_outw(*((u16 *)__ptr), ioaddr, DATA_REG); \ + } \ + } else if (SMC_CAN_USE_16BIT) \ + SMC_outsw(ioaddr, DATA_REG, p, (l) >> 1); \ + else if (SMC_CAN_USE_8BIT) \ + SMC_outsb(ioaddr, DATA_REG, p, l); \ } while (0) -#define SMC_inw(ioaddr, reg) \ - ({ \ - unsigned int __val16; \ - __val16 = SMC_inb( ioaddr, reg ); \ - __val16 |= SMC_inb( ioaddr, reg + (1 << SMC_IO_SHIFT)) << 8; \ - __val16; \ - }) -#endif - -#if SMC_CAN_USE_DATACS -#define SMC_PUSH_DATA(p, l) \ - if ( lp->datacs ) { \ - unsigned char *__ptr = (p); \ - int __len = (l); \ - if (__len >= 2 && (unsigned long)__ptr & 2) { \ - __len -= 2; \ - SMC_outw( *((u16 *)__ptr), ioaddr, DATA_REG ); \ - __ptr += 2; \ - } \ - outsl(lp->datacs, __ptr, __len >> 2); \ - if (__len & 2) { \ - __ptr += (__len & ~3); \ - SMC_outw( *((u16 *)__ptr), ioaddr, DATA_REG ); \ - } \ - } else { \ - _SMC_PUSH_DATA(p, l); \ - } #define SMC_PULL_DATA(p, l) \ - if ( lp->datacs ) { \ - unsigned char *__ptr = (p); \ - int __len = (l); \ - if ((unsigned long)__ptr & 2) { \ - /* \ - * We want 32bit alignment here. \ - * Since some buses perform a full 32bit \ - * fetch even for 16bit data we can't use \ - * SMC_inw() here. Back both source (on chip \ - * and destination) pointers of 2 bytes. \ - */ \ - __ptr -= 2; \ + do { \ + if (SMC_CAN_USE_32BIT) { \ + void *__ptr = (p); \ + int __len = (l); \ + void *__ioaddr = ioaddr; \ + if ((unsigned long)__ptr & 2) { \ + /* \ + * We want 32bit alignment here. \ + * Since some buses perform a full \ + * 32bit fetch even for 16bit data \ + * we can't use SMC_inw() here. \ + * Back both source (on-chip) and \ + * destination pointers of 2 bytes. \ + * This is possible since the call to \ + * SMC_GET_PKT_HDR() already advanced \ + * the source pointer of 4 bytes, and \ + * the skb_reserve(skb, 2) advanced \ + * the destination pointer of 2 bytes. \ + */ \ + __ptr -= 2; \ + __len += 2; \ + SMC_SET_PTR(2|PTR_READ|PTR_RCV|PTR_AUTOINC); \ + } \ + if (SMC_CAN_USE_DATACS && lp->datacs) \ + __ioaddr = lp->datacs; \ __len += 2; \ - SMC_SET_PTR( 2|PTR_READ|PTR_RCV|PTR_AUTOINC ); \ - } \ - __len += 2; \ - insl( lp->datacs, __ptr, __len >> 2); \ - } else { \ - _SMC_PULL_DATA(p, l); \ - } -#else -#define SMC_PUSH_DATA(p, l) _SMC_PUSH_DATA(p, l) -#define SMC_PULL_DATA(p, l) _SMC_PULL_DATA(p, l) -#endif - -#if !defined (SMC_INTERRUPT_PREAMBLE) -# define SMC_INTERRUPT_PREAMBLE -#endif + SMC_insl(__ioaddr, DATA_REG, __ptr, __len>>2); \ + } else if (SMC_CAN_USE_16BIT) \ + SMC_insw(ioaddr, DATA_REG, p, (l) >> 1); \ + else if (SMC_CAN_USE_8BIT) \ + SMC_insb(ioaddr, DATA_REG, p, l); \ + } while (0) #endif /* _SMC91X_H_ */ diff --git a/drivers/net/sonic.c b/drivers/net/sonic.c index 90b818a8d..cab0dd958 100644 --- a/drivers/net/sonic.c +++ b/drivers/net/sonic.c @@ -231,8 +231,7 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) length = skb->len; if (length < ETH_ZLEN) { - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) + if (skb_padto(skb, ETH_ZLEN)) return 0; length = ETH_ZLEN; } diff --git a/drivers/net/sonic.h b/drivers/net/sonic.h index cede969a8..7f5c4ebcc 100644 --- a/drivers/net/sonic.h +++ b/drivers/net/sonic.h @@ -22,7 +22,6 @@ #ifndef SONIC_H #define SONIC_H -#include /* * SONIC register offsets diff --git a/drivers/net/spider_net.c b/drivers/net/spider_net.c index 394339d5e..889072184 100644 --- a/drivers/net/spider_net.c +++ b/drivers/net/spider_net.c @@ -21,7 +21,6 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include #include #include @@ -85,7 +84,7 @@ MODULE_DEVICE_TABLE(pci, spider_net_pci_tbl); * * returns the content of the specified SMMIO register. */ -static u32 +static inline u32 spider_net_read_reg(struct spider_net_card *card, u32 reg) { u32 value; @@ -102,7 +101,7 @@ spider_net_read_reg(struct spider_net_card *card, u32 reg) * @reg: register to write to * @value: value to write into the specified SMMIO register */ -static void +static inline void spider_net_write_reg(struct spider_net_card *card, u32 reg, u32 value) { value = cpu_to_le32(value); @@ -260,39 +259,10 @@ spider_net_get_mac_address(struct net_device *netdev) * * returns the status as in the dmac_cmd_status field of the descriptor */ -static enum spider_net_descr_status +static inline int spider_net_get_descr_status(struct spider_net_descr *descr) { - u32 cmd_status; - - cmd_status = descr->dmac_cmd_status; - cmd_status >>= SPIDER_NET_DESCR_IND_PROC_SHIFT; - /* no need to mask out any bits, as cmd_status is 32 bits wide only - * (and unsigned) */ - return cmd_status; -} - -/** - * spider_net_set_descr_status -- sets the status of a descriptor - * @descr: descriptor to change - * @status: status to set in the descriptor - * - * changes the status to the specified value. Doesn't change other bits - * in the status - */ -static void -spider_net_set_descr_status(struct spider_net_descr *descr, - enum spider_net_descr_status status) -{ - u32 cmd_status; - /* read the status */ - cmd_status = descr->dmac_cmd_status; - /* clean the upper 4 bits */ - cmd_status &= SPIDER_NET_DESCR_IND_PROC_MASKO; - /* add the status to it */ - cmd_status |= ((u32)status)<dmac_cmd_status = cmd_status; + return descr->dmac_cmd_status & SPIDER_NET_DESCR_IND_PROC_MASK; } /** @@ -329,24 +299,23 @@ spider_net_free_chain(struct spider_net_card *card, static int spider_net_init_chain(struct spider_net_card *card, struct spider_net_descr_chain *chain, - struct spider_net_descr *start_descr, int no) + struct spider_net_descr *start_descr, + int direction, int no) { int i; struct spider_net_descr *descr; dma_addr_t buf; - atomic_set(&card->rx_chain_refill,0); - descr = start_descr; memset(descr, 0, sizeof(*descr) * no); /* set up the hardware pointers in each descriptor */ for (i=0; idmac_cmd_status = SPIDER_NET_DESCR_NOT_IN_USE; buf = pci_map_single(card->pdev, descr, SPIDER_NET_DESCR_SIZE, - PCI_DMA_BIDIRECTIONAL); + direction); if (buf == DMA_ERROR_CODE) goto iommu_error; @@ -361,10 +330,11 @@ spider_net_init_chain(struct spider_net_card *card, start_descr->prev = descr-1; descr = start_descr; - for (i=0; i < no; i++, descr++) { - descr->next_descr_addr = descr->next->bus_addr; - } + if (direction == PCI_DMA_FROMDEVICE) + for (i=0; i < no; i++, descr++) + descr->next_descr_addr = descr->next->bus_addr; + spin_lock_init(&chain->lock); chain->head = start_descr; chain->tail = start_descr; @@ -376,7 +346,7 @@ iommu_error: if (descr->bus_addr) pci_unmap_single(card->pdev, descr->bus_addr, SPIDER_NET_DESCR_SIZE, - PCI_DMA_BIDIRECTIONAL); + direction); return -ENOMEM; } @@ -397,7 +367,7 @@ spider_net_free_rx_chain_contents(struct spider_net_card *card) dev_kfree_skb(descr->skb); pci_unmap_single(card->pdev, descr->buf_addr, SPIDER_NET_MAX_FRAME, - PCI_DMA_BIDIRECTIONAL); + PCI_DMA_FROMDEVICE); } descr = descr->next; } @@ -447,15 +417,16 @@ spider_net_prepare_rx_descr(struct spider_net_card *card, skb_reserve(descr->skb, SPIDER_NET_RXBUF_ALIGN - offset); /* io-mmu-map the skb */ buf = pci_map_single(card->pdev, descr->skb->data, - SPIDER_NET_MAX_FRAME, PCI_DMA_BIDIRECTIONAL); + SPIDER_NET_MAX_FRAME, PCI_DMA_FROMDEVICE); descr->buf_addr = buf; if (buf == DMA_ERROR_CODE) { dev_kfree_skb_any(descr->skb); if (netif_msg_rx_err(card) && net_ratelimit()) pr_err("Could not iommu-map rx buffer\n"); - spider_net_set_descr_status(descr, SPIDER_NET_DESCR_NOT_IN_USE); + descr->dmac_cmd_status = SPIDER_NET_DESCR_NOT_IN_USE; } else { - descr->dmac_cmd_status = SPIDER_NET_DMAC_RX_CARDOWNED; + descr->dmac_cmd_status = SPIDER_NET_DESCR_CARDOWNED | + SPIDER_NET_DMAC_NOINTR_COMPLETE; } return error; @@ -469,7 +440,7 @@ spider_net_prepare_rx_descr(struct spider_net_card *card, * chip by writing to the appropriate register. DMA is enabled in * spider_net_enable_rxdmac. */ -static void +static inline void spider_net_enable_rxchtails(struct spider_net_card *card) { /* assume chain is aligned correctly */ @@ -484,7 +455,7 @@ spider_net_enable_rxchtails(struct spider_net_card *card) * spider_net_enable_rxdmac enables the DMA controller by setting RX_DMA_EN * in the GDADMACCNTR register */ -static void +static inline void spider_net_enable_rxdmac(struct spider_net_card *card) { wmb(); @@ -501,23 +472,24 @@ spider_net_enable_rxdmac(struct spider_net_card *card) static void spider_net_refill_rx_chain(struct spider_net_card *card) { - struct spider_net_descr_chain *chain; - - chain = &card->rx_chain; + struct spider_net_descr_chain *chain = &card->rx_chain; + unsigned long flags; /* one context doing the refill (and a second context seeing that * and omitting it) is ok. If called by NAPI, we'll be called again * as spider_net_decode_one_descr is called several times. If some * interrupt calls us, the NAPI is about to clean up anyway. */ - if (atomic_inc_return(&card->rx_chain_refill) == 1) - while (spider_net_get_descr_status(chain->head) == - SPIDER_NET_DESCR_NOT_IN_USE) { - if (spider_net_prepare_rx_descr(card, chain->head)) - break; - chain->head = chain->head->next; - } + if (!spin_trylock_irqsave(&chain->lock, flags)) + return; + + while (spider_net_get_descr_status(chain->head) == + SPIDER_NET_DESCR_NOT_IN_USE) { + if (spider_net_prepare_rx_descr(card, chain->head)) + break; + chain->head = chain->head->next; + } - atomic_dec(&card->rx_chain_refill); + spin_unlock_irqrestore(&chain->lock, flags); } /** @@ -554,111 +526,6 @@ error: return result; } -/** - * spider_net_release_tx_descr - processes a used tx descriptor - * @card: card structure - * @descr: descriptor to release - * - * releases a used tx descriptor (unmapping, freeing of skb) - */ -static void -spider_net_release_tx_descr(struct spider_net_card *card, - struct spider_net_descr *descr) -{ - struct sk_buff *skb; - - /* unmap the skb */ - skb = descr->skb; - pci_unmap_single(card->pdev, descr->buf_addr, skb->len, - PCI_DMA_BIDIRECTIONAL); - - dev_kfree_skb_any(skb); - - /* set status to not used */ - spider_net_set_descr_status(descr, SPIDER_NET_DESCR_NOT_IN_USE); -} - -/** - * spider_net_release_tx_chain - processes sent tx descriptors - * @card: adapter structure - * @brutal: if set, don't care about whether descriptor seems to be in use - * - * returns 0 if the tx ring is empty, otherwise 1. - * - * spider_net_release_tx_chain releases the tx descriptors that spider has - * finished with (if non-brutal) or simply release tx descriptors (if brutal). - * If some other context is calling this function, we return 1 so that we're - * scheduled again (if we were scheduled) and will not loose initiative. - */ -static int -spider_net_release_tx_chain(struct spider_net_card *card, int brutal) -{ - struct spider_net_descr_chain *tx_chain = &card->tx_chain; - enum spider_net_descr_status status; - - if (atomic_inc_return(&card->tx_chain_release) != 1) { - atomic_dec(&card->tx_chain_release); - return 1; - } - - for (;;) { - status = spider_net_get_descr_status(tx_chain->tail); - switch (status) { - case SPIDER_NET_DESCR_CARDOWNED: - if (!brutal) - goto out; - /* fallthrough, if we release the descriptors - * brutally (then we don't care about - * SPIDER_NET_DESCR_CARDOWNED) */ - case SPIDER_NET_DESCR_RESPONSE_ERROR: - case SPIDER_NET_DESCR_PROTECTION_ERROR: - case SPIDER_NET_DESCR_FORCE_END: - if (netif_msg_tx_err(card)) - pr_err("%s: forcing end of tx descriptor " - "with status x%02x\n", - card->netdev->name, status); - card->netdev_stats.tx_dropped++; - break; - - case SPIDER_NET_DESCR_COMPLETE: - card->netdev_stats.tx_packets++; - card->netdev_stats.tx_bytes += - tx_chain->tail->skb->len; - break; - - default: /* any other value (== SPIDER_NET_DESCR_NOT_IN_USE) */ - goto out; - } - spider_net_release_tx_descr(card, tx_chain->tail); - tx_chain->tail = tx_chain->tail->next; - } -out: - atomic_dec(&card->tx_chain_release); - - netif_wake_queue(card->netdev); - - if (status == SPIDER_NET_DESCR_CARDOWNED) - return 1; - return 0; -} - -/** - * spider_net_cleanup_tx_ring - cleans up the TX ring - * @card: card structure - * - * spider_net_cleanup_tx_ring is called by the tx_timer (as we don't use - * interrupts to cleanup our TX ring) and returns sent packets to the stack - * by freeing them - */ -static void -spider_net_cleanup_tx_ring(struct spider_net_card *card) -{ - if ( (spider_net_release_tx_chain(card, 0)) && - (card->netdev->flags & IFF_UP) ) { - mod_timer(&card->tx_timer, jiffies + SPIDER_NET_TX_TIMER); - } -} - /** * spider_net_get_multicast_hash - generates hash for multicast filter table * @addr: multicast address @@ -761,97 +628,6 @@ spider_net_disable_rxdmac(struct spider_net_card *card) SPIDER_NET_DMA_RX_FEND_VALUE); } -/** - * spider_net_stop - called upon ifconfig down - * @netdev: interface device structure - * - * always returns 0 - */ -int -spider_net_stop(struct net_device *netdev) -{ - struct spider_net_card *card = netdev_priv(netdev); - - tasklet_kill(&card->rxram_full_tl); - netif_poll_disable(netdev); - netif_carrier_off(netdev); - netif_stop_queue(netdev); - del_timer_sync(&card->tx_timer); - - /* disable/mask all interrupts */ - spider_net_write_reg(card, SPIDER_NET_GHIINT0MSK, 0); - spider_net_write_reg(card, SPIDER_NET_GHIINT1MSK, 0); - spider_net_write_reg(card, SPIDER_NET_GHIINT2MSK, 0); - - /* free_irq(netdev->irq, netdev);*/ - free_irq(to_pci_dev(netdev->class_dev.dev)->irq, netdev); - - spider_net_write_reg(card, SPIDER_NET_GDTDMACCNTR, - SPIDER_NET_DMA_TX_FEND_VALUE); - - /* turn off DMA, force end */ - spider_net_disable_rxdmac(card); - - /* release chains */ - spider_net_release_tx_chain(card, 1); - - spider_net_free_chain(card, &card->tx_chain); - spider_net_free_chain(card, &card->rx_chain); - - return 0; -} - -/** - * spider_net_get_next_tx_descr - returns the next available tx descriptor - * @card: device structure to get descriptor from - * - * returns the address of the next descriptor, or NULL if not available. - */ -static struct spider_net_descr * -spider_net_get_next_tx_descr(struct spider_net_card *card) -{ - /* check, if head points to not-in-use descr */ - if ( spider_net_get_descr_status(card->tx_chain.head) == - SPIDER_NET_DESCR_NOT_IN_USE ) { - return card->tx_chain.head; - } else { - return NULL; - } -} - -/** - * spider_net_set_txdescr_cmdstat - sets the tx descriptor command field - * @descr: descriptor structure to fill out - * @skb: packet to consider - * - * fills out the command and status field of the descriptor structure, - * depending on hardware checksum settings. - */ -static void -spider_net_set_txdescr_cmdstat(struct spider_net_descr *descr, - struct sk_buff *skb) -{ - /* make sure the other fields in the descriptor are written */ - wmb(); - - if (skb->ip_summed != CHECKSUM_HW) { - descr->dmac_cmd_status = SPIDER_NET_DMAC_CMDSTAT_NOCS; - return; - } - - /* is packet ip? - * if yes: tcp? udp? */ - if (skb->protocol == htons(ETH_P_IP)) { - if (skb->nh.iph->protocol == IPPROTO_TCP) - descr->dmac_cmd_status = SPIDER_NET_DMAC_CMDSTAT_TCPCS; - else if (skb->nh.iph->protocol == IPPROTO_UDP) - descr->dmac_cmd_status = SPIDER_NET_DMAC_CMDSTAT_UDPCS; - else /* the stack should checksum non-tcp and non-udp - packets on his own: NETIF_F_IP_CSUM */ - descr->dmac_cmd_status = SPIDER_NET_DMAC_CMDSTAT_NOCS; - } -} - /** * spider_net_prepare_tx_descr - fill tx descriptor with skb data * @card: card structure @@ -865,13 +641,12 @@ spider_net_set_txdescr_cmdstat(struct spider_net_descr *descr, */ static int spider_net_prepare_tx_descr(struct spider_net_card *card, - struct spider_net_descr *descr, struct sk_buff *skb) { + struct spider_net_descr *descr = card->tx_chain.head; dma_addr_t buf; - buf = pci_map_single(card->pdev, skb->data, - skb->len, PCI_DMA_BIDIRECTIONAL); + buf = pci_map_single(card->pdev, skb->data, skb->len, PCI_DMA_TODEVICE); if (buf == DMA_ERROR_CODE) { if (netif_msg_tx_err(card) && net_ratelimit()) pr_err("could not iommu-map packet (%p, %i). " @@ -881,10 +656,101 @@ spider_net_prepare_tx_descr(struct spider_net_card *card, descr->buf_addr = buf; descr->buf_size = skb->len; + descr->next_descr_addr = 0; descr->skb = skb; descr->data_status = 0; - spider_net_set_txdescr_cmdstat(descr,skb); + descr->dmac_cmd_status = + SPIDER_NET_DESCR_CARDOWNED | SPIDER_NET_DMAC_NOCS; + if (skb->protocol == htons(ETH_P_IP)) + switch (skb->nh.iph->protocol) { + case IPPROTO_TCP: + descr->dmac_cmd_status |= SPIDER_NET_DMAC_TCP; + break; + case IPPROTO_UDP: + descr->dmac_cmd_status |= SPIDER_NET_DMAC_UDP; + break; + } + + descr->prev->next_descr_addr = descr->bus_addr; + + return 0; +} + +/** + * spider_net_release_tx_descr - processes a used tx descriptor + * @card: card structure + * @descr: descriptor to release + * + * releases a used tx descriptor (unmapping, freeing of skb) + */ +static inline void +spider_net_release_tx_descr(struct spider_net_card *card) +{ + struct spider_net_descr *descr = card->tx_chain.tail; + struct sk_buff *skb; + + card->tx_chain.tail = card->tx_chain.tail->next; + descr->dmac_cmd_status |= SPIDER_NET_DESCR_NOT_IN_USE; + + /* unmap the skb */ + skb = descr->skb; + pci_unmap_single(card->pdev, descr->buf_addr, skb->len, + PCI_DMA_TODEVICE); + dev_kfree_skb_any(skb); +} + +/** + * spider_net_release_tx_chain - processes sent tx descriptors + * @card: adapter structure + * @brutal: if set, don't care about whether descriptor seems to be in use + * + * returns 0 if the tx ring is empty, otherwise 1. + * + * spider_net_release_tx_chain releases the tx descriptors that spider has + * finished with (if non-brutal) or simply release tx descriptors (if brutal). + * If some other context is calling this function, we return 1 so that we're + * scheduled again (if we were scheduled) and will not loose initiative. + */ +static int +spider_net_release_tx_chain(struct spider_net_card *card, int brutal) +{ + struct spider_net_descr_chain *chain = &card->tx_chain; + int status; + + spider_net_read_reg(card, SPIDER_NET_GDTDMACCNTR); + + while (chain->tail != chain->head) { + status = spider_net_get_descr_status(chain->tail); + switch (status) { + case SPIDER_NET_DESCR_COMPLETE: + card->netdev_stats.tx_packets++; + card->netdev_stats.tx_bytes += chain->tail->skb->len; + break; + + case SPIDER_NET_DESCR_CARDOWNED: + if (!brutal) + return 1; + /* fallthrough, if we release the descriptors + * brutally (then we don't care about + * SPIDER_NET_DESCR_CARDOWNED) */ + + case SPIDER_NET_DESCR_RESPONSE_ERROR: + case SPIDER_NET_DESCR_PROTECTION_ERROR: + case SPIDER_NET_DESCR_FORCE_END: + if (netif_msg_tx_err(card)) + pr_err("%s: forcing end of tx descriptor " + "with status x%02x\n", + card->netdev->name, status); + card->netdev_stats.tx_errors++; + break; + + default: + card->netdev_stats.tx_dropped++; + return 1; + } + spider_net_release_tx_descr(card); + } return 0; } @@ -897,18 +763,32 @@ spider_net_prepare_tx_descr(struct spider_net_card *card, * spider_net_kick_tx_dma writes the current tx chain head as start address * of the tx descriptor chain and enables the transmission DMA engine */ -static void -spider_net_kick_tx_dma(struct spider_net_card *card, - struct spider_net_descr *descr) +static inline void +spider_net_kick_tx_dma(struct spider_net_card *card) { - /* this is the only descriptor in the output chain. - * Enable TX DMA */ + struct spider_net_descr *descr; - spider_net_write_reg(card, SPIDER_NET_GDTDCHA, - descr->bus_addr); + if (spider_net_read_reg(card, SPIDER_NET_GDTDMACCNTR) & + SPIDER_NET_TX_DMA_EN) + goto out; - spider_net_write_reg(card, SPIDER_NET_GDTDMACCNTR, - SPIDER_NET_DMA_TX_VALUE); + descr = card->tx_chain.tail; + for (;;) { + if (spider_net_get_descr_status(descr) == + SPIDER_NET_DESCR_CARDOWNED) { + spider_net_write_reg(card, SPIDER_NET_GDTDCHA, + descr->bus_addr); + spider_net_write_reg(card, SPIDER_NET_GDTDMACCNTR, + SPIDER_NET_DMA_TX_VALUE); + break; + } + if (descr == card->tx_chain.head) + break; + descr = descr->next; + } + +out: + mod_timer(&card->tx_timer, jiffies + SPIDER_NET_TX_TIMER); } /** @@ -916,47 +796,69 @@ spider_net_kick_tx_dma(struct spider_net_card *card, * @skb: packet to send out * @netdev: interface device structure * - * returns 0 on success, <0 on failure + * returns 0 on success, !0 on failure */ static int spider_net_xmit(struct sk_buff *skb, struct net_device *netdev) { struct spider_net_card *card = netdev_priv(netdev); - struct spider_net_descr *descr; + struct spider_net_descr_chain *chain = &card->tx_chain; + struct spider_net_descr *descr = chain->head; + unsigned long flags; int result; + spin_lock_irqsave(&chain->lock, flags); + spider_net_release_tx_chain(card, 0); - descr = spider_net_get_next_tx_descr(card); + if (chain->head->next == chain->tail->prev) { + card->netdev_stats.tx_dropped++; + result = NETDEV_TX_LOCKED; + goto out; + } - if (!descr) - goto error; + if (spider_net_get_descr_status(descr) != SPIDER_NET_DESCR_NOT_IN_USE) { + result = NETDEV_TX_LOCKED; + goto out; + } - result = spider_net_prepare_tx_descr(card, descr, skb); - if (result) - goto error; + if (spider_net_prepare_tx_descr(card, skb) != 0) { + card->netdev_stats.tx_dropped++; + result = NETDEV_TX_BUSY; + goto out; + } + result = NETDEV_TX_OK; + + spider_net_kick_tx_dma(card); card->tx_chain.head = card->tx_chain.head->next; - if (spider_net_get_descr_status(descr->prev) != - SPIDER_NET_DESCR_CARDOWNED) { - /* make sure the current descriptor is in memory. Then - * kicking it on again makes sense, if the previous is not - * card-owned anymore. Check the previous descriptor twice - * to omit an mb() in heavy traffic cases */ - mb(); - if (spider_net_get_descr_status(descr->prev) != - SPIDER_NET_DESCR_CARDOWNED) - spider_net_kick_tx_dma(card, descr); - } +out: + spin_unlock_irqrestore(&chain->lock, flags); + netif_wake_queue(netdev); + return result; +} - mod_timer(&card->tx_timer, jiffies + SPIDER_NET_TX_TIMER); +/** + * spider_net_cleanup_tx_ring - cleans up the TX ring + * @card: card structure + * + * spider_net_cleanup_tx_ring is called by the tx_timer (as we don't use + * interrupts to cleanup our TX ring) and returns sent packets to the stack + * by freeing them + */ +static void +spider_net_cleanup_tx_ring(struct spider_net_card *card) +{ + unsigned long flags; - return NETDEV_TX_OK; + spin_lock_irqsave(&card->tx_chain.lock, flags); -error: - card->netdev_stats.tx_dropped++; - return NETDEV_TX_BUSY; + if ((spider_net_release_tx_chain(card, 0) != 0) && + (card->netdev->flags & IFF_UP)) + spider_net_kick_tx_dma(card); + + spin_unlock_irqrestore(&card->tx_chain.lock, flags); } /** @@ -1003,7 +905,7 @@ spider_net_pass_skb_up(struct spider_net_descr *descr, /* unmap descriptor */ pci_unmap_single(card->pdev, descr->buf_addr, SPIDER_NET_MAX_FRAME, - PCI_DMA_BIDIRECTIONAL); + PCI_DMA_FROMDEVICE); /* the cases we'll throw away the packet immediately */ if (data_error & SPIDER_NET_DESTROY_RX_FLAGS) { @@ -1068,14 +970,11 @@ spider_net_pass_skb_up(struct spider_net_descr *descr, static int spider_net_decode_one_descr(struct spider_net_card *card, int napi) { - enum spider_net_descr_status status; - struct spider_net_descr *descr; - struct spider_net_descr_chain *chain; + struct spider_net_descr_chain *chain = &card->rx_chain; + struct spider_net_descr *descr = chain->tail; + int status; int result; - chain = &card->rx_chain; - descr = chain->tail; - status = spider_net_get_descr_status(descr); if (status == SPIDER_NET_DESCR_CARDOWNED) { @@ -1104,7 +1003,7 @@ spider_net_decode_one_descr(struct spider_net_card *card, int napi) card->netdev->name, status); card->netdev_stats.rx_dropped++; pci_unmap_single(card->pdev, descr->buf_addr, - SPIDER_NET_MAX_FRAME, PCI_DMA_BIDIRECTIONAL); + SPIDER_NET_MAX_FRAME, PCI_DMA_FROMDEVICE); dev_kfree_skb_irq(descr->skb); goto refill; } @@ -1120,7 +1019,7 @@ spider_net_decode_one_descr(struct spider_net_card *card, int napi) /* ok, we've got a packet in descr */ result = spider_net_pass_skb_up(descr, card, napi); refill: - spider_net_set_descr_status(descr, SPIDER_NET_DESCR_NOT_IN_USE); + descr->dmac_cmd_status = SPIDER_NET_DESCR_NOT_IN_USE; /* change the descriptor state: */ if (!napi) spider_net_refill_rx_chain(card); @@ -1291,21 +1190,6 @@ spider_net_set_mac(struct net_device *netdev, void *p) return 0; } -/** - * spider_net_enable_txdmac - enables a TX DMA controller - * @card: card structure - * - * spider_net_enable_txdmac enables the TX DMA controller by setting the - * descriptor chain tail address - */ -static void -spider_net_enable_txdmac(struct spider_net_card *card) -{ - /* assume chain is aligned correctly */ - spider_net_write_reg(card, SPIDER_NET_GDTDCHA, - card->tx_chain.tail->bus_addr); -} - /** * spider_net_handle_rxram_full - cleans up RX ring upon RX RAM full interrupt * @card: card structure @@ -1654,7 +1538,6 @@ spider_net_enable_card(struct spider_net_card *card) { SPIDER_NET_GMRWOLCTRL, 0 }, { SPIDER_NET_GTESTMD, 0x10000000 }, { SPIDER_NET_GTTQMSK, 0x00400040 }, - { SPIDER_NET_GTESTMD, 0 }, { SPIDER_NET_GMACINTEN, 0 }, @@ -1693,9 +1576,6 @@ spider_net_enable_card(struct spider_net_card *card) spider_net_write_reg(card, SPIDER_NET_GRXDMAEN, SPIDER_NET_WOL_VALUE); - /* set chain tail adress for TX chain */ - spider_net_enable_txdmac(card); - spider_net_write_reg(card, SPIDER_NET_GMACLENLMT, SPIDER_NET_LENLMT_VALUE); spider_net_write_reg(card, SPIDER_NET_GMACMODE, @@ -1710,6 +1590,9 @@ spider_net_enable_card(struct spider_net_card *card) SPIDER_NET_INT1_MASK_VALUE); spider_net_write_reg(card, SPIDER_NET_GHIINT2MSK, SPIDER_NET_INT2_MASK_VALUE); + + spider_net_write_reg(card, SPIDER_NET_GDTDMACCNTR, + SPIDER_NET_GDTDCEIDIS); } /** @@ -1728,11 +1611,12 @@ spider_net_open(struct net_device *netdev) int result; result = -ENOMEM; - if (spider_net_init_chain(card, &card->tx_chain, - card->descr, tx_descriptors)) + if (spider_net_init_chain(card, &card->tx_chain, card->descr, + PCI_DMA_TODEVICE, card->tx_desc)) goto alloc_tx_failed; if (spider_net_init_chain(card, &card->rx_chain, - card->descr + tx_descriptors, rx_descriptors)) + card->descr + card->rx_desc, + PCI_DMA_FROMDEVICE, card->rx_desc)) goto alloc_rx_failed; /* allocate rx skbs */ @@ -1745,7 +1629,7 @@ spider_net_open(struct net_device *netdev) result = -EBUSY; if (request_irq(netdev->irq, spider_net_interrupt, - SA_SHIRQ, netdev->name, netdev)) + IRQF_SHARED, netdev->name, netdev)) goto register_int_failed; spider_net_enable_card(card); @@ -1939,7 +1823,7 @@ spider_net_workaround_rxramfull(struct spider_net_card *card) /* empty sequencer data */ for (sequencer = 0; sequencer < SPIDER_NET_FIRMWARE_SEQS; sequencer++) { - spider_net_write_reg(card, SPIDER_NET_GSnPRGDAT + + spider_net_write_reg(card, SPIDER_NET_GSnPRGADR + sequencer * 8, 0x0); for (i = 0; i < SPIDER_NET_FIRMWARE_SEQWORDS; i++) { spider_net_write_reg(card, SPIDER_NET_GSnPRGDAT + @@ -1955,6 +1839,49 @@ spider_net_workaround_rxramfull(struct spider_net_card *card) SPIDER_NET_CKRCTRL_STOP_VALUE); } +/** + * spider_net_stop - called upon ifconfig down + * @netdev: interface device structure + * + * always returns 0 + */ +int +spider_net_stop(struct net_device *netdev) +{ + struct spider_net_card *card = netdev_priv(netdev); + + tasklet_kill(&card->rxram_full_tl); + netif_poll_disable(netdev); + netif_carrier_off(netdev); + netif_stop_queue(netdev); + del_timer_sync(&card->tx_timer); + + /* disable/mask all interrupts */ + spider_net_write_reg(card, SPIDER_NET_GHIINT0MSK, 0); + spider_net_write_reg(card, SPIDER_NET_GHIINT1MSK, 0); + spider_net_write_reg(card, SPIDER_NET_GHIINT2MSK, 0); + + /* free_irq(netdev->irq, netdev);*/ + free_irq(to_pci_dev(netdev->class_dev.dev)->irq, netdev); + + spider_net_write_reg(card, SPIDER_NET_GDTDMACCNTR, + SPIDER_NET_DMA_TX_FEND_VALUE); + + /* turn off DMA, force end */ + spider_net_disable_rxdmac(card); + + /* release chains */ + if (spin_trylock(&card->tx_chain.lock)) { + spider_net_release_tx_chain(card, 1); + spin_unlock(&card->tx_chain.lock); + } + + spider_net_free_chain(card, &card->tx_chain); + spider_net_free_chain(card, &card->rx_chain); + + return 0; +} + /** * spider_net_tx_timeout_task - task scheduled by the watchdog timeout * function (to be called not under interrupt status) @@ -1983,7 +1910,7 @@ spider_net_tx_timeout_task(void *data) goto out; spider_net_open(netdev); - spider_net_kick_tx_dma(card, card->tx_chain.head); + spider_net_kick_tx_dma(card); netif_device_attach(netdev); out: @@ -2066,7 +1993,6 @@ spider_net_setup_netdev(struct spider_net_card *card) pci_set_drvdata(card->pdev, netdev); - atomic_set(&card->tx_chain_release,0); card->rxram_full_tl.data = (unsigned long) card; card->rxram_full_tl.func = (void (*)(unsigned long)) spider_net_handle_rxram_full; @@ -2078,9 +2004,12 @@ spider_net_setup_netdev(struct spider_net_card *card) card->options.rx_csum = SPIDER_NET_RX_CSUM_DEFAULT; + card->tx_desc = tx_descriptors; + card->rx_desc = rx_descriptors; + spider_net_setup_netdev_ops(netdev); - netdev->features = NETIF_F_HW_CSUM; + netdev->features = NETIF_F_HW_CSUM | NETIF_F_LLTX; /* some time: NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX | * NETIF_F_HW_VLAN_FILTER */ diff --git a/drivers/net/spider_net.h b/drivers/net/spider_net.h index 3b8d951cf..30407cdf0 100644 --- a/drivers/net/spider_net.h +++ b/drivers/net/spider_net.h @@ -208,7 +208,10 @@ extern char spider_net_driver_name[]; #define SPIDER_NET_DMA_RX_VALUE 0x80000000 #define SPIDER_NET_DMA_RX_FEND_VALUE 0x00030003 /* to set TX_DMA_EN */ -#define SPIDER_NET_DMA_TX_VALUE 0x80000000 +#define SPIDER_NET_TX_DMA_EN 0x80000000 +#define SPIDER_NET_GDTDCEIDIS 0x00000002 +#define SPIDER_NET_DMA_TX_VALUE SPIDER_NET_TX_DMA_EN | \ + SPIDER_NET_GDTDCEIDIS #define SPIDER_NET_DMA_TX_FEND_VALUE 0x00030003 /* SPIDER_NET_UA_DESCR_VALUE is OR'ed with the unicast address */ @@ -329,55 +332,23 @@ enum spider_net_int2_status { (~SPIDER_NET_TXINT) & \ (~SPIDER_NET_RXINT) ) -#define SPIDER_NET_GPREXEC 0x80000000 -#define SPIDER_NET_GPRDAT_MASK 0x0000ffff +#define SPIDER_NET_GPREXEC 0x80000000 +#define SPIDER_NET_GPRDAT_MASK 0x0000ffff -/* descriptor bits - * - * 1010 descriptor ready - * 0 descr in middle of chain - * 000 fixed to 0 - * - * 0 no interrupt on completion - * 000 fixed to 0 - * 1 no ipsec processing - * 1 last descriptor for this frame - * 00 no checksum - * 10 tcp checksum - * 11 udp checksum - * - * 00 fixed to 0 - * 0 fixed to 0 - * 0 no interrupt on response errors - * 0 no interrupt on invalid descr - * 0 no interrupt on dma process termination - * 0 no interrupt on descr chain end - * 0 no interrupt on descr complete - * - * 000 fixed to 0 - * 0 response error interrupt status - * 0 invalid descr status - * 0 dma termination status - * 0 descr chain end status - * 0 descr complete status */ -#define SPIDER_NET_DMAC_CMDSTAT_NOCS 0xa00c0000 -#define SPIDER_NET_DMAC_CMDSTAT_TCPCS 0xa00e0000 -#define SPIDER_NET_DMAC_CMDSTAT_UDPCS 0xa00f0000 -#define SPIDER_NET_DESCR_IND_PROC_SHIFT 28 -#define SPIDER_NET_DESCR_IND_PROC_MASKO 0x0fffffff - -/* descr ready, descr is in middle of chain, get interrupt on completion */ -#define SPIDER_NET_DMAC_RX_CARDOWNED 0xa0800000 - -enum spider_net_descr_status { - SPIDER_NET_DESCR_COMPLETE = 0x00, /* used in rx and tx */ - SPIDER_NET_DESCR_RESPONSE_ERROR = 0x01, /* used in rx and tx */ - SPIDER_NET_DESCR_PROTECTION_ERROR = 0x02, /* used in rx and tx */ - SPIDER_NET_DESCR_FRAME_END = 0x04, /* used in rx */ - SPIDER_NET_DESCR_FORCE_END = 0x05, /* used in rx and tx */ - SPIDER_NET_DESCR_CARDOWNED = 0x0a, /* used in rx and tx */ - SPIDER_NET_DESCR_NOT_IN_USE /* any other value */ -}; +#define SPIDER_NET_DMAC_NOINTR_COMPLETE 0x00800000 +#define SPIDER_NET_DMAC_NOCS 0x00040000 +#define SPIDER_NET_DMAC_TCP 0x00020000 +#define SPIDER_NET_DMAC_UDP 0x00030000 +#define SPIDER_NET_TXDCEST 0x08000000 + +#define SPIDER_NET_DESCR_IND_PROC_MASK 0xF0000000 +#define SPIDER_NET_DESCR_COMPLETE 0x00000000 /* used in rx and tx */ +#define SPIDER_NET_DESCR_RESPONSE_ERROR 0x10000000 /* used in rx and tx */ +#define SPIDER_NET_DESCR_PROTECTION_ERROR 0x20000000 /* used in rx and tx */ +#define SPIDER_NET_DESCR_FRAME_END 0x40000000 /* used in rx */ +#define SPIDER_NET_DESCR_FORCE_END 0x50000000 /* used in rx and tx */ +#define SPIDER_NET_DESCR_CARDOWNED 0xA0000000 /* used in rx and tx */ +#define SPIDER_NET_DESCR_NOT_IN_USE 0xF0000000 struct spider_net_descr { /* as defined by the hardware */ @@ -398,7 +369,7 @@ struct spider_net_descr { } __attribute__((aligned(32))); struct spider_net_descr_chain { - /* we walk from tail to head */ + spinlock_t lock; struct spider_net_descr *head; struct spider_net_descr *tail; }; @@ -453,8 +424,6 @@ struct spider_net_card { struct spider_net_descr_chain tx_chain; struct spider_net_descr_chain rx_chain; - atomic_t rx_chain_refill; - atomic_t tx_chain_release; struct net_device_stats netdev_stats; @@ -471,6 +440,9 @@ struct spider_net_card { /* for ethtool */ int msg_enable; + int rx_desc; + int tx_desc; + struct spider_net_descr descr[0]; }; diff --git a/drivers/net/spider_net_ethtool.c b/drivers/net/spider_net_ethtool.c index a5bb0b763..02209222b 100644 --- a/drivers/net/spider_net_ethtool.c +++ b/drivers/net/spider_net_ethtool.c @@ -130,6 +130,18 @@ spider_net_ethtool_set_tx_csum(struct net_device *netdev, uint32_t data) return 0; } +static void +spider_net_ethtool_get_ringparam(struct net_device *netdev, + struct ethtool_ringparam *ering) +{ + struct spider_net_card *card = netdev->priv; + + ering->tx_max_pending = SPIDER_NET_TX_DESCRIPTORS_MAX; + ering->tx_pending = card->tx_desc; + ering->rx_max_pending = SPIDER_NET_RX_DESCRIPTORS_MAX; + ering->rx_pending = card->rx_desc; +} + struct ethtool_ops spider_net_ethtool_ops = { .get_settings = spider_net_ethtool_get_settings, .get_drvinfo = spider_net_ethtool_get_drvinfo, @@ -141,5 +153,6 @@ struct ethtool_ops spider_net_ethtool_ops = { .set_rx_csum = spider_net_ethtool_set_rx_csum, .get_tx_csum = spider_net_ethtool_get_tx_csum, .set_tx_csum = spider_net_ethtool_set_tx_csum, + .get_ringparam = spider_net_ethtool_get_ringparam, }; diff --git a/drivers/net/starfire.c b/drivers/net/starfire.c index 9b7805be2..c0a62b00f 100644 --- a/drivers/net/starfire.c +++ b/drivers/net/starfire.c @@ -22,131 +22,14 @@ Support and updates available at http://www.scyld.com/network/starfire.html + [link no longer provides useful info -jgarzik] - ----------------------------------------------------------- - - Linux kernel-specific changes: - - LK1.1.1 (jgarzik): - - Use PCI driver interface - - Fix MOD_xxx races - - softnet fixups - - LK1.1.2 (jgarzik): - - Merge Becker version 0.15 - - LK1.1.3 (Andrew Morton) - - Timer cleanups - - LK1.1.4 (jgarzik): - - Merge Becker version 1.03 - - LK1.2.1 (Ion Badulescu ) - - Support hardware Rx/Tx checksumming - - Use the GFP firmware taken from Adaptec's Netware driver - - LK1.2.2 (Ion Badulescu) - - Backported to 2.2.x - - LK1.2.3 (Ion Badulescu) - - Fix the flaky mdio interface - - More compat clean-ups - - LK1.2.4 (Ion Badulescu) - - More 2.2.x initialization fixes - - LK1.2.5 (Ion Badulescu) - - Several fixes from Manfred Spraul - - LK1.2.6 (Ion Badulescu) - - Fixed ifup/ifdown/ifup problem in 2.4.x - - LK1.2.7 (Ion Badulescu) - - Removed unused code - - Made more functions static and __init - - LK1.2.8 (Ion Badulescu) - - Quell bogus error messages, inform about the Tx threshold - - Removed #ifdef CONFIG_PCI, this driver is PCI only - - LK1.2.9 (Ion Badulescu) - - Merged Jeff Garzik's changes from 2.4.4-pre5 - - Added 2.2.x compatibility stuff required by the above changes - - LK1.2.9a (Ion Badulescu) - - More updates from Jeff Garzik - - LK1.3.0 (Ion Badulescu) - - Merged zerocopy support - - LK1.3.1 (Ion Badulescu) - - Added ethtool support - - Added GPIO (media change) interrupt support - - LK1.3.2 (Ion Badulescu) - - Fixed 2.2.x compatibility issues introduced in 1.3.1 - - Fixed ethtool ioctl returning uninitialized memory - - LK1.3.3 (Ion Badulescu) - - Initialize the TxMode register properly - - Don't dereference dev->priv after freeing it - - LK1.3.4 (Ion Badulescu) - - Fixed initialization timing problems - - Fixed interrupt mask definitions - - LK1.3.5 (jgarzik) - - ethtool NWAY_RST, GLINK, [GS]MSGLVL support - - LK1.3.6: - - Sparc64 support and fixes (Ion Badulescu) - - Better stats and error handling (Ion Badulescu) - - Use new pci_set_mwi() PCI API function (jgarzik) - - LK1.3.7 (Ion Badulescu) - - minimal implementation of tx_timeout() - - correctly shutdown the Rx/Tx engines in netdev_close() - - added calls to netif_carrier_on/off - (patch from Stefan Rompf ) - - VLAN support - - LK1.3.8 (Ion Badulescu) - - adjust DMA burst size on sparc64 - - 64-bit support - - reworked zerocopy support for 64-bit buffers - - working and usable interrupt mitigation/latency - - reduced Tx interrupt frequency for lower interrupt overhead - - LK1.3.9 (Ion Badulescu) - - bugfix for mcast filter - - enable the right kind of Tx interrupts (TxDMADone, not TxDone) - - LK1.4.0 (Ion Badulescu) - - NAPI support - - LK1.4.1 (Ion Badulescu) - - flush PCI posting buffers after disabling Rx interrupts - - put the chip to a D3 slumber on driver unload - - added config option to enable/disable NAPI - - LK1.4.2 (Ion Badulescu) - - finally added firmware (GPL'ed by Adaptec) - - removed compatibility code for 2.2.x - - LK1.4.2.1 (Ion Badulescu) - - fixed 32/64 bit issues on i386 + CONFIG_HIGHMEM - - added 32-bit padding to outgoing skb's, removed previous workaround - -TODO: - fix forced speed/duplexing code (broken a long time ago, when - somebody converted the driver to use the generic MII code) - - fix VLAN support */ #define DRV_NAME "starfire" -#define DRV_VERSION "1.03+LK1.4.2.1" -#define DRV_RELDATE "October 3, 2005" +#define DRV_VERSION "2.0" +#define DRV_RELDATE "June 27, 2006" -#include #include #include #include @@ -847,7 +730,6 @@ static int __devinit starfire_init_one(struct pci_dev *pdev, goto err_out_free_netdev; } - /* ioremap is borken in Linux-2.2.x/sparc64 */ base = ioremap(ioaddr, io_size); if (!base) { printk(KERN_ERR DRV_NAME " %d: cannot remap %#x @ %#lx, aborting\n", @@ -1071,7 +953,7 @@ static int netdev_open(struct net_device *dev) /* Do we ever need to reset the chip??? */ - retval = request_irq(dev->irq, &intr_handler, SA_SHIRQ, dev->name, dev); + retval = request_irq(dev->irq, &intr_handler, IRQF_SHARED, dev->name, dev); if (retval) return retval; @@ -1349,8 +1231,7 @@ static int start_tx(struct sk_buff *skb, struct net_device *dev) #if defined(ZEROCOPY) && defined(HAS_BROKEN_FIRMWARE) if (skb->ip_summed == CHECKSUM_HW) { - skb = skb_padto(skb, (skb->len + PADDING_MASK) & ~PADDING_MASK); - if (skb == NULL) + if (skb_padto(skb, (skb->len + PADDING_MASK) & ~PADDING_MASK)) return NETDEV_TX_OK; } #endif /* ZEROCOPY && HAS_BROKEN_FIRMWARE */ diff --git a/drivers/net/stnic.c b/drivers/net/stnic.c index b6dfdf8f4..742283489 100644 --- a/drivers/net/stnic.c +++ b/drivers/net/stnic.c @@ -7,7 +7,6 @@ * Copyright (C) 1999 kaz Kojima */ -#include #include #include #include diff --git a/drivers/net/sun3lance.c b/drivers/net/sun3lance.c index d4c0002b4..2dcadb169 100644 --- a/drivers/net/sun3lance.c +++ b/drivers/net/sun3lance.c @@ -55,7 +55,7 @@ static char *version = "sun3lance.c: v1.2 1/12/2001 Sam Creasey (sammy@sammy.ne /* sun3/60 addr/irq for the lance chip. If your sun is different, change this. */ #define LANCE_OBIO 0x120000 -#define LANCE_IRQ IRQ3 +#define LANCE_IRQ IRQ_AUTO_3 /* Debug level: * 0 = silent, print only serious errors @@ -341,7 +341,7 @@ static int __init lance_probe( struct net_device *dev) REGA(CSR0) = CSR0_STOP; - request_irq(LANCE_IRQ, lance_interrupt, SA_INTERRUPT, "SUN3 Lance", dev); + request_irq(LANCE_IRQ, lance_interrupt, IRQF_DISABLED, "SUN3 Lance", dev); dev->irq = (unsigned short)LANCE_IRQ; diff --git a/drivers/net/sunbmac.c b/drivers/net/sunbmac.c index cfaf47c63..d46891510 100644 --- a/drivers/net/sunbmac.c +++ b/drivers/net/sunbmac.c @@ -72,8 +72,6 @@ MODULE_LICENSE("GPL"); #define DIRQ(x) #endif -static struct bigmac *root_bigmac_dev; - #define DEFAULT_JAMSIZE 4 /* Toe jam */ #define QEC_RESET_TRIES 200 @@ -491,7 +489,7 @@ static void bigmac_tcvr_init(struct bigmac *bp) } } -static int bigmac_init(struct bigmac *, int); +static int bigmac_init_hw(struct bigmac *, int); static int try_next_permutation(struct bigmac *bp, void __iomem *tregs) { @@ -551,7 +549,7 @@ static void bigmac_timer(unsigned long data) if (ret == -1) { printk(KERN_ERR "%s: Link down, cable problem?\n", bp->dev->name); - ret = bigmac_init(bp, 0); + ret = bigmac_init_hw(bp, 0); if (ret) { printk(KERN_ERR "%s: Error, cannot re-init the " "BigMAC.\n", bp->dev->name); @@ -621,7 +619,7 @@ static void bigmac_begin_auto_negotiation(struct bigmac *bp) add_timer(&bp->bigmac_timer); } -static int bigmac_init(struct bigmac *bp, int from_irq) +static int bigmac_init_hw(struct bigmac *bp, int from_irq) { void __iomem *gregs = bp->gregs; void __iomem *cregs = bp->creg; @@ -752,7 +750,7 @@ static void bigmac_is_medium_rare(struct bigmac *bp, u32 qec_status, u32 bmac_st } printk(" RESET\n"); - bigmac_init(bp, 1); + bigmac_init_hw(bp, 1); } /* BigMAC transmit complete service routines. */ @@ -920,13 +918,13 @@ static int bigmac_open(struct net_device *dev) struct bigmac *bp = (struct bigmac *) dev->priv; int ret; - ret = request_irq(dev->irq, &bigmac_interrupt, SA_SHIRQ, dev->name, bp); + ret = request_irq(dev->irq, &bigmac_interrupt, IRQF_SHARED, dev->name, bp); if (ret) { printk(KERN_ERR "BIGMAC: Can't order irq %d to go.\n", dev->irq); return ret; } init_timer(&bp->bigmac_timer); - ret = bigmac_init(bp, 0); + ret = bigmac_init_hw(bp, 0); if (ret) free_irq(dev->irq, bp); return ret; @@ -950,7 +948,7 @@ static void bigmac_tx_timeout(struct net_device *dev) { struct bigmac *bp = (struct bigmac *) dev->priv; - bigmac_init(bp, 0); + bigmac_init_hw(bp, 0); netif_wake_queue(dev); } @@ -1104,6 +1102,8 @@ static int __init bigmac_ether_init(struct sbus_dev *qec_sdev) bp->qec_sdev = qec_sdev; bp->bigmac_sdev = qec_sdev->child; + SET_NETDEV_DEV(dev, &bp->bigmac_sdev->ofdev.dev); + spin_lock_init(&bp->lock); /* Verify the registers we expect, are actually there. */ @@ -1226,11 +1226,7 @@ static int __init bigmac_ether_init(struct sbus_dev *qec_sdev) goto fail_and_cleanup; } - /* Put us into the list of instances attached for later driver - * exit. - */ - bp->next_module = root_bigmac_dev; - root_bigmac_dev = bp; + dev_set_drvdata(&bp->bigmac_sdev->ofdev.dev, bp); printk(KERN_INFO "%s: BigMAC 100baseT Ethernet ", dev->name); for (i = 0; i < 6; i++) @@ -1266,69 +1262,68 @@ fail_and_cleanup: /* QEC can be the parent of either QuadEthernet or * a BigMAC. We want the latter. */ -static int __init bigmac_match(struct sbus_dev *sdev) +static int __devinit bigmac_sbus_probe(struct of_device *dev, const struct of_device_id *match) { - struct sbus_dev *child = sdev->child; + struct sbus_dev *sdev = to_sbus_device(&dev->dev); + struct device_node *dp = dev->node; - if (strcmp(sdev->prom_name, "qec") != 0) - return 0; + if (!strcmp(dp->name, "be")) + sdev = sdev->parent; - if (child == NULL) - return 0; - - if (strcmp(child->prom_name, "be") != 0) - return 0; - - return 1; + return bigmac_ether_init(sdev); } -static int __init bigmac_probe(void) +static int __devexit bigmac_sbus_remove(struct of_device *dev) { - struct sbus_bus *sbus; - struct sbus_dev *sdev = NULL; - static int called; - int cards = 0, v; - - root_bigmac_dev = NULL; - - if (called) - return -ENODEV; - called++; - - for_each_sbus(sbus) { - for_each_sbusdev(sdev, sbus) { - if (bigmac_match(sdev)) { - cards++; - if ((v = bigmac_ether_init(sdev))) - return v; - } - } - } - if (!cards) - return -ENODEV; + struct bigmac *bp = dev_get_drvdata(&dev->dev); + struct net_device *net_dev = bp->dev; + + unregister_netdevice(net_dev); + + sbus_iounmap(bp->gregs, GLOB_REG_SIZE); + sbus_iounmap(bp->creg, CREG_REG_SIZE); + sbus_iounmap(bp->bregs, BMAC_REG_SIZE); + sbus_iounmap(bp->tregs, TCVR_REG_SIZE); + sbus_free_consistent(bp->bigmac_sdev, + PAGE_SIZE, + bp->bmac_block, + bp->bblock_dvma); + + free_netdev(net_dev); + + dev_set_drvdata(&dev->dev, NULL); + return 0; } -static void __exit bigmac_cleanup(void) -{ - while (root_bigmac_dev) { - struct bigmac *bp = root_bigmac_dev; - struct bigmac *bp_nxt = root_bigmac_dev->next_module; +static struct of_device_id bigmac_sbus_match[] = { + { + .name = "qec", + }, + { + .name = "be", + }, + {}, +}; - sbus_iounmap(bp->gregs, GLOB_REG_SIZE); - sbus_iounmap(bp->creg, CREG_REG_SIZE); - sbus_iounmap(bp->bregs, BMAC_REG_SIZE); - sbus_iounmap(bp->tregs, TCVR_REG_SIZE); - sbus_free_consistent(bp->bigmac_sdev, - PAGE_SIZE, - bp->bmac_block, - bp->bblock_dvma); +MODULE_DEVICE_TABLE(of, bigmac_sbus_match); - unregister_netdev(bp->dev); - free_netdev(bp->dev); - root_bigmac_dev = bp_nxt; - } +static struct of_platform_driver bigmac_sbus_driver = { + .name = "sunbmac", + .match_table = bigmac_sbus_match, + .probe = bigmac_sbus_probe, + .remove = __devexit_p(bigmac_sbus_remove), +}; + +static int __init bigmac_init(void) +{ + return of_register_driver(&bigmac_sbus_driver, &sbus_bus_type); +} + +static void __exit bigmac_exit(void) +{ + of_unregister_driver(&bigmac_sbus_driver); } -module_init(bigmac_probe); -module_exit(bigmac_cleanup); +module_init(bigmac_init); +module_exit(bigmac_exit); diff --git a/drivers/net/sunbmac.h b/drivers/net/sunbmac.h index b0dbc5187..b563d3c29 100644 --- a/drivers/net/sunbmac.h +++ b/drivers/net/sunbmac.h @@ -332,7 +332,6 @@ struct bigmac { struct sbus_dev *qec_sdev; struct sbus_dev *bigmac_sdev; struct net_device *dev; - struct bigmac *next_module; }; /* We use this to acquire receive skb's that we can DMA directly into. */ diff --git a/drivers/net/sundance.c b/drivers/net/sundance.c index 406b46c48..698568e75 100644 --- a/drivers/net/sundance.c +++ b/drivers/net/sundance.c @@ -16,89 +16,13 @@ Support and updates available at http://www.scyld.com/network/sundance.html - - - Version LK1.01a (jgarzik): - - Replace some MII-related magic numbers with constants - - Version LK1.02 (D-Link): - - Add new board to PCI ID list - - Fix multicast bug - - Version LK1.03 (D-Link): - - New Rx scheme, reduce Rx congestion - - Option to disable flow control - - Version LK1.04 (D-Link): - - Tx timeout recovery - - More support for ethtool. - - Version LK1.04a: - - Remove unused/constant members from struct pci_id_info - (which then allows removal of 'drv_flags' from private struct) - (jgarzik) - - If no phy is found, fail to load that board (jgarzik) - - Always start phy id scan at id 1 to avoid problems (Donald Becker) - - Autodetect where mii_preable_required is needed, - default to not needed. (Donald Becker) - - Version LK1.04b: - - Remove mii_preamble_required module parameter (Donald Becker) - - Add per-interface mii_preamble_required (setting is autodetected) - (Donald Becker) - - Remove unnecessary cast from void pointer (jgarzik) - - Re-align comments in private struct (jgarzik) - - Version LK1.04c (jgarzik): - - Support bitmapped message levels (NETIF_MSG_xxx), and the - two ethtool ioctls that get/set them - - Don't hand-code MII ethtool support, use standard API/lib - - Version LK1.04d: - - Merge from Donald Becker's sundance.c: (Jason Lunz) - * proper support for variably-sized MTUs - * default to PIO, to fix chip bugs - - Add missing unregister_netdev (Jason Lunz) - - Add CONFIG_SUNDANCE_MMIO config option (jgarzik) - - Better rx buf size calculation (Donald Becker) - - Version LK1.05 (D-Link): - - Fix DFE-580TX packet drop issue (for DL10050C) - - Fix reset_tx logic - - Version LK1.06 (D-Link): - - Fix crash while unloading driver - - Versin LK1.06b (D-Link): - - New tx scheme, adaptive tx_coalesce - - Version LK1.07 (D-Link): - - Fix tx bugs in big-endian machines - - Remove unused max_interrupt_work module parameter, the new - NAPI-like rx scheme doesn't need it. - - Remove redundancy get_stats() in intr_handler(), those - I/O access could affect performance in ARM-based system - - Add Linux software VLAN support - - Version LK1.08 (Philippe De Muyter phdm@macqel.be): - - Fix bug of custom mac address - (StationAddr register only accept word write) - - Version LK1.09 (D-Link): - - Fix the flowctrl bug. - - Set Pause bit in MII ANAR if flow control enabled. - - Version LK1.09a (ICPlus): - - Add the delay time in reading the contents of EEPROM - - Version LK1.10 (Philippe De Muyter phdm@macqel.be): - - Make 'unblock interface after Tx underrun' work + [link no longer provides useful info -jgarzik] */ #define DRV_NAME "sundance" -#define DRV_VERSION "1.01+LK1.10" -#define DRV_RELDATE "28-Oct-2005" +#define DRV_VERSION "1.1" +#define DRV_RELDATE "27-Jun-2006" /* The user-configurable values. @@ -183,7 +107,7 @@ static char *media[MAX_UNITS]; #endif /* These identify the driver base version and may not be removed. */ -static char version[] __devinitdata = +static char version[] = KERN_INFO DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE " Written by Donald Becker\n" KERN_INFO " http://www.scyld.com/network/sundance.html\n"; @@ -280,15 +204,15 @@ IVc. Errata #define USE_IO_OPS 1 #endif -static struct pci_device_id sundance_pci_tbl[] = { - {0x1186, 0x1002, 0x1186, 0x1002, 0, 0, 0}, - {0x1186, 0x1002, 0x1186, 0x1003, 0, 0, 1}, - {0x1186, 0x1002, 0x1186, 0x1012, 0, 0, 2}, - {0x1186, 0x1002, 0x1186, 0x1040, 0, 0, 3}, - {0x1186, 0x1002, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4}, - {0x13F0, 0x0201, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5}, - {0x13F0, 0x0200, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 6}, - {0,} +static const struct pci_device_id sundance_pci_tbl[] = { + { 0x1186, 0x1002, 0x1186, 0x1002, 0, 0, 0 }, + { 0x1186, 0x1002, 0x1186, 0x1003, 0, 0, 1 }, + { 0x1186, 0x1002, 0x1186, 0x1012, 0, 0, 2 }, + { 0x1186, 0x1002, 0x1186, 0x1040, 0, 0, 3 }, + { 0x1186, 0x1002, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 }, + { 0x13F0, 0x0201, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5 }, + { 0x13F0, 0x0200, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 6 }, + { } }; MODULE_DEVICE_TABLE(pci, sundance_pci_tbl); @@ -299,15 +223,15 @@ enum { struct pci_id_info { const char *name; }; -static const struct pci_id_info pci_id_tbl[] = { +static const struct pci_id_info pci_id_tbl[] __devinitdata = { {"D-Link DFE-550TX FAST Ethernet Adapter"}, {"D-Link DFE-550FX 100Mbps Fiber-optics Adapter"}, {"D-Link DFE-580TX 4 port Server Adapter"}, {"D-Link DFE-530TXS FAST Ethernet Adapter"}, {"D-Link DL10050-based FAST Ethernet Adapter"}, - {"IC Plus IP100 Fast Ethernet Adapter"}, - {"IC Plus IP100A Fast Ethernet Adapter" }, - {NULL,}, /* 0 terminated list. */ + {"Sundance Technology Alta"}, + {"IC Plus Corporation IP100A FAST Ethernet Adapter"}, + { } /* terminate list. */ }; /* This driver was written to use PCI memory space, however x86-oriented @@ -868,7 +792,7 @@ static int netdev_open(struct net_device *dev) /* Do we need to reset the chip??? */ - i = request_irq(dev->irq, &intr_handler, SA_SHIRQ, dev->name, dev); + i = request_irq(dev->irq, &intr_handler, IRQF_SHARED, dev->name, dev); if (i) return i; diff --git a/drivers/net/sungem.c b/drivers/net/sungem.c index 38cd30cb7..b70bbd748 100644 --- a/drivers/net/sungem.c +++ b/drivers/net/sungem.c @@ -2220,7 +2220,7 @@ static int gem_do_start(struct net_device *dev) spin_unlock_irqrestore(&gp->lock, flags); if (request_irq(gp->pdev->irq, gem_interrupt, - SA_SHIRQ, dev->name, (void *)dev)) { + IRQF_SHARED, dev->name, (void *)dev)) { printk(KERN_ERR "%s: failed to request irq !\n", gp->dev->name); spin_lock_irqsave(&gp->lock, flags); @@ -2880,17 +2880,20 @@ static int __devinit gem_get_device_address(struct gem *gp) #if defined(__sparc__) struct pci_dev *pdev = gp->pdev; struct pcidev_cookie *pcp = pdev->sysdata; - int node = -1; + int use_idprom = 1; if (pcp != NULL) { - node = pcp->prom_node; - if (prom_getproplen(node, "local-mac-address") == 6) - prom_getproperty(node, "local-mac-address", - dev->dev_addr, 6); - else - node = -1; + unsigned char *addr; + int len; + + addr = of_get_property(pcp->prom_node, "local-mac-address", + &len); + if (addr && len == 6) { + use_idprom = 0; + memcpy(dev->dev_addr, addr, 6); + } } - if (node == -1) + if (use_idprom) memcpy(dev->dev_addr, idprom->id_ethaddr, 6); #elif defined(CONFIG_PPC_PMAC) unsigned char *addr; diff --git a/drivers/net/sungem_phy.c b/drivers/net/sungem_phy.c index b2ddd5e79..278c7cb22 100644 --- a/drivers/net/sungem_phy.c +++ b/drivers/net/sungem_phy.c @@ -19,7 +19,6 @@ * of darwin, still need to reverse engineer that */ -#include #include @@ -345,9 +344,9 @@ static int bcm5421_enable_fiber(struct mii_phy* phy) static int bcm5461_enable_fiber(struct mii_phy* phy) { - phy_write(phy, MII_NCONFIG, 0xfc0c); - phy_write(phy, MII_BMCR, 0x4140); - phy_write(phy, MII_NCONFIG, 0xfc0b); + phy_write(phy, MII_NCONFIG, 0xfc0c); + phy_write(phy, MII_BMCR, 0x4140); + phy_write(phy, MII_NCONFIG, 0xfc0b); phy_write(phy, MII_BMCR, 0x0140); return 0; diff --git a/drivers/net/sunhme.c b/drivers/net/sunhme.c index 9f046cae2..c6f5bc3c0 100644 --- a/drivers/net/sunhme.c +++ b/drivers/net/sunhme.c @@ -1,9 +1,9 @@ -/* $Id: sunhme.c,v 1.124 2002/01/15 06:25:51 davem Exp $ - * sunhme.c: Sparc HME/BigMac 10/100baseT half/full duplex auto switching, +/* sunhme.c: Sparc HME/BigMac 10/100baseT half/full duplex auto switching, * auto carrier detecting ethernet driver. Also known as the * "Happy Meal Ethernet" found on SunSwift SBUS cards. * - * Copyright (C) 1996, 1998, 1999, 2002, 2003 David S. Miller (davem@redhat.com) + * Copyright (C) 1996, 1998, 1999, 2002, 2003, + 2006 David S. Miller (davem@davemloft.net) * * Changes : * 2000/11/11 Willy Tarreau @@ -13,7 +13,6 @@ * argument : macaddr=0x00,0x10,0x20,0x30,0x40,0x50 */ -#include #include #include #include @@ -40,15 +39,13 @@ #include #include -#ifdef __sparc__ +#ifdef CONFIG_SPARC #include #include #include #include +#include #include -#ifndef __sparc_v9__ -#include -#endif #endif #include @@ -57,7 +54,7 @@ #ifdef CONFIG_PCI #include -#ifdef __sparc__ +#ifdef CONFIG_SPARC #include #endif #endif @@ -65,9 +62,9 @@ #include "sunhme.h" #define DRV_NAME "sunhme" -#define DRV_VERSION "2.02" -#define DRV_RELDATE "8/24/03" -#define DRV_AUTHOR "David S. Miller (davem@redhat.com)" +#define DRV_VERSION "3.00" +#define DRV_RELDATE "June 23, 2006" +#define DRV_AUTHOR "David S. Miller (davem@davemloft.net)" static char version[] = DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE " " DRV_AUTHOR "\n"; @@ -83,8 +80,6 @@ static int macaddr[6]; module_param_array(macaddr, int, NULL, 0); MODULE_PARM_DESC(macaddr, "Happy Meal MAC address to set"); -static struct happy_meal *root_happy_dev; - #ifdef CONFIG_SBUS static struct quattro *qfe_sbus_list; #endif @@ -181,26 +176,6 @@ static __inline__ void tx_dump_ring(struct happy_meal *hp) #define DEFAULT_IPG2 4 /* For all modes */ #define DEFAULT_JAMSIZE 4 /* Toe jam */ -#if defined(CONFIG_PCI) && defined(MODULE) -/* This happy_pci_ids is declared __initdata because it is only used - as an advisory to depmod. If this is ported to the new PCI interface - where it could be referenced at any time due to hot plugging, - the __initdata reference should be removed. */ - -static struct pci_device_id happymeal_pci_ids[] = { - { - .vendor = PCI_VENDOR_ID_SUN, - .device = PCI_DEVICE_ID_SUN_HAPPYMEAL, - .subvendor = PCI_ANY_ID, - .subdevice = PCI_ANY_ID, - }, - { } /* Terminating entry */ -}; - -MODULE_DEVICE_TABLE(pci, happymeal_pci_ids); - -#endif - /* NOTE: In the descriptor writes one _must_ write the address * member _first_. The card must not be allowed to see * the updated descriptor flags until the address is @@ -1610,7 +1585,7 @@ static int happy_meal_init(struct happy_meal *hp) HMD(("happy_meal_init: old[%08x] bursts<", hme_read32(hp, gregs + GREG_CFG))); -#ifndef __sparc__ +#ifndef CONFIG_SPARC /* It is always PCI and can handle 64byte bursts. */ hme_write32(hp, gregs + GREG_CFG, GREG_CFG_BURST64); #else @@ -1647,7 +1622,7 @@ static int happy_meal_init(struct happy_meal *hp) HMD(("XXX>")); hme_write32(hp, gregs + GREG_CFG, 0); } -#endif /* __sparc__ */ +#endif /* CONFIG_SPARC */ /* Turn off interrupts we do not want to hear. */ HMD((", enable global interrupts, ")); @@ -2219,15 +2194,10 @@ static int happy_meal_open(struct net_device *dev) */ if ((hp->happy_flags & (HFLAG_QUATTRO|HFLAG_PCI)) != HFLAG_QUATTRO) { if (request_irq(dev->irq, &happy_meal_interrupt, - SA_SHIRQ, dev->name, (void *)dev)) { + IRQF_SHARED, dev->name, (void *)dev)) { HMD(("EAGAIN\n")); -#ifdef __sparc__ - printk(KERN_ERR "happy_meal(SBUS): Can't order irq %s to go.\n", - __irq_itoa(dev->irq)); -#else printk(KERN_ERR "happy_meal(SBUS): Can't order irq %d to go.\n", dev->irq); -#endif return -EAGAIN; } @@ -2552,7 +2522,7 @@ static struct ethtool_ops hme_ethtool_ops = { static int hme_version_printed; #ifdef CONFIG_SBUS -void __init quattro_get_ranges(struct quattro *qp) +void __devinit quattro_get_ranges(struct quattro *qp) { struct sbus_dev *sdev = qp->quattro_dev; int err; @@ -2568,7 +2538,7 @@ void __init quattro_get_ranges(struct quattro *qp) qp->nranges = (err / sizeof(struct linux_prom_ranges)); } -static void __init quattro_apply_ranges(struct quattro *qp, struct happy_meal *hp) +static void __devinit quattro_apply_ranges(struct quattro *qp, struct happy_meal *hp) { struct sbus_dev *sdev = hp->happy_dev; int rng; @@ -2595,16 +2565,12 @@ static void __init quattro_apply_ranges(struct quattro *qp, struct happy_meal *h * * Return NULL on failure. */ -static struct quattro * __init quattro_sbus_find(struct sbus_dev *goal_sdev) +static struct quattro * __devinit quattro_sbus_find(struct sbus_dev *goal_sdev) { - struct sbus_bus *sbus; struct sbus_dev *sdev; struct quattro *qp; int i; - if (qfe_sbus_list == NULL) - goto found; - for (qp = qfe_sbus_list; qp != NULL; qp = qp->next) { for (i = 0, sdev = qp->quattro_dev; (sdev != NULL) && (i < 4); @@ -2613,17 +2579,7 @@ static struct quattro * __init quattro_sbus_find(struct sbus_dev *goal_sdev) return qp; } } - for_each_sbus(sbus) { - for_each_sbusdev(sdev, sbus) { - if (sdev == goal_sdev) - goto found; - } - } - /* Cannot find quattro parent, fail. */ - return NULL; - -found: qp = kmalloc(sizeof(struct quattro), GFP_KERNEL); if (qp != NULL) { int i; @@ -2652,7 +2608,7 @@ static void __init quattro_sbus_register_irqs(void) err = request_irq(sdev->irqs[0], quattro_sbus_interrupt, - SA_SHIRQ, "Quattro", + IRQF_SHARED, "Quattro", qp); if (err != 0) { printk(KERN_ERR "Quattro: Fatal IRQ registery error %d.\n", err); @@ -2660,6 +2616,17 @@ static void __init quattro_sbus_register_irqs(void) } } } + +static void quattro_sbus_free_irqs(void) +{ + struct quattro *qp; + + for (qp = qfe_sbus_list; qp != NULL; qp = qp->next) { + struct sbus_dev *sdev = qp->quattro_dev; + + free_irq(sdev->irqs[0], qp); + } +} #endif /* CONFIG_SBUS */ #ifdef CONFIG_PCI @@ -2694,8 +2661,9 @@ static struct quattro * __init quattro_pci_find(struct pci_dev *pdev) #endif /* CONFIG_PCI */ #ifdef CONFIG_SBUS -static int __init happy_meal_sbus_init(struct sbus_dev *sdev, int is_qfe) +static int __devinit happy_meal_sbus_probe_one(struct sbus_dev *sdev, int is_qfe) { + struct device_node *dp = sdev->ofdev.node; struct quattro *qp = NULL; struct happy_meal *hp; struct net_device *dev; @@ -2718,6 +2686,7 @@ static int __init happy_meal_sbus_init(struct sbus_dev *sdev, int is_qfe) if (!dev) goto err_out; SET_MODULE_OWNER(dev); + SET_NETDEV_DEV(dev, &sdev->ofdev.dev); if (hme_version_printed++ == 0) printk(KERN_INFO "%s", version); @@ -2733,13 +2702,16 @@ static int __init happy_meal_sbus_init(struct sbus_dev *sdev, int is_qfe) for (i = 0; i < 6; i++) dev->dev_addr[i] = macaddr[i]; macaddr[5]++; - } else if (qfe_slot != -1 && - prom_getproplen(sdev->prom_node, - "local-mac-address") == 6) { - prom_getproperty(sdev->prom_node, "local-mac-address", - dev->dev_addr, 6); } else { - memcpy(dev->dev_addr, idprom->id_ethaddr, 6); + unsigned char *addr; + int len; + + addr = of_get_property(dp, "local-mac-address", &len); + + if (qfe_slot != -1 && addr && len == 6) + memcpy(dev->dev_addr, addr, 6); + else + memcpy(dev->dev_addr, idprom->id_ethaddr, 6); } hp = dev->priv; @@ -2750,9 +2722,8 @@ static int __init happy_meal_sbus_init(struct sbus_dev *sdev, int is_qfe) err = -ENODEV; if (sdev->num_registers != 5) { - printk(KERN_ERR "happymeal: Device does not have 5 regs, it has %d.\n", + printk(KERN_ERR "happymeal: Device needs 5 regs, has %d.\n", sdev->num_registers); - printk(KERN_ERR "happymeal: Would you like that for here or to go?\n"); goto err_out_free_netdev; } @@ -2766,39 +2737,39 @@ static int __init happy_meal_sbus_init(struct sbus_dev *sdev, int is_qfe) hp->gregs = sbus_ioremap(&sdev->resource[0], 0, GREG_REG_SIZE, "HME Global Regs"); if (!hp->gregs) { - printk(KERN_ERR "happymeal: Cannot map Happy Meal global registers.\n"); + printk(KERN_ERR "happymeal: Cannot map global registers.\n"); goto err_out_free_netdev; } hp->etxregs = sbus_ioremap(&sdev->resource[1], 0, ETX_REG_SIZE, "HME TX Regs"); if (!hp->etxregs) { - printk(KERN_ERR "happymeal: Cannot map Happy Meal MAC Transmit registers.\n"); + printk(KERN_ERR "happymeal: Cannot map MAC TX registers.\n"); goto err_out_iounmap; } hp->erxregs = sbus_ioremap(&sdev->resource[2], 0, ERX_REG_SIZE, "HME RX Regs"); if (!hp->erxregs) { - printk(KERN_ERR "happymeal: Cannot map Happy Meal MAC Receive registers.\n"); + printk(KERN_ERR "happymeal: Cannot map MAC RX registers.\n"); goto err_out_iounmap; } hp->bigmacregs = sbus_ioremap(&sdev->resource[3], 0, BMAC_REG_SIZE, "HME BIGMAC Regs"); if (!hp->bigmacregs) { - printk(KERN_ERR "happymeal: Cannot map Happy Meal BIGMAC registers.\n"); + printk(KERN_ERR "happymeal: Cannot map BIGMAC registers.\n"); goto err_out_iounmap; } hp->tcvregs = sbus_ioremap(&sdev->resource[4], 0, TCVR_REG_SIZE, "HME Tranceiver Regs"); if (!hp->tcvregs) { - printk(KERN_ERR "happymeal: Cannot map Happy Meal Tranceiver registers.\n"); + printk(KERN_ERR "happymeal: Cannot map TCVR registers.\n"); goto err_out_iounmap; } - hp->hm_revision = prom_getintdefault(sdev->prom_node, "hm-rev", 0xff); + hp->hm_revision = of_getintprop_default(dp, "hm-rev", 0xff); if (hp->hm_revision == 0xff) hp->hm_revision = 0xa0; @@ -2812,8 +2783,8 @@ static int __init happy_meal_sbus_init(struct sbus_dev *sdev, int is_qfe) hp->happy_flags |= HFLAG_QUATTRO; /* Get the supported DVMA burst sizes from our Happy SBUS. */ - hp->happy_bursts = prom_getintdefault(sdev->bus->prom_node, - "burst-sizes", 0x00); + hp->happy_bursts = of_getintprop_default(sdev->bus->ofdev.node, + "burst-sizes", 0x00); hp->happy_block = sbus_alloc_consistent(hp->happy_dev, PAGE_SIZE, @@ -2876,6 +2847,8 @@ static int __init happy_meal_sbus_init(struct sbus_dev *sdev, int is_qfe) goto err_out_free_consistent; } + dev_set_drvdata(&sdev->ofdev.dev, hp); + if (qfe_slot != -1) printk(KERN_INFO "%s: Quattro HME slot %d (SBUS) 10/100baseT Ethernet ", dev->name, qfe_slot); @@ -2888,12 +2861,6 @@ static int __init happy_meal_sbus_init(struct sbus_dev *sdev, int is_qfe) dev->dev_addr[i], i == 5 ? ' ' : ':'); printk("\n"); - /* We are home free at this point, link us in to the happy - * device list. - */ - hp->next_module = root_happy_dev; - root_happy_dev = hp; - return 0; err_out_free_consistent: @@ -2923,7 +2890,7 @@ err_out: #endif #ifdef CONFIG_PCI -#ifndef __sparc__ +#ifndef CONFIG_SPARC static int is_quattro_p(struct pci_dev *pdev) { struct pci_dev *busdev = pdev->bus->self; @@ -3011,14 +2978,14 @@ static void get_hme_mac_nonsparc(struct pci_dev *pdev, unsigned char *dev_addr) get_random_bytes(&dev_addr[3], 3); return; } -#endif /* !(__sparc__) */ +#endif /* !(CONFIG_SPARC) */ -static int __init happy_meal_pci_init(struct pci_dev *pdev) +static int __devinit happy_meal_pci_probe(struct pci_dev *pdev, + const struct pci_device_id *ent) { struct quattro *qp = NULL; -#ifdef __sparc__ +#ifdef CONFIG_SPARC struct pcidev_cookie *pcp; - int node; #endif struct happy_meal *hp; struct net_device *dev; @@ -3029,15 +2996,14 @@ static int __init happy_meal_pci_init(struct pci_dev *pdev) int err; /* Now make sure pci_dev cookie is there. */ -#ifdef __sparc__ +#ifdef CONFIG_SPARC pcp = pdev->sysdata; - if (pcp == NULL || pcp->prom_node == -1) { + if (pcp == NULL) { printk(KERN_ERR "happymeal(PCI): Some PCI device info missing\n"); return -ENODEV; } - node = pcp->prom_node; - prom_getstring(node, "name", prom_name, sizeof(prom_name)); + strcpy(prom_name, pcp->prom_node->name); #else if (is_quattro_p(pdev)) strcpy(prom_name, "SUNW,qfe"); @@ -3108,11 +3074,15 @@ static int __init happy_meal_pci_init(struct pci_dev *pdev) dev->dev_addr[i] = macaddr[i]; macaddr[5]++; } else { -#ifdef __sparc__ +#ifdef CONFIG_SPARC + unsigned char *addr; + int len; + if (qfe_slot != -1 && - prom_getproplen(node, "local-mac-address") == 6) { - prom_getproperty(node, "local-mac-address", - dev->dev_addr, 6); + (addr = of_get_property(pcp->prom_node, + "local-mac-address", &len)) != NULL + && len == 6) { + memcpy(dev->dev_addr, addr, 6); } else { memcpy(dev->dev_addr, idprom->id_ethaddr, 6); } @@ -3128,8 +3098,8 @@ static int __init happy_meal_pci_init(struct pci_dev *pdev) hp->bigmacregs = (hpreg_base + 0x6000UL); hp->tcvregs = (hpreg_base + 0x7000UL); -#ifdef __sparc__ - hp->hm_revision = prom_getintdefault(node, "hm-rev", 0xff); +#ifdef CONFIG_SPARC + hp->hm_revision = of_getintprop_default(pcp->prom_node, "hm-rev", 0xff); if (hp->hm_revision == 0xff) { unsigned char prev; @@ -3153,7 +3123,7 @@ static int __init happy_meal_pci_init(struct pci_dev *pdev) /* And of course, indicate this is PCI. */ hp->happy_flags |= HFLAG_PCI; -#ifdef __sparc__ +#ifdef CONFIG_SPARC /* Assume PCI happy meals can handle all burst sizes. */ hp->happy_bursts = DMA_BURSTBITS; #endif @@ -3216,6 +3186,8 @@ static int __init happy_meal_pci_init(struct pci_dev *pdev) goto err_out_iounmap; } + dev_set_drvdata(&pdev->dev, hp); + if (!qfe_slot) { struct pci_dev *qpdev = qp->quattro_dev; @@ -3245,12 +3217,6 @@ static int __init happy_meal_pci_init(struct pci_dev *pdev) printk("\n"); - /* We are home free at this point, link us in to the happy - * device list. - */ - hp->next_module = root_happy_dev; - root_happy_dev = hp; - return 0; err_out_iounmap: @@ -3268,136 +3234,141 @@ err_out_clear_quattro: err_out: return err; } -#endif -#ifdef CONFIG_SBUS -static int __init happy_meal_sbus_probe(void) +static void __devexit happy_meal_pci_remove(struct pci_dev *pdev) { - struct sbus_bus *sbus; - struct sbus_dev *sdev; - int cards = 0; - char model[128]; - - for_each_sbus(sbus) { - for_each_sbusdev(sdev, sbus) { - char *name = sdev->prom_name; - - if (!strcmp(name, "SUNW,hme")) { - cards++; - prom_getstring(sdev->prom_node, "model", - model, sizeof(model)); - if (!strcmp(model, "SUNW,sbus-qfe")) - happy_meal_sbus_init(sdev, 1); - else - happy_meal_sbus_init(sdev, 0); - } else if (!strcmp(name, "qfe") || - !strcmp(name, "SUNW,qfe")) { - cards++; - happy_meal_sbus_init(sdev, 1); - } - } - } - if (cards != 0) - quattro_sbus_register_irqs(); - return cards; + struct happy_meal *hp = dev_get_drvdata(&pdev->dev); + struct net_device *net_dev = hp->dev; + + unregister_netdev(net_dev); + + pci_free_consistent(hp->happy_dev, + PAGE_SIZE, + hp->happy_block, + hp->hblock_dvma); + iounmap(hp->gregs); + pci_release_regions(hp->happy_dev); + + free_netdev(net_dev); + + dev_set_drvdata(&pdev->dev, NULL); } -#endif -#ifdef CONFIG_PCI -static int __init happy_meal_pci_probe(void) +static struct pci_device_id happymeal_pci_ids[] = { + { PCI_DEVICE(PCI_VENDOR_ID_SUN, PCI_DEVICE_ID_SUN_HAPPYMEAL) }, + { } /* Terminating entry */ +}; + +MODULE_DEVICE_TABLE(pci, happymeal_pci_ids); + +static struct pci_driver hme_pci_driver = { + .name = "hme", + .id_table = happymeal_pci_ids, + .probe = happy_meal_pci_probe, + .remove = __devexit_p(happy_meal_pci_remove), +}; + +static int __init happy_meal_pci_init(void) { - struct pci_dev *pdev = NULL; - int cards = 0; + return pci_register_driver(&hme_pci_driver); +} - while ((pdev = pci_find_device(PCI_VENDOR_ID_SUN, - PCI_DEVICE_ID_SUN_HAPPYMEAL, pdev)) != NULL) { - if (pci_enable_device(pdev)) - continue; - pci_set_master(pdev); - cards++; - happy_meal_pci_init(pdev); +static void happy_meal_pci_exit(void) +{ + pci_unregister_driver(&hme_pci_driver); + + while (qfe_pci_list) { + struct quattro *qfe = qfe_pci_list; + struct quattro *next = qfe->next; + + kfree(qfe); + + qfe_pci_list = next; } - return cards; } + #endif -static int __init happy_meal_probe(void) +#ifdef CONFIG_SBUS +static int __devinit hme_sbus_probe(struct of_device *dev, const struct of_device_id *match) { - static int called = 0; - int cards; + struct sbus_dev *sdev = to_sbus_device(&dev->dev); + struct device_node *dp = dev->node; + char *model = of_get_property(dp, "model", NULL); + int is_qfe = (match->data != NULL); - root_happy_dev = NULL; + if (!is_qfe && model && !strcmp(model, "SUNW,sbus-qfe")) + is_qfe = 1; - if (called) - return -ENODEV; - called++; + return happy_meal_sbus_probe_one(sdev, is_qfe); +} + +static int __devexit hme_sbus_remove(struct of_device *dev) +{ + struct happy_meal *hp = dev_get_drvdata(&dev->dev); + struct net_device *net_dev = hp->dev; + + unregister_netdevice(net_dev); + + /* XXX qfe parent interrupt... */ + + sbus_iounmap(hp->gregs, GREG_REG_SIZE); + sbus_iounmap(hp->etxregs, ETX_REG_SIZE); + sbus_iounmap(hp->erxregs, ERX_REG_SIZE); + sbus_iounmap(hp->bigmacregs, BMAC_REG_SIZE); + sbus_iounmap(hp->tcvregs, TCVR_REG_SIZE); + sbus_free_consistent(hp->happy_dev, + PAGE_SIZE, + hp->happy_block, + hp->hblock_dvma); + + free_netdev(net_dev); + + dev_set_drvdata(&dev->dev, NULL); - cards = 0; -#ifdef CONFIG_SBUS - cards += happy_meal_sbus_probe(); -#endif -#ifdef CONFIG_PCI - cards += happy_meal_pci_probe(); -#endif - if (!cards) - return -ENODEV; return 0; } +static struct of_device_id hme_sbus_match[] = { + { + .name = "SUNW,hme", + }, + { + .name = "SUNW,qfe", + .data = (void *) 1, + }, + { + .name = "qfe", + .data = (void *) 1, + }, + {}, +}; -static void __exit happy_meal_cleanup_module(void) -{ -#ifdef CONFIG_SBUS - struct quattro *last_seen_qfe = NULL; -#endif +MODULE_DEVICE_TABLE(of, hme_sbus_match); - while (root_happy_dev) { - struct happy_meal *hp = root_happy_dev; - struct happy_meal *next = root_happy_dev->next_module; - struct net_device *dev = hp->dev; +static struct of_platform_driver hme_sbus_driver = { + .name = "hme", + .match_table = hme_sbus_match, + .probe = hme_sbus_probe, + .remove = __devexit_p(hme_sbus_remove), +}; - /* Unregister netdev before unmapping registers as this - * call can end up trying to access those registers. - */ - unregister_netdev(dev); +static int __init happy_meal_sbus_init(void) +{ + int err; -#ifdef CONFIG_SBUS - if (!(hp->happy_flags & HFLAG_PCI)) { - if (hp->happy_flags & HFLAG_QUATTRO) { - if (hp->qfe_parent != last_seen_qfe) { - free_irq(dev->irq, hp->qfe_parent); - last_seen_qfe = hp->qfe_parent; - } - } + err = of_register_driver(&hme_sbus_driver, &sbus_bus_type); + if (!err) + quattro_sbus_register_irqs(); - sbus_iounmap(hp->gregs, GREG_REG_SIZE); - sbus_iounmap(hp->etxregs, ETX_REG_SIZE); - sbus_iounmap(hp->erxregs, ERX_REG_SIZE); - sbus_iounmap(hp->bigmacregs, BMAC_REG_SIZE); - sbus_iounmap(hp->tcvregs, TCVR_REG_SIZE); - sbus_free_consistent(hp->happy_dev, - PAGE_SIZE, - hp->happy_block, - hp->hblock_dvma); - } -#endif -#ifdef CONFIG_PCI - if ((hp->happy_flags & HFLAG_PCI)) { - pci_free_consistent(hp->happy_dev, - PAGE_SIZE, - hp->happy_block, - hp->hblock_dvma); - iounmap(hp->gregs); - pci_release_regions(hp->happy_dev); - } -#endif - free_netdev(dev); + return err; +} - root_happy_dev = next; - } +static void happy_meal_sbus_exit(void) +{ + of_unregister_driver(&hme_sbus_driver); + quattro_sbus_free_irqs(); - /* Now cleanup the quattro lists. */ -#ifdef CONFIG_SBUS while (qfe_sbus_list) { struct quattro *qfe = qfe_sbus_list; struct quattro *next = qfe->next; @@ -3406,18 +3377,39 @@ static void __exit happy_meal_cleanup_module(void) qfe_sbus_list = next; } +} #endif -#ifdef CONFIG_PCI - while (qfe_pci_list) { - struct quattro *qfe = qfe_pci_list; - struct quattro *next = qfe->next; - kfree(qfe); +static int __init happy_meal_probe(void) +{ + int err = 0; - qfe_pci_list = next; +#ifdef CONFIG_SBUS + err = happy_meal_sbus_init(); +#endif +#ifdef CONFIG_PCI + if (!err) { + err = happy_meal_pci_init(); +#ifdef CONFIG_SBUS + if (err) + happy_meal_sbus_exit(); +#endif } #endif + + return err; +} + + +static void __exit happy_meal_exit(void) +{ +#ifdef CONFIG_SBUS + happy_meal_sbus_exit(); +#endif +#ifdef CONFIG_PCI + happy_meal_pci_exit(); +#endif } module_init(happy_meal_probe); -module_exit(happy_meal_cleanup_module); +module_exit(happy_meal_exit); diff --git a/drivers/net/sunhme.h b/drivers/net/sunhme.h index 34e9f953c..90f446db9 100644 --- a/drivers/net/sunhme.h +++ b/drivers/net/sunhme.h @@ -8,7 +8,6 @@ #ifndef _SUNHME_H #define _SUNHME_H -#include #include /* Happy Meal global registers. */ @@ -461,7 +460,6 @@ struct happy_meal { struct net_device *dev; /* Backpointer */ struct quattro *qfe_parent; /* For Quattro cards */ int qfe_ent; /* Which instance on quattro */ - struct happy_meal *next_module; }; /* Here are the happy flags. */ diff --git a/drivers/net/sunlance.c b/drivers/net/sunlance.c index b7d87d469..ec0413609 100644 --- a/drivers/net/sunlance.c +++ b/drivers/net/sunlance.c @@ -71,7 +71,6 @@ static char lancestr[] = "LANCE"; -#include #include #include #include @@ -266,7 +265,6 @@ struct lance_private { char *name; dma_addr_t init_block_dvma; struct net_device *dev; /* Backpointer */ - struct lance_private *next_module; struct sbus_dev *sdev; struct timer_list multicast_timer; }; @@ -298,8 +296,6 @@ int sparc_lance_debug = 2; #define LANCE_ADDR(x) ((long)(x) & ~0xff000000) -static struct lance_private *root_lance_dev; - /* Load the CSR registers */ static void load_csrs(struct lance_private *lp) { @@ -934,9 +930,9 @@ static int lance_open(struct net_device *dev) STOP_LANCE(lp); - if (request_irq(dev->irq, &lance_interrupt, SA_SHIRQ, + if (request_irq(dev->irq, &lance_interrupt, IRQF_SHARED, lancestr, (void *) dev)) { - printk(KERN_ERR "Lance: Can't get irq %s\n", __irq_itoa(dev->irq)); + printk(KERN_ERR "Lance: Can't get irq %d\n", dev->irq); return -EAGAIN; } @@ -1327,9 +1323,9 @@ static struct ethtool_ops sparc_lance_ethtool_ops = { .get_link = sparc_lance_get_link, }; -static int __init sparc_lance_init(struct sbus_dev *sdev, - struct sbus_dma *ledma, - struct sbus_dev *lebuffer) +static int __init sparc_lance_probe_one(struct sbus_dev *sdev, + struct sbus_dma *ledma, + struct sbus_dev *lebuffer) { static unsigned version_printed; struct net_device *dev; @@ -1473,6 +1469,7 @@ no_link_test: lp->dev = dev; SET_MODULE_OWNER(dev); + SET_NETDEV_DEV(dev, &sdev->ofdev.dev); dev->open = &lance_open; dev->stop = &lance_close; dev->hard_start_xmit = &lance_start_xmit; @@ -1500,8 +1497,7 @@ no_link_test: goto fail; } - lp->next_module = root_lance_dev; - root_lance_dev = lp; + dev_set_drvdata(&sdev->ofdev.dev, lp); printk(KERN_INFO "%s: LANCE ", dev->name); @@ -1536,88 +1532,107 @@ static inline struct sbus_dma *find_ledma(struct sbus_dev *sdev) #include /* Find all the lance cards on the system and initialize them */ -static int __init sparc_lance_probe(void) +static struct sbus_dev sun4_sdev; +static int __init sparc_lance_init(void) { - static struct sbus_dev sdev; - static int called; - - root_lance_dev = NULL; - - if (called) - return -ENODEV; - called++; - if ((idprom->id_machtype == (SM_SUN4|SM_4_330)) || (idprom->id_machtype == (SM_SUN4|SM_4_470))) { - memset(&sdev, 0, sizeof(sdev)); - sdev.reg_addrs[0].phys_addr = sun4_eth_physaddr; - sdev.irqs[0] = 6; - return sparc_lance_init(&sdev, NULL, NULL); + memset(&sun4_sdev, 0, sizeof(struct sbus_dev)); + sun4_sdev.reg_addrs[0].phys_addr = sun4_eth_physaddr; + sun4_sdev.irqs[0] = 6; + return sparc_lance_probe_one(&sun4_sdev, NULL, NULL); } return -ENODEV; } +static int __exit sunlance_sun4_remove(void) +{ + struct lance_private *lp = dev_get_drvdata(&sun4_sdev.ofdev.dev); + struct net_device *net_dev = lp->dev; + + unregister_netdevice(net_dev); + + lance_free_hwresources(lp); + + free_netdev(net_dev); + + dev_set_drvdata(&sun4_sdev.ofdev.dev, NULL); + + return 0; +} + #else /* !CONFIG_SUN4 */ -/* Find all the lance cards on the system and initialize them */ -static int __init sparc_lance_probe(void) +static int __devinit sunlance_sbus_probe(struct of_device *dev, const struct of_device_id *match) { - struct sbus_bus *bus; - struct sbus_dev *sdev = NULL; - struct sbus_dma *ledma = NULL; - static int called; - int cards = 0, v; - - root_lance_dev = NULL; - - if (called) - return -ENODEV; - called++; - - for_each_sbus (bus) { - for_each_sbusdev (sdev, bus) { - if (strcmp(sdev->prom_name, "le") == 0) { - cards++; - if ((v = sparc_lance_init(sdev, NULL, NULL))) - return v; - continue; - } - if (strcmp(sdev->prom_name, "ledma") == 0) { - cards++; - ledma = find_ledma(sdev); - if ((v = sparc_lance_init(sdev->child, - ledma, NULL))) - return v; - continue; - } - if (strcmp(sdev->prom_name, "lebuffer") == 0){ - cards++; - if ((v = sparc_lance_init(sdev->child, - NULL, sdev))) - return v; - continue; - } - } /* for each sbusdev */ - } /* for each sbus */ - if (!cards) - return -ENODEV; - return 0; + struct sbus_dev *sdev = to_sbus_device(&dev->dev); + int err; + + if (sdev->parent) { + struct of_device *parent = &sdev->parent->ofdev; + + if (!strcmp(parent->node->name, "ledma")) { + struct sbus_dma *ledma = find_ledma(to_sbus_device(&parent->dev)); + + err = sparc_lance_probe_one(sdev, ledma, NULL); + } else if (!strcmp(parent->node->name, "lebuffer")) { + err = sparc_lance_probe_one(sdev, NULL, to_sbus_device(&parent->dev)); + } else + err = sparc_lance_probe_one(sdev, NULL, NULL); + } else + err = sparc_lance_probe_one(sdev, NULL, NULL); + + return err; } -#endif /* !CONFIG_SUN4 */ -static void __exit sparc_lance_cleanup(void) +static int __devexit sunlance_sbus_remove(struct of_device *dev) { - struct lance_private *lp; + struct lance_private *lp = dev_get_drvdata(&dev->dev); + struct net_device *net_dev = lp->dev; - while (root_lance_dev) { - lp = root_lance_dev->next_module; + unregister_netdevice(net_dev); - unregister_netdev(root_lance_dev->dev); - lance_free_hwresources(root_lance_dev); - free_netdev(root_lance_dev->dev); - root_lance_dev = lp; - } + lance_free_hwresources(lp); + + free_netdev(net_dev); + + dev_set_drvdata(&dev->dev, NULL); + + return 0; +} + +static struct of_device_id sunlance_sbus_match[] = { + { + .name = "le", + }, + {}, +}; + +MODULE_DEVICE_TABLE(of, sunlance_sbus_match); + +static struct of_platform_driver sunlance_sbus_driver = { + .name = "sunlance", + .match_table = sunlance_sbus_match, + .probe = sunlance_sbus_probe, + .remove = __devexit_p(sunlance_sbus_remove), +}; + + +/* Find all the lance cards on the system and initialize them */ +static int __init sparc_lance_init(void) +{ + return of_register_driver(&sunlance_sbus_driver, &sbus_bus_type); +} +#endif /* !CONFIG_SUN4 */ + +static void __exit sparc_lance_exit(void) +{ +#ifdef CONFIG_SUN4 + sunlance_sun4_remove(); +#else + of_unregister_driver(&sunlance_sbus_driver); +#endif } -module_init(sparc_lance_probe); -module_exit(sparc_lance_cleanup); +module_init(sparc_lance_init); +module_exit(sparc_lance_exit); diff --git a/drivers/net/sunqe.c b/drivers/net/sunqe.c index 1f2323be6..817a40b66 100644 --- a/drivers/net/sunqe.c +++ b/drivers/net/sunqe.c @@ -1,10 +1,9 @@ -/* $Id: sunqe.c,v 1.55 2002/01/15 06:48:55 davem Exp $ - * sunqe.c: Sparc QuadEthernet 10baseT SBUS card driver. +/* sunqe.c: Sparc QuadEthernet 10baseT SBUS card driver. * Once again I am out to prove that every ethernet * controller out there can be most efficiently programmed * if you make it look like a LANCE. * - * Copyright (C) 1996, 1999, 2003 David S. Miller (davem@redhat.com) + * Copyright (C) 1996, 1999, 2003, 2006 David S. Miller (davem@davemloft.net) */ #include @@ -41,9 +40,9 @@ #include "sunqe.h" #define DRV_NAME "sunqe" -#define DRV_VERSION "3.0" -#define DRV_RELDATE "8/24/03" -#define DRV_AUTHOR "David S. Miller (davem@redhat.com)" +#define DRV_VERSION "4.0" +#define DRV_RELDATE "June 23, 2006" +#define DRV_AUTHOR "David S. Miller (davem@davemloft.net)" static char version[] = DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE " " DRV_AUTHOR "\n"; @@ -755,298 +754,269 @@ static inline void qec_init_once(struct sunqec *qecp, struct sbus_dev *qsdev) qecp->gregs + GLOB_RSIZE); } -/* Four QE's per QEC card. */ -static int __init qec_ether_init(struct net_device *dev, struct sbus_dev *sdev) +static u8 __init qec_get_burst(struct device_node *dp) { - static unsigned version_printed; - struct net_device *qe_devs[4]; - struct sunqe *qeps[4]; - struct sbus_dev *qesdevs[4]; - struct sbus_dev *child; - struct sunqec *qecp = NULL; u8 bsizes, bsizes_more; - int i, j, res = -ENOMEM; - for (i = 0; i < 4; i++) { - qe_devs[i] = alloc_etherdev(sizeof(struct sunqe)); - if (!qe_devs[i]) - goto out; - } + /* Find and set the burst sizes for the QEC, since it + * does the actual dma for all 4 channels. + */ + bsizes = of_getintprop_default(dp, "burst-sizes", 0xff); + bsizes &= 0xff; + bsizes_more = of_getintprop_default(dp->parent, "burst-sizes", 0xff); - if (version_printed++ == 0) - printk(KERN_INFO "%s", version); + if (bsizes_more != 0xff) + bsizes &= bsizes_more; + if (bsizes == 0xff || (bsizes & DMA_BURST16) == 0 || + (bsizes & DMA_BURST32)==0) + bsizes = (DMA_BURST32 - 1); - for (i = 0; i < 4; i++) { - qeps[i] = (struct sunqe *) qe_devs[i]->priv; - for (j = 0; j < 6; j++) - qe_devs[i]->dev_addr[j] = idprom->id_ethaddr[j]; - qeps[i]->channel = i; - spin_lock_init(&qeps[i]->lock); - } + return bsizes; +} - qecp = kmalloc(sizeof(struct sunqec), GFP_KERNEL); - if (qecp == NULL) - goto out1; - qecp->qec_sdev = sdev; +static struct sunqec * __init get_qec(struct sbus_dev *child_sdev) +{ + struct sbus_dev *qec_sdev = child_sdev->parent; + struct sunqec *qecp; - for (i = 0; i < 4; i++) { - qecp->qes[i] = qeps[i]; - qeps[i]->dev = qe_devs[i]; - qeps[i]->parent = qecp; + for (qecp = root_qec_dev; qecp; qecp = qecp->next_module) { + if (qecp->qec_sdev == qec_sdev) + break; } + if (!qecp) { + qecp = kzalloc(sizeof(struct sunqec), GFP_KERNEL); + if (qecp) { + u32 ctrl; + + qecp->qec_sdev = qec_sdev; + qecp->gregs = sbus_ioremap(&qec_sdev->resource[0], 0, + GLOB_REG_SIZE, + "QEC Global Registers"); + if (!qecp->gregs) + goto fail; + + /* Make sure the QEC is in MACE mode. */ + ctrl = sbus_readl(qecp->gregs + GLOB_CTRL); + ctrl &= 0xf0000000; + if (ctrl != GLOB_CTRL_MMODE) { + printk(KERN_ERR "qec: Not in MACE mode!\n"); + goto fail; + } - res = -ENODEV; + if (qec_global_reset(qecp->gregs)) + goto fail; - for (i = 0, child = sdev->child; i < 4; i++, child = child->next) { - /* Link in channel */ - j = prom_getintdefault(child->prom_node, "channel#", -1); - if (j == -1) - goto out2; - qesdevs[j] = child; - } + qecp->qec_bursts = qec_get_burst(qec_sdev->ofdev.node); - for (i = 0; i < 4; i++) - qeps[i]->qe_sdev = qesdevs[i]; + qec_init_once(qecp, qec_sdev); - /* Now map in the registers, QEC globals first. */ - qecp->gregs = sbus_ioremap(&sdev->resource[0], 0, - GLOB_REG_SIZE, "QEC Global Registers"); - if (!qecp->gregs) { - printk(KERN_ERR "QuadEther: Cannot map QEC global registers.\n"); - goto out2; - } + if (request_irq(qec_sdev->irqs[0], &qec_interrupt, + IRQF_SHARED, "qec", (void *) qecp)) { + printk(KERN_ERR "qec: Can't register irq.\n"); + goto fail; + } - /* Make sure the QEC is in MACE mode. */ - if ((sbus_readl(qecp->gregs + GLOB_CTRL) & 0xf0000000) != GLOB_CTRL_MMODE) { - printk(KERN_ERR "QuadEther: AIEEE, QEC is not in MACE mode!\n"); - goto out3; + qecp->next_module = root_qec_dev; + root_qec_dev = qecp; + } } - /* Reset the QEC. */ - if (qec_global_reset(qecp->gregs)) - goto out3; + return qecp; - /* Find and set the burst sizes for the QEC, since it does - * the actual dma for all 4 channels. - */ - bsizes = prom_getintdefault(sdev->prom_node, "burst-sizes", 0xff); - bsizes &= 0xff; - bsizes_more = prom_getintdefault(sdev->bus->prom_node, "burst-sizes", 0xff); +fail: + if (qecp->gregs) + sbus_iounmap(qecp->gregs, GLOB_REG_SIZE); + kfree(qecp); + return NULL; +} - if (bsizes_more != 0xff) - bsizes &= bsizes_more; - if (bsizes == 0xff || (bsizes & DMA_BURST16) == 0 || - (bsizes & DMA_BURST32)==0) - bsizes = (DMA_BURST32 - 1); +static int __init qec_ether_init(struct sbus_dev *sdev) +{ + static unsigned version_printed; + struct net_device *dev; + struct sunqe *qe; + struct sunqec *qecp; + int i, res; - qecp->qec_bursts = bsizes; + if (version_printed++ == 0) + printk(KERN_INFO "%s", version); - /* Perform one time QEC initialization, we never touch the QEC - * globals again after this. - */ - qec_init_once(qecp, sdev); - - for (i = 0; i < 4; i++) { - struct sunqe *qe = qeps[i]; - /* Map in QEC per-channel control registers. */ - qe->qcregs = sbus_ioremap(&qe->qe_sdev->resource[0], 0, - CREG_REG_SIZE, "QEC Channel Registers"); - if (!qe->qcregs) { - printk(KERN_ERR "QuadEther: Cannot map QE %d's channel registers.\n", i); - goto out4; - } + dev = alloc_etherdev(sizeof(struct sunqe)); + if (!dev) + return -ENOMEM; - /* Map in per-channel AMD MACE registers. */ - qe->mregs = sbus_ioremap(&qe->qe_sdev->resource[1], 0, - MREGS_REG_SIZE, "QE MACE Registers"); - if (!qe->mregs) { - printk(KERN_ERR "QuadEther: Cannot map QE %d's MACE registers.\n", i); - goto out4; - } + qe = netdev_priv(dev); - qe->qe_block = sbus_alloc_consistent(qe->qe_sdev, - PAGE_SIZE, - &qe->qblock_dvma); - qe->buffers = sbus_alloc_consistent(qe->qe_sdev, - sizeof(struct sunqe_buffers), - &qe->buffers_dvma); - if (qe->qe_block == NULL || qe->qblock_dvma == 0 || - qe->buffers == NULL || qe->buffers_dvma == 0) { - goto out4; + i = of_getintprop_default(sdev->ofdev.node, "channel#", -1); + if (i == -1) { + struct sbus_dev *td = sdev->parent->child; + i = 0; + while (td != sdev) { + td = td->next; + i++; } - - /* Stop this QE. */ - qe_stop(qe); } + qe->channel = i; + spin_lock_init(&qe->lock); + + res = -ENODEV; + qecp = get_qec(sdev); + if (!qecp) + goto fail; - for (i = 0; i < 4; i++) { - SET_MODULE_OWNER(qe_devs[i]); - qe_devs[i]->open = qe_open; - qe_devs[i]->stop = qe_close; - qe_devs[i]->hard_start_xmit = qe_start_xmit; - qe_devs[i]->get_stats = qe_get_stats; - qe_devs[i]->set_multicast_list = qe_set_multicast; - qe_devs[i]->tx_timeout = qe_tx_timeout; - qe_devs[i]->watchdog_timeo = 5*HZ; - qe_devs[i]->irq = sdev->irqs[0]; - qe_devs[i]->dma = 0; - qe_devs[i]->ethtool_ops = &qe_ethtool_ops; - } + qecp->qes[qe->channel] = qe; + qe->dev = dev; + qe->parent = qecp; + qe->qe_sdev = sdev; - /* QEC receives interrupts from each QE, then it sends the actual - * IRQ to the cpu itself. Since QEC is the single point of - * interrupt for all QE channels we register the IRQ handler - * for it now. - */ - if (request_irq(sdev->irqs[0], &qec_interrupt, - SA_SHIRQ, "QuadEther", (void *) qecp)) { - printk(KERN_ERR "QuadEther: Can't register QEC master irq handler.\n"); - res = -EAGAIN; - goto out4; + res = -ENOMEM; + qe->qcregs = sbus_ioremap(&qe->qe_sdev->resource[0], 0, + CREG_REG_SIZE, "QEC Channel Registers"); + if (!qe->qcregs) { + printk(KERN_ERR "qe: Cannot map channel registers.\n"); + goto fail; } - for (i = 0; i < 4; i++) { - if (register_netdev(qe_devs[i]) != 0) - goto out5; + qe->mregs = sbus_ioremap(&qe->qe_sdev->resource[1], 0, + MREGS_REG_SIZE, "QE MACE Registers"); + if (!qe->mregs) { + printk(KERN_ERR "qe: Cannot map MACE registers.\n"); + goto fail; } - /* Report the QE channels. */ - for (i = 0; i < 4; i++) { - printk(KERN_INFO "%s: QuadEthernet channel[%d] ", qe_devs[i]->name, i); - for (j = 0; j < 6; j++) - printk ("%2.2x%c", - qe_devs[i]->dev_addr[j], - j == 5 ? ' ': ':'); - printk("\n"); - } + qe->qe_block = sbus_alloc_consistent(qe->qe_sdev, + PAGE_SIZE, + &qe->qblock_dvma); + qe->buffers = sbus_alloc_consistent(qe->qe_sdev, + sizeof(struct sunqe_buffers), + &qe->buffers_dvma); + if (qe->qe_block == NULL || qe->qblock_dvma == 0 || + qe->buffers == NULL || qe->buffers_dvma == 0) + goto fail; + + /* Stop this QE. */ + qe_stop(qe); + + SET_MODULE_OWNER(dev); + SET_NETDEV_DEV(dev, &sdev->ofdev.dev); + + dev->open = qe_open; + dev->stop = qe_close; + dev->hard_start_xmit = qe_start_xmit; + dev->get_stats = qe_get_stats; + dev->set_multicast_list = qe_set_multicast; + dev->tx_timeout = qe_tx_timeout; + dev->watchdog_timeo = 5*HZ; + dev->irq = sdev->irqs[0]; + dev->dma = 0; + dev->ethtool_ops = &qe_ethtool_ops; + + res = register_netdev(dev); + if (res) + goto fail; + + dev_set_drvdata(&sdev->ofdev.dev, qe); + + printk(KERN_INFO "%s: qe channel[%d] ", dev->name, qe->channel); + for (i = 0; i < 6; i++) + printk ("%2.2x%c", + dev->dev_addr[i], + i == 5 ? ' ': ':'); + printk("\n"); - /* We are home free at this point, link the qe's into - * the master list for later driver exit. - */ - qecp->next_module = root_qec_dev; - root_qec_dev = qecp; return 0; -out5: - while (i--) - unregister_netdev(qe_devs[i]); - free_irq(sdev->irqs[0], (void *)qecp); -out4: - for (i = 0; i < 4; i++) { - struct sunqe *qe = (struct sunqe *)qe_devs[i]->priv; - - if (qe->qcregs) - sbus_iounmap(qe->qcregs, CREG_REG_SIZE); - if (qe->mregs) - sbus_iounmap(qe->mregs, MREGS_REG_SIZE); - if (qe->qe_block) - sbus_free_consistent(qe->qe_sdev, - PAGE_SIZE, - qe->qe_block, - qe->qblock_dvma); - if (qe->buffers) - sbus_free_consistent(qe->qe_sdev, - sizeof(struct sunqe_buffers), - qe->buffers, - qe->buffers_dvma); - } -out3: - sbus_iounmap(qecp->gregs, GLOB_REG_SIZE); -out2: - kfree(qecp); -out1: - i = 4; -out: - while (i--) - free_netdev(qe_devs[i]); +fail: + if (qe->qcregs) + sbus_iounmap(qe->qcregs, CREG_REG_SIZE); + if (qe->mregs) + sbus_iounmap(qe->mregs, MREGS_REG_SIZE); + if (qe->qe_block) + sbus_free_consistent(qe->qe_sdev, + PAGE_SIZE, + qe->qe_block, + qe->qblock_dvma); + if (qe->buffers) + sbus_free_consistent(qe->qe_sdev, + sizeof(struct sunqe_buffers), + qe->buffers, + qe->buffers_dvma); + + free_netdev(dev); + return res; } -static int __init qec_match(struct sbus_dev *sdev) +static int __devinit qec_sbus_probe(struct of_device *dev, const struct of_device_id *match) { - struct sbus_dev *sibling; - int i; - - if (strcmp(sdev->prom_name, "qec") != 0) - return 0; + struct sbus_dev *sdev = to_sbus_device(&dev->dev); - /* QEC can be parent of either QuadEthernet or BigMAC - * children. Do not confuse this with qfe/SUNW,qfe - * which is a quad-happymeal card and handled by - * a different driver. - */ - sibling = sdev->child; - for (i = 0; i < 4; i++) { - if (sibling == NULL) - return 0; - if (strcmp(sibling->prom_name, "qe") != 0) - return 0; - sibling = sibling->next; - } - return 1; + return qec_ether_init(sdev); } -static int __init qec_probe(void) +static int __devexit qec_sbus_remove(struct of_device *dev) { - struct net_device *dev = NULL; - struct sbus_bus *bus; - struct sbus_dev *sdev = NULL; - static int called; - int cards = 0, v; - - root_qec_dev = NULL; - - if (called) - return -ENODEV; - called++; - - for_each_sbus(bus) { - for_each_sbusdev(sdev, bus) { - if (cards) - dev = NULL; - - if (qec_match(sdev)) { - cards++; - if ((v = qec_ether_init(dev, sdev))) - return v; - } - } - } - if (!cards) - return -ENODEV; + struct sunqe *qp = dev_get_drvdata(&dev->dev); + struct net_device *net_dev = qp->dev; + + unregister_netdevice(net_dev); + + sbus_iounmap(qp->qcregs, CREG_REG_SIZE); + sbus_iounmap(qp->mregs, MREGS_REG_SIZE); + sbus_free_consistent(qp->qe_sdev, + PAGE_SIZE, + qp->qe_block, + qp->qblock_dvma); + sbus_free_consistent(qp->qe_sdev, + sizeof(struct sunqe_buffers), + qp->buffers, + qp->buffers_dvma); + + free_netdev(net_dev); + + dev_set_drvdata(&dev->dev, NULL); + return 0; } -static void __exit qec_cleanup(void) +static struct of_device_id qec_sbus_match[] = { + { + .name = "qe", + }, + {}, +}; + +MODULE_DEVICE_TABLE(of, qec_sbus_match); + +static struct of_platform_driver qec_sbus_driver = { + .name = "qec", + .match_table = qec_sbus_match, + .probe = qec_sbus_probe, + .remove = __devexit_p(qec_sbus_remove), +}; + +static int __init qec_init(void) +{ + return of_register_driver(&qec_sbus_driver, &sbus_bus_type); +} + +static void __exit qec_exit(void) { - struct sunqec *next_qec; - int i; + of_unregister_driver(&qec_sbus_driver); while (root_qec_dev) { - next_qec = root_qec_dev->next_module; - - /* Release all four QE channels, then the QEC itself. */ - for (i = 0; i < 4; i++) { - unregister_netdev(root_qec_dev->qes[i]->dev); - sbus_iounmap(root_qec_dev->qes[i]->qcregs, CREG_REG_SIZE); - sbus_iounmap(root_qec_dev->qes[i]->mregs, MREGS_REG_SIZE); - sbus_free_consistent(root_qec_dev->qes[i]->qe_sdev, - PAGE_SIZE, - root_qec_dev->qes[i]->qe_block, - root_qec_dev->qes[i]->qblock_dvma); - sbus_free_consistent(root_qec_dev->qes[i]->qe_sdev, - sizeof(struct sunqe_buffers), - root_qec_dev->qes[i]->buffers, - root_qec_dev->qes[i]->buffers_dvma); - free_netdev(root_qec_dev->qes[i]->dev); - } - free_irq(root_qec_dev->qec_sdev->irqs[0], (void *)root_qec_dev); + struct sunqec *next = root_qec_dev->next_module; + + free_irq(root_qec_dev->qec_sdev->irqs[0], + (void *) root_qec_dev); sbus_iounmap(root_qec_dev->gregs, GLOB_REG_SIZE); + kfree(root_qec_dev); - root_qec_dev = next_qec; + + root_qec_dev = next; } } -module_init(qec_probe); -module_exit(qec_cleanup); +module_init(qec_init); +module_exit(qec_exit); diff --git a/drivers/net/tc35815.c b/drivers/net/tc35815.c index c2ec9fd8c..8b53ded66 100644 --- a/drivers/net/tc35815.c +++ b/drivers/net/tc35815.c @@ -880,7 +880,7 @@ tc35815_open(struct net_device *dev) */ if (dev->irq == 0 || - request_irq(dev->irq, &tc35815_interrupt, SA_SHIRQ, cardname, dev)) { + request_irq(dev->irq, &tc35815_interrupt, IRQF_SHARED, cardname, dev)) { return -EAGAIN; } diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 09a6b8e6d..eafabb253 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c @@ -15,7 +15,6 @@ * notice is accompanying it. */ -#include #include #include @@ -69,8 +68,8 @@ #define DRV_MODULE_NAME "tg3" #define PFX DRV_MODULE_NAME ": " -#define DRV_MODULE_VERSION "3.59.1" -#define DRV_MODULE_RELDATE "August 25, 2006" +#define DRV_MODULE_VERSION "3.65" +#define DRV_MODULE_RELDATE "August 07, 2006" #define TG3_DEF_MAC_MODE 0 #define TG3_DEF_RX_MODE 0 @@ -124,9 +123,6 @@ TG3_RX_RCB_RING_SIZE(tp)) #define TG3_TX_RING_BYTES (sizeof(struct tg3_tx_buffer_desc) * \ TG3_TX_RING_SIZE) -#define TX_BUFFS_AVAIL(TP) \ - ((TP)->tx_pending - \ - (((TP)->tx_prod - (TP)->tx_cons) & (TG3_TX_RING_SIZE - 1))) #define NEXT_TX(N) (((N) + 1) & (TG3_TX_RING_SIZE - 1)) #define RX_PKT_BUF_SZ (1536 + tp->rx_offset + 64) @@ -229,6 +225,8 @@ static struct pci_device_id tg3_pci_tbl[] = { PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5755M, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, + { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5786, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787M, @@ -2965,6 +2963,34 @@ static int tg3_setup_phy(struct tg3 *tp, int force_reset) return err; } +/* This is called whenever we suspect that the system chipset is re- + * ordering the sequence of MMIO to the tx send mailbox. The symptom + * is bogus tx completions. We try to recover by setting the + * TG3_FLAG_MBOX_WRITE_REORDER flag and resetting the chip later + * in the workqueue. + */ +static void tg3_tx_recover(struct tg3 *tp) +{ + BUG_ON((tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER) || + tp->write32_tx_mbox == tg3_write_indirect_mbox); + + printk(KERN_WARNING PFX "%s: The system may be re-ordering memory-" + "mapped I/O cycles to the network device, attempting to " + "recover. Please report the problem to the driver maintainer " + "and include system chipset information.\n", tp->dev->name); + + spin_lock(&tp->lock); + tp->tg3_flags |= TG3_FLAG_TX_RECOVERY_PENDING; + spin_unlock(&tp->lock); +} + +static inline u32 tg3_tx_avail(struct tg3 *tp) +{ + smp_mb(); + return (tp->tx_pending - + ((tp->tx_prod - tp->tx_cons) & (TG3_TX_RING_SIZE - 1))); +} + /* Tigon3 never reports partial packet sends. So we do not * need special logic to handle SKBs that have not had all * of their frags sent yet, like SunGEM does. @@ -2977,9 +3003,13 @@ static void tg3_tx(struct tg3 *tp) while (sw_idx != hw_idx) { struct tx_ring_info *ri = &tp->tx_buffers[sw_idx]; struct sk_buff *skb = ri->skb; - int i; + int i, tx_bug = 0; + + if (unlikely(skb == NULL)) { + tg3_tx_recover(tp); + return; + } - BUG_ON(skb == NULL); pci_unmap_single(tp->pdev, pci_unmap_addr(ri, mapping), skb_headlen(skb), @@ -2990,10 +3020,9 @@ static void tg3_tx(struct tg3 *tp) sw_idx = NEXT_TX(sw_idx); for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { - BUG_ON(sw_idx == hw_idx); - ri = &tp->tx_buffers[sw_idx]; - BUG_ON(ri->skb != NULL); + if (unlikely(ri->skb != NULL || sw_idx == hw_idx)) + tx_bug = 1; pci_unmap_page(tp->pdev, pci_unmap_addr(ri, mapping), @@ -3004,16 +3033,29 @@ static void tg3_tx(struct tg3 *tp) } dev_kfree_skb(skb); + + if (unlikely(tx_bug)) { + tg3_tx_recover(tp); + return; + } } tp->tx_cons = sw_idx; - if (unlikely(netif_queue_stopped(tp->dev))) { - spin_lock(&tp->tx_lock); + /* Need to make the tx_cons update visible to tg3_start_xmit() + * before checking for netif_queue_stopped(). Without the + * memory barrier, there is a small possibility that tg3_start_xmit() + * will miss it and cause the queue to be stopped forever. + */ + smp_mb(); + + if (unlikely(netif_queue_stopped(tp->dev) && + (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH))) { + netif_tx_lock(tp->dev); if (netif_queue_stopped(tp->dev) && - (TX_BUFFS_AVAIL(tp) > TG3_TX_WAKEUP_THRESH)) + (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH)) netif_wake_queue(tp->dev); - spin_unlock(&tp->tx_lock); + netif_tx_unlock(tp->dev); } } @@ -3067,11 +3109,10 @@ static int tg3_alloc_rx_skb(struct tg3 *tp, u32 opaque_key, * Callers depend upon this behavior and assume that * we leave everything unchanged if we fail. */ - skb = dev_alloc_skb(skb_size); + skb = netdev_alloc_skb(tp->dev, skb_size); if (skb == NULL) return -ENOMEM; - skb->dev = tp->dev; skb_reserve(skb, tp->rx_offset); mapping = pci_map_single(tp->pdev, skb->data, @@ -3164,7 +3205,7 @@ static int tg3_vlan_rx(struct tg3 *tp, struct sk_buff *skb, u16 vlan_tag) */ static int tg3_rx(struct tg3 *tp, int budget) { - u32 work_mask; + u32 work_mask, rx_std_posted = 0; u32 sw_idx = tp->rx_rcb_ptr; u16 hw_idx; int received; @@ -3191,6 +3232,7 @@ static int tg3_rx(struct tg3 *tp, int budget) mapping); skb = tp->rx_std_buffers[desc_idx].skb; post_ptr = &tp->rx_std_ptr; + rx_std_posted++; } else if (opaque_key == RXD_OPAQUE_RING_JUMBO) { dma_addr = pci_unmap_addr(&tp->rx_jumbo_buffers[desc_idx], mapping); @@ -3239,11 +3281,10 @@ static int tg3_rx(struct tg3 *tp, int budget) tg3_recycle_rx(tp, opaque_key, desc_idx, *post_ptr); - copy_skb = dev_alloc_skb(len + 2); + copy_skb = netdev_alloc_skb(tp->dev, len + 2); if (copy_skb == NULL) goto drop_it_no_recycle; - copy_skb->dev = tp->dev; skb_reserve(copy_skb, 2); skb_put(copy_skb, len); pci_dma_sync_single_for_cpu(tp->pdev, dma_addr, len, PCI_DMA_FROMDEVICE); @@ -3278,6 +3319,15 @@ static int tg3_rx(struct tg3 *tp, int budget) next_pkt: (*post_ptr)++; + + if (unlikely(rx_std_posted >= tp->rx_std_max_post)) { + u32 idx = *post_ptr % TG3_RX_RING_SIZE; + + tw32_rx_mbox(MAILBOX_RCV_STD_PROD_IDX + + TG3_64BIT_REG_LOW, idx); + work_mask &= ~RXD_OPAQUE_RING_STD; + rx_std_posted = 0; + } next_pkt_nopost: sw_idx++; sw_idx %= TG3_RX_RCB_RING_SIZE(tp); @@ -3331,6 +3381,11 @@ static int tg3_poll(struct net_device *netdev, int *budget) /* run TX completion thread */ if (sblk->idx[0].tx_consumer != tp->tx_cons) { tg3_tx(tp); + if (unlikely(tp->tg3_flags & TG3_FLAG_TX_RECOVERY_PENDING)) { + netif_rx_complete(netdev); + schedule_work(&tp->reset_task); + return 0; + } } /* run RX thread, within the bounds set by NAPI. @@ -3391,12 +3446,10 @@ static inline void tg3_full_lock(struct tg3 *tp, int irq_sync) if (irq_sync) tg3_irq_quiesce(tp); spin_lock_bh(&tp->lock); - spin_lock(&tp->tx_lock); } static inline void tg3_full_unlock(struct tg3 *tp) { - spin_unlock(&tp->tx_lock); spin_unlock_bh(&tp->lock); } @@ -3547,6 +3600,28 @@ static irqreturn_t tg3_test_isr(int irq, void *dev_id, static int tg3_init_hw(struct tg3 *, int); static int tg3_halt(struct tg3 *, int, int); +/* Restart hardware after configuration changes, self-test, etc. + * Invoked with tp->lock held. + */ +static int tg3_restart_hw(struct tg3 *tp, int reset_phy) +{ + int err; + + err = tg3_init_hw(tp, reset_phy); + if (err) { + printk(KERN_ERR PFX "%s: Failed to re-initialize device, " + "aborting.\n", tp->dev->name); + tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); + tg3_full_unlock(tp); + del_timer_sync(&tp->timer); + tp->irq_sync = 0; + netif_poll_enable(tp->dev); + dev_close(tp->dev); + tg3_full_lock(tp, 0); + } + return err; +} + #ifdef CONFIG_NET_POLL_CONTROLLER static void tg3_poll_controller(struct net_device *dev) { @@ -3579,14 +3654,23 @@ static void tg3_reset_task(void *_data) restart_timer = tp->tg3_flags2 & TG3_FLG2_RESTART_TIMER; tp->tg3_flags2 &= ~TG3_FLG2_RESTART_TIMER; + if (tp->tg3_flags & TG3_FLAG_TX_RECOVERY_PENDING) { + tp->write32_tx_mbox = tg3_write32_tx_mbox; + tp->write32_rx_mbox = tg3_write_flush_reg32; + tp->tg3_flags |= TG3_FLAG_MBOX_WRITE_REORDER; + tp->tg3_flags &= ~TG3_FLAG_TX_RECOVERY_PENDING; + } + tg3_halt(tp, RESET_KIND_SHUTDOWN, 0); - tg3_init_hw(tp, 1); + if (tg3_init_hw(tp, 1)) + goto out; tg3_netif_start(tp); if (restart_timer) mod_timer(&tp->timer, jiffies + 1); +out: tp->tg3_flags &= ~TG3_FLAG_IN_RESET_TASK; tg3_full_unlock(tp); @@ -3718,15 +3802,12 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) len = skb_headlen(skb); - /* No BH disabling for tx_lock here. We are running in BH disabled - * context and TX reclaim runs via tp->poll inside of a software + /* We are running in BH disabled context with netif_tx_lock + * and TX reclaim runs via tp->poll inside of a software * interrupt. Furthermore, IRQ processing runs lockless so we have * no IRQ context deadlocks to worry about either. Rejoice! */ - if (!spin_trylock(&tp->tx_lock)) - return NETDEV_TX_LOCKED; - - if (unlikely(TX_BUFFS_AVAIL(tp) <= (skb_shinfo(skb)->nr_frags + 1))) { + if (unlikely(tg3_tx_avail(tp) <= (skb_shinfo(skb)->nr_frags + 1))) { if (!netif_queue_stopped(dev)) { netif_stop_queue(dev); @@ -3734,7 +3815,6 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) printk(KERN_ERR PFX "%s: BUG! Tx Ring full when " "queue awake!\n", dev->name); } - spin_unlock(&tp->tx_lock); return NETDEV_TX_BUSY; } @@ -3752,18 +3832,24 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) goto out_unlock; } - tcp_opt_len = ((skb->h.th->doff - 5) * 4); - ip_tcp_len = (skb->nh.iph->ihl * 4) + sizeof(struct tcphdr); + if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6) + mss |= (skb_headlen(skb) - ETH_HLEN) << 9; + else { + tcp_opt_len = ((skb->h.th->doff - 5) * 4); + ip_tcp_len = (skb->nh.iph->ihl * 4) + + sizeof(struct tcphdr); + + skb->nh.iph->check = 0; + skb->nh.iph->tot_len = htons(mss + ip_tcp_len + + tcp_opt_len); + mss |= (ip_tcp_len + tcp_opt_len) << 9; + } base_flags |= (TXD_FLAG_CPU_PRE_DMA | TXD_FLAG_CPU_POST_DMA); - skb->nh.iph->check = 0; - skb->nh.iph->tot_len = htons(mss + ip_tcp_len + tcp_opt_len); - skb->h.th->check = 0; - mss |= (ip_tcp_len + tcp_opt_len) << 9; } else if (skb->ip_summed == CHECKSUM_HW) base_flags |= TXD_FLAG_TCPUDP_CSUM; @@ -3817,21 +3903,54 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) tw32_tx_mbox((MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW), entry); tp->tx_prod = entry; - if (TX_BUFFS_AVAIL(tp) <= (MAX_SKB_FRAGS + 1)) { + if (unlikely(tg3_tx_avail(tp) <= (MAX_SKB_FRAGS + 1))) { netif_stop_queue(dev); - if (TX_BUFFS_AVAIL(tp) > TG3_TX_WAKEUP_THRESH) + if (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH) netif_wake_queue(tp->dev); } out_unlock: mmiowb(); - spin_unlock(&tp->tx_lock); dev->trans_start = jiffies; return NETDEV_TX_OK; } +#if TG3_TSO_SUPPORT != 0 +static int tg3_start_xmit_dma_bug(struct sk_buff *, struct net_device *); + +/* Use GSO to workaround a rare TSO bug that may be triggered when the + * TSO header is greater than 80 bytes. + */ +static int tg3_tso_bug(struct tg3 *tp, struct sk_buff *skb) +{ + struct sk_buff *segs, *nskb; + + /* Estimate the number of fragments in the worst case */ + if (unlikely(tg3_tx_avail(tp) <= (skb_shinfo(skb)->gso_segs * 3))) { + netif_stop_queue(tp->dev); + return NETDEV_TX_BUSY; + } + + segs = skb_gso_segment(skb, tp->dev->features & ~NETIF_F_TSO); + if (unlikely(IS_ERR(segs))) + goto tg3_tso_bug_end; + + do { + nskb = segs; + segs = segs->next; + nskb->next = NULL; + tg3_start_xmit_dma_bug(nskb, tp->dev); + } while (segs); + +tg3_tso_bug_end: + dev_kfree_skb(skb); + + return NETDEV_TX_OK; +} +#endif + /* hard_start_xmit for devices that have the 4G bug and/or 40-bit bug and * support TG3_FLG2_HW_TSO_1 or firmware TSO only. */ @@ -3844,15 +3963,12 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) len = skb_headlen(skb); - /* No BH disabling for tx_lock here. We are running in BH disabled - * context and TX reclaim runs via tp->poll inside of a software + /* We are running in BH disabled context with netif_tx_lock + * and TX reclaim runs via tp->poll inside of a software * interrupt. Furthermore, IRQ processing runs lockless so we have * no IRQ context deadlocks to worry about either. Rejoice! */ - if (!spin_trylock(&tp->tx_lock)) - return NETDEV_TX_LOCKED; - - if (unlikely(TX_BUFFS_AVAIL(tp) <= (skb_shinfo(skb)->nr_frags + 1))) { + if (unlikely(tg3_tx_avail(tp) <= (skb_shinfo(skb)->nr_frags + 1))) { if (!netif_queue_stopped(dev)) { netif_stop_queue(dev); @@ -3860,7 +3976,6 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) printk(KERN_ERR PFX "%s: BUG! Tx Ring full when " "queue awake!\n", dev->name); } - spin_unlock(&tp->tx_lock); return NETDEV_TX_BUSY; } @@ -3872,7 +3987,7 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) mss = 0; if (skb->len > (tp->dev->mtu + ETH_HLEN) && (mss = skb_shinfo(skb)->gso_size) != 0) { - int tcp_opt_len, ip_tcp_len; + int tcp_opt_len, ip_tcp_len, hdr_len; if (skb_header_cloned(skb) && pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) { @@ -3883,11 +3998,16 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) tcp_opt_len = ((skb->h.th->doff - 5) * 4); ip_tcp_len = (skb->nh.iph->ihl * 4) + sizeof(struct tcphdr); + hdr_len = ip_tcp_len + tcp_opt_len; + if (unlikely((ETH_HLEN + hdr_len) > 80) && + (tp->tg3_flags2 & TG3_FLG2_HW_TSO_1_BUG)) + return (tg3_tso_bug(tp, skb)); + base_flags |= (TXD_FLAG_CPU_PRE_DMA | TXD_FLAG_CPU_POST_DMA); skb->nh.iph->check = 0; - skb->nh.iph->tot_len = htons(mss + ip_tcp_len + tcp_opt_len); + skb->nh.iph->tot_len = htons(mss + hdr_len); if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) { skb->h.th->check = 0; base_flags &= ~TXD_FLAG_TCPUDP_CSUM; @@ -3998,15 +4118,14 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) tw32_tx_mbox((MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW), entry); tp->tx_prod = entry; - if (TX_BUFFS_AVAIL(tp) <= (MAX_SKB_FRAGS + 1)) { + if (unlikely(tg3_tx_avail(tp) <= (MAX_SKB_FRAGS + 1))) { netif_stop_queue(dev); - if (TX_BUFFS_AVAIL(tp) > TG3_TX_WAKEUP_THRESH) + if (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH) netif_wake_queue(tp->dev); } out_unlock: mmiowb(); - spin_unlock(&tp->tx_lock); dev->trans_start = jiffies; @@ -4035,6 +4154,7 @@ static inline void tg3_set_mtu(struct net_device *dev, struct tg3 *tp, static int tg3_change_mtu(struct net_device *dev, int new_mtu) { struct tg3 *tp = netdev_priv(dev); + int err; if (new_mtu < TG3_MIN_MTU || new_mtu > TG3_MAX_MTU(tp)) return -EINVAL; @@ -4055,13 +4175,14 @@ static int tg3_change_mtu(struct net_device *dev, int new_mtu) tg3_set_mtu(dev, tp, new_mtu); - tg3_init_hw(tp, 0); + err = tg3_restart_hw(tp, 0); - tg3_netif_start(tp); + if (!err) + tg3_netif_start(tp); tg3_full_unlock(tp); - return 0; + return err; } /* Free up pending packets in all rx/tx rings. @@ -4143,7 +4264,7 @@ static void tg3_free_rings(struct tg3 *tp) * end up in the driver. tp->{tx,}lock are held and thus * we may not sleep. */ -static void tg3_init_rings(struct tg3 *tp) +static int tg3_init_rings(struct tg3 *tp) { u32 i; @@ -4192,18 +4313,38 @@ static void tg3_init_rings(struct tg3 *tp) /* Now allocate fresh SKBs for each rx ring. */ for (i = 0; i < tp->rx_pending; i++) { - if (tg3_alloc_rx_skb(tp, RXD_OPAQUE_RING_STD, - -1, i) < 0) + if (tg3_alloc_rx_skb(tp, RXD_OPAQUE_RING_STD, -1, i) < 0) { + printk(KERN_WARNING PFX + "%s: Using a smaller RX standard ring, " + "only %d out of %d buffers were allocated " + "successfully.\n", + tp->dev->name, i, tp->rx_pending); + if (i == 0) + return -ENOMEM; + tp->rx_pending = i; break; + } } if (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE) { for (i = 0; i < tp->rx_jumbo_pending; i++) { if (tg3_alloc_rx_skb(tp, RXD_OPAQUE_RING_JUMBO, - -1, i) < 0) + -1, i) < 0) { + printk(KERN_WARNING PFX + "%s: Using a smaller RX jumbo ring, " + "only %d out of %d buffers were " + "allocated successfully.\n", + tp->dev->name, i, tp->rx_jumbo_pending); + if (i == 0) { + tg3_free_rings(tp); + return -ENOMEM; + } + tp->rx_jumbo_pending = i; break; + } } } + return 0; } /* @@ -5726,6 +5867,7 @@ static int tg3_set_mac_addr(struct net_device *dev, void *p) { struct tg3 *tp = netdev_priv(dev); struct sockaddr *addr = p; + int err = 0; if (!is_valid_ether_addr(addr->sa_data)) return -EINVAL; @@ -5743,9 +5885,9 @@ static int tg3_set_mac_addr(struct net_device *dev, void *p) tg3_full_lock(tp, 1); tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); - tg3_init_hw(tp, 0); - - tg3_netif_start(tp); + err = tg3_restart_hw(tp, 0); + if (!err) + tg3_netif_start(tp); tg3_full_unlock(tp); } else { spin_lock_bh(&tp->lock); @@ -5753,7 +5895,7 @@ static int tg3_set_mac_addr(struct net_device *dev, void *p) spin_unlock_bh(&tp->lock); } - return 0; + return err; } /* tp->lock is held. */ @@ -5853,7 +5995,9 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) * can only do this after the hardware has been * successfully reset. */ - tg3_init_rings(tp); + err = tg3_init_rings(tp); + if (err) + return err; /* This value is determined during the probe time DMA * engine test, tg3_test_dma. @@ -5946,7 +6090,13 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) } /* Setup replenish threshold. */ - tw32(RCVBDI_STD_THRESH, tp->rx_pending / 8); + val = tp->rx_pending / 8; + if (val == 0) + val = 1; + else if (val > tp->rx_std_max_post) + val = tp->rx_std_max_post; + + tw32(RCVBDI_STD_THRESH, val); /* Initialize TG3_BDINFO's at: * RCVDBDI_STD_BD: standard eth size rx ring @@ -6106,8 +6256,12 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) #endif /* Receive/send statistics. */ - if ((rdmac_mode & RDMAC_MODE_FIFO_SIZE_128) && - (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE)) { + if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) { + val = tr32(RCVLPC_STATS_ENABLE); + val &= ~RCVLPC_STATSENAB_DACK_FIX; + tw32(RCVLPC_STATS_ENABLE, val); + } else if ((rdmac_mode & RDMAC_MODE_FIFO_SIZE_128) && + (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE)) { val = tr32(RCVLPC_STATS_ENABLE); val &= ~RCVLPC_STATSENAB_LNGBRST_RFIX; tw32(RCVLPC_STATS_ENABLE, val); @@ -6609,12 +6763,12 @@ static int tg3_request_irq(struct tg3 *tp) fn = tg3_msi; if (tp->tg3_flags2 & TG3_FLG2_1SHOT_MSI) fn = tg3_msi_1shot; - flags = SA_SAMPLE_RANDOM; + flags = IRQF_SAMPLE_RANDOM; } else { fn = tg3_interrupt; if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS) fn = tg3_interrupt_tagged; - flags = SA_SHIRQ | SA_SAMPLE_RANDOM; + flags = IRQF_SHARED | IRQF_SAMPLE_RANDOM; } return (request_irq(tp->pdev->irq, fn, flags, dev->name, dev)); } @@ -6633,7 +6787,7 @@ static int tg3_test_interrupt(struct tg3 *tp) free_irq(tp->pdev->irq, dev); err = request_irq(tp->pdev->irq, tg3_test_isr, - SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev); + IRQF_SHARED | IRQF_SAMPLE_RANDOM, dev->name, dev); if (err) return err; @@ -7794,6 +7948,12 @@ static int tg3_set_tso(struct net_device *dev, u32 value) return -EINVAL; return 0; } + if (tp->tg3_flags2 & TG3_FLG2_HW_TSO_2) { + if (value) + dev->features |= NETIF_F_TSO6; + else + dev->features &= ~NETIF_F_TSO6; + } return ethtool_op_set_tso(dev, value); } #endif @@ -7851,7 +8011,7 @@ static void tg3_get_ringparam(struct net_device *dev, struct ethtool_ringparam * static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ering) { struct tg3 *tp = netdev_priv(dev); - int irq_sync = 0; + int irq_sync = 0, err = 0; if ((ering->rx_pending > TG3_RX_RING_SIZE - 1) || (ering->rx_jumbo_pending > TG3_RX_JUMBO_RING_SIZE - 1) || @@ -7875,13 +8035,14 @@ static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *e if (netif_running(dev)) { tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); - tg3_init_hw(tp, 1); - tg3_netif_start(tp); + err = tg3_restart_hw(tp, 1); + if (!err) + tg3_netif_start(tp); } tg3_full_unlock(tp); - return 0; + return err; } static void tg3_get_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause) @@ -7896,7 +8057,7 @@ static void tg3_get_pauseparam(struct net_device *dev, struct ethtool_pauseparam static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause) { struct tg3 *tp = netdev_priv(dev); - int irq_sync = 0; + int irq_sync = 0, err = 0; if (netif_running(dev)) { tg3_netif_stop(tp); @@ -7920,13 +8081,14 @@ static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam if (netif_running(dev)) { tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); - tg3_init_hw(tp, 1); - tg3_netif_start(tp); + err = tg3_restart_hw(tp, 1); + if (!err) + tg3_netif_start(tp); } tg3_full_unlock(tp); - return 0; + return err; } static u32 tg3_get_rx_csum(struct net_device *dev) @@ -8462,7 +8624,7 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode) err = -EIO; tx_len = 1514; - skb = dev_alloc_skb(tx_len); + skb = netdev_alloc_skb(tp->dev, tx_len); if (!skb) return -ENOMEM; @@ -8561,7 +8723,9 @@ static int tg3_test_loopback(struct tg3 *tp) if (!netif_running(tp->dev)) return TG3_LOOPBACK_FAILED; - tg3_reset_hw(tp, 1); + err = tg3_reset_hw(tp, 1); + if (err) + return TG3_LOOPBACK_FAILED; if (tg3_run_loopback(tp, TG3_MAC_LOOPBACK)) err |= TG3_MAC_LOOPBACK_FAILED; @@ -8635,8 +8799,8 @@ static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest, tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); if (netif_running(dev)) { tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE; - tg3_init_hw(tp, 1); - tg3_netif_start(tp); + if (!tg3_restart_hw(tp, 1)) + tg3_netif_start(tp); } tg3_full_unlock(tp); @@ -8703,6 +8867,9 @@ static void tg3_vlan_rx_register(struct net_device *dev, struct vlan_group *grp) { struct tg3 *tp = netdev_priv(dev); + if (netif_running(dev)) + tg3_netif_stop(tp); + tg3_full_lock(tp, 0); tp->vlgrp = grp; @@ -8711,16 +8878,25 @@ static void tg3_vlan_rx_register(struct net_device *dev, struct vlan_group *grp) __tg3_set_rx_mode(dev); tg3_full_unlock(tp); + + if (netif_running(dev)) + tg3_netif_start(tp); } static void tg3_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) { struct tg3 *tp = netdev_priv(dev); + if (netif_running(dev)) + tg3_netif_stop(tp); + tg3_full_lock(tp, 0); if (tp->vlgrp) tp->vlgrp->vlan_devices[vid] = NULL; tg3_full_unlock(tp); + + if (netif_running(dev)) + tg3_netif_start(tp); } #endif @@ -9961,6 +10137,8 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) static struct pci_device_id write_reorder_chipsets[] = { { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_FE_GATE_700C) }, + { PCI_DEVICE(PCI_VENDOR_ID_AMD, + PCI_DEVICE_ID_AMD_8131_BRIDGE) }, { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8385_0) }, { }, @@ -10125,8 +10303,14 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) { tp->tg3_flags2 |= TG3_FLG2_HW_TSO_2; tp->tg3_flags2 |= TG3_FLG2_1SHOT_MSI; - } else - tp->tg3_flags2 |= TG3_FLG2_HW_TSO_1; + } else { + tp->tg3_flags2 |= TG3_FLG2_HW_TSO_1 | + TG3_FLG2_HW_TSO_1_BUG; + if (GET_ASIC_REV(tp->pci_chip_rev_id) == + ASIC_REV_5750 && + tp->pci_chip_rev_id >= CHIPREV_ID_5750_C2) + tp->tg3_flags2 &= ~TG3_FLG2_HW_TSO_1_BUG; + } } if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705 && @@ -10498,6 +10682,16 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) (tp->tg3_flags & TG3_FLAG_PCIX_MODE) != 0) tp->rx_offset = 0; + tp->rx_std_max_post = TG3_RX_RING_SIZE; + + /* Increment the rx prod index on the rx std ring by at most + * 8 for these chips to workaround hw errata. + */ + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750 || + GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752 || + GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755) + tp->rx_std_max_post = 8; + /* By default, disable wake-on-lan. User can change this * using ETHTOOL_SWOL. */ @@ -10514,11 +10708,13 @@ static int __devinit tg3_get_macaddr_sparc(struct tg3 *tp) struct pcidev_cookie *pcp = pdev->sysdata; if (pcp != NULL) { - int node = pcp->prom_node; + unsigned char *addr; + int len; - if (prom_getproplen(node, "local-mac-address") == 6) { - prom_getproperty(node, "local-mac-address", - dev->dev_addr, 6); + addr = of_get_property(pcp->prom_node, "local-mac-address", + &len); + if (addr && len == 6) { + memcpy(dev->dev_addr, addr, 6); memcpy(dev->perm_addr, dev->dev_addr, 6); return 0; } @@ -11243,7 +11439,6 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, SET_MODULE_OWNER(dev); SET_NETDEV_DEV(dev, &pdev->dev); - dev->features |= NETIF_F_LLTX; #if TG3_VLAN_TAG_USED dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; dev->vlan_rx_register = tg3_vlan_rx_register; @@ -11285,7 +11480,6 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, tp->grc_mode |= GRC_MODE_BSWAP_NONFRM_DATA; #endif spin_lock_init(&tp->lock); - spin_lock_init(&tp->tx_lock); spin_lock_init(&tp->indirect_lock); INIT_WORK(&tp->reset_task, tg3_reset_task, tp); @@ -11381,16 +11575,15 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE; } - /* TSO is on by default on chips that support HW_TSO_2. - * Some HW_TSO_1 capable chips have bugs that can lead to - * tx timeouts in some cases when TSO is enabled. + /* TSO is on by default on chips that support hardware TSO. * Firmware TSO on older chips gives lower performance, so it * is off by default, but can be enabled using ethtool. */ - if ((tp->tg3_flags2 & TG3_FLG2_HW_TSO_2) || - (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750 && - tp->pci_chip_rev_id >= CHIPREV_ID_5750_C2)) + if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) { dev->features |= NETIF_F_TSO; + if (tp->tg3_flags2 & TG3_FLG2_HW_TSO_2) + dev->features |= NETIF_F_TSO6; + } #endif @@ -11564,7 +11757,8 @@ static int tg3_suspend(struct pci_dev *pdev, pm_message_t state) tg3_full_lock(tp, 0); tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE; - tg3_init_hw(tp, 1); + if (tg3_restart_hw(tp, 1)) + goto out; tp->timer.expires = jiffies + tp->timer_offset; add_timer(&tp->timer); @@ -11572,6 +11766,7 @@ static int tg3_suspend(struct pci_dev *pdev, pm_message_t state) netif_device_attach(dev); tg3_netif_start(tp); +out: tg3_full_unlock(tp); } @@ -11598,16 +11793,19 @@ static int tg3_resume(struct pci_dev *pdev) tg3_full_lock(tp, 0); tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE; - tg3_init_hw(tp, 1); + err = tg3_restart_hw(tp, 1); + if (err) + goto out; tp->timer.expires = jiffies + tp->timer_offset; add_timer(&tp->timer); tg3_netif_start(tp); +out: tg3_full_unlock(tp); - return 0; + return err; } static struct pci_driver tg3_driver = { diff --git a/drivers/net/tg3.h b/drivers/net/tg3.h index cd68f4688..3ecf356cf 100644 --- a/drivers/net/tg3.h +++ b/drivers/net/tg3.h @@ -761,6 +761,7 @@ #define RCVLPC_STATSCTRL_ENABLE 0x00000001 #define RCVLPC_STATSCTRL_FASTUPD 0x00000002 #define RCVLPC_STATS_ENABLE 0x00002018 +#define RCVLPC_STATSENAB_DACK_FIX 0x00040000 #define RCVLPC_STATSENAB_LNGBRST_RFIX 0x00400000 #define RCVLPC_STATS_INCMASK 0x0000201c /* 0x2020 --> 0x2100 unused */ @@ -2075,12 +2076,22 @@ struct tg3 { /* SMP locking strategy: * - * lock: Held during all operations except TX packet - * processing. + * lock: Held during reset, PHY access, timer, and when + * updating tg3_flags and tg3_flags2. * - * tx_lock: Held during tg3_start_xmit and tg3_tx + * netif_tx_lock: Held during tg3_start_xmit. tg3_tx holds + * netif_tx_lock when it needs to call + * netif_wake_queue. * * Both of these locks are to be held with BH safety. + * + * Because the IRQ handler, tg3_poll, and tg3_start_xmit + * are running lockless, it is necessary to completely + * quiesce the chip with tg3_netif_stop and tg3_full_lock + * before reconfiguring the device. + * + * indirect_lock: Held when accessing registers indirectly + * with IRQ disabling. */ spinlock_t lock; spinlock_t indirect_lock; @@ -2107,8 +2118,6 @@ struct tg3 { u32 tx_cons; u32 tx_pending; - spinlock_t tx_lock; - struct tg3_tx_buffer_desc *tx_ring; struct tx_ring_info *tx_buffers; dma_addr_t tx_desc_mapping; @@ -2128,6 +2137,7 @@ struct tg3 { struct tg3_rx_buffer_desc *rx_std; struct ring_info *rx_std_buffers; dma_addr_t rx_std_mapping; + u32 rx_std_max_post; struct tg3_rx_buffer_desc *rx_jumbo; struct ring_info *rx_jumbo_buffers; @@ -2156,11 +2166,7 @@ struct tg3 { #define TG3_FLAG_ENABLE_ASF 0x00000020 #define TG3_FLAG_5701_REG_WRITE_BUG 0x00000040 #define TG3_FLAG_POLL_SERDES 0x00000080 -#if defined(CONFIG_X86) #define TG3_FLAG_MBOX_WRITE_REORDER 0x00000100 -#else -#define TG3_FLAG_MBOX_WRITE_REORDER 0 /* disables code too */ -#endif #define TG3_FLAG_PCIX_TARGET_HWBUG 0x00000200 #define TG3_FLAG_WOL_SPEED_100MB 0x00000400 #define TG3_FLAG_WOL_ENABLE 0x00000800 @@ -2173,6 +2179,7 @@ struct tg3 { #define TG3_FLAG_PCI_HIGH_SPEED 0x00040000 #define TG3_FLAG_PCI_32BIT 0x00080000 #define TG3_FLAG_SRAM_USE_CONFIG 0x00100000 +#define TG3_FLAG_TX_RECOVERY_PENDING 0x00200000 #define TG3_FLAG_SERDES_WOL_CAP 0x00400000 #define TG3_FLAG_JUMBO_RING_ENABLE 0x00800000 #define TG3_FLAG_10_100_ONLY 0x01000000 @@ -2185,7 +2192,7 @@ struct tg3 { #define TG3_FLAG_INIT_COMPLETE 0x80000000 u32 tg3_flags2; #define TG3_FLG2_RESTART_TIMER 0x00000001 -/* 0x00000002 available */ +#define TG3_FLG2_HW_TSO_1_BUG 0x00000002 #define TG3_FLG2_NO_ETH_WIRE_SPEED 0x00000004 #define TG3_FLG2_IS_5788 0x00000008 #define TG3_FLG2_MAX_RXPEND_64 0x00000010 diff --git a/drivers/net/tlan.c b/drivers/net/tlan.c index 12076f8f9..23c0017f2 100644 --- a/drivers/net/tlan.c +++ b/drivers/net/tlan.c @@ -943,7 +943,7 @@ static int TLan_Open( struct net_device *dev ) int err; priv->tlanRev = TLan_DioRead8( dev->base_addr, TLAN_DEF_REVISION ); - err = request_irq( dev->irq, TLan_HandleInterrupt, SA_SHIRQ, TLanSignature, dev ); + err = request_irq( dev->irq, TLan_HandleInterrupt, IRQF_SHARED, TLanSignature, dev ); if ( err ) { printk(KERN_ERR "TLAN: Cannot open %s because IRQ %d is already in use.\n", dev->name, dev->irq ); diff --git a/drivers/net/tokenring/3c359.c b/drivers/net/tokenring/3c359.c index 41e0cd8f4..465921e38 100644 --- a/drivers/net/tokenring/3c359.c +++ b/drivers/net/tokenring/3c359.c @@ -42,7 +42,6 @@ #define XL_DEBUG 0 -#include #include #include #include @@ -577,7 +576,7 @@ static int xl_open(struct net_device *dev) u16 switchsettings, switchsettings_eeprom ; - if(request_irq(dev->irq, &xl_interrupt, SA_SHIRQ , "3c359", dev)) { + if(request_irq(dev->irq, &xl_interrupt, IRQF_SHARED , "3c359", dev)) { return -EAGAIN; } diff --git a/drivers/net/tokenring/abyss.c b/drivers/net/tokenring/abyss.c index 649d8ea35..1bdd3beef 100644 --- a/drivers/net/tokenring/abyss.c +++ b/drivers/net/tokenring/abyss.c @@ -123,7 +123,7 @@ static int __devinit abyss_attach(struct pci_dev *pdev, const struct pci_device_ goto err_out_trdev; } - ret = request_irq(pdev->irq, tms380tr_interrupt, SA_SHIRQ, + ret = request_irq(pdev->irq, tms380tr_interrupt, IRQF_SHARED, dev->name, dev); if (ret) goto err_out_region; diff --git a/drivers/net/tokenring/ibmtr.c b/drivers/net/tokenring/ibmtr.c index 5cffb1765..84f943e21 100644 --- a/drivers/net/tokenring/ibmtr.c +++ b/drivers/net/tokenring/ibmtr.c @@ -140,7 +140,7 @@ in the event that chatty debug messages are desired - jjs 12/30/98 */ /* version and credits */ #ifndef PCMCIA -static char version[] __initdata = +static char version[] __devinitdata = "\nibmtr.c: v1.3.57 8/ 7/94 Peter De Schrijver and Mark Swanson\n" " v2.1.125 10/20/98 Paul Norton \n" " v2.2.0 12/30/98 Joel Sloan \n" @@ -216,7 +216,7 @@ static int __devinitdata turbo_irq[IBMTR_MAX_ADAPTERS] = {0}; static int __devinitdata turbo_searched = 0; #ifndef PCMCIA -static __u32 ibmtr_mem_base __initdata = 0xd0000; +static __u32 ibmtr_mem_base __devinitdata = 0xd0000; #endif static void __devinit PrtChanID(char *pcid, short stride) diff --git a/drivers/net/tokenring/lanstreamer.c b/drivers/net/tokenring/lanstreamer.c index c58a4c31d..28d968ffd 100644 --- a/drivers/net/tokenring/lanstreamer.c +++ b/drivers/net/tokenring/lanstreamer.c @@ -100,7 +100,6 @@ #define STREAMER_IOCTL 0 -#include #include #include #include @@ -602,7 +601,7 @@ static int streamer_open(struct net_device *dev) rc=streamer_reset(dev); } - if (request_irq(dev->irq, &streamer_interrupt, SA_SHIRQ, "lanstreamer", dev)) { + if (request_irq(dev->irq, &streamer_interrupt, IRQF_SHARED, "lanstreamer", dev)) { return -EAGAIN; } #if STREAMER_DEBUG diff --git a/drivers/net/tokenring/madgemc.c b/drivers/net/tokenring/madgemc.c index 19e6f4dfd..666bbaaae 100644 --- a/drivers/net/tokenring/madgemc.c +++ b/drivers/net/tokenring/madgemc.c @@ -311,7 +311,7 @@ static int __devinit madgemc_probe(struct device *device) */ outb(0, dev->base_addr + MC_CONTROL_REG0); /* sanity */ madgemc_setsifsel(dev, 1); - if (request_irq(dev->irq, madgemc_interrupt, SA_SHIRQ, + if (request_irq(dev->irq, madgemc_interrupt, IRQF_SHARED, "madgemc", dev)) { ret = -EBUSY; goto getout3; diff --git a/drivers/net/tokenring/olympic.c b/drivers/net/tokenring/olympic.c index 23032a7bc..85831484b 100644 --- a/drivers/net/tokenring/olympic.c +++ b/drivers/net/tokenring/olympic.c @@ -80,7 +80,6 @@ #define OLYMPIC_DEBUG 0 -#include #include #include #include @@ -217,7 +216,7 @@ static int __devinit olympic_probe(struct pci_dev *pdev, const struct pci_device dev = alloc_trdev(sizeof(struct olympic_private)) ; if (!dev) { i = -ENOMEM; - goto op_free_dev; + goto op_release_dev; } olympic_priv = dev->priv ; @@ -282,8 +281,8 @@ op_free_iomap: if (olympic_priv->olympic_lap) iounmap(olympic_priv->olympic_lap); -op_free_dev: free_netdev(dev); +op_release_dev: pci_release_regions(pdev); op_disable_dev: @@ -446,7 +445,7 @@ static int olympic_open(struct net_device *dev) olympic_init(dev); - if(request_irq(dev->irq, &olympic_interrupt, SA_SHIRQ , "olympic", dev)) { + if(request_irq(dev->irq, &olympic_interrupt, IRQF_SHARED , "olympic", dev)) { return -EAGAIN; } diff --git a/drivers/net/tokenring/smctr.c b/drivers/net/tokenring/smctr.c index 67d2b596c..85a7f797d 100644 --- a/drivers/net/tokenring/smctr.c +++ b/drivers/net/tokenring/smctr.c @@ -29,7 +29,6 @@ */ #include -#include #include #include #include @@ -532,7 +531,7 @@ static int __init smctr_chk_mca(struct net_device *dev) dev->irq = 15; break; } - if (request_irq(dev->irq, smctr_interrupt, SA_SHIRQ, smctr_name, dev)) { + if (request_irq(dev->irq, smctr_interrupt, IRQF_SHARED, smctr_name, dev)) { release_region(dev->base_addr, SMCTR_IO_EXTENT); return -ENODEV; } @@ -1062,7 +1061,7 @@ static int __init smctr_chk_isa(struct net_device *dev) goto out2; } - if (request_irq(dev->irq, smctr_interrupt, SA_SHIRQ, smctr_name, dev)) + if (request_irq(dev->irq, smctr_interrupt, IRQF_SHARED, smctr_name, dev)) goto out2; /* Get 58x Rom Base */ @@ -5667,7 +5666,7 @@ module_param_array(io, int, NULL, 0); module_param_array(irq, int, NULL, 0); module_param(ringspeed, int, 0); -static struct net_device *setup_card(int n) +static struct net_device * __init setup_card(int n) { struct net_device *dev = alloc_trdev(sizeof(struct net_local)); int err; @@ -5697,9 +5696,8 @@ out: free_netdev(dev); return ERR_PTR(err); } - -int init_module(void) +int __init init_module(void) { int i, found = 0; struct net_device *dev; diff --git a/drivers/net/tokenring/smctr_firmware.h b/drivers/net/tokenring/smctr_firmware.h index 48994b043..292e50ddf 100644 --- a/drivers/net/tokenring/smctr_firmware.h +++ b/drivers/net/tokenring/smctr_firmware.h @@ -17,7 +17,6 @@ * - Jay Schulist */ -#include #if defined(CONFIG_SMCTR) || defined(CONFIG_SMCTR_MODULE) diff --git a/drivers/net/tokenring/tmspci.c b/drivers/net/tokenring/tmspci.c index ab47c0547..7d3e270c4 100644 --- a/drivers/net/tokenring/tmspci.c +++ b/drivers/net/tokenring/tmspci.c @@ -122,7 +122,7 @@ static int __devinit tms_pci_attach(struct pci_dev *pdev, const struct pci_devic goto err_out_trdev; } - ret = request_irq(pdev->irq, tms380tr_interrupt, SA_SHIRQ, + ret = request_irq(pdev->irq, tms380tr_interrupt, IRQF_SHARED, dev->name, dev); if (ret) goto err_out_region; diff --git a/drivers/net/tulip/de2104x.c b/drivers/net/tulip/de2104x.c index e3dd144d3..d05c5aa25 100644 --- a/drivers/net/tulip/de2104x.c +++ b/drivers/net/tulip/de2104x.c @@ -31,7 +31,6 @@ #define DRV_VERSION "0.7" #define DRV_RELDATE "Mar 17, 2004" -#include #include #include #include @@ -227,12 +226,12 @@ enum { SROMC0InfoLeaf = 27, MediaBlockMask = 0x3f, MediaCustomCSRs = (1 << 6), - + /* PCIPM bits */ PM_Sleep = (1 << 31), PM_Snooze = (1 << 30), PM_Mask = PM_Sleep | PM_Snooze, - + /* SIAStatus bits */ NWayState = (1 << 14) | (1 << 13) | (1 << 12), NWayRestart = (1 << 12), @@ -858,7 +857,7 @@ static void de_stop_rxtx (struct de_private *de) return; cpu_relax(); } - + printk(KERN_WARNING "%s: timeout expired stopping DMA\n", de->dev->name); } @@ -931,7 +930,7 @@ static void de_set_media (struct de_private *de) macmode |= FullDuplex; else macmode &= ~FullDuplex; - + if (netif_msg_link(de)) { printk(KERN_INFO "%s: set link %s\n" KERN_INFO "%s: mode 0x%x, sia 0x%x,0x%x,0x%x,0x%x\n" @@ -966,9 +965,9 @@ static void de21040_media_timer (unsigned long data) u32 status = dr32(SIAStatus); unsigned int carrier; unsigned long flags; - + carrier = (status & NetCxnErr) ? 0 : 1; - + if (carrier) { if (de->media_type != DE_MEDIA_AUI && (status & LinkFailStatus)) goto no_link_yet; @@ -985,7 +984,7 @@ static void de21040_media_timer (unsigned long data) return; } - de_link_down(de); + de_link_down(de); if (de->media_lock) return; @@ -1039,7 +1038,7 @@ static unsigned int de_ok_to_advertise (struct de_private *de, u32 new_media) return 0; break; } - + return 1; } @@ -1050,9 +1049,9 @@ static void de21041_media_timer (unsigned long data) u32 status = dr32(SIAStatus); unsigned int carrier; unsigned long flags; - + carrier = (status & NetCxnErr) ? 0 : 1; - + if (carrier) { if ((de->media_type == DE_MEDIA_TP_AUTO || de->media_type == DE_MEDIA_TP || @@ -1072,7 +1071,7 @@ static void de21041_media_timer (unsigned long data) return; } - de_link_down(de); + de_link_down(de); /* if media type locked, don't switch media */ if (de->media_lock) @@ -1124,7 +1123,7 @@ static void de21041_media_timer (unsigned long data) u32 next_states[] = { DE_MEDIA_AUI, DE_MEDIA_BNC, DE_MEDIA_TP_AUTO }; de_next_media(de, next_states, ARRAY_SIZE(next_states)); } - + set_media: spin_lock_irqsave(&de->lock, flags); de_stop_rxtx(de); @@ -1148,7 +1147,7 @@ static void de_media_interrupt (struct de_private *de, u32 status) mod_timer(&de->media_timer, jiffies + DE_TIMER_LINK); return; } - + BUG_ON(!(status & LinkFail)); if (netif_carrier_ok(de->dev)) { @@ -1227,7 +1226,7 @@ static int de_init_hw (struct de_private *de) int rc; de_adapter_wake(de); - + macmode = dr32(MacMode) & ~MacModeClear; rc = de_reset_mac(de); @@ -1372,7 +1371,7 @@ static int de_open (struct net_device *dev) dw32(IntrMask, 0); - rc = request_irq(dev->irq, de_interrupt, SA_SHIRQ, dev->name, dev); + rc = request_irq(dev->irq, de_interrupt, IRQF_SHARED, dev->name, dev); if (rc) { printk(KERN_ERR "%s: IRQ %d request failure, err=%d\n", dev->name, dev->irq, rc); @@ -1413,7 +1412,7 @@ static int de_close (struct net_device *dev) netif_stop_queue(dev); netif_carrier_off(dev); spin_unlock_irqrestore(&de->lock, flags); - + free_irq(dev->irq, dev); de_free_rings(de); @@ -1441,7 +1440,7 @@ static void de_tx_timeout (struct net_device *dev) spin_unlock_irq(&de->lock); enable_irq(dev->irq); - + /* Update the error counts. */ __de_get_stats(de); @@ -1451,7 +1450,7 @@ static void de_tx_timeout (struct net_device *dev) de_init_rings(de); de_init_hw(de); - + netif_wake_queue(dev); } @@ -1459,7 +1458,7 @@ static void __de_get_regs(struct de_private *de, u8 *buf) { int i; u32 *rbuf = (u32 *)buf; - + /* read all CSRs */ for (i = 0; i < DE_NUM_REGS; i++) rbuf[i] = dr32(i * 8); @@ -1474,7 +1473,7 @@ static int __de_get_settings(struct de_private *de, struct ethtool_cmd *ecmd) ecmd->transceiver = XCVR_INTERNAL; ecmd->phy_address = 0; ecmd->advertising = de->media_advertise; - + switch (de->media_type) { case DE_MEDIA_AUI: ecmd->port = PORT_AUI; @@ -1489,7 +1488,7 @@ static int __de_get_settings(struct de_private *de, struct ethtool_cmd *ecmd) ecmd->speed = SPEED_10; break; } - + if (dr32(MacMode) & FullDuplex) ecmd->duplex = DUPLEX_FULL; else @@ -1529,7 +1528,7 @@ static int __de_set_settings(struct de_private *de, struct ethtool_cmd *ecmd) if (ecmd->autoneg == AUTONEG_ENABLE && (!(ecmd->advertising & ADVERTISED_Autoneg))) return -EINVAL; - + switch (ecmd->port) { case PORT_AUI: new_media = DE_MEDIA_AUI; @@ -1554,22 +1553,22 @@ static int __de_set_settings(struct de_private *de, struct ethtool_cmd *ecmd) return -EINVAL; break; } - + media_lock = (ecmd->autoneg == AUTONEG_ENABLE) ? 0 : 1; - + if ((new_media == de->media_type) && (media_lock == de->media_lock) && (ecmd->advertising == de->media_advertise)) return 0; /* nothing to change */ - + de_link_down(de); de_stop_rxtx(de); - + de->media_type = new_media; de->media_lock = media_lock; de->media_advertise = ecmd->advertising; de_set_media(de); - + return 0; } @@ -1817,7 +1816,7 @@ static void __init de21041_get_srom_info (struct de_private *de) case 0x0204: de->media_type = DE_MEDIA_TP_FD; break; default: de->media_type = DE_MEDIA_TP_AUTO; break; } - + if (netif_msg_probe(de)) printk(KERN_INFO "de%d: SROM leaf offset %u, default media %s\n", de->board_idx, ofs, @@ -1886,7 +1885,7 @@ static void __init de21041_get_srom_info (struct de_private *de) de->media[idx].csr13, de->media[idx].csr14, de->media[idx].csr15); - + } else if (netif_msg_probe(de)) printk("\n"); @@ -2007,8 +2006,8 @@ static int __init de_init_one (struct pci_dev *pdev, } if (pci_resource_len(pdev, 1) < DE_REGS_SIZE) { rc = -EIO; - printk(KERN_ERR PFX "MMIO resource (%lx) too small on pci dev %s\n", - pci_resource_len(pdev, 1), pci_name(pdev)); + printk(KERN_ERR PFX "MMIO resource (%llx) too small on pci dev %s\n", + (unsigned long long)pci_resource_len(pdev, 1), pci_name(pdev)); goto err_out_res; } @@ -2016,8 +2015,9 @@ static int __init de_init_one (struct pci_dev *pdev, regs = ioremap_nocache(pciaddr, DE_REGS_SIZE); if (!regs) { rc = -EIO; - printk(KERN_ERR PFX "Cannot map PCI MMIO (%lx@%lx) on pci dev %s\n", - pci_resource_len(pdev, 1), pciaddr, pci_name(pdev)); + printk(KERN_ERR PFX "Cannot map PCI MMIO (%llx@%lx) on pci dev %s\n", + (unsigned long long)pci_resource_len(pdev, 1), + pciaddr, pci_name(pdev)); goto err_out_res; } dev->base_addr = (unsigned long) regs; @@ -2118,7 +2118,7 @@ static int de_suspend (struct pci_dev *pdev, pm_message_t state) spin_unlock_irq(&de->lock); enable_irq(dev->irq); - + /* Update the error counts. */ __de_get_stats(de); diff --git a/drivers/net/tulip/de4x5.c b/drivers/net/tulip/de4x5.c index f56094102..75ff14a55 100644 --- a/drivers/net/tulip/de4x5.c +++ b/drivers/net/tulip/de4x5.c @@ -41,11 +41,11 @@ Digital Semiconductor SROM Specification. The driver currently recognises the following chips: - DC21040 (no SROM) - DC21041[A] - DC21140[A] - DC21142 - DC21143 + DC21040 (no SROM) + DC21041[A] + DC21140[A] + DC21142 + DC21143 So far the driver is known to work with the following cards: @@ -55,7 +55,7 @@ SMC8432 SMC9332 (w/new SROM) ZNYX31[45] - ZNYX346 10/100 4 port (can act as a 10/100 bridge!) + ZNYX346 10/100 4 port (can act as a 10/100 bridge!) The driver has been tested on a relatively busy network using the DE425, DE434, DE435 and DE500 cards and benchmarked with 'ttcp': it transferred @@ -106,7 +106,7 @@ loading by: insmod de4x5 io=0xghh where g = bus number - hh = device number + hh = device number NB: autoprobing for modules is now supported by default. You may just use: @@ -120,11 +120,11 @@ 4) if you are wanting to add a new card, goto 5. Otherwise, recompile a kernel with the de4x5 configuration turned off and reboot. 5) insmod de4x5 [io=0xghh] - 6) run the net startup bits for your new eth?? interface(s) manually - (usually /etc/rc.inet[12] at boot time). + 6) run the net startup bits for your new eth?? interface(s) manually + (usually /etc/rc.inet[12] at boot time). 7) enjoy! - To unload a module, turn off the associated interface(s) + To unload a module, turn off the associated interface(s) 'ifconfig eth?? down' then 'rmmod de4x5'. Automedia detection is included so that in principal you can disconnect @@ -135,7 +135,7 @@ By default, the driver will now autodetect any DECchip based card. Should you have a need to restrict the driver to DIGITAL only cards, you can compile with a DEC_ONLY define, or if loading as a module, use the - 'dec_only=1' parameter. + 'dec_only=1' parameter. I've changed the timing routines to use the kernel timer and scheduling functions so that the hangs and other assorted problems that occurred @@ -204,7 +204,7 @@ following parameters are allowed: fdx for full duplex - autosense to set the media/speed; with the following + autosense to set the media/speed; with the following sub-parameters: TP, TP_NW, BNC, AUI, BNC_AUI, 100Mb, 10Mb, AUTO @@ -235,14 +235,14 @@ this automatically or include #define DE4X5_FORCE_EISA on or before line 1040 in the driver. - TO DO: + TO DO: ------ Revision History ---------------- Version Date Description - + 0.1 17-Nov-94 Initial writing. ALPHA code release. 0.2 13-Jan-95 Added PCI support for DE435's. 0.21 19-Jan-95 Added auto media detection. @@ -251,7 +251,7 @@ Add request/release_region code. Add loadable modules support for PCI. Clean up loadable modules support. - 0.23 28-Feb-95 Added DC21041 and DC21140 support. + 0.23 28-Feb-95 Added DC21041 and DC21140 support. Fix missed frame counter value and initialisation. Fixed EISA probe. 0.24 11-Apr-95 Change delay routine to use . @@ -280,7 +280,7 @@ Add kernel timer code (h/w is too flaky). Add MII based PHY autosense. Add new multicasting code. - Add new autosense algorithms for media/mode + Add new autosense algorithms for media/mode selection using kernel scheduling/timing. Re-formatted. Made changes suggested by : @@ -292,7 +292,7 @@ 0.41 21-Mar-96 Don't check for get_hw_addr checksum unless DEC card only Fix for multiple PCI cards reported by - Duh, put the SA_SHIRQ flag into request_interrupt(). + Duh, put the IRQF_SHARED flag into request_interrupt(). Fix SMC ethernet address in enet_det[]. Print chip name instead of "UNKNOWN" during boot. 0.42 26-Apr-96 Fix MII write TA bit error. @@ -307,10 +307,10 @@ Add Accton to the list of broken cards. Fix TX under-run bug for non DC21140 chips. Fix boot command probe bug in alloc_device() as - reported by and + reported by and . Add cache locks to prevent a race condition as - reported by and + reported by and . Upgraded alloc_device() code. 0.431 28-Jun-96 Fix potential bug in queue_pkt() from discussion @@ -322,7 +322,7 @@ with a loopback packet. 0.442 9-Sep-96 Include AUI in dc21041 media printout. Bug reported by - 0.45 8-Dec-96 Include endian functions for PPC use, from work + 0.45 8-Dec-96 Include endian functions for PPC use, from work by and . 0.451 28-Dec-96 Added fix to allow autoprobe for modules after suggestion from . @@ -346,14 +346,14 @@ . 0.52 26-Apr-97 Some changes may not credit the right people - a disk crash meant I lost some mail. - Change RX interrupt routine to drop rather than - defer packets to avoid hang reported by + Change RX interrupt routine to drop rather than + defer packets to avoid hang reported by . Fix srom_exec() to return for COMPACT and type 1 infoblocks. Added DC21142 and DC21143 functions. Added byte counters from - Added SA_INTERRUPT temporary fix from + Added IRQF_DISABLED temporary fix from . 0.53 12-Nov-97 Fix the *_probe() to include 'eth??' name during module load: bug reported by @@ -363,10 +363,10 @@ Make above search independent of BIOS device scan direction. Completed DC2114[23] autosense functions. - 0.531 21-Dec-97 Fix DE500-XA 100Mb/s bug reported by + 0.531 21-Dec-97 Fix DE500-XA 100Mb/s bug reported by and . Added argument list to set up each board from either @@ -374,7 +374,7 @@ Added generic MII PHY functionality to deal with newer PHY chips. Fix the mess in 2.1.67. - 0.532 5-Jan-98 Fix bug in mii_get_phy() reported by + 0.532 5-Jan-98 Fix bug in mii_get_phy() reported by . Fix bug in pci_probe() for 64 bit systems reported by . @@ -398,7 +398,7 @@ version. I hope nothing is broken... Add TX done interrupt modification from suggestion by . - Fix is_anc_capable() bug reported by + Fix is_anc_capable() bug reported by . Fix type[13]_infoblock() bug: during MII search, PHY lp->rst not run because lp->ibn not initialised - @@ -413,7 +413,7 @@ Add an_exception() for old ZYNX346 and fix compile warning on PPC & SPARC, from . Fix lastPCI to correctly work with compiled in - kernels and modules from bug report by + kernels and modules from bug report by et al. 0.542 15-Sep-98 Fix dc2114x_autoconf() to stop multiple messages when media is unconnected. @@ -425,7 +425,7 @@ 0.544 8-May-99 Fix for buggy SROM in Motorola embedded boards using a 21143 by . Change PCI/EISA bus probing order. - 0.545 28-Nov-99 Further Moto SROM bug fix from + 0.545 28-Nov-99 Further Moto SROM bug fix from Remove double checking for DEBUG_RX in de4x5_dbg_rx() from report by @@ -434,8 +434,8 @@ variable 'pb', on a non de4x5 PCI device, in this case a PCI bridge (DEC chip 21152). The value of 'pb' is now only initialized if a de4x5 chip is - present. - + present. + 0.547 08-Nov-01 Use library crc32 functions by 0.548 30-Aug-03 Big 2.6 cleanup. Ported to PCI/EISA probing and generic DMA APIs. Fixed DE425 support on Alpha. @@ -443,7 +443,6 @@ ========================================================================= */ -#include #include #include #include @@ -584,7 +583,7 @@ static int de4x5_debug = (DEBUG_MEDIA | DEBUG_VERSION); /* ** Allow per adapter set up. For modules this is simply a command line -** parameter, e.g.: +** parameter, e.g.: ** insmod de4x5 args='eth1:fdx autosense=BNC eth0:autosense=100Mb'. ** ** For a compiled in driver, place e.g. @@ -655,7 +654,7 @@ static c_char *de4x5_signatures[] = DE4X5_SIGNATURE; ** Memory Alignment. Each descriptor is 4 longwords long. To force a ** particular alignment on the TX descriptor, adjust DESC_SKIP_LEN and ** DESC_ALIGN. ALIGN aligns the start address of the private memory area -** and hence the RX descriptor ring's first entry. +** and hence the RX descriptor ring's first entry. */ #define DE4X5_ALIGN4 ((u_long)4 - 1) /* 1 longword align */ #define DE4X5_ALIGN8 ((u_long)8 - 1) /* 2 longword align */ @@ -1081,8 +1080,8 @@ static int (*dc_infoblock[])(struct net_device *dev, u_char, u_char *) = { mdelay(2); /* Wait for 2ms */\ } - -static int __devinit + +static int __devinit de4x5_hw_init(struct net_device *dev, u_long iobase, struct device *gendev) { char name[DE4X5_NAME_LENGTH + 1]; @@ -1102,12 +1101,12 @@ de4x5_hw_init(struct net_device *dev, u_long iobase, struct device *gendev) mdelay(10); RESET_DE4X5; - + if ((inl(DE4X5_STS) & (STS_TS | STS_RS)) != 0) { return -ENXIO; /* Hardware could not reset */ } - - /* + + /* ** Now find out what kind of DC21040/DC21041/DC21140 board we have. */ lp->useSROM = FALSE; @@ -1116,21 +1115,21 @@ de4x5_hw_init(struct net_device *dev, u_long iobase, struct device *gendev) } else { EISA_signature(name, gendev); } - + if (*name == '\0') { /* Not found a board signature */ return -ENXIO; } - + dev->base_addr = iobase; printk ("%s: %s at 0x%04lx", gendev->bus_id, name, iobase); - + printk(", h/w address "); status = get_hw_addr(dev); for (i = 0; i < ETH_ALEN - 1; i++) { /* get the ethernet addr. */ printk("%2.2x:", dev->dev_addr[i]); } printk("%2.2x,\n", dev->dev_addr[i]); - + if (status != 0) { printk(" which has an Ethernet PROM CRC error.\n"); return -ENXIO; @@ -1171,10 +1170,10 @@ de4x5_hw_init(struct net_device *dev, u_long iobase, struct device *gendev) } lp->tx_ring = lp->rx_ring + NUM_RX_DESC; - + /* ** Set up the RX descriptor ring (Intels) - ** Allocate contiguous receive buffers, long word aligned (Alphas) + ** Allocate contiguous receive buffers, long word aligned (Alphas) */ #if !defined(__alpha__) && !defined(__powerpc__) && !defined(__sparc_v9__) && !defined(DE4X5_DO_MEMCPY) for (i=0; irxRingSize = NUM_RX_DESC; lp->txRingSize = NUM_TX_DESC; - + /* Write the end of list marker to the descriptor lists */ lp->rx_ring[lp->rxRingSize - 1].des1 |= cpu_to_le32(RD_RER); lp->tx_ring[lp->txRingSize - 1].des1 |= cpu_to_le32(TD_TER); @@ -1219,7 +1218,7 @@ de4x5_hw_init(struct net_device *dev, u_long iobase, struct device *gendev) outl(lp->dma_rings, DE4X5_RRBA); outl(lp->dma_rings + NUM_RX_DESC * sizeof(struct de4x5_desc), DE4X5_TRBA); - + /* Initialise the IRQ mask and Enable/Disable */ lp->irq_mask = IMR_RIM | IMR_TIM | IMR_TUM | IMR_UNM; lp->irq_en = IMR_NIM | IMR_AIM; @@ -1252,7 +1251,7 @@ de4x5_hw_init(struct net_device *dev, u_long iobase, struct device *gendev) if ((lp->chipset != DC21040) && (lp->chipset != DC21041)) { mii_get_phy(dev); } - + #ifndef __sparc_v9__ printk(" and requires IRQ%d (provided by %s).\n", dev->irq, #else @@ -1260,11 +1259,11 @@ de4x5_hw_init(struct net_device *dev, u_long iobase, struct device *gendev) #endif ((lp->bus == PCI) ? "PCI BIOS" : "EISA CNFG")); } - + if (de4x5_debug & DEBUG_VERSION) { printk(version); } - + /* The DE4X5-specific entries in the device structure. */ SET_MODULE_OWNER(dev); SET_NETDEV_DEV(dev, gendev); @@ -1274,23 +1273,23 @@ de4x5_hw_init(struct net_device *dev, u_long iobase, struct device *gendev) dev->get_stats = &de4x5_get_stats; dev->set_multicast_list = &set_multicast_list; dev->do_ioctl = &de4x5_ioctl; - + dev->mem_start = 0; - + /* Fill in the generic fields of the device structure. */ if ((status = register_netdev (dev))) { dma_free_coherent (gendev, lp->dma_size, lp->rx_ring, lp->dma_rings); return status; } - + /* Let the adapter sleep to save power */ yawn(dev, SLEEP); - + return status; } - + static int de4x5_open(struct net_device *dev) { @@ -1312,18 +1311,18 @@ de4x5_open(struct net_device *dev) */ yawn(dev, WAKEUP); - /* - ** Re-initialize the DE4X5... + /* + ** Re-initialize the DE4X5... */ status = de4x5_init(dev); spin_lock_init(&lp->lock); lp->state = OPEN; de4x5_dbg_open(dev); - - if (request_irq(dev->irq, (void *)de4x5_interrupt, SA_SHIRQ, + + if (request_irq(dev->irq, (void *)de4x5_interrupt, IRQF_SHARED, lp->adapter_name, dev)) { printk("de4x5_open(): Requested IRQ%d is busy - attemping FAST/SHARE...", dev->irq); - if (request_irq(dev->irq, de4x5_interrupt, SA_INTERRUPT | SA_SHIRQ, + if (request_irq(dev->irq, de4x5_interrupt, IRQF_DISABLED | IRQF_SHARED, lp->adapter_name, dev)) { printk("\n Cannot get IRQ- reconfigure your hardware.\n"); disable_ast(dev); @@ -1340,11 +1339,11 @@ de4x5_open(struct net_device *dev) lp->interrupt = UNMASK_INTERRUPTS; dev->trans_start = jiffies; - + START_DE4X5; - + de4x5_setup_intr(dev); - + if (de4x5_debug & DEBUG_OPEN) { printk("\tsts: 0x%08x\n", inl(DE4X5_STS)); printk("\tbmr: 0x%08x\n", inl(DE4X5_BMR)); @@ -1355,7 +1354,7 @@ de4x5_open(struct net_device *dev) printk("\tstrr: 0x%08x\n", inl(DE4X5_STRR)); printk("\tsigr: 0x%08x\n", inl(DE4X5_SIGR)); } - + return status; } @@ -1369,15 +1368,15 @@ de4x5_open(struct net_device *dev) */ static int de4x5_init(struct net_device *dev) -{ +{ /* Lock out other processes whilst setting up the hardware */ netif_stop_queue(dev); - + de4x5_sw_reset(dev); - + /* Autoconfigure the connected port */ autoconf_media(dev); - + return 0; } @@ -1388,7 +1387,7 @@ de4x5_sw_reset(struct net_device *dev) u_long iobase = dev->base_addr; int i, j, status = 0; s32 bmr, omr; - + /* Select the MII or SRL port now and RESET the MAC */ if (!lp->useSROM) { if (lp->phy[lp->active].id != 0) { @@ -1399,7 +1398,7 @@ de4x5_sw_reset(struct net_device *dev) de4x5_switch_mac_port(dev); } - /* + /* ** Set the programmable burst length to 8 longwords for all the DC21140 ** Fasternet chips and 4 longwords for all others: DMA errors result ** without these values. Cache align 16 long. @@ -1416,23 +1415,23 @@ de4x5_sw_reset(struct net_device *dev) outl(lp->dma_rings, DE4X5_RRBA); outl(lp->dma_rings + NUM_RX_DESC * sizeof(struct de4x5_desc), DE4X5_TRBA); - + lp->rx_new = lp->rx_old = 0; lp->tx_new = lp->tx_old = 0; - + for (i = 0; i < lp->rxRingSize; i++) { lp->rx_ring[i].status = cpu_to_le32(R_OWN); } - + for (i = 0; i < lp->txRingSize; i++) { lp->tx_ring[i].status = cpu_to_le32(0); } - + barrier(); /* Build the setup frame depending on filtering mode */ SetMulticastFilter(dev); - + load_packet(dev, lp->setup_frame, PERFECT_F|TD_SET|SETUP_FRAME_LEN, (struct sk_buff *)1); outl(omr|OMR_ST, DE4X5_OMR); @@ -1445,18 +1444,18 @@ de4x5_sw_reset(struct net_device *dev) outl(omr, DE4X5_OMR); /* Stop everything! */ if (j == 0) { - printk("%s: Setup frame timed out, status %08x\n", dev->name, + printk("%s: Setup frame timed out, status %08x\n", dev->name, inl(DE4X5_STS)); status = -EIO; } - + lp->tx_new = (++lp->tx_new) % lp->txRingSize; lp->tx_old = lp->tx_new; return status; } -/* +/* ** Writes a socket buffer address to the next available transmit descriptor. */ static int @@ -1469,9 +1468,9 @@ de4x5_queue_pkt(struct sk_buff *skb, struct net_device *dev) netif_stop_queue(dev); if (lp->tx_enable == NO) { /* Cannot send for now */ - return -1; + return -1; } - + /* ** Clean out the TX ring asynchronously to interrupts - sometimes the ** interrupts are lost by delayed descriptor status updates relative to @@ -1482,7 +1481,7 @@ de4x5_queue_pkt(struct sk_buff *skb, struct net_device *dev) spin_unlock_irqrestore(&lp->lock, flags); /* Test if cache is already locked - requeue skb if so */ - if (test_and_set_bit(0, (void *)&lp->cache.lock) && !lp->interrupt) + if (test_and_set_bit(0, (void *)&lp->cache.lock) && !lp->interrupt) return -1; /* Transmit descriptor ring full or stale skb */ @@ -1509,10 +1508,10 @@ de4x5_queue_pkt(struct sk_buff *skb, struct net_device *dev) load_packet(dev, skb->data, TD_IC | TD_LS | TD_FS | skb->len, skb); lp->stats.tx_bytes += skb->len; outl(POLL_DEMAND, DE4X5_TPD);/* Start the TX */ - + lp->tx_new = (++lp->tx_new) % lp->txRingSize; dev->trans_start = jiffies; - + if (TX_BUFFS_AVAIL) { netif_start_queue(dev); /* Another pkt may be queued */ } @@ -1521,15 +1520,15 @@ de4x5_queue_pkt(struct sk_buff *skb, struct net_device *dev) } if (skb) de4x5_putb_cache(dev, skb); } - + lp->cache.lock = 0; return status; } /* -** The DE4X5 interrupt handler. -** +** The DE4X5 interrupt handler. +** ** I/O Read/Writes through intermediate PCI bridges are never 'posted', ** so that the asserted interrupt always has some real data to work with - ** if these I/O accesses are ever changed to memory accesses, ensure the @@ -1546,7 +1545,7 @@ de4x5_interrupt(int irq, void *dev_id, struct pt_regs *regs) s32 imr, omr, sts, limit; u_long iobase; unsigned int handled = 0; - + if (dev == NULL) { printk ("de4x5_interrupt(): irq %d for unknown device.\n", irq); return IRQ_NONE; @@ -1554,35 +1553,35 @@ de4x5_interrupt(int irq, void *dev_id, struct pt_regs *regs) lp = netdev_priv(dev); spin_lock(&lp->lock); iobase = dev->base_addr; - + DISABLE_IRQs; /* Ensure non re-entrancy */ if (test_and_set_bit(MASK_INTERRUPTS, (void*) &lp->interrupt)) printk("%s: Re-entering the interrupt handler.\n", dev->name); synchronize_irq(dev->irq); - + for (limit=0; limit<8; limit++) { sts = inl(DE4X5_STS); /* Read IRQ status */ outl(sts, DE4X5_STS); /* Reset the board interrupts */ - + if (!(sts & lp->irq_mask)) break;/* All done */ handled = 1; - + if (sts & (STS_RI | STS_RU)) /* Rx interrupt (packet[s] arrived) */ de4x5_rx(dev); - + if (sts & (STS_TI | STS_TU)) /* Tx interrupt (packet sent) */ - de4x5_tx(dev); - + de4x5_tx(dev); + if (sts & STS_LNF) { /* TP Link has failed */ lp->irq_mask &= ~IMR_LFM; } - + if (sts & STS_UNF) { /* Transmit underrun */ de4x5_txur(dev); } - + if (sts & STS_SE) { /* Bus Error */ STOP_DE4X5; printk("%s: Fatal bus error occurred, sts=%#8x, device stopped.\n", @@ -1603,7 +1602,7 @@ de4x5_interrupt(int irq, void *dev_id, struct pt_regs *regs) lp->interrupt = UNMASK_INTERRUPTS; ENABLE_IRQs; spin_unlock(&lp->lock); - + return IRQ_RETVAL(handled); } @@ -1614,11 +1613,11 @@ de4x5_rx(struct net_device *dev) u_long iobase = dev->base_addr; int entry; s32 status; - + for (entry=lp->rx_new; (s32)le32_to_cpu(lp->rx_ring[entry].status)>=0; entry=lp->rx_new) { status = (s32)le32_to_cpu(lp->rx_ring[entry].status); - + if (lp->rx_ovf) { if (inl(DE4X5_MFC) & MFC_FOCM) { de4x5_rx_ovfc(dev); @@ -1629,7 +1628,7 @@ de4x5_rx(struct net_device *dev) if (status & RD_FS) { /* Remember the start of frame */ lp->rx_old = entry; } - + if (status & RD_LS) { /* Valid frame status */ if (lp->tx_enable) lp->linkOK++; if (status & RD_ES) { /* There was an error. */ @@ -1646,9 +1645,9 @@ de4x5_rx(struct net_device *dev) struct sk_buff *skb; short pkt_len = (short)(le32_to_cpu(lp->rx_ring[entry].status) >> 16) - 4; - + if ((skb = de4x5_alloc_rx_buff(dev, entry, pkt_len)) == NULL) { - printk("%s: Insufficient memory; nuking packet.\n", + printk("%s: Insufficient memory; nuking packet.\n", dev->name); lp->stats.rx_dropped++; } else { @@ -1658,14 +1657,14 @@ de4x5_rx(struct net_device *dev) skb->protocol=eth_type_trans(skb,dev); de4x5_local_stats(dev, skb->data, pkt_len); netif_rx(skb); - + /* Update stats */ dev->last_rx = jiffies; lp->stats.rx_packets++; lp->stats.rx_bytes += pkt_len; } } - + /* Change buffer ownership for this frame, back to the adapter */ for (;lp->rx_old!=entry;lp->rx_old=(++lp->rx_old)%lp->rxRingSize) { lp->rx_ring[lp->rx_old].status = cpu_to_le32(R_OWN); @@ -1674,13 +1673,13 @@ de4x5_rx(struct net_device *dev) lp->rx_ring[entry].status = cpu_to_le32(R_OWN); barrier(); } - + /* ** Update entry information */ lp->rx_new = (++lp->rx_new) % lp->rxRingSize; } - + return 0; } @@ -1705,20 +1704,20 @@ de4x5_tx(struct net_device *dev) u_long iobase = dev->base_addr; int entry; s32 status; - + for (entry = lp->tx_old; entry != lp->tx_new; entry = lp->tx_old) { status = (s32)le32_to_cpu(lp->tx_ring[entry].status); if (status < 0) { /* Buffer not sent yet */ break; } else if (status != 0x7fffffff) { /* Not setup frame */ if (status & TD_ES) { /* An error happened */ - lp->stats.tx_errors++; + lp->stats.tx_errors++; if (status & TD_NC) lp->stats.tx_carrier_errors++; if (status & TD_LC) lp->stats.tx_window_errors++; if (status & TD_UF) lp->stats.tx_fifo_errors++; if (status & TD_EC) lp->pktStats.excessive_collisions++; if (status & TD_DE) lp->stats.tx_aborted_errors++; - + if (TX_PKT_PENDING) { outl(POLL_DEMAND, DE4X5_TPD);/* Restart a stalled TX */ } @@ -1727,14 +1726,14 @@ de4x5_tx(struct net_device *dev) if (lp->tx_enable) lp->linkOK++; } /* Update the collision counter */ - lp->stats.collisions += ((status & TD_EC) ? 16 : + lp->stats.collisions += ((status & TD_EC) ? 16 : ((status & TD_CC) >> 3)); /* Free the buffer. */ if (lp->tx_skb[entry] != NULL) de4x5_free_tx_buff(lp, entry); } - + /* Update all the pointers */ lp->tx_old = (++lp->tx_old) % lp->txRingSize; } @@ -1746,7 +1745,7 @@ de4x5_tx(struct net_device *dev) else netif_start_queue(dev); } - + return 0; } @@ -1755,9 +1754,9 @@ de4x5_ast(struct net_device *dev) { struct de4x5_private *lp = netdev_priv(dev); int next_tick = DE4X5_AUTOSENSE_MS; - + disable_ast(dev); - + if (lp->useSROM) { next_tick = srom_autoconf(dev); } else if (lp->chipset == DC21140) { @@ -1769,7 +1768,7 @@ de4x5_ast(struct net_device *dev) } lp->linkOK = 0; enable_ast(dev, next_tick); - + return 0; } @@ -1792,11 +1791,11 @@ de4x5_txur(struct net_device *dev) } outl(omr | OMR_ST | OMR_SR, DE4X5_OMR); } - + return 0; } -static int +static int de4x5_rx_ovfc(struct net_device *dev) { struct de4x5_private *lp = netdev_priv(dev); @@ -1813,7 +1812,7 @@ de4x5_rx_ovfc(struct net_device *dev) } outl(omr, DE4X5_OMR); - + return 0; } @@ -1823,22 +1822,22 @@ de4x5_close(struct net_device *dev) struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; s32 imr, omr; - + disable_ast(dev); netif_stop_queue(dev); - + if (de4x5_debug & DEBUG_CLOSE) { printk("%s: Shutting down ethercard, status was %8.8x.\n", dev->name, inl(DE4X5_STS)); } - - /* + + /* ** We stop the DE4X5 here... mask interrupts and stop TX & RX */ DISABLE_IRQs; STOP_DE4X5; - + /* Free the associated irq */ free_irq(dev->irq, dev); lp->state = CLOSED; @@ -1846,10 +1845,10 @@ de4x5_close(struct net_device *dev) /* Free any socket buffers */ de4x5_free_rx_buffs(dev); de4x5_free_tx_buffs(dev); - + /* Put the adapter to sleep to save power */ yawn(dev, SLEEP); - + return 0; } @@ -1858,9 +1857,9 @@ de4x5_get_stats(struct net_device *dev) { struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; - + lp->stats.rx_missed_errors = (int)(inl(DE4X5_MFC) & (MFC_OVFL | MFC_CNTR)); - + return &lp->stats; } @@ -1886,7 +1885,7 @@ de4x5_local_stats(struct net_device *dev, char *buf, int pkt_len) (*(s16 *)&buf[4] == *(s16 *)&dev->dev_addr[4])) { lp->pktStats.unicast++; } - + lp->pktStats.bins[0]++; /* Duplicates stats.rx_packets */ if (lp->pktStats.bins[0] == 0) { /* Reset counters */ memset((char *)&lp->pktStats, 0, sizeof(lp->pktStats)); @@ -1937,11 +1936,11 @@ set_multicast_list(struct net_device *dev) omr = inl(DE4X5_OMR); omr |= OMR_PR; outl(omr, DE4X5_OMR); - } else { + } else { SetMulticastFilter(dev); - load_packet(dev, lp->setup_frame, TD_IC | PERFECT_F | TD_SET | + load_packet(dev, lp->setup_frame, TD_IC | PERFECT_F | TD_SET | SETUP_FRAME_LEN, (struct sk_buff *)1); - + lp->tx_new = (++lp->tx_new) % lp->txRingSize; outl(POLL_DEMAND, DE4X5_TPD); /* Start the TX */ dev->trans_start = jiffies; @@ -1969,20 +1968,20 @@ SetMulticastFilter(struct net_device *dev) omr = inl(DE4X5_OMR); omr &= ~(OMR_PR | OMR_PM); pa = build_setup_frame(dev, ALL); /* Build the basic frame */ - + if ((dev->flags & IFF_ALLMULTI) || (dev->mc_count > 14)) { omr |= OMR_PM; /* Pass all multicasts */ } else if (lp->setup_f == HASH_PERF) { /* Hash Filtering */ for (i=0;imc_count;i++) { /* for each address in the list */ addrs=dmi->dmi_addr; dmi=dmi->next; - if ((*addrs & 0x01) == 1) { /* multicast address? */ + if ((*addrs & 0x01) == 1) { /* multicast address? */ crc = ether_crc_le(ETH_ALEN, addrs); hashcode = crc & HASH_BITS; /* hashcode is 9 LSb of CRC */ - + byte = hashcode >> 3; /* bit[3-8] -> byte in filter */ bit = 1 << (hashcode & 0x07);/* bit[0-2] -> bit in byte */ - + byte <<= 1; /* calc offset into setup frame */ if (byte & 0x02) { byte -= 1; @@ -1994,14 +1993,14 @@ SetMulticastFilter(struct net_device *dev) for (j=0; jmc_count; j++) { addrs=dmi->dmi_addr; dmi=dmi->next; - for (i=0; icfrv = (u_short) inl(PCI_CFRV); device = (cfid >> 8) & 0x00ffff00; vendor = (u_short) cfid; - + /* Read the EISA Configuration Registers */ regval = inb(EISA_REG0) & (ER0_INTL | ER0_INTT); #ifdef CONFIG_ALPHA @@ -2050,7 +2049,7 @@ static int __init de4x5_eisa_probe (struct device *gendev) * care about the EISA configuration, and thus doesn't * configure the PLX bridge properly. Oh well... Simply mimic * the EISA config file to sort it out. */ - + /* EISA REG1: Assert DecChip 21040 HW Reset */ outb (ER1_IAM | 1, EISA_REG1); mdelay (1); @@ -2061,12 +2060,12 @@ static int __init de4x5_eisa_probe (struct device *gendev) /* EISA REG3: R/W Burst Transfer Enable */ outb (ER3_BWE | ER3_BRE, EISA_REG3); - + /* 32_bit slave/master, Preempt Time=23 bclks, Unlatched Interrupt */ outb (ER0_BSW | ER0_BMW | ER0_EPT | regval, EISA_REG0); #endif irq = de4x5_irq[(regval >> 1) & 0x03]; - + if (is_DC2114x) { device = ((lp->cfrv & CFRV_RN) < DC2114x_BRK ? DC21142 : DC21143); } @@ -2077,7 +2076,7 @@ static int __init de4x5_eisa_probe (struct device *gendev) outl(PCI_COMMAND_IO | PCI_COMMAND_MASTER, PCI_CFCS); outl(0x00006000, PCI_CFLT); outl(iobase, PCI_CBIO); - + DevicePresent(dev, EISA_APROM); dev->irq = irq; @@ -2102,7 +2101,7 @@ static int __devexit de4x5_eisa_remove (struct device *device) dev = device->driver_data; iobase = dev->base_addr; - + unregister_netdev (dev); free_netdev (dev); release_region (iobase + DE4X5_EISA_IO_PORTS, DE4X5_EISA_TOTAL_SIZE); @@ -2131,11 +2130,11 @@ MODULE_DEVICE_TABLE(eisa, de4x5_eisa_ids); /* ** This function searches the current bus (which is >0) for a DECchip with an -** SROM, so that in multiport cards that have one SROM shared between multiple +** SROM, so that in multiport cards that have one SROM shared between multiple ** DECchips, we can find the base SROM irrespective of the BIOS scan direction. ** For single port cards this is a time waster... */ -static void __devinit +static void __devinit srom_search(struct net_device *dev, struct pci_dev *pdev) { u_char pb; @@ -2163,7 +2162,7 @@ srom_search(struct net_device *dev, struct pci_dev *pdev) /* Set the device number information */ lp->device = PCI_SLOT(this_dev->devfn); lp->bus_num = pb; - + /* Set the chipset information */ if (is_DC2114x) { device = ((cfrv & CFRV_RN) < DC2114x_BRK ? DC21142 : DC21143); @@ -2176,7 +2175,7 @@ srom_search(struct net_device *dev, struct pci_dev *pdev) /* Fetch the IRQ to be used */ irq = this_dev->irq; if ((irq == 0) || (irq == 0xff) || ((int)irq == -1)) continue; - + /* Check if I/O accesses are enabled */ pci_read_config_word(this_dev, PCI_COMMAND, &status); if (!(status & PCI_COMMAND_IO)) continue; @@ -2254,7 +2253,7 @@ static int __devinit de4x5_pci_probe (struct pci_dev *pdev, lp = netdev_priv(dev); lp->bus = PCI; lp->bus_num = 0; - + /* Search for an SROM on this bus */ if (lp->bus_num != pb) { lp->bus_num = pb; @@ -2267,7 +2266,7 @@ static int __devinit de4x5_pci_probe (struct pci_dev *pdev, /* Set the device number information */ lp->device = dev_num; lp->bus_num = pb; - + /* Set the chipset information */ if (is_DC2114x) { device = ((lp->cfrv & CFRV_RN) < DC2114x_BRK ? DC21142 : DC21143); @@ -2283,7 +2282,7 @@ static int __devinit de4x5_pci_probe (struct pci_dev *pdev, error = -ENODEV; goto free_dev; } - + /* Check if I/O accesses and Bus Mastering are enabled */ pci_read_config_word(pdev, PCI_COMMAND, &status); #ifdef __powerpc__ @@ -2322,7 +2321,7 @@ static int __devinit de4x5_pci_probe (struct pci_dev *pdev, } dev->irq = irq; - + if ((error = de4x5_hw_init(dev, iobase, &pdev->dev))) { goto release; } @@ -2377,7 +2376,7 @@ static struct pci_driver de4x5_pci_driver = { ** Auto configure the media here rather than setting the port at compile ** time. This routine is called by de4x5_init() and when a loss of media is ** detected (excessive collisions, loss of carrier, no carrier or link fail -** [TP] or no recent receive activity) to check whether the user has been +** [TP] or no recent receive activity) to check whether the user has been ** sneaky and changed the port on us. */ static int @@ -2405,7 +2404,7 @@ autoconf_media(struct net_device *dev) } enable_ast(dev, next_tick); - + return (lp->media); } @@ -2428,7 +2427,7 @@ dc21040_autoconf(struct net_device *dev) u_long iobase = dev->base_addr; int next_tick = DE4X5_AUTOSENSE_MS; s32 imr; - + switch (lp->media) { case INIT: DISABLE_IRQs; @@ -2447,36 +2446,36 @@ dc21040_autoconf(struct net_device *dev) lp->local_state = 0; next_tick = dc21040_autoconf(dev); break; - + case TP: - next_tick = dc21040_state(dev, 0x8f01, 0xffff, 0x0000, 3000, BNC_AUI, + next_tick = dc21040_state(dev, 0x8f01, 0xffff, 0x0000, 3000, BNC_AUI, TP_SUSPECT, test_tp); break; - + case TP_SUSPECT: next_tick = de4x5_suspect_state(dev, 1000, TP, test_tp, dc21040_autoconf); break; - + case BNC: case AUI: case BNC_AUI: - next_tick = dc21040_state(dev, 0x8f09, 0x0705, 0x0006, 3000, EXT_SIA, + next_tick = dc21040_state(dev, 0x8f09, 0x0705, 0x0006, 3000, EXT_SIA, BNC_AUI_SUSPECT, ping_media); break; - + case BNC_AUI_SUSPECT: next_tick = de4x5_suspect_state(dev, 1000, BNC_AUI, ping_media, dc21040_autoconf); break; - + case EXT_SIA: - next_tick = dc21040_state(dev, 0x3041, 0x0000, 0x0006, 3000, + next_tick = dc21040_state(dev, 0x3041, 0x0000, 0x0006, 3000, NC, EXT_SIA_SUSPECT, ping_media); break; - + case EXT_SIA_SUSPECT: next_tick = de4x5_suspect_state(dev, 1000, EXT_SIA, ping_media, dc21040_autoconf); break; - + case NC: /* default to TP for all */ reset_init_sia(dev, 0x8f01, 0xffff, 0x0000); @@ -2488,13 +2487,13 @@ dc21040_autoconf(struct net_device *dev) lp->tx_enable = NO; break; } - + return next_tick; } static int dc21040_state(struct net_device *dev, int csr13, int csr14, int csr15, int timeout, - int next_state, int suspect_state, + int next_state, int suspect_state, int (*fn)(struct net_device *, int)) { struct de4x5_private *lp = netdev_priv(dev); @@ -2507,7 +2506,7 @@ dc21040_state(struct net_device *dev, int csr13, int csr14, int csr15, int timeo lp->local_state++; next_tick = 500; break; - + case 1: if (!lp->tx_enable) { linkBad = fn(dev, timeout); @@ -2527,7 +2526,7 @@ dc21040_state(struct net_device *dev, int csr13, int csr14, int csr15, int timeo } break; } - + return next_tick; } @@ -2582,7 +2581,7 @@ dc21041_autoconf(struct net_device *dev) u_long iobase = dev->base_addr; s32 sts, irqs, irq_mask, imr, omr; int next_tick = DE4X5_AUTOSENSE_MS; - + switch (lp->media) { case INIT: DISABLE_IRQs; @@ -2603,7 +2602,7 @@ dc21041_autoconf(struct net_device *dev) lp->local_state = 0; next_tick = dc21041_autoconf(dev); break; - + case TP_NW: if (lp->timeout < 0) { omr = inl(DE4X5_OMR);/* Set up full duplex for the autonegotiate */ @@ -2623,7 +2622,7 @@ dc21041_autoconf(struct net_device *dev) next_tick = dc21041_autoconf(dev); } break; - + case ANS: if (!lp->tx_enable) { irqs = STS_LNP; @@ -2645,11 +2644,11 @@ dc21041_autoconf(struct net_device *dev) next_tick = 3000; } break; - + case ANS_SUSPECT: next_tick = de4x5_suspect_state(dev, 1000, ANS, test_tp, dc21041_autoconf); break; - + case TP: if (!lp->tx_enable) { if (lp->timeout < 0) { @@ -2679,11 +2678,11 @@ dc21041_autoconf(struct net_device *dev) next_tick = 3000; } break; - + case TP_SUSPECT: next_tick = de4x5_suspect_state(dev, 1000, TP, test_tp, dc21041_autoconf); break; - + case AUI: if (!lp->tx_enable) { if (lp->timeout < 0) { @@ -2709,11 +2708,11 @@ dc21041_autoconf(struct net_device *dev) next_tick = 3000; } break; - + case AUI_SUSPECT: next_tick = de4x5_suspect_state(dev, 1000, AUI, ping_media, dc21041_autoconf); break; - + case BNC: switch (lp->local_state) { case 0: @@ -2731,7 +2730,7 @@ dc21041_autoconf(struct net_device *dev) next_tick = dc21041_autoconf(dev); } break; - + case 1: if (!lp->tx_enable) { if ((sts = ping_media(dev, 3000)) < 0) { @@ -2751,11 +2750,11 @@ dc21041_autoconf(struct net_device *dev) break; } break; - + case BNC_SUSPECT: next_tick = de4x5_suspect_state(dev, 1000, BNC, ping_media, dc21041_autoconf); break; - + case NC: omr = inl(DE4X5_OMR); /* Set up full duplex for the autonegotiate */ outl(omr | OMR_FDX, DE4X5_OMR); @@ -2768,7 +2767,7 @@ dc21041_autoconf(struct net_device *dev) lp->tx_enable = NO; break; } - + return next_tick; } @@ -2784,9 +2783,9 @@ dc21140m_autoconf(struct net_device *dev) int ana, anlpa, cap, cr, slnk, sr; int next_tick = DE4X5_AUTOSENSE_MS; u_long imr, omr, iobase = dev->base_addr; - + switch(lp->media) { - case INIT: + case INIT: if (lp->timeout < 0) { DISABLE_IRQs; lp->tx_enable = FALSE; @@ -2813,7 +2812,7 @@ dc21140m_autoconf(struct net_device *dev) lp->media = _100Mb; } else if (lp->autosense == _10Mb) { lp->media = _10Mb; - } else if ((lp->autosense == AUTO) && + } else if ((lp->autosense == AUTO) && ((sr=is_anc_capable(dev)) & MII_SR_ANC)) { ana = (((sr >> 6) & MII_ANA_TAF) | MII_ANA_CSMA); ana &= (lp->fdx ? ~0 : ~MII_ANA_FDAM); @@ -2831,7 +2830,7 @@ dc21140m_autoconf(struct net_device *dev) next_tick = dc21140m_autoconf(dev); } break; - + case ANS: switch (lp->local_state) { case 0: @@ -2851,7 +2850,7 @@ dc21140m_autoconf(struct net_device *dev) next_tick = dc21140m_autoconf(dev); } break; - + case 1: if ((sr=test_mii_reg(dev, MII_SR, MII_SR_ASSC, TRUE, 2000)) < 0) { next_tick = sr & ~TIMER_CB; @@ -2862,7 +2861,7 @@ dc21140m_autoconf(struct net_device *dev) lp->tmp = MII_SR_ASSC; anlpa = mii_rd(MII_ANLPA, lp->phy[lp->active].addr, DE4X5_MII); ana = mii_rd(MII_ANA, lp->phy[lp->active].addr, DE4X5_MII); - if (!(anlpa & MII_ANLPA_RF) && + if (!(anlpa & MII_ANLPA_RF) && (cap = anlpa & MII_ANLPA_TAF & ana)) { if (cap & MII_ANA_100M) { lp->fdx = ((ana & anlpa & MII_ANA_FDAM & MII_ANA_100M) ? TRUE : FALSE); @@ -2879,10 +2878,10 @@ dc21140m_autoconf(struct net_device *dev) break; } break; - + case SPD_DET: /* Choose 10Mb/s or 100Mb/s */ if (lp->timeout < 0) { - lp->tmp = (lp->phy[lp->active].id ? MII_SR_LKS : + lp->tmp = (lp->phy[lp->active].id ? MII_SR_LKS : (~gep_rd(dev) & GEP_LNP)); SET_100Mb_PDET; } @@ -2899,7 +2898,7 @@ dc21140m_autoconf(struct net_device *dev) next_tick = dc21140m_autoconf(dev); } break; - + case _100Mb: /* Set 100Mb/s */ next_tick = 3000; if (!lp->tx_enable) { @@ -2933,7 +2932,7 @@ dc21140m_autoconf(struct net_device *dev) } } break; - + case NC: if (lp->media != lp->c_media) { de4x5_dbg_media(dev); @@ -2943,7 +2942,7 @@ dc21140m_autoconf(struct net_device *dev) lp->tx_enable = FALSE; break; } - + return next_tick; } @@ -3002,7 +3001,7 @@ dc2114x_autoconf(struct net_device *dev) lp->media = AUI; } else { lp->media = SPD_DET; - if ((lp->infoblock_media == ANS) && + if ((lp->infoblock_media == ANS) && ((sr=is_anc_capable(dev)) & MII_SR_ANC)) { ana = (((sr >> 6) & MII_ANA_TAF) | MII_ANA_CSMA); ana &= (lp->fdx ? ~0 : ~MII_ANA_FDAM); @@ -3014,7 +3013,7 @@ dc2114x_autoconf(struct net_device *dev) next_tick = dc2114x_autoconf(dev); } break; - + case ANS: switch (lp->local_state) { case 0: @@ -3034,7 +3033,7 @@ dc2114x_autoconf(struct net_device *dev) next_tick = dc2114x_autoconf(dev); } break; - + case 1: if ((sr=test_mii_reg(dev, MII_SR, MII_SR_ASSC, TRUE, 2000)) < 0) { next_tick = sr & ~TIMER_CB; @@ -3045,7 +3044,7 @@ dc2114x_autoconf(struct net_device *dev) lp->tmp = MII_SR_ASSC; anlpa = mii_rd(MII_ANLPA, lp->phy[lp->active].addr, DE4X5_MII); ana = mii_rd(MII_ANA, lp->phy[lp->active].addr, DE4X5_MII); - if (!(anlpa & MII_ANLPA_RF) && + if (!(anlpa & MII_ANLPA_RF) && (cap = anlpa & MII_ANLPA_TAF & ana)) { if (cap & MII_ANA_100M) { lp->fdx = ((ana & anlpa & MII_ANA_FDAM & MII_ANA_100M) ? TRUE : FALSE); @@ -3087,11 +3086,11 @@ dc2114x_autoconf(struct net_device *dev) next_tick = 3000; } break; - + case AUI_SUSPECT: next_tick = de4x5_suspect_state(dev, 1000, AUI, ping_media, dc2114x_autoconf); break; - + case BNC: switch (lp->local_state) { case 0: @@ -3109,7 +3108,7 @@ dc2114x_autoconf(struct net_device *dev) next_tick = dc2114x_autoconf(dev); } break; - + case 1: if (!lp->tx_enable) { if ((sts = ping_media(dev, 3000)) < 0) { @@ -3130,11 +3129,11 @@ dc2114x_autoconf(struct net_device *dev) break; } break; - + case BNC_SUSPECT: next_tick = de4x5_suspect_state(dev, 1000, BNC, ping_media, dc2114x_autoconf); break; - + case SPD_DET: /* Choose 10Mb/s or 100Mb/s */ if (srom_map_media(dev) < 0) { lp->tcount++; @@ -3161,7 +3160,7 @@ dc2114x_autoconf(struct net_device *dev) next_tick = dc2114x_autoconf(dev); } else if (((lp->media == _100Mb) && is_100_up(dev)) || (((lp->media == _10Mb) || (lp->media == TP) || - (lp->media == BNC) || (lp->media == AUI)) && + (lp->media == BNC) || (lp->media == AUI)) && is_10_up(dev))) { next_tick = dc2114x_autoconf(dev); } else { @@ -3169,7 +3168,7 @@ dc2114x_autoconf(struct net_device *dev) lp->media = INIT; } break; - + case _10Mb: next_tick = 3000; if (!lp->tx_enable) { @@ -3208,7 +3207,7 @@ printk("Huh?: media:%02x\n", lp->media); lp->media = INIT; break; } - + return next_tick; } @@ -3231,7 +3230,7 @@ srom_map_media(struct net_device *dev) struct de4x5_private *lp = netdev_priv(dev); lp->fdx = 0; - if (lp->infoblock_media == lp->media) + if (lp->infoblock_media == lp->media) return 0; switch(lp->infoblock_media) { @@ -3270,7 +3269,7 @@ srom_map_media(struct net_device *dev) case SROM_100BASEFF: if (!lp->params.fdx) return -1; lp->fdx = TRUE; - case SROM_100BASEF: + case SROM_100BASEF: if (lp->params.fdx && !lp->fdx) return -1; lp->media = _100Mb; break; @@ -3280,8 +3279,8 @@ srom_map_media(struct net_device *dev) lp->fdx = lp->params.fdx; break; - default: - printk("%s: Bad media code [%d] detected in SROM!\n", dev->name, + default: + printk("%s: Bad media code [%d] detected in SROM!\n", dev->name, lp->infoblock_media); return -1; break; @@ -3359,7 +3358,7 @@ test_media(struct net_device *dev, s32 irqs, s32 irq_mask, s32 csr13, s32 csr14, struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; s32 sts, csr12; - + if (lp->timeout < 0) { lp->timeout = msec/100; if (!lp->useSROM) { /* Already done if by SROM, else dc2104[01] */ @@ -3372,22 +3371,22 @@ test_media(struct net_device *dev, s32 irqs, s32 irq_mask, s32 csr13, s32 csr14, /* clear all pending interrupts */ sts = inl(DE4X5_STS); outl(sts, DE4X5_STS); - + /* clear csr12 NRA and SRA bits */ if ((lp->chipset == DC21041) || lp->useSROM) { csr12 = inl(DE4X5_SISR); outl(csr12, DE4X5_SISR); } } - + sts = inl(DE4X5_STS) & ~TIMER_CB; - + if (!(sts & irqs) && --lp->timeout) { sts = 100 | TIMER_CB; } else { lp->timeout = -1; } - + return sts; } @@ -3397,11 +3396,11 @@ test_tp(struct net_device *dev, s32 msec) struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; int sisr; - + if (lp->timeout < 0) { lp->timeout = msec/100; } - + sisr = (inl(DE4X5_SISR) & ~TIMER_CB) & (SISR_LKF | SISR_NCR); if (sisr && --lp->timeout) { @@ -3409,7 +3408,7 @@ test_tp(struct net_device *dev, s32 msec) } else { lp->timeout = -1; } - + return sisr; } @@ -3436,7 +3435,7 @@ test_for_100Mb(struct net_device *dev, int msec) lp->timeout = msec/SAMPLE_INTERVAL; } } - + if (lp->phy[lp->active].id || lp->useSROM) { gep = is_100_up(dev) | is_spd_100(dev); } else { @@ -3447,7 +3446,7 @@ test_for_100Mb(struct net_device *dev, int msec) } else { lp->timeout = -1; } - + return gep; } @@ -3459,13 +3458,13 @@ wait_for_link(struct net_device *dev) if (lp->timeout < 0) { lp->timeout = 1; } - + if (lp->timeout--) { return TIMER_CB; } else { lp->timeout = -1; } - + return 0; } @@ -3479,21 +3478,21 @@ test_mii_reg(struct net_device *dev, int reg, int mask, int pol, long msec) struct de4x5_private *lp = netdev_priv(dev); int test; u_long iobase = dev->base_addr; - + if (lp->timeout < 0) { lp->timeout = msec/100; } - + if (pol) pol = ~0; reg = mii_rd((u_char)reg, lp->phy[lp->active].addr, DE4X5_MII) & mask; test = (reg ^ pol) & mask; - + if (test && --lp->timeout) { reg = 100 | TIMER_CB; } else { lp->timeout = -1; } - + return reg; } @@ -3503,7 +3502,7 @@ is_spd_100(struct net_device *dev) struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; int spd; - + if (lp->useMII) { spd = mii_rd(lp->phy[lp->active].spd.reg, lp->phy[lp->active].addr, DE4X5_MII); spd = ~(spd ^ lp->phy[lp->active].spd.value); @@ -3517,7 +3516,7 @@ is_spd_100(struct net_device *dev) spd = (lp->asBitValid & (lp->asPolarity ^ (gep_rd(dev) & lp->asBit))) | (lp->linkOK & ~lp->asBitValid); } - + return spd; } @@ -3526,7 +3525,7 @@ is_100_up(struct net_device *dev) { struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; - + if (lp->useMII) { /* Double read for sticky bits & temporary drops */ mii_rd(MII_SR, lp->phy[lp->active].addr, DE4X5_MII); @@ -3547,7 +3546,7 @@ is_10_up(struct net_device *dev) { struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; - + if (lp->useMII) { /* Double read for sticky bits & temporary drops */ mii_rd(MII_SR, lp->phy[lp->active].addr, DE4X5_MII); @@ -3570,7 +3569,7 @@ is_anc_capable(struct net_device *dev) { struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; - + if (lp->phy[lp->active].id && (!lp->useSROM || lp->useMII)) { return (mii_rd(MII_SR, lp->phy[lp->active].addr, DE4X5_MII)); } else if ((lp->chipset & ~0x00ff) == DC2114x) { @@ -3590,24 +3589,24 @@ ping_media(struct net_device *dev, int msec) struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; int sisr; - + if (lp->timeout < 0) { lp->timeout = msec/100; - + lp->tmp = lp->tx_new; /* Remember the ring position */ load_packet(dev, lp->frame, TD_LS | TD_FS | sizeof(lp->frame), (struct sk_buff *)1); lp->tx_new = (++lp->tx_new) % lp->txRingSize; outl(POLL_DEMAND, DE4X5_TPD); } - + sisr = inl(DE4X5_SISR); - if ((!(sisr & SISR_NCR)) && - ((s32)le32_to_cpu(lp->tx_ring[lp->tmp].status) < 0) && + if ((!(sisr & SISR_NCR)) && + ((s32)le32_to_cpu(lp->tx_ring[lp->tmp].status) < 0) && (--lp->timeout)) { sisr = 100 | TIMER_CB; } else { - if ((!(sisr & SISR_NCR)) && + if ((!(sisr & SISR_NCR)) && !(le32_to_cpu(lp->tx_ring[lp->tmp].status) & (T_OWN | TD_ES)) && lp->timeout) { sisr = 0; @@ -3616,7 +3615,7 @@ ping_media(struct net_device *dev, int msec) } lp->timeout = -1; } - + return sisr; } @@ -3668,7 +3667,7 @@ de4x5_alloc_rx_buff(struct net_device *dev, int index, int len) } else { /* Linear buffer */ memcpy(skb_put(p,len),lp->rx_bufs + lp->rx_old * RX_BUFF_SZ,len); } - + return p; #endif } @@ -3751,23 +3750,23 @@ de4x5_rst_desc_ring(struct net_device *dev) outl(lp->dma_rings, DE4X5_RRBA); outl(lp->dma_rings + NUM_RX_DESC * sizeof(struct de4x5_desc), DE4X5_TRBA); - + lp->rx_new = lp->rx_old = 0; lp->tx_new = lp->tx_old = 0; - + for (i = 0; i < lp->rxRingSize; i++) { lp->rx_ring[i].status = cpu_to_le32(R_OWN); } - + for (i = 0; i < lp->txRingSize; i++) { lp->tx_ring[i].status = cpu_to_le32(0); } - + barrier(); lp->cache.save_cnt--; START_DE4X5; } - + return; } @@ -3792,7 +3791,7 @@ de4x5_cache_state(struct net_device *dev, int flag) gep_wr(lp->cache.gepc, dev); gep_wr(lp->cache.gep, dev); } else { - reset_init_sia(dev, lp->cache.csr13, lp->cache.csr14, + reset_init_sia(dev, lp->cache.csr13, lp->cache.csr14, lp->cache.csr15); } break; @@ -3854,25 +3853,25 @@ test_ans(struct net_device *dev, s32 irqs, s32 irq_mask, s32 msec) struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; s32 sts, ans; - + if (lp->timeout < 0) { lp->timeout = msec/100; outl(irq_mask, DE4X5_IMR); - + /* clear all pending interrupts */ sts = inl(DE4X5_STS); outl(sts, DE4X5_STS); } - + ans = inl(DE4X5_SISR) & SISR_ANS; sts = inl(DE4X5_STS) & ~TIMER_CB; - + if (!(sts & irqs) && (ans ^ ANS_NWOK) && --lp->timeout) { sts = 100 | TIMER_CB; } else { lp->timeout = -1; } - + return sts; } @@ -3882,7 +3881,7 @@ de4x5_setup_intr(struct net_device *dev) struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; s32 imr, sts; - + if (inl(DE4X5_OMR) & OMR_SR) { /* Only unmask if TX/RX is enabled */ imr = 0; UNMASK_IRQs; @@ -3890,7 +3889,7 @@ de4x5_setup_intr(struct net_device *dev) outl(sts, DE4X5_STS); ENABLE_IRQs; } - + return; } @@ -3936,17 +3935,17 @@ create_packet(struct net_device *dev, char *frame, int len) { int i; char *buf = frame; - + for (i=0; idev_addr[i]; } for (i=0; idev_addr[i]; } - + *buf++ = 0; /* Packet length (2 bytes) */ *buf++ = 1; - + return; } @@ -3978,7 +3977,7 @@ static int PCI_signature(char *name, struct de4x5_private *lp) { int i, status = 0, siglen = sizeof(de4x5_signatures)/sizeof(c_char *); - + if (lp->chipset == DC21040) { strcpy(name, "DE434/5"); return status; @@ -4007,7 +4006,7 @@ PCI_signature(char *name, struct de4x5_private *lp) } else if ((lp->chipset & ~0x00ff) == DC2114x) { lp->useSROM = TRUE; } - + return status; } @@ -4024,7 +4023,7 @@ DevicePresent(struct net_device *dev, u_long aprom_addr) { int i, j=0; struct de4x5_private *lp = netdev_priv(dev); - + if (lp->chipset == DC21040) { if (lp->bus == EISA) { enet_addr_rst(aprom_addr); /* Reset Ethernet Address ROM Pointer */ @@ -4049,7 +4048,7 @@ DevicePresent(struct net_device *dev, u_long aprom_addr) } de4x5_dbg_srom((struct de4x5_srom *)&lp->srom); } - + return; } @@ -4071,11 +4070,11 @@ enet_addr_rst(u_long aprom_addr) short sigLength=0; s8 data; int i, j; - + dev.llsig.a = ETH_PROM_SIG; dev.llsig.b = ETH_PROM_SIG; sigLength = sizeof(u32) << 1; - + for (i=0,j=0;j 0xffff) k-=0xffff; - + if (lp->bus == PCI) { if (lp->chipset == DC21040) { while ((tmp = inl(DE4X5_APROM)) < 0); @@ -4133,11 +4132,11 @@ get_hw_addr(struct net_device *dev) k += (u_short) ((tmp = inb(EISA_APROM)) << 8); dev->dev_addr[i++] = (u_char) tmp; } - + if (k > 0xffff) k-=0xffff; } if (k == 0xffff) k=0; - + if (lp->bus == PCI) { if (lp->chipset == DC21040) { while ((tmp = inl(DE4X5_APROM)) < 0); @@ -4156,7 +4155,7 @@ get_hw_addr(struct net_device *dev) srom_repair(dev, broken); #ifdef CONFIG_PPC_MULTIPLATFORM - /* + /* ** If the address starts with 00 a0, we have to bit-reverse ** each byte of the address. */ @@ -4245,7 +4244,7 @@ test_bad_enet(struct net_device *dev, int status) for (tmp=0,i=0; idev_addr[i]; if ((tmp == 0) || (tmp == 0x5fa)) { - if ((lp->chipset == last.chipset) && + if ((lp->chipset == last.chipset) && (lp->bus_num == last.bus) && (lp->bus_num > 0)) { for (i=0; idev_addr[i] = last.addr[i]; for (i=ETH_ALEN-1; i>2; --i) { @@ -4275,7 +4274,7 @@ test_bad_enet(struct net_device *dev, int status) static int an_exception(struct de4x5_private *lp) { - if ((*(u_short *)lp->srom.sub_vendor_id == 0x00c0) && + if ((*(u_short *)lp->srom.sub_vendor_id == 0x00c0) && (*(u_short *)lp->srom.sub_system_id == 0x95e0)) { return -1; } @@ -4290,11 +4289,11 @@ static short srom_rd(u_long addr, u_char offset) { sendto_srom(SROM_RD | SROM_SR, addr); - + srom_latch(SROM_RD | SROM_SR | DT_CS, addr); srom_command(SROM_RD | SROM_SR | DT_IN | DT_CS, addr); srom_address(SROM_RD | SROM_SR | DT_CS, addr, offset); - + return srom_data(SROM_RD | SROM_SR | DT_CS, addr); } @@ -4304,7 +4303,7 @@ srom_latch(u_int command, u_long addr) sendto_srom(command, addr); sendto_srom(command | DT_CLK, addr); sendto_srom(command, addr); - + return; } @@ -4314,7 +4313,7 @@ srom_command(u_int command, u_long addr) srom_latch(command, addr); srom_latch(command, addr); srom_latch((command & 0x0000ff00) | DT_CS, addr); - + return; } @@ -4322,15 +4321,15 @@ static void srom_address(u_int command, u_long addr, u_char offset) { int i, a; - + a = offset << 2; for (i=0; i<6; i++, a <<= 1) { srom_latch(command | ((a & 0x80) ? DT_IN : 0), addr); } udelay(1); - + i = (getfrom_srom(addr) >> 3) & 0x01; - + return; } @@ -4340,17 +4339,17 @@ srom_data(u_int command, u_long addr) int i; short word = 0; s32 tmp; - + for (i=0; i<16; i++) { sendto_srom(command | DT_CLK, addr); tmp = getfrom_srom(addr); sendto_srom(command, addr); - + word = (word << 1) | ((tmp >> 3) & 0x01); } - + sendto_srom(command & 0x0000ff00, addr); - + return word; } @@ -4359,13 +4358,13 @@ static void srom_busy(u_int command, u_long addr) { sendto_srom((command & 0x0000ff00) | DT_CS, addr); - + while (!((getfrom_srom(addr) >> 3) & 0x01)) { mdelay(1); } - + sendto_srom(command & 0x0000ff00, addr); - + return; } */ @@ -4375,7 +4374,7 @@ sendto_srom(u_int command, u_long addr) { outl(command, addr); udelay(1); - + return; } @@ -4383,10 +4382,10 @@ static int getfrom_srom(u_long addr) { s32 tmp; - + tmp = inl(addr); udelay(1); - + return tmp; } @@ -4403,7 +4402,7 @@ srom_infoleaf_info(struct net_device *dev) } if (i == INFOLEAF_SIZE) { lp->useSROM = FALSE; - printk("%s: Cannot find correct chipset for SROM decoding!\n", + printk("%s: Cannot find correct chipset for SROM decoding!\n", dev->name); return -ENXIO; } @@ -4420,7 +4419,7 @@ srom_infoleaf_info(struct net_device *dev) } if (i == 0) { lp->useSROM = FALSE; - printk("%s: Cannot find correct PCI device [%d] for SROM decoding!\n", + printk("%s: Cannot find correct PCI device [%d] for SROM decoding!\n", dev->name, lp->device); return -ENXIO; } @@ -4494,9 +4493,9 @@ srom_exec(struct net_device *dev, u_char *p) if (((lp->ibn != 1) && (lp->ibn != 3) && (lp->ibn != 5)) || !count) return; if (lp->chipset != DC21140) RESET_SIA; - + while (count--) { - gep_wr(((lp->chipset==DC21140) && (lp->ibn!=5) ? + gep_wr(((lp->chipset==DC21140) && (lp->ibn!=5) ? *p++ : TWIDDLE(w++)), dev); mdelay(2); /* 2ms per action */ } @@ -4514,13 +4513,13 @@ srom_exec(struct net_device *dev, u_char *p) ** unless I implement the DC21041 SROM functions. There's no need ** since the existing code will be satisfactory for all boards. */ -static int +static int dc21041_infoleaf(struct net_device *dev) { return DE4X5_AUTOSENSE_MS; } -static int +static int dc21140_infoleaf(struct net_device *dev) { struct de4x5_private *lp = netdev_priv(dev); @@ -4558,7 +4557,7 @@ dc21140_infoleaf(struct net_device *dev) return next_tick & ~TIMER_CB; } -static int +static int dc21142_infoleaf(struct net_device *dev) { struct de4x5_private *lp = netdev_priv(dev); @@ -4593,7 +4592,7 @@ dc21142_infoleaf(struct net_device *dev) return next_tick & ~TIMER_CB; } -static int +static int dc21143_infoleaf(struct net_device *dev) { struct de4x5_private *lp = netdev_priv(dev); @@ -4631,7 +4630,7 @@ dc21143_infoleaf(struct net_device *dev) ** The compact infoblock is only designed for DC21140[A] chips, so ** we'll reuse the dc21140m_autoconf function. Non MII media only. */ -static int +static int compact_infoblock(struct net_device *dev, u_char count, u_char *p) { struct de4x5_private *lp = netdev_priv(dev); @@ -4671,7 +4670,7 @@ compact_infoblock(struct net_device *dev, u_char count, u_char *p) /* ** This block describes non MII media for the DC21140[A] only. */ -static int +static int type0_infoblock(struct net_device *dev, u_char count, u_char *p) { struct de4x5_private *lp = netdev_priv(dev); @@ -4711,7 +4710,7 @@ type0_infoblock(struct net_device *dev, u_char count, u_char *p) /* These functions are under construction! */ -static int +static int type1_infoblock(struct net_device *dev, u_char count, u_char *p) { struct de4x5_private *lp = netdev_priv(dev); @@ -4750,7 +4749,7 @@ type1_infoblock(struct net_device *dev, u_char count, u_char *p) return dc21140m_autoconf(dev); } -static int +static int type2_infoblock(struct net_device *dev, u_char count, u_char *p) { struct de4x5_private *lp = netdev_priv(dev); @@ -4791,7 +4790,7 @@ type2_infoblock(struct net_device *dev, u_char count, u_char *p) return dc2114x_autoconf(dev); } -static int +static int type3_infoblock(struct net_device *dev, u_char count, u_char *p) { struct de4x5_private *lp = netdev_priv(dev); @@ -4833,7 +4832,7 @@ type3_infoblock(struct net_device *dev, u_char count, u_char *p) return dc2114x_autoconf(dev); } -static int +static int type4_infoblock(struct net_device *dev, u_char count, u_char *p) { struct de4x5_private *lp = netdev_priv(dev); @@ -4878,7 +4877,7 @@ type4_infoblock(struct net_device *dev, u_char count, u_char *p) ** This block type provides information for resetting external devices ** (chips) through the General Purpose Register. */ -static int +static int type5_infoblock(struct net_device *dev, u_char count, u_char *p) { struct de4x5_private *lp = netdev_priv(dev); @@ -4916,7 +4915,7 @@ mii_rd(u_char phyreg, u_char phyaddr, u_long ioaddr) mii_address(phyaddr, ioaddr); /* PHY address to be accessed */ mii_address(phyreg, ioaddr); /* PHY Register to read */ mii_ta(MII_STRD, ioaddr); /* Turn around time - 2 MDC */ - + return mii_rdata(ioaddr); /* Read data */ } @@ -4931,7 +4930,7 @@ mii_wr(int data, u_char phyreg, u_char phyaddr, u_long ioaddr) mii_ta(MII_STWR, ioaddr); /* Turn around time - 2 MDC */ data = mii_swap(data, 16); /* Swap data bit ordering */ mii_wdata(data, 16, ioaddr); /* Write data */ - + return; } @@ -4940,12 +4939,12 @@ mii_rdata(u_long ioaddr) { int i; s32 tmp = 0; - + for (i=0; i<16; i++) { tmp <<= 1; tmp |= getfrom_mii(MII_MRD | MII_RD, ioaddr); } - + return tmp; } @@ -4953,12 +4952,12 @@ static void mii_wdata(int data, int len, u_long ioaddr) { int i; - + for (i=0; i>= 1; } - + return; } @@ -4966,13 +4965,13 @@ static void mii_address(u_char addr, u_long ioaddr) { int i; - + addr = mii_swap(addr, 5); for (i=0; i<5; i++) { sendto_mii(MII_MWR | MII_WR, addr, ioaddr); addr >>= 1; } - + return; } @@ -4980,12 +4979,12 @@ static void mii_ta(u_long rw, u_long ioaddr) { if (rw == MII_STWR) { - sendto_mii(MII_MWR | MII_WR, 1, ioaddr); - sendto_mii(MII_MWR | MII_WR, 0, ioaddr); + sendto_mii(MII_MWR | MII_WR, 1, ioaddr); + sendto_mii(MII_MWR | MII_WR, 0, ioaddr); } else { getfrom_mii(MII_MRD | MII_RD, ioaddr); /* Tri-state MDIO */ } - + return; } @@ -4993,13 +4992,13 @@ static int mii_swap(int data, int len) { int i, tmp = 0; - + for (i=0; i>= 1; } - + return tmp; } @@ -5007,13 +5006,13 @@ static void sendto_mii(u32 command, int data, u_long ioaddr) { u32 j; - + j = (data & 1) << 17; outl(command | j, ioaddr); udelay(1); outl(command | MII_MDC | j, ioaddr); udelay(1); - + return; } @@ -5024,7 +5023,7 @@ getfrom_mii(u32 command, u_long ioaddr) udelay(1); outl(command | MII_MDC, ioaddr); udelay(1); - + return ((inl(ioaddr) >> 19) & 1); } @@ -5085,7 +5084,7 @@ mii_get_phy(struct net_device *dev) u_long iobase = dev->base_addr; int i, j, k, n, limit=sizeof(phy_info)/sizeof(struct phy_table); int id; - + lp->active = 0; lp->useMII = TRUE; @@ -5094,7 +5093,7 @@ mii_get_phy(struct net_device *dev) lp->phy[lp->active].addr = i; if (i==0) n++; /* Count cycles */ while (de4x5_reset_phy(dev)<0) udelay(100);/* Wait for reset */ - id = mii_get_oui(i, DE4X5_MII); + id = mii_get_oui(i, DE4X5_MII); if ((id == 0) || (id == 65535)) continue; /* Valid ID? */ for (j=0; jphy[k].id && (k < DE4X5_MAX_PHY); k++) { /*For each PHY*/ mii_wr(MII_CR_RST, MII_CR, lp->phy[k].addr, DE4X5_MII); while (mii_rd(MII_CR, lp->phy[k].addr, DE4X5_MII) & MII_CR_RST); - + de4x5_dbg_mii(dev, k); } } @@ -5148,12 +5147,12 @@ build_setup_frame(struct net_device *dev, int mode) struct de4x5_private *lp = netdev_priv(dev); int i; char *pa = lp->setup_frame; - + /* Initialise the setup frame */ if (mode == ALL) { memset(lp->setup_frame, 0, SETUP_FRAME_LEN); } - + if (lp->setup_f == HASH_PERF) { for (pa=lp->setup_frame+IMPERF_PA_OFFSET, i=0; idev_addr[i]; /* Host address */ @@ -5170,7 +5169,7 @@ build_setup_frame(struct net_device *dev, int mode) if (i & 0x01) pa += 4; } } - + return pa; /* Points to the next entry */ } @@ -5178,7 +5177,7 @@ static void enable_ast(struct net_device *dev, u32 time_out) { timeout(dev, (void *)&de4x5_ast, (u_long)dev, time_out); - + return; } @@ -5186,9 +5185,9 @@ static void disable_ast(struct net_device *dev) { struct de4x5_private *lp = netdev_priv(dev); - + del_timer(&lp->timer); - + return; } @@ -5207,10 +5206,10 @@ de4x5_switch_mac_port(struct net_device *dev) omr |= lp->infoblock_csr6; if (omr & OMR_PS) omr |= OMR_HBD; outl(omr, DE4X5_OMR); - + /* Soft Reset */ RESET_DE4X5; - + /* Restore the GEP - especially for COMPACT and Type 0 Infoblocks */ if (lp->chipset == DC21140) { gep_wr(lp->cache.gepc, dev); @@ -5263,21 +5262,21 @@ timeout(struct net_device *dev, void (*fn)(u_long data), u_long data, u_long mse { struct de4x5_private *lp = netdev_priv(dev); int dt; - + /* First, cancel any pending timer events */ del_timer(&lp->timer); - + /* Convert msec to ticks */ dt = (msec * HZ) / 1000; if (dt==0) dt=1; - + /* Set up timer */ init_timer(&lp->timer); lp->timer.expires = jiffies + dt; lp->timer.function = fn; lp->timer.data = data; add_timer(&lp->timer); - + return; } @@ -5375,7 +5374,7 @@ de4x5_dbg_open(struct net_device *dev) { struct de4x5_private *lp = netdev_priv(dev); int i; - + if (de4x5_debug & DEBUG_OPEN) { printk("%s: de4x5 opening with irq %d\n",dev->name,dev->irq); printk("\tphysical address: "); @@ -5413,11 +5412,11 @@ de4x5_dbg_open(struct net_device *dev) } } printk("...0x%8.8x\n", le32_to_cpu(lp->tx_ring[i].buf)); - printk("Ring size: \nRX: %d\nTX: %d\n", - (short)lp->rxRingSize, - (short)lp->txRingSize); + printk("Ring size: \nRX: %d\nTX: %d\n", + (short)lp->rxRingSize, + (short)lp->txRingSize); } - + return; } @@ -5426,7 +5425,7 @@ de4x5_dbg_mii(struct net_device *dev, int k) { struct de4x5_private *lp = netdev_priv(dev); u_long iobase = dev->base_addr; - + if (de4x5_debug & DEBUG_MII) { printk("\nMII device address: %d\n", lp->phy[k].addr); printk("MII CR: %x\n",mii_rd(MII_CR,lp->phy[k].addr,DE4X5_MII)); @@ -5445,7 +5444,7 @@ de4x5_dbg_mii(struct net_device *dev, int k) printk("MII 20: %x\n",mii_rd(0x14,lp->phy[k].addr,DE4X5_MII)); } } - + return; } @@ -5453,17 +5452,17 @@ static void de4x5_dbg_media(struct net_device *dev) { struct de4x5_private *lp = netdev_priv(dev); - + if (lp->media != lp->c_media) { if (de4x5_debug & DEBUG_MEDIA) { printk("%s: media is %s%s\n", dev->name, (lp->media == NC ? "unconnected, link down or incompatible connection" : (lp->media == TP ? "TP" : (lp->media == ANS ? "TP/Nway" : - (lp->media == BNC ? "BNC" : - (lp->media == AUI ? "AUI" : - (lp->media == BNC_AUI ? "BNC/AUI" : - (lp->media == EXT_SIA ? "EXT SIA" : + (lp->media == BNC ? "BNC" : + (lp->media == AUI ? "AUI" : + (lp->media == BNC_AUI ? "BNC/AUI" : + (lp->media == EXT_SIA ? "EXT SIA" : (lp->media == _100Mb ? "100Mb/s" : (lp->media == _10Mb ? "10Mb/s" : "???" @@ -5471,7 +5470,7 @@ de4x5_dbg_media(struct net_device *dev) } lp->c_media = lp->media; } - + return; } @@ -5554,7 +5553,7 @@ de4x5_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) u32 lval[36]; } tmp; u_long flags = 0; - + switch(ioc->cmd) { case DE4X5_GET_HWADDR: /* Get the hardware address */ ioc->len = ETH_ALEN; @@ -5575,7 +5574,7 @@ de4x5_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) } build_setup_frame(dev, PHYS_ADDR_ONLY); /* Set up the descriptor and give ownership to the card */ - load_packet(dev, lp->setup_frame, TD_IC | PERFECT_F | TD_SET | + load_packet(dev, lp->setup_frame, TD_IC | PERFECT_F | TD_SET | SETUP_FRAME_LEN, (struct sk_buff *)1); lp->tx_new = (++lp->tx_new) % lp->txRingSize; outl(POLL_DEMAND, DE4X5_TPD); /* Start the TX */ @@ -5617,8 +5616,8 @@ de4x5_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) spin_lock_irqsave(&lp->lock, flags); memcpy(&statbuf, &lp->pktStats, ioc->len); spin_unlock_irqrestore(&lp->lock, flags); - if (copy_to_user(ioc->data, &statbuf, ioc->len)) - return -EFAULT; + if (copy_to_user(ioc->data, &statbuf, ioc->len)) + return -EFAULT; break; } case DE4X5_CLR_STATS: /* Zero out the driver statistics */ @@ -5652,9 +5651,9 @@ de4x5_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) ioc->len = j; if (copy_to_user(ioc->data, tmp.addr, ioc->len)) return -EFAULT; break; - + #define DE4X5_DUMP 0x0f /* Dump the DE4X5 Status */ -/* +/* case DE4X5_DUMP: j = 0; tmp.addr[j++] = dev->irq; @@ -5664,7 +5663,7 @@ de4x5_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) tmp.addr[j++] = lp->rxRingSize; tmp.lval[j>>2] = (long)lp->rx_ring; j+=4; tmp.lval[j>>2] = (long)lp->tx_ring; j+=4; - + for (i=0;irxRingSize-1;i++){ if (i < 3) { tmp.lval[j>>2] = (long)&lp->rx_ring[i].status; j+=4; @@ -5677,7 +5676,7 @@ de4x5_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) } } tmp.lval[j>>2] = (long)&lp->tx_ring[i].status; j+=4; - + for (i=0;irxRingSize-1;i++){ if (i < 3) { tmp.lval[j>>2] = (s32)le32_to_cpu(lp->rx_ring[i].buf); j+=4; @@ -5690,14 +5689,14 @@ de4x5_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) } } tmp.lval[j>>2] = (s32)le32_to_cpu(lp->tx_ring[i].buf); j+=4; - + for (i=0;irxRingSize;i++){ tmp.lval[j>>2] = le32_to_cpu(lp->rx_ring[i].status); j+=4; } for (i=0;itxRingSize;i++){ tmp.lval[j>>2] = le32_to_cpu(lp->tx_ring[i].status); j+=4; } - + tmp.lval[j>>2] = inl(DE4X5_BMR); j+=4; tmp.lval[j>>2] = inl(DE4X5_TPD); j+=4; tmp.lval[j>>2] = inl(DE4X5_RPD); j+=4; @@ -5706,18 +5705,18 @@ de4x5_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) tmp.lval[j>>2] = inl(DE4X5_STS); j+=4; tmp.lval[j>>2] = inl(DE4X5_OMR); j+=4; tmp.lval[j>>2] = inl(DE4X5_IMR); j+=4; - tmp.lval[j>>2] = lp->chipset; j+=4; + tmp.lval[j>>2] = lp->chipset; j+=4; if (lp->chipset == DC21140) { tmp.lval[j>>2] = gep_rd(dev); j+=4; } else { tmp.lval[j>>2] = inl(DE4X5_SISR); j+=4; tmp.lval[j>>2] = inl(DE4X5_SICR); j+=4; tmp.lval[j>>2] = inl(DE4X5_STRR); j+=4; - tmp.lval[j>>2] = inl(DE4X5_SIGR); j+=4; + tmp.lval[j>>2] = inl(DE4X5_SIGR); j+=4; } - tmp.lval[j>>2] = lp->phy[lp->active].id; j+=4; + tmp.lval[j>>2] = lp->phy[lp->active].id; j+=4; if (lp->phy[lp->active].id && (!lp->useSROM || lp->useMII)) { - tmp.lval[j>>2] = lp->active; j+=4; + tmp.lval[j>>2] = lp->active; j+=4; tmp.lval[j>>2]=mii_rd(MII_CR,lp->phy[lp->active].addr,DE4X5_MII); j+=4; tmp.lval[j>>2]=mii_rd(MII_SR,lp->phy[lp->active].addr,DE4X5_MII); j+=4; tmp.lval[j>>2]=mii_rd(MII_ID0,lp->phy[lp->active].addr,DE4X5_MII); j+=4; @@ -5734,10 +5733,10 @@ de4x5_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) tmp.lval[j>>2]=mii_rd(0x14,lp->phy[lp->active].addr,DE4X5_MII); j+=4; } } - + tmp.addr[j++] = lp->txRingSize; tmp.addr[j++] = netif_queue_stopped(dev); - + ioc->len = j; if (copy_to_user(ioc->data, tmp.addr, ioc->len)) return -EFAULT; break; @@ -5746,7 +5745,7 @@ de4x5_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) default: return -EOPNOTSUPP; } - + return status; } diff --git a/drivers/net/tulip/de4x5.h b/drivers/net/tulip/de4x5.h index ad37a4074..57226e5eb 100644 --- a/drivers/net/tulip/de4x5.h +++ b/drivers/net/tulip/de4x5.h @@ -38,11 +38,11 @@ /* ** EISA Register Address Map */ -#define EISA_ID iobase+0x0c80 /* EISA ID Registers */ -#define EISA_ID0 iobase+0x0c80 /* EISA ID Register 0 */ -#define EISA_ID1 iobase+0x0c81 /* EISA ID Register 1 */ -#define EISA_ID2 iobase+0x0c82 /* EISA ID Register 2 */ -#define EISA_ID3 iobase+0x0c83 /* EISA ID Register 3 */ +#define EISA_ID iobase+0x0c80 /* EISA ID Registers */ +#define EISA_ID0 iobase+0x0c80 /* EISA ID Register 0 */ +#define EISA_ID1 iobase+0x0c81 /* EISA ID Register 1 */ +#define EISA_ID2 iobase+0x0c82 /* EISA ID Register 2 */ +#define EISA_ID3 iobase+0x0c83 /* EISA ID Register 3 */ #define EISA_CR iobase+0x0c84 /* EISA Control Register */ #define EISA_REG0 iobase+0x0c88 /* EISA Configuration Register 0 */ #define EISA_REG1 iobase+0x0c89 /* EISA Configuration Register 1 */ @@ -1008,8 +1008,8 @@ struct de4x5_ioctl { unsigned char __user *data; /* Pointer to the data buffer */ }; -/* -** Recognised commands for the driver +/* +** Recognised commands for the driver */ #define DE4X5_GET_HWADDR 0x01 /* Get the hardware address */ #define DE4X5_SET_HWADDR 0x02 /* Set the hardware address */ diff --git a/drivers/net/tulip/dmfe.c b/drivers/net/tulip/dmfe.c index 74e9075d9..4e5b0f2ac 100644 --- a/drivers/net/tulip/dmfe.c +++ b/drivers/net/tulip/dmfe.c @@ -50,7 +50,7 @@ forget to unmap PCI mapped skbs. Alan Cox - Added new PCI identifiers provided by Clear Zhang at ALi + Added new PCI identifiers provided by Clear Zhang at ALi for their 1563 ethernet device. TODO @@ -506,7 +506,7 @@ static int dmfe_open(struct DEVICE *dev) DMFE_DBUG(0, "dmfe_open", 0); - ret = request_irq(dev->irq, &dmfe_interrupt, SA_SHIRQ, dev->name, dev); + ret = request_irq(dev->irq, &dmfe_interrupt, IRQF_SHARED, dev->name, dev); if (ret) return ret; diff --git a/drivers/net/tulip/eeprom.c b/drivers/net/tulip/eeprom.c index fbd9ab60b..5ffbd5b30 100644 --- a/drivers/net/tulip/eeprom.c +++ b/drivers/net/tulip/eeprom.c @@ -96,11 +96,11 @@ static const char *block_name[] __devinitdata = { * tulip_build_fake_mediatable - Build a fake mediatable entry. * @tp: Ptr to the tulip private data. * - * Some cards like the 3x5 HSC cards (J3514A) do not have a standard + * Some cards like the 3x5 HSC cards (J3514A) do not have a standard * srom and can not be handled under the fixup routine. These cards - * still need a valid mediatable entry for correct csr12 setup and + * still need a valid mediatable entry for correct csr12 setup and * mii handling. - * + * * Since this is currently a parisc-linux specific function, the * #ifdef __hppa__ should completely optimize this function away for * non-parisc hardware. @@ -140,7 +140,7 @@ static void __devinit tulip_build_fake_mediatable(struct tulip_private *tp) tp->flags |= HAS_PHY_IRQ; tp->csr12_shadow = -1; } -#endif +#endif } void __devinit tulip_parse_eeprom(struct net_device *dev) diff --git a/drivers/net/tulip/interrupt.c b/drivers/net/tulip/interrupt.c index bb3558164..99ccf2ebb 100644 --- a/drivers/net/tulip/interrupt.c +++ b/drivers/net/tulip/interrupt.c @@ -16,7 +16,6 @@ #include #include "tulip.h" -#include #include int tulip_rx_copybreak; @@ -139,22 +138,22 @@ int tulip_poll(struct net_device *dev, int *budget) } /* Acknowledge current RX interrupt sources. */ iowrite32((RxIntr | RxNoBuf), tp->base_addr + CSR5); - - + + /* If we own the next entry, it is a new packet. Send it up. */ while ( ! (tp->rx_ring[entry].status & cpu_to_le32(DescOwned))) { s32 status = le32_to_cpu(tp->rx_ring[entry].status); - - + + if (tp->dirty_rx + RX_RING_SIZE == tp->cur_rx) break; - + if (tulip_debug > 5) printk(KERN_DEBUG "%s: In tulip_rx(), entry %d %8.8x.\n", dev->name, entry, status); if (--rx_work_limit < 0) goto not_done; - + if ((status & 0x38008300) != 0x0300) { if ((status & 0x38000300) != 0x0300) { /* Ingore earlier buffers. */ @@ -180,7 +179,7 @@ int tulip_poll(struct net_device *dev, int *budget) /* Omit the four octet CRC from the length. */ short pkt_len = ((status >> 16) & 0x7ff) - 4; struct sk_buff *skb; - + #ifndef final_version if (pkt_len > 1518) { printk(KERN_WARNING "%s: Bogus packet size of %d (%#x).\n", @@ -213,7 +212,7 @@ int tulip_poll(struct net_device *dev, int *budget) } else { /* Pass up the skb already on the Rx ring. */ char *temp = skb_put(skb = tp->rx_buffers[entry].skb, pkt_len); - + #ifndef final_version if (tp->rx_buffers[entry].mapping != le32_to_cpu(tp->rx_ring[entry].buffer1)) { @@ -225,17 +224,17 @@ int tulip_poll(struct net_device *dev, int *budget) skb->head, temp); } #endif - + pci_unmap_single(tp->pdev, tp->rx_buffers[entry].mapping, PKT_BUF_SZ, PCI_DMA_FROMDEVICE); - + tp->rx_buffers[entry].skb = NULL; tp->rx_buffers[entry].mapping = 0; } skb->protocol = eth_type_trans(skb, dev); - + netif_receive_skb(skb); - + dev->last_rx = jiffies; tp->stats.rx_packets++; tp->stats.rx_bytes += pkt_len; @@ -245,12 +244,12 @@ int tulip_poll(struct net_device *dev, int *budget) entry = (++tp->cur_rx) % RX_RING_SIZE; if (tp->cur_rx - tp->dirty_rx > RX_RING_SIZE/4) tulip_refill_rx(dev); - + } - + /* New ack strategy... irq does not ack Rx any longer hopefully this helps */ - + /* Really bad things can happen here... If new packet arrives * and an irq arrives (tx or just due to occasionally unset * mask), it will be acked by irq handler, but new thread @@ -259,28 +258,28 @@ int tulip_poll(struct net_device *dev, int *budget) * tomorrow (night 011029). If it will not fail, we won * finally: amount of IO did not increase at all. */ } while ((ioread32(tp->base_addr + CSR5) & RxIntr)); - + done: - + #ifdef CONFIG_TULIP_NAPI_HW_MITIGATION - + /* We use this simplistic scheme for IM. It's proven by real life installations. We can have IM enabled - continuesly but this would cause unnecessary latency. - Unfortunely we can't use all the NET_RX_* feedback here. - This would turn on IM for devices that is not contributing - to backlog congestion with unnecessary latency. - + continuesly but this would cause unnecessary latency. + Unfortunely we can't use all the NET_RX_* feedback here. + This would turn on IM for devices that is not contributing + to backlog congestion with unnecessary latency. + We monitor the the device RX-ring and have: - + HW Interrupt Mitigation either ON or OFF. - - ON: More then 1 pkt received (per intr.) OR we are dropping + + ON: More then 1 pkt received (per intr.) OR we are dropping OFF: Only 1 pkt received - + Note. We only use min and max (0, 15) settings from mit_table */ - - + + if( tp->flags & HAS_INTR_MITIGATION) { if( received > 1 ) { if( ! tp->mit_on ) { @@ -297,20 +296,20 @@ done: } #endif /* CONFIG_TULIP_NAPI_HW_MITIGATION */ - + dev->quota -= received; *budget -= received; - + tulip_refill_rx(dev); - + /* If RX ring is not full we are out of memory. */ if (tp->rx_buffers[tp->dirty_rx % RX_RING_SIZE].skb == NULL) goto oom; - + /* Remove us from polling list and enable RX intr. */ - + netif_rx_complete(dev); iowrite32(tulip_tbl[tp->chip_id].valid_intrs, tp->base_addr+CSR7); - + /* The last op happens after poll completion. Which means the following: * 1. it can race with disabling irqs in irq handler * 2. it can race with dise/enabling irqs in other poll threads @@ -321,9 +320,9 @@ done: * due to races in masking and due to too late acking of already * processed irqs. But it must not result in losing events. */ - + return 0; - + not_done: if (!received) { @@ -331,29 +330,29 @@ done: } dev->quota -= received; *budget -= received; - + if (tp->cur_rx - tp->dirty_rx > RX_RING_SIZE/2 || tp->rx_buffers[tp->dirty_rx % RX_RING_SIZE].skb == NULL) tulip_refill_rx(dev); - + if (tp->rx_buffers[tp->dirty_rx % RX_RING_SIZE].skb == NULL) goto oom; - + return 1; - - + + oom: /* Executed with RX ints disabled */ - - + + /* Start timer, stop polling, but do not enable rx interrupts. */ mod_timer(&tp->oom_timer, jiffies+1); - + /* Think: timer_pending() was an explicit signature of bug. * Timer can be pending now but fired and completed * before we did netif_rx_complete(). See? We would lose it. */ - + /* remove ourselves from the polling list */ netif_rx_complete(dev); - + return 0; } @@ -521,9 +520,9 @@ irqreturn_t tulip_interrupt(int irq, void *dev_instance, struct pt_regs *regs) /* Let's see whether the interrupt really is for us */ csr5 = ioread32(ioaddr + CSR5); - if (tp->flags & HAS_PHY_IRQ) + if (tp->flags & HAS_PHY_IRQ) handled = phy_interrupt (dev); - + if ((csr5 & (NormalIntr|AbnormalIntr)) == 0) return IRQ_RETVAL(handled); @@ -538,17 +537,17 @@ irqreturn_t tulip_interrupt(int irq, void *dev_instance, struct pt_regs *regs) /* Mask RX intrs and add the device to poll list. */ iowrite32(tulip_tbl[tp->chip_id].valid_intrs&~RxPollInt, ioaddr + CSR7); netif_rx_schedule(dev); - + if (!(csr5&~(AbnormalIntr|NormalIntr|RxPollInt|TPLnkPass))) break; } - + /* Acknowledge the interrupt sources we handle here ASAP the poll function does Rx and RxNoBuf acking */ - + iowrite32(csr5 & 0x0001ff3f, ioaddr + CSR5); -#else +#else /* Acknowledge all of the current interrupt sources ASAP. */ iowrite32(csr5 & 0x0001ffff, ioaddr + CSR5); @@ -559,11 +558,11 @@ irqreturn_t tulip_interrupt(int irq, void *dev_instance, struct pt_regs *regs) } #endif /* CONFIG_TULIP_NAPI */ - + if (tulip_debug > 4) printk(KERN_DEBUG "%s: interrupt csr5=%#8.8x new csr5=%#8.8x.\n", dev->name, csr5, ioread32(ioaddr + CSR5)); - + if (csr5 & (TxNoBuf | TxDied | TxIntr | TimerInt)) { unsigned int dirty_tx; @@ -737,17 +736,17 @@ irqreturn_t tulip_interrupt(int irq, void *dev_instance, struct pt_regs *regs) #ifdef CONFIG_TULIP_NAPI if (rxd) csr5 &= ~RxPollInt; - } while ((csr5 & (TxNoBuf | - TxDied | - TxIntr | + } while ((csr5 & (TxNoBuf | + TxDied | + TxIntr | TimerInt | /* Abnormal intr. */ - RxDied | - TxFIFOUnderflow | - TxJabber | - TPLnkFail | + RxDied | + TxFIFOUnderflow | + TxJabber | + TPLnkFail | SytemError )) != 0); -#else +#else } while ((csr5 & (NormalIntr|AbnormalIntr)) != 0); tulip_refill_rx(dev); diff --git a/drivers/net/tulip/media.c b/drivers/net/tulip/media.c index f53396fe7..e9bc2a958 100644 --- a/drivers/net/tulip/media.c +++ b/drivers/net/tulip/media.c @@ -140,7 +140,7 @@ void tulip_mdio_write(struct net_device *dev, int phy_id, int location, int val) spin_unlock_irqrestore(&tp->mii_lock, flags); return; } - + /* Establish sync by sending 32 logic ones. */ for (i = 32; i >= 0; i--) { iowrite32(MDIO_ENB | MDIO_DATA_WRITE1, mdio_addr); diff --git a/drivers/net/tulip/tulip.h b/drivers/net/tulip/tulip.h index 05d2d96f7..3bcfbf3d2 100644 --- a/drivers/net/tulip/tulip.h +++ b/drivers/net/tulip/tulip.h @@ -16,7 +16,6 @@ #ifndef __NET_TULIP_H__ #define __NET_TULIP_H__ -#include #include #include #include @@ -259,7 +258,7 @@ enum t21143_csr6_bits { There are no ill effects from too-large receive rings. */ #define TX_RING_SIZE 32 -#define RX_RING_SIZE 128 +#define RX_RING_SIZE 128 #define MEDIA_MASK 31 #define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer. */ diff --git a/drivers/net/tulip/tulip_core.c b/drivers/net/tulip/tulip_core.c index c67c91251..7351831f5 100644 --- a/drivers/net/tulip/tulip_core.c +++ b/drivers/net/tulip/tulip_core.c @@ -14,7 +14,6 @@ */ -#include #define DRV_NAME "tulip" #ifdef CONFIG_TULIP_NAPI @@ -490,7 +489,7 @@ tulip_open(struct net_device *dev) { int retval; - if ((retval = request_irq(dev->irq, &tulip_interrupt, SA_SHIRQ, dev->name, dev))) + if ((retval = request_irq(dev->irq, &tulip_interrupt, IRQF_SHARED, dev->name, dev))) return retval; tulip_init_ring (dev); @@ -1224,7 +1223,7 @@ out: * Chips that have the MRM/reserved bit quirk and the burst quirk. That * is the DM910X and the on chip ULi devices */ - + static int tulip_uli_dm_quirk(struct pci_dev *pdev) { if (pdev->vendor == 0x1282 && pdev->device == 0x9102) @@ -1297,7 +1296,7 @@ static int __devinit tulip_init_one (struct pci_dev *pdev, */ /* 1. Intel Saturn. Switch to 8 long words burst, 8 long word cache - aligned. Aries might need this too. The Saturn errata are not + aligned. Aries might need this too. The Saturn errata are not pretty reading but thankfully it's an old 486 chipset. 2. The dreaded SiS496 486 chipset. Same workaround as Intel @@ -1350,10 +1349,10 @@ static int __devinit tulip_init_one (struct pci_dev *pdev, SET_MODULE_OWNER(dev); SET_NETDEV_DEV(dev, &pdev->dev); if (pci_resource_len (pdev, 0) < tulip_tbl[chip_idx].io_size) { - printk (KERN_ERR PFX "%s: I/O region (0x%lx@0x%lx) too small, " + printk (KERN_ERR PFX "%s: I/O region (0x%llx@0x%llx) too small, " "aborting\n", pci_name(pdev), - pci_resource_len (pdev, 0), - pci_resource_start (pdev, 0)); + (unsigned long long)pci_resource_len (pdev, 0), + (unsigned long long)pci_resource_start (pdev, 0)); goto err_out_free_netdev; } @@ -1483,14 +1482,6 @@ static int __devinit tulip_init_one (struct pci_dev *pdev, sa_offset = 2; /* Grrr, damn Matrox boards. */ multiport_cnt = 4; } -#ifdef CONFIG_DDB5476 - if ((pdev->bus->number == 0) && (PCI_SLOT(pdev->devfn) == 6)) { - /* DDB5476 MAC address in first EEPROM locations. */ - sa_offset = 0; - /* No media table either */ - tp->flags &= ~HAS_MEDIA_TABLE; - } -#endif #ifdef CONFIG_DDB5477 if ((pdev->bus->number == 0) && (PCI_SLOT(pdev->devfn) == 4)) { /* DDB5477 MAC address in first EEPROM locations. */ @@ -1500,7 +1491,7 @@ static int __devinit tulip_init_one (struct pci_dev *pdev, } #endif #ifdef CONFIG_MIPS_COBALT - if ((pdev->bus->number == 0) && + if ((pdev->bus->number == 0) && ((PCI_SLOT(pdev->devfn) == 7) || (PCI_SLOT(pdev->devfn) == 12))) { /* Cobalt MAC address in first EEPROM locations. */ @@ -1558,10 +1549,14 @@ static int __devinit tulip_init_one (struct pci_dev *pdev, dev->dev_addr[i] = last_phys_addr[i]; dev->dev_addr[i] = last_phys_addr[i] + 1; #if defined(__sparc__) - if ((pcp != NULL) && prom_getproplen(pcp->prom_node, - "local-mac-address") == 6) { - prom_getproperty(pcp->prom_node, "local-mac-address", - dev->dev_addr, 6); + if (pcp) { + unsigned char *addr; + int len; + + addr = of_get_property(pcp->prom_node, + "local-mac-address", &len); + if (addr && len == 6) + memcpy(dev->dev_addr, addr, 6); } #endif #if defined(__i386__) || defined(__x86_64__) /* Patch up x86 BIOS bug. */ @@ -1775,7 +1770,7 @@ static int tulip_resume(struct pci_dev *pdev) pci_enable_device(pdev); - if ((retval = request_irq(dev->irq, &tulip_interrupt, SA_SHIRQ, dev->name, dev))) { + if ((retval = request_irq(dev->irq, &tulip_interrupt, IRQF_SHARED, dev->name, dev))) { printk (KERN_ERR "tulip: request_irq failed in resume\n"); return retval; } diff --git a/drivers/net/tulip/uli526x.c b/drivers/net/tulip/uli526x.c index 238e9c72c..fd64b2b3e 100644 --- a/drivers/net/tulip/uli526x.c +++ b/drivers/net/tulip/uli526x.c @@ -9,7 +9,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + */ #define DRV_NAME "uli526x" @@ -185,7 +185,7 @@ struct uli526x_board_info { /* NIC SROM data */ unsigned char srom[128]; - u8 init; + u8 init; }; enum uli526x_offsets { @@ -258,7 +258,7 @@ static int __devinit uli526x_init_one (struct pci_dev *pdev, struct uli526x_board_info *db; /* board information structure */ struct net_device *dev; int i, err; - + ULI526X_DBUG(0, "uli526x_init_one()", 0); if (!printed_version++) @@ -316,7 +316,7 @@ static int __devinit uli526x_init_one (struct pci_dev *pdev, err = -ENOMEM; goto err_out_nomem; } - + db->first_tx_desc = (struct tx_desc *) db->desc_pool_ptr; db->first_tx_desc_dma = db->desc_pool_dma_ptr; db->buf_pool_start = db->buf_pool_ptr; @@ -324,14 +324,14 @@ static int __devinit uli526x_init_one (struct pci_dev *pdev, db->chip_id = ent->driver_data; db->ioaddr = pci_resource_start(pdev, 0); - + db->pdev = pdev; db->init = 1; - + dev->base_addr = db->ioaddr; dev->irq = pdev->irq; pci_set_drvdata(pdev, dev); - + /* Register some necessary functions */ dev->open = &uli526x_open; dev->hard_start_xmit = &uli526x_start_xmit; @@ -341,7 +341,7 @@ static int __devinit uli526x_init_one (struct pci_dev *pdev, dev->ethtool_ops = &netdev_ethtool_ops; spin_lock_init(&db->lock); - + /* read 64 word srom data */ for (i = 0; i < 64; i++) ((u16 *) db->srom)[i] = cpu_to_le16(read_srom_word(db->ioaddr, i)); @@ -374,7 +374,7 @@ static int __devinit uli526x_init_one (struct pci_dev *pdev, goto err_out_res; printk(KERN_INFO "%s: ULi M%04lx at pci%s,",dev->name,ent->driver_data >> 16,pci_name(pdev)); - + for (i = 0; i < 6; i++) printk("%c%02x", i ? ':' : ' ', dev->dev_addr[i]); printk(", irq %d.\n", dev->irq); @@ -389,7 +389,7 @@ err_out_nomem: if(db->desc_pool_ptr) pci_free_consistent(pdev, sizeof(struct tx_desc) * DESC_ALL_CNT + 0x20, db->desc_pool_ptr, db->desc_pool_dma_ptr); - + if(db->buf_pool_ptr != NULL) pci_free_consistent(pdev, TX_BUF_ALLOC * TX_DESC_CNT + 4, db->buf_pool_ptr, db->buf_pool_dma_ptr); @@ -433,10 +433,10 @@ static int uli526x_open(struct net_device *dev) { int ret; struct uli526x_board_info *db = netdev_priv(dev); - + ULI526X_DBUG(0, "uli526x_open", 0); - ret = request_irq(dev->irq, &uli526x_interrupt, SA_SHIRQ, dev->name, dev); + ret = request_irq(dev->irq, &uli526x_interrupt, IRQF_SHARED, dev->name, dev); if (ret) return ret; @@ -454,7 +454,7 @@ static int uli526x_open(struct net_device *dev) /* CR6 operation mode decision */ db->cr6_data |= ULI526X_TXTH_256; db->cr0_data = CR0_DEFAULT; - + /* Initialize ULI526X board */ uli526x_init(dev); @@ -604,7 +604,7 @@ static int uli526x_start_xmit(struct sk_buff *skb, struct net_device *dev) /* Restore CR7 to enable interrupt */ spin_unlock_irqrestore(&db->lock, flags); outl(db->cr7_data, dev->base_addr + DCR7); - + /* free this SKB */ dev_kfree_skb(skb); @@ -782,7 +782,7 @@ static void uli526x_rx_packet(struct net_device *dev, struct uli526x_board_info struct sk_buff *skb; int rxlen; u32 rdes0; - + rxptr = db->rx_ready_ptr; while(db->rx_avail_cnt) { @@ -821,7 +821,7 @@ static void uli526x_rx_packet(struct net_device *dev, struct uli526x_board_info if ( !(rdes0 & 0x8000) || ((db->cr6_data & CR6_PM) && (rxlen>6)) ) { skb = rxptr->rx_skb_ptr; - + /* Good packet, send to upper layer */ /* Shorst packet used new SKB */ if ( (rxlen < RX_COPY_SIZE) && @@ -841,7 +841,7 @@ static void uli526x_rx_packet(struct net_device *dev, struct uli526x_board_info dev->last_rx = jiffies; db->stats.rx_packets++; db->stats.rx_bytes += rxlen; - + } else { /* Reuse SKB buffer when the packet is error */ ULI526X_DBUG(0, "Reuse SK buffer, rdes0", rdes0); @@ -911,7 +911,7 @@ ULi_ethtool_gset(struct uli526x_board_info *db, struct ethtool_cmd *ecmd) SUPPORTED_100baseT_Full | SUPPORTED_Autoneg | SUPPORTED_MII); - + ecmd->advertising = (ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full | ADVERTISED_100baseT_Half | @@ -924,13 +924,13 @@ ULi_ethtool_gset(struct uli526x_board_info *db, struct ethtool_cmd *ecmd) ecmd->phy_address = db->phy_addr; ecmd->transceiver = XCVR_EXTERNAL; - + ecmd->speed = 10; ecmd->duplex = DUPLEX_HALF; - + if(db->op_mode==ULI526X_100MHF || db->op_mode==ULI526X_100MFD) { - ecmd->speed = 100; + ecmd->speed = 100; } if(db->op_mode==ULI526X_10MFD || db->op_mode==ULI526X_100MFD) { @@ -939,11 +939,11 @@ ULi_ethtool_gset(struct uli526x_board_info *db, struct ethtool_cmd *ecmd) if(db->link_failed) { ecmd->speed = -1; - ecmd->duplex = -1; + ecmd->duplex = -1; } - + if (db->media_mode & ULI526X_AUTO) - { + { ecmd->autoneg = AUTONEG_ENABLE; } } @@ -964,15 +964,15 @@ static void netdev_get_drvinfo(struct net_device *dev, static int netdev_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) { struct uli526x_board_info *np = netdev_priv(dev); - + ULi_ethtool_gset(np, cmd); - + return 0; } static u32 netdev_get_link(struct net_device *dev) { struct uli526x_board_info *np = netdev_priv(dev); - + if(np->link_failed) return 0; else @@ -1005,11 +1005,11 @@ static void uli526x_timer(unsigned long data) struct uli526x_board_info *db = netdev_priv(dev); unsigned long flags; u8 TmpSpeed=10; - + //ULI526X_DBUG(0, "uli526x_timer()", 0); spin_lock_irqsave(&db->lock, flags); - + /* Dynamic reset ULI526X : system error or transmit time-out */ tmp_cr8 = inl(db->ioaddr + DCR8); if ( (db->interval_rx_cnt==0) && (tmp_cr8) ) { @@ -1021,9 +1021,9 @@ static void uli526x_timer(unsigned long data) /* TX polling kick monitor */ if ( db->tx_packet_cnt && time_after(jiffies, dev->trans_start + ULI526X_TX_KICK) ) { - outl(0x1, dev->base_addr + DCR1); // Tx polling again + outl(0x1, dev->base_addr + DCR1); // Tx polling again - // TX Timeout + // TX Timeout if ( time_after(jiffies, dev->trans_start + ULI526X_TX_TIMEOUT) ) { db->reset_TXtimeout++; db->wait_reset = 1; @@ -1073,7 +1073,7 @@ static void uli526x_timer(unsigned long data) uli526x_sense_speed(db) ) db->link_failed = 1; uli526x_process_mode(db); - + if(db->link_failed==0) { if(db->op_mode==ULI526X_100MHF || db->op_mode==ULI526X_100MFD) @@ -1404,7 +1404,7 @@ static u8 uli526x_sense_speed(struct uli526x_board_info * db) phy_mode = phy_read(db->ioaddr, db->phy_addr, 1, db->chip_id); if ( (phy_mode & 0x24) == 0x24 ) { - + phy_mode = ((phy_read(db->ioaddr, db->phy_addr, 5, db->chip_id) & 0x01e0)<<7); if(phy_mode&0x8000) phy_mode = 0x8000; @@ -1414,7 +1414,7 @@ static u8 uli526x_sense_speed(struct uli526x_board_info * db) phy_mode = 0x2000; else phy_mode = 0x1000; - + /* printk(DRV_NAME ": Phy_mode %x ",phy_mode); */ switch (phy_mode) { case 0x1000: db->op_mode = ULI526X_10MHF; break; @@ -1442,7 +1442,7 @@ static u8 uli526x_sense_speed(struct uli526x_board_info * db) static void uli526x_set_phyxcer(struct uli526x_board_info *db) { u16 phy_reg; - + /* Phyxcer capability setting */ phy_reg = phy_read(db->ioaddr, db->phy_addr, 4, db->chip_id) & ~0x01e0; @@ -1457,7 +1457,7 @@ static void uli526x_set_phyxcer(struct uli526x_board_info *db) case ULI526X_100MHF: phy_reg |= 0x80; break; case ULI526X_100MFD: phy_reg |= 0x100; break; } - + } /* Write new capability to Phyxcer Reg4 */ @@ -1556,7 +1556,7 @@ static void phy_write(unsigned long iobase, u8 phy_addr, u8 offset, u16 phy_data /* Write a word data to PHY controller */ for ( i = 0x8000; i > 0; i >>= 1) phy_write_1bit(ioaddr, phy_data & i ? PHY_DATA_1 : PHY_DATA_0, chip_id); - + } @@ -1574,7 +1574,7 @@ static u16 phy_read(unsigned long iobase, u8 phy_addr, u8 offset, u32 chip_id) return phy_readby_cr10(iobase, phy_addr, offset); /* M5261/M5263 Chip */ ioaddr = iobase + DCR9; - + /* Send 33 synchronization clock to Phy controller */ for (i = 0; i < 35; i++) phy_write_1bit(ioaddr, PHY_DATA_1, chip_id); @@ -1610,7 +1610,7 @@ static u16 phy_read(unsigned long iobase, u8 phy_addr, u8 offset, u32 chip_id) static u16 phy_readby_cr10(unsigned long iobase, u8 phy_addr, u8 offset) { unsigned long ioaddr,cr10_value; - + ioaddr = iobase + DCR10; cr10_value = phy_addr; cr10_value = (cr10_value<<5) + offset; @@ -1629,7 +1629,7 @@ static u16 phy_readby_cr10(unsigned long iobase, u8 phy_addr, u8 offset) static void phy_writeby_cr10(unsigned long iobase, u8 phy_addr, u8 offset, u16 phy_data) { unsigned long ioaddr,cr10_value; - + ioaddr = iobase + DCR10; cr10_value = phy_addr; cr10_value = (cr10_value<<5) + offset; @@ -1659,7 +1659,7 @@ static void phy_write_1bit(unsigned long ioaddr, u32 phy_data, u32 chip_id) static u16 phy_read_1bit(unsigned long ioaddr, u32 chip_id) { u16 phy_data; - + outl(0x50000 , ioaddr); udelay(1); phy_data = ( inl(ioaddr) >> 19 ) & 0x1; diff --git a/drivers/net/tulip/winbond-840.c b/drivers/net/tulip/winbond-840.c index 56d86c7c0..eba9083da 100644 --- a/drivers/net/tulip/winbond-840.c +++ b/drivers/net/tulip/winbond-840.c @@ -38,12 +38,12 @@ Copyright (C) 2001 Manfred Spraul * ethtool support (jgarzik) * Replace some MII-related magic numbers with constants (jgarzik) - + TODO: * enable pci_power_off * Wake-On-LAN */ - + #define DRV_NAME "winbond-840" #define DRV_VERSION "1.01-d" #define DRV_RELDATE "Nov-17-2001" @@ -57,7 +57,7 @@ c-help-name: Winbond W89c840 PCI Ethernet support c-help-symbol: CONFIG_WINBOND_840 c-help: This driver is for the Winbond W89c840 chip. It also works with c-help: the TX9882 chip on the Compex RL100-ATX board. -c-help: More specific information and updates are available from +c-help: More specific information and updates are available from c-help: http://www.scyld.com/network/drivers.html */ @@ -138,7 +138,7 @@ static int full_duplex[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1}; #include /* These identify the driver base version and may not be removed. */ -static char version[] __devinitdata = +static char version[] = KERN_INFO DRV_NAME ".c:v" DRV_VERSION " (2.4 port) " DRV_RELDATE " Donald Becker \n" KERN_INFO " http://www.scyld.com/network/drivers.html\n"; @@ -207,53 +207,38 @@ Test with 'ping -s 10000' on a fast computer. */ - + /* PCI probe table. */ -enum pci_id_flags_bits { - /* Set PCI command register bits before calling probe1(). */ - PCI_USES_IO=1, PCI_USES_MEM=2, PCI_USES_MASTER=4, - /* Read and map the single following PCI BAR. */ - PCI_ADDR0=0<<4, PCI_ADDR1=1<<4, PCI_ADDR2=2<<4, PCI_ADDR3=3<<4, - PCI_ADDR_64BITS=0x100, PCI_NO_ACPI_WAKE=0x200, PCI_NO_MIN_LATENCY=0x400, -}; enum chip_capability_flags { - CanHaveMII=1, HasBrokenTx=2, AlwaysFDX=4, FDXOnNoMII=8,}; -#ifdef USE_IO_OPS -#define W840_FLAGS (PCI_USES_IO | PCI_ADDR0 | PCI_USES_MASTER) -#else -#define W840_FLAGS (PCI_USES_MEM | PCI_ADDR1 | PCI_USES_MASTER) -#endif + CanHaveMII=1, HasBrokenTx=2, AlwaysFDX=4, FDXOnNoMII=8, +}; -static struct pci_device_id w840_pci_tbl[] = { +static const struct pci_device_id w840_pci_tbl[] = { { 0x1050, 0x0840, PCI_ANY_ID, 0x8153, 0, 0, 0 }, { 0x1050, 0x0840, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 }, { 0x11f6, 0x2011, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2 }, - { 0, } + { } }; MODULE_DEVICE_TABLE(pci, w840_pci_tbl); +enum { + netdev_res_size = 128, /* size of PCI BAR resource */ +}; + struct pci_id_info { const char *name; - struct match_info { - int pci, pci_mask, subsystem, subsystem_mask; - int revision, revision_mask; /* Only 8 bits. */ - } id; - enum pci_id_flags_bits pci_flags; - int io_size; /* Needed for I/O region check or ioremap(). */ - int drv_flags; /* Driver use, intended as capability flags. */ + int drv_flags; /* Driver use, intended as capability flags. */ }; -static struct pci_id_info pci_id_tbl[] = { - {"Winbond W89c840", /* Sometime a Level-One switch card. */ - { 0x08401050, 0xffffffff, 0x81530000, 0xffff0000 }, - W840_FLAGS, 128, CanHaveMII | HasBrokenTx | FDXOnNoMII}, - {"Winbond W89c840", { 0x08401050, 0xffffffff, }, - W840_FLAGS, 128, CanHaveMII | HasBrokenTx}, - {"Compex RL100-ATX", { 0x201111F6, 0xffffffff,}, - W840_FLAGS, 128, CanHaveMII | HasBrokenTx}, - {NULL,}, /* 0 terminated list. */ + +static const struct pci_id_info pci_id_tbl[] __devinitdata = { + { /* Sometime a Level-One switch card. */ + "Winbond W89c840", CanHaveMII | HasBrokenTx | FDXOnNoMII}, + { "Winbond W89c840", CanHaveMII | HasBrokenTx}, + { "Compex RL100-ATX", CanHaveMII | HasBrokenTx}, + { } /* terminate list. */ }; /* This driver was written to use PCI memory space, however some x86 systems @@ -374,7 +359,7 @@ static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); static struct ethtool_ops netdev_ethtool_ops; static int netdev_close(struct net_device *dev); - + static int __devinit w840_probe1 (struct pci_dev *pdev, const struct pci_device_id *ent) @@ -411,7 +396,7 @@ static int __devinit w840_probe1 (struct pci_dev *pdev, #ifdef USE_IO_OPS bar = 0; #endif - ioaddr = pci_iomap(pdev, bar, pci_id_tbl[chip_idx].io_size); + ioaddr = pci_iomap(pdev, bar, netdev_res_size); if (!ioaddr) goto err_out_free_res; @@ -434,7 +419,7 @@ static int __devinit w840_probe1 (struct pci_dev *pdev, np->mii_if.mdio_read = mdio_read; np->mii_if.mdio_write = mdio_write; np->base_addr = ioaddr; - + pci_set_drvdata(pdev, dev); if (dev->mem_start) @@ -510,7 +495,7 @@ err_out_netdev: return -ENODEV; } - + /* Read the EEPROM and MII Management Data I/O (MDIO) interfaces. These are often serial bit streams generated by the host processor. The example below is for the common 93c46 EEPROM, 64 16 bit words. */ @@ -660,7 +645,7 @@ static void mdio_write(struct net_device *dev, int phy_id, int location, int val return; } - + static int netdev_open(struct net_device *dev) { struct netdev_private *np = netdev_priv(dev); @@ -670,7 +655,7 @@ static int netdev_open(struct net_device *dev) iowrite32(0x00000001, ioaddr + PCIBusCfg); /* Reset */ netif_device_detach(dev); - i = request_irq(dev->irq, &intr_handler, SA_SHIRQ, dev->name, dev); + i = request_irq(dev->irq, &intr_handler, IRQF_SHARED, dev->name, dev); if (i) goto out_err; @@ -731,7 +716,7 @@ static int update_link(struct net_device *dev) dev->name, np->phys[0]); netif_carrier_on(dev); } - + if ((np->mii & ~0xf) == MII_DAVICOM_DM9101) { /* If the link partner doesn't support autonegotiation * the MII detects it's abilities with the "parallel detection". @@ -761,7 +746,7 @@ static int update_link(struct net_device *dev) result |= 0x20000000; if (result != np->csr6 && debug) printk(KERN_INFO "%s: Setting %dMBit-%s-duplex based on MII#%d\n", - dev->name, fasteth ? 100 : 10, + dev->name, fasteth ? 100 : 10, duplex ? "full" : "half", np->phys[0]); return result; } @@ -947,7 +932,7 @@ static void init_registers(struct net_device *dev) iowrite32(i, ioaddr + PCIBusCfg); np->csr6 = 0; - /* 128 byte Tx threshold; + /* 128 byte Tx threshold; Transmit on; Receive on; */ update_csr6(dev, 0x00022002 | update_link(dev) | __set_rx_mode(dev)); @@ -1584,7 +1569,7 @@ static int netdev_close(struct net_device *dev) static void __devexit w840_remove1 (struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); - + if (dev) { struct netdev_private *np = netdev_priv(dev); unregister_netdev(dev); diff --git a/drivers/net/tulip/xircom_cb.c b/drivers/net/tulip/xircom_cb.c index 56344103a..cf43390d2 100644 --- a/drivers/net/tulip/xircom_cb.c +++ b/drivers/net/tulip/xircom_cb.c @@ -1,11 +1,11 @@ /* - * xircom_cb: A driver for the (tulip-like) Xircom Cardbus ethernet cards + * xircom_cb: A driver for the (tulip-like) Xircom Cardbus ethernet cards * * This software is (C) by the respective authors, and licensed under the GPL * License. * * Written by Arjan van de Ven for Red Hat, Inc. - * Based on work by Jeff Garzik, Doug Ledford and Donald Becker + * Based on work by Jeff Garzik, Doug Ledford and Donald Becker * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. @@ -93,7 +93,7 @@ struct xircom_private { unsigned long io_port; int open; - + /* transmit_used is the rotating counter that indicates which transmit descriptor has to be used next */ int transmit_used; @@ -153,10 +153,10 @@ static struct pci_device_id xircom_pci_table[] = { MODULE_DEVICE_TABLE(pci, xircom_pci_table); static struct pci_driver xircom_ops = { - .name = "xircom_cb", - .id_table = xircom_pci_table, - .probe = xircom_probe, - .remove = xircom_remove, + .name = "xircom_cb", + .id_table = xircom_pci_table, + .probe = xircom_probe, + .remove = xircom_remove, .suspend =NULL, .resume =NULL }; @@ -174,7 +174,7 @@ static void print_binary(unsigned int number) buffer[i2++]='1'; else buffer[i2++]='0'; - if ((i&3)==0) + if ((i&3)==0) buffer[i2++]=' '; } printk("%s\n",buffer); @@ -196,10 +196,10 @@ static struct ethtool_ops netdev_ethtool_ops = { /* xircom_probe is the code that gets called on device insertion. it sets up the hardware and registers the device to the networklayer. - + TODO: Send 1 or 2 "dummy" packets here as the card seems to discard the first two packets that get send, and pump hates that. - + */ static int __devinit xircom_probe(struct pci_dev *pdev, const struct pci_device_id *id) { @@ -209,7 +209,7 @@ static int __devinit xircom_probe(struct pci_dev *pdev, const struct pci_device_ unsigned long flags; unsigned short tmp16; enter("xircom_probe"); - + /* First do the PCI initialisation */ if (pci_enable_device(pdev)) @@ -217,24 +217,24 @@ static int __devinit xircom_probe(struct pci_dev *pdev, const struct pci_device_ /* disable all powermanagement */ pci_write_config_dword(pdev, PCI_POWERMGMT, 0x0000); - + pci_set_master(pdev); /* Why isn't this done by pci_enable_device ?*/ - /* clear PCI status, if any */ - pci_read_config_word (pdev,PCI_STATUS, &tmp16); + /* clear PCI status, if any */ + pci_read_config_word (pdev,PCI_STATUS, &tmp16); pci_write_config_word (pdev, PCI_STATUS,tmp16); - + pci_read_config_byte(pdev, PCI_REVISION_ID, &chip_rev); - + if (!request_region(pci_resource_start(pdev, 0), 128, "xircom_cb")) { printk(KERN_ERR "xircom_probe: failed to allocate io-region\n"); return -ENODEV; } - /* + /* Before changing the hardware, allocate the memory. This way, we can fail gracefully if not enough memory - is available. + is available. */ dev = alloc_etherdev(sizeof(struct xircom_private)); if (!dev) { @@ -242,13 +242,13 @@ static int __devinit xircom_probe(struct pci_dev *pdev, const struct pci_device_ goto device_fail; } private = netdev_priv(dev); - + /* Allocate the send/receive buffers */ private->rx_buffer = pci_alloc_consistent(pdev,8192,&private->rx_dma_handle); if (private->rx_buffer == NULL) { printk(KERN_ERR "xircom_probe: no memory for rx buffer \n"); goto rx_buf_fail; - } + } private->tx_buffer = pci_alloc_consistent(pdev,8192,&private->tx_dma_handle); if (private->tx_buffer == NULL) { printk(KERN_ERR "xircom_probe: no memory for tx buffer \n"); @@ -265,11 +265,11 @@ static int __devinit xircom_probe(struct pci_dev *pdev, const struct pci_device_ spin_lock_init(&private->lock); dev->irq = pdev->irq; dev->base_addr = private->io_port; - + initialize_card(private); read_mac_address(private); setup_descriptors(private); - + dev->open = &xircom_open; dev->hard_start_xmit = &xircom_start_xmit; dev->stop = &xircom_close; @@ -285,19 +285,19 @@ static int __devinit xircom_probe(struct pci_dev *pdev, const struct pci_device_ printk(KERN_ERR "xircom_probe: netdevice registration failed.\n"); goto reg_fail; } - + printk(KERN_INFO "%s: Xircom cardbus revision %i at irq %i \n", dev->name, chip_rev, pdev->irq); /* start the transmitter to get a heartbeat */ /* TODO: send 2 dummy packets here */ transceiver_voodoo(private); - + spin_lock_irqsave(&private->lock,flags); activate_transmitter(private); activate_receiver(private); spin_unlock_irqrestore(&private->lock,flags); - + trigger_receive(private); - + leave("xircom_probe"); return 0; @@ -332,7 +332,7 @@ static void __devexit xircom_remove(struct pci_dev *pdev) free_netdev(dev); pci_set_drvdata(pdev, NULL); leave("xircom_remove"); -} +} static irqreturn_t xircom_interrupt(int irq, void *dev_instance, struct pt_regs *regs) { @@ -346,11 +346,11 @@ static irqreturn_t xircom_interrupt(int irq, void *dev_instance, struct pt_regs spin_lock(&card->lock); status = inl(card->io_port+CSR5); -#ifdef DEBUG +#ifdef DEBUG print_binary(status); printk("tx status 0x%08x 0x%08x \n",card->tx_buffer[0],card->tx_buffer[4]); printk("rx status 0x%08x 0x%08x \n",card->rx_buffer[0],card->rx_buffer[4]); -#endif +#endif /* Handle shared irq and hotplug */ if (status == 0 || status == 0xffffffff) { spin_unlock(&card->lock); @@ -366,21 +366,21 @@ static irqreturn_t xircom_interrupt(int irq, void *dev_instance, struct pt_regs netif_carrier_on(dev); else netif_carrier_off(dev); - + } - /* Clear all remaining interrupts */ + /* Clear all remaining interrupts */ status |= 0xffffffff; /* FIXME: make this clear only the real existing bits */ outl(status,card->io_port+CSR5); - - for (i=0;ilock); leave("xircom_interrupt"); return IRQ_HANDLED; @@ -393,38 +393,38 @@ static int xircom_start_xmit(struct sk_buff *skb, struct net_device *dev) int nextdescriptor; int desc; enter("xircom_start_xmit"); - + card = netdev_priv(dev); spin_lock_irqsave(&card->lock,flags); - + /* First see if we can free some descriptors */ - for (desc=0;desctransmit_used +1) % (NUMDESCRIPTORS); desc = card->transmit_used; - + /* only send the packet if the descriptor is free */ if (card->tx_buffer[4*desc]==0) { /* Copy the packet data; zero the memory first as the card sometimes sends more than you ask it to. */ - + memset(&card->tx_buffer[bufferoffsets[desc]/4],0,1536); memcpy(&(card->tx_buffer[bufferoffsets[desc]/4]),skb->data,skb->len); - - + + /* FIXME: The specification tells us that the length we send HAS to be a multiple of 4 bytes. */ - + card->tx_buffer[4*desc+1] = skb->len; if (desc == NUMDESCRIPTORS-1) card->tx_buffer[4*desc+1] |= (1<<25); /* bit 25: last descriptor of the ring */ card->tx_buffer[4*desc+1] |= 0xF0000000; - /* 0xF0... means want interrupts*/ + /* 0xF0... means want interrupts*/ card->tx_skb[desc] = skb; - + wmb(); /* This gives the descriptor to the card */ card->tx_buffer[4*desc] = 0x80000000; @@ -433,18 +433,18 @@ static int xircom_start_xmit(struct sk_buff *skb, struct net_device *dev) netif_stop_queue(dev); } card->transmit_used = nextdescriptor; - leave("xircom-start_xmit - sent"); + leave("xircom-start_xmit - sent"); spin_unlock_irqrestore(&card->lock,flags); return 0; } - + /* Uh oh... no free descriptor... drop the packet */ netif_stop_queue(dev); spin_unlock_irqrestore(&card->lock,flags); trigger_transmit(card); - + return -EIO; } @@ -457,12 +457,12 @@ static int xircom_open(struct net_device *dev) int retval; enter("xircom_open"); printk(KERN_INFO "xircom cardbus adaptor found, registering as %s, using irq %i \n",dev->name,dev->irq); - retval = request_irq(dev->irq, &xircom_interrupt, SA_SHIRQ, dev->name, dev); + retval = request_irq(dev->irq, &xircom_interrupt, IRQF_SHARED, dev->name, dev); if (retval) { leave("xircom_open - No IRQ"); return retval; } - + xircom_up(xp); xp->open = 1; leave("xircom_open"); @@ -473,31 +473,31 @@ static int xircom_close(struct net_device *dev) { struct xircom_private *card; unsigned long flags; - + enter("xircom_close"); card = netdev_priv(dev); netif_stop_queue(dev); /* we don't want new packets */ - + spin_lock_irqsave(&card->lock,flags); - + disable_all_interrupts(card); -#if 0 +#if 0 /* We can enable this again once we send dummy packets on ifconfig ethX up */ deactivate_receiver(card); deactivate_transmitter(card); -#endif +#endif remove_descriptors(card); - + spin_unlock_irqrestore(&card->lock,flags); - + card->open = 0; free_irq(dev->irq,dev); - + leave("xircom_close"); - + return 0; - + } @@ -506,8 +506,8 @@ static struct net_device_stats *xircom_get_stats(struct net_device *dev) { struct xircom_private *card = netdev_priv(dev); return &card->stats; -} - +} + #ifdef CONFIG_NET_POLL_CONTROLLER static void xircom_poll_controller(struct net_device *dev) @@ -540,7 +540,7 @@ static void initialize_card(struct xircom_private *card) outl(val, card->io_port + CSR0); - val = 0; /* Value 0x00 is a safe and conservative value + val = 0; /* Value 0x00 is a safe and conservative value for the PCI configuration settings */ outl(val, card->io_port + CSR0); @@ -617,23 +617,23 @@ static void setup_descriptors(struct xircom_private *card) /* Rx Descr2: address of the buffer we store the buffer at the 2nd half of the page */ - + address = (unsigned long) card->rx_dma_handle; card->rx_buffer[i*4 + 2] = cpu_to_le32(address + bufferoffsets[i]); /* Rx Desc3: address of 2nd buffer -> 0 */ card->rx_buffer[i*4 + 3] = 0; } - + wmb(); /* Write the receive descriptor ring address to the card */ address = (unsigned long) card->rx_dma_handle; - val = cpu_to_le32(address); + val = cpu_to_le32(address); outl(val, card->io_port + CSR3); /* Receive descr list address */ /* transmit descriptors */ memset(card->tx_buffer, 0, 128); /* clear the descriptors */ - + for (i=0;i 0x00000000 */ card->tx_buffer[i*4 + 0] = 0x00000000; @@ -641,7 +641,7 @@ static void setup_descriptors(struct xircom_private *card) card->tx_buffer[i*4 + 1] = 1536; if (i==NUMDESCRIPTORS-1) card->tx_buffer[i*4 + 1] |= (1 << 25); /* bit 25 is "last descriptor" */ - + /* Tx Descr2: address of the buffer we store the buffer at the 2nd half of the page */ address = (unsigned long) card->tx_dma_handle; @@ -748,7 +748,7 @@ static int receive_active(struct xircom_private *card) activate_receiver enables the receiver on the card. Before being allowed to active the receiver, the receiver must be completely de-activated. To achieve this, -this code actually disables the receiver first; then it waits for the +this code actually disables the receiver first; then it waits for the receiver to become inactive, then it activates the receiver and then it waits for the receiver to be active. @@ -762,13 +762,13 @@ static void activate_receiver(struct xircom_private *card) val = inl(card->io_port + CSR6); /* Operation mode */ - + /* If the "active" bit is set and the receiver is already active, no need to do the expensive thing */ if ((val&2) && (receive_active(card))) return; - - + + val = val & ~2; /* disable the receiver */ outl(val, card->io_port + CSR6); @@ -805,7 +805,7 @@ static void activate_receiver(struct xircom_private *card) /* deactivate_receiver disables the receiver on the card. -To achieve this this code disables the receiver first; +To achieve this this code disables the receiver first; then it waits for the receiver to become inactive. must be called with the lock held and interrupts disabled. @@ -840,7 +840,7 @@ static void deactivate_receiver(struct xircom_private *card) activate_transmitter enables the transmitter on the card. Before being allowed to active the transmitter, the transmitter must be completely de-activated. To achieve this, -this code actually disables the transmitter first; then it waits for the +this code actually disables the transmitter first; then it waits for the transmitter to become inactive, then it activates the transmitter and then it waits for the transmitter to be active again. @@ -856,7 +856,7 @@ static void activate_transmitter(struct xircom_private *card) val = inl(card->io_port + CSR6); /* Operation mode */ /* If the "active" bit is set and the receiver is already - active, no need to do the expensive thing */ + active, no need to do the expensive thing */ if ((val&(1<<13)) && (transmit_active(card))) return; @@ -896,7 +896,7 @@ static void activate_transmitter(struct xircom_private *card) /* deactivate_transmitter disables the transmitter on the card. -To achieve this this code disables the transmitter first; +To achieve this this code disables the transmitter first; then it waits for the transmitter to become inactive. must be called with the lock held and interrupts disabled. @@ -990,7 +990,7 @@ static void disable_all_interrupts(struct xircom_private *card) { unsigned int val; enter("enable_all_interrupts"); - + val = 0; /* disable all interrupts */ outl(val, card->io_port + CSR7); @@ -1031,8 +1031,8 @@ static int enable_promisc(struct xircom_private *card) unsigned int val; enter("enable_promisc"); - val = inl(card->io_port + CSR6); - val = val | (1 << 6); + val = inl(card->io_port + CSR6); + val = val | (1 << 6); outl(val, card->io_port + CSR6); leave("enable_promisc"); @@ -1042,7 +1042,7 @@ static int enable_promisc(struct xircom_private *card) -/* +/* link_status() checks the the links status and will return 0 for no link, 10 for 10mbit link and 100 for.. guess what. Must be called in locked state with interrupts disabled @@ -1051,15 +1051,15 @@ static int link_status(struct xircom_private *card) { unsigned int val; enter("link_status"); - + val = inb(card->io_port + CSR12); - + if (!(val&(1<<2))) /* bit 2 is 0 for 10mbit link, 1 for not an 10mbit link */ return 10; if (!(val&(1<<1))) /* bit 1 is 0 for 100mbit link, 1 for not an 100mbit link */ return 100; - - /* If we get here -> no link at all */ + + /* If we get here -> no link at all */ leave("link_status"); return 0; @@ -1071,7 +1071,7 @@ static int link_status(struct xircom_private *card) /* read_mac_address() reads the MAC address from the NIC and stores it in the "dev" structure. - + This function will take the spinlock itself and can, as a result, not be called with the lock helt. */ static void read_mac_address(struct xircom_private *card) @@ -1081,7 +1081,7 @@ static void read_mac_address(struct xircom_private *card) int i; enter("read_mac_address"); - + spin_lock_irqsave(&card->lock, flags); outl(1 << 12, card->io_port + CSR9); /* enable boot rom access */ @@ -1095,7 +1095,7 @@ static void read_mac_address(struct xircom_private *card) outl(i + 3, card->io_port + CSR10); data_count = inl(card->io_port + CSR9) & 0xff; if ((tuple == 0x22) && (data_id == 0x04) && (data_count == 0x06)) { - /* + /* * This is it. We have the data we want. */ for (j = 0; j < 6; j++) { @@ -1136,12 +1136,12 @@ static void transceiver_voodoo(struct xircom_private *card) spin_lock_irqsave(&card->lock, flags); outl(0x0008, card->io_port + CSR15); - udelay(25); + udelay(25); outl(0xa8050000, card->io_port + CSR15); udelay(25); outl(0xa00f0000, card->io_port + CSR15); udelay(25); - + spin_unlock_irqrestore(&card->lock, flags); netif_start_queue(card->dev); @@ -1163,15 +1163,15 @@ static void xircom_up(struct xircom_private *card) spin_lock_irqsave(&card->lock, flags); - + enable_link_interrupt(card); enable_transmit_interrupt(card); enable_receive_interrupt(card); enable_common_interrupts(card); enable_promisc(card); - + /* The card can have received packets already, read them away now */ - for (i=0;idev,card,i,bufferoffsets[i]); @@ -1185,15 +1185,15 @@ static void xircom_up(struct xircom_private *card) /* Bufferoffset is in BYTES */ static void investigate_read_descriptor(struct net_device *dev,struct xircom_private *card, int descnr, unsigned int bufferoffset) { - int status; - + int status; + enter("investigate_read_descriptor"); status = card->rx_buffer[4*descnr]; - + if ((status > 0)) { /* packet received */ - + /* TODO: discard error packets */ - + short pkt_len = ((status >> 16) & 0x7ff) - 4; /* minus 4, we don't want the CRC */ struct sk_buff *skb; @@ -1216,7 +1216,7 @@ static void investigate_read_descriptor(struct net_device *dev,struct xircom_pri dev->last_rx = jiffies; card->stats.rx_packets++; card->stats.rx_bytes += pkt_len; - + out: /* give the buffer back to the card */ card->rx_buffer[4*descnr] = 0x80000000; @@ -1234,9 +1234,9 @@ static void investigate_write_descriptor(struct net_device *dev, struct xircom_p int status; enter("investigate_write_descriptor"); - + status = card->tx_buffer[4*descnr]; -#if 0 +#if 0 if (status & 0x8000) { /* Major error */ printk(KERN_ERR "Major transmit error status %x \n", status); card->tx_buffer[4*descnr] = 0; @@ -1258,21 +1258,20 @@ static void investigate_write_descriptor(struct net_device *dev, struct xircom_p } leave("investigate_write_descriptor"); - + } static int __init xircom_init(void) { - pci_register_driver(&xircom_ops); - return 0; + return pci_register_driver(&xircom_ops); } static void __exit xircom_exit(void) { pci_unregister_driver(&xircom_ops); -} +} -module_init(xircom_init) +module_init(xircom_init) module_exit(xircom_exit) diff --git a/drivers/net/tulip/xircom_tulip_cb.c b/drivers/net/tulip/xircom_tulip_cb.c index 887d7245f..17ca7dc42 100644 --- a/drivers/net/tulip/xircom_tulip_cb.c +++ b/drivers/net/tulip/xircom_tulip_cb.c @@ -10,26 +10,11 @@ 410 Severn Ave., Suite 210 Annapolis MD 21403 - ----------------------------------------------------------- - - Linux kernel-specific changes: - - LK1.0 (Ion Badulescu) - - Major cleanup - - Use 2.4 PCI API - - Support ethtool - - Rewrite perfect filter/hash code - - Use interrupts for media changes - - LK1.1 (Ion Badulescu) - - Disallow negotiation of unsupported full-duplex modes */ #define DRV_NAME "xircom_tulip_cb" -#define DRV_VERSION "0.91+LK1.1" -#define DRV_RELDATE "October 11, 2001" - -#define CARDBUS 1 +#define DRV_VERSION "0.92" +#define DRV_RELDATE "June 27, 2006" /* A few user-configurable values. */ @@ -98,7 +83,6 @@ static int csr0 = 0x00A00000 | 0x4800; /* PCI registers */ #define PCI_POWERMGMT 0x40 -#include #include #include #include @@ -307,10 +291,10 @@ struct xircom_private { struct xircom_tx_desc tx_ring[TX_RING_SIZE]; /* The saved address of a sent-in-place packet/buffer, for skfree(). */ struct sk_buff* tx_skbuff[TX_RING_SIZE]; -#ifdef CARDBUS + /* The X3201-3 requires 4-byte aligned tx bufs */ struct sk_buff* tx_aligned_skbuff[TX_RING_SIZE]; -#endif + /* The addresses of receive-in-place skbuffs. */ struct sk_buff* rx_skbuff[RX_RING_SIZE]; u16 setup_frame[PKT_SETUP_SZ / sizeof(u16)]; /* Pseudo-Tx frame to init address table. */ @@ -808,7 +792,7 @@ xircom_open(struct net_device *dev) { struct xircom_private *tp = netdev_priv(dev); - if (request_irq(dev->irq, &xircom_interrupt, SA_SHIRQ, dev->name, dev)) + if (request_irq(dev->irq, &xircom_interrupt, IRQF_SHARED, dev->name, dev)) return -EAGAIN; xircom_up(dev); @@ -909,10 +893,8 @@ static void xircom_init_ring(struct net_device *dev) tp->tx_skbuff[i] = NULL; tp->tx_ring[i].status = 0; tp->tx_ring[i].buffer2 = virt_to_bus(&tp->tx_ring[i+1]); -#ifdef CARDBUS if (tp->chip_id == X3201_3) tp->tx_aligned_skbuff[i] = dev_alloc_skb(PKT_BUF_SZ); -#endif /* CARDBUS */ } tp->tx_ring[i-1].buffer2 = virt_to_bus(&tp->tx_ring[0]); } @@ -932,12 +914,10 @@ xircom_start_xmit(struct sk_buff *skb, struct net_device *dev) entry = tp->cur_tx % TX_RING_SIZE; tp->tx_skbuff[entry] = skb; -#ifdef CARDBUS if (tp->chip_id == X3201_3) { memcpy(tp->tx_aligned_skbuff[entry]->data,skb->data,skb->len); tp->tx_ring[entry].buffer1 = virt_to_bus(tp->tx_aligned_skbuff[entry]->data); } else -#endif tp->tx_ring[entry].buffer1 = virt_to_bus(skb->data); if (tp->cur_tx - tp->dirty_tx < TX_RING_SIZE/2) {/* Typical path */ diff --git a/drivers/net/tun.c b/drivers/net/tun.c index a1ed2d983..329d9feb9 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -39,7 +39,6 @@ #define DRV_DESCRIPTION "Universal TUN/TAP device driver" #define DRV_COPYRIGHT "(C) 1999-2004 Max Krasnyansky " -#include #include #include #include @@ -490,6 +489,9 @@ static int tun_set_iff(struct file *file, struct ifreq *ifr) err = -EINVAL; + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + /* Set dev type */ if (ifr->ifr_flags & IFF_TUN) { /* TUN device */ @@ -777,7 +779,6 @@ static struct miscdevice tun_miscdev = { .minor = TUN_MINOR, .name = "tun", .fops = &tun_fops, - .devfs_name = "net/tun", }; /* ethtool interface */ diff --git a/drivers/net/typhoon.c b/drivers/net/typhoon.c index 389d19fb5..4103c3717 100644 --- a/drivers/net/typhoon.c +++ b/drivers/net/typhoon.c @@ -2131,7 +2131,7 @@ typhoon_open(struct net_device *dev) goto out_sleep; } - err = request_irq(dev->irq, &typhoon_interrupt, SA_SHIRQ, + err = request_irq(dev->irq, &typhoon_interrupt, IRQF_SHARED, dev->name, dev); if(err < 0) goto out_sleep; @@ -2568,9 +2568,10 @@ typhoon_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) pci_set_drvdata(pdev, dev); - printk(KERN_INFO "%s: %s at %s 0x%lx, ", + printk(KERN_INFO "%s: %s at %s 0x%llx, ", dev->name, typhoon_card_info[card_id].name, - use_mmio ? "MMIO" : "IO", pci_resource_start(pdev, use_mmio)); + use_mmio ? "MMIO" : "IO", + (unsigned long long)pci_resource_start(pdev, use_mmio)); for(i = 0; i < 5; i++) printk("%2.2x:", dev->dev_addr[i]); printk("%2.2x\n", dev->dev_addr[i]); diff --git a/drivers/net/via-rhine.c b/drivers/net/via-rhine.c index fdc21037f..ae971080e 100644 --- a/drivers/net/via-rhine.c +++ b/drivers/net/via-rhine.c @@ -25,117 +25,13 @@ version. He may or may not be interested in bug reports on this code. You can find his versions at: http://www.scyld.com/network/via-rhine.html - - - Linux kernel version history: - - LK1.1.0: - - Jeff Garzik: softnet 'n stuff - - LK1.1.1: - - Justin Guyett: softnet and locking fixes - - Jeff Garzik: use PCI interface - - LK1.1.2: - - Urban Widmark: minor cleanups, merges from Becker 1.03a/1.04 versions - - LK1.1.3: - - Urban Widmark: use PCI DMA interface (with thanks to the eepro100.c - code) update "Theory of Operation" with - softnet/locking changes - - Dave Miller: PCI DMA and endian fixups - - Jeff Garzik: MOD_xxx race fixes, updated PCI resource allocation - - LK1.1.4: - - Urban Widmark: fix gcc 2.95.2 problem and - remove writel's to fixed address 0x7c - - LK1.1.5: - - Urban Widmark: mdio locking, bounce buffer changes - merges from Beckers 1.05 version - added netif_running_on/off support - - LK1.1.6: - - Urban Widmark: merges from Beckers 1.08b version (VT6102 + mdio) - set netif_running_on/off on startup, del_timer_sync - - LK1.1.7: - - Manfred Spraul: added reset into tx_timeout - - LK1.1.9: - - Urban Widmark: merges from Beckers 1.10 version - (media selection + eeprom reload) - - David Vrabel: merges from D-Link "1.11" version - (disable WOL and PME on startup) - - LK1.1.10: - - Manfred Spraul: use "singlecopy" for unaligned buffers - don't allocate bounce buffers for !ReqTxAlign cards - - LK1.1.11: - - David Woodhouse: Set dev->base_addr before the first time we call - wait_for_reset(). It's a lot happier that way. - Free np->tx_bufs only if we actually allocated it. - - LK1.1.12: - - Martin Eriksson: Allow Memory-Mapped IO to be enabled. - - LK1.1.13 (jgarzik): - - Add ethtool support - - Replace some MII-related magic numbers with constants - - LK1.1.14 (Ivan G.): - - fixes comments for Rhine-III - - removes W_MAX_TIMEOUT (unused) - - adds HasDavicomPhy for Rhine-I (basis: linuxfet driver; my card - is R-I and has Davicom chip, flag is referenced in kernel driver) - - sends chip_id as a parameter to wait_for_reset since np is not - initialized on first call - - changes mmio "else if (chip_id==VT6102)" to "else" so it will work - for Rhine-III's (documentation says same bit is correct) - - transmit frame queue message is off by one - fixed - - adds IntrNormalSummary to "Something Wicked" exclusion list - so normal interrupts will not trigger the message (src: Donald Becker) - (Roger Luethi) - - show confused chip where to continue after Tx error - - location of collision counter is chip specific - - allow selecting backoff algorithm (module parameter) - - LK1.1.15 (jgarzik): - - Use new MII lib helper generic_mii_ioctl - - LK1.1.16 (Roger Luethi) - - Etherleak fix - - Handle Tx buffer underrun - - Fix bugs in full duplex handling - - New reset code uses "force reset" cmd on Rhine-II - - Various clean ups - - LK1.1.17 (Roger Luethi) - - Fix race in via_rhine_start_tx() - - On errors, wait for Tx engine to turn off before scavenging - - Handle Tx descriptor write-back race on Rhine-II - - Force flushing for PCI posted writes - - More reset code changes - - LK1.1.18 (Roger Luethi) - - No filtering multicast in promisc mode (Edward Peng) - - Fix for Rhine-I Tx timeouts - - LK1.1.19 (Roger Luethi) - - Increase Tx threshold for unspecified errors - - LK1.2.0-2.6 (Roger Luethi) - - Massive clean-up - - Rewrite PHY, media handling (remove options, full_duplex, backoff) - - Fix Tx engine race for good - - Craig Brind: Zero padded aligned buffers for short packets. + [link no longer provides useful info -jgarzik] */ #define DRV_NAME "via-rhine" -#define DRV_VERSION "1.2.0-2.6" -#define DRV_RELDATE "June-10-2004" +#define DRV_VERSION "1.4.1" +#define DRV_RELDATE "July-24-2006" /* A few user-configurable values. @@ -148,6 +44,10 @@ static int max_interrupt_work = 20; Setting to > 1518 effectively disables this feature. */ static int rx_copybreak; +/* Work-around for broken BIOSes: they are unable to get the chip back out of + power state D3 so PXE booting fails. bootparam(7): via-rhine.avoid_D3=1 */ +static int avoid_D3; + /* * In case you are looking for 'options[]' or 'full_duplex[]', they * are gone. Use ethtool(8) instead. @@ -167,7 +67,11 @@ static const int multicast_filter_limit = 32; There are no ill effects from too-large receive rings. */ #define TX_RING_SIZE 16 #define TX_QUEUE_LEN 10 /* Limit ring entries actually used. */ +#ifdef CONFIG_VIA_RHINE_NAPI +#define RX_RING_SIZE 64 +#else #define RX_RING_SIZE 16 +#endif /* Operational parameters that usually are not changed. */ @@ -220,9 +124,11 @@ MODULE_LICENSE("GPL"); module_param(max_interrupt_work, int, 0); module_param(debug, int, 0); module_param(rx_copybreak, int, 0); +module_param(avoid_D3, bool, 0); MODULE_PARM_DESC(max_interrupt_work, "VIA Rhine maximum events handled per interrupt"); MODULE_PARM_DESC(debug, "VIA Rhine debug level (0-7)"); MODULE_PARM_DESC(rx_copybreak, "VIA Rhine copy breakpoint for copy-only-tiny-frames"); +MODULE_PARM_DESC(avoid_D3, "Avoid power state D3 (work-around for broken BIOSes)"); /* Theory of Operation @@ -356,12 +262,11 @@ enum rhine_quirks { /* Beware of PCI posted writes */ #define IOSYNC do { ioread8(ioaddr + StationAddr); } while (0) -static struct pci_device_id rhine_pci_tbl[] = -{ - {0x1106, 0x3043, PCI_ANY_ID, PCI_ANY_ID, 0, 0, }, /* VT86C100A */ - {0x1106, 0x3065, PCI_ANY_ID, PCI_ANY_ID, 0, 0, }, /* VT6102 */ - {0x1106, 0x3106, PCI_ANY_ID, PCI_ANY_ID, 0, 0, }, /* 6105{,L,LOM} */ - {0x1106, 0x3053, PCI_ANY_ID, PCI_ANY_ID, 0, 0, }, /* VT6105M */ +static const struct pci_device_id rhine_pci_tbl[] = { + { 0x1106, 0x3043, PCI_ANY_ID, PCI_ANY_ID, }, /* VT86C100A */ + { 0x1106, 0x3065, PCI_ANY_ID, PCI_ANY_ID, }, /* VT6102 */ + { 0x1106, 0x3106, PCI_ANY_ID, PCI_ANY_ID, }, /* 6105{,L,LOM} */ + { 0x1106, 0x3053, PCI_ANY_ID, PCI_ANY_ID, }, /* VT6105M */ { } /* terminate list */ }; MODULE_DEVICE_TABLE(pci, rhine_pci_tbl); @@ -501,7 +406,7 @@ static void rhine_tx_timeout(struct net_device *dev); static int rhine_start_tx(struct sk_buff *skb, struct net_device *dev); static irqreturn_t rhine_interrupt(int irq, void *dev_instance, struct pt_regs *regs); static void rhine_tx(struct net_device *dev); -static void rhine_rx(struct net_device *dev); +static int rhine_rx(struct net_device *dev, int limit); static void rhine_error(struct net_device *dev, int intr_status); static void rhine_set_rx_mode(struct net_device *dev); static struct net_device_stats *rhine_get_stats(struct net_device *dev); @@ -669,6 +574,32 @@ static void rhine_poll(struct net_device *dev) } #endif +#ifdef CONFIG_VIA_RHINE_NAPI +static int rhine_napipoll(struct net_device *dev, int *budget) +{ + struct rhine_private *rp = netdev_priv(dev); + void __iomem *ioaddr = rp->base; + int done, limit = min(dev->quota, *budget); + + done = rhine_rx(dev, limit); + *budget -= done; + dev->quota -= done; + + if (done < limit) { + netif_rx_complete(dev); + + iowrite16(IntrRxDone | IntrRxErr | IntrRxEmpty| IntrRxOverflow | + IntrRxDropped | IntrRxNoBuf | IntrTxAborted | + IntrTxDone | IntrTxError | IntrTxUnderrun | + IntrPCIErr | IntrStatsMax | IntrLinkChange, + ioaddr + IntrEnable); + return 0; + } + else + return 1; +} +#endif + static void rhine_hw_init(struct net_device *dev, long pioaddr) { struct rhine_private *rp = netdev_priv(dev); @@ -848,6 +779,10 @@ static int __devinit rhine_init_one(struct pci_dev *pdev, dev->watchdog_timeo = TX_TIMEOUT; #ifdef CONFIG_NET_POLL_CONTROLLER dev->poll_controller = rhine_poll; +#endif +#ifdef CONFIG_VIA_RHINE_NAPI + dev->poll = rhine_napipoll; + dev->weight = 64; #endif if (rp->quirks & rqRhineI) dev->features |= NETIF_F_SG|NETIF_F_HW_CSUM; @@ -894,6 +829,9 @@ static int __devinit rhine_init_one(struct pci_dev *pdev, } } rp->mii_if.phy_id = phy_id; + if (debug > 1 && avoid_D3) + printk(KERN_INFO "%s: No D3 power state at shutdown.\n", + dev->name); return 0; @@ -1119,6 +1057,8 @@ static void init_registers(struct net_device *dev) rhine_set_rx_mode(dev); + netif_poll_enable(dev); + /* Enable interrupts by setting the interrupt mask. */ iowrite16(IntrRxDone | IntrRxErr | IntrRxEmpty| IntrRxOverflow | IntrRxDropped | IntrRxNoBuf | IntrTxAborted | @@ -1210,7 +1150,7 @@ static int rhine_open(struct net_device *dev) void __iomem *ioaddr = rp->base; int rc; - rc = request_irq(rp->pdev->irq, &rhine_interrupt, SA_SHIRQ, dev->name, + rc = request_irq(rp->pdev->irq, &rhine_interrupt, IRQF_SHARED, dev->name, dev); if (rc) return rc; @@ -1284,11 +1224,8 @@ static int rhine_start_tx(struct sk_buff *skb, struct net_device *dev) /* Calculate the next Tx descriptor entry. */ entry = rp->cur_tx % TX_RING_SIZE; - if (skb->len < ETH_ZLEN) { - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) - return 0; - } + if (skb_padto(skb, ETH_ZLEN)) + return 0; rp->tx_skbuff[entry] = skb; @@ -1376,8 +1313,18 @@ static irqreturn_t rhine_interrupt(int irq, void *dev_instance, struct pt_regs * dev->name, intr_status); if (intr_status & (IntrRxDone | IntrRxErr | IntrRxDropped | - IntrRxWakeUp | IntrRxEmpty | IntrRxNoBuf)) - rhine_rx(dev); + IntrRxWakeUp | IntrRxEmpty | IntrRxNoBuf)) { +#ifdef CONFIG_VIA_RHINE_NAPI + iowrite16(IntrTxAborted | + IntrTxDone | IntrTxError | IntrTxUnderrun | + IntrPCIErr | IntrStatsMax | IntrLinkChange, + ioaddr + IntrEnable); + + netif_rx_schedule(dev); +#else + rhine_rx(dev, RX_RING_SIZE); +#endif + } if (intr_status & (IntrTxErrSummary | IntrTxDone)) { if (intr_status & IntrTxErrSummary) { @@ -1475,13 +1422,12 @@ static void rhine_tx(struct net_device *dev) spin_unlock(&rp->lock); } -/* This routine is logically part of the interrupt handler, but isolated - for clarity and better register allocation. */ -static void rhine_rx(struct net_device *dev) +/* Process up to limit frames from receive ring */ +static int rhine_rx(struct net_device *dev, int limit) { struct rhine_private *rp = netdev_priv(dev); + int count; int entry = rp->cur_rx % RX_RING_SIZE; - int boguscnt = rp->dirty_rx + RX_RING_SIZE - rp->cur_rx; if (debug > 4) { printk(KERN_DEBUG "%s: rhine_rx(), entry %d status %8.8x.\n", @@ -1490,16 +1436,18 @@ static void rhine_rx(struct net_device *dev) } /* If EOP is set on the next entry, it's a new packet. Send it up. */ - while (!(rp->rx_head_desc->rx_status & cpu_to_le32(DescOwn))) { + for (count = 0; count < limit; ++count) { struct rx_desc *desc = rp->rx_head_desc; u32 desc_status = le32_to_cpu(desc->rx_status); int data_size = desc_status >> 16; + if (desc_status & DescOwn) + break; + if (debug > 4) printk(KERN_DEBUG "rhine_rx() status is %8.8x.\n", desc_status); - if (--boguscnt < 0) - break; + if ((desc_status & (RxWholePkt | RxErr)) != RxWholePkt) { if ((desc_status & RxWholePkt) != RxWholePkt) { printk(KERN_WARNING "%s: Oversized Ethernet " @@ -1568,7 +1516,11 @@ static void rhine_rx(struct net_device *dev) PCI_DMA_FROMDEVICE); } skb->protocol = eth_type_trans(skb, dev); +#ifdef CONFIG_VIA_RHINE_NAPI + netif_receive_skb(skb); +#else netif_rx(skb); +#endif dev->last_rx = jiffies; rp->stats.rx_bytes += pkt_len; rp->stats.rx_packets++; @@ -1595,6 +1547,8 @@ static void rhine_rx(struct net_device *dev) } rp->rx_ring[entry].rx_status = cpu_to_le32(DescOwn); } + + return count; } /* @@ -1884,6 +1838,7 @@ static int rhine_close(struct net_device *dev) spin_lock_irq(&rp->lock); netif_stop_queue(dev); + netif_poll_disable(dev); if (debug > 1) printk(KERN_DEBUG "%s: Shutting down ethercard, " @@ -1965,7 +1920,8 @@ static void rhine_shutdown (struct pci_dev *pdev) } /* Hit power state D3 (sleep) */ - iowrite8(ioread8(ioaddr + StickyHW) | 0x03, ioaddr + StickyHW); + if (!avoid_D3) + iowrite8(ioread8(ioaddr + StickyHW) | 0x03, ioaddr + StickyHW); /* TODO: Check use of pci_enable_wake() */ @@ -2002,7 +1958,7 @@ static int rhine_resume(struct pci_dev *pdev) if (!netif_running(dev)) return 0; - if (request_irq(dev->irq, rhine_interrupt, SA_SHIRQ, dev->name, dev)) + if (request_irq(dev->irq, rhine_interrupt, IRQF_SHARED, dev->name, dev)) printk(KERN_ERR "via-rhine %s: request_irq failed\n", dev->name); ret = pci_set_power_state(pdev, PCI_D0); diff --git a/drivers/net/via-velocity.c b/drivers/net/via-velocity.c index 09e05fe40..aa9cd92f4 100644 --- a/drivers/net/via-velocity.c +++ b/drivers/net/via-velocity.c @@ -47,7 +47,6 @@ #include #include -#include #include #include #include @@ -65,7 +64,6 @@ #include #include #include -#include #include #include #include @@ -231,7 +229,8 @@ static int rx_copybreak = 200; module_param(rx_copybreak, int, 0644); MODULE_PARM_DESC(rx_copybreak, "Copy breakpoint for copy-only-tiny-frames"); -static void velocity_init_info(struct pci_dev *pdev, struct velocity_info *vptr, struct velocity_info_tbl *info); +static void velocity_init_info(struct pci_dev *pdev, struct velocity_info *vptr, + const struct velocity_info_tbl *info); static int velocity_get_pci_info(struct velocity_info *, struct pci_dev *pdev); static void velocity_print_info(struct velocity_info *vptr); static int velocity_open(struct net_device *dev); @@ -296,9 +295,9 @@ static void velocity_unregister_notifier(void) * Internal board variants. At the moment we have only one */ -static struct velocity_info_tbl chip_info_table[] = { - {CHIP_TYPE_VT6110, "VIA Networking Velocity Family Gigabit Ethernet Adapter", 256, 1, 0x00FFFFFFUL}, - {0, NULL} +static const struct velocity_info_tbl chip_info_table[] __devinitdata = { + {CHIP_TYPE_VT6110, "VIA Networking Velocity Family Gigabit Ethernet Adapter", 1, 0x00FFFFFFUL}, + { } }; /* @@ -306,10 +305,9 @@ static struct velocity_info_tbl chip_info_table[] = { * device driver. Used for hotplug autoloading. */ -static struct pci_device_id velocity_id_table[] __devinitdata = { - {PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_612X, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, (unsigned long) chip_info_table}, - {0, } +static const struct pci_device_id velocity_id_table[] __devinitdata = { + { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_612X) }, + { } }; MODULE_DEVICE_TABLE(pci, velocity_id_table); @@ -343,7 +341,7 @@ static char __devinit *get_chip_name(enum chip_type chip_id) static void __devexit velocity_remove1(struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); - struct velocity_info *vptr = dev->priv; + struct velocity_info *vptr = netdev_priv(dev); #ifdef CONFIG_PM unsigned long flags; @@ -688,21 +686,23 @@ static int __devinit velocity_found1(struct pci_dev *pdev, const struct pci_devi static int first = 1; struct net_device *dev; int i; - struct velocity_info_tbl *info = (struct velocity_info_tbl *) ent->driver_data; + const struct velocity_info_tbl *info = &chip_info_table[ent->driver_data]; struct velocity_info *vptr; struct mac_regs __iomem * regs; int ret = -ENOMEM; + /* FIXME: this driver, like almost all other ethernet drivers, + * can support more than MAX_UNITS. + */ if (velocity_nics >= MAX_UNITS) { - printk(KERN_NOTICE VELOCITY_NAME ": already found %d NICs.\n", - velocity_nics); + dev_notice(&pdev->dev, "already found %d NICs.\n", + velocity_nics); return -ENODEV; } dev = alloc_etherdev(sizeof(struct velocity_info)); - - if (dev == NULL) { - printk(KERN_ERR VELOCITY_NAME ": allocate net device failed.\n"); + if (!dev) { + dev_err(&pdev->dev, "allocate net device failed.\n"); goto out; } @@ -710,7 +710,7 @@ static int __devinit velocity_found1(struct pci_dev *pdev, const struct pci_devi SET_MODULE_OWNER(dev); SET_NETDEV_DEV(dev, &pdev->dev); - vptr = dev->priv; + vptr = netdev_priv(dev); if (first) { @@ -733,17 +733,17 @@ static int __devinit velocity_found1(struct pci_dev *pdev, const struct pci_devi ret = velocity_get_pci_info(vptr, pdev); if (ret < 0) { - printk(KERN_ERR VELOCITY_NAME ": Failed to find PCI device.\n"); + /* error message already printed */ goto err_disable; } ret = pci_request_regions(pdev, VELOCITY_NAME); if (ret < 0) { - printk(KERN_ERR VELOCITY_NAME ": Failed to find PCI device.\n"); + dev_err(&pdev->dev, "No PCI resources.\n"); goto err_disable; } - regs = ioremap(vptr->memaddr, vptr->io_size); + regs = ioremap(vptr->memaddr, VELOCITY_IO_SIZE); if (regs == NULL) { ret = -EIO; goto err_release_res; @@ -861,13 +861,14 @@ static void __devinit velocity_print_info(struct velocity_info *vptr) * discovered. */ -static void __devinit velocity_init_info(struct pci_dev *pdev, struct velocity_info *vptr, struct velocity_info_tbl *info) +static void __devinit velocity_init_info(struct pci_dev *pdev, + struct velocity_info *vptr, + const struct velocity_info_tbl *info) { memset(vptr, 0, sizeof(struct velocity_info)); vptr->pdev = pdev; vptr->chip_id = info->chip_id; - vptr->io_size = info->io_size; vptr->num_txq = info->txqueue; vptr->multicast_limit = MCAM_SIZE; spin_lock_init(&vptr->lock); @@ -885,8 +886,7 @@ static void __devinit velocity_init_info(struct pci_dev *pdev, struct velocity_i static int __devinit velocity_get_pci_info(struct velocity_info *vptr, struct pci_dev *pdev) { - - if(pci_read_config_byte(pdev, PCI_REVISION_ID, &vptr->rev_id) < 0) + if (pci_read_config_byte(pdev, PCI_REVISION_ID, &vptr->rev_id) < 0) return -EIO; pci_set_master(pdev); @@ -894,24 +894,20 @@ static int __devinit velocity_get_pci_info(struct velocity_info *vptr, struct pc vptr->ioaddr = pci_resource_start(pdev, 0); vptr->memaddr = pci_resource_start(pdev, 1); - if(!(pci_resource_flags(pdev, 0) & IORESOURCE_IO)) - { - printk(KERN_ERR "%s: region #0 is not an I/O resource, aborting.\n", - pci_name(pdev)); + if (!(pci_resource_flags(pdev, 0) & IORESOURCE_IO)) { + dev_err(&pdev->dev, + "region #0 is not an I/O resource, aborting.\n"); return -EINVAL; } - if((pci_resource_flags(pdev, 1) & IORESOURCE_IO)) - { - printk(KERN_ERR "%s: region #1 is an I/O resource, aborting.\n", - pci_name(pdev)); + if ((pci_resource_flags(pdev, 1) & IORESOURCE_IO)) { + dev_err(&pdev->dev, + "region #1 is an I/O resource, aborting.\n"); return -EINVAL; } - if(pci_resource_len(pdev, 1) < 256) - { - printk(KERN_ERR "%s: region #1 is too small.\n", - pci_name(pdev)); + if (pci_resource_len(pdev, 1) < VELOCITY_IO_SIZE) { + dev_err(&pdev->dev, "region #1 is too small.\n"); return -EINVAL; } vptr->pdev = pdev; @@ -1730,7 +1726,7 @@ static void velocity_free_tx_buf(struct velocity_info *vptr, struct velocity_td_ static int velocity_open(struct net_device *dev) { - struct velocity_info *vptr = dev->priv; + struct velocity_info *vptr = netdev_priv(dev); int ret; vptr->rx_buf_sz = (dev->mtu <= 1504 ? PKT_BUF_SZ : dev->mtu + 32); @@ -1752,7 +1748,7 @@ static int velocity_open(struct net_device *dev) velocity_init_registers(vptr, VELOCITY_INIT_COLD); - ret = request_irq(vptr->pdev->irq, &velocity_intr, SA_SHIRQ, + ret = request_irq(vptr->pdev->irq, &velocity_intr, IRQF_SHARED, dev->name, dev); if (ret < 0) { /* Power down the chip */ @@ -1787,7 +1783,7 @@ err_free_desc_rings: static int velocity_change_mtu(struct net_device *dev, int new_mtu) { - struct velocity_info *vptr = dev->priv; + struct velocity_info *vptr = netdev_priv(dev); unsigned long flags; int oldmtu = dev->mtu; int ret = 0; @@ -1863,7 +1859,7 @@ static void velocity_shutdown(struct velocity_info *vptr) static int velocity_close(struct net_device *dev) { - struct velocity_info *vptr = dev->priv; + struct velocity_info *vptr = netdev_priv(dev); netif_stop_queue(dev); velocity_shutdown(vptr); @@ -1896,7 +1892,7 @@ static int velocity_close(struct net_device *dev) static int velocity_xmit(struct sk_buff *skb, struct net_device *dev) { - struct velocity_info *vptr = dev->priv; + struct velocity_info *vptr = netdev_priv(dev); int qnum = 0; struct tx_desc *td_ptr; struct velocity_td_info *tdinfo; @@ -2051,7 +2047,7 @@ static int velocity_xmit(struct sk_buff *skb, struct net_device *dev) static int velocity_intr(int irq, void *dev_instance, struct pt_regs *regs) { struct net_device *dev = dev_instance; - struct velocity_info *vptr = dev->priv; + struct velocity_info *vptr = netdev_priv(dev); u32 isr_status; int max_count = 0; @@ -2106,7 +2102,7 @@ static int velocity_intr(int irq, void *dev_instance, struct pt_regs *regs) static void velocity_set_multi(struct net_device *dev) { - struct velocity_info *vptr = dev->priv; + struct velocity_info *vptr = netdev_priv(dev); struct mac_regs __iomem * regs = vptr->mac_regs; u8 rx_mode; int i; @@ -2155,7 +2151,7 @@ static void velocity_set_multi(struct net_device *dev) static struct net_device_stats *velocity_get_stats(struct net_device *dev) { - struct velocity_info *vptr = dev->priv; + struct velocity_info *vptr = netdev_priv(dev); /* If the hardware is down, don't touch MII */ if(!netif_running(dev)) @@ -2198,7 +2194,7 @@ static struct net_device_stats *velocity_get_stats(struct net_device *dev) static int velocity_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct velocity_info *vptr = dev->priv; + struct velocity_info *vptr = netdev_priv(dev); int ret; /* If we are asked for information and the device is power @@ -2746,7 +2742,7 @@ static u32 check_connection_type(struct mac_regs __iomem * regs) if (PHYSR0 & PHYSR0_SPDG) status |= VELOCITY_SPEED_1000; - if (PHYSR0 & PHYSR0_SPD10) + else if (PHYSR0 & PHYSR0_SPD10) status |= VELOCITY_SPEED_10; else status |= VELOCITY_SPEED_100; @@ -2827,7 +2823,7 @@ static void enable_flow_control_ability(struct velocity_info *vptr) static int velocity_ethtool_up(struct net_device *dev) { - struct velocity_info *vptr = dev->priv; + struct velocity_info *vptr = netdev_priv(dev); if (!netif_running(dev)) pci_set_power_state(vptr->pdev, PCI_D0); return 0; @@ -2843,20 +2839,29 @@ static int velocity_ethtool_up(struct net_device *dev) static void velocity_ethtool_down(struct net_device *dev) { - struct velocity_info *vptr = dev->priv; + struct velocity_info *vptr = netdev_priv(dev); if (!netif_running(dev)) pci_set_power_state(vptr->pdev, PCI_D3hot); } static int velocity_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) { - struct velocity_info *vptr = dev->priv; + struct velocity_info *vptr = netdev_priv(dev); struct mac_regs __iomem * regs = vptr->mac_regs; u32 status; status = check_connection_type(vptr->mac_regs); - cmd->supported = SUPPORTED_TP | SUPPORTED_Autoneg | SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | SUPPORTED_1000baseT_Half | SUPPORTED_1000baseT_Full; - if (status & VELOCITY_SPEED_100) + cmd->supported = SUPPORTED_TP | + SUPPORTED_Autoneg | + SUPPORTED_10baseT_Half | + SUPPORTED_10baseT_Full | + SUPPORTED_100baseT_Half | + SUPPORTED_100baseT_Full | + SUPPORTED_1000baseT_Half | + SUPPORTED_1000baseT_Full; + if (status & VELOCITY_SPEED_1000) + cmd->speed = SPEED_1000; + else if (status & VELOCITY_SPEED_100) cmd->speed = SPEED_100; else cmd->speed = SPEED_10; @@ -2875,7 +2880,7 @@ static int velocity_get_settings(struct net_device *dev, struct ethtool_cmd *cmd static int velocity_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) { - struct velocity_info *vptr = dev->priv; + struct velocity_info *vptr = netdev_priv(dev); u32 curr_status; u32 new_status = 0; int ret = 0; @@ -2898,14 +2903,14 @@ static int velocity_set_settings(struct net_device *dev, struct ethtool_cmd *cmd static u32 velocity_get_link(struct net_device *dev) { - struct velocity_info *vptr = dev->priv; + struct velocity_info *vptr = netdev_priv(dev); struct mac_regs __iomem * regs = vptr->mac_regs; - return BYTE_REG_BITS_IS_ON(PHYSR0_LINKGD, ®s->PHYSR0) ? 0 : 1; + return BYTE_REG_BITS_IS_ON(PHYSR0_LINKGD, ®s->PHYSR0) ? 1 : 0; } static void velocity_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) { - struct velocity_info *vptr = dev->priv; + struct velocity_info *vptr = netdev_priv(dev); strcpy(info->driver, VELOCITY_NAME); strcpy(info->version, VELOCITY_VERSION); strcpy(info->bus_info, pci_name(vptr->pdev)); @@ -2913,7 +2918,7 @@ static void velocity_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo static void velocity_ethtool_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) { - struct velocity_info *vptr = dev->priv; + struct velocity_info *vptr = netdev_priv(dev); wol->supported = WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_ARP; wol->wolopts |= WAKE_MAGIC; /* @@ -2929,7 +2934,7 @@ static void velocity_ethtool_get_wol(struct net_device *dev, struct ethtool_woli static int velocity_ethtool_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) { - struct velocity_info *vptr = dev->priv; + struct velocity_info *vptr = netdev_priv(dev); if (!(wol->wolopts & (WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_ARP))) return -EFAULT; @@ -2994,7 +2999,7 @@ static struct ethtool_ops velocity_ethtool_ops = { static int velocity_mii_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { - struct velocity_info *vptr = dev->priv; + struct velocity_info *vptr = netdev_priv(dev); struct mac_regs __iomem * regs = vptr->mac_regs; unsigned long flags; struct mii_ioctl_data *miidata = if_mii(ifr); diff --git a/drivers/net/via-velocity.h b/drivers/net/via-velocity.h index 1b70b7c97..496c3d597 100644 --- a/drivers/net/via-velocity.h +++ b/drivers/net/via-velocity.h @@ -31,6 +31,8 @@ #define VELOCITY_FULL_DRV_NAM "VIA Networking Velocity Family Gigabit Ethernet Adapter Driver" #define VELOCITY_VERSION "1.13" +#define VELOCITY_IO_SIZE 256 + #define PKT_BUF_SZ 1540 #define MAX_UNITS 8 @@ -307,7 +309,7 @@ enum velocity_owner { #define TX_QUEUE_NO 4 #define MAX_HW_MIB_COUNTER 32 -#define VELOCITY_MIN_MTU (1514-14) +#define VELOCITY_MIN_MTU (64) #define VELOCITY_MAX_MTU (9000) /* @@ -1191,7 +1193,6 @@ enum chip_type { struct velocity_info_tbl { enum chip_type chip_id; char *name; - int io_size; int txqueue; u32 flags; }; @@ -1414,7 +1415,7 @@ static inline void mac_get_cam(struct mac_regs __iomem * regs, int idx, u8 *addr * the rest of the logic from the result of sleep/wakeup */ -inline static void mac_wol_reset(struct mac_regs __iomem * regs) +static inline void mac_wol_reset(struct mac_regs __iomem * regs) { /* Turn off SWPTAG right after leaving power mode */ @@ -1751,7 +1752,6 @@ struct velocity_info { struct mac_regs __iomem * mac_regs; unsigned long memaddr; unsigned long ioaddr; - u32 io_size; u8 rev_id; @@ -1811,7 +1811,7 @@ struct velocity_info { * CHECK ME: locking */ -inline static int velocity_get_ip(struct velocity_info *vptr) +static inline int velocity_get_ip(struct velocity_info *vptr) { struct in_device *in_dev = (struct in_device *) vptr->dev->ip_ptr; struct in_ifaddr *ifa; diff --git a/drivers/net/wan/Kconfig b/drivers/net/wan/Kconfig index b5328b0ff..54b8e492e 100644 --- a/drivers/net/wan/Kconfig +++ b/drivers/net/wan/Kconfig @@ -134,18 +134,6 @@ config SEALEVEL_4021 The driver will be compiled as a module: the module will be called sealevel. -config SYNCLINK_SYNCPPP - tristate "SyncLink HDLC/SYNCPPP support" - depends on WAN - help - Enables HDLC/SYNCPPP support for the SyncLink WAN driver. - - Normally the SyncLink WAN driver works with the main PPP driver - and pppd program. - HDLC/SYNCPPP support allows use of the Cisco HDLC/PPP driver - . The SyncLink WAN driver (in - character devices) must also be enabled. - # Generic HDLC config HDLC tristate "Generic HDLC layer" diff --git a/drivers/net/wan/Makefile b/drivers/net/wan/Makefile index 823c6d5ab..316ca6869 100644 --- a/drivers/net/wan/Makefile +++ b/drivers/net/wan/Makefile @@ -28,7 +28,6 @@ obj-$(CONFIG_COSA) += syncppp.o cosa.o obj-$(CONFIG_FARSYNC) += syncppp.o farsync.o obj-$(CONFIG_DSCC4) += dscc4.o obj-$(CONFIG_LANMEDIA) += syncppp.o -obj-$(CONFIG_SYNCLINK_SYNCPPP) += syncppp.o obj-$(CONFIG_X25_ASY) += x25_asy.o obj-$(CONFIG_LANMEDIA) += lmc/ diff --git a/drivers/net/wan/c101.c b/drivers/net/wan/c101.c index 43d854ace..6b63b350c 100644 --- a/drivers/net/wan/c101.c +++ b/drivers/net/wan/c101.c @@ -7,7 +7,7 @@ * under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * - * For information see http://hq.pm.waw.pl/hdlc/ + * For information see * * Sources of information: * Hitachi HD64570 SCA User's Manual @@ -116,27 +116,34 @@ static inline void openwin(card_t *card, u8 page) #include "hd6457x.c" +static inline void set_carrier(port_t *port) +{ + if (!(sca_in(MSCI1_OFFSET + ST3, port) & ST3_DCD)) + netif_carrier_on(port_to_dev(port)); + else + netif_carrier_off(port_to_dev(port)); +} + + static void sca_msci_intr(port_t *port) { - struct net_device *dev = port_to_dev(port); - card_t* card = port_to_card(port); - u8 stat = sca_in(MSCI1_OFFSET + ST1, card); /* read MSCI ST1 status */ + u8 stat = sca_in(MSCI0_OFFSET + ST1, port); /* read MSCI ST1 status */ - /* Reset MSCI TX underrun status bit */ - sca_out(stat & ST1_UDRN, MSCI0_OFFSET + ST1, card); + /* Reset MSCI TX underrun and CDCD (ignored) status bit */ + sca_out(stat & (ST1_UDRN | ST1_CDCD), MSCI0_OFFSET + ST1, port); if (stat & ST1_UDRN) { - struct net_device_stats *stats = hdlc_stats(dev); + struct net_device_stats *stats = hdlc_stats(port_to_dev(port)); stats->tx_errors++; /* TX Underrun error detected */ stats->tx_fifo_errors++; } + stat = sca_in(MSCI1_OFFSET + ST1, port); /* read MSCI1 ST1 status */ /* Reset MSCI CDCD status bit - uses ch#2 DCD input */ - sca_out(stat & ST1_CDCD, MSCI1_OFFSET + ST1, card); + sca_out(stat & ST1_CDCD, MSCI1_OFFSET + ST1, port); if (stat & ST1_CDCD) - hdlc_set_carrier(!(sca_in(MSCI1_OFFSET + ST3, card) & ST3_DCD), - dev); + set_carrier(port); } @@ -190,8 +197,7 @@ static int c101_open(struct net_device *dev) sca_out(IE1_UDRN, MSCI0_OFFSET + IE1, port); sca_out(IE0_TXINT, MSCI0_OFFSET + IE0, port); - hdlc_set_carrier(!(sca_in(MSCI1_OFFSET + ST3, port) & ST3_DCD), dev); - printk(KERN_DEBUG "0x%X\n", sca_in(MSCI1_OFFSET + ST3, port)); + set_carrier(port); /* enable MSCI1 CDCD interrupt */ sca_out(IE1_CDCD, MSCI1_OFFSET + IE1, port); @@ -326,21 +332,21 @@ static int __init c101_run(unsigned long irq, unsigned long winbase) if (request_irq(irq, sca_intr, 0, devname, card)) { printk(KERN_ERR "c101: could not allocate IRQ\n"); c101_destroy_card(card); - return(-EBUSY); + return -EBUSY; } card->irq = irq; if (!request_mem_region(winbase, C101_MAPPED_RAM_SIZE, devname)) { printk(KERN_ERR "c101: could not request RAM window\n"); c101_destroy_card(card); - return(-EBUSY); + return -EBUSY; } card->phy_winbase = winbase; card->win0base = ioremap(winbase, C101_MAPPED_RAM_SIZE); if (!card->win0base) { printk(KERN_ERR "c101: could not map I/O address\n"); c101_destroy_card(card); - return -EBUSY; + return -EFAULT; } card->tx_ring_buffers = TX_RING_BUFFERS; @@ -378,7 +384,7 @@ static int __init c101_run(unsigned long irq, unsigned long winbase) } sca_init_sync_port(card); /* Set up C101 memory */ - hdlc_set_carrier(!(sca_in(MSCI1_OFFSET + ST3, card) & ST3_DCD), dev); + set_carrier(card); printk(KERN_INFO "%s: Moxa C101 on IRQ%u," " using %u TX + %u RX packets rings\n", @@ -443,4 +449,5 @@ module_exit(c101_cleanup); MODULE_AUTHOR("Krzysztof Halasa "); MODULE_DESCRIPTION("Moxa C101 serial port driver"); MODULE_LICENSE("GPL v2"); -module_param(hw, charp, 0444); /* hw=irq,ram:irq,... */ +module_param(hw, charp, 0444); +MODULE_PARM_DESC(hw, "irq,ram:irq,..."); diff --git a/drivers/net/wan/cosa.c b/drivers/net/wan/cosa.c index e392ee8b3..1f95b4864 100644 --- a/drivers/net/wan/cosa.c +++ b/drivers/net/wan/cosa.c @@ -79,13 +79,11 @@ /* ---------- Headers, macros, data structures ---------- */ -#include #include #include #include #include #include -#include #include #include #include @@ -393,7 +391,6 @@ static int __init cosa_init(void) err = -ENODEV; goto out; } - devfs_mk_dir("cosa"); cosa_class = class_create(THIS_MODULE, "cosa"); if (IS_ERR(cosa_class)) { err = PTR_ERR(cosa_class); @@ -402,13 +399,6 @@ static int __init cosa_init(void) for (i=0; inchannels; i++) { diff --git a/drivers/net/wan/cycx_main.c b/drivers/net/wan/cycx_main.c index 430b1f630..a5e7ce1bd 100644 --- a/drivers/net/wan/cycx_main.c +++ b/drivers/net/wan/cycx_main.c @@ -40,7 +40,6 @@ * 1998/08/08 acme Initial version. */ -#include /* OS configuration options */ #include /* offsetof(), etc. */ #include /* return codes */ #include /* inline memset(), etc. */ diff --git a/drivers/net/wan/dlci.c b/drivers/net/wan/dlci.c index 6e1ec5bf2..736987559 100644 --- a/drivers/net/wan/dlci.c +++ b/drivers/net/wan/dlci.c @@ -28,7 +28,6 @@ * 2 of the License, or (at your option) any later version. */ -#include /* for CONFIG_DLCI_COUNT */ #include #include #include diff --git a/drivers/net/wan/dscc4.c b/drivers/net/wan/dscc4.c index 4505540e3..684af4316 100644 --- a/drivers/net/wan/dscc4.c +++ b/drivers/net/wan/dscc4.c @@ -732,15 +732,15 @@ static int __devinit dscc4_init_one(struct pci_dev *pdev, ioaddr = ioremap(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0)); if (!ioaddr) { - printk(KERN_ERR "%s: cannot remap MMIO region %lx @ %lx\n", - DRV_NAME, pci_resource_len(pdev, 0), - pci_resource_start(pdev, 0)); + printk(KERN_ERR "%s: cannot remap MMIO region %llx @ %llx\n", + DRV_NAME, (unsigned long long)pci_resource_len(pdev, 0), + (unsigned long long)pci_resource_start(pdev, 0)); rc = -EIO; goto err_free_mmio_regions_2; } - printk(KERN_DEBUG "Siemens DSCC4, MMIO at %#lx (regs), %#lx (lbi), IRQ %d\n", - pci_resource_start(pdev, 0), - pci_resource_start(pdev, 1), pdev->irq); + printk(KERN_DEBUG "Siemens DSCC4, MMIO at %#llx (regs), %#llx (lbi), IRQ %d\n", + (unsigned long long)pci_resource_start(pdev, 0), + (unsigned long long)pci_resource_start(pdev, 1), pdev->irq); /* Cf errata DS5 p.2 */ pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0xf8); @@ -752,7 +752,7 @@ static int __devinit dscc4_init_one(struct pci_dev *pdev, priv = pci_get_drvdata(pdev); - rc = request_irq(pdev->irq, dscc4_irq, SA_SHIRQ, DRV_NAME, priv->root); + rc = request_irq(pdev->irq, dscc4_irq, IRQF_SHARED, DRV_NAME, priv->root); if (rc < 0) { printk(KERN_WARNING "%s: IRQ %d busy\n", DRV_NAME, pdev->irq); goto err_release_4; diff --git a/drivers/net/wan/farsync.c b/drivers/net/wan/farsync.c index 7981a2c79..3705db04a 100644 --- a/drivers/net/wan/farsync.c +++ b/drivers/net/wan/farsync.c @@ -2519,7 +2519,7 @@ fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent) dbg(DBG_PCI, "kernel mem %p, ctlmem %p\n", card->mem, card->ctlmem); /* Register the interrupt handler */ - if (request_irq(pdev->irq, fst_intr, SA_SHIRQ, FST_DEV_NAME, card)) { + if (request_irq(pdev->irq, fst_intr, IRQF_SHARED, FST_DEV_NAME, card)) { printk_err("Unable to register interrupt %d\n", card->irq); pci_release_regions(pdev); pci_disable_device(pdev); diff --git a/drivers/net/wan/hd6457x.c b/drivers/net/wan/hd6457x.c index d3743321a..dce2bb317 100644 --- a/drivers/net/wan/hd6457x.c +++ b/drivers/net/wan/hd6457x.c @@ -168,6 +168,23 @@ static inline u32 buffer_offset(port_t *port, u16 desc, int transmit) } +static inline void sca_set_carrier(port_t *port) +{ + if (!(sca_in(get_msci(port) + ST3, port_to_card(port)) & ST3_DCD)) { +#ifdef DEBUG_LINK + printk(KERN_DEBUG "%s: sca_set_carrier on\n", + port_to_dev(port)->name); +#endif + netif_carrier_on(port_to_dev(port)); + } else { +#ifdef DEBUG_LINK + printk(KERN_DEBUG "%s: sca_set_carrier off\n", + port_to_dev(port)->name); +#endif + netif_carrier_off(port_to_dev(port)); + } +} + static void sca_init_sync_port(port_t *port) { @@ -237,9 +254,7 @@ static void sca_init_sync_port(port_t *port) sca_out(DIR_BOFE, DIR_TX(phy_node(port)), card); } } - - hdlc_set_carrier(!(sca_in(get_msci(port) + ST3, card) & ST3_DCD), - port_to_dev(port)); + sca_set_carrier(port); } @@ -262,8 +277,7 @@ static inline void sca_msci_intr(port_t *port) } if (stat & ST1_CDCD) - hdlc_set_carrier(!(sca_in(msci + ST3, card) & ST3_DCD), - port_to_dev(port)); + sca_set_carrier(port); } #endif @@ -566,7 +580,7 @@ static void sca_open(struct net_device *dev) - all DMA interrupts */ - hdlc_set_carrier(!(sca_in(msci + ST3, card) & ST3_DCD), dev); + sca_set_carrier(port); #ifdef __HD64570_H /* MSCI TX INT and RX INT A IRQ enable */ diff --git a/drivers/net/wan/hdlc_cisco.c b/drivers/net/wan/hdlc_cisco.c index 1fd04662c..f289daba0 100644 --- a/drivers/net/wan/hdlc_cisco.c +++ b/drivers/net/wan/hdlc_cisco.c @@ -192,9 +192,7 @@ static int cisco_rx(struct sk_buff *skb) "uptime %ud%uh%um%us)\n", dev->name, days, hrs, min, sec); -#if 0 - netif_carrier_on(dev); -#endif + netif_dormant_off(dev); hdlc->state.cisco.up = 1; } } @@ -227,9 +225,7 @@ static void cisco_timer(unsigned long arg) hdlc->state.cisco.settings.timeout * HZ)) { hdlc->state.cisco.up = 0; printk(KERN_INFO "%s: Link down\n", dev->name); -#if 0 - netif_carrier_off(dev); -#endif + netif_dormant_on(dev); } cisco_keepalive_send(dev, CISCO_KEEPALIVE_REQ, @@ -265,10 +261,7 @@ static void cisco_stop(struct net_device *dev) { hdlc_device *hdlc = dev_to_hdlc(dev); del_timer_sync(&hdlc->state.cisco.timer); -#if 0 - if (netif_carrier_ok(dev)) - netif_carrier_off(dev); -#endif + netif_dormant_on(dev); hdlc->state.cisco.up = 0; hdlc->state.cisco.request_sent = 0; } @@ -328,6 +321,7 @@ int hdlc_cisco_ioctl(struct net_device *dev, struct ifreq *ifr) dev->type = ARPHRD_CISCO; dev->flags = IFF_POINTOPOINT | IFF_NOARP; dev->addr_len = 0; + netif_dormant_on(dev); return 0; } diff --git a/drivers/net/wan/hdlc_fr.c b/drivers/net/wan/hdlc_fr.c index 523afe175..7bb737bbd 100644 --- a/drivers/net/wan/hdlc_fr.c +++ b/drivers/net/wan/hdlc_fr.c @@ -301,7 +301,7 @@ static int pvc_open(struct net_device *dev) if (pvc->open_count++ == 0) { hdlc_device *hdlc = dev_to_hdlc(pvc->master); if (hdlc->state.fr.settings.lmi == LMI_NONE) - pvc->state.active = hdlc->carrier; + pvc->state.active = netif_carrier_ok(pvc->master); pvc_carrier(pvc->state.active, pvc); hdlc->state.fr.dce_changed = 1; @@ -545,11 +545,7 @@ static void fr_set_link_state(int reliable, struct net_device *dev) hdlc->state.fr.reliable = reliable; if (reliable) { -#if 0 - if (!netif_carrier_ok(dev)) - netif_carrier_on(dev); -#endif - + netif_dormant_off(dev); hdlc->state.fr.n391cnt = 0; /* Request full status */ hdlc->state.fr.dce_changed = 1; @@ -562,11 +558,7 @@ static void fr_set_link_state(int reliable, struct net_device *dev) } } } else { -#if 0 - if (netif_carrier_ok(dev)) - netif_carrier_off(dev); -#endif - + netif_dormant_on(dev); while (pvc) { /* Deactivate all PVCs */ pvc_carrier(0, pvc); pvc->state.exist = pvc->state.active = 0; diff --git a/drivers/net/wan/hdlc_generic.c b/drivers/net/wan/hdlc_generic.c index 46cef8f92..04ca1f7b6 100644 --- a/drivers/net/wan/hdlc_generic.c +++ b/drivers/net/wan/hdlc_generic.c @@ -22,7 +22,6 @@ * - proto.start() and stop() are called with spin_lock_irq held. */ -#include #include #include #include @@ -35,10 +34,11 @@ #include #include #include +#include #include -static const char* version = "HDLC support module revision 1.18"; +static const char* version = "HDLC support module revision 1.19"; #undef DEBUG_LINK @@ -74,57 +74,51 @@ static int hdlc_rcv(struct sk_buff *skb, struct net_device *dev, -static void __hdlc_set_carrier_on(struct net_device *dev) +static inline void hdlc_proto_start(struct net_device *dev) { hdlc_device *hdlc = dev_to_hdlc(dev); if (hdlc->proto.start) return hdlc->proto.start(dev); -#if 0 -#ifdef DEBUG_LINK - if (netif_carrier_ok(dev)) - printk(KERN_ERR "hdlc_set_carrier_on(): already on\n"); -#endif - netif_carrier_on(dev); -#endif } -static void __hdlc_set_carrier_off(struct net_device *dev) +static inline void hdlc_proto_stop(struct net_device *dev) { hdlc_device *hdlc = dev_to_hdlc(dev); if (hdlc->proto.stop) return hdlc->proto.stop(dev); - -#if 0 -#ifdef DEBUG_LINK - if (!netif_carrier_ok(dev)) - printk(KERN_ERR "hdlc_set_carrier_off(): already off\n"); -#endif - netif_carrier_off(dev); -#endif } -void hdlc_set_carrier(int on, struct net_device *dev) +static int hdlc_device_event(struct notifier_block *this, unsigned long event, + void *ptr) { - hdlc_device *hdlc = dev_to_hdlc(dev); + struct net_device *dev = ptr; + hdlc_device *hdlc; unsigned long flags; - on = on ? 1 : 0; + int on; + + if (dev->get_stats != hdlc_get_stats) + return NOTIFY_DONE; /* not an HDLC device */ + + if (event != NETDEV_CHANGE) + return NOTIFY_DONE; /* Only interrested in carrier changes */ + + on = netif_carrier_ok(dev); #ifdef DEBUG_LINK - printk(KERN_DEBUG "hdlc_set_carrier %i\n", on); + printk(KERN_DEBUG "%s: hdlc_device_event NETDEV_CHANGE, carrier %i\n", + dev->name, on); #endif + hdlc = dev_to_hdlc(dev); spin_lock_irqsave(&hdlc->state_lock, flags); if (hdlc->carrier == on) goto carrier_exit; /* no change in DCD line level */ -#ifdef DEBUG_LINK - printk(KERN_INFO "%s: carrier %s\n", dev->name, on ? "ON" : "off"); -#endif hdlc->carrier = on; if (!hdlc->open) @@ -132,14 +126,15 @@ void hdlc_set_carrier(int on, struct net_device *dev) if (hdlc->carrier) { printk(KERN_INFO "%s: Carrier detected\n", dev->name); - __hdlc_set_carrier_on(dev); + hdlc_proto_start(dev); } else { printk(KERN_INFO "%s: Carrier lost\n", dev->name); - __hdlc_set_carrier_off(dev); + hdlc_proto_stop(dev); } carrier_exit: spin_unlock_irqrestore(&hdlc->state_lock, flags); + return NOTIFY_DONE; } @@ -166,7 +161,7 @@ int hdlc_open(struct net_device *dev) if (hdlc->carrier) { printk(KERN_INFO "%s: Carrier detected\n", dev->name); - __hdlc_set_carrier_on(dev); + hdlc_proto_start(dev); } else printk(KERN_INFO "%s: No carrier\n", dev->name); @@ -191,7 +186,7 @@ void hdlc_close(struct net_device *dev) hdlc->open = 0; if (hdlc->carrier) - __hdlc_set_carrier_off(dev); + hdlc_proto_stop(dev); spin_unlock_irq(&hdlc->state_lock); @@ -259,7 +254,7 @@ int hdlc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) } } -static void hdlc_setup(struct net_device *dev) +void hdlc_setup(struct net_device *dev) { hdlc_device *hdlc = dev_to_hdlc(dev); @@ -288,26 +283,6 @@ struct net_device *alloc_hdlcdev(void *priv) return dev; } -int register_hdlc_device(struct net_device *dev) -{ - int result = dev_alloc_name(dev, "hdlc%d"); - if (result < 0) - return result; - - result = register_netdev(dev); - if (result != 0) - return -EIO; - -#if 0 - if (netif_carrier_ok(dev)) - netif_carrier_off(dev); /* no carrier until DCD goes up */ -#endif - - return 0; -} - - - void unregister_hdlc_device(struct net_device *dev) { rtnl_lock(); @@ -324,10 +299,9 @@ MODULE_LICENSE("GPL v2"); EXPORT_SYMBOL(hdlc_open); EXPORT_SYMBOL(hdlc_close); -EXPORT_SYMBOL(hdlc_set_carrier); EXPORT_SYMBOL(hdlc_ioctl); +EXPORT_SYMBOL(hdlc_setup); EXPORT_SYMBOL(alloc_hdlcdev); -EXPORT_SYMBOL(register_hdlc_device); EXPORT_SYMBOL(unregister_hdlc_device); static struct packet_type hdlc_packet_type = { @@ -336,9 +310,18 @@ static struct packet_type hdlc_packet_type = { }; +static struct notifier_block hdlc_notifier = { + .notifier_call = hdlc_device_event, +}; + + static int __init hdlc_module_init(void) { + int result; + printk(KERN_INFO "%s\n", version); + if ((result = register_netdevice_notifier(&hdlc_notifier)) != 0) + return result; dev_add_pack(&hdlc_packet_type); return 0; } @@ -348,6 +331,7 @@ static int __init hdlc_module_init(void) static void __exit hdlc_module_exit(void) { dev_remove_pack(&hdlc_packet_type); + unregister_netdevice_notifier(&hdlc_notifier); } diff --git a/drivers/net/wan/hdlc_ppp.c b/drivers/net/wan/hdlc_ppp.c index b81263eae..fbaab5bf7 100644 --- a/drivers/net/wan/hdlc_ppp.c +++ b/drivers/net/wan/hdlc_ppp.c @@ -107,6 +107,7 @@ int hdlc_ppp_ioctl(struct net_device *dev, struct ifreq *ifr) dev->hard_header = NULL; dev->type = ARPHRD_PPP; dev->addr_len = 0; + netif_dormant_off(dev); return 0; } diff --git a/drivers/net/wan/hdlc_raw.c b/drivers/net/wan/hdlc_raw.c index 9456d31cb..f15aa6ba7 100644 --- a/drivers/net/wan/hdlc_raw.c +++ b/drivers/net/wan/hdlc_raw.c @@ -82,6 +82,7 @@ int hdlc_raw_ioctl(struct net_device *dev, struct ifreq *ifr) dev->type = ARPHRD_RAWHDLC; dev->flags = IFF_POINTOPOINT | IFF_NOARP; dev->addr_len = 0; + netif_dormant_off(dev); return 0; } diff --git a/drivers/net/wan/hdlc_raw_eth.c b/drivers/net/wan/hdlc_raw_eth.c index b1285cc8f..d1884987f 100644 --- a/drivers/net/wan/hdlc_raw_eth.c +++ b/drivers/net/wan/hdlc_raw_eth.c @@ -100,6 +100,7 @@ int hdlc_raw_eth_ioctl(struct net_device *dev, struct ifreq *ifr) dev->tx_queue_len = old_qlen; memcpy(dev->dev_addr, "\x00\x01", 2); get_random_bytes(dev->dev_addr + 2, ETH_ALEN - 2); + netif_dormant_off(dev); return 0; } diff --git a/drivers/net/wan/hdlc_x25.c b/drivers/net/wan/hdlc_x25.c index 07e5eef1f..a867fb411 100644 --- a/drivers/net/wan/hdlc_x25.c +++ b/drivers/net/wan/hdlc_x25.c @@ -212,6 +212,7 @@ int hdlc_x25_ioctl(struct net_device *dev, struct ifreq *ifr) dev->hard_header = NULL; dev->type = ARPHRD_X25; dev->addr_len = 0; + netif_dormant_off(dev); return 0; } diff --git a/drivers/net/wan/hostess_sv11.c b/drivers/net/wan/hostess_sv11.c index cf5c80545..a4f735723 100644 --- a/drivers/net/wan/hostess_sv11.c +++ b/drivers/net/wan/hostess_sv11.c @@ -264,7 +264,7 @@ static struct sv11_device *sv11_init(int iobase, int irq) /* We want a fast IRQ for this device. Actually we'd like an even faster IRQ ;) - This is one driver RtLinux is made for */ - if(request_irq(irq, &z8530_interrupt, SA_INTERRUPT, "Hostess SV11", dev)<0) + if(request_irq(irq, &z8530_interrupt, IRQF_DISABLED, "Hostess SV11", dev)<0) { printk(KERN_WARNING "hostess: IRQ %d already in use.\n", irq); goto fail1; diff --git a/drivers/net/wan/lmc/lmc_main.c b/drivers/net/wan/lmc/lmc_main.c index 40926d779..39f44241a 100644 --- a/drivers/net/wan/lmc/lmc_main.c +++ b/drivers/net/wan/lmc/lmc_main.c @@ -1058,7 +1058,7 @@ static int lmc_open (struct net_device *dev) /*fold00*/ lmc_softreset (sc); /* Since we have to use PCI bus, this should work on x86,alpha,ppc */ - if (request_irq (dev->irq, &lmc_interrupt, SA_SHIRQ, dev->name, dev)){ + if (request_irq (dev->irq, &lmc_interrupt, IRQF_SHARED, dev->name, dev)){ printk(KERN_WARNING "%s: could not get irq: %d\n", dev->name, dev->irq); lmc_trace(dev, "lmc_open irq failed out"); return -EAGAIN; diff --git a/drivers/net/wan/lmc/lmc_media.c b/drivers/net/wan/lmc/lmc_media.c index af8b55fdd..ae01555d2 100644 --- a/drivers/net/wan/lmc/lmc_media.c +++ b/drivers/net/wan/lmc/lmc_media.c @@ -1,6 +1,5 @@ /* $Id: lmc_media.c,v 1.13 2000/04/11 05:25:26 asj Exp $ */ -#include #include #include #include diff --git a/drivers/net/wan/n2.c b/drivers/net/wan/n2.c index cd32751b6..dcf46add3 100644 --- a/drivers/net/wan/n2.c +++ b/drivers/net/wan/n2.c @@ -7,7 +7,7 @@ * under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * - * For information see http://hq.pm.waw.pl/hdlc/ + * For information see * * Note: integrated CSU/DSU/DDS are not supported by this driver * @@ -387,6 +387,11 @@ static int __init n2_run(unsigned long io, unsigned long irq, } card->phy_winbase = winbase; card->winbase = ioremap(winbase, USE_WINDOWSIZE); + if (!card->winbase) { + printk(KERN_ERR "n2: ioremap() failed\n"); + n2_destroy_card(card); + return -EFAULT; + } outb(0, io + N2_PCR); outb(winbase >> 12, io + N2_BAR); @@ -559,4 +564,5 @@ module_exit(n2_cleanup); MODULE_AUTHOR("Krzysztof Halasa "); MODULE_DESCRIPTION("RISCom/N2 serial port driver"); MODULE_LICENSE("GPL v2"); -module_param(hw, charp, 0444); /* hw=io,irq,ram,ports:io,irq,... */ +module_param(hw, charp, 0444); +MODULE_PARM_DESC(hw, "io,irq,ram,ports:io,irq,..."); diff --git a/drivers/net/wan/pc300_drv.c b/drivers/net/wan/pc300_drv.c index a3e65d1bc..567effff4 100644 --- a/drivers/net/wan/pc300_drv.c +++ b/drivers/net/wan/pc300_drv.c @@ -3445,9 +3445,9 @@ cpc_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) card = (pc300_t *) kmalloc(sizeof(pc300_t), GFP_KERNEL); if (card == NULL) { - printk("PC300 found at RAM 0x%08lx, " + printk("PC300 found at RAM 0x%016llx, " "but could not allocate card structure.\n", - pci_resource_start(pdev, 3)); + (unsigned long long)pci_resource_start(pdev, 3)); err = -ENOMEM; goto err_disable_dev; } @@ -3600,7 +3600,7 @@ cpc_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) } /* Allocate IRQ */ - if (request_irq(card->hw.irq, cpc_intr, SA_SHIRQ, "Cyclades-PC300", card)) { + if (request_irq(card->hw.irq, cpc_intr, IRQF_SHARED, "Cyclades-PC300", card)) { printk ("PC300 found at RAM 0x%08x, but could not allocate IRQ%d.\n", card->hw.ramphys, card->hw.irq); goto err_io_unmap; diff --git a/drivers/net/wan/pci200syn.c b/drivers/net/wan/pci200syn.c index eba8e5cfa..4df61fa32 100644 --- a/drivers/net/wan/pci200syn.c +++ b/drivers/net/wan/pci200syn.c @@ -7,7 +7,7 @@ * under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * - * For information see http://hq.pm.waw.pl/hdlc/ + * For information see * * Sources of information: * Hitachi HD64572 SCA-II User's Manual @@ -50,10 +50,6 @@ static const char* devname = "PCI200SYN"; static int pci_clock_freq = 33000000; #define CLOCK_BASE pci_clock_freq -#define PCI_VENDOR_ID_GORAMO 0x10B5 /* uses PLX:9050 ID - this card */ -#define PCI_DEVICE_ID_PCI200SYN 0x9050 /* doesn't have its own ID */ - - /* * PLX PCI9052 local configuration and shared runtime registers. * This structure can be used to access 9052 registers (memory mapped). @@ -262,7 +258,7 @@ static void pci200_pci_remove_one(struct pci_dev *pdev) int i; card_t *card = pci_get_drvdata(pdev); - for(i = 0; i < 2; i++) + for (i = 0; i < 2; i++) if (card->ports[i].card) { struct net_device *dev = port_to_dev(&card->ports[i]); unregister_hdlc_device(dev); @@ -358,6 +354,7 @@ static int __devinit pci200_pci_init_one(struct pci_dev *pdev, card->rambase == NULL) { printk(KERN_ERR "pci200syn: ioremap() failed\n"); pci200_pci_remove_one(pdev); + return -EFAULT; } /* Reset PLX */ @@ -385,6 +382,15 @@ static int __devinit pci200_pci_init_one(struct pci_dev *pdev, " %u RX packets rings\n", ramsize / 1024, ramphys, pdev->irq, card->tx_ring_buffers, card->rx_ring_buffers); + if (pdev->subsystem_device == PCI_DEVICE_ID_PLX_9050) { + printk(KERN_ERR "Detected PCI200SYN card with old " + "configuration data.\n"); + printk(KERN_ERR "See for update.\n"); + printk(KERN_ERR "The card will stop working with" + " future versions of Linux if not updated.\n"); + } + if (card->tx_ring_buffers < 1) { printk(KERN_ERR "pci200syn: RAM test failed\n"); pci200_pci_remove_one(pdev); @@ -396,7 +402,7 @@ static int __devinit pci200_pci_init_one(struct pci_dev *pdev, writew(readw(p) | 0x0040, p); /* Allocate IRQ */ - if(request_irq(pdev->irq, sca_intr, SA_SHIRQ, devname, card)) { + if (request_irq(pdev->irq, sca_intr, IRQF_SHARED, devname, card)) { printk(KERN_WARNING "pci200syn: could not allocate IRQ%d.\n", pdev->irq); pci200_pci_remove_one(pdev); @@ -406,7 +412,7 @@ static int __devinit pci200_pci_init_one(struct pci_dev *pdev, sca_init(card, 0); - for(i = 0; i < 2; i++) { + for (i = 0; i < 2; i++) { port_t *port = &card->ports[i]; struct net_device *dev = port_to_dev(port); hdlc_device *hdlc = dev_to_hdlc(dev); @@ -425,7 +431,7 @@ static int __devinit pci200_pci_init_one(struct pci_dev *pdev, hdlc->xmit = sca_xmit; port->settings.clock_type = CLOCK_EXT; port->card = card; - if(register_hdlc_device(dev)) { + if (register_hdlc_device(dev)) { printk(KERN_ERR "pci200syn: unable to register hdlc " "device\n"); port->card = NULL; @@ -445,8 +451,10 @@ static int __devinit pci200_pci_init_one(struct pci_dev *pdev, static struct pci_device_id pci200_pci_tbl[] __devinitdata = { - { PCI_VENDOR_ID_GORAMO, PCI_DEVICE_ID_PCI200SYN, PCI_ANY_ID, - PCI_ANY_ID, 0, 0, 0 }, + { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, PCI_VENDOR_ID_PLX, + PCI_DEVICE_ID_PLX_9050, 0, 0, 0 }, + { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, PCI_VENDOR_ID_PLX, + PCI_DEVICE_ID_PLX_PCI200SYN, 0, 0, 0 }, { 0, } }; diff --git a/drivers/net/wan/sbni.c b/drivers/net/wan/sbni.c index 175ba13bc..fc75bec19 100644 --- a/drivers/net/wan/sbni.c +++ b/drivers/net/wan/sbni.c @@ -37,7 +37,6 @@ * Known problem: this driver wasn't tested on multiprocessor machine. */ -#include #include #include #include @@ -1193,7 +1192,7 @@ sbni_open( struct net_device *dev ) } } - if( request_irq(dev->irq, sbni_interrupt, SA_SHIRQ, dev->name, dev) ) { + if( request_irq(dev->irq, sbni_interrupt, IRQF_SHARED, dev->name, dev) ) { printk( KERN_ERR "%s: unable to get IRQ %d.\n", dev->name, dev->irq ); return -EAGAIN; diff --git a/drivers/net/wan/sdla.c b/drivers/net/wan/sdla.c index 22e794071..0ba018f83 100644 --- a/drivers/net/wan/sdla.c +++ b/drivers/net/wan/sdla.c @@ -32,7 +32,6 @@ * 2 of the License, or (at your option) any later version. */ -#include /* for CONFIG_DLCI_MAX */ #include #include #include @@ -60,9 +59,9 @@ static const char* version = "SDLA driver v0.30, 12 Sep 1996, mike.mclagan@linux.org"; -static unsigned int valid_port[] __initdata = { 0x250, 0x270, 0x280, 0x300, 0x350, 0x360, 0x380, 0x390}; +static unsigned int valid_port[] = { 0x250, 0x270, 0x280, 0x300, 0x350, 0x360, 0x380, 0x390}; -static unsigned int valid_mem[] __initdata = { +static unsigned int valid_mem[] = { 0xA0000, 0xA2000, 0xA4000, 0xA6000, 0xA8000, 0xAA000, 0xAC000, 0xAE000, 0xB0000, 0xB2000, 0xB4000, 0xB6000, 0xB8000, 0xBA000, 0xBC000, 0xBE000, 0xC0000, 0xC2000, 0xC4000, 0xC6000, 0xC8000, 0xCA000, 0xCC000, 0xCE000, diff --git a/drivers/net/wan/sealevel.c b/drivers/net/wan/sealevel.c index 050e854e7..70fb1b98b 100644 --- a/drivers/net/wan/sealevel.c +++ b/drivers/net/wan/sealevel.c @@ -322,7 +322,7 @@ static __init struct slvl_board *slvl_init(int iobase, int irq, /* We want a fast IRQ for this device. Actually we'd like an even faster IRQ ;) - This is one driver RtLinux is made for */ - if(request_irq(irq, &z8530_interrupt, SA_INTERRUPT, "SeaLevel", dev)<0) + if(request_irq(irq, &z8530_interrupt, IRQF_DISABLED, "SeaLevel", dev)<0) { printk(KERN_WARNING "sealevel: IRQ %d already in use.\n", irq); goto fail1_1; diff --git a/drivers/net/wan/syncppp.c b/drivers/net/wan/syncppp.c index 2d1bba06a..c13b459a0 100644 --- a/drivers/net/wan/syncppp.c +++ b/drivers/net/wan/syncppp.c @@ -37,7 +37,6 @@ */ #undef DEBUG -#include #include #include #include diff --git a/drivers/net/wan/wanxl.c b/drivers/net/wan/wanxl.c index 29a756dd9..b2031dfc4 100644 --- a/drivers/net/wan/wanxl.c +++ b/drivers/net/wan/wanxl.c @@ -149,7 +149,10 @@ static inline void wanxl_cable_intr(port_t *port) printk(KERN_INFO "%s: %s%s module, %s cable%s%s\n", port->dev->name, pm, dte, cable, dsr, dcd); - hdlc_set_carrier(value & STATUS_CABLE_DCD, port->dev); + if (value & STATUS_CABLE_DCD) + netif_carrier_on(port->dev); + else + netif_carrier_off(port->dev); } @@ -634,7 +637,13 @@ static int __devinit wanxl_pci_init_one(struct pci_dev *pdev, /* set up PLX mapping */ plx_phy = pci_resource_start(pdev, 0); + card->plx = ioremap_nocache(plx_phy, 0x70); + if (!card->plx) { + printk(KERN_ERR "wanxl: ioremap() failed\n"); + wanxl_pci_remove_one(pdev); + return -EFAULT; + } #if RESET_WHILE_LOADING wanxl_reset(card); @@ -700,6 +709,12 @@ static int __devinit wanxl_pci_init_one(struct pci_dev *pdev, } mem = ioremap_nocache(mem_phy, PDM_OFFSET + sizeof(firmware)); + if (!mem) { + printk(KERN_ERR "wanxl: ioremap() failed\n"); + wanxl_pci_remove_one(pdev); + return -EFAULT; + } + for (i = 0; i < sizeof(firmware); i += 4) writel(htonl(*(u32*)(firmware + i)), mem + PDM_OFFSET + i); @@ -743,7 +758,7 @@ static int __devinit wanxl_pci_init_one(struct pci_dev *pdev, pci_name(pdev), plx_phy, ramsize / 1024, mem_phy, pdev->irq); /* Allocate IRQ */ - if (request_irq(pdev->irq, wanxl_intr, SA_SHIRQ, "wanXL", card)) { + if (request_irq(pdev->irq, wanxl_intr, IRQF_SHARED, "wanXL", card)) { printk(KERN_WARNING "wanXL %s: could not allocate IRQ%i.\n", pci_name(pdev), pdev->irq); wanxl_pci_remove_one(pdev); diff --git a/drivers/net/wd.c b/drivers/net/wd.c index 7caa8dc88..b1ba1872f 100644 --- a/drivers/net/wd.c +++ b/drivers/net/wd.c @@ -500,8 +500,8 @@ MODULE_LICENSE("GPL"); /* This is set up so that only a single autoprobe takes place per call. ISA device autoprobes on a running machine are not recommended. */ -int -init_module(void) + +int __init init_module(void) { struct net_device *dev; int this_dev, found = 0; diff --git a/drivers/net/wireless/Kconfig b/drivers/net/wireless/Kconfig index ec37df734..2e8ac995d 100644 --- a/drivers/net/wireless/Kconfig +++ b/drivers/net/wireless/Kconfig @@ -235,7 +235,35 @@ config IPW2200_MONITOR promiscuous mode via the Wireless Tool's Monitor mode. While in this mode, no packets can be sent. -config IPW_QOS +config IPW2200_RADIOTAP + bool "Enable radiotap format 802.11 raw packet support" + depends on IPW2200_MONITOR + +config IPW2200_PROMISCUOUS + bool "Enable creation of a RF radiotap promiscuous interface" + depends on IPW2200_MONITOR + select IPW2200_RADIOTAP + ---help--- + Enables the creation of a second interface prefixed 'rtap'. + This second interface will provide every received in radiotap + format. + + This is useful for performing wireless network analysis while + maintaining an active association. + + Example usage: + + % modprobe ipw2200 rtap_iface=1 + % ifconfig rtap0 up + % tethereal -i rtap0 + + If you do not specify 'rtap_iface=1' as a module parameter then + the rtap interface will not be created and you will need to turn + it on via sysfs: + + % echo 1 > /sys/bus/pci/drivers/ipw2200/*/rtap_iface + +config IPW2200_QOS bool "Enable QoS support" depends on IPW2200 && EXPERIMENTAL @@ -263,15 +291,6 @@ config IPW2200_DEBUG If you are not trying to debug or develop the IPW2200 driver, you most likely want to say N here. -config IPW2200_MONITOR - bool "Enable promiscuous mode" - depends on IPW2200 - ---help--- - Enables promiscuous/monitor mode support for the ipw2200 driver. - With this feature compiled into the driver, you can switch to - promiscuous mode via the Wireless Tool's Monitor mode. While in this - mode, no packets can be sent. - config AIRO tristate "Cisco/Aironet 34X/35X/4500/4800 ISA and PCI cards" depends on NET_RADIO && ISA_DMA_API && (PCI || BROKEN) @@ -428,6 +447,7 @@ config AIRO_CS tristate "Cisco/Aironet 34X/35X/4500/4800 PCMCIA cards" depends on NET_RADIO && PCMCIA && (BROKEN || !M32R) select CRYPTO + select CRYPTO_AES ---help--- This is the standard Linux driver to support Cisco/Aironet PCMCIA 802.11 wireless cards. This driver is the same as the Aironet @@ -512,8 +532,26 @@ config PRISM54 say M here and read . The module will be called prism54.ko. +config USB_ZD1201 + tristate "USB ZD1201 based Wireless device support" + depends on USB && NET_RADIO + select FW_LOADER + ---help--- + Say Y if you want to use wireless LAN adapters based on the ZyDAS + ZD1201 chip. + + This driver makes the adapter appear as a normal Ethernet interface, + typically on wlan0. + + The zd1201 device requires external firmware to be loaded. + This can be found at http://linux-lc100020.sourceforge.net/ + + To compile this driver as a module, choose M here: the + module will be called zd1201. + source "drivers/net/wireless/hostap/Kconfig" source "drivers/net/wireless/bcm43xx/Kconfig" +source "drivers/net/wireless/zd1211rw/Kconfig" # yes, this works even when no drivers are selected config NET_WIRELESS diff --git a/drivers/net/wireless/Makefile b/drivers/net/wireless/Makefile index c86779879..c613af17a 100644 --- a/drivers/net/wireless/Makefile +++ b/drivers/net/wireless/Makefile @@ -36,7 +36,10 @@ obj-$(CONFIG_PRISM54) += prism54/ obj-$(CONFIG_HOSTAP) += hostap/ obj-$(CONFIG_BCM43XX) += bcm43xx/ +obj-$(CONFIG_ZD1211RW) += zd1211rw/ # 16-bit wireless PCMCIA client drivers obj-$(CONFIG_PCMCIA_RAYCS) += ray_cs.o obj-$(CONFIG_PCMCIA_WL3501) += wl3501_cs.o + +obj-$(CONFIG_USB_ZD1201) += zd1201.o diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c index 00764ddd7..a4dd13942 100644 --- a/drivers/net/wireless/airo.c +++ b/drivers/net/wireless/airo.c @@ -19,7 +19,6 @@ ======================================================================*/ -#include #include #include @@ -47,6 +46,7 @@ #include #include #include +#include #include "airo.h" @@ -467,6 +467,8 @@ static int do8bitIO = 0; #define RID_ECHOTEST_RESULTS 0xFF71 #define RID_BSSLISTFIRST 0xFF72 #define RID_BSSLISTNEXT 0xFF73 +#define RID_WPA_BSSLISTFIRST 0xFF74 +#define RID_WPA_BSSLISTNEXT 0xFF75 typedef struct { u16 cmd; @@ -739,6 +741,14 @@ typedef struct { u16 extSoftCap; } CapabilityRid; + +/* Only present on firmware >= 5.30.17 */ +typedef struct { + u16 unknown[4]; + u8 fixed[12]; /* WLAN management frame */ + u8 iep[624]; +} BSSListRidExtra; + typedef struct { u16 len; u16 index; /* First is 0 and 0xffff means end of list */ @@ -767,6 +777,9 @@ typedef struct { } fh; u16 dsChannel; u16 atimWindow; + + /* Only present on firmware >= 5.30.17 */ + BSSListRidExtra extra; } BSSListRid; typedef struct { @@ -1140,8 +1153,6 @@ struct airo_info { char defindex; // Used with auto wep struct proc_dir_entry *proc_entry; spinlock_t aux_lock; - unsigned long flags; -#define FLAG_PROMISC 8 /* IFF_PROMISC 0x100 - include/linux/if.h */ #define FLAG_RADIO_OFF 0 /* User disabling of MAC */ #define FLAG_RADIO_DOWN 1 /* ifup/ifdown disabling of MAC */ #define FLAG_RADIO_MASK 0x03 @@ -1151,6 +1162,7 @@ struct airo_info { #define FLAG_UPDATE_MULTI 5 #define FLAG_UPDATE_UNI 6 #define FLAG_802_11 7 +#define FLAG_PROMISC 8 /* IFF_PROMISC 0x100 - include/linux/if.h */ #define FLAG_PENDING_XMIT 9 #define FLAG_PENDING_XMIT11 10 #define FLAG_MPI 11 @@ -1158,17 +1170,19 @@ struct airo_info { #define FLAG_COMMIT 13 #define FLAG_RESET 14 #define FLAG_FLASHING 15 -#define JOB_MASK 0x2ff0000 -#define JOB_DIE 16 -#define JOB_XMIT 17 -#define JOB_XMIT11 18 -#define JOB_STATS 19 -#define JOB_PROMISC 20 -#define JOB_MIC 21 -#define JOB_EVENT 22 -#define JOB_AUTOWEP 23 -#define JOB_WSTATS 24 -#define JOB_SCAN_RESULTS 25 +#define FLAG_WPA_CAPABLE 16 + unsigned long flags; +#define JOB_DIE 0 +#define JOB_XMIT 1 +#define JOB_XMIT11 2 +#define JOB_STATS 3 +#define JOB_PROMISC 4 +#define JOB_MIC 5 +#define JOB_EVENT 6 +#define JOB_AUTOWEP 7 +#define JOB_WSTATS 8 +#define JOB_SCAN_RESULTS 9 + unsigned long jobs; int (*bap_read)(struct airo_info*, u16 *pu16Dst, int bytelen, int whichbap); unsigned short *flash; @@ -1208,6 +1222,11 @@ struct airo_info { #define PCI_SHARED_LEN 2*MPI_MAX_FIDS*PKTSIZE+RIDSIZE char proc_name[IFNAMSIZ]; + /* WPA-related stuff */ + unsigned int bssListFirst; + unsigned int bssListNext; + unsigned int bssListRidLen; + struct list_head network_list; struct list_head network_free_list; BSSListElement *networks; @@ -1264,7 +1283,7 @@ static void micinit(struct airo_info *ai) { MICRid mic_rid; - clear_bit(JOB_MIC, &ai->flags); + clear_bit(JOB_MIC, &ai->jobs); PC4500_readrid(ai, RID_MIC, &mic_rid, sizeof(mic_rid), 0); up(&ai->sem); @@ -1705,24 +1724,24 @@ static void emmh32_final(emmh32_context *context, u8 digest[4]) static int readBSSListRid(struct airo_info *ai, int first, BSSListRid *list) { int rc; - Cmd cmd; - Resp rsp; + Cmd cmd; + Resp rsp; if (first == 1) { - if (ai->flags & FLAG_RADIO_MASK) return -ENETDOWN; - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd=CMD_LISTBSS; - if (down_interruptible(&ai->sem)) - return -ERESTARTSYS; - issuecommand(ai, &cmd, &rsp); - up(&ai->sem); - /* Let the command take effect */ - ai->task = current; - ssleep(3); - ai->task = NULL; - } - rc = PC4500_readrid(ai, first ? RID_BSSLISTFIRST : RID_BSSLISTNEXT, - list, sizeof(*list), 1); + if (ai->flags & FLAG_RADIO_MASK) return -ENETDOWN; + memset(&cmd, 0, sizeof(cmd)); + cmd.cmd=CMD_LISTBSS; + if (down_interruptible(&ai->sem)) + return -ERESTARTSYS; + issuecommand(ai, &cmd, &rsp); + up(&ai->sem); + /* Let the command take effect */ + ai->task = current; + ssleep(3); + ai->task = NULL; + } + rc = PC4500_readrid(ai, first ? ai->bssListFirst : ai->bssListNext, + list, ai->bssListRidLen, 1); list->len = le16_to_cpu(list->len); list->index = le16_to_cpu(list->index); @@ -2112,7 +2131,7 @@ static void airo_end_xmit(struct net_device *dev) { int fid = priv->xmit.fid; u32 *fids = priv->fids; - clear_bit(JOB_XMIT, &priv->flags); + clear_bit(JOB_XMIT, &priv->jobs); clear_bit(FLAG_PENDING_XMIT, &priv->flags); status = transmit_802_3_packet (priv, fids[fid], skb->data); up(&priv->sem); @@ -2162,7 +2181,7 @@ static int airo_start_xmit(struct sk_buff *skb, struct net_device *dev) { if (down_trylock(&priv->sem) != 0) { set_bit(FLAG_PENDING_XMIT, &priv->flags); netif_stop_queue(dev); - set_bit(JOB_XMIT, &priv->flags); + set_bit(JOB_XMIT, &priv->jobs); wake_up_interruptible(&priv->thr_wait); } else airo_end_xmit(dev); @@ -2177,7 +2196,7 @@ static void airo_end_xmit11(struct net_device *dev) { int fid = priv->xmit11.fid; u32 *fids = priv->fids; - clear_bit(JOB_XMIT11, &priv->flags); + clear_bit(JOB_XMIT11, &priv->jobs); clear_bit(FLAG_PENDING_XMIT11, &priv->flags); status = transmit_802_11_packet (priv, fids[fid], skb->data); up(&priv->sem); @@ -2233,7 +2252,7 @@ static int airo_start_xmit11(struct sk_buff *skb, struct net_device *dev) { if (down_trylock(&priv->sem) != 0) { set_bit(FLAG_PENDING_XMIT11, &priv->flags); netif_stop_queue(dev); - set_bit(JOB_XMIT11, &priv->flags); + set_bit(JOB_XMIT11, &priv->jobs); wake_up_interruptible(&priv->thr_wait); } else airo_end_xmit11(dev); @@ -2244,7 +2263,7 @@ static void airo_read_stats(struct airo_info *ai) { StatsRid stats_rid; u32 *vals = stats_rid.vals; - clear_bit(JOB_STATS, &ai->flags); + clear_bit(JOB_STATS, &ai->jobs); if (ai->power.event) { up(&ai->sem); return; @@ -2272,10 +2291,10 @@ static struct net_device_stats *airo_get_stats(struct net_device *dev) { struct airo_info *local = dev->priv; - if (!test_bit(JOB_STATS, &local->flags)) { + if (!test_bit(JOB_STATS, &local->jobs)) { /* Get stats out of the card if available */ if (down_trylock(&local->sem) != 0) { - set_bit(JOB_STATS, &local->flags); + set_bit(JOB_STATS, &local->jobs); wake_up_interruptible(&local->thr_wait); } else airo_read_stats(local); @@ -2290,7 +2309,7 @@ static void airo_set_promisc(struct airo_info *ai) { memset(&cmd, 0, sizeof(cmd)); cmd.cmd=CMD_SETMODE; - clear_bit(JOB_PROMISC, &ai->flags); + clear_bit(JOB_PROMISC, &ai->jobs); cmd.parm0=(ai->flags&IFF_PROMISC) ? PROMISC : NOPROMISC; issuecommand(ai, &cmd, &rsp); up(&ai->sem); @@ -2302,7 +2321,7 @@ static void airo_set_multicast_list(struct net_device *dev) { if ((dev->flags ^ ai->flags) & IFF_PROMISC) { change_bit(FLAG_PROMISC, &ai->flags); if (down_trylock(&ai->sem) != 0) { - set_bit(JOB_PROMISC, &ai->flags); + set_bit(JOB_PROMISC, &ai->jobs); wake_up_interruptible(&ai->thr_wait); } else airo_set_promisc(ai); @@ -2380,7 +2399,7 @@ void stop_airo_card( struct net_device *dev, int freeres ) } clear_bit(FLAG_REGISTERED, &ai->flags); } - set_bit(JOB_DIE, &ai->flags); + set_bit(JOB_DIE, &ai->jobs); kill_proc(ai->thr_pid, SIGTERM, 1); wait_for_completion(&ai->thr_exited); @@ -2701,14 +2720,14 @@ static int reset_card( struct net_device *dev , int lock) { return 0; } -#define MAX_NETWORK_COUNT 64 +#define AIRO_MAX_NETWORK_COUNT 64 static int airo_networks_allocate(struct airo_info *ai) { if (ai->networks) return 0; ai->networks = - kzalloc(MAX_NETWORK_COUNT * sizeof(BSSListElement), + kzalloc(AIRO_MAX_NETWORK_COUNT * sizeof(BSSListElement), GFP_KERNEL); if (!ai->networks) { airo_print_warn(ai->dev->name, "Out of memory allocating beacons"); @@ -2732,11 +2751,33 @@ static void airo_networks_initialize(struct airo_info *ai) INIT_LIST_HEAD(&ai->network_free_list); INIT_LIST_HEAD(&ai->network_list); - for (i = 0; i < MAX_NETWORK_COUNT; i++) + for (i = 0; i < AIRO_MAX_NETWORK_COUNT; i++) list_add_tail(&ai->networks[i].list, &ai->network_free_list); } +static int airo_test_wpa_capable(struct airo_info *ai) +{ + int status; + CapabilityRid cap_rid; + const char *name = ai->dev->name; + + status = readCapabilityRid(ai, &cap_rid, 1); + if (status != SUCCESS) return 0; + + /* Only firmware versions 5.30.17 or better can do WPA */ + if ((cap_rid.softVer > 0x530) + || ((cap_rid.softVer == 0x530) && (cap_rid.softSubVer >= 17))) { + airo_print_info(name, "WPA is supported."); + return 1; + } + + /* No WPA support */ + airo_print_info(name, "WPA unsupported (only firmware versions 5.30.17" + " and greater support WPA. Detected %s)", cap_rid.prodVer); + return 0; +} + static struct net_device *_init_airo_card( unsigned short irq, int port, int is_pcmcia, struct pci_dev *pci, struct device *dmdev ) @@ -2759,6 +2800,7 @@ static struct net_device *_init_airo_card( unsigned short irq, int port, ai = dev->priv; ai->wifidev = NULL; ai->flags = 0; + ai->jobs = 0; ai->dev = dev; if (pci && (pci->device == 0x5000 || pci->device == 0xa504)) { airo_print_dbg(dev->name, "Found an MPI350 card"); @@ -2806,7 +2848,7 @@ static struct net_device *_init_airo_card( unsigned short irq, int port, reset_card (dev, 1); msleep(400); - rc = request_irq( dev->irq, airo_interrupt, SA_SHIRQ, dev->name, dev ); + rc = request_irq( dev->irq, airo_interrupt, IRQF_SHARED, dev->name, dev ); if (rc) { airo_print_err(dev->name, "register interrupt %d failed, rc %d", irq, rc); @@ -2838,6 +2880,18 @@ static struct net_device *_init_airo_card( unsigned short irq, int port, set_bit(FLAG_FLASHING, &ai->flags); } + /* Test for WPA support */ + if (airo_test_wpa_capable(ai)) { + set_bit(FLAG_WPA_CAPABLE, &ai->flags); + ai->bssListFirst = RID_WPA_BSSLISTFIRST; + ai->bssListNext = RID_WPA_BSSLISTNEXT; + ai->bssListRidLen = sizeof(BSSListRid); + } else { + ai->bssListFirst = RID_BSSLISTFIRST; + ai->bssListNext = RID_BSSLISTNEXT; + ai->bssListRidLen = sizeof(BSSListRid) - sizeof(BSSListRidExtra); + } + rc = register_netdev(dev); if (rc) { airo_print_err(dev->name, "Couldn't register_netdev"); @@ -2875,7 +2929,7 @@ err_out_irq: err_out_unlink: del_airo_dev(dev); err_out_thr: - set_bit(JOB_DIE, &ai->flags); + set_bit(JOB_DIE, &ai->jobs); kill_proc(ai->thr_pid, SIGTERM, 1); wait_for_completion(&ai->thr_exited); err_out_free: @@ -2933,7 +2987,7 @@ static void airo_send_event(struct net_device *dev) { union iwreq_data wrqu; StatusRid status_rid; - clear_bit(JOB_EVENT, &ai->flags); + clear_bit(JOB_EVENT, &ai->jobs); PC4500_readrid(ai, RID_STATUS, &status_rid, sizeof(status_rid), 0); up(&ai->sem); wrqu.data.length = 0; @@ -2947,7 +3001,7 @@ static void airo_send_event(struct net_device *dev) { static void airo_process_scan_results (struct airo_info *ai) { union iwreq_data wrqu; - BSSListRid BSSList; + BSSListRid bss; int rc; BSSListElement * loop_net; BSSListElement * tmp_net; @@ -2960,15 +3014,15 @@ static void airo_process_scan_results (struct airo_info *ai) { } /* Try to read the first entry of the scan result */ - rc = PC4500_readrid(ai, RID_BSSLISTFIRST, &BSSList, sizeof(BSSList), 0); - if((rc) || (BSSList.index == 0xffff)) { + rc = PC4500_readrid(ai, ai->bssListFirst, &bss, ai->bssListRidLen, 0); + if((rc) || (bss.index == 0xffff)) { /* No scan results */ goto out; } /* Read and parse all entries */ tmp_net = NULL; - while((!rc) && (BSSList.index != 0xffff)) { + while((!rc) && (bss.index != 0xffff)) { /* Grab a network off the free list */ if (!list_empty(&ai->network_free_list)) { tmp_net = list_entry(ai->network_free_list.next, @@ -2977,19 +3031,19 @@ static void airo_process_scan_results (struct airo_info *ai) { } if (tmp_net != NULL) { - memcpy(tmp_net, &BSSList, sizeof(tmp_net->bss)); + memcpy(tmp_net, &bss, sizeof(tmp_net->bss)); list_add_tail(&tmp_net->list, &ai->network_list); tmp_net = NULL; } /* Read next entry */ - rc = PC4500_readrid(ai, RID_BSSLISTNEXT, - &BSSList, sizeof(BSSList), 0); + rc = PC4500_readrid(ai, ai->bssListNext, + &bss, ai->bssListRidLen, 0); } out: ai->scan_timeout = 0; - clear_bit(JOB_SCAN_RESULTS, &ai->flags); + clear_bit(JOB_SCAN_RESULTS, &ai->jobs); up(&ai->sem); /* Send an empty event to user space. @@ -3019,10 +3073,10 @@ static int airo_thread(void *data) { /* make swsusp happy with our thread */ try_to_freeze(); - if (test_bit(JOB_DIE, &ai->flags)) + if (test_bit(JOB_DIE, &ai->jobs)) break; - if (ai->flags & JOB_MASK) { + if (ai->jobs) { locked = down_interruptible(&ai->sem); } else { wait_queue_t wait; @@ -3031,16 +3085,16 @@ static int airo_thread(void *data) { add_wait_queue(&ai->thr_wait, &wait); for (;;) { set_current_state(TASK_INTERRUPTIBLE); - if (ai->flags & JOB_MASK) + if (ai->jobs) break; if (ai->expires || ai->scan_timeout) { if (ai->scan_timeout && time_after_eq(jiffies,ai->scan_timeout)){ - set_bit(JOB_SCAN_RESULTS,&ai->flags); + set_bit(JOB_SCAN_RESULTS, &ai->jobs); break; } else if (ai->expires && time_after_eq(jiffies,ai->expires)){ - set_bit(JOB_AUTOWEP,&ai->flags); + set_bit(JOB_AUTOWEP, &ai->jobs); break; } if (!signal_pending(current)) { @@ -3069,7 +3123,7 @@ static int airo_thread(void *data) { if (locked) continue; - if (test_bit(JOB_DIE, &ai->flags)) { + if (test_bit(JOB_DIE, &ai->jobs)) { up(&ai->sem); break; } @@ -3079,23 +3133,23 @@ static int airo_thread(void *data) { continue; } - if (test_bit(JOB_XMIT, &ai->flags)) + if (test_bit(JOB_XMIT, &ai->jobs)) airo_end_xmit(dev); - else if (test_bit(JOB_XMIT11, &ai->flags)) + else if (test_bit(JOB_XMIT11, &ai->jobs)) airo_end_xmit11(dev); - else if (test_bit(JOB_STATS, &ai->flags)) + else if (test_bit(JOB_STATS, &ai->jobs)) airo_read_stats(ai); - else if (test_bit(JOB_WSTATS, &ai->flags)) + else if (test_bit(JOB_WSTATS, &ai->jobs)) airo_read_wireless_stats(ai); - else if (test_bit(JOB_PROMISC, &ai->flags)) + else if (test_bit(JOB_PROMISC, &ai->jobs)) airo_set_promisc(ai); - else if (test_bit(JOB_MIC, &ai->flags)) + else if (test_bit(JOB_MIC, &ai->jobs)) micinit(ai); - else if (test_bit(JOB_EVENT, &ai->flags)) + else if (test_bit(JOB_EVENT, &ai->jobs)) airo_send_event(dev); - else if (test_bit(JOB_AUTOWEP, &ai->flags)) + else if (test_bit(JOB_AUTOWEP, &ai->jobs)) timer_func(dev); - else if (test_bit(JOB_SCAN_RESULTS, &ai->flags)) + else if (test_bit(JOB_SCAN_RESULTS, &ai->jobs)) airo_process_scan_results(ai); else /* Shouldn't get here, but we make sure to unlock */ up(&ai->sem); @@ -3133,7 +3187,7 @@ static irqreturn_t airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs) if ( status & EV_MIC ) { OUT4500( apriv, EVACK, EV_MIC ); if (test_bit(FLAG_MIC_CAPABLE, &apriv->flags)) { - set_bit(JOB_MIC, &apriv->flags); + set_bit(JOB_MIC, &apriv->jobs); wake_up_interruptible(&apriv->thr_wait); } } @@ -3187,7 +3241,7 @@ static irqreturn_t airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs) set_bit(FLAG_UPDATE_MULTI, &apriv->flags); if (down_trylock(&apriv->sem) != 0) { - set_bit(JOB_EVENT, &apriv->flags); + set_bit(JOB_EVENT, &apriv->jobs); wake_up_interruptible(&apriv->thr_wait); } else airo_send_event(dev); @@ -5485,7 +5539,7 @@ static void timer_func( struct net_device *dev ) { up(&apriv->sem); /* Schedule check to see if the change worked */ - clear_bit(JOB_AUTOWEP, &apriv->flags); + clear_bit(JOB_AUTOWEP, &apriv->jobs); apriv->expires = RUN_AT(HZ*3); } @@ -6876,7 +6930,7 @@ static int airo_get_range(struct net_device *dev, } range->num_txpower = i; range->txpower_capa = IW_TXPOW_MWATT; - range->we_version_source = 12; + range->we_version_source = 19; range->we_version_compiled = WIRELESS_EXT; range->retry_capa = IW_RETRY_LIMIT | IW_RETRY_LIFETIME; range->retry_flags = IW_RETRY_LIMIT; @@ -7152,6 +7206,7 @@ static inline char *airo_translate_scan(struct net_device *dev, u16 capabilities; char * current_val; /* For rates */ int i; + char * buf; /* First entry *MUST* be the AP MAC address */ iwe.cmd = SIOCGIWAP; @@ -7238,8 +7293,69 @@ static inline char *airo_translate_scan(struct net_device *dev, if((current_val - current_ev) > IW_EV_LCP_LEN) current_ev = current_val; - /* The other data in the scan result are not really - * interesting, so for now drop it - Jean II */ + /* Beacon interval */ + buf = kmalloc(30, GFP_KERNEL); + if (buf) { + iwe.cmd = IWEVCUSTOM; + sprintf(buf, "bcn_int=%d", bss->beaconInterval); + iwe.u.data.length = strlen(buf); + current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, buf); + kfree(buf); + } + + /* Put WPA/RSN Information Elements into the event stream */ + if (test_bit(FLAG_WPA_CAPABLE, &ai->flags)) { + unsigned int num_null_ies = 0; + u16 length = sizeof (bss->extra.iep); + struct ieee80211_info_element *info_element = + (struct ieee80211_info_element *) &bss->extra.iep; + + while ((length >= sizeof(*info_element)) && (num_null_ies < 2)) { + if (sizeof(*info_element) + info_element->len > length) { + /* Invalid element, don't continue parsing IE */ + break; + } + + switch (info_element->id) { + case MFIE_TYPE_SSID: + /* Two zero-length SSID elements + * mean we're done parsing elements */ + if (!info_element->len) + num_null_ies++; + break; + + case MFIE_TYPE_GENERIC: + if (info_element->len >= 4 && + info_element->data[0] == 0x00 && + info_element->data[1] == 0x50 && + info_element->data[2] == 0xf2 && + info_element->data[3] == 0x01) { + iwe.cmd = IWEVGENIE; + iwe.u.data.length = min(info_element->len + 2, + MAX_WPA_IE_LEN); + current_ev = iwe_stream_add_point(current_ev, end_buf, + &iwe, (char *) info_element); + } + break; + + case MFIE_TYPE_RSN: + iwe.cmd = IWEVGENIE; + iwe.u.data.length = min(info_element->len + 2, + MAX_WPA_IE_LEN); + current_ev = iwe_stream_add_point(current_ev, end_buf, + &iwe, (char *) info_element); + break; + + default: + break; + } + + length -= sizeof(*info_element) + info_element->len; + info_element = + (struct ieee80211_info_element *)&info_element-> + data[info_element->len]; + } + } return current_ev; } @@ -7521,7 +7637,7 @@ static void airo_read_wireless_stats(struct airo_info *local) u32 *vals = stats_rid.vals; /* Get stats out of the card */ - clear_bit(JOB_WSTATS, &local->flags); + clear_bit(JOB_WSTATS, &local->jobs); if (local->power.event) { up(&local->sem); return; @@ -7565,10 +7681,10 @@ static struct iw_statistics *airo_get_wireless_stats(struct net_device *dev) { struct airo_info *local = dev->priv; - if (!test_bit(JOB_WSTATS, &local->flags)) { + if (!test_bit(JOB_WSTATS, &local->jobs)) { /* Get stats out of the card if available */ if (down_trylock(&local->sem) != 0) { - set_bit(JOB_WSTATS, &local->flags); + set_bit(JOB_WSTATS, &local->jobs); wake_up_interruptible(&local->thr_wait); } else airo_read_wireless_stats(local); diff --git a/drivers/net/wireless/airo_cs.c b/drivers/net/wireless/airo_cs.c index af0cbb6c5..ac9437d49 100644 --- a/drivers/net/wireless/airo_cs.c +++ b/drivers/net/wireless/airo_cs.c @@ -20,7 +20,6 @@ ======================================================================*/ -#include #ifdef __IN_PCMCIA_PACKAGE__ #include #endif diff --git a/drivers/net/wireless/airport.c b/drivers/net/wireless/airport.c index 7b321f7cf..38fac3bbc 100644 --- a/drivers/net/wireless/airport.c +++ b/drivers/net/wireless/airport.c @@ -14,7 +14,6 @@ #define DRIVER_NAME "airport" #define PFX DRIVER_NAME ": " -#include #include #include #include diff --git a/drivers/net/wireless/arlan-main.c b/drivers/net/wireless/arlan-main.c index bed6823d9..bb6bea4f3 100644 --- a/drivers/net/wireless/arlan-main.c +++ b/drivers/net/wireless/arlan-main.c @@ -5,7 +5,6 @@ * This module provides support for the Arlan 655 card made by Aironet */ -#include #include "arlan.h" #if BITS_PER_LONG != 32 diff --git a/drivers/net/wireless/arlan-proc.c b/drivers/net/wireless/arlan-proc.c index a2cca521f..5fa985435 100644 --- a/drivers/net/wireless/arlan-proc.c +++ b/drivers/net/wireless/arlan-proc.c @@ -1,4 +1,3 @@ -#include #include "arlan.h" #include diff --git a/drivers/net/wireless/arlan.h b/drivers/net/wireless/arlan.h index 70a6d7b83..3ed1df759 100644 --- a/drivers/net/wireless/arlan.h +++ b/drivers/net/wireless/arlan.h @@ -5,7 +5,6 @@ */ #include -#include #include #include #include diff --git a/drivers/net/wireless/atmel.c b/drivers/net/wireless/atmel.c index 8606c8888..995c7bea5 100644 --- a/drivers/net/wireless/atmel.c +++ b/drivers/net/wireless/atmel.c @@ -39,7 +39,6 @@ ******************************************************************************/ -#include #include #include @@ -1578,7 +1577,7 @@ struct net_device *init_atmel_card(unsigned short irq, unsigned long port, SET_NETDEV_DEV(dev, sys_dev); - if ((rc = request_irq(dev->irq, service_interrupt, SA_SHIRQ, dev->name, dev))) { + if ((rc = request_irq(dev->irq, service_interrupt, IRQF_SHARED, dev->name, dev))) { printk(KERN_ERR "%s: register interrupt %d failed, rc %d\n", dev->name, irq, rc); goto err_out_free; } diff --git a/drivers/net/wireless/atmel_cs.c b/drivers/net/wireless/atmel_cs.c index 26bf11275..785664090 100644 --- a/drivers/net/wireless/atmel_cs.c +++ b/drivers/net/wireless/atmel_cs.c @@ -29,7 +29,6 @@ ******************************************************************************/ -#include #ifdef __IN_PCMCIA_PACKAGE__ #include #endif diff --git a/drivers/net/wireless/atmel_pci.c b/drivers/net/wireless/atmel_pci.c index a61b3bc6c..d425c3cef 100644 --- a/drivers/net/wireless/atmel_pci.c +++ b/drivers/net/wireless/atmel_pci.c @@ -19,7 +19,6 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ******************************************************************************/ -#include #include #include #include diff --git a/drivers/net/wireless/bcm43xx/Kconfig b/drivers/net/wireless/bcm43xx/Kconfig index 25ea4748f..533993f53 100644 --- a/drivers/net/wireless/bcm43xx/Kconfig +++ b/drivers/net/wireless/bcm43xx/Kconfig @@ -2,6 +2,7 @@ config BCM43XX tristate "Broadcom BCM43xx wireless support" depends on PCI && IEEE80211 && IEEE80211_SOFTMAC && NET_RADIO && EXPERIMENTAL select FW_LOADER + select HW_RANDOM ---help--- This is an experimental driver for the Broadcom 43xx wireless chip, found in the Apple Airport Extreme and various other devices. diff --git a/drivers/net/wireless/bcm43xx/bcm43xx.h b/drivers/net/wireless/bcm43xx/bcm43xx.h index 2e8308393..6d4ea36bc 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx.h +++ b/drivers/net/wireless/bcm43xx/bcm43xx.h @@ -1,6 +1,7 @@ #ifndef BCM43xx_H_ #define BCM43xx_H_ +#include #include #include #include @@ -32,14 +33,18 @@ #define BCM43xx_PCICFG_ICR 0x94 /* MMIO offsets */ -#define BCM43xx_MMIO_DMA1_REASON 0x20 -#define BCM43xx_MMIO_DMA1_IRQ_MASK 0x24 -#define BCM43xx_MMIO_DMA2_REASON 0x28 -#define BCM43xx_MMIO_DMA2_IRQ_MASK 0x2C -#define BCM43xx_MMIO_DMA3_REASON 0x30 -#define BCM43xx_MMIO_DMA3_IRQ_MASK 0x34 -#define BCM43xx_MMIO_DMA4_REASON 0x38 -#define BCM43xx_MMIO_DMA4_IRQ_MASK 0x3C +#define BCM43xx_MMIO_DMA0_REASON 0x20 +#define BCM43xx_MMIO_DMA0_IRQ_MASK 0x24 +#define BCM43xx_MMIO_DMA1_REASON 0x28 +#define BCM43xx_MMIO_DMA1_IRQ_MASK 0x2C +#define BCM43xx_MMIO_DMA2_REASON 0x30 +#define BCM43xx_MMIO_DMA2_IRQ_MASK 0x34 +#define BCM43xx_MMIO_DMA3_REASON 0x38 +#define BCM43xx_MMIO_DMA3_IRQ_MASK 0x3C +#define BCM43xx_MMIO_DMA4_REASON 0x40 +#define BCM43xx_MMIO_DMA4_IRQ_MASK 0x44 +#define BCM43xx_MMIO_DMA5_REASON 0x48 +#define BCM43xx_MMIO_DMA5_IRQ_MASK 0x4C #define BCM43xx_MMIO_STATUS_BITFIELD 0x120 #define BCM43xx_MMIO_STATUS2_BITFIELD 0x124 #define BCM43xx_MMIO_GEN_IRQ_REASON 0x128 @@ -55,14 +60,27 @@ #define BCM43xx_MMIO_XMITSTAT_1 0x174 #define BCM43xx_MMIO_REV3PLUS_TSF_LOW 0x180 /* core rev >= 3 only */ #define BCM43xx_MMIO_REV3PLUS_TSF_HIGH 0x184 /* core rev >= 3 only */ -#define BCM43xx_MMIO_DMA1_BASE 0x200 -#define BCM43xx_MMIO_DMA2_BASE 0x220 -#define BCM43xx_MMIO_DMA3_BASE 0x240 -#define BCM43xx_MMIO_DMA4_BASE 0x260 + +/* 32-bit DMA */ +#define BCM43xx_MMIO_DMA32_BASE0 0x200 +#define BCM43xx_MMIO_DMA32_BASE1 0x220 +#define BCM43xx_MMIO_DMA32_BASE2 0x240 +#define BCM43xx_MMIO_DMA32_BASE3 0x260 +#define BCM43xx_MMIO_DMA32_BASE4 0x280 +#define BCM43xx_MMIO_DMA32_BASE5 0x2A0 +/* 64-bit DMA */ +#define BCM43xx_MMIO_DMA64_BASE0 0x200 +#define BCM43xx_MMIO_DMA64_BASE1 0x240 +#define BCM43xx_MMIO_DMA64_BASE2 0x280 +#define BCM43xx_MMIO_DMA64_BASE3 0x2C0 +#define BCM43xx_MMIO_DMA64_BASE4 0x300 +#define BCM43xx_MMIO_DMA64_BASE5 0x340 +/* PIO */ #define BCM43xx_MMIO_PIO1_BASE 0x300 #define BCM43xx_MMIO_PIO2_BASE 0x310 #define BCM43xx_MMIO_PIO3_BASE 0x320 #define BCM43xx_MMIO_PIO4_BASE 0x330 + #define BCM43xx_MMIO_PHY_VER 0x3E0 #define BCM43xx_MMIO_PHY_RADIO 0x3E2 #define BCM43xx_MMIO_ANTENNA 0x3E8 @@ -82,6 +100,7 @@ #define BCM43xx_MMIO_TSF_1 0x634 /* core rev < 3 only */ #define BCM43xx_MMIO_TSF_2 0x636 /* core rev < 3 only */ #define BCM43xx_MMIO_TSF_3 0x638 /* core rev < 3 only */ +#define BCM43xx_MMIO_RNG 0x65A #define BCM43xx_MMIO_POWERUP_DELAY 0x6A8 /* SPROM offsets. */ @@ -231,8 +250,14 @@ #define BCM43xx_SBTMSTATELOW_FORCE_GATE_CLOCK 0x20000 /* sbtmstatehigh state flags */ -#define BCM43xx_SBTMSTATEHIGH_SERROR 0x1 -#define BCM43xx_SBTMSTATEHIGH_BUSY 0x4 +#define BCM43xx_SBTMSTATEHIGH_SERROR 0x00000001 +#define BCM43xx_SBTMSTATEHIGH_BUSY 0x00000004 +#define BCM43xx_SBTMSTATEHIGH_TIMEOUT 0x00000020 +#define BCM43xx_SBTMSTATEHIGH_COREFLAGS 0x1FFF0000 +#define BCM43xx_SBTMSTATEHIGH_DMA64BIT 0x10000000 +#define BCM43xx_SBTMSTATEHIGH_GATEDCLK 0x20000000 +#define BCM43xx_SBTMSTATEHIGH_BISTFAILED 0x40000000 +#define BCM43xx_SBTMSTATEHIGH_BISTCOMPLETE 0x80000000 /* sbimstate flags */ #define BCM43xx_SBIMSTATE_IB_ERROR 0x20000 @@ -281,6 +306,13 @@ #define BCM43xx_SBF_TIME_UPDATE 0x10000000 #define BCM43xx_SBF_80000000 0x80000000 /*FIXME: fix name*/ +/* Microcode */ +#define BCM43xx_UCODE_REVISION 0x0000 +#define BCM43xx_UCODE_PATCHLEVEL 0x0002 +#define BCM43xx_UCODE_DATE 0x0004 +#define BCM43xx_UCODE_TIME 0x0006 +#define BCM43xx_UCODE_STATUS 0x0040 + /* MicrocodeFlagsBitfield (addr + lo-word values?)*/ #define BCM43xx_UCODEFLAGS_OFFSET 0x005E @@ -502,6 +534,12 @@ struct bcm43xx_phyinfo { * This lock is only used by bcm43xx_phy_{un}lock() */ spinlock_t lock; + + /* Firmware. */ + const struct firmware *ucode; + const struct firmware *pcm; + const struct firmware *initvals0; + const struct firmware *initvals1; }; @@ -566,8 +604,11 @@ struct bcm43xx_dma { struct bcm43xx_dmaring *tx_ring1; struct bcm43xx_dmaring *tx_ring2; struct bcm43xx_dmaring *tx_ring3; + struct bcm43xx_dmaring *tx_ring4; + struct bcm43xx_dmaring *tx_ring5; + struct bcm43xx_dmaring *rx_ring0; - struct bcm43xx_dmaring *rx_ring1; /* only available on core.rev < 5 */ + struct bcm43xx_dmaring *rx_ring3; /* only available on core.rev < 5 */ }; /* Data structures for PIO transmission, per 80211 core. */ @@ -591,12 +632,14 @@ struct bcm43xx_coreinfo { u8 available:1, enabled:1, initialized:1; - /** core_id ID number */ - u16 id; /** core_rev revision number */ u8 rev; /** Index number for _switch_core() */ u8 index; + /** core_id ID number */ + u16 id; + /** Core-specific data. */ + void *priv; }; /* Additional information for each 80211 core. */ @@ -636,6 +679,33 @@ struct bcm43xx_key { u8 algorithm; }; +/* Driver initialization status. */ +enum { + BCM43xx_STAT_UNINIT, /* Uninitialized. */ + BCM43xx_STAT_INITIALIZING, /* init_board() in progress. */ + BCM43xx_STAT_INITIALIZED, /* Fully operational. */ + BCM43xx_STAT_SHUTTINGDOWN, /* free_board() in progress. */ + BCM43xx_STAT_RESTARTING, /* controller_restart() called. */ +}; +#define bcm43xx_status(bcm) atomic_read(&(bcm)->init_status) +#define bcm43xx_set_status(bcm, stat) do { \ + atomic_set(&(bcm)->init_status, (stat)); \ + smp_wmb(); \ + } while (0) + +/* *** THEORY OF LOCKING *** + * + * We have two different locks in the bcm43xx driver. + * => bcm->mutex: General sleeping mutex. Protects struct bcm43xx_private + * and the device registers. This mutex does _not_ protect + * against concurrency from the IRQ handler. + * => bcm->irq_lock: IRQ spinlock. Protects against IRQ handler concurrency. + * + * Please note that, if you only take the irq_lock, you are not protected + * against concurrency from the periodic work handlers. + * Most times you want to take _both_ locks. + */ + struct bcm43xx_private { struct ieee80211_device *ieee; struct ieee80211softmac_device *softmac; @@ -645,20 +715,17 @@ struct bcm43xx_private { unsigned int irq; void __iomem *mmio_addr; - unsigned int mmio_len; - /* Do not use the lock directly. Use the bcm43xx_lock* helper - * functions, to be MMIO-safe. */ - spinlock_t _lock; + spinlock_t irq_lock; + struct mutex mutex; + + /* Driver initialization status BCM43xx_STAT_*** */ + atomic_t init_status; - /* Driver status flags. */ - u32 initialized:1, /* init_board() succeed */ - was_initialized:1, /* for PCI suspend/resume. */ - shutting_down:1, /* free_board() in progress */ + u16 was_initialized:1, /* for PCI suspend/resume. */ __using_pio:1, /* Internal, use bcm43xx_using_pio(). */ bad_frames_preempt:1, /* Use "Bad Frames Preemption" (default off) */ reg124_set_0x4:1, /* Some variable to keep track of IRQ stuff. */ - powersaving:1, /* TRUE if we are in PowerSaving mode. FALSE otherwise. */ short_preamble:1, /* TRUE, if short preamble is enabled. */ firmware_norelease:1; /* Do not release the firmware. Used on suspend. */ @@ -680,6 +747,7 @@ struct bcm43xx_private { struct bcm43xx_sprominfo sprom; #define BCM43xx_NR_LEDS 4 struct bcm43xx_led leds[BCM43xx_NR_LEDS]; + spinlock_t leds_lock; /* The currently active core. */ struct bcm43xx_coreinfo *current_core; @@ -697,10 +765,6 @@ struct bcm43xx_private { struct bcm43xx_coreinfo core_80211[ BCM43xx_MAX_80211_CORES ]; /* Additional information, specific to the 80211 cores. */ struct bcm43xx_coreinfo_80211 core_80211_ext[ BCM43xx_MAX_80211_CORES ]; - /* Index of the current 80211 core. If current_core is not - * an 80211 core, this is -1. - */ - int current_80211_core_idx; /* Number of available 80211 cores. */ int nr_80211_available; @@ -708,11 +772,13 @@ struct bcm43xx_private { /* Reason code of the last interrupt. */ u32 irq_reason; - u32 dma_reason[4]; + u32 dma_reason[6]; /* saved irq enable/disable state bitfield. */ u32 irq_savedstate; /* Link Quality calculation context. */ struct bcm43xx_noise_calculation noisecalc; + /* if > 0 MAC is suspended. if == 0 MAC is enabled. */ + int mac_suspended; /* Threshold values. */ //TODO: The RTS thr has to be _used_. Currently, it is only set via WX. @@ -722,7 +788,7 @@ struct bcm43xx_private { struct tasklet_struct isr_tasklet; /* Periodic tasks */ - struct timer_list periodic_tasks; + struct work_struct periodic_work; unsigned int periodic_state; struct work_struct restart_work; @@ -735,11 +801,9 @@ struct bcm43xx_private { struct bcm43xx_key key[54]; u8 default_key_idx; - /* Firmware. */ - const struct firmware *ucode; - const struct firmware *pcm; - const struct firmware *initvals0; - const struct firmware *initvals1; + /* Random Number Generator. */ + struct hwrng rng; + char rng_name[20 + 1]; /* Debugging stuff follows. */ #ifdef CONFIG_BCM43XX_DEBUG @@ -747,21 +811,6 @@ struct bcm43xx_private { #endif }; -/* bcm43xx_(un)lock() protect struct bcm43xx_private. - * Note that _NO_ MMIO writes are allowed. If you want to - * write to the device through MMIO in the critical section, use - * the *_mmio lock functions. - * MMIO read-access is allowed, though. - */ -#define bcm43xx_lock(bcm, flags) spin_lock_irqsave(&(bcm)->_lock, flags) -#define bcm43xx_unlock(bcm, flags) spin_unlock_irqrestore(&(bcm)->_lock, flags) -/* bcm43xx_(un)lock_mmio() protect struct bcm43xx_private and MMIO. - * MMIO write-access to the device is allowed. - * All MMIO writes are flushed on unlock, so it is guaranteed to not - * interfere with other threads writing MMIO registers. - */ -#define bcm43xx_lock_mmio(bcm, flags) bcm43xx_lock(bcm, flags) -#define bcm43xx_unlock_mmio(bcm, flags) do { mmiowb(); bcm43xx_unlock(bcm, flags); } while (0) static inline struct bcm43xx_private * bcm43xx_priv(struct net_device *dev) @@ -814,46 +863,35 @@ int bcm43xx_using_pio(struct bcm43xx_private *bcm) * any of these functions. */ static inline +struct bcm43xx_coreinfo_80211 * +bcm43xx_current_80211_priv(struct bcm43xx_private *bcm) +{ + assert(bcm->current_core->id == BCM43xx_COREID_80211); + return bcm->current_core->priv; +} +static inline struct bcm43xx_pio * bcm43xx_current_pio(struct bcm43xx_private *bcm) { assert(bcm43xx_using_pio(bcm)); - assert(bcm->current_80211_core_idx >= 0); - assert(bcm->current_80211_core_idx < BCM43xx_MAX_80211_CORES); - return &(bcm->core_80211_ext[bcm->current_80211_core_idx].pio); + return &(bcm43xx_current_80211_priv(bcm)->pio); } static inline struct bcm43xx_dma * bcm43xx_current_dma(struct bcm43xx_private *bcm) { assert(!bcm43xx_using_pio(bcm)); - assert(bcm->current_80211_core_idx >= 0); - assert(bcm->current_80211_core_idx < BCM43xx_MAX_80211_CORES); - return &(bcm->core_80211_ext[bcm->current_80211_core_idx].dma); + return &(bcm43xx_current_80211_priv(bcm)->dma); } static inline struct bcm43xx_phyinfo * bcm43xx_current_phy(struct bcm43xx_private *bcm) { - assert(bcm->current_80211_core_idx >= 0); - assert(bcm->current_80211_core_idx < BCM43xx_MAX_80211_CORES); - return &(bcm->core_80211_ext[bcm->current_80211_core_idx].phy); + return &(bcm43xx_current_80211_priv(bcm)->phy); } static inline struct bcm43xx_radioinfo * bcm43xx_current_radio(struct bcm43xx_private *bcm) { - assert(bcm->current_80211_core_idx >= 0); - assert(bcm->current_80211_core_idx < BCM43xx_MAX_80211_CORES); - return &(bcm->core_80211_ext[bcm->current_80211_core_idx].radio); + return &(bcm43xx_current_80211_priv(bcm)->radio); } -/* Are we running in init_board() context? */ -static inline -int bcm43xx_is_initializing(struct bcm43xx_private *bcm) -{ - if (bcm->initialized) - return 0; - if (bcm->shutting_down) - return 0; - return 1; -} static inline struct bcm43xx_lopair * bcm43xx_get_lopair(struct bcm43xx_phyinfo *phy, diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_debugfs.c b/drivers/net/wireless/bcm43xx/bcm43xx_debugfs.c index 35a4fcb6d..b9df06a06 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_debugfs.c +++ b/drivers/net/wireless/bcm43xx/bcm43xx_debugfs.c @@ -54,7 +54,7 @@ static ssize_t write_file_dummy(struct file *file, const char __user *buf, static int open_file_generic(struct inode *inode, struct file *file) { - file->private_data = inode->u.generic_ip; + file->private_data = inode->i_private; return 0; } @@ -77,8 +77,9 @@ static ssize_t devinfo_read_file(struct file *file, char __user *userbuf, down(&big_buffer_sem); - bcm43xx_lock_mmio(bcm, flags); - if (!bcm->initialized) { + mutex_lock(&bcm->mutex); + spin_lock_irqsave(&bcm->irq_lock, flags); + if (bcm43xx_status(bcm) != BCM43xx_STAT_INITIALIZED) { fappend("Board not initialized.\n"); goto out; } @@ -92,7 +93,7 @@ static ssize_t devinfo_read_file(struct file *file, char __user *userbuf, fappend("subsystem_vendor: 0x%04x subsystem_device: 0x%04x\n", pci_dev->subsystem_vendor, pci_dev->subsystem_device); fappend("IRQ: %d\n", bcm->irq); - fappend("mmio_addr: 0x%p mmio_len: %u\n", bcm->mmio_addr, bcm->mmio_len); + fappend("mmio_addr: 0x%p\n", bcm->mmio_addr); fappend("chip_id: 0x%04x chip_rev: 0x%02x\n", bcm->chip_id, bcm->chip_rev); if ((bcm->core_80211[0].rev >= 3) && (bcm43xx_read32(bcm, 0x0158) & (1 << 16))) fappend("Radio disabled by hardware!\n"); @@ -121,7 +122,8 @@ static ssize_t devinfo_read_file(struct file *file, char __user *userbuf, fappend("\n"); out: - bcm43xx_unlock_mmio(bcm, flags); + spin_unlock_irqrestore(&bcm->irq_lock, flags); + mutex_unlock(&bcm->mutex); res = simple_read_from_buffer(userbuf, count, ppos, buf, pos); up(&big_buffer_sem); return res; @@ -159,8 +161,9 @@ static ssize_t spromdump_read_file(struct file *file, char __user *userbuf, unsigned long flags; down(&big_buffer_sem); - bcm43xx_lock_mmio(bcm, flags); - if (!bcm->initialized) { + mutex_lock(&bcm->mutex); + spin_lock_irqsave(&bcm->irq_lock, flags); + if (bcm43xx_status(bcm) != BCM43xx_STAT_INITIALIZED) { fappend("Board not initialized.\n"); goto out; } @@ -169,7 +172,8 @@ static ssize_t spromdump_read_file(struct file *file, char __user *userbuf, fappend("boardflags: 0x%04x\n", bcm->sprom.boardflags); out: - bcm43xx_unlock_mmio(bcm, flags); + spin_unlock_irqrestore(&bcm->irq_lock, flags); + mutex_unlock(&bcm->mutex); res = simple_read_from_buffer(userbuf, count, ppos, buf, pos); up(&big_buffer_sem); return res; @@ -188,8 +192,9 @@ static ssize_t tsf_read_file(struct file *file, char __user *userbuf, u64 tsf; down(&big_buffer_sem); - bcm43xx_lock_mmio(bcm, flags); - if (!bcm->initialized) { + mutex_lock(&bcm->mutex); + spin_lock_irqsave(&bcm->irq_lock, flags); + if (bcm43xx_status(bcm) != BCM43xx_STAT_INITIALIZED) { fappend("Board not initialized.\n"); goto out; } @@ -199,7 +204,8 @@ static ssize_t tsf_read_file(struct file *file, char __user *userbuf, (unsigned int)(tsf & 0xFFFFFFFFULL)); out: - bcm43xx_unlock_mmio(bcm, flags); + spin_unlock_irqrestore(&bcm->irq_lock, flags); + mutex_unlock(&bcm->mutex); res = simple_read_from_buffer(userbuf, count, ppos, buf, pos); up(&big_buffer_sem); return res; @@ -221,8 +227,9 @@ static ssize_t tsf_write_file(struct file *file, const char __user *user_buf, res = -EFAULT; goto out_up; } - bcm43xx_lock_mmio(bcm, flags); - if (!bcm->initialized) { + mutex_lock(&bcm->mutex); + spin_lock_irqsave(&bcm->irq_lock, flags); + if (bcm43xx_status(bcm) != BCM43xx_STAT_INITIALIZED) { printk(KERN_INFO PFX "debugfs: Board not initialized.\n"); res = -EFAULT; goto out_unlock; @@ -233,10 +240,12 @@ static ssize_t tsf_write_file(struct file *file, const char __user *user_buf, goto out_unlock; } bcm43xx_tsf_write(bcm, tsf); + mmiowb(); res = buf_size; out_unlock: - bcm43xx_unlock_mmio(bcm, flags); + spin_unlock_irqrestore(&bcm->irq_lock, flags); + mutex_unlock(&bcm->mutex); out_up: up(&big_buffer_sem); return res; @@ -257,7 +266,8 @@ static ssize_t txstat_read_file(struct file *file, char __user *userbuf, int i, cnt, j = 0; down(&big_buffer_sem); - bcm43xx_lock(bcm, flags); + mutex_lock(&bcm->mutex); + spin_lock_irqsave(&bcm->irq_lock, flags); fappend("Last %d logged xmitstatus blobs (Latest first):\n\n", BCM43xx_NR_LOGGED_XMITSTATUS); @@ -293,14 +303,51 @@ static ssize_t txstat_read_file(struct file *file, char __user *userbuf, i = BCM43xx_NR_LOGGED_XMITSTATUS - 1; } - bcm43xx_unlock(bcm, flags); + spin_unlock_irqrestore(&bcm->irq_lock, flags); res = simple_read_from_buffer(userbuf, count, ppos, buf, pos); - bcm43xx_lock(bcm, flags); + spin_lock_irqsave(&bcm->irq_lock, flags); if (*ppos == pos) { /* Done. Drop the copied data. */ e->xmitstatus_printing = 0; } - bcm43xx_unlock(bcm, flags); + spin_unlock_irqrestore(&bcm->irq_lock, flags); + mutex_unlock(&bcm->mutex); + up(&big_buffer_sem); + return res; +} + +static ssize_t restart_write_file(struct file *file, const char __user *user_buf, + size_t count, loff_t *ppos) +{ + struct bcm43xx_private *bcm = file->private_data; + char *buf = really_big_buffer; + ssize_t buf_size; + ssize_t res; + unsigned long flags; + + buf_size = min(count, sizeof (really_big_buffer) - 1); + down(&big_buffer_sem); + if (copy_from_user(buf, user_buf, buf_size)) { + res = -EFAULT; + goto out_up; + } + mutex_lock(&(bcm)->mutex); + spin_lock_irqsave(&(bcm)->irq_lock, flags); + if (bcm43xx_status(bcm) != BCM43xx_STAT_INITIALIZED) { + printk(KERN_INFO PFX "debugfs: Board not initialized.\n"); + res = -EFAULT; + goto out_unlock; + } + if (count > 0 && buf[0] == '1') { + bcm43xx_controller_restart(bcm, "manually restarted"); + res = count; + } else + res = -EINVAL; + +out_unlock: + spin_unlock_irqrestore(&(bcm)->irq_lock, flags); + mutex_unlock(&(bcm)->mutex); +out_up: up(&big_buffer_sem); return res; } @@ -338,6 +385,11 @@ static struct file_operations txstat_fops = { .open = open_file_generic, }; +static struct file_operations restart_fops = { + .write = restart_write_file, + .open = open_file_generic, +}; + void bcm43xx_debugfs_add_device(struct bcm43xx_private *bcm) { @@ -389,6 +441,10 @@ void bcm43xx_debugfs_add_device(struct bcm43xx_private *bcm) bcm, &txstat_fops); if (!e->dentry_txstat) printk(KERN_ERR PFX "debugfs: creating \"tx_status\" for \"%s\" failed!\n", devdir); + e->dentry_restart = debugfs_create_file("restart", 0222, e->subdir, + bcm, &restart_fops); + if (!e->dentry_restart) + printk(KERN_ERR PFX "debugfs: creating \"restart\" for \"%s\" failed!\n", devdir); } void bcm43xx_debugfs_remove_device(struct bcm43xx_private *bcm) @@ -404,6 +460,7 @@ void bcm43xx_debugfs_remove_device(struct bcm43xx_private *bcm) debugfs_remove(e->dentry_devinfo); debugfs_remove(e->dentry_tsf); debugfs_remove(e->dentry_txstat); + debugfs_remove(e->dentry_restart); debugfs_remove(e->subdir); kfree(e->xmitstatus_buffer); kfree(e->xmitstatus_print_buffer); diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_debugfs.h b/drivers/net/wireless/bcm43xx/bcm43xx_debugfs.h index 50ce267f7..a40d1af35 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_debugfs.h +++ b/drivers/net/wireless/bcm43xx/bcm43xx_debugfs.h @@ -20,6 +20,7 @@ struct bcm43xx_dfsentry { struct dentry *dentry_spromdump; struct dentry *dentry_tsf; struct dentry *dentry_txstat; + struct dentry *dentry_restart; struct bcm43xx_private *bcm; diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_dma.c b/drivers/net/wireless/bcm43xx/bcm43xx_dma.c index d0318e525..76e3aed4b 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_dma.c +++ b/drivers/net/wireless/bcm43xx/bcm43xx_dma.c @@ -4,7 +4,7 @@ DMA ringbuffer and descriptor allocation/management - Copyright (c) 2005 Michael Buesch + Copyright (c) 2005, 2006 Michael Buesch Some code in this file is derived from the b44.c driver Copyright (C) 2002 David S. Miller @@ -109,6 +109,35 @@ void return_slot(struct bcm43xx_dmaring *ring, int slot) } } +u16 bcm43xx_dmacontroller_base(int dma64bit, int controller_idx) +{ + static const u16 map64[] = { + BCM43xx_MMIO_DMA64_BASE0, + BCM43xx_MMIO_DMA64_BASE1, + BCM43xx_MMIO_DMA64_BASE2, + BCM43xx_MMIO_DMA64_BASE3, + BCM43xx_MMIO_DMA64_BASE4, + BCM43xx_MMIO_DMA64_BASE5, + }; + static const u16 map32[] = { + BCM43xx_MMIO_DMA32_BASE0, + BCM43xx_MMIO_DMA32_BASE1, + BCM43xx_MMIO_DMA32_BASE2, + BCM43xx_MMIO_DMA32_BASE3, + BCM43xx_MMIO_DMA32_BASE4, + BCM43xx_MMIO_DMA32_BASE5, + }; + + if (dma64bit) { + assert(controller_idx >= 0 && + controller_idx < ARRAY_SIZE(map64)); + return map64[controller_idx]; + } + assert(controller_idx >= 0 && + controller_idx < ARRAY_SIZE(map32)); + return map32[controller_idx]; +} + static inline dma_addr_t map_descbuffer(struct bcm43xx_dmaring *ring, unsigned char *buf, @@ -172,7 +201,6 @@ void sync_descbuffer_for_device(struct bcm43xx_dmaring *ring, /* Unmap and free a descriptor buffer. */ static inline void free_descriptor_buffer(struct bcm43xx_dmaring *ring, - struct bcm43xx_dmadesc *desc, struct bcm43xx_dmadesc_meta *meta, int irq_context) { @@ -188,23 +216,13 @@ static int alloc_ringmemory(struct bcm43xx_dmaring *ring) { struct device *dev = &(ring->bcm->pci_dev->dev); - ring->vbase = dma_alloc_coherent(dev, BCM43xx_DMA_RINGMEMSIZE, - &(ring->dmabase), GFP_KERNEL); - if (!ring->vbase) { + ring->descbase = dma_alloc_coherent(dev, BCM43xx_DMA_RINGMEMSIZE, + &(ring->dmabase), GFP_KERNEL); + if (!ring->descbase) { printk(KERN_ERR PFX "DMA ringmemory allocation failed\n"); return -ENOMEM; } - if (ring->dmabase + BCM43xx_DMA_RINGMEMSIZE > BCM43xx_DMA_BUSADDRMAX) { - printk(KERN_ERR PFX ">>>FATAL ERROR<<< DMA RINGMEMORY >1G " - "(0x%llx, len: %lu)\n", - (unsigned long long)ring->dmabase, - BCM43xx_DMA_RINGMEMSIZE); - dma_free_coherent(dev, BCM43xx_DMA_RINGMEMSIZE, - ring->vbase, ring->dmabase); - return -ENOMEM; - } - assert(!(ring->dmabase & 0x000003FF)); - memset(ring->vbase, 0, BCM43xx_DMA_RINGMEMSIZE); + memset(ring->descbase, 0, BCM43xx_DMA_RINGMEMSIZE); return 0; } @@ -214,26 +232,34 @@ static void free_ringmemory(struct bcm43xx_dmaring *ring) struct device *dev = &(ring->bcm->pci_dev->dev); dma_free_coherent(dev, BCM43xx_DMA_RINGMEMSIZE, - ring->vbase, ring->dmabase); + ring->descbase, ring->dmabase); } /* Reset the RX DMA channel */ int bcm43xx_dmacontroller_rx_reset(struct bcm43xx_private *bcm, - u16 mmio_base) + u16 mmio_base, int dma64) { int i; u32 value; + u16 offset; - bcm43xx_write32(bcm, - mmio_base + BCM43xx_DMA_RX_CONTROL, - 0x00000000); + offset = dma64 ? BCM43xx_DMA64_RXCTL : BCM43xx_DMA32_RXCTL; + bcm43xx_write32(bcm, mmio_base + offset, 0); for (i = 0; i < 1000; i++) { - value = bcm43xx_read32(bcm, - mmio_base + BCM43xx_DMA_RX_STATUS); - value &= BCM43xx_DMA_RXSTAT_STAT_MASK; - if (value == BCM43xx_DMA_RXSTAT_STAT_DISABLED) { - i = -1; - break; + offset = dma64 ? BCM43xx_DMA64_RXSTATUS : BCM43xx_DMA32_RXSTATUS; + value = bcm43xx_read32(bcm, mmio_base + offset); + if (dma64) { + value &= BCM43xx_DMA64_RXSTAT; + if (value == BCM43xx_DMA64_RXSTAT_DISABLED) { + i = -1; + break; + } + } else { + value &= BCM43xx_DMA32_RXSTATE; + if (value == BCM43xx_DMA32_RXSTAT_DISABLED) { + i = -1; + break; + } } udelay(10); } @@ -247,31 +273,47 @@ int bcm43xx_dmacontroller_rx_reset(struct bcm43xx_private *bcm, /* Reset the RX DMA channel */ int bcm43xx_dmacontroller_tx_reset(struct bcm43xx_private *bcm, - u16 mmio_base) + u16 mmio_base, int dma64) { int i; u32 value; + u16 offset; for (i = 0; i < 1000; i++) { - value = bcm43xx_read32(bcm, - mmio_base + BCM43xx_DMA_TX_STATUS); - value &= BCM43xx_DMA_TXSTAT_STAT_MASK; - if (value == BCM43xx_DMA_TXSTAT_STAT_DISABLED || - value == BCM43xx_DMA_TXSTAT_STAT_IDLEWAIT || - value == BCM43xx_DMA_TXSTAT_STAT_STOPPED) - break; + offset = dma64 ? BCM43xx_DMA64_TXSTATUS : BCM43xx_DMA32_TXSTATUS; + value = bcm43xx_read32(bcm, mmio_base + offset); + if (dma64) { + value &= BCM43xx_DMA64_TXSTAT; + if (value == BCM43xx_DMA64_TXSTAT_DISABLED || + value == BCM43xx_DMA64_TXSTAT_IDLEWAIT || + value == BCM43xx_DMA64_TXSTAT_STOPPED) + break; + } else { + value &= BCM43xx_DMA32_TXSTATE; + if (value == BCM43xx_DMA32_TXSTAT_DISABLED || + value == BCM43xx_DMA32_TXSTAT_IDLEWAIT || + value == BCM43xx_DMA32_TXSTAT_STOPPED) + break; + } udelay(10); } - bcm43xx_write32(bcm, - mmio_base + BCM43xx_DMA_TX_CONTROL, - 0x00000000); + offset = dma64 ? BCM43xx_DMA64_TXCTL : BCM43xx_DMA32_TXCTL; + bcm43xx_write32(bcm, mmio_base + offset, 0); for (i = 0; i < 1000; i++) { - value = bcm43xx_read32(bcm, - mmio_base + BCM43xx_DMA_TX_STATUS); - value &= BCM43xx_DMA_TXSTAT_STAT_MASK; - if (value == BCM43xx_DMA_TXSTAT_STAT_DISABLED) { - i = -1; - break; + offset = dma64 ? BCM43xx_DMA64_TXSTATUS : BCM43xx_DMA32_TXSTATUS; + value = bcm43xx_read32(bcm, mmio_base + offset); + if (dma64) { + value &= BCM43xx_DMA64_TXSTAT; + if (value == BCM43xx_DMA64_TXSTAT_DISABLED) { + i = -1; + break; + } + } else { + value &= BCM43xx_DMA32_TXSTATE; + if (value == BCM43xx_DMA32_TXSTAT_DISABLED) { + i = -1; + break; + } } udelay(10); } @@ -285,47 +327,98 @@ int bcm43xx_dmacontroller_tx_reset(struct bcm43xx_private *bcm, return 0; } +static void fill_descriptor(struct bcm43xx_dmaring *ring, + struct bcm43xx_dmadesc_generic *desc, + dma_addr_t dmaaddr, + u16 bufsize, + int start, int end, int irq) +{ + int slot; + + slot = bcm43xx_dma_desc2idx(ring, desc); + assert(slot >= 0 && slot < ring->nr_slots); + + if (ring->dma64) { + u32 ctl0 = 0, ctl1 = 0; + u32 addrlo, addrhi; + u32 addrext; + + addrlo = (u32)(dmaaddr & 0xFFFFFFFF); + addrhi = (((u64)dmaaddr >> 32) & ~BCM43xx_DMA64_ROUTING); + addrext = (((u64)dmaaddr >> 32) >> BCM43xx_DMA64_ROUTING_SHIFT); + addrhi |= ring->routing; + if (slot == ring->nr_slots - 1) + ctl0 |= BCM43xx_DMA64_DCTL0_DTABLEEND; + if (start) + ctl0 |= BCM43xx_DMA64_DCTL0_FRAMESTART; + if (end) + ctl0 |= BCM43xx_DMA64_DCTL0_FRAMEEND; + if (irq) + ctl0 |= BCM43xx_DMA64_DCTL0_IRQ; + ctl1 |= (bufsize - ring->frameoffset) + & BCM43xx_DMA64_DCTL1_BYTECNT; + ctl1 |= (addrext << BCM43xx_DMA64_DCTL1_ADDREXT_SHIFT) + & BCM43xx_DMA64_DCTL1_ADDREXT_MASK; + + desc->dma64.control0 = cpu_to_le32(ctl0); + desc->dma64.control1 = cpu_to_le32(ctl1); + desc->dma64.address_low = cpu_to_le32(addrlo); + desc->dma64.address_high = cpu_to_le32(addrhi); + } else { + u32 ctl; + u32 addr; + u32 addrext; + + addr = (u32)(dmaaddr & ~BCM43xx_DMA32_ROUTING); + addrext = (u32)(dmaaddr & BCM43xx_DMA32_ROUTING) + >> BCM43xx_DMA32_ROUTING_SHIFT; + addr |= ring->routing; + ctl = (bufsize - ring->frameoffset) + & BCM43xx_DMA32_DCTL_BYTECNT; + if (slot == ring->nr_slots - 1) + ctl |= BCM43xx_DMA32_DCTL_DTABLEEND; + if (start) + ctl |= BCM43xx_DMA32_DCTL_FRAMESTART; + if (end) + ctl |= BCM43xx_DMA32_DCTL_FRAMEEND; + if (irq) + ctl |= BCM43xx_DMA32_DCTL_IRQ; + ctl |= (addrext << BCM43xx_DMA32_DCTL_ADDREXT_SHIFT) + & BCM43xx_DMA32_DCTL_ADDREXT_MASK; + + desc->dma32.control = cpu_to_le32(ctl); + desc->dma32.address = cpu_to_le32(addr); + } +} + static int setup_rx_descbuffer(struct bcm43xx_dmaring *ring, - struct bcm43xx_dmadesc *desc, + struct bcm43xx_dmadesc_generic *desc, struct bcm43xx_dmadesc_meta *meta, gfp_t gfp_flags) { struct bcm43xx_rxhdr *rxhdr; + struct bcm43xx_hwxmitstatus *xmitstat; dma_addr_t dmaaddr; - u32 desc_addr; - u32 desc_ctl; - const int slot = (int)(desc - ring->vbase); struct sk_buff *skb; - assert(slot >= 0 && slot < ring->nr_slots); assert(!ring->tx); skb = __dev_alloc_skb(ring->rx_buffersize, gfp_flags); if (unlikely(!skb)) return -ENOMEM; dmaaddr = map_descbuffer(ring, skb->data, ring->rx_buffersize, 0); - if (unlikely(dmaaddr + ring->rx_buffersize > BCM43xx_DMA_BUSADDRMAX)) { - unmap_descbuffer(ring, dmaaddr, ring->rx_buffersize, 0); - dev_kfree_skb_any(skb); - printk(KERN_ERR PFX ">>>FATAL ERROR<<< DMA RX SKB >1G " - "(0x%llx, len: %u)\n", - (unsigned long long)dmaaddr, ring->rx_buffersize); - return -ENOMEM; - } meta->skb = skb; meta->dmaaddr = dmaaddr; skb->dev = ring->bcm->net_dev; - desc_addr = (u32)(dmaaddr + ring->memoffset); - desc_ctl = (BCM43xx_DMADTOR_BYTECNT_MASK & - (u32)(ring->rx_buffersize - ring->frameoffset)); - if (slot == ring->nr_slots - 1) - desc_ctl |= BCM43xx_DMADTOR_DTABLEEND; - set_desc_addr(desc, desc_addr); - set_desc_ctl(desc, desc_ctl); + + fill_descriptor(ring, desc, dmaaddr, + ring->rx_buffersize, 0, 0, 0); rxhdr = (struct bcm43xx_rxhdr *)(skb->data); rxhdr->frame_length = 0; rxhdr->flags1 = 0; + xmitstat = (struct bcm43xx_hwxmitstatus *)(skb->data); + xmitstat->cookie = 0; return 0; } @@ -336,17 +429,17 @@ static int setup_rx_descbuffer(struct bcm43xx_dmaring *ring, static int alloc_initial_descbuffers(struct bcm43xx_dmaring *ring) { int i, err = -ENOMEM; - struct bcm43xx_dmadesc *desc; + struct bcm43xx_dmadesc_generic *desc; struct bcm43xx_dmadesc_meta *meta; for (i = 0; i < ring->nr_slots; i++) { - desc = ring->vbase + i; - meta = ring->meta + i; + desc = bcm43xx_dma_idx2desc(ring, i, &meta); err = setup_rx_descbuffer(ring, desc, meta, GFP_KERNEL); if (err) goto err_unwind; } + mb(); ring->used_slots = ring->nr_slots; err = 0; out: @@ -354,8 +447,7 @@ out: err_unwind: for (i--; i >= 0; i--) { - desc = ring->vbase + i; - meta = ring->meta + i; + desc = bcm43xx_dma_idx2desc(ring, i, &meta); unmap_descbuffer(ring, meta->dmaaddr, ring->rx_buffersize, 0); dev_kfree_skb(meta->skb); @@ -371,27 +463,67 @@ static int dmacontroller_setup(struct bcm43xx_dmaring *ring) { int err = 0; u32 value; + u32 addrext; if (ring->tx) { - /* Set Transmit Control register to "transmit enable" */ - bcm43xx_dma_write(ring, BCM43xx_DMA_TX_CONTROL, - BCM43xx_DMA_TXCTRL_ENABLE); - /* Set Transmit Descriptor ring address. */ - bcm43xx_dma_write(ring, BCM43xx_DMA_TX_DESC_RING, - ring->dmabase + ring->memoffset); + if (ring->dma64) { + u64 ringbase = (u64)(ring->dmabase); + + addrext = ((ringbase >> 32) >> BCM43xx_DMA64_ROUTING_SHIFT); + value = BCM43xx_DMA64_TXENABLE; + value |= (addrext << BCM43xx_DMA64_TXADDREXT_SHIFT) + & BCM43xx_DMA64_TXADDREXT_MASK; + bcm43xx_dma_write(ring, BCM43xx_DMA64_TXCTL, value); + bcm43xx_dma_write(ring, BCM43xx_DMA64_TXRINGLO, + (ringbase & 0xFFFFFFFF)); + bcm43xx_dma_write(ring, BCM43xx_DMA64_TXRINGHI, + ((ringbase >> 32) & ~BCM43xx_DMA64_ROUTING) + | ring->routing); + } else { + u32 ringbase = (u32)(ring->dmabase); + + addrext = (ringbase >> BCM43xx_DMA32_ROUTING_SHIFT); + value = BCM43xx_DMA32_TXENABLE; + value |= (addrext << BCM43xx_DMA32_TXADDREXT_SHIFT) + & BCM43xx_DMA32_TXADDREXT_MASK; + bcm43xx_dma_write(ring, BCM43xx_DMA32_TXCTL, value); + bcm43xx_dma_write(ring, BCM43xx_DMA32_TXRING, + (ringbase & ~BCM43xx_DMA32_ROUTING) + | ring->routing); + } } else { err = alloc_initial_descbuffers(ring); if (err) goto out; - /* Set Receive Control "receive enable" and frame offset */ - value = (ring->frameoffset << BCM43xx_DMA_RXCTRL_FRAMEOFF_SHIFT); - value |= BCM43xx_DMA_RXCTRL_ENABLE; - bcm43xx_dma_write(ring, BCM43xx_DMA_RX_CONTROL, value); - /* Set Receive Descriptor ring address. */ - bcm43xx_dma_write(ring, BCM43xx_DMA_RX_DESC_RING, - ring->dmabase + ring->memoffset); - /* Init the descriptor pointer. */ - bcm43xx_dma_write(ring, BCM43xx_DMA_RX_DESC_INDEX, 200); + if (ring->dma64) { + u64 ringbase = (u64)(ring->dmabase); + + addrext = ((ringbase >> 32) >> BCM43xx_DMA64_ROUTING_SHIFT); + value = (ring->frameoffset << BCM43xx_DMA64_RXFROFF_SHIFT); + value |= BCM43xx_DMA64_RXENABLE; + value |= (addrext << BCM43xx_DMA64_RXADDREXT_SHIFT) + & BCM43xx_DMA64_RXADDREXT_MASK; + bcm43xx_dma_write(ring, BCM43xx_DMA64_RXCTL, value); + bcm43xx_dma_write(ring, BCM43xx_DMA64_RXRINGLO, + (ringbase & 0xFFFFFFFF)); + bcm43xx_dma_write(ring, BCM43xx_DMA64_RXRINGHI, + ((ringbase >> 32) & ~BCM43xx_DMA64_ROUTING) + | ring->routing); + bcm43xx_dma_write(ring, BCM43xx_DMA64_RXINDEX, 200); + } else { + u32 ringbase = (u32)(ring->dmabase); + + addrext = (ringbase >> BCM43xx_DMA32_ROUTING_SHIFT); + value = (ring->frameoffset << BCM43xx_DMA32_RXFROFF_SHIFT); + value |= BCM43xx_DMA32_RXENABLE; + value |= (addrext << BCM43xx_DMA32_RXADDREXT_SHIFT) + & BCM43xx_DMA32_RXADDREXT_MASK; + bcm43xx_dma_write(ring, BCM43xx_DMA32_RXCTL, value); + bcm43xx_dma_write(ring, BCM43xx_DMA32_RXRING, + (ringbase & ~BCM43xx_DMA32_ROUTING) + | ring->routing); + bcm43xx_dma_write(ring, BCM43xx_DMA32_RXINDEX, 200); + } } out: @@ -402,27 +534,32 @@ out: static void dmacontroller_cleanup(struct bcm43xx_dmaring *ring) { if (ring->tx) { - bcm43xx_dmacontroller_tx_reset(ring->bcm, ring->mmio_base); - /* Zero out Transmit Descriptor ring address. */ - bcm43xx_dma_write(ring, BCM43xx_DMA_TX_DESC_RING, 0); + bcm43xx_dmacontroller_tx_reset(ring->bcm, ring->mmio_base, ring->dma64); + if (ring->dma64) { + bcm43xx_dma_write(ring, BCM43xx_DMA64_TXRINGLO, 0); + bcm43xx_dma_write(ring, BCM43xx_DMA64_TXRINGHI, 0); + } else + bcm43xx_dma_write(ring, BCM43xx_DMA32_TXRING, 0); } else { - bcm43xx_dmacontroller_rx_reset(ring->bcm, ring->mmio_base); - /* Zero out Receive Descriptor ring address. */ - bcm43xx_dma_write(ring, BCM43xx_DMA_RX_DESC_RING, 0); + bcm43xx_dmacontroller_rx_reset(ring->bcm, ring->mmio_base, ring->dma64); + if (ring->dma64) { + bcm43xx_dma_write(ring, BCM43xx_DMA64_RXRINGLO, 0); + bcm43xx_dma_write(ring, BCM43xx_DMA64_RXRINGHI, 0); + } else + bcm43xx_dma_write(ring, BCM43xx_DMA32_RXRING, 0); } } static void free_all_descbuffers(struct bcm43xx_dmaring *ring) { - struct bcm43xx_dmadesc *desc; + struct bcm43xx_dmadesc_generic *desc; struct bcm43xx_dmadesc_meta *meta; int i; if (!ring->used_slots) return; for (i = 0; i < ring->nr_slots; i++) { - desc = ring->vbase + i; - meta = ring->meta + i; + desc = bcm43xx_dma_idx2desc(ring, i, &meta); if (!meta->skb) { assert(ring->tx); @@ -430,62 +567,67 @@ static void free_all_descbuffers(struct bcm43xx_dmaring *ring) } if (ring->tx) { unmap_descbuffer(ring, meta->dmaaddr, - meta->skb->len, 1); + meta->skb->len, 1); } else { unmap_descbuffer(ring, meta->dmaaddr, - ring->rx_buffersize, 0); + ring->rx_buffersize, 0); } - free_descriptor_buffer(ring, desc, meta, 0); + free_descriptor_buffer(ring, meta, 0); } } /* Main initialization function. */ static struct bcm43xx_dmaring * bcm43xx_setup_dmaring(struct bcm43xx_private *bcm, - u16 dma_controller_base, - int nr_descriptor_slots, - int tx) + int controller_index, + int for_tx, + int dma64) { struct bcm43xx_dmaring *ring; int err; + int nr_slots; ring = kzalloc(sizeof(*ring), GFP_KERNEL); if (!ring) goto out; - ring->meta = kzalloc(sizeof(*ring->meta) * nr_descriptor_slots, + nr_slots = BCM43xx_RXRING_SLOTS; + if (for_tx) + nr_slots = BCM43xx_TXRING_SLOTS; + + ring->meta = kcalloc(nr_slots, sizeof(struct bcm43xx_dmadesc_meta), GFP_KERNEL); if (!ring->meta) goto err_kfree_ring; - ring->memoffset = BCM43xx_DMA_DMABUSADDROFFSET; + ring->routing = BCM43xx_DMA32_CLIENTTRANS; + if (dma64) + ring->routing = BCM43xx_DMA64_CLIENTTRANS; #ifdef CONFIG_BCM947XX if (bcm->pci_dev->bus->number == 0) - ring->memoffset = 0; + ring->routing = dma64 ? BCM43xx_DMA64_NOTRANS : BCM43xx_DMA32_NOTRANS; #endif ring->bcm = bcm; - ring->nr_slots = nr_descriptor_slots; + ring->nr_slots = nr_slots; ring->suspend_mark = ring->nr_slots * BCM43xx_TXSUSPEND_PERCENT / 100; ring->resume_mark = ring->nr_slots * BCM43xx_TXRESUME_PERCENT / 100; assert(ring->suspend_mark < ring->resume_mark); - ring->mmio_base = dma_controller_base; - if (tx) { + ring->mmio_base = bcm43xx_dmacontroller_base(dma64, controller_index); + ring->index = controller_index; + ring->dma64 = !!dma64; + if (for_tx) { ring->tx = 1; ring->current_slot = -1; } else { - switch (dma_controller_base) { - case BCM43xx_MMIO_DMA1_BASE: - ring->rx_buffersize = BCM43xx_DMA1_RXBUFFERSIZE; - ring->frameoffset = BCM43xx_DMA1_RX_FRAMEOFFSET; - break; - case BCM43xx_MMIO_DMA4_BASE: - ring->rx_buffersize = BCM43xx_DMA4_RXBUFFERSIZE; - ring->frameoffset = BCM43xx_DMA4_RX_FRAMEOFFSET; - break; - default: + if (ring->index == 0) { + ring->rx_buffersize = BCM43xx_DMA0_RX_BUFFERSIZE; + ring->frameoffset = BCM43xx_DMA0_RX_FRAMEOFFSET; + } else if (ring->index == 3) { + ring->rx_buffersize = BCM43xx_DMA3_RX_BUFFERSIZE; + ring->frameoffset = BCM43xx_DMA3_RX_FRAMEOFFSET; + } else assert(0); - } } err = alloc_ringmemory(ring); @@ -514,7 +656,8 @@ static void bcm43xx_destroy_dmaring(struct bcm43xx_dmaring *ring) if (!ring) return; - dprintk(KERN_INFO PFX "DMA 0x%04x (%s) max used slots: %d/%d\n", + dprintk(KERN_INFO PFX "DMA-%s 0x%04X (%s) max used slots: %d/%d\n", + (ring->dma64) ? "64" : "32", ring->mmio_base, (ring->tx) ? "TX" : "RX", ring->max_used_slots, ring->nr_slots); @@ -537,10 +680,15 @@ void bcm43xx_dma_free(struct bcm43xx_private *bcm) return; dma = bcm43xx_current_dma(bcm); - bcm43xx_destroy_dmaring(dma->rx_ring1); - dma->rx_ring1 = NULL; + bcm43xx_destroy_dmaring(dma->rx_ring3); + dma->rx_ring3 = NULL; bcm43xx_destroy_dmaring(dma->rx_ring0); dma->rx_ring0 = NULL; + + bcm43xx_destroy_dmaring(dma->tx_ring5); + dma->tx_ring5 = NULL; + bcm43xx_destroy_dmaring(dma->tx_ring4); + dma->tx_ring4 = NULL; bcm43xx_destroy_dmaring(dma->tx_ring3); dma->tx_ring3 = NULL; bcm43xx_destroy_dmaring(dma->tx_ring2); @@ -556,48 +704,59 @@ int bcm43xx_dma_init(struct bcm43xx_private *bcm) struct bcm43xx_dma *dma = bcm43xx_current_dma(bcm); struct bcm43xx_dmaring *ring; int err = -ENOMEM; + int dma64 = 0; + u32 sbtmstatehi; + + sbtmstatehi = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATEHIGH); + if (sbtmstatehi & BCM43xx_SBTMSTATEHIGH_DMA64BIT) + dma64 = 1; /* setup TX DMA channels. */ - ring = bcm43xx_setup_dmaring(bcm, BCM43xx_MMIO_DMA1_BASE, - BCM43xx_TXRING_SLOTS, 1); + ring = bcm43xx_setup_dmaring(bcm, 0, 1, dma64); if (!ring) goto out; dma->tx_ring0 = ring; - ring = bcm43xx_setup_dmaring(bcm, BCM43xx_MMIO_DMA2_BASE, - BCM43xx_TXRING_SLOTS, 1); + ring = bcm43xx_setup_dmaring(bcm, 1, 1, dma64); if (!ring) goto err_destroy_tx0; dma->tx_ring1 = ring; - ring = bcm43xx_setup_dmaring(bcm, BCM43xx_MMIO_DMA3_BASE, - BCM43xx_TXRING_SLOTS, 1); + ring = bcm43xx_setup_dmaring(bcm, 2, 1, dma64); if (!ring) goto err_destroy_tx1; dma->tx_ring2 = ring; - ring = bcm43xx_setup_dmaring(bcm, BCM43xx_MMIO_DMA4_BASE, - BCM43xx_TXRING_SLOTS, 1); + ring = bcm43xx_setup_dmaring(bcm, 3, 1, dma64); if (!ring) goto err_destroy_tx2; dma->tx_ring3 = ring; - /* setup RX DMA channels. */ - ring = bcm43xx_setup_dmaring(bcm, BCM43xx_MMIO_DMA1_BASE, - BCM43xx_RXRING_SLOTS, 0); + ring = bcm43xx_setup_dmaring(bcm, 4, 1, dma64); if (!ring) goto err_destroy_tx3; + dma->tx_ring4 = ring; + + ring = bcm43xx_setup_dmaring(bcm, 5, 1, dma64); + if (!ring) + goto err_destroy_tx4; + dma->tx_ring5 = ring; + + /* setup RX DMA channels. */ + ring = bcm43xx_setup_dmaring(bcm, 0, 0, dma64); + if (!ring) + goto err_destroy_tx5; dma->rx_ring0 = ring; if (bcm->current_core->rev < 5) { - ring = bcm43xx_setup_dmaring(bcm, BCM43xx_MMIO_DMA4_BASE, - BCM43xx_RXRING_SLOTS, 0); + ring = bcm43xx_setup_dmaring(bcm, 3, 0, dma64); if (!ring) goto err_destroy_rx0; - dma->rx_ring1 = ring; + dma->rx_ring3 = ring; } - dprintk(KERN_INFO PFX "DMA initialized\n"); + dprintk(KERN_INFO PFX "%s DMA initialized\n", + dma64 ? "64-bit" : "32-bit"); err = 0; out: return err; @@ -605,6 +764,12 @@ out: err_destroy_rx0: bcm43xx_destroy_dmaring(dma->rx_ring0); dma->rx_ring0 = NULL; +err_destroy_tx5: + bcm43xx_destroy_dmaring(dma->tx_ring5); + dma->tx_ring5 = NULL; +err_destroy_tx4: + bcm43xx_destroy_dmaring(dma->tx_ring4); + dma->tx_ring4 = NULL; err_destroy_tx3: bcm43xx_destroy_dmaring(dma->tx_ring3); dma->tx_ring3 = NULL; @@ -624,7 +789,7 @@ err_destroy_tx0: static u16 generate_cookie(struct bcm43xx_dmaring *ring, int slot) { - u16 cookie = 0xF000; + u16 cookie = 0x1000; /* Use the upper 4 bits of the cookie as * DMA controller ID and store the slot number @@ -632,21 +797,25 @@ static u16 generate_cookie(struct bcm43xx_dmaring *ring, * Note that the cookie must never be 0, as this * is a special value used in RX path. */ - switch (ring->mmio_base) { - default: - assert(0); - case BCM43xx_MMIO_DMA1_BASE: + switch (ring->index) { + case 0: cookie = 0xA000; break; - case BCM43xx_MMIO_DMA2_BASE: + case 1: cookie = 0xB000; break; - case BCM43xx_MMIO_DMA3_BASE: + case 2: cookie = 0xC000; break; - case BCM43xx_MMIO_DMA4_BASE: + case 3: cookie = 0xD000; break; + case 4: + cookie = 0xE000; + break; + case 5: + cookie = 0xF000; + break; } assert(((u16)slot & 0xF000) == 0x0000); cookie |= (u16)slot; @@ -675,6 +844,12 @@ struct bcm43xx_dmaring * parse_cookie(struct bcm43xx_private *bcm, case 0xD000: ring = dma->tx_ring3; break; + case 0xE000: + ring = dma->tx_ring4; + break; + case 0xF000: + ring = dma->tx_ring5; + break; default: assert(0); } @@ -687,6 +862,9 @@ struct bcm43xx_dmaring * parse_cookie(struct bcm43xx_private *bcm, static void dmacontroller_poke_tx(struct bcm43xx_dmaring *ring, int slot) { + u16 offset; + int descsize; + /* Everything is ready to start. Buffers are DMA mapped and * associated with slots. * "slot" is the last slot of the new frame we want to transmit. @@ -694,25 +872,26 @@ static void dmacontroller_poke_tx(struct bcm43xx_dmaring *ring, */ wmb(); slot = next_slot(ring, slot); - bcm43xx_dma_write(ring, BCM43xx_DMA_TX_DESC_INDEX, - (u32)(slot * sizeof(struct bcm43xx_dmadesc))); + offset = (ring->dma64) ? BCM43xx_DMA64_TXINDEX : BCM43xx_DMA32_TXINDEX; + descsize = (ring->dma64) ? sizeof(struct bcm43xx_dmadesc64) + : sizeof(struct bcm43xx_dmadesc32); + bcm43xx_dma_write(ring, offset, + (u32)(slot * descsize)); } -static int dma_tx_fragment(struct bcm43xx_dmaring *ring, - struct sk_buff *skb, - u8 cur_frag) +static void dma_tx_fragment(struct bcm43xx_dmaring *ring, + struct sk_buff *skb, + u8 cur_frag) { int slot; - struct bcm43xx_dmadesc *desc; + struct bcm43xx_dmadesc_generic *desc; struct bcm43xx_dmadesc_meta *meta; - u32 desc_ctl; - u32 desc_addr; + dma_addr_t dmaaddr; assert(skb_shinfo(skb)->nr_frags == 0); slot = request_slot(ring); - desc = ring->vbase + slot; - meta = ring->meta + slot; + desc = bcm43xx_dma_idx2desc(ring, slot, &meta); /* Add a device specific TX header. */ assert(skb_headroom(skb) >= sizeof(struct bcm43xx_txhdr)); @@ -729,29 +908,14 @@ static int dma_tx_fragment(struct bcm43xx_dmaring *ring, generate_cookie(ring, slot)); meta->skb = skb; - meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1); - if (unlikely(meta->dmaaddr + skb->len > BCM43xx_DMA_BUSADDRMAX)) { - return_slot(ring, slot); - printk(KERN_ERR PFX ">>>FATAL ERROR<<< DMA TX SKB >1G " - "(0x%llx, len: %u)\n", - (unsigned long long)meta->dmaaddr, skb->len); - return -ENOMEM; - } + dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1); + meta->dmaaddr = dmaaddr; - desc_addr = (u32)(meta->dmaaddr + ring->memoffset); - desc_ctl = BCM43xx_DMADTOR_FRAMESTART | BCM43xx_DMADTOR_FRAMEEND; - desc_ctl |= BCM43xx_DMADTOR_COMPIRQ; - desc_ctl |= (BCM43xx_DMADTOR_BYTECNT_MASK & - (u32)(meta->skb->len - ring->frameoffset)); - if (slot == ring->nr_slots - 1) - desc_ctl |= BCM43xx_DMADTOR_DTABLEEND; + fill_descriptor(ring, desc, dmaaddr, + skb->len, 1, 1, 1); - set_desc_ctl(desc, desc_ctl); - set_desc_addr(desc, desc_addr); /* Now transfer the whole frame. */ dmacontroller_poke_tx(ring, slot); - - return 0; } int bcm43xx_dma_tx(struct bcm43xx_private *bcm, @@ -781,7 +945,6 @@ int bcm43xx_dma_tx(struct bcm43xx_private *bcm, /* Take skb from ieee80211_txb_free */ txb->fragments[i] = NULL; dma_tx_fragment(ring, skb, i); - //TODO: handle failure of dma_tx_fragment } ieee80211_txb_free(txb); @@ -792,23 +955,28 @@ void bcm43xx_dma_handle_xmitstatus(struct bcm43xx_private *bcm, struct bcm43xx_xmitstatus *status) { struct bcm43xx_dmaring *ring; - struct bcm43xx_dmadesc *desc; + struct bcm43xx_dmadesc_generic *desc; struct bcm43xx_dmadesc_meta *meta; int is_last_fragment; int slot; + u32 tmp; ring = parse_cookie(bcm, status->cookie, &slot); assert(ring); assert(ring->tx); - assert(get_desc_ctl(ring->vbase + slot) & BCM43xx_DMADTOR_FRAMESTART); while (1) { assert(slot >= 0 && slot < ring->nr_slots); - desc = ring->vbase + slot; - meta = ring->meta + slot; + desc = bcm43xx_dma_idx2desc(ring, slot, &meta); - is_last_fragment = !!(get_desc_ctl(desc) & BCM43xx_DMADTOR_FRAMEEND); + if (ring->dma64) { + tmp = le32_to_cpu(desc->dma64.control0); + is_last_fragment = !!(tmp & BCM43xx_DMA64_DCTL0_FRAMEEND); + } else { + tmp = le32_to_cpu(desc->dma32.control); + is_last_fragment = !!(tmp & BCM43xx_DMA32_DCTL_FRAMEEND); + } unmap_descbuffer(ring, meta->dmaaddr, meta->skb->len, 1); - free_descriptor_buffer(ring, desc, meta, 1); + free_descriptor_buffer(ring, meta, 1); /* Everything belonging to the slot is unmapped * and freed, so we can return it. */ @@ -824,7 +992,7 @@ void bcm43xx_dma_handle_xmitstatus(struct bcm43xx_private *bcm, static void dma_rx(struct bcm43xx_dmaring *ring, int *slot) { - struct bcm43xx_dmadesc *desc; + struct bcm43xx_dmadesc_generic *desc; struct bcm43xx_dmadesc_meta *meta; struct bcm43xx_rxhdr *rxhdr; struct sk_buff *skb; @@ -832,13 +1000,12 @@ static void dma_rx(struct bcm43xx_dmaring *ring, int err; dma_addr_t dmaaddr; - desc = ring->vbase + *slot; - meta = ring->meta + *slot; + desc = bcm43xx_dma_idx2desc(ring, *slot, &meta); sync_descbuffer_for_cpu(ring, meta->dmaaddr, ring->rx_buffersize); skb = meta->skb; - if (ring->mmio_base == BCM43xx_MMIO_DMA4_BASE) { + if (ring->index == 3) { /* We received an xmit status. */ struct bcm43xx_hwxmitstatus *hw = (struct bcm43xx_hwxmitstatus *)skb->data; struct bcm43xx_xmitstatus stat; @@ -894,8 +1061,7 @@ static void dma_rx(struct bcm43xx_dmaring *ring, s32 tmp = len; while (1) { - desc = ring->vbase + *slot; - meta = ring->meta + *slot; + desc = bcm43xx_dma_idx2desc(ring, *slot, &meta); /* recycle the descriptor buffer. */ sync_descbuffer_for_device(ring, meta->dmaaddr, ring->rx_buffersize); @@ -906,8 +1072,8 @@ static void dma_rx(struct bcm43xx_dmaring *ring, break; } printkl(KERN_ERR PFX "DMA RX buffer too small " - "(len: %u, buffer: %u, nr-dropped: %d)\n", - len, ring->rx_buffersize, cnt); + "(len: %u, buffer: %u, nr-dropped: %d)\n", + len, ring->rx_buffersize, cnt); goto drop; } len -= IEEE80211_FCS_LEN; @@ -945,9 +1111,15 @@ void bcm43xx_dma_rx(struct bcm43xx_dmaring *ring) #endif assert(!ring->tx); - status = bcm43xx_dma_read(ring, BCM43xx_DMA_RX_STATUS); - descptr = (status & BCM43xx_DMA_RXSTAT_DPTR_MASK); - current_slot = descptr / sizeof(struct bcm43xx_dmadesc); + if (ring->dma64) { + status = bcm43xx_dma_read(ring, BCM43xx_DMA64_RXSTATUS); + descptr = (status & BCM43xx_DMA64_RXSTATDPTR); + current_slot = descptr / sizeof(struct bcm43xx_dmadesc64); + } else { + status = bcm43xx_dma_read(ring, BCM43xx_DMA32_RXSTATUS); + descptr = (status & BCM43xx_DMA32_RXDPTR); + current_slot = descptr / sizeof(struct bcm43xx_dmadesc32); + } assert(current_slot >= 0 && current_slot < ring->nr_slots); slot = ring->current_slot; @@ -958,8 +1130,13 @@ void bcm43xx_dma_rx(struct bcm43xx_dmaring *ring) ring->max_used_slots = used_slots; #endif } - bcm43xx_dma_write(ring, BCM43xx_DMA_RX_DESC_INDEX, - (u32)(slot * sizeof(struct bcm43xx_dmadesc))); + if (ring->dma64) { + bcm43xx_dma_write(ring, BCM43xx_DMA64_RXINDEX, + (u32)(slot * sizeof(struct bcm43xx_dmadesc64))); + } else { + bcm43xx_dma_write(ring, BCM43xx_DMA32_RXINDEX, + (u32)(slot * sizeof(struct bcm43xx_dmadesc32))); + } ring->current_slot = slot; } @@ -967,16 +1144,28 @@ void bcm43xx_dma_tx_suspend(struct bcm43xx_dmaring *ring) { assert(ring->tx); bcm43xx_power_saving_ctl_bits(ring->bcm, -1, 1); - bcm43xx_dma_write(ring, BCM43xx_DMA_TX_CONTROL, - bcm43xx_dma_read(ring, BCM43xx_DMA_TX_CONTROL) - | BCM43xx_DMA_TXCTRL_SUSPEND); + if (ring->dma64) { + bcm43xx_dma_write(ring, BCM43xx_DMA64_TXCTL, + bcm43xx_dma_read(ring, BCM43xx_DMA64_TXCTL) + | BCM43xx_DMA64_TXSUSPEND); + } else { + bcm43xx_dma_write(ring, BCM43xx_DMA32_TXCTL, + bcm43xx_dma_read(ring, BCM43xx_DMA32_TXCTL) + | BCM43xx_DMA32_TXSUSPEND); + } } void bcm43xx_dma_tx_resume(struct bcm43xx_dmaring *ring) { assert(ring->tx); - bcm43xx_dma_write(ring, BCM43xx_DMA_TX_CONTROL, - bcm43xx_dma_read(ring, BCM43xx_DMA_TX_CONTROL) - & ~BCM43xx_DMA_TXCTRL_SUSPEND); + if (ring->dma64) { + bcm43xx_dma_write(ring, BCM43xx_DMA64_TXCTL, + bcm43xx_dma_read(ring, BCM43xx_DMA64_TXCTL) + & ~BCM43xx_DMA64_TXSUSPEND); + } else { + bcm43xx_dma_write(ring, BCM43xx_DMA32_TXCTL, + bcm43xx_dma_read(ring, BCM43xx_DMA32_TXCTL) + & ~BCM43xx_DMA32_TXSUSPEND); + } bcm43xx_power_saving_ctl_bits(ring->bcm, -1, -1); } diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_dma.h b/drivers/net/wireless/bcm43xx/bcm43xx_dma.h index b7d77638b..e04bcaddd 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_dma.h +++ b/drivers/net/wireless/bcm43xx/bcm43xx_dma.h @@ -14,63 +14,179 @@ #define BCM43xx_DMAIRQ_NONFATALMASK (1 << 13) #define BCM43xx_DMAIRQ_RX_DONE (1 << 16) -/* DMA controller register offsets. (relative to BCM43xx_DMA#_BASE) */ -#define BCM43xx_DMA_TX_CONTROL 0x00 -#define BCM43xx_DMA_TX_DESC_RING 0x04 -#define BCM43xx_DMA_TX_DESC_INDEX 0x08 -#define BCM43xx_DMA_TX_STATUS 0x0c -#define BCM43xx_DMA_RX_CONTROL 0x10 -#define BCM43xx_DMA_RX_DESC_RING 0x14 -#define BCM43xx_DMA_RX_DESC_INDEX 0x18 -#define BCM43xx_DMA_RX_STATUS 0x1c - -/* DMA controller channel control word values. */ -#define BCM43xx_DMA_TXCTRL_ENABLE (1 << 0) -#define BCM43xx_DMA_TXCTRL_SUSPEND (1 << 1) -#define BCM43xx_DMA_TXCTRL_LOOPBACK (1 << 2) -#define BCM43xx_DMA_TXCTRL_FLUSH (1 << 4) -#define BCM43xx_DMA_RXCTRL_ENABLE (1 << 0) -#define BCM43xx_DMA_RXCTRL_FRAMEOFF_MASK 0x000000fe -#define BCM43xx_DMA_RXCTRL_FRAMEOFF_SHIFT 1 -#define BCM43xx_DMA_RXCTRL_PIO (1 << 8) -/* DMA controller channel status word values. */ -#define BCM43xx_DMA_TXSTAT_DPTR_MASK 0x00000fff -#define BCM43xx_DMA_TXSTAT_STAT_MASK 0x0000f000 -#define BCM43xx_DMA_TXSTAT_STAT_DISABLED 0x00000000 -#define BCM43xx_DMA_TXSTAT_STAT_ACTIVE 0x00001000 -#define BCM43xx_DMA_TXSTAT_STAT_IDLEWAIT 0x00002000 -#define BCM43xx_DMA_TXSTAT_STAT_STOPPED 0x00003000 -#define BCM43xx_DMA_TXSTAT_STAT_SUSP 0x00004000 -#define BCM43xx_DMA_TXSTAT_ERROR_MASK 0x000f0000 -#define BCM43xx_DMA_TXSTAT_FLUSHED (1 << 20) -#define BCM43xx_DMA_RXSTAT_DPTR_MASK 0x00000fff -#define BCM43xx_DMA_RXSTAT_STAT_MASK 0x0000f000 -#define BCM43xx_DMA_RXSTAT_STAT_DISABLED 0x00000000 -#define BCM43xx_DMA_RXSTAT_STAT_ACTIVE 0x00001000 -#define BCM43xx_DMA_RXSTAT_STAT_IDLEWAIT 0x00002000 -#define BCM43xx_DMA_RXSTAT_STAT_RESERVED 0x00003000 -#define BCM43xx_DMA_RXSTAT_STAT_ERRORS 0x00004000 -#define BCM43xx_DMA_RXSTAT_ERROR_MASK 0x000f0000 - -/* DMA descriptor control field values. */ -#define BCM43xx_DMADTOR_BYTECNT_MASK 0x00001fff -#define BCM43xx_DMADTOR_DTABLEEND (1 << 28) /* End of descriptor table */ -#define BCM43xx_DMADTOR_COMPIRQ (1 << 29) /* IRQ on completion request */ -#define BCM43xx_DMADTOR_FRAMEEND (1 << 30) -#define BCM43xx_DMADTOR_FRAMESTART (1 << 31) + +/*** 32-bit DMA Engine. ***/ + +/* 32-bit DMA controller registers. */ +#define BCM43xx_DMA32_TXCTL 0x00 +#define BCM43xx_DMA32_TXENABLE 0x00000001 +#define BCM43xx_DMA32_TXSUSPEND 0x00000002 +#define BCM43xx_DMA32_TXLOOPBACK 0x00000004 +#define BCM43xx_DMA32_TXFLUSH 0x00000010 +#define BCM43xx_DMA32_TXADDREXT_MASK 0x00030000 +#define BCM43xx_DMA32_TXADDREXT_SHIFT 16 +#define BCM43xx_DMA32_TXRING 0x04 +#define BCM43xx_DMA32_TXINDEX 0x08 +#define BCM43xx_DMA32_TXSTATUS 0x0C +#define BCM43xx_DMA32_TXDPTR 0x00000FFF +#define BCM43xx_DMA32_TXSTATE 0x0000F000 +#define BCM43xx_DMA32_TXSTAT_DISABLED 0x00000000 +#define BCM43xx_DMA32_TXSTAT_ACTIVE 0x00001000 +#define BCM43xx_DMA32_TXSTAT_IDLEWAIT 0x00002000 +#define BCM43xx_DMA32_TXSTAT_STOPPED 0x00003000 +#define BCM43xx_DMA32_TXSTAT_SUSP 0x00004000 +#define BCM43xx_DMA32_TXERROR 0x000F0000 +#define BCM43xx_DMA32_TXERR_NOERR 0x00000000 +#define BCM43xx_DMA32_TXERR_PROT 0x00010000 +#define BCM43xx_DMA32_TXERR_UNDERRUN 0x00020000 +#define BCM43xx_DMA32_TXERR_BUFREAD 0x00030000 +#define BCM43xx_DMA32_TXERR_DESCREAD 0x00040000 +#define BCM43xx_DMA32_TXACTIVE 0xFFF00000 +#define BCM43xx_DMA32_RXCTL 0x10 +#define BCM43xx_DMA32_RXENABLE 0x00000001 +#define BCM43xx_DMA32_RXFROFF_MASK 0x000000FE +#define BCM43xx_DMA32_RXFROFF_SHIFT 1 +#define BCM43xx_DMA32_RXDIRECTFIFO 0x00000100 +#define BCM43xx_DMA32_RXADDREXT_MASK 0x00030000 +#define BCM43xx_DMA32_RXADDREXT_SHIFT 16 +#define BCM43xx_DMA32_RXRING 0x14 +#define BCM43xx_DMA32_RXINDEX 0x18 +#define BCM43xx_DMA32_RXSTATUS 0x1C +#define BCM43xx_DMA32_RXDPTR 0x00000FFF +#define BCM43xx_DMA32_RXSTATE 0x0000F000 +#define BCM43xx_DMA32_RXSTAT_DISABLED 0x00000000 +#define BCM43xx_DMA32_RXSTAT_ACTIVE 0x00001000 +#define BCM43xx_DMA32_RXSTAT_IDLEWAIT 0x00002000 +#define BCM43xx_DMA32_RXSTAT_STOPPED 0x00003000 +#define BCM43xx_DMA32_RXERROR 0x000F0000 +#define BCM43xx_DMA32_RXERR_NOERR 0x00000000 +#define BCM43xx_DMA32_RXERR_PROT 0x00010000 +#define BCM43xx_DMA32_RXERR_OVERFLOW 0x00020000 +#define BCM43xx_DMA32_RXERR_BUFWRITE 0x00030000 +#define BCM43xx_DMA32_RXERR_DESCREAD 0x00040000 +#define BCM43xx_DMA32_RXACTIVE 0xFFF00000 + +/* 32-bit DMA descriptor. */ +struct bcm43xx_dmadesc32 { + __le32 control; + __le32 address; +} __attribute__((__packed__)); +#define BCM43xx_DMA32_DCTL_BYTECNT 0x00001FFF +#define BCM43xx_DMA32_DCTL_ADDREXT_MASK 0x00030000 +#define BCM43xx_DMA32_DCTL_ADDREXT_SHIFT 16 +#define BCM43xx_DMA32_DCTL_DTABLEEND 0x10000000 +#define BCM43xx_DMA32_DCTL_IRQ 0x20000000 +#define BCM43xx_DMA32_DCTL_FRAMEEND 0x40000000 +#define BCM43xx_DMA32_DCTL_FRAMESTART 0x80000000 + +/* Address field Routing value. */ +#define BCM43xx_DMA32_ROUTING 0xC0000000 +#define BCM43xx_DMA32_ROUTING_SHIFT 30 +#define BCM43xx_DMA32_NOTRANS 0x00000000 +#define BCM43xx_DMA32_CLIENTTRANS 0x40000000 + + + +/*** 64-bit DMA Engine. ***/ + +/* 64-bit DMA controller registers. */ +#define BCM43xx_DMA64_TXCTL 0x00 +#define BCM43xx_DMA64_TXENABLE 0x00000001 +#define BCM43xx_DMA64_TXSUSPEND 0x00000002 +#define BCM43xx_DMA64_TXLOOPBACK 0x00000004 +#define BCM43xx_DMA64_TXFLUSH 0x00000010 +#define BCM43xx_DMA64_TXADDREXT_MASK 0x00030000 +#define BCM43xx_DMA64_TXADDREXT_SHIFT 16 +#define BCM43xx_DMA64_TXINDEX 0x04 +#define BCM43xx_DMA64_TXRINGLO 0x08 +#define BCM43xx_DMA64_TXRINGHI 0x0C +#define BCM43xx_DMA64_TXSTATUS 0x10 +#define BCM43xx_DMA64_TXSTATDPTR 0x00001FFF +#define BCM43xx_DMA64_TXSTAT 0xF0000000 +#define BCM43xx_DMA64_TXSTAT_DISABLED 0x00000000 +#define BCM43xx_DMA64_TXSTAT_ACTIVE 0x10000000 +#define BCM43xx_DMA64_TXSTAT_IDLEWAIT 0x20000000 +#define BCM43xx_DMA64_TXSTAT_STOPPED 0x30000000 +#define BCM43xx_DMA64_TXSTAT_SUSP 0x40000000 +#define BCM43xx_DMA64_TXERROR 0x14 +#define BCM43xx_DMA64_TXERRDPTR 0x0001FFFF +#define BCM43xx_DMA64_TXERR 0xF0000000 +#define BCM43xx_DMA64_TXERR_NOERR 0x00000000 +#define BCM43xx_DMA64_TXERR_PROT 0x10000000 +#define BCM43xx_DMA64_TXERR_UNDERRUN 0x20000000 +#define BCM43xx_DMA64_TXERR_TRANSFER 0x30000000 +#define BCM43xx_DMA64_TXERR_DESCREAD 0x40000000 +#define BCM43xx_DMA64_TXERR_CORE 0x50000000 +#define BCM43xx_DMA64_RXCTL 0x20 +#define BCM43xx_DMA64_RXENABLE 0x00000001 +#define BCM43xx_DMA64_RXFROFF_MASK 0x000000FE +#define BCM43xx_DMA64_RXFROFF_SHIFT 1 +#define BCM43xx_DMA64_RXDIRECTFIFO 0x00000100 +#define BCM43xx_DMA64_RXADDREXT_MASK 0x00030000 +#define BCM43xx_DMA64_RXADDREXT_SHIFT 16 +#define BCM43xx_DMA64_RXINDEX 0x24 +#define BCM43xx_DMA64_RXRINGLO 0x28 +#define BCM43xx_DMA64_RXRINGHI 0x2C +#define BCM43xx_DMA64_RXSTATUS 0x30 +#define BCM43xx_DMA64_RXSTATDPTR 0x00001FFF +#define BCM43xx_DMA64_RXSTAT 0xF0000000 +#define BCM43xx_DMA64_RXSTAT_DISABLED 0x00000000 +#define BCM43xx_DMA64_RXSTAT_ACTIVE 0x10000000 +#define BCM43xx_DMA64_RXSTAT_IDLEWAIT 0x20000000 +#define BCM43xx_DMA64_RXSTAT_STOPPED 0x30000000 +#define BCM43xx_DMA64_RXSTAT_SUSP 0x40000000 +#define BCM43xx_DMA64_RXERROR 0x34 +#define BCM43xx_DMA64_RXERRDPTR 0x0001FFFF +#define BCM43xx_DMA64_RXERR 0xF0000000 +#define BCM43xx_DMA64_RXERR_NOERR 0x00000000 +#define BCM43xx_DMA64_RXERR_PROT 0x10000000 +#define BCM43xx_DMA64_RXERR_UNDERRUN 0x20000000 +#define BCM43xx_DMA64_RXERR_TRANSFER 0x30000000 +#define BCM43xx_DMA64_RXERR_DESCREAD 0x40000000 +#define BCM43xx_DMA64_RXERR_CORE 0x50000000 + +/* 64-bit DMA descriptor. */ +struct bcm43xx_dmadesc64 { + __le32 control0; + __le32 control1; + __le32 address_low; + __le32 address_high; +} __attribute__((__packed__)); +#define BCM43xx_DMA64_DCTL0_DTABLEEND 0x10000000 +#define BCM43xx_DMA64_DCTL0_IRQ 0x20000000 +#define BCM43xx_DMA64_DCTL0_FRAMEEND 0x40000000 +#define BCM43xx_DMA64_DCTL0_FRAMESTART 0x80000000 +#define BCM43xx_DMA64_DCTL1_BYTECNT 0x00001FFF +#define BCM43xx_DMA64_DCTL1_ADDREXT_MASK 0x00030000 +#define BCM43xx_DMA64_DCTL1_ADDREXT_SHIFT 16 + +/* Address field Routing value. */ +#define BCM43xx_DMA64_ROUTING 0xC0000000 +#define BCM43xx_DMA64_ROUTING_SHIFT 30 +#define BCM43xx_DMA64_NOTRANS 0x00000000 +#define BCM43xx_DMA64_CLIENTTRANS 0x80000000 + + + +struct bcm43xx_dmadesc_generic { + union { + struct bcm43xx_dmadesc32 dma32; + struct bcm43xx_dmadesc64 dma64; + } __attribute__((__packed__)); +} __attribute__((__packed__)); + /* Misc DMA constants */ #define BCM43xx_DMA_RINGMEMSIZE PAGE_SIZE -#define BCM43xx_DMA_BUSADDRMAX 0x3FFFFFFF -#define BCM43xx_DMA_DMABUSADDROFFSET (1 << 30) -#define BCM43xx_DMA1_RX_FRAMEOFFSET 30 -#define BCM43xx_DMA4_RX_FRAMEOFFSET 0 +#define BCM43xx_DMA0_RX_FRAMEOFFSET 30 +#define BCM43xx_DMA3_RX_FRAMEOFFSET 0 + /* DMA engine tuning knobs */ #define BCM43xx_TXRING_SLOTS 512 #define BCM43xx_RXRING_SLOTS 64 -#define BCM43xx_DMA1_RXBUFFERSIZE (2304 + 100) -#define BCM43xx_DMA4_RXBUFFERSIZE 16 +#define BCM43xx_DMA0_RX_BUFFERSIZE (2304 + 100) +#define BCM43xx_DMA3_RX_BUFFERSIZE 16 /* Suspend the tx queue, if less than this percent slots are free. */ #define BCM43xx_TXSUSPEND_PERCENT 20 /* Resume the tx queue, if more than this percent slots are free. */ @@ -86,17 +202,6 @@ struct bcm43xx_private; struct bcm43xx_xmitstatus; -struct bcm43xx_dmadesc { - __le32 _control; - __le32 _address; -} __attribute__((__packed__)); - -/* Macros to access the bcm43xx_dmadesc struct */ -#define get_desc_ctl(desc) le32_to_cpu((desc)->_control) -#define set_desc_ctl(desc, ctl) do { (desc)->_control = cpu_to_le32(ctl); } while (0) -#define get_desc_addr(desc) le32_to_cpu((desc)->_address) -#define set_desc_addr(desc, addr) do { (desc)->_address = cpu_to_le32(addr); } while (0) - struct bcm43xx_dmadesc_meta { /* The kernel DMA-able buffer. */ struct sk_buff *skb; @@ -105,15 +210,14 @@ struct bcm43xx_dmadesc_meta { }; struct bcm43xx_dmaring { - struct bcm43xx_private *bcm; /* Kernel virtual base address of the ring memory. */ - struct bcm43xx_dmadesc *vbase; - /* DMA memory offset */ - dma_addr_t memoffset; - /* (Unadjusted) DMA base bus-address of the ring memory. */ - dma_addr_t dmabase; + void *descbase; /* Meta data about all descriptors. */ struct bcm43xx_dmadesc_meta *meta; + /* DMA Routing value. */ + u32 routing; + /* (Unadjusted) DMA base bus-address of the ring memory. */ + dma_addr_t dmabase; /* Number of descriptor slots in the ring. */ int nr_slots; /* Number of used descriptor slots. */ @@ -127,12 +231,17 @@ struct bcm43xx_dmaring { u32 frameoffset; /* Descriptor buffer size. */ u16 rx_buffersize; - /* The MMIO base register of the DMA controller, this - * ring is posted to. - */ + /* The MMIO base register of the DMA controller. */ u16 mmio_base; - u8 tx:1, /* TRUE, if this is a TX ring. */ - suspended:1; /* TRUE, if transfers are suspended on this ring. */ + /* DMA controller index number (0-5). */ + int index; + /* Boolean. Is this a TX ring? */ + u8 tx; + /* Boolean. 64bit DMA if true, 32bit DMA otherwise. */ + u8 dma64; + /* Boolean. Are transfers suspended on this ring? */ + u8 suspended; + struct bcm43xx_private *bcm; #ifdef CONFIG_BCM43XX_DEBUG /* Maximum number of used slots. */ int max_used_slots; @@ -140,6 +249,34 @@ struct bcm43xx_dmaring { }; +static inline +int bcm43xx_dma_desc2idx(struct bcm43xx_dmaring *ring, + struct bcm43xx_dmadesc_generic *desc) +{ + if (ring->dma64) { + struct bcm43xx_dmadesc64 *dd64 = ring->descbase; + return (int)(&(desc->dma64) - dd64); + } else { + struct bcm43xx_dmadesc32 *dd32 = ring->descbase; + return (int)(&(desc->dma32) - dd32); + } +} + +static inline +struct bcm43xx_dmadesc_generic * bcm43xx_dma_idx2desc(struct bcm43xx_dmaring *ring, + int slot, + struct bcm43xx_dmadesc_meta **meta) +{ + *meta = &(ring->meta[slot]); + if (ring->dma64) { + struct bcm43xx_dmadesc64 *dd64 = ring->descbase; + return (struct bcm43xx_dmadesc_generic *)(&(dd64[slot])); + } else { + struct bcm43xx_dmadesc32 *dd32 = ring->descbase; + return (struct bcm43xx_dmadesc_generic *)(&(dd32[slot])); + } +} + static inline u32 bcm43xx_dma_read(struct bcm43xx_dmaring *ring, u16 offset) @@ -159,9 +296,13 @@ int bcm43xx_dma_init(struct bcm43xx_private *bcm); void bcm43xx_dma_free(struct bcm43xx_private *bcm); int bcm43xx_dmacontroller_rx_reset(struct bcm43xx_private *bcm, - u16 dmacontroller_mmio_base); + u16 dmacontroller_mmio_base, + int dma64); int bcm43xx_dmacontroller_tx_reset(struct bcm43xx_private *bcm, - u16 dmacontroller_mmio_base); + u16 dmacontroller_mmio_base, + int dma64); + +u16 bcm43xx_dmacontroller_base(int dma64bit, int dmacontroller_idx); void bcm43xx_dma_tx_suspend(struct bcm43xx_dmaring *ring); void bcm43xx_dma_tx_resume(struct bcm43xx_dmaring *ring); @@ -173,7 +314,6 @@ int bcm43xx_dma_tx(struct bcm43xx_private *bcm, struct ieee80211_txb *txb); void bcm43xx_dma_rx(struct bcm43xx_dmaring *ring); - #else /* CONFIG_BCM43XX_DMA */ @@ -188,13 +328,15 @@ void bcm43xx_dma_free(struct bcm43xx_private *bcm) } static inline int bcm43xx_dmacontroller_rx_reset(struct bcm43xx_private *bcm, - u16 dmacontroller_mmio_base) + u16 dmacontroller_mmio_base, + int dma64) { return 0; } static inline int bcm43xx_dmacontroller_tx_reset(struct bcm43xx_private *bcm, - u16 dmacontroller_mmio_base) + u16 dmacontroller_mmio_base, + int dma64) { return 0; } diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_ethtool.c b/drivers/net/wireless/bcm43xx/bcm43xx_ethtool.c index b3ffcf501..e386dcc32 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_ethtool.c +++ b/drivers/net/wireless/bcm43xx/bcm43xx_ethtool.c @@ -32,7 +32,7 @@ #include #include #include -#include +#include static void bcm43xx_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_leds.c b/drivers/net/wireless/bcm43xx/bcm43xx_leds.c index 4b2c02c0b..c3f90c856 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_leds.c +++ b/drivers/net/wireless/bcm43xx/bcm43xx_leds.c @@ -51,12 +51,12 @@ static void bcm43xx_led_blink(unsigned long d) struct bcm43xx_private *bcm = led->bcm; unsigned long flags; - bcm43xx_lock_mmio(bcm, flags); + spin_lock_irqsave(&bcm->leds_lock, flags); if (led->blink_interval) { bcm43xx_led_changestate(led); mod_timer(&led->blink_timer, jiffies + led->blink_interval); } - bcm43xx_unlock_mmio(bcm, flags); + spin_unlock_irqrestore(&bcm->leds_lock, flags); } static void bcm43xx_led_blink_start(struct bcm43xx_led *led, @@ -177,7 +177,9 @@ void bcm43xx_leds_update(struct bcm43xx_private *bcm, int activity) int i, turn_on; unsigned long interval = 0; u16 ledctl; + unsigned long flags; + spin_lock_irqsave(&bcm->leds_lock, flags); ledctl = bcm43xx_read16(bcm, BCM43xx_MMIO_GPIO_CONTROL); for (i = 0; i < BCM43xx_NR_LEDS; i++) { led = &(bcm->leds[i]); @@ -266,6 +268,7 @@ void bcm43xx_leds_update(struct bcm43xx_private *bcm, int activity) ledctl &= ~(1 << i); } bcm43xx_write16(bcm, BCM43xx_MMIO_GPIO_CONTROL, ledctl); + spin_unlock_irqrestore(&bcm->leds_lock, flags); } void bcm43xx_leds_switch_all(struct bcm43xx_private *bcm, int on) @@ -274,7 +277,9 @@ void bcm43xx_leds_switch_all(struct bcm43xx_private *bcm, int on) u16 ledctl; int i; int bit_on; + unsigned long flags; + spin_lock_irqsave(&bcm->leds_lock, flags); ledctl = bcm43xx_read16(bcm, BCM43xx_MMIO_GPIO_CONTROL); for (i = 0; i < BCM43xx_NR_LEDS; i++) { led = &(bcm->leds[i]); @@ -290,4 +295,5 @@ void bcm43xx_leds_switch_all(struct bcm43xx_private *bcm, int on) ledctl &= ~(1 << i); } bcm43xx_write16(bcm, BCM43xx_MMIO_GPIO_CONTROL, ledctl); + spin_unlock_irqrestore(&bcm->leds_lock, flags); } diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_main.c b/drivers/net/wireless/bcm43xx/bcm43xx_main.c index 513fc759f..f24ba4d42 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_main.c +++ b/drivers/net/wireless/bcm43xx/bcm43xx_main.c @@ -128,13 +128,15 @@ MODULE_PARM_DESC(fwpostfix, "Postfix for .fw files. Useful for debugging."); static struct pci_device_id bcm43xx_pci_tbl[] = { /* Broadcom 4303 802.11b */ { PCI_VENDOR_ID_BROADCOM, 0x4301, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - /* Broadcom 4307 802.11b */ + /* Broadcom 4307 802.11b */ { PCI_VENDOR_ID_BROADCOM, 0x4307, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - /* Broadcom 4318 802.11b/g */ + /* Broadcom 4318 802.11b/g */ { PCI_VENDOR_ID_BROADCOM, 0x4318, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, + /* Broadcom 4319 802.11a/b/g */ + { PCI_VENDOR_ID_BROADCOM, 0x4319, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* Broadcom 4306 802.11b/g */ { PCI_VENDOR_ID_BROADCOM, 0x4320, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - /* Broadcom 4306 802.11a */ + /* Broadcom 4306 802.11a */ // { PCI_VENDOR_ID_BROADCOM, 0x4321, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* Broadcom 4309 802.11a/b/g */ { PCI_VENDOR_ID_BROADCOM, 0x4324, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, @@ -496,22 +498,30 @@ static inline u32 bcm43xx_interrupt_disable(struct bcm43xx_private *bcm, u32 mas return old_mask; } +/* Synchronize IRQ top- and bottom-half. + * IRQs must be masked before calling this. + * This must not be called with the irq_lock held. + */ +static void bcm43xx_synchronize_irq(struct bcm43xx_private *bcm) +{ + synchronize_irq(bcm->irq); + tasklet_disable(&bcm->isr_tasklet); +} + /* Make sure we don't receive more data from the device. */ -static int bcm43xx_disable_interrupts_sync(struct bcm43xx_private *bcm, u32 *oldstate) +static int bcm43xx_disable_interrupts_sync(struct bcm43xx_private *bcm) { - u32 old; unsigned long flags; - bcm43xx_lock_mmio(bcm, flags); - if (bcm43xx_is_initializing(bcm) || bcm->shutting_down) { - bcm43xx_unlock_mmio(bcm, flags); + spin_lock_irqsave(&bcm->irq_lock, flags); + if (unlikely(bcm43xx_status(bcm) != BCM43xx_STAT_INITIALIZED)) { + spin_unlock_irqrestore(&bcm->irq_lock, flags); return -EBUSY; } - old = bcm43xx_interrupt_disable(bcm, BCM43xx_IRQ_ALL); - tasklet_disable(&bcm->isr_tasklet); - bcm43xx_unlock_mmio(bcm, flags); - if (oldstate) - *oldstate = old; + bcm43xx_interrupt_disable(bcm, BCM43xx_IRQ_ALL); + bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_MASK); /* flush */ + spin_unlock_irqrestore(&bcm->irq_lock, flags); + bcm43xx_synchronize_irq(bcm); return 0; } @@ -524,7 +534,6 @@ static int bcm43xx_read_radioinfo(struct bcm43xx_private *bcm) u16 manufact; u16 version; u8 revision; - s8 i; if (bcm->chip_id == 0x4317) { if (bcm->chip_rev == 0x00) @@ -567,20 +576,11 @@ static int bcm43xx_read_radioinfo(struct bcm43xx_private *bcm) radio->version = version; radio->revision = revision; - /* Set default attenuation values. */ - radio->baseband_atten = bcm43xx_default_baseband_attenuation(bcm); - radio->radio_atten = bcm43xx_default_radio_attenuation(bcm); - radio->txctl1 = bcm43xx_default_txctl1(bcm); - radio->txctl2 = 0xFFFF; if (phy->type == BCM43xx_PHYTYPE_A) radio->txpower_desired = bcm->sprom.maxpower_aphy; else radio->txpower_desired = bcm->sprom.maxpower_bgphy; - /* Initialize the in-memory nrssi Lookup Table. */ - for (i = 0; i < 64; i++) - radio->nrssi_lt[i] = i; - return 0; err_unsupported_radio: @@ -1237,10 +1237,6 @@ int bcm43xx_switch_core(struct bcm43xx_private *bcm, struct bcm43xx_coreinfo *ne goto out; bcm->current_core = new_core; - bcm->current_80211_core_idx = -1; - if (new_core->id == BCM43xx_COREID_80211) - bcm->current_80211_core_idx = (int)(new_core - &(bcm->core_80211[0])); - out: return err; } @@ -1376,6 +1372,7 @@ void bcm43xx_wireless_core_reset(struct bcm43xx_private *bcm, int connect_phy) if ((bcm43xx_core_enabled(bcm)) && !bcm43xx_using_pio(bcm)) { //FIXME: Do we _really_ want #ifndef CONFIG_BCM947XX here? +#if 0 #ifndef CONFIG_BCM947XX /* reset all used DMA controllers. */ bcm43xx_dmacontroller_tx_reset(bcm, BCM43xx_MMIO_DMA1_BASE); @@ -1385,9 +1382,10 @@ void bcm43xx_wireless_core_reset(struct bcm43xx_private *bcm, int connect_phy) bcm43xx_dmacontroller_rx_reset(bcm, BCM43xx_MMIO_DMA1_BASE); if (bcm->current_core->rev < 5) bcm43xx_dmacontroller_rx_reset(bcm, BCM43xx_MMIO_DMA4_BASE); +#endif #endif } - if (bcm->shutting_down) { + if (bcm43xx_status(bcm) == BCM43xx_STAT_SHUTTINGDOWN) { bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD, bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD) & ~(BCM43xx_SBF_MAC_ENABLED | 0x00000002)); @@ -1410,43 +1408,23 @@ static void bcm43xx_wireless_core_disable(struct bcm43xx_private *bcm) bcm43xx_core_disable(bcm, 0); } -/* Mark the current 80211 core inactive. - * "active_80211_core" is the other 80211 core, which is used. - */ -static int bcm43xx_wireless_core_mark_inactive(struct bcm43xx_private *bcm, - struct bcm43xx_coreinfo *active_80211_core) +/* Mark the current 80211 core inactive. */ +static void bcm43xx_wireless_core_mark_inactive(struct bcm43xx_private *bcm) { u32 sbtmstatelow; - struct bcm43xx_coreinfo *old_core; - int err = 0; bcm43xx_interrupt_disable(bcm, BCM43xx_IRQ_ALL); bcm43xx_radio_turn_off(bcm); sbtmstatelow = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATELOW); - sbtmstatelow &= ~0x200a0000; - sbtmstatelow |= 0xa0000; + sbtmstatelow &= 0xDFF5FFFF; + sbtmstatelow |= 0x000A0000; bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, sbtmstatelow); udelay(1); sbtmstatelow = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATELOW); - sbtmstatelow &= ~0xa0000; - sbtmstatelow |= 0x80000; + sbtmstatelow &= 0xFFF5FFFF; + sbtmstatelow |= 0x00080000; bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, sbtmstatelow); udelay(1); - - if (bcm43xx_current_phy(bcm)->type == BCM43xx_PHYTYPE_G) { - old_core = bcm->current_core; - err = bcm43xx_switch_core(bcm, active_80211_core); - if (err) - goto out; - sbtmstatelow = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATELOW); - sbtmstatelow &= ~0x20000000; - sbtmstatelow |= 0x20000000; - bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, sbtmstatelow); - err = bcm43xx_switch_core(bcm, old_core); - } - -out: - return err; } static void handle_irq_transmit_status(struct bcm43xx_private *bcm) @@ -1534,7 +1512,7 @@ static void handle_irq_noise(struct bcm43xx_private *bcm) goto generate_new; /* Get the noise samples. */ - assert(bcm->noisecalc.nr_samples <= 8); + assert(bcm->noisecalc.nr_samples < 8); i = bcm->noisecalc.nr_samples; noise[0] = limit_value(noise[0], 0, ARRAY_SIZE(radio->nrssi_lt) - 1); noise[1] = limit_value(noise[1], 0, ARRAY_SIZE(radio->nrssi_lt) - 1); @@ -1568,17 +1546,7 @@ static void handle_irq_noise(struct bcm43xx_private *bcm) else average -= 48; -/* FIXME: This is wrong, but people want fancy stats. well... */ -bcm->stats.noise = average; - if (average > -65) - bcm->stats.link_quality = 0; - else if (average > -75) - bcm->stats.link_quality = 1; - else if (average > -85) - bcm->stats.link_quality = 2; - else - bcm->stats.link_quality = 3; -// dprintk(KERN_INFO PFX "Link Quality: %u (avg was %d)\n", bcm->stats.link_quality, average); + bcm->stats.noise = average; drop_calculation: bcm->noisecalc.calculation_running = 0; return; @@ -1696,8 +1664,9 @@ static void handle_irq_beacon(struct bcm43xx_private *bcm) static void bcm43xx_interrupt_tasklet(struct bcm43xx_private *bcm) { u32 reason; - u32 dma_reason[4]; - int activity = 0; + u32 dma_reason[6]; + u32 merged_dma_reason = 0; + int i, activity = 0; unsigned long flags; #ifdef CONFIG_BCM43XX_DEBUG @@ -1707,12 +1676,12 @@ static void bcm43xx_interrupt_tasklet(struct bcm43xx_private *bcm) # define bcmirq_handled(irq) do { /* nothing */ } while (0) #endif /* CONFIG_BCM43XX_DEBUG*/ - bcm43xx_lock_mmio(bcm, flags); + spin_lock_irqsave(&bcm->irq_lock, flags); reason = bcm->irq_reason; - dma_reason[0] = bcm->dma_reason[0]; - dma_reason[1] = bcm->dma_reason[1]; - dma_reason[2] = bcm->dma_reason[2]; - dma_reason[3] = bcm->dma_reason[3]; + for (i = 5; i >= 0; i--) { + dma_reason[i] = bcm->dma_reason[i]; + merged_dma_reason |= dma_reason[i]; + } if (unlikely(reason & BCM43xx_IRQ_XMIT_ERROR)) { /* TX error. We get this when Template Ram is written in wrong endianess @@ -1723,26 +1692,25 @@ static void bcm43xx_interrupt_tasklet(struct bcm43xx_private *bcm) printkl(KERN_ERR PFX "FATAL ERROR: BCM43xx_IRQ_XMIT_ERROR\n"); bcmirq_handled(BCM43xx_IRQ_XMIT_ERROR); } - if (unlikely((dma_reason[0] & BCM43xx_DMAIRQ_FATALMASK) | - (dma_reason[1] & BCM43xx_DMAIRQ_FATALMASK) | - (dma_reason[2] & BCM43xx_DMAIRQ_FATALMASK) | - (dma_reason[3] & BCM43xx_DMAIRQ_FATALMASK))) { + if (unlikely(merged_dma_reason & BCM43xx_DMAIRQ_FATALMASK)) { printkl(KERN_ERR PFX "FATAL ERROR: Fatal DMA error: " - "0x%08X, 0x%08X, 0x%08X, 0x%08X\n", + "0x%08X, 0x%08X, 0x%08X, " + "0x%08X, 0x%08X, 0x%08X\n", dma_reason[0], dma_reason[1], - dma_reason[2], dma_reason[3]); + dma_reason[2], dma_reason[3], + dma_reason[4], dma_reason[5]); bcm43xx_controller_restart(bcm, "DMA error"); - bcm43xx_unlock_mmio(bcm, flags); + mmiowb(); + spin_unlock_irqrestore(&bcm->irq_lock, flags); return; } - if (unlikely((dma_reason[0] & BCM43xx_DMAIRQ_NONFATALMASK) | - (dma_reason[1] & BCM43xx_DMAIRQ_NONFATALMASK) | - (dma_reason[2] & BCM43xx_DMAIRQ_NONFATALMASK) | - (dma_reason[3] & BCM43xx_DMAIRQ_NONFATALMASK))) { + if (unlikely(merged_dma_reason & BCM43xx_DMAIRQ_NONFATALMASK)) { printkl(KERN_ERR PFX "DMA error: " - "0x%08X, 0x%08X, 0x%08X, 0x%08X\n", + "0x%08X, 0x%08X, 0x%08X, " + "0x%08X, 0x%08X, 0x%08X\n", dma_reason[0], dma_reason[1], - dma_reason[2], dma_reason[3]); + dma_reason[2], dma_reason[3], + dma_reason[4], dma_reason[5]); } if (reason & BCM43xx_IRQ_PS) { @@ -1777,8 +1745,6 @@ static void bcm43xx_interrupt_tasklet(struct bcm43xx_private *bcm) } /* Check the DMA reason registers for received data. */ - assert(!(dma_reason[1] & BCM43xx_DMAIRQ_RX_DONE)); - assert(!(dma_reason[2] & BCM43xx_DMAIRQ_RX_DONE)); if (dma_reason[0] & BCM43xx_DMAIRQ_RX_DONE) { if (bcm43xx_using_pio(bcm)) bcm43xx_pio_rx(bcm43xx_current_pio(bcm)->queue0); @@ -1786,13 +1752,17 @@ static void bcm43xx_interrupt_tasklet(struct bcm43xx_private *bcm) bcm43xx_dma_rx(bcm43xx_current_dma(bcm)->rx_ring0); /* We intentionally don't set "activity" to 1, here. */ } + assert(!(dma_reason[1] & BCM43xx_DMAIRQ_RX_DONE)); + assert(!(dma_reason[2] & BCM43xx_DMAIRQ_RX_DONE)); if (dma_reason[3] & BCM43xx_DMAIRQ_RX_DONE) { if (bcm43xx_using_pio(bcm)) bcm43xx_pio_rx(bcm43xx_current_pio(bcm)->queue3); else - bcm43xx_dma_rx(bcm43xx_current_dma(bcm)->rx_ring1); + bcm43xx_dma_rx(bcm43xx_current_dma(bcm)->rx_ring3); activity = 1; } + assert(!(dma_reason[4] & BCM43xx_DMAIRQ_RX_DONE)); + assert(!(dma_reason[5] & BCM43xx_DMAIRQ_RX_DONE)); bcmirq_handled(BCM43xx_IRQ_RX); if (reason & BCM43xx_IRQ_XMIT_STATUS) { @@ -1819,7 +1789,8 @@ static void bcm43xx_interrupt_tasklet(struct bcm43xx_private *bcm) if (!modparam_noleds) bcm43xx_leds_update(bcm, activity); bcm43xx_interrupt_enable(bcm, bcm->irq_savedstate); - bcm43xx_unlock_mmio(bcm, flags); + mmiowb(); + spin_unlock_irqrestore(&bcm->irq_lock, flags); } static void pio_irq_workaround(struct bcm43xx_private *bcm, @@ -1848,14 +1819,18 @@ static void bcm43xx_interrupt_ack(struct bcm43xx_private *bcm, u32 reason) bcm43xx_write32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON, reason); - bcm43xx_write32(bcm, BCM43xx_MMIO_DMA1_REASON, + bcm43xx_write32(bcm, BCM43xx_MMIO_DMA0_REASON, bcm->dma_reason[0]); - bcm43xx_write32(bcm, BCM43xx_MMIO_DMA2_REASON, + bcm43xx_write32(bcm, BCM43xx_MMIO_DMA1_REASON, bcm->dma_reason[1]); - bcm43xx_write32(bcm, BCM43xx_MMIO_DMA3_REASON, + bcm43xx_write32(bcm, BCM43xx_MMIO_DMA2_REASON, bcm->dma_reason[2]); - bcm43xx_write32(bcm, BCM43xx_MMIO_DMA4_REASON, + bcm43xx_write32(bcm, BCM43xx_MMIO_DMA3_REASON, bcm->dma_reason[3]); + bcm43xx_write32(bcm, BCM43xx_MMIO_DMA4_REASON, + bcm->dma_reason[4]); + bcm43xx_write32(bcm, BCM43xx_MMIO_DMA5_REASON, + bcm->dma_reason[5]); } /* Interrupt handler top-half */ @@ -1868,16 +1843,10 @@ static irqreturn_t bcm43xx_interrupt_handler(int irq, void *dev_id, struct pt_re if (!bcm) return IRQ_NONE; - spin_lock(&bcm->_lock); + spin_lock(&bcm->irq_lock); - /* Only accept IRQs, if we are initialized properly. - * This avoids an RX race while initializing. - * We should probably not enable IRQs before we are initialized - * completely, but some careful work is needed to fix this. I think it - * is best to stay with this cheap workaround for now... . - */ - if (unlikely(!bcm->initialized)) - goto out; + assert(bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED); + assert(bcm->current_core->id == BCM43xx_COREID_80211); reason = bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); if (reason == 0xffffffff) { @@ -1889,14 +1858,18 @@ static irqreturn_t bcm43xx_interrupt_handler(int irq, void *dev_id, struct pt_re if (!reason) goto out; - bcm->dma_reason[0] = bcm43xx_read32(bcm, BCM43xx_MMIO_DMA1_REASON) - & 0x0001dc00; - bcm->dma_reason[1] = bcm43xx_read32(bcm, BCM43xx_MMIO_DMA2_REASON) - & 0x0000dc00; - bcm->dma_reason[2] = bcm43xx_read32(bcm, BCM43xx_MMIO_DMA3_REASON) - & 0x0000dc00; - bcm->dma_reason[3] = bcm43xx_read32(bcm, BCM43xx_MMIO_DMA4_REASON) - & 0x0001dc00; + bcm->dma_reason[0] = bcm43xx_read32(bcm, BCM43xx_MMIO_DMA0_REASON) + & 0x0001DC00; + bcm->dma_reason[1] = bcm43xx_read32(bcm, BCM43xx_MMIO_DMA1_REASON) + & 0x0000DC00; + bcm->dma_reason[2] = bcm43xx_read32(bcm, BCM43xx_MMIO_DMA2_REASON) + & 0x0000DC00; + bcm->dma_reason[3] = bcm43xx_read32(bcm, BCM43xx_MMIO_DMA3_REASON) + & 0x0001DC00; + bcm->dma_reason[4] = bcm43xx_read32(bcm, BCM43xx_MMIO_DMA4_REASON) + & 0x0000DC00; + bcm->dma_reason[5] = bcm43xx_read32(bcm, BCM43xx_MMIO_DMA5_REASON) + & 0x0000DC00; bcm43xx_interrupt_ack(bcm, reason); @@ -1905,25 +1878,28 @@ static irqreturn_t bcm43xx_interrupt_handler(int irq, void *dev_id, struct pt_re /* save the reason code and call our bottom half. */ bcm->irq_reason = reason; tasklet_schedule(&bcm->isr_tasklet); + out: mmiowb(); - spin_unlock(&bcm->_lock); + spin_unlock(&bcm->irq_lock); return ret; } static void bcm43xx_release_firmware(struct bcm43xx_private *bcm, int force) { + struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm); + if (bcm->firmware_norelease && !force) return; /* Suspending or controller reset. */ - release_firmware(bcm->ucode); - bcm->ucode = NULL; - release_firmware(bcm->pcm); - bcm->pcm = NULL; - release_firmware(bcm->initvals0); - bcm->initvals0 = NULL; - release_firmware(bcm->initvals1); - bcm->initvals1 = NULL; + release_firmware(phy->ucode); + phy->ucode = NULL; + release_firmware(phy->pcm); + phy->pcm = NULL; + release_firmware(phy->initvals0); + phy->initvals0 = NULL; + release_firmware(phy->initvals1); + phy->initvals1 = NULL; } static int bcm43xx_request_firmware(struct bcm43xx_private *bcm) @@ -1934,11 +1910,11 @@ static int bcm43xx_request_firmware(struct bcm43xx_private *bcm) int nr; char buf[22 + sizeof(modparam_fwpostfix) - 1] = { 0 }; - if (!bcm->ucode) { + if (!phy->ucode) { snprintf(buf, ARRAY_SIZE(buf), "bcm43xx_microcode%d%s.fw", (rev >= 5 ? 5 : rev), modparam_fwpostfix); - err = request_firmware(&bcm->ucode, buf, &bcm->pci_dev->dev); + err = request_firmware(&phy->ucode, buf, &bcm->pci_dev->dev); if (err) { printk(KERN_ERR PFX "Error: Microcode \"%s\" not available or load failed.\n", @@ -1947,12 +1923,12 @@ static int bcm43xx_request_firmware(struct bcm43xx_private *bcm) } } - if (!bcm->pcm) { + if (!phy->pcm) { snprintf(buf, ARRAY_SIZE(buf), "bcm43xx_pcm%d%s.fw", (rev < 5 ? 4 : 5), modparam_fwpostfix); - err = request_firmware(&bcm->pcm, buf, &bcm->pci_dev->dev); + err = request_firmware(&phy->pcm, buf, &bcm->pci_dev->dev); if (err) { printk(KERN_ERR PFX "Error: PCM \"%s\" not available or load failed.\n", @@ -1961,7 +1937,7 @@ static int bcm43xx_request_firmware(struct bcm43xx_private *bcm) } } - if (!bcm->initvals0) { + if (!phy->initvals0) { if (rev == 2 || rev == 4) { switch (phy->type) { case BCM43xx_PHYTYPE_A: @@ -1992,20 +1968,20 @@ static int bcm43xx_request_firmware(struct bcm43xx_private *bcm) snprintf(buf, ARRAY_SIZE(buf), "bcm43xx_initval%02d%s.fw", nr, modparam_fwpostfix); - err = request_firmware(&bcm->initvals0, buf, &bcm->pci_dev->dev); + err = request_firmware(&phy->initvals0, buf, &bcm->pci_dev->dev); if (err) { printk(KERN_ERR PFX "Error: InitVals \"%s\" not available or load failed.\n", buf); goto error; } - if (bcm->initvals0->size % sizeof(struct bcm43xx_initval)) { + if (phy->initvals0->size % sizeof(struct bcm43xx_initval)) { printk(KERN_ERR PFX "InitVals fileformat error.\n"); goto error; } } - if (!bcm->initvals1) { + if (!phy->initvals1) { if (rev >= 5) { u32 sbtmstatehigh; @@ -2027,14 +2003,14 @@ static int bcm43xx_request_firmware(struct bcm43xx_private *bcm) snprintf(buf, ARRAY_SIZE(buf), "bcm43xx_initval%02d%s.fw", nr, modparam_fwpostfix); - err = request_firmware(&bcm->initvals1, buf, &bcm->pci_dev->dev); + err = request_firmware(&phy->initvals1, buf, &bcm->pci_dev->dev); if (err) { printk(KERN_ERR PFX "Error: InitVals \"%s\" not available or load failed.\n", buf); goto error; } - if (bcm->initvals1->size % sizeof(struct bcm43xx_initval)) { + if (phy->initvals1->size % sizeof(struct bcm43xx_initval)) { printk(KERN_ERR PFX "InitVals fileformat error.\n"); goto error; } @@ -2054,12 +2030,13 @@ err_noinitval: static void bcm43xx_upload_microcode(struct bcm43xx_private *bcm) { + struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm); const u32 *data; unsigned int i, len; /* Upload Microcode. */ - data = (u32 *)(bcm->ucode->data); - len = bcm->ucode->size / sizeof(u32); + data = (u32 *)(phy->ucode->data); + len = phy->ucode->size / sizeof(u32); bcm43xx_shm_control_word(bcm, BCM43xx_SHM_UCODE, 0x0000); for (i = 0; i < len; i++) { bcm43xx_write32(bcm, BCM43xx_MMIO_SHM_DATA, @@ -2068,8 +2045,8 @@ static void bcm43xx_upload_microcode(struct bcm43xx_private *bcm) } /* Upload PCM data. */ - data = (u32 *)(bcm->pcm->data); - len = bcm->pcm->size / sizeof(u32); + data = (u32 *)(phy->pcm->data); + len = phy->pcm->size / sizeof(u32); bcm43xx_shm_control_word(bcm, BCM43xx_SHM_PCM, 0x01ea); bcm43xx_write32(bcm, BCM43xx_MMIO_SHM_DATA, 0x00004000); bcm43xx_shm_control_word(bcm, BCM43xx_SHM_PCM, 0x01eb); @@ -2115,15 +2092,16 @@ err_format: static int bcm43xx_upload_initvals(struct bcm43xx_private *bcm) { + struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm); int err; - err = bcm43xx_write_initvals(bcm, (struct bcm43xx_initval *)bcm->initvals0->data, - bcm->initvals0->size / sizeof(struct bcm43xx_initval)); + err = bcm43xx_write_initvals(bcm, (struct bcm43xx_initval *)phy->initvals0->data, + phy->initvals0->size / sizeof(struct bcm43xx_initval)); if (err) goto out; - if (bcm->initvals1) { - err = bcm43xx_write_initvals(bcm, (struct bcm43xx_initval *)bcm->initvals1->data, - bcm->initvals1->size / sizeof(struct bcm43xx_initval)); + if (phy->initvals1) { + err = bcm43xx_write_initvals(bcm, (struct bcm43xx_initval *)phy->initvals1->data, + phy->initvals1->size / sizeof(struct bcm43xx_initval)); if (err) goto out; } @@ -2131,49 +2109,38 @@ out: return err; } +#ifdef CONFIG_BCM947XX +static struct pci_device_id bcm43xx_47xx_ids[] = { + { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4324) }, + { 0 } +}; +#endif + static int bcm43xx_initialize_irq(struct bcm43xx_private *bcm) { - int res; - unsigned int i; - u32 data; + int err; bcm->irq = bcm->pci_dev->irq; #ifdef CONFIG_BCM947XX if (bcm->pci_dev->bus->number == 0) { - struct pci_dev *d = NULL; - /* FIXME: we will probably need more device IDs here... */ - d = pci_find_device(PCI_VENDOR_ID_BROADCOM, 0x4324, NULL); - if (d != NULL) { - bcm->irq = d->irq; + struct pci_dev *d; + struct pci_device_id *id; + for (id = bcm43xx_47xx_ids; id->vendor; id++) { + d = pci_get_device(id->vendor, id->device, NULL); + if (d != NULL) { + bcm->irq = d->irq; + pci_dev_put(d); + break; + } } } #endif - res = request_irq(bcm->irq, bcm43xx_interrupt_handler, - SA_SHIRQ, KBUILD_MODNAME, bcm); - if (res) { + err = request_irq(bcm->irq, bcm43xx_interrupt_handler, + IRQF_SHARED, KBUILD_MODNAME, bcm); + if (err) printk(KERN_ERR PFX "Cannot register IRQ%d\n", bcm->irq); - return -ENODEV; - } - bcm43xx_write32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON, 0xffffffff); - bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD, 0x00020402); - i = 0; - while (1) { - data = bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); - if (data == BCM43xx_IRQ_READY) - break; - i++; - if (i >= BCM43xx_IRQWAIT_MAX_RETRIES) { - printk(KERN_ERR PFX "Card IRQ register not responding. " - "Giving up.\n"); - free_irq(bcm->irq, bcm); - return -ENODEV; - } - udelay(10); - } - // dummy read - bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); - return 0; + return err; } /* Switch to the core used to write the GPIO register. @@ -2271,13 +2238,17 @@ static int bcm43xx_gpio_cleanup(struct bcm43xx_private *bcm) /* http://bcm-specs.sipsolutions.net/EnableMac */ void bcm43xx_mac_enable(struct bcm43xx_private *bcm) { - bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD, - bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD) - | BCM43xx_SBF_MAC_ENABLED); - bcm43xx_write32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON, BCM43xx_IRQ_READY); - bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD); /* dummy read */ - bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); /* dummy read */ - bcm43xx_power_saving_ctl_bits(bcm, -1, -1); + bcm->mac_suspended--; + assert(bcm->mac_suspended >= 0); + if (bcm->mac_suspended == 0) { + bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD, + bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD) + | BCM43xx_SBF_MAC_ENABLED); + bcm43xx_write32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON, BCM43xx_IRQ_READY); + bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD); /* dummy read */ + bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); /* dummy read */ + bcm43xx_power_saving_ctl_bits(bcm, -1, -1); + } } /* http://bcm-specs.sipsolutions.net/SuspendMAC */ @@ -2286,18 +2257,23 @@ void bcm43xx_mac_suspend(struct bcm43xx_private *bcm) int i; u32 tmp; - bcm43xx_power_saving_ctl_bits(bcm, -1, 1); - bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD, - bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD) - & ~BCM43xx_SBF_MAC_ENABLED); - bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); /* dummy read */ - for (i = 100000; i; i--) { - tmp = bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); - if (tmp & BCM43xx_IRQ_READY) - return; - udelay(10); + assert(bcm->mac_suspended >= 0); + if (bcm->mac_suspended == 0) { + bcm43xx_power_saving_ctl_bits(bcm, -1, 1); + bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD, + bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD) + & ~BCM43xx_SBF_MAC_ENABLED); + bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); /* dummy read */ + for (i = 10000; i; i--) { + tmp = bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); + if (tmp & BCM43xx_IRQ_READY) + goto out; + udelay(1); + } + printkl(KERN_ERR PFX "MAC suspend failed\n"); } - printkl(KERN_ERR PFX "MAC suspend failed\n"); +out: + bcm->mac_suspended++; } void bcm43xx_set_iwmode(struct bcm43xx_private *bcm, @@ -2367,7 +2343,6 @@ static void bcm43xx_chip_cleanup(struct bcm43xx_private *bcm) if (!modparam_noleds) bcm43xx_leds_exit(bcm); bcm43xx_gpio_cleanup(bcm); - free_irq(bcm->irq, bcm); bcm43xx_release_firmware(bcm, 0); } @@ -2379,7 +2354,7 @@ static int bcm43xx_chip_init(struct bcm43xx_private *bcm) struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm); struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm); int err; - int tmp; + int i, tmp; u32 value32; u16 value16; @@ -2392,13 +2367,53 @@ static int bcm43xx_chip_init(struct bcm43xx_private *bcm) goto out; bcm43xx_upload_microcode(bcm); - err = bcm43xx_initialize_irq(bcm); - if (err) + bcm43xx_write32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON, 0xFFFFFFFF); + bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD, 0x00020402); + i = 0; + while (1) { + value32 = bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); + if (value32 == BCM43xx_IRQ_READY) + break; + i++; + if (i >= BCM43xx_IRQWAIT_MAX_RETRIES) { + printk(KERN_ERR PFX "IRQ_READY timeout\n"); + err = -ENODEV; + goto err_release_fw; + } + udelay(10); + } + bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); /* dummy read */ + + value16 = bcm43xx_shm_read16(bcm, BCM43xx_SHM_SHARED, + BCM43xx_UCODE_REVISION); + + dprintk(KERN_INFO PFX "Microcode rev 0x%x, pl 0x%x " + "(20%.2i-%.2i-%.2i %.2i:%.2i:%.2i)\n", value16, + bcm43xx_shm_read16(bcm, BCM43xx_SHM_SHARED, + BCM43xx_UCODE_PATCHLEVEL), + (bcm43xx_shm_read16(bcm, BCM43xx_SHM_SHARED, + BCM43xx_UCODE_DATE) >> 12) & 0xf, + (bcm43xx_shm_read16(bcm, BCM43xx_SHM_SHARED, + BCM43xx_UCODE_DATE) >> 8) & 0xf, + bcm43xx_shm_read16(bcm, BCM43xx_SHM_SHARED, + BCM43xx_UCODE_DATE) & 0xff, + (bcm43xx_shm_read16(bcm, BCM43xx_SHM_SHARED, + BCM43xx_UCODE_TIME) >> 11) & 0x1f, + (bcm43xx_shm_read16(bcm, BCM43xx_SHM_SHARED, + BCM43xx_UCODE_TIME) >> 5) & 0x3f, + bcm43xx_shm_read16(bcm, BCM43xx_SHM_SHARED, + BCM43xx_UCODE_TIME) & 0x1f); + + if ( value16 > 0x128 ) { + dprintk(KERN_ERR PFX + "Firmware: no support for microcode rev > 0x128\n"); + err = -1; goto err_release_fw; + } err = bcm43xx_gpio_init(bcm); if (err) - goto err_free_irq; + goto err_release_fw; err = bcm43xx_upload_initvals(bcm); if (err) @@ -2462,10 +2477,12 @@ static int bcm43xx_chip_init(struct bcm43xx_private *bcm) bcm43xx_write32(bcm, 0x018C, 0x02000000); } bcm43xx_write32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON, 0x00004000); - bcm43xx_write32(bcm, BCM43xx_MMIO_DMA1_IRQ_MASK, 0x0001DC00); + bcm43xx_write32(bcm, BCM43xx_MMIO_DMA0_IRQ_MASK, 0x0001DC00); + bcm43xx_write32(bcm, BCM43xx_MMIO_DMA1_IRQ_MASK, 0x0000DC00); bcm43xx_write32(bcm, BCM43xx_MMIO_DMA2_IRQ_MASK, 0x0000DC00); - bcm43xx_write32(bcm, BCM43xx_MMIO_DMA3_IRQ_MASK, 0x0000DC00); - bcm43xx_write32(bcm, BCM43xx_MMIO_DMA4_IRQ_MASK, 0x0001DC00); + bcm43xx_write32(bcm, BCM43xx_MMIO_DMA3_IRQ_MASK, 0x0001DC00); + bcm43xx_write32(bcm, BCM43xx_MMIO_DMA4_IRQ_MASK, 0x0000DC00); + bcm43xx_write32(bcm, BCM43xx_MMIO_DMA5_IRQ_MASK, 0x0000DC00); value32 = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATELOW); value32 |= 0x00100000; @@ -2482,8 +2499,6 @@ err_radio_off: bcm43xx_radio_turn_off(bcm); err_gpio_cleanup: bcm43xx_gpio_cleanup(bcm); -err_free_irq: - free_irq(bcm->irq, bcm); err_release_fw: bcm43xx_release_firmware(bcm, 1); goto out; @@ -2523,11 +2538,9 @@ static void bcm43xx_init_struct_phyinfo(struct bcm43xx_phyinfo *phy) { /* Initialize a "phyinfo" structure. The structure is already * zeroed out. + * This is called on insmod time to initialize members. */ - phy->antenna_diversity = 0xFFFF; phy->savedpctlreg = 0xFFFF; - phy->minlowsig[0] = 0xFFFF; - phy->minlowsig[1] = 0xFFFF; spin_lock_init(&phy->lock); } @@ -2535,14 +2548,11 @@ static void bcm43xx_init_struct_radioinfo(struct bcm43xx_radioinfo *radio) { /* Initialize a "radioinfo" structure. The structure is already * zeroed out. + * This is called on insmod time to initialize members. */ radio->interfmode = BCM43xx_RADIO_INTERFMODE_NONE; radio->channel = 0xFF; radio->initial_channel = 0xFF; - radio->lofcal = 0xFFFF; - radio->initval = 0xFFFF; - radio->nrssi[0] = -1000; - radio->nrssi[1] = -1000; } static int bcm43xx_probe_cores(struct bcm43xx_private *bcm) @@ -2560,7 +2570,6 @@ static int bcm43xx_probe_cores(struct bcm43xx_private *bcm) * BCM43xx_MAX_80211_CORES); memset(&bcm->core_80211_ext, 0, sizeof(struct bcm43xx_coreinfo_80211) * BCM43xx_MAX_80211_CORES); - bcm->current_80211_core_idx = -1; bcm->nr_80211_available = 0; bcm->current_core = NULL; bcm->active_80211_core = NULL; @@ -2730,6 +2739,7 @@ static int bcm43xx_probe_cores(struct bcm43xx_private *bcm) goto out; } bcm->nr_80211_available++; + core->priv = ext_80211; bcm43xx_init_struct_phyinfo(&ext_80211->phy); bcm43xx_init_struct_radioinfo(&ext_80211->radio); break; @@ -2830,7 +2840,8 @@ static void bcm43xx_wireless_core_cleanup(struct bcm43xx_private *bcm) } /* http://bcm-specs.sipsolutions.net/80211Init */ -static int bcm43xx_wireless_core_init(struct bcm43xx_private *bcm) +static int bcm43xx_wireless_core_init(struct bcm43xx_private *bcm, + int active_wlcore) { struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm); struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm); @@ -2912,19 +2923,26 @@ static int bcm43xx_wireless_core_init(struct bcm43xx_private *bcm) if (bcm->current_core->rev >= 5) bcm43xx_write16(bcm, 0x043C, 0x000C); - if (bcm43xx_using_pio(bcm)) - err = bcm43xx_pio_init(bcm); - else - err = bcm43xx_dma_init(bcm); - if (err) - goto err_chip_cleanup; + if (active_wlcore) { + if (bcm43xx_using_pio(bcm)) + err = bcm43xx_pio_init(bcm); + else + err = bcm43xx_dma_init(bcm); + if (err) + goto err_chip_cleanup; + } bcm43xx_write16(bcm, 0x0612, 0x0050); bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x0416, 0x0050); bcm43xx_shm_write16(bcm, BCM43xx_SHM_SHARED, 0x0414, 0x01F4); - bcm43xx_mac_enable(bcm); - bcm43xx_interrupt_enable(bcm, bcm->irq_savedstate); + if (active_wlcore) { + if (radio->initial_channel != 0xFF) + bcm43xx_radio_selectchannel(bcm, radio->initial_channel, 0); + } + /* Don't enable MAC/IRQ here, as it will race with the IRQ handler. + * We enable it later. + */ bcm->current_core->initialized = 1; out: return err; @@ -3039,11 +3057,6 @@ out: return err; } -static void bcm43xx_softmac_init(struct bcm43xx_private *bcm) -{ - ieee80211softmac_start(bcm->net_dev); -} - static void bcm43xx_periodic_every120sec(struct bcm43xx_private *bcm) { struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm); @@ -3104,15 +3117,10 @@ static void bcm43xx_periodic_every15sec(struct bcm43xx_private *bcm) //TODO for APHY (temperature?) } -static void bcm43xx_periodic_task_handler(unsigned long d) +static void do_periodic_work(struct bcm43xx_private *bcm) { - struct bcm43xx_private *bcm = (struct bcm43xx_private *)d; - unsigned long flags; unsigned int state; - bcm43xx_lock_mmio(bcm, flags); - - assert(bcm->initialized); state = bcm->periodic_state; if (state % 8 == 0) bcm43xx_periodic_every120sec(bcm); @@ -3120,29 +3128,93 @@ static void bcm43xx_periodic_task_handler(unsigned long d) bcm43xx_periodic_every60sec(bcm); if (state % 2 == 0) bcm43xx_periodic_every30sec(bcm); - bcm43xx_periodic_every15sec(bcm); + if (state % 1 == 0) + bcm43xx_periodic_every15sec(bcm); bcm->periodic_state = state + 1; - mod_timer(&bcm->periodic_tasks, jiffies + (HZ * 15)); + schedule_delayed_work(&bcm->periodic_work, HZ * 15); +} + +/* Estimate a "Badness" value based on the periodic work + * state-machine state. "Badness" is worse (bigger), if the + * periodic work will take longer. + */ +static int estimate_periodic_work_badness(unsigned int state) +{ + int badness = 0; + + if (state % 8 == 0) /* every 120 sec */ + badness += 10; + if (state % 4 == 0) /* every 60 sec */ + badness += 5; + if (state % 2 == 0) /* every 30 sec */ + badness += 1; + if (state % 1 == 0) /* every 15 sec */ + badness += 1; + +#define BADNESS_LIMIT 4 + return badness; +} + +static void bcm43xx_periodic_work_handler(void *d) +{ + struct bcm43xx_private *bcm = d; + unsigned long flags; + u32 savedirqs = 0; + int badness; + + badness = estimate_periodic_work_badness(bcm->periodic_state); + mutex_lock(&bcm->mutex); + + /* We must fake a started transmission here, as we are going to + * disable TX. If we wouldn't fake a TX, it would be possible to + * trigger the netdev watchdog, if the last real TX is already + * some time on the past (slightly less than 5secs) + */ + bcm->net_dev->trans_start = jiffies; + netif_tx_disable(bcm->net_dev); + + spin_lock_irqsave(&bcm->irq_lock, flags); + if (badness > BADNESS_LIMIT) { + /* Periodic work will take a long time, so we want it to + * be preemtible. + */ + bcm43xx_mac_suspend(bcm); + if (bcm43xx_using_pio(bcm)) + bcm43xx_pio_freeze_txqueues(bcm); + savedirqs = bcm43xx_interrupt_disable(bcm, BCM43xx_IRQ_ALL); + spin_unlock_irqrestore(&bcm->irq_lock, flags); + bcm43xx_synchronize_irq(bcm); + } + + do_periodic_work(bcm); - bcm43xx_unlock_mmio(bcm, flags); + if (badness > BADNESS_LIMIT) { + spin_lock_irqsave(&bcm->irq_lock, flags); + tasklet_enable(&bcm->isr_tasklet); + bcm43xx_interrupt_enable(bcm, savedirqs); + if (bcm43xx_using_pio(bcm)) + bcm43xx_pio_thaw_txqueues(bcm); + bcm43xx_mac_enable(bcm); + } + mmiowb(); + spin_unlock_irqrestore(&bcm->irq_lock, flags); + netif_wake_queue(bcm->net_dev); + mutex_unlock(&bcm->mutex); } -static void bcm43xx_periodic_tasks_delete(struct bcm43xx_private *bcm) +void bcm43xx_periodic_tasks_delete(struct bcm43xx_private *bcm) { - del_timer_sync(&bcm->periodic_tasks); + cancel_rearming_delayed_work(&bcm->periodic_work); } -static void bcm43xx_periodic_tasks_setup(struct bcm43xx_private *bcm) +void bcm43xx_periodic_tasks_setup(struct bcm43xx_private *bcm) { - struct timer_list *timer = &(bcm->periodic_tasks); + struct work_struct *work = &(bcm->periodic_work); - assert(bcm->initialized); - setup_timer(timer, - bcm43xx_periodic_task_handler, - (unsigned long)bcm); - timer->expires = jiffies; - add_timer(timer); + assert(bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED); + INIT_WORK(work, bcm43xx_periodic_work_handler, bcm); + schedule_work(work); } static void bcm43xx_security_init(struct bcm43xx_private *bcm) @@ -3152,143 +3224,362 @@ static void bcm43xx_security_init(struct bcm43xx_private *bcm) bcm43xx_clear_keys(bcm); } -/* This is the opposite of bcm43xx_init_board() */ -static void bcm43xx_free_board(struct bcm43xx_private *bcm) +static int bcm43xx_rng_read(struct hwrng *rng, u32 *data) { - int i, err; + struct bcm43xx_private *bcm = (struct bcm43xx_private *)rng->priv; unsigned long flags; - bcm43xx_sysfs_unregister(bcm); + spin_lock_irqsave(&(bcm)->irq_lock, flags); + *data = bcm43xx_read16(bcm, BCM43xx_MMIO_RNG); + spin_unlock_irqrestore(&(bcm)->irq_lock, flags); - bcm43xx_periodic_tasks_delete(bcm); + return (sizeof(u16)); +} - bcm43xx_lock(bcm, flags); - bcm->initialized = 0; - bcm->shutting_down = 1; - bcm43xx_unlock(bcm, flags); +static void bcm43xx_rng_exit(struct bcm43xx_private *bcm) +{ + hwrng_unregister(&bcm->rng); +} - for (i = 0; i < BCM43xx_MAX_80211_CORES; i++) { - if (!bcm->core_80211[i].available) +static int bcm43xx_rng_init(struct bcm43xx_private *bcm) +{ + int err; + + snprintf(bcm->rng_name, ARRAY_SIZE(bcm->rng_name), + "%s_%s", KBUILD_MODNAME, bcm->net_dev->name); + bcm->rng.name = bcm->rng_name; + bcm->rng.data_read = bcm43xx_rng_read; + bcm->rng.priv = (unsigned long)bcm; + err = hwrng_register(&bcm->rng); + if (err) + printk(KERN_ERR PFX "RNG init failed (%d)\n", err); + + return err; +} + +static int bcm43xx_shutdown_all_wireless_cores(struct bcm43xx_private *bcm) +{ + int ret = 0; + int i, err; + struct bcm43xx_coreinfo *core; + + bcm43xx_set_status(bcm, BCM43xx_STAT_SHUTTINGDOWN); + for (i = 0; i < bcm->nr_80211_available; i++) { + core = &(bcm->core_80211[i]); + assert(core->available); + if (!core->initialized) continue; - if (!bcm->core_80211[i].initialized) + err = bcm43xx_switch_core(bcm, core); + if (err) { + dprintk(KERN_ERR PFX "shutdown_all_wireless_cores " + "switch_core failed (%d)\n", err); + ret = err; continue; - - err = bcm43xx_switch_core(bcm, &bcm->core_80211[i]); - assert(err == 0); + } + bcm43xx_interrupt_disable(bcm, BCM43xx_IRQ_ALL); + bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); /* dummy read */ bcm43xx_wireless_core_cleanup(bcm); + if (core == bcm->active_80211_core) + bcm->active_80211_core = NULL; } + free_irq(bcm->irq, bcm); + bcm43xx_set_status(bcm, BCM43xx_STAT_UNINIT); + + return ret; +} + +/* This is the opposite of bcm43xx_init_board() */ +static void bcm43xx_free_board(struct bcm43xx_private *bcm) +{ + bcm43xx_rng_exit(bcm); + bcm43xx_sysfs_unregister(bcm); + bcm43xx_periodic_tasks_delete(bcm); + mutex_lock(&(bcm)->mutex); + bcm43xx_shutdown_all_wireless_cores(bcm); bcm43xx_pctl_set_crystal(bcm, 0); + mutex_unlock(&(bcm)->mutex); +} + +static void prepare_phydata_for_init(struct bcm43xx_phyinfo *phy) +{ + phy->antenna_diversity = 0xFFFF; + memset(phy->minlowsig, 0xFF, sizeof(phy->minlowsig)); + memset(phy->minlowsigpos, 0, sizeof(phy->minlowsigpos)); - bcm43xx_lock(bcm, flags); - bcm->shutting_down = 0; - bcm43xx_unlock(bcm, flags); + /* Flags */ + phy->calibrated = 0; + phy->is_locked = 0; + + if (phy->_lo_pairs) { + memset(phy->_lo_pairs, 0, + sizeof(struct bcm43xx_lopair) * BCM43xx_LO_COUNT); + } + memset(phy->loopback_gain, 0, sizeof(phy->loopback_gain)); } -static int bcm43xx_init_board(struct bcm43xx_private *bcm) +static void prepare_radiodata_for_init(struct bcm43xx_private *bcm, + struct bcm43xx_radioinfo *radio) { - int i, err; - int connect_phy; - unsigned long flags; + int i; - might_sleep(); + /* Set default attenuation values. */ + radio->baseband_atten = bcm43xx_default_baseband_attenuation(bcm); + radio->radio_atten = bcm43xx_default_radio_attenuation(bcm); + radio->txctl1 = bcm43xx_default_txctl1(bcm); + radio->txctl2 = 0xFFFF; + radio->txpwr_offset = 0; - bcm43xx_lock(bcm, flags); - bcm->initialized = 0; - bcm->shutting_down = 0; - bcm43xx_unlock(bcm, flags); + /* NRSSI */ + radio->nrssislope = 0; + for (i = 0; i < ARRAY_SIZE(radio->nrssi); i++) + radio->nrssi[i] = -1000; + for (i = 0; i < ARRAY_SIZE(radio->nrssi_lt); i++) + radio->nrssi_lt[i] = i; - err = bcm43xx_pctl_set_crystal(bcm, 1); + radio->lofcal = 0xFFFF; + radio->initval = 0xFFFF; + + radio->aci_enable = 0; + radio->aci_wlan_automatic = 0; + radio->aci_hw_rssi = 0; +} + +static void prepare_priv_for_init(struct bcm43xx_private *bcm) +{ + int i; + struct bcm43xx_coreinfo *core; + struct bcm43xx_coreinfo_80211 *wlext; + + assert(!bcm->active_80211_core); + + bcm43xx_set_status(bcm, BCM43xx_STAT_INITIALIZING); + + /* Flags */ + bcm->was_initialized = 0; + bcm->reg124_set_0x4 = 0; + + /* Stats */ + memset(&bcm->stats, 0, sizeof(bcm->stats)); + + /* Wireless core data */ + for (i = 0; i < BCM43xx_MAX_80211_CORES; i++) { + core = &(bcm->core_80211[i]); + wlext = core->priv; + + if (!core->available) + continue; + assert(wlext == &(bcm->core_80211_ext[i])); + + prepare_phydata_for_init(&wlext->phy); + prepare_radiodata_for_init(bcm, &wlext->radio); + } + + /* IRQ related flags */ + bcm->irq_reason = 0; + memset(bcm->dma_reason, 0, sizeof(bcm->dma_reason)); + bcm->irq_savedstate = BCM43xx_IRQ_INITIAL; + + bcm->mac_suspended = 1; + + /* Noise calculation context */ + memset(&bcm->noisecalc, 0, sizeof(bcm->noisecalc)); + + /* Periodic work context */ + bcm->periodic_state = 0; +} + +static int wireless_core_up(struct bcm43xx_private *bcm, + int active_wlcore) +{ + int err; + + if (!bcm43xx_core_enabled(bcm)) + bcm43xx_wireless_core_reset(bcm, 1); + if (!active_wlcore) + bcm43xx_wireless_core_mark_inactive(bcm); + err = bcm43xx_wireless_core_init(bcm, active_wlcore); if (err) goto out; - err = bcm43xx_pctl_init(bcm); - if (err) - goto err_crystal_off; - err = bcm43xx_pctl_set_clock(bcm, BCM43xx_PCTL_CLK_FAST); - if (err) - goto err_crystal_off; + if (!active_wlcore) + bcm43xx_radio_turn_off(bcm); +out: + return err; +} - tasklet_enable(&bcm->isr_tasklet); +/* Select and enable the "to be used" wireless core. + * Locking: bcm->mutex must be aquired before calling this. + * bcm->irq_lock must not be aquired. + */ +int bcm43xx_select_wireless_core(struct bcm43xx_private *bcm, + int phytype) +{ + int i, err; + struct bcm43xx_coreinfo *active_core = NULL; + struct bcm43xx_coreinfo_80211 *active_wlext = NULL; + struct bcm43xx_coreinfo *core; + struct bcm43xx_coreinfo_80211 *wlext; + int adjust_active_sbtmstatelow = 0; + + might_sleep(); + + if (phytype < 0) { + /* If no phytype is requested, select the first core. */ + assert(bcm->core_80211[0].available); + wlext = bcm->core_80211[0].priv; + phytype = wlext->phy.type; + } + /* Find the requested core. */ for (i = 0; i < bcm->nr_80211_available; i++) { - err = bcm43xx_switch_core(bcm, &bcm->core_80211[i]); - assert(err != -ENODEV); - if (err) - goto err_80211_unwind; + core = &(bcm->core_80211[i]); + wlext = core->priv; + if (wlext->phy.type == phytype) { + active_core = core; + active_wlext = wlext; + break; + } + } + if (!active_core) + return -ESRCH; /* No such PHYTYPE on this board. */ - /* Enable the selected wireless core. - * Connect PHY only on the first core. + if (bcm->active_80211_core) { + /* We already selected a wl core in the past. + * So first clean up everything. */ - if (!bcm43xx_core_enabled(bcm)) { - if (bcm->nr_80211_available == 1) { - connect_phy = bcm43xx_current_phy(bcm)->connected; - } else { - if (i == 0) - connect_phy = 1; - else - connect_phy = 0; - } - bcm43xx_wireless_core_reset(bcm, connect_phy); - } + dprintk(KERN_INFO PFX "select_wireless_core: cleanup\n"); + ieee80211softmac_stop(bcm->net_dev); + bcm43xx_set_status(bcm, BCM43xx_STAT_INITIALIZED); + err = bcm43xx_disable_interrupts_sync(bcm); + assert(!err); + tasklet_enable(&bcm->isr_tasklet); + err = bcm43xx_shutdown_all_wireless_cores(bcm); + if (err) + goto error; + /* Ok, everything down, continue to re-initialize. */ + bcm43xx_set_status(bcm, BCM43xx_STAT_INITIALIZING); + } - if (i != 0) - bcm43xx_wireless_core_mark_inactive(bcm, &bcm->core_80211[0]); + /* Reset all data structures. */ + prepare_priv_for_init(bcm); - err = bcm43xx_wireless_core_init(bcm); - if (err) - goto err_80211_unwind; + err = bcm43xx_pctl_set_clock(bcm, BCM43xx_PCTL_CLK_FAST); + if (err) + goto error; - if (i != 0) { - bcm43xx_mac_suspend(bcm); - bcm43xx_interrupt_disable(bcm, BCM43xx_IRQ_ALL); - bcm43xx_radio_turn_off(bcm); + /* Mark all unused cores "inactive". */ + for (i = 0; i < bcm->nr_80211_available; i++) { + core = &(bcm->core_80211[i]); + wlext = core->priv; + + if (core == active_core) + continue; + err = bcm43xx_switch_core(bcm, core); + if (err) { + dprintk(KERN_ERR PFX "Could not switch to inactive " + "802.11 core (%d)\n", err); + goto error; + } + err = wireless_core_up(bcm, 0); + if (err) { + dprintk(KERN_ERR PFX "core_up for inactive 802.11 core " + "failed (%d)\n", err); + goto error; } + adjust_active_sbtmstatelow = 1; } - bcm->active_80211_core = &bcm->core_80211[0]; - if (bcm->nr_80211_available >= 2) { - bcm43xx_switch_core(bcm, &bcm->core_80211[0]); - bcm43xx_mac_enable(bcm); + + /* Now initialize the active 802.11 core. */ + err = bcm43xx_switch_core(bcm, active_core); + if (err) { + dprintk(KERN_ERR PFX "Could not switch to active " + "802.11 core (%d)\n", err); + goto error; + } + if (adjust_active_sbtmstatelow && + active_wlext->phy.type == BCM43xx_PHYTYPE_G) { + u32 sbtmstatelow; + + sbtmstatelow = bcm43xx_read32(bcm, BCM43xx_CIR_SBTMSTATELOW); + sbtmstatelow |= 0x20000000; + bcm43xx_write32(bcm, BCM43xx_CIR_SBTMSTATELOW, sbtmstatelow); + } + err = wireless_core_up(bcm, 1); + if (err) { + dprintk(KERN_ERR PFX "core_up for active 802.11 core " + "failed (%d)\n", err); + goto error; } + err = bcm43xx_pctl_set_clock(bcm, BCM43xx_PCTL_CLK_DYNAMIC); + if (err) + goto error; + bcm->active_80211_core = active_core; + bcm43xx_macfilter_clear(bcm, BCM43xx_MACFILTER_ASSOC); bcm43xx_macfilter_set(bcm, BCM43xx_MACFILTER_SELF, (u8 *)(bcm->net_dev->dev_addr)); - dprintk(KERN_INFO PFX "80211 cores initialized\n"); bcm43xx_security_init(bcm); - bcm43xx_softmac_init(bcm); + ieee80211softmac_start(bcm->net_dev); - bcm43xx_pctl_set_clock(bcm, BCM43xx_PCTL_CLK_DYNAMIC); + /* Let's go! Be careful after enabling the IRQs. + * Don't switch cores, for example. + */ + bcm43xx_mac_enable(bcm); + bcm43xx_set_status(bcm, BCM43xx_STAT_INITIALIZED); + err = bcm43xx_initialize_irq(bcm); + if (err) + goto error; + bcm43xx_interrupt_enable(bcm, bcm->irq_savedstate); - if (bcm43xx_current_radio(bcm)->initial_channel != 0xFF) { - bcm43xx_mac_suspend(bcm); - bcm43xx_radio_selectchannel(bcm, bcm43xx_current_radio(bcm)->initial_channel, 0); - bcm43xx_mac_enable(bcm); - } + dprintk(KERN_INFO PFX "Selected 802.11 core (phytype %d)\n", + active_wlext->phy.type); + + return 0; + +error: + bcm43xx_set_status(bcm, BCM43xx_STAT_UNINIT); + bcm43xx_pctl_set_clock(bcm, BCM43xx_PCTL_CLK_SLOW); + return err; +} + +static int bcm43xx_init_board(struct bcm43xx_private *bcm) +{ + int err; - /* Initialization of the board is done. Flag it as such. */ - bcm43xx_lock(bcm, flags); - bcm->initialized = 1; - bcm43xx_unlock(bcm, flags); + mutex_lock(&(bcm)->mutex); + tasklet_enable(&bcm->isr_tasklet); + err = bcm43xx_pctl_set_crystal(bcm, 1); + if (err) + goto err_tasklet; + err = bcm43xx_pctl_init(bcm); + if (err) + goto err_crystal_off; + err = bcm43xx_select_wireless_core(bcm, -1); + if (err) + goto err_crystal_off; + err = bcm43xx_sysfs_register(bcm); + if (err) + goto err_wlshutdown; + err = bcm43xx_rng_init(bcm); + if (err) + goto err_sysfs_unreg; bcm43xx_periodic_tasks_setup(bcm); - bcm43xx_sysfs_register(bcm); - //FIXME: check for bcm43xx_sysfs_register failure. This function is a bit messy regarding unwinding, though... /*FIXME: This should be handled by softmac instead. */ schedule_work(&bcm->softmac->associnfo.work); - assert(err == 0); out: + mutex_unlock(&(bcm)->mutex); + return err; -err_80211_unwind: - tasklet_disable(&bcm->isr_tasklet); - /* unwind all 80211 initialization */ - for (i = 0; i < bcm->nr_80211_available; i++) { - if (!bcm->core_80211[i].initialized) - continue; - bcm43xx_interrupt_disable(bcm, BCM43xx_IRQ_ALL); - bcm43xx_wireless_core_cleanup(bcm); - } +err_sysfs_unreg: + bcm43xx_sysfs_unregister(bcm); +err_wlshutdown: + bcm43xx_shutdown_all_wireless_cores(bcm); err_crystal_off: bcm43xx_pctl_set_crystal(bcm, 0); +err_tasklet: + tasklet_disable(&bcm->isr_tasklet); goto out; } @@ -3299,8 +3590,7 @@ static void bcm43xx_detach_board(struct bcm43xx_private *bcm) bcm43xx_chipset_detach(bcm); /* Do _not_ access the chip, after it is detached. */ - iounmap(bcm->mmio_addr); - + pci_iounmap(pci_dev, bcm->mmio_addr); pci_release_regions(pci_dev); pci_disable_device(pci_dev); @@ -3390,40 +3680,26 @@ static int bcm43xx_attach_board(struct bcm43xx_private *bcm) struct net_device *net_dev = bcm->net_dev; int err; int i; - unsigned long mmio_start, mmio_flags, mmio_len; u32 coremask; err = pci_enable_device(pci_dev); if (err) { - printk(KERN_ERR PFX "unable to wake up pci device (%i)\n", err); + printk(KERN_ERR PFX "pci_enable_device() failed\n"); goto out; } - mmio_start = pci_resource_start(pci_dev, 0); - mmio_flags = pci_resource_flags(pci_dev, 0); - mmio_len = pci_resource_len(pci_dev, 0); - if (!(mmio_flags & IORESOURCE_MEM)) { - printk(KERN_ERR PFX - "%s, region #0 not an MMIO resource, aborting\n", - pci_name(pci_dev)); - err = -ENODEV; - goto err_pci_disable; - } err = pci_request_regions(pci_dev, KBUILD_MODNAME); if (err) { - printk(KERN_ERR PFX - "could not access PCI resources (%i)\n", err); + printk(KERN_ERR PFX "pci_request_regions() failed\n"); goto err_pci_disable; } /* enable PCI bus-mastering */ pci_set_master(pci_dev); - bcm->mmio_addr = ioremap(mmio_start, mmio_len); + bcm->mmio_addr = pci_iomap(pci_dev, 0, ~0UL); if (!bcm->mmio_addr) { - printk(KERN_ERR PFX "%s: cannot remap MMIO, aborting\n", - pci_name(pci_dev)); + printk(KERN_ERR PFX "pci_iomap() failed\n"); err = -EIO; goto err_pci_release; } - bcm->mmio_len = mmio_len; net_dev->base_addr = (unsigned long)bcm->mmio_addr; bcm43xx_pci_read_config16(bcm, PCI_SUBSYSTEM_VENDOR_ID, @@ -3517,7 +3793,7 @@ err_80211_unwind: err_chipset_detach: bcm43xx_chipset_detach(bcm); err_iounmap: - iounmap(bcm->mmio_addr); + pci_iounmap(pci_dev, bcm->mmio_addr); err_pci_release: pci_release_regions(pci_dev); err_pci_disable: @@ -3547,8 +3823,9 @@ static void bcm43xx_ieee80211_set_chan(struct net_device *net_dev, struct bcm43xx_radioinfo *radio; unsigned long flags; - bcm43xx_lock_mmio(bcm, flags); - if (bcm->initialized) { + mutex_lock(&bcm->mutex); + spin_lock_irqsave(&bcm->irq_lock, flags); + if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED) { bcm43xx_mac_suspend(bcm); bcm43xx_radio_selectchannel(bcm, channel, 0); bcm43xx_mac_enable(bcm); @@ -3556,7 +3833,8 @@ static void bcm43xx_ieee80211_set_chan(struct net_device *net_dev, radio = bcm43xx_current_radio(bcm); radio->initial_channel = channel; } - bcm43xx_unlock_mmio(bcm, flags); + spin_unlock_irqrestore(&bcm->irq_lock, flags); + mutex_unlock(&bcm->mutex); } /* set_security() callback in struct ieee80211_device */ @@ -3568,9 +3846,10 @@ static void bcm43xx_ieee80211_set_security(struct net_device *net_dev, unsigned long flags; int keyidx; - dprintk(KERN_INFO PFX "set security called\n"); + dprintk(KERN_INFO PFX "set security called"); - bcm43xx_lock_mmio(bcm, flags); + mutex_lock(&bcm->mutex); + spin_lock_irqsave(&bcm->irq_lock, flags); for (keyidx = 0; keyidxflags & (1<flags & SEC_ACTIVE_KEY) { secinfo->active_key = sec->active_key; - dprintk(KERN_INFO PFX " .active_key = %d\n", sec->active_key); + dprintk(", .active_key = %d", sec->active_key); } if (sec->flags & SEC_UNICAST_GROUP) { secinfo->unicast_uses_group = sec->unicast_uses_group; - dprintk(KERN_INFO PFX " .unicast_uses_group = %d\n", sec->unicast_uses_group); + dprintk(", .unicast_uses_group = %d", sec->unicast_uses_group); } if (sec->flags & SEC_LEVEL) { secinfo->level = sec->level; - dprintk(KERN_INFO PFX " .level = %d\n", sec->level); + dprintk(", .level = %d", sec->level); } if (sec->flags & SEC_ENABLED) { secinfo->enabled = sec->enabled; - dprintk(KERN_INFO PFX " .enabled = %d\n", sec->enabled); + dprintk(", .enabled = %d", sec->enabled); } if (sec->flags & SEC_ENCRYPT) { secinfo->encrypt = sec->encrypt; - dprintk(KERN_INFO PFX " .encrypt = %d\n", sec->encrypt); + dprintk(", .encrypt = %d", sec->encrypt); + } + if (sec->flags & SEC_AUTH_MODE) { + secinfo->auth_mode = sec->auth_mode; + dprintk(", .auth_mode = %d", sec->auth_mode); } - if (bcm->initialized && !bcm->ieee->host_encrypt) { + dprintk("\n"); + if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED && + !bcm->ieee->host_encrypt) { if (secinfo->enabled) { /* upload WEP keys to hardware */ char null_address[6] = { 0 }; @@ -3633,7 +3918,8 @@ static void bcm43xx_ieee80211_set_security(struct net_device *net_dev, } else bcm43xx_clear_keys(bcm); } - bcm43xx_unlock_mmio(bcm, flags); + spin_unlock_irqrestore(&bcm->irq_lock, flags); + mutex_unlock(&bcm->mutex); } /* hard_start_xmit() callback in struct ieee80211_device */ @@ -3645,12 +3931,14 @@ static int bcm43xx_ieee80211_hard_start_xmit(struct ieee80211_txb *txb, int err = -ENODEV; unsigned long flags; - bcm43xx_lock_mmio(bcm, flags); - if (likely(bcm->initialized)) + spin_lock_irqsave(&bcm->irq_lock, flags); + if (likely(bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED)) err = bcm43xx_tx(bcm, txb); - bcm43xx_unlock_mmio(bcm, flags); + spin_unlock_irqrestore(&bcm->irq_lock, flags); - return err; + if (unlikely(err)) + return NETDEV_TX_BUSY; + return NETDEV_TX_OK; } static struct net_device_stats * bcm43xx_net_get_stats(struct net_device *net_dev) @@ -3663,9 +3951,9 @@ static void bcm43xx_net_tx_timeout(struct net_device *net_dev) struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); unsigned long flags; - bcm43xx_lock_mmio(bcm, flags); + spin_lock_irqsave(&bcm->irq_lock, flags); bcm43xx_controller_restart(bcm, "TX timeout"); - bcm43xx_unlock_mmio(bcm, flags); + spin_unlock_irqrestore(&bcm->irq_lock, flags); } #ifdef CONFIG_NET_POLL_CONTROLLER @@ -3675,7 +3963,8 @@ static void bcm43xx_net_poll_controller(struct net_device *net_dev) unsigned long flags; local_irq_save(flags); - bcm43xx_interrupt_handler(bcm->irq, bcm, NULL); + if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED) + bcm43xx_interrupt_handler(bcm->irq, bcm, NULL); local_irq_restore(flags); } #endif /* CONFIG_NET_POLL_CONTROLLER */ @@ -3690,10 +3979,13 @@ static int bcm43xx_net_open(struct net_device *net_dev) static int bcm43xx_net_stop(struct net_device *net_dev) { struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); + int err; ieee80211softmac_stop(net_dev); - bcm43xx_disable_interrupts_sync(bcm, NULL); + err = bcm43xx_disable_interrupts_sync(bcm); + assert(!err); bcm43xx_free_board(bcm); + flush_scheduled_work(); return 0; } @@ -3704,15 +3996,19 @@ static int bcm43xx_init_private(struct bcm43xx_private *bcm, { int err; + bcm43xx_set_status(bcm, BCM43xx_STAT_UNINIT); bcm->ieee = netdev_priv(net_dev); bcm->softmac = ieee80211_priv(net_dev); bcm->softmac->set_channel = bcm43xx_ieee80211_set_chan; bcm->irq_savedstate = BCM43xx_IRQ_INITIAL; + bcm->mac_suspended = 1; bcm->pci_dev = pci_dev; bcm->net_dev = net_dev; bcm->bad_frames_preempt = modparam_bad_frames_preempt; - spin_lock_init(&bcm->_lock); + spin_lock_init(&bcm->irq_lock); + spin_lock_init(&bcm->leds_lock); + mutex_init(&bcm->mutex); tasklet_init(&bcm->isr_tasklet, (void (*)(unsigned long))bcm43xx_interrupt_tasklet, (unsigned long)bcm); @@ -3830,7 +4126,6 @@ static void __devexit bcm43xx_remove_one(struct pci_dev *pdev) bcm43xx_debugfs_remove_device(bcm); unregister_netdev(net_dev); bcm43xx_detach_board(bcm); - assert(bcm->ucode == NULL); free_ieee80211softmac(net_dev); } @@ -3840,46 +4135,31 @@ static void __devexit bcm43xx_remove_one(struct pci_dev *pdev) static void bcm43xx_chip_reset(void *_bcm) { struct bcm43xx_private *bcm = _bcm; - struct net_device *net_dev = bcm->net_dev; - struct pci_dev *pci_dev = bcm->pci_dev; - int err; - int was_initialized = bcm->initialized; - - netif_stop_queue(bcm->net_dev); - tasklet_disable(&bcm->isr_tasklet); + struct bcm43xx_phyinfo *phy; + int err = -ENODEV; - bcm->firmware_norelease = 1; - if (was_initialized) - bcm43xx_free_board(bcm); - bcm->firmware_norelease = 0; - bcm43xx_detach_board(bcm); - err = bcm43xx_init_private(bcm, net_dev, pci_dev); - if (err) - goto failure; - err = bcm43xx_attach_board(bcm); - if (err) - goto failure; - if (was_initialized) { - err = bcm43xx_init_board(bcm); - if (err) - goto failure; + mutex_lock(&(bcm)->mutex); + if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED) { + bcm43xx_periodic_tasks_delete(bcm); + phy = bcm43xx_current_phy(bcm); + err = bcm43xx_select_wireless_core(bcm, phy->type); + if (!err) + bcm43xx_periodic_tasks_setup(bcm); } - netif_wake_queue(bcm->net_dev); - printk(KERN_INFO PFX "Controller restarted\n"); + mutex_unlock(&(bcm)->mutex); - return; -failure: - printk(KERN_ERR PFX "Controller restart failed\n"); + printk(KERN_ERR PFX "Controller restart%s\n", + (err == 0) ? "ed" : " failed"); } /* Hard-reset the chip. * This can be called from interrupt or process context. - * Make sure to _not_ re-enable device interrupts after this has been called. -*/ + * bcm->irq_lock must be locked. + */ void bcm43xx_controller_restart(struct bcm43xx_private *bcm, const char *reason) { - bcm43xx_interrupt_disable(bcm, BCM43xx_IRQ_ALL); - bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD); /* dummy read */ + if (bcm43xx_status(bcm) != BCM43xx_STAT_INITIALIZED) + return; printk(KERN_ERR PFX "Controller RESET (%s) ...\n", reason); INIT_WORK(&bcm->restart_work, bcm43xx_chip_reset, bcm); schedule_work(&bcm->restart_work); @@ -3891,21 +4171,16 @@ static int bcm43xx_suspend(struct pci_dev *pdev, pm_message_t state) { struct net_device *net_dev = pci_get_drvdata(pdev); struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); - unsigned long flags; - int try_to_shutdown = 0, err; + int err; dprintk(KERN_INFO PFX "Suspending...\n"); - bcm43xx_lock(bcm, flags); - bcm->was_initialized = bcm->initialized; - if (bcm->initialized) - try_to_shutdown = 1; - bcm43xx_unlock(bcm, flags); - netif_device_detach(net_dev); - if (try_to_shutdown) { + bcm->was_initialized = 0; + if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED) { + bcm->was_initialized = 1; ieee80211softmac_stop(net_dev); - err = bcm43xx_disable_interrupts_sync(bcm, &bcm->irq_savedstate); + err = bcm43xx_disable_interrupts_sync(bcm); if (unlikely(err)) { dprintk(KERN_ERR PFX "Suspend failed.\n"); return -EAGAIN; @@ -3938,17 +4213,14 @@ static int bcm43xx_resume(struct pci_dev *pdev) pci_restore_state(pdev); bcm43xx_chipset_attach(bcm); - if (bcm->was_initialized) { - bcm->irq_savedstate = BCM43xx_IRQ_INITIAL; + if (bcm->was_initialized) err = bcm43xx_init_board(bcm); - } if (err) { printk(KERN_ERR PFX "Resume failed!\n"); return err; } - netif_device_attach(net_dev); - + dprintk(KERN_INFO PFX "Device resumed.\n"); return 0; diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_main.h b/drivers/net/wireless/bcm43xx/bcm43xx_main.h index 30a202b25..f76357178 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_main.h +++ b/drivers/net/wireless/bcm43xx/bcm43xx_main.h @@ -112,30 +112,6 @@ int bcm43xx_channel_to_freq(struct bcm43xx_private *bcm, return bcm43xx_channel_to_freq_bg(channel); } -/* Lightweight function to check if a channel number is valid. - * Note that this does _NOT_ check for geographical restrictions! - */ -static inline -int bcm43xx_is_valid_channel_a(u8 channel) -{ - return (channel >= IEEE80211_52GHZ_MIN_CHANNEL - && channel <= IEEE80211_52GHZ_MAX_CHANNEL); -} -static inline -int bcm43xx_is_valid_channel_bg(u8 channel) -{ - return (channel >= IEEE80211_24GHZ_MIN_CHANNEL - && channel <= IEEE80211_24GHZ_MAX_CHANNEL); -} -static inline -int bcm43xx_is_valid_channel(struct bcm43xx_private *bcm, - u8 channel) -{ - if (bcm43xx_current_phy(bcm)->type == BCM43xx_PHYTYPE_A) - return bcm43xx_is_valid_channel_a(channel); - return bcm43xx_is_valid_channel_bg(channel); -} - void bcm43xx_tsf_read(struct bcm43xx_private *bcm, u64 *tsf); void bcm43xx_tsf_write(struct bcm43xx_private *bcm, u64 tsf); @@ -157,11 +133,17 @@ void bcm43xx_dummy_transmission(struct bcm43xx_private *bcm); int bcm43xx_switch_core(struct bcm43xx_private *bcm, struct bcm43xx_coreinfo *new_core); +int bcm43xx_select_wireless_core(struct bcm43xx_private *bcm, + int phytype); + void bcm43xx_wireless_core_reset(struct bcm43xx_private *bcm, int connect_phy); void bcm43xx_mac_suspend(struct bcm43xx_private *bcm); void bcm43xx_mac_enable(struct bcm43xx_private *bcm); +void bcm43xx_periodic_tasks_delete(struct bcm43xx_private *bcm); +void bcm43xx_periodic_tasks_setup(struct bcm43xx_private *bcm); + void bcm43xx_controller_restart(struct bcm43xx_private *bcm, const char *reason); int bcm43xx_sprom_read(struct bcm43xx_private *bcm, u16 *sprom); diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_phy.c b/drivers/net/wireless/bcm43xx/bcm43xx_phy.c index b0abac515..52ce2a933 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_phy.c +++ b/drivers/net/wireless/bcm43xx/bcm43xx_phy.c @@ -81,6 +81,16 @@ static const s8 bcm43xx_tssi2dbm_g_table[] = { static void bcm43xx_phy_initg(struct bcm43xx_private *bcm); +static inline +void bcm43xx_voluntary_preempt(void) +{ + assert(!in_atomic() && !in_irq() && + !in_interrupt() && !irqs_disabled()); +#ifndef CONFIG_PREEMPT + cond_resched(); +#endif /* CONFIG_PREEMPT */ +} + void bcm43xx_raw_phy_lock(struct bcm43xx_private *bcm) { struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm); @@ -133,22 +143,14 @@ void bcm43xx_phy_write(struct bcm43xx_private *bcm, u16 offset, u16 val) void bcm43xx_phy_calibrate(struct bcm43xx_private *bcm) { struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm); - unsigned long flags; bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD); /* Dummy read. */ if (phy->calibrated) return; if (phy->type == BCM43xx_PHYTYPE_G && phy->rev == 1) { - /* We do not want to be preempted while calibrating - * the hardware. - */ - local_irq_save(flags); - bcm43xx_wireless_core_reset(bcm, 0); bcm43xx_phy_initg(bcm); bcm43xx_wireless_core_reset(bcm, 1); - - local_irq_restore(flags); } phy->calibrated = 1; } @@ -359,7 +361,7 @@ static void bcm43xx_phy_setupg(struct bcm43xx_private *bcm) if (phy->rev <= 2) for (i = 0; i < BCM43xx_ILT_NOISESCALEG_SIZE; i++) bcm43xx_ilt_write(bcm, 0x1400 + i, bcm43xx_ilt_noisescaleg1[i]); - else if ((phy->rev == 7) && (bcm43xx_phy_read(bcm, 0x0449) & 0x0200)) + else if ((phy->rev >= 7) && (bcm43xx_phy_read(bcm, 0x0449) & 0x0200)) for (i = 0; i < BCM43xx_ILT_NOISESCALEG_SIZE; i++) bcm43xx_ilt_write(bcm, 0x1400 + i, bcm43xx_ilt_noisescaleg3[i]); else @@ -369,7 +371,7 @@ static void bcm43xx_phy_setupg(struct bcm43xx_private *bcm) if (phy->rev == 2) for (i = 0; i < BCM43xx_ILT_SIGMASQR_SIZE; i++) bcm43xx_ilt_write(bcm, 0x5000 + i, bcm43xx_ilt_sigmasqr1[i]); - else if ((phy->rev > 2) && (phy->rev <= 7)) + else if ((phy->rev > 2) && (phy->rev <= 8)) for (i = 0; i < BCM43xx_ILT_SIGMASQR_SIZE; i++) bcm43xx_ilt_write(bcm, 0x5000 + i, bcm43xx_ilt_sigmasqr2[i]); @@ -1195,7 +1197,7 @@ static void bcm43xx_phy_initg(struct bcm43xx_private *bcm) if (phy->rev == 1) bcm43xx_phy_initb5(bcm); - else if (phy->rev >= 2 && phy->rev <= 7) + else bcm43xx_phy_initb6(bcm); if (phy->rev >= 2 || phy->connected) bcm43xx_phy_inita(bcm); @@ -1239,23 +1241,22 @@ static void bcm43xx_phy_initg(struct bcm43xx_private *bcm) bcm43xx_phy_lo_g_measure(bcm); } else { if (radio->version == 0x2050 && radio->revision == 8) { - //FIXME + bcm43xx_radio_write16(bcm, 0x0052, + (radio->txctl1 << 4) | radio->txctl2); } else { bcm43xx_radio_write16(bcm, 0x0052, (bcm43xx_radio_read16(bcm, 0x0052) & 0xFFF0) | radio->txctl1); } if (phy->rev >= 6) { - /* bcm43xx_phy_write(bcm, 0x0036, (bcm43xx_phy_read(bcm, 0x0036) - & 0xF000) | (FIXME << 12)); - */ + & 0xF000) | (radio->txctl2 << 12)); } if (bcm->sprom.boardflags & BCM43xx_BFL_PACTRL) bcm43xx_phy_write(bcm, 0x002E, 0x8075); else - bcm43xx_phy_write(bcm, 0x003E, 0x807F); + bcm43xx_phy_write(bcm, 0x002E, 0x807F); if (phy->rev < 2) bcm43xx_phy_write(bcm, 0x002F, 0x0101); else @@ -1299,7 +1300,9 @@ static u16 bcm43xx_phy_lo_b_r15_loop(struct bcm43xx_private *bcm) { int i; u16 ret = 0; + unsigned long flags; + local_irq_save(flags); for (i = 0; i < 10; i++){ bcm43xx_phy_write(bcm, 0x0015, 0xAFA0); udelay(1); @@ -1309,6 +1312,8 @@ static u16 bcm43xx_phy_lo_b_r15_loop(struct bcm43xx_private *bcm) udelay(40); ret += bcm43xx_phy_read(bcm, 0x002C); } + local_irq_restore(flags); + bcm43xx_voluntary_preempt(); return ret; } @@ -1410,7 +1415,10 @@ static inline u16 bcm43xx_phy_lo_g_deviation_subval(struct bcm43xx_private *bcm, u16 control) { struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm); + u16 ret; + unsigned long flags; + local_irq_save(flags); if (phy->connected) { bcm43xx_phy_write(bcm, 0x15, 0xE300); control <<= 8; @@ -1430,8 +1438,11 @@ u16 bcm43xx_phy_lo_g_deviation_subval(struct bcm43xx_private *bcm, u16 control) bcm43xx_phy_write(bcm, 0x0015, control | 0xFFE0); udelay(8); } + ret = bcm43xx_phy_read(bcm, 0x002D); + local_irq_restore(flags); + bcm43xx_voluntary_preempt(); - return bcm43xx_phy_read(bcm, 0x002D); + return ret; } static u32 bcm43xx_phy_lo_g_singledeviation(struct bcm43xx_private *bcm, u16 control) @@ -1648,7 +1659,7 @@ void bcm43xx_phy_set_baseband_attenuation(struct bcm43xx_private *bcm, void bcm43xx_phy_lo_g_measure(struct bcm43xx_private *bcm) { static const u8 pairorder[10] = { 3, 1, 5, 7, 9, 2, 0, 4, 6, 8 }; - const int is_initializing = bcm43xx_is_initializing(bcm); + const int is_initializing = (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZING); struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm); struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm); u16 h, i, oldi = 0, j; @@ -1755,6 +1766,7 @@ void bcm43xx_phy_lo_g_measure(struct bcm43xx_private *bcm) bcm43xx_radio_write16(bcm, 0x43, i); bcm43xx_radio_write16(bcm, 0x52, radio->txctl2); udelay(10); + bcm43xx_voluntary_preempt(); bcm43xx_phy_set_baseband_attenuation(bcm, j * 2); @@ -1798,6 +1810,7 @@ void bcm43xx_phy_lo_g_measure(struct bcm43xx_private *bcm) radio->txctl2 | (3/*txctl1*/ << 4));//FIXME: shouldn't txctl1 be zero here and 3 in the loop above? udelay(10); + bcm43xx_voluntary_preempt(); bcm43xx_phy_set_baseband_attenuation(bcm, j * 2); @@ -1819,6 +1832,7 @@ void bcm43xx_phy_lo_g_measure(struct bcm43xx_private *bcm) bcm43xx_phy_write(bcm, 0x0812, (r27 << 8) | 0xA2); udelay(2); bcm43xx_phy_write(bcm, 0x0812, (r27 << 8) | 0xA3); + bcm43xx_voluntary_preempt(); } else bcm43xx_phy_write(bcm, 0x0015, r27 | 0xEFA0); bcm43xx_phy_lo_adjust(bcm, is_initializing); @@ -2183,12 +2197,6 @@ int bcm43xx_phy_init(struct bcm43xx_private *bcm) { struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm); int err = -ENODEV; - unsigned long flags; - - /* We do not want to be preempted while calibrating - * the hardware. - */ - local_irq_save(flags); switch (phy->type) { case BCM43xx_PHYTYPE_A: @@ -2222,7 +2230,6 @@ int bcm43xx_phy_init(struct bcm43xx_private *bcm) err = 0; break; } - local_irq_restore(flags); if (err) printk(KERN_WARNING PFX "Unknown PHYTYPE found!\n"); diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_pio.c b/drivers/net/wireless/bcm43xx/bcm43xx_pio.c index 0aa1bd269..c60c1743e 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_pio.c +++ b/drivers/net/wireless/bcm43xx/bcm43xx_pio.c @@ -262,8 +262,10 @@ static void tx_tasklet(unsigned long d) int err; u16 txctl; - bcm43xx_lock_mmio(bcm, flags); + spin_lock_irqsave(&bcm->irq_lock, flags); + if (queue->tx_frozen) + goto out_unlock; txctl = bcm43xx_pio_read(queue, BCM43xx_PIO_TXCTL); if (txctl & BCM43xx_PIO_TXCTL_SUSPEND) goto out_unlock; @@ -298,7 +300,7 @@ static void tx_tasklet(unsigned long d) continue; } out_unlock: - bcm43xx_unlock_mmio(bcm, flags); + spin_unlock_irqrestore(&bcm->irq_lock, flags); } static void setup_txqueues(struct bcm43xx_pioqueue *queue) @@ -374,7 +376,6 @@ static void cancel_transfers(struct bcm43xx_pioqueue *queue) struct bcm43xx_pio_txpacket *packet, *tmp_packet; netif_tx_disable(queue->bcm->net_dev); - assert(queue->bcm->shutting_down); tasklet_disable(&queue->txtask); list_for_each_entry_safe(packet, tmp_packet, &queue->txrunning, list) @@ -634,5 +635,40 @@ void bcm43xx_pio_tx_resume(struct bcm43xx_pioqueue *queue) bcm43xx_pio_read(queue, BCM43xx_PIO_TXCTL) & ~BCM43xx_PIO_TXCTL_SUSPEND); bcm43xx_power_saving_ctl_bits(queue->bcm, -1, -1); - tasklet_schedule(&queue->txtask); + if (!list_empty(&queue->txqueue)) + tasklet_schedule(&queue->txtask); +} + +void bcm43xx_pio_freeze_txqueues(struct bcm43xx_private *bcm) +{ + struct bcm43xx_pio *pio; + + assert(bcm43xx_using_pio(bcm)); + pio = bcm43xx_current_pio(bcm); + pio->queue0->tx_frozen = 1; + pio->queue1->tx_frozen = 1; + pio->queue2->tx_frozen = 1; + pio->queue3->tx_frozen = 1; } + +void bcm43xx_pio_thaw_txqueues(struct bcm43xx_private *bcm) +{ + struct bcm43xx_pio *pio; + + assert(bcm43xx_using_pio(bcm)); + pio = bcm43xx_current_pio(bcm); + pio->queue0->tx_frozen = 0; + pio->queue1->tx_frozen = 0; + pio->queue2->tx_frozen = 0; + pio->queue3->tx_frozen = 0; + if (!list_empty(&pio->queue0->txqueue)) + tasklet_schedule(&pio->queue0->txtask); + if (!list_empty(&pio->queue1->txqueue)) + tasklet_schedule(&pio->queue1->txtask); + if (!list_empty(&pio->queue2->txqueue)) + tasklet_schedule(&pio->queue2->txtask); + if (!list_empty(&pio->queue3->txqueue)) + tasklet_schedule(&pio->queue3->txtask); +} + + diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_pio.h b/drivers/net/wireless/bcm43xx/bcm43xx_pio.h index dfc78209e..bc78a3c2c 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_pio.h +++ b/drivers/net/wireless/bcm43xx/bcm43xx_pio.h @@ -54,6 +54,7 @@ struct bcm43xx_pioqueue { u16 mmio_base; u8 tx_suspended:1, + tx_frozen:1, need_workarounds:1; /* Workarounds needed for core.rev < 3 */ /* Adjusted size of the device internal TX buffer. */ @@ -108,8 +109,12 @@ void bcm43xx_pio_handle_xmitstatus(struct bcm43xx_private *bcm, struct bcm43xx_xmitstatus *status); void bcm43xx_pio_rx(struct bcm43xx_pioqueue *queue); +/* Suspend a TX queue on hardware level. */ void bcm43xx_pio_tx_suspend(struct bcm43xx_pioqueue *queue); void bcm43xx_pio_tx_resume(struct bcm43xx_pioqueue *queue); +/* Suspend (freeze) the TX tasklet (software level). */ +void bcm43xx_pio_freeze_txqueues(struct bcm43xx_private *bcm); +void bcm43xx_pio_thaw_txqueues(struct bcm43xx_private *bcm); #else /* CONFIG_BCM43XX_PIO */ @@ -145,6 +150,14 @@ static inline void bcm43xx_pio_tx_resume(struct bcm43xx_pioqueue *queue) { } +static inline +void bcm43xx_pio_freeze_txqueues(struct bcm43xx_private *bcm) +{ +} +static inline +void bcm43xx_pio_thaw_txqueues(struct bcm43xx_private *bcm) +{ +} #endif /* CONFIG_BCM43XX_PIO */ #endif /* BCM43xx_PIO_H_ */ diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_radio.c b/drivers/net/wireless/bcm43xx/bcm43xx_radio.c index af5c0bff1..bb9c484d7 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_radio.c +++ b/drivers/net/wireless/bcm43xx/bcm43xx_radio.c @@ -1594,11 +1594,11 @@ int bcm43xx_radio_selectchannel(struct bcm43xx_private *bcm, u16 r8, tmp; u16 freq; + if (!ieee80211_is_valid_channel(bcm->ieee, channel)) + return -EINVAL; if ((radio->manufact == 0x17F) && (radio->version == 0x2060) && (radio->revision == 1)) { - if (channel > 200) - return -EINVAL; freq = channel2freq_a(channel); r8 = bcm43xx_radio_read16(bcm, 0x0008); @@ -1651,9 +1651,6 @@ int bcm43xx_radio_selectchannel(struct bcm43xx_private *bcm, TODO(); //TODO: TSSI2dbm workaround bcm43xx_phy_xmitpower(bcm);//FIXME correct? } else { - if ((channel < 1) || (channel > 14)) - return -EINVAL; - if (synthetic_pu_workaround) bcm43xx_synth_pu_workaround(bcm, channel); diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_sysfs.c b/drivers/net/wireless/bcm43xx/bcm43xx_sysfs.c index b438f48e8..f41d9e7d0 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_sysfs.c +++ b/drivers/net/wireless/bcm43xx/bcm43xx_sysfs.c @@ -120,12 +120,14 @@ static ssize_t bcm43xx_attr_sprom_show(struct device *dev, GFP_KERNEL); if (!sprom) return -ENOMEM; - bcm43xx_lock_mmio(bcm, flags); - assert(bcm->initialized); + mutex_lock(&bcm->mutex); + spin_lock_irqsave(&bcm->irq_lock, flags); err = bcm43xx_sprom_read(bcm, sprom); if (!err) err = sprom2hex(sprom, buf, PAGE_SIZE); - bcm43xx_unlock_mmio(bcm, flags); + mmiowb(); + spin_unlock_irqrestore(&bcm->irq_lock, flags); + mutex_unlock(&bcm->mutex); kfree(sprom); return err; @@ -150,10 +152,14 @@ static ssize_t bcm43xx_attr_sprom_store(struct device *dev, err = hex2sprom(sprom, buf, count); if (err) goto out_kfree; - bcm43xx_lock_mmio(bcm, flags); - assert(bcm->initialized); + mutex_lock(&bcm->mutex); + spin_lock_irqsave(&bcm->irq_lock, flags); + spin_lock(&bcm->leds_lock); err = bcm43xx_sprom_write(bcm, sprom); - bcm43xx_unlock_mmio(bcm, flags); + mmiowb(); + spin_unlock(&bcm->leds_lock); + spin_unlock_irqrestore(&bcm->irq_lock, flags); + mutex_unlock(&bcm->mutex); out_kfree: kfree(sprom); @@ -170,15 +176,12 @@ static ssize_t bcm43xx_attr_interfmode_show(struct device *dev, char *buf) { struct bcm43xx_private *bcm = dev_to_bcm(dev); - unsigned long flags; - int err; ssize_t count = 0; if (!capable(CAP_NET_ADMIN)) return -EPERM; - bcm43xx_lock(bcm, flags); - assert(bcm->initialized); + mutex_lock(&bcm->mutex); switch (bcm43xx_current_radio(bcm)->interfmode) { case BCM43xx_RADIO_INTERFMODE_NONE: @@ -193,11 +196,10 @@ static ssize_t bcm43xx_attr_interfmode_show(struct device *dev, default: assert(0); } - err = 0; - bcm43xx_unlock(bcm, flags); + mutex_unlock(&bcm->mutex); - return err ? err : count; + return count; } @@ -231,16 +233,17 @@ static ssize_t bcm43xx_attr_interfmode_store(struct device *dev, return -EINVAL; } - bcm43xx_lock_mmio(bcm, flags); - assert(bcm->initialized); + mutex_lock(&bcm->mutex); + spin_lock_irqsave(&bcm->irq_lock, flags); err = bcm43xx_radio_set_interference_mitigation(bcm, mode); if (err) { printk(KERN_ERR PFX "Interference Mitigation not " "supported by device\n"); } - - bcm43xx_unlock_mmio(bcm, flags); + mmiowb(); + spin_unlock_irqrestore(&bcm->irq_lock, flags); + mutex_unlock(&bcm->mutex); return err ? err : count; } @@ -254,25 +257,21 @@ static ssize_t bcm43xx_attr_preamble_show(struct device *dev, char *buf) { struct bcm43xx_private *bcm = dev_to_bcm(dev); - unsigned long flags; - int err; ssize_t count; if (!capable(CAP_NET_ADMIN)) return -EPERM; - bcm43xx_lock(bcm, flags); - assert(bcm->initialized); + mutex_lock(&bcm->mutex); if (bcm->short_preamble) count = snprintf(buf, PAGE_SIZE, "1 (Short Preamble enabled)\n"); else count = snprintf(buf, PAGE_SIZE, "0 (Short Preamble disabled)\n"); - err = 0; - bcm43xx_unlock(bcm, flags); + mutex_unlock(&bcm->mutex); - return err ? err : count; + return count; } static ssize_t bcm43xx_attr_preamble_store(struct device *dev, @@ -281,7 +280,6 @@ static ssize_t bcm43xx_attr_preamble_store(struct device *dev, { struct bcm43xx_private *bcm = dev_to_bcm(dev); unsigned long flags; - int err; int value; if (!capable(CAP_NET_ADMIN)) @@ -290,15 +288,15 @@ static ssize_t bcm43xx_attr_preamble_store(struct device *dev, value = get_boolean(buf, count); if (value < 0) return value; - bcm43xx_lock(bcm, flags); - assert(bcm->initialized); + mutex_lock(&bcm->mutex); + spin_lock_irqsave(&bcm->irq_lock, flags); bcm->short_preamble = !!value; - err = 0; - bcm43xx_unlock(bcm, flags); + spin_unlock_irqrestore(&bcm->irq_lock, flags); + mutex_unlock(&bcm->mutex); - return err ? err : count; + return count; } static DEVICE_ATTR(shortpreamble, 0644, @@ -310,7 +308,7 @@ int bcm43xx_sysfs_register(struct bcm43xx_private *bcm) struct device *dev = &bcm->pci_dev->dev; int err; - assert(bcm->initialized); + assert(bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED); err = device_create_file(dev, &dev_attr_sprom); if (err) diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_wx.c b/drivers/net/wireless/bcm43xx/bcm43xx_wx.c index b45063974..ebe2a8469 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_wx.c +++ b/drivers/net/wireless/bcm43xx/bcm43xx_wx.c @@ -55,13 +55,12 @@ static int bcm43xx_wx_get_name(struct net_device *net_dev, char *extra) { struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); - unsigned long flags; int i; struct bcm43xx_phyinfo *phy; char suffix[7] = { 0 }; int have_a = 0, have_b = 0, have_g = 0; - bcm43xx_lock(bcm, flags); + mutex_lock(&bcm->mutex); for (i = 0; i < bcm->nr_80211_available; i++) { phy = &(bcm->core_80211_ext[i].phy); switch (phy->type) { @@ -77,7 +76,7 @@ static int bcm43xx_wx_get_name(struct net_device *net_dev, assert(0); } } - bcm43xx_unlock(bcm, flags); + mutex_unlock(&bcm->mutex); i = 0; if (have_a) { @@ -111,7 +110,9 @@ static int bcm43xx_wx_set_channelfreq(struct net_device *net_dev, int freq; int err = -EINVAL; - bcm43xx_lock_mmio(bcm, flags); + mutex_lock(&bcm->mutex); + spin_lock_irqsave(&bcm->irq_lock, flags); + if ((data->freq.m >= 0) && (data->freq.m <= 1000)) { channel = data->freq.m; freq = bcm43xx_channel_to_freq(bcm, channel); @@ -119,9 +120,9 @@ static int bcm43xx_wx_set_channelfreq(struct net_device *net_dev, channel = bcm43xx_freq_to_channel(bcm, data->freq.m); freq = data->freq.m; } - if (!bcm43xx_is_valid_channel(bcm, channel)) + if (!ieee80211_is_valid_channel(bcm->ieee, channel)) goto out_unlock; - if (bcm->initialized) { + if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED) { //ieee80211softmac_disassoc(softmac, $REASON); bcm43xx_mac_suspend(bcm); err = bcm43xx_radio_selectchannel(bcm, channel, 0); @@ -131,7 +132,8 @@ static int bcm43xx_wx_set_channelfreq(struct net_device *net_dev, err = 0; } out_unlock: - bcm43xx_unlock_mmio(bcm, flags); + spin_unlock_irqrestore(&bcm->irq_lock, flags); + mutex_unlock(&bcm->mutex); return err; } @@ -143,15 +145,13 @@ static int bcm43xx_wx_get_channelfreq(struct net_device *net_dev, { struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); struct bcm43xx_radioinfo *radio; - unsigned long flags; int err = -ENODEV; u16 channel; - bcm43xx_lock(bcm, flags); + mutex_lock(&bcm->mutex); radio = bcm43xx_current_radio(bcm); channel = radio->channel; if (channel == 0xFF) { - assert(!bcm->initialized); channel = radio->initial_channel; if (channel == 0xFF) goto out_unlock; @@ -163,7 +163,7 @@ static int bcm43xx_wx_get_channelfreq(struct net_device *net_dev, err = 0; out_unlock: - bcm43xx_unlock(bcm, flags); + mutex_unlock(&bcm->mutex); return err; } @@ -181,13 +181,15 @@ static int bcm43xx_wx_set_mode(struct net_device *net_dev, if (mode == IW_MODE_AUTO) mode = BCM43xx_INITIAL_IWMODE; - bcm43xx_lock_mmio(bcm, flags); - if (bcm->initialized) { + mutex_lock(&bcm->mutex); + spin_lock_irqsave(&bcm->irq_lock, flags); + if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED) { if (bcm->ieee->iw_mode != mode) bcm43xx_set_iwmode(bcm, mode); } else bcm->ieee->iw_mode = mode; - bcm43xx_unlock_mmio(bcm, flags); + spin_unlock_irqrestore(&bcm->irq_lock, flags); + mutex_unlock(&bcm->mutex); return 0; } @@ -198,11 +200,10 @@ static int bcm43xx_wx_get_mode(struct net_device *net_dev, char *extra) { struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); - unsigned long flags; - bcm43xx_lock(bcm, flags); + mutex_lock(&bcm->mutex); data->mode = bcm->ieee->iw_mode; - bcm43xx_unlock(bcm, flags); + mutex_unlock(&bcm->mutex); return 0; } @@ -215,7 +216,6 @@ static int bcm43xx_wx_get_rangeparams(struct net_device *net_dev, struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); struct iw_range *range = (struct iw_range *)extra; const struct ieee80211_geo *geo; - unsigned long flags; int i, j; struct bcm43xx_phyinfo *phy; @@ -255,7 +255,7 @@ static int bcm43xx_wx_get_rangeparams(struct net_device *net_dev, IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP; - bcm43xx_lock(bcm, flags); + mutex_lock(&bcm->mutex); phy = bcm43xx_current_phy(bcm); range->num_bitrates = 0; @@ -302,7 +302,7 @@ static int bcm43xx_wx_get_rangeparams(struct net_device *net_dev, } range->num_frequency = j; - bcm43xx_unlock(bcm, flags); + mutex_unlock(&bcm->mutex); return 0; } @@ -313,14 +313,13 @@ static int bcm43xx_wx_set_nick(struct net_device *net_dev, char *extra) { struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); - unsigned long flags; size_t len; - bcm43xx_lock(bcm, flags); + mutex_lock(&bcm->mutex); len = min((size_t)data->data.length, (size_t)IW_ESSID_MAX_SIZE); memcpy(bcm->nick, extra, len); bcm->nick[len] = '\0'; - bcm43xx_unlock(bcm, flags); + mutex_unlock(&bcm->mutex); return 0; } @@ -331,15 +330,14 @@ static int bcm43xx_wx_get_nick(struct net_device *net_dev, char *extra) { struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); - unsigned long flags; size_t len; - bcm43xx_lock(bcm, flags); + mutex_lock(&bcm->mutex); len = strlen(bcm->nick) + 1; memcpy(extra, bcm->nick, len); data->data.length = (__u16)len; data->data.flags = 1; - bcm43xx_unlock(bcm, flags); + mutex_unlock(&bcm->mutex); return 0; } @@ -353,7 +351,8 @@ static int bcm43xx_wx_set_rts(struct net_device *net_dev, unsigned long flags; int err = -EINVAL; - bcm43xx_lock(bcm, flags); + mutex_lock(&bcm->mutex); + spin_lock_irqsave(&bcm->irq_lock, flags); if (data->rts.disabled) { bcm->rts_threshold = BCM43xx_MAX_RTS_THRESHOLD; err = 0; @@ -364,7 +363,8 @@ static int bcm43xx_wx_set_rts(struct net_device *net_dev, err = 0; } } - bcm43xx_unlock(bcm, flags); + spin_unlock_irqrestore(&bcm->irq_lock, flags); + mutex_unlock(&bcm->mutex); return err; } @@ -375,13 +375,12 @@ static int bcm43xx_wx_get_rts(struct net_device *net_dev, char *extra) { struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); - unsigned long flags; - bcm43xx_lock(bcm, flags); + mutex_lock(&bcm->mutex); data->rts.value = bcm->rts_threshold; data->rts.fixed = 0; data->rts.disabled = (bcm->rts_threshold == BCM43xx_MAX_RTS_THRESHOLD); - bcm43xx_unlock(bcm, flags); + mutex_unlock(&bcm->mutex); return 0; } @@ -395,7 +394,8 @@ static int bcm43xx_wx_set_frag(struct net_device *net_dev, unsigned long flags; int err = -EINVAL; - bcm43xx_lock(bcm, flags); + mutex_lock(&bcm->mutex); + spin_lock_irqsave(&bcm->irq_lock, flags); if (data->frag.disabled) { bcm->ieee->fts = MAX_FRAG_THRESHOLD; err = 0; @@ -406,7 +406,8 @@ static int bcm43xx_wx_set_frag(struct net_device *net_dev, err = 0; } } - bcm43xx_unlock(bcm, flags); + spin_unlock_irqrestore(&bcm->irq_lock, flags); + mutex_unlock(&bcm->mutex); return err; } @@ -417,13 +418,12 @@ static int bcm43xx_wx_get_frag(struct net_device *net_dev, char *extra) { struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); - unsigned long flags; - bcm43xx_lock(bcm, flags); + mutex_lock(&bcm->mutex); data->frag.value = bcm->ieee->fts; data->frag.fixed = 0; data->frag.disabled = (bcm->ieee->fts == MAX_FRAG_THRESHOLD); - bcm43xx_unlock(bcm, flags); + mutex_unlock(&bcm->mutex); return 0; } @@ -445,8 +445,9 @@ static int bcm43xx_wx_set_xmitpower(struct net_device *net_dev, return -EOPNOTSUPP; } - bcm43xx_lock_mmio(bcm, flags); - if (!bcm->initialized) + mutex_lock(&bcm->mutex); + spin_lock_irqsave(&bcm->irq_lock, flags); + if (bcm43xx_status(bcm) != BCM43xx_STAT_INITIALIZED) goto out_unlock; radio = bcm43xx_current_radio(bcm); phy = bcm43xx_current_phy(bcm); @@ -469,7 +470,8 @@ static int bcm43xx_wx_set_xmitpower(struct net_device *net_dev, err = 0; out_unlock: - bcm43xx_unlock_mmio(bcm, flags); + spin_unlock_irqrestore(&bcm->irq_lock, flags); + mutex_unlock(&bcm->mutex); return err; } @@ -481,11 +483,10 @@ static int bcm43xx_wx_get_xmitpower(struct net_device *net_dev, { struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); struct bcm43xx_radioinfo *radio; - unsigned long flags; int err = -ENODEV; - bcm43xx_lock(bcm, flags); - if (!bcm->initialized) + mutex_lock(&bcm->mutex); + if (bcm43xx_status(bcm) != BCM43xx_STAT_INITIALIZED) goto out_unlock; radio = bcm43xx_current_radio(bcm); /* desired dBm value is in Q5.2 */ @@ -496,7 +497,7 @@ static int bcm43xx_wx_get_xmitpower(struct net_device *net_dev, err = 0; out_unlock: - bcm43xx_unlock(bcm, flags); + mutex_unlock(&bcm->mutex); return err; } @@ -583,8 +584,9 @@ static int bcm43xx_wx_set_interfmode(struct net_device *net_dev, return -EINVAL; } - bcm43xx_lock_mmio(bcm, flags); - if (bcm->initialized) { + mutex_lock(&bcm->mutex); + spin_lock_irqsave(&bcm->irq_lock, flags); + if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED) { err = bcm43xx_radio_set_interference_mitigation(bcm, mode); if (err) { printk(KERN_ERR PFX "Interference Mitigation not " @@ -598,7 +600,8 @@ static int bcm43xx_wx_set_interfmode(struct net_device *net_dev, } else bcm43xx_current_radio(bcm)->interfmode = mode; } - bcm43xx_unlock_mmio(bcm, flags); + spin_unlock_irqrestore(&bcm->irq_lock, flags); + mutex_unlock(&bcm->mutex); return err; } @@ -609,12 +612,11 @@ static int bcm43xx_wx_get_interfmode(struct net_device *net_dev, char *extra) { struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); - unsigned long flags; int mode; - bcm43xx_lock(bcm, flags); + mutex_lock(&bcm->mutex); mode = bcm43xx_current_radio(bcm)->interfmode; - bcm43xx_unlock(bcm, flags); + mutex_unlock(&bcm->mutex); switch (mode) { case BCM43xx_RADIO_INTERFMODE_NONE: @@ -644,9 +646,11 @@ static int bcm43xx_wx_set_shortpreamble(struct net_device *net_dev, int on; on = *((int *)extra); - bcm43xx_lock(bcm, flags); + mutex_lock(&bcm->mutex); + spin_lock_irqsave(&bcm->irq_lock, flags); bcm->short_preamble = !!on; - bcm43xx_unlock(bcm, flags); + spin_unlock_irqrestore(&bcm->irq_lock, flags); + mutex_unlock(&bcm->mutex); return 0; } @@ -657,12 +661,11 @@ static int bcm43xx_wx_get_shortpreamble(struct net_device *net_dev, char *extra) { struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); - unsigned long flags; int on; - bcm43xx_lock(bcm, flags); + mutex_lock(&bcm->mutex); on = bcm->short_preamble; - bcm43xx_unlock(bcm, flags); + mutex_unlock(&bcm->mutex); if (on) strncpy(extra, "1 (Short Preamble enabled)", MAX_WX_STRING); @@ -684,11 +687,13 @@ static int bcm43xx_wx_set_swencryption(struct net_device *net_dev, on = *((int *)extra); - bcm43xx_lock(bcm, flags); + mutex_lock(&bcm->mutex); + spin_lock_irqsave(&bcm->irq_lock, flags); bcm->ieee->host_encrypt = !!on; bcm->ieee->host_decrypt = !!on; bcm->ieee->host_build_iv = !on; - bcm43xx_unlock(bcm, flags); + spin_unlock_irqrestore(&bcm->irq_lock, flags); + mutex_unlock(&bcm->mutex); return 0; } @@ -699,12 +704,11 @@ static int bcm43xx_wx_get_swencryption(struct net_device *net_dev, char *extra) { struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); - unsigned long flags; int on; - bcm43xx_lock(bcm, flags); + mutex_lock(&bcm->mutex); on = bcm->ieee->host_encrypt; - bcm43xx_unlock(bcm, flags); + mutex_unlock(&bcm->mutex); if (on) strncpy(extra, "1 (SW encryption enabled) ", MAX_WX_STRING); @@ -767,11 +771,13 @@ static int bcm43xx_wx_sprom_read(struct net_device *net_dev, if (!sprom) goto out; - bcm43xx_lock_mmio(bcm, flags); + mutex_lock(&bcm->mutex); + spin_lock_irqsave(&bcm->irq_lock, flags); err = -ENODEV; - if (bcm->initialized) + if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED) err = bcm43xx_sprom_read(bcm, sprom); - bcm43xx_unlock_mmio(bcm, flags); + spin_unlock_irqrestore(&bcm->irq_lock, flags); + mutex_unlock(&bcm->mutex); if (!err) data->data.length = sprom2hex(sprom, extra); kfree(sprom); @@ -812,11 +818,15 @@ static int bcm43xx_wx_sprom_write(struct net_device *net_dev, if (err) goto out_kfree; - bcm43xx_lock_mmio(bcm, flags); + mutex_lock(&bcm->mutex); + spin_lock_irqsave(&bcm->irq_lock, flags); + spin_lock(&bcm->leds_lock); err = -ENODEV; - if (bcm->initialized) + if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED) err = bcm43xx_sprom_write(bcm, sprom); - bcm43xx_unlock_mmio(bcm, flags); + spin_unlock(&bcm->leds_lock); + spin_unlock_irqrestore(&bcm->irq_lock, flags); + mutex_unlock(&bcm->mutex); out_kfree: kfree(sprom); out: diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_xmit.c b/drivers/net/wireless/bcm43xx/bcm43xx_xmit.c index d8ece28c0..6dbd855b3 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_xmit.c +++ b/drivers/net/wireless/bcm43xx/bcm43xx_xmit.c @@ -296,11 +296,14 @@ void bcm43xx_generate_txhdr(struct bcm43xx_private *bcm, u16 control = 0; u16 wsec_rate = 0; u16 encrypt_frame; + const u16 ftype = WLAN_FC_GET_TYPE(le16_to_cpu(wireless_header->frame_ctl)); + const int is_mgt = (ftype == IEEE80211_FTYPE_MGMT); /* Now construct the TX header. */ memset(txhdr, 0, sizeof(*txhdr)); - bitrate = bcm->softmac->txrates.default_rate; + bitrate = ieee80211softmac_suggest_txrate(bcm->softmac, + is_multicast_ether_addr(wireless_header->addr1), is_mgt); ofdm_modulation = !(ieee80211_is_cck_rate(bitrate)); fallback_bitrate = bcm43xx_calc_fallback_rate(bitrate); fallback_ofdm_modulation = !(ieee80211_is_cck_rate(fallback_bitrate)); diff --git a/drivers/net/wireless/hermes.c b/drivers/net/wireless/hermes.c index 346c6febb..29d39105f 100644 --- a/drivers/net/wireless/hermes.c +++ b/drivers/net/wireless/hermes.c @@ -38,7 +38,6 @@ * under either the MPL or the GPL. */ -#include #include #include #include @@ -121,12 +120,6 @@ void hermes_struct_init(hermes_t *hw, void __iomem *address, int reg_spacing) hw->iobase = address; hw->reg_spacing = reg_spacing; hw->inten = 0x0; - -#ifdef HERMES_DEBUG_BUFFER - hw->dbufp = 0; - memset(&hw->dbuf, 0xff, sizeof(hw->dbuf)); - memset(&hw->profile, 0, sizeof(hw->profile)); -#endif } int hermes_init(hermes_t *hw) @@ -347,19 +340,6 @@ static int hermes_bap_seek(hermes_t *hw, int bap, u16 id, u16 offset) reg = hermes_read_reg(hw, oreg); } -#ifdef HERMES_DEBUG_BUFFER - hw->profile[HERMES_BAP_BUSY_TIMEOUT - k]++; - - if (k < HERMES_BAP_BUSY_TIMEOUT) { - struct hermes_debug_entry *e = - &hw->dbuf[(hw->dbufp++) % HERMES_DEBUG_BUFSIZE]; - e->bap = bap; - e->id = id; - e->offset = offset; - e->cycles = HERMES_BAP_BUSY_TIMEOUT - k; - } -#endif - if (reg & HERMES_OFFSET_BUSY) return -ETIMEDOUT; @@ -419,8 +399,7 @@ int hermes_bap_pread(hermes_t *hw, int bap, void *buf, int len, } /* Write a block of data to the chip's buffer, via the - * BAP. Synchronization/serialization is the caller's problem. len - * must be even. + * BAP. Synchronization/serialization is the caller's problem. * * Returns: < 0 on internal failure (errno), 0 on success, > 0 on error from firmware */ @@ -430,7 +409,7 @@ int hermes_bap_pwrite(hermes_t *hw, int bap, const void *buf, int len, int dreg = bap ? HERMES_DATA1 : HERMES_DATA0; int err = 0; - if ( (len < 0) || (len % 2) ) + if (len < 0) return -EINVAL; err = hermes_bap_seek(hw, bap, id, offset); @@ -438,49 +417,12 @@ int hermes_bap_pwrite(hermes_t *hw, int bap, const void *buf, int len, goto out; /* Actually do the transfer */ - hermes_write_words(hw, dreg, buf, len/2); + hermes_write_bytes(hw, dreg, buf, len); out: return err; } -/* Write a block of data to the chip's buffer with padding if - * neccessary, via the BAP. Synchronization/serialization is the - * caller's problem. len must be even. - * - * Returns: < 0 on internal failure (errno), 0 on success, > 0 on error from firmware - */ -int hermes_bap_pwrite_pad(hermes_t *hw, int bap, const void *buf, unsigned data_len, int len, - u16 id, u16 offset) -{ - int dreg = bap ? HERMES_DATA1 : HERMES_DATA0; - int err = 0; - - if (len < 0 || len % 2 || data_len > len) - return -EINVAL; - - err = hermes_bap_seek(hw, bap, id, offset); - if (err) - goto out; - - /* Transfer all the complete words of data */ - hermes_write_words(hw, dreg, buf, data_len/2); - /* If there is an odd byte left over pad and transfer it */ - if (data_len & 1) { - u8 end[2]; - end[1] = 0; - end[0] = ((unsigned char *)buf)[data_len - 1]; - hermes_write_words(hw, dreg, end, 1); - data_len ++; - } - /* Now send zeros for the padding */ - if (data_len < len) - hermes_clear_words(hw, dreg, (len - data_len) / 2); - /* Complete */ - out: - return err; -} - /* Read a Length-Type-Value record from the card. * * If length is NULL, we ignore the length read from the card, and @@ -553,7 +495,7 @@ int hermes_write_ltv(hermes_t *hw, int bap, u16 rid, count = length - 1; - hermes_write_words(hw, dreg, value, count); + hermes_write_bytes(hw, dreg, value, count << 1); err = hermes_docmd_wait(hw, HERMES_CMD_ACCESS | HERMES_CMD_WRITE, rid, NULL); @@ -568,7 +510,6 @@ EXPORT_SYMBOL(hermes_allocate); EXPORT_SYMBOL(hermes_bap_pread); EXPORT_SYMBOL(hermes_bap_pwrite); -EXPORT_SYMBOL(hermes_bap_pwrite_pad); EXPORT_SYMBOL(hermes_read_ltv); EXPORT_SYMBOL(hermes_write_ltv); diff --git a/drivers/net/wireless/hermes.h b/drivers/net/wireless/hermes.h index 7644f72a9..8e3f0e3ed 100644 --- a/drivers/net/wireless/hermes.h +++ b/drivers/net/wireless/hermes.h @@ -328,16 +328,6 @@ struct hermes_multicast { u8 addr[HERMES_MAX_MULTICAST][ETH_ALEN]; } __attribute__ ((packed)); -// #define HERMES_DEBUG_BUFFER 1 -#define HERMES_DEBUG_BUFSIZE 4096 -struct hermes_debug_entry { - int bap; - u16 id, offset; - int cycles; -}; - -#ifdef __KERNEL__ - /* Timeouts */ #define HERMES_BAP_BUSY_TIMEOUT (10000) /* In iterations of ~1us */ @@ -347,14 +337,7 @@ typedef struct hermes { int reg_spacing; #define HERMES_16BIT_REGSPACING 0 #define HERMES_32BIT_REGSPACING 1 - u16 inten; /* Which interrupts should be enabled? */ - -#ifdef HERMES_DEBUG_BUFFER - struct hermes_debug_entry dbuf[HERMES_DEBUG_BUFSIZE]; - unsigned long dbufp; - unsigned long profile[HERMES_BAP_BUSY_TIMEOUT+1]; -#endif } hermes_t; /* Register access convenience macros */ @@ -376,8 +359,6 @@ int hermes_bap_pread(hermes_t *hw, int bap, void *buf, int len, u16 id, u16 offset); int hermes_bap_pwrite(hermes_t *hw, int bap, const void *buf, int len, u16 id, u16 offset); -int hermes_bap_pwrite_pad(hermes_t *hw, int bap, const void *buf, - unsigned data_len, int len, u16 id, u16 offset); int hermes_read_ltv(hermes_t *hw, int bap, u16 rid, unsigned buflen, u16 *length, void *buf); int hermes_write_ltv(hermes_t *hw, int bap, u16 rid, @@ -425,10 +406,13 @@ static inline void hermes_read_words(struct hermes *hw, int off, void *buf, unsi ioread16_rep(hw->iobase + off, buf, count); } -static inline void hermes_write_words(struct hermes *hw, int off, const void *buf, unsigned count) +static inline void hermes_write_bytes(struct hermes *hw, int off, + const char *buf, unsigned count) { off = off << hw->reg_spacing; - iowrite16_rep(hw->iobase + off, buf, count); + iowrite16_rep(hw->iobase + off, buf, count >> 1); + if (unlikely(count & 1)) + iowrite8(buf[count - 1], hw->iobase + off); } static inline void hermes_clear_words(struct hermes *hw, int off, unsigned count) @@ -462,21 +446,4 @@ static inline int hermes_write_wordrec(hermes_t *hw, int bap, u16 rid, u16 word) return HERMES_WRITE_RECORD(hw, bap, rid, &rec); } -#else /* ! __KERNEL__ */ - -/* These are provided for the benefit of userspace drivers and testing programs - which use ioperm() or iopl() */ - -#define hermes_read_reg(base, off) (inw((base) + (off))) -#define hermes_write_reg(base, off, val) (outw((val), (base) + (off))) - -#define hermes_read_regn(base, name) (hermes_read_reg((base), HERMES_##name)) -#define hermes_write_regn(base, name, val) (hermes_write_reg((base), HERMES_##name, (val))) - -/* Note that for the next two, the count is in 16-bit words, not bytes */ -#define hermes_read_data(base, off, buf, count) (insw((base) + (off), (buf), (count))) -#define hermes_write_data(base, off, buf, count) (outsw((base) + (off), (buf), (count))) - -#endif /* ! __KERNEL__ */ - #endif /* _HERMES_H */ diff --git a/drivers/net/wireless/hostap/hostap_80211_tx.c b/drivers/net/wireless/hostap/hostap_80211_tx.c index 06a521414..4a5be70c0 100644 --- a/drivers/net/wireless/hostap/hostap_80211_tx.c +++ b/drivers/net/wireless/hostap/hostap_80211_tx.c @@ -534,5 +534,4 @@ int hostap_master_start_xmit(struct sk_buff *skb, struct net_device *dev) } -EXPORT_SYMBOL(hostap_dump_tx_80211); EXPORT_SYMBOL(hostap_master_start_xmit); diff --git a/drivers/net/wireless/hostap/hostap_ap.c b/drivers/net/wireless/hostap/hostap_ap.c index 06c3fa32b..ba1312502 100644 --- a/drivers/net/wireless/hostap/hostap_ap.c +++ b/drivers/net/wireless/hostap/hostap_ap.c @@ -3276,17 +3276,6 @@ EXPORT_SYMBOL(hostap_init_data); EXPORT_SYMBOL(hostap_init_ap_proc); EXPORT_SYMBOL(hostap_free_data); EXPORT_SYMBOL(hostap_check_sta_fw_version); -EXPORT_SYMBOL(hostap_handle_sta_tx); -EXPORT_SYMBOL(hostap_handle_sta_release); EXPORT_SYMBOL(hostap_handle_sta_tx_exc); -EXPORT_SYMBOL(hostap_update_sta_ps); -EXPORT_SYMBOL(hostap_handle_sta_rx); -EXPORT_SYMBOL(hostap_is_sta_assoc); -EXPORT_SYMBOL(hostap_is_sta_authorized); -EXPORT_SYMBOL(hostap_add_sta); -EXPORT_SYMBOL(hostap_update_rates); -EXPORT_SYMBOL(hostap_add_wds_links); -EXPORT_SYMBOL(hostap_wds_link_oper); #ifndef PRISM2_NO_KERNEL_IEEE80211_MGMT -EXPORT_SYMBOL(hostap_deauth_all_stas); #endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */ diff --git a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c index 55bed923f..52e6df5c1 100644 --- a/drivers/net/wireless/hostap/hostap_cs.c +++ b/drivers/net/wireless/hostap/hostap_cs.c @@ -1,6 +1,5 @@ #define PRISM2_PCCARD -#include #include #include #include @@ -844,7 +843,7 @@ static struct pcmcia_device_id hostap_cs_ids[] = { PCMCIA_DEVICE_MANF_CARD(0x02d2, 0x0001), PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x0001), PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x7300), - PCMCIA_DEVICE_MANF_CARD(0xc00f, 0x0000), +/* PCMCIA_DEVICE_MANF_CARD(0xc00f, 0x0000), conflict with pcnet_cs */ PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0002), PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0005), PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0010), @@ -881,6 +880,12 @@ static struct pcmcia_device_id hostap_cs_ids[] = { PCMCIA_DEVICE_PROD_ID12( "ZoomAir 11Mbps High", "Rate wireless Networking", 0x273fe3db, 0x32a1eaee), + PCMCIA_DEVICE_PROD_ID123( + "Pretec", "CompactWLAN Card 802.11b", "2.5", + 0x1cadd3e5, 0xe697636c, 0x7a5bfcf1), + PCMCIA_DEVICE_PROD_ID123( + "U.S. Robotics", "IEEE 802.11b PC-CARD", "Version 01.02", + 0xc7b8df9d, 0x1700d087, 0x4b74baa0), PCMCIA_DEVICE_NULL }; MODULE_DEVICE_TABLE(pcmcia, hostap_cs_ids); diff --git a/drivers/net/wireless/hostap/hostap_hw.c b/drivers/net/wireless/hostap/hostap_hw.c index 328e9a1d1..d500012fd 100644 --- a/drivers/net/wireless/hostap/hostap_hw.c +++ b/drivers/net/wireless/hostap/hostap_hw.c @@ -30,7 +30,6 @@ */ -#include #include #include @@ -1043,6 +1042,9 @@ static int prism2_reset_port(struct net_device *dev) dev->name, local->fragm_threshold); } + /* Some firmwares lose antenna selection settings on reset */ + (void) hostap_set_antsel(local); + return res; } @@ -3096,6 +3098,14 @@ static void prism2_clear_set_tim_queue(local_info_t *local) } +/* + * HostAP uses two layers of net devices, where the inner + * layer gets called all the time from the outer layer. + * This is a natural nesting, which needs a split lock type. + */ +static struct lock_class_key hostap_netdev_xmit_lock_key; + + static struct net_device * prism2_init_local_data(struct prism2_helper_functions *funcs, int card_idx, struct device *sdev) @@ -3260,6 +3270,8 @@ while (0) SET_NETDEV_DEV(dev, sdev); if (ret >= 0) ret = register_netdevice(dev); + + lockdep_set_class(&dev->_xmit_lock, &hostap_netdev_xmit_lock_key); rtnl_unlock(); if (ret < 0) { printk(KERN_WARNING "%s: register netdevice failed!\n", diff --git a/drivers/net/wireless/hostap/hostap_main.c b/drivers/net/wireless/hostap/hostap_main.c index 8dd4c4446..53374fcba 100644 --- a/drivers/net/wireless/hostap/hostap_main.c +++ b/drivers/net/wireless/hostap/hostap_main.c @@ -12,7 +12,6 @@ * more details. */ -#include #include #include #include @@ -1125,11 +1124,9 @@ 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); diff --git a/drivers/net/wireless/hostap/hostap_pci.c b/drivers/net/wireless/hostap/hostap_pci.c index 194f07097..c2fa011be 100644 --- a/drivers/net/wireless/hostap/hostap_pci.c +++ b/drivers/net/wireless/hostap/hostap_pci.c @@ -4,7 +4,6 @@ * driver patches from Reyk Floeter and * Andy Warner */ -#include #include #include #include @@ -338,7 +337,7 @@ static int prism2_pci_probe(struct pci_dev *pdev, pci_set_drvdata(pdev, dev); - if (request_irq(dev->irq, prism2_interrupt, SA_SHIRQ, dev->name, + if (request_irq(dev->irq, prism2_interrupt, IRQF_SHARED, dev->name, dev)) { printk(KERN_WARNING "%s: request_irq failed\n", dev->name); goto fail; diff --git a/drivers/net/wireless/hostap/hostap_plx.c b/drivers/net/wireless/hostap/hostap_plx.c index edaaa943e..6dfa041be 100644 --- a/drivers/net/wireless/hostap/hostap_plx.c +++ b/drivers/net/wireless/hostap/hostap_plx.c @@ -7,7 +7,6 @@ */ -#include #include #include #include @@ -67,10 +66,12 @@ static struct pci_device_id prism2_plx_id_table[] __devinitdata = { PLXDEV(0x10b7, 0x7770, "3Com AirConnect PCI 777A"), PLXDEV(0x111a, 0x1023, "Siemens SpeedStream SS1023"), PLXDEV(0x126c, 0x8030, "Nortel emobility"), + PLXDEV(0x1562, 0x0001, "Symbol LA-4123"), PLXDEV(0x1385, 0x4100, "Netgear MA301"), PLXDEV(0x15e8, 0x0130, "National Datacomm NCP130 (PLX9052)"), PLXDEV(0x15e8, 0x0131, "National Datacomm NCP130 (TMD7160)"), PLXDEV(0x1638, 0x1100, "Eumitcom WL11000"), + PLXDEV(0x16ab, 0x1100, "Global Sun Tech GL24110P"), PLXDEV(0x16ab, 0x1101, "Global Sun Tech GL24110P (?)"), PLXDEV(0x16ab, 0x1102, "Linksys WPC11 with WDT11"), PLXDEV(0x16ab, 0x1103, "Longshine 8031"), @@ -551,7 +552,7 @@ static int prism2_plx_probe(struct pci_dev *pdev, pci_set_drvdata(pdev, dev); - if (request_irq(dev->irq, prism2_interrupt, SA_SHIRQ, dev->name, + if (request_irq(dev->irq, prism2_interrupt, IRQF_SHARED, dev->name, dev)) { printk(KERN_WARNING "%s: request_irq failed\n", dev->name); goto fail; diff --git a/drivers/net/wireless/ipw2100.c b/drivers/net/wireless/ipw2100.c index 72335c8eb..e955db435 100644 --- a/drivers/net/wireless/ipw2100.c +++ b/drivers/net/wireless/ipw2100.c @@ -134,7 +134,6 @@ that only one external action is invoked at a time. */ #include -#include #include #include #include @@ -1485,7 +1484,7 @@ static int ipw2100_hw_stop_adapter(struct ipw2100_priv *priv) * * Sending the PREPARE_FOR_POWER_DOWN will restrict the * hardware from going into standby mode and will transition - * out of D0-standy if it is already in that state. + * out of D0-standby if it is already in that state. * * STATUS_PREPARE_POWER_DOWN_COMPLETE will be sent by the * driver upon completion. Once received, the driver can @@ -5358,7 +5357,7 @@ static int ipw2100_set_key(struct ipw2100_priv *priv, idx, keylen, len); /* NOTE: We don't check cached values in case the firmware was reset - * or some other problem is occuring. If the user is setting the key, + * or some other problem is occurring. If the user is setting the key, * then we push the change */ wep_key->idx = idx; @@ -6230,7 +6229,7 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev, ipw2100_queues_initialize(priv); err = request_irq(pci_dev->irq, - ipw2100_interrupt, SA_SHIRQ, dev->name, priv); + ipw2100_interrupt, IRQF_SHARED, dev->name, priv); if (err) { printk(KERN_WARNING DRV_NAME "Error calling request_irq: %d.\n", pci_dev->irq); diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c index bca89cff8..b3300ffe4 100644 --- a/drivers/net/wireless/ipw2200.c +++ b/drivers/net/wireless/ipw2200.c @@ -33,7 +33,44 @@ #include "ipw2200.h" #include -#define IPW2200_VERSION "git-1.1.1" + +#ifndef KBUILD_EXTMOD +#define VK "k" +#else +#define VK +#endif + +#ifdef CONFIG_IPW2200_DEBUG +#define VD "d" +#else +#define VD +#endif + +#ifdef CONFIG_IPW2200_MONITOR +#define VM "m" +#else +#define VM +#endif + +#ifdef CONFIG_IPW2200_PROMISCUOUS +#define VP "p" +#else +#define VP +#endif + +#ifdef CONFIG_IPW2200_RADIOTAP +#define VR "r" +#else +#define VR +#endif + +#ifdef CONFIG_IPW2200_QOS +#define VQ "q" +#else +#define VQ +#endif + +#define IPW2200_VERSION "1.1.2" VK VD VM VP VR VQ #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2200/2915 Network Driver" #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation" #define DRV_VERSION IPW2200_VERSION @@ -46,7 +83,9 @@ MODULE_AUTHOR(DRV_COPYRIGHT); MODULE_LICENSE("GPL"); static int cmdlog = 0; +#ifdef CONFIG_IPW2200_DEBUG static int debug = 0; +#endif static int channel = 0; static int mode = 0; @@ -61,8 +100,14 @@ static int roaming = 1; static const char ipw_modes[] = { 'a', 'b', 'g', '?' }; +static int antenna = CFG_SYS_ANTENNA_BOTH; + +#ifdef CONFIG_IPW2200_PROMISCUOUS +static int rtap_iface = 0; /* def: 0 -- do not create rtap interface */ +#endif + -#ifdef CONFIG_IPW_QOS +#ifdef CONFIG_IPW2200_QOS static int qos_enable = 0; static int qos_burst_enable = 0; static int qos_no_ack_mask = 0; @@ -126,7 +171,7 @@ static int ipw_send_qos_params_command(struct ipw_priv *priv, struct ieee80211_q *qos_param); static int ipw_send_qos_info_command(struct ipw_priv *priv, struct ieee80211_qos_information_element *qos_param); -#endif /* CONFIG_IPW_QOS */ +#endif /* CONFIG_IPW2200_QOS */ static struct iw_statistics *ipw_get_wireless_stats(struct net_device *dev); static void ipw_remove_current_network(struct ipw_priv *priv); @@ -488,7 +533,7 @@ static inline void ipw_clear_bit(struct ipw_priv *priv, u32 reg, u32 mask) ipw_write32(priv, reg, ipw_read32(priv, reg) & ~mask); } -static inline void ipw_enable_interrupts(struct ipw_priv *priv) +static inline void __ipw_enable_interrupts(struct ipw_priv *priv) { if (priv->status & STATUS_INT_ENABLED) return; @@ -496,7 +541,7 @@ static inline void ipw_enable_interrupts(struct ipw_priv *priv) ipw_write32(priv, IPW_INTA_MASK_R, IPW_INTA_MASK_ALL); } -static inline void ipw_disable_interrupts(struct ipw_priv *priv) +static inline void __ipw_disable_interrupts(struct ipw_priv *priv) { if (!(priv->status & STATUS_INT_ENABLED)) return; @@ -504,6 +549,24 @@ static inline void ipw_disable_interrupts(struct ipw_priv *priv) ipw_write32(priv, IPW_INTA_MASK_R, ~IPW_INTA_MASK_ALL); } +static inline void ipw_enable_interrupts(struct ipw_priv *priv) +{ + unsigned long flags; + + spin_lock_irqsave(&priv->irq_lock, flags); + __ipw_enable_interrupts(priv); + spin_unlock_irqrestore(&priv->irq_lock, flags); +} + +static inline void ipw_disable_interrupts(struct ipw_priv *priv) +{ + unsigned long flags; + + spin_lock_irqsave(&priv->irq_lock, flags); + __ipw_disable_interrupts(priv); + spin_unlock_irqrestore(&priv->irq_lock, flags); +} + #ifdef CONFIG_IPW2200_DEBUG static char *ipw_error_desc(u32 val) { @@ -1166,12 +1229,6 @@ static struct ipw_fw_error *ipw_alloc_error_log(struct ipw_priv *priv) return error; } -static void ipw_free_error_log(struct ipw_fw_error *error) -{ - if (error) - kfree(error); -} - static ssize_t show_event_log(struct device *d, struct device_attribute *attr, char *buf) { @@ -1233,10 +1290,9 @@ static ssize_t clear_error(struct device *d, const char *buf, size_t count) { struct ipw_priv *priv = dev_get_drvdata(d); - if (priv->error) { - ipw_free_error_log(priv->error); - priv->error = NULL; - } + + kfree(priv->error); + priv->error = NULL; return count; } @@ -1269,6 +1325,105 @@ static ssize_t show_cmd_log(struct device *d, static DEVICE_ATTR(cmd_log, S_IRUGO, show_cmd_log, NULL); +#ifdef CONFIG_IPW2200_PROMISCUOUS +static void ipw_prom_free(struct ipw_priv *priv); +static int ipw_prom_alloc(struct ipw_priv *priv); +static ssize_t store_rtap_iface(struct device *d, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct ipw_priv *priv = dev_get_drvdata(d); + int rc = 0; + + if (count < 1) + return -EINVAL; + + switch (buf[0]) { + case '0': + if (!rtap_iface) + return count; + + if (netif_running(priv->prom_net_dev)) { + IPW_WARNING("Interface is up. Cannot unregister.\n"); + return count; + } + + ipw_prom_free(priv); + rtap_iface = 0; + break; + + case '1': + if (rtap_iface) + return count; + + rc = ipw_prom_alloc(priv); + if (!rc) + rtap_iface = 1; + break; + + default: + return -EINVAL; + } + + if (rc) { + IPW_ERROR("Failed to register promiscuous network " + "device (error %d).\n", rc); + } + + return count; +} + +static ssize_t show_rtap_iface(struct device *d, + struct device_attribute *attr, + char *buf) +{ + struct ipw_priv *priv = dev_get_drvdata(d); + if (rtap_iface) + return sprintf(buf, "%s", priv->prom_net_dev->name); + else { + buf[0] = '-'; + buf[1] = '1'; + buf[2] = '\0'; + return 3; + } +} + +static DEVICE_ATTR(rtap_iface, S_IWUSR | S_IRUSR, show_rtap_iface, + store_rtap_iface); + +static ssize_t store_rtap_filter(struct device *d, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct ipw_priv *priv = dev_get_drvdata(d); + + if (!priv->prom_priv) { + IPW_ERROR("Attempting to set filter without " + "rtap_iface enabled.\n"); + return -EPERM; + } + + priv->prom_priv->filter = simple_strtol(buf, NULL, 0); + + IPW_DEBUG_INFO("Setting rtap filter to " BIT_FMT16 "\n", + BIT_ARG16(priv->prom_priv->filter)); + + return count; +} + +static ssize_t show_rtap_filter(struct device *d, + struct device_attribute *attr, + char *buf) +{ + struct ipw_priv *priv = dev_get_drvdata(d); + return sprintf(buf, "0x%04X", + priv->prom_priv ? priv->prom_priv->filter : 0); +} + +static DEVICE_ATTR(rtap_filter, S_IWUSR | S_IRUSR, show_rtap_filter, + store_rtap_filter); +#endif + static ssize_t show_scan_age(struct device *d, struct device_attribute *attr, char *buf) { @@ -1712,7 +1867,7 @@ static void ipw_irq_tasklet(struct ipw_priv *priv) unsigned long flags; int rc = 0; - spin_lock_irqsave(&priv->lock, flags); + spin_lock_irqsave(&priv->irq_lock, flags); inta = ipw_read32(priv, IPW_INTA_RW); inta_mask = ipw_read32(priv, IPW_INTA_MASK_R); @@ -1721,6 +1876,10 @@ static void ipw_irq_tasklet(struct ipw_priv *priv) /* Add any cached INTA values that need to be handled */ inta |= priv->isr_inta; + spin_unlock_irqrestore(&priv->irq_lock, flags); + + spin_lock_irqsave(&priv->lock, flags); + /* handle all the justifications for the interrupt */ if (inta & IPW_INTA_BIT_RX_TRANSFER) { ipw_rx(priv); @@ -1804,8 +1963,7 @@ static void ipw_irq_tasklet(struct ipw_priv *priv) struct ipw_fw_error *error = ipw_alloc_error_log(priv); ipw_dump_error_log(priv, error); - if (error) - ipw_free_error_log(error); + kfree(error); } #endif } else { @@ -1849,10 +2007,10 @@ static void ipw_irq_tasklet(struct ipw_priv *priv) IPW_ERROR("Unhandled INTA bits 0x%08x\n", inta & ~handled); } + spin_unlock_irqrestore(&priv->lock, flags); + /* enable all interrupts */ ipw_enable_interrupts(priv); - - spin_unlock_irqrestore(&priv->lock, flags); } #define IPW_CMD(x) case IPW_CMD_ ## x : return #x @@ -2025,16 +2183,11 @@ static int ipw_send_host_complete(struct ipw_priv *priv) return ipw_send_cmd_simple(priv, IPW_CMD_HOST_COMPLETE); } -static int ipw_send_system_config(struct ipw_priv *priv, - struct ipw_sys_config *config) +static int ipw_send_system_config(struct ipw_priv *priv) { - if (!priv || !config) { - IPW_ERROR("Invalid args\n"); - return -1; - } - - return ipw_send_cmd_pdu(priv, IPW_CMD_SYSTEM_CONFIG, sizeof(*config), - config); + return ipw_send_cmd_pdu(priv, IPW_CMD_SYSTEM_CONFIG, + sizeof(priv->sys_config), + &priv->sys_config); } static int ipw_send_ssid(struct ipw_priv *priv, u8 * ssid, int len) @@ -3104,10 +3257,10 @@ static int ipw_reset_nic(struct ipw_priv *priv) struct ipw_fw { - u32 ver; - u32 boot_size; - u32 ucode_size; - u32 fw_size; + __le32 ver; + __le32 boot_size; + __le32 ucode_size; + __le32 fw_size; u8 data[0]; }; @@ -3131,8 +3284,8 @@ static int ipw_get_fw(struct ipw_priv *priv, fw = (void *)(*raw)->data; - if ((*raw)->size < sizeof(*fw) + - fw->boot_size + fw->ucode_size + fw->fw_size) { + if ((*raw)->size < sizeof(*fw) + le32_to_cpu(fw->boot_size) + + le32_to_cpu(fw->ucode_size) + le32_to_cpu(fw->fw_size)) { IPW_ERROR("%s is too small or corrupt (%zd)\n", name, (*raw)->size); return -EINVAL; @@ -3237,8 +3390,9 @@ static int ipw_load(struct ipw_priv *priv) fw = (void *)raw->data; boot_img = &fw->data[0]; - ucode_img = &fw->data[fw->boot_size]; - fw_img = &fw->data[fw->boot_size + fw->ucode_size]; + ucode_img = &fw->data[le32_to_cpu(fw->boot_size)]; + fw_img = &fw->data[le32_to_cpu(fw->boot_size) + + le32_to_cpu(fw->ucode_size)]; if (rc < 0) goto error; @@ -3272,7 +3426,7 @@ static int ipw_load(struct ipw_priv *priv) IPW_NIC_SRAM_UPPER_BOUND - IPW_NIC_SRAM_LOWER_BOUND); /* DMA the initial boot firmware into the device */ - rc = ipw_load_firmware(priv, boot_img, fw->boot_size); + rc = ipw_load_firmware(priv, boot_img, le32_to_cpu(fw->boot_size)); if (rc < 0) { IPW_ERROR("Unable to load boot firmware: %d\n", rc); goto error; @@ -3294,7 +3448,7 @@ static int ipw_load(struct ipw_priv *priv) ipw_write32(priv, IPW_INTA_RW, IPW_INTA_BIT_FW_INITIALIZATION_DONE); /* DMA the ucode into the device */ - rc = ipw_load_ucode(priv, ucode_img, fw->ucode_size); + rc = ipw_load_ucode(priv, ucode_img, le32_to_cpu(fw->ucode_size)); if (rc < 0) { IPW_ERROR("Unable to load ucode: %d\n", rc); goto error; @@ -3304,7 +3458,7 @@ static int ipw_load(struct ipw_priv *priv) ipw_stop_nic(priv); /* DMA bss firmware into the device */ - rc = ipw_load_firmware(priv, fw_img, fw->fw_size); + rc = ipw_load_firmware(priv, fw_img, le32_to_cpu(fw->fw_size)); if (rc < 0) { IPW_ERROR("Unable to load firmware: %d\n", rc); goto error; @@ -3700,7 +3854,17 @@ static void ipw_bg_disassociate(void *data) static void ipw_system_config(void *data) { struct ipw_priv *priv = data; - ipw_send_system_config(priv, &priv->sys_config); + +#ifdef CONFIG_IPW2200_PROMISCUOUS + if (priv->prom_net_dev && netif_running(priv->prom_net_dev)) { + priv->sys_config.accept_all_data_frames = 1; + priv->sys_config.accept_non_directed_frames = 1; + priv->sys_config.accept_all_mgmt_bcpr = 1; + priv->sys_config.accept_all_mgmt_frames = 1; + } +#endif + + ipw_send_system_config(priv); } struct ipw_status_code { @@ -3771,6 +3935,13 @@ static void inline average_init(struct average *avg) memset(avg, 0, sizeof(*avg)); } +#define DEPTH_RSSI 8 +#define DEPTH_NOISE 16 +static s16 exponential_average(s16 prev_avg, s16 val, u8 depth) +{ + return ((depth-1)*prev_avg + val)/depth; +} + static void average_add(struct average *avg, s16 val) { avg->sum -= avg->entries[avg->pos]; @@ -3800,8 +3971,8 @@ static void ipw_reset_stats(struct ipw_priv *priv) priv->quality = 0; average_init(&priv->average_missed_beacons); - average_init(&priv->average_rssi); - average_init(&priv->average_noise); + priv->exp_avg_rssi = -60; + priv->exp_avg_noise = -85 + 0x100; priv->last_rate = 0; priv->last_missed_beacons = 0; @@ -4008,7 +4179,7 @@ static void ipw_gather_stats(struct ipw_priv *priv) IPW_DEBUG_STATS("Tx quality : %3d%% (%u errors, %u packets)\n", tx_quality, tx_failures_delta, tx_packets_delta); - rssi = average_value(&priv->average_rssi); + rssi = priv->exp_avg_rssi; signal_quality = (100 * (priv->ieee->perfect_rssi - priv->ieee->worst_rssi) * @@ -4185,7 +4356,7 @@ static void ipw_rx_notification(struct ipw_priv *priv, queue_work(priv->workqueue, &priv->system_config); -#ifdef CONFIG_IPW_QOS +#ifdef CONFIG_IPW2200_QOS #define IPW_GET_PACKET_STYPE(x) WLAN_FC_GET_STYPE( \ le16_to_cpu(((struct ieee80211_hdr *)(x))->frame_ctl)) if ((priv->status & STATUS_AUTH) && @@ -4482,6 +4653,24 @@ static void ipw_rx_notification(struct ipw_priv *priv, && priv->status & STATUS_ASSOCIATED) queue_delayed_work(priv->workqueue, &priv->request_scan, HZ); + + /* Send an empty event to user space. + * We don't send the received data on the event because + * it would require us to do complex transcoding, and + * we want to minimise the work done in the irq handler + * Use a request to extract the data. + * Also, we generate this even for any scan, regardless + * on how the scan was initiated. User space can just + * sync on periodic scan to get fresh data... + * Jean II */ + if (x->status == SCAN_COMPLETED_STATUS_COMPLETE) { + union iwreq_data wrqu; + + wrqu.data.length = 0; + wrqu.data.flags = 0; + wireless_send_event(priv->net_dev, SIOCGIWSCAN, + &wrqu, NULL); + } break; } @@ -4577,11 +4766,10 @@ static void ipw_rx_notification(struct ipw_priv *priv, case HOST_NOTIFICATION_NOISE_STATS:{ if (notif->size == sizeof(u32)) { - priv->last_noise = - (u8) (le32_to_cpu(notif->u.noise.value) & - 0xff); - average_add(&priv->average_noise, - priv->last_noise); + priv->exp_avg_noise = + exponential_average(priv->exp_avg_noise, + (u8) (le32_to_cpu(notif->u.noise.value) & 0xff), + DEPTH_NOISE); break; } @@ -6170,8 +6358,6 @@ static void ipw_wpa_assoc_frame(struct ipw_priv *priv, char *wpa_ie, { /* make sure WPA is enabled */ ipw_wpa_enable(priv, 1); - - ipw_disassociate(priv); } static int ipw_set_rsn_capa(struct ipw_priv *priv, @@ -6365,6 +6551,7 @@ static int ipw_wx_set_auth(struct net_device *dev, case IW_AUTH_WPA_ENABLED: ret = ipw_wpa_enable(priv, param->value); + ipw_disassociate(priv); break; case IW_AUTH_RX_UNENCRYPTED_EAPOL: @@ -6506,7 +6693,7 @@ static int ipw_wx_set_mlme(struct net_device *dev, return 0; } -#ifdef CONFIG_IPW_QOS +#ifdef CONFIG_IPW2200_QOS /* QoS */ /* @@ -6853,61 +7040,55 @@ static int ipw_get_tx_queue_number(struct ipw_priv *priv, u16 priority) return from_priority_to_tx_queue[priority] - 1; } -/* -* add QoS parameter to the TX command -*/ -static int ipw_qos_set_tx_queue_command(struct ipw_priv *priv, - u16 priority, - struct tfd_data *tfd, u8 unicast) +static int ipw_is_qos_active(struct net_device *dev, + struct sk_buff *skb) { - int ret = 0; - int tx_queue_id = 0; + struct ipw_priv *priv = ieee80211_priv(dev); struct ieee80211_qos_data *qos_data = NULL; int active, supported; - unsigned long flags; + u8 *daddr = skb->data + ETH_ALEN; + int unicast = !is_multicast_ether_addr(daddr); if (!(priv->status & STATUS_ASSOCIATED)) return 0; qos_data = &priv->assoc_network->qos_data; - spin_lock_irqsave(&priv->ieee->lock, flags); - if (priv->ieee->iw_mode == IW_MODE_ADHOC) { if (unicast == 0) qos_data->active = 0; else qos_data->active = qos_data->supported; } - active = qos_data->active; supported = qos_data->supported; - - spin_unlock_irqrestore(&priv->ieee->lock, flags); - IPW_DEBUG_QOS("QoS %d network is QoS active %d supported %d " "unicast %d\n", priv->qos_data.qos_enable, active, supported, unicast); - if (active && priv->qos_data.qos_enable) { - ret = from_priority_to_tx_queue[priority]; - tx_queue_id = ret - 1; - IPW_DEBUG_QOS("QoS packet priority is %d \n", priority); - if (priority <= 7) { - tfd->tx_flags_ext |= DCT_FLAG_EXT_QOS_ENABLED; - tfd->tfd.tfd_26.mchdr.qos_ctrl = priority; - tfd->tfd.tfd_26.mchdr.frame_ctl |= - IEEE80211_STYPE_QOS_DATA; - - if (priv->qos_data.qos_no_ack_mask & - (1UL << tx_queue_id)) { - tfd->tx_flags &= ~DCT_FLAG_ACK_REQD; - tfd->tfd.tfd_26.mchdr.qos_ctrl |= - CTRL_QOS_NO_ACK; - } - } - } + if (active && priv->qos_data.qos_enable) + return 1; - return ret; + return 0; + +} +/* +* add QoS parameter to the TX command +*/ +static int ipw_qos_set_tx_queue_command(struct ipw_priv *priv, + u16 priority, + struct tfd_data *tfd) +{ + int tx_queue_id = 0; + + + tx_queue_id = from_priority_to_tx_queue[priority] - 1; + tfd->tx_flags_ext |= DCT_FLAG_EXT_QOS_ENABLED; + + if (priv->qos_data.qos_no_ack_mask & (1UL << tx_queue_id)) { + tfd->tx_flags &= ~DCT_FLAG_ACK_REQD; + tfd->tfd.tfd_26.mchdr.qos_ctrl |= CTRL_QOS_NO_ACK; + } + return 0; } /* @@ -6977,7 +7158,7 @@ static int ipw_send_qos_info_command(struct ipw_priv *priv, struct ieee80211_qos qos_param); } -#endif /* CONFIG_IPW_QOS */ +#endif /* CONFIG_IPW2200_QOS */ static int ipw_associate_network(struct ipw_priv *priv, struct ieee80211_network *network, @@ -7116,7 +7297,7 @@ static int ipw_associate_network(struct ipw_priv *priv, else priv->sys_config.answer_broadcast_ssid_probe = 0; - err = ipw_send_system_config(priv, &priv->sys_config); + err = ipw_send_system_config(priv); if (err) { IPW_DEBUG_HC("Attempt to send sys config command failed.\n"); return err; @@ -7141,7 +7322,7 @@ static int ipw_associate_network(struct ipw_priv *priv, priv->assoc_network = network; -#ifdef CONFIG_IPW_QOS +#ifdef CONFIG_IPW2200_QOS ipw_qos_association(priv, network); #endif @@ -7415,7 +7596,7 @@ static void ipw_handle_data_packet(struct ipw_priv *priv, } } -#ifdef CONFIG_IEEE80211_RADIOTAP +#ifdef CONFIG_IPW2200_RADIOTAP static void ipw_handle_data_packet_monitor(struct ipw_priv *priv, struct ipw_rx_mem_buffer *rxb, struct ieee80211_rx_stats *stats) @@ -7432,15 +7613,7 @@ static void ipw_handle_data_packet_monitor(struct ipw_priv *priv, /* Magic struct that slots into the radiotap header -- no reason * to build this manually element by element, we can write it much * more efficiently than we can parse it. ORDER MATTERS HERE */ - struct ipw_rt_hdr { - struct ieee80211_radiotap_header rt_hdr; - u8 rt_flags; /* radiotap packet flags */ - u8 rt_rate; /* rate in 500kb/s */ - u16 rt_channel; /* channel in mhz */ - u16 rt_chbitmask; /* channel bitfield */ - s8 rt_dbmsignal; /* signal in dbM, kluged to signed */ - u8 rt_antenna; /* antenna number */ - } *ipw_rt; + struct ipw_rt_hdr *ipw_rt; short len = le16_to_cpu(pkt->u.frame.length); @@ -7494,9 +7667,11 @@ static void ipw_handle_data_packet_monitor(struct ipw_priv *priv, /* Big bitfield of all the fields we provide in radiotap */ ipw_rt->rt_hdr.it_present = ((1 << IEEE80211_RADIOTAP_FLAGS) | + (1 << IEEE80211_RADIOTAP_TSFT) | (1 << IEEE80211_RADIOTAP_RATE) | (1 << IEEE80211_RADIOTAP_CHANNEL) | (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | + (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) | (1 << IEEE80211_RADIOTAP_ANTENNA)); /* Zero the flags, we'll add to them as we go */ @@ -7582,6 +7757,217 @@ static void ipw_handle_data_packet_monitor(struct ipw_priv *priv, } #endif +#ifdef CONFIG_IPW2200_PROMISCUOUS +#define ieee80211_is_probe_response(fc) \ + ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT && \ + (fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PROBE_RESP ) + +#define ieee80211_is_management(fc) \ + ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT) + +#define ieee80211_is_control(fc) \ + ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL) + +#define ieee80211_is_data(fc) \ + ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA) + +#define ieee80211_is_assoc_request(fc) \ + ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_ASSOC_REQ) + +#define ieee80211_is_reassoc_request(fc) \ + ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_REASSOC_REQ) + +static void ipw_handle_promiscuous_rx(struct ipw_priv *priv, + struct ipw_rx_mem_buffer *rxb, + struct ieee80211_rx_stats *stats) +{ + struct ipw_rx_packet *pkt = (struct ipw_rx_packet *)rxb->skb->data; + struct ipw_rx_frame *frame = &pkt->u.frame; + struct ipw_rt_hdr *ipw_rt; + + /* First cache any information we need before we overwrite + * the information provided in the skb from the hardware */ + struct ieee80211_hdr *hdr; + u16 channel = frame->received_channel; + u8 phy_flags = frame->antennaAndPhy; + s8 signal = frame->rssi_dbm - IPW_RSSI_TO_DBM; + s8 noise = frame->noise; + u8 rate = frame->rate; + short len = le16_to_cpu(pkt->u.frame.length); + u64 tsf = 0; + struct sk_buff *skb; + int hdr_only = 0; + u16 filter = priv->prom_priv->filter; + + /* If the filter is set to not include Rx frames then return */ + if (filter & IPW_PROM_NO_RX) + return; + + /* We received data from the HW, so stop the watchdog */ + priv->prom_net_dev->trans_start = jiffies; + + if (unlikely((len + IPW_RX_FRAME_SIZE) > skb_tailroom(rxb->skb))) { + priv->prom_priv->ieee->stats.rx_errors++; + IPW_DEBUG_DROP("Corruption detected! Oh no!\n"); + return; + } + + /* We only process data packets if the interface is open */ + if (unlikely(!netif_running(priv->prom_net_dev))) { + priv->prom_priv->ieee->stats.rx_dropped++; + IPW_DEBUG_DROP("Dropping packet while interface is not up.\n"); + return; + } + + /* Libpcap 0.9.3+ can handle variable length radiotap, so we'll use + * that now */ + if (len > IPW_RX_BUF_SIZE - sizeof(struct ipw_rt_hdr)) { + /* FIXME: Should alloc bigger skb instead */ + priv->prom_priv->ieee->stats.rx_dropped++; + IPW_DEBUG_DROP("Dropping too large packet in monitor\n"); + return; + } + + hdr = (void *)rxb->skb->data + IPW_RX_FRAME_SIZE; + if (ieee80211_is_management(hdr->frame_ctl)) { + if (filter & IPW_PROM_NO_MGMT) + return; + if (filter & IPW_PROM_MGMT_HEADER_ONLY) + hdr_only = 1; + } else if (ieee80211_is_control(hdr->frame_ctl)) { + if (filter & IPW_PROM_NO_CTL) + return; + if (filter & IPW_PROM_CTL_HEADER_ONLY) + hdr_only = 1; + } else if (ieee80211_is_data(hdr->frame_ctl)) { + if (filter & IPW_PROM_NO_DATA) + return; + if (filter & IPW_PROM_DATA_HEADER_ONLY) + hdr_only = 1; + } + + /* Copy the SKB since this is for the promiscuous side */ + skb = skb_copy(rxb->skb, GFP_ATOMIC); + if (skb == NULL) { + IPW_ERROR("skb_clone failed for promiscuous copy.\n"); + return; + } + + /* copy the frame data to write after where the radiotap header goes */ + ipw_rt = (void *)skb->data; + + if (hdr_only) + len = ieee80211_get_hdrlen(hdr->frame_ctl); + + memcpy(ipw_rt->payload, hdr, len); + + /* Zero the radiotap static buffer ... We only need to zero the bytes + * NOT part of our real header, saves a little time. + * + * No longer necessary since we fill in all our data. Purge before + * merging patch officially. + * memset(rxb->skb->data + sizeof(struct ipw_rt_hdr), 0, + * IEEE80211_RADIOTAP_HDRLEN - sizeof(struct ipw_rt_hdr)); + */ + + ipw_rt->rt_hdr.it_version = PKTHDR_RADIOTAP_VERSION; + ipw_rt->rt_hdr.it_pad = 0; /* always good to zero */ + ipw_rt->rt_hdr.it_len = sizeof(*ipw_rt); /* total header+data */ + + /* Set the size of the skb to the size of the frame */ + skb_put(skb, ipw_rt->rt_hdr.it_len + len); + + /* Big bitfield of all the fields we provide in radiotap */ + ipw_rt->rt_hdr.it_present = + ((1 << IEEE80211_RADIOTAP_FLAGS) | + (1 << IEEE80211_RADIOTAP_TSFT) | + (1 << IEEE80211_RADIOTAP_RATE) | + (1 << IEEE80211_RADIOTAP_CHANNEL) | + (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | + (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) | + (1 << IEEE80211_RADIOTAP_ANTENNA)); + + /* Zero the flags, we'll add to them as we go */ + ipw_rt->rt_flags = 0; + + ipw_rt->rt_tsf = tsf; + + /* Convert to DBM */ + ipw_rt->rt_dbmsignal = signal; + ipw_rt->rt_dbmnoise = noise; + + /* Convert the channel data and set the flags */ + ipw_rt->rt_channel = cpu_to_le16(ieee80211chan2mhz(channel)); + if (channel > 14) { /* 802.11a */ + ipw_rt->rt_chbitmask = + cpu_to_le16((IEEE80211_CHAN_OFDM | IEEE80211_CHAN_5GHZ)); + } else if (phy_flags & (1 << 5)) { /* 802.11b */ + ipw_rt->rt_chbitmask = + cpu_to_le16((IEEE80211_CHAN_CCK | IEEE80211_CHAN_2GHZ)); + } else { /* 802.11g */ + ipw_rt->rt_chbitmask = + (IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ); + } + + /* set the rate in multiples of 500k/s */ + switch (rate) { + case IPW_TX_RATE_1MB: + ipw_rt->rt_rate = 2; + break; + case IPW_TX_RATE_2MB: + ipw_rt->rt_rate = 4; + break; + case IPW_TX_RATE_5MB: + ipw_rt->rt_rate = 10; + break; + case IPW_TX_RATE_6MB: + ipw_rt->rt_rate = 12; + break; + case IPW_TX_RATE_9MB: + ipw_rt->rt_rate = 18; + break; + case IPW_TX_RATE_11MB: + ipw_rt->rt_rate = 22; + break; + case IPW_TX_RATE_12MB: + ipw_rt->rt_rate = 24; + break; + case IPW_TX_RATE_18MB: + ipw_rt->rt_rate = 36; + break; + case IPW_TX_RATE_24MB: + ipw_rt->rt_rate = 48; + break; + case IPW_TX_RATE_36MB: + ipw_rt->rt_rate = 72; + break; + case IPW_TX_RATE_48MB: + ipw_rt->rt_rate = 96; + break; + case IPW_TX_RATE_54MB: + ipw_rt->rt_rate = 108; + break; + default: + ipw_rt->rt_rate = 0; + break; + } + + /* antenna number */ + ipw_rt->rt_antenna = (phy_flags & 3); + + /* set the preamble flag if we have it */ + if (phy_flags & (1 << 6)) + ipw_rt->rt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; + + IPW_DEBUG_RX("Rx packet of %d bytes.\n", skb->len); + + if (!ieee80211_rx(priv->prom_priv->ieee, skb, stats)) { + priv->prom_priv->ieee->stats.rx_errors++; + dev_kfree_skb_any(skb); + } +} +#endif + static int is_network_packet(struct ipw_priv *priv, struct ieee80211_hdr_4addr *header) { @@ -7808,15 +8194,21 @@ static void ipw_rx(struct ipw_priv *priv) priv->rx_packets++; +#ifdef CONFIG_IPW2200_PROMISCUOUS + if (priv->prom_net_dev && netif_running(priv->prom_net_dev)) + ipw_handle_promiscuous_rx(priv, rxb, &stats); +#endif + #ifdef CONFIG_IPW2200_MONITOR if (priv->ieee->iw_mode == IW_MODE_MONITOR) { -#ifdef CONFIG_IEEE80211_RADIOTAP - ipw_handle_data_packet_monitor(priv, - rxb, - &stats); +#ifdef CONFIG_IPW2200_RADIOTAP + + ipw_handle_data_packet_monitor(priv, + rxb, + &stats); #else - ipw_handle_data_packet(priv, rxb, - &stats); + ipw_handle_data_packet(priv, rxb, + &stats); #endif break; } @@ -7837,9 +8229,9 @@ static void ipw_rx(struct ipw_priv *priv) if (network_packet && priv->assoc_network) { priv->assoc_network->stats.rssi = stats.rssi; - average_add(&priv->average_rssi, - stats.rssi); - priv->last_rx_rssi = stats.rssi; + priv->exp_avg_rssi = + exponential_average(priv->exp_avg_rssi, + stats.rssi, DEPTH_RSSI); } IPW_DEBUG_RX("Frame: len=%u\n", @@ -7982,10 +8374,10 @@ static int ipw_sw_reset(struct ipw_priv *priv, int option) IPW_DEBUG_INFO("Bind to static channel %d\n", channel); /* TODO: Validate that provided channel is in range */ } -#ifdef CONFIG_IPW_QOS +#ifdef CONFIG_IPW2200_QOS ipw_qos_init(priv, qos_enable, qos_burst_enable, burst_duration_CCK, burst_duration_OFDM); -#endif /* CONFIG_IPW_QOS */ +#endif /* CONFIG_IPW2200_QOS */ switch (mode) { case 1: @@ -7996,7 +8388,7 @@ static int ipw_sw_reset(struct ipw_priv *priv, int option) #ifdef CONFIG_IPW2200_MONITOR case 2: priv->ieee->iw_mode = IW_MODE_MONITOR; -#ifdef CONFIG_IEEE80211_RADIOTAP +#ifdef CONFIG_IPW2200_RADIOTAP priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP; #else priv->net_dev->type = ARPHRD_IEEE80211; @@ -8251,7 +8643,7 @@ static int ipw_wx_set_mode(struct net_device *dev, priv->net_dev->type = ARPHRD_ETHER; if (wrqu->mode == IW_MODE_MONITOR) -#ifdef CONFIG_IEEE80211_RADIOTAP +#ifdef CONFIG_IPW2200_RADIOTAP priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP; #else priv->net_dev->type = ARPHRD_IEEE80211; @@ -8379,7 +8771,8 @@ static int ipw_wx_get_range(struct net_device *dev, /* Event capability (kernel + driver) */ range->event_capa[0] = (IW_EVENT_CAPA_K_0 | IW_EVENT_CAPA_MASK(SIOCGIWTHRSPY) | - IW_EVENT_CAPA_MASK(SIOCGIWAP)); + IW_EVENT_CAPA_MASK(SIOCGIWAP) | + IW_EVENT_CAPA_MASK(SIOCGIWSCAN)); range->event_capa[1] = IW_EVENT_CAPA_K_1; range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 | @@ -8734,6 +9127,7 @@ static int ipw_wx_get_rate(struct net_device *dev, struct ipw_priv *priv = ieee80211_priv(dev); mutex_lock(&priv->mutex); wrqu->bitrate.value = priv->last_rate; + wrqu->bitrate.fixed = (priv->config & CFG_FIXED_RATE) ? 1 : 0; mutex_unlock(&priv->mutex); IPW_DEBUG_WX("GET Rate -> %d \n", wrqu->bitrate.value); return 0; @@ -9351,7 +9745,7 @@ static int ipw_wx_set_monitor(struct net_device *dev, IPW_DEBUG_WX("SET MONITOR: %d %d\n", enable, parms[1]); if (enable) { if (priv->ieee->iw_mode != IW_MODE_MONITOR) { -#ifdef CONFIG_IEEE80211_RADIOTAP +#ifdef CONFIG_IPW2200_RADIOTAP priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP; #else priv->net_dev->type = ARPHRD_IEEE80211; @@ -9579,8 +9973,8 @@ static struct iw_statistics *ipw_get_wireless_stats(struct net_device *dev) } wstats->qual.qual = priv->quality; - wstats->qual.level = average_value(&priv->average_rssi); - wstats->qual.noise = average_value(&priv->average_noise); + wstats->qual.level = priv->exp_avg_rssi; + wstats->qual.noise = priv->exp_avg_noise; wstats->qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED | IW_QUAL_NOISE_UPDATED | IW_QUAL_DBM; @@ -9608,7 +10002,9 @@ static void init_sys_config(struct ipw_sys_config *sys_config) sys_config->disable_unicast_decryption = 1; sys_config->exclude_multicast_unencrypted = 0; sys_config->disable_multicast_decryption = 1; - sys_config->antenna_diversity = CFG_SYS_ANTENNA_SLOW_DIV; + if (antenna < CFG_SYS_ANTENNA_BOTH || antenna > CFG_SYS_ANTENNA_B) + antenna = CFG_SYS_ANTENNA_BOTH; + sys_config->antenna_diversity = antenna; sys_config->pass_crc_to_host = 0; /* TODO: See if 1 gives us FCS */ sys_config->dot11g_auto_detection = 0; sys_config->enable_cts_to_self = 0; @@ -9647,11 +10043,11 @@ we need to heavily modify the ieee80211_skb_to_txb. static int ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb, int pri) { - struct ieee80211_hdr_3addr *hdr = (struct ieee80211_hdr_3addr *) + struct ieee80211_hdr_3addrqos *hdr = (struct ieee80211_hdr_3addrqos *) txb->fragments[0]->data; int i = 0; struct tfd_frame *tfd; -#ifdef CONFIG_IPW_QOS +#ifdef CONFIG_IPW2200_QOS int tx_id = ipw_get_tx_queue_number(priv, pri); struct clx2_tx_queue *txq = &priv->txq[tx_id]; #else @@ -9662,9 +10058,9 @@ static int ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb, u16 remaining_bytes; int fc; + hdr_len = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); switch (priv->ieee->iw_mode) { case IW_MODE_ADHOC: - hdr_len = IEEE80211_3ADDR_LEN; unicast = !is_multicast_ether_addr(hdr->addr1); id = ipw_find_station(priv, hdr->addr1); if (id == IPW_INVALID_STATION) { @@ -9681,7 +10077,6 @@ static int ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb, case IW_MODE_INFRA: default: unicast = !is_multicast_ether_addr(hdr->addr3); - hdr_len = IEEE80211_3ADDR_LEN; id = 0; break; } @@ -9759,9 +10154,10 @@ static int ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb, /* No hardware encryption */ tfd->u.data.tx_flags |= DCT_FLAG_NO_WEP; -#ifdef CONFIG_IPW_QOS - ipw_qos_set_tx_queue_command(priv, pri, &(tfd->u.data), unicast); -#endif /* CONFIG_IPW_QOS */ +#ifdef CONFIG_IPW2200_QOS + if (fc & IEEE80211_STYPE_QOS_DATA) + ipw_qos_set_tx_queue_command(priv, pri, &(tfd->u.data)); +#endif /* CONFIG_IPW2200_QOS */ /* payload */ tfd->u.data.num_chunks = cpu_to_le32(min((u8) (NUM_TFD_CHUNKS - 2), @@ -9841,12 +10237,12 @@ static int ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb, static int ipw_net_is_queue_full(struct net_device *dev, int pri) { struct ipw_priv *priv = ieee80211_priv(dev); -#ifdef CONFIG_IPW_QOS +#ifdef CONFIG_IPW2200_QOS int tx_id = ipw_get_tx_queue_number(priv, pri); struct clx2_tx_queue *txq = &priv->txq[tx_id]; #else struct clx2_tx_queue *txq = &priv->txq[0]; -#endif /* CONFIG_IPW_QOS */ +#endif /* CONFIG_IPW2200_QOS */ if (ipw_queue_space(&txq->q) < txq->q.high_mark) return 1; @@ -9854,6 +10250,88 @@ static int ipw_net_is_queue_full(struct net_device *dev, int pri) return 0; } +#ifdef CONFIG_IPW2200_PROMISCUOUS +static void ipw_handle_promiscuous_tx(struct ipw_priv *priv, + struct ieee80211_txb *txb) +{ + struct ieee80211_rx_stats dummystats; + struct ieee80211_hdr *hdr; + u8 n; + u16 filter = priv->prom_priv->filter; + int hdr_only = 0; + + if (filter & IPW_PROM_NO_TX) + return; + + memset(&dummystats, 0, sizeof(dummystats)); + + /* Filtering of fragment chains is done agains the first fragment */ + hdr = (void *)txb->fragments[0]->data; + if (ieee80211_is_management(hdr->frame_ctl)) { + if (filter & IPW_PROM_NO_MGMT) + return; + if (filter & IPW_PROM_MGMT_HEADER_ONLY) + hdr_only = 1; + } else if (ieee80211_is_control(hdr->frame_ctl)) { + if (filter & IPW_PROM_NO_CTL) + return; + if (filter & IPW_PROM_CTL_HEADER_ONLY) + hdr_only = 1; + } else if (ieee80211_is_data(hdr->frame_ctl)) { + if (filter & IPW_PROM_NO_DATA) + return; + if (filter & IPW_PROM_DATA_HEADER_ONLY) + hdr_only = 1; + } + + for(n=0; nnr_frags; ++n) { + struct sk_buff *src = txb->fragments[n]; + struct sk_buff *dst; + struct ieee80211_radiotap_header *rt_hdr; + int len; + + if (hdr_only) { + hdr = (void *)src->data; + len = ieee80211_get_hdrlen(hdr->frame_ctl); + } else + len = src->len; + + dst = alloc_skb( + len + IEEE80211_RADIOTAP_HDRLEN, GFP_ATOMIC); + if (!dst) continue; + + rt_hdr = (void *)skb_put(dst, sizeof(*rt_hdr)); + + rt_hdr->it_version = PKTHDR_RADIOTAP_VERSION; + rt_hdr->it_pad = 0; + rt_hdr->it_present = 0; /* after all, it's just an idea */ + rt_hdr->it_present |= (1 << IEEE80211_RADIOTAP_CHANNEL); + + *(u16*)skb_put(dst, sizeof(u16)) = cpu_to_le16( + ieee80211chan2mhz(priv->channel)); + if (priv->channel > 14) /* 802.11a */ + *(u16*)skb_put(dst, sizeof(u16)) = + cpu_to_le16(IEEE80211_CHAN_OFDM | + IEEE80211_CHAN_5GHZ); + else if (priv->ieee->mode == IEEE_B) /* 802.11b */ + *(u16*)skb_put(dst, sizeof(u16)) = + cpu_to_le16(IEEE80211_CHAN_CCK | + IEEE80211_CHAN_2GHZ); + else /* 802.11g */ + *(u16*)skb_put(dst, sizeof(u16)) = + cpu_to_le16(IEEE80211_CHAN_OFDM | + IEEE80211_CHAN_2GHZ); + + rt_hdr->it_len = dst->len; + + memcpy(skb_put(dst, len), src->data, len); + + if (!ieee80211_rx(priv->prom_priv->ieee, dst, &dummystats)) + dev_kfree_skb_any(dst); + } +} +#endif + static int ipw_net_hard_start_xmit(struct ieee80211_txb *txb, struct net_device *dev, int pri) { @@ -9871,6 +10349,11 @@ static int ipw_net_hard_start_xmit(struct ieee80211_txb *txb, goto fail_unlock; } +#ifdef CONFIG_IPW2200_PROMISCUOUS + if (rtap_iface && netif_running(priv->prom_net_dev)) + ipw_handle_promiscuous_tx(priv, txb); +#endif + ret = ipw_tx_skb(priv, txb, pri); if (ret == NETDEV_TX_OK) __ipw_led_activity_on(priv); @@ -9991,7 +10474,7 @@ static irqreturn_t ipw_isr(int irq, void *data, struct pt_regs *regs) if (!priv) return IRQ_NONE; - spin_lock(&priv->lock); + spin_lock(&priv->irq_lock); if (!(priv->status & STATUS_INT_ENABLED)) { /* Shared IRQ */ @@ -10013,7 +10496,7 @@ static irqreturn_t ipw_isr(int irq, void *data, struct pt_regs *regs) } /* tell the device to stop sending interrupts */ - ipw_disable_interrupts(priv); + __ipw_disable_interrupts(priv); /* ack current interrupts */ inta &= (IPW_INTA_MASK_ALL & inta_mask); @@ -10024,11 +10507,11 @@ static irqreturn_t ipw_isr(int irq, void *data, struct pt_regs *regs) tasklet_schedule(&priv->irq_tasklet); - spin_unlock(&priv->lock); + spin_unlock(&priv->irq_lock); return IRQ_HANDLED; none: - spin_unlock(&priv->lock); + spin_unlock(&priv->irq_lock); return IRQ_NONE; } @@ -10169,10 +10652,10 @@ static int ipw_setup_deferred_work(struct ipw_priv *priv) INIT_WORK(&priv->merge_networks, (void (*)(void *))ipw_merge_adhoc_network, priv); -#ifdef CONFIG_IPW_QOS +#ifdef CONFIG_IPW2200_QOS INIT_WORK(&priv->qos_activate, (void (*)(void *))ipw_bg_qos_activate, priv); -#endif /* CONFIG_IPW_QOS */ +#endif /* CONFIG_IPW2200_QOS */ tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long)) ipw_irq_tasklet, (unsigned long)priv); @@ -10318,12 +10801,21 @@ static int ipw_config(struct ipw_priv *priv) |= CFG_BT_COEXISTENCE_OOB; } +#ifdef CONFIG_IPW2200_PROMISCUOUS + if (priv->prom_net_dev && netif_running(priv->prom_net_dev)) { + priv->sys_config.accept_all_data_frames = 1; + priv->sys_config.accept_non_directed_frames = 1; + priv->sys_config.accept_all_mgmt_bcpr = 1; + priv->sys_config.accept_all_mgmt_frames = 1; + } +#endif + if (priv->ieee->iw_mode == IW_MODE_ADHOC) priv->sys_config.answer_broadcast_ssid_probe = 1; else priv->sys_config.answer_broadcast_ssid_probe = 0; - if (ipw_send_system_config(priv, &priv->sys_config)) + if (ipw_send_system_config(priv)) goto error; init_supported_rates(priv, &priv->rates); @@ -10335,10 +10827,10 @@ static int ipw_config(struct ipw_priv *priv) if (ipw_send_rts_threshold(priv, priv->rts_threshold)) goto error; } -#ifdef CONFIG_IPW_QOS +#ifdef CONFIG_IPW2200_QOS IPW_DEBUG_QOS("QoS: call ipw_qos_activate\n"); ipw_qos_activate(priv, NULL); -#endif /* CONFIG_IPW_QOS */ +#endif /* CONFIG_IPW2200_QOS */ if (ipw_set_random_seed(priv)) goto error; @@ -10639,6 +11131,7 @@ static int ipw_up(struct ipw_priv *priv) if (priv->cmdlog == NULL) { IPW_ERROR("Error allocating %d command log entries.\n", cmdlog); + return -ENOMEM; } else { memset(priv->cmdlog, 0, sizeof(*priv->cmdlog) * cmdlog); priv->cmdlog_len = cmdlog; @@ -10860,6 +11353,10 @@ static struct attribute *ipw_sysfs_entries[] = { &dev_attr_led.attr, &dev_attr_speed_scan.attr, &dev_attr_net_stats.attr, +#ifdef CONFIG_IPW2200_PROMISCUOUS + &dev_attr_rtap_iface.attr, + &dev_attr_rtap_filter.attr, +#endif NULL }; @@ -10868,6 +11365,109 @@ static struct attribute_group ipw_attribute_group = { .attrs = ipw_sysfs_entries, }; +#ifdef CONFIG_IPW2200_PROMISCUOUS +static int ipw_prom_open(struct net_device *dev) +{ + struct ipw_prom_priv *prom_priv = ieee80211_priv(dev); + struct ipw_priv *priv = prom_priv->priv; + + IPW_DEBUG_INFO("prom dev->open\n"); + netif_carrier_off(dev); + netif_stop_queue(dev); + + if (priv->ieee->iw_mode != IW_MODE_MONITOR) { + priv->sys_config.accept_all_data_frames = 1; + priv->sys_config.accept_non_directed_frames = 1; + priv->sys_config.accept_all_mgmt_bcpr = 1; + priv->sys_config.accept_all_mgmt_frames = 1; + + ipw_send_system_config(priv); + } + + return 0; +} + +static int ipw_prom_stop(struct net_device *dev) +{ + struct ipw_prom_priv *prom_priv = ieee80211_priv(dev); + struct ipw_priv *priv = prom_priv->priv; + + IPW_DEBUG_INFO("prom dev->stop\n"); + + if (priv->ieee->iw_mode != IW_MODE_MONITOR) { + priv->sys_config.accept_all_data_frames = 0; + priv->sys_config.accept_non_directed_frames = 0; + priv->sys_config.accept_all_mgmt_bcpr = 0; + priv->sys_config.accept_all_mgmt_frames = 0; + + ipw_send_system_config(priv); + } + + return 0; +} + +static int ipw_prom_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) +{ + IPW_DEBUG_INFO("prom dev->xmit\n"); + netif_stop_queue(dev); + return -EOPNOTSUPP; +} + +static struct net_device_stats *ipw_prom_get_stats(struct net_device *dev) +{ + struct ipw_prom_priv *prom_priv = ieee80211_priv(dev); + return &prom_priv->ieee->stats; +} + +static int ipw_prom_alloc(struct ipw_priv *priv) +{ + int rc = 0; + + if (priv->prom_net_dev) + return -EPERM; + + priv->prom_net_dev = alloc_ieee80211(sizeof(struct ipw_prom_priv)); + if (priv->prom_net_dev == NULL) + return -ENOMEM; + + priv->prom_priv = ieee80211_priv(priv->prom_net_dev); + priv->prom_priv->ieee = netdev_priv(priv->prom_net_dev); + priv->prom_priv->priv = priv; + + strcpy(priv->prom_net_dev->name, "rtap%d"); + + priv->prom_net_dev->type = ARPHRD_IEEE80211_RADIOTAP; + priv->prom_net_dev->open = ipw_prom_open; + priv->prom_net_dev->stop = ipw_prom_stop; + priv->prom_net_dev->get_stats = ipw_prom_get_stats; + priv->prom_net_dev->hard_start_xmit = ipw_prom_hard_start_xmit; + + priv->prom_priv->ieee->iw_mode = IW_MODE_MONITOR; + + rc = register_netdev(priv->prom_net_dev); + if (rc) { + free_ieee80211(priv->prom_net_dev); + priv->prom_net_dev = NULL; + return rc; + } + + return 0; +} + +static void ipw_prom_free(struct ipw_priv *priv) +{ + if (!priv->prom_net_dev) + return; + + unregister_netdev(priv->prom_net_dev); + free_ieee80211(priv->prom_net_dev); + + priv->prom_net_dev = NULL; +} + +#endif + + static int ipw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { int err = 0; @@ -10891,6 +11491,7 @@ static int ipw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) #ifdef CONFIG_IPW2200_DEBUG ipw_debug_level = debug; #endif + spin_lock_init(&priv->irq_lock); spin_lock_init(&priv->lock); for (i = 0; i < IPW_IBSS_MAC_HASH_SIZE; i++) INIT_LIST_HEAD(&priv->ibss_mac_hash[i]); @@ -10944,7 +11545,7 @@ static int ipw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ipw_sw_reset(priv, 1); - err = request_irq(pdev->irq, ipw_isr, SA_SHIRQ, DRV_NAME, priv); + err = request_irq(pdev->irq, ipw_isr, IRQF_SHARED, DRV_NAME, priv); if (err) { IPW_ERROR("Error allocating IRQ %d\n", pdev->irq); goto out_destroy_workqueue; @@ -10959,11 +11560,12 @@ static int ipw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) priv->ieee->set_security = shim__set_security; priv->ieee->is_queue_full = ipw_net_is_queue_full; -#ifdef CONFIG_IPW_QOS +#ifdef CONFIG_IPW2200_QOS + priv->ieee->is_qos_active = ipw_is_qos_active; priv->ieee->handle_probe_response = ipw_handle_beacon; priv->ieee->handle_beacon = ipw_handle_probe_response; priv->ieee->handle_assoc_response = ipw_handle_assoc_response; -#endif /* CONFIG_IPW_QOS */ +#endif /* CONFIG_IPW2200_QOS */ priv->ieee->perfect_rssi = -20; priv->ieee->worst_rssi = -85; @@ -10997,6 +11599,18 @@ static int ipw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) goto out_remove_sysfs; } +#ifdef CONFIG_IPW2200_PROMISCUOUS + if (rtap_iface) { + err = ipw_prom_alloc(priv); + if (err) { + IPW_ERROR("Failed to register promiscuous network " + "device (error %d).\n", err); + unregister_netdev(priv->net_dev); + goto out_remove_sysfs; + } + } +#endif + printk(KERN_INFO DRV_NAME ": Detected geography %s (%d 802.11bg " "channels, %d 802.11a channels)\n", priv->ieee->geo.name, priv->ieee->geo.bg_channels, @@ -11071,10 +11685,12 @@ static void ipw_pci_remove(struct pci_dev *pdev) } } - if (priv->error) { - ipw_free_error_log(priv->error); - priv->error = NULL; - } + kfree(priv->error); + priv->error = NULL; + +#ifdef CONFIG_IPW2200_PROMISCUOUS + ipw_prom_free(priv); +#endif free_irq(pdev->irq, priv); iounmap(priv->hw_base); @@ -11200,7 +11816,12 @@ MODULE_PARM_DESC(debug, "debug output mask"); module_param(channel, int, 0444); MODULE_PARM_DESC(channel, "channel to limit associate to (default 0 [ANY])"); -#ifdef CONFIG_IPW_QOS +#ifdef CONFIG_IPW2200_PROMISCUOUS +module_param(rtap_iface, int, 0444); +MODULE_PARM_DESC(rtap_iface, "create the rtap interface (1 - create, default 0)"); +#endif + +#ifdef CONFIG_IPW2200_QOS module_param(qos_enable, int, 0444); MODULE_PARM_DESC(qos_enable, "enable all QoS functionalitis"); @@ -11215,7 +11836,7 @@ MODULE_PARM_DESC(burst_duration_CCK, "set CCK burst value"); module_param(burst_duration_OFDM, int, 0444); MODULE_PARM_DESC(burst_duration_OFDM, "set OFDM burst value"); -#endif /* CONFIG_IPW_QOS */ +#endif /* CONFIG_IPW2200_QOS */ #ifdef CONFIG_IPW2200_MONITOR module_param(mode, int, 0444); @@ -11238,5 +11859,8 @@ MODULE_PARM_DESC(cmdlog, module_param(roaming, int, 0444); MODULE_PARM_DESC(roaming, "enable roaming support (default on)"); +module_param(antenna, int, 0444); +MODULE_PARM_DESC(antenna, "select antenna 1=Main, 3=Aux, default 0 [both], 2=slow_diversity (choose the one with lower background noise)"); + module_exit(ipw_exit); module_init(ipw_init); diff --git a/drivers/net/wireless/ipw2200.h b/drivers/net/wireless/ipw2200.h index 4b9804900..8b1cd7c74 100644 --- a/drivers/net/wireless/ipw2200.h +++ b/drivers/net/wireless/ipw2200.h @@ -31,7 +31,6 @@ #include #include -#include #include #include @@ -789,7 +788,7 @@ struct ipw_sys_config { u8 bt_coexist_collision_thr; u8 silence_threshold; u8 accept_all_mgmt_bcpr; - u8 accept_all_mgtm_frames; + u8 accept_all_mgmt_frames; u8 pass_noise_stats_to_host; u8 reserved3; } __attribute__ ((packed)); @@ -1122,17 +1121,70 @@ struct ipw_fw_error { u8 payload[0]; } __attribute__ ((packed)); +#ifdef CONFIG_IPW2200_PROMISCUOUS + +enum ipw_prom_filter { + IPW_PROM_CTL_HEADER_ONLY = (1 << 0), + IPW_PROM_MGMT_HEADER_ONLY = (1 << 1), + IPW_PROM_DATA_HEADER_ONLY = (1 << 2), + IPW_PROM_ALL_HEADER_ONLY = 0xf, /* bits 0..3 */ + IPW_PROM_NO_TX = (1 << 4), + IPW_PROM_NO_RX = (1 << 5), + IPW_PROM_NO_CTL = (1 << 6), + IPW_PROM_NO_MGMT = (1 << 7), + IPW_PROM_NO_DATA = (1 << 8), +}; + +struct ipw_priv; +struct ipw_prom_priv { + struct ipw_priv *priv; + struct ieee80211_device *ieee; + enum ipw_prom_filter filter; + int tx_packets; + int rx_packets; +}; +#endif + +#if defined(CONFIG_IPW2200_RADIOTAP) || defined(CONFIG_IPW2200_PROMISCUOUS) +/* Magic struct that slots into the radiotap header -- no reason + * to build this manually element by element, we can write it much + * more efficiently than we can parse it. ORDER MATTERS HERE + * + * When sent to us via the simulated Rx interface in sysfs, the entire + * structure is provided regardless of any bits unset. + */ +struct ipw_rt_hdr { + struct ieee80211_radiotap_header rt_hdr; + u64 rt_tsf; /* TSF */ + u8 rt_flags; /* radiotap packet flags */ + u8 rt_rate; /* rate in 500kb/s */ + u16 rt_channel; /* channel in mhz */ + u16 rt_chbitmask; /* channel bitfield */ + s8 rt_dbmsignal; /* signal in dbM, kluged to signed */ + s8 rt_dbmnoise; + u8 rt_antenna; /* antenna number */ + u8 payload[0]; /* payload... */ +} __attribute__ ((packed)); +#endif + struct ipw_priv { /* ieee device used by generic ieee processing code */ struct ieee80211_device *ieee; spinlock_t lock; + spinlock_t irq_lock; struct mutex mutex; /* basic pci-network driver stuff */ struct pci_dev *pci_dev; struct net_device *net_dev; +#ifdef CONFIG_IPW2200_PROMISCUOUS + /* Promiscuous mode */ + struct ipw_prom_priv *prom_priv; + struct net_device *prom_net_dev; +#endif + /* pci hardware address support */ void __iomem *hw_base; unsigned long hw_len; @@ -1153,11 +1205,9 @@ struct ipw_priv { u32 config; u32 capability; - u8 last_rx_rssi; - u8 last_noise; struct average average_missed_beacons; - struct average average_rssi; - struct average average_noise; + s16 exp_avg_rssi; + s16 exp_avg_noise; u32 port_type; int rx_bufs_min; /**< minimum number of bufs in Rx queue */ int rx_pend_max; /**< maximum pending buffers for one IRQ */ @@ -1308,6 +1358,29 @@ struct ipw_priv { /* debug macros */ +/* Debug and printf string expansion helpers for printing bitfields */ +#define BIT_FMT8 "%c%c%c%c-%c%c%c%c" +#define BIT_FMT16 BIT_FMT8 ":" BIT_FMT8 +#define BIT_FMT32 BIT_FMT16 " " BIT_FMT16 + +#define BITC(x,y) (((x>>y)&1)?'1':'0') +#define BIT_ARG8(x) \ +BITC(x,7),BITC(x,6),BITC(x,5),BITC(x,4),\ +BITC(x,3),BITC(x,2),BITC(x,1),BITC(x,0) + +#define BIT_ARG16(x) \ +BITC(x,15),BITC(x,14),BITC(x,13),BITC(x,12),\ +BITC(x,11),BITC(x,10),BITC(x,9),BITC(x,8),\ +BIT_ARG8(x) + +#define BIT_ARG32(x) \ +BITC(x,31),BITC(x,30),BITC(x,29),BITC(x,28),\ +BITC(x,27),BITC(x,26),BITC(x,25),BITC(x,24),\ +BITC(x,23),BITC(x,22),BITC(x,21),BITC(x,20),\ +BITC(x,19),BITC(x,18),BITC(x,17),BITC(x,16),\ +BIT_ARG16(x) + + #ifdef CONFIG_IPW2200_DEBUG #define IPW_DEBUG(level, fmt, args...) \ do { if (ipw_debug_level & (level)) \ diff --git a/drivers/net/wireless/netwave_cs.c b/drivers/net/wireless/netwave_cs.c index 9343d9705..36b5e0043 100644 --- a/drivers/net/wireless/netwave_cs.c +++ b/drivers/net/wireless/netwave_cs.c @@ -37,7 +37,6 @@ /* To have statistics (just packets sent) define this */ #undef NETWAVE_STATS -#include #include #include #include diff --git a/drivers/net/wireless/orinoco.c b/drivers/net/wireless/orinoco.c index a5fcfcde6..317ace7f9 100644 --- a/drivers/net/wireless/orinoco.c +++ b/drivers/net/wireless/orinoco.c @@ -76,7 +76,6 @@ #define DRIVER_NAME "orinoco" -#include #include #include #include @@ -201,41 +200,12 @@ static struct { /* Data types */ /********************************************************************/ -/* Used in Event handling. - * We avoid nested structures as they break on ARM -- Moustafa */ -struct hermes_tx_descriptor_802_11 { - /* hermes_tx_descriptor */ - __le16 status; - __le16 reserved1; - __le16 reserved2; - __le32 sw_support; - u8 retry_count; - u8 tx_rate; - __le16 tx_control; - - /* ieee80211_hdr */ +/* Beginning of the Tx descriptor, used in TxExc handling */ +struct hermes_txexc_data { + struct hermes_tx_descriptor desc; __le16 frame_ctl; __le16 duration_id; u8 addr1[ETH_ALEN]; - u8 addr2[ETH_ALEN]; - u8 addr3[ETH_ALEN]; - __le16 seq_ctl; - u8 addr4[ETH_ALEN]; - - __le16 data_len; - - /* ethhdr */ - u8 h_dest[ETH_ALEN]; /* destination eth addr */ - u8 h_source[ETH_ALEN]; /* source ether addr */ - __be16 h_proto; /* packet type ID field */ - - /* p8022_hdr */ - u8 dsap; - u8 ssap; - u8 ctrl; - u8 oui[3]; - - __be16 ethertype; } __attribute__ ((packed)); /* Rx frame header except compatibility 802.3 header */ @@ -450,53 +420,39 @@ static int orinoco_xmit(struct sk_buff *skb, struct net_device *dev) hermes_t *hw = &priv->hw; int err = 0; u16 txfid = priv->txfid; - char *p; struct ethhdr *eh; - int len, data_len, data_off; + int data_off; struct hermes_tx_descriptor desc; unsigned long flags; - TRACE_ENTER(dev->name); - if (! netif_running(dev)) { printk(KERN_ERR "%s: Tx on stopped device!\n", dev->name); - TRACE_EXIT(dev->name); - return 1; + return NETDEV_TX_BUSY; } if (netif_queue_stopped(dev)) { printk(KERN_DEBUG "%s: Tx while transmitter busy!\n", dev->name); - TRACE_EXIT(dev->name); - return 1; + return NETDEV_TX_BUSY; } if (orinoco_lock(priv, &flags) != 0) { printk(KERN_ERR "%s: orinoco_xmit() called while hw_unavailable\n", dev->name); - TRACE_EXIT(dev->name); - return 1; + return NETDEV_TX_BUSY; } if (! netif_carrier_ok(dev) || (priv->iw_mode == IW_MODE_MONITOR)) { /* Oops, the firmware hasn't established a connection, silently drop the packet (this seems to be the safest approach). */ - stats->tx_errors++; - orinoco_unlock(priv, &flags); - dev_kfree_skb(skb); - TRACE_EXIT(dev->name); - return 0; + goto drop; } - /* Length of the packet body */ - /* FIXME: what if the skb is smaller than this? */ - len = max_t(int, ALIGN(skb->len, 2), ETH_ZLEN); - skb = skb_padto(skb, len); - if (skb == NULL) - goto fail; - len -= ETH_HLEN; + /* Check packet length */ + if (skb->len < ETH_HLEN) + goto drop; eh = (struct ethhdr *)skb->data; @@ -507,8 +463,7 @@ static int orinoco_xmit(struct sk_buff *skb, struct net_device *dev) if (net_ratelimit()) printk(KERN_ERR "%s: Error %d writing Tx descriptor " "to BAP\n", dev->name, err); - stats->tx_errors++; - goto fail; + goto busy; } /* Clear the 802.11 header and data length fields - some @@ -519,50 +474,38 @@ static int orinoco_xmit(struct sk_buff *skb, struct net_device *dev) /* Encapsulate Ethernet-II frames */ if (ntohs(eh->h_proto) > ETH_DATA_LEN) { /* Ethernet-II frame */ - struct header_struct hdr; - data_len = len; - data_off = HERMES_802_3_OFFSET + sizeof(hdr); - p = skb->data + ETH_HLEN; - - /* 802.3 header */ - memcpy(hdr.dest, eh->h_dest, ETH_ALEN); - memcpy(hdr.src, eh->h_source, ETH_ALEN); - hdr.len = htons(data_len + ENCAPS_OVERHEAD); - - /* 802.2 header */ - memcpy(&hdr.dsap, &encaps_hdr, sizeof(encaps_hdr)); - - hdr.ethertype = eh->h_proto; - err = hermes_bap_pwrite(hw, USER_BAP, &hdr, sizeof(hdr), - txfid, HERMES_802_3_OFFSET); + struct header_struct { + struct ethhdr eth; /* 802.3 header */ + u8 encap[6]; /* 802.2 header */ + } __attribute__ ((packed)) hdr; + + /* Strip destination and source from the data */ + skb_pull(skb, 2 * ETH_ALEN); + data_off = HERMES_802_2_OFFSET + sizeof(encaps_hdr); + + /* And move them to a separate header */ + memcpy(&hdr.eth, eh, 2 * ETH_ALEN); + hdr.eth.h_proto = htons(sizeof(encaps_hdr) + skb->len); + memcpy(hdr.encap, encaps_hdr, sizeof(encaps_hdr)); + + err = hermes_bap_pwrite(hw, USER_BAP, &hdr, sizeof(hdr), + txfid, HERMES_802_3_OFFSET); if (err) { if (net_ratelimit()) printk(KERN_ERR "%s: Error %d writing packet " "header to BAP\n", dev->name, err); - stats->tx_errors++; - goto fail; + goto busy; } - /* Actual xfer length - allow for padding */ - len = ALIGN(data_len, 2); - if (len < ETH_ZLEN - ETH_HLEN) - len = ETH_ZLEN - ETH_HLEN; } else { /* IEEE 802.3 frame */ - data_len = len + ETH_HLEN; data_off = HERMES_802_3_OFFSET; - p = skb->data; - /* Actual xfer length - round up for odd length packets */ - len = ALIGN(data_len, 2); - if (len < ETH_ZLEN) - len = ETH_ZLEN; } - err = hermes_bap_pwrite_pad(hw, USER_BAP, p, data_len, len, + err = hermes_bap_pwrite(hw, USER_BAP, skb->data, skb->len, txfid, data_off); if (err) { printk(KERN_ERR "%s: Error %d writing packet to BAP\n", dev->name, err); - stats->tx_errors++; - goto fail; + goto busy; } /* Finally, we actually initiate the send */ @@ -575,25 +518,27 @@ static int orinoco_xmit(struct sk_buff *skb, struct net_device *dev) if (net_ratelimit()) printk(KERN_ERR "%s: Error %d transmitting packet\n", dev->name, err); - stats->tx_errors++; - goto fail; + goto busy; } dev->trans_start = jiffies; - stats->tx_bytes += data_off + data_len; + stats->tx_bytes += data_off + skb->len; + goto ok; - orinoco_unlock(priv, &flags); + drop: + stats->tx_errors++; + stats->tx_dropped++; + ok: + orinoco_unlock(priv, &flags); dev_kfree_skb(skb); + return NETDEV_TX_OK; - TRACE_EXIT(dev->name); - - return 0; - fail: - TRACE_EXIT(dev->name); - + busy: + if (err == -EIO) + schedule_work(&priv->reset_work); orinoco_unlock(priv, &flags); - return err; + return NETDEV_TX_BUSY; } static void __orinoco_ev_alloc(struct net_device *dev, hermes_t *hw) @@ -629,7 +574,7 @@ static void __orinoco_ev_txexc(struct net_device *dev, hermes_t *hw) struct net_device_stats *stats = &priv->stats; u16 fid = hermes_read_regn(hw, TXCOMPLFID); u16 status; - struct hermes_tx_descriptor_802_11 hdr; + struct hermes_txexc_data hdr; int err = 0; if (fid == DUMMY_FID) @@ -637,8 +582,7 @@ static void __orinoco_ev_txexc(struct net_device *dev, hermes_t *hw) /* Read part of the frame header - we need status and addr1 */ err = hermes_bap_pread(hw, IRQ_BAP, &hdr, - offsetof(struct hermes_tx_descriptor_802_11, - addr2), + sizeof(struct hermes_txexc_data), fid, 0); hermes_write_regn(hw, TXCOMPLFID, DUMMY_FID); @@ -658,7 +602,7 @@ static void __orinoco_ev_txexc(struct net_device *dev, hermes_t *hw) * exceeded, because that's the only status that really mean * that this particular node went away. * Other errors means that *we* screwed up. - Jean II */ - status = le16_to_cpu(hdr.status); + status = le16_to_cpu(hdr.desc.status); if (status & (HERMES_TXSTAT_RETRYERR | HERMES_TXSTAT_AGEDERR)) { union iwreq_data wrqu; @@ -1398,16 +1342,12 @@ int __orinoco_down(struct net_device *dev) return 0; } -int orinoco_reinit_firmware(struct net_device *dev) +static int orinoco_allocate_fid(struct net_device *dev) { struct orinoco_private *priv = netdev_priv(dev); struct hermes *hw = &priv->hw; int err; - err = hermes_init(hw); - if (err) - return err; - err = hermes_allocate(hw, priv->nicbuf_size, &priv->txfid); if (err == -EIO && priv->nicbuf_size > TX_NICBUF_SIZE_BUG) { /* Try workaround for old Symbol firmware bug */ @@ -1426,6 +1366,19 @@ int orinoco_reinit_firmware(struct net_device *dev) return err; } +int orinoco_reinit_firmware(struct net_device *dev) +{ + struct orinoco_private *priv = netdev_priv(dev); + struct hermes *hw = &priv->hw; + int err; + + err = hermes_init(hw); + if (!err) + err = orinoco_allocate_fid(dev); + + return err; +} + static int __orinoco_hw_set_bitrate(struct orinoco_private *priv) { hermes_t *hw = &priv->hw; @@ -2274,14 +2227,12 @@ static int orinoco_init(struct net_device *dev) u16 reclen; int len; - TRACE_ENTER(dev->name); - /* No need to lock, the hw_unavailable flag is already set in * alloc_orinocodev() */ priv->nicbuf_size = IEEE80211_FRAME_LEN + ETH_HLEN; /* Initialize the firmware */ - err = orinoco_reinit_firmware(dev); + err = hermes_init(hw); if (err != 0) { printk(KERN_ERR "%s: failed to initialize firmware (err = %d)\n", dev->name, err); @@ -2339,6 +2290,13 @@ static int orinoco_init(struct net_device *dev) printk(KERN_DEBUG "%s: Station name \"%s\"\n", dev->name, priv->nick); + err = orinoco_allocate_fid(dev); + if (err) { + printk(KERN_ERR "%s: failed to allocate NIC buffer!\n", + dev->name); + goto out; + } + /* Get allowed channels */ err = hermes_read_wordrec(hw, USER_BAP, HERMES_RID_CHANNELLIST, &priv->channel_mask); @@ -2429,7 +2387,6 @@ static int orinoco_init(struct net_device *dev) printk(KERN_DEBUG "%s: ready\n", dev->name); out: - TRACE_EXIT(dev->name); return err; } @@ -2797,8 +2754,6 @@ static int orinoco_ioctl_getiwrange(struct net_device *dev, int numrates; int i, k; - TRACE_ENTER(dev->name); - rrq->length = sizeof(struct iw_range); memset(range, 0, sizeof(struct iw_range)); @@ -2888,8 +2843,6 @@ static int orinoco_ioctl_getiwrange(struct net_device *dev, IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWSCAN); IW_EVENT_CAPA_SET(range->event_capa, IWEVTXDROP); - TRACE_EXIT(dev->name); - return 0; } @@ -2922,7 +2875,7 @@ static int orinoco_ioctl_setiwencode(struct net_device *dev, if (orinoco_lock(priv, &flags) != 0) return -EBUSY; - if (erq->pointer) { + if (erq->length > 0) { if ((index < 0) || (index >= ORINOCO_MAX_KEYS)) index = priv->tx_key; @@ -2965,7 +2918,7 @@ static int orinoco_ioctl_setiwencode(struct net_device *dev, if (erq->flags & IW_ENCODE_RESTRICTED) restricted = 1; - if (erq->pointer) { + if (erq->pointer && erq->length > 0) { priv->keys[index].len = cpu_to_le16(xlen); memset(priv->keys[index].data, 0, sizeof(priv->keys[index].data)); @@ -3071,8 +3024,6 @@ static int orinoco_ioctl_getessid(struct net_device *dev, int err = 0; unsigned long flags; - TRACE_ENTER(dev->name); - if (netif_running(dev)) { err = orinoco_hw_get_essid(priv, &active, essidbuf); if (err) @@ -3087,8 +3038,6 @@ static int orinoco_ioctl_getessid(struct net_device *dev, erq->flags = 1; erq->length = strlen(essidbuf) + 1; - TRACE_EXIT(dev->name); - return 0; } @@ -4348,69 +4297,6 @@ static struct ethtool_ops orinoco_ethtool_ops = { .get_link = ethtool_op_get_link, }; -/********************************************************************/ -/* Debugging */ -/********************************************************************/ - -#if 0 -static void show_rx_frame(struct orinoco_rxframe_hdr *frame) -{ - printk(KERN_DEBUG "RX descriptor:\n"); - printk(KERN_DEBUG " status = 0x%04x\n", frame->desc.status); - printk(KERN_DEBUG " time = 0x%08x\n", frame->desc.time); - printk(KERN_DEBUG " silence = 0x%02x\n", frame->desc.silence); - printk(KERN_DEBUG " signal = 0x%02x\n", frame->desc.signal); - printk(KERN_DEBUG " rate = 0x%02x\n", frame->desc.rate); - printk(KERN_DEBUG " rxflow = 0x%02x\n", frame->desc.rxflow); - printk(KERN_DEBUG " reserved = 0x%08x\n", frame->desc.reserved); - - printk(KERN_DEBUG "IEEE 802.11 header:\n"); - printk(KERN_DEBUG " frame_ctl = 0x%04x\n", - frame->p80211.frame_ctl); - printk(KERN_DEBUG " duration_id = 0x%04x\n", - frame->p80211.duration_id); - printk(KERN_DEBUG " addr1 = %02x:%02x:%02x:%02x:%02x:%02x\n", - frame->p80211.addr1[0], frame->p80211.addr1[1], - frame->p80211.addr1[2], frame->p80211.addr1[3], - frame->p80211.addr1[4], frame->p80211.addr1[5]); - printk(KERN_DEBUG " addr2 = %02x:%02x:%02x:%02x:%02x:%02x\n", - frame->p80211.addr2[0], frame->p80211.addr2[1], - frame->p80211.addr2[2], frame->p80211.addr2[3], - frame->p80211.addr2[4], frame->p80211.addr2[5]); - printk(KERN_DEBUG " addr3 = %02x:%02x:%02x:%02x:%02x:%02x\n", - frame->p80211.addr3[0], frame->p80211.addr3[1], - frame->p80211.addr3[2], frame->p80211.addr3[3], - frame->p80211.addr3[4], frame->p80211.addr3[5]); - printk(KERN_DEBUG " seq_ctl = 0x%04x\n", - frame->p80211.seq_ctl); - printk(KERN_DEBUG " addr4 = %02x:%02x:%02x:%02x:%02x:%02x\n", - frame->p80211.addr4[0], frame->p80211.addr4[1], - frame->p80211.addr4[2], frame->p80211.addr4[3], - frame->p80211.addr4[4], frame->p80211.addr4[5]); - printk(KERN_DEBUG " data_len = 0x%04x\n", - frame->p80211.data_len); - - printk(KERN_DEBUG "IEEE 802.3 header:\n"); - printk(KERN_DEBUG " dest = %02x:%02x:%02x:%02x:%02x:%02x\n", - frame->p8023.h_dest[0], frame->p8023.h_dest[1], - frame->p8023.h_dest[2], frame->p8023.h_dest[3], - frame->p8023.h_dest[4], frame->p8023.h_dest[5]); - printk(KERN_DEBUG " src = %02x:%02x:%02x:%02x:%02x:%02x\n", - frame->p8023.h_source[0], frame->p8023.h_source[1], - frame->p8023.h_source[2], frame->p8023.h_source[3], - frame->p8023.h_source[4], frame->p8023.h_source[5]); - printk(KERN_DEBUG " len = 0x%04x\n", frame->p8023.h_proto); - - printk(KERN_DEBUG "IEEE 802.2 LLC/SNAP header:\n"); - printk(KERN_DEBUG " DSAP = 0x%02x\n", frame->p8022.dsap); - printk(KERN_DEBUG " SSAP = 0x%02x\n", frame->p8022.ssap); - printk(KERN_DEBUG " ctrl = 0x%02x\n", frame->p8022.ctrl); - printk(KERN_DEBUG " OUI = %02x:%02x:%02x\n", - frame->p8022.oui[0], frame->p8022.oui[1], frame->p8022.oui[2]); - printk(KERN_DEBUG " ethertype = 0x%04x\n", frame->ethertype); -} -#endif /* 0 */ - /********************************************************************/ /* Module initialization */ /********************************************************************/ diff --git a/drivers/net/wireless/orinoco.h b/drivers/net/wireless/orinoco.h index f5d856db9..16db3e14b 100644 --- a/drivers/net/wireless/orinoco.h +++ b/drivers/net/wireless/orinoco.h @@ -7,7 +7,7 @@ #ifndef _ORINOCO_H #define _ORINOCO_H -#define DRIVER_VERSION "0.15rc3" +#define DRIVER_VERSION "0.15" #include #include @@ -30,20 +30,6 @@ struct orinoco_key { char data[ORINOCO_MAX_KEY_SIZE]; } __attribute__ ((packed)); -struct header_struct { - /* 802.3 */ - u8 dest[ETH_ALEN]; - u8 src[ETH_ALEN]; - __be16 len; - /* 802.2 */ - u8 dsap; - u8 ssap; - u8 ctrl; - /* SNAP */ - u8 oui[3]; - unsigned short ethertype; -} __attribute__ ((packed)); - typedef enum { FIRMWARE_TYPE_AGERE, FIRMWARE_TYPE_INTERSIL, @@ -132,9 +118,6 @@ extern int orinoco_debug; #define DEBUG(n, args...) do { } while (0) #endif /* ORINOCO_DEBUG */ -#define TRACE_ENTER(devname) DEBUG(2, "%s: -> %s()\n", devname, __FUNCTION__); -#define TRACE_EXIT(devname) DEBUG(2, "%s: <- %s()\n", devname, __FUNCTION__); - /********************************************************************/ /* Exported prototypes */ /********************************************************************/ diff --git a/drivers/net/wireless/orinoco_cs.c b/drivers/net/wireless/orinoco_cs.c index 434f7d7ad..bc14689cb 100644 --- a/drivers/net/wireless/orinoco_cs.c +++ b/drivers/net/wireless/orinoco_cs.c @@ -13,7 +13,6 @@ #define DRIVER_NAME "orinoco_cs" #define PFX DRIVER_NAME ": " -#include #include #include #include @@ -147,14 +146,11 @@ static void orinoco_cs_detach(struct pcmcia_device *link) { struct net_device *dev = link->priv; + if (link->dev_node) + unregister_netdev(dev); + orinoco_cs_release(link); - DEBUG(0, PFX "detach: link=%p link->dev_node=%p\n", link, link->dev_node); - if (link->dev_node) { - DEBUG(0, PFX "About to unregister net device %p\n", - dev); - unregister_netdev(dev); - } free_orinocodev(dev); } /* orinoco_cs_detach */ @@ -178,13 +174,10 @@ orinoco_cs_config(struct pcmcia_device *link) int last_fn, last_ret; u_char buf[64]; config_info_t conf; - cisinfo_t info; tuple_t tuple; cisparse_t parse; void __iomem *mem; - CS_CHECK(ValidateCIS, pcmcia_validate_cis(link, &info)); - /* * This reads the card's CONFIG tuple to find its * configuration registers. @@ -234,12 +227,6 @@ orinoco_cs_config(struct pcmcia_device *link) goto next_entry; link->conf.ConfigIndex = cfg->index; - /* Does this card need audio output? */ - if (cfg->flags & CISTPL_CFTABLE_AUDIO) { - link->conf.Attributes |= CONF_ENABLE_SPKR; - link->conf.Status = CCSR_AUDIO_ENA; - } - /* Use power settings for Vcc and Vpp if present */ /* Note that the CIS values need to be rescaled */ if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) { @@ -355,19 +342,10 @@ orinoco_cs_config(struct pcmcia_device *link) net_device has been registered */ /* Finally, report what we've done */ - printk(KERN_DEBUG "%s: index 0x%02x: ", - dev->name, link->conf.ConfigIndex); - if (link->conf.Vpp) - printk(", Vpp %d.%d", link->conf.Vpp / 10, - link->conf.Vpp % 10); - printk(", irq %d", link->irq.AssignedIRQ); - if (link->io.NumPorts1) - printk(", io 0x%04x-0x%04x", link->io.BasePort1, - link->io.BasePort1 + link->io.NumPorts1 - 1); - if (link->io.NumPorts2) - printk(" & 0x%04x-0x%04x", link->io.BasePort2, - link->io.BasePort2 + link->io.NumPorts2 - 1); - printk("\n"); + printk(KERN_DEBUG "%s: " DRIVER_NAME " at %s, irq %d, io " + "0x%04x-0x%04x\n", dev->name, dev->class_dev.dev->bus_id, + link->irq.AssignedIRQ, link->io.BasePort1, + link->io.BasePort1 + link->io.NumPorts1 - 1); return 0; @@ -436,7 +414,6 @@ static int orinoco_cs_resume(struct pcmcia_device *link) struct orinoco_private *priv = netdev_priv(dev); struct orinoco_pccard *card = priv->card; int err = 0; - unsigned long flags; if (! test_bit(0, &card->hard_reset_in_progress)) { err = orinoco_reinit_firmware(dev); @@ -446,7 +423,7 @@ static int orinoco_cs_resume(struct pcmcia_device *link) return -EIO; } - spin_lock_irqsave(&priv->lock, flags); + spin_lock(&priv->lock); netif_device_attach(dev); priv->hw_unavailable--; @@ -458,10 +435,10 @@ static int orinoco_cs_resume(struct pcmcia_device *link) dev->name, err); } - spin_unlock_irqrestore(&priv->lock, flags); + spin_unlock(&priv->lock); } - return 0; + return err; } diff --git a/drivers/net/wireless/orinoco_nortel.c b/drivers/net/wireless/orinoco_nortel.c index d1a670b35..bf05b9077 100644 --- a/drivers/net/wireless/orinoco_nortel.c +++ b/drivers/net/wireless/orinoco_nortel.c @@ -1,9 +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 * (C) 2003 Christoph Jungegger @@ -41,7 +40,6 @@ #define DRIVER_NAME "orinoco_nortel" #define PFX DRIVER_NAME ": " -#include #include #include #include @@ -50,67 +48,62 @@ #include #include "orinoco.h" +#include "orinoco_pci.h" #define COR_OFFSET (0xe0) /* COR attribute offset of Prism2 PC card */ #define COR_VALUE (COR_LEVEL_REQ | COR_FUNC_ENA) /* Enable PC card with interrupt in level trigger */ -/* Nortel specific data */ -struct nortel_pci_card { - unsigned long iobase1; - unsigned long iobase2; -}; - /* - * Do a soft reset of the PCI card using the Configuration Option Register + * Do a soft reset of the card using the Configuration Option Register * We need this to get going... * This is the part of the code that is strongly inspired from wlan-ng * * Note bis : Don't try to access HERMES_CMD during the reset phase. * It just won't work ! */ -static int nortel_pci_cor_reset(struct orinoco_private *priv) +static int orinoco_nortel_cor_reset(struct orinoco_private *priv) { - struct nortel_pci_card *card = priv->card; + struct orinoco_pci_card *card = priv->card; - /* Assert the reset until the card notice */ - outw_p(8, card->iobase1 + 2); - inw(card->iobase2 + COR_OFFSET); - outw_p(0x80, card->iobase2 + COR_OFFSET); + /* Assert the reset until the card notices */ + iowrite16(8, card->bridge_io + 2); + ioread16(card->attr_io + COR_OFFSET); + iowrite16(0x80, card->attr_io + COR_OFFSET); mdelay(1); /* Give time for the card to recover from this hard effort */ - outw_p(0, card->iobase2 + COR_OFFSET); - outw_p(0, card->iobase2 + COR_OFFSET); + iowrite16(0, card->attr_io + COR_OFFSET); + iowrite16(0, card->attr_io + COR_OFFSET); mdelay(1); - /* set COR as usual */ - outw_p(COR_VALUE, card->iobase2 + COR_OFFSET); - outw_p(COR_VALUE, card->iobase2 + COR_OFFSET); + /* Set COR as usual */ + iowrite16(COR_VALUE, card->attr_io + COR_OFFSET); + iowrite16(COR_VALUE, card->attr_io + COR_OFFSET); mdelay(1); - outw_p(0x228, card->iobase1 + 2); + iowrite16(0x228, card->bridge_io + 2); return 0; } -static int nortel_pci_hw_init(struct nortel_pci_card *card) +static int orinoco_nortel_hw_init(struct orinoco_pci_card *card) { int i; u32 reg; - /* setup bridge */ - if (inw(card->iobase1) & 1) { + /* Setup bridge */ + if (ioread16(card->bridge_io) & 1) { printk(KERN_ERR PFX "brg1 answer1 wrong\n"); return -EBUSY; } - outw_p(0x118, card->iobase1 + 2); - outw_p(0x108, card->iobase1 + 2); + iowrite16(0x118, card->bridge_io + 2); + iowrite16(0x108, card->bridge_io + 2); mdelay(30); - outw_p(0x8, card->iobase1 + 2); + iowrite16(0x8, card->bridge_io + 2); for (i = 0; i < 30; i++) { mdelay(30); - if (inw(card->iobase1) & 0x10) { + if (ioread16(card->bridge_io) & 0x10) { break; } } @@ -118,42 +111,42 @@ static int nortel_pci_hw_init(struct nortel_pci_card *card) printk(KERN_ERR PFX "brg1 timed out\n"); return -EBUSY; } - if (inw(card->iobase2 + 0xe0) & 1) { + if (ioread16(card->attr_io + COR_OFFSET) & 1) { printk(KERN_ERR PFX "brg2 answer1 wrong\n"); return -EBUSY; } - if (inw(card->iobase2 + 0xe2) & 1) { + if (ioread16(card->attr_io + COR_OFFSET + 2) & 1) { printk(KERN_ERR PFX "brg2 answer2 wrong\n"); return -EBUSY; } - if (inw(card->iobase2 + 0xe4) & 1) { + if (ioread16(card->attr_io + COR_OFFSET + 4) & 1) { printk(KERN_ERR PFX "brg2 answer3 wrong\n"); return -EBUSY; } - /* set the PCMCIA COR-Register */ - outw_p(COR_VALUE, card->iobase2 + COR_OFFSET); + /* Set the PCMCIA COR register */ + iowrite16(COR_VALUE, card->attr_io + COR_OFFSET); mdelay(1); - reg = inw(card->iobase2 + COR_OFFSET); + reg = ioread16(card->attr_io + COR_OFFSET); if (reg != COR_VALUE) { printk(KERN_ERR PFX "Error setting COR value (reg=%x)\n", reg); return -EBUSY; } - /* set leds */ - outw_p(1, card->iobase1 + 10); + /* Set LEDs */ + iowrite16(1, card->bridge_io + 10); return 0; } -static int nortel_pci_init_one(struct pci_dev *pdev, - const struct pci_device_id *ent) +static int orinoco_nortel_init_one(struct pci_dev *pdev, + const struct pci_device_id *ent) { int err; struct orinoco_private *priv; - struct nortel_pci_card *card; + struct orinoco_pci_card *card; struct net_device *dev; - void __iomem *iomem; + void __iomem *hermes_io, *bridge_io, *attr_io; err = pci_enable_device(pdev); if (err) { @@ -162,19 +155,34 @@ static int nortel_pci_init_one(struct pci_dev *pdev, } err = pci_request_regions(pdev, DRIVER_NAME); - if (err != 0) { + if (err) { printk(KERN_ERR PFX "Cannot obtain PCI resources\n"); goto fail_resources; } - iomem = pci_iomap(pdev, 2, 0); - if (!iomem) { - err = -ENOMEM; - goto fail_map_io; + bridge_io = pci_iomap(pdev, 0, 0); + if (!bridge_io) { + printk(KERN_ERR PFX "Cannot map bridge registers\n"); + err = -EIO; + goto fail_map_bridge; + } + + attr_io = pci_iomap(pdev, 1, 0); + if (!attr_io) { + printk(KERN_ERR PFX "Cannot map PCMCIA attributes\n"); + err = -EIO; + goto fail_map_attr; + } + + hermes_io = pci_iomap(pdev, 2, 0); + if (!hermes_io) { + printk(KERN_ERR PFX "Cannot map chipset registers\n"); + err = -EIO; + goto fail_map_hermes; } /* Allocate network device */ - dev = alloc_orinocodev(sizeof(*card), nortel_pci_cor_reset); + dev = alloc_orinocodev(sizeof(*card), orinoco_nortel_cor_reset); if (!dev) { printk(KERN_ERR PFX "Cannot allocate network device\n"); err = -ENOMEM; @@ -183,39 +191,33 @@ static int nortel_pci_init_one(struct pci_dev *pdev, priv = netdev_priv(dev); card = priv->card; - card->iobase1 = pci_resource_start(pdev, 0); - card->iobase2 = pci_resource_start(pdev, 1); - dev->base_addr = pci_resource_start(pdev, 2); + card->bridge_io = bridge_io; + card->attr_io = attr_io; SET_MODULE_OWNER(dev); SET_NETDEV_DEV(dev, &pdev->dev); - hermes_struct_init(&priv->hw, iomem, HERMES_16BIT_REGSPACING); + hermes_struct_init(&priv->hw, hermes_io, HERMES_16BIT_REGSPACING); - printk(KERN_DEBUG PFX "Detected Nortel PCI device at %s irq:%d, " - "io addr:0x%lx\n", pci_name(pdev), pdev->irq, dev->base_addr); - - err = request_irq(pdev->irq, orinoco_interrupt, SA_SHIRQ, + err = request_irq(pdev->irq, orinoco_interrupt, IRQF_SHARED, dev->name, dev); if (err) { printk(KERN_ERR PFX "Cannot allocate IRQ %d\n", pdev->irq); err = -EBUSY; goto fail_irq; } - dev->irq = pdev->irq; - err = nortel_pci_hw_init(card); + err = orinoco_nortel_hw_init(card); if (err) { printk(KERN_ERR PFX "Hardware initialization failed\n"); goto fail; } - err = nortel_pci_cor_reset(priv); + err = orinoco_nortel_cor_reset(priv); if (err) { printk(KERN_ERR PFX "Initial reset failed\n"); goto fail; } - err = register_netdev(dev); if (err) { printk(KERN_ERR PFX "Cannot register network device\n"); @@ -223,6 +225,8 @@ static int nortel_pci_init_one(struct pci_dev *pdev, } pci_set_drvdata(pdev, dev); + printk(KERN_DEBUG "%s: " DRIVER_NAME " at %s\n", dev->name, + pci_name(pdev)); return 0; @@ -234,9 +238,15 @@ static int nortel_pci_init_one(struct pci_dev *pdev, free_orinocodev(dev); fail_alloc: - pci_iounmap(pdev, iomem); + pci_iounmap(pdev, hermes_io); - fail_map_io: + fail_map_hermes: + pci_iounmap(pdev, attr_io); + + fail_map_attr: + pci_iounmap(pdev, bridge_io); + + fail_map_bridge: pci_release_regions(pdev); fail_resources: @@ -245,26 +255,27 @@ static int nortel_pci_init_one(struct pci_dev *pdev, return err; } -static void __devexit nortel_pci_remove_one(struct pci_dev *pdev) +static void __devexit orinoco_nortel_remove_one(struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); struct orinoco_private *priv = netdev_priv(dev); - struct nortel_pci_card *card = priv->card; + struct orinoco_pci_card *card = priv->card; - /* clear leds */ - outw_p(0, card->iobase1 + 10); + /* Clear LEDs */ + iowrite16(0, card->bridge_io + 10); unregister_netdev(dev); - free_irq(dev->irq, dev); + free_irq(pdev->irq, dev); pci_set_drvdata(pdev, NULL); free_orinocodev(dev); pci_iounmap(pdev, priv->hw.iobase); + pci_iounmap(pdev, card->attr_io); + pci_iounmap(pdev, card->bridge_io); pci_release_regions(pdev); pci_disable_device(pdev); } - -static struct pci_device_id nortel_pci_id_table[] = { +static struct pci_device_id orinoco_nortel_id_table[] = { /* Nortel emobility PCI */ {0x126c, 0x8030, PCI_ANY_ID, PCI_ANY_ID,}, /* Symbol LA-4123 PCI */ @@ -272,13 +283,15 @@ static struct pci_device_id nortel_pci_id_table[] = { {0,}, }; -MODULE_DEVICE_TABLE(pci, nortel_pci_id_table); +MODULE_DEVICE_TABLE(pci, orinoco_nortel_id_table); -static struct pci_driver nortel_pci_driver = { - .name = DRIVER_NAME, - .id_table = nortel_pci_id_table, - .probe = nortel_pci_init_one, - .remove = __devexit_p(nortel_pci_remove_one), +static struct pci_driver orinoco_nortel_driver = { + .name = DRIVER_NAME, + .id_table = orinoco_nortel_id_table, + .probe = orinoco_nortel_init_one, + .remove = __devexit_p(orinoco_nortel_remove_one), + .suspend = orinoco_pci_suspend, + .resume = orinoco_pci_resume, }; static char version[] __initdata = DRIVER_NAME " " DRIVER_VERSION @@ -288,20 +301,19 @@ MODULE_DESCRIPTION ("Driver for wireless LAN cards using the Nortel PCI bridge"); MODULE_LICENSE("Dual MPL/GPL"); -static int __init nortel_pci_init(void) +static int __init orinoco_nortel_init(void) { printk(KERN_DEBUG "%s\n", version); - return pci_module_init(&nortel_pci_driver); + return pci_module_init(&orinoco_nortel_driver); } -static void __exit nortel_pci_exit(void) +static void __exit orinoco_nortel_exit(void) { - pci_unregister_driver(&nortel_pci_driver); - ssleep(1); + pci_unregister_driver(&orinoco_nortel_driver); } -module_init(nortel_pci_init); -module_exit(nortel_pci_exit); +module_init(orinoco_nortel_init); +module_exit(orinoco_nortel_exit); /* * Local variables: diff --git a/drivers/net/wireless/orinoco_pci.c b/drivers/net/wireless/orinoco_pci.c index 5362c214f..1759c543f 100644 --- a/drivers/net/wireless/orinoco_pci.c +++ b/drivers/net/wireless/orinoco_pci.c @@ -1,11 +1,11 @@ /* orinoco_pci.c * - * Driver for Prism II devices that have a direct PCI interface - * (i.e., not in a Pcmcia or PLX bridge) - * - * Specifically here we're talking about the Linksys WMP11 + * Driver for Prism 2.5/3 devices that have a direct PCI interface + * (i.e. these are not PCMCIA cards in a PCMCIA-to-PCI bridge). + * The card contains only one PCI region, which contains all the usual + * hermes registers, as well as the COR register. * - * Current maintainers (as of 29 September 2003) are: + * Current maintainers are: * Pavel Roskin * and David Gibson * @@ -41,58 +41,9 @@ * under either the MPL or the GPL. */ -/* - * Theory of operation... - * ------------------- - * Maybe you had a look in orinoco_plx. Well, this is totally different... - * - * The card contains only one PCI region, which contains all the usual - * hermes registers. - * - * The driver will memory map this region in normal memory. Because - * the hermes registers are mapped in normal memory and not in ISA I/O - * post space, we can't use the usual inw/outw macros and we need to - * use readw/writew. - * This slight difference force us to compile our own version of - * hermes.c with the register access macro changed. That's a bit - * hackish but works fine. - * - * Note that the PCI region is pretty big (4K). That's much more than - * the usual set of hermes register (0x0 -> 0x3E). I've got a strong - * suspicion that the whole memory space of the adapter is in fact in - * this region. Accessing directly the adapter memory instead of going - * through the usual register would speed up significantely the - * operations... - * - * Finally, the card looks like this : ------------------------ - Bus 0, device 14, function 0: - Network controller: PCI device 1260:3873 (Harris Semiconductor) (rev 1). - IRQ 11. - Master Capable. Latency=248. - Prefetchable 32 bit memory at 0xffbcc000 [0xffbccfff]. ------------------------ -00:0e.0 Network controller: Harris Semiconductor: Unknown device 3873 (rev 01) - Subsystem: Unknown device 1737:3874 - Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- - Status: Cap+ 66Mhz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- #include #include #include @@ -100,12 +51,14 @@ #include #include "orinoco.h" +#include "orinoco_pci.h" -/* All the magic there is from wlan-ng */ -/* Magic offset of the reset register of the PCI card */ +/* Offset of the COR register of the PCI card */ #define HERMES_PCI_COR (0x26) -/* Magic bitmask to reset the card */ + +/* Bitmask to reset the card */ #define HERMES_PCI_COR_MASK (0x0080) + /* Magic timeouts for doing the reset. * Those times are straight from wlan-ng, and it is claimed that they * are necessary. Alan will kill me. Take your time and grab a coffee. */ @@ -113,13 +66,8 @@ #define HERMES_PCI_COR_OFFT (500) /* ms */ #define HERMES_PCI_COR_BUSYT (500) /* ms */ -/* Orinoco PCI specific data */ -struct orinoco_pci_card { - void __iomem *pci_ioaddr; -}; - /* - * Do a soft reset of the PCI card using the Configuration Option Register + * Do a soft reset of the card using the Configuration Option Register * We need this to get going... * This is the part of the code that is strongly inspired from wlan-ng * @@ -131,14 +79,13 @@ struct orinoco_pci_card { * Note bis : Don't try to access HERMES_CMD during the reset phase. * It just won't work ! */ -static int -orinoco_pci_cor_reset(struct orinoco_private *priv) +static int orinoco_pci_cor_reset(struct orinoco_private *priv) { hermes_t *hw = &priv->hw; - unsigned long timeout; - u16 reg; + unsigned long timeout; + u16 reg; - /* Assert the reset until the card notice */ + /* Assert the reset until the card notices */ hermes_write_regn(hw, PCI_COR, HERMES_PCI_COR_MASK); mdelay(HERMES_PCI_COR_ONT); @@ -163,19 +110,14 @@ orinoco_pci_cor_reset(struct orinoco_private *priv) return 0; } -/* - * Initialise a card. Mostly similar to PLX code. - */ static int orinoco_pci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) { - int err = 0; - unsigned long pci_iorange; - u16 __iomem *pci_ioaddr = NULL; - unsigned long pci_iolen; - struct orinoco_private *priv = NULL; + int err; + struct orinoco_private *priv; struct orinoco_pci_card *card; - struct net_device *dev = NULL; + struct net_device *dev; + void __iomem *hermes_io; err = pci_enable_device(pdev); if (err) { @@ -184,50 +126,41 @@ static int orinoco_pci_init_one(struct pci_dev *pdev, } err = pci_request_regions(pdev, DRIVER_NAME); - if (err != 0) { + if (err) { printk(KERN_ERR PFX "Cannot obtain PCI resources\n"); goto fail_resources; } - /* Resource 0 is mapped to the hermes registers */ - pci_iorange = pci_resource_start(pdev, 0); - pci_iolen = pci_resource_len(pdev, 0); - pci_ioaddr = ioremap(pci_iorange, pci_iolen); - if (!pci_iorange) { - printk(KERN_ERR PFX "Cannot remap hardware registers\n"); - goto fail_map; + hermes_io = pci_iomap(pdev, 0, 0); + if (!hermes_io) { + printk(KERN_ERR PFX "Cannot remap chipset registers\n"); + err = -EIO; + goto fail_map_hermes; } /* Allocate network device */ dev = alloc_orinocodev(sizeof(*card), orinoco_pci_cor_reset); - if (! dev) { + if (!dev) { + printk(KERN_ERR PFX "Cannot allocate network device\n"); err = -ENOMEM; goto fail_alloc; } priv = netdev_priv(dev); card = priv->card; - card->pci_ioaddr = pci_ioaddr; - dev->mem_start = pci_iorange; - dev->mem_end = pci_iorange + pci_iolen - 1; SET_MODULE_OWNER(dev); SET_NETDEV_DEV(dev, &pdev->dev); - hermes_struct_init(&priv->hw, pci_ioaddr, HERMES_32BIT_REGSPACING); - - printk(KERN_DEBUG PFX "Detected device %s, mem:0x%lx-0x%lx, irq %d\n", - pci_name(pdev), dev->mem_start, dev->mem_end, pdev->irq); + hermes_struct_init(&priv->hw, hermes_io, HERMES_32BIT_REGSPACING); - err = request_irq(pdev->irq, orinoco_interrupt, SA_SHIRQ, + err = request_irq(pdev->irq, orinoco_interrupt, IRQF_SHARED, dev->name, dev); if (err) { printk(KERN_ERR PFX "Cannot allocate IRQ %d\n", pdev->irq); err = -EBUSY; goto fail_irq; } - dev->irq = pdev->irq; - /* Perform a COR reset to start the card */ err = orinoco_pci_cor_reset(priv); if (err) { printk(KERN_ERR PFX "Initial reset failed\n"); @@ -236,11 +169,13 @@ static int orinoco_pci_init_one(struct pci_dev *pdev, err = register_netdev(dev); if (err) { - printk(KERN_ERR PFX "Failed to register net device\n"); + printk(KERN_ERR PFX "Cannot register network device\n"); goto fail; } pci_set_drvdata(pdev, dev); + printk(KERN_DEBUG "%s: " DRIVER_NAME " at %s\n", dev->name, + pci_name(pdev)); return 0; @@ -252,9 +187,9 @@ static int orinoco_pci_init_one(struct pci_dev *pdev, free_orinocodev(dev); fail_alloc: - iounmap(pci_ioaddr); + pci_iounmap(pdev, hermes_io); - fail_map: + fail_map_hermes: pci_release_regions(pdev); fail_resources: @@ -267,87 +202,17 @@ static void __devexit orinoco_pci_remove_one(struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); struct orinoco_private *priv = netdev_priv(dev); - struct orinoco_pci_card *card = priv->card; unregister_netdev(dev); - free_irq(dev->irq, dev); + free_irq(pdev->irq, dev); pci_set_drvdata(pdev, NULL); free_orinocodev(dev); - iounmap(card->pci_ioaddr); + pci_iounmap(pdev, priv->hw.iobase); pci_release_regions(pdev); pci_disable_device(pdev); } -static int orinoco_pci_suspend(struct pci_dev *pdev, pm_message_t state) -{ - struct net_device *dev = pci_get_drvdata(pdev); - struct orinoco_private *priv = netdev_priv(dev); - unsigned long flags; - int err; - - - err = orinoco_lock(priv, &flags); - if (err) { - printk(KERN_ERR "%s: hw_unavailable on orinoco_pci_suspend\n", - dev->name); - return err; - } - - err = __orinoco_down(dev); - if (err) - printk(KERN_WARNING "%s: orinoco_pci_suspend(): Error %d downing interface\n", - dev->name, err); - - netif_device_detach(dev); - - priv->hw_unavailable++; - - orinoco_unlock(priv, &flags); - - pci_save_state(pdev); - pci_set_power_state(pdev, PCI_D3hot); - - return 0; -} - -static int orinoco_pci_resume(struct pci_dev *pdev) -{ - struct net_device *dev = pci_get_drvdata(pdev); - struct orinoco_private *priv = netdev_priv(dev); - unsigned long flags; - int err; - - printk(KERN_DEBUG "%s: Orinoco-PCI waking up\n", dev->name); - - pci_set_power_state(pdev, 0); - pci_restore_state(pdev); - - err = orinoco_reinit_firmware(dev); - if (err) { - printk(KERN_ERR "%s: Error %d re-initializing firmware on orinoco_pci_resume()\n", - dev->name, err); - return err; - } - - spin_lock_irqsave(&priv->lock, flags); - - netif_device_attach(dev); - - priv->hw_unavailable--; - - if (priv->open && (! priv->hw_unavailable)) { - err = __orinoco_up(dev); - if (err) - printk(KERN_ERR "%s: Error %d restarting card on orinoco_pci_resume()\n", - dev->name, err); - } - - spin_unlock_irqrestore(&priv->lock, flags); - - return 0; -} - -static struct pci_device_id orinoco_pci_pci_id_table[] = { +static struct pci_device_id orinoco_pci_id_table[] = { /* Intersil Prism 3 */ {0x1260, 0x3872, PCI_ANY_ID, PCI_ANY_ID,}, /* Intersil Prism 2.5 */ @@ -357,11 +222,11 @@ static struct pci_device_id orinoco_pci_pci_id_table[] = { {0,}, }; -MODULE_DEVICE_TABLE(pci, orinoco_pci_pci_id_table); +MODULE_DEVICE_TABLE(pci, orinoco_pci_id_table); static struct pci_driver orinoco_pci_driver = { .name = DRIVER_NAME, - .id_table = orinoco_pci_pci_id_table, + .id_table = orinoco_pci_id_table, .probe = orinoco_pci_init_one, .remove = __devexit_p(orinoco_pci_remove_one), .suspend = orinoco_pci_suspend, diff --git a/drivers/net/wireless/orinoco_plx.c b/drivers/net/wireless/orinoco_plx.c index 210e73776..7f006f624 100644 --- a/drivers/net/wireless/orinoco_plx.c +++ b/drivers/net/wireless/orinoco_plx.c @@ -3,7 +3,7 @@ * Driver for Prism II devices which would usually be driven by orinoco_cs, * but are connected to the PCI bus by a PLX9052. * - * Current maintainers (as of 29 September 2003) are: + * Current maintainers are: * Pavel Roskin * and David Gibson * @@ -30,38 +30,18 @@ * other provisions required by the GPL. If you do not delete the * provisions above, a recipient may use your version of this file * under either the MPL or the GPL. - - * Caution: this is experimental and probably buggy. For success and - * failure reports for different cards and adaptors, see - * orinoco_plx_pci_id_table near the end of the file. If you have a - * card we don't have the PCI id for, and looks like it should work, - * drop me mail with the id and "it works"/"it doesn't work". - * - * Note: if everything gets detected fine but it doesn't actually send - * or receive packets, your first port of call should probably be to - * try newer firmware in the card. Especially if you're doing Ad-Hoc - * modes. - * - * The actual driving is done by orinoco.c, this is just resource - * allocation stuff. The explanation below is courtesy of Ryan Niemi - * on the linux-wlan-ng list at - * http://archives.neohapsis.com/archives/dev/linux-wlan/2001-q1/0026.html * - * The PLX9052-based cards (WL11000 and several others) are a - * different beast than the usual PCMCIA-based PRISM2 configuration - * expected by wlan-ng. Here's the general details on how the WL11000 - * PCI adapter works: + * Here's the general details on how the PLX9052 adapter works: * * - Two PCI I/O address spaces, one 0x80 long which contains the * PLX9052 registers, and one that's 0x40 long mapped to the PCMCIA * slot I/O address space. * - * - One PCI memory address space, mapped to the PCMCIA memory space + * - One PCI memory address space, mapped to the PCMCIA attribute space * (containing the CIS). * - * After identifying the I/O and memory space, you can read through - * the memory space to confirm the CIS's device ID or manufacturer ID - * to make sure it's the expected card. qKeep in mind that the PCMCIA + * Using the later, you can read through the CIS data to make sure the + * card is compatible with the driver. Keep in mind that the PCMCIA * spec specifies the CIS as the lower 8 bits of each word read from * the CIS, so to read the bytes of the CIS, read every other byte * (0,2,4,...). Passing that test, you need to enable the I/O address @@ -71,7 +51,7 @@ * within the PCI memory space. Write 0x41 to the COR register to * enable I/O mode and to select level triggered interrupts. To * confirm you actually succeeded, read the COR register back and make - * sure it actually got set to 0x41, incase you have an unexpected + * sure it actually got set to 0x41, in case you have an unexpected * card inserted. * * Following that, you can treat the second PCI I/O address space (the @@ -101,22 +81,11 @@ * that, I've hot-swapped a number of times during debugging and * driver development for various reasons (stuck WAIT# line after the * radio card's firmware locks up). - * - * Hope this is enough info for someone to add PLX9052 support to the - * wlan-ng card. In the case of the WL11000, the PCI ID's are - * 0x1639/0x0200, with matching subsystem ID's. Other PLX9052-based - * manufacturers other than Eumitcom (or on cards other than the - * WL11000) may have different PCI ID's. - * - * If anyone needs any more specific info, let me know. I haven't had - * time to implement support myself yet, and with the way things are - * going, might not have time for a while.. */ #define DRIVER_NAME "orinoco_plx" #define PFX DRIVER_NAME ": " -#include #include #include #include @@ -125,6 +94,7 @@ #include #include "orinoco.h" +#include "orinoco_pci.h" #define COR_OFFSET (0x3e0) /* COR attribute offset of Prism2 PC card */ #define COR_VALUE (COR_LEVEL_REQ | COR_FUNC_ENA) /* Enable PC card with interrupt in level trigger */ @@ -134,30 +104,20 @@ #define PLX_INTCSR 0x4c /* Interrupt Control & Status Register */ #define PLX_INTCSR_INTEN (1<<6) /* Interrupt Enable bit */ -static const u8 cis_magic[] = { - 0x01, 0x03, 0x00, 0x00, 0xff, 0x17, 0x04, 0x67 -}; - -/* Orinoco PLX specific data */ -struct orinoco_plx_card { - void __iomem *attr_mem; -}; - /* * Do a soft reset of the card using the Configuration Option Register */ static int orinoco_plx_cor_reset(struct orinoco_private *priv) { hermes_t *hw = &priv->hw; - struct orinoco_plx_card *card = priv->card; - u8 __iomem *attr_mem = card->attr_mem; + struct orinoco_pci_card *card = priv->card; unsigned long timeout; u16 reg; - writeb(COR_VALUE | COR_RESET, attr_mem + COR_OFFSET); + iowrite8(COR_VALUE | COR_RESET, card->attr_io + COR_OFFSET); mdelay(1); - writeb(COR_VALUE, attr_mem + COR_OFFSET); + iowrite8(COR_VALUE, card->attr_io + COR_OFFSET); mdelay(1); /* Just in case, wait more until the card is no longer busy */ @@ -168,7 +128,7 @@ static int orinoco_plx_cor_reset(struct orinoco_private *priv) reg = hermes_read_regn(hw, CMD); } - /* Did we timeout ? */ + /* Still busy? */ if (reg & HERMES_CMD_BUSY) { printk(KERN_ERR PFX "Busy timeout\n"); return -ETIMEDOUT; @@ -177,20 +137,55 @@ static int orinoco_plx_cor_reset(struct orinoco_private *priv) return 0; } +static int orinoco_plx_hw_init(struct orinoco_pci_card *card) +{ + int i; + u32 csr_reg; + static const u8 cis_magic[] = { + 0x01, 0x03, 0x00, 0x00, 0xff, 0x17, 0x04, 0x67 + }; + + printk(KERN_DEBUG PFX "CIS: "); + for (i = 0; i < 16; i++) { + printk("%02X:", ioread8(card->attr_io + (i << 1))); + } + printk("\n"); + + /* Verify whether a supported PC card is present */ + /* FIXME: we probably need to be smarted about this */ + for (i = 0; i < sizeof(cis_magic); i++) { + if (cis_magic[i] != ioread8(card->attr_io + (i << 1))) { + printk(KERN_ERR PFX "The CIS value of Prism2 PC " + "card is unexpected\n"); + return -ENODEV; + } + } + + /* bjoern: We need to tell the card to enable interrupts, in + case the serial eprom didn't do this already. See the + PLX9052 data book, p8-1 and 8-24 for reference. */ + csr_reg = ioread32(card->bridge_io + PLX_INTCSR); + if (!(csr_reg & PLX_INTCSR_INTEN)) { + csr_reg |= PLX_INTCSR_INTEN; + iowrite32(csr_reg, card->bridge_io + PLX_INTCSR); + csr_reg = ioread32(card->bridge_io + PLX_INTCSR); + if (!(csr_reg & PLX_INTCSR_INTEN)) { + printk(KERN_ERR PFX "Cannot enable interrupts\n"); + return -EIO; + } + } + + return 0; +} static int orinoco_plx_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) { - int err = 0; - u8 __iomem *attr_mem = NULL; - u32 csr_reg, plx_addr; - struct orinoco_private *priv = NULL; - struct orinoco_plx_card *card; - unsigned long pccard_ioaddr = 0; - unsigned long pccard_iolen = 0; - struct net_device *dev = NULL; - void __iomem *mem; - int i; + int err; + struct orinoco_private *priv; + struct orinoco_pci_card *card; + struct net_device *dev; + void __iomem *hermes_io, *attr_io, *bridge_io; err = pci_enable_device(pdev); if (err) { @@ -199,30 +194,30 @@ static int orinoco_plx_init_one(struct pci_dev *pdev, } err = pci_request_regions(pdev, DRIVER_NAME); - if (err != 0) { + if (err) { printk(KERN_ERR PFX "Cannot obtain PCI resources\n"); goto fail_resources; } - /* Resource 1 is mapped to PLX-specific registers */ - plx_addr = pci_resource_start(pdev, 1); + bridge_io = pci_iomap(pdev, 1, 0); + if (!bridge_io) { + printk(KERN_ERR PFX "Cannot map bridge registers\n"); + err = -EIO; + goto fail_map_bridge; + } - /* Resource 2 is mapped to the PCMCIA attribute memory */ - attr_mem = ioremap(pci_resource_start(pdev, 2), - pci_resource_len(pdev, 2)); - if (!attr_mem) { - printk(KERN_ERR PFX "Cannot remap PCMCIA space\n"); + attr_io = pci_iomap(pdev, 2, 0); + if (!attr_io) { + printk(KERN_ERR PFX "Cannot map PCMCIA attributes\n"); + err = -EIO; goto fail_map_attr; } - /* Resource 3 is mapped to the PCMCIA I/O address space */ - pccard_ioaddr = pci_resource_start(pdev, 3); - pccard_iolen = pci_resource_len(pdev, 3); - - mem = pci_iomap(pdev, 3, 0); - if (!mem) { - err = -ENOMEM; - goto fail_map_io; + hermes_io = pci_iomap(pdev, 3, 0); + if (!hermes_io) { + printk(KERN_ERR PFX "Cannot map chipset registers\n"); + err = -EIO; + goto fail_map_hermes; } /* Allocate network device */ @@ -235,38 +230,25 @@ static int orinoco_plx_init_one(struct pci_dev *pdev, priv = netdev_priv(dev); card = priv->card; - card->attr_mem = attr_mem; - dev->base_addr = pccard_ioaddr; + card->bridge_io = bridge_io; + card->attr_io = attr_io; SET_MODULE_OWNER(dev); SET_NETDEV_DEV(dev, &pdev->dev); - hermes_struct_init(&priv->hw, mem, HERMES_16BIT_REGSPACING); + hermes_struct_init(&priv->hw, hermes_io, HERMES_16BIT_REGSPACING); - printk(KERN_DEBUG PFX "Detected Orinoco/Prism2 PLX device " - "at %s irq:%d, io addr:0x%lx\n", pci_name(pdev), pdev->irq, - pccard_ioaddr); - - err = request_irq(pdev->irq, orinoco_interrupt, SA_SHIRQ, + err = request_irq(pdev->irq, orinoco_interrupt, IRQF_SHARED, dev->name, dev); if (err) { printk(KERN_ERR PFX "Cannot allocate IRQ %d\n", pdev->irq); err = -EBUSY; goto fail_irq; } - dev->irq = pdev->irq; - /* bjoern: We need to tell the card to enable interrupts, in - case the serial eprom didn't do this already. See the - PLX9052 data book, p8-1 and 8-24 for reference. */ - csr_reg = inl(plx_addr + PLX_INTCSR); - if (!(csr_reg & PLX_INTCSR_INTEN)) { - csr_reg |= PLX_INTCSR_INTEN; - outl(csr_reg, plx_addr + PLX_INTCSR); - csr_reg = inl(plx_addr + PLX_INTCSR); - if (!(csr_reg & PLX_INTCSR_INTEN)) { - printk(KERN_ERR PFX "Cannot enable interrupts\n"); - goto fail; - } + err = orinoco_plx_hw_init(card); + if (err) { + printk(KERN_ERR PFX "Hardware initialization failed\n"); + goto fail; } err = orinoco_plx_cor_reset(priv); @@ -275,23 +257,6 @@ static int orinoco_plx_init_one(struct pci_dev *pdev, goto fail; } - printk(KERN_DEBUG PFX "CIS: "); - for (i = 0; i < 16; i++) { - printk("%02X:", readb(attr_mem + 2*i)); - } - printk("\n"); - - /* Verify whether a supported PC card is present */ - /* FIXME: we probably need to be smarted about this */ - for (i = 0; i < sizeof(cis_magic); i++) { - if (cis_magic[i] != readb(attr_mem +2*i)) { - printk(KERN_ERR PFX "The CIS value of Prism2 PC " - "card is unexpected\n"); - err = -EIO; - goto fail; - } - } - err = register_netdev(dev); if (err) { printk(KERN_ERR PFX "Cannot register network device\n"); @@ -299,6 +264,8 @@ static int orinoco_plx_init_one(struct pci_dev *pdev, } pci_set_drvdata(pdev, dev); + printk(KERN_DEBUG "%s: " DRIVER_NAME " at %s\n", dev->name, + pci_name(pdev)); return 0; @@ -310,12 +277,15 @@ static int orinoco_plx_init_one(struct pci_dev *pdev, free_orinocodev(dev); fail_alloc: - pci_iounmap(pdev, mem); + pci_iounmap(pdev, hermes_io); - fail_map_io: - iounmap(attr_mem); + fail_map_hermes: + pci_iounmap(pdev, attr_io); fail_map_attr: + pci_iounmap(pdev, bridge_io); + + fail_map_bridge: pci_release_regions(pdev); fail_resources: @@ -328,23 +298,20 @@ static void __devexit orinoco_plx_remove_one(struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); struct orinoco_private *priv = netdev_priv(dev); - struct orinoco_plx_card *card = priv->card; - u8 __iomem *attr_mem = card->attr_mem; - - BUG_ON(! dev); + struct orinoco_pci_card *card = priv->card; unregister_netdev(dev); - free_irq(dev->irq, dev); + free_irq(pdev->irq, dev); pci_set_drvdata(pdev, NULL); free_orinocodev(dev); pci_iounmap(pdev, priv->hw.iobase); - iounmap(attr_mem); + pci_iounmap(pdev, card->attr_io); + pci_iounmap(pdev, card->bridge_io); pci_release_regions(pdev); pci_disable_device(pdev); } - -static struct pci_device_id orinoco_plx_pci_id_table[] = { +static struct pci_device_id orinoco_plx_id_table[] = { {0x111a, 0x1023, PCI_ANY_ID, PCI_ANY_ID,}, /* Siemens SpeedStream SS1023 */ {0x1385, 0x4100, PCI_ANY_ID, PCI_ANY_ID,}, /* Netgear MA301 */ {0x15e8, 0x0130, PCI_ANY_ID, PCI_ANY_ID,}, /* Correga - does this work? */ @@ -362,13 +329,15 @@ static struct pci_device_id orinoco_plx_pci_id_table[] = { {0,}, }; -MODULE_DEVICE_TABLE(pci, orinoco_plx_pci_id_table); +MODULE_DEVICE_TABLE(pci, orinoco_plx_id_table); static struct pci_driver orinoco_plx_driver = { .name = DRIVER_NAME, - .id_table = orinoco_plx_pci_id_table, + .id_table = orinoco_plx_id_table, .probe = orinoco_plx_init_one, .remove = __devexit_p(orinoco_plx_remove_one), + .suspend = orinoco_pci_suspend, + .resume = orinoco_pci_resume, }; static char version[] __initdata = DRIVER_NAME " " DRIVER_VERSION @@ -388,7 +357,6 @@ static int __init orinoco_plx_init(void) static void __exit orinoco_plx_exit(void) { pci_unregister_driver(&orinoco_plx_driver); - ssleep(1); } module_init(orinoco_plx_init); diff --git a/drivers/net/wireless/orinoco_tmd.c b/drivers/net/wireless/orinoco_tmd.c index 5e68b7026..0831721e4 100644 --- a/drivers/net/wireless/orinoco_tmd.c +++ b/drivers/net/wireless/orinoco_tmd.c @@ -1,5 +1,5 @@ /* orinoco_tmd.c - * + * * Driver for Prism II devices which would usually be driven by orinoco_cs, * but are connected to the PCI bus by a TMD7160. * @@ -26,25 +26,13 @@ * other provisions required by the GPL. If you do not delete the * provisions above, a recipient may use your version of this file * under either the MPL or the GPL. - - * Caution: this is experimental and probably buggy. For success and - * failure reports for different cards and adaptors, see - * orinoco_tmd_pci_id_table near the end of the file. If you have a - * card we don't have the PCI id for, and looks like it should work, - * drop me mail with the id and "it works"/"it doesn't work". - * - * Note: if everything gets detected fine but it doesn't actually send - * or receive packets, your first port of call should probably be to - * try newer firmware in the card. Especially if you're doing Ad-Hoc - * modes * * The actual driving is done by orinoco.c, this is just resource * allocation stuff. * * This driver is modeled after the orinoco_plx driver. The main - * difference is that the TMD chip has only IO port ranges and no - * memory space, i.e. no access to the CIS. Compared to the PLX chip, - * the io range functionalities are exchanged. + * difference is that the TMD chip has only IO port ranges and doesn't + * provide access to the PCMCIA attribute space. * * Pheecom sells cards with the TMD chip as "ASIC version" */ @@ -52,7 +40,6 @@ #define DRIVER_NAME "orinoco_tmd" #define PFX DRIVER_NAME ": " -#include #include #include #include @@ -61,32 +48,26 @@ #include #include "orinoco.h" +#include "orinoco_pci.h" #define COR_VALUE (COR_LEVEL_REQ | COR_FUNC_ENA) /* Enable PC card with interrupt in level trigger */ #define COR_RESET (0x80) /* reset bit in the COR register */ #define TMD_RESET_TIME (500) /* milliseconds */ -/* Orinoco TMD specific data */ -struct orinoco_tmd_card { - u32 tmd_io; -}; - - /* * Do a soft reset of the card using the Configuration Option Register */ static int orinoco_tmd_cor_reset(struct orinoco_private *priv) { hermes_t *hw = &priv->hw; - struct orinoco_tmd_card *card = priv->card; - u32 addr = card->tmd_io; + struct orinoco_pci_card *card = priv->card; unsigned long timeout; u16 reg; - outb(COR_VALUE | COR_RESET, addr); + iowrite8(COR_VALUE | COR_RESET, card->bridge_io); mdelay(1); - outb(COR_VALUE, addr); + iowrite8(COR_VALUE, card->bridge_io); mdelay(1); /* Just in case, wait more until the card is no longer busy */ @@ -97,7 +78,7 @@ static int orinoco_tmd_cor_reset(struct orinoco_private *priv) reg = hermes_read_regn(hw, CMD); } - /* Did we timeout ? */ + /* Still busy? */ if (reg & HERMES_CMD_BUSY) { printk(KERN_ERR PFX "Busy timeout\n"); return -ETIMEDOUT; @@ -110,11 +91,11 @@ static int orinoco_tmd_cor_reset(struct orinoco_private *priv) static int orinoco_tmd_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) { - int err = 0; - struct orinoco_private *priv = NULL; - struct orinoco_tmd_card *card; - struct net_device *dev = NULL; - void __iomem *mem; + int err; + struct orinoco_private *priv; + struct orinoco_pci_card *card; + struct net_device *dev; + void __iomem *hermes_io, *bridge_io; err = pci_enable_device(pdev); if (err) { @@ -123,20 +104,28 @@ static int orinoco_tmd_init_one(struct pci_dev *pdev, } err = pci_request_regions(pdev, DRIVER_NAME); - if (err != 0) { + if (err) { printk(KERN_ERR PFX "Cannot obtain PCI resources\n"); goto fail_resources; } - mem = pci_iomap(pdev, 2, 0); - if (! mem) { - err = -ENOMEM; - goto fail_iomap; + bridge_io = pci_iomap(pdev, 1, 0); + if (!bridge_io) { + printk(KERN_ERR PFX "Cannot map bridge registers\n"); + err = -EIO; + goto fail_map_bridge; + } + + hermes_io = pci_iomap(pdev, 2, 0); + if (!hermes_io) { + printk(KERN_ERR PFX "Cannot map chipset registers\n"); + err = -EIO; + goto fail_map_hermes; } /* Allocate network device */ dev = alloc_orinocodev(sizeof(*card), orinoco_tmd_cor_reset); - if (! dev) { + if (!dev) { printk(KERN_ERR PFX "Cannot allocate network device\n"); err = -ENOMEM; goto fail_alloc; @@ -144,25 +133,19 @@ static int orinoco_tmd_init_one(struct pci_dev *pdev, priv = netdev_priv(dev); card = priv->card; - card->tmd_io = pci_resource_start(pdev, 1); - dev->base_addr = pci_resource_start(pdev, 2); + card->bridge_io = bridge_io; SET_MODULE_OWNER(dev); SET_NETDEV_DEV(dev, &pdev->dev); - hermes_struct_init(&priv->hw, mem, HERMES_16BIT_REGSPACING); + hermes_struct_init(&priv->hw, hermes_io, HERMES_16BIT_REGSPACING); - printk(KERN_DEBUG PFX "Detected Orinoco/Prism2 TMD device " - "at %s irq:%d, io addr:0x%lx\n", pci_name(pdev), pdev->irq, - dev->base_addr); - - err = request_irq(pdev->irq, orinoco_interrupt, SA_SHIRQ, + err = request_irq(pdev->irq, orinoco_interrupt, IRQF_SHARED, dev->name, dev); if (err) { printk(KERN_ERR PFX "Cannot allocate IRQ %d\n", pdev->irq); err = -EBUSY; goto fail_irq; } - dev->irq = pdev->irq; err = orinoco_tmd_cor_reset(priv); if (err) { @@ -177,6 +160,8 @@ static int orinoco_tmd_init_one(struct pci_dev *pdev, } pci_set_drvdata(pdev, dev); + printk(KERN_DEBUG "%s: " DRIVER_NAME " at %s\n", dev->name, + pci_name(pdev)); return 0; @@ -188,9 +173,12 @@ static int orinoco_tmd_init_one(struct pci_dev *pdev, free_orinocodev(dev); fail_alloc: - pci_iounmap(pdev, mem); + pci_iounmap(pdev, hermes_io); + + fail_map_hermes: + pci_iounmap(pdev, bridge_io); - fail_iomap: + fail_map_bridge: pci_release_regions(pdev); fail_resources: @@ -203,31 +191,32 @@ static void __devexit orinoco_tmd_remove_one(struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); struct orinoco_private *priv = dev->priv; - - BUG_ON(! dev); + struct orinoco_pci_card *card = priv->card; unregister_netdev(dev); - free_irq(dev->irq, dev); + free_irq(pdev->irq, dev); pci_set_drvdata(pdev, NULL); free_orinocodev(dev); pci_iounmap(pdev, priv->hw.iobase); + pci_iounmap(pdev, card->bridge_io); pci_release_regions(pdev); pci_disable_device(pdev); } - -static struct pci_device_id orinoco_tmd_pci_id_table[] = { +static struct pci_device_id orinoco_tmd_id_table[] = { {0x15e8, 0x0131, PCI_ANY_ID, PCI_ANY_ID,}, /* NDC and OEMs, e.g. pheecom */ {0,}, }; -MODULE_DEVICE_TABLE(pci, orinoco_tmd_pci_id_table); +MODULE_DEVICE_TABLE(pci, orinoco_tmd_id_table); static struct pci_driver orinoco_tmd_driver = { .name = DRIVER_NAME, - .id_table = orinoco_tmd_pci_id_table, + .id_table = orinoco_tmd_id_table, .probe = orinoco_tmd_init_one, .remove = __devexit_p(orinoco_tmd_remove_one), + .suspend = orinoco_pci_suspend, + .resume = orinoco_pci_resume, }; static char version[] __initdata = DRIVER_NAME " " DRIVER_VERSION @@ -245,7 +234,6 @@ static int __init orinoco_tmd_init(void) static void __exit orinoco_tmd_exit(void) { pci_unregister_driver(&orinoco_tmd_driver); - ssleep(1); } module_init(orinoco_tmd_init); diff --git a/drivers/net/wireless/prism54/islpci_hotplug.c b/drivers/net/wireless/prism54/islpci_hotplug.c index bfa0cc319..09fc17a0f 100644 --- a/drivers/net/wireless/prism54/islpci_hotplug.c +++ b/drivers/net/wireless/prism54/islpci_hotplug.c @@ -189,7 +189,7 @@ prism54_probe(struct pci_dev *pdev, const struct pci_device_id *id) /* request for the interrupt before uploading the firmware */ rvalue = request_irq(pdev->irq, &islpci_interrupt, - SA_SHIRQ, ndev->name, priv); + IRQF_SHARED, ndev->name, priv); if (rvalue) { /* error, could not hook the handler to the irq */ diff --git a/drivers/net/wireless/prism54/islpci_mgt.c b/drivers/net/wireless/prism54/islpci_mgt.c index 6a60c5970..2e061a80b 100644 --- a/drivers/net/wireless/prism54/islpci_mgt.c +++ b/drivers/net/wireless/prism54/islpci_mgt.c @@ -18,7 +18,6 @@ * */ -#include #include #include #include diff --git a/drivers/net/wireless/prism54/prismcompat.h b/drivers/net/wireless/prism54/prismcompat.h index 55541c017..d71eca55a 100644 --- a/drivers/net/wireless/prism54/prismcompat.h +++ b/drivers/net/wireless/prism54/prismcompat.h @@ -29,7 +29,6 @@ #include #include -#include #include #include #include diff --git a/drivers/net/wireless/ray_cs.c b/drivers/net/wireless/ray_cs.c index 879eb4276..61b83a5e7 100644 --- a/drivers/net/wireless/ray_cs.c +++ b/drivers/net/wireless/ray_cs.c @@ -30,7 +30,6 @@ * =============================================================================*/ -#include #include #include #include @@ -924,8 +923,7 @@ static int ray_dev_start_xmit(struct sk_buff *skb, struct net_device *dev) if (length < ETH_ZLEN) { - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) + if (skb_padto(skb, ETH_ZLEN)) return 0; length = ETH_ZLEN; } diff --git a/drivers/net/wireless/spectrum_cs.c b/drivers/net/wireless/spectrum_cs.c index 54fe4e4ea..bcc703813 100644 --- a/drivers/net/wireless/spectrum_cs.c +++ b/drivers/net/wireless/spectrum_cs.c @@ -1,6 +1,6 @@ /* * Driver for 802.11b cards using RAM-loadable Symbol firmware, such as - * Symbol Wireless Networker LA4100, CompactFlash cards by Socket + * Symbol Wireless Networker LA4137, CompactFlash cards by Socket * Communications and Intel PRO/Wireless 2011B. * * The driver implements Symbol firmware download. The rest is handled @@ -21,7 +21,6 @@ #define DRIVER_NAME "spectrum_cs" #define PFX DRIVER_NAME ": " -#include #include #include #include @@ -35,8 +34,6 @@ #include "orinoco.h" -static unsigned char *primsym; -static unsigned char *secsym; static const char primary_fw_name[] = "symbol_sp24t_prim_fw"; static const char secondary_fw_name[] = "symbol_sp24t_sec_fw"; @@ -120,8 +117,8 @@ static void spectrum_cs_release(struct pcmcia_device *link); * Each block has the following structure. */ struct dblock { - __le32 _addr; /* adapter address where to write the block */ - __le16 _len; /* length of the data only, in bytes */ + __le32 addr; /* adapter address where to write the block */ + __le16 len; /* length of the data only, in bytes */ char data[0]; /* data to be written */ } __attribute__ ((packed)); @@ -131,9 +128,9 @@ struct dblock { * items with matching ID should be written. */ struct pdr { - __le32 _id; /* record ID */ - __le32 _addr; /* adapter address where to write the data */ - __le32 _len; /* expected length of the data, in bytes */ + __le32 id; /* record ID */ + __le32 addr; /* adapter address where to write the data */ + __le32 len; /* expected length of the data, in bytes */ char next[0]; /* next PDR starts here */ } __attribute__ ((packed)); @@ -144,8 +141,8 @@ struct pdr { * be plugged into the secondary firmware. */ struct pdi { - __le16 _len; /* length of ID and data, in words */ - __le16 _id; /* record ID */ + __le16 len; /* length of ID and data, in words */ + __le16 id; /* record ID */ char data[0]; /* plug data */ } __attribute__ ((packed)); @@ -154,44 +151,44 @@ struct pdi { static inline u32 dblock_addr(const struct dblock *blk) { - return le32_to_cpu(blk->_addr); + return le32_to_cpu(blk->addr); } static inline u32 dblock_len(const struct dblock *blk) { - return le16_to_cpu(blk->_len); + return le16_to_cpu(blk->len); } static inline u32 pdr_id(const struct pdr *pdr) { - return le32_to_cpu(pdr->_id); + return le32_to_cpu(pdr->id); } static inline u32 pdr_addr(const struct pdr *pdr) { - return le32_to_cpu(pdr->_addr); + return le32_to_cpu(pdr->addr); } static inline u32 pdr_len(const struct pdr *pdr) { - return le32_to_cpu(pdr->_len); + return le32_to_cpu(pdr->len); } static inline u32 pdi_id(const struct pdi *pdi) { - return le16_to_cpu(pdi->_id); + return le16_to_cpu(pdi->id); } /* Return length of the data only, in bytes */ static inline u32 pdi_len(const struct pdi *pdi) { - return 2 * (le16_to_cpu(pdi->_len) - 1); + return 2 * (le16_to_cpu(pdi->len) - 1); } @@ -343,8 +340,7 @@ spectrum_plug_pdi(hermes_t *hw, struct pdr *first_pdr, struct pdi *pdi) /* do the actual plugging */ spectrum_aux_setaddr(hw, pdr_addr(pdr)); - hermes_write_words(hw, HERMES_AUXDATA, pdi->data, - pdi_len(pdi) / 2); + hermes_write_bytes(hw, HERMES_AUXDATA, pdi->data, pdi_len(pdi)); return 0; } @@ -424,8 +420,8 @@ spectrum_load_blocks(hermes_t *hw, const struct dblock *first_block) while (dblock_addr(blk) != BLOCK_END) { spectrum_aux_setaddr(hw, blkaddr); - hermes_write_words(hw, HERMES_AUXDATA, blk->data, - blklen / 2); + hermes_write_bytes(hw, HERMES_AUXDATA, blk->data, + blklen); blk = (struct dblock *) &blk->data[blklen]; blkaddr = dblock_addr(blk); @@ -442,7 +438,7 @@ spectrum_load_blocks(hermes_t *hw, const struct dblock *first_block) */ static int spectrum_dl_image(hermes_t *hw, struct pcmcia_device *link, - const unsigned char *image) + const unsigned char *image, int secondary) { int ret; const unsigned char *ptr; @@ -457,7 +453,7 @@ spectrum_dl_image(hermes_t *hw, struct pcmcia_device *link, first_block = (const struct dblock *) ptr; /* Read the PDA */ - if (image != primsym) { + if (secondary) { ret = spectrum_read_pda(hw, pda, sizeof(pda)); if (ret) return ret; @@ -474,7 +470,7 @@ spectrum_dl_image(hermes_t *hw, struct pcmcia_device *link, return ret; /* Write the PDA to the adapter */ - if (image != primsym) { + if (secondary) { ret = spectrum_apply_pda(hw, first_block, pda); if (ret) return ret; @@ -489,7 +485,7 @@ spectrum_dl_image(hermes_t *hw, struct pcmcia_device *link, ret = hermes_init(hw); /* hermes_reset() should return 0 with the secondary firmware */ - if (image != primsym && ret != 0) + if (secondary && ret != 0) return -ENODEV; /* And this should work with any firmware */ @@ -511,33 +507,30 @@ spectrum_dl_firmware(hermes_t *hw, struct pcmcia_device *link) const struct firmware *fw_entry; if (request_firmware(&fw_entry, primary_fw_name, - &handle_to_dev(link)) == 0) { - primsym = fw_entry->data; - } else { + &handle_to_dev(link)) != 0) { printk(KERN_ERR PFX "Cannot find firmware: %s\n", primary_fw_name); return -ENOENT; } - if (request_firmware(&fw_entry, secondary_fw_name, - &handle_to_dev(link)) == 0) { - secsym = fw_entry->data; - } else { - printk(KERN_ERR PFX "Cannot find firmware: %s\n", - secondary_fw_name); - return -ENOENT; - } - /* Load primary firmware */ - ret = spectrum_dl_image(hw, link, primsym); + ret = spectrum_dl_image(hw, link, fw_entry->data, 0); + release_firmware(fw_entry); if (ret) { printk(KERN_ERR PFX "Primary firmware download failed\n"); return ret; } - /* Load secondary firmware */ - ret = spectrum_dl_image(hw, link, secsym); + if (request_firmware(&fw_entry, secondary_fw_name, + &handle_to_dev(link)) != 0) { + printk(KERN_ERR PFX "Cannot find firmware: %s\n", + secondary_fw_name); + return -ENOENT; + } + /* Load secondary firmware */ + ret = spectrum_dl_image(hw, link, fw_entry->data, 1); + release_firmware(fw_entry); if (ret) { printk(KERN_ERR PFX "Secondary firmware download failed\n"); } @@ -626,14 +619,11 @@ static void spectrum_cs_detach(struct pcmcia_device *link) { struct net_device *dev = link->priv; + if (link->dev_node) + unregister_netdev(dev); + spectrum_cs_release(link); - DEBUG(0, PFX "detach: link=%p link->dev_node=%p\n", link, link->dev_node); - if (link->dev_node) { - DEBUG(0, PFX "About to unregister net device %p\n", - dev); - unregister_netdev(dev); - } free_orinocodev(dev); } /* spectrum_cs_detach */ @@ -653,13 +643,10 @@ spectrum_cs_config(struct pcmcia_device *link) int last_fn, last_ret; u_char buf[64]; config_info_t conf; - cisinfo_t info; tuple_t tuple; cisparse_t parse; void __iomem *mem; - CS_CHECK(ValidateCIS, pcmcia_validate_cis(link, &info)); - /* * This reads the card's CONFIG tuple to find its * configuration registers. @@ -709,12 +696,6 @@ spectrum_cs_config(struct pcmcia_device *link) goto next_entry; link->conf.ConfigIndex = cfg->index; - /* Does this card need audio output? */ - if (cfg->flags & CISTPL_CFTABLE_AUDIO) { - link->conf.Attributes |= CONF_ENABLE_SPKR; - link->conf.Status = CCSR_AUDIO_ENA; - } - /* Use power settings for Vcc and Vpp if present */ /* Note that the CIS values need to be rescaled */ if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) { @@ -835,19 +816,10 @@ spectrum_cs_config(struct pcmcia_device *link) net_device has been registered */ /* Finally, report what we've done */ - printk(KERN_DEBUG "%s: index 0x%02x: ", - dev->name, link->conf.ConfigIndex); - if (link->conf.Vpp) - printk(", Vpp %d.%d", link->conf.Vpp / 10, - link->conf.Vpp % 10); - printk(", irq %d", link->irq.AssignedIRQ); - if (link->io.NumPorts1) - printk(", io 0x%04x-0x%04x", link->io.BasePort1, - link->io.BasePort1 + link->io.NumPorts1 - 1); - if (link->io.NumPorts2) - printk(" & 0x%04x-0x%04x", link->io.BasePort2, - link->io.BasePort2 + link->io.NumPorts2 - 1); - printk("\n"); + printk(KERN_DEBUG "%s: " DRIVER_NAME " at %s, irq %d, io " + "0x%04x-0x%04x\n", dev->name, dev->class_dev.dev->bus_id, + link->irq.AssignedIRQ, link->io.BasePort1, + link->io.BasePort1 + link->io.NumPorts1 - 1); return 0; @@ -888,11 +860,10 @@ spectrum_cs_suspend(struct pcmcia_device *link) { struct net_device *dev = link->priv; struct orinoco_private *priv = netdev_priv(dev); - unsigned long flags; int err = 0; /* Mark the device as stopped, to block IO until later */ - spin_lock_irqsave(&priv->lock, flags); + spin_lock(&priv->lock); err = __orinoco_down(dev); if (err) @@ -902,9 +873,9 @@ spectrum_cs_suspend(struct pcmcia_device *link) netif_device_detach(dev); priv->hw_unavailable++; - spin_unlock_irqrestore(&priv->lock, flags); + spin_unlock(&priv->lock); - return 0; + return err; } static int @@ -932,7 +903,7 @@ static char version[] __initdata = DRIVER_NAME " " DRIVER_VERSION " David Gibson , et al)"; static struct pcmcia_device_id spectrum_cs_ids[] = { - PCMCIA_DEVICE_MANF_CARD(0x026c, 0x0001), /* Symbol Spectrum24 LA4100 */ + PCMCIA_DEVICE_MANF_CARD(0x026c, 0x0001), /* Symbol Spectrum24 LA4137 */ PCMCIA_DEVICE_MANF_CARD(0x0104, 0x0001), /* Socket Communications CF */ PCMCIA_DEVICE_PROD_ID12("Intel", "PRO/Wireless LAN PC Card", 0x816cc815, 0x6fbf459a), /* 2011B, not 2011 */ PCMCIA_DEVICE_NULL, diff --git a/drivers/net/wireless/strip.c b/drivers/net/wireless/strip.c index 18a44580b..ccaf28e8d 100644 --- a/drivers/net/wireless/strip.c +++ b/drivers/net/wireless/strip.c @@ -81,7 +81,6 @@ static const char StripVersion[] = "1.3A-STUART.CHESHIRE"; /************************************************************************/ /* Header files */ -#include #include #include #include @@ -468,6 +467,7 @@ static int arp_query(unsigned char *haddr, u32 paddr, struct net_device *dev) { struct neighbour *neighbor_entry; + int ret = 0; neighbor_entry = neigh_lookup(&arp_tbl, &paddr, dev); @@ -475,10 +475,11 @@ static int arp_query(unsigned char *haddr, u32 paddr, neighbor_entry->used = jiffies; if (neighbor_entry->nud_state & NUD_VALID) { memcpy(haddr, neighbor_entry->ha, dev->addr_len); - return 1; + ret = 1; } + neigh_release(neighbor_entry); } - return 0; + return ret; } static void DumpData(char *msg, struct strip *strip_info, __u8 * ptr, diff --git a/drivers/net/wireless/wavelan.c b/drivers/net/wireless/wavelan.c index dade4b903..5b69befda 100644 --- a/drivers/net/wireless/wavelan.c +++ b/drivers/net/wireless/wavelan.c @@ -1695,8 +1695,8 @@ static int wv_frequency_list(unsigned long ioaddr, /* I/O port of the card */ /* Look in the table if the frequency is allowed */ if (table[9 - (freq / 16)] & (1 << (freq % 16))) { /* Compute approximate channel number */ - while ((((channel_bands[c] >> 1) - 24) < freq) && - (c < NELS(channel_bands))) + while ((c < NELS(channel_bands)) && + (((channel_bands[c] >> 1) - 24) < freq)) c++; list[i].i = c; /* Set the list index */ @@ -2903,6 +2903,7 @@ static int wavelan_packet_xmit(struct sk_buff *skb, struct net_device * dev) { net_local *lp = (net_local *) dev->priv; unsigned long flags; + char data[ETH_ZLEN]; #ifdef DEBUG_TX_TRACE printk(KERN_DEBUG "%s: ->wavelan_packet_xmit(0x%X)\n", dev->name, @@ -2937,15 +2938,16 @@ static int wavelan_packet_xmit(struct sk_buff *skb, struct net_device * dev) * able to detect collisions, therefore in theory we don't really * need to pad. Jean II */ if (skb->len < ETH_ZLEN) { - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) - return 0; + memset(data, 0, ETH_ZLEN); + memcpy(data, skb->data, skb->len); + /* Write packet on the card */ + if(wv_packet_write(dev, data, ETH_ZLEN)) + return 1; /* We failed */ } - - /* Write packet on the card */ - if(wv_packet_write(dev, skb->data, skb->len)) + else if(wv_packet_write(dev, skb->data, skb->len)) return 1; /* We failed */ + dev_kfree_skb(skb); #ifdef DEBUG_TX_TRACE diff --git a/drivers/net/wireless/wavelan_cs.c b/drivers/net/wireless/wavelan_cs.c index f7724eb2f..561250f73 100644 --- a/drivers/net/wireless/wavelan_cs.c +++ b/drivers/net/wireless/wavelan_cs.c @@ -3194,11 +3194,8 @@ wavelan_packet_xmit(struct sk_buff * skb, * and we don't have the Ethernet specific requirement of beeing * able to detect collisions, therefore in theory we don't really * need to pad. Jean II */ - if (skb->len < ETH_ZLEN) { - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) - return 0; - } + if (skb_padto(skb, ETH_ZLEN)) + return 0; wv_packet_write(dev, skb->data, skb->len); diff --git a/drivers/net/wireless/wavelan_cs.p.h b/drivers/net/wireless/wavelan_cs.p.h index c65fe7a39..f34a36b0c 100644 --- a/drivers/net/wireless/wavelan_cs.p.h +++ b/drivers/net/wireless/wavelan_cs.p.h @@ -411,7 +411,6 @@ /***************************** INCLUDES *****************************/ /* Linux headers that we need */ -#include #include #include #include diff --git a/drivers/net/wireless/wl3501_cs.c b/drivers/net/wireless/wl3501_cs.c index e52a650f6..c03e400fa 100644 --- a/drivers/net/wireless/wl3501_cs.c +++ b/drivers/net/wireless/wl3501_cs.c @@ -28,7 +28,6 @@ */ #undef REALLY_SLOW_IO /* most systems can safely undef this */ -#include #include #include #include diff --git a/drivers/net/yellowfin.c b/drivers/net/yellowfin.c index fd0f43b7d..8459a1825 100644 --- a/drivers/net/yellowfin.c +++ b/drivers/net/yellowfin.c @@ -19,37 +19,13 @@ Support and updates available at http://www.scyld.com/network/yellowfin.html + [link no longer provides useful info -jgarzik] - - Linux kernel changelog: - ----------------------- - - LK1.1.1 (jgarzik): Port to 2.4 kernel - - LK1.1.2 (jgarzik): - * Merge in becker version 1.05 - - LK1.1.3 (jgarzik): - * Various cleanups - * Update yellowfin_timer to correctly calculate duplex. - (suggested by Manfred Spraul) - - LK1.1.4 (val@nmt.edu): - * Fix three endian-ness bugs - * Support dual function SYM53C885E ethernet chip - - LK1.1.5 (val@nmt.edu): - * Fix forced full-duplex bug I introduced - - LK1.1.6 (val@nmt.edu): - * Only print warning on truly "oversized" packets - * Fix theoretical bug on gigabit cards - return to 1.1.3 behavior - */ #define DRV_NAME "yellowfin" -#define DRV_VERSION "1.05+LK1.1.6" -#define DRV_RELDATE "Feb 11, 2002" +#define DRV_VERSION "2.0" +#define DRV_RELDATE "Jun 27, 2006" #define PFX DRV_NAME ": " @@ -234,26 +210,16 @@ See Packet Engines confidential appendix (prototype chips only). -enum pci_id_flags_bits { - /* Set PCI command register bits before calling probe1(). */ - PCI_USES_IO=1, PCI_USES_MEM=2, PCI_USES_MASTER=4, - /* Read and map the single following PCI BAR. */ - PCI_ADDR0=0<<4, PCI_ADDR1=1<<4, PCI_ADDR2=2<<4, PCI_ADDR3=3<<4, - PCI_ADDR_64BITS=0x100, PCI_NO_ACPI_WAKE=0x200, PCI_NO_MIN_LATENCY=0x400, - PCI_UNUSED_IRQ=0x800, -}; enum capability_flags { HasMII=1, FullTxStatus=2, IsGigabit=4, HasMulticastBug=8, FullRxStatus=16, HasMACAddrBug=32, /* Only on early revs. */ DontUseEeprom=64, /* Don't read the MAC from the EEPROm. */ }; + /* The PCI I/O space extent. */ -#define YELLOWFIN_SIZE 0x100 -#ifdef USE_IO_OPS -#define PCI_IOTYPE (PCI_USES_MASTER | PCI_USES_IO | PCI_ADDR0) -#else -#define PCI_IOTYPE (PCI_USES_MASTER | PCI_USES_MEM | PCI_ADDR1) -#endif +enum { + YELLOWFIN_SIZE = 0x100, +}; struct pci_id_info { const char *name; @@ -261,24 +227,21 @@ struct pci_id_info { int pci, pci_mask, subsystem, subsystem_mask; int revision, revision_mask; /* Only 8 bits. */ } id; - enum pci_id_flags_bits pci_flags; - int io_size; /* Needed for I/O region check or ioremap(). */ int drv_flags; /* Driver use, intended as capability flags. */ }; static const struct pci_id_info pci_id_tbl[] = { {"Yellowfin G-NIC Gigabit Ethernet", { 0x07021000, 0xffffffff}, - PCI_IOTYPE, YELLOWFIN_SIZE, FullTxStatus | IsGigabit | HasMulticastBug | HasMACAddrBug | DontUseEeprom}, {"Symbios SYM83C885", { 0x07011000, 0xffffffff}, - PCI_IOTYPE, YELLOWFIN_SIZE, HasMII | DontUseEeprom }, - {NULL,}, + HasMII | DontUseEeprom }, + { } }; -static struct pci_device_id yellowfin_pci_tbl[] = { +static const struct pci_device_id yellowfin_pci_tbl[] = { { 0x1000, 0x0702, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, { 0x1000, 0x0701, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 }, - { 0, } + { } }; MODULE_DEVICE_TABLE (pci, yellowfin_pci_tbl); @@ -616,7 +579,7 @@ static int yellowfin_open(struct net_device *dev) /* Reset the chip. */ iowrite32(0x80000000, ioaddr + DMACtrl); - i = request_irq(dev->irq, &yellowfin_interrupt, SA_SHIRQ, dev->name, dev); + i = request_irq(dev->irq, &yellowfin_interrupt, IRQF_SHARED, dev->name, dev); if (i) return i; if (yellowfin_debug > 1) @@ -862,13 +825,11 @@ static int yellowfin_start_xmit(struct sk_buff *skb, struct net_device *dev) /* Fix GX chipset errata. */ if (cacheline_end > 24 || cacheline_end == 0) { len = skb->len + 32 - cacheline_end + 1; - if (len != skb->len) - skb = skb_padto(skb, len); - } - if (skb == NULL) { - yp->tx_skbuff[entry] = NULL; - netif_wake_queue(dev); - return 0; + if (skb_padto(skb, len)) { + yp->tx_skbuff[entry] = NULL; + netif_wake_queue(dev); + return 0; + } } } yp->tx_skbuff[entry] = skb; diff --git a/drivers/net/znet.c b/drivers/net/znet.c index 3ac047bc7..9f0291f35 100644 --- a/drivers/net/znet.c +++ b/drivers/net/znet.c @@ -85,7 +85,6 @@ - Understand why some traffic patterns add a 1s latency... */ -#include #include #include #include @@ -544,8 +543,7 @@ static int znet_send_packet(struct sk_buff *skb, struct net_device *dev) printk(KERN_DEBUG "%s: ZNet_send_packet.\n", dev->name); if (length < ETH_ZLEN) { - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) + if (skb_padto(skb, ETH_ZLEN)) return 0; length = ETH_ZLEN; } diff --git a/drivers/net/zorro8390.c b/drivers/net/zorro8390.c index 8037e5806..df04e050c 100644 --- a/drivers/net/zorro8390.c +++ b/drivers/net/zorro8390.c @@ -201,7 +201,7 @@ static int __devinit zorro8390_init(struct net_device *dev, dev->irq = IRQ_AMIGA_PORTS; /* Install the Interrupt handler */ - i = request_irq(IRQ_AMIGA_PORTS, ei_interrupt, SA_SHIRQ, DRV_NAME, dev); + i = request_irq(IRQ_AMIGA_PORTS, ei_interrupt, IRQF_SHARED, DRV_NAME, dev); if (i) return i; for(i = 0; i < ETHER_ADDR_LEN; i++) { diff --git a/drivers/nubus/nubus.c b/drivers/nubus/nubus.c index 14cbe34eb..3a0a3a734 100644 --- a/drivers/nubus/nubus.c +++ b/drivers/nubus/nubus.c @@ -7,7 +7,6 @@ * and others. */ -#include #include #include #include diff --git a/drivers/nubus/nubus_syms.c b/drivers/nubus/nubus_syms.c index 22c1dc9f8..9204f04fb 100644 --- a/drivers/nubus/nubus_syms.c +++ b/drivers/nubus/nubus_syms.c @@ -2,7 +2,6 @@ (c) 1999 David Huggins-Daines */ -#include #include #include #include diff --git a/drivers/oprofile/buffer_sync.c b/drivers/oprofile/buffer_sync.c index a647d3982..13416adfb 100644 --- a/drivers/oprofile/buffer_sync.c +++ b/drivers/oprofile/buffer_sync.c @@ -112,10 +112,10 @@ static int module_load_notify(struct notifier_block * self, unsigned long val, v return 0; /* FIXME: should we process all CPU buffers ? */ - down(&buffer_sem); + mutex_lock(&buffer_mutex); add_event_entry(ESCAPE_CODE); add_event_entry(MODULE_LOADED_CODE); - up(&buffer_sem); + mutex_unlock(&buffer_mutex); #endif return 0; } @@ -522,7 +522,7 @@ void sync_buffer(int cpu) unsigned long available; int domain_switch = 0; - down(&buffer_sem); + mutex_lock(&buffer_mutex); add_cpu_switch(cpu); @@ -578,5 +578,5 @@ void sync_buffer(int cpu) mark_done(cpu); - up(&buffer_sem); + mutex_unlock(&buffer_mutex); } diff --git a/drivers/oprofile/event_buffer.c b/drivers/oprofile/event_buffer.c index b80318f03..04d641714 100644 --- a/drivers/oprofile/event_buffer.c +++ b/drivers/oprofile/event_buffer.c @@ -24,7 +24,7 @@ #include "event_buffer.h" #include "oprofile_stats.h" -DECLARE_MUTEX(buffer_sem); +DEFINE_MUTEX(buffer_mutex); static unsigned long buffer_opened; static DECLARE_WAIT_QUEUE_HEAD(buffer_wait); @@ -32,7 +32,7 @@ static unsigned long * event_buffer; static unsigned long buffer_size; static unsigned long buffer_watershed; static size_t buffer_pos; -/* atomic_t because wait_event checks it outside of buffer_sem */ +/* atomic_t because wait_event checks it outside of buffer_mutex */ static atomic_t buffer_ready = ATOMIC_INIT(0); /* Add an entry to the event buffer. When we @@ -60,10 +60,10 @@ void add_event_entry(unsigned long value) */ void wake_up_buffer_waiter(void) { - down(&buffer_sem); + mutex_lock(&buffer_mutex); atomic_set(&buffer_ready, 1); wake_up(&buffer_wait); - up(&buffer_sem); + mutex_unlock(&buffer_mutex); } @@ -162,7 +162,7 @@ static ssize_t event_buffer_read(struct file * file, char __user * buf, if (!atomic_read(&buffer_ready)) return -EAGAIN; - down(&buffer_sem); + mutex_lock(&buffer_mutex); atomic_set(&buffer_ready, 0); @@ -177,7 +177,7 @@ static ssize_t event_buffer_read(struct file * file, char __user * buf, buffer_pos = 0; out: - up(&buffer_sem); + mutex_unlock(&buffer_mutex); return retval; } diff --git a/drivers/oprofile/event_buffer.h b/drivers/oprofile/event_buffer.h index 0c33ee71e..6a8878866 100644 --- a/drivers/oprofile/event_buffer.h +++ b/drivers/oprofile/event_buffer.h @@ -11,7 +11,7 @@ #define EVENT_BUFFER_H #include -#include +#include int alloc_event_buffer(void); @@ -51,6 +51,6 @@ extern struct file_operations event_buffer_fops; /* mutex between sync_cpu_buffers() and the * file reading code. */ -extern struct semaphore buffer_sem; +extern struct mutex buffer_mutex; #endif /* EVENT_BUFFER_H */ diff --git a/drivers/oprofile/oprof.c b/drivers/oprofile/oprof.c index 76bac8dfe..b82a7b5aa 100644 --- a/drivers/oprofile/oprof.c +++ b/drivers/oprofile/oprof.c @@ -16,7 +16,7 @@ #include #include #include -#include +#include #include "oprof.h" #include "event_buffer.h" @@ -29,7 +29,7 @@ struct oprofile_operations oprofile_ops; unsigned long oprofile_started; unsigned long backtrace_depth; static unsigned long is_setup; -static DECLARE_MUTEX(start_sem); +static DEFINE_MUTEX(start_mutex); /* timer 0 - use performance monitoring hardware if available @@ -37,7 +37,6 @@ static DECLARE_MUTEX(start_sem); */ static int timer = 0; -#ifdef CONFIG_XEN int oprofile_set_active(int active_domains[], unsigned int adomains) { int err; @@ -45,9 +44,9 @@ int oprofile_set_active(int active_domains[], unsigned int adomains) if (!oprofile_ops.set_active) return -EINVAL; - down(&start_sem); + mutex_lock(&start_mutex); err = oprofile_ops.set_active(active_domains, adomains); - up(&start_sem); + mutex_unlock(&start_mutex); return err; } @@ -58,18 +57,17 @@ int oprofile_set_passive(int passive_domains[], unsigned int pdomains) if (!oprofile_ops.set_passive) return -EINVAL; - down(&start_sem); + mutex_lock(&start_mutex); err = oprofile_ops.set_passive(passive_domains, pdomains); - up(&start_sem); + mutex_unlock(&start_mutex); return err; } -#endif int oprofile_setup(void) { int err; - down(&start_sem); + mutex_lock(&start_mutex); if ((err = alloc_cpu_buffers())) goto out; @@ -89,7 +87,7 @@ int oprofile_setup(void) goto out3; is_setup = 1; - up(&start_sem); + mutex_unlock(&start_mutex); return 0; out3: @@ -100,7 +98,7 @@ out2: out1: free_cpu_buffers(); out: - up(&start_sem); + mutex_unlock(&start_mutex); return err; } @@ -110,7 +108,7 @@ int oprofile_start(void) { int err = -EINVAL; - down(&start_sem); + mutex_lock(&start_mutex); if (!is_setup) goto out; @@ -127,7 +125,7 @@ int oprofile_start(void) oprofile_started = 1; out: - up(&start_sem); + mutex_unlock(&start_mutex); return err; } @@ -135,7 +133,7 @@ out: /* echo 0>/dev/oprofile/enable */ void oprofile_stop(void) { - down(&start_sem); + mutex_lock(&start_mutex); if (!oprofile_started) goto out; oprofile_ops.stop(); @@ -143,20 +141,20 @@ void oprofile_stop(void) /* wake up the daemon to read what remains */ wake_up_buffer_waiter(); out: - up(&start_sem); + mutex_unlock(&start_mutex); } void oprofile_shutdown(void) { - down(&start_sem); + mutex_lock(&start_mutex); sync_stop(); if (oprofile_ops.shutdown) oprofile_ops.shutdown(); is_setup = 0; free_event_buffer(); free_cpu_buffers(); - up(&start_sem); + mutex_unlock(&start_mutex); } @@ -164,7 +162,7 @@ int oprofile_set_backtrace(unsigned long val) { int err = 0; - down(&start_sem); + mutex_lock(&start_mutex); if (oprofile_started) { err = -EBUSY; @@ -179,7 +177,7 @@ int oprofile_set_backtrace(unsigned long val) backtrace_depth = val; out: - up(&start_sem); + mutex_unlock(&start_mutex); return err; } diff --git a/drivers/oprofile/oprof.h b/drivers/oprofile/oprof.h index 587db2b0a..4ae4ff97b 100644 --- a/drivers/oprofile/oprof.h +++ b/drivers/oprofile/oprof.h @@ -36,9 +36,7 @@ void oprofile_timer_init(struct oprofile_operations * ops); int oprofile_set_backtrace(unsigned long depth); -#ifdef CONFIG_XEN int oprofile_set_active(int active_domains[], unsigned int adomains); int oprofile_set_passive(int passive_domains[], unsigned int pdomains); -#endif - + #endif /* OPROF_H */ diff --git a/drivers/oprofile/oprofile_files.c b/drivers/oprofile/oprofile_files.c index 388846526..3bb1e6ff7 100644 --- a/drivers/oprofile/oprofile_files.c +++ b/drivers/oprofile/oprofile_files.c @@ -124,9 +124,10 @@ static struct file_operations dump_fops = { .write = dump_write, }; +#ifdef CONFIG_XEN + #define TMPBUFSIZE 512 -#ifdef CONFIG_XEN static unsigned int adomains = 0; static int active_domains[MAX_OPROF_DOMAINS + 1]; static DEFINE_MUTEX(adom_mutex); @@ -313,6 +314,7 @@ static struct file_operations passive_domain_ops = { .read = pdomain_read, .write = pdomain_write, }; + #endif /* CONFIG_XEN */ void oprofile_create_files(struct super_block * sb, struct dentry * root) diff --git a/drivers/oprofile/oprofilefs.c b/drivers/oprofile/oprofilefs.c index b62da9b0c..5756401fb 100644 --- a/drivers/oprofile/oprofilefs.c +++ b/drivers/oprofile/oprofilefs.c @@ -31,7 +31,6 @@ static struct inode * oprofilefs_get_inode(struct super_block * sb, int mode) inode->i_mode = mode; inode->i_uid = 0; inode->i_gid = 0; - inode->i_blksize = PAGE_CACHE_SIZE; inode->i_blocks = 0; inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; } @@ -110,8 +109,8 @@ static ssize_t ulong_write_file(struct file * file, char const __user * buf, siz static int default_open(struct inode * inode, struct file * filp) { - if (inode->u.generic_ip) - filp->private_data = inode->u.generic_ip; + if (inode->i_private) + filp->private_data = inode->i_private; return 0; } @@ -158,7 +157,7 @@ int oprofilefs_create_ulong(struct super_block * sb, struct dentry * root, if (!d) return -EFAULT; - d->d_inode->u.generic_ip = val; + d->d_inode->i_private = val; return 0; } @@ -171,7 +170,7 @@ int oprofilefs_create_ro_ulong(struct super_block * sb, struct dentry * root, if (!d) return -EFAULT; - d->d_inode->u.generic_ip = val; + d->d_inode->i_private = val; return 0; } @@ -197,7 +196,7 @@ int oprofilefs_create_ro_atomic(struct super_block * sb, struct dentry * root, if (!d) return -EFAULT; - d->d_inode->u.generic_ip = val; + d->d_inode->i_private = val; return 0; } @@ -272,10 +271,10 @@ static int oprofilefs_fill_super(struct super_block * sb, void * data, int silen } -static struct super_block *oprofilefs_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int oprofilefs_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_single(fs_type, flags, data, oprofilefs_fill_super); + return get_sb_single(fs_type, flags, data, oprofilefs_fill_super, mnt); } diff --git a/drivers/parisc/Kconfig b/drivers/parisc/Kconfig index 3f5de867a..1d3b84b4a 100644 --- a/drivers/parisc/Kconfig +++ b/drivers/parisc/Kconfig @@ -140,18 +140,37 @@ config CHASSIS_LCD_LED If unsure, say Y. config PDC_CHASSIS - bool "PDC chassis State Panel support" + bool "PDC chassis state codes support" default y help - Say Y here if you want to enable support for the LED State front - panel as found on E class, and support for the GSP Virtual Front - Panel (LED State and message logging) as found on high end - servers such as A, L and N-class. - - This has nothing to do with Chassis LCD and LED support. + Say Y here if you want to enable support for Chassis codes. + That includes support for LED State front panel as found on E + class, and support for the GSP Virtual Front Panel (LED State and + message logging) as found on high end servers such as A, L and + N-class. + This driver will also display progress messages on LCD display, + such as "INI", "RUN" and "FLT", and might thus clobber messages + shown by the LED/LCD driver. + This driver updates the state panel (LED and/or LCD) upon system + state change (eg: boot, shutdown or panic). If unsure, say Y. + +config PDC_CHASSIS_WARN + bool "PDC chassis warnings support" + depends on PROC_FS + default y + help + Say Y here if you want to enable support for Chassis warnings. + This will add a proc entry '/proc/chassis' giving some information + about the overall health state of the system. + This includes NVRAM battery level, overtemp or failures such as + fans or power units. + + If unsure, say Y. + + config PDC_STABLE tristate "PDC Stable Storage support" depends on SYSFS diff --git a/drivers/parisc/ccio-dma.c b/drivers/parisc/ccio-dma.c index a5d826237..68cb3a080 100644 --- a/drivers/parisc/ccio-dma.c +++ b/drivers/parisc/ccio-dma.c @@ -31,7 +31,6 @@ ** the coherency design originally worked out. Only PCX-W does. */ -#include #include #include #include diff --git a/drivers/parisc/dino.c b/drivers/parisc/dino.c index 6e8ed0c81..0d96c50ff 100644 --- a/drivers/parisc/dino.c +++ b/drivers/parisc/dino.c @@ -43,7 +43,6 @@ ** for PCI drivers devices which implement/use MMIO registers. */ -#include #include #include #include @@ -299,7 +298,7 @@ struct pci_port_ops dino_port_ops = { static void dino_disable_irq(unsigned int irq) { - struct dino_device *dino_dev = irq_desc[irq].handler_data; + struct dino_device *dino_dev = irq_desc[irq].chip_data; int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, DINO_LOCAL_IRQS); DBG(KERN_WARNING "%s(0x%p, %d)\n", __FUNCTION__, dino_dev, irq); @@ -311,7 +310,7 @@ static void dino_disable_irq(unsigned int irq) static void dino_enable_irq(unsigned int irq) { - struct dino_device *dino_dev = irq_desc[irq].handler_data; + struct dino_device *dino_dev = irq_desc[irq].chip_data; int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, DINO_LOCAL_IRQS); u32 tmp; diff --git a/drivers/parisc/eisa.c b/drivers/parisc/eisa.c index 9d3bd15bf..884965ced 100644 --- a/drivers/parisc/eisa.c +++ b/drivers/parisc/eisa.c @@ -340,7 +340,7 @@ static int __devinit eisa_probe(struct parisc_device *dev) } pcibios_register_hba(&eisa_dev.hba); - result = request_irq(dev->irq, eisa_irq, SA_SHIRQ, "EISA", &eisa_dev); + result = request_irq(dev->irq, eisa_irq, IRQF_SHARED, "EISA", &eisa_dev); if (result) { printk(KERN_ERR "EISA: request_irq failed!\n"); return result; @@ -350,7 +350,7 @@ static int __devinit eisa_probe(struct parisc_device *dev) irq_desc[2].action = &irq2_action; for (i = 0; i < 16; i++) { - irq_desc[i].handler = &eisa_interrupt_type; + irq_desc[i].chip = &eisa_interrupt_type; } EISA_bus = 1; diff --git a/drivers/parisc/gsc.c b/drivers/parisc/gsc.c index 16d40f959..b45aa5c67 100644 --- a/drivers/parisc/gsc.c +++ b/drivers/parisc/gsc.c @@ -14,7 +14,6 @@ */ #include -#include #include #include #include @@ -109,7 +108,7 @@ int gsc_find_local_irq(unsigned int irq, int *global_irqs, int limit) static void gsc_asic_disable_irq(unsigned int irq) { - struct gsc_asic *irq_dev = irq_desc[irq].handler_data; + struct gsc_asic *irq_dev = irq_desc[irq].chip_data; int local_irq = gsc_find_local_irq(irq, irq_dev->global_irq, 32); u32 imr; @@ -124,7 +123,7 @@ static void gsc_asic_disable_irq(unsigned int irq) static void gsc_asic_enable_irq(unsigned int irq) { - struct gsc_asic *irq_dev = irq_desc[irq].handler_data; + struct gsc_asic *irq_dev = irq_desc[irq].chip_data; int local_irq = gsc_find_local_irq(irq, irq_dev->global_irq, 32); u32 imr; @@ -164,8 +163,8 @@ int gsc_assign_irq(struct hw_interrupt_type *type, void *data) if (irq > GSC_IRQ_MAX) return NO_IRQ; - irq_desc[irq].handler = type; - irq_desc[irq].handler_data = data; + irq_desc[irq].chip = type; + irq_desc[irq].chip_data = data; return irq++; } diff --git a/drivers/parisc/iosapic.c b/drivers/parisc/iosapic.c index 7a458d5bc..1fbda77ce 100644 --- a/drivers/parisc/iosapic.c +++ b/drivers/parisc/iosapic.c @@ -619,7 +619,7 @@ iosapic_set_irt_data( struct vector_info *vi, u32 *dp0, u32 *dp1) static struct vector_info *iosapic_get_vector(unsigned int irq) { - return irq_desc[irq].handler_data; + return irq_desc[irq].chip_data; } static void iosapic_disable_irq(unsigned int irq) diff --git a/drivers/parisc/led.c b/drivers/parisc/led.c index 298f2ddb2..bf00fa253 100644 --- a/drivers/parisc/led.c +++ b/drivers/parisc/led.c @@ -23,7 +23,6 @@ * David Pye */ -#include #include #include /* for offsetof() */ #include @@ -411,16 +410,17 @@ static __inline__ int led_get_net_activity(void) static __inline__ int led_get_diskio_activity(void) { static unsigned long last_pgpgin, last_pgpgout; - struct page_state pgstat; + unsigned long events[NR_VM_EVENT_ITEMS]; int changed; - get_full_page_state(&pgstat); /* get no of sectors in & out */ + all_vm_events(events); /* Just use a very simple calculation here. Do not care about overflow, since we only want to know if there was activity or not. */ - changed = (pgstat.pgpgin != last_pgpgin) || (pgstat.pgpgout != last_pgpgout); - last_pgpgin = pgstat.pgpgin; - last_pgpgout = pgstat.pgpgout; + changed = (events[PGPGIN] != last_pgpgin) || + (events[PGPGOUT] != last_pgpgout); + last_pgpgin = events[PGPGIN]; + last_pgpgout = events[PGPGOUT]; return (changed ? LED_DISK_IO : 0); } diff --git a/drivers/parisc/pdc_stable.c b/drivers/parisc/pdc_stable.c index 67c8f3b44..ea1b7a635 100644 --- a/drivers/parisc/pdc_stable.c +++ b/drivers/parisc/pdc_stable.c @@ -1,12 +1,11 @@ /* * Interfaces to retrieve and set PDC Stable options (firmware) * - * Copyright (C) 2005 Thibaut VARENE + * Copyright (C) 2005-2006 Thibaut VARENE * * 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. + * it 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 @@ -26,11 +25,26 @@ * * Since locations between 96 and 192 are the various paths, most (if not * all) PA-RISC machines should have them. Anyway, for safety reasons, the - * following code can deal with only 96 bytes of Stable Storage, and all + * following code can deal with just 96 bytes of Stable Storage, and all * sizes between 96 and 192 bytes (provided they are multiple of struct * device_path size, eg: 128, 160 and 192) to provide full information. - * The code makes no use of data above 192 bytes. One last word: there's one - * path we can always count on: the primary path. + * One last word: there's one path we can always count on: the primary path. + * Anything above 224 bytes is used for 'osdep2' OS-dependent storage area. + * + * The first OS-dependent area should always be available. Obviously, this is + * not true for the other one. Also bear in mind that reading/writing from/to + * osdep2 is much more expensive than from/to osdep1. + * NOTE: We do not handle the 2 bytes OS-dep area at 0x5D, nor the first + * 2 bytes of storage available right after OSID. That's a total of 4 bytes + * sacrificed: -ETOOLAZY :P + * + * The current policy wrt file permissions is: + * - write: root only + * - read: (reading triggers PDC calls) ? root only : everyone + * The rationale is that PDC calls could hog (DoS) the machine. + * + * TODO: + * - timer/fastsize write calls */ #undef PDCS_DEBUG @@ -42,38 +56,48 @@ #include #include -#include /* for capable() */ #include #include +#include #include #include #include #include #include +#include #include #include #include #include -#define PDCS_VERSION "0.09" +#define PDCS_VERSION "0.30" +#define PDCS_PREFIX "PDC Stable Storage" #define PDCS_ADDR_PPRI 0x00 #define PDCS_ADDR_OSID 0x40 +#define PDCS_ADDR_OSD1 0x48 +#define PDCS_ADDR_DIAG 0x58 #define PDCS_ADDR_FSIZ 0x5C #define PDCS_ADDR_PCON 0x60 #define PDCS_ADDR_PALT 0x80 #define PDCS_ADDR_PKBD 0xA0 +#define PDCS_ADDR_OSD2 0xE0 MODULE_AUTHOR("Thibaut VARENE "); MODULE_DESCRIPTION("sysfs interface to HP PDC Stable Storage data"); MODULE_LICENSE("GPL"); MODULE_VERSION(PDCS_VERSION); -static unsigned long pdcs_size = 0; +/* holds Stable Storage size. Initialized once and for all, no lock needed */ +static unsigned long pdcs_size __read_mostly; + +/* holds OS ID. Initialized once and for all, hopefully to 0x0006 */ +static u16 pdcs_osid __read_mostly; /* This struct defines what we need to deal with a parisc pdc path entry */ struct pdcspath_entry { + rwlock_t rw_lock; /* to protect path entry access */ short ready; /* entry record is valid if != 0 */ unsigned long addr; /* entry address in stable storage */ char *name; /* entry name */ @@ -121,6 +145,8 @@ struct pdcspath_attribute paths_attr_##_name = { \ * content of the stable storage WRT various paths in these structs. We read * these structs when reading the files, and we will write to these structs when * writing to the files, and only then write them back to the Stable Storage. + * + * This function expects to be called with @entry->rw_lock write-hold. */ static int pdcspath_fetch(struct pdcspath_entry *entry) @@ -160,14 +186,15 @@ pdcspath_fetch(struct pdcspath_entry *entry) * pointer, from which it'll find out the corresponding hardware path. * For now we do not handle the case where there's an error in writing to the * Stable Storage area, so you'd better not mess up the data :P + * + * This function expects to be called with @entry->rw_lock write-hold. */ -static int +static void pdcspath_store(struct pdcspath_entry *entry) { struct device_path *devpath; - if (!entry) - return -EINVAL; + BUG_ON(!entry); devpath = &entry->devpath; @@ -176,10 +203,8 @@ pdcspath_store(struct pdcspath_entry *entry) First case, we don't have a preset hwpath... */ if (!entry->ready) { /* ...but we have a device, map it */ - if (entry->dev) - device_to_hwpath(entry->dev, (struct hardware_path *)devpath); - else - return -EINVAL; + BUG_ON(!entry->dev); + device_to_hwpath(entry->dev, (struct hardware_path *)devpath); } /* else, we expect the provided hwpath to be valid. */ @@ -191,14 +216,13 @@ pdcspath_store(struct pdcspath_entry *entry) printk(KERN_ERR "%s: an error occured when writing to PDC.\n" "It is likely that the Stable Storage data has been corrupted.\n" "Please check it carefully upon next reboot.\n", __func__); - return -EIO; + WARN_ON(1); } - entry->ready = 1; + /* kobject is already registered */ + entry->ready = 2; DPRINTK("%s: device: 0x%p\n", __func__, entry->dev); - - return 0; } /** @@ -213,14 +237,17 @@ pdcspath_hwpath_read(struct pdcspath_entry *entry, char *buf) { char *out = buf; struct device_path *devpath; - unsigned short i; + short i; if (!entry || !buf) return -EINVAL; + read_lock(&entry->rw_lock); devpath = &entry->devpath; + i = entry->ready; + read_unlock(&entry->rw_lock); - if (!entry->ready) + if (!i) /* entry is not ready */ return -ENODATA; for (i = 0; i < 6; i++) { @@ -241,7 +268,7 @@ pdcspath_hwpath_read(struct pdcspath_entry *entry, char *buf) * * We will call this function to change the current hardware path. * Hardware paths are to be given '/'-delimited, without brackets. - * We take care to make sure that the provided path actually maps to an existing + * We make sure that the provided path actually maps to an existing * device, BUT nothing would prevent some foolish user to set the path to some * PCI bridge or even a CPU... * A better work around would be to make sure we are at the end of a device tree @@ -297,17 +324,19 @@ pdcspath_hwpath_write(struct pdcspath_entry *entry, const char *buf, size_t coun } /* So far so good, let's get in deep */ + write_lock(&entry->rw_lock); entry->ready = 0; entry->dev = dev; /* Now, dive in. Write back to the hardware */ - WARN_ON(pdcspath_store(entry)); /* this warn should *NEVER* happen */ + pdcspath_store(entry); /* Update the symlink to the real device */ sysfs_remove_link(&entry->kobj, "device"); sysfs_create_link(&entry->kobj, &entry->dev->kobj, "device"); + write_unlock(&entry->rw_lock); - printk(KERN_INFO "PDC Stable Storage: changed \"%s\" path to \"%s\"\n", + printk(KERN_INFO PDCS_PREFIX ": changed \"%s\" path to \"%s\"\n", entry->name, buf); return count; @@ -325,14 +354,17 @@ pdcspath_layer_read(struct pdcspath_entry *entry, char *buf) { char *out = buf; struct device_path *devpath; - unsigned short i; + short i; if (!entry || !buf) return -EINVAL; + read_lock(&entry->rw_lock); devpath = &entry->devpath; + i = entry->ready; + read_unlock(&entry->rw_lock); - if (!entry->ready) + if (!i) /* entry is not ready */ return -ENODATA; for (i = 0; devpath->layers[i] && (likely(i < 6)); i++) @@ -387,15 +419,17 @@ pdcspath_layer_write(struct pdcspath_entry *entry, const char *buf, size_t count } /* So far so good, let's get in deep */ + write_lock(&entry->rw_lock); /* First, overwrite the current layers with the new ones, not touching the hardware path. */ memcpy(&entry->devpath.layers, &layers, sizeof(layers)); /* Now, dive in. Write back to the hardware */ - WARN_ON(pdcspath_store(entry)); /* this warn should *NEVER* happen */ + pdcspath_store(entry); + write_unlock(&entry->rw_lock); - printk(KERN_INFO "PDC Stable Storage: changed \"%s\" layers to \"%s\"\n", + printk(KERN_INFO PDCS_PREFIX ": changed \"%s\" layers to \"%s\"\n", entry->name, buf); return count; @@ -414,9 +448,6 @@ pdcspath_attr_show(struct kobject *kobj, struct attribute *attr, char *buf) struct pdcspath_attribute *pdcs_attr = to_pdcspath_attribute(attr); ssize_t ret = 0; - if (!capable(CAP_SYS_ADMIN)) - return -EACCES; - if (pdcs_attr->show) ret = pdcs_attr->show(entry, buf); @@ -453,8 +484,8 @@ static struct sysfs_ops pdcspath_attr_ops = { }; /* These are the two attributes of any PDC path. */ -static PATHS_ATTR(hwpath, 0600, pdcspath_hwpath_read, pdcspath_hwpath_write); -static PATHS_ATTR(layer, 0600, pdcspath_layer_read, pdcspath_layer_write); +static PATHS_ATTR(hwpath, 0644, pdcspath_hwpath_read, pdcspath_hwpath_write); +static PATHS_ATTR(layer, 0644, pdcspath_layer_read, pdcspath_layer_write); static struct attribute *paths_subsys_attrs[] = { &paths_attr_hwpath.attr, @@ -483,60 +514,198 @@ static struct pdcspath_entry *pdcspath_entries[] = { NULL, }; + +/* For more insight of what's going on here, refer to PDC Procedures doc, + * Section PDC_STABLE */ + /** - * pdcs_info_read - Pretty printing of the remaining useful data. + * pdcs_size_read - Stable Storage size output. * @entry: An allocated and populated subsytem struct. We don't use it tho. * @buf: The output buffer to write to. - * - * We will call this function to format the output of the 'info' attribute file. - * Please refer to PDC Procedures documentation, section PDC_STABLE to get a - * better insight of what we're doing here. */ static ssize_t -pdcs_info_read(struct subsystem *entry, char *buf) +pdcs_size_read(struct subsystem *entry, char *buf) { char *out = buf; - __u32 result; - struct device_path devpath; - char *tmpstr = NULL; if (!entry || !buf) return -EINVAL; /* show the size of the stable storage */ - out += sprintf(out, "Stable Storage size: %ld bytes\n", pdcs_size); + out += sprintf(out, "%ld\n", pdcs_size); + + return out - buf; +} + +/** + * pdcs_auto_read - Stable Storage autoboot/search flag output. + * @entry: An allocated and populated subsytem struct. We don't use it tho. + * @buf: The output buffer to write to. + * @knob: The PF_AUTOBOOT or PF_AUTOSEARCH flag + */ +static ssize_t +pdcs_auto_read(struct subsystem *entry, char *buf, int knob) +{ + char *out = buf; + struct pdcspath_entry *pathentry; + + if (!entry || !buf) + return -EINVAL; + + /* Current flags are stored in primary boot path entry */ + pathentry = &pdcspath_entry_primary; + + read_lock(&pathentry->rw_lock); + out += sprintf(out, "%s\n", (pathentry->devpath.flags & knob) ? + "On" : "Off"); + read_unlock(&pathentry->rw_lock); + + return out - buf; +} + +/** + * pdcs_autoboot_read - Stable Storage autoboot flag output. + * @entry: An allocated and populated subsytem struct. We don't use it tho. + * @buf: The output buffer to write to. + */ +static inline ssize_t +pdcs_autoboot_read(struct subsystem *entry, char *buf) +{ + return pdcs_auto_read(entry, buf, PF_AUTOBOOT); +} + +/** + * pdcs_autosearch_read - Stable Storage autoboot flag output. + * @entry: An allocated and populated subsytem struct. We don't use it tho. + * @buf: The output buffer to write to. + */ +static inline ssize_t +pdcs_autosearch_read(struct subsystem *entry, char *buf) +{ + return pdcs_auto_read(entry, buf, PF_AUTOSEARCH); +} + +/** + * pdcs_timer_read - Stable Storage timer count output (in seconds). + * @entry: An allocated and populated subsytem struct. We don't use it tho. + * @buf: The output buffer to write to. + * + * The value of the timer field correponds to a number of seconds in powers of 2. + */ +static ssize_t +pdcs_timer_read(struct subsystem *entry, char *buf) +{ + char *out = buf; + struct pdcspath_entry *pathentry; - /* deal with flags */ - if (pdc_stable_read(PDCS_ADDR_PPRI, &devpath, sizeof(devpath)) != PDC_OK) + if (!entry || !buf) + return -EINVAL; + + /* Current flags are stored in primary boot path entry */ + pathentry = &pdcspath_entry_primary; + + /* print the timer value in seconds */ + read_lock(&pathentry->rw_lock); + out += sprintf(out, "%u\n", (pathentry->devpath.flags & PF_TIMER) ? + (1 << (pathentry->devpath.flags & PF_TIMER)) : 0); + read_unlock(&pathentry->rw_lock); + + return out - buf; +} + +/** + * pdcs_osid_read - Stable Storage OS ID register output. + * @entry: An allocated and populated subsytem struct. We don't use it tho. + * @buf: The output buffer to write to. + */ +static ssize_t +pdcs_osid_read(struct subsystem *entry, char *buf) +{ + char *out = buf; + + if (!entry || !buf) + return -EINVAL; + + out += sprintf(out, "%s dependent data (0x%.4x)\n", + os_id_to_string(pdcs_osid), pdcs_osid); + + return out - buf; +} + +/** + * pdcs_osdep1_read - Stable Storage OS-Dependent data area 1 output. + * @entry: An allocated and populated subsytem struct. We don't use it tho. + * @buf: The output buffer to write to. + * + * This can hold 16 bytes of OS-Dependent data. + */ +static ssize_t +pdcs_osdep1_read(struct subsystem *entry, char *buf) +{ + char *out = buf; + u32 result[4]; + + if (!entry || !buf) + return -EINVAL; + + if (pdc_stable_read(PDCS_ADDR_OSD1, &result, sizeof(result)) != PDC_OK) return -EIO; - - out += sprintf(out, "Autoboot: %s\n", (devpath.flags & PF_AUTOBOOT) ? "On" : "Off"); - out += sprintf(out, "Autosearch: %s\n", (devpath.flags & PF_AUTOSEARCH) ? "On" : "Off"); - out += sprintf(out, "Timer: %u s\n", (devpath.flags & PF_TIMER) ? (1 << (devpath.flags & PF_TIMER)) : 0); - /* get OSID */ - if (pdc_stable_read(PDCS_ADDR_OSID, &result, sizeof(result)) != PDC_OK) + out += sprintf(out, "0x%.8x\n", result[0]); + out += sprintf(out, "0x%.8x\n", result[1]); + out += sprintf(out, "0x%.8x\n", result[2]); + out += sprintf(out, "0x%.8x\n", result[3]); + + return out - buf; +} + +/** + * pdcs_diagnostic_read - Stable Storage Diagnostic register output. + * @entry: An allocated and populated subsytem struct. We don't use it tho. + * @buf: The output buffer to write to. + * + * I have NFC how to interpret the content of that register ;-). + */ +static ssize_t +pdcs_diagnostic_read(struct subsystem *entry, char *buf) +{ + char *out = buf; + u32 result; + + if (!entry || !buf) + return -EINVAL; + + /* get diagnostic */ + if (pdc_stable_read(PDCS_ADDR_DIAG, &result, sizeof(result)) != PDC_OK) return -EIO; - /* the actual result is 16 bits away */ - switch (result >> 16) { - case 0x0000: tmpstr = "No OS-dependent data"; break; - case 0x0001: tmpstr = "HP-UX dependent data"; break; - case 0x0002: tmpstr = "MPE-iX dependent data"; break; - case 0x0003: tmpstr = "OSF dependent data"; break; - case 0x0004: tmpstr = "HP-RT dependent data"; break; - case 0x0005: tmpstr = "Novell Netware dependent data"; break; - default: tmpstr = "Unknown"; break; - } - out += sprintf(out, "OS ID: %s (0x%.4x)\n", tmpstr, (result >> 16)); + out += sprintf(out, "0x%.4x\n", (result >> 16)); + + return out - buf; +} + +/** + * pdcs_fastsize_read - Stable Storage FastSize register output. + * @entry: An allocated and populated subsytem struct. We don't use it tho. + * @buf: The output buffer to write to. + * + * This register holds the amount of system RAM to be tested during boot sequence. + */ +static ssize_t +pdcs_fastsize_read(struct subsystem *entry, char *buf) +{ + char *out = buf; + u32 result; + + if (!entry || !buf) + return -EINVAL; /* get fast-size */ if (pdc_stable_read(PDCS_ADDR_FSIZ, &result, sizeof(result)) != PDC_OK) return -EIO; - out += sprintf(out, "Memory tested: "); if ((result & 0x0F) < 0x0E) - out += sprintf(out, "%.3f MB", 0.256*(1<<(result & 0x0F))); + out += sprintf(out, "%d kB", (1<<(result & 0x0F))*256); else out += sprintf(out, "All"); out += sprintf(out, "\n"); @@ -545,22 +714,51 @@ pdcs_info_read(struct subsystem *entry, char *buf) } /** - * pdcs_info_write - This function handles boot flag modifying. + * pdcs_osdep2_read - Stable Storage OS-Dependent data area 2 output. + * @entry: An allocated and populated subsytem struct. We don't use it tho. + * @buf: The output buffer to write to. + * + * This can hold pdcs_size - 224 bytes of OS-Dependent data, when available. + */ +static ssize_t +pdcs_osdep2_read(struct subsystem *entry, char *buf) +{ + char *out = buf; + unsigned long size; + unsigned short i; + u32 result; + + if (unlikely(pdcs_size <= 224)) + return -ENODATA; + + size = pdcs_size - 224; + + if (!entry || !buf) + return -EINVAL; + + for (i=0; irw_lock); flags = pathentry->devpath.flags; + read_unlock(&pathentry->rw_lock); DPRINTK("%s: flags before: 0x%X\n", __func__, flags); @@ -594,50 +794,175 @@ pdcs_info_write(struct subsystem *entry, const char *buf, size_t count) if ((c != 0) && (c != 1)) goto parse_error; if (c == 0) - flags &= ~PF_AUTOBOOT; + flags &= ~knob; else - flags |= PF_AUTOBOOT; - - if (*temp++ != ' ') - goto parse_error; - - c = *temp++ - '0'; - if ((c != 0) && (c != 1)) - goto parse_error; - if (c == 0) - flags &= ~PF_AUTOSEARCH; - else - flags |= PF_AUTOSEARCH; + flags |= knob; DPRINTK("%s: flags after: 0x%X\n", __func__, flags); /* So far so good, let's get in deep */ + write_lock(&pathentry->rw_lock); /* Change the path entry flags first */ pathentry->devpath.flags = flags; /* Now, dive in. Write back to the hardware */ - WARN_ON(pdcspath_store(pathentry)); /* this warn should *NEVER* happen */ + pdcspath_store(pathentry); + write_unlock(&pathentry->rw_lock); - printk(KERN_INFO "PDC Stable Storage: changed flags to \"%s\"\n", buf); + printk(KERN_INFO PDCS_PREFIX ": changed \"%s\" to \"%s\"\n", + (knob & PF_AUTOBOOT) ? "autoboot" : "autosearch", + (flags & knob) ? "On" : "Off"); return count; parse_error: - printk(KERN_WARNING "%s: Parse error: expect \"n n\" (n == 0 or 1) for AB and AS\n", __func__); + printk(KERN_WARNING "%s: Parse error: expect \"n\" (n == 0 or 1)\n", __func__); return -EINVAL; } -/* The last attribute (the 'root' one actually) with all remaining data. */ -static PDCS_ATTR(info, 0600, pdcs_info_read, pdcs_info_write); +/** + * pdcs_autoboot_write - This function handles autoboot flag modifying. + * @entry: An allocated and populated subsytem struct. We don't use it tho. + * @buf: The input buffer to read from. + * @count: The number of bytes to be read. + * + * We will call this function to change the current boot flags. + * We expect a precise syntax: + * \"n\" (n == 0 or 1) to toggle AutoSearch Off or On + */ +static inline ssize_t +pdcs_autoboot_write(struct subsystem *entry, const char *buf, size_t count) +{ + return pdcs_auto_write(entry, buf, count, PF_AUTOBOOT); +} + +/** + * pdcs_autosearch_write - This function handles autosearch flag modifying. + * @entry: An allocated and populated subsytem struct. We don't use it tho. + * @buf: The input buffer to read from. + * @count: The number of bytes to be read. + * + * We will call this function to change the current boot flags. + * We expect a precise syntax: + * \"n\" (n == 0 or 1) to toggle AutoSearch Off or On + */ +static inline ssize_t +pdcs_autosearch_write(struct subsystem *entry, const char *buf, size_t count) +{ + return pdcs_auto_write(entry, buf, count, PF_AUTOSEARCH); +} + +/** + * pdcs_osdep1_write - Stable Storage OS-Dependent data area 1 input. + * @entry: An allocated and populated subsytem struct. We don't use it tho. + * @buf: The input buffer to read from. + * @count: The number of bytes to be read. + * + * This can store 16 bytes of OS-Dependent data. We use a byte-by-byte + * write approach. It's up to userspace to deal with it when constructing + * its input buffer. + */ +static ssize_t +pdcs_osdep1_write(struct subsystem *entry, const char *buf, size_t count) +{ + u8 in[16]; + + if (!capable(CAP_SYS_ADMIN)) + return -EACCES; + + if (!entry || !buf || !count) + return -EINVAL; + + if (unlikely(pdcs_osid != OS_ID_LINUX)) + return -EPERM; + + if (count > 16) + return -EMSGSIZE; + + /* We'll use a local copy of buf */ + memset(in, 0, 16); + memcpy(in, buf, count); + + if (pdc_stable_write(PDCS_ADDR_OSD1, &in, sizeof(in)) != PDC_OK) + return -EIO; + + return count; +} + +/** + * pdcs_osdep2_write - Stable Storage OS-Dependent data area 2 input. + * @entry: An allocated and populated subsytem struct. We don't use it tho. + * @buf: The input buffer to read from. + * @count: The number of bytes to be read. + * + * This can store pdcs_size - 224 bytes of OS-Dependent data. We use a + * byte-by-byte write approach. It's up to userspace to deal with it when + * constructing its input buffer. + */ +static ssize_t +pdcs_osdep2_write(struct subsystem *entry, const char *buf, size_t count) +{ + unsigned long size; + unsigned short i; + u8 in[4]; + + if (!capable(CAP_SYS_ADMIN)) + return -EACCES; + + if (!entry || !buf || !count) + return -EINVAL; + + if (unlikely(pdcs_size <= 224)) + return -ENOSYS; + + if (unlikely(pdcs_osid != OS_ID_LINUX)) + return -EPERM; + + size = pdcs_size - 224; + + if (count > size) + return -EMSGSIZE; + + /* We'll use a local copy of buf */ + + for (i=0; irw_lock); - kobject_set_name(&entry->kobj, "%s", entry->name); - kobj_set_kset_s(entry, paths_subsys); - kobject_register(&entry->kobj); + for (i = 0; (entry = pdcspath_entries[i]); i++) { + write_lock(&entry->rw_lock); + err = pdcspath_fetch(entry); + write_unlock(&entry->rw_lock); - if (!entry->dev) + if (err < 0) continue; + if ((err = kobject_set_name(&entry->kobj, "%s", entry->name))) + return err; + kobj_set_kset_s(entry, paths_subsys); + if ((err = kobject_register(&entry->kobj))) + return err; + + /* kobject is now registered */ + write_lock(&entry->rw_lock); + entry->ready = 2; + /* Add a nice symlink to the real device */ - sysfs_create_link(&entry->kobj, &entry->dev->kobj, "device"); + if (entry->dev) + sysfs_create_link(&entry->kobj, &entry->dev->kobj, "device"); + + write_unlock(&entry->rw_lock); } return 0; @@ -675,50 +1015,78 @@ pdcs_register_pathentries(void) /** * pdcs_unregister_pathentries - Routine called when unregistering the module. */ -static inline void __exit +static inline void pdcs_unregister_pathentries(void) { unsigned short i; struct pdcspath_entry *entry; - for (i = 0; (entry = pdcspath_entries[i]); i++) - if (entry->ready) - kobject_unregister(&entry->kobj); + for (i = 0; (entry = pdcspath_entries[i]); i++) { + read_lock(&entry->rw_lock); + if (entry->ready >= 2) + kobject_unregister(&entry->kobj); + read_unlock(&entry->rw_lock); + } } /* - * For now we register the pdc subsystem with the firmware subsystem - * and the paths subsystem with the pdc subsystem + * For now we register the stable subsystem with the firmware subsystem + * and the paths subsystem with the stable subsystem */ static int __init pdc_stable_init(void) { struct subsys_attribute *attr; int i, rc = 0, error = 0; + u32 result; /* find the size of the stable storage */ if (pdc_stable_get_size(&pdcs_size) != PDC_OK) return -ENODEV; - printk(KERN_INFO "PDC Stable Storage facility v%s\n", PDCS_VERSION); + /* make sure we have enough data */ + if (pdcs_size < 96) + return -ENODATA; - /* For now we'll register the pdc subsys within this driver */ - if ((rc = firmware_register(&pdc_subsys))) - return rc; + printk(KERN_INFO PDCS_PREFIX " facility v%s\n", PDCS_VERSION); - /* Don't forget the info entry */ + /* get OSID */ + if (pdc_stable_read(PDCS_ADDR_OSID, &result, sizeof(result)) != PDC_OK) + return -EIO; + + /* the actual result is 16 bits away */ + pdcs_osid = (u16)(result >> 16); + + /* For now we'll register the stable subsys within this driver */ + if ((rc = firmware_register(&stable_subsys))) + goto fail_firmreg; + + /* Don't forget the root entries */ for (i = 0; (attr = pdcs_subsys_attrs[i]) && !error; i++) if (attr->show) - error = subsys_create_file(&pdc_subsys, attr); + error = subsys_create_file(&stable_subsys, attr); - /* register the paths subsys as a subsystem of pdc subsys */ - kset_set_kset_s(&paths_subsys, pdc_subsys); - subsystem_register(&paths_subsys); + /* register the paths subsys as a subsystem of stable subsys */ + kset_set_kset_s(&paths_subsys, stable_subsys); + if ((rc = subsystem_register(&paths_subsys))) + goto fail_subsysreg; /* now we create all "files" for the paths subsys */ - pdcs_register_pathentries(); + if ((rc = pdcs_register_pathentries())) + goto fail_pdcsreg; + + return rc; - return 0; +fail_pdcsreg: + pdcs_unregister_pathentries(); + subsystem_unregister(&paths_subsys); + +fail_subsysreg: + firmware_unregister(&stable_subsys); + +fail_firmreg: + printk(KERN_INFO PDCS_PREFIX " bailing out\n"); + return rc; } static void __exit @@ -727,7 +1095,7 @@ pdc_stable_exit(void) pdcs_unregister_pathentries(); subsystem_unregister(&paths_subsys); - firmware_unregister(&pdc_subsys); + firmware_unregister(&stable_subsys); } diff --git a/drivers/parisc/power.c b/drivers/parisc/power.c index 0bcab83b4..fad5a33bf 100644 --- a/drivers/parisc/power.c +++ b/drivers/parisc/power.c @@ -35,7 +35,6 @@ * runtime through the "/proc/sys/kernel/power" procfs entry. */ -#include #include #include #include diff --git a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c index 278f32502..8b4732815 100644 --- a/drivers/parisc/sba_iommu.c +++ b/drivers/parisc/sba_iommu.c @@ -19,7 +19,6 @@ ** FIXME: add DMA hint support programming in both sba and lba modules. */ -#include #include #include #include @@ -316,10 +315,10 @@ static int reserve_sba_gart = 1; ** ** Superdome (in particular, REO) allows only 64-bit CSR accesses. */ -#define READ_REG32(addr) le32_to_cpu(__raw_readl(addr)) -#define READ_REG64(addr) le64_to_cpu(__raw_readq(addr)) -#define WRITE_REG32(val, addr) __raw_writel(cpu_to_le32(val), addr) -#define WRITE_REG64(val, addr) __raw_writeq(cpu_to_le64(val), addr) +#define READ_REG32(addr) readl(addr) +#define READ_REG64(addr) readq(addr) +#define WRITE_REG32(val, addr) writel((val), (addr)) +#define WRITE_REG64(val, addr) writeq((val), (addr)) #ifdef CONFIG_64BIT #define READ_REG(addr) READ_REG64(addr) @@ -1427,7 +1426,7 @@ sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num) iov_order = get_order(iova_space_size >> (IOVP_SHIFT - PAGE_SHIFT)); ioc->pdir_size = (iova_space_size / IOVP_SIZE) * sizeof(u64); - DBG_INIT("%s() hpa 0x%lx IOV %dMB (%d bits)\n", + DBG_INIT("%s() hpa 0x%p IOV %dMB (%d bits)\n", __FUNCTION__, ioc->ioc_hpa, iova_space_size >> 20, iov_order + PAGE_SHIFT); @@ -1764,7 +1763,7 @@ printk("sba_hw_init(): mem_boot 0x%x 0x%x 0x%x 0x%x\n", PAGE0->mem_boot.hpa, sba_dev->num_ioc = num_ioc; for (i = 0; i < num_ioc; i++) { - unsigned long ioc_hpa = sba_dev->ioc[i].ioc_hpa; + void __iomem *ioc_hpa = sba_dev->ioc[i].ioc_hpa; unsigned int j; for (j=0; j < sizeof(u64) * ROPES_PER_IOC; j+=sizeof(u64)) { @@ -1776,7 +1775,8 @@ printk("sba_hw_init(): mem_boot 0x%x 0x%x 0x%x 0x%x\n", PAGE0->mem_boot.hpa, * Improves netperf UDP_STREAM by ~10% for bcm5701. */ if (IS_PLUTO(sba_dev->iodc)) { - unsigned long rope_cfg, cfg_val; + void __iomem *rope_cfg; + unsigned long cfg_val; rope_cfg = ioc_hpa + IOC_ROPE0_CFG + j; cfg_val = READ_REG(rope_cfg); @@ -1902,7 +1902,7 @@ sba_common_init(struct sba_device *sba_dev) * (bit #61, big endian), we have to flush and sync every time * IO-PDIR is changed in Ike/Astro. */ - if (boot_cpu_data.pdc.capabilities & PDC_MODEL_IOPDIR_FDC) { + if (ioc_needs_fdc) { printk(KERN_INFO MODULE_NAME " FDC/SYNC required.\n"); } else { printk(KERN_INFO MODULE_NAME " IOC has cache coherent PDIR.\n"); diff --git a/drivers/parisc/superio.c b/drivers/parisc/superio.c index 828eb4506..4ee26a6d9 100644 --- a/drivers/parisc/superio.c +++ b/drivers/parisc/superio.c @@ -271,7 +271,7 @@ superio_init(struct pci_dev *pcidev) else printk(KERN_ERR PFX "USB regulator not initialized!\n"); - if (request_irq(pdev->irq, superio_interrupt, SA_INTERRUPT, + if (request_irq(pdev->irq, superio_interrupt, IRQF_DISABLED, SUPERIO, (void *)sio)) { printk(KERN_ERR PFX "could not get irq\n"); @@ -360,7 +360,7 @@ int superio_fixup_irq(struct pci_dev *pcidev) #endif for (i = 0; i < 16; i++) { - irq_desc[i].handler = &superio_interrupt_type; + irq_desc[i].chip = &superio_interrupt_type; } /* diff --git a/drivers/parport/Kconfig b/drivers/parport/Kconfig index 6c8452ede..c7fa28a28 100644 --- a/drivers/parport/Kconfig +++ b/drivers/parport/Kconfig @@ -85,11 +85,6 @@ config PARPORT_PC_PCMCIA config PARPORT_NOT_PC bool -config PARPORT_ARC - tristate "Archimedes hardware" - depends on ARM && PARPORT - select PARPORT_NOT_PC - config PARPORT_IP32 tristate "SGI IP32 builtin port (EXPERIMENTAL)" depends on SGI_IP32 && PARPORT && EXPERIMENTAL @@ -141,6 +136,18 @@ config PARPORT_SUNBPP found on many Sun machines. Note that many of the newer Ultras actually have pc style hardware instead. +config PARPORT_AX88796 + tristate "AX88796 Parallel Port" + depends on PARPORT + select PARPORT_NOT_PC + help + Say Y here if you need support for the parallel port hardware on + the AX88796 network controller chip. This code is also available + as a module (say M), called parport_ax88796. + + The driver is not dependant on the AX88796 network driver, and + should not interfere with the networking functions of the chip. + config PARPORT_1284 bool "IEEE 1284 transfer modes" depends on PARPORT diff --git a/drivers/parport/Makefile b/drivers/parport/Makefile index a19de35f8..696b8d4ca 100644 --- a/drivers/parport/Makefile +++ b/drivers/parport/Makefile @@ -17,4 +17,5 @@ obj-$(CONFIG_PARPORT_MFC3) += parport_mfc3.o obj-$(CONFIG_PARPORT_ATARI) += parport_atari.o obj-$(CONFIG_PARPORT_SUNBPP) += parport_sunbpp.o obj-$(CONFIG_PARPORT_GSC) += parport_gsc.o -obj-$(CONFIG_PARPORT_IP32) += parport_ip32.o +obj-$(CONFIG_PARPORT_AX88796) += parport_ax88796.o +obj-$(CONFIG_PARPORT_IP32) += parport_ip32.o \ No newline at end of file diff --git a/drivers/parport/daisy.c b/drivers/parport/daisy.c index 9ee67321b..fd41e2810 100644 --- a/drivers/parport/daisy.c +++ b/drivers/parport/daisy.c @@ -283,7 +283,7 @@ void parport_close (struct pardevice *dev) * * This tries to locate a device on the given parallel port, * multiplexor port and daisy chain address, and returns its - * device number or -NXIO if no device with those coordinates + * device number or %-ENXIO if no device with those coordinates * exists. **/ diff --git a/drivers/parport/ieee1284.c b/drivers/parport/ieee1284.c index 690b239ad..7ff09f0f8 100644 --- a/drivers/parport/ieee1284.c +++ b/drivers/parport/ieee1284.c @@ -16,7 +16,6 @@ * Various hacks, Fred Barnes , 04/2000 */ -#include #include #include #include diff --git a/drivers/parport/ieee1284_ops.c b/drivers/parport/ieee1284_ops.c index d6c776582..525312f2f 100644 --- a/drivers/parport/ieee1284_ops.c +++ b/drivers/parport/ieee1284_ops.c @@ -14,7 +14,6 @@ */ -#include #include #include #include diff --git a/drivers/parport/parport_arc.c b/drivers/parport/parport_arc.c deleted file mode 100644 index b35bb4f48..000000000 --- a/drivers/parport/parport_arc.c +++ /dev/null @@ -1,139 +0,0 @@ -/* Low-level parallel port routines for Archimedes onboard hardware - * - * Author: Phil Blundell - */ - -/* This driver is for the parallel port hardware found on Acorn's old - * range of Archimedes machines. The A5000 and newer systems have PC-style - * I/O hardware and should use the parport_pc driver instead. - * - * The Acorn printer port hardware is very simple. There is a single 8-bit - * write-only latch for the data port and control/status bits are handled - * with various auxilliary input and output lines. The port is not - * bidirectional, does not support any modes other than SPP, and has only - * a subset of the standard printer control lines connected. - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#define DATA_ADDRESS 0x3350010 - -/* This is equivalent to the above and only used for request_region. */ -#define PORT_BASE 0x80000000 | ((DATA_ADDRESS - IO_BASE) >> 2) - -/* The hardware can't read from the data latch, so we must use a soft - copy. */ -static unsigned char data_copy; - -/* These are pretty simple. We know the irq is never shared and the - kernel does all the magic that's required. */ -static void arc_enable_irq(struct parport *p) -{ - enable_irq(p->irq); -} - -static void arc_disable_irq(struct parport *p) -{ - disable_irq(p->irq); -} - -static void arc_interrupt(int irq, void *dev_id, struct pt_regs *regs) -{ - parport_generic_irq(irq, (struct parport *) dev_id, regs); -} - -static void arc_write_data(struct parport *p, unsigned char data) -{ - data_copy = data; - outb_t(data, DATA_LATCH); -} - -static unsigned char arc_read_data(struct parport *p) -{ - return data_copy; -} - -static struct parport_operations parport_arc_ops = -{ - .write_data = arc_write_data, - .read_data = arc_read_data, - - .write_control = arc_write_control, - .read_control = arc_read_control, - .frob_control = arc_frob_control, - - .read_status = arc_read_status, - - .enable_irq = arc_enable_irq, - .disable_irq = arc_disable_irq, - - .data_forward = arc_data_forward, - .data_reverse = arc_data_reverse, - - .init_state = arc_init_state, - .save_state = arc_save_state, - .restore_state = arc_restore_state, - - .epp_write_data = parport_ieee1284_epp_write_data, - .epp_read_data = parport_ieee1284_epp_read_data, - .epp_write_addr = parport_ieee1284_epp_write_addr, - .epp_read_addr = parport_ieee1284_epp_read_addr, - - .ecp_write_data = parport_ieee1284_ecp_write_data, - .ecp_read_data = parport_ieee1284_ecp_read_data, - .ecp_write_addr = parport_ieee1284_ecp_write_addr, - - .compat_write_data = parport_ieee1284_write_compat, - .nibble_read_data = parport_ieee1284_read_nibble, - .byte_read_data = parport_ieee1284_read_byte, - - .owner = THIS_MODULE, -}; - -/* --- Initialisation code -------------------------------- */ - -static int parport_arc_init(void) -{ - /* Archimedes hardware provides only one port, at a fixed address */ - struct parport *p; - struct resource res; - char *fake_name = "parport probe"); - - res = request_region(PORT_BASE, 1, fake_name); - if (res == NULL) - return 0; - - p = parport_register_port (PORT_BASE, IRQ_PRINTERACK, - PARPORT_DMA_NONE, &parport_arc_ops); - - if (!p) { - release_region(PORT_BASE, 1); - return 0; - } - - p->modes = PARPORT_MODE_ARCSPP; - p->size = 1; - rename_region(res, p->name); - - printk(KERN_INFO "%s: Archimedes on-board port, using irq %d\n", - p->irq); - - /* Tell the high-level drivers about the port. */ - parport_announce_port (p); - - return 1; -} - -module_init(parport_arc_init) diff --git a/drivers/parport/parport_gsc.c b/drivers/parport/parport_gsc.c index 1de52d9fe..7352104f7 100644 --- a/drivers/parport/parport_gsc.c +++ b/drivers/parport/parport_gsc.c @@ -15,7 +15,7 @@ * Phil Blundell * Tim Waugh * Jose Renau - * David Campbell + * David Campbell * Andrea Arcangeli */ diff --git a/drivers/parport/parport_gsc.h b/drivers/parport/parport_gsc.h index 662f6c1fe..fc9c37c54 100644 --- a/drivers/parport/parport_gsc.h +++ b/drivers/parport/parport_gsc.h @@ -24,7 +24,7 @@ * Phil Blundell * Tim Waugh * Jose Renau - * David Campbell + * David Campbell * Andrea Arcangeli */ diff --git a/drivers/parport/parport_mfc3.c b/drivers/parport/parport_mfc3.c index c85364765..b2b8092a2 100644 --- a/drivers/parport/parport_mfc3.c +++ b/drivers/parport/parport_mfc3.c @@ -353,7 +353,7 @@ static int __init parport_mfc3_init(void) if (p->irq != PARPORT_IRQ_NONE) { if (use_cnt++ == 0) - if (request_irq(IRQ_AMIGA_PORTS, mfc3_interrupt, SA_SHIRQ, p->name, &pp_mfc3_ops)) + if (request_irq(IRQ_AMIGA_PORTS, mfc3_interrupt, IRQF_SHARED, p->name, &pp_mfc3_ops)) goto out_irq; } diff --git a/drivers/parport/parport_pc.c b/drivers/parport/parport_pc.c index 48bbf32fd..fe800dc0b 100644 --- a/drivers/parport/parport_pc.c +++ b/drivers/parport/parport_pc.c @@ -3,7 +3,7 @@ * Authors: Phil Blundell * Tim Waugh * Jose Renau - * David Campbell + * David Campbell * Andrea Arcangeli * * based on work by Grant Guenther and Phil Blundell. @@ -42,7 +42,6 @@ * but rather will start at port->base_hi. */ -#include #include #include #include diff --git a/drivers/parport/parport_sunbpp.c b/drivers/parport/parport_sunbpp.c index 36a1556e6..fac333b27 100644 --- a/drivers/parport/parport_sunbpp.c +++ b/drivers/parport/parport_sunbpp.c @@ -1,5 +1,4 @@ -/* $Id: parport_sunbpp.c,v 1.12 2001/05/26 03:01:42 davem Exp $ - * Parallel-port routines for Sun architecture +/* parport_sunbpp.c: Parallel-port routines for SBUS * * Author: Derrick J. Brashear * @@ -14,6 +13,9 @@ * Gus Baldauf (gbaldauf@ix.netcom.com) * Peter Zaitcev * Tom Dyas + * + * Updated to new SBUS device framework: David S. Miller + * */ #include @@ -287,14 +289,7 @@ static struct parport_operations parport_sunbpp_ops = .owner = THIS_MODULE, }; -typedef struct { - struct list_head list; - struct parport *port; -} Node; -/* no locks, everything's serialized */ -static LIST_HEAD(port_list); - -static int __init init_one_port(struct sbus_dev *sdev) +static int __devinit init_one_port(struct sbus_dev *sdev) { struct parport *p; /* at least in theory there may be a "we don't dma" case */ @@ -303,109 +298,120 @@ static int __init init_one_port(struct sbus_dev *sdev) int irq, dma, err = 0, size; struct bpp_regs __iomem *regs; unsigned char value_tcr; - Node *node; - - dprintk((KERN_DEBUG "init_one_port(%p): ranges, alloc_io, ", sdev)); - node = kmalloc(sizeof(Node), GFP_KERNEL); - if (!node) - goto out0; irq = sdev->irqs[0]; base = sbus_ioremap(&sdev->resource[0], 0, sdev->reg_addrs[0].reg_size, "sunbpp"); if (!base) - goto out1; + return -ENODEV; size = sdev->reg_addrs[0].reg_size; dma = PARPORT_DMA_NONE; - dprintk(("alloc(ppops), ")); - ops = kmalloc (sizeof (struct parport_operations), GFP_KERNEL); + ops = kmalloc(sizeof(struct parport_operations), GFP_KERNEL); if (!ops) - goto out2; + goto out_unmap; memcpy (ops, &parport_sunbpp_ops, sizeof (struct parport_operations)); dprintk(("register_port\n")); if (!(p = parport_register_port((unsigned long)base, irq, dma, ops))) - goto out3; + goto out_free_ops; p->size = size; - dprintk((KERN_DEBUG "init_one_port: request_irq(%08x:%p:%x:%s:%p) ", - p->irq, parport_sunbpp_interrupt, SA_SHIRQ, p->name, p)); if ((err = request_irq(p->irq, parport_sunbpp_interrupt, - SA_SHIRQ, p->name, p)) != 0) { - dprintk(("ERROR %d\n", err)); - goto out4; + IRQF_SHARED, p->name, p)) != 0) { + goto out_put_port; } - dprintk(("OK\n")); + parport_sunbpp_enable_irq(p); regs = (struct bpp_regs __iomem *)p->base; - dprintk((KERN_DEBUG "forward\n")); + value_tcr = sbus_readb(®s->p_tcr); value_tcr &= ~P_TCR_DIR; sbus_writeb(value_tcr, ®s->p_tcr); printk(KERN_INFO "%s: sunbpp at 0x%lx\n", p->name, p->base); - node->port = p; - list_add(&node->list, &port_list); - parport_announce_port (p); - return 1; + dev_set_drvdata(&sdev->ofdev.dev, p); + + parport_announce_port(p); + + return 0; -out4: +out_put_port: parport_put_port(p); -out3: + +out_free_ops: kfree(ops); -out2: + +out_unmap: sbus_iounmap(base, size); -out1: - kfree(node); -out0: + return err; } -static int __init parport_sunbpp_init(void) +static int __devinit bpp_probe(struct of_device *dev, const struct of_device_id *match) { - struct sbus_bus *sbus; - struct sbus_dev *sdev; - int count = 0; - - for_each_sbus(sbus) { - for_each_sbusdev(sdev, sbus) { - if (!strcmp(sdev->prom_name, "SUNW,bpp")) - count += init_one_port(sdev); - } + struct sbus_dev *sdev = to_sbus_device(&dev->dev); + + return init_one_port(sdev); +} + +static int __devexit bpp_remove(struct of_device *dev) +{ + struct parport *p = dev_get_drvdata(&dev->dev); + struct parport_operations *ops = p->ops; + + parport_remove_port(p); + + if (p->irq != PARPORT_IRQ_NONE) { + parport_sunbpp_disable_irq(p); + free_irq(p->irq, p); } - return count ? 0 : -ENODEV; + + sbus_iounmap((void __iomem *) p->base, p->size); + parport_put_port(p); + kfree(ops); + + dev_set_drvdata(&dev->dev, NULL); + + return 0; +} + +static struct of_device_id bpp_match[] = { + { + .name = "SUNW,bpp", + }, + {}, +}; + +MODULE_DEVICE_TABLE(of, bpp_match); + +static struct of_platform_driver bpp_sbus_driver = { + .name = "bpp", + .match_table = bpp_match, + .probe = bpp_probe, + .remove = __devexit_p(bpp_remove), +}; + +static int __init parport_sunbpp_init(void) +{ + return of_register_driver(&bpp_sbus_driver, &sbus_bus_type); } static void __exit parport_sunbpp_exit(void) { - while (!list_empty(&port_list)) { - Node *node = list_entry(port_list.next, Node, list); - struct parport *p = node->port; - struct parport_operations *ops = p->ops; - parport_remove_port(p); - - if (p->irq != PARPORT_IRQ_NONE) { - parport_sunbpp_disable_irq(p); - free_irq(p->irq, p); - } - sbus_iounmap((void __iomem *)p->base, p->size); - parport_put_port(p); - kfree (ops); - list_del(&node->list); - kfree (node); - } + of_unregister_driver(&bpp_sbus_driver); } MODULE_AUTHOR("Derrick J Brashear"); MODULE_DESCRIPTION("Parport Driver for Sparc bidirectional Port"); MODULE_SUPPORTED_DEVICE("Sparc Bidirectional Parallel Port"); +MODULE_VERSION("2.0"); MODULE_LICENSE("GPL"); module_init(parport_sunbpp_init) diff --git a/drivers/parport/procfs.c b/drivers/parport/procfs.c index cbe17184b..2e744a274 100644 --- a/drivers/parport/procfs.c +++ b/drivers/parport/procfs.c @@ -1,6 +1,6 @@ /* Sysctl interface for parport devices. * - * Authors: David Campbell + * Authors: David Campbell * Tim Waugh * Philip Blundell * Andrea Arcangeli @@ -13,7 +13,6 @@ */ #include -#include #include #include #include diff --git a/drivers/parport/share.c b/drivers/parport/share.c index bbbfd79ad..94dc506b8 100644 --- a/drivers/parport/share.c +++ b/drivers/parport/share.c @@ -17,7 +17,6 @@ #undef PARPORT_DEBUG_SHARING /* undef for production */ -#include #include #include #include @@ -218,7 +217,7 @@ static void free_port (struct parport *port) * parport_get_port - increment a port's reference count * @port: the port * - * This ensure's that a struct parport pointer remains valid + * This ensures that a struct parport pointer remains valid * until the matching parport_put_port() call. **/ diff --git a/drivers/pci/Makefile b/drivers/pci/Makefile index 6707df968..f2d152b81 100644 --- a/drivers/pci/Makefile +++ b/drivers/pci/Makefile @@ -26,7 +26,11 @@ obj-$(CONFIG_PPC32) += setup-irq.o obj-$(CONFIG_PPC64) += setup-bus.o obj-$(CONFIG_MIPS) += setup-bus.o setup-irq.o obj-$(CONFIG_X86_VISWS) += setup-irq.o -obj-$(CONFIG_PCI_MSI) += msi.o + +msiobj-y := msi.o msi-apic.o +msiobj-$(CONFIG_IA64_GENERIC) += msi-altix.o +msiobj-$(CONFIG_IA64_SGI_SN2) += msi-altix.o +obj-$(CONFIG_PCI_MSI) += $(msiobj-y) # # ACPI Related PCI FW Functions diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c index eed67d9e7..5f7db9d24 100644 --- a/drivers/pci/bus.c +++ b/drivers/pci/bus.c @@ -34,11 +34,11 @@ */ int pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res, - unsigned long size, unsigned long align, unsigned long min, - unsigned int type_mask, - void (*alignf)(void *, struct resource *, - unsigned long, unsigned long), - void *alignf_data) + resource_size_t size, resource_size_t align, + resource_size_t min, unsigned int type_mask, + void (*alignf)(void *, struct resource *, resource_size_t, + resource_size_t), + void *alignf_data) { int i, ret = -ENOMEM; @@ -81,9 +81,9 @@ void __devinit pci_bus_add_device(struct pci_dev *dev) { device_add(&dev->dev); - spin_lock(&pci_bus_lock); + down_write(&pci_bus_sem); list_add_tail(&dev->global_list, &pci_devices); - spin_unlock(&pci_bus_lock); + up_write(&pci_bus_sem); pci_proc_attach_device(dev); pci_create_sysfs_dev_files(dev); @@ -125,10 +125,10 @@ void __devinit pci_bus_add_devices(struct pci_bus *bus) */ if (dev->subordinate) { if (list_empty(&dev->subordinate->node)) { - spin_lock(&pci_bus_lock); + down_write(&pci_bus_sem); list_add_tail(&dev->subordinate->node, &dev->bus->children); - spin_unlock(&pci_bus_lock); + up_write(&pci_bus_sem); } pci_bus_add_devices(dev->subordinate); @@ -168,7 +168,7 @@ void pci_walk_bus(struct pci_bus *top, void (*cb)(struct pci_dev *, void *), struct list_head *next; bus = top; - spin_lock(&pci_bus_lock); + down_read(&pci_bus_sem); next = top->devices.next; for (;;) { if (next == &bus->devices) { @@ -180,22 +180,19 @@ void pci_walk_bus(struct pci_bus *top, void (*cb)(struct pci_dev *, void *), continue; } dev = list_entry(next, struct pci_dev, bus_list); - pci_dev_get(dev); if (dev->subordinate) { /* this is a pci-pci bridge, do its devices next */ next = dev->subordinate->devices.next; bus = dev->subordinate; } else next = dev->bus_list.next; - spin_unlock(&pci_bus_lock); - /* Run device routines with the bus unlocked */ + /* Run device routines with the device locked */ + down(&dev->dev.sem); cb(dev, userdata); - - spin_lock(&pci_bus_lock); - pci_dev_put(dev); + up(&dev->dev.sem); } - spin_unlock(&pci_bus_lock); + up_read(&pci_bus_sem); } EXPORT_SYMBOL_GPL(pci_walk_bus); diff --git a/drivers/pci/hotplug/Kconfig b/drivers/pci/hotplug/Kconfig index 222a1cc4a..8a60f391f 100644 --- a/drivers/pci/hotplug/Kconfig +++ b/drivers/pci/hotplug/Kconfig @@ -6,8 +6,7 @@ menu "PCI Hotplug Support" config HOTPLUG_PCI tristate "Support for PCI Hotplug (EXPERIMENTAL)" - depends on PCI && EXPERIMENTAL - select HOTPLUG + depends on PCI && EXPERIMENTAL && HOTPLUG ---help--- Say Y here if you have a motherboard with a PCI Hotplug controller. This allows you to add and remove PCI cards while the machine is @@ -77,7 +76,7 @@ config HOTPLUG_PCI_IBM config HOTPLUG_PCI_ACPI tristate "ACPI PCI Hotplug driver" - depends on ACPI && HOTPLUG_PCI + depends on (!ACPI_DOCK && ACPI && HOTPLUG_PCI) || (ACPI_DOCK && HOTPLUG_PCI) help Say Y here if you have a system that supports PCI Hotplug using ACPI. @@ -154,13 +153,6 @@ config HOTPLUG_PCI_SHPC_POLL_EVENT_MODE When in doubt, say N. -config HOTPLUG_PCI_SHPC_PHPRM_LEGACY - bool "For AMD SHPC only: Use $HRT for resource/configuration" - depends on HOTPLUG_PCI_SHPC && !ACPI - help - Say Y here for AMD SHPC. You have to select this option if you are - using this driver on platform with AMD SHPC. - config HOTPLUG_PCI_RPA tristate "RPA PCI Hotplug driver" depends on HOTPLUG_PCI && PPC_PSERIES && PPC64 && !HOTPLUG_PCI_FAKE diff --git a/drivers/pci/hotplug/Makefile b/drivers/pci/hotplug/Makefile index 421cfffb1..34a189119 100644 --- a/drivers/pci/hotplug/Makefile +++ b/drivers/pci/hotplug/Makefile @@ -40,8 +40,7 @@ ibmphp-objs := ibmphp_core.o \ ibmphp_hpc.o acpiphp-objs := acpiphp_core.o \ - acpiphp_glue.o \ - acpiphp_dock.o + acpiphp_glue.o rpaphp-objs := rpaphp_core.o \ rpaphp_pci.o \ diff --git a/drivers/pci/hotplug/acpi_pcihp.c b/drivers/pci/hotplug/acpi_pcihp.c index 39af9c325..51cb9f817 100644 --- a/drivers/pci/hotplug/acpi_pcihp.c +++ b/drivers/pci/hotplug/acpi_pcihp.c @@ -25,6 +25,7 @@ */ #include +#include #include #include #include @@ -33,10 +34,184 @@ #include #include "pci_hotplug.h" +#define MY_NAME "acpi_pcihp" + +#define dbg(fmt, arg...) do { if (debug_acpi) printk(KERN_DEBUG "%s: %s: " fmt , MY_NAME , __FUNCTION__ , ## arg); } while (0) +#define err(format, arg...) printk(KERN_ERR "%s: " format , MY_NAME , ## arg) +#define info(format, arg...) printk(KERN_INFO "%s: " format , MY_NAME , ## arg) +#define warn(format, arg...) printk(KERN_WARNING "%s: " format , MY_NAME , ## arg) + #define METHOD_NAME__SUN "_SUN" #define METHOD_NAME__HPP "_HPP" #define METHOD_NAME_OSHP "OSHP" +static int debug_acpi; + +static acpi_status +decode_type0_hpx_record(union acpi_object *record, struct hotplug_params *hpx) +{ + int i; + union acpi_object *fields = record->package.elements; + u32 revision = fields[1].integer.value; + + switch (revision) { + case 1: + if (record->package.count != 6) + return AE_ERROR; + for (i = 2; i < 6; i++) + if (fields[i].type != ACPI_TYPE_INTEGER) + return AE_ERROR; + hpx->t0 = &hpx->type0_data; + hpx->t0->revision = revision; + hpx->t0->cache_line_size = fields[2].integer.value; + hpx->t0->latency_timer = fields[3].integer.value; + hpx->t0->enable_serr = fields[4].integer.value; + hpx->t0->enable_perr = fields[5].integer.value; + break; + default: + printk(KERN_WARNING + "%s: Type 0 Revision %d record not supported\n", + __FUNCTION__, revision); + return AE_ERROR; + } + return AE_OK; +} + +static acpi_status +decode_type1_hpx_record(union acpi_object *record, struct hotplug_params *hpx) +{ + int i; + union acpi_object *fields = record->package.elements; + u32 revision = fields[1].integer.value; + + switch (revision) { + case 1: + if (record->package.count != 5) + return AE_ERROR; + for (i = 2; i < 5; i++) + if (fields[i].type != ACPI_TYPE_INTEGER) + return AE_ERROR; + hpx->t1 = &hpx->type1_data; + hpx->t1->revision = revision; + hpx->t1->max_mem_read = fields[2].integer.value; + hpx->t1->avg_max_split = fields[3].integer.value; + hpx->t1->tot_max_split = fields[4].integer.value; + break; + default: + printk(KERN_WARNING + "%s: Type 1 Revision %d record not supported\n", + __FUNCTION__, revision); + return AE_ERROR; + } + return AE_OK; +} + +static acpi_status +decode_type2_hpx_record(union acpi_object *record, struct hotplug_params *hpx) +{ + int i; + union acpi_object *fields = record->package.elements; + u32 revision = fields[1].integer.value; + + switch (revision) { + case 1: + if (record->package.count != 18) + return AE_ERROR; + for (i = 2; i < 18; i++) + if (fields[i].type != ACPI_TYPE_INTEGER) + return AE_ERROR; + hpx->t2 = &hpx->type2_data; + hpx->t2->revision = revision; + hpx->t2->unc_err_mask_and = fields[2].integer.value; + hpx->t2->unc_err_mask_or = fields[3].integer.value; + hpx->t2->unc_err_sever_and = fields[4].integer.value; + hpx->t2->unc_err_sever_or = fields[5].integer.value; + hpx->t2->cor_err_mask_and = fields[6].integer.value; + hpx->t2->cor_err_mask_or = fields[7].integer.value; + hpx->t2->adv_err_cap_and = fields[8].integer.value; + hpx->t2->adv_err_cap_or = fields[9].integer.value; + hpx->t2->pci_exp_devctl_and = fields[10].integer.value; + hpx->t2->pci_exp_devctl_or = fields[11].integer.value; + hpx->t2->pci_exp_lnkctl_and = fields[12].integer.value; + hpx->t2->pci_exp_lnkctl_or = fields[13].integer.value; + hpx->t2->sec_unc_err_sever_and = fields[14].integer.value; + hpx->t2->sec_unc_err_sever_or = fields[15].integer.value; + hpx->t2->sec_unc_err_mask_and = fields[16].integer.value; + hpx->t2->sec_unc_err_mask_or = fields[17].integer.value; + break; + default: + printk(KERN_WARNING + "%s: Type 2 Revision %d record not supported\n", + __FUNCTION__, revision); + return AE_ERROR; + } + return AE_OK; +} + +static acpi_status +acpi_run_hpx(acpi_handle handle, struct hotplug_params *hpx) +{ + acpi_status status; + struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL}; + union acpi_object *package, *record, *fields; + u32 type; + int i; + + /* Clear the return buffer with zeros */ + memset(hpx, 0, sizeof(struct hotplug_params)); + + status = acpi_evaluate_object(handle, "_HPX", NULL, &buffer); + if (ACPI_FAILURE(status)) + return status; + + package = (union acpi_object *)buffer.pointer; + if (package->type != ACPI_TYPE_PACKAGE) { + status = AE_ERROR; + goto exit; + } + + for (i = 0; i < package->package.count; i++) { + record = &package->package.elements[i]; + if (record->type != ACPI_TYPE_PACKAGE) { + status = AE_ERROR; + goto exit; + } + + fields = record->package.elements; + if (fields[0].type != ACPI_TYPE_INTEGER || + fields[1].type != ACPI_TYPE_INTEGER) { + status = AE_ERROR; + goto exit; + } + + type = fields[0].integer.value; + switch (type) { + case 0: + status = decode_type0_hpx_record(record, hpx); + if (ACPI_FAILURE(status)) + goto exit; + break; + case 1: + status = decode_type1_hpx_record(record, hpx); + if (ACPI_FAILURE(status)) + goto exit; + break; + case 2: + status = decode_type2_hpx_record(record, hpx); + if (ACPI_FAILURE(status)) + goto exit; + break; + default: + printk(KERN_ERR "%s: Type %d record not supported\n", + __FUNCTION__, type); + status = AE_ERROR; + goto exit; + } + } + exit: + kfree(buffer.pointer); + return status; +} static acpi_status acpi_run_hpp(acpi_handle handle, struct hotplug_params *hpp) @@ -50,6 +225,9 @@ acpi_run_hpp(acpi_handle handle, struct hotplug_params *hpp) acpi_get_name(handle, ACPI_FULL_PATHNAME, &string); + /* Clear the return buffer with zeros */ + memset(hpp, 0, sizeof(struct hotplug_params)); + /* get _hpp */ status = acpi_evaluate_object(handle, METHOD_NAME__HPP, NULL, &ret_buf); switch (status) { @@ -58,7 +236,7 @@ acpi_run_hpp(acpi_handle handle, struct hotplug_params *hpp) if (!ret_buf.pointer) { printk(KERN_ERR "%s:%s alloc for _HPP fail\n", __FUNCTION__, (char *)string.pointer); - acpi_os_free(string.pointer); + kfree(string.pointer); return AE_NO_MEMORY; } status = acpi_evaluate_object(handle, METHOD_NAME__HPP, @@ -69,7 +247,7 @@ acpi_run_hpp(acpi_handle handle, struct hotplug_params *hpp) if (ACPI_FAILURE(status)) { pr_debug("%s:%s _HPP fail=0x%x\n", __FUNCTION__, (char *)string.pointer, status); - acpi_os_free(string.pointer); + kfree(string.pointer); return status; } } @@ -98,19 +276,20 @@ acpi_run_hpp(acpi_handle handle, struct hotplug_params *hpp) } } - hpp->cache_line_size = nui[0]; - hpp->latency_timer = nui[1]; - hpp->enable_serr = nui[2]; - hpp->enable_perr = nui[3]; + hpp->t0 = &hpp->type0_data; + hpp->t0->cache_line_size = nui[0]; + hpp->t0->latency_timer = nui[1]; + hpp->t0->enable_serr = nui[2]; + hpp->t0->enable_perr = nui[3]; - pr_debug(" _HPP: cache_line_size=0x%x\n", hpp->cache_line_size); - pr_debug(" _HPP: latency timer =0x%x\n", hpp->latency_timer); - pr_debug(" _HPP: enable SERR =0x%x\n", hpp->enable_serr); - pr_debug(" _HPP: enable PERR =0x%x\n", hpp->enable_perr); + pr_debug(" _HPP: cache_line_size=0x%x\n", hpp->t0->cache_line_size); + pr_debug(" _HPP: latency timer =0x%x\n", hpp->t0->latency_timer); + pr_debug(" _HPP: enable SERR =0x%x\n", hpp->t0->enable_serr); + pr_debug(" _HPP: enable PERR =0x%x\n", hpp->t0->enable_perr); free_and_return: - acpi_os_free(string.pointer); - acpi_os_free(ret_buf.pointer); + kfree(string.pointer); + kfree(ret_buf.pointer); return status; } @@ -130,13 +309,17 @@ acpi_status acpi_run_oshp(acpi_handle handle) /* run OSHP */ status = acpi_evaluate_object(handle, METHOD_NAME_OSHP, NULL, NULL); if (ACPI_FAILURE(status)) - printk(KERN_ERR "%s:%s OSHP fails=0x%x\n", __FUNCTION__, - (char *)string.pointer, status); + if (status != AE_NOT_FOUND) + printk(KERN_ERR "%s:%s OSHP fails=0x%x\n", + __FUNCTION__, (char *)string.pointer, status); + else + dbg("%s:%s OSHP not found\n", + __FUNCTION__, (char *)string.pointer); else pr_debug("%s:%s OSHP passes\n", __FUNCTION__, (char *)string.pointer); - acpi_os_free(string.pointer); + kfree(string.pointer); return status; } EXPORT_SYMBOL_GPL(acpi_run_oshp); @@ -145,14 +328,27 @@ EXPORT_SYMBOL_GPL(acpi_run_oshp); /* acpi_get_hp_params_from_firmware * - * @dev - the pci_dev of the newly added device + * @bus - the pci_bus of the bus on which the device is newly added * @hpp - allocated by the caller */ -acpi_status acpi_get_hp_params_from_firmware(struct pci_dev *dev, +acpi_status acpi_get_hp_params_from_firmware(struct pci_bus *bus, struct hotplug_params *hpp) { acpi_status status = AE_NOT_FOUND; - struct pci_dev *pdev = dev; + acpi_handle handle, phandle; + struct pci_bus *pbus = bus; + struct pci_dev *pdev; + + do { + pdev = pbus->self; + if (!pdev) { + handle = acpi_get_pci_rootbridge_handle( + pci_domain_nr(pbus), pbus->number); + break; + } + handle = DEVICE_ACPI_HANDLE(&(pdev->dev)); + pbus = pbus->parent; + } while (!handle); /* * _HPP settings apply to all child buses, until another _HPP is @@ -160,15 +356,19 @@ acpi_status acpi_get_hp_params_from_firmware(struct pci_dev *dev, * look for it in the parent device scope since that would apply to * this pci dev. If we don't find any _HPP, use hardcoded defaults */ - while (pdev && (ACPI_FAILURE(status))) { - acpi_handle handle = DEVICE_ACPI_HANDLE(&(pdev->dev)); - if (!handle) + while (handle) { + status = acpi_run_hpx(handle, hpp); + if (ACPI_SUCCESS(status)) break; status = acpi_run_hpp(handle, hpp); - if (!(pdev->bus->parent)) + if (ACPI_SUCCESS(status)) break; - /* Check if a parent object supports _HPP */ - pdev = pdev->bus->parent->self; + if (acpi_root_bridge(handle)) + break; + status = acpi_get_parent(handle, &phandle); + if (ACPI_FAILURE(status)) + break; + handle = phandle; } return status; } @@ -192,20 +392,23 @@ int acpi_root_bridge(acpi_handle handle) if ((info->valid & ACPI_VALID_HID) && !strcmp(PCI_ROOT_HID_STRING, info->hardware_id.value)) { - acpi_os_free(buffer.pointer); + kfree(buffer.pointer); return 1; } if (info->valid & ACPI_VALID_CID) { for (i=0; i < info->compatibility_id.count; i++) { if (!strcmp(PCI_ROOT_HID_STRING, info->compatibility_id.id[i].value)) { - acpi_os_free(buffer.pointer); + kfree(buffer.pointer); return 1; } } } - acpi_os_free(buffer.pointer); + kfree(buffer.pointer); } return 0; } EXPORT_SYMBOL_GPL(acpi_root_bridge); + +module_param(debug_acpi, bool, 0644); +MODULE_PARM_DESC(debug_acpi, "Debugging mode for ACPI enabled or not"); diff --git a/drivers/pci/hotplug/acpiphp.h b/drivers/pci/hotplug/acpiphp.h index 467ac70a4..be104eced 100644 --- a/drivers/pci/hotplug/acpiphp.h +++ b/drivers/pci/hotplug/acpiphp.h @@ -75,6 +75,10 @@ struct acpiphp_bridge { struct list_head list; acpi_handle handle; struct acpiphp_slot *slots; + + /* Ejectable PCI-to-PCI bridge (PCI bridge and PCI function) */ + struct acpiphp_func *func; + int type; int nr_slots; @@ -122,10 +126,11 @@ struct acpiphp_slot { */ struct acpiphp_func { struct acpiphp_slot *slot; /* parent */ + struct acpiphp_bridge *bridge; /* Ejectable PCI-to-PCI bridge */ struct list_head sibling; struct pci_dev *pci_dev; - + struct notifier_block nb; acpi_handle handle; u8 function; /* pci function# */ @@ -146,24 +151,6 @@ struct acpiphp_attention_info }; -struct dependent_device { - struct list_head device_list; - struct list_head pci_list; - acpi_handle handle; - struct acpiphp_func *func; -}; - - -struct acpiphp_dock_station { - acpi_handle handle; - u32 last_dock_time; - u32 flags; - struct acpiphp_func *dock_bridge; - struct list_head dependent_devices; - struct list_head pci_dependent_devices; -}; - - /* PCI bus bridge HID */ #define ACPI_PCI_HOST_HID "PNP0A03" @@ -202,11 +189,6 @@ struct acpiphp_dock_station { #define FUNC_HAS_PS2 (0x00000040) #define FUNC_HAS_PS3 (0x00000080) #define FUNC_HAS_DCK (0x00000100) -#define FUNC_IS_DD (0x00000200) - -/* dock station flags */ -#define DOCK_DOCKING (0x00000001) -#define DOCK_HAS_BRIDGE (0x00000002) /* function prototypes */ @@ -221,7 +203,6 @@ extern int acpiphp_glue_init (void); extern void acpiphp_glue_exit (void); extern int acpiphp_get_num_slots (void); typedef int (*acpiphp_callback)(struct acpiphp_slot *slot, void *data); -void handle_hotplug_event_func(acpi_handle, u32, void*); extern int acpiphp_enable_slot (struct acpiphp_slot *slot); extern int acpiphp_disable_slot (struct acpiphp_slot *slot); @@ -231,16 +212,6 @@ extern u8 acpiphp_get_latch_status (struct acpiphp_slot *slot); extern u8 acpiphp_get_adapter_status (struct acpiphp_slot *slot); extern u32 acpiphp_get_address (struct acpiphp_slot *slot); -/* acpiphp_dock.c */ -extern int find_dock_station(void); -extern void remove_dock_station(void); -extern void add_dependent_device(struct dependent_device *new_dd); -extern void add_pci_dependent_device(struct dependent_device *new_dd); -extern struct dependent_device *get_dependent_device(acpi_handle handle); -extern int is_dependent_device(acpi_handle handle); -extern int detect_dependent_devices(acpi_handle *bridge_handle); -extern struct dependent_device *alloc_dependent_device(acpi_handle handle); - /* variables */ extern int acpiphp_debug; diff --git a/drivers/pci/hotplug/acpiphp_core.c b/drivers/pci/hotplug/acpiphp_core.c index 4f1b0da8e..e2fef60c2 100644 --- a/drivers/pci/hotplug/acpiphp_core.c +++ b/drivers/pci/hotplug/acpiphp_core.c @@ -27,8 +27,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * - * Send feedback to , - * + * Send feedback to * */ @@ -416,27 +415,12 @@ void acpiphp_unregister_hotplug_slot(struct acpiphp_slot *acpiphp_slot) static int __init acpiphp_init(void) { - int retval; - int docking_station; - info(DRIVER_DESC " version: " DRIVER_VERSION "\n"); acpiphp_debug = debug; - docking_station = find_dock_station(); - /* read all the ACPI info from the system */ - retval = init_acpi(); - - /* if we have found a docking station, we should - * go ahead and load even if init_acpi has found - * no slots. This handles the case when the _DCK - * method not defined under the actual dock bridge - */ - if (docking_station) - return 0; - else - return retval; + return init_acpi(); } @@ -444,8 +428,6 @@ static void __exit acpiphp_exit(void) { /* deallocate internal data structures etc. */ acpiphp_glue_exit(); - - remove_dock_station(); } module_init(acpiphp_init); diff --git a/drivers/pci/hotplug/acpiphp_dock.c b/drivers/pci/hotplug/acpiphp_dock.c deleted file mode 100644 index 4f1aaf128..000000000 --- a/drivers/pci/hotplug/acpiphp_dock.c +++ /dev/null @@ -1,438 +0,0 @@ -/* - * ACPI PCI HotPlug dock functions to ACPI CA subsystem - * - * Copyright (C) 2006 Kristen Carlson Accardi (kristen.c.accardi@intel.com) - * Copyright (C) 2006 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, GOOD TITLE or - * NON INFRINGEMENT. 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. - * - * Send feedback to - * - */ -#include -#include - -#include -#include -#include -#include - -#include "../pci.h" -#include "pci_hotplug.h" -#include "acpiphp.h" - -static struct acpiphp_dock_station *ds; -#define MY_NAME "acpiphp_dock" - - -int is_dependent_device(acpi_handle handle) -{ - return (get_dependent_device(handle) ? 1 : 0); -} - - -static acpi_status -find_dependent_device(acpi_handle handle, u32 lvl, void *context, void **rv) -{ - int *count = (int *)context; - - if (is_dependent_device(handle)) { - (*count)++; - return AE_CTRL_TERMINATE; - } else { - return AE_OK; - } -} - - - - -void add_dependent_device(struct dependent_device *new_dd) -{ - list_add_tail(&new_dd->device_list, &ds->dependent_devices); -} - - -void add_pci_dependent_device(struct dependent_device *new_dd) -{ - list_add_tail(&new_dd->pci_list, &ds->pci_dependent_devices); -} - - - -struct dependent_device * get_dependent_device(acpi_handle handle) -{ - struct dependent_device *dd; - - if (!ds) - return NULL; - - list_for_each_entry(dd, &ds->dependent_devices, device_list) { - if (handle == dd->handle) - return dd; - } - return NULL; -} - - - -struct dependent_device *alloc_dependent_device(acpi_handle handle) -{ - struct dependent_device *dd; - - dd = kzalloc(sizeof(*dd), GFP_KERNEL); - if (dd) { - INIT_LIST_HEAD(&dd->pci_list); - INIT_LIST_HEAD(&dd->device_list); - dd->handle = handle; - } - return dd; -} - - - -static int is_dock(acpi_handle handle) -{ - acpi_status status; - acpi_handle tmp; - - status = acpi_get_handle(handle, "_DCK", &tmp); - if (ACPI_FAILURE(status)) { - return 0; - } - return 1; -} - - - -static int dock_present(void) -{ - unsigned long sta; - acpi_status status; - - if (ds) { - status = acpi_evaluate_integer(ds->handle, "_STA", NULL, &sta); - if (ACPI_SUCCESS(status) && sta) - return 1; - } - return 0; -} - - - -static void eject_dock(void) -{ - struct acpi_object_list arg_list; - union acpi_object arg; - - arg_list.count = 1; - arg_list.pointer = &arg; - arg.type = ACPI_TYPE_INTEGER; - arg.integer.value = 1; - - if (ACPI_FAILURE(acpi_evaluate_object(ds->handle, "_EJ0", - &arg_list, NULL)) || dock_present()) - warn("%s: failed to eject dock!\n", __FUNCTION__); - - return; -} - - - - -static acpi_status handle_dock(int dock) -{ - acpi_status status; - struct acpi_object_list arg_list; - union acpi_object arg; - struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL}; - - dbg("%s: %s\n", __FUNCTION__, dock ? "docking" : "undocking"); - - /* _DCK method has one argument */ - arg_list.count = 1; - arg_list.pointer = &arg; - arg.type = ACPI_TYPE_INTEGER; - arg.integer.value = dock; - status = acpi_evaluate_object(ds->handle, "_DCK", - &arg_list, &buffer); - if (ACPI_FAILURE(status)) - err("%s: failed to execute _DCK\n", __FUNCTION__); - acpi_os_free(buffer.pointer); - - return status; -} - - - -static inline void dock(void) -{ - handle_dock(1); -} - - - -static inline void undock(void) -{ - handle_dock(0); -} - - - -/* - * the _DCK method can do funny things... and sometimes not - * hah-hah funny. - * - * TBD - figure out a way to only call fixups for - * systems that require them. - */ -static void post_dock_fixups(void) -{ - struct pci_bus *bus; - u32 buses; - struct dependent_device *dd; - - list_for_each_entry(dd, &ds->pci_dependent_devices, pci_list) { - bus = dd->func->slot->bridge->pci_bus; - - /* fixup bad _DCK function that rewrites - * secondary bridge on slot - */ - pci_read_config_dword(bus->self, - PCI_PRIMARY_BUS, - &buses); - - if (((buses >> 8) & 0xff) != bus->secondary) { - buses = (buses & 0xff000000) - | ((unsigned int)(bus->primary) << 0) - | ((unsigned int)(bus->secondary) << 8) - | ((unsigned int)(bus->subordinate) << 16); - pci_write_config_dword(bus->self, - PCI_PRIMARY_BUS, - buses); - } - } -} - - - -static void hotplug_pci(u32 type) -{ - struct dependent_device *dd; - - list_for_each_entry(dd, &ds->pci_dependent_devices, pci_list) - handle_hotplug_event_func(dd->handle, type, dd->func); -} - - - -static inline void begin_dock(void) -{ - ds->flags |= DOCK_DOCKING; -} - - -static inline void complete_dock(void) -{ - ds->flags &= ~(DOCK_DOCKING); - ds->last_dock_time = jiffies; -} - - -static int dock_in_progress(void) -{ - if (ds->flags & DOCK_DOCKING || - ds->last_dock_time == jiffies) { - dbg("dock in progress\n"); - return 1; - } - return 0; -} - - - -static void -handle_hotplug_event_dock(acpi_handle handle, u32 type, void *context) -{ - dbg("%s: enter\n", __FUNCTION__); - - switch (type) { - case ACPI_NOTIFY_BUS_CHECK: - dbg("BUS Check\n"); - if (!dock_in_progress() && dock_present()) { - begin_dock(); - dock(); - if (!dock_present()) { - err("Unable to dock!\n"); - break; - } - post_dock_fixups(); - hotplug_pci(type); - complete_dock(); - } - break; - case ACPI_NOTIFY_EJECT_REQUEST: - dbg("EJECT request\n"); - if (!dock_in_progress() && dock_present()) { - hotplug_pci(type); - undock(); - eject_dock(); - if (dock_present()) - err("Unable to undock!\n"); - } - break; - } -} - - - - -static acpi_status -find_dock_ejd(acpi_handle handle, u32 lvl, void *context, void **rv) -{ - acpi_status status; - acpi_handle tmp; - acpi_handle dck_handle = (acpi_handle) context; - char objname[64]; - struct acpi_buffer buffer = { .length = sizeof(objname), - .pointer = objname }; - struct acpi_buffer ejd_buffer = {ACPI_ALLOCATE_BUFFER, NULL}; - union acpi_object *ejd_obj; - - status = acpi_get_handle(handle, "_EJD", &tmp); - if (ACPI_FAILURE(status)) - return AE_OK; - - /* make sure we are dependent on the dock device, - * by executing the _EJD method, then getting a handle - * to the device referenced by that name. If that - * device handle is the same handle as the dock station - * handle, then we are a device dependent on the dock station - */ - acpi_get_name(dck_handle, ACPI_FULL_PATHNAME, &buffer); - status = acpi_evaluate_object(handle, "_EJD", NULL, &ejd_buffer); - if (ACPI_FAILURE(status)) { - err("Unable to execute _EJD!\n"); - goto find_ejd_out; - } - ejd_obj = ejd_buffer.pointer; - status = acpi_get_handle(NULL, ejd_obj->string.pointer, &tmp); - if (ACPI_FAILURE(status)) - goto find_ejd_out; - - if (tmp == dck_handle) { - struct dependent_device *dd; - dbg("%s: found device dependent on dock\n", __FUNCTION__); - dd = alloc_dependent_device(handle); - if (!dd) { - err("Can't allocate memory for dependent device!\n"); - goto find_ejd_out; - } - add_dependent_device(dd); - } - -find_ejd_out: - acpi_os_free(ejd_buffer.pointer); - return AE_OK; -} - - - -int detect_dependent_devices(acpi_handle *bridge_handle) -{ - acpi_status status; - int count; - - count = 0; - - status = acpi_walk_namespace(ACPI_TYPE_DEVICE, bridge_handle, - (u32)1, find_dependent_device, - (void *)&count, NULL); - - return count; -} - - - - - -static acpi_status -find_dock(acpi_handle handle, u32 lvl, void *context, void **rv) -{ - int *count = (int *)context; - - if (is_dock(handle)) { - dbg("%s: found dock\n", __FUNCTION__); - ds = kzalloc(sizeof(*ds), GFP_KERNEL); - ds->handle = handle; - INIT_LIST_HEAD(&ds->dependent_devices); - INIT_LIST_HEAD(&ds->pci_dependent_devices); - - /* look for devices dependent on dock station */ - acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, - ACPI_UINT32_MAX, find_dock_ejd, handle, NULL); - - acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY, - handle_hotplug_event_dock, ds); - (*count)++; - } - - return AE_OK; -} - - - - -int find_dock_station(void) -{ - int num = 0; - - ds = NULL; - - /* start from the root object, because some laptops define - * _DCK methods outside the scope of PCI (IBM x-series laptop) - */ - acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, - ACPI_UINT32_MAX, find_dock, &num, NULL); - - return num; -} - - - -void remove_dock_station(void) -{ - struct dependent_device *dd, *tmp; - if (ds) { - if (ACPI_FAILURE(acpi_remove_notify_handler(ds->handle, - ACPI_SYSTEM_NOTIFY, handle_hotplug_event_dock))) - err("failed to remove dock notify handler\n"); - - /* free all dependent devices */ - list_for_each_entry_safe(dd, tmp, &ds->dependent_devices, - device_list) - kfree(dd); - - /* no need to touch the pci_dependent_device list, - * cause all memory was freed above - */ - kfree(ds); - } -} - - diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c index 053ee8438..ae67a8f55 100644 --- a/drivers/pci/hotplug/acpiphp_glue.c +++ b/drivers/pci/hotplug/acpiphp_glue.c @@ -26,7 +26,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * - * Send feedback to + * Send feedback to * */ @@ -59,6 +59,7 @@ static LIST_HEAD(bridge_list); static void handle_hotplug_event_bridge (acpi_handle, u32, void *); static void acpiphp_sanitize_bus(struct pci_bus *bus); static void acpiphp_set_hpp_values(acpi_handle handle, struct pci_bus *bus); +static void handle_hotplug_event_func(acpi_handle handle, u32 type, void *context); /* @@ -116,6 +117,59 @@ is_ejectable_slot(acpi_handle handle, u32 lvl, void *context, void **rv) } } +/* callback routine to check for the existance of a pci dock device */ +static acpi_status +is_pci_dock_device(acpi_handle handle, u32 lvl, void *context, void **rv) +{ + int *count = (int *)context; + + if (is_dock_device(handle)) { + (*count)++; + return AE_CTRL_TERMINATE; + } else { + return AE_OK; + } +} + + + + +/* + * the _DCK method can do funny things... and sometimes not + * hah-hah funny. + * + * TBD - figure out a way to only call fixups for + * systems that require them. + */ +static int post_dock_fixups(struct notifier_block *nb, unsigned long val, + void *v) +{ + struct acpiphp_func *func = container_of(nb, struct acpiphp_func, nb); + struct pci_bus *bus = func->slot->bridge->pci_bus; + u32 buses; + + if (!bus->self) + return NOTIFY_OK; + + /* fixup bad _DCK function that rewrites + * secondary bridge on slot + */ + pci_read_config_dword(bus->self, + PCI_PRIMARY_BUS, + &buses); + + if (((buses >> 8) & 0xff) != bus->secondary) { + buses = (buses & 0xff000000) + | ((unsigned int)(bus->primary) << 0) + | ((unsigned int)(bus->secondary) << 8) + | ((unsigned int)(bus->subordinate) << 16); + pci_write_config_dword(bus->self, PCI_PRIMARY_BUS, buses); + } + return NOTIFY_OK; +} + + + /* callback routine to register each ACPI PCI slot object */ static acpi_status @@ -124,7 +178,6 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) struct acpiphp_bridge *bridge = (struct acpiphp_bridge *)context; struct acpiphp_slot *slot; struct acpiphp_func *newfunc; - struct dependent_device *dd; acpi_handle tmp; acpi_status status = AE_OK; unsigned long adr, sun; @@ -137,7 +190,7 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) status = acpi_get_handle(handle, "_EJ0", &tmp); - if (ACPI_FAILURE(status) && !(is_dependent_device(handle))) + if (ACPI_FAILURE(status) && !(is_dock_device(handle))) return AE_OK; device = (adr >> 16) & 0xffff; @@ -162,22 +215,17 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) if (ACPI_SUCCESS(acpi_get_handle(handle, "_PS3", &tmp))) newfunc->flags |= FUNC_HAS_PS3; - if (ACPI_SUCCESS(acpi_get_handle(handle, "_DCK", &tmp))) { + if (ACPI_SUCCESS(acpi_get_handle(handle, "_DCK", &tmp))) newfunc->flags |= FUNC_HAS_DCK; - /* add to devices dependent on dock station, - * because this may actually be the dock bridge - */ - dd = alloc_dependent_device(handle); - if (!dd) - err("Can't allocate memory for " - "new dependent device!\n"); - else - add_dependent_device(dd); - } status = acpi_evaluate_integer(handle, "_SUN", NULL, &sun); - if (ACPI_FAILURE(status)) - sun = -1; + if (ACPI_FAILURE(status)) { + /* + * use the count of the number of slots we've found + * for the number of the slot + */ + sun = bridge->nr_slots+1; + } /* search for objects that share the same slot */ for (slot = bridge->slots; slot; slot = slot->next) @@ -225,20 +273,23 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) slot->flags |= (SLOT_ENABLED | SLOT_POWEREDON); } - /* if this is a device dependent on a dock station, - * associate the acpiphp_func to the dependent_device - * struct. - */ - if ((dd = get_dependent_device(handle))) { - newfunc->flags |= FUNC_IS_DD; - /* - * we don't want any devices which is dependent - * on the dock to have it's _EJ0 method executed. - * because we need to run _DCK first. + if (is_dock_device(handle)) { + /* we don't want to call this device's _EJ0 + * because we want the dock notify handler + * to call it after it calls _DCK */ newfunc->flags &= ~FUNC_HAS_EJ0; - dd->func = newfunc; - add_pci_dependent_device(dd); + if (register_hotplug_dock_device(handle, + handle_hotplug_event_func, newfunc)) + dbg("failed to register dock device\n"); + + /* we need to be notified when dock events happen + * outside of the hotplug operation, since we may + * need to do fixups before we can hotplug. + */ + newfunc->nb.notifier_call = post_dock_fixups; + if (register_dock_notifier(&newfunc->nb)) + dbg("failed to register a dock notifier"); } /* install notify handler */ @@ -277,6 +328,15 @@ static int detect_ejectable_slots(acpi_handle *bridge_handle) status = acpi_walk_namespace(ACPI_TYPE_DEVICE, bridge_handle, (u32)1, is_ejectable_slot, (void *)&count, NULL); + /* + * we also need to add this bridge if there is a dock bridge or + * other pci device on a dock station (removable) + */ + if (!count) + status = acpi_walk_namespace(ACPI_TYPE_DEVICE, bridge_handle, + (u32)1, is_pci_dock_device, (void *)&count, + NULL); + return count; } @@ -286,13 +346,19 @@ static void decode_hpp(struct acpiphp_bridge *bridge) { acpi_status status; - status = acpi_get_hp_params_from_firmware(bridge->pci_dev, &bridge->hpp); - if (ACPI_FAILURE(status)) { + status = acpi_get_hp_params_from_firmware(bridge->pci_bus, &bridge->hpp); + if (ACPI_FAILURE(status) || + !bridge->hpp.t0 || (bridge->hpp.t0->revision > 1)) { /* use default numbers */ - bridge->hpp.cache_line_size = 0x10; - bridge->hpp.latency_timer = 0x40; - bridge->hpp.enable_serr = 0; - bridge->hpp.enable_perr = 0; + printk(KERN_WARNING + "%s: Could not get hotplug parameters. Use defaults\n", + __FUNCTION__); + bridge->hpp.t0 = &bridge->hpp.type0_data; + bridge->hpp.t0->revision = 0; + bridge->hpp.t0->cache_line_size = 0x10; + bridge->hpp.t0->latency_timer = 0x40; + bridge->hpp.t0->enable_serr = 0; + bridge->hpp.t0->enable_perr = 0; } } @@ -319,6 +385,13 @@ static void init_bridge_misc(struct acpiphp_bridge *bridge) /* install notify handler */ if (bridge->type != BRIDGE_TYPE_HOST) { + if ((bridge->flags & BRIDGE_HAS_EJ0) && bridge->func) { + status = acpi_remove_notify_handler(bridge->func->handle, + ACPI_SYSTEM_NOTIFY, + handle_hotplug_event_func); + if (ACPI_FAILURE(status)) + err("failed to remove notify handler\n"); + } status = acpi_install_notify_handler(bridge->handle, ACPI_SYSTEM_NOTIFY, handle_hotplug_event_bridge, @@ -331,6 +404,66 @@ static void init_bridge_misc(struct acpiphp_bridge *bridge) } +/* find acpiphp_func from acpiphp_bridge */ +static struct acpiphp_func *acpiphp_bridge_handle_to_function(acpi_handle handle) +{ + struct list_head *node, *l; + struct acpiphp_bridge *bridge; + struct acpiphp_slot *slot; + struct acpiphp_func *func; + + list_for_each(node, &bridge_list) { + bridge = list_entry(node, struct acpiphp_bridge, list); + for (slot = bridge->slots; slot; slot = slot->next) { + list_for_each(l, &slot->funcs) { + func = list_entry(l, struct acpiphp_func, + sibling); + if (func->handle == handle) + return func; + } + } + } + + return NULL; +} + + +static inline void config_p2p_bridge_flags(struct acpiphp_bridge *bridge) +{ + acpi_handle dummy_handle; + + if (ACPI_SUCCESS(acpi_get_handle(bridge->handle, + "_STA", &dummy_handle))) + bridge->flags |= BRIDGE_HAS_STA; + + if (ACPI_SUCCESS(acpi_get_handle(bridge->handle, + "_EJ0", &dummy_handle))) + bridge->flags |= BRIDGE_HAS_EJ0; + + if (ACPI_SUCCESS(acpi_get_handle(bridge->handle, + "_PS0", &dummy_handle))) + bridge->flags |= BRIDGE_HAS_PS0; + + if (ACPI_SUCCESS(acpi_get_handle(bridge->handle, + "_PS3", &dummy_handle))) + bridge->flags |= BRIDGE_HAS_PS3; + + /* is this ejectable p2p bridge? */ + if (bridge->flags & BRIDGE_HAS_EJ0) { + struct acpiphp_func *func; + + dbg("found ejectable p2p bridge\n"); + + /* make link between PCI bridge and PCI function */ + func = acpiphp_bridge_handle_to_function(bridge->handle); + if (!func) + return; + bridge->func = func; + func->bridge = bridge; + } +} + + /* allocate and initialize host bridge data structure */ static void add_host_bridge(acpi_handle *handle, struct pci_bus *pci_bus) { @@ -364,6 +497,7 @@ static void add_p2p_bridge(acpi_handle *handle, struct pci_dev *pci_dev) bridge->type = BRIDGE_TYPE_P2P; bridge->handle = handle; + config_p2p_bridge_flags(bridge); bridge->pci_dev = pci_dev_get(pci_dev); bridge->pci_bus = pci_dev->subordinate; @@ -413,8 +547,7 @@ find_p2p_bridge(acpi_handle handle, u32 lvl, void *context, void **rv) goto out; /* check if this bridge has ejectable slots */ - if ((detect_ejectable_slots(handle) > 0) || - (detect_dependent_devices(handle) > 0)) { + if ((detect_ejectable_slots(handle) > 0)) { dbg("found PCI-to-PCI bridge at PCI %s\n", pci_name(dev)); add_p2p_bridge(handle, dev); } @@ -423,7 +556,7 @@ find_p2p_bridge(acpi_handle handle, u32 lvl, void *context, void **rv) status = acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, (u32)1, find_p2p_bridge, dev->subordinate, NULL); if (ACPI_FAILURE(status)) - warn("find_p2p_bridge faied (error code = 0x%x)\n", status); + warn("find_p2p_bridge failed (error code = 0x%x)\n", status); out: pci_dev_put(dev); @@ -478,7 +611,6 @@ static int add_bridge(acpi_handle handle) if (detect_ejectable_slots(handle) > 0) { dbg("found PCI host-bus bridge with hot-pluggable slots\n"); add_host_bridge(handle, pci_bus); - return 0; } /* search P2P bridges under this host bridge */ @@ -486,7 +618,7 @@ static int add_bridge(acpi_handle handle) find_p2p_bridge, pci_bus, NULL); if (ACPI_FAILURE(status)) - warn("find_p2p_bridge faied (error code = 0x%x)\n",status); + warn("find_p2p_bridge failed (error code = 0x%x)\n", status); return 0; } @@ -516,12 +648,26 @@ static void cleanup_bridge(struct acpiphp_bridge *bridge) if (ACPI_FAILURE(status)) err("failed to remove notify handler\n"); + if ((bridge->type != BRIDGE_TYPE_HOST) && + ((bridge->flags & BRIDGE_HAS_EJ0) && bridge->func)) { + status = acpi_install_notify_handler(bridge->func->handle, + ACPI_SYSTEM_NOTIFY, + handle_hotplug_event_func, + bridge->func); + if (ACPI_FAILURE(status)) + err("failed to install interrupt notify handler\n"); + } + slot = bridge->slots; while (slot) { struct acpiphp_slot *next = slot->next; list_for_each_safe (list, tmp, &slot->funcs) { struct acpiphp_func *func; func = list_entry(list, struct acpiphp_func, sibling); + if (is_dock_device(func->handle)) { + unregister_hotplug_dock_device(func->handle); + unregister_dock_notifier(&func->nb); + } if (!(func->flags & FUNC_HAS_DCK)) { status = acpi_remove_notify_handler(func->handle, ACPI_SYSTEM_NOTIFY, @@ -549,6 +695,11 @@ cleanup_p2p_bridge(acpi_handle handle, u32 lvl, void *context, void **rv) { struct acpiphp_bridge *bridge; + /* cleanup p2p bridges under this P2P bridge + in a depth-first manner */ + acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, (u32)1, + cleanup_p2p_bridge, NULL, NULL); + if (!(bridge = acpiphp_handle_to_bridge(handle))) return AE_OK; cleanup_bridge(bridge); @@ -559,15 +710,14 @@ static void remove_bridge(acpi_handle handle) { struct acpiphp_bridge *bridge; + /* cleanup p2p bridges under this host bridge + in a depth-first manner */ + acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, + (u32)1, cleanup_p2p_bridge, NULL, NULL); + bridge = acpiphp_handle_to_bridge(handle); - if (bridge) { + if (bridge) cleanup_bridge(bridge); - } else { - /* clean-up p2p bridges under this host bridge */ - acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, - ACPI_UINT32_MAX, cleanup_p2p_bridge, - NULL, NULL); - } } static struct pci_dev * get_apic_pci_info(acpi_handle handle) @@ -634,7 +784,7 @@ static int get_gsi_base(acpi_handle handle, u32 *gsi_base) break; } out: - acpi_os_free(buffer.pointer); + kfree(buffer.pointer); return result; } @@ -797,36 +947,6 @@ static unsigned char acpiphp_max_busnr(struct pci_bus *bus) } - -/** - * get_func - get a pointer to acpiphp_func given a slot, device - * @slot: slot to search - * @dev: pci_dev struct to match. - * - * This function will increase the reference count of pci_dev, - * so callers should call pci_dev_put when complete. - * - */ -static struct acpiphp_func * -get_func(struct acpiphp_slot *slot, struct pci_dev *dev) -{ - struct acpiphp_func *func = NULL; - struct pci_bus *bus = slot->bridge->pci_bus; - struct pci_dev *pdev; - - list_for_each_entry(func, &slot->funcs, sibling) { - pdev = pci_get_slot(bus, PCI_DEVFN(slot->device, - func->function)); - if (pdev) { - if (pdev == dev) - break; - pci_dev_put(pdev); - } - } - return func; -} - - /** * acpiphp_bus_add - add a new bus to acpi subsystem * @func: acpiphp_func of the bridge @@ -872,6 +992,28 @@ acpiphp_bus_add_out: } +/** + * acpiphp_bus_trim - trim a bus from acpi subsystem + * @handle: handle to acpi namespace + * + */ +int acpiphp_bus_trim(acpi_handle handle) +{ + struct acpi_device *device; + int retval; + + retval = acpi_bus_get_device(handle, &device); + if (retval) { + dbg("acpi_device not found\n"); + return retval; + } + + retval = acpi_bus_trim(device, 1); + if (retval) + err("cannot remove from acpi list\n"); + + return retval; +} /** * enable_device - enable, configure a slot @@ -889,6 +1031,7 @@ static int enable_device(struct acpiphp_slot *slot) struct acpiphp_func *func; int retval = 0; int num, max, pass; + acpi_status status; if (slot->flags & SLOT_ENABLED) goto err_exit; @@ -918,19 +1061,17 @@ static int enable_device(struct acpiphp_slot *slot) if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE || dev->hdr_type == PCI_HEADER_TYPE_CARDBUS) { max = pci_scan_bridge(bus, dev, max, pass); - if (pass && dev->subordinate) { + if (pass && dev->subordinate) pci_bus_size_bridges(dev->subordinate); - func = get_func(slot, dev); - if (func) { - acpiphp_bus_add(func); - /* side effect of get_func */ - pci_dev_put(dev); - } - } } } } + list_for_each (l, &slot->funcs) { + func = list_entry(l, struct acpiphp_func, sibling); + acpiphp_bus_add(func); + } + pci_bus_assign_resources(bus); acpiphp_sanitize_bus(bus); pci_enable_bridges(bus); @@ -943,6 +1084,17 @@ static int enable_device(struct acpiphp_slot *slot) func = list_entry(l, struct acpiphp_func, sibling); func->pci_dev = pci_get_slot(bus, PCI_DEVFN(slot->device, func->function)); + if (!func->pci_dev) + continue; + + if (func->pci_dev->hdr_type != PCI_HEADER_TYPE_BRIDGE && + func->pci_dev->hdr_type != PCI_HEADER_TYPE_CARDBUS) + continue; + + status = find_p2p_bridge(func->handle, (u32)1, bus, NULL); + if (ACPI_FAILURE(status)) + warn("find_p2p_bridge failed (error code = 0x%x)\n", + status); } slot->flags |= SLOT_ENABLED; @@ -967,6 +1119,18 @@ static int disable_device(struct acpiphp_slot *slot) list_for_each (l, &slot->funcs) { func = list_entry(l, struct acpiphp_func, sibling); + + if (func->bridge) { + /* cleanup p2p bridges under this P2P bridge */ + cleanup_p2p_bridge(func->bridge->handle, + (u32)1, NULL, NULL); + func->bridge = NULL; + } + + acpiphp_bus_trim(func->handle); + /* try to remove anyway. + * acpiphp_bus_add might have been failed */ + if (!func->pci_dev) continue; @@ -1111,16 +1275,17 @@ static void program_hpp(struct pci_dev *dev, struct acpiphp_bridge *bridge) (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE && (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI))) return; + pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, - bridge->hpp.cache_line_size); + bridge->hpp.t0->cache_line_size); pci_write_config_byte(dev, PCI_LATENCY_TIMER, - bridge->hpp.latency_timer); + bridge->hpp.t0->latency_timer); pci_read_config_word(dev, PCI_COMMAND, &pci_cmd); - if (bridge->hpp.enable_serr) + if (bridge->hpp.t0->enable_serr) pci_cmd |= PCI_COMMAND_SERR; else pci_cmd &= ~PCI_COMMAND_SERR; - if (bridge->hpp.enable_perr) + if (bridge->hpp.t0->enable_perr) pci_cmd |= PCI_COMMAND_PARITY; else pci_cmd &= ~PCI_COMMAND_PARITY; @@ -1129,13 +1294,13 @@ static void program_hpp(struct pci_dev *dev, struct acpiphp_bridge *bridge) /* Program bridge control value and child devices */ if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) { pci_write_config_byte(dev, PCI_SEC_LATENCY_TIMER, - bridge->hpp.latency_timer); + bridge->hpp.t0->latency_timer); pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &pci_bctl); - if (bridge->hpp.enable_serr) + if (bridge->hpp.t0->enable_serr) pci_bctl |= PCI_BRIDGE_CTL_SERR; else pci_bctl &= ~PCI_BRIDGE_CTL_SERR; - if (bridge->hpp.enable_perr) + if (bridge->hpp.t0->enable_perr) pci_bctl |= PCI_BRIDGE_CTL_PARITY; else pci_bctl &= ~PCI_BRIDGE_CTL_PARITY; @@ -1155,6 +1320,7 @@ static void acpiphp_set_hpp_values(acpi_handle handle, struct pci_bus *bus) memset(&bridge, 0, sizeof(bridge)); bridge.handle = handle; + bridge.pci_bus = bus; bridge.pci_dev = bus->self; decode_hpp(&bridge); list_for_each_entry(dev, &bus->devices, bus_list) @@ -1297,6 +1463,13 @@ static void handle_hotplug_event_bridge(acpi_handle handle, u32 type, void *cont case ACPI_NOTIFY_EJECT_REQUEST: /* request device eject */ dbg("%s: Device eject notify on %s\n", __FUNCTION__, objname); + if ((bridge->type != BRIDGE_TYPE_HOST) && + (bridge->flags & BRIDGE_HAS_EJ0)) { + struct acpiphp_slot *slot; + slot = bridge->func->slot; + if (!acpiphp_disable_slot(slot)) + acpiphp_eject_slot(slot); + } break; case ACPI_NOTIFY_FREQUENCY_MISMATCH: @@ -1330,7 +1503,7 @@ static void handle_hotplug_event_bridge(acpi_handle handle, u32 type, void *cont * handles ACPI event notification on slots * */ -void handle_hotplug_event_func(acpi_handle handle, u32 type, void *context) +static void handle_hotplug_event_func(acpi_handle handle, u32 type, void *context) { struct acpiphp_func *func; char objname[64]; @@ -1490,9 +1663,15 @@ int acpiphp_enable_slot(struct acpiphp_slot *slot) if (retval) goto err_exit; - if (get_slot_status(slot) == ACPI_STA_ALL) + if (get_slot_status(slot) == ACPI_STA_ALL) { /* configure all functions */ retval = enable_device(slot); + if (retval) + power_off_slot(slot); + } else { + dbg("%s: Slot status is not ACPI_STA_ALL\n", __FUNCTION__); + power_off_slot(slot); + } err_exit: mutex_unlock(&slot->crit_sect); diff --git a/drivers/pci/hotplug/cpci_hotplug_core.c b/drivers/pci/hotplug/cpci_hotplug_core.c index 037ce4c91..d5df5871c 100644 --- a/drivers/pci/hotplug/cpci_hotplug_core.c +++ b/drivers/pci/hotplug/cpci_hotplug_core.c @@ -25,7 +25,6 @@ * Send feedback to */ -#include #include #include #include @@ -348,7 +347,7 @@ cpci_hp_intr(int irq, void *data, struct pt_regs *regs) dbg("entered cpci_hp_intr"); /* Check to see if it was our interrupt */ - if ((controller->irq_flags & SA_SHIRQ) && + if ((controller->irq_flags & IRQF_SHARED) && !controller->ops->check_irq(controller->dev_id)) { dbg("exited cpci_hp_intr, not our interrupt"); return IRQ_NONE; diff --git a/drivers/pci/hotplug/cpci_hotplug_pci.c b/drivers/pci/hotplug/cpci_hotplug_pci.c index 225b5e551..4afcaffd0 100644 --- a/drivers/pci/hotplug/cpci_hotplug_pci.c +++ b/drivers/pci/hotplug/cpci_hotplug_pci.c @@ -23,7 +23,6 @@ * Send feedback to */ -#include #include #include #include @@ -255,8 +254,8 @@ int cpci_led_off(struct slot* slot) int cpci_configure_slot(struct slot* slot) { - unsigned char busnr; - struct pci_bus *child; + struct pci_bus *parent; + int fn; dbg("%s - enter", __FUNCTION__); @@ -277,23 +276,53 @@ int cpci_configure_slot(struct slot* slot) */ n = pci_scan_slot(slot->bus, slot->devfn); dbg("%s: pci_scan_slot returned %d", __FUNCTION__, n); - if (n > 0) - pci_bus_add_devices(slot->bus); slot->dev = pci_get_slot(slot->bus, slot->devfn); if (slot->dev == NULL) { err("Could not find PCI device for slot %02x", slot->number); - return 1; + return -ENODEV; } } - - if (slot->dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) { - pci_read_config_byte(slot->dev, PCI_SECONDARY_BUS, &busnr); - child = pci_add_new_bus(slot->dev->bus, slot->dev, busnr); - pci_do_scan_bus(child); - pci_bus_size_bridges(child); + parent = slot->dev->bus; + + for (fn = 0; fn < 8; fn++) { + struct pci_dev *dev; + + dev = pci_get_slot(parent, PCI_DEVFN(PCI_SLOT(slot->devfn), fn)); + if (!dev) + continue; + if ((dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) || + (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)) { + /* Find an unused bus number for the new bridge */ + struct pci_bus *child; + unsigned char busnr, start = parent->secondary; + unsigned char end = parent->subordinate; + + for (busnr = start; busnr <= end; busnr++) { + if (!pci_find_bus(pci_domain_nr(parent), + busnr)) + break; + } + if (busnr >= end) { + err("No free bus for hot-added bridge\n"); + pci_dev_put(dev); + continue; + } + child = pci_add_new_bus(parent, dev, busnr); + if (!child) { + err("Cannot add new bus for %s\n", + pci_name(dev)); + pci_dev_put(dev); + continue; + } + child->subordinate = pci_do_scan_bus(child); + pci_bus_size_bridges(child); + } + pci_dev_put(dev); } - pci_bus_assign_resources(slot->dev->bus); + pci_bus_assign_resources(parent); + pci_bus_add_devices(parent); + pci_enable_bridges(parent); dbg("%s - exit", __FUNCTION__); return 0; diff --git a/drivers/pci/hotplug/cpcihp_generic.c b/drivers/pci/hotplug/cpcihp_generic.c index 2d4639d68..e847f0d6c 100644 --- a/drivers/pci/hotplug/cpcihp_generic.c +++ b/drivers/pci/hotplug/cpcihp_generic.c @@ -34,7 +34,6 @@ * Send feedback to */ -#include #include #include #include diff --git a/drivers/pci/hotplug/cpcihp_zt5550.c b/drivers/pci/hotplug/cpcihp_zt5550.c index f7cb00da3..1c12e9171 100644 --- a/drivers/pci/hotplug/cpcihp_zt5550.c +++ b/drivers/pci/hotplug/cpcihp_zt5550.c @@ -30,13 +30,13 @@ * Send feedback to */ -#include #include #include #include #include #include -#include /* SA_SHIRQ */ +#include +#include /* IRQF_SHARED */ #include "cpci_hotplug.h" #include "cpcihp_zt5550.h" @@ -95,8 +95,8 @@ static int zt5550_hc_config(struct pci_dev *pdev) hc_dev = pdev; dbg("hc_dev = %p", hc_dev); - dbg("pci resource start %lx", pci_resource_start(hc_dev, 1)); - dbg("pci resource len %lx", pci_resource_len(hc_dev, 1)); + dbg("pci resource start %llx", (unsigned long long)pci_resource_start(hc_dev, 1)); + dbg("pci resource len %llx", (unsigned long long)pci_resource_len(hc_dev, 1)); if(!request_mem_region(pci_resource_start(hc_dev, 1), pci_resource_len(hc_dev, 1), MY_NAME)) { @@ -108,8 +108,9 @@ static int zt5550_hc_config(struct pci_dev *pdev) hc_registers = ioremap(pci_resource_start(hc_dev, 1), pci_resource_len(hc_dev, 1)); if(!hc_registers) { - err("cannot remap MMIO region %lx @ %lx", - pci_resource_len(hc_dev, 1), pci_resource_start(hc_dev, 1)); + err("cannot remap MMIO region %llx @ %llx", + (unsigned long long)pci_resource_len(hc_dev, 1), + (unsigned long long)pci_resource_start(hc_dev, 1)); ret = -ENODEV; goto exit_release_region; } @@ -219,7 +220,7 @@ static int zt5550_hc_init_one (struct pci_dev *pdev, const struct pci_device_id zt5550_hpc.ops = &zt5550_hpc_ops; if(!poll) { zt5550_hpc.irq = hc_dev->irq; - zt5550_hpc.irq_flags = SA_SHIRQ; + zt5550_hpc.irq_flags = IRQF_SHARED; zt5550_hpc.dev_id = hc_dev; zt5550_hpc_ops.enable_irq = zt5550_hc_enable_irq; diff --git a/drivers/pci/hotplug/cpqphp_core.c b/drivers/pci/hotplug/cpqphp_core.c index 9bc1deb8d..1fc259913 100644 --- a/drivers/pci/hotplug/cpqphp_core.c +++ b/drivers/pci/hotplug/cpqphp_core.c @@ -29,7 +29,6 @@ * */ -#include #include #include #include @@ -1089,8 +1088,8 @@ static int cpqhpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent) } dbg("pdev = %p\n", pdev); - dbg("pci resource start %lx\n", pci_resource_start(pdev, 0)); - dbg("pci resource len %lx\n", pci_resource_len(pdev, 0)); + dbg("pci resource start %llx\n", (unsigned long long)pci_resource_start(pdev, 0)); + dbg("pci resource len %llx\n", (unsigned long long)pci_resource_len(pdev, 0)); if (!request_mem_region(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0), MY_NAME)) { @@ -1102,9 +1101,9 @@ static int cpqhpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ctrl->hpc_reg = ioremap(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0)); if (!ctrl->hpc_reg) { - err("cannot remap MMIO region %lx @ %lx\n", - pci_resource_len(pdev, 0), - pci_resource_start(pdev, 0)); + err("cannot remap MMIO region %llx @ %llx\n", + (unsigned long long)pci_resource_len(pdev, 0), + (unsigned long long)pci_resource_start(pdev, 0)); rc = -ENODEV; goto err_free_mem_region; } @@ -1189,7 +1188,7 @@ static int cpqhpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent) /* set up the interrupt */ dbg("HPC interrupt = %d \n", ctrl->interrupt); if (request_irq(ctrl->interrupt, cpqhp_ctrl_intr, - SA_SHIRQ, MY_NAME, ctrl)) { + IRQF_SHARED, MY_NAME, ctrl)) { err("Can't get irq %d for the hotplug pci controller\n", ctrl->interrupt); rc = -ENODEV; diff --git a/drivers/pci/hotplug/cpqphp_ctrl.c b/drivers/pci/hotplug/cpqphp_ctrl.c index 55d2dc7e3..ae2dd36ef 100644 --- a/drivers/pci/hotplug/cpqphp_ctrl.c +++ b/drivers/pci/hotplug/cpqphp_ctrl.c @@ -26,7 +26,6 @@ * */ -#include #include #include #include diff --git a/drivers/pci/hotplug/cpqphp_nvram.c b/drivers/pci/hotplug/cpqphp_nvram.c index ac98a11bd..cf0878917 100644 --- a/drivers/pci/hotplug/cpqphp_nvram.c +++ b/drivers/pci/hotplug/cpqphp_nvram.c @@ -26,7 +26,6 @@ * */ -#include #include #include #include diff --git a/drivers/pci/hotplug/cpqphp_pci.c b/drivers/pci/hotplug/cpqphp_pci.c index 00b81a7bd..0d9688952 100644 --- a/drivers/pci/hotplug/cpqphp_pci.c +++ b/drivers/pci/hotplug/cpqphp_pci.c @@ -26,7 +26,6 @@ * */ -#include #include #include #include diff --git a/drivers/pci/hotplug/cpqphp_sysfs.c b/drivers/pci/hotplug/cpqphp_sysfs.c index bbfeed767..5bab666cd 100644 --- a/drivers/pci/hotplug/cpqphp_sysfs.c +++ b/drivers/pci/hotplug/cpqphp_sysfs.c @@ -26,7 +26,6 @@ * */ -#include #include #include #include @@ -141,7 +140,7 @@ struct ctrl_dbg { static int open(struct inode *inode, struct file *file) { - struct controller *ctrl = inode->u.generic_ip; + struct controller *ctrl = inode->i_private; struct ctrl_dbg *dbg; int retval = -ENOMEM; diff --git a/drivers/pci/hotplug/fakephp.c b/drivers/pci/hotplug/fakephp.c index 71b80c23e..dd2b76277 100644 --- a/drivers/pci/hotplug/fakephp.c +++ b/drivers/pci/hotplug/fakephp.c @@ -32,7 +32,6 @@ * Enabling PCI devices is left as an exercise for the reader... * */ -#include #include #include #include diff --git a/drivers/pci/hotplug/ibmphp_core.c b/drivers/pci/hotplug/ibmphp_core.c index e13d5b872..59392946c 100644 --- a/drivers/pci/hotplug/ibmphp_core.c +++ b/drivers/pci/hotplug/ibmphp_core.c @@ -285,7 +285,7 @@ static int get_attention_status(struct hotplug_slot *hotplug_slot, u8 * value) (ulong) hotplug_slot, (ulong) value); ibmphp_lock_operations(); - if (hotplug_slot && value) { + if (hotplug_slot) { pslot = hotplug_slot->private; if (pslot) { memcpy(&myslot, pslot, sizeof(struct slot)); @@ -315,7 +315,7 @@ static int get_latch_status(struct hotplug_slot *hotplug_slot, u8 * value) debug("get_latch_status - Entry hotplug_slot[%lx] pvalue[%lx]\n", (ulong) hotplug_slot, (ulong) value); ibmphp_lock_operations(); - if (hotplug_slot && value) { + if (hotplug_slot) { pslot = hotplug_slot->private; if (pslot) { memcpy(&myslot, pslot, sizeof(struct slot)); @@ -342,7 +342,7 @@ static int get_power_status(struct hotplug_slot *hotplug_slot, u8 * value) debug("get_power_status - Entry hotplug_slot[%lx] pvalue[%lx]\n", (ulong) hotplug_slot, (ulong) value); ibmphp_lock_operations(); - if (hotplug_slot && value) { + if (hotplug_slot) { pslot = hotplug_slot->private; if (pslot) { memcpy(&myslot, pslot, sizeof(struct slot)); @@ -369,7 +369,7 @@ static int get_adapter_present(struct hotplug_slot *hotplug_slot, u8 * value) debug("get_adapter_status - Entry hotplug_slot[%lx] pvalue[%lx]\n", (ulong) hotplug_slot, (ulong) value); ibmphp_lock_operations(); - if (hotplug_slot && value) { + if (hotplug_slot) { pslot = hotplug_slot->private; if (pslot) { memcpy(&myslot, pslot, sizeof(struct slot)); @@ -401,7 +401,7 @@ static int get_max_bus_speed(struct hotplug_slot *hotplug_slot, enum pci_bus_spe ibmphp_lock_operations(); - if (hotplug_slot && value) { + if (hotplug_slot) { pslot = hotplug_slot->private; if (pslot) { rc = 0; @@ -441,7 +441,7 @@ static int get_cur_bus_speed(struct hotplug_slot *hotplug_slot, enum pci_bus_spe ibmphp_lock_operations(); - if (hotplug_slot && value) { + if (hotplug_slot) { pslot = hotplug_slot->private; if (pslot) { rc = get_cur_bus_info(&pslot); diff --git a/drivers/pci/hotplug/pci_hotplug.h b/drivers/pci/hotplug/pci_hotplug.h index eb0d01d47..e929b7c11 100644 --- a/drivers/pci/hotplug/pci_hotplug.h +++ b/drivers/pci/hotplug/pci_hotplug.h @@ -176,11 +176,51 @@ extern int pci_hp_change_slot_info (struct hotplug_slot *slot, struct hotplug_slot_info *info); extern struct subsystem pci_hotplug_slots_subsys; +/* PCI Setting Record (Type 0) */ +struct hpp_type0 { + u32 revision; + u8 cache_line_size; + u8 latency_timer; + u8 enable_serr; + u8 enable_perr; +}; + +/* PCI-X Setting Record (Type 1) */ +struct hpp_type1 { + u32 revision; + u8 max_mem_read; + u8 avg_max_split; + u16 tot_max_split; +}; + +/* PCI Express Setting Record (Type 2) */ +struct hpp_type2 { + u32 revision; + u32 unc_err_mask_and; + u32 unc_err_mask_or; + u32 unc_err_sever_and; + u32 unc_err_sever_or; + u32 cor_err_mask_and; + u32 cor_err_mask_or; + u32 adv_err_cap_and; + u32 adv_err_cap_or; + u16 pci_exp_devctl_and; + u16 pci_exp_devctl_or; + u16 pci_exp_lnkctl_and; + u16 pci_exp_lnkctl_or; + u32 sec_unc_err_sever_and; + u32 sec_unc_err_sever_or; + u32 sec_unc_err_mask_and; + u32 sec_unc_err_mask_or; +}; + struct hotplug_params { - u8 cache_line_size; - u8 latency_timer; - u8 enable_serr; - u8 enable_perr; + struct hpp_type0 *t0; /* Type0: NULL if not available */ + struct hpp_type1 *t1; /* Type1: NULL if not available */ + struct hpp_type2 *t2; /* Type2: NULL if not available */ + struct hpp_type0 type0_data; + struct hpp_type1 type1_data; + struct hpp_type2 type2_data; }; #ifdef CONFIG_ACPI @@ -188,7 +228,7 @@ struct hotplug_params { #include #include extern acpi_status acpi_run_oshp(acpi_handle handle); -extern acpi_status acpi_get_hp_params_from_firmware(struct pci_dev *dev, +extern acpi_status acpi_get_hp_params_from_firmware(struct pci_bus *bus, struct hotplug_params *hpp); int acpi_root_bridge(acpi_handle handle); #endif diff --git a/drivers/pci/hotplug/pci_hotplug_core.c b/drivers/pci/hotplug/pci_hotplug_core.c index c4282902c..b7b378df8 100644 --- a/drivers/pci/hotplug/pci_hotplug_core.c +++ b/drivers/pci/hotplug/pci_hotplug_core.c @@ -27,7 +27,6 @@ * */ -#include #include #include #include diff --git a/drivers/pci/hotplug/pciehp.h b/drivers/pci/hotplug/pciehp.h index 92c1f0f1e..eaea9d36a 100644 --- a/drivers/pci/hotplug/pciehp.h +++ b/drivers/pci/hotplug/pciehp.h @@ -279,12 +279,17 @@ struct hpc_ops { #ifdef CONFIG_ACPI +#include +#include +#include +#include + #define pciehp_get_hp_hw_control_from_firmware(dev) \ pciehp_acpi_get_hp_hw_control_from_firmware(dev) static inline int pciehp_get_hp_params_from_firmware(struct pci_dev *dev, struct hotplug_params *hpp) { - if (ACPI_FAILURE(acpi_get_hp_params_from_firmware(dev, hpp))) + if (ACPI_FAILURE(acpi_get_hp_params_from_firmware(dev->bus, hpp))) return -ENODEV; return 0; } diff --git a/drivers/pci/hotplug/pciehp_core.c b/drivers/pci/hotplug/pciehp_core.c index 601cf9045..c67b7c3f1 100644 --- a/drivers/pci/hotplug/pciehp_core.c +++ b/drivers/pci/hotplug/pciehp_core.c @@ -69,6 +69,7 @@ static int get_power_status (struct hotplug_slot *slot, u8 *value); static int get_attention_status (struct hotplug_slot *slot, u8 *value); static int get_latch_status (struct hotplug_slot *slot, u8 *value); static int get_adapter_status (struct hotplug_slot *slot, u8 *value); +static int get_address (struct hotplug_slot *slot, u32 *value); static int get_max_bus_speed (struct hotplug_slot *slot, enum pci_bus_speed *value); static int get_cur_bus_speed (struct hotplug_slot *slot, enum pci_bus_speed *value); @@ -81,6 +82,7 @@ static struct hotplug_slot_ops pciehp_hotplug_slot_ops = { .get_attention_status = get_attention_status, .get_latch_status = get_latch_status, .get_adapter_status = get_adapter_status, + .get_address = get_address, .get_max_bus_speed = get_max_bus_speed, .get_cur_bus_speed = get_cur_bus_speed, }; @@ -331,6 +333,18 @@ static int get_adapter_status(struct hotplug_slot *hotplug_slot, u8 *value) return 0; } +static int get_address(struct hotplug_slot *hotplug_slot, u32 *value) +{ + struct slot *slot = hotplug_slot->private; + struct pci_bus *bus = slot->ctrl->pci_dev->subordinate; + + dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); + + *value = (pci_domain_nr(bus) << 16) | (slot->bus << 8) | slot->device; + + return 0; +} + static int get_max_bus_speed(struct hotplug_slot *hotplug_slot, enum pci_bus_speed *value) { struct slot *slot = hotplug_slot->private; diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c index 6c14d9e46..6ab3b6cd2 100644 --- a/drivers/pci/hotplug/pciehp_hpc.c +++ b/drivers/pci/hotplug/pciehp_hpc.c @@ -38,10 +38,6 @@ #include "../pci.h" #include "pciehp.h" -#include -#include -#include -#include #ifdef DEBUG #define DBG_K_TRACE_ENTRY ((unsigned int)0x00000001) /* On function entry */ #define DBG_K_TRACE_EXIT ((unsigned int)0x00000002) /* On function exit */ @@ -1288,7 +1284,7 @@ int pciehp_acpi_get_hp_hw_control_from_firmware(struct pci_dev *dev) if (ACPI_SUCCESS(status)) { dbg("Gained control for hotplug HW for pci %s (%s)\n", pci_name(dev), (char *)string.pointer); - acpi_os_free(string.pointer); + kfree(string.pointer); return 0; } if (acpi_root_bridge(handle)) @@ -1302,7 +1298,7 @@ int pciehp_acpi_get_hp_hw_control_from_firmware(struct pci_dev *dev) err("Cannot get control of hotplug hardware for pci %s\n", pci_name(dev)); - acpi_os_free(string.pointer); + kfree(string.pointer); return -1; } #endif @@ -1398,15 +1394,13 @@ int pcie_init(struct controller * ctrl, struct pcie_device *dev) for ( rc = 0; rc < DEVICE_COUNT_RESOURCE; rc++) if (pci_resource_len(pdev, rc) > 0) - dbg("pci resource[%d] start=0x%lx(len=0x%lx)\n", rc, - pci_resource_start(pdev, rc), pci_resource_len(pdev, rc)); + dbg("pci resource[%d] start=0x%llx(len=0x%llx)\n", rc, + (unsigned long long)pci_resource_start(pdev, rc), + (unsigned long long)pci_resource_len(pdev, rc)); info("HPC vendor_id %x device_id %x ss_vid %x ss_did %x\n", pdev->vendor, pdev->device, pdev->subsystem_vendor, pdev->subsystem_device); - if (pci_enable_device(pdev)) - goto abort_free_ctlr; - mutex_init(&ctrl->crit_sect); /* setup wait queue */ init_waitqueue_head(&ctrl->queue); @@ -1460,7 +1454,7 @@ int pcie_init(struct controller * ctrl, struct pcie_device *dev) start_int_poll_timer( php_ctlr, 10 ); /* start with 10 second delay */ } else { /* Installs the interrupt handler */ - rc = request_irq(php_ctlr->irq, pcie_isr, SA_SHIRQ, MY_NAME, (void *) ctrl); + rc = request_irq(php_ctlr->irq, pcie_isr, IRQF_SHARED, MY_NAME, (void *) ctrl); dbg("%s: request_irq %d for hpc%d (returns %d)\n", __FUNCTION__, php_ctlr->irq, ctlr_seq_num, rc); if (rc) { err("Can't get irq %d for the hotplug controller\n", php_ctlr->irq); @@ -1474,7 +1468,7 @@ int pcie_init(struct controller * ctrl, struct pcie_device *dev) rc = hp_register_read_word(pdev, SLOT_CTRL(ctrl->cap_base), temp_word); if (rc) { err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__); - goto abort_free_ctlr; + goto abort_free_irq; } intr_enable = intr_enable | PRSN_DETECT_ENABLE; @@ -1500,19 +1494,19 @@ int pcie_init(struct controller * ctrl, struct pcie_device *dev) rc = hp_register_write_word(pdev, SLOT_CTRL(ctrl->cap_base), temp_word); if (rc) { err("%s : hp_register_write_word SLOT_CTRL failed\n", __FUNCTION__); - goto abort_free_ctlr; + goto abort_free_irq; } rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS(ctrl->cap_base), slot_status); if (rc) { err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__); - goto abort_free_ctlr; + goto abort_disable_intr; } temp_word = 0x1F; /* Clear all events */ rc = hp_register_write_word(php_ctlr->pci_dev, SLOT_STATUS(ctrl->cap_base), temp_word); if (rc) { err("%s : hp_register_write_word SLOT_STATUS failed\n", __FUNCTION__); - goto abort_free_ctlr; + goto abort_disable_intr; } if (pciehp_force) { @@ -1521,7 +1515,7 @@ int pcie_init(struct controller * ctrl, struct pcie_device *dev) } else { rc = pciehp_get_hp_hw_control_from_firmware(ctrl->pci_dev); if (rc) - goto abort_free_ctlr; + goto abort_disable_intr; } /* Add this HPC instance into the HPC list */ @@ -1548,6 +1542,21 @@ int pcie_init(struct controller * ctrl, struct pcie_device *dev) return 0; /* We end up here for the many possible ways to fail this API. */ +abort_disable_intr: + rc = hp_register_read_word(pdev, SLOT_CTRL(ctrl->cap_base), temp_word); + if (!rc) { + temp_word &= ~(intr_enable | HP_INTR_ENABLE); + rc = hp_register_write_word(pdev, SLOT_CTRL(ctrl->cap_base), temp_word); + } + if (rc) + err("%s : disabling interrupts failed\n", __FUNCTION__); + +abort_free_irq: + if (pciehp_poll_mode) + del_timer_sync(&php_ctlr->int_poll_timer); + else + free_irq(php_ctlr->irq, ctrl); + abort_free_ctlr: pcie_cap_base = saved_cap_base; kfree(php_ctlr); diff --git a/drivers/pci/hotplug/pciehp_pci.c b/drivers/pci/hotplug/pciehp_pci.c index 4017fb03a..854aaea09 100644 --- a/drivers/pci/hotplug/pciehp_pci.c +++ b/drivers/pci/hotplug/pciehp_pci.c @@ -34,6 +34,144 @@ #include "../pci.h" #include "pciehp.h" +static void program_hpp_type0(struct pci_dev *dev, struct hpp_type0 *hpp) +{ + u16 pci_cmd, pci_bctl; + + if (hpp->revision > 1) { + printk(KERN_WARNING "%s: Rev.%d type0 record not supported\n", + __FUNCTION__, hpp->revision); + return; + } + + pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, hpp->cache_line_size); + pci_write_config_byte(dev, PCI_LATENCY_TIMER, hpp->latency_timer); + pci_read_config_word(dev, PCI_COMMAND, &pci_cmd); + if (hpp->enable_serr) + pci_cmd |= PCI_COMMAND_SERR; + else + pci_cmd &= ~PCI_COMMAND_SERR; + if (hpp->enable_perr) + pci_cmd |= PCI_COMMAND_PARITY; + else + pci_cmd &= ~PCI_COMMAND_PARITY; + pci_write_config_word(dev, PCI_COMMAND, pci_cmd); + + /* Program bridge control value */ + if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) { + pci_write_config_byte(dev, PCI_SEC_LATENCY_TIMER, + hpp->latency_timer); + pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &pci_bctl); + if (hpp->enable_serr) + pci_bctl |= PCI_BRIDGE_CTL_SERR; + else + pci_bctl &= ~PCI_BRIDGE_CTL_SERR; + if (hpp->enable_perr) + pci_bctl |= PCI_BRIDGE_CTL_PARITY; + else + pci_bctl &= ~PCI_BRIDGE_CTL_PARITY; + pci_write_config_word(dev, PCI_BRIDGE_CONTROL, pci_bctl); + } +} + +static void program_hpp_type2(struct pci_dev *dev, struct hpp_type2 *hpp) +{ + int pos; + u16 reg16; + u32 reg32; + + if (hpp->revision > 1) { + printk(KERN_WARNING "%s: Rev.%d type2 record not supported\n", + __FUNCTION__, hpp->revision); + return; + } + + /* Find PCI Express capability */ + pos = pci_find_capability(dev, PCI_CAP_ID_EXP); + if (!pos) + return; + + /* Initialize Device Control Register */ + pci_read_config_word(dev, pos + PCI_EXP_DEVCTL, ®16); + reg16 = (reg16 & hpp->pci_exp_devctl_and) | hpp->pci_exp_devctl_or; + pci_write_config_word(dev, pos + PCI_EXP_DEVCTL, reg16); + + /* Initialize Link Control Register */ + if (dev->subordinate) { + pci_read_config_word(dev, pos + PCI_EXP_LNKCTL, ®16); + reg16 = (reg16 & hpp->pci_exp_lnkctl_and) + | hpp->pci_exp_lnkctl_or; + pci_write_config_word(dev, pos + PCI_EXP_LNKCTL, reg16); + } + + /* Find Advanced Error Reporting Enhanced Capability */ + pos = 256; + do { + pci_read_config_dword(dev, pos, ®32); + if (PCI_EXT_CAP_ID(reg32) == PCI_EXT_CAP_ID_ERR) + break; + } while ((pos = PCI_EXT_CAP_NEXT(reg32))); + if (!pos) + return; + + /* Initialize Uncorrectable Error Mask Register */ + pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_MASK, ®32); + reg32 = (reg32 & hpp->unc_err_mask_and) | hpp->unc_err_mask_or; + pci_write_config_dword(dev, pos + PCI_ERR_UNCOR_MASK, reg32); + + /* Initialize Uncorrectable Error Severity Register */ + pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_SEVER, ®32); + reg32 = (reg32 & hpp->unc_err_sever_and) | hpp->unc_err_sever_or; + pci_write_config_dword(dev, pos + PCI_ERR_UNCOR_SEVER, reg32); + + /* Initialize Correctable Error Mask Register */ + pci_read_config_dword(dev, pos + PCI_ERR_COR_MASK, ®32); + reg32 = (reg32 & hpp->cor_err_mask_and) | hpp->cor_err_mask_or; + pci_write_config_dword(dev, pos + PCI_ERR_COR_MASK, reg32); + + /* Initialize Advanced Error Capabilities and Control Register */ + pci_read_config_dword(dev, pos + PCI_ERR_CAP, ®32); + reg32 = (reg32 & hpp->adv_err_cap_and) | hpp->adv_err_cap_or; + pci_write_config_dword(dev, pos + PCI_ERR_CAP, reg32); + + /* + * FIXME: The following two registers are not supported yet. + * + * o Secondary Uncorrectable Error Severity Register + * o Secondary Uncorrectable Error Mask Register + */ +} + +static void program_fw_provided_values(struct pci_dev *dev) +{ + struct pci_dev *cdev; + struct hotplug_params hpp; + + /* Program hpp values for this device */ + if (!(dev->hdr_type == PCI_HEADER_TYPE_NORMAL || + (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE && + (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI))) + return; + + if (pciehp_get_hp_params_from_firmware(dev, &hpp)) { + printk(KERN_WARNING "%s: Could not get hotplug parameters\n", + __FUNCTION__); + return; + } + + if (hpp.t2) + program_hpp_type2(dev, hpp.t2); + if (hpp.t0) + program_hpp_type0(dev, hpp.t0); + + /* Program child devices */ + if (dev->subordinate) { + list_for_each_entry(cdev, &dev->subordinate->devices, + bus_list) + program_fw_provided_values(cdev); + } +} + static int pciehp_add_bridge(struct pci_dev *dev) { struct pci_bus *parent = dev->bus; @@ -66,10 +204,11 @@ int pciehp_configure_device(struct slot *p_slot) struct pci_bus *parent = p_slot->ctrl->pci_dev->subordinate; int num, fn; - dev = pci_find_slot(p_slot->bus, PCI_DEVFN(p_slot->device, 0)); + dev = pci_get_slot(parent, PCI_DEVFN(p_slot->device, 0)); if (dev) { err("Device %s already exists at %x:%x, cannot hot-add\n", pci_name(dev), p_slot->bus, p_slot->device); + pci_dev_put(dev); return -EINVAL; } @@ -86,14 +225,15 @@ int pciehp_configure_device(struct slot *p_slot) if ((dev->class >> 16) == PCI_BASE_CLASS_DISPLAY) { err("Cannot hot-add display device %s\n", pci_name(dev)); + pci_dev_put(dev); continue; } if ((dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) || (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)) { pciehp_add_bridge(dev); } - /* TBD: program firmware provided _HPP values */ - /* program_fw_provided_values(dev); */ + program_fw_provided_values(dev); + pci_dev_put(dev); } pci_bus_assign_resources(parent); @@ -106,18 +246,20 @@ int pciehp_unconfigure_device(struct slot *p_slot) int rc = 0; int j; u8 bctl = 0; + struct pci_bus *parent = p_slot->ctrl->pci_dev->subordinate; dbg("%s: bus/dev = %x/%x\n", __FUNCTION__, p_slot->bus, p_slot->device); for (j=0; j<8 ; j++) { - struct pci_dev* temp = pci_find_slot(p_slot->bus, + struct pci_dev* temp = pci_get_slot(parent, (p_slot->device << 3) | j); if (!temp) continue; if ((temp->class >> 16) == PCI_BASE_CLASS_DISPLAY) { err("Cannot remove display device %s\n", pci_name(temp)); + pci_dev_put(temp); continue; } if (temp->hdr_type == PCI_HEADER_TYPE_BRIDGE) { @@ -125,10 +267,12 @@ int pciehp_unconfigure_device(struct slot *p_slot) if (bctl & PCI_BRIDGE_CTL_VGA) { err("Cannot remove display device %s\n", pci_name(temp)); + pci_dev_put(temp); continue; } } pci_remove_bus_device(temp); + pci_dev_put(temp); } /* * Some PCI Express root ports require fixup after hot-plug operation. diff --git a/drivers/pci/hotplug/pcihp_skeleton.c b/drivers/pci/hotplug/pcihp_skeleton.c index 0a46f5496..8ad446605 100644 --- a/drivers/pci/hotplug/pcihp_skeleton.c +++ b/drivers/pci/hotplug/pcihp_skeleton.c @@ -28,7 +28,6 @@ * */ -#include #include #include #include diff --git a/drivers/pci/hotplug/rpaphp_core.c b/drivers/pci/hotplug/rpaphp_core.c index 638004546..076bd6dca 100644 --- a/drivers/pci/hotplug/rpaphp_core.c +++ b/drivers/pci/hotplug/rpaphp_core.c @@ -22,7 +22,6 @@ * Send feedback to * */ -#include #include #include #include diff --git a/drivers/pci/hotplug/sgi_hotplug.c b/drivers/pci/hotplug/sgi_hotplug.c index 8cb9abde7..f31d83c2c 100644 --- a/drivers/pci/hotplug/sgi_hotplug.c +++ b/drivers/pci/hotplug/sgi_hotplug.c @@ -18,11 +18,13 @@ #include #include +#include #include #include #include #include #include +#include #include #include @@ -102,8 +104,7 @@ static struct hotplug_slot_attribute sn_slot_path_attr = __ATTR_RO(path); static int sn_pci_slot_valid(struct pci_bus *pci_bus, int device) { struct pcibus_info *pcibus_info; - int bricktype; - int bus_num; + u16 busnum, segment, ioboard_type; pcibus_info = SN_PCIBUS_BUSSOFT_INFO(pci_bus); @@ -111,12 +112,14 @@ static int sn_pci_slot_valid(struct pci_bus *pci_bus, int device) if (!(pcibus_info->pbi_valid_devices & (1 << device))) return -EPERM; - bricktype = MODULE_GET_BTYPE(pcibus_info->pbi_moduleid); - bus_num = pcibus_info->pbi_buscommon.bs_persist_busnum & 0xf; + ioboard_type = sn_ioboard_to_pci_bus(pci_bus); + busnum = pcibus_info->pbi_buscommon.bs_persist_busnum; + segment = pci_domain_nr(pci_bus) & 0xf; /* Do not allow hotplug operations on base I/O cards */ - if ((bricktype == L1_BRICKTYPE_IX || bricktype == L1_BRICKTYPE_IA) && - (bus_num == 1 && device != 1)) + if ((ioboard_type == L1_BRICKTYPE_IX || + ioboard_type == L1_BRICKTYPE_IA) && + (segment == 1 && busnum == 0 && device != 1)) return -EPERM; return 1; @@ -125,23 +128,23 @@ static int sn_pci_slot_valid(struct pci_bus *pci_bus, int device) static int sn_pci_bus_valid(struct pci_bus *pci_bus) { struct pcibus_info *pcibus_info; - int asic_type; - int bricktype; - - pcibus_info = SN_PCIBUS_BUSSOFT_INFO(pci_bus); + u32 asic_type; + u16 ioboard_type; /* Don't register slots hanging off the TIOCA bus */ + pcibus_info = SN_PCIBUS_BUSSOFT_INFO(pci_bus); asic_type = pcibus_info->pbi_buscommon.bs_asic_type; if (asic_type == PCIIO_ASIC_TYPE_TIOCA) return -EPERM; /* Only register slots in I/O Bricks that support hotplug */ - bricktype = MODULE_GET_BTYPE(pcibus_info->pbi_moduleid); - switch (bricktype) { + ioboard_type = sn_ioboard_to_pci_bus(pci_bus); + switch (ioboard_type) { case L1_BRICKTYPE_IX: case L1_BRICKTYPE_PX: case L1_BRICKTYPE_IA: case L1_BRICKTYPE_PA: + case L1_BOARDTYPE_PCIX3SLOT: return 1; break; default: @@ -175,14 +178,11 @@ static int sn_hp_slot_private_alloc(struct hotplug_slot *bss_hotplug_slot, slot->pci_bus = pci_bus; sprintf(bss_hotplug_slot->name, "%04x:%02x:%02x", pci_domain_nr(pci_bus), - ((int)pcibus_info->pbi_buscommon.bs_persist_busnum) & 0xf, + ((u16)pcibus_info->pbi_buscommon.bs_persist_busnum), device + 1); - sprintf(slot->physical_path, "module_%c%c%c%c%.2d", - '0'+RACK_GET_CLASS(MODULE_GET_RACK(pcibus_info->pbi_moduleid)), - '0'+RACK_GET_GROUP(MODULE_GET_RACK(pcibus_info->pbi_moduleid)), - '0'+RACK_GET_NUM(MODULE_GET_RACK(pcibus_info->pbi_moduleid)), - MODULE_GET_BTCHAR(pcibus_info->pbi_moduleid), - MODULE_GET_BPOS(pcibus_info->pbi_moduleid)); + + sn_generate_path(pci_bus, slot->physical_path); + slot->hotplug_slot = bss_hotplug_slot; list_add(&slot->hp_list, &sn_hp_list); @@ -461,10 +461,12 @@ static inline int get_power_status(struct hotplug_slot *bss_hotplug_slot, { struct slot *slot = bss_hotplug_slot->private; struct pcibus_info *pcibus_info; + u32 power; pcibus_info = SN_PCIBUS_BUSSOFT_INFO(slot->pci_bus); mutex_lock(&sn_hotplug_mutex); - *value = pcibus_info->pbi_enabled_devices & (1 << slot->device_num); + power = pcibus_info->pbi_enabled_devices & (1 << slot->device_num); + *value = power ? 1 : 0; mutex_unlock(&sn_hotplug_mutex); return 0; } @@ -553,8 +555,8 @@ static int sn_pci_hotplug_init(void) int rc; int registered = 0; - if (sn_sal_rev() < SGI_HOTPLUG_PROM_REV) { - printk(KERN_ERR "%s: PROM version must be greater than 4.30\n", + if (!sn_prom_feature_available(PRF_HOTPLUG_SUPPORT)) { + printk(KERN_ERR "%s: PROM version does not support hotplug.\n", __FUNCTION__); return -EPERM; } diff --git a/drivers/pci/hotplug/shpchp.h b/drivers/pci/hotplug/shpchp.h index 5c70f4390..7208b95c6 100644 --- a/drivers/pci/hotplug/shpchp.h +++ b/drivers/pci/hotplug/shpchp.h @@ -168,9 +168,9 @@ struct controller { * error Messages */ #define msg_initialization_err "Initialization failure, error=%d\n" -#define msg_button_on "PCI slot #%d - powering on due to button press.\n" -#define msg_button_off "PCI slot #%d - powering off due to button press.\n" -#define msg_button_cancel "PCI slot #%d - action canceled due to button press.\n" +#define msg_button_on "PCI slot #%s - powering on due to button press.\n" +#define msg_button_off "PCI slot #%s - powering off due to button press.\n" +#define msg_button_cancel "PCI slot #%s - action canceled due to button press.\n" /* sysfs functions for the hotplug controller info */ extern void shpchp_create_ctrl_files (struct controller *ctrl); @@ -196,7 +196,7 @@ extern void queue_pushbutton_work(void *data); static inline int get_hp_params_from_firmware(struct pci_dev *dev, struct hotplug_params *hpp) { - if (ACPI_FAILURE(acpi_get_hp_params_from_firmware(dev, hpp))) + if (ACPI_FAILURE(acpi_get_hp_params_from_firmware(dev->bus, hpp))) return -ENODEV; return 0; } diff --git a/drivers/pci/hotplug/shpchp_core.c b/drivers/pci/hotplug/shpchp_core.c index 3be4d492c..a14e7de19 100644 --- a/drivers/pci/hotplug/shpchp_core.c +++ b/drivers/pci/hotplug/shpchp_core.c @@ -491,16 +491,9 @@ static int __init shpcd_init(void) shpchp_poll_mode = 1; #endif - shpchp_wq = create_singlethread_workqueue("shpchpd"); - if (!shpchp_wq) - return -ENOMEM; - retval = pci_register_driver(&shpc_driver); dbg("%s: pci_register_driver = %d\n", __FUNCTION__, retval); info(DRIVER_DESC " version: " DRIVER_VERSION "\n"); - if (retval) { - destroy_workqueue(shpchp_wq); - } return retval; } @@ -508,7 +501,6 @@ static void __exit shpcd_cleanup(void) { dbg("unload_shpchpd()\n"); pci_unregister_driver(&shpc_driver); - destroy_workqueue(shpchp_wq); info(DRIVER_DESC " version: " DRIVER_VERSION " unloaded\n"); } diff --git a/drivers/pci/hotplug/shpchp_ctrl.c b/drivers/pci/hotplug/shpchp_ctrl.c index 4e6381481..c39901dbf 100644 --- a/drivers/pci/hotplug/shpchp_ctrl.c +++ b/drivers/pci/hotplug/shpchp_ctrl.c @@ -72,7 +72,7 @@ u8 shpchp_handle_attention_button(u8 hp_slot, void *inst_id) /* * Button pressed - See if need to TAKE ACTION!!! */ - info("Button pressed on Slot(%d)\n", ctrl->first_slot + hp_slot); + info("Button pressed on Slot(%s)\n", p_slot->name); event_type = INT_BUTTON_PRESS; queue_interrupt_event(p_slot, event_type); @@ -101,7 +101,7 @@ u8 shpchp_handle_switch_change(u8 hp_slot, void *inst_id) /* * Switch opened */ - info("Latch open on Slot(%d)\n", ctrl->first_slot + hp_slot); + info("Latch open on Slot(%s)\n", p_slot->name); event_type = INT_SWITCH_OPEN; if (p_slot->pwr_save && p_slot->presence_save) { event_type = INT_POWER_FAULT; @@ -111,7 +111,7 @@ u8 shpchp_handle_switch_change(u8 hp_slot, void *inst_id) /* * Switch closed */ - info("Latch close on Slot(%d)\n", ctrl->first_slot + hp_slot); + info("Latch close on Slot(%s)\n", p_slot->name); event_type = INT_SWITCH_CLOSE; } @@ -139,13 +139,13 @@ u8 shpchp_handle_presence_change(u8 hp_slot, void *inst_id) /* * Card Present */ - info("Card present on Slot(%d)\n", ctrl->first_slot + hp_slot); + info("Card present on Slot(%s)\n", p_slot->name); event_type = INT_PRESENCE_ON; } else { /* * Not Present */ - info("Card not present on Slot(%d)\n", ctrl->first_slot + hp_slot); + info("Card not present on Slot(%s)\n", p_slot->name); event_type = INT_PRESENCE_OFF; } @@ -169,14 +169,14 @@ u8 shpchp_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); + info("Power fault cleared on Slot(%s)\n", p_slot->name); p_slot->status = 0x00; event_type = INT_POWER_FAULT_CLEAR; } else { /* * Power fault */ - info("Power fault on Slot(%d)\n", ctrl->first_slot + hp_slot); + info("Power fault on Slot(%s)\n", p_slot->name); event_type = INT_POWER_FAULT; /* set power fault status for this board */ p_slot->status = 0xFF; @@ -496,10 +496,10 @@ static void handle_button_press_event(struct slot *p_slot) p_slot->hpc_ops->get_power_status(p_slot, &getstatus); if (getstatus) { p_slot->state = BLINKINGOFF_STATE; - info(msg_button_off, p_slot->number); + info(msg_button_off, p_slot->name); } else { p_slot->state = BLINKINGON_STATE; - info(msg_button_on, p_slot->number); + info(msg_button_on, p_slot->name); } /* blink green LED and turn off amber */ p_slot->hpc_ops->green_led_blink(p_slot); @@ -522,7 +522,7 @@ static void handle_button_press_event(struct slot *p_slot) else p_slot->hpc_ops->green_led_off(p_slot); p_slot->hpc_ops->set_attention_status(p_slot, 0); - info(msg_button_cancel, p_slot->number); + info(msg_button_cancel, p_slot->name); p_slot->state = STATIC_STATE; break; case POWEROFF_STATE: @@ -575,17 +575,17 @@ static int shpchp_enable_slot (struct slot *p_slot) mutex_lock(&p_slot->ctrl->crit_sect); rc = p_slot->hpc_ops->get_adapter_status(p_slot, &getstatus); if (rc || !getstatus) { - info("%s: no adapter on slot(%x)\n", __FUNCTION__, p_slot->number); + info("No adapter on slot(%s)\n", p_slot->name); goto out; } rc = p_slot->hpc_ops->get_latch_status(p_slot, &getstatus); if (rc || getstatus) { - info("%s: latch open on slot(%x)\n", __FUNCTION__, p_slot->number); + info("Latch open on slot(%s)\n", p_slot->name); goto out; } rc = p_slot->hpc_ops->get_power_status(p_slot, &getstatus); if (rc || getstatus) { - info("%s: already enabled on slot(%x)\n", __FUNCTION__, p_slot->number); + info("Already enabled on slot(%s)\n", p_slot->name); goto out; } @@ -634,17 +634,17 @@ static int shpchp_disable_slot (struct slot *p_slot) rc = p_slot->hpc_ops->get_adapter_status(p_slot, &getstatus); if (rc || !getstatus) { - info("%s: no adapter on slot(%x)\n", __FUNCTION__, p_slot->number); + info("No adapter on slot(%s)\n", p_slot->name); goto out; } rc = p_slot->hpc_ops->get_latch_status(p_slot, &getstatus); if (rc || getstatus) { - info("%s: latch open on slot(%x)\n", __FUNCTION__, p_slot->number); + info("Latch open on slot(%s)\n", p_slot->name); goto out; } rc = p_slot->hpc_ops->get_power_status(p_slot, &getstatus); if (rc || !getstatus) { - info("%s: already disabled slot(%x)\n", __FUNCTION__, p_slot->number); + info("Already disabled slot(%s)\n", p_slot->name); goto out; } diff --git a/drivers/pci/hotplug/shpchp_hpc.c b/drivers/pci/hotplug/shpchp_hpc.c index 66123cf4d..0f9798df4 100644 --- a/drivers/pci/hotplug/shpchp_hpc.c +++ b/drivers/pci/hotplug/shpchp_hpc.c @@ -90,77 +90,94 @@ #define MRLSENSOR 0x40000000 #define ATTN_BUTTON 0x80000000 -/* Slot Status Field Definitions */ -/* Slot State */ -#define PWR_ONLY 0x0001 -#define ENABLED 0x0002 -#define DISABLED 0x0003 - -/* Power Indicator State */ -#define PWR_LED_ON 0x0004 -#define PWR_LED_BLINK 0x0008 -#define PWR_LED_OFF 0x000c - -/* Attention Indicator State */ -#define ATTEN_LED_ON 0x0010 -#define ATTEN_LED_BLINK 0x0020 -#define ATTEN_LED_OFF 0x0030 - -/* Power Fault */ -#define pwr_fault 0x0040 - -/* Attention Button */ -#define ATTEN_BUTTON 0x0080 - -/* MRL Sensor */ -#define MRL_SENSOR 0x0100 - -/* 66 MHz Capable */ -#define IS_66MHZ_CAP 0x0200 - -/* PRSNT1#/PRSNT2# */ -#define SLOT_EMP 0x0c00 - -/* PCI-X Capability */ -#define NON_PCIX 0x0000 -#define PCIX_66 0x1000 -#define PCIX_133 0x3000 -#define PCIX_266 0x4000 /* For PI = 2 only */ -#define PCIX_533 0x5000 /* For PI = 2 only */ - -/* SHPC 'write' operations/commands */ - -/* Slot operation - 0x00h to 0x3Fh */ - -#define NO_CHANGE 0x00 - -/* Slot state - Bits 0 & 1 of controller command register */ -#define SET_SLOT_PWR 0x01 -#define SET_SLOT_ENABLE 0x02 -#define SET_SLOT_DISABLE 0x03 +/* + * Interrupt Locator Register definitions + */ +#define CMD_INTR_PENDING (1 << 0) +#define SLOT_INTR_PENDING(i) (1 << (i + 1)) -/* Power indicator state - Bits 2 & 3 of controller command register*/ -#define SET_PWR_ON 0x04 -#define SET_PWR_BLINK 0x08 -#define SET_PWR_OFF 0x0C +/* + * Controller SERR-INT Register + */ +#define GLOBAL_INTR_MASK (1 << 0) +#define GLOBAL_SERR_MASK (1 << 1) +#define COMMAND_INTR_MASK (1 << 2) +#define ARBITER_SERR_MASK (1 << 3) +#define COMMAND_DETECTED (1 << 16) +#define ARBITER_DETECTED (1 << 17) +#define SERR_INTR_RSVDZ_MASK 0xfffc0000 -/* Attention indicator state - Bits 4 & 5 of controller command register*/ -#define SET_ATTN_ON 0x010 -#define SET_ATTN_BLINK 0x020 -#define SET_ATTN_OFF 0x030 +/* + * Logical Slot Register definitions + */ +#define SLOT_REG(i) (SLOT1 + (4 * i)) + +#define SLOT_STATE_SHIFT (0) +#define SLOT_STATE_MASK (3 << 0) +#define SLOT_STATE_PWRONLY (1) +#define SLOT_STATE_ENABLED (2) +#define SLOT_STATE_DISABLED (3) +#define PWR_LED_STATE_SHIFT (2) +#define PWR_LED_STATE_MASK (3 << 2) +#define ATN_LED_STATE_SHIFT (4) +#define ATN_LED_STATE_MASK (3 << 4) +#define ATN_LED_STATE_ON (1) +#define ATN_LED_STATE_BLINK (2) +#define ATN_LED_STATE_OFF (3) +#define POWER_FAULT (1 << 6) +#define ATN_BUTTON (1 << 7) +#define MRL_SENSOR (1 << 8) +#define MHZ66_CAP (1 << 9) +#define PRSNT_SHIFT (10) +#define PRSNT_MASK (3 << 10) +#define PCIX_CAP_SHIFT (12) +#define PCIX_CAP_MASK_PI1 (3 << 12) +#define PCIX_CAP_MASK_PI2 (7 << 12) +#define PRSNT_CHANGE_DETECTED (1 << 16) +#define ISO_PFAULT_DETECTED (1 << 17) +#define BUTTON_PRESS_DETECTED (1 << 18) +#define MRL_CHANGE_DETECTED (1 << 19) +#define CON_PFAULT_DETECTED (1 << 20) +#define PRSNT_CHANGE_INTR_MASK (1 << 24) +#define ISO_PFAULT_INTR_MASK (1 << 25) +#define BUTTON_PRESS_INTR_MASK (1 << 26) +#define MRL_CHANGE_INTR_MASK (1 << 27) +#define CON_PFAULT_INTR_MASK (1 << 28) +#define MRL_CHANGE_SERR_MASK (1 << 29) +#define CON_PFAULT_SERR_MASK (1 << 30) +#define SLOT_REG_RSVDZ_MASK (1 << 15) | (7 << 21) -/* Set bus speed/mode A - 0x40h to 0x47h */ -#define SETA_PCI_33MHZ 0x40 +/* + * SHPC Command Code definitnions + * + * Slot Operation 00h - 3Fh + * Set Bus Segment Speed/Mode A 40h - 47h + * Power-Only All Slots 48h + * Enable All Slots 49h + * Set Bus Segment Speed/Mode B (PI=2) 50h - 5Fh + * Reserved Command Codes 60h - BFh + * Vendor Specific Commands C0h - FFh + */ +#define SET_SLOT_PWR 0x01 /* Slot Operation */ +#define SET_SLOT_ENABLE 0x02 +#define SET_SLOT_DISABLE 0x03 +#define SET_PWR_ON 0x04 +#define SET_PWR_BLINK 0x08 +#define SET_PWR_OFF 0x0c +#define SET_ATTN_ON 0x10 +#define SET_ATTN_BLINK 0x20 +#define SET_ATTN_OFF 0x30 +#define SETA_PCI_33MHZ 0x40 /* Set Bus Segment Speed/Mode A */ #define SETA_PCI_66MHZ 0x41 #define SETA_PCIX_66MHZ 0x42 #define SETA_PCIX_100MHZ 0x43 #define SETA_PCIX_133MHZ 0x44 -#define RESERV_1 0x45 -#define RESERV_2 0x46 -#define RESERV_3 0x47 - -/* Set bus speed/mode B - 0x50h to 0x5fh */ -#define SETB_PCI_33MHZ 0x50 +#define SETA_RESERVED1 0x45 +#define SETA_RESERVED2 0x46 +#define SETA_RESERVED3 0x47 +#define SET_PWR_ONLY_ALL 0x48 /* Power-Only All Slots */ +#define SET_ENABLE_ALL 0x49 /* Enable All Slots */ +#define SETB_PCI_33MHZ 0x50 /* Set Bus Segment Speed/Mode B */ #define SETB_PCI_66MHZ 0x51 #define SETB_PCIX_66MHZ_PM 0x52 #define SETB_PCIX_100MHZ_PM 0x53 @@ -174,81 +191,115 @@ #define SETB_PCIX_66MHZ_533 0x5b #define SETB_PCIX_100MHZ_533 0x5c #define SETB_PCIX_133MHZ_533 0x5d +#define SETB_RESERVED1 0x5e +#define SETB_RESERVED2 0x5f - -/* Power-on all slots - 0x48h */ -#define SET_PWR_ON_ALL 0x48 - -/* Enable all slots - 0x49h */ -#define SET_ENABLE_ALL 0x49 - -/* SHPC controller command error code */ +/* + * SHPC controller command error code + */ #define SWITCH_OPEN 0x1 #define INVALID_CMD 0x2 #define INVALID_SPEED_MODE 0x4 -/* For accessing SHPC Working Register Set */ +/* + * For accessing SHPC Working Register Set via PCI Configuration Space + */ #define DWORD_SELECT 0x2 #define DWORD_DATA 0x4 -#define BASE_OFFSET 0x0 /* Field Offset in Logical Slot Register - byte boundary */ #define SLOT_EVENT_LATCH 0x2 #define SLOT_SERR_INT_MASK 0x3 -static spinlock_t hpc_event_lock; - DEFINE_DBG_BUFFER /* Debug string buffer for entire HPC defined here */ static struct php_ctlr_state_s *php_ctlr_list_head; /* HPC state linked list */ static int ctlr_seq_num = 0; /* Controller sequenc # */ static spinlock_t list_lock; -static irqreturn_t shpc_isr(int IRQ, void *dev_id, struct pt_regs *regs); +static atomic_t shpchp_num_controllers = ATOMIC_INIT(0); -static void start_int_poll_timer(struct php_ctlr_state_s *php_ctlr, int seconds); +static irqreturn_t shpc_isr(int irq, void *dev_id, struct pt_regs *regs); +static void start_int_poll_timer(struct php_ctlr_state_s *php_ctlr, int sec); static int hpc_check_cmd_status(struct controller *ctrl); -/* This is the interrupt polling timeout function. */ -static void int_poll_timeout(unsigned long lphp_ctlr) +static inline u8 shpc_readb(struct controller *ctrl, int reg) { - struct php_ctlr_state_s *php_ctlr = (struct php_ctlr_state_s *)lphp_ctlr; + return readb(ctrl->hpc_ctlr_handle->creg + reg); +} - DBG_ENTER_ROUTINE +static inline void shpc_writeb(struct controller *ctrl, int reg, u8 val) +{ + writeb(val, ctrl->hpc_ctlr_handle->creg + reg); +} - if ( !php_ctlr ) { - err("%s: Invalid HPC controller handle!\n", __FUNCTION__); - return; - } +static inline u16 shpc_readw(struct controller *ctrl, int reg) +{ + return readw(ctrl->hpc_ctlr_handle->creg + reg); +} - /* Poll for interrupt events. regs == NULL => polling */ - shpc_isr( 0, (void *)php_ctlr, NULL ); +static inline void shpc_writew(struct controller *ctrl, int reg, u16 val) +{ + writew(val, ctrl->hpc_ctlr_handle->creg + reg); +} - init_timer(&php_ctlr->int_poll_timer); - if (!shpchp_poll_time) - shpchp_poll_time = 2; /* reset timer to poll in 2 secs if user doesn't specify at module installation*/ +static inline u32 shpc_readl(struct controller *ctrl, int reg) +{ + return readl(ctrl->hpc_ctlr_handle->creg + reg); +} - start_int_poll_timer(php_ctlr, shpchp_poll_time); - - return; +static inline void shpc_writel(struct controller *ctrl, int reg, u32 val) +{ + writel(val, ctrl->hpc_ctlr_handle->creg + reg); } -/* This function starts the interrupt polling timer. */ -static void start_int_poll_timer(struct php_ctlr_state_s *php_ctlr, int seconds) +static inline int shpc_indirect_read(struct controller *ctrl, int index, + u32 *value) { - if (!php_ctlr) { - err("%s: Invalid HPC controller handle!\n", __FUNCTION__); - return; - } + int rc; + u32 cap_offset = ctrl->cap_offset; + struct pci_dev *pdev = ctrl->pci_dev; + + rc = pci_write_config_byte(pdev, cap_offset + DWORD_SELECT, index); + if (rc) + return rc; + return pci_read_config_dword(pdev, cap_offset + DWORD_DATA, value); +} + +/* + * This is the interrupt polling timeout function. + */ +static void int_poll_timeout(unsigned long lphp_ctlr) +{ + struct php_ctlr_state_s *php_ctlr = + (struct php_ctlr_state_s *)lphp_ctlr; + + DBG_ENTER_ROUTINE + + /* Poll for interrupt events. regs == NULL => polling */ + shpc_isr(0, php_ctlr->callback_instance_id, NULL); + + init_timer(&php_ctlr->int_poll_timer); + if (!shpchp_poll_time) + shpchp_poll_time = 2; /* default polling interval is 2 sec */ - if ( ( seconds <= 0 ) || ( seconds > 60 ) ) - seconds = 2; /* Clamp to sane value */ + start_int_poll_timer(php_ctlr, shpchp_poll_time); - php_ctlr->int_poll_timer.function = &int_poll_timeout; - php_ctlr->int_poll_timer.data = (unsigned long)php_ctlr; /* Instance data */ - php_ctlr->int_poll_timer.expires = jiffies + seconds * HZ; - add_timer(&php_ctlr->int_poll_timer); + DBG_LEAVE_ROUTINE +} - return; +/* + * This function starts the interrupt polling timer. + */ +static void start_int_poll_timer(struct php_ctlr_state_s *php_ctlr, int sec) +{ + /* Clamp to sane value */ + if ((sec <= 0) || (sec > 60)) + sec = 2; + + php_ctlr->int_poll_timer.function = &int_poll_timeout; + php_ctlr->int_poll_timer.data = (unsigned long)php_ctlr; + php_ctlr->int_poll_timer.expires = jiffies + sec * HZ; + add_timer(&php_ctlr->int_poll_timer); } static inline int shpc_wait_cmd(struct controller *ctrl) @@ -272,7 +323,7 @@ static inline int shpc_wait_cmd(struct controller *ctrl) static int shpc_write_cmd(struct slot *slot, u8 t_slot, u8 cmd) { - struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; + struct controller *ctrl = slot->ctrl; u16 cmd_status; int retval = 0; u16 temp_word; @@ -282,14 +333,8 @@ static int shpc_write_cmd(struct slot *slot, u8 t_slot, u8 cmd) mutex_lock(&slot->ctrl->cmd_lock); - if (!php_ctlr) { - err("%s: Invalid HPC controller handle!\n", __FUNCTION__); - retval = -EINVAL; - goto out; - } - for (i = 0; i < 10; i++) { - cmd_status = readw(php_ctlr->creg + CMD_STATUS); + cmd_status = shpc_readw(ctrl, CMD_STATUS); if (!(cmd_status & 0x1)) break; @@ -297,7 +342,7 @@ static int shpc_write_cmd(struct slot *slot, u8 t_slot, u8 cmd) msleep(100); } - cmd_status = readw(php_ctlr->creg + CMD_STATUS); + cmd_status = shpc_readw(ctrl, CMD_STATUS); if (cmd_status & 0x1) { /* After 1 sec and and the controller is still busy */ @@ -314,7 +359,7 @@ static int shpc_write_cmd(struct slot *slot, u8 t_slot, u8 cmd) * command. */ slot->ctrl->cmd_busy = 1; - writew(temp_word, php_ctlr->creg + CMD); + shpc_writew(ctrl, CMD, temp_word); /* * Wait for command completion. @@ -338,18 +383,12 @@ static int shpc_write_cmd(struct slot *slot, u8 t_slot, u8 cmd) static int hpc_check_cmd_status(struct controller *ctrl) { - struct php_ctlr_state_s *php_ctlr = ctrl->hpc_ctlr_handle; u16 cmd_status; int retval = 0; DBG_ENTER_ROUTINE - - if (!ctrl->hpc_ctlr_handle) { - err("%s: Invalid HPC controller handle!\n", __FUNCTION__); - return -1; - } - cmd_status = readw(php_ctlr->creg + CMD_STATUS) & 0x000F; + cmd_status = shpc_readw(ctrl, CMD_STATUS) & 0x000F; switch (cmd_status >> 1) { case 0: @@ -378,37 +417,27 @@ static int hpc_check_cmd_status(struct controller *ctrl) static int hpc_get_attention_status(struct slot *slot, u8 *status) { - struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; + struct controller *ctrl = slot->ctrl; u32 slot_reg; - u16 slot_status; - u8 atten_led_state; + u8 state; DBG_ENTER_ROUTINE - if (!slot->ctrl->hpc_ctlr_handle) { - err("%s: Invalid HPC controller handle!\n", __FUNCTION__); - return -1; - } - - slot_reg = readl(php_ctlr->creg + SLOT1 + 4*(slot->hp_slot)); - slot_status = (u16) slot_reg; - atten_led_state = (slot_status & 0x0030) >> 4; + slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot)); + state = (slot_reg & ATN_LED_STATE_MASK) >> ATN_LED_STATE_SHIFT; - switch (atten_led_state) { - case 0: - *status = 0xFF; /* Reserved */ - break; - case 1: + switch (state) { + case ATN_LED_STATE_ON: *status = 1; /* On */ break; - case 2: + case ATN_LED_STATE_BLINK: *status = 2; /* Blink */ break; - case 3: + case ATN_LED_STATE_OFF: *status = 0; /* Off */ break; default: - *status = 0xFF; + *status = 0xFF; /* Reserved */ break; } @@ -418,64 +447,44 @@ static int hpc_get_attention_status(struct slot *slot, u8 *status) static int hpc_get_power_status(struct slot * slot, u8 *status) { - struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; + struct controller *ctrl = slot->ctrl; u32 slot_reg; - u16 slot_status; - u8 slot_state; - int retval = 0; + u8 state; DBG_ENTER_ROUTINE - if (!slot->ctrl->hpc_ctlr_handle) { - err("%s: Invalid HPC controller handle!\n", __FUNCTION__); - return -1; - } - - slot_reg = readl(php_ctlr->creg + SLOT1 + 4*(slot->hp_slot)); - slot_status = (u16) slot_reg; - slot_state = (slot_status & 0x0003); + slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot)); + state = (slot_reg & SLOT_STATE_MASK) >> SLOT_STATE_SHIFT; - switch (slot_state) { - case 0: - *status = 0xFF; - break; - case 1: + switch (state) { + case SLOT_STATE_PWRONLY: *status = 2; /* Powered only */ break; - case 2: + case SLOT_STATE_ENABLED: *status = 1; /* Enabled */ break; - case 3: + case SLOT_STATE_DISABLED: *status = 0; /* Disabled */ break; default: - *status = 0xFF; + *status = 0xFF; /* Reserved */ break; } DBG_LEAVE_ROUTINE - return retval; + return 0; } static int hpc_get_latch_status(struct slot *slot, u8 *status) { - struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; + struct controller *ctrl = slot->ctrl; u32 slot_reg; - u16 slot_status; DBG_ENTER_ROUTINE - if (!slot->ctrl->hpc_ctlr_handle) { - err("%s: Invalid HPC controller handle!\n", __FUNCTION__); - return -1; - } - - slot_reg = readl(php_ctlr->creg + SLOT1 + 4*(slot->hp_slot)); - slot_status = (u16)slot_reg; - - *status = ((slot_status & 0x0100) == 0) ? 0 : 1; /* 0 -> close; 1 -> open */ - + slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot)); + *status = !!(slot_reg & MRL_SENSOR); /* 0 -> close; 1 -> open */ DBG_LEAVE_ROUTINE return 0; @@ -483,22 +492,15 @@ static int hpc_get_latch_status(struct slot *slot, u8 *status) static int hpc_get_adapter_status(struct slot *slot, u8 *status) { - struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; + struct controller *ctrl = slot->ctrl; u32 slot_reg; - u16 slot_status; - u8 card_state; + u8 state; DBG_ENTER_ROUTINE - if (!slot->ctrl->hpc_ctlr_handle) { - err("%s: Invalid HPC controller handle!\n", __FUNCTION__); - return -1; - } - - slot_reg = readl(php_ctlr->creg + SLOT1 + 4*(slot->hp_slot)); - slot_status = (u16)slot_reg; - card_state = (u8)((slot_status & 0x0C00) >> 10); - *status = (card_state != 0x3) ? 1 : 0; + slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot)); + state = (slot_reg & PRSNT_MASK) >> PRSNT_SHIFT; + *status = (state != 0x3) ? 1 : 0; DBG_LEAVE_ROUTINE return 0; @@ -506,16 +508,11 @@ static int hpc_get_adapter_status(struct slot *slot, u8 *status) static int hpc_get_prog_int(struct slot *slot, u8 *prog_int) { - struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; + struct controller *ctrl = slot->ctrl; DBG_ENTER_ROUTINE - - if (!slot->ctrl->hpc_ctlr_handle) { - err("%s: Invalid HPC controller handle!\n", __FUNCTION__); - return -1; - } - *prog_int = readb(php_ctlr->creg + PROG_INTERFACE); + *prog_int = shpc_readb(ctrl, PROG_INTERFACE); DBG_LEAVE_ROUTINE return 0; @@ -524,13 +521,27 @@ static int hpc_get_prog_int(struct slot *slot, u8 *prog_int) static int hpc_get_adapter_speed(struct slot *slot, enum pci_bus_speed *value) { int retval = 0; - struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; - u32 slot_reg = readl(php_ctlr->creg + SLOT1 + 4 * slot->hp_slot); - u8 pcix_cap = (slot_reg >> 12) & 7; - u8 m66_cap = (slot_reg >> 9) & 1; + struct controller *ctrl = slot->ctrl; + u32 slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot)); + u8 m66_cap = !!(slot_reg & MHZ66_CAP); + u8 pi, pcix_cap; DBG_ENTER_ROUTINE + if ((retval = hpc_get_prog_int(slot, &pi))) + return retval; + + switch (pi) { + case 1: + pcix_cap = (slot_reg & PCIX_CAP_MASK_PI1) >> PCIX_CAP_SHIFT; + break; + case 2: + pcix_cap = (slot_reg & PCIX_CAP_MASK_PI2) >> PCIX_CAP_SHIFT; + break; + default: + return -ENODEV; + } + dbg("%s: slot_reg = %x, pcix_cap = %x, m66_cap = %x\n", __FUNCTION__, slot_reg, pcix_cap, m66_cap); @@ -564,20 +575,15 @@ static int hpc_get_adapter_speed(struct slot *slot, enum pci_bus_speed *value) static int hpc_get_mode1_ECC_cap(struct slot *slot, u8 *mode) { - struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; + struct controller *ctrl = slot->ctrl; u16 sec_bus_status; u8 pi; int retval = 0; DBG_ENTER_ROUTINE - if (!slot->ctrl->hpc_ctlr_handle) { - err("%s: Invalid HPC controller handle!\n", __FUNCTION__); - return -1; - } - - pi = readb(php_ctlr->creg + PROG_INTERFACE); - sec_bus_status = readw(php_ctlr->creg + SEC_BUS_CONFIG); + pi = shpc_readb(ctrl, PROG_INTERFACE); + sec_bus_status = shpc_readw(ctrl, SEC_BUS_CONFIG); if (pi == 2) { *mode = (sec_bus_status & 0x0100) >> 8; @@ -593,128 +599,53 @@ static int hpc_get_mode1_ECC_cap(struct slot *slot, u8 *mode) static int hpc_query_power_fault(struct slot * slot) { - struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; + struct controller *ctrl = slot->ctrl; u32 slot_reg; - u16 slot_status; - u8 pwr_fault_state, status; DBG_ENTER_ROUTINE - if (!slot->ctrl->hpc_ctlr_handle) { - err("%s: Invalid HPC controller handle!\n", __FUNCTION__); - return -1; - } - - slot_reg = readl(php_ctlr->creg + SLOT1 + 4*(slot->hp_slot)); - slot_status = (u16) slot_reg; - pwr_fault_state = (slot_status & 0x0040) >> 7; - status = (pwr_fault_state == 1) ? 0 : 1; + slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot)); DBG_LEAVE_ROUTINE /* Note: Logic 0 => fault */ - return status; + return !(slot_reg & POWER_FAULT); } static int hpc_set_attention_status(struct slot *slot, u8 value) { - struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; u8 slot_cmd = 0; - int rc = 0; - - if (!slot->ctrl->hpc_ctlr_handle) { - err("%s: Invalid HPC controller handle!\n", __FUNCTION__); - return -1; - } - - if (slot->hp_slot >= php_ctlr->num_slots) { - err("%s: Invalid HPC slot number!\n", __FUNCTION__); - return -1; - } switch (value) { case 0 : - slot_cmd = 0x30; /* OFF */ + slot_cmd = SET_ATTN_OFF; /* OFF */ break; case 1: - slot_cmd = 0x10; /* ON */ + slot_cmd = SET_ATTN_ON; /* ON */ break; case 2: - slot_cmd = 0x20; /* BLINK */ + slot_cmd = SET_ATTN_BLINK; /* BLINK */ break; default: return -1; } - shpc_write_cmd(slot, slot->hp_slot, slot_cmd); - - return rc; + return shpc_write_cmd(slot, slot->hp_slot, slot_cmd); } static void hpc_set_green_led_on(struct slot *slot) { - struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; - u8 slot_cmd; - - if (!slot->ctrl->hpc_ctlr_handle) { - err("%s: Invalid HPC controller handle!\n", __FUNCTION__); - return ; - } - - if (slot->hp_slot >= php_ctlr->num_slots) { - err("%s: Invalid HPC slot number!\n", __FUNCTION__); - return ; - } - - slot_cmd = 0x04; - - shpc_write_cmd(slot, slot->hp_slot, slot_cmd); - - return; + shpc_write_cmd(slot, slot->hp_slot, SET_PWR_ON); } static void hpc_set_green_led_off(struct slot *slot) { - struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; - u8 slot_cmd; - - if (!slot->ctrl->hpc_ctlr_handle) { - err("%s: Invalid HPC controller handle!\n", __FUNCTION__); - return ; - } - - if (slot->hp_slot >= php_ctlr->num_slots) { - err("%s: Invalid HPC slot number!\n", __FUNCTION__); - return ; - } - - slot_cmd = 0x0C; - - shpc_write_cmd(slot, slot->hp_slot, slot_cmd); - - return; + shpc_write_cmd(slot, slot->hp_slot, SET_PWR_OFF); } static void hpc_set_green_led_blink(struct slot *slot) { - struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; - u8 slot_cmd; - - if (!slot->ctrl->hpc_ctlr_handle) { - err("%s: Invalid HPC controller handle!\n", __FUNCTION__); - return ; - } - - if (slot->hp_slot >= php_ctlr->num_slots) { - err("%s: Invalid HPC slot number!\n", __FUNCTION__); - return ; - } - - slot_cmd = 0x08; - - shpc_write_cmd(slot, slot->hp_slot, slot_cmd); - - return; + shpc_write_cmd(slot, slot->hp_slot, SET_PWR_BLINK); } int shpc_get_ctlr_slot_config(struct controller *ctrl, @@ -724,21 +655,17 @@ int shpc_get_ctlr_slot_config(struct controller *ctrl, int *updown, /* physical_slot_num increament: 1 or -1 */ int *flags) { - struct php_ctlr_state_s *php_ctlr = ctrl->hpc_ctlr_handle; + u32 slot_config; DBG_ENTER_ROUTINE - if (!ctrl->hpc_ctlr_handle) { - err("%s: Invalid HPC controller handle!\n", __FUNCTION__); - return -1; - } - - *first_device_num = php_ctlr->slot_device_offset; /* Obtained in shpc_init() */ - *num_ctlr_slots = php_ctlr->num_slots; /* Obtained in shpc_init() */ + slot_config = shpc_readl(ctrl, SLOT_CONFIG); + *first_device_num = (slot_config & FIRST_DEV_NUM) >> 8; + *num_ctlr_slots = slot_config & SLOT_NUM; + *physical_slot_num = (slot_config & PSN) >> 16; + *updown = ((slot_config & UPDOWN) >> 29) ? 1 : -1; - *physical_slot_num = (readl(php_ctlr->creg + SLOT_CONFIG) & PSN) >> 16; dbg("%s: physical_slot_num = %x\n", __FUNCTION__, *physical_slot_num); - *updown = ((readl(php_ctlr->creg + SLOT_CONFIG) & UPDOWN ) >> 29) ? 1 : -1; DBG_LEAVE_ROUTINE return 0; @@ -749,22 +676,34 @@ static void hpc_release_ctlr(struct controller *ctrl) struct php_ctlr_state_s *php_ctlr = ctrl->hpc_ctlr_handle; struct php_ctlr_state_s *p, *p_prev; int i; + u32 slot_reg, serr_int; DBG_ENTER_ROUTINE - if (!ctrl->hpc_ctlr_handle) { - err("%s: Invalid HPC controller handle!\n", __FUNCTION__); - return ; - } - /* - * Mask all slot event interrupts + * Mask event interrupts and SERRs of all slots */ - for (i = 0; i < ctrl->num_slots; i++) - writel(0xffff3fff, php_ctlr->creg + SLOT1 + (4 * i)); + for (i = 0; i < ctrl->num_slots; i++) { + slot_reg = shpc_readl(ctrl, SLOT_REG(i)); + slot_reg |= (PRSNT_CHANGE_INTR_MASK | ISO_PFAULT_INTR_MASK | + BUTTON_PRESS_INTR_MASK | MRL_CHANGE_INTR_MASK | + CON_PFAULT_INTR_MASK | MRL_CHANGE_SERR_MASK | + CON_PFAULT_SERR_MASK); + slot_reg &= ~SLOT_REG_RSVDZ_MASK; + shpc_writel(ctrl, SLOT_REG(i), slot_reg); + } cleanup_slots(ctrl); + /* + * Mask SERR and System Interrut generation + */ + serr_int = shpc_readl(ctrl, SERR_INTR_ENABLE); + serr_int |= (GLOBAL_INTR_MASK | GLOBAL_SERR_MASK | + COMMAND_INTR_MASK | ARBITER_SERR_MASK); + serr_int &= ~SERR_INTR_RSVDZ_MASK; + shpc_writel(ctrl, SERR_INTR_ENABLE, serr_int); + if (shpchp_poll_mode) { del_timer(&php_ctlr->int_poll_timer); } else { @@ -800,113 +739,79 @@ static void hpc_release_ctlr(struct controller *ctrl) kfree(php_ctlr); + /* + * If this is the last controller to be released, destroy the + * shpchpd work queue + */ + if (atomic_dec_and_test(&shpchp_num_controllers)) + destroy_workqueue(shpchp_wq); + DBG_LEAVE_ROUTINE } static int hpc_power_on_slot(struct slot * slot) { - struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; - u8 slot_cmd; - int retval = 0; + int retval; DBG_ENTER_ROUTINE - if (!slot->ctrl->hpc_ctlr_handle) { - err("%s: Invalid HPC controller handle!\n", __FUNCTION__); - return -1; - } - - if (slot->hp_slot >= php_ctlr->num_slots) { - err("%s: Invalid HPC slot number!\n", __FUNCTION__); - return -1; - } - slot_cmd = 0x01; - - retval = shpc_write_cmd(slot, slot->hp_slot, slot_cmd); - + retval = shpc_write_cmd(slot, slot->hp_slot, SET_SLOT_PWR); if (retval) { err("%s: Write command failed!\n", __FUNCTION__); - return -1; + return retval; } DBG_LEAVE_ROUTINE - return retval; + return 0; } static int hpc_slot_enable(struct slot * slot) { - struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; - u8 slot_cmd; - int retval = 0; + int retval; DBG_ENTER_ROUTINE - if (!slot->ctrl->hpc_ctlr_handle) { - err("%s: Invalid HPC controller handle!\n", __FUNCTION__); - return -1; - } - - if (slot->hp_slot >= php_ctlr->num_slots) { - err("%s: Invalid HPC slot number!\n", __FUNCTION__); - return -1; - } - /* 3A => Slot - Enable, Power Indicator - Blink, Attention Indicator - Off */ - slot_cmd = 0x3A; - - retval = shpc_write_cmd(slot, slot->hp_slot, slot_cmd); - + /* Slot - Enable, Power Indicator - Blink, Attention Indicator - Off */ + retval = shpc_write_cmd(slot, slot->hp_slot, + SET_SLOT_ENABLE | SET_PWR_BLINK | SET_ATTN_OFF); if (retval) { err("%s: Write command failed!\n", __FUNCTION__); - return -1; + return retval; } DBG_LEAVE_ROUTINE - return retval; + return 0; } static int hpc_slot_disable(struct slot * slot) { - struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; - u8 slot_cmd; - int retval = 0; + int retval; DBG_ENTER_ROUTINE - if (!slot->ctrl->hpc_ctlr_handle) { - err("%s: Invalid HPC controller handle!\n", __FUNCTION__); - return -1; - } - - if (slot->hp_slot >= php_ctlr->num_slots) { - err("%s: Invalid HPC slot number!\n", __FUNCTION__); - return -1; - } - - /* 1F => Slot - Disable, Power Indicator - Off, Attention Indicator - On */ - slot_cmd = 0x1F; - - retval = shpc_write_cmd(slot, slot->hp_slot, slot_cmd); - + /* Slot - Disable, Power Indicator - Off, Attention Indicator - On */ + retval = shpc_write_cmd(slot, slot->hp_slot, + SET_SLOT_DISABLE | SET_PWR_OFF | SET_ATTN_ON); if (retval) { err("%s: Write command failed!\n", __FUNCTION__); - return -1; + return retval; } DBG_LEAVE_ROUTINE - return retval; + return 0; } static int hpc_set_bus_speed_mode(struct slot * slot, enum pci_bus_speed value) { int retval; - struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; + struct controller *ctrl = slot->ctrl; u8 pi, cmd; DBG_ENTER_ROUTINE - pi = readb(php_ctlr->creg + PROG_INTERFACE); + pi = shpc_readb(ctrl, PROG_INTERFACE); if ((pi == 1) && (value > PCI_SPEED_133MHz_PCIX)) return -EINVAL; @@ -965,100 +870,86 @@ static int hpc_set_bus_speed_mode(struct slot * slot, enum pci_bus_speed value) return retval; } -static irqreturn_t shpc_isr(int IRQ, void *dev_id, struct pt_regs *regs) +static irqreturn_t shpc_isr(int irq, void *dev_id, struct pt_regs *regs) { - struct controller *ctrl = NULL; - struct php_ctlr_state_s *php_ctlr; - u8 schedule_flag = 0; - u8 temp_byte; - u32 temp_dword, intr_loc, intr_loc2; + struct controller *ctrl = (struct controller *)dev_id; + struct php_ctlr_state_s *php_ctlr = ctrl->hpc_ctlr_handle; + u32 serr_int, slot_reg, intr_loc, intr_loc2; int hp_slot; - if (!dev_id) - return IRQ_NONE; - - if (!shpchp_poll_mode) { - ctrl = (struct controller *)dev_id; - php_ctlr = ctrl->hpc_ctlr_handle; - } else { - php_ctlr = (struct php_ctlr_state_s *) dev_id; - ctrl = (struct controller *)php_ctlr->callback_instance_id; - } - - if (!ctrl) - return IRQ_NONE; - - if (!php_ctlr || !php_ctlr->creg) - return IRQ_NONE; - /* Check to see if it was our interrupt */ - intr_loc = readl(php_ctlr->creg + INTR_LOC); - + intr_loc = shpc_readl(ctrl, INTR_LOC); if (!intr_loc) return IRQ_NONE; + dbg("%s: intr_loc = %x\n",__FUNCTION__, intr_loc); if(!shpchp_poll_mode) { - /* Mask Global Interrupt Mask - see implementation note on p. 139 */ - /* of SHPC spec rev 1.0*/ - temp_dword = readl(php_ctlr->creg + SERR_INTR_ENABLE); - temp_dword |= 0x00000001; - writel(temp_dword, php_ctlr->creg + SERR_INTR_ENABLE); + /* + * Mask Global Interrupt Mask - see implementation + * note on p. 139 of SHPC spec rev 1.0 + */ + serr_int = shpc_readl(ctrl, SERR_INTR_ENABLE); + serr_int |= GLOBAL_INTR_MASK; + serr_int &= ~SERR_INTR_RSVDZ_MASK; + shpc_writel(ctrl, SERR_INTR_ENABLE, serr_int); - intr_loc2 = readl(php_ctlr->creg + INTR_LOC); + intr_loc2 = shpc_readl(ctrl, INTR_LOC); dbg("%s: intr_loc2 = %x\n",__FUNCTION__, intr_loc2); } - if (intr_loc & 0x0001) { + if (intr_loc & CMD_INTR_PENDING) { /* * Command Complete Interrupt Pending * RO only - clear by writing 1 to the Command Completion * Detect bit in Controller SERR-INT register */ - temp_dword = readl(php_ctlr->creg + SERR_INTR_ENABLE); - temp_dword &= 0xfffdffff; - writel(temp_dword, php_ctlr->creg + SERR_INTR_ENABLE); + serr_int = shpc_readl(ctrl, SERR_INTR_ENABLE); + serr_int &= ~SERR_INTR_RSVDZ_MASK; + shpc_writel(ctrl, SERR_INTR_ENABLE, serr_int); + ctrl->cmd_busy = 0; wake_up_interruptible(&ctrl->queue); } - if ((intr_loc = (intr_loc >> 1)) == 0) + if (!(intr_loc & ~CMD_INTR_PENDING)) goto out; for (hp_slot = 0; hp_slot < ctrl->num_slots; hp_slot++) { - /* To find out which slot has interrupt pending */ - if ((intr_loc >> hp_slot) & 0x01) { - temp_dword = readl(php_ctlr->creg + SLOT1 + (4*hp_slot)); - dbg("%s: Slot %x with intr, slot register = %x\n", - __FUNCTION__, hp_slot, temp_dword); - temp_byte = (temp_dword >> 16) & 0xFF; - if ((php_ctlr->switch_change_callback) && (temp_byte & 0x08)) - schedule_flag += php_ctlr->switch_change_callback( - hp_slot, php_ctlr->callback_instance_id); - if ((php_ctlr->attention_button_callback) && (temp_byte & 0x04)) - schedule_flag += php_ctlr->attention_button_callback( - hp_slot, php_ctlr->callback_instance_id); - if ((php_ctlr->presence_change_callback) && (temp_byte & 0x01)) - schedule_flag += php_ctlr->presence_change_callback( - hp_slot , php_ctlr->callback_instance_id); - if ((php_ctlr->power_fault_callback) && (temp_byte & 0x12)) - schedule_flag += php_ctlr->power_fault_callback( - hp_slot, php_ctlr->callback_instance_id); - - /* Clear all slot events */ - temp_dword = 0xe01f3fff; - writel(temp_dword, php_ctlr->creg + SLOT1 + (4*hp_slot)); - - intr_loc2 = readl(php_ctlr->creg + INTR_LOC); - dbg("%s: intr_loc2 = %x\n",__FUNCTION__, intr_loc2); - } + /* To find out which slot has interrupt pending */ + if (!(intr_loc & SLOT_INTR_PENDING(hp_slot))) + continue; + + slot_reg = shpc_readl(ctrl, SLOT_REG(hp_slot)); + dbg("%s: Slot %x with intr, slot register = %x\n", + __FUNCTION__, hp_slot, slot_reg); + + if (slot_reg & MRL_CHANGE_DETECTED) + php_ctlr->switch_change_callback( + hp_slot, php_ctlr->callback_instance_id); + + if (slot_reg & BUTTON_PRESS_DETECTED) + php_ctlr->attention_button_callback( + hp_slot, php_ctlr->callback_instance_id); + + if (slot_reg & PRSNT_CHANGE_DETECTED) + php_ctlr->presence_change_callback( + hp_slot , php_ctlr->callback_instance_id); + + if (slot_reg & (ISO_PFAULT_DETECTED | CON_PFAULT_DETECTED)) + php_ctlr->power_fault_callback( + hp_slot, php_ctlr->callback_instance_id); + + /* Clear all slot events */ + slot_reg &= ~SLOT_REG_RSVDZ_MASK; + shpc_writel(ctrl, SLOT_REG(hp_slot), slot_reg); } out: if (!shpchp_poll_mode) { /* Unmask Global Interrupt Mask */ - temp_dword = readl(php_ctlr->creg + SERR_INTR_ENABLE); - temp_dword &= 0xfffffffe; - writel(temp_dword, php_ctlr->creg + SERR_INTR_ENABLE); + serr_int = shpc_readl(ctrl, SERR_INTR_ENABLE); + serr_int &= ~(GLOBAL_INTR_MASK | SERR_INTR_RSVDZ_MASK); + shpc_writel(ctrl, SERR_INTR_ENABLE, serr_int); } return IRQ_HANDLED; @@ -1067,11 +958,11 @@ static irqreturn_t shpc_isr(int IRQ, void *dev_id, struct pt_regs *regs) static int hpc_get_max_bus_speed (struct slot *slot, enum pci_bus_speed *value) { int retval = 0; - struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; + struct controller *ctrl = slot->ctrl; enum pci_bus_speed bus_speed = PCI_SPEED_UNKNOWN; - u8 pi = readb(php_ctlr->creg + PROG_INTERFACE); - u32 slot_avail1 = readl(php_ctlr->creg + SLOT_AVAIL1); - u32 slot_avail2 = readl(php_ctlr->creg + SLOT_AVAIL2); + u8 pi = shpc_readb(ctrl, PROG_INTERFACE); + u32 slot_avail1 = shpc_readl(ctrl, SLOT_AVAIL1); + u32 slot_avail2 = shpc_readl(ctrl, SLOT_AVAIL2); DBG_ENTER_ROUTINE @@ -1114,10 +1005,10 @@ static int hpc_get_max_bus_speed (struct slot *slot, enum pci_bus_speed *value) static int hpc_get_cur_bus_speed (struct slot *slot, enum pci_bus_speed *value) { int retval = 0; - struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; + struct controller *ctrl = slot->ctrl; enum pci_bus_speed bus_speed = PCI_SPEED_UNKNOWN; - u16 sec_bus_reg = readw(php_ctlr->creg + SEC_BUS_CONFIG); - u8 pi = readb(php_ctlr->creg + PROG_INTERFACE); + u16 sec_bus_reg = shpc_readw(ctrl, SEC_BUS_CONFIG); + u8 pi = shpc_readb(ctrl, PROG_INTERFACE); u8 speed_mode = (pi == 2) ? (sec_bus_reg & 0xF) : (sec_bus_reg & 0x7); DBG_ENTER_ROUTINE @@ -1206,28 +1097,14 @@ static struct hpc_ops shpchp_hpc_ops = { .release_ctlr = hpc_release_ctlr, }; -inline static int shpc_indirect_creg_read(struct controller *ctrl, int index, - u32 *value) -{ - int rc; - u32 cap_offset = ctrl->cap_offset; - struct pci_dev *pdev = ctrl->pci_dev; - - rc = pci_write_config_byte(pdev, cap_offset + DWORD_SELECT, index); - if (rc) - return rc; - return pci_read_config_dword(pdev, cap_offset + DWORD_DATA, value); -} - int shpc_init(struct controller * ctrl, struct pci_dev * pdev) { struct php_ctlr_state_s *php_ctlr, *p; void *instance_id = ctrl; int rc, num_slots = 0; u8 hp_slot; - static int first = 1; u32 shpc_base_offset; - u32 tempdword, slot_reg; + u32 tempdword, slot_reg, slot_config; u8 i; DBG_ENTER_ROUTINE @@ -1257,13 +1134,13 @@ int shpc_init(struct controller * ctrl, struct pci_dev * pdev) } dbg("%s: cap_offset = %x\n", __FUNCTION__, ctrl->cap_offset); - rc = shpc_indirect_creg_read(ctrl, 0, &shpc_base_offset); + rc = shpc_indirect_read(ctrl, 0, &shpc_base_offset); if (rc) { err("%s: cannot read base_offset\n", __FUNCTION__); goto abort_free_ctlr; } - rc = shpc_indirect_creg_read(ctrl, 3, &tempdword); + rc = shpc_indirect_read(ctrl, 3, &tempdword); if (rc) { err("%s: cannot read slot config\n", __FUNCTION__); goto abort_free_ctlr; @@ -1272,7 +1149,7 @@ int shpc_init(struct controller * ctrl, struct pci_dev * pdev) dbg("%s: num_slots (indirect) %x\n", __FUNCTION__, num_slots); for (i = 0; i < 9 + num_slots; i++) { - rc = shpc_indirect_creg_read(ctrl, i, &tempdword); + rc = shpc_indirect_read(ctrl, i, &tempdword); if (rc) { err("%s: cannot read creg (index = %d)\n", __FUNCTION__, i); @@ -1287,11 +1164,6 @@ int shpc_init(struct controller * ctrl, struct pci_dev * pdev) ctrl->mmio_size = 0x24 + 0x4 * num_slots; } - if (first) { - spin_lock_init(&hpc_event_lock); - first = 0; - } - info("HPC vendor_id %x device_id %x ss_vid %x ss_did %x\n", pdev->vendor, pdev->device, pdev->subsystem_vendor, pdev->subsystem_device); @@ -1326,29 +1198,39 @@ int shpc_init(struct controller * ctrl, struct pci_dev * pdev) php_ctlr->power_fault_callback = shpchp_handle_power_fault; php_ctlr->callback_instance_id = instance_id; + ctrl->hpc_ctlr_handle = php_ctlr; + ctrl->hpc_ops = &shpchp_hpc_ops; + /* Return PCI Controller Info */ - php_ctlr->slot_device_offset = (readl(php_ctlr->creg + SLOT_CONFIG) & FIRST_DEV_NUM ) >> 8; - php_ctlr->num_slots = readl(php_ctlr->creg + SLOT_CONFIG) & SLOT_NUM; + slot_config = shpc_readl(ctrl, SLOT_CONFIG); + php_ctlr->slot_device_offset = (slot_config & FIRST_DEV_NUM) >> 8; + php_ctlr->num_slots = slot_config & SLOT_NUM; dbg("%s: slot_device_offset %x\n", __FUNCTION__, php_ctlr->slot_device_offset); dbg("%s: num_slots %x\n", __FUNCTION__, php_ctlr->num_slots); /* Mask Global Interrupt Mask & Command Complete Interrupt Mask */ - tempdword = readl(php_ctlr->creg + SERR_INTR_ENABLE); + tempdword = shpc_readl(ctrl, SERR_INTR_ENABLE); dbg("%s: SERR_INTR_ENABLE = %x\n", __FUNCTION__, tempdword); - tempdword = 0x0003000f; - writel(tempdword, php_ctlr->creg + SERR_INTR_ENABLE); - tempdword = readl(php_ctlr->creg + SERR_INTR_ENABLE); + tempdword |= (GLOBAL_INTR_MASK | GLOBAL_SERR_MASK | + COMMAND_INTR_MASK | ARBITER_SERR_MASK); + tempdword &= ~SERR_INTR_RSVDZ_MASK; + shpc_writel(ctrl, SERR_INTR_ENABLE, tempdword); + tempdword = shpc_readl(ctrl, SERR_INTR_ENABLE); dbg("%s: SERR_INTR_ENABLE = %x\n", __FUNCTION__, tempdword); /* Mask the MRL sensor SERR Mask of individual slot in * Slot SERR-INT Mask & clear all the existing event if any */ for (hp_slot = 0; hp_slot < php_ctlr->num_slots; hp_slot++) { - slot_reg = readl(php_ctlr->creg + SLOT1 + 4*hp_slot ); + slot_reg = shpc_readl(ctrl, SLOT_REG(hp_slot)); dbg("%s: Default Logical Slot Register %d value %x\n", __FUNCTION__, hp_slot, slot_reg); - tempdword = 0xffff3fff; - writel(tempdword, php_ctlr->creg + SLOT1 + (4*hp_slot)); + slot_reg |= (PRSNT_CHANGE_INTR_MASK | ISO_PFAULT_INTR_MASK | + BUTTON_PRESS_INTR_MASK | MRL_CHANGE_INTR_MASK | + CON_PFAULT_INTR_MASK | MRL_CHANGE_SERR_MASK | + CON_PFAULT_SERR_MASK); + slot_reg &= ~SLOT_REG_RSVDZ_MASK; + shpc_writel(ctrl, SLOT_REG(hp_slot), slot_reg); } if (shpchp_poll_mode) {/* Install interrupt polling code */ @@ -1364,7 +1246,7 @@ int shpc_init(struct controller * ctrl, struct pci_dev * pdev) } else php_ctlr->irq = pdev->irq; - rc = request_irq(php_ctlr->irq, shpc_isr, SA_SHIRQ, MY_NAME, (void *) ctrl); + rc = request_irq(php_ctlr->irq, shpc_isr, IRQF_SHARED, MY_NAME, (void *) ctrl); dbg("%s: request_irq %d for hpc%d (returns %d)\n", __FUNCTION__, php_ctlr->irq, ctlr_seq_num, rc); if (rc) { err("Can't get irq %d for the hotplug controller\n", php_ctlr->irq); @@ -1392,24 +1274,37 @@ int shpc_init(struct controller * ctrl, struct pci_dev * pdev) } spin_unlock(&list_lock); - ctlr_seq_num++; - ctrl->hpc_ctlr_handle = php_ctlr; - ctrl->hpc_ops = &shpchp_hpc_ops; + /* + * If this is the first controller to be initialized, + * initialize the shpchpd work queue + */ + if (atomic_add_return(1, &shpchp_num_controllers) == 1) { + shpchp_wq = create_singlethread_workqueue("shpchpd"); + if (!shpchp_wq) + return -ENOMEM; + } + + /* + * Unmask all event interrupts of all slots + */ for (hp_slot = 0; hp_slot < php_ctlr->num_slots; hp_slot++) { - slot_reg = readl(php_ctlr->creg + SLOT1 + 4*hp_slot ); + slot_reg = shpc_readl(ctrl, SLOT_REG(hp_slot)); dbg("%s: Default Logical Slot Register %d value %x\n", __FUNCTION__, hp_slot, slot_reg); - tempdword = 0xe01f3fff; - writel(tempdword, php_ctlr->creg + SLOT1 + (4*hp_slot)); + slot_reg &= ~(PRSNT_CHANGE_INTR_MASK | ISO_PFAULT_INTR_MASK | + BUTTON_PRESS_INTR_MASK | MRL_CHANGE_INTR_MASK | + CON_PFAULT_INTR_MASK | SLOT_REG_RSVDZ_MASK); + shpc_writel(ctrl, SLOT_REG(hp_slot), slot_reg); } if (!shpchp_poll_mode) { /* Unmask all general input interrupts and SERR */ - tempdword = readl(php_ctlr->creg + SERR_INTR_ENABLE); - tempdword = 0x0000000a; - writel(tempdword, php_ctlr->creg + SERR_INTR_ENABLE); - tempdword = readl(php_ctlr->creg + SERR_INTR_ENABLE); + tempdword = shpc_readl(ctrl, SERR_INTR_ENABLE); + tempdword &= ~(GLOBAL_INTR_MASK | COMMAND_INTR_MASK | + SERR_INTR_RSVDZ_MASK); + shpc_writel(ctrl, SERR_INTR_ENABLE, tempdword); + tempdword = shpc_readl(ctrl, SERR_INTR_ENABLE); dbg("%s: SERR_INTR_ENABLE = %x\n", __FUNCTION__, tempdword); } diff --git a/drivers/pci/hotplug/shpchp_pci.c b/drivers/pci/hotplug/shpchp_pci.c index 257adc233..0a6b25ef1 100644 --- a/drivers/pci/hotplug/shpchp_pci.c +++ b/drivers/pci/hotplug/shpchp_pci.c @@ -47,21 +47,28 @@ static void program_fw_provided_values(struct pci_dev *dev) return; /* use default values if we can't get them from firmware */ - if (get_hp_params_from_firmware(dev, &hpp)) { - hpp.cache_line_size = 8; - hpp.latency_timer = 0x40; - hpp.enable_serr = 0; - hpp.enable_perr = 0; + if (get_hp_params_from_firmware(dev, &hpp) || + !hpp.t0 || (hpp.t0->revision > 1)) { + printk(KERN_WARNING + "%s: Could not get hotplug parameters. Use defaults\n", + __FUNCTION__); + hpp.t0 = &hpp.type0_data; + hpp.t0->revision = 0; + hpp.t0->cache_line_size = 8; + hpp.t0->latency_timer = 0x40; + hpp.t0->enable_serr = 0; + hpp.t0->enable_perr = 0; } - pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, hpp.cache_line_size); - pci_write_config_byte(dev, PCI_LATENCY_TIMER, hpp.latency_timer); + pci_write_config_byte(dev, + PCI_CACHE_LINE_SIZE, hpp.t0->cache_line_size); + pci_write_config_byte(dev, PCI_LATENCY_TIMER, hpp.t0->latency_timer); pci_read_config_word(dev, PCI_COMMAND, &pci_cmd); - if (hpp.enable_serr) + if (hpp.t0->enable_serr) pci_cmd |= PCI_COMMAND_SERR; else pci_cmd &= ~PCI_COMMAND_SERR; - if (hpp.enable_perr) + if (hpp.t0->enable_perr) pci_cmd |= PCI_COMMAND_PARITY; else pci_cmd &= ~PCI_COMMAND_PARITY; @@ -70,13 +77,13 @@ static void program_fw_provided_values(struct pci_dev *dev) /* Program bridge control value and child devices */ if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) { pci_write_config_byte(dev, PCI_SEC_LATENCY_TIMER, - hpp.latency_timer); + hpp.t0->latency_timer); pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &pci_bctl); - if (hpp.enable_serr) + if (hpp.t0->enable_serr) pci_bctl |= PCI_BRIDGE_CTL_SERR; else pci_bctl &= ~PCI_BRIDGE_CTL_SERR; - if (hpp.enable_perr) + if (hpp.t0->enable_perr) pci_bctl |= PCI_BRIDGE_CTL_PARITY; else pci_bctl &= ~PCI_BRIDGE_CTL_PARITY; diff --git a/drivers/pci/hotplug/shpchp_sysfs.c b/drivers/pci/hotplug/shpchp_sysfs.c index f5cfbf2c0..620e1139e 100644 --- a/drivers/pci/hotplug/shpchp_sysfs.c +++ b/drivers/pci/hotplug/shpchp_sysfs.c @@ -51,8 +51,10 @@ static ssize_t show_ctrl (struct device *dev, struct device_attribute *attr, cha res = bus->resource[index]; if (res && (res->flags & IORESOURCE_MEM) && !(res->flags & IORESOURCE_PREFETCH)) { - out += sprintf(out, "start = %8.8lx, length = %8.8lx\n", - res->start, (res->end - res->start)); + out += sprintf(out, "start = %8.8llx, " + "length = %8.8llx\n", + (unsigned long long)res->start, + (unsigned long long)(res->end - res->start)); } } out += sprintf(out, "Free resources: prefetchable memory\n"); @@ -60,16 +62,20 @@ static ssize_t show_ctrl (struct device *dev, struct device_attribute *attr, cha res = bus->resource[index]; if (res && (res->flags & IORESOURCE_MEM) && (res->flags & IORESOURCE_PREFETCH)) { - out += sprintf(out, "start = %8.8lx, length = %8.8lx\n", - res->start, (res->end - res->start)); + out += sprintf(out, "start = %8.8llx, " + "length = %8.8llx\n", + (unsigned long long)res->start, + (unsigned long long)(res->end - res->start)); } } out += sprintf(out, "Free resources: IO\n"); for (index = 0; index < PCI_BUS_NUM_RESOURCES; index++) { res = bus->resource[index]; if (res && (res->flags & IORESOURCE_IO)) { - out += sprintf(out, "start = %8.8lx, length = %8.8lx\n", - res->start, (res->end - res->start)); + out += sprintf(out, "start = %8.8llx, " + "length = %8.8llx\n", + (unsigned long long)res->start, + (unsigned long long)(res->end - res->start)); } } out += sprintf(out, "Free resources: bus numbers\n"); diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index 9855c4c92..a83c1f573 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include @@ -23,8 +22,6 @@ #include "pci.h" #include "msi.h" -#define MSI_TARGET_CPU first_cpu(cpu_online_map) - static DEFINE_SPINLOCK(msi_lock); static struct msi_desc* msi_desc[NR_IRQS] = { [0 ... NR_IRQS-1] = NULL }; static kmem_cache_t* msi_cachep; @@ -37,18 +34,26 @@ static int nr_msix_devices; #ifndef CONFIG_X86_IO_APIC int vector_irq[NR_VECTORS] = { [0 ... NR_VECTORS - 1] = -1}; -u8 irq_vector[NR_IRQ_VECTORS] = { FIRST_DEVICE_VECTOR , 0 }; #endif +static struct msi_ops *msi_ops; + +int +msi_register(struct msi_ops *ops) +{ + msi_ops = ops; + return 0; +} + static void msi_cache_ctor(void *p, kmem_cache_t *cache, unsigned long flags) { - memset(p, 0, NR_IRQS * sizeof(struct msi_desc)); + memset(p, 0, sizeof(struct msi_desc)); } static int msi_cache_init(void) { msi_cachep = kmem_cache_create("msi_cache", - NR_IRQS * sizeof(struct msi_desc), + sizeof(struct msi_desc), 0, SLAB_HWCACHE_ALIGN, msi_cache_ctor, NULL); if (!msi_cachep) return -ENOMEM; @@ -92,7 +97,7 @@ static void msi_set_mask_bit(unsigned int vector, int flag) static void set_msi_affinity(unsigned int vector, cpumask_t cpu_mask) { struct msi_desc *entry; - struct msg_address address; + u32 address_hi, address_lo; unsigned int irq = vector; unsigned int dest_cpu = first_cpu(cpu_mask); @@ -108,28 +113,36 @@ static void set_msi_affinity(unsigned int vector, cpumask_t cpu_mask) if (!pos) return; + pci_read_config_dword(entry->dev, msi_upper_address_reg(pos), + &address_hi); pci_read_config_dword(entry->dev, msi_lower_address_reg(pos), - &address.lo_address.value); - address.lo_address.value &= MSI_ADDRESS_DEST_ID_MASK; - address.lo_address.value |= (cpu_physical_id(dest_cpu) << - MSI_TARGET_CPU_SHIFT); - entry->msi_attrib.current_cpu = cpu_physical_id(dest_cpu); + &address_lo); + + msi_ops->target(vector, dest_cpu, &address_hi, &address_lo); + + pci_write_config_dword(entry->dev, msi_upper_address_reg(pos), + address_hi); pci_write_config_dword(entry->dev, msi_lower_address_reg(pos), - address.lo_address.value); + address_lo); set_native_irq_info(irq, cpu_mask); break; } case PCI_CAP_ID_MSIX: { - int offset = entry->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE + - PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET; - - address.lo_address.value = readl(entry->mask_base + offset); - address.lo_address.value &= MSI_ADDRESS_DEST_ID_MASK; - address.lo_address.value |= (cpu_physical_id(dest_cpu) << - MSI_TARGET_CPU_SHIFT); - entry->msi_attrib.current_cpu = cpu_physical_id(dest_cpu); - writel(address.lo_address.value, entry->mask_base + offset); + int offset_hi = + entry->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE + + PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET; + int offset_lo = + entry->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE + + PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET; + + address_hi = readl(entry->mask_base + offset_hi); + address_lo = readl(entry->mask_base + offset_lo); + + msi_ops->target(vector, dest_cpu, &address_hi, &address_lo); + + writel(address_hi, entry->mask_base + offset_hi); + writel(address_lo, entry->mask_base + offset_lo); set_native_irq_info(irq, cpu_mask); break; } @@ -251,30 +264,6 @@ static struct hw_interrupt_type msi_irq_wo_maskbit_type = { .set_affinity = set_msi_affinity }; -static void msi_data_init(struct msg_data *msi_data, - unsigned int vector) -{ - memset(msi_data, 0, sizeof(struct msg_data)); - msi_data->vector = (u8)vector; - msi_data->delivery_mode = MSI_DELIVERY_MODE; - msi_data->level = MSI_LEVEL_MODE; - msi_data->trigger = MSI_TRIGGER_MODE; -} - -static void msi_address_init(struct msg_address *msi_address) -{ - unsigned int dest_id; - unsigned long dest_phys_id = cpu_physical_id(MSI_TARGET_CPU); - - memset(msi_address, 0, sizeof(struct msg_address)); - msi_address->hi_address = (u32)0; - dest_id = (MSI_ADDRESS_HEADER << MSI_ADDRESS_HEADER_SHIFT); - msi_address->lo_address.u.dest_mode = MSI_PHYSICAL_MODE; - msi_address->lo_address.u.redirection_hint = MSI_REDIRECTION_HINT_MODE; - msi_address->lo_address.u.dest_id = dest_id; - msi_address->lo_address.value |= (dest_phys_id << MSI_TARGET_CPU_SHIFT); -} - static int msi_free_vector(struct pci_dev* dev, int vector, int reassign); static int assign_msi_vector(void) { @@ -369,13 +358,29 @@ static int msi_init(void) return status; } + status = msi_arch_init(); + if (status < 0) { + pci_msi_enable = 0; + printk(KERN_WARNING + "PCI: MSI arch init failed. MSI disabled.\n"); + return status; + } + + if (! msi_ops) { + printk(KERN_WARNING + "PCI: MSI ops not registered. MSI disabled.\n"); + status = -EINVAL; + return status; + } + + last_alloc_vector = assign_irq_vector(AUTO_ASSIGN); status = msi_cache_init(); if (status < 0) { pci_msi_enable = 0; printk(KERN_WARNING "PCI: MSI cache init failed\n"); return status; } - last_alloc_vector = assign_irq_vector(AUTO_ASSIGN); + if (last_alloc_vector < 0) { pci_msi_enable = 0; printk(KERN_WARNING "PCI: No interrupt vectors available for MSI\n"); @@ -423,12 +428,12 @@ static void irq_handler_init(int cap_id, int pos, int mask) spin_lock_irqsave(&irq_desc[pos].lock, flags); if (cap_id == PCI_CAP_ID_MSIX) - irq_desc[pos].handler = &msix_irq_type; + irq_desc[pos].chip = &msix_irq_type; else { if (!mask) - irq_desc[pos].handler = &msi_irq_wo_maskbit_type; + irq_desc[pos].chip = &msi_irq_wo_maskbit_type; else - irq_desc[pos].handler = &msi_irq_w_maskbit_type; + irq_desc[pos].chip = &msi_irq_w_maskbit_type; } spin_unlock_irqrestore(&irq_desc[pos].lock, flags); } @@ -442,9 +447,11 @@ static void enable_msi_mode(struct pci_dev *dev, int pos, int type) /* Set enabled bits to single MSI & enable MSI_enable bit */ msi_enable(control, 1); pci_write_config_word(dev, msi_control_reg(pos), control); + dev->msi_enabled = 1; } else { msix_enable(control); pci_write_config_word(dev, msi_control_reg(pos), control); + dev->msix_enabled = 1; } if (pci_find_capability(dev, PCI_CAP_ID_EXP)) { /* PCI Express Endpoint device detected */ @@ -461,9 +468,11 @@ void disable_msi_mode(struct pci_dev *dev, int pos, int type) /* Set enabled bits to single MSI & enable MSI_enable bit */ msi_disable(control); pci_write_config_word(dev, msi_control_reg(pos), control); + dev->msi_enabled = 0; } else { msix_disable(control); pci_write_config_word(dev, msi_control_reg(pos), control); + dev->msix_enabled = 0; } if (pci_find_capability(dev, PCI_CAP_ID_EXP)) { /* PCI Express Endpoint device detected */ @@ -538,7 +547,6 @@ int pci_save_msi_state(struct pci_dev *dev) pci_read_config_dword(dev, pos + PCI_MSI_DATA_32, &cap[i++]); if (control & PCI_MSI_FLAGS_MASKBIT) pci_read_config_dword(dev, pos + PCI_MSI_MASK_BIT, &cap[i++]); - disable_msi_mode(dev, pos, PCI_CAP_ID_MSI); save_state->cap_nr = PCI_CAP_ID_MSI; pci_add_saved_cap(dev, save_state); return 0; @@ -575,6 +583,8 @@ void pci_restore_msi_state(struct pci_dev *dev) int pci_save_msix_state(struct pci_dev *dev) { int pos; + int temp; + int vector, head, tail = 0; u16 control; struct pci_cap_saved_state *save_state; @@ -582,6 +592,7 @@ int pci_save_msix_state(struct pci_dev *dev) if (pos <= 0 || dev->no_msi) return 0; + /* save the capability */ pci_read_config_word(dev, msi_control_reg(pos), &control); if (!(control & PCI_MSIX_FLAGS_ENABLE)) return 0; @@ -593,7 +604,38 @@ int pci_save_msix_state(struct pci_dev *dev) } *((u16 *)&save_state->data[0]) = control; - disable_msi_mode(dev, pos, PCI_CAP_ID_MSIX); + /* save the table */ + temp = dev->irq; + if (msi_lookup_vector(dev, PCI_CAP_ID_MSIX)) { + kfree(save_state); + return -EINVAL; + } + + vector = head = dev->irq; + while (head != tail) { + int j; + void __iomem *base; + struct msi_desc *entry; + + entry = msi_desc[vector]; + base = entry->mask_base; + j = entry->msi_attrib.entry_nr; + + entry->address_lo_save = + readl(base + j * PCI_MSIX_ENTRY_SIZE + + PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET); + entry->address_hi_save = + readl(base + j * PCI_MSIX_ENTRY_SIZE + + PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET); + entry->data_save = + readl(base + j * PCI_MSIX_ENTRY_SIZE + + PCI_MSIX_ENTRY_DATA_OFFSET); + + tail = msi_desc[vector]->link.tail; + vector = tail; + } + dev->irq = temp; + save_state->cap_nr = PCI_CAP_ID_MSIX; pci_add_saved_cap(dev, save_state); return 0; @@ -606,8 +648,6 @@ void pci_restore_msix_state(struct pci_dev *dev) int vector, head, tail = 0; void __iomem *base; int j; - struct msg_address address; - struct msg_data data; struct msi_desc *entry; int temp; struct pci_cap_saved_state *save_state; @@ -633,20 +673,13 @@ void pci_restore_msix_state(struct pci_dev *dev) base = entry->mask_base; j = entry->msi_attrib.entry_nr; - msi_address_init(&address); - msi_data_init(&data, vector); - - address.lo_address.value &= MSI_ADDRESS_DEST_ID_MASK; - address.lo_address.value |= entry->msi_attrib.current_cpu << - MSI_TARGET_CPU_SHIFT; - - writel(address.lo_address.value, + writel(entry->address_lo_save, base + j * PCI_MSIX_ENTRY_SIZE + PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET); - writel(address.hi_address, + writel(entry->address_hi_save, base + j * PCI_MSIX_ENTRY_SIZE + PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET); - writel(*(u32*)&data, + writel(entry->data_save, base + j * PCI_MSIX_ENTRY_SIZE + PCI_MSIX_ENTRY_DATA_OFFSET); @@ -660,30 +693,32 @@ void pci_restore_msix_state(struct pci_dev *dev) } #endif -static void msi_register_init(struct pci_dev *dev, struct msi_desc *entry) +static int msi_register_init(struct pci_dev *dev, struct msi_desc *entry) { - struct msg_address address; - struct msg_data data; + int status; + u32 address_hi; + u32 address_lo; + u32 data; int pos, vector = dev->irq; u16 control; pos = pci_find_capability(dev, PCI_CAP_ID_MSI); pci_read_config_word(dev, msi_control_reg(pos), &control); + /* Configure MSI capability structure */ - msi_address_init(&address); - msi_data_init(&data, vector); - entry->msi_attrib.current_cpu = ((address.lo_address.u.dest_id >> - MSI_TARGET_CPU_SHIFT) & MSI_TARGET_CPU_MASK); - pci_write_config_dword(dev, msi_lower_address_reg(pos), - address.lo_address.value); + status = msi_ops->setup(dev, vector, &address_hi, &address_lo, &data); + if (status < 0) + return status; + + pci_write_config_dword(dev, msi_lower_address_reg(pos), address_lo); if (is_64bit_address(control)) { pci_write_config_dword(dev, - msi_upper_address_reg(pos), address.hi_address); + msi_upper_address_reg(pos), address_hi); pci_write_config_word(dev, - msi_data_reg(pos, 1), *((u32*)&data)); + msi_data_reg(pos, 1), data); } else pci_write_config_word(dev, - msi_data_reg(pos, 0), *((u32*)&data)); + msi_data_reg(pos, 0), data); if (entry->msi_attrib.maskbit) { unsigned int maskbits, temp; /* All MSIs are unmasked by default, Mask them all */ @@ -697,6 +732,8 @@ static void msi_register_init(struct pci_dev *dev, struct msi_desc *entry) msi_mask_bits_reg(pos, is_64bit_address(control)), maskbits); } + + return 0; } /** @@ -710,6 +747,7 @@ static void msi_register_init(struct pci_dev *dev, struct msi_desc *entry) **/ static int msi_capability_init(struct pci_dev *dev) { + int status; struct msi_desc *entry; int pos, vector; u16 control; @@ -742,7 +780,12 @@ static int msi_capability_init(struct pci_dev *dev) /* Replace with MSI handler */ irq_handler_init(PCI_CAP_ID_MSI, vector, entry->msi_attrib.maskbit); /* Configure MSI capability structure */ - msi_register_init(dev, entry); + status = msi_register_init(dev, entry); + if (status != 0) { + dev->irq = entry->msi_attrib.default_vector; + kmem_cache_free(msi_cachep, entry); + return status; + } attach_msi_entry(entry, vector); /* Set MSI enabled bits */ @@ -765,8 +808,10 @@ static int msix_capability_init(struct pci_dev *dev, struct msix_entry *entries, int nvec) { struct msi_desc *head = NULL, *tail = NULL, *entry = NULL; - struct msg_address address; - struct msg_data data; + u32 address_hi; + u32 address_lo; + u32 data; + int status; int vector, pos, i, j, nr_entries, temp = 0; unsigned long phys_addr; u32 table_offset; @@ -822,18 +867,20 @@ static int msix_capability_init(struct pci_dev *dev, /* Replace with MSI-X handler */ irq_handler_init(PCI_CAP_ID_MSIX, vector, 1); /* Configure MSI-X capability structure */ - msi_address_init(&address); - msi_data_init(&data, vector); - entry->msi_attrib.current_cpu = - ((address.lo_address.u.dest_id >> - MSI_TARGET_CPU_SHIFT) & MSI_TARGET_CPU_MASK); - writel(address.lo_address.value, + status = msi_ops->setup(dev, vector, + &address_hi, + &address_lo, + &data); + if (status < 0) + break; + + writel(address_lo, base + j * PCI_MSIX_ENTRY_SIZE + PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET); - writel(address.hi_address, + writel(address_hi, base + j * PCI_MSIX_ENTRY_SIZE + PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET); - writel(*(u32*)&data, + writel(data, base + j * PCI_MSIX_ENTRY_SIZE + PCI_MSIX_ENTRY_DATA_OFFSET); attach_msi_entry(entry, vector); @@ -865,6 +912,7 @@ static int msix_capability_init(struct pci_dev *dev, **/ int pci_enable_msi(struct pci_dev* dev) { + struct pci_bus *bus; int pos, temp, status = -EINVAL; u16 control; @@ -874,8 +922,9 @@ int pci_enable_msi(struct pci_dev* dev) if (dev->no_msi) return status; - if (dev->bus->bus_flags & PCI_BUS_FLAGS_NO_MSI) - return -EINVAL; + for (bus = dev->bus; bus; bus = bus->parent) + if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI) + return -EINVAL; temp = dev->irq; @@ -887,23 +936,23 @@ int pci_enable_msi(struct pci_dev* dev) if (!pos) return -EINVAL; - pci_read_config_word(dev, msi_control_reg(pos), &control); - if (control & PCI_MSI_FLAGS_ENABLE) - return 0; /* Already in MSI mode */ - if (!msi_lookup_vector(dev, PCI_CAP_ID_MSI)) { /* Lookup Sucess */ unsigned long flags; + pci_read_config_word(dev, msi_control_reg(pos), &control); + if (control & PCI_MSI_FLAGS_ENABLE) + return 0; /* Already in MSI mode */ spin_lock_irqsave(&msi_lock, flags); if (!vector_irq[dev->irq]) { msi_desc[dev->irq]->msi_attrib.state = 0; vector_irq[dev->irq] = -1; nr_released_vectors--; spin_unlock_irqrestore(&msi_lock, flags); - msi_register_init(dev, msi_desc[dev->irq]); - enable_msi_mode(dev, pos, PCI_CAP_ID_MSI); - return 0; + status = msi_register_init(dev, msi_desc[dev->irq]); + if (status == 0) + enable_msi_mode(dev, pos, PCI_CAP_ID_MSI); + return status; } spin_unlock_irqrestore(&msi_lock, flags); dev->irq = temp; @@ -980,6 +1029,8 @@ static int msi_free_vector(struct pci_dev* dev, int vector, int reassign) void __iomem *base; unsigned long flags; + msi_ops->teardown(vector); + spin_lock_irqsave(&msi_lock, flags); entry = msi_desc[vector]; if (!entry || entry->dev != dev) { @@ -1008,33 +1059,8 @@ static int msi_free_vector(struct pci_dev* dev, int vector, int reassign) entry_nr * PCI_MSIX_ENTRY_SIZE + PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET); - if (head == vector) { - /* - * Detect last MSI-X vector to be released. - * Release the MSI-X memory-mapped table. - */ -#if 0 - int pos, nr_entries; - unsigned long phys_addr; - u32 table_offset; - u16 control; - u8 bir; - - pos = pci_find_capability(dev, PCI_CAP_ID_MSIX); - pci_read_config_word(dev, msi_control_reg(pos), - &control); - nr_entries = multi_msix_capable(control); - pci_read_config_dword(dev, msix_table_offset_reg(pos), - &table_offset); - bir = (u8)(table_offset & PCI_MSIX_FLAGS_BIRMASK); - table_offset &= ~PCI_MSIX_FLAGS_BIRMASK; - phys_addr = pci_resource_start(dev, bir) + table_offset; -/* - * FIXME! and what did you want to do with phys_addr? - */ -#endif + if (head == vector) iounmap(base); - } } return 0; @@ -1108,6 +1134,7 @@ static int reroute_msix_table(int head, struct msix_entry *entries, int *nvec) **/ int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec) { + struct pci_bus *bus; int status, pos, nr_entries, free_vectors; int i, j, temp; u16 control; @@ -1116,6 +1143,13 @@ int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec) if (!pci_msi_enable || !dev || !entries) return -EINVAL; + if (dev->no_msi) + return -EINVAL; + + for (bus = dev->bus; bus; bus = bus->parent) + if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI) + return -EINVAL; + status = msi_init(); if (status < 0) return status; @@ -1300,24 +1334,6 @@ void msi_remove_pci_irq_vectors(struct pci_dev* dev) } msi_free_vector(dev, vector, 0); if (warning) { - /* Force to release the MSI-X memory-mapped table */ -#if 0 - unsigned long phys_addr; - u32 table_offset; - u16 control; - u8 bir; - - pci_read_config_word(dev, msi_control_reg(pos), - &control); - pci_read_config_dword(dev, msix_table_offset_reg(pos), - &table_offset); - bir = (u8)(table_offset & PCI_MSIX_FLAGS_BIRMASK); - table_offset &= ~PCI_MSIX_FLAGS_BIRMASK; - phys_addr = pci_resource_start(dev, bir) + table_offset; -/* - * FIXME! and what did you want to do with phys_addr? - */ -#endif iounmap(base); printk(KERN_WARNING "PCI: %s: msi_remove_pci_irq_vectors() " "called without free_irq() on all MSI-X vectors\n", diff --git a/drivers/pci/msi.h b/drivers/pci/msi.h index 4ac52d441..56951c39d 100644 --- a/drivers/pci/msi.h +++ b/drivers/pci/msi.h @@ -6,6 +6,68 @@ #ifndef MSI_H #define MSI_H +/* + * MSI operation vector. Used by the msi core code (drivers/pci/msi.c) + * to abstract platform-specific tasks relating to MSI address generation + * and resource management. + */ +struct msi_ops { + /** + * setup - generate an MSI bus address and data for a given vector + * @pdev: PCI device context (in) + * @vector: vector allocated by the msi core (in) + * @addr_hi: upper 32 bits of PCI bus MSI address (out) + * @addr_lo: lower 32 bits of PCI bus MSI address (out) + * @data: MSI data payload (out) + * + * Description: The setup op is used to generate a PCI bus addres and + * data which the msi core will program into the card MSI capability + * registers. The setup routine is responsible for picking an initial + * cpu to target the MSI at. The setup routine is responsible for + * examining pdev to determine the MSI capabilities of the card and + * generating a suitable address/data. The setup routine is + * responsible for allocating and tracking any system resources it + * needs to route the MSI to the cpu it picks, and for associating + * those resources with the passed in vector. + * + * Returns 0 if the MSI address/data was successfully setup. + **/ + + int (*setup) (struct pci_dev *pdev, unsigned int vector, + u32 *addr_hi, u32 *addr_lo, u32 *data); + + /** + * teardown - release resources allocated by setup + * @vector: vector context for resources (in) + * + * Description: The teardown op is used to release any resources + * that were allocated in the setup routine associated with the passed + * in vector. + **/ + + void (*teardown) (unsigned int vector); + + /** + * target - retarget an MSI at a different cpu + * @vector: vector context for resources (in) + * @cpu: new cpu to direct vector at (in) + * @addr_hi: new value of PCI bus upper 32 bits (in/out) + * @addr_lo: new value of PCI bus lower 32 bits (in/out) + * + * Description: The target op is used to redirect an MSI vector + * at a different cpu. addr_hi/addr_lo coming in are the existing + * values that the MSI core has programmed into the card. The + * target code is responsible for freeing any resources (if any) + * associated with the old address, and generating a new PCI bus + * addr_hi/addr_lo that will redirect the vector at the indicated cpu. + **/ + + void (*target) (unsigned int vector, unsigned int cpu, + u32 *addr_hi, u32 *addr_lo); +}; + +extern int msi_register(struct msi_ops *ops); + #include /* @@ -63,67 +125,6 @@ extern int pci_vector_resources(int last, int nr_released); #define msix_mask(address) (address | PCI_MSIX_FLAGS_BITMASK) #define msix_is_pending(address) (address & PCI_MSIX_FLAGS_PENDMASK) -/* - * MSI Defined Data Structures - */ -#define MSI_ADDRESS_HEADER 0xfee -#define MSI_ADDRESS_HEADER_SHIFT 12 -#define MSI_ADDRESS_HEADER_MASK 0xfff000 -#define MSI_ADDRESS_DEST_ID_MASK 0xfff0000f -#define MSI_TARGET_CPU_MASK 0xff -#define MSI_DELIVERY_MODE 0 -#define MSI_LEVEL_MODE 1 /* Edge always assert */ -#define MSI_TRIGGER_MODE 0 /* MSI is edge sensitive */ -#define MSI_PHYSICAL_MODE 0 -#define MSI_LOGICAL_MODE 1 -#define MSI_REDIRECTION_HINT_MODE 0 - -struct msg_data { -#if defined(__LITTLE_ENDIAN_BITFIELD) - __u32 vector : 8; - __u32 delivery_mode : 3; /* 000b: FIXED | 001b: lowest prior */ - __u32 reserved_1 : 3; - __u32 level : 1; /* 0: deassert | 1: assert */ - __u32 trigger : 1; /* 0: edge | 1: level */ - __u32 reserved_2 : 16; -#elif defined(__BIG_ENDIAN_BITFIELD) - __u32 reserved_2 : 16; - __u32 trigger : 1; /* 0: edge | 1: level */ - __u32 level : 1; /* 0: deassert | 1: assert */ - __u32 reserved_1 : 3; - __u32 delivery_mode : 3; /* 000b: FIXED | 001b: lowest prior */ - __u32 vector : 8; -#else -#error "Bitfield endianness not defined! Check your byteorder.h" -#endif -} __attribute__ ((packed)); - -struct msg_address { - union { - struct { -#if defined(__LITTLE_ENDIAN_BITFIELD) - __u32 reserved_1 : 2; - __u32 dest_mode : 1; /*0:physic | 1:logic */ - __u32 redirection_hint: 1; /*0: dedicated CPU - 1: lowest priority */ - __u32 reserved_2 : 4; - __u32 dest_id : 24; /* Destination ID */ -#elif defined(__BIG_ENDIAN_BITFIELD) - __u32 dest_id : 24; /* Destination ID */ - __u32 reserved_2 : 4; - __u32 redirection_hint: 1; /*0: dedicated CPU - 1: lowest priority */ - __u32 dest_mode : 1; /*0:physic | 1:logic */ - __u32 reserved_1 : 2; -#else -#error "Bitfield endianness not defined! Check your byteorder.h" -#endif - }u; - __u32 value; - }lo_address; - __u32 hi_address; -} __attribute__ ((packed)); - struct msi_desc { struct { __u8 type : 5; /* {0: unused, 5h:MSI, 11h:MSI-X} */ @@ -132,7 +133,7 @@ struct msi_desc { __u8 reserved: 1; /* reserved */ __u8 entry_nr; /* specific enabled entry */ __u8 default_vector; /* default pre-assigned vector */ - __u8 current_cpu; /* current destination cpu */ + __u8 unused; /* formerly unused destination cpu*/ }msi_attrib; struct { @@ -142,6 +143,14 @@ struct msi_desc { void __iomem *mask_base; struct pci_dev *dev; + +#ifdef CONFIG_PM + /* PM save area for MSIX address/data */ + + u32 address_hi_save; + u32 address_lo_save; + u32 data_save; +#endif }; #endif /* MSI_H */ diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c index bc01d34e2..bb7456c1d 100644 --- a/drivers/pci/pci-acpi.c +++ b/drivers/pci/pci-acpi.c @@ -1,9 +1,10 @@ /* * File: pci-acpi.c - * Purpose: Provide PCI supports in ACPI + * Purpose: Provide PCI support in ACPI * - * Copyright (C) 2004 Intel - * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com) + * Copyright (C) 2005 David Shaohua Li + * Copyright (C) 2004 Tom Long Nguyen + * Copyright (C) 2004 Intel Corp. */ #include @@ -16,6 +17,7 @@ #include #include +#include "pci.h" static u32 ctrlset_buf[3] = {0, 0, 0}; static u32 global_ctrlsets = 0; @@ -31,13 +33,10 @@ acpi_query_osc ( acpi_status status; struct acpi_object_list input; union acpi_object in_params[4]; - struct acpi_buffer output; - union acpi_object out_obj; + struct acpi_buffer output = {ACPI_ALLOCATE_BUFFER, NULL}; + union acpi_object *out_obj; u32 osc_dw0; - /* Setting up output buffer */ - output.length = sizeof(out_obj) + 3*sizeof(u32); - output.pointer = &out_obj; /* Setting up input parameters */ input.count = 4; @@ -59,12 +58,15 @@ acpi_query_osc ( "Evaluate _OSC Set fails. Status = 0x%04x\n", status); return status; } - if (out_obj.type != ACPI_TYPE_BUFFER) { + out_obj = output.pointer; + + if (out_obj->type != ACPI_TYPE_BUFFER) { printk(KERN_DEBUG "Evaluate _OSC returns wrong type\n"); - return AE_TYPE; + status = AE_TYPE; + goto query_osc_out; } - osc_dw0 = *((u32 *) out_obj.buffer.pointer); + osc_dw0 = *((u32 *) out_obj->buffer.pointer); if (osc_dw0) { if (osc_dw0 & OSC_REQUEST_ERROR) printk(KERN_DEBUG "_OSC request fails\n"); @@ -74,36 +76,36 @@ acpi_query_osc ( printk(KERN_DEBUG "_OSC invalid revision\n"); if (osc_dw0 & OSC_CAPABILITIES_MASK_ERROR) { /* Update Global Control Set */ - global_ctrlsets = *((u32 *)(out_obj.buffer.pointer+8)); - return AE_OK; + global_ctrlsets = *((u32 *)(out_obj->buffer.pointer+8)); + status = AE_OK; + goto query_osc_out; } - return AE_ERROR; + status = AE_ERROR; + goto query_osc_out; } /* Update Global Control Set */ - global_ctrlsets = *((u32 *)(out_obj.buffer.pointer + 8)); - return AE_OK; + global_ctrlsets = *((u32 *)(out_obj->buffer.pointer + 8)); + status = AE_OK; + +query_osc_out: + kfree(output.pointer); + return status; } static acpi_status acpi_run_osc ( acpi_handle handle, - u32 level, - void *context, - void **retval ) + void *context) { acpi_status status; struct acpi_object_list input; union acpi_object in_params[4]; - struct acpi_buffer output; - union acpi_object out_obj; + struct acpi_buffer output = {ACPI_ALLOCATE_BUFFER, NULL}; + union acpi_object *out_obj; u32 osc_dw0; - /* Setting up output buffer */ - output.length = sizeof(out_obj) + 3*sizeof(u32); - output.pointer = &out_obj; - /* Setting up input parameters */ input.count = 4; input.pointer = in_params; @@ -124,12 +126,14 @@ acpi_run_osc ( "Evaluate _OSC Set fails. Status = 0x%04x\n", status); return status; } - if (out_obj.type != ACPI_TYPE_BUFFER) { + out_obj = output.pointer; + if (out_obj->type != ACPI_TYPE_BUFFER) { printk(KERN_DEBUG "Evaluate _OSC returns wrong type\n"); - return AE_TYPE; + status = AE_TYPE; + goto run_osc_out; } - osc_dw0 = *((u32 *) out_obj.buffer.pointer); + osc_dw0 = *((u32 *) out_obj->buffer.pointer); if (osc_dw0) { if (osc_dw0 & OSC_REQUEST_ERROR) printk(KERN_DEBUG "_OSC request fails\n"); @@ -139,11 +143,17 @@ acpi_run_osc ( printk(KERN_DEBUG "_OSC invalid revision\n"); if (osc_dw0 & OSC_CAPABILITIES_MASK_ERROR) { printk(KERN_DEBUG "_OSC FW not grant req. control\n"); - return AE_SUPPORT; + status = AE_SUPPORT; + goto run_osc_out; } - return AE_ERROR; + status = AE_ERROR; + goto run_osc_out; } - return AE_OK; + status = AE_OK; + +run_osc_out: + kfree(output.pointer); + return status; } /** @@ -178,11 +188,12 @@ 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. **/ -acpi_status pci_osc_control_set(u32 flags) +acpi_status pci_osc_control_set(acpi_handle handle, u32 flags) { acpi_status status; u32 ctrlset; @@ -196,10 +207,7 @@ acpi_status pci_osc_control_set(u32 flags) return AE_SUPPORT; } ctrlset_buf[OSC_CONTROL_TYPE] |= ctrlset; - status = acpi_get_devices ( PCI_ROOT_HID_STRING, - acpi_run_osc, - ctrlset_buf, - NULL ); + status = acpi_run_osc(handle, ctrlset_buf); if (ACPI_FAILURE (status)) { ctrlset_buf[OSC_CONTROL_TYPE] &= ~ctrlset; } @@ -207,3 +215,105 @@ acpi_status pci_osc_control_set(u32 flags) return status; } EXPORT_SYMBOL(pci_osc_control_set); + +/* + * _SxD returns the D-state with the highest power + * (lowest D-state number) supported in the S-state "x". + * + * If the devices does not have a _PRW + * (Power Resources for Wake) supporting system wakeup from "x" + * then the OS is free to choose a lower power (higher number + * D-state) than the return value from _SxD. + * + * But if _PRW is enabled at S-state "x", the OS + * must not choose a power lower than _SxD -- + * unless the device has an _SxW method specifying + * the lowest power (highest D-state number) the device + * may enter while still able to wake the system. + * + * ie. depending on global OS policy: + * + * if (_PRW at S-state x) + * choose from highest power _SxD to lowest power _SxW + * else // no _PRW at S-state x + * choose highest power _SxD or any lower power + * + * currently we simply return _SxD, if present. + */ + +static int acpi_pci_choose_state(struct pci_dev *pdev, pm_message_t state) +{ + /* TBD */ + + return -ENODEV; +} + +static int acpi_pci_set_power_state(struct pci_dev *dev, pci_power_t state) +{ + acpi_handle handle = DEVICE_ACPI_HANDLE(&dev->dev); + static int state_conv[] = { + [0] = 0, + [1] = 1, + [2] = 2, + [3] = 3, + [4] = 3 + }; + int acpi_state = state_conv[(int __force) state]; + + if (!handle) + return -ENODEV; + return acpi_bus_set_power(handle, acpi_state); +} + + +/* ACPI bus type */ +static int acpi_pci_find_device(struct device *dev, acpi_handle *handle) +{ + struct pci_dev * pci_dev; + acpi_integer addr; + + pci_dev = to_pci_dev(dev); + /* Please ref to ACPI spec for the syntax of _ADR */ + addr = (PCI_SLOT(pci_dev->devfn) << 16) | PCI_FUNC(pci_dev->devfn); + *handle = acpi_get_child(DEVICE_ACPI_HANDLE(dev->parent), addr); + if (!*handle) + return -ENODEV; + return 0; +} + +static int acpi_pci_find_root_bridge(struct device *dev, acpi_handle *handle) +{ + int num; + unsigned int seg, bus; + + /* + * The string should be the same as root bridge's name + * Please look at 'pci_scan_bus_parented' + */ + num = sscanf(dev->bus_id, "pci%04x:%02x", &seg, &bus); + if (num != 2) + return -ENODEV; + *handle = acpi_get_pci_rootbridge_handle(seg, bus); + if (!*handle) + return -ENODEV; + return 0; +} + +static struct acpi_bus_type acpi_pci_bus = { + .bus = &pci_bus_type, + .find_device = acpi_pci_find_device, + .find_bridge = acpi_pci_find_root_bridge, +}; + +static int __init acpi_pci_init(void) +{ + int ret; + + ret = register_acpi_bus_type(&acpi_pci_bus); + if (ret) + return 0; + platform_pci_choose_state = acpi_pci_choose_state; + platform_pci_set_power_state = acpi_pci_set_power_state; + return 0; +} +arch_initcall(acpi_pci_init); diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index 10e1a905c..474e9cd0e 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c @@ -139,9 +139,8 @@ const struct pci_device_id *pci_match_id(const struct pci_device_id *ids, /** * pci_match_device - Tell if a PCI device structure has a matching * PCI device id structure - * @ids: array of PCI device id structures to search in - * @dev: the PCI device structure to match against * @drv: the PCI driver to match against + * @dev: the PCI device structure to match against * * Used by a driver to check whether a PCI device present in the * system is in its list of supported devices. Returns the matching diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index 56ac2bc00..fdefa7dcd 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c @@ -15,7 +15,6 @@ */ -#include #include #include #include @@ -43,6 +42,29 @@ pci_config_attr(subsystem_vendor, "0x%04x\n"); pci_config_attr(subsystem_device, "0x%04x\n"); pci_config_attr(class, "0x%06x\n"); pci_config_attr(irq, "%u\n"); +pci_config_attr(is_enabled, "%u\n"); + +static ssize_t broken_parity_status_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct pci_dev *pdev = to_pci_dev(dev); + return sprintf (buf, "%u\n", pdev->broken_parity_status); +} + +static ssize_t broken_parity_status_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct pci_dev *pdev = to_pci_dev(dev); + ssize_t consumed = -EINVAL; + + if ((count > 0) && (*buf == '0' || *buf == '1')) { + pdev->broken_parity_status = *buf == '1' ? 1 : 0; + consumed = count; + } + return consumed; +} static ssize_t local_cpus_show(struct device *dev, struct device_attribute *attr, char *buf) @@ -64,7 +86,7 @@ resource_show(struct device * dev, struct device_attribute *attr, char * buf) char * str = buf; int i; int max = 7; - u64 start, end; + resource_size_t start, end; if (pci_dev->subordinate) max = DEVICE_COUNT_RESOURCE; @@ -90,6 +112,25 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, (u8)(pci_dev->class >> 16), (u8)(pci_dev->class >> 8), (u8)(pci_dev->class)); } +static ssize_t +is_enabled_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + struct pci_dev *pdev = to_pci_dev(dev); + + /* this can crash the machine when done on the "wrong" device */ + if (!capable(CAP_SYS_ADMIN)) + return count; + + if (*buf == '0') + pci_disable_device(pdev); + + if (*buf == '1') + pci_enable_device(pdev); + + return count; +} + struct device_attribute pci_dev_attrs[] = { __ATTR_RO(resource), @@ -101,6 +142,9 @@ struct device_attribute pci_dev_attrs[] = { __ATTR_RO(irq), __ATTR_RO(local_cpus), __ATTR_RO(modalias), + __ATTR(enable, 0600, is_enabled_show, is_enabled_store), + __ATTR(broken_parity_status,(S_IRUGO|S_IWUSR), + broken_parity_status_show,broken_parity_status_store), __ATTR_NULL, }; @@ -320,7 +364,7 @@ pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr, struct device, kobj)); struct resource *res = (struct resource *)attr->private; enum pci_mmap_state mmap_type; - u64 start, end; + resource_size_t start, end; int i; for (i = 0; i < PCI_ROM_RESOURCE; i++) diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 12286275b..9f79dd6d5 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -19,6 +19,7 @@ #include /* isa_dma_bridge_buggy */ #include "pci.h" +unsigned int pci_pm_d3_delay = 10; /** * pci_bus_max_busnr - returns maximum PCI bus number of given bus' children @@ -164,7 +165,6 @@ int pci_bus_find_capability(struct pci_bus *bus, unsigned int devfn, int cap) return __pci_bus_find_cap(bus, devfn, hdr_type & 0x7f, cap); } -#if 0 /** * pci_find_ext_capability - Find an extended capability * @dev: PCI device to query @@ -212,7 +212,7 @@ int pci_find_ext_capability(struct pci_dev *dev, int cap) return 0; } -#endif /* 0 */ +EXPORT_SYMBOL_GPL(pci_find_ext_capability); /** * pci_find_parent_resource - return resource region of parent bus of given region @@ -314,6 +314,14 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state) } else if (dev->current_state == state) return 0; /* we're already there */ + /* + * If the device or the parent bridge can't support PCI PM, ignore + * the request if we're doing anything besides putting it into D0 + * (which would only happen on boot). + */ + if ((state == PCI_D1 || state == PCI_D2) && pci_no_d1d2(dev)) + return 0; + /* find PCI PM capability in list */ pm = pci_find_capability(dev, PCI_CAP_ID_PM); @@ -364,13 +372,13 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state) /* Mandatory power management transition delays */ /* see PCI PM 1.1 5.6.1 table 18 */ if (state == PCI_D3hot || dev->current_state == PCI_D3hot) - msleep(10); + msleep(pci_pm_d3_delay); else if (state == PCI_D2 || dev->current_state == PCI_D2) udelay(200); /* * Give firmware a chance to be called, such as ACPI _PRx, _PSx - * Firmware method after natice method ? + * Firmware method after native method ? */ if (platform_pci_set_power_state) platform_pci_set_power_state(dev, state); @@ -518,7 +526,12 @@ pci_enable_device_bars(struct pci_dev *dev, int bars) int pci_enable_device(struct pci_dev *dev) { - int err = pci_enable_device_bars(dev, (1 << PCI_NUM_RESOURCES) - 1); + int err; + + if (dev->is_enabled) + return 0; + + err = pci_enable_device_bars(dev, (1 << PCI_NUM_RESOURCES) - 1); if (err) return err; pci_fixup_device(pci_fixup_enable, dev); @@ -547,7 +560,14 @@ void pci_disable_device(struct pci_dev *dev) { u16 pci_command; - + + if (dev->msi_enabled) + disable_msi_mode(dev, pci_find_capability(dev, PCI_CAP_ID_MSI), + PCI_CAP_ID_MSI); + if (dev->msix_enabled) + disable_msi_mode(dev, pci_find_capability(dev, PCI_CAP_ID_MSI), + PCI_CAP_ID_MSIX); + pci_read_config_word(dev, PCI_COMMAND, &pci_command); if (pci_command & PCI_COMMAND_MASTER) { pci_command &= ~PCI_COMMAND_MASTER; @@ -680,10 +700,12 @@ int pci_request_region(struct pci_dev *pdev, int bar, const char *res_name) return 0; err_out: - printk (KERN_WARNING "PCI: Unable to reserve %s region #%d:%lx@%lx for device %s\n", + printk (KERN_WARNING "PCI: Unable to reserve %s region #%d:%llx@%llx " + "for device %s\n", pci_resource_flags(pdev, bar) & IORESOURCE_IO ? "I/O" : "mem", bar + 1, /* PCI BAR # */ - pci_resource_len(pdev, bar), pci_resource_start(pdev, bar), + (unsigned long long)pci_resource_len(pdev, bar), + (unsigned long long)pci_resource_start(pdev, bar), pci_name(pdev)); return -EBUSY; } diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 30630cbe2..08d58fc78 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h @@ -6,10 +6,10 @@ extern int pci_create_sysfs_dev_files(struct pci_dev *pdev); extern void pci_remove_sysfs_dev_files(struct pci_dev *pdev); extern void pci_cleanup_rom(struct pci_dev *dev); extern int pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res, - unsigned long size, unsigned long align, - unsigned long min, unsigned int type_mask, + resource_size_t size, resource_size_t align, + resource_size_t min, unsigned int type_mask, void (*alignf)(void *, struct resource *, - unsigned long, unsigned long), + resource_size_t, resource_size_t), void *alignf_data); /* Firmware callbacks */ extern int (*platform_pci_choose_state)(struct pci_dev *dev, pm_message_t state); @@ -40,14 +40,14 @@ extern int pci_bus_find_capability (struct pci_bus *bus, unsigned int devfn, int extern void pci_remove_legacy_files(struct pci_bus *bus); /* Lock for read/write access to pci device and bus lists */ -extern spinlock_t pci_bus_lock; +extern struct rw_semaphore pci_bus_sem; #ifdef CONFIG_X86_IO_APIC extern int pci_msi_quirk; #else #define pci_msi_quirk 0 #endif - +extern unsigned int pci_pm_d3_delay; #ifdef CONFIG_PCI_MSI void disable_msi_mode(struct pci_dev *dev, int pos, int type); void pci_no_msi(void); @@ -66,7 +66,15 @@ static inline int pci_save_msix_state(struct pci_dev *dev) { return 0; } static inline void pci_restore_msi_state(struct pci_dev *dev) {} static inline void pci_restore_msix_state(struct pci_dev *dev) {} #endif +static inline int pci_no_d1d2(struct pci_dev *dev) +{ + unsigned int parent_dstates = 0; + if (dev->bus->self) + parent_dstates = dev->bus->self->no_d1d2; + return (dev->no_d1d2 || parent_dstates); + +} extern int pcie_mch_quirk; extern struct device_attribute pci_dev_attrs[]; extern struct class_device_attribute class_device_attr_cpuaffinity; diff --git a/drivers/pci/pcie/portdrv_pci.c b/drivers/pci/pcie/portdrv_pci.c index e9095ee50..478d0d28f 100644 --- a/drivers/pci/pcie/portdrv_pci.c +++ b/drivers/pci/pcie/portdrv_pci.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include "portdrv.h" @@ -55,8 +56,10 @@ static int __devinit pcie_portdrv_probe (struct pci_dev *dev, "%s->Dev[%04x:%04x] has invalid IRQ. Check vendor BIOS\n", __FUNCTION__, dev->device, dev->vendor); } - if (pcie_port_device_register(dev)) + if (pcie_port_device_register(dev)) { + pci_disable_device(dev); return -ENOMEM; + } return 0; } @@ -64,16 +67,39 @@ static int __devinit pcie_portdrv_probe (struct pci_dev *dev, static void pcie_portdrv_remove (struct pci_dev *dev) { pcie_port_device_remove(dev); + kfree(pci_get_drvdata(dev)); } #ifdef CONFIG_PM +static int pcie_portdrv_save_config(struct pci_dev *dev) +{ + return pci_save_state(dev); +} + +static int pcie_portdrv_restore_config(struct pci_dev *dev) +{ + int retval; + + pci_restore_state(dev); + retval = pci_enable_device(dev); + if (retval) + return retval; + pci_set_master(dev); + return 0; +} + static int pcie_portdrv_suspend (struct pci_dev *dev, pm_message_t state) { - return pcie_port_device_suspend(dev, state); + int ret = pcie_port_device_suspend(dev, state); + + if (!ret) + ret = pcie_portdrv_save_config(dev); + return ret; } static int pcie_portdrv_resume (struct pci_dev *dev) { + pcie_portdrv_restore_config(dev); return pcie_port_device_resume(dev); } #endif diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index a10ed9dab..c5a58d1c6 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -180,25 +180,31 @@ static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom) res->flags |= pci_calc_resource_flags(l); if ((l & (PCI_BASE_ADDRESS_SPACE | PCI_BASE_ADDRESS_MEM_TYPE_MASK)) == (PCI_BASE_ADDRESS_SPACE_MEMORY | PCI_BASE_ADDRESS_MEM_TYPE_64)) { - pci_read_config_dword(dev, reg+4, &l); + u32 szhi, lhi; + pci_read_config_dword(dev, reg+4, &lhi); + pci_write_config_dword(dev, reg+4, ~0); + pci_read_config_dword(dev, reg+4, &szhi); + pci_write_config_dword(dev, reg+4, lhi); + szhi = pci_size(lhi, szhi, 0xffffffff); next++; #if BITS_PER_LONG == 64 - res->start |= ((unsigned long) l) << 32; + res->start |= ((unsigned long) lhi) << 32; res->end = res->start + sz; - pci_write_config_dword(dev, reg+4, ~0); - pci_read_config_dword(dev, reg+4, &sz); - pci_write_config_dword(dev, reg+4, l); - sz = pci_size(l, sz, 0xffffffff); - if (sz) { + if (szhi) { /* This BAR needs > 4GB? Wow. */ - res->end |= (unsigned long)sz<<32; + res->end |= (unsigned long)szhi<<32; } #else - if (l) { - printk(KERN_ERR "PCI: Unable to handle 64-bit address for device %s\n", pci_name(dev)); + if (szhi) { + printk(KERN_ERR "PCI: Unable to handle 64-bit BAR for device %s\n", pci_name(dev)); res->start = 0; res->flags = 0; - continue; + } else if (lhi) { + /* 64-bit wide address, treat as disabled */ + pci_write_config_dword(dev, reg, l & ~(u32)PCI_BASE_ADDRESS_MEM_MASK); + pci_write_config_dword(dev, reg+4, 0); + res->start = 0; + res->end = sz; } #endif } @@ -377,9 +383,9 @@ struct pci_bus * __devinit pci_add_new_bus(struct pci_bus *parent, struct pci_de child = pci_alloc_child_bus(parent, dev, busnr); if (child) { - spin_lock(&pci_bus_lock); + down_write(&pci_bus_sem); list_add_tail(&child->node, &parent->children); - spin_unlock(&pci_bus_lock); + up_write(&pci_bus_sem); } return child; } @@ -809,6 +815,7 @@ pci_scan_device(struct pci_bus *bus, int devfn) dev->vendor = l & 0xffff; dev->device = (l >> 16) & 0xffff; dev->cfg_size = pci_cfg_space_size(dev); + dev->error_state = pci_channel_io_normal; /* Assume 32-bit PCI; let 64-bit PCI cards (which are far rarer) set this higher, assuming the system even supports it. */ @@ -838,9 +845,9 @@ void __devinit pci_device_add(struct pci_dev *dev, struct pci_bus *bus) * and the bus list for fixup functions, etc. */ INIT_LIST_HEAD(&dev->global_list); - spin_lock(&pci_bus_lock); + down_write(&pci_bus_sem); list_add_tail(&dev->bus_list, &bus->devices); - spin_unlock(&pci_bus_lock); + up_write(&pci_bus_sem); } struct pci_dev * __devinit @@ -975,9 +982,10 @@ struct pci_bus * __devinit pci_create_bus(struct device *parent, pr_debug("PCI: Bus %04x:%02x already known\n", pci_domain_nr(b), bus); goto err_out; } - spin_lock(&pci_bus_lock); + + down_write(&pci_bus_sem); list_add_tail(&b->node, &pci_root_buses); - spin_unlock(&pci_bus_lock); + up_write(&pci_bus_sem); memset(dev, 0, sizeof(*dev)); dev->parent = parent; @@ -1017,9 +1025,9 @@ class_dev_create_file_err: class_dev_reg_err: device_unregister(dev); dev_reg_err: - spin_lock(&pci_bus_lock); + down_write(&pci_bus_sem); list_del(&b->node); - spin_unlock(&pci_bus_lock); + up_write(&pci_bus_sem); err_out: kfree(dev); kfree(b); diff --git a/drivers/pci/proc.c b/drivers/pci/proc.c index 54b2ebc9c..99cf33379 100644 --- a/drivers/pci/proc.c +++ b/drivers/pci/proc.c @@ -302,12 +302,6 @@ static struct file_operations proc_bus_pci_operations = { #endif /* HAVE_PCI_MMAP */ }; -#if BITS_PER_LONG == 32 -#define LONG_FORMAT "\t%08lx" -#else -#define LONG_FORMAT "\t%16lx" -#endif - /* iterator */ static void *pci_seq_start(struct seq_file *m, loff_t *pos) { @@ -356,18 +350,18 @@ static int show_device(struct seq_file *m, void *v) dev->irq); /* Here should be 7 and not PCI_NUM_RESOURCES as we need to preserve compatibility */ for (i=0; i<7; i++) { - u64 start, end; + resource_size_t start, end; pci_resource_to_user(dev, i, &dev->resource[i], &start, &end); - seq_printf(m, LONG_FORMAT, - ((unsigned long)start) | - (dev->resource[i].flags & PCI_REGION_FLAG_MASK)); + seq_printf(m, "\t%16llx", + (unsigned long long)(start | + (dev->resource[i].flags & PCI_REGION_FLAG_MASK))); } for (i=0; i<7; i++) { - u64 start, end; + resource_size_t start, end; pci_resource_to_user(dev, i, &dev->resource[i], &start, &end); - seq_printf(m, LONG_FORMAT, + seq_printf(m, "\t%16llx", dev->resource[i].start < dev->resource[i].end ? - (unsigned long)(end - start) + 1 : 0); + (unsigned long long)(end - start) + 1 : 0); } seq_putc(m, '\t'); if (drv) diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 6e3786f4d..60b31acb7 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -15,7 +15,6 @@ * use the PowerTweak utility (see http://powertweak.sourceforge.net). */ -#include #include #include #include @@ -24,6 +23,17 @@ #include #include "pci.h" +/* The Mellanox Tavor device gives false positive parity errors + * Mark this device with a broken_parity_status, to allow + * PCI scanning code to "skip" this now blacklisted device. + */ +static void __devinit quirk_mellanox_tavor(struct pci_dev *dev) +{ + dev->broken_parity_status = 1; /* This device gives false positives */ +} +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MELLANOX,PCI_DEVICE_ID_MELLANOX_TAVOR,quirk_mellanox_tavor); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MELLANOX,PCI_DEVICE_ID_MELLANOX_TAVOR_BRIDGE,quirk_mellanox_tavor); + /* Deal with broken BIOS'es that neglect to enable passive release, which can cause problems in combination with the 82441FX/PPro MTRRs */ static void __devinit quirk_passive_release(struct pci_dev *dev) @@ -390,6 +400,7 @@ static void __devinit quirk_piix4_acpi(struct pci_dev *dev) piix4_io_quirk(dev, "PIIX4 devres J", 0x7c, 1 << 20); } DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, quirk_piix4_acpi ); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443MX_3, quirk_piix4_acpi ); /* * ICH4, ICH4-M, ICH5, ICH5-M ACPI: Three IO regions pointed to by longwords at @@ -656,6 +667,7 @@ DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_0, quirk_vi DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1, quirk_via_irq); DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_2, quirk_via_irq); DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, quirk_via_irq); +DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235_USB_2, quirk_via_irq); DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686, quirk_via_irq); DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, quirk_via_irq); DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_5, quirk_via_irq); @@ -879,27 +891,30 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82375, quirk_e * when a PCI-Soundcard is added. The BIOS only gives Options * "Disabled" and "AUTO". This Quirk Sets the corresponding * Register-Value to enable the Soundcard. + * + * FIXME: Presently this quirk will run on anything that has an 8237 + * which isn't correct, we need to check DMI tables or something in + * order to make sure it only runs on the MSI-K8T-Neo2Fir. Because it + * runs everywhere at present we suppress the printk output in most + * irrelevant cases. */ static void __init k8t_sound_hostbridge(struct pci_dev *dev) { unsigned char val; - printk(KERN_INFO "PCI: Quirk-MSI-K8T Soundcard On\n"); pci_read_config_byte(dev, 0x50, &val); if (val == 0x88 || val == 0xc8) { + /* Assume it's probably a MSI-K8T-Neo2Fir */ + printk(KERN_INFO "PCI: MSI-K8T-Neo2Fir, attempting to turn soundcard ON\n"); pci_write_config_byte(dev, 0x50, val & (~0x40)); /* Verify the Change for Status output */ pci_read_config_byte(dev, 0x50, &val); if (val & 0x40) - printk(KERN_INFO "PCI: MSI-K8T soundcard still off\n"); + printk(KERN_INFO "PCI: MSI-K8T-Neo2Fir, soundcard still off\n"); else - printk(KERN_INFO "PCI: MSI-K8T soundcard on\n"); - } else { - printk(KERN_INFO "PCI: Unexpected Value in PCI-Register: " - "no Change!\n"); + printk(KERN_INFO "PCI: MSI-K8T-Neo2Fir, soundcard on\n"); } - } DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237, k8t_sound_hostbridge); @@ -950,6 +965,11 @@ static void __init asus_hides_smbus_hostbridge(struct pci_dev *dev) case 0x8070: /* P4G8X Deluxe */ asus_hides_smbus = 1; } + if (dev->device == PCI_DEVICE_ID_INTEL_E7501_MCH) + switch (dev->subsystem_device) { + case 0x80c9: /* PU-DLS */ + asus_hides_smbus = 1; + } if (dev->device == PCI_DEVICE_ID_INTEL_82855GM_HB) switch (dev->subsystem_device) { case 0x1751: /* M2N notebook */ @@ -1018,6 +1038,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82845G_HB, asu DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82850_HB, asus_hides_smbus_hostbridge ); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82865_HB, asus_hides_smbus_hostbridge ); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_7205_0, asus_hides_smbus_hostbridge ); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E7501_MCH, asus_hides_smbus_hostbridge ); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82855PM_HB, asus_hides_smbus_hostbridge ); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82855GM_HB, asus_hides_smbus_hostbridge ); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82915GM_HB, asus_hides_smbus_hostbridge ); @@ -1041,6 +1062,7 @@ static void __init asus_hides_smbus_lpc(struct pci_dev *dev) } DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0, asus_hides_smbus_lpc ); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0, asus_hides_smbus_lpc ); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_0, asus_hides_smbus_lpc ); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, asus_hides_smbus_lpc ); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, asus_hides_smbus_lpc ); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0, asus_hides_smbus_lpc ); @@ -1161,6 +1183,55 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_962, quirk_sis_96x_ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_963, quirk_sis_96x_smbus ); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_LPC, quirk_sis_96x_smbus ); +#if defined(CONFIG_SCSI_SATA) || defined(CONFIG_SCSI_SATA_MODULE) + +/* + * If we are using libata we can drive this chip properly but must + * do this early on to make the additional device appear during + * the PCI scanning. + */ + +static void __devinit quirk_jmicron_dualfn(struct pci_dev *pdev) +{ + u32 conf; + u8 hdr; + + /* Only poke fn 0 */ + if (PCI_FUNC(pdev->devfn)) + return; + + switch(pdev->device) { + case PCI_DEVICE_ID_JMICRON_JMB365: + case PCI_DEVICE_ID_JMICRON_JMB366: + /* Redirect IDE second PATA port to the right spot */ + pci_read_config_dword(pdev, 0x80, &conf); + conf |= (1 << 24); + /* Fall through */ + pci_write_config_dword(pdev, 0x80, conf); + case PCI_DEVICE_ID_JMICRON_JMB361: + case PCI_DEVICE_ID_JMICRON_JMB363: + pci_read_config_dword(pdev, 0x40, &conf); + /* Enable dual function mode, AHCI on fn 0, IDE fn1 */ + /* Set the class codes correctly and then direct IDE 0 */ + conf &= ~0x000F0200; /* Clear bit 9 and 16-19 */ + conf |= 0x00C20002; /* Set bit 1, 17, 22, 23 */ + pci_write_config_dword(pdev, 0x40, conf); + + /* Reconfigure so that the PCI scanner discovers the + device is now multifunction */ + + pci_read_config_byte(pdev, PCI_HEADER_TYPE, &hdr); + pdev->hdr_type = hdr & 0x7f; + pdev->multifunction = !!(hdr & 0x80); + + break; + } +} + +DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, quirk_jmicron_dualfn); + +#endif + #ifdef CONFIG_X86_IO_APIC static void __init quirk_alder_ioapic(struct pci_dev *pdev) { @@ -1328,6 +1399,37 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXH_0, quirk_pc DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXH_1, quirk_pcie_pxh); DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXHV, quirk_pcie_pxh); +/* + * Some Intel PCI Express chipsets have trouble with downstream + * device power management. + */ +static void quirk_intel_pcie_pm(struct pci_dev * dev) +{ + pci_pm_d3_delay = 120; + dev->no_d1d2 = 1; +} + +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25e2, quirk_intel_pcie_pm); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25e3, quirk_intel_pcie_pm); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25e4, quirk_intel_pcie_pm); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25e5, quirk_intel_pcie_pm); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25e6, quirk_intel_pcie_pm); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25e7, quirk_intel_pcie_pm); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25f7, quirk_intel_pcie_pm); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25f8, quirk_intel_pcie_pm); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25f9, quirk_intel_pcie_pm); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25fa, quirk_intel_pcie_pm); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2601, quirk_intel_pcie_pm); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2602, quirk_intel_pcie_pm); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2603, quirk_intel_pcie_pm); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2604, quirk_intel_pcie_pm); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2605, quirk_intel_pcie_pm); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2606, quirk_intel_pcie_pm); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2607, quirk_intel_pcie_pm); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2608, quirk_intel_pcie_pm); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2609, quirk_intel_pcie_pm); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x260a, quirk_intel_pcie_pm); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x260b, quirk_intel_pcie_pm); /* * Fixup the cardbus bridges on the IBM Dock II docking station @@ -1390,6 +1492,63 @@ static void __devinit quirk_netmos(struct pci_dev *dev) } DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETMOS, PCI_ANY_ID, quirk_netmos); +static void __devinit quirk_e100_interrupt(struct pci_dev *dev) +{ + u16 command; + u32 bar; + u8 __iomem *csr; + u8 cmd_hi; + + switch (dev->device) { + /* PCI IDs taken from drivers/net/e100.c */ + case 0x1029: + case 0x1030 ... 0x1034: + case 0x1038 ... 0x103E: + case 0x1050 ... 0x1057: + case 0x1059: + case 0x1064 ... 0x106B: + case 0x1091 ... 0x1095: + case 0x1209: + case 0x1229: + case 0x2449: + case 0x2459: + case 0x245D: + case 0x27DC: + break; + default: + return; + } + + /* + * Some firmware hands off the e100 with interrupts enabled, + * which can cause a flood of interrupts if packets are + * received before the driver attaches to the device. So + * disable all e100 interrupts here. The driver will + * re-enable them when it's ready. + */ + pci_read_config_word(dev, PCI_COMMAND, &command); + pci_read_config_dword(dev, PCI_BASE_ADDRESS_0, &bar); + + if (!(command & PCI_COMMAND_MEMORY) || !bar) + return; + + csr = ioremap(bar, 8); + if (!csr) { + printk(KERN_WARNING "PCI: Can't map %s e100 registers\n", + pci_name(dev)); + return; + } + + cmd_hi = readb(csr + 3); + if (cmd_hi == 0) { + printk(KERN_WARNING "PCI: Firmware left %s e100 interrupts " + "enabled, disabling\n", pci_name(dev)); + writeb(1, csr + 3); + } + + iounmap(csr); +} +DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_ANY_ID, quirk_e100_interrupt); static void __devinit fixup_rev1_53c810(struct pci_dev* dev) { @@ -1485,6 +1644,25 @@ static void __devinit quirk_p64h2_1k_io(struct pci_dev *dev) } DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1460, quirk_p64h2_1k_io); +/* Under some circumstances, AER is not linked with extended capabilities. + * Force it to be linked by setting the corresponding control bit in the + * config space. + */ +static void __devinit quirk_nvidia_ck804_pcie_aer_ext_cap(struct pci_dev *dev) +{ + uint8_t b; + if (pci_read_config_byte(dev, 0xf41, &b) == 0) { + if (!(b & 0x20)) { + pci_write_config_byte(dev, 0xf41, b | 0x20); + printk(KERN_INFO + "PCI: Linking AER extended capability on %s\n", + pci_name(dev)); + } + } +} +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_CK804_PCIE, + quirk_nvidia_ck804_pcie_aer_ext_cap); + EXPORT_SYMBOL(pcie_mch_quirk); #ifdef CONFIG_HOTPLUG EXPORT_SYMBOL(pci_fixup_device); diff --git a/drivers/pci/remove.c b/drivers/pci/remove.c index 1a6bf9de1..99ffbd478 100644 --- a/drivers/pci/remove.c +++ b/drivers/pci/remove.c @@ -22,18 +22,18 @@ static void pci_destroy_dev(struct pci_dev *dev) pci_proc_detach_device(dev); pci_remove_sysfs_dev_files(dev); device_unregister(&dev->dev); - spin_lock(&pci_bus_lock); + down_write(&pci_bus_sem); list_del(&dev->global_list); dev->global_list.next = dev->global_list.prev = NULL; - spin_unlock(&pci_bus_lock); + up_write(&pci_bus_sem); } /* Remove the device from the device lists, and prevent any further * list accesses from this device */ - spin_lock(&pci_bus_lock); + down_write(&pci_bus_sem); list_del(&dev->bus_list); dev->bus_list.next = dev->bus_list.prev = NULL; - spin_unlock(&pci_bus_lock); + up_write(&pci_bus_sem); pci_free_resources(dev); pci_dev_put(dev); @@ -62,9 +62,9 @@ void pci_remove_bus(struct pci_bus *pci_bus) { pci_proc_detach_bus(pci_bus); - spin_lock(&pci_bus_lock); + down_write(&pci_bus_sem); list_del(&pci_bus->node); - spin_unlock(&pci_bus_lock); + up_write(&pci_bus_sem); pci_remove_legacy_files(pci_bus); class_device_remove_file(&pci_bus->class_dev, &class_device_attr_cpuaffinity); diff --git a/drivers/pci/rom.c b/drivers/pci/rom.c index 598a115cd..f5ee7ce16 100644 --- a/drivers/pci/rom.c +++ b/drivers/pci/rom.c @@ -6,7 +6,6 @@ * * PCI ROM access routines */ -#include #include #include #include @@ -80,8 +79,8 @@ void __iomem *pci_map_rom(struct pci_dev *pdev, size_t *size) } else { if (res->flags & IORESOURCE_ROM_COPY) { *size = pci_resource_len(pdev, PCI_ROM_RESOURCE); - return (void __iomem *)pci_resource_start(pdev, - PCI_ROM_RESOURCE); + return (void __iomem *)(unsigned long) + pci_resource_start(pdev, PCI_ROM_RESOURCE); } else { /* assign the ROM an address if it doesn't have one */ if (res->parent == NULL && @@ -170,11 +169,11 @@ void __iomem *pci_map_rom_copy(struct pci_dev *pdev, size_t *size) return rom; res->end = res->start + *size; - memcpy_fromio((void*)res->start, rom, *size); + memcpy_fromio((void*)(unsigned long)res->start, rom, *size); pci_unmap_rom(pdev, rom); res->flags |= IORESOURCE_ROM_COPY; - return (void __iomem *)res->start; + return (void __iomem *)(unsigned long)res->start; } /** @@ -227,7 +226,7 @@ void pci_cleanup_rom(struct pci_dev *pdev) { struct resource *res = &pdev->resource[PCI_ROM_RESOURCE]; if (res->flags & IORESOURCE_ROM_COPY) { - kfree((void*)res->start); + kfree((void*)(unsigned long)res->start); res->flags &= ~IORESOURCE_ROM_COPY; res->start = 0; res->end = 0; diff --git a/drivers/pci/search.c b/drivers/pci/search.c index ce7dd6e7b..d529462d1 100644 --- a/drivers/pci/search.c +++ b/drivers/pci/search.c @@ -13,7 +13,7 @@ #include #include "pci.h" -DEFINE_SPINLOCK(pci_bus_lock); +DECLARE_RWSEM(pci_bus_sem); static struct pci_bus * __devinit pci_do_find_bus(struct pci_bus* bus, unsigned char busnr) @@ -41,7 +41,7 @@ pci_do_find_bus(struct pci_bus* bus, unsigned char busnr) * in the global list of PCI buses. If the bus is found, a pointer to its * data structure is returned. If no bus is found, %NULL is returned. */ -struct pci_bus * __devinit pci_find_bus(int domain, int busnr) +struct pci_bus * pci_find_bus(int domain, int busnr) { struct pci_bus *bus = NULL; struct pci_bus *tmp_bus; @@ -61,7 +61,7 @@ struct pci_bus * __devinit pci_find_bus(int domain, int busnr) * @from: Previous PCI bus found, or %NULL for new search. * * Iterates through the list of known PCI busses. A new search is - * initiated by passing %NULL to the @from argument. Otherwise if + * initiated by passing %NULL as the @from argument. Otherwise if * @from is not %NULL, searches continue from next device on the * global list. */ @@ -72,11 +72,11 @@ pci_find_next_bus(const struct pci_bus *from) struct pci_bus *b = NULL; WARN_ON(in_interrupt()); - spin_lock(&pci_bus_lock); + down_read(&pci_bus_sem); n = from ? from->node.next : pci_root_buses.next; if (n != &pci_root_buses) b = pci_bus_b(n); - spin_unlock(&pci_bus_lock); + up_read(&pci_bus_sem); return b; } @@ -124,7 +124,7 @@ struct pci_dev * pci_get_slot(struct pci_bus *bus, unsigned int devfn) struct pci_dev *dev; WARN_ON(in_interrupt()); - spin_lock(&pci_bus_lock); + down_read(&pci_bus_sem); list_for_each(tmp, &bus->devices) { dev = pci_dev_b(tmp); @@ -135,7 +135,7 @@ struct pci_dev * pci_get_slot(struct pci_bus *bus, unsigned int devfn) dev = NULL; out: pci_dev_get(dev); - spin_unlock(&pci_bus_lock); + up_read(&pci_bus_sem); return dev; } @@ -148,13 +148,14 @@ struct pci_dev * pci_get_slot(struct pci_bus *bus, unsigned int devfn) * @from: Previous PCI device found in search, or %NULL for new search. * * Iterates through the list of known PCI devices. If a PCI device is - * found with a matching @vendor, @device, @ss_vendor and @ss_device, a pointer to its - * device structure is returned. Otherwise, %NULL is returned. - * A new search is initiated by passing %NULL to the @from argument. - * Otherwise if @from is not %NULL, searches continue from next device on the global list. + * found with a matching @vendor, @device, @ss_vendor and @ss_device, a + * pointer to its device structure is returned. Otherwise, %NULL is returned. + * A new search is initiated by passing %NULL as the @from argument. + * Otherwise if @from is not %NULL, searches continue from next device + * on the global list. * - * NOTE: Do not use this function anymore, use pci_get_subsys() instead, as - * the pci device returned by this function can disappear at any moment in + * NOTE: Do not use this function any more; use pci_get_subsys() instead, as + * the PCI device returned by this function can disappear at any moment in * time. */ static struct pci_dev * pci_find_subsys(unsigned int vendor, @@ -167,7 +168,7 @@ static struct pci_dev * pci_find_subsys(unsigned int vendor, struct pci_dev *dev; WARN_ON(in_interrupt()); - spin_lock(&pci_bus_lock); + down_read(&pci_bus_sem); n = from ? from->global_list.next : pci_devices.next; while (n && (n != &pci_devices)) { @@ -181,7 +182,7 @@ static struct pci_dev * pci_find_subsys(unsigned int vendor, } dev = NULL; exit: - spin_unlock(&pci_bus_lock); + up_read(&pci_bus_sem); return dev; } @@ -191,14 +192,15 @@ exit: * @device: PCI device id to match, or %PCI_ANY_ID to match all device ids * @from: Previous PCI device found in search, or %NULL for new search. * - * Iterates through the list of known PCI devices. If a PCI device is - * found with a matching @vendor and @device, a pointer to its device structure is + * Iterates through the list of known PCI devices. If a PCI device is found + * with a matching @vendor and @device, a pointer to its device structure is * returned. Otherwise, %NULL is returned. - * A new search is initiated by passing %NULL to the @from argument. - * Otherwise if @from is not %NULL, searches continue from next device on the global list. + * A new search is initiated by passing %NULL as the @from argument. + * Otherwise if @from is not %NULL, searches continue from next device + * on the global list. * - * NOTE: Do not use this function anymore, use pci_get_device() instead, as - * the pci device returned by this function can disappear at any moment in + * NOTE: Do not use this function any more; use pci_get_device() instead, as + * the PCI device returned by this function can disappear at any moment in * time. */ struct pci_dev * @@ -215,11 +217,11 @@ pci_find_device(unsigned int vendor, unsigned int device, const struct pci_dev * * @ss_device: PCI subsystem device id to match, or %PCI_ANY_ID to match all device ids * @from: Previous PCI device found in search, or %NULL for new search. * - * Iterates through the list of known PCI devices. If a PCI device is - * found with a matching @vendor, @device, @ss_vendor and @ss_device, a pointer to its + * Iterates through the list of known PCI devices. If a PCI device is found + * with a matching @vendor, @device, @ss_vendor and @ss_device, a pointer to its * device structure is returned, and the reference count to the device is * incremented. Otherwise, %NULL is returned. A new search is initiated by - * passing %NULL to the @from argument. Otherwise if @from is not %NULL, + * passing %NULL as the @from argument. Otherwise if @from is not %NULL, * searches continue from next device on the global list. * The reference count for @from is always decremented if it is not %NULL. */ @@ -232,7 +234,7 @@ pci_get_subsys(unsigned int vendor, unsigned int device, struct pci_dev *dev; WARN_ON(in_interrupt()); - spin_lock(&pci_bus_lock); + down_read(&pci_bus_sem); n = from ? from->global_list.next : pci_devices.next; while (n && (n != &pci_devices)) { @@ -247,7 +249,7 @@ pci_get_subsys(unsigned int vendor, unsigned int device, dev = NULL; exit: dev = pci_dev_get(dev); - spin_unlock(&pci_bus_lock); + up_read(&pci_bus_sem); pci_dev_put(from); return dev; } @@ -262,7 +264,7 @@ exit: * found with a matching @vendor and @device, the reference count to the * device is incremented and a pointer to its device structure is returned. * Otherwise, %NULL is returned. A new search is initiated by passing %NULL - * to the @from argument. Otherwise if @from is not %NULL, searches continue + * as the @from argument. Otherwise if @from is not %NULL, searches continue * from next device on the global list. The reference count for @from is * always decremented if it is not %NULL. */ @@ -279,11 +281,13 @@ pci_get_device(unsigned int vendor, unsigned int device, struct pci_dev *from) * @device: PCI device id to match, or %PCI_ANY_ID to match all device ids * @from: Previous PCI device found in search, or %NULL for new search. * - * Iterates through the list of known PCI devices in the reverse order of pci_find_device(). + * Iterates through the list of known PCI devices in the reverse order of + * pci_find_device(). * If a PCI device is found with a matching @vendor and @device, a pointer to * its device structure is returned. Otherwise, %NULL is returned. - * A new search is initiated by passing %NULL to the @from argument. - * Otherwise if @from is not %NULL, searches continue from previous device on the global list. + * A new search is initiated by passing %NULL as the @from argument. + * Otherwise if @from is not %NULL, searches continue from previous device + * on the global list. */ struct pci_dev * pci_find_device_reverse(unsigned int vendor, unsigned int device, const struct pci_dev *from) @@ -292,7 +296,7 @@ pci_find_device_reverse(unsigned int vendor, unsigned int device, const struct p struct pci_dev *dev; WARN_ON(in_interrupt()); - spin_lock(&pci_bus_lock); + down_read(&pci_bus_sem); n = from ? from->global_list.prev : pci_devices.prev; while (n && (n != &pci_devices)) { @@ -304,7 +308,7 @@ pci_find_device_reverse(unsigned int vendor, unsigned int device, const struct p } dev = NULL; exit: - spin_unlock(&pci_bus_lock); + up_read(&pci_bus_sem); return dev; } @@ -317,7 +321,7 @@ exit: * found with a matching @class, the reference count to the device is * incremented and a pointer to its device structure is returned. * Otherwise, %NULL is returned. - * A new search is initiated by passing %NULL to the @from argument. + * A new search is initiated by passing %NULL as the @from argument. * Otherwise if @from is not %NULL, searches continue from next device * on the global list. The reference count for @from is always decremented * if it is not %NULL. @@ -328,7 +332,7 @@ struct pci_dev *pci_get_class(unsigned int class, struct pci_dev *from) struct pci_dev *dev; WARN_ON(in_interrupt()); - spin_lock(&pci_bus_lock); + down_read(&pci_bus_sem); n = from ? from->global_list.next : pci_devices.next; while (n && (n != &pci_devices)) { @@ -340,7 +344,7 @@ struct pci_dev *pci_get_class(unsigned int class, struct pci_dev *from) dev = NULL; exit: dev = pci_dev_get(dev); - spin_unlock(&pci_bus_lock); + up_read(&pci_bus_sem); pci_dev_put(from); return dev; } @@ -362,7 +366,7 @@ int pci_dev_present(const struct pci_device_id *ids) int found = 0; WARN_ON(in_interrupt()); - spin_lock(&pci_bus_lock); + down_read(&pci_bus_sem); while (ids->vendor || ids->subvendor || ids->class_mask) { list_for_each_entry(dev, &pci_devices, global_list) { if (pci_match_one_device(ids, dev)) { @@ -372,8 +376,8 @@ int pci_dev_present(const struct pci_device_id *ids) } ids++; } -exit: - spin_unlock(&pci_bus_lock); +exit: + up_read(&pci_bus_sem); return found; } EXPORT_SYMBOL(pci_dev_present); diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index 28ce3a7ee..47c1071ad 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c @@ -55,9 +55,10 @@ pbus_assign_resources_sorted(struct pci_bus *bus) list_for_each_entry(dev, &bus->devices, bus_list) { u16 class = dev->class >> 8; - /* Don't touch classless devices and host bridges. */ + /* Don't touch classless devices or host bridges or ioapics. */ if (class == PCI_CLASS_NOT_DEFINED || - class == PCI_CLASS_BRIDGE_HOST) + class == PCI_CLASS_BRIDGE_HOST || + class == PCI_CLASS_SYSTEM_PIC) continue; pdev_sort_resources(dev, &head); @@ -356,8 +357,10 @@ pbus_size_mem(struct pci_bus *bus, unsigned long mask, unsigned long type) order = __ffs(align) - 20; if (order > 11) { printk(KERN_WARNING "PCI: region %s/%d " - "too large: %lx-%lx\n", - pci_name(dev), i, r->start, r->end); + "too large: %llx-%llx\n", + pci_name(dev), i, + (unsigned long long)r->start, + (unsigned long long)r->end); r->flags = 0; continue; } diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c index ea9277b7f..38eade924 100644 --- a/drivers/pci/setup-res.c +++ b/drivers/pci/setup-res.c @@ -40,8 +40,9 @@ pci_update_resource(struct pci_dev *dev, struct resource *res, int resno) pcibios_resource_to_bus(dev, ®ion, res); - pr_debug(" got res [%lx:%lx] bus [%lx:%lx] flags %lx for " - "BAR %d of %s\n", res->start, res->end, + pr_debug(" got res [%llx:%llx] bus [%lx:%lx] flags %lx for " + "BAR %d of %s\n", (unsigned long long)res->start, + (unsigned long long)res->end, region.start, region.end, res->flags, resno, pci_name(dev)); new = region.start | (res->flags & PCI_REGION_FLAG_MASK); @@ -104,10 +105,12 @@ pci_claim_resource(struct pci_dev *dev, int resource) err = insert_resource(root, res); if (err) { - printk(KERN_ERR "PCI: %s region %d of %s %s [%lx:%lx]\n", - root ? "Address space collision on" : - "No parent found for", - resource, dtype, pci_name(dev), res->start, res->end); + printk(KERN_ERR "PCI: %s region %d of %s %s [%llx:%llx]\n", + root ? "Address space collision on" : + "No parent found for", + resource, dtype, pci_name(dev), + (unsigned long long)res->start, + (unsigned long long)res->end); } return err; @@ -118,7 +121,7 @@ int pci_assign_resource(struct pci_dev *dev, int resno) { struct pci_bus *bus = dev->bus; struct resource *res = dev->resource + resno; - unsigned long size, min, align; + resource_size_t size, min, align; int ret; size = res->end - res->start + 1; @@ -145,9 +148,11 @@ int pci_assign_resource(struct pci_dev *dev, int resno) } if (ret) { - printk(KERN_ERR "PCI: Failed to allocate %s resource #%d:%lx@%lx for %s\n", - res->flags & IORESOURCE_IO ? "I/O" : "mem", - resno, size, res->start, pci_name(dev)); + printk(KERN_DEBUG "PCI: Failed to allocate %s resource " + "#%d:%llx@%llx for %s\n", + res->flags & IORESOURCE_IO ? "I/O" : "mem", + resno, (unsigned long long)size, + (unsigned long long)res->start, pci_name(dev)); } else if (resno < PCI_BRIDGE_RESOURCES) { pci_update_resource(dev, res, resno); } @@ -155,6 +160,46 @@ int pci_assign_resource(struct pci_dev *dev, int resno) return ret; } +#ifdef CONFIG_EMBEDDED +int pci_assign_resource_fixed(struct pci_dev *dev, int resno) +{ + struct pci_bus *bus = dev->bus; + struct resource *res = dev->resource + resno; + unsigned int type_mask; + int i, ret = -EBUSY; + + type_mask = IORESOURCE_IO | IORESOURCE_MEM | IORESOURCE_PREFETCH; + + for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) { + struct resource *r = bus->resource[i]; + if (!r) + continue; + + /* type_mask must match */ + if ((res->flags ^ r->flags) & type_mask) + continue; + + ret = request_resource(r, res); + + if (ret == 0) + break; + } + + if (ret) { + printk(KERN_DEBUG "PCI: Failed to allocate %s resource " + "#%d:%llx@%llx for %s\n", + res->flags & IORESOURCE_IO ? "I/O" : "mem", + resno, (unsigned long long)(res->end - res->start + 1), + (unsigned long long)res->start, pci_name(dev)); + } else if (resno < PCI_BRIDGE_RESOURCES) { + pci_update_resource(dev, res, resno); + } + + return ret; +} +EXPORT_SYMBOL_GPL(pci_assign_resource_fixed); +#endif + /* Sort resources by alignment */ void __devinit pdev_sort_resources(struct pci_dev *dev, struct resource_list *head) @@ -164,7 +209,7 @@ pdev_sort_resources(struct pci_dev *dev, struct resource_list *head) for (i = 0; i < PCI_NUM_RESOURCES; i++) { struct resource *r; struct resource_list *list, *tmp; - unsigned long r_align; + resource_size_t r_align; r = &dev->resource[i]; r_align = r->end - r->start; @@ -173,13 +218,14 @@ pdev_sort_resources(struct pci_dev *dev, struct resource_list *head) continue; if (!r_align) { printk(KERN_WARNING "PCI: Ignore bogus resource %d " - "[%lx:%lx] of %s\n", - i, r->start, r->end, pci_name(dev)); + "[%llx:%llx] of %s\n", + i, (unsigned long long)r->start, + (unsigned long long)r->end, pci_name(dev)); continue; } r_align = (i < PCI_BRIDGE_RESOURCES) ? r_align + 1 : r->start; for (list = head; ; list = list->next) { - unsigned long align = 0; + resource_size_t align = 0; struct resource_list *ln = list->next; int idx; diff --git a/drivers/pcmcia/Kconfig b/drivers/pcmcia/Kconfig index 61cb4b29f..35f88649d 100644 --- a/drivers/pcmcia/Kconfig +++ b/drivers/pcmcia/Kconfig @@ -6,7 +6,7 @@ menu "PCCARD (PCMCIA/CardBus) support" config PCCARD tristate "PCCard (PCMCIA/CardBus) support" - select HOTPLUG + depends on HOTPLUG ---help--- Say Y here if you want to attach PCMCIA- or PC-cards to your Linux computer. These are credit-card size devices such as network cards, diff --git a/drivers/pcmcia/at91_cf.c b/drivers/pcmcia/at91_cf.c index a4d50940e..40569f40e 100644 --- a/drivers/pcmcia/at91_cf.c +++ b/drivers/pcmcia/at91_cf.c @@ -214,11 +214,10 @@ static struct pccard_operations at91_cf_ops = { /*--------------------------------------------------------------------------*/ -static int __init at91_cf_probe(struct device *dev) +static int __init at91_cf_probe(struct platform_device *pdev) { struct at91_cf_socket *cf; - struct at91_cf_data *board = dev->platform_data; - struct platform_device *pdev = to_platform_device(dev); + struct at91_cf_data *board = pdev->dev.platform_data; struct resource *io; unsigned int csa; int status; @@ -236,7 +235,7 @@ static int __init at91_cf_probe(struct device *dev) cf->board = board; cf->pdev = pdev; - dev_set_drvdata(dev, cf); + platform_set_drvdata(pdev, cf); /* CF takes over CS4, CS5, CS6 */ csa = at91_sys_read(AT91_EBI_CSA); @@ -268,9 +267,10 @@ static int __init at91_cf_probe(struct device *dev) /* must be a GPIO; ergo must trigger on both edges */ status = request_irq(board->det_pin, at91_cf_irq, - SA_SAMPLE_RANDOM, driver_name, cf); + IRQF_SAMPLE_RANDOM, driver_name, cf); if (status < 0) goto fail0; + device_init_wakeup(&pdev->dev, 1); /* * The card driver will request this irq later as needed. @@ -280,7 +280,7 @@ static int __init at91_cf_probe(struct device *dev) */ if (board->irq_pin) { status = request_irq(board->irq_pin, at91_cf_irq, - SA_SHIRQ, driver_name, cf); + IRQF_SHARED, driver_name, cf); if (status < 0) goto fail0a; cf->socket.pci_irq = board->irq_pin; @@ -301,7 +301,7 @@ static int __init at91_cf_probe(struct device *dev) board->det_pin, board->irq_pin); cf->socket.owner = THIS_MODULE; - cf->socket.dev.dev = dev; + cf->socket.dev.dev = &pdev->dev; cf->socket.ops = &at91_cf_ops; cf->socket.resource_ops = &pccard_static_ops; cf->socket.features = SS_CAP_PCCARD | SS_CAP_STATIC_MAP @@ -323,21 +323,25 @@ fail1: free_irq(board->irq_pin, cf); fail0a: free_irq(board->det_pin, cf); + device_init_wakeup(&pdev->dev, 0); fail0: at91_sys_write(AT91_EBI_CSA, csa); kfree(cf); return status; } -static int __exit at91_cf_remove(struct device *dev) +static int __exit at91_cf_remove(struct platform_device *pdev) { - struct at91_cf_socket *cf = dev_get_drvdata(dev); + struct at91_cf_socket *cf = platform_get_drvdata(pdev); + struct at91_cf_data *board = cf->board; struct resource *io = cf->socket.io[0].res; unsigned int csa; pcmcia_unregister_socket(&cf->socket); - free_irq(cf->board->irq_pin, cf); - free_irq(cf->board->det_pin, cf); + if (board->irq_pin) + free_irq(board->irq_pin, cf); + free_irq(board->det_pin, cf); + device_init_wakeup(&pdev->dev, 0); iounmap((void __iomem *) cf->socket.io_offset); release_mem_region(io->start, io->end + 1 - io->start); @@ -348,26 +352,65 @@ static int __exit at91_cf_remove(struct device *dev) return 0; } -static struct device_driver at91_cf_driver = { - .name = (char *) driver_name, - .bus = &platform_bus_type, +#ifdef CONFIG_PM + +static int at91_cf_suspend(struct platform_device *pdev, pm_message_t mesg) +{ + struct at91_cf_socket *cf = platform_get_drvdata(pdev); + struct at91_cf_data *board = cf->board; + + pcmcia_socket_dev_suspend(&pdev->dev, mesg); + if (device_may_wakeup(&pdev->dev)) + enable_irq_wake(board->det_pin); + else { + disable_irq_wake(board->det_pin); + disable_irq(board->det_pin); + } + if (board->irq_pin) + disable_irq(board->irq_pin); + return 0; +} + +static int at91_cf_resume(struct platform_device *pdev) +{ + struct at91_cf_socket *cf = platform_get_drvdata(pdev); + struct at91_cf_data *board = cf->board; + + if (board->irq_pin) + enable_irq(board->irq_pin); + if (!device_may_wakeup(&pdev->dev)) + enable_irq(board->det_pin); + pcmcia_socket_dev_resume(&pdev->dev); + return 0; +} + +#else +#define at91_cf_suspend NULL +#define at91_cf_resume NULL +#endif + +static struct platform_driver at91_cf_driver = { + .driver = { + .name = (char *) driver_name, + .owner = THIS_MODULE, + }, .probe = at91_cf_probe, .remove = __exit_p(at91_cf_remove), - .suspend = pcmcia_socket_dev_suspend, - .resume = pcmcia_socket_dev_resume, + .suspend = at91_cf_suspend, + .resume = at91_cf_resume, }; /*--------------------------------------------------------------------------*/ static int __init at91_cf_init(void) { - return driver_register(&at91_cf_driver); + return platform_driver_register(&at91_cf_driver); } module_init(at91_cf_init); static void __exit at91_cf_exit(void) { - driver_unregister(&at91_cf_driver); + platform_driver_unregister(&at91_cf_driver); } module_exit(at91_cf_exit); diff --git a/drivers/pcmcia/au1000_db1x00.c b/drivers/pcmcia/au1000_db1x00.c index 42cf8bfbc..74e051535 100644 --- a/drivers/pcmcia/au1000_db1x00.c +++ b/drivers/pcmcia/au1000_db1x00.c @@ -40,7 +40,15 @@ #include #include #include -#include + +#if defined(CONFIG_MIPS_DB1200) + #include +#elif defined(CONFIG_MIPS_PB1200) + #include +#else + #include + static BCSR * const bcsr = (BCSR *)BCSR_KSEG1_ADDR; +#endif #include "au1000_generic.h" @@ -50,7 +58,6 @@ #define debug(x,args...) #endif -static BCSR * const bcsr = (BCSR *)BCSR_KSEG1_ADDR; struct au1000_pcmcia_socket au1000_pcmcia_socket[PCMCIA_NUM_SOCKS]; extern int au1x00_pcmcia_socket_probe(struct device *, struct pcmcia_low_level *, int, int); @@ -59,6 +66,8 @@ static int db1x00_pcmcia_hw_init(struct au1000_pcmcia_socket *skt) { #ifdef CONFIG_MIPS_DB1550 skt->irq = skt->nr ? AU1000_GPIO_5 : AU1000_GPIO_3; +#elif defined(CONFIG_MIPS_DB1200) || defined(CONFIG_MIPS_PB1200) + skt->irq = skt->nr ? BOARD_PC1_INT : BOARD_PC0_INT; #else skt->irq = skt->nr ? AU1000_GPIO_5 : AU1000_GPIO_2; #endif @@ -85,11 +94,19 @@ db1x00_pcmcia_socket_state(struct au1000_pcmcia_socket *skt, struct pcmcia_state switch (skt->nr) { case 0: vs = bcsr->status & 0x3; +#if defined(CONFIG_MIPS_DB1200) || defined(CONFIG_MIPS_PB1200) + inserted = BOARD_CARD_INSERTED(0); +#else inserted = !(bcsr->status & (1<<4)); +#endif break; case 1: vs = (bcsr->status & 0xC)>>2; +#if defined(CONFIG_MIPS_DB1200) || defined(CONFIG_MIPS_PB1200) + inserted = BOARD_CARD_INSERTED(1); +#else inserted = !(bcsr->status & (1<<5)); +#endif break; default:/* should never happen */ return; @@ -278,7 +295,7 @@ struct pcmcia_low_level db1x00_pcmcia_ops = { .socket_suspend = db1x00_socket_suspend }; -int __init au1x_board_init(struct device *dev) +int au1x_board_init(struct device *dev) { int ret = -ENODEV; bcsr->pcmcia = 0; /* turn off power, if it's not already off */ diff --git a/drivers/pcmcia/au1000_generic.c b/drivers/pcmcia/au1000_generic.c index 971a35281..d5dd0ce65 100644 --- a/drivers/pcmcia/au1000_generic.c +++ b/drivers/pcmcia/au1000_generic.c @@ -33,7 +33,6 @@ #include #include #include -#include #include #include #include diff --git a/drivers/pcmcia/au1000_generic.h b/drivers/pcmcia/au1000_generic.h index 417bc1500..1e467bb54 100644 --- a/drivers/pcmcia/au1000_generic.h +++ b/drivers/pcmcia/au1000_generic.h @@ -22,7 +22,7 @@ #define __ASM_AU1000_PCMCIA_H /* include the world */ -#include + #include #include #include @@ -45,13 +45,13 @@ /* pcmcia socket 1 needs external glue logic so the memory map * differs from board to board. */ -#if defined(CONFIG_MIPS_PB1000) || defined(CONFIG_MIPS_PB1100) || defined(CONFIG_MIPS_PB1500) || defined(CONFIG_MIPS_PB1550) +#if defined(CONFIG_MIPS_PB1000) || defined(CONFIG_MIPS_PB1100) || defined(CONFIG_MIPS_PB1500) || defined(CONFIG_MIPS_PB1550) || defined(CONFIG_MIPS_PB1200) #define AU1X_SOCK1_IO 0xF08000000 #define AU1X_SOCK1_PHYS_ATTR 0xF48000000 #define AU1X_SOCK1_PHYS_MEM 0xF88000000 #define AU1X_SOCK1_PSEUDO_PHYS_ATTR 0xF4800000 #define AU1X_SOCK1_PSEUDO_PHYS_MEM 0xF8800000 -#elif defined(CONFIG_MIPS_DB1000) || defined(CONFIG_MIPS_DB1100) || defined(CONFIG_MIPS_DB1500) || defined(CONFIG_MIPS_DB1550) +#elif defined(CONFIG_MIPS_DB1000) || defined(CONFIG_MIPS_DB1100) || defined(CONFIG_MIPS_DB1500) || defined(CONFIG_MIPS_DB1550) || defined(CONFIG_MIPS_DB1200) #define AU1X_SOCK1_IO 0xF04000000 #define AU1X_SOCK1_PHYS_ATTR 0xF44000000 #define AU1X_SOCK1_PHYS_MEM 0xF84000000 diff --git a/drivers/pcmcia/au1000_pb1x00.c b/drivers/pcmcia/au1000_pb1x00.c index fd5522ede..86c0808d6 100644 --- a/drivers/pcmcia/au1000_pb1x00.c +++ b/drivers/pcmcia/au1000_pb1x00.c @@ -21,7 +21,6 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. */ -#include #include #include #include diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c index 316299857..f9cd831a3 100644 --- a/drivers/pcmcia/cs.c +++ b/drivers/pcmcia/cs.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -176,6 +177,7 @@ static int pccardd(void *__skt); */ int pcmcia_register_socket(struct pcmcia_socket *socket) { + struct task_struct *tsk; int ret; if (!socket || !socket->ops || !socket->dev.dev || !socket->resource_ops) @@ -239,15 +241,18 @@ int pcmcia_register_socket(struct pcmcia_socket *socket) mutex_init(&socket->skt_mutex); spin_lock_init(&socket->thread_lock); - ret = kernel_thread(pccardd, socket, CLONE_KERNEL); - if (ret < 0) + tsk = kthread_run(pccardd, socket, "pccardd"); + if (IS_ERR(tsk)) { + ret = PTR_ERR(tsk); goto err; + } wait_for_completion(&socket->thread_done); - if(!socket->thread) { + if (!socket->thread) { printk(KERN_WARNING "PCMCIA: warning: socket thread for socket %p did not start\n", socket); return -EIO; } + pcmcia_parse_events(socket, SS_DETECT); return 0; @@ -272,10 +277,8 @@ void pcmcia_unregister_socket(struct pcmcia_socket *socket) cs_dbg(socket, 0, "pcmcia_unregister_socket(0x%p)\n", socket->ops); if (socket->thread) { - init_completion(&socket->thread_done); - socket->thread = NULL; wake_up(&socket->thread_wait); - wait_for_completion(&socket->thread_done); + kthread_stop(socket->thread); } release_cis_mem(socket); @@ -630,8 +633,6 @@ static int pccardd(void *__skt) DECLARE_WAITQUEUE(wait, current); int ret; - daemonize("pccardd"); - skt->thread = current; skt->socket = dead_socket; skt->ops->init(skt); @@ -643,7 +644,8 @@ static int pccardd(void *__skt) printk(KERN_WARNING "PCMCIA: unable to register socket 0x%p\n", skt); skt->thread = NULL; - complete_and_exit(&skt->thread_done, 0); + complete(&skt->thread_done); + return 0; } add_wait_queue(&skt->thread_wait, &wait); @@ -674,7 +676,7 @@ static int pccardd(void *__skt) continue; } - if (!skt->thread) + if (kthread_should_stop()) break; schedule(); @@ -688,7 +690,7 @@ static int pccardd(void *__skt) /* remove from the device core */ class_device_unregister(&skt->dev); - complete_and_exit(&skt->thread_done, 0); + return 0; } /* @@ -697,11 +699,12 @@ static int pccardd(void *__skt) */ void pcmcia_parse_events(struct pcmcia_socket *s, u_int events) { + unsigned long flags; cs_dbg(s, 4, "parse_events: events %08x\n", events); if (s->thread) { - spin_lock(&s->thread_lock); + spin_lock_irqsave(&s->thread_lock, flags); s->thread_events |= events; - spin_unlock(&s->thread_lock); + spin_unlock_irqrestore(&s->thread_lock, flags); wake_up(&s->thread_wait); } diff --git a/drivers/pcmcia/hd64465_ss.c b/drivers/pcmcia/hd64465_ss.c index b39435bbf..ad02629c8 100644 --- a/drivers/pcmcia/hd64465_ss.c +++ b/drivers/pcmcia/hd64465_ss.c @@ -244,8 +244,8 @@ static void hs_map_irq(hs_socket_t *sp, unsigned int irq) hs_mapped_irq[irq].sock = sp; /* insert ourselves as the irq controller */ - hs_mapped_irq[irq].old_handler = irq_desc[irq].handler; - irq_desc[irq].handler = &hd64465_ss_irq_type; + hs_mapped_irq[irq].old_handler = irq_desc[irq].chip; + irq_desc[irq].chip = &hd64465_ss_irq_type; } @@ -260,7 +260,7 @@ static void hs_unmap_irq(hs_socket_t *sp, unsigned int irq) return; /* restore the original irq controller */ - irq_desc[irq].handler = hs_mapped_irq[irq].old_handler; + irq_desc[irq].chip = hs_mapped_irq[irq].old_handler; } /*============================================================*/ @@ -761,7 +761,7 @@ static int hs_init_socket(hs_socket_t *sp, int irq, unsigned long mem_base, hd64465_register_irq_demux(sp->irq, hs_irq_demux, sp); - if ((err = request_irq(sp->irq, hs_interrupt, SA_INTERRUPT, MODNAME, sp)) < 0) + if ((err = request_irq(sp->irq, hs_interrupt, IRQF_DISABLED, MODNAME, sp)) < 0) return err; if (request_mem_region(sp->mem_base, sp->mem_length, MODNAME) == 0) { sp->mem_base = 0; diff --git a/drivers/pcmcia/i82092.c b/drivers/pcmcia/i82092.c index d5f03a338..2163aa75a 100644 --- a/drivers/pcmcia/i82092.c +++ b/drivers/pcmcia/i82092.c @@ -149,7 +149,7 @@ static int __devinit i82092aa_pci_probe(struct pci_dev *dev, const struct pci_de /* Register the interrupt handler */ dprintk(KERN_DEBUG "Requesting interrupt %i \n",dev->irq); - if ((ret = request_irq(dev->irq, i82092aa_interrupt, SA_SHIRQ, "i82092aa", i82092aa_interrupt))) { + if ((ret = request_irq(dev->irq, i82092aa_interrupt, IRQF_SHARED, "i82092aa", i82092aa_interrupt))) { printk(KERN_ERR "i82092aa: Failed to register IRQ %d, aborting\n", dev->irq); goto err_out_free_res; } diff --git a/drivers/pcmcia/i82365.c b/drivers/pcmcia/i82365.c index a2f05f485..1cc268239 100644 --- a/drivers/pcmcia/i82365.c +++ b/drivers/pcmcia/i82365.c @@ -509,7 +509,7 @@ static irqreturn_t i365_count_irq(int irq, void *dev, struct pt_regs *regs) static u_int __init test_irq(u_short sock, int irq) { debug(2, " testing ISA irq %d\n", irq); - if (request_irq(irq, i365_count_irq, SA_PROBEIRQ, "scan", + if (request_irq(irq, i365_count_irq, IRQF_PROBE_SHARED, "scan", i365_count_irq) != 0) return 1; irq_hits = 0; irq_sock = sock; @@ -562,7 +562,7 @@ static u_int __init isa_scan(u_short sock, u_int mask0) } else { /* Fallback: just find interrupts that aren't in use */ for (i = 0; i < 16; i++) - if ((mask0 & (1 << i)) && (_check_irq(i, SA_PROBEIRQ) == 0)) + if ((mask0 & (1 << i)) && (_check_irq(i, IRQF_PROBE_SHARED) == 0)) mask1 |= (1 << i); printk("default"); /* If scan failed, default to polled status */ @@ -726,7 +726,7 @@ static void __init add_pcic(int ns, int type) u_int cs_mask = mask & ((cs_irq) ? (1< 0; cs_irq--) if ((cs_mask & (1 << cs_irq)) && - (_check_irq(cs_irq, SA_PROBEIRQ) == 0)) + (_check_irq(cs_irq, IRQF_PROBE_SHARED) == 0)) break; if (cs_irq) { grab_irq = 1; @@ -1084,9 +1084,10 @@ static int i365_set_mem_map(u_short sock, struct pccard_mem_map *mem) u_short base, i; u_char map; - debug(1, "SetMemMap(%d, %d, %#2.2x, %d ns, %#lx-%#lx, " + debug(1, "SetMemMap(%d, %d, %#2.2x, %d ns, %#llx-%#llx, " "%#x)\n", sock, mem->map, mem->flags, mem->speed, - mem->res->start, mem->res->end, mem->card_start); + (unsigned long long)mem->res->start, + (unsigned long long)mem->res->end, mem->card_start); map = mem->map; if ((map > 4) || (mem->card_start > 0x3ffffff) || diff --git a/drivers/pcmcia/m32r_cfc.c b/drivers/pcmcia/m32r_cfc.c index 071cf485e..9e768eaef 100644 --- a/drivers/pcmcia/m32r_cfc.c +++ b/drivers/pcmcia/m32r_cfc.c @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include diff --git a/drivers/pcmcia/m32r_pcc.c b/drivers/pcmcia/m32r_pcc.c index 70d5f0748..61d50b562 100644 --- a/drivers/pcmcia/m32r_pcc.c +++ b/drivers/pcmcia/m32r_pcc.c @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include diff --git a/drivers/pcmcia/m8xx_pcmcia.c b/drivers/pcmcia/m8xx_pcmcia.c index 0e07d9535..d0f68ab8f 100644 --- a/drivers/pcmcia/m8xx_pcmcia.c +++ b/drivers/pcmcia/m8xx_pcmcia.c @@ -157,7 +157,7 @@ MODULE_LICENSE("Dual MPL/GPL"); static int pcmcia_schlvl = PCMCIA_SCHLVL; -static spinlock_t events_lock = SPIN_LOCK_UNLOCKED; +static DEFINE_SPINLOCK(events_lock); #define PCMCIA_SOCKET_KEY_5V 1 @@ -644,7 +644,7 @@ static struct platform_device m8xx_device = { }; static u32 pending_events[PCMCIA_SOCKETS_NO]; -static spinlock_t pending_event_lock = SPIN_LOCK_UNLOCKED; +static DEFINE_SPINLOCK(pending_event_lock); static irqreturn_t m8xx_interrupt(int irq, void *dev, struct pt_regs *regs) { diff --git a/drivers/pcmcia/omap_cf.c b/drivers/pcmcia/omap_cf.c index 2c23d7584..420e10aec 100644 --- a/drivers/pcmcia/omap_cf.c +++ b/drivers/pcmcia/omap_cf.c @@ -232,7 +232,7 @@ static int __init omap_cf_probe(struct device *dev) dev_set_drvdata(dev, cf); /* this primarily just shuts up irq handling noise */ - status = request_irq(irq, omap_cf_irq, SA_SHIRQ, + status = request_irq(irq, omap_cf_irq, IRQF_SHARED, driver_name, cf); if (status < 0) goto fail0; diff --git a/drivers/pcmcia/pcmcia_ioctl.c b/drivers/pcmcia/pcmcia_ioctl.c index 738b1ef59..9ad18e626 100644 --- a/drivers/pcmcia/pcmcia_ioctl.c +++ b/drivers/pcmcia/pcmcia_ioctl.c @@ -601,12 +601,8 @@ static int ds_ioctl(struct inode * inode, struct file * file, ret = CS_BAD_ARGS; else { struct pcmcia_device *p_dev = get_pcmcia_device(s, buf->config.Function); - if (p_dev == NULL) - ret = CS_BAD_ARGS; - else { - ret = pccard_get_configuration_info(s, p_dev, &buf->config); - pcmcia_put_dev(p_dev); - } + ret = pccard_get_configuration_info(s, p_dev, &buf->config); + pcmcia_put_dev(p_dev); } break; case DS_GET_FIRST_TUPLE: @@ -636,12 +632,8 @@ static int ds_ioctl(struct inode * inode, struct file * file, ret = CS_BAD_ARGS; else { struct pcmcia_device *p_dev = get_pcmcia_device(s, buf->status.Function); - if (p_dev == NULL) - ret = CS_BAD_ARGS; - else { - ret = pccard_get_status(s, p_dev, &buf->status); - pcmcia_put_dev(p_dev); - } + ret = pccard_get_status(s, p_dev, &buf->status); + pcmcia_put_dev(p_dev); } break; case DS_VALIDATE_CIS: diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c index 3131bb0a0..c8323399e 100644 --- a/drivers/pcmcia/pcmcia_resource.c +++ b/drivers/pcmcia/pcmcia_resource.c @@ -245,10 +245,17 @@ int pccard_get_configuration_info(struct pcmcia_socket *s, return CS_SUCCESS; } - /* !!! This is a hack !!! */ - memcpy(&config->Attributes, &c->Attributes, sizeof(config_t)); - config->Attributes |= CONF_VALID_CLIENT; - config->CardValues = c->CardValues; + config->Attributes = c->Attributes | CONF_VALID_CLIENT; + config->Vcc = s->socket.Vcc; + config->Vpp1 = config->Vpp2 = s->socket.Vpp; + config->IntType = c->IntType; + config->ConfigBase = c->ConfigBase; + config->Status = c->Status; + config->Pin = c->Pin; + config->Copy = c->Copy; + config->Option = c->Option; + config->ExtStatus = c->ExtStatus; + config->Present = config->CardValues = c->CardValues; config->IRQAttributes = c->irq.Attributes; config->AssignedIRQ = s->irq.AssignedIRQ; config->BasePort1 = c->io.BasePort1; @@ -788,6 +795,7 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req) struct pcmcia_socket *s = p_dev->socket; config_t *c; int ret = CS_IN_USE, irq = 0; + int type; if (!(s->state & SOCKET_PRESENT)) return CS_NO_CARD; @@ -797,6 +805,13 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req) if (c->state & CONFIG_IRQ_REQ) return CS_IN_USE; + /* Decide what type of interrupt we are registering */ + type = 0; + if (s->functions > 1) /* All of this ought to be handled higher up */ + type = IRQF_SHARED; + if (req->Attributes & IRQ_TYPE_DYNAMIC_SHARING) + type = IRQF_SHARED; + #ifdef CONFIG_PCMCIA_PROBE if (s->irq.AssignedIRQ != 0) { /* If the interrupt is already assigned, it must be the same */ @@ -822,9 +837,7 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req) * marked as used by the kernel resource management core */ ret = request_irq(irq, (req->Attributes & IRQ_HANDLE_PRESENT) ? req->Handler : test_action, - ((req->Attributes & IRQ_TYPE_DYNAMIC_SHARING) || - (s->functions > 1) || - (irq == s->pci_irq)) ? SA_SHIRQ : 0, + type, p_dev->devname, (req->Attributes & IRQ_HANDLE_PRESENT) ? req->Instance : data); if (!ret) { @@ -839,18 +852,21 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req) if (ret && !s->irq.AssignedIRQ) { if (!s->pci_irq) return ret; + type = IRQF_SHARED; irq = s->pci_irq; } - if (ret && req->Attributes & IRQ_HANDLE_PRESENT) { - if (request_irq(irq, req->Handler, - ((req->Attributes & IRQ_TYPE_DYNAMIC_SHARING) || - (s->functions > 1) || - (irq == s->pci_irq)) ? SA_SHIRQ : 0, - p_dev->devname, req->Instance)) + if (ret && (req->Attributes & IRQ_HANDLE_PRESENT)) { + if (request_irq(irq, req->Handler, type, p_dev->devname, req->Instance)) return CS_IN_USE; } + /* Make sure the fact the request type was overridden is passed back */ + if (type == IRQF_SHARED && !(req->Attributes & IRQ_TYPE_DYNAMIC_SHARING)) { + req->Attributes |= IRQ_TYPE_DYNAMIC_SHARING; + printk(KERN_WARNING "pcmcia: request for exclusive IRQ could not be fulfilled.\n"); + printk(KERN_WARNING "pcmcia: the driver needs updating to supported shared IRQ lines.\n"); + } c->irq.Attributes = req->Attributes; s->irq.AssignedIRQ = req->AssignedIRQ = irq; s->irq.Config++; diff --git a/drivers/pcmcia/pd6729.c b/drivers/pcmcia/pd6729.c index 20642f0e7..22c5e7427 100644 --- a/drivers/pcmcia/pd6729.c +++ b/drivers/pcmcia/pd6729.c @@ -8,7 +8,6 @@ */ #include -#include #include #include #include @@ -304,75 +303,6 @@ static int pd6729_get_status(struct pcmcia_socket *sock, u_int *value) } -static int pd6729_get_socket(struct pcmcia_socket *sock, socket_state_t *state) -{ - struct pd6729_socket *socket - = container_of(sock, struct pd6729_socket, socket); - unsigned char reg, vcc, vpp; - - state->flags = 0; - state->Vcc = 0; - state->Vpp = 0; - state->io_irq = 0; - state->csc_mask = 0; - - /* First the power status of the socket */ - reg = indirect_read(socket, I365_POWER); - - if (reg & I365_PWR_AUTO) - state->flags |= SS_PWR_AUTO; /* Automatic Power Switch */ - - if (reg & I365_PWR_OUT) - state->flags |= SS_OUTPUT_ENA; /* Output signals are enabled */ - - vcc = reg & I365_VCC_MASK; vpp = reg & I365_VPP1_MASK; - - if (reg & I365_VCC_5V) { - state->Vcc = (indirect_read(socket, PD67_MISC_CTL_1) & - PD67_MC1_VCC_3V) ? 33 : 50; - - if (vpp == I365_VPP1_5V) { - if (state->Vcc == 50) - state->Vpp = 50; - else - state->Vpp = 33; - } - if (vpp == I365_VPP1_12V) - state->Vpp = 120; - } - - /* Now the IO card, RESET flags and IO interrupt */ - reg = indirect_read(socket, I365_INTCTL); - - if ((reg & I365_PC_RESET) == 0) - state->flags |= SS_RESET; - if (reg & I365_PC_IOCARD) - state->flags |= SS_IOCARD; /* This is an IO card */ - - /* Set the IRQ number */ - state->io_irq = socket->card_irq; - - /* Card status change */ - reg = indirect_read(socket, I365_CSCINT); - - if (reg & I365_CSC_DETECT) - state->csc_mask |= SS_DETECT; /* Card detect is enabled */ - - if (state->flags & SS_IOCARD) {/* IO Cards behave different */ - if (reg & I365_CSC_STSCHG) - state->csc_mask |= SS_STSCHG; - } else { - if (reg & I365_CSC_BVD1) - state->csc_mask |= SS_BATDEAD; - if (reg & I365_CSC_BVD2) - state->csc_mask |= SS_BATWARN; - if (reg & I365_CSC_READY) - state->csc_mask |= SS_READY; - } - - return 0; -} - static int pd6729_set_socket(struct pcmcia_socket *sock, socket_state_t *state) { struct pd6729_socket *socket @@ -640,7 +570,6 @@ static int pd6729_init(struct pcmcia_socket *sock) static struct pccard_operations pd6729_operations = { .init = pd6729_init, .get_status = pd6729_get_status, - .get_socket = pd6729_get_socket, .set_socket = pd6729_set_socket, .set_io_map = pd6729_set_io_map, .set_mem_map = pd6729_set_mem_map, @@ -660,7 +589,7 @@ static int pd6729_check_irq(int irq, int flags) return 0; } -static u_int __init pd6729_isa_scan(void) +static u_int __devinit pd6729_isa_scan(void) { u_int mask0, mask = 0; int i; @@ -704,18 +633,17 @@ static int __devinit pd6729_pci_probe(struct pci_dev *dev, char configbyte; struct pd6729_socket *socket; - socket = kmalloc(sizeof(struct pd6729_socket) * MAX_SOCKETS, + socket = kzalloc(sizeof(struct pd6729_socket) * MAX_SOCKETS, GFP_KERNEL); if (!socket) return -ENOMEM; - memset(socket, 0, sizeof(struct pd6729_socket) * MAX_SOCKETS); - if ((ret = pci_enable_device(dev))) goto err_out_free_mem; printk(KERN_INFO "pd6729: Cirrus PD6729 PCI to PCMCIA Bridge " - "at 0x%lx on irq %d\n", pci_resource_start(dev, 0), dev->irq); + "at 0x%llx on irq %d\n", + (unsigned long long)pci_resource_start(dev, 0), dev->irq); /* * Since we have no memory BARs some firmware may not * have had PCI_COMMAND_MEMORY enabled, yet the device needs it. @@ -761,7 +689,7 @@ static int __devinit pd6729_pci_probe(struct pci_dev *dev, pci_set_drvdata(dev, socket); if (irq_mode == 1) { /* Register the interrupt handler */ - if ((ret = request_irq(dev->irq, pd6729_interrupt, SA_SHIRQ, + if ((ret = request_irq(dev->irq, pd6729_interrupt, IRQF_SHARED, "pd6729", socket))) { printk(KERN_ERR "pd6729: Failed to register irq %d, " "aborting\n", dev->irq); diff --git a/drivers/pcmcia/pxa2xx_base.c b/drivers/pcmcia/pxa2xx_base.c index 3e23cd461..b3518131e 100644 --- a/drivers/pcmcia/pxa2xx_base.c +++ b/drivers/pcmcia/pxa2xx_base.c @@ -18,11 +18,11 @@ #include #include -#include #include #include #include #include +#include #include #include @@ -205,32 +205,20 @@ int pxa2xx_drv_pcmcia_probe(struct device *dev) } EXPORT_SYMBOL(pxa2xx_drv_pcmcia_probe); -static int pxa2xx_drv_pcmcia_suspend(struct device *dev, pm_message_t state, u32 level) +static int pxa2xx_drv_pcmcia_resume(struct device *dev) { - int ret = 0; - if (level == SUSPEND_SAVE_STATE) - ret = pcmcia_socket_dev_suspend(dev, state); - return ret; -} + struct pcmcia_low_level *ops = dev->platform_data; + int nr = ops ? ops->nr : 0; -static int pxa2xx_drv_pcmcia_resume(struct device *dev, u32 level) -{ - int ret = 0; - if (level == RESUME_RESTORE_STATE) - { - struct pcmcia_low_level *ops = dev->platform_data; - int nr = ops ? ops->nr : 0; - - MECR = nr > 1 ? MECR_CIT | MECR_NOS : (nr > 0 ? MECR_CIT : 0); - ret = pcmcia_socket_dev_resume(dev); - } - return ret; + MECR = nr > 1 ? MECR_CIT | MECR_NOS : (nr > 0 ? MECR_CIT : 0); + + return pcmcia_socket_dev_resume(dev); } static struct device_driver pxa2xx_pcmcia_driver = { .probe = pxa2xx_drv_pcmcia_probe, .remove = soc_common_drv_pcmcia_remove, - .suspend = pxa2xx_drv_pcmcia_suspend, + .suspend = pcmcia_socket_dev_suspend, .resume = pxa2xx_drv_pcmcia_resume, .name = "pxa2xx-pcmcia", .bus = &platform_bus_type, @@ -246,7 +234,7 @@ static void __exit pxa2xx_pcmcia_exit(void) driver_unregister(&pxa2xx_pcmcia_driver); } -module_init(pxa2xx_pcmcia_init); +fs_initcall(pxa2xx_pcmcia_init); module_exit(pxa2xx_pcmcia_exit); MODULE_AUTHOR("Stefan Eletzhofer and Ian Molton "); diff --git a/drivers/pcmcia/rsrc_nonstatic.c b/drivers/pcmcia/rsrc_nonstatic.c index 5876bab7c..c3176b16b 100644 --- a/drivers/pcmcia/rsrc_nonstatic.c +++ b/drivers/pcmcia/rsrc_nonstatic.c @@ -12,7 +12,6 @@ * (C) 1999 David A. Hinds */ -#include #include #include #include @@ -61,7 +60,7 @@ struct socket_data { unsigned int rsrc_mem_probe; }; -static DECLARE_MUTEX(rsrc_sem); +static DEFINE_MUTEX(rsrc_mutex); #define MEM_PROBE_LOW (1 << 0) #define MEM_PROBE_HIGH (1 << 1) @@ -73,12 +72,11 @@ static DECLARE_MUTEX(rsrc_sem); ======================================================================*/ static struct resource * -make_resource(unsigned long b, unsigned long n, int flags, char *name) +make_resource(resource_size_t b, resource_size_t n, int flags, char *name) { - struct resource *res = kmalloc(sizeof(*res), GFP_KERNEL); + struct resource *res = kzalloc(sizeof(*res), GFP_KERNEL); if (res) { - memset(res, 0, sizeof(*res)); res->name = name; res->start = b; res->end = b + n - 1; @@ -88,8 +86,8 @@ make_resource(unsigned long b, unsigned long n, int flags, char *name) } static struct resource * -claim_region(struct pcmcia_socket *s, unsigned long base, unsigned long size, - int type, char *name) +claim_region(struct pcmcia_socket *s, resource_size_t base, + resource_size_t size, int type, char *name) { struct resource *res, *parent; @@ -200,12 +198,11 @@ static void do_io_probe(struct pcmcia_socket *s, kio_addr_t base, kio_addr_t num base, base+num-1); /* First, what does a floating port look like? */ - b = kmalloc(256, GFP_KERNEL); + b = kzalloc(256, GFP_KERNEL); if (!b) { printk(KERN_ERR "do_io_probe: unable to kmalloc 256 bytes"); return; } - memset(b, 0, 256); for (i = base, most = 0; i < base+num; i += 8) { res = claim_region(NULL, i, 8, IORESOURCE_IO, "PCMCIA IO probe"); if (!res) @@ -372,6 +369,9 @@ static int do_mem_probe(u_long base, u_long num, struct pcmcia_socket *s) base, base+num-1); bad = fail = 0; step = (num < 0x20000) ? 0x2000 : ((num>>4) & ~0x1fff); + /* don't allow too large steps */ + if (step > 0x800000) + step = 0x800000; /* cis_readable wants to map 2x map_size */ if (step < 2 * s->map_size) step = 2 * s->map_size; @@ -404,99 +404,111 @@ static int do_mem_probe(u_long base, u_long num, struct pcmcia_socket *s) static u_long inv_probe(struct resource_map *m, struct pcmcia_socket *s) { - struct socket_data *s_data = s->resource_data; - u_long ok; - if (m == &s_data->mem_db) - return 0; - ok = inv_probe(m->next, s); - if (ok) { - if (m->base >= 0x100000) - sub_interval(&s_data->mem_db, m->base, m->num); - return ok; - } - if (m->base < 0x100000) - return 0; - return do_mem_probe(m->base, m->num, s); + struct socket_data *s_data = s->resource_data; + u_long ok; + if (m == &s_data->mem_db) + return 0; + ok = inv_probe(m->next, s); + if (ok) { + if (m->base >= 0x100000) + sub_interval(&s_data->mem_db, m->base, m->num); + return ok; + } + if (m->base < 0x100000) + return 0; + return do_mem_probe(m->base, m->num, s); } -static void validate_mem(struct pcmcia_socket *s, unsigned int probe_mask) +static int validate_mem(struct pcmcia_socket *s, unsigned int probe_mask) { - struct resource_map *m, mm; - static u_char order[] = { 0xd0, 0xe0, 0xc0, 0xf0 }; - u_long b, i, ok = 0; - struct socket_data *s_data = s->resource_data; + struct resource_map *m, mm; + static unsigned char order[] = { 0xd0, 0xe0, 0xc0, 0xf0 }; + unsigned long b, i, ok = 0; + struct socket_data *s_data = s->resource_data; - /* We do up to four passes through the list */ - if (probe_mask & MEM_PROBE_HIGH) { - if (inv_probe(s_data->mem_db.next, s) > 0) - return; - printk(KERN_NOTICE "cs: warning: no high memory space " - "available!\n"); - } - if ((probe_mask & MEM_PROBE_LOW) == 0) - return; - for (m = s_data->mem_db.next; m != &s_data->mem_db; m = mm.next) { - mm = *m; - /* Only probe < 1 MB */ - if (mm.base >= 0x100000) continue; - if ((mm.base | mm.num) & 0xffff) { - ok += do_mem_probe(mm.base, mm.num, s); - continue; + /* We do up to four passes through the list */ + if (probe_mask & MEM_PROBE_HIGH) { + if (inv_probe(s_data->mem_db.next, s) > 0) + return 0; + printk(KERN_NOTICE "cs: warning: no high memory space " + "available!\n"); + return -ENODEV; } - /* Special probe for 64K-aligned block */ - for (i = 0; i < 4; i++) { - b = order[i] << 12; - if ((b >= mm.base) && (b+0x10000 <= mm.base+mm.num)) { - if (ok >= mem_limit) - sub_interval(&s_data->mem_db, b, 0x10000); - else - ok += do_mem_probe(b, 0x10000, s); - } + + for (m = s_data->mem_db.next; m != &s_data->mem_db; m = mm.next) { + mm = *m; + /* Only probe < 1 MB */ + if (mm.base >= 0x100000) + continue; + if ((mm.base | mm.num) & 0xffff) { + ok += do_mem_probe(mm.base, mm.num, s); + continue; + } + /* Special probe for 64K-aligned block */ + for (i = 0; i < 4; i++) { + b = order[i] << 12; + if ((b >= mm.base) && (b+0x10000 <= mm.base+mm.num)) { + if (ok >= mem_limit) + sub_interval(&s_data->mem_db, b, 0x10000); + else + ok += do_mem_probe(b, 0x10000, s); + } + } } - } + + if (ok > 0) + return 0; + + return -ENODEV; } #else /* CONFIG_PCMCIA_PROBE */ -static void validate_mem(struct pcmcia_socket *s, unsigned int probe_mask) +static int validate_mem(struct pcmcia_socket *s, unsigned int probe_mask) { struct resource_map *m, mm; struct socket_data *s_data = s->resource_data; + unsigned long ok = 0; for (m = s_data->mem_db.next; m != &s_data->mem_db; m = mm.next) { mm = *m; - if (do_mem_probe(mm.base, mm.num, s)) - break; + ok += do_mem_probe(mm.base, mm.num, s); } + if (ok > 0) + return 0; + return -ENODEV; } #endif /* CONFIG_PCMCIA_PROBE */ /* - * Locking note: Must be called with skt_sem held! + * Locking note: Must be called with skt_mutex held! */ -static void pcmcia_nonstatic_validate_mem(struct pcmcia_socket *s) +static int pcmcia_nonstatic_validate_mem(struct pcmcia_socket *s) { struct socket_data *s_data = s->resource_data; - if (probe_mem) { - unsigned int probe_mask; + unsigned int probe_mask = MEM_PROBE_LOW; + int ret = 0; + + if (!probe_mem) + return 0; - down(&rsrc_sem); + mutex_lock(&rsrc_mutex); - probe_mask = MEM_PROBE_LOW; - if (s->features & SS_CAP_PAGE_REGS) - probe_mask = MEM_PROBE_HIGH; + if (s->features & SS_CAP_PAGE_REGS) + probe_mask = MEM_PROBE_HIGH; - if (probe_mask & ~s_data->rsrc_mem_probe) { + if (probe_mask & ~s_data->rsrc_mem_probe) { + if (s->state & SOCKET_PRESENT) + ret = validate_mem(s, probe_mask); + if (!ret) s_data->rsrc_mem_probe |= probe_mask; + } - if (s->state & SOCKET_PRESENT) - validate_mem(s, probe_mask); - } + mutex_unlock(&rsrc_mutex); - up(&rsrc_sem); - } + return ret; } struct pcmcia_align_data { @@ -507,10 +519,10 @@ struct pcmcia_align_data { static void pcmcia_common_align(void *align_data, struct resource *res, - unsigned long size, unsigned long align) + resource_size_t size, resource_size_t align) { struct pcmcia_align_data *data = align_data; - unsigned long start; + resource_size_t start; /* * Ensure that we have the correct start address */ @@ -521,8 +533,8 @@ pcmcia_common_align(void *align_data, struct resource *res, } static void -pcmcia_align(void *align_data, struct resource *res, - unsigned long size, unsigned long align) +pcmcia_align(void *align_data, struct resource *res, resource_size_t size, + resource_size_t align) { struct pcmcia_align_data *data = align_data; struct resource_map *m; @@ -572,7 +584,7 @@ static int nonstatic_adjust_io_region(struct resource *res, unsigned long r_star struct socket_data *s_data = s->resource_data; int ret = -ENOMEM; - down(&rsrc_sem); + mutex_lock(&rsrc_mutex); for (m = s_data->io_db.next; m != &s_data->io_db; m = m->next) { unsigned long start = m->base; unsigned long end = m->base + m->num - 1; @@ -583,7 +595,7 @@ static int nonstatic_adjust_io_region(struct resource *res, unsigned long r_star ret = adjust_resource(res, r_start, r_end - r_start + 1); break; } - up(&rsrc_sem); + mutex_unlock(&rsrc_mutex); return ret; } @@ -601,7 +613,7 @@ static int nonstatic_adjust_io_region(struct resource *res, unsigned long r_star ======================================================================*/ -struct resource *nonstatic_find_io_region(unsigned long base, int num, +static struct resource *nonstatic_find_io_region(unsigned long base, int num, unsigned long align, struct pcmcia_socket *s) { struct resource *res = make_resource(0, num, IORESOURCE_IO, s->dev.class_id); @@ -617,7 +629,7 @@ struct resource *nonstatic_find_io_region(unsigned long base, int num, data.offset = base & data.mask; data.map = &s_data->io_db; - down(&rsrc_sem); + mutex_lock(&rsrc_mutex); #ifdef CONFIG_PCI if (s->cb_dev) { ret = pci_bus_alloc_resource(s->cb_dev->bus, res, num, 1, @@ -626,7 +638,7 @@ struct resource *nonstatic_find_io_region(unsigned long base, int num, #endif ret = allocate_resource(&ioport_resource, res, num, min, ~0UL, 1, pcmcia_align, &data); - up(&rsrc_sem); + mutex_unlock(&rsrc_mutex); if (ret != 0) { kfree(res); @@ -635,8 +647,8 @@ struct resource *nonstatic_find_io_region(unsigned long base, int num, return res; } -struct resource * nonstatic_find_mem_region(u_long base, u_long num, u_long align, - int low, struct pcmcia_socket *s) +static struct resource * nonstatic_find_mem_region(u_long base, u_long num, + u_long align, int low, struct pcmcia_socket *s) { struct resource *res = make_resource(0, num, IORESOURCE_MEM, s->dev.class_id); struct socket_data *s_data = s->resource_data; @@ -659,7 +671,7 @@ struct resource * nonstatic_find_mem_region(u_long base, u_long num, u_long alig min = 0x100000UL + base; } - down(&rsrc_sem); + mutex_lock(&rsrc_mutex); #ifdef CONFIG_PCI if (s->cb_dev) { ret = pci_bus_alloc_resource(s->cb_dev->bus, res, num, @@ -669,7 +681,7 @@ struct resource * nonstatic_find_mem_region(u_long base, u_long num, u_long alig #endif ret = allocate_resource(&iomem_resource, res, num, min, max, 1, pcmcia_align, &data); - up(&rsrc_sem); + mutex_unlock(&rsrc_mutex); if (ret == 0 || low) break; low = 1; @@ -683,27 +695,23 @@ struct resource * nonstatic_find_mem_region(u_long base, u_long num, u_long alig } -static int adjust_memory(struct pcmcia_socket *s, adjust_t *adj) +static int adjust_memory(struct pcmcia_socket *s, unsigned int action, unsigned long start, unsigned long end) { - u_long base, num; struct socket_data *data = s->resource_data; - int ret; - - base = adj->resource.memory.Base; - num = adj->resource.memory.Size; - if ((num == 0) || (base+num-1 < base)) - return CS_BAD_SIZE; + unsigned long size = end - start + 1; + int ret = 0; - ret = CS_SUCCESS; + if (end < start) + return -EINVAL; - down(&rsrc_sem); - switch (adj->Action) { + mutex_lock(&rsrc_mutex); + switch (action) { case ADD_MANAGED_RESOURCE: - ret = add_interval(&data->mem_db, base, num); + ret = add_interval(&data->mem_db, start, size); break; case REMOVE_MANAGED_RESOURCE: - ret = sub_interval(&data->mem_db, base, num); - if (ret == CS_SUCCESS) { + ret = sub_interval(&data->mem_db, start, size); + if (!ret) { struct pcmcia_socket *socket; down_read(&pcmcia_socket_list_rwsem); list_for_each_entry(socket, &pcmcia_socket_list, socket_list) @@ -712,47 +720,46 @@ static int adjust_memory(struct pcmcia_socket *s, adjust_t *adj) } break; default: - ret = CS_UNSUPPORTED_FUNCTION; + ret = -EINVAL; } - up(&rsrc_sem); + mutex_unlock(&rsrc_mutex); return ret; } -static int adjust_io(struct pcmcia_socket *s, adjust_t *adj) +static int adjust_io(struct pcmcia_socket *s, unsigned int action, unsigned long start, unsigned long end) { struct socket_data *data = s->resource_data; - kio_addr_t base, num; - int ret = CS_SUCCESS; - - base = adj->resource.io.BasePort; - num = adj->resource.io.NumPorts; - if ((base < 0) || (base > 0xffff)) - return CS_BAD_BASE; - if ((num <= 0) || (base+num > 0x10000) || (base+num <= base)) - return CS_BAD_SIZE; - - down(&rsrc_sem); - switch (adj->Action) { + unsigned long size = end - start + 1; + int ret = 0; + + if (end < start) + return -EINVAL; + + if (end > IO_SPACE_LIMIT) + return -EINVAL; + + mutex_lock(&rsrc_mutex); + switch (action) { case ADD_MANAGED_RESOURCE: - if (add_interval(&data->io_db, base, num) != 0) { - ret = CS_IN_USE; + if (add_interval(&data->io_db, start, size) != 0) { + ret = -EBUSY; break; } #ifdef CONFIG_PCMCIA_PROBE if (probe_io) - do_io_probe(s, base, num); + do_io_probe(s, start, size); #endif break; case REMOVE_MANAGED_RESOURCE: - sub_interval(&data->io_db, base, num); + sub_interval(&data->io_db, start, size); break; default: - ret = CS_UNSUPPORTED_FUNCTION; + ret = -EINVAL; break; } - up(&rsrc_sem); + mutex_unlock(&rsrc_mutex); return ret; } @@ -760,29 +767,101 @@ static int adjust_io(struct pcmcia_socket *s, adjust_t *adj) static int nonstatic_adjust_resource_info(struct pcmcia_socket *s, adjust_t *adj) { + unsigned long end; + switch (adj->Resource) { case RES_MEMORY_RANGE: - return adjust_memory(s, adj); + end = adj->resource.memory.Base + adj->resource.memory.Size - 1; + return adjust_memory(s, adj->Action, adj->resource.memory.Base, end); case RES_IO_RANGE: - return adjust_io(s, adj); + end = adj->resource.io.BasePort + adj->resource.io.NumPorts - 1; + return adjust_io(s, adj->Action, adj->resource.io.BasePort, end); } return CS_UNSUPPORTED_FUNCTION; } +#ifdef CONFIG_PCI +static int nonstatic_autoadd_resources(struct pcmcia_socket *s) +{ + struct resource *res; + int i, done = 0; + + if (!s->cb_dev || !s->cb_dev->bus) + return -ENODEV; + +#if defined(CONFIG_X86) + /* If this is the root bus, the risk of hitting + * some strange system devices which aren't protected + * by either ACPI resource tables or properly requested + * resources is too big. Therefore, don't do auto-adding + * of resources at the moment. + */ + if (s->cb_dev->bus->number == 0) + return -EINVAL; +#endif + + for (i=0; i < PCI_BUS_NUM_RESOURCES; i++) { + res = s->cb_dev->bus->resource[i]; + if (!res) + continue; + + if (res->flags & IORESOURCE_IO) { + if (res == &ioport_resource) + continue; + printk(KERN_INFO "pcmcia: parent PCI bridge I/O " + "window: 0x%llx - 0x%llx\n", + (unsigned long long)res->start, + (unsigned long long)res->end); + if (!adjust_io(s, ADD_MANAGED_RESOURCE, res->start, res->end)) + done |= IORESOURCE_IO; + + } + + if (res->flags & IORESOURCE_MEM) { + if (res == &iomem_resource) + continue; + printk(KERN_INFO "pcmcia: parent PCI bridge Memory " + "window: 0x%llx - 0x%llx\n", + (unsigned long long)res->start, + (unsigned long long)res->end); + if (!adjust_memory(s, ADD_MANAGED_RESOURCE, res->start, res->end)) + done |= IORESOURCE_MEM; + } + } + + /* if we got at least one of IO, and one of MEM, we can be glad and + * activate the PCMCIA subsystem */ + if (done == (IORESOURCE_MEM | IORESOURCE_IO)) + s->resource_setup_done = 1; + + return 0; +} + +#else + +static inline int nonstatic_autoadd_resources(struct pcmcia_socket *s) +{ + return -ENODEV; +} + +#endif + + static int nonstatic_init(struct pcmcia_socket *s) { struct socket_data *data; - data = kmalloc(sizeof(struct socket_data), GFP_KERNEL); + data = kzalloc(sizeof(struct socket_data), GFP_KERNEL); if (!data) return -ENOMEM; - memset(data, 0, sizeof(struct socket_data)); data->mem_db.next = &data->mem_db; data->io_db.next = &data->io_db; s->resource_data = (void *) data; + nonstatic_autoadd_resources(s); + return 0; } @@ -791,7 +870,7 @@ static void nonstatic_release_resource_db(struct pcmcia_socket *s) struct socket_data *data = s->resource_data; struct resource_map *p, *q; - down(&rsrc_sem); + mutex_lock(&rsrc_mutex); for (p = data->mem_db.next; p != &data->mem_db; p = q) { q = p->next; kfree(p); @@ -800,7 +879,7 @@ static void nonstatic_release_resource_db(struct pcmcia_socket *s) q = p->next; kfree(p); } - up(&rsrc_sem); + mutex_unlock(&rsrc_mutex); } @@ -825,7 +904,7 @@ static ssize_t show_io_db(struct class_device *class_dev, char *buf) struct resource_map *p; ssize_t ret = 0; - down(&rsrc_sem); + mutex_lock(&rsrc_mutex); data = s->resource_data; for (p = data->io_db.next; p != &data->io_db; p = p->next) { @@ -837,7 +916,7 @@ static ssize_t show_io_db(struct class_device *class_dev, char *buf) ((unsigned long) p->base + p->num - 1)); } - up(&rsrc_sem); + mutex_unlock(&rsrc_mutex); return (ret); } @@ -845,30 +924,26 @@ static ssize_t store_io_db(struct class_device *class_dev, const char *buf, size { struct pcmcia_socket *s = class_get_devdata(class_dev); unsigned long start_addr, end_addr; - unsigned int add = 1; - adjust_t adj; + unsigned int add = ADD_MANAGED_RESOURCE; ssize_t ret = 0; ret = sscanf (buf, "+ 0x%lx - 0x%lx", &start_addr, &end_addr); if (ret != 2) { ret = sscanf (buf, "- 0x%lx - 0x%lx", &start_addr, &end_addr); - add = 0; + add = REMOVE_MANAGED_RESOURCE; if (ret != 2) { ret = sscanf (buf, "0x%lx - 0x%lx", &start_addr, &end_addr); - add = 1; + add = ADD_MANAGED_RESOURCE; if (ret != 2) return -EINVAL; } } - if (end_addr <= start_addr) + if (end_addr < start_addr) return -EINVAL; - adj.Action = add ? ADD_MANAGED_RESOURCE : REMOVE_MANAGED_RESOURCE; - adj.Resource = RES_IO_RANGE; - adj.resource.io.BasePort = start_addr; - adj.resource.io.NumPorts = end_addr - start_addr + 1; - - ret = adjust_io(s, &adj); + ret = adjust_io(s, add, start_addr, end_addr); + if (!ret) + s->resource_setup_new = 1; return ret ? ret : count; } @@ -881,7 +956,7 @@ static ssize_t show_mem_db(struct class_device *class_dev, char *buf) struct resource_map *p; ssize_t ret = 0; - down(&rsrc_sem); + mutex_lock(&rsrc_mutex); data = s->resource_data; for (p = data->mem_db.next; p != &data->mem_db; p = p->next) { @@ -893,7 +968,7 @@ static ssize_t show_mem_db(struct class_device *class_dev, char *buf) ((unsigned long) p->base + p->num - 1)); } - up(&rsrc_sem); + mutex_unlock(&rsrc_mutex); return (ret); } @@ -901,30 +976,26 @@ static ssize_t store_mem_db(struct class_device *class_dev, const char *buf, siz { struct pcmcia_socket *s = class_get_devdata(class_dev); unsigned long start_addr, end_addr; - unsigned int add = 1; - adjust_t adj; + unsigned int add = ADD_MANAGED_RESOURCE; ssize_t ret = 0; ret = sscanf (buf, "+ 0x%lx - 0x%lx", &start_addr, &end_addr); if (ret != 2) { ret = sscanf (buf, "- 0x%lx - 0x%lx", &start_addr, &end_addr); - add = 0; + add = REMOVE_MANAGED_RESOURCE; if (ret != 2) { ret = sscanf (buf, "0x%lx - 0x%lx", &start_addr, &end_addr); - add = 1; + add = ADD_MANAGED_RESOURCE; if (ret != 2) return -EINVAL; } } - if (end_addr <= start_addr) + if (end_addr < start_addr) return -EINVAL; - adj.Action = add ? ADD_MANAGED_RESOURCE : REMOVE_MANAGED_RESOURCE; - adj.Resource = RES_MEMORY_RANGE; - adj.resource.memory.Base = start_addr; - adj.resource.memory.Size = end_addr - start_addr + 1; - - ret = adjust_memory(s, &adj); + ret = adjust_memory(s, add, start_addr, end_addr); + if (!ret) + s->resource_setup_new = 1; return ret ? ret : count; } @@ -936,7 +1007,8 @@ static struct class_device_attribute *pccard_rsrc_attributes[] = { NULL, }; -static int __devinit pccard_sysfs_add_rsrc(struct class_device *class_dev) +static int __devinit pccard_sysfs_add_rsrc(struct class_device *class_dev, + struct class_interface *class_intf) { struct pcmcia_socket *s = class_get_devdata(class_dev); struct class_device_attribute **attr; @@ -953,7 +1025,8 @@ static int __devinit pccard_sysfs_add_rsrc(struct class_device *class_dev) return ret; } -static void __devexit pccard_sysfs_remove_rsrc(struct class_device *class_dev) +static void __devexit pccard_sysfs_remove_rsrc(struct class_device *class_dev, + struct class_interface *class_intf) { struct pcmcia_socket *s = class_get_devdata(class_dev); struct class_device_attribute **attr; diff --git a/drivers/pcmcia/sa1100_badge4.c b/drivers/pcmcia/sa1100_badge4.c index c6b262b65..19b1e1276 100644 --- a/drivers/pcmcia/sa1100_badge4.c +++ b/drivers/pcmcia/sa1100_badge4.c @@ -128,8 +128,8 @@ badge4_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state static struct pcmcia_low_level badge4_pcmcia_ops = { .owner = THIS_MODULE, - .init = sa1111_pcmcia_hw_init, - .shutdown = sa1111_pcmcia_hw_shutdown, + .hw_init = sa1111_pcmcia_hw_init, + .hw_shutdown = sa1111_pcmcia_hw_shutdown, .socket_state = sa1111_pcmcia_socket_state, .configure_socket = badge4_pcmcia_configure_socket, diff --git a/drivers/pcmcia/sa1100_generic.c b/drivers/pcmcia/sa1100_generic.c index 6d441ec75..c5b2a44b4 100644 --- a/drivers/pcmcia/sa1100_generic.c +++ b/drivers/pcmcia/sa1100_generic.c @@ -32,7 +32,6 @@ #include #include -#include #include #include diff --git a/drivers/pcmcia/sa1111_generic.c b/drivers/pcmcia/sa1111_generic.c index 81ded52c8..658cddfbc 100644 --- a/drivers/pcmcia/sa1111_generic.c +++ b/drivers/pcmcia/sa1111_generic.c @@ -5,7 +5,6 @@ * basically means we handle everything except controlling the * power. Power is machine specific... */ -#include #include #include #include diff --git a/drivers/pcmcia/sa11xx_base.c b/drivers/pcmcia/sa11xx_base.c index db04ffb6f..31a7abc55 100644 --- a/drivers/pcmcia/sa11xx_base.c +++ b/drivers/pcmcia/sa11xx_base.c @@ -32,7 +32,6 @@ #include #include -#include #include #include #include @@ -189,7 +188,7 @@ static int __init sa11xx_pcmcia_init(void) { return 0; } -module_init(sa11xx_pcmcia_init); +fs_initcall(sa11xx_pcmcia_init); static void __exit sa11xx_pcmcia_exit(void) {} diff --git a/drivers/pcmcia/soc_common.c b/drivers/pcmcia/soc_common.c index 888b70e6a..ecaa132fa 100644 --- a/drivers/pcmcia/soc_common.c +++ b/drivers/pcmcia/soc_common.c @@ -31,7 +31,6 @@ ======================================================================*/ -#include #include #include #include @@ -39,12 +38,12 @@ #include #include #include +#include #include #include #include #include -#include #include #include "soc_common.h" @@ -66,7 +65,7 @@ void soc_pcmcia_debug(struct soc_pcmcia_socket *skt, const char *func, if (pc_debug > lvl) { printk(KERN_DEBUG "skt%u: %s: ", skt->nr, func); va_start(args, fmt); - printk(fmt, args); + vprintk(fmt, args); va_end(args); } } @@ -296,33 +295,12 @@ soc_common_pcmcia_get_status(struct pcmcia_socket *sock, unsigned int *status) } -/* - * Implements the get_socket() operation for the in-kernel PCMCIA - * service (formerly SS_GetSocket in Card Services). Not a very - * exciting routine. - * - * Returns: 0 - */ -static int -soc_common_pcmcia_get_socket(struct pcmcia_socket *sock, socket_state_t *state) -{ - struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock); - - debug(skt, 2, "\n"); - - *state = skt->cs_state; - - return 0; -} - /* * Implements the set_socket() operation for the in-kernel PCMCIA * service (formerly SS_SetSocket in Card Services). We more or * less punt all of this work and let the kernel handle the details * of power configuration, reset, &c. We also record the value of * `state' in order to regurgitate it to the PCMCIA core later. - * - * Returns: 0 */ static int soc_common_pcmcia_set_socket(struct pcmcia_socket *sock, socket_state_t *state) @@ -407,7 +385,7 @@ soc_common_pcmcia_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *m * the map speed as requested, but override the address ranges * supplied by Card Services. * - * Returns: 0 on success, -1 on error + * Returns: 0 on success, -ERRNO on error */ static int soc_common_pcmcia_set_mem_map(struct pcmcia_socket *sock, struct pccard_mem_map *map) @@ -530,7 +508,6 @@ static struct pccard_operations soc_common_pcmcia_operations = { .init = soc_common_pcmcia_sock_init, .suspend = soc_common_pcmcia_suspend, .get_status = soc_common_pcmcia_get_status, - .get_socket = soc_common_pcmcia_get_socket, .set_socket = soc_common_pcmcia_set_socket, .set_io_map = soc_common_pcmcia_set_io_map, .set_mem_map = soc_common_pcmcia_set_mem_map, @@ -546,7 +523,7 @@ int soc_pcmcia_request_irqs(struct soc_pcmcia_socket *skt, if (irqs[i].sock != skt->nr) continue; res = request_irq(irqs[i].irq, soc_common_pcmcia_interrupt, - SA_INTERRUPT, irqs[i].str, skt); + IRQF_DISABLED, irqs[i].str, skt); if (res) break; set_irq_type(irqs[i].irq, IRQT_NOEDGE); @@ -655,8 +632,8 @@ static void soc_pcmcia_cpufreq_unregister(void) } #else -#define soc_pcmcia_cpufreq_register() -#define soc_pcmcia_cpufreq_unregister() +static int soc_pcmcia_cpufreq_register(void) { return 0; } +static void soc_pcmcia_cpufreq_unregister(void) {} #endif int soc_common_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, int first, int nr) @@ -667,13 +644,12 @@ int soc_common_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops down(&soc_pcmcia_sockets_lock); - sinfo = kmalloc(SKT_DEV_INFO_SIZE(nr), GFP_KERNEL); + sinfo = kzalloc(SKT_DEV_INFO_SIZE(nr), GFP_KERNEL); if (!sinfo) { ret = -ENOMEM; goto out; } - memset(sinfo, 0, SKT_DEV_INFO_SIZE(nr)); sinfo->nskt = nr; /* @@ -738,7 +714,7 @@ int soc_common_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops goto out_err_5; } - if ( list_empty(&soc_pcmcia_sockets) ) + if (list_empty(&soc_pcmcia_sockets)) soc_pcmcia_cpufreq_register(); list_add(&skt->node, &soc_pcmcia_sockets); @@ -839,7 +815,7 @@ int soc_common_drv_pcmcia_remove(struct device *dev) release_resource(&skt->res_io); release_resource(&skt->res_skt); } - if ( list_empty(&soc_pcmcia_sockets) ) + if (list_empty(&soc_pcmcia_sockets)) soc_pcmcia_cpufreq_unregister(); up(&soc_pcmcia_sockets_lock); diff --git a/drivers/pcmcia/tcic.c b/drivers/pcmcia/tcic.c index 73bad1d5c..65a606716 100644 --- a/drivers/pcmcia/tcic.c +++ b/drivers/pcmcia/tcic.c @@ -756,8 +756,9 @@ static int tcic_set_mem_map(struct pcmcia_socket *sock, struct pccard_mem_map *m u_long base, len, mmap; debug(1, "SetMemMap(%d, %d, %#2.2x, %d ns, " - "%#lx-%#lx, %#x)\n", psock, mem->map, mem->flags, - mem->speed, mem->res->start, mem->res->end, mem->card_start); + "%#llx-%#llx, %#x)\n", psock, mem->map, mem->flags, + mem->speed, (unsigned long long)mem->res->start, + (unsigned long long)mem->res->end, mem->card_start); if ((mem->map > 3) || (mem->card_start > 0x3ffffff) || (mem->res->start > 0xffffff) || (mem->res->end > 0xffffff) || (mem->res->start > mem->res->end) || (mem->speed > 1000)) diff --git a/drivers/pcmcia/ti113x.h b/drivers/pcmcia/ti113x.h index 7a3d1b8e1..62e9ebf96 100644 --- a/drivers/pcmcia/ti113x.h +++ b/drivers/pcmcia/ti113x.h @@ -647,6 +647,7 @@ static int ti12xx_2nd_slot_empty(struct yenta_socket *socket) */ break; + case PCI_DEVICE_ID_TI_XX12: case PCI_DEVICE_ID_TI_X515: case PCI_DEVICE_ID_TI_X420: case PCI_DEVICE_ID_TI_X620: diff --git a/drivers/pcmcia/vrc4171_card.c b/drivers/pcmcia/vrc4171_card.c index 17bb2da67..e076a13db 100644 --- a/drivers/pcmcia/vrc4171_card.c +++ b/drivers/pcmcia/vrc4171_card.c @@ -1,7 +1,7 @@ /* * vrc4171_card.c, NEC VRC4171 Card Controller driver for Socket Services. * - * Copyright (C) 2003-2005 Yoichi Yuasa + * Copyright (C) 2003-2005 Yoichi Yuasa * * 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 @@ -24,6 +24,7 @@ #include #include #include +#include #include @@ -32,7 +33,7 @@ #include "i82365.h" MODULE_DESCRIPTION("NEC VRC4171 Card Controllers driver for Socket Services"); -MODULE_AUTHOR("Yoichi Yuasa "); +MODULE_AUTHOR("Yoichi Yuasa "); MODULE_LICENSE("GPL"); #define CARD_MAX_SLOTS 2 @@ -300,75 +301,6 @@ static int pccard_get_status(struct pcmcia_socket *sock, u_int *value) return 0; } -static inline u_char get_Vcc_value(uint8_t voltage) -{ - switch (voltage) { - case VCC_STATUS_3V: - return 33; - case VCC_STATUS_5V: - return 50; - default: - break; - } - - return 0; -} - -static inline u_char get_Vpp_value(uint8_t power, u_char Vcc) -{ - if ((power & 0x03) == 0x01 || (power & 0x03) == 0x02) - return Vcc; - - return 0; -} - -static int pccard_get_socket(struct pcmcia_socket *sock, socket_state_t *state) -{ - unsigned int slot; - uint8_t power, voltage, control, cscint; - - if (sock == NULL || sock->sock >= CARD_MAX_SLOTS || state == NULL) - return -EINVAL; - - slot = sock->sock; - - power = exca_read_byte(slot, I365_POWER); - voltage = exca_read_byte(slot, CARD_VOLTAGE_SELECT); - - state->Vcc = get_Vcc_value(voltage); - state->Vpp = get_Vpp_value(power, state->Vcc); - - state->flags = 0; - if (power & POWER_ENABLE) - state->flags |= SS_PWR_AUTO; - if (power & I365_PWR_OUT) - state->flags |= SS_OUTPUT_ENA; - - control = exca_read_byte(slot, I365_INTCTL); - if (control & I365_PC_IOCARD) - state->flags |= SS_IOCARD; - if (!(control & I365_PC_RESET)) - state->flags |= SS_RESET; - - cscint = exca_read_byte(slot, I365_CSCINT); - state->csc_mask = 0; - if (state->flags & SS_IOCARD) { - if (cscint & I365_CSC_STSCHG) - state->flags |= SS_STSCHG; - } else { - if (cscint & I365_CSC_BVD1) - state->csc_mask |= SS_BATDEAD; - if (cscint & I365_CSC_BVD2) - state->csc_mask |= SS_BATWARN; - } - if (cscint & I365_CSC_READY) - state->csc_mask |= SS_READY; - if (cscint & I365_CSC_DETECT) - state->csc_mask |= SS_DETECT; - - return 0; -} - static inline uint8_t set_Vcc_value(u_char Vcc) { switch (Vcc) { @@ -550,7 +482,6 @@ static int pccard_set_mem_map(struct pcmcia_socket *sock, struct pccard_mem_map static struct pccard_operations vrc4171_pccard_operations = { .init = pccard_init, .get_status = pccard_get_status, - .get_socket = pccard_get_socket, .set_socket = pccard_set_socket, .set_io_map = pccard_set_io_map, .set_mem_map = pccard_set_mem_map, @@ -703,7 +634,7 @@ static void vrc4171_remove_sockets(void) static int __devinit vrc4171_card_setup(char *options) { if (options == NULL || *options == '\0') - return 0; + return 1; if (strncmp(options, "irq:", 4) == 0) { int irq; @@ -713,7 +644,7 @@ static int __devinit vrc4171_card_setup(char *options) vrc4171_irq = irq; if (*options != ',') - return 0; + return 1; options++; } @@ -732,10 +663,10 @@ static int __devinit vrc4171_card_setup(char *options) } if (*options != ',') - return 0; + return 1; options++; } else - return 0; + return 1; } @@ -757,7 +688,7 @@ static int __devinit vrc4171_card_setup(char *options) } if (*options != ',') - return 0; + return 1; options++; if (strncmp(options, "memnoprobe", 10) == 0) @@ -769,36 +700,16 @@ static int __devinit vrc4171_card_setup(char *options) } } - return 0; + return 1; } __setup("vrc4171_card=", vrc4171_card_setup); -static int vrc4171_card_suspend(struct device *dev, pm_message_t state, u32 level) -{ - int retval = 0; - - if (level == SUSPEND_SAVE_STATE) - retval = pcmcia_socket_dev_suspend(dev, state); - - return retval; -} - -static int vrc4171_card_resume(struct device *dev, u32 level) -{ - int retval = 0; - - if (level == RESUME_RESTORE_STATE) - retval = pcmcia_socket_dev_resume(dev); - - return retval; -} - static struct device_driver vrc4171_card_driver = { .name = vrc4171_card_name, .bus = &platform_bus_type, - .suspend = vrc4171_card_suspend, - .resume = vrc4171_card_resume, + .suspend = pcmcia_socket_dev_suspend, + .resume = pcmcia_socket_dev_resume, }; static int __devinit vrc4171_card_init(void) @@ -819,7 +730,7 @@ static int __devinit vrc4171_card_init(void) retval = vrc4171_add_sockets(); if (retval == 0) - retval = request_irq(vrc4171_irq, pccard_interrupt, SA_SHIRQ, + retval = request_irq(vrc4171_irq, pccard_interrupt, IRQF_SHARED, vrc4171_card_name, vrc4171_sockets); if (retval < 0) { diff --git a/drivers/pcmcia/vrc4173_cardu.c b/drivers/pcmcia/vrc4173_cardu.c index db91259dc..d19a91381 100644 --- a/drivers/pcmcia/vrc4173_cardu.c +++ b/drivers/pcmcia/vrc4173_cardu.c @@ -6,7 +6,7 @@ * NEC VRC4173 CARDU driver for Socket Services * (This device doesn't support CardBus. it is supporting only 16bit PC Card.) * - * Copyright 2002,2003 Yoichi Yuasa + * Copyright 2002,2003 Yoichi Yuasa * * 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 @@ -41,7 +41,7 @@ #include "vrc4173_cardu.h" MODULE_DESCRIPTION("NEC VRC4173 CARDU driver for Socket Services"); -MODULE_AUTHOR("Yoichi Yuasa "); +MODULE_AUTHOR("Yoichi Yuasa "); MODULE_LICENSE("GPL"); static int vrc4173_cardu_slots; @@ -198,48 +198,6 @@ static int cardu_get_status(unsigned int sock, u_int *value) return 0; } -static inline u_char get_Vcc_value(uint8_t val) -{ - switch (val & VCC_MASK) { - case VCC_3V: - return 33; - case VCC_5V: - return 50; - } - - return 0; -} - -static inline u_char get_Vpp_value(uint8_t val) -{ - switch (val & VPP_MASK) { - case VPP_12V: - return 120; - case VPP_VCC: - return get_Vcc_value(val); - } - - return 0; -} - -static int cardu_get_socket(unsigned int sock, socket_state_t *state) -{ - vrc4173_socket_t *socket = &cardu_sockets[sock]; - uint8_t val; - - val = exca_readb(socket, PWR_CNT); - state->Vcc = get_Vcc_value(val); - state->Vpp = get_Vpp_value(val); - state->flags = 0; - if (val & CARD_OUT_EN) state->flags |= SS_OUTPUT_ENA; - - val = exca_readb(socket, INT_GEN_CNT); - if (!(val & CARD_REST0)) state->flags |= SS_RESET; - if (val & CARD_TYPE_IO) state->flags |= SS_IOCARD; - - return 0; -} - static inline uint8_t set_Vcc_value(u_char Vcc) { switch (Vcc) { @@ -431,7 +389,6 @@ static struct pccard_operations cardu_operations = { .register_callback = cardu_register_callback, .inquire_socket = cardu_inquire_socket, .get_status = cardu_get_status, - .get_socket = cardu_get_socket, .set_socket = cardu_set_socket, .get_io_map = cardu_get_io_map, .set_io_map = cardu_set_io_map, @@ -543,7 +500,7 @@ static int __devinit vrc4173_cardu_probe(struct pci_dev *dev, return -ENOMEM; } - if (request_irq(dev->irq, cardu_interrupt, SA_SHIRQ, socket->name, socket) < 0) { + if (request_irq(dev->irq, cardu_interrupt, IRQF_SHARED, socket->name, socket) < 0) { pcmcia_unregister_socket(socket->pcmcia_socket); socket->pcmcia_socket = NULL; iounmap(socket->base); @@ -559,7 +516,7 @@ static int __devinit vrc4173_cardu_probe(struct pci_dev *dev, static int __devinit vrc4173_cardu_setup(char *options) { if (options == NULL || *options == '\0') - return 0; + return 1; if (strncmp(options, "cardu1:", 7) == 0) { options += 7; @@ -570,9 +527,9 @@ static int __devinit vrc4173_cardu_setup(char *options) } if (*options != ',') - return 0; + return 1; } else - return 0; + return 1; } if (strncmp(options, "cardu2:", 7) == 0) { @@ -581,7 +538,7 @@ static int __devinit vrc4173_cardu_setup(char *options) cardu_sockets[CARDU2].noprobe = 1; } - return 0; + return 1; } __setup("vrc4173_cardu=", vrc4173_cardu_setup); @@ -604,7 +561,7 @@ static int __devinit vrc4173_cardu_init(void) { vrc4173_cardu_slots = 0; - return pci_module_init(&vrc4173_cardu_driver); + return pci_register_driver(&vrc4173_cardu_driver); } static void __devexit vrc4173_cardu_exit(void) diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c index 4145eb83b..134474638 100644 --- a/drivers/pcmcia/yenta_socket.c +++ b/drivers/pcmcia/yenta_socket.c @@ -287,7 +287,10 @@ static int yenta_set_socket(struct pcmcia_socket *sock, socket_state_t *state) struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket); u16 bridge; - yenta_set_power(socket, state); + /* if powering down: do it immediately */ + if (state->Vcc == 0) + yenta_set_power(socket, state); + socket->io_irq = state->io_irq; bridge = config_readw(socket, CB_BRIDGE_CONTROL) & ~(CB_BRIDGE_CRST | CB_BRIDGE_INTR); if (cb_readl(socket, CB_SOCKET_STATE) & CB_CBCARD) { @@ -339,6 +342,10 @@ static int yenta_set_socket(struct pcmcia_socket *sock, socket_state_t *state) /* Socket event mask: get card insert/remove events.. */ cb_writel(socket, CB_SOCKET_EVENT, -1); cb_writel(socket, CB_SOCKET_MASK, CB_CDMASK); + + /* if powering up: do it as the last step when the socket is configured */ + if (state->Vcc != 0) + yenta_set_power(socket, state); return 0; } @@ -916,7 +923,7 @@ static int yenta_probe_cb_irq(struct yenta_socket *socket) socket->probe_status = 0; - if (request_irq(socket->cb_irq, yenta_probe_handler, SA_SHIRQ, "yenta", socket)) { + if (request_irq(socket->cb_irq, yenta_probe_handler, IRQF_SHARED, "yenta", socket)) { printk(KERN_WARNING "Yenta: request_irq() in yenta_probe_cb_irq() failed!\n"); return -1; } @@ -998,6 +1005,77 @@ static void yenta_config_init(struct yenta_socket *socket) config_writew(socket, CB_BRIDGE_CONTROL, bridge); } +/** + * yenta_fixup_parent_bridge - Fix subordinate bus# of the parent bridge + * @cardbus_bridge: The PCI bus which the CardBus bridge bridges to + * + * Checks if devices on the bus which the CardBus bridge bridges to would be + * invisible during PCI scans because of a misconfigured subordinate number + * of the parent brige - some BIOSes seem to be too lazy to set it right. + * Does the fixup carefully by checking how far it can go without conflicts. + * See http://bugzilla.kernel.org/show_bug.cgi?id=2944 for more information. + */ +static void yenta_fixup_parent_bridge(struct pci_bus *cardbus_bridge) +{ + struct list_head *tmp; + unsigned char upper_limit; + /* + * We only check and fix the parent bridge: All systems which need + * this fixup that have been reviewed are laptops and the only bridge + * which needed fixing was the parent bridge of the CardBus bridge: + */ + struct pci_bus *bridge_to_fix = cardbus_bridge->parent; + + /* Check bus numbers are already set up correctly: */ + if (bridge_to_fix->subordinate >= cardbus_bridge->subordinate) + return; /* The subordinate number is ok, nothing to do */ + + if (!bridge_to_fix->parent) + return; /* Root bridges are ok */ + + /* stay within the limits of the bus range of the parent: */ + upper_limit = bridge_to_fix->parent->subordinate; + + /* check the bus ranges of all silbling bridges to prevent overlap */ + list_for_each(tmp, &bridge_to_fix->parent->children) { + struct pci_bus * silbling = pci_bus_b(tmp); + /* + * If the silbling has a higher secondary bus number + * and it's secondary is equal or smaller than our + * current upper limit, set the new upper limit to + * the bus number below the silbling's range: + */ + if (silbling->secondary > bridge_to_fix->subordinate + && silbling->secondary <= upper_limit) + upper_limit = silbling->secondary - 1; + } + + /* Show that the wanted subordinate number is not possible: */ + if (cardbus_bridge->subordinate > upper_limit) + printk(KERN_WARNING "Yenta: Upper limit for fixing this " + "bridge's parent bridge: #%02x\n", upper_limit); + + /* If we have room to increase the bridge's subordinate number, */ + if (bridge_to_fix->subordinate < upper_limit) { + + /* use the highest number of the hidden bus, within limits */ + unsigned char subordinate_to_assign = + min(cardbus_bridge->subordinate, upper_limit); + + printk(KERN_INFO "Yenta: Raising subordinate bus# of parent " + "bus (#%02x) from #%02x to #%02x\n", + bridge_to_fix->number, + bridge_to_fix->subordinate, subordinate_to_assign); + + /* Save the new subordinate in the bus struct of the bridge */ + bridge_to_fix->subordinate = subordinate_to_assign; + + /* and update the PCI config space with the new subordinate */ + pci_write_config_byte(bridge_to_fix->self, + PCI_SUBORDINATE_BUS, bridge_to_fix->subordinate); + } +} + /* * Initialize a cardbus controller. Make sure we have a usable * interrupt, and that we can map the cardbus area. Fill in the @@ -1094,7 +1172,7 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i /* We must finish initialization here */ - if (!socket->cb_irq || request_irq(socket->cb_irq, yenta_interrupt, SA_SHIRQ, "yenta", socket)) { + if (!socket->cb_irq || request_irq(socket->cb_irq, yenta_interrupt, IRQF_SHARED, "yenta", socket)) { /* No IRQ or request_irq failed. Poll */ socket->cb_irq = 0; /* But zero is a valid IRQ number. */ init_timer(&socket->poll_timer); @@ -1113,6 +1191,8 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i yenta_get_socket_capabilities(socket, isa_interrupts); printk(KERN_INFO "Socket status: %08x\n", cb_readl(socket, CB_SOCKET_STATE)); + yenta_fixup_parent_bridge(dev->subordinate); + /* Register it with the pcmcia layer.. */ ret = pcmcia_register_socket(&socket->socket); if (ret == 0) { @@ -1232,6 +1312,7 @@ static struct pci_device_id yenta_table [] = { CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_XX21_XX11, TI12XX), CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_X515, TI12XX), + CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_XX12, TI12XX), CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_X420, TI12XX), CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_X620, TI12XX), CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_7410, TI12XX), diff --git a/drivers/pnp/card.c b/drivers/pnp/card.c index bb19c6407..227600cd6 100644 --- a/drivers/pnp/card.c +++ b/drivers/pnp/card.c @@ -5,7 +5,6 @@ * */ -#include #include #include #include @@ -60,30 +59,34 @@ static void card_remove_first(struct pnp_dev * dev) card_remove(dev); } -static int card_probe(struct pnp_card * card, struct pnp_card_driver * drv) +static int card_probe(struct pnp_card *card, struct pnp_card_driver *drv) { - const struct pnp_card_device_id *id = match_card(drv,card); - if (id) { - struct pnp_card_link * clink = pnp_alloc(sizeof(struct pnp_card_link)); - if (!clink) - return 0; - clink->card = card; - clink->driver = drv; - clink->pm_state = PMSG_ON; - if (drv->probe) { - if (drv->probe(clink, id)>=0) - return 1; - else { - struct pnp_dev * dev; - card_for_each_dev(card, dev) { - if (dev->card_link == clink) - pnp_release_card_device(dev); - } - kfree(clink); - } - } else - return 1; + const struct pnp_card_device_id *id; + struct pnp_card_link *clink; + struct pnp_dev *dev; + + if (!drv->probe) + return 0; + id = match_card(drv,card); + if (!id) + return 0; + + clink = pnp_alloc(sizeof(*clink)); + if (!clink) + return 0; + clink->card = card; + clink->driver = drv; + clink->pm_state = PMSG_ON; + + if (drv->probe(clink, id) >= 0) + return 1; + + /* Recovery */ + card_for_each_dev(card, dev) { + if (dev->card_link == clink) + pnp_release_card_device(dev); } + kfree(clink); return 0; } diff --git a/drivers/pnp/driver.c b/drivers/pnp/driver.c index e54c15383..e161423b4 100644 --- a/drivers/pnp/driver.c +++ b/drivers/pnp/driver.c @@ -5,7 +5,6 @@ * */ -#include #include #include #include diff --git a/drivers/pnp/interface.c b/drivers/pnp/interface.c index a2d8ce7fe..9d8b415ec 100644 --- a/drivers/pnp/interface.c +++ b/drivers/pnp/interface.c @@ -264,9 +264,9 @@ static ssize_t pnp_show_current_resources(struct device *dmdev, struct device_at if (pnp_port_flags(dev, i) & IORESOURCE_DISABLED) pnp_printf(buffer," disabled\n"); else - pnp_printf(buffer," 0x%lx-0x%lx\n", - pnp_port_start(dev, i), - pnp_port_end(dev, i)); + pnp_printf(buffer," 0x%llx-0x%llx\n", + (unsigned long long)pnp_port_start(dev, i), + (unsigned long long)pnp_port_end(dev, i)); } } for (i = 0; i < PNP_MAX_MEM; i++) { @@ -275,9 +275,9 @@ static ssize_t pnp_show_current_resources(struct device *dmdev, struct device_at if (pnp_mem_flags(dev, i) & IORESOURCE_DISABLED) pnp_printf(buffer," disabled\n"); else - pnp_printf(buffer," 0x%lx-0x%lx\n", - pnp_mem_start(dev, i), - pnp_mem_end(dev, i)); + pnp_printf(buffer," 0x%llx-0x%llx\n", + (unsigned long long)pnp_mem_start(dev, i), + (unsigned long long)pnp_mem_end(dev, i)); } } for (i = 0; i < PNP_MAX_IRQ; i++) { @@ -286,8 +286,8 @@ static ssize_t pnp_show_current_resources(struct device *dmdev, struct device_at if (pnp_irq_flags(dev, i) & IORESOURCE_DISABLED) pnp_printf(buffer," disabled\n"); else - pnp_printf(buffer," %ld\n", - pnp_irq(dev, i)); + pnp_printf(buffer," %lld\n", + (unsigned long long)pnp_irq(dev, i)); } } for (i = 0; i < PNP_MAX_DMA; i++) { @@ -296,8 +296,8 @@ static ssize_t pnp_show_current_resources(struct device *dmdev, struct device_at if (pnp_dma_flags(dev, i) & IORESOURCE_DISABLED) pnp_printf(buffer," disabled\n"); else - pnp_printf(buffer," %ld\n", - pnp_dma(dev, i)); + pnp_printf(buffer," %lld\n", + (unsigned long long)pnp_dma(dev, i)); } } ret = (buffer->curr - buf); diff --git a/drivers/pnp/isapnp/compat.c b/drivers/pnp/isapnp/compat.c index 3ff7e76b3..0697ab88a 100644 --- a/drivers/pnp/isapnp/compat.c +++ b/drivers/pnp/isapnp/compat.c @@ -8,7 +8,6 @@ /* TODO: see if more isapnp functions are needed here */ -#include #include #include #include diff --git a/drivers/pnp/isapnp/core.c b/drivers/pnp/isapnp/core.c index ac7c2bb6c..3ac5b1232 100644 --- a/drivers/pnp/isapnp/core.c +++ b/drivers/pnp/isapnp/core.c @@ -34,7 +34,6 @@ * 2003-08-11 Resource Management Updates - Adam Belay */ -#include #include #include #include @@ -1050,6 +1049,10 @@ static int __init isapnp_init(void) printk(KERN_INFO "isapnp: ISA Plug & Play support disabled\n"); return 0; } +#ifdef CONFIG_PPC_MERGE + if (check_legacy_ioport(_PIDXR) || check_legacy_ioport(_PNPWRP)) + return -EINVAL; +#endif #ifdef ISAPNP_REGION_OK if (!request_region(_PIDXR, 1, "isapnp index")) { printk(KERN_ERR "isapnp: Index Register 0x%x already used\n", _PIDXR); diff --git a/drivers/pnp/isapnp/proc.c b/drivers/pnp/isapnp/proc.c index cf54b0a36..958c11bed 100644 --- a/drivers/pnp/isapnp/proc.c +++ b/drivers/pnp/isapnp/proc.c @@ -19,7 +19,6 @@ * */ -#include #include #include #include diff --git a/drivers/pnp/manager.c b/drivers/pnp/manager.c index 6fff109bd..5026b345c 100644 --- a/drivers/pnp/manager.c +++ b/drivers/pnp/manager.c @@ -6,7 +6,6 @@ * */ -#include #include #include #include @@ -20,7 +19,8 @@ DECLARE_MUTEX(pnp_res_mutex); static int pnp_assign_port(struct pnp_dev *dev, struct pnp_port *rule, int idx) { - unsigned long *start, *end, *flags; + resource_size_t *start, *end; + unsigned long *flags; if (!dev || !rule) return -EINVAL; @@ -63,7 +63,8 @@ static int pnp_assign_port(struct pnp_dev *dev, struct pnp_port *rule, int idx) static int pnp_assign_mem(struct pnp_dev *dev, struct pnp_mem *rule, int idx) { - unsigned long *start, *end, *flags; + resource_size_t *start, *end; + unsigned long *flags; if (!dev || !rule) return -EINVAL; @@ -116,7 +117,8 @@ static int pnp_assign_mem(struct pnp_dev *dev, struct pnp_mem *rule, int idx) static int pnp_assign_irq(struct pnp_dev * dev, struct pnp_irq *rule, int idx) { - unsigned long *start, *end, *flags; + resource_size_t *start, *end; + unsigned long *flags; int i; /* IRQ priority: this table is good for i386 */ @@ -168,7 +170,8 @@ static int pnp_assign_irq(struct pnp_dev * dev, struct pnp_irq *rule, int idx) static int pnp_assign_dma(struct pnp_dev *dev, struct pnp_dma *rule, int idx) { - unsigned long *start, *end, *flags; + resource_size_t *start, *end; + unsigned long *flags; int i; /* DMA priority: this table is good for i386 */ @@ -582,7 +585,8 @@ int pnp_disable_dev(struct pnp_dev *dev) * @size: size of region * */ -void pnp_resource_change(struct resource *resource, unsigned long start, unsigned long size) +void pnp_resource_change(struct resource *resource, resource_size_t start, + resource_size_t size) { if (resource == NULL) return; diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c index f104577f7..6cf34a63c 100644 --- a/drivers/pnp/pnpacpi/core.c +++ b/drivers/pnp/pnpacpi/core.c @@ -19,7 +19,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include #include #include #include diff --git a/drivers/pnp/pnpacpi/rsparser.c b/drivers/pnp/pnpacpi/rsparser.c index 407b4eadd..dc79b0a00 100644 --- a/drivers/pnp/pnpacpi/rsparser.c +++ b/drivers/pnp/pnpacpi/rsparser.c @@ -36,13 +36,13 @@ static int irq_flags(int triggering, int polarity) { int flag; if (triggering == ACPI_LEVEL_SENSITIVE) { - if(polarity == ACPI_ACTIVE_LOW) + if (polarity == ACPI_ACTIVE_LOW) flag = IORESOURCE_IRQ_LOWLEVEL; else flag = IORESOURCE_IRQ_HIGHLEVEL; } else { - if(polarity == ACPI_ACTIVE_LOW) + if (polarity == ACPI_ACTIVE_LOW) flag = IORESOURCE_IRQ_LOWEDGE; else flag = IORESOURCE_IRQ_HIGHEDGE; @@ -57,7 +57,7 @@ static void decode_irq_flags(int flag, int *triggering, int *polarity) *triggering = ACPI_LEVEL_SENSITIVE; *polarity = ACPI_ACTIVE_LOW; break; - case IORESOURCE_IRQ_HIGHLEVEL: + case IORESOURCE_IRQ_HIGHLEVEL: *triggering = ACPI_LEVEL_SENSITIVE; *polarity = ACPI_ACTIVE_HIGH; break; @@ -73,8 +73,8 @@ static void decode_irq_flags(int flag, int *triggering, int *polarity) } static void -pnpacpi_parse_allocated_irqresource(struct pnp_resource_table * res, u32 gsi, - int triggering, int polarity) +pnpacpi_parse_allocated_irqresource(struct pnp_resource_table *res, u32 gsi, + int triggering, int polarity, int shareable) { int i = 0; int irq; @@ -95,13 +95,16 @@ pnpacpi_parse_allocated_irqresource(struct pnp_resource_table * res, u32 gsi, return; } + if (shareable) + res->irq_resource[i].flags |= IORESOURCE_IRQ_SHAREABLE; + res->irq_resource[i].start = irq; res->irq_resource[i].end = irq; pcibios_penalize_isa_irq(irq, 1); } static void -pnpacpi_parse_allocated_dmaresource(struct pnp_resource_table * res, u32 dma) +pnpacpi_parse_allocated_dmaresource(struct pnp_resource_table *res, u32 dma) { int i = 0; while (i < PNP_MAX_DMA && @@ -119,8 +122,8 @@ pnpacpi_parse_allocated_dmaresource(struct pnp_resource_table * res, u32 dma) } static void -pnpacpi_parse_allocated_ioresource(struct pnp_resource_table * res, - u32 io, u32 len) +pnpacpi_parse_allocated_ioresource(struct pnp_resource_table *res, + u64 io, u64 len) { int i = 0; while (!(res->port_resource[i].flags & IORESOURCE_UNSET) && @@ -138,7 +141,7 @@ pnpacpi_parse_allocated_ioresource(struct pnp_resource_table * res, } static void -pnpacpi_parse_allocated_memresource(struct pnp_resource_table * res, +pnpacpi_parse_allocated_memresource(struct pnp_resource_table *res, u64 mem, u64 len) { int i = 0; @@ -156,11 +159,35 @@ pnpacpi_parse_allocated_memresource(struct pnp_resource_table * res, } } +static void +pnpacpi_parse_allocated_address_space(struct pnp_resource_table *res_table, + struct acpi_resource *res) +{ + struct acpi_resource_address64 addr, *p = &addr; + acpi_status status; + + status = acpi_resource_to_address64(res, p); + if (!ACPI_SUCCESS(status)) { + pnp_warn("PnPACPI: failed to convert resource type %d", + res->type); + return; + } + + if (p->producer_consumer == ACPI_PRODUCER) + return; + + if (p->resource_type == ACPI_MEMORY_RANGE) + pnpacpi_parse_allocated_memresource(res_table, + p->minimum, p->address_length); + else if (p->resource_type == ACPI_IO_RANGE) + pnpacpi_parse_allocated_ioresource(res_table, + p->minimum, p->address_length); +} static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res, void *data) { - struct pnp_resource_table * res_table = (struct pnp_resource_table *)data; + struct pnp_resource_table *res_table = (struct pnp_resource_table *)data; int i; switch (res->type) { @@ -173,7 +200,8 @@ static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res, pnpacpi_parse_allocated_irqresource(res_table, res->data.irq.interrupts[i], res->data.irq.triggering, - res->data.irq.polarity); + res->data.irq.polarity, + res->data.irq.sharable); } break; @@ -221,30 +249,26 @@ static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res, res->data.fixed_memory32.address_length); break; case ACPI_RESOURCE_TYPE_ADDRESS16: - pnpacpi_parse_allocated_memresource(res_table, - res->data.address16.minimum, - res->data.address16.address_length); - break; case ACPI_RESOURCE_TYPE_ADDRESS32: - pnpacpi_parse_allocated_memresource(res_table, - res->data.address32.minimum, - res->data.address32.address_length); - break; case ACPI_RESOURCE_TYPE_ADDRESS64: - pnpacpi_parse_allocated_memresource(res_table, - res->data.address64.minimum, - res->data.address64.address_length); + pnpacpi_parse_allocated_address_space(res_table, res); break; case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64: + if (res->data.ext_address64.producer_consumer == ACPI_PRODUCER) + return AE_OK; break; case ACPI_RESOURCE_TYPE_EXTENDED_IRQ: + if (res->data.extended_irq.producer_consumer == ACPI_PRODUCER) + return AE_OK; + for (i = 0; i < res->data.extended_irq.interrupt_count; i++) { pnpacpi_parse_allocated_irqresource(res_table, res->data.extended_irq.interrupts[i], res->data.extended_irq.triggering, - res->data.extended_irq.polarity); + res->data.extended_irq.polarity, + res->data.extended_irq.sharable); } break; @@ -255,11 +279,11 @@ static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res, pnp_warn("PnPACPI: unknown resource type %d", res->type); return AE_ERROR; } - + return AE_OK; } -acpi_status pnpacpi_parse_allocated_resource(acpi_handle handle, struct pnp_resource_table * res) +acpi_status pnpacpi_parse_allocated_resource(acpi_handle handle, struct pnp_resource_table *res) { /* Blank the resource table values */ pnp_init_resource_table(res); @@ -317,17 +341,17 @@ static void pnpacpi_parse_dma_option(struct pnp_option *option, struct acpi_reso pnp_err("Invalid DMA transfer type"); } - pnp_register_dma_resource(option,dma); + pnp_register_dma_resource(option, dma); return; } - + static void pnpacpi_parse_irq_option(struct pnp_option *option, struct acpi_resource_irq *p) { int i; - struct pnp_irq * irq; - + struct pnp_irq *irq; + if (p->interrupt_count == 0) return; irq = kcalloc(1, sizeof(struct pnp_irq), GFP_KERNEL); @@ -347,7 +371,7 @@ static void pnpacpi_parse_ext_irq_option(struct pnp_option *option, struct acpi_resource_extended_irq *p) { int i; - struct pnp_irq * irq; + struct pnp_irq *irq; if (p->interrupt_count == 0) return; @@ -368,7 +392,7 @@ static void pnpacpi_parse_port_option(struct pnp_option *option, struct acpi_resource_io *io) { - struct pnp_port * port; + struct pnp_port *port; if (io->address_length == 0) return; @@ -381,7 +405,7 @@ pnpacpi_parse_port_option(struct pnp_option *option, port->size = io->address_length; port->flags = ACPI_DECODE_16 == io->io_decode ? PNP_PORT_FLAG_16BITADDR : 0; - pnp_register_port_resource(option,port); + pnp_register_port_resource(option, port); return; } @@ -389,7 +413,7 @@ static void pnpacpi_parse_fixed_port_option(struct pnp_option *option, struct acpi_resource_fixed_io *io) { - struct pnp_port * port; + struct pnp_port *port; if (io->address_length == 0) return; @@ -400,7 +424,7 @@ pnpacpi_parse_fixed_port_option(struct pnp_option *option, port->size = io->address_length; port->align = 0; port->flags = PNP_PORT_FLAG_FIXED; - pnp_register_port_resource(option,port); + pnp_register_port_resource(option, port); return; } @@ -408,7 +432,7 @@ static void pnpacpi_parse_mem24_option(struct pnp_option *option, struct acpi_resource_memory24 *p) { - struct pnp_mem * mem; + struct pnp_mem *mem; if (p->address_length == 0) return; @@ -423,7 +447,7 @@ pnpacpi_parse_mem24_option(struct pnp_option *option, mem->flags = (ACPI_READ_WRITE_MEMORY == p->write_protect) ? IORESOURCE_MEM_WRITEABLE : 0; - pnp_register_mem_resource(option,mem); + pnp_register_mem_resource(option, mem); return; } @@ -431,7 +455,7 @@ static void pnpacpi_parse_mem32_option(struct pnp_option *option, struct acpi_resource_memory32 *p) { - struct pnp_mem * mem; + struct pnp_mem *mem; if (p->address_length == 0) return; @@ -446,7 +470,7 @@ pnpacpi_parse_mem32_option(struct pnp_option *option, mem->flags = (ACPI_READ_WRITE_MEMORY == p->write_protect) ? IORESOURCE_MEM_WRITEABLE : 0; - pnp_register_mem_resource(option,mem); + pnp_register_mem_resource(option, mem); return; } @@ -454,7 +478,7 @@ static void pnpacpi_parse_fixed_mem32_option(struct pnp_option *option, struct acpi_resource_fixed_memory32 *p) { - struct pnp_mem * mem; + struct pnp_mem *mem; if (p->address_length == 0) return; @@ -468,7 +492,7 @@ pnpacpi_parse_fixed_mem32_option(struct pnp_option *option, mem->flags = (ACPI_READ_WRITE_MEMORY == p->write_protect) ? IORESOURCE_MEM_WRITEABLE : 0; - pnp_register_mem_resource(option,mem); + pnp_register_mem_resource(option, mem); return; } @@ -477,8 +501,8 @@ pnpacpi_parse_address_option(struct pnp_option *option, struct acpi_resource *r) { struct acpi_resource_address64 addr, *p = &addr; acpi_status status; - struct pnp_mem * mem; - struct pnp_port * port; + struct pnp_mem *mem; + struct pnp_port *port; status = acpi_resource_to_address64(r, p); if (!ACPI_SUCCESS(status)) { @@ -498,7 +522,7 @@ pnpacpi_parse_address_option(struct pnp_option *option, struct acpi_resource *r) mem->align = 0; mem->flags = (p->info.mem.write_protect == ACPI_READ_WRITE_MEMORY) ? IORESOURCE_MEM_WRITEABLE : 0; - pnp_register_mem_resource(option,mem); + pnp_register_mem_resource(option, mem); } else if (p->resource_type == ACPI_IO_RANGE) { port = kcalloc(1, sizeof(struct pnp_port), GFP_KERNEL); if (!port) @@ -507,7 +531,7 @@ pnpacpi_parse_address_option(struct pnp_option *option, struct acpi_resource *r) port->size = p->address_length; port->align = 0; port->flags = PNP_PORT_FLAG_FIXED; - pnp_register_port_resource(option,port); + pnp_register_port_resource(option, port); } } @@ -531,7 +555,7 @@ static acpi_status pnpacpi_option_resource(struct acpi_resource *res, break; case ACPI_RESOURCE_TYPE_DMA: - pnpacpi_parse_dma_option(option, &res->data.dma); + pnpacpi_parse_dma_option(option, &res->data.dma); break; case ACPI_RESOURCE_TYPE_START_DEPENDENT: @@ -539,7 +563,7 @@ static acpi_status pnpacpi_option_resource(struct acpi_resource *res, case ACPI_GOOD_CONFIGURATION: priority = PNP_RES_PRIORITY_PREFERRED; break; - + case ACPI_ACCEPTABLE_CONFIGURATION: priority = PNP_RES_PRIORITY_ACCEPTABLE; break; @@ -555,7 +579,7 @@ static acpi_status pnpacpi_option_resource(struct acpi_resource *res, option = pnp_register_dependent_option(dev, priority); if (!option) return AE_ERROR; - parse_data->option = option; + parse_data->option = option; break; case ACPI_RESOURCE_TYPE_END_DEPENDENT: @@ -615,7 +639,7 @@ static acpi_status pnpacpi_option_resource(struct acpi_resource *res, pnp_warn("PnPACPI: unknown resource type %d", res->type); return AE_ERROR; } - + return AE_OK; } @@ -636,13 +660,8 @@ acpi_status pnpacpi_parse_resource_option_data(acpi_handle handle, return status; } -/* - * Set resource - */ -static acpi_status pnpacpi_count_resources(struct acpi_resource *res, - void *data) +static int pnpacpi_supported_resource(struct acpi_resource *res) { - int *res_cnt = (int *)data; switch (res->type) { case ACPI_RESOURCE_TYPE_IRQ: case ACPI_RESOURCE_TYPE_DMA: @@ -655,43 +674,32 @@ static acpi_status pnpacpi_count_resources(struct acpi_resource *res, case ACPI_RESOURCE_TYPE_ADDRESS32: case ACPI_RESOURCE_TYPE_ADDRESS64: case ACPI_RESOURCE_TYPE_EXTENDED_IRQ: - (*res_cnt) ++; - case ACPI_RESOURCE_TYPE_START_DEPENDENT: - case ACPI_RESOURCE_TYPE_END_DEPENDENT: - case ACPI_RESOURCE_TYPE_VENDOR: - case ACPI_RESOURCE_TYPE_END_TAG: - case ACPI_RESOURCE_TYPE_GENERIC_REGISTER: - default: - return AE_OK; + return 1; } - return AE_OK; + return 0; } -static acpi_status pnpacpi_type_resources(struct acpi_resource *res, +/* + * Set resource + */ +static acpi_status pnpacpi_count_resources(struct acpi_resource *res, void *data) { - struct acpi_resource **resource = (struct acpi_resource **)data; - switch (res->type) { - case ACPI_RESOURCE_TYPE_IRQ: - case ACPI_RESOURCE_TYPE_DMA: - case ACPI_RESOURCE_TYPE_IO: - case ACPI_RESOURCE_TYPE_FIXED_IO: - case ACPI_RESOURCE_TYPE_MEMORY24: - case ACPI_RESOURCE_TYPE_MEMORY32: - case ACPI_RESOURCE_TYPE_FIXED_MEMORY32: - case ACPI_RESOURCE_TYPE_ADDRESS16: - case ACPI_RESOURCE_TYPE_ADDRESS32: - case ACPI_RESOURCE_TYPE_ADDRESS64: - case ACPI_RESOURCE_TYPE_EXTENDED_IRQ: + int *res_cnt = (int *)data; + + if (pnpacpi_supported_resource(res)) + (*res_cnt)++; + return AE_OK; +} + +static acpi_status pnpacpi_type_resources(struct acpi_resource *res, void *data) +{ + struct acpi_resource **resource = (struct acpi_resource **)data; + + if (pnpacpi_supported_resource(res)) { (*resource)->type = res->type; + (*resource)->length = sizeof(struct acpi_resource); (*resource)++; - case ACPI_RESOURCE_TYPE_START_DEPENDENT: - case ACPI_RESOURCE_TYPE_END_DEPENDENT: - case ACPI_RESOURCE_TYPE_VENDOR: - case ACPI_RESOURCE_TYPE_END_TAG: - case ACPI_RESOURCE_TYPE_GENERIC_REGISTER: - default: - return AE_OK; } return AE_OK; @@ -735,11 +743,8 @@ static void pnpacpi_encode_irq(struct acpi_resource *resource, struct resource *p) { int triggering, polarity; - - decode_irq_flags(p->flags & IORESOURCE_BITS, &triggering, - &polarity); - resource->type = ACPI_RESOURCE_TYPE_IRQ; - resource->length = sizeof(struct acpi_resource); + + decode_irq_flags(p->flags & IORESOURCE_BITS, &triggering, &polarity); resource->data.irq.triggering = triggering; resource->data.irq.polarity = polarity; if (triggering == ACPI_EDGE_SENSITIVE) @@ -754,11 +759,8 @@ static void pnpacpi_encode_ext_irq(struct acpi_resource *resource, struct resource *p) { int triggering, polarity; - - decode_irq_flags(p->flags & IORESOURCE_BITS, &triggering, - &polarity); - resource->type = ACPI_RESOURCE_TYPE_EXTENDED_IRQ; - resource->length = sizeof(struct acpi_resource); + + decode_irq_flags(p->flags & IORESOURCE_BITS, &triggering, &polarity); resource->data.extended_irq.producer_consumer = ACPI_CONSUMER; resource->data.extended_irq.triggering = triggering; resource->data.extended_irq.polarity = polarity; @@ -773,8 +775,6 @@ static void pnpacpi_encode_ext_irq(struct acpi_resource *resource, static void pnpacpi_encode_dma(struct acpi_resource *resource, struct resource *p) { - resource->type = ACPI_RESOURCE_TYPE_DMA; - resource->length = sizeof(struct acpi_resource); /* Note: pnp_assign_dma will copy pnp_dma->flags into p->flags */ if (p->flags & IORESOURCE_DMA_COMPATIBLE) resource->data.dma.type = ACPI_COMPATIBILITY; @@ -798,8 +798,6 @@ static void pnpacpi_encode_dma(struct acpi_resource *resource, static void pnpacpi_encode_io(struct acpi_resource *resource, struct resource *p) { - resource->type = ACPI_RESOURCE_TYPE_IO; - resource->length = sizeof(struct acpi_resource); /* Note: pnp_assign_port will copy pnp_port->flags into p->flags */ resource->data.io.io_decode = (p->flags & PNP_PORT_FLAG_16BITADDR)? ACPI_DECODE_16 : ACPI_DECODE_10; @@ -812,8 +810,6 @@ static void pnpacpi_encode_io(struct acpi_resource *resource, static void pnpacpi_encode_fixed_io(struct acpi_resource *resource, struct resource *p) { - resource->type = ACPI_RESOURCE_TYPE_FIXED_IO; - resource->length = sizeof(struct acpi_resource); resource->data.fixed_io.address = p->start; resource->data.fixed_io.address_length = p->end - p->start + 1; } @@ -821,8 +817,6 @@ static void pnpacpi_encode_fixed_io(struct acpi_resource *resource, static void pnpacpi_encode_mem24(struct acpi_resource *resource, struct resource *p) { - resource->type = ACPI_RESOURCE_TYPE_MEMORY24; - resource->length = sizeof(struct acpi_resource); /* Note: pnp_assign_mem will copy pnp_mem->flags into p->flags */ resource->data.memory24.write_protect = (p->flags & IORESOURCE_MEM_WRITEABLE) ? @@ -836,8 +830,6 @@ static void pnpacpi_encode_mem24(struct acpi_resource *resource, static void pnpacpi_encode_mem32(struct acpi_resource *resource, struct resource *p) { - resource->type = ACPI_RESOURCE_TYPE_MEMORY32; - resource->length = sizeof(struct acpi_resource); resource->data.memory32.write_protect = (p->flags & IORESOURCE_MEM_WRITEABLE) ? ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY; @@ -850,8 +842,6 @@ static void pnpacpi_encode_mem32(struct acpi_resource *resource, static void pnpacpi_encode_fixed_mem32(struct acpi_resource *resource, struct resource *p) { - resource->type = ACPI_RESOURCE_TYPE_FIXED_MEMORY32; - resource->length = sizeof(struct acpi_resource); resource->data.fixed_memory32.write_protect = (p->flags & IORESOURCE_MEM_WRITEABLE) ? ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY; @@ -882,37 +872,37 @@ int pnpacpi_encode_resources(struct pnp_resource_table *res_table, pnp_dbg("Encode dma"); pnpacpi_encode_dma(resource, &res_table->dma_resource[dma]); - dma ++; + dma++; break; case ACPI_RESOURCE_TYPE_IO: pnp_dbg("Encode io"); pnpacpi_encode_io(resource, &res_table->port_resource[port]); - port ++; + port++; break; case ACPI_RESOURCE_TYPE_FIXED_IO: pnp_dbg("Encode fixed io"); pnpacpi_encode_fixed_io(resource, &res_table->port_resource[port]); - port ++; + port++; break; case ACPI_RESOURCE_TYPE_MEMORY24: pnp_dbg("Encode mem24"); pnpacpi_encode_mem24(resource, &res_table->mem_resource[mem]); - mem ++; + mem++; break; case ACPI_RESOURCE_TYPE_MEMORY32: pnp_dbg("Encode mem32"); pnpacpi_encode_mem32(resource, &res_table->mem_resource[mem]); - mem ++; + mem++; break; case ACPI_RESOURCE_TYPE_FIXED_MEMORY32: pnp_dbg("Encode fixed mem32"); pnpacpi_encode_fixed_mem32(resource, &res_table->mem_resource[mem]); - mem ++; + mem++; break; case ACPI_RESOURCE_TYPE_EXTENDED_IRQ: pnp_dbg("Encode ext irq"); @@ -933,8 +923,8 @@ int pnpacpi_encode_resources(struct pnp_resource_table *res_table, pnp_warn("unknown resource type %d", resource->type); return -EINVAL; } - resource ++; - i ++; + resource++; + i++; } return 0; } diff --git a/drivers/pnp/pnpbios/core.c b/drivers/pnp/pnpbios/core.c index b154b3f52..551f58e29 100644 --- a/drivers/pnp/pnpbios/core.c +++ b/drivers/pnp/pnpbios/core.c @@ -346,7 +346,7 @@ static int insert_device(struct pnp_dev *dev, struct pnp_bios_node * node) dev->flags = node->flags; if (!(dev->flags & PNPBIOS_NO_CONFIG)) dev->capabilities |= PNP_CONFIGURABLE; - if (!(dev->flags & PNPBIOS_NO_DISABLE)) + if (!(dev->flags & PNPBIOS_NO_DISABLE) && pnpbios_is_dynamic(dev)) dev->capabilities |= PNP_DISABLE; dev->capabilities |= PNP_READ; if (pnpbios_is_dynamic(dev)) diff --git a/drivers/pnp/pnpbios/rsparser.c b/drivers/pnp/pnpbios/rsparser.c index c89c98a2c..ef508a4de 100644 --- a/drivers/pnp/pnpbios/rsparser.c +++ b/drivers/pnp/pnpbios/rsparser.c @@ -3,7 +3,6 @@ * */ -#include #include #include #include diff --git a/drivers/pnp/quirks.c b/drivers/pnp/quirks.c index 8936b0cb2..e97ecefe8 100644 --- a/drivers/pnp/quirks.c +++ b/drivers/pnp/quirks.c @@ -11,7 +11,6 @@ * Copyright (c) 1999 Martin Mares */ -#include #include #include #include diff --git a/drivers/pnp/resource.c b/drivers/pnp/resource.c index 688421de9..5c8ec21e1 100644 --- a/drivers/pnp/resource.c +++ b/drivers/pnp/resource.c @@ -6,7 +6,6 @@ * */ -#include #include #include #include @@ -241,7 +240,7 @@ int pnp_check_port(struct pnp_dev * dev, int idx) { int tmp; struct pnp_dev *tdev; - unsigned long *port, *end, *tport, *tend; + resource_size_t *port, *end, *tport, *tend; port = &dev->res.port_resource[idx].start; end = &dev->res.port_resource[idx].end; @@ -297,7 +296,7 @@ int pnp_check_mem(struct pnp_dev * dev, int idx) { int tmp; struct pnp_dev *tdev; - unsigned long *addr, *end, *taddr, *tend; + resource_size_t *addr, *end, *taddr, *tend; addr = &dev->res.mem_resource[idx].start; end = &dev->res.mem_resource[idx].end; @@ -358,7 +357,7 @@ int pnp_check_irq(struct pnp_dev * dev, int idx) { int tmp; struct pnp_dev *tdev; - unsigned long * irq = &dev->res.irq_resource[idx].start; + resource_size_t * irq = &dev->res.irq_resource[idx].start; /* if the resource doesn't exist, don't complain about it */ if (cannot_compare(dev->res.irq_resource[idx].flags)) @@ -397,7 +396,7 @@ int pnp_check_irq(struct pnp_dev * dev, int idx) * device is active because it itself may be in use */ if(!dev->active) { if (request_irq(*irq, pnp_test_handler, - SA_INTERRUPT|SA_PROBEIRQ, "pnp", NULL)) + IRQF_DISABLED|IRQF_PROBE_SHARED, "pnp", NULL)) return 0; free_irq(*irq, NULL); } @@ -424,7 +423,7 @@ int pnp_check_dma(struct pnp_dev * dev, int idx) #ifndef CONFIG_IA64 int tmp; struct pnp_dev *tdev; - unsigned long * dma = &dev->res.dma_resource[idx].start; + resource_size_t * dma = &dev->res.dma_resource[idx].start; /* if the resource doesn't exist, don't complain about it */ if (cannot_compare(dev->res.dma_resource[idx].flags)) diff --git a/drivers/pnp/support.c b/drivers/pnp/support.c index 61fe99894..946a0dcd6 100644 --- a/drivers/pnp/support.c +++ b/drivers/pnp/support.c @@ -5,7 +5,6 @@ * */ -#include #include #include #include diff --git a/drivers/rapidio/rio-access.c b/drivers/rapidio/rio-access.c index b9fab2ae3..8b56bbdd0 100644 --- a/drivers/rapidio/rio-access.c +++ b/drivers/rapidio/rio-access.c @@ -17,8 +17,8 @@ * These interrupt-safe spinlocks protect all accesses to RIO * configuration space and doorbell access. */ -static spinlock_t rio_config_lock = SPIN_LOCK_UNLOCKED; -static spinlock_t rio_doorbell_lock = SPIN_LOCK_UNLOCKED; +static DEFINE_SPINLOCK(rio_config_lock); +static DEFINE_SPINLOCK(rio_doorbell_lock); /* * Wrappers for all RIO configuration access functions. They just check diff --git a/drivers/rapidio/rio-scan.c b/drivers/rapidio/rio-scan.c index 94e30fe4b..7bf7b2c88 100644 --- a/drivers/rapidio/rio-scan.c +++ b/drivers/rapidio/rio-scan.c @@ -10,7 +10,6 @@ * option) any later version. */ -#include #include #include diff --git a/drivers/rapidio/rio-sysfs.c b/drivers/rapidio/rio-sysfs.c index bef9316e9..5687b8fcb 100644 --- a/drivers/rapidio/rio-sysfs.c +++ b/drivers/rapidio/rio-sysfs.c @@ -10,7 +10,6 @@ * option) any later version. */ -#include #include #include #include diff --git a/drivers/rapidio/rio.c b/drivers/rapidio/rio.c index 5e382470f..f644807da 100644 --- a/drivers/rapidio/rio.c +++ b/drivers/rapidio/rio.c @@ -11,7 +11,6 @@ * option) any later version. */ -#include #include #include diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 65d090dbe..7ff1d8809 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig @@ -15,7 +15,7 @@ config RTC_CLASS help Generic RTC class support. If you say yes here, you will be allowed to plug one or more RTCs to your system. You will - probably want to enable one of more of the interfaces below. + probably want to enable one or more of the interfaces below. This driver can also be built as a module. If so, the module will be called rtc-class. @@ -73,6 +73,13 @@ config RTC_INTF_DEV This driver can also be built as a module. If so, the module will be called rtc-dev. +config RTC_INTF_DEV_UIE_EMUL + bool "RTC UIE emulation on dev interface" + depends on RTC_INTF_DEV + help + Provides an emulation for RTC_UIE if the underlaying rtc chip + driver did not provide RTC_UIE ioctls. + comment "RTC drivers" depends on RTC_CLASS @@ -86,6 +93,44 @@ config RTC_DRV_X1205 This driver can also be built as a module. If so, the module will be called rtc-x1205. +config RTC_DRV_DS1307 + tristate "Dallas/Maxim DS1307 and similar I2C RTC chips" + depends on RTC_CLASS && I2C + help + If you say yes here you get support for various compatible RTC + chips (often with battery backup) connected with I2C. This driver + should handle DS1307, DS1337, DS1338, DS1339, DS1340, ST M41T00, + and probably other chips. In some cases the RTC must already + have been initialized (by manufacturing or a bootloader). + + The first seven registers on these chips hold an RTC, and other + registers may add features such as NVRAM, a trickle charger for + the RTC/NVRAM backup power, and alarms. This driver may not + expose all those available chip features. + + This driver can also be built as a module. If so, the module + will be called rtc-ds1307. + +config RTC_DRV_DS1553 + tristate "Dallas DS1553" + depends on RTC_CLASS + help + If you say yes here you get support for the + Dallas DS1553 timekeeping chip. + + This driver can also be built as a module. If so, the module + will be called rtc-ds1553. + +config RTC_DRV_ISL1208 + tristate "Intersil 1208" + depends on RTC_CLASS && I2C + help + If you say yes here you get support for the + Intersil 1208 RTC chip. + + This driver can also be built as a module. If so, the module + will be called rtc-isl1208. + config RTC_DRV_DS1672 tristate "Dallas/Maxim DS1672" depends on RTC_CLASS && I2C @@ -96,6 +141,16 @@ config RTC_DRV_DS1672 This driver can also be built as a module. If so, the module will be called rtc-ds1672. +config RTC_DRV_DS1742 + tristate "Dallas DS1742" + depends on RTC_CLASS + help + If you say yes here you get support for the + Dallas DS1742 timekeeping chip. + + This driver can also be built as a module. If so, the module + will be called rtc-ds1742. + config RTC_DRV_PCF8563 tristate "Philips PCF8563/Epson RTC8564" depends on RTC_CLASS && I2C @@ -107,6 +162,26 @@ config RTC_DRV_PCF8563 This driver can also be built as a module. If so, the module will be called rtc-pcf8563. +config RTC_DRV_PCF8583 + tristate "Philips PCF8583" + depends on RTC_CLASS && I2C + help + If you say yes here you get support for the + Philips PCF8583 RTC chip. + + This driver can also be built as a module. If so, the module + will be called rtc-pcf8583. + +config RTC_DRV_RS5C348 + tristate "Ricoh RS5C348A/B" + depends on RTC_CLASS && SPI + help + If you say yes here you get support for the + Ricoh RS5C348A and RS5C348B RTC chips. + + This driver can also be built as a module. If so, the module + will be called rtc-rs5c348. + config RTC_DRV_RS5C372 tristate "Ricoh RS5C372A/B" depends on RTC_CLASS && I2C @@ -117,6 +192,22 @@ config RTC_DRV_RS5C372 This driver can also be built as a module. If so, the module will be called rtc-rs5c372. +config RTC_DRV_S3C + tristate "Samsung S3C series SoC RTC" + depends on RTC_CLASS && ARCH_S3C2410 + help + RTC (Realtime Clock) driver for the clock inbuilt into the + Samsung S3C24XX series of SoCs. This can provide periodic + interrupt rates from 1Hz to 64Hz for user programs, and + wakeup from Alarm. + + The driver currently supports the common features on all the + S3C24XX range, such as the S3C2410, S3C2412, S3C2413, S3C2440 + and S3C2442. + + This driver can also be build as a module. If so, the module + will be called rtc-s3c. + config RTC_DRV_M48T86 tristate "ST M48T86/Dallas DS12887" depends on RTC_CLASS @@ -157,6 +248,22 @@ config RTC_DRV_VR41XX To compile this driver as a module, choose M here: the module will be called rtc-vr41xx. +config RTC_DRV_PL031 + tristate "ARM AMBA PL031 RTC" + depends on RTC_CLASS && ARM_AMBA + help + If you say Y here you will get access to ARM AMBA + PrimeCell PL031 UART found on certain ARM SOCs. + + To compile this driver as a module, choose M here: the + module will be called rtc-pl031. + +config RTC_DRV_AT91 + tristate "AT91RM9200" + depends on RTC_CLASS && ARCH_AT91RM9200 + help + Driver for the Atmel AT91RM9200's internal RTC (Realtime Clock). + config RTC_DRV_TEST tristate "Test driver/device" depends on RTC_CLASS @@ -172,4 +279,24 @@ config RTC_DRV_TEST This driver can also be built as a module. If so, the module will be called rtc-test. +config RTC_DRV_MAX6902 + tristate "Maxim 6902" + depends on RTC_CLASS && SPI + help + If you say yes here you will get support for the + Maxim MAX6902 spi RTC chip. + + This driver can also be built as a module. If so, the module + will be called rtc-max6902. + +config RTC_DRV_V3020 + tristate "EM Microelectronic V3020" + depends on RTC_CLASS + help + If you say yes here you will get support for the + EM Microelectronic v3020 RTC chip. + + This driver can also be built as a module. If so, the module + will be called rtc-v3020. + endmenu diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index a9ca0f171..bbcfb09d8 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile @@ -12,11 +12,22 @@ obj-$(CONFIG_RTC_INTF_PROC) += rtc-proc.o obj-$(CONFIG_RTC_INTF_DEV) += rtc-dev.o obj-$(CONFIG_RTC_DRV_X1205) += rtc-x1205.o +obj-$(CONFIG_RTC_DRV_ISL1208) += rtc-isl1208.o obj-$(CONFIG_RTC_DRV_TEST) += rtc-test.o +obj-$(CONFIG_RTC_DRV_DS1307) += rtc-ds1307.o obj-$(CONFIG_RTC_DRV_DS1672) += rtc-ds1672.o +obj-$(CONFIG_RTC_DRV_DS1742) += rtc-ds1742.o obj-$(CONFIG_RTC_DRV_PCF8563) += rtc-pcf8563.o +obj-$(CONFIG_RTC_DRV_PCF8583) += rtc-pcf8583.o obj-$(CONFIG_RTC_DRV_RS5C372) += rtc-rs5c372.o +obj-$(CONFIG_RTC_DRV_S3C) += rtc-s3c.o +obj-$(CONFIG_RTC_DRV_RS5C348) += rtc-rs5c348.o obj-$(CONFIG_RTC_DRV_M48T86) += rtc-m48t86.o +obj-$(CONFIG_RTC_DRV_DS1553) += rtc-ds1553.o obj-$(CONFIG_RTC_DRV_EP93XX) += rtc-ep93xx.o obj-$(CONFIG_RTC_DRV_SA1100) += rtc-sa1100.o obj-$(CONFIG_RTC_DRV_VR41XX) += rtc-vr41xx.o +obj-$(CONFIG_RTC_DRV_PL031) += rtc-pl031.o +obj-$(CONFIG_RTC_DRV_MAX6902) += rtc-max6902.o +obj-$(CONFIG_RTC_DRV_V3020) += rtc-v3020.o +obj-$(CONFIG_RTC_DRV_AT91) += rtc-at91.o diff --git a/drivers/rtc/class.c b/drivers/rtc/class.c index 413c7d54e..1cb61a761 100644 --- a/drivers/rtc/class.c +++ b/drivers/rtc/class.c @@ -69,6 +69,7 @@ struct rtc_device *rtc_device_register(const char *name, struct device *dev, rtc->id = id; rtc->ops = ops; rtc->owner = owner; + rtc->max_user_freq = 64; rtc->class_dev.dev = dev; rtc->class_dev.class = rtc_class; rtc->class_dev.release = rtc_device_release; @@ -93,7 +94,9 @@ exit_kfree: kfree(rtc); exit_idr: + mutex_lock(&idr_lock); idr_remove(&rtc_idr, id); + mutex_unlock(&idr_lock); exit: dev_err(dev, "rtc core: unable to register %s, err = %d\n", diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c index 56e490709..579cd667b 100644 --- a/drivers/rtc/interface.c +++ b/drivers/rtc/interface.c @@ -229,6 +229,9 @@ int rtc_irq_set_state(struct class_device *class_dev, struct rtc_task *task, int unsigned long flags; struct rtc_device *rtc = to_rtc_device(class_dev); + if (rtc->ops->irq_set_state == NULL) + return -ENXIO; + spin_lock_irqsave(&rtc->irq_task_lock, flags); if (rtc->irq_task != task) err = -ENXIO; @@ -243,25 +246,12 @@ EXPORT_SYMBOL_GPL(rtc_irq_set_state); int rtc_irq_set_freq(struct class_device *class_dev, struct rtc_task *task, int freq) { - int err = 0, tmp = 0; + int err = 0; unsigned long flags; struct rtc_device *rtc = to_rtc_device(class_dev); - /* allowed range is 2-8192 */ - if (freq < 2 || freq > 8192) - return -EINVAL; -/* - FIXME: this does not belong here, will move where appropriate - at a later stage. It cannot hurt right now, trust me :) - if ((freq > rtc_max_user_freq) && (!capable(CAP_SYS_RESOURCE))) - return -EACCES; -*/ - /* check if freq is a power of 2 */ - while (freq > (1 << tmp)) - tmp++; - - if (freq != (1 << tmp)) - return -EINVAL; + if (rtc->ops->irq_set_freq == NULL) + return -ENXIO; spin_lock_irqsave(&rtc->irq_task_lock, flags); if (rtc->irq_task != task) diff --git a/drivers/rtc/rtc-dev.c b/drivers/rtc/rtc-dev.c index 201156700..61a58259c 100644 --- a/drivers/rtc/rtc-dev.c +++ b/drivers/rtc/rtc-dev.c @@ -48,6 +48,93 @@ static int rtc_dev_open(struct inode *inode, struct file *file) return err; } +#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL +/* + * Routine to poll RTC seconds field for change as often as possible, + * after first RTC_UIE use timer to reduce polling + */ +static void rtc_uie_task(void *data) +{ + struct rtc_device *rtc = data; + struct rtc_time tm; + int num = 0; + int err; + + err = rtc_read_time(&rtc->class_dev, &tm); + spin_lock_irq(&rtc->irq_lock); + if (rtc->stop_uie_polling || err) { + rtc->uie_task_active = 0; + } else if (rtc->oldsecs != tm.tm_sec) { + num = (tm.tm_sec + 60 - rtc->oldsecs) % 60; + rtc->oldsecs = tm.tm_sec; + rtc->uie_timer.expires = jiffies + HZ - (HZ/10); + rtc->uie_timer_active = 1; + rtc->uie_task_active = 0; + add_timer(&rtc->uie_timer); + } else if (schedule_work(&rtc->uie_task) == 0) { + rtc->uie_task_active = 0; + } + spin_unlock_irq(&rtc->irq_lock); + if (num) + rtc_update_irq(&rtc->class_dev, num, RTC_UF | RTC_IRQF); +} + +static void rtc_uie_timer(unsigned long data) +{ + struct rtc_device *rtc = (struct rtc_device *)data; + unsigned long flags; + + spin_lock_irqsave(&rtc->irq_lock, flags); + rtc->uie_timer_active = 0; + rtc->uie_task_active = 1; + if ((schedule_work(&rtc->uie_task) == 0)) + rtc->uie_task_active = 0; + spin_unlock_irqrestore(&rtc->irq_lock, flags); +} + +static void clear_uie(struct rtc_device *rtc) +{ + spin_lock_irq(&rtc->irq_lock); + if (rtc->irq_active) { + rtc->stop_uie_polling = 1; + if (rtc->uie_timer_active) { + spin_unlock_irq(&rtc->irq_lock); + del_timer_sync(&rtc->uie_timer); + spin_lock_irq(&rtc->irq_lock); + rtc->uie_timer_active = 0; + } + if (rtc->uie_task_active) { + spin_unlock_irq(&rtc->irq_lock); + flush_scheduled_work(); + spin_lock_irq(&rtc->irq_lock); + } + rtc->irq_active = 0; + } + spin_unlock_irq(&rtc->irq_lock); +} + +static int set_uie(struct rtc_device *rtc) +{ + struct rtc_time tm; + int err; + + err = rtc_read_time(&rtc->class_dev, &tm); + if (err) + return err; + spin_lock_irq(&rtc->irq_lock); + if (!rtc->irq_active) { + rtc->irq_active = 1; + rtc->stop_uie_polling = 0; + rtc->oldsecs = tm.tm_sec; + rtc->uie_task_active = 1; + if (schedule_work(&rtc->uie_task) == 0) + rtc->uie_task_active = 0; + } + rtc->irq_data = 0; + spin_unlock_irq(&rtc->irq_lock); + return 0; +} +#endif /* CONFIG_RTC_INTF_DEV_UIE_EMUL */ static ssize_t rtc_dev_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) @@ -127,6 +214,28 @@ static int rtc_dev_ioctl(struct inode *inode, struct file *file, struct rtc_wkalrm alarm; void __user *uarg = (void __user *) arg; + /* check that the calles has appropriate permissions + * for certain ioctls. doing this check here is useful + * to avoid duplicate code in each driver. + */ + switch (cmd) { + case RTC_EPOCH_SET: + case RTC_SET_TIME: + if (!capable(CAP_SYS_TIME)) + return -EACCES; + break; + + case RTC_IRQP_SET: + if (arg > rtc->max_user_freq && !capable(CAP_SYS_RESOURCE)) + return -EACCES; + break; + + case RTC_PIE_ON: + if (!capable(CAP_SYS_RESOURCE)) + return -EACCES; + break; + } + /* avoid conflicting IRQ users */ if (cmd == RTC_PIE_ON || cmd == RTC_PIE_OFF || cmd == RTC_IRQP_SET) { spin_lock(&rtc->irq_task_lock); @@ -185,9 +294,6 @@ static int rtc_dev_ioctl(struct inode *inode, struct file *file, break; case RTC_SET_TIME: - if (!capable(CAP_SYS_TIME)) - return -EACCES; - if (copy_from_user(&tm, uarg, sizeof(tm))) return -EFAULT; @@ -203,10 +309,6 @@ static int rtc_dev_ioctl(struct inode *inode, struct file *file, err = -EINVAL; break; } - if (!capable(CAP_SYS_TIME)) { - err = -EACCES; - break; - } rtc_epoch = arg; err = 0; #endif @@ -232,6 +334,14 @@ static int rtc_dev_ioctl(struct inode *inode, struct file *file, return -EFAULT; break; +#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL + case RTC_UIE_OFF: + clear_uie(rtc); + return 0; + + case RTC_UIE_ON: + return set_uie(rtc); +#endif default: err = -ENOTTY; break; @@ -244,6 +354,9 @@ static int rtc_dev_release(struct inode *inode, struct file *file) { struct rtc_device *rtc = to_rtc_device(file->private_data); +#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL + clear_uie(rtc); +#endif if (rtc->ops->release) rtc->ops->release(rtc->class_dev.dev); @@ -284,6 +397,10 @@ static int rtc_dev_add_device(struct class_device *class_dev, mutex_init(&rtc->char_lock); spin_lock_init(&rtc->irq_lock); init_waitqueue_head(&rtc->irq_queue); +#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL + INIT_WORK(&rtc->uie_task, rtc_uie_task, rtc); + setup_timer(&rtc->uie_timer, rtc_uie_timer, (unsigned long)rtc); +#endif cdev_init(&rtc->char_dev, &rtc_dev_fops); rtc->char_dev.owner = rtc->owner; diff --git a/drivers/rtc/rtc-lib.c b/drivers/rtc/rtc-lib.c index cfedc1d28..9812120f3 100644 --- a/drivers/rtc/rtc-lib.c +++ b/drivers/rtc/rtc-lib.c @@ -18,15 +18,34 @@ static const unsigned char rtc_days_in_month[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; +static const unsigned short rtc_ydays[2][13] = { + /* Normal years */ + { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }, + /* Leap years */ + { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 } +}; + #define LEAPS_THRU_END_OF(y) ((y)/4 - (y)/100 + (y)/400) #define LEAP_YEAR(year) ((!(year % 4) && (year % 100)) || !(year % 400)) +/* + * The number of days in the month. + */ int rtc_month_days(unsigned int month, unsigned int year) { return rtc_days_in_month[month] + (LEAP_YEAR(year) && month == 1); } EXPORT_SYMBOL(rtc_month_days); +/* + * The number of days since January 1. (0 to 365) + */ +int rtc_year_days(unsigned int day, unsigned int month, unsigned int year) +{ + return rtc_ydays[LEAP_YEAR(year)][month] + day-1; +} +EXPORT_SYMBOL(rtc_year_days); + /* * Convert seconds since 01-01-1970 00:00:00 to Gregorian date. */ diff --git a/drivers/rtc/rtc-pcf8563.c b/drivers/rtc/rtc-pcf8563.c index ba9a583b7..bd4310643 100644 --- a/drivers/rtc/rtc-pcf8563.c +++ b/drivers/rtc/rtc-pcf8563.c @@ -95,7 +95,7 @@ static int pcf8563_get_datetime(struct i2c_client *client, struct rtc_time *tm) tm->tm_wday = buf[PCF8563_REG_DW] & 0x07; tm->tm_mon = BCD2BIN(buf[PCF8563_REG_MO] & 0x1F) - 1; /* rtc mn 1-12 */ tm->tm_year = BCD2BIN(buf[PCF8563_REG_YR]) - + (buf[PCF8563_REG_MO] & PCF8563_MO_C ? 100 : 0); + + (buf[PCF8563_REG_MO] & PCF8563_MO_C ? 0 : 100); dev_dbg(&client->dev, "%s: tm is secs=%d, mins=%d, hours=%d, " "mday=%d, mon=%d, year=%d, wday=%d\n", @@ -135,7 +135,7 @@ static int pcf8563_set_datetime(struct i2c_client *client, struct rtc_time *tm) /* year and century */ buf[PCF8563_REG_YR] = BIN2BCD(tm->tm_year % 100); - if (tm->tm_year / 100) + if (tm->tm_year < 100) buf[PCF8563_REG_MO] |= PCF8563_MO_C; buf[PCF8563_REG_DW] = tm->tm_wday & 0x07; diff --git a/drivers/rtc/rtc-sa1100.c b/drivers/rtc/rtc-sa1100.c index a997529f8..ee4b61ee6 100644 --- a/drivers/rtc/rtc-sa1100.c +++ b/drivers/rtc/rtc-sa1100.c @@ -45,7 +45,7 @@ static unsigned long rtc_freq = 1024; static struct rtc_time rtc_alarm; -static spinlock_t sa1100_rtc_lock = SPIN_LOCK_UNLOCKED; +static DEFINE_SPINLOCK(sa1100_rtc_lock); static int rtc_update_alarm(struct rtc_time *alrm) { @@ -157,19 +157,19 @@ static int sa1100_rtc_open(struct device *dev) { int ret; - ret = request_irq(IRQ_RTC1Hz, sa1100_rtc_interrupt, SA_INTERRUPT, + ret = request_irq(IRQ_RTC1Hz, sa1100_rtc_interrupt, IRQF_DISABLED, "rtc 1Hz", dev); if (ret) { dev_err(dev, "IRQ %d already in use.\n", IRQ_RTC1Hz); goto fail_ui; } - ret = request_irq(IRQ_RTCAlrm, sa1100_rtc_interrupt, SA_INTERRUPT, + ret = request_irq(IRQ_RTCAlrm, sa1100_rtc_interrupt, IRQF_DISABLED, "rtc Alrm", dev); if (ret) { dev_err(dev, "IRQ %d already in use.\n", IRQ_RTCAlrm); goto fail_ai; } - ret = request_irq(IRQ_OST1, timer1_interrupt, SA_INTERRUPT, + ret = request_irq(IRQ_OST1, timer1_interrupt, IRQF_DISABLED, "rtc timer", dev); if (ret) { dev_err(dev, "IRQ %d already in use.\n", IRQ_OST1); @@ -229,8 +229,6 @@ static int sa1100_rtc_ioctl(struct device *dev, unsigned int cmd, spin_unlock_irq(&sa1100_rtc_lock); return 0; case RTC_PIE_ON: - if ((rtc_freq > 64) && !capable(CAP_SYS_RESOURCE)) - return -EACCES; spin_lock_irq(&sa1100_rtc_lock); OSMR1 = TIMER_FREQ/rtc_freq + OSCR; OIER |= OIER_E1; @@ -242,8 +240,6 @@ static int sa1100_rtc_ioctl(struct device *dev, unsigned int cmd, case RTC_IRQP_SET: if (arg < 1 || arg > TIMER_FREQ) return -EINVAL; - if ((arg > 64) && (!capable(CAP_SYS_RESOURCE))) - return -EACCES; rtc_freq = arg; return 0; } diff --git a/drivers/rtc/rtc-vr41xx.c b/drivers/rtc/rtc-vr41xx.c index 277596c30..596764fd2 100644 --- a/drivers/rtc/rtc-vr41xx.c +++ b/drivers/rtc/rtc-vr41xx.c @@ -30,7 +30,7 @@ #include #include #include -#include +#include MODULE_AUTHOR("Yoichi Yuasa "); MODULE_DESCRIPTION("NEC VR4100 series RTC driver"); @@ -81,7 +81,6 @@ MODULE_LICENSE("GPL"); #define RTC_FREQUENCY 32768 #define MAX_PERIODIC_RATE 6553 -#define MAX_USER_PERIODIC_RATE 64 static void __iomem *rtc1_base; static void __iomem *rtc2_base; @@ -94,7 +93,7 @@ static void __iomem *rtc2_base; static unsigned long epoch = 1970; /* Jan 1 1970 00:00:00 */ -static spinlock_t rtc_lock = SPIN_LOCK_UNLOCKED; +static DEFINE_SPINLOCK(rtc_lock); static char rtc_name[] = "RTC"; static unsigned long periodic_frequency; static unsigned long periodic_count; @@ -240,9 +239,6 @@ static int vr41xx_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long if (arg > MAX_PERIODIC_RATE) return -EINVAL; - if (arg > MAX_USER_PERIODIC_RATE && capable(CAP_SYS_RESOURCE) == 0) - return -EACCES; - periodic_frequency = arg; count = RTC_FREQUENCY; @@ -263,10 +259,6 @@ static int vr41xx_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long /* Doesn't support before 1900 */ if (arg < 1900) return -EINVAL; - - if (capable(CAP_SYS_TIME) == 0) - return -EACCES; - epoch = arg; break; default: @@ -353,11 +345,11 @@ static int __devinit rtc_probe(struct platform_device *pdev) spin_unlock_irq(&rtc_lock); irq = ELAPSEDTIME_IRQ; - retval = request_irq(irq, elapsedtime_interrupt, SA_INTERRUPT, + retval = request_irq(irq, elapsedtime_interrupt, IRQF_DISABLED, "elapsed_time", pdev); if (retval == 0) { irq = RTCLONG1_IRQ; - retval = request_irq(irq, rtclong1_interrupt, SA_INTERRUPT, + retval = request_irq(irq, rtclong1_interrupt, IRQF_DISABLED, "rtclong1", pdev); } diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index cfb1fff37..25c1ef6df 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c @@ -9,7 +9,6 @@ * */ -#include #include #include #include @@ -53,7 +52,7 @@ static void dasd_setup_queue(struct dasd_device * device); static void dasd_free_queue(struct dasd_device * device); static void dasd_flush_request_queue(struct dasd_device *); static void dasd_int_handler(struct ccw_device *, unsigned long, struct irb *); -static void dasd_flush_ccw_queue(struct dasd_device *, int); +static int dasd_flush_ccw_queue(struct dasd_device *, int); static void dasd_tasklet(struct dasd_device *); static void do_kick_device(void *data); @@ -61,6 +60,7 @@ static void do_kick_device(void *data); * SECTION: Operations on the device structure. */ static wait_queue_head_t dasd_init_waitq; +static wait_queue_head_t dasd_flush_wq; /* * Allocate memory for a new device structure. @@ -95,7 +95,7 @@ dasd_alloc_device(void) spin_lock_init(&device->mem_lock); spin_lock_init(&device->request_queue_lock); atomic_set (&device->tasklet_scheduled, 0); - tasklet_init(&device->tasklet, + tasklet_init(&device->tasklet, (void (*)(unsigned long)) dasd_tasklet, (unsigned long) device); INIT_LIST_HEAD(&device->ccw_queue); @@ -122,13 +122,13 @@ dasd_free_device(struct dasd_device *device) /* * Make a new device known to the system. */ -static inline int +static int dasd_state_new_to_known(struct dasd_device *device) { int rc; /* - * As long as the device is not in state DASD_STATE_NEW we want to + * As long as the device is not in state DASD_STATE_NEW we want to * keep the reference count > 0. */ dasd_get_device(device); @@ -146,7 +146,7 @@ dasd_state_new_to_known(struct dasd_device *device) /* * Let the system forget about a device. */ -static inline void +static int dasd_state_known_to_new(struct dasd_device * device) { /* Disable extended error reporting for this device. */ @@ -164,12 +164,13 @@ dasd_state_known_to_new(struct dasd_device * device) /* Give up reference we took in dasd_state_new_to_known. */ dasd_put_device(device); + return 0; } /* * Request the irq line for the device. */ -static inline int +static int dasd_state_known_to_basic(struct dasd_device * device) { int rc; @@ -193,17 +194,23 @@ dasd_state_known_to_basic(struct dasd_device * device) /* * Release the irq line for the device. Terminate any running i/o. */ -static inline void +static int dasd_state_basic_to_known(struct dasd_device * device) { + int rc; + dasd_gendisk_free(device); - dasd_flush_ccw_queue(device, 1); + rc = dasd_flush_ccw_queue(device, 1); + if (rc) + return rc; + DBF_DEV_EVENT(DBF_EMERG, device, "%p debug area deleted", device); if (device->debug_area != NULL) { debug_unregister(device->debug_area); device->debug_area = NULL; } device->state = DASD_STATE_KNOWN; + return 0; } /* @@ -220,7 +227,7 @@ dasd_state_basic_to_known(struct dasd_device * device) * In case the analysis returns an error, the device setup is stopped * (a fake disk was already added to allow formatting). */ -static inline int +static int dasd_state_basic_to_ready(struct dasd_device * device) { int rc; @@ -248,25 +255,31 @@ dasd_state_basic_to_ready(struct dasd_device * device) * Forget format information. Check if the target level is basic * and if it is create fake disk for formatting. */ -static inline void +static int dasd_state_ready_to_basic(struct dasd_device * device) { - dasd_flush_ccw_queue(device, 0); + int rc; + + rc = dasd_flush_ccw_queue(device, 0); + if (rc) + return rc; dasd_destroy_partitions(device); dasd_flush_request_queue(device); device->blocks = 0; device->bp_block = 0; device->s2b_shift = 0; device->state = DASD_STATE_BASIC; + return 0; } /* * Back to basic. */ -static inline void +static int dasd_state_unfmt_to_basic(struct dasd_device * device) { device->state = DASD_STATE_BASIC; + return 0; } /* @@ -274,7 +287,7 @@ dasd_state_unfmt_to_basic(struct dasd_device * device) * the requeueing of requests from the linux request queue to the * ccw queue. */ -static inline int +static int dasd_state_ready_to_online(struct dasd_device * device) { device->state = DASD_STATE_ONLINE; @@ -285,16 +298,17 @@ dasd_state_ready_to_online(struct dasd_device * device) /* * Stop the requeueing of requests again. */ -static inline void +static int dasd_state_online_to_ready(struct dasd_device * device) { device->state = DASD_STATE_READY; + return 0; } /* * Device startup state changes. */ -static inline int +static int dasd_increase_state(struct dasd_device *device) { int rc; @@ -330,30 +344,37 @@ dasd_increase_state(struct dasd_device *device) /* * Device shutdown state changes. */ -static inline int +static int dasd_decrease_state(struct dasd_device *device) { + int rc; + + rc = 0; if (device->state == DASD_STATE_ONLINE && device->target <= DASD_STATE_READY) - dasd_state_online_to_ready(device); - - if (device->state == DASD_STATE_READY && + rc = dasd_state_online_to_ready(device); + + if (!rc && + device->state == DASD_STATE_READY && device->target <= DASD_STATE_BASIC) - dasd_state_ready_to_basic(device); + rc = dasd_state_ready_to_basic(device); - if (device->state == DASD_STATE_UNFMT && + if (!rc && + device->state == DASD_STATE_UNFMT && device->target <= DASD_STATE_BASIC) - dasd_state_unfmt_to_basic(device); + rc = dasd_state_unfmt_to_basic(device); - if (device->state == DASD_STATE_BASIC && + if (!rc && + device->state == DASD_STATE_BASIC && device->target <= DASD_STATE_KNOWN) - dasd_state_basic_to_known(device); - - if (device->state == DASD_STATE_KNOWN && + rc = dasd_state_basic_to_known(device); + + if (!rc && + device->state == DASD_STATE_KNOWN && device->target <= DASD_STATE_NEW) - dasd_state_known_to_new(device); + rc = dasd_state_known_to_new(device); - return 0; + return rc; } /* @@ -702,6 +723,7 @@ dasd_term_IO(struct dasd_ccw_req * cqr) cqr->retries--; cqr->status = DASD_CQR_CLEAR; cqr->stopclk = get_clock(); + cqr->starttime = 0; DBF_DEV_EVENT(DBF_DEBUG, device, "terminate cqr %p successful", cqr); @@ -979,6 +1001,7 @@ dasd_int_handler(struct ccw_device *cdev, unsigned long intparm, irb->scsw.fctl & SCSW_FCTL_CLEAR_FUNC) { cqr->status = DASD_CQR_QUEUED; dasd_clear_timer(device); + wake_up(&dasd_flush_wq); dasd_schedule_bh(device); return; } @@ -994,7 +1017,7 @@ dasd_int_handler(struct ccw_device *cdev, unsigned long intparm, ((irb->scsw.cstat << 8) | irb->scsw.dstat), cqr); /* Find out the appropriate era_action. */ - if (irb->scsw.fctl & SCSW_FCTL_HALT_FUNC) + if (irb->scsw.fctl & SCSW_FCTL_HALT_FUNC) era = dasd_era_fatal; else if (irb->scsw.dstat == (DEV_STAT_CHN_END | DEV_STAT_DEV_END) && irb->scsw.cstat == 0 && @@ -1004,7 +1027,7 @@ dasd_int_handler(struct ccw_device *cdev, unsigned long intparm, era = dasd_era_fatal; /* don't recover this request */ else if (irb->esw.esw0.erw.cons) era = device->discipline->examine_error(cqr, irb); - else + else era = dasd_era_recover; DBF_DEV_EVENT(DBF_DEBUG, device, "era_code %d", era); @@ -1242,6 +1265,10 @@ __dasd_check_expire(struct dasd_device * device) cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, list); if (cqr->status == DASD_CQR_IN_IO && cqr->expires != 0) { if (time_after_eq(jiffies, cqr->expires + cqr->starttime)) { + DEV_MESSAGE(KERN_ERR, device, + "internal error - timeout (%is) expired " + "for cqr %p (%i retries left)", + (cqr->expires/HZ), cqr, cqr->retries); if (device->discipline->term_IO(cqr) != 0) /* Hmpf, try again in 1/10 sec */ dasd_set_timer(device, 10); @@ -1286,46 +1313,100 @@ __dasd_start_head(struct dasd_device * device) dasd_set_timer(device, 50); } +static inline int +_wait_for_clear(struct dasd_ccw_req *cqr) +{ + return (cqr->status == DASD_CQR_QUEUED); +} + /* - * Remove requests from the ccw queue. + * Remove all requests from the ccw queue (all = '1') or only block device + * requests in case all = '0'. + * Take care of the erp-chain (chained via cqr->refers) and remove either + * the whole erp-chain or none of the erp-requests. + * If a request is currently running, term_IO is called and the request + * is re-queued. Prior to removing the terminated request we need to wait + * for the clear-interrupt. + * In case termination is not possible we stop processing and just finishing + * the already moved requests. */ -static void +static int dasd_flush_ccw_queue(struct dasd_device * device, int all) { + struct dasd_ccw_req *cqr, *orig, *n; + int rc, i; + struct list_head flush_queue; - struct list_head *l, *n; - struct dasd_ccw_req *cqr; INIT_LIST_HEAD(&flush_queue); spin_lock_irq(get_ccwdev_lock(device->cdev)); - list_for_each_safe(l, n, &device->ccw_queue) { - cqr = list_entry(l, struct dasd_ccw_req, list); + rc = 0; +restart: + list_for_each_entry_safe(cqr, n, &device->ccw_queue, list) { + /* get original request of erp request-chain */ + for (orig = cqr; orig->refers != NULL; orig = orig->refers); + /* Flush all request or only block device requests? */ - if (all == 0 && cqr->callback == dasd_end_request_cb) + if (all == 0 && cqr->callback != dasd_end_request_cb && + orig->callback != dasd_end_request_cb) { continue; - if (cqr->status == DASD_CQR_IN_IO) - device->discipline->term_IO(cqr); - if (cqr->status != DASD_CQR_DONE || - cqr->status != DASD_CQR_FAILED) { - cqr->status = DASD_CQR_FAILED; + } + /* Check status and move request to flush_queue */ + switch (cqr->status) { + case DASD_CQR_IN_IO: + rc = device->discipline->term_IO(cqr); + if (rc) { + /* unable to terminate requeust */ + DEV_MESSAGE(KERN_ERR, device, + "dasd flush ccw_queue is unable " + " to terminate request %p", + cqr); + /* stop flush processing */ + goto finished; + } + break; + case DASD_CQR_QUEUED: + case DASD_CQR_ERROR: + /* set request to FAILED */ cqr->stopclk = get_clock(); + cqr->status = DASD_CQR_FAILED; + break; + default: /* do not touch the others */ + break; + } + /* Rechain request (including erp chain) */ + for (i = 0; cqr != NULL; cqr = cqr->refers, i++) { + cqr->endclk = get_clock(); + list_move_tail(&cqr->list, &flush_queue); + } + if (i > 1) + /* moved more than one request - need to restart */ + goto restart; + } + +finished: + spin_unlock_irq(get_ccwdev_lock(device->cdev)); + /* Now call the callback function of flushed requests */ +restart_cb: + list_for_each_entry_safe(cqr, n, &flush_queue, list) { + if (cqr->status == DASD_CQR_CLEAR) { + /* wait for clear interrupt! */ + wait_event(dasd_flush_wq, _wait_for_clear(cqr)); + cqr->status = DASD_CQR_FAILED; } /* Process finished ERP request. */ if (cqr->refers) { __dasd_process_erp(device, cqr); - continue; + /* restart list_for_xx loop since dasd_process_erp + * might remove multiple elements */ + goto restart_cb; } - /* Rechain request on device request queue */ + /* call the callback function */ cqr->endclk = get_clock(); - list_move_tail(&cqr->list, &flush_queue); - } - spin_unlock_irq(get_ccwdev_lock(device->cdev)); - /* Now call the callback function of flushed requests */ - list_for_each_safe(l, n, &flush_queue) { - cqr = list_entry(l, struct dasd_ccw_req, list); if (cqr->callback != NULL) (cqr->callback)(cqr, cqr->callback_data); } + return rc; } /* @@ -1450,23 +1531,23 @@ dasd_sleep_on(struct dasd_ccw_req * cqr) wait_queue_head_t wait_q; struct dasd_device *device; int rc; - + device = cqr->device; spin_lock_irq(get_ccwdev_lock(device->cdev)); - + init_waitqueue_head (&wait_q); cqr->callback = dasd_wakeup_cb; cqr->callback_data = (void *) &wait_q; cqr->status = DASD_CQR_QUEUED; list_add_tail(&cqr->list, &device->ccw_queue); - + /* let the bh start the request to keep them in order */ dasd_schedule_bh(device); - + spin_unlock_irq(get_ccwdev_lock(device->cdev)); wait_event(wait_q, _wait_for_wakeup(cqr)); - + /* Request status is either done or failed. */ rc = (cqr->status == DASD_CQR_FAILED) ? -EIO : 0; return rc; @@ -1511,10 +1592,8 @@ dasd_sleep_on_interruptible(struct dasd_ccw_req * cqr) if (device->discipline->term_IO) { cqr->retries = -1; device->discipline->term_IO(cqr); - /*nished = - * wait (non-interruptible) for final status - * because signal ist still pending - */ + /* wait (non-interruptible) for final status + * because signal ist still pending */ spin_unlock_irq(get_ccwdev_lock(device->cdev)); wait_event(wait_q, _wait_for_wakeup(cqr)); spin_lock_irq(get_ccwdev_lock(device->cdev)); @@ -1547,19 +1626,11 @@ static inline int _dasd_term_running_cqr(struct dasd_device *device) { struct dasd_ccw_req *cqr; - int rc; if (list_empty(&device->ccw_queue)) return 0; cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, list); - rc = device->discipline->term_IO(cqr); - if (rc == 0) { - /* termination successful */ - cqr->status = DASD_CQR_QUEUED; - cqr->startclk = cqr->stopclk = 0; - cqr->starttime = 0; - } - return rc; + return device->discipline->term_IO(cqr); } int @@ -1568,7 +1639,7 @@ dasd_sleep_on_immediatly(struct dasd_ccw_req * cqr) wait_queue_head_t wait_q; struct dasd_device *device; int rc; - + device = cqr->device; spin_lock_irq(get_ccwdev_lock(device->cdev)); rc = _dasd_term_running_cqr(device); @@ -1576,20 +1647,20 @@ dasd_sleep_on_immediatly(struct dasd_ccw_req * cqr) spin_unlock_irq(get_ccwdev_lock(device->cdev)); return rc; } - + init_waitqueue_head (&wait_q); cqr->callback = dasd_wakeup_cb; cqr->callback_data = (void *) &wait_q; cqr->status = DASD_CQR_QUEUED; list_add(&cqr->list, &device->ccw_queue); - + /* let the bh start the request to keep them in order */ dasd_schedule_bh(device); - + spin_unlock_irq(get_ccwdev_lock(device->cdev)); wait_event(wait_q, _wait_for_wakeup(cqr)); - + /* Request status is either done or failed. */ rc = (cqr->status == DASD_CQR_FAILED) ? -EIO : 0; return rc; @@ -1725,14 +1796,11 @@ dasd_flush_request_queue(struct dasd_device * device) if (!device->request_queue) return; - + spin_lock_irq(&device->request_queue_lock); - while (!list_empty(&device->request_queue->queue_head)) { - req = elv_next_request(device->request_queue); - if (req == NULL) - break; - dasd_end_request(req, 0); + while ((req = elv_next_request(device->request_queue))) { blkdev_dequeue_request(req); + dasd_end_request(req, 0); } spin_unlock_irq(&device->request_queue_lock); } @@ -1834,7 +1902,6 @@ dasd_exit(void) } dasd_gendisk_exit(); dasd_devmap_exit(); - devfs_remove("dasd"); if (dasd_debug_area != NULL) { debug_unregister(dasd_debug_area); dasd_debug_area = NULL; @@ -1855,15 +1922,34 @@ dasd_generic_probe (struct ccw_device *cdev, { int ret; + ret = ccw_device_set_options(cdev, CCWDEV_DO_PATHGROUP); + if (ret) { + printk(KERN_WARNING + "dasd_generic_probe: could not set ccw-device options " + "for %s\n", cdev->dev.bus_id); + return ret; + } ret = dasd_add_sysfs_files(cdev); if (ret) { printk(KERN_WARNING "dasd_generic_probe: could not add sysfs entries " "for %s\n", cdev->dev.bus_id); - } else { - cdev->handler = &dasd_int_handler; + return ret; } + cdev->handler = &dasd_int_handler; + /* + * Automatically online either all dasd devices (dasd_autodetect) + * or all devices specified with dasd= parameters during + * initial probe. + */ + if ((dasd_get_feature(cdev, DASD_FEATURE_INITIAL_ONLINE) > 0 ) || + (dasd_autodetect && dasd_busid_known(cdev->dev.bus_id) != 0)) + ret = ccw_device_set_online(cdev); + if (ret) + printk(KERN_WARNING + "dasd_generic_probe: could not initially online " + "ccw-device %s\n", cdev->dev.bus_id); return ret; } @@ -1911,6 +1997,8 @@ dasd_generic_set_online (struct ccw_device *cdev, struct dasd_device *device; int rc; + /* first online clears initial online feature flag */ + dasd_set_feature(cdev, DASD_FEATURE_INITIAL_ONLINE, 0); device = dasd_create_device(cdev); if (IS_ERR(device)) return PTR_ERR(device); @@ -2065,31 +2153,6 @@ dasd_generic_notify(struct ccw_device *cdev, int event) return ret; } -/* - * Automatically online either all dasd devices (dasd_autodetect) or - * all devices specified with dasd= parameters. - */ -static int -__dasd_auto_online(struct device *dev, void *data) -{ - struct ccw_device *cdev; - - cdev = to_ccwdev(dev); - if (dasd_autodetect || dasd_busid_known(cdev->dev.bus_id) == 0) - ccw_device_set_online(cdev); - return 0; -} - -void -dasd_generic_auto_online (struct ccw_driver *dasd_discipline_driver) -{ - struct device_driver *drv; - - drv = get_driver(&dasd_discipline_driver->driver); - driver_for_each_device(drv, NULL, NULL, __dasd_auto_online); - put_driver(drv); -} - static int __init dasd_init(void) @@ -2097,6 +2160,7 @@ dasd_init(void) int rc; init_waitqueue_head(&dasd_init_waitq); + init_waitqueue_head(&dasd_flush_wq); /* register 'common' DASD debug area, used for all DBF_XXX calls */ dasd_debug_area = debug_register("dasd", 1, 2, 8 * sizeof (long)); @@ -2111,9 +2175,6 @@ dasd_init(void) dasd_diag_discipline_pointer = NULL; - rc = devfs_mk_dir("dasd"); - if (rc) - goto failed; rc = dasd_devmap_init(); if (rc) goto failed; @@ -2170,23 +2231,4 @@ EXPORT_SYMBOL_GPL(dasd_generic_remove); EXPORT_SYMBOL_GPL(dasd_generic_notify); EXPORT_SYMBOL_GPL(dasd_generic_set_online); EXPORT_SYMBOL_GPL(dasd_generic_set_offline); -EXPORT_SYMBOL_GPL(dasd_generic_auto_online); -/* - * Overrides for Emacs so that we follow Linus's tabbing style. - * Emacs will notice this stuff at the end of the file and automatically - * adjust the settings for this buffer only. This must remain at the end - * of the file. - * --------------------------------------------------------------------------- - * Local variables: - * c-indent-level: 4 - * c-brace-imaginary-offset: 0 - * c-brace-offset: -4 - * c-argdecl-indent: 4 - * c-label-offset: -4 - * c-continued-statement-offset: 4 - * c-continued-brace-offset: 0 - * indent-tabs-mode: 1 - * tab-width: 8 - * End: - */ diff --git a/drivers/s390/block/dasd_3370_erp.c b/drivers/s390/block/dasd_3370_erp.c index 1d11c2a95..1ddab8991 100644 --- a/drivers/s390/block/dasd_3370_erp.c +++ b/drivers/s390/block/dasd_3370_erp.c @@ -1,4 +1,4 @@ -/* +/* * File...........: linux/drivers/s390/block/dasd_3370_erp.c * Author(s)......: Holger Smolinski * Bugreports.to..: @@ -12,10 +12,10 @@ /* - * DASD_3370_ERP_EXAMINE + * DASD_3370_ERP_EXAMINE * * DESCRIPTION - * Checks only for fatal/no/recover error. + * Checks only for fatal/no/recover error. * A detailed examination of the sense data is done later outside * the interrupt handler. * @@ -23,7 +23,7 @@ * 'Chapter 7. 3370 Sense Data'. * * RETURN VALUES - * dasd_era_none no error + * dasd_era_none no error * dasd_era_fatal for all fatal (unrecoverable errors) * dasd_era_recover for all others. */ @@ -82,22 +82,3 @@ dasd_3370_erp_examine(struct dasd_ccw_req * cqr, struct irb * irb) return dasd_era_recover; } /* END dasd_3370_erp_examine */ - -/* - * Overrides for Emacs so that we follow Linus's tabbing style. - * Emacs will notice this stuff at the end of the file and automatically - * adjust the settings for this buffer only. This must remain at the end - * of the file. - * --------------------------------------------------------------------------- - * Local variables: - * c-indent-level: 4 - * c-brace-imaginary-offset: 0 - * c-brace-offset: -4 - * c-argdecl-indent: 4 - * c-label-offset: -4 - * c-continued-statement-offset: 4 - * c-continued-brace-offset: 0 - * indent-tabs-mode: 1 - * tab-width: 8 - * End: - */ diff --git a/drivers/s390/block/dasd_3990_erp.c b/drivers/s390/block/dasd_3990_erp.c index 2ed515623..669805d44 100644 --- a/drivers/s390/block/dasd_3990_erp.c +++ b/drivers/s390/block/dasd_3990_erp.c @@ -1,6 +1,6 @@ -/* +/* * File...........: linux/drivers/s390/block/dasd_3990_erp.c - * Author(s)......: Horst Hummel + * Author(s)......: Horst Hummel * Holger Smolinski * Bugreports.to..: * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000, 2001 @@ -25,23 +25,23 @@ struct DCTL_data { } __attribute__ ((packed)); /* - ***************************************************************************** + ***************************************************************************** * SECTION ERP EXAMINATION - ***************************************************************************** + ***************************************************************************** */ /* - * DASD_3990_ERP_EXAMINE_24 + * DASD_3990_ERP_EXAMINE_24 * * DESCRIPTION - * Checks only for fatal (unrecoverable) error. + * Checks only for fatal (unrecoverable) error. * A detailed examination of the sense data is done later outside * the interrupt handler. * * Each bit configuration leading to an action code 2 (Exit with * programming error or unusual condition indication) * are handled as fatal error´s. - * + * * All other configurations are handled as recoverable errors. * * RETURN VALUES @@ -93,15 +93,15 @@ dasd_3990_erp_examine_24(struct dasd_ccw_req * cqr, char *sense) } /* END dasd_3990_erp_examine_24 */ /* - * DASD_3990_ERP_EXAMINE_32 + * DASD_3990_ERP_EXAMINE_32 * * DESCRIPTION - * Checks only for fatal/no/recoverable error. + * Checks only for fatal/no/recoverable error. * A detailed examination of the sense data is done later outside * the interrupt handler. * * RETURN VALUES - * dasd_era_none no error + * dasd_era_none no error * dasd_era_fatal for all fatal (unrecoverable errors) * dasd_era_recover for recoverable others. */ @@ -128,10 +128,10 @@ dasd_3990_erp_examine_32(struct dasd_ccw_req * cqr, char *sense) } /* end dasd_3990_erp_examine_32 */ /* - * DASD_3990_ERP_EXAMINE + * DASD_3990_ERP_EXAMINE * * DESCRIPTION - * Checks only for fatal/no/recover error. + * Checks only for fatal/no/recover error. * A detailed examination of the sense data is done later outside * the interrupt handler. * @@ -139,7 +139,7 @@ dasd_3990_erp_examine_32(struct dasd_ccw_req * cqr, char *sense) * 'Chapter 7. Error Recovery Procedures'. * * RETURN VALUES - * dasd_era_none no error + * dasd_era_none no error * dasd_era_fatal for all fatal (unrecoverable errors) * dasd_era_recover for all others. */ @@ -178,18 +178,18 @@ dasd_3990_erp_examine(struct dasd_ccw_req * cqr, struct irb * irb) } /* END dasd_3990_erp_examine */ /* - ***************************************************************************** + ***************************************************************************** * SECTION ERP HANDLING - ***************************************************************************** + ***************************************************************************** */ /* - ***************************************************************************** + ***************************************************************************** * 24 and 32 byte sense ERP functions - ***************************************************************************** + ***************************************************************************** */ /* - * DASD_3990_ERP_CLEANUP + * DASD_3990_ERP_CLEANUP * * DESCRIPTION * Removes the already build but not necessary ERP request and sets @@ -197,10 +197,10 @@ dasd_3990_erp_examine(struct dasd_ccw_req * cqr, struct irb * irb) * * PARAMETER * erp request to be blocked - * final_status either DASD_CQR_DONE or DASD_CQR_FAILED + * final_status either DASD_CQR_DONE or DASD_CQR_FAILED * * RETURN VALUES - * cqr original cqr + * cqr original cqr */ static struct dasd_ccw_req * dasd_3990_erp_cleanup(struct dasd_ccw_req * erp, char final_status) @@ -214,7 +214,7 @@ dasd_3990_erp_cleanup(struct dasd_ccw_req * erp, char final_status) } /* end dasd_3990_erp_cleanup */ /* - * DASD_3990_ERP_BLOCK_QUEUE + * DASD_3990_ERP_BLOCK_QUEUE * * DESCRIPTION * Block the given device request queue to prevent from further @@ -237,7 +237,7 @@ dasd_3990_erp_block_queue(struct dasd_ccw_req * erp, int expires) } /* - * DASD_3990_ERP_INT_REQ + * DASD_3990_ERP_INT_REQ * * DESCRIPTION * Handles 'Intervention Required' error. @@ -277,7 +277,7 @@ dasd_3990_erp_int_req(struct dasd_ccw_req * erp) } /* end dasd_3990_erp_int_req */ /* - * DASD_3990_ERP_ALTERNATE_PATH + * DASD_3990_ERP_ALTERNATE_PATH * * DESCRIPTION * Repeat the operation on a different channel path. @@ -330,15 +330,15 @@ dasd_3990_erp_alternate_path(struct dasd_ccw_req * erp) * DASD_3990_ERP_DCTL * * DESCRIPTION - * Setup cqr to do the Diagnostic Control (DCTL) command with an + * Setup cqr to do the Diagnostic Control (DCTL) command with an * Inhibit Write subcommand (0x20) and the given modifier. * * PARAMETER * erp pointer to the current (failed) ERP * modifier subcommand modifier - * + * * RETURN VALUES - * dctl_cqr pointer to NEW dctl_cqr + * dctl_cqr pointer to NEW dctl_cqr * */ static struct dasd_ccw_req * @@ -386,7 +386,7 @@ dasd_3990_erp_DCTL(struct dasd_ccw_req * erp, char modifier) } /* end dasd_3990_erp_DCTL */ /* - * DASD_3990_ERP_ACTION_1 + * DASD_3990_ERP_ACTION_1 * * DESCRIPTION * Setup ERP to do the ERP action 1 (see Reference manual). @@ -415,7 +415,7 @@ dasd_3990_erp_action_1(struct dasd_ccw_req * erp) } /* end dasd_3990_erp_action_1 */ /* - * DASD_3990_ERP_ACTION_4 + * DASD_3990_ERP_ACTION_4 * * DESCRIPTION * Setup ERP to do the ERP action 4 (see Reference manual). @@ -453,11 +453,11 @@ dasd_3990_erp_action_4(struct dasd_ccw_req * erp, char *sense) if (sense[25] == 0x1D) { /* state change pending */ - DEV_MESSAGE(KERN_INFO, device, + DEV_MESSAGE(KERN_INFO, device, "waiting for state change pending " "interrupt, %d retries left", erp->retries); - + dasd_3990_erp_block_queue(erp, 30*HZ); } else if (sense[25] == 0x1E) { /* busy */ @@ -469,9 +469,9 @@ dasd_3990_erp_action_4(struct dasd_ccw_req * erp, char *sense) } else { /* no state change pending - retry */ - DEV_MESSAGE (KERN_INFO, device, + DEV_MESSAGE (KERN_INFO, device, "redriving request immediately, " - "%d retries left", + "%d retries left", erp->retries); erp->status = DASD_CQR_QUEUED; } @@ -482,13 +482,13 @@ dasd_3990_erp_action_4(struct dasd_ccw_req * erp, char *sense) } /* end dasd_3990_erp_action_4 */ /* - ***************************************************************************** + ***************************************************************************** * 24 byte sense ERP functions (only) - ***************************************************************************** + ***************************************************************************** */ /* - * DASD_3990_ERP_ACTION_5 + * DASD_3990_ERP_ACTION_5 * * DESCRIPTION * Setup ERP to do the ERP action 5 (see Reference manual). @@ -523,7 +523,7 @@ dasd_3990_erp_action_5(struct dasd_ccw_req * erp) * * PARAMETER * sense current sense data - * + * * RETURN VALUES * void */ @@ -1150,9 +1150,9 @@ dasd_3990_handle_env_data(struct dasd_ccw_req * erp, char *sense) * PARAMETER * erp current erp_head * sense current sense data - * + * * RETURN VALUES - * erp 'new' erp_head - pointer to new ERP + * erp 'new' erp_head - pointer to new ERP */ static struct dasd_ccw_req * dasd_3990_erp_com_rej(struct dasd_ccw_req * erp, char *sense) @@ -1185,7 +1185,7 @@ dasd_3990_erp_com_rej(struct dasd_ccw_req * erp, char *sense) } /* end dasd_3990_erp_com_rej */ /* - * DASD_3990_ERP_BUS_OUT + * DASD_3990_ERP_BUS_OUT * * DESCRIPTION * Handles 24 byte 'Bus Out Parity Check' error. @@ -1483,7 +1483,7 @@ dasd_3990_erp_env_data(struct dasd_ccw_req * erp, char *sense) * * PARAMETER * erp already added default ERP - * + * * RETURN VALUES * erp new erp_head - pointer to new ERP */ @@ -1527,11 +1527,11 @@ dasd_3990_erp_file_prot(struct dasd_ccw_req * erp) } /* end dasd_3990_erp_file_prot */ /* - * DASD_3990_ERP_INSPECT_24 + * DASD_3990_ERP_INSPECT_24 * * DESCRIPTION * Does a detailed inspection of the 24 byte sense data - * and sets up a related error recovery action. + * and sets up a related error recovery action. * * PARAMETER * sense sense data of the actual error @@ -1602,13 +1602,13 @@ dasd_3990_erp_inspect_24(struct dasd_ccw_req * erp, char *sense) } /* END dasd_3990_erp_inspect_24 */ /* - ***************************************************************************** + ***************************************************************************** * 32 byte sense ERP functions (only) - ***************************************************************************** + ***************************************************************************** */ /* - * DASD_3990_ERPACTION_10_32 + * DASD_3990_ERPACTION_10_32 * * DESCRIPTION * Handles 32 byte 'Action 10' of Single Program Action Codes. @@ -1616,7 +1616,7 @@ dasd_3990_erp_inspect_24(struct dasd_ccw_req * erp, char *sense) * * PARAMETER * erp current erp_head - * sense current sense data + * sense current sense data * RETURN VALUES * erp modified erp_head */ @@ -1640,18 +1640,18 @@ dasd_3990_erp_action_10_32(struct dasd_ccw_req * erp, char *sense) * * DESCRIPTION * Handles 32 byte 'Action 1B' of Single Program Action Codes. - * A write operation could not be finished because of an unexpected + * A write operation could not be finished because of an unexpected * condition. - * The already created 'default erp' is used to get the link to - * the erp chain, but it can not be used for this recovery + * The already created 'default erp' is used to get the link to + * the erp chain, but it can not be used for this recovery * action because it contains no DE/LO data space. * * PARAMETER * default_erp already added default erp. - * sense current sense data + * sense current sense data * * RETURN VALUES - * erp new erp or + * erp new erp or * default_erp in case of imprecise ending or error */ static struct dasd_ccw_req * @@ -1789,16 +1789,16 @@ dasd_3990_erp_action_1B_32(struct dasd_ccw_req * default_erp, char *sense) * DASD_3990_UPDATE_1B * * DESCRIPTION - * Handles the update to the 32 byte 'Action 1B' of Single Program + * Handles the update to the 32 byte 'Action 1B' of Single Program * Action Codes in case the first action was not successful. * The already created 'previous_erp' is the currently not successful - * ERP. + * ERP. * * PARAMETER * previous_erp already created previous erp. - * sense current sense data + * sense current sense data * RETURN VALUES - * erp modified erp + * erp modified erp */ static struct dasd_ccw_req * dasd_3990_update_1B(struct dasd_ccw_req * previous_erp, char *sense) @@ -1897,7 +1897,7 @@ dasd_3990_update_1B(struct dasd_ccw_req * previous_erp, char *sense) } /* end dasd_3990_update_1B */ /* - * DASD_3990_ERP_COMPOUND_RETRY + * DASD_3990_ERP_COMPOUND_RETRY * * DESCRIPTION * Handles the compound ERP action retry code. @@ -1943,7 +1943,7 @@ dasd_3990_erp_compound_retry(struct dasd_ccw_req * erp, char *sense) } /* end dasd_3990_erp_compound_retry */ /* - * DASD_3990_ERP_COMPOUND_PATH + * DASD_3990_ERP_COMPOUND_PATH * * DESCRIPTION * Handles the compound ERP action for retry on alternate @@ -1965,7 +1965,7 @@ dasd_3990_erp_compound_path(struct dasd_ccw_req * erp, char *sense) dasd_3990_erp_alternate_path(erp); if (erp->status == DASD_CQR_FAILED) { - /* reset the lpm and the status to be able to + /* reset the lpm and the status to be able to * try further actions. */ erp->lpm = 0; @@ -1980,7 +1980,7 @@ dasd_3990_erp_compound_path(struct dasd_ccw_req * erp, char *sense) } /* end dasd_3990_erp_compound_path */ /* - * DASD_3990_ERP_COMPOUND_CODE + * DASD_3990_ERP_COMPOUND_CODE * * DESCRIPTION * Handles the compound ERP action for retry code. @@ -2001,18 +2001,18 @@ dasd_3990_erp_compound_code(struct dasd_ccw_req * erp, char *sense) switch (sense[28]) { case 0x17: - /* issue a Diagnostic Control command with an + /* issue a Diagnostic Control command with an * Inhibit Write subcommand and controler modifier */ erp = dasd_3990_erp_DCTL(erp, 0x20); break; - + case 0x25: /* wait for 5 seconds and retry again */ erp->retries = 1; - + dasd_3990_erp_block_queue (erp, 5*HZ); break; - + default: /* should not happen - continue */ break; @@ -2026,7 +2026,7 @@ dasd_3990_erp_compound_code(struct dasd_ccw_req * erp, char *sense) } /* end dasd_3990_erp_compound_code */ /* - * DASD_3990_ERP_COMPOUND_CONFIG + * DASD_3990_ERP_COMPOUND_CONFIG * * DESCRIPTION * Handles the compound ERP action for configruation @@ -2063,10 +2063,10 @@ dasd_3990_erp_compound_config(struct dasd_ccw_req * erp, char *sense) } /* end dasd_3990_erp_compound_config */ /* - * DASD_3990_ERP_COMPOUND + * DASD_3990_ERP_COMPOUND * * DESCRIPTION - * Does the further compound program action if + * Does the further compound program action if * compound retry was not successful. * * PARAMETER @@ -2110,11 +2110,11 @@ dasd_3990_erp_compound(struct dasd_ccw_req * erp, char *sense) } /* end dasd_3990_erp_compound */ /* - * DASD_3990_ERP_INSPECT_32 + * DASD_3990_ERP_INSPECT_32 * * DESCRIPTION * Does a detailed inspection of the 32 byte sense data - * and sets up a related error recovery action. + * and sets up a related error recovery action. * * PARAMETER * sense sense data of the actual error @@ -2228,9 +2228,9 @@ dasd_3990_erp_inspect_32(struct dasd_ccw_req * erp, char *sense) } /* end dasd_3990_erp_inspect_32 */ /* - ***************************************************************************** + ***************************************************************************** * main ERP control fuctions (24 and 32 byte sense) - ***************************************************************************** + ***************************************************************************** */ /* @@ -2243,7 +2243,7 @@ dasd_3990_erp_inspect_32(struct dasd_ccw_req * erp, char *sense) * PARAMETER * erp pointer to the currently created default ERP * RETURN VALUES - * erp_new contens was possibly modified + * erp_new contens was possibly modified */ static struct dasd_ccw_req * dasd_3990_erp_inspect(struct dasd_ccw_req * erp) @@ -2272,14 +2272,14 @@ dasd_3990_erp_inspect(struct dasd_ccw_req * erp) /* * DASD_3990_ERP_ADD_ERP - * + * * DESCRIPTION * This funtion adds an additional request block (ERP) to the head of * the given cqr (or erp). * This erp is initialized as an default erp (retry TIC) * * PARAMETER - * cqr head of the current ERP-chain (or single cqr if + * cqr head of the current ERP-chain (or single cqr if * first error) * RETURN VALUES * erp pointer to new ERP-chain head @@ -2332,15 +2332,15 @@ dasd_3990_erp_add_erp(struct dasd_ccw_req * cqr) } /* - * DASD_3990_ERP_ADDITIONAL_ERP - * + * DASD_3990_ERP_ADDITIONAL_ERP + * * DESCRIPTION * An additional ERP is needed to handle the current error. * Add ERP to the head of the ERP-chain containing the ERP processing * determined based on the sense data. * * PARAMETER - * cqr head of the current ERP-chain (or single cqr if + * cqr head of the current ERP-chain (or single cqr if * first error) * * RETURN VALUES @@ -2376,7 +2376,7 @@ dasd_3990_erp_additional_erp(struct dasd_ccw_req * cqr) * 24 byte sense byte 25 and 27 is set as well. * * PARAMETER - * cqr1 first cqr, which will be compared with the + * cqr1 first cqr, which will be compared with the * cqr2 second cqr. * * RETURN VALUES @@ -2415,7 +2415,7 @@ dasd_3990_erp_error_match(struct dasd_ccw_req *cqr1, struct dasd_ccw_req *cqr2) * cqr failed cqr (either original cqr or already an erp) * * RETURN VALUES - * erp erp-pointer to the already defined error + * erp erp-pointer to the already defined error * recovery procedure OR * NULL if a 'new' error occurred. */ @@ -2451,10 +2451,10 @@ dasd_3990_erp_in_erp(struct dasd_ccw_req *cqr) * DASD_3990_ERP_FURTHER_ERP (24 & 32 byte sense) * * DESCRIPTION - * No retry is left for the current ERP. Check what has to be done + * No retry is left for the current ERP. Check what has to be done * with the ERP. * - do further defined ERP action or - * - wait for interrupt or + * - wait for interrupt or * - exit with permanent error * * PARAMETER @@ -2485,7 +2485,7 @@ dasd_3990_erp_further_erp(struct dasd_ccw_req *erp) if (!(sense[2] & DASD_SENSE_BIT_0)) { - /* issue a Diagnostic Control command with an + /* issue a Diagnostic Control command with an * Inhibit Write subcommand */ switch (sense[25]) { @@ -2535,14 +2535,14 @@ dasd_3990_erp_further_erp(struct dasd_ccw_req *erp) } /* end dasd_3990_erp_further_erp */ /* - * DASD_3990_ERP_HANDLE_MATCH_ERP + * DASD_3990_ERP_HANDLE_MATCH_ERP * * DESCRIPTION * An error occurred again and an ERP has been detected which is already - * used to handle this error (e.g. retries). + * used to handle this error (e.g. retries). * All prior ERP's are asumed to be successful and therefore removed * from queue. - * If retry counter of matching erp is already 0, it is checked if further + * If retry counter of matching erp is already 0, it is checked if further * action is needed (besides retry) or if the ERP has failed. * * PARAMETER @@ -2631,7 +2631,7 @@ dasd_3990_erp_handle_match_erp(struct dasd_ccw_req *erp_head, * erp erp-pointer to the head of the ERP action chain. * This means: * - either a ptr to an additional ERP cqr or - * - the original given cqr (which's status might + * - the original given cqr (which's status might * be modified) */ struct dasd_ccw_req * @@ -2723,22 +2723,3 @@ dasd_3990_erp_action(struct dasd_ccw_req * cqr) return erp; } /* end dasd_3990_erp_action */ - -/* - * Overrides for Emacs so that we follow Linus's tabbing style. - * Emacs will notice this stuff at the end of the file and automatically - * adjust the settings for this buffer only. This must remain at the end - * of the file. - * --------------------------------------------------------------------------- - * Local variables: - * c-indent-level: 4 - * c-brace-imaginary-offset: 0 - * c-brace-offset: -4 - * c-argdecl-indent: 4 - * c-label-offset: -4 - * c-continued-statement-offset: 4 - * c-continued-brace-offset: 0 - * indent-tabs-mode: 1 - * tab-width: 8 - * End: - */ diff --git a/drivers/s390/block/dasd_9336_erp.c b/drivers/s390/block/dasd_9336_erp.c index dc861446d..6e0826884 100644 --- a/drivers/s390/block/dasd_9336_erp.c +++ b/drivers/s390/block/dasd_9336_erp.c @@ -1,4 +1,4 @@ -/* +/* * File...........: linux/drivers/s390/block/dasd_9336_erp.c * Author(s)......: Holger Smolinski * Bugreports.to..: @@ -12,10 +12,10 @@ /* - * DASD_9336_ERP_EXAMINE + * DASD_9336_ERP_EXAMINE * * DESCRIPTION - * Checks only for fatal/no/recover error. + * Checks only for fatal/no/recover error. * A detailed examination of the sense data is done later outside * the interrupt handler. * @@ -23,7 +23,7 @@ * 'Chapter 7. 9336 Sense Data'. * * RETURN VALUES - * dasd_era_none no error + * dasd_era_none no error * dasd_era_fatal for all fatal (unrecoverable errors) * dasd_era_recover for all others. */ @@ -39,22 +39,3 @@ dasd_9336_erp_examine(struct dasd_ccw_req * cqr, struct irb * irb) return dasd_era_recover; } /* END dasd_9336_erp_examine */ - -/* - * Overrides for Emacs so that we follow Linus's tabbing style. - * Emacs will notice this stuff at the end of the file and automatically - * adjust the settings for this buffer only. This must remain at the end - * of the file. - * --------------------------------------------------------------------------- - * Local variables: - * c-indent-level: 4 - * c-brace-imaginary-offset: 0 - * c-brace-offset: -4 - * c-argdecl-indent: 4 - * c-label-offset: -4 - * c-continued-statement-offset: 4 - * c-continued-brace-offset: 0 - * indent-tabs-mode: 1 - * tab-width: 8 - * End: - */ diff --git a/drivers/s390/block/dasd_9343_erp.c b/drivers/s390/block/dasd_9343_erp.c index 4a5b79569..ddecb9808 100644 --- a/drivers/s390/block/dasd_9343_erp.c +++ b/drivers/s390/block/dasd_9343_erp.c @@ -1,4 +1,4 @@ -/* +/* * File...........: linux/drivers/s390/block/dasd_9345_erp.c * Author(s)......: Holger Smolinski * Bugreports.to..: diff --git a/drivers/s390/block/dasd_devmap.c b/drivers/s390/block/dasd_devmap.c index 216bc4fba..9af02c79c 100644 --- a/drivers/s390/block/dasd_devmap.c +++ b/drivers/s390/block/dasd_devmap.c @@ -13,7 +13,6 @@ * */ -#include #include #include #include @@ -27,7 +26,7 @@ #include "dasd_int.h" kmem_cache_t *dasd_page_cache; -EXPORT_SYMBOL(dasd_page_cache); +EXPORT_SYMBOL_GPL(dasd_page_cache); /* * dasd_devmap_t is used to store the features and the relation @@ -48,6 +47,22 @@ struct dasd_devmap { struct dasd_uid uid; }; +/* + * dasd_server_ssid_map contains a globally unique storage server subsystem ID. + * dasd_server_ssid_list contains the list of all subsystem IDs accessed by + * the DASD device driver. + */ +struct dasd_server_ssid_map { + struct list_head list; + struct system_id { + char vendor[4]; + char serial[15]; + __u16 ssid; + } sid; +}; + +static struct list_head dasd_server_ssid_list; + /* * Parameter parsing functions for dasd= parameter. The syntax is: * : (0x)?[0-9a-fA-F]+ @@ -64,6 +79,8 @@ struct dasd_devmap { int dasd_probeonly = 0; /* is true, when probeonly mode is active */ int dasd_autodetect = 0; /* is true, when autodetection is active */ +int dasd_nopav = 0; /* is true, when PAV is disabled */ +EXPORT_SYMBOL_GPL(dasd_nopav); /* * char *dasd[] is intended to hold the ranges supplied by the dasd= statement @@ -74,7 +91,7 @@ static char *dasd[256]; module_param_array(dasd, charp, NULL, 0); /* - * Single spinlock to protect devmap structures and lists. + * Single spinlock to protect devmap and servermap structures and lists. */ static DEFINE_SPINLOCK(dasd_devmap_lock); @@ -123,7 +140,7 @@ static inline int dasd_busid(char **str, int *id0, int *id1, int *devno) { int val, old_style; - + /* check for leading '0x' */ old_style = 0; if ((*str)[0] == '0' && (*str)[1] == 'x') { @@ -179,7 +196,7 @@ dasd_feature_list(char *str, char **endp) features = 0; while (1) { - for (len = 0; + for (len = 0; str[len] && str[len] != ':' && str[len] != ')'; len++); if (len == 2 && !strncmp(str, "ro", 2)) features |= DASD_FEATURE_READONLY; @@ -228,24 +245,30 @@ dasd_parse_keyword( char *parsestring ) { length = strlen(parsestring); residual_str = parsestring + length; } - if (strncmp ("autodetect", parsestring, length) == 0) { + if (strncmp("autodetect", parsestring, length) == 0) { dasd_autodetect = 1; MESSAGE (KERN_INFO, "%s", "turning to autodetection mode"); return residual_str; } - if (strncmp ("probeonly", parsestring, length) == 0) { + if (strncmp("probeonly", parsestring, length) == 0) { dasd_probeonly = 1; MESSAGE(KERN_INFO, "%s", "turning to probeonly mode"); return residual_str; } - if (strncmp ("fixedbuffers", parsestring, length) == 0) { + if (strncmp("nopav", parsestring, length) == 0) { + dasd_nopav = 1; + MESSAGE(KERN_INFO, "%s", "disable PAV mode"); + return residual_str; + } + if (strncmp("fixedbuffers", parsestring, length) == 0) { if (dasd_page_cache) return residual_str; dasd_page_cache = - kmem_cache_create("dasd_page_cache", PAGE_SIZE, 0, - SLAB_CACHE_DMA, NULL, NULL ); + kmem_cache_create("dasd_page_cache", PAGE_SIZE, + PAGE_SIZE, SLAB_CACHE_DMA, + NULL, NULL ); if (!dasd_page_cache) MESSAGE(KERN_WARNING, "%s", "Failed to create slab, " "fixed buffer mode disabled."); @@ -294,6 +317,8 @@ dasd_parse_range( char *parsestring ) { features = dasd_feature_list(str, &str); if (features < 0) return ERR_PTR(-EINVAL); + /* each device in dasd= parameter should be set initially online */ + features |= DASD_FEATURE_INITIAL_ONLINE; while (from <= to) { sprintf(bus_id, "%01x.%01x.%04x", from_id0, from_id1, from++); @@ -359,7 +384,7 @@ dasd_parse(void) * Add a devmap for the device specified by busid. It is possible that * the devmap already exists (dasd= parameter). The order of the devices * added through this function will define the kdevs for the individual - * devices. + * devices. */ static struct dasd_devmap * dasd_add_busid(char *bus_id, int features) @@ -368,11 +393,11 @@ dasd_add_busid(char *bus_id, int features) int hash; new = (struct dasd_devmap *) - kmalloc(sizeof(struct dasd_devmap), GFP_KERNEL); + kzalloc(sizeof(struct dasd_devmap), GFP_KERNEL); if (!new) return ERR_PTR(-ENOMEM); spin_lock(&dasd_devmap_lock); - devmap = 0; + devmap = NULL; hash = dasd_hash_busid(bus_id); list_for_each_entry(tmp, &dasd_hashlists[hash], list) if (strncmp(tmp->bus_id, bus_id, BUS_ID_SIZE) == 0) { @@ -384,10 +409,10 @@ dasd_add_busid(char *bus_id, int features) new->devindex = dasd_max_devindex++; strncpy(new->bus_id, bus_id, BUS_ID_SIZE); new->features = features; - new->device = 0; + new->device = NULL; list_add(&new->list, &dasd_hashlists[hash]); devmap = new; - new = 0; + new = NULL; } spin_unlock(&dasd_devmap_lock); kfree(new); @@ -457,7 +482,7 @@ dasd_device_from_devindex(int devindex) int i; spin_lock(&dasd_devmap_lock); - devmap = 0; + devmap = NULL; for (i = 0; (i < 256) && !devmap; i++) list_for_each_entry(tmp, &dasd_hashlists[i], list) if (tmp->devindex == devindex) { @@ -630,7 +655,8 @@ dasd_ro_show(struct device *dev, struct device_attribute *attr, char *buf) } static ssize_t -dasd_ro_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +dasd_ro_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) { struct dasd_devmap *devmap; int ro_flag; @@ -658,7 +684,7 @@ static DEVICE_ATTR(readonly, 0644, dasd_ro_show, dasd_ro_store); * use_diag controls whether the driver should use diag rather than ssch * to talk to the device */ -static ssize_t +static ssize_t dasd_use_diag_show(struct device *dev, struct device_attribute *attr, char *buf) { struct dasd_devmap *devmap; @@ -673,7 +699,8 @@ dasd_use_diag_show(struct device *dev, struct device_attribute *attr, char *buf) } static ssize_t -dasd_use_diag_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +dasd_use_diag_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) { struct dasd_devmap *devmap; ssize_t rc; @@ -697,11 +724,11 @@ dasd_use_diag_store(struct device *dev, struct device_attribute *attr, const cha return rc; } -static -DEVICE_ATTR(use_diag, 0644, dasd_use_diag_show, dasd_use_diag_store); +static DEVICE_ATTR(use_diag, 0644, dasd_use_diag_show, dasd_use_diag_store); static ssize_t -dasd_discipline_show(struct device *dev, struct device_attribute *attr, char *buf) +dasd_discipline_show(struct device *dev, struct device_attribute *attr, + char *buf) { struct dasd_devmap *devmap; char *dname; @@ -834,7 +861,6 @@ static struct attribute_group dasd_attr_group = { .attrs = dasd_attrs, }; - /* * Return copy of the device unique identifier. */ @@ -854,21 +880,52 @@ dasd_get_uid(struct ccw_device *cdev, struct dasd_uid *uid) /* * Register the given device unique identifier into devmap struct. + * In addition check if the related storage server subsystem ID is already + * contained in the dasd_server_ssid_list. If subsystem ID is not contained, + * create new entry. + * Return 0 if server was already in serverlist, + * 1 if the server was added successful + * <0 in case of error. */ int dasd_set_uid(struct ccw_device *cdev, struct dasd_uid *uid) { struct dasd_devmap *devmap; + struct dasd_server_ssid_map *srv, *tmp; devmap = dasd_find_busid(cdev->dev.bus_id); if (IS_ERR(devmap)) return PTR_ERR(devmap); + + /* generate entry for server_ssid_map */ + srv = (struct dasd_server_ssid_map *) + kzalloc(sizeof(struct dasd_server_ssid_map), GFP_KERNEL); + if (!srv) + return -ENOMEM; + strncpy(srv->sid.vendor, uid->vendor, sizeof(srv->sid.vendor) - 1); + strncpy(srv->sid.serial, uid->serial, sizeof(srv->sid.serial) - 1); + srv->sid.ssid = uid->ssid; + + /* server is already contained ? */ spin_lock(&dasd_devmap_lock); devmap->uid = *uid; + list_for_each_entry(tmp, &dasd_server_ssid_list, list) { + if (!memcmp(&srv->sid, &tmp->sid, + sizeof(struct system_id))) { + kfree(srv); + srv = NULL; + break; + } + } + + /* add servermap to serverlist */ + if (srv) + list_add(&srv->list, &dasd_server_ssid_list); spin_unlock(&dasd_devmap_lock); - return 0; + + return (srv ? 1 : 0); } -EXPORT_SYMBOL(dasd_set_uid); +EXPORT_SYMBOL_GPL(dasd_set_uid); /* * Return value of the specified feature. @@ -880,7 +937,7 @@ dasd_get_feature(struct ccw_device *cdev, int feature) devmap = dasd_find_busid(cdev->dev.bus_id); if (IS_ERR(devmap)) - return (int) PTR_ERR(devmap); + return PTR_ERR(devmap); return ((devmap->features & feature) != 0); } @@ -896,7 +953,7 @@ dasd_set_feature(struct ccw_device *cdev, int feature, int flag) devmap = dasd_find_busid(cdev->dev.bus_id); if (IS_ERR(devmap)) - return (int) PTR_ERR(devmap); + return PTR_ERR(devmap); spin_lock(&dasd_devmap_lock); if (flag) @@ -932,8 +989,10 @@ dasd_devmap_init(void) dasd_max_devindex = 0; for (i = 0; i < 256; i++) INIT_LIST_HEAD(&dasd_hashlists[i]); - return 0; + /* Initialize servermap structure. */ + INIT_LIST_HEAD(&dasd_server_ssid_list); + return 0; } void diff --git a/drivers/s390/block/dasd_diag.c b/drivers/s390/block/dasd_diag.c index 3f9d704d2..23fa0b289 100644 --- a/drivers/s390/block/dasd_diag.c +++ b/drivers/s390/block/dasd_diag.c @@ -1,4 +1,4 @@ -/* +/* * File...........: linux/drivers/s390/block/dasd_diag.c * Author(s)......: Holger Smolinski * Based on.......: linux/drivers/s390/block/mdisk.c @@ -8,7 +8,6 @@ * */ -#include #include #include #include @@ -336,7 +335,7 @@ dasd_diag_check_device(struct dasd_device *device) private = (struct dasd_diag_private *) device->private; if (private == NULL) { - private = kmalloc(sizeof(struct dasd_diag_private),GFP_KERNEL); + private = kzalloc(sizeof(struct dasd_diag_private),GFP_KERNEL); if (private == NULL) { DEV_MESSAGE(KERN_WARNING, device, "%s", "memory allocation failed for private data"); @@ -527,7 +526,7 @@ dasd_diag_build_cp(struct dasd_device * device, struct request *req) datasize, device); if (IS_ERR(cqr)) return cqr; - + dreq = (struct dasd_diag_req *) cqr->data; dreq->block_count = count; dbio = dreq->bio; diff --git a/drivers/s390/block/dasd_diag.h b/drivers/s390/block/dasd_diag.h index 38a4e55f8..b8c78267f 100644 --- a/drivers/s390/block/dasd_diag.h +++ b/drivers/s390/block/dasd_diag.h @@ -1,4 +1,4 @@ -/* +/* * File...........: linux/drivers/s390/block/dasd_diag.h * Author(s)......: Holger Smolinski * Based on.......: linux/drivers/s390/block/mdisk.h diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c index 7d5a6cee4..b7a7fac3f 100644 --- a/drivers/s390/block/dasd_eckd.c +++ b/drivers/s390/block/dasd_eckd.c @@ -1,7 +1,7 @@ -/* +/* * File...........: linux/drivers/s390/block/dasd_eckd.c * Author(s)......: Holger Smolinski - * Horst Hummel + * Horst Hummel * Carsten Otte * Martin Schwidefsky * Bugreports.to..: @@ -9,7 +9,6 @@ * */ -#include #include #include #include @@ -24,6 +23,7 @@ #include #include #include +#include #include #include "dasd_int.h" @@ -65,16 +65,16 @@ struct dasd_eckd_private { /* The ccw bus type uses this table to find devices that it sends to * dasd_eckd_probe */ static struct ccw_device_id dasd_eckd_ids[] = { - { CCW_DEVICE_DEVTYPE (0x3990, 0, 0x3390, 0), driver_info: 0x1}, - { CCW_DEVICE_DEVTYPE (0x2105, 0, 0x3390, 0), driver_info: 0x2}, - { CCW_DEVICE_DEVTYPE (0x3880, 0, 0x3390, 0), driver_info: 0x3}, - { CCW_DEVICE_DEVTYPE (0x3990, 0, 0x3380, 0), driver_info: 0x4}, - { CCW_DEVICE_DEVTYPE (0x2105, 0, 0x3380, 0), driver_info: 0x5}, - { CCW_DEVICE_DEVTYPE (0x9343, 0, 0x9345, 0), driver_info: 0x6}, - { CCW_DEVICE_DEVTYPE (0x2107, 0, 0x3390, 0), driver_info: 0x7}, - { CCW_DEVICE_DEVTYPE (0x2107, 0, 0x3380, 0), driver_info: 0x8}, - { CCW_DEVICE_DEVTYPE (0x1750, 0, 0x3390, 0), driver_info: 0x9}, - { CCW_DEVICE_DEVTYPE (0x1750, 0, 0x3380, 0), driver_info: 0xa}, + { CCW_DEVICE_DEVTYPE (0x3990, 0, 0x3390, 0), .driver_info = 0x1}, + { CCW_DEVICE_DEVTYPE (0x2105, 0, 0x3390, 0), .driver_info = 0x2}, + { CCW_DEVICE_DEVTYPE (0x3880, 0, 0x3390, 0), .driver_info = 0x3}, + { CCW_DEVICE_DEVTYPE (0x3990, 0, 0x3380, 0), .driver_info = 0x4}, + { CCW_DEVICE_DEVTYPE (0x2105, 0, 0x3380, 0), .driver_info = 0x5}, + { CCW_DEVICE_DEVTYPE (0x9343, 0, 0x9345, 0), .driver_info = 0x6}, + { CCW_DEVICE_DEVTYPE (0x2107, 0, 0x3390, 0), .driver_info = 0x7}, + { CCW_DEVICE_DEVTYPE (0x2107, 0, 0x3380, 0), .driver_info = 0x8}, + { CCW_DEVICE_DEVTYPE (0x1750, 0, 0x3390, 0), .driver_info = 0x9}, + { CCW_DEVICE_DEVTYPE (0x1750, 0, 0x3380, 0), .driver_info = 0xa}, { /* end of list */ }, }; @@ -89,17 +89,22 @@ dasd_eckd_probe (struct ccw_device *cdev) { int ret; - ret = dasd_generic_probe (cdev, &dasd_eckd_discipline); - if (ret) + /* set ECKD specific ccw-device options */ + ret = ccw_device_set_options(cdev, CCWDEV_ALLOW_FORCE); + if (ret) { + printk(KERN_WARNING + "dasd_eckd_probe: could not set ccw-device options " + "for %s\n", cdev->dev.bus_id); return ret; - ccw_device_set_options(cdev, CCWDEV_DO_PATHGROUP | CCWDEV_ALLOW_FORCE); - return 0; + } + ret = dasd_generic_probe(cdev, &dasd_eckd_discipline); + return ret; } static int dasd_eckd_set_online(struct ccw_device *cdev) { - return dasd_generic_set_online (cdev, &dasd_eckd_discipline); + return dasd_generic_set_online(cdev, &dasd_eckd_discipline); } static struct ccw_driver dasd_eckd_driver = { @@ -210,14 +215,14 @@ check_XRC (struct ccw1 *de_ccw, /* switch on System Time Stamp - needed for XRC Support */ if (private->rdc_data.facilities.XRC_supported) { - + data->ga_extended |= 0x08; /* switch on 'Time Stamp Valid' */ data->ga_extended |= 0x02; /* switch on 'Extended Parameter' */ - + data->ep_sys_time = get_clock (); - + de_ccw->count = sizeof (struct DE_eckd_data); - de_ccw->flags |= CCW_FLAG_SLI; + de_ccw->flags |= CCW_FLAG_SLI; } return; @@ -296,8 +301,8 @@ define_extent(struct ccw1 * ccw, struct DE_eckd_data * data, int trk, /* check for sequential prestage - enhance cylinder range */ if (data->attributes.operation == DASD_SEQ_PRESTAGE || data->attributes.operation == DASD_SEQ_ACCESS) { - - if (end.cyl + private->attrib.nr_cyl < geo.cyl) + + if (end.cyl + private->attrib.nr_cyl < geo.cyl) end.cyl += private->attrib.nr_cyl; else end.cyl = (geo.cyl - 1); @@ -317,7 +322,7 @@ locate_record(struct ccw1 *ccw, struct LO_eckd_data *data, int trk, struct dasd_eckd_private *private; int sector; int dn, d; - + private = (struct dasd_eckd_private *) device->private; DBF_DEV_EVENT(DBF_INFO, device, @@ -463,11 +468,11 @@ dasd_eckd_generate_uid(struct dasd_device *device, struct dasd_uid *uid) return -ENODEV; memset(uid, 0, sizeof(struct dasd_uid)); - strncpy(uid->vendor, confdata->ned1.HDA_manufacturer, - sizeof(uid->vendor) - 1); + memcpy(uid->vendor, confdata->ned1.HDA_manufacturer, + sizeof(uid->vendor) - 1); EBCASC(uid->vendor, sizeof(uid->vendor) - 1); - strncpy(uid->serial, confdata->ned1.HDA_location, - sizeof(uid->serial) - 1); + memcpy(uid->serial, confdata->ned1.HDA_location, + sizeof(uid->serial) - 1); EBCASC(uid->serial, sizeof(uid->serial) - 1); uid->ssid = confdata->neq.subsystemID; if (confdata->ned2.sneq.flags == 0x40) { @@ -540,6 +545,86 @@ dasd_eckd_read_conf(struct dasd_device *device) return 0; } +/* + * Build CP for Perform Subsystem Function - SSC. + */ +struct dasd_ccw_req * +dasd_eckd_build_psf_ssc(struct dasd_device *device) +{ + struct dasd_ccw_req *cqr; + struct dasd_psf_ssc_data *psf_ssc_data; + struct ccw1 *ccw; + + cqr = dasd_smalloc_request("ECKD", 1 /* PSF */ , + sizeof(struct dasd_psf_ssc_data), + device); + + if (IS_ERR(cqr)) { + DEV_MESSAGE(KERN_WARNING, device, "%s", + "Could not allocate PSF-SSC request"); + return cqr; + } + psf_ssc_data = (struct dasd_psf_ssc_data *)cqr->data; + psf_ssc_data->order = PSF_ORDER_SSC; + psf_ssc_data->suborder = 0x08; + + ccw = cqr->cpaddr; + ccw->cmd_code = DASD_ECKD_CCW_PSF; + ccw->cda = (__u32)(addr_t)psf_ssc_data; + ccw->count = 66; + + cqr->device = device; + cqr->expires = 10*HZ; + cqr->buildclk = get_clock(); + cqr->status = DASD_CQR_FILLED; + return cqr; +} + +/* + * Perform Subsystem Function. + * It is necessary to trigger CIO for channel revalidation since this + * call might change behaviour of DASD devices. + */ +static int +dasd_eckd_psf_ssc(struct dasd_device *device) +{ + struct dasd_ccw_req *cqr; + int rc; + + cqr = dasd_eckd_build_psf_ssc(device); + if (IS_ERR(cqr)) + return PTR_ERR(cqr); + + rc = dasd_sleep_on(cqr); + if (!rc) + /* trigger CIO to reprobe devices */ + css_schedule_reprobe(); + dasd_sfree_request(cqr, cqr->device); + return rc; +} + +/* + * Valide storage server of current device. + */ +static int +dasd_eckd_validate_server(struct dasd_device *device, struct dasd_uid *uid) +{ + int rc; + + /* Currently PAV is the only reason to 'validate' server on LPAR */ + if (dasd_nopav || MACHINE_IS_VM) + return 0; + + rc = dasd_eckd_psf_ssc(device); + /* may be requested feature is not available on server, + * therefore just report error and go ahead */ + DEV_MESSAGE(KERN_INFO, device, + "PSF-SSC on storage subsystem %s.%s.%04x returned rc=%d", + uid->vendor, uid->serial, uid->ssid, rc); + /* RE-Read Configuration Data */ + return dasd_eckd_read_conf(device); +} + /* * Check device characteristics. * If the device is accessible using ECKD discipline, the device is enabled. @@ -554,7 +639,7 @@ dasd_eckd_check_characteristics(struct dasd_device *device) private = (struct dasd_eckd_private *) device->private; if (private == NULL) { - private = kmalloc(sizeof(struct dasd_eckd_private), + private = kzalloc(sizeof(struct dasd_eckd_private), GFP_KERNEL | GFP_DMA); if (private == NULL) { DEV_MESSAGE(KERN_WARNING, device, "%s", @@ -562,7 +647,6 @@ dasd_eckd_check_characteristics(struct dasd_device *device) "data"); return -ENOMEM; } - memset(private, 0, sizeof(struct dasd_eckd_private)); device->private = (void *) private; } /* Invalidate status of initial analysis. */ @@ -571,16 +655,29 @@ dasd_eckd_check_characteristics(struct dasd_device *device) private->attrib.operation = DASD_NORMAL_CACHE; private->attrib.nr_cyl = 0; + /* Read Configuration Data */ + rc = dasd_eckd_read_conf(device); + if (rc) + return rc; + + /* Generate device unique id and register in devmap */ + rc = dasd_eckd_generate_uid(device, &uid); + if (rc) + return rc; + rc = dasd_set_uid(device->cdev, &uid); + if (rc == 1) /* new server found */ + rc = dasd_eckd_validate_server(device, &uid); + if (rc) + return rc; + /* Read Device Characteristics */ rdc_data = (void *) &(private->rdc_data); memset(rdc_data, 0, sizeof(rdc_data)); rc = read_dev_chars(device->cdev, &rdc_data, 64); - if (rc) { + if (rc) DEV_MESSAGE(KERN_WARNING, device, - "Read device characteristics returned error %d", - rc); - return rc; - } + "Read device characteristics returned " + "rc=%d", rc); DEV_MESSAGE(KERN_INFO, device, "%04X/%02X(CU:%04X/%02X) Cyl:%d Head:%d Sec:%d", @@ -591,19 +688,6 @@ dasd_eckd_check_characteristics(struct dasd_device *device) private->rdc_data.no_cyl, private->rdc_data.trk_per_cyl, private->rdc_data.sec_per_trk); - - /* Read Configuration Data */ - rc = dasd_eckd_read_conf (device); - if (rc) - return rc; - - /* Generate device unique id and register in devmap */ - rc = dasd_eckd_generate_uid(device, &uid); - if (rc) - return rc; - - rc = dasd_set_uid(device->cdev, &uid); - return rc; } @@ -773,7 +857,7 @@ dasd_eckd_end_analysis(struct dasd_device *device) ((private->rdc_data.no_cyl * private->rdc_data.trk_per_cyl * blk_per_trk * (device->bp_block >> 9)) >> 1), - ((blk_per_trk * device->bp_block) >> 10), + ((blk_per_trk * device->bp_block) >> 10), private->uses_cdl ? "compatible disk layout" : "linux disk layout"); @@ -970,7 +1054,7 @@ dasd_eckd_format_device(struct dasd_device * device, if (i < 3) { ect->kl = 4; ect->dl = sizes_trk0[i] - 4; - } + } } if ((fdata->intensity & 0x08) && fdata->start_unit == 1) { @@ -1270,7 +1354,7 @@ dasd_eckd_fill_info(struct dasd_device * device, /* * Release device ioctl. - * Buils a channel programm to releases a prior reserved + * Buils a channel programm to releases a prior reserved * (see dasd_eckd_reserve) device. */ static int @@ -1310,8 +1394,8 @@ dasd_eckd_release(struct dasd_device *device) /* * Reserve device ioctl. * Options are set to 'synchronous wait for interrupt' and - * 'timeout the request'. This leads to a terminate IO if - * the interrupt is outstanding for a certain time. + * 'timeout the request'. This leads to a terminate IO if + * the interrupt is outstanding for a certain time. */ static int dasd_eckd_reserve(struct dasd_device *device) @@ -1349,7 +1433,7 @@ dasd_eckd_reserve(struct dasd_device *device) /* * Steal lock ioctl - unconditional reserve device. - * Buils a channel programm to break a device's reservation. + * Buils a channel programm to break a device's reservation. * (unconditional reserve) */ static int @@ -1521,6 +1605,40 @@ dasd_eckd_ioctl(struct dasd_device *device, unsigned int cmd, void __user *argp) } } +/* + * Dump the range of CCWs into 'page' buffer + * and return number of printed chars. + */ +static inline int +dasd_eckd_dump_ccw_range(struct ccw1 *from, struct ccw1 *to, char *page) +{ + int len, count; + char *datap; + + len = 0; + while (from <= to) { + len += sprintf(page + len, KERN_ERR PRINTK_HEADER + " CCW %p: %08X %08X DAT:", + from, ((int *) from)[0], ((int *) from)[1]); + + /* get pointer to data (consider IDALs) */ + if (from->flags & CCW_FLAG_IDA) + datap = (char *) *((addr_t *) (addr_t) from->cda); + else + datap = (char *) ((addr_t) from->cda); + + /* dump data (max 32 bytes) */ + for (count = 0; count < from->count && count < 32; count++) { + if (count % 8 == 0) len += sprintf(page + len, " "); + if (count % 4 == 0) len += sprintf(page + len, " "); + len += sprintf(page + len, "%02x", datap[count]); + } + len += sprintf(page + len, "\n"); + from++; + } + return len; +} + /* * Print sense data and related channel program. * Parts are printed because printk buffer is only 1024 bytes. @@ -1530,8 +1648,8 @@ dasd_eckd_dump_sense(struct dasd_device *device, struct dasd_ccw_req * req, struct irb *irb) { char *page; - struct ccw1 *act, *end, *last; - int len, sl, sct, count; + struct ccw1 *first, *last, *fail, *from, *to; + int len, sl, sct; page = (char *) get_zeroed_page(GFP_ATOMIC); if (page == NULL) { @@ -1539,7 +1657,8 @@ dasd_eckd_dump_sense(struct dasd_device *device, struct dasd_ccw_req * req, "No memory to dump sense data"); return; } - len = sprintf(page, KERN_ERR PRINTK_HEADER + /* dump the sense data */ + len = sprintf(page, KERN_ERR PRINTK_HEADER " I/O status report for device %s:\n", device->cdev->dev.bus_id); len += sprintf(page + len, KERN_ERR PRINTK_HEADER @@ -1564,87 +1683,55 @@ dasd_eckd_dump_sense(struct dasd_device *device, struct dasd_ccw_req * req, if (irb->ecw[27] & DASD_SENSE_BIT_0) { /* 24 Byte Sense Data */ - len += sprintf(page + len, KERN_ERR PRINTK_HEADER - " 24 Byte: %x MSG %x, " - "%s MSGb to SYSOP\n", - irb->ecw[7] >> 4, irb->ecw[7] & 0x0f, - irb->ecw[1] & 0x10 ? "" : "no"); + sprintf(page + len, KERN_ERR PRINTK_HEADER + " 24 Byte: %x MSG %x, " + "%s MSGb to SYSOP\n", + irb->ecw[7] >> 4, irb->ecw[7] & 0x0f, + irb->ecw[1] & 0x10 ? "" : "no"); } else { /* 32 Byte Sense Data */ - len += sprintf(page + len, KERN_ERR PRINTK_HEADER - " 32 Byte: Format: %x " - "Exception class %x\n", - irb->ecw[6] & 0x0f, irb->ecw[22] >> 4); + sprintf(page + len, KERN_ERR PRINTK_HEADER + " 32 Byte: Format: %x " + "Exception class %x\n", + irb->ecw[6] & 0x0f, irb->ecw[22] >> 4); } } else { - len += sprintf(page + len, KERN_ERR PRINTK_HEADER - " SORRY - NO VALID SENSE AVAILABLE\n"); + sprintf(page + len, KERN_ERR PRINTK_HEADER + " SORRY - NO VALID SENSE AVAILABLE\n"); } - MESSAGE_LOG(KERN_ERR, "%s", - page + sizeof(KERN_ERR PRINTK_HEADER)); - - /* dump the Channel Program */ - /* print first CCWs (maximum 8) */ - act = req->cpaddr; - for (last = act; last->flags & (CCW_FLAG_CC | CCW_FLAG_DC); last++); - end = min(act + 8, last); - len = sprintf(page, KERN_ERR PRINTK_HEADER + printk("%s", page); + + /* dump the Channel Program (max 140 Bytes per line) */ + /* Count CCW and print first CCWs (maximum 1024 % 140 = 7) */ + first = req->cpaddr; + for (last = first; last->flags & (CCW_FLAG_CC | CCW_FLAG_DC); last++); + to = min(first + 6, last); + len = sprintf(page, KERN_ERR PRINTK_HEADER " Related CP in req: %p\n", req); - while (act <= end) { - len += sprintf(page + len, KERN_ERR PRINTK_HEADER - " CCW %p: %08X %08X DAT:", - act, ((int *) act)[0], ((int *) act)[1]); - for (count = 0; count < 32 && count < act->count; - count += sizeof(int)) - len += sprintf(page + len, " %08X", - ((int *) (addr_t) act->cda) - [(count>>2)]); - len += sprintf(page + len, "\n"); - act++; - } - MESSAGE_LOG(KERN_ERR, "%s", - page + sizeof(KERN_ERR PRINTK_HEADER)); + dasd_eckd_dump_ccw_range(first, to, page + len); + printk("%s", page); - /* print failing CCW area */ + /* print failing CCW area (maximum 4) */ + /* scsw->cda is either valid or zero */ len = 0; - if (act < ((struct ccw1 *)(addr_t) irb->scsw.cpa) - 2) { - act = ((struct ccw1 *)(addr_t) irb->scsw.cpa) - 2; - len += sprintf(page + len, KERN_ERR PRINTK_HEADER "......\n"); - } - end = min((struct ccw1 *)(addr_t) irb->scsw.cpa + 2, last); - while (act <= end) { - len += sprintf(page + len, KERN_ERR PRINTK_HEADER - " CCW %p: %08X %08X DAT:", - act, ((int *) act)[0], ((int *) act)[1]); - for (count = 0; count < 32 && count < act->count; - count += sizeof(int)) - len += sprintf(page + len, " %08X", - ((int *) (addr_t) act->cda) - [(count>>2)]); - len += sprintf(page + len, "\n"); - act++; + from = ++to; + fail = (struct ccw1 *)(addr_t) irb->scsw.cpa; /* failing CCW */ + if (from < fail - 2) { + from = fail - 2; /* there is a gap - print header */ + len += sprintf(page, KERN_ERR PRINTK_HEADER "......\n"); } + to = min(fail + 1, last); + len += dasd_eckd_dump_ccw_range(from, to, page + len); - /* print last CCWs */ - if (act < last - 2) { - act = last - 2; + /* print last CCWs (maximum 2) */ + from = max(from, ++to); + if (from < last - 1) { + from = last - 1; /* there is a gap - print header */ len += sprintf(page + len, KERN_ERR PRINTK_HEADER "......\n"); } - while (act <= last) { - len += sprintf(page + len, KERN_ERR PRINTK_HEADER - " CCW %p: %08X %08X DAT:", - act, ((int *) act)[0], ((int *) act)[1]); - for (count = 0; count < 32 && count < act->count; - count += sizeof(int)) - len += sprintf(page + len, " %08X", - ((int *) (addr_t) act->cda) - [(count>>2)]); - len += sprintf(page + len, "\n"); - act++; - } + len += dasd_eckd_dump_ccw_range(from, last, page + len); if (len > 0) - MESSAGE_LOG(KERN_ERR, "%s", - page + sizeof(KERN_ERR PRINTK_HEADER)); + printk("%s", page); free_page((unsigned long) page); } @@ -1685,14 +1772,8 @@ static struct dasd_discipline dasd_eckd_discipline = { static int __init dasd_eckd_init(void) { - int ret; - ASCEBC(dasd_eckd_discipline.ebcname, 4); - - ret = ccw_driver_register(&dasd_eckd_driver); - if (!ret) - dasd_generic_auto_online(&dasd_eckd_driver); - return ret; + return ccw_driver_register(&dasd_eckd_driver); } static void __exit @@ -1703,22 +1784,3 @@ dasd_eckd_cleanup(void) module_init(dasd_eckd_init); module_exit(dasd_eckd_cleanup); - -/* - * Overrides for Emacs so that we follow Linus's tabbing style. - * Emacs will notice this stuff at the end of the file and automatically - * adjust the settings for this buffer only. This must remain at the end - * of the file. - * --------------------------------------------------------------------------- - * Local variables: - * c-indent-level: 4 - * c-brace-imaginary-offset: 0 - * c-brace-offset: -4 - * c-argdecl-indent: 4 - * c-label-offset: -4 - * c-continued-statement-offset: 4 - * c-continued-brace-offset: 0 - * indent-tabs-mode: 1 - * tab-width: 8 - * End: - */ diff --git a/drivers/s390/block/dasd_eckd.h b/drivers/s390/block/dasd_eckd.h index d5734e976..712ff1650 100644 --- a/drivers/s390/block/dasd_eckd.h +++ b/drivers/s390/block/dasd_eckd.h @@ -1,7 +1,7 @@ -/* +/* * File...........: linux/drivers/s390/block/dasd_eckd.h * Author(s)......: Holger Smolinski - * Horst Hummel + * Horst Hummel * Bugreports.to..: * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 * @@ -41,9 +41,10 @@ #define DASD_ECKD_CCW_RESERVE 0xB4 /* - *Perform Subsystem Function / Sub-Orders + * Perform Subsystem Function / Sub-Orders */ -#define PSF_ORDER_PRSSD 0x18 +#define PSF_ORDER_PRSSD 0x18 +#define PSF_ORDER_SSC 0x1D /***************************************************************************** * SECTION: Type Definitions @@ -155,7 +156,7 @@ struct dasd_eckd_characteristics { unsigned char reserved2:4; unsigned char reserved3:8; unsigned char defect_wr:1; - unsigned char XRC_supported:1; + unsigned char XRC_supported:1; unsigned char reserved4:1; unsigned char striping:1; unsigned char reserved5:4; @@ -343,7 +344,7 @@ struct dasd_eckd_path { }; /* - * Perform Subsystem Function - Prepare for Read Subsystem Data + * Perform Subsystem Function - Prepare for Read Subsystem Data */ struct dasd_psf_prssd_data { unsigned char order; @@ -353,4 +354,15 @@ struct dasd_psf_prssd_data { unsigned char varies[9]; } __attribute__ ((packed)); +/* + * Perform Subsystem Function - Set Subsystem Characteristics + */ +struct dasd_psf_ssc_data { + unsigned char order; + unsigned char flags; + unsigned char cu_type[4]; + unsigned char suborder; + unsigned char reserved[59]; +} __attribute__((packed)); + #endif /* DASD_ECKD_H */ diff --git a/drivers/s390/block/dasd_eer.c b/drivers/s390/block/dasd_eer.c index 2d946b6ca..da65f1b03 100644 --- a/drivers/s390/block/dasd_eer.c +++ b/drivers/s390/block/dasd_eer.c @@ -89,7 +89,7 @@ struct eerbuffer { }; static LIST_HEAD(bufferlist); -static spinlock_t bufferlock = SPIN_LOCK_UNLOCKED; +static DEFINE_SPINLOCK(bufferlock); static DECLARE_WAIT_QUEUE_HEAD(dasd_eer_read_wait_queue); /* @@ -276,7 +276,7 @@ struct dasd_eer_header { __u64 tv_sec; __u64 tv_usec; char busid[DASD_EER_BUSID_SIZE]; -}; +} __attribute__ ((packed)); /* * The following function can be used for those triggers that have @@ -521,6 +521,8 @@ static int dasd_eer_open(struct inode *inp, struct file *filp) unsigned long flags; eerb = kzalloc(sizeof(struct eerbuffer), GFP_KERNEL); + if (!eerb) + return -ENOMEM; eerb->buffer_page_count = eer_pages; if (eerb->buffer_page_count < 1 || eerb->buffer_page_count > INT_MAX / PAGE_SIZE) { diff --git a/drivers/s390/block/dasd_erp.c b/drivers/s390/block/dasd_erp.c index b842377cb..58a650979 100644 --- a/drivers/s390/block/dasd_erp.c +++ b/drivers/s390/block/dasd_erp.c @@ -9,7 +9,6 @@ * */ -#include #include #include @@ -90,7 +89,7 @@ dasd_default_erp_action(struct dasd_ccw_req * cqr) /* just retry - there is nothing to save ... I got no sense data.... */ if (cqr->retries > 0) { - DEV_MESSAGE (KERN_DEBUG, device, + DEV_MESSAGE (KERN_DEBUG, device, "default ERP called (%i retries left)", cqr->retries); cqr->lpm = LPM_ANYPATH; @@ -155,7 +154,7 @@ dasd_default_erp_postaction(struct dasd_ccw_req * cqr) /* * Print the hex dump of the memory used by a request. This includes - * all error recovery ccws that have been chained in from of the + * all error recovery ccws that have been chained in from of the * real request. */ static inline void @@ -227,12 +226,12 @@ dasd_log_ccw(struct dasd_ccw_req * cqr, int caller, __u32 cpa) /* * Log bytes arround failed CCW but only if we did * not log the whole CP of the CCW is outside the - * logged CP. + * logged CP. */ if (cplength > 40 || ((addr_t) cpa < (addr_t) lcqr->cpaddr && (addr_t) cpa > (addr_t) (lcqr->cpaddr + cplength + 4))) { - + DEV_MESSAGE(KERN_ERR, device, "Failed CCW (%p) (area):", (void *) (long) cpa); diff --git a/drivers/s390/block/dasd_fba.c b/drivers/s390/block/dasd_fba.c index 91145698f..e85015be1 100644 --- a/drivers/s390/block/dasd_fba.c +++ b/drivers/s390/block/dasd_fba.c @@ -1,4 +1,4 @@ -/* +/* * File...........: linux/drivers/s390/block/dasd_fba.c * Author(s)......: Holger Smolinski * Bugreports.to..: @@ -6,7 +6,6 @@ * */ -#include #include #include #include @@ -45,8 +44,8 @@ struct dasd_fba_private { }; static struct ccw_device_id dasd_fba_ids[] = { - { CCW_DEVICE_DEVTYPE (0x6310, 0, 0x9336, 0), driver_info: 0x1}, - { CCW_DEVICE_DEVTYPE (0x3880, 0, 0x3370, 0), driver_info: 0x2}, + { CCW_DEVICE_DEVTYPE (0x6310, 0, 0x9336, 0), .driver_info = 0x1}, + { CCW_DEVICE_DEVTYPE (0x3880, 0, 0x3370, 0), .driver_info = 0x2}, { /* end of list */ }, }; @@ -56,19 +55,13 @@ static struct ccw_driver dasd_fba_driver; /* see below */ static int dasd_fba_probe(struct ccw_device *cdev) { - int ret; - - ret = dasd_generic_probe (cdev, &dasd_fba_discipline); - if (ret) - return ret; - ccw_device_set_options(cdev, CCWDEV_DO_PATHGROUP); - return 0; + return dasd_generic_probe(cdev, &dasd_fba_discipline); } static int dasd_fba_set_online(struct ccw_device *cdev) { - return dasd_generic_set_online (cdev, &dasd_fba_discipline); + return dasd_generic_set_online(cdev, &dasd_fba_discipline); } static struct ccw_driver dasd_fba_driver = { @@ -125,13 +118,13 @@ static int dasd_fba_check_characteristics(struct dasd_device *device) { struct dasd_fba_private *private; - struct ccw_device *cdev = device->cdev; + struct ccw_device *cdev = device->cdev; void *rdc_data; int rc; private = (struct dasd_fba_private *) device->private; if (private == NULL) { - private = kmalloc(sizeof(struct dasd_fba_private), GFP_KERNEL); + private = kzalloc(sizeof(struct dasd_fba_private), GFP_KERNEL); if (private == NULL) { DEV_MESSAGE(KERN_WARNING, device, "%s", "memory allocation failed for private " @@ -204,7 +197,7 @@ dasd_fba_examine_error(struct dasd_ccw_req * cqr, struct irb * irb) if (irb->scsw.cstat == 0x00 && irb->scsw.dstat == (DEV_STAT_CHN_END | DEV_STAT_DEV_END)) return dasd_era_none; - + cdev = device->cdev; switch (cdev->id.dev_type) { case 0x3370: @@ -539,7 +532,7 @@ dasd_fba_dump_sense(struct dasd_device *device, struct dasd_ccw_req * req, * 8192 bytes (=2 pages). For 64 bit one dasd_mchunkt_t structure has * 24 bytes, the struct dasd_ccw_req has 136 bytes and each block can use * up to 16 bytes (8 for the ccw and 8 for the idal pointer). In - * addition we have one define extent ccw + 16 bytes of data and a + * addition we have one define extent ccw + 16 bytes of data and a * locate record ccw for each block (stupid devices!) + 16 bytes of data. * That makes: * (8192 - 24 - 136 - 8 - 16) / 40 = 200.2 blocks at maximum. @@ -569,16 +562,8 @@ static struct dasd_discipline dasd_fba_discipline = { static int __init dasd_fba_init(void) { - int ret; - ASCEBC(dasd_fba_discipline.ebcname, 4); - - ret = ccw_driver_register(&dasd_fba_driver); - if (ret) - return ret; - - dasd_generic_auto_online(&dasd_fba_driver); - return 0; + return ccw_driver_register(&dasd_fba_driver); } static void __exit @@ -589,22 +574,3 @@ dasd_fba_cleanup(void) module_init(dasd_fba_init); module_exit(dasd_fba_cleanup); - -/* - * Overrides for Emacs so that we follow Linus's tabbing style. - * Emacs will notice this stuff at the end of the file and automatically - * adjust the settings for this buffer only. This must remain at the end - * of the file. - * --------------------------------------------------------------------------- - * Local variables: - * c-indent-level: 4 - * c-brace-imaginary-offset: 0 - * c-brace-offset: -4 - * c-argdecl-indent: 4 - * c-label-offset: -4 - * c-continued-statement-offset: 4 - * c-continued-brace-offset: 0 - * indent-tabs-mode: 1 - * tab-width: 8 - * End: - */ diff --git a/drivers/s390/block/dasd_fba.h b/drivers/s390/block/dasd_fba.h index da1fa91fc..14c910baa 100644 --- a/drivers/s390/block/dasd_fba.h +++ b/drivers/s390/block/dasd_fba.h @@ -1,4 +1,4 @@ -/* +/* * File...........: linux/drivers/s390/block/dasd_fba.h * Author(s)......: Holger Smolinski * Bugreports.to..: diff --git a/drivers/s390/block/dasd_genhd.c b/drivers/s390/block/dasd_genhd.c index fce2835e7..d16363210 100644 --- a/drivers/s390/block/dasd_genhd.c +++ b/drivers/s390/block/dasd_genhd.c @@ -11,7 +11,6 @@ * */ -#include #include #include #include @@ -68,8 +67,6 @@ dasd_gendisk_alloc(struct dasd_device *device) } len += sprintf(gdp->disk_name + len, "%c", 'a'+(device->devindex%26)); - sprintf(gdp->devfs_name, "dasd/%s", device->cdev->dev.bus_id); - if (device->features & DASD_FEATURE_READONLY) set_disk_ro(gdp, 1); gdp->private_data = device; @@ -86,10 +83,12 @@ dasd_gendisk_alloc(struct dasd_device *device) void dasd_gendisk_free(struct dasd_device *device) { - del_gendisk(device->gdp); - device->gdp->queue = 0; - put_disk(device->gdp); - device->gdp = 0; + if (device->gdp) { + del_gendisk(device->gdp); + device->gdp->queue = NULL; + put_disk(device->gdp); + device->gdp = NULL; + } } /* @@ -139,7 +138,7 @@ dasd_destroy_partitions(struct dasd_device * device) * device->bdev to lower the offline open_count limit again. */ bdev = device->bdev; - device->bdev = 0; + device->bdev = NULL; /* * See fs/partition/check.c:delete_partition @@ -148,7 +147,7 @@ dasd_destroy_partitions(struct dasd_device * device) */ memset(&bpart, 0, sizeof(struct blkpg_partition)); memset(&barg, 0, sizeof(struct blkpg_ioctl_arg)); - barg.data = &bpart; + barg.data = (void __user *) &bpart; barg.op = BLKPG_DEL_PARTITION; for (bpart.pno = device->gdp->minors - 1; bpart.pno > 0; bpart.pno--) ioctl_by_bdev(bdev, BLKPG, (unsigned long) &barg); diff --git a/drivers/s390/block/dasd_int.h b/drivers/s390/block/dasd_int.h index d4b13e300..3ccf06d28 100644 --- a/drivers/s390/block/dasd_int.h +++ b/drivers/s390/block/dasd_int.h @@ -1,7 +1,7 @@ -/* +/* * File...........: linux/drivers/s390/block/dasd_int.h * Author(s)......: Holger Smolinski - * Horst Hummel + * Horst Hummel * Martin Schwidefsky * Bugreports.to..: * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 @@ -54,7 +54,6 @@ #include #include #include -#include #include #include #include @@ -186,7 +185,7 @@ struct dasd_ccw_req { void *callback_data; }; -/* +/* * dasd_ccw_req -> status can be: */ #define DASD_CQR_FILLED 0x00 /* request is ready to be processed */ @@ -248,7 +247,7 @@ struct dasd_discipline { /* * Error recovery functions. examine_error() returns a value that * indicates what to do for an error condition. If examine_error() - * returns 'dasd_era_recover' erp_action() is called to create a + * returns 'dasd_era_recover' erp_action() is called to create a * special error recovery ccw. erp_postaction() is called after * an error recovery ccw has finished its execution. dump_sense * is called for every error condition to print the sense data @@ -302,11 +301,11 @@ struct dasd_device { spinlock_t request_queue_lock; struct block_device *bdev; unsigned int devindex; - unsigned long blocks; /* size of volume in blocks */ - unsigned int bp_block; /* bytes per block */ - unsigned int s2b_shift; /* log2 (bp_block/512) */ - unsigned long flags; /* per device flags */ - unsigned short features; /* copy of devmap-features (read-only!) */ + unsigned long blocks; /* size of volume in blocks */ + unsigned int bp_block; /* bytes per block */ + unsigned int s2b_shift; /* log2 (bp_block/512) */ + unsigned long flags; /* per device flags */ + unsigned short features; /* copy of devmap-features (read-only!) */ /* extended error reporting stuff (eer) */ struct dasd_ccw_req *eer_cqr; @@ -513,12 +512,12 @@ void dasd_generic_remove (struct ccw_device *cdev); int dasd_generic_set_online(struct ccw_device *, struct dasd_discipline *); int dasd_generic_set_offline (struct ccw_device *cdev); int dasd_generic_notify(struct ccw_device *, int); -void dasd_generic_auto_online (struct ccw_driver *); /* externals in dasd_devmap.c */ extern int dasd_max_devindex; extern int dasd_probeonly; extern int dasd_autodetect; +extern int dasd_nopav; int dasd_devmap_init(void); void dasd_devmap_exit(void); @@ -606,22 +605,3 @@ static inline int dasd_eer_enabled(struct dasd_device *device) #endif /* __KERNEL__ */ #endif /* DASD_H */ - -/* - * Overrides for Emacs so that we follow Linus's tabbing style. - * Emacs will notice this stuff at the end of the file and automatically - * adjust the settings for this buffer only. This must remain at the end - * of the file. - * --------------------------------------------------------------------------- - * Local variables: - * c-indent-level: 4 - * c-brace-imaginary-offset: 0 - * c-brace-offset: -4 - * c-argdecl-indent: 4 - * c-label-offset: -4 - * c-continued-statement-offset: 4 - * c-continued-brace-offset: 0 - * indent-tabs-mode: 1 - * tab-width: 8 - * End: - */ diff --git a/drivers/s390/block/dasd_ioctl.c b/drivers/s390/block/dasd_ioctl.c index b8c80d28d..8fed3603e 100644 --- a/drivers/s390/block/dasd_ioctl.c +++ b/drivers/s390/block/dasd_ioctl.c @@ -9,7 +9,6 @@ * * i/o controls for the dasd driver. */ -#include #include #include #include @@ -90,10 +89,10 @@ static int dasd_ioctl_quiesce(struct dasd_device *device) { unsigned long flags; - + if (!capable (CAP_SYS_ADMIN)) return -EACCES; - + DEV_MESSAGE (KERN_DEBUG, device, "%s", "Quiesce IO on device"); spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); @@ -110,13 +109,13 @@ static int dasd_ioctl_resume(struct dasd_device *device) { unsigned long flags; - - if (!capable (CAP_SYS_ADMIN)) + + if (!capable (CAP_SYS_ADMIN)) return -EACCES; DEV_MESSAGE (KERN_DEBUG, device, "%s", "resume IO on device"); - + spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); device->stopped &= ~DASD_STOPPED_QUIESCE; spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); @@ -287,7 +286,7 @@ dasd_ioctl_information(struct dasd_device *device, dasd_info->open_count = atomic_read(&device->open_count); if (!device->bdev) dasd_info->open_count++; - + /* * check if device is really formatted * LDL / CDL was returned by 'fill_info' @@ -346,7 +345,7 @@ dasd_ioctl_set_ro(struct block_device *bdev, void __user *argp) if (bdev != bdev->bd_contains) // ro setting is not allowed for partitions return -EINVAL; - if (get_user(intval, (int *)argp)) + if (get_user(intval, (int __user *)argp)) return -EFAULT; set_disk_ro(bdev->bd_disk, intval); diff --git a/drivers/s390/block/dasd_proc.c b/drivers/s390/block/dasd_proc.c index ad23aede3..bfa010f6d 100644 --- a/drivers/s390/block/dasd_proc.c +++ b/drivers/s390/block/dasd_proc.c @@ -11,7 +11,6 @@ * */ -#include #include #include #include diff --git a/drivers/s390/block/xpram.c b/drivers/s390/block/xpram.c index 54ecd548c..ca7d51f7e 100644 --- a/drivers/s390/block/xpram.c +++ b/drivers/s390/block/xpram.c @@ -36,7 +36,6 @@ #include /* HDIO_GETGEO */ #include #include -#include #include #define XPRAM_NAME "xpram" @@ -49,15 +48,6 @@ #define PRINT_ERR(x...) printk(KERN_ERR XPRAM_NAME " error:" x) -static struct sysdev_class xpram_sysclass = { - set_kset_name("xpram"), -}; - -static struct sys_device xpram_sys_device = { - .id = 0, - .cls = &xpram_sysclass, -}; - typedef struct { unsigned int size; /* size of xpram segment in pages */ unsigned int offset; /* start page of xpram segment */ @@ -72,11 +62,11 @@ static int xpram_devs; /* * Parameter parsing functions. */ -static int devs = XPRAM_DEVS; -static unsigned int sizes[XPRAM_MAX_DEVS]; +static int __initdata devs = XPRAM_DEVS; +static char __initdata *sizes[XPRAM_MAX_DEVS]; module_param(devs, int, 0); -module_param_array(sizes, int, NULL, 0); +module_param_array(sizes, charp, NULL, 0); MODULE_PARM_DESC(devs, "number of devices (\"partitions\"), " \ "the default is " __MODULE_STRING(XPRAM_DEVS) "\n"); @@ -87,59 +77,6 @@ MODULE_PARM_DESC(sizes, "list of device (partition) sizes " \ "claimed by explicit sizes\n"); MODULE_LICENSE("GPL"); -#ifndef MODULE -/* - * Parses the kernel parameters given in the kernel parameter line. - * The expected format is - * [","]* - * where - * devices is a positive integer that initializes xpram_devs - * each size is a non-negative integer possibly followed by a - * magnitude (k,K,m,M,g,G), the list of sizes initialises - * xpram_sizes - * - * Arguments - * str: substring of kernel parameter line that contains xprams - * kernel parameters. - * - * Result 0 on success, -EINVAL else -- only for Version > 2.3 - * - * Side effects - * the global variabls devs is set to the value of - * and sizes[i] is set to the i-th - * partition size (if provided). A parsing error of a value - * results in this value being set to -EINVAL. - */ -static int __init xpram_setup (char *str) -{ - char *cp; - int i; - - devs = simple_strtoul(str, &cp, 10); - if (cp <= str || devs > XPRAM_MAX_DEVS) - return 0; - for (i = 0; (i < devs) && (*cp++ == ','); i++) { - sizes[i] = simple_strtoul(cp, &cp, 10); - if (*cp == 'g' || *cp == 'G') { - sizes[i] <<= 20; - cp++; - } else if (*cp == 'm' || *cp == 'M') { - sizes[i] <<= 10; - cp++; - } else if (*cp == 'k' || *cp == 'K') - cp++; - while (isspace(*cp)) cp++; - } - if (*cp == ',' && i >= devs) - PRINT_WARN("partition sizes list has too many entries.\n"); - else if (*cp != 0) - PRINT_WARN("ignored '%s' at end of parameter string.\n", cp); - return 1; -} - -__setup("xpram_parts=", xpram_setup); -#endif - /* * Copy expanded memory page (4kB) into main memory * Arguments @@ -358,6 +295,7 @@ static int __init xpram_setup_sizes(unsigned long pages) { unsigned long mem_needed; unsigned long mem_auto; + unsigned long long size; int mem_auto_no; int i; @@ -375,7 +313,19 @@ static int __init xpram_setup_sizes(unsigned long pages) mem_needed = 0; mem_auto_no = 0; for (i = 0; i < xpram_devs; i++) { - xpram_sizes[i] = (sizes[i] + 3) & -4UL; + if (sizes[i]) { + size = simple_strtoull(sizes[i], &sizes[i], 0); + switch (sizes[i][0]) { + case 'g': + case 'G': + size <<= 20; + break; + case 'm': + case 'M': + size <<= 10; + } + xpram_sizes[i] = (size + 3) & -4UL; + } if (xpram_sizes[i]) mem_needed += xpram_sizes[i]; else @@ -439,8 +389,6 @@ static int __init xpram_setup_blkdev(void) if (rc < 0) goto out; - devfs_mk_dir("slram"); - /* * Assign the other needed values: make request function, sizes and * hardsect size. All the minor devices feature the same value. @@ -469,14 +417,12 @@ static int __init xpram_setup_blkdev(void) disk->private_data = &xpram_devices[i]; disk->queue = xpram_queue; sprintf(disk->disk_name, "slram%d", i); - sprintf(disk->devfs_name, "slram/%d", i); set_capacity(disk, xpram_sizes[i] << 1); add_disk(disk); } return 0; out_unreg: - devfs_remove("slram"); unregister_blkdev(XPRAM_MAJOR, XPRAM_NAME); out: while (i--) @@ -495,10 +441,7 @@ static void __exit xpram_exit(void) put_disk(xpram_disks[i]); } unregister_blkdev(XPRAM_MAJOR, XPRAM_NAME); - devfs_remove("slram"); blk_cleanup_queue(xpram_queue); - sysdev_unregister(&xpram_sys_device); - sysdev_class_unregister(&xpram_sysclass); } static int __init xpram_init(void) @@ -516,19 +459,7 @@ static int __init xpram_init(void) rc = xpram_setup_sizes(xpram_pages); if (rc) return rc; - rc = sysdev_class_register(&xpram_sysclass); - if (rc) - return rc; - - rc = sysdev_register(&xpram_sys_device); - if (rc) { - sysdev_class_unregister(&xpram_sysclass); - return rc; - } - rc = xpram_setup_blkdev(); - if (rc) - sysdev_unregister(&xpram_sys_device); - return rc; + return xpram_setup_blkdev(); } module_init(xpram_init); diff --git a/drivers/s390/char/con3215.c b/drivers/s390/char/con3215.c index 606f6ad28..2fa566fa6 100644 --- a/drivers/s390/char/con3215.c +++ b/drivers/s390/char/con3215.c @@ -11,7 +11,6 @@ * Dan Morrison, IBM Corporation (dmorriso@cse.buffalo.edu) */ -#include #include #include #include @@ -694,7 +693,7 @@ raw3215_probe (struct ccw_device *cdev) GFP_KERNEL|GFP_DMA); if (raw->buffer == NULL) { spin_lock(&raw3215_device_lock); - raw3215[line] = 0; + raw3215[line] = NULL; spin_unlock(&raw3215_device_lock); kfree(raw); return -ENOMEM; diff --git a/drivers/s390/char/con3270.c b/drivers/s390/char/con3270.c index ef607a1de..7566be890 100644 --- a/drivers/s390/char/con3270.c +++ b/drivers/s390/char/con3270.c @@ -8,7 +8,6 @@ * -- Copyright (C) 2003 IBM Deutschland Entwicklung GmbH, IBM Corporation */ -#include #include #include #include diff --git a/drivers/s390/char/ctrlchar.c b/drivers/s390/char/ctrlchar.c index be463242c..d83eb6358 100644 --- a/drivers/s390/char/ctrlchar.c +++ b/drivers/s390/char/ctrlchar.c @@ -7,7 +7,6 @@ * */ -#include #include #include #include @@ -24,7 +23,7 @@ ctrlchar_handle_sysrq(void *tty) handle_sysrq(ctrlchar_sysrq_key, NULL, (struct tty_struct *) tty); } -static DECLARE_WORK(ctrlchar_work, ctrlchar_handle_sysrq, 0); +static DECLARE_WORK(ctrlchar_work, ctrlchar_handle_sysrq, NULL); #endif diff --git a/drivers/s390/char/defkeymap.c b/drivers/s390/char/defkeymap.c index ca15adb14..17027d918 100644 --- a/drivers/s390/char/defkeymap.c +++ b/drivers/s390/char/defkeymap.c @@ -83,8 +83,8 @@ static u_short shift_ctrl_map[NR_KEYS] = { }; ushort *key_maps[MAX_NR_KEYMAPS] = { - plain_map, shift_map, 0, 0, - ctrl_map, shift_ctrl_map, 0 + plain_map, shift_map, NULL, NULL, + ctrl_map, shift_ctrl_map, NULL, }; unsigned int keymap_count = 4; @@ -145,7 +145,7 @@ char *func_table[MAX_NR_FUNC] = { func_buf + 97, func_buf + 103, func_buf + 109, - 0, + NULL, }; struct kbdiacr accent_table[MAX_DIACR] = { diff --git a/drivers/s390/char/fs3270.c b/drivers/s390/char/fs3270.c index a6415377b..ef004d089 100644 --- a/drivers/s390/char/fs3270.c +++ b/drivers/s390/char/fs3270.c @@ -8,7 +8,6 @@ * -- Copyright (C) 2003 IBM Deutschland Entwicklung GmbH, IBM Corporation */ -#include #include #include #include @@ -237,7 +236,7 @@ fs3270_irq(struct fs3270 *fp, struct raw3270_request *rq, struct irb *irb) * Process reads from fullscreen 3270. */ static ssize_t -fs3270_read(struct file *filp, char *data, size_t count, loff_t *off) +fs3270_read(struct file *filp, char __user *data, size_t count, loff_t *off) { struct fs3270 *fp; struct raw3270_request *rq; @@ -282,7 +281,7 @@ fs3270_read(struct file *filp, char *data, size_t count, loff_t *off) * Process writes to fullscreen 3270. */ static ssize_t -fs3270_write(struct file *filp, const char *data, size_t count, loff_t *off) +fs3270_write(struct file *filp, const char __user *data, size_t count, loff_t *off) { struct fs3270 *fp; struct raw3270_request *rq; @@ -339,10 +338,10 @@ fs3270_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) fp->write_command = arg; break; case TUBGETI: - rc = put_user(fp->read_command, (char *) arg); + rc = put_user(fp->read_command, (char __user *) arg); break; case TUBGETO: - rc = put_user(fp->write_command,(char *) arg); + rc = put_user(fp->write_command,(char __user *) arg); break; case TUBGETMOD: iocb.model = fp->view.model; @@ -351,7 +350,7 @@ fs3270_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) iocb.pf_cnt = 24; iocb.re_cnt = 20; iocb.map = 0; - if (copy_to_user((char *) arg, &iocb, + if (copy_to_user((char __user *) arg, &iocb, sizeof(struct raw3270_iocb))) rc = -EFAULT; break; @@ -480,7 +479,7 @@ fs3270_close(struct inode *inode, struct file *filp) struct fs3270 *fp; fp = filp->private_data; - filp->private_data = 0; + filp->private_data = NULL; if (fp) { fp->fs_pid = 0; raw3270_reset(&fp->view); diff --git a/drivers/s390/char/keyboard.c b/drivers/s390/char/keyboard.c index d4d2ff0a9..3be065691 100644 --- a/drivers/s390/char/keyboard.c +++ b/drivers/s390/char/keyboard.c @@ -7,7 +7,6 @@ * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com), */ -#include #include #include #include @@ -104,7 +103,7 @@ out_maps: out_kbd: kfree(kbd); out: - return 0; + return NULL; } void @@ -305,7 +304,7 @@ kbd_keycode(struct kbd_data *kbd, unsigned int keycode) if (kbd->sysrq) { if (kbd->sysrq == K(KT_LATIN, '-')) { kbd->sysrq = 0; - handle_sysrq(value, 0, kbd->tty); + handle_sysrq(value, NULL, kbd->tty); return; } if (value == '-') { @@ -364,7 +363,7 @@ do_kdsk_ioctl(struct kbd_data *kbd, struct kbentry __user *user_kbe, /* disallocate map */ key_map = kbd->key_maps[tmp.kb_table]; if (key_map) { - kbd->key_maps[tmp.kb_table] = 0; + kbd->key_maps[tmp.kb_table] = NULL; kfree(key_map); } break; diff --git a/drivers/s390/char/monreader.c b/drivers/s390/char/monreader.c index fb7bc9e5e..a138b1510 100644 --- a/drivers/s390/char/monreader.c +++ b/drivers/s390/char/monreader.c @@ -586,7 +586,6 @@ static struct file_operations mon_fops = { static struct miscdevice mon_dev = { .name = "monreader", - .devfs_name = "monreader", .fops = &mon_fops, .minor = MISC_DYNAMIC_MINOR, }; diff --git a/drivers/s390/char/raw3270.c b/drivers/s390/char/raw3270.c index eecb2afad..7a84014f2 100644 --- a/drivers/s390/char/raw3270.c +++ b/drivers/s390/char/raw3270.c @@ -8,7 +8,6 @@ * -- Copyright (C) 2003 IBM Deutschland Entwicklung GmbH, IBM Corporation */ -#include #include #include #include @@ -50,6 +49,9 @@ struct raw3270 { unsigned char *ascebc; /* ascii -> ebcdic table */ struct class_device *clttydev; /* 3270-class tty device ptr */ struct class_device *cltubdev; /* 3270-class tub device ptr */ + + struct raw3270_request init_request; + unsigned char init_data[256]; }; /* raw3270->flags */ @@ -484,8 +486,6 @@ struct raw3270_ua { /* Query Reply structure for Usable Area */ } __attribute__ ((packed)) aua; } __attribute__ ((packed)); -static unsigned char raw3270_init_data[256]; -static struct raw3270_request raw3270_init_request; static struct diag210 raw3270_init_diag210; static DECLARE_MUTEX(raw3270_init_sem); @@ -555,7 +555,7 @@ raw3270_start_init(struct raw3270 *rp, struct raw3270_view *view, #ifdef CONFIG_TN3270_CONSOLE if (raw3270_registered == 0) { spin_lock_irqsave(get_ccwdev_lock(view->dev->cdev), flags); - rq->callback = 0; + rq->callback = NULL; rc = __raw3270_start(rp, view, rq); if (rc == 0) while (!raw3270_request_final(rq)) { @@ -644,17 +644,17 @@ __raw3270_size_device(struct raw3270 *rp) * required (3270 device switched to 'stand-by') and command * rejects (old devices that can't do 'read partition'). */ - memset(&raw3270_init_request, 0, sizeof(raw3270_init_request)); - memset(raw3270_init_data, 0, sizeof(raw3270_init_data)); - /* Store 'read partition' data stream to raw3270_init_data */ - memcpy(raw3270_init_data, wbuf, sizeof(wbuf)); - INIT_LIST_HEAD(&raw3270_init_request.list); - raw3270_init_request.ccw.cmd_code = TC_WRITESF; - raw3270_init_request.ccw.flags = CCW_FLAG_SLI; - raw3270_init_request.ccw.count = sizeof(wbuf); - raw3270_init_request.ccw.cda = (__u32) __pa(raw3270_init_data); - - rc = raw3270_start_init(rp, &raw3270_init_view, &raw3270_init_request); + memset(&rp->init_request, 0, sizeof(rp->init_request)); + memset(&rp->init_data, 0, 256); + /* Store 'read partition' data stream to init_data */ + memcpy(&rp->init_data, wbuf, sizeof(wbuf)); + INIT_LIST_HEAD(&rp->init_request.list); + rp->init_request.ccw.cmd_code = TC_WRITESF; + rp->init_request.ccw.flags = CCW_FLAG_SLI; + rp->init_request.ccw.count = sizeof(wbuf); + rp->init_request.ccw.cda = (__u32) __pa(&rp->init_data); + + rc = raw3270_start_init(rp, &raw3270_init_view, &rp->init_request); if (rc) /* Check error cases: -ERESTARTSYS, -EIO and -EOPNOTSUPP */ return rc; @@ -679,18 +679,18 @@ __raw3270_size_device(struct raw3270 *rp) * The device accepted the 'read partition' command. Now * set up a read ccw and issue it. */ - raw3270_init_request.ccw.cmd_code = TC_READMOD; - raw3270_init_request.ccw.flags = CCW_FLAG_SLI; - raw3270_init_request.ccw.count = sizeof(raw3270_init_data); - raw3270_init_request.ccw.cda = (__u32) __pa(raw3270_init_data); - rc = raw3270_start_init(rp, &raw3270_init_view, &raw3270_init_request); + rp->init_request.ccw.cmd_code = TC_READMOD; + rp->init_request.ccw.flags = CCW_FLAG_SLI; + rp->init_request.ccw.count = sizeof(rp->init_data); + rp->init_request.ccw.cda = (__u32) __pa(rp->init_data); + rc = raw3270_start_init(rp, &raw3270_init_view, &rp->init_request); if (rc) return rc; /* Got a Query Reply */ - count = sizeof(raw3270_init_data) - raw3270_init_request.rescnt; - uap = (struct raw3270_ua *) (raw3270_init_data + 1); + count = sizeof(rp->init_data) - rp->init_request.rescnt; + uap = (struct raw3270_ua *) (rp->init_data + 1); /* Paranoia check. */ - if (raw3270_init_data[0] != 0x88 || uap->uab.qcode != 0x81) + if (rp->init_data[0] != 0x88 || uap->uab.qcode != 0x81) return -EOPNOTSUPP; /* Copy rows/columns of default Usable Area */ rp->rows = uap->uab.h; @@ -719,8 +719,8 @@ raw3270_size_device(struct raw3270 *rp) rc = __raw3270_size_device_vm(rp); else rc = __raw3270_size_device(rp); - raw3270_init_view.dev = 0; - rp->view = 0; + raw3270_init_view.dev = NULL; + rp->view = NULL; up(&raw3270_init_sem); if (rc == 0) { /* Found something. */ /* Try to find a model. */ @@ -749,20 +749,20 @@ raw3270_reset_device(struct raw3270 *rp) int rc; down(&raw3270_init_sem); - memset(&raw3270_init_request, 0, sizeof(raw3270_init_request)); - memset(raw3270_init_data, 0, sizeof(raw3270_init_data)); - /* Store reset data stream to raw3270_init_data/raw3270_init_request */ - raw3270_init_data[0] = TW_KR; - INIT_LIST_HEAD(&raw3270_init_request.list); - raw3270_init_request.ccw.cmd_code = TC_EWRITEA; - raw3270_init_request.ccw.flags = CCW_FLAG_SLI; - raw3270_init_request.ccw.count = 1; - raw3270_init_request.ccw.cda = (__u32) __pa(raw3270_init_data); + memset(&rp->init_request, 0, sizeof(rp->init_request)); + memset(&rp->init_data, 0, sizeof(rp->init_data)); + /* Store reset data stream to init_data/init_request */ + rp->init_data[0] = TW_KR; + INIT_LIST_HEAD(&rp->init_request.list); + rp->init_request.ccw.cmd_code = TC_EWRITEA; + rp->init_request.ccw.flags = CCW_FLAG_SLI; + rp->init_request.ccw.count = 1; + rp->init_request.ccw.cda = (__u32) __pa(rp->init_data); rp->view = &raw3270_init_view; raw3270_init_view.dev = rp; - rc = raw3270_start_init(rp, &raw3270_init_view, &raw3270_init_request); - raw3270_init_view.dev = 0; - rp->view = 0; + rc = raw3270_start_init(rp, &raw3270_init_view, &rp->init_request); + raw3270_init_view.dev = NULL; + rp->view = NULL; up(&raw3270_init_sem); return rc; } @@ -854,7 +854,7 @@ raw3270_setup_console(struct ccw_device *cdev) char *ascebc; int rc; - rp = (struct raw3270 *) alloc_bootmem(sizeof(struct raw3270)); + rp = (struct raw3270 *) alloc_bootmem_low(sizeof(struct raw3270)); ascebc = (char *) alloc_bootmem(256); rc = raw3270_setup_device(cdev, rp, ascebc); if (rc) @@ -895,7 +895,7 @@ raw3270_create_device(struct ccw_device *cdev) char *ascebc; int rc; - rp = kmalloc(sizeof(struct raw3270), GFP_KERNEL); + rp = kmalloc(sizeof(struct raw3270), GFP_KERNEL | GFP_DMA); if (!rp) return ERR_PTR(-ENOMEM); ascebc = kmalloc(256, GFP_KERNEL); @@ -934,7 +934,7 @@ raw3270_activate_view(struct raw3270_view *view) else if (!test_bit(RAW3270_FLAGS_READY, &rp->flags)) rc = -ENODEV; else { - oldview = 0; + oldview = NULL; if (rp->view) { oldview = rp->view; oldview->fn->deactivate(oldview); @@ -951,7 +951,7 @@ raw3270_activate_view(struct raw3270_view *view) rp->view = nv; if (nv->fn->activate(nv) == 0) break; - rp->view = 0; + rp->view = NULL; } } } @@ -975,7 +975,7 @@ raw3270_deactivate_view(struct raw3270_view *view) spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); if (rp->view == view) { view->fn->deactivate(view); - rp->view = 0; + rp->view = NULL; /* Move deactivated view to end of list. */ list_del_init(&view->list); list_add_tail(&view->list, &rp->view_list); @@ -985,7 +985,7 @@ raw3270_deactivate_view(struct raw3270_view *view) rp->view = view; if (view->fn->activate(view) == 0) break; - rp->view = 0; + rp->view = NULL; } } } @@ -1076,7 +1076,7 @@ raw3270_del_view(struct raw3270_view *view) spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); if (rp->view == view) { view->fn->deactivate(view); - rp->view = 0; + rp->view = NULL; } list_del_init(&view->list); if (!rp->view && test_bit(RAW3270_FLAGS_READY, &rp->flags)) { @@ -1106,10 +1106,10 @@ raw3270_delete_device(struct raw3270 *rp) /* Remove from device chain. */ mutex_lock(&raw3270_mutex); - if (rp->clttydev) + if (rp->clttydev && !IS_ERR(rp->clttydev)) class_device_destroy(class3270, MKDEV(IBM_TTY3270_MAJOR, rp->minor)); - if (rp->cltubdev) + if (rp->cltubdev && !IS_ERR(rp->cltubdev)) class_device_destroy(class3270, MKDEV(IBM_FS3270_MAJOR, rp->minor)); list_del_init(&rp->list); @@ -1117,9 +1117,9 @@ raw3270_delete_device(struct raw3270 *rp) /* Disconnect from ccw_device. */ cdev = rp->cdev; - rp->cdev = 0; - cdev->dev.driver_data = 0; - cdev->handler = 0; + rp->cdev = NULL; + cdev->dev.driver_data = NULL; + cdev->handler = NULL; /* Put ccw_device structure. */ put_device(&cdev->dev); @@ -1144,7 +1144,7 @@ raw3270_model_show(struct device *dev, struct device_attribute *attr, char *buf) return snprintf(buf, PAGE_SIZE, "%i\n", ((struct raw3270 *) dev->driver_data)->model); } -static DEVICE_ATTR(model, 0444, raw3270_model_show, 0); +static DEVICE_ATTR(model, 0444, raw3270_model_show, NULL); static ssize_t raw3270_rows_show(struct device *dev, struct device_attribute *attr, char *buf) @@ -1152,7 +1152,7 @@ raw3270_rows_show(struct device *dev, struct device_attribute *attr, char *buf) return snprintf(buf, PAGE_SIZE, "%i\n", ((struct raw3270 *) dev->driver_data)->rows); } -static DEVICE_ATTR(rows, 0444, raw3270_rows_show, 0); +static DEVICE_ATTR(rows, 0444, raw3270_rows_show, NULL); static ssize_t raw3270_columns_show(struct device *dev, struct device_attribute *attr, char *buf) @@ -1160,7 +1160,7 @@ raw3270_columns_show(struct device *dev, struct device_attribute *attr, char *bu return snprintf(buf, PAGE_SIZE, "%i\n", ((struct raw3270 *) dev->driver_data)->cols); } -static DEVICE_ATTR(columns, 0444, raw3270_columns_show, 0); +static DEVICE_ATTR(columns, 0444, raw3270_columns_show, NULL); static struct attribute * raw3270_attrs[] = { &dev_attr_model.attr, @@ -1173,21 +1173,37 @@ static struct attribute_group raw3270_attr_group = { .attrs = raw3270_attrs, }; -static void -raw3270_create_attributes(struct raw3270 *rp) +static int raw3270_create_attributes(struct raw3270 *rp) { - //FIXME: check return code - sysfs_create_group(&rp->cdev->dev.kobj, &raw3270_attr_group); - rp->clttydev = - class_device_create(class3270, NULL, - MKDEV(IBM_TTY3270_MAJOR, rp->minor), - &rp->cdev->dev, "tty%s", - rp->cdev->dev.bus_id); - rp->cltubdev = - class_device_create(class3270, NULL, - MKDEV(IBM_FS3270_MAJOR, rp->minor), - &rp->cdev->dev, "tub%s", - rp->cdev->dev.bus_id); + int rc; + + rc = sysfs_create_group(&rp->cdev->dev.kobj, &raw3270_attr_group); + if (rc) + goto out; + + rp->clttydev = class_device_create(class3270, NULL, + MKDEV(IBM_TTY3270_MAJOR, rp->minor), + &rp->cdev->dev, "tty%s", + rp->cdev->dev.bus_id); + if (IS_ERR(rp->clttydev)) { + rc = PTR_ERR(rp->clttydev); + goto out_ttydev; + } + + rp->cltubdev = class_device_create(class3270, NULL, + MKDEV(IBM_FS3270_MAJOR, rp->minor), + &rp->cdev->dev, "tub%s", + rp->cdev->dev.bus_id); + if (!IS_ERR(rp->cltubdev)) + goto out; + + rc = PTR_ERR(rp->cltubdev); + class_device_destroy(class3270, MKDEV(IBM_TTY3270_MAJOR, rp->minor)); + +out_ttydev: + sysfs_remove_group(&rp->cdev->dev.kobj, &raw3270_attr_group); +out: + return rc; } /* @@ -1255,7 +1271,9 @@ raw3270_set_online (struct ccw_device *cdev) rc = raw3270_reset_device(rp); if (rc) goto failure; - raw3270_create_attributes(rp); + rc = raw3270_create_attributes(rp); + if (rc) + goto failure; set_bit(RAW3270_FLAGS_READY, &rp->flags); mutex_lock(&raw3270_mutex); list_for_each_entry(np, &raw3270_notifier, list) @@ -1296,7 +1314,7 @@ raw3270_remove (struct ccw_device *cdev) spin_lock_irqsave(get_ccwdev_lock(cdev), flags); if (rp->view) { rp->view->fn->deactivate(rp->view); - rp->view = 0; + rp->view = NULL; } while (!list_empty(&rp->view_list)) { v = list_entry(rp->view_list.next, struct raw3270_view, list); diff --git a/drivers/s390/char/raw3270.h b/drivers/s390/char/raw3270.h index b635bf8e7..90beaa80a 100644 --- a/drivers/s390/char/raw3270.h +++ b/drivers/s390/char/raw3270.h @@ -231,7 +231,7 @@ alloc_string(struct list_head *free_list, unsigned long len) INIT_LIST_HEAD(&cs->update); return cs; } - return 0; + return NULL; } static inline unsigned long diff --git a/drivers/s390/char/sclp.c b/drivers/s390/char/sclp.c index 413856440..985d1613b 100644 --- a/drivers/s390/char/sclp.c +++ b/drivers/s390/char/sclp.c @@ -383,6 +383,7 @@ void sclp_sync_wait(void) { unsigned long psw_mask; + unsigned long flags; unsigned long cr0, cr0_sync; u64 timeout; @@ -395,9 +396,11 @@ sclp_sync_wait(void) sclp_tod_from_jiffies(sclp_request_timer.expires - jiffies); } + local_irq_save(flags); /* Prevent bottom half from executing once we force interrupts open */ local_bh_disable(); /* Enable service-signal interruption, disable timer interrupts */ + trace_hardirqs_on(); __ctl_store(cr0, 0, 0); cr0_sync = cr0; cr0_sync |= 0x00000200; @@ -415,11 +418,10 @@ sclp_sync_wait(void) barrier(); cpu_relax(); } - /* Restore interrupt settings */ - asm volatile ("SSM 0(%0)" - : : "a" (&psw_mask) : "memory"); + local_irq_disable(); __ctl_load(cr0, 0, 0); - __local_bh_enable(); + _local_bh_enable(); + local_irq_restore(flags); } EXPORT_SYMBOL(sclp_sync_wait); diff --git a/drivers/s390/char/sclp_con.c b/drivers/s390/char/sclp_con.c index 10ef22f13..86864f641 100644 --- a/drivers/s390/char/sclp_con.c +++ b/drivers/s390/char/sclp_con.c @@ -8,7 +8,6 @@ * Martin Schwidefsky */ -#include #include #include #include diff --git a/drivers/s390/char/sclp_cpi.c b/drivers/s390/char/sclp_cpi.c index 80f7f3131..732dfbdb8 100644 --- a/drivers/s390/char/sclp_cpi.c +++ b/drivers/s390/char/sclp_cpi.c @@ -5,7 +5,6 @@ * SCLP Control-Program Identification. */ -#include #include #include #include diff --git a/drivers/s390/char/sclp_quiesce.c b/drivers/s390/char/sclp_quiesce.c index 83f75774d..32004aae9 100644 --- a/drivers/s390/char/sclp_quiesce.c +++ b/drivers/s390/char/sclp_quiesce.c @@ -7,12 +7,12 @@ * Peter Oberparleiter */ -#include #include #include #include #include #include +#include #include #include #include @@ -32,7 +32,7 @@ do_load_quiesce_psw(void * __unused) psw_t quiesce_psw; int cpu; - if (atomic_compare_and_swap(-1, smp_processor_id(), &cpuid)) + if (atomic_cmpxchg(&cpuid, -1, smp_processor_id()) != -1) signal_processor(smp_processor_id(), sigp_stop); /* Wait for all other cpus to enter stopped state */ for_each_online_cpu(cpu) { @@ -66,8 +66,6 @@ do_machine_quiesce(void) } #endif -extern void ctrl_alt_del(void); - /* Handler for quiesce event. Start shutdown procedure. */ static void sclp_quiesce_handler(struct evbuf_header *evbuf) diff --git a/drivers/s390/char/sclp_rw.c b/drivers/s390/char/sclp_rw.c index 91e93c78f..0c92d3909 100644 --- a/drivers/s390/char/sclp_rw.c +++ b/drivers/s390/char/sclp_rw.c @@ -8,7 +8,6 @@ * Martin Schwidefsky */ -#include #include #include #include diff --git a/drivers/s390/char/sclp_tty.c b/drivers/s390/char/sclp_tty.c index 6cbf067f1..f6cf90230 100644 --- a/drivers/s390/char/sclp_tty.c +++ b/drivers/s390/char/sclp_tty.c @@ -8,7 +8,6 @@ * Martin Schwidefsky */ -#include #include #include #include diff --git a/drivers/s390/char/sclp_vt220.c b/drivers/s390/char/sclp_vt220.c index 9e02625c8..54fba6f17 100644 --- a/drivers/s390/char/sclp_vt220.c +++ b/drivers/s390/char/sclp_vt220.c @@ -7,7 +7,6 @@ * Author(s): Peter Oberparleiter */ -#include #include #include #include diff --git a/drivers/s390/char/tape.h b/drivers/s390/char/tape.h index cd51ace8b..1f4c89967 100644 --- a/drivers/s390/char/tape.h +++ b/drivers/s390/char/tape.h @@ -16,7 +16,6 @@ #include #include #include -#include #include #include #include diff --git a/drivers/s390/char/tape_34xx.c b/drivers/s390/char/tape_34xx.c index d4f2da738..7b95dab91 100644 --- a/drivers/s390/char/tape_34xx.c +++ b/drivers/s390/char/tape_34xx.c @@ -8,7 +8,6 @@ * Martin Schwidefsky */ -#include #include #include #include @@ -1310,9 +1309,9 @@ static struct tape_discipline tape_discipline_34xx = { }; static struct ccw_device_id tape_34xx_ids[] = { - { CCW_DEVICE_DEVTYPE(0x3480, 0, 0x3480, 0), driver_info: tape_3480}, - { CCW_DEVICE_DEVTYPE(0x3490, 0, 0x3490, 0), driver_info: tape_3490}, - { /* end of list */ } + { CCW_DEVICE_DEVTYPE(0x3480, 0, 0x3480, 0), .driver_info = tape_3480}, + { CCW_DEVICE_DEVTYPE(0x3490, 0, 0x3490, 0), .driver_info = tape_3490}, + { /* end of list */ }, }; static int diff --git a/drivers/s390/char/tape_3590.c b/drivers/s390/char/tape_3590.c index d71ef1ade..928cbefc4 100644 --- a/drivers/s390/char/tape_3590.c +++ b/drivers/s390/char/tape_3590.c @@ -8,7 +8,6 @@ * Martin Schwidefsky */ -#include #include #include #include diff --git a/drivers/s390/char/tape_block.c b/drivers/s390/char/tape_block.c index b70d92690..3225fcd1d 100644 --- a/drivers/s390/char/tape_block.c +++ b/drivers/s390/char/tape_block.c @@ -11,7 +11,6 @@ */ #include -#include #include #include #include diff --git a/drivers/s390/char/tape_char.c b/drivers/s390/char/tape_char.c index 5ce7ca38a..97f75237b 100644 --- a/drivers/s390/char/tape_char.c +++ b/drivers/s390/char/tape_char.c @@ -10,7 +10,6 @@ * Martin Schwidefsky */ -#include #include #include #include diff --git a/drivers/s390/char/tape_class.c b/drivers/s390/char/tape_class.c index a5c68e60f..56b87618b 100644 --- a/drivers/s390/char/tape_class.c +++ b/drivers/s390/char/tape_class.c @@ -76,14 +76,22 @@ struct tape_class_device *register_tape_dev( device, "%s", tcd->device_name ); - sysfs_create_link( + rc = IS_ERR(tcd->class_device) ? PTR_ERR(tcd->class_device) : 0; + if (rc) + goto fail_with_cdev; + rc = sysfs_create_link( &device->kobj, &tcd->class_device->kobj, tcd->mode_name ); + if (rc) + goto fail_with_class_device; return tcd; +fail_with_class_device: + class_device_destroy(tape_class, tcd->char_device->dev); + fail_with_cdev: cdev_del(tcd->char_device); diff --git a/drivers/s390/char/tape_core.c b/drivers/s390/char/tape_core.c index e6e4086d3..2826aed91 100644 --- a/drivers/s390/char/tape_core.c +++ b/drivers/s390/char/tape_core.c @@ -11,7 +11,6 @@ * Stefan Bader */ -#include #include #include // for kernel parameters #include // for requesting modules @@ -544,20 +543,24 @@ int tape_generic_probe(struct ccw_device *cdev) { struct tape_device *device; + int ret; device = tape_alloc_device(); if (IS_ERR(device)) return -ENODEV; - PRINT_INFO("tape device %s found\n", cdev->dev.bus_id); + ccw_device_set_options(cdev, CCWDEV_DO_PATHGROUP); + ret = sysfs_create_group(&cdev->dev.kobj, &tape_attr_group); + if (ret) { + tape_put_device(device); + PRINT_ERR("probe failed for tape device %s\n", cdev->dev.bus_id); + return ret; + } cdev->dev.driver_data = device; + cdev->handler = __tape_do_irq; device->cdev = cdev; device->cdev_id = busid_to_int(cdev->dev.bus_id); - cdev->handler = __tape_do_irq; - - ccw_device_set_options(cdev, CCWDEV_DO_PATHGROUP); - sysfs_create_group(&cdev->dev.kobj, &tape_attr_group); - - return 0; + PRINT_INFO("tape device %s found\n", cdev->dev.bus_id); + return ret; } static inline void diff --git a/drivers/s390/char/tape_proc.c b/drivers/s390/char/tape_proc.c index 5fec0a10c..655d375ab 100644 --- a/drivers/s390/char/tape_proc.c +++ b/drivers/s390/char/tape_proc.c @@ -11,7 +11,6 @@ * PROCFS Functions */ -#include #include #include #include diff --git a/drivers/s390/char/tape_std.c b/drivers/s390/char/tape_std.c index 99cf881f4..7a76ec413 100644 --- a/drivers/s390/char/tape_std.c +++ b/drivers/s390/char/tape_std.c @@ -11,7 +11,6 @@ * Stefan Bader */ -#include #include #include #include diff --git a/drivers/s390/char/tty3270.c b/drivers/s390/char/tty3270.c index 9a1417768..29718042c 100644 --- a/drivers/s390/char/tty3270.c +++ b/drivers/s390/char/tty3270.c @@ -8,7 +8,6 @@ * -- Copyright (C) 2003 IBM Deutschland Entwicklung GmbH, IBM Corporation */ -#include #include #include #include @@ -438,7 +437,7 @@ tty3270_rcl_add(struct tty3270 *tp, char *input, int len) { struct string *s; - tp->rcl_walk = 0; + tp->rcl_walk = NULL; if (len <= 0) return; if (tp->rcl_nr >= tp->rcl_max) { @@ -467,12 +466,12 @@ tty3270_rcl_backward(struct kbd_data *kbd) else if (!list_empty(&tp->rcl_lines)) tp->rcl_walk = tp->rcl_lines.prev; s = tp->rcl_walk ? - list_entry(tp->rcl_walk, struct string, list) : 0; + list_entry(tp->rcl_walk, struct string, list) : NULL; if (tp->rcl_walk) { s = list_entry(tp->rcl_walk, struct string, list); tty3270_update_prompt(tp, s->string, s->len); } else - tty3270_update_prompt(tp, 0, 0); + tty3270_update_prompt(tp, NULL, 0); tty3270_set_timer(tp, 1); } spin_unlock_bh(&tp->view.lock); @@ -554,7 +553,7 @@ tty3270_read_tasklet(struct raw3270_request *rrq) * has to be emitted to the tty and for 0x6d the screen * needs to be redrawn. */ - input = 0; + input = NULL; len = 0; if (tp->input->string[0] == 0x7d) { /* Enter: write input to tty. */ @@ -568,7 +567,7 @@ tty3270_read_tasklet(struct raw3270_request *rrq) tty3270_update_status(tp); } /* Clear input area. */ - tty3270_update_prompt(tp, 0, 0); + tty3270_update_prompt(tp, NULL, 0); tty3270_set_timer(tp, 1); } else if (tp->input->string[0] == 0x6d) { /* Display has been cleared. Redraw. */ @@ -809,8 +808,8 @@ tty3270_release(struct raw3270_view *view) tp = (struct tty3270 *) view; tty = tp->tty; if (tty) { - tty->driver_data = 0; - tp->tty = tp->kbd->tty = 0; + tty->driver_data = NULL; + tp->tty = tp->kbd->tty = NULL; tty_hangup(tty); raw3270_put_view(&tp->view); } @@ -949,8 +948,8 @@ tty3270_close(struct tty_struct *tty, struct file * filp) return; tp = (struct tty3270 *) tty->driver_data; if (tp) { - tty->driver_data = 0; - tp->tty = tp->kbd->tty = 0; + tty->driver_data = NULL; + tp->tty = tp->kbd->tty = NULL; raw3270_put_view(&tp->view); } } @@ -1674,7 +1673,7 @@ tty3270_set_termios(struct tty_struct *tty, struct termios *old) new = L_ECHO(tty) ? TF_INPUT: TF_INPUTN; if (new != tp->inattr) { tp->inattr = new; - tty3270_update_prompt(tp, 0, 0); + tty3270_update_prompt(tp, NULL, 0); tty3270_set_timer(tp, 1); } } @@ -1760,7 +1759,7 @@ void tty3270_notifier(int index, int active) { if (active) - tty_register_device(tty3270_driver, index, 0); + tty_register_device(tty3270_driver, index, NULL); else tty_unregister_device(tty3270_driver, index); } @@ -1785,7 +1784,6 @@ tty3270_init(void) * proc_entry, set_termios, flush_buffer, set_ldisc, write_proc */ driver->owner = THIS_MODULE; - driver->devfs_name = "ttyTUB/"; driver->driver_name = "ttyTUB"; driver->name = "ttyTUB"; driver->major = IBM_TTY3270_MAJOR; @@ -1793,7 +1791,7 @@ tty3270_init(void) driver->type = TTY_DRIVER_TYPE_SYSTEM; driver->subtype = SYSTEM_TYPE_TTY; driver->init_termios = tty_std_termios; - driver->flags = TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_NO_DEVFS; + driver->flags = TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_DYNAMIC_DEV; tty_set_operations(driver, &tty3270_ops); ret = tty_register_driver(driver); if (ret) { @@ -1820,7 +1818,7 @@ tty3270_exit(void) raw3270_unregister_notifier(tty3270_notifier); driver = tty3270_driver; - tty3270_driver = 0; + tty3270_driver = NULL; tty_unregister_driver(driver); tty3270_del_views(); } diff --git a/drivers/s390/char/vmlogrdr.c b/drivers/s390/char/vmlogrdr.c index c625b69eb..6cb230409 100644 --- a/drivers/s390/char/vmlogrdr.c +++ b/drivers/s390/char/vmlogrdr.c @@ -86,8 +86,8 @@ struct vmlogrdr_priv_t { */ static int vmlogrdr_open(struct inode *, struct file *); static int vmlogrdr_release(struct inode *, struct file *); -static ssize_t vmlogrdr_read (struct file *filp, char *data, size_t count, - loff_t * ppos); +static ssize_t vmlogrdr_read (struct file *filp, char __user *data, + size_t count, loff_t * ppos); static struct file_operations vmlogrdr_fops = { .owner = THIS_MODULE, @@ -515,7 +515,7 @@ vmlogrdr_receive_data(struct vmlogrdr_priv_t *priv) { static ssize_t -vmlogrdr_read (struct file *filp, char *data, size_t count, loff_t * ppos) +vmlogrdr_read(struct file *filp, char __user *data, size_t count, loff_t * ppos) { int rc; struct vmlogrdr_priv_t * priv = filp->private_data; diff --git a/drivers/s390/char/vmwatchdog.c b/drivers/s390/char/vmwatchdog.c index 5acc0ace3..807320a41 100644 --- a/drivers/s390/char/vmwatchdog.c +++ b/drivers/s390/char/vmwatchdog.c @@ -193,7 +193,7 @@ static int vmwdt_ioctl(struct inode *i, struct file *f, return 0; case WDIOC_GETSTATUS: case WDIOC_GETBOOTSTATUS: - return put_user(0, (int *)arg); + return put_user(0, (int __user *)arg); case WDIOC_GETTEMP: return -EINVAL; case WDIOC_SETOPTIONS: diff --git a/drivers/s390/cio/blacklist.c b/drivers/s390/cio/blacklist.c index 0960bef7b..12c2d6b74 100644 --- a/drivers/s390/cio/blacklist.c +++ b/drivers/s390/cio/blacklist.c @@ -9,7 +9,6 @@ * Arnd Bergmann (arndb@de.ibm.com) */ -#include #include #include #include @@ -224,39 +223,6 @@ is_blacklisted (int ssid, int devno) } #ifdef CONFIG_PROC_FS -static int -__s390_redo_validation(struct subchannel_id schid, void *data) -{ - int ret; - struct subchannel *sch; - - sch = get_subchannel_by_schid(schid); - if (sch) { - /* Already known. */ - put_device(&sch->dev); - return 0; - } - ret = css_probe_device(schid); - if (ret == -ENXIO) - return ret; /* We're through. */ - if (ret == -ENOMEM) - /* Stop validation for now. Bad, but no need for a panic. */ - return ret; - return 0; -} - -/* - * Function: s390_redo_validation - * Look for no longer blacklisted devices - * FIXME: there must be a better way to do this */ -static inline void -s390_redo_validation (void) -{ - CIO_TRACE_EVENT (0, "redoval"); - - for_each_subchannel(__s390_redo_validation, NULL); -} - /* * Function: blacklist_parse_proc_parameters * parse the stuff which is piped to /proc/cio_ignore @@ -281,7 +247,7 @@ blacklist_parse_proc_parameters (char *buf) return; } - s390_redo_validation (); + css_schedule_reprobe(); } /* Iterator struct for all devices. */ diff --git a/drivers/s390/cio/ccwgroup.c b/drivers/s390/cio/ccwgroup.c index bdfee7fba..38954f5cd 100644 --- a/drivers/s390/cio/ccwgroup.c +++ b/drivers/s390/cio/ccwgroup.c @@ -152,7 +152,6 @@ ccwgroup_create(struct device *root, struct ccwgroup_device *gdev; int i; int rc; - int del_drvdata; if (argc > 256) /* disallow dumb users */ return -EINVAL; @@ -163,7 +162,6 @@ ccwgroup_create(struct device *root, atomic_set(&gdev->onoff, 0); - del_drvdata = 0; for (i = 0; i < argc; i++) { gdev->cdev[i] = get_ccwdev_by_busid(cdrv, argv[i]); @@ -180,18 +178,14 @@ ccwgroup_create(struct device *root, rc = -EINVAL; goto free_dev; } - } - for (i = 0; i < argc; i++) gdev->cdev[i]->dev.driver_data = gdev; - del_drvdata = 1; + } gdev->creator_id = creator_id; gdev->count = argc; - gdev->dev = (struct device ) { - .bus = &ccwgroup_bus_type, - .parent = root, - .release = ccwgroup_release, - }; + gdev->dev.bus = &ccwgroup_bus_type; + gdev->dev.parent = root; + gdev->dev.release = ccwgroup_release; snprintf (gdev->dev.bus_id, BUS_ID_SIZE, "%s", gdev->cdev[0]->dev.bus_id); @@ -226,9 +220,9 @@ error: free_dev: for (i = 0; i < argc; i++) if (gdev->cdev[i]) { - put_device(&gdev->cdev[i]->dev); - if (del_drvdata) + if (gdev->cdev[i]->dev.driver_data == gdev) gdev->cdev[i]->dev.driver_data = NULL; + put_device(&gdev->cdev[i]->dev); } kfree(gdev); return rc; @@ -319,7 +313,7 @@ ccwgroup_online_store (struct device *dev, struct device_attribute *attr, const if (!try_module_get(gdrv->owner)) return -EINVAL; - value = simple_strtoul(buf, 0, 0); + value = simple_strtoul(buf, NULL, 0); ret = count; if (value == 1) ccwgroup_set_online(gdev); @@ -395,30 +389,31 @@ int ccwgroup_driver_register (struct ccwgroup_driver *cdriver) { /* register our new driver with the core */ - cdriver->driver = (struct device_driver) { - .bus = &ccwgroup_bus_type, - .name = cdriver->name, - }; + cdriver->driver.bus = &ccwgroup_bus_type; + cdriver->driver.name = cdriver->name; return driver_register(&cdriver->driver); } static int -__ccwgroup_driver_unregister_device(struct device *dev, void *data) +__ccwgroup_match_all(struct device *dev, void *data) { - __ccwgroup_remove_symlinks(to_ccwgroupdev(dev)); - device_unregister(dev); - put_device(dev); - return 0; + return 1; } void ccwgroup_driver_unregister (struct ccwgroup_driver *cdriver) { + struct device *dev; + /* We don't want ccwgroup devices to live longer than their driver. */ get_driver(&cdriver->driver); - driver_for_each_device(&cdriver->driver, NULL, NULL, - __ccwgroup_driver_unregister_device); + while ((dev = driver_find_device(&cdriver->driver, NULL, NULL, + __ccwgroup_match_all))) { + __ccwgroup_remove_symlinks(to_ccwgroupdev(dev)); + device_unregister(dev); + put_device(dev); + } put_driver(&cdriver->driver); driver_unregister(&cdriver->driver); } diff --git a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c index 72187e54d..c28444af0 100644 --- a/drivers/s390/cio/chsc.c +++ b/drivers/s390/cio/chsc.c @@ -10,7 +10,6 @@ */ #include -#include #include #include #include @@ -239,13 +238,10 @@ s390_subchannel_remove_chpid(struct device *dev, void *data) /* Check for single path devices. */ if (sch->schib.pmcw.pim == 0x80) goto out_unreg; - if (sch->vpm == mask) - goto out_unreg; if ((sch->schib.scsw.actl & SCSW_ACTL_DEVACT) && (sch->schib.scsw.actl & SCSW_ACTL_SCHACT) && - (sch->schib.pmcw.lpum == mask) && - (sch->vpm == 0)) { + (sch->schib.pmcw.lpum == mask)) { int cc; cc = cio_clear(sch); @@ -260,6 +256,8 @@ s390_subchannel_remove_chpid(struct device *dev, void *data) /* trigger path verification. */ if (sch->driver && sch->driver->verify) sch->driver->verify(&sch->dev); + else if (sch->vpm == mask) + goto out_unreg; out_unlock: spin_unlock_irq(&sch->lock); return 0; @@ -918,12 +916,13 @@ chp_measurement_read(struct kobject *kobj, char *buf, loff_t off, size_t count) chp = to_channelpath(container_of(kobj, struct device, kobj)); css = to_css(chp->dev.parent); - size = sizeof(struct cmg_chars); + size = sizeof(struct cmg_entry); /* Only allow single reads. */ if (off || count < size) return 0; chp_measurement_copy_block((struct cmg_entry *)buf, css, chp->id); + count = size; return count; } @@ -1392,10 +1391,8 @@ new_channel_path(int chpid) /* fill in status, etc. */ chp->id = chpid; chp->state = 1; - chp->dev = (struct device) { - .parent = &css[0]->device, - .release = chp_release, - }; + chp->dev.parent = &css[0]->device; + chp->dev.release = chp_release; snprintf(chp->dev.bus_id, BUS_ID_SIZE, "chp0.%x", chpid); /* Obtain channel path description and fill it in. */ @@ -1465,6 +1462,40 @@ chsc_get_chp_desc(struct subchannel *sch, int chp_no) return desc; } +static int reset_channel_path(struct channel_path *chp) +{ + int cc; + + cc = rchp(chp->id); + switch (cc) { + case 0: + return 0; + case 2: + return -EBUSY; + default: + return -ENODEV; + } +} + +static void reset_channel_paths_css(struct channel_subsystem *css) +{ + int i; + + for (i = 0; i <= __MAX_CHPID; i++) { + if (css->chps[i]) + reset_channel_path(css->chps[i]); + } +} + +void cio_reset_channel_paths(void) +{ + int i; + + for (i = 0; i <= __MAX_CSSID; i++) { + if (css[i] && css[i]->valid) + reset_channel_paths_css(css[i]); + } +} static int __init chsc_alloc_sei_area(void) diff --git a/drivers/s390/cio/cio.c b/drivers/s390/cio/cio.c index 5b20d8c9c..d0148e5fb 100644 --- a/drivers/s390/cio/cio.c +++ b/drivers/s390/cio/cio.c @@ -11,12 +11,12 @@ */ #include -#include #include #include #include #include #include +#include #include #include @@ -148,7 +148,7 @@ cio_tpi(void) sch->driver->irq(&sch->dev); spin_unlock(&sch->lock); irq_exit (); - __local_bh_enable(); + _local_bh_enable(); return 1; } @@ -520,6 +520,7 @@ cio_validate_subchannel (struct subchannel *sch, struct subchannel_id schid) memset(sch, 0, sizeof(struct subchannel)); spin_lock_init(&sch->lock); + mutex_init(&sch->reg_mutex); /* Set a name for the subchannel */ snprintf (sch->dev.bus_id, BUS_ID_SIZE, "0.%x.%04x", schid.ssid, @@ -639,12 +640,16 @@ do_IRQ (struct pt_regs *regs) spin_lock(&sch->lock); /* Store interrupt response block to lowcore. */ if (tsch (tpi_info->schid, irb) == 0 && sch) { + struct vx_info_save vxis; + /* Keep subchannel information word up to date. */ memcpy (&sch->schib.scsw, &irb->scsw, sizeof (irb->scsw)); /* Call interrupt handler if there is one. */ + __enter_vx_admin(&vxis); if (sch->driver && sch->driver->irq) sch->driver->irq(&sch->dev); + __leave_vx_admin(&vxis); } if (sch) spin_unlock(&sch->lock); @@ -798,7 +803,7 @@ struct subchannel * cio_get_console_subchannel(void) { if (!console_subchannel_in_use) - return 0; + return NULL; return &console_subchannel; } @@ -876,5 +881,6 @@ void reipl(unsigned long devno) { clear_all_subchannels(); + cio_reset_channel_paths(); do_reipl(devno); } diff --git a/drivers/s390/cio/cio.h b/drivers/s390/cio/cio.h index 0ca987344..4541c1af4 100644 --- a/drivers/s390/cio/cio.h +++ b/drivers/s390/cio/cio.h @@ -2,6 +2,7 @@ #define S390_CIO_H #include "schid.h" +#include /* * where we put the ssd info @@ -87,7 +88,7 @@ struct orb { struct subchannel { struct subchannel_id schid; spinlock_t lock; /* subchannel lock */ - + struct mutex reg_mutex; enum { SUBCHANNEL_TYPE_IO = 0, SUBCHANNEL_TYPE_CHSC = 1, diff --git a/drivers/s390/cio/cmf.c b/drivers/s390/cio/cmf.c index 07ef3f640..828b2d334 100644 --- a/drivers/s390/cio/cmf.c +++ b/drivers/s390/cio/cmf.c @@ -3,9 +3,10 @@ * * Linux on zSeries Channel Measurement Facility support * - * Copyright 2000,2003 IBM Corporation + * Copyright 2000,2006 IBM Corporation * - * Author: Arnd Bergmann + * Authors: Arnd Bergmann + * Cornelia Huck * * original idea from Natarajan Krishnaswami * @@ -96,9 +97,9 @@ module_param(format, bool, 0444); /** * struct cmb_operations - functions to use depending on cmb_format * - * all these functions operate on a struct cmf_device. There is only - * one instance of struct cmb_operations because all cmf_device - * objects are guaranteed to be of the same type. + * Most of these functions operate on a struct ccw_device. There is only + * one instance of struct cmb_operations because the format of the measurement + * data is guaranteed to be the same for every ccw_device. * * @alloc: allocate memory for a channel measurement block, * either with the help of a special pool or with kmalloc @@ -107,6 +108,7 @@ module_param(format, bool, 0444); * @readall: read a measurement block in a common format * @reset: clear the data in the associated measurement block and * reset its time stamp + * @align: align an allocated block so that the hardware can use it */ struct cmb_operations { int (*alloc) (struct ccw_device*); @@ -115,11 +117,19 @@ struct cmb_operations { u64 (*read) (struct ccw_device*, int); int (*readall)(struct ccw_device*, struct cmbdata *); void (*reset) (struct ccw_device*); + void * (*align) (void *); struct attribute_group *attr_group; }; static struct cmb_operations *cmbops; +struct cmb_data { + void *hw_block; /* Pointer to block updated by hardware */ + void *last_block; /* Last changed block copied from hardware block */ + int size; /* Size of hw_block and last_block */ + unsigned long long last_update; /* when last_block was updated */ +}; + /* our user interface is designed in terms of nanoseconds, * while the hardware measures total times in its own * unit.*/ @@ -226,63 +236,229 @@ struct set_schib_struct { unsigned long address; wait_queue_head_t wait; int ret; + struct kref kref; }; +static void cmf_set_schib_release(struct kref *kref) +{ + struct set_schib_struct *set_data; + + set_data = container_of(kref, struct set_schib_struct, kref); + kfree(set_data); +} + +#define CMF_PENDING 1 + static int set_schib_wait(struct ccw_device *cdev, u32 mme, int mbfc, unsigned long address) { - struct set_schib_struct s = { - .mme = mme, - .mbfc = mbfc, - .address = address, - .wait = __WAIT_QUEUE_HEAD_INITIALIZER(s.wait), - }; + struct set_schib_struct *set_data; + int ret; spin_lock_irq(cdev->ccwlock); - s.ret = set_schib(cdev, mme, mbfc, address); - if (s.ret != -EBUSY) { - goto out_nowait; + if (!cdev->private->cmb) { + ret = -ENODEV; + goto out; } + set_data = kzalloc(sizeof(struct set_schib_struct), GFP_ATOMIC); + if (!set_data) { + ret = -ENOMEM; + goto out; + } + init_waitqueue_head(&set_data->wait); + kref_init(&set_data->kref); + set_data->mme = mme; + set_data->mbfc = mbfc; + set_data->address = address; + + ret = set_schib(cdev, mme, mbfc, address); + if (ret != -EBUSY) + goto out_put; if (cdev->private->state != DEV_STATE_ONLINE) { - s.ret = -EBUSY; /* if the device is not online, don't even try again */ - goto out_nowait; + ret = -EBUSY; + goto out_put; } + cdev->private->state = DEV_STATE_CMFCHANGE; - cdev->private->cmb_wait = &s; - s.ret = 1; + set_data->ret = CMF_PENDING; + cdev->private->cmb_wait = set_data; spin_unlock_irq(cdev->ccwlock); - if (wait_event_interruptible(s.wait, s.ret != 1)) { + if (wait_event_interruptible(set_data->wait, + set_data->ret != CMF_PENDING)) { spin_lock_irq(cdev->ccwlock); - if (s.ret == 1) { - s.ret = -ERESTARTSYS; - cdev->private->cmb_wait = 0; + if (set_data->ret == CMF_PENDING) { + set_data->ret = -ERESTARTSYS; if (cdev->private->state == DEV_STATE_CMFCHANGE) cdev->private->state = DEV_STATE_ONLINE; } spin_unlock_irq(cdev->ccwlock); } - return s.ret; - -out_nowait: + spin_lock_irq(cdev->ccwlock); + cdev->private->cmb_wait = NULL; + ret = set_data->ret; +out_put: + kref_put(&set_data->kref, cmf_set_schib_release); +out: spin_unlock_irq(cdev->ccwlock); - return s.ret; + return ret; } void retry_set_schib(struct ccw_device *cdev) { - struct set_schib_struct *s; + struct set_schib_struct *set_data; + + set_data = cdev->private->cmb_wait; + if (!set_data) { + WARN_ON(1); + return; + } + kref_get(&set_data->kref); + set_data->ret = set_schib(cdev, set_data->mme, set_data->mbfc, + set_data->address); + wake_up(&set_data->wait); + kref_put(&set_data->kref, cmf_set_schib_release); +} + +static int cmf_copy_block(struct ccw_device *cdev) +{ + struct subchannel *sch; + void *reference_buf; + void *hw_block; + struct cmb_data *cmb_data; + + sch = to_subchannel(cdev->dev.parent); + + if (stsch(sch->schid, &sch->schib)) + return -ENODEV; + + if (sch->schib.scsw.fctl & SCSW_FCTL_START_FUNC) { + /* Don't copy if a start function is in progress. */ + if ((!sch->schib.scsw.actl & SCSW_ACTL_SUSPENDED) && + (sch->schib.scsw.actl & + (SCSW_ACTL_DEVACT | SCSW_ACTL_SCHACT)) && + (!sch->schib.scsw.stctl & SCSW_STCTL_SEC_STATUS)) + return -EBUSY; + } + cmb_data = cdev->private->cmb; + hw_block = cmbops->align(cmb_data->hw_block); + if (!memcmp(cmb_data->last_block, hw_block, cmb_data->size)) + /* No need to copy. */ + return 0; + reference_buf = kzalloc(cmb_data->size, GFP_ATOMIC); + if (!reference_buf) + return -ENOMEM; + /* Ensure consistency of block copied from hardware. */ + do { + memcpy(cmb_data->last_block, hw_block, cmb_data->size); + memcpy(reference_buf, hw_block, cmb_data->size); + } while (memcmp(cmb_data->last_block, reference_buf, cmb_data->size)); + cmb_data->last_update = get_clock(); + kfree(reference_buf); + return 0; +} + +struct copy_block_struct { + wait_queue_head_t wait; + int ret; + struct kref kref; +}; + +static void cmf_copy_block_release(struct kref *kref) +{ + struct copy_block_struct *copy_block; + + copy_block = container_of(kref, struct copy_block_struct, kref); + kfree(copy_block); +} + +static int cmf_cmb_copy_wait(struct ccw_device *cdev) +{ + struct copy_block_struct *copy_block; + int ret; + unsigned long flags; + + spin_lock_irqsave(cdev->ccwlock, flags); + if (!cdev->private->cmb) { + ret = -ENODEV; + goto out; + } + copy_block = kzalloc(sizeof(struct copy_block_struct), GFP_ATOMIC); + if (!copy_block) { + ret = -ENOMEM; + goto out; + } + init_waitqueue_head(©_block->wait); + kref_init(©_block->kref); + + ret = cmf_copy_block(cdev); + if (ret != -EBUSY) + goto out_put; + + if (cdev->private->state != DEV_STATE_ONLINE) { + ret = -EBUSY; + goto out_put; + } + + cdev->private->state = DEV_STATE_CMFUPDATE; + copy_block->ret = CMF_PENDING; + cdev->private->cmb_wait = copy_block; + + spin_unlock_irqrestore(cdev->ccwlock, flags); + if (wait_event_interruptible(copy_block->wait, + copy_block->ret != CMF_PENDING)) { + spin_lock_irqsave(cdev->ccwlock, flags); + if (copy_block->ret == CMF_PENDING) { + copy_block->ret = -ERESTARTSYS; + if (cdev->private->state == DEV_STATE_CMFUPDATE) + cdev->private->state = DEV_STATE_ONLINE; + } + spin_unlock_irqrestore(cdev->ccwlock, flags); + } + spin_lock_irqsave(cdev->ccwlock, flags); + cdev->private->cmb_wait = NULL; + ret = copy_block->ret; +out_put: + kref_put(©_block->kref, cmf_copy_block_release); +out: + spin_unlock_irqrestore(cdev->ccwlock, flags); + return ret; +} + +void cmf_retry_copy_block(struct ccw_device *cdev) +{ + struct copy_block_struct *copy_block; - s = cdev->private->cmb_wait; - cdev->private->cmb_wait = 0; - if (!s) { + copy_block = cdev->private->cmb_wait; + if (!copy_block) { WARN_ON(1); return; } - s->ret = set_schib(cdev, s->mme, s->mbfc, s->address); - wake_up(&s->wait); + kref_get(©_block->kref); + copy_block->ret = cmf_copy_block(cdev); + wake_up(©_block->wait); + kref_put(©_block->kref, cmf_copy_block_release); +} + +static void cmf_generic_reset(struct ccw_device *cdev) +{ + struct cmb_data *cmb_data; + + spin_lock_irq(cdev->ccwlock); + cmb_data = cdev->private->cmb; + if (cmb_data) { + memset(cmb_data->last_block, 0, cmb_data->size); + /* + * Need to reset hw block as well to make the hardware start + * from 0 again. + */ + memset(cmbops->align(cmb_data->hw_block), 0, cmb_data->size); + cmb_data->last_update = 0; + } + cdev->private->cmb_start_time = get_clock(); + spin_unlock_irq(cdev->ccwlock); } /** @@ -343,8 +519,8 @@ struct cmb { /* insert a single device into the cmb_area list * called with cmb_area.lock held from alloc_cmb */ -static inline int -alloc_cmb_single (struct ccw_device *cdev) +static inline int alloc_cmb_single (struct ccw_device *cdev, + struct cmb_data *cmb_data) { struct cmb *cmb; struct ccw_device_private *node; @@ -358,10 +534,12 @@ alloc_cmb_single (struct ccw_device *cdev) /* find first unused cmb in cmb_area.mem. * this is a little tricky: cmb_area.list - * remains sorted by ->cmb pointers */ + * remains sorted by ->cmb->hw_data pointers */ cmb = cmb_area.mem; list_for_each_entry(node, &cmb_area.list, cmb_list) { - if ((struct cmb*)node->cmb > cmb) + struct cmb_data *data; + data = node->cmb; + if ((struct cmb*)data->hw_block > cmb) break; cmb++; } @@ -372,7 +550,8 @@ alloc_cmb_single (struct ccw_device *cdev) /* insert new cmb */ list_add_tail(&cdev->private->cmb_list, &node->cmb_list); - cdev->private->cmb = cmb; + cmb_data->hw_block = cmb; + cdev->private->cmb = cmb_data; ret = 0; out: spin_unlock_irq(cdev->ccwlock); @@ -385,7 +564,19 @@ alloc_cmb (struct ccw_device *cdev) int ret; struct cmb *mem; ssize_t size; + struct cmb_data *cmb_data; + + /* Allocate private cmb_data. */ + cmb_data = kzalloc(sizeof(struct cmb_data), GFP_KERNEL); + if (!cmb_data) + return -ENOMEM; + cmb_data->last_block = kzalloc(sizeof(struct cmb), GFP_KERNEL); + if (!cmb_data->last_block) { + kfree(cmb_data); + return -ENOMEM; + } + cmb_data->size = sizeof(struct cmb); spin_lock(&cmb_area.lock); if (!cmb_area.mem) { @@ -414,29 +605,36 @@ alloc_cmb (struct ccw_device *cdev) } /* do the actual allocation */ - ret = alloc_cmb_single(cdev); + ret = alloc_cmb_single(cdev, cmb_data); out: spin_unlock(&cmb_area.lock); - + if (ret) { + kfree(cmb_data->last_block); + kfree(cmb_data); + } return ret; } -static void -free_cmb(struct ccw_device *cdev) +static void free_cmb(struct ccw_device *cdev) { struct ccw_device_private *priv; - - priv = cdev->private; + struct cmb_data *cmb_data; spin_lock(&cmb_area.lock); spin_lock_irq(cdev->ccwlock); + priv = cdev->private; + if (list_empty(&priv->cmb_list)) { /* already freed */ goto out; } + cmb_data = priv->cmb; priv->cmb = NULL; + if (cmb_data) + kfree(cmb_data->last_block); + kfree(cmb_data); list_del_init(&priv->cmb_list); if (list_empty(&cmb_area.list)) { @@ -451,83 +649,97 @@ out: spin_unlock(&cmb_area.lock); } -static int -set_cmb(struct ccw_device *cdev, u32 mme) +static int set_cmb(struct ccw_device *cdev, u32 mme) { u16 offset; + struct cmb_data *cmb_data; + unsigned long flags; - if (!cdev->private->cmb) + spin_lock_irqsave(cdev->ccwlock, flags); + if (!cdev->private->cmb) { + spin_unlock_irqrestore(cdev->ccwlock, flags); return -EINVAL; - - offset = mme ? (struct cmb *)cdev->private->cmb - cmb_area.mem : 0; + } + cmb_data = cdev->private->cmb; + offset = mme ? (struct cmb *)cmb_data->hw_block - cmb_area.mem : 0; + spin_unlock_irqrestore(cdev->ccwlock, flags); return set_schib_wait(cdev, mme, 0, offset); } -static u64 -read_cmb (struct ccw_device *cdev, int index) +static u64 read_cmb (struct ccw_device *cdev, int index) { - /* yes, we have to put it on the stack - * because the cmb must only be accessed - * atomically, e.g. with mvc */ - struct cmb cmb; - unsigned long flags; + struct cmb *cmb; u32 val; + int ret; + unsigned long flags; + + ret = cmf_cmb_copy_wait(cdev); + if (ret < 0) + return 0; spin_lock_irqsave(cdev->ccwlock, flags); if (!cdev->private->cmb) { - spin_unlock_irqrestore(cdev->ccwlock, flags); - return 0; + ret = 0; + goto out; } - - cmb = *(struct cmb*)cdev->private->cmb; - spin_unlock_irqrestore(cdev->ccwlock, flags); + cmb = ((struct cmb_data *)cdev->private->cmb)->last_block; switch (index) { case cmb_ssch_rsch_count: - return cmb.ssch_rsch_count; + ret = cmb->ssch_rsch_count; + goto out; case cmb_sample_count: - return cmb.sample_count; + ret = cmb->sample_count; + goto out; case cmb_device_connect_time: - val = cmb.device_connect_time; + val = cmb->device_connect_time; break; case cmb_function_pending_time: - val = cmb.function_pending_time; + val = cmb->function_pending_time; break; case cmb_device_disconnect_time: - val = cmb.device_disconnect_time; + val = cmb->device_disconnect_time; break; case cmb_control_unit_queuing_time: - val = cmb.control_unit_queuing_time; + val = cmb->control_unit_queuing_time; break; case cmb_device_active_only_time: - val = cmb.device_active_only_time; + val = cmb->device_active_only_time; break; default: - return 0; + ret = 0; + goto out; } - return time_to_avg_nsec(val, cmb.sample_count); + ret = time_to_avg_nsec(val, cmb->sample_count); +out: + spin_unlock_irqrestore(cdev->ccwlock, flags); + return ret; } -static int -readall_cmb (struct ccw_device *cdev, struct cmbdata *data) +static int readall_cmb (struct ccw_device *cdev, struct cmbdata *data) { - /* yes, we have to put it on the stack - * because the cmb must only be accessed - * atomically, e.g. with mvc */ - struct cmb cmb; - unsigned long flags; + struct cmb *cmb; + struct cmb_data *cmb_data; u64 time; + unsigned long flags; + int ret; + ret = cmf_cmb_copy_wait(cdev); + if (ret < 0) + return ret; spin_lock_irqsave(cdev->ccwlock, flags); - if (!cdev->private->cmb) { - spin_unlock_irqrestore(cdev->ccwlock, flags); - return -ENODEV; + cmb_data = cdev->private->cmb; + if (!cmb_data) { + ret = -ENODEV; + goto out; } - - cmb = *(struct cmb*)cdev->private->cmb; - time = get_clock() - cdev->private->cmb_start_time; - spin_unlock_irqrestore(cdev->ccwlock, flags); + if (cmb_data->last_update == 0) { + ret = -EAGAIN; + goto out; + } + cmb = cmb_data->last_block; + time = cmb_data->last_update - cdev->private->cmb_start_time; memset(data, 0, sizeof(struct cmbdata)); @@ -538,31 +750,32 @@ readall_cmb (struct ccw_device *cdev, struct cmbdata *data) data->elapsed_time = (time * 1000) >> 12; /* copy data to new structure */ - data->ssch_rsch_count = cmb.ssch_rsch_count; - data->sample_count = cmb.sample_count; + data->ssch_rsch_count = cmb->ssch_rsch_count; + data->sample_count = cmb->sample_count; /* time fields are converted to nanoseconds while copying */ - data->device_connect_time = time_to_nsec(cmb.device_connect_time); - data->function_pending_time = time_to_nsec(cmb.function_pending_time); - data->device_disconnect_time = time_to_nsec(cmb.device_disconnect_time); + data->device_connect_time = time_to_nsec(cmb->device_connect_time); + data->function_pending_time = time_to_nsec(cmb->function_pending_time); + data->device_disconnect_time = + time_to_nsec(cmb->device_disconnect_time); data->control_unit_queuing_time - = time_to_nsec(cmb.control_unit_queuing_time); + = time_to_nsec(cmb->control_unit_queuing_time); data->device_active_only_time - = time_to_nsec(cmb.device_active_only_time); + = time_to_nsec(cmb->device_active_only_time); + ret = 0; +out: + spin_unlock_irqrestore(cdev->ccwlock, flags); + return ret; +} - return 0; +static void reset_cmb(struct ccw_device *cdev) +{ + cmf_generic_reset(cdev); } -static void -reset_cmb(struct ccw_device *cdev) +static void * align_cmb(void *area) { - struct cmb *cmb; - spin_lock_irq(cdev->ccwlock); - cmb = cdev->private->cmb; - if (cmb) - memset (cmb, 0, sizeof (*cmb)); - cdev->private->cmb_start_time = get_clock(); - spin_unlock_irq(cdev->ccwlock); + return area; } static struct attribute_group cmf_attr_group; @@ -574,6 +787,7 @@ static struct cmb_operations cmbops_basic = { .read = read_cmb, .readall = readall_cmb, .reset = reset_cmb, + .align = align_cmb, .attr_group = &cmf_attr_group, }; @@ -610,22 +824,34 @@ static inline struct cmbe* cmbe_align(struct cmbe *c) return (struct cmbe*)addr; } -static int -alloc_cmbe (struct ccw_device *cdev) +static int alloc_cmbe (struct ccw_device *cdev) { struct cmbe *cmbe; - cmbe = kmalloc (sizeof (*cmbe) * 2, GFP_KERNEL); + struct cmb_data *cmb_data; + int ret; + + cmbe = kzalloc (sizeof (*cmbe) * 2, GFP_KERNEL); if (!cmbe) return -ENOMEM; - + cmb_data = kzalloc(sizeof(struct cmb_data), GFP_KERNEL); + if (!cmb_data) { + ret = -ENOMEM; + goto out_free; + } + cmb_data->last_block = kzalloc(sizeof(struct cmbe), GFP_KERNEL); + if (!cmb_data->last_block) { + ret = -ENOMEM; + goto out_free; + } + cmb_data->size = sizeof(struct cmbe); spin_lock_irq(cdev->ccwlock); if (cdev->private->cmb) { - kfree(cmbe); spin_unlock_irq(cdev->ccwlock); - return -EBUSY; + ret = -EBUSY; + goto out_free; } - - cdev->private->cmb = cmbe; + cmb_data->hw_block = cmbe; + cdev->private->cmb = cmb_data; spin_unlock_irq(cdev->ccwlock); /* activate global measurement if this is the first channel */ @@ -636,14 +862,24 @@ alloc_cmbe (struct ccw_device *cdev) spin_unlock(&cmb_area.lock); return 0; +out_free: + if (cmb_data) + kfree(cmb_data->last_block); + kfree(cmb_data); + kfree(cmbe); + return ret; } -static void -free_cmbe (struct ccw_device *cdev) +static void free_cmbe (struct ccw_device *cdev) { + struct cmb_data *cmb_data; + spin_lock_irq(cdev->ccwlock); - kfree(cdev->private->cmb); + cmb_data = cdev->private->cmb; cdev->private->cmb = NULL; + if (cmb_data) + kfree(cmb_data->last_block); + kfree(cmb_data); spin_unlock_irq(cdev->ccwlock); /* deactivate global measurement if this is the last channel */ @@ -654,89 +890,105 @@ free_cmbe (struct ccw_device *cdev) spin_unlock(&cmb_area.lock); } -static int -set_cmbe(struct ccw_device *cdev, u32 mme) +static int set_cmbe(struct ccw_device *cdev, u32 mme) { unsigned long mba; + struct cmb_data *cmb_data; + unsigned long flags; - if (!cdev->private->cmb) + spin_lock_irqsave(cdev->ccwlock, flags); + if (!cdev->private->cmb) { + spin_unlock_irqrestore(cdev->ccwlock, flags); return -EINVAL; - mba = mme ? (unsigned long) cmbe_align(cdev->private->cmb) : 0; + } + cmb_data = cdev->private->cmb; + mba = mme ? (unsigned long) cmbe_align(cmb_data->hw_block) : 0; + spin_unlock_irqrestore(cdev->ccwlock, flags); return set_schib_wait(cdev, mme, 1, mba); } -u64 -read_cmbe (struct ccw_device *cdev, int index) +static u64 read_cmbe (struct ccw_device *cdev, int index) { - /* yes, we have to put it on the stack - * because the cmb must only be accessed - * atomically, e.g. with mvc */ - struct cmbe cmb; - unsigned long flags; + struct cmbe *cmb; + struct cmb_data *cmb_data; u32 val; + int ret; + unsigned long flags; - spin_lock_irqsave(cdev->ccwlock, flags); - if (!cdev->private->cmb) { - spin_unlock_irqrestore(cdev->ccwlock, flags); + ret = cmf_cmb_copy_wait(cdev); + if (ret < 0) return 0; - } - cmb = *cmbe_align(cdev->private->cmb); - spin_unlock_irqrestore(cdev->ccwlock, flags); + spin_lock_irqsave(cdev->ccwlock, flags); + cmb_data = cdev->private->cmb; + if (!cmb_data) { + ret = 0; + goto out; + } + cmb = cmb_data->last_block; switch (index) { case cmb_ssch_rsch_count: - return cmb.ssch_rsch_count; + ret = cmb->ssch_rsch_count; + goto out; case cmb_sample_count: - return cmb.sample_count; + ret = cmb->sample_count; + goto out; case cmb_device_connect_time: - val = cmb.device_connect_time; + val = cmb->device_connect_time; break; case cmb_function_pending_time: - val = cmb.function_pending_time; + val = cmb->function_pending_time; break; case cmb_device_disconnect_time: - val = cmb.device_disconnect_time; + val = cmb->device_disconnect_time; break; case cmb_control_unit_queuing_time: - val = cmb.control_unit_queuing_time; + val = cmb->control_unit_queuing_time; break; case cmb_device_active_only_time: - val = cmb.device_active_only_time; + val = cmb->device_active_only_time; break; case cmb_device_busy_time: - val = cmb.device_busy_time; + val = cmb->device_busy_time; break; case cmb_initial_command_response_time: - val = cmb.initial_command_response_time; + val = cmb->initial_command_response_time; break; default: - return 0; + ret = 0; + goto out; } - return time_to_avg_nsec(val, cmb.sample_count); + ret = time_to_avg_nsec(val, cmb->sample_count); +out: + spin_unlock_irqrestore(cdev->ccwlock, flags); + return ret; } -static int -readall_cmbe (struct ccw_device *cdev, struct cmbdata *data) +static int readall_cmbe (struct ccw_device *cdev, struct cmbdata *data) { - /* yes, we have to put it on the stack - * because the cmb must only be accessed - * atomically, e.g. with mvc */ - struct cmbe cmb; - unsigned long flags; + struct cmbe *cmb; + struct cmb_data *cmb_data; u64 time; + unsigned long flags; + int ret; + ret = cmf_cmb_copy_wait(cdev); + if (ret < 0) + return ret; spin_lock_irqsave(cdev->ccwlock, flags); - if (!cdev->private->cmb) { - spin_unlock_irqrestore(cdev->ccwlock, flags); - return -ENODEV; + cmb_data = cdev->private->cmb; + if (!cmb_data) { + ret = -ENODEV; + goto out; } - - cmb = *cmbe_align(cdev->private->cmb); - time = get_clock() - cdev->private->cmb_start_time; - spin_unlock_irqrestore(cdev->ccwlock, flags); + if (cmb_data->last_update == 0) { + ret = -EAGAIN; + goto out; + } + time = cmb_data->last_update - cdev->private->cmb_start_time; memset (data, 0, sizeof(struct cmbdata)); @@ -746,35 +998,38 @@ readall_cmbe (struct ccw_device *cdev, struct cmbdata *data) /* conver to nanoseconds */ data->elapsed_time = (time * 1000) >> 12; + cmb = cmb_data->last_block; /* copy data to new structure */ - data->ssch_rsch_count = cmb.ssch_rsch_count; - data->sample_count = cmb.sample_count; + data->ssch_rsch_count = cmb->ssch_rsch_count; + data->sample_count = cmb->sample_count; /* time fields are converted to nanoseconds while copying */ - data->device_connect_time = time_to_nsec(cmb.device_connect_time); - data->function_pending_time = time_to_nsec(cmb.function_pending_time); - data->device_disconnect_time = time_to_nsec(cmb.device_disconnect_time); + data->device_connect_time = time_to_nsec(cmb->device_connect_time); + data->function_pending_time = time_to_nsec(cmb->function_pending_time); + data->device_disconnect_time = + time_to_nsec(cmb->device_disconnect_time); data->control_unit_queuing_time - = time_to_nsec(cmb.control_unit_queuing_time); + = time_to_nsec(cmb->control_unit_queuing_time); data->device_active_only_time - = time_to_nsec(cmb.device_active_only_time); - data->device_busy_time = time_to_nsec(cmb.device_busy_time); + = time_to_nsec(cmb->device_active_only_time); + data->device_busy_time = time_to_nsec(cmb->device_busy_time); data->initial_command_response_time - = time_to_nsec(cmb.initial_command_response_time); + = time_to_nsec(cmb->initial_command_response_time); - return 0; + ret = 0; +out: + spin_unlock_irqrestore(cdev->ccwlock, flags); + return ret; } -static void -reset_cmbe(struct ccw_device *cdev) +static void reset_cmbe(struct ccw_device *cdev) { - struct cmbe *cmb; - spin_lock_irq(cdev->ccwlock); - cmb = cmbe_align(cdev->private->cmb); - if (cmb) - memset (cmb, 0, sizeof (*cmb)); - cdev->private->cmb_start_time = get_clock(); - spin_unlock_irq(cdev->ccwlock); + cmf_generic_reset(cdev); +} + +static void * align_cmbe(void *area) +{ + return cmbe_align(area); } static struct attribute_group cmf_attr_group_ext; @@ -786,6 +1041,7 @@ static struct cmb_operations cmbops_extended = { .read = read_cmbe, .readall = readall_cmbe, .reset = reset_cmbe, + .align = align_cmbe, .attr_group = &cmf_attr_group_ext, }; @@ -803,14 +1059,20 @@ cmb_show_avg_sample_interval(struct device *dev, struct device_attribute *attr, struct ccw_device *cdev; long interval; unsigned long count; + struct cmb_data *cmb_data; cdev = to_ccwdev(dev); - interval = get_clock() - cdev->private->cmb_start_time; count = cmf_read(cdev, cmb_sample_count); - if (count) + spin_lock_irq(cdev->ccwlock); + cmb_data = cdev->private->cmb; + if (count) { + interval = cmb_data->last_update - + cdev->private->cmb_start_time; + interval = (interval * 1000) >> 12; interval /= count; - else + } else interval = -1; + spin_unlock_irq(cdev->ccwlock); return sprintf(buf, "%ld\n", interval); } @@ -823,7 +1085,10 @@ cmb_show_avg_utilization(struct device *dev, struct device_attribute *attr, char int ret; ret = cmf_readall(to_ccwdev(dev), &data); - if (ret) + if (ret == -EAGAIN || ret == -ENODEV) + /* No data (yet/currently) available to use for calculation. */ + return sprintf(buf, "n/a\n"); + else if (ret) return ret; utilization = data.device_connect_time + @@ -876,7 +1141,7 @@ static struct attribute *cmf_attributes[] = { &dev_attr_avg_device_disconnect_time.attr, &dev_attr_avg_control_unit_queuing_time.attr, &dev_attr_avg_device_active_only_time.attr, - 0, + NULL, }; static struct attribute_group cmf_attr_group = { @@ -896,7 +1161,7 @@ static struct attribute *cmf_attributes_ext[] = { &dev_attr_avg_device_active_only_time.attr, &dev_attr_avg_device_busy_time.attr, &dev_attr_avg_initial_command_response_time.attr, - 0, + NULL, }; static struct attribute_group cmf_attr_group_ext = { @@ -982,6 +1247,13 @@ cmf_readall(struct ccw_device *cdev, struct cmbdata *data) return cmbops->readall(cdev, data); } +/* Reenable cmf when a disconnected device becomes available again. */ +int cmf_reenable(struct ccw_device *cdev) +{ + cmbops->reset(cdev); + return cmbops->set(cdev, 2); +} + static int __init init_cmf(void) { diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c index 74ea8aac4..13eeea3d5 100644 --- a/drivers/s390/cio/css.c +++ b/drivers/s390/cio/css.c @@ -19,9 +19,11 @@ #include "cio_debug.h" #include "ioasm.h" #include "chsc.h" +#include "device.h" int need_rescan = 0; int css_init_done = 0; +static int need_reprobe = 0; static int max_ssid = 0; struct channel_subsystem *css[__MAX_CSSID + 1]; @@ -106,6 +108,24 @@ css_subchannel_release(struct device *dev) extern int css_get_ssd_info(struct subchannel *sch); + +int css_sch_device_register(struct subchannel *sch) +{ + int ret; + + mutex_lock(&sch->reg_mutex); + ret = device_register(&sch->dev); + mutex_unlock(&sch->reg_mutex); + return ret; +} + +void css_sch_device_unregister(struct subchannel *sch) +{ + mutex_lock(&sch->reg_mutex); + device_unregister(&sch->dev); + mutex_unlock(&sch->reg_mutex); +} + static int css_register_subchannel(struct subchannel *sch) { @@ -117,7 +137,7 @@ css_register_subchannel(struct subchannel *sch) sch->dev.release = &css_subchannel_release; /* make it known to the system */ - ret = device_register(&sch->dev); + ret = css_sch_device_register(sch); if (ret) printk (KERN_WARNING "%s: could not register %s\n", __func__, sch->dev.bus_id); @@ -248,7 +268,7 @@ css_evaluate_subchannel(struct subchannel_id schid, int slow) * The device will be killed automatically. */ cio_disable_subchannel(sch); - device_unregister(&sch->dev); + css_sch_device_unregister(sch); /* Reset intparm to zeroes. */ sch->schib.pmcw.intparm = 0; cio_modify(sch); @@ -262,7 +282,7 @@ css_evaluate_subchannel(struct subchannel_id schid, int slow) * away in any case. */ if (!disc) { - device_unregister(&sch->dev); + css_sch_device_unregister(sch); /* Reset intparm to zeroes. */ sch->schib.pmcw.intparm = 0; cio_modify(sch); @@ -339,6 +359,67 @@ typedef void (*workfunc)(void *); DECLARE_WORK(slow_path_work, (workfunc)css_trigger_slow_path, NULL); struct workqueue_struct *slow_path_wq; +/* Reprobe subchannel if unregistered. */ +static int reprobe_subchannel(struct subchannel_id schid, void *data) +{ + struct subchannel *sch; + int ret; + + CIO_DEBUG(KERN_INFO, 6, "cio: reprobe 0.%x.%04x\n", + schid.ssid, schid.sch_no); + if (need_reprobe) + return -EAGAIN; + + sch = get_subchannel_by_schid(schid); + if (sch) { + /* Already known. */ + put_device(&sch->dev); + return 0; + } + + ret = css_probe_device(schid); + switch (ret) { + case 0: + break; + case -ENXIO: + case -ENOMEM: + /* These should abort looping */ + break; + default: + ret = 0; + } + + return ret; +} + +/* Work function used to reprobe all unregistered subchannels. */ +static void reprobe_all(void *data) +{ + int ret; + + CIO_MSG_EVENT(2, "reprobe start\n"); + + need_reprobe = 0; + /* Make sure initial subchannel scan is done. */ + wait_event(ccw_device_init_wq, + atomic_read(&ccw_device_init_count) == 0); + ret = for_each_subchannel(reprobe_subchannel, NULL); + + CIO_MSG_EVENT(2, "reprobe done (rc=%d, need_reprobe=%d)\n", ret, + need_reprobe); +} + +DECLARE_WORK(css_reprobe_work, reprobe_all, NULL); + +/* Schedule reprobing of all unregistered subchannels. */ +void css_schedule_reprobe(void) +{ + need_reprobe = 1; + queue_work(ccw_device_work, &css_reprobe_work); +} + +EXPORT_SYMBOL_GPL(css_schedule_reprobe); + /* * Rescan for new devices. FIXME: This is slow. * This function is called when we have lost CRWs due to overflows and we have @@ -542,9 +623,13 @@ init_channel_subsystem (void) ret = device_register(&css[i]->device); if (ret) goto out_free; - if (css_characteristics_avail && css_chsc_characteristics.secm) - device_create_file(&css[i]->device, - &dev_attr_cm_enable); + if (css_characteristics_avail && + css_chsc_characteristics.secm) { + ret = device_create_file(&css[i]->device, + &dev_attr_cm_enable); + if (ret) + goto out_device; + } } css_init_done = 1; @@ -552,6 +637,8 @@ init_channel_subsystem (void) for_each_subchannel(__init_channel_subsystem, NULL); return 0; +out_device: + device_unregister(&css[i]->device); out_free: kfree(css[i]); out_unregister: diff --git a/drivers/s390/cio/css.h b/drivers/s390/cio/css.h index e210f89a2..8aabb4ade 100644 --- a/drivers/s390/cio/css.h +++ b/drivers/s390/cio/css.h @@ -100,7 +100,7 @@ struct ccw_device_private { struct qdio_irq *qdio_data; struct irb irb; /* device status */ struct senseid senseid; /* SenseID info */ - struct pgid pgid; /* path group ID */ + struct pgid pgid[8]; /* path group IDs per chpid*/ struct ccw1 iccws[2]; /* ccws for SNID/SID/SPGID commands */ struct work_struct kick_work; wait_queue_head_t wait_q; @@ -136,6 +136,8 @@ extern struct bus_type css_bus_type; extern struct css_driver io_subchannel_driver; extern int css_probe_device(struct subchannel_id); +extern int css_sch_device_register(struct subchannel *); +extern void css_sch_device_unregister(struct subchannel *); extern struct subchannel * get_subchannel_by_schid(struct subchannel_id); extern int css_init_done; extern int for_each_subchannel(int(*fn)(struct subchannel_id, void *), void *); diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index 8e3053c2a..646da5640 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c @@ -8,7 +8,6 @@ * Cornelia Huck (cornelia.huck@de.ibm.com) * Martin Schwidefsky (schwidefsky@de.ibm.com) */ -#include #include #include #include @@ -101,7 +100,7 @@ ccw_uevent (struct device *dev, char **envp, int num_envp, if ((buffer_size - length <= 0) || (i >= num_envp)) return -ENOMEM; - envp[i] = 0; + envp[i] = NULL; return 0; } @@ -133,8 +132,8 @@ struct css_driver io_subchannel_driver = { struct workqueue_struct *ccw_device_work; struct workqueue_struct *ccw_device_notify_work; -static wait_queue_head_t ccw_device_init_wq; -static atomic_t ccw_device_init_count; +wait_queue_head_t ccw_device_init_wq; +atomic_t ccw_device_init_count; static int __init init_ccw_bus_type (void) @@ -281,7 +280,7 @@ ccw_device_remove_disconnected(struct ccw_device *cdev) * 'throw away device'. */ sch = to_subchannel(cdev->dev.parent); - device_unregister(&sch->dev); + css_sch_device_unregister(sch); /* Reset intparm to zeroes. */ sch->schib.pmcw.intparm = 0; cio_modify(sch); @@ -557,12 +556,11 @@ get_disc_ccwdev_by_devno(unsigned int devno, unsigned int ssid, struct ccw_device *sibling) { struct device *dev; - struct match_data data = { - .devno = devno, - .ssid = ssid, - .sibling = sibling, - }; + struct match_data data; + data.devno = devno; + data.ssid = ssid; + data.sibling = sibling; dev = bus_find_device(&ccw_bus_type, NULL, &data, match_devno); return dev ? to_ccwdev(dev) : NULL; @@ -626,7 +624,7 @@ ccw_device_do_unreg_rereg(void *data) other_sch->schib.pmcw.intparm = 0; cio_modify(other_sch); } - device_unregister(&other_sch->dev); + css_sch_device_unregister(other_sch); } } /* Update ssd info here. */ @@ -710,7 +708,7 @@ ccw_device_call_sch_unregister(void *data) struct subchannel *sch; sch = to_subchannel(cdev->dev.parent); - device_unregister(&sch->dev); + css_sch_device_unregister(sch); /* Reset intparm to zeroes. */ sch->schib.pmcw.intparm = 0; cio_modify(sch); @@ -836,10 +834,8 @@ io_subchannel_probe (struct subchannel *sch) return -ENOMEM; } atomic_set(&cdev->private->onoff, 0); - cdev->dev = (struct device) { - .parent = &sch->dev, - .release = ccw_device_release, - }; + cdev->dev.parent = &sch->dev; + cdev->dev.release = ccw_device_release; INIT_LIST_HEAD(&cdev->private->kick_work.entry); /* Do first half of device_register. */ device_initialize(&cdev->dev); @@ -978,9 +974,7 @@ ccw_device_console_enable (struct ccw_device *cdev, struct subchannel *sch) int rc; /* Initialize the ccw_device structure. */ - cdev->dev = (struct device) { - .parent = &sch->dev, - }; + cdev->dev.parent= &sch->dev; rc = io_subchannel_recog(cdev, sch); if (rc) return rc; @@ -1058,7 +1052,7 @@ get_ccwdev_by_busid(struct ccw_driver *cdrv, const char *bus_id) __ccwdev_check_busid); put_driver(drv); - return dev ? to_ccwdev(dev) : 0; + return dev ? to_ccwdev(dev) : NULL; } /************************** device driver handling ************************/ @@ -1083,7 +1077,7 @@ ccw_device_probe (struct device *dev) ret = cdrv->probe ? cdrv->probe(cdev) : -ENODEV; if (ret) { - cdev->drv = 0; + cdev->drv = NULL; return ret; } @@ -1114,7 +1108,7 @@ ccw_device_remove (struct device *dev) ret, cdev->dev.bus_id); } ccw_device_set_timeout(cdev, 0); - cdev->drv = 0; + cdev->drv = NULL; return 0; } diff --git a/drivers/s390/cio/device.h b/drivers/s390/cio/device.h index 11587ebb7..00be9a5b4 100644 --- a/drivers/s390/cio/device.h +++ b/drivers/s390/cio/device.h @@ -1,6 +1,10 @@ #ifndef S390_DEVICE_H #define S390_DEVICE_H +#include +#include +#include + /* * states of the device statemachine */ @@ -23,6 +27,7 @@ enum dev_state { DEV_STATE_DISCONNECTED, DEV_STATE_DISCONNECTED_SENSE_ID, DEV_STATE_CMFCHANGE, + DEV_STATE_CMFUPDATE, /* last element! */ NR_DEV_STATES }; @@ -67,6 +72,8 @@ dev_fsm_final_state(struct ccw_device *cdev) extern struct workqueue_struct *ccw_device_work; extern struct workqueue_struct *ccw_device_notify_work; +extern wait_queue_head_t ccw_device_init_wq; +extern atomic_t ccw_device_init_count; void io_subchannel_recog_done(struct ccw_device *cdev); @@ -112,5 +119,8 @@ int ccw_device_stlck(struct ccw_device *); void ccw_device_set_timeout(struct ccw_device *, int); extern struct subchannel_id ccw_device_get_subchannel_id(struct ccw_device *); +/* Channel measurement facility related */ void retry_set_schib(struct ccw_device *cdev); +void cmf_retry_copy_block(struct ccw_device *); +int cmf_reenable(struct ccw_device *); #endif diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c index 49ec562d7..35e162ba6 100644 --- a/drivers/s390/cio/device_fsm.c +++ b/drivers/s390/cio/device_fsm.c @@ -9,7 +9,6 @@ */ #include -#include #include #include #include @@ -153,7 +152,8 @@ ccw_device_cancel_halt_clear(struct ccw_device *cdev) if (cdev->private->iretry) { cdev->private->iretry--; ret = cio_halt(sch); - return (ret == 0) ? -EBUSY : ret; + if (ret != -EBUSY) + return (ret == 0) ? -EBUSY : ret; } /* halt io unsuccessful. */ cdev->private->iretry = 255; /* 255 clear retries. */ @@ -267,12 +267,10 @@ ccw_device_recog_done(struct ccw_device *cdev, int state) notify = 1; } /* fill out sense information */ - cdev->id = (struct ccw_device_id) { - .cu_type = cdev->private->senseid.cu_type, - .cu_model = cdev->private->senseid.cu_model, - .dev_type = cdev->private->senseid.dev_type, - .dev_model = cdev->private->senseid.dev_model, - }; + cdev->id.cu_type = cdev->private->senseid.cu_type; + cdev->id.cu_model = cdev->private->senseid.cu_model; + cdev->id.dev_type = cdev->private->senseid.dev_type; + cdev->id.dev_model = cdev->private->senseid.dev_model; if (notify) { cdev->private->state = DEV_STATE_OFFLINE; if (same_dev) { @@ -336,8 +334,11 @@ ccw_device_oper_notify(void *data) if (!ret) /* Driver doesn't want device back. */ ccw_device_do_unreg_rereg((void *)cdev); - else + else { + /* Reenable channel measurements, if needed. */ + cmf_reenable(cdev); wake_up(&cdev->private->wait_q); + } } /* @@ -376,6 +377,56 @@ ccw_device_done(struct ccw_device *cdev, int state) put_device (&cdev->dev); } +static inline int cmp_pgid(struct pgid *p1, struct pgid *p2) +{ + char *c1; + char *c2; + + c1 = (char *)p1; + c2 = (char *)p2; + + return memcmp(c1 + 1, c2 + 1, sizeof(struct pgid) - 1); +} + +static void __ccw_device_get_common_pgid(struct ccw_device *cdev) +{ + int i; + int last; + + last = 0; + for (i = 0; i < 8; i++) { + if (cdev->private->pgid[i].inf.ps.state1 == SNID_STATE1_RESET) + /* No PGID yet */ + continue; + if (cdev->private->pgid[last].inf.ps.state1 == + SNID_STATE1_RESET) { + /* First non-zero PGID */ + last = i; + continue; + } + if (cmp_pgid(&cdev->private->pgid[i], + &cdev->private->pgid[last]) == 0) + /* Non-conflicting PGIDs */ + continue; + + /* PGID mismatch, can't pathgroup. */ + CIO_MSG_EVENT(0, "SNID - pgid mismatch for device " + "0.%x.%04x, can't pathgroup\n", + cdev->private->ssid, cdev->private->devno); + cdev->private->options.pgroup = 0; + return; + } + if (cdev->private->pgid[last].inf.ps.state1 == + SNID_STATE1_RESET) + /* No previous pgid found */ + memcpy(&cdev->private->pgid[0], &css[0]->global_pgid, + sizeof(struct pgid)); + else + /* Use existing pgid */ + memcpy(&cdev->private->pgid[0], &cdev->private->pgid[last], + sizeof(struct pgid)); +} + /* * Function called from device_pgid.c after sense path ground has completed. */ @@ -386,24 +437,26 @@ ccw_device_sense_pgid_done(struct ccw_device *cdev, int err) sch = to_subchannel(cdev->dev.parent); switch (err) { - case 0: - /* Start Path Group verification. */ - sch->vpm = 0; /* Start with no path groups set. */ - cdev->private->state = DEV_STATE_VERIFY; - ccw_device_verify_start(cdev); + case -EOPNOTSUPP: /* path grouping not supported, use nop instead. */ + cdev->private->options.pgroup = 0; + break; + case 0: /* success */ + case -EACCES: /* partial success, some paths not operational */ + /* Check if all pgids are equal or 0. */ + __ccw_device_get_common_pgid(cdev); break; case -ETIME: /* Sense path group id stopped by timeout. */ case -EUSERS: /* device is reserved for someone else. */ ccw_device_done(cdev, DEV_STATE_BOXED); - break; - case -EOPNOTSUPP: /* path grouping not supported, just set online. */ - cdev->private->options.pgroup = 0; - ccw_device_done(cdev, DEV_STATE_ONLINE); - break; + return; default: ccw_device_done(cdev, DEV_STATE_NOT_OPER); - break; + return; } + /* Start Path Group verification. */ + sch->vpm = 0; /* Start with no path groups set. */ + cdev->private->state = DEV_STATE_VERIFY; + ccw_device_verify_start(cdev); } /* @@ -511,12 +564,10 @@ ccw_device_verify_done(struct ccw_device *cdev, int err) /* Deliver fake irb to device driver, if needed. */ if (cdev->private->flags.fake_irb) { memset(&cdev->private->irb, 0, sizeof(struct irb)); - cdev->private->irb.scsw = (struct scsw) { - .cc = 1, - .fctl = SCSW_FCTL_START_FUNC, - .actl = SCSW_ACTL_START_PEND, - .stctl = SCSW_STCTL_STATUS_PEND, - }; + cdev->private->irb.scsw.cc = 1; + cdev->private->irb.scsw.fctl = SCSW_FCTL_START_FUNC; + cdev->private->irb.scsw.actl = SCSW_ACTL_START_PEND; + cdev->private->irb.scsw.stctl = SCSW_STCTL_STATUS_PEND; cdev->private->flags.fake_irb = 0; if (cdev->handler) cdev->handler(cdev, cdev->private->intparm, @@ -560,8 +611,9 @@ ccw_device_online(struct ccw_device *cdev) } /* Do we want to do path grouping? */ if (!cdev->private->options.pgroup) { - /* No, set state online immediately. */ - ccw_device_done(cdev, DEV_STATE_ONLINE); + /* Start initial path verification. */ + cdev->private->state = DEV_STATE_VERIFY; + ccw_device_verify_start(cdev); return 0; } /* Do a SensePGID first. */ @@ -607,6 +659,7 @@ ccw_device_offline(struct ccw_device *cdev) /* Are we doing path grouping? */ if (!cdev->private->options.pgroup) { /* No, set state offline immediately. */ + sch->vpm = 0; ccw_device_done(cdev, DEV_STATE_OFFLINE); return 0; } @@ -703,8 +756,6 @@ ccw_device_online_verify(struct ccw_device *cdev, enum dev_event dev_event) { struct subchannel *sch; - if (!cdev->private->options.pgroup) - return; if (cdev->private->state == DEV_STATE_W4SENSE) { cdev->private->flags.doverify = 1; return; @@ -717,6 +768,7 @@ ccw_device_online_verify(struct ccw_device *cdev, enum dev_event dev_event) stsch(sch->schid, &sch->schib); if (sch->schib.scsw.actl != 0 || + (sch->schib.scsw.stctl & SCSW_STCTL_STATUS_PEND) || (cdev->private->irb.scsw.stctl & SCSW_STCTL_STATUS_PEND)) { /* * No final status yet or final status not yet delivered @@ -861,6 +913,8 @@ ccw_device_clear_verify(struct ccw_device *cdev, enum dev_event dev_event) irb = (struct irb *) __LC_IRB; /* Accumulate status. We don't do basic sense. */ ccw_device_accumulate_irb(cdev, irb); + /* Remember to clear irb to avoid residuals. */ + memset(&cdev->private->irb, 0, sizeof(struct irb)); /* Try to start delayed device verification. */ ccw_device_online_verify(cdev, 0); /* Note: Don't call handler for cio initiated clear! */ @@ -991,8 +1045,7 @@ static void ccw_device_wait4io_verify(struct ccw_device *cdev, enum dev_event dev_event) { /* When the I/O has terminated, we have to start verification. */ - if (cdev->private->options.pgroup) - cdev->private->flags.doverify = 1; + cdev->private->flags.doverify = 1; } static void @@ -1093,6 +1146,13 @@ ccw_device_change_cmfstate(struct ccw_device *cdev, enum dev_event dev_event) dev_fsm_event(cdev, dev_event); } +static void ccw_device_update_cmfblock(struct ccw_device *cdev, + enum dev_event dev_event) +{ + cmf_retry_copy_block(cdev); + cdev->private->state = DEV_STATE_ONLINE; + dev_fsm_event(cdev, dev_event); +} static void ccw_device_quiesce_done(struct ccw_device *cdev, enum dev_event dev_event) @@ -1247,6 +1307,12 @@ fsm_func_t *dev_jumptable[NR_DEV_STATES][NR_DEV_EVENTS] = { [DEV_EVENT_TIMEOUT] = ccw_device_change_cmfstate, [DEV_EVENT_VERIFY] = ccw_device_change_cmfstate, }, + [DEV_STATE_CMFUPDATE] = { + [DEV_EVENT_NOTOPER] = ccw_device_update_cmfblock, + [DEV_EVENT_INTERRUPT] = ccw_device_update_cmfblock, + [DEV_EVENT_TIMEOUT] = ccw_device_update_cmfblock, + [DEV_EVENT_VERIFY] = ccw_device_update_cmfblock, + }, }; /* diff --git a/drivers/s390/cio/device_id.c b/drivers/s390/cio/device_id.c index e60b2d810..438db4830 100644 --- a/drivers/s390/cio/device_id.c +++ b/drivers/s390/cio/device_id.c @@ -10,7 +10,6 @@ */ #include -#include #include #include diff --git a/drivers/s390/cio/device_ops.c b/drivers/s390/cio/device_ops.c index 795abb5a6..9e3de0bd5 100644 --- a/drivers/s390/cio/device_ops.c +++ b/drivers/s390/cio/device_ops.c @@ -6,7 +6,6 @@ * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com) * Cornelia Huck (cornelia.huck@de.ibm.com) */ -#include #include #include #include @@ -78,7 +77,8 @@ ccw_device_start_key(struct ccw_device *cdev, struct ccw1 *cpa, return -ENODEV; if (cdev->private->state == DEV_STATE_NOT_OPER) return -ENODEV; - if (cdev->private->state == DEV_STATE_VERIFY) { + if (cdev->private->state == DEV_STATE_VERIFY || + cdev->private->state == DEV_STATE_CLEAR_VERIFY) { /* Remember to fake irb when finished. */ if (!cdev->private->flags.fake_irb) { cdev->private->flags.fake_irb = 1; @@ -263,6 +263,9 @@ ccw_device_wake_up(struct ccw_device *cdev, unsigned long ip, struct irb *irb) /* Abuse intparm for error reporting. */ if (IS_ERR(irb)) cdev->private->intparm = -EIO; + else if (irb->scsw.cc == 1) + /* Retry for deferred condition code. */ + cdev->private->intparm = -EAGAIN; else if ((irb->scsw.dstat != (DEV_STAT_CHN_END|DEV_STAT_DEV_END)) || (irb->scsw.cstat != 0)) { @@ -270,7 +273,8 @@ ccw_device_wake_up(struct ccw_device *cdev, unsigned long ip, struct irb *irb) * We didn't get channel end / device end. Check if path * verification has been started; we can retry after it has * finished. We also retry unit checks except for command reject - * or intervention required. + * or intervention required. Also check for long busy + * conditions. */ if (cdev->private->flags.doverify || cdev->private->state == DEV_STATE_VERIFY) @@ -279,6 +283,10 @@ ccw_device_wake_up(struct ccw_device *cdev, unsigned long ip, struct irb *irb) !(irb->ecw[0] & (SNS0_CMD_REJECT | SNS0_INTERVENTION_REQ))) cdev->private->intparm = -EAGAIN; + else if ((irb->scsw.dstat & DEV_STAT_ATTENTION) && + (irb->scsw.dstat & DEV_STAT_DEV_END) && + (irb->scsw.dstat & DEV_STAT_UNIT_EXCEP)) + cdev->private->intparm = -EAGAIN; else cdev->private->intparm = -EIO; diff --git a/drivers/s390/cio/device_pgid.c b/drivers/s390/cio/device_pgid.c index 85b1020a1..1693a102d 100644 --- a/drivers/s390/cio/device_pgid.c +++ b/drivers/s390/cio/device_pgid.c @@ -9,7 +9,6 @@ * Path Group ID functions. */ -#include #include #include @@ -24,6 +23,21 @@ #include "device.h" #include "ioasm.h" +/* + * Helper function called from interrupt context to decide whether an + * operation should be tried again. + */ +static int __ccw_device_should_retry(struct scsw *scsw) +{ + /* CC is only valid if start function bit is set. */ + if ((scsw->fctl & SCSW_FCTL_START_FUNC) && scsw->cc == 1) + return 1; + /* No more activity. For sense and set PGID we stubbornly try again. */ + if (!scsw->actl) + return 1; + return 0; +} + /* * Start Sense Path Group ID helper function. Used in ccw_device_recog * and ccw_device_sense_pgid. @@ -34,12 +48,17 @@ __ccw_device_sense_pgid_start(struct ccw_device *cdev) struct subchannel *sch; struct ccw1 *ccw; int ret; + int i; sch = to_subchannel(cdev->dev.parent); + /* Return if we already checked on all paths. */ + if (cdev->private->imask == 0) + return (sch->lpm == 0) ? -ENODEV : -EACCES; + i = 8 - ffs(cdev->private->imask); + /* Setup sense path group id channel program. */ ccw = cdev->private->iccws; ccw->cmd_code = CCW_CMD_SENSE_PGID; - ccw->cda = (__u32) __pa (&cdev->private->pgid); ccw->count = sizeof (struct pgid); ccw->flags = CCW_FLAG_SLI; @@ -49,6 +68,7 @@ __ccw_device_sense_pgid_start(struct ccw_device *cdev) ret = -ENODEV; while (cdev->private->imask != 0) { /* Try every path multiple times. */ + ccw->cda = (__u32) __pa (&cdev->private->pgid[i]); if (cdev->private->iretry > 0) { cdev->private->iretry--; ret = cio_start (sch, cdev->private->iccws, @@ -65,7 +85,9 @@ __ccw_device_sense_pgid_start(struct ccw_device *cdev) } cdev->private->imask >>= 1; cdev->private->iretry = 5; + i++; } + return ret; } @@ -77,7 +99,7 @@ ccw_device_sense_pgid_start(struct ccw_device *cdev) cdev->private->state = DEV_STATE_SENSE_PGID; cdev->private->imask = 0x80; cdev->private->iretry = 5; - memset (&cdev->private->pgid, 0, sizeof (struct pgid)); + memset (&cdev->private->pgid, 0, sizeof (cdev->private->pgid)); ret = __ccw_device_sense_pgid_start(cdev); if (ret && ret != -EBUSY) ccw_device_sense_pgid_done(cdev, ret); @@ -92,6 +114,7 @@ __ccw_device_check_sense_pgid(struct ccw_device *cdev) { struct subchannel *sch; struct irb *irb; + int i; sch = to_subchannel(cdev->dev.parent); irb = &cdev->private->irb; @@ -125,7 +148,8 @@ __ccw_device_check_sense_pgid(struct ccw_device *cdev) sch->schid.sch_no, sch->orb.lpm); return -EACCES; } - if (cdev->private->pgid.inf.ps.state2 == SNID_STATE2_RESVD_ELSE) { + i = 8 - ffs(cdev->private->imask); + if (cdev->private->pgid[i].inf.ps.state2 == SNID_STATE2_RESVD_ELSE) { CIO_MSG_EVENT(2, "SNID - Device %04x on Subchannel 0.%x.%04x " "is reserved by someone else\n", cdev->private->devno, sch->schid.ssid, @@ -146,10 +170,10 @@ ccw_device_sense_pgid_irq(struct ccw_device *cdev, enum dev_event dev_event) int ret; irb = (struct irb *) __LC_IRB; - /* Retry sense pgid for cc=1. */ + if (irb->scsw.stctl == (SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS)) { - if (irb->scsw.cc == 1) { + if (__ccw_device_should_retry(&irb->scsw)) { ret = __ccw_device_sense_pgid_start(cdev); if (ret && ret != -EBUSY) ccw_device_sense_pgid_done(cdev, ret); @@ -163,12 +187,6 @@ ccw_device_sense_pgid_irq(struct ccw_device *cdev, enum dev_event dev_event) memset(&cdev->private->irb, 0, sizeof(struct irb)); switch (ret) { /* 0, -ETIME, -EOPNOTSUPP, -EAGAIN, -EACCES or -EUSERS */ - case 0: /* Sense Path Group ID successful. */ - if (cdev->private->pgid.inf.ps.state1 == SNID_STATE1_RESET) - memcpy(&cdev->private->pgid, &css[0]->global_pgid, - sizeof(struct pgid)); - ccw_device_sense_pgid_done(cdev, 0); - break; case -EOPNOTSUPP: /* Sense Path Group ID not supported */ ccw_device_sense_pgid_done(cdev, -EOPNOTSUPP); break; @@ -177,13 +195,15 @@ ccw_device_sense_pgid_irq(struct ccw_device *cdev, enum dev_event dev_event) break; case -EACCES: /* channel is not operational. */ sch->lpm &= ~cdev->private->imask; + /* Fall through. */ + case 0: /* Sense Path Group ID successful. */ cdev->private->imask >>= 1; cdev->private->iretry = 5; /* Fall through. */ case -EAGAIN: /* Try again. */ ret = __ccw_device_sense_pgid_start(cdev); if (ret != 0 && ret != -EBUSY) - ccw_device_sense_pgid_done(cdev, -ENODEV); + ccw_device_sense_pgid_done(cdev, ret); break; case -EUSERS: /* device is reserved for someone else. */ ccw_device_sense_pgid_done(cdev, -EUSERS); @@ -204,20 +224,20 @@ __ccw_device_do_pgid(struct ccw_device *cdev, __u8 func) sch = to_subchannel(cdev->dev.parent); /* Setup sense path group id channel program. */ - cdev->private->pgid.inf.fc = func; + cdev->private->pgid[0].inf.fc = func; ccw = cdev->private->iccws; if (!cdev->private->flags.pgid_single) { - cdev->private->pgid.inf.fc |= SPID_FUNC_MULTI_PATH; + cdev->private->pgid[0].inf.fc |= SPID_FUNC_MULTI_PATH; ccw->cmd_code = CCW_CMD_SUSPEND_RECONN; ccw->cda = 0; ccw->count = 0; ccw->flags = CCW_FLAG_SLI | CCW_FLAG_CC; ccw++; } else - cdev->private->pgid.inf.fc |= SPID_FUNC_SINGLE_PATH; + cdev->private->pgid[0].inf.fc |= SPID_FUNC_SINGLE_PATH; ccw->cmd_code = CCW_CMD_SET_PGID; - ccw->cda = (__u32) __pa (&cdev->private->pgid); + ccw->cda = (__u32) __pa (&cdev->private->pgid[0]); ccw->count = sizeof (struct pgid); ccw->flags = CCW_FLAG_SLI; @@ -244,6 +264,48 @@ __ccw_device_do_pgid(struct ccw_device *cdev, __u8 func) return ret; } +/* + * Helper function to send a nop ccw down a path. + */ +static int __ccw_device_do_nop(struct ccw_device *cdev) +{ + struct subchannel *sch; + struct ccw1 *ccw; + int ret; + + sch = to_subchannel(cdev->dev.parent); + + /* Setup nop channel program. */ + ccw = cdev->private->iccws; + ccw->cmd_code = CCW_CMD_NOOP; + ccw->cda = 0; + ccw->count = 0; + ccw->flags = CCW_FLAG_SLI; + + /* Reset device status. */ + memset(&cdev->private->irb, 0, sizeof(struct irb)); + + /* Try multiple times. */ + ret = -ENODEV; + if (cdev->private->iretry > 0) { + cdev->private->iretry--; + ret = cio_start (sch, cdev->private->iccws, + cdev->private->imask); + /* ret is 0, -EBUSY, -EACCES or -ENODEV */ + if ((ret != -EACCES) && (ret != -ENODEV)) + return ret; + } + /* nop command failed on this path. Switch it off. */ + sch->lpm &= ~cdev->private->imask; + sch->vpm &= ~cdev->private->imask; + CIO_MSG_EVENT(2, "NOP - Device %04x on Subchannel " + "0.%x.%04x, lpm %02X, became 'not operational'\n", + cdev->private->devno, sch->schid.ssid, + sch->schid.sch_no, cdev->private->imask); + return ret; +} + + /* * Called from interrupt context to check if a valid answer * to Set Path Group ID was received. @@ -283,6 +345,29 @@ __ccw_device_check_pgid(struct ccw_device *cdev) return 0; } +/* + * Called from interrupt context to check the path status after a nop has + * been send. + */ +static int __ccw_device_check_nop(struct ccw_device *cdev) +{ + struct subchannel *sch; + struct irb *irb; + + sch = to_subchannel(cdev->dev.parent); + irb = &cdev->private->irb; + if (irb->scsw.fctl & (SCSW_FCTL_HALT_FUNC | SCSW_FCTL_CLEAR_FUNC)) + return -ETIME; + if (irb->scsw.cc == 3) { + CIO_MSG_EVENT(2, "NOP - Device %04x on Subchannel 0.%x.%04x," + " lpm %02X, became 'not operational'\n", + cdev->private->devno, sch->schid.ssid, + sch->schid.sch_no, cdev->private->imask); + return -EACCES; + } + return 0; +} + static void __ccw_device_verify_start(struct ccw_device *cdev) { @@ -297,9 +382,12 @@ __ccw_device_verify_start(struct ccw_device *cdev) if ((sch->vpm & imask) != (sch->lpm & imask)) break; cdev->private->imask = imask; - func = (sch->vpm & imask) ? - SPID_FUNC_RESIGN : SPID_FUNC_ESTABLISH; - ret = __ccw_device_do_pgid(cdev, func); + if (cdev->private->options.pgroup) { + func = (sch->vpm & imask) ? + SPID_FUNC_RESIGN : SPID_FUNC_ESTABLISH; + ret = __ccw_device_do_pgid(cdev, func); + } else + ret = __ccw_device_do_nop(cdev); if (ret == 0 || ret == -EBUSY) return; cdev->private->iretry = 5; @@ -318,17 +406,20 @@ ccw_device_verify_irq(struct ccw_device *cdev, enum dev_event dev_event) int ret; irb = (struct irb *) __LC_IRB; - /* Retry set pgid for cc=1. */ + if (irb->scsw.stctl == (SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS)) { - if (irb->scsw.cc == 1) + if (__ccw_device_should_retry(&irb->scsw)) __ccw_device_verify_start(cdev); return; } if (ccw_device_accumulate_and_sense(cdev, irb) != 0) return; sch = to_subchannel(cdev->dev.parent); - ret = __ccw_device_check_pgid(cdev); + if (cdev->private->options.pgroup) + ret = __ccw_device_check_pgid(cdev); + else + ret = __ccw_device_check_nop(cdev); memset(&cdev->private->irb, 0, sizeof(struct irb)); switch (ret) { /* 0, -ETIME, -EAGAIN, -EOPNOTSUPP or -EACCES */ @@ -346,11 +437,10 @@ ccw_device_verify_irq(struct ccw_device *cdev, enum dev_event dev_event) * One of those strange devices which claim to be able * to do multipathing but not for Set Path Group ID. */ - if (cdev->private->flags.pgid_single) { - ccw_device_verify_done(cdev, -EOPNOTSUPP); - break; - } - cdev->private->flags.pgid_single = 1; + if (cdev->private->flags.pgid_single) + cdev->private->options.pgroup = 0; + else + cdev->private->flags.pgid_single = 1; /* fall through. */ case -EAGAIN: /* Try again. */ __ccw_device_verify_start(cdev); @@ -419,10 +509,10 @@ ccw_device_disband_irq(struct ccw_device *cdev, enum dev_event dev_event) int ret; irb = (struct irb *) __LC_IRB; - /* Retry set pgid for cc=1. */ + if (irb->scsw.stctl == (SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS)) { - if (irb->scsw.cc == 1) + if (__ccw_device_should_retry(&irb->scsw)) __ccw_device_disband_start(cdev); return; } diff --git a/drivers/s390/cio/device_status.c b/drivers/s390/cio/device_status.c index 6c762b43f..caf148d5c 100644 --- a/drivers/s390/cio/device_status.c +++ b/drivers/s390/cio/device_status.c @@ -9,7 +9,6 @@ * Status accumulation and basic sense functions. */ -#include #include #include @@ -68,8 +67,7 @@ ccw_device_path_notoper(struct ccw_device *cdev) sch->schib.pmcw.pnom); sch->lpm &= ~sch->schib.pmcw.pnom; - if (cdev->private->options.pgroup) - cdev->private->flags.doverify = 1; + cdev->private->flags.doverify = 1; } /* @@ -181,7 +179,7 @@ ccw_device_accumulate_esw(struct ccw_device *cdev, struct irb *irb) cdev_irb->esw.esw0.erw.auth = irb->esw.esw0.erw.auth; /* Copy path verification required flag. */ cdev_irb->esw.esw0.erw.pvrf = irb->esw.esw0.erw.pvrf; - if (irb->esw.esw0.erw.pvrf && cdev->private->options.pgroup) + if (irb->esw.esw0.erw.pvrf) cdev->private->flags.doverify = 1; /* Copy concurrent sense bit. */ cdev_irb->esw.esw0.erw.cons = irb->esw.esw0.erw.cons; @@ -355,7 +353,7 @@ ccw_device_accumulate_basic_sense(struct ccw_device *cdev, struct irb *irb) } /* Check if path verification is required. */ if (ccw_device_accumulate_esw_valid(irb) && - irb->esw.esw0.erw.pvrf && cdev->private->options.pgroup) + irb->esw.esw0.erw.pvrf) cdev->private->flags.doverify = 1; } diff --git a/drivers/s390/cio/qdio.c b/drivers/s390/cio/qdio.c index 96f519281..7c93a8798 100644 --- a/drivers/s390/cio/qdio.c +++ b/drivers/s390/cio/qdio.c @@ -30,7 +30,6 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include #include @@ -2736,7 +2735,7 @@ qdio_free(struct ccw_device *cdev) QDIO_DBF_TEXT1(0,trace,dbf_text); QDIO_DBF_TEXT0(0,setup,dbf_text); - cdev->private->qdio_data = 0; + cdev->private->qdio_data = NULL; up(&irq_ptr->setting_up_sema); diff --git a/drivers/s390/crypto/z90crypt.h b/drivers/s390/crypto/z90crypt.h index 5e6b1f535..0ca1d126c 100644 --- a/drivers/s390/crypto/z90crypt.h +++ b/drivers/s390/crypto/z90crypt.h @@ -1,7 +1,7 @@ /* * linux/drivers/s390/crypto/z90crypt.h * - * z90crypt 1.3.3 + * z90crypt 1.3.3 (kernel-private header) * * Copyright (C) 2001, 2005 IBM Corporation * Author(s): Robert Burroughs (burrough@us.ibm.com) @@ -27,188 +27,7 @@ #ifndef _Z90CRYPT_H_ #define _Z90CRYPT_H_ -#include - -#define z90crypt_VERSION 1 -#define z90crypt_RELEASE 3 // 2 = PCIXCC, 3 = rewrite for coding standards -#define z90crypt_VARIANT 3 // 3 = CEX2A support - -/** - * struct ica_rsa_modexpo - * - * Requirements: - * - outputdatalength is at least as large as inputdatalength. - * - All key parts are right justified in their fields, padded on - * the left with zeroes. - * - length(b_key) = inputdatalength - * - length(n_modulus) = inputdatalength - */ -struct ica_rsa_modexpo { - char __user * inputdata; - unsigned int inputdatalength; - char __user * outputdata; - unsigned int outputdatalength; - char __user * b_key; - char __user * n_modulus; -}; - -/** - * struct ica_rsa_modexpo_crt - * - * Requirements: - * - inputdatalength is even. - * - outputdatalength is at least as large as inputdatalength. - * - All key parts are right justified in their fields, padded on - * the left with zeroes. - * - length(bp_key) = inputdatalength/2 + 8 - * - length(bq_key) = inputdatalength/2 - * - length(np_key) = inputdatalength/2 + 8 - * - length(nq_key) = inputdatalength/2 - * - length(u_mult_inv) = inputdatalength/2 + 8 - */ -struct ica_rsa_modexpo_crt { - char __user * inputdata; - unsigned int inputdatalength; - char __user * outputdata; - unsigned int outputdatalength; - char __user * bp_key; - char __user * bq_key; - char __user * np_prime; - char __user * nq_prime; - char __user * u_mult_inv; -}; - -#define Z90_IOCTL_MAGIC 'z' // NOTE: Need to allocate from linux folks - -/** - * Interface notes: - * - * The ioctl()s which are implemented (along with relevant details) - * are: - * - * ICARSAMODEXPO - * Perform an RSA operation using a Modulus-Exponent pair - * This takes an ica_rsa_modexpo struct as its arg. - * - * NOTE: please refer to the comments preceding this structure - * for the implementation details for the contents of the - * block - * - * ICARSACRT - * Perform an RSA operation using a Chinese-Remainder Theorem key - * This takes an ica_rsa_modexpo_crt struct as its arg. - * - * NOTE: please refer to the comments preceding this structure - * for the implementation details for the contents of the - * block - * - * Z90STAT_TOTALCOUNT - * Return an integer count of all device types together. - * - * Z90STAT_PCICACOUNT - * Return an integer count of all PCICAs. - * - * Z90STAT_PCICCCOUNT - * Return an integer count of all PCICCs. - * - * Z90STAT_PCIXCCMCL2COUNT - * Return an integer count of all MCL2 PCIXCCs. - * - * Z90STAT_PCIXCCMCL3COUNT - * Return an integer count of all MCL3 PCIXCCs. - * - * Z90STAT_CEX2CCOUNT - * Return an integer count of all CEX2Cs. - * - * Z90STAT_CEX2ACOUNT - * Return an integer count of all CEX2As. - * - * Z90STAT_REQUESTQ_COUNT - * Return an integer count of the number of entries waiting to be - * sent to a device. - * - * Z90STAT_PENDINGQ_COUNT - * Return an integer count of the number of entries sent to a - * device awaiting the reply. - * - * Z90STAT_TOTALOPEN_COUNT - * Return an integer count of the number of open file handles. - * - * Z90STAT_DOMAIN_INDEX - * Return the integer value of the Cryptographic Domain. - * - * Z90STAT_STATUS_MASK - * Return an 64 element array of unsigned chars for the status of - * all devices. - * 0x01: PCICA - * 0x02: PCICC - * 0x03: PCIXCC_MCL2 - * 0x04: PCIXCC_MCL3 - * 0x05: CEX2C - * 0x06: CEX2A - * 0x0d: device is disabled via the proc filesystem - * - * Z90STAT_QDEPTH_MASK - * Return an 64 element array of unsigned chars for the queue - * depth of all devices. - * - * Z90STAT_PERDEV_REQCNT - * Return an 64 element array of unsigned integers for the number - * of successfully completed requests per device since the device - * was detected and made available. - * - * ICAZ90STATUS (deprecated) - * Return some device driver status in a ica_z90_status struct - * This takes an ica_z90_status struct as its arg. - * - * NOTE: this ioctl() is deprecated, and has been replaced with - * single ioctl()s for each type of status being requested - * - * Z90STAT_PCIXCCCOUNT (deprecated) - * Return an integer count of all PCIXCCs (MCL2 + MCL3). - * This is DEPRECATED now that MCL3 PCIXCCs are treated differently from - * MCL2 PCIXCCs. - * - * Z90QUIESCE (not recommended) - * Quiesce the driver. This is intended to stop all new - * requests from being processed. Its use is NOT recommended, - * except in circumstances where there is no other way to stop - * callers from accessing the driver. Its original use was to - * allow the driver to be "drained" of work in preparation for - * a system shutdown. - * - * NOTE: once issued, this ban on new work cannot be undone - * except by unloading and reloading the driver. - */ - -/** - * Supported ioctl calls - */ -#define ICARSAMODEXPO _IOC(_IOC_READ|_IOC_WRITE, Z90_IOCTL_MAGIC, 0x05, 0) -#define ICARSACRT _IOC(_IOC_READ|_IOC_WRITE, Z90_IOCTL_MAGIC, 0x06, 0) - -/* DEPRECATED status calls (bound for removal at some point) */ -#define ICAZ90STATUS _IOR(Z90_IOCTL_MAGIC, 0x10, struct ica_z90_status) -#define Z90STAT_PCIXCCCOUNT _IOR(Z90_IOCTL_MAGIC, 0x43, int) - -/* unrelated to ICA callers */ -#define Z90QUIESCE _IO(Z90_IOCTL_MAGIC, 0x11) - -/* New status calls */ -#define Z90STAT_TOTALCOUNT _IOR(Z90_IOCTL_MAGIC, 0x40, int) -#define Z90STAT_PCICACOUNT _IOR(Z90_IOCTL_MAGIC, 0x41, int) -#define Z90STAT_PCICCCOUNT _IOR(Z90_IOCTL_MAGIC, 0x42, int) -#define Z90STAT_PCIXCCMCL2COUNT _IOR(Z90_IOCTL_MAGIC, 0x4b, int) -#define Z90STAT_PCIXCCMCL3COUNT _IOR(Z90_IOCTL_MAGIC, 0x4c, int) -#define Z90STAT_CEX2CCOUNT _IOR(Z90_IOCTL_MAGIC, 0x4d, int) -#define Z90STAT_CEX2ACOUNT _IOR(Z90_IOCTL_MAGIC, 0x4e, int) -#define Z90STAT_REQUESTQ_COUNT _IOR(Z90_IOCTL_MAGIC, 0x44, int) -#define Z90STAT_PENDINGQ_COUNT _IOR(Z90_IOCTL_MAGIC, 0x45, int) -#define Z90STAT_TOTALOPEN_COUNT _IOR(Z90_IOCTL_MAGIC, 0x46, int) -#define Z90STAT_DOMAIN_INDEX _IOR(Z90_IOCTL_MAGIC, 0x47, int) -#define Z90STAT_STATUS_MASK _IOR(Z90_IOCTL_MAGIC, 0x48, char[64]) -#define Z90STAT_QDEPTH_MASK _IOR(Z90_IOCTL_MAGIC, 0x49, char[64]) -#define Z90STAT_PERDEV_REQCNT _IOR(Z90_IOCTL_MAGIC, 0x4a, int[64]) +#include /** * local errno definitions diff --git a/drivers/s390/crypto/z90main.c b/drivers/s390/crypto/z90main.c index 982acc730..b2f20ab84 100644 --- a/drivers/s390/crypto/z90main.c +++ b/drivers/s390/crypto/z90main.c @@ -411,7 +411,6 @@ static struct miscdevice z90crypt_misc_device = { .minor = Z90CRYPT_MINOR, .name = DEV_NAME, .fops = &z90crypt_fops, - .devfs_name = DEV_NAME }; /** diff --git a/drivers/s390/net/Kconfig b/drivers/s390/net/Kconfig index 548854754..1a93fa684 100644 --- a/drivers/s390/net/Kconfig +++ b/drivers/s390/net/Kconfig @@ -92,15 +92,6 @@ config QETH_VLAN If CONFIG_QETH is switched on, this option will include IEEE 802.1q VLAN support in the qeth device driver. -config QETH_PERF_STATS - bool "Performance statistics in /proc" - depends on QETH - help - When switched on, this option will add a file in the proc-fs - (/proc/qeth_perf_stats) containing performance statistics. It - may slightly impact performance, so this is only recommended for - internal tuning of the device driver. - config CCWGROUP tristate default (LCS || CTC || QETH) diff --git a/drivers/s390/net/Makefile b/drivers/s390/net/Makefile index 90d4d0ef3..4777e36a9 100644 --- a/drivers/s390/net/Makefile +++ b/drivers/s390/net/Makefile @@ -2,7 +2,7 @@ # S/390 network devices # -ctc-objs := ctcmain.o ctctty.o ctcdbug.o +ctc-objs := ctcmain.o ctcdbug.o obj-$(CONFIG_IUCV) += iucv.o obj-$(CONFIG_NETIUCV) += netiucv.o fsm.o diff --git a/drivers/s390/net/claw.c b/drivers/s390/net/claw.c index 06804d39a..95f4e105c 100644 --- a/drivers/s390/net/claw.c +++ b/drivers/s390/net/claw.c @@ -2,9 +2,7 @@ * drivers/s390/net/claw.c * ESCON CLAW network driver * - * $Revision: 1.35 $ $Date: 2005/03/24 12:25:38 $ - * - * Linux fo zSeries version + * Linux for zSeries version * Copyright (C) 2002,2005 IBM Corporation * Author(s) Original code written by: * Kazuo Iimura (iimura@jp.ibm.com) @@ -88,7 +86,6 @@ #include #include #include -#include #include "cu3088.h" #include "claw.h" @@ -146,8 +143,8 @@ claw_unregister_debug_facility(void) static int claw_register_debug_facility(void) { - claw_dbf_setup = debug_register("claw_setup", 1, 1, 8); - claw_dbf_trace = debug_register("claw_trace", 1, 2, 8); + claw_dbf_setup = debug_register("claw_setup", 2, 1, 8); + claw_dbf_trace = debug_register("claw_trace", 2, 2, 8); if (claw_dbf_setup == NULL || claw_dbf_trace == NULL) { printk(KERN_WARNING "Not enough memory for debug facility.\n"); claw_unregister_debug_facility(); @@ -241,20 +238,20 @@ static struct sk_buff *claw_pack_skb(struct claw_privbk *privptr); static void dumpit (char *buf, int len); #endif /* sysfs Functions */ -static ssize_t claw_hname_show(struct device *dev, char *buf); -static ssize_t claw_hname_write(struct device *dev, +static ssize_t claw_hname_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t claw_hname_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); -static ssize_t claw_adname_show(struct device *dev, char *buf); -static ssize_t claw_adname_write(struct device *dev, +static ssize_t claw_adname_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t claw_adname_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); -static ssize_t claw_apname_show(struct device *dev, char *buf); -static ssize_t claw_apname_write(struct device *dev, +static ssize_t claw_apname_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t claw_apname_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); -static ssize_t claw_wbuff_show(struct device *dev, char *buf); -static ssize_t claw_wbuff_write(struct device *dev, +static ssize_t claw_wbuff_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t claw_wbuff_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); -static ssize_t claw_rbuff_show(struct device *dev, char *buf); -static ssize_t claw_rbuff_write(struct device *dev, +static ssize_t claw_rbuff_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t claw_rbuff_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); static int claw_add_files(struct device *dev); static void claw_remove_files(struct device *dev); @@ -313,7 +310,7 @@ claw_probe(struct ccwgroup_device *cgdev) printk(KERN_INFO "claw: variable cgdev =\n"); dumpit((char *)cgdev, sizeof(struct ccwgroup_device)); #endif - privptr = kmalloc(sizeof(struct claw_privbk), GFP_KERNEL); + privptr = kzalloc(sizeof(struct claw_privbk), GFP_KERNEL); if (privptr == NULL) { probe_error(cgdev); put_device(&cgdev->dev); @@ -322,7 +319,6 @@ claw_probe(struct ccwgroup_device *cgdev) CLAW_DBF_TEXT_(2,setup,"probex%d",-ENOMEM); return -ENOMEM; } - memset(privptr,0x00,sizeof(struct claw_privbk)); privptr->p_mtc_envelope= kmalloc( MAX_ENVELOPE_SIZE, GFP_KERNEL); privptr->p_env = kmalloc(sizeof(struct claw_env), GFP_KERNEL); if ((privptr->p_mtc_envelope==NULL) || (privptr->p_env==NULL)) { @@ -428,15 +424,15 @@ claw_pack_skb(struct claw_privbk *privptr) new_skb = NULL; /* assume no dice */ pkt_cnt = 0; CLAW_DBF_TEXT(4,trace,"PackSKBe"); - if (skb_queue_len(&p_ch->collect_queue) > 0) { + if (!skb_queue_empty(&p_ch->collect_queue)) { /* some data */ held_skb = skb_dequeue(&p_ch->collect_queue); - if (p_env->packing != DO_PACKED) - return held_skb; if (held_skb) - atomic_dec(&held_skb->users); + dev_kfree_skb_any(held_skb); else return NULL; + if (p_env->packing != DO_PACKED) + return held_skb; /* get a new SKB we will pack at least one */ new_skb = dev_alloc_skb(p_env->write_size); if (new_skb == NULL) { @@ -455,7 +451,7 @@ claw_pack_skb(struct claw_privbk *privptr) privptr->stats.tx_packets++; so_far += held_skb->len; pkt_cnt++; - dev_kfree_skb_irq(held_skb); + dev_kfree_skb_any(held_skb); held_skb = skb_dequeue(&p_ch->collect_queue); if (held_skb) atomic_dec(&held_skb->users); @@ -533,7 +529,7 @@ claw_open(struct net_device *dev) printk(KERN_INFO "%s:%s Enter \n",dev->name,__FUNCTION__); #endif CLAW_DBF_TEXT(4,trace,"open"); - if (!dev | (dev->name[0] == 0x00)) { + if (!dev || (dev->name[0] == 0x00)) { CLAW_DBF_TEXT(2,trace,"BadDev"); printk(KERN_WARNING "claw: Bad device at open failing \n"); return -ENODEV; @@ -1092,7 +1088,7 @@ claw_release(struct net_device *dev) } } if (privptr->pk_skb != NULL) { - dev_kfree_skb(privptr->pk_skb); + dev_kfree_skb_any(privptr->pk_skb); privptr->pk_skb = NULL; } if(privptr->buffs_alloc != 1) { @@ -1254,7 +1250,7 @@ claw_write_next ( struct chbk * p_ch ) privptr = (struct claw_privbk *) dev->priv; claw_free_wrt_buf( dev ); if ((privptr->write_free_count > 0) && - (skb_queue_len(&p_ch->collect_queue) > 0)) { + !skb_queue_empty(&p_ch->collect_queue)) { pk_skb = claw_pack_skb(privptr); while (pk_skb != NULL) { rc = claw_hw_tx( pk_skb, dev,1); @@ -1407,7 +1403,7 @@ add_claw_reads(struct net_device *dev, struct ccwbk* p_first, if ( privptr-> p_read_active_first ==NULL ) { #ifdef DEBUGMSG - printk(KERN_INFO "%s:%s p_read_active_frist == NULL \n", + printk(KERN_INFO "%s:%s p_read_active_first == NULL \n", dev->name,__FUNCTION__); printk(KERN_INFO "%s:%s Read active first/last changed \n", dev->name,__FUNCTION__); @@ -1604,7 +1600,7 @@ dumpit(char* buf, int len) __u32 ct, sw, rm, dup; char *ptr, *rptr; char tbuf[82], tdup[82]; -#if (CONFIG_ARCH_S390X) +#if (CONFIG_64BIT) char addr[22]; #else char addr[12]; @@ -1620,7 +1616,7 @@ dumpit(char* buf, int len) dup = 0; for ( ct=0; ct < len; ct++, ptr++, rptr++ ) { if (sw == 0) { -#if (CONFIG_ARCH_S390X) +#if (CONFIG_64BIT) sprintf(addr, "%16.16lX",(unsigned long)rptr); #else sprintf(addr, "%8.8X",(__u32)rptr); @@ -1635,7 +1631,7 @@ dumpit(char* buf, int len) if (sw == 8) { strcat(bhex, " "); } -#if (CONFIG_ARCH_S390X) +#if (CONFIG_64BIT) sprintf(tbuf,"%2.2lX", (unsigned long)*ptr); #else sprintf(tbuf,"%2.2X", (__u32)*ptr); @@ -2016,7 +2012,7 @@ claw_hw_tx(struct sk_buff *skb, struct net_device *dev, long linkid) p_buf=(struct ccwbk*)privptr->p_end_ccw; dumpit((char *)p_buf, sizeof(struct endccw)); #endif - dev_kfree_skb(skb); + dev_kfree_skb_any(skb); if (linkid==0) { lock=LOCK_NO; } @@ -2743,14 +2739,10 @@ probe_error( struct ccwgroup_device *cgdev) #endif privptr=(struct claw_privbk *)cgdev->dev.driver_data; if (privptr!=NULL) { - if (privptr->p_env != NULL) { - kfree(privptr->p_env); - privptr->p_env=NULL; - } - if (privptr->p_mtc_envelope!=NULL) { - kfree(privptr->p_mtc_envelope); - privptr->p_mtc_envelope=NULL; - } + kfree(privptr->p_env); + privptr->p_env=NULL; + kfree(privptr->p_mtc_envelope); + privptr->p_mtc_envelope=NULL; kfree(privptr); privptr=NULL; } @@ -4061,7 +4053,7 @@ claw_purge_skb_queue(struct sk_buff_head *q) while ((skb = skb_dequeue(q))) { atomic_dec(&skb->users); - dev_kfree_skb_irq(skb); + dev_kfree_skb_any(skb); } } @@ -4121,22 +4113,14 @@ claw_remove_device(struct ccwgroup_device *cgdev) if (cgdev->state == CCWGROUP_ONLINE) claw_shutdown_device(cgdev); claw_remove_files(&cgdev->dev); - if (priv->p_mtc_envelope!=NULL) { - kfree(priv->p_mtc_envelope); - priv->p_mtc_envelope=NULL; - } - if (priv->p_env != NULL) { - kfree(priv->p_env); - priv->p_env=NULL; - } - if (priv->channel[0].irb != NULL) { - kfree(priv->channel[0].irb); - priv->channel[0].irb=NULL; - } - if (priv->channel[1].irb != NULL) { - kfree(priv->channel[1].irb); - priv->channel[1].irb=NULL; - } + kfree(priv->p_mtc_envelope); + priv->p_mtc_envelope=NULL; + kfree(priv->p_env); + priv->p_env=NULL; + kfree(priv->channel[0].irb); + priv->channel[0].irb=NULL; + kfree(priv->channel[1].irb); + priv->channel[1].irb=NULL; kfree(priv); cgdev->dev.driver_data=NULL; cgdev->cdev[READ]->dev.driver_data = NULL; @@ -4149,7 +4133,7 @@ claw_remove_device(struct ccwgroup_device *cgdev) * sysfs attributes */ static ssize_t -claw_hname_show(struct device *dev, char *buf) +claw_hname_show(struct device *dev, struct device_attribute *attr, char *buf) { struct claw_privbk *priv; struct claw_env * p_env; @@ -4162,7 +4146,7 @@ claw_hname_show(struct device *dev, char *buf) } static ssize_t -claw_hname_write(struct device *dev, const char *buf, size_t count) +claw_hname_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct claw_privbk *priv; struct claw_env * p_env; @@ -4186,7 +4170,7 @@ claw_hname_write(struct device *dev, const char *buf, size_t count) static DEVICE_ATTR(host_name, 0644, claw_hname_show, claw_hname_write); static ssize_t -claw_adname_show(struct device *dev, char *buf) +claw_adname_show(struct device *dev, struct device_attribute *attr, char *buf) { struct claw_privbk *priv; struct claw_env * p_env; @@ -4199,7 +4183,7 @@ claw_adname_show(struct device *dev, char *buf) } static ssize_t -claw_adname_write(struct device *dev, const char *buf, size_t count) +claw_adname_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct claw_privbk *priv; struct claw_env * p_env; @@ -4223,7 +4207,7 @@ claw_adname_write(struct device *dev, const char *buf, size_t count) static DEVICE_ATTR(adapter_name, 0644, claw_adname_show, claw_adname_write); static ssize_t -claw_apname_show(struct device *dev, char *buf) +claw_apname_show(struct device *dev, struct device_attribute *attr, char *buf) { struct claw_privbk *priv; struct claw_env * p_env; @@ -4237,7 +4221,7 @@ claw_apname_show(struct device *dev, char *buf) } static ssize_t -claw_apname_write(struct device *dev, const char *buf, size_t count) +claw_apname_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct claw_privbk *priv; struct claw_env * p_env; @@ -4271,7 +4255,7 @@ claw_apname_write(struct device *dev, const char *buf, size_t count) static DEVICE_ATTR(api_type, 0644, claw_apname_show, claw_apname_write); static ssize_t -claw_wbuff_show(struct device *dev, char *buf) +claw_wbuff_show(struct device *dev, struct device_attribute *attr, char *buf) { struct claw_privbk *priv; struct claw_env * p_env; @@ -4284,7 +4268,7 @@ claw_wbuff_show(struct device *dev, char *buf) } static ssize_t -claw_wbuff_write(struct device *dev, const char *buf, size_t count) +claw_wbuff_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct claw_privbk *priv; struct claw_env * p_env; @@ -4312,7 +4296,7 @@ claw_wbuff_write(struct device *dev, const char *buf, size_t count) static DEVICE_ATTR(write_buffer, 0644, claw_wbuff_show, claw_wbuff_write); static ssize_t -claw_rbuff_show(struct device *dev, char *buf) +claw_rbuff_show(struct device *dev, struct device_attribute *attr, char *buf) { struct claw_privbk *priv; struct claw_env * p_env; @@ -4325,7 +4309,7 @@ claw_rbuff_show(struct device *dev, char *buf) } static ssize_t -claw_rbuff_write(struct device *dev, const char *buf, size_t count) +claw_rbuff_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct claw_privbk *priv; struct claw_env *p_env; @@ -4404,14 +4388,7 @@ static int __init claw_init(void) { int ret = 0; - printk(KERN_INFO "claw: starting driver " -#ifdef MODULE - "module " -#else - "compiled into kernel " -#endif - " $Revision: 1.35 $ $Date: 2005/03/24 12:25:38 $ \n"); - + printk(KERN_INFO "claw: starting driver\n"); #ifdef FUNCTRACE printk(KERN_INFO "claw: %s() enter \n",__FUNCTION__); diff --git a/drivers/s390/net/ctcmain.c b/drivers/s390/net/ctcmain.c index fe986af88..3257c22dd 100644 --- a/drivers/s390/net/ctcmain.c +++ b/drivers/s390/net/ctcmain.c @@ -6,7 +6,7 @@ * Fixes by : Jochen Röhrig (roehrig@de.ibm.com) * Arnaldo Carvalho de Melo Peter Tiedemann (ptiedem@de.ibm.com) - * Driver Model stuff by : Cornelia Huck + * Driver Model stuff by : Cornelia Huck * * Documentation used: * - Principles of Operation (IBM doc#: SA22-7201-06) @@ -65,7 +65,6 @@ #include -#include "ctctty.h" #include "fsm.h" #include "cu3088.h" @@ -479,10 +478,7 @@ ctc_unpack_skb(struct channel *ch, struct sk_buff *pskb) skb->dev = pskb->dev; skb->protocol = pskb->protocol; pskb->ip_summed = CHECKSUM_UNNECESSARY; - if (ch->protocol == CTC_PROTO_LINUX_TTY) - ctc_tty_netif_rx(skb); - else - netif_rx_ni(skb); + netif_rx_ni(skb); /** * Successful rx; reset logflags */ @@ -557,8 +553,7 @@ ccw_unit_check(struct channel *ch, unsigned char sense) DBF_TEXT(trace, 5, __FUNCTION__); if (sense & SNS0_INTERVENTION_REQ) { if (sense & 0x01) { - if (ch->protocol != CTC_PROTO_LINUX_TTY) - ctc_pr_debug("%s: Interface disc. or Sel. reset " + ctc_pr_debug("%s: Interface disc. or Sel. reset " "(remote)\n", ch->id); fsm_event(ch->fsm, CH_EVENT_UC_RCRESET, ch); } else { @@ -1719,6 +1714,9 @@ add_channel(struct ccw_device *cdev, enum channel_types type) kfree(ch); return 0; } + + spin_lock_init(&ch->collect_lock); + fsm_settimer(ch->fsm, &ch->timer); skb_queue_head_init(&ch->io_queue); skb_queue_head_init(&ch->collect_queue); @@ -2034,7 +2032,6 @@ static void dev_action_chup(fsm_instance * fi, int event, void *arg) { struct net_device *dev = (struct net_device *) arg; - struct ctc_priv *privptr = dev->priv; DBF_TEXT(trace, 3, __FUNCTION__); switch (fsm_getstate(fi)) { @@ -2049,8 +2046,6 @@ dev_action_chup(fsm_instance * fi, int event, void *arg) fsm_newstate(fi, DEV_STATE_RUNNING); ctc_pr_info("%s: connected with remote side\n", dev->name); - if (privptr->protocol == CTC_PROTO_LINUX_TTY) - ctc_tty_setcarrier(dev, 1); ctc_clear_busy(dev); } break; @@ -2059,8 +2054,6 @@ dev_action_chup(fsm_instance * fi, int event, void *arg) fsm_newstate(fi, DEV_STATE_RUNNING); ctc_pr_info("%s: connected with remote side\n", dev->name); - if (privptr->protocol == CTC_PROTO_LINUX_TTY) - ctc_tty_setcarrier(dev, 1); ctc_clear_busy(dev); } break; @@ -2086,14 +2079,10 @@ dev_action_chup(fsm_instance * fi, int event, void *arg) static void dev_action_chdown(fsm_instance * fi, int event, void *arg) { - struct net_device *dev = (struct net_device *) arg; - struct ctc_priv *privptr = dev->priv; DBF_TEXT(trace, 3, __FUNCTION__); switch (fsm_getstate(fi)) { case DEV_STATE_RUNNING: - if (privptr->protocol == CTC_PROTO_LINUX_TTY) - ctc_tty_setcarrier(dev, 0); if (event == DEV_EVENT_TXDOWN) fsm_newstate(fi, DEV_STATE_STARTWAIT_TX); else @@ -2397,8 +2386,6 @@ ctc_tx(struct sk_buff *skb, struct net_device * dev) */ if (fsm_getstate(privptr->fsm) != DEV_STATE_RUNNING) { fsm_event(privptr->fsm, DEV_EVENT_START, dev); - if (privptr->protocol == CTC_PROTO_LINUX_TTY) - return -EBUSY; dev_kfree_skb(skb); privptr->stats.tx_dropped++; privptr->stats.tx_errors++; @@ -2608,20 +2595,13 @@ ctc_netdev_unregister(struct net_device * dev) if (!dev) return; privptr = (struct ctc_priv *) dev->priv; - if (privptr->protocol != CTC_PROTO_LINUX_TTY) - unregister_netdev(dev); - else - ctc_tty_unregister_netdev(dev); + unregister_netdev(dev); } static int ctc_netdev_register(struct net_device * dev) { - struct ctc_priv *privptr = (struct ctc_priv *) dev->priv; - if (privptr->protocol != CTC_PROTO_LINUX_TTY) - return register_netdev(dev); - else - return ctc_tty_register_netdev(dev); + return register_netdev(dev); } static void @@ -2667,7 +2647,9 @@ ctc_proto_store(struct device *dev, struct device_attribute *attr, const char *b if (!priv) return -ENODEV; sscanf(buf, "%u", &value); - if ((value < 0) || (value > CTC_PROTO_MAX)) + if (!((value == CTC_PROTO_S390) || + (value == CTC_PROTO_LINUX) || + (value == CTC_PROTO_OS390))) return -EINVAL; priv->protocol = value; @@ -2707,9 +2689,17 @@ static struct attribute_group ctc_attr_group = { static int ctc_add_attributes(struct device *dev) { - device_create_file(dev, &dev_attr_loglevel); - device_create_file(dev, &dev_attr_stats); - return 0; + int rc; + + rc = device_create_file(dev, &dev_attr_loglevel); + if (rc) + goto out; + rc = device_create_file(dev, &dev_attr_stats); + if (!rc) + goto out; + device_remove_file(dev, &dev_attr_loglevel); +out: + return rc; } static void @@ -2897,10 +2887,7 @@ ctc_new_device(struct ccwgroup_device *cgdev) goto out; } - if (privptr->protocol == CTC_PROTO_LINUX_TTY) - strlcpy(dev->name, "ctctty%d", IFNAMSIZ); - else - strlcpy(dev->name, "ctc%d", IFNAMSIZ); + strlcpy(dev->name, "ctc%d", IFNAMSIZ); for (direction = READ; direction <= WRITE; direction++) { privptr->channel[direction] = @@ -2925,7 +2912,12 @@ ctc_new_device(struct ccwgroup_device *cgdev) goto out; } - ctc_add_attributes(&cgdev->dev); + if (ctc_add_attributes(&cgdev->dev)) { + ctc_netdev_unregister(dev); + dev->priv = NULL; + ctc_free_netdevice(dev, 1); + goto out; + } strlcpy(privptr->fsm->name, dev->name, sizeof (privptr->fsm->name)); @@ -3046,7 +3038,6 @@ ctc_exit(void) { DBF_TEXT(setup, 3, __FUNCTION__); unregister_cu3088_discipline(&ctc_group_driver); - ctc_tty_cleanup(); ctc_unregister_dbf_views(); ctc_pr_info("CTC driver unloaded\n"); } @@ -3073,10 +3064,8 @@ ctc_init(void) ctc_pr_crit("ctc_init failed with ctc_register_dbf_views rc = %d\n", ret); return ret; } - ctc_tty_init(); ret = register_cu3088_discipline(&ctc_group_driver); if (ret) { - ctc_tty_cleanup(); ctc_unregister_dbf_views(); } return ret; diff --git a/drivers/s390/net/ctcmain.h b/drivers/s390/net/ctcmain.h index ba3605f16..7f305d119 100644 --- a/drivers/s390/net/ctcmain.h +++ b/drivers/s390/net/ctcmain.h @@ -1,6 +1,4 @@ /* - * $Id: ctcmain.h,v 1.4 2005/03/24 09:04:17 mschwide Exp $ - * * CTC / ESCON network driver * * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation @@ -29,8 +27,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * - * RELEASE-TAG: CTC/ESCON network driver $Revision: 1.4 $ - * */ #ifndef _CTCMAIN_H_ @@ -39,7 +35,9 @@ #include #include -#include "ctctty.h" +#include +#include + #include "fsm.h" #include "cu3088.h" @@ -54,9 +52,7 @@ #define CTC_PROTO_S390 0 #define CTC_PROTO_LINUX 1 -#define CTC_PROTO_LINUX_TTY 2 #define CTC_PROTO_OS390 3 -#define CTC_PROTO_MAX 3 #define CTC_BUFSIZE_LIMIT 65535 #define CTC_BUFSIZE_DEFAULT 32768 @@ -261,15 +257,13 @@ static __inline__ void ctc_clear_busy(struct net_device * dev) { clear_bit(0, &(((struct ctc_priv *) dev->priv)->tbusy)); - if (((struct ctc_priv *)dev->priv)->protocol != CTC_PROTO_LINUX_TTY) - netif_wake_queue(dev); + netif_wake_queue(dev); } static __inline__ int ctc_test_and_set_busy(struct net_device * dev) { - if (((struct ctc_priv *)dev->priv)->protocol != CTC_PROTO_LINUX_TTY) - netif_stop_queue(dev); + netif_stop_queue(dev); return test_and_set_bit(0, &((struct ctc_priv *) dev->priv)->tbusy); } diff --git a/drivers/s390/net/ctctty.c b/drivers/s390/net/ctctty.c deleted file mode 100644 index af54d1de0..000000000 --- a/drivers/s390/net/ctctty.c +++ /dev/null @@ -1,1259 +0,0 @@ -/* - * CTC / ESCON network driver, tty interface. - * - * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation - * Author(s): Fritz Elfert (elfert@de.ibm.com, felfert@millenux.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, 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include "ctctty.h" -#include "ctcdbug.h" - -#define CTC_TTY_MAJOR 43 -#define CTC_TTY_MAX_DEVICES 64 - -#define CTC_ASYNC_MAGIC 0x49344C01 /* for paranoia-checking */ -#define CTC_ASYNC_INITIALIZED 0x80000000 /* port was initialized */ -#define CTC_ASYNC_NORMAL_ACTIVE 0x20000000 /* Normal device active */ -#define CTC_ASYNC_CLOSING 0x08000000 /* Serial port is closing */ -#define CTC_ASYNC_CTS_FLOW 0x04000000 /* Do CTS flow control */ -#define CTC_ASYNC_CHECK_CD 0x02000000 /* i.e., CLOCAL */ -#define CTC_ASYNC_HUP_NOTIFY 0x0001 /* Notify tty on hangups/closes */ -#define CTC_ASYNC_NETDEV_OPEN 0x0002 /* Underlying netdev is open */ -#define CTC_ASYNC_TX_LINESTAT 0x0004 /* Must send line status */ -#define CTC_ASYNC_SPLIT_TERMIOS 0x0008 /* Sep. termios for dialin/out */ -#define CTC_TTY_XMIT_SIZE 1024 /* Default bufsize for write */ -#define CTC_SERIAL_XMIT_MAX 4000 /* Maximum bufsize for write */ - -/* Private data (similar to async_struct in ) */ -typedef struct { - int magic; - int flags; /* defined in tty.h */ - int mcr; /* Modem control register */ - int msr; /* Modem status register */ - int lsr; /* Line status register */ - int line; - int count; /* # of fd on device */ - int blocked_open; /* # of blocked opens */ - struct net_device *netdev; - struct sk_buff_head tx_queue; /* transmit queue */ - struct sk_buff_head rx_queue; /* receive queue */ - struct tty_struct *tty; /* Pointer to corresponding tty */ - wait_queue_head_t open_wait; - wait_queue_head_t close_wait; - struct semaphore write_sem; - struct tasklet_struct tasklet; - struct timer_list stoptimer; -} ctc_tty_info; - -/* Description of one CTC-tty */ -typedef struct { - struct tty_driver *ctc_tty_device; /* tty-device */ - ctc_tty_info info[CTC_TTY_MAX_DEVICES]; /* Private data */ -} ctc_tty_driver; - -static ctc_tty_driver *driver; - -/* Leave this unchanged unless you know what you do! */ -#define MODEM_PARANOIA_CHECK -#define MODEM_DO_RESTART - -#define CTC_TTY_NAME "ctctty" - -static __u32 ctc_tty_magic = CTC_ASYNC_MAGIC; -static int ctc_tty_shuttingdown = 0; - -static spinlock_t ctc_tty_lock; - -/* ctc_tty_try_read() is called from within ctc_tty_rcv_skb() - * to stuff incoming data directly into a tty's flip-buffer. If the - * flip buffer is full, the packet gets queued up. - * - * Return: - * 1 = Success - * 0 = Failure, data has to be buffered and later processed by - * ctc_tty_readmodem(). - */ -static int -ctc_tty_try_read(ctc_tty_info * info, struct sk_buff *skb) -{ - int len; - struct tty_struct *tty; - - DBF_TEXT(trace, 5, __FUNCTION__); - if ((tty = info->tty)) { - if (info->mcr & UART_MCR_RTS) { - len = skb->len; - tty_insert_flip_string(tty, skb->data, len); - tty_flip_buffer_push(tty); - kfree_skb(skb); - return 1; - } - } - return 0; -} - -/* ctc_tty_readmodem() is called periodically from within timer-interrupt. - * It tries getting received data from the receive queue an stuff it into - * the tty's flip-buffer. - */ -static int -ctc_tty_readmodem(ctc_tty_info *info) -{ - int ret = 1; - struct tty_struct *tty; - - DBF_TEXT(trace, 5, __FUNCTION__); - if ((tty = info->tty)) { - if (info->mcr & UART_MCR_RTS) { - struct sk_buff *skb; - - if ((skb = skb_dequeue(&info->rx_queue))) { - int len = skb->len; - tty_insert_flip_string(tty, skb->data, len); - skb_pull(skb, len); - tty_flip_buffer_push(tty); - if (skb->len > 0) - skb_queue_head(&info->rx_queue, skb); - else { - kfree_skb(skb); - ret = !skb_queue_empty(&info->rx_queue); - } - } - } - } - return ret; -} - -void -ctc_tty_setcarrier(struct net_device *netdev, int on) -{ - int i; - - DBF_TEXT(trace, 4, __FUNCTION__); - if ((!driver) || ctc_tty_shuttingdown) - return; - for (i = 0; i < CTC_TTY_MAX_DEVICES; i++) - if (driver->info[i].netdev == netdev) { - ctc_tty_info *info = &driver->info[i]; - if (on) - info->msr |= UART_MSR_DCD; - else - info->msr &= ~UART_MSR_DCD; - if ((info->flags & CTC_ASYNC_CHECK_CD) && (!on)) - tty_hangup(info->tty); - } -} - -void -ctc_tty_netif_rx(struct sk_buff *skb) -{ - int i; - ctc_tty_info *info = NULL; - - DBF_TEXT(trace, 5, __FUNCTION__); - if (!skb) - return; - if ((!skb->dev) || (!driver) || ctc_tty_shuttingdown) { - dev_kfree_skb(skb); - return; - } - for (i = 0; i < CTC_TTY_MAX_DEVICES; i++) - if (driver->info[i].netdev == skb->dev) { - info = &driver->info[i]; - break; - } - if (!info) { - dev_kfree_skb(skb); - return; - } - if (skb->len < 6) { - dev_kfree_skb(skb); - return; - } - if (memcmp(skb->data, &ctc_tty_magic, sizeof(__u32))) { - dev_kfree_skb(skb); - return; - } - skb_pull(skb, sizeof(__u32)); - - i = *((int *)skb->data); - skb_pull(skb, sizeof(info->mcr)); - if (i & UART_MCR_RTS) { - info->msr |= UART_MSR_CTS; - if (info->flags & CTC_ASYNC_CTS_FLOW) - info->tty->hw_stopped = 0; - } else { - info->msr &= ~UART_MSR_CTS; - if (info->flags & CTC_ASYNC_CTS_FLOW) - info->tty->hw_stopped = 1; - } - if (i & UART_MCR_DTR) - info->msr |= UART_MSR_DSR; - else - info->msr &= ~UART_MSR_DSR; - if (skb->len <= 0) { - kfree_skb(skb); - return; - } - /* Try to deliver directly via tty-flip-buf if queue is empty */ - if (skb_queue_empty(&info->rx_queue)) - if (ctc_tty_try_read(info, skb)) - return; - /* Direct deliver failed or queue wasn't empty. - * Queue up for later dequeueing via timer-irq. - */ - skb_queue_tail(&info->rx_queue, skb); - /* Schedule dequeuing */ - tasklet_schedule(&info->tasklet); -} - -static int -ctc_tty_tint(ctc_tty_info * info) -{ - struct sk_buff *skb = skb_dequeue(&info->tx_queue); - int stopped = (info->tty->hw_stopped || info->tty->stopped); - int wake = 1; - int rc; - - DBF_TEXT(trace, 4, __FUNCTION__); - if (!info->netdev) { - if (skb) - kfree_skb(skb); - return 0; - } - if (info->flags & CTC_ASYNC_TX_LINESTAT) { - int skb_res = info->netdev->hard_header_len + - sizeof(info->mcr) + sizeof(__u32); - /* If we must update line status, - * create an empty dummy skb and insert it. - */ - if (skb) - skb_queue_head(&info->tx_queue, skb); - - skb = dev_alloc_skb(skb_res); - if (!skb) { - printk(KERN_WARNING - "ctc_tty: Out of memory in %s%d tint\n", - CTC_TTY_NAME, info->line); - return 1; - } - skb_reserve(skb, skb_res); - stopped = 0; - wake = 0; - } - if (!skb) - return 0; - if (stopped) { - skb_queue_head(&info->tx_queue, skb); - return 1; - } -#if 0 - if (skb->len > 0) - printk(KERN_DEBUG "tint: %d %02x\n", skb->len, *(skb->data)); - else - printk(KERN_DEBUG "tint: %d STAT\n", skb->len); -#endif - memcpy(skb_push(skb, sizeof(info->mcr)), &info->mcr, sizeof(info->mcr)); - memcpy(skb_push(skb, sizeof(__u32)), &ctc_tty_magic, sizeof(__u32)); - rc = info->netdev->hard_start_xmit(skb, info->netdev); - if (rc) { - skb_pull(skb, sizeof(info->mcr) + sizeof(__u32)); - if (skb->len > 0) - skb_queue_head(&info->tx_queue, skb); - else - kfree_skb(skb); - } else { - struct tty_struct *tty = info->tty; - - info->flags &= ~CTC_ASYNC_TX_LINESTAT; - if (tty) { - tty_wakeup(tty); - } - } - return (skb_queue_empty(&info->tx_queue) ? 0 : 1); -} - -/************************************************************ - * - * Modem-functions - * - * mostly "stolen" from original Linux-serial.c and friends. - * - ************************************************************/ - -static inline int -ctc_tty_paranoia_check(ctc_tty_info * info, char *name, const char *routine) -{ -#ifdef MODEM_PARANOIA_CHECK - if (!info) { - printk(KERN_WARNING "ctc_tty: null info_struct for %s in %s\n", - name, routine); - return 1; - } - if (info->magic != CTC_ASYNC_MAGIC) { - printk(KERN_WARNING "ctc_tty: bad magic for info struct %s in %s\n", - name, routine); - return 1; - } -#endif - return 0; -} - -static void -ctc_tty_inject(ctc_tty_info *info, char c) -{ - int skb_res; - struct sk_buff *skb; - - DBF_TEXT(trace, 4, __FUNCTION__); - if (ctc_tty_shuttingdown) - return; - skb_res = info->netdev->hard_header_len + sizeof(info->mcr) + - sizeof(__u32) + 1; - skb = dev_alloc_skb(skb_res); - if (!skb) { - printk(KERN_WARNING - "ctc_tty: Out of memory in %s%d tx_inject\n", - CTC_TTY_NAME, info->line); - return; - } - skb_reserve(skb, skb_res); - *(skb_put(skb, 1)) = c; - skb_queue_head(&info->tx_queue, skb); - tasklet_schedule(&info->tasklet); -} - -static void -ctc_tty_transmit_status(ctc_tty_info *info) -{ - DBF_TEXT(trace, 5, __FUNCTION__); - if (ctc_tty_shuttingdown) - return; - info->flags |= CTC_ASYNC_TX_LINESTAT; - tasklet_schedule(&info->tasklet); -} - -static void -ctc_tty_change_speed(ctc_tty_info * info) -{ - unsigned int cflag; - unsigned int quot; - int i; - - DBF_TEXT(trace, 3, __FUNCTION__); - if (!info->tty || !info->tty->termios) - return; - cflag = info->tty->termios->c_cflag; - - quot = i = cflag & CBAUD; - if (i & CBAUDEX) { - i &= ~CBAUDEX; - if (i < 1 || i > 2) - info->tty->termios->c_cflag &= ~CBAUDEX; - else - i += 15; - } - if (quot) { - info->mcr |= UART_MCR_DTR; - info->mcr |= UART_MCR_RTS; - ctc_tty_transmit_status(info); - } else { - info->mcr &= ~UART_MCR_DTR; - info->mcr &= ~UART_MCR_RTS; - ctc_tty_transmit_status(info); - return; - } - - /* CTS flow control flag and modem status interrupts */ - if (cflag & CRTSCTS) { - info->flags |= CTC_ASYNC_CTS_FLOW; - } else - info->flags &= ~CTC_ASYNC_CTS_FLOW; - if (cflag & CLOCAL) - info->flags &= ~CTC_ASYNC_CHECK_CD; - else { - info->flags |= CTC_ASYNC_CHECK_CD; - } -} - -static int -ctc_tty_startup(ctc_tty_info * info) -{ - DBF_TEXT(trace, 3, __FUNCTION__); - if (info->flags & CTC_ASYNC_INITIALIZED) - return 0; -#ifdef CTC_DEBUG_MODEM_OPEN - printk(KERN_DEBUG "starting up %s%d ...\n", CTC_TTY_NAME, info->line); -#endif - /* - * Now, initialize the UART - */ - info->mcr = UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2; - if (info->tty) - clear_bit(TTY_IO_ERROR, &info->tty->flags); - /* - * and set the speed of the serial port - */ - ctc_tty_change_speed(info); - - info->flags |= CTC_ASYNC_INITIALIZED; - if (!(info->flags & CTC_ASYNC_NETDEV_OPEN)) - info->netdev->open(info->netdev); - info->flags |= CTC_ASYNC_NETDEV_OPEN; - return 0; -} - -static void -ctc_tty_stopdev(unsigned long data) -{ - ctc_tty_info *info = (ctc_tty_info *)data; - - if ((!info) || (!info->netdev) || - (info->flags & CTC_ASYNC_INITIALIZED)) - return; - info->netdev->stop(info->netdev); - info->flags &= ~CTC_ASYNC_NETDEV_OPEN; -} - -/* - * This routine will shutdown a serial port; interrupts are disabled, and - * DTR is dropped if the hangup on close termio flag is on. - */ -static void -ctc_tty_shutdown(ctc_tty_info * info) -{ - DBF_TEXT(trace, 3, __FUNCTION__); - if (!(info->flags & CTC_ASYNC_INITIALIZED)) - return; -#ifdef CTC_DEBUG_MODEM_OPEN - printk(KERN_DEBUG "Shutting down %s%d ....\n", CTC_TTY_NAME, info->line); -#endif - info->msr &= ~UART_MSR_RI; - if (!info->tty || (info->tty->termios->c_cflag & HUPCL)) - info->mcr &= ~(UART_MCR_DTR | UART_MCR_RTS); - if (info->tty) - set_bit(TTY_IO_ERROR, &info->tty->flags); - mod_timer(&info->stoptimer, jiffies + (10 * HZ)); - skb_queue_purge(&info->tx_queue); - skb_queue_purge(&info->rx_queue); - info->flags &= ~CTC_ASYNC_INITIALIZED; -} - -/* ctc_tty_write() is the main send-routine. It is called from the upper - * levels within the kernel to perform sending data. Depending on the - * online-flag it either directs output to the at-command-interpreter or - * to the lower level. Additional tasks done here: - * - If online, check for escape-sequence (+++) - * - If sending audio-data, call ctc_tty_DLEdown() to parse DLE-codes. - * - If receiving audio-data, call ctc_tty_end_vrx() to abort if needed. - * - If dialing, abort dial. - */ -static int -ctc_tty_write(struct tty_struct *tty, const u_char * buf, int count) -{ - int c; - int total = 0; - ctc_tty_info *info = (ctc_tty_info *) tty->driver_data; - - DBF_TEXT(trace, 5, __FUNCTION__); - if (ctc_tty_shuttingdown) - goto ex; - if (ctc_tty_paranoia_check(info, tty->name, "ctc_tty_write")) - goto ex; - if (!tty) - goto ex; - if (!info->netdev) { - total = -ENODEV; - goto ex; - } - while (1) { - struct sk_buff *skb; - int skb_res; - - c = (count < CTC_TTY_XMIT_SIZE) ? count : CTC_TTY_XMIT_SIZE; - if (c <= 0) - break; - - skb_res = info->netdev->hard_header_len + sizeof(info->mcr) + - + sizeof(__u32); - skb = dev_alloc_skb(skb_res + c); - if (!skb) { - printk(KERN_WARNING - "ctc_tty: Out of memory in %s%d write\n", - CTC_TTY_NAME, info->line); - break; - } - skb_reserve(skb, skb_res); - memcpy(skb_put(skb, c), buf, c); - skb_queue_tail(&info->tx_queue, skb); - buf += c; - total += c; - count -= c; - } - if (!skb_queue_empty(&info->tx_queue)) { - info->lsr &= ~UART_LSR_TEMT; - tasklet_schedule(&info->tasklet); - } -ex: - DBF_TEXT(trace, 6, __FUNCTION__); - return total; -} - -static int -ctc_tty_write_room(struct tty_struct *tty) -{ - ctc_tty_info *info = (ctc_tty_info *) tty->driver_data; - - if (ctc_tty_paranoia_check(info, tty->name, "ctc_tty_write_room")) - return 0; - return CTC_TTY_XMIT_SIZE; -} - -static int -ctc_tty_chars_in_buffer(struct tty_struct *tty) -{ - ctc_tty_info *info = (ctc_tty_info *) tty->driver_data; - - if (ctc_tty_paranoia_check(info, tty->name, "ctc_tty_chars_in_buffer")) - return 0; - return 0; -} - -static void -ctc_tty_flush_buffer(struct tty_struct *tty) -{ - ctc_tty_info *info; - unsigned long flags; - - DBF_TEXT(trace, 4, __FUNCTION__); - if (!tty) - goto ex; - spin_lock_irqsave(&ctc_tty_lock, flags); - info = (ctc_tty_info *) tty->driver_data; - if (ctc_tty_paranoia_check(info, tty->name, "ctc_tty_flush_buffer")) { - spin_unlock_irqrestore(&ctc_tty_lock, flags); - goto ex; - } - skb_queue_purge(&info->tx_queue); - info->lsr |= UART_LSR_TEMT; - spin_unlock_irqrestore(&ctc_tty_lock, flags); - wake_up_interruptible(&tty->write_wait); - tty_wakeup(tty); -ex: - DBF_TEXT_(trace, 2, "ex: %s ", __FUNCTION__); - return; -} - -static void -ctc_tty_flush_chars(struct tty_struct *tty) -{ - ctc_tty_info *info = (ctc_tty_info *) tty->driver_data; - - DBF_TEXT(trace, 4, __FUNCTION__); - if (ctc_tty_shuttingdown) - return; - if (ctc_tty_paranoia_check(info, tty->name, "ctc_tty_flush_chars")) - return; - if (tty->stopped || tty->hw_stopped || skb_queue_empty(&info->tx_queue)) - return; - tasklet_schedule(&info->tasklet); -} - -/* - * ------------------------------------------------------------ - * ctc_tty_throttle() - * - * This routine is called by the upper-layer tty layer to signal that - * incoming characters should be throttled. - * ------------------------------------------------------------ - */ -static void -ctc_tty_throttle(struct tty_struct *tty) -{ - ctc_tty_info *info = (ctc_tty_info *) tty->driver_data; - - DBF_TEXT(trace, 4, __FUNCTION__); - if (ctc_tty_paranoia_check(info, tty->name, "ctc_tty_throttle")) - return; - info->mcr &= ~UART_MCR_RTS; - if (I_IXOFF(tty)) - ctc_tty_inject(info, STOP_CHAR(tty)); - ctc_tty_transmit_status(info); -} - -static void -ctc_tty_unthrottle(struct tty_struct *tty) -{ - ctc_tty_info *info = (ctc_tty_info *) tty->driver_data; - - DBF_TEXT(trace, 4, __FUNCTION__); - if (ctc_tty_paranoia_check(info, tty->name, "ctc_tty_unthrottle")) - return; - info->mcr |= UART_MCR_RTS; - if (I_IXOFF(tty)) - ctc_tty_inject(info, START_CHAR(tty)); - ctc_tty_transmit_status(info); -} - -/* - * ------------------------------------------------------------ - * ctc_tty_ioctl() and friends - * ------------------------------------------------------------ - */ - -/* - * ctc_tty_get_lsr_info - get line status register info - * - * Purpose: Let user call ioctl() to get info when the UART physically - * is emptied. On bus types like RS485, the transmitter must - * release the bus after transmitting. This must be done when - * the transmit shift register is empty, not be done when the - * transmit holding register is empty. This functionality - * allows RS485 driver to be written in user space. - */ -static int -ctc_tty_get_lsr_info(ctc_tty_info * info, uint __user *value) -{ - u_char status; - uint result; - ulong flags; - - DBF_TEXT(trace, 4, __FUNCTION__); - spin_lock_irqsave(&ctc_tty_lock, flags); - status = info->lsr; - spin_unlock_irqrestore(&ctc_tty_lock, flags); - result = ((status & UART_LSR_TEMT) ? TIOCSER_TEMT : 0); - put_user(result, value); - return 0; -} - - -static int ctc_tty_tiocmget(struct tty_struct *tty, struct file *file) -{ - ctc_tty_info *info = (ctc_tty_info *) tty->driver_data; - u_char control, - status; - uint result; - ulong flags; - - DBF_TEXT(trace, 4, __FUNCTION__); - if (ctc_tty_paranoia_check(info, tty->name, "ctc_tty_ioctl")) - return -ENODEV; - if (tty->flags & (1 << TTY_IO_ERROR)) - return -EIO; - - control = info->mcr; - spin_lock_irqsave(&ctc_tty_lock, flags); - status = info->msr; - spin_unlock_irqrestore(&ctc_tty_lock, flags); - result = ((control & UART_MCR_RTS) ? TIOCM_RTS : 0) - | ((control & UART_MCR_DTR) ? TIOCM_DTR : 0) - | ((status & UART_MSR_DCD) ? TIOCM_CAR : 0) - | ((status & UART_MSR_RI) ? TIOCM_RNG : 0) - | ((status & UART_MSR_DSR) ? TIOCM_DSR : 0) - | ((status & UART_MSR_CTS) ? TIOCM_CTS : 0); - return result; -} - -static int -ctc_tty_tiocmset(struct tty_struct *tty, struct file *file, - unsigned int set, unsigned int clear) -{ - ctc_tty_info *info = (ctc_tty_info *) tty->driver_data; - - DBF_TEXT(trace, 4, __FUNCTION__); - if (ctc_tty_paranoia_check(info, tty->name, "ctc_tty_ioctl")) - return -ENODEV; - if (tty->flags & (1 << TTY_IO_ERROR)) - return -EIO; - - if (set & TIOCM_RTS) - info->mcr |= UART_MCR_RTS; - if (set & TIOCM_DTR) - info->mcr |= UART_MCR_DTR; - - if (clear & TIOCM_RTS) - info->mcr &= ~UART_MCR_RTS; - if (clear & TIOCM_DTR) - info->mcr &= ~UART_MCR_DTR; - - if ((set | clear) & (TIOCM_RTS|TIOCM_DTR)) - ctc_tty_transmit_status(info); - return 0; -} - -static int -ctc_tty_ioctl(struct tty_struct *tty, struct file *file, - uint cmd, ulong arg) -{ - ctc_tty_info *info = (ctc_tty_info *) tty->driver_data; - int error; - int retval; - - DBF_TEXT(trace, 4, __FUNCTION__); - if (ctc_tty_paranoia_check(info, tty->name, "ctc_tty_ioctl")) - return -ENODEV; - if (tty->flags & (1 << TTY_IO_ERROR)) - return -EIO; - switch (cmd) { - case TCSBRK: /* SVID version: non-zero arg --> no break */ -#ifdef CTC_DEBUG_MODEM_IOCTL - printk(KERN_DEBUG "%s%d ioctl TCSBRK\n", CTC_TTY_NAME, info->line); -#endif - retval = tty_check_change(tty); - if (retval) - return retval; - tty_wait_until_sent(tty, 0); - return 0; - case TCSBRKP: /* support for POSIX tcsendbreak() */ -#ifdef CTC_DEBUG_MODEM_IOCTL - printk(KERN_DEBUG "%s%d ioctl TCSBRKP\n", CTC_TTY_NAME, info->line); -#endif - retval = tty_check_change(tty); - if (retval) - return retval; - tty_wait_until_sent(tty, 0); - return 0; - case TIOCGSOFTCAR: -#ifdef CTC_DEBUG_MODEM_IOCTL - printk(KERN_DEBUG "%s%d ioctl TIOCGSOFTCAR\n", CTC_TTY_NAME, - info->line); -#endif - error = put_user(C_CLOCAL(tty) ? 1 : 0, (ulong __user *) arg); - return error; - case TIOCSSOFTCAR: -#ifdef CTC_DEBUG_MODEM_IOCTL - printk(KERN_DEBUG "%s%d ioctl TIOCSSOFTCAR\n", CTC_TTY_NAME, - info->line); -#endif - error = get_user(arg, (ulong __user *) arg); - if (error) - return error; - tty->termios->c_cflag = - ((tty->termios->c_cflag & ~CLOCAL) | - (arg ? CLOCAL : 0)); - return 0; - case TIOCSERGETLSR: /* Get line status register */ -#ifdef CTC_DEBUG_MODEM_IOCTL - printk(KERN_DEBUG "%s%d ioctl TIOCSERGETLSR\n", CTC_TTY_NAME, - info->line); -#endif - if (access_ok(VERIFY_WRITE, (void __user *) arg, sizeof(uint))) - return ctc_tty_get_lsr_info(info, (uint __user *) arg); - else - return -EFAULT; - default: -#ifdef CTC_DEBUG_MODEM_IOCTL - printk(KERN_DEBUG "UNKNOWN ioctl 0x%08x on %s%d\n", cmd, - CTC_TTY_NAME, info->line); -#endif - return -ENOIOCTLCMD; - } - return 0; -} - -static void -ctc_tty_set_termios(struct tty_struct *tty, struct termios *old_termios) -{ - ctc_tty_info *info = (ctc_tty_info *) tty->driver_data; - unsigned int cflag = tty->termios->c_cflag; - - DBF_TEXT(trace, 4, __FUNCTION__); - ctc_tty_change_speed(info); - - /* Handle transition to B0 */ - if ((old_termios->c_cflag & CBAUD) && !(cflag & CBAUD)) { - info->mcr &= ~(UART_MCR_DTR|UART_MCR_RTS); - ctc_tty_transmit_status(info); - } - - /* Handle transition from B0 to other */ - if (!(old_termios->c_cflag & CBAUD) && (cflag & CBAUD)) { - info->mcr |= UART_MCR_DTR; - if (!(tty->termios->c_cflag & CRTSCTS) || - !test_bit(TTY_THROTTLED, &tty->flags)) { - info->mcr |= UART_MCR_RTS; - } - ctc_tty_transmit_status(info); - } - - /* Handle turning off CRTSCTS */ - if ((old_termios->c_cflag & CRTSCTS) && - !(tty->termios->c_cflag & CRTSCTS)) - tty->hw_stopped = 0; -} - -/* - * ------------------------------------------------------------ - * ctc_tty_open() and friends - * ------------------------------------------------------------ - */ -static int -ctc_tty_block_til_ready(struct tty_struct *tty, struct file *filp, ctc_tty_info *info) -{ - DECLARE_WAITQUEUE(wait, NULL); - int do_clocal = 0; - unsigned long flags; - int retval; - - DBF_TEXT(trace, 4, __FUNCTION__); - /* - * If the device is in the middle of being closed, then block - * until it's done, and then try again. - */ - if (tty_hung_up_p(filp) || - (info->flags & CTC_ASYNC_CLOSING)) { - if (info->flags & CTC_ASYNC_CLOSING) - wait_event(info->close_wait, - !(info->flags & CTC_ASYNC_CLOSING)); -#ifdef MODEM_DO_RESTART - if (info->flags & CTC_ASYNC_HUP_NOTIFY) - return -EAGAIN; - else - return -ERESTARTSYS; -#else - return -EAGAIN; -#endif - } - /* - * If non-blocking mode is set, then make the check up front - * and then exit. - */ - if ((filp->f_flags & O_NONBLOCK) || - (tty->flags & (1 << TTY_IO_ERROR))) { - info->flags |= CTC_ASYNC_NORMAL_ACTIVE; - return 0; - } - if (tty->termios->c_cflag & CLOCAL) - do_clocal = 1; - /* - * Block waiting for the carrier detect and the line to become - * free (i.e., not in use by the callout). While we are in - * this loop, info->count is dropped by one, so that - * ctc_tty_close() knows when to free things. We restore it upon - * exit, either normal or abnormal. - */ - retval = 0; - add_wait_queue(&info->open_wait, &wait); -#ifdef CTC_DEBUG_MODEM_OPEN - printk(KERN_DEBUG "ctc_tty_block_til_ready before block: %s%d, count = %d\n", - CTC_TTY_NAME, info->line, info->count); -#endif - spin_lock_irqsave(&ctc_tty_lock, flags); - if (!(tty_hung_up_p(filp))) - info->count--; - spin_unlock_irqrestore(&ctc_tty_lock, flags); - info->blocked_open++; - while (1) { - set_current_state(TASK_INTERRUPTIBLE); - if (tty_hung_up_p(filp) || - !(info->flags & CTC_ASYNC_INITIALIZED)) { -#ifdef MODEM_DO_RESTART - if (info->flags & CTC_ASYNC_HUP_NOTIFY) - retval = -EAGAIN; - else - retval = -ERESTARTSYS; -#else - retval = -EAGAIN; -#endif - break; - } - if (!(info->flags & CTC_ASYNC_CLOSING) && - (do_clocal || (info->msr & UART_MSR_DCD))) { - break; - } - if (signal_pending(current)) { - retval = -ERESTARTSYS; - break; - } -#ifdef CTC_DEBUG_MODEM_OPEN - printk(KERN_DEBUG "ctc_tty_block_til_ready blocking: %s%d, count = %d\n", - CTC_TTY_NAME, info->line, info->count); -#endif - schedule(); - } - current->state = TASK_RUNNING; - remove_wait_queue(&info->open_wait, &wait); - if (!tty_hung_up_p(filp)) - info->count++; - info->blocked_open--; -#ifdef CTC_DEBUG_MODEM_OPEN - printk(KERN_DEBUG "ctc_tty_block_til_ready after blocking: %s%d, count = %d\n", - CTC_TTY_NAME, info->line, info->count); -#endif - if (retval) - return retval; - info->flags |= CTC_ASYNC_NORMAL_ACTIVE; - return 0; -} - -/* - * This routine is called whenever a serial port is opened. It - * enables interrupts for a serial port, linking in its async structure into - * the IRQ chain. It also performs the serial-specific - * initialization for the tty structure. - */ -static int -ctc_tty_open(struct tty_struct *tty, struct file *filp) -{ - ctc_tty_info *info; - unsigned long saveflags; - int retval, - line; - - DBF_TEXT(trace, 3, __FUNCTION__); - line = tty->index; - if (line < 0 || line > CTC_TTY_MAX_DEVICES) - return -ENODEV; - info = &driver->info[line]; - if (ctc_tty_paranoia_check(info, tty->name, "ctc_tty_open")) - return -ENODEV; - if (!info->netdev) - return -ENODEV; -#ifdef CTC_DEBUG_MODEM_OPEN - printk(KERN_DEBUG "ctc_tty_open %s, count = %d\n", tty->name, - info->count); -#endif - spin_lock_irqsave(&ctc_tty_lock, saveflags); - info->count++; - tty->driver_data = info; - info->tty = tty; - spin_unlock_irqrestore(&ctc_tty_lock, saveflags); - /* - * Start up serial port - */ - retval = ctc_tty_startup(info); - if (retval) { -#ifdef CTC_DEBUG_MODEM_OPEN - printk(KERN_DEBUG "ctc_tty_open return after startup\n"); -#endif - return retval; - } - retval = ctc_tty_block_til_ready(tty, filp, info); - if (retval) { -#ifdef CTC_DEBUG_MODEM_OPEN - printk(KERN_DEBUG "ctc_tty_open return after ctc_tty_block_til_ready \n"); -#endif - return retval; - } -#ifdef CTC_DEBUG_MODEM_OPEN - printk(KERN_DEBUG "ctc_tty_open %s successful...\n", tty->name); -#endif - return 0; -} - -static void -ctc_tty_close(struct tty_struct *tty, struct file *filp) -{ - ctc_tty_info *info = (ctc_tty_info *) tty->driver_data; - ulong flags; - ulong timeout; - DBF_TEXT(trace, 3, __FUNCTION__); - if (!info || ctc_tty_paranoia_check(info, tty->name, "ctc_tty_close")) - return; - spin_lock_irqsave(&ctc_tty_lock, flags); - if (tty_hung_up_p(filp)) { - spin_unlock_irqrestore(&ctc_tty_lock, flags); -#ifdef CTC_DEBUG_MODEM_OPEN - printk(KERN_DEBUG "ctc_tty_close return after tty_hung_up_p\n"); -#endif - return; - } - if ((tty->count == 1) && (info->count != 1)) { - /* - * Uh, oh. tty->count is 1, which means that the tty - * structure will be freed. Info->count should always - * be one in these conditions. If it's greater than - * one, we've got real problems, since it means the - * serial port won't be shutdown. - */ - printk(KERN_ERR "ctc_tty_close: bad port count; tty->count is 1, " - "info->count is %d\n", info->count); - info->count = 1; - } - if (--info->count < 0) { - printk(KERN_ERR "ctc_tty_close: bad port count for %s%d: %d\n", - CTC_TTY_NAME, info->line, info->count); - info->count = 0; - } - if (info->count) { - local_irq_restore(flags); -#ifdef CTC_DEBUG_MODEM_OPEN - printk(KERN_DEBUG "ctc_tty_close after info->count != 0\n"); -#endif - return; - } - info->flags |= CTC_ASYNC_CLOSING; - tty->closing = 1; - /* - * At this point we stop accepting input. To do this, we - * disable the receive line status interrupts, and tell the - * interrupt driver to stop checking the data ready bit in the - * line status register. - */ - if (info->flags & CTC_ASYNC_INITIALIZED) { - tty_wait_until_sent(tty, 30*HZ); /* 30 seconds timeout */ - /* - * Before we drop DTR, make sure the UART transmitter - * has completely drained; this is especially - * important if there is a transmit FIFO! - */ - timeout = jiffies + HZ; - while (!(info->lsr & UART_LSR_TEMT)) { - spin_unlock_irqrestore(&ctc_tty_lock, flags); - msleep(500); - spin_lock_irqsave(&ctc_tty_lock, flags); - if (time_after(jiffies,timeout)) - break; - } - } - ctc_tty_shutdown(info); - if (tty->driver->flush_buffer) { - skb_queue_purge(&info->tx_queue); - info->lsr |= UART_LSR_TEMT; - } - tty_ldisc_flush(tty); - info->tty = 0; - tty->closing = 0; - if (info->blocked_open) { - msleep_interruptible(500); - wake_up_interruptible(&info->open_wait); - } - info->flags &= ~(CTC_ASYNC_NORMAL_ACTIVE | CTC_ASYNC_CLOSING); - wake_up_interruptible(&info->close_wait); - spin_unlock_irqrestore(&ctc_tty_lock, flags); -#ifdef CTC_DEBUG_MODEM_OPEN - printk(KERN_DEBUG "ctc_tty_close normal exit\n"); -#endif -} - -/* - * ctc_tty_hangup() --- called by tty_hangup() when a hangup is signaled. - */ -static void -ctc_tty_hangup(struct tty_struct *tty) -{ - ctc_tty_info *info = (ctc_tty_info *)tty->driver_data; - unsigned long saveflags; - DBF_TEXT(trace, 3, __FUNCTION__); - if (ctc_tty_paranoia_check(info, tty->name, "ctc_tty_hangup")) - return; - ctc_tty_shutdown(info); - info->count = 0; - info->flags &= ~CTC_ASYNC_NORMAL_ACTIVE; - spin_lock_irqsave(&ctc_tty_lock, saveflags); - info->tty = 0; - spin_unlock_irqrestore(&ctc_tty_lock, saveflags); - wake_up_interruptible(&info->open_wait); -} - - -/* - * For all online tty's, try sending data to - * the lower levels. - */ -static void -ctc_tty_task(unsigned long arg) -{ - ctc_tty_info *info = (void *)arg; - unsigned long saveflags; - int again; - - DBF_TEXT(trace, 3, __FUNCTION__); - spin_lock_irqsave(&ctc_tty_lock, saveflags); - if ((!ctc_tty_shuttingdown) && info) { - again = ctc_tty_tint(info); - if (!again) - info->lsr |= UART_LSR_TEMT; - again |= ctc_tty_readmodem(info); - if (again) { - tasklet_schedule(&info->tasklet); - } - } - spin_unlock_irqrestore(&ctc_tty_lock, saveflags); -} - -static struct tty_operations ctc_ops = { - .open = ctc_tty_open, - .close = ctc_tty_close, - .write = ctc_tty_write, - .flush_chars = ctc_tty_flush_chars, - .write_room = ctc_tty_write_room, - .chars_in_buffer = ctc_tty_chars_in_buffer, - .flush_buffer = ctc_tty_flush_buffer, - .ioctl = ctc_tty_ioctl, - .throttle = ctc_tty_throttle, - .unthrottle = ctc_tty_unthrottle, - .set_termios = ctc_tty_set_termios, - .hangup = ctc_tty_hangup, - .tiocmget = ctc_tty_tiocmget, - .tiocmset = ctc_tty_tiocmset, -}; - -int -ctc_tty_init(void) -{ - int i; - ctc_tty_info *info; - struct tty_driver *device; - - DBF_TEXT(trace, 2, __FUNCTION__); - driver = kmalloc(sizeof(ctc_tty_driver), GFP_KERNEL); - if (driver == NULL) { - printk(KERN_WARNING "Out of memory in ctc_tty_modem_init\n"); - return -ENOMEM; - } - memset(driver, 0, sizeof(ctc_tty_driver)); - device = alloc_tty_driver(CTC_TTY_MAX_DEVICES); - if (!device) { - kfree(driver); - printk(KERN_WARNING "Out of memory in ctc_tty_modem_init\n"); - return -ENOMEM; - } - - device->devfs_name = "ctc/" CTC_TTY_NAME; - device->name = CTC_TTY_NAME; - device->major = CTC_TTY_MAJOR; - device->minor_start = 0; - device->type = TTY_DRIVER_TYPE_SERIAL; - device->subtype = SERIAL_TYPE_NORMAL; - device->init_termios = tty_std_termios; - device->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; - device->flags = TTY_DRIVER_REAL_RAW; - device->driver_name = "ctc_tty", - tty_set_operations(device, &ctc_ops); - if (tty_register_driver(device)) { - printk(KERN_WARNING "ctc_tty: Couldn't register serial-device\n"); - put_tty_driver(device); - kfree(driver); - return -1; - } - driver->ctc_tty_device = device; - for (i = 0; i < CTC_TTY_MAX_DEVICES; i++) { - info = &driver->info[i]; - init_MUTEX(&info->write_sem); - tasklet_init(&info->tasklet, ctc_tty_task, - (unsigned long) info); - info->magic = CTC_ASYNC_MAGIC; - info->line = i; - info->tty = 0; - info->count = 0; - info->blocked_open = 0; - init_waitqueue_head(&info->open_wait); - init_waitqueue_head(&info->close_wait); - skb_queue_head_init(&info->tx_queue); - skb_queue_head_init(&info->rx_queue); - init_timer(&info->stoptimer); - info->stoptimer.function = ctc_tty_stopdev; - info->stoptimer.data = (unsigned long)info; - info->mcr = UART_MCR_RTS; - } - return 0; -} - -int -ctc_tty_register_netdev(struct net_device *dev) { - int ttynum; - char *err; - char *p; - - DBF_TEXT(trace, 2, __FUNCTION__); - if ((!dev) || (!dev->name)) { - printk(KERN_WARNING - "ctc_tty_register_netdev called " - "with NULL dev or NULL dev-name\n"); - return -1; - } - - /* - * If the name is a format string the caller wants us to - * do a name allocation : format string must end with %d - */ - if (strchr(dev->name, '%')) - { - int err = dev_alloc_name(dev, dev->name); // dev->name is changed by this - if (err < 0) { - printk(KERN_DEBUG "dev_alloc returned error %d\n", err); - return err; - } - - } - - for (p = dev->name; p && ((*p < '0') || (*p > '9')); p++); - ttynum = simple_strtoul(p, &err, 0); - if ((ttynum < 0) || (ttynum >= CTC_TTY_MAX_DEVICES) || - (err && *err)) { - printk(KERN_WARNING - "ctc_tty_register_netdev called " - "with number in name '%s'\n", dev->name); - return -1; - } - if (driver->info[ttynum].netdev) { - printk(KERN_WARNING - "ctc_tty_register_netdev called " - "for already registered device '%s'\n", - dev->name); - return -1; - } - driver->info[ttynum].netdev = dev; - return 0; -} - -void -ctc_tty_unregister_netdev(struct net_device *dev) { - int i; - unsigned long saveflags; - ctc_tty_info *info = NULL; - - DBF_TEXT(trace, 2, __FUNCTION__); - spin_lock_irqsave(&ctc_tty_lock, saveflags); - for (i = 0; i < CTC_TTY_MAX_DEVICES; i++) - if (driver->info[i].netdev == dev) { - info = &driver->info[i]; - break; - } - if (info) { - info->netdev = NULL; - skb_queue_purge(&info->tx_queue); - skb_queue_purge(&info->rx_queue); - } - spin_unlock_irqrestore(&ctc_tty_lock, saveflags); -} - -void -ctc_tty_cleanup(void) { - unsigned long saveflags; - - DBF_TEXT(trace, 2, __FUNCTION__); - spin_lock_irqsave(&ctc_tty_lock, saveflags); - ctc_tty_shuttingdown = 1; - spin_unlock_irqrestore(&ctc_tty_lock, saveflags); - tty_unregister_driver(driver->ctc_tty_device); - put_tty_driver(driver->ctc_tty_device); - kfree(driver); - driver = NULL; -} diff --git a/drivers/s390/net/ctctty.h b/drivers/s390/net/ctctty.h deleted file mode 100644 index 7254dc006..000000000 --- a/drivers/s390/net/ctctty.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * CTC / ESCON network driver, tty interface. - * - * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation - * Author(s): Fritz Elfert (elfert@de.ibm.com, felfert@millenux.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, 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 _CTCTTY_H_ -#define _CTCTTY_H_ - -#include -#include - -extern int ctc_tty_register_netdev(struct net_device *); -extern void ctc_tty_unregister_netdev(struct net_device *); -extern void ctc_tty_netif_rx(struct sk_buff *); -extern int ctc_tty_init(void); -extern void ctc_tty_cleanup(void); -extern void ctc_tty_setcarrier(struct net_device *, int); - -#endif diff --git a/drivers/s390/net/fsm.c b/drivers/s390/net/fsm.c index 7145e2134..2c1db8036 100644 --- a/drivers/s390/net/fsm.c +++ b/drivers/s390/net/fsm.c @@ -4,7 +4,6 @@ */ #include "fsm.h" -#include #include #include diff --git a/drivers/s390/net/iucv.c b/drivers/s390/net/iucv.c index e0c7deb98..821dde86e 100644 --- a/drivers/s390/net/iucv.c +++ b/drivers/s390/net/iucv.c @@ -33,7 +33,6 @@ #include #include -#include #include #include @@ -336,8 +335,8 @@ do { \ #else -#define iucv_debug(lvl, fmt, args...) -#define iucv_dumpit(title, buf, len) +#define iucv_debug(lvl, fmt, args...) do { } while (0) +#define iucv_dumpit(title, buf, len) do { } while (0) #endif @@ -693,7 +692,7 @@ iucv_retrieve_buffer (void) iucv_debug(1, "entering"); if (iucv_cpuid != -1) { smp_call_function_on(iucv_retrieve_buffer_cpuid, - 0, 0, 1, iucv_cpuid); + NULL, 0, 1, iucv_cpuid); /* Release the cpu reserved by iucv_declare_buffer. */ smp_put_cpu(iucv_cpuid); iucv_cpuid = -1; diff --git a/drivers/s390/net/lcs.c b/drivers/s390/net/lcs.c index f94419b33..16ac68c27 100644 --- a/drivers/s390/net/lcs.c +++ b/drivers/s390/net/lcs.c @@ -670,9 +670,8 @@ lcs_ready_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer) int index, rc; LCS_DBF_TEXT(5, trace, "rdybuff"); - if (buffer->state != BUF_STATE_LOCKED && - buffer->state != BUF_STATE_PROCESSED) - BUG(); + BUG_ON(buffer->state != BUF_STATE_LOCKED && + buffer->state != BUF_STATE_PROCESSED); spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags); buffer->state = BUF_STATE_READY; index = buffer - channel->iob; @@ -696,8 +695,7 @@ __lcs_processed_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer) int index, prev, next; LCS_DBF_TEXT(5, trace, "prcsbuff"); - if (buffer->state != BUF_STATE_READY) - BUG(); + BUG_ON(buffer->state != BUF_STATE_READY); buffer->state = BUF_STATE_PROCESSED; index = buffer - channel->iob; prev = (index - 1) & (LCS_NUM_BUFFS - 1); @@ -729,9 +727,8 @@ lcs_release_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer) unsigned long flags; LCS_DBF_TEXT(5, trace, "relbuff"); - if (buffer->state != BUF_STATE_LOCKED && - buffer->state != BUF_STATE_PROCESSED) - BUG(); + BUG_ON(buffer->state != BUF_STATE_LOCKED && + buffer->state != BUF_STATE_PROCESSED); spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags); buffer->state = BUF_STATE_EMPTY; spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags); @@ -1140,10 +1137,9 @@ list_modified: } } /* re-insert all entries from the failed_list into ipm_list */ - list_for_each_entry_safe(ipm, tmp, &failed_list, list) { - list_del_init(&ipm->list); - list_add_tail(&ipm->list, &card->ipm_list); - } + list_for_each_entry_safe(ipm, tmp, &failed_list, list) + list_move_tail(&ipm->list, &card->ipm_list); + spin_unlock_irqrestore(&card->ipm_lock, flags); } diff --git a/drivers/s390/net/netiucv.c b/drivers/s390/net/netiucv.c index b452cc1af..d7d1cc0a5 100644 --- a/drivers/s390/net/netiucv.c +++ b/drivers/s390/net/netiucv.c @@ -112,7 +112,12 @@ struct iucv_connection { /** * Linked list of all connection structs. */ -static struct iucv_connection *iucv_connections; +struct iucv_connection_struct { + struct iucv_connection *iucv_connections; + rwlock_t iucv_rwlock; +}; + +static struct iucv_connection_struct iucv_conns; /** * Representation of event-data for the @@ -1368,8 +1373,10 @@ user_write (struct device *dev, struct device_attribute *attr, const char *buf, struct net_device *ndev = priv->conn->netdev; char *p; char *tmp; - char username[10]; + char username[9]; int i; + struct iucv_connection **clist = &iucv_conns.iucv_connections; + unsigned long flags; IUCV_DBF_TEXT(trace, 3, __FUNCTION__); if (count>9) { @@ -1382,7 +1389,7 @@ user_write (struct device *dev, struct device_attribute *attr, const char *buf, tmp = strsep((char **) &buf, "\n"); for (i=0, p=tmp; i<8 && *p; i++, p++) { if (isalnum(*p) || (*p == '$')) - username[i]= *p; + username[i]= toupper(*p); else if (*p == '\n') { /* trailing lf, grr */ break; @@ -1395,11 +1402,11 @@ user_write (struct device *dev, struct device_attribute *attr, const char *buf, return -EINVAL; } } - while (i<9) + while (i<8) username[i++] = ' '; - username[9] = '\0'; + username[8] = '\0'; - if (memcmp(username, priv->conn->userid, 8)) { + if (memcmp(username, priv->conn->userid, 9)) { /* username changed */ if (ndev->flags & (IFF_UP | IFF_RUNNING)) { PRINT_WARN( @@ -1410,6 +1417,19 @@ user_write (struct device *dev, struct device_attribute *attr, const char *buf, return -EBUSY; } } + read_lock_irqsave(&iucv_conns.iucv_rwlock, flags); + while (*clist) { + if (!strncmp(username, (*clist)->userid, 9) || + ((*clist)->netdev != ndev)) + break; + clist = &((*clist)->next); + } + read_unlock_irqrestore(&iucv_conns.iucv_rwlock, flags); + if (*clist) { + PRINT_WARN("netiucv: Connection to %s already exists\n", + username); + return -EEXIST; + } memcpy(priv->conn->userid, username, 9); return count; @@ -1781,13 +1801,15 @@ netiucv_unregister_device(struct device *dev) static struct iucv_connection * netiucv_new_connection(struct net_device *dev, char *username) { - struct iucv_connection **clist = &iucv_connections; + unsigned long flags; + struct iucv_connection **clist = &iucv_conns.iucv_connections; struct iucv_connection *conn = kzalloc(sizeof(struct iucv_connection), GFP_KERNEL); if (conn) { skb_queue_head_init(&conn->collect_queue); skb_queue_head_init(&conn->commit_queue); + spin_lock_init(&conn->collect_lock); conn->max_buffsize = NETIUCV_BUFSIZE_DEFAULT; conn->netdev = dev; @@ -1822,8 +1844,10 @@ netiucv_new_connection(struct net_device *dev, char *username) fsm_newstate(conn->fsm, CONN_STATE_STOPPED); } + write_lock_irqsave(&iucv_conns.iucv_rwlock, flags); conn->next = *clist; *clist = conn; + write_unlock_irqrestore(&iucv_conns.iucv_rwlock, flags); } return conn; } @@ -1835,14 +1859,17 @@ netiucv_new_connection(struct net_device *dev, char *username) static void netiucv_remove_connection(struct iucv_connection *conn) { - struct iucv_connection **clist = &iucv_connections; + struct iucv_connection **clist = &iucv_conns.iucv_connections; + unsigned long flags; IUCV_DBF_TEXT(trace, 3, __FUNCTION__); if (conn == NULL) return; + write_lock_irqsave(&iucv_conns.iucv_rwlock, flags); while (*clist) { if (*clist == conn) { *clist = conn->next; + write_unlock_irqrestore(&iucv_conns.iucv_rwlock, flags); if (conn->handle) { iucv_unregister_program(conn->handle); conn->handle = NULL; @@ -1855,6 +1882,7 @@ netiucv_remove_connection(struct iucv_connection *conn) } clist = &((*clist)->next); } + write_unlock_irqrestore(&iucv_conns.iucv_rwlock, flags); } /** @@ -1947,9 +1975,11 @@ static ssize_t conn_write(struct device_driver *drv, const char *buf, size_t count) { char *p; - char username[10]; + char username[9]; int i, ret; struct net_device *dev; + struct iucv_connection **clist = &iucv_conns.iucv_connections; + unsigned long flags; IUCV_DBF_TEXT(trace, 3, __FUNCTION__); if (count>9) { @@ -1960,7 +1990,7 @@ conn_write(struct device_driver *drv, const char *buf, size_t count) for (i=0, p=(char *)buf; i<8 && *p; i++, p++) { if (isalnum(*p) || (*p == '$')) - username[i]= *p; + username[i]= toupper(*p); else if (*p == '\n') { /* trailing lf, grr */ break; @@ -1971,9 +2001,22 @@ conn_write(struct device_driver *drv, const char *buf, size_t count) return -EINVAL; } } - while (i<9) + while (i<8) username[i++] = ' '; - username[9] = '\0'; + username[8] = '\0'; + + read_lock_irqsave(&iucv_conns.iucv_rwlock, flags); + while (*clist) { + if (!strncmp(username, (*clist)->userid, 9)) + break; + clist = &((*clist)->next); + } + read_unlock_irqrestore(&iucv_conns.iucv_rwlock, flags); + if (*clist) { + PRINT_WARN("netiucv: Connection to %s already exists\n", + username); + return -EEXIST; + } dev = netiucv_init_netdevice(username); if (!dev) { PRINT_WARN( @@ -2015,7 +2058,8 @@ DRIVER_ATTR(connection, 0200, NULL, conn_write); static ssize_t remove_write (struct device_driver *drv, const char *buf, size_t count) { - struct iucv_connection **clist = &iucv_connections; + struct iucv_connection **clist = &iucv_conns.iucv_connections; + unsigned long flags; struct net_device *ndev; struct netiucv_priv *priv; struct device *dev; @@ -2026,10 +2070,10 @@ remove_write (struct device_driver *drv, const char *buf, size_t count) IUCV_DBF_TEXT(trace, 3, __FUNCTION__); if (count >= IFNAMSIZ) - count = IFNAMSIZ-1; + count = IFNAMSIZ - 1;; for (i=0, p=(char *)buf; inetdev; priv = (struct netiucv_priv*)ndev->priv; @@ -2047,6 +2092,7 @@ remove_write (struct device_driver *drv, const char *buf, size_t count) clist = &((*clist)->next); continue; } + read_unlock_irqrestore(&iucv_conns.iucv_rwlock, flags); if (ndev->flags & (IFF_UP | IFF_RUNNING)) { PRINT_WARN( "netiucv: net device %s active with peer %s\n", @@ -2060,6 +2106,7 @@ remove_write (struct device_driver *drv, const char *buf, size_t count) netiucv_unregister_device(dev); return count; } + read_unlock_irqrestore(&iucv_conns.iucv_rwlock, flags); PRINT_WARN("netiucv: net device %s unknown\n", name); IUCV_DBF_TEXT(data, 2, "remove_write: unknown device\n"); return -EINVAL; @@ -2077,8 +2124,8 @@ static void __exit netiucv_exit(void) { IUCV_DBF_TEXT(trace, 3, __FUNCTION__); - while (iucv_connections) { - struct net_device *ndev = iucv_connections->netdev; + while (iucv_conns.iucv_connections) { + struct net_device *ndev = iucv_conns.iucv_connections->netdev; struct netiucv_priv *priv = (struct netiucv_priv*)ndev->priv; struct device *dev = priv->dev; @@ -2120,6 +2167,7 @@ netiucv_init(void) if (!ret) { ret = driver_create_file(&netiucv_driver, &driver_attr_remove); netiucv_banner(); + rwlock_init(&iucv_conns.iucv_rwlock); } else { PRINT_ERR("NETIUCV: failed to add driver attribute.\n"); IUCV_DBF_TEXT_(setup, 2, "ret %d from driver_create_file\n", ret); diff --git a/drivers/s390/net/qeth.h b/drivers/s390/net/qeth.h index 619f4a0c7..821383d8c 100644 --- a/drivers/s390/net/qeth.h +++ b/drivers/s390/net/qeth.h @@ -176,7 +176,6 @@ extern struct ccwgroup_driver qeth_ccwgroup_driver; /** * card stuff */ -#ifdef CONFIG_QETH_PERF_STATS struct qeth_perf_stats { unsigned int bufs_rec; unsigned int bufs_sent; @@ -211,8 +210,10 @@ struct qeth_perf_stats { unsigned int large_send_cnt; unsigned int sg_skbs_sent; unsigned int sg_frags_sent; + /* initial values when measuring starts */ + unsigned long initial_rx_packets; + unsigned long initial_tx_packets; }; -#endif /* CONFIG_QETH_PERF_STATS */ /* Routing stuff */ struct qeth_routing_info { @@ -462,6 +463,7 @@ enum qeth_qdio_info_states { QETH_QDIO_UNINITIALIZED, QETH_QDIO_ALLOCATED, QETH_QDIO_ESTABLISHED, + QETH_QDIO_CLEANING }; struct qeth_buffer_pool_entry { @@ -536,7 +538,7 @@ struct qeth_qdio_out_q { } __attribute__ ((aligned(256))); struct qeth_qdio_info { - volatile enum qeth_qdio_info_states state; + atomic_t state; /* input */ struct qeth_qdio_q *in_q; struct qeth_qdio_buffer_pool in_buf_pool; @@ -767,6 +769,7 @@ struct qeth_card_options { int fake_ll; int layer2; enum qeth_large_send_types large_send; + int performance_stats; }; /* @@ -819,9 +822,7 @@ struct qeth_card { struct list_head cmd_waiter_list; /* QDIO buffer handling */ struct qeth_qdio_info qdio; -#ifdef CONFIG_QETH_PERF_STATS struct qeth_perf_stats perf_stats; -#endif /* CONFIG_QETH_PERF_STATS */ int use_hard_stop; int (*orig_hard_header)(struct sk_buff *,struct net_device *, unsigned short,void *,void *,unsigned); @@ -859,23 +860,18 @@ qeth_get_ipa_adp_type(enum qeth_link_types link_type) } } -static inline int -qeth_realloc_headroom(struct qeth_card *card, struct sk_buff **skb, int size) +static inline struct sk_buff * +qeth_realloc_headroom(struct qeth_card *card, struct sk_buff *skb, int size) { - struct sk_buff *new_skb = NULL; - - if (skb_headroom(*skb) < size){ - new_skb = skb_realloc_headroom(*skb, size); - if (!new_skb) { - PRINT_ERR("qeth_prepare_skb: could " - "not realloc headroom for qeth_hdr " - "on interface %s", QETH_CARD_IFNAME(card)); - return -ENOMEM; - } - kfree_skb(*skb); - *skb = new_skb; - } - return 0; + struct sk_buff *new_skb = skb; + + if (skb_headroom(skb) >= size) + return skb; + new_skb = skb_realloc_headroom(skb, size); + if (!new_skb) + PRINT_ERR("Could not realloc headroom for qeth_hdr " + "on interface %s", QETH_CARD_IFNAME(card)); + return new_skb; } static inline struct sk_buff * @@ -885,16 +881,15 @@ qeth_pskb_unshare(struct sk_buff *skb, int pri) if (!skb_cloned(skb)) return skb; nskb = skb_copy(skb, pri); - kfree_skb(skb); /* free our shared copy */ return nskb; } static inline void * -qeth_push_skb(struct qeth_card *card, struct sk_buff **skb, int size) +qeth_push_skb(struct qeth_card *card, struct sk_buff *skb, int size) { void *hdr; - hdr = (void *) skb_push(*skb, size); + hdr = (void *) skb_push(skb, size); /* * sanity check, the Linux memory allocation scheme should * never present us cases like this one (the qdio header size plus @@ -903,8 +898,7 @@ qeth_push_skb(struct qeth_card *card, struct sk_buff **skb, int size) if ((((unsigned long) hdr) & (~(PAGE_SIZE - 1))) != (((unsigned long) hdr + size + QETH_IP_HEADER_SIZE) & (~(PAGE_SIZE - 1)))) { - PRINT_ERR("qeth_prepare_skb: misaligned " - "packet on interface %s. Discarded.", + PRINT_ERR("Misaligned packet on interface %s. Discarded.", QETH_CARD_IFNAME(card)); return NULL; } @@ -1056,13 +1050,11 @@ qeth_get_arphdr_type(int cardtype, int linktype) } } -#ifdef CONFIG_QETH_PERF_STATS static inline int qeth_get_micros(void) { return (int) (get_clock() >> 12); } -#endif static inline int qeth_get_qdio_q_format(struct qeth_card *card) @@ -1096,10 +1088,11 @@ qeth_string_to_ipaddr4(const char *buf, __u8 *addr) { int count = 0, rc = 0; int in[4]; + char c; - rc = sscanf(buf, "%d.%d.%d.%d%n", - &in[0], &in[1], &in[2], &in[3], &count); - if (rc != 4 || count<=0) + rc = sscanf(buf, "%u.%u.%u.%u%c", + &in[0], &in[1], &in[2], &in[3], &c); + if (rc != 4 && (rc != 5 || c != '\n')) return -EINVAL; for (count = 0; count < 4; count++) { if (in[count] > 255) @@ -1123,24 +1116,28 @@ qeth_ipaddr6_to_string(const __u8 *addr, char *buf) static inline int qeth_string_to_ipaddr6(const char *buf, __u8 *addr) { - char *end, *start; + const char *end, *end_tmp, *start; __u16 *in; char num[5]; int num2, cnt, out, found, save_cnt; unsigned short in_tmp[8] = {0, }; cnt = out = found = save_cnt = num2 = 0; - end = start = (char *) buf; + end = start = buf; in = (__u16 *) addr; memset(in, 0, 16); - while (end) { - end = strchr(end,':'); + while (*end) { + end = strchr(start,':'); if (end == NULL) { - end = (char *)buf + (strlen(buf)); - out = 1; + end = buf + strlen(buf); + if ((end_tmp = strchr(start, '\n')) != NULL) + end = end_tmp; + out = 1; } if ((end - start)) { memset(num, 0, 5); + if ((end - start) > 4) + return -EINVAL; memcpy(num, start, end - start); if (!qeth_isxdigit(num)) return -EINVAL; @@ -1158,6 +1155,8 @@ qeth_string_to_ipaddr6(const char *buf, __u8 *addr) } start = ++end; } + if (cnt + save_cnt > 8) + return -EINVAL; cnt = 7; while (save_cnt) in[cnt--] = in_tmp[--save_cnt]; diff --git a/drivers/s390/net/qeth_eddp.c b/drivers/s390/net/qeth_eddp.c index 38aad8321..a363721cf 100644 --- a/drivers/s390/net/qeth_eddp.c +++ b/drivers/s390/net/qeth_eddp.c @@ -8,7 +8,6 @@ * Author(s): Thomas Spatzier * */ -#include #include #include #include @@ -180,9 +179,8 @@ out_check: flush_cnt++; } } else { -#ifdef CONFIG_QETH_PERF_STATS - queue->card->perf_stats.skbs_sent_pack++; -#endif + if (queue->card->options.performance_stats) + queue->card->perf_stats.skbs_sent_pack++; QETH_DBF_TEXT(trace, 6, "fillbfpa"); if (buf->next_element_to_fill >= QETH_MAX_BUFFER_ELEMENTS(queue->card)) { diff --git a/drivers/s390/net/qeth_main.c b/drivers/s390/net/qeth_main.c index 290866932..5613b4564 100644 --- a/drivers/s390/net/qeth_main.c +++ b/drivers/s390/net/qeth_main.c @@ -27,7 +27,6 @@ */ -#include #include #include #include @@ -85,6 +84,8 @@ static debug_info_t *qeth_dbf_qerr = NULL; DEFINE_PER_CPU(char[256], qeth_dbf_txt_buf); +static struct lock_class_key qdio_out_skb_queue_key; + /** * some more definitions and declarations */ @@ -1072,6 +1073,7 @@ qeth_set_intial_options(struct qeth_card *card) card->options.layer2 = 1; else card->options.layer2 = 0; + card->options.performance_stats = 1; } /** @@ -1707,6 +1709,7 @@ 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: @@ -2463,24 +2466,6 @@ qeth_rebuild_skb_fake_ll(struct qeth_card *card, struct sk_buff *skb, qeth_rebuild_skb_fake_ll_eth(card, skb, hdr); } -static inline void -qeth_rebuild_skb_vlan(struct qeth_card *card, struct sk_buff *skb, - struct qeth_hdr *hdr) -{ -#ifdef CONFIG_QETH_VLAN - u16 *vlan_tag; - - if (hdr->hdr.l3.ext_flags & - (QETH_HDR_EXT_VLAN_FRAME | QETH_HDR_EXT_INCLUDE_VLAN_TAG)) { - vlan_tag = (u16 *) skb_push(skb, VLAN_HLEN); - *vlan_tag = (hdr->hdr.l3.ext_flags & QETH_HDR_EXT_VLAN_FRAME)? - hdr->hdr.l3.vlan_id : *((u16 *)&hdr->hdr.l3.dest_addr[12]); - *(vlan_tag + 1) = skb->protocol; - skb->protocol = __constant_htons(ETH_P_8021Q); - } -#endif /* CONFIG_QETH_VLAN */ -} - static inline __u16 qeth_layer2_rebuild_skb(struct qeth_card *card, struct sk_buff *skb, struct qeth_hdr *hdr) @@ -2509,15 +2494,16 @@ qeth_layer2_rebuild_skb(struct qeth_card *card, struct sk_buff *skb, return vlan_id; } -static inline void +static inline __u16 qeth_rebuild_skb(struct qeth_card *card, struct sk_buff *skb, struct qeth_hdr *hdr) { + unsigned short vlan_id = 0; #ifdef CONFIG_QETH_IPV6 if (hdr->hdr.l3.flags & QETH_HDR_PASSTHRU) { skb->pkt_type = PACKET_HOST; skb->protocol = qeth_type_trans(skb, card->dev); - return; + return 0; } #endif /* CONFIG_QETH_IPV6 */ skb->protocol = htons((hdr->hdr.l3.flags & QETH_HDR_IPV6)? ETH_P_IPV6 : @@ -2539,7 +2525,13 @@ qeth_rebuild_skb(struct qeth_card *card, struct sk_buff *skb, default: skb->pkt_type = PACKET_HOST; } - qeth_rebuild_skb_vlan(card, skb, hdr); + + if (hdr->hdr.l3.ext_flags & + (QETH_HDR_EXT_VLAN_FRAME | QETH_HDR_EXT_INCLUDE_VLAN_TAG)) { + vlan_id = (hdr->hdr.l3.ext_flags & QETH_HDR_EXT_VLAN_FRAME)? + hdr->hdr.l3.vlan_id : *((u16 *)&hdr->hdr.l3.dest_addr[12]); + } + if (card->options.fake_ll) qeth_rebuild_skb_fake_ll(card, skb, hdr); else @@ -2555,6 +2547,7 @@ qeth_rebuild_skb(struct qeth_card *card, struct sk_buff *skb, else skb->ip_summed = SW_CHECKSUMMING; } + return vlan_id; } static inline void @@ -2567,20 +2560,20 @@ qeth_process_inbound_buffer(struct qeth_card *card, int offset; int rxrc; __u16 vlan_tag = 0; + __u16 *vlan_addr; /* get first element of current buffer */ element = (struct qdio_buffer_element *)&buf->buffer->element[0]; offset = 0; -#ifdef CONFIG_QETH_PERF_STATS - card->perf_stats.bufs_rec++; -#endif + if (card->options.performance_stats) + card->perf_stats.bufs_rec++; while((skb = qeth_get_next_skb(card, buf->buffer, &element, &offset, &hdr))) { skb->dev = card->dev; if (hdr->hdr.l2.id == QETH_HEADER_TYPE_LAYER2) vlan_tag = qeth_layer2_rebuild_skb(card, skb, hdr); else if (hdr->hdr.l3.id == QETH_HEADER_TYPE_LAYER3) - qeth_rebuild_skb(card, skb, hdr); + vlan_tag = qeth_rebuild_skb(card, skb, hdr); else { /*in case of OSN*/ skb_push(skb, sizeof(struct qeth_hdr)); memcpy(skb->data, hdr, sizeof(struct qeth_hdr)); @@ -2590,14 +2583,19 @@ qeth_process_inbound_buffer(struct qeth_card *card, dev_kfree_skb_any(skb); continue; } + if (card->info.type == QETH_CARD_TYPE_OSN) + rxrc = card->osn_info.data_cb(skb); + else #ifdef CONFIG_QETH_VLAN if (vlan_tag) - vlan_hwaccel_rx(skb, card->vlangrp, vlan_tag); + if (card->vlangrp) + vlan_hwaccel_rx(skb, card->vlangrp, vlan_tag); + else { + dev_kfree_skb_any(skb); + continue; + } else #endif - if (card->info.type == QETH_CARD_TYPE_OSN) - rxrc = card->osn_info.data_cb(skb); - else rxrc = netif_rx(skb); card->dev->last_rx = jiffies; card->stats.rx_packets++; @@ -2625,7 +2623,7 @@ qeth_init_input_buffer(struct qeth_card *card, struct qeth_qdio_buffer *buf) { struct qeth_buffer_pool_entry *pool_entry; int i; - + pool_entry = qeth_get_buffer_pool_entry(card); /* * since the buffer is accessed only from the input_tasklet @@ -2699,17 +2697,18 @@ qeth_queue_input_buffer(struct qeth_card *card, int index) * 'index') un-requeued -> this buffer is the first buffer that * will be requeued the next time */ -#ifdef CONFIG_QETH_PERF_STATS - card->perf_stats.inbound_do_qdio_cnt++; - card->perf_stats.inbound_do_qdio_start_time = qeth_get_micros(); -#endif + if (card->options.performance_stats) { + card->perf_stats.inbound_do_qdio_cnt++; + card->perf_stats.inbound_do_qdio_start_time = + qeth_get_micros(); + } rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT | QDIO_FLAG_UNDER_INTERRUPT, 0, queue->next_buf_to_init, count, NULL); -#ifdef CONFIG_QETH_PERF_STATS - card->perf_stats.inbound_do_qdio_time += qeth_get_micros() - - card->perf_stats.inbound_do_qdio_start_time; -#endif + if (card->options.performance_stats) + card->perf_stats.inbound_do_qdio_time += + qeth_get_micros() - + card->perf_stats.inbound_do_qdio_start_time; if (rc){ PRINT_WARN("qeth_queue_input_buffer's do_QDIO " "return %i (device %s).\n", @@ -2745,10 +2744,10 @@ qeth_qdio_input_handler(struct ccw_device * ccwdev, unsigned int status, QETH_DBF_TEXT(trace, 6, "qdinput"); card = (struct qeth_card *) card_ptr; net_dev = card->dev; -#ifdef CONFIG_QETH_PERF_STATS - card->perf_stats.inbound_cnt++; - card->perf_stats.inbound_start_time = qeth_get_micros(); -#endif + if (card->options.performance_stats) { + card->perf_stats.inbound_cnt++; + card->perf_stats.inbound_start_time = qeth_get_micros(); + } if (status & QDIO_STATUS_LOOK_FOR_ERROR) { if (status & QDIO_STATUS_ACTIVATE_CHECK_CONDITION){ QETH_DBF_TEXT(trace, 1,"qdinchk"); @@ -2770,10 +2769,9 @@ qeth_qdio_input_handler(struct ccw_device * ccwdev, unsigned int status, qeth_put_buffer_pool_entry(card, buffer->pool_entry); qeth_queue_input_buffer(card, index); } -#ifdef CONFIG_QETH_PERF_STATS - card->perf_stats.inbound_time += qeth_get_micros() - - card->perf_stats.inbound_start_time; -#endif + if (card->options.performance_stats) + card->perf_stats.inbound_time += qeth_get_micros() - + card->perf_stats.inbound_start_time; } static inline int @@ -2863,10 +2861,11 @@ qeth_flush_buffers(struct qeth_qdio_out_q *queue, int under_int, } queue->card->dev->trans_start = jiffies; -#ifdef CONFIG_QETH_PERF_STATS - queue->card->perf_stats.outbound_do_qdio_cnt++; - queue->card->perf_stats.outbound_do_qdio_start_time = qeth_get_micros(); -#endif + if (queue->card->options.performance_stats) { + queue->card->perf_stats.outbound_do_qdio_cnt++; + queue->card->perf_stats.outbound_do_qdio_start_time = + qeth_get_micros(); + } if (under_int) rc = do_QDIO(CARD_DDEV(queue->card), QDIO_FLAG_SYNC_OUTPUT | QDIO_FLAG_UNDER_INTERRUPT, @@ -2874,10 +2873,10 @@ qeth_flush_buffers(struct qeth_qdio_out_q *queue, int under_int, else rc = do_QDIO(CARD_DDEV(queue->card), QDIO_FLAG_SYNC_OUTPUT, queue->queue_no, index, count, NULL); -#ifdef CONFIG_QETH_PERF_STATS - queue->card->perf_stats.outbound_do_qdio_time += qeth_get_micros() - - queue->card->perf_stats.outbound_do_qdio_start_time; -#endif + if (queue->card->options.performance_stats) + queue->card->perf_stats.outbound_do_qdio_time += + qeth_get_micros() - + queue->card->perf_stats.outbound_do_qdio_start_time; if (rc){ QETH_DBF_TEXT(trace, 2, "flushbuf"); QETH_DBF_TEXT_(trace, 2, " err%d", rc); @@ -2889,9 +2888,8 @@ qeth_flush_buffers(struct qeth_qdio_out_q *queue, int under_int, return; } atomic_add(count, &queue->used_buffers); -#ifdef CONFIG_QETH_PERF_STATS - queue->card->perf_stats.bufs_sent += count; -#endif + if (queue->card->options.performance_stats) + queue->card->perf_stats.bufs_sent += count; } /* @@ -2906,9 +2904,8 @@ qeth_switch_to_packing_if_needed(struct qeth_qdio_out_q *queue) >= QETH_HIGH_WATERMARK_PACK){ /* switch non-PACKING -> PACKING */ QETH_DBF_TEXT(trace, 6, "np->pack"); -#ifdef CONFIG_QETH_PERF_STATS - queue->card->perf_stats.sc_dp_p++; -#endif + if (queue->card->options.performance_stats) + queue->card->perf_stats.sc_dp_p++; queue->do_pack = 1; } } @@ -2931,9 +2928,8 @@ qeth_switch_to_nonpacking_if_needed(struct qeth_qdio_out_q *queue) <= QETH_LOW_WATERMARK_PACK) { /* switch PACKING -> non-PACKING */ QETH_DBF_TEXT(trace, 6, "pack->np"); -#ifdef CONFIG_QETH_PERF_STATS - queue->card->perf_stats.sc_p_dp++; -#endif + if (queue->card->options.performance_stats) + queue->card->perf_stats.sc_p_dp++; queue->do_pack = 0; /* flush packing buffers */ buffer = &queue->bufs[queue->next_buf_to_fill]; @@ -2945,7 +2941,7 @@ qeth_switch_to_nonpacking_if_needed(struct qeth_qdio_out_q *queue) queue->next_buf_to_fill = (queue->next_buf_to_fill + 1) % QDIO_MAX_BUFFERS_PER_Q; - } + } } } return flush_count; @@ -3001,11 +2997,10 @@ qeth_check_outbound_queue(struct qeth_qdio_out_q *queue) !atomic_read(&queue->set_pci_flags_count)) flush_cnt += qeth_flush_buffers_on_no_pci(queue); -#ifdef CONFIG_QETH_PERF_STATS - if (q_was_packing) + if (queue->card->options.performance_stats && + q_was_packing) queue->card->perf_stats.bufs_sent_pack += flush_cnt; -#endif if (flush_cnt) qeth_flush_buffers(queue, 1, index, flush_cnt); atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED); @@ -3035,10 +3030,11 @@ qeth_qdio_output_handler(struct ccw_device * ccwdev, unsigned int status, return; } } -#ifdef CONFIG_QETH_PERF_STATS - card->perf_stats.outbound_handler_cnt++; - card->perf_stats.outbound_handler_start_time = qeth_get_micros(); -#endif + if (card->options.performance_stats) { + card->perf_stats.outbound_handler_cnt++; + card->perf_stats.outbound_handler_start_time = + qeth_get_micros(); + } 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 */ @@ -3057,10 +3053,9 @@ qeth_qdio_output_handler(struct ccw_device * ccwdev, unsigned int status, qeth_check_outbound_queue(queue); netif_wake_queue(queue->card->dev); -#ifdef CONFIG_QETH_PERF_STATS - card->perf_stats.outbound_handler_time += qeth_get_micros() - - card->perf_stats.outbound_handler_start_time; -#endif + if (card->options.performance_stats) + card->perf_stats.outbound_handler_time += qeth_get_micros() - + card->perf_stats.outbound_handler_start_time; } static void @@ -3184,13 +3179,14 @@ qeth_alloc_qdio_buffers(struct qeth_card *card) QETH_DBF_TEXT(setup, 2, "allcqdbf"); - if (card->qdio.state == QETH_QDIO_ALLOCATED) + if (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_UNINITIALIZED, + QETH_QDIO_ALLOCATED) != QETH_QDIO_UNINITIALIZED) return 0; card->qdio.in_q = kmalloc(sizeof(struct qeth_qdio_q), GFP_KERNEL|GFP_DMA); if (!card->qdio.in_q) - return - ENOMEM; + goto out_nomem; QETH_DBF_TEXT(setup, 2, "inq"); QETH_DBF_HEX(setup, 2, &card->qdio.in_q, sizeof(void *)); memset(card->qdio.in_q, 0, sizeof(struct qeth_qdio_q)); @@ -3199,27 +3195,19 @@ qeth_alloc_qdio_buffers(struct qeth_card *card) card->qdio.in_q->bufs[i].buffer = &card->qdio.in_q->qdio_bufs[i]; /* inbound buffer pool */ - if (qeth_alloc_buffer_pool(card)){ - kfree(card->qdio.in_q); - return -ENOMEM; - } + if (qeth_alloc_buffer_pool(card)) + goto out_freeinq; /* outbound */ card->qdio.out_qs = kmalloc(card->qdio.no_out_queues * sizeof(struct qeth_qdio_out_q *), GFP_KERNEL); - if (!card->qdio.out_qs){ - qeth_free_buffer_pool(card); - return -ENOMEM; - } - for (i = 0; i < card->qdio.no_out_queues; ++i){ + if (!card->qdio.out_qs) + goto out_freepool; + for (i = 0; i < card->qdio.no_out_queues; ++i) { card->qdio.out_qs[i] = kmalloc(sizeof(struct qeth_qdio_out_q), GFP_KERNEL|GFP_DMA); - if (!card->qdio.out_qs[i]){ - while (i > 0) - kfree(card->qdio.out_qs[--i]); - kfree(card->qdio.out_qs); - return -ENOMEM; - } + if (!card->qdio.out_qs[i]) + goto out_freeoutq; QETH_DBF_TEXT_(setup, 2, "outq %i", i); QETH_DBF_HEX(setup, 2, &card->qdio.out_qs[i], sizeof(void *)); memset(card->qdio.out_qs[i], 0, sizeof(struct qeth_qdio_out_q)); @@ -3230,11 +3218,25 @@ qeth_alloc_qdio_buffers(struct qeth_card *card) &card->qdio.out_qs[i]->qdio_bufs[j]; skb_queue_head_init(&card->qdio.out_qs[i]->bufs[j]. skb_list); + lockdep_set_class( + &card->qdio.out_qs[i]->bufs[j].skb_list.lock, + &qdio_out_skb_queue_key); INIT_LIST_HEAD(&card->qdio.out_qs[i]->bufs[j].ctx_list); } } - card->qdio.state = QETH_QDIO_ALLOCATED; return 0; + +out_freeoutq: + while (i > 0) + kfree(card->qdio.out_qs[--i]); + kfree(card->qdio.out_qs); +out_freepool: + qeth_free_buffer_pool(card); +out_freeinq: + kfree(card->qdio.in_q); +out_nomem: + atomic_set(&card->qdio.state, QETH_QDIO_UNINITIALIZED); + return -ENOMEM; } static void @@ -3243,7 +3245,8 @@ qeth_free_qdio_buffers(struct qeth_card *card) int i, j; QETH_DBF_TEXT(trace, 2, "freeqdbf"); - if (card->qdio.state == QETH_QDIO_UNINITIALIZED) + if (atomic_swap(&card->qdio.state, QETH_QDIO_UNINITIALIZED) == + QETH_QDIO_UNINITIALIZED) return; kfree(card->qdio.in_q); /* inbound buffer pool */ @@ -3256,7 +3259,6 @@ qeth_free_qdio_buffers(struct qeth_card *card) kfree(card->qdio.out_qs[i]); } kfree(card->qdio.out_qs); - card->qdio.state = QETH_QDIO_UNINITIALIZED; } static void @@ -3278,7 +3280,7 @@ static void qeth_init_qdio_info(struct qeth_card *card) { QETH_DBF_TEXT(setup, 4, "intqdinf"); - card->qdio.state = QETH_QDIO_UNINITIALIZED; + atomic_set(&card->qdio.state, QETH_QDIO_UNINITIALIZED); /* inbound */ card->qdio.in_buf_size = QETH_IN_BUF_SIZE_DEFAULT; card->qdio.init_pool.buf_count = QETH_IN_BUF_COUNT_DEFAULT; @@ -3341,7 +3343,7 @@ qeth_qdio_establish(struct qeth_card *card) struct qdio_buffer **in_sbal_ptrs; struct qdio_buffer **out_sbal_ptrs; int i, j, k; - int rc; + int rc = 0; QETH_DBF_TEXT(setup, 2, "qdioest"); @@ -3400,8 +3402,10 @@ qeth_qdio_establish(struct qeth_card *card) init_data.input_sbal_addr_array = (void **) in_sbal_ptrs; init_data.output_sbal_addr_array = (void **) out_sbal_ptrs; - if (!(rc = qdio_initialize(&init_data))) - card->qdio.state = QETH_QDIO_ESTABLISHED; + if (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_ALLOCATED, + QETH_QDIO_ESTABLISHED) == QETH_QDIO_ALLOCATED) + if ((rc = qdio_initialize(&init_data))) + atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED); kfree(out_sbal_ptrs); kfree(in_sbal_ptrs); @@ -3517,13 +3521,20 @@ qeth_qdio_clear_card(struct qeth_card *card, int use_halt) int rc = 0; QETH_DBF_TEXT(trace,3,"qdioclr"); - if (card->qdio.state == QETH_QDIO_ESTABLISHED){ + switch (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_ESTABLISHED, + QETH_QDIO_CLEANING)) { + case QETH_QDIO_ESTABLISHED: if ((rc = qdio_cleanup(CARD_DDEV(card), - (card->info.type == QETH_CARD_TYPE_IQD) ? - QDIO_FLAG_CLEANUP_USING_HALT : - QDIO_FLAG_CLEANUP_USING_CLEAR))) + (card->info.type == QETH_CARD_TYPE_IQD) ? + QDIO_FLAG_CLEANUP_USING_HALT : + QDIO_FLAG_CLEANUP_USING_CLEAR))) QETH_DBF_TEXT_(trace, 3, "1err%d", rc); - card->qdio.state = QETH_QDIO_ALLOCATED; + atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED); + break; + case QETH_QDIO_CLEANING: + return rc; + default: + break; } if ((rc = qeth_clear_halt_card(card, use_halt))) QETH_DBF_TEXT_(trace, 3, "2err%d", rc); @@ -3683,10 +3694,10 @@ qeth_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) /* return OK; otherwise ksoftirqd goes to 100% */ return NETDEV_TX_OK; } -#ifdef CONFIG_QETH_PERF_STATS - card->perf_stats.outbound_cnt++; - card->perf_stats.outbound_start_time = qeth_get_micros(); -#endif + if (card->options.performance_stats) { + card->perf_stats.outbound_cnt++; + card->perf_stats.outbound_start_time = qeth_get_micros(); + } netif_stop_queue(dev); if ((rc = qeth_send_packet(card, skb))) { if (rc == -EBUSY) { @@ -3700,10 +3711,9 @@ qeth_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) } } netif_wake_queue(dev); -#ifdef CONFIG_QETH_PERF_STATS - card->perf_stats.outbound_time += qeth_get_micros() - - card->perf_stats.outbound_start_time; -#endif + if (card->options.performance_stats) + card->perf_stats.outbound_time += qeth_get_micros() - + card->perf_stats.outbound_start_time; return rc; } @@ -3918,49 +3928,59 @@ qeth_get_ip_version(struct sk_buff *skb) } } -static inline int -qeth_prepare_skb(struct qeth_card *card, struct sk_buff **skb, - struct qeth_hdr **hdr, int ipv) +static inline struct qeth_hdr * +__qeth_prepare_skb(struct qeth_card *card, struct sk_buff *skb, int ipv) { - int rc = 0; #ifdef CONFIG_QETH_VLAN u16 *tag; -#endif - - QETH_DBF_TEXT(trace, 6, "prepskb"); - if (card->info.type == QETH_CARD_TYPE_OSN) { - *hdr = (struct qeth_hdr *)(*skb)->data; - return rc; - } - rc = qeth_realloc_headroom(card, skb, sizeof(struct qeth_hdr)); - if (rc) - return rc; -#ifdef CONFIG_QETH_VLAN - if (card->vlangrp && vlan_tx_tag_present(*skb) && + if (card->vlangrp && vlan_tx_tag_present(skb) && ((ipv == 6) || card->options.layer2) ) { /* * Move the mac addresses (6 bytes src, 6 bytes dest) * to the beginning of the new header. We are using three * memcpys instead of one memmove to save cycles. */ - skb_push(*skb, VLAN_HLEN); - memcpy((*skb)->data, (*skb)->data + 4, 4); - memcpy((*skb)->data + 4, (*skb)->data + 8, 4); - memcpy((*skb)->data + 8, (*skb)->data + 12, 4); - tag = (u16 *)((*skb)->data + 12); + skb_push(skb, VLAN_HLEN); + memcpy(skb->data, skb->data + 4, 4); + memcpy(skb->data + 4, skb->data + 8, 4); + memcpy(skb->data + 8, skb->data + 12, 4); + tag = (u16 *)(skb->data + 12); /* * first two bytes = ETH_P_8021Q (0x8100) * second two bytes = VLANID */ *tag = __constant_htons(ETH_P_8021Q); - *(tag + 1) = htons(vlan_tx_tag_get(*skb)); + *(tag + 1) = htons(vlan_tx_tag_get(skb)); } #endif - *hdr = (struct qeth_hdr *) - qeth_push_skb(card, skb, sizeof(struct qeth_hdr)); - if (*hdr == NULL) - return -EINVAL; - return 0; + return ((struct qeth_hdr *) + qeth_push_skb(card, skb, sizeof(struct qeth_hdr))); +} + +static inline void +__qeth_free_new_skb(struct sk_buff *orig_skb, struct sk_buff *new_skb) +{ + if (orig_skb != new_skb) + dev_kfree_skb_any(new_skb); +} + +static inline struct sk_buff * +qeth_prepare_skb(struct qeth_card *card, struct sk_buff *skb, + struct qeth_hdr **hdr, int ipv) +{ + struct sk_buff *new_skb; + + QETH_DBF_TEXT(trace, 6, "prepskb"); + + new_skb = qeth_realloc_headroom(card, skb, sizeof(struct qeth_hdr)); + if (new_skb == NULL) + return NULL; + *hdr = __qeth_prepare_skb(card, new_skb, ipv); + if (*hdr == NULL) { + __qeth_free_new_skb(skb, new_skb); + return NULL; + } + return new_skb; } static inline u8 @@ -4202,9 +4222,8 @@ qeth_fill_buffer(struct qeth_qdio_out_q *queue, flush_cnt = 1; } else { QETH_DBF_TEXT(trace, 6, "fillbfpa"); -#ifdef CONFIG_QETH_PERF_STATS - queue->card->perf_stats.skbs_sent_pack++; -#endif + if (queue->card->options.performance_stats) + queue->card->perf_stats.skbs_sent_pack++; if (buf->next_element_to_fill >= QETH_MAX_BUFFER_ELEMENTS(queue->card)) { /* @@ -4241,21 +4260,15 @@ qeth_do_send_packet_fast(struct qeth_card *card, struct qeth_qdio_out_q *queue, * check if buffer is empty to make sure that we do not 'overtake' * ourselves and try to fill a buffer that is already primed */ - if (atomic_read(&buffer->state) != QETH_QDIO_BUF_EMPTY) { - card->stats.tx_dropped++; - atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED); - return -EBUSY; - } + if (atomic_read(&buffer->state) != QETH_QDIO_BUF_EMPTY) + goto out; if (ctx == NULL) queue->next_buf_to_fill = (queue->next_buf_to_fill + 1) % QDIO_MAX_BUFFERS_PER_Q; else { buffers_needed = qeth_eddp_check_buffers_for_context(queue,ctx); - if (buffers_needed < 0) { - card->stats.tx_dropped++; - atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED); - return -EBUSY; - } + if (buffers_needed < 0) + goto out; queue->next_buf_to_fill = (queue->next_buf_to_fill + buffers_needed) % QDIO_MAX_BUFFERS_PER_Q; @@ -4270,6 +4283,9 @@ qeth_do_send_packet_fast(struct qeth_card *card, struct qeth_qdio_out_q *queue, qeth_flush_buffers(queue, 0, index, flush_cnt); } return 0; +out: + atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED); + return -EBUSY; } static inline int @@ -4295,8 +4311,7 @@ qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue, * check if buffer is empty to make sure that we do not 'overtake' * ourselves and try to fill a buffer that is already primed */ - if (atomic_read(&buffer->state) != QETH_QDIO_BUF_EMPTY){ - card->stats.tx_dropped++; + if (atomic_read(&buffer->state) != QETH_QDIO_BUF_EMPTY) { atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED); return -EBUSY; } @@ -4319,7 +4334,6 @@ qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue, * again */ if (atomic_read(&buffer->state) != QETH_QDIO_BUF_EMPTY){ - card->stats.tx_dropped++; qeth_flush_buffers(queue, 0, start_index, flush_count); atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED); return -EBUSY; @@ -4330,7 +4344,6 @@ qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue, * free buffers) to handle eddp context */ if (qeth_eddp_check_buffers_for_context(queue,ctx) < 0){ printk("eddp tx_dropped 1\n"); - card->stats.tx_dropped++; rc = -EBUSY; goto out; } @@ -4342,7 +4355,6 @@ qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue, tmp = qeth_eddp_fill_buffer(queue,ctx,queue->next_buf_to_fill); if (tmp < 0) { printk("eddp tx_dropped 2\n"); - card->stats.tx_dropped++; rc = - EBUSY; goto out; } @@ -4376,10 +4388,8 @@ out: qeth_flush_buffers(queue, 0, start_index, flush_count); } /* at this point the queue is UNLOCKED again */ -#ifdef CONFIG_QETH_PERF_STATS - if (do_pack) + if (queue->card->options.performance_stats && do_pack) queue->card->perf_stats.bufs_sent_pack += flush_count; -#endif /* CONFIG_QETH_PERF_STATS */ return rc; } @@ -4390,21 +4400,21 @@ qeth_get_elements_no(struct qeth_card *card, void *hdr, { int elements_needed = 0; - if (skb_shinfo(skb)->nr_frags > 0) { + if (skb_shinfo(skb)->nr_frags > 0) elements_needed = (skb_shinfo(skb)->nr_frags + 1); - } - if (elements_needed == 0 ) + if (elements_needed == 0) elements_needed = 1 + (((((unsigned long) hdr) % PAGE_SIZE) + skb->len) >> PAGE_SHIFT); if ((elements_needed + elems) > QETH_MAX_BUFFER_ELEMENTS(card)){ - PRINT_ERR("qeth_do_send_packet: invalid size of " - "IP packet (Number=%d / Length=%d). Discarded.\n", + PRINT_ERR("Invalid size of IP packet " + "(Number=%d / Length=%d). Discarded.\n", (elements_needed+elems), skb->len); return 0; } return elements_needed; } + static inline int qeth_send_packet(struct qeth_card *card, struct sk_buff *skb) { @@ -4417,107 +4427,111 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb) struct qeth_eddp_context *ctx = NULL; int tx_bytes = skb->len; unsigned short nr_frags = skb_shinfo(skb)->nr_frags; + unsigned short tso_size = skb_shinfo(skb)->gso_size; + struct sk_buff *new_skb, *new_skb2; int rc; QETH_DBF_TEXT(trace, 6, "sendpkt"); + new_skb = skb; + if ((card->info.type == QETH_CARD_TYPE_OSN) && + (skb->protocol == htons(ETH_P_IPV6))) + return -EPERM; + cast_type = qeth_get_cast_type(card, skb); + if ((cast_type == RTN_BROADCAST) && + (card->info.broadcast_capable == 0)) + return -EPERM; + queue = card->qdio.out_qs + [qeth_get_priority_queue(card, skb, ipv, cast_type)]; if (!card->options.layer2) { ipv = qeth_get_ip_version(skb); if ((card->dev->hard_header == qeth_fake_header) && ipv) { - if ((skb = qeth_pskb_unshare(skb,GFP_ATOMIC)) == NULL) { - card->stats.tx_dropped++; - dev_kfree_skb_irq(skb); - return 0; - } + new_skb = qeth_pskb_unshare(skb, GFP_ATOMIC); + if (!new_skb) + return -ENOMEM; if(card->dev->type == ARPHRD_IEEE802_TR){ - skb_pull(skb, QETH_FAKE_LL_LEN_TR); + skb_pull(new_skb, QETH_FAKE_LL_LEN_TR); } else { - skb_pull(skb, QETH_FAKE_LL_LEN_ETH); + skb_pull(new_skb, QETH_FAKE_LL_LEN_ETH); } } } - if ((card->info.type == QETH_CARD_TYPE_OSN) && - (skb->protocol == htons(ETH_P_IPV6))) { - dev_kfree_skb_any(skb); - return 0; - } - cast_type = qeth_get_cast_type(card, skb); - if ((cast_type == RTN_BROADCAST) && - (card->info.broadcast_capable == 0)){ - card->stats.tx_dropped++; - card->stats.tx_errors++; - dev_kfree_skb_any(skb); - return NETDEV_TX_OK; - } - queue = card->qdio.out_qs - [qeth_get_priority_queue(card, skb, ipv, cast_type)]; - if (skb_is_gso(skb)) large_send = card->options.large_send; - - /*are we able to do TSO ? If so ,prepare and send it from here */ + /* check on OSN device*/ + if (card->info.type == QETH_CARD_TYPE_OSN) + hdr = (struct qeth_hdr *)new_skb->data; + /*are we able to do TSO ? */ if ((large_send == QETH_LARGE_SEND_TSO) && (cast_type == RTN_UNSPEC)) { - rc = qeth_tso_prepare_packet(card, skb, ipv, cast_type); + rc = qeth_tso_prepare_packet(card, new_skb, ipv, cast_type); if (rc) { - card->stats.tx_dropped++; - card->stats.tx_errors++; - dev_kfree_skb_any(skb); - return NETDEV_TX_OK; + __qeth_free_new_skb(skb, new_skb); + return rc; } elements_needed++; - } else { - if ((rc = qeth_prepare_skb(card, &skb, &hdr, ipv))) { - QETH_DBF_TEXT_(trace, 4, "pskbe%d", rc); - return rc; + } else if (card->info.type != QETH_CARD_TYPE_OSN) { + new_skb2 = qeth_prepare_skb(card, new_skb, &hdr, ipv); + if (!new_skb2) { + __qeth_free_new_skb(skb, new_skb); + return -EINVAL; } - if (card->info.type != QETH_CARD_TYPE_OSN) - qeth_fill_header(card, hdr, skb, ipv, cast_type); + if (new_skb != skb) + __qeth_free_new_skb(new_skb2, new_skb); + new_skb = new_skb2; + qeth_fill_header(card, hdr, new_skb, ipv, cast_type); } - if (large_send == QETH_LARGE_SEND_EDDP) { - ctx = qeth_eddp_create_context(card, skb, hdr); + ctx = qeth_eddp_create_context(card, new_skb, hdr); if (ctx == NULL) { + __qeth_free_new_skb(skb, new_skb); PRINT_WARN("could not create eddp context\n"); return -EINVAL; } } else { - int elems = qeth_get_elements_no(card,(void*) hdr, skb, + int elems = qeth_get_elements_no(card,(void*) hdr, new_skb, elements_needed); - if (!elems) + if (!elems) { + __qeth_free_new_skb(skb, new_skb); return -EINVAL; + } elements_needed += elems; } if (card->info.type != QETH_CARD_TYPE_IQD) - rc = qeth_do_send_packet(card, queue, skb, hdr, + rc = qeth_do_send_packet(card, queue, new_skb, hdr, elements_needed, ctx); else - rc = qeth_do_send_packet_fast(card, queue, skb, hdr, + rc = qeth_do_send_packet_fast(card, queue, new_skb, hdr, elements_needed, ctx); - if (!rc){ + if (!rc) { card->stats.tx_packets++; card->stats.tx_bytes += tx_bytes; -#ifdef CONFIG_QETH_PERF_STATS - if (skb_is_gso(skb) && !(large_send == QETH_LARGE_SEND_NO)) { - card->perf_stats.large_send_bytes += skb->len; - card->perf_stats.large_send_cnt++; - } - if (nr_frags > 0){ - card->perf_stats.sg_skbs_sent++; - /* nr_frags + skb->data */ - card->perf_stats.sg_frags_sent += - nr_frags + 1; + if (new_skb != skb) + dev_kfree_skb_any(skb); + if (card->options.performance_stats) { + if (tso_size && + !(large_send == QETH_LARGE_SEND_NO)) { + card->perf_stats.large_send_bytes += tx_bytes; + card->perf_stats.large_send_cnt++; + } + if (nr_frags > 0) { + card->perf_stats.sg_skbs_sent++; + /* nr_frags + skb->data */ + card->perf_stats.sg_frags_sent += + nr_frags + 1; + } } -#endif /* CONFIG_QETH_PERF_STATS */ + } else { + card->stats.tx_dropped++; + __qeth_free_new_skb(skb, new_skb); } if (ctx != NULL) { /* drop creator's reference */ qeth_eddp_put_context(ctx); /* free skb; it's not referenced by a buffer */ - if (rc == 0) - dev_kfree_skb_any(skb); - + if (!rc) + dev_kfree_skb_any(new_skb); } return rc; } @@ -4796,7 +4810,7 @@ static struct qeth_cmd_buffer * qeth_get_setassparms_cmd(struct qeth_card *, enum qeth_ipa_funcs, __u16, __u16, enum qeth_prot_versions); static int -qeth_arp_query(struct qeth_card *card, char *udata) +qeth_arp_query(struct qeth_card *card, char __user *udata) { struct qeth_cmd_buffer *iob; struct qeth_arp_query_info qinfo = {0, }; @@ -4929,7 +4943,7 @@ qeth_get_adapter_cmd(struct qeth_card *card, __u32 command, __u32 cmdlen) * function to send SNMP commands to OSA-E card */ static int -qeth_snmp_command(struct qeth_card *card, char *udata) +qeth_snmp_command(struct qeth_card *card, char __user *udata) { struct qeth_cmd_buffer *iob; struct qeth_ipa_cmd *cmd; @@ -5271,6 +5285,7 @@ qeth_free_vlan_buffer(struct qeth_card *card, struct qeth_qdio_out_buffer *buf, struct sk_buff_head tmp_list; skb_queue_head_init(&tmp_list); + lockdep_set_class(&tmp_list.lock, &qdio_out_skb_queue_key); for(i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i){ while ((skb = skb_dequeue(&buf->skb_list))){ if (vlan_tx_tag_present(skb) && @@ -7329,6 +7344,8 @@ qeth_setrouting_v6(struct qeth_card *card) QETH_DBF_TEXT(trace,3,"setrtg6"); #ifdef CONFIG_QETH_IPV6 + if (!qeth_is_supported(card, IPA_IPV6)) + return 0; qeth_correct_routing_type(card, &card->options.route6.type, QETH_PROT_IPV6); @@ -7867,12 +7884,12 @@ __qeth_set_online(struct ccwgroup_device *gdev, int recovery_mode) QETH_DBF_TEXT_(setup, 2, "5err%d", rc); goto out_remove; } - card->state = CARD_STATE_SOFTSETUP; if ((rc = qeth_init_qdio_queues(card))){ QETH_DBF_TEXT_(setup, 2, "6err%d", rc); goto out_remove; } + card->state = CARD_STATE_SOFTSETUP; netif_carrier_on(card->dev); qeth_set_allowed_threads(card, 0xffffffff, 0); @@ -7900,9 +7917,9 @@ qeth_set_online(struct ccwgroup_device *gdev) } static struct ccw_device_id qeth_ids[] = { - {CCW_DEVICE(0x1731, 0x01), driver_info:QETH_CARD_TYPE_OSAE}, - {CCW_DEVICE(0x1731, 0x05), driver_info:QETH_CARD_TYPE_IQD}, - {CCW_DEVICE(0x1731, 0x06), driver_info:QETH_CARD_TYPE_OSN}, + {CCW_DEVICE(0x1731, 0x01), .driver_info = QETH_CARD_TYPE_OSAE}, + {CCW_DEVICE(0x1731, 0x05), .driver_info = QETH_CARD_TYPE_IQD}, + {CCW_DEVICE(0x1731, 0x06), .driver_info = QETH_CARD_TYPE_OSN}, {}, }; MODULE_DEVICE_TABLE(ccw, qeth_ids); @@ -8371,7 +8388,7 @@ out: static struct notifier_block qeth_ip_notifier = { qeth_ip_event, - 0 + NULL, }; #ifdef CONFIG_QETH_IPV6 @@ -8424,7 +8441,7 @@ out: static struct notifier_block qeth_ip6_notifier = { qeth_ip6_event, - 0 + NULL, }; #endif @@ -8442,16 +8459,17 @@ __qeth_reboot_event_card(struct device *dev, void *data) static int qeth_reboot_event(struct notifier_block *this, unsigned long event, void *ptr) { + int ret; - driver_for_each_device(&qeth_ccwgroup_driver.driver, NULL, NULL, - __qeth_reboot_event_card); - return NOTIFY_DONE; + ret = driver_for_each_device(&qeth_ccwgroup_driver.driver, NULL, NULL, + __qeth_reboot_event_card); + return ret ? NOTIFY_BAD : NOTIFY_DONE; } static struct notifier_block qeth_reboot_notifier = { qeth_reboot_event, - 0 + NULL, }; static int @@ -8500,9 +8518,9 @@ static int qeth_ipv6_init(void) { qeth_old_arp_constructor = arp_tbl.constructor; - write_lock(&arp_tbl.lock); + write_lock_bh(&arp_tbl.lock); arp_tbl.constructor = qeth_arp_constructor; - write_unlock(&arp_tbl.lock); + write_unlock_bh(&arp_tbl.lock); arp_direct_ops = (struct neigh_ops*) kmalloc(sizeof(struct neigh_ops), GFP_KERNEL); @@ -8518,9 +8536,9 @@ qeth_ipv6_init(void) static void qeth_ipv6_uninit(void) { - write_lock(&arp_tbl.lock); + write_lock_bh(&arp_tbl.lock); arp_tbl.constructor = qeth_old_arp_constructor; - write_unlock(&arp_tbl.lock); + write_unlock_bh(&arp_tbl.lock); kfree(arp_direct_ops); } #endif /* CONFIG_QETH_IPV6 */ @@ -8528,34 +8546,44 @@ qeth_ipv6_uninit(void) static void qeth_sysfs_unregister(void) { + s390_root_dev_unregister(qeth_root_dev); qeth_remove_driver_attributes(); ccw_driver_unregister(&qeth_ccw_driver); ccwgroup_driver_unregister(&qeth_ccwgroup_driver); - s390_root_dev_unregister(qeth_root_dev); } + /** * register qeth at sysfs */ static int qeth_sysfs_register(void) { - int rc=0; + int rc; rc = ccwgroup_driver_register(&qeth_ccwgroup_driver); if (rc) - return rc; + goto out; + rc = ccw_driver_register(&qeth_ccw_driver); if (rc) - return rc; + goto out_ccw_driver; + rc = qeth_create_driver_attributes(); if (rc) - return rc; + goto out_qeth_attr; + qeth_root_dev = s390_root_dev_register("qeth"); - if (IS_ERR(qeth_root_dev)) { - rc = PTR_ERR(qeth_root_dev); - return rc; - } - return 0; + rc = IS_ERR(qeth_root_dev) ? PTR_ERR(qeth_root_dev) : 0; + if (!rc) + goto out; + + qeth_remove_driver_attributes(); +out_qeth_attr: + ccw_driver_unregister(&qeth_ccw_driver); +out_ccw_driver: + ccwgroup_driver_unregister(&qeth_ccwgroup_driver); +out: + return rc; } /*** @@ -8564,7 +8592,7 @@ qeth_sysfs_register(void) static int __init qeth_init(void) { - int rc=0; + int rc; PRINT_INFO("loading %s\n", version); @@ -8573,20 +8601,26 @@ qeth_init(void) spin_lock_init(&qeth_notify_lock); rwlock_init(&qeth_card_list.rwlock); - if (qeth_register_dbf_views()) + rc = qeth_register_dbf_views(); + if (rc) goto out_err; - if (qeth_sysfs_register()) - goto out_sysfs; + + rc = qeth_sysfs_register(); + if (rc) + goto out_dbf; #ifdef CONFIG_QETH_IPV6 - if (qeth_ipv6_init()) { - PRINT_ERR("Out of memory during ipv6 init.\n"); + rc = qeth_ipv6_init(); + if (rc) { + PRINT_ERR("Out of memory during ipv6 init code = %d\n", rc); goto out_sysfs; } #endif /* QETH_IPV6 */ - if (qeth_register_notifiers()) + rc = qeth_register_notifiers(); + if (rc) goto out_ipv6; - if (qeth_create_procfs_entries()) + rc = qeth_create_procfs_entries(); + if (rc) goto out_notifiers; return rc; @@ -8596,12 +8630,13 @@ out_notifiers: out_ipv6: #ifdef CONFIG_QETH_IPV6 qeth_ipv6_uninit(); -#endif /* QETH_IPV6 */ out_sysfs: +#endif /* QETH_IPV6 */ qeth_sysfs_unregister(); +out_dbf: qeth_unregister_dbf_views(); out_err: - PRINT_ERR("Initialization failed"); + PRINT_ERR("Initialization failed with code %d\n", rc); return rc; } diff --git a/drivers/s390/net/qeth_proc.c b/drivers/s390/net/qeth_proc.c index 66f2da14e..faa768e59 100644 --- a/drivers/s390/net/qeth_proc.c +++ b/drivers/s390/net/qeth_proc.c @@ -173,7 +173,6 @@ static struct file_operations qeth_procfile_fops = { #define QETH_PERF_PROCFILE_NAME "qeth_perf" static struct proc_dir_entry *qeth_perf_procfile; -#ifdef CONFIG_QETH_PERF_STATS static int qeth_perf_procfile_seq_show(struct seq_file *s, void *it) { @@ -192,14 +191,21 @@ qeth_perf_procfile_seq_show(struct seq_file *s, void *it) CARD_DDEV_ID(card), QETH_CARD_IFNAME(card) ); + if (!card->options.performance_stats) + seq_printf(s, "Performance statistics are deactivated.\n"); seq_printf(s, " Skb's/buffers received : %lu/%u\n" " Skb's/buffers sent : %lu/%u\n\n", - card->stats.rx_packets, card->perf_stats.bufs_rec, - card->stats.tx_packets, card->perf_stats.bufs_sent + card->stats.rx_packets - + card->perf_stats.initial_rx_packets, + card->perf_stats.bufs_rec, + card->stats.tx_packets - + card->perf_stats.initial_tx_packets, + card->perf_stats.bufs_sent ); seq_printf(s, " Skb's/buffers sent without packing : %lu/%u\n" " Skb's/buffers sent with packing : %u/%u\n\n", - card->stats.tx_packets - card->perf_stats.skbs_sent_pack, + card->stats.tx_packets - card->perf_stats.initial_tx_packets + - card->perf_stats.skbs_sent_pack, card->perf_stats.bufs_sent - card->perf_stats.bufs_sent_pack, card->perf_stats.skbs_sent_pack, card->perf_stats.bufs_sent_pack @@ -275,11 +281,6 @@ static struct file_operations qeth_perf_procfile_fops = { .release = seq_release, }; -#define qeth_perf_procfile_created qeth_perf_procfile -#else -#define qeth_perf_procfile_created 1 -#endif /* CONFIG_QETH_PERF_STATS */ - int __init qeth_create_procfs_entries(void) { @@ -288,15 +289,13 @@ qeth_create_procfs_entries(void) if (qeth_procfile) qeth_procfile->proc_fops = &qeth_procfile_fops; -#ifdef CONFIG_QETH_PERF_STATS qeth_perf_procfile = create_proc_entry(QETH_PERF_PROCFILE_NAME, S_IFREG | 0444, NULL); if (qeth_perf_procfile) qeth_perf_procfile->proc_fops = &qeth_perf_procfile_fops; -#endif /* CONFIG_QETH_PERF_STATS */ if (qeth_procfile && - qeth_perf_procfile_created) + qeth_perf_procfile) return 0; else return -ENOMEM; diff --git a/drivers/s390/net/qeth_sys.c b/drivers/s390/net/qeth_sys.c index 185a9cfbc..5836737ac 100644 --- a/drivers/s390/net/qeth_sys.c +++ b/drivers/s390/net/qeth_sys.c @@ -742,6 +742,47 @@ qeth_dev_layer2_store(struct device *dev, struct device_attribute *attr, const c static DEVICE_ATTR(layer2, 0644, qeth_dev_layer2_show, qeth_dev_layer2_store); +static ssize_t +qeth_dev_performance_stats_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct qeth_card *card = dev->driver_data; + + if (!card) + return -EINVAL; + + return sprintf(buf, "%i\n", card->options.performance_stats ? 1:0); +} + +static ssize_t +qeth_dev_performance_stats_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct qeth_card *card = dev->driver_data; + char *tmp; + int i; + + if (!card) + return -EINVAL; + + i = simple_strtoul(buf, &tmp, 16); + if ((i == 0) || (i == 1)) { + if (i == card->options.performance_stats) + return count; + card->options.performance_stats = i; + if (i == 0) + memset(&card->perf_stats, 0, + sizeof(struct qeth_perf_stats)); + card->perf_stats.initial_rx_packets = card->stats.rx_packets; + card->perf_stats.initial_tx_packets = card->stats.tx_packets; + } else { + PRINT_WARN("performance_stats: write 0 or 1 to this file!\n"); + return -EINVAL; + } + return count; +} + +static DEVICE_ATTR(performance_stats, 0644, qeth_dev_performance_stats_show, + qeth_dev_performance_stats_store); + static ssize_t qeth_dev_large_send_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -928,6 +969,7 @@ static struct device_attribute * qeth_device_attrs[] = { &dev_attr_canonical_macaddr, &dev_attr_layer2, &dev_attr_large_send, + &dev_attr_performance_stats, NULL, }; @@ -1110,12 +1152,12 @@ qeth_parse_ipatoe(const char* buf, enum qeth_prot_versions proto, { const char *start, *end; char *tmp; - char buffer[49] = {0, }; + char buffer[40] = {0, }; start = buf; /* get address string */ end = strchr(start, '/'); - if (!end || (end-start >= 49)){ + if (!end || (end - start >= 40)){ PRINT_WARN("Invalid format for ipato_addx/delx. " "Use /\n"); return -EINVAL; @@ -1127,7 +1169,12 @@ qeth_parse_ipatoe(const char* buf, enum qeth_prot_versions proto, } start = end + 1; *mask_bits = simple_strtoul(start, &tmp, 10); - + if (!strlen(start) || + (tmp == start) || + (*mask_bits > ((proto == QETH_PROT_IPV4) ? 32 : 128))) { + PRINT_WARN("Invalid mask bits for ipato_addx/delx !\n"); + return -EINVAL; + } return 0; } @@ -1698,11 +1745,16 @@ qeth_create_device_attributes(struct device *dev) sysfs_remove_group(&dev->kobj, &qeth_device_attr_group); sysfs_remove_group(&dev->kobj, &qeth_device_ipato_group); sysfs_remove_group(&dev->kobj, &qeth_device_vipa_group); + return ret; } - if ((ret = sysfs_create_group(&dev->kobj, &qeth_device_blkt_group))) + if ((ret = sysfs_create_group(&dev->kobj, &qeth_device_blkt_group))){ + sysfs_remove_group(&dev->kobj, &qeth_device_attr_group); + sysfs_remove_group(&dev->kobj, &qeth_device_ipato_group); + sysfs_remove_group(&dev->kobj, &qeth_device_vipa_group); + sysfs_remove_group(&dev->kobj, &qeth_device_rxip_group); return ret; - - return ret; + } + return 0; } void @@ -1755,7 +1807,7 @@ qeth_driver_group_store(struct device_driver *ddrv, const char *buf, } -static DRIVER_ATTR(group, 0200, 0, qeth_driver_group_store); +static DRIVER_ATTR(group, 0200, NULL, qeth_driver_group_store); static ssize_t qeth_driver_notifier_register_store(struct device_driver *ddrv, const char *buf, @@ -1783,7 +1835,7 @@ qeth_driver_notifier_register_store(struct device_driver *ddrv, const char *buf, return count; } -static DRIVER_ATTR(notifier_register, 0200, 0, +static DRIVER_ATTR(notifier_register, 0200, NULL, qeth_driver_notifier_register_store); int diff --git a/drivers/s390/net/qeth_tso.h b/drivers/s390/net/qeth_tso.h index 593f29814..14504afb0 100644 --- a/drivers/s390/net/qeth_tso.h +++ b/drivers/s390/net/qeth_tso.h @@ -24,7 +24,7 @@ static inline struct qeth_hdr_tso * qeth_tso_prepare_skb(struct qeth_card *card, struct sk_buff **skb) { QETH_DBF_TEXT(trace, 5, "tsoprsk"); - return qeth_push_skb(card, skb, sizeof(struct qeth_hdr_tso)); + return qeth_push_skb(card, *skb, sizeof(struct qeth_hdr_tso)); } /** diff --git a/drivers/s390/net/smsgiucv.c b/drivers/s390/net/smsgiucv.c index 72118ee68..b8179c27c 100644 --- a/drivers/s390/net/smsgiucv.c +++ b/drivers/s390/net/smsgiucv.c @@ -66,7 +66,7 @@ smsg_message_pending(iucv_MessagePending *eib, void *pgm_data) return; } rc = iucv_receive(eib->ippathid, eib->ipmsgid, eib->iptrgcls, - msg, len, 0, 0, 0); + msg, len, NULL, NULL, NULL); if (rc == 0) { msg[len] = 0; EBCASC(msg, len); @@ -122,7 +122,7 @@ smsg_unregister_callback(char *prefix, void (*callback)(char *from, char *str)) struct smsg_callback *cb, *tmp; spin_lock(&smsg_list_lock); - cb = 0; + cb = NULL; list_for_each_entry(tmp, &smsg_list, list) if (tmp->callback == callback && strcmp(tmp->prefix, prefix) == 0) { @@ -139,7 +139,7 @@ smsg_exit(void) { if (smsg_handle > 0) { cpcmd("SET SMSG OFF", NULL, 0, NULL); - iucv_sever(smsg_pathid, 0); + iucv_sever(smsg_pathid, NULL); iucv_unregister_program(smsg_handle); driver_unregister(&smsg_driver); } @@ -162,19 +162,19 @@ smsg_init(void) return rc; } smsg_handle = iucv_register_program("SMSGIUCV ", "*MSG ", - pgmmask, &smsg_ops, 0); + pgmmask, &smsg_ops, NULL); if (!smsg_handle) { printk(KERN_ERR "SMSGIUCV: failed to register to iucv"); driver_unregister(&smsg_driver); return -EIO; /* better errno ? */ } - rc = iucv_connect (&smsg_pathid, 255, 0, "*MSG ", 0, 0, 0, 0, - smsg_handle, 0); + rc = iucv_connect (&smsg_pathid, 255, NULL, "*MSG ", NULL, 0, + NULL, NULL, smsg_handle, NULL); if (rc) { printk(KERN_ERR "SMSGIUCV: failed to connect to *MSG"); iucv_unregister_program(smsg_handle); driver_unregister(&smsg_driver); - smsg_handle = 0; + smsg_handle = NULL; return -EIO; } cpcmd("SET SMSG IUCV", NULL, 0, NULL); diff --git a/drivers/s390/s390mach.c b/drivers/s390/s390mach.c index f99e55308..5399c5d99 100644 --- a/drivers/s390/s390mach.c +++ b/drivers/s390/s390mach.c @@ -8,12 +8,12 @@ * Martin Schwidefsky (schwidefsky@de.ibm.com) */ -#include #include #include #include #include #include +#include #include @@ -56,8 +56,6 @@ s390_collect_crw_info(void *param) unsigned int chain; sem = (struct semaphore *)param; - /* Set a nice name. */ - daemonize("kmcheck"); repeat: down_interruptible(sem); slow = 0; @@ -113,6 +111,16 @@ repeat: break; case CRW_RSC_CPATH: pr_debug("source is channel path %02X\n", crw[0].rsid); + /* + * Check for solicited machine checks. These are + * created by reset channel path and need not be + * reported to the common I/O layer. + */ + if (crw[chain].slct) { + DBG(KERN_INFO"solicited machine check for " + "channel path %02X\n", crw[0].rsid); + break; + } switch (crw[0].erc) { case CRW_ERC_IPARM: /* Path has come. */ ret = chp_process_crw(crw[0].rsid, 1); @@ -380,6 +388,8 @@ s390_do_machine_check(struct pt_regs *regs) struct mcck_struct *mcck; int umode; + lockdep_off(); + mci = (struct mci *) &S390_lowcore.mcck_interruption_code; mcck = &__get_cpu_var(cpu_mcck); umode = user_mode(regs); @@ -484,6 +494,7 @@ s390_do_machine_check(struct pt_regs *regs) mcck->warning = 1; set_thread_flag(TIF_MCCK_PENDING); } + lockdep_on(); } /* @@ -516,7 +527,7 @@ arch_initcall(machine_check_init); static int __init machine_check_crw_init (void) { - kernel_thread(s390_collect_crw_info, &m_sem, CLONE_FS|CLONE_FILES); + kthread_run(s390_collect_crw_info, &m_sem, "kmcheck"); ctl_set_bit(14, 28); /* enable channel report MCH */ return 0; } diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c index 395cfc6a3..adc9d8f2c 100644 --- a/drivers/s390/scsi/zfcp_aux.c +++ b/drivers/s390/scsi/zfcp_aux.c @@ -1,18 +1,8 @@ /* + * This file is part of the zfcp device driver for + * FCP adapters for IBM System z9 and zSeries. * - * linux/drivers/s390/scsi/zfcp_aux.c - * - * FCP adapter driver for IBM eServer zSeries - * - * (C) Copyright IBM Corp. 2002, 2004 - * - * Author(s): Martin Peschke - * Raimund Schroeder - * Aron Zeh - * Wolfgang Taphorn - * Stefan Bader - * Heiko Carstens - * Andreas Herrmann + * (C) Copyright IBM Corp. 2002, 2006 * * 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 @@ -29,6 +19,20 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +/* + * Driver authors: + * Martin Peschke (originator of the driver) + * Raimund Schroeder + * Aron Zeh + * Wolfgang Taphorn + * Stefan Bader + * Heiko Carstens (kernel 2.6 port of the driver) + * Andreas Herrmann + * Maxim Shchetynin + * Volker Sameske + * Ralph Wuerthner + */ + #include "zfcp_ext.h" /* accumulated log level (module parameter) */ @@ -75,15 +79,9 @@ static struct miscdevice zfcp_cfdc_misc = { /* declare driver module init/cleanup functions */ module_init(zfcp_module_init); -MODULE_AUTHOR("Heiko Carstens , " - "Andreas Herrman , " - "Martin Peschke , " - "Raimund Schroeder , " - "Wolfgang Taphorn , " - "Aron Zeh , " - "IBM Deutschland Entwicklung GmbH"); +MODULE_AUTHOR("IBM Deutschland Entwicklung GmbH - linux390@de.ibm.com"); MODULE_DESCRIPTION - ("FCP (SCSI over Fibre Channel) HBA driver for IBM eServer zSeries"); + ("FCP (SCSI over Fibre Channel) HBA driver for IBM System z9 and zSeries"); MODULE_LICENSE("GPL"); module_param(device, charp, 0400); @@ -114,6 +112,105 @@ _zfcp_hex_dump(char *addr, int count) printk("\n"); } + +/****************************************************************/ +/****** Functions to handle the request ID hash table ********/ +/****************************************************************/ + +#define ZFCP_LOG_AREA ZFCP_LOG_AREA_FSF + +static int zfcp_reqlist_init(struct zfcp_adapter *adapter) +{ + int i; + + adapter->req_list = kcalloc(REQUEST_LIST_SIZE, sizeof(struct list_head), + GFP_KERNEL); + + if (!adapter->req_list) + return -ENOMEM; + + for (i=0; ireq_list[i]); + + return 0; +} + +static void zfcp_reqlist_free(struct zfcp_adapter *adapter) +{ + struct zfcp_fsf_req *request, *tmp; + unsigned int i; + + for (i=0; ireq_list[i])) + continue; + + list_for_each_entry_safe(request, tmp, + &adapter->req_list[i], list) + list_del(&request->list); + } + + kfree(adapter->req_list); +} + +void zfcp_reqlist_add(struct zfcp_adapter *adapter, + struct zfcp_fsf_req *fsf_req) +{ + unsigned int i; + + i = fsf_req->req_id % REQUEST_LIST_SIZE; + list_add_tail(&fsf_req->list, &adapter->req_list[i]); +} + +void zfcp_reqlist_remove(struct zfcp_adapter *adapter, unsigned long req_id) +{ + struct zfcp_fsf_req *request, *tmp; + unsigned int i, counter; + u64 dbg_tmp[2]; + + i = req_id % REQUEST_LIST_SIZE; + BUG_ON(list_empty(&adapter->req_list[i])); + + counter = 0; + list_for_each_entry_safe(request, tmp, &adapter->req_list[i], list) { + if (request->req_id == req_id) { + dbg_tmp[0] = (u64) atomic_read(&adapter->reqs_active); + dbg_tmp[1] = (u64) counter; + debug_event(adapter->erp_dbf, 4, (void *) dbg_tmp, 16); + list_del(&request->list); + break; + } + counter++; + } +} + +struct zfcp_fsf_req *zfcp_reqlist_ismember(struct zfcp_adapter *adapter, + unsigned long req_id) +{ + struct zfcp_fsf_req *request, *tmp; + unsigned int i; + + i = req_id % REQUEST_LIST_SIZE; + + list_for_each_entry_safe(request, tmp, &adapter->req_list[i], list) + if (request->req_id == req_id) + return request; + + return NULL; +} + +int zfcp_reqlist_isempty(struct zfcp_adapter *adapter) +{ + unsigned int i; + + for (i=0; ireq_list[i])) + return 0; + + return 1; +} + +#undef ZFCP_LOG_AREA + /****************************************************************/ /************** Uncategorised Functions *************************/ /****************************************************************/ @@ -291,12 +388,11 @@ zfcp_cfdc_dev_ioctl(struct file *file, unsigned int command, goto out; } - sg_list = kmalloc(sizeof(struct zfcp_sg_list), GFP_KERNEL); + sg_list = kzalloc(sizeof(struct zfcp_sg_list), GFP_KERNEL); if (sg_list == NULL) { retval = -ENOMEM; goto out; } - memset(sg_list, 0, sizeof(*sg_list)); if (command != ZFCP_CFDC_IOC) { ZFCP_LOG_INFO("IOC request code 0x%x invalid\n", command); @@ -478,14 +574,13 @@ zfcp_sg_list_alloc(struct zfcp_sg_list *sg_list, size_t size) sg_list->count = size >> PAGE_SHIFT; if (size & ~PAGE_MASK) sg_list->count++; - sg_list->sg = kmalloc(sg_list->count * sizeof(struct scatterlist), + sg_list->sg = kcalloc(sg_list->count, sizeof(struct scatterlist), GFP_KERNEL); if (sg_list->sg == NULL) { sg_list->count = 0; retval = -ENOMEM; goto out; } - memset(sg_list->sg, 0, sg_list->count * sizeof(struct scatterlist)); for (i = 0, sg = sg_list->sg; i < sg_list->count; i++, sg++) { sg->length = min(size, PAGE_SIZE); @@ -744,7 +839,7 @@ struct zfcp_unit * zfcp_unit_enqueue(struct zfcp_port *port, fcp_lun_t fcp_lun) { struct zfcp_unit *unit, *tmp_unit; - scsi_lun_t scsi_lun; + unsigned int scsi_lun; int found; /* @@ -758,10 +853,9 @@ zfcp_unit_enqueue(struct zfcp_port *port, fcp_lun_t fcp_lun) if (unit) return NULL; - unit = kmalloc(sizeof (struct zfcp_unit), GFP_KERNEL); + unit = kzalloc(sizeof (struct zfcp_unit), GFP_KERNEL); if (!unit) return NULL; - memset(unit, 0, sizeof (struct zfcp_unit)); /* initialise reference count stuff */ atomic_set(&unit->refcount, 0); @@ -929,13 +1023,12 @@ zfcp_adapter_enqueue(struct ccw_device *ccw_device) */ /* try to allocate new adapter data structure (zeroed) */ - adapter = kmalloc(sizeof (struct zfcp_adapter), GFP_KERNEL); + adapter = kzalloc(sizeof (struct zfcp_adapter), GFP_KERNEL); if (!adapter) { ZFCP_LOG_INFO("error: allocation of base adapter " "structure failed\n"); goto out; } - memset(adapter, 0, sizeof (struct zfcp_adapter)); ccw_device->handler = NULL; @@ -967,8 +1060,12 @@ zfcp_adapter_enqueue(struct ccw_device *ccw_device) INIT_LIST_HEAD(&adapter->port_remove_lh); /* initialize list of fsf requests */ - spin_lock_init(&adapter->fsf_req_list_lock); - INIT_LIST_HEAD(&adapter->fsf_req_list_head); + spin_lock_init(&adapter->req_list_lock); + retval = zfcp_reqlist_init(adapter); + if (retval) { + ZFCP_LOG_INFO("request list initialization failed\n"); + goto failed_low_mem_buffers; + } /* initialize debug locks */ @@ -997,12 +1094,6 @@ zfcp_adapter_enqueue(struct ccw_device *ccw_device) /* intitialise SCSI ER timer */ init_timer(&adapter->scsi_er_timer); - /* set FC service class used per default */ - adapter->fc_service_class = ZFCP_FC_SERVICE_CLASS_DEFAULT; - - sprintf(adapter->name, "%s", zfcp_get_busid_by_adapter(adapter)); - ASCEBC(adapter->name, strlen(adapter->name)); - /* mark adapter unusable as long as sysfs registration is not complete */ atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status); @@ -1053,8 +1144,6 @@ zfcp_adapter_enqueue(struct ccw_device *ccw_device) * !0 - struct zfcp_adapter data structure could not be removed * (e.g. still used) * locks: adapter list write lock is assumed to be held by caller - * adapter->fsf_req_list_lock is taken and released within this - * function and must not be held on entry */ void zfcp_adapter_dequeue(struct zfcp_adapter *adapter) @@ -1066,14 +1155,14 @@ zfcp_adapter_dequeue(struct zfcp_adapter *adapter) zfcp_sysfs_adapter_remove_files(&adapter->ccw_device->dev); dev_set_drvdata(&adapter->ccw_device->dev, NULL); /* sanity check: no pending FSF requests */ - spin_lock_irqsave(&adapter->fsf_req_list_lock, flags); - retval = !list_empty(&adapter->fsf_req_list_head); - spin_unlock_irqrestore(&adapter->fsf_req_list_lock, flags); - if (retval) { + spin_lock_irqsave(&adapter->req_list_lock, flags); + retval = zfcp_reqlist_isempty(adapter); + spin_unlock_irqrestore(&adapter->req_list_lock, flags); + if (!retval) { ZFCP_LOG_NORMAL("bug: adapter %s (%p) still in use, " "%i requests outstanding\n", zfcp_get_busid_by_adapter(adapter), adapter, - atomic_read(&adapter->fsf_reqs_active)); + atomic_read(&adapter->reqs_active)); retval = -EBUSY; goto out; } @@ -1099,6 +1188,7 @@ zfcp_adapter_dequeue(struct zfcp_adapter *adapter) zfcp_free_low_mem_buffers(adapter); /* free memory of adapter data structure and queues */ zfcp_qdio_free_queues(adapter); + zfcp_reqlist_free(adapter); kfree(adapter->fc_stats); kfree(adapter->stats_reset_data); ZFCP_LOG_TRACE("freeing adapter structure\n"); @@ -1139,10 +1229,9 @@ zfcp_port_enqueue(struct zfcp_adapter *adapter, wwn_t wwpn, u32 status, return NULL; } - port = kmalloc(sizeof (struct zfcp_port), GFP_KERNEL); + port = kzalloc(sizeof (struct zfcp_port), GFP_KERNEL); if (!port) return NULL; - memset(port, 0, sizeof (struct zfcp_port)); /* initialise reference count stuff */ atomic_set(&port->refcount, 0); @@ -1354,18 +1443,19 @@ static void zfcp_fsf_incoming_els_plogi(struct zfcp_adapter *adapter, struct fsf_status_read_buffer *status_buffer) { - logi *els_logi = (logi *) status_buffer->payload; + struct fsf_plogi *els_plogi; struct zfcp_port *port; unsigned long flags; + els_plogi = (struct fsf_plogi *) status_buffer->payload; read_lock_irqsave(&zfcp_data.config_lock, flags); list_for_each_entry(port, &adapter->port_list_head, list) { - if (port->wwpn == (*(wwn_t *) & els_logi->nport_wwn)) + if (port->wwpn == (*(wwn_t *) &els_plogi->serv_param.wwpn)) break; } read_unlock_irqrestore(&zfcp_data.config_lock, flags); - if (!port || (port->wwpn != (*(wwn_t *) & els_logi->nport_wwn))) { + if (!port || (port->wwpn != (*(wwn_t *) &els_plogi->serv_param.wwpn))) { ZFCP_LOG_DEBUG("ignored incoming PLOGI for nonexisting port " "with d_id 0x%08x on adapter %s\n", status_buffer->d_id, @@ -1760,4 +1850,25 @@ zfcp_handle_els_rjt(u32 sq, struct zfcp_ls_rjt_par *rjt_par) return ret; } +/** + * zfcp_plogi_evaluate - evaluate PLOGI playload and copy important fields + * into zfcp_port structure + * @port: zfcp_port structure + * @plogi: plogi payload + */ +void +zfcp_plogi_evaluate(struct zfcp_port *port, struct fsf_plogi *plogi) +{ + port->maxframe_size = plogi->serv_param.common_serv_param[7] | + ((plogi->serv_param.common_serv_param[6] & 0x0F) << 8); + if (plogi->serv_param.class1_serv_param[0] & 0x80) + port->supported_classes |= FC_COS_CLASS1; + if (plogi->serv_param.class2_serv_param[0] & 0x80) + port->supported_classes |= FC_COS_CLASS2; + if (plogi->serv_param.class3_serv_param[0] & 0x80) + port->supported_classes |= FC_COS_CLASS3; + if (plogi->serv_param.class4_serv_param[0] & 0x80) + port->supported_classes |= FC_COS_CLASS4; +} + #undef ZFCP_LOG_AREA diff --git a/drivers/s390/scsi/zfcp_ccw.c b/drivers/s390/scsi/zfcp_ccw.c index 241136d0c..fdabadeaa 100644 --- a/drivers/s390/scsi/zfcp_ccw.c +++ b/drivers/s390/scsi/zfcp_ccw.c @@ -1,16 +1,8 @@ /* - * linux/drivers/s390/scsi/zfcp_ccw.c + * This file is part of the zfcp device driver for + * FCP adapters for IBM System z9 and zSeries. * - * FCP adapter driver for IBM eServer zSeries - * - * CCW driver related routines - * - * (C) Copyright IBM Corp. 2003, 2004 - * - * Authors: - * Martin Peschke - * Heiko Carstens - * Andreas Herrmann + * (C) Copyright IBM Corp. 2002, 2006 * * 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 @@ -172,6 +164,11 @@ zfcp_ccw_set_online(struct ccw_device *ccw_device) retval = zfcp_adapter_scsi_register(adapter); if (retval) goto out_scsi_register; + + /* initialize request counter */ + BUG_ON(!zfcp_reqlist_isempty(adapter)); + adapter->req_no = 0; + zfcp_erp_modify_adapter_status(adapter, ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET); zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED); diff --git a/drivers/s390/scsi/zfcp_dbf.c b/drivers/s390/scsi/zfcp_dbf.c index a5f2ba9a8..c033145d0 100644 --- a/drivers/s390/scsi/zfcp_dbf.c +++ b/drivers/s390/scsi/zfcp_dbf.c @@ -1,12 +1,8 @@ /* + * This file is part of the zfcp device driver for + * FCP adapters for IBM System z9 and zSeries. * - * linux/drivers/s390/scsi/zfcp_dbf.c - * - * FCP adapter driver for IBM eServer zSeries - * - * Debugging facilities - * - * (C) Copyright IBM Corp. 2005 + * (C) Copyright IBM Corp. 2002, 2006 * * 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/drivers/s390/scsi/zfcp_def.h b/drivers/s390/scsi/zfcp_def.h index 6eba56cd8..94d1b74db 100644 --- a/drivers/s390/scsi/zfcp_def.h +++ b/drivers/s390/scsi/zfcp_def.h @@ -1,19 +1,8 @@ /* - * - * linux/drivers/s390/scsi/zfcp_def.h - * - * FCP adapter driver for IBM eServer zSeries - * - * (C) Copyright IBM Corp. 2002, 2004 + * This file is part of the zfcp device driver for + * FCP adapters for IBM System z9 and zSeries. * - * Author(s): Martin Peschke - * Raimund Schroeder - * Aron Zeh - * Wolfgang Taphorn - * Stefan Bader - * Heiko Carstens - * Andreas Herrmann - * Volker Sameske + * (C) Copyright IBM Corp. 2002, 2006 * * 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 @@ -50,7 +39,6 @@ #include #include #include -#include "../../fc4/fc.h" #include "zfcp_fsf.h" #include #include @@ -64,7 +52,7 @@ /********************* GENERAL DEFINES *********************************/ /* zfcp version number, it consists of major, minor, and patch-level number */ -#define ZFCP_VERSION "4.5.0" +#define ZFCP_VERSION "4.8.0" /** * zfcp_sg_to_address - determine kernel address from struct scatterlist @@ -89,14 +77,10 @@ zfcp_address_to_sg(void *address, struct scatterlist *list) list->offset = ((unsigned long) address) & (PAGE_SIZE - 1); } -/********************* SCSI SPECIFIC DEFINES *********************************/ +#define REQUEST_LIST_SIZE 128 -/* 32 bit for SCSI ID and LUN as long as the SCSI stack uses this type */ -typedef u32 scsi_id_t; -typedef u32 scsi_lun_t; - -#define ZFCP_ERP_SCSI_LOW_MEM_TIMEOUT (100*HZ) -#define ZFCP_SCSI_ER_TIMEOUT (100*HZ) +/********************* SCSI SPECIFIC DEFINES *********************************/ +#define ZFCP_SCSI_ER_TIMEOUT (10*HZ) /********************* CIO/QDIO SPECIFIC DEFINES *****************************/ @@ -233,8 +217,9 @@ struct fcp_rsp_iu { #define RSP_CODE_TASKMAN_FAILED 5 /* see fc-fs */ -#define LS_FAN 0x60000000 -#define LS_RSCN 0x61040000 +#define LS_RSCN 0x61040000 +#define LS_LOGO 0x05000000 +#define LS_PLOGI 0x03000000 struct fcp_rscn_head { u8 command; @@ -263,13 +248,6 @@ struct fcp_rscn_element { #define ZFCP_NO_PORTS_PER_DOMAIN 0x10000 #define ZFCP_NO_PORTS_PER_FABRIC 0x1000000 -struct fcp_fan { - u32 command; - u32 fport_did; - wwn_t fport_wwpn; - wwn_t fport_wwname; -} __attribute__((packed)); - /* see fc-ph */ struct fcp_logo { u32 command; @@ -507,9 +485,6 @@ struct zfcp_rc_entry { #define ZFCP_NAME "zfcp" -/* read-only LUN sharing switch initial value */ -#define ZFCP_RO_LUN_SHARING_DEFAULTS 0 - /* independent log areas */ #define ZFCP_LOG_AREA_OTHER 0 #define ZFCP_LOG_AREA_SCSI 1 @@ -608,7 +583,6 @@ do { \ * and unit */ #define ZFCP_COMMON_FLAGS 0xfff00000 -#define ZFCP_SPECIFIC_FLAGS 0x000fffff /* common status bits */ #define ZFCP_STATUS_COMMON_REMOVE 0x80000000 @@ -633,11 +607,6 @@ do { \ #define ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED 0x00000200 #define ZFCP_STATUS_ADAPTER_XPORT_OK 0x00000800 -#define ZFCP_STATUS_ADAPTER_SCSI_UP \ - (ZFCP_STATUS_COMMON_UNBLOCKED | \ - ZFCP_STATUS_ADAPTER_REGISTERED) - - /* FC-PH/FC-GS well-known address identifiers for generic services */ #define ZFCP_DID_MANAGEMENT_SERVICE 0xFFFFFA #define ZFCP_DID_TIME_SERVICE 0xFFFFFB @@ -652,7 +621,6 @@ do { \ #define ZFCP_STATUS_PORT_NO_WWPN 0x00000008 #define ZFCP_STATUS_PORT_NO_SCSI_ID 0x00000010 #define ZFCP_STATUS_PORT_INVALID_WWPN 0x00000020 -#define ZFCP_STATUS_PORT_ACCESS_DENIED 0x00000040 /* for ports with well known addresses */ #define ZFCP_STATUS_PORT_WKA \ @@ -908,24 +876,21 @@ struct zfcp_adapter { wwn_t peer_wwpn; /* P2P peer WWPN */ u32 peer_d_id; /* P2P peer D_ID */ struct ccw_device *ccw_device; /* S/390 ccw device */ - u8 fc_service_class; u32 hydra_version; /* Hydra version */ u32 fsf_lic_version; u32 adapter_features; /* FCP channel features */ u32 connection_features; /* host connection features */ u32 hardware_version; /* of FCP channel */ struct Scsi_Host *scsi_host; /* Pointer to mid-layer */ - unsigned short scsi_host_no; /* Assigned host number */ - unsigned char name[9]; struct list_head port_list_head; /* remote port list */ struct list_head port_remove_lh; /* head of ports to be removed */ u32 ports; /* number of remote ports */ - struct timer_list scsi_er_timer; /* SCSI err recovery watch */ - struct list_head fsf_req_list_head; /* head of FSF req list */ - spinlock_t fsf_req_list_lock; /* lock for ops on list of - FSF requests */ - atomic_t fsf_reqs_active; /* # active FSF reqs */ + struct timer_list scsi_er_timer; /* SCSI err recovery watch */ + atomic_t reqs_active; /* # active FSF reqs */ + unsigned long req_no; /* unique FSF req number */ + struct list_head *req_list; /* list of pending reqs */ + spinlock_t req_list_lock; /* request list lock */ struct zfcp_qdio_queue request_queue; /* request queue */ u32 fsf_req_seq_no; /* FSF cmnd seq number */ wait_queue_head_t request_wq; /* can be used to wait for @@ -994,6 +959,8 @@ struct zfcp_port { u32 handle; /* handle assigned by FSF */ struct zfcp_erp_action erp_action; /* pending error recovery */ atomic_t erp_counter; + u32 maxframe_size; + u32 supported_classes; }; /* the struct device sysfs_device must be at the beginning of this structure. @@ -1008,7 +975,7 @@ struct zfcp_unit { refcount drop to zero */ struct zfcp_port *port; /* remote port of unit */ atomic_t status; /* status of this logical unit */ - scsi_lun_t scsi_lun; /* own SCSI LUN */ + unsigned int scsi_lun; /* own SCSI LUN */ fcp_lun_t fcp_lun; /* own FCP_LUN */ u32 handle; /* handle assigned by FSF */ struct scsi_device *device; /* scsi device struct pointer */ @@ -1019,6 +986,7 @@ struct zfcp_unit { /* FSF request */ struct zfcp_fsf_req { struct list_head list; /* list of FSF requests */ + unsigned long req_id; /* unique request ID */ struct zfcp_adapter *adapter; /* adapter request belongs to */ u8 sbal_number; /* nr of SBALs free for use */ u8 sbal_first; /* first SBAL for this request */ @@ -1052,11 +1020,6 @@ struct zfcp_data { struct list_head adapter_list_head; /* head of adapter list */ struct list_head adapter_remove_lh; /* head of adapters to be removed */ - rwlock_t status_read_lock; /* for status read thread */ - struct list_head status_read_receive_head; - struct list_head status_read_send_head; - struct semaphore status_read_sema; - wait_queue_head_t status_read_thread_wqh; u32 adapters; /* # of adapters in list */ rwlock_t config_lock; /* serialises changes to adapter/port/unit @@ -1095,9 +1058,6 @@ struct zfcp_fsf_req_pool_element { /********************** ZFCP SPECIFIC DEFINES ********************************/ -#define ZFCP_FSFREQ_CLEANUP_TIMEOUT HZ/10 - -#define ZFCP_KNOWN 0x00000001 #define ZFCP_REQ_AUTO_CLEANUP 0x00000002 #define ZFCP_WAIT_FOR_SBAL 0x00000004 #define ZFCP_REQ_NO_QTCB 0x00000008 @@ -1105,9 +1065,6 @@ struct zfcp_fsf_req_pool_element { #define ZFCP_SET 0x00000100 #define ZFCP_CLEAR 0x00000200 -#define ZFCP_INTERRUPTIBLE 1 -#define ZFCP_UNINTERRUPTIBLE 0 - #ifndef atomic_test_mask #define atomic_test_mask(mask, target) \ ((atomic_read(target) & mask) == mask) diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c index 57cb628a0..7f60b6fdf 100644 --- a/drivers/s390/scsi/zfcp_erp.c +++ b/drivers/s390/scsi/zfcp_erp.c @@ -1,18 +1,8 @@ /* - * - * linux/drivers/s390/scsi/zfcp_erp.c - * - * FCP adapter driver for IBM eServer zSeries - * - * (C) Copyright IBM Corp. 2002, 2004 - * - * Author(s): Martin Peschke - * Raimund Schroeder - * Aron Zeh - * Wolfgang Taphorn - * Stefan Bader - * Heiko Carstens - * Andreas Herrmann + * This file is part of the zfcp device driver for + * FCP adapters for IBM System z9 and zSeries. + * + * (C) Copyright IBM Corp. 2002, 2006 * * 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 @@ -74,8 +64,8 @@ static int zfcp_erp_strategy_check_action(struct zfcp_erp_action *, int); static int zfcp_erp_adapter_strategy(struct zfcp_erp_action *); static int zfcp_erp_adapter_strategy_generic(struct zfcp_erp_action *, int); static int zfcp_erp_adapter_strategy_close(struct zfcp_erp_action *); -static int zfcp_erp_adapter_strategy_close_qdio(struct zfcp_erp_action *); -static int zfcp_erp_adapter_strategy_close_fsf(struct zfcp_erp_action *); +static void zfcp_erp_adapter_strategy_close_qdio(struct zfcp_erp_action *); +static void zfcp_erp_adapter_strategy_close_fsf(struct zfcp_erp_action *); static int zfcp_erp_adapter_strategy_open(struct zfcp_erp_action *); static int zfcp_erp_adapter_strategy_open_qdio(struct zfcp_erp_action *); static int zfcp_erp_adapter_strategy_open_fsf(struct zfcp_erp_action *); @@ -103,10 +93,9 @@ static int zfcp_erp_unit_strategy_clearstati(struct zfcp_unit *); static int zfcp_erp_unit_strategy_close(struct zfcp_erp_action *); static int zfcp_erp_unit_strategy_open(struct zfcp_erp_action *); -static int zfcp_erp_action_dismiss_adapter(struct zfcp_adapter *); -static int zfcp_erp_action_dismiss_port(struct zfcp_port *); -static int zfcp_erp_action_dismiss_unit(struct zfcp_unit *); -static int zfcp_erp_action_dismiss(struct zfcp_erp_action *); +static void zfcp_erp_action_dismiss_port(struct zfcp_port *); +static void zfcp_erp_action_dismiss_unit(struct zfcp_unit *); +static void zfcp_erp_action_dismiss(struct zfcp_erp_action *); static int zfcp_erp_action_enqueue(int, struct zfcp_adapter *, struct zfcp_port *, struct zfcp_unit *); @@ -145,29 +134,39 @@ zfcp_fsf_request_timeout_handler(unsigned long data) zfcp_erp_adapter_reopen(adapter, 0); } -/* - * function: zfcp_fsf_scsi_er_timeout_handler - * - * purpose: This function needs to be called whenever a SCSI error recovery - * action (abort/reset) does not return. - * Re-opening the adapter means that the command can be returned - * by zfcp (it is guarranteed that it does not return via the - * adapter anymore). The buffer can then be used again. - * - * returns: sod all +/** + * zfcp_fsf_scsi_er_timeout_handler - timeout handler for scsi eh tasks + * + * This function needs to be called whenever a SCSI error recovery + * action (abort/reset) does not return. Re-opening the adapter means + * that the abort/reset command can be returned by zfcp. It won't complete + * via the adapter anymore (because qdio queues are closed). If ERP is + * already running on this adapter it will be stopped. */ -void -zfcp_fsf_scsi_er_timeout_handler(unsigned long data) +void zfcp_fsf_scsi_er_timeout_handler(unsigned long data) { struct zfcp_adapter *adapter = (struct zfcp_adapter *) data; + unsigned long flags; ZFCP_LOG_NORMAL("warning: SCSI error recovery timed out. " "Restarting all operations on the adapter %s\n", zfcp_get_busid_by_adapter(adapter)); debug_text_event(adapter->erp_dbf, 1, "eh_lmem_tout"); - zfcp_erp_adapter_reopen(adapter, 0); - return; + write_lock_irqsave(&adapter->erp_lock, flags); + if (atomic_test_mask(ZFCP_STATUS_ADAPTER_ERP_PENDING, + &adapter->status)) { + zfcp_erp_modify_adapter_status(adapter, + ZFCP_STATUS_COMMON_UNBLOCKED|ZFCP_STATUS_COMMON_OPEN, + ZFCP_CLEAR); + zfcp_erp_action_dismiss_adapter(adapter); + write_unlock_irqrestore(&adapter->erp_lock, flags); + /* dismiss all pending requests including requests for ERP */ + zfcp_fsf_req_dismiss_all(adapter); + adapter->fsf_req_seq_no = 0; + } else + write_unlock_irqrestore(&adapter->erp_lock, flags); + zfcp_erp_adapter_reopen(adapter, 0); } /* @@ -177,7 +176,7 @@ zfcp_fsf_scsi_er_timeout_handler(unsigned long data) * initiates adapter recovery which is done * asynchronously * - * returns: 0 - initiated action succesfully + * returns: 0 - initiated action successfully * <0 - failed to initiate action */ int @@ -213,7 +212,7 @@ zfcp_erp_adapter_reopen_internal(struct zfcp_adapter *adapter, int clear_mask) * purpose: Wrappper for zfcp_erp_adapter_reopen_internal * used to ensure the correct locking * - * returns: 0 - initiated action succesfully + * returns: 0 - initiated action successfully * <0 - failed to initiate action */ int @@ -231,13 +230,6 @@ zfcp_erp_adapter_reopen(struct zfcp_adapter *adapter, int clear_mask) return retval; } -/* - * function: - * - * purpose: - * - * returns: - */ int zfcp_erp_adapter_shutdown(struct zfcp_adapter *adapter, int clear_mask) { @@ -251,13 +243,6 @@ zfcp_erp_adapter_shutdown(struct zfcp_adapter *adapter, int clear_mask) return retval; } -/* - * function: - * - * purpose: - * - * returns: - */ int zfcp_erp_port_shutdown(struct zfcp_port *port, int clear_mask) { @@ -271,13 +256,6 @@ zfcp_erp_port_shutdown(struct zfcp_port *port, int clear_mask) return retval; } -/* - * function: - * - * purpose: - * - * returns: - */ int zfcp_erp_unit_shutdown(struct zfcp_unit *unit, int clear_mask) { @@ -306,20 +284,17 @@ zfcp_erp_adisc(struct zfcp_port *port) int retval = 0; struct timer_list *timer; - send_els = kmalloc(sizeof(struct zfcp_send_els), GFP_ATOMIC); + send_els = kzalloc(sizeof(struct zfcp_send_els), GFP_ATOMIC); if (send_els == NULL) goto nomem; - memset(send_els, 0, sizeof(*send_els)); - send_els->req = kmalloc(sizeof(struct scatterlist), GFP_ATOMIC); + send_els->req = kzalloc(sizeof(struct scatterlist), GFP_ATOMIC); if (send_els->req == NULL) goto nomem; - memset(send_els->req, 0, sizeof(*send_els->req)); - send_els->resp = kmalloc(sizeof(struct scatterlist), GFP_ATOMIC); + send_els->resp = kzalloc(sizeof(struct scatterlist), GFP_ATOMIC); if (send_els->resp == NULL) goto nomem; - memset(send_els->resp, 0, sizeof(*send_els->resp)); address = (void *) get_zeroed_page(GFP_ATOMIC); if (address == NULL) @@ -503,7 +478,7 @@ zfcp_test_link(struct zfcp_port *port) * initiates Forced Reopen recovery which is done * asynchronously * - * returns: 0 - initiated action succesfully + * returns: 0 - initiated action successfully * <0 - failed to initiate action */ static int @@ -543,7 +518,7 @@ zfcp_erp_port_forced_reopen_internal(struct zfcp_port *port, int clear_mask) * purpose: Wrappper for zfcp_erp_port_forced_reopen_internal * used to ensure the correct locking * - * returns: 0 - initiated action succesfully + * returns: 0 - initiated action successfully * <0 - failed to initiate action */ int @@ -570,7 +545,7 @@ zfcp_erp_port_forced_reopen(struct zfcp_port *port, int clear_mask) * initiates Reopen recovery which is done * asynchronously * - * returns: 0 - initiated action succesfully + * returns: 0 - initiated action successfully * <0 - failed to initiate action */ static int @@ -639,7 +614,7 @@ zfcp_erp_port_reopen(struct zfcp_port *port, int clear_mask) * initiates Reopen recovery which is done * asynchronously * - * returns: 0 - initiated action succesfully + * returns: 0 - initiated action successfully * <0 - failed to initiate action */ static int @@ -704,17 +679,10 @@ zfcp_erp_unit_reopen(struct zfcp_unit *unit, int clear_mask) return retval; } -/* - * function: - * - * purpose: disable I/O, - * return any open requests and clean them up, - * aim: no pending and incoming I/O - * - * returns: +/** + * zfcp_erp_adapter_block - mark adapter as blocked, block scsi requests */ -static void -zfcp_erp_adapter_block(struct zfcp_adapter *adapter, int clear_mask) +static void zfcp_erp_adapter_block(struct zfcp_adapter *adapter, int clear_mask) { debug_text_event(adapter->erp_dbf, 6, "a_bl"); zfcp_erp_modify_adapter_status(adapter, @@ -722,15 +690,10 @@ zfcp_erp_adapter_block(struct zfcp_adapter *adapter, int clear_mask) clear_mask, ZFCP_CLEAR); } -/* - * function: - * - * purpose: enable I/O - * - * returns: +/** + * zfcp_erp_adapter_unblock - mark adapter as unblocked, allow scsi requests */ -static void -zfcp_erp_adapter_unblock(struct zfcp_adapter *adapter) +static void zfcp_erp_adapter_unblock(struct zfcp_adapter *adapter) { debug_text_event(adapter->erp_dbf, 6, "a_ubl"); atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &adapter->status); @@ -812,13 +775,6 @@ zfcp_erp_unit_unblock(struct zfcp_unit *unit) atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &unit->status); } -/* - * function: - * - * purpose: - * - * returns: - */ static void zfcp_erp_action_ready(struct zfcp_erp_action *erp_action) { @@ -889,18 +845,16 @@ zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *erp_action) struct zfcp_adapter *adapter = erp_action->adapter; if (erp_action->fsf_req) { - /* take lock to ensure that request is not being deleted meanwhile */ - spin_lock(&adapter->fsf_req_list_lock); - /* check whether fsf req does still exist */ - list_for_each_entry(fsf_req, &adapter->fsf_req_list_head, list) - if (fsf_req == erp_action->fsf_req) - break; - if (fsf_req && (fsf_req->erp_action == erp_action)) { + /* take lock to ensure that request is not deleted meanwhile */ + spin_lock(&adapter->req_list_lock); + if ((!zfcp_reqlist_ismember(adapter, + erp_action->fsf_req->req_id)) && + (fsf_req->erp_action == erp_action)) { /* fsf_req still exists */ debug_text_event(adapter->erp_dbf, 3, "a_ca_req"); debug_event(adapter->erp_dbf, 3, &fsf_req, sizeof (unsigned long)); - /* dismiss fsf_req of timed out or dismissed erp_action */ + /* dismiss fsf_req of timed out/dismissed erp_action */ if (erp_action->status & (ZFCP_STATUS_ERP_DISMISSED | ZFCP_STATUS_ERP_TIMEDOUT)) { debug_text_event(adapter->erp_dbf, 3, @@ -933,30 +887,22 @@ zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *erp_action) */ erp_action->fsf_req = NULL; } - spin_unlock(&adapter->fsf_req_list_lock); + spin_unlock(&adapter->req_list_lock); } else debug_text_event(adapter->erp_dbf, 3, "a_ca_noreq"); return retval; } -/* - * purpose: generic handler for asynchronous events related to erp_action events - * (normal completion, time-out, dismissing, retry after - * low memory condition) - * - * note: deletion of timer is not required (e.g. in case of a time-out), - * but a second try does no harm, - * we leave it in here to allow for greater simplification +/** + * zfcp_erp_async_handler_nolock - complete erp_action * - * returns: 0 - there was an action to handle - * !0 - otherwise + * Used for normal completion, time-out, dismissal and failure after + * low memory condition. */ -static int -zfcp_erp_async_handler_nolock(struct zfcp_erp_action *erp_action, - unsigned long set_mask) +static void zfcp_erp_async_handler_nolock(struct zfcp_erp_action *erp_action, + unsigned long set_mask) { - int retval; struct zfcp_adapter *adapter = erp_action->adapter; if (zfcp_erp_action_exists(erp_action) == ZFCP_ERP_ACTION_RUNNING) { @@ -967,43 +913,26 @@ zfcp_erp_async_handler_nolock(struct zfcp_erp_action *erp_action, del_timer(&erp_action->timer); erp_action->status |= set_mask; zfcp_erp_action_ready(erp_action); - retval = 0; } else { /* action is ready or gone - nothing to do */ debug_text_event(adapter->erp_dbf, 3, "a_asyh_gone"); debug_event(adapter->erp_dbf, 3, &erp_action->action, sizeof (int)); - retval = 1; } - - return retval; } -/* - * purpose: generic handler for asynchronous events related to erp_action - * events (normal completion, time-out, dismissing, retry after - * low memory condition) - * - * note: deletion of timer is not required (e.g. in case of a time-out), - * but a second try does no harm, - * we leave it in here to allow for greater simplification - * - * returns: 0 - there was an action to handle - * !0 - otherwise +/** + * zfcp_erp_async_handler - wrapper for erp_async_handler_nolock w/ locking */ -int -zfcp_erp_async_handler(struct zfcp_erp_action *erp_action, - unsigned long set_mask) +void zfcp_erp_async_handler(struct zfcp_erp_action *erp_action, + unsigned long set_mask) { struct zfcp_adapter *adapter = erp_action->adapter; unsigned long flags; - int retval; write_lock_irqsave(&adapter->erp_lock, flags); - retval = zfcp_erp_async_handler_nolock(erp_action, set_mask); + zfcp_erp_async_handler_nolock(erp_action, set_mask); write_unlock_irqrestore(&adapter->erp_lock, flags); - - return retval; } /* @@ -1040,17 +969,15 @@ zfcp_erp_timeout_handler(unsigned long data) zfcp_erp_async_handler(erp_action, ZFCP_STATUS_ERP_TIMEDOUT); } -/* - * purpose: is called for an erp_action which needs to be ended - * though not being done, - * this is usually required if an higher is generated, - * action gets an appropriate flag and will be processed - * accordingly +/** + * zfcp_erp_action_dismiss - dismiss an erp_action * - * locks: erp_lock held (thus we need to call another handler variant) + * adapter->erp_lock must be held + * + * Dismissal of an erp_action is usually required if an erp_action of + * higher priority is generated. */ -static int -zfcp_erp_action_dismiss(struct zfcp_erp_action *erp_action) +static void zfcp_erp_action_dismiss(struct zfcp_erp_action *erp_action) { struct zfcp_adapter *adapter = erp_action->adapter; @@ -1058,8 +985,6 @@ zfcp_erp_action_dismiss(struct zfcp_erp_action *erp_action) debug_event(adapter->erp_dbf, 2, &erp_action->action, sizeof (int)); zfcp_erp_async_handler_nolock(erp_action, ZFCP_STATUS_ERP_DISMISSED); - - return 0; } int @@ -1356,13 +1281,6 @@ zfcp_erp_strategy_check_action(struct zfcp_erp_action *erp_action, int retval) return retval; } -/* - * function: - * - * purpose: - * - * returns: - */ static int zfcp_erp_strategy_do_action(struct zfcp_erp_action *erp_action) { @@ -1538,13 +1456,6 @@ zfcp_erp_strategy_check_target(struct zfcp_erp_action *erp_action, int result) return result; } -/* - * function: - * - * purpose: - * - * returns: - */ static int zfcp_erp_strategy_statechange(int action, u32 status, @@ -1586,13 +1497,6 @@ zfcp_erp_strategy_statechange(int action, return retval; } -/* - * function: - * - * purpose: - * - * returns: - */ static inline int zfcp_erp_strategy_statechange_detected(atomic_t * target_status, u32 erp_status) { @@ -1605,13 +1509,6 @@ zfcp_erp_strategy_statechange_detected(atomic_t * target_status, u32 erp_status) !(ZFCP_STATUS_ERP_CLOSE_ONLY & erp_status)); } -/* - * function: - * - * purpose: - * - * returns: - */ static int zfcp_erp_strategy_check_unit(struct zfcp_unit *unit, int result) { @@ -1642,13 +1539,6 @@ zfcp_erp_strategy_check_unit(struct zfcp_unit *unit, int result) return result; } -/* - * function: - * - * purpose: - * - * returns: - */ static int zfcp_erp_strategy_check_port(struct zfcp_port *port, int result) { @@ -1678,13 +1568,6 @@ zfcp_erp_strategy_check_port(struct zfcp_port *port, int result) return result; } -/* - * function: - * - * purpose: - * - * returns: - */ static int zfcp_erp_strategy_check_adapter(struct zfcp_adapter *adapter, int result) { @@ -1764,13 +1647,6 @@ zfcp_erp_strategy_followup_actions(int action, return 0; } -/* - * function: - * - * purpose: - * - * returns: - */ static int zfcp_erp_strategy_check_queues(struct zfcp_adapter *adapter) { @@ -1809,12 +1685,6 @@ zfcp_erp_wait(struct zfcp_adapter *adapter) return retval; } -/* - * function: zfcp_erp_modify_adapter_status - * - * purpose: - * - */ void zfcp_erp_modify_adapter_status(struct zfcp_adapter *adapter, u32 mask, int set_or_clear) @@ -1901,7 +1771,7 @@ zfcp_erp_modify_unit_status(struct zfcp_unit *unit, u32 mask, int set_or_clear) * purpose: Wrappper for zfcp_erp_port_reopen_all_internal * used to ensure the correct locking * - * returns: 0 - initiated action succesfully + * returns: 0 - initiated action successfully * <0 - failed to initiate action */ int @@ -1919,13 +1789,6 @@ zfcp_erp_port_reopen_all(struct zfcp_adapter *adapter, int clear_mask) return retval; } -/* - * function: - * - * purpose: - * - * returns: FIXME - */ static int zfcp_erp_port_reopen_all_internal(struct zfcp_adapter *adapter, int clear_mask) { @@ -2177,18 +2040,12 @@ zfcp_erp_adapter_strategy_open_qdio(struct zfcp_erp_action *erp_action) return retval; } -/* - * function: zfcp_qdio_cleanup - * - * purpose: cleans up QDIO operation for the specified adapter - * - * returns: 0 - successful cleanup - * !0 - failed cleanup +/** + * zfcp_erp_adapter_strategy_close_qdio - close qdio queues for an adapter */ -int +static void zfcp_erp_adapter_strategy_close_qdio(struct zfcp_erp_action *erp_action) { - int retval = ZFCP_ERP_SUCCEEDED; int first_used; int used_count; struct zfcp_adapter *adapter = erp_action->adapter; @@ -2197,15 +2054,13 @@ zfcp_erp_adapter_strategy_close_qdio(struct zfcp_erp_action *erp_action) ZFCP_LOG_DEBUG("error: attempt to shut down inactive QDIO " "queues on adapter %s\n", zfcp_get_busid_by_adapter(adapter)); - retval = ZFCP_ERP_FAILED; - goto out; + return; } /* * Get queue_lock and clear QDIOUP flag. Thus it's guaranteed that * do_QDIO won't be called while qdio_shutdown is in progress. */ - write_lock_irq(&adapter->request_queue.queue_lock); atomic_clear_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &adapter->status); write_unlock_irq(&adapter->request_queue.queue_lock); @@ -2237,8 +2092,6 @@ zfcp_erp_adapter_strategy_close_qdio(struct zfcp_erp_action *erp_action) adapter->request_queue.free_index = 0; atomic_set(&adapter->request_queue.free_count, 0); adapter->request_queue.distance_from_int = 0; - out: - return retval; } static int @@ -2271,9 +2124,9 @@ zfcp_erp_adapter_strategy_open_fsf_xconfig(struct zfcp_erp_action *erp_action) atomic_clear_mask(ZFCP_STATUS_ADAPTER_HOST_CON_INIT, &adapter->status); ZFCP_LOG_DEBUG("Doing exchange config data\n"); - write_lock(&adapter->erp_lock); + write_lock_irq(&adapter->erp_lock); zfcp_erp_action_to_running(erp_action); - write_unlock(&adapter->erp_lock); + write_unlock_irq(&adapter->erp_lock); zfcp_erp_timeout_init(erp_action); if (zfcp_fsf_exchange_config_data(erp_action)) { retval = ZFCP_ERP_FAILED; @@ -2339,9 +2192,9 @@ zfcp_erp_adapter_strategy_open_fsf_xport(struct zfcp_erp_action *erp_action) adapter = erp_action->adapter; atomic_clear_mask(ZFCP_STATUS_ADAPTER_XPORT_OK, &adapter->status); - write_lock(&adapter->erp_lock); + write_lock_irq(&adapter->erp_lock); zfcp_erp_action_to_running(erp_action); - write_unlock(&adapter->erp_lock); + write_unlock_irq(&adapter->erp_lock); zfcp_erp_timeout_init(erp_action); ret = zfcp_fsf_exchange_port_data(erp_action, adapter, NULL); @@ -2361,22 +2214,15 @@ zfcp_erp_adapter_strategy_open_fsf_xport(struct zfcp_erp_action *erp_action) "%s)\n", zfcp_get_busid_by_adapter(adapter)); ret = ZFCP_ERP_FAILED; } - if (!atomic_test_mask(ZFCP_STATUS_ADAPTER_XPORT_OK, &adapter->status)) { - ZFCP_LOG_INFO("error: exchange port data failed (adapter " + + /* don't treat as error for the sake of compatibility */ + if (!atomic_test_mask(ZFCP_STATUS_ADAPTER_XPORT_OK, &adapter->status)) + ZFCP_LOG_INFO("warning: exchange port data failed (adapter " "%s\n", zfcp_get_busid_by_adapter(adapter)); - ret = ZFCP_ERP_FAILED; - } return ret; } -/* - * function: - * - * purpose: - * - * returns: - */ static int zfcp_erp_adapter_strategy_open_fsf_statusread(struct zfcp_erp_action *erp_action) @@ -2402,18 +2248,12 @@ zfcp_erp_adapter_strategy_open_fsf_statusread(struct zfcp_erp_action return retval; } -/* - * function: zfcp_fsf_cleanup - * - * purpose: cleanup FSF operation for specified adapter - * - * returns: 0 - FSF operation successfully cleaned up - * !0 - failed to cleanup FSF operation for this adapter +/** + * zfcp_erp_adapter_strategy_close_fsf - stop FSF operations for an adapter */ -static int +static void zfcp_erp_adapter_strategy_close_fsf(struct zfcp_erp_action *erp_action) { - int retval = ZFCP_ERP_SUCCEEDED; struct zfcp_adapter *adapter = erp_action->adapter; /* @@ -2427,8 +2267,6 @@ zfcp_erp_adapter_strategy_close_fsf(struct zfcp_erp_action *erp_action) /* all ports and units are closed */ zfcp_erp_modify_adapter_status(adapter, ZFCP_STATUS_COMMON_OPEN, ZFCP_CLEAR); - - return retval; } /* @@ -2545,13 +2383,6 @@ zfcp_erp_port_strategy(struct zfcp_erp_action *erp_action) return retval; } -/* - * function: - * - * purpose: - * - * returns: - */ static int zfcp_erp_port_strategy_open(struct zfcp_erp_action *erp_action) { @@ -2566,15 +2397,6 @@ zfcp_erp_port_strategy_open(struct zfcp_erp_action *erp_action) return retval; } -/* - * function: - * - * purpose: - * - * returns: - * - * FIXME(design): currently only prepared for fabric (nameserver!) - */ static int zfcp_erp_port_strategy_open_common(struct zfcp_erp_action *erp_action) { @@ -2690,13 +2512,6 @@ zfcp_erp_port_strategy_open_common(struct zfcp_erp_action *erp_action) return retval; } -/* - * function: - * - * purpose: - * - * returns: - */ static int zfcp_erp_port_strategy_open_nameserver(struct zfcp_erp_action *erp_action) { @@ -2813,13 +2628,6 @@ zfcp_erp_port_forced_strategy_close(struct zfcp_erp_action *erp_action) return retval; } -/* - * function: - * - * purpose: - * - * returns: - */ static int zfcp_erp_port_strategy_clearstati(struct zfcp_port *port) { @@ -3022,13 +2830,6 @@ zfcp_erp_unit_strategy(struct zfcp_erp_action *erp_action) return retval; } -/* - * function: - * - * purpose: - * - * returns: - */ static int zfcp_erp_unit_strategy_clearstati(struct zfcp_unit *unit) { @@ -3129,13 +2930,6 @@ zfcp_erp_unit_strategy_open(struct zfcp_erp_action *erp_action) return retval; } -/* - * function: - * - * purpose: - * - * returns: - */ static inline void zfcp_erp_timeout_init(struct zfcp_erp_action *erp_action) { @@ -3331,13 +3125,6 @@ zfcp_erp_action_enqueue(int action, return retval; } -/* - * function: - * - * purpose: - * - * returns: - */ static int zfcp_erp_action_dequeue(struct zfcp_erp_action *erp_action) { @@ -3402,9 +3189,13 @@ zfcp_erp_action_cleanup(int action, struct zfcp_adapter *adapter, break; case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED: case ZFCP_ERP_ACTION_REOPEN_PORT: + if (atomic_test_mask(ZFCP_STATUS_PORT_NO_WWPN, + &port->status)) { + zfcp_port_put(port); + break; + } + if ((result == ZFCP_ERP_SUCCEEDED) - && !atomic_test_mask(ZFCP_STATUS_PORT_NO_WWPN, - &port->status) && !port->rport) { struct fc_rport_identifiers ids; ids.node_name = port->wwnn; @@ -3418,12 +3209,30 @@ zfcp_erp_action_cleanup(int action, struct zfcp_adapter *adapter, "(adapter %s, wwpn=0x%016Lx)\n", zfcp_get_busid_by_port(port), port->wwpn); - else + else { scsi_flush_work(adapter->scsi_host); + port->rport->maxframe_size = port->maxframe_size; + port->rport->supported_classes = + port->supported_classes; + } + } + if ((result != ZFCP_ERP_SUCCEEDED) && port->rport) { + fc_remote_port_delete(port->rport); + port->rport = NULL; } zfcp_port_put(port); break; case ZFCP_ERP_ACTION_REOPEN_ADAPTER: + if (result != ZFCP_ERP_SUCCEEDED) { + struct zfcp_port *port; + list_for_each_entry(port, &adapter->port_list_head, list) + if (port->rport && + !atomic_test_mask(ZFCP_STATUS_PORT_WKA, + &port->status)) { + fc_remote_port_delete(port->rport); + port->rport = NULL; + } + } zfcp_adapter_put(adapter); break; default: @@ -3432,17 +3241,8 @@ zfcp_erp_action_cleanup(int action, struct zfcp_adapter *adapter, } -/* - * function: - * - * purpose: - * - * returns: FIXME - */ -static int -zfcp_erp_action_dismiss_adapter(struct zfcp_adapter *adapter) +void zfcp_erp_action_dismiss_adapter(struct zfcp_adapter *adapter) { - int retval = 0; struct zfcp_port *port; debug_text_event(adapter->erp_dbf, 5, "a_actab"); @@ -3451,21 +3251,10 @@ zfcp_erp_action_dismiss_adapter(struct zfcp_adapter *adapter) else list_for_each_entry(port, &adapter->port_list_head, list) zfcp_erp_action_dismiss_port(port); - - return retval; } -/* - * function: - * - * purpose: - * - * returns: FIXME - */ -static int -zfcp_erp_action_dismiss_port(struct zfcp_port *port) +static void zfcp_erp_action_dismiss_port(struct zfcp_port *port) { - int retval = 0; struct zfcp_unit *unit; struct zfcp_adapter *adapter = port->adapter; @@ -3476,38 +3265,18 @@ zfcp_erp_action_dismiss_port(struct zfcp_port *port) else list_for_each_entry(unit, &port->unit_list_head, list) zfcp_erp_action_dismiss_unit(unit); - - return retval; } -/* - * function: - * - * purpose: - * - * returns: FIXME - */ -static int -zfcp_erp_action_dismiss_unit(struct zfcp_unit *unit) +static void zfcp_erp_action_dismiss_unit(struct zfcp_unit *unit) { - int retval = 0; struct zfcp_adapter *adapter = unit->port->adapter; debug_text_event(adapter->erp_dbf, 5, "u_actab"); debug_event(adapter->erp_dbf, 5, &unit->fcp_lun, sizeof (fcp_lun_t)); if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_INUSE, &unit->status)) zfcp_erp_action_dismiss(&unit->erp_action); - - return retval; } -/* - * function: - * - * purpose: moves erp_action to 'erp running list' - * - * returns: - */ static inline void zfcp_erp_action_to_running(struct zfcp_erp_action *erp_action) { @@ -3518,13 +3287,6 @@ zfcp_erp_action_to_running(struct zfcp_erp_action *erp_action) list_move(&erp_action->list, &erp_action->adapter->erp_running_head); } -/* - * function: - * - * purpose: moves erp_action to 'erp ready list' - * - * returns: - */ static inline void zfcp_erp_action_to_ready(struct zfcp_erp_action *erp_action) { @@ -3535,11 +3297,6 @@ zfcp_erp_action_to_ready(struct zfcp_erp_action *erp_action) list_move(&erp_action->list, &erp_action->adapter->erp_ready_head); } -/* - * function: zfcp_erp_port_boxed - * - * purpose: - */ void zfcp_erp_port_boxed(struct zfcp_port *port) { @@ -3556,11 +3313,6 @@ zfcp_erp_port_boxed(struct zfcp_port *port) zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED); } -/* - * function: zfcp_erp_unit_boxed - * - * purpose: - */ void zfcp_erp_unit_boxed(struct zfcp_unit *unit) { @@ -3574,11 +3326,6 @@ zfcp_erp_unit_boxed(struct zfcp_unit *unit) zfcp_erp_unit_reopen(unit, ZFCP_STATUS_COMMON_ERP_FAILED); } -/* - * function: zfcp_erp_port_access_denied - * - * purpose: - */ void zfcp_erp_port_access_denied(struct zfcp_port *port) { @@ -3595,11 +3342,6 @@ zfcp_erp_port_access_denied(struct zfcp_port *port) read_unlock_irqrestore(&zfcp_data.config_lock, flags); } -/* - * function: zfcp_erp_unit_access_denied - * - * purpose: - */ void zfcp_erp_unit_access_denied(struct zfcp_unit *unit) { @@ -3613,11 +3355,6 @@ zfcp_erp_unit_access_denied(struct zfcp_unit *unit) ZFCP_SET); } -/* - * function: zfcp_erp_adapter_access_changed - * - * purpose: - */ void zfcp_erp_adapter_access_changed(struct zfcp_adapter *adapter) { @@ -3628,7 +3365,7 @@ zfcp_erp_adapter_access_changed(struct zfcp_adapter *adapter) return; debug_text_event(adapter->erp_dbf, 3, "a_access_recover"); - debug_event(adapter->erp_dbf, 3, &adapter->name, 8); + debug_event(adapter->erp_dbf, 3, zfcp_get_busid_by_adapter(adapter), 8); read_lock_irqsave(&zfcp_data.config_lock, flags); if (adapter->nameserver_port) @@ -3639,11 +3376,6 @@ zfcp_erp_adapter_access_changed(struct zfcp_adapter *adapter) read_unlock_irqrestore(&zfcp_data.config_lock, flags); } -/* - * function: zfcp_erp_port_access_changed - * - * purpose: - */ void zfcp_erp_port_access_changed(struct zfcp_port *port) { @@ -3672,11 +3404,6 @@ zfcp_erp_port_access_changed(struct zfcp_port *port) zfcp_get_busid_by_adapter(adapter), port->wwpn); } -/* - * function: zfcp_erp_unit_access_changed - * - * purpose: - */ void zfcp_erp_unit_access_changed(struct zfcp_unit *unit) { diff --git a/drivers/s390/scsi/zfcp_ext.h b/drivers/s390/scsi/zfcp_ext.h index 700f5402a..146d7a2b4 100644 --- a/drivers/s390/scsi/zfcp_ext.h +++ b/drivers/s390/scsi/zfcp_ext.h @@ -1,18 +1,8 @@ /* - * - * linux/drivers/s390/scsi/zfcp_ext.h - * - * FCP adapter driver for IBM eServer zSeries - * - * (C) Copyright IBM Corp. 2002, 2004 + * This file is part of the zfcp device driver for + * FCP adapters for IBM System z9 and zSeries. * - * Author(s): Martin Peschke - * Raimund Schroeder - * Aron Zeh - * Wolfgang Taphorn - * Stefan Bader - * Heiko Carstens - * Andreas Herrmann + * (C) Copyright IBM Corp. 2002, 2006 * * 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 @@ -73,7 +63,6 @@ extern int zfcp_qdio_allocate_queues(struct zfcp_adapter *); extern void zfcp_qdio_free_queues(struct zfcp_adapter *); extern int zfcp_qdio_determine_pci(struct zfcp_qdio_queue *, struct zfcp_fsf_req *); -extern int zfcp_qdio_reqid_check(struct zfcp_adapter *, void *); extern volatile struct qdio_buffer_element *zfcp_qdio_sbale_req (struct zfcp_fsf_req *, int, int); @@ -125,6 +114,7 @@ extern int zfcp_nameserver_enqueue(struct zfcp_adapter *); extern int zfcp_ns_gid_pn_request(struct zfcp_erp_action *); extern int zfcp_check_ct_response(struct ct_hdr *); extern int zfcp_handle_els_rjt(u32, struct zfcp_ls_rjt_par *); +extern void zfcp_plogi_evaluate(struct zfcp_port *, struct fsf_plogi *); /******************************* SCSI ****************************************/ extern int zfcp_adapter_scsi_register(struct zfcp_adapter *); @@ -141,8 +131,6 @@ extern int zfcp_scsi_command_async(struct zfcp_adapter *,struct zfcp_unit *, struct scsi_cmnd *, struct timer_list *); extern int zfcp_scsi_command_sync(struct zfcp_unit *, struct scsi_cmnd *, struct timer_list *); -extern void zfcp_set_fc_host_attrs(struct zfcp_adapter *); -extern void zfcp_set_fc_rport_attrs(struct zfcp_port *); extern struct scsi_transport_template *zfcp_transport_template; extern struct fc_function_template zfcp_transport_functions; @@ -151,6 +139,7 @@ extern void zfcp_erp_modify_adapter_status(struct zfcp_adapter *, u32, int); extern int zfcp_erp_adapter_reopen(struct zfcp_adapter *, int); extern int zfcp_erp_adapter_shutdown(struct zfcp_adapter *, int); extern void zfcp_erp_adapter_failed(struct zfcp_adapter *); +extern void zfcp_erp_action_dismiss_adapter(struct zfcp_adapter *); extern void zfcp_erp_modify_port_status(struct zfcp_port *, u32, int); extern int zfcp_erp_port_reopen(struct zfcp_port *, int); @@ -167,7 +156,7 @@ extern void zfcp_erp_unit_failed(struct zfcp_unit *); extern int zfcp_erp_thread_setup(struct zfcp_adapter *); extern int zfcp_erp_thread_kill(struct zfcp_adapter *); extern int zfcp_erp_wait(struct zfcp_adapter *); -extern int zfcp_erp_async_handler(struct zfcp_erp_action *, unsigned long); +extern void zfcp_erp_async_handler(struct zfcp_erp_action *, unsigned long); extern int zfcp_test_link(struct zfcp_port *); @@ -201,5 +190,10 @@ extern void zfcp_scsi_dbf_event_abort(const char *, struct zfcp_adapter *, struct zfcp_fsf_req *); extern void zfcp_scsi_dbf_event_devreset(const char *, u8, struct zfcp_unit *, struct scsi_cmnd *); +extern void zfcp_reqlist_add(struct zfcp_adapter *, struct zfcp_fsf_req *); +extern void zfcp_reqlist_remove(struct zfcp_adapter *, unsigned long); +extern struct zfcp_fsf_req *zfcp_reqlist_ismember(struct zfcp_adapter *, + unsigned long); +extern int zfcp_reqlist_isempty(struct zfcp_adapter *); #endif /* ZFCP_EXT_H */ diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c index 662ec571d..ff2eacf5e 100644 --- a/drivers/s390/scsi/zfcp_fsf.c +++ b/drivers/s390/scsi/zfcp_fsf.c @@ -1,19 +1,8 @@ /* + * This file is part of the zfcp device driver for + * FCP adapters for IBM System z9 and zSeries. * - * linux/drivers/s390/scsi/zfcp_fsf.c - * - * FCP adapter driver for IBM eServer zSeries - * - * (C) Copyright IBM Corp. 2002, 2004 - * - * Author(s): Martin Peschke - * Raimund Schroeder - * Aron Zeh - * Wolfgang Taphorn - * Stefan Bader - * Heiko Carstens - * Andreas Herrmann - * Volker Sameske + * (C) Copyright IBM Corp. 2002, 2006 * * 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 @@ -60,7 +49,6 @@ static int zfcp_fsf_fsfstatus_qual_eval(struct zfcp_fsf_req *); static void zfcp_fsf_link_down_info_eval(struct zfcp_adapter *, struct fsf_link_down_info *); static int zfcp_fsf_req_dispatch(struct zfcp_fsf_req *); -static void zfcp_fsf_req_dismiss(struct zfcp_fsf_req *); /* association between FSF command and FSF QTCB type */ static u32 fsf_qtcb_type[] = { @@ -157,47 +145,48 @@ zfcp_fsf_req_free(struct zfcp_fsf_req *fsf_req) kfree(fsf_req); } -/* - * function: - * - * purpose: - * - * returns: - * - * note: qdio queues shall be down (no ongoing inbound processing) +/** + * zfcp_fsf_req_dismiss - dismiss a single fsf request */ -int -zfcp_fsf_req_dismiss_all(struct zfcp_adapter *adapter) +static void zfcp_fsf_req_dismiss(struct zfcp_adapter *adapter, + struct zfcp_fsf_req *fsf_req, + unsigned int counter) { - struct zfcp_fsf_req *fsf_req, *tmp; - unsigned long flags; - LIST_HEAD(remove_queue); + u64 dbg_tmp[2]; - spin_lock_irqsave(&adapter->fsf_req_list_lock, flags); - list_splice_init(&adapter->fsf_req_list_head, &remove_queue); - atomic_set(&adapter->fsf_reqs_active, 0); - spin_unlock_irqrestore(&adapter->fsf_req_list_lock, flags); - - list_for_each_entry_safe(fsf_req, tmp, &remove_queue, list) { - list_del(&fsf_req->list); - zfcp_fsf_req_dismiss(fsf_req); - } - - return 0; + dbg_tmp[0] = (u64) atomic_read(&adapter->reqs_active); + dbg_tmp[1] = (u64) counter; + debug_event(adapter->erp_dbf, 4, (void *) dbg_tmp, 16); + list_del(&fsf_req->list); + fsf_req->status |= ZFCP_STATUS_FSFREQ_DISMISSED; + zfcp_fsf_req_complete(fsf_req); } -/* - * function: - * - * purpose: - * - * returns: +/** + * zfcp_fsf_req_dismiss_all - dismiss all remaining fsf requests */ -static void -zfcp_fsf_req_dismiss(struct zfcp_fsf_req *fsf_req) +int zfcp_fsf_req_dismiss_all(struct zfcp_adapter *adapter) { - fsf_req->status |= ZFCP_STATUS_FSFREQ_DISMISSED; - zfcp_fsf_req_complete(fsf_req); + struct zfcp_fsf_req *request, *tmp; + unsigned long flags; + unsigned int i, counter; + + spin_lock_irqsave(&adapter->req_list_lock, flags); + atomic_set(&adapter->reqs_active, 0); + for (i=0; ireq_list[i])) + continue; + + counter = 0; + list_for_each_entry_safe(request, tmp, + &adapter->req_list[i], list) { + zfcp_fsf_req_dismiss(adapter, request, counter); + counter++; + } + } + spin_unlock_irqrestore(&adapter->req_list_lock, flags); + + return 0; } /* @@ -877,6 +866,7 @@ zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req) struct zfcp_adapter *adapter = fsf_req->adapter; struct fsf_status_read_buffer *status_buffer = (struct fsf_status_read_buffer *) fsf_req->data; + struct fsf_bit_error_payload *fsf_bit_error; if (fsf_req->status & ZFCP_STATUS_FSFREQ_DISMISSED) { zfcp_hba_dbf_event_fsf_unsol("dism", adapter, status_buffer); @@ -903,10 +893,37 @@ zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req) break; case FSF_STATUS_READ_BIT_ERROR_THRESHOLD: - ZFCP_LOG_NORMAL("Bit error threshold data received:\n"); - ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL, - (char *) status_buffer, - sizeof (struct fsf_status_read_buffer)); + fsf_bit_error = (struct fsf_bit_error_payload *) + status_buffer->payload; + ZFCP_LOG_NORMAL("Warning: bit error threshold data " + "received (adapter %s, " + "link failures = %i, loss of sync errors = %i, " + "loss of signal errors = %i, " + "primitive sequence errors = %i, " + "invalid transmission word errors = %i, " + "CRC errors = %i)\n", + zfcp_get_busid_by_adapter(adapter), + fsf_bit_error->link_failure_error_count, + fsf_bit_error->loss_of_sync_error_count, + fsf_bit_error->loss_of_signal_error_count, + fsf_bit_error->primitive_sequence_error_count, + fsf_bit_error->invalid_transmission_word_error_count, + fsf_bit_error->crc_error_count); + ZFCP_LOG_INFO("Additional bit error threshold data " + "(adapter %s, " + "primitive sequence event time-outs = %i, " + "elastic buffer overrun errors = %i, " + "advertised receive buffer-to-buffer credit = %i, " + "current receice buffer-to-buffer credit = %i, " + "advertised transmit buffer-to-buffer credit = %i, " + "current transmit buffer-to-buffer credit = %i)\n", + zfcp_get_busid_by_adapter(adapter), + fsf_bit_error->primitive_sequence_event_timeout_count, + fsf_bit_error->elastic_buffer_overrun_error_count, + fsf_bit_error->advertised_receive_b2b_credit, + fsf_bit_error->current_receive_b2b_credit, + fsf_bit_error->advertised_transmit_b2b_credit, + fsf_bit_error->current_transmit_b2b_credit); break; case FSF_STATUS_READ_LINK_DOWN: @@ -1427,7 +1444,8 @@ zfcp_fsf_send_ct(struct zfcp_send_ct *ct, mempool_t *pool, /* settings in QTCB */ fsf_req->qtcb->header.port_handle = port->handle; - fsf_req->qtcb->bottom.support.service_class = adapter->fc_service_class; + fsf_req->qtcb->bottom.support.service_class = + ZFCP_FC_SERVICE_CLASS_DEFAULT; fsf_req->qtcb->bottom.support.timeout = ct->timeout; fsf_req->data = (unsigned long) ct; @@ -1496,18 +1514,10 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req) break; case FSF_SERVICE_CLASS_NOT_SUPPORTED: - if (adapter->fc_service_class <= 3) { - ZFCP_LOG_INFO("error: adapter %s does not support fc " - "class %d.\n", - zfcp_get_busid_by_port(port), - adapter->fc_service_class); - } else { - ZFCP_LOG_INFO("bug: The fibre channel class at the " - "adapter %s is invalid. " - "(debug info %d)\n", - zfcp_get_busid_by_port(port), - adapter->fc_service_class); - } + ZFCP_LOG_INFO("error: adapter %s does not support fc " + "class %d.\n", + zfcp_get_busid_by_port(port), + ZFCP_FC_SERVICE_CLASS_DEFAULT); /* stop operation for this adapter */ debug_text_exception(adapter->erp_dbf, 0, "fsf_s_class_nsup"); zfcp_erp_adapter_shutdown(adapter, 0); @@ -1730,7 +1740,8 @@ zfcp_fsf_send_els(struct zfcp_send_els *els) /* settings in QTCB */ fsf_req->qtcb->bottom.support.d_id = d_id; - fsf_req->qtcb->bottom.support.service_class = adapter->fc_service_class; + fsf_req->qtcb->bottom.support.service_class = + ZFCP_FC_SERVICE_CLASS_DEFAULT; fsf_req->qtcb->bottom.support.timeout = ZFCP_ELS_TIMEOUT; fsf_req->data = (unsigned long) els; @@ -1800,18 +1811,10 @@ static int zfcp_fsf_send_els_handler(struct zfcp_fsf_req *fsf_req) break; case FSF_SERVICE_CLASS_NOT_SUPPORTED: - if (adapter->fc_service_class <= 3) { - ZFCP_LOG_INFO("error: adapter %s does " - "not support fibrechannel class %d.\n", - zfcp_get_busid_by_adapter(adapter), - adapter->fc_service_class); - } else { - ZFCP_LOG_INFO("bug: The fibrechannel class at " - "adapter %s is invalid. " - "(debug info %d)\n", - zfcp_get_busid_by_adapter(adapter), - adapter->fc_service_class); - } + ZFCP_LOG_INFO("error: adapter %s does not support fc " + "class %d.\n", + zfcp_get_busid_by_adapter(adapter), + ZFCP_FC_SERVICE_CLASS_DEFAULT); /* stop operation for this adapter */ debug_text_exception(adapter->erp_dbf, 0, "fsf_s_class_nsup"); zfcp_erp_adapter_shutdown(adapter, 0); @@ -1940,14 +1943,6 @@ skip_fsfstatus: return retval; } -/* - * function: - * - * purpose: - * - * returns: address of initiated FSF request - * NULL - request could not be initiated - */ int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action) { @@ -2232,7 +2227,7 @@ zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action, /* setup new FSF request */ retval = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA, erp_action ? ZFCP_REQ_AUTO_CLEANUP : 0, - 0, &lock_flags, &fsf_req); + NULL, &lock_flags, &fsf_req); if (retval < 0) { ZFCP_LOG_INFO("error: Out of resources. Could not create an " "exchange port data request for" @@ -2565,8 +2560,7 @@ zfcp_fsf_open_port_handler(struct zfcp_fsf_req *fsf_req) if (!atomic_test_mask(ZFCP_STATUS_PORT_NO_WWPN, &port->status)) { if (fsf_req->qtcb->bottom.support.els1_length < - ((((unsigned long) &plogi->serv_param.wwpn) - - ((unsigned long) plogi)) + sizeof (u64))) { + sizeof (struct fsf_plogi)) { ZFCP_LOG_INFO( "warning: insufficient length of " "PLOGI payload (%i)\n", @@ -2585,8 +2579,10 @@ zfcp_fsf_open_port_handler(struct zfcp_fsf_req *fsf_req) atomic_clear_mask( ZFCP_STATUS_PORT_DID_DID, &port->status); - } else + } else { port->wwnn = plogi->serv_param.wwnn; + zfcp_plogi_evaluate(port, plogi); + } } } break; @@ -2993,8 +2989,8 @@ zfcp_fsf_open_unit(struct zfcp_erp_action *erp_action) erp_action->fsf_req->qtcb->bottom.support.fcp_lun = erp_action->unit->fcp_lun; if (!(erp_action->adapter->connection_features & FSF_FEATURE_NPIV_MODE)) - erp_action->fsf_req->qtcb->bottom.support.option = - FSF_OPEN_LUN_SUPPRESS_BOXING; + erp_action->fsf_req->qtcb->bottom.support.option = + FSF_OPEN_LUN_SUPPRESS_BOXING; atomic_set_mask(ZFCP_STATUS_COMMON_OPENING, &erp_action->unit->status); erp_action->fsf_req->data = (unsigned long) erp_action->unit; erp_action->fsf_req->erp_action = erp_action; @@ -3569,7 +3565,7 @@ zfcp_fsf_send_fcp_command_task(struct zfcp_adapter *adapter, } /* set FC service class in QTCB (3 per default) */ - fsf_req->qtcb->bottom.io.service_class = adapter->fc_service_class; + fsf_req->qtcb->bottom.io.service_class = ZFCP_FC_SERVICE_CLASS_DEFAULT; /* set FCP_LUN in FCP_CMND IU in QTCB */ fcp_cmnd_iu->fcp_lun = unit->fcp_lun; @@ -3667,18 +3663,6 @@ zfcp_fsf_send_fcp_command_task(struct zfcp_adapter *adapter, return retval; } -/* - * function: zfcp_fsf_send_fcp_command_task_management - * - * purpose: - * - * returns: - * - * FIXME(design): should be watched by a timeout!!! - * FIXME(design) shouldn't this be modified to return an int - * also...don't know how though - * - */ struct zfcp_fsf_req * zfcp_fsf_send_fcp_command_task_management(struct zfcp_adapter *adapter, struct zfcp_unit *unit, @@ -3720,7 +3704,7 @@ zfcp_fsf_send_fcp_command_task_management(struct zfcp_adapter *adapter, fsf_req->qtcb->header.lun_handle = unit->handle; fsf_req->qtcb->header.port_handle = unit->port->handle; fsf_req->qtcb->bottom.io.data_direction = FSF_DATADIR_CMND; - fsf_req->qtcb->bottom.io.service_class = adapter->fc_service_class; + fsf_req->qtcb->bottom.io.service_class = ZFCP_FC_SERVICE_CLASS_DEFAULT; fsf_req->qtcb->bottom.io.fcp_cmnd_length = sizeof (struct fcp_cmnd_iu) + sizeof (fcp_dl_t); @@ -3843,18 +3827,10 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req) break; case FSF_SERVICE_CLASS_NOT_SUPPORTED: - if (fsf_req->adapter->fc_service_class <= 3) { - ZFCP_LOG_NORMAL("error: The adapter %s does " - "not support fibrechannel class %d.\n", - zfcp_get_busid_by_unit(unit), - fsf_req->adapter->fc_service_class); - } else { - ZFCP_LOG_NORMAL("bug: The fibrechannel class at " - "adapter %s is invalid. " - "(debug info %d)\n", - zfcp_get_busid_by_unit(unit), - fsf_req->adapter->fc_service_class); - } + ZFCP_LOG_INFO("error: adapter %s does not support fc " + "class %d.\n", + zfcp_get_busid_by_unit(unit), + ZFCP_FC_SERVICE_CLASS_DEFAULT); /* stop operation for this adapter */ debug_text_exception(fsf_req->adapter->erp_dbf, 0, "fsf_s_class_nsup"); @@ -4616,12 +4592,14 @@ static inline void zfcp_fsf_req_qtcb_init(struct zfcp_fsf_req *fsf_req) { if (likely(fsf_req->qtcb != NULL)) { - fsf_req->qtcb->prefix.req_seq_no = fsf_req->adapter->fsf_req_seq_no; - fsf_req->qtcb->prefix.req_id = (unsigned long)fsf_req; + fsf_req->qtcb->prefix.req_seq_no = + fsf_req->adapter->fsf_req_seq_no; + fsf_req->qtcb->prefix.req_id = fsf_req->req_id; fsf_req->qtcb->prefix.ulp_info = ZFCP_ULP_INFO_VERSION; - fsf_req->qtcb->prefix.qtcb_type = fsf_qtcb_type[fsf_req->fsf_command]; + fsf_req->qtcb->prefix.qtcb_type = + fsf_qtcb_type[fsf_req->fsf_command]; fsf_req->qtcb->prefix.qtcb_version = ZFCP_QTCB_VERSION; - fsf_req->qtcb->header.req_handle = (unsigned long)fsf_req; + fsf_req->qtcb->header.req_handle = fsf_req->req_id; fsf_req->qtcb->header.fsf_command = fsf_req->fsf_command; } } @@ -4678,6 +4656,7 @@ zfcp_fsf_req_create(struct zfcp_adapter *adapter, u32 fsf_cmd, int req_flags, { volatile struct qdio_buffer_element *sbale; struct zfcp_fsf_req *fsf_req = NULL; + unsigned long flags; int ret = 0; struct zfcp_qdio_queue *req_queue = &adapter->request_queue; @@ -4692,6 +4671,12 @@ zfcp_fsf_req_create(struct zfcp_adapter *adapter, u32 fsf_cmd, int req_flags, fsf_req->adapter = adapter; fsf_req->fsf_command = fsf_cmd; + INIT_LIST_HEAD(&fsf_req->list); + + /* unique request id */ + spin_lock_irqsave(&adapter->req_list_lock, flags); + fsf_req->req_id = adapter->req_no++; + spin_unlock_irqrestore(&adapter->req_list_lock, flags); zfcp_fsf_req_qtcb_init(fsf_req); @@ -4731,7 +4716,7 @@ zfcp_fsf_req_create(struct zfcp_adapter *adapter, u32 fsf_cmd, int req_flags, sbale = zfcp_qdio_sbale_req(fsf_req, fsf_req->sbal_curr, 0); /* setup common SBALE fields */ - sbale[0].addr = fsf_req; + sbale[0].addr = (void *) fsf_req->req_id; sbale[0].flags |= SBAL_FLAGS0_COMMAND; if (likely(fsf_req->qtcb != NULL)) { sbale[1].addr = (void *) fsf_req->qtcb; @@ -4771,7 +4756,7 @@ zfcp_fsf_req_send(struct zfcp_fsf_req *fsf_req, struct timer_list *timer) volatile struct qdio_buffer_element *sbale; int inc_seq_no; int new_distance_from_int; - unsigned long flags; + u64 dbg_tmp[2]; int retval = 0; adapter = fsf_req->adapter; @@ -4785,10 +4770,10 @@ zfcp_fsf_req_send(struct zfcp_fsf_req *fsf_req, struct timer_list *timer) ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_TRACE, (char *) sbale[1].addr, sbale[1].length); - /* put allocated FSF request at list tail */ - spin_lock_irqsave(&adapter->fsf_req_list_lock, flags); - list_add_tail(&fsf_req->list, &adapter->fsf_req_list_head); - spin_unlock_irqrestore(&adapter->fsf_req_list_lock, flags); + /* put allocated FSF request into hash table */ + spin_lock(&adapter->req_list_lock); + zfcp_reqlist_add(adapter, fsf_req); + spin_unlock(&adapter->req_list_lock); inc_seq_no = (fsf_req->qtcb != NULL); @@ -4827,6 +4812,10 @@ zfcp_fsf_req_send(struct zfcp_fsf_req *fsf_req, struct timer_list *timer) QDIO_FLAG_SYNC_OUTPUT, 0, fsf_req->sbal_first, fsf_req->sbal_number, NULL); + dbg_tmp[0] = (unsigned long) sbale[0].addr; + dbg_tmp[1] = (u64) retval; + debug_event(adapter->erp_dbf, 4, (void *) dbg_tmp, 16); + if (unlikely(retval)) { /* Queues are down..... */ retval = -EIO; @@ -4836,22 +4825,17 @@ zfcp_fsf_req_send(struct zfcp_fsf_req *fsf_req, struct timer_list *timer) */ if (timer) del_timer(timer); - spin_lock_irqsave(&adapter->fsf_req_list_lock, flags); - list_del(&fsf_req->list); - spin_unlock_irqrestore(&adapter->fsf_req_list_lock, flags); - /* - * adjust the number of free SBALs in request queue as well as - * position of first one - */ + spin_lock(&adapter->req_list_lock); + zfcp_reqlist_remove(adapter, fsf_req->req_id); + spin_unlock(&adapter->req_list_lock); + /* undo changes in request queue made for this request */ zfcp_qdio_zero_sbals(req_queue->buffer, fsf_req->sbal_first, fsf_req->sbal_number); atomic_add(fsf_req->sbal_number, &req_queue->free_count); - req_queue->free_index -= fsf_req->sbal_number; /* increase */ + req_queue->free_index -= fsf_req->sbal_number; req_queue->free_index += QDIO_MAX_BUFFERS_PER_Q; req_queue->free_index %= QDIO_MAX_BUFFERS_PER_Q; /* wrap */ - ZFCP_LOG_DEBUG - ("error: do_QDIO failed. Buffers could not be enqueued " - "to request queue.\n"); + zfcp_erp_adapter_reopen(adapter, 0); } else { req_queue->distance_from_int = new_distance_from_int; /* @@ -4867,7 +4851,7 @@ zfcp_fsf_req_send(struct zfcp_fsf_req *fsf_req, struct timer_list *timer) adapter->fsf_req_seq_no++; /* count FSF requests pending */ - atomic_inc(&adapter->fsf_reqs_active); + atomic_inc(&adapter->reqs_active); } return retval; } diff --git a/drivers/s390/scsi/zfcp_fsf.h b/drivers/s390/scsi/zfcp_fsf.h index e734415ca..711866189 100644 --- a/drivers/s390/scsi/zfcp_fsf.h +++ b/drivers/s390/scsi/zfcp_fsf.h @@ -1,19 +1,8 @@ /* - * - * linux/drivers/s390/scsi/zfcp_fsf.h - * - * FCP adapter driver for IBM eServer zSeries - * - * (C) Copyright IBM Corp. 2002, 2004 + * This file is part of the zfcp device driver for + * FCP adapters for IBM System z9 and zSeries. * - * Author(s): Martin Peschke - * Raimund Schroeder - * Aron Zeh - * Wolfgang Taphorn - * Stefan Bader - * Heiko Carstens - * Andreas Herrmann - * Volker Sameske + * (C) Copyright IBM Corp. 2002, 2006 * * 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 @@ -33,8 +22,7 @@ #ifndef FSF_H #define FSF_H -#define FSF_QTCB_VERSION1 0x00000001 -#define FSF_QTCB_CURRENT_VERSION FSF_QTCB_VERSION1 +#define FSF_QTCB_CURRENT_VERSION 0x00000001 /* FSF commands */ #define FSF_QTCB_FCP_CMND 0x00000001 @@ -64,7 +52,7 @@ #define FSF_CFDC_OPTION_FULL_ACCESS 0x00000002 #define FSF_CFDC_OPTION_RESTRICTED_ACCESS 0x00000004 -/* FSF protocol stati */ +/* FSF protocol states */ #define FSF_PROT_GOOD 0x00000001 #define FSF_PROT_QTCB_VERSION_ERROR 0x00000010 #define FSF_PROT_SEQ_NUMB_ERROR 0x00000020 @@ -76,7 +64,7 @@ #define FSF_PROT_REEST_QUEUE 0x00000800 #define FSF_PROT_ERROR_STATE 0x01000000 -/* FSF stati */ +/* FSF states */ #define FSF_GOOD 0x00000000 #define FSF_PORT_ALREADY_OPEN 0x00000001 #define FSF_LUN_ALREADY_OPEN 0x00000002 @@ -269,20 +257,6 @@ #define FSF_UNIT_ACCESS_EXCLUSIVE 0x02000000 #define FSF_UNIT_ACCESS_OUTBOUND_TRANSFER 0x10000000 -struct fsf_queue_designator; -struct fsf_status_read_buffer; -struct fsf_port_closed_payload; -struct fsf_bit_error_payload; -union fsf_prot_status_qual; -struct fsf_qual_version_error; -struct fsf_qual_sequence_error; -struct fsf_qtcb_prefix; -struct fsf_qtcb_header; -struct fsf_qtcb_bottom_config; -struct fsf_qtcb_bottom_support; -struct fsf_qtcb_bottom_io; -union fsf_qtcb_bottom; - struct fsf_queue_designator { u8 cssid; u8 chpid; diff --git a/drivers/s390/scsi/zfcp_qdio.c b/drivers/s390/scsi/zfcp_qdio.c index 1c3275163..dbd9f48e8 100644 --- a/drivers/s390/scsi/zfcp_qdio.c +++ b/drivers/s390/scsi/zfcp_qdio.c @@ -1,18 +1,8 @@ /* - * linux/drivers/s390/scsi/zfcp_qdio.c + * This file is part of the zfcp device driver for + * FCP adapters for IBM System z9 and zSeries. * - * FCP adapter driver for IBM eServer zSeries - * - * QDIO related routines - * - * (C) Copyright IBM Corp. 2002, 2004 - * - * Authors: - * Martin Peschke - * Raimund Schroeder - * Wolfgang Taphorn - * Heiko Carstens - * Andreas Herrmann + * (C) Copyright IBM Corp. 2002, 2006 * * 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 @@ -178,7 +168,8 @@ zfcp_qdio_allocate(struct zfcp_adapter *adapter) init_data->cdev = adapter->ccw_device; init_data->q_format = QDIO_SCSI_QFMT; - memcpy(init_data->adapter_name, &adapter->name, 8); + memcpy(init_data->adapter_name, zfcp_get_busid_by_adapter(adapter), 8); + ASCEBC(init_data->adapter_name, 8); init_data->qib_param_field_format = 0; init_data->qib_param_field = NULL; init_data->input_slib_elements = NULL; @@ -291,6 +282,37 @@ zfcp_qdio_request_handler(struct ccw_device *ccw_device, return; } +/** + * zfcp_qdio_reqid_check - checks for valid reqids or unsolicited status + */ +static int zfcp_qdio_reqid_check(struct zfcp_adapter *adapter, + unsigned long req_id) +{ + struct zfcp_fsf_req *fsf_req; + unsigned long flags; + + debug_long_event(adapter->erp_dbf, 4, req_id); + + spin_lock_irqsave(&adapter->req_list_lock, flags); + fsf_req = zfcp_reqlist_ismember(adapter, req_id); + + if (!fsf_req) { + spin_unlock_irqrestore(&adapter->req_list_lock, flags); + ZFCP_LOG_NORMAL("error: unknown request id (%ld).\n", req_id); + zfcp_erp_adapter_reopen(adapter, 0); + return -EINVAL; + } + + zfcp_reqlist_remove(adapter, req_id); + atomic_dec(&adapter->reqs_active); + spin_unlock_irqrestore(&adapter->req_list_lock, flags); + + /* finish the FSF request */ + zfcp_fsf_req_complete(fsf_req); + + return 0; +} + /* * function: zfcp_qdio_response_handler * @@ -353,7 +375,7 @@ zfcp_qdio_response_handler(struct ccw_device *ccw_device, /* look for QDIO request identifiers in SB */ buffere = &buffer->element[buffere_index]; retval = zfcp_qdio_reqid_check(adapter, - (void *) buffere->addr); + (unsigned long) buffere->addr); if (retval) { ZFCP_LOG_NORMAL("bug: unexpected inbound " @@ -424,51 +446,6 @@ zfcp_qdio_response_handler(struct ccw_device *ccw_device, return; } -/* - * function: zfcp_qdio_reqid_check - * - * purpose: checks for valid reqids or unsolicited status - * - * returns: 0 - valid request id or unsolicited status - * !0 - otherwise - */ -int -zfcp_qdio_reqid_check(struct zfcp_adapter *adapter, void *sbale_addr) -{ - struct zfcp_fsf_req *fsf_req; - - /* invalid (per convention used in this driver) */ - if (unlikely(!sbale_addr)) { - ZFCP_LOG_NORMAL("bug: invalid reqid\n"); - return -EINVAL; - } - - /* valid request id and thus (hopefully :) valid fsf_req address */ - fsf_req = (struct zfcp_fsf_req *) sbale_addr; - - /* serialize with zfcp_fsf_req_dismiss_all */ - spin_lock(&adapter->fsf_req_list_lock); - if (list_empty(&adapter->fsf_req_list_head)) { - spin_unlock(&adapter->fsf_req_list_lock); - return 0; - } - list_del(&fsf_req->list); - atomic_dec(&adapter->fsf_reqs_active); - spin_unlock(&adapter->fsf_req_list_lock); - - if (unlikely(adapter != fsf_req->adapter)) { - ZFCP_LOG_NORMAL("bug: invalid reqid (fsf_req=%p, " - "fsf_req->adapter=%p, adapter=%p)\n", - fsf_req, fsf_req->adapter, adapter); - return -EINVAL; - } - - /* finish the FSF request */ - zfcp_fsf_req_complete(fsf_req); - - return 0; -} - /** * zfcp_qdio_sbale_get - return pointer to SBALE of qdio_queue * @queue: queue from which SBALE should be returned diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c index 9e6d07d7b..c489dece8 100644 --- a/drivers/s390/scsi/zfcp_scsi.c +++ b/drivers/s390/scsi/zfcp_scsi.c @@ -1,18 +1,8 @@ /* - * - * linux/drivers/s390/scsi/zfcp_scsi.c - * - * FCP adapter driver for IBM eServer zSeries - * - * (C) Copyright IBM Corp. 2002, 2004 + * This file is part of the zfcp device driver for + * FCP adapters for IBM System z9 and zSeries. * - * Author(s): Martin Peschke - * Raimund Schroeder - * Aron Zeh - * Wolfgang Taphorn - * Stefan Bader - * Heiko Carstens - * Andreas Herrmann + * (C) Copyright IBM Corp. 2002, 2006 * * 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 @@ -40,13 +30,12 @@ static int zfcp_scsi_queuecommand(struct scsi_cmnd *, void (*done) (struct scsi_cmnd *)); static int zfcp_scsi_eh_abort_handler(struct scsi_cmnd *); static int zfcp_scsi_eh_device_reset_handler(struct scsi_cmnd *); -static int zfcp_scsi_eh_bus_reset_handler(struct scsi_cmnd *); static int zfcp_scsi_eh_host_reset_handler(struct scsi_cmnd *); static int zfcp_task_management_function(struct zfcp_unit *, u8, struct scsi_cmnd *); -static struct zfcp_unit *zfcp_unit_lookup(struct zfcp_adapter *, int, scsi_id_t, - scsi_lun_t); +static struct zfcp_unit *zfcp_unit_lookup(struct zfcp_adapter *, int, + unsigned int, unsigned int); static struct device_attribute *zfcp_sysfs_sdev_attrs[]; @@ -54,33 +43,24 @@ struct scsi_transport_template *zfcp_transport_template; struct zfcp_data zfcp_data = { .scsi_host_template = { - name: ZFCP_NAME, - proc_name: "zfcp", - proc_info: NULL, - detect: NULL, - slave_alloc: zfcp_scsi_slave_alloc, - slave_configure: zfcp_scsi_slave_configure, - slave_destroy: zfcp_scsi_slave_destroy, - queuecommand: zfcp_scsi_queuecommand, - eh_abort_handler: zfcp_scsi_eh_abort_handler, - eh_device_reset_handler: zfcp_scsi_eh_device_reset_handler, - eh_bus_reset_handler: zfcp_scsi_eh_bus_reset_handler, - eh_host_reset_handler: zfcp_scsi_eh_host_reset_handler, - /* FIXME(openfcp): Tune */ - can_queue: 4096, - this_id: -1, - /* - * FIXME: - * one less? can zfcp_create_sbale cope with it? - */ - sg_tablesize: ZFCP_MAX_SBALES_PER_REQ, - cmd_per_lun: 1, - unchecked_isa_dma: 0, - use_clustering: 1, - sdev_attrs: zfcp_sysfs_sdev_attrs, + .name = ZFCP_NAME, + .proc_name = "zfcp", + .slave_alloc = zfcp_scsi_slave_alloc, + .slave_configure = zfcp_scsi_slave_configure, + .slave_destroy = zfcp_scsi_slave_destroy, + .queuecommand = zfcp_scsi_queuecommand, + .eh_abort_handler = zfcp_scsi_eh_abort_handler, + .eh_device_reset_handler = zfcp_scsi_eh_device_reset_handler, + .eh_bus_reset_handler = zfcp_scsi_eh_host_reset_handler, + .eh_host_reset_handler = zfcp_scsi_eh_host_reset_handler, + .can_queue = 4096, + .this_id = -1, + .sg_tablesize = ZFCP_MAX_SBALES_PER_REQ, + .cmd_per_lun = 1, + .use_clustering = 1, + .sdev_attrs = zfcp_sysfs_sdev_attrs, }, .driver_version = ZFCP_VERSION, - /* rest initialised with zeros */ }; /* Find start of Response Information in FCP response unit*/ @@ -161,14 +141,6 @@ set_driver_byte(u32 * result, char status) set_byte(result, status, 3); } -/* - * function: zfcp_scsi_slave_alloc - * - * purpose: - * - * returns: - */ - static int zfcp_scsi_slave_alloc(struct scsi_device *sdp) { @@ -195,16 +167,14 @@ zfcp_scsi_slave_alloc(struct scsi_device *sdp) return retval; } -/* - * function: zfcp_scsi_slave_destroy - * - * purpose: +/** + * zfcp_scsi_slave_destroy - called when scsi device is removed * - * returns: + * Remove reference to associated scsi device for an zfcp_unit. + * Mark zfcp_unit as failed. The scsi device might be deleted via sysfs + * or a scan for this device might have failed. */ - -static void -zfcp_scsi_slave_destroy(struct scsi_device *sdpnt) +static void zfcp_scsi_slave_destroy(struct scsi_device *sdpnt) { struct zfcp_unit *unit = (struct zfcp_unit *) sdpnt->hostdata; @@ -212,6 +182,7 @@ zfcp_scsi_slave_destroy(struct scsi_device *sdpnt) atomic_clear_mask(ZFCP_STATUS_UNIT_REGISTERED, &unit->status); sdpnt->hostdata = NULL; unit->device = NULL; + zfcp_erp_unit_failed(unit); zfcp_unit_put(unit); } else { ZFCP_LOG_NORMAL("bug: no unit associated with SCSI device at " @@ -331,7 +302,7 @@ zfcp_scsi_command_sync(struct zfcp_unit *unit, struct scsi_cmnd *scpnt, struct timer_list *timer) { int ret; - DECLARE_COMPLETION(wait); + DECLARE_COMPLETION_ONSTACK(wait); scpnt->SCp.ptr = (void *) &wait; /* silent re-use */ scpnt->scsi_done = zfcp_scsi_command_sync_handler; @@ -374,18 +345,9 @@ zfcp_scsi_queuecommand(struct scsi_cmnd *scpnt, return zfcp_scsi_command_async(adapter, unit, scpnt, NULL); } -/* - * function: zfcp_unit_lookup - * - * purpose: - * - * returns: - * - * context: - */ static struct zfcp_unit * -zfcp_unit_lookup(struct zfcp_adapter *adapter, int channel, scsi_id_t id, - scsi_lun_t lun) +zfcp_unit_lookup(struct zfcp_adapter *adapter, int channel, unsigned int id, + unsigned int lun) { struct zfcp_port *port; struct zfcp_unit *unit, *retval = NULL; @@ -491,13 +453,6 @@ zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt) return retval; } -/* - * function: zfcp_scsi_eh_device_reset_handler - * - * purpose: - * - * returns: - */ int zfcp_scsi_eh_device_reset_handler(struct scsi_cmnd *scpnt) { @@ -592,46 +547,42 @@ zfcp_task_management_function(struct zfcp_unit *unit, u8 tm_flags, } /** - * zfcp_scsi_eh_bus_reset_handler - reset bus (reopen adapter) + * zfcp_scsi_eh_host_reset_handler - handler for host and bus reset + * + * If ERP is already running it will be stopped. */ -int -zfcp_scsi_eh_bus_reset_handler(struct scsi_cmnd *scpnt) +int zfcp_scsi_eh_host_reset_handler(struct scsi_cmnd *scpnt) { - struct zfcp_unit *unit = (struct zfcp_unit*) scpnt->device->hostdata; - struct zfcp_adapter *adapter = unit->port->adapter; - - ZFCP_LOG_NORMAL("bus reset because of problems with " - "unit 0x%016Lx\n", unit->fcp_lun); - zfcp_erp_adapter_reopen(adapter, 0); - zfcp_erp_wait(adapter); - - return SUCCESS; -} + struct zfcp_unit *unit; + struct zfcp_adapter *adapter; + unsigned long flags; -/** - * zfcp_scsi_eh_host_reset_handler - reset host (reopen adapter) - */ -int -zfcp_scsi_eh_host_reset_handler(struct scsi_cmnd *scpnt) -{ - struct zfcp_unit *unit = (struct zfcp_unit*) scpnt->device->hostdata; - struct zfcp_adapter *adapter = unit->port->adapter; + unit = (struct zfcp_unit*) scpnt->device->hostdata; + adapter = unit->port->adapter; - ZFCP_LOG_NORMAL("host reset because of problems with " + ZFCP_LOG_NORMAL("host/bus reset because of problems with " "unit 0x%016Lx\n", unit->fcp_lun); - zfcp_erp_adapter_reopen(adapter, 0); - zfcp_erp_wait(adapter); + + write_lock_irqsave(&adapter->erp_lock, flags); + if (atomic_test_mask(ZFCP_STATUS_ADAPTER_ERP_PENDING, + &adapter->status)) { + zfcp_erp_modify_adapter_status(adapter, + ZFCP_STATUS_COMMON_UNBLOCKED|ZFCP_STATUS_COMMON_OPEN, + ZFCP_CLEAR); + zfcp_erp_action_dismiss_adapter(adapter); + write_unlock_irqrestore(&adapter->erp_lock, flags); + zfcp_fsf_req_dismiss_all(adapter); + adapter->fsf_req_seq_no = 0; + zfcp_erp_adapter_reopen(adapter, 0); + } else { + write_unlock_irqrestore(&adapter->erp_lock, flags); + zfcp_erp_adapter_reopen(adapter, 0); + zfcp_erp_wait(adapter); + } return SUCCESS; } -/* - * function: - * - * purpose: - * - * returns: - */ int zfcp_adapter_scsi_register(struct zfcp_adapter *adapter) { @@ -657,10 +608,6 @@ zfcp_adapter_scsi_register(struct zfcp_adapter *adapter) adapter->scsi_host->unique_id = unique_id++; /* FIXME */ adapter->scsi_host->max_cmd_len = ZFCP_MAX_SCSI_CMND_LENGTH; adapter->scsi_host->transportt = zfcp_transport_template; - /* - * Reverse mapping of the host number to avoid race condition - */ - adapter->scsi_host_no = adapter->scsi_host->host_no; /* * save a pointer to our own adapter data structure within @@ -678,13 +625,6 @@ zfcp_adapter_scsi_register(struct zfcp_adapter *adapter) return retval; } -/* - * function: - * - * purpose: - * - * returns: - */ void zfcp_adapter_scsi_unregister(struct zfcp_adapter *adapter) { @@ -703,7 +643,6 @@ zfcp_adapter_scsi_unregister(struct zfcp_adapter *adapter) scsi_remove_host(shost); scsi_host_put(shost); adapter->scsi_host = NULL; - adapter->scsi_host_no = 0; atomic_clear_mask(ZFCP_STATUS_ADAPTER_REGISTERED, &adapter->status); return; @@ -817,10 +756,9 @@ zfcp_get_fc_host_stats(struct Scsi_Host *shost) if (!fc_stats) return NULL; - data = kmalloc(sizeof(*data), GFP_KERNEL); + data = kzalloc(sizeof(*data), GFP_KERNEL); if (!data) return NULL; - memset(data, 0, sizeof(*data)); ret = zfcp_fsf_exchange_port_data(NULL, adapter, data); if (ret) { @@ -848,10 +786,9 @@ zfcp_reset_fc_host_stats(struct Scsi_Host *shost) int ret; adapter = (struct zfcp_adapter *)shost->hostdata[0]; - data = kmalloc(sizeof(*data), GFP_KERNEL); + data = kzalloc(sizeof(*data), GFP_KERNEL); if (!data) return; - memset(data, 0, sizeof(*data)); ret = zfcp_fsf_exchange_port_data(NULL, adapter, data); if (ret == 0) { @@ -863,11 +800,18 @@ zfcp_reset_fc_host_stats(struct Scsi_Host *shost) } } +static void zfcp_set_rport_dev_loss_tmo(struct fc_rport *rport, u32 timeout) +{ + rport->dev_loss_tmo = timeout; +} + struct fc_function_template zfcp_transport_functions = { .show_starget_port_id = 1, .show_starget_port_name = 1, .show_starget_node_name = 1, .show_rport_supported_classes = 1, + .show_rport_maxframe_size = 1, + .show_rport_dev_loss_tmo = 1, .show_host_node_name = 1, .show_host_port_name = 1, .show_host_permanent_port_name = 1, @@ -877,6 +821,7 @@ struct fc_function_template zfcp_transport_functions = { .show_host_serial_number = 1, .get_fc_host_stats = zfcp_get_fc_host_stats, .reset_fc_host_stats = zfcp_reset_fc_host_stats, + .set_rport_dev_loss_tmo = zfcp_set_rport_dev_loss_tmo, /* no functions registered for following dynamic attributes but directly set by LLDD */ .show_host_port_type = 1, diff --git a/drivers/s390/scsi/zfcp_sysfs_adapter.c b/drivers/s390/scsi/zfcp_sysfs_adapter.c index b29ac25e0..705c6d442 100644 --- a/drivers/s390/scsi/zfcp_sysfs_adapter.c +++ b/drivers/s390/scsi/zfcp_sysfs_adapter.c @@ -1,16 +1,8 @@ /* - * linux/drivers/s390/scsi/zfcp_sysfs_adapter.c + * This file is part of the zfcp device driver for + * FCP adapters for IBM System z9 and zSeries. * - * FCP adapter driver for IBM eServer zSeries - * - * sysfs adapter related routines - * - * (C) Copyright IBM Corp. 2003, 2004 - * - * Authors: - * Martin Peschke - * Heiko Carstens - * Andreas Herrmann + * (C) Copyright IBM Corp. 2002, 2006 * * 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/drivers/s390/scsi/zfcp_sysfs_driver.c b/drivers/s390/scsi/zfcp_sysfs_driver.c index 6622d55e0..005e62f85 100644 --- a/drivers/s390/scsi/zfcp_sysfs_driver.c +++ b/drivers/s390/scsi/zfcp_sysfs_driver.c @@ -1,16 +1,8 @@ /* - * linux/drivers/s390/scsi/zfcp_sysfs_driver.c + * This file is part of the zfcp device driver for + * FCP adapters for IBM System z9 and zSeries. * - * FCP adapter driver for IBM eServer zSeries - * - * sysfs driver related routines - * - * (C) Copyright IBM Corp. 2003, 2004 - * - * Authors: - * Martin Peschke - * Heiko Carstens - * Andreas Herrmann + * (C) Copyright IBM Corp. 2002, 2006 * * 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/drivers/s390/scsi/zfcp_sysfs_port.c b/drivers/s390/scsi/zfcp_sysfs_port.c index f401d42db..1320c0591 100644 --- a/drivers/s390/scsi/zfcp_sysfs_port.c +++ b/drivers/s390/scsi/zfcp_sysfs_port.c @@ -1,17 +1,8 @@ /* - * linux/drivers/s390/scsi/zfcp_sysfs_port.c + * This file is part of the zfcp device driver for + * FCP adapters for IBM System z9 and zSeries. * - * FCP adapter driver for IBM eServer zSeries - * - * sysfs port related routines - * - * (C) Copyright IBM Corp. 2003, 2004 - * - * Authors: - * Martin Peschke - * Heiko Carstens - * Andreas Herrmann - * Volker Sameske + * (C) Copyright IBM Corp. 2002, 2006 * * 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/drivers/s390/scsi/zfcp_sysfs_unit.c b/drivers/s390/scsi/zfcp_sysfs_unit.c index ad5dfb889..81a484175 100644 --- a/drivers/s390/scsi/zfcp_sysfs_unit.c +++ b/drivers/s390/scsi/zfcp_sysfs_unit.c @@ -1,17 +1,8 @@ /* - * linux/drivers/s390/scsi/zfcp_sysfs_unit.c + * This file is part of the zfcp device driver for + * FCP adapters for IBM System z9 and zSeries. * - * FCP adapter driver for IBM eServer zSeries - * - * sysfs unit related routines - * - * (C) Copyright IBM Corp. 2003, 2004 - * - * Authors: - * Martin Peschke - * Heiko Carstens - * Andreas Herrmann - * Volker Sameske + * (C) Copyright IBM Corp. 2002, 2006 * * 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/drivers/s390/sysinfo.c b/drivers/s390/sysinfo.c index 66da840c9..d1c1e75bf 100644 --- a/drivers/s390/sysinfo.c +++ b/drivers/s390/sysinfo.c @@ -5,7 +5,6 @@ * Author(s): Ulrich Weigand (Ulrich.Weigand@de.ibm.com) */ -#include #include #include #include diff --git a/drivers/sbus/char/aurora.c b/drivers/sbus/char/aurora.c index 015db40ad..4fdb2c932 100644 --- a/drivers/sbus/char/aurora.c +++ b/drivers/sbus/char/aurora.c @@ -337,19 +337,19 @@ static int aurora_probe(void) printk("intr pri %d\n", grrr); #endif if ((bp->irq=irqs[bn]) && valid_irq(bp->irq) && - !request_irq(bp->irq|0x30, aurora_interrupt, SA_SHIRQ, "sio16", bp)) { + !request_irq(bp->irq|0x30, aurora_interrupt, IRQF_SHARED, "sio16", bp)) { free_irq(bp->irq|0x30, bp); } else if ((bp->irq=prom_getint(sdev->prom_node, "bintr")) && valid_irq(bp->irq) && - !request_irq(bp->irq|0x30, aurora_interrupt, SA_SHIRQ, "sio16", bp)) { + !request_irq(bp->irq|0x30, aurora_interrupt, IRQF_SHARED, "sio16", bp)) { free_irq(bp->irq|0x30, bp); } else if ((bp->irq=prom_getint(sdev->prom_node, "intr")) && valid_irq(bp->irq) && - !request_irq(bp->irq|0x30, aurora_interrupt, SA_SHIRQ, "sio16", bp)) { + !request_irq(bp->irq|0x30, aurora_interrupt, IRQF_SHARED, "sio16", bp)) { free_irq(bp->irq|0x30, bp); } else for(grrr=0;grrrirq=type_1_irq[grrr])&&!request_irq(bp->irq|0x30, aurora_interrupt, SA_SHIRQ, "sio16", bp)) { + if ((bp->irq=type_1_irq[grrr])&&!request_irq(bp->irq|0x30, aurora_interrupt, IRQF_SHARED, "sio16", bp)) { free_irq(bp->irq|0x30, bp); break; } else { @@ -909,14 +909,14 @@ static int aurora_setup_board(struct Aurora_board * bp) #ifdef AURORA_ALLIRQ int i; for (i = 0; i < AURORA_ALLIRQ; i++) { - error = request_irq(allirq[i]|0x30, aurora_interrupt, SA_SHIRQ, + error = request_irq(allirq[i]|0x30, aurora_interrupt, IRQF_SHARED, "sio16", bp); if (error) printk(KERN_ERR "IRQ%d request error %d\n", allirq[i], error); } #else - error = request_irq(bp->irq|0x30, aurora_interrupt, SA_SHIRQ, + error = request_irq(bp->irq|0x30, aurora_interrupt, IRQF_SHARED, "sio16", bp); if (error) { printk(KERN_ERR "IRQ request error %d\n", error); diff --git a/drivers/sbus/char/bbc_envctrl.c b/drivers/sbus/char/bbc_envctrl.c index d89f83f76..1cc706e11 100644 --- a/drivers/sbus/char/bbc_envctrl.c +++ b/drivers/sbus/char/bbc_envctrl.c @@ -575,9 +575,9 @@ int bbc_envctrl_init(void) int devidx = 0; while ((echild = bbc_i2c_getdev(devidx++)) != NULL) { - if (!strcmp(echild->prom_name, "temperature")) + if (!strcmp(echild->prom_node->name, "temperature")) attach_one_temp(echild, temp_index++); - if (!strcmp(echild->prom_name, "fan-control")) + if (!strcmp(echild->prom_node->name, "fan-control")) attach_one_fan(echild, fan_index++); } if (temp_index != 0 && fan_index != 0) { diff --git a/drivers/sbus/char/bbc_i2c.c b/drivers/sbus/char/bbc_i2c.c index 3e156e005..718623559 100644 --- a/drivers/sbus/char/bbc_i2c.c +++ b/drivers/sbus/char/bbc_i2c.c @@ -377,7 +377,7 @@ static int __init attach_one_i2c(struct linux_ebus_device *edev, int index) bp->waiting = 0; init_waitqueue_head(&bp->wq); if (request_irq(edev->irqs[0], bbc_i2c_interrupt, - SA_SHIRQ, "bbc_i2c", bp)) + IRQF_SHARED, "bbc_i2c", bp)) goto fail; bp->index = index; @@ -423,7 +423,7 @@ static int __init bbc_present(void) for_each_ebus(ebus) { for_each_ebusdev(edev, ebus) { - if (!strcmp(edev->prom_name, "bbc")) + if (!strcmp(edev->prom_node->name, "bbc")) return 1; } } @@ -446,7 +446,7 @@ static int __init bbc_i2c_init(void) for_each_ebus(ebus) { for_each_ebusdev(edev, ebus) { - if (!strcmp(edev->prom_name, "i2c")) { + if (!strcmp(edev->prom_node->name, "i2c")) { if (!attach_one_i2c(edev, index)) index++; } diff --git a/drivers/sbus/char/bpp.c b/drivers/sbus/char/bpp.c index ccb20a6f5..385f4f768 100644 --- a/drivers/sbus/char/bpp.c +++ b/drivers/sbus/char/bpp.c @@ -20,7 +20,6 @@ #include #include #include -#include #include #include @@ -1031,11 +1030,6 @@ static int __init bpp_init(void) instances[idx].opened = 0; probeLptPort(idx); } - devfs_mk_dir("bpp"); - for (idx = 0; idx < BPP_NO; idx++) { - devfs_mk_cdev(MKDEV(BPP_MAJOR, idx), - S_IFCHR | S_IRUSR | S_IWUSR, "bpp/%d", idx); - } return 0; } @@ -1044,9 +1038,6 @@ static void __exit bpp_cleanup(void) { unsigned idx; - for (idx = 0; idx < BPP_NO; idx++) - devfs_remove("bpp/%d", idx); - devfs_remove("bpp"); unregister_chrdev(BPP_MAJOR, dev_name); for (idx = 0; idx < BPP_NO; idx++) { diff --git a/drivers/sbus/char/cpwatchdog.c b/drivers/sbus/char/cpwatchdog.c index fd2cc7782..836a58bb0 100644 --- a/drivers/sbus/char/cpwatchdog.c +++ b/drivers/sbus/char/cpwatchdog.c @@ -301,11 +301,11 @@ static int wd_open(struct inode *inode, struct file *f) { if (request_irq(wd_dev.irq, &wd_interrupt, - SA_SHIRQ, + IRQF_SHARED, WD_OBPNAME, (void *)wd_dev.regs)) { - printk("%s: Cannot register IRQ %s\n", - WD_OBPNAME, __irq_itoa(wd_dev.irq)); + printk("%s: Cannot register IRQ %d\n", + WD_OBPNAME, wd_dev.irq); return(-EBUSY); } wd_dev.initialized = 1; @@ -755,7 +755,7 @@ static int __init wd_init(void) for_each_ebus(ebus) { for_each_ebusdev(edev, ebus) { - if (!strcmp(edev->prom_name, WD_OBPNAME)) + if (!strcmp(edev->ofdev.node->name, WD_OBPNAME)) goto ebus_done; } } diff --git a/drivers/sbus/char/display7seg.c b/drivers/sbus/char/display7seg.c index c3a51d1fa..d92bc8827 100644 --- a/drivers/sbus/char/display7seg.c +++ b/drivers/sbus/char/display7seg.c @@ -184,7 +184,7 @@ static int __init d7s_init(void) for_each_ebus(ebus) { for_each_ebusdev(edev, ebus) { - if (!strcmp(edev->prom_name, D7S_OBPNAME)) + if (!strcmp(edev->prom_node->name, D7S_OBPNAME)) goto ebus_done; } } diff --git a/drivers/sbus/char/envctrl.c b/drivers/sbus/char/envctrl.c index 19e8eddf8..063e676a3 100644 --- a/drivers/sbus/char/envctrl.c +++ b/drivers/sbus/char/envctrl.c @@ -22,7 +22,6 @@ #define __KERNEL_SYSCALLS__ static int errno; -#include #include #include #include @@ -768,16 +767,14 @@ static void envctrl_set_mon(struct i2c_child_t *pchild, * decoding tables, monitor type, optional properties. * Return: None. */ -static void envctrl_init_adc(struct i2c_child_t *pchild, int node) +static void envctrl_init_adc(struct i2c_child_t *pchild, struct device_node *dp) { - char chnls_desc[CHANNEL_DESC_SZ]; int i = 0, len; - char *pos = chnls_desc; + char *pos; + unsigned int *pval; /* Firmware describe channels into a stream separated by a '\0'. */ - len = prom_getproperty(node, "channels-description", chnls_desc, - CHANNEL_DESC_SZ); - chnls_desc[CHANNEL_DESC_SZ - 1] = '\0'; + pos = of_get_property(dp, "channels-description", &len); while (len > 0) { int l = strlen(pos) + 1; @@ -787,10 +784,13 @@ static void envctrl_init_adc(struct i2c_child_t *pchild, int node) } /* Get optional properties. */ - len = prom_getproperty(node, "warning-temp", (char *)&warning_temperature, - sizeof(warning_temperature)); - len = prom_getproperty(node, "shutdown-temp", (char *)&shutdown_temperature, - sizeof(shutdown_temperature)); + pval = of_get_property(dp, "warning-temp", NULL); + if (pval) + warning_temperature = *pval; + + pval = of_get_property(dp, "shutdown-temp", NULL); + if (pval) + shutdown_temperature = *pval; } /* Function Description: Initialize child device monitoring fan status. @@ -864,21 +864,18 @@ static void envctrl_init_voltage_status(struct i2c_child_t *pchild) static void envctrl_init_i2c_child(struct linux_ebus_child *edev_child, struct i2c_child_t *pchild) { - int node, len, i, tbls_size = 0; - - node = edev_child->prom_node; + int len, i, tbls_size = 0; + struct device_node *dp = edev_child->prom_node; + void *pval; /* Get device address. */ - len = prom_getproperty(node, "reg", - (char *) &(pchild->addr), - sizeof(pchild->addr)); + pval = of_get_property(dp, "reg", &len); + memcpy(&pchild->addr, pval, len); /* Get tables property. Read firmware temperature tables. */ - len = prom_getproperty(node, "translation", - (char *) pchild->tblprop_array, - (PCF8584_MAX_CHANNELS * - sizeof(struct pcf8584_tblprop))); - if (len > 0) { + pval = of_get_property(dp, "translation", &len); + if (pval && len > 0) { + memcpy(pchild->tblprop_array, pval, len); pchild->total_tbls = len / sizeof(struct pcf8584_tblprop); for (i = 0; i < pchild->total_tbls; i++) { if ((pchild->tblprop_array[i].size + pchild->tblprop_array[i].offset) > tbls_size) { @@ -891,12 +888,12 @@ static void envctrl_init_i2c_child(struct linux_ebus_child *edev_child, printk("envctrl: Failed to allocate table.\n"); return; } - len = prom_getproperty(node, "tables", - (char *) pchild->tables, tbls_size); - if (len <= 0) { + pval = of_get_property(dp, "tables", &len); + if (!pval || len <= 0) { printk("envctrl: Failed to get table.\n"); return; } + memcpy(pchild->tables, pval, len); } /* SPARCengine ASM Reference Manual (ref. SMI doc 805-7581-04) @@ -907,12 +904,11 @@ static void envctrl_init_i2c_child(struct linux_ebus_child *edev_child, * 'NULL' monitor type. */ if (ENVCTRL_CPCI_IGNORED_NODE == pchild->addr) { + struct device_node *root_node; int len; - char prop[56]; - len = prom_getproperty(prom_root_node, "name", prop, sizeof(prop)); - if (0 < len && (0 == strncmp(prop, "SUNW,UltraSPARC-IIi-cEngine", len))) - { + root_node = of_find_node_by_path("/"); + if (!strcmp(root_node->name, "SUNW,UltraSPARC-IIi-cEngine")) { for (len = 0; len < PCF8584_MAX_CHANNELS; ++len) { pchild->mon_type[len] = ENVCTRL_NOMON; } @@ -921,16 +917,14 @@ static void envctrl_init_i2c_child(struct linux_ebus_child *edev_child, } /* Get the monitor channels. */ - len = prom_getproperty(node, "channels-in-use", - (char *) pchild->chnl_array, - (PCF8584_MAX_CHANNELS * - sizeof(struct pcf8584_channel))); + pval = of_get_property(dp, "channels-in-use", &len); + memcpy(pchild->chnl_array, pval, len); pchild->total_chnls = len / sizeof(struct pcf8584_channel); for (i = 0; i < pchild->total_chnls; i++) { switch (pchild->chnl_array[i].type) { case PCF8584_TEMP_TYPE: - envctrl_init_adc(pchild, node); + envctrl_init_adc(pchild, dp); break; case PCF8584_GLOBALADDR_TYPE: @@ -945,7 +939,7 @@ static void envctrl_init_i2c_child(struct linux_ebus_child *edev_child, case PCF8584_VOLTAGE_TYPE: if (pchild->i2ctype == I2C_ADC) { - envctrl_init_adc(pchild,node); + envctrl_init_adc(pchild,dp); } else { envctrl_init_voltage_status(pchild); } @@ -1046,7 +1040,7 @@ static int __init envctrl_init(void) for_each_ebus(ebus) { for_each_ebusdev(edev, ebus) { - if (!strcmp(edev->prom_name, "bbc")) { + if (!strcmp(edev->prom_node->name, "bbc")) { /* If we find a boot-bus controller node, * then this envctrl driver is not for us. */ @@ -1060,14 +1054,14 @@ static int __init envctrl_init(void) */ for_each_ebus(ebus) { for_each_ebusdev(edev, ebus) { - if (!strcmp(edev->prom_name, "i2c")) { + if (!strcmp(edev->prom_node->name, "i2c")) { i2c = ioremap(edev->resource[0].start, 0x2); for_each_edevchild(edev, edev_child) { - if (!strcmp("gpio", edev_child->prom_name)) { + if (!strcmp("gpio", edev_child->prom_node->name)) { i2c_childlist[i].i2ctype = I2C_GPIO; envctrl_init_i2c_child(edev_child, &(i2c_childlist[i++])); } - if (!strcmp("adc", edev_child->prom_name)) { + if (!strcmp("adc", edev_child->prom_node->name)) { i2c_childlist[i].i2ctype = I2C_ADC; envctrl_init_i2c_child(edev_child, &(i2c_childlist[i++])); } diff --git a/drivers/sbus/char/flash.c b/drivers/sbus/char/flash.c index 2beb3dded..fa2418f7a 100644 --- a/drivers/sbus/char/flash.c +++ b/drivers/sbus/char/flash.c @@ -4,7 +4,6 @@ * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) */ -#include #include #include #include @@ -71,7 +70,6 @@ flash_mmap(struct file *file, struct vm_area_struct *vma) if (vma->vm_end - (vma->vm_start + (vma->vm_pgoff << PAGE_SHIFT)) > size) size = vma->vm_end - (vma->vm_start + (vma->vm_pgoff << PAGE_SHIFT)); - vma->vm_flags |= (VM_SHM | VM_LOCKED); vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); if (io_remap_pfn_range(vma, vma->vm_start, addr, size, vma->vm_page_prot)) @@ -192,9 +190,11 @@ static int __init flash_init(void) } if (!sdev) { #ifdef CONFIG_PCI + struct linux_prom_registers *ebus_regs; + for_each_ebus(ebus) { for_each_ebusdev(edev, ebus) { - if (!strcmp(edev->prom_name, "flashprom")) + if (!strcmp(edev->prom_node->name, "flashprom")) goto ebus_done; } } @@ -202,23 +202,23 @@ static int __init flash_init(void) if (!edev) return -ENODEV; - len = prom_getproperty(edev->prom_node, "reg", (void *)regs, sizeof(regs)); - if ((len % sizeof(regs[0])) != 0) { + ebus_regs = of_get_property(edev->prom_node, "reg", &len); + if (!ebus_regs || (len % sizeof(regs[0])) != 0) { printk("flash: Strange reg property size %d\n", len); return -ENODEV; } - nregs = len / sizeof(regs[0]); + nregs = len / sizeof(ebus_regs[0]); flash.read_base = edev->resource[0].start; - flash.read_size = regs[0].reg_size; + flash.read_size = ebus_regs[0].reg_size; if (nregs == 1) { flash.write_base = edev->resource[0].start; - flash.write_size = regs[0].reg_size; + flash.write_size = ebus_regs[0].reg_size; } else if (nregs == 2) { flash.write_base = edev->resource[1].start; - flash.write_size = regs[1].reg_size; + flash.write_size = ebus_regs[1].reg_size; } else { printk("flash: Strange number of regs %d\n", nregs); return -ENODEV; diff --git a/drivers/sbus/char/openprom.c b/drivers/sbus/char/openprom.c index 239e108b8..2f698763b 100644 --- a/drivers/sbus/char/openprom.c +++ b/drivers/sbus/char/openprom.c @@ -29,9 +29,6 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#define PROMLIB_INTERNAL - -#include #include #include #include @@ -39,10 +36,10 @@ #include #include #include -#include #include #include #include +#include #include #include #include @@ -51,15 +48,20 @@ #include #endif +MODULE_AUTHOR("Thomas K. Dyas (tdyas@noc.rutgers.edu) and Eddie C. Dost (ecd@skynet.be)"); +MODULE_DESCRIPTION("OPENPROM Configuration Driver"); +MODULE_LICENSE("GPL"); +MODULE_VERSION("1.0"); + /* Private data kept by the driver for each descriptor. */ typedef struct openprom_private_data { - int current_node; /* Current node for SunOS ioctls. */ - int lastnode; /* Last valid node used by BSD ioctls. */ + struct device_node *current_node; /* Current node for SunOS ioctls. */ + struct device_node *lastnode; /* Last valid node used by BSD ioctls. */ } DATA; /* ID of the PROM node containing all of the EEPROM options. */ -static int options_node = 0; +static struct device_node *options_node; /* * Copy an openpromio structure into kernel space from user space. @@ -87,9 +89,8 @@ static int copyin(struct openpromio __user *info, struct openpromio **opp_p) if (bufsize > OPROMMAXPARAM) bufsize = OPROMMAXPARAM; - if (!(*opp_p = kmalloc(sizeof(int) + bufsize + 1, GFP_KERNEL))) + if (!(*opp_p = kzalloc(sizeof(int) + bufsize + 1, GFP_KERNEL))) return -ENOMEM; - memset(*opp_p, 0, sizeof(int) + bufsize + 1); if (copy_from_user(&(*opp_p)->oprom_array, &info->oprom_array, bufsize)) { @@ -107,10 +108,9 @@ static int getstrings(struct openpromio __user *info, struct openpromio **opp_p) if (!info || !opp_p) return -EFAULT; - if (!(*opp_p = kmalloc(sizeof(int) + OPROMMAXPARAM + 1, GFP_KERNEL))) + if (!(*opp_p = kzalloc(sizeof(int) + OPROMMAXPARAM + 1, GFP_KERNEL))) return -ENOMEM; - memset(*opp_p, 0, sizeof(int) + OPROMMAXPARAM + 1); (*opp_p)->oprom_size = 0; n = bufsize = 0; @@ -140,16 +140,171 @@ static int copyout(void __user *info, struct openpromio *opp, int len) return 0; } +static int opromgetprop(void __user *argp, struct device_node *dp, struct openpromio *op, int bufsize) +{ + void *pval; + int len; + + if (!dp || + !(pval = of_get_property(dp, op->oprom_array, &len)) || + len <= 0 || len > bufsize) + return copyout(argp, op, sizeof(int)); + + memcpy(op->oprom_array, pval, len); + op->oprom_array[len] = '\0'; + op->oprom_size = len; + + return copyout(argp, op, sizeof(int) + bufsize); +} + +static int opromnxtprop(void __user *argp, struct device_node *dp, struct openpromio *op, int bufsize) +{ + struct property *prop; + int len; + + if (!dp) + return copyout(argp, op, sizeof(int)); + if (op->oprom_array[0] == '\0') { + prop = dp->properties; + if (!prop) + return copyout(argp, op, sizeof(int)); + len = strlen(prop->name); + } else { + prop = of_find_property(dp, op->oprom_array, NULL); + + if (!prop || + !prop->next || + (len = strlen(prop->next->name)) + 1 > bufsize) + return copyout(argp, op, sizeof(int)); + + prop = prop->next; + } + + memcpy(op->oprom_array, prop->name, len); + op->oprom_array[len] = '\0'; + op->oprom_size = ++len; + + return copyout(argp, op, sizeof(int) + bufsize); +} + +static int opromsetopt(struct device_node *dp, struct openpromio *op, int bufsize) +{ + char *buf = op->oprom_array + strlen(op->oprom_array) + 1; + int len = op->oprom_array + bufsize - buf; + + return of_set_property(options_node, op->oprom_array, buf, len); +} + +static int opromnext(void __user *argp, unsigned int cmd, struct device_node *dp, struct openpromio *op, int bufsize, DATA *data) +{ + phandle ph; + + BUILD_BUG_ON(sizeof(phandle) != sizeof(int)); + + if (bufsize < sizeof(phandle)) + return -EINVAL; + + ph = *((int *) op->oprom_array); + if (ph) { + dp = of_find_node_by_phandle(ph); + if (!dp) + return -EINVAL; + + switch (cmd) { + case OPROMNEXT: + dp = dp->sibling; + break; + + case OPROMCHILD: + dp = dp->child; + break; + + case OPROMSETCUR: + default: + break; + }; + } else { + /* Sibling of node zero is the root node. */ + if (cmd != OPROMNEXT) + return -EINVAL; + + dp = of_find_node_by_path("/"); + } + + ph = 0; + if (dp) + ph = dp->node; + + data->current_node = dp; + *((int *) op->oprom_array) = ph; + op->oprom_size = sizeof(phandle); + + return copyout(argp, op, bufsize + sizeof(int)); +} + +static int oprompci2node(void __user *argp, struct device_node *dp, struct openpromio *op, int bufsize, DATA *data) +{ + int err = -EINVAL; + + if (bufsize >= 2*sizeof(int)) { +#ifdef CONFIG_PCI + struct pci_dev *pdev; + struct pcidev_cookie *pcp; + pdev = pci_find_slot (((int *) op->oprom_array)[0], + ((int *) op->oprom_array)[1]); + + pcp = pdev->sysdata; + if (pcp != NULL) { + dp = pcp->prom_node; + data->current_node = dp; + *((int *)op->oprom_array) = dp->node; + op->oprom_size = sizeof(int); + err = copyout(argp, op, bufsize + sizeof(int)); + } +#endif + } + + return err; +} + +static int oprompath2node(void __user *argp, struct device_node *dp, struct openpromio *op, int bufsize, DATA *data) +{ + phandle ph = 0; + + dp = of_find_node_by_path(op->oprom_array); + if (dp) + ph = dp->node; + data->current_node = dp; + *((int *)op->oprom_array) = ph; + op->oprom_size = sizeof(int); + + return copyout(argp, op, bufsize + sizeof(int)); +} + +static int opromgetbootargs(void __user *argp, struct openpromio *op, int bufsize) +{ + char *buf = saved_command_line; + int len = strlen(buf); + + if (len > bufsize) + return -EINVAL; + + strcpy(op->oprom_array, buf); + op->oprom_size = len; + + return copyout(argp, op, bufsize + sizeof(int)); +} + /* * SunOS and Solaris /dev/openprom ioctl calls. */ static int openprom_sunos_ioctl(struct inode * inode, struct file * file, - unsigned int cmd, unsigned long arg, int node) + unsigned int cmd, unsigned long arg, + struct device_node *dp) { - DATA *data = (DATA *) file->private_data; - char buffer[OPROMMAXPARAM+1], *buf; + DATA *data = file->private_data; struct openpromio *opp; - int bufsize, len, error = 0; + int bufsize, error = 0; static int cnt; void __user *argp = (void __user *)arg; @@ -164,119 +319,35 @@ static int openprom_sunos_ioctl(struct inode * inode, struct file * file, switch (cmd) { case OPROMGETOPT: case OPROMGETPROP: - len = prom_getproplen(node, opp->oprom_array); - - if (len <= 0 || len > bufsize) { - error = copyout(argp, opp, sizeof(int)); - break; - } - - len = prom_getproperty(node, opp->oprom_array, buffer, bufsize); - - memcpy(opp->oprom_array, buffer, len); - opp->oprom_array[len] = '\0'; - opp->oprom_size = len; - - error = copyout(argp, opp, sizeof(int) + bufsize); + error = opromgetprop(argp, dp, opp, bufsize); break; case OPROMNXTOPT: case OPROMNXTPROP: - buf = prom_nextprop(node, opp->oprom_array, buffer); - - len = strlen(buf); - if (len == 0 || len + 1 > bufsize) { - error = copyout(argp, opp, sizeof(int)); - break; - } - - memcpy(opp->oprom_array, buf, len); - opp->oprom_array[len] = '\0'; - opp->oprom_size = ++len; - - error = copyout(argp, opp, sizeof(int) + bufsize); + error = opromnxtprop(argp, dp, opp, bufsize); break; case OPROMSETOPT: case OPROMSETOPT2: - buf = opp->oprom_array + strlen(opp->oprom_array) + 1; - len = opp->oprom_array + bufsize - buf; - - error = prom_setprop(options_node, opp->oprom_array, - buf, len); - - if (error < 0) - error = -EINVAL; + error = opromsetopt(dp, opp, bufsize); break; case OPROMNEXT: case OPROMCHILD: case OPROMSETCUR: - if (bufsize < sizeof(int)) { - error = -EINVAL; - break; - } - - node = *((int *) opp->oprom_array); - - switch (cmd) { - case OPROMNEXT: node = __prom_getsibling(node); break; - case OPROMCHILD: node = __prom_getchild(node); break; - case OPROMSETCUR: break; - } - - data->current_node = node; - *((int *)opp->oprom_array) = node; - opp->oprom_size = sizeof(int); - - error = copyout(argp, opp, bufsize + sizeof(int)); + error = opromnext(argp, cmd, dp, opp, bufsize, data); break; case OPROMPCI2NODE: - error = -EINVAL; - - if (bufsize >= 2*sizeof(int)) { -#ifdef CONFIG_PCI - struct pci_dev *pdev; - struct pcidev_cookie *pcp; - pdev = pci_find_slot (((int *) opp->oprom_array)[0], - ((int *) opp->oprom_array)[1]); - - pcp = pdev->sysdata; - if (pcp != NULL && pcp->prom_node != -1 && pcp->prom_node) { - node = pcp->prom_node; - data->current_node = node; - *((int *)opp->oprom_array) = node; - opp->oprom_size = sizeof(int); - error = copyout(argp, opp, bufsize + sizeof(int)); - } -#endif - } + error = oprompci2node(argp, dp, opp, bufsize, data); break; case OPROMPATH2NODE: - node = prom_finddevice(opp->oprom_array); - data->current_node = node; - *((int *)opp->oprom_array) = node; - opp->oprom_size = sizeof(int); - - error = copyout(argp, opp, bufsize + sizeof(int)); + error = oprompath2node(argp, dp, opp, bufsize, data); break; case OPROMGETBOOTARGS: - buf = saved_command_line; - - len = strlen(buf); - - if (len > bufsize) { - error = -EINVAL; - break; - } - - strcpy(opp->oprom_array, buf); - opp->oprom_size = len; - - error = copyout(argp, opp, bufsize + sizeof(int)); + error = opromgetbootargs(argp, opp, bufsize); break; case OPROMU2P: @@ -297,25 +368,14 @@ static int openprom_sunos_ioctl(struct inode * inode, struct file * file, return error; } - -/* Return nonzero if a specific node is in the PROM device tree. */ -static int intree(int root, int node) +static struct device_node *get_node(phandle n, DATA *data) { - for (; root != 0; root = prom_getsibling(root)) - if (root == node || intree(prom_getchild(root),node)) - return 1; - return 0; -} + struct device_node *dp = of_find_node_by_phandle(n); -/* Return nonzero if a specific node is "valid". */ -static int goodnode(int n, DATA *data) -{ - if (n == data->lastnode || n == prom_root_node || n == options_node) - return 1; - if (n == 0 || n == -1 || !intree(prom_root_node,n)) - return 0; - data->lastnode = n; - return 1; + if (dp) + data->lastnode = dp; + + return dp; } /* Copy in a whole string from userspace into kernelspace. */ @@ -330,7 +390,7 @@ static int copyin_string(char __user *user, size_t len, char **ptr) if (!tmp) return -ENOMEM; - if(copy_from_user(tmp, user, len)) { + if (copy_from_user(tmp, user, len)) { kfree(tmp); return -EFAULT; } @@ -345,162 +405,187 @@ static int copyin_string(char __user *user, size_t len, char **ptr) /* * NetBSD /dev/openprom ioctl calls. */ -static int openprom_bsd_ioctl(struct inode * inode, struct file * file, - unsigned int cmd, unsigned long arg) +static int opiocget(void __user *argp, DATA *data) { - DATA *data = (DATA *) file->private_data; - void __user *argp = (void __user *)arg; struct opiocdesc op; - int error, node, len; - char *str, *tmp; - char buffer[64]; - static int cnt; - - switch (cmd) { - case OPIOCGET: - if (copy_from_user(&op, argp, sizeof(op))) - return -EFAULT; + struct device_node *dp; + char *str; + void *pval; + int err, len; - if (!goodnode(op.op_nodeid,data)) - return -EINVAL; - - error = copyin_string(op.op_name, op.op_namelen, &str); - if (error) - return error; + if (copy_from_user(&op, argp, sizeof(op))) + return -EFAULT; - len = prom_getproplen(op.op_nodeid,str); + dp = get_node(op.op_nodeid, data); - if (len > op.op_buflen) { - kfree(str); - return -ENOMEM; - } + err = copyin_string(op.op_name, op.op_namelen, &str); + if (err) + return err; + pval = of_get_property(dp, str, &len); + err = 0; + if (!pval || len > op.op_buflen) { + err = -EINVAL; + } else { op.op_buflen = len; + if (copy_to_user(argp, &op, sizeof(op)) || + copy_to_user(op.op_buf, pval, len)) + err = -EFAULT; + } + kfree(str); - if (len <= 0) { - kfree(str); - /* Verified by the above copy_from_user */ - if (__copy_to_user(argp, &op, - sizeof(op))) - return -EFAULT; - return 0; - } + return err; +} - tmp = kmalloc(len + 1, GFP_KERNEL); - if (!tmp) { - kfree(str); - return -ENOMEM; - } +static int opiocnextprop(void __user *argp, DATA *data) +{ + struct opiocdesc op; + struct device_node *dp; + struct property *prop; + char *str; + int err, len; - cnt = prom_getproperty(op.op_nodeid, str, tmp, len); - if (cnt <= 0) { - error = -EINVAL; - } else { - tmp[len] = '\0'; + if (copy_from_user(&op, argp, sizeof(op))) + return -EFAULT; - if (__copy_to_user(argp, &op, sizeof(op)) != 0 || - copy_to_user(op.op_buf, tmp, len) != 0) - error = -EFAULT; - } + dp = get_node(op.op_nodeid, data); + if (!dp) + return -EINVAL; - kfree(tmp); - kfree(str); + err = copyin_string(op.op_name, op.op_namelen, &str); + if (err) + return err; - return error; + if (str[0] == '\0') { + prop = dp->properties; + } else { + prop = of_find_property(dp, str, NULL); + if (prop) + prop = prop->next; + } + kfree(str); - case OPIOCNEXTPROP: - if (copy_from_user(&op, argp, sizeof(op))) - return -EFAULT; + if (!prop) + len = 0; + else + len = prop->length; - if (!goodnode(op.op_nodeid,data)) - return -EINVAL; + if (len > op.op_buflen) + len = op.op_buflen; - error = copyin_string(op.op_name, op.op_namelen, &str); - if (error) - return error; + if (copy_to_user(argp, &op, sizeof(op))) + return -EFAULT; - tmp = prom_nextprop(op.op_nodeid,str,buffer); + if (len && + copy_to_user(op.op_buf, prop->value, len)) + return -EFAULT; - if (tmp) { - len = strlen(tmp); - if (len > op.op_buflen) - len = op.op_buflen; - else - op.op_buflen = len; - } else { - len = op.op_buflen = 0; - } + return 0; +} - if (!access_ok(VERIFY_WRITE, argp, sizeof(op))) { - kfree(str); - return -EFAULT; - } +static int opiocset(void __user *argp, DATA *data) +{ + struct opiocdesc op; + struct device_node *dp; + char *str, *tmp; + int err; - if (!access_ok(VERIFY_WRITE, op.op_buf, len)) { - kfree(str); - return -EFAULT; - } + if (copy_from_user(&op, argp, sizeof(op))) + return -EFAULT; + + dp = get_node(op.op_nodeid, data); + if (!dp) + return -EINVAL; - error = __copy_to_user(argp, &op, sizeof(op)); - if (!error) error = __copy_to_user(op.op_buf, tmp, len); + err = copyin_string(op.op_name, op.op_namelen, &str); + if (err) + return err; + err = copyin_string(op.op_buf, op.op_buflen, &tmp); + if (err) { kfree(str); + return err; + } - return error; + err = of_set_property(dp, str, tmp, op.op_buflen); - case OPIOCSET: - if (copy_from_user(&op, argp, sizeof(op))) - return -EFAULT; + kfree(str); + kfree(tmp); - if (!goodnode(op.op_nodeid,data)) - return -EINVAL; + return err; +} - error = copyin_string(op.op_name, op.op_namelen, &str); - if (error) - return error; +static int opiocgetnext(unsigned int cmd, void __user *argp) +{ + struct device_node *dp; + phandle nd; - error = copyin_string(op.op_buf, op.op_buflen, &tmp); - if (error) { - kfree(str); - return error; - } + BUILD_BUG_ON(sizeof(phandle) != sizeof(int)); - len = prom_setprop(op.op_nodeid,str,tmp,op.op_buflen+1); + if (copy_from_user(&nd, argp, sizeof(phandle))) + return -EFAULT; - if (len != op.op_buflen) + if (nd == 0) { + if (cmd != OPIOCGETNEXT) return -EINVAL; + dp = of_find_node_by_path("/"); + } else { + dp = of_find_node_by_phandle(nd); + nd = 0; + if (dp) { + if (cmd == OPIOCGETNEXT) + dp = dp->sibling; + else + dp = dp->child; + } + } + if (dp) + nd = dp->node; + if (copy_to_user(argp, &nd, sizeof(phandle))) + return -EFAULT; - kfree(str); - kfree(tmp); + return 0; +} - return 0; +static int openprom_bsd_ioctl(struct inode * inode, struct file * file, + unsigned int cmd, unsigned long arg) +{ + DATA *data = (DATA *) file->private_data; + void __user *argp = (void __user *)arg; + int err; - case OPIOCGETOPTNODE: - if (copy_to_user(argp, &options_node, sizeof(int))) - return -EFAULT; - return 0; + switch (cmd) { + case OPIOCGET: + err = opiocget(argp, data); + break; - case OPIOCGETNEXT: - case OPIOCGETCHILD: - if (copy_from_user(&node, argp, sizeof(int))) - return -EFAULT; + case OPIOCNEXTPROP: + err = opiocnextprop(argp, data); + break; - if (cmd == OPIOCGETNEXT) - node = __prom_getsibling(node); - else - node = __prom_getchild(node); + case OPIOCSET: + err = opiocset(argp, data); + break; + + case OPIOCGETOPTNODE: + BUILD_BUG_ON(sizeof(phandle) != sizeof(int)); - if (__copy_to_user(argp, &node, sizeof(int))) + if (copy_to_user(argp, &options_node->node, sizeof(phandle))) return -EFAULT; return 0; + case OPIOCGETNEXT: + case OPIOCGETCHILD: + err = opiocgetnext(cmd, argp); + break; + default: - if (cnt++ < 10) - printk(KERN_INFO "openprom_bsd_ioctl: cmd 0x%X\n", cmd); return -EINVAL; - } + }; + + return err; } @@ -511,7 +596,6 @@ static int openprom_ioctl(struct inode * inode, struct file * file, unsigned int cmd, unsigned long arg) { DATA *data = (DATA *) file->private_data; - static int cnt; switch (cmd) { case OPROMGETOPT: @@ -563,10 +647,8 @@ static int openprom_ioctl(struct inode * inode, struct file * file, return openprom_bsd_ioctl(inode,file,cmd,arg); default: - if (cnt++ < 10) - printk("openprom_ioctl: cmd 0x%X, arg 0x%lX\n", cmd, arg); return -EINVAL; - } + }; } static long openprom_compat_ioctl(struct file *file, unsigned int cmd, @@ -594,9 +676,7 @@ static long openprom_compat_ioctl(struct file *file, unsigned int cmd, case OPROMSETCUR: case OPROMPCI2NODE: case OPROMPATH2NODE: - lock_kernel(); rval = openprom_ioctl(file->f_dentry->d_inode, file, cmd, arg); - lock_kernel(); break; } @@ -607,13 +687,13 @@ static int openprom_open(struct inode * inode, struct file * file) { DATA *data; - data = (DATA *) kmalloc(sizeof(DATA), GFP_KERNEL); + data = kmalloc(sizeof(DATA), GFP_KERNEL); if (!data) return -ENOMEM; - data->current_node = prom_root_node; - data->lastnode = prom_root_node; - file->private_data = (void *)data; + data->current_node = of_find_node_by_path("/"); + data->lastnode = data->current_node; + file->private_data = (void *) data; return 0; } @@ -634,24 +714,30 @@ static struct file_operations openprom_fops = { }; static struct miscdevice openprom_dev = { - SUN_OPENPROM_MINOR, "openprom", &openprom_fops + .minor = SUN_OPENPROM_MINOR, + .name = "openprom", + .fops = &openprom_fops, }; static int __init openprom_init(void) { - int error; + struct device_node *dp; + int err; - error = misc_register(&openprom_dev); - if (error) { - printk(KERN_ERR "openprom: unable to get misc minor\n"); - return error; - } + err = misc_register(&openprom_dev); + if (err) + return err; - options_node = prom_getchild(prom_root_node); - options_node = prom_searchsiblings(options_node,"options"); + dp = of_find_node_by_path("/"); + dp = dp->child; + while (dp) { + if (!strcmp(dp->name, "options")) + break; + dp = dp->sibling; + } + options_node = dp; - if (options_node == 0 || options_node == -1) { - printk(KERN_ERR "openprom: unable to find options node\n"); + if (!options_node) { misc_deregister(&openprom_dev); return -EIO; } @@ -666,4 +752,3 @@ static void __exit openprom_cleanup(void) module_init(openprom_init); module_exit(openprom_cleanup); -MODULE_LICENSE("GPL"); diff --git a/drivers/sbus/char/riowatchdog.c b/drivers/sbus/char/riowatchdog.c index d1babff6a..2a9cc8204 100644 --- a/drivers/sbus/char/riowatchdog.c +++ b/drivers/sbus/char/riowatchdog.c @@ -211,7 +211,7 @@ static int __init riowd_bbc_init(void) for_each_ebus(ebus) { for_each_ebusdev(edev, ebus) { - if (!strcmp(edev->prom_name, "bbc")) + if (!strcmp(edev->ofdev.node->name, "bbc")) goto found_bbc; } } @@ -238,7 +238,7 @@ static int __init riowd_init(void) for_each_ebus(ebus) { for_each_ebusdev(edev, ebus) { - if (!strcmp(edev->prom_name, RIOWD_NAME)) + if (!strcmp(edev->ofdev.node->name, RIOWD_NAME)) goto ebus_done; } } diff --git a/drivers/sbus/char/uctrl.c b/drivers/sbus/char/uctrl.c index e2d9a7c85..575b1f7ed 100644 --- a/drivers/sbus/char/uctrl.c +++ b/drivers/sbus/char/uctrl.c @@ -400,7 +400,7 @@ static int __init ts102_uctrl_init(void) } driver->regs->uctrl_intr = UCTRL_INTR_RXNE_REQ|UCTRL_INTR_RXNE_MSK; - printk("uctrl: 0x%x (irq %s)\n", driver->regs, __irq_itoa(driver->irq)); + printk("uctrl: 0x%x (irq %d)\n", driver->regs, driver->irq); uctrl_get_event_status(); uctrl_get_external_status(); return 0; diff --git a/drivers/sbus/char/vfc.h b/drivers/sbus/char/vfc.h index 8045cd5e7..63941a259 100644 --- a/drivers/sbus/char/vfc.h +++ b/drivers/sbus/char/vfc.h @@ -1,8 +1,6 @@ #ifndef _LINUX_VFC_H_ #define _LINUX_VFC_H_ -#include - /* * The control register for the vfc is at offset 0x4000 * The first field ram bank is located at offset 0x5000 diff --git a/drivers/sbus/char/vfc_dev.c b/drivers/sbus/char/vfc_dev.c index dfdd6be55..55b2b31bd 100644 --- a/drivers/sbus/char/vfc_dev.c +++ b/drivers/sbus/char/vfc_dev.c @@ -164,10 +164,6 @@ int init_vfc_device(struct sbus_dev *sdev,struct vfc_dev *dev, int instance) return -EINVAL; if (init_vfc_hw(dev)) return -EIO; - - devfs_mk_cdev(MKDEV(VFC_MAJOR, instance), - S_IFCHR | S_IRUSR | S_IWUSR, - "vfc/%d", instance); return 0; } @@ -623,7 +619,7 @@ static int vfc_mmap(struct file *file, struct vm_area_struct *vma) map_size = sizeof(struct vfc_regs); vma->vm_flags |= - (VM_SHM | VM_LOCKED | VM_IO | VM_MAYREAD | VM_MAYWRITE | VM_MAYSHARE); + (VM_MAYREAD | VM_MAYWRITE | VM_MAYSHARE); map_offset = (unsigned int) (long)dev->phys_regs; ret = io_remap_pfn_range(vma, vma->vm_start, MK_IOSPACE_PFN(dev->which_io, @@ -677,7 +673,6 @@ static int vfc_probe(void) kfree(vfc_dev_lst); return -EIO; } - devfs_mk_dir("vfc"); instance = 0; for_all_sbusdev(sdev, sbus) { if (strcmp(sdev->prom_name, "vfc") == 0) { @@ -717,7 +712,6 @@ static void deinit_vfc_device(struct vfc_dev *dev) { if(dev == NULL) return; - devfs_remove("vfc/%d", dev->instance); sbus_iounmap(dev->regs, sizeof(struct vfc_regs)); kfree(dev); } @@ -731,7 +725,6 @@ void cleanup_module(void) for (devp = vfc_dev_lst; *devp; devp++) deinit_vfc_device(*devp); - devfs_remove("vfc"); kfree(vfc_dev_lst); return; } diff --git a/drivers/sbus/dvma.c b/drivers/sbus/dvma.c index 378a1d680..57e152674 100644 --- a/drivers/sbus/dvma.c +++ b/drivers/sbus/dvma.c @@ -3,7 +3,6 @@ * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) */ -#include #include #include #include diff --git a/drivers/sbus/sbus.c b/drivers/sbus/sbus.c index 5d30a3ebf..935952ef8 100644 --- a/drivers/sbus/sbus.c +++ b/drivers/sbus/sbus.c @@ -1,12 +1,10 @@ -/* $Id: sbus.c,v 1.100 2002/01/24 15:36:24 davem Exp $ - * sbus.c: SBus support routines. +/* sbus.c: SBus support routines. * - * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) + * Copyright (C) 1995, 2006 David S. Miller (davem@davemloft.net) */ #include #include -#include #include #include @@ -14,237 +12,76 @@ #include #include #include +#include +#include #include #include -struct sbus_bus *sbus_root = NULL; +struct sbus_bus *sbus_root; -static struct linux_prom_irqs irqs[PROMINTR_MAX] __initdata = { { 0 } }; -#ifdef CONFIG_SPARC32 -static int interrupts[PROMINTR_MAX] __initdata = { 0 }; -#endif - -#ifdef CONFIG_PCI -extern int pcic_present(void); -#endif - -/* Perhaps when I figure out more about the iommu we'll put a - * device registration routine here that probe_sbus() calls to - * setup the iommu for each Sbus. - */ - -/* We call this for each SBus device, and fill the structure based - * upon the prom device tree. We return the start of memory after - * the things we have allocated. - */ - -/* #define DEBUG_FILL */ - -static void __init fill_sbus_device(int prom_node, struct sbus_dev *sdev) +static void __init fill_sbus_device(struct device_node *dp, struct sbus_dev *sdev) { - unsigned long address, base; + unsigned long base; + void *pval; int len; - sdev->prom_node = prom_node; - prom_getstring(prom_node, "name", - sdev->prom_name, sizeof(sdev->prom_name)); - address = prom_getint(prom_node, "address"); - len = prom_getproperty(prom_node, "reg", - (char *) sdev->reg_addrs, - sizeof(sdev->reg_addrs)); - if (len == -1) { - sdev->num_registers = 0; - goto no_regs; - } + sdev->prom_node = dp->node; + strcpy(sdev->prom_name, dp->name); - if (len % sizeof(struct linux_prom_registers)) { - prom_printf("fill_sbus_device: proplen for regs of %s " - " was %d, need multiple of %d\n", - sdev->prom_name, len, - (int) sizeof(struct linux_prom_registers)); - prom_halt(); - } - if (len > (sizeof(struct linux_prom_registers) * PROMREG_MAX)) { - prom_printf("fill_sbus_device: Too many register properties " - "for device %s, len=%d\n", - sdev->prom_name, len); - prom_halt(); - } - sdev->num_registers = len / sizeof(struct linux_prom_registers); - sdev->ranges_applied = 0; + pval = of_get_property(dp, "reg", &len); + sdev->num_registers = 0; + if (pval) { + memcpy(sdev->reg_addrs, pval, len); - base = (unsigned long) sdev->reg_addrs[0].phys_addr; + sdev->num_registers = + len / sizeof(struct linux_prom_registers); - /* Compute the slot number. */ - if (base >= SUN_SBUS_BVADDR && sparc_cpu_model == sun4m) { - sdev->slot = sbus_dev_slot(base); - } else { - sdev->slot = sdev->reg_addrs[0].which_io; - } + base = (unsigned long) sdev->reg_addrs[0].phys_addr; -no_regs: - len = prom_getproperty(prom_node, "ranges", - (char *)sdev->device_ranges, - sizeof(sdev->device_ranges)); - if (len == -1) { - sdev->num_device_ranges = 0; - goto no_ranges; - } - if (len % sizeof(struct linux_prom_ranges)) { - prom_printf("fill_sbus_device: proplen for ranges of %s " - " was %d, need multiple of %d\n", - sdev->prom_name, len, - (int) sizeof(struct linux_prom_ranges)); - prom_halt(); - } - if (len > (sizeof(struct linux_prom_ranges) * PROMREG_MAX)) { - prom_printf("fill_sbus_device: Too many range properties " - "for device %s, len=%d\n", - sdev->prom_name, len); - prom_halt(); + /* Compute the slot number. */ + if (base >= SUN_SBUS_BVADDR && sparc_cpu_model == sun4m) + sdev->slot = sbus_dev_slot(base); + else + sdev->slot = sdev->reg_addrs[0].which_io; } - sdev->num_device_ranges = - len / sizeof(struct linux_prom_ranges); - -no_ranges: - /* XXX Unfortunately, IRQ issues are very arch specific. - * XXX Pull this crud out into an arch specific area - * XXX at some point. -DaveM - */ -#ifdef CONFIG_SPARC64 - len = prom_getproperty(prom_node, "interrupts", - (char *) irqs, sizeof(irqs)); - if (len == -1 || len == 0) { - sdev->irqs[0] = 0; - sdev->num_irqs = 0; - } else { - unsigned int pri = irqs[0].pri; - - sdev->num_irqs = 1; - if (pri < 0x20) - pri += sdev->slot * 8; - - sdev->irqs[0] = sbus_build_irq(sdev->bus, pri); + + pval = of_get_property(dp, "ranges", &len); + sdev->num_device_ranges = 0; + if (pval) { + memcpy(sdev->device_ranges, pval, len); + sdev->num_device_ranges = + len / sizeof(struct linux_prom_ranges); } -#endif /* CONFIG_SPARC64 */ - -#ifdef CONFIG_SPARC32 - len = prom_getproperty(prom_node, "intr", - (char *)irqs, sizeof(irqs)); - if (len != -1) { - sdev->num_irqs = len / 8; - if (sdev->num_irqs == 0) { - sdev->irqs[0] = 0; - } else if (sparc_cpu_model == sun4d) { - extern unsigned int sun4d_build_irq(struct sbus_dev *sdev, int irq); - - for (len = 0; len < sdev->num_irqs; len++) - sdev->irqs[len] = sun4d_build_irq(sdev, irqs[len].pri); - } else { - for (len = 0; len < sdev->num_irqs; len++) - sdev->irqs[len] = irqs[len].pri; - } - } else { - /* No "intr" node found-- check for "interrupts" node. - * This node contains SBus interrupt levels, not IPLs - * as in "intr", and no vector values. We convert - * SBus interrupt levels to PILs (platform specific). - */ - len = prom_getproperty(prom_node, "interrupts", - (char *)interrupts, sizeof(interrupts)); - if (len == -1) { - sdev->irqs[0] = 0; - sdev->num_irqs = 0; - } else { - sdev->num_irqs = len / sizeof(int); - for (len = 0; len < sdev->num_irqs; len++) { - sdev->irqs[len] = sbint_to_irq(sdev, interrupts[len]); - } - } - } -#endif /* CONFIG_SPARC32 */ -} -/* This routine gets called from whoever needs the sbus first, to scan - * the SBus device tree. Currently it just prints out the devices - * found on the bus and builds trees of SBUS structs and attached - * devices. - */ + sbus_fill_device_irq(sdev); -extern void iommu_init(int iommu_node, struct sbus_bus *sbus); -extern void iounit_init(int sbi_node, int iounit_node, struct sbus_bus *sbus); -void sun4_init(void); -#ifdef CONFIG_SUN_AUXIO -extern void auxio_probe(void); -#endif - -static void __init sbus_do_child_siblings(int start_node, - struct sbus_dev *child, - struct sbus_dev *parent, - struct sbus_bus *sbus) -{ - struct sbus_dev *this_dev = child; - int this_node = start_node; - - /* Child already filled in, just need to traverse siblings. */ - child->child = NULL; - child->parent = parent; - while((this_node = prom_getsibling(this_node)) != 0) { - this_dev->next = kmalloc(sizeof(struct sbus_dev), GFP_ATOMIC); - this_dev = this_dev->next; - this_dev->next = NULL; - this_dev->parent = parent; - - this_dev->bus = sbus; - fill_sbus_device(this_node, this_dev); - - if(prom_getchild(this_node)) { - this_dev->child = kmalloc(sizeof(struct sbus_dev), - GFP_ATOMIC); - this_dev->child->bus = sbus; - this_dev->child->next = NULL; - fill_sbus_device(prom_getchild(this_node), this_dev->child); - sbus_do_child_siblings(prom_getchild(this_node), - this_dev->child, this_dev, sbus); - } else { - this_dev->child = NULL; - } - } -} + sdev->ofdev.node = dp; + if (sdev->parent) + sdev->ofdev.dev.parent = &sdev->parent->ofdev.dev; + else + sdev->ofdev.dev.parent = &sdev->bus->ofdev.dev; + sdev->ofdev.dev.bus = &sbus_bus_type; + strcpy(sdev->ofdev.dev.bus_id, dp->path_component_name); -/* - * XXX This functions appears to be a distorted version of - * prom_sbus_ranges_init(), with all sun4d stuff cut away. - * Ask DaveM what is going on here, how is sun4d supposed to work... XXX - */ -/* added back sun4d patch from Thomas Bogendoerfer - should be OK (crn) */ + if (of_device_register(&sdev->ofdev) != 0) + printk(KERN_DEBUG "sbus: device registration error for %s!\n", + sdev->ofdev.dev.bus_id); +} -static void __init sbus_bus_ranges_init(int parent_node, struct sbus_bus *sbus) +static void __init sbus_bus_ranges_init(struct device_node *dp, struct sbus_bus *sbus) { + void *pval; int len; - len = prom_getproperty(sbus->prom_node, "ranges", - (char *) sbus->sbus_ranges, - sizeof(sbus->sbus_ranges)); - if (len == -1 || len == 0) { - sbus->num_sbus_ranges = 0; - return; - } - sbus->num_sbus_ranges = len / sizeof(struct linux_prom_ranges); -#ifdef CONFIG_SPARC32 - if (sparc_cpu_model == sun4d) { - struct linux_prom_ranges iounit_ranges[PROMREG_MAX]; - int num_iounit_ranges; - - len = prom_getproperty(parent_node, "ranges", - (char *) iounit_ranges, - sizeof (iounit_ranges)); - if (len != -1) { - num_iounit_ranges = (len/sizeof(struct linux_prom_ranges)); - prom_adjust_ranges (sbus->sbus_ranges, sbus->num_sbus_ranges, iounit_ranges, num_iounit_ranges); - } + pval = of_get_property(dp, "ranges", &len); + sbus->num_sbus_ranges = 0; + if (pval) { + memcpy(sbus->sbus_ranges, pval, len); + sbus->num_sbus_ranges = + len / sizeof(struct linux_prom_ranges); + + sbus_arch_bus_ranges_init(dp->parent, sbus); } -#endif } static void __init __apply_ranges_to_regs(struct linux_prom_ranges *ranges, @@ -322,241 +159,127 @@ static void __init sbus_fixup_all_regs(struct sbus_dev *first_sdev) } } -extern void register_proc_sparc_ioport(void); -extern void firetruck_init(void); +/* We preserve the "probe order" of these bus and device lists to give + * the same ordering as the old code. + */ +static void __init sbus_insert(struct sbus_bus *sbus, struct sbus_bus **root) +{ + while (*root) + root = &(*root)->next; + *root = sbus; + sbus->next = NULL; +} -#ifdef CONFIG_SUN4 -extern void sun4_dvma_init(void); -#endif +static void __init sdev_insert(struct sbus_dev *sdev, struct sbus_dev **root) +{ + while (*root) + root = &(*root)->next; + *root = sdev; + sdev->next = NULL; +} -static int __init sbus_init(void) +static void __init walk_children(struct device_node *dp, struct sbus_dev *parent, struct sbus_bus *sbus) { - int nd, this_sbus, sbus_devs, topnd, iommund; - unsigned int sbus_clock; - struct sbus_bus *sbus; - struct sbus_dev *this_dev; - int num_sbus = 0; /* How many did we find? */ + dp = dp->child; + while (dp) { + struct sbus_dev *sdev; -#ifdef CONFIG_SPARC32 - register_proc_sparc_ioport(); -#endif + sdev = kzalloc(sizeof(struct sbus_dev), GFP_ATOMIC); + if (sdev) { + sdev_insert(sdev, &parent->child); -#ifdef CONFIG_SUN4 - sun4_dvma_init(); - return 0; -#endif - - topnd = prom_getchild(prom_root_node); - - /* Finding the first sbus is a special case... */ - iommund = 0; - if(sparc_cpu_model == sun4u) { - nd = prom_searchsiblings(topnd, "sbus"); - if(nd == 0) { -#ifdef CONFIG_PCI - if (!pcic_present()) { - prom_printf("Neither SBUS nor PCI found.\n"); - prom_halt(); - } else { -#ifdef CONFIG_SPARC64 - firetruck_init(); -#endif - } - return 0; -#else - prom_printf("YEEE, UltraSparc sbus not found\n"); - prom_halt(); -#endif - } - } else if(sparc_cpu_model == sun4d) { - if((iommund = prom_searchsiblings(topnd, "io-unit")) == 0 || - (nd = prom_getchild(iommund)) == 0 || - (nd = prom_searchsiblings(nd, "sbi")) == 0) { - panic("sbi not found"); - } - } else if((nd = prom_searchsiblings(topnd, "sbus")) == 0) { - if((iommund = prom_searchsiblings(topnd, "iommu")) == 0 || - (nd = prom_getchild(iommund)) == 0 || - (nd = prom_searchsiblings(nd, "sbus")) == 0) { -#ifdef CONFIG_PCI - if (!pcic_present()) { - prom_printf("Neither SBUS nor PCI found.\n"); - prom_halt(); - } - return 0; -#else - /* No reason to run further - the data access trap will occur. */ - panic("sbus not found"); -#endif + sdev->bus = sbus; + sdev->parent = parent; + + fill_sbus_device(dp, sdev); + + walk_children(dp, sdev, sbus); } + dp = dp->sibling; } +} - /* Ok, we've found the first one, allocate first SBus struct - * and place in chain. - */ - sbus = sbus_root = kmalloc(sizeof(struct sbus_bus), GFP_ATOMIC); - sbus->next = NULL; - sbus->prom_node = nd; - this_sbus = nd; +static void __init build_one_sbus(struct device_node *dp, int num_sbus) +{ + struct sbus_bus *sbus; + unsigned int sbus_clock; + struct device_node *dev_dp; - if(iommund && sparc_cpu_model != sun4u && sparc_cpu_model != sun4d) - iommu_init(iommund, sbus); + sbus = kzalloc(sizeof(struct sbus_bus), GFP_ATOMIC); + if (!sbus) + return; - /* Loop until we find no more SBUS's */ - while(this_sbus) { -#ifdef CONFIG_SPARC64 - /* IOMMU hides inside SBUS/SYSIO prom node on Ultra. */ - if(sparc_cpu_model == sun4u) { - extern void sbus_iommu_init(int prom_node, struct sbus_bus *sbus); + sbus_insert(sbus, &sbus_root); + sbus->prom_node = dp->node; - sbus_iommu_init(this_sbus, sbus); - } -#endif /* CONFIG_SPARC64 */ - -#ifdef CONFIG_SPARC32 - if (sparc_cpu_model == sun4d) - iounit_init(this_sbus, iommund, sbus); -#endif /* CONFIG_SPARC32 */ - printk("sbus%d: ", num_sbus); - sbus_clock = prom_getint(this_sbus, "clock-frequency"); - if(sbus_clock == -1) - sbus_clock = (25*1000*1000); - printk("Clock %d.%d MHz\n", (int) ((sbus_clock/1000)/1000), - (int) (((sbus_clock/1000)%1000 != 0) ? - (((sbus_clock/1000)%1000) + 1000) : 0)); - - prom_getstring(this_sbus, "name", - sbus->prom_name, sizeof(sbus->prom_name)); - sbus->clock_freq = sbus_clock; -#ifdef CONFIG_SPARC32 - if (sparc_cpu_model == sun4d) { - sbus->devid = prom_getint(iommund, "device-id"); - sbus->board = prom_getint(iommund, "board#"); - } -#endif - - sbus_bus_ranges_init(iommund, sbus); - - sbus_devs = prom_getchild(this_sbus); - if (!sbus_devs) { - sbus->devices = NULL; - goto next_bus; - } + sbus_setup_iommu(sbus, dp); - sbus->devices = kmalloc(sizeof(struct sbus_dev), GFP_ATOMIC); - - this_dev = sbus->devices; - this_dev->next = NULL; - - this_dev->bus = sbus; - this_dev->parent = NULL; - fill_sbus_device(sbus_devs, this_dev); - - /* Should we traverse for children? */ - if(prom_getchild(sbus_devs)) { - /* Allocate device node */ - this_dev->child = kmalloc(sizeof(struct sbus_dev), - GFP_ATOMIC); - /* Fill it */ - this_dev->child->bus = sbus; - this_dev->child->next = NULL; - fill_sbus_device(prom_getchild(sbus_devs), - this_dev->child); - sbus_do_child_siblings(prom_getchild(sbus_devs), - this_dev->child, - this_dev, - sbus); - } else { - this_dev->child = NULL; - } + printk("sbus%d: ", num_sbus); - while((sbus_devs = prom_getsibling(sbus_devs)) != 0) { - /* Allocate device node */ - this_dev->next = kmalloc(sizeof(struct sbus_dev), - GFP_ATOMIC); - this_dev = this_dev->next; - this_dev->next = NULL; - - /* Fill it */ - this_dev->bus = sbus; - this_dev->parent = NULL; - fill_sbus_device(sbus_devs, this_dev); - - /* Is there a child node hanging off of us? */ - if(prom_getchild(sbus_devs)) { - /* Get new device struct */ - this_dev->child = kmalloc(sizeof(struct sbus_dev), - GFP_ATOMIC); - /* Fill it */ - this_dev->child->bus = sbus; - this_dev->child->next = NULL; - fill_sbus_device(prom_getchild(sbus_devs), - this_dev->child); - sbus_do_child_siblings(prom_getchild(sbus_devs), - this_dev->child, - this_dev, - sbus); - } else { - this_dev->child = NULL; - } + sbus_clock = of_getintprop_default(dp, "clock-frequency", + (25*1000*1000)); + sbus->clock_freq = sbus_clock; + + printk("Clock %d.%d MHz\n", (int) ((sbus_clock/1000)/1000), + (int) (((sbus_clock/1000)%1000 != 0) ? + (((sbus_clock/1000)%1000) + 1000) : 0)); + + strcpy(sbus->prom_name, dp->name); + + sbus_setup_arch_props(sbus, dp); + + sbus_bus_ranges_init(dp, sbus); + + sbus->ofdev.node = dp; + sbus->ofdev.dev.parent = NULL; + sbus->ofdev.dev.bus = &sbus_bus_type; + sprintf(sbus->ofdev.dev.bus_id, "sbus%d", num_sbus); + + if (of_device_register(&sbus->ofdev) != 0) + printk(KERN_DEBUG "sbus: device registration error for %s!\n", + sbus->ofdev.dev.bus_id); + + dev_dp = dp->child; + while (dev_dp) { + struct sbus_dev *sdev; + + sdev = kzalloc(sizeof(struct sbus_dev), GFP_ATOMIC); + if (sdev) { + sdev_insert(sdev, &sbus->devices); + + sdev->bus = sbus; + sdev->parent = NULL; + fill_sbus_device(dev_dp, sdev); + + walk_children(dev_dp, sdev, sbus); } + dev_dp = dev_dp->sibling; + } - /* Walk all devices and apply parent ranges. */ - sbus_fixup_all_regs(sbus->devices); + sbus_fixup_all_regs(sbus->devices); - dvma_init(sbus); - next_bus: + dvma_init(sbus); +} + +static int __init sbus_init(void) +{ + struct device_node *dp; + const char *sbus_name = "sbus"; + int num_sbus = 0; + + if (sbus_arch_preinit()) + return 0; + + if (sparc_cpu_model == sun4d) + sbus_name = "sbi"; + + for_each_node_by_name(dp, sbus_name) { + build_one_sbus(dp, num_sbus); num_sbus++; - if(sparc_cpu_model == sun4u) { - this_sbus = prom_getsibling(this_sbus); - if(!this_sbus) - break; - this_sbus = prom_searchsiblings(this_sbus, "sbus"); - } else if(sparc_cpu_model == sun4d) { - iommund = prom_getsibling(iommund); - if(!iommund) - break; - iommund = prom_searchsiblings(iommund, "io-unit"); - if(!iommund) - break; - this_sbus = prom_searchsiblings(prom_getchild(iommund), "sbi"); - } else { - this_sbus = prom_getsibling(this_sbus); - if(!this_sbus) - break; - this_sbus = prom_searchsiblings(this_sbus, "sbus"); - } - if(this_sbus) { - sbus->next = kmalloc(sizeof(struct sbus_bus), GFP_ATOMIC); - sbus = sbus->next; - sbus->next = NULL; - sbus->prom_node = this_sbus; - } else { - break; - } - } /* while(this_sbus) */ - if (sparc_cpu_model == sun4d) { - extern void sun4d_init_sbi_irq(void); - sun4d_init_sbi_irq(); - } - -#ifdef CONFIG_SPARC64 - if (sparc_cpu_model == sun4u) { - firetruck_init(); } -#endif -#ifdef CONFIG_SUN_AUXIO - if (sparc_cpu_model == sun4u) - auxio_probe (); -#endif -#ifdef CONFIG_SPARC64 - if (sparc_cpu_model == sun4u) { - extern void clock_probe(void); - - clock_probe(); - } -#endif + + sbus_arch_postinit(); return 0; } diff --git a/drivers/scsi/3w-9xxx.c b/drivers/scsi/3w-9xxx.c index a2b18f5a4..5a9475e56 100644 --- a/drivers/scsi/3w-9xxx.c +++ b/drivers/scsi/3w-9xxx.c @@ -2,8 +2,9 @@ 3w-9xxx.c -- 3ware 9000 Storage Controller device driver for Linux. Written By: Adam Radford + Modifications By: Tom Couch - Copyright (C) 2004-2005 Applied Micro Circuits Corporation. + Copyright (C) 2004-2006 Applied Micro Circuits 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 @@ -59,6 +60,12 @@ Fix 'handled=1' ISR usage, remove bogus IRQ check. Remove un-needed eh_abort handler. Add support for embedded firmware error strings. + 2.26.02.003 - Correctly handle single sgl's with use_sg=1. + 2.26.02.004 - Add support for 9550SX controllers. + 2.26.02.005 - Fix use_sg == 0 mapping on systems with 4GB or higher. + 2.26.02.006 - Fix 9550SX pchip reset timeout. + Add big endian support. + 2.26.02.007 - Disable local interrupts during kmap/unmap_atomic(). */ #include @@ -71,6 +78,7 @@ #include #include #include +#include #include #include #include @@ -81,7 +89,7 @@ #include "3w-9xxx.h" /* Globals */ -#define TW_DRIVER_VERSION "2.26.02.002" +#define TW_DRIVER_VERSION "2.26.02.007" static TW_Device_Extension *twa_device_extension_list[TW_MAX_SLOT]; static unsigned int twa_device_extension_count; static int twa_major = -1; @@ -204,7 +212,7 @@ static int twa_aen_complete(TW_Device_Extension *tw_dev, int request_id) header = (TW_Command_Apache_Header *)tw_dev->generic_buffer_virt[request_id]; tw_dev->posted_request_count--; - aen = header->status_block.error; + aen = le16_to_cpu(header->status_block.error); full_command_packet = tw_dev->command_packet_virt[request_id]; command_packet = &full_command_packet->command.oldcommand; @@ -301,7 +309,7 @@ static int twa_aen_drain_queue(TW_Device_Extension *tw_dev, int no_check_reset) tw_dev->posted_request_count--; header = (TW_Command_Apache_Header *)tw_dev->generic_buffer_virt[request_id]; - aen = header->status_block.error; + aen = le16_to_cpu(header->status_block.error); queue = 0; count++; @@ -361,7 +369,7 @@ static void twa_aen_queue_event(TW_Device_Extension *tw_dev, TW_Command_Apache_H tw_dev->aen_clobber = 1; } - aen = header->status_block.error; + aen = le16_to_cpu(header->status_block.error); memset(event, 0, sizeof(TW_Event)); event->severity = TW_SEV_OUT(header->status_block.severity__reserved); @@ -378,7 +386,7 @@ static void twa_aen_queue_event(TW_Device_Extension *tw_dev, TW_Command_Apache_H header->err_specific_desc[sizeof(header->err_specific_desc) - 1] = '\0'; event->parameter_len = strlen(header->err_specific_desc); - memcpy(event->parameter_data, header->err_specific_desc, event->parameter_len); + memcpy(event->parameter_data, header->err_specific_desc, event->parameter_len + (error_str[0] == '\0' ? 0 : (1 + strlen(error_str)))); if (event->severity != TW_AEN_SEVERITY_DEBUG) printk(KERN_WARNING "3w-9xxx:%s AEN: %s (0x%02X:0x%04X): %s:%s.\n", host, @@ -458,24 +466,24 @@ static void twa_aen_sync_time(TW_Device_Extension *tw_dev, int request_id) command_packet = &full_command_packet->command.oldcommand; command_packet->opcode__sgloffset = TW_OPSGL_IN(2, TW_OP_SET_PARAM); command_packet->request_id = request_id; - command_packet->byte8_offset.param.sgl[0].address = tw_dev->generic_buffer_phys[request_id]; - command_packet->byte8_offset.param.sgl[0].length = TW_SECTOR_SIZE; + command_packet->byte8_offset.param.sgl[0].address = TW_CPU_TO_SGL(tw_dev->generic_buffer_phys[request_id]); + command_packet->byte8_offset.param.sgl[0].length = cpu_to_le32(TW_SECTOR_SIZE); command_packet->size = TW_COMMAND_SIZE; - command_packet->byte6_offset.parameter_count = 1; + command_packet->byte6_offset.parameter_count = cpu_to_le16(1); /* Setup the param */ param = (TW_Param_Apache *)tw_dev->generic_buffer_virt[request_id]; memset(param, 0, TW_SECTOR_SIZE); - param->table_id = TW_TIMEKEEP_TABLE | 0x8000; /* Controller time keep table */ - param->parameter_id = 0x3; /* SchedulerTime */ - param->parameter_size_bytes = 4; + param->table_id = cpu_to_le16(TW_TIMEKEEP_TABLE | 0x8000); /* Controller time keep table */ + param->parameter_id = cpu_to_le16(0x3); /* SchedulerTime */ + param->parameter_size_bytes = cpu_to_le16(4); /* Convert system time in UTC to local time seconds since last Sunday 12:00AM */ do_gettimeofday(&utc); local_time = (u32)(utc.tv_sec - (sys_tz.tz_minuteswest * 60)); schedulertime = local_time - (3 * 86400); - schedulertime = schedulertime % 604800; + schedulertime = cpu_to_le32(schedulertime % 604800); memcpy(param->data, &schedulertime, sizeof(u32)); @@ -613,7 +621,7 @@ static int twa_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int void __user *argp = (void __user *)arg; /* Only let one of these through at a time */ - if (down_interruptible(&tw_dev->ioctl_sem)) { + if (mutex_lock_interruptible(&tw_dev->ioctl_lock)) { retval = TW_IOCTL_ERROR_OS_EINTR; goto out; } @@ -850,7 +858,7 @@ out3: /* Now free ioctl buf memory */ dma_free_coherent(&tw_dev->tw_pci_dev->dev, data_buffer_length_adjusted+sizeof(TW_Ioctl_Buf_Apache) - 1, cpu_addr, dma_handle); out2: - up(&tw_dev->ioctl_sem); + mutex_unlock(&tw_dev->ioctl_lock); out: return retval; } /* End twa_chrdev_ioctl() */ @@ -891,11 +899,6 @@ static int twa_decode_bits(TW_Device_Extension *tw_dev, u32 status_reg_value) writel(TW_CONTROL_CLEAR_QUEUE_ERROR, TW_CONTROL_REG_ADDR(tw_dev)); } - if (status_reg_value & TW_STATUS_SBUF_WRITE_ERROR) { - TW_PRINTK(tw_dev->host, TW_DRIVER, 0xf, "SBUF Write Error: clearing"); - writel(TW_CONTROL_CLEAR_SBUF_WRITE_ERROR, TW_CONTROL_REG_ADDR(tw_dev)); - } - if (status_reg_value & TW_STATUS_MICROCONTROLLER_ERROR) { if (tw_dev->reset_print == 0) { TW_PRINTK(tw_dev->host, TW_DRIVER, 0x10, "Microcontroller Error: clearing"); @@ -929,6 +932,29 @@ out: return retval; } /* End twa_empty_response_queue() */ +/* This function will clear the pchip/response queue on 9550SX */ +static int twa_empty_response_queue_large(TW_Device_Extension *tw_dev) +{ + u32 response_que_value = 0; + unsigned long before; + int retval = 1; + + if (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9550SX) { + before = jiffies; + while ((response_que_value & TW_9550SX_DRAIN_COMPLETED) != TW_9550SX_DRAIN_COMPLETED) { + response_que_value = readl(TW_RESPONSE_QUEUE_REG_ADDR_LARGE(tw_dev)); + if (time_after(jiffies, before + HZ * 30)) + goto out; + } + /* P-chip settle time */ + msleep(500); + retval = 0; + } else + retval = 0; +out: + return retval; +} /* End twa_empty_response_queue_large() */ + /* This function passes sense keys from firmware to scsi layer */ static int twa_fill_sense(TW_Device_Extension *tw_dev, int request_id, int copy_sense, int print_host) { @@ -943,7 +969,7 @@ static int twa_fill_sense(TW_Device_Extension *tw_dev, int request_id, int copy_ error_str = &(full_command_packet->header.err_specific_desc[strlen(full_command_packet->header.err_specific_desc) + 1]); /* Don't print error for Logical unit not supported during rollcall */ - error = full_command_packet->header.status_block.error; + error = le16_to_cpu(full_command_packet->header.status_block.error); if ((error != TW_ERROR_LOGICAL_UNIT_NOT_SUPPORTED) && (error != TW_ERROR_UNIT_OFFLINE)) { if (print_host) printk(KERN_WARNING "3w-9xxx: scsi%d: ERROR: (0x%02X:0x%04X): %s:%s.\n", @@ -990,8 +1016,7 @@ static void twa_free_device_extension(TW_Device_Extension *tw_dev) tw_dev->generic_buffer_virt[0], tw_dev->generic_buffer_phys[0]); - if (tw_dev->event_queue[0]) - kfree(tw_dev->event_queue[0]); + kfree(tw_dev->event_queue[0]); } /* End twa_free_device_extension() */ /* This function will free a request id */ @@ -1002,7 +1027,7 @@ static void twa_free_request_id(TW_Device_Extension *tw_dev, int request_id) tw_dev->free_tail = (tw_dev->free_tail + 1) % TW_Q_LENGTH; } /* End twa_free_request_id() */ -/* This function will get parameter table entires from the firmware */ +/* This function will get parameter table entries from the firmware */ static void *twa_get_param(TW_Device_Extension *tw_dev, int request_id, int table_id, int parameter_id, int parameter_size_bytes) { TW_Command_Full *full_command_packet; @@ -1019,18 +1044,18 @@ static void *twa_get_param(TW_Device_Extension *tw_dev, int request_id, int tabl command_packet->opcode__sgloffset = TW_OPSGL_IN(2, TW_OP_GET_PARAM); command_packet->size = TW_COMMAND_SIZE; command_packet->request_id = request_id; - command_packet->byte6_offset.block_count = 1; + command_packet->byte6_offset.block_count = cpu_to_le16(1); /* Now setup the param */ param = (TW_Param_Apache *)tw_dev->generic_buffer_virt[request_id]; memset(param, 0, TW_SECTOR_SIZE); - param->table_id = table_id | 0x8000; - param->parameter_id = parameter_id; - param->parameter_size_bytes = parameter_size_bytes; + param->table_id = cpu_to_le16(table_id | 0x8000); + param->parameter_id = cpu_to_le16(parameter_id); + param->parameter_size_bytes = cpu_to_le16(parameter_size_bytes); param_value = tw_dev->generic_buffer_phys[request_id]; - command_packet->byte8_offset.param.sgl[0].address = param_value; - command_packet->byte8_offset.param.sgl[0].length = TW_SECTOR_SIZE; + command_packet->byte8_offset.param.sgl[0].address = TW_CPU_TO_SGL(param_value); + command_packet->byte8_offset.param.sgl[0].length = cpu_to_le32(TW_SECTOR_SIZE); /* Post the command packet to the board */ twa_post_command_packet(tw_dev, request_id, 1); @@ -1079,18 +1104,20 @@ static int twa_initconnection(TW_Device_Extension *tw_dev, int message_credits, tw_initconnect = (TW_Initconnect *)&full_command_packet->command.oldcommand; tw_initconnect->opcode__reserved = TW_OPRES_IN(0, TW_OP_INIT_CONNECTION); tw_initconnect->request_id = request_id; - tw_initconnect->message_credits = message_credits; + tw_initconnect->message_credits = cpu_to_le16(message_credits); tw_initconnect->features = set_features; /* Turn on 64-bit sgl support if we need to */ tw_initconnect->features |= sizeof(dma_addr_t) > 4 ? 1 : 0; + tw_initconnect->features = cpu_to_le32(tw_initconnect->features); + if (set_features & TW_EXTENDED_INIT_CONNECT) { tw_initconnect->size = TW_INIT_COMMAND_PACKET_SIZE_EXTENDED; - tw_initconnect->fw_srl = current_fw_srl; - tw_initconnect->fw_arch_id = current_fw_arch_id; - tw_initconnect->fw_branch = current_fw_branch; - tw_initconnect->fw_build = current_fw_build; + tw_initconnect->fw_srl = cpu_to_le16(current_fw_srl); + tw_initconnect->fw_arch_id = cpu_to_le16(current_fw_arch_id); + tw_initconnect->fw_branch = cpu_to_le16(current_fw_branch); + tw_initconnect->fw_build = cpu_to_le16(current_fw_build); } else tw_initconnect->size = TW_INIT_COMMAND_PACKET_SIZE; @@ -1102,11 +1129,11 @@ static int twa_initconnection(TW_Device_Extension *tw_dev, int message_credits, TW_PRINTK(tw_dev->host, TW_DRIVER, 0x15, "No valid response during init connection"); } else { if (set_features & TW_EXTENDED_INIT_CONNECT) { - *fw_on_ctlr_srl = tw_initconnect->fw_srl; - *fw_on_ctlr_arch_id = tw_initconnect->fw_arch_id; - *fw_on_ctlr_branch = tw_initconnect->fw_branch; - *fw_on_ctlr_build = tw_initconnect->fw_build; - *init_connect_result = tw_initconnect->result; + *fw_on_ctlr_srl = le16_to_cpu(tw_initconnect->fw_srl); + *fw_on_ctlr_arch_id = le16_to_cpu(tw_initconnect->fw_arch_id); + *fw_on_ctlr_branch = le16_to_cpu(tw_initconnect->fw_branch); + *fw_on_ctlr_build = le16_to_cpu(tw_initconnect->fw_build); + *init_connect_result = le32_to_cpu(tw_initconnect->result); } retval = 0; } @@ -1156,7 +1183,7 @@ static int twa_initialize_device_extension(TW_Device_Extension *tw_dev) tw_dev->error_sequence_id = 1; tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE; - init_MUTEX(&tw_dev->ioctl_sem); + mutex_init(&tw_dev->ioctl_lock); init_waitqueue_head(&tw_dev->ioctl_wqueue); retval = 0; @@ -1330,10 +1357,10 @@ static void twa_load_sgl(TW_Command_Full *full_command_packet, int request_id, d newcommand = &full_command_packet->command.newcommand; newcommand->request_id__lunl = TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->request_id__lunl), request_id); - newcommand->sg_list[0].address = dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1; - newcommand->sg_list[0].length = length; + newcommand->sg_list[0].address = TW_CPU_TO_SGL(dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1); + newcommand->sg_list[0].length = cpu_to_le32(length); newcommand->sgl_entries__lunh = - TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->sgl_entries__lunh), 1); + cpu_to_le16(TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->sgl_entries__lunh), 1)); } else { oldcommand = &full_command_packet->command.oldcommand; oldcommand->request_id = request_id; @@ -1341,8 +1368,8 @@ static void twa_load_sgl(TW_Command_Full *full_command_packet, int request_id, d if (TW_SGL_OUT(oldcommand->opcode__sgloffset)) { /* Load the sg list */ sgl = (TW_SG_Entry *)((u32 *)oldcommand+TW_SGL_OUT(oldcommand->opcode__sgloffset)); - sgl->address = dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1; - sgl->length = length; + sgl->address = TW_CPU_TO_SGL(dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1); + sgl->length = cpu_to_le32(length); if ((sizeof(long) < 8) && (sizeof(dma_addr_t) > 4)) oldcommand->size += 1; @@ -1361,7 +1388,7 @@ static int twa_map_scsi_sg_data(TW_Device_Extension *tw_dev, int request_id) if (cmd->use_sg == 0) goto out; - use_sg = pci_map_sg(pdev, cmd->buffer, cmd->use_sg, DMA_BIDIRECTIONAL); + use_sg = pci_map_sg(pdev, cmd->request_buffer, cmd->use_sg, DMA_BIDIRECTIONAL); if (use_sg == 0) { TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1c, "Failed to map scatter gather list"); @@ -1381,7 +1408,7 @@ static dma_addr_t twa_map_scsi_single_data(TW_Device_Extension *tw_dev, int requ dma_addr_t mapping; struct scsi_cmnd *cmd = tw_dev->srb[request_id]; struct pci_dev *pdev = tw_dev->tw_pci_dev; - int retval = 0; + dma_addr_t retval = 0; if (cmd->request_bufflen == 0) { retval = 0; @@ -1612,8 +1639,16 @@ static int twa_reset_sequence(TW_Device_Extension *tw_dev, int soft_reset) int tries = 0, retval = 1, flashed = 0, do_soft_reset = soft_reset; while (tries < TW_MAX_RESET_TRIES) { - if (do_soft_reset) + if (do_soft_reset) { TW_SOFT_RESET(tw_dev); + /* Clear pchip/response queue on 9550SX */ + if (twa_empty_response_queue_large(tw_dev)) { + TW_PRINTK(tw_dev->host, TW_DRIVER, 0x36, "Response queue (large) empty failed during reset sequence"); + do_soft_reset = 1; + tries++; + continue; + } + } /* Make sure controller is in a good state */ if (twa_poll_status(tw_dev, TW_STATUS_MICROCONTROLLER_READY | (do_soft_reset == 1 ? TW_STATUS_ATTENTION_INTERRUPT : 0), 60)) { @@ -1695,11 +1730,11 @@ static int twa_scsi_eh_reset(struct scsi_cmnd *SCpnt) tw_dev = (TW_Device_Extension *)SCpnt->device->host->hostdata; - spin_unlock_irq(tw_dev->host->host_lock); - tw_dev->num_resets++; - printk(KERN_WARNING "3w-9xxx: scsi%d: WARNING: (0x%02X:0x%04X): Unit #%d: Command (0x%x) timed out, resetting card.\n", tw_dev->host->host_no, TW_DRIVER, 0x2c, SCpnt->device->id, SCpnt->cmnd[0]); + sdev_printk(KERN_WARNING, SCpnt->device, + "WARNING: (0x%02X:0x%04X): Command (0x%x) timed out, resetting card.\n", + TW_DRIVER, 0x2c, SCpnt->cmnd[0]); /* Now reset the card and some of the device extension data */ if (twa_reset_device_extension(tw_dev, 0)) { @@ -1709,7 +1744,6 @@ static int twa_scsi_eh_reset(struct scsi_cmnd *SCpnt) retval = SUCCESS; out: - spin_lock_irq(tw_dev->host->host_lock); return retval; } /* End twa_scsi_eh_reset() */ @@ -1764,7 +1798,7 @@ static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, int i, sg_count; struct scsi_cmnd *srb = NULL; struct scatterlist *sglist = NULL; - u32 buffaddr = 0x0; + dma_addr_t buffaddr = 0x0; int retval = 1; if (tw_dev->srb[request_id]) { @@ -1793,10 +1827,10 @@ static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, if (srb) { command_packet->unit = srb->device->id; command_packet->request_id__lunl = - TW_REQ_LUN_IN(srb->device->lun, request_id); + cpu_to_le16(TW_REQ_LUN_IN(srb->device->lun, request_id)); } else { command_packet->request_id__lunl = - TW_REQ_LUN_IN(0, request_id); + cpu_to_le16(TW_REQ_LUN_IN(0, request_id)); command_packet->unit = 0; } @@ -1806,19 +1840,21 @@ static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, /* Map sglist from scsi layer to cmd packet */ if (tw_dev->srb[request_id]->use_sg == 0) { if (tw_dev->srb[request_id]->request_bufflen < TW_MIN_SGL_LENGTH) { - command_packet->sg_list[0].address = tw_dev->generic_buffer_phys[request_id]; - command_packet->sg_list[0].length = TW_MIN_SGL_LENGTH; + command_packet->sg_list[0].address = TW_CPU_TO_SGL(tw_dev->generic_buffer_phys[request_id]); + command_packet->sg_list[0].length = cpu_to_le32(TW_MIN_SGL_LENGTH); + if (tw_dev->srb[request_id]->sc_data_direction == DMA_TO_DEVICE || tw_dev->srb[request_id]->sc_data_direction == DMA_BIDIRECTIONAL) + memcpy(tw_dev->generic_buffer_virt[request_id], tw_dev->srb[request_id]->request_buffer, tw_dev->srb[request_id]->request_bufflen); } else { buffaddr = twa_map_scsi_single_data(tw_dev, request_id); if (buffaddr == 0) goto out; - command_packet->sg_list[0].address = buffaddr; - command_packet->sg_list[0].length = tw_dev->srb[request_id]->request_bufflen; + command_packet->sg_list[0].address = TW_CPU_TO_SGL(buffaddr); + command_packet->sg_list[0].length = cpu_to_le32(tw_dev->srb[request_id]->request_bufflen); } - command_packet->sgl_entries__lunh = TW_REQ_LUN_IN((srb->device->lun >> 4), 1); + command_packet->sgl_entries__lunh = cpu_to_le16(TW_REQ_LUN_IN((srb->device->lun >> 4), 1)); - if (command_packet->sg_list[0].address & TW_ALIGNMENT_9000_SGL) { + if (command_packet->sg_list[0].address & TW_CPU_TO_SGL(TW_ALIGNMENT_9000_SGL)) { TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2d, "Found unaligned address during execute scsi"); goto out; } @@ -1826,35 +1862,41 @@ static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, if (tw_dev->srb[request_id]->use_sg > 0) { if ((tw_dev->srb[request_id]->use_sg == 1) && (tw_dev->srb[request_id]->request_bufflen < TW_MIN_SGL_LENGTH)) { - command_packet->sg_list[0].address = tw_dev->generic_buffer_phys[request_id]; - command_packet->sg_list[0].length = TW_MIN_SGL_LENGTH; + if (tw_dev->srb[request_id]->sc_data_direction == DMA_TO_DEVICE || tw_dev->srb[request_id]->sc_data_direction == DMA_BIDIRECTIONAL) { + struct scatterlist *sg = (struct scatterlist *)tw_dev->srb[request_id]->request_buffer; + char *buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset; + memcpy(tw_dev->generic_buffer_virt[request_id], buf, sg->length); + kunmap_atomic(buf - sg->offset, KM_IRQ0); + } + command_packet->sg_list[0].address = TW_CPU_TO_SGL(tw_dev->generic_buffer_phys[request_id]); + command_packet->sg_list[0].length = cpu_to_le32(TW_MIN_SGL_LENGTH); } else { sg_count = twa_map_scsi_sg_data(tw_dev, request_id); if (sg_count == 0) goto out; for (i = 0; i < sg_count; i++) { - command_packet->sg_list[i].address = sg_dma_address(&sglist[i]); - command_packet->sg_list[i].length = sg_dma_len(&sglist[i]); - if (command_packet->sg_list[i].address & TW_ALIGNMENT_9000_SGL) { + command_packet->sg_list[i].address = TW_CPU_TO_SGL(sg_dma_address(&sglist[i])); + command_packet->sg_list[i].length = cpu_to_le32(sg_dma_len(&sglist[i])); + if (command_packet->sg_list[i].address & TW_CPU_TO_SGL(TW_ALIGNMENT_9000_SGL)) { TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2e, "Found unaligned sgl address during execute scsi"); goto out; } } } - command_packet->sgl_entries__lunh = TW_REQ_LUN_IN((srb->device->lun >> 4), tw_dev->srb[request_id]->use_sg); + command_packet->sgl_entries__lunh = cpu_to_le16(TW_REQ_LUN_IN((srb->device->lun >> 4), tw_dev->srb[request_id]->use_sg)); } } else { /* Internal cdb post */ for (i = 0; i < use_sg; i++) { - command_packet->sg_list[i].address = sglistarg[i].address; - command_packet->sg_list[i].length = sglistarg[i].length; - if (command_packet->sg_list[i].address & TW_ALIGNMENT_9000_SGL) { + command_packet->sg_list[i].address = TW_CPU_TO_SGL(sglistarg[i].address); + command_packet->sg_list[i].length = cpu_to_le32(sglistarg[i].length); + if (command_packet->sg_list[i].address & TW_CPU_TO_SGL(TW_ALIGNMENT_9000_SGL)) { TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2f, "Found unaligned sgl address during internal post"); goto out; } } - command_packet->sgl_entries__lunh = TW_REQ_LUN_IN(0, use_sg); + command_packet->sgl_entries__lunh = cpu_to_le16(TW_REQ_LUN_IN(0, use_sg)); } if (srb) { @@ -1891,11 +1933,24 @@ out: /* This function completes an execute scsi operation */ static void twa_scsiop_execute_scsi_complete(TW_Device_Extension *tw_dev, int request_id) { - /* Copy the response if too small */ - if ((tw_dev->srb[request_id]->request_buffer) && (tw_dev->srb[request_id]->request_bufflen < TW_MIN_SGL_LENGTH)) { - memcpy(tw_dev->srb[request_id]->request_buffer, - tw_dev->generic_buffer_virt[request_id], - tw_dev->srb[request_id]->request_bufflen); + if (tw_dev->srb[request_id]->request_bufflen < TW_MIN_SGL_LENGTH && + (tw_dev->srb[request_id]->sc_data_direction == DMA_FROM_DEVICE || + tw_dev->srb[request_id]->sc_data_direction == DMA_BIDIRECTIONAL)) { + if (tw_dev->srb[request_id]->use_sg == 0) { + memcpy(tw_dev->srb[request_id]->request_buffer, + tw_dev->generic_buffer_virt[request_id], + tw_dev->srb[request_id]->request_bufflen); + } + if (tw_dev->srb[request_id]->use_sg == 1) { + struct scatterlist *sg = (struct scatterlist *)tw_dev->srb[request_id]->request_buffer; + char *buf; + unsigned long flags = 0; + local_irq_save(flags); + buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset; + memcpy(buf, tw_dev->generic_buffer_virt[request_id], sg->length); + kunmap_atomic(buf - sg->offset, KM_IRQ0); + local_irq_restore(flags); + } } } /* End twa_scsiop_execute_scsi_complete() */ @@ -1919,9 +1974,9 @@ static void __twa_shutdown(TW_Device_Extension *tw_dev) } /* End __twa_shutdown() */ /* Wrapper for __twa_shutdown */ -static void twa_shutdown(struct device *dev) +static void twa_shutdown(struct pci_dev *pdev) { - struct Scsi_Host *host = pci_get_drvdata(to_pci_dev(dev)); + struct Scsi_Host *host = pci_get_drvdata(pdev); TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata; __twa_shutdown(tw_dev); @@ -2019,7 +2074,10 @@ static int __devinit twa_probe(struct pci_dev *pdev, const struct pci_device_id goto out_free_device_extension; } - mem_addr = pci_resource_start(pdev, 1); + if (pdev->device == PCI_DEVICE_ID_3WARE_9000) + mem_addr = pci_resource_start(pdev, 1); + else + mem_addr = pci_resource_start(pdev, 2); /* Save base address */ tw_dev->base_addr = ioremap(mem_addr, PAGE_SIZE); @@ -2060,11 +2118,11 @@ static int __devinit twa_probe(struct pci_dev *pdev, const struct pci_device_id TW_PARAM_FWVER, TW_PARAM_FWVER_LENGTH), (char *)twa_get_param(tw_dev, 1, TW_VERSION_TABLE, TW_PARAM_BIOSVER, TW_PARAM_BIOSVER_LENGTH), - *(int *)twa_get_param(tw_dev, 2, TW_INFORMATION_TABLE, - TW_PARAM_PORTCOUNT, TW_PARAM_PORTCOUNT_LENGTH)); + le32_to_cpu(*(int *)twa_get_param(tw_dev, 2, TW_INFORMATION_TABLE, + TW_PARAM_PORTCOUNT, TW_PARAM_PORTCOUNT_LENGTH))); /* Now setup the interrupt handler */ - retval = request_irq(pdev->irq, twa_interrupt, SA_SHIRQ, "3w-9xxx", tw_dev); + retval = request_irq(pdev->irq, twa_interrupt, IRQF_SHARED, "3w-9xxx", tw_dev); if (retval) { TW_PRINTK(tw_dev->host, TW_DRIVER, 0x30, "Error requesting IRQ"); goto out_remove_host; @@ -2133,6 +2191,8 @@ static void twa_remove(struct pci_dev *pdev) static struct pci_device_id twa_pci_tbl[] __devinitdata = { { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9000, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9550SX, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, { } }; MODULE_DEVICE_TABLE(pci, twa_pci_tbl); @@ -2143,9 +2203,7 @@ static struct pci_driver twa_driver = { .id_table = twa_pci_tbl, .probe = twa_probe, .remove = twa_remove, - .driver = { - .shutdown = twa_shutdown - } + .shutdown = twa_shutdown }; /* This function is called on driver initialization */ diff --git a/drivers/scsi/3w-xxxx.c b/drivers/scsi/3w-xxxx.c index e8e41e6eb..f3a5f422a 100644 --- a/drivers/scsi/3w-xxxx.c +++ b/drivers/scsi/3w-xxxx.c @@ -405,7 +405,7 @@ static int tw_decode_sense(TW_Device_Extension *tw_dev, int request_id, int fill /* Attempt to return intelligent sense information */ if (fill_sense) { if ((command->status == 0xc7) || (command->status == 0xcb)) { - for (i=0;i<(sizeof(tw_sense_table)/sizeof(tw_sense_table[0]));i++) { + for (i = 0; i < ARRAY_SIZE(tw_sense_table); i++) { if (command->flags == tw_sense_table[i][0]) { /* Valid bit and 'current errors' */ @@ -625,7 +625,7 @@ static int tw_aen_complete(TW_Device_Extension *tw_dev, int request_id) if (aen == 0x0ff) { printk(KERN_WARNING "3w-xxxx: scsi%d: AEN: INFO: AEN queue overflow.\n", tw_dev->host->host_no); } else { - table_max = sizeof(tw_aen_string)/sizeof(char *); + table_max = ARRAY_SIZE(tw_aen_string); if ((aen & 0x0ff) < table_max) { if ((tw_aen_string[aen & 0xff][strlen(tw_aen_string[aen & 0xff])-1]) == '#') { printk(KERN_WARNING "3w-xxxx: scsi%d: AEN: %s%d.\n", tw_dev->host->host_no, tw_aen_string[aen & 0xff], aen >> 8); @@ -786,7 +786,7 @@ static int tw_aen_drain_queue(TW_Device_Extension *tw_dev) if (aen == 0x0ff) { printk(KERN_WARNING "3w-xxxx: AEN: INFO: AEN queue overflow.\n"); } else { - table_max = sizeof(tw_aen_string)/sizeof(char *); + table_max = ARRAY_SIZE(tw_aen_string); if ((aen & 0x0ff) < table_max) { if ((tw_aen_string[aen & 0xff][strlen(tw_aen_string[aen & 0xff])-1]) == '#') { printk(KERN_WARNING "3w-xxxx: AEN: %s%d.\n", tw_aen_string[aen & 0xff], aen >> 8); @@ -1286,7 +1286,7 @@ static int tw_map_scsi_sg_data(struct pci_dev *pdev, struct scsi_cmnd *cmd) if (cmd->use_sg == 0) return 0; - use_sg = pci_map_sg(pdev, cmd->buffer, cmd->use_sg, DMA_BIDIRECTIONAL); + use_sg = pci_map_sg(pdev, cmd->request_buffer, cmd->use_sg, DMA_BIDIRECTIONAL); if (use_sg == 0) { printk(KERN_WARNING "3w-xxxx: tw_map_scsi_sg_data(): pci_map_sg() failed.\n"); @@ -2397,7 +2397,7 @@ static int __devinit tw_probe(struct pci_dev *pdev, const struct pci_device_id * printk(KERN_WARNING "3w-xxxx: scsi%d: Found a 3ware Storage Controller at 0x%x, IRQ: %d.\n", host->host_no, tw_dev->base_addr, pdev->irq); /* Now setup the interrupt handler */ - retval = request_irq(pdev->irq, tw_interrupt, SA_SHIRQ, "3w-xxxx", tw_dev); + retval = request_irq(pdev->irq, tw_interrupt, IRQF_SHARED, "3w-xxxx", tw_dev); if (retval) { printk(KERN_WARNING "3w-xxxx: Error requesting IRQ."); goto out_remove_host; diff --git a/drivers/scsi/53c700.c b/drivers/scsi/53c700.c index 6a0f9506e..15ce40a70 100644 --- a/drivers/scsi/53c700.c +++ b/drivers/scsi/53c700.c @@ -114,7 +114,6 @@ * */ #define NCR_700_VERSION "2.8" -#include #include #include #include @@ -174,6 +173,7 @@ STATIC int NCR_700_bus_reset(struct scsi_cmnd * SCpnt); STATIC int NCR_700_host_reset(struct scsi_cmnd * SCpnt); STATIC void NCR_700_chip_setup(struct Scsi_Host *host); STATIC void NCR_700_chip_reset(struct Scsi_Host *host); +STATIC int NCR_700_slave_alloc(struct scsi_device *SDpnt); STATIC int NCR_700_slave_configure(struct scsi_device *SDpnt); STATIC void NCR_700_slave_destroy(struct scsi_device *SDpnt); static int NCR_700_change_queue_depth(struct scsi_device *SDpnt, int depth); @@ -316,7 +316,7 @@ NCR_700_detect(struct scsi_host_template *tpnt, BUG_ON(!dma_is_consistent(pScript) && L1_CACHE_BYTES < dma_get_cache_alignment()); hostdata->slots = (struct NCR_700_command_slot *)(memory + SLOTS_OFFSET); hostdata->dev = dev; - + pSlots = pScript + SLOTS_OFFSET; /* Fill in the missing routines from the host template */ @@ -330,21 +330,21 @@ NCR_700_detect(struct scsi_host_template *tpnt, tpnt->use_clustering = ENABLE_CLUSTERING; tpnt->slave_configure = NCR_700_slave_configure; tpnt->slave_destroy = NCR_700_slave_destroy; + tpnt->slave_alloc = NCR_700_slave_alloc; tpnt->change_queue_depth = NCR_700_change_queue_depth; tpnt->change_queue_type = NCR_700_change_queue_type; - + if(tpnt->name == NULL) tpnt->name = "53c700"; if(tpnt->proc_name == NULL) tpnt->proc_name = "53c700"; - host = scsi_host_alloc(tpnt, 4); if (!host) return NULL; memset(hostdata->slots, 0, sizeof(struct NCR_700_command_slot) * NCR_700_COMMAND_SLOTS_PER_HOST); - for(j = 0; j < NCR_700_COMMAND_SLOTS_PER_HOST; j++) { + for (j = 0; j < NCR_700_COMMAND_SLOTS_PER_HOST; j++) { dma_addr_t offset = (dma_addr_t)((unsigned long)&hostdata->slots[j].SG[0] - (unsigned long)&hostdata->slots[0].SG[0]); hostdata->slots[j].pSG = (struct NCR_700_SG_List *)((unsigned long)(pSlots + offset)); @@ -355,14 +355,12 @@ NCR_700_detect(struct scsi_host_template *tpnt, hostdata->slots[j].state = NCR_700_SLOT_FREE; } - for(j = 0; j < sizeof(SCRIPT)/sizeof(SCRIPT[0]); j++) { + for (j = 0; j < ARRAY_SIZE(SCRIPT); j++) script[j] = bS_to_host(SCRIPT[j]); - } /* adjust all labels to be bus physical */ - for(j = 0; j < PATCHES; j++) { + for (j = 0; j < PATCHES; j++) script[LABELPATCHES[j]] = bS_to_host(pScript + SCRIPT[LABELPATCHES[j]]); - } /* now patch up fixed addresses. */ script_patch_32(script, MessageLocation, pScript + MSGOUT_OFFSET); @@ -376,7 +374,7 @@ NCR_700_detect(struct scsi_host_template *tpnt, dma_sync_single_for_device(hostdata->dev, pScript, sizeof(SCRIPT), DMA_TO_DEVICE); hostdata->state = NCR_700_HOST_FREE; hostdata->cmd = NULL; - host->max_id = 7; + host->max_id = 8; host->max_lun = NCR_700_MAX_LUNS; BUG_ON(NCR_700_transport_template == NULL); host->transportt = NCR_700_transport_template; @@ -385,17 +383,17 @@ NCR_700_detect(struct scsi_host_template *tpnt, host->hostdata[0] = (unsigned long)hostdata; /* kick the chip */ NCR_700_writeb(0xff, host, CTEST9_REG); - if(hostdata->chip710) + if (hostdata->chip710) hostdata->rev = (NCR_700_readb(host, CTEST8_REG)>>4) & 0x0f; else hostdata->rev = (NCR_700_readb(host, CTEST7_REG)>>4) & 0x0f; hostdata->fast = (NCR_700_readb(host, CTEST9_REG) == 0); - if(banner == 0) { + if (banner == 0) { printk(KERN_NOTICE "53c700: Version " NCR_700_VERSION " By James.Bottomley@HansenPartnership.com\n"); banner = 1; } printk(KERN_NOTICE "scsi%d: %s rev %d %s\n", host->host_no, - hostdata->chip710 ? "53c710" : + hostdata->chip710 ? "53c710" : (hostdata->fast ? "53c700-66" : "53c700"), hostdata->rev, hostdata->differential ? "(Differential)" : ""); @@ -540,6 +538,7 @@ find_empty_slot(struct NCR_700_Host_Parameters *hostdata) * finish routine. If we cannot queue the command when it * is properly build, we then change to NCR_700_SLOT_QUEUED */ slot->state = NCR_700_SLOT_BUSY; + slot->flags = 0; hostdata->command_slot_count++; return slot; @@ -589,7 +588,7 @@ NCR_700_unmap(struct NCR_700_Host_Parameters *hostdata, struct scsi_cmnd *SCp, if(SCp->sc_data_direction != DMA_NONE && SCp->sc_data_direction != DMA_BIDIRECTIONAL) { if(SCp->use_sg) { - dma_unmap_sg(hostdata->dev, SCp->buffer, + dma_unmap_sg(hostdata->dev, SCp->request_buffer, SCp->use_sg, SCp->sc_data_direction); } else { dma_unmap_single(hostdata->dev, slot->dma_handle, @@ -610,31 +609,24 @@ NCR_700_scsi_done(struct NCR_700_Host_Parameters *hostdata, struct NCR_700_command_slot *slot = (struct NCR_700_command_slot *)SCp->host_scribble; - NCR_700_unmap(hostdata, SCp, slot); dma_unmap_single(hostdata->dev, slot->pCmd, sizeof(SCp->cmnd), DMA_TO_DEVICE); - if(SCp->cmnd[0] == REQUEST_SENSE && SCp->cmnd[6] == NCR_700_INTERNAL_SENSE_MAGIC) { + if (slot->flags == NCR_700_FLAG_AUTOSENSE) { + char *cmnd = NCR_700_get_sense_cmnd(SCp->device); #ifdef NCR_700_DEBUG printk(" ORIGINAL CMD %p RETURNED %d, new return is %d sense is\n", SCp, SCp->cmnd[7], result); scsi_print_sense("53c700", SCp); #endif + dma_unmap_single(hostdata->dev, slot->dma_handle, sizeof(SCp->sense_buffer), DMA_FROM_DEVICE); /* restore the old result if the request sense was * successful */ if(result == 0) - result = SCp->cmnd[7]; - /* now restore the original command */ - memcpy((void *) SCp->cmnd, (void *) SCp->data_cmnd, - sizeof(SCp->data_cmnd)); - SCp->request_buffer = SCp->buffer; - SCp->request_bufflen = SCp->bufflen; - SCp->use_sg = SCp->old_use_sg; - SCp->cmd_len = SCp->old_cmd_len; - SCp->sc_data_direction = SCp->sc_old_data_direction; - SCp->underflow = SCp->old_underflow; - - } + result = cmnd[7]; + } else + NCR_700_unmap(hostdata, SCp, slot); + free_slot(slot, hostdata); #ifdef NCR_700_DEBUG if(NCR_700_get_depth(SCp->device) == 0 || @@ -975,13 +967,15 @@ process_script_interrupt(__u32 dsps, __u32 dsp, struct scsi_cmnd *SCp, status_byte(hostdata->status[0]) == COMMAND_TERMINATED) { struct NCR_700_command_slot *slot = (struct NCR_700_command_slot *)SCp->host_scribble; - if(SCp->cmnd[0] == REQUEST_SENSE) { + if(slot->flags == NCR_700_FLAG_AUTOSENSE) { /* OOPS: bad device, returning another * contingent allegiance condition */ scmd_printk(KERN_ERR, SCp, "broken device is looping in contingent allegiance: ignoring\n"); NCR_700_scsi_done(hostdata, SCp, hostdata->status[0]); } else { + char *cmnd = + NCR_700_get_sense_cmnd(SCp->device); #ifdef NCR_DEBUG scsi_print_command(SCp); printk(" cmd %p has status %d, requesting sense\n", @@ -995,27 +989,25 @@ process_script_interrupt(__u32 dsps, __u32 dsp, struct scsi_cmnd *SCp, * data associated with the command * here */ NCR_700_unmap(hostdata, SCp, slot); - - SCp->cmnd[0] = REQUEST_SENSE; - SCp->cmnd[1] = (SCp->device->lun & 0x7) << 5; - SCp->cmnd[2] = 0; - SCp->cmnd[3] = 0; - SCp->cmnd[4] = sizeof(SCp->sense_buffer); - SCp->cmnd[5] = 0; - SCp->cmd_len = 6; + dma_unmap_single(hostdata->dev, slot->pCmd, + sizeof(SCp->cmnd), + DMA_TO_DEVICE); + + cmnd[0] = REQUEST_SENSE; + cmnd[1] = (SCp->device->lun & 0x7) << 5; + cmnd[2] = 0; + cmnd[3] = 0; + cmnd[4] = sizeof(SCp->sense_buffer); + cmnd[5] = 0; /* Here's a quiet hack: the * REQUEST_SENSE command is six bytes, * so store a flag indicating that * this was an internal sense request * and the original status at the end * of the command */ - SCp->cmnd[6] = NCR_700_INTERNAL_SENSE_MAGIC; - SCp->cmnd[7] = hostdata->status[0]; - SCp->use_sg = 0; - SCp->sc_data_direction = DMA_FROM_DEVICE; - dma_sync_single_for_device(hostdata->dev, slot->pCmd, - SCp->cmd_len, DMA_TO_DEVICE); - SCp->request_bufflen = sizeof(SCp->sense_buffer); + cmnd[6] = NCR_700_INTERNAL_SENSE_MAGIC; + cmnd[7] = hostdata->status[0]; + slot->pCmd = dma_map_single(hostdata->dev, cmnd, MAX_COMMAND_SIZE, DMA_TO_DEVICE); slot->dma_handle = dma_map_single(hostdata->dev, SCp->sense_buffer, sizeof(SCp->sense_buffer), DMA_FROM_DEVICE); slot->SG[0].ins = bS_to_host(SCRIPT_MOVE_DATA_IN | sizeof(SCp->sense_buffer)); slot->SG[0].pAddr = bS_to_host(slot->dma_handle); @@ -1027,6 +1019,7 @@ process_script_interrupt(__u32 dsps, __u32 dsp, struct scsi_cmnd *SCp, /* queue the command for reissue */ slot->state = NCR_700_SLOT_QUEUED; + slot->flags = NCR_700_FLAG_AUTOSENSE; hostdata->state = NCR_700_HOST_FREE; hostdata->cmd = NULL; } @@ -1247,7 +1240,7 @@ process_script_interrupt(__u32 dsps, __u32 dsp, struct scsi_cmnd *SCp, if(SCp->use_sg) { for(i = 0; i < SCp->use_sg + 1; i++) { - printk(KERN_INFO " SG[%d].length = %d, move_insn=%08x, addr %08x\n", i, ((struct scatterlist *)SCp->buffer)[i].length, ((struct NCR_700_command_slot *)SCp->host_scribble)->SG[i].ins, ((struct NCR_700_command_slot *)SCp->host_scribble)->SG[i].pAddr); + printk(KERN_INFO " SG[%d].length = %d, move_insn=%08x, addr %08x\n", i, ((struct scatterlist *)SCp->request_buffer)[i].length, ((struct NCR_700_command_slot *)SCp->host_scribble)->SG[i].ins, ((struct NCR_700_command_slot *)SCp->host_scribble)->SG[i].pAddr); } } } @@ -1406,12 +1399,14 @@ NCR_700_start_command(struct scsi_cmnd *SCp) /* keep interrupts disabled until we have the command correctly * set up so we cannot take a selection interrupt */ - hostdata->msgout[0] = NCR_700_identify(SCp->cmnd[0] != REQUEST_SENSE, + hostdata->msgout[0] = NCR_700_identify((SCp->cmnd[0] != REQUEST_SENSE && + slot->flags != NCR_700_FLAG_AUTOSENSE), SCp->device->lun); /* for INQUIRY or REQUEST_SENSE commands, we cannot be sure * if the negotiated transfer parameters still hold, so * always renegotiate them */ - if(SCp->cmnd[0] == INQUIRY || SCp->cmnd[0] == REQUEST_SENSE) { + if(SCp->cmnd[0] == INQUIRY || SCp->cmnd[0] == REQUEST_SENSE || + slot->flags == NCR_700_FLAG_AUTOSENSE) { NCR_700_clear_flag(SCp->device, NCR_700_DEV_NEGOTIATED_SYNC); } @@ -1420,7 +1415,8 @@ NCR_700_start_command(struct scsi_cmnd *SCp) * will refuse all tags, so send the request sense as untagged * */ if((hostdata->tag_negotiated & (1<tag != SCSI_NO_TAG && SCp->cmnd[0] != REQUEST_SENSE)) { + && (slot->tag != SCSI_NO_TAG && SCp->cmnd[0] != REQUEST_SENSE && + slot->flags != NCR_700_FLAG_AUTOSENSE)) { count += scsi_populate_tag_msg(SCp, &hostdata->msgout[count]); } @@ -1533,7 +1529,7 @@ NCR_700_intr(int irq, void *dev_id, struct pt_regs *regs) /* clear all the negotiated parameters */ __shost_for_each_device(SDp, host) - SDp->hostdata = NULL; + NCR_700_clear_flag(SDp, ~0); /* clear all the slots and their pending commands */ for(i = 0; i < NCR_700_COMMAND_SLOTS_PER_HOST; i++) { @@ -1866,8 +1862,9 @@ NCR_700_queuecommand(struct scsi_cmnd *SCp, void (*done)(struct scsi_cmnd *)) __u32 count = 0; if(SCp->use_sg) { - sg_count = dma_map_sg(hostdata->dev, SCp->buffer, - SCp->use_sg, direction); + sg_count = dma_map_sg(hostdata->dev, + SCp->request_buffer, SCp->use_sg, + direction); } else { vPtr = dma_map_single(hostdata->dev, SCp->request_buffer, @@ -1882,7 +1879,7 @@ NCR_700_queuecommand(struct scsi_cmnd *SCp, void (*done)(struct scsi_cmnd *)) for(i = 0; i < sg_count; i++) { if(SCp->use_sg) { - struct scatterlist *sg = SCp->buffer; + struct scatterlist *sg = SCp->request_buffer; vPtr = sg_dma_address(&sg[i]); count = sg_dma_len(&sg[i]); @@ -1942,7 +1939,7 @@ NCR_700_abort(struct scsi_cmnd * SCp) STATIC int NCR_700_bus_reset(struct scsi_cmnd * SCp) { - DECLARE_COMPLETION(complete); + DECLARE_COMPLETION_ONSTACK(complete); struct NCR_700_Host_Parameters *hostdata = (struct NCR_700_Host_Parameters *)SCp->device->host->hostdata[0]; @@ -2037,7 +2034,17 @@ NCR_700_set_offset(struct scsi_target *STp, int offset) spi_flags(STp) |= NCR_700_DEV_PRINT_SYNC_NEGOTIATION; } +STATIC int +NCR_700_slave_alloc(struct scsi_device *SDp) +{ + SDp->hostdata = kzalloc(sizeof(struct NCR_700_Device_Parameters), + GFP_KERNEL); + + if (!SDp->hostdata) + return -ENOMEM; + return 0; +} STATIC int NCR_700_slave_configure(struct scsi_device *SDp) @@ -2068,7 +2075,8 @@ NCR_700_slave_configure(struct scsi_device *SDp) STATIC void NCR_700_slave_destroy(struct scsi_device *SDp) { - /* to do here: deallocate memory */ + kfree(SDp->hostdata); + SDp->hostdata = NULL; } static int diff --git a/drivers/scsi/53c700.h b/drivers/scsi/53c700.h index a8c83bb03..97ebe71b7 100644 --- a/drivers/scsi/53c700.h +++ b/drivers/scsi/53c700.h @@ -12,7 +12,7 @@ #include #include - +#include /* Turn on for general debugging---too verbose for normal use */ #undef NCR_700_DEBUG @@ -76,11 +76,16 @@ struct NCR_700_SG_List { #define SCRIPT_RETURN 0x90080000 }; -/* We use device->hostdata to store negotiated parameters. This is - * supposed to be a pointer to a device private area, but we cannot - * really use it as such since it will never be freed, so just use the - * 32 bits to cram the information. The SYNC negotiation sequence looks - * like: +struct NCR_700_Device_Parameters { + /* space for creating a request sense command. Really, except + * for the annoying SCSI-2 requirement for LUN information in + * cmnd[1], this could be in static storage */ + unsigned char cmnd[MAX_COMMAND_SIZE]; + __u8 depth; +}; + + +/* The SYNC negotiation sequence looks like: * * If DEV_NEGOTIATED_SYNC not set, tack and SDTR message on to the * initial identify for the device and set DEV_BEGIN_SYNC_NEGOTATION @@ -98,19 +103,26 @@ struct NCR_700_SG_List { #define NCR_700_DEV_BEGIN_SYNC_NEGOTIATION (1<<17) #define NCR_700_DEV_PRINT_SYNC_NEGOTIATION (1<<19) +static inline char *NCR_700_get_sense_cmnd(struct scsi_device *SDp) +{ + struct NCR_700_Device_Parameters *hostdata = SDp->hostdata; + + return hostdata->cmnd; +} + static inline void NCR_700_set_depth(struct scsi_device *SDp, __u8 depth) { - long l = (long)SDp->hostdata; + struct NCR_700_Device_Parameters *hostdata = SDp->hostdata; - l &= 0xffff00ff; - l |= 0xff00 & (depth << 8); - SDp->hostdata = (void *)l; + hostdata->depth = depth; } static inline __u8 NCR_700_get_depth(struct scsi_device *SDp) { - return ((((unsigned long)SDp->hostdata) & 0xff00)>>8); + struct NCR_700_Device_Parameters *hostdata = SDp->hostdata; + + return hostdata->depth; } static inline int NCR_700_is_flag_set(struct scsi_device *SDp, __u32 flag) @@ -163,6 +175,8 @@ struct NCR_700_command_slot { #define NCR_700_SLOT_BUSY (1|NCR_700_SLOT_MAGIC) /* slot has command active on HA */ #define NCR_700_SLOT_QUEUED (2|NCR_700_SLOT_MAGIC) /* slot has command to be made active on HA */ __u8 state; + #define NCR_700_FLAG_AUTOSENSE 0x01 + __u8 flags; int tag; __u32 resume_offset; struct scsi_cmnd *cmnd; @@ -472,8 +486,7 @@ NCR_700_readl(struct Scsi_Host *host, __u32 reg) ioread32(hostdata->base + reg); #if 1 /* sanity check the register */ - if((reg & 0x3) != 0) - BUG(); + BUG_ON((reg & 0x3) != 0); #endif return value; @@ -496,8 +509,7 @@ NCR_700_writel(__u32 value, struct Scsi_Host *host, __u32 reg) #if 1 /* sanity check the register */ - if((reg & 0x3) != 0) - BUG(); + BUG_ON((reg & 0x3) != 0); #endif bEBus ? iowrite32be(value, hostdata->base + reg): diff --git a/drivers/scsi/53c7xx.c b/drivers/scsi/53c7xx.c index 7894b8ea8..acf292736 100644 --- a/drivers/scsi/53c7xx.c +++ b/drivers/scsi/53c7xx.c @@ -232,7 +232,6 @@ #include -#include #include #include @@ -361,7 +360,7 @@ int CmdPageStart = (0 - Ent_dsa_zero - sizeof(struct NCR53c7x0_cmd)) & 0xff; static char *setup_strings[] = {"","","","","","","",""}; -#define MAX_SETUP_STRINGS (sizeof(setup_strings) / sizeof(char *)) +#define MAX_SETUP_STRINGS ARRAY_SIZE(setup_strings) #define SETUP_BUFFER_SIZE 200 static char setup_buffer[SETUP_BUFFER_SIZE]; static char setup_used[MAX_SETUP_STRINGS]; @@ -709,7 +708,7 @@ request_synchronous (int host, int target) { printk (KERN_ALERT "target %d is host ID\n", target); return -1; } - else if (target > h->max_id) { + else if (target >= h->max_id) { printk (KERN_ALERT "target %d exceeds maximum of %d\n", target, h->max_id); return -1; @@ -1071,7 +1070,7 @@ NCR53c7x0_init (struct Scsi_Host *host) { NCR53c7x0_driver_init (host); - if (request_irq(host->irq, NCR53c7x0_intr, SA_SHIRQ, "53c7xx", host)) + if (request_irq(host->irq, NCR53c7x0_intr, IRQF_SHARED, "53c7xx", host)) { printk("scsi%d : IRQ%d not free, detaching\n", host->host_no, host->irq); @@ -2190,15 +2189,15 @@ static const struct { */ -static void +static void synchronous (struct Scsi_Host *host, int target, char *msg) { struct NCR53c7x0_hostdata *hostdata = (struct NCR53c7x0_hostdata *) host->hostdata[0]; int desire, divisor, i, limit; unsigned char scntl3, sxfer; /* The diagnostic message fits on one line, even with max. width integers */ - char buf[80]; - + char buf[80]; + /* Desired transfer clock in Hz */ desire = 1000000000L / (msg[3] * 4); /* Scale the available SCSI clock by 10 so we get tenths */ @@ -2209,14 +2208,14 @@ synchronous (struct Scsi_Host *host, int target, char *msg) { msg[4] = 8; if (hostdata->options & OPTION_DEBUG_SDTR) - printk("scsi%d : optimal synchronous divisor of %d.%01d\n", + printk("scsi%d : optimal synchronous divisor of %d.%01d\n", host->host_no, divisor / 10, divisor % 10); - limit = (sizeof(syncs) / sizeof(syncs[0]) -1); + limit = ARRAY_SIZE(syncs) - 1; for (i = 0; (i < limit) && (divisor > syncs[i].div); ++i); if (hostdata->options & OPTION_DEBUG_SDTR) - printk("scsi%d : selected synchronous divisor of %d.%01d\n", + printk("scsi%d : selected synchronous divisor of %d.%01d\n", host->host_no, syncs[i].div / 10, syncs[i].div % 10); msg[3] = ((1000000000L / hostdata->scsi_clock) * syncs[i].div / 10 / 4); @@ -3452,12 +3451,12 @@ create_cmd (Scsi_Cmnd *cmd) { for (i = 0; cmd->use_sg ? (i < cmd->use_sg) : !i; cmd_datain += 4, cmd_dataout += 4, ++i) { u32 vbuf = cmd->use_sg - ? (u32)page_address(((struct scatterlist *)cmd->buffer)[i].page)+ - ((struct scatterlist *)cmd->buffer)[i].offset + ? (u32)page_address(((struct scatterlist *)cmd->request_buffer)[i].page)+ + ((struct scatterlist *)cmd->request_buffer)[i].offset : (u32)(cmd->request_buffer); u32 bbuf = virt_to_bus((void *)vbuf); u32 count = cmd->use_sg ? - ((struct scatterlist *)cmd->buffer)[i].length : + ((struct scatterlist *)cmd->request_buffer)[i].length : cmd->request_bufflen; /* @@ -3622,7 +3621,7 @@ NCR53c7xx_queue_command (Scsi_Cmnd *cmd, void (* done)(Scsi_Cmnd *)) { #ifdef LINUX_1_2 || cmd->device->id > 7 #else - || cmd->device->id > host->max_id + || cmd->device->id >= host->max_id #endif || cmd->device->id == host->this_id || hostdata->state == STATE_DISABLED) { @@ -4233,7 +4232,7 @@ restart: * Purpose : handle NCR53c7x0 interrupts for all NCR devices sharing * the same IRQ line. * - * Inputs : Since we're using the SA_INTERRUPT interrupt handler + * Inputs : Since we're using the IRQF_DISABLED interrupt handler * semantics, irq indicates the interrupt which invoked * this handler. * @@ -5418,7 +5417,7 @@ insn_to_offset (Scsi_Cmnd *cmd, u32 *insn) { if ((buffers = cmd->use_sg)) { for (offset = 0, - segment = (struct scatterlist *) cmd->buffer; + segment = (struct scatterlist *) cmd->request_buffer; buffers && !((found = ((ptr >= (char *)page_address(segment->page)+segment->offset) && (ptr < ((char *)page_address(segment->page)+segment->offset+segment->length))))); --buffers, offset += segment->length, ++segment) diff --git a/drivers/scsi/BusLogic.c b/drivers/scsi/BusLogic.c index bde3d5834..16a12a3b7 100644 --- a/drivers/scsi/BusLogic.c +++ b/drivers/scsi/BusLogic.c @@ -29,7 +29,6 @@ #define BusLogic_DriverVersion "2.1.16" #define BusLogic_DriverDate "18 July 2002" -#include #include #include #include @@ -1845,7 +1844,7 @@ static boolean __init BusLogic_AcquireResources(struct BusLogic_HostAdapter *Hos /* Acquire shared access to the IRQ Channel. */ - if (request_irq(HostAdapter->IRQ_Channel, BusLogic_InterruptHandler, SA_SHIRQ, HostAdapter->FullModelName, HostAdapter) < 0) { + if (request_irq(HostAdapter->IRQ_Channel, BusLogic_InterruptHandler, IRQF_SHARED, HostAdapter->FullModelName, HostAdapter) < 0) { BusLogic_Error("UNABLE TO ACQUIRE IRQ CHANNEL %d - DETACHING\n", HostAdapter, HostAdapter->IRQ_Channel); return false; } diff --git a/drivers/scsi/BusLogic.h b/drivers/scsi/BusLogic.h index 1aaa6569e..9792e5af5 100644 --- a/drivers/scsi/BusLogic.h +++ b/drivers/scsi/BusLogic.h @@ -28,7 +28,6 @@ #ifndef _BUSLOGIC_H #define _BUSLOGIC_H -#include #ifndef PACKED #define PACKED __attribute__((packed)) diff --git a/drivers/scsi/FlashPoint.c b/drivers/scsi/FlashPoint.c index 8e3d949b7..7c0068049 100644 --- a/drivers/scsi/FlashPoint.c +++ b/drivers/scsi/FlashPoint.c @@ -15,7 +15,6 @@ */ -#include #ifndef CONFIG_SCSI_OMIT_FLASHPOINT diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig index a480a3742..96a81cd17 100644 --- a/drivers/scsi/Kconfig +++ b/drivers/scsi/Kconfig @@ -501,7 +501,7 @@ config SCSI_ATA_PIIX tristate "Intel PIIX/ICH SATA support" depends on SCSI_SATA && PCI help - This option enables support for ICH5 Serial ATA. + This option enables support for ICH5/6/7/8 Serial ATA. If PATA support was enabled previously, this enables support for select Intel PIIX/ICH PATA host controllers. @@ -532,6 +532,16 @@ config SCSI_PDC_ADMA If unsure, say N. +config SCSI_HPTIOP + tristate "HighPoint RocketRAID 3xxx Controller support" + depends on SCSI && PCI + help + This option enables support for HighPoint RocketRAID 3xxx + controllers. + + To compile this driver as a module, choose M here; the module + will be called hptiop. If unsure, say N. + config SCSI_SATA_QSTOR tristate "Pacific Digital SATA QStor support" depends on SCSI_SATA && PCI @@ -1159,7 +1169,7 @@ config SCSI_NCR_Q720 you do not have this SCSI card, so say N. config SCSI_NCR53C8XX_DEFAULT_TAGS - int " default tagged command queue depth" + int "default tagged command queue depth" depends on SCSI_ZALON || SCSI_NCR_Q720 default "8" ---help--- @@ -1185,7 +1195,7 @@ config SCSI_NCR53C8XX_DEFAULT_TAGS There is no safe option other than using good SCSI devices. config SCSI_NCR53C8XX_MAX_TAGS - int " maximum number of queued commands" + int "maximum number of queued commands" depends on SCSI_ZALON || SCSI_NCR_Q720 default "32" ---help--- @@ -1202,7 +1212,7 @@ config SCSI_NCR53C8XX_MAX_TAGS There is no safe option and the default answer is recommended. config SCSI_NCR53C8XX_SYNC - int " synchronous transfers frequency in MHz" + int "synchronous transfers frequency in MHz" depends on SCSI_ZALON || SCSI_NCR_Q720 default "20" ---help--- @@ -1236,7 +1246,7 @@ config SCSI_NCR53C8XX_SYNC terminations and SCSI conformant devices. config SCSI_NCR53C8XX_PROFILE - bool " enable profiling" + bool "enable profiling" depends on SCSI_ZALON || SCSI_NCR_Q720 help This option allows you to enable profiling information gathering. @@ -1247,7 +1257,7 @@ config SCSI_NCR53C8XX_PROFILE The normal answer therefore is N. config SCSI_NCR53C8XX_NO_DISCONNECT - bool " not allow targets to disconnect" + bool "not allow targets to disconnect" depends on (SCSI_ZALON || SCSI_NCR_Q720) && SCSI_NCR53C8XX_DEFAULT_TAGS=0 help This option is only provided for safety if you suspect some SCSI diff --git a/drivers/scsi/Makefile b/drivers/scsi/Makefile index 81803a16f..ebd0cf00b 100644 --- a/drivers/scsi/Makefile +++ b/drivers/scsi/Makefile @@ -33,7 +33,8 @@ obj-$(CONFIG_SCSI_FC_ATTRS) += scsi_transport_fc.o obj-$(CONFIG_SCSI_ISCSI_ATTRS) += scsi_transport_iscsi.o obj-$(CONFIG_SCSI_SAS_ATTRS) += scsi_transport_sas.o -obj-$(CONFIG_ISCSI_TCP) += iscsi_tcp.o +obj-$(CONFIG_ISCSI_TCP) += libiscsi.o iscsi_tcp.o +obj-$(CONFIG_INFINIBAND_ISER) += libiscsi.o obj-$(CONFIG_SCSI_AMIGA7XX) += amiga7xx.o 53c7xx.o obj-$(CONFIG_A3000_SCSI) += a3000.o wd33c93.o obj-$(CONFIG_A2091_SCSI) += a2091.o wd33c93.o @@ -136,6 +137,7 @@ obj-$(CONFIG_SCSI_SATA_NV) += libata.o sata_nv.o obj-$(CONFIG_SCSI_SATA_ULI) += libata.o sata_uli.o obj-$(CONFIG_SCSI_SATA_MV) += libata.o sata_mv.o obj-$(CONFIG_SCSI_PDC_ADMA) += libata.o pdc_adma.o +obj-$(CONFIG_SCSI_HPTIOP) += hptiop.o obj-$(CONFIG_ARM) += arm/ @@ -164,7 +166,7 @@ ncr53c8xx-flags-$(CONFIG_SCSI_ZALON) \ CFLAGS_ncr53c8xx.o := $(ncr53c8xx-flags-y) $(ncr53c8xx-flags-m) zalon7xx-objs := zalon.o ncr53c8xx.o NCR_Q720_mod-objs := NCR_Q720.o ncr53c8xx.o -libata-objs := libata-core.o libata-scsi.o libata-bmdma.o +libata-objs := libata-core.o libata-scsi.o libata-bmdma.o libata-eh.o oktagon_esp_mod-objs := oktagon_esp.o oktagon_io.o # Files generated that shall be removed upon make clean diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c index 9f0ddbe6d..616810ad1 100644 --- a/drivers/scsi/NCR5380.c +++ b/drivers/scsi/NCR5380.c @@ -296,7 +296,7 @@ static __inline__ void initialize_SCp(Scsi_Cmnd * cmd) */ if (cmd->use_sg) { - cmd->SCp.buffer = (struct scatterlist *) cmd->buffer; + cmd->SCp.buffer = (struct scatterlist *) cmd->request_buffer; cmd->SCp.buffers_residual = cmd->use_sg - 1; cmd->SCp.ptr = page_address(cmd->SCp.buffer->page)+ cmd->SCp.buffer->offset; @@ -500,7 +500,7 @@ static void NCR5380_print_phase(struct Scsi_Host *instance) /* * Function : int should_disconnect (unsigned char cmd) * - * Purpose : decide weather a command would normally disconnect or + * Purpose : decide whether a command would normally disconnect or * not, since if it won't disconnect we should go to sleep. * * Input : cmd - opcode of SCSI command @@ -585,7 +585,7 @@ static int __init NCR5380_probe_irq(struct Scsi_Host *instance, int possible) NCR5380_setup(instance); for (trying_irqs = i = 0, mask = 1; i < 16; ++i, mask <<= 1) - if ((mask & possible) && (request_irq(i, &probe_intr, SA_INTERRUPT, "NCR-probe", NULL) == 0)) + if ((mask & possible) && (request_irq(i, &probe_intr, IRQF_DISABLED, "NCR-probe", NULL) == 0)) trying_irqs |= mask; timeout = jiffies + (250 * HZ / 1000); diff --git a/drivers/scsi/NCR53C9x.c b/drivers/scsi/NCR53C9x.c index c7dd0154d..bdc6bb262 100644 --- a/drivers/scsi/NCR53C9x.c +++ b/drivers/scsi/NCR53C9x.c @@ -23,7 +23,6 @@ #include -#include #include #include #include @@ -912,7 +911,7 @@ static void esp_get_dmabufs(struct NCR_ESP *esp, Scsi_Cmnd *sp) sp->SCp.ptr = (char *) virt_to_phys(sp->request_buffer); } else { - sp->SCp.buffer = (struct scatterlist *) sp->buffer; + sp->SCp.buffer = (struct scatterlist *) sp->request_buffer; sp->SCp.buffers_residual = sp->use_sg - 1; sp->SCp.this_residual = sp->SCp.buffer->length; if (esp->dma_mmu_get_scsi_sgl) @@ -2153,29 +2152,23 @@ static int esp_do_data_finale(struct NCR_ESP *esp, */ static int esp_should_clear_sync(Scsi_Cmnd *sp) { - unchar cmd1 = sp->cmnd[0]; - unchar cmd2 = sp->data_cmnd[0]; + unchar cmd = sp->cmnd[0]; /* These cases are for spinning up a disk and * waiting for that spinup to complete. */ - if(cmd1 == START_STOP || - cmd2 == START_STOP) + if(cmd == START_STOP) return 0; - if(cmd1 == TEST_UNIT_READY || - cmd2 == TEST_UNIT_READY) + if(cmd == TEST_UNIT_READY) return 0; /* One more special case for SCSI tape drives, * this is what is used to probe the device for * completion of a rewind or tape load operation. */ - if(sp->device->type == TYPE_TAPE) { - if(cmd1 == MODE_SENSE || - cmd2 == MODE_SENSE) - return 0; - } + if(sp->device->type == TYPE_TAPE && cmd == MODE_SENSE) + return 0; return 1; } diff --git a/drivers/scsi/NCR53C9x.h b/drivers/scsi/NCR53C9x.h index 65a9b377a..481653c97 100644 --- a/drivers/scsi/NCR53C9x.h +++ b/drivers/scsi/NCR53C9x.h @@ -13,7 +13,6 @@ #ifndef NCR53C9X_H #define NCR53C9X_H -#include #include /* djweis for mac driver */ diff --git a/drivers/scsi/NCR53c406a.c b/drivers/scsi/NCR53c406a.c index ae37d3ab9..8472c5359 100644 --- a/drivers/scsi/NCR53c406a.c +++ b/drivers/scsi/NCR53c406a.c @@ -213,16 +213,16 @@ static void *addresses[] = { (void *) 0xd8000, (void *) 0xc8000 }; -#define ADDRESS_COUNT (sizeof( addresses ) / sizeof( unsigned )) +#define ADDRESS_COUNT ARRAY_SIZE(addresses) #endif /* USE_BIOS */ /* possible i/o port addresses */ static unsigned short ports[] = { 0x230, 0x330, 0x280, 0x290, 0x330, 0x340, 0x300, 0x310, 0x348, 0x350 }; -#define PORT_COUNT (sizeof( ports ) / sizeof( unsigned short )) +#define PORT_COUNT ARRAY_SIZE(ports) /* possible interrupt channels */ static unsigned short intrs[] = { 10, 11, 12, 15 }; -#define INTR_COUNT (sizeof( intrs ) / sizeof( unsigned short )) +#define INTR_COUNT ARRAY_SIZE(intrs) /* signatures for NCR 53c406a based controllers */ #if USE_BIOS @@ -236,7 +236,7 @@ struct signature { { "Copyright (C) Acculogic, Inc.\r\n2.8M Diskette Extension Bios ver 4.04.03 03/01/1993", 61, 82},}; -#define SIGNATURE_COUNT (sizeof( signatures ) / sizeof( struct signature )) +#define SIGNATURE_COUNT ARRAY_SIZE(signatures) #endif /* USE_BIOS */ /* ============================================================ */ diff --git a/drivers/scsi/NCR_D700.c b/drivers/scsi/NCR_D700.c index 577e63499..d05681f9d 100644 --- a/drivers/scsi/NCR_D700.c +++ b/drivers/scsi/NCR_D700.c @@ -114,7 +114,7 @@ MODULE_DESCRIPTION("NCR Dual700 SCSI Driver"); MODULE_LICENSE("GPL"); module_param(NCR_D700, charp, 0); -static __u8 __initdata id_array[2*(MCA_MAX_SLOT_NR + 1)] = +static __u8 __devinitdata id_array[2*(MCA_MAX_SLOT_NR + 1)] = { [0 ... 2*(MCA_MAX_SLOT_NR + 1)-1] = 7 }; #ifdef MODULE @@ -173,7 +173,7 @@ struct NCR_D700_private { char pad; }; -static int +static int __devinit NCR_D700_probe_one(struct NCR_D700_private *p, int siop, int irq, int slot, u32 region, int differential) { @@ -243,7 +243,7 @@ NCR_D700_intr(int irq, void *data, struct pt_regs *regs) * essentially connectecd to the MCA bus independently, it is easier * to set them up as two separate host adapters, rather than one * adapter with two channels */ -static int +static int __devinit NCR_D700_probe(struct device *dev) { struct NCR_D700_private *p; @@ -320,7 +320,7 @@ NCR_D700_probe(struct device *dev) memset(p, '\0', sizeof(*p)); p->dev = dev; snprintf(p->name, sizeof(p->name), "D700(%s)", dev->bus_id); - if (request_irq(irq, NCR_D700_intr, SA_SHIRQ, p->name, p)) { + if (request_irq(irq, NCR_D700_intr, IRQF_SHARED, p->name, p)) { printk(KERN_ERR "D700: request_irq failed\n"); kfree(p); return -EBUSY; @@ -329,7 +329,7 @@ NCR_D700_probe(struct device *dev) for (i = 0; i < 2; i++) { int err; - if ((err = NCR_D700_probe_one(p, i, slot, irq, + if ((err = NCR_D700_probe_one(p, i, irq, slot, offset_addr + (0x80 * i), differential)) != 0) printk("D700: SIOP%d: probe failed, error = %d\n", @@ -349,7 +349,7 @@ NCR_D700_probe(struct device *dev) return 0; } -static void +static void __devexit NCR_D700_remove_one(struct Scsi_Host *host) { scsi_remove_host(host); @@ -359,7 +359,7 @@ NCR_D700_remove_one(struct Scsi_Host *host) release_region(host->base, 64); } -static int +static int __devexit NCR_D700_remove(struct device *dev) { struct NCR_D700_private *p = dev_get_drvdata(dev); @@ -380,7 +380,7 @@ static struct mca_driver NCR_D700_driver = { .name = "NCR_D700", .bus = &mca_bus_type, .probe = NCR_D700_probe, - .remove = NCR_D700_remove, + .remove = __devexit_p(NCR_D700_remove), }, }; diff --git a/drivers/scsi/NCR_Q720.c b/drivers/scsi/NCR_Q720.c index 9d18ec905..c39ffbb86 100644 --- a/drivers/scsi/NCR_Q720.c +++ b/drivers/scsi/NCR_Q720.c @@ -265,7 +265,7 @@ NCR_Q720_probe(struct device *dev) p->irq = irq; p->siops = siops; - if (request_irq(irq, NCR_Q720_intr, SA_SHIRQ, "NCR_Q720", p)) { + if (request_irq(irq, NCR_Q720_intr, IRQF_SHARED, "NCR_Q720", p)) { printk(KERN_ERR "NCR_Q720: request irq %d failed\n", irq); goto out_release; } diff --git a/drivers/scsi/a100u2w.c b/drivers/scsi/a100u2w.c index 3dce21c78..d7e9fab54 100644 --- a/drivers/scsi/a100u2w.c +++ b/drivers/scsi/a100u2w.c @@ -1120,7 +1120,7 @@ static int __devinit inia100_probe_one(struct pci_dev *pdev, shost->sg_tablesize = TOTAL_SG_ENTRY; /* Initial orc chip */ - error = request_irq(pdev->irq, inia100_intr, SA_SHIRQ, + error = request_irq(pdev->irq, inia100_intr, IRQF_SHARED, "inia100", shost); if (error < 0) { printk(KERN_WARNING "inia100: unable to get irq %d\n", diff --git a/drivers/scsi/a2091.c b/drivers/scsi/a2091.c index 54996eaae..fddfa2ebc 100644 --- a/drivers/scsi/a2091.c +++ b/drivers/scsi/a2091.c @@ -208,7 +208,7 @@ int __init a2091_detect(struct scsi_host_template *tpnt) regs.SASR = &(DMA(instance)->SASR); regs.SCMD = &(DMA(instance)->SCMD); wd33c93_init(instance, regs, dma_setup, dma_stop, WD33C93_FS_8_10); - request_irq(IRQ_AMIGA_PORTS, a2091_intr, SA_SHIRQ, "A2091 SCSI", + request_irq(IRQ_AMIGA_PORTS, a2091_intr, IRQF_SHARED, "A2091 SCSI", instance); DMA(instance)->CNTR = CNTR_PDMD | CNTR_INTEN; num_a2091++; diff --git a/drivers/scsi/a3000.c b/drivers/scsi/a3000.c index f425d424b..ae9ab4b13 100644 --- a/drivers/scsi/a3000.c +++ b/drivers/scsi/a3000.c @@ -190,7 +190,7 @@ int __init a3000_detect(struct scsi_host_template *tpnt) regs.SASR = &(DMA(a3000_host)->SASR); regs.SCMD = &(DMA(a3000_host)->SCMD); wd33c93_init(a3000_host, regs, dma_setup, dma_stop, WD33C93_FS_12_15); - if (request_irq(IRQ_AMIGA_PORTS, a3000_intr, SA_SHIRQ, "A3000 SCSI", + if (request_irq(IRQ_AMIGA_PORTS, a3000_intr, IRQF_SHARED, "A3000 SCSI", a3000_intr)) goto fail_irq; DMA(a3000_host)->CNTR = CNTR_PDMD | CNTR_INTEN; diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c index 642a3b4e5..83b5c7d08 100644 --- a/drivers/scsi/aacraid/aachba.c +++ b/drivers/scsi/aacraid/aachba.c @@ -148,6 +148,8 @@ static int nondasd = -1; static int dacmode = -1; static int commit = -1; +int startup_timeout = 180; +int aif_timeout = 120; module_param(nondasd, int, S_IRUGO|S_IWUSR); MODULE_PARM_DESC(nondasd, "Control scanning of hba for nondasd devices. 0=off, 1=on"); @@ -155,6 +157,10 @@ module_param(dacmode, int, S_IRUGO|S_IWUSR); MODULE_PARM_DESC(dacmode, "Control whether dma addressing is using 64 bit DAC. 0=off, 1=on"); module_param(commit, int, S_IRUGO|S_IWUSR); MODULE_PARM_DESC(commit, "Control whether a COMMIT_CONFIG is issued to the adapter for foreign arrays.\nThis is typically needed in systems that do not have a BIOS. 0=off, 1=on"); +module_param(startup_timeout, int, S_IRUGO|S_IWUSR); +MODULE_PARM_DESC(startup_timeout, "The duration of time in seconds to wait for adapter to have it's kernel up and\nrunning. This is typically adjusted for large systems that do not have a BIOS."); +module_param(aif_timeout, int, S_IRUGO|S_IWUSR); +MODULE_PARM_DESC(aif_timeout, "The duration of time in seconds to wait for applications to pick up AIFs before\nderegistering them. This is typically adjusted for heavily burdened systems."); int numacb = -1; module_param(numacb, int, S_IRUGO|S_IWUSR); @@ -390,8 +396,7 @@ static void get_container_name_callback(void *context, struct fib * fibptr) scsicmd->SCp.phase = AAC_OWNER_MIDLEVEL; dprintk((KERN_DEBUG "get_container_name_callback[cpu %d]: t = %ld.\n", smp_processor_id(), jiffies)); - if (fibptr == NULL) - BUG(); + BUG_ON(fibptr == NULL); get_name_reply = (struct aac_get_name_resp *) fib_data(fibptr); /* Failure is irrelevant, using default value instead */ @@ -635,13 +640,13 @@ static void setinqstr(struct aac_dev *dev, void *data, int tindex) cp[sizeof(str->pid)] = c; } else { struct aac_driver_ident *mp = aac_get_driver_ident(dev->cardtype); - - inqstrcpy (mp->vname, str->vid); + + inqstrcpy (mp->vname, str->vid); /* last six chars reserved for vol type */ inqstrcpy (mp->model, str->pid); } - if (tindex < (sizeof(container_types)/sizeof(char *))){ + if (tindex < ARRAY_SIZE(container_types)){ char *findit = str->pid; for ( ; *findit != ' '; findit++); /* walk till we find a space */ @@ -950,12 +955,11 @@ static void io_callback(void *context, struct fib * fibptr) smp_processor_id(), (unsigned long long)lba, jiffies); } - if (fibptr == NULL) - BUG(); + BUG_ON(fibptr == NULL); if(scsicmd->use_sg) pci_unmap_sg(dev->pdev, - (struct scatterlist *)scsicmd->buffer, + (struct scatterlist *)scsicmd->request_buffer, scsicmd->use_sg, scsicmd->sc_data_direction); else if(scsicmd->request_bufflen) @@ -1086,8 +1090,7 @@ static int aac_read(struct scsi_cmnd * scsicmd, int cid) aac_build_sgraw(scsicmd, &readcmd->sg); fibsize = sizeof(struct aac_raw_io) + ((le32_to_cpu(readcmd->sg.count) - 1) * sizeof (struct sgentryraw)); - if (fibsize > (dev->max_fib_size - sizeof(struct aac_fibhdr))) - BUG(); + BUG_ON(fibsize > (dev->max_fib_size - sizeof(struct aac_fibhdr))); /* * Now send the Fib to the adapter */ @@ -1255,8 +1258,7 @@ static int aac_write(struct scsi_cmnd * scsicmd, int cid) aac_build_sgraw(scsicmd, &writecmd->sg); fibsize = sizeof(struct aac_raw_io) + ((le32_to_cpu(writecmd->sg.count) - 1) * sizeof (struct sgentryraw)); - if (fibsize > (dev->max_fib_size - sizeof(struct aac_fibhdr))) - BUG(); + BUG_ON(fibsize > (dev->max_fib_size - sizeof(struct aac_fibhdr))); /* * Now send the Fib to the adapter */ @@ -1570,7 +1572,7 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd) * see: .c i.e. aac.c */ if (scmd_id(scsicmd) == host->this_id) { - setinqstr(dev, (void *) (inq_data.inqd_vid), (sizeof(container_types)/sizeof(char *))); + setinqstr(dev, (void *) (inq_data.inqd_vid), ARRAY_SIZE(container_types)); inq_data.inqd_pdt = INQD_PDT_PROC; /* Processor device */ aac_internal_transfer(scsicmd, &inq_data, 0, sizeof(inq_data)); scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD; @@ -1898,8 +1900,7 @@ static void aac_srb_callback(void *context, struct fib * fibptr) scsicmd->SCp.phase = AAC_OWNER_MIDLEVEL; dev = (struct aac_dev *)scsicmd->device->host->hostdata; - if (fibptr == NULL) - BUG(); + BUG_ON(fibptr == NULL); srbreply = (struct aac_srb_reply *) fib_data(fibptr); @@ -1913,7 +1914,7 @@ static void aac_srb_callback(void *context, struct fib * fibptr) if(scsicmd->use_sg) pci_unmap_sg(dev->pdev, - (struct scatterlist *)scsicmd->buffer, + (struct scatterlist *)scsicmd->request_buffer, scsicmd->use_sg, scsicmd->sc_data_direction); else if(scsicmd->request_bufflen) @@ -2218,15 +2219,15 @@ static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg) } } else if(scsicmd->request_bufflen) { - dma_addr_t addr; - addr = pci_map_single(dev->pdev, + u32 addr; + scsicmd->SCp.dma_handle = pci_map_single(dev->pdev, scsicmd->request_buffer, scsicmd->request_bufflen, scsicmd->sc_data_direction); + addr = scsicmd->SCp.dma_handle; psg->count = cpu_to_le32(1); psg->sg[0].addr = cpu_to_le32(addr); psg->sg[0].count = cpu_to_le32(scsicmd->request_bufflen); - scsicmd->SCp.dma_handle = addr; byte_count = scsicmd->request_bufflen; } return byte_count; @@ -2375,7 +2376,7 @@ static struct aac_srb_status_info srb_status_info[] = { { SRB_STATUS_SUCCESS, "Success"}, { SRB_STATUS_ABORTED, "Aborted Command"}, { SRB_STATUS_ABORT_FAILED, "Abort Failed"}, - { SRB_STATUS_ERROR, "Error Event"}, + { SRB_STATUS_ERROR, "Error Event"}, { SRB_STATUS_BUSY, "Device Busy"}, { SRB_STATUS_INVALID_REQUEST, "Invalid Request"}, { SRB_STATUS_INVALID_PATH_ID, "Invalid Path ID"}, @@ -2394,7 +2395,7 @@ static struct aac_srb_status_info srb_status_info[] = { { SRB_STATUS_BAD_SRB_BLOCK_LENGTH,"Bad Srb Block Length"}, { SRB_STATUS_REQUEST_FLUSHED, "Request Flushed"}, { SRB_STATUS_DELAYED_RETRY, "Delayed Retry"}, - { SRB_STATUS_INVALID_LUN, "Invalid LUN"}, + { SRB_STATUS_INVALID_LUN, "Invalid LUN"}, { SRB_STATUS_INVALID_TARGET_ID, "Invalid TARGET ID"}, { SRB_STATUS_BAD_FUNCTION, "Bad Function"}, { SRB_STATUS_ERROR_RECOVERY, "Error Recovery"}, @@ -2409,11 +2410,9 @@ char *aac_get_status_string(u32 status) { int i; - for(i=0; i < (sizeof(srb_status_info)/sizeof(struct aac_srb_status_info)); i++ ){ - if(srb_status_info[i].status == status){ + for (i = 0; i < ARRAY_SIZE(srb_status_info); i++) + if (srb_status_info[i].status == status) return srb_status_info[i].str; - } - } return "Bad Status Code"; } diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h index f773b0dcf..d0eecd4be 100644 --- a/drivers/scsi/aacraid/aacraid.h +++ b/drivers/scsi/aacraid/aacraid.h @@ -12,7 +12,7 @@ #ifndef AAC_DRIVER_BUILD # define AAC_DRIVER_BUILD 2409 -# define AAC_DRIVER_BRANCH "-mh1" +# define AAC_DRIVER_BRANCH "-mh2" #endif #define MAXIMUM_NUM_CONTAINERS 32 @@ -563,7 +563,6 @@ struct aac_queue { spinlock_t lockdata; /* Actual lock (used only on one side of the lock) */ struct list_head cmdq; /* A queue of FIBs which need to be prcessed by the FS thread. This is */ /* only valid for command queues which receive entries from the adapter. */ - struct list_head pendingq; /* A queue of outstanding fib's to the adapter. */ u32 numpending; /* Number of entries on outstanding queue. */ struct aac_dev * dev; /* Back pointer to adapter structure */ }; @@ -822,11 +821,6 @@ struct fib { fib_callback callback; void *callback_data; u32 flags; // u32 dmb was ulong - /* - * The following is used to put this fib context onto the - * Outstanding I/O queue. - */ - struct list_head queue; /* * And for the internal issue/reply queues (we may be able * to merge these two) @@ -1815,3 +1809,5 @@ int aac_probe_container(struct aac_dev *dev, int cid); extern int numacb; extern int acbsize; extern char aac_driver_version[]; +extern int startup_timeout; +extern int aif_timeout; diff --git a/drivers/scsi/aacraid/commctrl.c b/drivers/scsi/aacraid/commctrl.c index 9f75144e5..255421de9 100644 --- a/drivers/scsi/aacraid/commctrl.c +++ b/drivers/scsi/aacraid/commctrl.c @@ -535,7 +535,7 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg) default: data_dir = DMA_NONE; } - if (user_srbcmd->sg.count > (sizeof(sg_list)/sizeof(sg_list[0]))) { + if (user_srbcmd->sg.count > ARRAY_SIZE(sg_list)) { dprintk((KERN_DEBUG"aacraid: too many sg entries %d\n", le32_to_cpu(srbcmd->sg.count))); rcode = -EINVAL; diff --git a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c index 19397453b..1cd3584ba 100644 --- a/drivers/scsi/aacraid/comminit.c +++ b/drivers/scsi/aacraid/comminit.c @@ -92,28 +92,7 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co init->AdapterFibsPhysicalAddress = cpu_to_le32((u32)phys); init->AdapterFibsSize = cpu_to_le32(fibsize); init->AdapterFibAlign = cpu_to_le32(sizeof(struct hw_fib)); - /* - * number of 4k pages of host physical memory. The aacraid fw needs - * this number to be less than 4gb worth of pages. num_physpages is in - * system page units. New firmware doesn't have any issues with the - * mapping system, but older Firmware did, and had *troubles* dealing - * with the math overloading past 32 bits, thus we must limit this - * field. - * - * This assumes the memory is mapped zero->n, which isnt - * always true on real computers. It also has some slight problems - * with the GART on x86-64. I've btw never tried DMA from PCI space - * on this platform but don't be suprised if its problematic. - */ -#ifndef CONFIG_GART_IOMMU - if ((num_physpages << (PAGE_SHIFT - 12)) <= AAC_MAX_HOSTPHYSMEMPAGES) { - init->HostPhysMemPages = - cpu_to_le32(num_physpages << (PAGE_SHIFT-12)); - } else -#endif - { - init->HostPhysMemPages = cpu_to_le32(AAC_MAX_HOSTPHYSMEMPAGES); - } + init->HostPhysMemPages = cpu_to_le32(AAC_MAX_HOSTPHYSMEMPAGES); init->InitFlags = 0; if (dev->new_comm_interface) { @@ -159,7 +138,6 @@ static void aac_queue_init(struct aac_dev * dev, struct aac_queue * q, u32 *mem, { q->numpending = 0; q->dev = dev; - INIT_LIST_HEAD(&q->pendingq); init_waitqueue_head(&q->cmdready); INIT_LIST_HEAD(&q->cmdq); init_waitqueue_head(&q->qfull); diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c index 9f9f4aae2..3f27419c6 100644 --- a/drivers/scsi/aacraid/commsup.c +++ b/drivers/scsi/aacraid/commsup.c @@ -229,8 +229,7 @@ void aac_fib_init(struct fib *fibptr) static void fib_dealloc(struct fib * fibptr) { struct hw_fib *hw_fib = fibptr->hw_fib; - if(hw_fib->header.StructType != FIB_MAGIC) - BUG(); + BUG_ON(hw_fib->header.StructType != FIB_MAGIC); hw_fib->header.XferState = 0; } @@ -472,7 +471,6 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size, spin_lock_irqsave(q->lock, qflags); if (dev->new_comm_interface) { unsigned long count = 10000000L; /* 50 seconds */ - list_add_tail(&fibptr->queue, &q->pendingq); q->numpending++; spin_unlock_irqrestore(q->lock, qflags); while (aac_adapter_send(fibptr) != 0) { @@ -481,7 +479,6 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size, spin_unlock_irqrestore(&fibptr->event_lock, flags); spin_lock_irqsave(q->lock, qflags); q->numpending--; - list_del(&fibptr->queue); spin_unlock_irqrestore(q->lock, qflags); return -ETIMEDOUT; } @@ -492,7 +489,6 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size, unsigned long nointr = 0; aac_queue_get( dev, &index, AdapNormCmdQueue, hw_fib, 1, fibptr, &nointr); - list_add_tail(&fibptr->queue, &q->pendingq); q->numpending++; *(q->headers.producer) = cpu_to_le32(index + 1); spin_unlock_irqrestore(q->lock, qflags); @@ -520,7 +516,6 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size, if (--count == 0) { spin_lock_irqsave(q->lock, qflags); q->numpending--; - list_del(&fibptr->queue); spin_unlock_irqrestore(q->lock, qflags); if (wait == -1) { printk(KERN_ERR "aacraid: aac_fib_send: first asynchronous command timed out.\n" @@ -534,8 +529,7 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size, } } else down(&fibptr->event_wait); - if(fibptr->done == 0) - BUG(); + BUG_ON(fibptr->done == 0); if((fibptr->flags & FIB_CONTEXT_FLAG_TIMED_OUT)){ return -ETIMEDOUT; @@ -1214,7 +1208,7 @@ int aac_command_thread(void *data) * since the last read off * the queue? */ - if ((time_now - time_last) > 120) { + if ((time_now - time_last) > aif_timeout) { entry = entry->next; aac_close_fib_context(dev, fibctx); continue; diff --git a/drivers/scsi/aacraid/dpcsup.c b/drivers/scsi/aacraid/dpcsup.c index f6bcb9486..b2a5c7262 100644 --- a/drivers/scsi/aacraid/dpcsup.c +++ b/drivers/scsi/aacraid/dpcsup.c @@ -85,10 +85,9 @@ unsigned int aac_response_normal(struct aac_queue * q) * continue. The caller has already been notified that * the fib timed out. */ - if (!(fib->flags & FIB_CONTEXT_FLAG_TIMED_OUT)) { - list_del(&fib->queue); + if (!(fib->flags & FIB_CONTEXT_FLAG_TIMED_OUT)) dev->queues->queue[AdapNormCmdQueue].numpending--; - } else { + else { printk(KERN_WARNING "aacraid: FIB timeout (%x).\n", fib->flags); printk(KERN_DEBUG"aacraid: hwfib=%p fib index=%i fib=%p\n",hwfib, hwfib->header.SenderData,fib); continue; @@ -284,7 +283,6 @@ unsigned int aac_intr_normal(struct aac_dev * dev, u32 Index) return 0; } - list_del(&fib->queue); dev->queues->queue[AdapNormCmdQueue].numpending--; if (fast) { diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c index 6ef89c99d..e42a479ce 100644 --- a/drivers/scsi/aacraid/linit.c +++ b/drivers/scsi/aacraid/linit.c @@ -119,7 +119,7 @@ static struct pci_device_id aac_pci_tbl[] = { { 0x9005, 0x0286, 0x9005, 0x029f, 0, 0, 26 }, /* ICP9014R0 (Lancer) */ { 0x9005, 0x0286, 0x9005, 0x02a0, 0, 0, 27 }, /* ICP9047MA (Lancer) */ { 0x9005, 0x0286, 0x9005, 0x02a1, 0, 0, 28 }, /* ICP9087MA (Lancer) */ - { 0x9005, 0x0286, 0x9005, 0x02a3, 0, 0, 29 }, /* ICP5085AU (Hurricane) */ + { 0x9005, 0x0286, 0x9005, 0x02a3, 0, 0, 29 }, /* ICP5445AU (Hurricane44) */ { 0x9005, 0x0285, 0x9005, 0x02a4, 0, 0, 30 }, /* ICP9085LI (Marauder-X) */ { 0x9005, 0x0285, 0x9005, 0x02a5, 0, 0, 31 }, /* ICP5085BR (Marauder-E) */ { 0x9005, 0x0286, 0x9005, 0x02a6, 0, 0, 32 }, /* ICP9067MA (Intruder-6) */ @@ -143,7 +143,7 @@ static struct pci_device_id aac_pci_tbl[] = { { 0x9005, 0x0285, 0x9005, 0x0298, 0, 0, 48 }, /* ASR-4000SAS (BlackBird) */ { 0x9005, 0x0285, 0x9005, 0x0299, 0, 0, 49 }, /* ASR-4800SAS (Marauder-X) */ { 0x9005, 0x0285, 0x9005, 0x029a, 0, 0, 50 }, /* ASR-4805SAS (Marauder-E) */ - { 0x9005, 0x0286, 0x9005, 0x02a2, 0, 0, 51 }, /* ASR-4810SAS (Hurricane */ + { 0x9005, 0x0286, 0x9005, 0x02a2, 0, 0, 51 }, /* ASR-3800SAS (Hurricane44) */ { 0x9005, 0x0285, 0x1028, 0x0287, 0, 0, 52 }, /* Perc 320/DC*/ { 0x1011, 0x0046, 0x9005, 0x0365, 0, 0, 53 }, /* Adaptec 5400S (Mustang)*/ @@ -195,7 +195,7 @@ static struct aac_driver_ident aac_drivers[] = { { aac_rkt_init, "aacraid", "ICP ", "ICP9014R0 ", 1 }, /* ICP9014R0 (Lancer) */ { aac_rkt_init, "aacraid", "ICP ", "ICP9047MA ", 1 }, /* ICP9047MA (Lancer) */ { aac_rkt_init, "aacraid", "ICP ", "ICP9087MA ", 1 }, /* ICP9087MA (Lancer) */ - { aac_rkt_init, "aacraid", "ICP ", "ICP5085AU ", 1 }, /* ICP5085AU (Hurricane) */ + { aac_rkt_init, "aacraid", "ICP ", "ICP5445AU ", 1 }, /* ICP5445AU (Hurricane44) */ { aac_rx_init, "aacraid", "ICP ", "ICP9085LI ", 1 }, /* ICP9085LI (Marauder-X) */ { aac_rx_init, "aacraid", "ICP ", "ICP5085BR ", 1 }, /* ICP5085BR (Marauder-E) */ { aac_rkt_init, "aacraid", "ICP ", "ICP9067MA ", 1 }, /* ICP9067MA (Intruder-6) */ @@ -217,7 +217,7 @@ static struct aac_driver_ident aac_drivers[] = { { aac_rx_init, "aacraid", "ADAPTEC ", "ASR-4000SAS ", 1 }, /* ASR-4000SAS (BlackBird & AvonPark) */ { aac_rx_init, "aacraid", "ADAPTEC ", "ASR-4800SAS ", 1 }, /* ASR-4800SAS (Marauder-X) */ { aac_rx_init, "aacraid", "ADAPTEC ", "ASR-4805SAS ", 1 }, /* ASR-4805SAS (Marauder-E) */ - { aac_rkt_init, "aacraid", "ADAPTEC ", "ASR-4810SAS ", 1 }, /* ASR-4810SAS (Hurricane) */ + { aac_rkt_init, "aacraid", "ADAPTEC ", "ASR-3800SAS ", 1 }, /* ASR-3800SAS (Hurricane44) */ { aac_rx_init, "percraid", "DELL ", "PERC 320/DC ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG }, /* Perc 320/DC*/ { aac_sa_init, "aacraid", "ADAPTEC ", "Adaptec 5400S ", 4, AAC_QUIRK_34SG }, /* Adaptec 5400S (Mustang)*/ @@ -453,15 +453,10 @@ static int aac_eh_reset(struct scsi_cmnd* cmd) printk(KERN_ERR "%s: Host adapter reset request. SCSI hang ?\n", AAC_DRIVERNAME); - - - spin_lock_irq(host->host_lock); - aac = (struct aac_dev *)host->hostdata; if (aac_adapter_check_health(aac)) { printk(KERN_ERR "%s: Host adapter appears dead\n", AAC_DRIVERNAME); - spin_unlock_irq(host->host_lock); return -ENODEV; } /* @@ -487,13 +482,10 @@ static int aac_eh_reset(struct scsi_cmnd* cmd) /* * We can exit If all the commands are complete */ - spin_unlock_irq(host->host_lock); if (active == 0) return SUCCESS; ssleep(1); - spin_lock_irq(host->host_lock); } - spin_unlock_irq(host->host_lock); printk(KERN_ERR "%s: SCSI bus appears hung\n", AAC_DRIVERNAME); return -ETIMEDOUT; } @@ -572,7 +564,7 @@ static long aac_compat_do_ioctl(struct aac_dev *dev, unsigned cmd, unsigned long f = compat_alloc_user_space(sizeof(*f)); ret = 0; - if (clear_user(f, sizeof(*f)) != sizeof(*f)) + if (clear_user(f, sizeof(*f))) ret = -EFAULT; if (copy_in_user(f, (void __user *)arg, sizeof(struct fib_ioctl) - sizeof(u32))) ret = -EFAULT; diff --git a/drivers/scsi/aacraid/rkt.c b/drivers/scsi/aacraid/rkt.c index 7a23e027e..458ea897f 100644 --- a/drivers/scsi/aacraid/rkt.c +++ b/drivers/scsi/aacraid/rkt.c @@ -444,16 +444,16 @@ int aac_rkt_init(struct aac_dev *dev) */ while (!(rkt_readl(dev, MUnit.OMRx[0]) & KERNEL_UP_AND_RUNNING)) { - if(time_after(jiffies, start+180*HZ)) + if(time_after(jiffies, start+startup_timeout*HZ)) { status = rkt_readl(dev, MUnit.OMRx[0]); printk(KERN_ERR "%s%d: adapter kernel failed to start, init status = %lx.\n", dev->name, instance, status); goto error_iounmap; } - schedule_timeout_uninterruptible(1); + msleep(1); } - if (request_irq(dev->scsi_host_ptr->irq, aac_rkt_intr, SA_SHIRQ|SA_INTERRUPT, "aacraid", (void *)dev)<0) + if (request_irq(dev->scsi_host_ptr->irq, aac_rkt_intr, IRQF_SHARED|IRQF_DISABLED, "aacraid", (void *)dev)<0) { printk(KERN_ERR "%s%d: Interrupt unavailable.\n", name, instance); goto error_iounmap; diff --git a/drivers/scsi/aacraid/rx.c b/drivers/scsi/aacraid/rx.c index 729b9eb26..035018db6 100644 --- a/drivers/scsi/aacraid/rx.c +++ b/drivers/scsi/aacraid/rx.c @@ -444,16 +444,16 @@ int aac_rx_init(struct aac_dev *dev) while ((!(rx_readl(dev, IndexRegs.Mailbox[7]) & KERNEL_UP_AND_RUNNING)) || (!(rx_readl(dev, MUnit.OMRx[0]) & KERNEL_UP_AND_RUNNING))) { - if(time_after(jiffies, start+180*HZ)) + if(time_after(jiffies, start+startup_timeout*HZ)) { status = rx_readl(dev, IndexRegs.Mailbox[7]); printk(KERN_ERR "%s%d: adapter kernel failed to start, init status = %lx.\n", dev->name, instance, status); goto error_iounmap; } - schedule_timeout_uninterruptible(1); + msleep(1); } - if (request_irq(dev->scsi_host_ptr->irq, aac_rx_intr, SA_SHIRQ|SA_INTERRUPT, "aacraid", (void *)dev)<0) + if (request_irq(dev->scsi_host_ptr->irq, aac_rx_intr, IRQF_SHARED|IRQF_DISABLED, "aacraid", (void *)dev)<0) { printk(KERN_ERR "%s%d: Interrupt unavailable.\n", name, instance); goto error_iounmap; diff --git a/drivers/scsi/aacraid/sa.c b/drivers/scsi/aacraid/sa.c index a53454908..cd586cc8f 100644 --- a/drivers/scsi/aacraid/sa.c +++ b/drivers/scsi/aacraid/sa.c @@ -66,11 +66,11 @@ static irqreturn_t aac_sa_intr(int irq, void *dev_id, struct pt_regs *regs) sa_writew(dev, DoorbellClrReg_p, PrintfReady); /* clear PrintfReady */ sa_writew(dev, DoorbellReg_s, PrintfDone); } else if (intstat & DOORBELL_1) { // dev -> Host Normal Command Ready - aac_command_normal(&dev->queues->queue[HostNormCmdQueue]); sa_writew(dev, DoorbellClrReg_p, DOORBELL_1); + aac_command_normal(&dev->queues->queue[HostNormCmdQueue]); } else if (intstat & DOORBELL_2) { // dev -> Host Normal Response Ready - aac_response_normal(&dev->queues->queue[HostNormRespQueue]); sa_writew(dev, DoorbellClrReg_p, DOORBELL_2); + aac_response_normal(&dev->queues->queue[HostNormRespQueue]); } else if (intstat & DOORBELL_3) { // dev -> Host Normal Command Not Full sa_writew(dev, DoorbellClrReg_p, DOORBELL_3); } else if (intstat & DOORBELL_4) { // dev -> Host Normal Response Not Full @@ -318,16 +318,16 @@ int aac_sa_init(struct aac_dev *dev) * Wait for the adapter to be up and running. Wait up to 3 minutes. */ while (!(sa_readl(dev, Mailbox7) & KERNEL_UP_AND_RUNNING)) { - if (time_after(jiffies, start+180*HZ)) { + if (time_after(jiffies, start+startup_timeout*HZ)) { status = sa_readl(dev, Mailbox7); printk(KERN_WARNING "%s%d: adapter kernel failed to start, init status = %lx.\n", name, instance, status); goto error_iounmap; } - schedule_timeout_uninterruptible(1); + msleep(1); } - if (request_irq(dev->scsi_host_ptr->irq, aac_sa_intr, SA_SHIRQ|SA_INTERRUPT, "aacraid", (void *)dev ) < 0) { + if (request_irq(dev->scsi_host_ptr->irq, aac_sa_intr, IRQF_SHARED|IRQF_DISABLED, "aacraid", (void *)dev ) < 0) { printk(KERN_WARNING "%s%d: Interrupt unavailable.\n", name, instance); goto error_iounmap; } diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c index 331c8c55d..773f02e3b 100644 --- a/drivers/scsi/advansys.c +++ b/drivers/scsi/advansys.c @@ -371,7 +371,7 @@ 1.5 (8/8/96): 1. Add support for ABP-940U (PCI Ultra) adapter. - 2. Add support for IRQ sharing by setting the SA_SHIRQ flag for + 2. Add support for IRQ sharing by setting the IRQF_SHARED flag for request_irq and supplying a dev_id pointer to both request_irq() and free_irq(). 3. In AscSearchIOPortAddr11() restore a call to check_region() which @@ -504,9 +504,9 @@ 3. For v2.1.93 and newer kernels use CONFIG_PCI and new PCI BIOS access functions. 4. Update board serial number printing. - 5. Try allocating an IRQ both with and without the SA_INTERRUPT + 5. Try allocating an IRQ both with and without the IRQF_DISABLED flag set to allow IRQ sharing with drivers that do not set - the SA_INTERRUPT flag. Also display a more descriptive error + the IRQF_DISABLED flag. Also display a more descriptive error message if request_irq() fails. 6. Update to latest Asc and Adv Libraries. @@ -754,7 +754,6 @@ * --- Linux Include Files */ -#include #include #if defined(CONFIG_X86) && !defined(CONFIG_ISA) @@ -896,6 +895,14 @@ typedef unsigned char uchar; #define ASC_DVCLIB_CALL_FAILED (0) #define ASC_DVCLIB_CALL_ERROR (-1) +#define PCI_VENDOR_ID_ASP 0x10cd +#define PCI_DEVICE_ID_ASP_1200A 0x1100 +#define PCI_DEVICE_ID_ASP_ABP940 0x1200 +#define PCI_DEVICE_ID_ASP_ABP940U 0x1300 +#define PCI_DEVICE_ID_ASP_ABP940UW 0x2300 +#define PCI_DEVICE_ID_38C0800_REV1 0x2500 +#define PCI_DEVICE_ID_38C1600_REV1 0x2700 + /* * Enable CC_VERY_LONG_SG_LIST to support up to 64K element SG lists. * The SRB structure will have to be changed and the ASC_SRB2SCSIQ() @@ -5184,19 +5191,19 @@ advansys_detect(struct scsi_host_template *tpnt) /* Register IRQ Number. */ ASC_DBG1(2, "advansys_detect: request_irq() %d\n", shp->irq); /* - * If request_irq() fails with the SA_INTERRUPT flag set, - * then try again without the SA_INTERRUPT flag set. This + * If request_irq() fails with the IRQF_DISABLED flag set, + * then try again without the IRQF_DISABLED flag set. This * allows IRQ sharing to work even with other drivers that - * do not set the SA_INTERRUPT flag. + * do not set the IRQF_DISABLED flag. * - * If SA_INTERRUPT is not set, then interrupts are enabled + * If IRQF_DISABLED is not set, then interrupts are enabled * before the driver interrupt function is called. */ if (((ret = request_irq(shp->irq, advansys_interrupt, - SA_INTERRUPT | (share_irq == TRUE ? SA_SHIRQ : 0), + IRQF_DISABLED | (share_irq == TRUE ? IRQF_SHARED : 0), "advansys", boardp)) != 0) && ((ret = request_irq(shp->irq, advansys_interrupt, - (share_irq == TRUE ? SA_SHIRQ : 0), + (share_irq == TRUE ? IRQF_SHARED : 0), "advansys", boardp)) != 0)) { if (ret == -EBUSY) { @@ -12355,7 +12362,7 @@ AscInitFromEEP(ASC_DVC_VAR *asc_dvc) ASC_PRINT1( "AscInitFromEEP: Failed to re-write EEPROM with %d errors.\n", i); } else { - ASC_PRINT("AscInitFromEEP: Succesfully re-wrote EEPROM."); + ASC_PRINT("AscInitFromEEP: Successfully re-wrote EEPROM.\n"); } } return (warn_code); @@ -17297,7 +17304,7 @@ AdvWaitEEPCmd(AdvPortAddr iop_base) /* * Write the EEPROM from 'cfg_buf'. */ -void +void __init AdvSet3550EEPConfig(AdvPortAddr iop_base, ADVEEP_3550_CONFIG *cfg_buf) { ushort *wbuf; @@ -17364,7 +17371,7 @@ AdvSet3550EEPConfig(AdvPortAddr iop_base, ADVEEP_3550_CONFIG *cfg_buf) /* * Write the EEPROM from 'cfg_buf'. */ -void +void __init AdvSet38C0800EEPConfig(AdvPortAddr iop_base, ADVEEP_38C0800_CONFIG *cfg_buf) { @@ -17432,7 +17439,7 @@ AdvSet38C0800EEPConfig(AdvPortAddr iop_base, /* * Write the EEPROM from 'cfg_buf'. */ -void +void __init AdvSet38C1600EEPConfig(AdvPortAddr iop_base, ADVEEP_38C1600_CONFIG *cfg_buf) { diff --git a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c index de80cdfb5..f974869ea 100644 --- a/drivers/scsi/aha152x.c +++ b/drivers/scsi/aha152x.c @@ -551,6 +551,11 @@ struct aha152x_hostdata { struct aha152x_scdata { Scsi_Cmnd *next; /* next sc in queue */ struct semaphore *sem; /* semaphore to block on */ + unsigned char cmd_len; + unsigned char cmnd[MAX_COMMAND_SIZE]; + unsigned short use_sg; + unsigned request_bufflen; + void *request_buffer; }; @@ -855,7 +860,7 @@ struct Scsi_Host *aha152x_probe_one(struct aha152x_setup *setup) SETPORT(SIMODE0, 0); SETPORT(SIMODE1, 0); - if( request_irq(shpnt->irq, swintr, SA_INTERRUPT|SA_SHIRQ, "aha152x", shpnt) ) { + if( request_irq(shpnt->irq, swintr, IRQF_DISABLED|IRQF_SHARED, "aha152x", shpnt) ) { printk(KERN_ERR "aha152x%d: irq %d busy.\n", shpnt->host_no, shpnt->irq); goto out_host_put; } @@ -889,7 +894,7 @@ struct Scsi_Host *aha152x_probe_one(struct aha152x_setup *setup) SETPORT(SSTAT0, 0x7f); SETPORT(SSTAT1, 0xef); - if ( request_irq(shpnt->irq, intr, SA_INTERRUPT|SA_SHIRQ, "aha152x", shpnt) ) { + if ( request_irq(shpnt->irq, intr, IRQF_DISABLED|IRQF_SHARED, "aha152x", shpnt) ) { printk(KERN_ERR "aha152x%d: failed to reassign irq %d.\n", shpnt->host_no, shpnt->irq); goto out_host_put; } @@ -1006,11 +1011,20 @@ static int aha152x_internal_queue(Scsi_Cmnd *SCpnt, struct semaphore *sem, int p return FAILED; } } else { + struct aha152x_scdata *sc; + SCpnt->host_scribble = kmalloc(sizeof(struct aha152x_scdata), GFP_ATOMIC); if(SCpnt->host_scribble==0) { printk(ERR_LEAD "allocation failed\n", CMDINFO(SCpnt)); return FAILED; } + + sc = SCDATA(SCpnt); + memcpy(sc->cmnd, SCpnt->cmnd, sizeof(sc->cmnd)); + sc->request_buffer = SCpnt->request_buffer; + sc->request_bufflen = SCpnt->request_bufflen; + sc->use_sg = SCpnt->use_sg; + sc->cmd_len = SCpnt->cmd_len; } SCNEXT(SCpnt) = NULL; @@ -1165,6 +1179,10 @@ static int aha152x_device_reset(Scsi_Cmnd * SCpnt) DECLARE_MUTEX_LOCKED(sem); struct timer_list timer; int ret, issued, disconnected; + unsigned char old_cmd_len = SCpnt->cmd_len; + unsigned short old_use_sg = SCpnt->use_sg; + void *old_buffer = SCpnt->request_buffer; + unsigned old_bufflen = SCpnt->request_bufflen; unsigned long flags; #if defined(AHA152X_DEBUG) @@ -1198,11 +1216,11 @@ static int aha152x_device_reset(Scsi_Cmnd * SCpnt) add_timer(&timer); down(&sem); del_timer(&timer); - - SCpnt->cmd_len = SCpnt->old_cmd_len; - SCpnt->use_sg = SCpnt->old_use_sg; - SCpnt->request_buffer = SCpnt->buffer; - SCpnt->request_bufflen = SCpnt->bufflen; + + SCpnt->cmd_len = old_cmd_len; + SCpnt->use_sg = old_use_sg; + SCpnt->request_buffer = old_buffer; + SCpnt->request_bufflen = old_bufflen; DO_LOCK(flags); @@ -1565,6 +1583,9 @@ static void busfree_run(struct Scsi_Host *shpnt) #endif if(DONE_SC->SCp.phase & check_condition) { + struct scsi_cmnd *cmd = HOSTDATA(shpnt)->done_SC; + struct aha152x_scdata *sc = SCDATA(cmd); + #if 0 if(HOSTDATA(shpnt)->debug & debug_eh) { printk(ERR_LEAD "received sense: ", CMDINFO(DONE_SC)); @@ -1573,13 +1594,13 @@ static void busfree_run(struct Scsi_Host *shpnt) #endif /* restore old command */ - memcpy((void *) DONE_SC->cmnd, (void *) DONE_SC->data_cmnd, sizeof(DONE_SC->data_cmnd)); - DONE_SC->request_buffer = DONE_SC->buffer; - DONE_SC->request_bufflen = DONE_SC->bufflen; - DONE_SC->use_sg = DONE_SC->old_use_sg; - DONE_SC->cmd_len = DONE_SC->old_cmd_len; + memcpy(cmd->cmnd, sc->cmnd, sizeof(sc->cmnd)); + cmd->request_buffer = sc->request_buffer; + cmd->request_bufflen = sc->request_bufflen; + cmd->use_sg = sc->use_sg; + cmd->cmd_len = sc->cmd_len; - DONE_SC->SCp.Status = 0x02; + cmd->SCp.Status = 0x02; HOSTDATA(shpnt)->commands--; if (!HOSTDATA(shpnt)->commands) diff --git a/drivers/scsi/aha1542.c b/drivers/scsi/aha1542.c index 51bad7a1e..24f0f5461 100644 --- a/drivers/scsi/aha1542.c +++ b/drivers/scsi/aha1542.c @@ -25,7 +25,6 @@ * Added proper detection of the AHA-1640 (MCA version of AHA-1540) */ -#include #include #include #include @@ -1011,7 +1010,7 @@ static int __init do_setup(char *str) int count=setup_idx; - get_options(str, sizeof(ints)/sizeof(int), ints); + get_options(str, ARRAY_SIZE(ints), ints); aha1542_setup(str,ints); return count + * Please ALWAYS copy linux-ide@vger.kernel.org + * on emails. * - * The contents of this file are subject to the Open - * Software License version 1.1 that can be found at - * http://www.opensource.org/licenses/osl-1.1.txt and is included herein - * by reference. + * Copyright 2004-2005 Red Hat, Inc. * - * Alternatively, the contents of this file may be used under the terms - * of the GNU General Public License version 2 (the "GPL") as distributed - * in the kernel source COPYING file, in which case the provisions of - * the GPL are applicable instead of the above. If you wish to allow - * the use of your version of this file only under the terms of the - * GPL and not to allow others to use your version of this file under - * the OSL, indicate your decision by deleting the provisions above and - * replace them with the notice and other provisions required by the GPL. - * If you do not delete the provisions above, a recipient may use your - * version of this file under either the OSL or the GPL. * - * Version 1.0 of the AHCI specification: + * 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; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * + * + * libata documentation is available via 'make {ps|pdf}docs', + * as Documentation/DocBook/libata.* + * + * AHCI hardware documentation: * http://www.intel.com/technology/serialata/pdf/rev1_0.pdf + * http://www.intel.com/technology/serialata/pdf/rev1_1.pdf * */ @@ -33,13 +41,14 @@ #include #include #include -#include "scsi.h" +#include #include +#include #include #include #define DRV_NAME "ahci" -#define DRV_VERSION "1.00" +#define DRV_VERSION "2.0" enum { @@ -47,19 +56,28 @@ enum { AHCI_MAX_SG = 168, /* hardware max is 64K */ AHCI_DMA_BOUNDARY = 0xffffffff, AHCI_USE_CLUSTERING = 0, - AHCI_CMD_SLOT_SZ = 32 * 32, + AHCI_MAX_CMDS = 32, + AHCI_CMD_SZ = 32, + AHCI_CMD_SLOT_SZ = AHCI_MAX_CMDS * AHCI_CMD_SZ, AHCI_RX_FIS_SZ = 256, - AHCI_CMD_TBL_HDR = 0x80, - AHCI_CMD_TBL_SZ = AHCI_CMD_TBL_HDR + (AHCI_MAX_SG * 16), - AHCI_PORT_PRIV_DMA_SZ = AHCI_CMD_SLOT_SZ + AHCI_CMD_TBL_SZ + + AHCI_CMD_TBL_CDB = 0x40, + AHCI_CMD_TBL_HDR_SZ = 0x80, + AHCI_CMD_TBL_SZ = AHCI_CMD_TBL_HDR_SZ + (AHCI_MAX_SG * 16), + AHCI_CMD_TBL_AR_SZ = AHCI_CMD_TBL_SZ * AHCI_MAX_CMDS, + AHCI_PORT_PRIV_DMA_SZ = AHCI_CMD_SLOT_SZ + AHCI_CMD_TBL_AR_SZ + AHCI_RX_FIS_SZ, AHCI_IRQ_ON_SG = (1 << 31), AHCI_CMD_ATAPI = (1 << 5), AHCI_CMD_WRITE = (1 << 6), + AHCI_CMD_PREFETCH = (1 << 7), + AHCI_CMD_RESET = (1 << 8), + AHCI_CMD_CLR_BUSY = (1 << 10), RX_FIS_D2H_REG = 0x40, /* offset of D2H Register FIS data */ + RX_FIS_UNK = 0x60, /* offset of Unknown FIS data */ board_ahci = 0, + board_ahci_vt8251 = 1, /* global controller registers */ HOST_CAP = 0x00, /* host capabilities */ @@ -74,6 +92,10 @@ enum { HOST_AHCI_EN = (1 << 31), /* AHCI enabled */ /* HOST_CAP bits */ + HOST_CAP_SSC = (1 << 14), /* Slumber capable */ + HOST_CAP_CLO = (1 << 24), /* Command List Override support */ + HOST_CAP_SSS = (1 << 27), /* Staggered Spin-up */ + HOST_CAP_NCQ = (1 << 30), /* Native Command Queueing */ HOST_CAP_64 = (1 << 31), /* PCI DAC (64-bit DMA) support */ /* registers for each SATA port */ @@ -113,27 +135,39 @@ enum { PORT_IRQ_PIOS_FIS = (1 << 1), /* PIO Setup FIS rx'd */ PORT_IRQ_D2H_REG_FIS = (1 << 0), /* D2H Register FIS rx'd */ - PORT_IRQ_FATAL = PORT_IRQ_TF_ERR | - PORT_IRQ_HBUS_ERR | - PORT_IRQ_HBUS_DATA_ERR | - PORT_IRQ_IF_ERR, - DEF_PORT_IRQ = PORT_IRQ_FATAL | PORT_IRQ_PHYRDY | - PORT_IRQ_CONNECT | PORT_IRQ_SG_DONE | - PORT_IRQ_UNK_FIS | PORT_IRQ_SDB_FIS | - PORT_IRQ_DMAS_FIS | PORT_IRQ_PIOS_FIS | - PORT_IRQ_D2H_REG_FIS, + PORT_IRQ_FREEZE = PORT_IRQ_HBUS_ERR | + PORT_IRQ_IF_ERR | + PORT_IRQ_CONNECT | + PORT_IRQ_PHYRDY | + PORT_IRQ_UNK_FIS, + PORT_IRQ_ERROR = PORT_IRQ_FREEZE | + PORT_IRQ_TF_ERR | + PORT_IRQ_HBUS_DATA_ERR, + DEF_PORT_IRQ = PORT_IRQ_ERROR | PORT_IRQ_SG_DONE | + PORT_IRQ_SDB_FIS | PORT_IRQ_DMAS_FIS | + PORT_IRQ_PIOS_FIS | PORT_IRQ_D2H_REG_FIS, /* PORT_CMD bits */ + PORT_CMD_ATAPI = (1 << 24), /* Device is ATAPI */ PORT_CMD_LIST_ON = (1 << 15), /* cmd list DMA engine running */ PORT_CMD_FIS_ON = (1 << 14), /* FIS DMA engine running */ PORT_CMD_FIS_RX = (1 << 4), /* Enable FIS receive DMA engine */ + PORT_CMD_CLO = (1 << 3), /* Command list override */ PORT_CMD_POWER_ON = (1 << 2), /* Power up device */ PORT_CMD_SPIN_UP = (1 << 1), /* Spin up device */ PORT_CMD_START = (1 << 0), /* Enable port DMA engine */ + PORT_CMD_ICC_MASK = (0xf << 28), /* i/f ICC state mask */ PORT_CMD_ICC_ACTIVE = (0x1 << 28), /* Put i/f in active state */ PORT_CMD_ICC_PARTIAL = (0x2 << 28), /* Put i/f in partial state */ PORT_CMD_ICC_SLUMBER = (0x6 << 28), /* Put i/f in slumber state */ + + /* hpriv->flags bits */ + AHCI_FLAG_MSI = (1 << 0), + + /* ap->flags bits */ + AHCI_FLAG_RESET_NEEDS_CLO = (1 << 24), + AHCI_FLAG_NO_NCQ = (1 << 25), }; struct ahci_cmd_hdr { @@ -162,7 +196,6 @@ struct ahci_port_priv { dma_addr_t cmd_slot_dma; void *cmd_tbl; dma_addr_t cmd_tbl_dma; - struct ahci_sg *cmd_tbl_sg; void *rx_fis; dma_addr_t rx_fis_dma; }; @@ -170,82 +203,102 @@ struct ahci_port_priv { static u32 ahci_scr_read (struct ata_port *ap, unsigned int sc_reg); static void ahci_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val); static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent); -static int ahci_qc_issue(struct ata_queued_cmd *qc); +static unsigned int ahci_qc_issue(struct ata_queued_cmd *qc); static irqreturn_t ahci_interrupt (int irq, void *dev_instance, struct pt_regs *regs); -static void ahci_phy_reset(struct ata_port *ap); static void ahci_irq_clear(struct ata_port *ap); -static void ahci_eng_timeout(struct ata_port *ap); static int ahci_port_start(struct ata_port *ap); static void ahci_port_stop(struct ata_port *ap); -static void ahci_host_stop(struct ata_host_set *host_set); static void ahci_tf_read(struct ata_port *ap, struct ata_taskfile *tf); static void ahci_qc_prep(struct ata_queued_cmd *qc); static u8 ahci_check_status(struct ata_port *ap); -static u8 ahci_check_err(struct ata_port *ap); -static inline int ahci_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc); - -static Scsi_Host_Template ahci_sht = { +static void ahci_freeze(struct ata_port *ap); +static void ahci_thaw(struct ata_port *ap); +static void ahci_error_handler(struct ata_port *ap); +static void ahci_post_internal_cmd(struct ata_queued_cmd *qc); +static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg); +static int ahci_port_resume(struct ata_port *ap); +static int ahci_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg); +static int ahci_pci_device_resume(struct pci_dev *pdev); +static void ahci_remove_one (struct pci_dev *pdev); + +static struct scsi_host_template ahci_sht = { .module = THIS_MODULE, .name = DRV_NAME, .ioctl = ata_scsi_ioctl, .queuecommand = ata_scsi_queuecmd, - .eh_strategy_handler = ata_scsi_error, - .can_queue = ATA_DEF_QUEUE, + .change_queue_depth = ata_scsi_change_queue_depth, + .can_queue = AHCI_MAX_CMDS - 1, .this_id = ATA_SHT_THIS_ID, .sg_tablesize = AHCI_MAX_SG, - .max_sectors = ATA_MAX_SECTORS, .cmd_per_lun = ATA_SHT_CMD_PER_LUN, .emulated = ATA_SHT_EMULATED, .use_clustering = AHCI_USE_CLUSTERING, .proc_name = DRV_NAME, .dma_boundary = AHCI_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, + .slave_destroy = ata_scsi_slave_destroy, .bios_param = ata_std_bios_param, - .ordered_flush = 1, + .suspend = ata_scsi_device_suspend, + .resume = ata_scsi_device_resume, }; -static struct ata_port_operations ahci_ops = { +static const struct ata_port_operations ahci_ops = { .port_disable = ata_port_disable, .check_status = ahci_check_status, .check_altstatus = ahci_check_status, - .check_err = ahci_check_err, .dev_select = ata_noop_dev_select, .tf_read = ahci_tf_read, - .phy_reset = ahci_phy_reset, - .qc_prep = ahci_qc_prep, .qc_issue = ahci_qc_issue, - .eng_timeout = ahci_eng_timeout, - .irq_handler = ahci_interrupt, .irq_clear = ahci_irq_clear, .scr_read = ahci_scr_read, .scr_write = ahci_scr_write, + .freeze = ahci_freeze, + .thaw = ahci_thaw, + + .error_handler = ahci_error_handler, + .post_internal_cmd = ahci_post_internal_cmd, + + .port_suspend = ahci_port_suspend, + .port_resume = ahci_port_resume, + .port_start = ahci_port_start, .port_stop = ahci_port_stop, - .host_stop = ahci_host_stop, }; -static struct ata_port_info ahci_port_info[] = { +static const struct ata_port_info ahci_port_info[] = { /* board_ahci */ { .sht = &ahci_sht, .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | - ATA_FLAG_SATA_RESET | ATA_FLAG_MMIO | - ATA_FLAG_PIO_DMA, - .pio_mask = 0x03, /* pio3-4 */ + ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA | + ATA_FLAG_SKIP_D2H_BSY, + .pio_mask = 0x1f, /* pio0-4 */ + .udma_mask = 0x7f, /* udma0-6 ; FIXME */ + .port_ops = &ahci_ops, + }, + /* board_ahci_vt8251 */ + { + .sht = &ahci_sht, + .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | + ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA | + ATA_FLAG_SKIP_D2H_BSY | + AHCI_FLAG_RESET_NEEDS_CLO | AHCI_FLAG_NO_NCQ, + .pio_mask = 0x1f, /* pio0-4 */ .udma_mask = 0x7f, /* udma0-6 ; FIXME */ .port_ops = &ahci_ops, }, }; -static struct pci_device_id ahci_pci_tbl[] = { +static const struct pci_device_id ahci_pci_tbl[] = { + /* Intel */ { PCI_VENDOR_ID_INTEL, 0x2652, PCI_ANY_ID, PCI_ANY_ID, 0, 0, board_ahci }, /* ICH6 */ { PCI_VENDOR_ID_INTEL, 0x2653, PCI_ANY_ID, PCI_ANY_ID, 0, 0, @@ -264,6 +317,51 @@ static struct pci_device_id ahci_pci_tbl[] = { board_ahci }, /* ESB2 */ { PCI_VENDOR_ID_INTEL, 0x2683, PCI_ANY_ID, PCI_ANY_ID, 0, 0, board_ahci }, /* ESB2 */ + { PCI_VENDOR_ID_INTEL, 0x27c6, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci }, /* ICH7-M DH */ + { PCI_VENDOR_ID_INTEL, 0x2821, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci }, /* ICH8 */ + { PCI_VENDOR_ID_INTEL, 0x2822, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci }, /* ICH8 */ + { PCI_VENDOR_ID_INTEL, 0x2824, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci }, /* ICH8 */ + { PCI_VENDOR_ID_INTEL, 0x2829, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci }, /* ICH8M */ + { PCI_VENDOR_ID_INTEL, 0x282a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci }, /* ICH8M */ + + /* JMicron */ + { 0x197b, 0x2360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci }, /* JMicron JMB360 */ + { 0x197b, 0x2361, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci }, /* JMicron JMB361 */ + { 0x197b, 0x2363, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci }, /* JMicron JMB363 */ + { 0x197b, 0x2365, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci }, /* JMicron JMB365 */ + { 0x197b, 0x2366, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci }, /* JMicron JMB366 */ + + /* ATI */ + { PCI_VENDOR_ID_ATI, 0x4380, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci }, /* ATI SB600 non-raid */ + { PCI_VENDOR_ID_ATI, 0x4381, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci }, /* ATI SB600 raid */ + + /* VIA */ + { PCI_VENDOR_ID_VIA, 0x3349, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci_vt8251 }, /* VIA VT8251 */ + + /* NVIDIA */ + { PCI_VENDOR_ID_NVIDIA, 0x044c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci }, /* MCP65 */ + { PCI_VENDOR_ID_NVIDIA, 0x044d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci }, /* MCP65 */ + { PCI_VENDOR_ID_NVIDIA, 0x044e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci }, /* MCP65 */ + { PCI_VENDOR_ID_NVIDIA, 0x044f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci }, /* MCP65 */ + { } /* terminate list */ }; @@ -272,7 +370,9 @@ static struct pci_driver ahci_pci_driver = { .name = DRV_NAME, .id_table = ahci_pci_tbl, .probe = ahci_init_one, - .remove = ata_pci_remove_one, + .suspend = ahci_pci_device_suspend, + .resume = ahci_pci_device_resume, + .remove = ahci_remove_one, }; @@ -281,125 +381,9 @@ static inline unsigned long ahci_port_base_ul (unsigned long base, unsigned int return base + 0x100 + (port * 0x80); } -static inline void *ahci_port_base (void *base, unsigned int port) -{ - return (void *) ahci_port_base_ul((unsigned long)base, port); -} - -static void ahci_host_stop(struct ata_host_set *host_set) -{ - struct ahci_host_priv *hpriv = host_set->private_data; - kfree(hpriv); - - ata_host_stop(host_set); -} - -static int ahci_port_start(struct ata_port *ap) -{ - struct device *dev = ap->host_set->dev; - struct ahci_host_priv *hpriv = ap->host_set->private_data; - struct ahci_port_priv *pp; - int rc; - void *mem, *mmio = ap->host_set->mmio_base; - void *port_mmio = ahci_port_base(mmio, ap->port_no); - dma_addr_t mem_dma; - - rc = ata_port_start(ap); - if (rc) - return rc; - - pp = kmalloc(sizeof(*pp), GFP_KERNEL); - if (!pp) { - rc = -ENOMEM; - goto err_out; - } - memset(pp, 0, sizeof(*pp)); - - mem = dma_alloc_coherent(dev, AHCI_PORT_PRIV_DMA_SZ, &mem_dma, GFP_KERNEL); - if (!mem) { - rc = -ENOMEM; - goto err_out_kfree; - } - memset(mem, 0, AHCI_PORT_PRIV_DMA_SZ); - - /* - * First item in chunk of DMA memory: 32-slot command table, - * 32 bytes each in size - */ - pp->cmd_slot = mem; - pp->cmd_slot_dma = mem_dma; - - mem += AHCI_CMD_SLOT_SZ; - mem_dma += AHCI_CMD_SLOT_SZ; - - /* - * Second item: Received-FIS area - */ - pp->rx_fis = mem; - pp->rx_fis_dma = mem_dma; - - mem += AHCI_RX_FIS_SZ; - mem_dma += AHCI_RX_FIS_SZ; - - /* - * Third item: data area for storing a single command - * and its scatter-gather table - */ - pp->cmd_tbl = mem; - pp->cmd_tbl_dma = mem_dma; - - pp->cmd_tbl_sg = mem + AHCI_CMD_TBL_HDR; - - ap->private_data = pp; - - if (hpriv->cap & HOST_CAP_64) - writel((pp->cmd_slot_dma >> 16) >> 16, port_mmio + PORT_LST_ADDR_HI); - writel(pp->cmd_slot_dma & 0xffffffff, port_mmio + PORT_LST_ADDR); - readl(port_mmio + PORT_LST_ADDR); /* flush */ - - if (hpriv->cap & HOST_CAP_64) - writel((pp->rx_fis_dma >> 16) >> 16, port_mmio + PORT_FIS_ADDR_HI); - writel(pp->rx_fis_dma & 0xffffffff, port_mmio + PORT_FIS_ADDR); - readl(port_mmio + PORT_FIS_ADDR); /* flush */ - - writel(PORT_CMD_ICC_ACTIVE | PORT_CMD_FIS_RX | - PORT_CMD_POWER_ON | PORT_CMD_SPIN_UP | - PORT_CMD_START, port_mmio + PORT_CMD); - readl(port_mmio + PORT_CMD); /* flush */ - - return 0; - -err_out_kfree: - kfree(pp); -err_out: - ata_port_stop(ap); - return rc; -} - - -static void ahci_port_stop(struct ata_port *ap) +static inline void __iomem *ahci_port_base (void __iomem *base, unsigned int port) { - struct device *dev = ap->host_set->dev; - struct ahci_port_priv *pp = ap->private_data; - void *mmio = ap->host_set->mmio_base; - void *port_mmio = ahci_port_base(mmio, ap->port_no); - u32 tmp; - - tmp = readl(port_mmio + PORT_CMD); - tmp &= ~(PORT_CMD_START | PORT_CMD_FIS_RX); - writel(tmp, port_mmio + PORT_CMD); - readl(port_mmio + PORT_CMD); /* flush */ - - /* spec says 500 msecs for each PORT_CMD_{START,FIS_RX} bit, so - * this is slightly incorrect. - */ - msleep(500); - - ap->private_data = NULL; - dma_free_coherent(dev, AHCI_PORT_PRIV_DMA_SZ, - pp->cmd_slot, pp->cmd_slot_dma); - kfree(pp); - ata_port_stop(ap); + return (void __iomem *) ahci_port_base_ul((unsigned long)base, port); } static u32 ahci_scr_read (struct ata_port *ap, unsigned int sc_reg_in) @@ -415,7 +399,7 @@ static u32 ahci_scr_read (struct ata_port *ap, unsigned int sc_reg_in) return 0xffffffffU; } - return readl((void *) ap->ioaddr.scr_addr + (sc_reg * 4)); + return readl((void __iomem *) ap->ioaddr.scr_addr + (sc_reg * 4)); } @@ -433,292 +417,952 @@ static void ahci_scr_write (struct ata_port *ap, unsigned int sc_reg_in, return; } - writel(val, (void *) ap->ioaddr.scr_addr + (sc_reg * 4)); + writel(val, (void __iomem *) ap->ioaddr.scr_addr + (sc_reg * 4)); } -static void ahci_phy_reset(struct ata_port *ap) +static void ahci_start_engine(void __iomem *port_mmio) { - void __iomem *port_mmio = (void __iomem *) ap->ioaddr.cmd_addr; - struct ata_taskfile tf; - struct ata_device *dev = &ap->device[0]; u32 tmp; - __sata_phy_reset(ap); - - if (ap->flags & ATA_FLAG_PORT_DISABLED) - return; - - tmp = readl(port_mmio + PORT_SIG); - tf.lbah = (tmp >> 24) & 0xff; - tf.lbam = (tmp >> 16) & 0xff; - tf.lbal = (tmp >> 8) & 0xff; - tf.nsect = (tmp) & 0xff; - - dev->class = ata_dev_classify(&tf); - if (!ata_dev_present(dev)) - ata_port_disable(ap); + /* start DMA */ + tmp = readl(port_mmio + PORT_CMD); + tmp |= PORT_CMD_START; + writel(tmp, port_mmio + PORT_CMD); + readl(port_mmio + PORT_CMD); /* flush */ } -static u8 ahci_check_status(struct ata_port *ap) +static int ahci_stop_engine(void __iomem *port_mmio) { - void *mmio = (void *) ap->ioaddr.cmd_addr; + u32 tmp; - return readl(mmio + PORT_TFDATA) & 0xFF; -} + tmp = readl(port_mmio + PORT_CMD); -static u8 ahci_check_err(struct ata_port *ap) -{ - void *mmio = (void *) ap->ioaddr.cmd_addr; + /* check if the HBA is idle */ + if ((tmp & (PORT_CMD_START | PORT_CMD_LIST_ON)) == 0) + return 0; - return (readl(mmio + PORT_TFDATA) >> 8) & 0xFF; -} + /* setting HBA to idle */ + tmp &= ~PORT_CMD_START; + writel(tmp, port_mmio + PORT_CMD); -static void ahci_tf_read(struct ata_port *ap, struct ata_taskfile *tf) -{ - struct ahci_port_priv *pp = ap->private_data; - u8 *d2h_fis = pp->rx_fis + RX_FIS_D2H_REG; + /* wait for engine to stop. This could be as long as 500 msec */ + tmp = ata_wait_register(port_mmio + PORT_CMD, + PORT_CMD_LIST_ON, PORT_CMD_LIST_ON, 1, 500); + if (tmp & PORT_CMD_LIST_ON) + return -EIO; - ata_tf_from_fis(d2h_fis, tf); + return 0; } -static void ahci_fill_sg(struct ata_queued_cmd *qc) +static void ahci_start_fis_rx(void __iomem *port_mmio, u32 cap, + dma_addr_t cmd_slot_dma, dma_addr_t rx_fis_dma) { - struct ahci_port_priv *pp = qc->ap->private_data; - unsigned int i; + u32 tmp; - VPRINTK("ENTER\n"); + /* set FIS registers */ + if (cap & HOST_CAP_64) + writel((cmd_slot_dma >> 16) >> 16, port_mmio + PORT_LST_ADDR_HI); + writel(cmd_slot_dma & 0xffffffff, port_mmio + PORT_LST_ADDR); - /* - * Next, the S/G list. - */ - for (i = 0; i < qc->n_elem; i++) { - u32 sg_len; - dma_addr_t addr; + if (cap & HOST_CAP_64) + writel((rx_fis_dma >> 16) >> 16, port_mmio + PORT_FIS_ADDR_HI); + writel(rx_fis_dma & 0xffffffff, port_mmio + PORT_FIS_ADDR); - addr = sg_dma_address(&qc->sg[i]); - sg_len = sg_dma_len(&qc->sg[i]); + /* enable FIS reception */ + tmp = readl(port_mmio + PORT_CMD); + tmp |= PORT_CMD_FIS_RX; + writel(tmp, port_mmio + PORT_CMD); - pp->cmd_tbl_sg[i].addr = cpu_to_le32(addr & 0xffffffff); - pp->cmd_tbl_sg[i].addr_hi = cpu_to_le32((addr >> 16) >> 16); - pp->cmd_tbl_sg[i].flags_size = cpu_to_le32(sg_len - 1); - } + /* flush */ + readl(port_mmio + PORT_CMD); } -static void ahci_qc_prep(struct ata_queued_cmd *qc) +static int ahci_stop_fis_rx(void __iomem *port_mmio) { - struct ahci_port_priv *pp = qc->ap->private_data; - u32 opts; - const u32 cmd_fis_len = 5; /* five dwords */ - - /* - * Fill in command slot information (currently only one slot, - * slot 0, is currently since we don't do queueing) - */ + u32 tmp; - opts = (qc->n_elem << 16) | cmd_fis_len; - if (qc->tf.flags & ATA_TFLAG_WRITE) - opts |= AHCI_CMD_WRITE; + /* disable FIS reception */ + tmp = readl(port_mmio + PORT_CMD); + tmp &= ~PORT_CMD_FIS_RX; + writel(tmp, port_mmio + PORT_CMD); - switch (qc->tf.protocol) { - case ATA_PROT_ATAPI: - case ATA_PROT_ATAPI_NODATA: - case ATA_PROT_ATAPI_DMA: - opts |= AHCI_CMD_ATAPI; - break; + /* wait for completion, spec says 500ms, give it 1000 */ + tmp = ata_wait_register(port_mmio + PORT_CMD, PORT_CMD_FIS_ON, + PORT_CMD_FIS_ON, 10, 1000); + if (tmp & PORT_CMD_FIS_ON) + return -EBUSY; - default: - /* do nothing */ - break; - } + return 0; +} - pp->cmd_slot[0].opts = cpu_to_le32(opts); - pp->cmd_slot[0].status = 0; - pp->cmd_slot[0].tbl_addr = cpu_to_le32(pp->cmd_tbl_dma & 0xffffffff); - pp->cmd_slot[0].tbl_addr_hi = cpu_to_le32((pp->cmd_tbl_dma >> 16) >> 16); +static void ahci_power_up(void __iomem *port_mmio, u32 cap) +{ + u32 cmd; - /* - * Fill in command table information. First, the header, - * a SATA Register - Host to Device command FIS. - */ - ata_tf_to_fis(&qc->tf, pp->cmd_tbl, 0); + cmd = readl(port_mmio + PORT_CMD) & ~PORT_CMD_ICC_MASK; - if (!(qc->flags & ATA_QCFLAG_DMAMAP)) - return; + /* spin up device */ + if (cap & HOST_CAP_SSS) { + cmd |= PORT_CMD_SPIN_UP; + writel(cmd, port_mmio + PORT_CMD); + } - ahci_fill_sg(qc); + /* wake up link */ + writel(cmd | PORT_CMD_ICC_ACTIVE, port_mmio + PORT_CMD); } -static void ahci_intr_error(struct ata_port *ap, u32 irq_stat) +static void ahci_power_down(void __iomem *port_mmio, u32 cap) { - void *mmio = ap->host_set->mmio_base; - void *port_mmio = ahci_port_base(mmio, ap->port_no); - u32 tmp; - int work; + u32 cmd, scontrol; - /* stop DMA */ - tmp = readl(port_mmio + PORT_CMD); - tmp &= ~PORT_CMD_START; - writel(tmp, port_mmio + PORT_CMD); + cmd = readl(port_mmio + PORT_CMD) & ~PORT_CMD_ICC_MASK; - /* wait for engine to stop. TODO: this could be - * as long as 500 msec - */ - work = 1000; - while (work-- > 0) { - tmp = readl(port_mmio + PORT_CMD); - if ((tmp & PORT_CMD_LIST_ON) == 0) - break; - udelay(10); - } + if (cap & HOST_CAP_SSC) { + /* enable transitions to slumber mode */ + scontrol = readl(port_mmio + PORT_SCR_CTL); + if ((scontrol & 0x0f00) > 0x100) { + scontrol &= ~0xf00; + writel(scontrol, port_mmio + PORT_SCR_CTL); + } - /* clear SATA phy error, if any */ - tmp = readl(port_mmio + PORT_SCR_ERR); - writel(tmp, port_mmio + PORT_SCR_ERR); + /* put device into slumber mode */ + writel(cmd | PORT_CMD_ICC_SLUMBER, port_mmio + PORT_CMD); - /* if DRQ/BSY is set, device needs to be reset. - * if so, issue COMRESET - */ - tmp = readl(port_mmio + PORT_TFDATA); - if (tmp & (ATA_BUSY | ATA_DRQ)) { - writel(0x301, port_mmio + PORT_SCR_CTL); - readl(port_mmio + PORT_SCR_CTL); /* flush */ - udelay(10); - writel(0x300, port_mmio + PORT_SCR_CTL); - readl(port_mmio + PORT_SCR_CTL); /* flush */ + /* wait for the transition to complete */ + ata_wait_register(port_mmio + PORT_CMD, PORT_CMD_ICC_SLUMBER, + PORT_CMD_ICC_SLUMBER, 1, 50); } - /* re-start DMA */ - tmp = readl(port_mmio + PORT_CMD); - tmp |= PORT_CMD_START; - writel(tmp, port_mmio + PORT_CMD); - readl(port_mmio + PORT_CMD); /* flush */ + /* put device into listen mode */ + if (cap & HOST_CAP_SSS) { + /* first set PxSCTL.DET to 0 */ + scontrol = readl(port_mmio + PORT_SCR_CTL); + scontrol &= ~0xf; + writel(scontrol, port_mmio + PORT_SCR_CTL); - printk(KERN_WARNING "ata%u: error occurred, port reset\n", ap->id); + /* then set PxCMD.SUD to 0 */ + cmd &= ~PORT_CMD_SPIN_UP; + writel(cmd, port_mmio + PORT_CMD); + } } -static void ahci_eng_timeout(struct ata_port *ap) +static void ahci_init_port(void __iomem *port_mmio, u32 cap, + dma_addr_t cmd_slot_dma, dma_addr_t rx_fis_dma) { - void *mmio = ap->host_set->mmio_base; - void *port_mmio = ahci_port_base(mmio, ap->port_no); - struct ata_queued_cmd *qc; + /* power up */ + ahci_power_up(port_mmio, cap); - DPRINTK("ENTER\n"); - - ahci_intr_error(ap, readl(port_mmio + PORT_IRQ_STAT)); - - qc = ata_qc_from_tag(ap, ap->active_tag); - if (!qc) { - printk(KERN_ERR "ata%u: BUG: timeout without command\n", - ap->id); - } else { - /* hack alert! We cannot use the supplied completion - * function from inside the ->eh_strategy_handler() thread. - * libata is the only user of ->eh_strategy_handler() in - * any kernel, so the default scsi_done() assumes it is - * not being called from the SCSI EH. - */ - qc->scsidone = scsi_finish_command; - ata_qc_complete(qc, ATA_ERR); - } + /* enable FIS reception */ + ahci_start_fis_rx(port_mmio, cap, cmd_slot_dma, rx_fis_dma); + /* enable DMA */ + ahci_start_engine(port_mmio); } -static inline int ahci_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc) +static int ahci_deinit_port(void __iomem *port_mmio, u32 cap, const char **emsg) { - void *mmio = ap->host_set->mmio_base; - void *port_mmio = ahci_port_base(mmio, ap->port_no); - u32 status, serr, ci; - - serr = readl(port_mmio + PORT_SCR_ERR); - writel(serr, port_mmio + PORT_SCR_ERR); - - status = readl(port_mmio + PORT_IRQ_STAT); - writel(status, port_mmio + PORT_IRQ_STAT); + int rc; - ci = readl(port_mmio + PORT_CMD_ISSUE); - if (likely((ci & 0x1) == 0)) { - if (qc) { - ata_qc_complete(qc, 0); - qc = NULL; - } + /* disable DMA */ + rc = ahci_stop_engine(port_mmio); + if (rc) { + *emsg = "failed to stop engine"; + return rc; } - if (status & PORT_IRQ_FATAL) { - ahci_intr_error(ap, status); - if (qc) - ata_qc_complete(qc, ATA_ERR); + /* disable FIS reception */ + rc = ahci_stop_fis_rx(port_mmio); + if (rc) { + *emsg = "failed stop FIS RX"; + return rc; } - return 1; -} + /* put device into slumber mode */ + ahci_power_down(port_mmio, cap); -static void ahci_irq_clear(struct ata_port *ap) -{ - /* TODO */ + return 0; } -static irqreturn_t ahci_interrupt (int irq, void *dev_instance, struct pt_regs *regs) +static int ahci_reset_controller(void __iomem *mmio, struct pci_dev *pdev) { - struct ata_host_set *host_set = dev_instance; - struct ahci_host_priv *hpriv; - unsigned int i, handled = 0; - void *mmio; - u32 irq_stat, irq_ack = 0; - - VPRINTK("ENTER\n"); - - hpriv = host_set->private_data; - mmio = host_set->mmio_base; + u32 cap_save, tmp; - /* sigh. 0xffffffff is a valid return from h/w */ - irq_stat = readl(mmio + HOST_IRQ_STAT); - irq_stat &= hpriv->port_map; - if (!irq_stat) - return IRQ_NONE; + cap_save = readl(mmio + HOST_CAP); + cap_save &= ( (1<<28) | (1<<17) ); + cap_save |= (1 << 27); - spin_lock(&host_set->lock); + /* global controller reset */ + tmp = readl(mmio + HOST_CTL); + if ((tmp & HOST_RESET) == 0) { + writel(tmp | HOST_RESET, mmio + HOST_CTL); + readl(mmio + HOST_CTL); /* flush */ + } - for (i = 0; i < host_set->n_ports; i++) { - struct ata_port *ap; - u32 tmp; + /* reset must complete within 1 second, or + * the hardware should be considered fried. + */ + ssleep(1); - VPRINTK("port %u\n", i); - ap = host_set->ports[i]; - tmp = irq_stat & (1 << i); - if (tmp && ap) { - struct ata_queued_cmd *qc; - qc = ata_qc_from_tag(ap, ap->active_tag); - if (ahci_host_intr(ap, qc)) - irq_ack |= (1 << i); - } + tmp = readl(mmio + HOST_CTL); + if (tmp & HOST_RESET) { + dev_printk(KERN_ERR, &pdev->dev, + "controller reset failed (0x%x)\n", tmp); + return -EIO; } - if (irq_ack) { - writel(irq_ack, mmio + HOST_IRQ_STAT); - handled = 1; - } + writel(HOST_AHCI_EN, mmio + HOST_CTL); + (void) readl(mmio + HOST_CTL); /* flush */ + writel(cap_save, mmio + HOST_CAP); + writel(0xf, mmio + HOST_PORTS_IMPL); + (void) readl(mmio + HOST_PORTS_IMPL); /* flush */ - spin_unlock(&host_set->lock); + if (pdev->vendor == PCI_VENDOR_ID_INTEL) { + u16 tmp16; - VPRINTK("EXIT\n"); + /* configure PCS */ + pci_read_config_word(pdev, 0x92, &tmp16); + tmp16 |= 0xf; + pci_write_config_word(pdev, 0x92, tmp16); + } - return IRQ_RETVAL(handled); + return 0; } -static int ahci_qc_issue(struct ata_queued_cmd *qc) +static void ahci_init_controller(void __iomem *mmio, struct pci_dev *pdev, + int n_ports, u32 cap) { - struct ata_port *ap = qc->ap; - void *port_mmio = (void *) ap->ioaddr.cmd_addr; + int i, rc; + u32 tmp; - writel(1, port_mmio + PORT_SCR_ACT); - readl(port_mmio + PORT_SCR_ACT); /* flush */ + for (i = 0; i < n_ports; i++) { + void __iomem *port_mmio = ahci_port_base(mmio, i); + const char *emsg = NULL; - writel(1, port_mmio + PORT_CMD_ISSUE); +#if 0 /* BIOSen initialize this incorrectly */ + if (!(hpriv->port_map & (1 << i))) + continue; +#endif + + /* make sure port is not active */ + rc = ahci_deinit_port(port_mmio, cap, &emsg); + if (rc) + dev_printk(KERN_WARNING, &pdev->dev, + "%s (%d)\n", emsg, rc); + + /* clear SError */ + tmp = readl(port_mmio + PORT_SCR_ERR); + VPRINTK("PORT_SCR_ERR 0x%x\n", tmp); + writel(tmp, port_mmio + PORT_SCR_ERR); + + /* clear & turn off port IRQ */ + tmp = readl(port_mmio + PORT_IRQ_STAT); + VPRINTK("PORT_IRQ_STAT 0x%x\n", tmp); + if (tmp) + writel(tmp, port_mmio + PORT_IRQ_STAT); + + writel(1 << i, mmio + HOST_IRQ_STAT); + writel(0, port_mmio + PORT_IRQ_MASK); + } + + tmp = readl(mmio + HOST_CTL); + VPRINTK("HOST_CTL 0x%x\n", tmp); + writel(tmp | HOST_IRQ_EN, mmio + HOST_CTL); + tmp = readl(mmio + HOST_CTL); + VPRINTK("HOST_CTL 0x%x\n", tmp); +} + +static unsigned int ahci_dev_classify(struct ata_port *ap) +{ + void __iomem *port_mmio = (void __iomem *) ap->ioaddr.cmd_addr; + struct ata_taskfile tf; + u32 tmp; + + tmp = readl(port_mmio + PORT_SIG); + tf.lbah = (tmp >> 24) & 0xff; + tf.lbam = (tmp >> 16) & 0xff; + tf.lbal = (tmp >> 8) & 0xff; + tf.nsect = (tmp) & 0xff; + + return ata_dev_classify(&tf); +} + +static void ahci_fill_cmd_slot(struct ahci_port_priv *pp, unsigned int tag, + u32 opts) +{ + dma_addr_t cmd_tbl_dma; + + cmd_tbl_dma = pp->cmd_tbl_dma + tag * AHCI_CMD_TBL_SZ; + + pp->cmd_slot[tag].opts = cpu_to_le32(opts); + pp->cmd_slot[tag].status = 0; + pp->cmd_slot[tag].tbl_addr = cpu_to_le32(cmd_tbl_dma & 0xffffffff); + pp->cmd_slot[tag].tbl_addr_hi = cpu_to_le32((cmd_tbl_dma >> 16) >> 16); +} + +static int ahci_clo(struct ata_port *ap) +{ + void __iomem *port_mmio = (void __iomem *) ap->ioaddr.cmd_addr; + struct ahci_host_priv *hpriv = ap->host_set->private_data; + u32 tmp; + + if (!(hpriv->cap & HOST_CAP_CLO)) + return -EOPNOTSUPP; + + tmp = readl(port_mmio + PORT_CMD); + tmp |= PORT_CMD_CLO; + writel(tmp, port_mmio + PORT_CMD); + + tmp = ata_wait_register(port_mmio + PORT_CMD, + PORT_CMD_CLO, PORT_CMD_CLO, 1, 500); + if (tmp & PORT_CMD_CLO) + return -EIO; + + return 0; +} + +static int ahci_prereset(struct ata_port *ap) +{ + if ((ap->flags & AHCI_FLAG_RESET_NEEDS_CLO) && + (ata_busy_wait(ap, ATA_BUSY, 1000) & ATA_BUSY)) { + /* ATA_BUSY hasn't cleared, so send a CLO */ + ahci_clo(ap); + } + + return ata_std_prereset(ap); +} + +static int ahci_softreset(struct ata_port *ap, unsigned int *class) +{ + struct ahci_port_priv *pp = ap->private_data; + void __iomem *mmio = ap->host_set->mmio_base; + void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no); + const u32 cmd_fis_len = 5; /* five dwords */ + const char *reason = NULL; + struct ata_taskfile tf; + u32 tmp; + u8 *fis; + int rc; + + DPRINTK("ENTER\n"); + + if (ata_port_offline(ap)) { + DPRINTK("PHY reports no device\n"); + *class = ATA_DEV_NONE; + return 0; + } + + /* prepare for SRST (AHCI-1.1 10.4.1) */ + rc = ahci_stop_engine(port_mmio); + if (rc) { + reason = "failed to stop engine"; + goto fail_restart; + } + + /* check BUSY/DRQ, perform Command List Override if necessary */ + ahci_tf_read(ap, &tf); + if (tf.command & (ATA_BUSY | ATA_DRQ)) { + rc = ahci_clo(ap); + + if (rc == -EOPNOTSUPP) { + reason = "port busy but CLO unavailable"; + goto fail_restart; + } else if (rc) { + reason = "port busy but CLO failed"; + goto fail_restart; + } + } + + /* restart engine */ + ahci_start_engine(port_mmio); + + ata_tf_init(ap->device, &tf); + fis = pp->cmd_tbl; + + /* issue the first D2H Register FIS */ + ahci_fill_cmd_slot(pp, 0, + cmd_fis_len | AHCI_CMD_RESET | AHCI_CMD_CLR_BUSY); + + tf.ctl |= ATA_SRST; + ata_tf_to_fis(&tf, fis, 0); + fis[1] &= ~(1 << 7); /* turn off Command FIS bit */ + + writel(1, port_mmio + PORT_CMD_ISSUE); + + tmp = ata_wait_register(port_mmio + PORT_CMD_ISSUE, 0x1, 0x1, 1, 500); + if (tmp & 0x1) { + rc = -EIO; + reason = "1st FIS failed"; + goto fail; + } + + /* spec says at least 5us, but be generous and sleep for 1ms */ + msleep(1); + + /* issue the second D2H Register FIS */ + ahci_fill_cmd_slot(pp, 0, cmd_fis_len); + + tf.ctl &= ~ATA_SRST; + ata_tf_to_fis(&tf, fis, 0); + fis[1] &= ~(1 << 7); /* turn off Command FIS bit */ + + writel(1, port_mmio + PORT_CMD_ISSUE); + readl(port_mmio + PORT_CMD_ISSUE); /* flush */ + + /* spec mandates ">= 2ms" before checking status. + * We wait 150ms, because that was the magic delay used for + * ATAPI devices in Hale Landis's ATADRVR, for the period of time + * between when the ATA command register is written, and then + * status is checked. Because waiting for "a while" before + * checking status is fine, post SRST, we perform this magic + * delay here as well. + */ + msleep(150); + + *class = ATA_DEV_NONE; + if (ata_port_online(ap)) { + if (ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT)) { + rc = -EIO; + reason = "device not ready"; + goto fail; + } + *class = ahci_dev_classify(ap); + } + + DPRINTK("EXIT, class=%u\n", *class); + return 0; + + fail_restart: + ahci_start_engine(port_mmio); + fail: + ata_port_printk(ap, KERN_ERR, "softreset failed (%s)\n", reason); + return rc; +} + +static int ahci_hardreset(struct ata_port *ap, unsigned int *class) +{ + struct ahci_port_priv *pp = ap->private_data; + u8 *d2h_fis = pp->rx_fis + RX_FIS_D2H_REG; + struct ata_taskfile tf; + void __iomem *mmio = ap->host_set->mmio_base; + void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no); + int rc; + + DPRINTK("ENTER\n"); + + ahci_stop_engine(port_mmio); + + /* clear D2H reception area to properly wait for D2H FIS */ + ata_tf_init(ap->device, &tf); + tf.command = 0xff; + ata_tf_to_fis(&tf, d2h_fis, 0); + + rc = sata_std_hardreset(ap, class); + + ahci_start_engine(port_mmio); + + if (rc == 0 && ata_port_online(ap)) + *class = ahci_dev_classify(ap); + if (*class == ATA_DEV_UNKNOWN) + *class = ATA_DEV_NONE; + + DPRINTK("EXIT, rc=%d, class=%u\n", rc, *class); + return rc; +} + +static void ahci_postreset(struct ata_port *ap, unsigned int *class) +{ + void __iomem *port_mmio = (void __iomem *) ap->ioaddr.cmd_addr; + u32 new_tmp, tmp; + + ata_std_postreset(ap, class); + + /* Make sure port's ATAPI bit is set appropriately */ + new_tmp = tmp = readl(port_mmio + PORT_CMD); + if (*class == ATA_DEV_ATAPI) + new_tmp |= PORT_CMD_ATAPI; + else + new_tmp &= ~PORT_CMD_ATAPI; + if (new_tmp != tmp) { + writel(new_tmp, port_mmio + PORT_CMD); + readl(port_mmio + PORT_CMD); /* flush */ + } +} + +static u8 ahci_check_status(struct ata_port *ap) +{ + void __iomem *mmio = (void __iomem *) ap->ioaddr.cmd_addr; + + return readl(mmio + PORT_TFDATA) & 0xFF; +} + +static void ahci_tf_read(struct ata_port *ap, struct ata_taskfile *tf) +{ + struct ahci_port_priv *pp = ap->private_data; + u8 *d2h_fis = pp->rx_fis + RX_FIS_D2H_REG; + + ata_tf_from_fis(d2h_fis, tf); +} + +static unsigned int ahci_fill_sg(struct ata_queued_cmd *qc, void *cmd_tbl) +{ + struct scatterlist *sg; + struct ahci_sg *ahci_sg; + unsigned int n_sg = 0; + + VPRINTK("ENTER\n"); + + /* + * Next, the S/G list. + */ + ahci_sg = cmd_tbl + AHCI_CMD_TBL_HDR_SZ; + ata_for_each_sg(sg, qc) { + dma_addr_t addr = sg_dma_address(sg); + u32 sg_len = sg_dma_len(sg); + + ahci_sg->addr = cpu_to_le32(addr & 0xffffffff); + ahci_sg->addr_hi = cpu_to_le32((addr >> 16) >> 16); + ahci_sg->flags_size = cpu_to_le32(sg_len - 1); + + ahci_sg++; + n_sg++; + } + + return n_sg; +} + +static void ahci_qc_prep(struct ata_queued_cmd *qc) +{ + struct ata_port *ap = qc->ap; + struct ahci_port_priv *pp = ap->private_data; + int is_atapi = is_atapi_taskfile(&qc->tf); + void *cmd_tbl; + u32 opts; + const u32 cmd_fis_len = 5; /* five dwords */ + unsigned int n_elem; + + /* + * Fill in command table information. First, the header, + * a SATA Register - Host to Device command FIS. + */ + cmd_tbl = pp->cmd_tbl + qc->tag * AHCI_CMD_TBL_SZ; + + ata_tf_to_fis(&qc->tf, cmd_tbl, 0); + if (is_atapi) { + memset(cmd_tbl + AHCI_CMD_TBL_CDB, 0, 32); + memcpy(cmd_tbl + AHCI_CMD_TBL_CDB, qc->cdb, qc->dev->cdb_len); + } + + n_elem = 0; + if (qc->flags & ATA_QCFLAG_DMAMAP) + n_elem = ahci_fill_sg(qc, cmd_tbl); + + /* + * Fill in command slot information. + */ + opts = cmd_fis_len | n_elem << 16; + if (qc->tf.flags & ATA_TFLAG_WRITE) + opts |= AHCI_CMD_WRITE; + if (is_atapi) + opts |= AHCI_CMD_ATAPI | AHCI_CMD_PREFETCH; + + ahci_fill_cmd_slot(pp, qc->tag, opts); +} + +static void ahci_error_intr(struct ata_port *ap, u32 irq_stat) +{ + struct ahci_port_priv *pp = ap->private_data; + struct ata_eh_info *ehi = &ap->eh_info; + unsigned int err_mask = 0, action = 0; + struct ata_queued_cmd *qc; + u32 serror; + + ata_ehi_clear_desc(ehi); + + /* AHCI needs SError cleared; otherwise, it might lock up */ + serror = ahci_scr_read(ap, SCR_ERROR); + ahci_scr_write(ap, SCR_ERROR, serror); + + /* analyze @irq_stat */ + ata_ehi_push_desc(ehi, "irq_stat 0x%08x", irq_stat); + + if (irq_stat & PORT_IRQ_TF_ERR) + err_mask |= AC_ERR_DEV; + + if (irq_stat & (PORT_IRQ_HBUS_ERR | PORT_IRQ_HBUS_DATA_ERR)) { + err_mask |= AC_ERR_HOST_BUS; + action |= ATA_EH_SOFTRESET; + } + + if (irq_stat & PORT_IRQ_IF_ERR) { + err_mask |= AC_ERR_ATA_BUS; + action |= ATA_EH_SOFTRESET; + ata_ehi_push_desc(ehi, ", interface fatal error"); + } + + if (irq_stat & (PORT_IRQ_CONNECT | PORT_IRQ_PHYRDY)) { + ata_ehi_hotplugged(ehi); + ata_ehi_push_desc(ehi, ", %s", irq_stat & PORT_IRQ_CONNECT ? + "connection status changed" : "PHY RDY changed"); + } + + if (irq_stat & PORT_IRQ_UNK_FIS) { + u32 *unk = (u32 *)(pp->rx_fis + RX_FIS_UNK); + + err_mask |= AC_ERR_HSM; + action |= ATA_EH_SOFTRESET; + ata_ehi_push_desc(ehi, ", unknown FIS %08x %08x %08x %08x", + unk[0], unk[1], unk[2], unk[3]); + } + + /* okay, let's hand over to EH */ + ehi->serror |= serror; + ehi->action |= action; + + qc = ata_qc_from_tag(ap, ap->active_tag); + if (qc) + qc->err_mask |= err_mask; + else + ehi->err_mask |= err_mask; + + if (irq_stat & PORT_IRQ_FREEZE) + ata_port_freeze(ap); + else + ata_port_abort(ap); +} + +static void ahci_host_intr(struct ata_port *ap) +{ + void __iomem *mmio = ap->host_set->mmio_base; + void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no); + struct ata_eh_info *ehi = &ap->eh_info; + u32 status, qc_active; + int rc; + + status = readl(port_mmio + PORT_IRQ_STAT); + writel(status, port_mmio + PORT_IRQ_STAT); + + if (unlikely(status & PORT_IRQ_ERROR)) { + ahci_error_intr(ap, status); + return; + } + + if (ap->sactive) + qc_active = readl(port_mmio + PORT_SCR_ACT); + else + qc_active = readl(port_mmio + PORT_CMD_ISSUE); + + rc = ata_qc_complete_multiple(ap, qc_active, NULL); + if (rc > 0) + return; + if (rc < 0) { + ehi->err_mask |= AC_ERR_HSM; + ehi->action |= ATA_EH_SOFTRESET; + ata_port_freeze(ap); + return; + } + + /* hmmm... a spurious interupt */ + + /* some devices send D2H reg with I bit set during NCQ command phase */ + if (ap->sactive && status & PORT_IRQ_D2H_REG_FIS) + return; + + /* ignore interim PIO setup fis interrupts */ + if (ata_tag_valid(ap->active_tag) && (status & PORT_IRQ_PIOS_FIS)) + return; + + if (ata_ratelimit()) + ata_port_printk(ap, KERN_INFO, "spurious interrupt " + "(irq_stat 0x%x active_tag %d sactive 0x%x)\n", + status, ap->active_tag, ap->sactive); +} + +static void ahci_irq_clear(struct ata_port *ap) +{ + /* TODO */ +} + +static irqreturn_t ahci_interrupt(int irq, void *dev_instance, struct pt_regs *regs) +{ + struct ata_host_set *host_set = dev_instance; + struct ahci_host_priv *hpriv; + unsigned int i, handled = 0; + void __iomem *mmio; + u32 irq_stat, irq_ack = 0; + + VPRINTK("ENTER\n"); + + hpriv = host_set->private_data; + mmio = host_set->mmio_base; + + /* sigh. 0xffffffff is a valid return from h/w */ + irq_stat = readl(mmio + HOST_IRQ_STAT); + irq_stat &= hpriv->port_map; + if (!irq_stat) + return IRQ_NONE; + + spin_lock(&host_set->lock); + + for (i = 0; i < host_set->n_ports; i++) { + struct ata_port *ap; + + if (!(irq_stat & (1 << i))) + continue; + + ap = host_set->ports[i]; + if (ap) { + ahci_host_intr(ap); + VPRINTK("port %u\n", i); + } else { + VPRINTK("port %u (no irq)\n", i); + if (ata_ratelimit()) + dev_printk(KERN_WARNING, host_set->dev, + "interrupt on disabled port %u\n", i); + } + + irq_ack |= (1 << i); + } + + if (irq_ack) { + writel(irq_ack, mmio + HOST_IRQ_STAT); + handled = 1; + } + + spin_unlock(&host_set->lock); + + VPRINTK("EXIT\n"); + + return IRQ_RETVAL(handled); +} + +static unsigned int ahci_qc_issue(struct ata_queued_cmd *qc) +{ + struct ata_port *ap = qc->ap; + void __iomem *port_mmio = (void __iomem *) ap->ioaddr.cmd_addr; + + if (qc->tf.protocol == ATA_PROT_NCQ) + writel(1 << qc->tag, port_mmio + PORT_SCR_ACT); + writel(1 << qc->tag, port_mmio + PORT_CMD_ISSUE); readl(port_mmio + PORT_CMD_ISSUE); /* flush */ return 0; } +static void ahci_freeze(struct ata_port *ap) +{ + void __iomem *mmio = ap->host_set->mmio_base; + void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no); + + /* turn IRQ off */ + writel(0, port_mmio + PORT_IRQ_MASK); +} + +static void ahci_thaw(struct ata_port *ap) +{ + void __iomem *mmio = ap->host_set->mmio_base; + void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no); + u32 tmp; + + /* clear IRQ */ + tmp = readl(port_mmio + PORT_IRQ_STAT); + writel(tmp, port_mmio + PORT_IRQ_STAT); + writel(1 << ap->id, mmio + HOST_IRQ_STAT); + + /* turn IRQ back on */ + writel(DEF_PORT_IRQ, port_mmio + PORT_IRQ_MASK); +} + +static void ahci_error_handler(struct ata_port *ap) +{ + void __iomem *mmio = ap->host_set->mmio_base; + void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no); + + if (!(ap->pflags & ATA_PFLAG_FROZEN)) { + /* restart engine */ + ahci_stop_engine(port_mmio); + ahci_start_engine(port_mmio); + } + + /* perform recovery */ + ata_do_eh(ap, ahci_prereset, ahci_softreset, ahci_hardreset, + ahci_postreset); +} + +static void ahci_post_internal_cmd(struct ata_queued_cmd *qc) +{ + struct ata_port *ap = qc->ap; + void __iomem *mmio = ap->host_set->mmio_base; + void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no); + + if (qc->flags & ATA_QCFLAG_FAILED) + qc->err_mask |= AC_ERR_OTHER; + + if (qc->err_mask) { + /* make DMA engine forget about the failed command */ + ahci_stop_engine(port_mmio); + ahci_start_engine(port_mmio); + } +} + +static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg) +{ + struct ahci_host_priv *hpriv = ap->host_set->private_data; + struct ahci_port_priv *pp = ap->private_data; + void __iomem *mmio = ap->host_set->mmio_base; + void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no); + const char *emsg = NULL; + int rc; + + rc = ahci_deinit_port(port_mmio, hpriv->cap, &emsg); + if (rc) { + ata_port_printk(ap, KERN_ERR, "%s (%d)\n", emsg, rc); + ahci_init_port(port_mmio, hpriv->cap, + pp->cmd_slot_dma, pp->rx_fis_dma); + } + + return rc; +} + +static int ahci_port_resume(struct ata_port *ap) +{ + struct ahci_port_priv *pp = ap->private_data; + struct ahci_host_priv *hpriv = ap->host_set->private_data; + void __iomem *mmio = ap->host_set->mmio_base; + void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no); + + ahci_init_port(port_mmio, hpriv->cap, pp->cmd_slot_dma, pp->rx_fis_dma); + + return 0; +} + +static int ahci_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg) +{ + struct ata_host_set *host_set = dev_get_drvdata(&pdev->dev); + void __iomem *mmio = host_set->mmio_base; + u32 ctl; + + if (mesg.event == PM_EVENT_SUSPEND) { + /* AHCI spec rev1.1 section 8.3.3: + * Software must disable interrupts prior to requesting a + * transition of the HBA to D3 state. + */ + ctl = readl(mmio + HOST_CTL); + ctl &= ~HOST_IRQ_EN; + writel(ctl, mmio + HOST_CTL); + readl(mmio + HOST_CTL); /* flush */ + } + + return ata_pci_device_suspend(pdev, mesg); +} + +static int ahci_pci_device_resume(struct pci_dev *pdev) +{ + struct ata_host_set *host_set = dev_get_drvdata(&pdev->dev); + struct ahci_host_priv *hpriv = host_set->private_data; + void __iomem *mmio = host_set->mmio_base; + int rc; + + ata_pci_device_do_resume(pdev); + + if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) { + rc = ahci_reset_controller(mmio, pdev); + if (rc) + return rc; + + ahci_init_controller(mmio, pdev, host_set->n_ports, hpriv->cap); + } + + ata_host_set_resume(host_set); + + return 0; +} + +static int ahci_port_start(struct ata_port *ap) +{ + struct device *dev = ap->host_set->dev; + struct ahci_host_priv *hpriv = ap->host_set->private_data; + struct ahci_port_priv *pp; + void __iomem *mmio = ap->host_set->mmio_base; + void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no); + void *mem; + dma_addr_t mem_dma; + int rc; + + pp = kmalloc(sizeof(*pp), GFP_KERNEL); + if (!pp) + return -ENOMEM; + memset(pp, 0, sizeof(*pp)); + + rc = ata_pad_alloc(ap, dev); + if (rc) { + kfree(pp); + return rc; + } + + mem = dma_alloc_coherent(dev, AHCI_PORT_PRIV_DMA_SZ, &mem_dma, GFP_KERNEL); + if (!mem) { + ata_pad_free(ap, dev); + kfree(pp); + return -ENOMEM; + } + memset(mem, 0, AHCI_PORT_PRIV_DMA_SZ); + + /* + * First item in chunk of DMA memory: 32-slot command table, + * 32 bytes each in size + */ + pp->cmd_slot = mem; + pp->cmd_slot_dma = mem_dma; + + mem += AHCI_CMD_SLOT_SZ; + mem_dma += AHCI_CMD_SLOT_SZ; + + /* + * Second item: Received-FIS area + */ + pp->rx_fis = mem; + pp->rx_fis_dma = mem_dma; + + mem += AHCI_RX_FIS_SZ; + mem_dma += AHCI_RX_FIS_SZ; + + /* + * Third item: data area for storing a single command + * and its scatter-gather table + */ + pp->cmd_tbl = mem; + pp->cmd_tbl_dma = mem_dma; + + ap->private_data = pp; + + /* initialize port */ + ahci_init_port(port_mmio, hpriv->cap, pp->cmd_slot_dma, pp->rx_fis_dma); + + return 0; +} + +static void ahci_port_stop(struct ata_port *ap) +{ + struct device *dev = ap->host_set->dev; + struct ahci_host_priv *hpriv = ap->host_set->private_data; + struct ahci_port_priv *pp = ap->private_data; + void __iomem *mmio = ap->host_set->mmio_base; + void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no); + const char *emsg = NULL; + int rc; + + /* de-initialize port */ + rc = ahci_deinit_port(port_mmio, hpriv->cap, &emsg); + if (rc) + ata_port_printk(ap, KERN_WARNING, "%s (%d)\n", emsg, rc); + + ap->private_data = NULL; + dma_free_coherent(dev, AHCI_PORT_PRIV_DMA_SZ, + pp->cmd_slot, pp->cmd_slot_dma); + ata_pad_free(ap, dev); + kfree(pp); +} + static void ahci_setup_port(struct ata_ioports *port, unsigned long base, unsigned int port_idx) { @@ -737,44 +1381,12 @@ static int ahci_host_init(struct ata_probe_ent *probe_ent) struct ahci_host_priv *hpriv = probe_ent->private_data; struct pci_dev *pdev = to_pci_dev(probe_ent->dev); void __iomem *mmio = probe_ent->mmio_base; - u32 tmp, cap_save; - u16 tmp16; - unsigned int i, j, using_dac; + unsigned int i, using_dac; int rc; - void __iomem *port_mmio; - - cap_save = readl(mmio + HOST_CAP); - cap_save &= ( (1<<28) | (1<<17) ); - cap_save |= (1 << 27); - - /* global controller reset */ - tmp = readl(mmio + HOST_CTL); - if ((tmp & HOST_RESET) == 0) { - writel(tmp | HOST_RESET, mmio + HOST_CTL); - readl(mmio + HOST_CTL); /* flush */ - } - - /* reset must complete within 1 second, or - * the hardware should be considered fried. - */ - ssleep(1); - - tmp = readl(mmio + HOST_CTL); - if (tmp & HOST_RESET) { - printk(KERN_ERR DRV_NAME "(%s): controller reset failed (0x%x)\n", - pci_name(pdev), tmp); - return -EIO; - } - - writel(HOST_AHCI_EN, mmio + HOST_CTL); - (void) readl(mmio + HOST_CTL); /* flush */ - writel(cap_save, mmio + HOST_CAP); - writel(0xf, mmio + HOST_PORTS_IMPL); - (void) readl(mmio + HOST_PORTS_IMPL); /* flush */ - pci_read_config_word(pdev, 0x92, &tmp16); - tmp16 |= 0xf; - pci_write_config_word(pdev, 0x92, tmp16); + rc = ahci_reset_controller(mmio, pdev); + if (rc) + return rc; hpriv->cap = readl(mmio + HOST_CAP); hpriv->port_map = readl(mmio + HOST_PORTS_IMPL); @@ -790,111 +1402,41 @@ static int ahci_host_init(struct ata_probe_ent *probe_ent) if (rc) { rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK); if (rc) { - printk(KERN_ERR DRV_NAME "(%s): 64-bit DMA enable failed\n", - pci_name(pdev)); + dev_printk(KERN_ERR, &pdev->dev, + "64-bit DMA enable failed\n"); return rc; } } - - hpriv->flags |= HOST_CAP_64; } else { rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK); if (rc) { - printk(KERN_ERR DRV_NAME "(%s): 32-bit DMA enable failed\n", - pci_name(pdev)); + dev_printk(KERN_ERR, &pdev->dev, + "32-bit DMA enable failed\n"); return rc; } rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK); if (rc) { - printk(KERN_ERR DRV_NAME "(%s): 32-bit consistent DMA enable failed\n", - pci_name(pdev)); + dev_printk(KERN_ERR, &pdev->dev, + "32-bit consistent DMA enable failed\n"); return rc; } } - for (i = 0; i < probe_ent->n_ports; i++) { -#if 0 /* BIOSen initialize this incorrectly */ - if (!(hpriv->port_map & (1 << i))) - continue; -#endif - - port_mmio = ahci_port_base(mmio, i); - VPRINTK("mmio %p port_mmio %p\n", mmio, port_mmio); - - ahci_setup_port(&probe_ent->port[i], - (unsigned long) mmio, i); - - /* make sure port is not active */ - tmp = readl(port_mmio + PORT_CMD); - VPRINTK("PORT_CMD 0x%x\n", tmp); - if (tmp & (PORT_CMD_LIST_ON | PORT_CMD_FIS_ON | - PORT_CMD_FIS_RX | PORT_CMD_START)) { - tmp &= ~(PORT_CMD_LIST_ON | PORT_CMD_FIS_ON | - PORT_CMD_FIS_RX | PORT_CMD_START); - writel(tmp, port_mmio + PORT_CMD); - readl(port_mmio + PORT_CMD); /* flush */ - - /* spec says 500 msecs for each bit, so - * this is slightly incorrect. - */ - msleep(500); - } - - writel(PORT_CMD_SPIN_UP, port_mmio + PORT_CMD); - - j = 0; - while (j < 100) { - msleep(10); - tmp = readl(port_mmio + PORT_SCR_STAT); - if ((tmp & 0xf) == 0x3) - break; - j++; - } - - tmp = readl(port_mmio + PORT_SCR_ERR); - VPRINTK("PORT_SCR_ERR 0x%x\n", tmp); - writel(tmp, port_mmio + PORT_SCR_ERR); + for (i = 0; i < probe_ent->n_ports; i++) + ahci_setup_port(&probe_ent->port[i], (unsigned long) mmio, i); - /* ack any pending irq events for this port */ - tmp = readl(port_mmio + PORT_IRQ_STAT); - VPRINTK("PORT_IRQ_STAT 0x%x\n", tmp); - if (tmp) - writel(tmp, port_mmio + PORT_IRQ_STAT); - - writel(1 << i, mmio + HOST_IRQ_STAT); - - /* set irq mask (enables interrupts) */ - writel(DEF_PORT_IRQ, port_mmio + PORT_IRQ_MASK); - } - - tmp = readl(mmio + HOST_CTL); - VPRINTK("HOST_CTL 0x%x\n", tmp); - writel(tmp | HOST_IRQ_EN, mmio + HOST_CTL); - tmp = readl(mmio + HOST_CTL); - VPRINTK("HOST_CTL 0x%x\n", tmp); + ahci_init_controller(mmio, pdev, probe_ent->n_ports, hpriv->cap); pci_set_master(pdev); return 0; } -/* move to PCI layer, integrate w/ MSI stuff */ -static void pci_enable_intx(struct pci_dev *pdev) -{ - u16 pci_command; - - pci_read_config_word(pdev, PCI_COMMAND, &pci_command); - if (pci_command & PCI_COMMAND_INTX_DISABLE) { - pci_command &= ~PCI_COMMAND_INTX_DISABLE; - pci_write_config_word(pdev, PCI_COMMAND, pci_command); - } -} - static void ahci_print_info(struct ata_probe_ent *probe_ent) { struct ahci_host_priv *hpriv = probe_ent->private_data; struct pci_dev *pdev = to_pci_dev(probe_ent->dev); - void *mmio = probe_ent->mmio_base; + void __iomem *mmio = probe_ent->mmio_base; u32 vers, cap, impl, speed; const char *speed_s; u16 cc; @@ -922,10 +1464,10 @@ static void ahci_print_info(struct ata_probe_ent *probe_ent) else scc_s = "unknown"; - printk(KERN_INFO DRV_NAME "(%s) AHCI %02x%02x.%02x%02x " + dev_printk(KERN_INFO, &pdev->dev, + "AHCI %02x%02x.%02x%02x " "%u slots %u ports %s Gbps 0x%x impl %s mode\n" , - pci_name(pdev), (vers >> 24) & 0xff, (vers >> 16) & 0xff, @@ -938,11 +1480,11 @@ static void ahci_print_info(struct ata_probe_ent *probe_ent) impl, scc_s); - printk(KERN_INFO DRV_NAME "(%s) flags: " + dev_printk(KERN_INFO, &pdev->dev, + "flags: " "%s%s%s%s%s%s" "%s%s%s%s%s%s%s\n" , - pci_name(pdev), cap & (1 << 31) ? "64bit " : "", cap & (1 << 30) ? "ncq " : "", @@ -967,15 +1509,28 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) struct ata_probe_ent *probe_ent = NULL; struct ahci_host_priv *hpriv; unsigned long base; - void *mmio_base; + void __iomem *mmio_base; unsigned int board_idx = (unsigned int) ent->driver_data; - int pci_dev_busy = 0; + int have_msi, pci_dev_busy = 0; int rc; VPRINTK("ENTER\n"); + WARN_ON(ATA_MAX_QUEUE > AHCI_MAX_CMDS); + if (!printed_version++) - printk(KERN_DEBUG DRV_NAME " version " DRV_VERSION "\n"); + dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n"); + + /* JMicron-specific fixup: make sure we're in AHCI mode */ + /* This is protected from races with ata_jmicron by the pci probe + locking */ + if (pdev->vendor == PCI_VENDOR_ID_JMICRON) { + /* AHCI enable, AHCI on function 0 */ + pci_write_config_byte(pdev, 0x41, 0xa1); + /* Function 1 is the PATA controller */ + if (PCI_FUNC(pdev->devfn)) + return -ENODEV; + } rc = pci_enable_device(pdev); if (rc) @@ -987,20 +1542,24 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) goto err_out; } - pci_enable_intx(pdev); + if (pci_enable_msi(pdev) == 0) + have_msi = 1; + else { + pci_intx(pdev, 1); + have_msi = 0; + } probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL); if (probe_ent == NULL) { rc = -ENOMEM; - goto err_out_regions; + goto err_out_msi; } memset(probe_ent, 0, sizeof(*probe_ent)); probe_ent->dev = pci_dev_to_dev(pdev); INIT_LIST_HEAD(&probe_ent->node); - mmio_base = ioremap(pci_resource_start(pdev, AHCI_PCI_BAR), - pci_resource_len(pdev, AHCI_PCI_BAR)); + mmio_base = pci_iomap(pdev, AHCI_PCI_BAR, 0); if (mmio_base == NULL) { rc = -ENOMEM; goto err_out_free_ent; @@ -1021,15 +1580,22 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) probe_ent->port_ops = ahci_port_info[board_idx].port_ops; probe_ent->irq = pdev->irq; - probe_ent->irq_flags = SA_SHIRQ; + probe_ent->irq_flags = IRQF_SHARED; probe_ent->mmio_base = mmio_base; probe_ent->private_data = hpriv; + if (have_msi) + hpriv->flags |= AHCI_FLAG_MSI; + /* initialize adapter */ rc = ahci_host_init(probe_ent); if (rc) goto err_out_hpriv; + if (!(probe_ent->host_flags & AHCI_FLAG_NO_NCQ) && + (hpriv->cap & HOST_CAP_NCQ)) + probe_ent->host_flags |= ATA_FLAG_NCQ; + ahci_print_info(probe_ent); /* FIXME: check ata_device_add return value */ @@ -1041,10 +1607,14 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) err_out_hpriv: kfree(hpriv); err_out_iounmap: - iounmap(mmio_base); + pci_iounmap(pdev, mmio_base); err_out_free_ent: kfree(probe_ent); -err_out_regions: +err_out_msi: + if (have_msi) + pci_disable_msi(pdev); + else + pci_intx(pdev, 0); pci_release_regions(pdev); err_out: if (!pci_dev_busy) @@ -1052,13 +1622,45 @@ err_out: return rc; } +static void ahci_remove_one (struct pci_dev *pdev) +{ + struct device *dev = pci_dev_to_dev(pdev); + struct ata_host_set *host_set = dev_get_drvdata(dev); + struct ahci_host_priv *hpriv = host_set->private_data; + unsigned int i; + int have_msi; + + for (i = 0; i < host_set->n_ports; i++) + ata_port_detach(host_set->ports[i]); + + have_msi = hpriv->flags & AHCI_FLAG_MSI; + free_irq(host_set->irq, host_set); + + for (i = 0; i < host_set->n_ports; i++) { + struct ata_port *ap = host_set->ports[i]; + + ata_scsi_release(ap->host); + scsi_host_put(ap->host); + } + + kfree(hpriv); + pci_iounmap(pdev, host_set->mmio_base); + kfree(host_set); + + if (have_msi) + pci_disable_msi(pdev); + else + pci_intx(pdev, 0); + pci_release_regions(pdev); + pci_disable_device(pdev); + dev_set_drvdata(dev, NULL); +} static int __init ahci_init(void) { return pci_module_init(&ahci_pci_driver); } - static void __exit ahci_exit(void) { pci_unregister_driver(&ahci_pci_driver); @@ -1069,6 +1671,7 @@ MODULE_AUTHOR("Jeff Garzik"); MODULE_DESCRIPTION("AHCI SATA low-level driver"); MODULE_LICENSE("GPL"); MODULE_DEVICE_TABLE(pci, ahci_pci_tbl); +MODULE_VERSION(DRV_VERSION); module_init(ahci_init); module_exit(ahci_exit); diff --git a/drivers/scsi/aic7xxx/aic7770.c b/drivers/scsi/aic7xxx/aic7770.c index 527efd36f..c4d17231c 100644 --- a/drivers/scsi/aic7xxx/aic7770.c +++ b/drivers/scsi/aic7xxx/aic7770.c @@ -107,7 +107,7 @@ struct aic7770_identity aic7770_ident_table[] = ahc_aic7770_EISA_setup } }; -const int ahc_num_aic7770_devs = NUM_ELEMENTS(aic7770_ident_table); +const int ahc_num_aic7770_devs = ARRAY_SIZE(aic7770_ident_table); struct aic7770_identity * aic7770_find_device(uint32_t id) diff --git a/drivers/scsi/aic7xxx/aic7770_osm.c b/drivers/scsi/aic7xxx/aic7770_osm.c index d754b3267..867cbe235 100644 --- a/drivers/scsi/aic7xxx/aic7770_osm.c +++ b/drivers/scsi/aic7xxx/aic7770_osm.c @@ -65,7 +65,7 @@ aic7770_map_int(struct ahc_softc *ahc, u_int irq) shared = 0; if ((ahc->flags & AHC_EDGE_INTERRUPT) == 0) - shared = SA_SHIRQ; + shared = IRQF_SHARED; error = request_irq(irq, ahc_linux_isr, shared, "aic7xxx", ahc); if (error == 0) diff --git a/drivers/scsi/aic7xxx/aic79xx.h b/drivers/scsi/aic7xxx/aic79xx.h index bb5166da4..df3346b5c 100644 --- a/drivers/scsi/aic7xxx/aic79xx.h +++ b/drivers/scsi/aic7xxx/aic79xx.h @@ -68,8 +68,6 @@ struct scb_platform_data; #define FALSE 0 #endif -#define NUM_ELEMENTS(array) (sizeof(array) / sizeof(*array)) - #define ALL_CHANNELS '\0' #define ALL_TARGETS_MASK 0xFFFF #define INITIATOR_WILDCARD (~0) @@ -1489,6 +1487,7 @@ typedef enum { } ahd_queue_alg; void ahd_set_tags(struct ahd_softc *ahd, + struct scsi_cmnd *cmd, struct ahd_devinfo *devinfo, ahd_queue_alg alg); diff --git a/drivers/scsi/aic7xxx/aic79xx_core.c b/drivers/scsi/aic7xxx/aic79xx_core.c index 08771f6f6..653818d2f 100644 --- a/drivers/scsi/aic7xxx/aic79xx_core.c +++ b/drivers/scsi/aic7xxx/aic79xx_core.c @@ -59,7 +59,7 @@ char *ahd_chip_names[] = "aic7902", "aic7901A" }; -static const u_int num_chip_names = NUM_ELEMENTS(ahd_chip_names); +static const u_int num_chip_names = ARRAY_SIZE(ahd_chip_names); /* * Hardware error codes. @@ -77,7 +77,7 @@ static struct ahd_hard_error_entry ahd_hard_errors[] = { { MPARERR, "Scratch or SCB Memory Parity Error" }, { CIOPARERR, "CIOBUS Parity Error" }, }; -static const u_int num_errors = NUM_ELEMENTS(ahd_hard_errors); +static const u_int num_errors = ARRAY_SIZE(ahd_hard_errors); static struct ahd_phase_table_entry ahd_phase_table[] = { @@ -97,7 +97,7 @@ static struct ahd_phase_table_entry ahd_phase_table[] = * In most cases we only wish to itterate over real phases, so * exclude the last element from the count. */ -static const u_int num_phases = NUM_ELEMENTS(ahd_phase_table) - 1; +static const u_int num_phases = ARRAY_SIZE(ahd_phase_table) - 1; /* Our Sequencer Program */ #include "aic79xx_seq.h" @@ -1090,7 +1090,7 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) /* Notify XPT */ ahd_send_async(ahd, devinfo.channel, devinfo.target, - CAM_LUN_WILDCARD, AC_SENT_BDR, NULL); + CAM_LUN_WILDCARD, AC_SENT_BDR); /* * Allow the sequencer to continue with @@ -3062,7 +3062,7 @@ ahd_set_syncrate(struct ahd_softc *ahd, struct ahd_devinfo *devinfo, tinfo->curr.ppr_options = ppr_options; ahd_send_async(ahd, devinfo->channel, devinfo->target, - CAM_LUN_WILDCARD, AC_TRANSFER_NEG, NULL); + CAM_LUN_WILDCARD, AC_TRANSFER_NEG); if (bootverbose) { if (offset != 0) { int options; @@ -3184,7 +3184,7 @@ ahd_set_width(struct ahd_softc *ahd, struct ahd_devinfo *devinfo, tinfo->curr.width = width; ahd_send_async(ahd, devinfo->channel, devinfo->target, - CAM_LUN_WILDCARD, AC_TRANSFER_NEG, NULL); + CAM_LUN_WILDCARD, AC_TRANSFER_NEG); if (bootverbose) { printf("%s: target %d using %dbit transfers\n", ahd_name(ahd), devinfo->target, @@ -3211,12 +3211,14 @@ ahd_set_width(struct ahd_softc *ahd, struct ahd_devinfo *devinfo, * Update the current state of tagged queuing for a given target. */ void -ahd_set_tags(struct ahd_softc *ahd, struct ahd_devinfo *devinfo, - ahd_queue_alg alg) +ahd_set_tags(struct ahd_softc *ahd, struct scsi_cmnd *cmd, + struct ahd_devinfo *devinfo, ahd_queue_alg alg) { - ahd_platform_set_tags(ahd, devinfo, alg); + struct scsi_device *sdev = cmd->device; + + ahd_platform_set_tags(ahd, sdev, devinfo, alg); ahd_send_async(ahd, devinfo->channel, devinfo->target, - devinfo->lun, AC_TRANSFER_NEG, &alg); + devinfo->lun, AC_TRANSFER_NEG); } static void @@ -4746,7 +4748,7 @@ ahd_handle_msg_reject(struct ahd_softc *ahd, struct ahd_devinfo *devinfo) printf("(%s:%c:%d:%d): refuses tagged commands. " "Performing non-tagged I/O\n", ahd_name(ahd), devinfo->channel, devinfo->target, devinfo->lun); - ahd_set_tags(ahd, devinfo, AHD_QUEUE_NONE); + ahd_set_tags(ahd, scb->io_ctx, devinfo, AHD_QUEUE_NONE); mask = ~0x23; } else { printf("(%s:%c:%d:%d): refuses %s tagged commands. " @@ -4754,7 +4756,7 @@ ahd_handle_msg_reject(struct ahd_softc *ahd, struct ahd_devinfo *devinfo) ahd_name(ahd), devinfo->channel, devinfo->target, devinfo->lun, tag_type == MSG_ORDERED_TASK ? "ordered" : "head of queue"); - ahd_set_tags(ahd, devinfo, AHD_QUEUE_BASIC); + ahd_set_tags(ahd, scb->io_ctx, devinfo, AHD_QUEUE_BASIC); mask = ~0x03; } @@ -5098,7 +5100,7 @@ ahd_handle_devreset(struct ahd_softc *ahd, struct ahd_devinfo *devinfo, if (status != CAM_SEL_TIMEOUT) ahd_send_async(ahd, devinfo->channel, devinfo->target, - CAM_LUN_WILDCARD, AC_SENT_BDR, NULL); + CAM_LUN_WILDCARD, AC_SENT_BDR); if (message != NULL && bootverbose) printf("%s: %s on %c:%d. %d SCBs aborted\n", ahd_name(ahd), @@ -7259,7 +7261,7 @@ ahd_qinfifo_count(struct ahd_softc *ahd) return (wrap_qinfifonext - wrap_qinpos); else return (wrap_qinfifonext - + NUM_ELEMENTS(ahd->qinfifo) - wrap_qinpos); + + ARRAY_SIZE(ahd->qinfifo) - wrap_qinpos); } void @@ -7287,7 +7289,7 @@ ahd_reset_cmds_pending(struct ahd_softc *ahd) ahd->flags &= ~AHD_UPDATE_PEND_CMDS; } -void +static void ahd_done_with_status(struct ahd_softc *ahd, struct scb *scb, uint32_t status) { cam_status ostat; @@ -7952,7 +7954,7 @@ ahd_reset_channel(struct ahd_softc *ahd, char channel, int initiate_reset) #endif /* Notify the XPT that a bus reset occurred */ ahd_send_async(ahd, devinfo.channel, CAM_TARGET_WILDCARD, - CAM_LUN_WILDCARD, AC_BUS_RESET, NULL); + CAM_LUN_WILDCARD, AC_BUS_RESET); /* * Revert to async/narrow transfers until we renegotiate. @@ -8619,7 +8621,7 @@ ahd_check_patch(struct ahd_softc *ahd, struct patch **start_patch, struct patch *last_patch; u_int num_patches; - num_patches = sizeof(patches)/sizeof(struct patch); + num_patches = ARRAY_SIZE(patches); last_patch = &patches[num_patches]; cur_patch = *start_patch; @@ -9396,8 +9398,8 @@ ahd_find_tmode_devs(struct ahd_softc *ahd, struct cam_sim *sim, union ccb *ccb, } else { u_int max_id; - max_id = (ahd->features & AHD_WIDE) ? 15 : 7; - if (ccb->ccb_h.target_id > max_id) + max_id = (ahd->features & AHD_WIDE) ? 16 : 8; + if (ccb->ccb_h.target_id >= max_id) return (CAM_TID_INVALID); if (ccb->ccb_h.target_lun >= AHD_NUM_LUNS) diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.c b/drivers/scsi/aic7xxx/aic79xx_osm.c index 66e4a47bb..07d51b870 100644 --- a/drivers/scsi/aic7xxx/aic79xx_osm.c +++ b/drivers/scsi/aic7xxx/aic79xx_osm.c @@ -242,25 +242,6 @@ ahd_print_path(struct ahd_softc *ahd, struct scb *scb) */ static uint32_t aic79xx_no_reset; -/* - * Certain PCI motherboards will scan PCI devices from highest to lowest, - * others scan from lowest to highest, and they tend to do all kinds of - * strange things when they come into contact with PCI bridge chips. The - * net result of all this is that the PCI card that is actually used to boot - * the machine is very hard to detect. Most motherboards go from lowest - * PCI slot number to highest, and the first SCSI controller found is the - * one you boot from. The only exceptions to this are when a controller - * has its BIOS disabled. So, we by default sort all of our SCSI controllers - * from lowest PCI slot number to highest PCI slot number. We also force - * all controllers with their BIOS disabled to the end of the list. This - * works on *almost* all computers. Where it doesn't work, we have this - * option. Setting this option to non-0 will reverse the order of the sort - * to highest first, then lowest, but will still leave cards with their BIOS - * disabled at the very end. That should fix everyone up unless there are - * really strange cirumstances. - */ -static uint32_t aic79xx_reverse_scan; - /* * Should we force EXTENDED translation on a controller. * 0 == Use whatever is in the SEEPROM or default to off @@ -350,7 +331,6 @@ MODULE_PARM_DESC(aic79xx, " periodically to prevent tag starvation.\n" " This may be required by some older disk\n" " or drives/RAID arrays.\n" -" reverse_scan Sort PCI devices highest Bus/Slot to lowest\n" " tag_info: Set per-target tag depth\n" " global_tag_depth: Global tag depth for all targets on all buses\n" " slewrate:Set the signal slew rate (0-15).\n" @@ -484,7 +464,6 @@ ahd_linux_target_alloc(struct scsi_target *starget) struct seeprom_config *sc = ahd->seep_config; unsigned long flags; struct scsi_target **ahd_targp = ahd_linux_target_in_softc(starget); - struct ahd_linux_target *targ = scsi_transport_target_data(starget); struct ahd_devinfo devinfo; struct ahd_initiator_tinfo *tinfo; struct ahd_tmode_tstate *tstate; @@ -495,7 +474,6 @@ ahd_linux_target_alloc(struct scsi_target *starget) BUG_ON(*ahd_targp != NULL); *ahd_targp = starget; - memset(targ, 0, sizeof(*targ)); if (sc) { int flags = sc->device_flags[starget->id]; @@ -551,15 +529,11 @@ ahd_linux_slave_alloc(struct scsi_device *sdev) { struct ahd_softc *ahd = *((struct ahd_softc **)sdev->host->hostdata); - struct scsi_target *starget = sdev->sdev_target; - struct ahd_linux_target *targ = scsi_transport_target_data(starget); struct ahd_linux_device *dev; if (bootverbose) printf("%s: Slave Alloc %d\n", ahd_name(ahd), sdev->id); - BUG_ON(targ->sdev[sdev->lun] != NULL); - dev = scsi_transport_device_data(sdev); memset(dev, 0, sizeof(*dev)); @@ -576,8 +550,6 @@ ahd_linux_slave_alloc(struct scsi_device *sdev) */ dev->maxtags = 0; - targ->sdev[sdev->lun] = sdev; - return (0); } @@ -599,23 +571,6 @@ ahd_linux_slave_configure(struct scsi_device *sdev) return 0; } -static void -ahd_linux_slave_destroy(struct scsi_device *sdev) -{ - struct ahd_softc *ahd; - struct ahd_linux_device *dev = scsi_transport_device_data(sdev); - struct ahd_linux_target *targ = scsi_transport_target_data(sdev->sdev_target); - - ahd = *((struct ahd_softc **)sdev->host->hostdata); - if (bootverbose) - printf("%s: Slave Destroy %d\n", ahd_name(ahd), sdev->id); - - BUG_ON(dev->active); - - targ->sdev[sdev->lun] = NULL; - -} - #if defined(__i386__) /* * Return the disk geometry for the given SCSI device. @@ -691,7 +646,7 @@ ahd_linux_dev_reset(struct scsi_cmnd *cmd) struct ahd_initiator_tinfo *tinfo; struct ahd_tmode_tstate *tstate; unsigned long flags; - DECLARE_COMPLETION(done); + DECLARE_COMPLETION_ONSTACK(done); reset_scb = NULL; paused = FALSE; @@ -822,7 +777,6 @@ struct scsi_host_template aic79xx_driver_template = { .use_clustering = ENABLE_CLUSTERING, .slave_alloc = ahd_linux_slave_alloc, .slave_configure = ahd_linux_slave_configure, - .slave_destroy = ahd_linux_slave_destroy, .target_alloc = ahd_linux_target_alloc, .target_destroy = ahd_linux_target_destroy, }; @@ -916,7 +870,7 @@ ahd_linux_setup_iocell_info(u_long index, int instance, int targ, int32_t value) { if ((instance >= 0) - && (instance < NUM_ELEMENTS(aic79xx_iocell_info))) { + && (instance < ARRAY_SIZE(aic79xx_iocell_info))) { uint8_t *iocell_info; iocell_info = (uint8_t*)&aic79xx_iocell_info[instance]; @@ -934,7 +888,7 @@ ahd_linux_setup_tag_info_global(char *p) tags = simple_strtoul(p + 1, NULL, 0) & 0xff; printf("Setting Global Tags= %d\n", tags); - for (i = 0; i < NUM_ELEMENTS(aic79xx_tag_info); i++) { + for (i = 0; i < ARRAY_SIZE(aic79xx_tag_info); i++) { for (j = 0; j < AHD_NUM_TARGETS; j++) { aic79xx_tag_info[i].tag_commands[j] = tags; } @@ -946,7 +900,7 @@ ahd_linux_setup_tag_info(u_long arg, int instance, int targ, int32_t value) { if ((instance >= 0) && (targ >= 0) - && (instance < NUM_ELEMENTS(aic79xx_tag_info)) + && (instance < ARRAY_SIZE(aic79xx_tag_info)) && (targ < AHD_NUM_TARGETS)) { aic79xx_tag_info[instance].tag_commands[targ] = value & 0x1FF; if (bootverbose) @@ -1057,7 +1011,6 @@ aic79xx_setup(char *s) #ifdef AHD_DEBUG { "debug", &ahd_debug }, #endif - { "reverse_scan", &aic79xx_reverse_scan }, { "periodic_otag", &aic79xx_periodic_otag }, { "pci_parity", &aic79xx_pci_parity }, { "seltime", &aic79xx_seltime }, @@ -1072,21 +1025,21 @@ aic79xx_setup(char *s) end = strchr(s, '\0'); /* - * XXX ia64 gcc isn't smart enough to know that NUM_ELEMENTS + * XXX ia64 gcc isn't smart enough to know that ARRAY_SIZE * will never be 0 in this case. - */ - n = 0; + */ + n = 0; while ((p = strsep(&s, ",.")) != NULL) { if (*p == '\0') continue; - for (i = 0; i < NUM_ELEMENTS(options); i++) { + for (i = 0; i < ARRAY_SIZE(options); i++) { n = strlen(options[i].name); if (strncmp(options[i].name, p, n) == 0) break; } - if (i == NUM_ELEMENTS(options)) + if (i == ARRAY_SIZE(options)) continue; if (strncmp(p, "global_tag_depth", n) == 0) { @@ -1249,20 +1202,13 @@ void ahd_platform_free(struct ahd_softc *ahd) { struct scsi_target *starget; - int i, j; + int i; if (ahd->platform_data != NULL) { /* destroy all of the device and target objects */ for (i = 0; i < AHD_NUM_TARGETS; i++) { starget = ahd->platform_data->starget[i]; if (starget != NULL) { - for (j = 0; j < AHD_NUM_LUNS; j++) { - struct ahd_linux_target *targ = - scsi_transport_target_data(starget); - if (targ->sdev[j] == NULL) - continue; - targ->sdev[j] = NULL; - } ahd->platform_data->starget[i] = NULL; } } @@ -1294,7 +1240,7 @@ ahd_platform_init(struct ahd_softc *ahd) /* * Lookup and commit any modified IO Cell options. */ - if (ahd->unit < NUM_ELEMENTS(aic79xx_iocell_info)) { + if (ahd->unit < ARRAY_SIZE(aic79xx_iocell_info)) { struct ahd_linux_iocell_opts *iocell_opts; iocell_opts = &aic79xx_iocell_info[ahd->unit]; @@ -1318,20 +1264,13 @@ ahd_platform_freeze_devq(struct ahd_softc *ahd, struct scb *scb) } void -ahd_platform_set_tags(struct ahd_softc *ahd, struct ahd_devinfo *devinfo, - ahd_queue_alg alg) +ahd_platform_set_tags(struct ahd_softc *ahd, struct scsi_device *sdev, + struct ahd_devinfo *devinfo, ahd_queue_alg alg) { - struct scsi_target *starget; - struct ahd_linux_target *targ; struct ahd_linux_device *dev; - struct scsi_device *sdev; int was_queuing; int now_queuing; - starget = ahd->platform_data->starget[devinfo->target]; - targ = scsi_transport_target_data(starget); - BUG_ON(targ == NULL); - sdev = targ->sdev[devinfo->lun]; if (sdev == NULL) return; @@ -1426,7 +1365,7 @@ ahd_linux_user_tagdepth(struct ahd_softc *ahd, struct ahd_devinfo *devinfo) tags = 0; if ((ahd->user_discenable & devinfo->target_mask) != 0) { - if (ahd->unit >= NUM_ELEMENTS(aic79xx_tag_info)) { + if (ahd->unit >= ARRAY_SIZE(aic79xx_tag_info)) { if (warned_user == 0) { printf(KERN_WARNING @@ -1467,11 +1406,15 @@ ahd_linux_device_queue_depth(struct scsi_device *sdev) tags = ahd_linux_user_tagdepth(ahd, &devinfo); if (tags != 0 && sdev->tagged_supported != 0) { - ahd_set_tags(ahd, &devinfo, AHD_QUEUE_TAGGED); + ahd_platform_set_tags(ahd, sdev, &devinfo, AHD_QUEUE_TAGGED); + ahd_send_async(ahd, devinfo.channel, devinfo.target, + devinfo.lun, AC_TRANSFER_NEG); ahd_print_devinfo(ahd, &devinfo); printf("Tagged Queuing enabled. Depth %d\n", tags); } else { - ahd_set_tags(ahd, &devinfo, AHD_QUEUE_NONE); + ahd_platform_set_tags(ahd, sdev, &devinfo, AHD_QUEUE_NONE); + ahd_send_async(ahd, devinfo.channel, devinfo.target, + devinfo.lun, AC_TRANSFER_NEG); } } @@ -1629,7 +1572,7 @@ ahd_linux_isr(int irq, void *dev_id, struct pt_regs * regs) void ahd_send_async(struct ahd_softc *ahd, char channel, - u_int target, u_int lun, ac_code code, void *arg) + u_int target, u_int lun, ac_code code) { switch (code) { case AC_TRANSFER_NEG: @@ -1956,7 +1899,7 @@ ahd_linux_handle_scsi_status(struct ahd_softc *ahd, } ahd_set_transaction_status(scb, CAM_REQUEUE_REQ); ahd_set_scsi_status(scb, SCSI_STATUS_OK); - ahd_platform_set_tags(ahd, &devinfo, + ahd_platform_set_tags(ahd, sdev, &devinfo, (dev->flags & AHD_DEV_Q_BASIC) ? AHD_QUEUE_BASIC : AHD_QUEUE_TAGGED); break; @@ -1966,7 +1909,7 @@ ahd_linux_handle_scsi_status(struct ahd_softc *ahd, * as if the target returned BUSY SCSI status. */ dev->openings = 1; - ahd_platform_set_tags(ahd, &devinfo, + ahd_platform_set_tags(ahd, sdev, &devinfo, (dev->flags & AHD_DEV_Q_BASIC) ? AHD_QUEUE_BASIC : AHD_QUEUE_TAGGED); ahd_set_scsi_status(scb, SCSI_STATUS_BUSY); @@ -2308,7 +2251,7 @@ done: if (paused) ahd_unpause(ahd); if (wait) { - DECLARE_COMPLETION(done); + DECLARE_COMPLETION_ONSTACK(done); ahd->platform_data->eh_done = &done; ahd_unlock(ahd, &flags); @@ -2778,8 +2721,6 @@ ahd_linux_init(void) if (!ahd_linux_transport_template) return -ENODEV; - scsi_transport_reserve_target(ahd_linux_transport_template, - sizeof(struct ahd_linux_target)); scsi_transport_reserve_device(ahd_linux_transport_template, sizeof(struct ahd_linux_device)); diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.h b/drivers/scsi/aic7xxx/aic79xx_osm.h index 2b8331649..601340d84 100644 --- a/drivers/scsi/aic7xxx/aic79xx_osm.h +++ b/drivers/scsi/aic7xxx/aic79xx_osm.h @@ -42,7 +42,6 @@ #ifndef _AIC79XX_LINUX_H_ #define _AIC79XX_LINUX_H_ -#include #include #include #include @@ -94,7 +93,6 @@ #endif /********************************** Misc Macros *******************************/ -#define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) #define powerof2(x) ((((x)-1)&(x))==0) /************************* Forward Declarations *******************************/ @@ -263,7 +261,6 @@ typedef enum { AHD_DEV_PERIODIC_OTAG = 0x40, /* Send OTAG to prevent starvation */ } ahd_linux_dev_flags; -struct ahd_linux_target; struct ahd_linux_device { TAILQ_ENTRY(ahd_linux_device) links; @@ -343,12 +340,6 @@ struct ahd_linux_device { #define AHD_OTAG_THRESH 500 }; -struct ahd_linux_target { - struct scsi_device *sdev[AHD_NUM_LUNS]; - struct ahd_transinfo last_tinfo; - struct ahd_softc *ahd; -}; - /********************* Definitions Required by the Core ***********************/ /* * Number of SG segments we require. So long as the S/G segments for @@ -865,7 +856,7 @@ ahd_freeze_scb(struct scb *scb) } } -void ahd_platform_set_tags(struct ahd_softc *ahd, +void ahd_platform_set_tags(struct ahd_softc *ahd, struct scsi_device *sdev, struct ahd_devinfo *devinfo, ahd_queue_alg); int ahd_platform_abort_scbs(struct ahd_softc *ahd, int target, char channel, int lun, u_int tag, @@ -874,7 +865,7 @@ irqreturn_t ahd_linux_isr(int irq, void *dev_id, struct pt_regs * regs); void ahd_done(struct ahd_softc*, struct scb*); void ahd_send_async(struct ahd_softc *, char channel, - u_int target, u_int lun, ac_code, void *); + u_int target, u_int lun, ac_code); void ahd_print_path(struct ahd_softc *, struct scb *); #ifdef CONFIG_PCI diff --git a/drivers/scsi/aic7xxx/aic79xx_osm_pci.c b/drivers/scsi/aic7xxx/aic79xx_osm_pci.c index ebbf7e4ff..50a41eda5 100644 --- a/drivers/scsi/aic7xxx/aic79xx_osm_pci.c +++ b/drivers/scsi/aic7xxx/aic79xx_osm_pci.c @@ -342,7 +342,7 @@ ahd_pci_map_int(struct ahd_softc *ahd) int error; error = request_irq(ahd->dev_softc->irq, ahd_linux_isr, - SA_SHIRQ, "aic79xx", ahd); + IRQF_SHARED, "aic79xx", ahd); if (!error) ahd->platform_data->irq = ahd->dev_softc->irq; diff --git a/drivers/scsi/aic7xxx/aic79xx_pci.c b/drivers/scsi/aic7xxx/aic79xx_pci.c index 757242e52..14850f31a 100644 --- a/drivers/scsi/aic7xxx/aic79xx_pci.c +++ b/drivers/scsi/aic7xxx/aic79xx_pci.c @@ -201,7 +201,7 @@ struct ahd_pci_identity ahd_pci_ident_table [] = } }; -const u_int ahd_num_pci_devs = NUM_ELEMENTS(ahd_pci_ident_table); +const u_int ahd_num_pci_devs = ARRAY_SIZE(ahd_pci_ident_table); #define DEVCONFIG 0x40 #define PCIXINITPAT 0x0000E000ul diff --git a/drivers/scsi/aic7xxx/aic79xx_proc.c b/drivers/scsi/aic7xxx/aic79xx_proc.c index 39a27840f..c5f0ee591 100644 --- a/drivers/scsi/aic7xxx/aic79xx_proc.c +++ b/drivers/scsi/aic7xxx/aic79xx_proc.c @@ -47,7 +47,7 @@ static int copy_info(struct info_str *info, char *fmt, ...); static void ahd_dump_target_state(struct ahd_softc *ahd, struct info_str *info, u_int our_id, char channel, - u_int target_id, u_int target_offset); + u_int target_id); static void ahd_dump_device_state(struct info_str *info, struct scsi_device *sdev); static int ahd_proc_write_seeprom(struct ahd_softc *ahd, @@ -76,11 +76,9 @@ static u_int ahd_calc_syncsrate(u_int period_factor) { int i; - int num_syncrates; - num_syncrates = sizeof(scsi_syncrates) / sizeof(scsi_syncrates[0]); /* See if the period is in the "exception" table */ - for (i = 0; i < num_syncrates; i++) { + for (i = 0; i < ARRAY_SIZE(scsi_syncrates); i++) { if (period_factor == scsi_syncrates[i].period_factor) { /* Period in kHz */ @@ -206,10 +204,8 @@ ahd_format_transinfo(struct info_str *info, struct ahd_transinfo *tinfo) static void ahd_dump_target_state(struct ahd_softc *ahd, struct info_str *info, - u_int our_id, char channel, u_int target_id, - u_int target_offset) + u_int our_id, char channel, u_int target_id) { - struct ahd_linux_target *targ; struct scsi_target *starget; struct ahd_initiator_tinfo *tinfo; struct ahd_tmode_tstate *tstate; @@ -220,10 +216,9 @@ ahd_dump_target_state(struct ahd_softc *ahd, struct info_str *info, copy_info(info, "Target %d Negotiation Settings\n", target_id); copy_info(info, "\tUser: "); ahd_format_transinfo(info, &tinfo->user); - starget = ahd->platform_data->starget[target_offset]; + starget = ahd->platform_data->starget[target_id]; if (starget == NULL) return; - targ = scsi_transport_target_data(starget); copy_info(info, "\tGoal: "); ahd_format_transinfo(info, &tinfo->goal); @@ -233,7 +228,7 @@ ahd_dump_target_state(struct ahd_softc *ahd, struct info_str *info, for (lun = 0; lun < AHD_NUM_LUNS; lun++) { struct scsi_device *dev; - dev = targ->sdev[lun]; + dev = scsi_device_lookup_by_target(starget, lun); if (dev == NULL) continue; @@ -357,7 +352,7 @@ ahd_linux_proc_info(struct Scsi_Host *shost, char *buffer, char **start, copy_info(&info, "Allocated SCBs: %d, SG List Length: %d\n\n", ahd->scb_data.numscbs, AHD_NSEG); - max_targ = 15; + max_targ = 16; if (ahd->seep_config == NULL) copy_info(&info, "No Serial EEPROM\n"); @@ -375,12 +370,12 @@ ahd_linux_proc_info(struct Scsi_Host *shost, char *buffer, char **start, copy_info(&info, "\n"); if ((ahd->features & AHD_WIDE) == 0) - max_targ = 7; + max_targ = 8; - for (i = 0; i <= max_targ; i++) { + for (i = 0; i < max_targ; i++) { ahd_dump_target_state(ahd, &info, ahd->our_id, 'A', - /*target_id*/i, /*target_offset*/i); + /*target_id*/i); } retval = info.pos > info.offset ? info.pos - info.offset : 0; done: diff --git a/drivers/scsi/aic7xxx/aic7xxx.h b/drivers/scsi/aic7xxx/aic7xxx.h index 91d294c63..62ff8c3dc 100644 --- a/drivers/scsi/aic7xxx/aic7xxx.h +++ b/drivers/scsi/aic7xxx/aic7xxx.h @@ -69,8 +69,6 @@ struct seeprom_descriptor; #define FALSE 0 #endif -#define NUM_ELEMENTS(array) (sizeof(array) / sizeof(*array)) - #define ALL_CHANNELS '\0' #define ALL_TARGETS_MASK 0xFFFF #define INITIATOR_WILDCARD (~0) @@ -233,6 +231,7 @@ typedef enum { AHC_TARGETMODE = 0x20000, /* Has tested target mode support */ AHC_MULTIROLE = 0x40000, /* Space for two roles at a time */ AHC_REMOVABLE = 0x80000, /* Hot-Swap supported */ + AHC_HVD = 0x100000, /* HVD rather than SE */ AHC_AIC7770_FE = AHC_FENONE, /* * The real 7850 does not support Ultra modes, but there are diff --git a/drivers/scsi/aic7xxx/aic7xxx_core.c b/drivers/scsi/aic7xxx/aic7xxx_core.c index d37566978..93e4e4094 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_core.c +++ b/drivers/scsi/aic7xxx/aic7xxx_core.c @@ -68,7 +68,7 @@ char *ahc_chip_names[] = "aic7892", "aic7899" }; -static const u_int num_chip_names = NUM_ELEMENTS(ahc_chip_names); +static const u_int num_chip_names = ARRAY_SIZE(ahc_chip_names); /* * Hardware error codes. @@ -88,7 +88,7 @@ static struct ahc_hard_error_entry ahc_hard_errors[] = { { PCIERRSTAT, "PCI Error detected" }, { CIOPARERR, "CIOBUS Parity Error" }, }; -static const u_int num_errors = NUM_ELEMENTS(ahc_hard_errors); +static const u_int num_errors = ARRAY_SIZE(ahc_hard_errors); static struct ahc_phase_table_entry ahc_phase_table[] = { @@ -108,7 +108,7 @@ static struct ahc_phase_table_entry ahc_phase_table[] = * In most cases we only wish to itterate over real phases, so * exclude the last element from the count. */ -static const u_int num_phases = NUM_ELEMENTS(ahc_phase_table) - 1; +static const u_int num_phases = ARRAY_SIZE(ahc_phase_table) - 1; /* * Valid SCSIRATE values. (p. 3-17) @@ -6367,7 +6367,7 @@ ahc_check_patch(struct ahc_softc *ahc, struct patch **start_patch, struct patch *last_patch; u_int num_patches; - num_patches = sizeof(patches)/sizeof(struct patch); + num_patches = ARRAY_SIZE(patches); last_patch = &patches[num_patches]; cur_patch = *start_patch; @@ -6774,8 +6774,8 @@ ahc_find_tmode_devs(struct ahc_softc *ahc, struct cam_sim *sim, union ccb *ccb, } else { u_int max_id; - max_id = (ahc->features & AHC_WIDE) ? 15 : 7; - if (ccb->ccb_h.target_id > max_id) + max_id = (ahc->features & AHC_WIDE) ? 16 : 8; + if (ccb->ccb_h.target_id >= max_id) return (CAM_TID_INVALID); if (ccb->ccb_h.target_lun >= AHC_NUM_LUNS) diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.c b/drivers/scsi/aic7xxx/aic7xxx_osm.c index 2c801672d..b3d35b324 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_osm.c +++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c @@ -353,7 +353,6 @@ MODULE_PARM_DESC(aic7xxx, " periodically to prevent tag starvation.\n" " This may be required by some older disk\n" " drives or RAID arrays.\n" -" reverse_scan Sort PCI devices highest Bus/Slot to lowest\n" " tag_info: Set per-target tag depth\n" " global_tag_depth: Global tag depth for every target\n" " on every bus\n" @@ -886,7 +885,7 @@ ahc_linux_setup_tag_info_global(char *p) tags = simple_strtoul(p + 1, NULL, 0) & 0xff; printf("Setting Global Tags= %d\n", tags); - for (i = 0; i < NUM_ELEMENTS(aic7xxx_tag_info); i++) { + for (i = 0; i < ARRAY_SIZE(aic7xxx_tag_info); i++) { for (j = 0; j < AHC_NUM_TARGETS; j++) { aic7xxx_tag_info[i].tag_commands[j] = tags; } @@ -898,7 +897,7 @@ ahc_linux_setup_tag_info(u_long arg, int instance, int targ, int32_t value) { if ((instance >= 0) && (targ >= 0) - && (instance < NUM_ELEMENTS(aic7xxx_tag_info)) + && (instance < ARRAY_SIZE(aic7xxx_tag_info)) && (targ < AHC_NUM_TARGETS)) { aic7xxx_tag_info[instance].tag_commands[targ] = value & 0xff; if (bootverbose) @@ -1020,7 +1019,7 @@ aic7xxx_setup(char *s) end = strchr(s, '\0'); /* - * XXX ia64 gcc isn't smart enough to know that NUM_ELEMENTS + * XXX ia64 gcc isn't smart enough to know that ARRAY_SIZE * will never be 0 in this case. */ n = 0; @@ -1028,13 +1027,13 @@ aic7xxx_setup(char *s) while ((p = strsep(&s, ",.")) != NULL) { if (*p == '\0') continue; - for (i = 0; i < NUM_ELEMENTS(options); i++) { + for (i = 0; i < ARRAY_SIZE(options); i++) { n = strlen(options[i].name); if (strncmp(options[i].name, p, n) == 0) break; } - if (i == NUM_ELEMENTS(options)) + if (i == ARRAY_SIZE(options)) continue; if (strncmp(p, "global_tag_depth", n) == 0) { @@ -1360,7 +1359,7 @@ ahc_linux_user_tagdepth(struct ahc_softc *ahc, struct ahc_devinfo *devinfo) tags = 0; if ((ahc->user_discenable & devinfo->target_mask) != 0) { - if (ahc->unit >= NUM_ELEMENTS(aic7xxx_tag_info)) { + if (ahc->unit >= ARRAY_SIZE(aic7xxx_tag_info)) { if (warned_user == 0) { printf(KERN_WARNING @@ -2336,7 +2335,7 @@ done: if (paused) ahc_unpause(ahc); if (wait) { - DECLARE_COMPLETION(done); + DECLARE_COMPLETION_ONSTACK(done); ahc->platform_data->eh_done = &done; ahc_unlock(ahc, &flags); @@ -2537,6 +2536,35 @@ static void ahc_linux_set_iu(struct scsi_target *starget, int iu) } #endif +static void ahc_linux_get_signalling(struct Scsi_Host *shost) +{ + struct ahc_softc *ahc = *(struct ahc_softc **)shost->hostdata; + unsigned long flags; + u8 mode; + + if (!(ahc->features & AHC_ULTRA2)) { + /* non-LVD chipset, may not have SBLKCTL reg */ + spi_signalling(shost) = + ahc->features & AHC_HVD ? + SPI_SIGNAL_HVD : + SPI_SIGNAL_SE; + return; + } + + ahc_lock(ahc, &flags); + ahc_pause(ahc); + mode = ahc_inb(ahc, SBLKCTL); + ahc_unpause(ahc); + ahc_unlock(ahc, &flags); + + if (mode & ENAB40) + spi_signalling(shost) = SPI_SIGNAL_LVD; + else if (mode & ENAB20) + spi_signalling(shost) = SPI_SIGNAL_SE; + else + spi_signalling(shost) = SPI_SIGNAL_UNKNOWN; +} + static struct spi_function_template ahc_linux_transport_functions = { .set_offset = ahc_linux_set_offset, .show_offset = 1, @@ -2552,6 +2580,7 @@ static struct spi_function_template ahc_linux_transport_functions = { .set_qas = ahc_linux_set_qas, .show_qas = 1, #endif + .get_signalling = ahc_linux_get_signalling, }; diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.h b/drivers/scsi/aic7xxx/aic7xxx_osm.h index a20b08c9f..d42a71ee0 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_osm.h +++ b/drivers/scsi/aic7xxx/aic7xxx_osm.h @@ -59,7 +59,6 @@ #ifndef _AIC7XXX_LINUX_H_ #define _AIC7XXX_LINUX_H_ -#include #include #include #include diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c b/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c index 0c9c2f400..7e42f07a2 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c +++ b/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c @@ -375,7 +375,7 @@ ahc_pci_map_int(struct ahc_softc *ahc) int error; error = request_irq(ahc->dev_softc->irq, ahc_linux_isr, - SA_SHIRQ, "aic7xxx", ahc); + IRQF_SHARED, "aic7xxx", ahc); if (error == 0) ahc->platform_data->irq = ahc->dev_softc->irq; diff --git a/drivers/scsi/aic7xxx/aic7xxx_pci.c b/drivers/scsi/aic7xxx/aic7xxx_pci.c index 3adecef21..63cab2d74 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_pci.c +++ b/drivers/scsi/aic7xxx/aic7xxx_pci.c @@ -144,16 +144,22 @@ static ahc_device_setup_t ahc_aic785X_setup; static ahc_device_setup_t ahc_aic7860_setup; static ahc_device_setup_t ahc_apa1480_setup; static ahc_device_setup_t ahc_aic7870_setup; +static ahc_device_setup_t ahc_aic7870h_setup; static ahc_device_setup_t ahc_aha394X_setup; +static ahc_device_setup_t ahc_aha394Xh_setup; static ahc_device_setup_t ahc_aha494X_setup; +static ahc_device_setup_t ahc_aha494Xh_setup; static ahc_device_setup_t ahc_aha398X_setup; static ahc_device_setup_t ahc_aic7880_setup; +static ahc_device_setup_t ahc_aic7880h_setup; static ahc_device_setup_t ahc_aha2940Pro_setup; static ahc_device_setup_t ahc_aha394XU_setup; +static ahc_device_setup_t ahc_aha394XUh_setup; static ahc_device_setup_t ahc_aha398XU_setup; static ahc_device_setup_t ahc_aic7890_setup; static ahc_device_setup_t ahc_aic7892_setup; static ahc_device_setup_t ahc_aic7895_setup; +static ahc_device_setup_t ahc_aic7895h_setup; static ahc_device_setup_t ahc_aic7896_setup; static ahc_device_setup_t ahc_aic7899_setup; static ahc_device_setup_t ahc_aha29160C_setup; @@ -225,19 +231,19 @@ struct ahc_pci_identity ahc_pci_ident_table [] = ID_AHA_2944, ID_ALL_MASK, "Adaptec 2944 SCSI adapter", - ahc_aic7870_setup + ahc_aic7870h_setup }, { ID_AHA_3944, ID_ALL_MASK, "Adaptec 3944 SCSI adapter", - ahc_aha394X_setup + ahc_aha394Xh_setup }, { ID_AHA_4944, ID_ALL_MASK, "Adaptec 4944 SCSI adapter", - ahc_aha494X_setup + ahc_aha494Xh_setup }, /* aic7880 based controllers */ { @@ -256,13 +262,13 @@ struct ahc_pci_identity ahc_pci_ident_table [] = ID_AHA_2944U & ID_DEV_VENDOR_MASK, ID_DEV_VENDOR_MASK, "Adaptec 2944 Ultra SCSI adapter", - ahc_aic7880_setup + ahc_aic7880h_setup }, { ID_AHA_3944U & ID_DEV_VENDOR_MASK, ID_DEV_VENDOR_MASK, "Adaptec 3944 Ultra SCSI adapter", - ahc_aha394XU_setup + ahc_aha394XUh_setup }, { ID_AHA_398XU & ID_DEV_VENDOR_MASK, @@ -278,7 +284,7 @@ struct ahc_pci_identity ahc_pci_ident_table [] = ID_AHA_4944U & ID_DEV_VENDOR_MASK, ID_DEV_VENDOR_MASK, "Adaptec 4944 Ultra SCSI adapter", - ahc_aic7880_setup + ahc_aic7880h_setup }, { ID_AHA_2930U & ID_DEV_VENDOR_MASK, @@ -414,7 +420,7 @@ struct ahc_pci_identity ahc_pci_ident_table [] = ID_AHA_3944AU, ID_ALL_MASK, "Adaptec 3944A Ultra SCSI adapter", - ahc_aic7895_setup + ahc_aic7895h_setup }, { ID_AIC7895_ARO, @@ -553,7 +559,7 @@ struct ahc_pci_identity ahc_pci_ident_table [] = } }; -const u_int ahc_num_pci_devs = NUM_ELEMENTS(ahc_pci_ident_table); +const u_int ahc_num_pci_devs = ARRAY_SIZE(ahc_pci_ident_table); #define AHC_394X_SLOT_CHANNEL_A 4 #define AHC_394X_SLOT_CHANNEL_B 5 @@ -2120,6 +2126,16 @@ ahc_aic7870_setup(struct ahc_softc *ahc) return (0); } +static int +ahc_aic7870h_setup(struct ahc_softc *ahc) +{ + int error = ahc_aic7870_setup(ahc); + + ahc->features |= AHC_HVD; + + return error; +} + static int ahc_aha394X_setup(struct ahc_softc *ahc) { @@ -2131,6 +2147,16 @@ ahc_aha394X_setup(struct ahc_softc *ahc) return (error); } +static int +ahc_aha394Xh_setup(struct ahc_softc *ahc) +{ + int error = ahc_aha394X_setup(ahc); + + ahc->features |= AHC_HVD; + + return error; +} + static int ahc_aha398X_setup(struct ahc_softc *ahc) { @@ -2153,6 +2179,16 @@ ahc_aha494X_setup(struct ahc_softc *ahc) return (error); } +static int +ahc_aha494Xh_setup(struct ahc_softc *ahc) +{ + int error = ahc_aha494X_setup(ahc); + + ahc->features |= AHC_HVD; + + return error; +} + static int ahc_aic7880_setup(struct ahc_softc *ahc) { @@ -2174,6 +2210,17 @@ ahc_aic7880_setup(struct ahc_softc *ahc) return (0); } +static int +ahc_aic7880h_setup(struct ahc_softc *ahc) +{ + int error = ahc_aic7880_setup(ahc); + + ahc->features |= AHC_HVD; + + return error; +} + + static int ahc_aha2940Pro_setup(struct ahc_softc *ahc) { @@ -2193,6 +2240,16 @@ ahc_aha394XU_setup(struct ahc_softc *ahc) return (error); } +static int +ahc_aha394XUh_setup(struct ahc_softc *ahc) +{ + int error = ahc_aha394XU_setup(ahc); + + ahc->features |= AHC_HVD; + + return error; +} + static int ahc_aha398XU_setup(struct ahc_softc *ahc) { @@ -2291,6 +2348,16 @@ ahc_aic7895_setup(struct ahc_softc *ahc) return (0); } +static int +ahc_aic7895h_setup(struct ahc_softc *ahc) +{ + int error = ahc_aic7895_setup(ahc); + + ahc->features |= AHC_HVD; + + return error; +} + static int ahc_aic7896_setup(struct ahc_softc *ahc) { diff --git a/drivers/scsi/aic7xxx/aic7xxx_proc.c b/drivers/scsi/aic7xxx/aic7xxx_proc.c index 04a3506cf..5914b4aa4 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_proc.c +++ b/drivers/scsi/aic7xxx/aic7xxx_proc.c @@ -77,11 +77,9 @@ static u_int ahc_calc_syncsrate(u_int period_factor) { int i; - int num_syncrates; - num_syncrates = sizeof(scsi_syncrates) / sizeof(scsi_syncrates[0]); /* See if the period is in the "exception" table */ - for (i = 0; i < num_syncrates; i++) { + for (i = 0; i < ARRAY_SIZE(scsi_syncrates); i++) { if (period_factor == scsi_syncrates[i].period_factor) { /* Period in kHz */ diff --git a/drivers/scsi/aic7xxx/aicasm/Makefile b/drivers/scsi/aic7xxx/aicasm/Makefile index 8c91fda64..b98c5c105 100644 --- a/drivers/scsi/aic7xxx/aicasm/Makefile +++ b/drivers/scsi/aic7xxx/aicasm/Makefile @@ -14,6 +14,8 @@ LIBS= -ldb clean-files:= ${GENSRCS} ${GENHDRS} $(YSRCS:.y=.output) $(PROG) # Override default kernel CFLAGS. This is a userland app. AICASM_CFLAGS:= -I/usr/include -I. +LEX= flex +YACC= bison YFLAGS= -d NOMAN= noman diff --git a/drivers/scsi/aic7xxx_old.c b/drivers/scsi/aic7xxx_old.c index 770f1647e..ba3bccafe 100644 --- a/drivers/scsi/aic7xxx_old.c +++ b/drivers/scsi/aic7xxx_old.c @@ -249,8 +249,6 @@ #include #include /* for kmalloc() */ -#include /* for CONFIG_PCI */ - #define AIC7XXX_C_VERSION "5.2.6" #define ALL_TARGETS -1 @@ -1565,7 +1563,7 @@ aic7xxx_check_patch(struct aic7xxx_host *p, struct sequencer_patch *last_patch; int num_patches; - num_patches = sizeof(sequencer_patches)/sizeof(struct sequencer_patch); + num_patches = ARRAY_SIZE(sequencer_patches); last_patch = &sequencer_patches[num_patches]; cur_patch = *start_patch; @@ -8322,11 +8320,11 @@ aic7xxx_register(struct scsi_host_template *template, struct aic7xxx_host *p, } else { - result = (request_irq(p->irq, do_aic7xxx_isr, SA_SHIRQ, + result = (request_irq(p->irq, do_aic7xxx_isr, IRQF_SHARED, "aic7xxx", p)); if (result < 0) { - result = (request_irq(p->irq, do_aic7xxx_isr, SA_INTERRUPT | SA_SHIRQ, + result = (request_irq(p->irq, do_aic7xxx_isr, IRQF_DISABLED | IRQF_SHARED, "aic7xxx", p)); } } diff --git a/drivers/scsi/aic7xxx_old/aic7xxx_proc.c b/drivers/scsi/aic7xxx_old/aic7xxx_proc.c index 3bf334931..b07e4f04f 100644 --- a/drivers/scsi/aic7xxx_old/aic7xxx_proc.c +++ b/drivers/scsi/aic7xxx_old/aic7xxx_proc.c @@ -29,7 +29,6 @@ * $Id: aic7xxx_proc.c,v 4.1 1997/06/97 08:23:42 deang Exp $ *-M*************************************************************************/ -#include #define BLS (&aic7xxx_buffer[size]) #define HDRB \ diff --git a/drivers/scsi/amiga7xx.c b/drivers/scsi/amiga7xx.c index c0844fa32..9099d531d 100644 --- a/drivers/scsi/amiga7xx.c +++ b/drivers/scsi/amiga7xx.c @@ -11,7 +11,6 @@ #include #include #include -#include #include #include diff --git a/drivers/scsi/arm/Kconfig b/drivers/scsi/arm/Kconfig index 06d7601cd..d006a8cb4 100644 --- a/drivers/scsi/arm/Kconfig +++ b/drivers/scsi/arm/Kconfig @@ -69,6 +69,7 @@ comment "The following drivers are not fully supported" config SCSI_CUMANA_1 tristate "CumanaSCSI I support (EXPERIMENTAL)" depends on ARCH_ACORN && EXPERIMENTAL && SCSI + select SCSI_SPI_ATTRS help This enables support for the Cumana SCSI I card. If you have an Acorn system with one of these, say Y. If unsure, say N. @@ -76,6 +77,7 @@ config SCSI_CUMANA_1 config SCSI_ECOSCSI tristate "EcoScsi support (EXPERIMENTAL)" depends on ARCH_ACORN && EXPERIMENTAL && (ARCH_ARC || ARCH_A5K) && SCSI + select SCSI_SPI_ATTRS help This enables support for the EcoSCSI card -- a small card that sits in the Econet socket. If you have an Acorn system with one of these, @@ -84,6 +86,7 @@ config SCSI_ECOSCSI config SCSI_OAK1 tristate "Oak SCSI support (EXPERIMENTAL)" depends on ARCH_ACORN && EXPERIMENTAL && SCSI + select SCSI_SPI_ATTRS help This enables support for the Oak SCSI card. If you have an Acorn system with one of these, say Y. If unsure, say N. diff --git a/drivers/scsi/arm/acornscsi.c b/drivers/scsi/arm/acornscsi.c index dda5a5f79..7621e3fa3 100644 --- a/drivers/scsi/arm/acornscsi.c +++ b/drivers/scsi/arm/acornscsi.c @@ -129,7 +129,6 @@ #define STRx(x) STRINGIFY(x) #define NO_WRITE_STR STRx(NO_WRITE) -#include #include #include #include @@ -3031,7 +3030,7 @@ acornscsi_probe(struct expansion_card *ec, const struct ecard_id *id) if (!request_region(host->io_port, 2048, "acornscsi(ram)")) goto err_5; - ret = request_irq(host->irq, acornscsi_intr, SA_INTERRUPT, "acornscsi", ashost); + ret = request_irq(host->irq, acornscsi_intr, IRQF_DISABLED, "acornscsi", ashost); if (ret) { printk(KERN_CRIT "scsi%d: IRQ%d not free: %d\n", host->host_no, ashost->scsi.irq, ret); diff --git a/drivers/scsi/arm/cumana_1.c b/drivers/scsi/arm/cumana_1.c index e6c9491dc..3bdfc3648 100644 --- a/drivers/scsi/arm/cumana_1.c +++ b/drivers/scsi/arm/cumana_1.c @@ -277,7 +277,7 @@ cumanascsi1_probe(struct expansion_card *ec, const struct ecard_id *id) ((struct NCR5380_hostdata *)host->hostdata)->ctrl = 0; outb(0x00, host->io_port - 577); - ret = request_irq(host->irq, cumanascsi_intr, SA_INTERRUPT, + ret = request_irq(host->irq, cumanascsi_intr, IRQF_DISABLED, "CumanaSCSI-1", host); if (ret) { printk("scsi%d: IRQ%d not free: %d\n", diff --git a/drivers/scsi/arm/cumana_2.c b/drivers/scsi/arm/cumana_2.c index fad210926..719af0dcc 100644 --- a/drivers/scsi/arm/cumana_2.c +++ b/drivers/scsi/arm/cumana_2.c @@ -460,7 +460,7 @@ cumanascsi2_probe(struct expansion_card *ec, const struct ecard_id *id) goto out_free; ret = request_irq(ec->irq, cumanascsi_2_intr, - SA_INTERRUPT, "cumanascsi2", info); + IRQF_DISABLED, "cumanascsi2", info); if (ret) { printk("scsi%d: IRQ%d not free: %d\n", host->host_no, ec->irq, ret); diff --git a/drivers/scsi/arm/fas216.c b/drivers/scsi/arm/fas216.c index 3e1053f11..4cf7afc31 100644 --- a/drivers/scsi/arm/fas216.c +++ b/drivers/scsi/arm/fas216.c @@ -2427,7 +2427,7 @@ int fas216_eh_abort(Scsi_Cmnd *SCpnt) info->stats.aborts += 1; printk(KERN_WARNING "scsi%d: abort command ", info->host->host_no); - __scsi_print_command(SCpnt->data_cmnd); + __scsi_print_command(SCpnt->cmnd); print_debug_list(); fas216_dumpstate(info); diff --git a/drivers/scsi/arm/powertec.c b/drivers/scsi/arm/powertec.c index 3d69f6c45..b2c346a47 100644 --- a/drivers/scsi/arm/powertec.c +++ b/drivers/scsi/arm/powertec.c @@ -373,7 +373,7 @@ powertecscsi_probe(struct expansion_card *ec, const struct ecard_id *id) goto out_free; ret = request_irq(ec->irq, powertecscsi_intr, - SA_INTERRUPT, "powertec", info); + IRQF_DISABLED, "powertec", info); if (ret) { printk("scsi%d: IRQ%d not free: %d\n", host->host_no, ec->irq, ret); diff --git a/drivers/scsi/arm/queue.c b/drivers/scsi/arm/queue.c index b10750bb5..8caa5903c 100644 --- a/drivers/scsi/arm/queue.c +++ b/drivers/scsi/arm/queue.c @@ -118,8 +118,7 @@ int __queue_add(Queue_t *queue, Scsi_Cmnd *SCpnt, int head) list_del(l); q = list_entry(l, QE_t, list); - if (BAD_MAGIC(q, QUEUE_MAGIC_FREE)) - BUG(); + BUG_ON(BAD_MAGIC(q, QUEUE_MAGIC_FREE)); SET_MAGIC(q, QUEUE_MAGIC_USED); q->SCpnt = SCpnt; @@ -144,8 +143,7 @@ static Scsi_Cmnd *__queue_remove(Queue_t *queue, struct list_head *ent) */ list_del(ent); q = list_entry(ent, QE_t, list); - if (BAD_MAGIC(q, QUEUE_MAGIC_USED)) - BUG(); + BUG_ON(BAD_MAGIC(q, QUEUE_MAGIC_USED)); SET_MAGIC(q, QUEUE_MAGIC_FREE); list_add(ent, &queue->free); diff --git a/drivers/scsi/arm/scsi.h b/drivers/scsi/arm/scsi.h index 6dd544a5e..8c2600ffc 100644 --- a/drivers/scsi/arm/scsi.h +++ b/drivers/scsi/arm/scsi.h @@ -74,7 +74,7 @@ static inline void init_SCp(Scsi_Cmnd *SCpnt) unsigned long len = 0; int buf; - SCpnt->SCp.buffer = (struct scatterlist *) SCpnt->buffer; + SCpnt->SCp.buffer = (struct scatterlist *) SCpnt->request_buffer; SCpnt->SCp.buffers_residual = SCpnt->use_sg - 1; SCpnt->SCp.ptr = (char *) (page_address(SCpnt->SCp.buffer->page) + diff --git a/drivers/scsi/ata_piix.c b/drivers/scsi/ata_piix.c index 6dc88149f..a9bb3cb7e 100644 --- a/drivers/scsi/ata_piix.c +++ b/drivers/scsi/ata_piix.c @@ -93,7 +93,7 @@ #include #define DRV_NAME "ata_piix" -#define DRV_VERSION "1.05" +#define DRV_VERSION "2.00" enum { PIIX_IOCFG = 0x54, /* IDE I/O configuration register */ @@ -105,9 +105,6 @@ enum { PIIX_FLAG_SCR = (1 << 26), /* SCR available */ PIIX_FLAG_AHCI = (1 << 27), /* AHCI possible */ PIIX_FLAG_CHECKINTR = (1 << 28), /* make sure PCI INTx enabled */ - PIIX_FLAG_COMBINED = (1 << 29), /* combined mode possible */ - /* ICH6/7 use different scheme for map value */ - PIIX_FLAG_COMBINED_ICH6 = PIIX_FLAG_COMBINED | (1 << 30), /* combined mode. if set, PATA is channel 0. * if clear, PATA is channel 1. @@ -126,6 +123,8 @@ enum { ich6_sata = 4, ich6_sata_ahci = 5, ich6m_sata_ahci = 6, + ich7m_sata_ahci = 7, + ich8_sata_ahci = 8, /* constants for mapping table */ P0 = 0, /* port 0 */ @@ -141,16 +140,23 @@ enum { struct piix_map_db { const u32 mask; + const u16 port_enable; + const int present_shift; const int map[][4]; }; +struct piix_host_priv { + const int *map; + const struct piix_map_db *map_db; +}; + static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent); - -static int piix_pata_probe_reset(struct ata_port *ap, unsigned int *classes); -static int piix_sata_probe_reset(struct ata_port *ap, unsigned int *classes); +static void piix_host_stop(struct ata_host_set *host_set); static void piix_set_piomode (struct ata_port *ap, struct ata_device *adev); static void piix_set_dmamode (struct ata_port *ap, struct ata_device *adev); +static void piix_pata_error_handler(struct ata_port *ap); +static void piix_sata_error_handler(struct ata_port *ap); static unsigned int in_module_init = 1; @@ -159,6 +165,7 @@ static const struct pci_device_id piix_pci_tbl[] = { { 0x8086, 0x7111, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix4_pata }, { 0x8086, 0x24db, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_pata }, { 0x8086, 0x25a2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_pata }, + { 0x8086, 0x27df, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_pata }, #endif /* NOTE: The following PCI ids must be kept in sync with the @@ -182,15 +189,15 @@ static const struct pci_device_id piix_pci_tbl[] = { /* 82801GB/GR/GH (ICH7, identical to ICH6) */ { 0x8086, 0x27c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, /* 2801GBM/GHM (ICH7M, identical to ICH6M) */ - { 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6m_sata_ahci }, + { 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich7m_sata_ahci }, /* Enterprise Southbridge 2 (where's the datasheet?) */ { 0x8086, 0x2680, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, /* SATA Controller 1 IDE (ICH8, no datasheet yet) */ - { 0x8086, 0x2820, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, + { 0x8086, 0x2820, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_ahci }, /* SATA Controller 2 IDE (ICH8, ditto) */ - { 0x8086, 0x2825, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, + { 0x8086, 0x2825, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_ahci }, /* Mobile SATA Controller IDE (ICH8M, ditto) */ - { 0x8086, 0x2828, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6m_sata_ahci }, + { 0x8086, 0x2828, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_ahci }, { } /* terminate list */ }; @@ -218,6 +225,7 @@ static struct scsi_host_template piix_sht = { .proc_name = DRV_NAME, .dma_boundary = ATA_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, + .slave_destroy = ata_scsi_slave_destroy, .bios_param = ata_std_bios_param, .resume = ata_scsi_device_resume, .suspend = ata_scsi_device_suspend, @@ -227,6 +235,7 @@ static const struct ata_port_operations piix_pata_ops = { .port_disable = ata_port_disable, .set_piomode = piix_set_piomode, .set_dmamode = piix_set_dmamode, + .mode_filter = ata_pci_default_filter, .tf_load = ata_tf_load, .tf_read = ata_tf_read, @@ -234,23 +243,25 @@ static const struct ata_port_operations piix_pata_ops = { .exec_command = ata_exec_command, .dev_select = ata_std_dev_select, - .probe_reset = piix_pata_probe_reset, - .bmdma_setup = ata_bmdma_setup, .bmdma_start = ata_bmdma_start, .bmdma_stop = ata_bmdma_stop, .bmdma_status = ata_bmdma_status, .qc_prep = ata_qc_prep, .qc_issue = ata_qc_issue_prot, + .data_xfer = ata_pio_data_xfer, - .eng_timeout = ata_eng_timeout, + .freeze = ata_bmdma_freeze, + .thaw = ata_bmdma_thaw, + .error_handler = piix_pata_error_handler, + .post_internal_cmd = ata_bmdma_post_internal_cmd, .irq_handler = ata_interrupt, .irq_clear = ata_bmdma_irq_clear, .port_start = ata_port_start, .port_stop = ata_port_stop, - .host_stop = ata_host_stop, + .host_stop = piix_host_stop, }; static const struct ata_port_operations piix_sata_ops = { @@ -262,27 +273,31 @@ static const struct ata_port_operations piix_sata_ops = { .exec_command = ata_exec_command, .dev_select = ata_std_dev_select, - .probe_reset = piix_sata_probe_reset, - .bmdma_setup = ata_bmdma_setup, .bmdma_start = ata_bmdma_start, .bmdma_stop = ata_bmdma_stop, .bmdma_status = ata_bmdma_status, .qc_prep = ata_qc_prep, .qc_issue = ata_qc_issue_prot, + .data_xfer = ata_pio_data_xfer, - .eng_timeout = ata_eng_timeout, + .freeze = ata_bmdma_freeze, + .thaw = ata_bmdma_thaw, + .error_handler = piix_sata_error_handler, + .post_internal_cmd = ata_bmdma_post_internal_cmd, .irq_handler = ata_interrupt, .irq_clear = ata_bmdma_irq_clear, .port_start = ata_port_start, .port_stop = ata_port_stop, - .host_stop = ata_host_stop, + .host_stop = piix_host_stop, }; -static struct piix_map_db ich5_map_db = { +static const struct piix_map_db ich5_map_db = { .mask = 0x7, + .port_enable = 0x3, + .present_shift = 4, .map = { /* PM PS SM SS MAP */ { P0, NA, P1, NA }, /* 000b */ @@ -296,8 +311,10 @@ static struct piix_map_db ich5_map_db = { }, }; -static struct piix_map_db ich6_map_db = { +static const struct piix_map_db ich6_map_db = { .mask = 0x3, + .port_enable = 0xf, + .present_shift = 4, .map = { /* PM PS SM SS MAP */ { P0, P2, P1, P3 }, /* 00b */ @@ -307,8 +324,10 @@ static struct piix_map_db ich6_map_db = { }, }; -static struct piix_map_db ich6m_map_db = { +static const struct piix_map_db ich6m_map_db = { .mask = 0x3, + .port_enable = 0x5, + .present_shift = 4, .map = { /* PM PS SM SS MAP */ { P0, P2, RV, RV }, /* 00b */ @@ -318,6 +337,47 @@ static struct piix_map_db ich6m_map_db = { }, }; +static const struct piix_map_db ich7m_map_db = { + .mask = 0x3, + .port_enable = 0x5, + .present_shift = 4, + + /* Map 01b isn't specified in the doc but some notebooks use + * it anyway. ATM, the only case spotted carries subsystem ID + * 1025:0107. This is the only difference from ich6m. + */ + .map = { + /* PM PS SM SS MAP */ + { P0, P2, RV, RV }, /* 00b */ + { IDE, IDE, P1, P3 }, /* 01b */ + { P0, P2, IDE, IDE }, /* 10b */ + { RV, RV, RV, RV }, + }, +}; + +static const struct piix_map_db ich8_map_db = { + .mask = 0x3, + .port_enable = 0x3, + .present_shift = 8, + .map = { + /* PM PS SM SS MAP */ + { P0, NA, P1, NA }, /* 00b (hardwired) */ + { RV, RV, RV, RV }, + { RV, RV, RV, RV }, /* 10b (never) */ + { RV, RV, RV, RV }, + }, +}; + +static const struct piix_map_db *piix_map_db_table[] = { + [ich5_sata] = &ich5_map_db, + [esb_sata] = &ich5_map_db, + [ich6_sata] = &ich6_map_db, + [ich6_sata_ahci] = &ich6_map_db, + [ich6m_sata_ahci] = &ich6m_map_db, + [ich7m_sata_ahci] = &ich7m_map_db, + [ich8_sata_ahci] = &ich8_map_db, +}; + static struct ata_port_info piix_port_info[] = { /* piix4_pata */ { @@ -350,63 +410,82 @@ static struct ata_port_info piix_port_info[] = { /* ich5_sata */ { .sht = &piix_sht, - .host_flags = ATA_FLAG_SATA | PIIX_FLAG_COMBINED | - PIIX_FLAG_CHECKINTR, + .host_flags = ATA_FLAG_SATA | PIIX_FLAG_CHECKINTR | + PIIX_FLAG_IGNORE_PCS, .pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ .udma_mask = 0x7f, /* udma0-6 */ .port_ops = &piix_sata_ops, - .private_data = &ich5_map_db, }, /* i6300esb_sata */ { .sht = &piix_sht, - .host_flags = ATA_FLAG_SATA | PIIX_FLAG_COMBINED | + .host_flags = ATA_FLAG_SATA | PIIX_FLAG_CHECKINTR | PIIX_FLAG_IGNORE_PCS, .pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ .udma_mask = 0x7f, /* udma0-6 */ .port_ops = &piix_sata_ops, - .private_data = &ich5_map_db, }, /* ich6_sata */ { .sht = &piix_sht, - .host_flags = ATA_FLAG_SATA | PIIX_FLAG_COMBINED_ICH6 | + .host_flags = ATA_FLAG_SATA | PIIX_FLAG_CHECKINTR | PIIX_FLAG_SCR, .pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ .udma_mask = 0x7f, /* udma0-6 */ .port_ops = &piix_sata_ops, - .private_data = &ich6_map_db, }, /* ich6_sata_ahci */ { .sht = &piix_sht, - .host_flags = ATA_FLAG_SATA | PIIX_FLAG_COMBINED_ICH6 | + .host_flags = ATA_FLAG_SATA | PIIX_FLAG_CHECKINTR | PIIX_FLAG_SCR | PIIX_FLAG_AHCI, .pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ .udma_mask = 0x7f, /* udma0-6 */ .port_ops = &piix_sata_ops, - .private_data = &ich6_map_db, }, /* ich6m_sata_ahci */ { .sht = &piix_sht, - .host_flags = ATA_FLAG_SATA | PIIX_FLAG_COMBINED_ICH6 | + .host_flags = ATA_FLAG_SATA | + PIIX_FLAG_CHECKINTR | PIIX_FLAG_SCR | + PIIX_FLAG_AHCI, + .pio_mask = 0x1f, /* pio0-4 */ + .mwdma_mask = 0x07, /* mwdma0-2 */ + .udma_mask = 0x7f, /* udma0-6 */ + .port_ops = &piix_sata_ops, + }, + + /* ich7m_sata_ahci */ + { + .sht = &piix_sht, + .host_flags = ATA_FLAG_SATA | + PIIX_FLAG_CHECKINTR | PIIX_FLAG_SCR | + PIIX_FLAG_AHCI, + .pio_mask = 0x1f, /* pio0-4 */ + .mwdma_mask = 0x07, /* mwdma0-2 */ + .udma_mask = 0x7f, /* udma0-6 */ + .port_ops = &piix_sata_ops, + }, + + /* ich8_sata_ahci */ + { + .sht = &piix_sht, + .host_flags = ATA_FLAG_SATA | PIIX_FLAG_CHECKINTR | PIIX_FLAG_SCR | PIIX_FLAG_AHCI, .pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ .udma_mask = 0x7f, /* udma0-6 */ .port_ops = &piix_sata_ops, - .private_data = &ich6m_map_db, }, }; @@ -421,6 +500,11 @@ MODULE_LICENSE("GPL"); MODULE_DEVICE_TABLE(pci, piix_pci_tbl); MODULE_VERSION(DRV_VERSION); +static int force_pcs = 0; +module_param(force_pcs, int, 0444); +MODULE_PARM_DESC(force_pcs, "force honoring or ignoring PCS to work around " + "device mis-detection (0=default, 1=ignore PCS, 2=honor PCS)"); + /** * piix_pata_cbl_detect - Probe host controller cable detect info * @ap: Port for which cable detect info is desired @@ -455,97 +539,70 @@ cbl40: } /** - * piix_pata_probeinit - probeinit for PATA host controller + * piix_pata_prereset - prereset for PATA host controller * @ap: Target port * - * Probeinit including cable detection. + * Prereset including cable detection. * * LOCKING: * None (inherited from caller). */ -static void piix_pata_probeinit(struct ata_port *ap) -{ - piix_pata_cbl_detect(ap); - ata_std_probeinit(ap); -} - -/** - * piix_pata_probe_reset - Perform reset on PATA port and classify - * @ap: Port to reset - * @classes: Resulting classes of attached devices - * - * Reset PATA phy and classify attached devices. - * - * LOCKING: - * None (inherited from caller). - */ -static int piix_pata_probe_reset(struct ata_port *ap, unsigned int *classes) +static int piix_pata_prereset(struct ata_port *ap) { struct pci_dev *pdev = to_pci_dev(ap->host_set->dev); if (!pci_test_config_bits(pdev, &piix_enable_bits[ap->hard_port_no])) { - printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id); + ata_port_printk(ap, KERN_INFO, "port disabled. ignoring.\n"); + ap->eh_context.i.action &= ~ATA_EH_RESET_MASK; return 0; } - return ata_drive_probe_reset(ap, piix_pata_probeinit, - ata_std_softreset, NULL, - ata_std_postreset, classes); + piix_pata_cbl_detect(ap); + + return ata_std_prereset(ap); +} + +static void piix_pata_error_handler(struct ata_port *ap) +{ + ata_bmdma_drive_eh(ap, piix_pata_prereset, ata_std_softreset, NULL, + ata_std_postreset); } /** - * piix_sata_probe - Probe PCI device for present SATA devices - * @ap: Port associated with the PCI device we wish to probe + * piix_sata_present_mask - determine present mask for SATA host controller + * @ap: Target port * - * Reads and configures SATA PCI device's PCI config register - * Port Configuration and Status (PCS) to determine port and - * device availability. + * Reads SATA PCI device's PCI config register Port Configuration + * and Status (PCS) to determine port and device availability. * * LOCKING: * None (inherited from caller). * * RETURNS: - * Mask of avaliable devices on the port. + * determined present_mask */ -static unsigned int piix_sata_probe (struct ata_port *ap) +static unsigned int piix_sata_present_mask(struct ata_port *ap) { struct pci_dev *pdev = to_pci_dev(ap->host_set->dev); - const unsigned int *map = ap->host_set->private_data; + struct piix_host_priv *hpriv = ap->host_set->private_data; + const unsigned int *map = hpriv->map; int base = 2 * ap->hard_port_no; unsigned int present_mask = 0; int port, i; - u8 pcs; + u16 pcs; - pci_read_config_byte(pdev, ICH5_PCS, &pcs); + pci_read_config_word(pdev, ICH5_PCS, &pcs); DPRINTK("ata%u: ENTER, pcs=0x%x base=%d\n", ap->id, pcs, base); - /* enable all ports on this ap and wait for them to settle */ - for (i = 0; i < 2; i++) { - port = map[base + i]; - if (port >= 0) - pcs |= 1 << port; - } - - pci_write_config_byte(pdev, ICH5_PCS, pcs); - msleep(100); - - /* let's see which devices are present */ - pci_read_config_byte(pdev, ICH5_PCS, &pcs); - for (i = 0; i < 2; i++) { port = map[base + i]; if (port < 0) continue; - if (ap->flags & PIIX_FLAG_IGNORE_PCS || pcs & 1 << (4 + port)) + if ((ap->flags & PIIX_FLAG_IGNORE_PCS) || + (pcs & 1 << (hpriv->map_db->present_shift + port))) present_mask |= 1 << i; - else - pcs &= ~(1 << port); } - /* disable offline ports on non-AHCI controllers */ - if (!(ap->flags & PIIX_FLAG_AHCI)) - pci_write_config_byte(pdev, ICH5_PCS, pcs); - DPRINTK("ata%u: LEAVE, pcs=0x%x present_mask=0x%x\n", ap->id, pcs, present_mask); @@ -553,25 +610,43 @@ static unsigned int piix_sata_probe (struct ata_port *ap) } /** - * piix_sata_probe_reset - Perform reset on SATA port and classify - * @ap: Port to reset - * @classes: Resulting classes of attached devices + * piix_sata_softreset - reset SATA host port via ATA SRST + * @ap: port to reset + * @classes: resulting classes of attached devices * - * Reset SATA phy and classify attached devices. + * Reset SATA host port via ATA SRST. On controllers with + * reliable PCS present bits, the bits are used to determine + * device presence. * * LOCKING: - * None (inherited from caller). + * Kernel thread context (may sleep) + * + * RETURNS: + * 0 on success, -errno otherwise. */ -static int piix_sata_probe_reset(struct ata_port *ap, unsigned int *classes) +static int piix_sata_softreset(struct ata_port *ap, unsigned int *classes) { - if (!piix_sata_probe(ap)) { - printk(KERN_INFO "ata%u: SATA port has no device.\n", ap->id); - return 0; + unsigned int present_mask; + int i, rc; + + present_mask = piix_sata_present_mask(ap); + + rc = ata_std_softreset(ap, classes); + if (rc) + return rc; + + for (i = 0; i < ATA_MAX_DEVICES; i++) { + if (!(present_mask & (1 << i))) + classes[i] = ATA_DEV_NONE; } - return ata_drive_probe_reset(ap, ata_std_probeinit, - ata_std_softreset, NULL, - ata_std_postreset, classes); + return 0; +} + +static void piix_sata_error_handler(struct ata_port *ap) +{ + ata_bmdma_drive_eh(ap, ata_std_prereset, piix_sata_softreset, NULL, + ata_std_postreset); } /** @@ -760,23 +835,53 @@ static int __devinit piix_check_450nx_errata(struct pci_dev *ata_dev) 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) + 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) + else if (cfg & (1<<14) && rev < 5) no_piix_dma = 2; } - if(no_piix_dma) + if (no_piix_dma) dev_printk(KERN_WARNING, &ata_dev->dev, "450NX errata present, disabling IDE DMA.\n"); - if(no_piix_dma == 2) + if (no_piix_dma == 2) dev_printk(KERN_WARNING, &ata_dev->dev, "A BIOS update may resolve this.\n"); return no_piix_dma; } +static void __devinit piix_init_pcs(struct pci_dev *pdev, + struct ata_port_info *pinfo, + const struct piix_map_db *map_db) +{ + u16 pcs, new_pcs; + + pci_read_config_word(pdev, ICH5_PCS, &pcs); + + new_pcs = pcs | map_db->port_enable; + + if (new_pcs != pcs) { + DPRINTK("updating PCS from 0x%x to 0x%x\n", pcs, new_pcs); + pci_write_config_word(pdev, ICH5_PCS, new_pcs); + msleep(150); + } + + if (force_pcs == 1) { + dev_printk(KERN_INFO, &pdev->dev, + "force ignoring PCS (0x%x)\n", new_pcs); + pinfo[0].host_flags |= PIIX_FLAG_IGNORE_PCS; + pinfo[1].host_flags |= PIIX_FLAG_IGNORE_PCS; + } else if (force_pcs == 2) { + dev_printk(KERN_INFO, &pdev->dev, + "force honoring PCS (0x%x)\n", new_pcs); + pinfo[0].host_flags &= ~PIIX_FLAG_IGNORE_PCS; + pinfo[1].host_flags &= ~PIIX_FLAG_IGNORE_PCS; + } +} + static void __devinit piix_init_sata_map(struct pci_dev *pdev, - struct ata_port_info *pinfo) + struct ata_port_info *pinfo, + const struct piix_map_db *map_db) { - struct piix_map_db *map_db = pinfo[0].private_data; + struct piix_host_priv *hpriv = pinfo[0].private_data; const unsigned int *map; int i, invalid_map = 0; u8 map_value; @@ -800,6 +905,7 @@ static void __devinit piix_init_sata_map(struct pci_dev *pdev, case IDE: WARN_ON((i & 1) || map[i + 1] != IDE); pinfo[i / 2] = piix_port_info[ich5_pata]; + pinfo[i / 2].private_data = hpriv; i++; printk(" IDE IDE"); break; @@ -817,8 +923,8 @@ static void __devinit piix_init_sata_map(struct pci_dev *pdev, dev_printk(KERN_ERR, &pdev->dev, "invalid MAP value %u\n", map_value); - pinfo[0].private_data = (void *)map; - pinfo[1].private_data = (void *)map; + hpriv->map = map; + hpriv->map_db = map_db; } /** @@ -841,6 +947,7 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) static int printed_version; struct ata_port_info port_info[2]; struct ata_port_info *ppinfo[2] = { &port_info[0], &port_info[1] }; + struct piix_host_priv *hpriv; unsigned long host_flags; if (!printed_version++) @@ -851,8 +958,14 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) if (!in_module_init) return -ENODEV; + hpriv = kzalloc(sizeof(*hpriv), GFP_KERNEL); + if (!hpriv) + return -ENOMEM; + port_info[0] = piix_port_info[ent->driver_data]; port_info[1] = piix_port_info[ent->driver_data]; + port_info[0].private_data = hpriv; + port_info[1].private_data = hpriv; host_flags = port_info[0].host_flags; @@ -867,8 +980,12 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) } /* Initialize SATA map */ - if (host_flags & ATA_FLAG_SATA) - piix_init_sata_map(pdev, port_info); + if (host_flags & ATA_FLAG_SATA) { + piix_init_sata_map(pdev, port_info, + piix_map_db_table[ent->driver_data]); + piix_init_pcs(pdev, port_info, + piix_map_db_table[ent->driver_data]); + } /* On ICH5, some BIOSen disable the interrupt using the * PCI_COMMAND_INTX_DISABLE bit added in PCI 2.3. @@ -891,6 +1008,13 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) return ata_pci_init_one(pdev, ppinfo, 2); } +static void piix_host_stop(struct ata_host_set *host_set) +{ + if (host_set->next == NULL) + kfree(host_set->private_data); + ata_host_stop(host_set); +} + static int __init piix_init(void) { int rc; diff --git a/drivers/scsi/atari_NCR5380.c b/drivers/scsi/atari_NCR5380.c index 57295bcea..e397129c9 100644 --- a/drivers/scsi/atari_NCR5380.c +++ b/drivers/scsi/atari_NCR5380.c @@ -507,7 +507,7 @@ static __inline__ void initialize_SCp(Scsi_Cmnd *cmd) */ if (cmd->use_sg) { - cmd->SCp.buffer = (struct scatterlist *) cmd->buffer; + cmd->SCp.buffer = (struct scatterlist *) cmd->request_buffer; cmd->SCp.buffers_residual = cmd->use_sg - 1; cmd->SCp.ptr = (char *)page_address(cmd->SCp.buffer->page)+ cmd->SCp.buffer->offset; @@ -524,7 +524,6 @@ static __inline__ void initialize_SCp(Scsi_Cmnd *cmd) } } -#include #include #if NDEBUG diff --git a/drivers/scsi/atari_scsi.c b/drivers/scsi/atari_scsi.c index f677c5a32..e1be4a438 100644 --- a/drivers/scsi/atari_scsi.c +++ b/drivers/scsi/atari_scsi.c @@ -65,7 +65,6 @@ -#include #include #define NDEBUG (0) diff --git a/drivers/scsi/atp870u.c b/drivers/scsi/atp870u.c index a198d8666..0ec41f34f 100644 --- a/drivers/scsi/atp870u.c +++ b/drivers/scsi/atp870u.c @@ -473,7 +473,7 @@ go_42: */ if (workreq->use_sg) { pci_unmap_sg(dev->pdev, - (struct scatterlist *)workreq->buffer, + (struct scatterlist *)workreq->request_buffer, workreq->use_sg, workreq->sc_data_direction); } else if (workreq->request_bufflen && @@ -2625,29 +2625,32 @@ static int atp870u_probe(struct pci_dev *pdev, const struct pci_device_id *ent) unsigned int base_io, tmport, error,n; unsigned char host_id; struct Scsi_Host *shpnt = NULL; - struct atp_unit atp_dev, *p; + struct atp_unit *atpdev, *p; unsigned char setupdata[2][16]; int count = 0; - + + atpdev = kzalloc(sizeof(*atpdev), GFP_KERNEL); + if (!atpdev) + return -ENOMEM; + if (pci_enable_device(pdev)) - return -EIO; + goto err_eio; if (!pci_set_dma_mask(pdev, DMA_32BIT_MASK)) { printk(KERN_INFO "atp870u: use 32bit DMA mask.\n"); } else { printk(KERN_ERR "atp870u: DMA mask required but not available.\n"); - return -EIO; + goto err_eio; } - memset(&atp_dev, 0, sizeof atp_dev); /* * It's probably easier to weed out some revisions like * this than via the PCI device table */ if (ent->device == PCI_DEVICE_ID_ARTOP_AEC7610) { - error = pci_read_config_byte(pdev, PCI_CLASS_REVISION, &atp_dev.chip_ver); - if (atp_dev.chip_ver < 2) - return -EIO; + error = pci_read_config_byte(pdev, PCI_CLASS_REVISION, &atpdev->chip_ver); + if (atpdev->chip_ver < 2) + goto err_eio; } switch (ent->device) { @@ -2656,15 +2659,15 @@ static int atp870u_probe(struct pci_dev *pdev, const struct pci_device_id *ent) case ATP880_DEVID1: case ATP880_DEVID2: case ATP885_DEVID: - atp_dev.chip_ver = 0x04; + atpdev->chip_ver = 0x04; default: break; } base_io = pci_resource_start(pdev, 0); base_io &= 0xfffffff8; - + if ((ent->device == ATP880_DEVID1)||(ent->device == ATP880_DEVID2)) { - error = pci_read_config_byte(pdev, PCI_CLASS_REVISION, &atp_dev.chip_ver); + error = pci_read_config_byte(pdev, PCI_CLASS_REVISION, &atpdev->chip_ver); pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0x80);//JCC082803 host_id = inb(base_io + 0x39); @@ -2672,17 +2675,17 @@ static int atp870u_probe(struct pci_dev *pdev, const struct pci_device_id *ent) printk(KERN_INFO " ACARD AEC-67160 PCI Ultra3 LVD Host Adapter: %d" " IO:%x, IRQ:%d.\n", count, base_io, pdev->irq); - atp_dev.ioport[0] = base_io + 0x40; - atp_dev.pciport[0] = base_io + 0x28; - atp_dev.dev_id = ent->device; - atp_dev.host_id[0] = host_id; + atpdev->ioport[0] = base_io + 0x40; + atpdev->pciport[0] = base_io + 0x28; + atpdev->dev_id = ent->device; + atpdev->host_id[0] = host_id; tmport = base_io + 0x22; - atp_dev.scam_on = inb(tmport); + atpdev->scam_on = inb(tmport); tmport += 0x13; - atp_dev.global_map[0] = inb(tmport); + atpdev->global_map[0] = inb(tmport); tmport += 0x07; - atp_dev.ultra_map[0] = inw(tmport); + atpdev->ultra_map[0] = inw(tmport); n = 0x3f09; next_fblk_880: @@ -2695,63 +2698,63 @@ next_fblk_880: if (inb(base_io + 0x30) == 0xff) goto flash_ok_880; - atp_dev.sp[0][m++] = inb(base_io + 0x30); - atp_dev.sp[0][m++] = inb(base_io + 0x31); - atp_dev.sp[0][m++] = inb(base_io + 0x32); - atp_dev.sp[0][m++] = inb(base_io + 0x33); + atpdev->sp[0][m++] = inb(base_io + 0x30); + atpdev->sp[0][m++] = inb(base_io + 0x31); + atpdev->sp[0][m++] = inb(base_io + 0x32); + atpdev->sp[0][m++] = inb(base_io + 0x33); outw(n, base_io + 0x34); n += 0x0002; - atp_dev.sp[0][m++] = inb(base_io + 0x30); - atp_dev.sp[0][m++] = inb(base_io + 0x31); - atp_dev.sp[0][m++] = inb(base_io + 0x32); - atp_dev.sp[0][m++] = inb(base_io + 0x33); + atpdev->sp[0][m++] = inb(base_io + 0x30); + atpdev->sp[0][m++] = inb(base_io + 0x31); + atpdev->sp[0][m++] = inb(base_io + 0x32); + atpdev->sp[0][m++] = inb(base_io + 0x33); outw(n, base_io + 0x34); n += 0x0002; - atp_dev.sp[0][m++] = inb(base_io + 0x30); - atp_dev.sp[0][m++] = inb(base_io + 0x31); - atp_dev.sp[0][m++] = inb(base_io + 0x32); - atp_dev.sp[0][m++] = inb(base_io + 0x33); + atpdev->sp[0][m++] = inb(base_io + 0x30); + atpdev->sp[0][m++] = inb(base_io + 0x31); + atpdev->sp[0][m++] = inb(base_io + 0x32); + atpdev->sp[0][m++] = inb(base_io + 0x33); outw(n, base_io + 0x34); n += 0x0002; - atp_dev.sp[0][m++] = inb(base_io + 0x30); - atp_dev.sp[0][m++] = inb(base_io + 0x31); - atp_dev.sp[0][m++] = inb(base_io + 0x32); - atp_dev.sp[0][m++] = inb(base_io + 0x33); + atpdev->sp[0][m++] = inb(base_io + 0x30); + atpdev->sp[0][m++] = inb(base_io + 0x31); + atpdev->sp[0][m++] = inb(base_io + 0x32); + atpdev->sp[0][m++] = inb(base_io + 0x33); n += 0x0018; goto next_fblk_880; flash_ok_880: outw(0, base_io + 0x34); - atp_dev.ultra_map[0] = 0; - atp_dev.async[0] = 0; + atpdev->ultra_map[0] = 0; + atpdev->async[0] = 0; for (k = 0; k < 16; k++) { n = 1; n = n << k; - if (atp_dev.sp[0][k] > 1) { - atp_dev.ultra_map[0] |= n; + if (atpdev->sp[0][k] > 1) { + atpdev->ultra_map[0] |= n; } else { - if (atp_dev.sp[0][k] == 0) - atp_dev.async[0] |= n; + if (atpdev->sp[0][k] == 0) + atpdev->async[0] |= n; } } - atp_dev.async[0] = ~(atp_dev.async[0]); - outb(atp_dev.global_map[0], base_io + 0x35); + atpdev->async[0] = ~(atpdev->async[0]); + outb(atpdev->global_map[0], base_io + 0x35); shpnt = scsi_host_alloc(&atp870u_template, sizeof(struct atp_unit)); if (!shpnt) - return -ENOMEM; + goto err_nomem; p = (struct atp_unit *)&shpnt->hostdata; - atp_dev.host = shpnt; - atp_dev.pdev = pdev; + atpdev->host = shpnt; + atpdev->pdev = pdev; pci_set_drvdata(pdev, p); - memcpy(p, &atp_dev, sizeof atp_dev); + memcpy(p, atpdev, sizeof(*atpdev)); if (atp870u_init_tables(shpnt) < 0) { printk(KERN_ERR "Unable to allocate tables for Acard controller\n"); goto unregister; } - if (request_irq(pdev->irq, atp870u_intr_handle, SA_SHIRQ, "atp880i", shpnt)) { + if (request_irq(pdev->irq, atp870u_intr_handle, IRQF_SHARED, "atp880i", shpnt)) { printk(KERN_ERR "Unable to allocate IRQ%d for Acard controller.\n", pdev->irq); goto free_tables; } @@ -2798,31 +2801,31 @@ flash_ok_880: printk(KERN_INFO " ACARD AEC-67162 PCI Ultra3 LVD Host Adapter: IO:%x, IRQ:%d.\n" , base_io, pdev->irq); - atp_dev.pdev = pdev; - atp_dev.dev_id = ent->device; - atp_dev.baseport = base_io; - atp_dev.ioport[0] = base_io + 0x80; - atp_dev.ioport[1] = base_io + 0xc0; - atp_dev.pciport[0] = base_io + 0x40; - atp_dev.pciport[1] = base_io + 0x50; + atpdev->pdev = pdev; + atpdev->dev_id = ent->device; + atpdev->baseport = base_io; + atpdev->ioport[0] = base_io + 0x80; + atpdev->ioport[1] = base_io + 0xc0; + atpdev->pciport[0] = base_io + 0x40; + atpdev->pciport[1] = base_io + 0x50; shpnt = scsi_host_alloc(&atp870u_template, sizeof(struct atp_unit)); if (!shpnt) - return -ENOMEM; + goto err_nomem; p = (struct atp_unit *)&shpnt->hostdata; - atp_dev.host = shpnt; - atp_dev.pdev = pdev; + atpdev->host = shpnt; + atpdev->pdev = pdev; pci_set_drvdata(pdev, p); - memcpy(p, &atp_dev, sizeof(struct atp_unit)); + memcpy(p, atpdev, sizeof(struct atp_unit)); if (atp870u_init_tables(shpnt) < 0) goto unregister; #ifdef ED_DBGP printk("request_irq() shpnt %p hostdata %p\n", shpnt, p); #endif - if (request_irq(pdev->irq, atp870u_intr_handle, SA_SHIRQ, "atp870u", shpnt)) { + if (request_irq(pdev->irq, atp870u_intr_handle, IRQF_SHARED, "atp870u", shpnt)) { printk(KERN_ERR "Unable to allocate IRQ for Acard controller.\n"); goto free_tables; } @@ -2974,43 +2977,43 @@ flash_ok_885: printk(KERN_INFO " ACARD AEC-671X PCI Ultra/W SCSI-2/3 Host Adapter: %d " "IO:%x, IRQ:%d.\n", count, base_io, pdev->irq); - atp_dev.ioport[0] = base_io; - atp_dev.pciport[0] = base_io + 0x20; - atp_dev.dev_id = ent->device; + atpdev->ioport[0] = base_io; + atpdev->pciport[0] = base_io + 0x20; + atpdev->dev_id = ent->device; host_id &= 0x07; - atp_dev.host_id[0] = host_id; + atpdev->host_id[0] = host_id; tmport = base_io + 0x22; - atp_dev.scam_on = inb(tmport); + atpdev->scam_on = inb(tmport); tmport += 0x0b; - atp_dev.global_map[0] = inb(tmport++); - atp_dev.ultra_map[0] = inw(tmport); + atpdev->global_map[0] = inb(tmport++); + atpdev->ultra_map[0] = inw(tmport); - if (atp_dev.ultra_map[0] == 0) { - atp_dev.scam_on = 0x00; - atp_dev.global_map[0] = 0x20; - atp_dev.ultra_map[0] = 0xffff; + if (atpdev->ultra_map[0] == 0) { + atpdev->scam_on = 0x00; + atpdev->global_map[0] = 0x20; + atpdev->ultra_map[0] = 0xffff; } shpnt = scsi_host_alloc(&atp870u_template, sizeof(struct atp_unit)); if (!shpnt) - return -ENOMEM; + goto err_nomem; p = (struct atp_unit *)&shpnt->hostdata; - atp_dev.host = shpnt; - atp_dev.pdev = pdev; + atpdev->host = shpnt; + atpdev->pdev = pdev; pci_set_drvdata(pdev, p); - memcpy(p, &atp_dev, sizeof atp_dev); + memcpy(p, atpdev, sizeof(*atpdev)); if (atp870u_init_tables(shpnt) < 0) goto unregister; - if (request_irq(pdev->irq, atp870u_intr_handle, SA_SHIRQ, "atp870i", shpnt)) { + if (request_irq(pdev->irq, atp870u_intr_handle, IRQF_SHARED, "atp870i", shpnt)) { printk(KERN_ERR "Unable to allocate IRQ%d for Acard controller.\n", pdev->irq); goto free_tables; } spin_lock_irqsave(shpnt->host_lock, flags); - if (atp_dev.chip_ver > 0x07) { /* check if atp876 chip then enable terminator */ + if (atpdev->chip_ver > 0x07) { /* check if atp876 chip then enable terminator */ tmport = base_io + 0x3e; outb(0x00, tmport); } @@ -3044,10 +3047,10 @@ flash_ok_885: outb((inb(tmport) & 0xef), tmport); tmport++; outb((inb(tmport) | 0x20), tmport); - if (atp_dev.chip_ver == 4) + if (atpdev->chip_ver == 4) shpnt->max_id = 16; else - shpnt->max_id = 7; + shpnt->max_id = 8; shpnt->this_id = host_id; shpnt->unique_id = base_io; shpnt->io_port = base_io; @@ -3093,6 +3096,12 @@ unregister: printk("atp870u_prob:unregister\n"); scsi_host_put(shpnt); return -1; +err_eio: + kfree(atpdev); + return -EIO; +err_nomem: + kfree(atpdev); + return -ENOMEM; } /* The abort command does not leave the device in a clean state where diff --git a/drivers/scsi/blz1230.c b/drivers/scsi/blz1230.c index 3867ac2de..329a8f297 100644 --- a/drivers/scsi/blz1230.c +++ b/drivers/scsi/blz1230.c @@ -172,7 +172,7 @@ int __init blz1230_esp_detect(struct scsi_host_template *tpnt) esp->irq = IRQ_AMIGA_PORTS; esp->slot = board+REAL_BLZ1230_ESP_ADDR; - if (request_irq(IRQ_AMIGA_PORTS, esp_intr, SA_SHIRQ, + if (request_irq(IRQ_AMIGA_PORTS, esp_intr, IRQF_SHARED, "Blizzard 1230 SCSI IV", esp->ehost)) goto err_out; diff --git a/drivers/scsi/blz2060.c b/drivers/scsi/blz2060.c index 4ebe69e32..b6c137b97 100644 --- a/drivers/scsi/blz2060.c +++ b/drivers/scsi/blz2060.c @@ -146,7 +146,7 @@ int __init blz2060_esp_detect(struct scsi_host_template *tpnt) esp->esp_command_dvma = virt_to_bus((void *)cmd_buffer); esp->irq = IRQ_AMIGA_PORTS; - request_irq(IRQ_AMIGA_PORTS, esp_intr, SA_SHIRQ, + request_irq(IRQ_AMIGA_PORTS, esp_intr, IRQF_SHARED, "Blizzard 2060 SCSI", esp->ehost); /* Figure out our scsi ID on the bus */ diff --git a/drivers/scsi/ch.c b/drivers/scsi/ch.c index d9abd1645..f6caa4307 100644 --- a/drivers/scsi/ch.c +++ b/drivers/scsi/ch.c @@ -7,7 +7,6 @@ #define VERSION "0.25" -#include #include #include #include diff --git a/drivers/scsi/constants.c b/drivers/scsi/constants.c index 30a335349..61f6024b6 100644 --- a/drivers/scsi/constants.c +++ b/drivers/scsi/constants.c @@ -5,17 +5,17 @@ * Additions for SCSI 3+ (SPC-3 T10/1416-D Rev 07 3 May 2002) * by D. Gilbert and aeb (20020609) * Additions for SPC-3 T10/1416-D Rev 21 22 Sept 2004, D. Gilbert 20041025 + * Update to SPC-4 T10/1713-D Rev 5a, 14 June 2006, D. Gilbert 20060702 */ -#include #include #include #include #include +#include #include #include -#include #include #include @@ -37,55 +37,56 @@ static const char * cdb_byte0_names[] = { /* 00-03 */ "Test Unit Ready", "Rezero Unit/Rewind", NULL, "Request Sense", /* 04-07 */ "Format Unit/Medium", "Read Block Limits", NULL, "Reasssign Blocks", -/* 08-0d */ "Read (6)", NULL, "Write (6)", "Seek (6)", NULL, NULL, +/* 08-0d */ "Read(6)", NULL, "Write(6)", "Seek(6)", NULL, NULL, /* 0e-12 */ NULL, "Read Reverse", "Write Filemarks", "Space", "Inquiry", -/* 13-16 */ "Verify (6)", "Recover Buffered Data", "Mode Select (6)", - "Reserve (6)", -/* 17-1a */ "Release (6)", "Copy", "Erase", "Mode Sense (6)", +/* 13-16 */ "Verify(6)", "Recover Buffered Data", "Mode Select(6)", + "Reserve(6)", +/* 17-1a */ "Release(6)", "Copy", "Erase", "Mode Sense(6)", /* 1b-1d */ "Start/Stop Unit", "Receive Diagnostic", "Send Diagnostic", /* 1e-1f */ "Prevent/Allow Medium Removal", NULL, /* 20-22 */ NULL, NULL, NULL, /* 23-28 */ "Read Format Capacities", "Set Window", - "Read Capacity (10)", NULL, NULL, "Read (10)", -/* 29-2d */ "Read Generation", "Write (10)", "Seek (10)", "Erase (10)", - "Read updated block", -/* 2e-31 */ "Write Verify (10)", "Verify (10)", "Search High", "Search Equal", + "Read Capacity(10)", NULL, NULL, "Read(10)", +/* 29-2d */ "Read Generation", "Write(10)", "Seek(10)", "Erase(10)", + "Read updated block", +/* 2e-31 */ "Write Verify(10)", "Verify(10)", "Search High", "Search Equal", /* 32-34 */ "Search Low", "Set Limits", "Prefetch/Read Position", -/* 35-37 */ "Synchronize Cache (10)", "Lock/Unlock Cache (10)", +/* 35-37 */ "Synchronize Cache(10)", "Lock/Unlock Cache(10)", "Read Defect Data(10)", /* 38-3c */ "Medium Scan", "Compare", "Copy Verify", "Write Buffer", "Read Buffer", -/* 3d-3f */ "Update Block", "Read Long (10)", "Write Long (10)", -/* 40-41 */ "Change Definition", "Write Same (10)", +/* 3d-3f */ "Update Block", "Read Long(10)", "Write Long(10)", +/* 40-41 */ "Change Definition", "Write Same(10)", /* 42-48 */ "Read sub-channel", "Read TOC/PMA/ATIP", "Read density support", - "Play audio (10)", "Get configuration", "Play audio msf", + "Play audio(10)", "Get configuration", "Play audio msf", "Play audio track/index", -/* 49-4f */ "Play track relative (10)", "Get event status notification", +/* 49-4f */ "Play track relative(10)", "Get event status notification", "Pause/resume", "Log Select", "Log Sense", "Stop play/scan", NULL, /* 50-55 */ "Xdwrite", "Xpwrite, Read disk info", "Xdread, Read track info", - "Reserve track", "Send OPC info", "Mode Select (10)", -/* 56-5b */ "Reserve (10)", "Release (10)", "Repair track", "Read master cue", - "Mode Sense (10)", "Close track/session", + "Reserve track", "Send OPC info", "Mode Select(10)", +/* 56-5b */ "Reserve(10)", "Release(10)", "Repair track", "Read master cue", + "Mode Sense(10)", "Close track/session", /* 5c-5f */ "Read buffer capacity", "Send cue sheet", "Persistent reserve in", "Persistent reserve out", /* 60-67 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 68-6f */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 70-77 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 78-7f */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, "Variable length", -/* 80-84 */ "Xdwrite (16)", "Rebuild (16)", "Regenerate (16)", "Extended copy", +/* 80-84 */ "Xdwrite(16)", "Rebuild(16)", "Regenerate(16)", "Extended copy", "Receive copy results", -/* 85-89 */ "Memory Export In (16)", "Access control in", "Access control out", - "Read (16)", "Memory Export Out (16)", -/* 8a-8f */ "Write (16)", NULL, "Read attributes", "Write attributes", - "Write and verify (16)", "Verify (16)", -/* 90-94 */ "Pre-fetch (16)", "Synchronize cache (16)", - "Lock/unlock cache (16)", "Write same (16)", NULL, +/* 85-89 */ "ATA command pass through(16)", "Access control in", + "Access control out", "Read(16)", "Memory Export Out(16)", +/* 8a-8f */ "Write(16)", NULL, "Read attributes", "Write attributes", + "Write and verify(16)", "Verify(16)", +/* 90-94 */ "Pre-fetch(16)", "Synchronize cache(16)", + "Lock/unlock cache(16)", "Write same(16)", NULL, /* 95-99 */ NULL, NULL, NULL, NULL, NULL, -/* 9a-9f */ NULL, NULL, NULL, NULL, "Service action in (16)", - "Service action out (16)", -/* a0-a5 */ "Report luns", "Blank", "Send event", "Maintenance in", - "Maintenance out", "Move medium/play audio(12)", +/* 9a-9f */ NULL, NULL, NULL, NULL, "Service action in(16)", + "Service action out(16)", +/* a0-a5 */ "Report luns", "ATA command pass through(12)/Blank", + "Security protocol in", "Maintenance in", "Maintenance out", + "Move medium/play audio(12)", /* a6-a9 */ "Exchange medium", "Move medium attached", "Read(12)", "Play track relative(12)", /* aa-ae */ "Write(12)", NULL, "Erase(12), Get Performance", @@ -93,12 +94,12 @@ static const char * cdb_byte0_names[] = { /* af-b1 */ "Verify(12)", "Search data high(12)", "Search data equal(12)", /* b2-b4 */ "Search data low(12)", "Set limits(12)", "Read element status attached", -/* b5-b6 */ "Request volume element address", "Send volume tag, set streaming", +/* b5-b6 */ "Security protocol out", "Send volume tag, set streaming", /* b7-b9 */ "Read defect data(12)", "Read element status", "Read CD msf", /* ba-bc */ "Redundancy group (in), Scan", - "Redundancy group (out), Set cd-rom speed", "Spare in, Play cd", -/* bd-bf */ "Spare out, Mechanism status", "Volume set in, Read cd", - "Volume set out, Send DVD structure", + "Redundancy group (out), Set cd-rom speed", "Spare (in), Play cd", +/* bd-bf */ "Spare (out), Mechanism status", "Volume set (in), Read cd", + "Volume set (out), Send DVD structure", }; struct value_name_pair { @@ -113,44 +114,40 @@ static const struct value_name_pair maint_in_arr[] = { {0xc, "Report supported operation codes"}, {0xd, "Report supported task management functions"}, {0xe, "Report priority"}, + {0xf, "Report timestamp"}, }; -#define MAINT_IN_SZ \ - (int)(sizeof(maint_in_arr) / sizeof(maint_in_arr[0])) +#define MAINT_IN_SZ ARRAY_SIZE(maint_in_arr) static const struct value_name_pair maint_out_arr[] = { {0x6, "Set device identifier"}, {0xa, "Set target port groups"}, {0xb, "Change aliases"}, {0xe, "Set priority"}, + {0xe, "Set timestamp"}, }; -#define MAINT_OUT_SZ \ - (int)(sizeof(maint_out_arr) / sizeof(maint_out_arr[0])) +#define MAINT_OUT_SZ ARRAY_SIZE(maint_out_arr) static const struct value_name_pair serv_in12_arr[] = { {0x1, "Read media serial number"}, }; -#define SERV_IN12_SZ \ - (int)(sizeof(serv_in12_arr) / sizeof(serv_in12_arr[0])) +#define SERV_IN12_SZ ARRAY_SIZE(serv_in12_arr) static const struct value_name_pair serv_out12_arr[] = { {-1, "dummy entry"}, }; -#define SERV_OUT12_SZ \ - (int)(sizeof(serv_out12_arr) / sizeof(serv_in12_arr[0])) +#define SERV_OUT12_SZ ARRAY_SIZE(serv_out12_arr) static const struct value_name_pair serv_in16_arr[] = { {0x10, "Read capacity(16)"}, {0x11, "Read long(16)"}, }; -#define SERV_IN16_SZ \ - (int)(sizeof(serv_in16_arr) / sizeof(serv_in16_arr[0])) +#define SERV_IN16_SZ ARRAY_SIZE(serv_in16_arr) static const struct value_name_pair serv_out16_arr[] = { {0x11, "Write long(16)"}, {0x1f, "Notify data transfer device(16)"}, }; -#define SERV_OUT16_SZ \ - (int)(sizeof(serv_out16_arr) / sizeof(serv_in16_arr[0])) +#define SERV_OUT16_SZ ARRAY_SIZE(serv_out16_arr) static const struct value_name_pair variable_length_arr[] = { {0x1, "Rebuild(32)"}, @@ -190,8 +187,7 @@ static const struct value_name_pair variable_length_arr[] = { {0x8f7e, "Perform SCSI command (osd)"}, {0x8f7f, "Perform task management function (osd)"}, }; -#define VARIABLE_LENGTH_SZ \ - (int)(sizeof(variable_length_arr) / sizeof(variable_length_arr[0])) +#define VARIABLE_LENGTH_SZ ARRAY_SIZE(variable_length_arr) static const char * get_sa_name(const struct value_name_pair * arr, int arr_sz, int service_action) @@ -435,6 +431,7 @@ static struct error_info additional[] = {0x001A, "Rewind operation in progress"}, {0x001B, "Set capacity operation in progress"}, {0x001C, "Verify operation in progress"}, + {0x001D, "ATA pass through information available"}, {0x0100, "No index/sector signal"}, @@ -446,7 +443,7 @@ static struct error_info additional[] = {0x0400, "Logical unit not ready, cause not reportable"}, {0x0401, "Logical unit is in process of becoming ready"}, - {0x0402, "Logical unit not ready, initializing cmd. required"}, + {0x0402, "Logical unit not ready, initializing command required"}, {0x0403, "Logical unit not ready, manual intervention required"}, {0x0404, "Logical unit not ready, format in progress"}, {0x0405, "Logical unit not ready, rebuild in progress"}, @@ -486,6 +483,9 @@ static struct error_info additional[] = {0x0B00, "Warning"}, {0x0B01, "Warning - specified temperature exceeded"}, {0x0B02, "Warning - enclosure degraded"}, + {0x0B03, "Warning - background self-test failed"}, + {0x0B04, "Warning - background pre-scan detected medium error"}, + {0x0B05, "Warning - background medium scan detected medium error"}, {0x0C00, "Write error"}, {0x0C01, "Write error - recovered with auto reallocation"}, @@ -501,6 +501,7 @@ static struct error_info additional[] = {0x0C0B, "Auxiliary memory write error"}, {0x0C0C, "Write error - unexpected unsolicited data"}, {0x0C0D, "Write error - not enough unsolicited data"}, + {0x0C0F, "Defects in error window"}, {0x0D00, "Error detected by third party temporary initiator"}, {0x0D01, "Third party device failure"}, @@ -512,11 +513,12 @@ static struct error_info additional[] = {0x0E00, "Invalid information unit"}, {0x0E01, "Information unit too short"}, {0x0E02, "Information unit too long"}, + {0x0E03, "Invalid field in command information unit"}, {0x1000, "Id CRC or ECC error"}, - {0x1001, "Data block guard check failed"}, - {0x1002, "Data block application tag check failed"}, - {0x1003, "Data block reference tag check failed"}, + {0x1001, "Logical block guard check failed"}, + {0x1002, "Logical block application tag check failed"}, + {0x1003, "Logical block reference tag check failed"}, {0x1100, "Unrecovered read error"}, {0x1101, "Read retries exhausted"}, @@ -538,6 +540,7 @@ static struct error_info additional[] = {0x1111, "Read error - loss of streaming"}, {0x1112, "Auxiliary memory read error"}, {0x1113, "Read error - failed retransmission request"}, + {0x1114, "Read error - lba marked bad by application client"}, {0x1200, "Address mark not found for id field"}, @@ -618,11 +621,14 @@ static struct error_info additional[] = {0x2100, "Logical block address out of range"}, {0x2101, "Invalid element address"}, {0x2102, "Invalid address for write"}, + {0x2103, "Invalid write crossing layer jump"}, {0x2200, "Illegal function (use 20 00, 24 00, or 26 00)"}, {0x2400, "Invalid field in cdb"}, {0x2401, "CDB decryption error"}, + {0x2402, "Obsolete"}, + {0x2403, "Obsolete"}, {0x2404, "Security audit value frozen"}, {0x2405, "Security working key frozen"}, {0x2406, "Nonce not unique"}, @@ -645,7 +651,10 @@ static struct error_info additional[] = {0x260C, "Invalid operation for copy source or destination"}, {0x260D, "Copy segment granularity violation"}, {0x260E, "Invalid parameter while port is enabled"}, - {0x260F, "Invalid data-out buffer integrity"}, + {0x260F, "Invalid data-out buffer integrity check value"}, + {0x2610, "Data decryption key fail limit reached"}, + {0x2611, "Incomplete key-associated data set"}, + {0x2612, "Vendor specific key reference not found"}, {0x2700, "Write protected"}, {0x2701, "Hardware write protected"}, @@ -657,6 +666,7 @@ static struct error_info additional[] = {0x2800, "Not ready to ready change, medium may have changed"}, {0x2801, "Import or export element accessed"}, + {0x2802, "Format-layer may have changed"}, {0x2900, "Power on, reset, or bus device reset occurred"}, {0x2901, "Power on occurred"}, @@ -677,6 +687,11 @@ static struct error_info additional[] = {0x2A07, "Implicit asymmetric access state transition failed"}, {0x2A08, "Priority changed"}, {0x2A09, "Capacity data has changed"}, + {0x2A10, "Timestamp changed"}, + {0x2A11, "Data encryption parameters changed by another i_t nexus"}, + {0x2A12, "Data encryption parameters changed by vendor specific " + "event"}, + {0x2A13, "Data encryption key instance counter has changed"}, {0x2B00, "Copy cannot execute since host cannot disconnect"}, @@ -698,6 +713,7 @@ static struct error_info additional[] = {0x2E00, "Insufficient time for operation"}, {0x2F00, "Commands cleared by another initiator"}, + {0x2F01, "Commands cleared by power loss notification"}, {0x3000, "Incompatible medium installed"}, {0x3001, "Cannot read medium - unknown format"}, @@ -710,7 +726,8 @@ static struct error_info additional[] = {0x3008, "Cannot write - application code mismatch"}, {0x3009, "Current session not fixated for append"}, {0x300A, "Cleaning request rejected"}, - {0x300C, "WORM medium, overwrite attempted"}, + {0x300C, "WORM medium - overwrite attempted"}, + {0x300D, "WORM medium - integrity check"}, {0x3010, "Medium not formatted"}, {0x3100, "Medium format corrupted"}, @@ -798,6 +815,9 @@ static struct error_info additional[] = {0x3F0F, "Echo buffer overwritten"}, {0x3F10, "Medium loadable"}, {0x3F11, "Medium auxiliary memory accessible"}, + {0x3F12, "iSCSI IP address added"}, + {0x3F13, "iSCSI IP address removed"}, + {0x3F14, "iSCSI IP address changed"}, /* * {0x40NN, "Ram failure"}, * {0x40NN, "Diagnostic failure on component nn"}, @@ -807,6 +827,7 @@ static struct error_info additional[] = {0x4300, "Message error"}, {0x4400, "Internal target failure"}, + {0x4471, "ATA device failed set features"}, {0x4500, "Select or reselect failure"}, @@ -815,9 +836,10 @@ static struct error_info additional[] = {0x4700, "Scsi parity error"}, {0x4701, "Data phase CRC error detected"}, {0x4702, "Scsi parity error detected during st data phase"}, - {0x4703, "Information unit CRC error detected"}, + {0x4703, "Information unit iuCRC error detected"}, {0x4704, "Asynchronous information protection error detected"}, {0x4705, "Protocol service CRC error"}, + {0x4706, "Phy test function in progress"}, {0x477f, "Some commands cleared by iSCSI Protocol event"}, {0x4800, "Initiator detected error message received"}, @@ -852,6 +874,8 @@ static struct error_info additional[] = {0x5300, "Media load or eject failed"}, {0x5301, "Unload tape failure"}, {0x5302, "Medium removal prevented"}, + {0x5303, "Medium removal prevented by data transfer element"}, + {0x5304, "Medium thread or unthread failure"}, {0x5400, "Scsi to host system interface failure"}, @@ -863,6 +887,7 @@ static struct error_info additional[] = {0x5505, "Insufficient access control resources"}, {0x5506, "Auxiliary memory out of space"}, {0x5507, "Quota error"}, + {0x5508, "Maximum number of supplemental decryption keys exceeded"}, {0x5700, "Unable to recover table-of-contents"}, @@ -1012,6 +1037,7 @@ static struct error_info additional[] = {0x6708, "Assign failure occurred"}, {0x6709, "Multiply assigned logical unit"}, {0x670A, "Set target port groups command failed"}, + {0x670B, "ATA device feature not enabled"}, {0x6800, "Logical unit not configured"}, @@ -1038,6 +1064,8 @@ static struct error_info additional[] = {0x6F03, "Read of scrambled sector without authentication"}, {0x6F04, "Media region code is mismatched to logical unit region"}, {0x6F05, "Drive region must be permanent/region reset count error"}, + {0x6F06, "Insufficient block count for binding nonce recording"}, + {0x6F07, "Conflict in binding nonce recording"}, /* * {0x70NN, "Decompression exception short algorithm id of nn"}, */ @@ -1049,6 +1077,8 @@ static struct error_info additional[] = {0x7203, "Session fixation error - incomplete track in session"}, {0x7204, "Empty or partially written reserved track"}, {0x7205, "No more track reservations allowed"}, + {0x7206, "RMZ extension is not allowed"}, + {0x7207, "No more test zone extensions are allowed"}, {0x7300, "Cd control error"}, {0x7301, "Power calibration area almost full"}, @@ -1057,6 +1087,18 @@ static struct error_info additional[] = {0x7304, "Program memory area update failure"}, {0x7305, "Program memory area is full"}, {0x7306, "RMA/PMA is almost full"}, + {0x7310, "Current power calibration area almost full"}, + {0x7311, "Current power calibration area is full"}, + {0x7317, "RDZ is full"}, + + {0x7400, "Security error"}, + {0x7401, "Unable to decrypt data"}, + {0x7402, "Unencrypted data encountered while decrypting"}, + {0x7403, "Incorrect data encryption key"}, + {0x7404, "Cryptographic integrity validation failed"}, + {0x7405, "Error decrypting data"}, + {0x7471, "Logical unit access not authorized"}, + {0, NULL} }; @@ -1268,16 +1310,6 @@ void scsi_print_sense(const char *devclass, struct scsi_cmnd *cmd) } EXPORT_SYMBOL(scsi_print_sense); -void scsi_print_req_sense(const char *devclass, struct scsi_request *sreq) -{ - const char *name = devclass; - - if (sreq->sr_request->rq_disk) - name = sreq->sr_request->rq_disk->disk_name; - __scsi_print_sense(name, sreq->sr_sense_buffer, SCSI_SENSE_BUFFERSIZE); -} -EXPORT_SYMBOL(scsi_print_req_sense); - void scsi_print_command(struct scsi_cmnd *cmd) { /* Assume appended output (i.e. not at start of line) */ @@ -1290,10 +1322,10 @@ EXPORT_SYMBOL(scsi_print_command); #ifdef CONFIG_SCSI_CONSTANTS static const char * const hostbyte_table[]={ -"DID_OK", "DID_NO_CONNECT", "DID_BUS_BUSY", "DID_TIME_OUT", "DID_BAD_TARGET", +"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"}; -#define NUM_HOSTBYTE_STRS (sizeof(hostbyte_table) / sizeof(const char *)) +#define NUM_HOSTBYTE_STRS ARRAY_SIZE(hostbyte_table) void scsi_print_hostbyte(int scsiresult) { @@ -1303,7 +1335,7 @@ void scsi_print_hostbyte(int scsiresult) if (hb < NUM_HOSTBYTE_STRS) printk("(%s) ", hostbyte_table[hb]); else - printk("is invalid "); + printk("is invalid "); } #else void scsi_print_hostbyte(int scsiresult) @@ -1315,14 +1347,14 @@ void scsi_print_hostbyte(int scsiresult) #ifdef CONFIG_SCSI_CONSTANTS static const char * const driverbyte_table[]={ -"DRIVER_OK", "DRIVER_BUSY", "DRIVER_SOFT", "DRIVER_MEDIA", "DRIVER_ERROR", +"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 *)) +#define NUM_DRIVERBYTE_STRS ARRAY_SIZE(driverbyte_table) 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 *)) +#define NUM_SUGGEST_STRS ARRAY_SIZE(driversuggest_table) void scsi_print_driverbyte(int scsiresult) { diff --git a/drivers/scsi/cyberstorm.c b/drivers/scsi/cyberstorm.c index a4a4fac5c..7c7cfb54e 100644 --- a/drivers/scsi/cyberstorm.c +++ b/drivers/scsi/cyberstorm.c @@ -172,7 +172,7 @@ int __init cyber_esp_detect(struct scsi_host_template *tpnt) esp->esp_command_dvma = virt_to_bus((void *)cmd_buffer); esp->irq = IRQ_AMIGA_PORTS; - request_irq(IRQ_AMIGA_PORTS, esp_intr, SA_SHIRQ, + request_irq(IRQ_AMIGA_PORTS, esp_intr, IRQF_SHARED, "CyberStorm SCSI", esp->ehost); /* Figure out our scsi ID on the bus */ /* The DMA cond flag contains a hardcoded jumper bit diff --git a/drivers/scsi/cyberstormII.c b/drivers/scsi/cyberstormII.c index 3a803d73b..d88cb9cf0 100644 --- a/drivers/scsi/cyberstormII.c +++ b/drivers/scsi/cyberstormII.c @@ -153,7 +153,7 @@ int __init cyberII_esp_detect(struct scsi_host_template *tpnt) esp->esp_command_dvma = virt_to_bus((void *)cmd_buffer); esp->irq = IRQ_AMIGA_PORTS; - request_irq(IRQ_AMIGA_PORTS, esp_intr, SA_SHIRQ, + request_irq(IRQ_AMIGA_PORTS, esp_intr, IRQF_SHARED, "CyberStorm SCSI Mk II", esp->ehost); /* Figure out our scsi ID on the bus */ diff --git a/drivers/scsi/dc395x.c b/drivers/scsi/dc395x.c index cbf825263..ff2b1796f 100644 --- a/drivers/scsi/dc395x.c +++ b/drivers/scsi/dc395x.c @@ -230,13 +230,12 @@ struct ScsiReqBlk { struct scsi_cmnd *cmd; struct SGentry *segment_x; /* Linear array of hw sg entries (up to 64 entries) */ - u32 sg_bus_addr; /* Bus address of sg list (ie, of segment_x) */ + dma_addr_t sg_bus_addr; /* Bus address of sg list (ie, of segment_x) */ u8 sg_count; /* No of HW sg entries for this request */ u8 sg_index; /* Index of HW sg entry for this request */ - u32 total_xfer_length; /* Total number of bytes remaining to be transfered */ - unsigned char *virt_addr; /* Virtual address of current transfer position */ - + size_t total_xfer_length; /* Total number of bytes remaining to be transfered */ + size_t request_length; /* Total number of bytes in this request */ /* * The sense buffer handling function, request_sense, uses * the first hw sg entry (segment_x[0]) and the transfer @@ -246,8 +245,7 @@ struct ScsiReqBlk { * total_xfer_length in xferred. These values are restored in * pci_unmap_srb_sense. This is the only place xferred is used. */ - unsigned char *virt_addr_req; /* Saved virtual address of the request buffer */ - u32 xferred; /* Saved copy of total_xfer_length */ + size_t xferred; /* Saved copy of total_xfer_length */ u16 state; @@ -977,17 +975,6 @@ static void send_srb(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) } } -static inline void pio_trigger(void) -{ - static int feedback_requested; - - if (!feedback_requested) { - feedback_requested = 1; - printk(KERN_WARNING "%s: Please, contact " - "to help improve support for your system.\n", __FILE__); - } -} - /* Prepare SRB for being sent to Device DCB w/ command *cmd */ static void build_srb(struct scsi_cmnd *cmd, struct DeviceCtlBlk *dcb, struct ScsiReqBlk *srb) @@ -1001,7 +988,6 @@ static void build_srb(struct scsi_cmnd *cmd, struct DeviceCtlBlk *dcb, srb->sg_count = 0; srb->total_xfer_length = 0; srb->sg_bus_addr = 0; - srb->virt_addr = NULL; srb->sg_index = 0; srb->adapter_status = 0; srb->target_status = 0; @@ -1032,7 +1018,6 @@ static void build_srb(struct scsi_cmnd *cmd, struct DeviceCtlBlk *dcb, reqlen, cmd->request_buffer, cmd->use_sg, srb->sg_count); - srb->virt_addr = page_address(sl->page); for (i = 0; i < srb->sg_count; i++) { u32 busaddr = (u32)sg_dma_address(&sl[i]); u32 seglen = (u32)sl[i].length; @@ -1077,12 +1062,14 @@ static void build_srb(struct scsi_cmnd *cmd, struct DeviceCtlBlk *dcb, srb->total_xfer_length++; srb->segment_x[0].length = srb->total_xfer_length; - srb->virt_addr = cmd->request_buffer; + dprintkdbg(DBG_0, "build_srb: [1] len=%d buf=%p use_sg=%d map=%08x\n", srb->total_xfer_length, cmd->request_buffer, cmd->use_sg, srb->segment_x[0].address); } + + srb->request_length = srb->total_xfer_length; } @@ -1414,10 +1401,10 @@ static int dc395x_eh_abort(struct scsi_cmnd *cmd) } srb = find_cmd(cmd, &dcb->srb_going_list); if (srb) { - dprintkl(KERN_DEBUG, "eh_abort: Command in progress"); + dprintkl(KERN_DEBUG, "eh_abort: Command in progress\n"); /* XXX: Should abort the command here */ } else { - dprintkl(KERN_DEBUG, "eh_abort: Command not found"); + dprintkl(KERN_DEBUG, "eh_abort: Command not found\n"); } return FAILED; } @@ -1976,14 +1963,11 @@ static void sg_verify_length(struct ScsiReqBlk *srb) /* * Compute the next Scatter Gather list index and adjust its length - * and address if necessary; also compute virt_addr + * and address if necessary */ static void sg_update_list(struct ScsiReqBlk *srb, u32 left) { u8 idx; - struct scatterlist *sg; - struct scsi_cmnd *cmd = srb->cmd; - int segment = cmd->use_sg; u32 xferred = srb->total_xfer_length - left; /* bytes transfered */ struct SGentry *psge = srb->segment_x + srb->sg_index; @@ -2016,29 +2000,6 @@ static void sg_update_list(struct ScsiReqBlk *srb, u32 left) psge++; } sg_verify_length(srb); - - /* we need the corresponding virtual address */ - if (!segment || (srb->flag & AUTO_REQSENSE)) { - srb->virt_addr += xferred; - return; - } - - /* We have to walk the scatterlist to find it */ - sg = (struct scatterlist *)cmd->request_buffer; - while (segment--) { - unsigned long mask = - ~((unsigned long)sg->length - 1) & PAGE_MASK; - if ((sg_dma_address(sg) & mask) == (psge->address & mask)) { - srb->virt_addr = (page_address(sg->page) - + psge->address - - (psge->address & PAGE_MASK)); - return; - } - ++sg; - } - - dprintkl(KERN_ERR, "sg_update_list: sg_to_virt failed\n"); - srb->virt_addr = NULL; } @@ -2050,15 +2011,7 @@ static void sg_update_list(struct ScsiReqBlk *srb, u32 left) */ static void sg_subtract_one(struct ScsiReqBlk *srb) { - srb->total_xfer_length--; - srb->segment_x[srb->sg_index].length--; - if (srb->total_xfer_length && - !srb->segment_x[srb->sg_index].length) { - if (debug_enabled(DBG_PIO)) - printk(" (next segment)"); - srb->sg_index++; - sg_update_list(srb, srb->total_xfer_length); - } + sg_update_list(srb, srb->total_xfer_length - 1); } @@ -2118,7 +2071,7 @@ static void data_out_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, * If we need more data, the DMA SG list will be freshly set up, anyway */ dprintkdbg(DBG_PIO, "data_out_phase0: " - "DMA{fifcnt=0x%02x fifostat=0x%02x} " + "DMA{fifocnt=0x%02x fifostat=0x%02x} " "SCSI{fifocnt=0x%02x cnt=0x%06x status=0x%04x} total=0x%06x\n", DC395x_read8(acb, TRM_S1040_DMA_FIFOCNT), DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT), @@ -2239,12 +2192,11 @@ static void data_out_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, data_io_transfer(acb, srb, XFERDATAOUT); } - static void data_in_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, u16 *pscsi_status) { u16 scsi_status = *pscsi_status; - u32 d_left_counter = 0; + dprintkdbg(DBG_0, "data_in_phase0: (pid#%li) <%02i-%i>\n", srb->cmd->pid, srb->cmd->device->id, srb->cmd->device->lun); @@ -2262,6 +2214,9 @@ static void data_in_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, * seem to be a bad idea, actually. */ if (!(srb->state & SRB_XFERPAD)) { + u32 d_left_counter; + unsigned int sc, fc; + if (scsi_status & PARITYERROR) { dprintkl(KERN_INFO, "data_in_phase0: (pid#%li) " "Parity Error\n", srb->cmd->pid); @@ -2298,18 +2253,19 @@ static void data_in_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT)); } /* Now: Check remainig data: The SCSI counters should tell us ... */ - d_left_counter = DC395x_read32(acb, TRM_S1040_SCSI_COUNTER) - + ((DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT) & 0x1f) + sc = DC395x_read32(acb, TRM_S1040_SCSI_COUNTER); + fc = DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT); + d_left_counter = sc + ((fc & 0x1f) << ((srb->dcb->sync_period & WIDE_SYNC) ? 1 : 0)); dprintkdbg(DBG_KG, "data_in_phase0: " "SCSI{fifocnt=0x%02x%s ctr=0x%08x} " "DMA{fifocnt=0x%02x fifostat=0x%02x ctr=0x%08x} " "Remain{totxfer=%i scsi_fifo+ctr=%i}\n", - DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT), + fc, (srb->dcb->sync_period & WIDE_SYNC) ? "words" : "bytes", - DC395x_read32(acb, TRM_S1040_SCSI_COUNTER), - DC395x_read8(acb, TRM_S1040_DMA_FIFOCNT), + sc, + fc, DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT), DC395x_read32(acb, TRM_S1040_DMA_CXCNT), srb->total_xfer_length, d_left_counter); @@ -2317,40 +2273,79 @@ static void data_in_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, /* KG: Less than or equal to 4 bytes can not be transfered via DMA, it seems. */ if (d_left_counter && srb->total_xfer_length <= DC395x_LASTPIO) { + size_t left_io = srb->total_xfer_length; + /*u32 addr = (srb->segment_x[srb->sg_index].address); */ /*sg_update_list (srb, d_left_counter); */ - dprintkdbg(DBG_PIO, "data_in_phase0: PIO (%i %s) to " - "%p for remaining %i bytes:", - DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT) & 0x1f, + dprintkdbg(DBG_PIO, "data_in_phase0: PIO (%i %s) " + "for remaining %i bytes:", + fc & 0x1f, (srb->dcb->sync_period & WIDE_SYNC) ? "words" : "bytes", - srb->virt_addr, srb->total_xfer_length); if (srb->dcb->sync_period & WIDE_SYNC) DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2, CFG2_WIDEFIFO); - while (DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT) != 0x40) { - u8 byte = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); - pio_trigger(); - *(srb->virt_addr)++ = byte; - if (debug_enabled(DBG_PIO)) - printk(" %02x", byte); - d_left_counter--; - sg_subtract_one(srb); - } - if (srb->dcb->sync_period & WIDE_SYNC) { -#if 1 - /* Read the last byte ... */ - if (srb->total_xfer_length > 0) { - u8 byte = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); - pio_trigger(); - *(srb->virt_addr)++ = byte; - srb->total_xfer_length--; + while (left_io) { + unsigned char *virt, *base = NULL; + unsigned long flags = 0; + size_t len = left_io; + + if (srb->cmd->use_sg) { + size_t offset = srb->request_length - left_io; + local_irq_save(flags); + /* Assumption: it's inside one page as it's at most 4 bytes and + I just assume it's on a 4-byte boundary */ + base = scsi_kmap_atomic_sg((struct scatterlist *)srb->cmd->request_buffer, + srb->sg_count, &offset, &len); + virt = base + offset; + } else { + virt = srb->cmd->request_buffer + srb->cmd->request_bufflen - left_io; + len = left_io; + } + left_io -= len; + + while (len) { + u8 byte; + byte = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); + *virt++ = byte; + if (debug_enabled(DBG_PIO)) printk(" %02x", byte); + + d_left_counter--; + sg_subtract_one(srb); + + len--; + + fc = DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT); + + if (fc == 0x40) { + left_io = 0; + break; + } + } + + WARN_ON((fc != 0x40) == !d_left_counter); + + if (fc == 0x40 && (srb->dcb->sync_period & WIDE_SYNC)) { + /* Read the last byte ... */ + if (srb->total_xfer_length > 0) { + u8 byte = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); + + *virt++ = byte; + srb->total_xfer_length--; + if (debug_enabled(DBG_PIO)) + printk(" %02x", byte); + } + + DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2, 0); + } + + if (srb->cmd->use_sg) { + scsi_kunmap_atomic_sg(base); + local_irq_restore(flags); } -#endif - DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2, 0); } /*printk(" %08x", *(u32*)(bus_to_virt (addr))); */ /*srb->total_xfer_length = 0; */ @@ -2509,22 +2504,43 @@ static void data_io_transfer(struct AdapterCtlBlk *acb, SCMD_FIFO_IN); } else { /* write */ int ln = srb->total_xfer_length; + size_t left_io = srb->total_xfer_length; + if (srb->dcb->sync_period & WIDE_SYNC) DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2, CFG2_WIDEFIFO); - dprintkdbg(DBG_PIO, - "data_io_transfer: PIO %i bytes from %p:", - srb->total_xfer_length, srb->virt_addr); - while (srb->total_xfer_length) { - if (debug_enabled(DBG_PIO)) - printk(" %02x", (unsigned char) *(srb->virt_addr)); + while (left_io) { + unsigned char *virt, *base = NULL; + unsigned long flags = 0; + size_t len = left_io; + + if (srb->cmd->use_sg) { + size_t offset = srb->request_length - left_io; + local_irq_save(flags); + /* Again, max 4 bytes */ + base = scsi_kmap_atomic_sg((struct scatterlist *)srb->cmd->request_buffer, + srb->sg_count, &offset, &len); + virt = base + offset; + } else { + virt = srb->cmd->request_buffer + srb->cmd->request_bufflen - left_io; + len = left_io; + } + left_io -= len; + + while (len--) { + if (debug_enabled(DBG_PIO)) + printk(" %02x", *virt); + + DC395x_write8(acb, TRM_S1040_SCSI_FIFO, *virt++); - pio_trigger(); - DC395x_write8(acb, TRM_S1040_SCSI_FIFO, - *(srb->virt_addr)++); + sg_subtract_one(srb); + } - sg_subtract_one(srb); + if (srb->cmd->use_sg) { + scsi_kunmap_atomic_sg(base); + local_irq_restore(flags); + } } if (srb->dcb->sync_period & WIDE_SYNC) { if (ln % 2) { @@ -3319,7 +3335,6 @@ static void pci_unmap_srb_sense(struct AdapterCtlBlk *acb, srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].address; srb->segment_x[0].length = srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].length; - srb->virt_addr = srb->virt_addr_req; } @@ -3332,21 +3347,14 @@ static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, { u8 tempcnt, status; struct scsi_cmnd *cmd = srb->cmd; - struct ScsiInqData *ptr; enum dma_data_direction dir = cmd->sc_data_direction; - - if (cmd->use_sg) { - struct scatterlist* sg = (struct scatterlist *)cmd->request_buffer; - ptr = (struct ScsiInqData *)(page_address(sg->page) + sg->offset); - } else { - ptr = (struct ScsiInqData *)(cmd->request_buffer); - } + int ckc_only = 1; dprintkdbg(DBG_1, "srb_done: (pid#%li) <%02i-%i>\n", srb->cmd->pid, srb->cmd->device->id, srb->cmd->device->lun); - dprintkdbg(DBG_SG, "srb_done: srb=%p sg=%i(%i/%i) buf=%p addr=%p\n", + dprintkdbg(DBG_SG, "srb_done: srb=%p sg=%i(%i/%i) buf=%p\n", srb, cmd->use_sg, srb->sg_index, srb->sg_count, - cmd->request_buffer, ptr); + cmd->request_buffer); status = srb->target_status; if (srb->flag & AUTO_REQSENSE) { dprintkdbg(DBG_0, "srb_done: AUTO_REQSENSE1\n"); @@ -3485,29 +3493,47 @@ static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, srb->segment_x[0].address, cmd->request_bufflen, dir); } - - if ((cmd->result & RES_DID) == 0 && cmd->cmnd[0] == INQUIRY - && cmd->cmnd[2] == 0 && cmd->request_bufflen >= 8 - && dir != PCI_DMA_NONE && ptr && (ptr->Vers & 0x07) >= 2) - dcb->inquiry7 = ptr->Flags; + ckc_only = 0; /* Check Error Conditions */ ckc_e: + if (cmd->cmnd[0] == INQUIRY) { + unsigned char *base = NULL; + struct ScsiInqData *ptr; + unsigned long flags = 0; + + if (cmd->use_sg) { + struct scatterlist* sg = (struct scatterlist *)cmd->request_buffer; + size_t offset = 0, len = sizeof(struct ScsiInqData); + + local_irq_save(flags); + base = scsi_kmap_atomic_sg(sg, cmd->use_sg, &offset, &len); + ptr = (struct ScsiInqData *)(base + offset); + } else + ptr = (struct ScsiInqData *)(cmd->request_buffer); + + if (!ckc_only && (cmd->result & RES_DID) == 0 + && cmd->cmnd[2] == 0 && cmd->request_bufflen >= 8 + && dir != PCI_DMA_NONE && ptr && (ptr->Vers & 0x07) >= 2) + dcb->inquiry7 = ptr->Flags; + /*if( srb->cmd->cmnd[0] == INQUIRY && */ /* (host_byte(cmd->result) == DID_OK || status_byte(cmd->result) & CHECK_CONDITION) ) */ - if (cmd->cmnd[0] == INQUIRY && (cmd->result == (DID_OK << 16) - || status_byte(cmd-> - result) & - CHECK_CONDITION)) { - - if (!dcb->init_tcq_flag) { - add_dev(acb, dcb, ptr); - dcb->init_tcq_flag = 1; + if ((cmd->result == (DID_OK << 16) + || status_byte(cmd->result) & + CHECK_CONDITION)) { + if (!dcb->init_tcq_flag) { + add_dev(acb, dcb, ptr); + dcb->init_tcq_flag = 1; + } } + if (cmd->use_sg) { + scsi_kunmap_atomic_sg(base); + local_irq_restore(flags); + } } - /* Here is the info for Doug Gilbert's sg3 ... */ cmd->resid = srb->total_xfer_length; /* This may be interpreted by sb. or not ... */ @@ -3713,8 +3739,6 @@ static void request_sense(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, srb->xferred = srb->total_xfer_length; /* srb->segment_x : a one entry of S/G list table */ srb->total_xfer_length = sizeof(cmd->sense_buffer); - srb->virt_addr_req = srb->virt_addr; - srb->virt_addr = cmd->sense_buffer; srb->segment_x[0].length = sizeof(cmd->sense_buffer); /* Map sense buffer */ srb->segment_x[0].address = @@ -3747,7 +3771,7 @@ static void request_sense(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, * @target: The target for the new device. * @lun: The lun for the new device. * - * Return the new device if succesfull or NULL on failure. + * Return the new device if successful or NULL on failure. **/ static struct DeviceCtlBlk *device_alloc(struct AdapterCtlBlk *acb, u8 target, u8 lun) @@ -4538,7 +4562,7 @@ static int __devinit adapter_init(struct AdapterCtlBlk *acb, acb->io_port_base = io_port; acb->io_port_len = io_port_len; - if (request_irq(irq, dc395x_interrupt, SA_SHIRQ, DC395X_NAME, acb)) { + if (request_irq(irq, dc395x_interrupt, IRQF_SHARED, DC395X_NAME, acb)) { /* release the region we just claimed */ dprintkl(KERN_INFO, "Failed to register IRQ\n"); goto failed; diff --git a/drivers/scsi/dec_esp.c b/drivers/scsi/dec_esp.c index a35ee43a4..eb32062f7 100644 --- a/drivers/scsi/dec_esp.c +++ b/drivers/scsi/dec_esp.c @@ -202,19 +202,19 @@ static int dec_esp_detect(struct scsi_host_template * tpnt) esp_initialize(esp); - if (request_irq(esp->irq, esp_intr, SA_INTERRUPT, + if (request_irq(esp->irq, esp_intr, IRQF_DISABLED, "ncr53c94", esp->ehost)) goto err_dealloc; if (request_irq(dec_interrupt[DEC_IRQ_ASC_MERR], - scsi_dma_merr_int, SA_INTERRUPT, + scsi_dma_merr_int, IRQF_DISABLED, "ncr53c94 error", esp->ehost)) goto err_free_irq; if (request_irq(dec_interrupt[DEC_IRQ_ASC_ERR], - scsi_dma_err_int, SA_INTERRUPT, + scsi_dma_err_int, IRQF_DISABLED, "ncr53c94 overrun", esp->ehost)) goto err_free_irq_merr; if (request_irq(dec_interrupt[DEC_IRQ_ASC_DMA], - scsi_dma_int, SA_INTERRUPT, + scsi_dma_int, IRQF_DISABLED, "ncr53c94 dma", esp->ehost)) goto err_free_irq_err; @@ -276,7 +276,7 @@ static int dec_esp_detect(struct scsi_host_template * tpnt) esp->dma_mmu_release_scsi_sgl = 0; esp->dma_advance_sg = 0; - if (request_irq(esp->irq, esp_intr, SA_INTERRUPT, + if (request_irq(esp->irq, esp_intr, IRQF_DISABLED, "PMAZ_AA", esp->ehost)) { esp_deallocate(esp); release_tc_card(slot); diff --git a/drivers/scsi/dmx3191d.c b/drivers/scsi/dmx3191d.c index 38e4010ef..879a26657 100644 --- a/drivers/scsi/dmx3191d.c +++ b/drivers/scsi/dmx3191d.c @@ -94,7 +94,7 @@ static int __devinit dmx3191d_probe_one(struct pci_dev *pdev, NCR5380_init(shost, FLAG_NO_PSEUDO_DMA | FLAG_DTC3181E); - if (request_irq(pdev->irq, NCR5380_intr, SA_SHIRQ, + if (request_irq(pdev->irq, NCR5380_intr, IRQF_SHARED, DMX3191D_DRIVER_NAME, shost)) { /* * Steam powered scsi controllers run without an IRQ anyway diff --git a/drivers/scsi/dpt/dpti_i2o.h b/drivers/scsi/dpt/dpti_i2o.h index a9585f523..d84a281ad 100644 --- a/drivers/scsi/dpt/dpti_i2o.h +++ b/drivers/scsi/dpt/dpti_i2o.h @@ -23,7 +23,6 @@ #include /* Needed for MUTEX init macros */ #include -#include #include #include diff --git a/drivers/scsi/dpt_i2o.c b/drivers/scsi/dpt_i2o.c index b1b704a42..45806336c 100644 --- a/drivers/scsi/dpt_i2o.c +++ b/drivers/scsi/dpt_i2o.c @@ -46,7 +46,6 @@ MODULE_DESCRIPTION("Adaptec I2O RAID Driver"); #include #include /* for kmalloc() */ -#include /* for CONFIG_PCI */ #include /* for PCI support */ #include #include @@ -1009,7 +1008,7 @@ static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev printk(KERN_INFO" BAR1 %p - size= %x\n",msg_addr_virt,hba_map1_area_size); } - if (request_irq (pDev->irq, adpt_isr, SA_SHIRQ, pHba->name, pHba)) { + if (request_irq (pDev->irq, adpt_isr, IRQF_SHARED, pHba->name, pHba)) { printk(KERN_ERR"%s: Couldn't register IRQ %d\n", pHba->name, pDev->irq); adpt_i2o_delete_hba(pHba); return -EINVAL; diff --git a/drivers/scsi/dtc.c b/drivers/scsi/dtc.c index 310d2f488..0d5713dfa 100644 --- a/drivers/scsi/dtc.c +++ b/drivers/scsi/dtc.c @@ -145,35 +145,35 @@ static struct override { 0, IRQ_AUTO}}; #endif -#define NO_OVERRIDES (sizeof(overrides) / sizeof(struct override)) +#define NO_OVERRIDES ARRAY_SIZE(overrides) static struct base { unsigned long address; int noauto; -} bases[] __initdata = { - { 0xcc000, 0 }, - { 0xc8000, 0 }, - { 0xdc000, 0 }, +} bases[] __initdata = { + { 0xcc000, 0 }, + { 0xc8000, 0 }, + { 0xdc000, 0 }, { 0xd8000, 0 } }; -#define NO_BASES (sizeof (bases) / sizeof (struct base)) +#define NO_BASES ARRAY_SIZE(bases) static const struct signature { const char *string; int offset; -} signatures[] = { +} signatures[] = { {"DATA TECHNOLOGY CORPORATION BIOS", 0x25}, }; -#define NO_SIGNATURES (sizeof (signatures) / sizeof (struct signature)) +#define NO_SIGNATURES ARRAY_SIZE(signatures) #ifndef MODULE /* * Function : dtc_setup(char *str, int *ints) * * Purpose : LILO command line initialization of the overrides array, - * + * * Inputs : str - unused, ints - array of integer parameters with ints[0] * equal to the number of ints. * @@ -280,7 +280,7 @@ found: /* With interrupts enabled, it will sometimes hang when doing heavy * reads. So better not enable them until I finger it out. */ if (instance->irq != SCSI_IRQ_NONE) - if (request_irq(instance->irq, dtc_intr, SA_INTERRUPT, "dtc", instance)) { + if (request_irq(instance->irq, dtc_intr, IRQF_DISABLED, "dtc", instance)) { printk(KERN_ERR "scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq); instance->irq = SCSI_IRQ_NONE; } diff --git a/drivers/scsi/eata.c b/drivers/scsi/eata.c index 059eeee4b..a5ff43b1b 100644 --- a/drivers/scsi/eata.c +++ b/drivers/scsi/eata.c @@ -477,7 +477,6 @@ * the driver sets host->wish_block = 1 for all ISA boards. */ -#include #include #include #include @@ -1222,7 +1221,7 @@ static int port_detect(unsigned long port_base, unsigned int j, /* Board detected, allocate its IRQ */ if (request_irq(irq, do_interrupt_handler, - SA_INTERRUPT | ((subversion == ESA) ? SA_SHIRQ : 0), + IRQF_DISABLED | ((subversion == ESA) ? IRQF_SHARED : 0), driver_name, (void *)&sha[j])) { printk("%s: unable to allocate IRQ %u, detaching.\n", name, irq); diff --git a/drivers/scsi/eata_pio.c b/drivers/scsi/eata_pio.c index 23beb48c7..771b01984 100644 --- a/drivers/scsi/eata_pio.c +++ b/drivers/scsi/eata_pio.c @@ -46,7 +46,6 @@ * last change: 2002/11/02 OS: Linux 2.5.45 * ************************************************************/ -#include #include #include #include @@ -732,7 +731,7 @@ static int register_pio_HBA(long base, struct get_conf *gc) return 0; if (!reg_IRQ[gc->IRQ]) { /* Interrupt already registered ? */ - if (!request_irq(gc->IRQ, do_eata_pio_int_handler, SA_INTERRUPT, "EATA-PIO", sh)) { + if (!request_irq(gc->IRQ, do_eata_pio_int_handler, IRQF_DISABLED, "EATA-PIO", sh)) { reg_IRQ[gc->IRQ]++; if (!gc->IRQ_TR) reg_IRQL[gc->IRQ] = 1; /* IRQ is edge triggered */ @@ -966,7 +965,7 @@ static int eata_pio_detect(struct scsi_host_template *tpnt) for (i = 0; i <= MAXIRQ; i++) if (reg_IRQ[i]) - request_irq(i, do_eata_pio_int_handler, SA_INTERRUPT, "EATA-PIO", NULL); + request_irq(i, do_eata_pio_int_handler, IRQF_DISABLED, "EATA-PIO", NULL); HBA_ptr = first_HBA; diff --git a/drivers/scsi/esp.c b/drivers/scsi/esp.c index 87a8c3d20..5630868c1 100644 --- a/drivers/scsi/esp.c +++ b/drivers/scsi/esp.c @@ -1,7 +1,6 @@ -/* $Id: esp.c,v 1.101 2002/01/15 06:48:55 davem Exp $ - * esp.c: EnhancedScsiProcessor Sun SCSI driver code. +/* esp.c: ESP Sun SCSI driver. * - * Copyright (C) 1995, 1998 David S. Miller (davem@caip.rutgers.edu) + * Copyright (C) 1995, 1998, 2006 David S. Miller (davem@davemloft.net) */ /* TODO: @@ -13,7 +12,6 @@ * 3) Add tagged queueing. */ -#include #include #include #include @@ -185,11 +183,6 @@ enum { /*5*/ do_intr_end }; -/* The master ring of all esp hosts we are managing in this driver. */ -static struct esp *espchain; -static DEFINE_SPINLOCK(espchain_lock); -static int esps_running = 0; - /* Forward declarations. */ static irqreturn_t esp_intr(int irq, void *dev_id, struct pt_regs *pregs); @@ -694,36 +687,6 @@ static void __init esp_bootup_reset(struct esp *esp) sbus_readb(esp->eregs + ESP_INTRPT); } -static void esp_chain_add(struct esp *esp) -{ - spin_lock_irq(&espchain_lock); - if (espchain) { - struct esp *elink = espchain; - while (elink->next) - elink = elink->next; - elink->next = esp; - } else { - espchain = esp; - } - esp->next = NULL; - spin_unlock_irq(&espchain_lock); -} - -static void esp_chain_del(struct esp *esp) -{ - spin_lock_irq(&espchain_lock); - if (espchain == esp) { - espchain = esp->next; - } else { - struct esp *elink = espchain; - while (elink->next != esp) - elink = elink->next; - elink->next = esp->next; - } - esp->next = NULL; - spin_unlock_irq(&espchain_lock); -} - static int __init esp_find_dvma(struct esp *esp, struct sbus_dev *dma_sdev) { struct sbus_dev *sdev = esp->sdev; @@ -815,14 +778,14 @@ static int __init esp_register_irq(struct esp *esp) * sanely maintain. */ if (request_irq(esp->ehost->irq, esp_intr, - SA_SHIRQ, "ESP SCSI", esp)) { + IRQF_SHARED, "ESP SCSI", esp)) { printk("esp%d: Cannot acquire irq line\n", esp->esp_id); return -1; } - printk("esp%d: IRQ %s ", esp->esp_id, - __irq_itoa(esp->ehost->irq)); + printk("esp%d: IRQ %d ", esp->esp_id, + esp->ehost->irq); return 0; } @@ -830,19 +793,20 @@ static int __init esp_register_irq(struct esp *esp) static void __init esp_get_scsi_id(struct esp *esp) { struct sbus_dev *sdev = esp->sdev; + struct device_node *dp = sdev->ofdev.node; - esp->scsi_id = prom_getintdefault(esp->prom_node, - "initiator-id", - -1); + esp->scsi_id = of_getintprop_default(dp, + "initiator-id", + -1); if (esp->scsi_id == -1) - esp->scsi_id = prom_getintdefault(esp->prom_node, - "scsi-initiator-id", - -1); + esp->scsi_id = of_getintprop_default(dp, + "scsi-initiator-id", + -1); if (esp->scsi_id == -1) esp->scsi_id = (sdev->bus == NULL) ? 7 : - prom_getintdefault(sdev->bus->prom_node, - "scsi-initiator-id", - 7); + of_getintprop_default(sdev->bus->ofdev.node, + "scsi-initiator-id", + 7); esp->ehost->this_id = esp->scsi_id; esp->scsi_id_mask = (1 << esp->scsi_id); @@ -1067,28 +1031,30 @@ static void __init esp_init_swstate(struct esp *esp) esp->prev_hme_dmacsr = 0xffffffff; } -static int __init detect_one_esp(struct scsi_host_template *tpnt, struct sbus_dev *esp_dev, - struct sbus_dev *espdma, struct sbus_bus *sbus, - int id, int hme) +static int __init detect_one_esp(struct scsi_host_template *tpnt, + struct device *dev, + struct sbus_dev *esp_dev, + struct sbus_dev *espdma, + struct sbus_bus *sbus, + int hme) { - struct Scsi_Host *esp_host = scsi_register(tpnt, sizeof(struct esp)); + static int instance; + struct Scsi_Host *esp_host = scsi_host_alloc(tpnt, sizeof(struct esp)); struct esp *esp; - if (!esp_host) { - printk("ESP: Cannot register SCSI host\n"); - return -1; - } + if (!esp_host) + return -ENOMEM; + if (hme) esp_host->max_id = 16; esp = (struct esp *) esp_host->hostdata; esp->ehost = esp_host; esp->sdev = esp_dev; - esp->esp_id = id; + esp->esp_id = instance; esp->prom_node = esp_dev->prom_node; prom_getstring(esp->prom_node, "name", esp->prom_name, sizeof(esp->prom_name)); - esp_chain_add(esp); if (esp_find_dvma(esp, espdma) < 0) goto fail_unlink; if (esp_map_regs(esp, hme) < 0) { @@ -1115,8 +1081,19 @@ static int __init detect_one_esp(struct scsi_host_template *tpnt, struct sbus_de esp_bootup_reset(esp); + if (scsi_add_host(esp_host, dev)) + goto fail_free_irq; + + dev_set_drvdata(&esp_dev->ofdev.dev, esp); + + scsi_scan_host(esp_host); + instance++; + return 0; +fail_free_irq: + free_irq(esp->ehost->irq, esp); + fail_unmap_cmdarea: sbus_free_consistent(esp->sdev, 16, (void *) esp->esp_command, @@ -1129,119 +1106,99 @@ fail_dvma_release: esp->dma->allocated = 0; fail_unlink: - esp_chain_del(esp); - scsi_unregister(esp_host); + scsi_host_put(esp_host); return -1; } /* Detecting ESP chips on the machine. This is the simple and easy * version. */ +static int __devexit esp_remove_common(struct esp *esp) +{ + unsigned int irq = esp->ehost->irq; + + scsi_remove_host(esp->ehost); + + ESP_INTSOFF(esp->dregs); +#if 0 + esp_reset_dma(esp); + esp_reset_esp(esp); +#endif + + free_irq(irq, esp); + sbus_free_consistent(esp->sdev, 16, + (void *) esp->esp_command, esp->esp_command_dvma); + sbus_iounmap(esp->eregs, ESP_REG_SIZE); + esp->dma->allocated = 0; + + scsi_host_put(esp->ehost); + + return 0; +} + #ifdef CONFIG_SUN4 #include -static int __init esp_detect(struct scsi_host_template *tpnt) -{ - static struct sbus_dev esp_dev; - int esps_in_use = 0; - - espchain = NULL; +static struct sbus_dev sun4_esp_dev; +static int __init esp_sun4_probe(struct scsi_host_template *tpnt) +{ if (sun4_esp_physaddr) { - memset (&esp_dev, 0, sizeof(esp_dev)); - esp_dev.reg_addrs[0].phys_addr = sun4_esp_physaddr; - esp_dev.irqs[0] = 4; - esp_dev.resource[0].start = sun4_esp_physaddr; - esp_dev.resource[0].end = sun4_esp_physaddr + ESP_REG_SIZE - 1; - esp_dev.resource[0].flags = IORESOURCE_IO; - - if (!detect_one_esp(tpnt, &esp_dev, NULL, NULL, 0, 0)) - esps_in_use++; - printk("ESP: Total of 1 ESP hosts found, %d actually in use.\n", esps_in_use); - esps_running = esps_in_use; + memset(&sun4_esp_dev, 0, sizeof(sun4_esp_dev)); + sun4_esp_dev.reg_addrs[0].phys_addr = sun4_esp_physaddr; + sun4_esp_dev.irqs[0] = 4; + sun4_esp_dev.resource[0].start = sun4_esp_physaddr; + sun4_esp_dev.resource[0].end = + sun4_esp_physaddr + ESP_REG_SIZE - 1; + sun4_esp_dev.resource[0].flags = IORESOURCE_IO; + + return detect_one_esp(tpnt, NULL, + &sun4_esp_dev, NULL, NULL, 0); } - return esps_in_use; + return 0; } -#else /* !CONFIG_SUN4 */ - -static int __init esp_detect(struct scsi_host_template *tpnt) +static int __devexit esp_sun4_remove(void) { - struct sbus_bus *sbus; - struct sbus_dev *esp_dev, *sbdev_iter; - int nesps = 0, esps_in_use = 0; + struct of_device *dev = &sun4_esp_dev.ofdev; + struct esp *esp = dev_get_drvdata(&dev->dev); - espchain = 0; - if (!sbus_root) { -#ifdef CONFIG_PCI - return 0; -#else - panic("No SBUS in esp_detect()"); -#endif - } - for_each_sbus(sbus) { - for_each_sbusdev(sbdev_iter, sbus) { - struct sbus_dev *espdma = NULL; - int hme = 0; - - /* Is it an esp sbus device? */ - esp_dev = sbdev_iter; - if (strcmp(esp_dev->prom_name, "esp") && - strcmp(esp_dev->prom_name, "SUNW,esp")) { - if (!strcmp(esp_dev->prom_name, "SUNW,fas")) { - hme = 1; - espdma = esp_dev; - } else { - if (!esp_dev->child || - (strcmp(esp_dev->prom_name, "espdma") && - strcmp(esp_dev->prom_name, "dma"))) - continue; /* nope... */ - espdma = esp_dev; - esp_dev = esp_dev->child; - if (strcmp(esp_dev->prom_name, "esp") && - strcmp(esp_dev->prom_name, "SUNW,esp")) - continue; /* how can this happen? */ - } - } - - if (detect_one_esp(tpnt, esp_dev, espdma, sbus, nesps++, hme) < 0) - continue; - - esps_in_use++; - } /* for each sbusdev */ - } /* for each sbus */ - printk("ESP: Total of %d ESP hosts found, %d actually in use.\n", nesps, - esps_in_use); - esps_running = esps_in_use; - return esps_in_use; + return esp_remove_common(esp); } -#endif /* !CONFIG_SUN4 */ +#else /* !CONFIG_SUN4 */ -/* - */ -static int esp_release(struct Scsi_Host *host) +static int __devinit esp_sbus_probe(struct of_device *dev, const struct of_device_id *match) { - struct esp *esp = (struct esp *) host->hostdata; + struct sbus_dev *sdev = to_sbus_device(&dev->dev); + struct device_node *dp = dev->node; + struct sbus_dev *dma_sdev = NULL; + int hme = 0; + + if (dp->parent && + (!strcmp(dp->parent->name, "espdma") || + !strcmp(dp->parent->name, "dma"))) + dma_sdev = sdev->parent; + else if (!strcmp(dp->name, "SUNW,fas")) { + dma_sdev = sdev; + hme = 1; + } - ESP_INTSOFF(esp->dregs); -#if 0 - esp_reset_dma(esp); - esp_reset_esp(esp); -#endif + return detect_one_esp(match->data, &dev->dev, + sdev, dma_sdev, sdev->bus, hme); +} - free_irq(esp->ehost->irq, esp); - sbus_free_consistent(esp->sdev, 16, - (void *) esp->esp_command, esp->esp_command_dvma); - sbus_iounmap(esp->eregs, ESP_REG_SIZE); - esp->dma->allocated = 0; - esp_chain_del(esp); +static int __devexit esp_sbus_remove(struct of_device *dev) +{ + struct esp *esp = dev_get_drvdata(&dev->dev); - return 0; + return esp_remove_common(esp); } +#endif /* !CONFIG_SUN4 */ + /* The info function will return whatever useful * information the developer sees fit. If not provided, then * the name field will be used instead. @@ -1415,18 +1372,11 @@ static int esp_host_info(struct esp *esp, char *ptr, off_t offset, int len) static int esp_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset, int length, int inout) { - struct esp *esp; + struct esp *esp = (struct esp *) host->hostdata; if (inout) return -EINVAL; /* not yet */ - for_each_esp(esp) { - if (esp->ehost == host) - break; - } - if (!esp) - return -EINVAL; - if (start) *start = buffer; @@ -1448,7 +1398,7 @@ static void esp_get_dmabufs(struct esp *esp, struct scsi_cmnd *sp) sp->SCp.ptr = NULL; } } else { - sp->SCp.buffer = (struct scatterlist *) sp->buffer; + sp->SCp.buffer = (struct scatterlist *) sp->request_buffer; sp->SCp.buffers_residual = sbus_map_sg(esp->sdev, sp->SCp.buffer, sp->use_sg, @@ -1461,7 +1411,7 @@ static void esp_get_dmabufs(struct esp *esp, struct scsi_cmnd *sp) static void esp_release_dmabufs(struct esp *esp, struct scsi_cmnd *sp) { if (sp->use_sg) { - sbus_unmap_sg(esp->sdev, sp->buffer, sp->use_sg, + sbus_unmap_sg(esp->sdev, sp->request_buffer, sp->use_sg, sp->sc_data_direction); } else if (sp->request_bufflen) { sbus_unmap_single(esp->sdev, @@ -2805,18 +2755,15 @@ static int esp_do_data_finale(struct esp *esp) */ static int esp_should_clear_sync(struct scsi_cmnd *sp) { - u8 cmd1 = sp->cmnd[0]; - u8 cmd2 = sp->data_cmnd[0]; + u8 cmd = sp->cmnd[0]; /* These cases are for spinning up a disk and * waiting for that spinup to complete. */ - if (cmd1 == START_STOP || - cmd2 == START_STOP) + if (cmd == START_STOP) return 0; - if (cmd1 == TEST_UNIT_READY || - cmd2 == TEST_UNIT_READY) + if (cmd == TEST_UNIT_READY) return 0; /* One more special case for SCSI tape drives, @@ -2824,8 +2771,7 @@ static int esp_should_clear_sync(struct scsi_cmnd *sp) * completion of a rewind or tape load operation. */ if (sp->device->type == TYPE_TAPE) { - if (cmd1 == MODE_SENSE || - cmd2 == MODE_SENSE) + if (cmd == MODE_SENSE) return 0; } @@ -4377,15 +4323,12 @@ static void esp_slave_destroy(struct scsi_device *SDptr) SDptr->hostdata = NULL; } -static struct scsi_host_template driver_template = { - .proc_name = "esp", - .proc_info = esp_proc_info, - .name = "Sun ESP 100/100a/200", - .detect = esp_detect, +static struct scsi_host_template esp_template = { + .module = THIS_MODULE, + .name = "esp", + .info = esp_info, .slave_alloc = esp_slave_alloc, .slave_destroy = esp_slave_destroy, - .release = esp_release, - .info = esp_info, .queuecommand = esp_queue, .eh_abort_handler = esp_abort, .eh_bus_reset_handler = esp_reset, @@ -4394,12 +4337,58 @@ static struct scsi_host_template driver_template = { .sg_tablesize = SG_ALL, .cmd_per_lun = 1, .use_clustering = ENABLE_CLUSTERING, + .proc_name = "esp", + .proc_info = esp_proc_info, +}; + +#ifndef CONFIG_SUN4 +static struct of_device_id esp_match[] = { + { + .name = "SUNW,esp", + .data = &esp_template, + }, + { + .name = "SUNW,fas", + .data = &esp_template, + }, + { + .name = "esp", + .data = &esp_template, + }, + {}, +}; +MODULE_DEVICE_TABLE(of, esp_match); + +static struct of_platform_driver esp_sbus_driver = { + .name = "esp", + .match_table = esp_match, + .probe = esp_sbus_probe, + .remove = __devexit_p(esp_sbus_remove), }; +#endif + +static int __init esp_init(void) +{ +#ifdef CONFIG_SUN4 + return esp_sun4_probe(&esp_template); +#else + return of_register_driver(&esp_sbus_driver, &sbus_bus_type); +#endif +} -#include "scsi_module.c" +static void __exit esp_exit(void) +{ +#ifdef CONFIG_SUN4 + esp_sun4_remove(); +#else + of_unregister_driver(&esp_sbus_driver); +#endif +} -MODULE_DESCRIPTION("EnhancedScsiProcessor Sun SCSI driver"); -MODULE_AUTHOR("David S. Miller (davem@redhat.com)"); +MODULE_DESCRIPTION("ESP Sun SCSI driver"); +MODULE_AUTHOR("David S. Miller (davem@davemloft.net)"); MODULE_LICENSE("GPL"); MODULE_VERSION(DRV_VERSION); +module_init(esp_init); +module_exit(esp_exit); diff --git a/drivers/scsi/esp.h b/drivers/scsi/esp.h index 73f7d6968..a98cda912 100644 --- a/drivers/scsi/esp.h +++ b/drivers/scsi/esp.h @@ -403,8 +403,4 @@ struct esp { #define ESP_MHZ_TO_CYCLE(mhertz) ((1000000000) / ((mhertz) / 1000)) #define ESP_TICK(ccf, cycle) ((7682 * (ccf) * (cycle) / 1000)) -/* For our interrupt engine. */ -#define for_each_esp(esp) \ - for((esp) = espchain; (esp); (esp) = (esp)->next) - #endif /* !(_SPARC_ESP_H) */ diff --git a/drivers/scsi/fastlane.c b/drivers/scsi/fastlane.c index 8ae9c406a..2a1c5c22b 100644 --- a/drivers/scsi/fastlane.c +++ b/drivers/scsi/fastlane.c @@ -210,7 +210,7 @@ int __init fastlane_esp_detect(struct scsi_host_template *tpnt) esp->irq = IRQ_AMIGA_PORTS; esp->slot = board+FASTLANE_ESP_ADDR; - if (request_irq(IRQ_AMIGA_PORTS, esp_intr, SA_SHIRQ, + if (request_irq(IRQ_AMIGA_PORTS, esp_intr, IRQF_SHARED, "Fastlane SCSI", esp->ehost)) { printk(KERN_WARNING "Fastlane: Could not get IRQ%d, aborting.\n", IRQ_AMIGA_PORTS); goto err_unmap; diff --git a/drivers/scsi/fcal.c b/drivers/scsi/fcal.c index 03416548f..7f891023a 100644 --- a/drivers/scsi/fcal.c +++ b/drivers/scsi/fcal.c @@ -13,7 +13,6 @@ #include #include #include -#include #ifdef CONFIG_KMOD #include #endif diff --git a/drivers/scsi/fd_mcs.c b/drivers/scsi/fd_mcs.c index cca485a2b..dde3edf35 100644 --- a/drivers/scsi/fd_mcs.c +++ b/drivers/scsi/fd_mcs.c @@ -279,7 +279,7 @@ static struct fd_mcs_adapters_struct fd_mcs_adapters[] = { 2}, }; -#define FD_BRDS sizeof(fd_mcs_adapters)/sizeof(struct fd_mcs_adapters_struct) +#define FD_BRDS ARRAY_SIZE(fd_mcs_adapters) static irqreturn_t fd_mcs_intr(int irq, void *dev_id, struct pt_regs *regs); @@ -400,7 +400,7 @@ static int fd_mcs_detect(struct scsi_host_template * tpnt) mca_set_adapter_name(slot - 1, fd_mcs_adapters[loop].name); /* check irq/region */ - if (request_irq(irq, fd_mcs_intr, SA_SHIRQ, "fd_mcs", hosts)) { + if (request_irq(irq, fd_mcs_intr, IRQF_SHARED, "fd_mcs", hosts)) { printk(KERN_ERR "fd_mcs: interrupt is not available, skipping...\n"); continue; } diff --git a/drivers/scsi/fdomain.c b/drivers/scsi/fdomain.c index 733424439..b0694dcce 100644 --- a/drivers/scsi/fdomain.c +++ b/drivers/scsi/fdomain.c @@ -266,7 +266,6 @@ **************************************************************************/ -#include #include #include #include @@ -420,10 +419,10 @@ static unsigned long addresses[] = { 0xd0000, 0xe0000, }; -#define ADDRESS_COUNT (sizeof( addresses ) / sizeof( unsigned )) - +#define ADDRESS_COUNT ARRAY_SIZE(addresses) + static unsigned short ports[] = { 0x140, 0x150, 0x160, 0x170 }; -#define PORT_COUNT (sizeof( ports ) / sizeof( unsigned short )) +#define PORT_COUNT ARRAY_SIZE(ports) static unsigned short ints[] = { 3, 5, 10, 11, 12, 14, 15, 0 }; @@ -502,7 +501,7 @@ static struct signature { geometry location are verified). */ }; -#define SIGNATURE_COUNT (sizeof( signatures ) / sizeof( struct signature )) +#define SIGNATURE_COUNT ARRAY_SIZE(signatures) static void print_banner( struct Scsi_Host *shpnt ) { @@ -519,7 +518,7 @@ static void print_banner( struct Scsi_Host *shpnt ) if (bios_minor >= 0) printk("%d", bios_minor); else printk("?."); - + printk( " at 0x%lx using scsi id %d\n", bios_base, shpnt->this_id ); } @@ -950,7 +949,7 @@ struct Scsi_Host *__fdomain_16x0_detect(struct scsi_host_template *tpnt ) /* Register the IRQ with the kernel */ retcode = request_irq( interrupt_level, - do_fdomain_16x0_intr, pdev?SA_SHIRQ:0, "fdomain", shpnt); + do_fdomain_16x0_intr, pdev?IRQF_SHARED:0, "fdomain", shpnt); if (retcode < 0) { if (retcode == -EINVAL) { diff --git a/drivers/scsi/g_NCR5380.c b/drivers/scsi/g_NCR5380.c index e6bcfe949..67f1100f3 100644 --- a/drivers/scsi/g_NCR5380.c +++ b/drivers/scsi/g_NCR5380.c @@ -91,7 +91,6 @@ #define AUTOPROBE_IRQ #define AUTOSENSE -#include #ifdef CONFIG_SCSI_GENERIC_NCR53C400 #define NCR53C400_PSEUDO_DMA 1 @@ -138,10 +137,9 @@ static struct override { [1] __initdata = { { 0,},}; #endif +#define NO_OVERRIDES ARRAY_SIZE(overrides) -#define NO_OVERRIDES (sizeof(overrides) / sizeof(struct override)) - -#ifndef MODULE +#ifndef MODULE /** * internal_setup - handle lilo command string override @@ -210,7 +208,7 @@ static int __init do_NCR5380_setup(char *str) { int ints[10]; - get_options(str, sizeof(ints) / sizeof(int), ints); + get_options(str, ARRAY_SIZE(ints), ints); internal_setup(BOARD_NCR5380, str, ints); return 1; } @@ -218,7 +216,7 @@ static int __init do_NCR5380_setup(char *str) /** * do_NCR53C400_setup - set up entry point * @str: unused - * @ints: integer parameters from kernel setup code + * @ints: integer parameters from kernel setup code * * Setup function invoked at boot to parse the ncr53c400= command * line. @@ -228,7 +226,7 @@ static int __init do_NCR53C400_setup(char *str) { int ints[10]; - get_options(str, sizeof(ints) / sizeof(int), ints); + get_options(str, ARRAY_SIZE(ints), ints); internal_setup(BOARD_NCR53C400, str, ints); return 1; } @@ -236,7 +234,7 @@ static int __init do_NCR53C400_setup(char *str) /** * do_NCR53C400A_setup - set up entry point * @str: unused - * @ints: integer parameters from kernel setup code + * @ints: integer parameters from kernel setup code * * Setup function invoked at boot to parse the ncr53c400a= command * line. @@ -246,7 +244,7 @@ static int __init do_NCR53C400A_setup(char *str) { int ints[10]; - get_options(str, sizeof(ints) / sizeof(int), ints); + get_options(str, ARRAY_SIZE(ints), ints); internal_setup(BOARD_NCR53C400A, str, ints); return 1; } @@ -254,7 +252,7 @@ static int __init do_NCR53C400A_setup(char *str) /** * do_DTC3181E_setup - set up entry point * @str: unused - * @ints: integer parameters from kernel setup code + * @ints: integer parameters from kernel setup code * * Setup function invoked at boot to parse the dtc3181e= command * line. @@ -264,7 +262,7 @@ static int __init do_DTC3181E_setup(char *str) { int ints[10]; - get_options(str, sizeof(ints) / sizeof(int), ints); + get_options(str, ARRAY_SIZE(ints), ints); internal_setup(BOARD_DTC3181E, str, ints); return 1; } @@ -463,7 +461,7 @@ int __init generic_NCR5380_detect(struct scsi_host_template * tpnt) instance->irq = NCR5380_probe_irq(instance, 0xffff); if (instance->irq != SCSI_IRQ_NONE) - if (request_irq(instance->irq, generic_NCR5380_intr, SA_INTERRUPT, "NCR5380", instance)) { + if (request_irq(instance->irq, generic_NCR5380_intr, IRQF_DISABLED, "NCR5380", instance)) { printk(KERN_WARNING "scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq); instance->irq = SCSI_IRQ_NONE; } diff --git a/drivers/scsi/g_NCR5380.h b/drivers/scsi/g_NCR5380.h index d60a89cb8..df0b3f69e 100644 --- a/drivers/scsi/g_NCR5380.h +++ b/drivers/scsi/g_NCR5380.h @@ -32,7 +32,6 @@ #ifndef GENERIC_NCR5380_H #define GENERIC_NCR5380_H -#include #define GENERIC_NCR5380_PUBLIC_RELEASE 1 diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c index bd801c1b4..5c0c92716 100644 --- a/drivers/scsi/gdth.c +++ b/drivers/scsi/gdth.c @@ -4,9 +4,9 @@ * Intel Corporation: Storage RAID Controllers * * * * gdth.c * - * Copyright (C) 1995-04 ICP vortex GmbH, Achim Leubner * + * Copyright (C) 1995-06 ICP vortex GmbH, Achim Leubner * * Copyright (C) 2002-04 Intel Corporation * - * Copyright (C) 2003-04 Adaptec Inc. * + * Copyright (C) 2003-06 Adaptec Inc. * * * * * * Additions/Fixes: * @@ -27,9 +27,14 @@ * along with this kernel; if not, write to the Free Software * * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * * - * Linux kernel 2.2.x, 2.4.x, 2.6.x supported * + * Linux kernel 2.4.x, 2.6.x supported * * * * $Log: gdth.c,v $ + * Revision 1.74 2006/04/10 13:44:47 achim + * Community changes for 2.6.x + * Kernel 2.2.x no longer supported + * scsi_request interface removed, thanks to Christoph Hellwig + * * Revision 1.73 2004/03/31 13:33:03 achim * Special command 0xfd implemented to detect 64-bit DMA support * @@ -94,7 +99,7 @@ * Bugfix free_irq() * * Revision 1.56 2001/08/09 11:19:39 achim - * struct scsi_host_template changes + * Scsi_Host_Template changes * * Revision 1.55 2001/08/09 10:11:28 achim * Command HOST_UNFREEZE_IO before cache service init. @@ -388,7 +393,13 @@ #include #include #include +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,6) #include +#else +#define DMA_32BIT_MASK 0x00000000ffffffffULL +#define DMA_64BIT_MASK 0xffffffffffffffffULL +#endif + #ifdef GDTH_RTC #include #endif @@ -408,8 +419,8 @@ #include "scsi.h" #include -#include "gdth.h" #include "gdth_kcompat.h" +#include "gdth.h" static void gdth_delay(int milliseconds); static void gdth_eval_mapping(ulong32 size, ulong32 *cyls, int *heads, int *secs); @@ -464,6 +475,8 @@ static int gdth_ioctl(struct inode *inode, struct file *filep, static void gdth_flush(int hanum); static int gdth_halt(struct notifier_block *nb, ulong event, void *buf); +static int gdth_queuecommand(Scsi_Cmnd *scp,void (*done)(Scsi_Cmnd *)); +static void gdth_scsi_done(struct scsi_cmnd *scp); #ifdef DEBUG_GDTH static unchar DebugState = DEBUG_GDTH; @@ -556,8 +569,8 @@ static struct timer_list gdth_timer; #endif #define PTR2USHORT(a) (ushort)(ulong)(a) -#define GDTOFFSOF(a,b) (size_t)&(((a*)0)->b) -#define INDEX_OK(i,t) ((i)b) +#define INDEX_OK(i,t) ((i)hostdata)) #define HADATA(a) (&((gdth_ext_str *)((a)->hostdata))->haext) @@ -643,6 +656,7 @@ static int probe_eisa_isa = 0; static int force_dma32 = 0; /* parameters for modprobe/insmod */ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,11) module_param_array(irq, int, NULL, 0); module_param(disable, int, 0); module_param(reserve_mode, int, 0); @@ -655,6 +669,20 @@ module_param(virt_ctr, int, 0); module_param(shared_access, int, 0); module_param(probe_eisa_isa, int, 0); module_param(force_dma32, int, 0); +#else +MODULE_PARM(irq, "i"); +MODULE_PARM(disable, "i"); +MODULE_PARM(reserve_mode, "i"); +MODULE_PARM(reserve_list, "4-" __MODULE_STRING(MAX_RES_ARGS) "i"); +MODULE_PARM(reverse_scan, "i"); +MODULE_PARM(hdr_channel, "i"); +MODULE_PARM(max_ids, "i"); +MODULE_PARM(rescan, "i"); +MODULE_PARM(virt_ctr, "i"); +MODULE_PARM(shared_access, "i"); +MODULE_PARM(probe_eisa_isa, "i"); +MODULE_PARM(force_dma32, "i"); +#endif MODULE_AUTHOR("Achim Leubner"); MODULE_LICENSE("GPL"); MODULE_VERSION(GDTH_VERSION_STR); @@ -684,6 +712,91 @@ static void gdth_delay(int milliseconds) } } +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) +static void gdth_scsi_done(struct scsi_cmnd *scp) +{ + TRACE2(("gdth_scsi_done()\n")); + + if (scp->request) + complete((struct completion *)scp->request); +} + +int __gdth_execute(struct scsi_device *sdev, gdth_cmd_str *gdtcmd, char *cmnd, + int timeout, u32 *info) +{ + Scsi_Cmnd *scp; + DECLARE_COMPLETION_ONSTACK(wait); + int rval; + + scp = kmalloc(sizeof(*scp), GFP_KERNEL); + if (!scp) + return -ENOMEM; + memset(scp, 0, sizeof(*scp)); + scp->device = sdev; + /* use request field to save the ptr. to completion struct. */ + scp->request = (struct request *)&wait; + scp->timeout_per_command = timeout*HZ; + scp->request_buffer = gdtcmd; + scp->cmd_len = 12; + memcpy(scp->cmnd, cmnd, 12); + scp->SCp.this_residual = IOCTL_PRI; /* priority */ + scp->done = gdth_scsi_done; /* some fn. test this */ + gdth_queuecommand(scp, gdth_scsi_done); + wait_for_completion(&wait); + + rval = scp->SCp.Status; + if (info) + *info = scp->SCp.Message; + kfree(scp); + return rval; +} +#else +static void gdth_scsi_done(Scsi_Cmnd *scp) +{ + TRACE2(("gdth_scsi_done()\n")); + + scp->request.rq_status = RQ_SCSI_DONE; + if (scp->request.waiting) + complete(scp->request.waiting); +} + +int __gdth_execute(struct scsi_device *sdev, gdth_cmd_str *gdtcmd, char *cmnd, + int timeout, u32 *info) +{ + Scsi_Cmnd *scp = scsi_allocate_device(sdev, 1, FALSE); + unsigned bufflen = gdtcmd ? sizeof(gdth_cmd_str) : 0; + DECLARE_COMPLETION_ONSTACK(wait); + int rval; + + if (!scp) + return -ENOMEM; + scp->cmd_len = 12; + scp->use_sg = 0; + scp->SCp.this_residual = IOCTL_PRI; /* priority */ + scp->request.rq_status = RQ_SCSI_BUSY; + scp->request.waiting = &wait; + scsi_do_cmd(scp, cmnd, gdtcmd, bufflen, gdth_scsi_done, timeout*HZ, 1); + wait_for_completion(&wait); + + rval = scp->SCp.Status; + if (info) + *info = scp->SCp.Message; + + scsi_release_command(scp); + return rval; +} +#endif + +int gdth_execute(struct Scsi_Host *shost, gdth_cmd_str *gdtcmd, char *cmnd, + int timeout, u32 *info) +{ + struct scsi_device *sdev = scsi_get_host_dev(shost); + int rval = __gdth_execute(sdev, gdtcmd, cmnd, timeout, info); + + scsi_free_host_dev(sdev); + return rval; +} + static void gdth_eval_mapping(ulong32 size, ulong32 *cyls, int *heads, int *secs) { *cyls = size /HEADS/SECS; @@ -774,7 +887,7 @@ static struct pci_device_id gdthtable[] __attribute_used__ = { MODULE_DEVICE_TABLE(pci,gdthtable); static void __init gdth_search_dev(gdth_pci_str *pcistr, ushort *cnt, - ushort vendor, ushort device) + ushort vendor, ushort device) { ulong base0, base1, base2; struct pci_dev *pdev; @@ -2249,14 +2362,16 @@ static void gdth_putq(int hanum,Scsi_Cmnd *scp,unchar priority) ha = HADATA(gdth_ctr_tab[hanum]); spin_lock_irqsave(&ha->smp_lock, flags); - scp->SCp.this_residual = (int)priority; - b = virt_ctr ? NUMDATA(scp->device->host)->busnum : scp->device->channel; - t = scp->device->id; - if (priority >= DEFAULT_PRI) { - if ((b != ha->virt_bus && ha->raw[BUS_L2P(ha,b)].lock) || - (b == ha->virt_bus && t < MAX_HDRIVES && ha->hdr[t].lock)) { - TRACE2(("gdth_putq(): locked IO -> update_timeout()\n")); - scp->SCp.buffers_residual = gdth_update_timeout(hanum, scp, 0); + if (scp->done != gdth_scsi_done) { + scp->SCp.this_residual = (int)priority; + b = virt_ctr ? NUMDATA(scp->device->host)->busnum:scp->device->channel; + t = scp->device->id; + if (priority >= DEFAULT_PRI) { + if ((b != ha->virt_bus && ha->raw[BUS_L2P(ha,b)].lock) || + (b==ha->virt_bus && thdr[t].lock)) { + TRACE2(("gdth_putq(): locked IO ->update_timeout()\n")); + scp->SCp.buffers_residual = gdth_update_timeout(hanum, scp, 0); + } } } @@ -2310,14 +2425,18 @@ static void gdth_next(int hanum) for (nscp = pscp = ha->req_first; nscp; nscp = (Scsi_Cmnd *)nscp->SCp.ptr) { if (nscp != pscp && nscp != (Scsi_Cmnd *)pscp->SCp.ptr) pscp = (Scsi_Cmnd *)pscp->SCp.ptr; - b = virt_ctr ? NUMDATA(nscp->device->host)->busnum : nscp->device->channel; - t = nscp->device->id; - l = nscp->device->lun; - if (nscp->SCp.this_residual >= DEFAULT_PRI) { - if ((b != ha->virt_bus && ha->raw[BUS_L2P(ha,b)].lock) || - (b == ha->virt_bus && t < MAX_HDRIVES && ha->hdr[t].lock)) - continue; - } + if (nscp->done != gdth_scsi_done) { + b = virt_ctr ? + NUMDATA(nscp->device->host)->busnum : nscp->device->channel; + t = nscp->device->id; + l = nscp->device->lun; + if (nscp->SCp.this_residual >= DEFAULT_PRI) { + if ((b != ha->virt_bus && ha->raw[BUS_L2P(ha,b)].lock) || + (b == ha->virt_bus && t < MAX_HDRIVES && ha->hdr[t].lock)) + continue; + } + } else + b = t = l = 0; if (firsttime) { if (gdth_test_busy(hanum)) { /* controller busy ? */ @@ -2332,7 +2451,7 @@ static void gdth_next(int hanum) firsttime = FALSE; } - if (nscp->done != gdth_scsi_done || nscp->cmnd[0] != 0xff) { + if (nscp->done != gdth_scsi_done) { if (nscp->SCp.phase == -1) { nscp->SCp.phase = CACHESERVICE; /* default: cache svc. */ if (nscp->cmnd[0] == TEST_UNIT_READY) { @@ -2395,7 +2514,7 @@ static void gdth_next(int hanum) else nscp->scsi_done(nscp); } - } else if (nscp->done == gdth_scsi_done && nscp->cmnd[0] == 0xff) { + } else if (nscp->done == gdth_scsi_done) { if (!(cmd_index=gdth_special_cmd(hanum,nscp))) this_cmd = FALSE; next_cmd = FALSE; @@ -2543,13 +2662,13 @@ static void gdth_copy_internal_data(int hanum,Scsi_Cmnd *scp, gdth_ha_str *ha; char *address; - cpcount = count<=(ushort)scp->bufflen ? count:(ushort)scp->bufflen; + cpcount = count<=(ushort)scp->request_bufflen ? count:(ushort)scp->request_bufflen; ha = HADATA(gdth_ctr_tab[hanum]); if (scp->use_sg) { sl = (struct scatterlist *)scp->request_buffer; for (i=0,cpsum=0; iuse_sg; ++i,++sl) { - unsigned long flags; + unsigned long flags; cpnow = (ushort)sl->length; TRACE(("copy_internal() now %d sum %d count %d %d\n", cpnow,cpsum,cpcount,(ushort)scp->bufflen)); @@ -2561,12 +2680,19 @@ static void gdth_copy_internal_data(int hanum,Scsi_Cmnd *scp, hanum); return; } - local_irq_save(flags); - address = kmap_atomic(sl->page, KM_BIO_SRC_IRQ) + sl->offset; + local_irq_save(flags); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) + address = kmap_atomic(sl->page, KM_BIO_SRC_IRQ) + sl->offset; + memcpy(address,buffer,cpnow); + flush_dcache_page(sl->page); + kunmap_atomic(address, KM_BIO_SRC_IRQ); +#else + address = kmap_atomic(sl->page, KM_BH_IRQ) + sl->offset; memcpy(address,buffer,cpnow); - flush_dcache_page(sl->page); - kunmap_atomic(address, KM_BIO_SRC_IRQ); - local_irq_restore(flags); + flush_dcache_page(sl->page); + kunmap_atomic(address, KM_BH_IRQ); +#endif + local_irq_restore(flags); if (cpsum == cpcount) break; buffer += cpnow; @@ -2947,9 +3073,9 @@ static int gdth_fill_raw_cmd(int hanum,Scsi_Cmnd *scp,unchar b) offset = (ulong)scp->sense_buffer & ~PAGE_MASK; sense_paddr = pci_map_page(ha->pdev,page,offset, 16,PCI_DMA_FROMDEVICE); - scp->SCp.buffer = (struct scatterlist *)((ulong32)sense_paddr); + *(ulong32 *)&scp->SCp.buffer = (ulong32)sense_paddr; /* high part, if 64bit */ - scp->host_scribble = (char *)(ulong32)((ulong64)sense_paddr >> 32); + *(ulong32 *)&scp->host_scribble = (ulong32)((ulong64)sense_paddr >> 32); cmdp->OpCode = GDT_WRITE; /* always */ cmdp->BoardNode = LOCALBOARD; if (mode64) { @@ -3023,7 +3149,7 @@ static int gdth_fill_raw_cmd(int hanum,Scsi_Cmnd *scp,unchar b) } #endif - } else { + } else if (scp->request_bufflen) { scp->SCp.Status = GDTH_MAP_SINGLE; scp->SCp.Message = PCI_DMA_BIDIRECTIONAL; page = virt_to_page(scp->request_buffer); @@ -3310,7 +3436,7 @@ static irqreturn_t gdth_interrupt(int irq,void *dev_id,struct pt_regs *regs) } if (!gdth_polling) - spin_lock_irqsave(&ha2->smp_lock, flags); + spin_lock_irqsave(&ha2->smp_lock, flags); wait_index = 0; /* search controller */ @@ -3643,9 +3769,10 @@ static int gdth_sync_event(int hanum,int service,unchar index,Scsi_Cmnd *scp) scp->request_bufflen,scp->SCp.Message); if (scp->SCp.buffer) { dma_addr_t addr; - addr = (dma_addr_t)(ulong32)scp->SCp.buffer; + addr = (dma_addr_t)*(ulong32 *)&scp->SCp.buffer; if (scp->host_scribble) - addr += (dma_addr_t)((ulong64)(ulong32)scp->host_scribble << 32); + addr += (dma_addr_t) + ((ulong64)(*(ulong32 *)&scp->host_scribble) << 32); pci_unmap_page(ha->pdev,addr,16,PCI_DMA_FROMDEVICE); } @@ -4155,7 +4282,11 @@ int __init option_setup(char *str) return 1; } +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) static int __init gdth_detect(struct scsi_host_template *shtp) +#else +static int __init gdth_detect(Scsi_Host_Template *shtp) +#endif { struct Scsi_Host *shp; gdth_pci_str pcistr[MAXHA]; @@ -4189,7 +4320,7 @@ static int __init gdth_detect(struct scsi_host_template *shtp) return 0; } - printk("GDT-HA: Storage RAID Controller Driver. Version: %s \n",GDTH_VERSION_STR); + printk("GDT-HA: Storage RAID Controller Driver. Version: %s\n",GDTH_VERSION_STR); /* initializations */ gdth_polling = TRUE; b = 0; gdth_clear_events(); @@ -4220,7 +4351,7 @@ static int __init gdth_detect(struct scsi_host_template *shtp) printk("Configuring GDT-ISA HA at BIOS 0x%05X IRQ %u DRQ %u\n", isa_bios,ha->irq,ha->drq); - if (request_irq(ha->irq,gdth_interrupt,SA_INTERRUPT,"gdth",ha)) { + if (request_irq(ha->irq,gdth_interrupt,IRQF_DISABLED,"gdth",ha)) { printk("GDT-ISA: Unable to allocate IRQ\n"); scsi_unregister(shp); continue; @@ -4346,7 +4477,7 @@ static int __init gdth_detect(struct scsi_host_template *shtp) printk("Configuring GDT-EISA HA at Slot %d IRQ %u\n", eisa_slot>>12,ha->irq); - if (request_irq(ha->irq,gdth_interrupt,SA_INTERRUPT,"gdth",ha)) { + if (request_irq(ha->irq,gdth_interrupt,IRQF_DISABLED,"gdth",ha)) { printk("GDT-EISA: Unable to allocate IRQ\n"); scsi_unregister(shp); continue; @@ -4473,7 +4604,7 @@ static int __init gdth_detect(struct scsi_host_template *shtp) pcistr[ctr].bus,PCI_SLOT(pcistr[ctr].device_fn),ha->irq); if (request_irq(ha->irq, gdth_interrupt, - SA_INTERRUPT|SA_SHIRQ, "gdth", ha)) + IRQF_DISABLED|IRQF_SHARED, "gdth", ha)) { printk("GDT-PCI: Unable to allocate IRQ\n"); scsi_unregister(shp); @@ -4752,7 +4883,7 @@ static int gdth_eh_bus_reset(Scsi_Cmnd *scp) gdth_internal_cmd(hanum, SCSIRAWSERVICE, GDT_RESET_BUS, BUS_L2P(ha,b), 0, 0); gdth_polling = FALSE; - spin_unlock_irqrestore(&ha->smp_lock, flags); + spin_unlock_irqrestore(&ha->smp_lock, flags); } return SUCCESS; } @@ -4820,7 +4951,9 @@ static int gdth_queuecommand(Scsi_Cmnd *scp,void (*done)(Scsi_Cmnd *)) priority = DEFAULT_PRI; if (scp->done == gdth_scsi_done) priority = scp->SCp.this_residual; - gdth_update_timeout(hanum, scp, scp->timeout_per_command * 6); + else + gdth_update_timeout(hanum, scp, scp->timeout_per_command * 6); + gdth_putq( hanum, scp, priority ); gdth_next( hanum ); return 0; @@ -4923,11 +5056,7 @@ static int ioc_resetdrv(void __user *arg, char *cmnd) gdth_cmd_str cmd; int hanum; gdth_ha_str *ha; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - Scsi_Request *srp; -#else - Scsi_Cmnd *scp; -#endif + int rval; if (copy_from_user(&res, arg, sizeof(gdth_ioctl_reset)) || res.ionode >= gdth_ctr_count || res.number >= MAX_HDRIVES) @@ -4944,25 +5073,11 @@ static int ioc_resetdrv(void __user *arg, char *cmnd) cmd.u.cache64.DeviceNo = res.number; else cmd.u.cache.DeviceNo = res.number; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - srp = scsi_allocate_request(ha->sdev, GFP_KERNEL); - if (!srp) - return -ENOMEM; - srp->sr_cmd_len = 12; - srp->sr_use_sg = 0; - gdth_do_req(srp, &cmd, cmnd, 30); - res.status = (ushort)srp->sr_command->SCp.Status; - scsi_release_request(srp); -#else - scp = scsi_allocate_device(ha->sdev, 1, FALSE); - if (!scp) - return -ENOMEM; - scp->cmd_len = 12; - scp->use_sg = 0; - gdth_do_cmd(scp, &cmd, cmnd, 30); - res.status = (ushort)scp->SCp.Status; - scsi_release_command(scp); -#endif + + rval = __gdth_execute(ha->sdev, &cmd, cmnd, 30, NULL); + if (rval < 0) + return rval; + res.status = rval; if (copy_to_user(arg, &res, sizeof(gdth_ioctl_reset))) return -EFAULT; @@ -4975,12 +5090,8 @@ static int ioc_general(void __user *arg, char *cmnd) char *buf = NULL; ulong64 paddr; int hanum; - gdth_ha_str *ha; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - Scsi_Request *srp; -#else - Scsi_Cmnd *scp; -#endif + gdth_ha_str *ha; + int rval; if (copy_from_user(&gen, arg, sizeof(gdth_ioctl_general)) || gen.ionode >= gdth_ctr_count) @@ -5072,27 +5183,10 @@ static int ioc_general(void __user *arg, char *cmnd) } } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - srp = scsi_allocate_request(ha->sdev, GFP_KERNEL); - if (!srp) - return -ENOMEM; - srp->sr_cmd_len = 12; - srp->sr_use_sg = 0; - gdth_do_req(srp, &gen.command, cmnd, gen.timeout); - gen.status = srp->sr_command->SCp.Status; - gen.info = srp->sr_command->SCp.Message; - scsi_release_request(srp); -#else - scp = scsi_allocate_device(ha->sdev, 1, FALSE); - if (!scp) - return -ENOMEM; - scp->cmd_len = 12; - scp->use_sg = 0; - gdth_do_cmd(scp, &gen.command, cmnd, gen.timeout); - gen.status = scp->SCp.Status; - gen.info = scp->SCp.Message; - scsi_release_command(scp); -#endif + rval = __gdth_execute(ha->sdev, &gen.command, cmnd, gen.timeout, &gen.info); + if (rval < 0) + return rval; + gen.status = rval; if (copy_to_user(arg + sizeof(gdth_ioctl_general), buf, gen.data_len + gen.sense_len)) { @@ -5115,40 +5209,22 @@ static int ioc_hdrlist(void __user *arg, char *cmnd) gdth_ha_str *ha; unchar i; int hanum, rc = -ENOMEM; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - Scsi_Request *srp; -#else - Scsi_Cmnd *scp; -#endif - + u32 cluster_type = 0; + rsc = kmalloc(sizeof(*rsc), GFP_KERNEL); cmd = kmalloc(sizeof(*cmd), GFP_KERNEL); if (!rsc || !cmd) - goto free_fail; + goto free_fail; if (copy_from_user(rsc, arg, sizeof(gdth_ioctl_rescan)) || rsc->ionode >= gdth_ctr_count) { rc = -EFAULT; - goto free_fail; + goto free_fail; } hanum = rsc->ionode; ha = HADATA(gdth_ctr_tab[hanum]); memset(cmd, 0, sizeof(gdth_cmd_str)); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - srp = scsi_allocate_request(ha->sdev, GFP_KERNEL); - if (!srp) - goto free_fail; - srp->sr_cmd_len = 12; - srp->sr_use_sg = 0; -#else - scp = scsi_allocate_device(ha->sdev, 1, FALSE); - if (!scp) - goto free_fail; - scp->cmd_len = 12; - scp->use_sg = 0; -#endif - for (i = 0; i < MAX_HDRIVES; ++i) { if (!ha->hdr[i].present) { rsc->hdr_list[i].bus = 0xff; @@ -5165,27 +5241,15 @@ static int ioc_hdrlist(void __user *arg, char *cmnd) cmd->u.cache64.DeviceNo = i; else cmd->u.cache.DeviceNo = i; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - gdth_do_req(srp, cmd, cmnd, 30); - if (srp->sr_command->SCp.Status == S_OK) - rsc->hdr_list[i].cluster_type = srp->sr_command->SCp.Message; -#else - gdth_do_cmd(scp, cmd, cmnd, 30); - if (scp->SCp.Status == S_OK) - rsc->hdr_list[i].cluster_type = scp->SCp.Message; -#endif + if (__gdth_execute(ha->sdev, cmd, cmnd, 30, &cluster_type) == S_OK) + rsc->hdr_list[i].cluster_type = cluster_type; } } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - scsi_release_request(srp); -#else - scsi_release_command(scp); -#endif - + if (copy_to_user(arg, rsc, sizeof(gdth_ioctl_rescan))) rc = -EFAULT; else - rc = 0; + rc = 0; free_fail: kfree(rsc); @@ -5203,40 +5267,21 @@ static int ioc_rescan(void __user *arg, char *cmnd) int rc = -ENOMEM; ulong flags; gdth_ha_str *ha; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - Scsi_Request *srp; -#else - Scsi_Cmnd *scp; -#endif rsc = kmalloc(sizeof(*rsc), GFP_KERNEL); cmd = kmalloc(sizeof(*cmd), GFP_KERNEL); if (!cmd || !rsc) - goto free_fail; + goto free_fail; if (copy_from_user(rsc, arg, sizeof(gdth_ioctl_rescan)) || rsc->ionode >= gdth_ctr_count) { - rc = -EFAULT; - goto free_fail; + rc = -EFAULT; + goto free_fail; } hanum = rsc->ionode; ha = HADATA(gdth_ctr_tab[hanum]); memset(cmd, 0, sizeof(gdth_cmd_str)); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - srp = scsi_allocate_request(ha->sdev, GFP_KERNEL); - if (!srp) - goto free_fail; - srp->sr_cmd_len = 12; - srp->sr_use_sg = 0; -#else - scp = scsi_allocate_device(ha->sdev, 1, FALSE); - if (!scp) - goto free_fail; - scp->cmd_len = 12; - scp->use_sg = 0; -#endif - if (rsc->flag == 0) { /* old method: re-init. cache service */ cmd->Service = CACHESERVICE; @@ -5247,19 +5292,8 @@ static int ioc_rescan(void __user *arg, char *cmnd) cmd->OpCode = GDT_INIT; cmd->u.cache.DeviceNo = LINUX_OS; } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - gdth_do_req(srp, cmd, cmnd, 30); - status = (ushort)srp->sr_command->SCp.Status; - info = (ulong32)srp->sr_command->SCp.Message; -#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) - gdth_do_cmd(scp, cmd, cmnd, 30); - status = (ushort)scp->SCp.Status; - info = (ulong32)scp->SCp.Message; -#else - gdth_do_cmd(&scp, cmd, cmnd, 30); - status = (ushort)scp.SCp.Status; - info = (ulong32)scp.SCp.Message; -#endif + + status = __gdth_execute(ha->sdev, cmd, cmnd, 30, &info); i = 0; hdr_cnt = (status == S_OK ? (ushort)info : 0); } else { @@ -5274,15 +5308,9 @@ static int ioc_rescan(void __user *arg, char *cmnd) cmd->u.cache64.DeviceNo = i; else cmd->u.cache.DeviceNo = i; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - gdth_do_req(srp, cmd, cmnd, 30); - status = (ushort)srp->sr_command->SCp.Status; - info = (ulong32)srp->sr_command->SCp.Message; -#else - gdth_do_cmd(scp, cmd, cmnd, 30); - status = (ushort)scp->SCp.Status; - info = (ulong32)scp->SCp.Message; -#endif + + status = __gdth_execute(ha->sdev, cmd, cmnd, 30, &info); + spin_lock_irqsave(&ha->smp_lock, flags); rsc->hdr_list[i].bus = ha->virt_bus; rsc->hdr_list[i].target = i; @@ -5314,15 +5342,9 @@ static int ioc_rescan(void __user *arg, char *cmnd) cmd->u.cache64.DeviceNo = i; else cmd->u.cache.DeviceNo = i; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - gdth_do_req(srp, cmd, cmnd, 30); - status = (ushort)srp->sr_command->SCp.Status; - info = (ulong32)srp->sr_command->SCp.Message; -#else - gdth_do_cmd(scp, cmd, cmnd, 30); - status = (ushort)scp->SCp.Status; - info = (ulong32)scp->SCp.Message; -#endif + + status = __gdth_execute(ha->sdev, cmd, cmnd, 30, &info); + spin_lock_irqsave(&ha->smp_lock, flags); ha->hdr[i].devtype = (status == S_OK ? (ushort)info : 0); spin_unlock_irqrestore(&ha->smp_lock, flags); @@ -5333,15 +5355,9 @@ static int ioc_rescan(void __user *arg, char *cmnd) cmd->u.cache64.DeviceNo = i; else cmd->u.cache.DeviceNo = i; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - gdth_do_req(srp, cmd, cmnd, 30); - status = (ushort)srp->sr_command->SCp.Status; - info = (ulong32)srp->sr_command->SCp.Message; -#else - gdth_do_cmd(scp, cmd, cmnd, 30); - status = (ushort)scp->SCp.Status; - info = (ulong32)scp->SCp.Message; -#endif + + status = __gdth_execute(ha->sdev, cmd, cmnd, 30, &info); + spin_lock_irqsave(&ha->smp_lock, flags); ha->hdr[i].cluster_type = ((status == S_OK && !shared_access) ? (ushort)info : 0); @@ -5354,29 +5370,18 @@ static int ioc_rescan(void __user *arg, char *cmnd) cmd->u.cache64.DeviceNo = i; else cmd->u.cache.DeviceNo = i; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - gdth_do_req(srp, cmd, cmnd, 30); - status = (ushort)srp->sr_command->SCp.Status; - info = (ulong32)srp->sr_command->SCp.Message; -#else - gdth_do_cmd(scp, cmd, cmnd, 30); - status = (ushort)scp->SCp.Status; - info = (ulong32)scp->SCp.Message; -#endif + + status = __gdth_execute(ha->sdev, cmd, cmnd, 30, &info); + spin_lock_irqsave(&ha->smp_lock, flags); ha->hdr[i].rw_attribs = (status == S_OK ? (ushort)info : 0); spin_unlock_irqrestore(&ha->smp_lock, flags); } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - scsi_release_request(srp); -#else - scsi_release_command(scp); -#endif if (copy_to_user(arg, rsc, sizeof(gdth_ioctl_rescan))) rc = -EFAULT; else - rc = 0; + rc = 0; free_fail: kfree(rsc); @@ -5516,17 +5521,18 @@ static int gdth_ioctl(struct inode *inode, struct file *filep, hanum = res.ionode; ha = HADATA(gdth_ctr_tab[hanum]); - /* Because we need a Scsi_Cmnd struct., we make a scsi_allocate device also for kernels >=2.6.x */ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - scp = scsi_get_command(ha->sdev, GFP_KERNEL); + scp = kmalloc(sizeof(*scp), GFP_KERNEL); if (!scp) return -ENOMEM; + memset(scp, 0, sizeof(*scp)); + scp->device = ha->sdev; scp->cmd_len = 12; scp->use_sg = 0; scp->device->channel = virt_ctr ? 0 : res.number; rval = gdth_eh_bus_reset(scp); res.status = (rval == SUCCESS ? S_OK : S_GENERR); - scsi_put_command(scp); + kfree(scp); #else scp = scsi_allocate_device(ha->sdev, 1, FALSE); if (!scp) @@ -5559,34 +5565,12 @@ static void gdth_flush(int hanum) int i; gdth_ha_str *ha; gdth_cmd_str gdtcmd; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - Scsi_Request *srp; -#else - Scsi_Cmnd *scp; -#endif - struct scsi_device *sdev; char cmnd[MAX_COMMAND_SIZE]; memset(cmnd, 0xff, MAX_COMMAND_SIZE); TRACE2(("gdth_flush() hanum %d\n",hanum)); ha = HADATA(gdth_ctr_tab[hanum]); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - sdev = scsi_get_host_dev(gdth_ctr_tab[hanum]); - srp = scsi_allocate_request(sdev, GFP_KERNEL); - if (!srp) - return; - srp->sr_cmd_len = 12; - srp->sr_use_sg = 0; -#else - sdev = scsi_get_host_dev(gdth_ctr_tab[hanum]); - scp = scsi_allocate_device(sdev, 1, FALSE); - if (!scp) - return; - scp->cmd_len = 12; - scp->use_sg = 0; -#endif - for (i = 0; i < MAX_HDRIVES; ++i) { if (ha->hdr[i].present) { gdtcmd.BoardNode = LOCALBOARD; @@ -5602,20 +5586,10 @@ static void gdth_flush(int hanum) gdtcmd.u.cache.sg_canz = 0; } TRACE2(("gdth_flush(): flush ha %d drive %d\n", hanum, i)); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - gdth_do_req(srp, &gdtcmd, cmnd, 30); -#else - gdth_do_cmd(scp, &gdtcmd, cmnd, 30); -#endif + + gdth_execute(gdth_ctr_tab[hanum], &gdtcmd, cmnd, 30, NULL); } } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - scsi_release_request(srp); - scsi_free_host_dev(sdev); -#else - scsi_release_command(scp); - scsi_free_host_dev(sdev); -#endif } /* shutdown routine */ @@ -5624,18 +5598,11 @@ static int gdth_halt(struct notifier_block *nb, ulong event, void *buf) int hanum; #ifndef __alpha__ gdth_cmd_str gdtcmd; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - Scsi_Request *srp; - struct scsi_device *sdev; -#else - Scsi_Cmnd *scp; - struct scsi_device *sdev; -#endif char cmnd[MAX_COMMAND_SIZE]; #endif if (notifier_disabled) - return NOTIFY_OK; + return NOTIFY_OK; TRACE2(("gdth_halt() event %d\n",(int)event)); if (event != SYS_RESTART && event != SYS_HALT && event != SYS_POWER_OFF) @@ -5653,31 +5620,7 @@ static int gdth_halt(struct notifier_block *nb, ulong event, void *buf) gdtcmd.Service = CACHESERVICE; gdtcmd.OpCode = GDT_RESET; TRACE2(("gdth_halt(): reset controller %d\n", hanum)); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - sdev = scsi_get_host_dev(gdth_ctr_tab[hanum]); - srp = scsi_allocate_request(sdev, GFP_KERNEL); - if (!srp) { - unregister_reboot_notifier(&gdth_notifier); - return NOTIFY_OK; - } - srp->sr_cmd_len = 12; - srp->sr_use_sg = 0; - gdth_do_req(srp, &gdtcmd, cmnd, 10); - scsi_release_request(srp); - scsi_free_host_dev(sdev); -#else - sdev = scsi_get_host_dev(gdth_ctr_tab[hanum]); - scp = scsi_allocate_device(sdev, 1, FALSE); - if (!scp) { - unregister_reboot_notifier(&gdth_notifier); - return NOTIFY_OK; - } - scp->cmd_len = 12; - scp->use_sg = 0; - gdth_do_cmd(scp, &gdtcmd, cmnd, 10); - scsi_release_command(scp); - scsi_free_host_dev(sdev); -#endif + gdth_execute(gdth_ctr_tab[hanum], &gdtcmd, cmnd, 10, NULL); #endif } printk("Done.\n"); @@ -5688,7 +5631,22 @@ static int gdth_halt(struct notifier_block *nb, ulong event, void *buf) return NOTIFY_OK; } +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) +/* configure lun */ +static int gdth_slave_configure(struct scsi_device *sdev) +{ + scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun); + sdev->skip_ms_page_3f = 1; + sdev->skip_ms_page_8 = 1; + return 0; +} +#endif + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) static struct scsi_host_template driver_template = { +#else +static Scsi_Host_Template driver_template = { +#endif .proc_name = "gdth", .proc_info = gdth_proc_info, .name = "GDT SCSI Disk Array Controller", @@ -5699,6 +5657,9 @@ static struct scsi_host_template driver_template = { .eh_bus_reset_handler = gdth_eh_bus_reset, .bios_param = gdth_bios_param, .can_queue = GDTH_MAXCMDS, +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) + .slave_configure = gdth_slave_configure, +#endif .this_id = -1, .sg_tablesize = GDTH_MAXSG, .cmd_per_lun = GDTH_MAXC_P_L, diff --git a/drivers/scsi/gdth.h b/drivers/scsi/gdth.h index cc4882fb9..47eae0299 100644 --- a/drivers/scsi/gdth.h +++ b/drivers/scsi/gdth.h @@ -4,13 +4,13 @@ /* * Header file for the GDT Disk Array/Storage RAID controllers driver for Linux * - * gdth.h Copyright (C) 1995-03 ICP vortex, Achim Leubner + * gdth.h Copyright (C) 1995-06 ICP vortex, Achim Leubner * See gdth.c for further informations and * below for supported controller types * * * - * $Id: gdth.h,v 1.57 2004/03/31 11:52:09 achim Exp $ + * $Id: gdth.h,v 1.58 2006/01/11 16:14:09 achim Exp $ */ #include @@ -26,9 +26,9 @@ /* defines, macros */ /* driver version */ -#define GDTH_VERSION_STR "3.04" +#define GDTH_VERSION_STR "3.05" #define GDTH_VERSION 3 -#define GDTH_SUBVERSION 4 +#define GDTH_SUBVERSION 5 /* protocol version */ #define PROTOCOL_VERSION 1 diff --git a/drivers/scsi/gdth_kcompat.h b/drivers/scsi/gdth_kcompat.h index e6cf0edfa..2a302eee6 100644 --- a/drivers/scsi/gdth_kcompat.h +++ b/drivers/scsi/gdth_kcompat.h @@ -1,5 +1,3 @@ - - #ifndef IRQ_HANDLED typedef void irqreturn_t; #define IRQ_NONE @@ -10,6 +8,18 @@ typedef void irqreturn_t; #define MODULE_LICENSE(x) #endif +#ifndef __iomem +#define __iomem +#endif + +#ifndef __attribute_used__ +#define __attribute_used__ __devinitdata +#endif + +#ifndef __user +#define __user +#endif + #ifndef SERVICE_ACTION_IN #define SERVICE_ACTION_IN 0x9e #endif diff --git a/drivers/scsi/gdth_proc.c b/drivers/scsi/gdth_proc.c index 5e8657f9c..32982eb75 100644 --- a/drivers/scsi/gdth_proc.c +++ b/drivers/scsi/gdth_proc.c @@ -1,5 +1,5 @@ /* gdth_proc.c - * $Id: gdth_proc.c,v 1.42 2004/03/05 15:50:20 achim Exp $ + * $Id: gdth_proc.c,v 1.43 2006/01/11 16:15:00 achim Exp $ */ #include @@ -51,57 +51,26 @@ int gdth_proc_info(char *buffer,char **start,off_t offset,int length,int hostno, static int gdth_set_info(char *buffer,int length,struct Scsi_Host *host, int hanum,int busnum) { - int ret_val = -EINVAL; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - Scsi_Request *scp; - struct scsi_device *sdev; -#else - Scsi_Cmnd *scp; - struct scsi_device *sdev; -#endif - TRACE2(("gdth_set_info() ha %d bus %d\n",hanum,busnum)); + int ret_val = -EINVAL; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - sdev = scsi_get_host_dev(host); - scp = scsi_allocate_request(sdev, GFP_KERNEL); - if (!scp) - return -ENOMEM; - scp->sr_cmd_len = 12; - scp->sr_use_sg = 0; -#else - sdev = scsi_get_host_dev(host); - scp = scsi_allocate_device(sdev, 1, FALSE); - if (!scp) - return -ENOMEM; - scp->cmd_len = 12; - scp->use_sg = 0; -#endif + TRACE2(("gdth_set_info() ha %d bus %d\n",hanum,busnum)); if (length >= 4) { if (strncmp(buffer,"gdth",4) == 0) { buffer += 5; length -= 5; - ret_val = gdth_set_asc_info( buffer, length, hanum, scp ); + ret_val = gdth_set_asc_info(host, buffer, length, hanum); } } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - scsi_release_request(scp); - scsi_free_host_dev(sdev); -#else - scsi_release_command(scp); - scsi_free_host_dev(sdev); -#endif + return ret_val; } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -static int gdth_set_asc_info(char *buffer,int length,int hanum,Scsi_Request *scp) -#else -static int gdth_set_asc_info(char *buffer,int length,int hanum,Scsi_Cmnd *scp) -#endif +static int gdth_set_asc_info(struct Scsi_Host *host, char *buffer, + int length,int hanum) { - int orig_length, drive, wb_mode; - int i, found; + int orig_length, drive, wb_mode; + int i, found; gdth_ha_str *ha; gdth_cmd_str gdtcmd; gdth_cpar_str *pcpar; @@ -146,11 +115,8 @@ static int gdth_set_asc_info(char *buffer,int length,int hanum,Scsi_Cmnd *scp) gdtcmd.u.cache.DeviceNo = i; gdtcmd.u.cache.BlockNo = 1; } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - gdth_do_req(scp, &gdtcmd, cmnd, 30); -#else - gdth_do_cmd(scp, &gdtcmd, cmnd, 30); -#endif + + gdth_execute(host, &gdtcmd, cmnd, 30, NULL); } } if (!found) @@ -202,11 +168,9 @@ static int gdth_set_asc_info(char *buffer,int length,int hanum,Scsi_Cmnd *scp) gdtcmd.u.ioctl.subfunc = CACHE_CONFIG; gdtcmd.u.ioctl.channel = INVALID_CHANNEL; pcpar->write_back = wb_mode==1 ? 0:1; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - gdth_do_req(scp, &gdtcmd, cmnd, 30); -#else - gdth_do_cmd(scp, &gdtcmd, cmnd, 30); -#endif + + gdth_execute(host, &gdtcmd, cmnd, 30, NULL); + gdth_ioctl_free(hanum, GDTH_SCRATCH, ha->pscratch, paddr); printk("Done.\n"); return(orig_length); @@ -230,13 +194,6 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length, gdth_cmd_str *gdtcmd; gdth_evt_str *estr; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - Scsi_Request *scp; - struct scsi_device *sdev; -#else - Scsi_Cmnd *scp; - struct scsi_device *sdev; -#endif char hrec[161]; struct timeval tv; @@ -252,7 +209,7 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length, gdtcmd = kmalloc(sizeof(*gdtcmd), GFP_KERNEL); estr = kmalloc(sizeof(*estr), GFP_KERNEL); if (!gdtcmd || !estr) - goto free_fail; + goto free_fail; memset(cmnd, 0xff, 12); memset(gdtcmd, 0, sizeof(gdth_cmd_str)); @@ -260,28 +217,6 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length, TRACE2(("gdth_get_info() ha %d bus %d\n",hanum,busnum)); ha = HADATA(gdth_ctr_tab[hanum]); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - sdev = scsi_get_host_dev(host); - scp = scsi_allocate_request(sdev, GFP_KERNEL); - if (!scp) - goto free_fail; - scp->sr_cmd_len = 12; - scp->sr_use_sg = 0; -#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) - sdev = scsi_get_host_dev(host); - scp = scsi_allocate_device(sdev, 1, FALSE); - if (!scp) - goto free_fail; - scp->cmd_len = 12; - scp->use_sg = 0; -#else - memset(&sdev,0,sizeof(struct scsi_device)); - memset(&scp, 0,sizeof(Scsi_Cmnd)); - sdev.host = scp.host = host; - sdev.id = scp.target = sdev.host->this_id; - scp.device = &sdev; -#endif - /* request is i.e. "cat /proc/scsi/gdth/0" */ /* format: %-15s\t%-10s\t%-15s\t%s */ @@ -386,16 +321,9 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length, sizeof(pds->list[0]); if (pds->entries > cnt) pds->entries = cnt; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - gdth_do_req(scp, gdtcmd, cmnd, 30); - if (scp->sr_command->SCp.Status != S_OK) -#else - gdth_do_cmd(scp, gdtcmd, cmnd, 30); - if (scp->SCp.Status != S_OK) -#endif - { + + if (gdth_execute(host, gdtcmd, cmnd, 30, NULL) != S_OK) pds->count = 0; - } /* other IOCTLs must fit into area GDTH_SCRATCH/4 */ for (j = 0; j < ha->raw[i].pdev_cnt; ++j) { @@ -410,14 +338,8 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length, gdtcmd->u.ioctl.subfunc = SCSI_DR_INFO | L_CTRL_PATTERN; gdtcmd->u.ioctl.channel = ha->raw[i].address | ha->raw[i].id_list[j]; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - gdth_do_req(scp, gdtcmd, cmnd, 30); - if (scp->sr_command->SCp.Status == S_OK) -#else - gdth_do_cmd(scp, gdtcmd, cmnd, 30); - if (scp->SCp.Status == S_OK) -#endif - { + + if (gdth_execute(host, gdtcmd, cmnd, 30, NULL) == S_OK) { strncpy(hrec,pdi->vendor,8); strncpy(hrec+8,pdi->product,16); strncpy(hrec+24,pdi->revision,4); @@ -466,14 +388,8 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length, gdtcmd->u.ioctl.channel = ha->raw[i].address | ha->raw[i].id_list[j]; pdef->sddc_type = 0x08; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - gdth_do_req(scp, gdtcmd, cmnd, 30); - if (scp->sr_command->SCp.Status == S_OK) -#else - gdth_do_cmd(scp, gdtcmd, cmnd, 30); - if (scp->SCp.Status == S_OK) -#endif - { + + if (gdth_execute(host, gdtcmd, cmnd, 30, NULL) == S_OK) { size = sprintf(buffer+len, " Grown Defects:\t%d\n", pdef->sddc_cnt); @@ -519,16 +435,8 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length, gdtcmd->u.ioctl.param_size = sizeof(gdth_cdrinfo_str); gdtcmd->u.ioctl.subfunc = CACHE_DRV_INFO; gdtcmd->u.ioctl.channel = drv_no; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - gdth_do_req(scp, gdtcmd, cmnd, 30); - if (scp->sr_command->SCp.Status != S_OK) -#else - gdth_do_cmd(scp, gdtcmd, cmnd, 30); - if (scp->SCp.Status != S_OK) -#endif - { + if (gdth_execute(host, gdtcmd, cmnd, 30, NULL) != S_OK) break; - } pcdi->ld_dtype >>= 16; j++; if (pcdi->ld_dtype > 2) { @@ -629,14 +537,7 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length, gdtcmd->u.ioctl.param_size = sizeof(gdth_arrayinf_str); gdtcmd->u.ioctl.subfunc = ARRAY_INFO | LA_CTRL_PATTERN; gdtcmd->u.ioctl.channel = i; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - gdth_do_req(scp, gdtcmd, cmnd, 30); - if (scp->sr_command->SCp.Status == S_OK) -#else - gdth_do_cmd(scp, gdtcmd, cmnd, 30); - if (scp->SCp.Status == S_OK) -#endif - { + if (gdth_execute(host, gdtcmd, cmnd, 30, NULL) == S_OK) { if (pai->ai_state == 0) strcpy(hrec, "idle"); else if (pai->ai_state == 2) @@ -710,14 +611,7 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length, gdtcmd->u.ioctl.channel = i; phg->entries = MAX_HDRIVES; phg->offset = GDTOFFSOF(gdth_hget_str, entry[0]); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - gdth_do_req(scp, gdtcmd, cmnd, 30); - if (scp->sr_command->SCp.Status != S_OK) -#else - gdth_do_cmd(scp, gdtcmd, cmnd, 30); - if (scp->SCp.Status != S_OK) -#endif - { + if (gdth_execute(host, gdtcmd, cmnd, 30, NULL) == S_OK) { ha->hdr[i].ldr_no = i; ha->hdr[i].rw_attribs = 0; ha->hdr[i].start_sec = 0; @@ -791,13 +685,6 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length, } stop_output: -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - scsi_release_request(scp); - scsi_free_host_dev(sdev); -#else - scsi_release_command(scp); - scsi_free_host_dev(sdev); -#endif *start = buffer +(offset-begin); len -= (offset-begin); if (len > length) @@ -812,64 +699,6 @@ free_fail: return rc; } - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -static void gdth_do_req(Scsi_Request *scp, gdth_cmd_str *gdtcmd, - char *cmnd, int timeout) -{ - unsigned bufflen; - DECLARE_COMPLETION(wait); - - TRACE2(("gdth_do_req()\n")); - if (gdtcmd != NULL) { - bufflen = sizeof(gdth_cmd_str); - } else { - bufflen = 0; - } - scp->sr_request->rq_status = RQ_SCSI_BUSY; - scp->sr_request->waiting = &wait; - scsi_do_req(scp, cmnd, gdtcmd, bufflen, gdth_scsi_done, timeout*HZ, 1); - wait_for_completion(&wait); -} - -#else -static void gdth_do_cmd(Scsi_Cmnd *scp, gdth_cmd_str *gdtcmd, - char *cmnd, int timeout) -{ - unsigned bufflen; - DECLARE_COMPLETION(wait); - - TRACE2(("gdth_do_cmd()\n")); - if (gdtcmd != NULL) { - scp->SCp.this_residual = IOCTL_PRI; - bufflen = sizeof(gdth_cmd_str); - } else { - scp->SCp.this_residual = DEFAULT_PRI; - bufflen = 0; - } - - scp->request.rq_status = RQ_SCSI_BUSY; - scp->request.waiting = &wait; - scsi_do_cmd(scp, cmnd, gdtcmd, bufflen, gdth_scsi_done, timeout*HZ, 1); - wait_for_completion(&wait); -} -#endif - -void gdth_scsi_done(Scsi_Cmnd *scp) -{ - TRACE2(("gdth_scsi_done()\n")); - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - scp->request->rq_status = RQ_SCSI_DONE; - if (scp->request->waiting != NULL) - complete(scp->request->waiting); -#else - scp->request.rq_status = RQ_SCSI_DONE; - if (scp->request.waiting != NULL) - complete(scp->request.waiting); -#endif -} - static char *gdth_ioctl_alloc(int hanum, int size, int scratch, ulong64 *paddr) { @@ -976,11 +805,14 @@ static void gdth_stop_timeout(int hanum, int busnum, int id) spin_lock_irqsave(&ha->smp_lock, flags); for (scp = ha->req_first; scp; scp = (Scsi_Cmnd *)scp->SCp.ptr) { - b = virt_ctr ? NUMDATA(scp->device->host)->busnum : scp->device->channel; - t = scp->device->id; - if (t == (unchar)id && b == (unchar)busnum) { - TRACE2(("gdth_stop_timeout(): update_timeout()\n")); - scp->SCp.buffers_residual = gdth_update_timeout(hanum, scp, 0); + if (scp->done != gdth_scsi_done) { + b = virt_ctr ? + NUMDATA(scp->device->host)->busnum : scp->device->channel; + t = scp->device->id; + if (t == (unchar)id && b == (unchar)busnum) { + TRACE2(("gdth_stop_timeout(): update_timeout()\n")); + scp->SCp.buffers_residual = gdth_update_timeout(hanum, scp, 0); + } } } spin_unlock_irqrestore(&ha->smp_lock, flags); @@ -997,11 +829,14 @@ static void gdth_start_timeout(int hanum, int busnum, int id) spin_lock_irqsave(&ha->smp_lock, flags); for (scp = ha->req_first; scp; scp = (Scsi_Cmnd *)scp->SCp.ptr) { - b = virt_ctr ? NUMDATA(scp->device->host)->busnum : scp->device->channel; - t = scp->device->id; - if (t == (unchar)id && b == (unchar)busnum) { - TRACE2(("gdth_start_timeout(): update_timeout()\n")); - gdth_update_timeout(hanum, scp, scp->SCp.buffers_residual); + if (scp->done != gdth_scsi_done) { + b = virt_ctr ? + NUMDATA(scp->device->host)->busnum : scp->device->channel; + t = scp->device->id; + if (t == (unchar)id && b == (unchar)busnum) { + TRACE2(("gdth_start_timeout(): update_timeout()\n")); + gdth_update_timeout(hanum, scp, scp->SCp.buffers_residual); + } } } spin_unlock_irqrestore(&ha->smp_lock, flags); diff --git a/drivers/scsi/gdth_proc.h b/drivers/scsi/gdth_proc.h index 295e825e2..a679eeb68 100644 --- a/drivers/scsi/gdth_proc.h +++ b/drivers/scsi/gdth_proc.h @@ -5,20 +5,16 @@ * $Id: gdth_proc.h,v 1.16 2004/01/14 13:09:01 achim Exp $ */ +int gdth_execute(struct Scsi_Host *shost, gdth_cmd_str *gdtcmd, char *cmnd, + int timeout, u32 *info); + static int gdth_set_info(char *buffer,int length,struct Scsi_Host *host, int hanum,int busnum); static int gdth_get_info(char *buffer,char **start,off_t offset,int length, struct Scsi_Host *host,int hanum,int busnum); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -static void gdth_do_req(Scsi_Request *srp, gdth_cmd_str *cmd, - char *cmnd, int timeout); -static int gdth_set_asc_info(char *buffer,int length,int hanum,Scsi_Request *scp); -#else -static void gdth_do_cmd(Scsi_Cmnd *scp, gdth_cmd_str *cmd, - char *cmnd, int timeout); -static int gdth_set_asc_info(char *buffer,int length,int hanum,Scsi_Cmnd *scp); -#endif +static int gdth_set_asc_info(struct Scsi_Host *host, char *buffer, + int length, int hanum); static char *gdth_ioctl_alloc(int hanum, int size, int scratch, ulong64 *paddr); @@ -28,7 +24,5 @@ static void gdth_stop_timeout(int hanum, int busnum, int id); static void gdth_start_timeout(int hanum, int busnum, int id); static int gdth_update_timeout(int hanum, Scsi_Cmnd *scp, int timeout); -void gdth_scsi_done(Scsi_Cmnd *scp); - #endif diff --git a/drivers/scsi/gvp11.c b/drivers/scsi/gvp11.c index 5b1544980..a0d831b1b 100644 --- a/drivers/scsi/gvp11.c +++ b/drivers/scsi/gvp11.c @@ -328,7 +328,7 @@ int __init gvp11_detect(struct scsi_host_template *tpnt) (epc & GVP_SCSICLKMASK) ? WD33C93_FS_8_10 : WD33C93_FS_12_15); - request_irq(IRQ_AMIGA_PORTS, gvp11_intr, SA_SHIRQ, "GVP11 SCSI", + request_irq(IRQ_AMIGA_PORTS, gvp11_intr, IRQF_SHARED, "GVP11 SCSI", instance); DMA(instance)->CNTR = GVP11_DMAC_INT_ENABLE; num_gvp11++; diff --git a/drivers/scsi/ibmmca.c b/drivers/scsi/ibmmca.c index 24eb59e14..2be1dc5d8 100644 --- a/drivers/scsi/ibmmca.c +++ b/drivers/scsi/ibmmca.c @@ -17,7 +17,6 @@ */ -#include #include #include #include @@ -760,7 +759,7 @@ static int device_inquiry(int host_index, int ldn) while (!got_interrupt(host_index)) barrier(); - /*if command succesful, break */ + /*if command successful, break */ if ((stat_result(host_index) == IM_SCB_CMD_COMPLETED) || (stat_result(host_index) == IM_SCB_CMD_COMPLETED_WITH_RETRIES)) return 1; } @@ -885,7 +884,7 @@ static int immediate_assign(int host_index, unsigned int pun, unsigned int lun, while (!got_interrupt(host_index)) barrier(); - /*if command succesful, break */ + /*if command successful, break */ if (stat_result(host_index) == IM_IMMEDIATE_CMD_COMPLETED) return 1; } @@ -921,7 +920,7 @@ static int immediate_feature(int host_index, unsigned int speed, unsigned int ti return 2; } else global_command_error_excuse = 0; - /*if command succesful, break */ + /*if command successful, break */ if (stat_result(host_index) == IM_IMMEDIATE_CMD_COMPLETED) return 1; } @@ -959,7 +958,7 @@ static int immediate_reset(int host_index, unsigned int ldn) /* did not work, finish */ return 1; } - /*if command succesful, break */ + /*if command successful, break */ if (stat_result(host_index) == IM_IMMEDIATE_CMD_COMPLETED) return 1; } @@ -1441,7 +1440,7 @@ static int ibmmca_getinfo(char *buf, int slot, void *dev_id) struct Scsi_Host *dev = dev_id; spin_lock_irqsave(dev->host_lock, flags); - + shpnt = dev; /* assign host-structure to local pointer */ len = 0; /* set filled text-buffer index to 0 */ /* get the _special contents of the hostdata structure */ @@ -1456,7 +1455,7 @@ static int ibmmca_getinfo(char *buf, int slot, void *dev_id) /* if the integrated subsystem has been found automatically: */ len += sprintf(buf + len, "Adapter category: integrated\n" "Chip revision level: %d\n" "Chip status: %s\n" "8 kByte NVRAM status: %s\n", ((pos[2] & 0xf0) >> 4), (pos[2] & 1) ? "enabled" : "disabled", (pos[2] & 2) ? "locked" : "accessible"); - } else if ((speciale >= 0) && (speciale < (sizeof(subsys_list) / sizeof(struct subsys_list_struct)))) { + } else if ((speciale >= 0) && (speciale < ARRAY_SIZE(subsys_list))) { /* if the subsystem is a slot adapter */ len += sprintf(buf + len, "Adapter category: slot-card\n" "ROM Segment Address: "); if ((pos[2] & 0xf0) == 0xf0) @@ -1477,16 +1476,16 @@ static int ibmmca_getinfo(char *buf, int slot, void *dev_id) while (len % sizeof(int) != (sizeof(int) - 1)) len += sprintf(buf + len, " "); len += sprintf(buf + len, "\n"); - + spin_unlock_irqrestore(shpnt->host_lock, flags); - + return len; } int ibmmca_detect(struct scsi_host_template * scsi_template) { struct Scsi_Host *shpnt; - int port, id, i, j, k, list_size, slot; + int port, id, i, j, k, slot; int devices_on_irq_11 = 0; int devices_on_irq_14 = 0; int IRQ14_registered = 0; @@ -1511,7 +1510,7 @@ int ibmmca_detect(struct scsi_host_template * scsi_template) #endif /* get interrupt request level */ - if (request_irq(IM_IRQ, interrupt_handler, SA_SHIRQ, "ibmmcascsi", hosts)) { + if (request_irq(IM_IRQ, interrupt_handler, IRQF_SHARED, "ibmmcascsi", hosts)) { printk(KERN_ERR "IBM MCA SCSI: Unable to get shared IRQ %d.\n", IM_IRQ); return 0; } else @@ -1603,8 +1602,7 @@ int ibmmca_detect(struct scsi_host_template * scsi_template) /* now look for other adapters in MCA slots, */ /* determine the number of known IBM-SCSI-subsystem types */ /* see the pos[2] dependence to get the adapter port-offset. */ - list_size = sizeof(subsys_list) / sizeof(struct subsys_list_struct); - for (i = 0; i < list_size; i++) { + for (i = 0; i < ARRAY_SIZE(subsys_list); i++) { /* scan each slot for a fitting adapter id */ slot = 0; /* start at slot 0 */ while ((slot = mca_find_adapter(subsys_list[i].mca_id, slot)) @@ -1637,7 +1635,7 @@ int ibmmca_detect(struct scsi_host_template * scsi_template) /* IRQ11 is used by SCSI-2 F/W Adapter/A */ printk(KERN_DEBUG "IBM MCA SCSI: SCSI-2 F/W adapter needs IRQ 11.\n"); /* get interrupt request level */ - if (request_irq(IM_IRQ_FW, interrupt_handler, SA_SHIRQ, "ibmmcascsi", hosts)) { + if (request_irq(IM_IRQ_FW, interrupt_handler, IRQF_SHARED, "ibmmcascsi", hosts)) { printk(KERN_ERR "IBM MCA SCSI: Unable to get shared IRQ %d.\n", IM_IRQ_FW); } else IRQ11_registered++; @@ -1669,8 +1667,7 @@ int ibmmca_detect(struct scsi_host_template * scsi_template) /* now check for SCSI-adapters, mapped to the integrated SCSI * area. E.g. a W/Cache in MCA-slot 9(!). Do the check correct here, * as this is a known effect on some models 95xx. */ - list_size = sizeof(subsys_list) / sizeof(struct subsys_list_struct); - for (i = 0; i < list_size; i++) { + for (i = 0; i < ARRAY_SIZE(subsys_list); i++) { /* scan each slot for a fitting adapter id */ slot = mca_find_adapter(subsys_list[i].mca_id, MCA_INTEGSCSI); if (slot != MCA_NOTFOUND) { /* scan through all slots */ @@ -1699,7 +1696,7 @@ int ibmmca_detect(struct scsi_host_template * scsi_template) /* IRQ11 is used by SCSI-2 F/W Adapter/A */ printk(KERN_DEBUG "IBM MCA SCSI: SCSI-2 F/W adapter needs IRQ 11.\n"); /* get interrupt request level */ - if (request_irq(IM_IRQ_FW, interrupt_handler, SA_SHIRQ, "ibmmcascsi", hosts)) + if (request_irq(IM_IRQ_FW, interrupt_handler, IRQF_SHARED, "ibmmcascsi", hosts)) printk(KERN_ERR "IBM MCA SCSI: Unable to get shared IRQ %d.\n", IM_IRQ_FW); else IRQ11_registered++; @@ -2243,8 +2240,7 @@ static int __ibmmca_host_reset(Scsi_Cmnd * cmd) int host_index; unsigned long imm_command; - if (cmd == NULL) - BUG(); + BUG_ON(cmd == NULL); ticks = IM_RESET_DELAY * HZ; shpnt = cmd->device->host; diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c index 2e9be83a6..669ea4fff 100644 --- a/drivers/scsi/ibmvscsi/ibmvscsi.c +++ b/drivers/scsi/ibmvscsi/ibmvscsi.c @@ -121,10 +121,9 @@ static int initialize_event_pool(struct event_pool *pool, pool->size = size; pool->next = 0; - pool->events = kmalloc(pool->size * sizeof(*pool->events), GFP_KERNEL); + pool->events = kcalloc(pool->size, sizeof(*pool->events), GFP_KERNEL); if (!pool->events) return -ENOMEM; - memset(pool->events, 0x00, pool->size * sizeof(*pool->events)); pool->iu_storage = dma_alloc_coherent(hostdata->dev, @@ -536,6 +535,7 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct, struct ibmvscsi_host_data *hostdata) { u64 *crq_as_u64 = (u64 *) &evt_struct->crq; + int request_status; int rc; /* If we have exhausted our request limit, just fail this request. @@ -543,9 +543,18 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct, * (such as task management requests) that the mid layer may think we * can handle more requests (can_queue) when we actually can't */ - if ((evt_struct->crq.format == VIOSRP_SRP_FORMAT) && - (atomic_dec_if_positive(&hostdata->request_limit) < 0)) - goto send_error; + if (evt_struct->crq.format == VIOSRP_SRP_FORMAT) { + request_status = + atomic_dec_if_positive(&hostdata->request_limit); + /* If request limit was -1 when we started, it is now even + * less than that + */ + if (request_status < -1) + goto send_error; + /* Otherwise, if we have run out of requests */ + else if (request_status < 0) + goto send_busy; + } /* Copy the IU into the transfer area */ *evt_struct->xfer_iu = evt_struct->iu; @@ -568,11 +577,23 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct, return 0; - send_error: + send_busy: unmap_cmd_data(&evt_struct->iu.srp.cmd, evt_struct, hostdata->dev); free_event_struct(&hostdata->pool, evt_struct); return SCSI_MLQUEUE_HOST_BUSY; + + send_error: + unmap_cmd_data(&evt_struct->iu.srp.cmd, evt_struct, hostdata->dev); + + if (evt_struct->cmnd != NULL) { + evt_struct->cmnd->result = DID_ERROR << 16; + evt_struct->cmnd_done(evt_struct->cmnd); + } else if (evt_struct->done) + evt_struct->done(evt_struct); + + free_event_struct(&hostdata->pool, evt_struct); + return 0; } /** @@ -1185,27 +1206,37 @@ void ibmvscsi_handle_crq(struct viosrp_crq *crq, return; case 0xFF: /* Hypervisor telling us the connection is closed */ scsi_block_requests(hostdata->host); + atomic_set(&hostdata->request_limit, 0); if (crq->format == 0x06) { /* We need to re-setup the interpartition connection */ printk(KERN_INFO "ibmvscsi: Re-enabling adapter!\n"); - atomic_set(&hostdata->request_limit, -1); purge_requests(hostdata, DID_REQUEUE); - if (ibmvscsi_reenable_crq_queue(&hostdata->queue, - hostdata) == 0) - if (ibmvscsi_send_crq(hostdata, - 0xC001000000000000LL, 0)) + if ((ibmvscsi_reenable_crq_queue(&hostdata->queue, + hostdata) == 0) || + (ibmvscsi_send_crq(hostdata, + 0xC001000000000000LL, 0))) { + atomic_set(&hostdata->request_limit, + -1); printk(KERN_ERR - "ibmvscsi: transmit error after" + "ibmvscsi: error after" " enable\n"); + } } else { printk(KERN_INFO "ibmvscsi: Virtual adapter failed rc %d!\n", crq->format); - atomic_set(&hostdata->request_limit, -1); purge_requests(hostdata, DID_ERROR); - ibmvscsi_reset_crq_queue(&hostdata->queue, hostdata); + if ((ibmvscsi_reset_crq_queue(&hostdata->queue, + hostdata)) || + (ibmvscsi_send_crq(hostdata, + 0xC001000000000000LL, 0))) { + atomic_set(&hostdata->request_limit, + -1); + printk(KERN_ERR + "ibmvscsi: error after reset\n"); + } } scsi_unblock_requests(hostdata->host); return; @@ -1468,6 +1499,7 @@ static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id) struct Scsi_Host *host; struct device *dev = &vdev->dev; unsigned long wait_switch = 0; + int rc; vdev->dev.driver_data = NULL; @@ -1485,8 +1517,8 @@ static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id) atomic_set(&hostdata->request_limit, -1); hostdata->host->max_sectors = 32 * 8; /* default max I/O 32 pages */ - if (ibmvscsi_init_crq_queue(&hostdata->queue, hostdata, - max_requests) != 0) { + rc = ibmvscsi_init_crq_queue(&hostdata->queue, hostdata, max_requests); + if (rc != 0 && rc != H_RESOURCE) { printk(KERN_ERR "ibmvscsi: couldn't initialize crq\n"); goto init_crq_failed; } @@ -1506,7 +1538,8 @@ static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id) * to fail if the other end is not acive. In that case we don't * want to scan */ - if (ibmvscsi_send_crq(hostdata, 0xC001000000000000LL, 0) == 0) { + if (ibmvscsi_send_crq(hostdata, 0xC001000000000000LL, 0) == 0 + || rc == H_RESOURCE) { /* * Wait around max init_timeout secs for the adapter to finish * initializing. When we are done initializing, we will have a diff --git a/drivers/scsi/ibmvscsi/iseries_vscsi.c b/drivers/scsi/ibmvscsi/iseries_vscsi.c index 7eed0b098..6aeb5f003 100644 --- a/drivers/scsi/ibmvscsi/iseries_vscsi.c +++ b/drivers/scsi/ibmvscsi/iseries_vscsi.c @@ -81,7 +81,7 @@ int ibmvscsi_init_crq_queue(struct crq_queue *queue, int rc; single_host_data = hostdata; - rc = viopath_open(viopath_hostLp, viomajorsubtype_scsi, 0); + rc = viopath_open(viopath_hostLp, viomajorsubtype_scsi, max_requests); if (rc < 0) { printk("viopath_open failed with rc %d in open_event_path\n", rc); diff --git a/drivers/scsi/ibmvscsi/rpa_vscsi.c b/drivers/scsi/ibmvscsi/rpa_vscsi.c index 1a9992bdf..ed22b9658 100644 --- a/drivers/scsi/ibmvscsi/rpa_vscsi.c +++ b/drivers/scsi/ibmvscsi/rpa_vscsi.c @@ -208,6 +208,7 @@ int ibmvscsi_init_crq_queue(struct crq_queue *queue, int max_requests) { int rc; + int retrc; struct vio_dev *vdev = to_vio_dev(hostdata->dev); queue->msgs = (struct viosrp_crq *)get_zeroed_page(GFP_KERNEL); @@ -226,7 +227,7 @@ int ibmvscsi_init_crq_queue(struct crq_queue *queue, gather_partition_info(); set_adapter_info(hostdata); - rc = plpar_hcall_norets(H_REG_CRQ, + retrc = rc = plpar_hcall_norets(H_REG_CRQ, vdev->unit_address, queue->msg_token, PAGE_SIZE); if (rc == H_RESOURCE) @@ -237,6 +238,7 @@ int ibmvscsi_init_crq_queue(struct crq_queue *queue, if (rc == 2) { /* Adapter is good, but other end is not ready */ printk(KERN_WARNING "ibmvscsi: Partner adapter not ready\n"); + retrc = 0; } else if (rc != 0) { printk(KERN_WARNING "ibmvscsi: Error %d opening adapter\n", rc); goto reg_crq_failed; @@ -263,7 +265,7 @@ int ibmvscsi_init_crq_queue(struct crq_queue *queue, tasklet_init(&hostdata->srp_task, (void *)ibmvscsi_task, (unsigned long)hostdata); - return 0; + return retrc; req_irq_failed: do { diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c index 39b760a24..94d1de556 100644 --- a/drivers/scsi/ide-scsi.c +++ b/drivers/scsi/ide-scsi.c @@ -34,7 +34,6 @@ #define IDESCSI_VERSION "0.92" #include -#include #include #include #include @@ -518,7 +517,7 @@ static ide_startstop_t idescsi_pc_intr (ide_drive_t *drive) /* No more interrupts */ if (test_bit(IDESCSI_LOG_CMD, &scsi->log)) printk (KERN_INFO "Packet command completed, %d bytes transferred\n", pc->actually_transferred); - local_irq_enable(); + local_irq_enable_in_hardirq(); if (status.b.check) rq->errors++; idescsi_end_request (drive, 1, 0); @@ -600,8 +599,7 @@ static ide_startstop_t idescsi_transfer_pc(ide_drive_t *drive) "issuing a packet command\n"); return ide_do_reset (drive); } - if (HWGROUP(drive)->handler != NULL) - BUG(); + BUG_ON(HWGROUP(drive)->handler != NULL); /* Set the interrupt routine */ ide_set_handler(drive, &idescsi_pc_intr, get_timeout(pc), idescsi_expiry); /* Send the actual packet */ @@ -691,8 +689,7 @@ static ide_startstop_t idescsi_issue_pc (ide_drive_t *drive, idescsi_pc_t *pc) set_bit(PC_DMA_OK, &pc->flags); if (test_bit(IDESCSI_DRQ_INTERRUPT, &scsi->flags)) { - if (HWGROUP(drive)->handler != NULL) - BUG(); + BUG_ON(HWGROUP(drive)->handler != NULL); ide_set_handler(drive, &idescsi_transfer_pc, get_timeout(pc), idescsi_expiry); /* Issue the packet command */ diff --git a/drivers/scsi/imm.c b/drivers/scsi/imm.c index fc0f30ae0..2d95ac9c3 100644 --- a/drivers/scsi/imm.c +++ b/drivers/scsi/imm.c @@ -3,15 +3,11 @@ * * (The IMM is the embedded controller in the ZIP Plus drive.) * - * Current Maintainer: David Campbell (Perth, Western Australia) - * campbell@torque.net - * * My unoffical company acronym list is 21 pages long: * FLA: Four letter acronym with built in facility for * future expansion to five letters. */ -#include #include #include #include @@ -1119,6 +1115,10 @@ static int device_check(imm_struct *dev) return -ENODEV; } +/* + * imm cannot deal with highmem, so this causes all IO pages for this host + * to reside in low memory (hence mapped) + */ static int imm_adjust_queue(struct scsi_device *device) { blk_queue_bounce_limit(device->request_queue, BLK_BOUNCE_HIGH); @@ -1141,10 +1141,6 @@ static struct scsi_host_template imm_template = { .use_clustering = ENABLE_CLUSTERING, .can_queue = 1, .slave_alloc = imm_adjust_queue, - .unchecked_isa_dma = 1, /* imm cannot deal with highmem, so - * this is an easy trick to ensure - * all io pages for this host reside - * in low memory */ }; /*************************************************************************** diff --git a/drivers/scsi/imm.h b/drivers/scsi/imm.h index dc3aebf0e..8f6f32fc6 100644 --- a/drivers/scsi/imm.h +++ b/drivers/scsi/imm.h @@ -2,7 +2,7 @@ /* Driver for the Iomega MatchMaker parallel port SCSI HBA embedded in * the Iomega ZIP Plus drive * - * (c) 1998 David Campbell campbell@torque.net + * (c) 1998 David Campbell * * Please note that I live in Perth, Western Australia. GMT+0800 */ @@ -66,7 +66,6 @@ */ /* ------ END OF USER CONFIGURABLE PARAMETERS ----- */ -#include #include #include #include diff --git a/drivers/scsi/in2000.c b/drivers/scsi/in2000.c index 9c519876f..59a4097f1 100644 --- a/drivers/scsi/in2000.c +++ b/drivers/scsi/in2000.c @@ -370,7 +370,7 @@ static int in2000_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) */ if (cmd->use_sg) { - cmd->SCp.buffer = (struct scatterlist *) cmd->buffer; + cmd->SCp.buffer = (struct scatterlist *) cmd->request_buffer; cmd->SCp.buffers_residual = cmd->use_sg - 1; cmd->SCp.ptr = (char *) page_address(cmd->SCp.buffer->page) + cmd->SCp.buffer->offset; cmd->SCp.this_residual = cmd->SCp.buffer->length; @@ -1809,7 +1809,7 @@ static int in2000_abort(Scsi_Cmnd * cmd) #define MAX_IN2000_HOSTS 3 -#define MAX_SETUP_ARGS (sizeof(setup_args) / sizeof(char *)) +#define MAX_SETUP_ARGS ARRAY_SIZE(setup_args) #define SETUP_BUFFER_SIZE 200 static char setup_buffer[SETUP_BUFFER_SIZE]; static char setup_used[MAX_SETUP_ARGS]; @@ -2015,7 +2015,7 @@ static int __init in2000_detect(struct scsi_host_template * tpnt) write1_io(0, IO_FIFO_READ); /* start fifo out in read mode */ write1_io(0, IO_INTR_MASK); /* allow all ints */ x = int_tab[(switches & (SW_INT0 | SW_INT1)) >> SW_INT_SHIFT]; - if (request_irq(x, in2000_intr, SA_INTERRUPT, "in2000", instance)) { + if (request_irq(x, in2000_intr, IRQF_DISABLED, "in2000", instance)) { printk("in2000_detect: Unable to allocate IRQ.\n"); detect_count--; continue; diff --git a/drivers/scsi/initio.c b/drivers/scsi/initio.c index 0cc7f65b5..9e10dac61 100644 --- a/drivers/scsi/initio.c +++ b/drivers/scsi/initio.c @@ -118,7 +118,6 @@ #include #include #include -#include #include #include #include @@ -154,7 +153,6 @@ static unsigned int i91u_debug = DEBUG_DEFAULT; #endif -#define TULSZ(sz) (sizeof(sz) / sizeof(sz[0])) #define TUL_RDWORD(x,y) (short)(inl((int)((ULONG)((ULONG)x+(UCHAR)y)) )) typedef struct PCI_ID_Struc { @@ -2771,7 +2769,7 @@ static int tul_NewReturnNumberOfAdapters(void) init_i91uAdapter_table(); - for (i = 0; i < TULSZ(i91u_pci_devices); i++) + for (i = 0; i < ARRAY_SIZE(i91u_pci_devices); i++) { while ((pDev = pci_find_device(i91u_pci_devices[i].vendor_id, i91u_pci_devices[i].device_id, pDev)) != NULL) { if (pci_enable_device(pDev)) @@ -2869,7 +2867,7 @@ static int i91u_detect(struct scsi_host_template * tpnt) hreg->sg_tablesize = TOTAL_SG_ENTRY; /* Maximun support is 32 */ /* Initial tulip chip */ - ok = request_irq(pHCB->HCS_Intr, i91u_intr, SA_INTERRUPT | SA_SHIRQ, "i91u", hreg); + ok = request_irq(pHCB->HCS_Intr, i91u_intr, IRQF_DISABLED | IRQF_SHARED, "i91u", hreg); if (ok < 0) { printk(KERN_WARNING "i91u: unable to request IRQ %d\n\n", pHCB->HCS_Intr); return 0; diff --git a/drivers/scsi/initio.h b/drivers/scsi/initio.h index 3efb1184f..acb67a4af 100644 --- a/drivers/scsi/initio.h +++ b/drivers/scsi/initio.h @@ -54,7 +54,6 @@ **************************************************************************/ -#include #include #define ULONG unsigned long @@ -193,13 +192,13 @@ typedef struct { #define TSC_SEL_ATN_DIRECT_OUT 0x15 /* Select With ATN Sequence */ #define TSC_SEL_ATN3_DIRECT_IN 0xB5 /* Select With ATN3 Sequence */ #define TSC_SEL_ATN3_DIRECT_OUT 0x35 /* Select With ATN3 Sequence */ -#define TSC_XF_DMA_OUT_DIRECT 0x06 /* DMA Xfer Infomation out */ -#define TSC_XF_DMA_IN_DIRECT 0x86 /* DMA Xfer Infomation in */ +#define TSC_XF_DMA_OUT_DIRECT 0x06 /* DMA Xfer Information out */ +#define TSC_XF_DMA_IN_DIRECT 0x86 /* DMA Xfer Information in */ -#define TSC_XF_DMA_OUT 0x43 /* DMA Xfer Infomation out */ -#define TSC_XF_DMA_IN 0xC3 /* DMA Xfer Infomation in */ -#define TSC_XF_FIFO_OUT 0x03 /* FIFO Xfer Infomation out */ -#define TSC_XF_FIFO_IN 0x83 /* FIFO Xfer Infomation in */ +#define TSC_XF_DMA_OUT 0x43 /* DMA Xfer Information out */ +#define TSC_XF_DMA_IN 0xC3 /* DMA Xfer Information in */ +#define TSC_XF_FIFO_OUT 0x03 /* FIFO Xfer Information out */ +#define TSC_XF_FIFO_IN 0x83 /* FIFO Xfer Information in */ #define TSC_MSG_ACCEPT 0x0F /* Message Accept */ diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c index 5441531c0..01080b3ac 100644 --- a/drivers/scsi/ipr.c +++ b/drivers/scsi/ipr.c @@ -54,7 +54,6 @@ * */ -#include #include #include #include @@ -79,7 +78,6 @@ #include #include #include -#include #include "ipr.h" /* @@ -91,11 +89,14 @@ static unsigned int ipr_max_speed = 1; static int ipr_testmode = 0; static unsigned int ipr_fastfail = 0; static unsigned int ipr_transop_timeout = IPR_OPERATIONAL_TIMEOUT; +static unsigned int ipr_enable_cache = 1; +static unsigned int ipr_debug = 0; +static int ipr_auto_create = 1; static DEFINE_SPINLOCK(ipr_driver_lock); /* This table describes the differences between DMA controller chips */ static const struct ipr_chip_cfg_t ipr_chip_cfg[] = { - { /* Gemstone and Citrine */ + { /* Gemstone, Citrine, and Obsidian */ .mailbox = 0x0042C, .cache_line_size = 0x20, { @@ -130,6 +131,8 @@ static const struct ipr_chip_cfg_t ipr_chip_cfg[] = { static const struct ipr_chip_t ipr_chip[] = { { PCI_VENDOR_ID_MYLEX, PCI_DEVICE_ID_IBM_GEMSTONE, &ipr_chip_cfg[0] }, { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CITRINE, &ipr_chip_cfg[0] }, + { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_OBSIDIAN, &ipr_chip_cfg[0] }, + { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN, &ipr_chip_cfg[0] }, { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_SNIPE, &ipr_chip_cfg[1] }, { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_SCAMP, &ipr_chip_cfg[1] } }; @@ -150,32 +153,15 @@ module_param_named(fastfail, ipr_fastfail, int, 0); MODULE_PARM_DESC(fastfail, "Reduce timeouts and retries"); module_param_named(transop_timeout, ipr_transop_timeout, int, 0); MODULE_PARM_DESC(transop_timeout, "Time in seconds to wait for adapter to come operational (default: 300)"); +module_param_named(enable_cache, ipr_enable_cache, int, 0); +MODULE_PARM_DESC(enable_cache, "Enable adapter's non-volatile write cache (default: 1)"); +module_param_named(debug, ipr_debug, int, 0); +MODULE_PARM_DESC(debug, "Enable device driver debugging logging. Set to 1 to enable. (default: 0)"); +module_param_named(auto_create, ipr_auto_create, int, 0); +MODULE_PARM_DESC(auto_create, "Auto-create single device RAID 0 arrays when initialized (default: 1)"); MODULE_LICENSE("GPL"); MODULE_VERSION(IPR_DRIVER_VERSION); -static const char *ipr_gpdd_dev_end_states[] = { - "Command complete", - "Terminated by host", - "Terminated by device reset", - "Terminated by bus reset", - "Unknown", - "Command not started" -}; - -static const char *ipr_gpdd_dev_bus_phases[] = { - "Bus free", - "Arbitration", - "Selection", - "Message out", - "Command", - "Message in", - "Data out", - "Data in", - "Status", - "Reselection", - "Unknown" -}; - /* A constant array of IOASCs/URCs/Error Messages */ static const struct ipr_error_table_t ipr_error_table[] = { @@ -285,12 +271,18 @@ struct ipr_error_table_t ipr_error_table[] = { "3110: Device bus error, message or command phase"}, {0x04670400, 0, 1, "9091: Incorrect hardware configuration change has been detected"}, + {0x04678000, 0, 1, + "9073: Invalid multi-adapter configuration"}, {0x046E0000, 0, 1, "FFF4: Command to logical unit failed"}, {0x05240000, 1, 0, "Illegal request, invalid request type or request packet"}, {0x05250000, 0, 0, "Illegal request, invalid resource handle"}, + {0x05258000, 0, 0, + "Illegal request, commands not allowed to this device"}, + {0x05258100, 0, 0, + "Illegal request, command not allowed to a secondary adapter"}, {0x05260000, 0, 0, "Illegal request, invalid field in parameter list"}, {0x05260100, 0, 0, @@ -299,6 +291,8 @@ struct ipr_error_table_t ipr_error_table[] = { "Illegal request, parameter value invalid"}, {0x052C0000, 0, 0, "Illegal request, command sequence error"}, + {0x052C8000, 1, 0, + "Illegal request, dual adapter support not enabled"}, {0x06040500, 0, 1, "9031: Array protection temporarily suspended, protection resuming"}, {0x06040600, 0, 1, @@ -315,18 +309,26 @@ struct ipr_error_table_t ipr_error_table[] = { "3029: A device replacement has occurred"}, {0x064C8000, 0, 1, "9051: IOA cache data exists for a missing or failed device"}, + {0x064C8100, 0, 1, + "9055: Auxiliary cache IOA contains cache data needed by the primary IOA"}, {0x06670100, 0, 1, "9025: Disk unit is not supported at its physical location"}, {0x06670600, 0, 1, "3020: IOA detected a SCSI bus configuration error"}, {0x06678000, 0, 1, "3150: SCSI bus configuration error"}, + {0x06678100, 0, 1, + "9074: Asymmetric advanced function disk configuration"}, {0x06690200, 0, 1, "9041: Array protection temporarily suspended"}, {0x06698200, 0, 1, "9042: Corrupt array parity detected on specified device"}, {0x066B0200, 0, 1, "9030: Array no longer protected due to missing or failed disk unit"}, + {0x066B8000, 0, 1, + "9071: Link operational transition"}, + {0x066B8100, 0, 1, + "9072: Link not operational transition"}, {0x066B8200, 0, 1, "9032: Array exposed but still protected"}, {0x07270000, 0, 0, @@ -789,7 +791,7 @@ static void ipr_send_hcam(struct ipr_ioa_cfg *ioa_cfg, u8 type, **/ static void ipr_init_res_entry(struct ipr_resource_entry *res) { - res->needs_sync_complete = 1; + res->needs_sync_complete = 0; res->in_erp = 0; res->add_to_ml = 0; res->del_from_ml = 0; @@ -842,8 +844,8 @@ static void ipr_handle_config_change(struct ipr_ioa_cfg *ioa_cfg, if (hostrcb->hcam.notify_type == IPR_HOST_RCB_NOTIF_TYPE_REM_ENTRY) { if (res->sdev) { - res->sdev->hostdata = NULL; res->del_from_ml = 1; + res->cfgte.res_handle = IPR_INVALID_RES_HANDLE; if (ioa_cfg->allow_ml_add_del) schedule_work(&ioa_cfg->work_q); } else @@ -889,28 +891,73 @@ static void ipr_process_ccn(struct ipr_cmnd *ipr_cmd) /** * ipr_log_vpd - Log the passed VPD to the error log. - * @vpids: vendor/product id struct - * @serial_num: serial number string + * @vpd: vendor/product id/sn struct * * Return value: * none **/ -static void ipr_log_vpd(struct ipr_std_inq_vpids *vpids, u8 *serial_num) +static void ipr_log_vpd(struct ipr_vpd *vpd) { char buffer[IPR_VENDOR_ID_LEN + IPR_PROD_ID_LEN + IPR_SERIAL_NUM_LEN]; - memcpy(buffer, vpids->vendor_id, IPR_VENDOR_ID_LEN); - memcpy(buffer + IPR_VENDOR_ID_LEN, vpids->product_id, + memcpy(buffer, vpd->vpids.vendor_id, IPR_VENDOR_ID_LEN); + memcpy(buffer + IPR_VENDOR_ID_LEN, vpd->vpids.product_id, IPR_PROD_ID_LEN); buffer[IPR_VENDOR_ID_LEN + IPR_PROD_ID_LEN] = '\0'; ipr_err("Vendor/Product ID: %s\n", buffer); - memcpy(buffer, serial_num, IPR_SERIAL_NUM_LEN); + memcpy(buffer, vpd->sn, IPR_SERIAL_NUM_LEN); buffer[IPR_SERIAL_NUM_LEN] = '\0'; ipr_err(" Serial Number: %s\n", buffer); } +/** + * ipr_log_ext_vpd - Log the passed extended VPD to the error log. + * @vpd: vendor/product id/sn/wwn struct + * + * Return value: + * none + **/ +static void ipr_log_ext_vpd(struct ipr_ext_vpd *vpd) +{ + ipr_log_vpd(&vpd->vpd); + ipr_err(" WWN: %08X%08X\n", be32_to_cpu(vpd->wwid[0]), + be32_to_cpu(vpd->wwid[1])); +} + +/** + * ipr_log_enhanced_cache_error - Log a cache error. + * @ioa_cfg: ioa config struct + * @hostrcb: hostrcb struct + * + * Return value: + * none + **/ +static void ipr_log_enhanced_cache_error(struct ipr_ioa_cfg *ioa_cfg, + struct ipr_hostrcb *hostrcb) +{ + struct ipr_hostrcb_type_12_error *error = + &hostrcb->hcam.u.error.u.type_12_error; + + ipr_err("-----Current Configuration-----\n"); + ipr_err("Cache Directory Card Information:\n"); + ipr_log_ext_vpd(&error->ioa_vpd); + ipr_err("Adapter Card Information:\n"); + ipr_log_ext_vpd(&error->cfc_vpd); + + ipr_err("-----Expected Configuration-----\n"); + ipr_err("Cache Directory Card Information:\n"); + ipr_log_ext_vpd(&error->ioa_last_attached_to_cfc_vpd); + ipr_err("Adapter Card Information:\n"); + ipr_log_ext_vpd(&error->cfc_last_attached_to_ioa_vpd); + + ipr_err("Additional IOA Data: %08X %08X %08X\n", + be32_to_cpu(error->ioa_data[0]), + be32_to_cpu(error->ioa_data[1]), + be32_to_cpu(error->ioa_data[2])); +} + /** * ipr_log_cache_error - Log a cache error. * @ioa_cfg: ioa config struct @@ -927,17 +974,15 @@ static void ipr_log_cache_error(struct ipr_ioa_cfg *ioa_cfg, ipr_err("-----Current Configuration-----\n"); ipr_err("Cache Directory Card Information:\n"); - ipr_log_vpd(&error->ioa_vpids, error->ioa_sn); + ipr_log_vpd(&error->ioa_vpd); ipr_err("Adapter Card Information:\n"); - ipr_log_vpd(&error->cfc_vpids, error->cfc_sn); + ipr_log_vpd(&error->cfc_vpd); ipr_err("-----Expected Configuration-----\n"); ipr_err("Cache Directory Card Information:\n"); - ipr_log_vpd(&error->ioa_last_attached_to_cfc_vpids, - error->ioa_last_attached_to_cfc_sn); + ipr_log_vpd(&error->ioa_last_attached_to_cfc_vpd); ipr_err("Adapter Card Information:\n"); - ipr_log_vpd(&error->cfc_last_attached_to_ioa_vpids, - error->cfc_last_attached_to_ioa_sn); + ipr_log_vpd(&error->cfc_last_attached_to_ioa_vpd); ipr_err("Additional IOA Data: %08X %08X %08X\n", be32_to_cpu(error->ioa_data[0]), @@ -945,6 +990,46 @@ static void ipr_log_cache_error(struct ipr_ioa_cfg *ioa_cfg, be32_to_cpu(error->ioa_data[2])); } +/** + * ipr_log_enhanced_config_error - Log a configuration error. + * @ioa_cfg: ioa config struct + * @hostrcb: hostrcb struct + * + * Return value: + * none + **/ +static void ipr_log_enhanced_config_error(struct ipr_ioa_cfg *ioa_cfg, + struct ipr_hostrcb *hostrcb) +{ + int errors_logged, i; + struct ipr_hostrcb_device_data_entry_enhanced *dev_entry; + struct ipr_hostrcb_type_13_error *error; + + error = &hostrcb->hcam.u.error.u.type_13_error; + errors_logged = be32_to_cpu(error->errors_logged); + + ipr_err("Device Errors Detected/Logged: %d/%d\n", + be32_to_cpu(error->errors_detected), errors_logged); + + dev_entry = error->dev; + + for (i = 0; i < errors_logged; i++, dev_entry++) { + ipr_err_separator; + + ipr_phys_res_err(ioa_cfg, dev_entry->dev_res_addr, "Device %d", i + 1); + ipr_log_ext_vpd(&dev_entry->vpd); + + ipr_err("-----New Device Information-----\n"); + ipr_log_ext_vpd(&dev_entry->new_vpd); + + ipr_err("Cache Directory Card Information:\n"); + ipr_log_ext_vpd(&dev_entry->ioa_last_with_dev_vpd); + + ipr_err("Adapter Card Information:\n"); + ipr_log_ext_vpd(&dev_entry->cfc_last_with_dev_vpd); + } +} + /** * ipr_log_config_error - Log a configuration error. * @ioa_cfg: ioa config struct @@ -966,30 +1051,22 @@ static void ipr_log_config_error(struct ipr_ioa_cfg *ioa_cfg, ipr_err("Device Errors Detected/Logged: %d/%d\n", be32_to_cpu(error->errors_detected), errors_logged); - dev_entry = error->dev_entry; + dev_entry = error->dev; for (i = 0; i < errors_logged; i++, dev_entry++) { ipr_err_separator; - if (dev_entry->dev_res_addr.bus >= IPR_MAX_NUM_BUSES) { - ipr_err("Device %d: missing\n", i + 1); - } else { - ipr_err("Device %d: %d:%d:%d:%d\n", i + 1, - ioa_cfg->host->host_no, dev_entry->dev_res_addr.bus, - dev_entry->dev_res_addr.target, dev_entry->dev_res_addr.lun); - } - ipr_log_vpd(&dev_entry->dev_vpids, dev_entry->dev_sn); + ipr_phys_res_err(ioa_cfg, dev_entry->dev_res_addr, "Device %d", i + 1); + ipr_log_vpd(&dev_entry->vpd); ipr_err("-----New Device Information-----\n"); - ipr_log_vpd(&dev_entry->new_dev_vpids, dev_entry->new_dev_sn); + ipr_log_vpd(&dev_entry->new_vpd); ipr_err("Cache Directory Card Information:\n"); - ipr_log_vpd(&dev_entry->ioa_last_with_dev_vpids, - dev_entry->ioa_last_with_dev_sn); + ipr_log_vpd(&dev_entry->ioa_last_with_dev_vpd); ipr_err("Adapter Card Information:\n"); - ipr_log_vpd(&dev_entry->cfc_last_with_dev_vpids, - dev_entry->cfc_last_with_dev_sn); + ipr_log_vpd(&dev_entry->cfc_last_with_dev_vpd); ipr_err("Additional IOA Data: %08X %08X %08X %08X %08X\n", be32_to_cpu(dev_entry->ioa_data[0]), @@ -1000,6 +1077,57 @@ static void ipr_log_config_error(struct ipr_ioa_cfg *ioa_cfg, } } +/** + * ipr_log_enhanced_array_error - Log an array configuration error. + * @ioa_cfg: ioa config struct + * @hostrcb: hostrcb struct + * + * Return value: + * none + **/ +static void ipr_log_enhanced_array_error(struct ipr_ioa_cfg *ioa_cfg, + struct ipr_hostrcb *hostrcb) +{ + int i, num_entries; + struct ipr_hostrcb_type_14_error *error; + struct ipr_hostrcb_array_data_entry_enhanced *array_entry; + const u8 zero_sn[IPR_SERIAL_NUM_LEN] = { [0 ... IPR_SERIAL_NUM_LEN-1] = '0' }; + + error = &hostrcb->hcam.u.error.u.type_14_error; + + ipr_err_separator; + + ipr_err("RAID %s Array Configuration: %d:%d:%d:%d\n", + error->protection_level, + ioa_cfg->host->host_no, + error->last_func_vset_res_addr.bus, + error->last_func_vset_res_addr.target, + error->last_func_vset_res_addr.lun); + + ipr_err_separator; + + array_entry = error->array_member; + num_entries = min_t(u32, be32_to_cpu(error->num_entries), + sizeof(error->array_member)); + + for (i = 0; i < num_entries; i++, array_entry++) { + if (!memcmp(array_entry->vpd.vpd.sn, zero_sn, IPR_SERIAL_NUM_LEN)) + continue; + + if (be32_to_cpu(error->exposed_mode_adn) == i) + ipr_err("Exposed Array Member %d:\n", i); + else + ipr_err("Array Member %d:\n", i); + + ipr_log_ext_vpd(&array_entry->vpd); + ipr_phys_res_err(ioa_cfg, array_entry->dev_res_addr, "Current Location"); + ipr_phys_res_err(ioa_cfg, array_entry->expected_dev_res_addr, + "Expected Location"); + + ipr_err_separator; + } +} + /** * ipr_log_array_error - Log an array configuration error. * @ioa_cfg: ioa config struct @@ -1032,36 +1160,19 @@ static void ipr_log_array_error(struct ipr_ioa_cfg *ioa_cfg, array_entry = error->array_member; for (i = 0; i < 18; i++) { - if (!memcmp(array_entry->serial_num, zero_sn, IPR_SERIAL_NUM_LEN)) + if (!memcmp(array_entry->vpd.sn, zero_sn, IPR_SERIAL_NUM_LEN)) continue; - if (be32_to_cpu(error->exposed_mode_adn) == i) { + if (be32_to_cpu(error->exposed_mode_adn) == i) ipr_err("Exposed Array Member %d:\n", i); - } else { + else ipr_err("Array Member %d:\n", i); - } - ipr_log_vpd(&array_entry->vpids, array_entry->serial_num); + ipr_log_vpd(&array_entry->vpd); - if (array_entry->dev_res_addr.bus >= IPR_MAX_NUM_BUSES) { - ipr_err("Current Location: unknown\n"); - } else { - ipr_err("Current Location: %d:%d:%d:%d\n", - ioa_cfg->host->host_no, - array_entry->dev_res_addr.bus, - array_entry->dev_res_addr.target, - array_entry->dev_res_addr.lun); - } - - if (array_entry->dev_res_addr.bus >= IPR_MAX_NUM_BUSES) { - ipr_err("Expected Location: unknown\n"); - } else { - ipr_err("Expected Location: %d:%d:%d:%d\n", - ioa_cfg->host->host_no, - array_entry->expected_dev_res_addr.bus, - array_entry->expected_dev_res_addr.target, - array_entry->expected_dev_res_addr.lun); - } + ipr_phys_res_err(ioa_cfg, array_entry->dev_res_addr, "Current Location"); + ipr_phys_res_err(ioa_cfg, array_entry->expected_dev_res_addr, + "Expected Location"); ipr_err_separator; @@ -1073,34 +1184,94 @@ static void ipr_log_array_error(struct ipr_ioa_cfg *ioa_cfg, } /** - * ipr_log_generic_error - Log an adapter error. - * @ioa_cfg: ioa config struct - * @hostrcb: hostrcb struct + * ipr_log_hex_data - Log additional hex IOA error data. + * @data: IOA error data + * @len: data length * * Return value: * none **/ -static void ipr_log_generic_error(struct ipr_ioa_cfg *ioa_cfg, - struct ipr_hostrcb *hostrcb) +static void ipr_log_hex_data(u32 *data, int len) { int i; - int ioa_data_len = be32_to_cpu(hostrcb->hcam.length); - if (ioa_data_len == 0) + if (len == 0) return; - ipr_err("IOA Error Data:\n"); - ipr_err("Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F\n"); - - for (i = 0; i < ioa_data_len / 4; i += 4) { + for (i = 0; i < len / 4; i += 4) { ipr_err("%08X: %08X %08X %08X %08X\n", i*4, - be32_to_cpu(hostrcb->hcam.u.raw.data[i]), - be32_to_cpu(hostrcb->hcam.u.raw.data[i+1]), - be32_to_cpu(hostrcb->hcam.u.raw.data[i+2]), - be32_to_cpu(hostrcb->hcam.u.raw.data[i+3])); + be32_to_cpu(data[i]), + be32_to_cpu(data[i+1]), + be32_to_cpu(data[i+2]), + be32_to_cpu(data[i+3])); } } +/** + * ipr_log_enhanced_dual_ioa_error - Log an enhanced dual adapter error. + * @ioa_cfg: ioa config struct + * @hostrcb: hostrcb struct + * + * Return value: + * none + **/ +static void ipr_log_enhanced_dual_ioa_error(struct ipr_ioa_cfg *ioa_cfg, + struct ipr_hostrcb *hostrcb) +{ + struct ipr_hostrcb_type_17_error *error; + + error = &hostrcb->hcam.u.error.u.type_17_error; + error->failure_reason[sizeof(error->failure_reason) - 1] = '\0'; + + ipr_err("%s\n", error->failure_reason); + ipr_err("Remote Adapter VPD:\n"); + ipr_log_ext_vpd(&error->vpd); + ipr_log_hex_data(error->data, + be32_to_cpu(hostrcb->hcam.length) - + (offsetof(struct ipr_hostrcb_error, u) + + offsetof(struct ipr_hostrcb_type_17_error, data))); +} + +/** + * ipr_log_dual_ioa_error - Log a dual adapter error. + * @ioa_cfg: ioa config struct + * @hostrcb: hostrcb struct + * + * Return value: + * none + **/ +static void ipr_log_dual_ioa_error(struct ipr_ioa_cfg *ioa_cfg, + struct ipr_hostrcb *hostrcb) +{ + struct ipr_hostrcb_type_07_error *error; + + error = &hostrcb->hcam.u.error.u.type_07_error; + error->failure_reason[sizeof(error->failure_reason) - 1] = '\0'; + + ipr_err("%s\n", error->failure_reason); + ipr_err("Remote Adapter VPD:\n"); + ipr_log_vpd(&error->vpd); + ipr_log_hex_data(error->data, + be32_to_cpu(hostrcb->hcam.length) - + (offsetof(struct ipr_hostrcb_error, u) + + offsetof(struct ipr_hostrcb_type_07_error, data))); +} + +/** + * ipr_log_generic_error - Log an adapter error. + * @ioa_cfg: ioa config struct + * @hostrcb: hostrcb struct + * + * Return value: + * none + **/ +static void ipr_log_generic_error(struct ipr_ioa_cfg *ioa_cfg, + struct ipr_hostrcb *hostrcb) +{ + ipr_log_hex_data(hostrcb->hcam.u.raw.data, + be32_to_cpu(hostrcb->hcam.length)); +} + /** * ipr_get_error - Find the specfied IOASC in the ipr_error_table. * @ioasc: IOASC @@ -1160,8 +1331,8 @@ static void ipr_handle_log_data(struct ipr_ioa_cfg *ioa_cfg, return; if (ipr_is_device(&hostrcb->hcam.u.error.failing_dev_res_addr)) { - ipr_res_err(ioa_cfg, hostrcb->hcam.u.error.failing_dev_res_addr, - "%s\n", ipr_error_table[error_index].error); + ipr_ra_err(ioa_cfg, hostrcb->hcam.u.error.failing_dev_res_addr, + "%s\n", ipr_error_table[error_index].error); } else { dev_err(&ioa_cfg->pdev->dev, "%s\n", ipr_error_table[error_index].error); @@ -1172,11 +1343,10 @@ static void ipr_handle_log_data(struct ipr_ioa_cfg *ioa_cfg, if (ioa_cfg->log_level < IPR_DEFAULT_LOG_LEVEL) return; + if (be32_to_cpu(hostrcb->hcam.length) > sizeof(hostrcb->hcam.u.raw)) + hostrcb->hcam.length = cpu_to_be32(sizeof(hostrcb->hcam.u.raw)); switch (hostrcb->hcam.overlay_id) { - case IPR_HOST_RCB_OVERLAY_ID_1: - ipr_log_generic_error(ioa_cfg, hostrcb); - break; case IPR_HOST_RCB_OVERLAY_ID_2: ipr_log_cache_error(ioa_cfg, hostrcb); break; @@ -1187,13 +1357,26 @@ static void ipr_handle_log_data(struct ipr_ioa_cfg *ioa_cfg, case IPR_HOST_RCB_OVERLAY_ID_6: ipr_log_array_error(ioa_cfg, hostrcb); break; - case IPR_HOST_RCB_OVERLAY_ID_DEFAULT: - ipr_log_generic_error(ioa_cfg, hostrcb); + case IPR_HOST_RCB_OVERLAY_ID_7: + ipr_log_dual_ioa_error(ioa_cfg, hostrcb); + break; + case IPR_HOST_RCB_OVERLAY_ID_12: + ipr_log_enhanced_cache_error(ioa_cfg, hostrcb); + break; + case IPR_HOST_RCB_OVERLAY_ID_13: + ipr_log_enhanced_config_error(ioa_cfg, hostrcb); break; + case IPR_HOST_RCB_OVERLAY_ID_14: + case IPR_HOST_RCB_OVERLAY_ID_16: + ipr_log_enhanced_array_error(ioa_cfg, hostrcb); + break; + case IPR_HOST_RCB_OVERLAY_ID_17: + ipr_log_enhanced_dual_ioa_error(ioa_cfg, hostrcb); + break; + case IPR_HOST_RCB_OVERLAY_ID_1: + case IPR_HOST_RCB_OVERLAY_ID_DEFAULT: default: - dev_err(&ioa_cfg->pdev->dev, - "Unknown error received. Overlay ID: %d\n", - hostrcb->hcam.overlay_id); + ipr_log_generic_error(ioa_cfg, hostrcb); break; } } @@ -1899,7 +2082,6 @@ restart: did_work = 1; sdev = res->sdev; if (!scsi_device_get(sdev)) { - res->sdev = NULL; list_move_tail(&res->queue, &ioa_cfg->free_res_q); spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); scsi_remove_device(sdev); @@ -1916,6 +2098,7 @@ restart: bus = res->cfgte.res_addr.bus; target = res->cfgte.res_addr.target; lun = res->cfgte.res_addr.lun; + res->add_to_ml = 0; spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); scsi_add_device(ioa_cfg->host, bus, target, lun); spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); @@ -1924,7 +2107,7 @@ restart: } spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); - kobject_uevent(&ioa_cfg->host->shost_classdev.kobj, KOBJ_CHANGE, NULL); + kobject_uevent(&ioa_cfg->host->shost_classdev.kobj, KOBJ_CHANGE); LEAVE; } @@ -1972,6 +2155,103 @@ static struct bin_attribute ipr_trace_attr = { }; #endif +static const struct { + enum ipr_cache_state state; + char *name; +} cache_state [] = { + { CACHE_NONE, "none" }, + { CACHE_DISABLED, "disabled" }, + { CACHE_ENABLED, "enabled" } +}; + +/** + * ipr_show_write_caching - Show the write caching attribute + * @class_dev: class device struct + * @buf: buffer + * + * Return value: + * number of bytes printed to buffer + **/ +static ssize_t ipr_show_write_caching(struct class_device *class_dev, char *buf) +{ + struct Scsi_Host *shost = class_to_shost(class_dev); + struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; + unsigned long lock_flags = 0; + int i, len = 0; + + spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); + for (i = 0; i < ARRAY_SIZE(cache_state); i++) { + if (cache_state[i].state == ioa_cfg->cache_state) { + len = snprintf(buf, PAGE_SIZE, "%s\n", cache_state[i].name); + break; + } + } + spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); + return len; +} + + +/** + * ipr_store_write_caching - Enable/disable adapter write cache + * @class_dev: class_device struct + * @buf: buffer + * @count: buffer size + * + * This function will enable/disable adapter write cache. + * + * Return value: + * count on success / other on failure + **/ +static ssize_t ipr_store_write_caching(struct class_device *class_dev, + const char *buf, size_t count) +{ + struct Scsi_Host *shost = class_to_shost(class_dev); + struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; + unsigned long lock_flags = 0; + enum ipr_cache_state new_state = CACHE_INVALID; + int i; + + if (!capable(CAP_SYS_ADMIN)) + return -EACCES; + if (ioa_cfg->cache_state == CACHE_NONE) + return -EINVAL; + + for (i = 0; i < ARRAY_SIZE(cache_state); i++) { + if (!strncmp(cache_state[i].name, buf, strlen(cache_state[i].name))) { + new_state = cache_state[i].state; + break; + } + } + + if (new_state != CACHE_DISABLED && new_state != CACHE_ENABLED) + return -EINVAL; + + spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); + if (ioa_cfg->cache_state == new_state) { + spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); + return count; + } + + ioa_cfg->cache_state = new_state; + dev_info(&ioa_cfg->pdev->dev, "%s adapter write cache.\n", + new_state == CACHE_ENABLED ? "Enabling" : "Disabling"); + if (!ioa_cfg->in_reset_reload) + ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NORMAL); + spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); + wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); + + return count; +} + +static struct class_device_attribute ipr_ioa_cache_attr = { + .attr = { + .name = "write_cache", + .mode = S_IRUGO | S_IWUSR, + }, + .show = ipr_show_write_caching, + .store = ipr_store_write_caching +}; + /** * ipr_show_fw_version - Show the firmware version * @class_dev: class device struct @@ -2111,6 +2391,74 @@ static struct class_device_attribute ipr_diagnostics_attr = { .store = ipr_store_diagnostics }; +/** + * ipr_show_adapter_state - Show the adapter's state + * @class_dev: class device struct + * @buf: buffer + * + * Return value: + * number of bytes printed to buffer + **/ +static ssize_t ipr_show_adapter_state(struct class_device *class_dev, char *buf) +{ + struct Scsi_Host *shost = class_to_shost(class_dev); + struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; + unsigned long lock_flags = 0; + int len; + + spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); + if (ioa_cfg->ioa_is_dead) + len = snprintf(buf, PAGE_SIZE, "offline\n"); + else + len = snprintf(buf, PAGE_SIZE, "online\n"); + spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); + return len; +} + +/** + * ipr_store_adapter_state - Change adapter state + * @class_dev: class_device struct + * @buf: buffer + * @count: buffer size + * + * This function will change the adapter's state. + * + * Return value: + * count on success / other on failure + **/ +static ssize_t ipr_store_adapter_state(struct class_device *class_dev, + const char *buf, size_t count) +{ + struct Scsi_Host *shost = class_to_shost(class_dev); + struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; + unsigned long lock_flags; + int result = count; + + if (!capable(CAP_SYS_ADMIN)) + return -EACCES; + + spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); + if (ioa_cfg->ioa_is_dead && !strncmp(buf, "online", 6)) { + ioa_cfg->ioa_is_dead = 0; + ioa_cfg->reset_retries = 0; + ioa_cfg->in_ioa_bringdown = 0; + ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE); + } + spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); + wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); + + return result; +} + +static struct class_device_attribute ipr_ioa_state_attr = { + .attr = { + .name = "state", + .mode = S_IRUGO | S_IWUSR, + }, + .show = ipr_show_adapter_state, + .store = ipr_store_adapter_state +}; + /** * ipr_store_reset_adapter - Reset the adapter * @class_dev: class_device struct @@ -2183,7 +2531,7 @@ static struct ipr_sglist *ipr_alloc_ucode_buffer(int buf_len) num_elem = buf_len / bsize_elem; /* Allocate a scatter/gather list for the DMA */ - sglist = kmalloc(sizeof(struct ipr_sglist) + + sglist = kzalloc(sizeof(struct ipr_sglist) + (sizeof(struct scatterlist) * (num_elem - 1)), GFP_KERNEL); @@ -2192,9 +2540,6 @@ static struct ipr_sglist *ipr_alloc_ucode_buffer(int buf_len) return NULL; } - memset(sglist, 0, sizeof(struct ipr_sglist) + - (sizeof(struct scatterlist) * (num_elem - 1))); - scatterlist = sglist->scatterlist; sglist->order = order; @@ -2289,31 +2634,24 @@ static int ipr_copy_ucode_buffer(struct ipr_sglist *sglist, } /** - * ipr_map_ucode_buffer - Map a microcode download buffer + * ipr_build_ucode_ioadl - Build a microcode download IOADL * @ipr_cmd: ipr command struct * @sglist: scatter/gather list - * @len: total length of download buffer * - * Maps a microcode download scatter/gather list for DMA and - * builds the IOADL. + * Builds a microcode download IOA data list (IOADL). * - * Return value: - * 0 on success / -EIO on failure **/ -static int ipr_map_ucode_buffer(struct ipr_cmnd *ipr_cmd, - struct ipr_sglist *sglist, int len) +static void ipr_build_ucode_ioadl(struct ipr_cmnd *ipr_cmd, + struct ipr_sglist *sglist) { - struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; struct ipr_ioadl_desc *ioadl = ipr_cmd->ioadl; struct scatterlist *scatterlist = sglist->scatterlist; int i; - ipr_cmd->dma_use_sg = pci_map_sg(ioa_cfg->pdev, scatterlist, - sglist->num_sg, DMA_TO_DEVICE); - + ipr_cmd->dma_use_sg = sglist->num_dma_sg; ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_WRITE_NOT_READ; - ioarcb->write_data_transfer_length = cpu_to_be32(len); + ioarcb->write_data_transfer_length = cpu_to_be32(sglist->buffer_len); ioarcb->write_ioadl_len = cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg); @@ -2324,15 +2662,52 @@ static int ipr_map_ucode_buffer(struct ipr_cmnd *ipr_cmd, cpu_to_be32(sg_dma_address(&scatterlist[i])); } - if (likely(ipr_cmd->dma_use_sg)) { - ioadl[i-1].flags_and_data_len |= - cpu_to_be32(IPR_IOADL_FLAGS_LAST); + ioadl[i-1].flags_and_data_len |= + cpu_to_be32(IPR_IOADL_FLAGS_LAST); +} + +/** + * ipr_update_ioa_ucode - Update IOA's microcode + * @ioa_cfg: ioa config struct + * @sglist: scatter/gather list + * + * Initiate an adapter reset to update the IOA's microcode + * + * Return value: + * 0 on success / -EIO on failure + **/ +static int ipr_update_ioa_ucode(struct ipr_ioa_cfg *ioa_cfg, + struct ipr_sglist *sglist) +{ + unsigned long lock_flags; + + spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); + + if (ioa_cfg->ucode_sglist) { + spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); + dev_err(&ioa_cfg->pdev->dev, + "Microcode download already in progress\n"); + return -EIO; } - else { - dev_err(&ioa_cfg->pdev->dev, "pci_map_sg failed!\n"); + + sglist->num_dma_sg = pci_map_sg(ioa_cfg->pdev, sglist->scatterlist, + sglist->num_sg, DMA_TO_DEVICE); + + if (!sglist->num_dma_sg) { + spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); + dev_err(&ioa_cfg->pdev->dev, + "Failed to map microcode download buffer!\n"); return -EIO; } + ioa_cfg->ucode_sglist = sglist; + ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NORMAL); + spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); + wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); + + spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); + ioa_cfg->ucode_sglist = NULL; + spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); return 0; } @@ -2355,7 +2730,6 @@ static ssize_t ipr_store_update_fw(struct class_device *class_dev, struct ipr_ucode_image_header *image_hdr; const struct firmware *fw_entry; struct ipr_sglist *sglist; - unsigned long lock_flags; char fname[100]; char *src; int len, result, dnld_size; @@ -2396,35 +2770,17 @@ static ssize_t ipr_store_update_fw(struct class_device *class_dev, if (result) { dev_err(&ioa_cfg->pdev->dev, "Microcode buffer copy to DMA buffer failed\n"); - ipr_free_ucode_buffer(sglist); - release_firmware(fw_entry); - return result; - } - - spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); - - if (ioa_cfg->ucode_sglist) { - spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); - dev_err(&ioa_cfg->pdev->dev, - "Microcode download already in progress\n"); - ipr_free_ucode_buffer(sglist); - release_firmware(fw_entry); - return -EIO; + goto out; } - ioa_cfg->ucode_sglist = sglist; - ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NORMAL); - spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); - wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); - - spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); - ioa_cfg->ucode_sglist = NULL; - spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); + result = ipr_update_ioa_ucode(ioa_cfg, sglist); + if (!result) + result = count; +out: ipr_free_ucode_buffer(sglist); release_firmware(fw_entry); - - return count; + return result; } static struct class_device_attribute ipr_update_fw_attr = { @@ -2439,8 +2795,10 @@ static struct class_device_attribute *ipr_ioa_attrs[] = { &ipr_fw_version_attr, &ipr_log_level_attr, &ipr_diagnostics_attr, + &ipr_ioa_state_attr, &ipr_ioa_reset_attr, &ipr_update_fw_attr, + &ipr_ioa_cache_attr, NULL, }; @@ -2548,14 +2906,13 @@ static int ipr_alloc_dump(struct ipr_ioa_cfg *ioa_cfg) unsigned long lock_flags = 0; ENTER; - dump = kmalloc(sizeof(struct ipr_dump), GFP_KERNEL); + dump = kzalloc(sizeof(struct ipr_dump), GFP_KERNEL); if (!dump) { ipr_err("Dump memory allocation failed\n"); return -ENOMEM; } - memset(dump, 0, sizeof(struct ipr_dump)); kref_init(&dump->kref); dump->ioa_cfg = ioa_cfg; @@ -2716,7 +3073,7 @@ static int ipr_change_queue_type(struct scsi_device *sdev, int tag_type) * Return value: * number of bytes printed to buffer **/ -static ssize_t ipr_show_adapter_handle(struct device *dev, char *buf) +static ssize_t ipr_show_adapter_handle(struct device *dev, struct device_attribute *attr, char *buf) { struct scsi_device *sdev = to_scsi_device(dev); struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)sdev->host->hostdata; @@ -2824,13 +3181,15 @@ static int ipr_slave_configure(struct scsi_device *sdev) if (res) { if (ipr_is_af_dasd_device(res)) sdev->type = TYPE_RAID; - if (ipr_is_af_dasd_device(res) || ipr_is_ioa_resource(res)) + if (ipr_is_af_dasd_device(res) || ipr_is_ioa_resource(res)) { sdev->scsi_level = 4; + sdev->no_uld_attach = 1; + } if (ipr_is_vset_device(res)) { sdev->timeout = IPR_VSET_RW_TIMEOUT; blk_queue_max_sectors(sdev->request_queue, IPR_VSET_MAX_SECTORS); } - if (IPR_IS_DASD_DEVICE(res->cfgte.std_inq_data)) + if (ipr_is_vset_device(res) || ipr_is_scsi_disk(res)) sdev->allow_restart = 1; scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun); } @@ -2848,13 +3207,14 @@ static int ipr_slave_configure(struct scsi_device *sdev) * handling new commands. * * Return value: - * 0 on success + * 0 on success / -ENXIO if device does not exist **/ static int ipr_slave_alloc(struct scsi_device *sdev) { struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) sdev->host->hostdata; struct ipr_resource_entry *res; unsigned long lock_flags; + int rc = -ENXIO; sdev->hostdata = NULL; @@ -2868,14 +3228,16 @@ static int ipr_slave_alloc(struct scsi_device *sdev) res->add_to_ml = 0; res->in_erp = 0; sdev->hostdata = res; - res->needs_sync_complete = 1; + if (!ipr_is_naca_model(res)) + res->needs_sync_complete = 1; + rc = 0; break; } } spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); - return 0; + return rc; } /** @@ -2885,7 +3247,7 @@ static int ipr_slave_alloc(struct scsi_device *sdev) * Return value: * SUCCESS / FAILED **/ -static int ipr_eh_host_reset(struct scsi_cmnd * scsi_cmd) +static int __ipr_eh_host_reset(struct scsi_cmnd * scsi_cmd) { struct ipr_ioa_cfg *ioa_cfg; int rc; @@ -2905,6 +3267,55 @@ static int ipr_eh_host_reset(struct scsi_cmnd * scsi_cmd) return rc; } +static int ipr_eh_host_reset(struct scsi_cmnd * cmd) +{ + int rc; + + spin_lock_irq(cmd->device->host->host_lock); + rc = __ipr_eh_host_reset(cmd); + spin_unlock_irq(cmd->device->host->host_lock); + + return rc; +} + +/** + * ipr_device_reset - Reset the device + * @ioa_cfg: ioa config struct + * @res: resource entry struct + * + * This function issues a device reset to the affected device. + * If the device is a SCSI device, a LUN reset will be sent + * to the device first. If that does not work, a target reset + * will be sent. + * + * Return value: + * 0 on success / non-zero on failure + **/ +static int ipr_device_reset(struct ipr_ioa_cfg *ioa_cfg, + struct ipr_resource_entry *res) +{ + struct ipr_cmnd *ipr_cmd; + struct ipr_ioarcb *ioarcb; + struct ipr_cmd_pkt *cmd_pkt; + u32 ioasc; + + ENTER; + ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg); + ioarcb = &ipr_cmd->ioarcb; + cmd_pkt = &ioarcb->cmd_pkt; + + ioarcb->res_handle = res->cfgte.res_handle; + cmd_pkt->request_type = IPR_RQTYPE_IOACMD; + cmd_pkt->cdb[0] = IPR_RESET_DEVICE; + + ipr_send_blocking_cmd(ipr_cmd, ipr_timeout, IPR_DEVICE_RESET_TIMEOUT); + ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc); + list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q); + + LEAVE; + return (IPR_IOASC_SENSE_KEY(ioasc) ? -EIO : 0); +} + /** * ipr_eh_dev_reset - Reset the device * @scsi_cmd: scsi command struct @@ -2916,19 +3327,18 @@ static int ipr_eh_host_reset(struct scsi_cmnd * scsi_cmd) * Return value: * SUCCESS / FAILED **/ -static int ipr_eh_dev_reset(struct scsi_cmnd * scsi_cmd) +static int __ipr_eh_dev_reset(struct scsi_cmnd * scsi_cmd) { struct ipr_cmnd *ipr_cmd; struct ipr_ioa_cfg *ioa_cfg; struct ipr_resource_entry *res; - struct ipr_cmd_pkt *cmd_pkt; - u32 ioasc; + int rc; ENTER; ioa_cfg = (struct ipr_ioa_cfg *) scsi_cmd->device->host->hostdata; res = scsi_cmd->device->hostdata; - if (!res || (!ipr_is_gscsi(res) && !ipr_is_vset_device(res))) + if (!res) return FAILED; /* @@ -2946,28 +3356,26 @@ static int ipr_eh_dev_reset(struct scsi_cmnd * scsi_cmd) if (ipr_cmd->scsi_cmd) ipr_cmd->done = ipr_scsi_eh_done; } - } - - res->resetting_device = 1; - - ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg); - - ipr_cmd->ioarcb.res_handle = res->cfgte.res_handle; - cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt; - cmd_pkt->request_type = IPR_RQTYPE_IOACMD; - cmd_pkt->cdb[0] = IPR_RESET_DEVICE; + } - ipr_sdev_err(scsi_cmd->device, "Resetting device\n"); - ipr_send_blocking_cmd(ipr_cmd, ipr_timeout, IPR_DEVICE_RESET_TIMEOUT); + res->resetting_device = 1; + scmd_printk(KERN_ERR, scsi_cmd, "Resetting device\n"); + rc = ipr_device_reset(ioa_cfg, res); + res->resetting_device = 0; - ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc); + LEAVE; + return (rc ? FAILED : SUCCESS); +} - res->resetting_device = 0; +static int ipr_eh_dev_reset(struct scsi_cmnd * cmd) +{ + int rc; - list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q); + spin_lock_irq(cmd->device->host->host_lock); + rc = __ipr_eh_dev_reset(cmd); + spin_unlock_irq(cmd->device->host->host_lock); - LEAVE; - return (IPR_IOASC_SENSE_KEY(ioasc) ? FAILED : SUCCESS); + return rc; } /** @@ -3031,7 +3439,7 @@ static void ipr_abort_timeout(struct ipr_cmnd *ipr_cmd) return; } - ipr_sdev_err(ipr_cmd->u.sdev, "Abort timed out. Resetting bus\n"); + sdev_printk(KERN_ERR, ipr_cmd->u.sdev, "Abort timed out. Resetting bus.\n"); reset_cmd = ipr_get_free_ipr_cmnd(ioa_cfg); ipr_cmd->sibling = reset_cmd; reset_cmd->sibling = ipr_cmd; @@ -3068,6 +3476,12 @@ static int ipr_cancel_op(struct scsi_cmnd * scsi_cmd) ioa_cfg = (struct ipr_ioa_cfg *)scsi_cmd->device->host->hostdata; res = scsi_cmd->device->hostdata; + /* If we are currently going through reset/reload, return failed. + * This will force the mid-layer to call ipr_eh_host_reset, + * which will then go to sleep and wait for the reset to complete + */ + if (ioa_cfg->in_reset_reload || ioa_cfg->ioa_is_dead) + return FAILED; if (!res || (!ipr_is_gscsi(res) && !ipr_is_vset_device(res))) return FAILED; @@ -3089,7 +3503,8 @@ static int ipr_cancel_op(struct scsi_cmnd * scsi_cmd) cmd_pkt->cdb[0] = IPR_CANCEL_ALL_REQUESTS; ipr_cmd->u.sdev = scsi_cmd->device; - ipr_sdev_err(scsi_cmd->device, "Aborting command: %02X\n", scsi_cmd->cmnd[0]); + scmd_printk(KERN_ERR, scsi_cmd, "Aborting command: %02X\n", + scsi_cmd->cmnd[0]); ipr_send_blocking_cmd(ipr_cmd, ipr_abort_timeout, IPR_CANCEL_ALL_TIMEOUT); ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc); @@ -3103,7 +3518,8 @@ static int ipr_cancel_op(struct scsi_cmnd * scsi_cmd) } list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q); - res->needs_sync_complete = 1; + if (!ipr_is_naca_model(res)) + res->needs_sync_complete = 1; LEAVE; return (IPR_IOASC_SENSE_KEY(ioasc) ? FAILED : SUCCESS); @@ -3118,23 +3534,17 @@ static int ipr_cancel_op(struct scsi_cmnd * scsi_cmd) **/ static int ipr_eh_abort(struct scsi_cmnd * scsi_cmd) { - struct ipr_ioa_cfg *ioa_cfg; + unsigned long flags; + int rc; ENTER; - ioa_cfg = (struct ipr_ioa_cfg *) scsi_cmd->device->host->hostdata; - /* If we are currently going through reset/reload, return failed. This will force the - mid-layer to call ipr_eh_host_reset, which will then go to sleep and wait for the - reset to complete */ - if (ioa_cfg->in_reset_reload) - return FAILED; - if (ioa_cfg->ioa_is_dead) - return FAILED; - if (!scsi_cmd->device->hostdata) - return FAILED; + spin_lock_irqsave(scsi_cmd->device->host->host_lock, flags); + rc = ipr_cancel_op(scsi_cmd); + spin_unlock_irqrestore(scsi_cmd->device->host->host_lock, flags); LEAVE; - return ipr_cancel_op(scsi_cmd); + return rc; } /** @@ -3405,15 +3815,16 @@ static void ipr_erp_done(struct ipr_cmnd *ipr_cmd) if (IPR_IOASC_SENSE_KEY(ioasc) > 0) { scsi_cmd->result |= (DID_ERROR << 16); - ipr_sdev_err(scsi_cmd->device, - "Request Sense failed with IOASC: 0x%08X\n", ioasc); + scmd_printk(KERN_ERR, scsi_cmd, + "Request Sense failed with IOASC: 0x%08X\n", ioasc); } else { memcpy(scsi_cmd->sense_buffer, ipr_cmd->sense_buffer, SCSI_SENSE_BUFFERSIZE); } if (res) { - res->needs_sync_complete = 1; + if (!ipr_is_naca_model(res)) + res->needs_sync_complete = 1; res->in_erp = 0; } ipr_unmap_sglist(ioa_cfg, ipr_cmd); @@ -3527,6 +3938,7 @@ static void ipr_erp_cancel_all(struct ipr_cmnd *ipr_cmd) * ipr_dump_ioasa - Dump contents of IOASA * @ioa_cfg: ioa config struct * @ipr_cmd: ipr command struct + * @res: resource entry struct * * This function is invoked by the interrupt handler when ops * fail. It will log the IOASA if appropriate. Only called @@ -3536,7 +3948,7 @@ static void ipr_erp_cancel_all(struct ipr_cmnd *ipr_cmd) * none **/ static void ipr_dump_ioasa(struct ipr_ioa_cfg *ioa_cfg, - struct ipr_cmnd *ipr_cmd) + struct ipr_cmnd *ipr_cmd, struct ipr_resource_entry *res) { int i; u16 data_len; @@ -3564,16 +3976,7 @@ static void ipr_dump_ioasa(struct ipr_ioa_cfg *ioa_cfg, return; } - ipr_sdev_err(ipr_cmd->scsi_cmd->device, "%s\n", - ipr_error_table[error_index].error); - - if ((ioasa->u.gpdd.end_state <= ARRAY_SIZE(ipr_gpdd_dev_end_states)) && - (ioasa->u.gpdd.bus_phase <= ARRAY_SIZE(ipr_gpdd_dev_bus_phases))) { - ipr_sdev_err(ipr_cmd->scsi_cmd->device, - "Device End state: %s Phase: %s\n", - ipr_gpdd_dev_end_states[ioasa->u.gpdd.end_state], - ipr_gpdd_dev_bus_phases[ioasa->u.gpdd.bus_phase]); - } + ipr_res_err(ioa_cfg, res, "%s\n", ipr_error_table[error_index].error); if (sizeof(struct ipr_ioasa) < be16_to_cpu(ioasa->ret_stat_len)) data_len = sizeof(struct ipr_ioasa); @@ -3682,6 +4085,30 @@ static void ipr_gen_sense(struct ipr_cmnd *ipr_cmd) } } +/** + * ipr_get_autosense - Copy autosense data to sense buffer + * @ipr_cmd: ipr command struct + * + * This function copies the autosense buffer to the buffer + * in the scsi_cmd, if there is autosense available. + * + * Return value: + * 1 if autosense was available / 0 if not + **/ +static int ipr_get_autosense(struct ipr_cmnd *ipr_cmd) +{ + struct ipr_ioasa *ioasa = &ipr_cmd->ioasa; + + if ((be32_to_cpu(ioasa->ioasc_specific) & + (IPR_ADDITIONAL_STATUS_FMT | IPR_AUTOSENSE_VALID)) == 0) + return 0; + + memcpy(ipr_cmd->scsi_cmd->sense_buffer, ioasa->auto_sense.data, + min_t(u16, be16_to_cpu(ioasa->auto_sense.auto_sense_len), + SCSI_SENSE_BUFFERSIZE)); + return 1; +} + /** * ipr_erp_start - Process an error response for a SCSI op * @ioa_cfg: ioa config struct @@ -3706,20 +4133,25 @@ static void ipr_erp_start(struct ipr_ioa_cfg *ioa_cfg, } if (ipr_is_gscsi(res)) - ipr_dump_ioasa(ioa_cfg, ipr_cmd); + ipr_dump_ioasa(ioa_cfg, ipr_cmd, res); else ipr_gen_sense(ipr_cmd); switch (ioasc & IPR_IOASC_IOASC_MASK) { case IPR_IOASC_ABORTED_CMD_TERM_BY_HOST: - scsi_cmd->result |= (DID_IMM_RETRY << 16); + if (ipr_is_naca_model(res)) + scsi_cmd->result |= (DID_ABORT << 16); + else + scsi_cmd->result |= (DID_IMM_RETRY << 16); break; case IPR_IOASC_IR_RESOURCE_HANDLE: + case IPR_IOASC_IR_NO_CMDS_TO_2ND_IOA: scsi_cmd->result |= (DID_NO_CONNECT << 16); break; case IPR_IOASC_HW_SEL_TIMEOUT: scsi_cmd->result |= (DID_NO_CONNECT << 16); - res->needs_sync_complete = 1; + if (!ipr_is_naca_model(res)) + res->needs_sync_complete = 1; break; case IPR_IOASC_SYNC_REQUIRED: if (!res->in_erp) @@ -3727,6 +4159,7 @@ static void ipr_erp_start(struct ipr_ioa_cfg *ioa_cfg, scsi_cmd->result |= (DID_IMM_RETRY << 16); break; case IPR_IOASC_MED_DO_NOT_REALLOC: /* prevent retries */ + case IPR_IOASA_IR_DUAL_IOA_DISABLED: scsi_cmd->result |= (DID_PASSTHROUGH << 16); break; case IPR_IOASC_BUS_WAS_RESET: @@ -3738,21 +4171,27 @@ static void ipr_erp_start(struct ipr_ioa_cfg *ioa_cfg, if (!res->resetting_device) scsi_report_bus_reset(ioa_cfg->host, scsi_cmd->device->channel); scsi_cmd->result |= (DID_ERROR << 16); - res->needs_sync_complete = 1; + if (!ipr_is_naca_model(res)) + res->needs_sync_complete = 1; break; case IPR_IOASC_HW_DEV_BUS_STATUS: scsi_cmd->result |= IPR_IOASC_SENSE_STATUS(ioasc); if (IPR_IOASC_SENSE_STATUS(ioasc) == SAM_STAT_CHECK_CONDITION) { - ipr_erp_cancel_all(ipr_cmd); - return; + if (!ipr_get_autosense(ipr_cmd)) { + if (!ipr_is_naca_model(res)) { + ipr_erp_cancel_all(ipr_cmd); + return; + } + } } - res->needs_sync_complete = 1; + if (!ipr_is_naca_model(res)) + res->needs_sync_complete = 1; break; case IPR_IOASC_NR_INIT_CMD_REQUIRED: break; default: scsi_cmd->result |= (DID_ERROR << 16); - if (!ipr_is_vset_device(res)) + if (!ipr_is_vset_device(res) && !ipr_is_naca_model(res)) res->needs_sync_complete = 1; break; } @@ -3788,35 +4227,6 @@ static void ipr_scsi_done(struct ipr_cmnd *ipr_cmd) ipr_erp_start(ioa_cfg, ipr_cmd); } -/** - * ipr_save_ioafp_mode_select - Save adapters mode select data - * @ioa_cfg: ioa config struct - * @scsi_cmd: scsi command struct - * - * This function saves mode select data for the adapter to - * use following an adapter reset. - * - * Return value: - * 0 on success / SCSI_MLQUEUE_HOST_BUSY on failure - **/ -static int ipr_save_ioafp_mode_select(struct ipr_ioa_cfg *ioa_cfg, - struct scsi_cmnd *scsi_cmd) -{ - if (!ioa_cfg->saved_mode_pages) { - ioa_cfg->saved_mode_pages = kmalloc(sizeof(struct ipr_mode_pages), - GFP_ATOMIC); - if (!ioa_cfg->saved_mode_pages) { - dev_err(&ioa_cfg->pdev->dev, - "IOA mode select buffer allocation failed\n"); - return SCSI_MLQUEUE_HOST_BUSY; - } - } - - memcpy(ioa_cfg->saved_mode_pages, scsi_cmd->buffer, scsi_cmd->cmnd[4]); - ioa_cfg->saved_mode_page_len = scsi_cmd->cmnd[4]; - return 0; -} - /** * ipr_queuecommand - Queue a mid-layer request * @scsi_cmd: scsi command struct @@ -3891,9 +4301,6 @@ static int ipr_queuecommand(struct scsi_cmnd *scsi_cmd, (!ipr_is_gscsi(res) || scsi_cmd->cmnd[0] == IPR_QUERY_RSRC_STATE)) ioarcb->cmd_pkt.request_type = IPR_RQTYPE_IOACMD; - if (ipr_is_ioa_resource(res) && scsi_cmd->cmnd[0] == MODE_SELECT) - rc = ipr_save_ioafp_mode_select(ioa_cfg, scsi_cmd); - if (likely(rc == 0)) rc = ipr_build_ioadl(ioa_cfg, ipr_cmd); @@ -4051,6 +4458,7 @@ static int ipr_ioa_reset_done(struct ipr_cmnd *ipr_cmd) ioa_cfg->in_reset_reload = 0; ioa_cfg->allow_cmds = 1; ioa_cfg->reset_cmd = NULL; + ioa_cfg->doorbell |= IPR_RUNTIME_RESET; list_for_each_entry(res, &ioa_cfg->used_res_q, queue) { if (ioa_cfg->allow_ml_add_del && (res->add_to_ml || res->del_from_ml)) { @@ -4124,7 +4532,7 @@ static int ipr_set_supported_devs(struct ipr_cmnd *ipr_cmd) ipr_cmd->job_step = ipr_ioa_reset_done; list_for_each_entry_continue(res, &ioa_cfg->used_res_q, queue) { - if (!ipr_is_af_dasd_device(res)) + if (!ipr_is_scsi_disk(res)) continue; ipr_cmd->u.res = res; @@ -4156,6 +4564,36 @@ static int ipr_set_supported_devs(struct ipr_cmnd *ipr_cmd) return IPR_RC_JOB_CONTINUE; } +/** + * ipr_setup_write_cache - Disable write cache if needed + * @ipr_cmd: ipr command struct + * + * This function sets up adapters write cache to desired setting + * + * Return value: + * IPR_RC_JOB_CONTINUE / IPR_RC_JOB_RETURN + **/ +static int ipr_setup_write_cache(struct ipr_cmnd *ipr_cmd) +{ + struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; + + ipr_cmd->job_step = ipr_set_supported_devs; + ipr_cmd->u.res = list_entry(ioa_cfg->used_res_q.next, + struct ipr_resource_entry, queue); + + if (ioa_cfg->cache_state != CACHE_DISABLED) + return IPR_RC_JOB_CONTINUE; + + ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE); + ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_IOACMD; + ipr_cmd->ioarcb.cmd_pkt.cdb[0] = IPR_IOA_SHUTDOWN; + ipr_cmd->ioarcb.cmd_pkt.cdb[1] = IPR_SHUTDOWN_PREPARE_FOR_NORMAL; + + ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT); + + return IPR_RC_JOB_RETURN; +} + /** * ipr_get_mode_page - Locate specified mode page * @mode_pages: mode page buffer @@ -4351,26 +4789,17 @@ static int ipr_ioafp_mode_select_page28(struct ipr_cmnd *ipr_cmd) int length; ENTER; - if (ioa_cfg->saved_mode_pages) { - memcpy(mode_pages, ioa_cfg->saved_mode_pages, - ioa_cfg->saved_mode_page_len); - length = ioa_cfg->saved_mode_page_len; - } else { - ipr_scsi_bus_speed_limit(ioa_cfg); - ipr_check_term_power(ioa_cfg, mode_pages); - ipr_modify_ioafp_mode_page_28(ioa_cfg, mode_pages); - length = mode_pages->hdr.length + 1; - mode_pages->hdr.length = 0; - } + ipr_scsi_bus_speed_limit(ioa_cfg); + ipr_check_term_power(ioa_cfg, mode_pages); + ipr_modify_ioafp_mode_page_28(ioa_cfg, mode_pages); + length = mode_pages->hdr.length + 1; + mode_pages->hdr.length = 0; ipr_build_mode_select(ipr_cmd, cpu_to_be32(IPR_IOA_RES_HANDLE), 0x11, ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, mode_pages), length); - ipr_cmd->job_step = ipr_set_supported_devs; - ipr_cmd->u.res = list_entry(ioa_cfg->used_res_q.next, - struct ipr_resource_entry, queue); - + ipr_cmd->job_step = ipr_setup_write_cache; ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT); LEAVE; @@ -4408,6 +4837,51 @@ static void ipr_build_mode_sense(struct ipr_cmnd *ipr_cmd, ioarcb->read_data_transfer_length = cpu_to_be32(xfer_len); } +/** + * ipr_reset_cmd_failed - Handle failure of IOA reset command + * @ipr_cmd: ipr command struct + * + * This function handles the failure of an IOA bringup command. + * + * Return value: + * IPR_RC_JOB_RETURN + **/ +static int ipr_reset_cmd_failed(struct ipr_cmnd *ipr_cmd) +{ + struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; + u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc); + + dev_err(&ioa_cfg->pdev->dev, + "0x%02X failed with IOASC: 0x%08X\n", + ipr_cmd->ioarcb.cmd_pkt.cdb[0], ioasc); + + ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE); + list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q); + return IPR_RC_JOB_RETURN; +} + +/** + * ipr_reset_mode_sense_failed - Handle failure of IOAFP mode sense + * @ipr_cmd: ipr command struct + * + * This function handles the failure of a Mode Sense to the IOAFP. + * Some adapters do not handle all mode pages. + * + * Return value: + * IPR_RC_JOB_CONTINUE / IPR_RC_JOB_RETURN + **/ +static int ipr_reset_mode_sense_failed(struct ipr_cmnd *ipr_cmd) +{ + u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc); + + if (ioasc == IPR_IOASC_IR_INVALID_REQ_TYPE_OR_PKT) { + ipr_cmd->job_step = ipr_setup_write_cache; + return IPR_RC_JOB_CONTINUE; + } + + return ipr_reset_cmd_failed(ipr_cmd); +} + /** * ipr_ioafp_mode_sense_page28 - Issue Mode Sense Page 28 to IOA * @ipr_cmd: ipr command struct @@ -4429,6 +4903,7 @@ static int ipr_ioafp_mode_sense_page28(struct ipr_cmnd *ipr_cmd) sizeof(struct ipr_mode_pages)); ipr_cmd->job_step = ipr_ioafp_mode_select_page28; + ipr_cmd->job_step_failed = ipr_reset_mode_sense_failed; ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT); @@ -4497,7 +4972,7 @@ static int ipr_init_res_table(struct ipr_cmnd *ipr_cmd) list_for_each_entry_safe(res, temp, &old_res, queue) { if (res->sdev) { res->del_from_ml = 1; - res->sdev->hostdata = NULL; + res->cfgte.res_handle = IPR_INVALID_RES_HANDLE; list_move_tail(&res->queue, &ioa_cfg->used_res_q); } else { list_move_tail(&res->queue, &ioa_cfg->free_res_q); @@ -4589,6 +5064,27 @@ static void ipr_ioafp_inquiry(struct ipr_cmnd *ipr_cmd, u8 flags, u8 page, LEAVE; } +/** + * ipr_inquiry_page_supported - Is the given inquiry page supported + * @page0: inquiry page 0 buffer + * @page: page code. + * + * This function determines if the specified inquiry page is supported. + * + * Return value: + * 1 if page is supported / 0 if not + **/ +static int ipr_inquiry_page_supported(struct ipr_inquiry_page0 *page0, u8 page) +{ + int i; + + for (i = 0; i < min_t(u8, page0->len, IPR_INQUIRY_PAGE0_ENTRIES); i++) + if (page0->page[i] == page) + return 1; + + return 0; +} + /** * ipr_ioafp_page3_inquiry - Send a Page 3 Inquiry to the adapter. * @ipr_cmd: ipr command struct @@ -4600,6 +5096,36 @@ static void ipr_ioafp_inquiry(struct ipr_cmnd *ipr_cmd, u8 flags, u8 page, * IPR_RC_JOB_CONTINUE / IPR_RC_JOB_RETURN **/ static int ipr_ioafp_page3_inquiry(struct ipr_cmnd *ipr_cmd) +{ + struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; + struct ipr_inquiry_page0 *page0 = &ioa_cfg->vpd_cbs->page0_data; + + ENTER; + + if (!ipr_inquiry_page_supported(page0, 1)) + ioa_cfg->cache_state = CACHE_NONE; + + ipr_cmd->job_step = ipr_ioafp_query_ioa_cfg; + + ipr_ioafp_inquiry(ipr_cmd, 1, 3, + ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, page3_data), + sizeof(struct ipr_inquiry_page3)); + + LEAVE; + return IPR_RC_JOB_RETURN; +} + +/** + * ipr_ioafp_page0_inquiry - Send a Page 0 Inquiry to the adapter. + * @ipr_cmd: ipr command struct + * + * This function sends a Page 0 inquiry to the adapter + * to retrieve supported inquiry pages. + * + * Return value: + * IPR_RC_JOB_CONTINUE / IPR_RC_JOB_RETURN + **/ +static int ipr_ioafp_page0_inquiry(struct ipr_cmnd *ipr_cmd) { struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; char type[5]; @@ -4611,11 +5137,11 @@ static int ipr_ioafp_page3_inquiry(struct ipr_cmnd *ipr_cmd) type[4] = '\0'; ioa_cfg->type = simple_strtoul((char *)type, NULL, 16); - ipr_cmd->job_step = ipr_ioafp_query_ioa_cfg; + ipr_cmd->job_step = ipr_ioafp_page3_inquiry; - ipr_ioafp_inquiry(ipr_cmd, 1, 3, - ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, page3_data), - sizeof(struct ipr_inquiry_page3)); + ipr_ioafp_inquiry(ipr_cmd, 1, 0, + ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, page0_data), + sizeof(struct ipr_inquiry_page0)); LEAVE; return IPR_RC_JOB_RETURN; @@ -4635,7 +5161,7 @@ static int ipr_ioafp_std_inquiry(struct ipr_cmnd *ipr_cmd) struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; ENTER; - ipr_cmd->job_step = ipr_ioafp_page3_inquiry; + ipr_cmd->job_step = ipr_ioafp_page0_inquiry; ipr_ioafp_inquiry(ipr_cmd, 0, 0, ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, ioa_vpd), @@ -4793,7 +5319,7 @@ static int ipr_reset_enable_ioa(struct ipr_cmnd *ipr_cmd) } /* Enable destructive diagnostics on IOA */ - writel(IPR_DOORBELL, ioa_cfg->regs.set_uproc_interrupt_reg); + writel(ioa_cfg->doorbell, ioa_cfg->regs.set_uproc_interrupt_reg); writel(IPR_PCII_OPER_INTERRUPTS, ioa_cfg->regs.clr_interrupt_mask_reg); int_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg); @@ -4922,6 +5448,7 @@ static int ipr_reset_restore_cfg_space(struct ipr_cmnd *ipr_cmd) int rc; ENTER; + pci_unblock_user_cfg_access(ioa_cfg->pdev); rc = pci_restore_state(ioa_cfg->pdev); if (rc != PCIBIOS_SUCCESSFUL) { @@ -4976,6 +5503,7 @@ static int ipr_reset_start_bist(struct ipr_cmnd *ipr_cmd) int rc; ENTER; + pci_block_user_cfg_access(ioa_cfg->pdev); rc = pci_write_config_byte(ioa_cfg->pdev, PCI_BIST, PCI_BIST_START); if (rc != PCIBIOS_SUCCESSFUL) { @@ -5123,12 +5651,7 @@ static int ipr_reset_ucode_download(struct ipr_cmnd *ipr_cmd) ipr_cmd->ioarcb.cmd_pkt.cdb[7] = (sglist->buffer_len & 0x00ff00) >> 8; ipr_cmd->ioarcb.cmd_pkt.cdb[8] = sglist->buffer_len & 0x0000ff; - if (ipr_map_ucode_buffer(ipr_cmd, sglist, sglist->buffer_len)) { - dev_err(&ioa_cfg->pdev->dev, - "Failed to map microcode download buffer\n"); - return IPR_RC_JOB_CONTINUE; - } - + ipr_build_ucode_ioadl(ipr_cmd, sglist); ipr_cmd->job_step = ipr_reset_ucode_download_done; ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, @@ -5193,7 +5716,6 @@ static int ipr_reset_shutdown_ioa(struct ipr_cmnd *ipr_cmd) static void ipr_reset_ioa_job(struct ipr_cmnd *ipr_cmd) { u32 rc, ioasc; - unsigned long scratch = ipr_cmd->u.scratch; struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; do { @@ -5209,17 +5731,13 @@ static void ipr_reset_ioa_job(struct ipr_cmnd *ipr_cmd) } if (IPR_IOASC_SENSE_KEY(ioasc)) { - dev_err(&ioa_cfg->pdev->dev, - "0x%02X failed with IOASC: 0x%08X\n", - ipr_cmd->ioarcb.cmd_pkt.cdb[0], ioasc); - - ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE); - list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q); - return; + rc = ipr_cmd->job_step_failed(ipr_cmd); + if (rc == IPR_RC_JOB_RETURN) + return; } ipr_reinit_ipr_cmnd(ipr_cmd); - ipr_cmd->u.scratch = scratch; + ipr_cmd->job_step_failed = ipr_reset_cmd_failed; rc = ipr_cmd->job_step(ipr_cmd); } while(rc == IPR_RC_JOB_CONTINUE); } @@ -5304,6 +5822,109 @@ static void ipr_initiate_ioa_reset(struct ipr_ioa_cfg *ioa_cfg, shutdown_type); } +/** + * ipr_reset_freeze - Hold off all I/O activity + * @ipr_cmd: ipr command struct + * + * Description: If the PCI slot is frozen, hold off all I/O + * activity; then, as soon as the slot is available again, + * initiate an adapter reset. + */ +static int ipr_reset_freeze(struct ipr_cmnd *ipr_cmd) +{ + /* Disallow new interrupts, avoid loop */ + ipr_cmd->ioa_cfg->allow_interrupts = 0; + list_add_tail(&ipr_cmd->queue, &ipr_cmd->ioa_cfg->pending_q); + ipr_cmd->done = ipr_reset_ioa_job; + return IPR_RC_JOB_RETURN; +} + +/** + * ipr_pci_frozen - Called when slot has experienced a PCI bus error. + * @pdev: PCI device struct + * + * Description: This routine is called to tell us that the PCI bus + * is down. Can't do anything here, except put the device driver + * into a holding pattern, waiting for the PCI bus to come back. + */ +static void ipr_pci_frozen(struct pci_dev *pdev) +{ + unsigned long flags = 0; + struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(pdev); + + spin_lock_irqsave(ioa_cfg->host->host_lock, flags); + _ipr_initiate_ioa_reset(ioa_cfg, ipr_reset_freeze, IPR_SHUTDOWN_NONE); + spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags); +} + +/** + * ipr_pci_slot_reset - Called when PCI slot has been reset. + * @pdev: PCI device struct + * + * Description: This routine is called by the pci error recovery + * code after the PCI slot has been reset, just before we + * should resume normal operations. + */ +static pci_ers_result_t ipr_pci_slot_reset(struct pci_dev *pdev) +{ + unsigned long flags = 0; + struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(pdev); + + spin_lock_irqsave(ioa_cfg->host->host_lock, flags); + _ipr_initiate_ioa_reset(ioa_cfg, ipr_reset_restore_cfg_space, + IPR_SHUTDOWN_NONE); + spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags); + return PCI_ERS_RESULT_RECOVERED; +} + +/** + * ipr_pci_perm_failure - Called when PCI slot is dead for good. + * @pdev: PCI device struct + * + * Description: This routine is called when the PCI bus has + * permanently failed. + */ +static void ipr_pci_perm_failure(struct pci_dev *pdev) +{ + unsigned long flags = 0; + struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(pdev); + + spin_lock_irqsave(ioa_cfg->host->host_lock, flags); + if (ioa_cfg->sdt_state == WAIT_FOR_DUMP) + ioa_cfg->sdt_state = ABORT_DUMP; + ioa_cfg->reset_retries = IPR_NUM_RESET_RELOAD_RETRIES; + ioa_cfg->in_ioa_bringdown = 1; + ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE); + spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags); +} + +/** + * ipr_pci_error_detected - Called when a PCI error is detected. + * @pdev: PCI device struct + * @state: PCI channel state + * + * Description: Called when a PCI error is detected. + * + * Return value: + * PCI_ERS_RESULT_NEED_RESET or PCI_ERS_RESULT_DISCONNECT + */ +static pci_ers_result_t ipr_pci_error_detected(struct pci_dev *pdev, + pci_channel_state_t state) +{ + switch (state) { + case pci_channel_io_frozen: + ipr_pci_frozen(pdev); + return PCI_ERS_RESULT_NEED_RESET; + case pci_channel_io_perm_failure: + ipr_pci_perm_failure(pdev); + return PCI_ERS_RESULT_DISCONNECT; + break; + default: + break; + } + return PCI_ERS_RESULT_NEED_RESET; +} + /** * ipr_probe_ioa_part2 - Initializes IOAs found in ipr_probe_ioa(..) * @ioa_cfg: ioa cfg struct @@ -5323,7 +5944,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); @@ -5400,7 +6026,6 @@ static void ipr_free_mem(struct ipr_ioa_cfg *ioa_cfg) } ipr_free_dump(ioa_cfg); - kfree(ioa_cfg->saved_mode_pages); kfree(ioa_cfg->trace); } @@ -5493,15 +6118,12 @@ static int __devinit ipr_alloc_mem(struct ipr_ioa_cfg *ioa_cfg) int i, rc = -ENOMEM; ENTER; - ioa_cfg->res_entries = kmalloc(sizeof(struct ipr_resource_entry) * + ioa_cfg->res_entries = kzalloc(sizeof(struct ipr_resource_entry) * IPR_MAX_PHYSICAL_DEVS, GFP_KERNEL); if (!ioa_cfg->res_entries) goto out; - memset(ioa_cfg->res_entries, 0, - sizeof(struct ipr_resource_entry) * IPR_MAX_PHYSICAL_DEVS); - for (i = 0; i < IPR_MAX_PHYSICAL_DEVS; i++) list_add_tail(&ioa_cfg->res_entries[i].queue, &ioa_cfg->free_res_q); @@ -5542,15 +6164,12 @@ static int __devinit ipr_alloc_mem(struct ipr_ioa_cfg *ioa_cfg) list_add_tail(&ioa_cfg->hostrcb[i]->queue, &ioa_cfg->hostrcb_free_q); } - ioa_cfg->trace = kmalloc(sizeof(struct ipr_trace_entry) * + ioa_cfg->trace = kzalloc(sizeof(struct ipr_trace_entry) * IPR_NUM_TRACE_ENTRIES, GFP_KERNEL); if (!ioa_cfg->trace) goto out_free_hostrcb_dma; - memset(ioa_cfg->trace, 0, - sizeof(struct ipr_trace_entry) * IPR_NUM_TRACE_ENTRIES); - rc = 0; out: LEAVE; @@ -5618,6 +6237,9 @@ static void __devinit ipr_init_ioa_cfg(struct ipr_ioa_cfg *ioa_cfg, ioa_cfg->host = host; ioa_cfg->pdev = pdev; ioa_cfg->log_level = ipr_log_level; + ioa_cfg->doorbell = IPR_DOORBELL; + if (!ipr_auto_create) + ioa_cfg->doorbell |= IPR_RUNTIME_RESET; sprintf(ioa_cfg->eye_catcher, IPR_EYECATCHER); sprintf(ioa_cfg->trace_start, IPR_TRACE_START_LABEL); sprintf(ioa_cfg->ipr_free_label, IPR_FREEQ_LABEL); @@ -5636,6 +6258,10 @@ static void __devinit ipr_init_ioa_cfg(struct ipr_ioa_cfg *ioa_cfg, INIT_WORK(&ioa_cfg->work_q, ipr_worker_thread, ioa_cfg); init_waitqueue_head(&ioa_cfg->reset_wait_q); ioa_cfg->sdt_state = INACTIVE; + if (ipr_enable_cache) + ioa_cfg->cache_state = CACHE_ENABLED; + else + ioa_cfg->cache_state = CACHE_DISABLED; ipr_initialize_bus_attr(ioa_cfg); @@ -5699,6 +6325,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; @@ -5791,8 +6418,17 @@ 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); + rc = request_irq(pdev->irq, ipr_isr, IRQF_SHARED, IPR_NAME, ioa_cfg); if (rc) { dev_err(&pdev->dev, "Couldn't register IRQ %d! rc=%d\n", @@ -5886,6 +6522,7 @@ static void __ipr_remove(struct pci_dev *pdev) spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags); wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); + flush_scheduled_work(); spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags); spin_lock(&ipr_driver_lock); @@ -5916,8 +6553,6 @@ static void ipr_remove(struct pci_dev *pdev) ENTER; - ioa_cfg->allow_cmds = 0; - flush_scheduled_work(); ipr_remove_trace_file(&ioa_cfg->host->shost_classdev.kobj, &ipr_trace_attr); ipr_remove_dump_file(&ioa_cfg->host->shost_classdev.kobj, @@ -5985,13 +6620,14 @@ static int __devinit ipr_probe(struct pci_dev *pdev, ipr_scan_vsets(ioa_cfg); scsi_add_device(ioa_cfg->host, IPR_IOA_BUS, IPR_IOA_TARGET, IPR_IOA_LUN); ioa_cfg->allow_ml_add_del = 1; + ioa_cfg->host->max_channel = IPR_VSET_BUS; schedule_work(&ioa_cfg->work_q); return 0; } /** * ipr_shutdown - Shutdown handler. - * @dev: device struct + * @pdev: pci device struct * * This function is invoked upon system shutdown/reboot. It will issue * an adapter shutdown to the adapter to flush the write cache. @@ -5999,9 +6635,9 @@ static int __devinit ipr_probe(struct pci_dev *pdev, * Return value: * none **/ -static void ipr_shutdown(struct device *dev) +static void ipr_shutdown(struct pci_dev *pdev) { - struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(to_pci_dev(dev)); + struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(pdev); unsigned long lock_flags = 0; spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); @@ -6032,24 +6668,46 @@ static struct pci_device_id ipr_pci_table[] __devinitdata = { { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CITRINE, PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_571A, 0, 0, (kernel_ulong_t)&ipr_chip_cfg[0] }, + { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CITRINE, + PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_575B, + 0, 0, (kernel_ulong_t)&ipr_chip_cfg[0] }, + { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_OBSIDIAN, + PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_572A, + 0, 0, (kernel_ulong_t)&ipr_chip_cfg[0] }, + { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_OBSIDIAN, + PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_572B, + 0, 0, (kernel_ulong_t)&ipr_chip_cfg[0] }, + { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN, + PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_572A, + 0, 0, (kernel_ulong_t)&ipr_chip_cfg[0] }, + { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN, + PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_572B, + 0, 0, (kernel_ulong_t)&ipr_chip_cfg[0] }, { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_SNIPE, PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_2780, 0, 0, (kernel_ulong_t)&ipr_chip_cfg[1] }, { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_SCAMP, PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_571E, 0, 0, (kernel_ulong_t)&ipr_chip_cfg[1] }, + { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_SCAMP, + PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_571F, + 0, 0, (kernel_ulong_t)&ipr_chip_cfg[1] }, { } }; MODULE_DEVICE_TABLE(pci, ipr_pci_table); +static struct pci_error_handlers ipr_err_handler = { + .error_detected = ipr_pci_error_detected, + .slot_reset = ipr_pci_slot_reset, +}; + static struct pci_driver ipr_driver = { .name = IPR_NAME, .id_table = ipr_pci_table, .probe = ipr_probe, .remove = ipr_remove, - .driver = { - .shutdown = ipr_shutdown, - }, + .shutdown = ipr_shutdown, + .err_handler = &ipr_err_handler, }; /** diff --git a/drivers/scsi/ips.c b/drivers/scsi/ips.c index a4c0b04cf..4d2c29c56 100644 --- a/drivers/scsi/ips.c +++ b/drivers/scsi/ips.c @@ -196,7 +196,6 @@ #include #include -#include #include #include @@ -556,7 +555,7 @@ ips_setup(char *ips_str) * We now have key/value pairs. * Update the variables */ - for (i = 0; i < (sizeof (options) / sizeof (options[0])); i++) { + for (i = 0; i < ARRAY_SIZE(options); i++) { if (strnicmp (key, options[i].option_name, strlen(options[i].option_name)) == 0) { @@ -4364,7 +4363,7 @@ ips_rdcap(ips_ha_t * ha, ips_scb_t * scb) METHOD_TRACE("ips_rdcap", 1); - if (scb->scsi_cmd->bufflen < 8) + if (scb->scsi_cmd->request_bufflen < 8) return (0); cap.lba = @@ -5015,7 +5014,7 @@ ips_init_copperhead(ips_ha_t * ha) break; /* Delay for 1 Second */ - msleep(IPS_ONE_SEC); + MDELAY(IPS_ONE_SEC); } if (j >= 45) @@ -5041,7 +5040,7 @@ ips_init_copperhead(ips_ha_t * ha) break; /* Delay for 1 Second */ - msleep(IPS_ONE_SEC); + MDELAY(IPS_ONE_SEC); } if (j >= 240) @@ -5059,7 +5058,7 @@ ips_init_copperhead(ips_ha_t * ha) break; /* Delay for 1 Second */ - msleep(IPS_ONE_SEC); + MDELAY(IPS_ONE_SEC); } if (i >= 240) @@ -5109,7 +5108,7 @@ ips_init_copperhead_memio(ips_ha_t * ha) break; /* Delay for 1 Second */ - msleep(IPS_ONE_SEC); + MDELAY(IPS_ONE_SEC); } if (j >= 45) @@ -5135,7 +5134,7 @@ ips_init_copperhead_memio(ips_ha_t * ha) break; /* Delay for 1 Second */ - msleep(IPS_ONE_SEC); + MDELAY(IPS_ONE_SEC); } if (j >= 240) @@ -5153,7 +5152,7 @@ ips_init_copperhead_memio(ips_ha_t * ha) break; /* Delay for 1 Second */ - msleep(IPS_ONE_SEC); + MDELAY(IPS_ONE_SEC); } if (i >= 240) @@ -5205,7 +5204,7 @@ ips_init_morpheus(ips_ha_t * ha) break; /* Delay for 1 Second */ - msleep(IPS_ONE_SEC); + MDELAY(IPS_ONE_SEC); } if (i >= 45) { @@ -5231,7 +5230,7 @@ ips_init_morpheus(ips_ha_t * ha) if (Post != 0x4F00) break; /* Delay for 1 Second */ - msleep(IPS_ONE_SEC); + MDELAY(IPS_ONE_SEC); } if (i >= 120) { @@ -5261,7 +5260,7 @@ ips_init_morpheus(ips_ha_t * ha) break; /* Delay for 1 Second */ - msleep(IPS_ONE_SEC); + MDELAY(IPS_ONE_SEC); } if (i >= 240) { @@ -5321,12 +5320,12 @@ ips_reset_copperhead(ips_ha_t * ha) outb(IPS_BIT_RST, ha->io_addr + IPS_REG_SCPR); /* Delay for 1 Second */ - msleep(IPS_ONE_SEC); + MDELAY(IPS_ONE_SEC); outb(0, ha->io_addr + IPS_REG_SCPR); /* Delay for 1 Second */ - msleep(IPS_ONE_SEC); + MDELAY(IPS_ONE_SEC); if ((*ha->func.init) (ha)) break; @@ -5366,12 +5365,12 @@ ips_reset_copperhead_memio(ips_ha_t * ha) writeb(IPS_BIT_RST, ha->mem_ptr + IPS_REG_SCPR); /* Delay for 1 Second */ - msleep(IPS_ONE_SEC); + MDELAY(IPS_ONE_SEC); writeb(0, ha->mem_ptr + IPS_REG_SCPR); /* Delay for 1 Second */ - msleep(IPS_ONE_SEC); + MDELAY(IPS_ONE_SEC); if ((*ha->func.init) (ha)) break; @@ -5412,7 +5411,7 @@ ips_reset_morpheus(ips_ha_t * ha) writel(0x80000000, ha->mem_ptr + IPS_REG_I960_IDR); /* Delay for 5 Seconds */ - msleep(5 * IPS_ONE_SEC); + MDELAY(5 * IPS_ONE_SEC); /* Do a PCI config read to wait for adapter */ pci_read_config_byte(ha->pcidev, 4, &junk); @@ -6438,7 +6437,7 @@ ips_erase_bios(ips_ha_t * ha) /* VPP failure */ return (1); - /* check for succesful flash */ + /* check for successful flash */ if (status & 0x30) /* sequence error */ return (1); @@ -6550,7 +6549,7 @@ ips_erase_bios_memio(ips_ha_t * ha) /* VPP failure */ return (1); - /* check for succesful flash */ + /* check for successful flash */ if (status & 0x30) /* sequence error */ return (1); @@ -7008,7 +7007,7 @@ ips_register_scsi(int index) memcpy(ha, oldha, sizeof (ips_ha_t)); free_irq(oldha->irq, oldha); /* Install the interrupt handler with the new ha */ - if (request_irq(ha->irq, do_ipsintr, SA_SHIRQ, ips_name, ha)) { + if (request_irq(ha->irq, do_ipsintr, IRQF_SHARED, ips_name, ha)) { IPS_PRINTK(KERN_WARNING, ha->pcidev, "Unable to install interrupt handler\n"); scsi_host_put(sh); @@ -7420,7 +7419,7 @@ ips_init_phase2(int index) } /* Install the interrupt handler */ - if (request_irq(ha->irq, do_ipsintr, SA_SHIRQ, ips_name, ha)) { + if (request_irq(ha->irq, do_ipsintr, IRQF_SHARED, ips_name, ha)) { IPS_PRINTK(KERN_WARNING, ha->pcidev, "Unable to install interrupt handler\n"); return ips_abort_init(ha, index); diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index 2068b6682..058f094f9 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c @@ -3,7 +3,8 @@ * * Copyright (C) 2004 Dmitry Yusupov * Copyright (C) 2004 Alex Aizman - * Copyright (C) 2005 Mike Christie + * Copyright (C) 2005 - 2006 Mike Christie + * Copyright (C) 2006 Red Hat, Inc. All rights reserved. * maintained by open-iscsi@googlegroups.com * * This program is free software; you can redistribute it and/or modify @@ -36,10 +37,6 @@ #include #include #include -#include -#include -#include -#include #include #include #include @@ -50,23 +47,15 @@ MODULE_AUTHOR("Dmitry Yusupov , " "Alex Aizman "); MODULE_DESCRIPTION("iSCSI/TCP data-path"); MODULE_LICENSE("GPL"); -MODULE_VERSION("0:4.445"); /* #define DEBUG_TCP */ -/* #define DEBUG_SCSI */ #define DEBUG_ASSERT #ifdef DEBUG_TCP -#define debug_tcp(fmt...) printk(KERN_DEBUG "tcp: " fmt) +#define debug_tcp(fmt...) printk(KERN_INFO "tcp: " fmt) #else #define debug_tcp(fmt...) #endif -#ifdef DEBUG_SCSI -#define debug_scsi(fmt...) printk(KERN_DEBUG "scsi: " fmt) -#else -#define debug_scsi(fmt...) -#endif - #ifndef DEBUG_ASSERT #ifdef BUG_ON #undef BUG_ON @@ -74,22 +63,9 @@ MODULE_VERSION("0:4.445"); #define BUG_ON(expr) #endif -#define INVALID_SN_DELTA 0xffff - static unsigned int iscsi_max_lun = 512; module_param_named(max_lun, iscsi_max_lun, uint, S_IRUGO); -/* global data */ -static kmem_cache_t *taskcache; - -static inline void -iscsi_buf_init_virt(struct iscsi_buf *ibuf, char *vbuf, int size) -{ - sg_init_one(&ibuf->sg, (u8 *)vbuf, size); - ibuf->sent = 0; - ibuf->use_sendmsg = 0; -} - static inline void iscsi_buf_init_iov(struct iscsi_buf *ibuf, char *vbuf, int size) { @@ -130,68 +106,39 @@ static inline void iscsi_hdr_digest(struct iscsi_conn *conn, struct iscsi_buf *buf, u8* crc) { - crypto_digest_digest(conn->tx_tfm, &buf->sg, 1, crc); - buf->sg.length += sizeof(uint32_t); -} + struct iscsi_tcp_conn *tcp_conn = conn->dd_data; -static void -iscsi_conn_failure(struct iscsi_conn *conn, enum iscsi_err err) -{ - struct iscsi_session *session = conn->session; - unsigned long flags; - - spin_lock_irqsave(&session->lock, flags); - if (session->conn_cnt == 1 || session->leadconn == conn) - session->state = ISCSI_STATE_FAILED; - spin_unlock_irqrestore(&session->lock, flags); - set_bit(SUSPEND_BIT, &conn->suspend_tx); - set_bit(SUSPEND_BIT, &conn->suspend_rx); - iscsi_conn_error(conn->cls_conn, err); + crypto_digest_digest(tcp_conn->tx_tfm, &buf->sg, 1, crc); + buf->sg.length += sizeof(uint32_t); } static inline int -iscsi_check_assign_cmdsn(struct iscsi_session *session, struct iscsi_nopin *hdr) +iscsi_hdr_extract(struct iscsi_tcp_conn *tcp_conn) { - uint32_t max_cmdsn = be32_to_cpu(hdr->max_cmdsn); - uint32_t exp_cmdsn = be32_to_cpu(hdr->exp_cmdsn); - - if (max_cmdsn < exp_cmdsn -1 && - max_cmdsn > exp_cmdsn - INVALID_SN_DELTA) - return ISCSI_ERR_MAX_CMDSN; - if (max_cmdsn > session->max_cmdsn || - max_cmdsn < session->max_cmdsn - INVALID_SN_DELTA) - session->max_cmdsn = max_cmdsn; - if (exp_cmdsn > session->exp_cmdsn || - exp_cmdsn < session->exp_cmdsn - INVALID_SN_DELTA) - session->exp_cmdsn = exp_cmdsn; + struct sk_buff *skb = tcp_conn->in.skb; - return 0; -} - -static inline int -iscsi_hdr_extract(struct iscsi_conn *conn) -{ - struct sk_buff *skb = conn->in.skb; + tcp_conn->in.zero_copy_hdr = 0; - if (conn->in.copy >= conn->hdr_size && - conn->in_progress == IN_PROGRESS_WAIT_HEADER) { + if (tcp_conn->in.copy >= tcp_conn->hdr_size && + tcp_conn->in_progress == IN_PROGRESS_WAIT_HEADER) { /* * Zero-copy PDU Header: using connection context * to store header pointer. */ if (skb_shinfo(skb)->frag_list == NULL && - !skb_shinfo(skb)->nr_frags) - conn->in.hdr = (struct iscsi_hdr *) - ((char*)skb->data + conn->in.offset); - else { + !skb_shinfo(skb)->nr_frags) { + tcp_conn->in.hdr = (struct iscsi_hdr *) + ((char*)skb->data + tcp_conn->in.offset); + tcp_conn->in.zero_copy_hdr = 1; + } else { /* ignoring return code since we checked * in.copy before */ - skb_copy_bits(skb, conn->in.offset, - &conn->hdr, conn->hdr_size); - conn->in.hdr = &conn->hdr; + skb_copy_bits(skb, tcp_conn->in.offset, + &tcp_conn->hdr, tcp_conn->hdr_size); + tcp_conn->in.hdr = &tcp_conn->hdr; } - conn->in.offset += conn->hdr_size; - conn->in.copy -= conn->hdr_size; + tcp_conn->in.offset += tcp_conn->hdr_size; + tcp_conn->in.copy -= tcp_conn->hdr_size; } else { int hdr_remains; int copylen; @@ -201,118 +148,59 @@ iscsi_hdr_extract(struct iscsi_conn *conn) * copying it... This'll happen quite rarely. */ - if (conn->in_progress == IN_PROGRESS_WAIT_HEADER) - conn->in.hdr_offset = 0; + if (tcp_conn->in_progress == IN_PROGRESS_WAIT_HEADER) + tcp_conn->in.hdr_offset = 0; - hdr_remains = conn->hdr_size - conn->in.hdr_offset; + hdr_remains = tcp_conn->hdr_size - tcp_conn->in.hdr_offset; BUG_ON(hdr_remains <= 0); - copylen = min(conn->in.copy, hdr_remains); - skb_copy_bits(skb, conn->in.offset, - (char*)&conn->hdr + conn->in.hdr_offset, copylen); + copylen = min(tcp_conn->in.copy, hdr_remains); + skb_copy_bits(skb, tcp_conn->in.offset, + (char*)&tcp_conn->hdr + tcp_conn->in.hdr_offset, + copylen); debug_tcp("PDU gather offset %d bytes %d in.offset %d " - "in.copy %d\n", conn->in.hdr_offset, copylen, - conn->in.offset, conn->in.copy); + "in.copy %d\n", tcp_conn->in.hdr_offset, copylen, + tcp_conn->in.offset, tcp_conn->in.copy); - conn->in.offset += copylen; - conn->in.copy -= copylen; + tcp_conn->in.offset += copylen; + tcp_conn->in.copy -= copylen; if (copylen < hdr_remains) { - conn->in_progress = IN_PROGRESS_HEADER_GATHER; - conn->in.hdr_offset += copylen; + tcp_conn->in_progress = IN_PROGRESS_HEADER_GATHER; + tcp_conn->in.hdr_offset += copylen; return -EAGAIN; } - conn->in.hdr = &conn->hdr; - conn->discontiguous_hdr_cnt++; - conn->in_progress = IN_PROGRESS_WAIT_HEADER; + tcp_conn->in.hdr = &tcp_conn->hdr; + tcp_conn->discontiguous_hdr_cnt++; + tcp_conn->in_progress = IN_PROGRESS_WAIT_HEADER; } return 0; } -static inline void -iscsi_ctask_cleanup(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) -{ - struct scsi_cmnd *sc = ctask->sc; - struct iscsi_session *session = conn->session; - - spin_lock(&session->lock); - if (unlikely(!sc)) { - spin_unlock(&session->lock); - return; - } - if (sc->sc_data_direction == DMA_TO_DEVICE) { - struct iscsi_data_task *dtask, *n; - /* WRITE: cleanup Data-Out's if any */ - list_for_each_entry_safe(dtask, n, &ctask->dataqueue, item) { - list_del(&dtask->item); - mempool_free(dtask, ctask->datapool); - } - } - ctask->xmstate = XMSTATE_IDLE; - ctask->r2t = NULL; - ctask->sc = NULL; - __kfifo_put(session->cmdpool.queue, (void*)&ctask, sizeof(void*)); - spin_unlock(&session->lock); -} - -/** - * iscsi_cmd_rsp - SCSI Command Response processing - * @conn: iscsi connection - * @ctask: scsi command task - **/ -static int -iscsi_cmd_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) +/* + * must be called with session lock + */ +static void +iscsi_tcp_cleanup_ctask(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) { - int rc; - struct iscsi_cmd_rsp *rhdr = (struct iscsi_cmd_rsp *)conn->in.hdr; - struct iscsi_session *session = conn->session; - struct scsi_cmnd *sc = ctask->sc; - - rc = iscsi_check_assign_cmdsn(session, (struct iscsi_nopin*)rhdr); - if (rc) { - sc->result = (DID_ERROR << 16); - goto out; - } - - conn->exp_statsn = be32_to_cpu(rhdr->statsn) + 1; - - sc->result = (DID_OK << 16) | rhdr->cmd_status; - - if (rhdr->response != ISCSI_STATUS_CMD_COMPLETED) { - sc->result = (DID_ERROR << 16); - goto out; - } - - if (rhdr->cmd_status == SAM_STAT_CHECK_CONDITION && conn->senselen) { - int sensecopy = min(conn->senselen, SCSI_SENSE_BUFFERSIZE); + struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; + struct iscsi_r2t_info *r2t; + struct scsi_cmnd *sc; - memcpy(sc->sense_buffer, conn->data + 2, sensecopy); - debug_scsi("copied %d bytes of sense\n", sensecopy); + /* flush ctask's r2t queues */ + while (__kfifo_get(tcp_ctask->r2tqueue, (void*)&r2t, sizeof(void*))) { + __kfifo_put(tcp_ctask->r2tpool.queue, (void*)&r2t, + sizeof(void*)); + debug_scsi("iscsi_tcp_cleanup_ctask pending r2t dropped\n"); } - if (sc->sc_data_direction == DMA_TO_DEVICE) - goto out; - - if (rhdr->flags & ISCSI_FLAG_CMD_UNDERFLOW) { - int res_count = be32_to_cpu(rhdr->residual_count); + sc = ctask->sc; + if (unlikely(!sc)) + return; - if (res_count > 0 && res_count <= sc->request_bufflen) - sc->resid = res_count; - else - sc->result = (DID_BAD_TARGET << 16) | rhdr->cmd_status; - } else if (rhdr->flags & ISCSI_FLAG_CMD_BIDI_UNDERFLOW) - sc->result = (DID_BAD_TARGET << 16) | rhdr->cmd_status; - else if (rhdr->flags & ISCSI_FLAG_CMD_OVERFLOW) - sc->resid = be32_to_cpu(rhdr->residual_count); - -out: - debug_scsi("done [sc %lx res %d itt 0x%x]\n", - (long)sc, sc->result, ctask->itt); - conn->scsirsp_pdus_cnt++; - iscsi_ctask_cleanup(conn, ctask); - sc->scsi_done(sc); - return rc; + tcp_ctask->xmstate = XMSTATE_IDLE; + tcp_ctask->r2t = NULL; } /** @@ -324,7 +212,9 @@ static int iscsi_data_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) { int rc; - struct iscsi_data_rsp *rhdr = (struct iscsi_data_rsp *)conn->in.hdr; + struct iscsi_tcp_conn *tcp_conn = conn->dd_data; + struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; + struct iscsi_data_rsp *rhdr = (struct iscsi_data_rsp *)tcp_conn->in.hdr; struct iscsi_session *session = conn->session; int datasn = be32_to_cpu(rhdr->datasn); @@ -334,9 +224,9 @@ iscsi_data_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) /* * setup Data-In byte counter (gets decremented..) */ - ctask->data_count = conn->in.datalen; + ctask->data_count = tcp_conn->in.datalen; - if (conn->in.datalen == 0) + if (tcp_conn->in.datalen == 0) return 0; if (ctask->datasn != datasn) @@ -344,8 +234,8 @@ iscsi_data_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) ctask->datasn++; - ctask->data_offset = be32_to_cpu(rhdr->offset); - if (ctask->data_offset + conn->in.datalen > ctask->total_length) + tcp_ctask->data_offset = be32_to_cpu(rhdr->offset); + if (tcp_ctask->data_offset + tcp_conn->in.datalen > ctask->total_length) return ISCSI_ERR_DATA_OFFSET; if (rhdr->flags & ISCSI_FLAG_DATA_STATUS) { @@ -390,19 +280,17 @@ iscsi_solicit_data_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask, struct iscsi_r2t_info *r2t) { struct iscsi_data *hdr; - struct iscsi_data_task *dtask; struct scsi_cmnd *sc = ctask->sc; + struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; - dtask = mempool_alloc(ctask->datapool, GFP_ATOMIC); - BUG_ON(!dtask); - hdr = &dtask->hdr; + hdr = &r2t->dtask.hdr; memset(hdr, 0, sizeof(struct iscsi_data)); hdr->ttt = r2t->ttt; hdr->datasn = cpu_to_be32(r2t->solicit_datasn); r2t->solicit_datasn++; hdr->opcode = ISCSI_OP_SCSI_DATA_OUT; - memcpy(hdr->lun, ctask->hdr.lun, sizeof(hdr->lun)); - hdr->itt = ctask->hdr.itt; + memcpy(hdr->lun, ctask->hdr->lun, sizeof(hdr->lun)); + hdr->itt = ctask->hdr->itt; hdr->exp_statsn = r2t->exp_statsn; hdr->offset = cpu_to_be32(r2t->data_offset); if (r2t->data_length > conn->max_xmit_dlength) { @@ -418,11 +306,9 @@ iscsi_solicit_data_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask, r2t->sent = 0; - iscsi_buf_init_virt(&r2t->headbuf, (char*)hdr, + iscsi_buf_init_iov(&r2t->headbuf, (char*)hdr, sizeof(struct iscsi_hdr)); - r2t->dtask = dtask; - if (sc->use_sg) { int i, sg_count = 0; struct scatterlist *sg = sc->request_buffer; @@ -451,11 +337,9 @@ iscsi_solicit_data_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask, } BUG_ON(r2t->sg == NULL); } else - iscsi_buf_init_iov(&ctask->sendbuf, + iscsi_buf_init_iov(&tcp_ctask->sendbuf, (char*)sc->request_buffer + r2t->data_offset, r2t->data_count); - - list_add(&dtask->item, &ctask->dataqueue); } /** @@ -468,17 +352,16 @@ iscsi_r2t_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) { struct iscsi_r2t_info *r2t; struct iscsi_session *session = conn->session; - struct iscsi_r2t_rsp *rhdr = (struct iscsi_r2t_rsp *)conn->in.hdr; + struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; + struct iscsi_tcp_conn *tcp_conn = conn->dd_data; + struct iscsi_r2t_rsp *rhdr = (struct iscsi_r2t_rsp *)tcp_conn->in.hdr; int r2tsn = be32_to_cpu(rhdr->r2tsn); int rc; - if (conn->in.ahslen) - return ISCSI_ERR_AHSLEN; - - if (conn->in.datalen) + if (tcp_conn->in.datalen) return ISCSI_ERR_DATALEN; - if (ctask->exp_r2tsn && ctask->exp_r2tsn != r2tsn) + if (tcp_ctask->exp_r2tsn && tcp_ctask->exp_r2tsn != r2tsn) return ISCSI_ERR_R2TSN; rc = iscsi_check_assign_cmdsn(session, (struct iscsi_nopin*)rhdr); @@ -496,7 +379,8 @@ iscsi_r2t_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) spin_unlock(&session->lock); return 0; } - rc = __kfifo_get(ctask->r2tpool.queue, (void*)&r2t, sizeof(void*)); + + rc = __kfifo_get(tcp_ctask->r2tpool.queue, (void*)&r2t, sizeof(void*)); BUG_ON(!rc); r2t->exp_statsn = rhdr->statsn; @@ -518,10 +402,10 @@ iscsi_r2t_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) iscsi_solicit_data_init(conn, ctask, r2t); - ctask->exp_r2tsn = r2tsn + 1; - ctask->xmstate |= XMSTATE_SOL_HDR; - __kfifo_put(ctask->r2tqueue, (void*)&r2t, sizeof(void*)); - __kfifo_put(conn->writequeue, (void*)&ctask, sizeof(void*)); + tcp_ctask->exp_r2tsn = r2tsn + 1; + tcp_ctask->xmstate |= XMSTATE_SOL_HDR; + __kfifo_put(tcp_ctask->r2tqueue, (void*)&r2t, sizeof(void*)); + list_move_tail(&ctask->running, &conn->xmitqueue); scsi_queue_work(session->host, &conn->xmitwork); conn->r2t_pdus_cnt++; @@ -531,258 +415,153 @@ iscsi_r2t_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) } static int -iscsi_hdr_recv(struct iscsi_conn *conn) +iscsi_tcp_hdr_recv(struct iscsi_conn *conn) { - int rc = 0; + int rc = 0, opcode, ahslen; struct iscsi_hdr *hdr; - struct iscsi_cmd_task *ctask; struct iscsi_session *session = conn->session; - uint32_t cdgst, rdgst = 0; + struct iscsi_tcp_conn *tcp_conn = conn->dd_data; + uint32_t cdgst, rdgst = 0, itt; - hdr = conn->in.hdr; + hdr = tcp_conn->in.hdr; /* verify PDU length */ - conn->in.datalen = ntoh24(hdr->dlength); - if (conn->in.datalen > conn->max_recv_dlength) { + tcp_conn->in.datalen = ntoh24(hdr->dlength); + if (tcp_conn->in.datalen > conn->max_recv_dlength) { printk(KERN_ERR "iscsi_tcp: datalen %d > %d\n", - conn->in.datalen, conn->max_recv_dlength); + tcp_conn->in.datalen, conn->max_recv_dlength); return ISCSI_ERR_DATALEN; } - conn->data_copied = 0; + tcp_conn->data_copied = 0; /* read AHS */ - conn->in.ahslen = hdr->hlength * 4; - conn->in.offset += conn->in.ahslen; - conn->in.copy -= conn->in.ahslen; - if (conn->in.copy < 0) { + ahslen = hdr->hlength << 2; + tcp_conn->in.offset += ahslen; + tcp_conn->in.copy -= ahslen; + if (tcp_conn->in.copy < 0) { printk(KERN_ERR "iscsi_tcp: can't handle AHS with length " - "%d bytes\n", conn->in.ahslen); + "%d bytes\n", ahslen); return ISCSI_ERR_AHSLEN; } /* calculate read padding */ - conn->in.padding = conn->in.datalen & (ISCSI_PAD_LEN-1); - if (conn->in.padding) { - conn->in.padding = ISCSI_PAD_LEN - conn->in.padding; - debug_scsi("read padding %d bytes\n", conn->in.padding); + tcp_conn->in.padding = tcp_conn->in.datalen & (ISCSI_PAD_LEN-1); + if (tcp_conn->in.padding) { + tcp_conn->in.padding = ISCSI_PAD_LEN - tcp_conn->in.padding; + debug_scsi("read padding %d bytes\n", tcp_conn->in.padding); } if (conn->hdrdgst_en) { struct scatterlist sg; sg_init_one(&sg, (u8 *)hdr, - sizeof(struct iscsi_hdr) + conn->in.ahslen); - crypto_digest_digest(conn->rx_tfm, &sg, 1, (u8 *)&cdgst); + sizeof(struct iscsi_hdr) + ahslen); + crypto_digest_digest(tcp_conn->rx_tfm, &sg, 1, (u8 *)&cdgst); rdgst = *(uint32_t*)((char*)hdr + sizeof(struct iscsi_hdr) + - conn->in.ahslen); + 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); + printk(KERN_ERR "iscsi_tcp: hdrdgst error " + "recv 0x%x calc 0x%x\n", rdgst, cdgst); return ISCSI_ERR_HDR_DGST; } } - /* save opcode for later */ - conn->in.opcode = hdr->opcode & ISCSI_OPCODE_MASK; - + opcode = hdr->opcode & ISCSI_OPCODE_MASK; /* verify itt (itt encoding: age+cid+itt) */ - if (hdr->itt != cpu_to_be32(ISCSI_RESERVED_TAG)) { - if ((hdr->itt & AGE_MASK) != - (session->age << AGE_SHIFT)) { - printk(KERN_ERR "iscsi_tcp: received itt %x expected " - "session age (%x)\n", hdr->itt, - session->age & AGE_MASK); - return ISCSI_ERR_BAD_ITT; - } - - if ((hdr->itt & CID_MASK) != (conn->id << CID_SHIFT)) { - printk(KERN_ERR "iscsi_tcp: received itt %x, expected " - "CID (%x)\n", hdr->itt, conn->id); - return ISCSI_ERR_BAD_ITT; - } - conn->in.itt = hdr->itt & ITT_MASK; - } else - conn->in.itt = hdr->itt; + rc = iscsi_verify_itt(conn, hdr, &itt); + if (rc == ISCSI_ERR_NO_SCSI_CMD) { + tcp_conn->in.datalen = 0; /* force drop */ + return 0; + } else if (rc) + return rc; debug_tcp("opcode 0x%x offset %d copy %d ahslen %d datalen %d\n", - hdr->opcode, conn->in.offset, conn->in.copy, - conn->in.ahslen, conn->in.datalen); - - if (conn->in.itt < session->cmds_max) { - ctask = (struct iscsi_cmd_task *)session->cmds[conn->in.itt]; - - if (!ctask->sc) { - printk(KERN_INFO "iscsi_tcp: dropping ctask with " - "itt 0x%x\n", ctask->itt); - conn->in.datalen = 0; /* force drop */ - return 0; - } + opcode, tcp_conn->in.offset, tcp_conn->in.copy, + ahslen, tcp_conn->in.datalen); - if (ctask->sc->SCp.phase != session->age) { - printk(KERN_ERR "iscsi_tcp: ctask's session age %d, " - "expected %d\n", ctask->sc->SCp.phase, - session->age); - return ISCSI_ERR_SESSION_FAILED; - } - - conn->in.ctask = ctask; - - debug_scsi("rsp [op 0x%x cid %d sc %lx itt 0x%x len %d]\n", - hdr->opcode, conn->id, (long)ctask->sc, - ctask->itt, conn->in.datalen); - - switch(conn->in.opcode) { - case ISCSI_OP_SCSI_CMD_RSP: - BUG_ON((void*)ctask != ctask->sc->SCp.ptr); - if (!conn->in.datalen) - rc = iscsi_cmd_rsp(conn, ctask); - else - /* - * got sense or response data; copying PDU - * Header to the connection's header - * placeholder - */ - memcpy(&conn->hdr, hdr, - sizeof(struct iscsi_hdr)); - break; - case ISCSI_OP_SCSI_DATA_IN: - BUG_ON((void*)ctask != ctask->sc->SCp.ptr); - /* save flags for non-exceptional status */ - conn->in.flags = hdr->flags; - /* save cmd_status for sense data */ - conn->in.cmd_status = - ((struct iscsi_data_rsp*)hdr)->cmd_status; - rc = iscsi_data_rsp(conn, ctask); - break; - case ISCSI_OP_R2T: - BUG_ON((void*)ctask != ctask->sc->SCp.ptr); - if (ctask->sc->sc_data_direction == DMA_TO_DEVICE) - rc = iscsi_r2t_rsp(conn, ctask); - else - rc = ISCSI_ERR_PROTO; - break; - default: - rc = ISCSI_ERR_BAD_OPCODE; + switch(opcode) { + case ISCSI_OP_SCSI_DATA_IN: + tcp_conn->in.ctask = session->cmds[itt]; + rc = iscsi_data_rsp(conn, tcp_conn->in.ctask); + if (rc) + return rc; + /* fall through */ + case ISCSI_OP_SCSI_CMD_RSP: + tcp_conn->in.ctask = session->cmds[itt]; + if (tcp_conn->in.datalen) + goto copy_hdr; + + spin_lock(&session->lock); + iscsi_tcp_cleanup_ctask(conn, tcp_conn->in.ctask); + rc = __iscsi_complete_pdu(conn, hdr, NULL, 0); + spin_unlock(&session->lock); + break; + case ISCSI_OP_R2T: + tcp_conn->in.ctask = session->cmds[itt]; + if (ahslen) + rc = ISCSI_ERR_AHSLEN; + else if (tcp_conn->in.ctask->sc->sc_data_direction == + DMA_TO_DEVICE) + rc = iscsi_r2t_rsp(conn, tcp_conn->in.ctask); + else + rc = ISCSI_ERR_PROTO; + break; + case ISCSI_OP_LOGIN_RSP: + case ISCSI_OP_TEXT_RSP: + case ISCSI_OP_REJECT: + case ISCSI_OP_ASYNC_EVENT: + /* + * It is possible that we could get a PDU with a buffer larger + * than 8K, but there are no targets that currently do this. + * For now we fail until we find a vendor that needs it + */ + if (DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH < + tcp_conn->in.datalen) { + printk(KERN_ERR "iscsi_tcp: received buffer of len %u " + "but conn buffer is only %u (opcode %0x)\n", + tcp_conn->in.datalen, + DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH, opcode); + rc = ISCSI_ERR_PROTO; break; } - } else if (conn->in.itt >= ISCSI_MGMT_ITT_OFFSET && - conn->in.itt < ISCSI_MGMT_ITT_OFFSET + - session->mgmtpool_max) { - struct iscsi_mgmt_task *mtask = (struct iscsi_mgmt_task *) - session->mgmt_cmds[conn->in.itt - - ISCSI_MGMT_ITT_OFFSET]; - - debug_scsi("immrsp [op 0x%x cid %d itt 0x%x len %d]\n", - conn->in.opcode, conn->id, mtask->itt, - conn->in.datalen); - - switch(conn->in.opcode) { - case ISCSI_OP_LOGIN_RSP: - case ISCSI_OP_TEXT_RSP: - case ISCSI_OP_LOGOUT_RSP: - rc = iscsi_check_assign_cmdsn(session, - (struct iscsi_nopin*)hdr); - if (rc) - break; - - if (!conn->in.datalen) { - rc = iscsi_recv_pdu(conn->cls_conn, hdr, - NULL, 0); - if (conn->login_mtask != mtask) { - spin_lock(&session->lock); - __kfifo_put(session->mgmtpool.queue, - (void*)&mtask, sizeof(void*)); - spin_unlock(&session->lock); - } - } - break; - case ISCSI_OP_SCSI_TMFUNC_RSP: - rc = iscsi_check_assign_cmdsn(session, - (struct iscsi_nopin*)hdr); - if (rc) - break; - if (conn->in.datalen || conn->in.ahslen) { - rc = ISCSI_ERR_PROTO; - break; - } - conn->tmfrsp_pdus_cnt++; - spin_lock(&session->lock); - if (conn->tmabort_state == TMABORT_INITIAL) { - __kfifo_put(session->mgmtpool.queue, - (void*)&mtask, sizeof(void*)); - conn->tmabort_state = - ((struct iscsi_tm_rsp *)hdr)-> - response == ISCSI_TMF_RSP_COMPLETE ? - TMABORT_SUCCESS:TMABORT_FAILED; - /* unblock eh_abort() */ - wake_up(&conn->ehwait); - } - spin_unlock(&session->lock); - break; - case ISCSI_OP_NOOP_IN: - if (hdr->ttt != ISCSI_RESERVED_TAG) { - rc = ISCSI_ERR_PROTO; - break; - } - rc = iscsi_check_assign_cmdsn(session, - (struct iscsi_nopin*)hdr); - if (rc) - break; - conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1; - - if (!conn->in.datalen) { - struct iscsi_mgmt_task *mtask; - - rc = iscsi_recv_pdu(conn->cls_conn, hdr, - NULL, 0); - mtask = (struct iscsi_mgmt_task *) - session->mgmt_cmds[conn->in.itt - - ISCSI_MGMT_ITT_OFFSET]; - if (conn->login_mtask != mtask) { - spin_lock(&session->lock); - __kfifo_put(session->mgmtpool.queue, - (void*)&mtask, sizeof(void*)); - spin_unlock(&session->lock); - } - } - break; - default: - rc = ISCSI_ERR_BAD_OPCODE; - break; - } - } else if (conn->in.itt == ISCSI_RESERVED_TAG) { - switch(conn->in.opcode) { - case ISCSI_OP_NOOP_IN: - if (!conn->in.datalen) { - rc = iscsi_check_assign_cmdsn(session, - (struct iscsi_nopin*)hdr); - if (!rc && hdr->ttt != ISCSI_RESERVED_TAG) - rc = iscsi_recv_pdu(conn->cls_conn, - hdr, NULL, 0); - } else - rc = ISCSI_ERR_PROTO; - break; - case ISCSI_OP_REJECT: - /* we need sth like iscsi_reject_rsp()*/ - case ISCSI_OP_ASYNC_EVENT: - /* we need sth like iscsi_async_event_rsp() */ - rc = ISCSI_ERR_BAD_OPCODE; - break; - default: - rc = ISCSI_ERR_BAD_OPCODE; - break; - } - } else - rc = ISCSI_ERR_BAD_ITT; + if (tcp_conn->in.datalen) + goto copy_hdr; + /* fall through */ + case ISCSI_OP_LOGOUT_RSP: + case ISCSI_OP_NOOP_IN: + case ISCSI_OP_SCSI_TMFUNC_RSP: + rc = iscsi_complete_pdu(conn, hdr, NULL, 0); + break; + default: + rc = ISCSI_ERR_BAD_OPCODE; + break; + } return rc; + +copy_hdr: + /* + * if we did zero copy for the header but we will need multiple + * skbs to complete the command then we have to copy the header + * for later use + */ + if (tcp_conn->in.zero_copy_hdr && tcp_conn->in.copy <= + (tcp_conn->in.datalen + tcp_conn->in.padding + + (conn->datadgst_en ? 4 : 0))) { + debug_tcp("Copying header for later use. in.copy %d in.datalen" + " %d\n", tcp_conn->in.copy, tcp_conn->in.datalen); + memcpy(&tcp_conn->hdr, tcp_conn->in.hdr, + sizeof(struct iscsi_hdr)); + tcp_conn->in.hdr = &tcp_conn->hdr; + tcp_conn->in.zero_copy_hdr = 0; + } + return 0; } /** * iscsi_ctask_copy - copy skb bits to the destanation cmd task - * @conn: iscsi connection + * @conn: iscsi tcp connection * @ctask: scsi command task * @buf: buffer to copy to * @buf_size: size of buffer @@ -804,110 +583,113 @@ iscsi_hdr_recv(struct iscsi_conn *conn) * buf_left left to copy from in progress buffer **/ static inline int -iscsi_ctask_copy(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask, +iscsi_ctask_copy(struct iscsi_tcp_conn *tcp_conn, struct iscsi_cmd_task *ctask, void *buf, int buf_size, int offset) { - int buf_left = buf_size - (conn->data_copied + offset); - int size = min(conn->in.copy, buf_left); + struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; + int buf_left = buf_size - (tcp_conn->data_copied + offset); + int size = min(tcp_conn->in.copy, buf_left); int rc; size = min(size, ctask->data_count); debug_tcp("ctask_copy %d bytes at offset %d copied %d\n", - size, conn->in.offset, conn->in.copied); + size, tcp_conn->in.offset, tcp_conn->in.copied); BUG_ON(size <= 0); - BUG_ON(ctask->sent + size > ctask->total_length); + BUG_ON(tcp_ctask->sent + size > ctask->total_length); - rc = skb_copy_bits(conn->in.skb, conn->in.offset, - (char*)buf + (offset + conn->data_copied), size); + rc = skb_copy_bits(tcp_conn->in.skb, tcp_conn->in.offset, + (char*)buf + (offset + tcp_conn->data_copied), size); /* must fit into skb->len */ BUG_ON(rc); - conn->in.offset += size; - conn->in.copy -= size; - conn->in.copied += size; - conn->data_copied += size; - ctask->sent += size; + tcp_conn->in.offset += size; + tcp_conn->in.copy -= size; + tcp_conn->in.copied += size; + tcp_conn->data_copied += size; + tcp_ctask->sent += size; ctask->data_count -= size; - BUG_ON(conn->in.copy < 0); + BUG_ON(tcp_conn->in.copy < 0); BUG_ON(ctask->data_count < 0); - if (buf_size != (conn->data_copied + offset)) { + if (buf_size != (tcp_conn->data_copied + offset)) { if (!ctask->data_count) { - BUG_ON(buf_size - conn->data_copied < 0); + BUG_ON(buf_size - tcp_conn->data_copied < 0); /* done with this PDU */ - return buf_size - conn->data_copied; + return buf_size - tcp_conn->data_copied; } return -EAGAIN; } /* done with this buffer or with both - PDU and buffer */ - conn->data_copied = 0; + tcp_conn->data_copied = 0; return 0; } /** * iscsi_tcp_copy - copy skb bits to the destanation buffer - * @conn: iscsi connection - * @buf: buffer to copy to - * @buf_size: number of bytes to copy + * @conn: iscsi tcp connection * * Notes: * The function calls skb_copy_bits() and updates per-connection * byte counters. **/ static inline int -iscsi_tcp_copy(struct iscsi_conn *conn, void *buf, int buf_size) +iscsi_tcp_copy(struct iscsi_conn *conn) { - int buf_left = buf_size - conn->data_copied; - int size = min(conn->in.copy, buf_left); + struct iscsi_tcp_conn *tcp_conn = conn->dd_data; + int buf_size = tcp_conn->in.datalen; + int buf_left = buf_size - tcp_conn->data_copied; + int size = min(tcp_conn->in.copy, buf_left); int rc; debug_tcp("tcp_copy %d bytes at offset %d copied %d\n", - size, conn->in.offset, conn->data_copied); + size, tcp_conn->in.offset, tcp_conn->data_copied); BUG_ON(size <= 0); - rc = skb_copy_bits(conn->in.skb, conn->in.offset, - (char*)buf + conn->data_copied, size); + rc = skb_copy_bits(tcp_conn->in.skb, tcp_conn->in.offset, + (char*)conn->data + tcp_conn->data_copied, size); BUG_ON(rc); - conn->in.offset += size; - conn->in.copy -= size; - conn->in.copied += size; - conn->data_copied += size; + tcp_conn->in.offset += size; + tcp_conn->in.copy -= size; + tcp_conn->in.copied += size; + tcp_conn->data_copied += size; - if (buf_size != conn->data_copied) + if (buf_size != tcp_conn->data_copied) return -EAGAIN; return 0; } static inline void -partial_sg_digest_update(struct iscsi_conn *conn, struct scatterlist *sg, - int offset, int length) +partial_sg_digest_update(struct iscsi_tcp_conn *tcp_conn, + struct scatterlist *sg, int offset, int length) { struct scatterlist temp; memcpy(&temp, sg, sizeof(struct scatterlist)); temp.offset = offset; temp.length = length; - crypto_digest_update(conn->data_rx_tfm, &temp, 1); + crypto_digest_update(tcp_conn->data_rx_tfm, &temp, 1); } static void -iscsi_recv_digest_update(struct iscsi_conn *conn, char* buf, int len) +iscsi_recv_digest_update(struct iscsi_tcp_conn *tcp_conn, char* buf, int len) { struct scatterlist tmp; sg_init_one(&tmp, buf, len); - crypto_digest_update(conn->data_rx_tfm, &tmp, 1); + crypto_digest_update(tcp_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 iscsi_tcp_conn *tcp_conn = conn->dd_data; + struct iscsi_cmd_task *ctask = tcp_conn->in.ctask; + struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; struct scsi_cmnd *sc = ctask->sc; struct scatterlist *sg; int i, offset, rc = 0; @@ -919,31 +701,33 @@ static int iscsi_scsi_data_in(struct iscsi_conn *conn) */ if (!sc->use_sg) { i = ctask->data_count; - rc = iscsi_ctask_copy(conn, ctask, sc->request_buffer, - sc->request_bufflen, ctask->data_offset); + rc = iscsi_ctask_copy(tcp_conn, ctask, sc->request_buffer, + sc->request_bufflen, + tcp_ctask->data_offset); if (rc == -EAGAIN) return rc; if (conn->datadgst_en) - iscsi_recv_digest_update(conn, sc->request_buffer, i); + iscsi_recv_digest_update(tcp_conn, sc->request_buffer, + i); rc = 0; goto done; } - offset = ctask->data_offset; + offset = tcp_ctask->data_offset; sg = sc->request_buffer; - if (ctask->data_offset) - for (i = 0; i < ctask->sg_count; i++) + if (tcp_ctask->data_offset) + for (i = 0; i < tcp_ctask->sg_count; i++) offset -= sg[i].length; /* we've passed through partial sg*/ if (offset < 0) offset = 0; - for (i = ctask->sg_count; i < sc->use_sg; i++) { + for (i = tcp_ctask->sg_count; i < sc->use_sg; i++) { char *dest; dest = kmap_atomic(sg[i].page, KM_SOFTIRQ0); - rc = iscsi_ctask_copy(conn, ctask, dest + sg[i].offset, + rc = iscsi_ctask_copy(tcp_conn, ctask, dest + sg[i].offset, sg[i].length, offset); kunmap_atomic(dest, KM_SOFTIRQ0); if (rc == -EAGAIN) @@ -952,15 +736,17 @@ static int iscsi_scsi_data_in(struct iscsi_conn *conn) if (!rc) { if (conn->datadgst_en) { if (!offset) - crypto_digest_update(conn->data_rx_tfm, - &sg[i], 1); + crypto_digest_update( + tcp_conn->data_rx_tfm, + &sg[i], 1); else - partial_sg_digest_update(conn, &sg[i], + partial_sg_digest_update(tcp_conn, + &sg[i], sg[i].offset + offset, sg[i].length - offset); } offset = 0; - ctask->sg_count++; + tcp_ctask->sg_count++; } if (!ctask->data_count) { @@ -968,25 +754,27 @@ static int iscsi_scsi_data_in(struct iscsi_conn *conn) /* * data-in is complete, but buffer not... */ - partial_sg_digest_update(conn, &sg[i], + partial_sg_digest_update(tcp_conn, &sg[i], sg[i].offset, sg[i].length-rc); rc = 0; break; } - if (!conn->in.copy) + if (!tcp_conn->in.copy) return -EAGAIN; } BUG_ON(ctask->data_count); done: /* check for non-exceptional status */ - if (conn->in.flags & ISCSI_FLAG_DATA_STATUS) { - debug_scsi("done [sc %lx res %d itt 0x%x]\n", - (long)sc, sc->result, ctask->itt); - conn->scsirsp_pdus_cnt++; - iscsi_ctask_cleanup(conn, ctask); - sc->scsi_done(sc); + if (tcp_conn->in.hdr->flags & ISCSI_FLAG_DATA_STATUS) { + debug_scsi("done [sc %lx res %d itt 0x%x flags 0x%x]\n", + (long)sc, sc->result, ctask->itt, + tcp_conn->in.hdr->flags); + spin_lock(&conn->session->lock); + iscsi_tcp_cleanup_ctask(conn, ctask); + __iscsi_complete_pdu(conn, tcp_conn->in.hdr, NULL, 0); + spin_unlock(&conn->session->lock); } return rc; @@ -995,71 +783,37 @@ done: static int iscsi_data_recv(struct iscsi_conn *conn) { - struct iscsi_session *session = conn->session; - int rc = 0; + struct iscsi_tcp_conn *tcp_conn = conn->dd_data; + int rc = 0, opcode; - switch(conn->in.opcode) { + opcode = tcp_conn->in.hdr->opcode & ISCSI_OPCODE_MASK; + switch (opcode) { case ISCSI_OP_SCSI_DATA_IN: rc = iscsi_scsi_data_in(conn); break; - case ISCSI_OP_SCSI_CMD_RSP: { - /* - * SCSI Sense Data: - * copying the entire Data Segment. - */ - if (iscsi_tcp_copy(conn, conn->data, conn->in.datalen)) { - rc = -EAGAIN; - goto exit; - } - - /* - * check for sense - */ - 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_SCSI_CMD_RSP: + spin_lock(&conn->session->lock); + iscsi_tcp_cleanup_ctask(conn, tcp_conn->in.ctask); + spin_unlock(&conn->session->lock); case ISCSI_OP_TEXT_RSP: case ISCSI_OP_LOGIN_RSP: - case ISCSI_OP_NOOP_IN: { - struct iscsi_mgmt_task *mtask = NULL; - - if (conn->in.itt != ISCSI_RESERVED_TAG) - mtask = (struct iscsi_mgmt_task *) - session->mgmt_cmds[conn->in.itt - - ISCSI_MGMT_ITT_OFFSET]; - + case ISCSI_OP_ASYNC_EVENT: + case ISCSI_OP_REJECT: /* * Collect data segment to the connection's data * placeholder */ - if (iscsi_tcp_copy(conn, conn->data, conn->in.datalen)) { + if (iscsi_tcp_copy(conn)) { rc = -EAGAIN; goto exit; } - rc = iscsi_recv_pdu(conn->cls_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, - sizeof(void*)); - spin_unlock(&session->lock); - } - } - break; - case ISCSI_OP_ASYNC_EVENT: - case ISCSI_OP_REJECT: + rc = iscsi_complete_pdu(conn, tcp_conn->in.hdr, conn->data, + tcp_conn->in.datalen); + if (!rc && conn->datadgst_en && opcode != ISCSI_OP_LOGIN_RSP) + iscsi_recv_digest_update(tcp_conn, conn->data, + tcp_conn->in.datalen); + break; default: BUG_ON(1); } @@ -1080,6 +834,7 @@ iscsi_tcp_data_recv(read_descriptor_t *rd_desc, struct sk_buff *skb, { int rc; struct iscsi_conn *conn = rd_desc->arg.data; + struct iscsi_tcp_conn *tcp_conn = conn->dd_data; int processed; char pad[ISCSI_PAD_LEN]; struct scatterlist sg; @@ -1088,15 +843,15 @@ iscsi_tcp_data_recv(read_descriptor_t *rd_desc, struct sk_buff *skb, * Save current SKB and its offset in the corresponding * connection context. */ - conn->in.copy = skb->len - offset; - conn->in.offset = offset; - conn->in.skb = skb; - conn->in.len = conn->in.copy; - BUG_ON(conn->in.copy <= 0); - debug_tcp("in %d bytes\n", conn->in.copy); + tcp_conn->in.copy = skb->len - offset; + tcp_conn->in.offset = offset; + tcp_conn->in.skb = skb; + tcp_conn->in.len = tcp_conn->in.copy; + BUG_ON(tcp_conn->in.copy <= 0); + debug_tcp("in %d bytes\n", tcp_conn->in.copy); more: - conn->in.copied = 0; + tcp_conn->in.copied = 0; rc = 0; if (unlikely(conn->suspend_rx)) { @@ -1104,14 +859,14 @@ more: return 0; } - if (conn->in_progress == IN_PROGRESS_WAIT_HEADER || - conn->in_progress == IN_PROGRESS_HEADER_GATHER) { - rc = iscsi_hdr_extract(conn); + if (tcp_conn->in_progress == IN_PROGRESS_WAIT_HEADER || + tcp_conn->in_progress == IN_PROGRESS_HEADER_GATHER) { + rc = iscsi_hdr_extract(tcp_conn); if (rc) { if (rc == -EAGAIN) goto nomore; else { - iscsi_conn_failure(conn, rc); + iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); return 0; } } @@ -1119,90 +874,91 @@ more: /* * Verify and process incoming PDU header. */ - rc = iscsi_hdr_recv(conn); - if (!rc && conn->in.datalen) { + rc = iscsi_tcp_hdr_recv(conn); + if (!rc && tcp_conn->in.datalen) { if (conn->datadgst_en) { - BUG_ON(!conn->data_rx_tfm); - crypto_digest_init(conn->data_rx_tfm); + BUG_ON(!tcp_conn->data_rx_tfm); + crypto_digest_init(tcp_conn->data_rx_tfm); } - conn->in_progress = IN_PROGRESS_DATA_RECV; + tcp_conn->in_progress = IN_PROGRESS_DATA_RECV; } else if (rc) { iscsi_conn_failure(conn, rc); return 0; } } - if (conn->in_progress == IN_PROGRESS_DDIGEST_RECV) { + if (tcp_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); - skb_copy_bits(conn->in.skb, conn->in.offset, + tcp_conn->in.offset, tcp_conn->in.copy); + skb_copy_bits(tcp_conn->in.skb, tcp_conn->in.offset, &recv_digest, 4); - conn->in.offset += 4; - conn->in.copy -= 4; - if (recv_digest != conn->in.datadgst) { + tcp_conn->in.offset += 4; + tcp_conn->in.copy -= 4; + if (recv_digest != tcp_conn->in.datadgst) { debug_tcp("iscsi_tcp: data digest error!" "0x%x != 0x%x\n", recv_digest, - conn->in.datadgst); + tcp_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; + tcp_conn->in.datadgst); + tcp_conn->in_progress = IN_PROGRESS_WAIT_HEADER; } } - if (conn->in_progress == IN_PROGRESS_DATA_RECV && conn->in.copy) { + if (tcp_conn->in_progress == IN_PROGRESS_DATA_RECV && + tcp_conn->in.copy) { debug_tcp("data_recv offset %d copy %d\n", - conn->in.offset, conn->in.copy); + tcp_conn->in.offset, tcp_conn->in.copy); rc = iscsi_data_recv(conn); if (rc) { - if (rc == -EAGAIN) { - rd_desc->count = conn->in.datalen - - conn->in.ctask->data_count; + if (rc == -EAGAIN) goto again; - } - iscsi_conn_failure(conn, rc); + iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); return 0; } - conn->in.copy -= conn->in.padding; - conn->in.offset += conn->in.padding; + tcp_conn->in.copy -= tcp_conn->in.padding; + tcp_conn->in.offset += tcp_conn->in.padding; if (conn->datadgst_en) { - if (conn->in.padding) { - debug_tcp("padding -> %d\n", conn->in.padding); - memset(pad, 0, conn->in.padding); - sg_init_one(&sg, pad, conn->in.padding); - crypto_digest_update(conn->data_rx_tfm, &sg, 1); + if (tcp_conn->in.padding) { + debug_tcp("padding -> %d\n", + tcp_conn->in.padding); + memset(pad, 0, tcp_conn->in.padding); + sg_init_one(&sg, pad, tcp_conn->in.padding); + crypto_digest_update(tcp_conn->data_rx_tfm, + &sg, 1); } - crypto_digest_final(conn->data_rx_tfm, - (u8 *) & conn->in.datadgst); - debug_tcp("rx digest 0x%x\n", conn->in.datadgst); - conn->in_progress = IN_PROGRESS_DDIGEST_RECV; + crypto_digest_final(tcp_conn->data_rx_tfm, + (u8 *) & tcp_conn->in.datadgst); + debug_tcp("rx digest 0x%x\n", tcp_conn->in.datadgst); + tcp_conn->in_progress = IN_PROGRESS_DDIGEST_RECV; } else - conn->in_progress = IN_PROGRESS_WAIT_HEADER; + tcp_conn->in_progress = IN_PROGRESS_WAIT_HEADER; } debug_tcp("f, processed %d from out of %d padding %d\n", - conn->in.offset - offset, (int)len, conn->in.padding); - BUG_ON(conn->in.offset - offset > len); + tcp_conn->in.offset - offset, (int)len, tcp_conn->in.padding); + BUG_ON(tcp_conn->in.offset - offset > len); - if (conn->in.offset - offset != len) { + if (tcp_conn->in.offset - offset != len) { debug_tcp("continue to process %d bytes\n", - (int)len - (conn->in.offset - offset)); + (int)len - (tcp_conn->in.offset - offset)); goto more; } nomore: - processed = conn->in.offset - offset; + processed = tcp_conn->in.offset - offset; BUG_ON(processed == 0); return processed; again: - processed = conn->in.offset - offset; + processed = tcp_conn->in.offset - offset; debug_tcp("c, processed %d from out of %d rd_desc_cnt %d\n", processed, (int)len, (int)rd_desc->count); BUG_ON(processed == 0); @@ -1220,9 +976,14 @@ iscsi_tcp_data_ready(struct sock *sk, int flag) read_lock(&sk->sk_callback_lock); - /* use rd_desc to pass 'conn' to iscsi_tcp_data_recv */ + /* + * Use rd_desc to pass 'conn' to iscsi_tcp_data_recv. + * We set count to 1 because we want the network layer to + * hand us all the skbs that are available. iscsi_tcp_data_recv + * handled pdus that cross buffers or pdus that still need data. + */ rd_desc.arg.data = conn; - rd_desc.count = 0; + rd_desc.count = 1; tcp_read_sock(sk, &rd_desc, iscsi_tcp_data_recv); read_unlock(&sk->sk_callback_lock); @@ -1231,6 +992,7 @@ iscsi_tcp_data_ready(struct sock *sk, int flag) static void iscsi_tcp_state_change(struct sock *sk) { + struct iscsi_tcp_conn *tcp_conn; struct iscsi_conn *conn; struct iscsi_session *session; void (*old_state_change)(struct sock *); @@ -1247,7 +1009,8 @@ iscsi_tcp_state_change(struct sock *sk) iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); } - old_state_change = conn->old_state_change; + tcp_conn = conn->dd_data; + old_state_change = tcp_conn->old_state_change; read_unlock(&sk->sk_callback_lock); @@ -1262,23 +1025,25 @@ static void iscsi_write_space(struct sock *sk) { struct iscsi_conn *conn = (struct iscsi_conn*)sk->sk_user_data; - conn->old_write_space(sk); + struct iscsi_tcp_conn *tcp_conn = conn->dd_data; + + tcp_conn->old_write_space(sk); debug_tcp("iscsi_write_space: cid %d\n", conn->id); - clear_bit(SUSPEND_BIT, &conn->suspend_tx); scsi_queue_work(conn->session->host, &conn->xmitwork); } static void iscsi_conn_set_callbacks(struct iscsi_conn *conn) { - struct sock *sk = conn->sock->sk; + struct iscsi_tcp_conn *tcp_conn = conn->dd_data; + struct sock *sk = tcp_conn->sock->sk; /* assign new callbacks */ write_lock_bh(&sk->sk_callback_lock); sk->sk_user_data = conn; - conn->old_data_ready = sk->sk_data_ready; - conn->old_state_change = sk->sk_state_change; - conn->old_write_space = sk->sk_write_space; + tcp_conn->old_data_ready = sk->sk_data_ready; + tcp_conn->old_state_change = sk->sk_state_change; + tcp_conn->old_write_space = sk->sk_write_space; sk->sk_data_ready = iscsi_tcp_data_ready; sk->sk_state_change = iscsi_tcp_state_change; sk->sk_write_space = iscsi_write_space; @@ -1286,16 +1051,16 @@ iscsi_conn_set_callbacks(struct iscsi_conn *conn) } static void -iscsi_conn_restore_callbacks(struct iscsi_conn *conn) +iscsi_conn_restore_callbacks(struct iscsi_tcp_conn *tcp_conn) { - struct sock *sk = conn->sock->sk; + struct sock *sk = tcp_conn->sock->sk; /* restore socket callbacks, see also: iscsi_conn_set_callbacks() */ write_lock_bh(&sk->sk_callback_lock); sk->sk_user_data = NULL; - sk->sk_data_ready = conn->old_data_ready; - sk->sk_state_change = conn->old_state_change; - sk->sk_write_space = conn->old_write_space; + sk->sk_data_ready = tcp_conn->old_data_ready; + sk->sk_state_change = tcp_conn->old_state_change; + sk->sk_write_space = tcp_conn->old_write_space; sk->sk_no_check = 0; write_unlock_bh(&sk->sk_callback_lock); } @@ -1310,8 +1075,9 @@ iscsi_conn_restore_callbacks(struct iscsi_conn *conn) static inline int iscsi_send(struct iscsi_conn *conn, struct iscsi_buf *buf, int size, int flags) { - struct socket *sk = conn->sock; - int offset = buf->sg.offset + buf->sent; + struct iscsi_tcp_conn *tcp_conn = conn->dd_data; + struct socket *sk = tcp_conn->sock; + int offset = buf->sg.offset + buf->sent, res; /* * if we got use_sg=0 or are sending something we kmallocd @@ -1322,9 +1088,22 @@ iscsi_send(struct iscsi_conn *conn, struct iscsi_buf *buf, int size, int flags) * slab case. */ if (buf->use_sendmsg) - return sock_no_sendpage(sk, buf->sg.page, offset, size, flags); + res = sock_no_sendpage(sk, buf->sg.page, offset, size, flags); + else + res = tcp_conn->sendpage(sk, buf->sg.page, offset, size, flags); + + if (res >= 0) { + conn->txdata_octets += res; + buf->sent += res; + return res; + } + + tcp_conn->sendpage_failures_cnt++; + if (res == -EAGAIN) + res = -ENOBUFS; else - return conn->sendpage(sk, buf->sg.page, offset, size, flags); + iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); + return res; } /** @@ -1350,16 +1129,10 @@ iscsi_sendhdr(struct iscsi_conn *conn, struct iscsi_buf *buf, int datalen) res = iscsi_send(conn, buf, size, flags); debug_tcp("sendhdr %d bytes, sent %d res %d\n", size, buf->sent, res); if (res >= 0) { - conn->txdata_octets += res; - buf->sent += res; if (size != res) return -EAGAIN; return 0; - } else if (res == -EAGAIN) { - conn->sendpage_failures_cnt++; - set_bit(SUSPEND_BIT, &conn->suspend_tx); - } else if (res == -EPIPE) - iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); + } return res; } @@ -1392,47 +1165,46 @@ iscsi_sendpage(struct iscsi_conn *conn, struct iscsi_buf *buf, debug_tcp("sendpage: %d bytes, sent %d left %d sent %d res %d\n", size, buf->sent, *count, *sent, res); if (res >= 0) { - conn->txdata_octets += res; - buf->sent += res; *count -= res; *sent += res; if (size != res) return -EAGAIN; return 0; - } else if (res == -EAGAIN) { - conn->sendpage_failures_cnt++; - set_bit(SUSPEND_BIT, &conn->suspend_tx); - } else if (res == -EPIPE) - iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); + } return res; } static inline void -iscsi_data_digest_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) +iscsi_data_digest_init(struct iscsi_tcp_conn *tcp_conn, + struct iscsi_cmd_task *ctask) { - BUG_ON(!conn->data_tx_tfm); - crypto_digest_init(conn->data_tx_tfm); - ctask->digest_count = 4; + struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; + + BUG_ON(!tcp_conn->data_tx_tfm); + crypto_digest_init(tcp_conn->data_tx_tfm); + tcp_ctask->digest_count = 4; } static int iscsi_digest_final_send(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask, struct iscsi_buf *buf, uint32_t *digest, int final) { + struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; + struct iscsi_tcp_conn *tcp_conn = conn->dd_data; int rc = 0; int sent = 0; if (final) - crypto_digest_final(conn->data_tx_tfm, (u8*)digest); + crypto_digest_final(tcp_conn->data_tx_tfm, (u8*)digest); - iscsi_buf_init_virt(buf, (char*)digest, 4); - rc = iscsi_sendpage(conn, buf, &ctask->digest_count, &sent); + iscsi_buf_init_iov(buf, (char*)digest, 4); + rc = iscsi_sendpage(conn, buf, &tcp_ctask->digest_count, &sent); if (rc) { - ctask->datadigest = *digest; - ctask->xmstate |= XMSTATE_DATA_DIGEST; + tcp_ctask->datadigest = *digest; + tcp_ctask->xmstate |= XMSTATE_DATA_DIGEST; } else - ctask->digest_count = 4; + tcp_ctask->digest_count = 4; return rc; } @@ -1453,21 +1225,19 @@ static void iscsi_solicit_data_cont(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask, struct iscsi_r2t_info *r2t, int left) { + struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; struct iscsi_data *hdr; - struct iscsi_data_task *dtask; struct scsi_cmnd *sc = ctask->sc; int new_offset; - dtask = mempool_alloc(ctask->datapool, GFP_ATOMIC); - BUG_ON(!dtask); - hdr = &dtask->hdr; + hdr = &r2t->dtask.hdr; memset(hdr, 0, sizeof(struct iscsi_data)); hdr->ttt = r2t->ttt; hdr->datasn = cpu_to_be32(r2t->solicit_datasn); r2t->solicit_datasn++; hdr->opcode = ISCSI_OP_SCSI_DATA_OUT; - memcpy(hdr->lun, ctask->hdr.lun, sizeof(hdr->lun)); - hdr->itt = ctask->hdr.itt; + memcpy(hdr->lun, ctask->hdr->lun, sizeof(hdr->lun)); + hdr->itt = ctask->hdr->itt; hdr->exp_statsn = r2t->exp_statsn; new_offset = r2t->data_offset + r2t->sent; hdr->offset = cpu_to_be32(new_offset); @@ -1481,181 +1251,98 @@ iscsi_solicit_data_cont(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask, } conn->dataout_pdus_cnt++; - iscsi_buf_init_virt(&r2t->headbuf, (char*)hdr, + iscsi_buf_init_iov(&r2t->headbuf, (char*)hdr, sizeof(struct iscsi_hdr)); - r2t->dtask = dtask; - if (sc->use_sg && !iscsi_buf_left(&r2t->sendbuf)) { - BUG_ON(ctask->bad_sg == r2t->sg); + BUG_ON(tcp_ctask->bad_sg == r2t->sg); iscsi_buf_init_sg(&r2t->sendbuf, r2t->sg); r2t->sg += 1; } else - iscsi_buf_init_iov(&ctask->sendbuf, + iscsi_buf_init_iov(&tcp_ctask->sendbuf, (char*)sc->request_buffer + new_offset, r2t->data_count); - - list_add(&dtask->item, &ctask->dataqueue); } static void iscsi_unsolicit_data_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) { - struct iscsi_data *hdr; + struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; struct iscsi_data_task *dtask; - dtask = mempool_alloc(ctask->datapool, GFP_ATOMIC); - BUG_ON(!dtask); - hdr = &dtask->hdr; - memset(hdr, 0, sizeof(struct iscsi_data)); - hdr->ttt = cpu_to_be32(ISCSI_RESERVED_TAG); - hdr->datasn = cpu_to_be32(ctask->unsol_datasn); - ctask->unsol_datasn++; - hdr->opcode = ISCSI_OP_SCSI_DATA_OUT; - memcpy(hdr->lun, ctask->hdr.lun, sizeof(hdr->lun)); - hdr->itt = ctask->hdr.itt; - hdr->exp_statsn = cpu_to_be32(conn->exp_statsn); - hdr->offset = cpu_to_be32(ctask->total_length - - ctask->r2t_data_count - - ctask->unsol_count); - if (ctask->unsol_count > conn->max_xmit_dlength) { - hton24(hdr->dlength, conn->max_xmit_dlength); - ctask->data_count = conn->max_xmit_dlength; - hdr->flags = 0; - } else { - hton24(hdr->dlength, ctask->unsol_count); - ctask->data_count = ctask->unsol_count; - hdr->flags = ISCSI_FLAG_CMD_FINAL; - } - - iscsi_buf_init_virt(&ctask->headbuf, (char*)hdr, + dtask = tcp_ctask->dtask = &tcp_ctask->unsol_dtask; + iscsi_prep_unsolicit_data_pdu(ctask, &dtask->hdr, + tcp_ctask->r2t_data_count); + iscsi_buf_init_iov(&tcp_ctask->headbuf, (char*)&dtask->hdr, sizeof(struct iscsi_hdr)); - - list_add(&dtask->item, &ctask->dataqueue); - - ctask->dtask = dtask; } /** - * iscsi_cmd_init - Initialize iSCSI SCSI_READ or SCSI_WRITE commands + * iscsi_tcp_cmd_init - Initialize iSCSI SCSI_READ or SCSI_WRITE commands * @conn: iscsi connection * @ctask: scsi command task * @sc: scsi command **/ static void -iscsi_cmd_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask, - struct scsi_cmnd *sc) +iscsi_tcp_cmd_init(struct iscsi_cmd_task *ctask) { - struct iscsi_session *session = conn->session; - - BUG_ON(__kfifo_len(ctask->r2tqueue)); - - ctask->sc = sc; - ctask->conn = conn; - ctask->hdr.opcode = ISCSI_OP_SCSI_CMD; - ctask->hdr.flags = ISCSI_ATTR_SIMPLE; - int_to_scsilun(sc->device->lun, (struct scsi_lun *)ctask->hdr.lun); - ctask->hdr.itt = ctask->itt | (conn->id << CID_SHIFT) | - (session->age << AGE_SHIFT); - ctask->hdr.data_length = cpu_to_be32(sc->request_bufflen); - ctask->hdr.cmdsn = cpu_to_be32(session->cmdsn); session->cmdsn++; - ctask->hdr.exp_statsn = cpu_to_be32(conn->exp_statsn); - memcpy(ctask->hdr.cdb, sc->cmnd, sc->cmd_len); - memset(&ctask->hdr.cdb[sc->cmd_len], 0, MAX_COMMAND_SIZE - sc->cmd_len); + struct scsi_cmnd *sc = ctask->sc; + struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; - ctask->mtask = NULL; - ctask->sent = 0; - ctask->sg_count = 0; + BUG_ON(__kfifo_len(tcp_ctask->r2tqueue)); - ctask->total_length = sc->request_bufflen; + tcp_ctask->sent = 0; + tcp_ctask->sg_count = 0; if (sc->sc_data_direction == DMA_TO_DEVICE) { - ctask->exp_r2tsn = 0; - ctask->hdr.flags |= ISCSI_FLAG_CMD_WRITE; + tcp_ctask->xmstate = XMSTATE_W_HDR; + tcp_ctask->exp_r2tsn = 0; BUG_ON(ctask->total_length == 0); + if (sc->use_sg) { struct scatterlist *sg = sc->request_buffer; - iscsi_buf_init_sg(&ctask->sendbuf, - &sg[ctask->sg_count++]); - ctask->sg = sg; - ctask->bad_sg = sg + sc->use_sg; - } else { - iscsi_buf_init_iov(&ctask->sendbuf, sc->request_buffer, - sc->request_bufflen); - } + iscsi_buf_init_sg(&tcp_ctask->sendbuf, + &sg[tcp_ctask->sg_count++]); + tcp_ctask->sg = sg; + tcp_ctask->bad_sg = sg + sc->use_sg; + } else + iscsi_buf_init_iov(&tcp_ctask->sendbuf, + sc->request_buffer, + sc->request_bufflen); - /* - * Write counters: - * - * imm_count bytes to be sent right after - * SCSI PDU Header - * - * unsol_count bytes(as Data-Out) to be sent - * without R2T ack right after - * immediate data - * - * r2t_data_count bytes to be sent via R2T ack's - * - * pad_count bytes to be sent as zero-padding - */ - ctask->imm_count = 0; - ctask->unsol_count = 0; - ctask->unsol_datasn = 0; - ctask->xmstate = XMSTATE_W_HDR; - /* calculate write padding */ - ctask->pad_count = ctask->total_length & (ISCSI_PAD_LEN-1); - if (ctask->pad_count) { - ctask->pad_count = ISCSI_PAD_LEN - ctask->pad_count; + if (ctask->imm_count) + tcp_ctask->xmstate |= XMSTATE_IMM_DATA; + + tcp_ctask->pad_count = ctask->total_length & (ISCSI_PAD_LEN-1); + if (tcp_ctask->pad_count) { + tcp_ctask->pad_count = ISCSI_PAD_LEN - + tcp_ctask->pad_count; debug_scsi("write padding %d bytes\n", - ctask->pad_count); - ctask->xmstate |= XMSTATE_W_PAD; + tcp_ctask->pad_count); + tcp_ctask->xmstate |= XMSTATE_W_PAD; } - if (session->imm_data_en) { - if (ctask->total_length >= session->first_burst) - ctask->imm_count = min(session->first_burst, - conn->max_xmit_dlength); - else - ctask->imm_count = min(ctask->total_length, - conn->max_xmit_dlength); - hton24(ctask->hdr.dlength, ctask->imm_count); - ctask->xmstate |= XMSTATE_IMM_DATA; - } else - zero_data(ctask->hdr.dlength); - - if (!session->initial_r2t_en) - ctask->unsol_count = min(session->first_burst, - ctask->total_length) - ctask->imm_count; - if (!ctask->unsol_count) - /* No unsolicit Data-Out's */ - ctask->hdr.flags |= ISCSI_FLAG_CMD_FINAL; - else - ctask->xmstate |= XMSTATE_UNS_HDR | XMSTATE_UNS_INIT; - ctask->r2t_data_count = ctask->total_length - + if (ctask->unsol_count) + tcp_ctask->xmstate |= XMSTATE_UNS_HDR | + XMSTATE_UNS_INIT; + tcp_ctask->r2t_data_count = ctask->total_length - ctask->imm_count - ctask->unsol_count; - debug_scsi("cmd [itt %x total %d imm %d imm_data %d " + debug_scsi("cmd [itt 0x%x total %d imm %d imm_data %d " "r2t_data %d]\n", ctask->itt, ctask->total_length, ctask->imm_count, - ctask->unsol_count, ctask->r2t_data_count); - } else { - ctask->hdr.flags |= ISCSI_FLAG_CMD_FINAL; - if (sc->sc_data_direction == DMA_FROM_DEVICE) - ctask->hdr.flags |= ISCSI_FLAG_CMD_READ; - ctask->datasn = 0; - ctask->xmstate = XMSTATE_R_HDR; - zero_data(ctask->hdr.dlength); - } + ctask->unsol_count, tcp_ctask->r2t_data_count); + } else + tcp_ctask->xmstate = XMSTATE_R_HDR; - iscsi_buf_init_virt(&ctask->headbuf, (char*)&ctask->hdr, + iscsi_buf_init_iov(&tcp_ctask->headbuf, (char*)ctask->hdr, sizeof(struct iscsi_hdr)); - conn->scsicmd_pdus_cnt++; } /** - * iscsi_mtask_xmit - xmit management(immediate) task + * iscsi_tcp_mtask_xmit - xmit management(immediate) task * @conn: iscsi connection * @mtask: task management task * @@ -1669,132 +1356,167 @@ iscsi_cmd_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask, * IN_PROGRESS_IMM_DATA - PDU Data xmit in progress **/ static int -iscsi_mtask_xmit(struct iscsi_conn *conn, struct iscsi_mgmt_task *mtask) +iscsi_tcp_mtask_xmit(struct iscsi_conn *conn, struct iscsi_mgmt_task *mtask) { + struct iscsi_tcp_mgmt_task *tcp_mtask = mtask->dd_data; + int rc; debug_scsi("mtask deq [cid %d state %x itt 0x%x]\n", - conn->id, mtask->xmstate, mtask->itt); + conn->id, tcp_mtask->xmstate, mtask->itt); - if (mtask->xmstate & XMSTATE_IMM_HDR) { - mtask->xmstate &= ~XMSTATE_IMM_HDR; + if (tcp_mtask->xmstate & XMSTATE_IMM_HDR) { + tcp_mtask->xmstate &= ~XMSTATE_IMM_HDR; if (mtask->data_count) - mtask->xmstate |= XMSTATE_IMM_DATA; + tcp_mtask->xmstate |= XMSTATE_IMM_DATA; if (conn->c_stage != ISCSI_CONN_INITIAL_STAGE && - conn->stop_stage != STOP_CONN_RECOVER && + conn->stop_stage != STOP_CONN_RECOVER && conn->hdrdgst_en) - iscsi_hdr_digest(conn, &mtask->headbuf, - (u8*)mtask->hdrext); - if (iscsi_sendhdr(conn, &mtask->headbuf, mtask->data_count)) { - mtask->xmstate |= XMSTATE_IMM_HDR; + iscsi_hdr_digest(conn, &tcp_mtask->headbuf, + (u8*)tcp_mtask->hdrext); + rc = iscsi_sendhdr(conn, &tcp_mtask->headbuf, + mtask->data_count); + if (rc) { + tcp_mtask->xmstate |= XMSTATE_IMM_HDR; if (mtask->data_count) - mtask->xmstate &= ~XMSTATE_IMM_DATA; - return -EAGAIN; + tcp_mtask->xmstate &= ~XMSTATE_IMM_DATA; + return rc; } } - if (mtask->xmstate & XMSTATE_IMM_DATA) { + if (tcp_mtask->xmstate & XMSTATE_IMM_DATA) { BUG_ON(!mtask->data_count); - mtask->xmstate &= ~XMSTATE_IMM_DATA; + tcp_mtask->xmstate &= ~XMSTATE_IMM_DATA; /* FIXME: implement. * Virtual buffer could be spreaded across multiple pages... */ do { - if (iscsi_sendpage(conn, &mtask->sendbuf, - &mtask->data_count, &mtask->sent)) { - mtask->xmstate |= XMSTATE_IMM_DATA; - return -EAGAIN; + int rc; + + rc = iscsi_sendpage(conn, &tcp_mtask->sendbuf, + &mtask->data_count, &tcp_mtask->sent); + if (rc) { + tcp_mtask->xmstate |= XMSTATE_IMM_DATA; + return rc; } } while (mtask->data_count); } - BUG_ON(mtask->xmstate != XMSTATE_IDLE); + BUG_ON(tcp_mtask->xmstate != XMSTATE_IDLE); + if (mtask->hdr->itt == cpu_to_be32(ISCSI_RESERVED_TAG)) { + struct iscsi_session *session = conn->session; + + spin_lock_bh(&session->lock); + list_del(&conn->mtask->running); + __kfifo_put(session->mgmtpool.queue, (void*)&conn->mtask, + sizeof(void*)); + spin_unlock_bh(&session->lock); + } return 0; } static inline int -handle_xmstate_r_hdr(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) +handle_xmstate_r_hdr(struct iscsi_conn *conn, + struct iscsi_tcp_cmd_task *tcp_ctask) { - ctask->xmstate &= ~XMSTATE_R_HDR; + int rc; + + tcp_ctask->xmstate &= ~XMSTATE_R_HDR; if (conn->hdrdgst_en) - iscsi_hdr_digest(conn, &ctask->headbuf, (u8*)ctask->hdrext); - if (!iscsi_sendhdr(conn, &ctask->headbuf, 0)) { - BUG_ON(ctask->xmstate != XMSTATE_IDLE); + iscsi_hdr_digest(conn, &tcp_ctask->headbuf, + (u8*)tcp_ctask->hdrext); + rc = iscsi_sendhdr(conn, &tcp_ctask->headbuf, 0); + if (!rc) { + BUG_ON(tcp_ctask->xmstate != XMSTATE_IDLE); return 0; /* wait for Data-In */ } - ctask->xmstate |= XMSTATE_R_HDR; - return -EAGAIN; + tcp_ctask->xmstate |= XMSTATE_R_HDR; + return rc; } static inline int -handle_xmstate_w_hdr(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) +handle_xmstate_w_hdr(struct iscsi_conn *conn, + struct iscsi_cmd_task *ctask) { - ctask->xmstate &= ~XMSTATE_W_HDR; + struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; + int rc; + + tcp_ctask->xmstate &= ~XMSTATE_W_HDR; if (conn->hdrdgst_en) - iscsi_hdr_digest(conn, &ctask->headbuf, (u8*)ctask->hdrext); - if (iscsi_sendhdr(conn, &ctask->headbuf, ctask->imm_count)) { - ctask->xmstate |= XMSTATE_W_HDR; - return -EAGAIN; - } - return 0; + iscsi_hdr_digest(conn, &tcp_ctask->headbuf, + (u8*)tcp_ctask->hdrext); + rc = iscsi_sendhdr(conn, &tcp_ctask->headbuf, ctask->imm_count); + if (rc) + tcp_ctask->xmstate |= XMSTATE_W_HDR; + return rc; } static inline int handle_xmstate_data_digest(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) { - ctask->xmstate &= ~XMSTATE_DATA_DIGEST; - debug_tcp("resent data digest 0x%x\n", ctask->datadigest); - if (iscsi_digest_final_send(conn, ctask, &ctask->immbuf, - &ctask->datadigest, 0)) { - ctask->xmstate |= XMSTATE_DATA_DIGEST; + struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; + int rc; + + tcp_ctask->xmstate &= ~XMSTATE_DATA_DIGEST; + debug_tcp("resent data digest 0x%x\n", tcp_ctask->datadigest); + rc = iscsi_digest_final_send(conn, ctask, &tcp_ctask->immbuf, + &tcp_ctask->datadigest, 0); + if (rc) { + tcp_ctask->xmstate |= XMSTATE_DATA_DIGEST; debug_tcp("resent data digest 0x%x fail!\n", - ctask->datadigest); - return -EAGAIN; + tcp_ctask->datadigest); } - return 0; + + return rc; } static inline int handle_xmstate_imm_data(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) { + struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; + struct iscsi_tcp_conn *tcp_conn = conn->dd_data; + int rc; + BUG_ON(!ctask->imm_count); - ctask->xmstate &= ~XMSTATE_IMM_DATA; + tcp_ctask->xmstate &= ~XMSTATE_IMM_DATA; if (conn->datadgst_en) { - iscsi_data_digest_init(conn, ctask); - ctask->immdigest = 0; + iscsi_data_digest_init(tcp_conn, ctask); + tcp_ctask->immdigest = 0; } for (;;) { - if (iscsi_sendpage(conn, &ctask->sendbuf, &ctask->imm_count, - &ctask->sent)) { - ctask->xmstate |= XMSTATE_IMM_DATA; + rc = iscsi_sendpage(conn, &tcp_ctask->sendbuf, + &ctask->imm_count, &tcp_ctask->sent); + if (rc) { + tcp_ctask->xmstate |= XMSTATE_IMM_DATA; if (conn->datadgst_en) { - crypto_digest_final(conn->data_tx_tfm, - (u8*)&ctask->immdigest); + crypto_digest_final(tcp_conn->data_tx_tfm, + (u8*)&tcp_ctask->immdigest); debug_tcp("tx imm sendpage fail 0x%x\n", - ctask->datadigest); + tcp_ctask->datadigest); } - return -EAGAIN; + return rc; } if (conn->datadgst_en) - crypto_digest_update(conn->data_tx_tfm, - &ctask->sendbuf.sg, 1); + crypto_digest_update(tcp_conn->data_tx_tfm, + &tcp_ctask->sendbuf.sg, 1); if (!ctask->imm_count) break; - iscsi_buf_init_sg(&ctask->sendbuf, - &ctask->sg[ctask->sg_count++]); + iscsi_buf_init_sg(&tcp_ctask->sendbuf, + &tcp_ctask->sg[tcp_ctask->sg_count++]); } - if (conn->datadgst_en && !(ctask->xmstate & XMSTATE_W_PAD)) { - if (iscsi_digest_final_send(conn, ctask, &ctask->immbuf, - &ctask->immdigest, 1)) { + if (conn->datadgst_en && !(tcp_ctask->xmstate & XMSTATE_W_PAD)) { + rc = iscsi_digest_final_send(conn, ctask, &tcp_ctask->immbuf, + &tcp_ctask->immdigest, 1); + if (rc) { debug_tcp("sending imm digest 0x%x fail!\n", - ctask->immdigest); - return -EAGAIN; + tcp_ctask->immdigest); + return rc; } - debug_tcp("sending imm digest 0x%x\n", ctask->immdigest); + debug_tcp("sending imm digest 0x%x\n", tcp_ctask->immdigest); } return 0; @@ -1803,74 +1525,81 @@ handle_xmstate_imm_data(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) static inline int handle_xmstate_uns_hdr(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) { + struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; struct iscsi_data_task *dtask; + int rc; - ctask->xmstate |= XMSTATE_UNS_DATA; - if (ctask->xmstate & XMSTATE_UNS_INIT) { + tcp_ctask->xmstate |= XMSTATE_UNS_DATA; + if (tcp_ctask->xmstate & XMSTATE_UNS_INIT) { iscsi_unsolicit_data_init(conn, ctask); - BUG_ON(!ctask->dtask); - dtask = ctask->dtask; + dtask = tcp_ctask->dtask; if (conn->hdrdgst_en) - iscsi_hdr_digest(conn, &ctask->headbuf, + iscsi_hdr_digest(conn, &tcp_ctask->headbuf, (u8*)dtask->hdrext); - ctask->xmstate &= ~XMSTATE_UNS_INIT; + tcp_ctask->xmstate &= ~XMSTATE_UNS_INIT; } - if (iscsi_sendhdr(conn, &ctask->headbuf, ctask->data_count)) { - ctask->xmstate &= ~XMSTATE_UNS_DATA; - ctask->xmstate |= XMSTATE_UNS_HDR; - return -EAGAIN; + + rc = iscsi_sendhdr(conn, &tcp_ctask->headbuf, ctask->data_count); + if (rc) { + tcp_ctask->xmstate &= ~XMSTATE_UNS_DATA; + tcp_ctask->xmstate |= XMSTATE_UNS_HDR; + return rc; } debug_scsi("uns dout [itt 0x%x dlen %d sent %d]\n", - ctask->itt, ctask->unsol_count, ctask->sent); + ctask->itt, ctask->unsol_count, tcp_ctask->sent); return 0; } static inline int handle_xmstate_uns_data(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) { - struct iscsi_data_task *dtask = ctask->dtask; + struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; + struct iscsi_data_task *dtask = tcp_ctask->dtask; + struct iscsi_tcp_conn *tcp_conn = conn->dd_data; + int rc; BUG_ON(!ctask->data_count); - ctask->xmstate &= ~XMSTATE_UNS_DATA; + tcp_ctask->xmstate &= ~XMSTATE_UNS_DATA; if (conn->datadgst_en) { - iscsi_data_digest_init(conn, ctask); + iscsi_data_digest_init(tcp_conn, ctask); dtask->digest = 0; } for (;;) { - int start = ctask->sent; + int start = tcp_ctask->sent; - if (iscsi_sendpage(conn, &ctask->sendbuf, &ctask->data_count, - &ctask->sent)) { - ctask->unsol_count -= ctask->sent - start; - ctask->xmstate |= XMSTATE_UNS_DATA; + rc = iscsi_sendpage(conn, &tcp_ctask->sendbuf, + &ctask->data_count, &tcp_ctask->sent); + if (rc) { + ctask->unsol_count -= tcp_ctask->sent - start; + tcp_ctask->xmstate |= XMSTATE_UNS_DATA; /* will continue with this ctask later.. */ if (conn->datadgst_en) { - crypto_digest_final(conn->data_tx_tfm, + crypto_digest_final(tcp_conn->data_tx_tfm, (u8 *)&dtask->digest); debug_tcp("tx uns data fail 0x%x\n", dtask->digest); } - return -EAGAIN; + return rc; } - BUG_ON(ctask->sent > ctask->total_length); - ctask->unsol_count -= ctask->sent - start; + BUG_ON(tcp_ctask->sent > ctask->total_length); + ctask->unsol_count -= tcp_ctask->sent - start; /* * XXX:we may run here with un-initial sendbuf. * so pass it */ - if (conn->datadgst_en && ctask->sent - start > 0) - crypto_digest_update(conn->data_tx_tfm, - &ctask->sendbuf.sg, 1); + if (conn->datadgst_en && tcp_ctask->sent - start > 0) + crypto_digest_update(tcp_conn->data_tx_tfm, + &tcp_ctask->sendbuf.sg, 1); if (!ctask->data_count) break; - iscsi_buf_init_sg(&ctask->sendbuf, - &ctask->sg[ctask->sg_count++]); + iscsi_buf_init_sg(&tcp_ctask->sendbuf, + &tcp_ctask->sg[tcp_ctask->sg_count++]); } BUG_ON(ctask->unsol_count < 0); @@ -1880,27 +1609,29 @@ handle_xmstate_uns_data(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) */ if (ctask->unsol_count) { if (conn->datadgst_en) { - if (iscsi_digest_final_send(conn, ctask, + rc = iscsi_digest_final_send(conn, ctask, &dtask->digestbuf, - &dtask->digest, 1)) { + &dtask->digest, 1); + if (rc) { debug_tcp("send uns digest 0x%x fail\n", dtask->digest); - return -EAGAIN; + return rc; } debug_tcp("sending uns digest 0x%x, more uns\n", dtask->digest); } - ctask->xmstate |= XMSTATE_UNS_INIT; + tcp_ctask->xmstate |= XMSTATE_UNS_INIT; return 1; } - if (conn->datadgst_en && !(ctask->xmstate & XMSTATE_W_PAD)) { - if (iscsi_digest_final_send(conn, ctask, + if (conn->datadgst_en && !(tcp_ctask->xmstate & XMSTATE_W_PAD)) { + rc = iscsi_digest_final_send(conn, ctask, &dtask->digestbuf, - &dtask->digest, 1)) { + &dtask->digest, 1); + if (rc) { debug_tcp("send last uns digest 0x%x fail\n", dtask->digest); - return -EAGAIN; + return rc; } debug_tcp("sending uns digest 0x%x\n",dtask->digest); } @@ -1912,43 +1643,47 @@ static inline int handle_xmstate_sol_data(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) { struct iscsi_session *session = conn->session; - struct iscsi_r2t_info *r2t = ctask->r2t; - struct iscsi_data_task *dtask = r2t->dtask; - int left; + struct iscsi_tcp_conn *tcp_conn = conn->dd_data; + struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; + struct iscsi_r2t_info *r2t = tcp_ctask->r2t; + struct iscsi_data_task *dtask = &r2t->dtask; + int left, rc; - ctask->xmstate &= ~XMSTATE_SOL_DATA; - ctask->dtask = dtask; + tcp_ctask->xmstate &= ~XMSTATE_SOL_DATA; + tcp_ctask->dtask = dtask; if (conn->datadgst_en) { - iscsi_data_digest_init(conn, ctask); + iscsi_data_digest_init(tcp_conn, ctask); dtask->digest = 0; } solicit_again: /* - * send Data-Out whitnin this R2T sequence. + * send Data-Out within this R2T sequence. */ if (!r2t->data_count) goto data_out_done; - if (iscsi_sendpage(conn, &r2t->sendbuf, &r2t->data_count, &r2t->sent)) { - ctask->xmstate |= XMSTATE_SOL_DATA; + rc = iscsi_sendpage(conn, &r2t->sendbuf, &r2t->data_count, &r2t->sent); + if (rc) { + tcp_ctask->xmstate |= XMSTATE_SOL_DATA; /* will continue with this ctask later.. */ if (conn->datadgst_en) { - crypto_digest_final(conn->data_tx_tfm, + crypto_digest_final(tcp_conn->data_tx_tfm, (u8 *)&dtask->digest); debug_tcp("r2t data send fail 0x%x\n", dtask->digest); } - return -EAGAIN; + return rc; } BUG_ON(r2t->data_count < 0); if (conn->datadgst_en) - crypto_digest_update(conn->data_tx_tfm, &r2t->sendbuf.sg, 1); + crypto_digest_update(tcp_conn->data_tx_tfm, &r2t->sendbuf.sg, + 1); if (r2t->data_count) { BUG_ON(ctask->sc->use_sg == 0); if (!iscsi_buf_left(&r2t->sendbuf)) { - BUG_ON(ctask->bad_sg == r2t->sg); + BUG_ON(tcp_ctask->bad_sg == r2t->sg); iscsi_buf_init_sg(&r2t->sendbuf, r2t->sg); r2t->sg += 1; } @@ -1964,19 +1699,20 @@ data_out_done: left = r2t->data_length - r2t->sent; if (left) { if (conn->datadgst_en) { - if (iscsi_digest_final_send(conn, ctask, + rc = iscsi_digest_final_send(conn, ctask, &dtask->digestbuf, - &dtask->digest, 1)) { + &dtask->digest, 1); + if (rc) { debug_tcp("send r2t data digest 0x%x" "fail\n", dtask->digest); - return -EAGAIN; + return rc; } debug_tcp("r2t data send digest 0x%x\n", dtask->digest); } iscsi_solicit_data_cont(conn, ctask, r2t, left); - ctask->xmstate |= XMSTATE_SOL_DATA; - ctask->xmstate &= ~XMSTATE_SOL_HDR; + tcp_ctask->xmstate |= XMSTATE_SOL_DATA; + tcp_ctask->xmstate &= ~XMSTATE_SOL_HDR; return 1; } @@ -1984,26 +1720,27 @@ data_out_done: * Done with this R2T. Check if there are more * outstanding R2Ts ready to be processed. */ - BUG_ON(ctask->r2t_data_count - r2t->data_length < 0); + BUG_ON(tcp_ctask->r2t_data_count - r2t->data_length < 0); if (conn->datadgst_en) { - if (iscsi_digest_final_send(conn, ctask, &dtask->digestbuf, - &dtask->digest, 1)) { + rc = iscsi_digest_final_send(conn, ctask, &dtask->digestbuf, + &dtask->digest, 1); + if (rc) { debug_tcp("send last r2t data digest 0x%x" "fail\n", dtask->digest); - return -EAGAIN; + return rc; } debug_tcp("r2t done dout digest 0x%x\n", dtask->digest); } - ctask->r2t_data_count -= r2t->data_length; - ctask->r2t = NULL; + tcp_ctask->r2t_data_count -= r2t->data_length; + tcp_ctask->r2t = NULL; spin_lock_bh(&session->lock); - __kfifo_put(ctask->r2tpool.queue, (void*)&r2t, sizeof(void*)); + __kfifo_put(tcp_ctask->r2tpool.queue, (void*)&r2t, sizeof(void*)); spin_unlock_bh(&session->lock); - if (__kfifo_get(ctask->r2tqueue, (void*)&r2t, sizeof(void*))) { - ctask->r2t = r2t; - ctask->xmstate |= XMSTATE_SOL_DATA; - ctask->xmstate &= ~XMSTATE_SOL_HDR; + if (__kfifo_get(tcp_ctask->r2tqueue, (void*)&r2t, sizeof(void*))) { + tcp_ctask->r2t = r2t; + tcp_ctask->xmstate |= XMSTATE_SOL_DATA; + tcp_ctask->xmstate &= ~XMSTATE_SOL_HDR; return 1; } @@ -2013,36 +1750,44 @@ data_out_done: static inline int handle_xmstate_w_pad(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) { - struct iscsi_data_task *dtask = ctask->dtask; - int sent; - - ctask->xmstate &= ~XMSTATE_W_PAD; - iscsi_buf_init_virt(&ctask->sendbuf, (char*)&ctask->pad, - ctask->pad_count); - if (iscsi_sendpage(conn, &ctask->sendbuf, &ctask->pad_count, &sent)) { - ctask->xmstate |= XMSTATE_W_PAD; - return -EAGAIN; + struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; + struct iscsi_tcp_conn *tcp_conn = conn->dd_data; + struct iscsi_data_task *dtask = tcp_ctask->dtask; + int sent = 0, rc; + + tcp_ctask->xmstate &= ~XMSTATE_W_PAD; + iscsi_buf_init_iov(&tcp_ctask->sendbuf, (char*)&tcp_ctask->pad, + tcp_ctask->pad_count); + rc = iscsi_sendpage(conn, &tcp_ctask->sendbuf, &tcp_ctask->pad_count, + &sent); + if (rc) { + tcp_ctask->xmstate |= XMSTATE_W_PAD; + return rc; } if (conn->datadgst_en) { - crypto_digest_update(conn->data_tx_tfm, &ctask->sendbuf.sg, 1); + crypto_digest_update(tcp_conn->data_tx_tfm, + &tcp_ctask->sendbuf.sg, 1); /* imm data? */ if (!dtask) { - if (iscsi_digest_final_send(conn, ctask, &ctask->immbuf, - &ctask->immdigest, 1)) { + rc = iscsi_digest_final_send(conn, ctask, + &tcp_ctask->immbuf, + &tcp_ctask->immdigest, 1); + if (rc) { debug_tcp("send padding digest 0x%x" - "fail!\n", ctask->immdigest); - return -EAGAIN; + "fail!\n", tcp_ctask->immdigest); + return rc; } debug_tcp("done with padding, digest 0x%x\n", - ctask->datadigest); + tcp_ctask->datadigest); } else { - if (iscsi_digest_final_send(conn, ctask, + rc = iscsi_digest_final_send(conn, ctask, &dtask->digestbuf, - &dtask->digest, 1)) { + &dtask->digest, 1); + if (rc) { debug_tcp("send padding digest 0x%x" "fail\n", dtask->digest); - return -EAGAIN; + return rc; } debug_tcp("done with padding, digest 0x%x\n", dtask->digest); @@ -2053,12 +1798,13 @@ handle_xmstate_w_pad(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) } static int -iscsi_ctask_xmit(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) +iscsi_tcp_ctask_xmit(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) { + struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; int rc = 0; debug_scsi("ctask deq [cid %d xmstate %x itt 0x%x]\n", - conn->id, ctask->xmstate, ctask->itt); + conn->id, tcp_ctask->xmstate, ctask->itt); /* * serialize with TMF AbortTask @@ -2066,40 +1812,38 @@ iscsi_ctask_xmit(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) if (ctask->mtask) return rc; - if (ctask->xmstate & XMSTATE_R_HDR) { - rc = handle_xmstate_r_hdr(conn, ctask); - return rc; - } + if (tcp_ctask->xmstate & XMSTATE_R_HDR) + return handle_xmstate_r_hdr(conn, tcp_ctask); - if (ctask->xmstate & XMSTATE_W_HDR) { + if (tcp_ctask->xmstate & XMSTATE_W_HDR) { rc = handle_xmstate_w_hdr(conn, ctask); if (rc) return rc; } /* XXX: for data digest xmit recover */ - if (ctask->xmstate & XMSTATE_DATA_DIGEST) { + if (tcp_ctask->xmstate & XMSTATE_DATA_DIGEST) { rc = handle_xmstate_data_digest(conn, ctask); if (rc) return rc; } - if (ctask->xmstate & XMSTATE_IMM_DATA) { + if (tcp_ctask->xmstate & XMSTATE_IMM_DATA) { rc = handle_xmstate_imm_data(conn, ctask); if (rc) return rc; } - if (ctask->xmstate & XMSTATE_UNS_HDR) { + if (tcp_ctask->xmstate & XMSTATE_UNS_HDR) { BUG_ON(!ctask->unsol_count); - ctask->xmstate &= ~XMSTATE_UNS_HDR; + tcp_ctask->xmstate &= ~XMSTATE_UNS_HDR; unsolicit_head_again: rc = handle_xmstate_uns_hdr(conn, ctask); if (rc) return rc; } - if (ctask->xmstate & XMSTATE_UNS_DATA) { + if (tcp_ctask->xmstate & XMSTATE_UNS_DATA) { rc = handle_xmstate_uns_data(conn, ctask); if (rc == 1) goto unsolicit_head_again; @@ -2108,23 +1852,24 @@ unsolicit_head_again: goto done; } - if (ctask->xmstate & XMSTATE_SOL_HDR) { + if (tcp_ctask->xmstate & XMSTATE_SOL_HDR) { struct iscsi_r2t_info *r2t; - ctask->xmstate &= ~XMSTATE_SOL_HDR; - ctask->xmstate |= XMSTATE_SOL_DATA; - if (!ctask->r2t) - __kfifo_get(ctask->r2tqueue, (void*)&ctask->r2t, + tcp_ctask->xmstate &= ~XMSTATE_SOL_HDR; + tcp_ctask->xmstate |= XMSTATE_SOL_DATA; + if (!tcp_ctask->r2t) + __kfifo_get(tcp_ctask->r2tqueue, (void*)&tcp_ctask->r2t, sizeof(void*)); solicit_head_again: - r2t = ctask->r2t; + r2t = tcp_ctask->r2t; if (conn->hdrdgst_en) iscsi_hdr_digest(conn, &r2t->headbuf, - (u8*)r2t->dtask->hdrext); - if (iscsi_sendhdr(conn, &r2t->headbuf, r2t->data_count)) { - ctask->xmstate &= ~XMSTATE_SOL_DATA; - ctask->xmstate |= XMSTATE_SOL_HDR; - return -EAGAIN; + (u8*)r2t->dtask.hdrext); + rc = iscsi_sendhdr(conn, &r2t->headbuf, r2t->data_count); + if (rc) { + tcp_ctask->xmstate &= ~XMSTATE_SOL_DATA; + tcp_ctask->xmstate |= XMSTATE_SOL_HDR; + return rc; } debug_scsi("sol dout [dsn %d itt 0x%x dlen %d sent %d]\n", @@ -2132,7 +1877,7 @@ solicit_head_again: r2t->sent); } - if (ctask->xmstate & XMSTATE_SOL_DATA) { + if (tcp_ctask->xmstate & XMSTATE_SOL_DATA) { rc = handle_xmstate_sol_data(conn, ctask); if (rc == 1) goto solicit_head_again; @@ -2145,1099 +1890,431 @@ done: * Last thing to check is whether we need to send write * padding. Note that we check for xmstate equality, not just the bit. */ - if (ctask->xmstate == XMSTATE_W_PAD) + if (tcp_ctask->xmstate == XMSTATE_W_PAD) rc = handle_xmstate_w_pad(conn, ctask); return rc; } -/** - * iscsi_data_xmit - xmit any command into the scheduled connection - * @conn: iscsi connection - * - * Notes: - * The function can return -EAGAIN in which case the caller must - * re-schedule it again later or recover. '0' return code means - * successful xmit. - **/ -static int -iscsi_data_xmit(struct iscsi_conn *conn) +static struct iscsi_cls_conn * +iscsi_tcp_conn_create(struct iscsi_cls_session *cls_session, uint32_t conn_idx) { - if (unlikely(conn->suspend_tx)) { - debug_tcp("conn %d Tx suspended!\n", conn->id); - return 0; - } + struct iscsi_conn *conn; + struct iscsi_cls_conn *cls_conn; + struct iscsi_tcp_conn *tcp_conn; + cls_conn = iscsi_conn_setup(cls_session, conn_idx); + if (!cls_conn) + return NULL; + conn = cls_conn->dd_data; /* - * Transmit in the following order: - * - * 1) un-finished xmit (ctask or mtask) - * 2) immediate control PDUs - * 3) write data - * 4) SCSI commands - * 5) non-immediate control PDUs - * - * No need to lock around __kfifo_get as long as - * there's one producer and one consumer. + * due to strange issues with iser these are not set + * in iscsi_conn_setup */ + conn->max_recv_dlength = DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH; - BUG_ON(conn->ctask && conn->mtask); + tcp_conn = kzalloc(sizeof(*tcp_conn), GFP_KERNEL); + if (!tcp_conn) + goto tcp_conn_alloc_fail; - if (conn->ctask) { - if (iscsi_ctask_xmit(conn, conn->ctask)) - goto again; - /* done with this in-progress ctask */ - conn->ctask = NULL; - } - if (conn->mtask) { - if (iscsi_mtask_xmit(conn, conn->mtask)) - goto again; - /* done with this in-progress mtask */ - conn->mtask = NULL; - } + conn->dd_data = tcp_conn; + tcp_conn->iscsi_conn = conn; + tcp_conn->in_progress = IN_PROGRESS_WAIT_HEADER; + /* initial operational parameters */ + tcp_conn->hdr_size = sizeof(struct iscsi_hdr); - /* process immediate first */ - if (unlikely(__kfifo_len(conn->immqueue))) { - struct iscsi_session *session = conn->session; - while (__kfifo_get(conn->immqueue, (void*)&conn->mtask, - sizeof(void*))) { - if (iscsi_mtask_xmit(conn, conn->mtask)) - goto again; - - if (conn->mtask->hdr.itt == - cpu_to_be32(ISCSI_RESERVED_TAG)) { - spin_lock_bh(&session->lock); - __kfifo_put(session->mgmtpool.queue, - (void*)&conn->mtask, sizeof(void*)); - spin_unlock_bh(&session->lock); - } - } - /* done with this mtask */ - conn->mtask = NULL; - } - - /* process write queue */ - while (__kfifo_get(conn->writequeue, (void*)&conn->ctask, - sizeof(void*))) { - if (iscsi_ctask_xmit(conn, conn->ctask)) - goto again; - } - - /* process command queue */ - while (__kfifo_get(conn->xmitqueue, (void*)&conn->ctask, - sizeof(void*))) { - if (iscsi_ctask_xmit(conn, conn->ctask)) - goto again; - } - /* done with this ctask */ - conn->ctask = NULL; - - /* process the rest control plane PDUs, if any */ - if (unlikely(__kfifo_len(conn->mgmtqueue))) { - struct iscsi_session *session = conn->session; + return cls_conn; - while (__kfifo_get(conn->mgmtqueue, (void*)&conn->mtask, - sizeof(void*))) { - if (iscsi_mtask_xmit(conn, conn->mtask)) - goto again; +tcp_conn_alloc_fail: + iscsi_conn_teardown(cls_conn); + return NULL; +} - if (conn->mtask->hdr.itt == - cpu_to_be32(ISCSI_RESERVED_TAG)) { - spin_lock_bh(&session->lock); - __kfifo_put(session->mgmtpool.queue, - (void*)&conn->mtask, - sizeof(void*)); - spin_unlock_bh(&session->lock); - } - } - /* done with this mtask */ - conn->mtask = NULL; - } +static void +iscsi_tcp_release_conn(struct iscsi_conn *conn) +{ + struct iscsi_tcp_conn *tcp_conn = conn->dd_data; - return 0; + if (!tcp_conn->sock) + return; -again: - if (unlikely(conn->suspend_tx)) - return 0; + sock_hold(tcp_conn->sock->sk); + iscsi_conn_restore_callbacks(tcp_conn); + sock_put(tcp_conn->sock->sk); - return -EAGAIN; + sock_release(tcp_conn->sock); + tcp_conn->sock = NULL; + conn->recv_lock = NULL; } static void -iscsi_xmitworker(void *data) +iscsi_tcp_conn_destroy(struct iscsi_cls_conn *cls_conn) { - struct iscsi_conn *conn = data; + struct iscsi_conn *conn = cls_conn->dd_data; + struct iscsi_tcp_conn *tcp_conn = conn->dd_data; + int digest = 0; - /* - * serialize Xmit worker on a per-connection basis. - */ - mutex_lock(&conn->xmitmutex); - if (iscsi_data_xmit(conn)) - scsi_queue_work(conn->session->host, &conn->xmitwork); - mutex_unlock(&conn->xmitmutex); -} + if (conn->hdrdgst_en || conn->datadgst_en) + digest = 1; -#define FAILURE_BAD_HOST 1 -#define FAILURE_SESSION_FAILED 2 -#define FAILURE_SESSION_FREED 3 -#define FAILURE_WINDOW_CLOSED 4 -#define FAILURE_SESSION_TERMINATE 5 + iscsi_tcp_release_conn(conn); + iscsi_conn_teardown(cls_conn); -static int -iscsi_queuecommand(struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *)) -{ - struct Scsi_Host *host; - int reason = 0; - struct iscsi_session *session; - struct iscsi_conn *conn = NULL; - struct iscsi_cmd_task *ctask = NULL; + /* now free tcp_conn */ + if (digest) { + if (tcp_conn->tx_tfm) + crypto_free_tfm(tcp_conn->tx_tfm); + if (tcp_conn->rx_tfm) + crypto_free_tfm(tcp_conn->rx_tfm); + if (tcp_conn->data_tx_tfm) + crypto_free_tfm(tcp_conn->data_tx_tfm); + if (tcp_conn->data_rx_tfm) + crypto_free_tfm(tcp_conn->data_rx_tfm); + } - sc->scsi_done = done; - sc->result = 0; + kfree(tcp_conn); +} - host = sc->device->host; - session = iscsi_hostdata(host->hostdata); - BUG_ON(host != session->host); +static void +iscsi_tcp_conn_stop(struct iscsi_cls_conn *cls_conn, int flag) +{ + struct iscsi_conn *conn = cls_conn->dd_data; - spin_lock(&session->lock); + iscsi_conn_stop(cls_conn, flag); + iscsi_tcp_release_conn(conn); +} - if (session->state != ISCSI_STATE_LOGGED_IN) { - if (session->state == ISCSI_STATE_FAILED) { - reason = FAILURE_SESSION_FAILED; - goto reject; - } else if (session->state == ISCSI_STATE_TERMINATE) { - reason = FAILURE_SESSION_TERMINATE; - goto fault; - } - reason = FAILURE_SESSION_FREED; - goto fault; - } +static int +iscsi_tcp_conn_bind(struct iscsi_cls_session *cls_session, + struct iscsi_cls_conn *cls_conn, uint64_t transport_eph, + int is_leading) +{ + struct iscsi_conn *conn = cls_conn->dd_data; + struct iscsi_tcp_conn *tcp_conn = conn->dd_data; + struct sock *sk; + struct socket *sock; + int err; - /* - * Check for iSCSI window and take care of CmdSN wrap-around - */ - if ((int)(session->max_cmdsn - session->cmdsn) < 0) { - reason = FAILURE_WINDOW_CLOSED; - goto reject; + /* lookup for existing socket */ + sock = sockfd_lookup((int)transport_eph, &err); + if (!sock) { + printk(KERN_ERR "iscsi_tcp: sockfd_lookup failed %d\n", err); + return -EEXIST; } - conn = session->leadconn; + err = iscsi_conn_bind(cls_session, cls_conn, is_leading); + if (err) + return err; - __kfifo_get(session->cmdpool.queue, (void*)&ctask, sizeof(void*)); - BUG_ON(ctask->sc); + /* bind iSCSI connection and socket */ + tcp_conn->sock = sock; - sc->SCp.phase = session->age; - sc->SCp.ptr = (char*)ctask; - iscsi_cmd_init(conn, ctask, sc); + /* setup Socket parameters */ + sk = sock->sk; + sk->sk_reuse = 1; + sk->sk_sndtimeo = 15 * HZ; /* FIXME: make it configurable */ + sk->sk_allocation = GFP_ATOMIC; - __kfifo_put(conn->xmitqueue, (void*)&ctask, sizeof(void*)); - debug_scsi( - "ctask enq [%s cid %d sc %lx itt 0x%x len %d cmdsn %d win %d]\n", - sc->sc_data_direction == DMA_TO_DEVICE ? "write" : "read", - conn->id, (long)sc, ctask->itt, sc->request_bufflen, - session->cmdsn, session->max_cmdsn - session->exp_cmdsn + 1); - spin_unlock(&session->lock); - - scsi_queue_work(host, &conn->xmitwork); - return 0; + /* FIXME: disable Nagle's algorithm */ -reject: - spin_unlock(&session->lock); - debug_scsi("cmd 0x%x rejected (%d)\n", sc->cmnd[0], reason); - return SCSI_MLQUEUE_HOST_BUSY; + /* + * Intercept TCP callbacks for sendfile like receive + * processing. + */ + conn->recv_lock = &sk->sk_callback_lock; + iscsi_conn_set_callbacks(conn); + tcp_conn->sendpage = tcp_conn->sock->ops->sendpage; + /* + * set receive state machine into initial state + */ + tcp_conn->in_progress = IN_PROGRESS_WAIT_HEADER; -fault: - spin_unlock(&session->lock); - printk(KERN_ERR "iscsi_tcp: cmd 0x%x is not queued (%d)\n", - sc->cmnd[0], reason); - sc->sense_buffer[0] = 0x70; - sc->sense_buffer[2] = NOT_READY; - sc->sense_buffer[7] = 0x6; - sc->sense_buffer[12] = 0x08; - sc->sense_buffer[13] = 0x00; - sc->result = (DID_NO_CONNECT << 16); - sc->resid = sc->request_bufflen; - sc->scsi_done(sc); return 0; } -static int -iscsi_change_queue_depth(struct scsi_device *sdev, int depth) +/* called with host lock */ +static void +iscsi_tcp_mgmt_init(struct iscsi_conn *conn, struct iscsi_mgmt_task *mtask, + char *data, uint32_t data_size) { - 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; + struct iscsi_tcp_mgmt_task *tcp_mtask = mtask->dd_data; + + iscsi_buf_init_iov(&tcp_mtask->headbuf, (char*)mtask->hdr, + sizeof(struct iscsi_hdr)); + tcp_mtask->xmstate = XMSTATE_IMM_HDR; + tcp_mtask->sent = 0; + + if (mtask->data_count) + iscsi_buf_init_iov(&tcp_mtask->sendbuf, (char*)mtask->data, + mtask->data_count); } static int -iscsi_pool_init(struct iscsi_queue *q, int max, void ***items, int item_size) +iscsi_r2tpool_alloc(struct iscsi_session *session) { int i; + int cmd_i; - *items = kmalloc(max * sizeof(void*), GFP_KERNEL); - if (*items == NULL) - return -ENOMEM; + /* + * initialize per-task: R2T pool and xmit queue + */ + for (cmd_i = 0; cmd_i < session->cmds_max; cmd_i++) { + struct iscsi_cmd_task *ctask = session->cmds[cmd_i]; + struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; - q->max = max; - q->pool = kmalloc(max * sizeof(void*), GFP_KERNEL); - if (q->pool == NULL) { - kfree(*items); - return -ENOMEM; - } + /* + * pre-allocated x4 as much r2ts to handle race when + * target acks DataOut faster than we data_xmit() queues + * could replenish r2tqueue. + */ + + /* R2T pool */ + if (iscsi_pool_init(&tcp_ctask->r2tpool, session->max_r2t * 4, + (void***)&tcp_ctask->r2ts, + sizeof(struct iscsi_r2t_info))) { + goto r2t_alloc_fail; + } - q->queue = kfifo_init((void*)q->pool, max * sizeof(void*), - GFP_KERNEL, NULL); - if (q->queue == ERR_PTR(-ENOMEM)) { - kfree(q->pool); - kfree(*items); - return -ENOMEM; + /* R2T xmit queue */ + tcp_ctask->r2tqueue = kfifo_alloc( + session->max_r2t * 4 * sizeof(void*), GFP_KERNEL, NULL); + if (tcp_ctask->r2tqueue == ERR_PTR(-ENOMEM)) { + iscsi_pool_free(&tcp_ctask->r2tpool, + (void**)tcp_ctask->r2ts); + goto r2t_alloc_fail; + } } - for (i = 0; i < max; i++) { - q->pool[i] = kmalloc(item_size, GFP_KERNEL); - if (q->pool[i] == NULL) { - int j; + return 0; - for (j = 0; j < i; j++) - kfree(q->pool[j]); +r2t_alloc_fail: + for (i = 0; i < cmd_i; i++) { + struct iscsi_cmd_task *ctask = session->cmds[i]; + struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; - kfifo_free(q->queue); - kfree(q->pool); - kfree(*items); - return -ENOMEM; - } - memset(q->pool[i], 0, item_size); - (*items)[i] = q->pool[i]; - __kfifo_put(q->queue, (void*)&q->pool[i], sizeof(void*)); + kfifo_free(tcp_ctask->r2tqueue); + iscsi_pool_free(&tcp_ctask->r2tpool, + (void**)tcp_ctask->r2ts); } - return 0; + return -ENOMEM; } static void -iscsi_pool_free(struct iscsi_queue *q, void **items) +iscsi_r2tpool_free(struct iscsi_session *session) { int i; - for (i = 0; i < q->max; i++) - kfree(items[i]); - kfree(q->pool); - kfree(items); + for (i = 0; i < session->cmds_max; i++) { + struct iscsi_cmd_task *ctask = session->cmds[i]; + struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; + + kfifo_free(tcp_ctask->r2tqueue); + iscsi_pool_free(&tcp_ctask->r2tpool, + (void**)tcp_ctask->r2ts); + } } -static struct iscsi_cls_conn * -iscsi_conn_create(struct iscsi_cls_session *cls_session, uint32_t conn_idx) +static int +iscsi_conn_set_param(struct iscsi_cls_conn *cls_conn, enum iscsi_param param, + char *buf, int buflen) { - struct Scsi_Host *shost = iscsi_session_to_shost(cls_session); - struct iscsi_session *session = iscsi_hostdata(shost->hostdata); - struct iscsi_conn *conn; - struct iscsi_cls_conn *cls_conn; - - cls_conn = iscsi_create_conn(cls_session, conn_idx); - if (!cls_conn) - return NULL; - conn = cls_conn->dd_data; - memset(conn, 0, sizeof(*conn)); - - conn->cls_conn = cls_conn; - conn->c_stage = ISCSI_CONN_INITIAL_STAGE; - conn->in_progress = IN_PROGRESS_WAIT_HEADER; - conn->id = conn_idx; - conn->exp_statsn = 0; - conn->tmabort_state = TMABORT_INITIAL; - - /* initial operational parameters */ - conn->hdr_size = sizeof(struct iscsi_hdr); - conn->data_size = DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH; - conn->max_recv_dlength = DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH; + struct iscsi_conn *conn = cls_conn->dd_data; + struct iscsi_session *session = conn->session; + struct iscsi_tcp_conn *tcp_conn = conn->dd_data; + int value; - /* initialize general xmit PDU commands queue */ - conn->xmitqueue = kfifo_alloc(session->cmds_max * sizeof(void*), - GFP_KERNEL, NULL); - if (conn->xmitqueue == ERR_PTR(-ENOMEM)) - goto xmitqueue_alloc_fail; + switch(param) { + case ISCSI_PARAM_HDRDGST_EN: + iscsi_set_param(cls_conn, param, buf, buflen); + tcp_conn->hdr_size = sizeof(struct iscsi_hdr); + if (conn->hdrdgst_en) { + tcp_conn->hdr_size += sizeof(__u32); + if (!tcp_conn->tx_tfm) + tcp_conn->tx_tfm = crypto_alloc_tfm("crc32c", + 0); + if (!tcp_conn->tx_tfm) + return -ENOMEM; + if (!tcp_conn->rx_tfm) + tcp_conn->rx_tfm = crypto_alloc_tfm("crc32c", + 0); + if (!tcp_conn->rx_tfm) { + crypto_free_tfm(tcp_conn->tx_tfm); + return -ENOMEM; + } + } else { + if (tcp_conn->tx_tfm) + crypto_free_tfm(tcp_conn->tx_tfm); + if (tcp_conn->rx_tfm) + crypto_free_tfm(tcp_conn->rx_tfm); + } + break; + case ISCSI_PARAM_DATADGST_EN: + iscsi_set_param(cls_conn, param, buf, buflen); + if (conn->datadgst_en) { + if (!tcp_conn->data_tx_tfm) + tcp_conn->data_tx_tfm = + crypto_alloc_tfm("crc32c", 0); + if (!tcp_conn->data_tx_tfm) + return -ENOMEM; + if (!tcp_conn->data_rx_tfm) + tcp_conn->data_rx_tfm = + crypto_alloc_tfm("crc32c", 0); + if (!tcp_conn->data_rx_tfm) { + crypto_free_tfm(tcp_conn->data_tx_tfm); + return -ENOMEM; + } + } else { + if (tcp_conn->data_tx_tfm) + crypto_free_tfm(tcp_conn->data_tx_tfm); + if (tcp_conn->data_rx_tfm) + crypto_free_tfm(tcp_conn->data_rx_tfm); + } + tcp_conn->sendpage = conn->datadgst_en ? + sock_no_sendpage : tcp_conn->sock->ops->sendpage; + break; + case ISCSI_PARAM_MAX_R2T: + sscanf(buf, "%d", &value); + if (session->max_r2t == roundup_pow_of_two(value)) + break; + iscsi_r2tpool_free(session); + iscsi_set_param(cls_conn, param, buf, buflen); + if (session->max_r2t & (session->max_r2t - 1)) + session->max_r2t = roundup_pow_of_two(session->max_r2t); + if (iscsi_r2tpool_alloc(session)) + return -ENOMEM; + break; + default: + return iscsi_set_param(cls_conn, param, buf, buflen); + } - /* initialize write response PDU commands queue */ - conn->writequeue = kfifo_alloc(session->cmds_max * sizeof(void*), - GFP_KERNEL, NULL); - if (conn->writequeue == ERR_PTR(-ENOMEM)) - goto writequeue_alloc_fail; + return 0; +} - /* initialize general immediate & non-immediate PDU commands queue */ - conn->immqueue = kfifo_alloc(session->mgmtpool_max * sizeof(void*), - GFP_KERNEL, NULL); - if (conn->immqueue == ERR_PTR(-ENOMEM)) - goto immqueue_alloc_fail; +static int +iscsi_tcp_conn_get_param(struct iscsi_cls_conn *cls_conn, + enum iscsi_param param, char *buf) +{ + struct iscsi_conn *conn = cls_conn->dd_data; + struct iscsi_tcp_conn *tcp_conn = conn->dd_data; + struct inet_sock *inet; + struct ipv6_pinfo *np; + struct sock *sk; + int len; - conn->mgmtqueue = kfifo_alloc(session->mgmtpool_max * sizeof(void*), - GFP_KERNEL, NULL); - if (conn->mgmtqueue == ERR_PTR(-ENOMEM)) - goto mgmtqueue_alloc_fail; + switch(param) { + case ISCSI_PARAM_CONN_PORT: + mutex_lock(&conn->xmitmutex); + if (!tcp_conn->sock) { + mutex_unlock(&conn->xmitmutex); + return -EINVAL; + } - INIT_WORK(&conn->xmitwork, iscsi_xmitworker, conn); + inet = inet_sk(tcp_conn->sock->sk); + len = sprintf(buf, "%hu\n", be16_to_cpu(inet->dport)); + mutex_unlock(&conn->xmitmutex); + break; + case ISCSI_PARAM_CONN_ADDRESS: + mutex_lock(&conn->xmitmutex); + if (!tcp_conn->sock) { + mutex_unlock(&conn->xmitmutex); + return -EINVAL; + } - /* allocate login_mtask used for the login/text sequences */ - spin_lock_bh(&session->lock); - if (!__kfifo_get(session->mgmtpool.queue, - (void*)&conn->login_mtask, - sizeof(void*))) { - spin_unlock_bh(&session->lock); - goto login_mtask_alloc_fail; + sk = tcp_conn->sock->sk; + if (sk->sk_family == PF_INET) { + inet = inet_sk(sk); + len = sprintf(buf, "%u.%u.%u.%u\n", + NIPQUAD(inet->daddr)); + } else { + np = inet6_sk(sk); + len = sprintf(buf, + "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n", + NIP6(np->daddr)); + } + mutex_unlock(&conn->xmitmutex); + break; + default: + return iscsi_conn_get_param(cls_conn, param, buf); } - spin_unlock_bh(&session->lock); - /* allocate initial PDU receive place holder */ - if (conn->data_size <= PAGE_SIZE) - conn->data = kmalloc(conn->data_size, GFP_KERNEL); - else - conn->data = (void*)__get_free_pages(GFP_KERNEL, - get_order(conn->data_size)); - if (!conn->data) - goto max_recv_dlenght_alloc_fail; - - init_timer(&conn->tmabort_timer); - mutex_init(&conn->xmitmutex); - init_waitqueue_head(&conn->ehwait); - - return cls_conn; - -max_recv_dlenght_alloc_fail: - spin_lock_bh(&session->lock); - __kfifo_put(session->mgmtpool.queue, (void*)&conn->login_mtask, - sizeof(void*)); - spin_unlock_bh(&session->lock); -login_mtask_alloc_fail: - kfifo_free(conn->mgmtqueue); -mgmtqueue_alloc_fail: - kfifo_free(conn->immqueue); -immqueue_alloc_fail: - kfifo_free(conn->writequeue); -writequeue_alloc_fail: - kfifo_free(conn->xmitqueue); -xmitqueue_alloc_fail: - iscsi_destroy_conn(cls_conn); - return NULL; + return len; } static void -iscsi_conn_destroy(struct iscsi_cls_conn *cls_conn) +iscsi_conn_get_stats(struct iscsi_cls_conn *cls_conn, struct iscsi_stats *stats) { struct iscsi_conn *conn = cls_conn->dd_data; - struct iscsi_session *session = conn->session; - unsigned long flags; + struct iscsi_tcp_conn *tcp_conn = conn->dd_data; - mutex_lock(&conn->xmitmutex); - set_bit(SUSPEND_BIT, &conn->suspend_tx); - if (conn->c_stage == ISCSI_CONN_INITIAL_STAGE && conn->sock) { - struct sock *sk = conn->sock->sk; - - /* - * conn_start() has never been called! - * need to cleanup the socket. - */ - write_lock_bh(&sk->sk_callback_lock); - set_bit(SUSPEND_BIT, &conn->suspend_rx); - write_unlock_bh(&sk->sk_callback_lock); + stats->txdata_octets = conn->txdata_octets; + stats->rxdata_octets = conn->rxdata_octets; + stats->scsicmd_pdus = conn->scsicmd_pdus_cnt; + stats->dataout_pdus = conn->dataout_pdus_cnt; + stats->scsirsp_pdus = conn->scsirsp_pdus_cnt; + stats->datain_pdus = conn->datain_pdus_cnt; + stats->r2t_pdus = conn->r2t_pdus_cnt; + stats->tmfcmd_pdus = conn->tmfcmd_pdus_cnt; + stats->tmfrsp_pdus = conn->tmfrsp_pdus_cnt; + stats->custom_length = 3; + strcpy(stats->custom[0].desc, "tx_sendpage_failures"); + stats->custom[0].value = tcp_conn->sendpage_failures_cnt; + strcpy(stats->custom[1].desc, "rx_discontiguous_hdr"); + stats->custom[1].value = tcp_conn->discontiguous_hdr_cnt; + strcpy(stats->custom[2].desc, "eh_abort_cnt"); + stats->custom[2].value = conn->eh_abort_cnt; +} - sock_hold(conn->sock->sk); - iscsi_conn_restore_callbacks(conn); - sock_put(conn->sock->sk); - sock_release(conn->sock); - conn->sock = NULL; - } +static struct iscsi_cls_session * +iscsi_tcp_session_create(struct iscsi_transport *iscsit, + struct scsi_transport_template *scsit, + uint32_t initial_cmdsn, uint32_t *hostno) +{ + struct iscsi_cls_session *cls_session; + struct iscsi_session *session; + uint32_t hn; + int cmd_i; - spin_lock_bh(&session->lock); - conn->c_stage = ISCSI_CONN_CLEANUP_WAIT; - if (session->leadconn == conn) { - /* - * leading connection? then give up on recovery. - */ - session->state = ISCSI_STATE_TERMINATE; - wake_up(&conn->ehwait); - } - spin_unlock_bh(&session->lock); + cls_session = iscsi_session_setup(iscsit, scsit, + sizeof(struct iscsi_tcp_cmd_task), + sizeof(struct iscsi_tcp_mgmt_task), + initial_cmdsn, &hn); + if (!cls_session) + return NULL; + *hostno = hn; - mutex_unlock(&conn->xmitmutex); + session = class_to_transport_session(cls_session); + for (cmd_i = 0; cmd_i < session->cmds_max; cmd_i++) { + struct iscsi_cmd_task *ctask = session->cmds[cmd_i]; + struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; - /* - * Block until all in-progress commands for this connection - * time out or fail. - */ - for (;;) { - spin_lock_irqsave(session->host->host_lock, flags); - if (!session->host->host_busy) { /* OK for ERL == 0 */ - spin_unlock_irqrestore(session->host->host_lock, flags); - break; - } - spin_unlock_irqrestore(session->host->host_lock, flags); - msleep_interruptible(500); - printk("conn_destroy(): host_busy %d host_failed %d\n", - session->host->host_busy, session->host->host_failed); - /* - * force eh_abort() to unblock - */ - wake_up(&conn->ehwait); + ctask->hdr = &tcp_ctask->hdr; } - /* now free crypto */ - if (conn->hdrdgst_en || conn->datadgst_en) { - if (conn->tx_tfm) - crypto_free_tfm(conn->tx_tfm); - if (conn->rx_tfm) - crypto_free_tfm(conn->rx_tfm); - if (conn->data_tx_tfm) - crypto_free_tfm(conn->data_tx_tfm); - if (conn->data_rx_tfm) - crypto_free_tfm(conn->data_rx_tfm); - } + for (cmd_i = 0; cmd_i < session->mgmtpool_max; cmd_i++) { + struct iscsi_mgmt_task *mtask = session->mgmt_cmds[cmd_i]; + struct iscsi_tcp_mgmt_task *tcp_mtask = mtask->dd_data; - /* free conn->data, size = MaxRecvDataSegmentLength */ - if (conn->data_size <= PAGE_SIZE) - kfree(conn->data); - else - free_pages((unsigned long)conn->data, - get_order(conn->data_size)); + mtask->hdr = &tcp_mtask->hdr; + } - spin_lock_bh(&session->lock); - __kfifo_put(session->mgmtpool.queue, (void*)&conn->login_mtask, - sizeof(void*)); - list_del(&conn->item); - if (list_empty(&session->connections)) - session->leadconn = NULL; - if (session->leadconn && session->leadconn == conn) - session->leadconn = container_of(session->connections.next, - struct iscsi_conn, item); - - if (session->leadconn == NULL) - /* none connections exits.. reset sequencing */ - session->cmdsn = session->max_cmdsn = session->exp_cmdsn = 1; - spin_unlock_bh(&session->lock); + if (iscsi_r2tpool_alloc(class_to_transport_session(cls_session))) + goto r2tpool_alloc_fail; - kfifo_free(conn->xmitqueue); - kfifo_free(conn->writequeue); - kfifo_free(conn->immqueue); - kfifo_free(conn->mgmtqueue); + return cls_session; - iscsi_destroy_conn(cls_conn); +r2tpool_alloc_fail: + iscsi_session_teardown(cls_session); + return NULL; } -static int -iscsi_conn_bind(struct iscsi_cls_session *cls_session, - struct iscsi_cls_conn *cls_conn, uint32_t transport_fd, - int is_leading) +static void iscsi_tcp_session_destroy(struct iscsi_cls_session *cls_session) { - struct Scsi_Host *shost = iscsi_session_to_shost(cls_session); - struct iscsi_session *session = iscsi_hostdata(shost->hostdata); - struct iscsi_conn *tmp = ERR_PTR(-EEXIST), *conn = cls_conn->dd_data; - struct sock *sk; - struct socket *sock; - int err; - - /* lookup for existing socket */ - sock = sockfd_lookup(transport_fd, &err); - if (!sock) { - printk(KERN_ERR "iscsi_tcp: sockfd_lookup failed %d\n", err); - return -EEXIST; - } - - /* lookup for existing connection */ - spin_lock_bh(&session->lock); - list_for_each_entry(tmp, &session->connections, item) { - if (tmp == conn) { - if (conn->c_stage != ISCSI_CONN_STOPPED || - conn->stop_stage == STOP_CONN_TERM) { - printk(KERN_ERR "iscsi_tcp: can't bind " - "non-stopped connection (%d:%d)\n", - conn->c_stage, conn->stop_stage); - spin_unlock_bh(&session->lock); - return -EIO; - } - break; - } - } - if (tmp != conn) { - /* bind new iSCSI connection to session */ - conn->session = session; - - list_add(&conn->item, &session->connections); - } - spin_unlock_bh(&session->lock); - - if (conn->stop_stage != STOP_CONN_SUSPEND) { - /* bind iSCSI connection and socket */ - conn->sock = sock; - - /* setup Socket parameters */ - sk = sock->sk; - sk->sk_reuse = 1; - sk->sk_sndtimeo = 15 * HZ; /* FIXME: make it configurable */ - sk->sk_allocation = GFP_ATOMIC; - - /* FIXME: disable Nagle's algorithm */ - - /* - * Intercept TCP callbacks for sendfile like receive - * processing. - */ - iscsi_conn_set_callbacks(conn); - - conn->sendpage = conn->sock->ops->sendpage; - - /* - * set receive state machine into initial state - */ - conn->in_progress = IN_PROGRESS_WAIT_HEADER; - } - - if (is_leading) - session->leadconn = conn; - - /* - * Unblock xmitworker(), Login Phase will pass through. - */ - clear_bit(SUSPEND_BIT, &conn->suspend_rx); - clear_bit(SUSPEND_BIT, &conn->suspend_tx); - - return 0; -} - -static int -iscsi_conn_start(struct iscsi_cls_conn *cls_conn) -{ - struct iscsi_conn *conn = cls_conn->dd_data; - struct iscsi_session *session = conn->session; - struct sock *sk; - - /* FF phase warming up... */ - - if (session == NULL) { - printk(KERN_ERR "iscsi_tcp: can't start unbound connection\n"); - return -EPERM; - } - - sk = conn->sock->sk; - - write_lock_bh(&sk->sk_callback_lock); - spin_lock_bh(&session->lock); - conn->c_stage = ISCSI_CONN_STARTED; - session->state = ISCSI_STATE_LOGGED_IN; - - switch(conn->stop_stage) { - case STOP_CONN_RECOVER: - /* - * unblock eh_abort() if it is blocked. re-try all - * commands after successful recovery - */ - session->conn_cnt++; - conn->stop_stage = 0; - conn->tmabort_state = TMABORT_INITIAL; - session->age++; - wake_up(&conn->ehwait); - break; - case STOP_CONN_TERM: - session->conn_cnt++; - conn->stop_stage = 0; - break; - case STOP_CONN_SUSPEND: - conn->stop_stage = 0; - clear_bit(SUSPEND_BIT, &conn->suspend_rx); - clear_bit(SUSPEND_BIT, &conn->suspend_tx); - break; - default: - break; - } - spin_unlock_bh(&session->lock); - write_unlock_bh(&sk->sk_callback_lock); - - return 0; -} - -static void -iscsi_conn_stop(struct iscsi_cls_conn *cls_conn, int flag) -{ - struct iscsi_conn *conn = cls_conn->dd_data; - struct iscsi_session *session = conn->session; - struct sock *sk; - unsigned long flags; - - BUG_ON(!conn->sock); - sk = conn->sock->sk; - write_lock_bh(&sk->sk_callback_lock); - set_bit(SUSPEND_BIT, &conn->suspend_rx); - write_unlock_bh(&sk->sk_callback_lock); - - mutex_lock(&conn->xmitmutex); - - spin_lock_irqsave(session->host->host_lock, flags); - spin_lock(&session->lock); - conn->stop_stage = flag; - conn->c_stage = ISCSI_CONN_STOPPED; - set_bit(SUSPEND_BIT, &conn->suspend_tx); - - if (flag != STOP_CONN_SUSPEND) - session->conn_cnt--; - - if (session->conn_cnt == 0 || session->leadconn == conn) - session->state = ISCSI_STATE_FAILED; - - spin_unlock(&session->lock); - spin_unlock_irqrestore(session->host->host_lock, flags); - - if (flag == STOP_CONN_TERM || flag == STOP_CONN_RECOVER) { - struct iscsi_cmd_task *ctask; - struct iscsi_mgmt_task *mtask; - - /* - * Socket must go now. - */ - sock_hold(conn->sock->sk); - iscsi_conn_restore_callbacks(conn); - sock_put(conn->sock->sk); - - /* - * flush xmit queues. - */ - spin_lock_bh(&session->lock); - while (__kfifo_get(conn->writequeue, (void*)&ctask, - sizeof(void*)) || - __kfifo_get(conn->xmitqueue, (void*)&ctask, - sizeof(void*))) { - struct iscsi_r2t_info *r2t; - - /* - * flush ctask's r2t queues - */ - while (__kfifo_get(ctask->r2tqueue, (void*)&r2t, - sizeof(void*))) - __kfifo_put(ctask->r2tpool.queue, (void*)&r2t, - sizeof(void*)); - - spin_unlock_bh(&session->lock); - local_bh_disable(); - iscsi_ctask_cleanup(conn, ctask); - local_bh_enable(); - spin_lock_bh(&session->lock); - } - conn->ctask = NULL; - while (__kfifo_get(conn->immqueue, (void*)&mtask, - sizeof(void*)) || - __kfifo_get(conn->mgmtqueue, (void*)&mtask, - sizeof(void*))) { - __kfifo_put(session->mgmtpool.queue, - (void*)&mtask, sizeof(void*)); - } - conn->mtask = NULL; - spin_unlock_bh(&session->lock); - - /* - * release socket only after we stopped data_xmit() - * activity and flushed all outstandings - */ - sock_release(conn->sock); - conn->sock = NULL; - - /* - * for connection level recovery we should not calculate - * header digest. conn->hdr_size used for optimization - * in hdr_extract() and will be re-negotiated at - * set_param() time. - */ - if (flag == STOP_CONN_RECOVER) { - conn->hdr_size = sizeof(struct iscsi_hdr); - conn->hdrdgst_en = 0; - conn->datadgst_en = 0; - } - } - mutex_unlock(&conn->xmitmutex); -} - -static int -iscsi_conn_send_generic(struct iscsi_conn *conn, struct iscsi_hdr *hdr, - char *data, uint32_t data_size) -{ - struct iscsi_session *session = conn->session; - struct iscsi_nopout *nop = (struct iscsi_nopout *)hdr; - struct iscsi_mgmt_task *mtask; - - spin_lock_bh(&session->lock); - if (session->state == ISCSI_STATE_TERMINATE) { - spin_unlock_bh(&session->lock); - return -EPERM; - } - if (hdr->opcode == (ISCSI_OP_LOGIN | ISCSI_OP_IMMEDIATE) || - hdr->opcode == (ISCSI_OP_TEXT | ISCSI_OP_IMMEDIATE)) - /* - * Login and Text are sent serially, in - * request-followed-by-response sequence. - * Same mtask can be used. Same ITT must be used. - * Note that login_mtask is preallocated at conn_create(). - */ - mtask = conn->login_mtask; - else { - BUG_ON(conn->c_stage == ISCSI_CONN_INITIAL_STAGE); - BUG_ON(conn->c_stage == ISCSI_CONN_STOPPED); - - if (!__kfifo_get(session->mgmtpool.queue, - (void*)&mtask, sizeof(void*))) { - spin_unlock_bh(&session->lock); - return -ENOSPC; - } - } - - /* - * pre-format CmdSN and ExpStatSN for outgoing PDU. - */ - if (hdr->itt != cpu_to_be32(ISCSI_RESERVED_TAG)) { - hdr->itt = mtask->itt | (conn->id << CID_SHIFT) | - (session->age << AGE_SHIFT); - nop->cmdsn = cpu_to_be32(session->cmdsn); - if (conn->c_stage == ISCSI_CONN_STARTED && - !(hdr->opcode & ISCSI_OP_IMMEDIATE)) - session->cmdsn++; - } else - /* do not advance CmdSN */ - nop->cmdsn = cpu_to_be32(session->cmdsn); - - nop->exp_statsn = cpu_to_be32(conn->exp_statsn); - - memcpy(&mtask->hdr, hdr, sizeof(struct iscsi_hdr)); - - iscsi_buf_init_virt(&mtask->headbuf, (char*)&mtask->hdr, - sizeof(struct iscsi_hdr)); - - spin_unlock_bh(&session->lock); - - if (data_size) { - memcpy(mtask->data, data, data_size); - mtask->data_count = data_size; - } else - mtask->data_count = 0; - - mtask->xmstate = XMSTATE_IMM_HDR; - - if (mtask->data_count) { - iscsi_buf_init_iov(&mtask->sendbuf, (char*)mtask->data, - mtask->data_count); - } - - debug_scsi("mgmtpdu [op 0x%x hdr->itt 0x%x datalen %d]\n", - hdr->opcode, hdr->itt, data_size); - - /* - * since send_pdu() could be called at least from two contexts, - * we need to serialize __kfifo_put, so we don't have to take - * additional lock on fast data-path - */ - if (hdr->opcode & ISCSI_OP_IMMEDIATE) - __kfifo_put(conn->immqueue, (void*)&mtask, sizeof(void*)); - else - __kfifo_put(conn->mgmtqueue, (void*)&mtask, sizeof(void*)); - - scsi_queue_work(session->host, &conn->xmitwork); - return 0; -} - -static int -iscsi_eh_host_reset(struct scsi_cmnd *sc) -{ - struct iscsi_cmd_task *ctask = (struct iscsi_cmd_task *)sc->SCp.ptr; - struct iscsi_conn *conn = ctask->conn; - struct iscsi_session *session = conn->session; - - spin_lock_bh(&session->lock); - if (session->state == ISCSI_STATE_TERMINATE) { - debug_scsi("failing host reset: session terminated " - "[CID %d age %d]", conn->id, session->age); - spin_unlock_bh(&session->lock); - return FAILED; - } - spin_unlock_bh(&session->lock); - - debug_scsi("failing connection CID %d due to SCSI host reset " - "[itt 0x%x age %d]", conn->id, ctask->itt, - session->age); - iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); - - return SUCCESS; -} - -static void -iscsi_tmabort_timedout(unsigned long data) -{ - struct iscsi_cmd_task *ctask = (struct iscsi_cmd_task *)data; - struct iscsi_conn *conn = ctask->conn; - struct iscsi_session *session = conn->session; - - spin_lock(&session->lock); - if (conn->tmabort_state == TMABORT_INITIAL) { - __kfifo_put(session->mgmtpool.queue, - (void*)&ctask->mtask, sizeof(void*)); - conn->tmabort_state = TMABORT_TIMEDOUT; - debug_scsi("tmabort timedout [sc %lx itt 0x%x]\n", - (long)ctask->sc, ctask->itt); - /* unblock eh_abort() */ - wake_up(&conn->ehwait); - } - spin_unlock(&session->lock); -} - -static int -iscsi_eh_abort(struct scsi_cmnd *sc) -{ - int rc; - struct iscsi_cmd_task *ctask = (struct iscsi_cmd_task *)sc->SCp.ptr; - struct iscsi_conn *conn = ctask->conn; - struct iscsi_session *session = conn->session; - - conn->eh_abort_cnt++; - debug_scsi("aborting [sc %lx itt 0x%x]\n", (long)sc, ctask->itt); - - /* - * two cases for ERL=0 here: - * - * 1) connection-level failure; - * 2) recovery due protocol error; - */ - mutex_lock(&conn->xmitmutex); - spin_lock_bh(&session->lock); - if (session->state != ISCSI_STATE_LOGGED_IN) { - if (session->state == ISCSI_STATE_TERMINATE) { - spin_unlock_bh(&session->lock); - mutex_unlock(&conn->xmitmutex); - goto failed; - } - spin_unlock_bh(&session->lock); - } else { - struct iscsi_tm *hdr = &conn->tmhdr; - - /* - * Still LOGGED_IN... - */ - - if (!ctask->sc || sc->SCp.phase != session->age) { - /* - * 1) ctask completed before time out. But session - * is still ok => Happy Retry. - * 2) session was re-open during time out of ctask. - */ - spin_unlock_bh(&session->lock); - mutex_unlock(&conn->xmitmutex); - goto success; - } - conn->tmabort_state = TMABORT_INITIAL; - spin_unlock_bh(&session->lock); - - /* - * ctask timed out but session is OK - * ERL=0 requires task mgmt abort to be issued on each - * failed command. requests must be serialized. - */ - memset(hdr, 0, sizeof(struct iscsi_tm)); - hdr->opcode = ISCSI_OP_SCSI_TMFUNC | ISCSI_OP_IMMEDIATE; - hdr->flags = ISCSI_TM_FUNC_ABORT_TASK; - hdr->flags |= ISCSI_FLAG_CMD_FINAL; - memcpy(hdr->lun, ctask->hdr.lun, sizeof(hdr->lun)); - hdr->rtt = ctask->hdr.itt; - hdr->refcmdsn = ctask->hdr.cmdsn; - - rc = iscsi_conn_send_generic(conn, (struct iscsi_hdr *)hdr, - NULL, 0); - if (rc) { - iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); - debug_scsi("abort sent failure [itt 0x%x]", ctask->itt); - } else { - struct iscsi_r2t_info *r2t; - - /* - * TMF abort vs. TMF response race logic - */ - spin_lock_bh(&session->lock); - ctask->mtask = (struct iscsi_mgmt_task *) - session->mgmt_cmds[(hdr->itt & ITT_MASK) - - ISCSI_MGMT_ITT_OFFSET]; - /* - * have to flush r2tqueue to avoid r2t leaks - */ - while (__kfifo_get(ctask->r2tqueue, (void*)&r2t, - sizeof(void*))) { - __kfifo_put(ctask->r2tpool.queue, (void*)&r2t, - sizeof(void*)); - } - if (conn->tmabort_state == TMABORT_INITIAL) { - conn->tmfcmd_pdus_cnt++; - conn->tmabort_timer.expires = 3*HZ + jiffies; - conn->tmabort_timer.function = - iscsi_tmabort_timedout; - conn->tmabort_timer.data = (unsigned long)ctask; - add_timer(&conn->tmabort_timer); - debug_scsi("abort sent [itt 0x%x]", ctask->itt); - } else { - if (!ctask->sc || - conn->tmabort_state == TMABORT_SUCCESS) { - conn->tmabort_state = TMABORT_INITIAL; - spin_unlock_bh(&session->lock); - mutex_unlock(&conn->xmitmutex); - goto success; - } - conn->tmabort_state = TMABORT_INITIAL; - iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); - } - spin_unlock_bh(&session->lock); - } - } - mutex_unlock(&conn->xmitmutex); - - - /* - * block eh thread until: - * - * 1) abort response; - * 2) abort timeout; - * 3) session re-opened; - * 4) session terminated; - */ - for (;;) { - int p_state = session->state; - - rc = wait_event_interruptible(conn->ehwait, - (p_state == ISCSI_STATE_LOGGED_IN ? - (session->state == ISCSI_STATE_TERMINATE || - conn->tmabort_state != TMABORT_INITIAL) : - (session->state == ISCSI_STATE_TERMINATE || - session->state == ISCSI_STATE_LOGGED_IN))); - if (rc) { - /* shutdown.. */ - session->state = ISCSI_STATE_TERMINATE; - goto failed; - } - - if (signal_pending(current)) - flush_signals(current); - - if (session->state == ISCSI_STATE_TERMINATE) - goto failed; - - spin_lock_bh(&session->lock); - if (sc->SCp.phase == session->age && - (conn->tmabort_state == TMABORT_TIMEDOUT || - conn->tmabort_state == TMABORT_FAILED)) { - conn->tmabort_state = TMABORT_INITIAL; - if (!ctask->sc) { - /* - * ctask completed before tmf abort response or - * time out. - * But session is still ok => Happy Retry. - */ - spin_unlock_bh(&session->lock); - break; - } - spin_unlock_bh(&session->lock); - iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); - continue; - } - spin_unlock_bh(&session->lock); - break; - } - -success: - debug_scsi("abort success [sc %lx itt 0x%x]\n", (long)sc, ctask->itt); - rc = SUCCESS; - goto exit; - -failed: - debug_scsi("abort failed [sc %lx itt 0x%x]\n", (long)sc, ctask->itt); - rc = FAILED; - -exit: - del_timer_sync(&conn->tmabort_timer); - - mutex_lock(&conn->xmitmutex); - if (conn->sock) { - struct sock *sk = conn->sock->sk; - - write_lock_bh(&sk->sk_callback_lock); - iscsi_ctask_cleanup(conn, ctask); - write_unlock_bh(&sk->sk_callback_lock); - } - mutex_unlock(&conn->xmitmutex); - return rc; -} - -static int -iscsi_r2tpool_alloc(struct iscsi_session *session) -{ - int i; - int cmd_i; - - /* - * initialize per-task: R2T pool and xmit queue - */ - for (cmd_i = 0; cmd_i < session->cmds_max; cmd_i++) { - struct iscsi_cmd_task *ctask = session->cmds[cmd_i]; - - /* - * pre-allocated x4 as much r2ts to handle race when - * target acks DataOut faster than we data_xmit() queues - * could replenish r2tqueue. - */ - - /* R2T pool */ - if (iscsi_pool_init(&ctask->r2tpool, session->max_r2t * 4, - (void***)&ctask->r2ts, sizeof(struct iscsi_r2t_info))) { - goto r2t_alloc_fail; - } - - /* R2T xmit queue */ - ctask->r2tqueue = kfifo_alloc( - session->max_r2t * 4 * sizeof(void*), GFP_KERNEL, NULL); - if (ctask->r2tqueue == ERR_PTR(-ENOMEM)) { - iscsi_pool_free(&ctask->r2tpool, (void**)ctask->r2ts); - goto r2t_alloc_fail; - } - - /* - * number of - * Data-Out PDU's within R2T-sequence can be quite big; - * using mempool - */ - ctask->datapool = mempool_create_slab_pool(ISCSI_DTASK_DEFAULT_MAX, - taskcache); - if (ctask->datapool == NULL) { - kfifo_free(ctask->r2tqueue); - iscsi_pool_free(&ctask->r2tpool, (void**)ctask->r2ts); - goto r2t_alloc_fail; - } - INIT_LIST_HEAD(&ctask->dataqueue); - } - - return 0; - -r2t_alloc_fail: - for (i = 0; i < cmd_i; i++) { - mempool_destroy(session->cmds[i]->datapool); - kfifo_free(session->cmds[i]->r2tqueue); - iscsi_pool_free(&session->cmds[i]->r2tpool, - (void**)session->cmds[i]->r2ts); - } - return -ENOMEM; -} - -static void -iscsi_r2tpool_free(struct iscsi_session *session) -{ - int i; - - for (i = 0; i < session->cmds_max; i++) { - mempool_destroy(session->cmds[i]->datapool); - kfifo_free(session->cmds[i]->r2tqueue); - iscsi_pool_free(&session->cmds[i]->r2tpool, - (void**)session->cmds[i]->r2ts); - } -} + iscsi_r2tpool_free(class_to_transport_session(cls_session)); + iscsi_session_teardown(cls_session); +} static struct scsi_host_template iscsi_sht = { - .name = "iSCSI Initiator over TCP/IP, v." - ISCSI_VERSION_STR, + .name = "iSCSI Initiator over TCP/IP", .queuecommand = iscsi_queuecommand, .change_queue_depth = iscsi_change_queue_depth, .can_queue = ISCSI_XMIT_CMDS_MAX - 1, @@ -3250,401 +2327,70 @@ static struct scsi_host_template iscsi_sht = { .this_id = -1, }; -static struct iscsi_transport iscsi_tcp_transport; - -static struct iscsi_cls_session * -iscsi_session_create(struct scsi_transport_template *scsit, - uint32_t initial_cmdsn, uint32_t *sid) -{ - struct Scsi_Host *shost; - struct iscsi_session *session; - int cmd_i; - - shost = iscsi_transport_create_session(scsit, &iscsi_tcp_transport); - if (!shost) - return NULL; - - session = iscsi_hostdata(shost->hostdata); - memset(session, 0, sizeof(struct iscsi_session)); - session->host = shost; - session->state = ISCSI_STATE_FREE; - session->mgmtpool_max = ISCSI_MGMT_CMDS_MAX; - session->cmds_max = ISCSI_XMIT_CMDS_MAX; - session->cmdsn = initial_cmdsn; - session->exp_cmdsn = initial_cmdsn + 1; - session->max_cmdsn = initial_cmdsn + 1; - session->max_r2t = 1; - *sid = shost->host_no; - - /* initialize SCSI PDU commands pool */ - if (iscsi_pool_init(&session->cmdpool, session->cmds_max, - (void***)&session->cmds, sizeof(struct iscsi_cmd_task))) - goto cmdpool_alloc_fail; - - /* pre-format cmds pool with ITT */ - for (cmd_i = 0; cmd_i < session->cmds_max; cmd_i++) - session->cmds[cmd_i]->itt = cmd_i; - - spin_lock_init(&session->lock); - INIT_LIST_HEAD(&session->connections); - - /* initialize immediate command pool */ - if (iscsi_pool_init(&session->mgmtpool, session->mgmtpool_max, - (void***)&session->mgmt_cmds, sizeof(struct iscsi_mgmt_task))) - goto mgmtpool_alloc_fail; - - - /* pre-format immediate cmds pool with ITT */ - for (cmd_i = 0; cmd_i < session->mgmtpool_max; cmd_i++) { - session->mgmt_cmds[cmd_i]->itt = ISCSI_MGMT_ITT_OFFSET + cmd_i; - session->mgmt_cmds[cmd_i]->data = kmalloc( - DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH, GFP_KERNEL); - if (!session->mgmt_cmds[cmd_i]->data) { - int j; - - for (j = 0; j < cmd_i; j++) - kfree(session->mgmt_cmds[j]->data); - goto immdata_alloc_fail; - } - } - - if (iscsi_r2tpool_alloc(session)) - goto r2tpool_alloc_fail; - - return hostdata_session(shost->hostdata); - -r2tpool_alloc_fail: - for (cmd_i = 0; cmd_i < session->mgmtpool_max; cmd_i++) - kfree(session->mgmt_cmds[cmd_i]->data); -immdata_alloc_fail: - iscsi_pool_free(&session->mgmtpool, (void**)session->mgmt_cmds); -mgmtpool_alloc_fail: - iscsi_pool_free(&session->cmdpool, (void**)session->cmds); -cmdpool_alloc_fail: - iscsi_transport_destroy_session(shost); - return NULL; -} - -static void -iscsi_session_destroy(struct iscsi_cls_session *cls_session) -{ - struct Scsi_Host *shost = iscsi_session_to_shost(cls_session); - struct iscsi_session *session = iscsi_hostdata(shost->hostdata); - int cmd_i; - struct iscsi_data_task *dtask, *n; - - for (cmd_i = 0; cmd_i < session->cmds_max; cmd_i++) { - struct iscsi_cmd_task *ctask = session->cmds[cmd_i]; - list_for_each_entry_safe(dtask, n, &ctask->dataqueue, item) { - list_del(&dtask->item); - mempool_free(dtask, ctask->datapool); - } - } - - for (cmd_i = 0; cmd_i < session->mgmtpool_max; cmd_i++) - kfree(session->mgmt_cmds[cmd_i]->data); - - iscsi_r2tpool_free(session); - iscsi_pool_free(&session->mgmtpool, (void**)session->mgmt_cmds); - iscsi_pool_free(&session->cmdpool, (void**)session->cmds); - - iscsi_transport_destroy_session(shost); -} - -static int -iscsi_conn_set_param(struct iscsi_cls_conn *cls_conn, enum iscsi_param param, - uint32_t value) -{ - struct iscsi_conn *conn = cls_conn->dd_data; - struct iscsi_session *session = conn->session; - - spin_lock_bh(&session->lock); - if (conn->c_stage != ISCSI_CONN_INITIAL_STAGE && - conn->stop_stage != STOP_CONN_RECOVER) { - printk(KERN_ERR "iscsi_tcp: can not change parameter [%d]\n", - param); - spin_unlock_bh(&session->lock); - return 0; - } - spin_unlock_bh(&session->lock); - - switch(param) { - case ISCSI_PARAM_MAX_RECV_DLENGTH: { - char *saveptr = conn->data; - gfp_t flags = GFP_KERNEL; - - if (conn->data_size >= value) { - conn->max_recv_dlength = value; - break; - } - - spin_lock_bh(&session->lock); - if (conn->stop_stage == STOP_CONN_RECOVER) - flags = GFP_ATOMIC; - spin_unlock_bh(&session->lock); - - if (value <= PAGE_SIZE) - conn->data = kmalloc(value, flags); - else - conn->data = (void*)__get_free_pages(flags, - get_order(value)); - if (conn->data == NULL) { - conn->data = saveptr; - return -ENOMEM; - } - if (conn->data_size <= PAGE_SIZE) - kfree(saveptr); - else - free_pages((unsigned long)saveptr, - get_order(conn->data_size)); - conn->max_recv_dlength = value; - conn->data_size = value; - } - break; - case ISCSI_PARAM_MAX_XMIT_DLENGTH: - conn->max_xmit_dlength = value; - break; - case ISCSI_PARAM_HDRDGST_EN: - conn->hdrdgst_en = value; - conn->hdr_size = sizeof(struct iscsi_hdr); - if (conn->hdrdgst_en) { - conn->hdr_size += sizeof(__u32); - if (!conn->tx_tfm) - conn->tx_tfm = crypto_alloc_tfm("crc32c", 0); - if (!conn->tx_tfm) - return -ENOMEM; - if (!conn->rx_tfm) - conn->rx_tfm = crypto_alloc_tfm("crc32c", 0); - if (!conn->rx_tfm) { - crypto_free_tfm(conn->tx_tfm); - return -ENOMEM; - } - } else { - if (conn->tx_tfm) - crypto_free_tfm(conn->tx_tfm); - if (conn->rx_tfm) - crypto_free_tfm(conn->rx_tfm); - } - break; - case ISCSI_PARAM_DATADGST_EN: - conn->datadgst_en = value; - if (conn->datadgst_en) { - if (!conn->data_tx_tfm) - conn->data_tx_tfm = - crypto_alloc_tfm("crc32c", 0); - if (!conn->data_tx_tfm) - return -ENOMEM; - if (!conn->data_rx_tfm) - conn->data_rx_tfm = - crypto_alloc_tfm("crc32c", 0); - if (!conn->data_rx_tfm) { - crypto_free_tfm(conn->data_tx_tfm); - return -ENOMEM; - } - } else { - if (conn->data_tx_tfm) - crypto_free_tfm(conn->data_tx_tfm); - if (conn->data_rx_tfm) - crypto_free_tfm(conn->data_rx_tfm); - } - conn->sendpage = conn->datadgst_en ? - sock_no_sendpage : conn->sock->ops->sendpage; - break; - case ISCSI_PARAM_INITIAL_R2T_EN: - session->initial_r2t_en = value; - break; - case ISCSI_PARAM_MAX_R2T: - if (session->max_r2t == roundup_pow_of_two(value)) - break; - iscsi_r2tpool_free(session); - session->max_r2t = value; - if (session->max_r2t & (session->max_r2t - 1)) - session->max_r2t = roundup_pow_of_two(session->max_r2t); - if (iscsi_r2tpool_alloc(session)) - return -ENOMEM; - break; - case ISCSI_PARAM_IMM_DATA_EN: - session->imm_data_en = value; - break; - case ISCSI_PARAM_FIRST_BURST: - session->first_burst = value; - break; - case ISCSI_PARAM_MAX_BURST: - session->max_burst = value; - break; - case ISCSI_PARAM_PDU_INORDER_EN: - session->pdu_inorder_en = value; - break; - case ISCSI_PARAM_DATASEQ_INORDER_EN: - session->dataseq_inorder_en = value; - break; - case ISCSI_PARAM_ERL: - session->erl = value; - break; - case ISCSI_PARAM_IFMARKER_EN: - BUG_ON(value); - session->ifmarker_en = value; - break; - case ISCSI_PARAM_OFMARKER_EN: - BUG_ON(value); - session->ofmarker_en = value; - break; - default: - break; - } - - return 0; -} - -static int -iscsi_session_get_param(struct iscsi_cls_session *cls_session, - enum iscsi_param param, uint32_t *value) -{ - struct Scsi_Host *shost = iscsi_session_to_shost(cls_session); - struct iscsi_session *session = iscsi_hostdata(shost->hostdata); - - switch(param) { - case ISCSI_PARAM_INITIAL_R2T_EN: - *value = session->initial_r2t_en; - break; - case ISCSI_PARAM_MAX_R2T: - *value = session->max_r2t; - break; - case ISCSI_PARAM_IMM_DATA_EN: - *value = session->imm_data_en; - break; - case ISCSI_PARAM_FIRST_BURST: - *value = session->first_burst; - break; - case ISCSI_PARAM_MAX_BURST: - *value = session->max_burst; - break; - case ISCSI_PARAM_PDU_INORDER_EN: - *value = session->pdu_inorder_en; - break; - case ISCSI_PARAM_DATASEQ_INORDER_EN: - *value = session->dataseq_inorder_en; - break; - case ISCSI_PARAM_ERL: - *value = session->erl; - break; - case ISCSI_PARAM_IFMARKER_EN: - *value = session->ifmarker_en; - break; - case ISCSI_PARAM_OFMARKER_EN: - *value = session->ofmarker_en; - break; - default: - return ISCSI_ERR_PARAM_NOT_FOUND; - } - - return 0; -} - -static int -iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn, - enum iscsi_param param, uint32_t *value) -{ - struct iscsi_conn *conn = cls_conn->dd_data; - - switch(param) { - case ISCSI_PARAM_MAX_RECV_DLENGTH: - *value = conn->max_recv_dlength; - break; - case ISCSI_PARAM_MAX_XMIT_DLENGTH: - *value = conn->max_xmit_dlength; - break; - case ISCSI_PARAM_HDRDGST_EN: - *value = conn->hdrdgst_en; - break; - case ISCSI_PARAM_DATADGST_EN: - *value = conn->datadgst_en; - break; - default: - return ISCSI_ERR_PARAM_NOT_FOUND; - } - - return 0; -} - -static void -iscsi_conn_get_stats(struct iscsi_cls_conn *cls_conn, struct iscsi_stats *stats) -{ - struct iscsi_conn *conn = cls_conn->dd_data; - - stats->txdata_octets = conn->txdata_octets; - stats->rxdata_octets = conn->rxdata_octets; - stats->scsicmd_pdus = conn->scsicmd_pdus_cnt; - stats->dataout_pdus = conn->dataout_pdus_cnt; - stats->scsirsp_pdus = conn->scsirsp_pdus_cnt; - stats->datain_pdus = conn->datain_pdus_cnt; - stats->r2t_pdus = conn->r2t_pdus_cnt; - stats->tmfcmd_pdus = conn->tmfcmd_pdus_cnt; - stats->tmfrsp_pdus = conn->tmfrsp_pdus_cnt; - stats->custom_length = 3; - strcpy(stats->custom[0].desc, "tx_sendpage_failures"); - stats->custom[0].value = conn->sendpage_failures_cnt; - strcpy(stats->custom[1].desc, "rx_discontiguous_hdr"); - stats->custom[1].value = conn->discontiguous_hdr_cnt; - strcpy(stats->custom[2].desc, "eh_abort_cnt"); - stats->custom[2].value = conn->eh_abort_cnt; -} - -static int -iscsi_conn_send_pdu(struct iscsi_cls_conn *cls_conn, struct iscsi_hdr *hdr, - char *data, uint32_t data_size) -{ - struct iscsi_conn *conn = cls_conn->dd_data; - int rc; - - mutex_lock(&conn->xmitmutex); - rc = iscsi_conn_send_generic(conn, hdr, data, data_size); - mutex_unlock(&conn->xmitmutex); - - return rc; -} - static struct iscsi_transport iscsi_tcp_transport = { .owner = THIS_MODULE, .name = "tcp", .caps = CAP_RECOVERY_L0 | CAP_MULTI_R2T | CAP_HDRDGST | CAP_DATADGST, + .param_mask = ISCSI_MAX_RECV_DLENGTH | + ISCSI_MAX_XMIT_DLENGTH | + ISCSI_HDRDGST_EN | + ISCSI_DATADGST_EN | + ISCSI_INITIAL_R2T_EN | + ISCSI_MAX_R2T | + ISCSI_IMM_DATA_EN | + ISCSI_FIRST_BURST | + ISCSI_MAX_BURST | + ISCSI_PDU_INORDER_EN | + ISCSI_DATASEQ_INORDER_EN | + ISCSI_ERL | + ISCSI_CONN_PORT | + ISCSI_CONN_ADDRESS | + ISCSI_EXP_STATSN | + ISCSI_PERSISTENT_PORT | + ISCSI_PERSISTENT_ADDRESS | + ISCSI_TARGET_NAME | + ISCSI_TPGT, .host_template = &iscsi_sht, - .hostdata_size = sizeof(struct iscsi_session), .conndata_size = sizeof(struct iscsi_conn), .max_conn = 1, .max_cmd_len = ISCSI_TCP_MAX_CMD_LEN, - .create_session = iscsi_session_create, - .destroy_session = iscsi_session_destroy, - .create_conn = iscsi_conn_create, - .bind_conn = iscsi_conn_bind, - .destroy_conn = iscsi_conn_destroy, + /* session management */ + .create_session = iscsi_tcp_session_create, + .destroy_session = iscsi_tcp_session_destroy, + /* connection management */ + .create_conn = iscsi_tcp_conn_create, + .bind_conn = iscsi_tcp_conn_bind, + .destroy_conn = iscsi_tcp_conn_destroy, .set_param = iscsi_conn_set_param, - .get_conn_param = iscsi_conn_get_param, + .get_conn_param = iscsi_tcp_conn_get_param, .get_session_param = iscsi_session_get_param, .start_conn = iscsi_conn_start, - .stop_conn = iscsi_conn_stop, + .stop_conn = iscsi_tcp_conn_stop, + /* IO */ .send_pdu = iscsi_conn_send_pdu, .get_stats = iscsi_conn_get_stats, + .init_cmd_task = iscsi_tcp_cmd_init, + .init_mgmt_task = iscsi_tcp_mgmt_init, + .xmit_cmd_task = iscsi_tcp_ctask_xmit, + .xmit_mgmt_task = iscsi_tcp_mtask_xmit, + .cleanup_cmd_task = iscsi_tcp_cleanup_ctask, + /* recovery */ + .session_recovery_timedout = iscsi_session_recovery_timedout, }; static int __init iscsi_tcp_init(void) { if (iscsi_max_lun < 1) { - printk(KERN_ERR "Invalid max_lun value of %u\n", iscsi_max_lun); + printk(KERN_ERR "iscsi_tcp: Invalid max_lun value of %u\n", + iscsi_max_lun); return -EINVAL; } iscsi_tcp_transport.max_lun = iscsi_max_lun; - taskcache = kmem_cache_create("iscsi_taskcache", - sizeof(struct iscsi_data_task), 0, - SLAB_HWCACHE_ALIGN, NULL, NULL); - if (!taskcache) - return -ENOMEM; - if (!iscsi_register_transport(&iscsi_tcp_transport)) - kmem_cache_destroy(taskcache); + return -ENODEV; return 0; } @@ -3653,7 +2399,6 @@ static void __exit iscsi_tcp_exit(void) { iscsi_unregister_transport(&iscsi_tcp_transport); - kmem_cache_destroy(taskcache); } module_init(iscsi_tcp_init); diff --git a/drivers/scsi/iscsi_tcp.h b/drivers/scsi/iscsi_tcp.h index ba26741ac..6a4ee704e 100644 --- a/drivers/scsi/iscsi_tcp.h +++ b/drivers/scsi/iscsi_tcp.h @@ -2,7 +2,8 @@ * iSCSI Initiator TCP Transport * Copyright (C) 2004 Dmitry Yusupov * Copyright (C) 2004 Alex Aizman - * Copyright (C) 2005 Mike Christie + * Copyright (C) 2005 - 2006 Mike Christie + * Copyright (C) 2006 Red Hat, Inc. All rights reserved. * maintained by open-iscsi@googlegroups.com * * This program is free software; you can redistribute it and/or modify @@ -21,20 +22,7 @@ #ifndef ISCSI_TCP_H #define ISCSI_TCP_H -/* Session's states */ -#define ISCSI_STATE_FREE 1 -#define ISCSI_STATE_LOGGED_IN 2 -#define ISCSI_STATE_FAILED 3 -#define ISCSI_STATE_TERMINATE 4 - -/* Connection's states */ -#define ISCSI_CONN_INITIAL_STAGE 0 -#define ISCSI_CONN_STARTED 1 -#define ISCSI_CONN_STOPPED 2 -#define ISCSI_CONN_CLEANUP_WAIT 3 - -/* Connection suspend "bit" */ -#define SUSPEND_BIT 1 +#include /* Socket's Receive state machine */ #define IN_PROGRESS_WAIT_HEADER 0x0 @@ -42,12 +30,6 @@ #define IN_PROGRESS_DATA_RECV 0x2 #define IN_PROGRESS_DDIGEST_RECV 0x3 -/* Task Mgmt states */ -#define TMABORT_INITIAL 0x0 -#define TMABORT_SUCCESS 0x1 -#define TMABORT_FAILED 0x2 -#define TMABORT_TIMEDOUT 0x3 - /* xmit state machine */ #define XMSTATE_IDLE 0x0 #define XMSTATE_R_HDR 0x1 @@ -62,34 +44,14 @@ #define XMSTATE_W_PAD 0x200 #define XMSTATE_DATA_DIGEST 0x400 -#define ISCSI_CONN_MAX 1 #define ISCSI_CONN_RCVBUF_MIN 262144 #define ISCSI_CONN_SNDBUF_MIN 262144 #define ISCSI_PAD_LEN 4 #define ISCSI_R2T_MAX 16 -#define ISCSI_XMIT_CMDS_MAX 128 /* must be power of 2 */ -#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_DEF_CMD_PER_LUN 32 -#define ISCSI_MAX_CMD_PER_LUN 128 #define ISCSI_TCP_MAX_CMD_LEN 16 -#define ITT_MASK (0xfff) -#define CID_SHIFT 12 -#define CID_MASK (0xffff<esp_command_dvma = vdma_alloc(CPHYSADDR(cmd_buffer), sizeof (cmd_buffer)); esp->irq = JAZZ_SCSI_IRQ; - request_irq(JAZZ_SCSI_IRQ, esp_intr, SA_INTERRUPT, "JAZZ SCSI", + request_irq(JAZZ_SCSI_IRQ, esp_intr, IRQF_DISABLED, "JAZZ SCSI", esp->ehost); /* @@ -257,7 +257,7 @@ static void dma_mmu_release_scsi_one (struct NCR_ESP *esp, struct scsi_cmnd *sp) static void dma_mmu_release_scsi_sgl (struct NCR_ESP *esp, struct scsi_cmnd *sp) { int sz = sp->use_sg - 1; - struct scatterlist *sg = (struct scatterlist *)sp->buffer; + struct scatterlist *sg = (struct scatterlist *)sp->request_buffer; while(sz >= 0) { vdma_free(sg[sz].dma_address); diff --git a/drivers/scsi/lasi700.c b/drivers/scsi/lasi700.c index eb7bd310c..f0871c3ac 100644 --- a/drivers/scsi/lasi700.c +++ b/drivers/scsi/lasi700.c @@ -131,7 +131,7 @@ lasi700_probe(struct parisc_device *dev) host->this_id = 7; host->base = base; host->irq = dev->irq; - if(request_irq(dev->irq, NCR_700_intr, SA_SHIRQ, "lasi700", host)) { + if(request_irq(dev->irq, NCR_700_intr, IRQF_SHARED, "lasi700", host)) { printk(KERN_ERR "lasi700: request_irq failed!\n"); goto out_put_host; } diff --git a/drivers/scsi/libata-bmdma.c b/drivers/scsi/libata-bmdma.c index 835dff0ba..9ce221f25 100644 --- a/drivers/scsi/libata-bmdma.c +++ b/drivers/scsi/libata-bmdma.c @@ -32,7 +32,6 @@ * */ -#include #include #include #include @@ -652,6 +651,151 @@ void ata_bmdma_stop(struct ata_queued_cmd *qc) ata_altstatus(ap); /* dummy read */ } +/** + * ata_bmdma_freeze - Freeze BMDMA controller port + * @ap: port to freeze + * + * Freeze BMDMA controller port. + * + * LOCKING: + * Inherited from caller. + */ +void ata_bmdma_freeze(struct ata_port *ap) +{ + struct ata_ioports *ioaddr = &ap->ioaddr; + + ap->ctl |= ATA_NIEN; + ap->last_ctl = ap->ctl; + + if (ap->flags & ATA_FLAG_MMIO) + writeb(ap->ctl, (void __iomem *)ioaddr->ctl_addr); + else + outb(ap->ctl, ioaddr->ctl_addr); +} + +/** + * ata_bmdma_thaw - Thaw BMDMA controller port + * @ap: port to thaw + * + * Thaw BMDMA controller port. + * + * LOCKING: + * Inherited from caller. + */ +void ata_bmdma_thaw(struct ata_port *ap) +{ + /* clear & re-enable interrupts */ + ata_chk_status(ap); + ap->ops->irq_clear(ap); + if (ap->ioaddr.ctl_addr) /* FIXME: hack. create a hook instead */ + ata_irq_on(ap); +} + +/** + * ata_bmdma_drive_eh - Perform EH with given methods for BMDMA controller + * @ap: port to handle error for + * @prereset: prereset method (can be NULL) + * @softreset: softreset method (can be NULL) + * @hardreset: hardreset method (can be NULL) + * @postreset: postreset method (can be NULL) + * + * Handle error for ATA BMDMA controller. It can handle both + * PATA and SATA controllers. Many controllers should be able to + * use this EH as-is or with some added handling before and + * after. + * + * This function is intended to be used for constructing + * ->error_handler callback by low level drivers. + * + * LOCKING: + * Kernel thread context (may sleep) + */ +void ata_bmdma_drive_eh(struct ata_port *ap, ata_prereset_fn_t prereset, + ata_reset_fn_t softreset, ata_reset_fn_t hardreset, + ata_postreset_fn_t postreset) +{ + struct ata_eh_context *ehc = &ap->eh_context; + struct ata_queued_cmd *qc; + unsigned long flags; + int thaw = 0; + + qc = __ata_qc_from_tag(ap, ap->active_tag); + if (qc && !(qc->flags & ATA_QCFLAG_FAILED)) + qc = NULL; + + /* reset PIO HSM and stop DMA engine */ + spin_lock_irqsave(ap->lock, flags); + + ap->hsm_task_state = HSM_ST_IDLE; + + if (qc && (qc->tf.protocol == ATA_PROT_DMA || + qc->tf.protocol == ATA_PROT_ATAPI_DMA)) { + u8 host_stat; + + host_stat = ata_bmdma_status(ap); + + ata_ehi_push_desc(&ehc->i, "BMDMA stat 0x%x", host_stat); + + /* BMDMA controllers indicate host bus error by + * setting DMA_ERR bit and timing out. As it wasn't + * really a timeout event, adjust error mask and + * cancel frozen state. + */ + if (qc->err_mask == AC_ERR_TIMEOUT && host_stat & ATA_DMA_ERR) { + qc->err_mask = AC_ERR_HOST_BUS; + thaw = 1; + } + + ap->ops->bmdma_stop(qc); + } + + ata_altstatus(ap); + ata_chk_status(ap); + ap->ops->irq_clear(ap); + + spin_unlock_irqrestore(ap->lock, flags); + + if (thaw) + ata_eh_thaw_port(ap); + + /* PIO and DMA engines have been stopped, perform recovery */ + ata_do_eh(ap, prereset, softreset, hardreset, postreset); +} + +/** + * ata_bmdma_error_handler - Stock error handler for BMDMA controller + * @ap: port to handle error for + * + * Stock error handler for BMDMA controller. + * + * LOCKING: + * Kernel thread context (may sleep) + */ +void ata_bmdma_error_handler(struct ata_port *ap) +{ + ata_reset_fn_t hardreset; + + hardreset = NULL; + if (sata_scr_valid(ap)) + hardreset = sata_std_hardreset; + + ata_bmdma_drive_eh(ap, ata_std_prereset, ata_std_softreset, hardreset, + ata_std_postreset); +} + +/** + * ata_bmdma_post_internal_cmd - Stock post_internal_cmd for + * BMDMA controller + * @qc: internal command to clean up + * + * LOCKING: + * Kernel thread context (may sleep) + */ +void ata_bmdma_post_internal_cmd(struct ata_queued_cmd *qc) +{ + ata_bmdma_stop(qc); +} + #ifdef CONFIG_PCI static struct ata_probe_ent * ata_probe_ent_alloc(struct device *dev, const struct ata_port_info *port) @@ -709,7 +853,7 @@ ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port, int return NULL; probe_ent->irq = pdev->irq; - probe_ent->irq_flags = SA_SHIRQ; + probe_ent->irq_flags = IRQF_SHARED; probe_ent->private_data = port[0]->private_data; if (ports & ATA_PORT_PRIMARY) { @@ -930,10 +1074,21 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info, /* FIXME: check ata_device_add return */ if (legacy_mode) { - if (legacy_mode & (1 << 0)) + struct device *dev = &pdev->dev; + struct ata_host_set *host_set = NULL; + + if (legacy_mode & (1 << 0)) { ata_device_add(probe_ent); - if (legacy_mode & (1 << 1)) + host_set = dev_get_drvdata(dev); + } + + if (legacy_mode & (1 << 1)) { ata_device_add(probe_ent2); + if (host_set) { + host_set->next = dev_get_drvdata(dev); + dev_set_drvdata(dev, host_set); + } + } } else ata_device_add(probe_ent); diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index d680ccd94..8e3e8caf8 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c @@ -32,7 +32,6 @@ * */ -#include #include #include #include @@ -61,26 +60,37 @@ #include "libata.h" -static unsigned int ata_dev_init_params(struct ata_port *ap, - struct ata_device *dev, - u16 heads, - u16 sectors); -static void ata_set_mode(struct ata_port *ap); -static unsigned int ata_dev_set_xfermode(struct ata_port *ap, - struct ata_device *dev); -static void ata_dev_xfermask(struct ata_port *ap, struct ata_device *dev); +/* debounce timing parameters in msecs { interval, duration, timeout } */ +const unsigned long sata_deb_timing_normal[] = { 5, 100, 2000 }; +const unsigned long sata_deb_timing_hotplug[] = { 25, 500, 2000 }; +const unsigned long sata_deb_timing_long[] = { 100, 2000, 5000 }; + +static unsigned int ata_dev_init_params(struct ata_device *dev, + u16 heads, u16 sectors); +static unsigned int ata_dev_set_xfermode(struct ata_device *dev); +static void ata_dev_xfermask(struct ata_device *dev); static unsigned int ata_unique_id = 1; static struct workqueue_struct *ata_wq; +struct workqueue_struct *ata_aux_wq; + int atapi_enabled = 1; module_param(atapi_enabled, int, 0444); MODULE_PARM_DESC(atapi_enabled, "Enable discovery of ATAPI devices (0=off, 1=on)"); +int atapi_dmadir = 0; +module_param(atapi_dmadir, int, 0444); +MODULE_PARM_DESC(atapi_dmadir, "Enable ATAPI DMADIR bridge support (0=off, 1=on)"); + int libata_fua = 0; module_param_named(fua, libata_fua, int, 0444); MODULE_PARM_DESC(fua, "FUA support (0=off, 1=on)"); +static int ata_probe_timeout = ATA_TMOUT_INTERNAL / HZ; +module_param(ata_probe_timeout, int, 0444); +MODULE_PARM_DESC(ata_probe_timeout, "Set ATA probing timeout (seconds)"); + MODULE_AUTHOR("Jeff Garzik"); MODULE_DESCRIPTION("Library module for ATA devices"); MODULE_LICENSE("GPL"); @@ -397,11 +407,22 @@ static const char *ata_mode_string(unsigned int xfer_mask) return ""; } -static void ata_dev_disable(struct ata_port *ap, struct ata_device *dev) +static const char *sata_spd_string(unsigned int spd) +{ + static const char * const spd_str[] = { + "1.5 Gbps", + "3.0 Gbps", + }; + + if (spd == 0 || (spd - 1) >= ARRAY_SIZE(spd_str)) + return ""; + return spd_str[spd - 1]; +} + +void ata_dev_disable(struct ata_device *dev) { - if (ata_dev_present(dev)) { - printk(KERN_WARNING "ata%u: dev %u disabled\n", - ap->id, dev->devno); + if (ata_dev_enabled(dev) && ata_msg_drv(dev->ap)) { + ata_dev_printk(dev, KERN_WARNING, "disabled\n"); dev->class++; } } @@ -759,8 +780,9 @@ void ata_std_dev_select (struct ata_port *ap, unsigned int device) void ata_dev_select(struct ata_port *ap, unsigned int device, unsigned int wait, unsigned int can_sleep) { - VPRINTK("ENTER, ata%u: device %u, wait %u\n", - ap->id, device, wait); + if (ata_msg_probe(ap)) + ata_port_printk(ap, KERN_INFO, "ata_dev_select: ENTER, ata%u: " + "device %u, wait %u\n", ap->id, device, wait); if (wait) ata_wait_idle(ap); @@ -885,7 +907,7 @@ void ata_port_queue_task(struct ata_port *ap, void (*fn)(void *), void *data, { int rc; - if (ap->flags & ATA_FLAG_FLUSH_PORT_TASK) + if (ap->pflags & ATA_PFLAG_FLUSH_PORT_TASK) return; PREPARE_WORK(&ap->port_task, fn, data); @@ -915,9 +937,9 @@ void ata_port_flush_task(struct ata_port *ap) DPRINTK("ENTER\n"); - spin_lock_irqsave(&ap->host_set->lock, flags); - ap->flags |= ATA_FLAG_FLUSH_PORT_TASK; - spin_unlock_irqrestore(&ap->host_set->lock, flags); + spin_lock_irqsave(ap->lock, flags); + ap->pflags |= ATA_PFLAG_FLUSH_PORT_TASK; + spin_unlock_irqrestore(ap->lock, flags); DPRINTK("flush #1\n"); flush_workqueue(ata_wq); @@ -928,30 +950,32 @@ void ata_port_flush_task(struct ata_port *ap) * Cancel and flush. */ if (!cancel_delayed_work(&ap->port_task)) { - DPRINTK("flush #2\n"); + if (ata_msg_ctl(ap)) + ata_port_printk(ap, KERN_DEBUG, "%s: flush #2\n", + __FUNCTION__); flush_workqueue(ata_wq); } - spin_lock_irqsave(&ap->host_set->lock, flags); - ap->flags &= ~ATA_FLAG_FLUSH_PORT_TASK; - spin_unlock_irqrestore(&ap->host_set->lock, flags); + spin_lock_irqsave(ap->lock, flags); + ap->pflags &= ~ATA_PFLAG_FLUSH_PORT_TASK; + spin_unlock_irqrestore(ap->lock, flags); - DPRINTK("EXIT\n"); + if (ata_msg_ctl(ap)) + ata_port_printk(ap, KERN_DEBUG, "%s: EXIT\n", __FUNCTION__); } void ata_qc_complete_internal(struct ata_queued_cmd *qc) { struct completion *waiting = qc->private_data; - qc->ap->ops->tf_read(qc->ap, &qc->tf); complete(waiting); } /** * 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 + * @cdb: CDB for packet command * @dma_dir: Data tranfer direction of the command * @buf: Data buffer of the command * @buflen: Length of data buffer @@ -964,25 +988,66 @@ void ata_qc_complete_internal(struct ata_queued_cmd *qc) * * LOCKING: * None. Should be called with kernel context, might sleep. + * + * RETURNS: + * Zero on success, AC_ERR_* mask on failure */ - -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) +unsigned ata_exec_internal(struct ata_device *dev, + struct ata_taskfile *tf, const u8 *cdb, + int dma_dir, void *buf, unsigned int buflen) { + struct ata_port *ap = dev->ap; u8 command = tf->command; struct ata_queued_cmd *qc; - DECLARE_COMPLETION(wait); + unsigned int tag, preempted_tag; + u32 preempted_sactive, preempted_qc_active; + DECLARE_COMPLETION_ONSTACK(wait); unsigned long flags; unsigned int err_mask; + int rc; + + spin_lock_irqsave(ap->lock, flags); - spin_lock_irqsave(&ap->host_set->lock, flags); + /* no internal command while frozen */ + if (ap->pflags & ATA_PFLAG_FROZEN) { + spin_unlock_irqrestore(ap->lock, flags); + return AC_ERR_SYSTEM; + } + + /* initialize internal qc */ + + /* XXX: Tag 0 is used for drivers with legacy EH as some + * drivers choke if any other tag is given. This breaks + * ata_tag_internal() test for those drivers. Don't use new + * EH stuff without converting to it. + */ + if (ap->ops->error_handler) + tag = ATA_TAG_INTERNAL; + else + tag = 0; + + if (test_and_set_bit(tag, &ap->qc_allocated)) + BUG(); + qc = __ata_qc_from_tag(ap, tag); - qc = ata_qc_new_init(ap, dev); - BUG_ON(qc == NULL); + qc->tag = tag; + qc->scsicmd = NULL; + qc->ap = ap; + qc->dev = dev; + ata_qc_reinit(qc); + preempted_tag = ap->active_tag; + preempted_sactive = ap->sactive; + preempted_qc_active = ap->qc_active; + ap->active_tag = ATA_TAG_POISON; + ap->sactive = 0; + ap->qc_active = 0; + + /* prepare & issue qc */ qc->tf = *tf; + if (cdb) + memcpy(qc->cdb, cdb, ATAPI_CDB_LEN); + qc->flags |= ATA_QCFLAG_RESULT_TF; qc->dma_dir = dma_dir; if (dma_dir != DMA_NONE) { ata_sg_init_one(qc, buf, buflen); @@ -994,33 +1059,58 @@ ata_exec_internal(struct ata_port *ap, struct ata_device *dev, ata_qc_issue(qc); - spin_unlock_irqrestore(&ap->host_set->lock, flags); + spin_unlock_irqrestore(ap->lock, flags); - if (!wait_for_completion_timeout(&wait, ATA_TMOUT_INTERNAL)) { - ata_port_flush_task(ap); + rc = wait_for_completion_timeout(&wait, ata_probe_timeout); - spin_lock_irqsave(&ap->host_set->lock, flags); + ata_port_flush_task(ap); + + if (!rc) { + spin_lock_irqsave(ap->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. + * twice. If we win, the port is frozen and will be + * cleaned up by ->post_internal_cmd(). */ if (qc->flags & ATA_QCFLAG_ACTIVE) { - qc->err_mask = AC_ERR_TIMEOUT; - ata_qc_complete(qc); - printk(KERN_WARNING "ata%u: qc timeout (cmd 0x%x)\n", - ap->id, command); + qc->err_mask |= AC_ERR_TIMEOUT; + + if (ap->ops->error_handler) + ata_port_freeze(ap); + else + ata_qc_complete(qc); + + if (ata_msg_warn(ap)) + ata_dev_printk(dev, KERN_WARNING, + "qc timeout (cmd 0x%x)\n", command); } - spin_unlock_irqrestore(&ap->host_set->lock, flags); + spin_unlock_irqrestore(ap->lock, flags); + } + + /* do post_internal_cmd */ + if (ap->ops->post_internal_cmd) + ap->ops->post_internal_cmd(qc); + + if (qc->flags & ATA_QCFLAG_FAILED && !qc->err_mask) { + if (ata_msg_warn(ap)) + ata_dev_printk(dev, KERN_WARNING, + "zero err_mask for failed " + "internal command, assuming AC_ERR_OTHER\n"); + qc->err_mask |= AC_ERR_OTHER; } - *tf = qc->tf; + /* finish up */ + spin_lock_irqsave(ap->lock, flags); + + *tf = qc->result_tf; err_mask = qc->err_mask; ata_qc_free(qc); + ap->active_tag = preempted_tag; + ap->sactive = preempted_sactive; + ap->qc_active = preempted_qc_active; /* XXX - Some LLDDs (sata_mv) disable port on command failure. * Until those drivers are fixed, we detect the condition @@ -1033,14 +1123,43 @@ ata_exec_internal(struct ata_port *ap, struct ata_device *dev, * * Kill the following code as soon as those drivers are fixed. */ - if (ap->flags & ATA_FLAG_PORT_DISABLED) { + if (ap->flags & ATA_FLAG_DISABLED) { err_mask |= AC_ERR_SYSTEM; ata_port_probe(ap); } + spin_unlock_irqrestore(ap->lock, flags); + return err_mask; } +/** + * ata_do_simple_cmd - execute simple internal command + * @dev: Device to which the command is sent + * @cmd: Opcode to execute + * + * Execute a 'simple' command, that only consists of the opcode + * 'cmd' itself, without filling any other registers + * + * LOCKING: + * Kernel thread context (may sleep). + * + * RETURNS: + * Zero on success, AC_ERR_* mask on failure + */ +unsigned int ata_do_simple_cmd(struct ata_device *dev, u8 cmd) +{ + struct ata_taskfile tf; + + ata_tf_init(dev, &tf); + + tf.command = cmd; + tf.flags |= ATA_TFLAG_DEVICE; + tf.protocol = ATA_PROT_NODATA; + + return ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0); +} + /** * ata_pio_need_iordy - check if iordy needed * @adev: ATA device @@ -1076,11 +1195,10 @@ unsigned int ata_pio_need_iordy(const struct ata_device *adev) /** * ata_dev_read_id - Read ID data from the specified device - * @ap: port on which target device resides * @dev: target device * @p_class: pointer to class of the target device (may be changed) * @post_reset: is this read ID post-reset? - * @p_id: read IDENTIFY page (newly allocated) + * @id: buffer to read IDENTIFY data into * * Read ID data from the specified device. ATA_CMD_ID_ATA is * performed on ATA devices and ATA_CMD_ID_ATAPI on ATAPI @@ -1093,29 +1211,24 @@ unsigned int ata_pio_need_iordy(const struct ata_device *adev) * RETURNS: * 0 on success, -errno otherwise. */ -static int ata_dev_read_id(struct ata_port *ap, struct ata_device *dev, - unsigned int *p_class, int post_reset, u16 **p_id) +int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class, + int post_reset, u16 *id) { + struct ata_port *ap = dev->ap; unsigned int class = *p_class; struct ata_taskfile tf; unsigned int err_mask = 0; - u16 *id; const char *reason; int rc; - DPRINTK("ENTER, host %u, dev %u\n", ap->id, dev->devno); + if (ata_msg_ctl(ap)) + ata_dev_printk(dev, KERN_DEBUG, "%s: ENTER, host %u, dev %u\n", + __FUNCTION__, ap->id, dev->devno); ata_dev_select(ap, dev->devno, 1, 1); /* select device 0/1 */ - id = kmalloc(sizeof(id[0]) * ATA_ID_WORDS, GFP_KERNEL); - if (id == NULL) { - rc = -ENOMEM; - reason = "out of memory"; - goto err_out; - } - retry: - ata_tf_init(ap, &tf, dev->devno); + ata_tf_init(dev, &tf); switch (class) { case ATA_DEV_ATA: @@ -1132,7 +1245,7 @@ static int ata_dev_read_id(struct ata_port *ap, struct ata_device *dev, tf.protocol = ATA_PROT_PIO; - err_mask = ata_exec_internal(ap, dev, &tf, DMA_FROM_DEVICE, + err_mask = ata_exec_internal(dev, &tf, NULL, DMA_FROM_DEVICE, id, sizeof(id[0]) * ATA_ID_WORDS); if (err_mask) { rc = -EIO; @@ -1143,10 +1256,15 @@ static int ata_dev_read_id(struct ata_port *ap, struct ata_device *dev, swap_buf_le16(id, ATA_ID_WORDS); /* sanity check */ - if ((class == ATA_DEV_ATA) != (ata_id_is_ata(id) | ata_id_is_cfa(id))) { - rc = -EINVAL; - reason = "device reports illegal type"; - goto err_out; + rc = -EINVAL; + reason = "device reports illegal type"; + + if (class == ATA_DEV_ATA) { + if (!ata_id_is_ata(id) && !ata_id_is_cfa(id)) + goto err_out; + } else { + if (ata_id_is_ata(id)) + goto err_out; } if (post_reset && class == ATA_DEV_ATA) { @@ -1159,7 +1277,7 @@ static int ata_dev_read_id(struct ata_port *ap, struct ata_device *dev, * Some drives were very specific about that exact sequence. */ if (ata_id_major_version(id) < 4 || !ata_id_has_lba(id)) { - err_mask = ata_dev_init_params(ap, dev, id[3], id[6]); + err_mask = ata_dev_init_params(dev, id[3], id[6]); if (err_mask) { rc = -EIO; reason = "INIT_DEV_PARAMS failed"; @@ -1175,25 +1293,58 @@ static int ata_dev_read_id(struct ata_port *ap, struct ata_device *dev, } *p_class = class; - *p_id = id; + return 0; err_out: - printk(KERN_WARNING "ata%u: dev %u failed to IDENTIFY (%s)\n", - ap->id, dev->devno, reason); - kfree(id); + if (ata_msg_warn(ap)) + ata_dev_printk(dev, KERN_WARNING, "failed to IDENTIFY " + "(%s, err_mask=0x%x)\n", reason, err_mask); return rc; } -static inline u8 ata_dev_knobble(const struct ata_port *ap, - struct ata_device *dev) +static inline u8 ata_dev_knobble(struct ata_device *dev) { - return ((ap->cbl == ATA_CBL_SATA) && (!ata_id_is_sata(dev->id))); + return ((dev->ap->cbl == ATA_CBL_SATA) && (!ata_id_is_sata(dev->id))); +} + +static void ata_dev_config_ncq(struct ata_device *dev, + char *desc, size_t desc_sz) +{ + struct ata_port *ap = dev->ap; + int hdepth = 0, ddepth = ata_id_queue_depth(dev->id); + + if (!ata_id_has_ncq(dev->id)) { + desc[0] = '\0'; + return; + } + + if (ap->flags & ATA_FLAG_NCQ) { + hdepth = min(ap->host->can_queue, ATA_MAX_QUEUE - 1); + dev->flags |= ATA_DFLAG_NCQ; + } + + if (hdepth >= ddepth) + snprintf(desc, desc_sz, "NCQ (depth %d)", ddepth); + else + snprintf(desc, desc_sz, "NCQ (depth %d/%d)", hdepth, ddepth); +} + +static void ata_set_port_max_cmd_len(struct ata_port *ap) +{ + int i; + + if (ap->host) { + ap->host->max_cmd_len = 0; + for (i = 0; i < ATA_MAX_DEVICES; i++) + ap->host->max_cmd_len = max_t(unsigned int, + ap->host->max_cmd_len, + ap->device[i].cdb_len); + } } /** * ata_dev_configure - Configure the specified ATA/ATAPI device - * @ap: Port on which target device resides * @dev: Target device to configure * @print_info: Enable device info printout * @@ -1206,27 +1357,32 @@ static inline u8 ata_dev_knobble(const struct ata_port *ap, * RETURNS: * 0 on success, -errno otherwise */ -static int ata_dev_configure(struct ata_port *ap, struct ata_device *dev, - int print_info) +int ata_dev_configure(struct ata_device *dev, int print_info) { + struct ata_port *ap = dev->ap; const u16 *id = dev->id; unsigned int xfer_mask; - int i, rc; + int rc; - if (!ata_dev_present(dev)) { - DPRINTK("ENTER/EXIT (host %u, dev %u) -- nodev\n", - ap->id, dev->devno); + if (!ata_dev_enabled(dev) && ata_msg_info(ap)) { + ata_dev_printk(dev, KERN_INFO, + "%s: ENTER/EXIT (host %u, dev %u) -- nodev\n", + __FUNCTION__, ap->id, dev->devno); return 0; } - DPRINTK("ENTER, host %u, dev %u\n", ap->id, dev->devno); + if (ata_msg_probe(ap)) + ata_dev_printk(dev, KERN_DEBUG, "%s: ENTER, host %u, dev %u\n", + __FUNCTION__, ap->id, dev->devno); /* print device capabilities */ - if (print_info) - printk(KERN_DEBUG "ata%u: dev %u cfg 49:%04x 82:%04x 83:%04x " - "84:%04x 85:%04x 86:%04x 87:%04x 88:%04x\n", - ap->id, dev->devno, id[49], id[82], id[83], - id[84], id[85], id[86], id[87], id[88]); + if (ata_msg_probe(ap)) + ata_dev_printk(dev, KERN_DEBUG, + "%s: cfg 49:%04x 82:%04x 83:%04x 84:%04x " + "85:%04x 86:%04x 87:%04x 88:%04x\n", + __FUNCTION__, + id[49], id[82], id[83], id[84], + id[85], id[86], id[87], id[88]); /* initialize to-be-configured parameters */ dev->flags &= ~ATA_DFLAG_CFG_MASK; @@ -1244,7 +1400,8 @@ static int ata_dev_configure(struct ata_port *ap, struct ata_device *dev, /* find max transfer mode; for printk only */ xfer_mask = ata_id_xfermask(id); - ata_dump_id(id); + if (ata_msg_probe(ap)) + ata_dump_id(id); /* ATA-specific feature tests */ if (dev->class == ATA_DEV_ATA) { @@ -1252,6 +1409,7 @@ static int ata_dev_configure(struct ata_port *ap, struct ata_device *dev, if (ata_id_has_lba(id)) { const char *lba_desc; + char ncq_desc[20]; lba_desc = "LBA"; dev->flags |= ATA_DFLAG_LBA; @@ -1260,15 +1418,17 @@ static int ata_dev_configure(struct ata_port *ap, struct ata_device *dev, lba_desc = "LBA48"; } + /* config NCQ */ + ata_dev_config_ncq(dev, ncq_desc, sizeof(ncq_desc)); + /* print device info to dmesg */ - if (print_info) - printk(KERN_INFO "ata%u: dev %u ATA-%d, " - "max %s, %Lu sectors: %s\n", - ap->id, dev->devno, - ata_id_major_version(id), - ata_mode_string(xfer_mask), - (unsigned long long)dev->n_sectors, - lba_desc); + if (ata_msg_drv(ap) && print_info) + ata_dev_printk(dev, KERN_INFO, "ATA-%d, " + "max %s, %Lu sectors: %s %s\n", + ata_id_major_version(id), + ata_mode_string(xfer_mask), + (unsigned long long)dev->n_sectors, + lba_desc, ncq_desc); } else { /* CHS */ @@ -1285,14 +1445,22 @@ static int ata_dev_configure(struct ata_port *ap, struct ata_device *dev, } /* print device info to dmesg */ - if (print_info) - printk(KERN_INFO "ata%u: dev %u ATA-%d, " - "max %s, %Lu sectors: CHS %u/%u/%u\n", - ap->id, dev->devno, - ata_id_major_version(id), - ata_mode_string(xfer_mask), - (unsigned long long)dev->n_sectors, - dev->cylinders, dev->heads, dev->sectors); + if (ata_msg_drv(ap) && print_info) + ata_dev_printk(dev, KERN_INFO, "ATA-%d, " + "max %s, %Lu sectors: CHS %u/%u/%u\n", + ata_id_major_version(id), + ata_mode_string(xfer_mask), + (unsigned long long)dev->n_sectors, + dev->cylinders, dev->heads, + dev->sectors); + } + + if (dev->id[59] & 0x100) { + dev->multi_count = dev->id[59] & 0xff; + if (ata_msg_drv(ap) && print_info) + ata_dev_printk(dev, KERN_INFO, + "ata%u: dev %u multi count %u\n", + ap->id, dev->devno, dev->multi_count); } dev->cdb_len = 16; @@ -1300,31 +1468,37 @@ static int ata_dev_configure(struct ata_port *ap, struct ata_device *dev, /* ATAPI-specific feature tests */ else if (dev->class == ATA_DEV_ATAPI) { + char *cdb_intr_string = ""; + rc = atapi_cdb_len(id); if ((rc < 12) || (rc > ATAPI_CDB_LEN)) { - printk(KERN_WARNING "ata%u: unsupported CDB len\n", ap->id); + if (ata_msg_warn(ap)) + ata_dev_printk(dev, KERN_WARNING, + "unsupported CDB len\n"); rc = -EINVAL; goto err_out_nosup; } dev->cdb_len = (unsigned int) rc; + if (ata_id_cdb_intr(dev->id)) { + dev->flags |= ATA_DFLAG_CDB_INTR; + cdb_intr_string = ", CDB intr"; + } + /* print device info to dmesg */ - if (print_info) - printk(KERN_INFO "ata%u: dev %u ATAPI, max %s\n", - ap->id, dev->devno, ata_mode_string(xfer_mask)); + if (ata_msg_drv(ap) && print_info) + ata_dev_printk(dev, KERN_INFO, "ATAPI, max %s%s\n", + ata_mode_string(xfer_mask), + cdb_intr_string); } - ap->host->max_cmd_len = 0; - for (i = 0; i < ATA_MAX_DEVICES; i++) - ap->host->max_cmd_len = max_t(unsigned int, - ap->host->max_cmd_len, - ap->device[i].cdb_len); + ata_set_port_max_cmd_len(ap); /* limit bridge transfers to udma5, 200 sectors */ - if (ata_dev_knobble(ap, dev)) { - if (print_info) - printk(KERN_INFO "ata%u(%u): applying bridge limits\n", - ap->id, dev->devno); + if (ata_dev_knobble(dev)) { + if (ata_msg_drv(ap) && print_info) + ata_dev_printk(dev, KERN_INFO, + "applying bridge limits\n"); dev->udma_mask &= ATA_UDMA5; dev->max_sectors = ATA_MAX_SECTORS; } @@ -1332,11 +1506,15 @@ static int ata_dev_configure(struct ata_port *ap, struct ata_device *dev, if (ap->ops->dev_config) ap->ops->dev_config(ap, dev); - DPRINTK("EXIT, drv_stat = 0x%x\n", ata_chk_status(ap)); + if (ata_msg_probe(ap)) + ata_dev_printk(dev, KERN_DEBUG, "%s: EXIT, drv_stat = 0x%x\n", + __FUNCTION__, ata_chk_status(ap)); return 0; err_out_nosup: - DPRINTK("EXIT, err\n"); + if (ata_msg_probe(ap)) + ata_dev_printk(dev, KERN_DEBUG, + "%s: EXIT, err\n", __FUNCTION__); return rc; } @@ -1352,79 +1530,104 @@ err_out_nosup: * PCI/etc. bus probe sem. * * RETURNS: - * Zero on success, non-zero on error. + * Zero on success, negative errno otherwise. */ static int ata_bus_probe(struct ata_port *ap) { unsigned int classes[ATA_MAX_DEVICES]; - unsigned int i, rc, found = 0; + int tries[ATA_MAX_DEVICES]; + int i, rc, down_xfermask; + struct ata_device *dev; ata_port_probe(ap); - /* reset and determine device classes */ for (i = 0; i < ATA_MAX_DEVICES; i++) - classes[i] = ATA_DEV_UNKNOWN; + tries[i] = ATA_PROBE_MAX_TRIES; - if (ap->ops->probe_reset) { - rc = ap->ops->probe_reset(ap, classes); - if (rc) { - printk("ata%u: reset failed (errno=%d)\n", ap->id, rc); - return rc; - } - } else { - ap->ops->phy_reset(ap); + retry: + down_xfermask = 0; + + /* reset and determine device classes */ + ap->ops->phy_reset(ap); - if (!(ap->flags & ATA_FLAG_PORT_DISABLED)) - for (i = 0; i < ATA_MAX_DEVICES; i++) - classes[i] = ap->device[i].class; + for (i = 0; i < ATA_MAX_DEVICES; i++) { + dev = &ap->device[i]; - ata_port_probe(ap); + if (!(ap->flags & ATA_FLAG_DISABLED) && + dev->class != ATA_DEV_UNKNOWN) + classes[dev->devno] = dev->class; + else + classes[dev->devno] = ATA_DEV_NONE; + + dev->class = ATA_DEV_UNKNOWN; } + ata_port_probe(ap); + + /* after the reset the device state is PIO 0 and the controller + state is undefined. Record the mode */ + for (i = 0; i < ATA_MAX_DEVICES; i++) - if (classes[i] == ATA_DEV_UNKNOWN) - classes[i] = ATA_DEV_NONE; + ap->device[i].pio_mode = XFER_PIO_0; /* read IDENTIFY page and configure devices */ for (i = 0; i < ATA_MAX_DEVICES; i++) { - struct ata_device *dev = &ap->device[i]; + dev = &ap->device[i]; - dev->class = classes[i]; + if (tries[i]) + dev->class = classes[i]; - if (!ata_dev_present(dev)) + if (!ata_dev_enabled(dev)) continue; - WARN_ON(dev->id != NULL); - if (ata_dev_read_id(ap, dev, &dev->class, 1, &dev->id)) { - dev->class = ATA_DEV_NONE; - continue; - } + rc = ata_dev_read_id(dev, &dev->class, 1, dev->id); + if (rc) + goto fail; - if (ata_dev_configure(ap, dev, 1)) { - ata_dev_disable(ap, dev); - continue; - } + rc = ata_dev_configure(dev, 1); + if (rc) + goto fail; + } - found = 1; + /* configure transfer mode */ + rc = ata_set_mode(ap, &dev); + if (rc) { + down_xfermask = 1; + goto fail; } - if (!found) - goto err_out_disable; + for (i = 0; i < ATA_MAX_DEVICES; i++) + if (ata_dev_enabled(&ap->device[i])) + return 0; - if (ap->ops->set_mode) - ap->ops->set_mode(ap); - else - ata_set_mode(ap); + /* no device present, disable port */ + ata_port_disable(ap); + ap->ops->port_disable(ap); + return -ENODEV; - if (ap->flags & ATA_FLAG_PORT_DISABLED) - goto err_out_disable; + fail: + switch (rc) { + case -EINVAL: + case -ENODEV: + tries[dev->devno] = 0; + break; + case -EIO: + sata_down_spd_limit(ap); + /* fall through */ + default: + tries[dev->devno]--; + if (down_xfermask && + ata_down_xfermask_limit(dev, tries[dev->devno] == 1)) + tries[dev->devno] = 0; + } - return 0; + if (!tries[dev->devno]) { + ata_down_xfermask_limit(dev, 1); + ata_dev_disable(dev); + } -err_out_disable: - ap->ops->port_disable(ap); - return -1; + goto retry; } /** @@ -1440,7 +1643,7 @@ err_out_disable: void ata_port_probe(struct ata_port *ap) { - ap->flags &= ~ATA_FLAG_PORT_DISABLED; + ap->flags &= ~ATA_FLAG_DISABLED; } /** @@ -1454,27 +1657,21 @@ void ata_port_probe(struct ata_port *ap) */ static void sata_print_link_status(struct ata_port *ap) { - u32 sstatus, tmp; - const char *speed; + u32 sstatus, scontrol, tmp; - if (!ap->ops->scr_read) + if (sata_scr_read(ap, SCR_STATUS, &sstatus)) return; + sata_scr_read(ap, SCR_CONTROL, &scontrol); - sstatus = scr_read(ap, SCR_STATUS); - - if (sata_dev_present(ap)) { + if (ata_port_online(ap)) { tmp = (sstatus >> 4) & 0xf; - if (tmp & (1 << 0)) - speed = "1.5"; - else if (tmp & (1 << 1)) - speed = "3.0"; - else - speed = ""; - printk(KERN_INFO "ata%u: SATA link up %s Gbps (SStatus %X)\n", - ap->id, speed, sstatus); + ata_port_printk(ap, KERN_INFO, + "SATA link up %s (SStatus %X SControl %X)\n", + sata_spd_string(tmp), sstatus, scontrol); } else { - printk(KERN_INFO "ata%u: SATA link down (SStatus %X)\n", - ap->id, sstatus); + ata_port_printk(ap, KERN_INFO, + "SATA link down (SStatus %X SControl %X)\n", + sstatus, scontrol); } } @@ -1497,17 +1694,18 @@ void __sata_phy_reset(struct ata_port *ap) if (ap->flags & ATA_FLAG_SATA_RESET) { /* issue phy wake/reset */ - scr_write_flush(ap, SCR_CONTROL, 0x301); + sata_scr_write_flush(ap, SCR_CONTROL, 0x301); /* Couldn't find anything in SATA I/II specs, but * AHCI-1.1 10.4.2 says at least 1 ms. */ mdelay(1); } - scr_write_flush(ap, SCR_CONTROL, 0x300); /* phy wake/clear reset */ + /* phy wake/clear reset */ + sata_scr_write_flush(ap, SCR_CONTROL, 0x300); /* wait for phy to become ready, if necessary */ do { msleep(200); - sstatus = scr_read(ap, SCR_STATUS); + sata_scr_read(ap, SCR_STATUS, &sstatus); if ((sstatus & 0xf) != 1) break; } while (time_before(jiffies, timeout)); @@ -1516,12 +1714,12 @@ void __sata_phy_reset(struct ata_port *ap) sata_print_link_status(ap); /* TODO: phy layer with polling, timeouts, etc. */ - if (sata_dev_present(ap)) + if (!ata_port_offline(ap)) ata_port_probe(ap); else ata_port_disable(ap); - if (ap->flags & ATA_FLAG_PORT_DISABLED) + if (ap->flags & ATA_FLAG_DISABLED) return; if (ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT)) { @@ -1546,24 +1744,24 @@ void __sata_phy_reset(struct ata_port *ap) void sata_phy_reset(struct ata_port *ap) { __sata_phy_reset(ap); - if (ap->flags & ATA_FLAG_PORT_DISABLED) + if (ap->flags & ATA_FLAG_DISABLED) return; ata_bus_reset(ap); } /** * ata_dev_pair - return other device on cable - * @ap: port * @adev: device * * Obtain the other device on the same cable, or if none is * present NULL is returned */ -struct ata_device *ata_dev_pair(struct ata_port *ap, struct ata_device *adev) +struct ata_device *ata_dev_pair(struct ata_device *adev) { + struct ata_port *ap = adev->ap; struct ata_device *pair = &ap->device[1 - adev->devno]; - if (!ata_dev_present(pair)) + if (!ata_dev_enabled(pair)) return NULL; return pair; } @@ -1585,7 +1783,122 @@ void ata_port_disable(struct ata_port *ap) { ap->device[0].class = ATA_DEV_NONE; ap->device[1].class = ATA_DEV_NONE; - ap->flags |= ATA_FLAG_PORT_DISABLED; + ap->flags |= ATA_FLAG_DISABLED; +} + +/** + * sata_down_spd_limit - adjust SATA spd limit downward + * @ap: Port to adjust SATA spd limit for + * + * Adjust SATA spd limit of @ap downward. Note that this + * function only adjusts the limit. The change must be applied + * using sata_set_spd(). + * + * LOCKING: + * Inherited from caller. + * + * RETURNS: + * 0 on success, negative errno on failure + */ +int sata_down_spd_limit(struct ata_port *ap) +{ + u32 sstatus, spd, mask; + int rc, highbit; + + rc = sata_scr_read(ap, SCR_STATUS, &sstatus); + if (rc) + return rc; + + mask = ap->sata_spd_limit; + if (mask <= 1) + return -EINVAL; + highbit = fls(mask) - 1; + mask &= ~(1 << highbit); + + spd = (sstatus >> 4) & 0xf; + if (spd <= 1) + return -EINVAL; + spd--; + mask &= (1 << spd) - 1; + if (!mask) + return -EINVAL; + + ap->sata_spd_limit = mask; + + ata_port_printk(ap, KERN_WARNING, "limiting SATA link speed to %s\n", + sata_spd_string(fls(mask))); + + return 0; +} + +static int __sata_set_spd_needed(struct ata_port *ap, u32 *scontrol) +{ + u32 spd, limit; + + if (ap->sata_spd_limit == UINT_MAX) + limit = 0; + else + limit = fls(ap->sata_spd_limit); + + spd = (*scontrol >> 4) & 0xf; + *scontrol = (*scontrol & ~0xf0) | ((limit & 0xf) << 4); + + return spd != limit; +} + +/** + * sata_set_spd_needed - is SATA spd configuration needed + * @ap: Port in question + * + * Test whether the spd limit in SControl matches + * @ap->sata_spd_limit. This function is used to determine + * whether hardreset is necessary to apply SATA spd + * configuration. + * + * LOCKING: + * Inherited from caller. + * + * RETURNS: + * 1 if SATA spd configuration is needed, 0 otherwise. + */ +int sata_set_spd_needed(struct ata_port *ap) +{ + u32 scontrol; + + if (sata_scr_read(ap, SCR_CONTROL, &scontrol)) + return 0; + + return __sata_set_spd_needed(ap, &scontrol); +} + +/** + * sata_set_spd - set SATA spd according to spd limit + * @ap: Port to set SATA spd for + * + * Set SATA spd of @ap according to sata_spd_limit. + * + * LOCKING: + * Inherited from caller. + * + * RETURNS: + * 0 if spd doesn't need to be changed, 1 if spd has been + * changed. Negative errno if SCR registers are inaccessible. + */ +int sata_set_spd(struct ata_port *ap) +{ + u32 scontrol; + int rc; + + if ((rc = sata_scr_read(ap, SCR_CONTROL, &scontrol))) + return rc; + + if (!__sata_set_spd_needed(ap, &scontrol)) + return 0; + + if ((rc = sata_scr_write(ap, SCR_CONTROL, scontrol))) + return rc; + + return 1; } /* @@ -1736,71 +2049,162 @@ int ata_timing_compute(struct ata_device *adev, unsigned short speed, return 0; } -static int ata_dev_set_mode(struct ata_port *ap, struct ata_device *dev) +/** + * ata_down_xfermask_limit - adjust dev xfer masks downward + * @dev: Device to adjust xfer masks + * @force_pio0: Force PIO0 + * + * Adjust xfer masks of @dev downward. Note that this function + * does not apply the change. Invoking ata_set_mode() afterwards + * will apply the limit. + * + * LOCKING: + * Inherited from caller. + * + * RETURNS: + * 0 on success, negative errno on failure + */ +int ata_down_xfermask_limit(struct ata_device *dev, int force_pio0) +{ + unsigned long xfer_mask; + int highbit; + + xfer_mask = ata_pack_xfermask(dev->pio_mask, dev->mwdma_mask, + dev->udma_mask); + + if (!xfer_mask) + goto fail; + /* don't gear down to MWDMA from UDMA, go directly to PIO */ + if (xfer_mask & ATA_MASK_UDMA) + xfer_mask &= ~ATA_MASK_MWDMA; + + highbit = fls(xfer_mask) - 1; + xfer_mask &= ~(1 << highbit); + if (force_pio0) + xfer_mask &= 1 << ATA_SHIFT_PIO; + if (!xfer_mask) + goto fail; + + ata_unpack_xfermask(xfer_mask, &dev->pio_mask, &dev->mwdma_mask, + &dev->udma_mask); + + ata_dev_printk(dev, KERN_WARNING, "limiting speed to %s\n", + ata_mode_string(xfer_mask)); + + return 0; + + fail: + return -EINVAL; +} + +static int ata_dev_set_mode(struct ata_device *dev) { unsigned int err_mask; int rc; + dev->flags &= ~ATA_DFLAG_PIO; if (dev->xfer_shift == ATA_SHIFT_PIO) dev->flags |= ATA_DFLAG_PIO; - err_mask = ata_dev_set_xfermode(ap, dev); + err_mask = ata_dev_set_xfermode(dev); if (err_mask) { - printk(KERN_ERR - "ata%u: failed to set xfermode (err_mask=0x%x)\n", - ap->id, err_mask); + ata_dev_printk(dev, KERN_ERR, "failed to set xfermode " + "(err_mask=0x%x)\n", err_mask); return -EIO; } - rc = ata_dev_revalidate(ap, dev, 0); - if (rc) { - printk(KERN_ERR - "ata%u: failed to revalidate after set xfermode\n", - ap->id); + rc = ata_dev_revalidate(dev, 0); + if (rc) return rc; - } DPRINTK("xfer_shift=%u, xfer_mode=0x%x\n", dev->xfer_shift, (int)dev->xfer_mode); - printk(KERN_INFO "ata%u: dev %u configured for %s\n", - ap->id, dev->devno, - ata_mode_string(ata_xfer_mode2mask(dev->xfer_mode))); + ata_dev_printk(dev, KERN_INFO, "configured for %s\n", + ata_mode_string(ata_xfer_mode2mask(dev->xfer_mode))); return 0; } -static int ata_host_set_pio(struct ata_port *ap) +/** + * ata_set_mode - Program timings and issue SET FEATURES - XFER + * @ap: port on which timings will be programmed + * @r_failed_dev: out paramter for failed device + * + * Set ATA device disk transfer mode (PIO3, UDMA6, etc.). If + * ata_set_mode() fails, pointer to the failing device is + * returned in @r_failed_dev. + * + * LOCKING: + * PCI/etc. bus probe sem. + * + * RETURNS: + * 0 on success, negative errno otherwise + */ +int ata_set_mode(struct ata_port *ap, struct ata_device **r_failed_dev) { - int i; + struct ata_device *dev; + int i, rc = 0, used_dma = 0, found = 0; + /* has private set_mode? */ + if (ap->ops->set_mode) { + /* FIXME: make ->set_mode handle no device case and + * return error code and failing device on failure. + */ + for (i = 0; i < ATA_MAX_DEVICES; i++) { + if (ata_dev_ready(&ap->device[i])) { + ap->ops->set_mode(ap); + break; + } + } + return 0; + } + + /* step 1: calculate xfer_mask */ for (i = 0; i < ATA_MAX_DEVICES; i++) { - struct ata_device *dev = &ap->device[i]; + unsigned int pio_mask, dma_mask; + + dev = &ap->device[i]; - if (!ata_dev_present(dev)) + if (!ata_dev_enabled(dev)) continue; - if (!dev->pio_mode) { - printk(KERN_WARNING "ata%u: no PIO support for device %d.\n", ap->id, i); - return -1; - } + ata_dev_xfermask(dev); - dev->xfer_mode = dev->pio_mode; - dev->xfer_shift = ATA_SHIFT_PIO; - if (ap->ops->set_piomode) - ap->ops->set_piomode(ap, dev); + pio_mask = ata_pack_xfermask(dev->pio_mask, 0, 0); + dma_mask = ata_pack_xfermask(0, dev->mwdma_mask, dev->udma_mask); + dev->pio_mode = ata_xfer_mask2mode(pio_mask); + dev->dma_mode = ata_xfer_mask2mode(dma_mask); + + found = 1; + if (dev->dma_mode) + used_dma = 1; } + if (!found) + goto out; - return 0; -} + /* step 2: always set host PIO timings */ + for (i = 0; i < ATA_MAX_DEVICES; i++) { + dev = &ap->device[i]; + if (!ata_dev_enabled(dev)) + continue; -static void ata_host_set_dma(struct ata_port *ap) -{ - int i; + if (!dev->pio_mode) { + ata_dev_printk(dev, KERN_WARNING, "no PIO support\n"); + rc = -EINVAL; + goto out; + } + + dev->xfer_mode = dev->pio_mode; + dev->xfer_shift = ATA_SHIFT_PIO; + if (ap->ops->set_piomode) + ap->ops->set_piomode(ap, dev); + } + /* step 3: set host DMA timings */ for (i = 0; i < ATA_MAX_DEVICES; i++) { - struct ata_device *dev = &ap->device[i]; + dev = &ap->device[i]; - if (!ata_dev_present(dev) || !dev->dma_mode) + if (!ata_dev_enabled(dev) || !dev->dma_mode) continue; dev->xfer_mode = dev->dma_mode; @@ -1808,79 +2212,34 @@ static void ata_host_set_dma(struct ata_port *ap) if (ap->ops->set_dmamode) ap->ops->set_dmamode(ap, dev); } -} - -/** - * ata_set_mode - Program timings and issue SET FEATURES - XFER - * @ap: port on which timings will be programmed - * - * Set ATA device disk transfer mode (PIO3, UDMA6, etc.). - * - * LOCKING: - * PCI/etc. bus probe sem. - */ -static void ata_set_mode(struct ata_port *ap) -{ - int i, rc, used_dma = 0; - - /* step 1: calculate xfer_mask */ - for (i = 0; i < ATA_MAX_DEVICES; i++) { - struct ata_device *dev = &ap->device[i]; - unsigned int pio_mask, dma_mask; - - if (!ata_dev_present(dev)) - continue; - - ata_dev_xfermask(ap, dev); - - /* TODO: let LLDD filter dev->*_mask here */ - - pio_mask = ata_pack_xfermask(dev->pio_mask, 0, 0); - dma_mask = ata_pack_xfermask(0, dev->mwdma_mask, dev->udma_mask); - dev->pio_mode = ata_xfer_mask2mode(pio_mask); - dev->dma_mode = ata_xfer_mask2mode(dma_mask); - - if (dev->dma_mode) - used_dma = 1; - } - - /* step 2: always set host PIO timings */ - rc = ata_host_set_pio(ap); - if (rc) - goto err_out; - - /* step 3: set host DMA timings */ - ata_host_set_dma(ap); /* step 4: update devices' xfer mode */ for (i = 0; i < ATA_MAX_DEVICES; i++) { - struct ata_device *dev = &ap->device[i]; + dev = &ap->device[i]; - if (!ata_dev_present(dev)) + /* don't udpate suspended devices' xfer mode */ + if (!ata_dev_ready(dev)) continue; - if (ata_dev_set_mode(ap, dev)) - goto err_out; + rc = ata_dev_set_mode(dev); + if (rc) + goto out; } - /* - * Record simplex status. If we selected DMA then the other - * host channels are not permitted to do so. + /* Record simplex status. If we selected DMA then the other + * host channels are not permitted to do so. */ - if (used_dma && (ap->host_set->flags & ATA_HOST_SIMPLEX)) ap->host_set->simplex_claimed = 1; - /* - * Chip specific finalisation - */ + /* step5: chip specific finalisation */ if (ap->ops->post_set_mode) ap->ops->post_set_mode(ap); - return; - -err_out: - ata_port_disable(ap); + out: + if (rc) + *r_failed_dev = dev; + return rc; } /** @@ -1930,8 +2289,8 @@ unsigned int ata_busy_sleep (struct ata_port *ap, } if (status & ATA_BUSY) - printk(KERN_WARNING "ata%u is slow to respond, " - "please be patient\n", ap->id); + ata_port_printk(ap, KERN_WARNING, + "port is slow to respond, please be patient\n"); timeout = timer_start + tmout; while ((status & ATA_BUSY) && (time_before(jiffies, timeout))) { @@ -1940,8 +2299,8 @@ unsigned int ata_busy_sleep (struct ata_port *ap, } if (status & ATA_BUSY) { - printk(KERN_ERR "ata%u failed to respond (%lu secs)\n", - ap->id, tmout / HZ); + ata_port_printk(ap, KERN_ERR, "port failed to respond " + "(%lu secs)\n", tmout / HZ); return 1; } @@ -2033,8 +2392,10 @@ static unsigned int ata_bus_softreset(struct ata_port *ap, * the bus shows 0xFF because the odd clown forgets the D7 * pulldown resistor. */ - if (ata_check_status(ap) == 0xFF) + if (ata_check_status(ap) == 0xFF) { + ata_port_printk(ap, KERN_ERR, "SRST failed (status 0xFF)\n"); return AC_ERR_OTHER; + } ata_bus_post_reset(ap, devmask); @@ -2058,7 +2419,7 @@ static unsigned int ata_bus_softreset(struct ata_port *ap, * Obtains host_set lock. * * SIDE EFFECTS: - * Sets ATA_FLAG_PORT_DISABLED if bus reset fails. + * Sets ATA_FLAG_DISABLED if bus reset fails. */ void ata_bus_reset(struct ata_port *ap) @@ -2126,60 +2487,191 @@ void ata_bus_reset(struct ata_port *ap) return; err_out: - printk(KERN_ERR "ata%u: disabling port\n", ap->id); + ata_port_printk(ap, KERN_ERR, "disabling port\n"); ap->ops->port_disable(ap); DPRINTK("EXIT\n"); } -static int sata_phy_resume(struct ata_port *ap) +/** + * sata_phy_debounce - debounce SATA phy status + * @ap: ATA port to debounce SATA phy status for + * @params: timing parameters { interval, duratinon, timeout } in msec + * + * Make sure SStatus of @ap reaches stable state, determined by + * holding the same value where DET is not 1 for @duration polled + * every @interval, before @timeout. Timeout constraints the + * beginning of the stable state. Because, after hot unplugging, + * DET gets stuck at 1 on some controllers, this functions waits + * until timeout then returns 0 if DET is stable at 1. + * + * LOCKING: + * Kernel thread context (may sleep) + * + * RETURNS: + * 0 on success, -errno on failure. + */ +int sata_phy_debounce(struct ata_port *ap, const unsigned long *params) { - unsigned long timeout = jiffies + (HZ * 5); - u32 sstatus; + unsigned long interval_msec = params[0]; + unsigned long duration = params[1] * HZ / 1000; + unsigned long timeout = jiffies + params[2] * HZ / 1000; + unsigned long last_jiffies; + u32 last, cur; + int rc; - scr_write_flush(ap, SCR_CONTROL, 0x300); + if ((rc = sata_scr_read(ap, SCR_STATUS, &cur))) + return rc; + cur &= 0xf; - /* Wait for phy to become ready, if necessary. */ - do { - msleep(200); - sstatus = scr_read(ap, SCR_STATUS); - if ((sstatus & 0xf) != 1) - return 0; - } while (time_before(jiffies, timeout)); + last = cur; + last_jiffies = jiffies; - return -1; + while (1) { + msleep(interval_msec); + if ((rc = sata_scr_read(ap, SCR_STATUS, &cur))) + return rc; + cur &= 0xf; + + /* DET stable? */ + if (cur == last) { + if (cur == 1 && time_before(jiffies, timeout)) + continue; + if (time_after(jiffies, last_jiffies + duration)) + return 0; + continue; + } + + /* unstable, start over */ + last = cur; + last_jiffies = jiffies; + + /* check timeout */ + if (time_after(jiffies, timeout)) + return -EBUSY; + } +} + +/** + * sata_phy_resume - resume SATA phy + * @ap: ATA port to resume SATA phy for + * @params: timing parameters { interval, duratinon, timeout } in msec + * + * Resume SATA phy of @ap and debounce it. + * + * LOCKING: + * Kernel thread context (may sleep) + * + * RETURNS: + * 0 on success, -errno on failure. + */ +int sata_phy_resume(struct ata_port *ap, const unsigned long *params) +{ + u32 scontrol; + int rc; + + if ((rc = sata_scr_read(ap, SCR_CONTROL, &scontrol))) + return rc; + + scontrol = (scontrol & 0x0f0) | 0x300; + + if ((rc = sata_scr_write(ap, SCR_CONTROL, scontrol))) + return rc; + + /* Some PHYs react badly if SStatus is pounded immediately + * after resuming. Delay 200ms before debouncing. + */ + msleep(200); + + return sata_phy_debounce(ap, params); +} + +static void ata_wait_spinup(struct ata_port *ap) +{ + struct ata_eh_context *ehc = &ap->eh_context; + unsigned long end, secs; + int rc; + + /* first, debounce phy if SATA */ + if (ap->cbl == ATA_CBL_SATA) { + rc = sata_phy_debounce(ap, sata_deb_timing_hotplug); + + /* if debounced successfully and offline, no need to wait */ + if ((rc == 0 || rc == -EOPNOTSUPP) && ata_port_offline(ap)) + return; + } + + /* okay, let's give the drive time to spin up */ + end = ehc->i.hotplug_timestamp + ATA_SPINUP_WAIT * HZ / 1000; + secs = ((end - jiffies) + HZ - 1) / HZ; + + if (time_after(jiffies, end)) + return; + + if (secs > 5) + ata_port_printk(ap, KERN_INFO, "waiting for device to spin up " + "(%lu secs)\n", secs); + + schedule_timeout_uninterruptible(end - jiffies); } /** - * ata_std_probeinit - initialize probing - * @ap: port to be probed + * ata_std_prereset - prepare for reset + * @ap: ATA port to be reset * - * @ap is about to be probed. Initialize it. This function is - * to be used as standard callback for ata_drive_probe_reset(). + * @ap is about to be reset. Initialize it. + * + * LOCKING: + * Kernel thread context (may sleep) * - * NOTE!!! Do not use this function as probeinit if a low level - * driver implements only hardreset. Just pass NULL as probeinit - * in that case. Using this function is probably okay but doing - * so makes reset sequence different from the original - * ->phy_reset implementation and Jeff nervous. :-P + * RETURNS: + * 0 on success, -errno otherwise. */ -void ata_std_probeinit(struct ata_port *ap) +int ata_std_prereset(struct ata_port *ap) { - if ((ap->flags & ATA_FLAG_SATA) && ap->ops->scr_read) { - sata_phy_resume(ap); - if (sata_dev_present(ap)) - ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT); + struct ata_eh_context *ehc = &ap->eh_context; + const unsigned long *timing = sata_ehc_deb_timing(ehc); + int rc; + + /* handle link resume & hotplug spinup */ + if ((ehc->i.flags & ATA_EHI_RESUME_LINK) && + (ap->flags & ATA_FLAG_HRST_TO_RESUME)) + ehc->i.action |= ATA_EH_HARDRESET; + + if ((ehc->i.flags & ATA_EHI_HOTPLUGGED) && + (ap->flags & ATA_FLAG_SKIP_D2H_BSY)) + ata_wait_spinup(ap); + + /* if we're about to do hardreset, nothing more to do */ + if (ehc->i.action & ATA_EH_HARDRESET) + return 0; + + /* if SATA, resume phy */ + if (ap->cbl == ATA_CBL_SATA) { + rc = sata_phy_resume(ap, timing); + if (rc && rc != -EOPNOTSUPP) { + /* phy resume failed */ + ata_port_printk(ap, KERN_WARNING, "failed to resume " + "link for reset (errno=%d)\n", rc); + return rc; + } } + + /* Wait for !BSY if the controller can wait for the first D2H + * Reg FIS and we don't know that no device is attached. + */ + if (!(ap->flags & ATA_FLAG_SKIP_D2H_BSY) && !ata_port_offline(ap)) + ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT); + + return 0; } /** * ata_std_softreset - reset host port via ATA SRST * @ap: port to reset - * @verbose: fail verbosely * @classes: resulting classes of attached devices * - * Reset host port using ATA SRST. This function is to be used - * as standard callback for ata_drive_*_reset() functions. + * Reset host port using ATA SRST. * * LOCKING: * Kernel thread context (may sleep) @@ -2187,7 +2679,7 @@ void ata_std_probeinit(struct ata_port *ap) * RETURNS: * 0 on success, -errno otherwise. */ -int ata_std_softreset(struct ata_port *ap, int verbose, unsigned int *classes) +int ata_std_softreset(struct ata_port *ap, unsigned int *classes) { unsigned int slave_possible = ap->flags & ATA_FLAG_SLAVE_POSS; unsigned int devmask = 0, err_mask; @@ -2195,7 +2687,7 @@ int ata_std_softreset(struct ata_port *ap, int verbose, unsigned int *classes) DPRINTK("ENTER\n"); - if (ap->ops->scr_read && !sata_dev_present(ap)) { + if (ata_port_offline(ap)) { classes[0] = ATA_DEV_NONE; goto out; } @@ -2213,11 +2705,7 @@ int ata_std_softreset(struct ata_port *ap, int verbose, unsigned int *classes) DPRINTK("about to softreset, devmask=%x\n", devmask); err_mask = ata_bus_softreset(ap, devmask); if (err_mask) { - if (verbose) - printk(KERN_ERR "ata%u: SRST failed (err_mask=0x%x)\n", - ap->id, err_mask); - else - DPRINTK("EXIT, softreset failed (err_mask=0x%x)\n", + ata_port_printk(ap, KERN_ERR, "SRST failed (err_mask=0x%x)\n", err_mask); return -EIO; } @@ -2235,12 +2723,9 @@ int ata_std_softreset(struct ata_port *ap, int verbose, unsigned int *classes) /** * sata_std_hardreset - reset host port via SATA phy reset * @ap: port to reset - * @verbose: fail verbosely * @class: resulting class of attached device * * SATA phy-reset host port using DET bits of SControl register. - * This function is to be used as standard callback for - * ata_drive_*_reset(). * * LOCKING: * Kernel thread context (may sleep) @@ -2248,35 +2733,59 @@ int ata_std_softreset(struct ata_port *ap, int verbose, unsigned int *classes) * RETURNS: * 0 on success, -errno otherwise. */ -int sata_std_hardreset(struct ata_port *ap, int verbose, unsigned int *class) +int sata_std_hardreset(struct ata_port *ap, unsigned int *class) { + struct ata_eh_context *ehc = &ap->eh_context; + const unsigned long *timing = sata_ehc_deb_timing(ehc); + u32 scontrol; + int rc; + DPRINTK("ENTER\n"); - /* Issue phy wake/reset */ - scr_write_flush(ap, SCR_CONTROL, 0x301); + if (sata_set_spd_needed(ap)) { + /* SATA spec says nothing about how to reconfigure + * spd. To be on the safe side, turn off phy during + * reconfiguration. This works for at least ICH7 AHCI + * and Sil3124. + */ + if ((rc = sata_scr_read(ap, SCR_CONTROL, &scontrol))) + return rc; + + scontrol = (scontrol & 0x0f0) | 0x304; - /* - * Couldn't find anything in SATA I/II specs, but AHCI-1.1 + if ((rc = sata_scr_write(ap, SCR_CONTROL, scontrol))) + return rc; + + sata_set_spd(ap); + } + + /* issue phy wake/reset */ + if ((rc = sata_scr_read(ap, SCR_CONTROL, &scontrol))) + return rc; + + scontrol = (scontrol & 0x0f0) | 0x301; + + if ((rc = sata_scr_write_flush(ap, SCR_CONTROL, scontrol))) + return rc; + + /* Couldn't find anything in SATA I/II specs, but AHCI-1.1 * 10.4.2 says at least 1 ms. */ msleep(1); - /* Bring phy back */ - sata_phy_resume(ap); + /* bring phy back */ + sata_phy_resume(ap, timing); /* TODO: phy layer with polling, timeouts, etc. */ - if (!sata_dev_present(ap)) { + if (ata_port_offline(ap)) { *class = ATA_DEV_NONE; DPRINTK("EXIT, link offline\n"); return 0; } if (ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT)) { - if (verbose) - printk(KERN_ERR "ata%u: COMRESET failed " - "(device not ready)\n", ap->id); - else - DPRINTK("EXIT, device not ready\n"); + ata_port_printk(ap, KERN_ERR, + "COMRESET failed (device not ready)\n"); return -EIO; } @@ -2297,27 +2806,28 @@ int sata_std_hardreset(struct ata_port *ap, int verbose, unsigned int *class) * the device might have been reset more than once using * different reset methods before postreset is invoked. * - * This function is to be used as standard callback for - * ata_drive_*_reset(). - * * LOCKING: * Kernel thread context (may sleep) */ void ata_std_postreset(struct ata_port *ap, unsigned int *classes) { - DPRINTK("ENTER\n"); + u32 serror; - /* set cable type if it isn't already set */ - if (ap->cbl == ATA_CBL_NONE && ap->flags & ATA_FLAG_SATA) - ap->cbl = ATA_CBL_SATA; + DPRINTK("ENTER\n"); /* print link status */ - if (ap->cbl == ATA_CBL_SATA) - sata_print_link_status(ap); + sata_print_link_status(ap); + + /* clear SError */ + if (sata_scr_read(ap, SCR_ERROR, &serror) == 0) + sata_scr_write(ap, SCR_ERROR, serror); /* re-enable interrupts */ - if (ap->ioaddr.ctl_addr) /* FIXME: hack. create a hook instead */ - ata_irq_on(ap); + if (!ap->ops->error_handler) { + /* FIXME: hack. create a hook instead */ + if (ap->ioaddr.ctl_addr) + ata_irq_on(ap); + } /* is double-select really necessary? */ if (classes[0] != ATA_DEV_NONE) @@ -2342,127 +2852,8 @@ void ata_std_postreset(struct ata_port *ap, unsigned int *classes) DPRINTK("EXIT\n"); } -/** - * ata_std_probe_reset - standard probe reset method - * @ap: prot to perform probe-reset - * @classes: resulting classes of attached devices - * - * The stock off-the-shelf ->probe_reset method. - * - * LOCKING: - * Kernel thread context (may sleep) - * - * RETURNS: - * 0 on success, -errno otherwise. - */ -int ata_std_probe_reset(struct ata_port *ap, unsigned int *classes) -{ - ata_reset_fn_t hardreset; - - hardreset = NULL; - if (ap->flags & ATA_FLAG_SATA && ap->ops->scr_read) - hardreset = sata_std_hardreset; - - return ata_drive_probe_reset(ap, ata_std_probeinit, - ata_std_softreset, hardreset, - ata_std_postreset, classes); -} - -static int do_probe_reset(struct ata_port *ap, ata_reset_fn_t reset, - ata_postreset_fn_t postreset, - unsigned int *classes) -{ - int i, rc; - - for (i = 0; i < ATA_MAX_DEVICES; i++) - classes[i] = ATA_DEV_UNKNOWN; - - rc = reset(ap, 0, classes); - if (rc) - return rc; - - /* If any class isn't ATA_DEV_UNKNOWN, consider classification - * is complete and convert all ATA_DEV_UNKNOWN to - * ATA_DEV_NONE. - */ - for (i = 0; i < ATA_MAX_DEVICES; i++) - if (classes[i] != ATA_DEV_UNKNOWN) - break; - - if (i < ATA_MAX_DEVICES) - for (i = 0; i < ATA_MAX_DEVICES; i++) - if (classes[i] == ATA_DEV_UNKNOWN) - classes[i] = ATA_DEV_NONE; - - if (postreset) - postreset(ap, classes); - - return classes[0] != ATA_DEV_UNKNOWN ? 0 : -ENODEV; -} - -/** - * ata_drive_probe_reset - Perform probe reset with given methods - * @ap: port to reset - * @probeinit: probeinit method (can be NULL) - * @softreset: softreset method (can be NULL) - * @hardreset: hardreset method (can be NULL) - * @postreset: postreset method (can be NULL) - * @classes: resulting classes of attached devices - * - * Reset the specified port and classify attached devices using - * given methods. This function prefers softreset but tries all - * possible reset sequences to reset and classify devices. This - * function is intended to be used for constructing ->probe_reset - * callback by low level drivers. - * - * Reset methods should follow the following rules. - * - * - Return 0 on sucess, -errno on failure. - * - If classification is supported, fill classes[] with - * recognized class codes. - * - If classification is not supported, leave classes[] alone. - * - If verbose is non-zero, print error message on failure; - * otherwise, shut up. - * - * LOCKING: - * Kernel thread context (may sleep) - * - * RETURNS: - * 0 on success, -EINVAL if no reset method is avaliable, -ENODEV - * if classification fails, and any error code from reset - * methods. - */ -int ata_drive_probe_reset(struct ata_port *ap, ata_probeinit_fn_t probeinit, - ata_reset_fn_t softreset, ata_reset_fn_t hardreset, - ata_postreset_fn_t postreset, unsigned int *classes) -{ - int rc = -EINVAL; - - if (probeinit) - probeinit(ap); - - if (softreset) { - rc = do_probe_reset(ap, softreset, postreset, classes); - if (rc == 0) - return 0; - } - - if (!hardreset) - return rc; - - rc = do_probe_reset(ap, hardreset, postreset, classes); - if (rc == 0 || rc != -ENODEV) - return rc; - - if (softreset) - rc = do_probe_reset(ap, softreset, postreset, classes); - - return rc; -} - /** * ata_dev_same_device - Determine whether new ID matches configured device - * @ap: port on which the device to compare against resides * @dev: device to compare against * @new_class: class of the new device * @new_id: IDENTIFY page of the new device @@ -2477,17 +2868,16 @@ int ata_drive_probe_reset(struct ata_port *ap, ata_probeinit_fn_t probeinit, * RETURNS: * 1 if @dev matches @new_class and @new_id, 0 otherwise. */ -static int ata_dev_same_device(struct ata_port *ap, struct ata_device *dev, - unsigned int new_class, const u16 *new_id) +static int ata_dev_same_device(struct ata_device *dev, unsigned int new_class, + const u16 *new_id) { const u16 *old_id = dev->id; unsigned char model[2][41], serial[2][21]; u64 new_n_sectors; if (dev->class != new_class) { - printk(KERN_INFO - "ata%u: dev %u class mismatch %d != %d\n", - ap->id, dev->devno, dev->class, new_class); + ata_dev_printk(dev, KERN_INFO, "class mismatch %d != %d\n", + dev->class, new_class); return 0; } @@ -2498,24 +2888,22 @@ static int ata_dev_same_device(struct ata_port *ap, struct ata_device *dev, new_n_sectors = ata_id_n_sectors(new_id); if (strcmp(model[0], model[1])) { - printk(KERN_INFO - "ata%u: dev %u model number mismatch '%s' != '%s'\n", - ap->id, dev->devno, model[0], model[1]); + ata_dev_printk(dev, KERN_INFO, "model number mismatch " + "'%s' != '%s'\n", model[0], model[1]); return 0; } if (strcmp(serial[0], serial[1])) { - printk(KERN_INFO - "ata%u: dev %u serial number mismatch '%s' != '%s'\n", - ap->id, dev->devno, serial[0], serial[1]); + ata_dev_printk(dev, KERN_INFO, "serial number mismatch " + "'%s' != '%s'\n", serial[0], serial[1]); return 0; } if (dev->class == ATA_DEV_ATA && dev->n_sectors != new_n_sectors) { - printk(KERN_INFO - "ata%u: dev %u n_sectors mismatch %llu != %llu\n", - ap->id, dev->devno, (unsigned long long)dev->n_sectors, - (unsigned long long)new_n_sectors); + ata_dev_printk(dev, KERN_INFO, "n_sectors mismatch " + "%llu != %llu\n", + (unsigned long long)dev->n_sectors, + (unsigned long long)new_n_sectors); return 0; } @@ -2524,7 +2912,6 @@ static int ata_dev_same_device(struct ata_port *ap, struct ata_device *dev, /** * ata_dev_revalidate - Revalidate ATA device - * @ap: port on which the device to revalidate resides * @dev: device to revalidate * @post_reset: is this revalidation after reset? * @@ -2537,40 +2924,37 @@ static int ata_dev_same_device(struct ata_port *ap, struct ata_device *dev, * RETURNS: * 0 on success, negative errno otherwise */ -int ata_dev_revalidate(struct ata_port *ap, struct ata_device *dev, - int post_reset) +int ata_dev_revalidate(struct ata_device *dev, int post_reset) { - unsigned int class; - u16 *id; + unsigned int class = dev->class; + u16 *id = (void *)dev->ap->sector_buf; int rc; - if (!ata_dev_present(dev)) - return -ENODEV; - - class = dev->class; - id = NULL; + if (!ata_dev_enabled(dev)) { + rc = -ENODEV; + goto fail; + } - /* allocate & read ID data */ - rc = ata_dev_read_id(ap, dev, &class, post_reset, &id); + /* read ID data */ + rc = ata_dev_read_id(dev, &class, post_reset, id); if (rc) goto fail; /* is the device still there? */ - if (!ata_dev_same_device(ap, dev, class, id)) { + if (!ata_dev_same_device(dev, class, id)) { rc = -ENODEV; goto fail; } - kfree(dev->id); - dev->id = id; + memcpy(dev->id, id, sizeof(id[0]) * ATA_ID_WORDS); /* configure device according to the new ID */ - return ata_dev_configure(ap, dev, 0); + rc = ata_dev_configure(dev, 0); + if (rc == 0) + return 0; fail: - printk(KERN_ERR "ata%u: dev %u revalidation failed (errno=%d)\n", - ap->id, dev->devno, rc); - kfree(id); + ata_dev_printk(dev, KERN_ERR, "revalidation failed (errno=%d)\n", rc); return rc; } @@ -2626,6 +3010,14 @@ static int ata_dma_blacklisted(const struct ata_device *dev) unsigned int nlen, rlen; int i; + /* We don't support polling DMA. + * DMA blacklist those ATAPI devices with CDB-intr (and use PIO) + * if the LLDD handles only interrupts in the HSM_ST_LAST state. + */ + if ((dev->ap->flags & ATA_FLAG_PIO_POLLING) && + (dev->flags & ATA_DFLAG_CDB_INTR)) + return 1; + ata_id_string(dev->id, model_num, ATA_ID_PROD_OFS, sizeof(model_num)); ata_id_string(dev->id, model_rev, ATA_ID_FW_REV_OFS, @@ -2646,7 +3038,6 @@ static int ata_dma_blacklisted(const struct ata_device *dev) /** * ata_dev_xfermask - Compute supported xfermask of the given device - * @ap: Port on which the device to compute xfermask for resides * @dev: Device to compute xfermask for * * Compute supported xfermask of @dev and store it in @@ -2661,49 +3052,61 @@ static int ata_dma_blacklisted(const struct ata_device *dev) * LOCKING: * None. */ -static void ata_dev_xfermask(struct ata_port *ap, struct ata_device *dev) +static void ata_dev_xfermask(struct ata_device *dev) { + struct ata_port *ap = dev->ap; struct ata_host_set *hs = ap->host_set; unsigned long xfer_mask; int i; - xfer_mask = ata_pack_xfermask(ap->pio_mask, ap->mwdma_mask, - ap->udma_mask); + xfer_mask = ata_pack_xfermask(ap->pio_mask, + ap->mwdma_mask, ap->udma_mask); + + /* Apply cable rule here. Don't apply it early because when + * we handle hot plug the cable type can itself change. + */ + if (ap->cbl == ATA_CBL_PATA40) + xfer_mask &= ~(0xF8 << ATA_SHIFT_UDMA); /* FIXME: Use port-wide xfermask for now */ for (i = 0; i < ATA_MAX_DEVICES; i++) { struct ata_device *d = &ap->device[i]; - if (!ata_dev_present(d)) + + if (ata_dev_absent(d)) continue; - xfer_mask &= ata_pack_xfermask(d->pio_mask, d->mwdma_mask, - d->udma_mask); + + if (ata_dev_disabled(d)) { + /* to avoid violating device selection timing */ + xfer_mask &= ata_pack_xfermask(d->pio_mask, + UINT_MAX, UINT_MAX); + continue; + } + + xfer_mask &= ata_pack_xfermask(d->pio_mask, + d->mwdma_mask, d->udma_mask); xfer_mask &= ata_id_xfermask(d->id); if (ata_dma_blacklisted(d)) xfer_mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA); - /* Apply cable rule here. Don't apply it early because when - we handle hot plug the cable type can itself change */ - if (ap->cbl == ATA_CBL_PATA40) - xfer_mask &= ~(0xF8 << ATA_SHIFT_UDMA); } if (ata_dma_blacklisted(dev)) - printk(KERN_WARNING "ata%u: dev %u is on DMA blacklist, " - "disabling DMA\n", ap->id, dev->devno); + ata_dev_printk(dev, KERN_WARNING, + "device is on DMA blacklist, disabling DMA\n"); if (hs->flags & ATA_HOST_SIMPLEX) { if (hs->simplex_claimed) xfer_mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA); } + if (ap->ops->mode_filter) xfer_mask = ap->ops->mode_filter(ap, dev, xfer_mask); - ata_unpack_xfermask(xfer_mask, &dev->pio_mask, &dev->mwdma_mask, - &dev->udma_mask); + ata_unpack_xfermask(xfer_mask, &dev->pio_mask, + &dev->mwdma_mask, &dev->udma_mask); } /** * ata_dev_set_xfermode - Issue SET FEATURES - XFER MODE command - * @ap: Port associated with device @dev * @dev: Device to which command will be sent * * Issue SET FEATURES - XFER MODE command to device @dev @@ -2716,8 +3119,7 @@ static void ata_dev_xfermask(struct ata_port *ap, struct ata_device *dev) * 0 on success, AC_ERR_* mask otherwise. */ -static unsigned int ata_dev_set_xfermode(struct ata_port *ap, - struct ata_device *dev) +static unsigned int ata_dev_set_xfermode(struct ata_device *dev) { struct ata_taskfile tf; unsigned int err_mask; @@ -2725,14 +3127,14 @@ static unsigned int ata_dev_set_xfermode(struct ata_port *ap, /* set up set-features taskfile */ DPRINTK("set features - xfer mode\n"); - ata_tf_init(ap, &tf, dev->devno); + ata_tf_init(dev, &tf); 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; - err_mask = ata_exec_internal(ap, dev, &tf, DMA_NONE, NULL, 0); + err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0); DPRINTK("EXIT, err_mask=%x\n", err_mask); return err_mask; @@ -2740,7 +3142,6 @@ static unsigned int ata_dev_set_xfermode(struct ata_port *ap, /** * ata_dev_init_params - Issue INIT DEV PARAMS command - * @ap: Port associated with device @dev * @dev: Device to which command will be sent * @heads: Number of heads (taskfile parameter) * @sectors: Number of sectors (taskfile parameter) @@ -2751,11 +3152,8 @@ static unsigned int ata_dev_set_xfermode(struct ata_port *ap, * RETURNS: * 0 on success, AC_ERR_* mask otherwise. */ - -static unsigned int ata_dev_init_params(struct ata_port *ap, - struct ata_device *dev, - u16 heads, - u16 sectors) +static unsigned int ata_dev_init_params(struct ata_device *dev, + u16 heads, u16 sectors) { struct ata_taskfile tf; unsigned int err_mask; @@ -2767,14 +3165,14 @@ static unsigned int ata_dev_init_params(struct ata_port *ap, /* set up init dev params taskfile */ DPRINTK("init dev params \n"); - ata_tf_init(ap, &tf, dev->devno); + ata_tf_init(dev, &tf); 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 */ - err_mask = ata_exec_internal(ap, dev, &tf, DMA_NONE, NULL, 0); + err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0); DPRINTK("EXIT, err_mask=%x\n", err_mask); return err_mask; @@ -2957,6 +3355,7 @@ void ata_sg_init_one(struct ata_queued_cmd *qc, void *buf, unsigned int buflen) qc->n_elem = 1; qc->orig_n_elem = 1; qc->buf_virt = buf; + qc->nbytes = buflen; sg = qc->__sg; sg_init_one(sg, buf, buflen); @@ -3139,134 +3538,6 @@ skip_map: return 0; } -/** - * ata_poll_qc_complete - turn irq back on and finish qc - * @qc: Command to complete - * @err_mask: ATA status register content - * - * LOCKING: - * None. (grabs host lock) - */ - -void ata_poll_qc_complete(struct ata_queued_cmd *qc) -{ - struct ata_port *ap = qc->ap; - unsigned long flags; - - spin_lock_irqsave(&ap->host_set->lock, flags); - ap->flags &= ~ATA_FLAG_NOINTR; - ata_irq_on(ap); - ata_qc_complete(qc); - spin_unlock_irqrestore(&ap->host_set->lock, flags); -} - -/** - * ata_pio_poll - poll using PIO, depending on current state - * @ap: the target ata_port - * - * LOCKING: - * None. (executing in kernel thread context) - * - * RETURNS: - * timeout value to use - */ - -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); - WARN_ON(qc == NULL); - - switch (ap->hsm_task_state) { - case HSM_ST: - case HSM_ST_POLL: - poll_state = HSM_ST_POLL; - reg_state = HSM_ST; - break; - case HSM_ST_LAST: - case HSM_ST_LAST_POLL: - poll_state = HSM_ST_LAST_POLL; - reg_state = HSM_ST_LAST; - break; - default: - BUG(); - break; - } - - status = ata_chk_status(ap); - if (status & ATA_BUSY) { - if (time_after(jiffies, ap->pio_task_timeout)) { - qc->err_mask |= AC_ERR_TIMEOUT; - ap->hsm_task_state = HSM_ST_TMOUT; - return 0; - } - ap->hsm_task_state = poll_state; - return ATA_SHORT_PAUSE; - } - - ap->hsm_task_state = reg_state; - return 0; -} - -/** - * ata_pio_complete - check if drive is busy or idle - * @ap: the target ata_port - * - * LOCKING: - * None. (executing in kernel thread context) - * - * RETURNS: - * Non-zero if qc completed, zero otherwise. - */ - -static int ata_pio_complete (struct ata_port *ap) -{ - struct ata_queued_cmd *qc; - u8 drv_stat; - - /* - * This is purely heuristic. This is a fast path. Sometimes when - * we enter, BSY will be cleared in a chk-status or two. If not, - * the drive is probably seeking or something. Snooze for a couple - * msecs, then chk-status again. If still busy, fall back to - * HSM_ST_POLL state. - */ - drv_stat = ata_busy_wait(ap, ATA_BUSY, 10); - if (drv_stat & ATA_BUSY) { - msleep(2); - 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); - WARN_ON(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; - } - - ap->hsm_task_state = HSM_ST_IDLE; - - WARN_ON(qc->err_mask); - ata_poll_qc_complete(qc); - - /* another command may start at this point */ - - return 1; -} - - /** * swap_buf_le16 - swap halves of 16-bit words in place * @buf: Buffer to swap @@ -3291,7 +3562,7 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words) /** * ata_mmio_data_xfer - Transfer data by MMIO - * @ap: port to read/write + * @adev: device for this I/O * @buf: data buffer * @buflen: buffer length * @write_data: read/write @@ -3302,9 +3573,10 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words) * Inherited from caller. */ -static void ata_mmio_data_xfer(struct ata_port *ap, unsigned char *buf, - unsigned int buflen, int write_data) +void ata_mmio_data_xfer(struct ata_device *adev, unsigned char *buf, + unsigned int buflen, int write_data) { + struct ata_port *ap = adev->ap; unsigned int i; unsigned int words = buflen >> 1; u16 *buf16 = (u16 *) buf; @@ -3336,7 +3608,7 @@ static void ata_mmio_data_xfer(struct ata_port *ap, unsigned char *buf, /** * ata_pio_data_xfer - Transfer data by PIO - * @ap: port to read/write + * @adev: device to target * @buf: data buffer * @buflen: buffer length * @write_data: read/write @@ -3347,9 +3619,10 @@ static void ata_mmio_data_xfer(struct ata_port *ap, unsigned char *buf, * Inherited from caller. */ -static void ata_pio_data_xfer(struct ata_port *ap, unsigned char *buf, - unsigned int buflen, int write_data) +void ata_pio_data_xfer(struct ata_device *adev, unsigned char *buf, + unsigned int buflen, int write_data) { + struct ata_port *ap = adev->ap; unsigned int words = buflen >> 1; /* Transfer multiple of 2 bytes */ @@ -3374,38 +3647,29 @@ static void ata_pio_data_xfer(struct ata_port *ap, unsigned char *buf, } /** - * ata_data_xfer - Transfer data from/to the data register. - * @ap: port to read/write + * ata_pio_data_xfer_noirq - Transfer data by PIO + * @adev: device to target * @buf: data buffer * @buflen: buffer length - * @do_write: read/write + * @write_data: read/write * - * Transfer data from/to the device data register. + * Transfer data from/to the device data register by PIO. Do the + * transfer with interrupts disabled. * * LOCKING: * Inherited from caller. */ -static void ata_data_xfer(struct ata_port *ap, unsigned char *buf, - unsigned int buflen, int do_write) +void ata_pio_data_xfer_noirq(struct ata_device *adev, unsigned char *buf, + unsigned int buflen, int write_data) { - /* Make the crap hardware pay the costs not the good stuff */ - if (unlikely(ap->flags & ATA_FLAG_IRQ_MASK)) { - unsigned long flags; - local_irq_save(flags); - if (ap->flags & ATA_FLAG_MMIO) - ata_mmio_data_xfer(ap, buf, buflen, do_write); - else - ata_pio_data_xfer(ap, buf, buflen, do_write); - local_irq_restore(flags); - } else { - if (ap->flags & ATA_FLAG_MMIO) - ata_mmio_data_xfer(ap, buf, buflen, do_write); - else - ata_pio_data_xfer(ap, buf, buflen, do_write); - } + unsigned long flags; + local_irq_save(flags); + ata_pio_data_xfer(adev, buf, buflen, write_data); + local_irq_restore(flags); } + /** * ata_pio_sector - Transfer ATA_SECT_SIZE (512 bytes) of data. * @qc: Command on going @@ -3435,7 +3699,24 @@ static void ata_pio_sector(struct ata_queued_cmd *qc) page = nth_page(page, (offset >> PAGE_SHIFT)); offset %= PAGE_SIZE; - buf = kmap(page) + offset; + DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read"); + + if (PageHighMem(page)) { + unsigned long flags; + + /* FIXME: use a bounce buffer */ + local_irq_save(flags); + buf = kmap_atomic(page, KM_IRQ0); + + /* do the actual data transfer */ + ap->ops->data_xfer(qc->dev, buf + offset, ATA_SECT_SIZE, do_write); + + kunmap_atomic(buf, KM_IRQ0); + local_irq_restore(flags); + } else { + buf = page_address(page); + ap->ops->data_xfer(qc->dev, buf + offset, ATA_SECT_SIZE, do_write); + } qc->cursect++; qc->cursg_ofs++; @@ -3444,14 +3725,68 @@ static void ata_pio_sector(struct ata_queued_cmd *qc) qc->cursg++; qc->cursg_ofs = 0; } +} - DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read"); +/** + * ata_pio_sectors - Transfer one or many 512-byte sectors. + * @qc: Command on going + * + * Transfer one or many ATA_SECT_SIZE of data from/to the + * ATA device for the DRQ request. + * + * LOCKING: + * Inherited from caller. + */ + +static void ata_pio_sectors(struct ata_queued_cmd *qc) +{ + if (is_multi_taskfile(&qc->tf)) { + /* READ/WRITE MULTIPLE */ + unsigned int nsect; + + WARN_ON(qc->dev->multi_count == 0); + + nsect = min(qc->nsect - qc->cursect, qc->dev->multi_count); + while (nsect--) + ata_pio_sector(qc); + } else + ata_pio_sector(qc); +} + +/** + * atapi_send_cdb - Write CDB bytes to hardware + * @ap: Port to which ATAPI device is attached. + * @qc: Taskfile currently active + * + * When device has indicated its readiness to accept + * a CDB, this function is called. Send the CDB. + * + * LOCKING: + * caller. + */ - /* do the actual data transfer */ - do_write = (qc->tf.flags & ATA_TFLAG_WRITE); - ata_data_xfer(ap, buf, ATA_SECT_SIZE, do_write); +static void atapi_send_cdb(struct ata_port *ap, struct ata_queued_cmd *qc) +{ + /* send SCSI cdb */ + DPRINTK("send cdb\n"); + WARN_ON(qc->dev->cdb_len < 12); + + ap->ops->data_xfer(qc->dev, qc->cdb, qc->dev->cdb_len, 1); + ata_altstatus(ap); /* flush */ - kunmap(page); + switch (qc->tf.protocol) { + case ATA_PROT_ATAPI: + ap->hsm_task_state = HSM_ST; + break; + case ATA_PROT_ATAPI_NODATA: + ap->hsm_task_state = HSM_ST_LAST; + break; + case ATA_PROT_ATAPI_DMA: + ap->hsm_task_state = HSM_ST_LAST; + /* initiate bmdma */ + ap->ops->bmdma_start(qc); + break; + } } /** @@ -3492,11 +3827,11 @@ next_sg: unsigned int i; if (words) /* warning if bytes > 1 */ - printk(KERN_WARNING "ata%u: %u bytes trailing data\n", - ap->id, bytes); + ata_dev_printk(qc->dev, KERN_WARNING, + "%u bytes trailing data\n", bytes); for (i = 0; i < words; i++) - ata_data_xfer(ap, (unsigned char*)pad_buf, 2, do_write); + ap->ops->data_xfer(qc->dev, (unsigned char*)pad_buf, 2, do_write); ap->hsm_task_state = HSM_ST_LAST; return; @@ -3517,7 +3852,24 @@ next_sg: /* don't cross page boundaries */ count = min(count, (unsigned int)PAGE_SIZE - offset); - buf = kmap(page) + offset; + DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read"); + + if (PageHighMem(page)) { + unsigned long flags; + + /* FIXME: use bounce buffer */ + local_irq_save(flags); + buf = kmap_atomic(page, KM_IRQ0); + + /* do the actual data transfer */ + ap->ops->data_xfer(qc->dev, buf + offset, count, do_write); + + kunmap_atomic(buf, KM_IRQ0); + local_irq_restore(flags); + } else { + buf = page_address(page); + ap->ops->data_xfer(qc->dev, buf + offset, count, do_write); + } bytes -= count; qc->curbytes += count; @@ -3528,13 +3880,6 @@ next_sg: qc->cursg_ofs = 0; } - DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read"); - - /* do the actual data transfer */ - ata_data_xfer(ap, buf, count, do_write); - - kunmap(page); - if (bytes) goto next_sg; } @@ -3556,10 +3901,16 @@ static void atapi_pio_bytes(struct ata_queued_cmd *qc) unsigned int ireason, bc_lo, bc_hi, bytes; int i_write, do_write = (qc->tf.flags & ATA_TFLAG_WRITE) ? 1 : 0; - ap->ops->tf_read(ap, &qc->tf); - ireason = qc->tf.nsect; - bc_lo = qc->tf.lbam; - bc_hi = qc->tf.lbah; + /* Abuse qc->result_tf for temp storage of intermediate TF + * here to save some kernel stack usage. + * For normal completion, qc->result_tf is not relevant. For + * error, qc->result_tf is later overwritten by ata_qc_complete(). + * So, the correctness of qc->result_tf is not affected. + */ + ap->ops->tf_read(ap, &qc->result_tf); + ireason = qc->result_tf.nsect; + bc_lo = qc->result_tf.lbam; + bc_hi = qc->result_tf.lbah; bytes = (bc_hi << 8) | bc_lo; /* shall be cleared to zero, indicating xfer of data */ @@ -3571,307 +3922,365 @@ static void atapi_pio_bytes(struct ata_queued_cmd *qc) if (do_write != i_write) goto err_out; + VPRINTK("ata%u: xfering %d bytes\n", ap->id, bytes); + __atapi_pio_bytes(qc, bytes); return; err_out: - printk(KERN_INFO "ata%u: dev %u: ATAPI check failed\n", - ap->id, dev->devno); + ata_dev_printk(dev, KERN_INFO, "ATAPI check failed\n"); qc->err_mask |= AC_ERR_HSM; ap->hsm_task_state = HSM_ST_ERR; } /** - * ata_pio_block - start PIO on a block + * ata_hsm_ok_in_wq - Check if the qc can be handled in the workqueue. * @ap: the target ata_port + * @qc: qc on going * - * LOCKING: - * None. (executing in kernel thread context) + * RETURNS: + * 1 if ok in workqueue, 0 otherwise. */ -static void ata_pio_block(struct ata_port *ap) +static inline int ata_hsm_ok_in_wq(struct ata_port *ap, struct ata_queued_cmd *qc) { - struct ata_queued_cmd *qc; - u8 status; + if (qc->tf.flags & ATA_TFLAG_POLLING) + return 1; - /* - * This is purely heuristic. This is a fast path. - * Sometimes when we enter, BSY will be cleared in - * a chk-status or two. If not, the drive is probably seeking - * or something. Snooze for a couple msecs, then - * chk-status again. If still busy, fall back to - * HSM_ST_POLL state. - */ - status = ata_busy_wait(ap, ATA_BUSY, 5); - if (status & ATA_BUSY) { - msleep(2); - status = ata_busy_wait(ap, ATA_BUSY, 10); - if (status & ATA_BUSY) { - ap->hsm_task_state = HSM_ST_POLL; - ap->pio_task_timeout = jiffies + ATA_TMOUT_PIO; - return; - } + if (ap->hsm_task_state == HSM_ST_FIRST) { + if (qc->tf.protocol == ATA_PROT_PIO && + (qc->tf.flags & ATA_TFLAG_WRITE)) + return 1; + + if (is_atapi_taskfile(&qc->tf) && + !(qc->dev->flags & ATA_DFLAG_CDB_INTR)) + return 1; } - qc = ata_qc_from_tag(ap, ap->active_tag); - WARN_ON(qc == NULL); + return 0; +} - /* check error */ - if (status & (ATA_ERR | ATA_DF)) { - qc->err_mask |= AC_ERR_DEV; - ap->hsm_task_state = HSM_ST_ERR; - return; - } +/** + * ata_hsm_qc_complete - finish a qc running on standard HSM + * @qc: Command to complete + * @in_wq: 1 if called from workqueue, 0 otherwise + * + * Finish @qc which is running on standard HSM. + * + * LOCKING: + * If @in_wq is zero, spin_lock_irqsave(host_set lock). + * Otherwise, none on entry and grabs host lock. + */ +static void ata_hsm_qc_complete(struct ata_queued_cmd *qc, int in_wq) +{ + struct ata_port *ap = qc->ap; + unsigned long flags; - /* transfer data if any */ - if (is_atapi_taskfile(&qc->tf)) { - /* DRQ=0 means no more data to transfer */ - if ((status & ATA_DRQ) == 0) { - ap->hsm_task_state = HSM_ST_LAST; - return; - } + if (ap->ops->error_handler) { + if (in_wq) { + spin_lock_irqsave(ap->lock, flags); - atapi_pio_bytes(qc); - } else { - /* handle BSY=0, DRQ=0 as error */ - if ((status & ATA_DRQ) == 0) { - qc->err_mask |= AC_ERR_HSM; - ap->hsm_task_state = HSM_ST_ERR; - return; - } + /* EH might have kicked in while host_set lock + * is released. + */ + qc = ata_qc_from_tag(ap, qc->tag); + if (qc) { + if (likely(!(qc->err_mask & AC_ERR_HSM))) { + ata_irq_on(ap); + ata_qc_complete(qc); + } else + ata_port_freeze(ap); + } - ata_pio_sector(qc); + spin_unlock_irqrestore(ap->lock, flags); + } else { + if (likely(!(qc->err_mask & AC_ERR_HSM))) + ata_qc_complete(qc); + else + ata_port_freeze(ap); + } + } else { + if (in_wq) { + spin_lock_irqsave(ap->lock, flags); + ata_irq_on(ap); + ata_qc_complete(qc); + spin_unlock_irqrestore(ap->lock, flags); + } else + ata_qc_complete(qc); } ata_altstatus(ap); /* flush */ } -static void ata_pio_error(struct ata_port *ap) +/** + * ata_hsm_move - move the HSM to the next state. + * @ap: the target ata_port + * @qc: qc on going + * @status: current device status + * @in_wq: 1 if called from workqueue, 0 otherwise + * + * RETURNS: + * 1 when poll next status needed, 0 otherwise. + */ +int ata_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc, + u8 status, int in_wq) { - struct ata_queued_cmd *qc; + unsigned long flags = 0; + int poll_next; - qc = ata_qc_from_tag(ap, ap->active_tag); - WARN_ON(qc == NULL); + WARN_ON((qc->flags & ATA_QCFLAG_ACTIVE) == 0); - if (qc->tf.command != ATA_CMD_PACKET) - printk(KERN_WARNING "ata%u: PIO error\n", ap->id); - - /* make sure qc->err_mask is available to - * know what's wrong and recover + /* Make sure ata_qc_issue_prot() does not throw things + * like DMA polling into the workqueue. Notice that + * in_wq is not equivalent to (qc->tf.flags & ATA_TFLAG_POLLING). */ - WARN_ON(qc->err_mask == 0); - - ap->hsm_task_state = HSM_ST_IDLE; - - ata_poll_qc_complete(qc); -} - -static void ata_pio_task(void *_data) -{ - struct ata_port *ap = _data; - unsigned long timeout; - int qc_completed; + WARN_ON(in_wq != ata_hsm_ok_in_wq(ap, qc)); fsm_start: - timeout = 0; - qc_completed = 0; + DPRINTK("ata%u: protocol %d task_state %d (dev_stat 0x%X)\n", + ap->id, qc->tf.protocol, ap->hsm_task_state, status); switch (ap->hsm_task_state) { - case HSM_ST_IDLE: - return; + case HSM_ST_FIRST: + /* Send first data block or PACKET CDB */ - case HSM_ST: - ata_pio_block(ap); - break; - - case HSM_ST_LAST: - qc_completed = ata_pio_complete(ap); - break; - - case HSM_ST_POLL: - case HSM_ST_LAST_POLL: - timeout = ata_pio_poll(ap); - break; - - case HSM_ST_TMOUT: - case HSM_ST_ERR: - ata_pio_error(ap); - return; - } - - if (timeout) - ata_port_queue_task(ap, ata_pio_task, ap, timeout); - else if (!qc_completed) - goto fsm_start; -} - -/** - * atapi_packet_task - Write CDB bytes to hardware - * @_data: Port to which ATAPI device is attached. - * - * When device has indicated its readiness to accept - * a CDB, this function is called. Send the CDB. - * If DMA is to be performed, exit immediately. - * Otherwise, we are in polling mode, so poll - * status under operation succeeds or fails. - * - * LOCKING: - * Kernel thread context (may sleep) - */ - -static void atapi_packet_task(void *_data) -{ - struct ata_port *ap = _data; - struct ata_queued_cmd *qc; - u8 status; - - qc = ata_qc_from_tag(ap, ap->active_tag); - WARN_ON(qc == NULL); - WARN_ON(!(qc->flags & ATA_QCFLAG_ACTIVE)); + /* If polling, we will stay in the work queue after + * sending the data. Otherwise, interrupt handler + * takes over after sending the data. + */ + poll_next = (qc->tf.flags & ATA_TFLAG_POLLING); + + /* check device status */ + if (unlikely((status & ATA_DRQ) == 0)) { + /* handle BSY=0, DRQ=0 as error */ + if (likely(status & (ATA_ERR | ATA_DF))) + /* device stops HSM for abort/error */ + qc->err_mask |= AC_ERR_DEV; + else + /* HSM violation. Let EH handle this */ + qc->err_mask |= AC_ERR_HSM; - /* sleep-wait for BSY to clear */ - DPRINTK("busy wait\n"); - if (ata_busy_sleep(ap, ATA_TMOUT_CDB_QUICK, ATA_TMOUT_CDB)) { - qc->err_mask |= AC_ERR_TIMEOUT; - goto err_out; - } + ap->hsm_task_state = HSM_ST_ERR; + goto fsm_start; + } - /* make sure DRQ is set */ - status = ata_chk_status(ap); - if ((status & (ATA_BUSY | ATA_DRQ)) != ATA_DRQ) { - qc->err_mask |= AC_ERR_HSM; - goto err_out; - } + /* Device should not ask for data transfer (DRQ=1) + * when it finds something wrong. + * We ignore DRQ here and stop the HSM by + * changing hsm_task_state to HSM_ST_ERR and + * let the EH abort the command or reset the device. + */ + if (unlikely(status & (ATA_ERR | ATA_DF))) { + printk(KERN_WARNING "ata%d: DRQ=1 with device error, dev_stat 0x%X\n", + ap->id, status); + qc->err_mask |= AC_ERR_HSM; + ap->hsm_task_state = HSM_ST_ERR; + goto fsm_start; + } - /* send SCSI cdb */ - DPRINTK("send cdb\n"); - WARN_ON(qc->dev->cdb_len < 12); + /* Send the CDB (atapi) or the first data block (ata pio out). + * During the state transition, interrupt handler shouldn't + * be invoked before the data transfer is complete and + * hsm_task_state is changed. Hence, the following locking. + */ + if (in_wq) + spin_lock_irqsave(ap->lock, flags); - if (qc->tf.protocol == ATA_PROT_ATAPI_DMA || - qc->tf.protocol == ATA_PROT_ATAPI_NODATA) { - unsigned long flags; + if (qc->tf.protocol == ATA_PROT_PIO) { + /* PIO data out protocol. + * send first data block. + */ - /* Once we're done issuing command and kicking bmdma, - * irq handler takes over. To not lose irq, we need - * to clear NOINTR flag before sending cdb, but - * interrupt handler shouldn't be invoked before we're - * finished. Hence, the following locking. + /* ata_pio_sectors() might change the state + * to HSM_ST_LAST. so, the state is changed here + * before ata_pio_sectors(). + */ + ap->hsm_task_state = HSM_ST; + ata_pio_sectors(qc); + ata_altstatus(ap); /* flush */ + } else + /* send CDB */ + atapi_send_cdb(ap, qc); + + if (in_wq) + spin_unlock_irqrestore(ap->lock, flags); + + /* if polling, ata_pio_task() handles the rest. + * otherwise, interrupt handler takes over from here. */ - spin_lock_irqsave(&ap->host_set->lock, flags); - ap->flags &= ~ATA_FLAG_NOINTR; - ata_data_xfer(ap, qc->cdb, qc->dev->cdb_len, 1); - ata_altstatus(ap); /* flush */ + break; - if (qc->tf.protocol == ATA_PROT_ATAPI_DMA) - ap->ops->bmdma_start(qc); /* initiate bmdma */ - spin_unlock_irqrestore(&ap->host_set->lock, flags); - } else { - ata_data_xfer(ap, qc->cdb, qc->dev->cdb_len, 1); - ata_altstatus(ap); /* flush */ + case HSM_ST: + /* complete command or read/write the data register */ + if (qc->tf.protocol == ATA_PROT_ATAPI) { + /* ATAPI PIO protocol */ + if ((status & ATA_DRQ) == 0) { + /* No more data to transfer or device error. + * Device error will be tagged in HSM_ST_LAST. + */ + ap->hsm_task_state = HSM_ST_LAST; + goto fsm_start; + } - /* PIO commands are handled by polling */ - ap->hsm_task_state = HSM_ST; - ata_port_queue_task(ap, ata_pio_task, ap, 0); - } + /* Device should not ask for data transfer (DRQ=1) + * when it finds something wrong. + * We ignore DRQ here and stop the HSM by + * changing hsm_task_state to HSM_ST_ERR and + * let the EH abort the command or reset the device. + */ + if (unlikely(status & (ATA_ERR | ATA_DF))) { + printk(KERN_WARNING "ata%d: DRQ=1 with device error, dev_stat 0x%X\n", + ap->id, status); + qc->err_mask |= AC_ERR_HSM; + ap->hsm_task_state = HSM_ST_ERR; + goto fsm_start; + } - return; + atapi_pio_bytes(qc); -err_out: - ata_poll_qc_complete(qc); -} + if (unlikely(ap->hsm_task_state == HSM_ST_ERR)) + /* bad ireason reported by device */ + goto fsm_start; -/** - * ata_qc_timeout - Handle timeout of queued command - * @qc: Command that timed out - * - * Some part of the kernel (currently, only the SCSI layer) - * has noticed that the active command on port @ap has not - * completed after a specified length of time. Handle this - * condition by disabling DMA (if necessary) and completing - * transactions, with error if necessary. - * - * This also handles the case of the "lost interrupt", where - * for some reason (possibly hardware bug, possibly driver bug) - * an interrupt was not delivered to the driver, even though the - * transaction completed successfully. - * - * LOCKING: - * Inherited from SCSI layer (none, can sleep) - */ + } else { + /* ATA PIO protocol */ + if (unlikely((status & ATA_DRQ) == 0)) { + /* handle BSY=0, DRQ=0 as error */ + if (likely(status & (ATA_ERR | ATA_DF))) + /* device stops HSM for abort/error */ + qc->err_mask |= AC_ERR_DEV; + else + /* HSM violation. Let EH handle this */ + qc->err_mask |= AC_ERR_HSM; + + ap->hsm_task_state = HSM_ST_ERR; + goto fsm_start; + } -static void ata_qc_timeout(struct ata_queued_cmd *qc) -{ - struct ata_port *ap = qc->ap; - struct ata_host_set *host_set = ap->host_set; - u8 host_stat = 0, drv_stat; - unsigned long flags; + /* For PIO reads, some devices may ask for + * data transfer (DRQ=1) alone with ERR=1. + * We respect DRQ here and transfer one + * block of junk data before changing the + * hsm_task_state to HSM_ST_ERR. + * + * For PIO writes, ERR=1 DRQ=1 doesn't make + * sense since the data block has been + * transferred to the device. + */ + if (unlikely(status & (ATA_ERR | ATA_DF))) { + /* data might be corrputed */ + qc->err_mask |= AC_ERR_DEV; + + if (!(qc->tf.flags & ATA_TFLAG_WRITE)) { + ata_pio_sectors(qc); + ata_altstatus(ap); + status = ata_wait_idle(ap); + } + + if (status & (ATA_BUSY | ATA_DRQ)) + qc->err_mask |= AC_ERR_HSM; + + /* ata_pio_sectors() might change the + * state to HSM_ST_LAST. so, the state + * is changed after ata_pio_sectors(). + */ + ap->hsm_task_state = HSM_ST_ERR; + goto fsm_start; + } - DPRINTK("ENTER\n"); + ata_pio_sectors(qc); - ap->hsm_task_state = HSM_ST_IDLE; + if (ap->hsm_task_state == HSM_ST_LAST && + (!(qc->tf.flags & ATA_TFLAG_WRITE))) { + /* all data read */ + ata_altstatus(ap); + status = ata_wait_idle(ap); + goto fsm_start; + } + } - spin_lock_irqsave(&host_set->lock, flags); + ata_altstatus(ap); /* flush */ + poll_next = 1; + break; - switch (qc->tf.protocol) { + case HSM_ST_LAST: + if (unlikely(!ata_ok(status))) { + qc->err_mask |= __ac_err_mask(status); + ap->hsm_task_state = HSM_ST_ERR; + goto fsm_start; + } - case ATA_PROT_DMA: - case ATA_PROT_ATAPI_DMA: - host_stat = ap->ops->bmdma_status(ap); + /* no more data to transfer */ + DPRINTK("ata%u: dev %u command complete, drv_stat 0x%x\n", + ap->id, qc->dev->devno, status); - /* before we do anything else, clear DMA-Start bit */ - ap->ops->bmdma_stop(qc); + WARN_ON(qc->err_mask); - /* fall through */ + ap->hsm_task_state = HSM_ST_IDLE; - default: - ata_altstatus(ap); - drv_stat = ata_chk_status(ap); + /* complete taskfile transaction */ + ata_hsm_qc_complete(qc, in_wq); - /* ack bmdma irq events */ - ap->ops->irq_clear(ap); + poll_next = 0; + break; + + case HSM_ST_ERR: + /* make sure qc->err_mask is available to + * know what's wrong and recover + */ + WARN_ON(qc->err_mask == 0); - printk(KERN_ERR "ata%u: command 0x%x timeout, stat 0x%x host_stat 0x%x\n", - ap->id, qc->tf.command, drv_stat, host_stat); + ap->hsm_task_state = HSM_ST_IDLE; /* complete taskfile transaction */ - qc->err_mask |= ac_err_mask(drv_stat); + ata_hsm_qc_complete(qc, in_wq); + + poll_next = 0; break; + default: + poll_next = 0; + BUG(); } - spin_unlock_irqrestore(&host_set->lock, flags); - - ata_eh_qc_complete(qc); - - DPRINTK("EXIT\n"); + return poll_next; } -/** - * ata_eng_timeout - Handle timeout of queued command - * @ap: Port on which timed-out command is active - * - * Some part of the kernel (currently, only the SCSI layer) - * has noticed that the active command on port @ap has not - * completed after a specified length of time. Handle this - * condition by disabling DMA (if necessary) and completing - * transactions, with error if necessary. - * - * This also handles the case of the "lost interrupt", where - * for some reason (possibly hardware bug, possibly driver bug) - * an interrupt was not delivered to the driver, even though the - * transaction completed successfully. - * - * LOCKING: - * Inherited from SCSI layer (none, can sleep) - */ - -void ata_eng_timeout(struct ata_port *ap) +static void ata_pio_task(void *_data) { - DPRINTK("ENTER\n"); + struct ata_queued_cmd *qc = _data; + struct ata_port *ap = qc->ap; + u8 status; + int poll_next; - ata_qc_timeout(ata_qc_from_tag(ap, ap->active_tag)); +fsm_start: + WARN_ON(ap->hsm_task_state == HSM_ST_IDLE); - DPRINTK("EXIT\n"); + /* + * This is purely heuristic. This is a fast path. + * Sometimes when we enter, BSY will be cleared in + * a chk-status or two. If not, the drive is probably seeking + * or something. Snooze for a couple msecs, then + * chk-status again. If still busy, queue delayed work. + */ + status = ata_busy_wait(ap, ATA_BUSY, 5); + if (status & ATA_BUSY) { + msleep(2); + status = ata_busy_wait(ap, ATA_BUSY, 10); + if (status & ATA_BUSY) { + ata_port_queue_task(ap, ata_pio_task, qc, ATA_SHORT_PAUSE); + return; + } + } + + /* move the HSM */ + poll_next = ata_hsm_move(ap, qc, status, 1); + + /* another command or interrupt handler + * may be running at this point. + */ + if (poll_next) + goto fsm_start; } /** @@ -3888,9 +4297,14 @@ static struct ata_queued_cmd *ata_qc_new(struct ata_port *ap) struct ata_queued_cmd *qc = NULL; unsigned int i; - for (i = 0; i < ATA_MAX_QUEUE; i++) - if (!test_and_set_bit(i, &ap->qactive)) { - qc = ata_qc_from_tag(ap, i); + /* no command while frozen */ + if (unlikely(ap->pflags & ATA_PFLAG_FROZEN)) + return NULL; + + /* the last tag is reserved for internal command. */ + for (i = 0; i < ATA_MAX_QUEUE - 1; i++) + if (!test_and_set_bit(i, &ap->qc_allocated)) { + qc = __ata_qc_from_tag(ap, i); break; } @@ -3902,16 +4316,15 @@ static struct ata_queued_cmd *ata_qc_new(struct ata_port *ap) /** * ata_qc_new_init - Request an available ATA command, and initialize it - * @ap: Port associated with device @dev * @dev: Device from whom we request an available command structure * * LOCKING: * None. */ -struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap, - struct ata_device *dev) +struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev) { + struct ata_port *ap = dev->ap; struct ata_queued_cmd *qc; qc = ata_qc_new(ap); @@ -3946,36 +4359,153 @@ void ata_qc_free(struct ata_queued_cmd *qc) qc->flags = 0; tag = qc->tag; if (likely(ata_tag_valid(tag))) { - if (tag == ap->active_tag) - ap->active_tag = ATA_TAG_POISON; qc->tag = ATA_TAG_POISON; - clear_bit(tag, &ap->qactive); + clear_bit(tag, &ap->qc_allocated); } } void __ata_qc_complete(struct ata_queued_cmd *qc) { + struct ata_port *ap = qc->ap; + WARN_ON(qc == NULL); /* ata_qc_from_tag _might_ return NULL */ WARN_ON(!(qc->flags & ATA_QCFLAG_ACTIVE)); if (likely(qc->flags & ATA_QCFLAG_DMAMAP)) ata_sg_clean(qc); + /* command should be marked inactive atomically with qc completion */ + if (qc->tf.protocol == ATA_PROT_NCQ) + ap->sactive &= ~(1 << qc->tag); + else + ap->active_tag = ATA_TAG_POISON; + /* atapi: mark qc as inactive to prevent the interrupt handler * from completing the command twice later, before the error handler * is called. (when rc != 0 and atapi request sense is needed) */ qc->flags &= ~ATA_QCFLAG_ACTIVE; + ap->qc_active &= ~(1 << qc->tag); /* call completion callback */ qc->complete_fn(qc); } +/** + * ata_qc_complete - Complete an active ATA command + * @qc: Command to complete + * @err_mask: ATA Status register contents + * + * Indicate to the mid and upper layers that an ATA + * command has completed, with either an ok or not-ok status. + * + * LOCKING: + * spin_lock_irqsave(host_set lock) + */ +void ata_qc_complete(struct ata_queued_cmd *qc) +{ + struct ata_port *ap = qc->ap; + + /* XXX: New EH and old EH use different mechanisms to + * synchronize EH with regular execution path. + * + * In new EH, a failed qc is marked with ATA_QCFLAG_FAILED. + * Normal execution path is responsible for not accessing a + * failed qc. libata core enforces the rule by returning NULL + * from ata_qc_from_tag() for failed qcs. + * + * Old EH depends on ata_qc_complete() nullifying completion + * requests if ATA_QCFLAG_EH_SCHEDULED is set. Old EH does + * not synchronize with interrupt handler. Only PIO task is + * taken care of. + */ + if (ap->ops->error_handler) { + WARN_ON(ap->pflags & ATA_PFLAG_FROZEN); + + if (unlikely(qc->err_mask)) + qc->flags |= ATA_QCFLAG_FAILED; + + if (unlikely(qc->flags & ATA_QCFLAG_FAILED)) { + if (!ata_tag_internal(qc->tag)) { + /* always fill result TF for failed qc */ + ap->ops->tf_read(ap, &qc->result_tf); + ata_qc_schedule_eh(qc); + return; + } + } + + /* read result TF if requested */ + if (qc->flags & ATA_QCFLAG_RESULT_TF) + ap->ops->tf_read(ap, &qc->result_tf); + + __ata_qc_complete(qc); + } else { + if (qc->flags & ATA_QCFLAG_EH_SCHEDULED) + return; + + /* read result TF if failed or requested */ + if (qc->err_mask || qc->flags & ATA_QCFLAG_RESULT_TF) + ap->ops->tf_read(ap, &qc->result_tf); + + __ata_qc_complete(qc); + } +} + +/** + * ata_qc_complete_multiple - Complete multiple qcs successfully + * @ap: port in question + * @qc_active: new qc_active mask + * @finish_qc: LLDD callback invoked before completing a qc + * + * Complete in-flight commands. This functions is meant to be + * called from low-level driver's interrupt routine to complete + * requests normally. ap->qc_active and @qc_active is compared + * and commands are completed accordingly. + * + * LOCKING: + * spin_lock_irqsave(host_set lock) + * + * RETURNS: + * Number of completed commands on success, -errno otherwise. + */ +int ata_qc_complete_multiple(struct ata_port *ap, u32 qc_active, + void (*finish_qc)(struct ata_queued_cmd *)) +{ + int nr_done = 0; + u32 done_mask; + int i; + + done_mask = ap->qc_active ^ qc_active; + + if (unlikely(done_mask & qc_active)) { + ata_port_printk(ap, KERN_ERR, "illegal qc_active transition " + "(%08x->%08x)\n", ap->qc_active, qc_active); + return -EINVAL; + } + + for (i = 0; i < ATA_MAX_QUEUE; i++) { + struct ata_queued_cmd *qc; + + if (!(done_mask & (1 << i))) + continue; + + if ((qc = ata_qc_from_tag(ap, i))) { + if (finish_qc) + finish_qc(qc); + ata_qc_complete(qc); + nr_done++; + } + } + + return nr_done; +} + static inline int ata_should_dma_map(struct ata_queued_cmd *qc) { struct ata_port *ap = qc->ap; switch (qc->tf.protocol) { + case ATA_PROT_NCQ: case ATA_PROT_DMA: case ATA_PROT_ATAPI_DMA: return 1; @@ -4010,8 +4540,22 @@ void ata_qc_issue(struct ata_queued_cmd *qc) { struct ata_port *ap = qc->ap; - qc->ap->active_tag = qc->tag; + /* Make sure only one non-NCQ command is outstanding. The + * check is skipped for old EH because it reuses active qc to + * request ATAPI sense. + */ + WARN_ON(ap->ops->error_handler && ata_tag_valid(ap->active_tag)); + + if (qc->tf.protocol == ATA_PROT_NCQ) { + WARN_ON(ap->sactive & (1 << qc->tag)); + ap->sactive |= 1 << qc->tag; + } else { + WARN_ON(ap->sactive); + ap->active_tag = qc->tag; + } + qc->flags |= ATA_QCFLAG_ACTIVE; + ap->qc_active |= 1 << qc->tag; if (ata_should_dma_map(qc)) { if (qc->flags & ATA_QCFLAG_SG) { @@ -4061,43 +4605,105 @@ unsigned int ata_qc_issue_prot(struct ata_queued_cmd *qc) { struct ata_port *ap = qc->ap; + /* Use polling pio if the LLD doesn't handle + * interrupt driven pio and atapi CDB interrupt. + */ + if (ap->flags & ATA_FLAG_PIO_POLLING) { + switch (qc->tf.protocol) { + case ATA_PROT_PIO: + case ATA_PROT_ATAPI: + case ATA_PROT_ATAPI_NODATA: + qc->tf.flags |= ATA_TFLAG_POLLING; + break; + case ATA_PROT_ATAPI_DMA: + if (qc->dev->flags & ATA_DFLAG_CDB_INTR) + /* see ata_dma_blacklisted() */ + BUG(); + break; + default: + break; + } + } + + /* select the device */ ata_dev_select(ap, qc->dev->devno, 1, 0); + /* start the command */ switch (qc->tf.protocol) { case ATA_PROT_NODATA: + if (qc->tf.flags & ATA_TFLAG_POLLING) + ata_qc_set_polling(qc); + ata_tf_to_host(ap, &qc->tf); + ap->hsm_task_state = HSM_ST_LAST; + + if (qc->tf.flags & ATA_TFLAG_POLLING) + ata_port_queue_task(ap, ata_pio_task, qc, 0); + break; case ATA_PROT_DMA: + WARN_ON(qc->tf.flags & ATA_TFLAG_POLLING); + ap->ops->tf_load(ap, &qc->tf); /* load tf registers */ ap->ops->bmdma_setup(qc); /* set up bmdma */ ap->ops->bmdma_start(qc); /* initiate bmdma */ + ap->hsm_task_state = HSM_ST_LAST; break; - case ATA_PROT_PIO: /* load tf registers, initiate polling pio */ - ata_qc_set_polling(qc); - ata_tf_to_host(ap, &qc->tf); - ap->hsm_task_state = HSM_ST; - ata_port_queue_task(ap, ata_pio_task, ap, 0); - break; + case ATA_PROT_PIO: + if (qc->tf.flags & ATA_TFLAG_POLLING) + ata_qc_set_polling(qc); - case ATA_PROT_ATAPI: - ata_qc_set_polling(qc); ata_tf_to_host(ap, &qc->tf); - ata_port_queue_task(ap, atapi_packet_task, ap, 0); + + if (qc->tf.flags & ATA_TFLAG_WRITE) { + /* PIO data out protocol */ + ap->hsm_task_state = HSM_ST_FIRST; + ata_port_queue_task(ap, ata_pio_task, qc, 0); + + /* always send first data block using + * the ata_pio_task() codepath. + */ + } else { + /* PIO data in protocol */ + ap->hsm_task_state = HSM_ST; + + if (qc->tf.flags & ATA_TFLAG_POLLING) + ata_port_queue_task(ap, ata_pio_task, qc, 0); + + /* if polling, ata_pio_task() handles the rest. + * otherwise, interrupt handler takes over from here. + */ + } + break; + case ATA_PROT_ATAPI: case ATA_PROT_ATAPI_NODATA: - ap->flags |= ATA_FLAG_NOINTR; + if (qc->tf.flags & ATA_TFLAG_POLLING) + ata_qc_set_polling(qc); + ata_tf_to_host(ap, &qc->tf); - ata_port_queue_task(ap, atapi_packet_task, ap, 0); + + ap->hsm_task_state = HSM_ST_FIRST; + + /* send cdb by polling if no cdb interrupt */ + if ((!(qc->dev->flags & ATA_DFLAG_CDB_INTR)) || + (qc->tf.flags & ATA_TFLAG_POLLING)) + ata_port_queue_task(ap, ata_pio_task, qc, 0); break; case ATA_PROT_ATAPI_DMA: - ap->flags |= ATA_FLAG_NOINTR; + WARN_ON(qc->tf.flags & ATA_TFLAG_POLLING); + ap->ops->tf_load(ap, &qc->tf); /* load tf registers */ ap->ops->bmdma_setup(qc); /* set up bmdma */ - ata_port_queue_task(ap, atapi_packet_task, ap, 0); + ap->hsm_task_state = HSM_ST_FIRST; + + /* send cdb by polling if no cdb interrupt */ + if (!(qc->dev->flags & ATA_DFLAG_CDB_INTR)) + ata_port_queue_task(ap, ata_pio_task, qc, 0); break; default: @@ -4127,52 +4733,66 @@ unsigned int ata_qc_issue_prot(struct ata_queued_cmd *qc) inline unsigned int ata_host_intr (struct ata_port *ap, struct ata_queued_cmd *qc) { - u8 status, host_stat; + u8 status, host_stat = 0; - switch (qc->tf.protocol) { + VPRINTK("ata%u: protocol %d task_state %d\n", + ap->id, qc->tf.protocol, ap->hsm_task_state); - case ATA_PROT_DMA: - case ATA_PROT_ATAPI_DMA: - case ATA_PROT_ATAPI: - /* check status of DMA engine */ - host_stat = ap->ops->bmdma_status(ap); - VPRINTK("ata%u: host_stat 0x%X\n", ap->id, host_stat); - - /* if it's not our irq... */ - if (!(host_stat & ATA_DMA_INTR)) - goto idle_irq; - - /* before we do anything else, clear DMA-Start bit */ - ap->ops->bmdma_stop(qc); - - /* fall through */ - - case ATA_PROT_ATAPI_NODATA: - case ATA_PROT_NODATA: - /* check altstatus */ - status = ata_altstatus(ap); - if (status & ATA_BUSY) - goto idle_irq; + /* Check whether we are expecting interrupt in this state */ + switch (ap->hsm_task_state) { + case HSM_ST_FIRST: + /* Some pre-ATAPI-4 devices assert INTRQ + * at this state when ready to receive CDB. + */ - /* check main status, clearing INTRQ */ - status = ata_chk_status(ap); - if (unlikely(status & ATA_BUSY)) + /* Check the ATA_DFLAG_CDB_INTR flag is enough here. + * The flag was turned on only for atapi devices. + * No need to check is_atapi_taskfile(&qc->tf) again. + */ + if (!(qc->dev->flags & ATA_DFLAG_CDB_INTR)) goto idle_irq; - DPRINTK("ata%u: protocol %d (dev_stat 0x%X)\n", - ap->id, qc->tf.protocol, status); - - /* ack bmdma irq events */ - ap->ops->irq_clear(ap); - - /* complete taskfile transaction */ - qc->err_mask |= ac_err_mask(status); - ata_qc_complete(qc); break; + case HSM_ST_LAST: + if (qc->tf.protocol == ATA_PROT_DMA || + qc->tf.protocol == ATA_PROT_ATAPI_DMA) { + /* check status of DMA engine */ + host_stat = ap->ops->bmdma_status(ap); + VPRINTK("ata%u: host_stat 0x%X\n", ap->id, host_stat); + + /* if it's not our irq... */ + if (!(host_stat & ATA_DMA_INTR)) + goto idle_irq; + + /* before we do anything else, clear DMA-Start bit */ + ap->ops->bmdma_stop(qc); + + if (unlikely(host_stat & ATA_DMA_ERR)) { + /* error when transfering data to/from memory */ + qc->err_mask |= AC_ERR_HOST_BUS; + ap->hsm_task_state = HSM_ST_ERR; + } + } + break; + case HSM_ST: + break; + default: + goto idle_irq; + } + + /* check altstatus */ + status = ata_altstatus(ap); + if (status & ATA_BUSY) + goto idle_irq; - default: + /* check main status, clearing INTRQ */ + status = ata_chk_status(ap); + if (unlikely(status & ATA_BUSY)) goto idle_irq; - } + /* ack bmdma irq events */ + ap->ops->irq_clear(ap); + + ata_hsm_move(ap, qc, status, 0); return 1; /* irq handled */ idle_irq: @@ -4181,7 +4801,7 @@ idle_irq: #ifdef ATA_IRQ_TRAP if ((ap->stats.idle_irq % 1000) == 0) { ata_irq_ack(ap, 0); /* debug trap */ - printk(KERN_WARNING "ata%d: irq trap\n", ap->id); + ata_port_printk(ap, KERN_WARNING, "irq trap\n"); return 1; } #endif @@ -4219,11 +4839,11 @@ irqreturn_t ata_interrupt (int irq, void *dev_instance, struct pt_regs *regs) ap = host_set->ports[i]; if (ap && - !(ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR))) { + !(ap->flags & ATA_FLAG_DISABLED)) { struct ata_queued_cmd *qc; qc = ata_qc_from_tag(ap, ap->active_tag); - if (qc && (!(qc->tf.ctl & ATA_NIEN)) && + if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING)) && (qc->flags & ATA_QCFLAG_ACTIVE)) handled |= ata_host_intr(ap, qc); } @@ -4234,33 +4854,147 @@ irqreturn_t ata_interrupt (int irq, void *dev_instance, struct pt_regs *regs) return IRQ_RETVAL(handled); } +/** + * sata_scr_valid - test whether SCRs are accessible + * @ap: ATA port to test SCR accessibility for + * + * Test whether SCRs are accessible for @ap. + * + * LOCKING: + * None. + * + * RETURNS: + * 1 if SCRs are accessible, 0 otherwise. + */ +int sata_scr_valid(struct ata_port *ap) +{ + return ap->cbl == ATA_CBL_SATA && ap->ops->scr_read; +} -/* - * Execute a 'simple' command, that only consists of the opcode 'cmd' itself, - * without filling any other registers +/** + * sata_scr_read - read SCR register of the specified port + * @ap: ATA port to read SCR for + * @reg: SCR to read + * @val: Place to store read value + * + * Read SCR register @reg of @ap into *@val. This function is + * guaranteed to succeed if the cable type of the port is SATA + * and the port implements ->scr_read. + * + * LOCKING: + * None. + * + * RETURNS: + * 0 on success, negative errno on failure. */ -static int ata_do_simple_cmd(struct ata_port *ap, struct ata_device *dev, - u8 cmd) +int sata_scr_read(struct ata_port *ap, int reg, u32 *val) { - struct ata_taskfile tf; - int err; + if (sata_scr_valid(ap)) { + *val = ap->ops->scr_read(ap, reg); + return 0; + } + return -EOPNOTSUPP; +} + +/** + * sata_scr_write - write SCR register of the specified port + * @ap: ATA port to write SCR for + * @reg: SCR to write + * @val: value to write + * + * Write @val to SCR register @reg of @ap. This function is + * guaranteed to succeed if the cable type of the port is SATA + * and the port implements ->scr_read. + * + * LOCKING: + * None. + * + * RETURNS: + * 0 on success, negative errno on failure. + */ +int sata_scr_write(struct ata_port *ap, int reg, u32 val) +{ + if (sata_scr_valid(ap)) { + ap->ops->scr_write(ap, reg, val); + return 0; + } + return -EOPNOTSUPP; +} - ata_tf_init(ap, &tf, dev->devno); +/** + * sata_scr_write_flush - write SCR register of the specified port and flush + * @ap: ATA port to write SCR for + * @reg: SCR to write + * @val: value to write + * + * This function is identical to sata_scr_write() except that this + * function performs flush after writing to the register. + * + * LOCKING: + * None. + * + * RETURNS: + * 0 on success, negative errno on failure. + */ +int sata_scr_write_flush(struct ata_port *ap, int reg, u32 val) +{ + if (sata_scr_valid(ap)) { + ap->ops->scr_write(ap, reg, val); + ap->ops->scr_read(ap, reg); + return 0; + } + return -EOPNOTSUPP; +} - tf.command = cmd; - tf.flags |= ATA_TFLAG_DEVICE; - tf.protocol = ATA_PROT_NODATA; +/** + * ata_port_online - test whether the given port is online + * @ap: ATA port to test + * + * Test whether @ap is online. Note that this function returns 0 + * if online status of @ap cannot be obtained, so + * ata_port_online(ap) != !ata_port_offline(ap). + * + * LOCKING: + * None. + * + * RETURNS: + * 1 if the port online status is available and online. + */ +int ata_port_online(struct ata_port *ap) +{ + u32 sstatus; + + if (!sata_scr_read(ap, SCR_STATUS, &sstatus) && (sstatus & 0xf) == 0x3) + return 1; + return 0; +} - err = ata_exec_internal(ap, dev, &tf, DMA_NONE, NULL, 0); - if (err) - printk(KERN_ERR "%s: ata command failed: %d\n", - __FUNCTION__, err); +/** + * ata_port_offline - test whether the given port is offline + * @ap: ATA port to test + * + * Test whether @ap is offline. Note that this function returns + * 0 if offline status of @ap cannot be obtained, so + * ata_port_online(ap) != !ata_port_offline(ap). + * + * LOCKING: + * None. + * + * RETURNS: + * 1 if the port offline status is available and offline. + */ +int ata_port_offline(struct ata_port *ap) +{ + u32 sstatus; - return err; + if (!sata_scr_read(ap, SCR_STATUS, &sstatus) && (sstatus & 0xf) != 0x3) + return 1; + return 0; } -static int ata_flush_cache(struct ata_port *ap, struct ata_device *dev) +int ata_flush_cache(struct ata_device *dev) { + unsigned int err_mask; u8 cmd; if (!ata_try_flush_cache(dev)) @@ -4271,64 +5005,129 @@ static int ata_flush_cache(struct ata_port *ap, struct ata_device *dev) else cmd = ATA_CMD_FLUSH; - return ata_do_simple_cmd(ap, dev, cmd); -} + err_mask = ata_do_simple_cmd(dev, cmd); + if (err_mask) { + ata_dev_printk(dev, KERN_ERR, "failed to flush cache\n"); + return -EIO; + } -static int ata_standby_drive(struct ata_port *ap, struct ata_device *dev) -{ - return ata_do_simple_cmd(ap, dev, ATA_CMD_STANDBYNOW1); + return 0; } -static int ata_start_drive(struct ata_port *ap, struct ata_device *dev) +static int ata_host_set_request_pm(struct ata_host_set *host_set, + pm_message_t mesg, unsigned int action, + unsigned int ehi_flags, int wait) { - return ata_do_simple_cmd(ap, dev, ATA_CMD_IDLEIMMEDIATE); + unsigned long flags; + int i, rc; + + for (i = 0; i < host_set->n_ports; i++) { + struct ata_port *ap = host_set->ports[i]; + + /* Previous resume operation might still be in + * progress. Wait for PM_PENDING to clear. + */ + if (ap->pflags & ATA_PFLAG_PM_PENDING) { + ata_port_wait_eh(ap); + WARN_ON(ap->pflags & ATA_PFLAG_PM_PENDING); + } + + /* request PM ops to EH */ + spin_lock_irqsave(ap->lock, flags); + + ap->pm_mesg = mesg; + if (wait) { + rc = 0; + ap->pm_result = &rc; + } + + ap->pflags |= ATA_PFLAG_PM_PENDING; + ap->eh_info.action |= action; + ap->eh_info.flags |= ehi_flags; + + ata_port_schedule_eh(ap); + + spin_unlock_irqrestore(ap->lock, flags); + + /* wait and check result */ + if (wait) { + ata_port_wait_eh(ap); + WARN_ON(ap->pflags & ATA_PFLAG_PM_PENDING); + if (rc) + return rc; + } + } + + return 0; } /** - * ata_device_resume - wakeup a previously suspended devices - * @ap: port the device is connected to - * @dev: the device to resume + * ata_host_set_suspend - suspend host_set + * @host_set: host_set to suspend + * @mesg: PM message * - * Kick the drive back into action, by sending it an idle immediate - * command and making sure its transfer mode matches between drive - * and host. + * Suspend @host_set. Actual operation is performed by EH. This + * function requests EH to perform PM operations and waits for EH + * to finish. * + * LOCKING: + * Kernel thread context (may sleep). + * + * RETURNS: + * 0 on success, -errno on failure. */ -int ata_device_resume(struct ata_port *ap, struct ata_device *dev) +int ata_host_set_suspend(struct ata_host_set *host_set, pm_message_t mesg) { - if (ap->flags & ATA_FLAG_SUSPENDED) { - ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 200000); - ap->flags &= ~ATA_FLAG_SUSPENDED; - ata_set_mode(ap); + int i, j, rc; + + rc = ata_host_set_request_pm(host_set, mesg, 0, ATA_EHI_QUIET, 1); + if (rc) + goto fail; + + /* EH is quiescent now. Fail if we have any ready device. + * This happens if hotplug occurs between completion of device + * suspension and here. + */ + for (i = 0; i < host_set->n_ports; i++) { + struct ata_port *ap = host_set->ports[i]; + + for (j = 0; j < ATA_MAX_DEVICES; j++) { + struct ata_device *dev = &ap->device[j]; + + if (ata_dev_ready(dev)) { + ata_port_printk(ap, KERN_WARNING, + "suspend failed, device %d " + "still active\n", dev->devno); + rc = -EBUSY; + goto fail; + } + } } - if (!ata_dev_present(dev)) - return 0; - if (dev->class == ATA_DEV_ATA) - ata_start_drive(ap, dev); + host_set->dev->power.power_state = mesg; return 0; + + fail: + ata_host_set_resume(host_set); + return rc; } /** - * ata_device_suspend - prepare a device for suspend - * @ap: port the device is connected to - * @dev: the device to suspend - * @state: target power management state + * ata_host_set_resume - resume host_set + * @host_set: host_set to resume * - * Flush the cache on the drive, if appropriate, then issue a - * standbynow command. + * Resume @host_set. Actual operation is performed by EH. This + * function requests EH to perform PM operations and returns. + * Note that all resume operations are performed parallely. + * + * LOCKING: + * Kernel thread context (may sleep). */ -int ata_device_suspend(struct ata_port *ap, struct ata_device *dev, pm_message_t state) +void ata_host_set_resume(struct ata_host_set *host_set) { - if (!ata_dev_present(dev)) - return 0; - if (dev->class == ATA_DEV_ATA) - ata_flush_cache(ap, dev); - - if (state.event != PM_EVENT_FREEZE) - ata_standby_drive(ap, dev); - ap->flags |= ATA_FLAG_SUSPENDED; - return 0; + ata_host_set_request_pm(host_set, PMSG_ON, ATA_EH_SOFTRESET, + ATA_EHI_NO_AUTOPSY | ATA_EHI_QUIET, 0); + host_set->dev->power.power_state = PMSG_ON; } /** @@ -4391,26 +5190,36 @@ void ata_host_stop (struct ata_host_set *host_set) iounmap(host_set->mmio_base); } - /** - * ata_host_remove - Unregister SCSI host structure with upper layers - * @ap: Port to unregister - * @do_unregister: 1 if we fully unregister, 0 to just stop the port + * ata_dev_init - Initialize an ata_device structure + * @dev: Device structure to initialize + * + * Initialize @dev in preparation for probing. * * LOCKING: * Inherited from caller. */ - -static void ata_host_remove(struct ata_port *ap, unsigned int do_unregister) +void ata_dev_init(struct ata_device *dev) { - struct Scsi_Host *sh = ap->host; - - DPRINTK("ENTER\n"); + struct ata_port *ap = dev->ap; + unsigned long flags; - if (do_unregister) - scsi_remove_host(sh); + /* SATA spd limit is bound to the first device */ + ap->sata_spd_limit = ap->hw_sata_spd_limit; - ap->ops->port_stop(ap); + /* High bits of dev->flags are used to record warm plug + * requests which occur asynchronously. Synchronize using + * host_set lock. + */ + spin_lock_irqsave(ap->lock, flags); + dev->flags &= ~ATA_DFLAG_INIT_MASK; + spin_unlock_irqrestore(ap->lock, flags); + + memset((void *)dev + ATA_DEVICE_CLEAR_OFFSET, 0, + sizeof(*dev) - ATA_DEVICE_CLEAR_OFFSET); + dev->pio_mask = UINT_MAX; + dev->mwdma_mask = UINT_MAX; + dev->udma_mask = UINT_MAX; } /** @@ -4427,7 +5236,6 @@ static void ata_host_remove(struct ata_port *ap, unsigned int do_unregister) * LOCKING: * Inherited from caller. */ - static void ata_host_init(struct ata_port *ap, struct Scsi_Host *host, struct ata_host_set *host_set, const struct ata_probe_ent *ent, unsigned int port_no) @@ -4440,7 +5248,8 @@ static void ata_host_init(struct ata_port *ap, struct Scsi_Host *host, host->unique_id = ata_unique_id++; host->max_cmd_len = 12; - ap->flags = ATA_FLAG_PORT_DISABLED; + ap->lock = &host_set->lock; + ap->flags = ATA_FLAG_DISABLED; ap->id = host->unique_id; ap->host = host; ap->ctl = ATA_DEVCTL_OBS; @@ -4455,19 +5264,35 @@ static void ata_host_init(struct ata_port *ap, struct Scsi_Host *host, ap->flags |= ent->host_flags; ap->flags |= ent->port_flags[port_no]; /* pata fix */ ap->ops = ent->port_ops; - ap->cbl = ATA_CBL_NONE; + ap->hw_sata_spd_limit = UINT_MAX; ap->active_tag = ATA_TAG_POISON; ap->last_ctl = 0xFF; +#if defined(ATA_VERBOSE_DEBUG) + /* turn on all debugging levels */ + ap->msg_enable = 0x00FF; +#elif defined(ATA_DEBUG) + ap->msg_enable = ATA_MSG_DRV | ATA_MSG_INFO | ATA_MSG_CTL | ATA_MSG_WARN | ATA_MSG_ERR; +#else + ap->msg_enable = ATA_MSG_DRV | ATA_MSG_ERR | ATA_MSG_WARN; +#endif + INIT_WORK(&ap->port_task, NULL, NULL); + INIT_WORK(&ap->hotplug_task, ata_scsi_hotplug, ap); + INIT_WORK(&ap->scsi_rescan_task, ata_scsi_dev_rescan, ap); INIT_LIST_HEAD(&ap->eh_done_q); + init_waitqueue_head(&ap->eh_wait_q); + + /* set cable type */ + ap->cbl = ATA_CBL_NONE; + if (ap->flags & ATA_FLAG_SATA) + ap->cbl = ATA_CBL_SATA; for (i = 0; i < ATA_MAX_DEVICES; i++) { struct ata_device *dev = &ap->device[i]; + dev->ap = ap; dev->devno = i; - dev->pio_mask = UINT_MAX; - dev->mwdma_mask = UINT_MAX; - dev->udma_mask = UINT_MAX; + ata_dev_init(dev); } #ifdef ATA_IRQ_TRAP @@ -4503,7 +5328,7 @@ static struct ata_port * ata_host_add(const struct ata_probe_ent *ent, DPRINTK("ENTER\n"); - if (!ent->port_ops->probe_reset && + if (!ent->port_ops->error_handler && !(ent->host_flags & (ATA_FLAG_SATA_RESET | ATA_FLAG_SRST))) { printk(KERN_ERR "ata%u: no reset mechanism available\n", port_no); @@ -4516,7 +5341,7 @@ static struct ata_port * ata_host_add(const struct ata_probe_ent *ent, host->transportt = &ata_scsi_transport_template; - ap = (struct ata_port *) &host->hostdata[0]; + ap = ata_shost_to_port(host); ata_host_init(ap, host, host_set, ent, port_no); @@ -4549,12 +5374,12 @@ err_out: * RETURNS: * Number of ports registered. Zero on error (no ports registered). */ - int ata_device_add(const struct ata_probe_ent *ent) { unsigned int count = 0, i; struct device *dev = ent->dev; struct ata_host_set *host_set; + int rc; DPRINTK("ENTER\n"); /* alloc a container for our list of ATA ports (buses) */ @@ -4587,18 +5412,18 @@ int ata_device_add(const struct ata_probe_ent *ent) (ap->pio_mask << ATA_SHIFT_PIO); /* print per-port info to dmesg */ - printk(KERN_INFO "ata%u: %cATA max %s cmd 0x%lX ctl 0x%lX " - "bmdma 0x%lX irq %lu\n", - ap->id, - ap->flags & ATA_FLAG_SATA ? 'S' : 'P', - ata_mode_string(xfer_mode_mask), - ap->ioaddr.cmd_addr, - ap->ioaddr.ctl_addr, - ap->ioaddr.bmdma_addr, - ent->irq); + ata_port_printk(ap, KERN_INFO, "%cATA max %s cmd 0x%lX " + "ctl 0x%lX bmdma 0x%lX irq %lu\n", + ap->flags & ATA_FLAG_SATA ? 'S' : 'P', + ata_mode_string(xfer_mode_mask), + ap->ioaddr.cmd_addr, + ap->ioaddr.ctl_addr, + ap->ioaddr.bmdma_addr, + ent->irq); ata_chk_status(ap); host_set->ops->irq_clear(ap); + ata_eh_freeze_port(ap); /* freeze port before requesting IRQ */ count++; } @@ -4606,41 +5431,74 @@ int ata_device_add(const struct ata_probe_ent *ent) goto err_free_ret; /* obtain irq, that is shared between channels */ - if (request_irq(ent->irq, ent->port_ops->irq_handler, ent->irq_flags, - DRV_NAME, host_set)) + rc = request_irq(ent->irq, ent->port_ops->irq_handler, ent->irq_flags, + DRV_NAME, host_set); + if (rc) { + dev_printk(KERN_ERR, dev, "irq %lu request failed: %d\n", + ent->irq, rc); goto err_out; + } /* perform each probe synchronously */ DPRINTK("probe begin\n"); for (i = 0; i < count; i++) { struct ata_port *ap; + u32 scontrol; int rc; ap = host_set->ports[i]; - DPRINTK("ata%u: bus probe begin\n", ap->id); - rc = ata_bus_probe(ap); - DPRINTK("ata%u: bus probe end\n", ap->id); - - if (rc) { - /* FIXME: do something useful here? - * Current libata behavior will - * tear down everything when - * the module is removed - * or the h/w is unplugged. - */ + /* init sata_spd_limit to the current value */ + if (sata_scr_read(ap, SCR_CONTROL, &scontrol) == 0) { + int spd = (scontrol >> 4) & 0xf; + ap->hw_sata_spd_limit &= (1 << spd) - 1; } + ap->sata_spd_limit = ap->hw_sata_spd_limit; rc = scsi_add_host(ap->host, dev); if (rc) { - printk(KERN_ERR "ata%u: scsi_add_host failed\n", - ap->id); + ata_port_printk(ap, KERN_ERR, "scsi_add_host failed\n"); /* FIXME: do something useful here */ /* FIXME: handle unconditional calls to * scsi_scan_host and ata_host_remove, below, * at the very least */ } + + if (ap->ops->error_handler) { + struct ata_eh_info *ehi = &ap->eh_info; + unsigned long flags; + + ata_port_probe(ap); + + /* kick EH for boot probing */ + spin_lock_irqsave(ap->lock, flags); + + ehi->probe_mask = (1 << ATA_MAX_DEVICES) - 1; + ehi->action |= ATA_EH_SOFTRESET; + ehi->flags |= ATA_EHI_NO_AUTOPSY | ATA_EHI_QUIET; + + ap->pflags |= ATA_PFLAG_LOADING; + ata_port_schedule_eh(ap); + + spin_unlock_irqrestore(ap->lock, flags); + + /* wait for EH to finish */ + ata_port_wait_eh(ap); + } else { + DPRINTK("ata%u: bus probe begin\n", ap->id); + rc = ata_bus_probe(ap); + DPRINTK("ata%u: bus probe end\n", ap->id); + + if (rc) { + /* FIXME: do something useful here? + * Current libata behavior will + * tear down everything when + * the module is removed + * or the h/w is unplugged. + */ + } + } } /* probes are done, now scan each port's disk(s) */ @@ -4658,8 +5516,11 @@ int ata_device_add(const struct ata_probe_ent *ent) err_out: for (i = 0; i < count; i++) { - ata_host_remove(host_set->ports[i], 1); - scsi_host_put(host_set->ports[i]->host); + struct ata_port *ap = host_set->ports[i]; + if (ap) { + ap->ops->port_stop(ap); + scsi_host_put(ap->host); + } } err_free_ret: kfree(host_set); @@ -4667,6 +5528,64 @@ err_free_ret: return 0; } +/** + * ata_port_detach - Detach ATA port in prepration of device removal + * @ap: ATA port to be detached + * + * Detach all ATA devices and the associated SCSI devices of @ap; + * then, remove the associated SCSI host. @ap is guaranteed to + * be quiescent on return from this function. + * + * LOCKING: + * Kernel thread context (may sleep). + */ +void ata_port_detach(struct ata_port *ap) +{ + unsigned long flags; + int i; + + if (!ap->ops->error_handler) + goto skip_eh; + + /* tell EH we're leaving & flush EH */ + spin_lock_irqsave(ap->lock, flags); + ap->pflags |= ATA_PFLAG_UNLOADING; + spin_unlock_irqrestore(ap->lock, flags); + + ata_port_wait_eh(ap); + + /* EH is now guaranteed to see UNLOADING, so no new device + * will be attached. Disable all existing devices. + */ + spin_lock_irqsave(ap->lock, flags); + + for (i = 0; i < ATA_MAX_DEVICES; i++) + ata_dev_disable(&ap->device[i]); + + spin_unlock_irqrestore(ap->lock, flags); + + /* Final freeze & EH. All in-flight commands are aborted. EH + * will be skipped and retrials will be terminated with bad + * target. + */ + spin_lock_irqsave(ap->lock, flags); + ata_port_freeze(ap); /* won't be thawed */ + spin_unlock_irqrestore(ap->lock, flags); + + ata_port_wait_eh(ap); + + /* Flush hotplug task. The sequence is similar to + * ata_port_flush_task(). + */ + flush_workqueue(ata_aux_wq); + cancel_delayed_work(&ap->hotplug_task); + flush_workqueue(ata_aux_wq); + + skip_eh: + /* remove the associated SCSI host */ + scsi_remove_host(ap->host); +} + /** * ata_host_set_remove - PCI layer callback for device removal * @host_set: ATA host set that was removed @@ -4680,18 +5599,15 @@ err_free_ret: void ata_host_set_remove(struct ata_host_set *host_set) { - struct ata_port *ap; unsigned int i; - for (i = 0; i < host_set->n_ports; i++) { - ap = host_set->ports[i]; - scsi_remove_host(ap->host); - } + for (i = 0; i < host_set->n_ports; i++) + ata_port_detach(host_set->ports[i]); free_irq(host_set->irq, host_set); for (i = 0; i < host_set->n_ports; i++) { - ap = host_set->ports[i]; + struct ata_port *ap = host_set->ports[i]; ata_scsi_release(ap->host); @@ -4729,15 +5645,12 @@ void ata_host_set_remove(struct ata_host_set *host_set) int ata_scsi_release(struct Scsi_Host *host) { - struct ata_port *ap = (struct ata_port *) &host->hostdata[0]; - int i; + struct ata_port *ap = ata_shost_to_port(host); DPRINTK("ENTER\n"); ap->ops->port_disable(ap); - ata_host_remove(ap, 0); - for (i = 0; i < ATA_MAX_DEVICES; i++) - kfree(ap->device[i].id); + ap->ops->port_stop(ap); DPRINTK("EXIT\n"); return 1; @@ -4797,8 +5710,12 @@ void ata_pci_remove_one (struct pci_dev *pdev) { struct device *dev = pci_dev_to_dev(pdev); struct ata_host_set *host_set = dev_get_drvdata(dev); + struct ata_host_set *host_set2 = host_set->next; ata_host_set_remove(host_set); + if (host_set2) + ata_host_set_remove(host_set2); + pci_release_regions(pdev); pci_disable_device(pdev); dev_set_drvdata(dev, NULL); @@ -4838,20 +5755,55 @@ int pci_test_config_bits(struct pci_dev *pdev, const struct pci_bits *bits) return (tmp == bits->val) ? 1 : 0; } -int ata_pci_device_suspend(struct pci_dev *pdev, pm_message_t state) +void ata_pci_device_do_suspend(struct pci_dev *pdev, pm_message_t state) { pci_save_state(pdev); - pci_disable_device(pdev); - pci_set_power_state(pdev, PCI_D3hot); - return 0; + + if (state.event == PM_EVENT_SUSPEND) { + pci_disable_device(pdev); + pci_set_power_state(pdev, PCI_D3hot); + } } -int ata_pci_device_resume(struct pci_dev *pdev) +void ata_pci_device_do_resume(struct pci_dev *pdev) { pci_set_power_state(pdev, PCI_D0); pci_restore_state(pdev); pci_enable_device(pdev); pci_set_master(pdev); +} + +int ata_pci_device_suspend(struct pci_dev *pdev, pm_message_t state) +{ + struct ata_host_set *host_set = dev_get_drvdata(&pdev->dev); + int rc = 0; + + rc = ata_host_set_suspend(host_set, state); + if (rc) + return rc; + + if (host_set->next) { + rc = ata_host_set_suspend(host_set->next, state); + if (rc) { + ata_host_set_resume(host_set); + return rc; + } + } + + ata_pci_device_do_suspend(pdev, state); + + return 0; +} + +int ata_pci_device_resume(struct pci_dev *pdev) +{ + struct ata_host_set *host_set = dev_get_drvdata(&pdev->dev); + + ata_pci_device_do_resume(pdev); + ata_host_set_resume(host_set); + if (host_set->next) + ata_host_set_resume(host_set->next); + return 0; } #endif /* CONFIG_PCI */ @@ -4859,10 +5811,17 @@ int ata_pci_device_resume(struct pci_dev *pdev) static int __init ata_init(void) { + ata_probe_timeout *= HZ; ata_wq = create_workqueue("ata"); if (!ata_wq) return -ENOMEM; + ata_aux_wq = create_singlethread_workqueue("ata_aux"); + if (!ata_aux_wq) { + destroy_workqueue(ata_wq); + return -ENOMEM; + } + printk(KERN_DEBUG "libata version " DRV_VERSION " loaded.\n"); return 0; } @@ -4870,13 +5829,14 @@ static int __init ata_init(void) static void __exit ata_exit(void) { destroy_workqueue(ata_wq); + destroy_workqueue(ata_aux_wq); } module_init(ata_init); module_exit(ata_exit); static unsigned long ratelimit_time; -static spinlock_t ata_ratelimit_lock = SPIN_LOCK_UNLOCKED; +static DEFINE_SPINLOCK(ata_ratelimit_lock); int ata_ratelimit(void) { @@ -4896,6 +5856,52 @@ int ata_ratelimit(void) return rc; } +/** + * ata_wait_register - wait until register value changes + * @reg: IO-mapped register + * @mask: Mask to apply to read register value + * @val: Wait condition + * @interval_msec: polling interval in milliseconds + * @timeout_msec: timeout in milliseconds + * + * Waiting for some bits of register to change is a common + * operation for ATA controllers. This function reads 32bit LE + * IO-mapped register @reg and tests for the following condition. + * + * (*@reg & mask) != val + * + * If the condition is met, it returns; otherwise, the process is + * repeated after @interval_msec until timeout. + * + * LOCKING: + * Kernel thread context (may sleep) + * + * RETURNS: + * The final register value. + */ +u32 ata_wait_register(void __iomem *reg, u32 mask, u32 val, + unsigned long interval_msec, + unsigned long timeout_msec) +{ + unsigned long timeout; + u32 tmp; + + tmp = ioread32(reg); + + /* Calculate timeout _after_ the first read to make sure + * preceding writes reach the controller before starting to + * eat away the timeout. + */ + timeout = jiffies + (timeout_msec * HZ) / 1000; + + while ((tmp & mask) == val && time_before(jiffies, timeout)) { + msleep(interval_msec); + tmp = ioread32(reg); + } + + return tmp; +} + /* * libata is essentially a library of internal helper functions for * low-level ATA host controller drivers. As such, the API/ABI is @@ -4903,15 +5909,20 @@ int ata_ratelimit(void) * Do not depend on ABI/API stability. */ +EXPORT_SYMBOL_GPL(sata_deb_timing_normal); +EXPORT_SYMBOL_GPL(sata_deb_timing_hotplug); +EXPORT_SYMBOL_GPL(sata_deb_timing_long); EXPORT_SYMBOL_GPL(ata_std_bios_param); EXPORT_SYMBOL_GPL(ata_std_ports); EXPORT_SYMBOL_GPL(ata_device_add); +EXPORT_SYMBOL_GPL(ata_port_detach); EXPORT_SYMBOL_GPL(ata_host_set_remove); EXPORT_SYMBOL_GPL(ata_sg_init); EXPORT_SYMBOL_GPL(ata_sg_init_one); -EXPORT_SYMBOL_GPL(__ata_qc_complete); +EXPORT_SYMBOL_GPL(ata_hsm_move); +EXPORT_SYMBOL_GPL(ata_qc_complete); +EXPORT_SYMBOL_GPL(ata_qc_complete_multiple); EXPORT_SYMBOL_GPL(ata_qc_issue_prot); -EXPORT_SYMBOL_GPL(ata_eng_timeout); EXPORT_SYMBOL_GPL(ata_tf_load); EXPORT_SYMBOL_GPL(ata_tf_read); EXPORT_SYMBOL_GPL(ata_noop_dev_select); @@ -4925,6 +5936,9 @@ EXPORT_SYMBOL_GPL(ata_port_start); EXPORT_SYMBOL_GPL(ata_port_stop); EXPORT_SYMBOL_GPL(ata_host_stop); EXPORT_SYMBOL_GPL(ata_interrupt); +EXPORT_SYMBOL_GPL(ata_mmio_data_xfer); +EXPORT_SYMBOL_GPL(ata_pio_data_xfer); +EXPORT_SYMBOL_GPL(ata_pio_data_xfer_noirq); EXPORT_SYMBOL_GPL(ata_qc_prep); EXPORT_SYMBOL_GPL(ata_noop_qc_prep); EXPORT_SYMBOL_GPL(ata_bmdma_setup); @@ -4932,33 +5946,48 @@ EXPORT_SYMBOL_GPL(ata_bmdma_start); EXPORT_SYMBOL_GPL(ata_bmdma_irq_clear); EXPORT_SYMBOL_GPL(ata_bmdma_status); EXPORT_SYMBOL_GPL(ata_bmdma_stop); +EXPORT_SYMBOL_GPL(ata_bmdma_freeze); +EXPORT_SYMBOL_GPL(ata_bmdma_thaw); +EXPORT_SYMBOL_GPL(ata_bmdma_drive_eh); +EXPORT_SYMBOL_GPL(ata_bmdma_error_handler); +EXPORT_SYMBOL_GPL(ata_bmdma_post_internal_cmd); EXPORT_SYMBOL_GPL(ata_port_probe); +EXPORT_SYMBOL_GPL(sata_set_spd); +EXPORT_SYMBOL_GPL(sata_phy_debounce); +EXPORT_SYMBOL_GPL(sata_phy_resume); EXPORT_SYMBOL_GPL(sata_phy_reset); EXPORT_SYMBOL_GPL(__sata_phy_reset); EXPORT_SYMBOL_GPL(ata_bus_reset); -EXPORT_SYMBOL_GPL(ata_std_probeinit); +EXPORT_SYMBOL_GPL(ata_std_prereset); EXPORT_SYMBOL_GPL(ata_std_softreset); EXPORT_SYMBOL_GPL(sata_std_hardreset); EXPORT_SYMBOL_GPL(ata_std_postreset); -EXPORT_SYMBOL_GPL(ata_std_probe_reset); -EXPORT_SYMBOL_GPL(ata_drive_probe_reset); EXPORT_SYMBOL_GPL(ata_dev_revalidate); EXPORT_SYMBOL_GPL(ata_dev_classify); EXPORT_SYMBOL_GPL(ata_dev_pair); EXPORT_SYMBOL_GPL(ata_port_disable); EXPORT_SYMBOL_GPL(ata_ratelimit); +EXPORT_SYMBOL_GPL(ata_wait_register); EXPORT_SYMBOL_GPL(ata_busy_sleep); EXPORT_SYMBOL_GPL(ata_port_queue_task); EXPORT_SYMBOL_GPL(ata_scsi_ioctl); EXPORT_SYMBOL_GPL(ata_scsi_queuecmd); EXPORT_SYMBOL_GPL(ata_scsi_slave_config); +EXPORT_SYMBOL_GPL(ata_scsi_slave_destroy); +EXPORT_SYMBOL_GPL(ata_scsi_change_queue_depth); EXPORT_SYMBOL_GPL(ata_scsi_release); EXPORT_SYMBOL_GPL(ata_host_intr); +EXPORT_SYMBOL_GPL(sata_scr_valid); +EXPORT_SYMBOL_GPL(sata_scr_read); +EXPORT_SYMBOL_GPL(sata_scr_write); +EXPORT_SYMBOL_GPL(sata_scr_write_flush); +EXPORT_SYMBOL_GPL(ata_port_online); +EXPORT_SYMBOL_GPL(ata_port_offline); +EXPORT_SYMBOL_GPL(ata_host_set_suspend); +EXPORT_SYMBOL_GPL(ata_host_set_resume); EXPORT_SYMBOL_GPL(ata_id_string); EXPORT_SYMBOL_GPL(ata_id_c_string); EXPORT_SYMBOL_GPL(ata_scsi_simulate); -EXPORT_SYMBOL_GPL(ata_eh_qc_complete); -EXPORT_SYMBOL_GPL(ata_eh_qc_retry); EXPORT_SYMBOL_GPL(ata_pio_need_iordy); EXPORT_SYMBOL_GPL(ata_timing_compute); @@ -4970,13 +5999,23 @@ EXPORT_SYMBOL_GPL(ata_pci_host_stop); EXPORT_SYMBOL_GPL(ata_pci_init_native_mode); EXPORT_SYMBOL_GPL(ata_pci_init_one); EXPORT_SYMBOL_GPL(ata_pci_remove_one); +EXPORT_SYMBOL_GPL(ata_pci_device_do_suspend); +EXPORT_SYMBOL_GPL(ata_pci_device_do_resume); EXPORT_SYMBOL_GPL(ata_pci_device_suspend); EXPORT_SYMBOL_GPL(ata_pci_device_resume); EXPORT_SYMBOL_GPL(ata_pci_default_filter); EXPORT_SYMBOL_GPL(ata_pci_clear_simplex); #endif /* CONFIG_PCI */ -EXPORT_SYMBOL_GPL(ata_device_suspend); -EXPORT_SYMBOL_GPL(ata_device_resume); EXPORT_SYMBOL_GPL(ata_scsi_device_suspend); EXPORT_SYMBOL_GPL(ata_scsi_device_resume); + +EXPORT_SYMBOL_GPL(ata_eng_timeout); +EXPORT_SYMBOL_GPL(ata_port_schedule_eh); +EXPORT_SYMBOL_GPL(ata_port_abort); +EXPORT_SYMBOL_GPL(ata_port_freeze); +EXPORT_SYMBOL_GPL(ata_eh_freeze_port); +EXPORT_SYMBOL_GPL(ata_eh_thaw_port); +EXPORT_SYMBOL_GPL(ata_eh_qc_complete); +EXPORT_SYMBOL_GPL(ata_eh_qc_retry); +EXPORT_SYMBOL_GPL(ata_do_eh); diff --git a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c index b405acf11..e92c31d69 100644 --- a/drivers/scsi/libata-scsi.c +++ b/drivers/scsi/libata-scsi.c @@ -38,9 +38,10 @@ #include #include #include +#include #include #include -#include +#include #include #include #include @@ -51,10 +52,14 @@ #define SECTOR_SIZE 512 typedef unsigned int (*ata_xlat_func_t)(struct ata_queued_cmd *qc, const u8 *scsicmd); -static struct ata_device * -ata_scsi_find_dev(struct ata_port *ap, const struct scsi_device *scsidev); -static void ata_scsi_error(struct Scsi_Host *host); -enum scsi_eh_timer_return ata_scsi_timed_out(struct scsi_cmnd *cmd); + +static struct ata_device * __ata_scsi_find_dev(struct ata_port *ap, + const struct scsi_device *scsidev); +static struct ata_device * ata_scsi_find_dev(struct ata_port *ap, + const struct scsi_device *scsidev); +static int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel, + unsigned int id, unsigned int lun); + #define RW_RECOVERY_MPAGE 0x1 #define RW_RECOVERY_MPAGE_LEN 12 @@ -102,6 +107,7 @@ static const u8 def_control_mpage[CONTROL_MPAGE_LEN] = { struct scsi_transport_template ata_scsi_transport_template = { .eh_strategy_handler = ata_scsi_error, .eh_timed_out = ata_scsi_timed_out, + .user_scan = ata_scsi_user_scan, }; @@ -216,9 +222,7 @@ int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg) && copy_to_user(arg + sizeof(args), argbuf, argsize)) rc = -EFAULT; error: - if (argbuf) - kfree(argbuf); - + kfree(argbuf); return rc; } @@ -304,7 +308,6 @@ int ata_scsi_ioctl(struct scsi_device *scsidev, int cmd, void __user *arg) /** * ata_scsi_qc_new - acquire new ata_queued_cmd reference - * @ap: ATA port to which the new command is attached * @dev: ATA device to which the new command is attached * @cmd: SCSI command that originated this ATA command * @done: SCSI command completion function @@ -323,14 +326,13 @@ int ata_scsi_ioctl(struct scsi_device *scsidev, int cmd, void __user *arg) * RETURNS: * Command allocated, or %NULL if none available. */ -struct ata_queued_cmd *ata_scsi_qc_new(struct ata_port *ap, - struct ata_device *dev, +struct ata_queued_cmd *ata_scsi_qc_new(struct ata_device *dev, struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)) { struct ata_queued_cmd *qc; - qc = ata_qc_new_init(ap, dev); + qc = ata_qc_new_init(dev); if (qc) { qc->scsicmd = cmd; qc->scsidone = done; @@ -395,20 +397,129 @@ void ata_dump_status(unsigned id, struct ata_taskfile *tf) } } -int ata_scsi_device_resume(struct scsi_device *sdev) +/** + * ata_scsi_device_suspend - suspend ATA device associated with sdev + * @sdev: the SCSI device to suspend + * @state: target power management state + * + * Request suspend EH action on the ATA device associated with + * @sdev and wait for the operation to complete. + * + * LOCKING: + * Kernel thread context (may sleep). + * + * RETURNS: + * 0 on success, -errno otherwise. + */ +int ata_scsi_device_suspend(struct scsi_device *sdev, pm_message_t state) { - struct ata_port *ap = (struct ata_port *) &sdev->host->hostdata[0]; - struct ata_device *dev = &ap->device[sdev->id]; + struct ata_port *ap = ata_shost_to_port(sdev->host); + struct ata_device *dev = ata_scsi_find_dev(ap, sdev); + unsigned long flags; + unsigned int action; + int rc = 0; + + if (!dev) + goto out; + + spin_lock_irqsave(ap->lock, flags); + + /* wait for the previous resume to complete */ + while (dev->flags & ATA_DFLAG_SUSPENDED) { + spin_unlock_irqrestore(ap->lock, flags); + ata_port_wait_eh(ap); + spin_lock_irqsave(ap->lock, flags); + } + + /* if @sdev is already detached, nothing to do */ + if (sdev->sdev_state == SDEV_OFFLINE || + sdev->sdev_state == SDEV_CANCEL || sdev->sdev_state == SDEV_DEL) + goto out_unlock; + + /* request suspend */ + action = ATA_EH_SUSPEND; + if (state.event != PM_EVENT_SUSPEND) + action |= ATA_EH_PM_FREEZE; + ap->eh_info.dev_action[dev->devno] |= action; + ap->eh_info.flags |= ATA_EHI_QUIET; + ata_port_schedule_eh(ap); + + spin_unlock_irqrestore(ap->lock, flags); - return ata_device_resume(ap, dev); + /* wait for EH to do the job */ + ata_port_wait_eh(ap); + + spin_lock_irqsave(ap->lock, flags); + + /* If @sdev is still attached but the associated ATA device + * isn't suspended, the operation failed. + */ + if (sdev->sdev_state != SDEV_OFFLINE && + sdev->sdev_state != SDEV_CANCEL && sdev->sdev_state != SDEV_DEL && + !(dev->flags & ATA_DFLAG_SUSPENDED)) + rc = -EIO; + + out_unlock: + spin_unlock_irqrestore(ap->lock, flags); + out: + if (rc == 0) + sdev->sdev_gendev.power.power_state = state; + return rc; } -int ata_scsi_device_suspend(struct scsi_device *sdev, pm_message_t state) +/** + * ata_scsi_device_resume - resume ATA device associated with sdev + * @sdev: the SCSI device to resume + * + * Request resume EH action on the ATA device associated with + * @sdev and return immediately. This enables parallel + * wakeup/spinup of devices. + * + * LOCKING: + * Kernel thread context (may sleep). + * + * RETURNS: + * 0. + */ +int ata_scsi_device_resume(struct scsi_device *sdev) { - struct ata_port *ap = (struct ata_port *) &sdev->host->hostdata[0]; - struct ata_device *dev = &ap->device[sdev->id]; + struct ata_port *ap = ata_shost_to_port(sdev->host); + struct ata_device *dev = ata_scsi_find_dev(ap, sdev); + struct ata_eh_info *ehi = &ap->eh_info; + unsigned long flags; + unsigned int action; + + if (!dev) + goto out; + + spin_lock_irqsave(ap->lock, flags); - return ata_device_suspend(ap, dev, state); + /* if @sdev is already detached, nothing to do */ + if (sdev->sdev_state == SDEV_OFFLINE || + sdev->sdev_state == SDEV_CANCEL || sdev->sdev_state == SDEV_DEL) + goto out_unlock; + + /* request resume */ + action = ATA_EH_RESUME; + if (sdev->sdev_gendev.power.power_state.event == PM_EVENT_SUSPEND) + __ata_ehi_hotplugged(ehi); + else + action |= ATA_EH_PM_FREEZE | ATA_EH_SOFTRESET; + ehi->dev_action[dev->devno] |= action; + + /* We don't want autopsy and verbose EH messages. Disable + * those if we're the only device on this link. + */ + if (ata_port_max_devices(ap) == 1) + ehi->flags |= ATA_EHI_NO_AUTOPSY | ATA_EHI_QUIET; + + ata_port_schedule_eh(ap); + + out_unlock: + spin_unlock_irqrestore(ap->lock, flags); + out: + sdev->sdev_gendev.power.power_state = PMSG_ON; + return 0; } /** @@ -419,6 +530,7 @@ int ata_scsi_device_suspend(struct scsi_device *sdev, pm_message_t state) * @sk: the sense key we'll fill out * @asc: the additional sense code we'll fill out * @ascq: the additional sense code qualifier we'll fill out + * @verbose: be verbose * * Converts an ATA error into a SCSI error. Fill out pointers to * SK, ASC, and ASCQ bytes for later use in fixed or descriptor @@ -428,7 +540,7 @@ int ata_scsi_device_suspend(struct scsi_device *sdev, pm_message_t state) * spin_lock_irqsave(host_set lock) */ void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk, u8 *asc, - u8 *ascq) + u8 *ascq, int verbose) { int i; @@ -493,8 +605,9 @@ void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk, u8 *asc, } } /* No immediate match */ - printk(KERN_WARNING "ata%u: no sense translation for " - "error 0x%02x\n", id, drv_err); + if (verbose) + printk(KERN_WARNING "ata%u: no sense translation for " + "error 0x%02x\n", id, drv_err); } /* Fall back to interpreting status bits */ @@ -507,8 +620,9 @@ void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk, u8 *asc, } } /* No error? Undecoded? */ - printk(KERN_WARNING "ata%u: no sense translation for status: 0x%02x\n", - id, drv_stat); + if (verbose) + printk(KERN_WARNING "ata%u: no sense translation for " + "status: 0x%02x\n", id, drv_stat); /* We need a sensible error return here, which is tricky, and one that won't cause people to do things like return a disk wrongly */ @@ -517,6 +631,10 @@ void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk, u8 *asc, *ascq = 0x00; translate_done: + if (verbose) + printk(KERN_ERR "ata%u: translated ATA stat/err 0x%02x/%02x " + "to SCSI SK/ASC/ASCQ 0x%x/%02x/%02x\n", + id, drv_stat, drv_err, *sk, *asc, *ascq); return; } @@ -536,27 +654,23 @@ void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk, u8 *asc, void ata_gen_ata_desc_sense(struct ata_queued_cmd *qc) { struct scsi_cmnd *cmd = qc->scsicmd; - struct ata_taskfile *tf = &qc->tf; + struct ata_taskfile *tf = &qc->result_tf; unsigned char *sb = cmd->sense_buffer; unsigned char *desc = sb + 8; + int verbose = qc->ap->ops->error_handler == NULL; memset(sb, 0, SCSI_SENSE_BUFFERSIZE); cmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION; - /* - * Read the controller registers. - */ - WARN_ON(qc->ap->ops->tf_read == NULL); - qc->ap->ops->tf_read(qc->ap, tf); - /* * Use ata_to_sense_error() to map status register bits * onto sense key, asc & ascq. */ - if (tf->command & (ATA_BUSY | ATA_DF | ATA_ERR | ATA_DRQ)) { + if (qc->err_mask || + tf->command & (ATA_BUSY | ATA_DF | ATA_ERR | ATA_DRQ)) { ata_to_sense_error(qc->ap->id, tf->command, tf->feature, - &sb[1], &sb[2], &sb[3]); + &sb[1], &sb[2], &sb[3], verbose); sb[1] &= 0x0f; } @@ -612,26 +726,22 @@ void ata_gen_ata_desc_sense(struct ata_queued_cmd *qc) void ata_gen_fixed_sense(struct ata_queued_cmd *qc) { struct scsi_cmnd *cmd = qc->scsicmd; - struct ata_taskfile *tf = &qc->tf; + struct ata_taskfile *tf = &qc->result_tf; unsigned char *sb = cmd->sense_buffer; + int verbose = qc->ap->ops->error_handler == NULL; memset(sb, 0, SCSI_SENSE_BUFFERSIZE); cmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION; - /* - * Read the controller registers. - */ - WARN_ON(qc->ap->ops->tf_read == NULL); - qc->ap->ops->tf_read(qc->ap, tf); - /* * Use ata_to_sense_error() to map status register bits * onto sense key, asc & ascq. */ - if (tf->command & (ATA_BUSY | ATA_DF | ATA_ERR | ATA_DRQ)) { + if (qc->err_mask || + tf->command & (ATA_BUSY | ATA_DF | ATA_ERR | ATA_DRQ)) { ata_to_sense_error(qc->ap->id, tf->command, tf->feature, - &sb[2], &sb[12], &sb[13]); + &sb[2], &sb[12], &sb[13], verbose); sb[2] &= 0x0f; } @@ -674,7 +784,7 @@ static void ata_scsi_dev_config(struct scsi_device *sdev, */ max_sectors = ATA_MAX_SECTORS; if (dev->flags & ATA_DFLAG_LBA48) - max_sectors = 2048; + max_sectors = ATA_MAX_SECTORS_LBA48; if (dev->max_sectors) max_sectors = dev->max_sectors; @@ -689,6 +799,14 @@ static void ata_scsi_dev_config(struct scsi_device *sdev, request_queue_t *q = sdev->request_queue; blk_queue_max_hw_segments(q, q->max_hw_segments - 1); } + + if (dev->flags & ATA_DFLAG_NCQ) { + int depth; + + depth = min(sdev->host->can_queue, ata_id_queue_depth(dev->id)); + depth = min(ATA_MAX_QUEUE - 1, depth); + scsi_adjust_queue_depth(sdev, MSG_SIMPLE_TAG, depth); + } } /** @@ -705,152 +823,88 @@ static void ata_scsi_dev_config(struct scsi_device *sdev, int ata_scsi_slave_config(struct scsi_device *sdev) { + struct ata_port *ap = ata_shost_to_port(sdev->host); + struct ata_device *dev = __ata_scsi_find_dev(ap, sdev); + ata_scsi_sdev_config(sdev); blk_queue_max_phys_segments(sdev->request_queue, LIBATA_MAX_PRD); - if (sdev->id < ATA_MAX_DEVICES) { - struct ata_port *ap; - struct ata_device *dev; - - ap = (struct ata_port *) &sdev->host->hostdata[0]; - dev = &ap->device[sdev->id]; - + if (dev) ata_scsi_dev_config(sdev, dev); - } return 0; /* scsi layer doesn't check return value, sigh */ } /** - * ata_scsi_timed_out - SCSI layer time out callback - * @cmd: timed out SCSI command + * ata_scsi_slave_destroy - SCSI device is about to be destroyed + * @sdev: SCSI device to be destroyed * - * Handles SCSI layer timeout. We race with normal completion of - * the qc for @cmd. If the qc is already gone, we lose and let - * the scsi command finish (EH_HANDLED). Otherwise, the qc has - * timed out and EH should be invoked. Prevent ata_qc_complete() - * from finishing it by setting EH_SCHEDULED and return - * EH_NOT_HANDLED. + * @sdev is about to be destroyed for hot/warm unplugging. If + * this unplugging was initiated by libata as indicated by NULL + * dev->sdev, this function doesn't have to do anything. + * Otherwise, SCSI layer initiated warm-unplug is in progress. + * Clear dev->sdev, schedule the device for ATA detach and invoke + * EH. * * LOCKING: - * Called from timer context - * - * RETURNS: - * EH_HANDLED or EH_NOT_HANDLED + * Defined by SCSI layer. We don't really care. */ -enum scsi_eh_timer_return ata_scsi_timed_out(struct scsi_cmnd *cmd) +void ata_scsi_slave_destroy(struct scsi_device *sdev) { - struct Scsi_Host *host = cmd->device->host; - struct ata_port *ap = (struct ata_port *) &host->hostdata[0]; + struct ata_port *ap = ata_shost_to_port(sdev->host); unsigned long flags; - struct ata_queued_cmd *qc; - enum scsi_eh_timer_return ret = EH_HANDLED; + struct ata_device *dev; - DPRINTK("ENTER\n"); + if (!ap->ops->error_handler) + return; - spin_lock_irqsave(&ap->host_set->lock, flags); - qc = ata_qc_from_tag(ap, ap->active_tag); - if (qc) { - WARN_ON(qc->scsicmd != cmd); - qc->flags |= ATA_QCFLAG_EH_SCHEDULED; - qc->err_mask |= AC_ERR_TIMEOUT; - ret = EH_NOT_HANDLED; + spin_lock_irqsave(ap->lock, flags); + dev = __ata_scsi_find_dev(ap, sdev); + if (dev && dev->sdev) { + /* SCSI device already in CANCEL state, no need to offline it */ + dev->sdev = NULL; + dev->flags |= ATA_DFLAG_DETACH; + ata_port_schedule_eh(ap); } - spin_unlock_irqrestore(&ap->host_set->lock, flags); - - DPRINTK("EXIT, ret=%d\n", ret); - return ret; + spin_unlock_irqrestore(ap->lock, flags); } /** - * ata_scsi_error - SCSI layer error handler callback - * @host: SCSI host on which error occurred + * ata_scsi_change_queue_depth - SCSI callback for queue depth config + * @sdev: SCSI device to configure queue depth for + * @queue_depth: new queue depth * - * Handles SCSI-layer-thrown error events. + * This is libata standard hostt->change_queue_depth callback. + * SCSI will call into this callback when user tries to set queue + * depth via sysfs. * * LOCKING: - * Inherited from SCSI layer (none, can sleep) + * SCSI layer (we don't care) + * + * RETURNS: + * Newly configured queue depth. */ - -static void ata_scsi_error(struct Scsi_Host *host) +int ata_scsi_change_queue_depth(struct scsi_device *sdev, int queue_depth) { - struct ata_port *ap; - unsigned long flags; - - DPRINTK("ENTER\n"); - - ap = (struct ata_port *) &host->hostdata[0]; - - spin_lock_irqsave(&ap->host_set->lock, flags); - WARN_ON(ap->flags & ATA_FLAG_IN_EH); - ap->flags |= ATA_FLAG_IN_EH; - WARN_ON(ata_qc_from_tag(ap, ap->active_tag) == NULL); - spin_unlock_irqrestore(&ap->host_set->lock, flags); - - ata_port_flush_task(ap); - - ap->ops->eng_timeout(ap); - - WARN_ON(host->host_failed || !list_empty(&host->eh_cmd_q)); - - scsi_eh_flush_done_q(&ap->eh_done_q); - - spin_lock_irqsave(&ap->host_set->lock, flags); - ap->flags &= ~ATA_FLAG_IN_EH; - spin_unlock_irqrestore(&ap->host_set->lock, flags); - - DPRINTK("EXIT\n"); -} - -static void ata_eh_scsidone(struct scsi_cmnd *scmd) -{ - /* nada */ -} - -static void __ata_eh_qc_complete(struct ata_queued_cmd *qc) -{ - struct ata_port *ap = qc->ap; - struct scsi_cmnd *scmd = qc->scsicmd; - unsigned long flags; + struct ata_port *ap = ata_shost_to_port(sdev->host); + struct ata_device *dev; + int max_depth; - spin_lock_irqsave(&ap->host_set->lock, flags); - qc->scsidone = ata_eh_scsidone; - __ata_qc_complete(qc); - WARN_ON(ata_tag_valid(qc->tag)); - spin_unlock_irqrestore(&ap->host_set->lock, flags); + if (queue_depth < 1) + return sdev->queue_depth; - scsi_eh_finish_cmd(scmd, &ap->eh_done_q); -} + dev = ata_scsi_find_dev(ap, sdev); + if (!dev || !ata_dev_enabled(dev)) + return sdev->queue_depth; -/** - * ata_eh_qc_complete - Complete an active ATA command from EH - * @qc: Command to complete - * - * Indicate to the mid and upper layers that an ATA command has - * completed. To be used from EH. - */ -void ata_eh_qc_complete(struct ata_queued_cmd *qc) -{ - struct scsi_cmnd *scmd = qc->scsicmd; - scmd->retries = scmd->allowed; - __ata_eh_qc_complete(qc); -} + max_depth = min(sdev->host->can_queue, ata_id_queue_depth(dev->id)); + max_depth = min(ATA_MAX_QUEUE - 1, max_depth); + if (queue_depth > max_depth) + queue_depth = max_depth; -/** - * ata_eh_qc_retry - Tell midlayer to retry an ATA command after EH - * @qc: Command to retry - * - * Indicate to the mid and upper layers that an ATA command - * should be retried. To be used from EH. - * - * SCSI midlayer limits the number of retries to scmd->allowed. - * This function might need to adjust scmd->retries for commands - * which get retried due to unrelated NCQ failures. - */ -void ata_eh_qc_retry(struct ata_queued_cmd *qc) -{ - __ata_eh_qc_complete(qc); + scsi_adjust_queue_depth(sdev, MSG_SIMPLE_TAG, queue_depth); + return queue_depth; } /** @@ -888,7 +942,7 @@ static unsigned int ata_scsi_start_stop_xlat(struct ata_queued_cmd *qc, tf->nsect = 1; /* 1 sector, lba=0 */ if (qc->dev->flags & ATA_DFLAG_LBA) { - qc->tf.flags |= ATA_TFLAG_LBA; + tf->flags |= ATA_TFLAG_LBA; tf->lbah = 0x0; tf->lbam = 0x0; @@ -1192,6 +1246,7 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, const u8 *scsicm u64 block; u32 n_block; + qc->flags |= ATA_QCFLAG_IO; tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE; if (scsicmd[0] == WRITE_10 || scsicmd[0] == WRITE_6 || @@ -1238,7 +1293,36 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, const u8 *scsicm */ goto nothing_to_do; - if (dev->flags & ATA_DFLAG_LBA) { + if ((dev->flags & (ATA_DFLAG_PIO | ATA_DFLAG_NCQ)) == ATA_DFLAG_NCQ) { + /* yay, NCQ */ + if (!lba_48_ok(block, n_block)) + goto out_of_range; + + tf->protocol = ATA_PROT_NCQ; + tf->flags |= ATA_TFLAG_LBA | ATA_TFLAG_LBA48; + + if (tf->flags & ATA_TFLAG_WRITE) + tf->command = ATA_CMD_FPDMA_WRITE; + else + tf->command = ATA_CMD_FPDMA_READ; + + qc->nsect = n_block; + + tf->nsect = qc->tag << 3; + tf->hob_feature = (n_block >> 8) & 0xff; + tf->feature = n_block & 0xff; + + tf->hob_lbah = (block >> 40) & 0xff; + tf->hob_lbam = (block >> 32) & 0xff; + tf->hob_lbal = (block >> 24) & 0xff; + tf->lbah = (block >> 16) & 0xff; + tf->lbam = (block >> 8) & 0xff; + tf->lbal = block & 0xff; + + tf->device = 1 << 6; + if (tf->flags & ATA_TFLAG_FUA) + tf->device |= 1 << 7; + } else if (dev->flags & ATA_DFLAG_LBA) { tf->flags |= ATA_TFLAG_LBA; if (lba_28_ok(block, n_block)) { @@ -1329,6 +1413,17 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc) u8 *cdb = cmd->cmnd; int need_sense = (qc->err_mask != 0); + /* We snoop the SET_FEATURES - Write Cache ON/OFF command, and + * schedule EH_REVALIDATE operation to update the IDENTIFY DEVICE + * cache + */ + if (!need_sense && (qc->tf.command == ATA_CMD_SET_FEATURES) && + ((qc->tf.feature == SETFEATURES_WC_ON) || + (qc->tf.feature == SETFEATURES_WC_OFF))) { + qc->ap->eh_info.action |= ATA_EH_REVALIDATE; + ata_port_schedule_eh(qc->ap); + } + /* For ATA pass thru (SAT) commands, generate a sense block if * user mandated it or if there's an error. Note that if we * generate because the user forced us to, a check condition @@ -1353,19 +1448,49 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc) } } - if (need_sense) { - /* The ata_gen_..._sense routines fill in tf */ - ata_dump_status(qc->ap->id, &qc->tf); - } + if (need_sense && !qc->ap->ops->error_handler) + ata_dump_status(qc->ap->id, &qc->result_tf); qc->scsidone(cmd); ata_qc_free(qc); } +/** + * ata_scmd_need_defer - Check whether we need to defer scmd + * @dev: ATA device to which the command is addressed + * @is_io: Is the command IO (and thus possibly NCQ)? + * + * NCQ and non-NCQ commands cannot run together. As upper layer + * only knows the queue depth, we are responsible for maintaining + * exclusion. This function checks whether a new command can be + * issued to @dev. + * + * LOCKING: + * spin_lock_irqsave(host_set lock) + * + * RETURNS: + * 1 if deferring is needed, 0 otherwise. + */ +static int ata_scmd_need_defer(struct ata_device *dev, int is_io) +{ + struct ata_port *ap = dev->ap; + + if (!(dev->flags & ATA_DFLAG_NCQ)) + return 0; + + if (is_io) { + if (!ata_tag_valid(ap->active_tag)) + return 0; + } else { + if (!ata_tag_valid(ap->active_tag) && !ap->sactive) + return 0; + } + return 1; +} + /** * ata_scsi_translate - Translate then issue SCSI command to ATA device - * @ap: ATA port to which the command is addressed * @dev: ATA device to which the command is addressed * @cmd: SCSI command to execute * @done: SCSI command completion function @@ -1386,19 +1511,25 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc) * * LOCKING: * spin_lock_irqsave(host_set lock) + * + * RETURNS: + * 0 on success, SCSI_ML_QUEUE_DEVICE_BUSY if the command + * needs to be deferred. */ - -static void ata_scsi_translate(struct ata_port *ap, struct ata_device *dev, - struct scsi_cmnd *cmd, +static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), ata_xlat_func_t xlat_func) { struct ata_queued_cmd *qc; u8 *scsicmd = cmd->cmnd; + int is_io = xlat_func == ata_scsi_rw_xlat; VPRINTK("ENTER\n"); - qc = ata_scsi_qc_new(ap, dev, cmd, done); + if (unlikely(ata_scmd_need_defer(dev, is_io))) + goto defer; + + qc = ata_scsi_qc_new(dev, cmd, done); if (!qc) goto err_mem; @@ -1406,8 +1537,8 @@ static void ata_scsi_translate(struct ata_port *ap, struct ata_device *dev, if (cmd->sc_data_direction == DMA_FROM_DEVICE || cmd->sc_data_direction == DMA_TO_DEVICE) { if (unlikely(cmd->request_bufflen < 1)) { - printk(KERN_WARNING "ata%u(%u): WARNING: zero len r/w req\n", - ap->id, dev->devno); + ata_dev_printk(dev, KERN_WARNING, + "WARNING: zero len r/w req\n"); goto err_did; } @@ -1429,13 +1560,13 @@ static void ata_scsi_translate(struct ata_port *ap, struct ata_device *dev, ata_qc_issue(qc); VPRINTK("EXIT\n"); - return; + return 0; early_finish: ata_qc_free(qc); done(cmd); DPRINTK("EXIT - early finish (good or error)\n"); - return; + return 0; err_did: ata_qc_free(qc); @@ -1443,7 +1574,11 @@ err_mem: cmd->result = (DID_ERROR << 16); done(cmd); DPRINTK("EXIT - internal\n"); - return; + return 0; + +defer: + DPRINTK("EXIT - defer\n"); + return SCSI_MLQUEUE_DEVICE_BUSY; } /** @@ -1941,7 +2076,7 @@ unsigned int ata_scsiop_mode_sense(struct ata_scsi_args *args, u8 *rbuf, return 0; dpofua = 0; - if (ata_dev_supports_fua(args->id) && dev->flags & ATA_DFLAG_LBA48 && + if (ata_dev_supports_fua(args->id) && (dev->flags & ATA_DFLAG_LBA48) && (!(dev->flags & ATA_DFLAG_PIO) || dev->multi_count)) dpofua = 1 << 4; @@ -2134,13 +2269,14 @@ void ata_scsi_badcmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), u8 static void atapi_sense_complete(struct ata_queued_cmd *qc) { - if (qc->err_mask && ((qc->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 * correct for ATA, not ATAPI */ ata_gen_ata_desc_sense(qc); + } qc->scsidone(qc->scsicmd); ata_qc_free(qc); @@ -2204,21 +2340,51 @@ static void atapi_qc_complete(struct ata_queued_cmd *qc) VPRINTK("ENTER, err_mask 0x%X\n", err_mask); + /* handle completion from new EH */ + if (unlikely(qc->ap->ops->error_handler && + (err_mask || qc->flags & ATA_QCFLAG_SENSE_VALID))) { + + if (!(qc->flags & ATA_QCFLAG_SENSE_VALID)) { + /* FIXME: not quite right; we don't want the + * translation of taskfile registers into a + * sense descriptors, since that's only + * correct for ATA, not ATAPI + */ + ata_gen_ata_desc_sense(qc); + } + + /* SCSI EH automatically locks door if sdev->locked is + * set. Sometimes door lock request continues to + * fail, for example, when no media is present. This + * creates a loop - SCSI EH issues door lock which + * fails and gets invoked again to acquire sense data + * for the failed command. + * + * If door lock fails, always clear sdev->locked to + * avoid this infinite loop. + */ + if (qc->cdb[0] == ALLOW_MEDIUM_REMOVAL) + qc->dev->sdev->locked = 0; + + qc->scsicmd->result = SAM_STAT_CHECK_CONDITION; + qc->scsidone(cmd); + ata_qc_free(qc); + return; + } + + /* successful completion or old EH failure path */ if (unlikely(err_mask & AC_ERR_DEV)) { cmd->result = SAM_STAT_CHECK_CONDITION; atapi_request_sense(qc); return; - } - - else if (unlikely(err_mask)) + } else if (unlikely(err_mask)) { /* FIXME: not quite right; we don't want the * translation of taskfile registers into * a sense descriptors, since that's only * correct for ATA, not ATAPI */ ata_gen_ata_desc_sense(qc); - - else { + } else { u8 *scsicmd = cmd->cmnd; if ((scsicmd[0] == INQUIRY) && ((scsicmd[1] & 0x03) == 0)) { @@ -2300,18 +2466,63 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc, const u8 *scsicmd) qc->tf.protocol = ATA_PROT_ATAPI_DMA; qc->tf.feature |= ATAPI_PKT_DMA; -#ifdef ATAPI_ENABLE_DMADIR - /* some SATA bridges need us to indicate data xfer direction */ - if (cmd->sc_data_direction != DMA_TO_DEVICE) + if (atapi_dmadir && (cmd->sc_data_direction != DMA_TO_DEVICE)) + /* some SATA bridges need us to indicate data xfer direction */ qc->tf.feature |= ATAPI_DMADIR; -#endif } - qc->nbytes = cmd->bufflen; + qc->nbytes = cmd->request_bufflen; return 0; } +static struct ata_device * ata_find_dev(struct ata_port *ap, int id) +{ + if (likely(id < ATA_MAX_DEVICES)) + return &ap->device[id]; + return NULL; +} + +static struct ata_device * __ata_scsi_find_dev(struct ata_port *ap, + const struct scsi_device *scsidev) +{ + /* skip commands not addressed to targets we simulate */ + if (unlikely(scsidev->channel || scsidev->lun)) + return NULL; + + return ata_find_dev(ap, scsidev->id); +} + +/** + * ata_scsi_dev_enabled - determine if device is enabled + * @dev: ATA device + * + * Determine if commands should be sent to the specified device. + * + * LOCKING: + * spin_lock_irqsave(host_set lock) + * + * RETURNS: + * 0 if commands are not allowed / 1 if commands are allowed + */ + +static int ata_scsi_dev_enabled(struct ata_device *dev) +{ + if (unlikely(!ata_dev_enabled(dev))) + return 0; + + if (!atapi_enabled || (dev->ap->flags & ATA_FLAG_NO_ATAPI)) { + if (unlikely(dev->class == ATA_DEV_ATAPI)) { + ata_dev_printk(dev, KERN_WARNING, + "WARNING: ATAPI is %s, device ignored.\n", + atapi_enabled ? "not supported with this driver" : "disabled"); + return 0; + } + } + + return 1; +} + /** * ata_scsi_find_dev - lookup ata_device from scsi_cmnd * @ap: ATA port to which the device is attached @@ -2328,33 +2539,14 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc, const u8 *scsicmd) * RETURNS: * Associated ATA device, or %NULL if not found. */ - static struct ata_device * ata_scsi_find_dev(struct ata_port *ap, const struct scsi_device *scsidev) { - struct ata_device *dev; - - /* skip commands not addressed to targets we simulate */ - if (likely(scsidev->id < ATA_MAX_DEVICES)) - dev = &ap->device[scsidev->id]; - else - return NULL; + struct ata_device *dev = __ata_scsi_find_dev(ap, scsidev); - if (unlikely((scsidev->channel != 0) || - (scsidev->lun != 0))) + if (unlikely(!dev || !ata_scsi_dev_enabled(dev))) return NULL; - if (unlikely(!ata_dev_present(dev))) - return NULL; - - 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; } @@ -2411,10 +2603,15 @@ ata_scsi_pass_thru(struct ata_queued_cmd *qc, const u8 *scsicmd) { struct ata_taskfile *tf = &(qc->tf); struct scsi_cmnd *cmd = qc->scsicmd; + struct ata_device *dev = qc->dev; if ((tf->protocol = ata_scsi_map_proto(scsicmd[1])) == ATA_PROT_UNKNOWN) goto invalid_fld; + /* We may not issue DMA commands if no DMA mode is set */ + if (tf->protocol == ATA_PROT_DMA && dev->dma_mode == 0) + goto invalid_fld; + if (scsicmd[1] & 0xe0) /* PIO multi not supported yet */ goto invalid_fld; @@ -2497,7 +2694,10 @@ ata_scsi_pass_thru(struct ata_queued_cmd *qc, const u8 *scsicmd) * TODO: find out if we need to do more here to * cover scatter/gather case. */ - qc->nsect = cmd->bufflen / ATA_SECT_SIZE; + qc->nsect = cmd->request_bufflen / ATA_SECT_SIZE; + + /* request result TF */ + qc->flags |= ATA_QCFLAG_RESULT_TF; return 0; @@ -2575,19 +2775,24 @@ static inline void ata_scsi_dump_cdb(struct ata_port *ap, #endif } -static inline void __ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), - struct ata_port *ap, struct ata_device *dev) +static inline int __ata_scsi_queuecmd(struct scsi_cmnd *cmd, + void (*done)(struct scsi_cmnd *), + struct ata_device *dev) { + int rc = 0; + if (dev->class == ATA_DEV_ATA) { ata_xlat_func_t xlat_func = ata_get_xlat_func(dev, cmd->cmnd[0]); if (xlat_func) - ata_scsi_translate(ap, dev, cmd, done, xlat_func); + rc = ata_scsi_translate(dev, cmd, done, xlat_func); else - ata_scsi_simulate(ap, dev, cmd, done); + ata_scsi_simulate(dev, cmd, done); } else - ata_scsi_translate(ap, dev, cmd, done, atapi_xlat); + rc = ata_scsi_translate(dev, cmd, done, atapi_xlat); + + return rc; } /** @@ -2606,39 +2811,39 @@ static inline void __ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struc * Releases scsi-layer-held lock, and obtains host_set lock. * * RETURNS: - * Zero. + * Return value from __ata_scsi_queuecmd() if @cmd can be queued, + * 0 otherwise. */ - int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)) { struct ata_port *ap; struct ata_device *dev; struct scsi_device *scsidev = cmd->device; struct Scsi_Host *shost = scsidev->host; + int rc = 0; - ap = (struct ata_port *) &shost->hostdata[0]; + ap = ata_shost_to_port(shost); spin_unlock(shost->host_lock); - spin_lock(&ap->host_set->lock); + spin_lock(ap->lock); ata_scsi_dump_cdb(ap, cmd); dev = ata_scsi_find_dev(ap, scsidev); if (likely(dev)) - __ata_scsi_queuecmd(cmd, done, ap, dev); + rc = __ata_scsi_queuecmd(cmd, done, dev); else { cmd->result = (DID_BAD_TARGET << 16); done(cmd); } - spin_unlock(&ap->host_set->lock); + spin_unlock(ap->lock); spin_lock(shost->host_lock); - return 0; + return rc; } /** * ata_scsi_simulate - simulate SCSI command on ATA device - * @ap: port the device is connected to * @dev: the target device * @cmd: SCSI command being sent to device. * @done: SCSI command completion function. @@ -2650,14 +2855,12 @@ int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)) * spin_lock_irqsave(host_set lock) */ -void ata_scsi_simulate(struct ata_port *ap, struct ata_device *dev, - struct scsi_cmnd *cmd, +void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)) { struct ata_scsi_args args; const u8 *scsicmd = cmd->cmnd; - args.ap = ap; args.dev = dev; args.id = dev->id; args.cmd = cmd; @@ -2729,17 +2932,242 @@ void ata_scsi_simulate(struct ata_port *ap, struct ata_device *dev, void ata_scsi_scan_host(struct ata_port *ap) { - struct ata_device *dev; unsigned int i; - if (ap->flags & ATA_FLAG_PORT_DISABLED) + if (ap->flags & ATA_FLAG_DISABLED) return; for (i = 0; i < ATA_MAX_DEVICES; i++) { - dev = &ap->device[i]; + struct ata_device *dev = &ap->device[i]; + struct scsi_device *sdev; + + if (!ata_dev_enabled(dev) || dev->sdev) + continue; + + sdev = __scsi_add_device(ap->host, 0, i, 0, NULL); + if (!IS_ERR(sdev)) { + dev->sdev = sdev; + scsi_device_put(sdev); + } + } +} - if (ata_dev_present(dev)) - scsi_scan_target(&ap->host->shost_gendev, 0, i, 0, 0); +/** + * ata_scsi_offline_dev - offline attached SCSI device + * @dev: ATA device to offline attached SCSI device for + * + * This function is called from ata_eh_hotplug() and responsible + * for taking the SCSI device attached to @dev offline. This + * function is called with host_set lock which protects dev->sdev + * against clearing. + * + * LOCKING: + * spin_lock_irqsave(host_set lock) + * + * RETURNS: + * 1 if attached SCSI device exists, 0 otherwise. + */ +int ata_scsi_offline_dev(struct ata_device *dev) +{ + if (dev->sdev) { + scsi_device_set_state(dev->sdev, SDEV_OFFLINE); + return 1; } + return 0; } +/** + * ata_scsi_remove_dev - remove attached SCSI device + * @dev: ATA device to remove attached SCSI device for + * + * This function is called from ata_eh_scsi_hotplug() and + * responsible for removing the SCSI device attached to @dev. + * + * LOCKING: + * Kernel thread context (may sleep). + */ +static void ata_scsi_remove_dev(struct ata_device *dev) +{ + struct ata_port *ap = dev->ap; + struct scsi_device *sdev; + unsigned long flags; + + /* Alas, we need to grab scan_mutex to ensure SCSI device + * state doesn't change underneath us and thus + * scsi_device_get() always succeeds. The mutex locking can + * be removed if there is __scsi_device_get() interface which + * increments reference counts regardless of device state. + */ + mutex_lock(&ap->host->scan_mutex); + spin_lock_irqsave(ap->lock, flags); + + /* clearing dev->sdev is protected by host_set lock */ + sdev = dev->sdev; + dev->sdev = NULL; + + if (sdev) { + /* If user initiated unplug races with us, sdev can go + * away underneath us after the host_set lock and + * scan_mutex are released. Hold onto it. + */ + if (scsi_device_get(sdev) == 0) { + /* The following ensures the attached sdev is + * offline on return from ata_scsi_offline_dev() + * regardless it wins or loses the race + * against this function. + */ + scsi_device_set_state(sdev, SDEV_OFFLINE); + } else { + WARN_ON(1); + sdev = NULL; + } + } + + spin_unlock_irqrestore(ap->lock, flags); + mutex_unlock(&ap->host->scan_mutex); + + if (sdev) { + ata_dev_printk(dev, KERN_INFO, "detaching (SCSI %s)\n", + sdev->sdev_gendev.bus_id); + + scsi_remove_device(sdev); + scsi_device_put(sdev); + } +} + +/** + * ata_scsi_hotplug - SCSI part of hotplug + * @data: Pointer to ATA port to perform SCSI hotplug on + * + * Perform SCSI part of hotplug. It's executed from a separate + * workqueue after EH completes. This is necessary because SCSI + * hot plugging requires working EH and hot unplugging is + * synchronized with hot plugging with a mutex. + * + * LOCKING: + * Kernel thread context (may sleep). + */ +void ata_scsi_hotplug(void *data) +{ + struct ata_port *ap = data; + int i; + + if (ap->pflags & ATA_PFLAG_UNLOADING) { + DPRINTK("ENTER/EXIT - unloading\n"); + return; + } + + DPRINTK("ENTER\n"); + + /* unplug detached devices */ + for (i = 0; i < ATA_MAX_DEVICES; i++) { + struct ata_device *dev = &ap->device[i]; + unsigned long flags; + + if (!(dev->flags & ATA_DFLAG_DETACHED)) + continue; + + spin_lock_irqsave(ap->lock, flags); + dev->flags &= ~ATA_DFLAG_DETACHED; + spin_unlock_irqrestore(ap->lock, flags); + + ata_scsi_remove_dev(dev); + } + + /* scan for new ones */ + ata_scsi_scan_host(ap); + + /* If we scanned while EH was in progress, scan would have + * failed silently. Requeue if there are enabled but + * unattached devices. + */ + for (i = 0; i < ATA_MAX_DEVICES; i++) { + struct ata_device *dev = &ap->device[i]; + if (ata_dev_enabled(dev) && !dev->sdev) { + queue_delayed_work(ata_aux_wq, &ap->hotplug_task, HZ); + break; + } + } + + DPRINTK("EXIT\n"); +} + +/** + * ata_scsi_user_scan - indication for user-initiated bus scan + * @shost: SCSI host to scan + * @channel: Channel to scan + * @id: ID to scan + * @lun: LUN to scan + * + * This function is called when user explicitly requests bus + * scan. Set probe pending flag and invoke EH. + * + * LOCKING: + * SCSI layer (we don't care) + * + * RETURNS: + * Zero. + */ +static int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel, + unsigned int id, unsigned int lun) +{ + struct ata_port *ap = ata_shost_to_port(shost); + unsigned long flags; + int rc = 0; + + if (!ap->ops->error_handler) + return -EOPNOTSUPP; + + if ((channel != SCAN_WILD_CARD && channel != 0) || + (lun != SCAN_WILD_CARD && lun != 0)) + return -EINVAL; + + spin_lock_irqsave(ap->lock, flags); + + if (id == SCAN_WILD_CARD) { + ap->eh_info.probe_mask |= (1 << ATA_MAX_DEVICES) - 1; + ap->eh_info.action |= ATA_EH_SOFTRESET; + } else { + struct ata_device *dev = ata_find_dev(ap, id); + + if (dev) { + ap->eh_info.probe_mask |= 1 << dev->devno; + ap->eh_info.action |= ATA_EH_SOFTRESET; + ap->eh_info.flags |= ATA_EHI_RESUME_LINK; + } else + rc = -EINVAL; + } + + if (rc == 0) + ata_port_schedule_eh(ap); + + spin_unlock_irqrestore(ap->lock, flags); + + return rc; +} + +/** + * ata_scsi_dev_rescan - initiate scsi_rescan_device() + * @data: Pointer to ATA port to perform scsi_rescan_device() + * + * After ATA pass thru (SAT) commands are executed successfully, + * libata need to propagate the changes to SCSI layer. This + * function must be executed from ata_aux_wq such that sdev + * attach/detach don't race with rescan. + * + * LOCKING: + * Kernel thread context (may sleep). + */ +void ata_scsi_dev_rescan(void *data) +{ + struct ata_port *ap = data; + struct ata_device *dev; + unsigned int i; + + for (i = 0; i < ATA_MAX_DEVICES; i++) { + dev = &ap->device[i]; + + if (ata_dev_enabled(dev) && dev->sdev) + scsi_rescan_device(&(dev->sdev->sdev_gendev)); + } +} diff --git a/drivers/scsi/libata.h b/drivers/scsi/libata.h index bac8cbae0..c325679d9 100644 --- a/drivers/scsi/libata.h +++ b/drivers/scsi/libata.h @@ -29,10 +29,9 @@ #define __LIBATA_H__ #define DRV_NAME "libata" -#define DRV_VERSION "1.20" /* must be exactly four chars */ +#define DRV_VERSION "2.00" /* must be exactly four chars */ struct ata_scsi_args { - struct ata_port *ap; struct ata_device *dev; u16 *id; struct scsi_cmnd *cmd; @@ -40,18 +39,34 @@ struct ata_scsi_args { }; /* libata-core.c */ +extern struct workqueue_struct *ata_aux_wq; extern int atapi_enabled; +extern int atapi_dmadir; extern int libata_fua; -extern struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap, - struct ata_device *dev); +extern struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev); extern int ata_rwcmd_protocol(struct ata_queued_cmd *qc); +extern void ata_dev_disable(struct ata_device *dev); extern void ata_port_flush_task(struct ata_port *ap); +extern unsigned ata_exec_internal(struct ata_device *dev, + struct ata_taskfile *tf, const u8 *cdb, + int dma_dir, void *buf, unsigned int buflen); +extern unsigned int ata_do_simple_cmd(struct ata_device *dev, u8 cmd); +extern int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class, + int post_reset, u16 *id); +extern int ata_dev_configure(struct ata_device *dev, int print_info); +extern int sata_down_spd_limit(struct ata_port *ap); +extern int sata_set_spd_needed(struct ata_port *ap); +extern int ata_down_xfermask_limit(struct ata_device *dev, int force_pio0); +extern int ata_set_mode(struct ata_port *ap, struct ata_device **r_failed_dev); extern void ata_qc_free(struct ata_queued_cmd *qc); extern void ata_qc_issue(struct ata_queued_cmd *qc); +extern void __ata_qc_complete(struct ata_queued_cmd *qc); extern int ata_check_atapi_dma(struct ata_queued_cmd *qc); extern void ata_dev_select(struct ata_port *ap, unsigned int device, unsigned int wait, unsigned int can_sleep); extern void swap_buf_le16(u16 *buf, unsigned int buf_words); +extern int ata_flush_cache(struct ata_device *dev); +extern void ata_dev_init(struct ata_device *dev); extern int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg); extern int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg); @@ -60,6 +75,8 @@ extern int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg); extern struct scsi_transport_template ata_scsi_transport_template; extern void ata_scsi_scan_host(struct ata_port *ap); +extern int ata_scsi_offline_dev(struct ata_device *dev); +extern void ata_scsi_hotplug(void *data); extern unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf, unsigned int buflen); @@ -88,5 +105,13 @@ extern void ata_scsi_set_sense(struct scsi_cmnd *cmd, extern void ata_scsi_rbuf_fill(struct ata_scsi_args *args, unsigned int (*actor) (struct ata_scsi_args *args, u8 *rbuf, unsigned int buflen)); +extern void ata_schedule_scsi_eh(struct Scsi_Host *shost); +extern void ata_scsi_dev_rescan(void *data); + +/* libata-eh.c */ +extern enum scsi_eh_timer_return ata_scsi_timed_out(struct scsi_cmnd *cmd); +extern void ata_scsi_error(struct Scsi_Host *host); +extern void ata_port_wait_eh(struct ata_port *ap); +extern void ata_qc_schedule_eh(struct ata_queued_cmd *qc); #endif /* __LIBATA_H__ */ diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c new file mode 100644 index 000000000..5884cd26d --- /dev/null +++ b/drivers/scsi/libiscsi.c @@ -0,0 +1,1905 @@ +/* + * iSCSI lib functions + * + * Copyright (C) 2006 Red Hat, Inc. All rights reserved. + * Copyright (C) 2004 - 2006 Mike Christie + * Copyright (C) 2004 - 2005 Dmitry Yusupov + * Copyright (C) 2004 - 2005 Alex Aizman + * maintained by open-iscsi@googlegroups.com + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct iscsi_session * +class_to_transport_session(struct iscsi_cls_session *cls_session) +{ + struct Scsi_Host *shost = iscsi_session_to_shost(cls_session); + return iscsi_hostdata(shost->hostdata); +} +EXPORT_SYMBOL_GPL(class_to_transport_session); + +#define INVALID_SN_DELTA 0xffff + +int +iscsi_check_assign_cmdsn(struct iscsi_session *session, struct iscsi_nopin *hdr) +{ + uint32_t max_cmdsn = be32_to_cpu(hdr->max_cmdsn); + uint32_t exp_cmdsn = be32_to_cpu(hdr->exp_cmdsn); + + if (max_cmdsn < exp_cmdsn -1 && + max_cmdsn > exp_cmdsn - INVALID_SN_DELTA) + return ISCSI_ERR_MAX_CMDSN; + if (max_cmdsn > session->max_cmdsn || + max_cmdsn < session->max_cmdsn - INVALID_SN_DELTA) + session->max_cmdsn = max_cmdsn; + if (exp_cmdsn > session->exp_cmdsn || + exp_cmdsn < session->exp_cmdsn - INVALID_SN_DELTA) + session->exp_cmdsn = exp_cmdsn; + + return 0; +} +EXPORT_SYMBOL_GPL(iscsi_check_assign_cmdsn); + +void iscsi_prep_unsolicit_data_pdu(struct iscsi_cmd_task *ctask, + struct iscsi_data *hdr, + int transport_data_cnt) +{ + struct iscsi_conn *conn = ctask->conn; + + memset(hdr, 0, sizeof(struct iscsi_data)); + hdr->ttt = cpu_to_be32(ISCSI_RESERVED_TAG); + hdr->datasn = cpu_to_be32(ctask->unsol_datasn); + ctask->unsol_datasn++; + hdr->opcode = ISCSI_OP_SCSI_DATA_OUT; + memcpy(hdr->lun, ctask->hdr->lun, sizeof(hdr->lun)); + + hdr->itt = ctask->hdr->itt; + hdr->exp_statsn = cpu_to_be32(conn->exp_statsn); + + hdr->offset = cpu_to_be32(ctask->total_length - + transport_data_cnt - + ctask->unsol_count); + + if (ctask->unsol_count > conn->max_xmit_dlength) { + hton24(hdr->dlength, conn->max_xmit_dlength); + ctask->data_count = conn->max_xmit_dlength; + hdr->flags = 0; + } else { + hton24(hdr->dlength, ctask->unsol_count); + ctask->data_count = ctask->unsol_count; + hdr->flags = ISCSI_FLAG_CMD_FINAL; + } +} +EXPORT_SYMBOL_GPL(iscsi_prep_unsolicit_data_pdu); + +/** + * iscsi_prep_scsi_cmd_pdu - prep iscsi scsi cmd pdu + * @ctask: iscsi cmd task + * + * Prep basic iSCSI PDU fields for a scsi cmd pdu. The LLD should set + * fields like dlength or final based on how much data it sends + */ +static void iscsi_prep_scsi_cmd_pdu(struct iscsi_cmd_task *ctask) +{ + struct iscsi_conn *conn = ctask->conn; + struct iscsi_session *session = conn->session; + struct iscsi_cmd *hdr = ctask->hdr; + struct scsi_cmnd *sc = ctask->sc; + + hdr->opcode = ISCSI_OP_SCSI_CMD; + hdr->flags = ISCSI_ATTR_SIMPLE; + int_to_scsilun(sc->device->lun, (struct scsi_lun *)hdr->lun); + hdr->itt = ctask->itt | (conn->id << ISCSI_CID_SHIFT) | + (session->age << ISCSI_AGE_SHIFT); + hdr->data_length = cpu_to_be32(sc->request_bufflen); + hdr->cmdsn = cpu_to_be32(session->cmdsn); + session->cmdsn++; + hdr->exp_statsn = cpu_to_be32(conn->exp_statsn); + memcpy(hdr->cdb, sc->cmnd, sc->cmd_len); + memset(&hdr->cdb[sc->cmd_len], 0, MAX_COMMAND_SIZE - sc->cmd_len); + + if (sc->sc_data_direction == DMA_TO_DEVICE) { + hdr->flags |= ISCSI_FLAG_CMD_WRITE; + /* + * Write counters: + * + * imm_count bytes to be sent right after + * SCSI PDU Header + * + * unsol_count bytes(as Data-Out) to be sent + * without R2T ack right after + * immediate data + * + * r2t_data_count bytes to be sent via R2T ack's + * + * pad_count bytes to be sent as zero-padding + */ + ctask->imm_count = 0; + ctask->unsol_count = 0; + ctask->unsol_datasn = 0; + + if (session->imm_data_en) { + if (ctask->total_length >= session->first_burst) + ctask->imm_count = min(session->first_burst, + conn->max_xmit_dlength); + else + ctask->imm_count = min(ctask->total_length, + conn->max_xmit_dlength); + hton24(ctask->hdr->dlength, ctask->imm_count); + } else + zero_data(ctask->hdr->dlength); + + if (!session->initial_r2t_en) + ctask->unsol_count = min(session->first_burst, + ctask->total_length) - ctask->imm_count; + if (!ctask->unsol_count) + /* No unsolicit Data-Out's */ + ctask->hdr->flags |= ISCSI_FLAG_CMD_FINAL; + } else { + ctask->datasn = 0; + hdr->flags |= ISCSI_FLAG_CMD_FINAL; + zero_data(hdr->dlength); + + if (sc->sc_data_direction == DMA_FROM_DEVICE) + hdr->flags |= ISCSI_FLAG_CMD_READ; + } + + conn->scsicmd_pdus_cnt++; +} +EXPORT_SYMBOL_GPL(iscsi_prep_scsi_cmd_pdu); + +/** + * iscsi_complete_command - return command back to scsi-ml + * @session: iscsi session + * @ctask: iscsi cmd task + * + * Must be called with session lock. + * This function returns the scsi command to scsi-ml and returns + * the cmd task to the pool of available cmd tasks. + */ +static void iscsi_complete_command(struct iscsi_session *session, + struct iscsi_cmd_task *ctask) +{ + struct scsi_cmnd *sc = ctask->sc; + + ctask->state = ISCSI_TASK_COMPLETED; + ctask->sc = NULL; + list_del_init(&ctask->running); + __kfifo_put(session->cmdpool.queue, (void*)&ctask, sizeof(void*)); + sc->scsi_done(sc); +} + +/** + * iscsi_cmd_rsp - SCSI Command Response processing + * @conn: iscsi connection + * @hdr: iscsi header + * @ctask: scsi command task + * @data: cmd data buffer + * @datalen: len of buffer + * + * iscsi_cmd_rsp sets up the scsi_cmnd fields based on the PDU and + * then completes the command and task. + **/ +static int iscsi_scsi_cmd_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr, + struct iscsi_cmd_task *ctask, char *data, + int datalen) +{ + int rc; + struct iscsi_cmd_rsp *rhdr = (struct iscsi_cmd_rsp *)hdr; + struct iscsi_session *session = conn->session; + struct scsi_cmnd *sc = ctask->sc; + + rc = iscsi_check_assign_cmdsn(session, (struct iscsi_nopin*)rhdr); + if (rc) { + sc->result = DID_ERROR << 16; + goto out; + } + + conn->exp_statsn = be32_to_cpu(rhdr->statsn) + 1; + + sc->result = (DID_OK << 16) | rhdr->cmd_status; + + if (rhdr->response != ISCSI_STATUS_CMD_COMPLETED) { + sc->result = DID_ERROR << 16; + goto out; + } + + if (rhdr->cmd_status == SAM_STAT_CHECK_CONDITION) { + int senselen; + + if (datalen < 2) { +invalid_datalen: + printk(KERN_ERR "iscsi: Got CHECK_CONDITION but " + "invalid data buffer size of %d\n", datalen); + sc->result = DID_BAD_TARGET << 16; + goto out; + } + + senselen = (data[0] << 8) | data[1]; + if (datalen < senselen) + goto invalid_datalen; + + memcpy(sc->sense_buffer, data + 2, + min(senselen, SCSI_SENSE_BUFFERSIZE)); + debug_scsi("copied %d bytes of sense\n", + min(senselen, SCSI_SENSE_BUFFERSIZE)); + } + + if (sc->sc_data_direction == DMA_TO_DEVICE) + goto out; + + if (rhdr->flags & ISCSI_FLAG_CMD_UNDERFLOW) { + int res_count = be32_to_cpu(rhdr->residual_count); + + if (res_count > 0 && res_count <= sc->request_bufflen) + sc->resid = res_count; + else + sc->result = (DID_BAD_TARGET << 16) | rhdr->cmd_status; + } else if (rhdr->flags & ISCSI_FLAG_CMD_BIDI_UNDERFLOW) + sc->result = (DID_BAD_TARGET << 16) | rhdr->cmd_status; + else if (rhdr->flags & ISCSI_FLAG_CMD_OVERFLOW) + sc->resid = be32_to_cpu(rhdr->residual_count); + +out: + debug_scsi("done [sc %lx res %d itt 0x%x]\n", + (long)sc, sc->result, ctask->itt); + conn->scsirsp_pdus_cnt++; + + iscsi_complete_command(conn->session, ctask); + return rc; +} + +static void iscsi_tmf_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr) +{ + struct iscsi_tm_rsp *tmf = (struct iscsi_tm_rsp *)hdr; + + conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1; + conn->tmfrsp_pdus_cnt++; + + if (conn->tmabort_state != TMABORT_INITIAL) + return; + + if (tmf->response == ISCSI_TMF_RSP_COMPLETE) + conn->tmabort_state = TMABORT_SUCCESS; + else if (tmf->response == ISCSI_TMF_RSP_NO_TASK) + conn->tmabort_state = TMABORT_NOT_FOUND; + else + conn->tmabort_state = TMABORT_FAILED; + wake_up(&conn->ehwait); +} + +/** + * __iscsi_complete_pdu - complete pdu + * @conn: iscsi conn + * @hdr: iscsi header + * @data: data buffer + * @datalen: len of data buffer + * + * Completes pdu processing by freeing any resources allocated at + * queuecommand or send generic. session lock must be held and verify + * itt must have been called. + */ +int __iscsi_complete_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr, + char *data, int datalen) +{ + struct iscsi_session *session = conn->session; + int opcode = hdr->opcode & ISCSI_OPCODE_MASK, rc = 0; + struct iscsi_cmd_task *ctask; + struct iscsi_mgmt_task *mtask; + uint32_t itt; + + if (hdr->itt != cpu_to_be32(ISCSI_RESERVED_TAG)) + itt = hdr->itt & ISCSI_ITT_MASK; + else + itt = hdr->itt; + + if (itt < session->cmds_max) { + ctask = session->cmds[itt]; + + debug_scsi("cmdrsp [op 0x%x cid %d itt 0x%x len %d]\n", + opcode, conn->id, ctask->itt, datalen); + + switch(opcode) { + case ISCSI_OP_SCSI_CMD_RSP: + BUG_ON((void*)ctask != ctask->sc->SCp.ptr); + rc = iscsi_scsi_cmd_rsp(conn, hdr, ctask, data, + datalen); + break; + case ISCSI_OP_SCSI_DATA_IN: + BUG_ON((void*)ctask != ctask->sc->SCp.ptr); + if (hdr->flags & ISCSI_FLAG_DATA_STATUS) { + conn->scsirsp_pdus_cnt++; + iscsi_complete_command(session, ctask); + } + break; + case ISCSI_OP_R2T: + /* LLD handles this for now */ + break; + default: + rc = ISCSI_ERR_BAD_OPCODE; + break; + } + } else if (itt >= ISCSI_MGMT_ITT_OFFSET && + itt < ISCSI_MGMT_ITT_OFFSET + session->mgmtpool_max) { + mtask = session->mgmt_cmds[itt - ISCSI_MGMT_ITT_OFFSET]; + + debug_scsi("immrsp [op 0x%x cid %d itt 0x%x len %d]\n", + opcode, conn->id, mtask->itt, datalen); + + rc = iscsi_check_assign_cmdsn(session, + (struct iscsi_nopin*)hdr); + if (rc) + goto done; + + switch(opcode) { + case ISCSI_OP_LOGOUT_RSP: + if (datalen) { + rc = ISCSI_ERR_PROTO; + break; + } + conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1; + /* fall through */ + case ISCSI_OP_LOGIN_RSP: + case ISCSI_OP_TEXT_RSP: + /* + * login related PDU's exp_statsn is handled in + * userspace + */ + if (iscsi_recv_pdu(conn->cls_conn, hdr, data, datalen)) + rc = ISCSI_ERR_CONN_FAILED; + list_del(&mtask->running); + if (conn->login_mtask != mtask) + __kfifo_put(session->mgmtpool.queue, + (void*)&mtask, sizeof(void*)); + break; + case ISCSI_OP_SCSI_TMFUNC_RSP: + if (datalen) { + rc = ISCSI_ERR_PROTO; + break; + } + + iscsi_tmf_rsp(conn, hdr); + break; + case ISCSI_OP_NOOP_IN: + if (hdr->ttt != ISCSI_RESERVED_TAG || datalen) { + rc = ISCSI_ERR_PROTO; + break; + } + conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1; + + if (iscsi_recv_pdu(conn->cls_conn, hdr, data, datalen)) + rc = ISCSI_ERR_CONN_FAILED; + list_del(&mtask->running); + if (conn->login_mtask != mtask) + __kfifo_put(session->mgmtpool.queue, + (void*)&mtask, sizeof(void*)); + break; + default: + rc = ISCSI_ERR_BAD_OPCODE; + break; + } + } else if (itt == ISCSI_RESERVED_TAG) { + switch(opcode) { + case ISCSI_OP_NOOP_IN: + if (datalen) { + rc = ISCSI_ERR_PROTO; + break; + } + + rc = iscsi_check_assign_cmdsn(session, + (struct iscsi_nopin*)hdr); + if (rc) + break; + + if (hdr->ttt == ISCSI_RESERVED_TAG) + break; + + if (iscsi_recv_pdu(conn->cls_conn, hdr, NULL, 0)) + rc = ISCSI_ERR_CONN_FAILED; + break; + case ISCSI_OP_REJECT: + /* we need sth like iscsi_reject_rsp()*/ + case ISCSI_OP_ASYNC_EVENT: + conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1; + /* we need sth like iscsi_async_event_rsp() */ + rc = ISCSI_ERR_BAD_OPCODE; + break; + default: + rc = ISCSI_ERR_BAD_OPCODE; + break; + } + } else + rc = ISCSI_ERR_BAD_ITT; + +done: + return rc; +} +EXPORT_SYMBOL_GPL(__iscsi_complete_pdu); + +int iscsi_complete_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr, + char *data, int datalen) +{ + int rc; + + spin_lock(&conn->session->lock); + rc = __iscsi_complete_pdu(conn, hdr, data, datalen); + spin_unlock(&conn->session->lock); + return rc; +} +EXPORT_SYMBOL_GPL(iscsi_complete_pdu); + +/* verify itt (itt encoding: age+cid+itt) */ +int iscsi_verify_itt(struct iscsi_conn *conn, struct iscsi_hdr *hdr, + uint32_t *ret_itt) +{ + struct iscsi_session *session = conn->session; + struct iscsi_cmd_task *ctask; + uint32_t itt; + + if (hdr->itt != cpu_to_be32(ISCSI_RESERVED_TAG)) { + if ((hdr->itt & ISCSI_AGE_MASK) != + (session->age << ISCSI_AGE_SHIFT)) { + printk(KERN_ERR "iscsi: received itt %x expected " + "session age (%x)\n", hdr->itt, + session->age & ISCSI_AGE_MASK); + return ISCSI_ERR_BAD_ITT; + } + + if ((hdr->itt & ISCSI_CID_MASK) != + (conn->id << ISCSI_CID_SHIFT)) { + printk(KERN_ERR "iscsi: received itt %x, expected " + "CID (%x)\n", hdr->itt, conn->id); + return ISCSI_ERR_BAD_ITT; + } + itt = hdr->itt & ISCSI_ITT_MASK; + } else + itt = hdr->itt; + + if (itt < session->cmds_max) { + ctask = session->cmds[itt]; + + if (!ctask->sc) { + printk(KERN_INFO "iscsi: dropping ctask with " + "itt 0x%x\n", ctask->itt); + /* force drop */ + return ISCSI_ERR_NO_SCSI_CMD; + } + + if (ctask->sc->SCp.phase != session->age) { + printk(KERN_ERR "iscsi: ctask's session age %d, " + "expected %d\n", ctask->sc->SCp.phase, + session->age); + return ISCSI_ERR_SESSION_FAILED; + } + } + + *ret_itt = itt; + return 0; +} +EXPORT_SYMBOL_GPL(iscsi_verify_itt); + +void iscsi_conn_failure(struct iscsi_conn *conn, enum iscsi_err err) +{ + struct iscsi_session *session = conn->session; + unsigned long flags; + + spin_lock_irqsave(&session->lock, flags); + if (session->state == ISCSI_STATE_FAILED) { + spin_unlock_irqrestore(&session->lock, flags); + return; + } + + if (conn->stop_stage == 0) + session->state = ISCSI_STATE_FAILED; + spin_unlock_irqrestore(&session->lock, flags); + set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); + set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_rx); + iscsi_conn_error(conn->cls_conn, err); +} +EXPORT_SYMBOL_GPL(iscsi_conn_failure); + +/** + * iscsi_data_xmit - xmit any command into the scheduled connection + * @conn: iscsi connection + * + * Notes: + * The function can return -EAGAIN in which case the caller must + * re-schedule it again later or recover. '0' return code means + * successful xmit. + **/ +static int iscsi_data_xmit(struct iscsi_conn *conn) +{ + struct iscsi_transport *tt; + int rc = 0; + + if (unlikely(conn->suspend_tx)) { + debug_scsi("conn %d Tx suspended!\n", conn->id); + return -ENODATA; + } + tt = conn->session->tt; + + /* + * Transmit in the following order: + * + * 1) un-finished xmit (ctask or mtask) + * 2) immediate control PDUs + * 3) write data + * 4) SCSI commands + * 5) non-immediate control PDUs + * + * No need to lock around __kfifo_get as long as + * there's one producer and one consumer. + */ + + BUG_ON(conn->ctask && conn->mtask); + + if (conn->ctask) { + rc = tt->xmit_cmd_task(conn, conn->ctask); + if (rc) + goto again; + /* done with this in-progress ctask */ + conn->ctask = NULL; + } + if (conn->mtask) { + rc = tt->xmit_mgmt_task(conn, conn->mtask); + if (rc) + goto again; + /* done with this in-progress mtask */ + conn->mtask = NULL; + } + + /* process immediate first */ + if (unlikely(__kfifo_len(conn->immqueue))) { + while (__kfifo_get(conn->immqueue, (void*)&conn->mtask, + sizeof(void*))) { + spin_lock_bh(&conn->session->lock); + list_add_tail(&conn->mtask->running, + &conn->mgmt_run_list); + spin_unlock_bh(&conn->session->lock); + rc = tt->xmit_mgmt_task(conn, conn->mtask); + if (rc) + goto again; + } + /* done with this mtask */ + conn->mtask = NULL; + } + + /* process command queue */ + spin_lock_bh(&conn->session->lock); + while (!list_empty(&conn->xmitqueue)) { + /* + * iscsi tcp may readd the task to the xmitqueue to send + * write data + */ + conn->ctask = list_entry(conn->xmitqueue.next, + struct iscsi_cmd_task, running); + conn->ctask->state = ISCSI_TASK_RUNNING; + list_move_tail(conn->xmitqueue.next, &conn->run_list); + spin_unlock_bh(&conn->session->lock); + + rc = tt->xmit_cmd_task(conn, conn->ctask); + if (rc) + goto again; + spin_lock_bh(&conn->session->lock); + } + spin_unlock_bh(&conn->session->lock); + /* done with this ctask */ + conn->ctask = NULL; + + /* process the rest control plane PDUs, if any */ + if (unlikely(__kfifo_len(conn->mgmtqueue))) { + while (__kfifo_get(conn->mgmtqueue, (void*)&conn->mtask, + sizeof(void*))) { + spin_lock_bh(&conn->session->lock); + list_add_tail(&conn->mtask->running, + &conn->mgmt_run_list); + spin_unlock_bh(&conn->session->lock); + rc = tt->xmit_mgmt_task(conn, conn->mtask); + if (rc) + goto again; + } + /* done with this mtask */ + conn->mtask = NULL; + } + + return -ENODATA; + +again: + if (unlikely(conn->suspend_tx)) + return -ENODATA; + + return rc; +} + +static void iscsi_xmitworker(void *data) +{ + struct iscsi_conn *conn = data; + int rc; + /* + * serialize Xmit worker on a per-connection basis. + */ + mutex_lock(&conn->xmitmutex); + do { + rc = iscsi_data_xmit(conn); + } while (rc >= 0 || rc == -EAGAIN); + mutex_unlock(&conn->xmitmutex); +} + +enum { + FAILURE_BAD_HOST = 1, + FAILURE_SESSION_FAILED, + FAILURE_SESSION_FREED, + FAILURE_WINDOW_CLOSED, + FAILURE_SESSION_TERMINATE, + FAILURE_SESSION_IN_RECOVERY, + FAILURE_SESSION_RECOVERY_TIMEOUT, +}; + +int iscsi_queuecommand(struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *)) +{ + struct Scsi_Host *host; + int reason = 0; + struct iscsi_session *session; + struct iscsi_conn *conn; + struct iscsi_cmd_task *ctask = NULL; + + sc->scsi_done = done; + sc->result = 0; + + host = sc->device->host; + session = iscsi_hostdata(host->hostdata); + + spin_lock(&session->lock); + + /* + * ISCSI_STATE_FAILED is a temp. state. The recovery + * code will decide what is best to do with command queued + * during this time + */ + if (session->state != ISCSI_STATE_LOGGED_IN && + session->state != ISCSI_STATE_FAILED) { + /* + * to handle the race between when we set the recovery state + * and block the session we requeue here (commands could + * be entering our queuecommand while a block is starting + * up because the block code is not locked) + */ + if (session->state == ISCSI_STATE_IN_RECOVERY) { + reason = FAILURE_SESSION_IN_RECOVERY; + goto reject; + } + + if (session->state == ISCSI_STATE_RECOVERY_FAILED) + reason = FAILURE_SESSION_RECOVERY_TIMEOUT; + else if (session->state == ISCSI_STATE_TERMINATE) + reason = FAILURE_SESSION_TERMINATE; + else + reason = FAILURE_SESSION_FREED; + goto fault; + } + + /* + * Check for iSCSI window and take care of CmdSN wrap-around + */ + if ((int)(session->max_cmdsn - session->cmdsn) < 0) { + reason = FAILURE_WINDOW_CLOSED; + goto reject; + } + + conn = session->leadconn; + + __kfifo_get(session->cmdpool.queue, (void*)&ctask, sizeof(void*)); + sc->SCp.phase = session->age; + sc->SCp.ptr = (char *)ctask; + + ctask->state = ISCSI_TASK_PENDING; + ctask->mtask = NULL; + ctask->conn = conn; + ctask->sc = sc; + INIT_LIST_HEAD(&ctask->running); + ctask->total_length = sc->request_bufflen; + iscsi_prep_scsi_cmd_pdu(ctask); + + session->tt->init_cmd_task(ctask); + + list_add_tail(&ctask->running, &conn->xmitqueue); + debug_scsi( + "ctask enq [%s cid %d sc %lx itt 0x%x len %d cmdsn %d win %d]\n", + sc->sc_data_direction == DMA_TO_DEVICE ? "write" : "read", + conn->id, (long)sc, ctask->itt, sc->request_bufflen, + session->cmdsn, session->max_cmdsn - session->exp_cmdsn + 1); + spin_unlock(&session->lock); + + scsi_queue_work(host, &conn->xmitwork); + return 0; + +reject: + spin_unlock(&session->lock); + debug_scsi("cmd 0x%x rejected (%d)\n", sc->cmnd[0], reason); + return SCSI_MLQUEUE_HOST_BUSY; + +fault: + spin_unlock(&session->lock); + printk(KERN_ERR "iscsi: cmd 0x%x is not queued (%d)\n", + sc->cmnd[0], reason); + sc->result = (DID_NO_CONNECT << 16); + sc->resid = sc->request_bufflen; + sc->scsi_done(sc); + return 0; +} +EXPORT_SYMBOL_GPL(iscsi_queuecommand); + +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; +} +EXPORT_SYMBOL_GPL(iscsi_change_queue_depth); + +static int +iscsi_conn_send_generic(struct iscsi_conn *conn, struct iscsi_hdr *hdr, + char *data, uint32_t data_size) +{ + struct iscsi_session *session = conn->session; + struct iscsi_nopout *nop = (struct iscsi_nopout *)hdr; + struct iscsi_mgmt_task *mtask; + + spin_lock_bh(&session->lock); + if (session->state == ISCSI_STATE_TERMINATE) { + spin_unlock_bh(&session->lock); + return -EPERM; + } + if (hdr->opcode == (ISCSI_OP_LOGIN | ISCSI_OP_IMMEDIATE) || + hdr->opcode == (ISCSI_OP_TEXT | ISCSI_OP_IMMEDIATE)) + /* + * Login and Text are sent serially, in + * request-followed-by-response sequence. + * Same mtask can be used. Same ITT must be used. + * Note that login_mtask is preallocated at conn_create(). + */ + mtask = conn->login_mtask; + else { + BUG_ON(conn->c_stage == ISCSI_CONN_INITIAL_STAGE); + BUG_ON(conn->c_stage == ISCSI_CONN_STOPPED); + + nop->exp_statsn = cpu_to_be32(conn->exp_statsn); + if (!__kfifo_get(session->mgmtpool.queue, + (void*)&mtask, sizeof(void*))) { + spin_unlock_bh(&session->lock); + return -ENOSPC; + } + } + + /* + * pre-format CmdSN for outgoing PDU. + */ + if (hdr->itt != cpu_to_be32(ISCSI_RESERVED_TAG)) { + hdr->itt = mtask->itt | (conn->id << ISCSI_CID_SHIFT) | + (session->age << ISCSI_AGE_SHIFT); + nop->cmdsn = cpu_to_be32(session->cmdsn); + if (conn->c_stage == ISCSI_CONN_STARTED && + !(hdr->opcode & ISCSI_OP_IMMEDIATE)) + session->cmdsn++; + } else + /* do not advance CmdSN */ + nop->cmdsn = cpu_to_be32(session->cmdsn); + + if (data_size) { + memcpy(mtask->data, data, data_size); + mtask->data_count = data_size; + } else + mtask->data_count = 0; + + INIT_LIST_HEAD(&mtask->running); + memcpy(mtask->hdr, hdr, sizeof(struct iscsi_hdr)); + if (session->tt->init_mgmt_task) + session->tt->init_mgmt_task(conn, mtask, data, data_size); + spin_unlock_bh(&session->lock); + + debug_scsi("mgmtpdu [op 0x%x hdr->itt 0x%x datalen %d]\n", + hdr->opcode, hdr->itt, data_size); + + /* + * since send_pdu() could be called at least from two contexts, + * we need to serialize __kfifo_put, so we don't have to take + * additional lock on fast data-path + */ + if (hdr->opcode & ISCSI_OP_IMMEDIATE) + __kfifo_put(conn->immqueue, (void*)&mtask, sizeof(void*)); + else + __kfifo_put(conn->mgmtqueue, (void*)&mtask, sizeof(void*)); + + scsi_queue_work(session->host, &conn->xmitwork); + return 0; +} + +int iscsi_conn_send_pdu(struct iscsi_cls_conn *cls_conn, struct iscsi_hdr *hdr, + char *data, uint32_t data_size) +{ + struct iscsi_conn *conn = cls_conn->dd_data; + int rc; + + mutex_lock(&conn->xmitmutex); + rc = iscsi_conn_send_generic(conn, hdr, data, data_size); + mutex_unlock(&conn->xmitmutex); + + return rc; +} +EXPORT_SYMBOL_GPL(iscsi_conn_send_pdu); + +void iscsi_session_recovery_timedout(struct iscsi_cls_session *cls_session) +{ + struct iscsi_session *session = class_to_transport_session(cls_session); + struct iscsi_conn *conn = session->leadconn; + + spin_lock_bh(&session->lock); + if (session->state != ISCSI_STATE_LOGGED_IN) { + session->state = ISCSI_STATE_RECOVERY_FAILED; + if (conn) + wake_up(&conn->ehwait); + } + spin_unlock_bh(&session->lock); +} +EXPORT_SYMBOL_GPL(iscsi_session_recovery_timedout); + +int iscsi_eh_host_reset(struct scsi_cmnd *sc) +{ + struct Scsi_Host *host = sc->device->host; + struct iscsi_session *session = iscsi_hostdata(host->hostdata); + struct iscsi_conn *conn = session->leadconn; + int fail_session = 0; + + spin_lock_bh(&session->lock); + if (session->state == ISCSI_STATE_TERMINATE) { +failed: + debug_scsi("failing host reset: session terminated " + "[CID %d age %d]", conn->id, session->age); + spin_unlock_bh(&session->lock); + return FAILED; + } + + if (sc->SCp.phase == session->age) { + debug_scsi("failing connection CID %d due to SCSI host reset", + conn->id); + fail_session = 1; + } + spin_unlock_bh(&session->lock); + + /* + * we drop the lock here but the leadconn cannot be destoyed while + * we are in the scsi eh + */ + if (fail_session) + iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); + + debug_scsi("iscsi_eh_host_reset wait for relogin\n"); + wait_event_interruptible(conn->ehwait, + session->state == ISCSI_STATE_TERMINATE || + session->state == ISCSI_STATE_LOGGED_IN || + session->state == ISCSI_STATE_RECOVERY_FAILED); + if (signal_pending(current)) + flush_signals(current); + + spin_lock_bh(&session->lock); + if (session->state == ISCSI_STATE_LOGGED_IN) + printk(KERN_INFO "iscsi: host reset succeeded\n"); + else + goto failed; + spin_unlock_bh(&session->lock); + + return SUCCESS; +} +EXPORT_SYMBOL_GPL(iscsi_eh_host_reset); + +static void iscsi_tmabort_timedout(unsigned long data) +{ + struct iscsi_cmd_task *ctask = (struct iscsi_cmd_task *)data; + struct iscsi_conn *conn = ctask->conn; + struct iscsi_session *session = conn->session; + + spin_lock(&session->lock); + if (conn->tmabort_state == TMABORT_INITIAL) { + conn->tmabort_state = TMABORT_TIMEDOUT; + debug_scsi("tmabort timedout [sc %p itt 0x%x]\n", + ctask->sc, ctask->itt); + /* unblock eh_abort() */ + wake_up(&conn->ehwait); + } + spin_unlock(&session->lock); +} + +/* must be called with the mutex lock */ +static int iscsi_exec_abort_task(struct scsi_cmnd *sc, + struct iscsi_cmd_task *ctask) +{ + struct iscsi_conn *conn = ctask->conn; + struct iscsi_session *session = conn->session; + struct iscsi_tm *hdr = &conn->tmhdr; + int rc; + + /* + * ctask timed out but session is OK requests must be serialized. + */ + memset(hdr, 0, sizeof(struct iscsi_tm)); + hdr->opcode = ISCSI_OP_SCSI_TMFUNC | ISCSI_OP_IMMEDIATE; + hdr->flags = ISCSI_TM_FUNC_ABORT_TASK; + hdr->flags |= ISCSI_FLAG_CMD_FINAL; + memcpy(hdr->lun, ctask->hdr->lun, sizeof(hdr->lun)); + hdr->rtt = ctask->hdr->itt; + hdr->refcmdsn = ctask->hdr->cmdsn; + + rc = iscsi_conn_send_generic(conn, (struct iscsi_hdr *)hdr, + NULL, 0); + if (rc) { + iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); + debug_scsi("abort sent failure [itt 0x%x] %d", ctask->itt, rc); + return rc; + } + + debug_scsi("abort sent [itt 0x%x]\n", ctask->itt); + + spin_lock_bh(&session->lock); + ctask->mtask = (struct iscsi_mgmt_task *) + session->mgmt_cmds[(hdr->itt & ISCSI_ITT_MASK) - + ISCSI_MGMT_ITT_OFFSET]; + + if (conn->tmabort_state == TMABORT_INITIAL) { + conn->tmfcmd_pdus_cnt++; + conn->tmabort_timer.expires = 10*HZ + jiffies; + conn->tmabort_timer.function = iscsi_tmabort_timedout; + conn->tmabort_timer.data = (unsigned long)ctask; + add_timer(&conn->tmabort_timer); + debug_scsi("abort set timeout [itt 0x%x]", ctask->itt); + } + spin_unlock_bh(&session->lock); + mutex_unlock(&conn->xmitmutex); + + /* + * block eh thread until: + * + * 1) abort response + * 2) abort timeout + * 3) session is terminated or restarted or userspace has + * given up on recovery + */ + wait_event_interruptible(conn->ehwait, + sc->SCp.phase != session->age || + session->state != ISCSI_STATE_LOGGED_IN || + conn->tmabort_state != TMABORT_INITIAL); + if (signal_pending(current)) + flush_signals(current); + del_timer_sync(&conn->tmabort_timer); + + mutex_lock(&conn->xmitmutex); + return 0; +} + +/* + * xmit mutex and session lock must be held + */ +static struct iscsi_mgmt_task * +iscsi_remove_mgmt_task(struct kfifo *fifo, uint32_t itt) +{ + int i, nr_tasks = __kfifo_len(fifo) / sizeof(void*); + struct iscsi_mgmt_task *task; + + debug_scsi("searching %d tasks\n", nr_tasks); + + for (i = 0; i < nr_tasks; i++) { + __kfifo_get(fifo, (void*)&task, sizeof(void*)); + debug_scsi("check task %u\n", task->itt); + + if (task->itt == itt) { + debug_scsi("matched task\n"); + return task; + } + + __kfifo_put(fifo, (void*)&task, sizeof(void*)); + } + return NULL; +} + +static int iscsi_ctask_mtask_cleanup(struct iscsi_cmd_task *ctask) +{ + struct iscsi_conn *conn = ctask->conn; + struct iscsi_session *session = conn->session; + + if (!ctask->mtask) + return -EINVAL; + + if (!iscsi_remove_mgmt_task(conn->immqueue, ctask->mtask->itt)) + list_del(&ctask->mtask->running); + __kfifo_put(session->mgmtpool.queue, (void*)&ctask->mtask, + sizeof(void*)); + ctask->mtask = NULL; + return 0; +} + +/* + * session lock and xmitmutex must be held + */ +static void fail_command(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask, + int err) +{ + struct scsi_cmnd *sc; + + sc = ctask->sc; + if (!sc) + return; + + conn->session->tt->cleanup_cmd_task(conn, ctask); + iscsi_ctask_mtask_cleanup(ctask); + + sc->result = err; + sc->resid = sc->request_bufflen; + iscsi_complete_command(conn->session, ctask); +} + +int iscsi_eh_abort(struct scsi_cmnd *sc) +{ + struct iscsi_cmd_task *ctask = (struct iscsi_cmd_task *)sc->SCp.ptr; + struct iscsi_conn *conn = ctask->conn; + struct iscsi_session *session = conn->session; + int rc; + + conn->eh_abort_cnt++; + debug_scsi("aborting [sc %p itt 0x%x]\n", sc, ctask->itt); + + mutex_lock(&conn->xmitmutex); + spin_lock_bh(&session->lock); + + /* + * If we are not logged in or we have started a new session + * then let the host reset code handle this + */ + if (session->state != ISCSI_STATE_LOGGED_IN || + sc->SCp.phase != session->age) + goto failed; + + /* ctask completed before time out */ + if (!ctask->sc) { + spin_unlock_bh(&session->lock); + debug_scsi("sc completed while abort in progress\n"); + goto success_rel_mutex; + } + + /* what should we do here ? */ + if (conn->ctask == ctask) { + printk(KERN_INFO "iscsi: sc %p itt 0x%x partially sent. " + "Failing abort\n", sc, ctask->itt); + goto failed; + } + + if (ctask->state == ISCSI_TASK_PENDING) + goto success_cleanup; + + conn->tmabort_state = TMABORT_INITIAL; + + spin_unlock_bh(&session->lock); + rc = iscsi_exec_abort_task(sc, ctask); + spin_lock_bh(&session->lock); + + if (rc || sc->SCp.phase != session->age || + session->state != ISCSI_STATE_LOGGED_IN) + goto failed; + iscsi_ctask_mtask_cleanup(ctask); + + switch (conn->tmabort_state) { + case TMABORT_SUCCESS: + goto success_cleanup; + case TMABORT_NOT_FOUND: + if (!ctask->sc) { + /* ctask completed before tmf abort response */ + spin_unlock_bh(&session->lock); + debug_scsi("sc completed while abort in progress\n"); + goto success_rel_mutex; + } + /* fall through */ + default: + /* timedout or failed */ + spin_unlock_bh(&session->lock); + iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); + spin_lock_bh(&session->lock); + goto failed; + } + +success_cleanup: + debug_scsi("abort success [sc %lx itt 0x%x]\n", (long)sc, ctask->itt); + spin_unlock_bh(&session->lock); + + /* + * clean up task if aborted. we have the xmitmutex so grab + * the recv lock as a writer + */ + write_lock_bh(conn->recv_lock); + spin_lock(&session->lock); + fail_command(conn, ctask, DID_ABORT << 16); + spin_unlock(&session->lock); + write_unlock_bh(conn->recv_lock); + +success_rel_mutex: + mutex_unlock(&conn->xmitmutex); + return SUCCESS; + +failed: + spin_unlock_bh(&session->lock); + mutex_unlock(&conn->xmitmutex); + + debug_scsi("abort failed [sc %lx itt 0x%x]\n", (long)sc, ctask->itt); + return FAILED; +} +EXPORT_SYMBOL_GPL(iscsi_eh_abort); + +int +iscsi_pool_init(struct iscsi_queue *q, int max, void ***items, int item_size) +{ + int i; + + *items = kmalloc(max * sizeof(void*), GFP_KERNEL); + if (*items == NULL) + return -ENOMEM; + + q->max = max; + q->pool = kmalloc(max * sizeof(void*), GFP_KERNEL); + if (q->pool == NULL) { + kfree(*items); + return -ENOMEM; + } + + q->queue = kfifo_init((void*)q->pool, max * sizeof(void*), + GFP_KERNEL, NULL); + if (q->queue == ERR_PTR(-ENOMEM)) { + kfree(q->pool); + kfree(*items); + return -ENOMEM; + } + + for (i = 0; i < max; i++) { + q->pool[i] = kmalloc(item_size, GFP_KERNEL); + if (q->pool[i] == NULL) { + int j; + + for (j = 0; j < i; j++) + kfree(q->pool[j]); + + kfifo_free(q->queue); + kfree(q->pool); + kfree(*items); + return -ENOMEM; + } + memset(q->pool[i], 0, item_size); + (*items)[i] = q->pool[i]; + __kfifo_put(q->queue, (void*)&q->pool[i], sizeof(void*)); + } + return 0; +} +EXPORT_SYMBOL_GPL(iscsi_pool_init); + +void iscsi_pool_free(struct iscsi_queue *q, void **items) +{ + int i; + + for (i = 0; i < q->max; i++) + kfree(items[i]); + kfree(q->pool); + kfree(items); +} +EXPORT_SYMBOL_GPL(iscsi_pool_free); + +/* + * iSCSI Session's hostdata organization: + * + * *------------------* <== hostdata_session(host->hostdata) + * | ptr to class sess| + * |------------------| <== iscsi_hostdata(host->hostdata) + * | iscsi_session | + * *------------------* + */ + +#define hostdata_privsize(_sz) (sizeof(unsigned long) + _sz + \ + _sz % sizeof(unsigned long)) + +#define hostdata_session(_hostdata) (iscsi_ptr(*(unsigned long *)_hostdata)) + +/** + * iscsi_session_setup - create iscsi cls session and host and session + * @scsit: scsi transport template + * @iscsit: iscsi transport template + * @initial_cmdsn: initial CmdSN + * @hostno: host no allocated + * + * This can be used by software iscsi_transports that allocate + * a session per scsi host. + **/ +struct iscsi_cls_session * +iscsi_session_setup(struct iscsi_transport *iscsit, + struct scsi_transport_template *scsit, + int cmd_task_size, int mgmt_task_size, + uint32_t initial_cmdsn, uint32_t *hostno) +{ + struct Scsi_Host *shost; + struct iscsi_session *session; + struct iscsi_cls_session *cls_session; + int cmd_i; + + shost = scsi_host_alloc(iscsit->host_template, + hostdata_privsize(sizeof(*session))); + if (!shost) + return NULL; + + shost->max_id = 1; + shost->max_channel = 0; + shost->max_lun = iscsit->max_lun; + shost->max_cmd_len = iscsit->max_cmd_len; + shost->transportt = scsit; + shost->transportt->create_work_queue = 1; + *hostno = shost->host_no; + + session = iscsi_hostdata(shost->hostdata); + memset(session, 0, sizeof(struct iscsi_session)); + session->host = shost; + session->state = ISCSI_STATE_FREE; + session->mgmtpool_max = ISCSI_MGMT_CMDS_MAX; + session->cmds_max = ISCSI_XMIT_CMDS_MAX; + session->cmdsn = initial_cmdsn; + session->exp_cmdsn = initial_cmdsn + 1; + session->max_cmdsn = initial_cmdsn + 1; + session->max_r2t = 1; + session->tt = iscsit; + + /* initialize SCSI PDU commands pool */ + if (iscsi_pool_init(&session->cmdpool, session->cmds_max, + (void***)&session->cmds, + cmd_task_size + sizeof(struct iscsi_cmd_task))) + goto cmdpool_alloc_fail; + + /* pre-format cmds pool with ITT */ + for (cmd_i = 0; cmd_i < session->cmds_max; cmd_i++) { + struct iscsi_cmd_task *ctask = session->cmds[cmd_i]; + + if (cmd_task_size) + ctask->dd_data = &ctask[1]; + ctask->itt = cmd_i; + INIT_LIST_HEAD(&ctask->running); + } + + spin_lock_init(&session->lock); + INIT_LIST_HEAD(&session->connections); + + /* initialize immediate command pool */ + if (iscsi_pool_init(&session->mgmtpool, session->mgmtpool_max, + (void***)&session->mgmt_cmds, + mgmt_task_size + sizeof(struct iscsi_mgmt_task))) + goto mgmtpool_alloc_fail; + + + /* pre-format immediate cmds pool with ITT */ + for (cmd_i = 0; cmd_i < session->mgmtpool_max; cmd_i++) { + struct iscsi_mgmt_task *mtask = session->mgmt_cmds[cmd_i]; + + if (mgmt_task_size) + mtask->dd_data = &mtask[1]; + mtask->itt = ISCSI_MGMT_ITT_OFFSET + cmd_i; + INIT_LIST_HEAD(&mtask->running); + } + + if (scsi_add_host(shost, NULL)) + goto add_host_fail; + + if (!try_module_get(iscsit->owner)) + goto cls_session_fail; + + cls_session = iscsi_create_session(shost, iscsit, 0); + if (!cls_session) + goto module_put; + *(unsigned long*)shost->hostdata = (unsigned long)cls_session; + + return cls_session; + +module_put: + module_put(iscsit->owner); +cls_session_fail: + scsi_remove_host(shost); +add_host_fail: + iscsi_pool_free(&session->mgmtpool, (void**)session->mgmt_cmds); +mgmtpool_alloc_fail: + iscsi_pool_free(&session->cmdpool, (void**)session->cmds); +cmdpool_alloc_fail: + scsi_host_put(shost); + return NULL; +} +EXPORT_SYMBOL_GPL(iscsi_session_setup); + +/** + * iscsi_session_teardown - destroy session, host, and cls_session + * shost: scsi host + * + * This can be used by software iscsi_transports that allocate + * a session per scsi host. + **/ +void iscsi_session_teardown(struct iscsi_cls_session *cls_session) +{ + struct Scsi_Host *shost = iscsi_session_to_shost(cls_session); + struct iscsi_session *session = iscsi_hostdata(shost->hostdata); + struct module *owner = cls_session->transport->owner; + + scsi_remove_host(shost); + + iscsi_pool_free(&session->mgmtpool, (void**)session->mgmt_cmds); + iscsi_pool_free(&session->cmdpool, (void**)session->cmds); + + kfree(session->targetname); + + iscsi_destroy_session(cls_session); + scsi_host_put(shost); + module_put(owner); +} +EXPORT_SYMBOL_GPL(iscsi_session_teardown); + +/** + * iscsi_conn_setup - create iscsi_cls_conn and iscsi_conn + * @cls_session: iscsi_cls_session + * @conn_idx: cid + **/ +struct iscsi_cls_conn * +iscsi_conn_setup(struct iscsi_cls_session *cls_session, uint32_t conn_idx) +{ + struct iscsi_session *session = class_to_transport_session(cls_session); + struct iscsi_conn *conn; + struct iscsi_cls_conn *cls_conn; + char *data; + + cls_conn = iscsi_create_conn(cls_session, conn_idx); + if (!cls_conn) + return NULL; + conn = cls_conn->dd_data; + memset(conn, 0, sizeof(*conn)); + + conn->session = session; + conn->cls_conn = cls_conn; + conn->c_stage = ISCSI_CONN_INITIAL_STAGE; + conn->id = conn_idx; + conn->exp_statsn = 0; + conn->tmabort_state = TMABORT_INITIAL; + INIT_LIST_HEAD(&conn->run_list); + INIT_LIST_HEAD(&conn->mgmt_run_list); + INIT_LIST_HEAD(&conn->xmitqueue); + + /* initialize general immediate & non-immediate PDU commands queue */ + conn->immqueue = kfifo_alloc(session->mgmtpool_max * sizeof(void*), + GFP_KERNEL, NULL); + if (conn->immqueue == ERR_PTR(-ENOMEM)) + goto immqueue_alloc_fail; + + conn->mgmtqueue = kfifo_alloc(session->mgmtpool_max * sizeof(void*), + GFP_KERNEL, NULL); + if (conn->mgmtqueue == ERR_PTR(-ENOMEM)) + goto mgmtqueue_alloc_fail; + + INIT_WORK(&conn->xmitwork, iscsi_xmitworker, conn); + + /* allocate login_mtask used for the login/text sequences */ + spin_lock_bh(&session->lock); + if (!__kfifo_get(session->mgmtpool.queue, + (void*)&conn->login_mtask, + sizeof(void*))) { + spin_unlock_bh(&session->lock); + goto login_mtask_alloc_fail; + } + spin_unlock_bh(&session->lock); + + data = kmalloc(DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH, GFP_KERNEL); + if (!data) + goto login_mtask_data_alloc_fail; + conn->login_mtask->data = conn->data = data; + + init_timer(&conn->tmabort_timer); + mutex_init(&conn->xmitmutex); + init_waitqueue_head(&conn->ehwait); + + return cls_conn; + +login_mtask_data_alloc_fail: + __kfifo_put(session->mgmtpool.queue, (void*)&conn->login_mtask, + sizeof(void*)); +login_mtask_alloc_fail: + kfifo_free(conn->mgmtqueue); +mgmtqueue_alloc_fail: + kfifo_free(conn->immqueue); +immqueue_alloc_fail: + iscsi_destroy_conn(cls_conn); + return NULL; +} +EXPORT_SYMBOL_GPL(iscsi_conn_setup); + +/** + * iscsi_conn_teardown - teardown iscsi connection + * cls_conn: iscsi class connection + * + * TODO: we may need to make this into a two step process + * like scsi-mls remove + put host + */ +void iscsi_conn_teardown(struct iscsi_cls_conn *cls_conn) +{ + struct iscsi_conn *conn = cls_conn->dd_data; + struct iscsi_session *session = conn->session; + unsigned long flags; + + set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); + mutex_lock(&conn->xmitmutex); + + spin_lock_bh(&session->lock); + conn->c_stage = ISCSI_CONN_CLEANUP_WAIT; + if (session->leadconn == conn) { + /* + * leading connection? then give up on recovery. + */ + session->state = ISCSI_STATE_TERMINATE; + wake_up(&conn->ehwait); + } + spin_unlock_bh(&session->lock); + + mutex_unlock(&conn->xmitmutex); + + /* + * Block until all in-progress commands for this connection + * time out or fail. + */ + for (;;) { + spin_lock_irqsave(session->host->host_lock, flags); + if (!session->host->host_busy) { /* OK for ERL == 0 */ + spin_unlock_irqrestore(session->host->host_lock, flags); + break; + } + spin_unlock_irqrestore(session->host->host_lock, flags); + msleep_interruptible(500); + printk(KERN_INFO "iscsi: scsi conn_destroy(): host_busy %d " + "host_failed %d\n", session->host->host_busy, + session->host->host_failed); + /* + * force eh_abort() to unblock + */ + wake_up(&conn->ehwait); + } + + spin_lock_bh(&session->lock); + kfree(conn->data); + kfree(conn->persistent_address); + __kfifo_put(session->mgmtpool.queue, (void*)&conn->login_mtask, + sizeof(void*)); + list_del(&conn->item); + if (list_empty(&session->connections)) + session->leadconn = NULL; + if (session->leadconn && session->leadconn == conn) + session->leadconn = container_of(session->connections.next, + struct iscsi_conn, item); + + if (session->leadconn == NULL) + /* no connections exits.. reset sequencing */ + session->cmdsn = session->max_cmdsn = session->exp_cmdsn = 1; + spin_unlock_bh(&session->lock); + + kfifo_free(conn->immqueue); + kfifo_free(conn->mgmtqueue); + + iscsi_destroy_conn(cls_conn); +} +EXPORT_SYMBOL_GPL(iscsi_conn_teardown); + +int iscsi_conn_start(struct iscsi_cls_conn *cls_conn) +{ + struct iscsi_conn *conn = cls_conn->dd_data; + struct iscsi_session *session = conn->session; + + if (session == NULL) { + printk(KERN_ERR "iscsi: can't start unbound connection\n"); + return -EPERM; + } + + spin_lock_bh(&session->lock); + conn->c_stage = ISCSI_CONN_STARTED; + session->state = ISCSI_STATE_LOGGED_IN; + + switch(conn->stop_stage) { + case STOP_CONN_RECOVER: + /* + * unblock eh_abort() if it is blocked. re-try all + * commands after successful recovery + */ + conn->stop_stage = 0; + conn->tmabort_state = TMABORT_INITIAL; + session->age++; + spin_unlock_bh(&session->lock); + + iscsi_unblock_session(session_to_cls(session)); + wake_up(&conn->ehwait); + return 0; + case STOP_CONN_TERM: + conn->stop_stage = 0; + break; + default: + break; + } + spin_unlock_bh(&session->lock); + + return 0; +} +EXPORT_SYMBOL_GPL(iscsi_conn_start); + +static void +flush_control_queues(struct iscsi_session *session, struct iscsi_conn *conn) +{ + struct iscsi_mgmt_task *mtask, *tmp; + + /* handle pending */ + while (__kfifo_get(conn->immqueue, (void*)&mtask, sizeof(void*)) || + __kfifo_get(conn->mgmtqueue, (void*)&mtask, sizeof(void*))) { + if (mtask == conn->login_mtask) + continue; + debug_scsi("flushing pending mgmt task itt 0x%x\n", mtask->itt); + __kfifo_put(session->mgmtpool.queue, (void*)&mtask, + sizeof(void*)); + } + + /* handle running */ + list_for_each_entry_safe(mtask, tmp, &conn->mgmt_run_list, running) { + debug_scsi("flushing running mgmt task itt 0x%x\n", mtask->itt); + list_del(&mtask->running); + + if (mtask == conn->login_mtask) + continue; + __kfifo_put(session->mgmtpool.queue, (void*)&mtask, + sizeof(void*)); + } + + conn->mtask = NULL; +} + +/* Fail commands. Mutex and session lock held and recv side suspended */ +static void fail_all_commands(struct iscsi_conn *conn) +{ + struct iscsi_cmd_task *ctask, *tmp; + + /* flush pending */ + list_for_each_entry_safe(ctask, tmp, &conn->xmitqueue, running) { + debug_scsi("failing pending sc %p itt 0x%x\n", ctask->sc, + ctask->itt); + fail_command(conn, ctask, DID_BUS_BUSY << 16); + } + + /* fail all other running */ + list_for_each_entry_safe(ctask, tmp, &conn->run_list, running) { + debug_scsi("failing in progress sc %p itt 0x%x\n", + ctask->sc, ctask->itt); + fail_command(conn, ctask, DID_BUS_BUSY << 16); + } + + conn->ctask = NULL; +} + +static void iscsi_start_session_recovery(struct iscsi_session *session, + struct iscsi_conn *conn, int flag) +{ + int old_stop_stage; + + spin_lock_bh(&session->lock); + if (conn->stop_stage == STOP_CONN_TERM) { + spin_unlock_bh(&session->lock); + return; + } + + /* + * When this is called for the in_login state, we only want to clean + * up the login task and connection. We do not need to block and set + * the recovery state again + */ + if (flag == STOP_CONN_TERM) + session->state = ISCSI_STATE_TERMINATE; + else if (conn->stop_stage != STOP_CONN_RECOVER) + session->state = ISCSI_STATE_IN_RECOVERY; + + old_stop_stage = conn->stop_stage; + conn->stop_stage = flag; + conn->c_stage = ISCSI_CONN_STOPPED; + set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); + spin_unlock_bh(&session->lock); + + write_lock_bh(conn->recv_lock); + set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_rx); + write_unlock_bh(conn->recv_lock); + + mutex_lock(&conn->xmitmutex); + /* + * for connection level recovery we should not calculate + * header digest. conn->hdr_size used for optimization + * in hdr_extract() and will be re-negotiated at + * set_param() time. + */ + if (flag == STOP_CONN_RECOVER) { + conn->hdrdgst_en = 0; + conn->datadgst_en = 0; + if (session->state == ISCSI_STATE_IN_RECOVERY && + old_stop_stage != STOP_CONN_RECOVER) { + debug_scsi("blocking session\n"); + iscsi_block_session(session_to_cls(session)); + } + } + + /* + * flush queues. + */ + spin_lock_bh(&session->lock); + fail_all_commands(conn); + flush_control_queues(session, conn); + spin_unlock_bh(&session->lock); + + mutex_unlock(&conn->xmitmutex); +} + +void iscsi_conn_stop(struct iscsi_cls_conn *cls_conn, int flag) +{ + struct iscsi_conn *conn = cls_conn->dd_data; + struct iscsi_session *session = conn->session; + + switch (flag) { + case STOP_CONN_RECOVER: + case STOP_CONN_TERM: + iscsi_start_session_recovery(session, conn, flag); + break; + default: + printk(KERN_ERR "iscsi: invalid stop flag %d\n", flag); + } +} +EXPORT_SYMBOL_GPL(iscsi_conn_stop); + +int iscsi_conn_bind(struct iscsi_cls_session *cls_session, + struct iscsi_cls_conn *cls_conn, int is_leading) +{ + struct iscsi_session *session = class_to_transport_session(cls_session); + struct iscsi_conn *tmp = ERR_PTR(-EEXIST), *conn = cls_conn->dd_data; + + /* lookup for existing connection */ + spin_lock_bh(&session->lock); + list_for_each_entry(tmp, &session->connections, item) { + if (tmp == conn) { + if (conn->c_stage != ISCSI_CONN_STOPPED || + conn->stop_stage == STOP_CONN_TERM) { + printk(KERN_ERR "iscsi: can't bind " + "non-stopped connection (%d:%d)\n", + conn->c_stage, conn->stop_stage); + spin_unlock_bh(&session->lock); + return -EIO; + } + break; + } + } + if (tmp != conn) { + /* bind new iSCSI connection to session */ + conn->session = session; + list_add(&conn->item, &session->connections); + } + spin_unlock_bh(&session->lock); + + if (is_leading) + session->leadconn = conn; + + /* + * Unblock xmitworker(), Login Phase will pass through. + */ + clear_bit(ISCSI_SUSPEND_BIT, &conn->suspend_rx); + clear_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); + return 0; +} +EXPORT_SYMBOL_GPL(iscsi_conn_bind); + + +int iscsi_set_param(struct iscsi_cls_conn *cls_conn, + enum iscsi_param param, char *buf, int buflen) +{ + struct iscsi_conn *conn = cls_conn->dd_data; + struct iscsi_session *session = conn->session; + uint32_t value; + + switch(param) { + case ISCSI_PARAM_MAX_RECV_DLENGTH: + sscanf(buf, "%d", &conn->max_recv_dlength); + break; + case ISCSI_PARAM_MAX_XMIT_DLENGTH: + sscanf(buf, "%d", &conn->max_xmit_dlength); + break; + case ISCSI_PARAM_HDRDGST_EN: + sscanf(buf, "%d", &conn->hdrdgst_en); + break; + case ISCSI_PARAM_DATADGST_EN: + sscanf(buf, "%d", &conn->datadgst_en); + break; + case ISCSI_PARAM_INITIAL_R2T_EN: + sscanf(buf, "%d", &session->initial_r2t_en); + break; + case ISCSI_PARAM_MAX_R2T: + sscanf(buf, "%d", &session->max_r2t); + break; + case ISCSI_PARAM_IMM_DATA_EN: + sscanf(buf, "%d", &session->imm_data_en); + break; + case ISCSI_PARAM_FIRST_BURST: + sscanf(buf, "%d", &session->first_burst); + break; + case ISCSI_PARAM_MAX_BURST: + sscanf(buf, "%d", &session->max_burst); + break; + case ISCSI_PARAM_PDU_INORDER_EN: + sscanf(buf, "%d", &session->pdu_inorder_en); + break; + case ISCSI_PARAM_DATASEQ_INORDER_EN: + sscanf(buf, "%d", &session->dataseq_inorder_en); + break; + case ISCSI_PARAM_ERL: + sscanf(buf, "%d", &session->erl); + break; + case ISCSI_PARAM_IFMARKER_EN: + sscanf(buf, "%d", &value); + BUG_ON(value); + break; + case ISCSI_PARAM_OFMARKER_EN: + sscanf(buf, "%d", &value); + BUG_ON(value); + break; + case ISCSI_PARAM_EXP_STATSN: + sscanf(buf, "%u", &conn->exp_statsn); + break; + case ISCSI_PARAM_TARGET_NAME: + /* this should not change between logins */ + if (session->targetname) + break; + + session->targetname = kstrdup(buf, GFP_KERNEL); + if (!session->targetname) + return -ENOMEM; + break; + case ISCSI_PARAM_TPGT: + sscanf(buf, "%d", &session->tpgt); + break; + case ISCSI_PARAM_PERSISTENT_PORT: + sscanf(buf, "%d", &conn->persistent_port); + break; + case ISCSI_PARAM_PERSISTENT_ADDRESS: + /* + * this is the address returned in discovery so it should + * not change between logins. + */ + if (conn->persistent_address) + break; + + conn->persistent_address = kstrdup(buf, GFP_KERNEL); + if (!conn->persistent_address) + return -ENOMEM; + break; + default: + return -ENOSYS; + } + + return 0; +} +EXPORT_SYMBOL_GPL(iscsi_set_param); + +int iscsi_session_get_param(struct iscsi_cls_session *cls_session, + enum iscsi_param param, char *buf) +{ + struct Scsi_Host *shost = iscsi_session_to_shost(cls_session); + struct iscsi_session *session = iscsi_hostdata(shost->hostdata); + int len; + + switch(param) { + case ISCSI_PARAM_INITIAL_R2T_EN: + len = sprintf(buf, "%d\n", session->initial_r2t_en); + break; + case ISCSI_PARAM_MAX_R2T: + len = sprintf(buf, "%hu\n", session->max_r2t); + break; + case ISCSI_PARAM_IMM_DATA_EN: + len = sprintf(buf, "%d\n", session->imm_data_en); + break; + case ISCSI_PARAM_FIRST_BURST: + len = sprintf(buf, "%u\n", session->first_burst); + break; + case ISCSI_PARAM_MAX_BURST: + len = sprintf(buf, "%u\n", session->max_burst); + break; + case ISCSI_PARAM_PDU_INORDER_EN: + len = sprintf(buf, "%d\n", session->pdu_inorder_en); + break; + case ISCSI_PARAM_DATASEQ_INORDER_EN: + len = sprintf(buf, "%d\n", session->dataseq_inorder_en); + break; + case ISCSI_PARAM_ERL: + len = sprintf(buf, "%d\n", session->erl); + break; + case ISCSI_PARAM_TARGET_NAME: + len = sprintf(buf, "%s\n", session->targetname); + break; + case ISCSI_PARAM_TPGT: + len = sprintf(buf, "%d\n", session->tpgt); + break; + default: + return -ENOSYS; + } + + return len; +} +EXPORT_SYMBOL_GPL(iscsi_session_get_param); + +int iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn, + enum iscsi_param param, char *buf) +{ + struct iscsi_conn *conn = cls_conn->dd_data; + int len; + + switch(param) { + case ISCSI_PARAM_MAX_RECV_DLENGTH: + len = sprintf(buf, "%u\n", conn->max_recv_dlength); + break; + case ISCSI_PARAM_MAX_XMIT_DLENGTH: + len = sprintf(buf, "%u\n", conn->max_xmit_dlength); + break; + case ISCSI_PARAM_HDRDGST_EN: + len = sprintf(buf, "%d\n", conn->hdrdgst_en); + break; + case ISCSI_PARAM_DATADGST_EN: + len = sprintf(buf, "%d\n", conn->datadgst_en); + break; + case ISCSI_PARAM_IFMARKER_EN: + len = sprintf(buf, "%d\n", conn->ifmarker_en); + break; + case ISCSI_PARAM_OFMARKER_EN: + len = sprintf(buf, "%d\n", conn->ofmarker_en); + break; + case ISCSI_PARAM_EXP_STATSN: + len = sprintf(buf, "%u\n", conn->exp_statsn); + break; + case ISCSI_PARAM_PERSISTENT_PORT: + len = sprintf(buf, "%d\n", conn->persistent_port); + break; + case ISCSI_PARAM_PERSISTENT_ADDRESS: + len = sprintf(buf, "%s\n", conn->persistent_address); + break; + default: + return -ENOSYS; + } + + return len; +} +EXPORT_SYMBOL_GPL(iscsi_conn_get_param); + +MODULE_AUTHOR("Mike Christie"); +MODULE_DESCRIPTION("iSCSI library functions"); +MODULE_LICENSE("GPL"); diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h index 087c44539..d44f9aac6 100644 --- a/drivers/scsi/lpfc/lpfc.h +++ b/drivers/scsi/lpfc/lpfc.h @@ -21,10 +21,12 @@ struct lpfc_sli2_slim; -#define LPFC_MAX_TARGET 256 /* max targets supported */ -#define LPFC_MAX_DISC_THREADS 64 /* max outstanding discovery els req */ -#define LPFC_MAX_NS_RETRY 3 /* max NameServer retries */ +#define LPFC_MAX_TARGET 256 /* max number of targets supported */ +#define LPFC_MAX_DISC_THREADS 64 /* max outstanding discovery els + requests */ +#define LPFC_MAX_NS_RETRY 3 /* Number of retry attempts to contact + the NameServer before giving up. */ #define LPFC_DFT_HBA_Q_DEPTH 2048 /* max cmds per hba */ #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 */ @@ -41,7 +43,6 @@ struct lpfc_sli2_slim; (( (u64)(high)<<16 ) << 16)|( (u64)(low)))) /* Provide maximum configuration definitions. */ #define LPFC_DRVR_TIMEOUT 16 /* driver iocb timeout value in sec */ -#define MAX_FCP_TARGET 256 /* max num of FCP targets supported */ #define FC_MAX_ADPTMSG 64 #define MAX_HBAEVT 32 @@ -174,7 +175,6 @@ struct lpfc_hba { dma_addr_t slim2p_mapping; uint16_t pci_cfg_value; - struct semaphore hba_can_block; int32_t hba_state; #define LPFC_STATE_UNKNOWN 0 /* HBA state is unknown */ diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c index 1276bd77b..d384c16f4 100644 --- a/drivers/scsi/lpfc/lpfc_attr.c +++ b/drivers/scsi/lpfc/lpfc_attr.c @@ -1,31 +1,29 @@ /******************************************************************* * This file is part of the Emulex Linux Device Driver for * - * Enterprise Fibre Channel Host Bus Adapters. * - * Refer to the README file included with this package for * - * driver version and adapter support. * - * Copyright (C) 2004 Emulex Corporation. * + * Fibre Channel Host Bus Adapters. * + * Copyright (C) 2004-2006 Emulex. All rights reserved. * + * EMULEX and SLI are trademarks of Emulex. * * www.emulex.com * + * Portions Copyright (C) 2004-2005 Christoph Hellwig * * * * 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, a copy of which * - * can be found in the file COPYING included with this package. * + * modify it under the terms of version 2 of the GNU General * + * Public License as published by the Free Software Foundation. * + * This program is distributed in the hope that it will be useful. * + * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND * + * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE * + * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD * + * TO BE LEGALLY INVALID. See the GNU General Public License for * + * more details, a copy of which can be found in the file COPYING * + * included with this package. * *******************************************************************/ -/* - * $Id: lpfc_attr.c 1.24 2005/04/13 11:58:55EDT sf_support Exp $ - */ - #include #include #include +#include #include #include #include @@ -81,7 +79,7 @@ static ssize_t lpfc_serialnum_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]; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata; return snprintf(buf, PAGE_SIZE, "%s\n",phba->SerialNumber); } @@ -89,7 +87,7 @@ static ssize_t lpfc_modeldesc_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]; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata; return snprintf(buf, PAGE_SIZE, "%s\n",phba->ModelDesc); } @@ -97,7 +95,7 @@ static ssize_t lpfc_modelname_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]; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata; return snprintf(buf, PAGE_SIZE, "%s\n",phba->ModelName); } @@ -105,7 +103,7 @@ static ssize_t lpfc_programtype_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]; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata; return snprintf(buf, PAGE_SIZE, "%s\n",phba->ProgramType); } @@ -113,7 +111,7 @@ static ssize_t lpfc_portnum_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]; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata; return snprintf(buf, PAGE_SIZE, "%s\n",phba->Port); } @@ -121,7 +119,7 @@ static ssize_t lpfc_fwrev_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]; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata; char fwrev[32]; lpfc_decode_firmware_rev(phba, fwrev, 1); return snprintf(buf, PAGE_SIZE, "%s\n",fwrev); @@ -132,7 +130,7 @@ lpfc_hdw_show(struct class_device *cdev, char *buf) { char hdw[9]; struct Scsi_Host *host = class_to_shost(cdev); - struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0]; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata; lpfc_vpd_t *vp = &phba->vpd; lpfc_jedec_to_ascii(vp->rev.biuRev, hdw); return snprintf(buf, PAGE_SIZE, "%s\n", hdw); @@ -141,16 +139,18 @@ static ssize_t lpfc_option_rom_version_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]; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata; return snprintf(buf, PAGE_SIZE, "%s\n", phba->OptionROMVersion); } static ssize_t lpfc_state_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]; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata; int len = 0; switch (phba->hba_state) { + case LPFC_STATE_UNKNOWN: + case LPFC_WARM_START: case LPFC_INIT_START: case LPFC_INIT_MBX_CMDS: case LPFC_LINK_DOWN: @@ -196,25 +196,19 @@ static ssize_t lpfc_num_discovered_ports_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]; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata; return snprintf(buf, PAGE_SIZE, "%d\n", phba->fc_map_cnt + phba->fc_unmap_cnt); } -static ssize_t -lpfc_issue_lip (struct class_device *cdev, const char *buf, size_t count) +static int +lpfc_issue_lip(struct Scsi_Host *host) { - struct Scsi_Host *host = class_to_shost(cdev); - struct lpfc_hba *phba = (struct lpfc_hba *) host->hostdata[0]; - int val = 0; + struct lpfc_hba *phba = (struct lpfc_hba *) host->hostdata; LPFC_MBOXQ_t *pmboxq; int mbxstatus = MBXERR_ERROR; - if ((sscanf(buf, "%d", &val) != 1) || - (val != 1)) - return -EINVAL; - if ((phba->fc_flag & FC_OFFLINE_MODE) || (phba->hba_state != LPFC_HBA_READY)) return -EPERM; @@ -225,118 +219,281 @@ lpfc_issue_lip (struct class_device *cdev, const char *buf, size_t count) return -ENOMEM; memset((void *)pmboxq, 0, sizeof (LPFC_MBOXQ_t)); - lpfc_init_link(phba, pmboxq, phba->cfg_topology, phba->cfg_link_speed); - mbxstatus = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2); + pmboxq->mb.mbxCommand = MBX_DOWN_LINK; + pmboxq->mb.mbxOwner = OWN_HOST; + + mbxstatus = lpfc_sli_issue_mbox_wait(phba, pmboxq, LPFC_MBOX_TMO * 2); + + if ((mbxstatus == MBX_SUCCESS) && (pmboxq->mb.mbxStatus == 0)) { + memset((void *)pmboxq, 0, sizeof (LPFC_MBOXQ_t)); + lpfc_init_link(phba, pmboxq, phba->cfg_topology, + phba->cfg_link_speed); + mbxstatus = lpfc_sli_issue_mbox_wait(phba, pmboxq, + phba->fc_ratov * 2); + } if (mbxstatus == MBX_TIMEOUT) pmboxq->mbox_cmpl = lpfc_sli_def_mbox_cmpl; else - mempool_free( pmboxq, phba->mbox_mem_pool); + mempool_free(pmboxq, phba->mbox_mem_pool); if (mbxstatus == MBXERR_ERROR) return -EIO; - return strlen(buf); + return 0; +} + +static int +lpfc_selective_reset(struct lpfc_hba *phba) +{ + struct completion online_compl; + int status = 0; + + init_completion(&online_compl); + lpfc_workq_post_event(phba, &status, &online_compl, + LPFC_EVT_OFFLINE); + wait_for_completion(&online_compl); + + if (status != 0) + return -EIO; + + init_completion(&online_compl); + lpfc_workq_post_event(phba, &status, &online_compl, + LPFC_EVT_ONLINE); + wait_for_completion(&online_compl); + + if (status != 0) + return -EIO; + + return 0; +} + +static ssize_t +lpfc_issue_reset(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; + int status = -EINVAL; + + if (strncmp(buf, "selective", sizeof("selective") - 1) == 0) + status = lpfc_selective_reset(phba); + + if (status == 0) + return strlen(buf); + else + return status; } static ssize_t lpfc_nport_evt_cnt_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]; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata; return snprintf(buf, PAGE_SIZE, "%d\n", phba->nport_event_cnt); } static ssize_t -lpfc_board_online_show(struct class_device *cdev, char *buf) +lpfc_board_mode_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]; - - if (!phba) return 0; - - if (phba->fc_flag & FC_OFFLINE_MODE) - return snprintf(buf, PAGE_SIZE, "0\n"); + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata; + char * state; + + if (phba->hba_state == LPFC_HBA_ERROR) + state = "error"; + else if (phba->hba_state == LPFC_WARM_START) + state = "warm start"; + else if (phba->hba_state == LPFC_INIT_START) + state = "offline"; else - return snprintf(buf, PAGE_SIZE, "1\n"); + state = "online"; + + return snprintf(buf, PAGE_SIZE, "%s\n", state); } static ssize_t -lpfc_board_online_store(struct class_device *cdev, const char *buf, - size_t count) +lpfc_board_mode_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]; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata; struct completion online_compl; - int val=0, status=0; - - if (sscanf(buf, "%d", &val) != 1) - return 0; + int status=0; init_completion(&online_compl); - if (val) + if(strncmp(buf, "online", sizeof("online") - 1) == 0) lpfc_workq_post_event(phba, &status, &online_compl, - LPFC_EVT_ONLINE); - else + LPFC_EVT_ONLINE); + else if (strncmp(buf, "offline", sizeof("offline") - 1) == 0) lpfc_workq_post_event(phba, &status, &online_compl, - LPFC_EVT_OFFLINE); + LPFC_EVT_OFFLINE); + else if (strncmp(buf, "warm", sizeof("warm") - 1) == 0) + lpfc_workq_post_event(phba, &status, &online_compl, + LPFC_EVT_WARM_START); + else if (strncmp(buf, "error", sizeof("error") - 1) == 0) + lpfc_workq_post_event(phba, &status, &online_compl, + LPFC_EVT_KILL); + else + return -EINVAL; + wait_for_completion(&online_compl); + if (!status) return strlen(buf); else - return 0; + 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; + + 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; + 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 \ lpfc_##attr##_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];\ + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata;\ int val = 0;\ - if (phba){\ - val = phba->cfg_##attr;\ - return snprintf(buf, PAGE_SIZE, "%d\n",\ - phba->cfg_##attr);\ + val = phba->cfg_##attr;\ + return snprintf(buf, PAGE_SIZE, "%d\n",\ + phba->cfg_##attr);\ +} + +#define lpfc_param_hex_show(attr) \ +static ssize_t \ +lpfc_##attr##_show(struct class_device *cdev, char *buf) \ +{ \ + struct Scsi_Host *host = class_to_shost(cdev);\ + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata;\ + int val = 0;\ + val = phba->cfg_##attr;\ + return snprintf(buf, PAGE_SIZE, "%#x\n",\ + phba->cfg_##attr);\ +} + +#define lpfc_param_init(attr, default, minval, maxval) \ +static int \ +lpfc_##attr##_init(struct lpfc_hba *phba, int val) \ +{ \ + if (val >= minval && val <= maxval) {\ + phba->cfg_##attr = val;\ + return 0;\ + }\ + lpfc_printf_log(phba, KERN_ERR, LOG_INIT, \ + "%d:0449 lpfc_"#attr" attribute cannot be set to %d, "\ + "allowed range is ["#minval", "#maxval"]\n", \ + phba->brd_no, val); \ + phba->cfg_##attr = default;\ + return -EINVAL;\ +} + +#define lpfc_param_set(attr, default, minval, maxval) \ +static int \ +lpfc_##attr##_set(struct lpfc_hba *phba, int val) \ +{ \ + if (val >= minval && val <= maxval) {\ + phba->cfg_##attr = val;\ + return 0;\ }\ - return 0;\ + lpfc_printf_log(phba, KERN_ERR, LOG_INIT, \ + "%d:0450 lpfc_"#attr" attribute cannot be set to %d, "\ + "allowed range is ["#minval", "#maxval"]\n", \ + phba->brd_no, val); \ + return -EINVAL;\ } -#define lpfc_param_store(attr, minval, maxval) \ +#define lpfc_param_store(attr) \ static ssize_t \ lpfc_##attr##_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];\ - int val = 0;\ + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata;\ + int val=0;\ if (!isdigit(buf[0]))\ return -EINVAL;\ - if (sscanf(buf, "0x%x", &val) != 1)\ - if (sscanf(buf, "%d", &val) != 1)\ - return -EINVAL;\ - if (phba){\ - if (val >= minval && val <= maxval) {\ - phba->cfg_##attr = val;\ - return strlen(buf);\ - }\ - }\ - return 0;\ + if (sscanf(buf, "%i", &val) != 1)\ + return -EINVAL;\ + if (lpfc_##attr##_set(phba, val) == 0) \ + return strlen(buf);\ + else \ + return -EINVAL;\ } -#define LPFC_ATTR_R_NOINIT(name, desc) \ -extern int lpfc_##name;\ +#define LPFC_ATTR(name, defval, minval, maxval, desc) \ +static int lpfc_##name = defval;\ module_param(lpfc_##name, int, 0);\ MODULE_PARM_DESC(lpfc_##name, desc);\ -lpfc_param_show(name)\ -static CLASS_DEVICE_ATTR(lpfc_##name, S_IRUGO , lpfc_##name##_show, NULL) +lpfc_param_init(name, defval, minval, maxval) #define LPFC_ATTR_R(name, defval, minval, maxval, desc) \ static int lpfc_##name = defval;\ module_param(lpfc_##name, int, 0);\ MODULE_PARM_DESC(lpfc_##name, desc);\ lpfc_param_show(name)\ +lpfc_param_init(name, defval, minval, maxval)\ static CLASS_DEVICE_ATTR(lpfc_##name, S_IRUGO , lpfc_##name##_show, NULL) #define LPFC_ATTR_RW(name, defval, minval, maxval, desc) \ @@ -344,7 +501,28 @@ static int lpfc_##name = defval;\ module_param(lpfc_##name, int, 0);\ MODULE_PARM_DESC(lpfc_##name, desc);\ lpfc_param_show(name)\ -lpfc_param_store(name, minval, maxval)\ +lpfc_param_init(name, defval, minval, maxval)\ +lpfc_param_set(name, defval, minval, maxval)\ +lpfc_param_store(name)\ +static CLASS_DEVICE_ATTR(lpfc_##name, S_IRUGO | S_IWUSR,\ + lpfc_##name##_show, lpfc_##name##_store) + +#define LPFC_ATTR_HEX_R(name, defval, minval, maxval, desc) \ +static int lpfc_##name = defval;\ +module_param(lpfc_##name, int, 0);\ +MODULE_PARM_DESC(lpfc_##name, desc);\ +lpfc_param_hex_show(name)\ +lpfc_param_init(name, defval, minval, maxval)\ +static CLASS_DEVICE_ATTR(lpfc_##name, S_IRUGO , lpfc_##name##_show, NULL) + +#define LPFC_ATTR_HEX_RW(name, defval, minval, maxval, desc) \ +static int lpfc_##name = defval;\ +module_param(lpfc_##name, int, 0);\ +MODULE_PARM_DESC(lpfc_##name, desc);\ +lpfc_param_hex_show(name)\ +lpfc_param_init(name, defval, minval, maxval)\ +lpfc_param_set(name, defval, minval, maxval)\ +lpfc_param_store(name)\ static CLASS_DEVICE_ATTR(lpfc_##name, S_IRUGO | S_IWUSR,\ lpfc_##name##_show, lpfc_##name##_store) @@ -366,10 +544,19 @@ static CLASS_DEVICE_ATTR(lpfc_drvr_version, S_IRUGO, lpfc_drvr_version_show, NULL); static CLASS_DEVICE_ATTR(management_version, S_IRUGO, management_version_show, NULL); -static CLASS_DEVICE_ATTR(issue_lip, S_IWUSR, NULL, lpfc_issue_lip); -static CLASS_DEVICE_ATTR(board_online, S_IRUGO | S_IWUSR, - lpfc_board_online_show, lpfc_board_online_store); +static CLASS_DEVICE_ATTR(board_mode, S_IRUGO | S_IWUSR, + lpfc_board_mode_show, lpfc_board_mode_store); +static CLASS_DEVICE_ATTR(issue_reset, S_IWUSR, NULL, lpfc_issue_reset); + +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 @@ -390,7 +577,7 @@ static CLASS_DEVICE_ATTR(board_online, S_IRUGO | S_IWUSR, # LOG_LIBDFC 0x2000 LIBDFC events # LOG_ALL_MSG 0xffff LOG all messages */ -LPFC_ATTR_RW(log_verbose, 0x0, 0x0, 0xffff, "Verbose logging bit-mask"); +LPFC_ATTR_HEX_RW(log_verbose, 0x0, 0x0, 0xffff, "Verbose logging bit-mask"); /* # lun_queue_depth: This parameter is used to limit the number of outstanding @@ -399,6 +586,16 @@ LPFC_ATTR_RW(log_verbose, 0x0, 0x0, 0xffff, "Verbose logging bit-mask"); LPFC_ATTR_R(lun_queue_depth, 30, 1, 128, "Max number of FCP commands we can queue to a specific LUN"); +/* +# hba_queue_depth: This parameter is used to limit the number of outstanding +# commands per lpfc HBA. Value range is [32,8192]. If this parameter +# value is greater than the maximum number of exchanges supported by the HBA, +# then maximum number of exchanges supported by the HBA is used to determine +# the hba_queue_depth. +*/ +LPFC_ATTR_R(hba_queue_depth, 8192, 32, 8192, + "Max number of FCP commands we can queue to a lpfc HBA"); + /* # Some disk devices have a "select ID" or "select Target" capability. # From a protocol standpoint "select ID" usually means select the @@ -421,7 +618,7 @@ LPFC_ATTR_R(scan_down, 1, 0, 1, /* # lpfc_nodev_tmo: If set, it will hold all I/O errors on devices that disappear -# until the timer expires. Value range is [0,255]. Default value is 20. +# until the timer expires. Value range is [0,255]. Default value is 30. # NOTE: this MUST be less then the SCSI Layer command timeout - 1. */ LPFC_ATTR_RW(nodev_tmo, 30, 0, 255, @@ -430,6 +627,7 @@ LPFC_ATTR_RW(nodev_tmo, 30, 0, 255, /* # lpfc_topology: link topology for init link # 0x0 = attempt loop mode then point-to-point +# 0x01 = internal loopback mode # 0x02 = attempt point-to-point mode only # 0x04 = attempt loop mode only # 0x06 = attempt point-to-point mode then loop @@ -437,7 +635,7 @@ LPFC_ATTR_RW(nodev_tmo, 30, 0, 255, # Set loop mode if you want to run as an NL_Port. Value range is [0,0x6]. # Default value is 0. */ -LPFC_ATTR_R(topology, 0, 0, 6, "Select Fibre Channel topology"); +LPFC_ATTR_RW(topology, 0, 0, 6, "Select Fibre Channel topology"); /* # lpfc_link_speed: Link speed selection for initializing the Fibre Channel @@ -477,16 +675,20 @@ 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. */ -static int lpfc_cr_delay = 0; -module_param(lpfc_cr_delay, int , 0); -MODULE_PARM_DESC(lpfc_cr_delay, "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"); -static int lpfc_cr_count = 1; -module_param(lpfc_cr_count, int, 0); -MODULE_PARM_DESC(lpfc_cr_count, "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"); +/* +# lpfc_multi_ring_support: Determines how many rings to spread available +# cmd/rsp IOCB entries across. +# Value range is [1,2]. Default value is 1. +*/ +LPFC_ATTR_R(multi_ring_support, 1, 1, 2, "Determines number of primary " + "SLI rings to spread IOCB entries across"); + /* # lpfc_fdmi_on: controls FDMI support. # 0 = no FDMI support @@ -500,18 +702,23 @@ LPFC_ATTR_RW(fdmi_on, 0, 0, 2, "Enable FDMI support"); # Specifies the maximum number of ELS cmds we can have outstanding (for # discovery). Value range is [1,64]. Default value = 32. */ -static int lpfc_discovery_threads = 32; -module_param(lpfc_discovery_threads, int, 0); -MODULE_PARM_DESC(lpfc_discovery_threads, "Maximum number of ELS commands " +LPFC_ATTR(discovery_threads, 32, 1, 64, "Maximum number of ELS commands " "during discovery"); /* -# lpfc_max_luns: maximum number of LUNs per target driver will support -# Value range is [1,32768]. Default value is 256. -# NOTE: The SCSI layer will scan each target for this many luns +# lpfc_max_luns: maximum allowed LUN. +# Value range is [0,65535]. Default value is 255. +# NOTE: The SCSI layer might probe all allowed LUN on some old targets. */ -LPFC_ATTR_R(max_luns, 256, 1, 32768, - "Maximum number of LUNs per target driver will support"); +LPFC_ATTR_R(max_luns, 255, 0, 65535, + "Maximum allowed LUN"); + +/* +# 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, @@ -528,6 +735,7 @@ struct class_device_attribute *lpfc_host_attrs[] = { &class_device_attr_lpfc_drvr_version, &class_device_attr_lpfc_log_verbose, &class_device_attr_lpfc_lun_queue_depth, + &class_device_attr_lpfc_hba_queue_depth, &class_device_attr_lpfc_nodev_tmo, &class_device_attr_lpfc_fcp_class, &class_device_attr_lpfc_use_adisc, @@ -535,12 +743,17 @@ 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_multi_ring_support, &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_issue_lip, - &class_device_attr_board_online, + &class_device_attr_board_mode, + &class_device_attr_issue_reset, + &class_device_attr_lpfc_poll, + &class_device_attr_lpfc_poll_tmo, NULL, }; @@ -550,7 +763,7 @@ sysfs_ctlreg_write(struct kobject *kobj, char *buf, loff_t off, size_t count) size_t buf_off; struct Scsi_Host *host = class_to_shost(container_of(kobj, struct class_device, kobj)); - struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0]; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata; if ((off + count) > FF_REG_AREA_SIZE) return -ERANGE; @@ -583,7 +796,7 @@ sysfs_ctlreg_read(struct kobject *kobj, char *buf, loff_t off, size_t count) uint32_t * tmp_ptr; struct Scsi_Host *host = class_to_shost(container_of(kobj, struct class_device, kobj)); - struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0]; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata; if (off > FF_REG_AREA_SIZE) return -ERANGE; @@ -638,7 +851,7 @@ sysfs_mbox_write(struct kobject *kobj, char *buf, loff_t off, size_t count) { struct Scsi_Host * host = class_to_shost(container_of(kobj, struct class_device, kobj)); - struct lpfc_hba * phba = (struct lpfc_hba*)host->hostdata[0]; + struct lpfc_hba * phba = (struct lpfc_hba*)host->hostdata; struct lpfcMboxq * mbox = NULL; if ((count + off) > MAILBOX_CMD_SIZE) @@ -654,7 +867,7 @@ sysfs_mbox_write(struct kobject *kobj, char *buf, loff_t off, size_t count) mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); if (!mbox) return -ENOMEM; - + memset(mbox, 0, sizeof (LPFC_MBOXQ_t)); } spin_lock_irq(host->host_lock); @@ -671,7 +884,7 @@ sysfs_mbox_write(struct kobject *kobj, char *buf, loff_t off, size_t count) phba->sysfs_mbox.mbox == NULL ) { sysfs_mbox_idle(phba); spin_unlock_irq(host->host_lock); - return -EINVAL; + return -EAGAIN; } } @@ -691,7 +904,7 @@ sysfs_mbox_read(struct kobject *kobj, char *buf, loff_t off, size_t count) struct Scsi_Host *host = class_to_shost(container_of(kobj, struct class_device, kobj)); - struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0]; + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata; int rc; if (off > sizeof(MAILBOX_t)) @@ -748,8 +961,11 @@ sysfs_mbox_read(struct kobject *kobj, char *buf, loff_t off, size_t count) case MBX_DUMP_MEMORY: case MBX_DOWN_LOAD: case MBX_UPDATE_CFG: + case MBX_KILL_BOARD: case MBX_LOAD_AREA: case MBX_LOAD_EXP_ROM: + case MBX_BEACON: + case MBX_DEL_LD_ENTRY: break; case MBX_READ_SPARM64: case MBX_READ_LA: @@ -784,14 +1000,15 @@ sysfs_mbox_read(struct kobject *kobj, char *buf, loff_t off, size_t count) spin_unlock_irq(phba->host->host_lock); rc = lpfc_sli_issue_mbox_wait (phba, phba->sysfs_mbox.mbox, - phba->fc_ratov * 2); + lpfc_mbox_tmo_val(phba, + phba->sysfs_mbox.mbox->mb.mbxCommand) * HZ); spin_lock_irq(phba->host->host_lock); } if (rc != MBX_SUCCESS) { sysfs_mbox_idle(phba); spin_unlock_irq(host->host_lock); - return -ENODEV; + return (rc == MBX_TIMEOUT) ? -ETIME : -ENODEV; } phba->sysfs_mbox.state = SMBOX_READING; } @@ -800,7 +1017,7 @@ sysfs_mbox_read(struct kobject *kobj, char *buf, loff_t off, size_t count) printk(KERN_WARNING "mbox_read: Bad State\n"); sysfs_mbox_idle(phba); spin_unlock_irq(host->host_lock); - return -EINVAL; + return -EAGAIN; } memcpy(buf, (uint8_t *) & phba->sysfs_mbox.mbox->mb + off, count); @@ -866,7 +1083,7 @@ lpfc_free_sysfs_attr(struct lpfc_hba *phba) static void lpfc_get_host_port_id(struct Scsi_Host *shost) { - struct lpfc_hba *phba = (struct lpfc_hba*)shost->hostdata[0]; + struct lpfc_hba *phba = (struct lpfc_hba*)shost->hostdata; /* note: fc_myDID already in cpu endianness */ fc_host_port_id(shost) = phba->fc_myDID; } @@ -874,7 +1091,7 @@ lpfc_get_host_port_id(struct Scsi_Host *shost) static void lpfc_get_host_port_type(struct Scsi_Host *shost) { - struct lpfc_hba *phba = (struct lpfc_hba*)shost->hostdata[0]; + struct lpfc_hba *phba = (struct lpfc_hba*)shost->hostdata; spin_lock_irq(shost->host_lock); @@ -899,7 +1116,7 @@ lpfc_get_host_port_type(struct Scsi_Host *shost) static void lpfc_get_host_port_state(struct Scsi_Host *shost) { - struct lpfc_hba *phba = (struct lpfc_hba*)shost->hostdata[0]; + struct lpfc_hba *phba = (struct lpfc_hba*)shost->hostdata; spin_lock_irq(shost->host_lock); @@ -907,6 +1124,8 @@ lpfc_get_host_port_state(struct Scsi_Host *shost) fc_host_port_state(shost) = FC_PORTSTATE_OFFLINE; else { switch (phba->hba_state) { + case LPFC_STATE_UNKNOWN: + case LPFC_WARM_START: case LPFC_INIT_START: case LPFC_INIT_MBX_CMDS: case LPFC_LINK_DOWN: @@ -940,7 +1159,7 @@ lpfc_get_host_port_state(struct Scsi_Host *shost) static void lpfc_get_host_speed(struct Scsi_Host *shost) { - struct lpfc_hba *phba = (struct lpfc_hba*)shost->hostdata[0]; + struct lpfc_hba *phba = (struct lpfc_hba*)shost->hostdata; spin_lock_irq(shost->host_lock); @@ -967,35 +1186,36 @@ lpfc_get_host_speed(struct Scsi_Host *shost) static void lpfc_get_host_fabric_name (struct Scsi_Host *shost) { - struct lpfc_hba *phba = (struct lpfc_hba*)shost->hostdata[0]; - u64 nodename; + struct lpfc_hba *phba = (struct lpfc_hba*)shost->hostdata; + u64 node_name; spin_lock_irq(shost->host_lock); if ((phba->fc_flag & FC_FABRIC) || ((phba->fc_topology == TOPOLOGY_LOOP) && (phba->fc_flag & FC_PUBLIC_LOOP))) - memcpy(&nodename, &phba->fc_fabparam.nodeName, sizeof(u64)); + node_name = wwn_to_u64(phba->fc_fabparam.nodeName.u.wwn); else /* fabric is local port if there is no F/FL_Port */ - memcpy(&nodename, &phba->fc_nodename, sizeof(u64)); + node_name = wwn_to_u64(phba->fc_nodename.u.wwn); spin_unlock_irq(shost->host_lock); - fc_host_fabric_name(shost) = be64_to_cpu(nodename); + fc_host_fabric_name(shost) = node_name; } static struct fc_host_statistics * lpfc_get_stats(struct Scsi_Host *shost) { - struct lpfc_hba *phba = (struct lpfc_hba *)shost->hostdata[0]; + struct lpfc_hba *phba = (struct lpfc_hba *)shost->hostdata; struct lpfc_sli *psli = &phba->sli; - struct fc_host_statistics *hs = - (struct fc_host_statistics *)phba->link_stats; + struct fc_host_statistics *hs = &phba->link_stats; + struct lpfc_lnk_stat * lso = &psli->lnk_stat_offsets; LPFC_MBOXQ_t *pmboxq; MAILBOX_t *pmb; - int rc=0; + unsigned long seconds; + int rc = 0; pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); if (!pmboxq) @@ -1008,44 +1228,42 @@ lpfc_get_stats(struct Scsi_Host *shost) pmboxq->context1 = NULL; if ((phba->fc_flag & FC_OFFLINE_MODE) || - (!(psli->sli_flag & LPFC_SLI2_ACTIVE))){ + (!(psli->sli_flag & LPFC_SLI2_ACTIVE))) rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL); - } else + else rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2); if (rc != MBX_SUCCESS) { - if (pmboxq) { - if (rc == MBX_TIMEOUT) - pmboxq->mbox_cmpl = lpfc_sli_def_mbox_cmpl; - else - mempool_free( pmboxq, phba->mbox_mem_pool); - } + if (rc == MBX_TIMEOUT) + pmboxq->mbox_cmpl = lpfc_sli_def_mbox_cmpl; + else + mempool_free(pmboxq, phba->mbox_mem_pool); return NULL; } + memset(hs, 0, sizeof (struct fc_host_statistics)); + hs->tx_frames = pmb->un.varRdStatus.xmitFrameCnt; hs->tx_words = (pmb->un.varRdStatus.xmitByteCnt * 256); hs->rx_frames = pmb->un.varRdStatus.rcvFrameCnt; hs->rx_words = (pmb->un.varRdStatus.rcvByteCnt * 256); - memset((void *)pmboxq, 0, sizeof (LPFC_MBOXQ_t)); + memset(pmboxq, 0, sizeof (LPFC_MBOXQ_t)); pmb->mbxCommand = MBX_READ_LNK_STAT; pmb->mbxOwner = OWN_HOST; pmboxq->context1 = NULL; if ((phba->fc_flag & FC_OFFLINE_MODE) || - (!(psli->sli_flag & LPFC_SLI2_ACTIVE))) { + (!(psli->sli_flag & LPFC_SLI2_ACTIVE))) rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL); - } else + else rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2); if (rc != MBX_SUCCESS) { - if (pmboxq) { - if (rc == MBX_TIMEOUT) - pmboxq->mbox_cmpl = lpfc_sli_def_mbox_cmpl; - else - mempool_free( pmboxq, phba->mbox_mem_pool); - } + if (rc == MBX_TIMEOUT) + pmboxq->mbox_cmpl = lpfc_sli_def_mbox_cmpl; + else + mempool_free( pmboxq, phba->mbox_mem_pool); return NULL; } @@ -1057,22 +1275,103 @@ lpfc_get_stats(struct Scsi_Host *shost) hs->invalid_crc_count = pmb->un.varRdLnk.crcCnt; hs->error_frames = pmb->un.varRdLnk.crcCnt; + hs->link_failure_count -= lso->link_failure_count; + hs->loss_of_sync_count -= lso->loss_of_sync_count; + hs->loss_of_signal_count -= lso->loss_of_signal_count; + hs->prim_seq_protocol_err_count -= lso->prim_seq_protocol_err_count; + hs->invalid_tx_word_count -= lso->invalid_tx_word_count; + hs->invalid_crc_count -= lso->invalid_crc_count; + hs->error_frames -= lso->error_frames; + if (phba->fc_topology == TOPOLOGY_LOOP) { hs->lip_count = (phba->fc_eventTag >> 1); + hs->lip_count -= lso->link_events; hs->nos_count = -1; } else { hs->lip_count = -1; hs->nos_count = (phba->fc_eventTag >> 1); + hs->nos_count -= lso->link_events; } hs->dumped_frames = -1; -/* FIX ME */ - /*hs->SecondsSinceLastReset = (jiffies - lpfc_loadtime) / HZ;*/ + seconds = get_seconds(); + if (seconds < psli->stats_start) + hs->seconds_since_last_reset = seconds + + ((unsigned long)-1 - psli->stats_start); + else + hs->seconds_since_last_reset = seconds - psli->stats_start; return hs; } +static void +lpfc_reset_stats(struct Scsi_Host *shost) +{ + struct lpfc_hba *phba = (struct lpfc_hba *)shost->hostdata; + struct lpfc_sli *psli = &phba->sli; + struct lpfc_lnk_stat * lso = &psli->lnk_stat_offsets; + LPFC_MBOXQ_t *pmboxq; + MAILBOX_t *pmb; + int rc = 0; + + pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); + if (!pmboxq) + return; + memset(pmboxq, 0, sizeof(LPFC_MBOXQ_t)); + + pmb = &pmboxq->mb; + pmb->mbxCommand = MBX_READ_STATUS; + pmb->mbxOwner = OWN_HOST; + pmb->un.varWords[0] = 0x1; /* reset request */ + pmboxq->context1 = NULL; + + if ((phba->fc_flag & FC_OFFLINE_MODE) || + (!(psli->sli_flag & LPFC_SLI2_ACTIVE))) + rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL); + else + rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2); + + if (rc != MBX_SUCCESS) { + if (rc == MBX_TIMEOUT) + pmboxq->mbox_cmpl = lpfc_sli_def_mbox_cmpl; + else + mempool_free(pmboxq, phba->mbox_mem_pool); + return; + } + + memset(pmboxq, 0, sizeof(LPFC_MBOXQ_t)); + pmb->mbxCommand = MBX_READ_LNK_STAT; + pmb->mbxOwner = OWN_HOST; + pmboxq->context1 = NULL; + + if ((phba->fc_flag & FC_OFFLINE_MODE) || + (!(psli->sli_flag & LPFC_SLI2_ACTIVE))) + rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL); + else + rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2); + + if (rc != MBX_SUCCESS) { + if (rc == MBX_TIMEOUT) + pmboxq->mbox_cmpl = lpfc_sli_def_mbox_cmpl; + else + mempool_free( pmboxq, phba->mbox_mem_pool); + return; + } + + lso->link_failure_count = pmb->un.varRdLnk.linkFailureCnt; + lso->loss_of_sync_count = pmb->un.varRdLnk.lossSyncCnt; + lso->loss_of_signal_count = pmb->un.varRdLnk.lossSignalCnt; + lso->prim_seq_protocol_err_count = pmb->un.varRdLnk.primSeqErrCnt; + lso->invalid_tx_word_count = pmb->un.varRdLnk.invalidXmitWord; + lso->invalid_crc_count = pmb->un.varRdLnk.crcCnt; + lso->error_frames = pmb->un.varRdLnk.crcCnt; + lso->link_events = (phba->fc_eventTag >> 1); + + psli->stats_start = get_seconds(); + + return; +} /* * The LPFC driver treats linkdown handling as target loss events so there @@ -1082,7 +1381,7 @@ static void lpfc_get_starget_port_id(struct scsi_target *starget) { struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); - struct lpfc_hba *phba = (struct lpfc_hba *) shost->hostdata[0]; + struct lpfc_hba *phba = (struct lpfc_hba *) shost->hostdata; uint32_t did = -1; struct lpfc_nodelist *ndlp = NULL; @@ -1103,44 +1402,42 @@ static void lpfc_get_starget_node_name(struct scsi_target *starget) { struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); - struct lpfc_hba *phba = (struct lpfc_hba *) shost->hostdata[0]; - uint64_t node_name = 0; + struct lpfc_hba *phba = (struct lpfc_hba *) shost->hostdata; + u64 node_name = 0; struct lpfc_nodelist *ndlp = NULL; spin_lock_irq(shost->host_lock); /* Search the mapped list for this target ID */ list_for_each_entry(ndlp, &phba->fc_nlpmap_list, nlp_listp) { if (starget->id == ndlp->nlp_sid) { - memcpy(&node_name, &ndlp->nlp_nodename, - sizeof(struct lpfc_name)); + node_name = wwn_to_u64(ndlp->nlp_nodename.u.wwn); break; } } spin_unlock_irq(shost->host_lock); - fc_starget_node_name(starget) = be64_to_cpu(node_name); + fc_starget_node_name(starget) = node_name; } static void lpfc_get_starget_port_name(struct scsi_target *starget) { struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); - struct lpfc_hba *phba = (struct lpfc_hba *) shost->hostdata[0]; - uint64_t port_name = 0; + struct lpfc_hba *phba = (struct lpfc_hba *) shost->hostdata; + u64 port_name = 0; struct lpfc_nodelist *ndlp = NULL; spin_lock_irq(shost->host_lock); /* Search the mapped list for this target ID */ list_for_each_entry(ndlp, &phba->fc_nlpmap_list, nlp_listp) { if (starget->id == ndlp->nlp_sid) { - memcpy(&port_name, &ndlp->nlp_portname, - sizeof(struct lpfc_name)); + port_name = wwn_to_u64(ndlp->nlp_portname.u.wwn); break; } } spin_unlock_irq(shost->host_lock); - fc_starget_port_name(starget) = be64_to_cpu(port_name); + fc_starget_port_name(starget) = port_name; } static void @@ -1218,8 +1515,7 @@ struct fc_function_template lpfc_transport_functions = { */ .get_fc_host_stats = lpfc_get_stats, - - /* the LPFC driver doesn't support resetting stats yet */ + .reset_fc_host_stats = lpfc_reset_stats, .dd_fcrport_size = sizeof(struct lpfc_rport_data), .show_rport_maxframe_size = 1, @@ -1237,25 +1533,31 @@ struct fc_function_template lpfc_transport_functions = { .get_starget_port_name = lpfc_get_starget_port_name, .show_starget_port_name = 1, + + .issue_fc_host_lip = lpfc_issue_lip, }; void lpfc_get_cfgparam(struct lpfc_hba *phba) { - phba->cfg_log_verbose = lpfc_log_verbose; - phba->cfg_cr_delay = lpfc_cr_delay; - phba->cfg_cr_count = lpfc_cr_count; - phba->cfg_lun_queue_depth = lpfc_lun_queue_depth; - phba->cfg_fcp_class = lpfc_fcp_class; - phba->cfg_use_adisc = lpfc_use_adisc; - phba->cfg_ack0 = lpfc_ack0; - phba->cfg_topology = lpfc_topology; - phba->cfg_scan_down = lpfc_scan_down; - phba->cfg_nodev_tmo = lpfc_nodev_tmo; - phba->cfg_link_speed = lpfc_link_speed; - phba->cfg_fdmi_on = lpfc_fdmi_on; - phba->cfg_discovery_threads = lpfc_discovery_threads; - phba->cfg_max_luns = lpfc_max_luns; + lpfc_log_verbose_init(phba, lpfc_log_verbose); + lpfc_cr_delay_init(phba, lpfc_cr_delay); + lpfc_cr_count_init(phba, lpfc_cr_count); + lpfc_multi_ring_support_init(phba, lpfc_multi_ring_support); + lpfc_lun_queue_depth_init(phba, lpfc_lun_queue_depth); + lpfc_fcp_class_init(phba, lpfc_fcp_class); + lpfc_use_adisc_init(phba, lpfc_use_adisc); + lpfc_ack0_init(phba, lpfc_ack0); + lpfc_topology_init(phba, lpfc_topology); + lpfc_scan_down_init(phba, lpfc_scan_down); + lpfc_nodev_tmo_init(phba, lpfc_nodev_tmo); + lpfc_link_speed_init(phba, lpfc_link_speed); + 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 @@ -1287,5 +1589,9 @@ lpfc_get_cfgparam(struct lpfc_hba *phba) default: phba->cfg_hba_queue_depth = LPFC_DFT_HBA_Q_DEPTH; } + + if (phba->cfg_hba_queue_depth > lpfc_hba_queue_depth) + lpfc_hba_queue_depth_init(phba, lpfc_hba_queue_depth); + return; } diff --git a/drivers/scsi/lpfc/lpfc_crtn.h b/drivers/scsi/lpfc/lpfc_crtn.h index ee22173fc..2a176467f 100644 --- a/drivers/scsi/lpfc/lpfc_crtn.h +++ b/drivers/scsi/lpfc/lpfc_crtn.h @@ -127,6 +127,7 @@ void lpfc_config_port(struct lpfc_hba *, LPFC_MBOXQ_t *); void lpfc_kill_board(struct lpfc_hba *, LPFC_MBOXQ_t *); void lpfc_mbox_put(struct lpfc_hba *, LPFC_MBOXQ_t *); LPFC_MBOXQ_t *lpfc_mbox_get(struct lpfc_hba *); +int lpfc_mbox_tmo_val(struct lpfc_hba *, int); int lpfc_mem_alloc(struct lpfc_hba *); void lpfc_mem_free(struct lpfc_hba *); @@ -147,6 +148,7 @@ int lpfc_sli_hba_setup(struct lpfc_hba *); int lpfc_sli_hba_down(struct lpfc_hba *); int lpfc_sli_issue_mbox(struct lpfc_hba *, LPFC_MBOXQ_t *, uint32_t); int lpfc_sli_handle_mb_event(struct lpfc_hba *); +int lpfc_sli_flush_mbox_queue(struct lpfc_hba *); int lpfc_sli_handle_slow_ring_event(struct lpfc_hba *, struct lpfc_sli_ring *, uint32_t); void lpfc_sli_def_mbox_cmpl(struct lpfc_hba *, LPFC_MBOXQ_t *); diff --git a/drivers/scsi/lpfc/lpfc_ct.c b/drivers/scsi/lpfc/lpfc_ct.c index b65ee57af..bbb731021 100644 --- a/drivers/scsi/lpfc/lpfc_ct.c +++ b/drivers/scsi/lpfc/lpfc_ct.c @@ -131,6 +131,7 @@ lpfc_ct_unsol_event(struct lpfc_hba * phba, } ct_unsol_event_exit_piocbq: + list_del(&head); if (pmbuf) { list_for_each_entry_safe(matp, next_matp, &pmbuf->list, list) { lpfc_mbuf_free(phba, matp->virt, matp->phys); @@ -481,7 +482,7 @@ lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, if (CTrsp->CommandResponse.bits.CmdRsp == be16_to_cpu(SLI_CT_RESPONSE_FS_ACC)) { lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY, - "%d:0239 NameServer Rsp " + "%d:0208 NameServer Rsp " "Data: x%x\n", phba->brd_no, phba->fc_flag); @@ -588,13 +589,9 @@ lpfc_get_hba_sym_node_name(struct lpfc_hba * phba, uint8_t * symbp) lpfc_decode_firmware_rev(phba, fwrev, 0); - if (phba->Port[0]) { - sprintf(symbp, "Emulex %s Port %s FV%s DV%s", phba->ModelName, - phba->Port, fwrev, lpfc_release_version); - } else { - sprintf(symbp, "Emulex %s FV%s DV%s", phba->ModelName, - fwrev, lpfc_release_version); - } + sprintf(symbp, "Emulex %s FV%s DV%s", phba->ModelName, + fwrev, lpfc_release_version); + return; } /* diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c index 283b7d824..3567de613 100644 --- a/drivers/scsi/lpfc/lpfc_els.c +++ b/drivers/scsi/lpfc/lpfc_els.c @@ -648,33 +648,32 @@ lpfc_more_plogi(struct lpfc_hba * phba) } static struct lpfc_nodelist * -lpfc_plogi_confirm_nport(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, +lpfc_plogi_confirm_nport(struct lpfc_hba * phba, struct lpfc_dmabuf *prsp, struct lpfc_nodelist *ndlp) { struct lpfc_nodelist *new_ndlp; - struct lpfc_dmabuf *pcmd, *prsp; uint32_t *lp; struct serv_parm *sp; uint8_t name[sizeof (struct lpfc_name)]; uint32_t rc; - pcmd = (struct lpfc_dmabuf *) cmdiocb->context2; - prsp = (struct lpfc_dmabuf *) pcmd->list.next; lp = (uint32_t *) prsp->virt; sp = (struct serv_parm *) ((uint8_t *) lp + sizeof (uint32_t)); + memset(name, 0, sizeof (struct lpfc_name)); /* Now we to find out if the NPort we are logging into, matches the WWPN * we have for that ndlp. If not, we have some work to do. */ new_ndlp = lpfc_findnode_wwpn(phba, NLP_SEARCH_ALL, &sp->portName); - memset(name, 0, sizeof (struct lpfc_name)); - rc = memcmp(&ndlp->nlp_portname, name, sizeof(struct lpfc_name)); - if (!rc || (new_ndlp == ndlp)) { + if (new_ndlp == ndlp) return ndlp; - } if (!new_ndlp) { + rc = + memcmp(&ndlp->nlp_portname, name, sizeof(struct lpfc_name)); + if (!rc) + return ndlp; new_ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_ATOMIC); if (!new_ndlp) return ndlp; @@ -683,17 +682,21 @@ lpfc_plogi_confirm_nport(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, } lpfc_unreg_rpi(phba, new_ndlp); - new_ndlp->nlp_prev_state = ndlp->nlp_state; new_ndlp->nlp_DID = ndlp->nlp_DID; - new_ndlp->nlp_state = NLP_STE_PLOGI_ISSUE; - lpfc_nlp_list(phba, new_ndlp, NLP_PLOGI_LIST); + new_ndlp->nlp_prev_state = ndlp->nlp_prev_state; + new_ndlp->nlp_state = ndlp->nlp_state; + lpfc_nlp_list(phba, new_ndlp, ndlp->nlp_flag & NLP_LIST_MASK); /* Move this back to NPR list */ - lpfc_unreg_rpi(phba, ndlp); - ndlp->nlp_DID = 0; /* Two ndlps cannot have the same did */ - ndlp->nlp_state = NLP_STE_NPR_NODE; - lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST); - + if (memcmp(&ndlp->nlp_portname, name, sizeof(struct lpfc_name)) == 0) { + lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); + } + else { + lpfc_unreg_rpi(phba, ndlp); + ndlp->nlp_DID = 0; /* Two ndlps cannot have the same did */ + ndlp->nlp_state = NLP_STE_NPR_NODE; + lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST); + } return new_ndlp; } @@ -703,6 +706,7 @@ lpfc_cmpl_els_plogi(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, { IOCB_t *irsp; struct lpfc_nodelist *ndlp; + struct lpfc_dmabuf *prsp; int disc, rc, did, type; @@ -769,7 +773,10 @@ lpfc_cmpl_els_plogi(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, } } else { /* Good status, call state machine */ - ndlp = lpfc_plogi_confirm_nport(phba, cmdiocb, ndlp); + prsp = list_entry(((struct lpfc_dmabuf *) + cmdiocb->context2)->list.next, + struct lpfc_dmabuf, list); + ndlp = lpfc_plogi_confirm_nport(phba, prsp, ndlp); rc = lpfc_disc_state_machine(phba, ndlp, cmdiocb, NLP_EVT_CMPL_PLOGI); } @@ -821,7 +828,7 @@ lpfc_issue_els_plogi(struct lpfc_hba * phba, uint32_t did, uint8_t retry) pring = &psli->ring[LPFC_ELS_RING]; /* ELS ring */ cmdsize = (sizeof (uint32_t) + sizeof (struct serv_parm)); - elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, 0, did, + elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, NULL, did, ELS_CMD_PLOGI); if (!elsiocb) return 1; @@ -1841,9 +1848,12 @@ static void lpfc_cmpl_els_acc(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, struct lpfc_iocbq * rspiocb) { + IOCB_t *irsp; struct lpfc_nodelist *ndlp; LPFC_MBOXQ_t *mbox = NULL; + irsp = &rspiocb->iocb; + ndlp = (struct lpfc_nodelist *) cmdiocb->context1; if (cmdiocb->context_un.mbox) mbox = cmdiocb->context_un.mbox; @@ -1886,9 +1896,15 @@ lpfc_cmpl_els_acc(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, mempool_free( mbox, phba->mbox_mem_pool); } else { mempool_free( mbox, phba->mbox_mem_pool); - if (ndlp->nlp_flag & NLP_ACC_REGLOGIN) { - lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); - ndlp = NULL; + /* Do not call NO_LIST 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)))) { + if (ndlp->nlp_flag & NLP_ACC_REGLOGIN) { + lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); + ndlp = NULL; + } } } } @@ -2791,8 +2807,8 @@ lpfc_els_rsp_rps_acc(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb) ndlp = (struct lpfc_nodelist *) pmb->context2; xri = (uint16_t) ((unsigned long)(pmb->context1)); - pmb->context1 = 0; - pmb->context2 = 0; + pmb->context1 = NULL; + pmb->context2 = NULL; if (mb->mbxStatus) { mempool_free( pmb, phba->mbox_mem_pool); @@ -2832,7 +2848,7 @@ lpfc_els_rsp_rps_acc(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb) /* Xmit ELS RPS ACC response tag */ lpfc_printf_log(phba, KERN_INFO, LOG_ELS, - "%d:0128 Xmit ELS RPS ACC response tag x%x " + "%d:0118 Xmit ELS RPS ACC response tag x%x " "Data: x%x x%x x%x x%x x%x\n", phba->brd_no, elsiocb->iocb.ulpIoTag, @@ -2941,7 +2957,7 @@ lpfc_els_rsp_rpl_acc(struct lpfc_hba * phba, uint16_t cmdsize, /* Xmit ELS RPL ACC response tag */ lpfc_printf_log(phba, KERN_INFO, LOG_ELS, - "%d:0128 Xmit ELS RPL ACC response tag x%x " + "%d:0120 Xmit ELS RPL ACC response tag x%x " "Data: x%x x%x x%x x%x x%x\n", phba->brd_no, elsiocb->iocb.ulpIoTag, @@ -3102,7 +3118,7 @@ lpfc_els_rcv_fan(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, struct lpfc_nodelist *ndlp, *next_ndlp; /* FAN received */ - lpfc_printf_log(phba, KERN_INFO, LOG_ELS, "%d:265 FAN received\n", + lpfc_printf_log(phba, KERN_INFO, LOG_ELS, "%d:0265 FAN received\n", phba->brd_no); icmd = &cmdiocb->iocb; @@ -3282,10 +3298,9 @@ lpfc_els_timeout_handler(struct lpfc_hba *phba) } else lpfc_sli_release_iocbq(phba, piocb); } - if (phba->sli.ring[LPFC_ELS_RING].txcmplq_cnt) { - phba->els_tmofunc.expires = jiffies + HZ * timeout; - add_timer(&phba->els_tmofunc); - } + if (phba->sli.ring[LPFC_ELS_RING].txcmplq_cnt) + mod_timer(&phba->els_tmofunc, jiffies + HZ * timeout); + spin_unlock_irq(phba->host->host_lock); } @@ -3442,6 +3457,8 @@ lpfc_els_unsol_event(struct lpfc_hba * phba, if ((did & Fabric_DID_MASK) == Fabric_DID_MASK) { ndlp->nlp_type |= NLP_FABRIC; } + ndlp->nlp_state = NLP_STE_UNUSED_NODE; + lpfc_nlp_list(phba, ndlp, NLP_UNUSED_LIST); } phba->fc_stat.elsRcvFrame++; @@ -3463,13 +3480,14 @@ lpfc_els_unsol_event(struct lpfc_hba * phba, rjt_err = 1; break; } + ndlp = lpfc_plogi_confirm_nport(phba, mp, ndlp); lpfc_disc_state_machine(phba, ndlp, elsiocb, NLP_EVT_RCV_PLOGI); break; case ELS_CMD_FLOGI: phba->fc_stat.elsRcvFLOGI++; lpfc_els_rcv_flogi(phba, elsiocb, ndlp, newnode); if (newnode) { - mempool_free( ndlp, phba->nlp_mem_pool); + lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); } break; case ELS_CMD_LOGO: @@ -3492,7 +3510,7 @@ lpfc_els_unsol_event(struct lpfc_hba * phba, phba->fc_stat.elsRcvRSCN++; lpfc_els_rcv_rscn(phba, elsiocb, ndlp, newnode); if (newnode) { - mempool_free( ndlp, phba->nlp_mem_pool); + lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); } break; case ELS_CMD_ADISC: @@ -3535,28 +3553,28 @@ lpfc_els_unsol_event(struct lpfc_hba * phba, phba->fc_stat.elsRcvLIRR++; lpfc_els_rcv_lirr(phba, elsiocb, ndlp); if (newnode) { - mempool_free( ndlp, phba->nlp_mem_pool); + lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); } break; case ELS_CMD_RPS: phba->fc_stat.elsRcvRPS++; lpfc_els_rcv_rps(phba, elsiocb, ndlp); if (newnode) { - mempool_free( ndlp, phba->nlp_mem_pool); + lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); } break; case ELS_CMD_RPL: phba->fc_stat.elsRcvRPL++; lpfc_els_rcv_rpl(phba, elsiocb, ndlp); if (newnode) { - mempool_free( ndlp, phba->nlp_mem_pool); + lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); } break; case ELS_CMD_RNID: phba->fc_stat.elsRcvRNID++; lpfc_els_rcv_rnid(phba, elsiocb, ndlp); if (newnode) { - mempool_free( ndlp, phba->nlp_mem_pool); + lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); } break; default: @@ -3568,7 +3586,7 @@ lpfc_els_unsol_event(struct lpfc_hba * phba, "%d:0115 Unknown ELS command x%x received from " "NPORT x%x\n", phba->brd_no, cmd, did); if (newnode) { - mempool_free( ndlp, phba->nlp_mem_pool); + lpfc_nlp_list(phba, ndlp, NLP_NO_LIST); } break; } diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index adb086009..b2f1552f1 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c @@ -1084,7 +1084,7 @@ lpfc_register_remote_port(struct lpfc_hba * phba, fc_remote_port_rolechg(rport, rport_ids.roles); if ((rport->scsi_target_id != -1) && - (rport->scsi_target_id < MAX_FCP_TARGET)) { + (rport->scsi_target_id < LPFC_MAX_TARGET)) { ndlp->nlp_sid = rport->scsi_target_id; } @@ -1313,7 +1313,7 @@ lpfc_nlp_list(struct lpfc_hba * phba, struct lpfc_nodelist * nlp, int list) if ((rport_add == mapped) && ((!nlp->rport) || (nlp->rport->scsi_target_id == -1) || - (nlp->rport->scsi_target_id >= MAX_FCP_TARGET))) { + (nlp->rport->scsi_target_id >= LPFC_MAX_TARGET))) { nlp->nlp_state = NLP_STE_UNMAPPED_NODE; spin_lock_irq(phba->host->host_lock); nlp->nlp_flag |= NLP_TGT_NO_SCSIID; @@ -1557,6 +1557,8 @@ lpfc_freenode(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp) mb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; } } + + spin_lock_irq(phba->host->host_lock); list_for_each_entry_safe(mb, nextmb, &phba->sli.mboxq, list) { if ((mb->mb.mbxCommand == MBX_REG_LOGIN64) && (ndlp == (struct lpfc_nodelist *) mb->context2)) { @@ -1569,6 +1571,7 @@ lpfc_freenode(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp) mempool_free(mb, phba->mbox_mem_pool); } } + spin_unlock_irq(phba->host->host_lock); lpfc_els_abort(phba,ndlp,0); spin_lock_irq(phba->host->host_lock); @@ -1782,7 +1785,7 @@ lpfc_findnode_did(struct lpfc_hba * phba, uint32_t order, uint32_t did) /* LOG change to REGLOGIN */ /* FIND node DID reglogin */ lpfc_printf_log(phba, KERN_INFO, LOG_NODE, - "%d:0931 FIND node DID reglogin" + "%d:0901 FIND node DID reglogin" " Data: x%p x%x x%x x%x\n", phba->brd_no, ndlp, ndlp->nlp_DID, @@ -1805,7 +1808,7 @@ lpfc_findnode_did(struct lpfc_hba * phba, uint32_t order, uint32_t did) /* LOG change to PRLI */ /* FIND node DID prli */ lpfc_printf_log(phba, KERN_INFO, LOG_NODE, - "%d:0931 FIND node DID prli " + "%d:0902 FIND node DID prli " "Data: x%p x%x x%x x%x\n", phba->brd_no, ndlp, ndlp->nlp_DID, @@ -1828,7 +1831,7 @@ lpfc_findnode_did(struct lpfc_hba * phba, uint32_t order, uint32_t did) /* LOG change to NPR */ /* FIND node DID npr */ lpfc_printf_log(phba, KERN_INFO, LOG_NODE, - "%d:0931 FIND node DID npr " + "%d:0903 FIND node DID npr " "Data: x%p x%x x%x x%x\n", phba->brd_no, ndlp, ndlp->nlp_DID, @@ -1851,7 +1854,7 @@ lpfc_findnode_did(struct lpfc_hba * phba, uint32_t order, uint32_t did) /* LOG change to UNUSED */ /* FIND node DID unused */ lpfc_printf_log(phba, KERN_INFO, LOG_NODE, - "%d:0931 FIND node DID unused " + "%d:0905 FIND node DID unused " "Data: x%p x%x x%x x%x\n", phba->brd_no, ndlp, ndlp->nlp_DID, @@ -2335,7 +2338,7 @@ lpfc_disc_timeout_handler(struct lpfc_hba *phba) initlinkmbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); if (!initlinkmbox) { lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY, - "%d:0226 Device Discovery " + "%d:0206 Device Discovery " "completion error\n", phba->brd_no); phba->hba_state = LPFC_HBA_ERROR; @@ -2365,7 +2368,7 @@ lpfc_disc_timeout_handler(struct lpfc_hba *phba) if (!clearlambox) { clrlaerr = 1; lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY, - "%d:0226 Device Discovery " + "%d:0207 Device Discovery " "completion error\n", phba->brd_no); phba->hba_state = LPFC_HBA_ERROR; diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 908d0f277..f6948ffe6 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c @@ -71,6 +71,7 @@ lpfc_config_port_prep(struct lpfc_hba * phba) uint16_t offset = 0; static char licensed[56] = "key unlock for use with gnu public licensed code only\0"; + static int init_key = 1; pmb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); if (!pmb) { @@ -82,10 +83,13 @@ lpfc_config_port_prep(struct lpfc_hba * phba) phba->hba_state = LPFC_INIT_MBX_CMDS; if (lpfc_is_LC_HBA(phba->pcidev->device)) { - uint32_t *ptext = (uint32_t *) licensed; + if (init_key) { + uint32_t *ptext = (uint32_t *) licensed; - for (i = 0; i < 56; i += sizeof (uint32_t), ptext++) - *ptext = cpu_to_be32(*ptext); + for (i = 0; i < 56; i += sizeof (uint32_t), ptext++) + *ptext = cpu_to_be32(*ptext); + init_key = 0; + } lpfc_read_nv(phba, pmb); memset((char*)mb->un.varRDnvp.rsvd3, 0, @@ -405,19 +409,26 @@ lpfc_config_port_post(struct lpfc_hba * phba) } /* MBOX buffer will be freed in mbox compl */ - i = 0; + return (0); +} + +static int +lpfc_discovery_wait(struct lpfc_hba *phba) +{ + int i = 0; + while ((phba->hba_state != LPFC_HBA_READY) || (phba->num_disc_nodes) || (phba->fc_prli_sent) || ((phba->fc_map_cnt == 0) && (i<2)) || - (psli->sli_flag & LPFC_SLI_MBOX_ACTIVE)) { + (phba->sli.sli_flag & LPFC_SLI_MBOX_ACTIVE)) { /* Check every second for 30 retries. */ i++; if (i > 30) { - break; + return -ETIMEDOUT; } if ((i >= 15) && (phba->hba_state <= LPFC_LINK_DOWN)) { /* The link is down. Set linkdown timeout */ - break; + return -ETIMEDOUT; } /* Delay for 1 second to give discovery time to complete. */ @@ -425,12 +436,7 @@ lpfc_config_port_post(struct lpfc_hba * phba) } - /* Since num_disc_nodes keys off of PLOGI, delay a bit to let - * any potential PRLIs to flush thru the SLI sub-system. - */ - msleep(50); - - return (0); + return 0; } /************************************************************************/ @@ -939,12 +945,12 @@ lpfc_get_hba_model_desc(struct lpfc_hba * phba, uint8_t * mdp, uint8_t * descp) "10-port ", "PCIe"}; break; default: - m = (typeof(m)){ 0 }; + m = (typeof(m)){ NULL }; break; } break; default: - m = (typeof(m)){ 0 }; + m = (typeof(m)){ NULL }; break; } @@ -1339,7 +1345,8 @@ lpfc_offline(struct lpfc_hba * phba) struct lpfc_sli_ring *pring; struct lpfc_sli *psli; unsigned long iflag; - int i = 0; + int i; + int cnt = 0; if (!phba) return 0; @@ -1348,20 +1355,31 @@ lpfc_offline(struct lpfc_hba * phba) return 0; psli = &phba->sli; - pring = &psli->ring[psli->fcp_ring]; lpfc_linkdown(phba); + lpfc_sli_flush_mbox_queue(phba); - /* The linkdown event takes 30 seconds to timeout. */ - while (pring->txcmplq_cnt) { - mdelay(10); - if (i++ > 3000) - break; + for (i = 0; i < psli->num_rings; i++) { + pring = &psli->ring[i]; + /* The linkdown event takes 30 seconds to timeout. */ + while (pring->txcmplq_cnt) { + mdelay(10); + if (cnt++ > 3000) { + lpfc_printf_log(phba, + KERN_WARNING, LOG_INIT, + "%d:0466 Outstanding IO when " + "bringing Adapter offline\n", + phba->brd_no); + break; + } + } } + /* stop all timers associated with this hba */ lpfc_stop_timer(phba); phba->work_hba_events = 0; + phba->work_ha = 0; lpfc_printf_log(phba, KERN_WARNING, @@ -1451,7 +1469,6 @@ 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); @@ -1600,7 +1617,11 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid) goto out_free_iocbq; } - /* We can rely on a queue depth attribute only after SLI HBA setup */ + /* + * Set initial can_queue value since 0 is no longer supported and + * scsi_add_host will fail. This will be adjusted later based on the + * max xri value determined in hba setup. + */ host->can_queue = phba->cfg_hba_queue_depth - 10; /* Tell the midlayer we support 16 byte commands */ @@ -1620,7 +1641,7 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid) if (error) goto out_remove_host; - error = request_irq(phba->pcidev->irq, lpfc_intr_handler, SA_SHIRQ, + error = request_irq(phba->pcidev->irq, lpfc_intr_handler, IRQF_SHARED, LPFC_DRIVER_NAME, phba); if (error) { lpfc_printf_log(phba, KERN_ERR, LOG_INIT, @@ -1640,6 +1661,14 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid) goto out_free_irq; } + /* + * hba setup may have changed the hba_queue_depth so we need to adjust + * the value of can_queue. + */ + host->can_queue = phba->cfg_hba_queue_depth - 10; + + lpfc_discovery_wait(phba); + if (phba->cfg_poll & DISABLE_FCP_RING_INT) { spin_lock_irq(phba->host->host_lock); lpfc_poll_start_timer(phba); diff --git a/drivers/scsi/lpfc/lpfc_mbox.c b/drivers/scsi/lpfc/lpfc_mbox.c index e42f22aaf..4d016c2a1 100644 --- a/drivers/scsi/lpfc/lpfc_mbox.c +++ b/drivers/scsi/lpfc/lpfc_mbox.c @@ -651,3 +651,19 @@ lpfc_mbox_get(struct lpfc_hba * phba) return mbq; } + +int +lpfc_mbox_tmo_val(struct lpfc_hba *phba, int cmd) +{ + switch (cmd) { + case MBX_WRITE_NV: /* 0x03 */ + case MBX_UPDATE_CFG: /* 0x1B */ + case MBX_DOWN_LOAD: /* 0x1C */ + case MBX_DEL_LD_ENTRY: /* 0x1D */ + case MBX_LOAD_AREA: /* 0x81 */ + case MBX_FLASH_WR_ULA: /* 0x98 */ + case MBX_LOAD_EXP_ROM: /* 0x9C */ + return LPFC_MBOX_TMO_FLASH_CMD; + } + return LPFC_MBOX_TMO; +} diff --git a/drivers/scsi/lpfc/lpfc_mem.c b/drivers/scsi/lpfc/lpfc_mem.c index 07017658a..066292d39 100644 --- a/drivers/scsi/lpfc/lpfc_mem.c +++ b/drivers/scsi/lpfc/lpfc_mem.c @@ -133,6 +133,11 @@ lpfc_mem_free(struct lpfc_hba * phba) pci_pool_destroy(phba->lpfc_scsi_dma_buf_pool); pci_pool_destroy(phba->lpfc_mbuf_pool); + + /* Free the iocb lookup array */ + kfree(psli->iocbq_lookup); + psli->iocbq_lookup = NULL; + } void * diff --git a/drivers/scsi/lpfc/lpfc_nportdisc.c b/drivers/scsi/lpfc/lpfc_nportdisc.c index 27d60ad89..20449a8dd 100644 --- a/drivers/scsi/lpfc/lpfc_nportdisc.c +++ b/drivers/scsi/lpfc/lpfc_nportdisc.c @@ -179,7 +179,7 @@ lpfc_els_abort(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, /* Abort outstanding I/O on NPort */ lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY, - "%d:0201 Abort outstanding I/O on NPort x%x " + "%d:0205 Abort outstanding I/O on NPort x%x " "Data: x%x x%x x%x\n", phba->brd_no, ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi); @@ -393,6 +393,20 @@ lpfc_rcv_plogi(struct lpfc_hba * phba, mbox->context2 = ndlp; ndlp->nlp_flag |= (NLP_ACC_REGLOGIN | NLP_RCV_PLOGI); + /* + * If there is an outstanding PLOGI issued, abort it before + * sending ACC rsp for received PLOGI. If pending plogi + * is not canceled here, the plogi will be rejected by + * remote port and will be retried. On a configuration with + * single discovery thread, this will cause a huge delay in + * discovery. Also this will cause multiple state machines + * running in parallel for this node. + */ + if (ndlp->nlp_state == NLP_STE_PLOGI_ISSUE) { + /* software abort outstanding PLOGI */ + lpfc_els_abort(phba, ndlp, 1); + } + lpfc_els_rsp_acc(phba, ELS_CMD_PLOGI, cmdiocb, ndlp, mbox, 0); return 1; @@ -1110,6 +1124,17 @@ lpfc_cmpl_reglogin_reglogin_issue(struct lpfc_hba * phba, phba->brd_no, did, mb->mbxStatus, phba->hba_state); + /* + * If RegLogin failed due to lack of HBA resources do not + * retry discovery. + */ + if (mb->mbxStatus == MBXERR_RPI_FULL) { + ndlp->nlp_prev_state = NLP_STE_UNUSED_NODE; + ndlp->nlp_state = NLP_STE_UNUSED_NODE; + lpfc_nlp_list(phba, ndlp, NLP_UNUSED_LIST); + return ndlp->nlp_state; + } + /* Put ndlp in npr list set plogi timer for 1 sec */ mod_timer(&ndlp->nlp_delayfunc, jiffies + HZ * 1); spin_lock_irq(phba->host->host_lock); @@ -1590,7 +1615,13 @@ lpfc_rcv_padisc_npr_node(struct lpfc_hba * phba, lpfc_rcv_padisc(phba, ndlp, cmdiocb); - if (!(ndlp->nlp_flag & NLP_DELAY_TMO)) { + /* + * Do not start discovery if discovery is about to start + * or discovery in progress for this node. Starting discovery + * here will affect the counting of discovery threads. + */ + if ((!(ndlp->nlp_flag & NLP_DELAY_TMO)) && + (ndlp->nlp_flag & NLP_NPR_2B_DISC)){ if (ndlp->nlp_flag & NLP_NPR_ADISC) { ndlp->nlp_prev_state = NLP_STE_NPR_NODE; ndlp->nlp_state = NLP_STE_ADISC_ISSUE; diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c index 42fab03ad..a8816a873 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.c +++ b/drivers/scsi/lpfc/lpfc_scsi.c @@ -1,29 +1,27 @@ /******************************************************************* * This file is part of the Emulex Linux Device Driver for * - * Enterprise Fibre Channel Host Bus Adapters. * - * Refer to the README file included with this package for * - * driver version and adapter support. * - * Copyright (C) 2004 Emulex Corporation. * + * Fibre Channel Host Bus Adapters. * + * Copyright (C) 2004-2006 Emulex. All rights reserved. * + * EMULEX and SLI are trademarks of Emulex. * * www.emulex.com * + * Portions Copyright (C) 2004-2005 Christoph Hellwig * * * * 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, a copy of which * - * can be found in the file COPYING included with this package. * + * modify it under the terms of version 2 of the GNU General * + * Public License as published by the Free Software Foundation. * + * This program is distributed in the hope that it will be useful. * + * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND * + * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE * + * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD * + * TO BE LEGALLY INVALID. See the GNU General Public License for * + * more details, a copy of which can be found in the file COPYING * + * included with this package. * *******************************************************************/ -/* - * $Id: lpfc_scsi.c 1.37 2005/04/13 14:27:09EDT sf_support Exp $ - */ - #include #include +#include #include #include @@ -43,11 +41,6 @@ #define LPFC_RESET_WAIT 2 #define LPFC_ABORT_WAIT 2 -static inline void lpfc_put_lun(struct fcp_cmnd *fcmd, unsigned int lun) -{ - fcmd->fcpLunLsl = 0; - fcmd->fcpLunMsl = swab16((uint16_t)lun); -} /* * This routine allocates a scsi buffer, which contains all the necessary @@ -58,12 +51,13 @@ static inline void lpfc_put_lun(struct fcp_cmnd *fcmd, unsigned int lun) * and the BPL BDE is setup in the IOCB. */ static struct lpfc_scsi_buf * -lpfc_get_scsi_buf(struct lpfc_hba * phba) +lpfc_new_scsi_buf(struct lpfc_hba * phba) { struct lpfc_scsi_buf *psb; struct ulp_bde64 *bpl; IOCB_t *iocb; dma_addr_t pdma_phys; + uint16_t iotag; psb = kmalloc(sizeof(struct lpfc_scsi_buf), GFP_KERNEL); if (!psb) @@ -87,6 +81,16 @@ lpfc_get_scsi_buf(struct lpfc_hba * phba) /* Initialize virtual ptrs to dma_buf region. */ memset(psb->data, 0, phba->cfg_sg_dma_buf_size); + /* Allocate iotag for psb->cur_iocbq. */ + iotag = lpfc_sli_next_iotag(phba, &psb->cur_iocbq); + if (iotag == 0) { + pci_pool_free(phba->lpfc_scsi_dma_buf_pool, + psb->data, psb->dma_handle); + kfree (psb); + return NULL; + } + psb->cur_iocbq.iocb_flag |= LPFC_IO_FCP; + psb->fcp_cmnd = psb->data; psb->fcp_rsp = psb->data + sizeof(struct fcp_cmnd); psb->fcp_bpl = psb->data + sizeof(struct fcp_cmnd) + @@ -133,29 +137,28 @@ lpfc_get_scsi_buf(struct lpfc_hba * phba) return psb; } -static void -lpfc_free_scsi_buf(struct lpfc_scsi_buf * psb) +static struct lpfc_scsi_buf* +lpfc_get_scsi_buf(struct lpfc_hba * phba) { - struct lpfc_hba *phba = psb->scsi_hba; + struct lpfc_scsi_buf * lpfc_cmd = NULL; + struct list_head *scsi_buf_list = &phba->lpfc_scsi_buf_list; + 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 - * a request buffer, but did not request use_sg. There is a third - * case, but it does not require resource deallocation. - */ - if ((psb->seg_cnt > 0) && (psb->pCmd->use_sg)) { - dma_unmap_sg(&phba->pcidev->dev, psb->pCmd->request_buffer, - psb->seg_cnt, psb->pCmd->sc_data_direction); - } else { - if ((psb->nonsg_phys) && (psb->pCmd->request_bufflen)) { - dma_unmap_single(&phba->pcidev->dev, psb->nonsg_phys, - psb->pCmd->request_bufflen, - psb->pCmd->sc_data_direction); - } - } + 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; + 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 @@ -241,6 +244,8 @@ lpfc_scsi_prep_dma_buf(struct lpfc_hba * phba, struct lpfc_scsi_buf * lpfc_cmd) bpl->tus.f.bdeSize = scsi_cmnd->request_bufflen; if (datadir == DMA_TO_DEVICE) bpl->tus.f.bdeFlags = 0; + else + bpl->tus.f.bdeFlags = BUFF_USE_RCV; bpl->tus.w = le32_to_cpu(bpl->tus.w); num_bde = 1; bpl++; @@ -248,8 +253,11 @@ lpfc_scsi_prep_dma_buf(struct lpfc_hba * phba, struct lpfc_scsi_buf * lpfc_cmd) /* * Finish initializing those IOCB fields that are dependent on the - * scsi_cmnd request_buffer + * scsi_cmnd request_buffer. Note that the bdeSize is explicitly + * reinitialized since all iocb memory resources are used many times + * for transmit, receive, and continuation bpl's. */ + iocb_cmd->un.fcpi64.bdl.bdeSize = (2 * sizeof (struct ulp_bde64)); iocb_cmd->un.fcpi64.bdl.bdeSize += (num_bde * sizeof (struct ulp_bde64)); iocb_cmd->ulpBdeCount = 1; @@ -258,6 +266,27 @@ lpfc_scsi_prep_dma_buf(struct lpfc_hba * phba, struct lpfc_scsi_buf * lpfc_cmd) return 0; } +static void +lpfc_scsi_unprep_dma_buf(struct lpfc_hba * phba, struct lpfc_scsi_buf * psb) +{ + /* + * There are only two special cases to consider. (1) the scsi command + * requested scatter-gather usage or (2) the scsi command allocated + * a request buffer, but did not request use_sg. There is a third + * case, but it does not require resource deallocation. + */ + if ((psb->seg_cnt > 0) && (psb->pCmd->use_sg)) { + dma_unmap_sg(&phba->pcidev->dev, psb->pCmd->request_buffer, + psb->seg_cnt, psb->pCmd->sc_data_direction); + } else { + if ((psb->nonsg_phys) && (psb->pCmd->request_bufflen)) { + dma_unmap_single(&phba->pcidev->dev, psb->nonsg_phys, + psb->pCmd->request_bufflen, + psb->pCmd->sc_data_direction); + } + } +} + static void lpfc_handle_fcp_err(struct lpfc_scsi_buf *lpfc_cmd) { @@ -372,7 +401,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; @@ -406,14 +437,9 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn, break; } - if (pnode) { - if (pnode->nlp_state != NLP_STE_MAPPED_NODE) - cmd->result = ScsiResult(DID_BUS_BUSY, - SAM_STAT_BUSY); - } - else { - cmd->result = ScsiResult(DID_NO_CONNECT, 0); - } + if ((pnode == NULL ) + || (pnode->nlp_state != NLP_STE_MAPPED_NODE)) + cmd->result = ScsiResult(DID_BUS_BUSY, SAM_STAT_BUSY); } else { cmd->result = ScsiResult(DID_OK, 0); } @@ -429,12 +455,71 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn, *lp, *(lp + 3), cmd->retries, cmd->resid); } - spin_lock_irqsave(phba->host->host_lock, iflag); - lpfc_free_scsi_buf(lpfc_cmd); - cmd->host_scribble = NULL; - spin_unlock_irqrestore(phba->host->host_lock, iflag); - + result = cmd->result; + sdev = cmd->device; cmd->scsi_done(cmd); + + if (phba->cfg_poll & ENABLE_FCP_RING_POLLING) { + lpfc_scsi_unprep_dma_buf(phba, lpfc_cmd); + lpfc_release_scsi_buf(phba, lpfc_cmd); + return; + } + + if (!result && pnode != NULL && + ((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 != NULL) { + 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_scsi_unprep_dma_buf(phba, lpfc_cmd); + lpfc_release_scsi_buf(phba, lpfc_cmd); } static void @@ -448,8 +533,11 @@ lpfc_scsi_prep_cmnd(struct lpfc_hba * phba, struct lpfc_scsi_buf * lpfc_cmd, int datadir = scsi_cmnd->sc_data_direction; lpfc_cmd->fcp_rsp->rspSnsLen = 0; + /* clear task management bits */ + lpfc_cmd->fcp_cmnd->fcpCntl2 = 0; - lpfc_put_lun(lpfc_cmd->fcp_cmnd, lpfc_cmd->pCmd->device->lun); + int_to_scsilun(lpfc_cmd->pCmd->device->lun, + &lpfc_cmd->fcp_cmnd->fcp_lun); memcpy(&fcp_cmnd->fcpCdb[0], scsi_cmnd->cmnd, 16); @@ -529,17 +617,17 @@ lpfc_scsi_prep_cmnd(struct lpfc_hba * phba, struct lpfc_scsi_buf * lpfc_cmd, static int lpfc_scsi_prep_task_mgmt_cmd(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd, + unsigned int lun, uint8_t task_mgmt_cmd) { struct lpfc_sli *psli; struct lpfc_iocbq *piocbq; IOCB_t *piocb; struct fcp_cmnd *fcp_cmnd; - struct scsi_device *scsi_dev = lpfc_cmd->pCmd->device; - struct lpfc_rport_data *rdata = scsi_dev->hostdata; + struct lpfc_rport_data *rdata = lpfc_cmd->rdata; struct lpfc_nodelist *ndlp = rdata->pnode; - if ((ndlp == 0) || (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) { + if ((ndlp == NULL) || (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) { return 0; } @@ -548,7 +636,7 @@ lpfc_scsi_prep_task_mgmt_cmd(struct lpfc_hba *phba, piocb = &piocbq->iocb; fcp_cmnd = lpfc_cmd->fcp_cmnd; - lpfc_put_lun(lpfc_cmd->fcp_cmnd, lpfc_cmd->pCmd->device->lun); + int_to_scsilun(lun, &lpfc_cmd->fcp_cmnd->fcp_lun); fcp_cmnd->fcpCntl2 = task_mgmt_cmd; piocb->ulpCommand = CMD_FCP_ICMND64_CR; @@ -570,74 +658,41 @@ lpfc_scsi_prep_task_mgmt_cmd(struct lpfc_hba *phba, piocb->ulpTimeout = lpfc_cmd->timeout; } - lpfc_cmd->rdata = rdata; - - switch (task_mgmt_cmd) { - case FCP_LUN_RESET: - /* Issue LUN Reset to TGT LUN */ - lpfc_printf_log(phba, - KERN_INFO, - LOG_FCP, - "%d:0703 Issue LUN Reset to TGT %d LUN %d " - "Data: x%x x%x\n", - phba->brd_no, - scsi_dev->id, scsi_dev->lun, - ndlp->nlp_rpi, ndlp->nlp_flag); - - break; - case FCP_ABORT_TASK_SET: - /* Issue Abort Task Set to TGT LUN */ - lpfc_printf_log(phba, - KERN_INFO, - LOG_FCP, - "%d:0701 Issue Abort Task Set to TGT %d LUN %d " - "Data: x%x x%x\n", - phba->brd_no, - scsi_dev->id, scsi_dev->lun, - ndlp->nlp_rpi, ndlp->nlp_flag); - - break; - case FCP_TARGET_RESET: - /* Issue Target Reset to TGT */ - lpfc_printf_log(phba, - KERN_INFO, - LOG_FCP, - "%d:0702 Issue Target Reset to TGT %d " - "Data: x%x x%x\n", - phba->brd_no, - scsi_dev->id, ndlp->nlp_rpi, - ndlp->nlp_flag); - break; - } - return (1); } static int -lpfc_scsi_tgt_reset(struct lpfc_scsi_buf * lpfc_cmd, struct lpfc_hba * phba) +lpfc_scsi_tgt_reset(struct lpfc_scsi_buf * lpfc_cmd, struct lpfc_hba * phba, + unsigned tgt_id, unsigned int lun, + struct lpfc_rport_data *rdata) { struct lpfc_iocbq *iocbq; - struct lpfc_iocbq *iocbqrsp = NULL; - struct list_head *lpfc_iocb_list = &phba->lpfc_iocb_list; + struct lpfc_iocbq *iocbqrsp; int ret; - ret = lpfc_scsi_prep_task_mgmt_cmd(phba, lpfc_cmd, FCP_TARGET_RESET); + lpfc_cmd->rdata = rdata; + ret = lpfc_scsi_prep_task_mgmt_cmd(phba, lpfc_cmd, lun, + FCP_TARGET_RESET); if (!ret) return FAILED; lpfc_cmd->scsi_hba = phba; iocbq = &lpfc_cmd->cur_iocbq; - list_remove_head(lpfc_iocb_list, iocbqrsp, struct lpfc_iocbq, list); + iocbqrsp = lpfc_sli_get_iocbq(phba); + if (!iocbqrsp) return FAILED; - memset(iocbqrsp, 0, sizeof (struct lpfc_iocbq)); - - iocbq->iocb_flag |= LPFC_IO_POLL; - ret = lpfc_sli_issue_iocb_wait_high_priority(phba, - &phba->sli.ring[phba->sli.fcp_ring], - iocbq, SLI_IOCB_HIGH_PRIORITY, - iocbqrsp, - lpfc_cmd->timeout); + + /* Issue Target Reset to TGT */ + lpfc_printf_log(phba, KERN_INFO, LOG_FCP, + "%d:0702 Issue Target Reset to TGT %d " + "Data: x%x x%x\n", + phba->brd_no, tgt_id, rdata->pnode->nlp_rpi, + rdata->pnode->nlp_flag); + + ret = lpfc_sli_issue_iocb_wait(phba, + &phba->sli.ring[phba->sli.fcp_ring], + iocbq, iocbqrsp, lpfc_cmd->timeout); if (ret != IOCB_SUCCESS) { lpfc_cmd->status = IOSTAT_DRIVER_REJECT; ret = FAILED; @@ -650,49 +705,14 @@ lpfc_scsi_tgt_reset(struct lpfc_scsi_buf * lpfc_cmd, struct lpfc_hba * phba) lpfc_cmd->status = IOSTAT_DRIVER_REJECT; } - /* - * All outstanding txcmplq I/Os should have been aborted by the target. - * 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], - lpfc_cmd->pCmd->device->id, - lpfc_cmd->pCmd->device->lun, 0, LPFC_CTX_TGT); - - /* Return response IOCB to free list. */ - list_add_tail(&iocbqrsp->list, lpfc_iocb_list); + lpfc_sli_release_iocbq(phba, iocbqrsp); return ret; } -static void -lpfc_scsi_cmd_iocb_cleanup (struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn, - struct lpfc_iocbq *pIocbOut) -{ - unsigned long iflag; - struct lpfc_scsi_buf *lpfc_cmd = - (struct lpfc_scsi_buf *) pIocbIn->context1; - - spin_lock_irqsave(phba->host->host_lock, iflag); - lpfc_free_scsi_buf(lpfc_cmd); - spin_unlock_irqrestore(phba->host->host_lock, iflag); -} - -static void -lpfc_scsi_cmd_iocb_cmpl_aborted(struct lpfc_hba *phba, - struct lpfc_iocbq *pIocbIn, - struct lpfc_iocbq *pIocbOut) -{ - struct scsi_cmnd *ml_cmd = - ((struct lpfc_scsi_buf *) pIocbIn->context1)->pCmd; - - lpfc_scsi_cmd_iocb_cleanup (phba, pIocbIn, pIocbOut); - ml_cmd->host_scribble = NULL; -} - const char * lpfc_info(struct Scsi_Host *host) { - struct lpfc_hba *phba = (struct lpfc_hba *) host->hostdata[0]; + struct lpfc_hba *phba = (struct lpfc_hba *) host->hostdata; int len; static char lpfcinfobuf[384]; @@ -717,50 +737,68 @@ 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 *)) { struct lpfc_hba *phba = - (struct lpfc_hba *) cmnd->device->host->hostdata[0]; + (struct lpfc_hba *) cmnd->device->host->hostdata; struct lpfc_sli *psli = &phba->sli; struct lpfc_rport_data *rdata = cmnd->device->hostdata; struct lpfc_nodelist *ndlp = rdata->pnode; - struct lpfc_scsi_buf *lpfc_cmd = NULL; - struct list_head *scsi_buf_list = &phba->lpfc_scsi_buf_list; - int err = 0; + struct lpfc_scsi_buf *lpfc_cmd; + struct fc_rport *rport = starget_to_rport(scsi_target(cmnd->device)); + int err; - /* - * The target pointer is guaranteed not to be NULL because the driver - * only clears the device->hostdata field in lpfc_slave_destroy. This - * approach guarantees no further IO calls on this target. - */ - if (!ndlp) { - cmnd->result = ScsiResult(DID_NO_CONNECT, 0); + err = fc_remote_port_chkready(rport); + if (err) { + cmnd->result = err; goto out_fail_command; } /* - * A Fibre Channel target is present and functioning only when the node - * state is MAPPED. Any other state is a failure. + * Catch race where our node has transitioned, but the + * transport is still transitioning. */ - if (ndlp->nlp_state != NLP_STE_MAPPED_NODE) { - if ((ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) || - (ndlp->nlp_state == NLP_STE_UNUSED_NODE)) { - cmnd->result = ScsiResult(DID_NO_CONNECT, 0); - goto out_fail_command; - } - /* - * The device is most likely recovered and the driver - * needs a bit more time to finish. Ask the midlayer - * to retry. - */ - goto out_host_busy; + if (!ndlp) { + cmnd->result = ScsiResult(DID_BUS_BUSY, 0); + goto out_fail_command; } - - list_remove_head(scsi_buf_list, lpfc_cmd, struct lpfc_scsi_buf, list); + 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; } @@ -784,11 +822,18 @@ 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_free_scsi_buf(lpfc_cmd); - cmnd->host_scribble = NULL; + lpfc_scsi_unprep_dma_buf(phba, lpfc_cmd); + lpfc_release_scsi_buf(phba, lpfc_cmd); out_host_busy: return SCSI_MLQUEUE_HOST_BUSY; @@ -797,141 +842,140 @@ lpfc_queuecommand(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd *)) return 0; } +static void +lpfc_block_error_handler(struct scsi_cmnd *cmnd) +{ + struct Scsi_Host *shost = cmnd->device->host; + struct fc_rport *rport = starget_to_rport(scsi_target(cmnd->device)); + + spin_lock_irq(shost->host_lock); + while (rport->port_state == FC_PORTSTATE_BLOCKED) { + spin_unlock_irq(shost->host_lock); + msleep(1000); + spin_lock_irq(shost->host_lock); + } + spin_unlock_irq(shost->host_lock); + return; +} + static int 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; struct lpfc_sli_ring *pring = &phba->sli.ring[phba->sli.fcp_ring]; - struct lpfc_iocbq *iocb, *next_iocb; - struct lpfc_iocbq *abtsiocb = NULL; + struct lpfc_iocbq *iocb; + struct lpfc_iocbq *abtsiocb; struct lpfc_scsi_buf *lpfc_cmd; - struct list_head *lpfc_iocb_list = &phba->lpfc_iocb_list; IOCB_t *cmd, *icmd; - unsigned long snum; - unsigned int id, lun; unsigned int loop_count = 0; - int ret = IOCB_SUCCESS; + int ret = SUCCESS; - /* - * If the host_scribble data area is NULL, then the driver has already - * completed this command, but the midlayer did not see the completion - * before the eh fired. Just return SUCCESS. - */ - lpfc_cmd = (struct lpfc_scsi_buf *)cmnd->host_scribble; - if (!lpfc_cmd) - return SUCCESS; + lpfc_block_error_handler(cmnd); + spin_lock_irq(shost->host_lock); - /* save these now since lpfc_cmd can be freed */ - id = lpfc_cmd->pCmd->device->id; - lun = lpfc_cmd->pCmd->device->lun; - snum = lpfc_cmd->pCmd->serial_number; + lpfc_cmd = (struct lpfc_scsi_buf *)cmnd->host_scribble; + BUG_ON(!lpfc_cmd); - list_for_each_entry_safe(iocb, next_iocb, &pring->txq, list) { - cmd = &iocb->iocb; - if (iocb->context1 != lpfc_cmd) - continue; + /* + * If pCmd field of the corresponding lpfc_scsi_buf structure + * points to a different SCSI command, then the driver has + * already completed this command, but the midlayer did not + * see the completion before the eh fired. Just return + * SUCCESS. + */ + iocb = &lpfc_cmd->cur_iocbq; + if (lpfc_cmd->pCmd != cmnd) + goto out; - list_del_init(&iocb->list); - pring->txq_cnt--; - if (!iocb->iocb_cmpl) { - list_add_tail(&iocb->list, lpfc_iocb_list); - } - else { - cmd->ulpStatus = IOSTAT_LOCAL_REJECT; - cmd->un.ulpWord[4] = IOERR_SLI_ABORTED; - lpfc_scsi_cmd_iocb_cmpl_aborted(phba, iocb, iocb); - } + BUG_ON(iocb->context1 != lpfc_cmd); + abtsiocb = lpfc_sli_get_iocbq(phba); + if (abtsiocb == NULL) { + ret = FAILED; goto out; } - list_remove_head(lpfc_iocb_list, abtsiocb, struct lpfc_iocbq, list); - if (abtsiocb == NULL) - return FAILED; - - memset(abtsiocb, 0, sizeof (struct lpfc_iocbq)); - /* - * The scsi command was not in the txq. Check the txcmplq and if it is - * found, send an abort to the FW. + * The scsi command can not be in txq and it is in flight because the + * pCmd is still pointig at the SCSI command we have to abort. There + * is no need to search the txcmplq. Just send an abort to the FW. */ - list_for_each_entry_safe(iocb, next_iocb, &pring->txcmplq, list) { - if (iocb->context1 != lpfc_cmd) - continue; - iocb->iocb_cmpl = lpfc_scsi_cmd_iocb_cmpl_aborted; - cmd = &iocb->iocb; - icmd = &abtsiocb->iocb; - icmd->un.acxri.abortType = ABORT_TYPE_ABTS; - icmd->un.acxri.abortContextTag = cmd->ulpContext; - icmd->un.acxri.abortIoTag = cmd->ulpIoTag; - - icmd->ulpLe = 1; - icmd->ulpClass = cmd->ulpClass; - if (phba->hba_state >= LPFC_LINK_UP) - icmd->ulpCommand = CMD_ABORT_XRI_CN; - else - icmd->ulpCommand = CMD_CLOSE_XRI_CN; + cmd = &iocb->iocb; + icmd = &abtsiocb->iocb; + icmd->un.acxri.abortType = ABORT_TYPE_ABTS; + icmd->un.acxri.abortContextTag = cmd->ulpContext; + icmd->un.acxri.abortIoTag = cmd->ulpIoTag; - if (lpfc_sli_issue_iocb(phba, pring, abtsiocb, 0) == - IOCB_ERROR) { - list_add_tail(&abtsiocb->list, lpfc_iocb_list); - ret = IOCB_ERROR; - break; - } + icmd->ulpLe = 1; + icmd->ulpClass = cmd->ulpClass; + if (phba->hba_state >= LPFC_LINK_UP) + icmd->ulpCommand = CMD_ABORT_XRI_CN; + else + icmd->ulpCommand = CMD_CLOSE_XRI_CN; - /* Wait for abort to complete */ - while (cmnd->host_scribble) - { - spin_unlock_irq(phba->host->host_lock); - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(LPFC_ABORT_WAIT*HZ); - spin_lock_irq(phba->host->host_lock); - if (++loop_count - > (2 * phba->cfg_nodev_tmo)/LPFC_ABORT_WAIT) - break; - } + abtsiocb->iocb_cmpl = lpfc_sli_abort_fcp_cmpl; + if (lpfc_sli_issue_iocb(phba, pring, abtsiocb, 0) == IOCB_ERROR) { + lpfc_sli_release_iocbq(phba, abtsiocb); + ret = FAILED; + goto out; + } - if(cmnd->host_scribble) { - lpfc_printf_log(phba, KERN_ERR, LOG_FCP, - "%d:0748 abort handler timed " - "out waiting for abort to " - "complete. Data: " - "x%x x%x x%x x%lx\n", - phba->brd_no, ret, id, lun, snum); - cmnd->host_scribble = NULL; - iocb->iocb_cmpl = lpfc_scsi_cmd_iocb_cleanup; - ret = IOCB_ERROR; - } + 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); - break; + spin_unlock_irq(phba->host->host_lock); + schedule_timeout_uninterruptible(LPFC_ABORT_WAIT*HZ); + spin_lock_irq(phba->host->host_lock); + if (++loop_count + > (2 * phba->cfg_nodev_tmo)/LPFC_ABORT_WAIT) + break; + } + + if (lpfc_cmd->pCmd == cmnd) { + ret = FAILED; + lpfc_printf_log(phba, KERN_ERR, LOG_FCP, + "%d:0748 abort handler timed out waiting for " + "abort to complete: ret %#x, ID %d, LUN %d, " + "snum %#lx\n", + phba->brd_no, ret, cmnd->device->id, + cmnd->device->lun, cmnd->serial_number); } out: lpfc_printf_log(phba, KERN_WARNING, LOG_FCP, - "%d:0749 SCSI layer issued abort device " - "Data: x%x x%x x%x x%lx\n", - phba->brd_no, ret, id, lun, snum); + "%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 == IOCB_SUCCESS ? SUCCESS : FAILED; + spin_unlock_irq(shost->host_lock); + + return ret; } static int lpfc_reset_lun_handler(struct scsi_cmnd *cmnd) { struct Scsi_Host *shost = cmnd->device->host; - struct lpfc_hba *phba = (struct lpfc_hba *)shost->hostdata[0]; - struct lpfc_sli *psli = &phba->sli; - struct lpfc_scsi_buf *lpfc_cmd = NULL; - struct list_head *scsi_buf_list = &phba->lpfc_scsi_buf_list; - struct list_head *lpfc_iocb_list = &phba->lpfc_iocb_list; - struct lpfc_iocbq *iocbq, *iocbqrsp = NULL; + struct lpfc_hba *phba = (struct lpfc_hba *)shost->hostdata; + struct lpfc_scsi_buf *lpfc_cmd; + 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_error_handler(cmnd); + 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. @@ -942,117 +986,120 @@ lpfc_reset_lun_handler(struct scsi_cmnd *cmnd) if (pnode->nlp_state != NLP_STE_MAPPED_NODE) { spin_unlock_irq(phba->host->host_lock); - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout( HZ/2); + schedule_timeout_uninterruptible(msecs_to_jiffies(500)); spin_lock_irq(phba->host->host_lock); } if ((pnode) && (pnode->nlp_state == NLP_STE_MAPPED_NODE)) break; } - list_remove_head(scsi_buf_list, lpfc_cmd, struct lpfc_scsi_buf, list); + lpfc_cmd = lpfc_get_scsi_buf (phba); if (lpfc_cmd == NULL) goto out; - lpfc_cmd->pCmd = cmnd; lpfc_cmd->timeout = 60; lpfc_cmd->scsi_hba = phba; + lpfc_cmd->rdata = rdata; - ret = lpfc_scsi_prep_task_mgmt_cmd(phba, lpfc_cmd, FCP_LUN_RESET); + ret = lpfc_scsi_prep_task_mgmt_cmd(phba, lpfc_cmd, cmnd->device->lun, + FCP_LUN_RESET); if (!ret) goto out_free_scsi_buf; iocbq = &lpfc_cmd->cur_iocbq; /* get a buffer for this IOCB command response */ - list_remove_head(lpfc_iocb_list, iocbqrsp, struct lpfc_iocbq, list); + iocbqrsp = lpfc_sli_get_iocbq(phba); if (iocbqrsp == NULL) goto out_free_scsi_buf; - memset(iocbqrsp, 0, sizeof (struct lpfc_iocbq)); - - iocbq->iocb_flag |= LPFC_IO_POLL; - iocbq->iocb_cmpl = lpfc_sli_wake_iocb_high_priority; + lpfc_printf_log(phba, KERN_INFO, LOG_FCP, + "%d:0703 Issue LUN Reset to TGT %d LUN %d " + "Data: x%x x%x\n", phba->brd_no, cmnd->device->id, + cmnd->device->lun, pnode->nlp_rpi, pnode->nlp_flag); - ret = lpfc_sli_issue_iocb_wait_high_priority(phba, - &phba->sli.ring[psli->fcp_ring], - iocbq, 0, iocbqrsp, 60); + ret = lpfc_sli_issue_iocb_wait(phba, + &phba->sli.ring[phba->sli.fcp_ring], + iocbq, iocbqrsp, lpfc_cmd->timeout); 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); /* - * 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); - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(LPFC_RESET_WAIT*HZ); + schedule_timeout_uninterruptible(LPFC_RESET_WAIT*HZ); spin_lock_irq(phba->host->host_lock); 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) { - lpfc_printf_log(phba, KERN_INFO, LOG_FCP, + lpfc_printf_log(phba, KERN_ERR, LOG_FCP, "%d:0719 LUN Reset I/O flush failure: cnt x%x\n", phba->brd_no, cnt); + ret = FAILED; } - list_add_tail(&iocbqrsp->list, lpfc_iocb_list); - out_free_scsi_buf: + lpfc_release_scsi_buf(phba, lpfc_cmd); + 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_free_scsi_buf(lpfc_cmd); + phba->brd_no, cmnd->device->id,cmnd->device->lun, + ret, cmd_status, cmd_result); + out: + spin_unlock_irq(shost->host_lock); return ret; } -/* - * Note: midlayer calls this function with the host_lock held - */ static int 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]; + struct lpfc_hba *phba = (struct lpfc_hba *)shost->hostdata; struct lpfc_nodelist *ndlp = NULL; int match; int ret = FAILED, i, err_count = 0; int cnt, loopcnt; - unsigned int midlayer_id = 0; - struct lpfc_scsi_buf * lpfc_cmd = NULL; - struct list_head *scsi_buf_list = &phba->lpfc_scsi_buf_list; + struct lpfc_scsi_buf * lpfc_cmd; - list_remove_head(scsi_buf_list, lpfc_cmd, struct lpfc_scsi_buf, list); + lpfc_block_error_handler(cmnd); + spin_lock_irq(shost->host_lock); + + lpfc_cmd = lpfc_get_scsi_buf(phba); if (lpfc_cmd == NULL) goto out; /* The lpfc_cmd storage is reused. Set all loop invariants. */ lpfc_cmd->timeout = 60; - lpfc_cmd->pCmd = cmnd; lpfc_cmd->scsi_hba = phba; /* @@ -1060,8 +1107,7 @@ lpfc_reset_bus_handler(struct scsi_cmnd *cmnd) * targets known to the driver. Should any target reset * fail, this routine returns failure to the midlayer. */ - midlayer_id = cmnd->device->id; - for (i = 0; i < MAX_FCP_TARGET; i++) { + for (i = 0; i < LPFC_MAX_TARGET; i++) { /* Search the mapped list for this target ID */ match = 0; list_for_each_entry(ndlp, &phba->fc_nlpmap_list, nlp_listp) { @@ -1073,127 +1119,115 @@ lpfc_reset_bus_handler(struct scsi_cmnd *cmnd) if (!match) continue; - lpfc_cmd->pCmd->device->id = i; - lpfc_cmd->pCmd->device->hostdata = ndlp->rport->dd_data; - ret = lpfc_scsi_tgt_reset(lpfc_cmd, phba); + ret = lpfc_scsi_tgt_reset(lpfc_cmd, phba, i, cmnd->device->lun, + ndlp->rport->dd_data); if (ret != SUCCESS) { - lpfc_printf_log(phba, KERN_INFO, LOG_FCP, - "%d:0713 Bus Reset on target %d failed\n", + lpfc_printf_log(phba, KERN_ERR, LOG_FCP, + "%d:0700 Bus Reset on target %d failed\n", phba->brd_no, i); err_count++; } } - cmnd->device->id = midlayer_id; + 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. + */ + 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); - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(LPFC_RESET_WAIT*HZ); + schedule_timeout_uninterruptible(LPFC_RESET_WAIT*HZ); spin_lock_irq(phba->host->host_lock); 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); + ret = FAILED; } - if (!err_count) - ret = SUCCESS; - - lpfc_free_scsi_buf(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); return ret; } static int lpfc_slave_alloc(struct scsi_device *sdev) { - struct lpfc_hba *phba = (struct lpfc_hba *)sdev->host->hostdata[0]; - struct lpfc_nodelist *ndlp = NULL; - int match = 0; + struct lpfc_hba *phba = (struct lpfc_hba *)sdev->host->hostdata; struct lpfc_scsi_buf *scsi_buf = NULL; + struct fc_rport *rport = starget_to_rport(scsi_target(sdev)); uint32_t total = 0, i; uint32_t num_to_alloc = 0; unsigned long flags; - struct list_head *listp; - struct list_head *node_list[6]; - /* - * Store the target pointer in the scsi_device hostdata pointer provided - * the driver has already discovered the target id. - */ - - /* Search the nlp lists other than unmap_list for this target ID */ - node_list[0] = &phba->fc_npr_list; - node_list[1] = &phba->fc_nlpmap_list; - node_list[2] = &phba->fc_prli_list; - node_list[3] = &phba->fc_reglogin_list; - node_list[4] = &phba->fc_adisc_list; - node_list[5] = &phba->fc_plogi_list; - - for (i = 0; i < 6 && !match; i++) { - listp = node_list[i]; - if (list_empty(listp)) - continue; - list_for_each_entry(ndlp, listp, nlp_listp) { - if ((sdev->id == ndlp->nlp_sid) && ndlp->rport) { - match = 1; - break; - } - } - } - - if (!match) + if (!rport || fc_remote_port_chkready(rport)) return -ENXIO; - sdev->hostdata = ndlp->rport->dd_data; + sdev->hostdata = rport->dd_data; /* * Populate the cmds_per_lun count scsi_bufs into this host's globally * available list of scsi buffers. Don't allocate more than the - * HBA limit conveyed to the midlayer via the host structure. Note - * that this list of scsi bufs exists for the lifetime of the driver. + * HBA limit conveyed to the midlayer via the host structure. The + * formula accounts for the lun_queue_depth + error handlers + 1 + * extra. This list of scsi bufs exists for the lifetime of the driver. */ total = phba->total_scsi_bufs; - num_to_alloc = LPFC_CMD_PER_LUN; + num_to_alloc = phba->cfg_lun_queue_depth + 2; if (total >= phba->cfg_hba_queue_depth) { - printk(KERN_WARNING "%s, At config limitation of " - "%d allocated scsi_bufs\n", __FUNCTION__, total); + lpfc_printf_log(phba, KERN_WARNING, LOG_FCP, + "%d:0704 At limitation of %d preallocated " + "command buffers\n", phba->brd_no, total); return 0; } else if (total + num_to_alloc > phba->cfg_hba_queue_depth) { + lpfc_printf_log(phba, KERN_WARNING, LOG_FCP, + "%d:0705 Allocation request of %d command " + "buffers will exceed max of %d. Reducing " + "allocation request to %d.\n", phba->brd_no, + num_to_alloc, phba->cfg_hba_queue_depth, + (phba->cfg_hba_queue_depth - total)); num_to_alloc = phba->cfg_hba_queue_depth - total; } for (i = 0; i < num_to_alloc; i++) { - scsi_buf = lpfc_get_scsi_buf(phba); + scsi_buf = lpfc_new_scsi_buf(phba); if (!scsi_buf) { - printk(KERN_ERR "%s, failed to allocate " - "scsi_buf\n", __FUNCTION__); + lpfc_printf_log(phba, KERN_ERR, LOG_FCP, + "%d:0706 Failed to allocate command " + "buffer\n", phba->brd_no); 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; } @@ -1201,7 +1235,7 @@ lpfc_slave_alloc(struct scsi_device *sdev) static int lpfc_slave_configure(struct scsi_device *sdev) { - struct lpfc_hba *phba = (struct lpfc_hba *) sdev->host->hostdata[0]; + struct lpfc_hba *phba = (struct lpfc_hba *) sdev->host->hostdata; struct fc_rport *rport = starget_to_rport(sdev->sdev_target); if (sdev->tagged_supported) @@ -1217,6 +1251,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; } @@ -1243,4 +1283,5 @@ struct scsi_host_template lpfc_template = { .cmd_per_lun = LPFC_CMD_PER_LUN, .use_clustering = ENABLE_CLUSTERING, .shost_attrs = lpfc_host_attrs, + .max_sectors = 0xFFFF, }; diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index bb69a7a1e..70f4d5a13 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c @@ -191,35 +191,12 @@ static int lpfc_sli_ringtxcmpl_put(struct lpfc_hba * phba, struct lpfc_sli_ring * pring, struct lpfc_iocbq * piocb) { - uint16_t iotag; - list_add_tail(&piocb->list, &pring->txcmplq); pring->txcmplq_cnt++; if (unlikely(pring->ringno == LPFC_ELS_RING)) mod_timer(&phba->els_tmofunc, jiffies + HZ * (phba->fc_ratov << 1)); - if (pring->fast_lookup) { - /* Setup fast lookup based on iotag for completion */ - iotag = piocb->iocb.ulpIoTag; - if (iotag && (iotag < pring->fast_iotag)) - *(pring->fast_lookup + iotag) = piocb; - else { - - /* Cmd ring put: iotag greater then - configured max wd0 */ - lpfc_printf_log(phba, - KERN_ERR, - LOG_SLI, - "%d:0316 Cmd ring %d put: iotag x%x " - "greater then configured max x%x " - "wd0 x%x\n", - phba->brd_no, - pring->ringno, iotag, - pring->fast_iotag, - *(((uint32_t *)(&piocb->iocb)) + 7)); - } - } return (0); } @@ -343,7 +320,8 @@ lpfc_sli_next_iotag(struct lpfc_hba * phba, struct lpfc_iocbq * iocbq) kfree(old_arr); return iotag; } - } + } else + spin_unlock_irq(phba->host->host_lock); lpfc_printf_log(phba, KERN_ERR,LOG_SLI, "%d:0318 Failed to allocate IOTAG.last IOTAG is %d\n", @@ -601,7 +579,7 @@ lpfc_sli_handle_mb_event(struct lpfc_hba * phba) /* Stray Mailbox Interrupt, mbxCommand mbxStatus */ lpfc_printf_log(phba, - KERN_ERR, + KERN_WARNING, LOG_MBOX | LOG_SLI, "%d:0304 Stray Mailbox Interrupt " "mbxCommand x%x mbxStatus x%x\n", @@ -992,9 +970,11 @@ void lpfc_sli_poll_fcp_ring(struct lpfc_hba * phba) * 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); + lpfc_printf_log(phba, KERN_INFO, LOG_SLI, + "%d:0314 IOCB cmd 0x%x" + " processed. Skipping" + " completion", phba->brd_no, + irsp->ulpCommand); break; } @@ -1127,7 +1107,7 @@ lpfc_sli_handle_fast_ring_event(struct lpfc_hba * phba, if (unlikely(irsp->ulpStatus)) { /* Rsp ring error: IOCB */ lpfc_printf_log(phba, KERN_WARNING, LOG_SLI, - "%d:0326 Rsp Ring %d error: IOCB Data: " + "%d:0336 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], @@ -1145,9 +1125,11 @@ lpfc_sli_handle_fast_ring_event(struct lpfc_hba * phba, * 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); + lpfc_printf_log(phba, KERN_INFO, LOG_SLI, + "%d:0333 IOCB cmd 0x%x" + " processed. Skipping" + " completion\n", phba->brd_no, + irsp->ulpCommand); break; } @@ -1178,7 +1160,7 @@ lpfc_sli_handle_fast_ring_event(struct lpfc_hba * phba, } else { /* Unknown IOCB command */ lpfc_printf_log(phba, KERN_ERR, LOG_SLI, - "%d:0321 Unknown IOCB command " + "%d:0334 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, @@ -1261,7 +1243,7 @@ lpfc_sli_handle_slow_ring_event(struct lpfc_hba * phba, lpfc_printf_log(phba, KERN_ERR, LOG_SLI, - "%d:0312 Ring %d handler: portRspPut %d " + "%d:0303 Ring %d handler: portRspPut %d " "is bigger then rsp ring %d\n", phba->brd_no, pring->ringno, portRspPut, portRspMax); @@ -1406,7 +1388,7 @@ lpfc_sli_handle_slow_ring_event(struct lpfc_hba * phba, lpfc_printf_log(phba, KERN_ERR, LOG_SLI, - "%d:0321 Unknown IOCB command " + "%d:0335 Unknown IOCB command " "Data: x%x x%x x%x x%x\n", phba->brd_no, irsp->ulpCommand, @@ -1422,11 +1404,11 @@ lpfc_sli_handle_slow_ring_event(struct lpfc_hba * phba, next_iocb, &saveq->list, list) { + list_del(&rspiocbp->list); lpfc_sli_release_iocbq(phba, rspiocbp); } } - lpfc_sli_release_iocbq(phba, saveq); } } @@ -1570,8 +1552,8 @@ lpfc_sli_brdready(struct lpfc_hba * phba, uint32_t mask) void lpfc_reset_barrier(struct lpfc_hba * phba) { - uint32_t * resp_buf; - uint32_t * mbox_buf; + uint32_t __iomem *resp_buf; + uint32_t __iomem *mbox_buf; volatile uint32_t mbox; uint32_t hc_copy; int i; @@ -1587,7 +1569,7 @@ void lpfc_reset_barrier(struct lpfc_hba * phba) * Tell the other part of the chip to suspend temporarily all * its DMA activity. */ - resp_buf = (uint32_t *)phba->MBslimaddr; + resp_buf = phba->MBslimaddr; /* Disable the error attention */ hc_copy = readl(phba->HCregaddr); @@ -1605,7 +1587,7 @@ void lpfc_reset_barrier(struct lpfc_hba * phba) ((MAILBOX_t *)&mbox)->mbxOwner = OWN_CHIP; writel(BARRIER_TEST_PATTERN, (resp_buf + 1)); - mbox_buf = (uint32_t *)phba->MBslimaddr; + mbox_buf = phba->MBslimaddr; writel(mbox, mbox_buf); for (i = 0; @@ -1734,15 +1716,13 @@ lpfc_sli_brdreset(struct lpfc_hba * phba) phba->fc_myDID = 0; phba->fc_prevDID = 0; - psli->sli_flag = 0; - /* Turn off parity checking and serr during the physical reset */ pci_read_config_word(phba->pcidev, PCI_COMMAND, &cfg_value); pci_write_config_word(phba->pcidev, PCI_COMMAND, (cfg_value & ~(PCI_COMMAND_PARITY | PCI_COMMAND_SERR))); - psli->sli_flag &= ~LPFC_SLI2_ACTIVE; + psli->sli_flag &= ~(LPFC_SLI2_ACTIVE | LPFC_PROCESS_LA); /* Now toggle INITFF bit in the Host Control Register */ writel(HC_INITFF, phba->HCregaddr); mdelay(1); @@ -1783,7 +1763,7 @@ lpfc_sli_brdrestart(struct lpfc_hba * phba) /* Restart HBA */ lpfc_printf_log(phba, KERN_INFO, LOG_SLI, - "%d:0328 Restart HBA Data: x%x x%x\n", phba->brd_no, + "%d:0337 Restart HBA Data: x%x x%x\n", phba->brd_no, phba->hba_state, psli->sli_flag); word0 = 0; @@ -1805,7 +1785,7 @@ lpfc_sli_brdrestart(struct lpfc_hba * phba) skip_post = 0; word0 = 0; /* This is really setting up word1 */ } - to_slim = (uint8_t *) phba->MBslimaddr + sizeof (uint32_t); + to_slim = phba->MBslimaddr + sizeof (uint32_t); writel(*(uint32_t *) mb, to_slim); readl(to_slim); /* flush */ @@ -1815,6 +1795,9 @@ lpfc_sli_brdrestart(struct lpfc_hba * phba) spin_unlock_irq(phba->host->host_lock); + memset(&psli->lnk_stat_offsets, 0, sizeof(psli->lnk_stat_offsets)); + psli->stats_start = get_seconds(); + if (skip_post) mdelay(100); else @@ -1925,6 +1908,9 @@ lpfc_sli_hba_setup(struct lpfc_hba * phba) } while (resetcount < 2 && !done) { + spin_lock_irq(phba->host->host_lock); + phba->sli.sli_flag |= LPFC_SLI_MBOX_ACTIVE; + spin_unlock_irq(phba->host->host_lock); phba->hba_state = LPFC_STATE_UNKNOWN; lpfc_sli_brdrestart(phba); msleep(2500); @@ -1932,6 +1918,9 @@ lpfc_sli_hba_setup(struct lpfc_hba * phba) if (rc) break; + spin_lock_irq(phba->host->host_lock); + phba->sli.sli_flag &= ~LPFC_SLI_MBOX_ACTIVE; + spin_unlock_irq(phba->host->host_lock); resetcount++; /* Call pre CONFIG_PORT mailbox command initialization. A value of 0 @@ -2217,7 +2206,8 @@ lpfc_sli_issue_mbox(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmbox, uint32_t flag) return (MBX_NOT_FINISHED); } /* timeout active mbox command */ - mod_timer(&psli->mbox_tmo, jiffies + HZ * LPFC_MBOX_TMO); + mod_timer(&psli->mbox_tmo, (jiffies + + (HZ * lpfc_mbox_tmo_val(phba, mb->mbxCommand)))); } /* Mailbox cmd issue */ @@ -2277,7 +2267,6 @@ lpfc_sli_issue_mbox(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmbox, uint32_t flag) break; case MBX_POLL: - i = 0; psli->mbox_active = NULL; if (psli->sli_flag & LPFC_SLI2_ACTIVE) { /* First read mbox status word */ @@ -2291,11 +2280,14 @@ lpfc_sli_issue_mbox(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmbox, uint32_t flag) /* Read the HBA Host Attention Register */ ha_copy = readl(phba->HAregaddr); + i = lpfc_mbox_tmo_val(phba, mb->mbxCommand); + i *= 1000; /* Convert to ms */ + /* Wait for command to complete */ while (((word0 & OWN_CHIP) == OWN_CHIP) || (!(ha_copy & HA_MBATT) && (phba->hba_state > LPFC_WARM_START))) { - if (i++ >= 100) { + if (i-- <= 0) { psli->sli_flag &= ~LPFC_SLI_MBOX_ACTIVE; spin_unlock_irqrestore(phba->host->host_lock, drvr_flag); @@ -2313,7 +2305,7 @@ lpfc_sli_issue_mbox(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmbox, uint32_t flag) /* Can be in interrupt context, do not sleep */ /* (or might be called with interrupts disabled) */ - mdelay(i); + mdelay(1); spin_lock_irqsave(phba->host->host_lock, drvr_flag); @@ -2659,8 +2651,6 @@ lpfc_sli_hba_down(struct lpfc_hba * phba) INIT_LIST_HEAD(&(pring->txq)); - kfree(pring->fast_lookup); - pring->fast_lookup = NULL; } spin_unlock_irqrestore(phba->host->host_lock, flags); @@ -3030,7 +3020,7 @@ lpfc_sli_issue_iocb_wait(struct lpfc_hba * phba, if (timeleft == 0) { lpfc_printf_log(phba, KERN_ERR, LOG_SLI, - "%d:0329 IOCB wait timeout error - no " + "%d:0338 IOCB wait timeout error - no " "wake response Data x%x\n", phba->brd_no, timeout); retval = IOCB_TIMEDOUT; @@ -3110,6 +3100,24 @@ lpfc_sli_issue_mbox_wait(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmboxq, return retval; } +int +lpfc_sli_flush_mbox_queue(struct lpfc_hba * phba) +{ + int i = 0; + + while (phba->sli.sli_flag & LPFC_SLI_MBOX_ACTIVE && !phba->stopped) { + if (i++ > LPFC_MBOX_TMO * 1000) + return 1; + + if (lpfc_sli_handle_mb_event(phba) == 0) + i = 0; + + msleep(1); + } + + return (phba->sli.sli_flag & LPFC_SLI_MBOX_ACTIVE) ? 1 : 0; +} + irqreturn_t lpfc_intr_handler(int irq, void *dev_id, struct pt_regs * regs) { diff --git a/drivers/scsi/lpfc/lpfc_sli.h b/drivers/scsi/lpfc/lpfc_sli.h index a52d6c6cf..e26de6809 100644 --- a/drivers/scsi/lpfc/lpfc_sli.h +++ b/drivers/scsi/lpfc/lpfc_sli.h @@ -135,8 +135,6 @@ struct lpfc_sli_ring { uint32_t fast_iotag; /* max fastlookup based iotag */ uint32_t iotag_ctr; /* keeps track of the next iotag to use */ uint32_t iotag_max; /* max iotag value to use */ - struct lpfc_iocbq ** fast_lookup; /* array of IOCB ptrs indexed by - iotag */ struct list_head txq; uint16_t txq_cnt; /* current length of queue */ uint16_t txq_max; /* max length */ @@ -174,6 +172,18 @@ struct lpfc_sli_stat { uint32_t mbox_busy; /* Mailbox cmd busy */ }; +/* Structure to store link status values when port stats are reset */ +struct lpfc_lnk_stat { + uint32_t link_failure_count; + uint32_t loss_of_sync_count; + uint32_t loss_of_signal_count; + uint32_t prim_seq_protocol_err_count; + uint32_t invalid_tx_word_count; + uint32_t invalid_crc_count; + uint32_t error_frames; + uint32_t link_events; +}; + /* Structure used to hold SLI information */ struct lpfc_sli { uint32_t num_rings; @@ -203,6 +213,8 @@ struct lpfc_sli { struct lpfc_iocbq ** iocbq_lookup; /* array to lookup IOCB by IOTAG */ size_t iocbq_lookup_len; /* current lengs of the array */ uint16_t last_iotag; /* last allocated IOTAG */ + unsigned long stats_start; /* in seconds */ + struct lpfc_lnk_stat lnk_stat_offsets; }; /* Given a pointer to the start of the ring, and the slot number of @@ -213,3 +225,9 @@ struct lpfc_sli { #define LPFC_MBOX_TMO 30 /* Sec tmo for outstanding mbox command */ +#define LPFC_MBOX_TMO_FLASH_CMD 300 /* Sec tmo for outstanding FLASH write + * or erase cmds. This is especially + * long because of the potential of + * multiple flash erases that can be + * spawned. + */ diff --git a/drivers/scsi/lpfc/lpfc_version.h b/drivers/scsi/lpfc/lpfc_version.h index 6b737568b..c7091ea29 100644 --- a/drivers/scsi/lpfc/lpfc_version.h +++ b/drivers/scsi/lpfc/lpfc_version.h @@ -18,7 +18,7 @@ * included with this package. * *******************************************************************/ -#define LPFC_DRIVER_VERSION "8.1.6" +#define LPFC_DRIVER_VERSION "8.1.9" #define LPFC_DRIVER_NAME "lpfc" diff --git a/drivers/scsi/mac53c94.c b/drivers/scsi/mac53c94.c index 93edaa869..89ef34df5 100644 --- a/drivers/scsi/mac53c94.c +++ b/drivers/scsi/mac53c94.c @@ -378,7 +378,7 @@ static void set_dma_cmds(struct fsc_state *state, struct scsi_cmnd *cmd) int nseg; total = 0; - scl = (struct scatterlist *) cmd->buffer; + scl = (struct scatterlist *) cmd->request_buffer; nseg = pci_map_sg(state->pdev, scl, cmd->use_sg, cmd->sc_data_direction); for (i = 0; i < nseg; ++i) { diff --git a/drivers/scsi/mac_esp.c b/drivers/scsi/mac_esp.c index e31fadd61..118206d68 100644 --- a/drivers/scsi/mac_esp.c +++ b/drivers/scsi/mac_esp.c @@ -43,9 +43,6 @@ /* #define DEBUG_MAC_ESP */ -#define mac_turnon_irq(x) mac_enable_irq(x) -#define mac_turnoff_irq(x) mac_disable_irq(x) - extern void esp_handle(struct NCR_ESP *esp); extern void mac_esp_intr(int irq, void *dev_id, struct pt_regs *pregs); @@ -639,13 +636,13 @@ static void dma_init_write(struct NCR_ESP * esp, char * vaddress, int length) static void dma_ints_off(struct NCR_ESP * esp) { - mac_turnoff_irq(esp->irq); + disable_irq(esp->irq); } static void dma_ints_on(struct NCR_ESP * esp) { - mac_turnon_irq(esp->irq); + enable_irq(esp->irq); } /* diff --git a/drivers/scsi/mac_scsi.c b/drivers/scsi/mac_scsi.c index 777f9bcd1..a942a21dd 100644 --- a/drivers/scsi/mac_scsi.c +++ b/drivers/scsi/mac_scsi.c @@ -65,9 +65,6 @@ #define RESET_BOOT #define DRIVER_SETUP -#define ENABLE_IRQ() mac_enable_irq( IRQ_MAC_SCSI ); -#define DISABLE_IRQ() mac_disable_irq( IRQ_MAC_SCSI ); - extern void via_scsi_clear(void); #ifdef RESET_BOOT @@ -351,7 +348,7 @@ static void mac_scsi_reset_boot(struct Scsi_Host *instance) printk(KERN_INFO "Macintosh SCSI: resetting the SCSI bus..." ); /* switch off SCSI IRQ - catch an interrupt without IRQ bit set else */ - mac_disable_irq(IRQ_MAC_SCSI); + disable_irq(IRQ_MAC_SCSI); /* get in phase */ NCR5380_write( TARGET_COMMAND_REG, @@ -369,7 +366,7 @@ static void mac_scsi_reset_boot(struct Scsi_Host *instance) barrier(); /* switch on SCSI IRQ again */ - mac_enable_irq(IRQ_MAC_SCSI); + enable_irq(IRQ_MAC_SCSI); printk(KERN_INFO " done\n" ); } diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c index de35ffe2f..76edbb639 100644 --- a/drivers/scsi/megaraid.c +++ b/drivers/scsi/megaraid.c @@ -524,7 +524,7 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy) * filter the internal and ioctl commands */ if((cmd->cmnd[0] == MEGA_INTERNAL_CMD)) { - return cmd->buffer; + return cmd->request_buffer; } @@ -1828,7 +1828,7 @@ mega_build_sglist(adapter_t *adapter, scb_t *scb, u32 *buf, u32 *len) scb->dma_type = MEGA_SGLIST; - if( sgcnt > adapter->sglen ) BUG(); + BUG_ON(sgcnt > adapter->sglen); *len = 0; @@ -4492,7 +4492,7 @@ mega_internal_command(adapter_t *adapter, megacmd_t *mc, mega_passthru *pthru) scmd->device = sdev; scmd->device->host = adapter->host; - scmd->buffer = (void *)scb; + scmd->request_buffer = (void *)scb; scmd->cmnd[0] = MEGA_INTERNAL_CMD; scb->state |= SCB_ACTIVE; @@ -4714,7 +4714,7 @@ megaraid_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) if (request_irq(irq, (adapter->flag & BOARD_MEMMAP) ? megaraid_isr_memmapped : megaraid_isr_iomapped, - SA_SHIRQ, "megaraid", adapter)) { + IRQF_SHARED, "megaraid", adapter)) { printk(KERN_WARNING "megaraid: Couldn't register IRQ %d!\n", irq); goto out_free_scb_list; diff --git a/drivers/scsi/megaraid/mega_common.h b/drivers/scsi/megaraid/mega_common.h index 467534322..8cd0bd1d0 100644 --- a/drivers/scsi/megaraid/mega_common.h +++ b/drivers/scsi/megaraid/mega_common.h @@ -37,6 +37,12 @@ #define LSI_MAX_CHANNELS 16 #define LSI_MAX_LOGICAL_DRIVES_64LD (64+1) +#define HBA_SIGNATURE_64_BIT 0x299 +#define PCI_CONF_AMISIG64 0xa4 + +#define MEGA_SCSI_INQ_EVPD 1 +#define MEGA_INVALID_FIELD_IN_CDB 0x24 + /** * scb_t - scsi command control block diff --git a/drivers/scsi/megaraid/megaraid_ioctl.h b/drivers/scsi/megaraid/megaraid_ioctl.h index bdaee144a..b8aa34202 100644 --- a/drivers/scsi/megaraid/megaraid_ioctl.h +++ b/drivers/scsi/megaraid/megaraid_ioctl.h @@ -132,6 +132,10 @@ typedef struct uioc { /* Driver Data: */ void __user * user_data; uint32_t user_data_len; + + /* 64bit alignment */ + uint32_t pad_for_64bit_align; + mraid_passthru_t __user *user_pthru; mraid_passthru_t *pthru32; diff --git a/drivers/scsi/megaraid/megaraid_mbox.c b/drivers/scsi/megaraid/megaraid_mbox.c index bec1424ed..cd982c877 100644 --- a/drivers/scsi/megaraid/megaraid_mbox.c +++ b/drivers/scsi/megaraid/megaraid_mbox.c @@ -10,7 +10,7 @@ * 2 of the License, or (at your option) any later version. * * FILE : megaraid_mbox.c - * Version : v2.20.4.8 (Apr 11 2006) + * Version : v2.20.4.9 (Jul 16 2006) * * Authors: * Atul Mukker @@ -714,12 +714,13 @@ megaraid_io_detach(adapter_t *adapter) * . Allocate memory required for all the commands * . Use internal library of FW routines, build up complete soft state */ -static int __init +static int __devinit megaraid_init_mbox(adapter_t *adapter) { struct pci_dev *pdev; mraid_device_t *raid_dev; int i; + uint32_t magic64; adapter->ito = MBOX_TIMEOUT; @@ -767,7 +768,7 @@ megaraid_init_mbox(adapter_t *adapter) // // request IRQ and register the interrupt service routine - if (request_irq(adapter->irq, megaraid_isr, SA_SHIRQ, "megaraid", + if (request_irq(adapter->irq, megaraid_isr, IRQF_SHARED, "megaraid", adapter)) { con_log(CL_ANN, (KERN_WARNING @@ -863,12 +864,33 @@ megaraid_init_mbox(adapter_t *adapter) // Set the DMA mask to 64-bit. All supported controllers as capable of // DMA in this range - if (pci_set_dma_mask(adapter->pdev, DMA_64BIT_MASK) != 0) { - - con_log(CL_ANN, (KERN_WARNING - "megaraid: could not set DMA mask for 64-bit.\n")); + pci_read_config_dword(adapter->pdev, PCI_CONF_AMISIG64, &magic64); + + if (((magic64 == HBA_SIGNATURE_64_BIT) && + ((adapter->pdev->subsystem_device != + PCI_SUBSYS_ID_MEGARAID_SATA_150_6) || + (adapter->pdev->subsystem_device != + PCI_SUBSYS_ID_MEGARAID_SATA_150_4))) || + (adapter->pdev->vendor == PCI_VENDOR_ID_LSI_LOGIC && + adapter->pdev->device == PCI_DEVICE_ID_VERDE) || + (adapter->pdev->vendor == PCI_VENDOR_ID_LSI_LOGIC && + adapter->pdev->device == PCI_DEVICE_ID_DOBSON) || + (adapter->pdev->vendor == PCI_VENDOR_ID_LSI_LOGIC && + adapter->pdev->device == PCI_DEVICE_ID_LINDSAY) || + (adapter->pdev->vendor == PCI_VENDOR_ID_DELL && + adapter->pdev->device == PCI_DEVICE_ID_PERC4_DI_EVERGLADES) || + (adapter->pdev->vendor == PCI_VENDOR_ID_DELL && + adapter->pdev->device == PCI_DEVICE_ID_PERC4E_DI_KOBUK)) { + if (pci_set_dma_mask(adapter->pdev, DMA_64BIT_MASK)) { + con_log(CL_ANN, (KERN_WARNING + "megaraid: DMA mask for 64-bit failed\n")); - goto out_free_sysfs_res; + if (pci_set_dma_mask (adapter->pdev, DMA_32BIT_MASK)) { + con_log(CL_ANN, (KERN_WARNING + "megaraid: 32-bit DMA mask failed\n")); + goto out_free_sysfs_res; + } + } } // setup tasklet for DPC @@ -1622,6 +1644,14 @@ megaraid_mbox_build_cmd(adapter_t *adapter, struct scsi_cmnd *scp, int *busy) rdev->last_disp |= (1L << SCP2CHANNEL(scp)); } + if (scp->cmnd[1] & MEGA_SCSI_INQ_EVPD) { + scp->sense_buffer[0] = 0x70; + scp->sense_buffer[2] = ILLEGAL_REQUEST; + scp->sense_buffer[12] = MEGA_INVALID_FIELD_IN_CDB; + scp->result = CHECK_CONDITION << 1; + return NULL; + } + /* Fall through */ case READ_CAPACITY: diff --git a/drivers/scsi/megaraid/megaraid_mbox.h b/drivers/scsi/megaraid/megaraid_mbox.h index 868fb0ec9..2b5a3285f 100644 --- a/drivers/scsi/megaraid/megaraid_mbox.h +++ b/drivers/scsi/megaraid/megaraid_mbox.h @@ -21,8 +21,8 @@ #include "megaraid_ioctl.h" -#define MEGARAID_VERSION "2.20.4.8" -#define MEGARAID_EXT_VERSION "(Release Date: Mon Apr 11 12:27:22 EST 2006)" +#define MEGARAID_VERSION "2.20.4.9" +#define MEGARAID_EXT_VERSION "(Release Date: Sun Jul 16 12:27:22 EST 2006)" /* diff --git a/drivers/scsi/megaraid/megaraid_mm.c b/drivers/scsi/megaraid/megaraid_mm.c index e8f534fb3..d85b9a8f1 100644 --- a/drivers/scsi/megaraid/megaraid_mm.c +++ b/drivers/scsi/megaraid/megaraid_mm.c @@ -10,7 +10,7 @@ * 2 of the License, or (at your option) any later version. * * FILE : megaraid_mm.c - * Version : v2.20.2.6 (Mar 7 2005) + * Version : v2.20.2.7 (Jul 16 2006) * * Common management module */ diff --git a/drivers/scsi/megaraid/megaraid_mm.h b/drivers/scsi/megaraid/megaraid_mm.h index 3d9e67d68..c8762b2b8 100644 --- a/drivers/scsi/megaraid/megaraid_mm.h +++ b/drivers/scsi/megaraid/megaraid_mm.h @@ -27,9 +27,9 @@ #include "megaraid_ioctl.h" -#define LSI_COMMON_MOD_VERSION "2.20.2.6" +#define LSI_COMMON_MOD_VERSION "2.20.2.7" #define LSI_COMMON_MOD_EXT_VERSION \ - "(Release Date: Mon Mar 7 00:01:03 EST 2005)" + "(Release Date: Sun Jul 16 00:01:03 EST 2006)" #define LSI_DBGLVL dbglevel diff --git a/drivers/scsi/megaraid/megaraid_sas.c b/drivers/scsi/megaraid/megaraid_sas.c index 39729460b..a8c9627a1 100644 --- a/drivers/scsi/megaraid/megaraid_sas.c +++ b/drivers/scsi/megaraid/megaraid_sas.c @@ -10,7 +10,7 @@ * 2 of the License, or (at your option) any later version. * * FILE : megaraid_sas.c - * Version : v00.00.02.04 + * Version : v00.00.03.01 * * Authors: * Sreenivas Bagalkote @@ -55,19 +55,25 @@ static struct pci_device_id megasas_pci_table[] = { { PCI_VENDOR_ID_LSI_LOGIC, - PCI_DEVICE_ID_LSI_SAS1064R, // xscale IOP + PCI_DEVICE_ID_LSI_SAS1064R, /* xscale IOP */ PCI_ANY_ID, PCI_ANY_ID, }, { PCI_VENDOR_ID_LSI_LOGIC, - PCI_DEVICE_ID_LSI_SAS1078R, // ppc IOP + PCI_DEVICE_ID_LSI_SAS1078R, /* ppc IOP */ PCI_ANY_ID, PCI_ANY_ID, }, + { + PCI_VENDOR_ID_LSI_LOGIC, + PCI_DEVICE_ID_LSI_VERDE_ZCR, /* xscale IOP, vega */ + PCI_ANY_ID, + PCI_ANY_ID, + }, { PCI_VENDOR_ID_DELL, - PCI_DEVICE_ID_DELL_PERC5, // xscale IOP + PCI_DEVICE_ID_DELL_PERC5, /* xscale IOP */ PCI_ANY_ID, PCI_ANY_ID, }, @@ -289,9 +295,14 @@ static struct megasas_instance_template megasas_instance_template_ppc = { * @regs: MFI register set */ static inline void -megasas_disable_intr(struct megasas_register_set __iomem * regs) +megasas_disable_intr(struct megasas_instance *instance) { u32 mask = 0x1f; + struct megasas_register_set __iomem *regs = instance->reg_set; + + if(instance->pdev->device == PCI_DEVICE_ID_LSI_SAS1078R) + mask = 0xffffffff; + writel(mask, ®s->outbound_intr_mask); /* Dummy readl to force pci flush */ @@ -741,7 +752,6 @@ static int megasas_queue_command(struct scsi_cmnd *scmd, void (*done) (struct scsi_cmnd *)) { u32 frame_count; - unsigned long flags; struct megasas_cmd *cmd; struct megasas_instance *instance; @@ -776,9 +786,7 @@ megasas_queue_command(struct scsi_cmnd *scmd, void (*done) (struct scsi_cmnd *)) /* * Issue the command to the FW */ - spin_lock_irqsave(&instance->instance_lock, flags); - instance->fw_outstanding++; - spin_unlock_irqrestore(&instance->instance_lock, flags); + atomic_inc(&instance->fw_outstanding); instance->instancet->fire_cmd(cmd->frame_phys_addr ,cmd->frame_count-1,instance->reg_set); @@ -826,19 +834,20 @@ static int megasas_wait_for_outstanding(struct megasas_instance *instance) for (i = 0; i < wait_time; i++) { - if (!instance->fw_outstanding) + int outstanding = atomic_read(&instance->fw_outstanding); + + if (!outstanding) break; if (!(i % MEGASAS_RESET_NOTICE_INTERVAL)) { printk(KERN_NOTICE "megasas: [%2d]waiting for %d " - "commands to complete\n", i, - instance->fw_outstanding); + "commands to complete\n",i,outstanding); } msleep(1000); } - if (instance->fw_outstanding) { + if (atomic_read(&instance->fw_outstanding)) { instance->hw_crit_error = 1; return FAILED; } @@ -1050,7 +1059,6 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd, { int exception = 0; struct megasas_header *hdr = &cmd->frame->hdr; - unsigned long flags; if (cmd->scmd) { cmd->scmd->SCp.ptr = (char *)0; @@ -1082,9 +1090,7 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd, if (exception) { - spin_lock_irqsave(&instance->instance_lock, flags); - instance->fw_outstanding--; - spin_unlock_irqrestore(&instance->instance_lock, flags); + atomic_dec(&instance->fw_outstanding); megasas_unmap_sgbuf(instance, cmd); cmd->scmd->scsi_done(cmd->scmd); @@ -1132,9 +1138,7 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd, break; } - spin_lock_irqsave(&instance->instance_lock, flags); - instance->fw_outstanding--; - spin_unlock_irqrestore(&instance->instance_lock, flags); + atomic_dec(&instance->fw_outstanding); megasas_unmap_sgbuf(instance, cmd); cmd->scmd->scsi_done(cmd->scmd); @@ -1267,7 +1271,7 @@ megasas_transition_to_ready(struct megasas_instance* instance) /* * Bring it to READY state; assuming max wait 2 secs */ - megasas_disable_intr(instance->reg_set); + megasas_disable_intr(instance); writel(MFI_INIT_READY, &instance->reg_set->inbound_doorbell); max_wait = 10; @@ -1763,6 +1767,11 @@ static int megasas_init_mfi(struct megasas_instance *instance) init_frame->data_xfer_len = sizeof(struct megasas_init_queue_info); + /* + * disable the intr before firing the init frame to FW + */ + megasas_disable_intr(instance); + /* * Issue the init frame in polled mode */ @@ -2171,11 +2180,12 @@ megasas_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) */ INIT_LIST_HEAD(&instance->cmd_pool); + atomic_set(&instance->fw_outstanding,0); + init_waitqueue_head(&instance->int_cmd_wait_q); init_waitqueue_head(&instance->abort_cmd_wait_q); spin_lock_init(&instance->cmd_pool_lock); - spin_lock_init(&instance->instance_lock); sema_init(&instance->aen_mutex, 1); sema_init(&instance->ioctl_sem, MEGASAS_INT_CMDS); @@ -2197,7 +2207,7 @@ megasas_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) /* * Register IRQ */ - if (request_irq(pdev->irq, megasas_isr, SA_SHIRQ, "megasas", instance)) { + if (request_irq(pdev->irq, megasas_isr, IRQF_SHARED, "megasas", instance)) { printk(KERN_DEBUG "megasas: Failed to register IRQ\n"); goto fail_irq; } @@ -2240,7 +2250,7 @@ megasas_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) megasas_mgmt_info.max_index--; pci_set_drvdata(pdev, NULL); - megasas_disable_intr(instance->reg_set); + megasas_disable_intr(instance); free_irq(instance->pdev->irq, instance); megasas_release_mfi(instance); @@ -2370,7 +2380,7 @@ static void megasas_detach_one(struct pci_dev *pdev) pci_set_drvdata(instance->pdev, NULL); - megasas_disable_intr(instance->reg_set); + megasas_disable_intr(instance); free_irq(instance->pdev->irq, instance); diff --git a/drivers/scsi/megaraid/megaraid_sas.h b/drivers/scsi/megaraid/megaraid_sas.h index 89639f0c3..3531a1422 100644 --- a/drivers/scsi/megaraid/megaraid_sas.h +++ b/drivers/scsi/megaraid/megaraid_sas.h @@ -18,9 +18,16 @@ /** * MegaRAID SAS Driver meta data */ -#define MEGASAS_VERSION "00.00.02.04" -#define MEGASAS_RELDATE "Feb 03, 2006" -#define MEGASAS_EXT_VERSION "Fri Feb 03 14:31:44 PST 2006" +#define MEGASAS_VERSION "00.00.03.01" +#define MEGASAS_RELDATE "May 14, 2006" +#define MEGASAS_EXT_VERSION "Sun May 14 22:49:52 PDT 2006" + +/* + * Device IDs + */ +#define PCI_DEVICE_ID_LSI_SAS1078R 0x0060 +#define PCI_DEVICE_ID_LSI_VERDE_ZCR 0x0413 + /* * ===================================== * MegaRAID SAS MFI firmware definitions @@ -554,7 +561,11 @@ struct megasas_ctrl_info { #define MFI_POLL_TIMEOUT_SECS 10 #define MFI_REPLY_1078_MESSAGE_INTERRUPT 0x80000000 -#define PCI_DEVICE_ID_LSI_SAS1078R 0x00000060 + +/* +* register set for both 1068 and 1078 controllers +* structure extended for 1078 registers +*/ struct megasas_register_set { u32 reserved_0[4]; /*0000h*/ @@ -1077,9 +1088,8 @@ struct megasas_instance { struct pci_dev *pdev; u32 unique_id; - u32 fw_outstanding; + atomic_t fw_outstanding; u32 hw_crit_error; - spinlock_t instance_lock; struct megasas_instance_template *instancet; }; @@ -1151,10 +1161,10 @@ struct compat_megasas_iocpacket { struct compat_iovec sgl[MAX_IOCTL_SGE]; } __attribute__ ((packed)); +#define MEGASAS_IOC_FIRMWARE32 _IOWR('M', 1, struct compat_megasas_iocpacket) #endif #define MEGASAS_IOC_FIRMWARE _IOWR('M', 1, struct megasas_iocpacket) -#define MEGASAS_IOC_FIRMWARE32 _IOWR('M', 1, struct compat_megasas_iocpacket) #define MEGASAS_IOC_GET_AEN _IOW('M', 3, struct megasas_aen) struct megasas_mgmt_info { diff --git a/drivers/scsi/mesh.c b/drivers/scsi/mesh.c index f85242100..5572981a9 100644 --- a/drivers/scsi/mesh.c +++ b/drivers/scsi/mesh.c @@ -18,7 +18,6 @@ * - retry arbitration if lost (unless higher levels do this for us) * - power down the chip when no device is detected */ -#include #include #include #include @@ -1269,7 +1268,7 @@ static void set_dma_cmds(struct mesh_state *ms, struct scsi_cmnd *cmd) if (cmd->use_sg > 0) { int nseg; total = 0; - scl = (struct scatterlist *) cmd->buffer; + scl = (struct scatterlist *) cmd->request_buffer; off = ms->data_ptr; nseg = pci_map_sg(ms->pdev, scl, cmd->use_sg, cmd->sc_data_direction); diff --git a/drivers/scsi/ncr53c8xx.c b/drivers/scsi/ncr53c8xx.c index 22f913127..b28712df0 100644 --- a/drivers/scsi/ncr53c8xx.c +++ b/drivers/scsi/ncr53c8xx.c @@ -529,7 +529,7 @@ 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, + dma_unmap_sg(dev, cmd->request_buffer, cmd->use_sg, cmd->sc_data_direction); break; case 1: @@ -564,7 +564,7 @@ static int __map_scsi_sg_data(struct device *dev, struct scsi_cmnd *cmd) if (cmd->use_sg == 0) return 0; - use_sg = dma_map_sg(dev, cmd->buffer, cmd->use_sg, + use_sg = dma_map_sg(dev, cmd->request_buffer, cmd->use_sg, cmd->sc_data_direction); cmd->__data_mapped = 2; cmd->__data_mapping = use_sg; @@ -5118,8 +5118,7 @@ static void ncr_ccb_skipped(struct ncb *np, struct ccb *cp) cp->host_status &= ~HS_SKIPMASK; cp->start.schedule.l_paddr = cpu_to_scr(NCB_SCRIPT_PHYS (np, select)); - list_del(&cp->link_ccbq); - list_add_tail(&cp->link_ccbq, &lp->skip_ccbq); + list_move_tail(&cp->link_ccbq, &lp->skip_ccbq); if (cp->queued) { --lp->queuedccbs; } @@ -7697,7 +7696,7 @@ static int ncr_scatter(struct ncb *np, struct ccb *cp, struct scsi_cmnd *cmd) if (!use_sg) segment = ncr_scatter_no_sglist(np, cp, cmd); else if ((use_sg = map_scsi_sg_data(np, cmd)) > 0) { - struct scatterlist *scatter = (struct scatterlist *)cmd->buffer; + struct scatterlist *scatter = (struct scatterlist *)cmd->request_buffer; struct scr_tblmove *data; if (use_sg > MAX_SCATTER) { diff --git a/drivers/scsi/ncr53c8xx.h b/drivers/scsi/ncr53c8xx.h index 0e4e46a01..78818b668 100644 --- a/drivers/scsi/ncr53c8xx.h +++ b/drivers/scsi/ncr53c8xx.h @@ -53,10 +53,8 @@ #ifndef NCR53C8XX_H #define NCR53C8XX_H -#include #include -#include /* ** If you want a driver as small as possible, donnot define the diff --git a/drivers/scsi/nsp32.c b/drivers/scsi/nsp32.c index 30ee0ef4b..bfb4f49e1 100644 --- a/drivers/scsi/nsp32.c +++ b/drivers/scsi/nsp32.c @@ -1636,7 +1636,7 @@ static void nsp32_scsi_done(struct scsi_cmnd *SCpnt) if (SCpnt->use_sg) { pci_unmap_sg(data->Pci, - (struct scatterlist *)SCpnt->buffer, + (struct scatterlist *)SCpnt->request_buffer, SCpnt->use_sg, SCpnt->sc_data_direction); } else { pci_unmap_single(data->Pci, @@ -2866,8 +2866,7 @@ static int nsp32_detect(struct scsi_host_template *sht) */ nsp32_do_bus_reset(data); - ret = request_irq(host->irq, do_nsp32_isr, - SA_SHIRQ | SA_SAMPLE_RANDOM, "nsp32", data); + ret = request_irq(host->irq, do_nsp32_isr, IRQF_SHARED, "nsp32", data); if (ret < 0) { nsp32_msg(KERN_ERR, "Unable to allocate IRQ for NinjaSCSI32 " "SCSI PCI controller. Interrupt: %d", host->irq); @@ -2886,12 +2885,19 @@ static int nsp32_detect(struct scsi_host_template *sht) } #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73)) - scsi_add_host (host, &PCIDEV->dev); + ret = scsi_add_host(host, &PCIDEV->dev); + if (ret) { + nsp32_msg(KERN_ERR, "failed to add scsi host"); + goto free_region; + } scsi_scan_host(host); #endif pci_set_drvdata(PCIDEV, host); return DETECT_OK; + free_region: + release_region(host->io_port, host->n_io_port); + free_irq: free_irq(host->irq, data); diff --git a/drivers/scsi/oktagon_esp.c b/drivers/scsi/oktagon_esp.c index dee426f8c..dd67a68c5 100644 --- a/drivers/scsi/oktagon_esp.c +++ b/drivers/scsi/oktagon_esp.c @@ -6,7 +6,6 @@ * Based on cyber_esp.c */ -#include #if defined(CONFIG_AMIGA) || defined(CONFIG_APUS) #define USE_BOTTOM_HALF @@ -198,7 +197,7 @@ int oktagon_esp_detect(struct scsi_host_template *tpnt) esp->esp_command_dvma = (__u32) cmd_buffer; esp->irq = IRQ_AMIGA_PORTS; - request_irq(IRQ_AMIGA_PORTS, esp_intr, SA_SHIRQ, + request_irq(IRQ_AMIGA_PORTS, esp_intr, IRQF_SHARED, "BSC Oktagon SCSI", esp->ehost); /* Figure out our scsi ID on the bus */ diff --git a/drivers/scsi/oktagon_io.S b/drivers/scsi/oktagon_io.S index 08ce8d80d..8a7340b02 100644 --- a/drivers/scsi/oktagon_io.S +++ b/drivers/scsi/oktagon_io.S @@ -23,7 +23,6 @@ int oktag_from_io(long *addr,long *paddr,long len) * is moved to/from the IO register. */ -#include #ifdef CONFIG_APUS diff --git a/drivers/scsi/osst.c b/drivers/scsi/osst.c index e3bd4bc33..4a2fed350 100644 --- a/drivers/scsi/osst.c +++ b/drivers/scsi/osst.c @@ -4724,7 +4724,7 @@ err_out: /* Flush the tape buffer before close */ -static int os_scsi_tape_flush(struct file * filp) +static int os_scsi_tape_flush(struct file * filp, fl_owner_t id) { int result = 0, result2; struct osst_tape * STp = filp->private_data; @@ -5492,7 +5492,7 @@ static int __init osst_setup (char *str) char *stp; stp = get_options(str, ARRAY_SIZE(ints), ints); - + if (ints[0] > 0) { for (i = 0; i < ints[0] && i < ARRAY_SIZE(parms); i++) *parms[i].val = ints[i + 1]; @@ -5507,7 +5507,7 @@ static int __init osst_setup (char *str) break; } } - if (i >= sizeof(parms) / sizeof(struct osst_dev_parm)) + if (i >= ARRAY_SIZE(parms)) printk(KERN_INFO "osst :I: Illegal parameter in '%s'\n", stp); stp = strchr(stp, ','); diff --git a/drivers/scsi/osst.h b/drivers/scsi/osst.h index 011d4d6ca..1e426f5d0 100644 --- a/drivers/scsi/osst.h +++ b/drivers/scsi/osst.h @@ -3,7 +3,6 @@ */ #include -#include #include /* FIXME - rename and use the following two types or delete them! diff --git a/drivers/scsi/pas16.c b/drivers/scsi/pas16.c index f09e94af9..1434209a8 100644 --- a/drivers/scsi/pas16.c +++ b/drivers/scsi/pas16.c @@ -156,7 +156,7 @@ static int default_irqs[] __initdata = static struct override { unsigned short io_port; int irq; -} overrides +} overrides #ifdef PAS16_OVERRIDE [] __initdata = PAS16_OVERRIDE; #else @@ -164,19 +164,19 @@ static struct override { {0,IRQ_AUTO}}; #endif -#define NO_OVERRIDES (sizeof(overrides) / sizeof(struct override)) +#define NO_OVERRIDES ARRAY_SIZE(overrides) static struct base { unsigned short io_port; int noauto; -} bases[] __initdata = +} bases[] __initdata = { {PAS16_DEFAULT_BASE_1, 0}, {PAS16_DEFAULT_BASE_2, 0}, {PAS16_DEFAULT_BASE_3, 0}, {PAS16_DEFAULT_BASE_4, 0} }; -#define NO_BASES (sizeof (bases) / sizeof (struct base)) +#define NO_BASES ARRAY_SIZE(bases) static const unsigned short pas16_offset[ 8 ] = { @@ -454,7 +454,7 @@ int __init pas16_detect(struct scsi_host_template * tpnt) instance->irq = NCR5380_probe_irq(instance, PAS16_IRQS); if (instance->irq != SCSI_IRQ_NONE) - if (request_irq(instance->irq, pas16_intr, SA_INTERRUPT, "pas16", instance)) { + if (request_irq(instance->irq, pas16_intr, IRQF_DISABLED, "pas16", instance)) { printk("scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq); instance->irq = SCSI_IRQ_NONE; diff --git a/drivers/scsi/pcmcia/nsp_cs.c b/drivers/scsi/pcmcia/nsp_cs.c index 231f9c311..0d4c04e1f 100644 --- a/drivers/scsi/pcmcia/nsp_cs.c +++ b/drivers/scsi/pcmcia/nsp_cs.c @@ -1623,7 +1623,7 @@ static int nsp_cs_probe(struct pcmcia_device *link) /* Interrupt handler */ link->irq.Handler = &nspintr; link->irq.Instance = info; - link->irq.Attributes |= (SA_SHIRQ | SA_SAMPLE_RANDOM); + link->irq.Attributes |= IRQF_SHARED; /* General socket configuration */ link->conf.Attributes = CONF_ENABLE_IRQ; diff --git a/drivers/scsi/pcmcia/sym53c500_cs.c b/drivers/scsi/pcmcia/sym53c500_cs.c index 8457d0d77..0b65099ac 100644 --- a/drivers/scsi/pcmcia/sym53c500_cs.c +++ b/drivers/scsi/pcmcia/sym53c500_cs.c @@ -202,7 +202,7 @@ static char *version = /* ================================================================== */ struct scsi_info_t { - dev_link_t link; + struct pcmcia_device *p_dev; dev_node_t node; struct Scsi_Host *host; unsigned short manf_id; @@ -228,15 +228,6 @@ enum Phase { /* ================================================================== */ -/* -* Global (within this module) variables other than -* sym53c500_driver_template (the scsi_host_template). -*/ -static dev_link_t *dev_list; -static dev_info_t dev_info = "sym53c500_cs"; - -/* ================================================================== */ - static void chip_init(int io_port) { @@ -536,7 +527,7 @@ idle_out: } static void -SYM53C500_release(dev_link_t *link) +SYM53C500_release(struct pcmcia_device *link) { struct scsi_info_t *info = link->priv; struct Scsi_Host *shost = info->host; @@ -559,13 +550,7 @@ SYM53C500_release(dev_link_t *link) if (shost->io_port && shost->n_io_port) release_region(shost->io_port, shost->n_io_port); - link->dev = NULL; - - pcmcia_release_configuration(link->handle); - pcmcia_release_io(link->handle, &link->io); - pcmcia_release_irq(link->handle, &link->irq); - - link->state &= ~DEV_CONFIG; + pcmcia_disable_device(link); scsi_host_put(shost); } /* SYM53C500_release */ @@ -610,7 +595,7 @@ SYM53C500_queue(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) /* We are locked here already by the mid layer */ REG0(port_base); - outb(SCpnt->device->id, port_base + DEST_ID); /* set destination */ + outb(scmd_id(SCpnt), port_base + DEST_ID); /* set destination */ outb(FLUSH_FIFO, port_base + CMD_REG); /* reset the fifos */ for (i = 0; i < SCpnt->cmd_len; i++) { @@ -627,7 +612,9 @@ SYM53C500_host_reset(struct scsi_cmnd *SCpnt) int port_base = SCpnt->device->host->io_port; DEB(printk("SYM53C500_host_reset called\n")); + spin_lock_irq(SCpnt->device->host->host_lock); SYM53C500_int_host_reset(port_base); + spin_unlock_irq(SCpnt->device->host->host_lock); return SUCCESS; } @@ -720,10 +707,9 @@ static struct scsi_host_template sym53c500_driver_template = { #define CS_CHECK(fn, ret) \ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) -static void -SYM53C500_config(dev_link_t *link) +static int +SYM53C500_config(struct pcmcia_device *link) { - client_handle_t handle = link->handle; struct scsi_info_t *info = link->priv; tuple_t tuple; cisparse_t parse; @@ -740,40 +726,37 @@ SYM53C500_config(dev_link_t *link) tuple.TupleDataMax = 64; tuple.TupleOffset = 0; tuple.DesiredTuple = CISTPL_CONFIG; - CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); - CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); - CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, &tuple, &parse)); link->conf.ConfigBase = parse.config.base; tuple.DesiredTuple = CISTPL_MANFID; - if ((pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) && - (pcmcia_get_tuple_data(handle, &tuple) == CS_SUCCESS)) + if ((pcmcia_get_first_tuple(link, &tuple) == CS_SUCCESS) && + (pcmcia_get_tuple_data(link, &tuple) == CS_SUCCESS)) info->manf_id = le16_to_cpu(tuple.TupleData[0]); - /* Configure card */ - link->state |= DEV_CONFIG; - tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; - CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); while (1) { - if (pcmcia_get_tuple_data(handle, &tuple) != 0 || - pcmcia_parse_tuple(handle, &tuple, &parse) != 0) + if (pcmcia_get_tuple_data(link, &tuple) != 0 || + pcmcia_parse_tuple(link, &tuple, &parse) != 0) goto next_entry; link->conf.ConfigIndex = parse.cftable_entry.index; link->io.BasePort1 = parse.cftable_entry.io.win[0].base; link->io.NumPorts1 = parse.cftable_entry.io.win[0].len; if (link->io.BasePort1 != 0) { - i = pcmcia_request_io(handle, &link->io); + i = pcmcia_request_io(link, &link->io); if (i == CS_SUCCESS) break; } next_entry: - CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple)); + CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple)); } - CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq)); - CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf)); + CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); + CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); /* * That's the trouble with copying liberally from another driver. @@ -816,7 +799,7 @@ next_entry: data = (struct sym53c500_data *)host->hostdata; if (irq_level > 0) { - if (request_irq(irq_level, SYM53C500_intr, SA_SHIRQ, "SYM53C500", host)) { + if (request_irq(irq_level, SYM53C500_intr, IRQF_SHARED, "SYM53C500", host)) { printk("SYM53C500: unable to allocate IRQ %d\n", irq_level); goto err_free_scsi; } @@ -842,7 +825,7 @@ next_entry: data->fast_pio = USE_FAST_PIO; sprintf(info->node.dev_name, "scsi%d", host->host_no); - link->dev = &info->node; + link->dev_node = &info->node; info->host = host; if (scsi_add_host(host, NULL)) @@ -850,7 +833,7 @@ next_entry: scsi_scan_host(host); - goto out; /* SUCCESS */ + return 0; err_free_irq: free_irq(irq_level, host); @@ -859,109 +842,59 @@ err_free_scsi: err_release: release_region(port_base, 0x10); printk(KERN_INFO "sym53c500_cs: no SCSI devices found\n"); - -out: - link->state &= ~DEV_CONFIG_PENDING; - return; + return -ENODEV; cs_failed: - cs_error(link->handle, last_fn, last_ret); + cs_error(link, last_fn, last_ret); SYM53C500_release(link); - return; + return -ENODEV; } /* SYM53C500_config */ -static int -SYM53C500_event(event_t event, int priority, event_callback_args_t *args) +static int sym53c500_resume(struct pcmcia_device *link) { - dev_link_t *link = args->client_data; struct scsi_info_t *info = link->priv; - DEBUG(1, "SYM53C500_event(0x%06x)\n", event); - - switch (event) { - case CS_EVENT_CARD_REMOVAL: - link->state &= ~DEV_PRESENT; - if (link->state & DEV_CONFIG) - SYM53C500_release(link); - break; - case CS_EVENT_CARD_INSERTION: - link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; - SYM53C500_config(link); - break; - case CS_EVENT_PM_SUSPEND: - link->state |= DEV_SUSPEND; - /* Fall through... */ - case CS_EVENT_RESET_PHYSICAL: - if (link->state & DEV_CONFIG) - pcmcia_release_configuration(link->handle); - break; - case CS_EVENT_PM_RESUME: - link->state &= ~DEV_SUSPEND; - /* Fall through... */ - case CS_EVENT_CARD_RESET: - if (link->state & DEV_CONFIG) { - pcmcia_request_configuration(link->handle, &link->conf); - /* See earlier comment about manufacturer IDs. */ - if ((info->manf_id == MANFID_MACNICA) || - (info->manf_id == MANFID_PIONEER) || - (info->manf_id == 0x0098)) { - outb(0x80, link->io.BasePort1 + 0xd); - outb(0x24, link->io.BasePort1 + 0x9); - outb(0x04, link->io.BasePort1 + 0xd); - } - /* - * If things don't work after a "resume", - * this is a good place to start looking. - */ - SYM53C500_int_host_reset(link->io.BasePort1); - } - break; + /* See earlier comment about manufacturer IDs. */ + if ((info->manf_id == MANFID_MACNICA) || + (info->manf_id == MANFID_PIONEER) || + (info->manf_id == 0x0098)) { + outb(0x80, link->io.BasePort1 + 0xd); + outb(0x24, link->io.BasePort1 + 0x9); + outb(0x04, link->io.BasePort1 + 0xd); } + /* + * If things don't work after a "resume", + * this is a good place to start looking. + */ + SYM53C500_int_host_reset(link->io.BasePort1); + return 0; -} /* SYM53C500_event */ +} static void -SYM53C500_detach(dev_link_t *link) +SYM53C500_detach(struct pcmcia_device *link) { - dev_link_t **linkp; - DEBUG(0, "SYM53C500_detach(0x%p)\n", link); - /* Locate device structure */ - for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) - if (*linkp == link) - break; - if (*linkp == NULL) - return; - - if (link->state & DEV_CONFIG) - SYM53C500_release(link); - - if (link->handle) - pcmcia_deregister_client(link->handle); + SYM53C500_release(link); - /* Unlink device structure, free bits. */ - *linkp = link->next; kfree(link->priv); link->priv = NULL; } /* SYM53C500_detach */ -static dev_link_t * -SYM53C500_attach(void) +static int +SYM53C500_probe(struct pcmcia_device *link) { struct scsi_info_t *info; - client_reg_t client_reg; - dev_link_t *link; - int ret; DEBUG(0, "SYM53C500_attach()\n"); /* Create new SCSI device */ info = kmalloc(sizeof(*info), GFP_KERNEL); if (!info) - return NULL; + return -ENOMEM; memset(info, 0, sizeof(*info)); - link = &info->link; + info->p_dev = link; link->priv = info; link->io.NumPorts1 = 16; link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; @@ -969,41 +902,33 @@ SYM53C500_attach(void) link->irq.Attributes = IRQ_TYPE_EXCLUSIVE; link->irq.IRQInfo1 = IRQ_LEVEL_ID; link->conf.Attributes = CONF_ENABLE_IRQ; - link->conf.Vcc = 50; link->conf.IntType = INT_MEMORY_AND_IO; link->conf.Present = PRESENT_OPTION; - /* Register with Card Services */ - link->next = dev_list; - dev_list = link; - client_reg.dev_info = &dev_info; - client_reg.event_handler = &SYM53C500_event; - client_reg.EventMask = CS_EVENT_RESET_REQUEST | CS_EVENT_CARD_RESET | - CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL | - CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME; - client_reg.Version = 0x0210; - client_reg.event_callback_args.client_data = link; - ret = pcmcia_register_client(&link->handle, &client_reg); - if (ret != 0) { - cs_error(link->handle, RegisterClient, ret); - SYM53C500_detach(link); - return NULL; - } - - return link; + return SYM53C500_config(link); } /* SYM53C500_attach */ MODULE_AUTHOR("Bob Tracy "); MODULE_DESCRIPTION("SYM53C500 PCMCIA SCSI driver"); MODULE_LICENSE("GPL"); +static struct pcmcia_device_id sym53c500_ids[] = { + PCMCIA_DEVICE_PROD_ID12("BASICS by New Media Corporation", "SCSI Sym53C500", 0x23c78a9d, 0x0099e7f7), + PCMCIA_DEVICE_PROD_ID12("New Media Corporation", "SCSI Bus Toaster Sym53C500", 0x085a850b, 0x45432eb8), + PCMCIA_DEVICE_PROD_ID2("SCSI9000", 0x21648f44), + PCMCIA_DEVICE_NULL, +}; +MODULE_DEVICE_TABLE(pcmcia, sym53c500_ids); + static struct pcmcia_driver sym53c500_cs_driver = { .owner = THIS_MODULE, .drv = { .name = "sym53c500_cs", }, - .attach = SYM53C500_attach, - .detach = SYM53C500_detach, + .probe = SYM53C500_probe, + .remove = SYM53C500_detach, + .id_table = sym53c500_ids, + .resume = sym53c500_resume, }; static int __init diff --git a/drivers/scsi/pdc_adma.c b/drivers/scsi/pdc_adma.c index 5cda16cfa..efc8fff1d 100644 --- a/drivers/scsi/pdc_adma.c +++ b/drivers/scsi/pdc_adma.c @@ -46,7 +46,7 @@ #include #define DRV_NAME "pdc_adma" -#define DRV_VERSION "0.03" +#define DRV_VERSION "0.04" /* macro to calculate base address for ATA regs */ #define ADMA_ATA_REGS(base,port_no) ((base) + ((port_no) * 0x40)) @@ -152,6 +152,7 @@ static struct scsi_host_template adma_ata_sht = { .proc_name = DRV_NAME, .dma_boundary = ADMA_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, + .slave_destroy = ata_scsi_slave_destroy, .bios_param = ata_std_bios_param, }; @@ -167,6 +168,7 @@ static const struct ata_port_operations adma_ata_ops = { .qc_prep = adma_qc_prep, .qc_issue = adma_qc_issue, .eng_timeout = adma_eng_timeout, + .data_xfer = ata_mmio_data_xfer, .irq_handler = adma_intr, .irq_clear = adma_irq_clear, .port_start = adma_port_start, @@ -181,7 +183,8 @@ static struct ata_port_info adma_port_info[] = { { .sht = &adma_ata_sht, .host_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST | - ATA_FLAG_NO_LEGACY | ATA_FLAG_MMIO, + ATA_FLAG_NO_LEGACY | ATA_FLAG_MMIO | + ATA_FLAG_PIO_POLLING, .pio_mask = 0x10, /* pio4 */ .udma_mask = 0x1f, /* udma0-4 */ .port_ops = &adma_ata_ops, @@ -455,13 +458,13 @@ static inline unsigned int adma_intr_pkt(struct ata_host_set *host_set) continue; handled = 1; adma_enter_reg_mode(ap); - if (ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR)) + if (ap->flags & ATA_FLAG_DISABLED) continue; pp = ap->private_data; if (!pp || pp->state != adma_state_pkt) continue; qc = ata_qc_from_tag(ap, ap->active_tag); - if (qc && (!(qc->tf.ctl & ATA_NIEN))) { + if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) { if ((status & (aPERR | aPSD | aUIRQ))) qc->err_mask |= AC_ERR_OTHER; else if (pp->pkt[0] != cDONE) @@ -480,13 +483,13 @@ static inline unsigned int adma_intr_mmio(struct ata_host_set *host_set) for (port_no = 0; port_no < host_set->n_ports; ++port_no) { struct ata_port *ap; ap = host_set->ports[port_no]; - if (ap && (!(ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR)))) { + if (ap && (!(ap->flags & ATA_FLAG_DISABLED))) { struct ata_queued_cmd *qc; struct adma_port_priv *pp = ap->private_data; if (!pp || pp->state != adma_state_mmio) continue; qc = ata_qc_from_tag(ap, ap->active_tag); - if (qc && (!(qc->tf.ctl & ATA_NIEN))) { + if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) { /* check main status, clearing INTRQ */ u8 status = ata_check_status(ap); @@ -688,7 +691,7 @@ static int adma_ata_init_one(struct pci_dev *pdev, probe_ent->port_ops = adma_port_info[board_idx].port_ops; probe_ent->irq = pdev->irq; - probe_ent->irq_flags = SA_SHIRQ; + probe_ent->irq_flags = IRQF_SHARED; probe_ent->mmio_base = mmio_base; probe_ent->n_ports = ADMA_PORTS; diff --git a/drivers/scsi/pluto.c b/drivers/scsi/pluto.c index 46624ab9c..0bd9c60e6 100644 --- a/drivers/scsi/pluto.c +++ b/drivers/scsi/pluto.c @@ -13,7 +13,6 @@ #include #include #include -#include #ifdef CONFIG_KMOD #include #endif @@ -27,6 +26,9 @@ #include +#define RQ_SCSI_BUSY 0xffff +#define RQ_SCSI_DONE 0xfffe + /* #define PLUTO_DEBUG */ #define pluto_printk printk ("PLUTO %s: ", fc->name); printk @@ -167,8 +169,6 @@ int __init pluto_detect(struct scsi_host_template *tpnt) SCpnt->request->rq_status = RQ_SCSI_BUSY; SCpnt->done = pluto_detect_done; - SCpnt->bufflen = 256; - SCpnt->buffer = fcs[i].inquiry; SCpnt->request_bufflen = 256; SCpnt->request_buffer = fcs[i].inquiry; PLD(("set up %d %08lx\n", i, (long)SCpnt)) diff --git a/drivers/scsi/ppa.c b/drivers/scsi/ppa.c index 108910f51..b0eba39f2 100644 --- a/drivers/scsi/ppa.c +++ b/drivers/scsi/ppa.c @@ -6,11 +6,8 @@ * (c) 1995,1996 Grant R. Guenther, grant@torque.net, * under the terms of the GNU General Public License. * - * Current Maintainer: David Campbell (Perth, Western Australia, GMT+0800) - * campbell@torque.net */ -#include #include #include #include diff --git a/drivers/scsi/ppa.h b/drivers/scsi/ppa.h index f6e1a1574..ba8021427 100644 --- a/drivers/scsi/ppa.h +++ b/drivers/scsi/ppa.h @@ -2,7 +2,7 @@ * the Iomega ZIP drive * * (c) 1996 Grant R. Guenther grant@torque.net - * David Campbell campbell@torque.net + * David Campbell * * All comments to David. */ @@ -73,7 +73,6 @@ */ /* ------ END OF USER CONFIGURABLE PARAMETERS ----- */ -#include #include #include #include diff --git a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c index 5a48e55f9..332151e2a 100644 --- a/drivers/scsi/qla1280.c +++ b/drivers/scsi/qla1280.c @@ -192,7 +192,7 @@ - Don't walk the entire list in qla1280_putq_t() just to directly grab the pointer to the last element afterwards Rev 3.23.5 Beta August 9, 2001, Jes Sorensen - - Don't use SA_INTERRUPT, it's use is deprecated for this kinda driver + - Don't use IRQF_DISABLED, it's use is deprecated for this kinda driver Rev 3.23.4 Beta August 8, 2001, Jes Sorensen - Set dev->max_sectors to 1024 Rev 3.23.3 Beta August 6, 2001, Jes Sorensen @@ -331,7 +331,6 @@ *****************************************************************************/ -#include #include #include @@ -397,30 +396,6 @@ #include "ql1280_fw.h" #include "ql1040_fw.h" - -/* - * Missing PCI ID's - */ -#ifndef PCI_DEVICE_ID_QLOGIC_ISP1080 -#define PCI_DEVICE_ID_QLOGIC_ISP1080 0x1080 -#endif -#ifndef PCI_DEVICE_ID_QLOGIC_ISP1240 -#define PCI_DEVICE_ID_QLOGIC_ISP1240 0x1240 -#endif -#ifndef PCI_DEVICE_ID_QLOGIC_ISP1280 -#define PCI_DEVICE_ID_QLOGIC_ISP1280 0x1280 -#endif -#ifndef PCI_DEVICE_ID_QLOGIC_ISP10160 -#define PCI_DEVICE_ID_QLOGIC_ISP10160 0x1016 -#endif -#ifndef PCI_DEVICE_ID_QLOGIC_ISP12160 -#define PCI_DEVICE_ID_QLOGIC_ISP12160 0x1216 -#endif - -#ifndef PCI_VENDOR_ID_AMI -#define PCI_VENDOR_ID_AMI 0x101e -#endif - #ifndef BITS_PER_LONG #error "BITS_PER_LONG not defined!" #endif @@ -838,7 +813,7 @@ qla1280_error_action(struct scsi_cmnd *cmd, enum action action) uint16_t data; unsigned char *handle; int result, i; - DECLARE_COMPLETION(wait); + DECLARE_COMPLETION_ONSTACK(wait); struct timer_list timer; ha = (struct scsi_qla_host *)(CMD_HOST(cmd)->hostdata); @@ -2431,7 +2406,7 @@ qla1280_mailbox_command(struct scsi_qla_host *ha, uint8_t mr, uint16_t *mb) uint16_t *optr, *iptr; uint16_t __iomem *mptr; uint16_t data; - DECLARE_COMPLETION(wait); + DECLARE_COMPLETION_ONSTACK(wait); struct timer_list timer; ENTER("qla1280_mailbox_command"); @@ -4234,20 +4209,17 @@ qla1280_setup(char *s) } -static int +static int __init qla1280_get_token(char *str) { char *sep; long ret = -1; - int i, len; - - len = sizeof(setup_token)/sizeof(struct setup_tokens); + int i; sep = strchr(str, ':'); if (sep) { - for (i = 0; i < len; i++){ - + for (i = 0; i < ARRAY_SIZE(setup_token); i++) { if (!strncmp(setup_token[i].token, str, (sep - str))) { ret = setup_token[i].val; break; @@ -4397,7 +4369,7 @@ qla1280_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) /* Disable ISP interrupts. */ qla1280_disable_intrs(ha); - if (request_irq(pdev->irq, qla1280_intr_handler, SA_SHIRQ, + if (request_irq(pdev->irq, qla1280_intr_handler, IRQF_SHARED, "qla1280", ha)) { printk("qla1280 : Failed to reserve interrupt %d already " "in use\n", pdev->irq); diff --git a/drivers/scsi/qla2xxx/Kconfig b/drivers/scsi/qla2xxx/Kconfig index ff40906c6..8c865b9e0 100644 --- a/drivers/scsi/qla2xxx/Kconfig +++ b/drivers/scsi/qla2xxx/Kconfig @@ -24,48 +24,3 @@ config SCSI_QLA_FC Firmware images can be retrieved from: ftp://ftp.qlogic.com/outgoing/linux/firmware/ - - 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_QLA_FC - help - This option offers you the deprecated firmware-loader - modules that have been obsoleted by the usage of the - Firmware Loader interface in the qla2xxx driver. - -config SCSI_QLA21XX - tristate " Build QLogic ISP2100 firmware-module" - depends on SCSI_QLA_FC && SCSI_QLA2XXX_EMBEDDED_FIRMWARE - ---help--- - This driver supports the QLogic 21xx (ISP2100) host adapter family. - -config SCSI_QLA22XX - tristate " Build QLogic ISP2200 firmware-module" - depends on SCSI_QLA_FC && SCSI_QLA2XXX_EMBEDDED_FIRMWARE - ---help--- - This driver supports the QLogic 22xx (ISP2200) host adapter family. - -config SCSI_QLA2300 - tristate " Build QLogic ISP2300/ISP6312 firmware-module" - depends on SCSI_QLA_FC && SCSI_QLA2XXX_EMBEDDED_FIRMWARE - ---help--- - This driver supports the QLogic 2300 (ISP2300, ISP2312 and - ISP6312) host adapter family. - -config SCSI_QLA2322 - tristate " Build QLogic ISP2322/ISP6322 firmware-module" - depends on SCSI_QLA_FC && SCSI_QLA2XXX_EMBEDDED_FIRMWARE - ---help--- - This driver supports the QLogic 2322 (ISP2322 and ISP6322) host - adapter family. - -config SCSI_QLA24XX - tristate " Build QLogic ISP24xx firmware-module" - depends on SCSI_QLA_FC && SCSI_QLA2XXX_EMBEDDED_FIRMWARE - ---help--- - This driver supports the QLogic 24xx (ISP2422 and ISP2432) host - adapter family. diff --git a/drivers/scsi/qla2xxx/Makefile b/drivers/scsi/qla2xxx/Makefile index c8f670ee6..6399648f1 100644 --- a/drivers/scsi/qla2xxx/Makefile +++ b/drivers/scsi/qla2xxx/Makefile @@ -1,18 +1,5 @@ -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 + qla_dbg.o qla_sup.o qla_attr.o ql2100_fw.o ql2200_fw.o \ + ql2300_fw.o ql2322_fw.o ql2400_fw.o obj-$(CONFIG_SCSI_QLA_FC) += 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 -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_QLA24XX) += qla2xxx.o qla2400.o diff --git a/drivers/scsi/qla2xxx/ql2100.c b/drivers/scsi/qla2xxx/ql2100.c deleted file mode 100644 index f5db2235e..000000000 --- a/drivers/scsi/qla2xxx/ql2100.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * QLogic Fibre Channel HBA Driver - * Copyright (C) 2003 Christoph Hellwig. - * Copyright (c) 2003-2005 QLogic Corporation - * - * See LICENSE.qla2xxx for copyright and licensing details. - */ -#include -#include -#include - -#include "qla_def.h" - -static char qla_driver_name[] = "qla2100"; - -extern unsigned char fw2100tp_version[]; -extern unsigned char fw2100tp_version_str[]; -extern unsigned short fw2100tp_addr01; -extern unsigned short fw2100tp_code01[]; -extern unsigned short fw2100tp_length01; - -static struct qla_fw_info qla_fw_tbl[] = { - { - .addressing = FW_INFO_ADDR_NORMAL, - .fwcode = &fw2100tp_code01[0], - .fwlen = &fw2100tp_length01, - .fwstart = &fw2100tp_addr01, - }, - - { FW_INFO_ADDR_NOMORE, }, -}; - -static struct qla_board_info qla_board_tbl = { - .drv_name = qla_driver_name, - - .isp_name = "ISP2100", - .fw_info = qla_fw_tbl, -}; - -static struct pci_device_id qla2100_pci_tbl[] = { - { - .vendor = PCI_VENDOR_ID_QLOGIC, - .device = PCI_DEVICE_ID_QLOGIC_ISP2100, - .subvendor = PCI_ANY_ID, - .subdevice = PCI_ANY_ID, - .driver_data = (unsigned long)&qla_board_tbl, - }, - - {0, 0}, -}; -MODULE_DEVICE_TABLE(pci, qla2100_pci_tbl); - -static int __devinit -qla2100_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 -qla2100_remove_one(struct pci_dev *pdev) -{ - qla2x00_remove_one(pdev); -} - -static struct pci_driver qla2100_pci_driver = { - .name = "qla2100", - .id_table = qla2100_pci_tbl, - .probe = qla2100_probe_one, - .remove = __devexit_p(qla2100_remove_one), -}; - -static int __init -qla2100_init(void) -{ - return pci_module_init(&qla2100_pci_driver); -} - -static void __exit -qla2100_exit(void) -{ - pci_unregister_driver(&qla2100_pci_driver); -} - -module_init(qla2100_init); -module_exit(qla2100_exit); - -MODULE_AUTHOR("QLogic Corporation"); -MODULE_DESCRIPTION("QLogic ISP21xx FC-SCSI Host Bus Adapter driver"); -MODULE_LICENSE("GPL"); -MODULE_VERSION(QLA2XXX_VERSION); diff --git a/drivers/scsi/qla2xxx/ql2100_fw.c b/drivers/scsi/qla2xxx/ql2100_fw.c index 56006162d..0e7d6d53a 100644 --- a/drivers/scsi/qla2xxx/ql2100_fw.c +++ b/drivers/scsi/qla2xxx/ql2100_fw.c @@ -1,4848 +1,6419 @@ /* - * QLogic Fibre Channel HBA Driver - * Copyright (c) 2003-2005 QLogic Corporation + * Firmware version 1.19 from + * + * ftp://ftp.qlogic.com/outgoing/linux/firmware/ql2100_fw.bin + * + * xxd -g 1 -i ql2100_fw.bin | indent -l80 -i8 -o ql2100_fw.c * - * See LICENSE.qla2xxx for copyright and licensing details. - */ - -/* - * Firmware Version 1.19.25 (13:12 Dec 10, 2003) */ -#ifdef UNIQUE_FW_NAME -unsigned short fw2100tp_version = 1*1024+19; -#else -unsigned short risc_code_version = 1*1024+19; -#endif +#include -#ifdef UNIQUE_FW_NAME -unsigned char fw2100tp_version_str[] = {1,19,25}; -#else -unsigned char firmware_version[] = {1,19,25}; -#endif - -#ifdef UNIQUE_FW_NAME -#define fw2100tp_VERSION_STRING "1.19.25" -#else -#define FW_VERSION_STRING "1.19.25" -#endif - -#ifdef UNIQUE_FW_NAME -unsigned short fw2100tp_addr01 = 0x1000 ; -#else -unsigned short risc_code_addr01 = 0x1000 ; -#endif - -#ifdef UNIQUE_FW_NAME -unsigned short fw2100tp_code01[] = { -#else -unsigned short risc_code01[] = { -#endif - 0x0078, 0x102d, 0x0000, 0x9601, 0x0000, 0x0001, 0x0013, 0x0019, - 0x0017, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2032, 0x3030, - 0x3120, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241, - 0x5449, 0x4f4e, 0x2049, 0x5350, 0x3231, 0x3030, 0x2046, 0x6972, - 0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, - 0x312e, 0x3139, 0x2020, 0x2020, 0x2400, 0x2091, 0x2000, 0x20c1, - 0x0021, 0x2039, 0xffff, 0x2019, 0xaaaa, 0x2760, 0x2069, 0x7fff, - 0x20c1, 0x0020, 0x2c2c, 0x2d34, 0x2762, 0x236a, 0x2c24, 0x2d04, - 0x266a, 0x2562, 0xa406, 0x00c0, 0x1052, 0x20c1, 0x0021, 0x2c2c, - 0x2362, 0x2c04, 0x2562, 0xa306, 0x0040, 0x1052, 0x20c1, 0x0020, - 0x2039, 0x8fff, 0x20a1, 0xae00, 0x2708, 0x810d, 0x810d, 0x810d, - 0x810d, 0xa18c, 0x000f, 0x2001, 0x000a, 0xa112, 0xa00e, 0x21a8, - 0x41a4, 0x3400, 0x8211, 0x00c0, 0x105f, 0x2708, 0x3400, 0xa102, - 0x0040, 0x106f, 0x0048, 0x106f, 0x20a8, 0xa00e, 0x41a4, 0x20a1, - 0xa601, 0x2009, 0x0000, 0x20a9, 0x07ff, 0x41a4, 0x3400, 0x20c9, - 0xabff, 0x2059, 0x0000, 0x2b78, 0x7823, 0x0004, 0x2089, 0x25c7, - 0x2051, 0xa700, 0x2a70, 0x7762, 0xa786, 0x8fff, 0x0040, 0x1092, - 0x705f, 0xce00, 0x705b, 0xcdf1, 0x7067, 0x0200, 0x706b, 0x0200, - 0x0078, 0x109a, 0x705b, 0xbe01, 0x7067, 0x0100, 0x706b, 0x0100, - 0x705f, 0xbe00, 0x1078, 0x12df, 0x1078, 0x13ca, 0x1078, 0x1577, - 0x1078, 0x1ce9, 0x1078, 0x42ec, 0x1078, 0x76bf, 0x1078, 0x1355, - 0x1078, 0x2ac0, 0x1078, 0x4e93, 0x1078, 0x49a3, 0x1078, 0x594a, - 0x1078, 0x2263, 0x1078, 0x5c43, 0x1078, 0x5485, 0x1078, 0x2162, - 0x1078, 0x2240, 0x2091, 0x3009, 0x7823, 0x0000, 0x0090, 0x10cf, - 0x7820, 0xa086, 0x0002, 0x00c0, 0x10cf, 0x7823, 0x4000, 0x0068, - 0x10c7, 0x781b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2a70, - 0x7003, 0x0000, 0x2001, 0x017f, 0x2003, 0x0000, 0x2a70, 0x7000, - 0xa08e, 0x0003, 0x00c0, 0x10ef, 0x1078, 0x365e, 0x1078, 0x2ae8, - 0x1078, 0x4ee3, 0x1078, 0x4b66, 0x2009, 0x0100, 0x2104, 0xa082, - 0x0002, 0x0048, 0x10f3, 0x1078, 0x5966, 0x0078, 0x10d6, 0x1079, - 0x10f7, 0x0078, 0x10dc, 0x1078, 0x7197, 0x0078, 0x10eb, 0x1101, - 0x1102, 0x11be, 0x10ff, 0x1246, 0x12dc, 0x12dd, 0x12de, 0x1078, - 0x1332, 0x007c, 0x127e, 0x0f7e, 0x2091, 0x8000, 0x7000, 0xa086, - 0x0001, 0x00c0, 0x1198, 0x1078, 0x3aec, 0x2079, 0x0100, 0x7844, - 0xa005, 0x00c0, 0x1198, 0x2011, 0x41dc, 0x1078, 0x5a45, 0x1078, - 0x1adf, 0x780f, 0x00ff, 0x7840, 0xa084, 0xfffb, 0x7842, 0x2011, - 0x8010, 0x73c4, 0x1078, 0x361b, 0x2001, 0xffff, 0x1078, 0x5ae6, - 0x723c, 0xc284, 0x723e, 0x2001, 0xa70c, 0x2014, 0xc2ac, 0x2202, - 0x1078, 0x6f9f, 0x2011, 0x0004, 0x1078, 0x8d2b, 0x1078, 0x489e, - 0x1078, 0x42d4, 0x0040, 0x1144, 0x7087, 0x0001, 0x70bf, 0x0000, - 0x1078, 0x3c9e, 0x0078, 0x1198, 0x1078, 0x4967, 0x0040, 0x114d, - 0x7a0c, 0xc2b4, 0x7a0e, 0x0078, 0x1159, 0x1078, 0x90b6, 0x70cc, - 0xd09c, 0x00c0, 0x1159, 0x7098, 0xa005, 0x0040, 0x1159, 0x1078, - 0x42b8, 0x70d7, 0x0000, 0x70d3, 0x0000, 0x72cc, 0x2079, 0xa752, - 0x7804, 0xd0ac, 0x0040, 0x1165, 0xc295, 0x72ce, 0xa296, 0x0004, - 0x0040, 0x1186, 0x2011, 0x0001, 0x1078, 0x8d2b, 0x7093, 0x0000, - 0x7097, 0xffff, 0x7003, 0x0002, 0x0f7f, 0x1078, 0x2677, 0x2011, - 0x0005, 0x1078, 0x70e0, 0x1078, 0x62d1, 0x0c7e, 0x2061, 0x0100, - 0x60e3, 0x0008, 0x0c7f, 0x127f, 0x0078, 0x119a, 0x7093, 0x0000, - 0x7097, 0xffff, 0x7003, 0x0002, 0x2011, 0x0005, 0x1078, 0x70e0, - 0x1078, 0x62d1, 0x0c7e, 0x2061, 0x0100, 0x60e3, 0x0008, 0x0c7f, - 0x0f7f, 0x127f, 0x007c, 0x0c7e, 0x20a9, 0x0082, 0x2009, 0x007e, - 0x017e, 0x027e, 0x037e, 0x2110, 0x027e, 0x2019, 0x0029, 0x1078, - 0x73d0, 0x027f, 0x1078, 0xa501, 0x037f, 0x027f, 0x017f, 0x1078, - 0x298e, 0x8108, 0x00f0, 0x11a0, 0x0c7f, 0x706f, 0x0000, 0x7070, - 0xa084, 0x00ff, 0x7072, 0x709b, 0x0000, 0x007c, 0x127e, 0x2091, - 0x8000, 0x7000, 0xa086, 0x0002, 0x00c0, 0x1244, 0x7094, 0xa086, - 0xffff, 0x0040, 0x11d1, 0x1078, 0x2677, 0x1078, 0x62d1, 0x0078, - 0x1244, 0x70cc, 0xd09c, 0x0040, 0x11fd, 0xd084, 0x0040, 0x11fd, - 0x0f7e, 0x2079, 0x0100, 0x790c, 0xc1b5, 0x790e, 0x0f7f, 0xd08c, - 0x0040, 0x11fd, 0x70d0, 0xa086, 0xffff, 0x0040, 0x11f9, 0x1078, - 0x27f7, 0x1078, 0x62d1, 0x70cc, 0xd094, 0x00c0, 0x1244, 0x2011, - 0x0001, 0x2019, 0x0000, 0x1078, 0x282f, 0x1078, 0x62d1, 0x0078, - 0x1244, 0x70d4, 0xa005, 0x00c0, 0x1244, 0x7090, 0xa005, 0x00c0, - 0x1244, 0x1078, 0x4967, 0x00c0, 0x1244, 0x2001, 0xa753, 0x2004, - 0xd0ac, 0x0040, 0x1227, 0x157e, 0x0c7e, 0x20a9, 0x007f, 0x2009, - 0x0000, 0x017e, 0x1078, 0x45c4, 0x00c0, 0x121a, 0x6000, 0xd0ec, - 0x00c0, 0x1222, 0x017f, 0x8108, 0x00f0, 0x1211, 0x0c7f, 0x157f, - 0x0078, 0x1227, 0x017f, 0x0c7f, 0x157f, 0x0078, 0x1244, 0x7003, - 0x0003, 0x7097, 0xffff, 0x2001, 0x0000, 0x1078, 0x24e8, 0x1078, - 0x3699, 0x2001, 0xa9b2, 0x2004, 0xa086, 0x0005, 0x00c0, 0x123c, - 0x2011, 0x0000, 0x1078, 0x70e0, 0x2011, 0x0000, 0x1078, 0x70ea, - 0x1078, 0x62d1, 0x1078, 0x639b, 0x127f, 0x007c, 0x017e, 0x0f7e, - 0x127e, 0x2091, 0x8000, 0x2079, 0x0100, 0x2009, 0x00f7, 0x1078, - 0x42a1, 0x7940, 0xa18c, 0x0010, 0x7942, 0x7924, 0xd1b4, 0x0040, - 0x125b, 0x7827, 0x0040, 0xd19c, 0x0040, 0x1260, 0x7827, 0x0008, - 0x007e, 0x037e, 0x157e, 0xa006, 0x1078, 0x5ae6, 0x7900, 0xa18a, - 0x0003, 0x0050, 0x1289, 0x7954, 0xd1ac, 0x00c0, 0x1289, 0x2009, - 0x00f8, 0x1078, 0x42a1, 0x7843, 0x0090, 0x7843, 0x0010, 0x20a9, - 0x09c4, 0x7820, 0xd09c, 0x00c0, 0x1281, 0x7824, 0xd0ac, 0x00c0, - 0x12ca, 0x00f0, 0x1279, 0x2001, 0x0001, 0x1078, 0x24e8, 0x0078, - 0x12d5, 0x7853, 0x0000, 0x782f, 0x0020, 0x20a9, 0x0050, 0x00e0, - 0x128f, 0x2091, 0x6000, 0x00f0, 0x128f, 0x7853, 0x0400, 0x782f, - 0x0000, 0x2009, 0x00f8, 0x1078, 0x42a1, 0x20a9, 0x000e, 0x0005, - 0x00f0, 0x129f, 0x7853, 0x1400, 0x7843, 0x0090, 0x7843, 0x0010, - 0x2019, 0x61a8, 0x7854, 0x0005, 0x0005, 0xd08c, 0x0040, 0x12b4, - 0x7824, 0xd0ac, 0x00c0, 0x12ca, 0x8319, 0x00c0, 0x12aa, 0x2009, - 0xa732, 0x2104, 0x8000, 0x200a, 0xa084, 0xfff0, 0x0040, 0x12c4, - 0x200b, 0x0000, 0x1078, 0x2588, 0x2001, 0x0001, 0x1078, 0x24e8, - 0x0078, 0x12d3, 0x2001, 0xa732, 0x2003, 0x0000, 0x7828, 0xc09d, - 0x782a, 0x7827, 0x0048, 0x7853, 0x0400, 0x157f, 0x037f, 0x007f, - 0x127f, 0x0f7f, 0x017f, 0x007c, 0x007c, 0x007c, 0x007c, 0x2a70, - 0x2061, 0xa9ad, 0x2063, 0x0001, 0x6007, 0x0013, 0x600b, 0x0019, - 0x600f, 0x0017, 0x2009, 0x0100, 0x2104, 0xa082, 0x0002, 0x0048, - 0x12f5, 0x7053, 0xffff, 0x0078, 0x12f7, 0x7053, 0x0000, 0x7057, - 0xffff, 0x706f, 0x0000, 0x7073, 0x0000, 0x1078, 0x90b6, 0x2061, - 0xa98d, 0x6003, 0x0909, 0x6007, 0x0000, 0x600b, 0x8800, 0x600f, - 0x0200, 0x6013, 0x00ff, 0x6017, 0x0003, 0x601b, 0x0000, 0x601f, - 0x07d0, 0x2061, 0xa995, 0x6003, 0x8000, 0x6007, 0x0000, 0x600b, - 0x0000, 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x0000, 0x601b, - 0x0001, 0x601f, 0x0000, 0x2061, 0xa9a5, 0x6003, 0x514c, 0x6007, - 0x4f47, 0x600b, 0x4943, 0x600f, 0x2020, 0x2001, 0xa726, 0x2003, - 0x0000, 0x007c, 0x2091, 0x8000, 0x0068, 0x1334, 0x007e, 0x017e, - 0x2079, 0x0000, 0x7818, 0xd084, 0x00c0, 0x133a, 0x017f, 0x792e, - 0x007f, 0x782a, 0x007f, 0x7826, 0x3900, 0x783a, 0x7823, 0x8002, - 0x781b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2079, 0xa700, - 0x7803, 0x0005, 0x0078, 0x1352, 0x007c, 0x2071, 0xa700, 0x715c, - 0x712e, 0x2021, 0x0001, 0xa190, 0x002d, 0xa298, 0x002d, 0x0048, - 0x136b, 0x7060, 0xa302, 0x00c8, 0x136b, 0x220a, 0x2208, 0x2310, - 0x8420, 0x0078, 0x135d, 0x200b, 0x0000, 0x74aa, 0x74ae, 0x007c, - 0x0e7e, 0x127e, 0x2091, 0x8000, 0x2071, 0xa700, 0x70ac, 0xa0ea, - 0x0010, 0x00c8, 0x137e, 0xa06e, 0x0078, 0x1388, 0x8001, 0x70ae, - 0x702c, 0x2068, 0x2d04, 0x702e, 0x206b, 0x0000, 0x6807, 0x0000, - 0x127f, 0x0e7f, 0x007c, 0x0e7e, 0x2071, 0xa700, 0x127e, 0x2091, - 0x8000, 0x70ac, 0x8001, 0x00c8, 0x1398, 0xa06e, 0x0078, 0x13a1, - 0x70ae, 0x702c, 0x2068, 0x2d04, 0x702e, 0x206b, 0x0000, 0x6807, - 0x0000, 0x127f, 0x0e7f, 0x007c, 0x0e7e, 0x127e, 0x2091, 0x8000, - 0x2071, 0xa700, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70ac, 0x8000, - 0x70ae, 0x127f, 0x0e7f, 0x007c, 0x8dff, 0x0040, 0x13c0, 0x6804, - 0x6807, 0x0000, 0x007e, 0x1078, 0x13a4, 0x0d7f, 0x0078, 0x13b4, - 0x007c, 0x0e7e, 0x2071, 0xa700, 0x70ac, 0xa08a, 0x0010, 0xa00d, - 0x0e7f, 0x007c, 0x0e7e, 0x2071, 0xa9d6, 0x7007, 0x0000, 0x701b, - 0x0000, 0x701f, 0x0000, 0x2071, 0x0000, 0x7010, 0xa085, 0x8004, - 0x7012, 0x0e7f, 0x007c, 0x127e, 0x2091, 0x8000, 0x0e7e, 0x2270, - 0x700b, 0x0000, 0x2071, 0xa9d6, 0x7018, 0xa088, 0xa9df, 0x220a, - 0x8000, 0xa084, 0x0007, 0x701a, 0x7004, 0xa005, 0x00c0, 0x13f6, - 0x0f7e, 0x2079, 0x0010, 0x1078, 0x1408, 0x0f7f, 0x0e7f, 0x127f, - 0x007c, 0x0e7e, 0x2071, 0xa9d6, 0x7004, 0xa005, 0x00c0, 0x1406, - 0x0f7e, 0x2079, 0x0010, 0x1078, 0x1408, 0x0f7f, 0x0e7f, 0x007c, - 0x7000, 0x0079, 0x140b, 0x140f, 0x1479, 0x1496, 0x1496, 0x7018, - 0x711c, 0xa106, 0x00c0, 0x1417, 0x7007, 0x0000, 0x007c, 0x0d7e, - 0xa180, 0xa9df, 0x2004, 0x700a, 0x2068, 0x8108, 0xa18c, 0x0007, - 0x711e, 0x7803, 0x0026, 0x6824, 0x7832, 0x6828, 0x7836, 0x682c, - 0x783a, 0x6830, 0x783e, 0x6810, 0x700e, 0x680c, 0x7016, 0x6804, - 0x0d7f, 0xd084, 0x0040, 0x1439, 0x7007, 0x0001, 0x1078, 0x143e, - 0x007c, 0x7007, 0x0002, 0x1078, 0x1454, 0x007c, 0x017e, 0x027e, - 0x710c, 0x2011, 0x0040, 0xa182, 0x0040, 0x00c8, 0x1449, 0x2110, - 0xa006, 0x700e, 0x7212, 0x8203, 0x7822, 0x7803, 0x0020, 0x7803, - 0x0041, 0x027f, 0x017f, 0x007c, 0x017e, 0x027e, 0x137e, 0x147e, - 0x157e, 0x7014, 0x2098, 0x20a1, 0x0014, 0x7803, 0x0026, 0x710c, - 0x2011, 0x0040, 0xa182, 0x0040, 0x00c8, 0x1468, 0x2110, 0xa006, - 0x700e, 0x22a8, 0x53a6, 0x8203, 0x7822, 0x7803, 0x0020, 0x3300, - 0x7016, 0x7803, 0x0001, 0x157f, 0x147f, 0x137f, 0x027f, 0x017f, - 0x007c, 0x137e, 0x147e, 0x157e, 0x2099, 0xa7fa, 0x20a1, 0x0018, - 0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, 0x127e, 0x2091, 0x8000, - 0x7803, 0x0041, 0x7007, 0x0003, 0x7000, 0xc084, 0x7002, 0x700b, - 0xa7f5, 0x127f, 0x157f, 0x147f, 0x137f, 0x007c, 0x137e, 0x147e, - 0x157e, 0x2001, 0xa829, 0x209c, 0x20a1, 0x0014, 0x7803, 0x0026, - 0x2001, 0xa82a, 0x20ac, 0x53a6, 0x2099, 0xa82b, 0x20a1, 0x0018, - 0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, 0x127e, 0x2091, 0x8000, - 0x7803, 0x0001, 0x7007, 0x0004, 0x7000, 0xc08c, 0x7002, 0x700b, - 0xa826, 0x127f, 0x157f, 0x147f, 0x137f, 0x007c, 0x017e, 0x0e7e, - 0x2071, 0xa9d6, 0x0f7e, 0x2079, 0x0010, 0x7904, 0x7803, 0x0002, - 0xd1fc, 0x0040, 0x14d0, 0xa18c, 0x0700, 0x7004, 0x1079, 0x14d4, - 0x0f7f, 0x0e7f, 0x017f, 0x007c, 0x1408, 0x14dc, 0x1509, 0x1531, - 0x1564, 0x14da, 0x0078, 0x14da, 0xa18c, 0x0700, 0x00c0, 0x1502, - 0x137e, 0x147e, 0x157e, 0x7014, 0x20a0, 0x2099, 0x0014, 0x7803, - 0x0040, 0x7010, 0x20a8, 0x53a5, 0x3400, 0x7016, 0x157f, 0x147f, - 0x137f, 0x700c, 0xa005, 0x0040, 0x151e, 0x1078, 0x143e, 0x007c, - 0x7008, 0xa080, 0x0002, 0x2003, 0x0100, 0x7007, 0x0000, 0x1078, - 0x1408, 0x007c, 0x7008, 0xa080, 0x0002, 0x2003, 0x0200, 0x0078, - 0x14fd, 0xa18c, 0x0700, 0x00c0, 0x1514, 0x700c, 0xa005, 0x0040, - 0x151e, 0x1078, 0x1454, 0x007c, 0x7008, 0xa080, 0x0002, 0x2003, - 0x0200, 0x7007, 0x0000, 0x1078, 0x1408, 0x007c, 0x0d7e, 0x7008, - 0x2068, 0x7830, 0x6826, 0x7834, 0x682a, 0x7838, 0x682e, 0x783c, - 0x6832, 0x680b, 0x0100, 0x0d7f, 0x7007, 0x0000, 0x1078, 0x1408, - 0x007c, 0xa18c, 0x0700, 0x00c0, 0x155e, 0x137e, 0x147e, 0x157e, - 0x2001, 0xa7f8, 0x2004, 0xa080, 0x000d, 0x20a0, 0x2099, 0x0014, - 0x7803, 0x0040, 0x20a9, 0x0020, 0x53a5, 0x2001, 0xa7fa, 0x2004, - 0xd0bc, 0x0040, 0x1554, 0x2001, 0xa803, 0x2004, 0xa080, 0x000d, - 0x20a0, 0x20a9, 0x0020, 0x53a5, 0x157f, 0x147f, 0x137f, 0x7007, - 0x0000, 0x1078, 0x4f8c, 0x1078, 0x1408, 0x007c, 0x2011, 0x8003, - 0x1078, 0x361b, 0x0078, 0x1562, 0xa18c, 0x0700, 0x00c0, 0x1571, - 0x2001, 0xa828, 0x2003, 0x0100, 0x7007, 0x0000, 0x1078, 0x1408, - 0x007c, 0x2011, 0x8004, 0x1078, 0x361b, 0x0078, 0x1575, 0x127e, - 0x2091, 0x2100, 0x2079, 0x0030, 0x2071, 0xa9e7, 0x7803, 0x0004, - 0x7003, 0x0000, 0x700f, 0xa9ed, 0x7013, 0xa9ed, 0x780f, 0x0076, - 0x7803, 0x0004, 0x127f, 0x007c, 0x6934, 0xa184, 0x0007, 0x0079, - 0x1591, 0x1599, 0x15df, 0x1599, 0x1599, 0x1599, 0x15c4, 0x15a8, - 0x159d, 0xa085, 0x0001, 0x0078, 0x15f9, 0x684c, 0xd0bc, 0x0040, - 0x1599, 0x6860, 0x682e, 0x685c, 0x682a, 0x6858, 0x0078, 0x15e7, - 0xa18c, 0x00ff, 0xa186, 0x001e, 0x00c0, 0x1599, 0x684c, 0xd0bc, - 0x0040, 0x1599, 0x6860, 0x682e, 0x685c, 0x682a, 0x6804, 0x681a, - 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x206a, 0x2004, - 0x6832, 0x6858, 0x0078, 0x15ef, 0xa18c, 0x00ff, 0xa186, 0x0015, - 0x00c0, 0x1599, 0x684c, 0xd0ac, 0x0040, 0x1599, 0x6804, 0x681a, - 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x206a, 0x2004, - 0x6832, 0xa006, 0x682e, 0x682a, 0x6858, 0x0078, 0x15ef, 0x684c, - 0xd0ac, 0x0040, 0x1599, 0xa006, 0x682e, 0x682a, 0x6858, 0xa18c, - 0x000f, 0xa188, 0x206a, 0x210c, 0x6932, 0x2d08, 0x691a, 0x6826, - 0x684c, 0xc0dd, 0x684e, 0xa006, 0x680a, 0x697c, 0x6912, 0x6980, - 0x6916, 0x007c, 0x20e1, 0x0007, 0x20e1, 0x2000, 0x2001, 0x020a, - 0x2004, 0x82ff, 0x0040, 0x161c, 0xa280, 0x0004, 0x0d7e, 0x206c, - 0x684c, 0xd0dc, 0x00c0, 0x1618, 0x1078, 0x158c, 0x0040, 0x1618, - 0x0d7f, 0xa280, 0x0000, 0x2003, 0x0002, 0xa016, 0x0078, 0x161c, - 0x6808, 0x8000, 0x680a, 0x0d7f, 0x127e, 0x047e, 0x037e, 0x027e, - 0x2091, 0x2100, 0x027f, 0x037f, 0x047f, 0x7000, 0xa005, 0x00c0, - 0x1630, 0x7206, 0x2001, 0x1651, 0x007e, 0x2260, 0x0078, 0x17e0, - 0x710c, 0x220a, 0x8108, 0x230a, 0x8108, 0x240a, 0x8108, 0xa182, - 0xaa08, 0x0048, 0x163d, 0x2009, 0xa9ed, 0x710e, 0x7010, 0xa102, - 0xa082, 0x0009, 0x0040, 0x1648, 0xa080, 0x001b, 0x00c0, 0x164b, - 0x2009, 0x0138, 0x200a, 0x7000, 0xa005, 0x00c0, 0x1651, 0x1078, - 0x17c1, 0x127f, 0x007c, 0x127e, 0x027e, 0x037e, 0x0c7e, 0x007e, - 0x2091, 0x2100, 0x007f, 0x047f, 0x037f, 0x027f, 0x0d7e, 0x0c7e, - 0x2460, 0x6110, 0x2168, 0x6a62, 0x6b5e, 0xa005, 0x0040, 0x16dd, - 0x6808, 0xa005, 0x0040, 0x174a, 0x7000, 0xa005, 0x00c0, 0x1672, - 0x0078, 0x16d2, 0x700c, 0x7110, 0xa106, 0x00c0, 0x1753, 0x7004, - 0xa406, 0x00c0, 0x16d2, 0x2001, 0x0005, 0x2004, 0xd08c, 0x0040, - 0x168f, 0x047e, 0x1078, 0x1913, 0x047f, 0x2460, 0x6010, 0xa080, - 0x0002, 0x2004, 0xa005, 0x0040, 0x174a, 0x0078, 0x166c, 0x2001, - 0x0207, 0x2004, 0xd09c, 0x00c0, 0x167b, 0x7804, 0xa084, 0x6000, - 0x0040, 0x16a0, 0xa086, 0x6000, 0x0040, 0x16a0, 0x0078, 0x167b, - 0x7100, 0xa186, 0x0002, 0x00c0, 0x16c0, 0x0e7e, 0x2b68, 0x6818, - 0x2060, 0x1078, 0x203f, 0x2804, 0xac70, 0x6034, 0xd09c, 0x00c0, - 0x16b5, 0x7108, 0x720c, 0x0078, 0x16b7, 0x7110, 0x7214, 0x6810, - 0xa100, 0x6812, 0x6814, 0xa201, 0x6816, 0x0e7f, 0x0078, 0x16c4, - 0xa186, 0x0001, 0x00c0, 0x16cc, 0x7820, 0x6910, 0xa100, 0x6812, - 0x7824, 0x6914, 0xa101, 0x6816, 0x7803, 0x0004, 0x7003, 0x0000, - 0x7004, 0x2060, 0x6100, 0xa18e, 0x0004, 0x00c0, 0x1753, 0x2009, - 0x0048, 0x1078, 0x775c, 0x0078, 0x1753, 0x6808, 0xa005, 0x0040, - 0x174a, 0x7000, 0xa005, 0x00c0, 0x16e7, 0x0078, 0x174a, 0x700c, - 0x7110, 0xa106, 0x00c0, 0x16f0, 0x7004, 0xa406, 0x00c0, 0x174a, - 0x2001, 0x0005, 0x2004, 0xd08c, 0x0040, 0x1704, 0x047e, 0x1078, - 0x1913, 0x047f, 0x2460, 0x6010, 0xa080, 0x0002, 0x2004, 0xa005, - 0x0040, 0x174a, 0x0078, 0x16e1, 0x2001, 0x0207, 0x2004, 0xd09c, - 0x00c0, 0x16f0, 0x2001, 0x0005, 0x2004, 0xd08c, 0x00c0, 0x16f6, - 0x7804, 0xa084, 0x6000, 0x0040, 0x171b, 0xa086, 0x6000, 0x0040, - 0x171b, 0x0078, 0x16f0, 0x7007, 0x0000, 0xa016, 0x2218, 0x7000, - 0xa08e, 0x0001, 0x0040, 0x173c, 0xa08e, 0x0002, 0x00c0, 0x174a, - 0x0c7e, 0x0e7e, 0x6818, 0x2060, 0x1078, 0x203f, 0x2804, 0xac70, - 0x6034, 0xd09c, 0x00c0, 0x1738, 0x7308, 0x720c, 0x0078, 0x173a, - 0x7310, 0x7214, 0x0e7f, 0x0c7f, 0x7820, 0xa318, 0x7824, 0xa211, - 0x6810, 0xa300, 0x6812, 0x6814, 0xa201, 0x6816, 0x7803, 0x0004, - 0x7003, 0x0000, 0x6100, 0xa18e, 0x0004, 0x00c0, 0x1753, 0x2009, - 0x0048, 0x1078, 0x775c, 0x0c7f, 0x0d7f, 0x127f, 0x007c, 0x0f7e, - 0x0e7e, 0x027e, 0x037e, 0x047e, 0x057e, 0x2071, 0xa9e7, 0x7000, - 0xa086, 0x0000, 0x0040, 0x17ba, 0x7004, 0xac06, 0x00c0, 0x17ab, - 0x2079, 0x0030, 0x7000, 0xa086, 0x0003, 0x0040, 0x17ab, 0x7804, - 0xd0fc, 0x00c0, 0x17a7, 0x20e1, 0x6000, 0x2011, 0x0032, 0x2001, - 0x0208, 0x200c, 0x2001, 0x0209, 0x2004, 0xa106, 0x00c0, 0x176f, - 0x8211, 0x00c0, 0x1777, 0x7804, 0xd0fc, 0x00c0, 0x17a7, 0x1078, - 0x1b22, 0x027e, 0x057e, 0x7803, 0x0004, 0x7804, 0xd0ac, 0x00c0, - 0x178d, 0x7803, 0x0002, 0x7803, 0x0009, 0x7003, 0x0003, 0x7007, - 0x0000, 0x057f, 0x027f, 0x2001, 0x015d, 0x2003, 0x0000, 0x2001, - 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x0078, 0x17ab, 0x1078, - 0x1913, 0x0078, 0x175f, 0x157e, 0x20a9, 0x0009, 0x2009, 0xa9ed, - 0x2104, 0xac06, 0x00c0, 0x17b5, 0x200a, 0xa188, 0x0003, 0x00f0, - 0x17b0, 0x157f, 0x057f, 0x047f, 0x037f, 0x027f, 0x0e7f, 0x0f7f, - 0x007c, 0x700c, 0x7110, 0xa106, 0x00c0, 0x17c9, 0x7003, 0x0000, - 0x007c, 0x2104, 0x7006, 0x2060, 0x8108, 0x211c, 0x8108, 0x2124, - 0x8108, 0xa182, 0xaa08, 0x0048, 0x17d7, 0x2009, 0xa9ed, 0x7112, - 0x700c, 0xa106, 0x00c0, 0x17e0, 0x2001, 0x0138, 0x2003, 0x0008, - 0x8cff, 0x00c0, 0x17e7, 0x1078, 0x1b4d, 0x0078, 0x1854, 0x6010, - 0x2068, 0x2d58, 0x6828, 0xa406, 0x00c0, 0x17f2, 0x682c, 0xa306, - 0x0040, 0x182f, 0x601c, 0xa086, 0x0008, 0x0040, 0x182f, 0x6024, - 0xd0f4, 0x00c0, 0x181c, 0xd0d4, 0x0040, 0x1818, 0x6038, 0xa402, - 0x6034, 0xa303, 0x0040, 0x1806, 0x00c8, 0x1818, 0x643a, 0x6336, - 0x6c2a, 0x6b2e, 0x047e, 0x037e, 0x2400, 0x6c7c, 0xa402, 0x6812, - 0x2300, 0x6b80, 0xa303, 0x6816, 0x037f, 0x047f, 0x0078, 0x181c, - 0x1078, 0x9063, 0x0040, 0x17e3, 0x2001, 0xa774, 0x2004, 0xd0b4, - 0x00c0, 0x182b, 0x6018, 0x2004, 0xd0bc, 0x00c0, 0x182b, 0x6817, - 0x7fff, 0x6813, 0xffff, 0x1078, 0x208a, 0x00c0, 0x17e3, 0x0c7e, - 0x7004, 0x2060, 0x6024, 0xc0d4, 0x6026, 0x0c7f, 0x684c, 0xd0f4, - 0x0040, 0x1840, 0x6817, 0xffff, 0x6813, 0xffff, 0x0078, 0x17e3, - 0x6824, 0x2050, 0x6818, 0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc, - 0x000f, 0x2009, 0x0011, 0x1078, 0x1855, 0x0040, 0x1853, 0x2009, - 0x0001, 0x1078, 0x1855, 0x2d58, 0x007c, 0x8aff, 0x0040, 0x18ec, - 0xa03e, 0x2730, 0x6850, 0xd0fc, 0x00c0, 0x1877, 0xd0f4, 0x00c0, - 0x1887, 0x0d7e, 0x2804, 0xac68, 0x2900, 0x0079, 0x1867, 0x18ce, - 0x188e, 0x188e, 0x18ce, 0x18ce, 0x18c6, 0x18ce, 0x188e, 0x18ce, - 0x1894, 0x1894, 0x18ce, 0x18ce, 0x18ce, 0x18bd, 0x1894, 0xc0fc, - 0x6852, 0x6b6c, 0x6a70, 0x6d1c, 0x6c20, 0x0d7e, 0xd99c, 0x0040, - 0x18d1, 0x2804, 0xac68, 0x6f08, 0x6e0c, 0x0078, 0x18d1, 0xc0f4, - 0x6852, 0x6b6c, 0x6a70, 0x0d7e, 0x0078, 0x18d8, 0x6b08, 0x6a0c, - 0x6d00, 0x6c04, 0x0078, 0x18d1, 0x7b0c, 0xd3bc, 0x0040, 0x18b5, - 0x7004, 0x0e7e, 0x2070, 0x701c, 0x0e7f, 0xa086, 0x0008, 0x00c0, - 0x18b5, 0x7b08, 0xa39c, 0x0fff, 0x2d20, 0x0d7f, 0x0d7e, 0x6a14, - 0x82ff, 0x00c0, 0x18b0, 0x6810, 0xa302, 0x0048, 0x18b0, 0x6b10, - 0x2011, 0x0000, 0x2468, 0x0078, 0x18b7, 0x6b10, 0x6a14, 0x6d00, - 0x6c04, 0x6f08, 0x6e0c, 0x0078, 0x18d1, 0x0d7f, 0x0d7e, 0x6834, - 0xa084, 0x00ff, 0xa086, 0x001e, 0x00c0, 0x18ce, 0x0d7f, 0x1078, - 0x2026, 0x00c0, 0x1855, 0xa00e, 0x0078, 0x18ec, 0x0d7f, 0x1078, - 0x1332, 0x7b22, 0x7a26, 0x7d32, 0x7c36, 0x7f3a, 0x7e3e, 0x7902, - 0x7000, 0x8000, 0x7002, 0x0d7f, 0x6828, 0xa300, 0x682a, 0x682c, - 0xa201, 0x682e, 0x2300, 0x6b10, 0xa302, 0x6812, 0x2200, 0x6a14, - 0xa203, 0x6816, 0x1078, 0x2026, 0x007c, 0x1078, 0x1332, 0x1078, - 0x1c97, 0x7004, 0x2060, 0x0d7e, 0x6010, 0x2068, 0x7003, 0x0000, - 0x1078, 0x1af4, 0x1078, 0x8d16, 0x0040, 0x190c, 0x6808, 0x8001, - 0x680a, 0x697c, 0x6912, 0x6980, 0x6916, 0x682b, 0xffff, 0x682f, - 0xffff, 0x6850, 0xc0bd, 0x6852, 0x0d7f, 0x1078, 0x8a11, 0x0078, - 0x1adb, 0x1078, 0x1332, 0x127e, 0x2091, 0x2100, 0x007e, 0x017e, - 0x2b68, 0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184, 0x0700, - 0x00c0, 0x18ef, 0xa184, 0x0003, 0xa086, 0x0003, 0x0040, 0x1911, - 0x7000, 0x0079, 0x192b, 0x1933, 0x1935, 0x1a34, 0x1ab2, 0x1ac9, - 0x1933, 0x1933, 0x1933, 0x1078, 0x1332, 0x8001, 0x7002, 0xa184, - 0x0880, 0x00c0, 0x194a, 0x8aff, 0x0040, 0x19d4, 0x2009, 0x0001, - 0x1078, 0x1855, 0x0040, 0x1adb, 0x2009, 0x0001, 0x1078, 0x1855, - 0x0078, 0x1adb, 0x7803, 0x0004, 0x7003, 0x0000, 0xd1bc, 0x00c0, - 0x19b2, 0x027e, 0x037e, 0x017e, 0x7808, 0xd0ec, 0x00c0, 0x1962, - 0x7c20, 0x7d24, 0x7e30, 0x7f34, 0x7803, 0x0009, 0x7003, 0x0004, - 0x0078, 0x1964, 0x1078, 0x1bd7, 0x017f, 0xd194, 0x0040, 0x196b, - 0x8aff, 0x0040, 0x19a1, 0x6b28, 0x6a2c, 0x2400, 0x686e, 0xa31a, - 0x2500, 0x6872, 0xa213, 0x6b2a, 0x6a2e, 0x0c7e, 0x7004, 0x2060, - 0x6024, 0xd0f4, 0x00c0, 0x197e, 0x633a, 0x6236, 0x0c7f, 0x2400, - 0x6910, 0xa100, 0x6812, 0x2500, 0x6914, 0xa101, 0x6816, 0x037f, - 0x027f, 0x2600, 0x681e, 0x2700, 0x6822, 0x1078, 0x203f, 0x2a00, - 0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x6850, 0xc0fd, 0x6852, - 0x6808, 0x8001, 0x680a, 0x00c0, 0x19a7, 0x684c, 0xd0e4, 0x0040, - 0x19a7, 0x7004, 0x2060, 0x2009, 0x0048, 0x1078, 0x775c, 0x7000, - 0xa086, 0x0004, 0x0040, 0x1adb, 0x7003, 0x0000, 0x1078, 0x17c1, - 0x0078, 0x1adb, 0x057e, 0x7d0c, 0xd5bc, 0x00c0, 0x19b9, 0x1078, - 0xa58e, 0x057f, 0x1078, 0x1af4, 0x0f7e, 0x7004, 0x2078, 0x1078, - 0x4963, 0x0040, 0x19c6, 0x7824, 0xc0f5, 0x7826, 0x0f7f, 0x682b, - 0xffff, 0x682f, 0xffff, 0x6808, 0x8001, 0x680a, 0x697c, 0x6912, - 0x6980, 0x6916, 0x0078, 0x1adb, 0x7004, 0x0c7e, 0x2060, 0x6024, - 0x0c7f, 0xd0f4, 0x0040, 0x19e1, 0x6808, 0x8001, 0x680a, 0x0078, - 0x19f5, 0x684c, 0xc0f5, 0x684e, 0x7814, 0xa005, 0x00c0, 0x19f9, - 0x7003, 0x0000, 0x6808, 0x8001, 0x680a, 0x00c0, 0x19f5, 0x7004, - 0x2060, 0x2009, 0x0048, 0x1078, 0x775c, 0x1078, 0x17c1, 0x0078, - 0x1adb, 0x7814, 0x6910, 0xa102, 0x6812, 0x6914, 0xa183, 0x0000, - 0x6816, 0x7814, 0x7908, 0xa18c, 0x0fff, 0xa192, 0x0841, 0x00c8, - 0x18ef, 0xa188, 0x0007, 0x8114, 0x8214, 0x8214, 0xa10a, 0x8104, - 0x8004, 0x8004, 0xa20a, 0x810b, 0x810b, 0x810b, 0x1078, 0x1b5e, - 0x7803, 0x0004, 0x780f, 0xffff, 0x7803, 0x0001, 0x7804, 0xd0fc, - 0x0040, 0x1a1e, 0x7803, 0x0002, 0x7803, 0x0004, 0x780f, 0x0076, - 0x7004, 0x7007, 0x0000, 0x2060, 0x2009, 0x0048, 0x1078, 0x775c, - 0x1078, 0x1b92, 0x0040, 0x19f5, 0x8001, 0x7002, 0xd194, 0x0040, - 0x1a46, 0x7804, 0xd0fc, 0x00c0, 0x191b, 0x8aff, 0x0040, 0x1adb, - 0x2009, 0x0001, 0x1078, 0x1855, 0x0078, 0x1adb, 0xa184, 0x0880, - 0x00c0, 0x1a53, 0x8aff, 0x0040, 0x1adb, 0x2009, 0x0001, 0x1078, - 0x1855, 0x0078, 0x1adb, 0x7803, 0x0004, 0x7003, 0x0000, 0xd1bc, - 0x00c0, 0x1a93, 0x027e, 0x037e, 0x7808, 0xd0ec, 0x00c0, 0x1a66, - 0x7803, 0x0009, 0x7003, 0x0004, 0x0078, 0x1a68, 0x1078, 0x1bd7, - 0x6b28, 0x6a2c, 0x1078, 0x203f, 0x0d7e, 0x0f7e, 0x2d78, 0x2804, - 0xac68, 0x6034, 0xd09c, 0x00c0, 0x1a83, 0x6808, 0x2008, 0xa31a, - 0x680c, 0xa213, 0x7810, 0xa100, 0x7812, 0x690c, 0x7814, 0xa101, - 0x7816, 0x0078, 0x1a8f, 0x6810, 0x2008, 0xa31a, 0x6814, 0xa213, - 0x7810, 0xa100, 0x7812, 0x6914, 0x7814, 0xa101, 0x7816, 0x0f7f, - 0x0d7f, 0x0078, 0x196d, 0x057e, 0x7d0c, 0x1078, 0xa58e, 0x057f, - 0x1078, 0x1af4, 0x0f7e, 0x7004, 0x2078, 0x1078, 0x4963, 0x0040, - 0x1aa4, 0x7824, 0xc0f5, 0x7826, 0x0f7f, 0x682b, 0xffff, 0x682f, - 0xffff, 0x6808, 0x8001, 0x680a, 0x697c, 0x6912, 0x6980, 0x6916, - 0x0078, 0x1adb, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0xa00d, - 0x0040, 0x1ac5, 0x6808, 0x8001, 0x680a, 0x00c0, 0x1ac5, 0x7004, - 0x2060, 0x2009, 0x0048, 0x1078, 0x775c, 0x1078, 0x17c1, 0x0078, - 0x1adb, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, 0x6010, - 0xa005, 0x0040, 0x1ac5, 0x2068, 0x6808, 0x8000, 0x680a, 0x6c28, - 0x6b2c, 0x1078, 0x17e0, 0x017f, 0x007f, 0x127f, 0x007c, 0x127e, - 0x2091, 0x2100, 0x7000, 0xa086, 0x0003, 0x00c0, 0x1af2, 0x700c, - 0x7110, 0xa106, 0x0040, 0x1af2, 0x20e1, 0x9028, 0x700f, 0xa9ed, - 0x7013, 0xa9ed, 0x127f, 0x007c, 0x0c7e, 0x1078, 0x1b22, 0x20e1, - 0x9028, 0x700c, 0x7110, 0xa106, 0x0040, 0x1b19, 0x2104, 0xa005, - 0x0040, 0x1b08, 0x2060, 0x6010, 0x2060, 0x6008, 0x8001, 0x600a, - 0xa188, 0x0003, 0xa182, 0xaa08, 0x0048, 0x1b10, 0x2009, 0xa9ed, - 0x7112, 0x700c, 0xa106, 0x00c0, 0x1af9, 0x2011, 0x0008, 0x0078, - 0x1af9, 0x2001, 0x015d, 0x2003, 0x0000, 0x2001, 0x0138, 0x2202, - 0x0c7f, 0x007c, 0x2001, 0x0138, 0x2014, 0x2003, 0x0000, 0x2021, - 0xb015, 0x2001, 0x0141, 0x201c, 0xd3dc, 0x00c0, 0x1b3f, 0x2001, - 0x0109, 0x201c, 0xa39c, 0x0048, 0x00c0, 0x1b3f, 0x2001, 0x0111, - 0x201c, 0x83ff, 0x00c0, 0x1b3f, 0x8421, 0x00c0, 0x1b29, 0x007c, - 0x2011, 0x0201, 0x2009, 0x003c, 0x2204, 0xa005, 0x00c0, 0x1b4c, - 0x8109, 0x00c0, 0x1b44, 0x007c, 0x007c, 0x1078, 0x1b40, 0x0040, - 0x1b55, 0x780c, 0xd0a4, 0x0040, 0x1b5b, 0x1078, 0x1af4, 0xa085, - 0x0001, 0x0078, 0x1b5d, 0x1078, 0x1b92, 0x007c, 0x0e7e, 0x2071, - 0x0200, 0x7808, 0xa084, 0xf000, 0xa10d, 0x1078, 0x1b22, 0x2019, - 0x5000, 0x8319, 0x0040, 0x1b7c, 0x2001, 0xaa08, 0x2004, 0xa086, - 0x0000, 0x0040, 0x1b7c, 0x2001, 0x0021, 0xd0fc, 0x0040, 0x1b69, - 0x1078, 0x1eaa, 0x0078, 0x1b67, 0x20e1, 0x7000, 0x7324, 0x7420, - 0x7028, 0x7028, 0x7426, 0x7037, 0x0001, 0x810f, 0x712e, 0x702f, - 0x0100, 0x7037, 0x0008, 0x7326, 0x7422, 0x2001, 0x0138, 0x2202, - 0x0e7f, 0x007c, 0x027e, 0x2001, 0x015d, 0x2001, 0x0000, 0x7908, - 0xa18c, 0x0fff, 0xa182, 0x0ffd, 0x0048, 0x1ba0, 0x2009, 0x0000, - 0xa190, 0x0007, 0xa294, 0x1ff8, 0x8214, 0x8214, 0x8214, 0x2001, - 0x020a, 0x82ff, 0x0040, 0x1bb5, 0x20e1, 0x6000, 0x200c, 0x200c, - 0x200c, 0x200c, 0x8211, 0x00c0, 0x1bae, 0x20e1, 0x7000, 0x200c, - 0x200c, 0x7003, 0x0000, 0x20e1, 0x6000, 0x2001, 0x0208, 0x200c, - 0x2001, 0x0209, 0x2004, 0xa106, 0x0040, 0x1bd4, 0x1078, 0x1b40, - 0x0040, 0x1bd2, 0x7908, 0xd1ec, 0x00c0, 0x1bd4, 0x790c, 0xd1a4, - 0x0040, 0x1b97, 0x1078, 0x1af4, 0xa006, 0x027f, 0x007c, 0x7c20, - 0x7d24, 0x7e30, 0x7f34, 0x700c, 0x7110, 0xa106, 0x0040, 0x1c69, - 0x7004, 0x017e, 0x210c, 0xa106, 0x017f, 0x0040, 0x1c69, 0x0d7e, - 0x0c7e, 0x216c, 0x2d00, 0xa005, 0x0040, 0x1c67, 0x681c, 0xa086, - 0x0008, 0x0040, 0x1c67, 0x6824, 0xd0d4, 0x00c0, 0x1c67, 0x6810, - 0x2068, 0x6850, 0xd0fc, 0x0040, 0x1c29, 0x8108, 0x2104, 0x6b2c, - 0xa306, 0x00c0, 0x1c67, 0x8108, 0x2104, 0x6a28, 0xa206, 0x00c0, - 0x1c67, 0x6850, 0xc0fc, 0xc0f5, 0x6852, 0x686c, 0x7822, 0x6870, - 0x7826, 0x681c, 0x7832, 0x6820, 0x7836, 0x6818, 0x2060, 0x6034, - 0xd09c, 0x0040, 0x1c24, 0x6830, 0x2004, 0xac68, 0x6808, 0x783a, - 0x680c, 0x783e, 0x0078, 0x1c65, 0xa006, 0x783a, 0x783e, 0x0078, - 0x1c65, 0x8108, 0x2104, 0xa005, 0x00c0, 0x1c67, 0x6b2c, 0xa306, - 0x00c0, 0x1c67, 0x8108, 0x2104, 0xa005, 0x00c0, 0x1c67, 0x6a28, - 0xa206, 0x00c0, 0x1c67, 0x6850, 0xc0f5, 0x6852, 0x6830, 0x2004, - 0x6918, 0xa160, 0xa180, 0x000d, 0x2004, 0xd09c, 0x00c0, 0x1c57, - 0x6008, 0x7822, 0x686e, 0x600c, 0x7826, 0x6872, 0x6000, 0x7832, - 0x6004, 0x7836, 0xa006, 0x783a, 0x783e, 0x0078, 0x1c65, 0x6010, - 0x7822, 0x686e, 0x6014, 0x7826, 0x6872, 0x6000, 0x7832, 0x6004, - 0x7836, 0x6008, 0x783a, 0x600c, 0x783e, 0x7803, 0x0011, 0x0c7f, - 0x0d7f, 0x007c, 0x0f7e, 0x0e7e, 0x017e, 0x027e, 0x2071, 0xa9e7, - 0x2079, 0x0030, 0x2011, 0x0050, 0x7000, 0xa086, 0x0000, 0x0040, - 0x1c92, 0x8211, 0x0040, 0x1c90, 0x2001, 0x0005, 0x2004, 0xd08c, - 0x0040, 0x1c79, 0x7904, 0xa18c, 0x0780, 0x017e, 0x1078, 0x1913, - 0x017f, 0x81ff, 0x00c0, 0x1c90, 0x2011, 0x0050, 0x0078, 0x1c74, - 0xa085, 0x0001, 0x027f, 0x017f, 0x0e7f, 0x0f7f, 0x007c, 0x7803, - 0x0004, 0x2009, 0x0064, 0x7804, 0xd0ac, 0x0040, 0x1ce8, 0x8109, - 0x00c0, 0x1c9b, 0x2009, 0x0100, 0x210c, 0xa18a, 0x0003, 0x1048, - 0x1332, 0x1078, 0x1fca, 0x0e7e, 0x0f7e, 0x2071, 0xa9d6, 0x2079, - 0x0010, 0x7004, 0xa086, 0x0000, 0x0040, 0x1ce0, 0x7800, 0x007e, - 0x7820, 0x007e, 0x7830, 0x007e, 0x7834, 0x007e, 0x7838, 0x007e, - 0x783c, 0x007e, 0x7803, 0x0004, 0x7823, 0x0000, 0x0005, 0x0005, - 0x2079, 0x0030, 0x7804, 0xd0ac, 0x10c0, 0x1332, 0x2079, 0x0010, - 0x007f, 0x783e, 0x007f, 0x783a, 0x007f, 0x7836, 0x007f, 0x7832, - 0x007f, 0x7822, 0x007f, 0x7802, 0x0f7f, 0x0e7f, 0x0078, 0x1ce6, - 0x0f7f, 0x0e7f, 0x7804, 0xd0ac, 0x10c0, 0x1332, 0x1078, 0x639b, - 0x007c, 0x0e7e, 0x2071, 0xaa08, 0x7003, 0x0000, 0x0e7f, 0x007c, - 0x0d7e, 0xa280, 0x0004, 0x206c, 0x694c, 0xd1dc, 0x00c0, 0x1d6b, - 0x6934, 0xa184, 0x0007, 0x0079, 0x1cfd, 0x1d05, 0x1d56, 0x1d05, - 0x1d05, 0x1d05, 0x1d3b, 0x1d18, 0x1d07, 0x1078, 0x1332, 0x684c, - 0xd0b4, 0x0040, 0x1e79, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a, - 0x6812, 0x687c, 0x680a, 0x6880, 0x680e, 0x6958, 0x0078, 0x1d5e, - 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, 0x00c0, 0x1d05, 0x684c, - 0xd0b4, 0x0040, 0x1e79, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a, - 0x6812, 0x687c, 0x680a, 0x6880, 0x680e, 0x6804, 0x681a, 0xa080, - 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x206a, 0x2004, 0x6832, - 0x6958, 0x0078, 0x1d67, 0xa18c, 0x00ff, 0xa186, 0x0015, 0x00c0, - 0x1d6b, 0x684c, 0xd0b4, 0x0040, 0x1e79, 0x6804, 0x681a, 0xa080, - 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x206a, 0x2004, 0x6832, - 0x6958, 0xa006, 0x682e, 0x682a, 0x0078, 0x1d67, 0x684c, 0xd0b4, - 0x0040, 0x18ed, 0x6958, 0xa006, 0x682e, 0x682a, 0x2d00, 0x681a, - 0x6834, 0xa084, 0x000f, 0xa080, 0x206a, 0x2004, 0x6832, 0x6926, - 0x684c, 0xc0dd, 0x684e, 0x0d7f, 0x007c, 0x0f7e, 0x2079, 0x0020, - 0x7804, 0xd0fc, 0x10c0, 0x1eaa, 0x0e7e, 0x0d7e, 0x2071, 0xaa08, - 0x7000, 0xa005, 0x00c0, 0x1df0, 0x0c7e, 0x7206, 0xa280, 0x0004, - 0x205c, 0x7004, 0x2068, 0x7803, 0x0004, 0x6818, 0x0d7e, 0x2068, - 0x686c, 0x7812, 0x6890, 0x0f7e, 0x20e1, 0x9040, 0x2079, 0x0200, - 0x781a, 0x2079, 0x0100, 0x8004, 0x78d6, 0x0f7f, 0x0d7f, 0x2b68, - 0x6824, 0x2050, 0x6818, 0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc, - 0x000f, 0x6908, 0x2001, 0x04fd, 0x2004, 0xa086, 0x0007, 0x0040, - 0x1db2, 0xa184, 0x0007, 0x0040, 0x1db2, 0x017e, 0x2009, 0x0008, - 0xa102, 0x017f, 0xa108, 0x791a, 0x7116, 0x701e, 0x680c, 0xa081, - 0x0000, 0x781e, 0x701a, 0xa006, 0x700e, 0x7012, 0x7004, 0x692c, - 0x6814, 0xa106, 0x00c0, 0x1dc9, 0x6928, 0x6810, 0xa106, 0x0040, - 0x1dd6, 0x037e, 0x047e, 0x6b14, 0x6c10, 0x1078, 0x208a, 0x047f, - 0x037f, 0x0040, 0x1dd6, 0x0c7f, 0x0078, 0x1df0, 0x8aff, 0x00c0, - 0x1dde, 0x0c7f, 0xa085, 0x0001, 0x0078, 0x1df0, 0x127e, 0x2091, - 0x8000, 0x2079, 0x0020, 0x2009, 0x0001, 0x1078, 0x1df4, 0x0040, - 0x1ded, 0x2009, 0x0001, 0x1078, 0x1df4, 0x127f, 0x0c7f, 0xa006, - 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x077e, 0x067e, 0x057e, 0x047e, - 0x037e, 0x027e, 0x8aff, 0x0040, 0x1e72, 0x700c, 0x7214, 0xa23a, - 0x7010, 0x7218, 0xa203, 0x0048, 0x1e71, 0xa705, 0x0040, 0x1e71, - 0xa03e, 0x2730, 0x6850, 0xd0fc, 0x00c0, 0x1e24, 0x0d7e, 0x2804, - 0xac68, 0x2900, 0x0079, 0x1e14, 0x1e53, 0x1e34, 0x1e34, 0x1e53, - 0x1e53, 0x1e4b, 0x1e53, 0x1e34, 0x1e53, 0x1e3a, 0x1e3a, 0x1e53, - 0x1e53, 0x1e53, 0x1e42, 0x1e3a, 0xc0fc, 0x6852, 0x6b6c, 0x6a70, - 0x6d1c, 0x6c20, 0xd99c, 0x0040, 0x1e57, 0x0d7e, 0x2804, 0xac68, - 0x6f08, 0x6e0c, 0x0078, 0x1e56, 0x6b08, 0x6a0c, 0x6d00, 0x6c04, - 0x0078, 0x1e56, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, - 0x0078, 0x1e56, 0x0d7f, 0x0d7e, 0x6834, 0xa084, 0x00ff, 0xa086, - 0x001e, 0x00c0, 0x1e53, 0x0d7f, 0x1078, 0x2026, 0x00c0, 0x1dfa, - 0xa00e, 0x0078, 0x1e72, 0x0d7f, 0x1078, 0x1332, 0x0d7f, 0x7b22, - 0x7a26, 0x7d32, 0x7c36, 0x7f3a, 0x7e3e, 0x7902, 0x7000, 0x8000, - 0x7002, 0x6828, 0xa300, 0x682a, 0x682c, 0xa201, 0x682e, 0x700c, - 0xa300, 0x700e, 0x7010, 0xa201, 0x7012, 0x1078, 0x2026, 0x0078, - 0x1e72, 0xa006, 0x027f, 0x037f, 0x047f, 0x057f, 0x067f, 0x077f, - 0x007c, 0x1078, 0x1332, 0x027e, 0x2001, 0x0105, 0x2003, 0x0010, - 0x20e1, 0x9040, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, - 0x0d7e, 0x6010, 0x2068, 0x1078, 0x8d16, 0x0040, 0x1e92, 0x6850, - 0xc0bd, 0x6852, 0x0d7f, 0x0c7e, 0x1078, 0x8a11, 0x0c7f, 0x2001, - 0xa9c0, 0x2004, 0xac06, 0x00c0, 0x1ea7, 0x20e1, 0x9040, 0x1078, - 0x738a, 0x2011, 0x0000, 0x1078, 0x70ea, 0x1078, 0x639b, 0x027f, - 0x0078, 0x1f76, 0x127e, 0x2091, 0x2200, 0x007e, 0x017e, 0x0f7e, - 0x0e7e, 0x0d7e, 0x0c7e, 0x2079, 0x0020, 0x2071, 0xaa08, 0x2b68, - 0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184, 0x0700, 0x00c0, - 0x1e7b, 0x7000, 0x0079, 0x1ec4, 0x1f76, 0x1ec8, 0x1f43, 0x1f74, - 0x8001, 0x7002, 0xd19c, 0x00c0, 0x1edc, 0x8aff, 0x0040, 0x1efb, - 0x2009, 0x0001, 0x1078, 0x1df4, 0x0040, 0x1f76, 0x2009, 0x0001, - 0x1078, 0x1df4, 0x0078, 0x1f76, 0x7803, 0x0004, 0xd194, 0x0040, - 0x1eec, 0x6850, 0xc0fc, 0x6852, 0x8aff, 0x00c0, 0x1ef1, 0x684c, - 0xc0f5, 0x684e, 0x0078, 0x1ef1, 0x1078, 0x203f, 0x6850, 0xc0fd, - 0x6852, 0x2a00, 0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x7003, - 0x0000, 0x0078, 0x1f76, 0x711c, 0x81ff, 0x0040, 0x1f11, 0x7918, - 0x7922, 0x7827, 0x0000, 0x7803, 0x0001, 0x7000, 0x8000, 0x7002, - 0x700c, 0xa100, 0x700e, 0x7010, 0xa081, 0x0000, 0x7012, 0x0078, - 0x1f76, 0x0f7e, 0x027e, 0x781c, 0x007e, 0x7818, 0x007e, 0x2079, - 0x0100, 0x7a14, 0xa284, 0x0004, 0xa085, 0x0012, 0x7816, 0x037e, - 0x2019, 0x1000, 0x8319, 0x1040, 0x1332, 0x7820, 0xd0bc, 0x00c0, - 0x1f22, 0x037f, 0x79c8, 0x007f, 0xa102, 0x017f, 0x007e, 0x017e, - 0x79c4, 0x007f, 0xa103, 0x78c6, 0x007f, 0x78ca, 0xa284, 0x0004, - 0xa085, 0x0012, 0x7816, 0x027f, 0x0f7f, 0x7803, 0x0008, 0x7003, - 0x0000, 0x0078, 0x1f76, 0x8001, 0x7002, 0xd194, 0x0040, 0x1f58, - 0x7804, 0xd0fc, 0x00c0, 0x1eba, 0xd19c, 0x00c0, 0x1f72, 0x8aff, - 0x0040, 0x1f76, 0x2009, 0x0001, 0x1078, 0x1df4, 0x0078, 0x1f76, - 0x027e, 0x037e, 0x6b28, 0x6a2c, 0x1078, 0x203f, 0x0d7e, 0x2804, - 0xac68, 0x6034, 0xd09c, 0x00c0, 0x1f6b, 0x6808, 0xa31a, 0x680c, - 0xa213, 0x0078, 0x1f6f, 0x6810, 0xa31a, 0x6814, 0xa213, 0x0d7f, - 0x0078, 0x1eec, 0x0078, 0x1eec, 0x1078, 0x1332, 0x0c7f, 0x0d7f, - 0x0e7f, 0x0f7f, 0x017f, 0x007f, 0x127f, 0x007c, 0x0f7e, 0x0e7e, - 0x2071, 0xaa08, 0x7000, 0xa086, 0x0000, 0x0040, 0x1fc7, 0x2079, - 0x0020, 0x017e, 0x2009, 0x0207, 0x210c, 0xd194, 0x0040, 0x1fa4, - 0x2009, 0x020c, 0x210c, 0xa184, 0x0003, 0x0040, 0x1fa4, 0x1078, - 0xa5e2, 0x2001, 0x0133, 0x2004, 0xa005, 0x1040, 0x1332, 0x20e1, - 0x9040, 0x2001, 0x020c, 0x2102, 0x2009, 0x0206, 0x2104, 0x2009, - 0x0203, 0x210c, 0xa106, 0x00c0, 0x1faf, 0x20e1, 0x9040, 0x7804, - 0xd0fc, 0x0040, 0x1f8a, 0x1078, 0x1eaa, 0x7000, 0xa086, 0x0000, - 0x00c0, 0x1f8a, 0x017f, 0x7803, 0x0004, 0x7804, 0xd0ac, 0x00c0, - 0x1fbd, 0x20e1, 0x9040, 0x7803, 0x0002, 0x7003, 0x0000, 0x0e7f, - 0x0f7f, 0x007c, 0x027e, 0x0c7e, 0x0d7e, 0x0e7e, 0x0f7e, 0x2071, - 0xaa08, 0x2079, 0x0020, 0x7000, 0xa086, 0x0000, 0x0040, 0x2003, - 0x7004, 0x2060, 0x6010, 0x2068, 0x1078, 0x8d16, 0x0040, 0x1fed, - 0x6850, 0xc0b5, 0x6852, 0x680c, 0x7a1c, 0xa206, 0x00c0, 0x1fed, - 0x6808, 0x7a18, 0xa206, 0x0040, 0x2009, 0x2001, 0x0105, 0x2003, - 0x0010, 0x20e1, 0x9040, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, - 0x2060, 0x1078, 0x8a11, 0x20e1, 0x9040, 0x1078, 0x738a, 0x2011, - 0x0000, 0x1078, 0x70ea, 0x0f7f, 0x0e7f, 0x0d7f, 0x0c7f, 0x027f, - 0x007c, 0x6810, 0x6a14, 0xa205, 0x00c0, 0x1fed, 0x684c, 0xc0dc, - 0x684e, 0x2c10, 0x1078, 0x1cf0, 0x2001, 0x0105, 0x2003, 0x0010, - 0x20e1, 0x9040, 0x7803, 0x0004, 0x7003, 0x0000, 0x2069, 0xa9b1, - 0x6833, 0x0000, 0x683f, 0x0000, 0x0078, 0x2003, 0x8840, 0x2804, - 0xa005, 0x00c0, 0x203a, 0x6004, 0xa005, 0x0040, 0x203c, 0x681a, - 0x2060, 0x6034, 0xa084, 0x000f, 0xa080, 0x206a, 0x2044, 0x88ff, - 0x1040, 0x1332, 0x8a51, 0x007c, 0x2051, 0x0000, 0x007c, 0x8a50, - 0x8841, 0x2804, 0xa005, 0x00c0, 0x2059, 0x2c00, 0xad06, 0x0040, - 0x204e, 0x6000, 0xa005, 0x00c0, 0x204e, 0x2d00, 0x2060, 0x681a, - 0x6034, 0xa084, 0x000f, 0xa080, 0x207a, 0x2044, 0x88ff, 0x1040, - 0x1332, 0x007c, 0x0000, 0x0011, 0x0015, 0x0019, 0x001d, 0x0021, - 0x0025, 0x0029, 0x0000, 0x000f, 0x0015, 0x001b, 0x0021, 0x0027, - 0x0000, 0x0000, 0x0000, 0x205f, 0x205b, 0x0000, 0x0000, 0x2069, - 0x0000, 0x205f, 0x0000, 0x2066, 0x2063, 0x0000, 0x0000, 0x0000, - 0x2069, 0x2066, 0x0000, 0x2061, 0x2061, 0x0000, 0x0000, 0x2069, - 0x0000, 0x2061, 0x0000, 0x2067, 0x2067, 0x0000, 0x0000, 0x0000, - 0x2069, 0x2067, 0x0a7e, 0x097e, 0x087e, 0x6b2e, 0x6c2a, 0x6858, - 0xa055, 0x0040, 0x212d, 0x2d60, 0x6034, 0xa0cc, 0x000f, 0xa9c0, - 0x206a, 0xa986, 0x0007, 0x0040, 0x20a5, 0xa986, 0x000e, 0x0040, - 0x20a5, 0xa986, 0x000f, 0x00c0, 0x20a9, 0x605c, 0xa422, 0x6060, - 0xa31b, 0x2804, 0xa045, 0x00c0, 0x20b7, 0x0050, 0x20b1, 0x0078, - 0x212d, 0x6004, 0xa065, 0x0040, 0x212d, 0x0078, 0x2094, 0x2804, - 0xa005, 0x0040, 0x20d5, 0xac68, 0xd99c, 0x00c0, 0x20c5, 0x6808, - 0xa422, 0x680c, 0xa31b, 0x0078, 0x20c9, 0x6810, 0xa422, 0x6814, - 0xa31b, 0x0048, 0x20f4, 0x2300, 0xa405, 0x0040, 0x20db, 0x8a51, - 0x0040, 0x212d, 0x8840, 0x0078, 0x20b7, 0x6004, 0xa065, 0x0040, - 0x212d, 0x0078, 0x2094, 0x8a51, 0x0040, 0x212d, 0x8840, 0x2804, - 0xa005, 0x00c0, 0x20ee, 0x6004, 0xa065, 0x0040, 0x212d, 0x6034, - 0xa0cc, 0x000f, 0xa9c0, 0x206a, 0x2804, 0x2040, 0x2b68, 0x6850, - 0xc0fc, 0x6852, 0x0078, 0x2121, 0x8422, 0x8420, 0x831a, 0xa399, - 0x0000, 0x0d7e, 0x2b68, 0x6c6e, 0x6b72, 0x0d7f, 0xd99c, 0x00c0, - 0x210f, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300, 0xa11b, 0x1048, - 0x1332, 0x6800, 0xa420, 0x6804, 0xa319, 0x0078, 0x211b, 0x6910, - 0x2400, 0xa122, 0x6914, 0x2300, 0xa11b, 0x1048, 0x1332, 0x6800, - 0xa420, 0x6804, 0xa319, 0x2b68, 0x6c1e, 0x6b22, 0x6850, 0xc0fd, - 0x6852, 0x2c00, 0x681a, 0x2800, 0x6832, 0x2a00, 0x6826, 0x007f, - 0x007f, 0x007f, 0xa006, 0x0078, 0x2132, 0x087f, 0x097f, 0x0a7f, - 0xa085, 0x0001, 0x007c, 0x2001, 0x0005, 0x2004, 0xa084, 0x0007, - 0x0079, 0x213a, 0x2142, 0x2143, 0x2146, 0x2149, 0x214e, 0x2151, - 0x2156, 0x215b, 0x007c, 0x1078, 0x1eaa, 0x007c, 0x1078, 0x1913, - 0x007c, 0x1078, 0x1913, 0x1078, 0x1eaa, 0x007c, 0x1078, 0x14be, - 0x007c, 0x1078, 0x1eaa, 0x1078, 0x14be, 0x007c, 0x1078, 0x1913, - 0x1078, 0x14be, 0x007c, 0x1078, 0x1913, 0x1078, 0x1eaa, 0x1078, - 0x14be, 0x007c, 0x127e, 0x2091, 0x2300, 0x2079, 0x0200, 0x2071, - 0xac80, 0x2069, 0xa700, 0x2009, 0x0004, 0x7912, 0x7817, 0x0004, - 0x1078, 0x251f, 0x781b, 0x0002, 0x20e1, 0x8700, 0x127f, 0x007c, - 0x127e, 0x2091, 0x2300, 0x781c, 0xa084, 0x0007, 0x0079, 0x2180, - 0x21a4, 0x2188, 0x218c, 0x2190, 0x2196, 0x219a, 0x219e, 0x21a2, - 0x1078, 0x548e, 0x0078, 0x21a4, 0x1078, 0x54da, 0x0078, 0x21a4, - 0x1078, 0x548e, 0x1078, 0x54da, 0x0078, 0x21a4, 0x1078, 0x21a6, - 0x0078, 0x21a4, 0x1078, 0x21a6, 0x0078, 0x21a4, 0x1078, 0x21a6, - 0x0078, 0x21a4, 0x1078, 0x21a6, 0x127f, 0x007c, 0x007e, 0x017e, - 0x027e, 0x1078, 0xa5e2, 0x7930, 0xa184, 0x0003, 0x0040, 0x21c9, - 0x2001, 0xa9c0, 0x2004, 0xa005, 0x0040, 0x21c5, 0x2001, 0x0133, - 0x2004, 0xa005, 0x1040, 0x1332, 0x0c7e, 0x2001, 0xa9c0, 0x2064, - 0x1078, 0x8a11, 0x0c7f, 0x0078, 0x21f2, 0x20e1, 0x9040, 0x0078, - 0x21f2, 0xa184, 0x0030, 0x0040, 0x21da, 0x6a00, 0xa286, 0x0003, - 0x00c0, 0x21d4, 0x0078, 0x21d6, 0x1078, 0x4224, 0x20e1, 0x9010, - 0x0078, 0x21f2, 0xa184, 0x00c0, 0x0040, 0x21ec, 0x0e7e, 0x037e, - 0x047e, 0x057e, 0x2071, 0xa9e7, 0x1078, 0x1af4, 0x057f, 0x047f, - 0x037f, 0x0e7f, 0x0078, 0x21f2, 0xa184, 0x0300, 0x0040, 0x21f2, - 0x20e1, 0x9020, 0x7932, 0x027f, 0x017f, 0x007f, 0x007c, 0x017e, - 0x0e7e, 0x0f7e, 0x2071, 0xa700, 0x7128, 0x2001, 0xa990, 0x2102, - 0x2001, 0xa998, 0x2102, 0xa182, 0x0211, 0x00c8, 0x220b, 0x2009, - 0x0008, 0x0078, 0x2235, 0xa182, 0x0259, 0x00c8, 0x2213, 0x2009, - 0x0007, 0x0078, 0x2235, 0xa182, 0x02c1, 0x00c8, 0x221b, 0x2009, - 0x0006, 0x0078, 0x2235, 0xa182, 0x0349, 0x00c8, 0x2223, 0x2009, - 0x0005, 0x0078, 0x2235, 0xa182, 0x0421, 0x00c8, 0x222b, 0x2009, - 0x0004, 0x0078, 0x2235, 0xa182, 0x0581, 0x00c8, 0x2233, 0x2009, - 0x0003, 0x0078, 0x2235, 0x2009, 0x0002, 0x2079, 0x0200, 0x7912, - 0x7817, 0x0004, 0x1078, 0x251f, 0x0f7f, 0x0e7f, 0x017f, 0x007c, - 0x127e, 0x2091, 0x2200, 0x2061, 0x0100, 0x2071, 0xa700, 0x6024, - 0x6026, 0x6053, 0x0030, 0x6033, 0x00ef, 0x60e7, 0x0000, 0x60eb, - 0x00ef, 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043, 0x0000, 0x602f, - 0x0080, 0x602f, 0x0000, 0x6007, 0x0eaf, 0x600f, 0x00ff, 0x602b, - 0x002f, 0x127f, 0x007c, 0x2001, 0xa730, 0x2003, 0x0000, 0x2001, - 0xa72f, 0x2003, 0x0001, 0x007c, 0x127e, 0x2091, 0x2200, 0x007e, - 0x017e, 0x027e, 0x6124, 0xa184, 0x002c, 0x00c0, 0x227b, 0xa184, - 0x0007, 0x0079, 0x2281, 0xa195, 0x0004, 0xa284, 0x0007, 0x0079, - 0x2281, 0x22ad, 0x2289, 0x228d, 0x2291, 0x2297, 0x229b, 0x22a1, - 0x22a7, 0x1078, 0x5c56, 0x0078, 0x22ad, 0x1078, 0x5d45, 0x0078, - 0x22ad, 0x1078, 0x5d45, 0x1078, 0x5c56, 0x0078, 0x22ad, 0x1078, - 0x22b2, 0x0078, 0x22ad, 0x1078, 0x5c56, 0x1078, 0x22b2, 0x0078, - 0x22ad, 0x1078, 0x5d45, 0x1078, 0x22b2, 0x0078, 0x22ad, 0x1078, - 0x5d45, 0x1078, 0x5c56, 0x1078, 0x22b2, 0x027f, 0x017f, 0x007f, - 0x127f, 0x007c, 0x6124, 0xd1ac, 0x0040, 0x23ac, 0x017e, 0x047e, - 0x0c7e, 0x644c, 0xa486, 0xf0f0, 0x00c0, 0x22c5, 0x2061, 0x0100, - 0x644a, 0x6043, 0x0090, 0x6043, 0x0010, 0x74c6, 0xa48c, 0xff00, - 0x7034, 0xd084, 0x0040, 0x22dd, 0xa186, 0xf800, 0x00c0, 0x22dd, - 0x703c, 0xd084, 0x00c0, 0x22dd, 0xc085, 0x703e, 0x037e, 0x2418, - 0x2011, 0x8016, 0x1078, 0x361b, 0x037f, 0xa196, 0xff00, 0x0040, - 0x231f, 0x6030, 0xa084, 0x00ff, 0x810f, 0xa116, 0x0040, 0x231f, - 0x7130, 0xd184, 0x00c0, 0x231f, 0x2011, 0xa753, 0x2214, 0xd2ec, - 0x0040, 0x22fa, 0xc18d, 0x7132, 0x2011, 0xa753, 0x2214, 0xd2ac, - 0x00c0, 0x231f, 0x6240, 0xa294, 0x0010, 0x0040, 0x2306, 0x6248, - 0xa294, 0xff00, 0xa296, 0xff00, 0x0040, 0x231f, 0x7030, 0xd08c, - 0x0040, 0x2371, 0x7034, 0xd08c, 0x00c0, 0x2316, 0x2001, 0xa70c, - 0x200c, 0xd1ac, 0x00c0, 0x2371, 0xc1ad, 0x2102, 0x037e, 0x73c4, - 0x2011, 0x8013, 0x1078, 0x361b, 0x037f, 0x0078, 0x2371, 0x7034, - 0xd08c, 0x00c0, 0x232b, 0x2001, 0xa70c, 0x200c, 0xd1ac, 0x00c0, - 0x2371, 0xc1ad, 0x2102, 0x037e, 0x73c4, 0x2011, 0x8013, 0x1078, - 0x361b, 0x037f, 0x7130, 0xc185, 0x7132, 0x2011, 0xa753, 0x220c, - 0xd1a4, 0x0040, 0x2355, 0x017e, 0x2009, 0x0001, 0x2011, 0x0100, - 0x1078, 0x5bf1, 0x2019, 0x000e, 0x1078, 0xa1a5, 0xa484, 0x00ff, - 0xa080, 0x29c0, 0x200c, 0xa18c, 0xff00, 0x810f, 0x8127, 0xa006, - 0x2009, 0x000e, 0x1078, 0xa22d, 0x017f, 0xd1ac, 0x00c0, 0x2362, - 0x017e, 0x2009, 0x0000, 0x2019, 0x0004, 0x1078, 0x284f, 0x017f, - 0x0078, 0x2371, 0x157e, 0x20a9, 0x007f, 0x2009, 0x0000, 0x1078, - 0x45c4, 0x00c0, 0x236d, 0x1078, 0x42f8, 0x8108, 0x00f0, 0x2367, - 0x157f, 0x0c7f, 0x047f, 0x0f7e, 0x2079, 0xa9c4, 0x783c, 0xa086, - 0x0000, 0x0040, 0x2383, 0x6027, 0x0004, 0x783f, 0x0000, 0x2079, - 0x0140, 0x7803, 0x0000, 0x0f7f, 0x2011, 0x0003, 0x1078, 0x70e0, - 0x2011, 0x0002, 0x1078, 0x70ea, 0x1078, 0x6fc4, 0x037e, 0x2019, - 0x0000, 0x1078, 0x7058, 0x037f, 0x60e3, 0x0000, 0x017f, 0x2001, - 0xa700, 0x2014, 0xa296, 0x0004, 0x00c0, 0x23a4, 0xd19c, 0x00c0, - 0x23ac, 0x6228, 0xc29d, 0x622a, 0x2003, 0x0001, 0x2001, 0xa722, - 0x2003, 0x0000, 0x6027, 0x0020, 0xd194, 0x0040, 0x2490, 0x0f7e, - 0x2079, 0xa9c4, 0x783c, 0xa086, 0x0001, 0x00c0, 0x23d0, 0x017e, - 0x6027, 0x0004, 0x783f, 0x0000, 0x2079, 0x0140, 0x7803, 0x1000, - 0x7803, 0x0000, 0x2079, 0xa9b1, 0x7807, 0x0000, 0x7833, 0x0000, - 0x1078, 0x62d1, 0x1078, 0x639b, 0x017f, 0x0f7f, 0x0078, 0x2490, - 0x0f7f, 0x017e, 0x3900, 0xa082, 0xaae3, 0x00c8, 0x23db, 0x017e, - 0x1078, 0x747a, 0x017f, 0x6220, 0xd2b4, 0x0040, 0x2446, 0x1078, - 0x5acb, 0x1078, 0x6e0f, 0x6027, 0x0004, 0x0f7e, 0x2019, 0xa9ba, - 0x2304, 0xa07d, 0x0040, 0x241c, 0x7804, 0xa086, 0x0032, 0x00c0, - 0x241c, 0x0d7e, 0x0c7e, 0x0e7e, 0x2069, 0x0140, 0x618c, 0x6288, - 0x7818, 0x608e, 0x7808, 0x608a, 0x6043, 0x0002, 0x2001, 0x0003, - 0x8001, 0x00c0, 0x2400, 0x6043, 0x0000, 0x6803, 0x1000, 0x6803, - 0x0000, 0x618e, 0x628a, 0x1078, 0x61cd, 0x1078, 0x62d1, 0x7810, - 0x2070, 0x7037, 0x0103, 0x2f60, 0x1078, 0x772d, 0x0e7f, 0x0c7f, - 0x0d7f, 0x0f7f, 0x017f, 0x007c, 0x0f7f, 0x0d7e, 0x2069, 0x0140, - 0x6804, 0xa084, 0x4000, 0x0040, 0x2429, 0x6803, 0x1000, 0x6803, - 0x0000, 0x0d7f, 0x0c7e, 0x2061, 0xa9b1, 0x6028, 0xa09a, 0x00c8, - 0x00c8, 0x2439, 0x8000, 0x602a, 0x0c7f, 0x1078, 0x6e01, 0x0078, - 0x248f, 0x2019, 0xa9ba, 0x2304, 0xa065, 0x0040, 0x2443, 0x2009, - 0x0027, 0x1078, 0x775c, 0x0c7f, 0x0078, 0x248f, 0xd2bc, 0x0040, - 0x248f, 0x1078, 0x5ad8, 0x6017, 0x0010, 0x6027, 0x0004, 0x0d7e, - 0x2069, 0x0140, 0x6804, 0xa084, 0x4000, 0x0040, 0x245b, 0x6803, - 0x1000, 0x6803, 0x0000, 0x0d7f, 0x0c7e, 0x2061, 0xa9b1, 0x6044, - 0xa09a, 0x00c8, 0x00c8, 0x247e, 0x8000, 0x6046, 0x603c, 0x0c7f, - 0xa005, 0x0040, 0x248f, 0x2009, 0x07d0, 0x1078, 0x5ad0, 0xa080, - 0x0007, 0x2004, 0xa086, 0x0006, 0x00c0, 0x247a, 0x6017, 0x0012, - 0x0078, 0x248f, 0x6017, 0x0016, 0x0078, 0x248f, 0x037e, 0x2019, - 0x0001, 0x1078, 0x7058, 0x037f, 0x2019, 0xa9c0, 0x2304, 0xa065, - 0x0040, 0x248e, 0x2009, 0x004f, 0x1078, 0x775c, 0x0c7f, 0x017f, - 0xd19c, 0x0040, 0x24e4, 0x7034, 0xd0ac, 0x00c0, 0x24c1, 0x017e, - 0x157e, 0x6027, 0x0008, 0x602f, 0x0020, 0x20a9, 0x000a, 0x00f0, - 0x249f, 0x602f, 0x0000, 0x6150, 0xa185, 0x1400, 0x6052, 0x20a9, - 0x0320, 0x00e0, 0x24a9, 0x2091, 0x6000, 0x6020, 0xd09c, 0x00c0, - 0x24b8, 0x157f, 0x6152, 0x017f, 0x6027, 0x0008, 0x0078, 0x24e4, - 0x1078, 0x2577, 0x00f0, 0x24a9, 0x157f, 0x6152, 0x017f, 0x6027, - 0x0008, 0x017e, 0x6028, 0xc09c, 0x602a, 0x2011, 0x0003, 0x1078, - 0x70e0, 0x2011, 0x0002, 0x1078, 0x70ea, 0x1078, 0x6fc4, 0x037e, - 0x2019, 0x0000, 0x1078, 0x7058, 0x037f, 0x60e3, 0x0000, 0x1078, - 0xa5bd, 0x1078, 0xa5db, 0x2001, 0xa700, 0x2003, 0x0004, 0x6027, - 0x0008, 0x1078, 0x1246, 0x017f, 0xa18c, 0xffd0, 0x6126, 0x007c, - 0x007e, 0x017e, 0x027e, 0x0e7e, 0x0f7e, 0x127e, 0x2091, 0x8000, - 0x2071, 0xa700, 0x71bc, 0x70be, 0xa116, 0x0040, 0x2518, 0x81ff, - 0x0040, 0x2500, 0x2011, 0x8011, 0x1078, 0x361b, 0x0078, 0x2518, - 0x2011, 0x8012, 0x1078, 0x361b, 0x2001, 0xa772, 0x2004, 0xd0fc, - 0x00c0, 0x2518, 0x037e, 0x0c7e, 0x1078, 0x6f9f, 0x2061, 0x0100, - 0x2019, 0x0028, 0x2009, 0x0000, 0x1078, 0x284f, 0x0c7f, 0x037f, - 0x127f, 0x0f7f, 0x0e7f, 0x027f, 0x017f, 0x007f, 0x007c, 0x0c7e, - 0x0f7e, 0x007e, 0x027e, 0x2061, 0x0100, 0xa190, 0x253b, 0x2204, - 0x60f2, 0x2011, 0x2548, 0x6000, 0xa082, 0x0003, 0x00c8, 0x2534, - 0x2001, 0x00ff, 0x0078, 0x2535, 0x2204, 0x60ee, 0x027f, 0x007f, - 0x0f7f, 0x0c7f, 0x007c, 0x0840, 0x0840, 0x0840, 0x0580, 0x0420, - 0x0348, 0x02c0, 0x0258, 0x0210, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x0140, 0x00f8, 0x00d0, 0x00b0, 0x00a0, 0x2028, 0xa18c, 0x00ff, - 0x2130, 0xa094, 0xff00, 0x00c0, 0x2558, 0x81ff, 0x0040, 0x255c, - 0x1078, 0x5761, 0x0078, 0x2563, 0xa080, 0x29c0, 0x200c, 0xa18c, - 0xff00, 0x810f, 0xa006, 0x007c, 0xa080, 0x29c0, 0x200c, 0xa18c, - 0x00ff, 0x007c, 0x0c7e, 0x2061, 0xa700, 0x6030, 0x0040, 0x2573, - 0xc09d, 0x0078, 0x2574, 0xc09c, 0x6032, 0x0c7f, 0x007c, 0x007e, - 0x157e, 0x0f7e, 0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, 0xd08c, - 0x00c0, 0x2584, 0x00f0, 0x257e, 0x0f7f, 0x157f, 0x007f, 0x007c, - 0x0c7e, 0x007e, 0x2061, 0x0100, 0x6030, 0x007e, 0x6048, 0x007e, - 0x60e4, 0x007e, 0x60e8, 0x007e, 0x6050, 0x007e, 0x60f0, 0x007e, - 0x60ec, 0x007e, 0x600c, 0x007e, 0x6004, 0x007e, 0x6028, 0x007e, - 0x60e0, 0x007e, 0x602f, 0x0100, 0x602f, 0x0000, 0x0005, 0x0005, - 0x0005, 0x0005, 0x602f, 0x0040, 0x602f, 0x0000, 0x007f, 0x60e2, - 0x007f, 0x602a, 0x007f, 0x6006, 0x007f, 0x600e, 0x007f, 0x60ee, - 0x007f, 0x60f2, 0x007f, 0x6052, 0x007f, 0x60ea, 0x007f, 0x60e6, - 0x007f, 0x604a, 0x007f, 0x6032, 0x007f, 0x0c7f, 0x007c, 0x25e7, - 0x25eb, 0x25ef, 0x25f5, 0x25fb, 0x2601, 0x2607, 0x260f, 0x2617, - 0x261d, 0x2623, 0x262b, 0x2633, 0x263b, 0x2643, 0x264d, 0x2657, - 0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x2657, - 0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x107e, - 0x007e, 0x0078, 0x2670, 0x107e, 0x007e, 0x0078, 0x2670, 0x107e, - 0x007e, 0x1078, 0x226c, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, - 0x226c, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x2133, 0x0078, - 0x2670, 0x107e, 0x007e, 0x1078, 0x2133, 0x0078, 0x2670, 0x107e, - 0x007e, 0x1078, 0x226c, 0x1078, 0x2133, 0x0078, 0x2670, 0x107e, - 0x007e, 0x1078, 0x226c, 0x1078, 0x2133, 0x0078, 0x2670, 0x107e, - 0x007e, 0x1078, 0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, - 0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x226c, 0x1078, - 0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x226c, 0x1078, - 0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x2133, 0x1078, - 0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x2133, 0x1078, - 0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x226c, 0x1078, - 0x2133, 0x1078, 0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, - 0x226c, 0x1078, 0x2133, 0x1078, 0x2178, 0x0078, 0x2670, 0x0005, - 0x0078, 0x2657, 0xb084, 0x003c, 0x8004, 0x8004, 0x0079, 0x2660, - 0x2670, 0x25ed, 0x25f1, 0x25f7, 0x25fd, 0x2603, 0x2609, 0x2611, - 0x2619, 0x261f, 0x2625, 0x262d, 0x2635, 0x263d, 0x2645, 0x264f, - 0x0008, 0x265a, 0x007f, 0x107f, 0x2091, 0x8001, 0x007c, 0x0c7e, - 0x027e, 0x047e, 0x2021, 0x0000, 0x1078, 0x4967, 0x00c0, 0x2772, - 0x70cc, 0xd09c, 0x0040, 0x268e, 0xd084, 0x00c0, 0x268e, 0xd0bc, - 0x00c0, 0x2772, 0x1078, 0x2776, 0x0078, 0x2772, 0xd0cc, 0x00c0, - 0x2772, 0xd094, 0x0040, 0x2698, 0x7097, 0xffff, 0x0078, 0x2772, - 0x2001, 0x010c, 0x203c, 0x7284, 0xd284, 0x0040, 0x2701, 0xd28c, - 0x00c0, 0x2701, 0x037e, 0x7394, 0xa38e, 0xffff, 0x0040, 0x26ab, - 0x83ff, 0x00c0, 0x26ad, 0x2019, 0x0001, 0x8314, 0xa2e0, 0xadc0, - 0x2c04, 0xa38c, 0x0001, 0x0040, 0x26ba, 0xa084, 0xff00, 0x8007, - 0x0078, 0x26bc, 0xa084, 0x00ff, 0xa70e, 0x0040, 0x26f6, 0xa08e, - 0x0000, 0x0040, 0x26f6, 0xa08e, 0x00ff, 0x00c0, 0x26d3, 0x7230, - 0xd284, 0x00c0, 0x26fc, 0x7284, 0xc28d, 0x7286, 0x7097, 0xffff, - 0x037f, 0x0078, 0x2701, 0x2009, 0x0000, 0x1078, 0x254d, 0x1078, - 0x455c, 0x00c0, 0x26f9, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, - 0x00c0, 0x26f0, 0x7030, 0xd08c, 0x0040, 0x26ea, 0x6000, 0xd0bc, - 0x0040, 0x26f0, 0x1078, 0x278c, 0x0040, 0x26f9, 0x0078, 0x26f6, - 0x1078, 0x28c4, 0x1078, 0x27b9, 0x0040, 0x26f9, 0x8318, 0x0078, - 0x26ad, 0x7396, 0x0078, 0x26fe, 0x7097, 0xffff, 0x037f, 0x0078, - 0x2772, 0xa780, 0x29c0, 0x203c, 0xa7bc, 0xff00, 0x873f, 0x2041, - 0x007e, 0x7094, 0xa096, 0xffff, 0x00c0, 0x2713, 0x2009, 0x0000, - 0x28a8, 0x0078, 0x271f, 0xa812, 0x0048, 0x271b, 0x2008, 0xa802, - 0x20a8, 0x0078, 0x271f, 0x7097, 0xffff, 0x0078, 0x2772, 0x2700, - 0x157e, 0x017e, 0xa106, 0x0040, 0x2766, 0xc484, 0x1078, 0x45c4, - 0x0040, 0x2730, 0x1078, 0x455c, 0x00c0, 0x276f, 0x0078, 0x2731, - 0xc485, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x2740, - 0x7030, 0xd08c, 0x0040, 0x275e, 0x6000, 0xd0bc, 0x00c0, 0x275e, - 0x7284, 0xd28c, 0x0040, 0x2756, 0x6004, 0xa084, 0x00ff, 0xa082, - 0x0006, 0x0048, 0x2766, 0xd484, 0x00c0, 0x2752, 0x1078, 0x457f, - 0x0078, 0x2754, 0x1078, 0x298e, 0x0078, 0x2766, 0x1078, 0x28c4, - 0x1078, 0x27b9, 0x0040, 0x276f, 0x0078, 0x2766, 0x1078, 0x2959, - 0x0040, 0x2766, 0x1078, 0x278c, 0x0040, 0x276f, 0x017f, 0x8108, - 0x157f, 0x00f0, 0x271f, 0x7097, 0xffff, 0x0078, 0x2772, 0x017f, - 0x157f, 0x7196, 0x047f, 0x027f, 0x0c7f, 0x007c, 0x0c7e, 0x017e, - 0x7097, 0x0001, 0x2009, 0x007e, 0x1078, 0x455c, 0x00c0, 0x2789, - 0x1078, 0x28c4, 0x1078, 0x27b9, 0x0040, 0x2789, 0x70cc, 0xc0bd, - 0x70ce, 0x017f, 0x0c7f, 0x007c, 0x017e, 0x077e, 0x0d7e, 0x0c7e, - 0x2c68, 0x2001, 0xa757, 0x2004, 0xa084, 0x00ff, 0x6842, 0x1078, - 0x76c7, 0x0040, 0x27b4, 0x2d00, 0x601a, 0x601f, 0x0001, 0x2001, - 0x0000, 0x1078, 0x44ee, 0x2001, 0x0000, 0x1078, 0x4502, 0x127e, - 0x2091, 0x8000, 0x7090, 0x8000, 0x7092, 0x127f, 0x2009, 0x0004, - 0x1078, 0x775c, 0xa085, 0x0001, 0x0c7f, 0x0d7f, 0x077f, 0x017f, - 0x007c, 0x017e, 0x077e, 0x0d7e, 0x0c7e, 0x2c68, 0x2001, 0xa757, - 0x2004, 0xa084, 0x00ff, 0x6842, 0x1078, 0x9197, 0x0040, 0x27f2, - 0x2d00, 0x601a, 0x6800, 0xc0c4, 0x6802, 0x68a0, 0xa086, 0x007e, - 0x0040, 0x27db, 0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, - 0x27db, 0x1078, 0x2880, 0x601f, 0x0001, 0x2001, 0x0000, 0x1078, - 0x44ee, 0x2001, 0x0002, 0x1078, 0x4502, 0x127e, 0x2091, 0x8000, - 0x7090, 0x8000, 0x7092, 0x127f, 0x2009, 0x0002, 0x1078, 0x775c, - 0xa085, 0x0001, 0x0c7f, 0x0d7f, 0x077f, 0x017f, 0x007c, 0x0c7e, - 0x027e, 0x2009, 0x0080, 0x1078, 0x455c, 0x00c0, 0x2805, 0x1078, - 0x2808, 0x0040, 0x2805, 0x70d3, 0xffff, 0x027f, 0x0c7f, 0x007c, - 0x017e, 0x077e, 0x0d7e, 0x0c7e, 0x2c68, 0x1078, 0x76c7, 0x0040, - 0x282a, 0x2d00, 0x601a, 0x601f, 0x0001, 0x2001, 0x0000, 0x1078, - 0x44ee, 0x2001, 0x0002, 0x1078, 0x4502, 0x127e, 0x2091, 0x8000, - 0x70d4, 0x8000, 0x70d6, 0x127f, 0x2009, 0x0002, 0x1078, 0x775c, - 0xa085, 0x0001, 0x0c7f, 0x0d7f, 0x077f, 0x017f, 0x007c, 0x0c7e, - 0x0d7e, 0x127e, 0x2091, 0x8000, 0x2009, 0x007f, 0x1078, 0x455c, - 0x00c0, 0x284b, 0x2c68, 0x1078, 0x76c7, 0x0040, 0x284b, 0x2d00, - 0x601a, 0x6312, 0x601f, 0x0001, 0x620a, 0x2009, 0x0022, 0x1078, - 0x775c, 0xa085, 0x0001, 0x127f, 0x0d7f, 0x0c7f, 0x007c, 0x0e7e, - 0x0c7e, 0x067e, 0x037e, 0x027e, 0x1078, 0x5f0e, 0x1078, 0x5eae, - 0x1078, 0x8068, 0x2130, 0x81ff, 0x0040, 0x2864, 0x20a9, 0x007e, - 0x2009, 0x0000, 0x0078, 0x2868, 0x20a9, 0x007f, 0x2009, 0x0000, - 0x017e, 0x1078, 0x45c4, 0x00c0, 0x2871, 0x1078, 0x47e9, 0x1078, - 0x42f8, 0x017f, 0x8108, 0x00f0, 0x2868, 0x86ff, 0x00c0, 0x287a, - 0x1078, 0x119b, 0x027f, 0x037f, 0x067f, 0x0c7f, 0x0e7f, 0x007c, - 0x0e7e, 0x0c7e, 0x037e, 0x027e, 0x017e, 0x6218, 0x2270, 0x72a0, - 0x027e, 0x2019, 0x0029, 0x1078, 0x5f01, 0x077e, 0x2039, 0x0000, - 0x1078, 0x5e0a, 0x2c08, 0x1078, 0x9f9b, 0x077f, 0x017f, 0x2e60, - 0x1078, 0x47e9, 0x6210, 0x6314, 0x1078, 0x42f8, 0x6212, 0x6316, - 0x017f, 0x027f, 0x037f, 0x0c7f, 0x0e7f, 0x007c, 0x0e7e, 0x007e, - 0x6018, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x00c0, 0x28ba, 0x2071, - 0xa700, 0x7090, 0xa005, 0x0040, 0x28b7, 0x8001, 0x7092, 0x007f, - 0x0e7f, 0x007c, 0x2071, 0xa700, 0x70d4, 0xa005, 0x0040, 0x28b7, - 0x8001, 0x70d6, 0x0078, 0x28b7, 0x6000, 0xc08c, 0x6002, 0x007c, - 0x0f7e, 0x0e7e, 0x0c7e, 0x037e, 0x027e, 0x017e, 0x157e, 0x2178, - 0x81ff, 0x00c0, 0x28d7, 0x20a9, 0x0001, 0x0078, 0x28f2, 0x2001, - 0xa753, 0x2004, 0xd0c4, 0x0040, 0x28ee, 0xd0a4, 0x0040, 0x28ee, - 0x047e, 0x6018, 0xa080, 0x0028, 0x2024, 0xa4a4, 0x00ff, 0x8427, - 0xa006, 0x2009, 0x002d, 0x1078, 0xa22d, 0x047f, 0x20a9, 0x00ff, - 0x2011, 0x0000, 0x027e, 0xa28e, 0x007e, 0x0040, 0x2936, 0xa28e, - 0x007f, 0x0040, 0x2936, 0xa28e, 0x0080, 0x0040, 0x2936, 0xa288, - 0xa835, 0x210c, 0x81ff, 0x0040, 0x2936, 0x8fff, 0x1040, 0x2942, - 0x0c7e, 0x2160, 0x2001, 0x0001, 0x1078, 0x4972, 0x0c7f, 0x2019, - 0x0029, 0x1078, 0x5f01, 0x077e, 0x2039, 0x0000, 0x1078, 0x5e0a, - 0x0c7e, 0x027e, 0x2160, 0x6204, 0xa294, 0x00ff, 0xa286, 0x0006, - 0x00c0, 0x2926, 0x6007, 0x0404, 0x0078, 0x292b, 0x2001, 0x0004, - 0x8007, 0xa215, 0x6206, 0x027f, 0x0c7f, 0x017e, 0x2c08, 0x1078, - 0x9f9b, 0x017f, 0x077f, 0x2160, 0x1078, 0x47e9, 0x027f, 0x8210, - 0x00f0, 0x28f2, 0x157f, 0x017f, 0x027f, 0x037f, 0x0c7f, 0x0e7f, - 0x0f7f, 0x007c, 0x047e, 0x027e, 0x017e, 0x2001, 0xa753, 0x2004, - 0xd0c4, 0x0040, 0x2955, 0xd0a4, 0x0040, 0x2955, 0xa006, 0x2220, - 0x8427, 0x2009, 0x0029, 0x1078, 0xa22d, 0x017f, 0x027f, 0x047f, - 0x007c, 0x017e, 0x027e, 0x037e, 0x0c7e, 0x7284, 0x82ff, 0x0040, - 0x2987, 0xa290, 0xa753, 0x2214, 0xd2ac, 0x00c0, 0x2987, 0x2100, - 0x1078, 0x2564, 0x81ff, 0x0040, 0x2989, 0x2019, 0x0001, 0x8314, - 0xa2e0, 0xadc0, 0x2c04, 0xd384, 0x0040, 0x297b, 0xa084, 0xff00, - 0x8007, 0x0078, 0x297d, 0xa084, 0x00ff, 0xa116, 0x0040, 0x2989, - 0xa096, 0x00ff, 0x0040, 0x2987, 0x8318, 0x0078, 0x296f, 0xa085, - 0x0001, 0x0c7f, 0x037f, 0x027f, 0x017f, 0x007c, 0x017e, 0x0c7e, - 0x127e, 0x2091, 0x8000, 0x017e, 0x027e, 0x037e, 0x2110, 0x027e, - 0x2019, 0x0029, 0x1078, 0x73d0, 0x027f, 0x1078, 0xa501, 0x037f, - 0x027f, 0x017f, 0xa180, 0xa835, 0x2004, 0xa065, 0x0040, 0x29b7, - 0x017e, 0x0c7e, 0x1078, 0x9197, 0x017f, 0x1040, 0x1332, 0x611a, - 0x1078, 0x2880, 0x1078, 0x772d, 0x017f, 0x1078, 0x457f, 0x127f, - 0x0c7f, 0x017f, 0x007c, 0x2001, 0xa733, 0x2004, 0xd0cc, 0x007c, - 0x7eef, 0x7de8, 0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc, 0x80da, - 0x7ad9, 0x80d6, 0x80d5, 0x80d4, 0x80d3, 0x80d2, 0x80d1, 0x79ce, - 0x78cd, 0x80cc, 0x80cb, 0x80ca, 0x80c9, 0x80c7, 0x80c6, 0x77c5, - 0x76c3, 0x80bc, 0x80ba, 0x75b9, 0x80b6, 0x74b5, 0x73b4, 0x72b3, - 0x80b2, 0x80b1, 0x80ae, 0x71ad, 0x80ac, 0x70ab, 0x6faa, 0x6ea9, - 0x80a7, 0x6da6, 0x6ca5, 0x6ba3, 0x6a9f, 0x699e, 0x689d, 0x809b, - 0x8098, 0x6797, 0x6690, 0x658f, 0x6488, 0x6384, 0x6282, 0x8081, - 0x8080, 0x617c, 0x607a, 0x8079, 0x5f76, 0x8075, 0x8074, 0x8073, - 0x8072, 0x8071, 0x806e, 0x5e6d, 0x806c, 0x5d6b, 0x5c6a, 0x5b69, - 0x8067, 0x5a66, 0x5965, 0x5863, 0x575c, 0x565a, 0x5559, 0x8056, - 0x8055, 0x5454, 0x5353, 0x5252, 0x5151, 0x504e, 0x4f4d, 0x804c, - 0x804b, 0x4e4a, 0x4d49, 0x8047, 0x4c46, 0x8045, 0x8043, 0x803c, - 0x803a, 0x8039, 0x8036, 0x4b35, 0x8034, 0x4a33, 0x4932, 0x4831, - 0x802e, 0x472d, 0x462c, 0x452b, 0x442a, 0x4329, 0x4227, 0x8026, - 0x8025, 0x4123, 0x401f, 0x3f1e, 0x3e1d, 0x3d1b, 0x3c18, 0x8017, - 0x8010, 0x3b0f, 0x3a08, 0x8004, 0x3902, 0x8001, 0x8000, 0x8000, - 0x3800, 0x3700, 0x3600, 0x8000, 0x3500, 0x8000, 0x8000, 0x8000, - 0x3400, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3300, - 0x3200, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3100, - 0x3000, 0x8000, 0x8000, 0x2f00, 0x8000, 0x2e00, 0x2d00, 0x2c00, - 0x8000, 0x8000, 0x8000, 0x2b00, 0x8000, 0x2a00, 0x2900, 0x2800, - 0x8000, 0x2700, 0x2600, 0x2500, 0x2400, 0x2300, 0x2200, 0x8000, - 0x8000, 0x2100, 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x8000, - 0x8000, 0x1b00, 0x1a00, 0x8000, 0x1900, 0x8000, 0x8000, 0x8000, - 0x8000, 0x8000, 0x8000, 0x1800, 0x8000, 0x1700, 0x1600, 0x1500, - 0x8000, 0x1400, 0x1300, 0x1200, 0x1100, 0x1000, 0x0f00, 0x8000, - 0x8000, 0x0e00, 0x0d00, 0x0c00, 0x0b00, 0x0a00, 0x0900, 0x8000, - 0x8000, 0x0800, 0x0700, 0x8000, 0x0600, 0x8000, 0x8000, 0x8000, - 0x0500, 0x0400, 0x0300, 0x8000, 0x0200, 0x8000, 0x8000, 0x8000, - 0x0100, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, - 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, - 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, - 0x2071, 0xa782, 0x7003, 0x0002, 0xa006, 0x7012, 0x7016, 0x703a, - 0x703e, 0x7033, 0xa792, 0x7037, 0xa792, 0x7007, 0x0001, 0x2061, - 0xa7d2, 0x6003, 0x0002, 0x007c, 0x0090, 0x2ae7, 0x0068, 0x2ae7, - 0x2071, 0xa782, 0x2b78, 0x7818, 0xd084, 0x00c0, 0x2ae7, 0x2a60, - 0x7820, 0xa08e, 0x0069, 0x00c0, 0x2bd7, 0x0079, 0x2b6b, 0x007c, - 0x2071, 0xa782, 0x7004, 0x0079, 0x2aed, 0x2af1, 0x2af2, 0x2afc, - 0x2b0e, 0x007c, 0x0090, 0x2afb, 0x0068, 0x2afb, 0x2b78, 0x7818, - 0xd084, 0x0040, 0x2b1a, 0x007c, 0x2b78, 0x2061, 0xa7d2, 0x6008, - 0xa08e, 0x0100, 0x0040, 0x2b09, 0xa086, 0x0200, 0x0040, 0x2bcf, - 0x007c, 0x7014, 0x2068, 0x2a60, 0x7018, 0x007a, 0x7010, 0x2068, - 0x6834, 0xa086, 0x0103, 0x0040, 0x2b16, 0x007c, 0x2a60, 0x2b78, - 0x7018, 0x007a, 0x2a60, 0x7820, 0xa08a, 0x0040, 0x00c8, 0x2b23, - 0x61bc, 0x0079, 0x2b2b, 0x2100, 0xa08a, 0x003f, 0x00c8, 0x2bcb, - 0x61bc, 0x0079, 0x2b6b, 0x2bad, 0x2bdf, 0x2be7, 0x2beb, 0x2bf3, - 0x2bf9, 0x2bfd, 0x2c09, 0x2c0d, 0x2c17, 0x2c1b, 0x2bcb, 0x2bcb, - 0x2bcb, 0x2c1f, 0x2bcb, 0x2c2f, 0x2c46, 0x2c5d, 0x2cdd, 0x2ce2, - 0x2d0f, 0x2d69, 0x2d7a, 0x2d98, 0x2dd9, 0x2de3, 0x2df0, 0x2e03, - 0x2e22, 0x2e2b, 0x2e68, 0x2e6e, 0x2bcb, 0x2e8a, 0x2bcb, 0x2bcb, - 0x2bcb, 0x2bcb, 0x2bcb, 0x2e91, 0x2e9b, 0x2bcb, 0x2bcb, 0x2bcb, - 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x2ea3, 0x2bcb, 0x2bcb, - 0x2bcb, 0x2bcb, 0x2bcb, 0x2eb5, 0x2ece, 0x2bcb, 0x2bcb, 0x2bcb, - 0x2bcb, 0x2bcb, 0x2bcb, 0x2ee0, 0x2f37, 0x2f95, 0x2fa9, 0x2bcb, - 0x2bcb, 0x2bcb, 0x398e, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, - 0x2bcb, 0x2bcb, 0x2bcb, 0x2c17, 0x2c1b, 0x2fc0, 0x2bcb, 0x2fcd, - 0x3a26, 0x3a83, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, - 0x2bcb, 0x2bcb, 0x2bcb, 0x301a, 0x314f, 0x316b, 0x3177, 0x31da, - 0x3233, 0x323e, 0x327d, 0x328c, 0x329b, 0x329e, 0x2fd1, 0x32c2, - 0x331e, 0x332b, 0x343c, 0x356f, 0x3599, 0x36a6, 0x2bcb, 0x36b6, - 0x36f0, 0x37bf, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x3827, 0x3843, - 0x38bd, 0x3977, 0x713c, 0x0078, 0x2bad, 0x2021, 0x4000, 0x1078, - 0x35f5, 0x127e, 0x2091, 0x8000, 0x0068, 0x2bba, 0x7818, 0xd084, - 0x0040, 0x2bbd, 0x127f, 0x0078, 0x2bb1, 0x7c22, 0x7926, 0x7a2a, - 0x7b2e, 0x781b, 0x0001, 0x2091, 0x4080, 0x7007, 0x0001, 0x2091, - 0x5000, 0x127f, 0x007c, 0x2021, 0x4001, 0x0078, 0x2baf, 0x2021, - 0x4002, 0x0078, 0x2baf, 0x2021, 0x4003, 0x0078, 0x2baf, 0x2021, - 0x4005, 0x0078, 0x2baf, 0x2021, 0x4006, 0x0078, 0x2baf, 0xa02e, - 0x2520, 0x7b28, 0x7a2c, 0x7824, 0x7930, 0x0078, 0x3604, 0x7823, - 0x0004, 0x7824, 0x007a, 0xa02e, 0x2520, 0x7b28, 0x7a2c, 0x7824, - 0x7930, 0x0078, 0x3608, 0x7924, 0x7828, 0x2114, 0x200a, 0x0078, - 0x2bad, 0x7924, 0x2114, 0x0078, 0x2bad, 0x2099, 0x0009, 0x20a1, - 0x0009, 0x20a9, 0x0007, 0x53a3, 0x7924, 0x7a28, 0x7b2c, 0x0078, - 0x2bad, 0x7824, 0x2060, 0x0078, 0x2c21, 0x2009, 0x0001, 0x2011, - 0x0013, 0x2019, 0x0019, 0x783b, 0x0017, 0x0078, 0x2bad, 0x7d38, - 0x7c3c, 0x0078, 0x2be1, 0x7d38, 0x7c3c, 0x0078, 0x2bed, 0x2061, - 0x1000, 0x610c, 0xa006, 0x2c14, 0xa200, 0x8c60, 0x8109, 0x00c0, - 0x2c23, 0x2010, 0xa005, 0x0040, 0x2bad, 0x0078, 0x2bd3, 0x2069, - 0xa752, 0x7824, 0x7930, 0xa11a, 0x00c8, 0x2bdb, 0x8019, 0x0040, - 0x2bdb, 0x684a, 0x6942, 0x782c, 0x6852, 0x7828, 0x6856, 0xa006, - 0x685a, 0x685e, 0x1078, 0x4eae, 0x0078, 0x2bad, 0x2069, 0xa752, - 0x7824, 0x7934, 0xa11a, 0x00c8, 0x2bdb, 0x8019, 0x0040, 0x2bdb, - 0x684e, 0x6946, 0x782c, 0x6862, 0x7828, 0x6866, 0xa006, 0x686a, - 0x686e, 0x1078, 0x4a3e, 0x0078, 0x2bad, 0xa02e, 0x2520, 0x81ff, - 0x00c0, 0x2bd7, 0x7924, 0x7b28, 0x7a2c, 0x20a9, 0x0005, 0x20a1, - 0xa789, 0x41a1, 0x1078, 0x35ba, 0x0040, 0x2bd7, 0x2009, 0x0020, - 0x1078, 0x3604, 0x701b, 0x2c75, 0x007c, 0x6834, 0x2008, 0xa084, - 0x00ff, 0xa096, 0x0011, 0x0040, 0x2c85, 0xa096, 0x0019, 0x0040, - 0x2c85, 0xa096, 0x0015, 0x00c0, 0x2bd7, 0x810f, 0xa18c, 0x00ff, - 0x0040, 0x2bd7, 0x710e, 0x700c, 0x8001, 0x0040, 0x2cb6, 0x700e, - 0x1078, 0x35ba, 0x0040, 0x2bd7, 0x2009, 0x0020, 0x2061, 0xa7d2, - 0x6224, 0x6328, 0x642c, 0x6530, 0xa290, 0x0040, 0xa399, 0x0000, - 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x1078, 0x3604, 0x701b, 0x2ca9, - 0x007c, 0x6834, 0xa084, 0x00ff, 0xa096, 0x0002, 0x0040, 0x2cb4, - 0xa096, 0x000a, 0x00c0, 0x2bd7, 0x0078, 0x2c8b, 0x7010, 0x2068, - 0x6838, 0xc0fd, 0x683a, 0x1078, 0x4431, 0x00c0, 0x2cc4, 0x7007, - 0x0003, 0x701b, 0x2cc6, 0x007c, 0x1078, 0x4b51, 0x127e, 0x2091, - 0x8000, 0x20a9, 0x0005, 0x2099, 0xa789, 0x530a, 0x2100, 0xa210, - 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0xad80, 0x000d, - 0x2009, 0x0020, 0x127f, 0x0078, 0x3608, 0x61a4, 0x7824, 0x60a6, - 0x0078, 0x2bad, 0x2091, 0x8000, 0x7823, 0x4000, 0x7827, 0x4953, - 0x782b, 0x5020, 0x782f, 0x2020, 0x2009, 0x017f, 0x2104, 0x7832, - 0x3f00, 0x7836, 0x2061, 0x0100, 0x6200, 0x2061, 0x0200, 0x603c, - 0x8007, 0xa205, 0x783a, 0x2009, 0x04fd, 0x2104, 0x783e, 0x781b, - 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2071, 0x0010, 0x20c1, - 0x00f0, 0xa08a, 0x0003, 0x00c8, 0x0427, 0x0078, 0x0423, 0x81ff, - 0x00c0, 0x2bd7, 0x7924, 0x810f, 0xa18c, 0x00ff, 0x1078, 0x45c4, - 0x00c0, 0x2bdb, 0x7e38, 0xa684, 0x3fff, 0xa082, 0x4000, 0x0048, - 0x2d23, 0x0078, 0x2bdb, 0x7c28, 0x7d2c, 0x1078, 0x47a4, 0xd28c, - 0x00c0, 0x2d2e, 0x1078, 0x4736, 0x0078, 0x2d30, 0x1078, 0x4772, - 0x00c0, 0x2d5a, 0x2061, 0xae00, 0x127e, 0x2091, 0x8000, 0x6000, - 0xa086, 0x0000, 0x0040, 0x2d48, 0x6010, 0xa06d, 0x0040, 0x2d48, - 0x683c, 0xa406, 0x00c0, 0x2d48, 0x6840, 0xa506, 0x0040, 0x2d53, - 0x127f, 0xace0, 0x0010, 0x2001, 0xa716, 0x2004, 0xac02, 0x00c8, - 0x2bd7, 0x0078, 0x2d34, 0x1078, 0x8a11, 0x127f, 0x0040, 0x2bd7, - 0x0078, 0x2bad, 0xa00e, 0x2001, 0x0005, 0x1078, 0x4b51, 0x127e, - 0x2091, 0x8000, 0x1078, 0x8f95, 0x1078, 0x4a73, 0x127f, 0x0078, - 0x2bad, 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35d2, 0x0040, 0x2bdb, - 0x1078, 0x4673, 0x0040, 0x2bd7, 0x1078, 0x47b2, 0x0040, 0x2bd7, - 0x0078, 0x2bad, 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35e4, 0x0040, - 0x2bdb, 0x1078, 0x482f, 0x0040, 0x2bd7, 0x2019, 0x0005, 0x1078, - 0x47d3, 0x0040, 0x2bd7, 0x7828, 0xa08a, 0x1000, 0x00c8, 0x2bdb, - 0x8003, 0x800b, 0x810b, 0xa108, 0x1078, 0x5a52, 0x0078, 0x2bad, - 0x127e, 0x2091, 0x8000, 0x81ff, 0x0040, 0x2da2, 0x2009, 0x0001, - 0x0078, 0x2dd3, 0x2029, 0x00ff, 0x6450, 0x2400, 0xa506, 0x0040, - 0x2dcd, 0x2508, 0x1078, 0x45c4, 0x00c0, 0x2dcd, 0x1078, 0x482f, - 0x00c0, 0x2db8, 0x2009, 0x0002, 0x62ac, 0x2518, 0x0078, 0x2dd3, - 0x2019, 0x0004, 0x1078, 0x47d3, 0x00c0, 0x2dc2, 0x2009, 0x0006, - 0x0078, 0x2dd3, 0x7824, 0xa08a, 0x1000, 0x00c8, 0x2dd6, 0x8003, - 0x800b, 0x810b, 0xa108, 0x1078, 0x5a52, 0x8529, 0x00c8, 0x2da5, - 0x127f, 0x0078, 0x2bad, 0x127f, 0x0078, 0x2bd7, 0x127f, 0x0078, - 0x2bdb, 0x1078, 0x35d2, 0x0040, 0x2bdb, 0x1078, 0x46e7, 0x1078, - 0x47a4, 0x0078, 0x2bad, 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35d2, - 0x0040, 0x2bdb, 0x1078, 0x46d6, 0x1078, 0x47a4, 0x0078, 0x2bad, - 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35d2, 0x0040, 0x2bdb, 0x1078, - 0x4775, 0x0040, 0x2bd7, 0x1078, 0x4484, 0x1078, 0x472f, 0x1078, - 0x47a4, 0x0078, 0x2bad, 0x1078, 0x35d2, 0x0040, 0x2bdb, 0x1078, - 0x4673, 0x0040, 0x2bd7, 0x62a0, 0x2019, 0x0005, 0x0c7e, 0x1078, - 0x47e9, 0x0c7f, 0x1078, 0x5f01, 0x077e, 0x2039, 0x0000, 0x1078, - 0x5e0a, 0x2009, 0x0000, 0x1078, 0x9f9b, 0x077f, 0x1078, 0x47a4, - 0x0078, 0x2bad, 0x1078, 0x35d2, 0x0040, 0x2bdb, 0x1078, 0x47a4, - 0x2208, 0x0078, 0x2bad, 0x157e, 0x0d7e, 0x0e7e, 0x2069, 0xa814, - 0x6810, 0x6914, 0xa10a, 0x00c8, 0x2e37, 0x2009, 0x0000, 0x6816, - 0x2011, 0x0000, 0x2019, 0x0000, 0x20a9, 0x00ff, 0x2069, 0xa835, - 0x2d04, 0xa075, 0x0040, 0x2e4c, 0x704c, 0x1078, 0x2e56, 0xa210, - 0x7080, 0x1078, 0x2e56, 0xa318, 0x8d68, 0x00f0, 0x2e40, 0x2300, - 0xa218, 0x0e7f, 0x0d7f, 0x157f, 0x0078, 0x2bad, 0x0f7e, 0x017e, - 0xa07d, 0x0040, 0x2e65, 0x2001, 0x0000, 0x8000, 0x2f0c, 0x81ff, - 0x0040, 0x2e65, 0x2178, 0x0078, 0x2e5d, 0x017f, 0x0f7f, 0x007c, - 0x2069, 0xa814, 0x6910, 0x62a8, 0x0078, 0x2bad, 0x81ff, 0x00c0, - 0x2bd7, 0x6150, 0xa190, 0x29c0, 0x2214, 0xa294, 0x00ff, 0x6070, - 0xa084, 0xff00, 0xa215, 0x636c, 0x67cc, 0xd79c, 0x0040, 0x2e84, - 0x2031, 0x0001, 0x0078, 0x2e86, 0x2031, 0x0000, 0x7e3a, 0x7f3e, - 0x0078, 0x2bad, 0x6140, 0x6244, 0x2019, 0xa9a2, 0x231c, 0x0078, - 0x2bad, 0x127e, 0x2091, 0x8000, 0x6134, 0x6338, 0xa006, 0x2010, - 0x127f, 0x0078, 0x2bad, 0x1078, 0x35e4, 0x0040, 0x2bdb, 0x6244, - 0x6338, 0x0078, 0x2bad, 0x6140, 0x6244, 0x7824, 0x6042, 0x7b28, - 0x6346, 0x2069, 0xa752, 0x831f, 0xa305, 0x6816, 0x782c, 0x2069, - 0xa9a2, 0x2d1c, 0x206a, 0x0078, 0x2bad, 0x017e, 0x127e, 0x2091, - 0x8000, 0x7824, 0x6036, 0xd094, 0x0040, 0x2ec8, 0x7828, 0xa085, - 0x0001, 0x2009, 0xa9ab, 0x200a, 0x2001, 0xffff, 0x1078, 0x5ae6, - 0x782c, 0x603a, 0x127f, 0x017f, 0x0078, 0x2bad, 0x1078, 0x35e4, - 0x0040, 0x2bdb, 0x7828, 0xa00d, 0x0040, 0x2bdb, 0x782c, 0xa005, - 0x0040, 0x2bdb, 0x6244, 0x6146, 0x6338, 0x603a, 0x0078, 0x2bad, - 0x2001, 0xa700, 0x2004, 0xa086, 0x0003, 0x00c0, 0x2bd7, 0x0c7e, - 0x2061, 0x0100, 0x7924, 0x810f, 0xa18c, 0x00ff, 0xa196, 0x00ff, - 0x00c0, 0x2ef7, 0x6030, 0xa085, 0xff00, 0x0078, 0x2f06, 0xa182, - 0x007f, 0x00c8, 0x2f30, 0xa188, 0x29c0, 0x210c, 0xa18c, 0x00ff, - 0x6030, 0xa116, 0x0040, 0x2f30, 0x810f, 0xa105, 0x127e, 0x2091, - 0x8000, 0x007e, 0x1078, 0x76c7, 0x007f, 0x0040, 0x2f2c, 0x601a, - 0x600b, 0xbc09, 0x601f, 0x0001, 0x1078, 0x35ba, 0x0040, 0x2f33, - 0x6837, 0x0000, 0x7007, 0x0003, 0x6833, 0x0000, 0x6838, 0xc0fd, - 0x683a, 0x701b, 0x2f8e, 0x2d00, 0x6012, 0x2009, 0x0032, 0x1078, - 0x775c, 0x127f, 0x0c7f, 0x007c, 0x127f, 0x0c7f, 0x0078, 0x2bd7, - 0x0c7f, 0x0078, 0x2bdb, 0x1078, 0x772d, 0x0078, 0x2f2c, 0x2001, - 0xa700, 0x2004, 0xa086, 0x0003, 0x00c0, 0x2bd7, 0x0c7e, 0x2061, - 0x0100, 0x7924, 0x810f, 0xa18c, 0x00ff, 0xa196, 0x00ff, 0x00c0, - 0x2f4e, 0x6030, 0xa085, 0xff00, 0x0078, 0x2f5d, 0xa182, 0x007f, - 0x00c8, 0x2f87, 0xa188, 0x29c0, 0x210c, 0xa18c, 0x00ff, 0x6030, - 0xa116, 0x0040, 0x2f87, 0x810f, 0xa105, 0x127e, 0x2091, 0x8000, - 0x007e, 0x1078, 0x76c7, 0x007f, 0x0040, 0x2f83, 0x601a, 0x600b, - 0xbc05, 0x601f, 0x0001, 0x1078, 0x35ba, 0x0040, 0x2f8a, 0x6837, - 0x0000, 0x7007, 0x0003, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, - 0x701b, 0x2f8e, 0x2d00, 0x6012, 0x2009, 0x0032, 0x1078, 0x775c, - 0x127f, 0x0c7f, 0x007c, 0x127f, 0x0c7f, 0x0078, 0x2bd7, 0x0c7f, - 0x0078, 0x2bdb, 0x1078, 0x772d, 0x0078, 0x2f83, 0x6830, 0xa086, - 0x0100, 0x0040, 0x2bd7, 0x0078, 0x2bad, 0x2061, 0xaa33, 0x127e, - 0x2091, 0x8000, 0x6000, 0xd084, 0x0040, 0x2fa6, 0x6104, 0x6208, - 0x2019, 0xa712, 0x231c, 0x127f, 0x0078, 0x2bad, 0x127f, 0x0078, - 0x2bdb, 0x81ff, 0x00c0, 0x2bd7, 0x127e, 0x2091, 0x8000, 0x6248, - 0x6064, 0xa202, 0x0048, 0x2fbd, 0xa085, 0x0001, 0x1078, 0x256a, - 0x1078, 0x3c9e, 0x127f, 0x0078, 0x2bad, 0x127f, 0x0078, 0x2bdb, - 0x127e, 0x2091, 0x8000, 0x20a9, 0x0012, 0x2001, 0xa740, 0x20a0, - 0xa006, 0x40a4, 0x127f, 0x0078, 0x2bad, 0x7d38, 0x7c3c, 0x0078, - 0x2c5f, 0x7824, 0xa09c, 0x00ff, 0xa39a, 0x0003, 0x00c8, 0x2bd7, - 0x6250, 0xa084, 0xff00, 0x8007, 0xa206, 0x00c0, 0x2fe9, 0x2001, - 0xa740, 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0078, - 0x3608, 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35e4, 0x0040, 0x2bdb, - 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x2bd7, 0x0c7e, - 0x1078, 0x35ba, 0x0c7f, 0x0040, 0x2bd7, 0x6837, 0x0000, 0x6838, - 0xc0fd, 0x683a, 0x1078, 0x8e5a, 0x0040, 0x2bd7, 0x7007, 0x0003, - 0x701b, 0x300b, 0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x2bd7, - 0xad80, 0x000e, 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, - 0x0078, 0x3608, 0x1078, 0x35ba, 0x0040, 0x2bd7, 0x1078, 0x42dd, - 0x2009, 0x001c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x3604, - 0x701b, 0x302b, 0x007c, 0xade8, 0x000d, 0x6800, 0xa005, 0x0040, - 0x2bdb, 0x6804, 0xd0ac, 0x0040, 0x3038, 0xd0a4, 0x0040, 0x2bdb, - 0xd094, 0x0040, 0x3043, 0x0c7e, 0x2061, 0x0100, 0x6104, 0xa18c, - 0xffdf, 0x6106, 0x0c7f, 0xd08c, 0x0040, 0x304e, 0x0c7e, 0x2061, - 0x0100, 0x6104, 0xa18d, 0x0010, 0x6106, 0x0c7f, 0x2009, 0x0100, - 0x210c, 0xa18a, 0x0002, 0x0048, 0x3063, 0xd084, 0x0040, 0x3063, - 0x6a28, 0xa28a, 0x007f, 0x00c8, 0x2bdb, 0xa288, 0x29c0, 0x210c, - 0xa18c, 0x00ff, 0x6156, 0xd0dc, 0x0040, 0x306c, 0x6828, 0xa08a, - 0x007f, 0x00c8, 0x2bdb, 0x6052, 0x6808, 0xa08a, 0x0100, 0x0048, - 0x2bdb, 0xa08a, 0x0841, 0x00c8, 0x2bdb, 0xa084, 0x0007, 0x00c0, - 0x2bdb, 0x680c, 0xa005, 0x0040, 0x2bdb, 0x6810, 0xa005, 0x0040, - 0x2bdb, 0x6848, 0x6940, 0xa10a, 0x00c8, 0x2bdb, 0x8001, 0x0040, - 0x2bdb, 0x684c, 0x6944, 0xa10a, 0x00c8, 0x2bdb, 0x8001, 0x0040, - 0x2bdb, 0x6804, 0xd0fc, 0x0040, 0x30c2, 0x1078, 0x35ba, 0x0040, - 0x2bd7, 0x2009, 0x0014, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0xa290, - 0x0038, 0xa399, 0x0000, 0x1078, 0x3604, 0x701b, 0x30a8, 0x007c, - 0xade8, 0x000d, 0x20a9, 0x0014, 0x2d98, 0x2069, 0xa76e, 0x2da0, - 0x53a3, 0x7010, 0xa0e8, 0x000d, 0x2001, 0xa772, 0x200c, 0xd1e4, - 0x0040, 0x30c2, 0x0c7e, 0x2061, 0x0100, 0x6004, 0xa085, 0x0b00, - 0x6006, 0x0c7f, 0x20a9, 0x001c, 0x2d98, 0x2069, 0xa752, 0x2da0, - 0x53a3, 0x6814, 0xa08c, 0x00ff, 0x6142, 0x8007, 0xa084, 0x00ff, - 0x6046, 0x1078, 0x4eae, 0x1078, 0x49ce, 0x1078, 0x4a3e, 0x6000, - 0xa086, 0x0000, 0x00c0, 0x314d, 0x6808, 0x602a, 0x1078, 0x21f7, - 0x6818, 0x691c, 0x6a20, 0x6b24, 0x8007, 0x810f, 0x8217, 0x831f, - 0x6016, 0x611a, 0x621e, 0x6322, 0x6c04, 0xd4f4, 0x0040, 0x30fa, - 0x6830, 0x6934, 0x6a38, 0x6b3c, 0x8007, 0x810f, 0x8217, 0x831f, - 0x0078, 0x30fc, 0xa084, 0xf0ff, 0x6006, 0x610a, 0x620e, 0x6312, - 0x1078, 0x5b19, 0x6904, 0xd1fc, 0x0040, 0x312f, 0x0c7e, 0x2009, - 0x0000, 0x20a9, 0x0001, 0x6b70, 0xd384, 0x0040, 0x312c, 0x0078, - 0x3116, 0x839d, 0x00c8, 0x312c, 0x3508, 0x8109, 0x1078, 0x5480, - 0x6878, 0x6016, 0x6874, 0x2008, 0xa084, 0xff00, 0x8007, 0x600a, - 0xa184, 0x00ff, 0x6006, 0x8108, 0x00c0, 0x312a, 0x6003, 0x0003, - 0x0078, 0x312c, 0x6003, 0x0001, 0x00f0, 0x3111, 0x0c7f, 0x0c7e, - 0x2061, 0x0100, 0x602f, 0x0040, 0x602f, 0x0000, 0x0c7f, 0x1078, - 0x3819, 0x0040, 0x313d, 0x1078, 0x256a, 0x60c0, 0xa005, 0x0040, - 0x3149, 0x6003, 0x0001, 0x2091, 0x301d, 0x1078, 0x4224, 0x0078, - 0x314d, 0x6003, 0x0004, 0x2091, 0x301d, 0x0078, 0x2bad, 0x6000, - 0xa086, 0x0000, 0x0040, 0x2bd7, 0x2069, 0xa752, 0x7830, 0x6842, - 0x7834, 0x6846, 0x6804, 0xd0fc, 0x0040, 0x3162, 0x2009, 0x0030, - 0x0078, 0x3164, 0x2009, 0x001c, 0x2d00, 0x7a2c, 0x7b28, 0x7c3c, - 0x7d38, 0x0078, 0x3608, 0xa006, 0x1078, 0x256a, 0x81ff, 0x00c0, - 0x2bd7, 0x1078, 0x42dd, 0x1078, 0x4224, 0x0078, 0x2bad, 0x81ff, - 0x00c0, 0x2bd7, 0x6184, 0x81ff, 0x0040, 0x3191, 0x703f, 0x0000, - 0x2001, 0xadc0, 0x2009, 0x0040, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, - 0x127e, 0x2091, 0x8000, 0x1078, 0x3608, 0x701b, 0x2baa, 0x127f, - 0x007c, 0x703f, 0x0001, 0x0d7e, 0x2069, 0xadc0, 0x20a9, 0x0040, - 0x20a1, 0xadc0, 0x2019, 0xffff, 0x43a4, 0x6550, 0xa588, 0x29c0, - 0x210c, 0xa18c, 0x00ff, 0x216a, 0xa00e, 0x2011, 0x0002, 0x2100, - 0xa506, 0x0040, 0x31c3, 0x1078, 0x45c4, 0x00c0, 0x31c3, 0x6014, - 0x821c, 0x0048, 0x31bb, 0xa398, 0xadc0, 0xa085, 0xff00, 0x8007, - 0x201a, 0x0078, 0x31c2, 0xa398, 0xadc0, 0x2324, 0xa4a4, 0xff00, - 0xa405, 0x201a, 0x8210, 0x8108, 0xa182, 0x0080, 0x00c8, 0x31ca, - 0x0078, 0x31a7, 0x8201, 0x8007, 0x2d0c, 0xa105, 0x206a, 0x0d7f, - 0x20a9, 0x0040, 0x20a1, 0xadc0, 0x2099, 0xadc0, 0x1078, 0x4281, - 0x0078, 0x3180, 0x1078, 0x35e4, 0x0040, 0x2bdb, 0x0c7e, 0x1078, - 0x35ba, 0x0c7f, 0x00c0, 0x31e8, 0x2009, 0x0002, 0x0078, 0x2bd7, - 0x2001, 0xa753, 0x2004, 0xd0b4, 0x0040, 0x320f, 0x6000, 0xd08c, - 0x00c0, 0x320f, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, - 0x320f, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x1078, 0x8eae, - 0x00c0, 0x3206, 0x2009, 0x0003, 0x0078, 0x2bd7, 0x7007, 0x0003, - 0x701b, 0x320b, 0x007c, 0x1078, 0x35e4, 0x0040, 0x2bdb, 0x20a9, - 0x002b, 0x2c98, 0xade8, 0x0002, 0x2da0, 0x53a3, 0x20a9, 0x0004, - 0xac80, 0x0006, 0x2098, 0xad80, 0x0006, 0x20a0, 0x1078, 0x4281, - 0x20a9, 0x0004, 0xac80, 0x000a, 0x2098, 0xad80, 0x000a, 0x20a0, - 0x1078, 0x4281, 0x2d00, 0x2009, 0x002b, 0x7a2c, 0x7b28, 0x7c3c, - 0x7d38, 0x0078, 0x3608, 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35d2, - 0x0040, 0x2bdb, 0x1078, 0x47bd, 0x0078, 0x2bad, 0x81ff, 0x00c0, - 0x2bd7, 0x7828, 0xa08a, 0x1000, 0x00c8, 0x2bdb, 0x1078, 0x35e4, - 0x0040, 0x2bdb, 0x1078, 0x482f, 0x0040, 0x2bd7, 0x2019, 0x0004, - 0x1078, 0x47d3, 0x7924, 0x810f, 0x7a28, 0x1078, 0x3259, 0x0078, - 0x2bad, 0xa186, 0x00ff, 0x0040, 0x3261, 0x1078, 0x3271, 0x0078, - 0x3270, 0x2029, 0x007e, 0x2061, 0xa700, 0x6450, 0x2400, 0xa506, - 0x0040, 0x326d, 0x2508, 0x1078, 0x3271, 0x8529, 0x00c8, 0x3266, - 0x007c, 0x1078, 0x45c4, 0x00c0, 0x327c, 0x2200, 0x8003, 0x800b, - 0x810b, 0xa108, 0x1078, 0x5a52, 0x007c, 0x81ff, 0x00c0, 0x2bd7, - 0x1078, 0x35d2, 0x0040, 0x2bdb, 0x1078, 0x4673, 0x0040, 0x2bd7, - 0x1078, 0x47c8, 0x0078, 0x2bad, 0x81ff, 0x00c0, 0x2bd7, 0x1078, - 0x35d2, 0x0040, 0x2bdb, 0x1078, 0x4673, 0x0040, 0x2bd7, 0x1078, - 0x47b2, 0x0078, 0x2bad, 0x6100, 0x0078, 0x2bad, 0x1078, 0x35e4, - 0x0040, 0x2bdb, 0x2001, 0xa700, 0x2004, 0xa086, 0x0003, 0x00c0, - 0x2bd7, 0x0d7e, 0xace8, 0x000a, 0x7924, 0xd184, 0x0040, 0x32b2, - 0xace8, 0x0006, 0x680c, 0x8007, 0x783e, 0x6808, 0x8007, 0x783a, - 0x6b04, 0x831f, 0x6a00, 0x8217, 0x0d7f, 0x6100, 0xa18c, 0x0200, - 0x0078, 0x2bad, 0xa006, 0x1078, 0x256a, 0x7824, 0xa084, 0x00ff, - 0xa086, 0x00ff, 0x0040, 0x32cf, 0x81ff, 0x00c0, 0x2bd7, 0x1078, - 0x42dd, 0x7828, 0xa08a, 0x1000, 0x00c8, 0x2bdb, 0x7924, 0xa18c, - 0xff00, 0x810f, 0xa186, 0x00ff, 0x0040, 0x32e5, 0xa182, 0x007f, - 0x00c8, 0x2bdb, 0x2100, 0x1078, 0x2564, 0x027e, 0x0c7e, 0x127e, - 0x2091, 0x8000, 0x2061, 0xa9c4, 0x601b, 0x0000, 0x601f, 0x0000, - 0x2011, 0x0003, 0x1078, 0x70e0, 0x2011, 0x0002, 0x1078, 0x70ea, - 0x1078, 0x6fc4, 0x037e, 0x2019, 0x0000, 0x1078, 0x7058, 0x037f, - 0x2061, 0x0100, 0x6030, 0xa084, 0x00ff, 0x810f, 0xa105, 0x604a, - 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x002d, 0x2011, 0x4259, - 0x1078, 0x5add, 0x7924, 0xa18c, 0xff00, 0x810f, 0x7a28, 0x1078, - 0x3259, 0x127f, 0x0c7f, 0x027f, 0x0078, 0x2bad, 0x7924, 0xa18c, - 0xff00, 0x810f, 0x0c7e, 0x1078, 0x455c, 0x2c08, 0x0c7f, 0x00c0, - 0x2bdb, 0x0078, 0x2bad, 0x81ff, 0x0040, 0x3332, 0x2009, 0x0001, - 0x0078, 0x2bd7, 0x60cc, 0xd09c, 0x00c0, 0x333a, 0x2009, 0x0005, - 0x0078, 0x2bd7, 0x1078, 0x35ba, 0x00c0, 0x3342, 0x2009, 0x0002, - 0x0078, 0x2bd7, 0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, - 0x3604, 0x701b, 0x334c, 0x007c, 0x2009, 0x0080, 0x1078, 0x45c4, - 0x00c0, 0x3359, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x0040, - 0x335d, 0x2021, 0x400a, 0x0078, 0x2baf, 0x0d7e, 0xade8, 0x000d, - 0x6900, 0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x6e18, 0x6820, 0xa0be, - 0x0100, 0x0040, 0x33d0, 0xa0be, 0x0112, 0x0040, 0x33d0, 0xa0be, - 0x0113, 0x0040, 0x33d0, 0xa0be, 0x0114, 0x0040, 0x33d0, 0xa0be, - 0x0117, 0x0040, 0x33d0, 0xa0be, 0x011a, 0x0040, 0x33d0, 0xa0be, - 0x0121, 0x0040, 0x33c6, 0xa0be, 0x0131, 0x0040, 0x33c6, 0xa0be, - 0x0171, 0x0040, 0x33d0, 0xa0be, 0x0173, 0x0040, 0x33d0, 0xa0be, - 0x01a1, 0x00c0, 0x3398, 0x6830, 0x8007, 0x6832, 0x0078, 0x33d6, - 0xa0be, 0x0212, 0x0040, 0x33cc, 0xa0be, 0x0213, 0x0040, 0x33cc, - 0xa0be, 0x0214, 0x0040, 0x33be, 0xa0be, 0x0217, 0x0040, 0x33b8, - 0xa0be, 0x021a, 0x00c0, 0x33b1, 0x6838, 0x8007, 0x683a, 0x0078, - 0x33d0, 0xa0be, 0x0300, 0x0040, 0x33d0, 0x0d7f, 0x0078, 0x2bdb, - 0xad80, 0x0010, 0x20a9, 0x0007, 0x1078, 0x3418, 0xad80, 0x000e, - 0x20a9, 0x0001, 0x1078, 0x3418, 0x0078, 0x33d0, 0xad80, 0x000c, - 0x1078, 0x3426, 0x0078, 0x33d6, 0xad80, 0x000e, 0x1078, 0x3426, - 0xad80, 0x000c, 0x20a9, 0x0001, 0x1078, 0x3418, 0x0c7e, 0x1078, - 0x35ba, 0x0040, 0x3409, 0x6838, 0xc0fd, 0x683a, 0x6837, 0x0119, - 0x6853, 0x0000, 0x684f, 0x0020, 0x685b, 0x0001, 0x810b, 0x697e, - 0x6883, 0x0000, 0x6a86, 0x6b8a, 0x6c8e, 0x6d92, 0x6996, 0x689b, - 0x0000, 0x0c7f, 0x0d7f, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, - 0x6823, 0x0000, 0x6804, 0x2068, 0x1078, 0x8e76, 0x00c0, 0x3404, - 0x2009, 0x0003, 0x0078, 0x2bd7, 0x7007, 0x0003, 0x701b, 0x340f, - 0x007c, 0x0c7f, 0x0d7f, 0x2009, 0x0002, 0x0078, 0x2bd7, 0x6820, - 0xa086, 0x8001, 0x00c0, 0x2bad, 0x2009, 0x0004, 0x0078, 0x2bd7, - 0x017e, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x290a, 0x8108, - 0x280a, 0x8108, 0x00f0, 0x341a, 0x017f, 0x007c, 0x017e, 0x0a7e, - 0x0b7e, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x2054, 0x8000, - 0x205c, 0x2b0a, 0x8108, 0x2a0a, 0x8108, 0x290a, 0x8108, 0x280a, - 0x0b7f, 0x0a7f, 0x017f, 0x007c, 0x81ff, 0x0040, 0x3443, 0x2009, - 0x0001, 0x0078, 0x2bd7, 0x60cc, 0xd09c, 0x00c0, 0x344b, 0x2009, - 0x0005, 0x0078, 0x2bd7, 0x7924, 0x2140, 0xa18c, 0xff00, 0x810f, - 0xa182, 0x0080, 0x0048, 0x2bdb, 0xa182, 0x00ff, 0x00c8, 0x2bdb, - 0x7a2c, 0x7b28, 0x606c, 0xa306, 0x00c0, 0x3466, 0x6070, 0xa24e, - 0x0040, 0x2bdb, 0xa9cc, 0xff00, 0x0040, 0x2bdb, 0x0c7e, 0x1078, - 0x350f, 0x2c68, 0x0c7f, 0x0040, 0x349e, 0xa0c6, 0x4000, 0x00c0, - 0x3484, 0x0c7e, 0x007e, 0x2d60, 0x2009, 0x0000, 0x1078, 0x489b, - 0x00c0, 0x347b, 0xc185, 0x6000, 0xd0bc, 0x0040, 0x3480, 0xc18d, - 0x007f, 0x0c7f, 0x0078, 0x349b, 0xa0c6, 0x4007, 0x00c0, 0x348b, - 0x2408, 0x0078, 0x349b, 0xa0c6, 0x4008, 0x00c0, 0x3493, 0x2708, - 0x2610, 0x0078, 0x349b, 0xa0c6, 0x4009, 0x00c0, 0x3499, 0x0078, - 0x349b, 0x2001, 0x4006, 0x2020, 0x0078, 0x2baf, 0x2d00, 0x7022, - 0x017e, 0x0b7e, 0x0c7e, 0x0e7e, 0x2c70, 0x1078, 0x76c7, 0x0040, - 0x34e4, 0x2d00, 0x601a, 0x2001, 0xa757, 0x2004, 0xa084, 0x00ff, - 0x6842, 0x2e58, 0x0e7f, 0x0e7e, 0x0c7e, 0x1078, 0x35ba, 0x0c7f, - 0x2b70, 0x00c0, 0x34c5, 0x1078, 0x772d, 0x0e7f, 0x0c7f, 0x0b7f, - 0x017f, 0x2009, 0x0002, 0x0078, 0x2bd7, 0x6837, 0x0000, 0x2d00, - 0x6012, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x127e, 0x2091, - 0x8000, 0x1078, 0x2880, 0x127f, 0x601f, 0x0001, 0x2001, 0x0000, - 0x1078, 0x44ee, 0x2001, 0x0002, 0x1078, 0x4502, 0x2009, 0x0002, - 0x1078, 0x775c, 0xa085, 0x0001, 0x0e7f, 0x0c7f, 0x0b7f, 0x017f, - 0x00c0, 0x34ee, 0x2009, 0x0003, 0x0078, 0x2bd7, 0x7007, 0x0003, - 0x701b, 0x34f3, 0x007c, 0x6830, 0xa086, 0x0100, 0x7020, 0x2060, - 0x00c0, 0x3501, 0x2009, 0x0004, 0x6204, 0xa294, 0x00ff, 0x0078, - 0x2bd7, 0x2009, 0x0000, 0x1078, 0x489b, 0x00c0, 0x3508, 0xc185, - 0x6000, 0xd0bc, 0x0040, 0x350d, 0xc18d, 0x0078, 0x2bad, 0x0e7e, - 0x0d7e, 0x2029, 0x0000, 0x2021, 0x0080, 0x20a9, 0x007f, 0x2071, - 0xa8b5, 0x2e04, 0xa005, 0x00c0, 0x3524, 0x2100, 0xa406, 0x00c0, - 0x3555, 0x2428, 0x0078, 0x3555, 0x2068, 0x6f10, 0x2700, 0xa306, - 0x00c0, 0x3546, 0x6e14, 0x2600, 0xa206, 0x00c0, 0x3546, 0x2400, - 0xa106, 0x00c0, 0x3542, 0x2d60, 0xd884, 0x0040, 0x356a, 0x6004, - 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x356a, 0x2001, 0x4000, - 0x0078, 0x356b, 0x2001, 0x4007, 0x0078, 0x356b, 0x2400, 0xa106, - 0x00c0, 0x3555, 0x6e14, 0x87ff, 0x00c0, 0x3551, 0x86ff, 0x0040, - 0x3521, 0x2001, 0x4008, 0x0078, 0x356b, 0x8420, 0x8e70, 0x00f0, - 0x3519, 0x85ff, 0x00c0, 0x3564, 0x2001, 0x4009, 0x0078, 0x356b, - 0x2001, 0x0001, 0x0078, 0x356b, 0x1078, 0x455c, 0x00c0, 0x3560, - 0x6312, 0x6216, 0xa006, 0xa005, 0x0d7f, 0x0e7f, 0x007c, 0x81ff, - 0x00c0, 0x2bd7, 0x1078, 0x35ba, 0x0040, 0x2bd7, 0x6837, 0x0000, - 0x6838, 0xc0fd, 0x683a, 0x7824, 0xa005, 0x0040, 0x2bdb, 0xa096, - 0x00ff, 0x0040, 0x3587, 0xa092, 0x0004, 0x00c8, 0x2bdb, 0x2010, - 0x2d18, 0x1078, 0x282f, 0x0040, 0x2bd7, 0x7007, 0x0003, 0x701b, - 0x3592, 0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x2bd7, 0x0078, - 0x2bad, 0x7924, 0xa18c, 0xff00, 0x810f, 0xa182, 0x0080, 0x0048, - 0x2bdb, 0xa182, 0x00ff, 0x00c8, 0x2bdb, 0x127e, 0x2091, 0x8000, - 0x1078, 0x8d5b, 0x00c0, 0x35b7, 0xa190, 0xa835, 0x2204, 0xa065, - 0x0040, 0x35b7, 0x1078, 0x42f8, 0x127f, 0x0078, 0x2bad, 0x127f, - 0x0078, 0x2bd7, 0x1078, 0x138b, 0x0040, 0x35d1, 0xa006, 0x6802, - 0x7010, 0xa005, 0x00c0, 0x35c9, 0x2d00, 0x7012, 0x7016, 0x0078, - 0x35cf, 0x7014, 0x6802, 0x2060, 0x2d00, 0x6006, 0x7016, 0xad80, - 0x000d, 0x007c, 0x7924, 0x810f, 0xa18c, 0x00ff, 0x1078, 0x45c4, - 0x00c0, 0x35e1, 0x7e28, 0xa684, 0x3fff, 0xa082, 0x4000, 0x0048, - 0x35e2, 0xa066, 0x8cff, 0x007c, 0x7e24, 0x860f, 0xa18c, 0x00ff, - 0x1078, 0x45c4, 0x00c0, 0x35f2, 0xa6b4, 0x00ff, 0xa682, 0x4000, - 0x0048, 0x35f3, 0xa066, 0x8cff, 0x007c, 0x017e, 0x7110, 0x81ff, - 0x0040, 0x3600, 0x2168, 0x6904, 0x1078, 0x13a4, 0x0078, 0x35f7, - 0x7112, 0x7116, 0x017f, 0x007c, 0x2031, 0x0001, 0x0078, 0x360a, - 0x2031, 0x0000, 0x2061, 0xa7d2, 0x6606, 0x6112, 0x600e, 0x6226, - 0x632a, 0x642e, 0x6532, 0x2c10, 0x1078, 0x13db, 0x7007, 0x0002, - 0x701b, 0x2bad, 0x007c, 0x0f7e, 0x127e, 0x2091, 0x8000, 0x2079, - 0x0000, 0x2001, 0xa790, 0x2004, 0xa005, 0x00c0, 0x3636, 0x0068, - 0x3636, 0x7818, 0xd084, 0x00c0, 0x3636, 0x7a22, 0x7b26, 0x7c2a, - 0x781b, 0x0001, 0x2091, 0x4080, 0x0078, 0x365b, 0x017e, 0x0c7e, - 0x0e7e, 0x2071, 0xa782, 0x7138, 0xa182, 0x0008, 0x0048, 0x3644, - 0x7030, 0x2060, 0x0078, 0x3655, 0x7030, 0xa0e0, 0x0008, 0xac82, - 0xa7d2, 0x0048, 0x364d, 0x2061, 0xa792, 0x2c00, 0x7032, 0x81ff, - 0x00c0, 0x3653, 0x7036, 0x8108, 0x713a, 0x2262, 0x6306, 0x640a, - 0x0e7f, 0x0c7f, 0x017f, 0x127f, 0x0f7f, 0x007c, 0x0e7e, 0x2071, - 0xa782, 0x7038, 0xa005, 0x0040, 0x3697, 0x127e, 0x2091, 0x8000, - 0x0068, 0x3696, 0x0f7e, 0x2079, 0x0000, 0x7818, 0xd084, 0x00c0, - 0x3695, 0x0c7e, 0x7034, 0x2060, 0x2c04, 0x7822, 0x6004, 0x7826, - 0x6008, 0x782a, 0x781b, 0x0001, 0x2091, 0x4080, 0x7038, 0x8001, - 0x703a, 0xa005, 0x00c0, 0x368b, 0x7033, 0xa792, 0x7037, 0xa792, - 0x0c7f, 0x0078, 0x3695, 0xac80, 0x0008, 0xa0fa, 0xa7d2, 0x0048, - 0x3693, 0x2001, 0xa792, 0x7036, 0x0c7f, 0x0f7f, 0x127f, 0x0e7f, - 0x007c, 0x027e, 0x2001, 0xa753, 0x2004, 0xd0c4, 0x0040, 0x36a4, - 0x2011, 0x8014, 0x1078, 0x361b, 0x027f, 0x007c, 0x81ff, 0x00c0, - 0x2bd7, 0x127e, 0x2091, 0x8000, 0x6030, 0xc08d, 0xc085, 0xc0ac, - 0x6032, 0x1078, 0x4224, 0x127f, 0x0078, 0x2bad, 0x81ff, 0x00c0, - 0x2bd7, 0x6000, 0xa086, 0x0003, 0x00c0, 0x2bd7, 0x2001, 0xa753, - 0x2004, 0xd0ac, 0x00c0, 0x2bd7, 0x1078, 0x35e4, 0x0040, 0x2bdb, - 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x36d3, 0x7828, - 0xa005, 0x0040, 0x2bad, 0x0c7e, 0x1078, 0x35ba, 0x0c7f, 0x0040, - 0x2bd7, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, - 0x1078, 0x8f22, 0x0040, 0x2bd7, 0x7007, 0x0003, 0x701b, 0x36e9, - 0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x2bd7, 0x0078, 0x2bad, - 0x2001, 0xa700, 0x2004, 0xa086, 0x0003, 0x00c0, 0x2bd7, 0x7f24, - 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x35ba, 0x0040, 0x2bd7, - 0x2009, 0x0000, 0x2031, 0x0000, 0x7023, 0x0000, 0x702f, 0x0000, - 0xad80, 0x0005, 0x7026, 0x20a0, 0x1078, 0x45c4, 0x00c0, 0x376d, - 0x6004, 0xa0c4, 0x00ff, 0xa8c6, 0x0006, 0x0040, 0x371d, 0xa0c4, - 0xff00, 0xa8c6, 0x0600, 0x00c0, 0x376d, 0x2001, 0xa753, 0x2004, - 0xd0ac, 0x00c0, 0x372a, 0x1078, 0x489b, 0x00c0, 0x372a, 0xd79c, - 0x0040, 0x376d, 0xd794, 0x00c0, 0x3730, 0xd784, 0x0040, 0x373c, - 0xac80, 0x0006, 0x2098, 0x3400, 0x20a9, 0x0004, 0x53a3, 0x1078, - 0x3426, 0xd794, 0x0040, 0x3745, 0xac80, 0x000a, 0x2098, 0x3400, - 0x20a9, 0x0004, 0x53a3, 0x1078, 0x3426, 0x21a2, 0xd794, 0x0040, - 0x3765, 0xac80, 0x0000, 0x2098, 0x94a0, 0x20a9, 0x0002, 0x53a3, - 0xac80, 0x0003, 0x20a6, 0x94a0, 0xac80, 0x0004, 0x2098, 0x3400, - 0x20a9, 0x0002, 0x53a3, 0x1078, 0x3418, 0xac80, 0x0026, 0x2098, - 0x20a9, 0x0002, 0x53a3, 0x0078, 0x3766, 0x94a0, 0xd794, 0x0040, - 0x376b, 0xa6b0, 0x000b, 0xa6b0, 0x0005, 0x8108, 0xd78c, 0x0040, - 0x3777, 0xa186, 0x0100, 0x0040, 0x3788, 0x0078, 0x377b, 0xa186, - 0x007e, 0x0040, 0x3788, 0xd794, 0x0040, 0x3782, 0xa686, 0x0020, - 0x0078, 0x3784, 0xa686, 0x0028, 0x0040, 0x3791, 0x0078, 0x370c, - 0x86ff, 0x00c0, 0x378f, 0x7120, 0x810b, 0x0078, 0x2bad, 0x702f, - 0x0001, 0x711e, 0x7020, 0xa600, 0x7022, 0x772a, 0x2061, 0xa7d2, - 0x6007, 0x0000, 0x6612, 0x7024, 0x600e, 0x6226, 0x632a, 0x642e, - 0x6532, 0x2c10, 0x1078, 0x13db, 0x7007, 0x0002, 0x701b, 0x37a9, - 0x007c, 0x702c, 0xa005, 0x00c0, 0x37bb, 0x711c, 0x7024, 0x20a0, - 0x7728, 0x2031, 0x0000, 0x2061, 0xa7d2, 0x6224, 0x6328, 0x642c, - 0x6530, 0x0078, 0x370c, 0x7120, 0x810b, 0x0078, 0x2bad, 0x2029, - 0x007e, 0x7924, 0x7a28, 0x7b2c, 0x7c38, 0xa184, 0xff00, 0x8007, - 0xa0e2, 0x0020, 0x0048, 0x2bdb, 0xa502, 0x0048, 0x2bdb, 0xa184, - 0x00ff, 0xa0e2, 0x0020, 0x0048, 0x2bdb, 0xa502, 0x0048, 0x2bdb, - 0xa284, 0xff00, 0x8007, 0xa0e2, 0x0020, 0x0048, 0x2bdb, 0xa502, - 0x0048, 0x2bdb, 0xa284, 0x00ff, 0xa0e2, 0x0020, 0x0048, 0x2bdb, - 0xa502, 0x0048, 0x2bdb, 0xa384, 0xff00, 0x8007, 0xa0e2, 0x0020, - 0x0048, 0x2bdb, 0xa502, 0x0048, 0x2bdb, 0xa384, 0x00ff, 0xa0e2, - 0x0020, 0x0048, 0x2bdb, 0xa502, 0x0048, 0x2bdb, 0xa484, 0xff00, - 0x8007, 0xa0e2, 0x0020, 0x0048, 0x2bdb, 0xa502, 0x0048, 0x2bdb, - 0xa484, 0x00ff, 0xa0e2, 0x0020, 0x0048, 0x2bdb, 0xa502, 0x0048, - 0x2bdb, 0x2061, 0xa9a5, 0x6102, 0x6206, 0x630a, 0x640e, 0x0078, - 0x2bad, 0x007e, 0x2001, 0xa753, 0x2004, 0xd0cc, 0x007f, 0x007c, - 0x007e, 0x2001, 0xa772, 0x2004, 0xd0bc, 0x007f, 0x007c, 0x6164, - 0x7a24, 0x6300, 0x82ff, 0x00c0, 0x3830, 0x7926, 0x0078, 0x2bad, - 0x83ff, 0x00c0, 0x2bdb, 0x2001, 0xfff0, 0xa200, 0x00c8, 0x2bdb, - 0x2019, 0xffff, 0x6068, 0xa302, 0xa200, 0x0048, 0x2bdb, 0x7926, - 0x6266, 0x0078, 0x2bad, 0x2001, 0xa700, 0x2004, 0xa086, 0x0003, - 0x00c0, 0x2bd7, 0x7c28, 0x7d24, 0x7e38, 0x7f2c, 0x1078, 0x35ba, - 0x0040, 0x2bd7, 0x2009, 0x0000, 0x2019, 0x0000, 0x7023, 0x0000, - 0x702f, 0x0000, 0xad80, 0x0003, 0x7026, 0x20a0, 0xa1e0, 0xa835, - 0x2c64, 0x8cff, 0x0040, 0x387d, 0x6004, 0xa084, 0x00ff, 0xa086, - 0x0006, 0x0040, 0x3872, 0x6004, 0xa084, 0xff00, 0xa086, 0x0600, - 0x00c0, 0x387d, 0x6014, 0x20a2, 0x94a0, 0x6010, 0x8007, 0xa105, - 0x8007, 0x20a2, 0x94a0, 0xa398, 0x0002, 0x8108, 0xa182, 0x00ff, - 0x0040, 0x3888, 0xa386, 0x002a, 0x0040, 0x3891, 0x0078, 0x385e, - 0x83ff, 0x00c0, 0x388f, 0x7120, 0x810c, 0x0078, 0x2bad, 0x702f, - 0x0001, 0x711e, 0x7020, 0xa300, 0x7022, 0x2061, 0xa7d2, 0x6007, - 0x0000, 0x6312, 0x7024, 0x600e, 0x6426, 0x652a, 0x662e, 0x6732, - 0x2c10, 0x1078, 0x13db, 0x7007, 0x0002, 0x701b, 0x38a8, 0x007c, - 0x702c, 0xa005, 0x00c0, 0x38b9, 0x711c, 0x7024, 0x20a0, 0x2019, - 0x0000, 0x2061, 0xa7d2, 0x6424, 0x6528, 0x662c, 0x6730, 0x0078, - 0x385e, 0x7120, 0x810c, 0x0078, 0x2bad, 0x81ff, 0x00c0, 0x2bd7, - 0x60cc, 0xd09c, 0x0040, 0x2bd7, 0x1078, 0x35ba, 0x0040, 0x2bd7, - 0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x3604, 0x701b, - 0x38d2, 0x007c, 0x0d7e, 0xade8, 0x000d, 0x6828, 0xa0be, 0x7000, - 0x0040, 0x38e5, 0xa0be, 0x7100, 0x0040, 0x38e5, 0xa0be, 0x7200, - 0x0040, 0x38e5, 0x0d7f, 0x0078, 0x2bdb, 0x6820, 0x6924, 0x1078, - 0x254d, 0x00c0, 0x3910, 0x1078, 0x455c, 0x00c0, 0x3910, 0x7122, - 0x6612, 0x6516, 0x6e18, 0x0c7e, 0x1078, 0x35ba, 0x0040, 0x3910, - 0x1078, 0x35ba, 0x0040, 0x3910, 0x0c7f, 0x0d7f, 0x6837, 0x0000, - 0x6838, 0xc0fd, 0x683a, 0x6823, 0x0000, 0x6804, 0x2068, 0x1078, - 0x8e92, 0x0040, 0x2bd7, 0x7007, 0x0003, 0x701b, 0x3913, 0x007c, - 0x0d7f, 0x0078, 0x2bd7, 0x7120, 0x1078, 0x298e, 0x6820, 0xa086, - 0x8001, 0x0040, 0x2bd7, 0x2d00, 0x701e, 0x6804, 0xa080, 0x0002, - 0x007e, 0x20a9, 0x002a, 0x2098, 0x20a0, 0x1078, 0x4281, 0x007f, - 0xade8, 0x000d, 0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x2061, 0xa7d2, - 0x6007, 0x0000, 0x6e00, 0x6f28, 0xa7c6, 0x7000, 0x00c0, 0x393a, - 0x0078, 0x393e, 0xa7c6, 0x7100, 0x00c0, 0x3946, 0xa6c2, 0x0004, - 0x0048, 0x2bdb, 0x2009, 0x0004, 0x0078, 0x3608, 0xa7c6, 0x7200, - 0x00c0, 0x2bdb, 0xa6c2, 0x0054, 0x0048, 0x2bdb, 0x600e, 0x6013, - 0x002a, 0x6226, 0x632a, 0x642e, 0x6532, 0x2c10, 0x1078, 0x13db, - 0x7007, 0x0002, 0x701b, 0x395d, 0x007c, 0x701c, 0x2068, 0x6804, - 0xa080, 0x0001, 0x2004, 0xa080, 0x0002, 0x007e, 0x20a9, 0x002a, - 0x2098, 0x20a0, 0x1078, 0x4281, 0x007f, 0x2009, 0x002a, 0x2061, - 0xa7d2, 0x6224, 0x6328, 0x642c, 0x6530, 0x0078, 0x3608, 0x81ff, - 0x00c0, 0x2bd7, 0x792c, 0x2001, 0xa99d, 0x2102, 0x1078, 0x35d2, - 0x0040, 0x2bdb, 0x1078, 0x4673, 0x0040, 0x2bd7, 0x127e, 0x2091, - 0x8000, 0x1078, 0x47de, 0x127f, 0x0078, 0x2bad, 0x7824, 0xd08c, - 0x00c0, 0x3995, 0xd084, 0x0040, 0x31da, 0x1078, 0x35e4, 0x0040, - 0x2bdb, 0x0c7e, 0x1078, 0x35ba, 0x0c7f, 0x00c0, 0x39a3, 0x2009, - 0x0002, 0x0078, 0x2bd7, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, - 0x0040, 0x39b0, 0xa08e, 0x0004, 0x0040, 0x39b0, 0xa08e, 0x0005, - 0x00c0, 0x39dd, 0x7824, 0xd08c, 0x0040, 0x39bb, 0x6000, 0xc08c, - 0x6002, 0x0078, 0x39c5, 0x2001, 0xa753, 0x2004, 0xd0b4, 0x0040, - 0x320f, 0x6000, 0xd08c, 0x00c0, 0x320f, 0x6837, 0x0000, 0x6838, - 0xc0fd, 0x683a, 0x1078, 0x8eae, 0x00c0, 0x39d2, 0x2009, 0x0003, - 0x0078, 0x2bd7, 0x7007, 0x0003, 0x701b, 0x39d7, 0x007c, 0x1078, - 0x35e4, 0x0040, 0x2bdb, 0x0078, 0x320f, 0x2009, 0xa72f, 0x210c, - 0x81ff, 0x0040, 0x39e7, 0x2009, 0x0001, 0x0078, 0x2bd7, 0x2001, - 0xa700, 0x2004, 0xa086, 0x0003, 0x0040, 0x39f2, 0x2009, 0x0007, - 0x0078, 0x2bd7, 0x2001, 0xa753, 0x2004, 0xd0ac, 0x0040, 0x39fc, - 0x2009, 0x0008, 0x0078, 0x2bd7, 0x609c, 0xd0a4, 0x00c0, 0x3a03, - 0xd0ac, 0x00c0, 0x320f, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, - 0xc0fd, 0x683a, 0x1078, 0x8f22, 0x00c0, 0x3a12, 0x2009, 0x0003, - 0x0078, 0x2bd7, 0x7007, 0x0003, 0x701b, 0x3a17, 0x007c, 0x6830, - 0xa086, 0x0100, 0x00c0, 0x3a20, 0x2009, 0x0004, 0x0078, 0x2bd7, - 0x1078, 0x35e4, 0x0040, 0x2bdb, 0x0078, 0x39b2, 0x81ff, 0x2009, - 0x0001, 0x00c0, 0x2bd7, 0x6000, 0xa086, 0x0003, 0x2009, 0x0007, - 0x00c0, 0x2bd7, 0x2001, 0xa753, 0x2004, 0xd0ac, 0x2009, 0x0008, - 0x00c0, 0x2bd7, 0x1078, 0x35e4, 0x0040, 0x2bdb, 0x6004, 0xa084, - 0x00ff, 0xa086, 0x0006, 0x2009, 0x0009, 0x00c0, 0x2bd7, 0x0c7e, - 0x1078, 0x35ba, 0x0c7f, 0x2009, 0x0002, 0x0040, 0x2bd7, 0x6837, - 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x7928, 0xa194, - 0xff00, 0xa18c, 0x00ff, 0xa006, 0x82ff, 0x00c0, 0x3a65, 0xc0ed, - 0x6952, 0x792c, 0x6956, 0x0078, 0x3a6e, 0xa28e, 0x0100, 0x00c0, - 0x2bdb, 0xc0e5, 0x6853, 0x0000, 0x6857, 0x0000, 0x683e, 0x1078, - 0x90cd, 0x2009, 0x0003, 0x0040, 0x2bd7, 0x7007, 0x0003, 0x701b, - 0x3a7a, 0x007c, 0x6830, 0xa086, 0x0100, 0x2009, 0x0004, 0x0040, - 0x2bd7, 0x0078, 0x2bad, 0x81ff, 0x2009, 0x0001, 0x00c0, 0x2bd7, - 0x6000, 0xa086, 0x0003, 0x2009, 0x0007, 0x00c0, 0x2bd7, 0x1078, - 0x35e4, 0x0040, 0x2bdb, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, - 0x2009, 0x0009, 0x00c0, 0x2bd7, 0x0c7e, 0x1078, 0x35ba, 0x0c7f, - 0x2009, 0x0002, 0x0040, 0x2bd7, 0xad80, 0x000f, 0x2009, 0x0008, - 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x3604, 0x701b, 0x3ab1, - 0x007c, 0x0d7e, 0xade8, 0x000f, 0x6800, 0xa086, 0x0500, 0x00c0, - 0x3ac4, 0x6804, 0xa005, 0x00c0, 0x3ac4, 0x6808, 0xa084, 0xff00, - 0x00c0, 0x3ac4, 0x0078, 0x3ac7, 0x0d7f, 0x00c0, 0x2bdb, 0x0d7f, - 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x0c7e, - 0x1078, 0x35e4, 0x00c0, 0x3ad7, 0x0c7f, 0x0078, 0x2bdb, 0x1078, - 0x9129, 0x2009, 0x0003, 0x0c7f, 0x0040, 0x2bd7, 0x7007, 0x0003, - 0x701b, 0x3ae3, 0x007c, 0x6830, 0xa086, 0x0100, 0x2009, 0x0004, - 0x0040, 0x2bd7, 0x0078, 0x2bad, 0x127e, 0x0c7e, 0x0e7e, 0x2061, - 0x0100, 0x2071, 0xa700, 0x6044, 0xd0a4, 0x00c0, 0x3b15, 0xd084, - 0x0040, 0x3afe, 0x1078, 0x3c75, 0x0078, 0x3b11, 0xd08c, 0x0040, - 0x3b05, 0x1078, 0x3b8c, 0x0078, 0x3b11, 0xd094, 0x0040, 0x3b0c, - 0x1078, 0x3b60, 0x0078, 0x3b11, 0xd09c, 0x0040, 0x3b11, 0x1078, - 0x3b1f, 0x0e7f, 0x0c7f, 0x127f, 0x007c, 0x017e, 0x6128, 0xd19c, - 0x00c0, 0x3b1c, 0xc19d, 0x612a, 0x017f, 0x0078, 0x3b11, 0x624c, - 0xa286, 0xf0f0, 0x00c0, 0x3b30, 0x6048, 0xa086, 0xf0f0, 0x0040, - 0x3b30, 0x624a, 0x6043, 0x0090, 0x6043, 0x0010, 0x0078, 0x3b5f, - 0xa294, 0xff00, 0xa296, 0xf700, 0x0040, 0x3b45, 0x7134, 0xd1a4, - 0x00c0, 0x3b45, 0x6240, 0xa294, 0x0010, 0x0040, 0x3b45, 0x2009, - 0x00f7, 0x1078, 0x42a1, 0x0078, 0x3b5f, 0x6043, 0x0040, 0x6043, - 0x0000, 0x7077, 0x0000, 0x708f, 0x0001, 0x70b3, 0x0000, 0x70cf, - 0x0000, 0x2009, 0xadc0, 0x200b, 0x0000, 0x7087, 0x0000, 0x707b, - 0x000f, 0x2009, 0x000f, 0x2011, 0x41d5, 0x1078, 0x5add, 0x007c, - 0x157e, 0x7078, 0xa005, 0x00c0, 0x3b8a, 0x2011, 0x41d5, 0x1078, - 0x5a45, 0x6040, 0xa094, 0x0010, 0xa285, 0x0020, 0x6042, 0x20a9, - 0x00c8, 0x6044, 0xd08c, 0x00c0, 0x3b83, 0x00f0, 0x3b71, 0x6242, - 0x708b, 0x0000, 0x6040, 0xa094, 0x0010, 0xa285, 0x0080, 0x6042, - 0x6242, 0x0078, 0x3b8a, 0x6242, 0x708b, 0x0000, 0x707f, 0x0000, - 0x0078, 0x3b8a, 0x157f, 0x007c, 0x707c, 0xa08a, 0x0003, 0x00c8, - 0x3b95, 0x1079, 0x3b98, 0x0078, 0x3b97, 0x1078, 0x1332, 0x007c, - 0x3b9b, 0x3bea, 0x3c74, 0x0f7e, 0x707f, 0x0001, 0x20e1, 0xa000, - 0x20e1, 0x8700, 0x1078, 0x21f7, 0x20e1, 0x9080, 0x20e1, 0x4000, - 0x2079, 0xac00, 0x207b, 0x2200, 0x7807, 0x00ef, 0x780b, 0x0000, - 0x780f, 0x00ef, 0x7813, 0x0138, 0x7817, 0x0000, 0x781b, 0x0000, - 0x781f, 0x0000, 0x7823, 0xffff, 0x7827, 0xffff, 0x782b, 0x0000, - 0x782f, 0x0000, 0x2079, 0xac0c, 0x207b, 0x1101, 0x7807, 0x0000, - 0x2099, 0xa705, 0x20a1, 0xac0e, 0x20a9, 0x0004, 0x53a3, 0x2079, - 0xac12, 0x207b, 0x0000, 0x7807, 0x0000, 0x2099, 0xac00, 0x20a1, - 0x020b, 0x20a9, 0x0014, 0x53a6, 0x60c3, 0x000c, 0x600f, 0x0000, - 0x1078, 0x420b, 0x0f7f, 0x7083, 0x0000, 0x6043, 0x0008, 0x6043, - 0x0000, 0x007c, 0x0d7e, 0x7080, 0x7083, 0x0000, 0xa025, 0x0040, - 0x3c5e, 0x6020, 0xd0b4, 0x00c0, 0x3c5c, 0x718c, 0x81ff, 0x0040, - 0x3c4b, 0xa486, 0x000c, 0x00c0, 0x3c56, 0xa480, 0x0018, 0x8004, - 0x20a8, 0x2011, 0xac80, 0x2019, 0xac00, 0x220c, 0x2304, 0xa106, - 0x00c0, 0x3c22, 0x8210, 0x8318, 0x00f0, 0x3c05, 0x6043, 0x0004, - 0x608b, 0xbc94, 0x608f, 0xf0f0, 0x6043, 0x0006, 0x707f, 0x0002, - 0x708b, 0x0002, 0x2009, 0x07d0, 0x2011, 0x41dc, 0x1078, 0x5add, - 0x0078, 0x3c5c, 0x2069, 0xac80, 0x6930, 0xa18e, 0x1101, 0x00c0, - 0x3c56, 0x6834, 0xa005, 0x00c0, 0x3c56, 0x6900, 0xa18c, 0x00ff, - 0x00c0, 0x3c36, 0x6804, 0xa005, 0x0040, 0x3c4b, 0x2011, 0xac8e, - 0x2019, 0xa705, 0x20a9, 0x0004, 0x220c, 0x2304, 0xa102, 0x0048, - 0x3c49, 0x00c0, 0x3c56, 0x8210, 0x8318, 0x00f0, 0x3c3c, 0x0078, - 0x3c56, 0x708f, 0x0000, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, - 0xac80, 0x20a1, 0x020b, 0x20a9, 0x0014, 0x53a6, 0x6043, 0x0008, - 0x6043, 0x0000, 0x0078, 0x3c5e, 0x0d7f, 0x007c, 0x6020, 0xd0b4, - 0x00c0, 0x3c5c, 0x60c3, 0x000c, 0x2011, 0xa9bb, 0x2013, 0x0000, - 0x7083, 0x0000, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575, - 0x1078, 0x6e06, 0x0078, 0x3c5c, 0x007c, 0x7088, 0xa08a, 0x001d, - 0x00c8, 0x3c7e, 0x1079, 0x3c81, 0x0078, 0x3c80, 0x1078, 0x1332, - 0x007c, 0x3cab, 0x3cba, 0x3ce9, 0x3d02, 0x3d2e, 0x3d5a, 0x3d86, - 0x3dbc, 0x3de8, 0x3e10, 0x3e53, 0x3e7d, 0x3e9f, 0x3eb5, 0x3edb, - 0x3eee, 0x3ef7, 0x3f2b, 0x3f57, 0x3f83, 0x3faf, 0x3fe5, 0x4030, - 0x405f, 0x4081, 0x40c3, 0x40e9, 0x4102, 0x4103, 0x0c7e, 0x2061, - 0xa700, 0x6003, 0x0007, 0x2061, 0x0100, 0x6004, 0xa084, 0xfff9, - 0x6006, 0x0c7f, 0x007c, 0x608b, 0xbc94, 0x608f, 0xf0f0, 0x6043, - 0x0002, 0x708b, 0x0001, 0x2009, 0x07d0, 0x2011, 0x41dc, 0x1078, - 0x5add, 0x007c, 0x0f7e, 0x7080, 0xa086, 0x0014, 0x00c0, 0x3ce7, - 0x6043, 0x0000, 0x6020, 0xd0b4, 0x00c0, 0x3ce7, 0x2079, 0xac80, - 0x7a30, 0xa296, 0x1102, 0x00c0, 0x3ce5, 0x7834, 0xa005, 0x00c0, - 0x3ce5, 0x7a38, 0xd2fc, 0x0040, 0x3cdb, 0x70b0, 0xa005, 0x00c0, - 0x3cdb, 0x70b3, 0x0001, 0x2011, 0x41dc, 0x1078, 0x5a45, 0x708b, - 0x0010, 0x1078, 0x3ef7, 0x0078, 0x3ce7, 0x1078, 0x4224, 0x0f7f, - 0x007c, 0x708b, 0x0003, 0x6043, 0x0004, 0x2011, 0x41dc, 0x1078, - 0x5a45, 0x1078, 0x4289, 0x20a3, 0x1102, 0x20a3, 0x0000, 0x20a9, - 0x000a, 0x20a3, 0x0000, 0x00f0, 0x3cf9, 0x60c3, 0x0014, 0x1078, - 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, 0x3d2c, 0x2011, - 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, 0x00c0, 0x3d2a, 0x2079, - 0xac80, 0x7a30, 0xa296, 0x1102, 0x00c0, 0x3d2a, 0x7834, 0xa005, - 0x00c0, 0x3d2a, 0x7a38, 0xd2fc, 0x0040, 0x3d24, 0x70b0, 0xa005, - 0x00c0, 0x3d24, 0x70b3, 0x0001, 0x708b, 0x0004, 0x1078, 0x3d2e, - 0x0078, 0x3d2c, 0x1078, 0x4224, 0x0f7f, 0x007c, 0x708b, 0x0005, - 0x1078, 0x4289, 0x20a3, 0x1103, 0x20a3, 0x0000, 0x3430, 0x2011, - 0xac8e, 0x1078, 0x42d4, 0x00c0, 0x3d4c, 0x7074, 0xa005, 0x00c0, - 0x3d4c, 0x7150, 0xa186, 0xffff, 0x0040, 0x3d4c, 0x1078, 0x419d, - 0x0040, 0x3d4c, 0x1078, 0x42b8, 0x20a9, 0x0008, 0x2298, 0x26a0, - 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, - 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, 0x3d84, 0x2011, - 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, 0x00c0, 0x3d82, 0x2079, - 0xac80, 0x7a30, 0xa296, 0x1103, 0x00c0, 0x3d82, 0x7834, 0xa005, - 0x00c0, 0x3d82, 0x7a38, 0xd2fc, 0x0040, 0x3d7c, 0x70b0, 0xa005, - 0x00c0, 0x3d7c, 0x70b3, 0x0001, 0x708b, 0x0006, 0x1078, 0x3d86, - 0x0078, 0x3d84, 0x1078, 0x4224, 0x0f7f, 0x007c, 0x708b, 0x0007, - 0x1078, 0x4289, 0x20a3, 0x1104, 0x20a3, 0x0000, 0x3430, 0x2011, - 0xac8e, 0x1078, 0x42d4, 0x00c0, 0x3dae, 0x7074, 0xa005, 0x00c0, - 0x3dae, 0x7154, 0xa186, 0xffff, 0x0040, 0x3dae, 0xa180, 0x29c0, - 0x200c, 0xa18c, 0xff00, 0x810f, 0x1078, 0x419d, 0x0040, 0x3dae, - 0x1078, 0x3820, 0x0040, 0x3dae, 0x1078, 0x256a, 0x20a9, 0x0008, - 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, - 0x0014, 0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, - 0x3de6, 0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, 0x00c0, - 0x3de4, 0x2079, 0xac80, 0x7a30, 0xa296, 0x1104, 0x00c0, 0x3de4, - 0x7834, 0xa005, 0x00c0, 0x3de4, 0x7a38, 0xd2fc, 0x0040, 0x3dde, - 0x70b0, 0xa005, 0x00c0, 0x3dde, 0x70b3, 0x0001, 0x708b, 0x0008, - 0x1078, 0x3de8, 0x0078, 0x3de6, 0x1078, 0x4224, 0x0f7f, 0x007c, - 0x708b, 0x0009, 0x1078, 0x4289, 0x20a3, 0x1105, 0x20a3, 0x0100, - 0x3430, 0x1078, 0x42d4, 0x00c0, 0x3e01, 0x7074, 0xa005, 0x00c0, - 0x3e01, 0x1078, 0x4104, 0x00c0, 0x3e0b, 0xa085, 0x0001, 0x1078, - 0x256a, 0x20a9, 0x0008, 0x2099, 0xac8e, 0x26a0, 0x53a6, 0x20a3, - 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x420b, 0x007c, - 0x0f7e, 0x7080, 0xa005, 0x0040, 0x3e51, 0x2011, 0x41dc, 0x1078, - 0x5a45, 0xa086, 0x0014, 0x00c0, 0x3e4f, 0x2079, 0xac80, 0x7a30, - 0xa296, 0x1105, 0x00c0, 0x3e4f, 0x7834, 0x2011, 0x0100, 0xa21e, - 0x00c0, 0x3e3a, 0x7a38, 0xd2fc, 0x0040, 0x3e34, 0x70b0, 0xa005, - 0x00c0, 0x3e34, 0x70b3, 0x0001, 0x708b, 0x000a, 0x1078, 0x3e53, - 0x0078, 0x3e51, 0xa005, 0x00c0, 0x3e4f, 0x7a38, 0xd2fc, 0x0040, - 0x3e47, 0x70b0, 0xa005, 0x00c0, 0x3e47, 0x70b3, 0x0001, 0x7087, - 0x0000, 0x708b, 0x000e, 0x1078, 0x3edb, 0x0078, 0x3e51, 0x1078, - 0x4224, 0x0f7f, 0x007c, 0x708b, 0x000b, 0x2011, 0xac0e, 0x22a0, - 0x20a9, 0x0040, 0x2019, 0xffff, 0x43a4, 0x20a9, 0x0002, 0x2009, - 0x0000, 0x41a4, 0x1078, 0x4289, 0x20a3, 0x1106, 0x20a3, 0x0000, - 0x1078, 0x42d4, 0x0040, 0x3e70, 0x2013, 0x0000, 0x0078, 0x3e74, - 0x6030, 0xa085, 0x0100, 0x2012, 0x2298, 0x20a9, 0x0042, 0x53a6, - 0x60c3, 0x0084, 0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, - 0x0040, 0x3e9d, 0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0084, - 0x00c0, 0x3e9b, 0x2079, 0xac80, 0x7a30, 0xa296, 0x1106, 0x00c0, - 0x3e9b, 0x7834, 0xa005, 0x00c0, 0x3e9b, 0x708b, 0x000c, 0x1078, - 0x3e9f, 0x0078, 0x3e9d, 0x1078, 0x4224, 0x0f7f, 0x007c, 0x708b, - 0x000d, 0x1078, 0x4289, 0x20a3, 0x1107, 0x20a3, 0x0000, 0x2099, - 0xac8e, 0x20a9, 0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, - 0x60c3, 0x0084, 0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, - 0x0040, 0x3ed9, 0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0084, - 0x00c0, 0x3ed7, 0x2079, 0xac80, 0x7a30, 0xa296, 0x1107, 0x00c0, - 0x3ed7, 0x7834, 0xa005, 0x00c0, 0x3ed7, 0x7087, 0x0001, 0x1078, - 0x427b, 0x708b, 0x000e, 0x1078, 0x3edb, 0x0078, 0x3ed9, 0x1078, - 0x4224, 0x0f7f, 0x007c, 0x708b, 0x000f, 0x7083, 0x0000, 0x608b, - 0xbc85, 0x608f, 0xb5b5, 0x6043, 0x0005, 0x6043, 0x0004, 0x2009, - 0x07d0, 0x2011, 0x41dc, 0x1078, 0x5a38, 0x007c, 0x7080, 0xa005, - 0x0040, 0x3ef6, 0x2011, 0x41dc, 0x1078, 0x5a45, 0x007c, 0x708b, - 0x0011, 0x1078, 0x42d4, 0x00c0, 0x3f14, 0x716c, 0x81ff, 0x0040, - 0x3f14, 0x2009, 0x0000, 0x7070, 0xa084, 0x00ff, 0x1078, 0x254d, - 0xa186, 0x007e, 0x0040, 0x3f14, 0xa186, 0x0080, 0x0040, 0x3f14, - 0x2011, 0xac8e, 0x1078, 0x419d, 0x20e1, 0x9080, 0x20e1, 0x4000, - 0x2099, 0xac80, 0x20a1, 0x020b, 0x7480, 0xa480, 0x0018, 0xa080, - 0x0007, 0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0014, - 0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, 0x3f55, - 0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, 0x00c0, 0x3f53, - 0x2079, 0xac80, 0x7a30, 0xa296, 0x1103, 0x00c0, 0x3f53, 0x7834, - 0xa005, 0x00c0, 0x3f53, 0x7a38, 0xd2fc, 0x0040, 0x3f4d, 0x70b0, - 0xa005, 0x00c0, 0x3f4d, 0x70b3, 0x0001, 0x708b, 0x0012, 0x1078, - 0x3f57, 0x0078, 0x3f55, 0x1078, 0x4224, 0x0f7f, 0x007c, 0x708b, - 0x0013, 0x1078, 0x4295, 0x20a3, 0x1103, 0x20a3, 0x0000, 0x3430, - 0x2011, 0xac8e, 0x1078, 0x42d4, 0x00c0, 0x3f75, 0x7074, 0xa005, - 0x00c0, 0x3f75, 0x7150, 0xa186, 0xffff, 0x0040, 0x3f75, 0x1078, - 0x419d, 0x0040, 0x3f75, 0x1078, 0x42b8, 0x20a9, 0x0008, 0x2298, - 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, - 0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, 0x3fad, - 0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, 0x00c0, 0x3fab, - 0x2079, 0xac80, 0x7a30, 0xa296, 0x1104, 0x00c0, 0x3fab, 0x7834, - 0xa005, 0x00c0, 0x3fab, 0x7a38, 0xd2fc, 0x0040, 0x3fa5, 0x70b0, - 0xa005, 0x00c0, 0x3fa5, 0x70b3, 0x0001, 0x708b, 0x0014, 0x1078, - 0x3faf, 0x0078, 0x3fad, 0x1078, 0x4224, 0x0f7f, 0x007c, 0x708b, - 0x0015, 0x1078, 0x4295, 0x20a3, 0x1104, 0x20a3, 0x0000, 0x3430, - 0x2011, 0xac8e, 0x1078, 0x42d4, 0x00c0, 0x3fd7, 0x7074, 0xa005, - 0x00c0, 0x3fd7, 0x7154, 0xa186, 0xffff, 0x0040, 0x3fd7, 0xa180, - 0x29c0, 0x200c, 0xa18c, 0xff00, 0x810f, 0x1078, 0x419d, 0x0040, - 0x3fd7, 0x1078, 0x3820, 0x0040, 0x3fd7, 0x1078, 0x256a, 0x20a9, - 0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, - 0x60c3, 0x0014, 0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, - 0x0040, 0x402e, 0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, - 0x00c0, 0x402c, 0x2079, 0xac80, 0x7a30, 0xa296, 0x1105, 0x00c0, - 0x402c, 0x7834, 0x2011, 0x0100, 0xa21e, 0x00c0, 0x400b, 0x7a38, - 0xd2fc, 0x0040, 0x4009, 0x70b0, 0xa005, 0x00c0, 0x4009, 0x70b3, - 0x0001, 0x0078, 0x401a, 0xa005, 0x00c0, 0x402c, 0x7a38, 0xd2fc, - 0x0040, 0x4018, 0x70b0, 0xa005, 0x00c0, 0x4018, 0x70b3, 0x0001, - 0x7087, 0x0000, 0x7a38, 0xd2f4, 0x0040, 0x4026, 0x2001, 0xa774, - 0x2004, 0xd0a4, 0x00c0, 0x4026, 0x70cf, 0x0008, 0x708b, 0x0016, - 0x1078, 0x4030, 0x0078, 0x402e, 0x1078, 0x4224, 0x0f7f, 0x007c, - 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xac80, 0x20a1, 0x020b, - 0x20a9, 0x000e, 0x53a6, 0x3430, 0x2011, 0xac8e, 0x708b, 0x0017, - 0x1078, 0x42d4, 0x00c0, 0x4050, 0x7074, 0xa005, 0x00c0, 0x4050, - 0x1078, 0x4104, 0x00c0, 0x405a, 0xa085, 0x0001, 0x1078, 0x256a, - 0x20a9, 0x0008, 0x2099, 0xac8e, 0x26a0, 0x53a6, 0x20a3, 0x0000, - 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x420b, 0x007c, 0x0f7e, - 0x7080, 0xa005, 0x0040, 0x407f, 0x2011, 0x41dc, 0x1078, 0x5a45, - 0xa086, 0x0084, 0x00c0, 0x407d, 0x2079, 0xac80, 0x7a30, 0xa296, - 0x1106, 0x00c0, 0x407d, 0x7834, 0xa005, 0x00c0, 0x407d, 0x708b, - 0x0018, 0x1078, 0x4081, 0x0078, 0x407f, 0x1078, 0x4224, 0x0f7f, - 0x007c, 0x708b, 0x0019, 0x1078, 0x4295, 0x20a3, 0x1106, 0x20a3, - 0x0000, 0x3430, 0x2099, 0xac8e, 0x2039, 0xac0e, 0x27a0, 0x20a9, - 0x0040, 0x53a3, 0x1078, 0x42d4, 0x00c0, 0x40b5, 0x2728, 0x2514, - 0x8207, 0xa084, 0x00ff, 0x8000, 0x2018, 0xa294, 0x00ff, 0x8007, - 0xa205, 0x202a, 0x6030, 0x2310, 0x8214, 0xa2a0, 0xac0e, 0x2414, - 0xa38c, 0x0001, 0x0040, 0x40b0, 0xa294, 0xff00, 0x0078, 0x40b3, - 0xa294, 0x00ff, 0x8007, 0xa215, 0x2222, 0x2798, 0x26a0, 0x20a9, - 0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0084, - 0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, 0x40e7, - 0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0084, 0x00c0, 0x40e5, - 0x2079, 0xac80, 0x7a30, 0xa296, 0x1107, 0x00c0, 0x40e5, 0x7834, - 0xa005, 0x00c0, 0x40e5, 0x7087, 0x0001, 0x1078, 0x427b, 0x708b, - 0x001a, 0x1078, 0x40e9, 0x0078, 0x40e7, 0x1078, 0x4224, 0x0f7f, - 0x007c, 0x708b, 0x001b, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, - 0xac80, 0x20a1, 0x020b, 0x7480, 0xa480, 0x0018, 0xa080, 0x0007, - 0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0084, 0x1078, - 0x420b, 0x007c, 0x007c, 0x007c, 0x087e, 0x097e, 0x2029, 0xa753, - 0x252c, 0x20a9, 0x0008, 0x2041, 0xac0e, 0x28a0, 0x2099, 0xac8e, - 0x53a3, 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0040, 0x411a, - 0x2011, 0x0000, 0x2800, 0xa200, 0x200c, 0xa1a6, 0xffff, 0x00c0, - 0x412c, 0xd5d4, 0x0040, 0x4127, 0x8210, 0x0078, 0x4128, 0x8211, - 0x00f0, 0x411a, 0x0078, 0x4194, 0x82ff, 0x00c0, 0x413e, 0xd5d4, - 0x0040, 0x4138, 0xa1a6, 0x3fff, 0x0040, 0x4124, 0x0078, 0x413c, - 0xa1a6, 0x3fff, 0x0040, 0x4194, 0xa18d, 0xc000, 0x20a9, 0x0010, - 0x2019, 0x0001, 0xd5d4, 0x0040, 0x4147, 0x2019, 0x0010, 0x2120, - 0xd5d4, 0x0040, 0x414e, 0x8423, 0x0078, 0x414f, 0x8424, 0x00c8, - 0x415c, 0xd5d4, 0x0040, 0x4157, 0x8319, 0x0078, 0x4158, 0x8318, - 0x00f0, 0x4148, 0x0078, 0x4194, 0x23a8, 0x2021, 0x0001, 0x8426, - 0x8425, 0x00f0, 0x4160, 0x2328, 0x8529, 0xa2be, 0x0007, 0x0040, - 0x4174, 0x007e, 0x2039, 0x0007, 0x2200, 0xa73a, 0x007f, 0x27a8, - 0xa5a8, 0x0010, 0x00f0, 0x4170, 0x7552, 0xa5c8, 0x29c0, 0x292c, - 0xa5ac, 0x00ff, 0x6532, 0x60e7, 0x0000, 0x65ea, 0x706f, 0x0000, - 0x7572, 0x2018, 0x2304, 0xa405, 0x201a, 0x7077, 0x0001, 0x26a0, - 0x2898, 0x20a9, 0x0008, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, - 0xa085, 0x0001, 0x0078, 0x419a, 0xa006, 0x0078, 0x419a, 0xa006, - 0x1078, 0x1332, 0x097f, 0x087f, 0x007c, 0x2118, 0x2021, 0x0000, - 0x2001, 0x0007, 0xa39a, 0x0010, 0x0048, 0x41aa, 0x8420, 0x8001, - 0x0078, 0x41a2, 0x2118, 0x84ff, 0x0040, 0x41b3, 0xa39a, 0x0010, - 0x8421, 0x00c0, 0x41ae, 0x2021, 0x0001, 0x83ff, 0x0040, 0x41bc, - 0x8423, 0x8319, 0x00c0, 0x41b8, 0xa238, 0x2704, 0xa42c, 0x00c0, - 0x41d4, 0xa405, 0x203a, 0x7152, 0xa1a0, 0x29c0, 0x242c, 0xa5ac, - 0x00ff, 0x6532, 0x60e7, 0x0000, 0x65ea, 0x706f, 0x0000, 0x7572, - 0x7077, 0x0001, 0xa084, 0x0000, 0x007c, 0x0e7e, 0x2071, 0xa700, - 0x707b, 0x0000, 0x0e7f, 0x007c, 0x0e7e, 0x0f7e, 0x2001, 0x0002, - 0x1078, 0x5ae6, 0x2079, 0x0100, 0x2071, 0x0140, 0x1078, 0x6e0f, - 0x7004, 0xa084, 0x4000, 0x0040, 0x41f1, 0x7003, 0x1000, 0x7003, - 0x0000, 0x127e, 0x2091, 0x8000, 0x2071, 0xa722, 0x2073, 0x0000, - 0x7840, 0x027e, 0x017e, 0x2009, 0x00f7, 0x1078, 0x42a1, 0x017f, - 0xa094, 0x0010, 0xa285, 0x0080, 0x7842, 0x7a42, 0x027f, 0x127f, - 0x0f7f, 0x0e7f, 0x007c, 0x127e, 0x2091, 0x8000, 0x2011, 0xa9bb, - 0x2013, 0x0000, 0x7083, 0x0000, 0x127f, 0x20e1, 0x9080, 0x60a3, - 0x0056, 0x60a7, 0x9575, 0x1078, 0x6e06, 0x2009, 0x07d0, 0x2011, - 0x41dc, 0x1078, 0x5add, 0x007c, 0x017e, 0x027e, 0x0c7e, 0x127e, - 0x2091, 0x8000, 0x2011, 0x0003, 0x1078, 0x70e0, 0x2011, 0x0002, - 0x1078, 0x70ea, 0x1078, 0x6fc4, 0x037e, 0x2019, 0x0000, 0x1078, - 0x7058, 0x037f, 0x2009, 0x00f7, 0x1078, 0x42a1, 0x2061, 0xa9c4, - 0x601b, 0x0000, 0x601f, 0x0000, 0x2061, 0xa700, 0x6003, 0x0001, - 0x2061, 0x0100, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x002d, - 0x2011, 0x4259, 0x1078, 0x5a38, 0x127f, 0x0c7f, 0x027f, 0x017f, - 0x007c, 0x0e7e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2001, 0x0001, - 0x1078, 0x5ae6, 0x2071, 0x0100, 0x1078, 0x6e0f, 0x2071, 0x0140, - 0x7004, 0xa084, 0x4000, 0x0040, 0x4271, 0x7003, 0x1000, 0x7003, - 0x0000, 0x2001, 0x0001, 0x1078, 0x24e8, 0x1078, 0x4224, 0x127f, - 0x007f, 0x0e7f, 0x007c, 0x20a9, 0x0040, 0x20a1, 0xadc0, 0x2099, - 0xac8e, 0x3304, 0x8007, 0x20a2, 0x9398, 0x94a0, 0x00f0, 0x4281, - 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xac00, 0x20a1, - 0x020b, 0x20a9, 0x000c, 0x53a6, 0x007c, 0x20e1, 0x9080, 0x20e1, - 0x4000, 0x2099, 0xac80, 0x20a1, 0x020b, 0x20a9, 0x000c, 0x53a6, - 0x007c, 0x0c7e, 0x007e, 0x2061, 0x0100, 0x810f, 0x2001, 0xa72f, - 0x2004, 0xa005, 0x00c0, 0x42b2, 0x6030, 0xa084, 0x00ff, 0xa105, - 0x0078, 0x42b4, 0xa185, 0x00f7, 0x604a, 0x007f, 0x0c7f, 0x007c, - 0x017e, 0x047e, 0x2001, 0xa753, 0x2004, 0xd0a4, 0x0040, 0x42cb, - 0xa006, 0x2020, 0x2009, 0x002a, 0x1078, 0xa22d, 0x2001, 0xa70c, - 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0000, 0x1078, - 0x284f, 0x047f, 0x017f, 0x007c, 0x007e, 0x2001, 0xa70c, 0x2004, - 0xd09c, 0x0040, 0x42db, 0x007f, 0x007c, 0x007e, 0x017e, 0x127e, - 0x2091, 0x8000, 0x2001, 0x0101, 0x200c, 0xa18d, 0x0006, 0x2102, - 0x127f, 0x017f, 0x007f, 0x007c, 0x157e, 0x20a9, 0x00ff, 0x2009, - 0xa835, 0xa006, 0x200a, 0x8108, 0x00f0, 0x42f2, 0x157f, 0x007c, - 0x0d7e, 0x037e, 0x157e, 0x137e, 0x147e, 0x2069, 0xa752, 0xa006, - 0x6002, 0x6007, 0x0707, 0x600a, 0x600e, 0x6012, 0xa198, 0x29c0, - 0x231c, 0xa39c, 0x00ff, 0x6316, 0x20a9, 0x0004, 0xac98, 0x0006, - 0x23a0, 0x40a4, 0x20a9, 0x0004, 0xac98, 0x000a, 0x23a0, 0x40a4, - 0x603e, 0x6042, 0x604e, 0x6052, 0x6056, 0x605a, 0x605e, 0x6062, - 0x6066, 0x606a, 0x606e, 0x6072, 0x6076, 0x607a, 0x607e, 0x6082, - 0x6086, 0x608a, 0x608e, 0x6092, 0x6096, 0x609a, 0x609e, 0x60ae, - 0x61a2, 0x0d7e, 0x60a4, 0xa06d, 0x0040, 0x4338, 0x1078, 0x13a4, - 0x60a7, 0x0000, 0x60a8, 0xa06d, 0x0040, 0x4340, 0x1078, 0x13a4, - 0x60ab, 0x0000, 0x0d7f, 0xa006, 0x604a, 0x6810, 0x603a, 0x680c, - 0x6046, 0x6814, 0xa084, 0x00ff, 0x6042, 0x147f, 0x137f, 0x157f, - 0x037f, 0x0d7f, 0x007c, 0x127e, 0x2091, 0x8000, 0x6944, 0x6e48, - 0xa684, 0x3fff, 0xa082, 0x4000, 0x00c8, 0x4424, 0xa18c, 0xff00, - 0x810f, 0xa182, 0x00ff, 0x00c8, 0x442a, 0x2001, 0xa70c, 0x2004, - 0xa084, 0x0003, 0x0040, 0x4385, 0x2001, 0xa70c, 0x2004, 0xd084, - 0x00c0, 0x4405, 0xa188, 0xa835, 0x2104, 0xa065, 0x0040, 0x4405, - 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x00c0, 0x4405, 0x6000, - 0xd0c4, 0x0040, 0x4405, 0x0078, 0x4392, 0xa188, 0xa835, 0x2104, - 0xa065, 0x0040, 0x43e9, 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, - 0x00c0, 0x43ef, 0x60a4, 0xa00d, 0x0040, 0x439a, 0x1078, 0x4817, - 0x0040, 0x43e3, 0x60a8, 0xa00d, 0x0040, 0x43b4, 0x1078, 0x486a, - 0x00c0, 0x43b4, 0x694c, 0xd1fc, 0x00c0, 0x43aa, 0x1078, 0x44df, - 0x0078, 0x43de, 0x1078, 0x4484, 0x694c, 0xd1ec, 0x00c0, 0x43de, - 0x1078, 0x46d6, 0x0078, 0x43de, 0x694c, 0xa184, 0xa000, 0x0040, - 0x43ce, 0xd1ec, 0x0040, 0x43c7, 0xd1fc, 0x0040, 0x43c3, 0x1078, - 0x46e7, 0x0078, 0x43ca, 0x1078, 0x46e7, 0x0078, 0x43ce, 0xd1fc, - 0x0040, 0x43ce, 0x1078, 0x4484, 0x0078, 0x43de, 0x6050, 0xa00d, - 0x0040, 0x43d9, 0x2d00, 0x200a, 0x6803, 0x0000, 0x6052, 0x0078, - 0x43de, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x1078, 0x5da9, - 0xa006, 0x127f, 0x007c, 0x2001, 0x0005, 0x2009, 0x0000, 0x0078, - 0x442e, 0x2001, 0x0028, 0x2009, 0x0000, 0x0078, 0x442e, 0xa082, - 0x0006, 0x00c8, 0x4405, 0x60a0, 0xd0bc, 0x00c0, 0x4401, 0x6100, - 0xd1fc, 0x0040, 0x4392, 0x2001, 0x0029, 0x2009, 0x1000, 0x0078, - 0x442e, 0x2001, 0x0028, 0x0078, 0x4420, 0x2009, 0xa70c, 0x210c, - 0xd18c, 0x0040, 0x440f, 0x2001, 0x0004, 0x0078, 0x4420, 0xd184, - 0x0040, 0x4416, 0x2001, 0x0004, 0x0078, 0x4420, 0x2001, 0x0029, - 0x6100, 0xd1fc, 0x0040, 0x4420, 0x2009, 0x1000, 0x0078, 0x442e, - 0x2009, 0x0000, 0x0078, 0x442e, 0x2001, 0x0029, 0x2009, 0x0000, - 0x0078, 0x442e, 0x2001, 0x0029, 0x2009, 0x0000, 0xa005, 0x127f, - 0x007c, 0x6944, 0x6e48, 0xa684, 0x3fff, 0xa082, 0x4000, 0x00c8, - 0x447e, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff, 0x00c8, 0x4464, - 0xa188, 0xa835, 0x2104, 0xa065, 0x0040, 0x4464, 0x6004, 0xa084, - 0x00ff, 0xa08e, 0x0006, 0x00c0, 0x446a, 0x684c, 0xd0ec, 0x0040, - 0x4457, 0x1078, 0x46e7, 0x1078, 0x4484, 0x0078, 0x445f, 0x1078, - 0x4484, 0x684c, 0xd0fc, 0x0040, 0x445f, 0x1078, 0x46d6, 0x1078, - 0x472f, 0xa006, 0x0078, 0x4482, 0x2001, 0x0028, 0x2009, 0x0000, - 0x0078, 0x4482, 0xa082, 0x0006, 0x00c8, 0x4478, 0x6100, 0xd1fc, - 0x0040, 0x444d, 0x2001, 0x0029, 0x2009, 0x1000, 0x0078, 0x4482, - 0x2001, 0x0029, 0x2009, 0x0000, 0x0078, 0x4482, 0x2001, 0x0029, - 0x2009, 0x0000, 0xa005, 0x007c, 0x127e, 0x2091, 0x8000, 0x6050, - 0xa00d, 0x0040, 0x4492, 0x2d00, 0x200a, 0x6803, 0x0000, 0x6052, - 0x127f, 0x007c, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x0078, - 0x4490, 0x127e, 0x2091, 0x8000, 0x604c, 0xa005, 0x0040, 0x44af, - 0x0e7e, 0x2071, 0xa9b1, 0x7004, 0xa086, 0x0002, 0x0040, 0x44b6, - 0x0e7f, 0x604c, 0x6802, 0x2d00, 0x604e, 0x127f, 0x007c, 0x2d00, - 0x6052, 0x604e, 0x6803, 0x0000, 0x0078, 0x44ad, 0x701c, 0xac06, - 0x00c0, 0x44a8, 0x604c, 0x2070, 0x7000, 0x6802, 0x2d00, 0x7002, - 0x0e7f, 0x127f, 0x007c, 0x127e, 0x2091, 0x8000, 0x604c, 0xa06d, - 0x0040, 0x44d1, 0x6800, 0xa005, 0x00c0, 0x44cf, 0x6052, 0x604e, - 0xad05, 0x127f, 0x007c, 0x604c, 0xa06d, 0x0040, 0x44de, 0x6800, - 0xa005, 0x00c0, 0x44dc, 0x6052, 0x604e, 0xad05, 0x007c, 0x6803, - 0x0000, 0x6084, 0xa00d, 0x0040, 0x44e9, 0x2d00, 0x200a, 0x6086, - 0x007c, 0x2d00, 0x6086, 0x6082, 0x0078, 0x44e8, 0x127e, 0x0c7e, - 0x027e, 0x2091, 0x8000, 0x6218, 0x2260, 0x6200, 0xa005, 0x0040, - 0x44fc, 0xc285, 0x0078, 0x44fd, 0xc284, 0x6202, 0x027f, 0x0c7f, - 0x127f, 0x007c, 0x127e, 0x0c7e, 0x2091, 0x8000, 0x6218, 0x2260, - 0x6204, 0x007e, 0xa086, 0x0006, 0x00c0, 0x4521, 0x609c, 0xd0ac, - 0x0040, 0x4521, 0x2001, 0xa753, 0x2004, 0xd0a4, 0x0040, 0x4521, - 0xa284, 0xff00, 0x8007, 0xa086, 0x0007, 0x00c0, 0x4521, 0x2011, - 0x0600, 0x007f, 0xa294, 0xff00, 0xa215, 0x6206, 0x007e, 0xa086, - 0x0006, 0x00c0, 0x4531, 0x6290, 0x82ff, 0x00c0, 0x4531, 0x1078, - 0x1332, 0x007f, 0x0c7f, 0x127f, 0x007c, 0x127e, 0x0c7e, 0x2091, - 0x8000, 0x6218, 0x2260, 0x6204, 0x007e, 0xa086, 0x0006, 0x00c0, - 0x4553, 0x609c, 0xd0a4, 0x0040, 0x4553, 0x2001, 0xa753, 0x2004, - 0xd0ac, 0x00c0, 0x4553, 0xa284, 0x00ff, 0xa086, 0x0007, 0x00c0, - 0x4553, 0x2011, 0x0006, 0x007f, 0xa294, 0x00ff, 0x8007, 0xa215, - 0x6206, 0x0c7f, 0x127f, 0x007c, 0x027e, 0xa182, 0x00ff, 0x0048, - 0x4565, 0xa085, 0x0001, 0x0078, 0x457d, 0xa190, 0xa835, 0x2204, - 0xa065, 0x00c0, 0x457c, 0x017e, 0x0d7e, 0x1078, 0x1370, 0x2d60, - 0x0d7f, 0x017f, 0x0040, 0x4561, 0x2c00, 0x2012, 0x60a7, 0x0000, - 0x60ab, 0x0000, 0x1078, 0x42f8, 0xa006, 0x027f, 0x007c, 0x127e, - 0x2091, 0x8000, 0x027e, 0xa182, 0x00ff, 0x0048, 0x458b, 0xa085, - 0x0001, 0x0078, 0x45c1, 0x0d7e, 0xa190, 0xa835, 0x2204, 0xa06d, - 0x0040, 0x45bf, 0x2013, 0x0000, 0x0d7e, 0x0c7e, 0x2d60, 0x60a4, - 0xa06d, 0x0040, 0x459d, 0x1078, 0x13a4, 0x60a8, 0xa06d, 0x0040, - 0x45a3, 0x1078, 0x13a4, 0x0c7f, 0x0d7f, 0x0d7e, 0x0c7e, 0x68ac, - 0x2060, 0x8cff, 0x0040, 0x45bb, 0x600c, 0x007e, 0x6010, 0x2068, - 0x1078, 0x8d16, 0x0040, 0x45b6, 0x1078, 0x13b4, 0x1078, 0x772d, - 0x0c7f, 0x0078, 0x45a9, 0x0c7f, 0x0d7f, 0x1078, 0x13a4, 0x0d7f, - 0xa006, 0x027f, 0x127f, 0x007c, 0x017e, 0xa182, 0x00ff, 0x0048, - 0x45cd, 0xa085, 0x0001, 0x0078, 0x45d4, 0xa188, 0xa835, 0x2104, - 0xa065, 0x0040, 0x45c9, 0xa006, 0x017f, 0x007c, 0x0d7e, 0x157e, - 0x137e, 0x147e, 0x600b, 0x0000, 0x600f, 0x0000, 0x6000, 0xc08c, - 0x6002, 0x2069, 0xac8e, 0x6808, 0x605e, 0x6810, 0x6062, 0x6138, - 0xa10a, 0x0048, 0x45ec, 0x603a, 0x6814, 0x6066, 0x2099, 0xac96, - 0xac88, 0x000a, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2099, 0xac9a, - 0xac88, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2069, 0xacae, - 0x6808, 0x606a, 0x690c, 0x616e, 0x6810, 0x6072, 0x6818, 0x6076, - 0x60a0, 0xa086, 0x007e, 0x00c0, 0x4611, 0x2069, 0xac8e, 0x690c, - 0x616e, 0xa182, 0x0211, 0x00c8, 0x4619, 0x2009, 0x0008, 0x0078, - 0x4643, 0xa182, 0x0259, 0x00c8, 0x4621, 0x2009, 0x0007, 0x0078, - 0x4643, 0xa182, 0x02c1, 0x00c8, 0x4629, 0x2009, 0x0006, 0x0078, - 0x4643, 0xa182, 0x0349, 0x00c8, 0x4631, 0x2009, 0x0005, 0x0078, - 0x4643, 0xa182, 0x0421, 0x00c8, 0x4639, 0x2009, 0x0004, 0x0078, - 0x4643, 0xa182, 0x0581, 0x00c8, 0x4641, 0x2009, 0x0003, 0x0078, - 0x4643, 0x2009, 0x0002, 0x6192, 0x147f, 0x137f, 0x157f, 0x0d7f, - 0x007c, 0x017e, 0x027e, 0x0e7e, 0x2071, 0xac8d, 0x2e04, 0x6896, - 0x2071, 0xac8e, 0x7004, 0x689a, 0x701c, 0x689e, 0x6a00, 0x2009, - 0xa772, 0x210c, 0xd0bc, 0x0040, 0x4663, 0xd1ec, 0x0040, 0x4663, - 0xc2ad, 0x0078, 0x4664, 0xc2ac, 0xd0c4, 0x0040, 0x466d, 0xd1e4, - 0x0040, 0x466d, 0xc2bd, 0x0078, 0x466e, 0xc2bc, 0x6a02, 0x0e7f, - 0x027f, 0x017f, 0x007c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x60a4, - 0xa06d, 0x0040, 0x4697, 0x6900, 0x81ff, 0x00c0, 0x46ab, 0x6a04, - 0xa282, 0x0010, 0x00c8, 0x46b0, 0xad88, 0x0004, 0x20a9, 0x0010, - 0x2104, 0xa086, 0xffff, 0x0040, 0x4692, 0x8108, 0x00f0, 0x4688, - 0x1078, 0x1332, 0x260a, 0x8210, 0x6a06, 0x0078, 0x46ab, 0x1078, - 0x138b, 0x0040, 0x46b0, 0x2d00, 0x60a6, 0x6803, 0x0000, 0xad88, - 0x0004, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, 0x00f0, 0x46a3, - 0x6807, 0x0001, 0x6e12, 0xa085, 0x0001, 0x127f, 0x0d7f, 0x007c, - 0xa006, 0x0078, 0x46ad, 0x127e, 0x2091, 0x8000, 0x0d7e, 0x60a4, - 0xa00d, 0x0040, 0x46d3, 0x2168, 0x6800, 0xa005, 0x00c0, 0x46cf, - 0x1078, 0x4817, 0x00c0, 0x46d3, 0x200b, 0xffff, 0x6804, 0xa08a, - 0x0002, 0x0048, 0x46cf, 0x8001, 0x6806, 0x0078, 0x46d3, 0x1078, - 0x13a4, 0x60a7, 0x0000, 0x0d7f, 0x127f, 0x007c, 0x127e, 0x2091, - 0x8000, 0x1078, 0x487f, 0x0078, 0x46df, 0x1078, 0x4484, 0x1078, - 0x4775, 0x00c0, 0x46dd, 0x1078, 0x472f, 0x127f, 0x007c, 0x0d7e, - 0x127e, 0x2091, 0x8000, 0x60a8, 0xa06d, 0x0040, 0x470b, 0x6950, - 0x81ff, 0x00c0, 0x471f, 0x6a54, 0xa282, 0x0010, 0x00c8, 0x472c, - 0xad88, 0x0018, 0x20a9, 0x0010, 0x2104, 0xa086, 0xffff, 0x0040, - 0x4706, 0x8108, 0x00f0, 0x46fc, 0x1078, 0x1332, 0x260a, 0x8210, - 0x6a56, 0x0078, 0x471f, 0x1078, 0x138b, 0x0040, 0x472c, 0x2d00, - 0x60aa, 0x6853, 0x0000, 0xad88, 0x0018, 0x20a9, 0x0010, 0x200b, - 0xffff, 0x8108, 0x00f0, 0x4717, 0x6857, 0x0001, 0x6e62, 0x0078, - 0x4723, 0x1078, 0x44df, 0x1078, 0x4739, 0x00c0, 0x4721, 0xa085, - 0x0001, 0x127f, 0x0d7f, 0x007c, 0xa006, 0x0078, 0x4729, 0x127e, - 0x2091, 0x8000, 0x1078, 0x5da9, 0x127f, 0x007c, 0xa01e, 0x0078, - 0x473b, 0x2019, 0x0001, 0xa00e, 0x127e, 0x2091, 0x8000, 0x604c, - 0x2068, 0x6000, 0xd0dc, 0x00c0, 0x4759, 0x8dff, 0x0040, 0x4770, - 0x83ff, 0x0040, 0x4751, 0x6848, 0xa606, 0x0040, 0x475e, 0x0078, - 0x4759, 0x683c, 0xa406, 0x00c0, 0x4759, 0x6840, 0xa506, 0x0040, - 0x475e, 0x2d08, 0x6800, 0x2068, 0x0078, 0x4745, 0x1078, 0x7233, - 0x6a00, 0x604c, 0xad06, 0x00c0, 0x4768, 0x624e, 0x0078, 0x476b, - 0xa180, 0x0000, 0x2202, 0x82ff, 0x00c0, 0x4770, 0x6152, 0x8dff, - 0x127f, 0x007c, 0xa01e, 0x0078, 0x4777, 0x2019, 0x0001, 0xa00e, - 0x6080, 0x2068, 0x8dff, 0x0040, 0x47a3, 0x83ff, 0x0040, 0x4786, - 0x6848, 0xa606, 0x0040, 0x4793, 0x0078, 0x478e, 0x683c, 0xa406, - 0x00c0, 0x478e, 0x6840, 0xa506, 0x0040, 0x4793, 0x2d08, 0x6800, - 0x2068, 0x0078, 0x477a, 0x6a00, 0x6080, 0xad06, 0x00c0, 0x479b, - 0x6282, 0x0078, 0x479e, 0xa180, 0x0000, 0x2202, 0x82ff, 0x00c0, - 0x47a3, 0x6186, 0x8dff, 0x007c, 0xa016, 0x1078, 0x4810, 0x00c0, - 0x47ab, 0x2011, 0x0001, 0x1078, 0x4863, 0x00c0, 0x47b1, 0xa295, - 0x0002, 0x007c, 0x1078, 0x489b, 0x0040, 0x47ba, 0x1078, 0x8dda, - 0x0078, 0x47bc, 0xa085, 0x0001, 0x007c, 0x1078, 0x489b, 0x0040, - 0x47c5, 0x1078, 0x8d72, 0x0078, 0x47c7, 0xa085, 0x0001, 0x007c, - 0x1078, 0x489b, 0x0040, 0x47d0, 0x1078, 0x8dbc, 0x0078, 0x47d2, - 0xa085, 0x0001, 0x007c, 0x1078, 0x489b, 0x0040, 0x47db, 0x1078, - 0x8d8e, 0x0078, 0x47dd, 0xa085, 0x0001, 0x007c, 0x1078, 0x489b, - 0x0040, 0x47e6, 0x1078, 0x8df8, 0x0078, 0x47e8, 0xa085, 0x0001, - 0x007c, 0x127e, 0x007e, 0x0d7e, 0x2091, 0x8000, 0x6080, 0xa06d, - 0x0040, 0x4808, 0x6800, 0x007e, 0x6837, 0x0103, 0x6b4a, 0x6847, - 0x0000, 0x1078, 0x8f8d, 0x007e, 0x6000, 0xd0fc, 0x0040, 0x4802, - 0x1078, 0xa4fd, 0x007f, 0x1078, 0x4a73, 0x007f, 0x0078, 0x47ef, - 0x6083, 0x0000, 0x6087, 0x0000, 0x0d7f, 0x007f, 0x127f, 0x007c, - 0x60a4, 0xa00d, 0x00c0, 0x4817, 0xa085, 0x0001, 0x007c, 0x0e7e, - 0x2170, 0x7000, 0xa005, 0x00c0, 0x482c, 0x20a9, 0x0010, 0xae88, - 0x0004, 0x2104, 0xa606, 0x0040, 0x482c, 0x8108, 0x00f0, 0x4821, - 0xa085, 0x0001, 0x0078, 0x482d, 0xa006, 0x0e7f, 0x007c, 0x0d7e, - 0x127e, 0x2091, 0x8000, 0x60a4, 0xa06d, 0x00c0, 0x483d, 0x1078, - 0x138b, 0x0040, 0x484f, 0x2d00, 0x60a6, 0x6803, 0x0001, 0x6807, - 0x0000, 0xad88, 0x0004, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, - 0x00f0, 0x4845, 0xa085, 0x0001, 0x127f, 0x0d7f, 0x007c, 0xa006, - 0x0078, 0x484c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x60a4, 0xa06d, - 0x0040, 0x4860, 0x60a7, 0x0000, 0x1078, 0x13a4, 0xa085, 0x0001, - 0x127f, 0x0d7f, 0x007c, 0x60a8, 0xa00d, 0x00c0, 0x486a, 0xa085, - 0x0001, 0x007c, 0x0e7e, 0x2170, 0x7050, 0xa005, 0x00c0, 0x487d, - 0x20a9, 0x0010, 0xae88, 0x0018, 0x2104, 0xa606, 0x0040, 0x487d, - 0x8108, 0x00f0, 0x4874, 0xa085, 0x0001, 0x0e7f, 0x007c, 0x127e, - 0x2091, 0x8000, 0x1078, 0x4863, 0x00c0, 0x4899, 0x200b, 0xffff, - 0x0d7e, 0x60a8, 0x2068, 0x6854, 0xa08a, 0x0002, 0x0048, 0x4894, - 0x8001, 0x6856, 0x0078, 0x4898, 0x1078, 0x13a4, 0x60ab, 0x0000, - 0x0d7f, 0x127f, 0x007c, 0x609c, 0xd0a4, 0x007c, 0x0f7e, 0x71b0, - 0x81ff, 0x00c0, 0x48b9, 0x71cc, 0xd19c, 0x0040, 0x48b9, 0x2001, - 0x007e, 0xa080, 0xa835, 0x2004, 0xa07d, 0x0040, 0x48b9, 0x7804, - 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x48b9, 0x7800, 0xc0ed, - 0x7802, 0x2079, 0xa752, 0x7804, 0xd0a4, 0x0040, 0x48df, 0x157e, - 0x0c7e, 0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x45c4, - 0x00c0, 0x48d9, 0x6004, 0xa084, 0xff00, 0x8007, 0xa096, 0x0004, - 0x0040, 0x48d6, 0xa086, 0x0006, 0x00c0, 0x48d9, 0x6000, 0xc0ed, - 0x6002, 0x017f, 0x8108, 0x00f0, 0x48c5, 0x0c7f, 0x157f, 0x1078, - 0x4967, 0x0040, 0x48e8, 0x2001, 0xa9a1, 0x200c, 0x0078, 0x48f0, - 0x2079, 0xa752, 0x7804, 0xd0a4, 0x0040, 0x48f4, 0x2009, 0x07d0, - 0x2011, 0x48f6, 0x1078, 0x5add, 0x0f7f, 0x007c, 0x2011, 0x48f6, - 0x1078, 0x5a45, 0x1078, 0x4967, 0x0040, 0x491e, 0x2001, 0xa8b3, - 0x2004, 0xa080, 0x0000, 0x200c, 0xc1ec, 0x2102, 0x2001, 0xa753, - 0x2004, 0xd0a4, 0x0040, 0x4912, 0x2009, 0x07d0, 0x2011, 0x48f6, - 0x1078, 0x5add, 0x0e7e, 0x2071, 0xa700, 0x706f, 0x0000, 0x7073, - 0x0000, 0x1078, 0x2677, 0x0e7f, 0x0078, 0x4956, 0x157e, 0x0c7e, - 0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x45c4, 0x00c0, - 0x4950, 0x6000, 0xd0ec, 0x0040, 0x4950, 0x047e, 0x62a0, 0xa294, - 0x00ff, 0x8227, 0xa006, 0x2009, 0x0029, 0x1078, 0xa22d, 0x6000, - 0xc0e5, 0xc0ec, 0x6002, 0x6004, 0xa084, 0x00ff, 0xa085, 0x0700, - 0x6006, 0x2019, 0x0029, 0x1078, 0x5f01, 0x077e, 0x2039, 0x0000, - 0x1078, 0x5e0a, 0x2009, 0x0000, 0x1078, 0x9f9b, 0x077f, 0x047f, - 0x017f, 0x8108, 0x00f0, 0x4924, 0x0c7f, 0x157f, 0x007c, 0x0c7e, - 0x6018, 0x2060, 0x6000, 0xc0ec, 0x6002, 0x0c7f, 0x007c, 0x7818, - 0x2004, 0xd0ac, 0x007c, 0x7818, 0x2004, 0xd0bc, 0x007c, 0x0f7e, - 0x2001, 0xa8b3, 0x2004, 0xa07d, 0x0040, 0x4970, 0x7800, 0xd0ec, - 0x0f7f, 0x007c, 0x127e, 0x027e, 0x2091, 0x8000, 0x007e, 0x62a0, - 0xa290, 0xa835, 0x2204, 0xac06, 0x10c0, 0x1332, 0x007f, 0x6200, - 0xa005, 0x0040, 0x4986, 0xc2fd, 0x0078, 0x4987, 0xc2fc, 0x6202, - 0x027f, 0x127f, 0x007c, 0x2011, 0xa733, 0x2204, 0xd0cc, 0x0040, - 0x4998, 0x2001, 0xa99f, 0x200c, 0x2011, 0x4999, 0x1078, 0x5add, - 0x007c, 0x2011, 0x4999, 0x1078, 0x5a45, 0x2011, 0xa733, 0x2204, - 0xc0cc, 0x2012, 0x007c, 0x2071, 0xa814, 0x7003, 0x0001, 0x7007, - 0x0000, 0x7013, 0x0000, 0x7017, 0x0000, 0x701b, 0x0000, 0x701f, - 0x0000, 0x700b, 0x0000, 0x704b, 0x0001, 0x704f, 0x0000, 0x705b, - 0x0020, 0x705f, 0x0040, 0x707f, 0x0000, 0x2071, 0xa97d, 0x7003, - 0xa814, 0x7007, 0x0000, 0x700b, 0x0000, 0x700f, 0xa95d, 0x7013, - 0x0020, 0x7017, 0x0040, 0x7037, 0x0000, 0x007c, 0x017e, 0x0e7e, - 0x2071, 0xa935, 0xa00e, 0x7186, 0x718a, 0x7097, 0x0001, 0x2001, - 0xa753, 0x2004, 0xd0fc, 0x00c0, 0x49e8, 0x2001, 0xa753, 0x2004, - 0xa00e, 0xd09c, 0x0040, 0x49e5, 0x8108, 0x7102, 0x0078, 0x4a3b, - 0x2001, 0xa772, 0x200c, 0xa184, 0x000f, 0x2009, 0xa773, 0x210c, - 0x0079, 0x49f2, 0x49dd, 0x4a13, 0x4a1b, 0x4a26, 0x4a2c, 0x49dd, - 0x49dd, 0x49dd, 0x4a02, 0x49dd, 0x49dd, 0x49dd, 0x49dd, 0x49dd, - 0x49dd, 0x49dd, 0x7003, 0x0004, 0x137e, 0x147e, 0x157e, 0x2099, - 0xa776, 0x20a1, 0xa986, 0x20a9, 0x0004, 0x53a3, 0x157f, 0x147f, - 0x137f, 0x0078, 0x4a3b, 0x708f, 0x0005, 0x7007, 0x0122, 0x2001, - 0x0002, 0x0078, 0x4a21, 0x708f, 0x0002, 0x7007, 0x0121, 0x2001, - 0x0003, 0x7002, 0x7097, 0x0001, 0x0078, 0x4a38, 0x7007, 0x0122, - 0x2001, 0x0002, 0x0078, 0x4a30, 0x7007, 0x0121, 0x2001, 0x0003, - 0x7002, 0xa006, 0x7096, 0x708e, 0xa184, 0xff00, 0x8007, 0x709a, - 0xa184, 0x00ff, 0x7092, 0x0e7f, 0x017f, 0x007c, 0x0e7e, 0x2071, - 0xa814, 0x684c, 0xa005, 0x00c0, 0x4a4c, 0x7028, 0xc085, 0x702a, - 0xa085, 0x0001, 0x0078, 0x4a71, 0x6a60, 0x7236, 0x6b64, 0x733a, - 0x6868, 0x703e, 0x7076, 0x686c, 0x7042, 0x707a, 0x684c, 0x702e, - 0x6844, 0x7032, 0x2009, 0x000d, 0x200a, 0x700b, 0x0000, 0x8007, - 0x8006, 0x8006, 0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100, - 0xa319, 0x726e, 0x7372, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, - 0xa006, 0x0e7f, 0x007c, 0x0e7e, 0x027e, 0x6838, 0xd0fc, 0x00c0, - 0x4ac9, 0x6804, 0xa00d, 0x0040, 0x4a8f, 0x0d7e, 0x2071, 0xa700, - 0xa016, 0x702c, 0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff, - 0x00c0, 0x4a82, 0x702e, 0x70ac, 0xa200, 0x70ae, 0x0d7f, 0x2071, - 0xa814, 0x701c, 0xa005, 0x00c0, 0x4adb, 0x0068, 0x4ad9, 0x2071, - 0xa935, 0x7200, 0x82ff, 0x0040, 0x4ad9, 0x6934, 0xa186, 0x0103, - 0x00c0, 0x4aec, 0x6948, 0x6844, 0xa105, 0x00c0, 0x4acc, 0x2009, - 0x8020, 0x2200, 0x0079, 0x4aac, 0x4ad9, 0x4ab1, 0x4b09, 0x4b17, - 0x4ad9, 0x2071, 0x0000, 0x7018, 0xd084, 0x00c0, 0x4ad9, 0x7122, - 0x683c, 0x7026, 0x6840, 0x702a, 0x701b, 0x0001, 0x2091, 0x4080, - 0x2071, 0xa700, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70ac, 0x8000, - 0x70ae, 0x027f, 0x0e7f, 0x007c, 0x6844, 0xa086, 0x0100, 0x00c0, - 0x4ad9, 0x6868, 0xa005, 0x00c0, 0x4ad9, 0x2009, 0x8020, 0x0078, - 0x4aa9, 0x2071, 0xa814, 0x2d08, 0x206b, 0x0000, 0x7010, 0x8000, - 0x7012, 0x7018, 0xa06d, 0x711a, 0x0040, 0x4ae9, 0x6902, 0x0078, - 0x4aea, 0x711e, 0x0078, 0x4ac9, 0xa18c, 0x00ff, 0xa186, 0x0017, - 0x0040, 0x4afa, 0xa186, 0x001e, 0x0040, 0x4afa, 0xa18e, 0x001f, - 0x00c0, 0x4ad9, 0x684c, 0xd0cc, 0x0040, 0x4ad9, 0x6850, 0xa084, - 0x00ff, 0xa086, 0x0001, 0x00c0, 0x4ad9, 0x2009, 0x8021, 0x0078, - 0x4aa9, 0x7084, 0x8008, 0xa092, 0x001e, 0x00c8, 0x4ad9, 0x7186, - 0xae90, 0x0003, 0xa210, 0x683c, 0x2012, 0x0078, 0x4b27, 0x7084, - 0x8008, 0xa092, 0x000f, 0x00c8, 0x4ad9, 0x7186, 0xae90, 0x0003, - 0x8003, 0xa210, 0x683c, 0x2012, 0x8210, 0x6840, 0x2012, 0x7088, - 0xa10a, 0x0048, 0x4ac0, 0x718c, 0x7084, 0xa10a, 0x0048, 0x4ac0, - 0x2071, 0x0000, 0x7018, 0xd084, 0x00c0, 0x4ac0, 0x2071, 0xa935, - 0x7000, 0xa086, 0x0002, 0x00c0, 0x4b47, 0x1078, 0x4dc3, 0x2071, - 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078, 0x4ac0, 0x1078, - 0x4dee, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078, - 0x4ac0, 0x007e, 0x684c, 0x007e, 0x6837, 0x0103, 0x20a9, 0x001c, - 0xad80, 0x0011, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x007f, 0xa084, - 0x00ff, 0x684e, 0x007f, 0x684a, 0x6952, 0x007c, 0x2071, 0xa814, - 0x7004, 0x0079, 0x4b6b, 0x4b75, 0x4b86, 0x4d94, 0x4d95, 0x4dbc, - 0x4dc2, 0x4b76, 0x4d82, 0x4d23, 0x4da5, 0x007c, 0x127e, 0x2091, - 0x8000, 0x0068, 0x4b85, 0x2009, 0x000d, 0x7030, 0x200a, 0x2091, - 0x4080, 0x7007, 0x0001, 0x700b, 0x0000, 0x127f, 0x2069, 0xa9c4, - 0x6844, 0xa005, 0x0050, 0x4bae, 0x00c0, 0x4bae, 0x127e, 0x2091, - 0x8000, 0x2069, 0x0000, 0x6934, 0x2001, 0xa820, 0x2004, 0xa10a, - 0x0040, 0x4ba9, 0x0068, 0x4bad, 0x2069, 0x0000, 0x6818, 0xd084, - 0x00c0, 0x4bad, 0x2009, 0x8040, 0x6922, 0x681b, 0x0001, 0x2091, - 0x4080, 0x2069, 0xa9c4, 0x6847, 0xffff, 0x127f, 0x2069, 0xa700, - 0x6848, 0x6964, 0xa102, 0x2069, 0xa935, 0x688a, 0x6984, 0x701c, - 0xa06d, 0x0040, 0x4bc0, 0x81ff, 0x0040, 0x4c08, 0x0078, 0x4bd6, - 0x81ff, 0x0040, 0x4cda, 0x2071, 0xa935, 0x7184, 0x7088, 0xa10a, - 0x00c8, 0x4bd6, 0x7190, 0x2071, 0xa9c4, 0x7040, 0xa005, 0x0040, - 0x4bd6, 0x00d0, 0x4cda, 0x7142, 0x0078, 0x4cda, 0x2071, 0xa935, - 0x718c, 0x127e, 0x2091, 0x8000, 0x7084, 0xa10a, 0x0048, 0x4cf7, - 0x0068, 0x4c8c, 0x2071, 0x0000, 0x7018, 0xd084, 0x00c0, 0x4c8c, - 0x2001, 0xffff, 0x2071, 0xa9c4, 0x7042, 0x2071, 0xa935, 0x7000, - 0xa086, 0x0002, 0x00c0, 0x4bfe, 0x1078, 0x4dc3, 0x2071, 0x0000, - 0x701b, 0x0001, 0x2091, 0x4080, 0x0078, 0x4c8c, 0x1078, 0x4dee, - 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078, 0x4c8c, - 0x2071, 0xa935, 0x7000, 0xa005, 0x0040, 0x4cb9, 0x6934, 0xa186, - 0x0103, 0x00c0, 0x4c8f, 0x684c, 0xd0bc, 0x00c0, 0x4cb9, 0x6948, - 0x6844, 0xa105, 0x00c0, 0x4cac, 0x2009, 0x8020, 0x2071, 0xa935, - 0x7000, 0x0079, 0x4c23, 0x4cb9, 0x4c71, 0x4c49, 0x4c5b, 0x4c28, - 0x137e, 0x147e, 0x157e, 0x2099, 0xa776, 0x20a1, 0xa986, 0x20a9, - 0x0004, 0x53a3, 0x157f, 0x147f, 0x137f, 0x2071, 0xa97d, 0xad80, - 0x000f, 0x700e, 0x7013, 0x0002, 0x7007, 0x0002, 0x700b, 0x0000, - 0x2e10, 0x1078, 0x13db, 0x2071, 0xa814, 0x7007, 0x0009, 0x0078, - 0x4cda, 0x7084, 0x8008, 0xa092, 0x001e, 0x00c8, 0x4cda, 0xae90, - 0x0003, 0xa210, 0x683c, 0x2012, 0x7186, 0x2071, 0xa814, 0x1078, - 0x4e4c, 0x0078, 0x4cda, 0x7084, 0x8008, 0xa092, 0x000f, 0x00c8, - 0x4cda, 0xae90, 0x0003, 0x8003, 0xa210, 0x683c, 0x2012, 0x8210, - 0x6840, 0x2012, 0x7186, 0x2071, 0xa814, 0x1078, 0x4e4c, 0x0078, - 0x4cda, 0x127e, 0x2091, 0x8000, 0x0068, 0x4c8c, 0x2071, 0x0000, - 0x7018, 0xd084, 0x00c0, 0x4c8c, 0x7122, 0x683c, 0x7026, 0x6840, - 0x702a, 0x701b, 0x0001, 0x2091, 0x4080, 0x127f, 0x2071, 0xa814, - 0x1078, 0x4e4c, 0x0078, 0x4cda, 0x127f, 0x0078, 0x4cda, 0xa18c, - 0x00ff, 0xa186, 0x0017, 0x0040, 0x4c9d, 0xa186, 0x001e, 0x0040, - 0x4c9d, 0xa18e, 0x001f, 0x00c0, 0x4cb9, 0x684c, 0xd0cc, 0x0040, - 0x4cb9, 0x6850, 0xa084, 0x00ff, 0xa086, 0x0001, 0x00c0, 0x4cb9, - 0x2009, 0x8021, 0x0078, 0x4c1e, 0x6844, 0xa086, 0x0100, 0x00c0, - 0x4cb9, 0x6868, 0xa005, 0x00c0, 0x4cb9, 0x2009, 0x8020, 0x0078, - 0x4c1e, 0x2071, 0xa814, 0x1078, 0x4e60, 0x0040, 0x4cda, 0x2071, - 0xa814, 0x700f, 0x0001, 0x6934, 0xa184, 0x00ff, 0xa086, 0x0003, - 0x00c0, 0x4cd1, 0x810f, 0xa18c, 0x00ff, 0x8101, 0x0040, 0x4cd1, - 0x710e, 0x7007, 0x0003, 0x1078, 0x4e80, 0x7050, 0xa086, 0x0100, - 0x0040, 0x4d95, 0x127e, 0x2091, 0x8000, 0x2071, 0xa814, 0x7008, - 0xa086, 0x0001, 0x00c0, 0x4cf5, 0x0068, 0x4cf5, 0x2009, 0x000d, - 0x7030, 0x200a, 0x2091, 0x4080, 0x700b, 0x0000, 0x7004, 0xa086, - 0x0006, 0x00c0, 0x4cf5, 0x7007, 0x0001, 0x127f, 0x007c, 0x2071, - 0xa814, 0x1078, 0x4e60, 0x0040, 0x4d20, 0x2071, 0xa935, 0x7084, - 0x700a, 0x20a9, 0x0020, 0x2099, 0xa936, 0x20a1, 0xa95d, 0x53a3, - 0x7087, 0x0000, 0x2071, 0xa814, 0x2069, 0xa97d, 0x706c, 0x6826, - 0x7070, 0x682a, 0x7074, 0x682e, 0x7078, 0x6832, 0x2d10, 0x1078, - 0x13db, 0x7007, 0x0008, 0x2001, 0xffff, 0x2071, 0xa9c4, 0x7042, - 0x127f, 0x0078, 0x4cda, 0x2069, 0xa97d, 0x6808, 0xa08e, 0x0000, - 0x0040, 0x4d81, 0xa08e, 0x0200, 0x0040, 0x4d7f, 0xa08e, 0x0100, - 0x00c0, 0x4d81, 0x127e, 0x2091, 0x8000, 0x0068, 0x4d7c, 0x2069, - 0x0000, 0x6818, 0xd084, 0x00c0, 0x4d7c, 0x702c, 0x7130, 0x8108, - 0xa102, 0x0048, 0x4d4a, 0xa00e, 0x7034, 0x706e, 0x7038, 0x7072, - 0x0078, 0x4d54, 0x706c, 0xa080, 0x0040, 0x706e, 0x00c8, 0x4d54, - 0x7070, 0xa081, 0x0000, 0x7072, 0x7132, 0x6936, 0x700b, 0x0000, - 0x2001, 0xa95a, 0x2004, 0xa005, 0x00c0, 0x4d73, 0x6934, 0x2069, - 0xa935, 0x689c, 0x699e, 0x2069, 0xa9c4, 0xa102, 0x00c0, 0x4d6c, - 0x6844, 0xa005, 0x00d0, 0x4d7a, 0x2001, 0xa95b, 0x200c, 0x810d, - 0x6946, 0x0078, 0x4d7a, 0x2009, 0x8040, 0x6922, 0x681b, 0x0001, - 0x2091, 0x4080, 0x7007, 0x0001, 0x127f, 0x0078, 0x4d81, 0x7007, - 0x0005, 0x007c, 0x701c, 0xa06d, 0x0040, 0x4d93, 0x1078, 0x4e60, - 0x0040, 0x4d93, 0x7007, 0x0003, 0x1078, 0x4e80, 0x7050, 0xa086, - 0x0100, 0x0040, 0x4d95, 0x007c, 0x007c, 0x7050, 0xa09e, 0x0100, - 0x00c0, 0x4d9e, 0x7007, 0x0004, 0x0078, 0x4dbc, 0xa086, 0x0200, - 0x00c0, 0x4da4, 0x7007, 0x0005, 0x007c, 0x2001, 0xa97f, 0x2004, - 0xa08e, 0x0100, 0x00c0, 0x4db1, 0x7007, 0x0001, 0x1078, 0x4e4c, - 0x007c, 0xa08e, 0x0000, 0x0040, 0x4db0, 0xa08e, 0x0200, 0x00c0, - 0x4db0, 0x7007, 0x0005, 0x007c, 0x1078, 0x4e16, 0x7006, 0x1078, - 0x4e4c, 0x007c, 0x007c, 0x0e7e, 0x157e, 0x2071, 0xa935, 0x7184, - 0x81ff, 0x0040, 0x4deb, 0xa006, 0x7086, 0xae80, 0x0003, 0x2071, - 0x0000, 0x21a8, 0x2014, 0x7226, 0x8000, 0x0070, 0x4de8, 0x2014, - 0x722a, 0x8000, 0x0070, 0x4de8, 0x2014, 0x722e, 0x8000, 0x0070, - 0x4de8, 0x2014, 0x723a, 0x8000, 0x0070, 0x4de8, 0x2014, 0x723e, - 0xa180, 0x8030, 0x7022, 0x157f, 0x0e7f, 0x007c, 0x0e7e, 0x157e, - 0x2071, 0xa935, 0x7184, 0x81ff, 0x0040, 0x4e13, 0xa006, 0x7086, - 0xae80, 0x0003, 0x2071, 0x0000, 0x21a8, 0x2014, 0x7226, 0x8000, - 0x2014, 0x722a, 0x8000, 0x0070, 0x4e0c, 0x2014, 0x723a, 0x8000, - 0x2014, 0x723e, 0x0078, 0x4e10, 0x2001, 0x8020, 0x0078, 0x4e12, - 0x2001, 0x8042, 0x7022, 0x157f, 0x0e7f, 0x007c, 0x702c, 0x7130, - 0x8108, 0xa102, 0x0048, 0x4e23, 0xa00e, 0x7034, 0x706e, 0x7038, - 0x7072, 0x0078, 0x4e2d, 0x706c, 0xa080, 0x0040, 0x706e, 0x00c8, - 0x4e2d, 0x7070, 0xa081, 0x0000, 0x7072, 0x7132, 0x700c, 0x8001, - 0x700e, 0x00c0, 0x4e43, 0x127e, 0x2091, 0x8000, 0x0068, 0x4e46, - 0x2001, 0x000d, 0x2102, 0x2091, 0x4080, 0x2001, 0x0001, 0x700b, - 0x0000, 0x127f, 0x007c, 0x2001, 0x0007, 0x007c, 0x2001, 0x0006, - 0x700b, 0x0001, 0x127f, 0x007c, 0x701c, 0xa06d, 0x0040, 0x4e5f, - 0x127e, 0x2091, 0x8000, 0x7010, 0x8001, 0x7012, 0x2d04, 0x701e, - 0xa005, 0x00c0, 0x4e5c, 0x701a, 0x127f, 0x1078, 0x13a4, 0x007c, - 0x2019, 0x000d, 0x2304, 0x230c, 0xa10e, 0x0040, 0x4e6f, 0x2304, - 0x230c, 0xa10e, 0x0040, 0x4e6f, 0xa006, 0x0078, 0x4e7f, 0x732c, - 0x8319, 0x7130, 0xa102, 0x00c0, 0x4e79, 0x2300, 0xa005, 0x0078, - 0x4e7f, 0x0048, 0x4e7e, 0xa302, 0x0078, 0x4e7f, 0x8002, 0x007c, - 0x2d00, 0x7026, 0xa080, 0x000d, 0x7056, 0x7053, 0x0000, 0x127e, - 0x2091, 0x8000, 0x2009, 0xa9d6, 0x2104, 0xc08d, 0x200a, 0x127f, - 0x1078, 0x13f9, 0x007c, 0x2071, 0xa7e2, 0x7003, 0x0000, 0x7007, - 0x0000, 0x700f, 0x0000, 0x702b, 0x0001, 0x704f, 0x0000, 0x7053, - 0x0001, 0x705f, 0x0020, 0x7063, 0x0040, 0x7083, 0x0000, 0x708b, - 0x0000, 0x708f, 0x0001, 0x70bf, 0x0000, 0x007c, 0x0e7e, 0x2071, - 0xa7e2, 0x6848, 0xa005, 0x00c0, 0x4ebc, 0x7028, 0xc085, 0x702a, - 0xa085, 0x0001, 0x0078, 0x4ee1, 0x6a50, 0x7236, 0x6b54, 0x733a, - 0x6858, 0x703e, 0x707a, 0x685c, 0x7042, 0x707e, 0x6848, 0x702e, - 0x6840, 0x7032, 0x2009, 0x000c, 0x200a, 0x8007, 0x8006, 0x8006, - 0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100, 0xa319, 0x7272, - 0x7376, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0x700f, 0x0000, - 0xa006, 0x0e7f, 0x007c, 0x2b78, 0x2071, 0xa7e2, 0x7004, 0x1079, - 0x4f41, 0x700c, 0x0079, 0x4eec, 0x4ef1, 0x4ee6, 0x4ee6, 0x4ee6, - 0x4ee6, 0x007c, 0x700c, 0x0079, 0x4ef5, 0x4efa, 0x4f3f, 0x4f3f, - 0x4f40, 0x4f40, 0x7830, 0x7930, 0xa106, 0x0040, 0x4f04, 0x7830, - 0x7930, 0xa106, 0x00c0, 0x4f2a, 0x7030, 0xa10a, 0x0040, 0x4f2a, - 0x00c8, 0x4f0c, 0x712c, 0xa10a, 0xa18a, 0x0002, 0x00c8, 0x4f2b, - 0x1078, 0x1370, 0x0040, 0x4f2a, 0x2d00, 0x705a, 0x7063, 0x0040, - 0x2001, 0x0003, 0x7057, 0x0000, 0x127e, 0x007e, 0x2091, 0x8000, - 0x2009, 0xa9d6, 0x2104, 0xc085, 0x200a, 0x007f, 0x700e, 0x127f, - 0x1078, 0x13f9, 0x007c, 0x1078, 0x1370, 0x0040, 0x4f2a, 0x2d00, - 0x705a, 0x1078, 0x1370, 0x00c0, 0x4f37, 0x0078, 0x4f16, 0x2d00, - 0x7086, 0x7063, 0x0080, 0x2001, 0x0004, 0x0078, 0x4f1a, 0x007c, - 0x007c, 0x4f52, 0x4f53, 0x4f8a, 0x4f8b, 0x4f3f, 0x4fc1, 0x4fc6, - 0x4ffd, 0x4ffe, 0x5019, 0x501a, 0x501b, 0x501c, 0x501d, 0x501e, - 0x509e, 0x50c8, 0x007c, 0x700c, 0x0079, 0x4f56, 0x4f5b, 0x4f5e, - 0x4f6e, 0x4f89, 0x4f89, 0x1078, 0x4ef2, 0x007c, 0x127e, 0x8001, - 0x700e, 0x7058, 0x007e, 0x1078, 0x5464, 0x0040, 0x4f6b, 0x2091, - 0x8000, 0x1078, 0x4ef2, 0x0d7f, 0x0078, 0x4f77, 0x127e, 0x8001, - 0x700e, 0x1078, 0x5464, 0x7058, 0x2068, 0x7084, 0x705a, 0x6803, - 0x0000, 0x6807, 0x0000, 0x6834, 0xa084, 0x00ff, 0xa08a, 0x0020, - 0x00c8, 0x4f86, 0x1079, 0x4fa1, 0x127f, 0x007c, 0x127f, 0x1078, - 0x501f, 0x007c, 0x007c, 0x007c, 0x0e7e, 0x2071, 0xa7e2, 0x700c, - 0x0079, 0x4f92, 0x4f97, 0x4f97, 0x4f97, 0x4f99, 0x4f9d, 0x0e7f, - 0x007c, 0x700f, 0x0001, 0x0078, 0x4f9f, 0x700f, 0x0002, 0x0e7f, - 0x007c, 0x501f, 0x501f, 0x503b, 0x501f, 0x5171, 0x501f, 0x501f, - 0x501f, 0x501f, 0x501f, 0x503b, 0x51bb, 0x5208, 0x5261, 0x5277, - 0x501f, 0x501f, 0x5057, 0x503b, 0x501f, 0x501f, 0x5078, 0x5338, - 0x5356, 0x501f, 0x5057, 0x501f, 0x501f, 0x501f, 0x501f, 0x506d, - 0x5356, 0x7020, 0x2068, 0x1078, 0x13a4, 0x007c, 0x700c, 0x0079, - 0x4fc9, 0x4fce, 0x4fd1, 0x4fe1, 0x4ffc, 0x4ffc, 0x1078, 0x4ef2, - 0x007c, 0x127e, 0x8001, 0x700e, 0x7058, 0x007e, 0x1078, 0x5464, - 0x0040, 0x4fde, 0x2091, 0x8000, 0x1078, 0x4ef2, 0x0d7f, 0x0078, - 0x4fea, 0x127e, 0x8001, 0x700e, 0x1078, 0x5464, 0x7058, 0x2068, - 0x7084, 0x705a, 0x6803, 0x0000, 0x6807, 0x0000, 0x6834, 0xa084, - 0x00ff, 0xa08a, 0x001a, 0x00c8, 0x4ff9, 0x1079, 0x4fff, 0x127f, - 0x007c, 0x127f, 0x1078, 0x501f, 0x007c, 0x007c, 0x007c, 0x501f, - 0x503b, 0x515b, 0x501f, 0x503b, 0x501f, 0x503b, 0x503b, 0x501f, - 0x503b, 0x515b, 0x503b, 0x503b, 0x503b, 0x503b, 0x503b, 0x501f, - 0x503b, 0x515b, 0x501f, 0x501f, 0x503b, 0x501f, 0x501f, 0x501f, - 0x503b, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x7007, - 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0d5, 0x683a, 0x127e, 0x2091, - 0x8000, 0x1078, 0x4a73, 0x127f, 0x007c, 0x7007, 0x0001, 0x6838, - 0xa084, 0x00ff, 0xc0e5, 0x683a, 0x127e, 0x2091, 0x8000, 0x1078, - 0x4a73, 0x127f, 0x007c, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, - 0xc0ed, 0x683a, 0x127e, 0x2091, 0x8000, 0x1078, 0x4a73, 0x127f, - 0x007c, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0dd, 0x683a, - 0x127e, 0x2091, 0x8000, 0x1078, 0x4a73, 0x127f, 0x007c, 0x6834, - 0x8007, 0xa084, 0x00ff, 0x0040, 0x502d, 0x8001, 0x00c0, 0x5064, - 0x7007, 0x0001, 0x0078, 0x513a, 0x7007, 0x0006, 0x7012, 0x2d00, - 0x7016, 0x701a, 0x704b, 0x513a, 0x007c, 0x684c, 0xa084, 0x00c0, - 0xa086, 0x00c0, 0x00c0, 0x5078, 0x7007, 0x0001, 0x0078, 0x5373, - 0x2d00, 0x7016, 0x701a, 0x20a9, 0x0004, 0xa080, 0x0024, 0x2098, - 0x20a1, 0xa80d, 0x53a3, 0x6858, 0x7012, 0xa082, 0x0401, 0x00c8, - 0x5049, 0x6884, 0xa08a, 0x0002, 0x00c8, 0x5049, 0x82ff, 0x00c0, - 0x509a, 0x6888, 0x698c, 0xa105, 0x0040, 0x509a, 0x2001, 0x510a, - 0x0078, 0x509d, 0xa280, 0x5100, 0x2004, 0x70c6, 0x7010, 0xa015, - 0x0040, 0x50e8, 0x1078, 0x1370, 0x00c0, 0x50a9, 0x7007, 0x000f, - 0x007c, 0x2d00, 0x7022, 0x70c4, 0x2060, 0x6000, 0x6836, 0x6004, - 0xad00, 0x7096, 0x6008, 0xa20a, 0x00c8, 0x50b8, 0xa00e, 0x2200, - 0x7112, 0x620c, 0x8003, 0x800b, 0xa296, 0x0004, 0x0040, 0x50c1, - 0xa108, 0x719a, 0x810b, 0x719e, 0xae90, 0x0022, 0x1078, 0x13db, - 0x7090, 0xa08e, 0x0100, 0x0040, 0x50dc, 0xa086, 0x0200, 0x0040, - 0x50d4, 0x7007, 0x0010, 0x007c, 0x7020, 0x2068, 0x1078, 0x13a4, - 0x7014, 0x2068, 0x0078, 0x5049, 0x7020, 0x2068, 0x7018, 0x6802, - 0x6807, 0x0000, 0x2d08, 0x2068, 0x6906, 0x711a, 0x0078, 0x509e, - 0x7014, 0x2068, 0x7007, 0x0001, 0x6884, 0xa005, 0x00c0, 0x50f7, - 0x6888, 0x698c, 0xa105, 0x0040, 0x50f7, 0x1078, 0x510e, 0x6834, - 0xa084, 0x00ff, 0xa086, 0x001e, 0x0040, 0x5373, 0x0078, 0x513a, - 0x5102, 0x5106, 0x0002, 0x0011, 0x0007, 0x0004, 0x000a, 0x000f, - 0x0005, 0x0006, 0x000a, 0x0011, 0x0005, 0x0004, 0x0f7e, 0x0e7e, - 0x0c7e, 0x077e, 0x067e, 0x6f88, 0x6e8c, 0x6804, 0x2060, 0xacf0, - 0x0021, 0xacf8, 0x0027, 0x2009, 0x0005, 0x700c, 0x7816, 0x7008, - 0x7812, 0x7004, 0x7806, 0x7000, 0x7802, 0x7e0e, 0x7f0a, 0x8109, - 0x0040, 0x5130, 0xaef2, 0x0004, 0xaffa, 0x0006, 0x0078, 0x511d, - 0x6004, 0xa065, 0x00c0, 0x5117, 0x067f, 0x077f, 0x0c7f, 0x0e7f, - 0x0f7f, 0x007c, 0x2009, 0xa72f, 0x210c, 0x81ff, 0x00c0, 0x5155, - 0x6838, 0xa084, 0x00ff, 0x683a, 0x1078, 0x4353, 0x00c0, 0x5149, - 0x007c, 0x1078, 0x4b51, 0x127e, 0x2091, 0x8000, 0x1078, 0x8f8d, - 0x1078, 0x4a73, 0x127f, 0x0078, 0x5148, 0x2001, 0x0028, 0x2009, - 0x0000, 0x0078, 0x5149, 0x7018, 0x6802, 0x2d08, 0x2068, 0x6906, - 0x711a, 0x7010, 0x8001, 0x7012, 0x0040, 0x516a, 0x7007, 0x0006, - 0x0078, 0x5170, 0x7014, 0x2068, 0x7007, 0x0001, 0x7048, 0x107a, - 0x007c, 0x7007, 0x0001, 0x6944, 0x810f, 0xa18c, 0x00ff, 0x6848, - 0xa084, 0x00ff, 0x20a9, 0x0001, 0xa096, 0x0001, 0x0040, 0x519a, - 0x2009, 0x0000, 0x20a9, 0x00ff, 0xa096, 0x0002, 0x0040, 0x519a, - 0xa005, 0x00c0, 0x51ad, 0x6944, 0x810f, 0xa18c, 0x00ff, 0x1078, - 0x45c4, 0x00c0, 0x51ad, 0x067e, 0x6e50, 0x1078, 0x46b3, 0x067f, - 0x0078, 0x51ad, 0x047e, 0x2011, 0xa70c, 0x2224, 0xc484, 0xc48c, - 0x2412, 0x047f, 0x0c7e, 0x1078, 0x45c4, 0x00c0, 0x51a9, 0x1078, - 0x4852, 0x8108, 0x00f0, 0x51a3, 0x0c7f, 0x684c, 0xd084, 0x00c0, - 0x51b4, 0x1078, 0x13a4, 0x007c, 0x127e, 0x2091, 0x8000, 0x1078, - 0x4a73, 0x127f, 0x007c, 0x127e, 0x2091, 0x8000, 0x7007, 0x0001, - 0x2001, 0xa753, 0x2004, 0xd0a4, 0x0040, 0x51ff, 0x2061, 0xaa33, - 0x6100, 0xd184, 0x0040, 0x51df, 0x6858, 0xa084, 0x00ff, 0x00c0, - 0x5202, 0x6000, 0xd084, 0x0040, 0x51ff, 0x6004, 0xa005, 0x00c0, - 0x5205, 0x6003, 0x0000, 0x600b, 0x0000, 0x0078, 0x51fc, 0x2011, - 0x0001, 0x6860, 0xa005, 0x00c0, 0x51e7, 0x2001, 0x001e, 0x8000, - 0x6016, 0x6858, 0xa084, 0x00ff, 0x0040, 0x51ff, 0x6006, 0x6858, - 0x8007, 0xa084, 0x00ff, 0x0040, 0x51ff, 0x600a, 0x6858, 0x8000, - 0x00c0, 0x51fb, 0xc28d, 0x6202, 0x127f, 0x0078, 0x5453, 0x127f, - 0x0078, 0x544b, 0x127f, 0x0078, 0x5443, 0x127f, 0x0078, 0x5447, - 0x127e, 0x2091, 0x8000, 0x7007, 0x0001, 0x2001, 0xa753, 0x2004, - 0xd0a4, 0x0040, 0x525e, 0x2061, 0xaa33, 0x6000, 0xd084, 0x0040, - 0x525e, 0x6204, 0x6308, 0xd08c, 0x00c0, 0x5250, 0x6c48, 0xa484, - 0x0003, 0x0040, 0x5236, 0x6958, 0xa18c, 0x00ff, 0x8001, 0x00c0, - 0x522f, 0x2100, 0xa210, 0x0048, 0x525b, 0x0078, 0x5236, 0x8001, - 0x00c0, 0x525b, 0x2100, 0xa212, 0x0048, 0x525b, 0xa484, 0x000c, - 0x0040, 0x5250, 0x6958, 0x810f, 0xa18c, 0x00ff, 0xa082, 0x0004, - 0x00c0, 0x5248, 0x2100, 0xa318, 0x0048, 0x525b, 0x0078, 0x5250, - 0xa082, 0x0004, 0x00c0, 0x525b, 0x2100, 0xa31a, 0x0048, 0x525b, - 0x6860, 0xa005, 0x0040, 0x5256, 0x8000, 0x6016, 0x6206, 0x630a, - 0x127f, 0x0078, 0x5453, 0x127f, 0x0078, 0x544f, 0x127f, 0x0078, - 0x544b, 0x127e, 0x2091, 0x8000, 0x7007, 0x0001, 0x2061, 0xaa33, - 0x6300, 0xd38c, 0x00c0, 0x5271, 0x6308, 0x8318, 0x0048, 0x5274, - 0x630a, 0x127f, 0x0078, 0x5461, 0x127f, 0x0078, 0x544f, 0x127e, - 0x0c7e, 0x2091, 0x8000, 0x7007, 0x0001, 0x684c, 0xd0ac, 0x0040, - 0x528b, 0x0c7e, 0x2061, 0xaa33, 0x6000, 0xa084, 0xfcff, 0x6002, - 0x0c7f, 0x0078, 0x52ba, 0x6858, 0xa005, 0x0040, 0x52d1, 0x685c, - 0xa065, 0x0040, 0x52cd, 0x2001, 0xa72f, 0x2004, 0xa005, 0x0040, - 0x529d, 0x1078, 0x8ed6, 0x0078, 0x52ab, 0x6013, 0x0400, 0x6037, - 0x0000, 0x694c, 0xd1a4, 0x0040, 0x52a7, 0x6950, 0x6136, 0x2009, - 0x0041, 0x1078, 0x775c, 0x6958, 0xa18c, 0xff00, 0xa186, 0x2000, - 0x00c0, 0x52ba, 0x027e, 0x2009, 0x0000, 0x2011, 0xfdff, 0x1078, - 0x5bf1, 0x027f, 0x684c, 0xd0c4, 0x0040, 0x52c9, 0x2061, 0xaa33, - 0x6000, 0xd08c, 0x00c0, 0x52c9, 0x6008, 0x8000, 0x0048, 0x52cd, - 0x600a, 0x0c7f, 0x127f, 0x0078, 0x5453, 0x0c7f, 0x127f, 0x0078, - 0x544b, 0x6954, 0xa186, 0x0045, 0x0040, 0x5306, 0xa186, 0x002a, - 0x00c0, 0x52e1, 0x2001, 0xa70c, 0x200c, 0xc194, 0x2102, 0x0078, - 0x52ba, 0xa186, 0x0020, 0x0040, 0x52fa, 0xa186, 0x0029, 0x0040, - 0x52ed, 0xa186, 0x002d, 0x00c0, 0x52cd, 0x6944, 0xa18c, 0xff00, - 0x810f, 0x1078, 0x45c4, 0x00c0, 0x52ba, 0x6000, 0xc0e4, 0x6002, - 0x0078, 0x52ba, 0x685c, 0xa065, 0x0040, 0x52cd, 0x6007, 0x0024, - 0x2001, 0xa9a3, 0x2004, 0x6016, 0x0078, 0x52ba, 0x685c, 0xa065, - 0x0040, 0x52cd, 0x0e7e, 0x6860, 0xa075, 0x2001, 0xa72f, 0x2004, - 0xa005, 0x0040, 0x531e, 0x1078, 0x8ed6, 0x8eff, 0x0040, 0x531b, - 0x2e60, 0x1078, 0x8ed6, 0x0e7f, 0x0078, 0x52ba, 0x6024, 0xc0dc, - 0xc0d5, 0x6026, 0x2e60, 0x6007, 0x003a, 0x6870, 0xa005, 0x0040, - 0x532f, 0x6007, 0x003b, 0x6874, 0x602a, 0x6878, 0x6012, 0x6003, - 0x0001, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0e7f, 0x0078, 0x52ba, - 0x2061, 0xaa33, 0x6000, 0xd084, 0x0040, 0x5352, 0xd08c, 0x00c0, - 0x5461, 0x2091, 0x8000, 0x6204, 0x8210, 0x0048, 0x534c, 0x6206, - 0x2091, 0x8001, 0x0078, 0x5461, 0x2091, 0x8001, 0x6853, 0x0016, - 0x0078, 0x545a, 0x6853, 0x0007, 0x0078, 0x545a, 0x6834, 0x8007, - 0xa084, 0x00ff, 0x00c0, 0x5360, 0x1078, 0x502d, 0x0078, 0x5372, - 0x2030, 0x8001, 0x00c0, 0x536a, 0x7007, 0x0001, 0x1078, 0x5373, - 0x0078, 0x5372, 0x7007, 0x0006, 0x7012, 0x2d00, 0x7016, 0x701a, - 0x704b, 0x5373, 0x007c, 0x0e7e, 0x127e, 0x2091, 0x8000, 0xa03e, - 0x2009, 0xa72f, 0x210c, 0x81ff, 0x00c0, 0x53ff, 0x2009, 0xa70c, - 0x210c, 0xd194, 0x00c0, 0x5431, 0x6848, 0x2070, 0xae82, 0xae00, - 0x0048, 0x53ef, 0x2001, 0xa716, 0x2004, 0xae02, 0x00c8, 0x53ef, - 0x2061, 0xaa33, 0x6100, 0xa184, 0x0301, 0xa086, 0x0001, 0x00c0, - 0x53d2, 0x711c, 0xa186, 0x0006, 0x00c0, 0x53da, 0x7018, 0xa005, - 0x0040, 0x53ff, 0x2004, 0xd0e4, 0x00c0, 0x542b, 0x7024, 0xd0dc, - 0x00c0, 0x5435, 0x6853, 0x0000, 0x6803, 0x0000, 0x2d08, 0x7010, - 0xa005, 0x00c0, 0x53be, 0x7112, 0x684c, 0xd0f4, 0x00c0, 0x5439, - 0x2e60, 0x1078, 0x5b27, 0x127f, 0x0e7f, 0x007c, 0x2068, 0x6800, - 0xa005, 0x00c0, 0x53be, 0x6902, 0x2168, 0x684c, 0xd0f4, 0x00c0, - 0x5439, 0x127f, 0x0e7f, 0x007c, 0x127f, 0x0e7f, 0x6853, 0x0006, - 0x0078, 0x545a, 0xd184, 0x0040, 0x53cc, 0xd1c4, 0x00c0, 0x53f3, - 0x0078, 0x53f7, 0x6944, 0xa18c, 0xff00, 0x810f, 0x1078, 0x45c4, - 0x00c0, 0x542b, 0x6000, 0xd0e4, 0x00c0, 0x542b, 0x711c, 0xa186, - 0x0007, 0x00c0, 0x53ef, 0x6853, 0x0002, 0x0078, 0x542d, 0x6853, - 0x0008, 0x0078, 0x542d, 0x6853, 0x000e, 0x0078, 0x542d, 0x6853, - 0x0017, 0x0078, 0x542d, 0x6853, 0x0035, 0x0078, 0x542d, 0x2001, - 0xa772, 0x2004, 0xd0fc, 0x0040, 0x5427, 0x6848, 0x2070, 0xae82, - 0xae00, 0x0048, 0x5427, 0x6058, 0xae02, 0x00c8, 0x5427, 0x711c, - 0xa186, 0x0006, 0x00c0, 0x5427, 0x7018, 0xa005, 0x0040, 0x5427, - 0x2004, 0xd0bc, 0x0040, 0x5427, 0x2039, 0x0001, 0x7000, 0xa086, - 0x0007, 0x00c0, 0x537e, 0x7003, 0x0002, 0x0078, 0x537e, 0x6853, - 0x0028, 0x0078, 0x542d, 0x6853, 0x0029, 0x127f, 0x0e7f, 0x0078, - 0x545a, 0x6853, 0x002a, 0x0078, 0x542d, 0x6853, 0x0045, 0x0078, - 0x542d, 0x2e60, 0x2019, 0x0002, 0x6017, 0x0014, 0x1078, 0x9dd7, - 0x127f, 0x0e7f, 0x007c, 0x2009, 0x003e, 0x0078, 0x5455, 0x2009, - 0x0004, 0x0078, 0x5455, 0x2009, 0x0006, 0x0078, 0x5455, 0x2009, - 0x0016, 0x0078, 0x5455, 0x2009, 0x0001, 0x6854, 0xa084, 0xff00, - 0xa105, 0x6856, 0x2091, 0x8000, 0x1078, 0x4a73, 0x2091, 0x8001, - 0x007c, 0x1078, 0x13a4, 0x007c, 0x702c, 0x7130, 0x8108, 0xa102, - 0x0048, 0x5471, 0xa00e, 0x7034, 0x7072, 0x7038, 0x7076, 0x0078, - 0x547d, 0x7070, 0xa080, 0x0040, 0x7072, 0x00c8, 0x547d, 0x7074, - 0xa081, 0x0000, 0x7076, 0xa085, 0x0001, 0x7932, 0x7132, 0x007c, - 0x0d7e, 0x1078, 0x5b1e, 0x0d7f, 0x007c, 0x0d7e, 0x2011, 0x0004, - 0x2204, 0xa085, 0x8002, 0x2012, 0x0d7f, 0x007c, 0x20e1, 0x0002, - 0x3d08, 0x20e1, 0x2000, 0x3d00, 0xa084, 0x7000, 0x0040, 0x549c, - 0xa086, 0x1000, 0x00c0, 0x54d3, 0x20e1, 0x0000, 0x3d00, 0xa094, - 0xff00, 0x8217, 0xa084, 0xf000, 0xa086, 0x3000, 0x00c0, 0x54b7, - 0xa184, 0xff00, 0x8007, 0xa086, 0x0008, 0x00c0, 0x54d3, 0x1078, - 0x29bb, 0x00c0, 0x54d3, 0x1078, 0x56b2, 0x0078, 0x54ce, 0x20e1, - 0x0004, 0x3d60, 0xd1bc, 0x00c0, 0x54be, 0x3e60, 0xac84, 0x000f, - 0x00c0, 0x54d3, 0xac82, 0xae00, 0x0048, 0x54d3, 0x6858, 0xac02, - 0x00c8, 0x54d3, 0x2009, 0x0047, 0x1078, 0x775c, 0x7a1c, 0xd284, - 0x00c0, 0x548e, 0x007c, 0xa016, 0x1078, 0x15fa, 0x0078, 0x54ce, - 0x0078, 0x54d3, 0x781c, 0xd08c, 0x0040, 0x5502, 0x157e, 0x137e, - 0x147e, 0x20e1, 0x3000, 0x3d20, 0x3e28, 0xa584, 0x0076, 0x00c0, - 0x5518, 0xa484, 0x7000, 0xa086, 0x1000, 0x00c0, 0x5507, 0x1078, - 0x554e, 0x0040, 0x5518, 0x20e1, 0x3000, 0x7828, 0x7828, 0x1078, - 0x556c, 0x147f, 0x137f, 0x157f, 0x2009, 0xa9b9, 0x2104, 0xa005, - 0x00c0, 0x5503, 0x007c, 0x1078, 0x62d1, 0x0078, 0x5502, 0xa484, - 0x7000, 0x00c0, 0x5518, 0x1078, 0x554e, 0x0040, 0x552c, 0x7000, - 0xa084, 0xff00, 0xa086, 0x8100, 0x0040, 0x54f3, 0x0078, 0x552c, - 0x1078, 0xa55f, 0xd5a4, 0x0040, 0x5528, 0x047e, 0x1078, 0x1b22, - 0x047f, 0x20e1, 0x9010, 0x2001, 0x0138, 0x2202, 0x0078, 0x5530, - 0x1078, 0x554e, 0x6883, 0x0000, 0x20e1, 0x3000, 0x7828, 0x7828, - 0x1078, 0x5537, 0x147f, 0x137f, 0x157f, 0x0078, 0x5502, 0x2001, - 0xa70e, 0x2004, 0xd08c, 0x0040, 0x554d, 0x2001, 0xa700, 0x2004, - 0xa086, 0x0003, 0x00c0, 0x554d, 0x027e, 0x037e, 0x2011, 0x8048, - 0x2518, 0x1078, 0x361b, 0x037f, 0x027f, 0x007c, 0xa484, 0x01ff, - 0x6882, 0xa005, 0x0040, 0x5560, 0xa080, 0x001f, 0xa084, 0x03f8, - 0x80ac, 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5, 0x007c, - 0x20a9, 0x000c, 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5, - 0xa085, 0x0001, 0x0078, 0x555f, 0x7000, 0xa084, 0xff00, 0xa08c, - 0xf000, 0x8007, 0xa196, 0x0000, 0x00c0, 0x5579, 0x0078, 0x57ba, - 0x007c, 0xa196, 0x2000, 0x00c0, 0x558a, 0x6900, 0xa18e, 0x0001, - 0x00c0, 0x5586, 0x1078, 0x3aec, 0x0078, 0x5578, 0x1078, 0x5592, - 0x0078, 0x5578, 0xa196, 0x8000, 0x00c0, 0x5578, 0x1078, 0x5871, - 0x0078, 0x5578, 0x0c7e, 0x7110, 0xa18c, 0xff00, 0x810f, 0xa196, - 0x0001, 0x0040, 0x559f, 0xa196, 0x0023, 0x00c0, 0x56aa, 0xa08e, - 0x0023, 0x00c0, 0x55d4, 0x1078, 0x591d, 0x0040, 0x56aa, 0x7124, - 0x610a, 0x7030, 0xa08e, 0x0200, 0x00c0, 0x55b8, 0x7034, 0xa005, - 0x00c0, 0x56aa, 0x2009, 0x0015, 0x1078, 0x775c, 0x0078, 0x56aa, - 0xa08e, 0x0214, 0x0040, 0x55c0, 0xa08e, 0x0210, 0x00c0, 0x55c6, - 0x2009, 0x0015, 0x1078, 0x775c, 0x0078, 0x56aa, 0xa08e, 0x0100, - 0x00c0, 0x56aa, 0x7034, 0xa005, 0x00c0, 0x56aa, 0x2009, 0x0016, - 0x1078, 0x775c, 0x0078, 0x56aa, 0xa08e, 0x0022, 0x00c0, 0x56aa, - 0x7030, 0xa08e, 0x0300, 0x00c0, 0x55e5, 0x7034, 0xa005, 0x00c0, - 0x56aa, 0x2009, 0x0017, 0x0078, 0x5676, 0xa08e, 0x0500, 0x00c0, - 0x55f1, 0x7034, 0xa005, 0x00c0, 0x56aa, 0x2009, 0x0018, 0x0078, - 0x5676, 0xa08e, 0x2010, 0x00c0, 0x55f9, 0x2009, 0x0019, 0x0078, - 0x5676, 0xa08e, 0x2110, 0x00c0, 0x5601, 0x2009, 0x001a, 0x0078, - 0x5676, 0xa08e, 0x5200, 0x00c0, 0x560d, 0x7034, 0xa005, 0x00c0, - 0x56aa, 0x2009, 0x001b, 0x0078, 0x5676, 0xa08e, 0x5000, 0x00c0, - 0x5619, 0x7034, 0xa005, 0x00c0, 0x56aa, 0x2009, 0x001c, 0x0078, - 0x5676, 0xa08e, 0x1300, 0x00c0, 0x5621, 0x2009, 0x0034, 0x0078, - 0x5676, 0xa08e, 0x1200, 0x00c0, 0x562d, 0x7034, 0xa005, 0x00c0, - 0x56aa, 0x2009, 0x0024, 0x0078, 0x5676, 0xa08c, 0xff00, 0xa18e, - 0x2400, 0x00c0, 0x5637, 0x2009, 0x002d, 0x0078, 0x5676, 0xa08c, - 0xff00, 0xa18e, 0x5300, 0x00c0, 0x5641, 0x2009, 0x002a, 0x0078, - 0x5676, 0xa08e, 0x0f00, 0x00c0, 0x5649, 0x2009, 0x0020, 0x0078, - 0x5676, 0xa08e, 0x5300, 0x00c0, 0x564f, 0x0078, 0x566c, 0xa08e, - 0x6104, 0x00c0, 0x566c, 0x2011, 0xac8d, 0x8208, 0x2204, 0xa082, - 0x0004, 0x20a8, 0x95ac, 0x95ac, 0x2011, 0x8015, 0x211c, 0x8108, - 0x047e, 0x2124, 0x1078, 0x361b, 0x047f, 0x8108, 0x00f0, 0x565c, - 0x2009, 0x0023, 0x0078, 0x5676, 0xa08e, 0x6000, 0x00c0, 0x5674, - 0x2009, 0x003f, 0x0078, 0x5676, 0x2009, 0x001d, 0x017e, 0x2011, - 0xac83, 0x2204, 0x8211, 0x220c, 0x1078, 0x254d, 0x00c0, 0x56ac, - 0x1078, 0x455c, 0x00c0, 0x56ac, 0x6612, 0x6516, 0x86ff, 0x0040, - 0x569c, 0x017f, 0x017e, 0xa186, 0x0017, 0x00c0, 0x569c, 0x686c, - 0xa606, 0x00c0, 0x569c, 0x6870, 0xa506, 0xa084, 0xff00, 0x00c0, - 0x569c, 0x6000, 0xc0f5, 0x6002, 0x0c7e, 0x1078, 0x76c7, 0x0040, - 0x56af, 0x017f, 0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0x017f, - 0x1078, 0x775c, 0x0c7f, 0x007c, 0x017f, 0x0078, 0x56aa, 0x0c7f, - 0x0078, 0x56ac, 0x0c7e, 0x1078, 0x570f, 0x00c0, 0x570d, 0xa28e, - 0x0033, 0x00c0, 0x56de, 0x1078, 0x591d, 0x0040, 0x570d, 0x7124, - 0x610a, 0x7030, 0xa08e, 0x0200, 0x00c0, 0x56d0, 0x7034, 0xa005, - 0x00c0, 0x570d, 0x2009, 0x0015, 0x1078, 0x775c, 0x0078, 0x570d, - 0xa08e, 0x0100, 0x00c0, 0x570d, 0x7034, 0xa005, 0x00c0, 0x570d, - 0x2009, 0x0016, 0x1078, 0x775c, 0x0078, 0x570d, 0xa28e, 0x0032, - 0x00c0, 0x570d, 0x7030, 0xa08e, 0x1400, 0x00c0, 0x570d, 0x2009, - 0x0038, 0x017e, 0x2011, 0xac83, 0x2204, 0x8211, 0x220c, 0x1078, - 0x254d, 0x00c0, 0x570c, 0x1078, 0x455c, 0x00c0, 0x570c, 0x6612, - 0x6516, 0x0c7e, 0x1078, 0x76c7, 0x0040, 0x570b, 0x017f, 0x611a, - 0x601f, 0x0004, 0x7120, 0x610a, 0x017f, 0x1078, 0x775c, 0x1078, - 0x62d1, 0x0078, 0x570d, 0x0c7f, 0x017f, 0x0c7f, 0x007c, 0x0f7e, - 0x0d7e, 0x027e, 0x017e, 0x137e, 0x147e, 0x157e, 0x3c00, 0x007e, - 0x2079, 0x0030, 0x2069, 0x0200, 0x1078, 0x1c6a, 0x00c0, 0x5750, - 0x1078, 0x1b40, 0x0040, 0x575d, 0x7908, 0xa18c, 0x1fff, 0xa182, - 0x0011, 0x00c8, 0x575a, 0x20a9, 0x000c, 0x20e1, 0x0000, 0x2ea0, - 0x2099, 0x020a, 0x53a5, 0x20e1, 0x2000, 0x2001, 0x020a, 0x2004, - 0x7a0c, 0x7808, 0xa080, 0x0007, 0xa084, 0x1ff8, 0xa08a, 0x0140, - 0x10c8, 0x1332, 0x80ac, 0x20e1, 0x6000, 0x2099, 0x020a, 0x53a5, - 0x20e1, 0x7000, 0x6828, 0x6828, 0x7803, 0x0004, 0xa294, 0x0070, - 0x007f, 0x20e0, 0x157f, 0x147f, 0x137f, 0x017f, 0x027f, 0x0d7f, - 0x0f7f, 0x007c, 0xa016, 0x1078, 0x15fa, 0xa085, 0x0001, 0x0078, - 0x5750, 0x047e, 0x0e7e, 0x0d7e, 0x2028, 0x2130, 0xa696, 0x00ff, - 0x00c0, 0x5782, 0xa596, 0xfffd, 0x00c0, 0x5772, 0x2009, 0x007f, - 0x0078, 0x57b5, 0xa596, 0xfffe, 0x00c0, 0x577a, 0x2009, 0x007e, - 0x0078, 0x57b5, 0xa596, 0xfffc, 0x00c0, 0x5782, 0x2009, 0x0080, - 0x0078, 0x57b5, 0x2011, 0x0000, 0x2021, 0x0081, 0x20a9, 0x007e, - 0x2071, 0xa8b6, 0x2e1c, 0x83ff, 0x00c0, 0x5794, 0x82ff, 0x00c0, - 0x57a9, 0x2410, 0x0078, 0x57a9, 0x2368, 0x6f10, 0x007e, 0x2100, - 0xa706, 0x007f, 0x6b14, 0x00c0, 0x57a3, 0xa346, 0x00c0, 0x57a3, - 0x2408, 0x0078, 0x57b5, 0x87ff, 0x00c0, 0x57a9, 0x83ff, 0x0040, - 0x578e, 0x8420, 0x8e70, 0x00f0, 0x578a, 0x82ff, 0x00c0, 0x57b4, - 0xa085, 0x0001, 0x0078, 0x57b6, 0x2208, 0xa006, 0x0d7f, 0x0e7f, - 0x047f, 0x007c, 0xa084, 0x0007, 0x0079, 0x57bf, 0x007c, 0x57c7, - 0x57c7, 0x57c7, 0x5933, 0x57c7, 0x57c8, 0x57e1, 0x5858, 0x007c, - 0x7110, 0xd1bc, 0x0040, 0x57e0, 0x7120, 0x2160, 0xac8c, 0x000f, - 0x00c0, 0x57e0, 0xac8a, 0xae00, 0x0048, 0x57e0, 0x6858, 0xac02, - 0x00c8, 0x57e0, 0x7124, 0x610a, 0x2009, 0x0046, 0x1078, 0x775c, - 0x007c, 0x0c7e, 0xa484, 0x01ff, 0x0040, 0x5833, 0x7110, 0xd1bc, - 0x00c0, 0x5833, 0x2011, 0xac83, 0x2204, 0x8211, 0x220c, 0x1078, - 0x254d, 0x00c0, 0x5833, 0x1078, 0x455c, 0x00c0, 0x5833, 0x6612, - 0x6516, 0x6000, 0xd0ec, 0x00c0, 0x5833, 0x6204, 0xa294, 0xff00, - 0x8217, 0xa286, 0x0006, 0x00c0, 0x5818, 0x0c7e, 0x1078, 0x76c7, - 0x017f, 0x0040, 0x5835, 0x611a, 0x601f, 0x0006, 0x7120, 0x610a, - 0x7130, 0x6122, 0x2009, 0x0044, 0x1078, 0x775c, 0x0078, 0x5833, - 0x0c7e, 0x1078, 0x76c7, 0x017f, 0x0040, 0x5833, 0x611a, 0x601f, - 0x0004, 0x7120, 0x610a, 0xa286, 0x0004, 0x00c0, 0x582b, 0x6007, - 0x0005, 0x0078, 0x582d, 0x6007, 0x0001, 0x6003, 0x0001, 0x1078, - 0x5dd7, 0x1078, 0x62d1, 0x0c7f, 0x007c, 0x2001, 0xa70d, 0x2004, - 0xd0ec, 0x0040, 0x583f, 0x2011, 0x8049, 0x1078, 0x361b, 0x0c7e, - 0x1078, 0x9197, 0x017f, 0x0040, 0x5833, 0x611a, 0x601f, 0x0006, - 0x7120, 0x610a, 0x7130, 0x6122, 0x6013, 0x0300, 0x6003, 0x0001, - 0x6007, 0x0041, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0078, 0x5833, - 0x7110, 0xd1bc, 0x0040, 0x5870, 0x7020, 0x2060, 0xac84, 0x000f, - 0x00c0, 0x5870, 0xac82, 0xae00, 0x0048, 0x5870, 0x6858, 0xac02, - 0x00c8, 0x5870, 0x7124, 0x610a, 0x2009, 0x0045, 0x1078, 0x775c, - 0x007c, 0x007e, 0x1078, 0x29bb, 0x007f, 0x00c0, 0x5887, 0x7110, - 0xa18c, 0xff00, 0x810f, 0xa18e, 0x0000, 0x00c0, 0x5887, 0xa084, - 0x000f, 0xa08a, 0x0006, 0x00c8, 0x5887, 0x1079, 0x5888, 0x007c, - 0x588e, 0x588f, 0x588e, 0x588e, 0x58ff, 0x590e, 0x007c, 0x7110, - 0xd1bc, 0x0040, 0x5897, 0x702c, 0xd084, 0x0040, 0x58fe, 0x700c, - 0x7108, 0x1078, 0x254d, 0x00c0, 0x58fe, 0x1078, 0x455c, 0x00c0, - 0x58fe, 0x6612, 0x6516, 0x6204, 0x7110, 0xd1bc, 0x0040, 0x58c9, - 0xa28c, 0x00ff, 0xa186, 0x0004, 0x0040, 0x58b2, 0xa186, 0x0006, - 0x00c0, 0x58ef, 0x0c7e, 0x1078, 0x591d, 0x0c7f, 0x0040, 0x58fe, - 0x0c7e, 0x1078, 0x76c7, 0x017f, 0x0040, 0x58fe, 0x611a, 0x601f, - 0x0002, 0x7120, 0x610a, 0x2009, 0x0088, 0x1078, 0x775c, 0x0078, - 0x58fe, 0xa28c, 0x00ff, 0xa186, 0x0006, 0x0040, 0x58de, 0xa186, - 0x0004, 0x0040, 0x58de, 0xa294, 0xff00, 0x8217, 0xa286, 0x0004, - 0x0040, 0x58de, 0xa286, 0x0006, 0x00c0, 0x58ef, 0x0c7e, 0x1078, - 0x76c7, 0x017f, 0x0040, 0x58fe, 0x611a, 0x601f, 0x0005, 0x7120, - 0x610a, 0x2009, 0x0088, 0x1078, 0x775c, 0x0078, 0x58fe, 0x0c7e, - 0x1078, 0x76c7, 0x017f, 0x0040, 0x58fe, 0x611a, 0x601f, 0x0004, - 0x7120, 0x610a, 0x2009, 0x0001, 0x1078, 0x775c, 0x007c, 0x7110, - 0xd1bc, 0x0040, 0x590d, 0x1078, 0x591d, 0x0040, 0x590d, 0x7124, - 0x610a, 0x2009, 0x0089, 0x1078, 0x775c, 0x007c, 0x7110, 0xd1bc, - 0x0040, 0x591c, 0x1078, 0x591d, 0x0040, 0x591c, 0x7124, 0x610a, - 0x2009, 0x008a, 0x1078, 0x775c, 0x007c, 0x7020, 0x2060, 0xac84, - 0x000f, 0x00c0, 0x5930, 0xac82, 0xae00, 0x0048, 0x5930, 0x2001, - 0xa716, 0x2004, 0xac02, 0x00c8, 0x5930, 0xa085, 0x0001, 0x007c, - 0xa006, 0x0078, 0x592f, 0x7110, 0xd1bc, 0x00c0, 0x5949, 0x7024, - 0x2060, 0xac84, 0x000f, 0x00c0, 0x5949, 0xac82, 0xae00, 0x0048, - 0x5949, 0x6858, 0xac02, 0x00c8, 0x5949, 0x2009, 0x0051, 0x1078, - 0x775c, 0x007c, 0x2071, 0xa9c4, 0x7003, 0x0003, 0x700f, 0x0361, - 0xa006, 0x701a, 0x7012, 0x7017, 0xae00, 0x7007, 0x0000, 0x7026, - 0x702b, 0x6e1c, 0x7032, 0x7037, 0x6e70, 0x703b, 0x0002, 0x703f, - 0x0000, 0x7043, 0xffff, 0x7047, 0xffff, 0x007c, 0x2071, 0xa9c4, - 0x00e0, 0x5a32, 0x2091, 0x6000, 0x700c, 0x8001, 0x700e, 0x00c0, - 0x59de, 0x700f, 0x0361, 0x7007, 0x0001, 0x127e, 0x2091, 0x8000, - 0x7138, 0x8109, 0x713a, 0x00c0, 0x59dc, 0x703b, 0x0002, 0x2009, - 0x0100, 0x2104, 0xa082, 0x0003, 0x00c8, 0x59dc, 0x703c, 0xa086, - 0x0001, 0x00c0, 0x59b9, 0x0d7e, 0x2069, 0x0140, 0x6804, 0xa084, - 0x4000, 0x0040, 0x5997, 0x6803, 0x1000, 0x0078, 0x599e, 0x6804, - 0xa084, 0x1000, 0x0040, 0x599e, 0x6803, 0x0100, 0x6803, 0x0000, - 0x703f, 0x0000, 0x2069, 0xa9b1, 0x6804, 0xa082, 0x0006, 0x00c0, - 0x59ab, 0x6807, 0x0000, 0x6830, 0xa082, 0x0003, 0x00c0, 0x59b2, - 0x6833, 0x0000, 0x1078, 0x62d1, 0x1078, 0x639b, 0x0d7f, 0x0078, - 0x59dc, 0x0d7e, 0x2069, 0xa700, 0x6948, 0x6864, 0xa102, 0x00c8, - 0x59db, 0x2069, 0xa9b1, 0x6804, 0xa086, 0x0000, 0x00c0, 0x59db, - 0x6830, 0xa086, 0x0000, 0x00c0, 0x59db, 0x703f, 0x0001, 0x6807, - 0x0006, 0x6833, 0x0003, 0x2069, 0x0100, 0x6830, 0x689e, 0x2069, - 0x0140, 0x6803, 0x0600, 0x0d7f, 0x0078, 0x59e1, 0x127e, 0x2091, - 0x8000, 0x7024, 0xa00d, 0x0040, 0x59f9, 0x7020, 0x8001, 0x7022, - 0x00c0, 0x59f9, 0x7023, 0x0009, 0x8109, 0x7126, 0xa186, 0x03e8, - 0x00c0, 0x59f4, 0x7028, 0x107a, 0x81ff, 0x00c0, 0x59f9, 0x7028, - 0x107a, 0x7030, 0xa00d, 0x0040, 0x5a10, 0x702c, 0x8001, 0x702e, - 0x00c0, 0x5a10, 0x702f, 0x0009, 0x8109, 0x7132, 0x0040, 0x5a0e, - 0xa184, 0x007f, 0x1040, 0x6ea2, 0x0078, 0x5a10, 0x7034, 0x107a, - 0x7040, 0xa005, 0x0040, 0x5a18, 0x0050, 0x5a18, 0x8001, 0x7042, - 0x7044, 0xa005, 0x0040, 0x5a20, 0x0050, 0x5a20, 0x8001, 0x7046, - 0x7018, 0xa00d, 0x0040, 0x5a31, 0x7008, 0x8001, 0x700a, 0x00c0, - 0x5a31, 0x700b, 0x0009, 0x8109, 0x711a, 0x00c0, 0x5a31, 0x701c, - 0x107a, 0x127f, 0x7004, 0x0079, 0x5a35, 0x5a5c, 0x5a5d, 0x5a79, - 0x0e7e, 0x2071, 0xa9c4, 0x7018, 0xa005, 0x00c0, 0x5a43, 0x711a, - 0x721e, 0x700b, 0x0009, 0x0e7f, 0x007c, 0x0e7e, 0x007e, 0x2071, - 0xa9c4, 0x701c, 0xa206, 0x00c0, 0x5a4f, 0x701a, 0x701e, 0x007f, - 0x0e7f, 0x007c, 0x0e7e, 0x2071, 0xa9c4, 0x6088, 0xa102, 0x0048, - 0x5a5a, 0x618a, 0x0e7f, 0x007c, 0x007c, 0x7110, 0x1078, 0x45c4, - 0x00c0, 0x5a6f, 0x6088, 0x8001, 0x0048, 0x5a6f, 0x608a, 0x00c0, - 0x5a6f, 0x127e, 0x2091, 0x8000, 0x1078, 0x62d1, 0x127f, 0x8108, - 0xa182, 0x00ff, 0x0048, 0x5a77, 0xa00e, 0x7007, 0x0002, 0x7112, - 0x007c, 0x7014, 0x2060, 0x127e, 0x2091, 0x8000, 0x603c, 0xa005, - 0x0040, 0x5a88, 0x8001, 0x603e, 0x00c0, 0x5a88, 0x1078, 0x8fac, - 0x6014, 0xa005, 0x0040, 0x5ab2, 0x8001, 0x6016, 0x00c0, 0x5ab2, - 0x611c, 0xa186, 0x0003, 0x0040, 0x5a99, 0xa186, 0x0006, 0x00c0, - 0x5ab0, 0x6010, 0x2068, 0x6854, 0xa08a, 0x199a, 0x0048, 0x5ab0, - 0xa082, 0x1999, 0x6856, 0xa08a, 0x199a, 0x0048, 0x5aa9, 0x2001, - 0x1999, 0x8003, 0x800b, 0x810b, 0xa108, 0x6116, 0x0078, 0x5ab2, - 0x1078, 0x8ace, 0x127f, 0xac88, 0x0010, 0x7116, 0x2001, 0xce00, - 0xa102, 0x0048, 0x5abf, 0x7017, 0xae00, 0x7007, 0x0000, 0x007c, - 0x0e7e, 0x2071, 0xa9c4, 0x7027, 0x07d0, 0x7023, 0x0009, 0x703b, - 0x0002, 0x0e7f, 0x007c, 0x2001, 0xa9cd, 0x2003, 0x0000, 0x007c, - 0x0e7e, 0x2071, 0xa9c4, 0x7132, 0x702f, 0x0009, 0x0e7f, 0x007c, - 0x2011, 0xa9d0, 0x2013, 0x0000, 0x007c, 0x0e7e, 0x2071, 0xa9c4, - 0x711a, 0x721e, 0x700b, 0x0009, 0x0e7f, 0x007c, 0x027e, 0x0e7e, - 0x0f7e, 0x2079, 0xa700, 0x7a34, 0xd294, 0x0040, 0x5b15, 0x2071, - 0xa9ac, 0x2e14, 0xa0fe, 0x0000, 0x0040, 0x5b02, 0xa0fe, 0x0001, - 0x0040, 0x5b06, 0xa0fe, 0x0002, 0x00c0, 0x5b11, 0xa292, 0x0085, - 0x0078, 0x5b08, 0xa292, 0x0005, 0x0078, 0x5b08, 0xa292, 0x0002, - 0x2272, 0x0040, 0x5b0d, 0x00c8, 0x5b15, 0x2011, 0x8037, 0x1078, - 0x361b, 0x2011, 0xa9ab, 0x2204, 0x2072, 0x0f7f, 0x0e7f, 0x027f, - 0x007c, 0x0c7e, 0x2061, 0xaa33, 0x0c7f, 0x007c, 0xa184, 0x000f, - 0x8003, 0x8003, 0x8003, 0xa080, 0xaa33, 0x2060, 0x007c, 0x6854, - 0xa08a, 0x199a, 0x0048, 0x5b2e, 0x2001, 0x1999, 0xa005, 0x00c0, - 0x5b3d, 0x0c7e, 0x2061, 0xaa33, 0x6014, 0x0c7f, 0xa005, 0x00c0, - 0x5b42, 0x2001, 0x001e, 0x0078, 0x5b42, 0xa08e, 0xffff, 0x00c0, - 0x5b42, 0xa006, 0x8003, 0x800b, 0x810b, 0xa108, 0x6116, 0x684c, - 0xa08c, 0x00c0, 0xa18e, 0x00c0, 0x0040, 0x5b9e, 0xd0b4, 0x00c0, - 0x5b59, 0xd0bc, 0x00c0, 0x5b8b, 0x2009, 0x0006, 0x1078, 0x5bc3, - 0x007c, 0xd0fc, 0x0040, 0x5b64, 0xa084, 0x0003, 0x0040, 0x5b64, - 0xa086, 0x0003, 0x00c0, 0x5bbc, 0x6024, 0xd0d4, 0x0040, 0x5b6e, - 0xc0d4, 0x6026, 0x6860, 0x602a, 0x685c, 0x602e, 0x2009, 0xa774, - 0x2104, 0xd084, 0x0040, 0x5b83, 0x6118, 0xa188, 0x0027, 0x2104, - 0xd08c, 0x00c0, 0x5b83, 0x87ff, 0x00c0, 0x5b82, 0x2009, 0x0042, - 0x1078, 0x775c, 0x007c, 0x87ff, 0x00c0, 0x5b8a, 0x2009, 0x0043, - 0x1078, 0x775c, 0x007c, 0xd0fc, 0x0040, 0x5b96, 0xa084, 0x0003, - 0x0040, 0x5b96, 0xa086, 0x0003, 0x00c0, 0x5bbc, 0x87ff, 0x00c0, - 0x5b9d, 0x2009, 0x0042, 0x1078, 0x775c, 0x007c, 0xd0fc, 0x0040, - 0x5baf, 0xa084, 0x0003, 0xa08e, 0x0002, 0x0040, 0x5bb3, 0x87ff, - 0x00c0, 0x5bae, 0x2009, 0x0041, 0x1078, 0x775c, 0x007c, 0x1078, - 0x5bc1, 0x0078, 0x5bae, 0x87ff, 0x00c0, 0x5bae, 0x2009, 0x0043, - 0x1078, 0x775c, 0x0078, 0x5bae, 0x2009, 0x0004, 0x1078, 0x5bc3, - 0x007c, 0x2009, 0x0001, 0x0d7e, 0x6010, 0xa0ec, 0xf000, 0x0040, - 0x5bef, 0x2068, 0x6952, 0x6800, 0x6012, 0xa186, 0x0001, 0x00c0, - 0x5be5, 0x694c, 0xa18c, 0x8100, 0xa18e, 0x8100, 0x00c0, 0x5be5, - 0x0c7e, 0x2061, 0xaa33, 0x6200, 0xd28c, 0x00c0, 0x5be4, 0x6204, - 0x8210, 0x0048, 0x5be4, 0x6206, 0x0c7f, 0x1078, 0x4a73, 0x6010, - 0xa06d, 0x077e, 0x2039, 0x0000, 0x10c0, 0x5b27, 0x077f, 0x0d7f, - 0x007c, 0x157e, 0x0c7e, 0x2061, 0xaa33, 0x6000, 0x81ff, 0x0040, - 0x5bfc, 0xa205, 0x0078, 0x5bfd, 0xa204, 0x6002, 0x0c7f, 0x157f, - 0x007c, 0x6800, 0xd08c, 0x00c0, 0x5c0d, 0x6808, 0xa005, 0x0040, - 0x5c0d, 0x8001, 0x680a, 0xa085, 0x0001, 0x007c, 0x20a9, 0x0010, - 0xa006, 0x8004, 0x8086, 0x818e, 0x00c8, 0x5c17, 0xa200, 0x00f0, - 0x5c12, 0x8086, 0x818e, 0x007c, 0x157e, 0x20a9, 0x0010, 0xa005, - 0x0040, 0x5c3d, 0xa11a, 0x00c8, 0x5c3d, 0x8213, 0x818d, 0x0048, - 0x5c30, 0xa11a, 0x00c8, 0x5c31, 0x00f0, 0x5c25, 0x0078, 0x5c35, - 0xa11a, 0x2308, 0x8210, 0x00f0, 0x5c25, 0x007e, 0x3200, 0xa084, - 0xf7ff, 0x2080, 0x007f, 0x157f, 0x007c, 0x007e, 0x3200, 0xa085, - 0x0800, 0x0078, 0x5c39, 0x127e, 0x2091, 0x2200, 0x2079, 0xa9b1, - 0x127f, 0x0d7e, 0x2069, 0xa9b1, 0x6803, 0x0005, 0x2069, 0x0004, - 0x2d04, 0xa085, 0x8001, 0x206a, 0x0d7f, 0x007c, 0x0c7e, 0x6027, - 0x0001, 0x7804, 0xa084, 0x0007, 0x0079, 0x5c5e, 0x5c68, 0x5c8d, - 0x5ce8, 0x5c6e, 0x5c8d, 0x5c68, 0x5c66, 0x5c66, 0x1078, 0x1332, - 0x1078, 0x5acb, 0x1078, 0x62d1, 0x0c7f, 0x007c, 0x62c0, 0x82ff, - 0x00c0, 0x5c74, 0x0c7f, 0x007c, 0x2011, 0x41dc, 0x1078, 0x5a45, - 0x7828, 0xa092, 0x00c8, 0x00c8, 0x5c83, 0x8000, 0x782a, 0x1078, - 0x421b, 0x0078, 0x5c72, 0x1078, 0x41dc, 0x7807, 0x0003, 0x7827, - 0x0000, 0x782b, 0x0000, 0x0078, 0x5c72, 0x1078, 0x5acb, 0x3c00, - 0x007e, 0x2011, 0x0209, 0x20e1, 0x4000, 0x2214, 0x007f, 0x20e0, - 0x82ff, 0x0040, 0x5cab, 0x62c0, 0x82ff, 0x00c0, 0x5cab, 0x782b, - 0x0000, 0x7824, 0xa065, 0x1040, 0x1332, 0x2009, 0x0013, 0x1078, - 0x775c, 0x0c7f, 0x007c, 0x3900, 0xa082, 0xaae3, 0x00c8, 0x5cb2, - 0x1078, 0x747a, 0x0c7e, 0x7824, 0xa065, 0x1040, 0x1332, 0x7804, - 0xa086, 0x0004, 0x0040, 0x5d2d, 0x7828, 0xa092, 0x2710, 0x00c8, - 0x5cc8, 0x8000, 0x782a, 0x0c7f, 0x1078, 0x6e01, 0x0078, 0x5ca9, - 0x6104, 0xa186, 0x0003, 0x00c0, 0x5cdf, 0x0e7e, 0x2071, 0xa700, - 0x70d8, 0x0e7f, 0xd08c, 0x0040, 0x5cdf, 0x0c7e, 0x0e7e, 0x2061, - 0x0100, 0x2071, 0xa700, 0x1078, 0x4224, 0x0e7f, 0x0c7f, 0x1078, - 0xa5d4, 0x2009, 0x0014, 0x1078, 0x775c, 0x0c7f, 0x0078, 0x5ca9, - 0x2001, 0xa9cd, 0x2003, 0x0000, 0x62c0, 0x82ff, 0x00c0, 0x5cfc, - 0x782b, 0x0000, 0x7824, 0xa065, 0x1040, 0x1332, 0x2009, 0x0013, - 0x1078, 0x77b3, 0x0c7f, 0x007c, 0x0c7e, 0x0d7e, 0x3900, 0xa082, - 0xaae3, 0x00c8, 0x5d05, 0x1078, 0x747a, 0x7824, 0xa005, 0x1040, - 0x1332, 0x781c, 0xa06d, 0x1040, 0x1332, 0x6800, 0xc0dc, 0x6802, - 0x7924, 0x2160, 0x1078, 0x772d, 0x693c, 0x81ff, 0x1040, 0x1332, - 0x8109, 0x693e, 0x6854, 0xa015, 0x0040, 0x5d21, 0x7a1e, 0x0078, - 0x5d23, 0x7918, 0x791e, 0x7807, 0x0000, 0x7827, 0x0000, 0x0d7f, - 0x0c7f, 0x1078, 0x62d1, 0x0078, 0x5cfa, 0x6104, 0xa186, 0x0002, - 0x0040, 0x5d38, 0xa186, 0x0004, 0x0040, 0x5d38, 0x0078, 0x5cbc, - 0x7808, 0xac06, 0x0040, 0x5cbc, 0x1078, 0x61cd, 0x1078, 0x5dd7, - 0x0c7f, 0x1078, 0x62d1, 0x0078, 0x5ca9, 0x0c7e, 0x6027, 0x0002, - 0x62c8, 0x82ff, 0x00c0, 0x5d61, 0x62c4, 0x82ff, 0x00c0, 0x5d61, - 0x793c, 0xa1e5, 0x0000, 0x0040, 0x5d5b, 0x2009, 0x0049, 0x1078, - 0x775c, 0x0c7f, 0x007c, 0x2011, 0xa9d0, 0x2013, 0x0000, 0x0078, - 0x5d59, 0x3908, 0xa192, 0xaae3, 0x00c8, 0x5d68, 0x1078, 0x747a, - 0x6017, 0x0010, 0x793c, 0x81ff, 0x0040, 0x5d5b, 0x7944, 0xa192, - 0x7530, 0x00c8, 0x5d85, 0x8108, 0x7946, 0x793c, 0xa188, 0x0007, - 0x210c, 0xa18e, 0x0006, 0x00c0, 0x5d81, 0x6017, 0x0012, 0x0078, - 0x5d59, 0x6017, 0x0016, 0x0078, 0x5d59, 0x7848, 0xc085, 0x784a, - 0x0078, 0x5d59, 0x007e, 0x017e, 0x0c7e, 0x127e, 0x2091, 0x8000, - 0x600f, 0x0000, 0x2c08, 0x2061, 0xa9b1, 0x6020, 0x8000, 0x6022, - 0x6010, 0xa005, 0x0040, 0x5da5, 0xa080, 0x0003, 0x2102, 0x6112, - 0x127f, 0x0c7f, 0x017f, 0x007f, 0x007c, 0x6116, 0x6112, 0x0078, - 0x5da0, 0x0d7e, 0x2069, 0xa9b1, 0x6000, 0xd0d4, 0x0040, 0x5dbe, - 0x6820, 0x8000, 0x6822, 0xa086, 0x0001, 0x00c0, 0x5db9, 0x2c00, - 0x681e, 0x6804, 0xa084, 0x0007, 0x0079, 0x62d9, 0xc0d5, 0x6002, - 0x6818, 0xa005, 0x0040, 0x5dd0, 0x6056, 0x605b, 0x0000, 0x007e, - 0x2c00, 0x681a, 0x0d7f, 0x685a, 0x2069, 0xa9b1, 0x0078, 0x5db0, - 0x6056, 0x605a, 0x2c00, 0x681a, 0x681e, 0x0078, 0x5db0, 0x007e, - 0x017e, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, - 0x2061, 0xa9b1, 0x6020, 0x8000, 0x6022, 0x6008, 0xa005, 0x0040, - 0x5df2, 0xa080, 0x0003, 0x2102, 0x610a, 0x127f, 0x0c7f, 0x017f, - 0x007f, 0x007c, 0x610e, 0x610a, 0x0078, 0x5ded, 0x0c7e, 0x600f, - 0x0000, 0x2c08, 0x2061, 0xa9b1, 0x6034, 0xa005, 0x0040, 0x5e06, - 0xa080, 0x0003, 0x2102, 0x6136, 0x0c7f, 0x007c, 0x613a, 0x6136, - 0x0078, 0x5e04, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x057e, - 0x037e, 0x027e, 0x017e, 0x007e, 0x127e, 0xa02e, 0x2071, 0xa9b1, - 0x7638, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, 0x0040, 0x5e8c, - 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x00c0, 0x5e87, 0x87ff, - 0x0040, 0x5e2e, 0x6020, 0xa106, 0x00c0, 0x5e87, 0x703c, 0xac06, - 0x00c0, 0x5e44, 0x037e, 0x2019, 0x0001, 0x1078, 0x7058, 0x7033, - 0x0000, 0x703f, 0x0000, 0x7043, 0x0000, 0x7047, 0x0000, 0x704b, - 0x0000, 0x037f, 0x2029, 0x0001, 0x7038, 0xac36, 0x00c0, 0x5e4a, - 0x660c, 0x763a, 0x7034, 0xac36, 0x00c0, 0x5e58, 0x2c00, 0xaf36, - 0x0040, 0x5e56, 0x2f00, 0x7036, 0x0078, 0x5e58, 0x7037, 0x0000, - 0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040, 0x5e61, 0x7e0e, 0x0078, - 0x5e62, 0x2678, 0x600f, 0x0000, 0x1078, 0x8d16, 0x0040, 0x5e82, - 0x6010, 0x2068, 0x601c, 0xa086, 0x0003, 0x00c0, 0x5e9d, 0x6837, - 0x0103, 0x6b4a, 0x6847, 0x0000, 0x017e, 0x037e, 0x077e, 0x1078, - 0x8f8d, 0x1078, 0xa4f2, 0x1078, 0x4a73, 0x077f, 0x037f, 0x017f, - 0x1078, 0x8ec9, 0x1078, 0x8ed6, 0x0c7f, 0x0078, 0x5e1d, 0x2c78, - 0x600c, 0x2060, 0x0078, 0x5e1d, 0x85ff, 0x0040, 0x5e91, 0x1078, - 0x639b, 0x127f, 0x007f, 0x017f, 0x027f, 0x037f, 0x057f, 0x067f, - 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x601c, 0xa086, 0x0006, - 0x00c0, 0x5e6f, 0x017e, 0x037e, 0x077e, 0x1078, 0xa4f2, 0x1078, - 0xa1da, 0x077f, 0x037f, 0x017f, 0x0078, 0x5e82, 0x007e, 0x067e, - 0x0c7e, 0x0d7e, 0x0f7e, 0x2031, 0x0000, 0x127e, 0x2091, 0x8000, - 0x2079, 0xa9b1, 0x7838, 0xa065, 0x0040, 0x5eef, 0x600c, 0x007e, - 0x600f, 0x0000, 0x783c, 0xac06, 0x00c0, 0x5ed6, 0x037e, 0x2019, - 0x0001, 0x1078, 0x7058, 0x7833, 0x0000, 0x783f, 0x0000, 0x7843, - 0x0000, 0x7847, 0x0000, 0x784b, 0x0000, 0x037f, 0x1078, 0x8d16, - 0x0040, 0x5eea, 0x6010, 0x2068, 0x601c, 0xa086, 0x0003, 0x00c0, - 0x5ef8, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x4a73, - 0x1078, 0x8ec9, 0x1078, 0x8ed6, 0x007f, 0x0078, 0x5ebb, 0x7e3a, - 0x7e36, 0x127f, 0x0f7f, 0x0d7f, 0x0c7f, 0x067f, 0x007f, 0x007c, - 0x601c, 0xa086, 0x0006, 0x00c0, 0x5ee1, 0x1078, 0xa1da, 0x0078, - 0x5eea, 0x017e, 0x027e, 0x087e, 0x2041, 0x0000, 0x1078, 0x5f1b, - 0x1078, 0x5fdb, 0x087f, 0x027f, 0x017f, 0x007c, 0x0f7e, 0x127e, - 0x2079, 0xa9b1, 0x2091, 0x8000, 0x1078, 0x6076, 0x1078, 0x60ec, - 0x127f, 0x0f7f, 0x007c, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, - 0x017e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071, 0xa9b1, 0x7614, - 0x2660, 0x2678, 0x8cff, 0x0040, 0x5fb5, 0x6018, 0xa080, 0x0028, - 0x2004, 0xa206, 0x00c0, 0x5fb0, 0x88ff, 0x0040, 0x5f3b, 0x6020, - 0xa106, 0x00c0, 0x5fb0, 0x7024, 0xac06, 0x00c0, 0x5f6b, 0x2069, - 0x0100, 0x68c0, 0xa005, 0x0040, 0x5f66, 0x1078, 0x5acb, 0x1078, - 0x6e0f, 0x68c3, 0x0000, 0x1078, 0x7378, 0x7027, 0x0000, 0x037e, - 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x5f5b, 0x6803, - 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0040, - 0x5f63, 0x6827, 0x0001, 0x037f, 0x0078, 0x5f6b, 0x6003, 0x0009, - 0x630a, 0x0078, 0x5fb0, 0x7014, 0xac36, 0x00c0, 0x5f71, 0x660c, - 0x7616, 0x7010, 0xac36, 0x00c0, 0x5f7f, 0x2c00, 0xaf36, 0x0040, - 0x5f7d, 0x2f00, 0x7012, 0x0078, 0x5f7f, 0x7013, 0x0000, 0x660c, - 0x067e, 0x2c00, 0xaf06, 0x0040, 0x5f88, 0x7e0e, 0x0078, 0x5f89, - 0x2678, 0x600f, 0x0000, 0x6010, 0x2068, 0x1078, 0x8d16, 0x0040, - 0x5fa9, 0x601c, 0xa086, 0x0003, 0x00c0, 0x5fbe, 0x6837, 0x0103, - 0x6b4a, 0x6847, 0x0000, 0x017e, 0x037e, 0x087e, 0x1078, 0x8f8d, - 0x1078, 0xa4f2, 0x1078, 0x4a73, 0x087f, 0x037f, 0x017f, 0x1078, - 0x8ec9, 0x1078, 0x8ed6, 0x1078, 0x7233, 0x0c7f, 0x0078, 0x5f2a, - 0x2c78, 0x600c, 0x2060, 0x0078, 0x5f2a, 0x127f, 0x007f, 0x017f, - 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x601c, 0xa086, - 0x0006, 0x00c0, 0x5fcf, 0x017e, 0x037e, 0x087e, 0x1078, 0xa4f2, - 0x1078, 0xa1da, 0x087f, 0x037f, 0x017f, 0x0078, 0x5fa9, 0x601c, - 0xa086, 0x0002, 0x00c0, 0x5fa9, 0x6004, 0xa086, 0x0085, 0x0040, - 0x5f96, 0x0078, 0x5fa9, 0x0c7e, 0x007e, 0x127e, 0x2091, 0x8000, - 0xa280, 0xa835, 0x2004, 0xa065, 0x0040, 0x6072, 0x0f7e, 0x0e7e, - 0x0d7e, 0x067e, 0x2071, 0xa9b1, 0x6654, 0x7018, 0xac06, 0x00c0, - 0x5ff2, 0x761a, 0x701c, 0xac06, 0x00c0, 0x5ffe, 0x86ff, 0x00c0, - 0x5ffd, 0x7018, 0x701e, 0x0078, 0x5ffe, 0x761e, 0x6058, 0xa07d, - 0x0040, 0x6003, 0x7e56, 0xa6ed, 0x0000, 0x0040, 0x6009, 0x2f00, - 0x685a, 0x6057, 0x0000, 0x605b, 0x0000, 0x6000, 0xc0d4, 0xc0dc, - 0x6002, 0x1078, 0x44d3, 0x0040, 0x606e, 0x7624, 0x86ff, 0x0040, - 0x605c, 0xa680, 0x0004, 0x2004, 0xad06, 0x00c0, 0x605c, 0x0d7e, - 0x2069, 0x0100, 0x68c0, 0xa005, 0x0040, 0x6053, 0x1078, 0x5acb, - 0x1078, 0x6e0f, 0x68c3, 0x0000, 0x1078, 0x7378, 0x7027, 0x0000, - 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x603c, - 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, - 0x0040, 0x6044, 0x6827, 0x0001, 0x037f, 0x0d7f, 0x0c7e, 0x603c, - 0xa005, 0x0040, 0x604d, 0x8001, 0x603e, 0x2660, 0x1078, 0x8ed6, - 0x0c7f, 0x0078, 0x605c, 0x0d7f, 0x0c7e, 0x2660, 0x6003, 0x0009, - 0x630a, 0x0c7f, 0x0078, 0x6011, 0x8dff, 0x0040, 0x606a, 0x6837, - 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x8f8d, 0x1078, 0xa4f2, - 0x1078, 0x4a73, 0x1078, 0x7233, 0x0078, 0x6011, 0x067f, 0x0d7f, - 0x0e7f, 0x0f7f, 0x127f, 0x007f, 0x0c7f, 0x007c, 0x007e, 0x067e, - 0x0c7e, 0x0d7e, 0x2031, 0x0000, 0x7814, 0xa065, 0x0040, 0x60d0, - 0x600c, 0x007e, 0x600f, 0x0000, 0x7824, 0xac06, 0x00c0, 0x60b5, - 0x2069, 0x0100, 0x68c0, 0xa005, 0x0040, 0x60af, 0x1078, 0x5acb, - 0x1078, 0x6e0f, 0x68c3, 0x0000, 0x1078, 0x7378, 0x7827, 0x0000, - 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x60a4, - 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, - 0x0040, 0x60ac, 0x6827, 0x0001, 0x037f, 0x0078, 0x60b5, 0x6003, - 0x0009, 0x630a, 0x2c30, 0x0078, 0x60cd, 0x6010, 0x2068, 0x1078, - 0x8d16, 0x0040, 0x60c9, 0x601c, 0xa086, 0x0003, 0x00c0, 0x60d7, - 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x4a73, 0x1078, - 0x8ec9, 0x1078, 0x8ed6, 0x1078, 0x7233, 0x007f, 0x0078, 0x607d, - 0x7e16, 0x7e12, 0x0d7f, 0x0c7f, 0x067f, 0x007f, 0x007c, 0x601c, - 0xa086, 0x0006, 0x00c0, 0x60e0, 0x1078, 0xa1da, 0x0078, 0x60c9, - 0x601c, 0xa086, 0x0002, 0x00c0, 0x60c9, 0x6004, 0xa086, 0x0085, - 0x0040, 0x60c0, 0x0078, 0x60c9, 0x007e, 0x067e, 0x0c7e, 0x0d7e, - 0x7818, 0xa065, 0x0040, 0x615a, 0x6054, 0x007e, 0x6057, 0x0000, - 0x605b, 0x0000, 0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x1078, 0x44d3, - 0x0040, 0x6157, 0x7e24, 0x86ff, 0x0040, 0x6149, 0xa680, 0x0004, - 0x2004, 0xad06, 0x00c0, 0x6149, 0x0d7e, 0x2069, 0x0100, 0x68c0, - 0xa005, 0x0040, 0x6140, 0x1078, 0x5acb, 0x1078, 0x6e0f, 0x68c3, - 0x0000, 0x1078, 0x7378, 0x7827, 0x0000, 0x037e, 0x2069, 0x0140, - 0x6b04, 0xa384, 0x1000, 0x0040, 0x6129, 0x6803, 0x0100, 0x6803, - 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x6131, 0x6827, - 0x0001, 0x037f, 0x0d7f, 0x0c7e, 0x603c, 0xa005, 0x0040, 0x613a, - 0x8001, 0x603e, 0x2660, 0x1078, 0x8ed6, 0x0c7f, 0x0078, 0x6149, - 0x0d7f, 0x0c7e, 0x2660, 0x6003, 0x0009, 0x630a, 0x0c7f, 0x0078, - 0x60fe, 0x8dff, 0x0040, 0x6153, 0x6837, 0x0103, 0x6b4a, 0x6847, - 0x0000, 0x1078, 0x4a73, 0x1078, 0x7233, 0x0078, 0x60fe, 0x007f, - 0x0078, 0x60f1, 0x781e, 0x781a, 0x0d7f, 0x0c7f, 0x067f, 0x007f, - 0x007c, 0x0e7e, 0x0d7e, 0x067e, 0x6000, 0xd0dc, 0x0040, 0x6181, - 0x604c, 0xa06d, 0x0040, 0x6181, 0x6848, 0xa606, 0x00c0, 0x6181, - 0x2071, 0xa9b1, 0x7024, 0xa035, 0x0040, 0x6181, 0xa080, 0x0004, - 0x2004, 0xad06, 0x00c0, 0x6181, 0x6000, 0xc0dc, 0x6002, 0x1078, - 0x6185, 0x067f, 0x0d7f, 0x0e7f, 0x007c, 0x0f7e, 0x2079, 0x0100, - 0x78c0, 0xa005, 0x00c0, 0x6194, 0x0c7e, 0x2660, 0x6003, 0x0009, - 0x630a, 0x0c7f, 0x0078, 0x61cb, 0x1078, 0x6e0f, 0x78c3, 0x0000, - 0x1078, 0x7378, 0x7027, 0x0000, 0x037e, 0x2079, 0x0140, 0x7b04, - 0xa384, 0x1000, 0x0040, 0x61a8, 0x7803, 0x0100, 0x7803, 0x0000, - 0x2079, 0x0100, 0x7824, 0xd084, 0x0040, 0x61b0, 0x7827, 0x0001, - 0x1078, 0x7378, 0x037f, 0x1078, 0x44d3, 0x0c7e, 0x603c, 0xa005, - 0x0040, 0x61bc, 0x8001, 0x603e, 0x2660, 0x1078, 0x772d, 0x0c7f, - 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x8f8d, 0x1078, - 0x4a73, 0x1078, 0x7233, 0x0f7f, 0x007c, 0x0e7e, 0x0c7e, 0x2071, - 0xa9b1, 0x7004, 0xa084, 0x0007, 0x0079, 0x61d6, 0x61e0, 0x61e3, - 0x61fc, 0x6218, 0x6262, 0x61e0, 0x61e0, 0x61de, 0x1078, 0x1332, - 0x0c7f, 0x0e7f, 0x007c, 0x7024, 0xa065, 0x0040, 0x61f1, 0x7020, - 0x8001, 0x7022, 0x600c, 0xa015, 0x0040, 0x61f8, 0x7216, 0x600f, - 0x0000, 0x7007, 0x0000, 0x7027, 0x0000, 0x0c7f, 0x0e7f, 0x007c, - 0x7216, 0x7212, 0x0078, 0x61f1, 0x6018, 0x2060, 0x1078, 0x44d3, - 0x6000, 0xc0dc, 0x6002, 0x7020, 0x8001, 0x7022, 0x0040, 0x620d, - 0x6054, 0xa015, 0x0040, 0x6214, 0x721e, 0x7007, 0x0000, 0x7027, - 0x0000, 0x0c7f, 0x0e7f, 0x007c, 0x7218, 0x721e, 0x0078, 0x620d, - 0x7024, 0xa065, 0x0040, 0x625f, 0x700c, 0xac06, 0x00c0, 0x622f, - 0x1078, 0x7233, 0x600c, 0xa015, 0x0040, 0x622b, 0x720e, 0x600f, - 0x0000, 0x0078, 0x625d, 0x720e, 0x720a, 0x0078, 0x625d, 0x7014, - 0xac06, 0x00c0, 0x6242, 0x1078, 0x7233, 0x600c, 0xa015, 0x0040, - 0x623e, 0x7216, 0x600f, 0x0000, 0x0078, 0x625d, 0x7216, 0x7212, - 0x0078, 0x625d, 0x601c, 0xa086, 0x0003, 0x00c0, 0x625d, 0x6018, - 0x2060, 0x1078, 0x44d3, 0x6000, 0xc0dc, 0x6002, 0x1078, 0x7233, - 0x701c, 0xa065, 0x0040, 0x625d, 0x6054, 0xa015, 0x0040, 0x625b, - 0x721e, 0x0078, 0x625d, 0x7218, 0x721e, 0x7027, 0x0000, 0x0c7f, - 0x0e7f, 0x007c, 0x7024, 0xa065, 0x0040, 0x626f, 0x1078, 0x7233, - 0x600c, 0xa015, 0x0040, 0x6276, 0x720e, 0x600f, 0x0000, 0x1078, - 0x7378, 0x7027, 0x0000, 0x0c7f, 0x0e7f, 0x007c, 0x720e, 0x720a, - 0x0078, 0x626f, 0x0d7e, 0x2069, 0xa9b1, 0x6830, 0xa084, 0x0003, - 0x0079, 0x6282, 0x6288, 0x628a, 0x62b4, 0x6288, 0x1078, 0x1332, - 0x0d7f, 0x007c, 0x0c7e, 0x6840, 0xa086, 0x0001, 0x0040, 0x62aa, - 0x683c, 0xa065, 0x0040, 0x629b, 0x600c, 0xa015, 0x0040, 0x62a6, - 0x6a3a, 0x600f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x2011, - 0xa9d0, 0x2013, 0x0000, 0x0c7f, 0x0d7f, 0x007c, 0x683a, 0x6836, - 0x0078, 0x629b, 0x6843, 0x0000, 0x6838, 0xa065, 0x0040, 0x629b, - 0x6003, 0x0003, 0x0078, 0x629b, 0x0c7e, 0x6843, 0x0000, 0x6847, - 0x0000, 0x684b, 0x0000, 0x683c, 0xa065, 0x0040, 0x62ce, 0x600c, - 0xa015, 0x0040, 0x62ca, 0x6a3a, 0x600f, 0x0000, 0x683f, 0x0000, - 0x0078, 0x62ce, 0x683f, 0x0000, 0x683a, 0x6836, 0x0c7f, 0x0d7f, - 0x007c, 0x0d7e, 0x2069, 0xa9b1, 0x6804, 0xa084, 0x0007, 0x0079, - 0x62d9, 0x62e3, 0x638a, 0x638a, 0x638a, 0x638a, 0x638c, 0x638a, - 0x62e1, 0x1078, 0x1332, 0x6820, 0xa005, 0x00c0, 0x62e9, 0x0d7f, - 0x007c, 0x0c7e, 0x680c, 0xa065, 0x0040, 0x62f8, 0x6807, 0x0004, - 0x6826, 0x682b, 0x0000, 0x1078, 0x63d4, 0x0c7f, 0x0d7f, 0x007c, - 0x6814, 0xa065, 0x0040, 0x6306, 0x6807, 0x0001, 0x6826, 0x682b, - 0x0000, 0x1078, 0x63d4, 0x0c7f, 0x0d7f, 0x007c, 0x0e7e, 0x037e, - 0x6a1c, 0xa2f5, 0x0000, 0x0040, 0x6385, 0x704c, 0xa00d, 0x0040, - 0x6315, 0x7088, 0xa005, 0x0040, 0x632d, 0x7054, 0xa075, 0x0040, - 0x631e, 0xa20e, 0x0040, 0x6385, 0x0078, 0x6323, 0x6818, 0xa20e, - 0x0040, 0x6385, 0x2070, 0x704c, 0xa00d, 0x0040, 0x6315, 0x7088, - 0xa005, 0x00c0, 0x6315, 0x2e00, 0x681e, 0x733c, 0x7038, 0xa302, - 0x00c8, 0x6315, 0x1078, 0x76fc, 0x0040, 0x6385, 0x8318, 0x733e, - 0x6112, 0x2e10, 0x621a, 0xa180, 0x0014, 0x2004, 0xa084, 0x00ff, - 0x6032, 0xa180, 0x0014, 0x2003, 0x0000, 0xa180, 0x0015, 0x2004, - 0xa08a, 0x199a, 0x0048, 0x634e, 0x2001, 0x1999, 0x8003, 0x801b, - 0x831b, 0xa318, 0x6316, 0x037f, 0x0f7e, 0x2c78, 0x71a0, 0xd1bc, - 0x0040, 0x6367, 0x7100, 0xd1f4, 0x0040, 0x6363, 0x7114, 0xa18c, - 0x00ff, 0x0078, 0x636c, 0x2009, 0x0000, 0x0078, 0x636c, 0xa1e0, - 0x29c0, 0x2c0c, 0xa18c, 0x00ff, 0x2061, 0x0100, 0x619a, 0x1078, - 0x6965, 0x7300, 0xc3dd, 0x7302, 0x6807, 0x0002, 0x2f18, 0x6b26, - 0x682b, 0x0000, 0x781f, 0x0003, 0x7803, 0x0001, 0x7807, 0x0040, - 0x0f7f, 0x0e7f, 0x0c7f, 0x0d7f, 0x007c, 0x037f, 0x0e7f, 0x0c7f, - 0x0078, 0x6383, 0x0d7f, 0x007c, 0x0c7e, 0x680c, 0xa065, 0x0040, - 0x6398, 0x6807, 0x0004, 0x6826, 0x682b, 0x0000, 0x1078, 0x63d4, - 0x0c7f, 0x0d7f, 0x007c, 0x0f7e, 0x0d7e, 0x2069, 0xa9b1, 0x6830, - 0xa086, 0x0000, 0x00c0, 0x63bb, 0x6838, 0xa07d, 0x0040, 0x63bb, - 0x6833, 0x0001, 0x683e, 0x6847, 0x0000, 0x684b, 0x0000, 0x127e, - 0x0f7e, 0x2091, 0x2200, 0x027f, 0x1078, 0x1d6d, 0x00c0, 0x63be, - 0x127f, 0x1078, 0x6cb3, 0x0d7f, 0x0f7f, 0x007c, 0x127f, 0x6843, - 0x0000, 0x7803, 0x0002, 0x780c, 0xa015, 0x0040, 0x63d0, 0x6a3a, - 0x780f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x0078, 0x63bb, - 0x683a, 0x6836, 0x0078, 0x63ca, 0x601c, 0xa084, 0x000f, 0x1079, - 0x63da, 0x007c, 0x63e3, 0x63e8, 0x6809, 0x6922, 0x63e8, 0x6809, - 0x6922, 0x63e3, 0x63e8, 0x1078, 0x61cd, 0x1078, 0x62d1, 0x007c, - 0x157e, 0x137e, 0x147e, 0x0c7e, 0x0f7e, 0x6004, 0xa08a, 0x0044, - 0x10c8, 0x1332, 0x6118, 0x2178, 0x79a0, 0xd1bc, 0x0040, 0x6405, - 0x7900, 0xd1f4, 0x0040, 0x6401, 0x7914, 0xa18c, 0x00ff, 0x0078, - 0x640a, 0x2009, 0x0000, 0x0078, 0x640a, 0xa1f8, 0x29c0, 0x2f0c, - 0xa18c, 0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, 0xa08a, 0x0040, - 0x00c8, 0x645c, 0x1079, 0x641a, 0x0f7f, 0x0c7f, 0x147f, 0x137f, - 0x157f, 0x007c, 0x64c2, 0x650a, 0x6532, 0x65cd, 0x65fd, 0x6605, - 0x662c, 0x663d, 0x664e, 0x6656, 0x666e, 0x6656, 0x66d9, 0x663d, - 0x66fa, 0x6702, 0x664e, 0x6702, 0x6713, 0x645a, 0x645a, 0x645a, - 0x645a, 0x645a, 0x645a, 0x645a, 0x645a, 0x645a, 0x645a, 0x645a, - 0x6eef, 0x6f14, 0x6f29, 0x6f4c, 0x6f6d, 0x662c, 0x645a, 0x662c, - 0x6656, 0x645a, 0x6532, 0x65cd, 0x645a, 0x749c, 0x6656, 0x645a, - 0x74bc, 0x6656, 0x645a, 0x645a, 0x64bd, 0x646b, 0x645a, 0x74e1, - 0x7558, 0x7640, 0x645a, 0x7651, 0x6626, 0x766d, 0x645a, 0x6f82, - 0x645a, 0x645a, 0x1078, 0x1332, 0x2100, 0x1079, 0x6465, 0x0f7f, - 0x0c7f, 0x147f, 0x137f, 0x157f, 0x007c, 0x6469, 0x6469, 0x6469, - 0x649f, 0x1078, 0x1332, 0x0d7e, 0x20a1, 0x020b, 0x1078, 0x6731, - 0x7810, 0x2068, 0x20a3, 0x2414, 0x20a3, 0x0018, 0x20a3, 0x0800, - 0x683c, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, - 0x20a3, 0x0000, 0x6850, 0x20a2, 0x6854, 0x20a2, 0x20a3, 0x0000, - 0x20a3, 0x0000, 0x60c3, 0x0018, 0x1078, 0x6dfb, 0x0d7f, 0x007c, - 0x0d7e, 0x7818, 0x2068, 0x68a0, 0xa082, 0x007e, 0x0048, 0x649c, - 0xa085, 0x0001, 0x0d7f, 0x007c, 0xa006, 0x0078, 0x649a, 0x0d7e, - 0x20a1, 0x020b, 0x1078, 0x6731, 0x20a3, 0x0500, 0x20a3, 0x0000, - 0x7810, 0xa0e8, 0x000f, 0x6808, 0x20a2, 0x680c, 0x20a2, 0x6810, - 0x20a2, 0x6814, 0x20a2, 0x6818, 0x20a2, 0x681c, 0x20a2, 0x60c3, - 0x0010, 0x1078, 0x6dfb, 0x0d7f, 0x007c, 0x6030, 0x609a, 0x1078, - 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, 0x6731, 0x20a3, 0x5200, - 0x20a3, 0x0000, 0x0d7e, 0x2069, 0xa752, 0x6804, 0xd084, 0x0040, - 0x64dc, 0x6828, 0x20a3, 0x0000, 0x017e, 0x1078, 0x2564, 0x21a2, - 0x017f, 0x0d7f, 0x0078, 0x64e1, 0x0d7f, 0x20a3, 0x0000, 0x20a3, - 0x0000, 0x20a9, 0x0004, 0x2099, 0xa705, 0x53a6, 0x20a9, 0x0004, - 0x2099, 0xa701, 0x53a6, 0x7818, 0xa080, 0x0028, 0x2004, 0xa082, - 0x007f, 0x0048, 0x64fb, 0x2001, 0xa71b, 0x20a6, 0x2001, 0xa71c, - 0x20a6, 0x0078, 0x6501, 0x20a3, 0x0000, 0x6030, 0xa084, 0x00ff, - 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x001c, 0x1078, - 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, 0x6731, 0x20a3, 0x0500, - 0x20a3, 0x0000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa082, 0x007f, - 0x0048, 0x6522, 0x2001, 0xa71b, 0x20a6, 0x2001, 0xa71c, 0x20a6, - 0x0078, 0x6528, 0x20a3, 0x0000, 0x6030, 0xa084, 0x00ff, 0x20a2, - 0x20a9, 0x0004, 0x2099, 0xa705, 0x53a6, 0x60c3, 0x0010, 0x1078, - 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, 0x6731, 0x0c7e, 0x7818, - 0x2060, 0x2001, 0x0000, 0x1078, 0x4972, 0x0c7f, 0x7818, 0xa080, - 0x0028, 0x2004, 0xa086, 0x007e, 0x00c0, 0x654d, 0x20a3, 0x0400, - 0x620c, 0xc2b4, 0x620e, 0x0078, 0x654f, 0x20a3, 0x0300, 0x20a3, - 0x0000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa086, 0x007e, 0x00c0, - 0x659c, 0x2099, 0xa98d, 0x33a6, 0x9398, 0x33a6, 0x9398, 0x3304, - 0xa084, 0x3fff, 0x20a2, 0x9398, 0x33a6, 0x20a3, 0x0000, 0x20a3, - 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004, 0x2099, - 0xa705, 0x53a6, 0x20a9, 0x0004, 0x2099, 0xa701, 0x53a6, 0x20a9, - 0x0010, 0x20a3, 0x0000, 0x00f0, 0x6579, 0x2099, 0xa995, 0x3304, - 0xc0dd, 0x20a2, 0x2001, 0xa772, 0x2004, 0xd0e4, 0x0040, 0x6594, - 0x20a3, 0x0000, 0x20a3, 0x0000, 0x9398, 0x9398, 0x9398, 0x33a6, - 0x20a9, 0x0004, 0x0078, 0x6596, 0x20a9, 0x0007, 0x20a3, 0x0000, - 0x00f0, 0x6596, 0x0078, 0x65bc, 0x2099, 0xa98d, 0x20a9, 0x0008, - 0x53a6, 0x20a9, 0x0004, 0x2099, 0xa705, 0x53a6, 0x20a9, 0x0004, - 0x2099, 0xa701, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x00f0, - 0x65ad, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x00f0, 0x65b3, 0x2099, - 0xa995, 0x20a9, 0x0008, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, - 0x00f0, 0x65be, 0x20a9, 0x000a, 0x20a3, 0x0000, 0x00f0, 0x65c4, - 0x60c3, 0x0074, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, - 0x6731, 0x20a3, 0x2010, 0x20a3, 0x0014, 0x20a3, 0x0800, 0x20a3, - 0x2000, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x0f7e, - 0x2079, 0xa752, 0x7904, 0x0f7f, 0xd1ac, 0x00c0, 0x65e9, 0xa085, - 0x0020, 0xd1a4, 0x0040, 0x65ee, 0xa085, 0x0010, 0xa085, 0x0002, - 0x0d7e, 0x0078, 0x66b7, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, - 0x60c3, 0x0014, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, - 0x6731, 0x20a3, 0x5000, 0x0078, 0x654f, 0x20a1, 0x020b, 0x1078, - 0x6731, 0x20a3, 0x2110, 0x20a3, 0x0014, 0x20a3, 0x0000, 0x20a3, - 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, - 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, - 0x0000, 0x60c3, 0x0014, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b, - 0x1078, 0x67b9, 0x0078, 0x6630, 0x20a1, 0x020b, 0x1078, 0x67c2, - 0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, - 0x60c3, 0x0004, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, - 0x67c2, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3, - 0x2a00, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b, - 0x1078, 0x67c2, 0x20a3, 0x0200, 0x0078, 0x654f, 0x20a1, 0x020b, - 0x1078, 0x67c2, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x7828, 0xa005, - 0x0040, 0x6665, 0x20a2, 0x0078, 0x6667, 0x20a3, 0x0003, 0x7810, - 0x20a2, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x007c, 0x0d7e, 0x20a1, - 0x020b, 0x1078, 0x67c2, 0x20a3, 0x0210, 0x20a3, 0x0014, 0x20a3, - 0x0800, 0x7818, 0x2068, 0x6894, 0xa086, 0x0014, 0x00c0, 0x6694, - 0x6998, 0xa184, 0xc000, 0x00c0, 0x6690, 0xd1ec, 0x0040, 0x668c, - 0x20a3, 0x2100, 0x0078, 0x6696, 0x20a3, 0x0100, 0x0078, 0x6696, - 0x20a3, 0x0400, 0x0078, 0x6696, 0x20a3, 0x0700, 0xa006, 0x20a2, - 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x0f7e, 0x2079, 0xa752, 0x7904, - 0x0f7f, 0xd1ac, 0x00c0, 0x66a6, 0xa085, 0x0020, 0xd1a4, 0x0040, - 0x66ab, 0xa085, 0x0010, 0x2009, 0xa774, 0x210c, 0xd184, 0x0040, - 0x66b5, 0x699c, 0xd18c, 0x0040, 0x66b7, 0xa085, 0x0002, 0x027e, - 0x2009, 0xa772, 0x210c, 0xd1e4, 0x0040, 0x66c5, 0xc0c5, 0xa094, - 0x0030, 0xa296, 0x0010, 0x0040, 0x66cf, 0xd1ec, 0x0040, 0x66cf, - 0xa094, 0x0030, 0xa296, 0x0010, 0x0040, 0x66cf, 0xc0bd, 0x027f, - 0x20a2, 0x20a2, 0x20a2, 0x60c3, 0x0014, 0x1078, 0x6dfb, 0x0d7f, - 0x007c, 0x20a1, 0x020b, 0x1078, 0x67c2, 0x20a3, 0x0210, 0x20a3, - 0x0014, 0x20a3, 0x0000, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, - 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, - 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, - 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, 0x67c2, 0x20a3, 0x0200, - 0x0078, 0x64c8, 0x20a1, 0x020b, 0x1078, 0x67c2, 0x20a3, 0x0100, - 0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3, 0x2a00, 0x60c3, 0x0008, - 0x1078, 0x6dfb, 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a1, - 0x020b, 0x1078, 0x67c2, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, - 0x000b, 0x20a3, 0x0000, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x007c, - 0x027e, 0x037e, 0x047e, 0x2019, 0x3200, 0x2021, 0x0800, 0x0078, - 0x6738, 0x027e, 0x037e, 0x047e, 0x2019, 0x2200, 0x2021, 0x0100, - 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2014, - 0xa286, 0x007e, 0x00c0, 0x674b, 0xa385, 0x00ff, 0x20a2, 0x20a3, - 0xfffe, 0x0078, 0x6780, 0xa286, 0x007f, 0x00c0, 0x6757, 0x0d7e, - 0xa385, 0x00ff, 0x20a2, 0x20a3, 0xfffd, 0x0078, 0x676e, 0xd2bc, - 0x0040, 0x6776, 0xa286, 0x0080, 0x0d7e, 0x00c0, 0x6766, 0xa385, - 0x00ff, 0x20a2, 0x20a3, 0xfffc, 0x0078, 0x676e, 0xa2e8, 0xa835, - 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa71b, - 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x6784, 0x0d7e, 0xa2e8, - 0xa835, 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x0d7f, - 0x20a3, 0x0000, 0x6230, 0x22a2, 0xa485, 0x0029, 0x20a2, 0x047f, - 0x037f, 0x20a3, 0x0000, 0x1078, 0x6dea, 0x22a2, 0x20a3, 0x0000, - 0x2fa2, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, - 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a3, 0x02ff, - 0x2011, 0xfffc, 0x22a2, 0x0d7e, 0x2069, 0xa71b, 0x2da6, 0x8d68, - 0x2da6, 0x0d7f, 0x20a3, 0x2029, 0x20a3, 0x0000, 0x0078, 0x678b, - 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0xfc02, 0x20a3, 0x0000, - 0x007c, 0x027e, 0x037e, 0x047e, 0x2019, 0x3300, 0x2021, 0x0800, - 0x0078, 0x67c9, 0x027e, 0x037e, 0x047e, 0x2019, 0x2300, 0x2021, - 0x0100, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, - 0x2004, 0xa092, 0x007e, 0x0048, 0x67e6, 0x0d7e, 0xa0e8, 0xa835, - 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa71b, - 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x67f4, 0x0d7e, 0xa0e8, - 0xa835, 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x0d7f, - 0x20a3, 0x0000, 0x6230, 0x22a2, 0xa485, 0x0098, 0x20a2, 0x20a3, - 0x0000, 0x047f, 0x037f, 0x1078, 0x6dea, 0x22a2, 0x20a3, 0x0000, - 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, - 0x007c, 0x0c7e, 0x0f7e, 0x6004, 0xa08a, 0x0085, 0x1048, 0x1332, - 0xa08a, 0x008c, 0x10c8, 0x1332, 0x6118, 0x2178, 0x79a0, 0xd1bc, - 0x0040, 0x6827, 0x7900, 0xd1f4, 0x0040, 0x6823, 0x7914, 0xa18c, - 0x00ff, 0x0078, 0x682c, 0x2009, 0x0000, 0x0078, 0x682c, 0xa1f8, - 0x29c0, 0x2f0c, 0xa18c, 0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, - 0xa082, 0x0085, 0x1079, 0x6837, 0x0f7f, 0x0c7f, 0x007c, 0x6840, - 0x684b, 0x6866, 0x683e, 0x683e, 0x683e, 0x6840, 0x1078, 0x1332, - 0x147e, 0x20a1, 0x020b, 0x1078, 0x6879, 0x60c3, 0x0000, 0x1078, - 0x6dfb, 0x147f, 0x007c, 0x147e, 0x20a1, 0x020b, 0x1078, 0x68ad, - 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, 0x7810, 0x20a2, - 0x20a3, 0x0000, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, - 0x60c3, 0x000c, 0x1078, 0x6dfb, 0x147f, 0x007c, 0x147e, 0x20a1, - 0x020b, 0x1078, 0x68ee, 0x20a3, 0x0003, 0x20a3, 0x0300, 0x20a3, - 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0004, 0x1078, 0x6dfb, 0x147f, - 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, - 0x0028, 0x2004, 0xa092, 0x007e, 0x0048, 0x6898, 0x0d7e, 0xa0e8, - 0xa835, 0x2d6c, 0x6810, 0xa085, 0x8100, 0x20a2, 0x6814, 0x20a2, - 0x2069, 0xa71b, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x68a7, - 0x0d7e, 0xa0e8, 0xa835, 0x2d6c, 0x6810, 0xa085, 0x8100, 0x20a2, - 0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, - 0x0009, 0x20a3, 0x0000, 0x0078, 0x678b, 0x027e, 0x20e1, 0x9080, - 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa092, 0x007e, - 0x0048, 0x68cc, 0x0d7e, 0xa0e8, 0xa835, 0x2d6c, 0x6810, 0xa085, - 0x8400, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa71b, 0x2da6, 0x8d68, - 0x2da6, 0x0d7f, 0x0078, 0x68db, 0x0d7e, 0xa0e8, 0xa835, 0x2d6c, - 0x6810, 0xa085, 0x8400, 0x20a2, 0x6814, 0x20a2, 0x0d7f, 0x20a3, - 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0099, 0x20a3, 0x0000, 0x1078, - 0x6dea, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x7a10, 0x22a2, - 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, 0x007c, 0x027e, 0x20e1, - 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa092, - 0x007e, 0x0048, 0x690d, 0x0d7e, 0xa0e8, 0xa835, 0x2d6c, 0x6810, - 0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa71b, 0x2da6, - 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x691c, 0x0d7e, 0xa0e8, 0xa835, - 0x2d6c, 0x6810, 0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2, 0x0d7f, - 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0099, 0x20a3, 0x0000, - 0x0078, 0x68df, 0x0c7e, 0x0f7e, 0x2c78, 0x7804, 0xa08a, 0x0040, - 0x1048, 0x1332, 0xa08a, 0x0053, 0x10c8, 0x1332, 0x7918, 0x2160, - 0x61a0, 0xd1bc, 0x0040, 0x6941, 0x6100, 0xd1f4, 0x0040, 0x693d, - 0x6114, 0xa18c, 0x00ff, 0x0078, 0x6946, 0x2009, 0x0000, 0x0078, - 0x6946, 0xa1e0, 0x29c0, 0x2c0c, 0xa18c, 0x00ff, 0x2061, 0x0100, - 0x619a, 0xa082, 0x0040, 0x1079, 0x6950, 0x0f7f, 0x0c7f, 0x007c, - 0x6965, 0x6a73, 0x6a14, 0x6c27, 0x6963, 0x6963, 0x6963, 0x6963, - 0x6963, 0x6963, 0x6963, 0x714c, 0x715d, 0x716e, 0x717f, 0x6963, - 0x767e, 0x6963, 0x713b, 0x1078, 0x1332, 0x0d7e, 0x157e, 0x147e, - 0x780b, 0xffff, 0x20a1, 0x020b, 0x1078, 0x69d0, 0x7910, 0x2168, - 0x6948, 0x7922, 0x21a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x694c, - 0xa184, 0x000f, 0x00c0, 0x6980, 0x2001, 0x0005, 0x0078, 0x698a, - 0xd184, 0x0040, 0x6987, 0x2001, 0x0004, 0x0078, 0x698a, 0xa084, - 0x0006, 0x8004, 0x017e, 0x2008, 0x7830, 0xa084, 0x00ff, 0x8007, - 0xa105, 0x017f, 0x20a2, 0xd1ac, 0x0040, 0x699a, 0x20a3, 0x0002, - 0x0078, 0x69a6, 0xd1b4, 0x0040, 0x69a1, 0x20a3, 0x0001, 0x0078, - 0x69a6, 0x20a3, 0x0000, 0x2230, 0x0078, 0x69a8, 0x6a80, 0x6e7c, - 0x20a9, 0x0008, 0xad80, 0x0017, 0x200c, 0x810f, 0x21a2, 0x8000, - 0x00f0, 0x69ac, 0x22a2, 0x26a2, 0x60c3, 0x0020, 0x20e1, 0x9080, - 0x6014, 0xa084, 0x0004, 0xa085, 0x0009, 0x6016, 0x2001, 0xa9cd, - 0x2003, 0x07d0, 0x2001, 0xa9cc, 0x2003, 0x0009, 0x2001, 0xa9d2, - 0x2003, 0x0002, 0x1078, 0x158c, 0x147f, 0x157f, 0x0d7f, 0x007c, - 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7a18, 0xa280, 0x0023, 0x2014, - 0x8210, 0xa294, 0x00ff, 0x2202, 0x8217, 0x7818, 0xa080, 0x0028, - 0x2004, 0xd0bc, 0x0040, 0x69f6, 0x0d7e, 0xa0e8, 0xa835, 0x2d6c, - 0x6810, 0xa085, 0x0600, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa71b, - 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x6a05, 0x0d7e, 0xa0e8, - 0xa835, 0x2d6c, 0x6810, 0xa085, 0x0600, 0x20a2, 0x6814, 0x20a2, - 0x0d7f, 0x20a3, 0x0000, 0x6130, 0x21a2, 0x20a3, 0x0829, 0x20a3, - 0x0000, 0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x20a3, 0xffff, 0x20a3, - 0x0000, 0x20a3, 0x0000, 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e, - 0x20a1, 0x020b, 0x1078, 0x6a34, 0x7810, 0x2068, 0x6860, 0x20a2, - 0x685c, 0x20a2, 0x6880, 0x20a2, 0x687c, 0x20a2, 0xa006, 0x20a2, - 0x20a2, 0x20a2, 0x20a2, 0x60c3, 0x000c, 0x1078, 0x6dfb, 0x147f, - 0x137f, 0x157f, 0x0d7f, 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, - 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x6a52, - 0x0d7e, 0xa0e8, 0xa835, 0x2d6c, 0x6810, 0xa085, 0x0500, 0x20a2, - 0x6814, 0x20a2, 0x2069, 0xa71b, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, - 0x0078, 0x6a61, 0x0d7e, 0xa0e8, 0xa835, 0x2d6c, 0x6810, 0xa085, - 0x0500, 0x20a2, 0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, 0x6230, - 0x22a2, 0x20a3, 0x0889, 0x20a3, 0x0000, 0x1078, 0x6dea, 0x22a2, - 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, - 0x0000, 0x027f, 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e, 0x7810, - 0xa0ec, 0xf000, 0x0040, 0x6a8b, 0xa06d, 0x1078, 0x495f, 0x0040, - 0x6a8b, 0x684c, 0xa084, 0x2020, 0xa086, 0x2020, 0x00c0, 0x6a8b, - 0x7824, 0xc0cd, 0x7826, 0x20a1, 0x020b, 0x1078, 0x6be0, 0xa016, - 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x7810, 0xa084, 0xf000, - 0x00c0, 0x6aa2, 0x7810, 0xa084, 0x0700, 0x8007, 0x1079, 0x6aaa, - 0x0078, 0x6aa5, 0xa006, 0x1079, 0x6aaa, 0x147f, 0x137f, 0x157f, - 0x0d7f, 0x007c, 0x6ab4, 0x6b4c, 0x6b57, 0x6b81, 0x6b95, 0x6bb1, - 0x6bbc, 0x6ab2, 0x1078, 0x1332, 0x017e, 0x037e, 0x694c, 0xa18c, - 0x0003, 0x0040, 0x6abf, 0xa186, 0x0003, 0x00c0, 0x6ace, 0x6b78, - 0x7824, 0xd0cc, 0x0040, 0x6ac5, 0xc3e5, 0x23a2, 0x6868, 0x20a2, - 0x6864, 0x20a2, 0x037f, 0x017f, 0x0078, 0x6b8c, 0xa186, 0x0001, - 0x10c0, 0x1332, 0x6b78, 0x7824, 0xd0cc, 0x0040, 0x6ad8, 0xc3e5, - 0x23a2, 0x6868, 0x20a2, 0x6864, 0x20a2, 0x22a2, 0x6874, 0x20a2, - 0x22a2, 0x687c, 0x20a2, 0x2009, 0x0018, 0xa384, 0x0300, 0x0040, - 0x6b46, 0xd3c4, 0x0040, 0x6aee, 0x687c, 0xa108, 0xd3cc, 0x0040, - 0x6af3, 0x6874, 0xa108, 0x157e, 0x20a9, 0x000d, 0xad80, 0x0020, - 0x201c, 0x831f, 0x23a2, 0x8000, 0x00f0, 0x6af8, 0x157f, 0x22a2, - 0x22a2, 0x22a2, 0xa184, 0x0003, 0x0040, 0x6b46, 0x20a1, 0x020b, - 0x20e1, 0x9080, 0x20e1, 0x4000, 0x007e, 0x7818, 0xa080, 0x0028, - 0x2004, 0xd0bc, 0x0040, 0x6b26, 0x0d7e, 0xa0e8, 0xa835, 0x2d6c, - 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa71b, - 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x6b35, 0x0d7e, 0xa0e8, - 0xa835, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, - 0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x007f, 0x7b24, 0xd3cc, - 0x0040, 0x6b3e, 0x20a3, 0x0889, 0x0078, 0x6b40, 0x20a3, 0x0898, - 0x20a2, 0x1078, 0x6dea, 0x22a2, 0x20a3, 0x0000, 0x61c2, 0x037f, - 0x017f, 0x1078, 0x6dfb, 0x007c, 0x2011, 0x0008, 0x7824, 0xd0cc, - 0x0040, 0x6b53, 0xc2e5, 0x22a2, 0xa016, 0x0078, 0x6b8a, 0x2011, - 0x0302, 0x7824, 0xd0cc, 0x0040, 0x6b5e, 0xc2e5, 0x22a2, 0xa016, - 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x0012, 0x22a2, 0x20a3, 0x0008, - 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x7000, 0x20a3, 0x0500, - 0x22a2, 0x20a3, 0x000a, 0x22a2, 0x22a2, 0x20a3, 0x2500, 0x22a2, - 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0032, 0x1078, 0x6dfb, - 0x007c, 0x2011, 0x0028, 0x7824, 0xd0cc, 0x0040, 0x6b88, 0xc2e5, - 0x22a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, - 0x60c3, 0x0018, 0x1078, 0x6dfb, 0x007c, 0x2011, 0x0100, 0x7824, - 0xd0cc, 0x0040, 0x6b9c, 0xc2e5, 0x22a2, 0xa016, 0x22a2, 0x22a2, - 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x0008, 0x22a2, 0x7834, 0xa084, - 0x00ff, 0x20a2, 0x22a2, 0x22a2, 0x60c3, 0x0020, 0x1078, 0x6dfb, - 0x007c, 0x2011, 0x0008, 0x7824, 0xd0cc, 0x0040, 0x6bb8, 0xc2e5, - 0x22a2, 0xa016, 0x0078, 0x6b8a, 0x037e, 0x7b10, 0xa384, 0xff00, - 0x7812, 0xa384, 0x00ff, 0x8001, 0x00c0, 0x6bcf, 0x7824, 0xd0cc, - 0x0040, 0x6bcb, 0xc2e5, 0x22a2, 0x037f, 0x0078, 0x6b8a, 0x047e, - 0x2021, 0x0800, 0x007e, 0x7824, 0xd0cc, 0x007f, 0x0040, 0x6bd9, - 0xc4e5, 0x24a2, 0x047f, 0x22a2, 0x20a2, 0x037f, 0x0078, 0x6b8c, - 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, - 0x2004, 0xd0bc, 0x0040, 0x6bfe, 0x0d7e, 0xa0e8, 0xa835, 0x2d6c, - 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa71b, - 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x6c0d, 0x0d7e, 0xa0e8, - 0xa835, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, - 0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x7824, 0xd0cc, 0x0040, - 0x6c15, 0x20a3, 0x0889, 0x0078, 0x6c17, 0x20a3, 0x0898, 0x20a3, - 0x0000, 0x1078, 0x6dea, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, - 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, 0x007c, 0x0d7e, - 0x157e, 0x137e, 0x147e, 0x017e, 0x037e, 0x7810, 0xa084, 0x0700, - 0x8007, 0x1079, 0x6c3a, 0x037f, 0x017f, 0x147f, 0x137f, 0x157f, - 0x0d7f, 0x007c, 0x6c42, 0x6c42, 0x6c44, 0x6c42, 0x6c42, 0x6c42, - 0x6c69, 0x6c42, 0x1078, 0x1332, 0x7910, 0xa18c, 0xf8ff, 0xa18d, - 0x0600, 0x7912, 0x20a1, 0x020b, 0x2009, 0x0003, 0x1078, 0x6c73, - 0x0d7e, 0x2069, 0xa752, 0x6804, 0xd0bc, 0x0040, 0x6c5e, 0x682c, - 0xa084, 0x00ff, 0x8007, 0x20a2, 0x0078, 0x6c60, 0x20a3, 0x3f00, - 0x0d7f, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0001, 0x1078, 0x6dfb, - 0x007c, 0x20a1, 0x020b, 0x2009, 0x0003, 0x1078, 0x6c73, 0x20a3, - 0x7f00, 0x0078, 0x6c61, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, - 0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x6c91, 0x0d7e, - 0xa0e8, 0xa835, 0x2d6c, 0x6810, 0xa085, 0x0100, 0x20a2, 0x6814, - 0x20a2, 0x2069, 0xa71b, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, - 0x6ca0, 0x0d7e, 0xa0e8, 0xa835, 0x2d6c, 0x6810, 0xa085, 0x0100, - 0x20a2, 0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2, - 0x20a3, 0x0888, 0xa18d, 0x0008, 0x21a2, 0x1078, 0x6dea, 0x22a2, - 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, - 0x0000, 0x027f, 0x007c, 0x0e7e, 0x0d7e, 0x0c7e, 0x057e, 0x047e, - 0x037e, 0x2061, 0x0100, 0x2071, 0xa700, 0x6130, 0x7818, 0x2068, - 0x68a0, 0x2028, 0xd0bc, 0x00c0, 0x6cca, 0x6910, 0x6a14, 0x6430, - 0x0078, 0x6cce, 0x6910, 0x6a14, 0x736c, 0x7470, 0x781c, 0xa086, - 0x0006, 0x0040, 0x6d2d, 0xd5bc, 0x0040, 0x6cde, 0xa185, 0x0100, - 0x6062, 0x6266, 0x636a, 0x646e, 0x0078, 0x6ce5, 0xa185, 0x0100, - 0x6062, 0x6266, 0x606b, 0x0000, 0x646e, 0x6073, 0x0809, 0x6077, - 0x0008, 0x688c, 0x8000, 0xa084, 0x00ff, 0x688e, 0x8007, 0x607a, - 0x607f, 0x0000, 0x2f00, 0x6082, 0x7808, 0x6086, 0x7810, 0x2070, - 0x7014, 0x608a, 0x7010, 0x608e, 0x700c, 0x60c6, 0x7008, 0x60ca, - 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000, - 0xa582, 0x0080, 0x0048, 0x6d17, 0x6a00, 0xd2f4, 0x0040, 0x6d15, - 0x6a14, 0xa294, 0x00ff, 0x0078, 0x6d17, 0x2011, 0x0000, 0x629e, - 0x6017, 0x0016, 0x2009, 0x07d0, 0x60c4, 0xa084, 0xfff0, 0xa005, - 0x0040, 0x6d24, 0x2009, 0x1b58, 0x1078, 0x5ad0, 0x037f, 0x047f, - 0x057f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0x7810, 0x2070, 0x704c, - 0xa084, 0x0003, 0xa086, 0x0002, 0x0040, 0x6d85, 0xd5bc, 0x0040, - 0x6d41, 0xa185, 0x0100, 0x6062, 0x6266, 0x636a, 0x646e, 0x0078, - 0x6d48, 0xa185, 0x0100, 0x6062, 0x6266, 0x606b, 0x0000, 0x646e, - 0x6073, 0x0880, 0x6077, 0x0008, 0x688c, 0x8000, 0xa084, 0x00ff, - 0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6086, 0x7808, - 0x6082, 0x7060, 0x608a, 0x705c, 0x608e, 0x7080, 0x60c6, 0x707c, - 0x60ca, 0x707c, 0x792c, 0xa108, 0x792e, 0x7080, 0x7928, 0xa109, - 0x792a, 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, - 0x0000, 0xa582, 0x0080, 0x0048, 0x6d80, 0x6a00, 0xd2f4, 0x0040, - 0x6d7e, 0x6a14, 0xa294, 0x00ff, 0x0078, 0x6d80, 0x2011, 0x0000, - 0x629e, 0x6017, 0x0012, 0x0078, 0x6d1a, 0xd5bc, 0x0040, 0x6d90, - 0xa185, 0x0700, 0x6062, 0x6266, 0x636a, 0x646e, 0x0078, 0x6d97, - 0xa185, 0x0700, 0x6062, 0x6266, 0x606b, 0x0000, 0x646e, 0x1078, - 0x495f, 0x0040, 0x6dad, 0x0d7e, 0x7810, 0xa06d, 0x684c, 0x0d7f, - 0xa084, 0x2020, 0xa086, 0x2020, 0x00c0, 0x6dad, 0x7824, 0xc0cd, - 0x7826, 0x6073, 0x0889, 0x0078, 0x6daf, 0x6073, 0x0898, 0x6077, - 0x0000, 0x688c, 0x8000, 0xa084, 0x00ff, 0x688e, 0x8007, 0x607a, - 0x607f, 0x0000, 0x2f00, 0x6086, 0x7808, 0x6082, 0x7014, 0x608a, - 0x7010, 0x608e, 0x700c, 0x60c6, 0x7008, 0x60ca, 0x686c, 0x60ce, - 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xa582, 0x0080, - 0x0048, 0x6ddd, 0x6a00, 0xd2f4, 0x0040, 0x6ddb, 0x6a14, 0xa294, - 0x00ff, 0x0078, 0x6ddd, 0x2011, 0x0000, 0x629e, 0x7824, 0xd0cc, - 0x0040, 0x6de6, 0x6017, 0x0016, 0x0078, 0x6d1a, 0x6017, 0x0012, - 0x0078, 0x6d1a, 0x7a18, 0xa280, 0x0023, 0x2014, 0x8210, 0xa294, - 0x00ff, 0x2202, 0x8217, 0x007c, 0x0d7e, 0x2069, 0xa9b1, 0x6843, - 0x0001, 0x0d7f, 0x007c, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, - 0x9575, 0x1078, 0x6e06, 0x1078, 0x5ac0, 0x007c, 0x007e, 0x6014, - 0xa084, 0x0004, 0xa085, 0x0009, 0x6016, 0x007f, 0x007c, 0x007e, - 0x0c7e, 0x2061, 0x0100, 0x6014, 0xa084, 0x0004, 0xa085, 0x0008, - 0x6016, 0x0c7f, 0x007f, 0x007c, 0x0c7e, 0x0d7e, 0x017e, 0x027e, - 0x2061, 0x0100, 0x2069, 0x0140, 0x6904, 0xa194, 0x4000, 0x0040, - 0x6e59, 0x1078, 0x6e0f, 0x6803, 0x1000, 0x6803, 0x0000, 0x0c7e, - 0x2061, 0xa9b1, 0x6128, 0xa192, 0x00c8, 0x00c8, 0x6e44, 0x8108, - 0x612a, 0x6124, 0x0c7f, 0x81ff, 0x0040, 0x6e54, 0x1078, 0x5ac0, - 0x1078, 0x6e06, 0x0078, 0x6e54, 0x6124, 0xa1e5, 0x0000, 0x0040, - 0x6e51, 0x1078, 0xa5d4, 0x1078, 0x5acb, 0x2009, 0x0014, 0x1078, - 0x775c, 0x0c7f, 0x0078, 0x6e54, 0x027f, 0x017f, 0x0d7f, 0x0c7f, - 0x007c, 0x2001, 0xa9cd, 0x2004, 0xa005, 0x00c0, 0x6e54, 0x0c7e, - 0x2061, 0xa9b1, 0x6128, 0xa192, 0x0003, 0x00c8, 0x6e44, 0x8108, - 0x612a, 0x0c7f, 0x1078, 0x5ac0, 0x1078, 0x4224, 0x0078, 0x6e54, - 0x0c7e, 0x0d7e, 0x0e7e, 0x017e, 0x027e, 0x1078, 0x5ad8, 0x2071, - 0xa9b1, 0x713c, 0x81ff, 0x0040, 0x6e9a, 0x2061, 0x0100, 0x2069, - 0x0140, 0x6904, 0xa194, 0x4000, 0x0040, 0x6ea0, 0x6803, 0x1000, - 0x6803, 0x0000, 0x037e, 0x2019, 0x0001, 0x1078, 0x7058, 0x037f, - 0x713c, 0x2160, 0x1078, 0xa5d4, 0x2009, 0x004a, 0x1078, 0x775c, - 0x0078, 0x6e9a, 0x027f, 0x017f, 0x0e7f, 0x0d7f, 0x0c7f, 0x007c, - 0x0078, 0x6e8a, 0x0e7e, 0x2071, 0xa9b1, 0x7048, 0xd084, 0x0040, - 0x6ebc, 0x713c, 0x81ff, 0x0040, 0x6ebc, 0x2071, 0x0100, 0xa188, - 0x0007, 0x210c, 0xa18e, 0x0006, 0x00c0, 0x6eba, 0x7017, 0x0012, - 0x0078, 0x6ebc, 0x7017, 0x0016, 0x0e7f, 0x007c, 0x0e7e, 0x0d7e, - 0x0c7e, 0x067e, 0x057e, 0x047e, 0x007e, 0x127e, 0x2091, 0x8000, - 0x6018, 0x2068, 0x6ca0, 0x2071, 0xa9b1, 0x7018, 0x2068, 0x8dff, - 0x0040, 0x6ee6, 0x68a0, 0xa406, 0x0040, 0x6eda, 0x6854, 0x2068, - 0x0078, 0x6ecf, 0x6010, 0x2060, 0x643c, 0x6540, 0x6648, 0x2d60, - 0x1078, 0x4736, 0x0040, 0x6ee6, 0xa085, 0x0001, 0x127f, 0x007f, - 0x047f, 0x057f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0x20a1, - 0x020b, 0x1078, 0x6731, 0x20a3, 0x1200, 0x20a3, 0x0000, 0x20a3, - 0x0000, 0x781c, 0xa086, 0x0004, 0x00c0, 0x6f01, 0x6098, 0x0078, - 0x6f02, 0x6030, 0x20a2, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x20a9, - 0x0010, 0xa006, 0x20a2, 0x00f0, 0x6f0a, 0x20a2, 0x20a2, 0x60c3, - 0x002c, 0x1078, 0x6dfb, 0x007c, 0x157e, 0x147e, 0x20a1, 0x020b, - 0x1078, 0x6731, 0x20a3, 0x0f00, 0x20a3, 0x0000, 0x20a3, 0x0000, - 0x7808, 0x20a2, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x147f, 0x157f, - 0x007c, 0x157e, 0x147e, 0x20a1, 0x020b, 0x1078, 0x67c2, 0x20a3, - 0x0200, 0x20a3, 0x0000, 0x20a9, 0x0006, 0x2011, 0xa740, 0x2019, - 0xa741, 0x23a6, 0x22a6, 0xa398, 0x0002, 0xa290, 0x0002, 0x00f0, - 0x6f39, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x001c, 0x1078, - 0x6dfb, 0x147f, 0x157f, 0x007c, 0x157e, 0x147e, 0x017e, 0x027e, - 0x20a1, 0x020b, 0x1078, 0x6799, 0x1078, 0x67b0, 0x7810, 0xa080, - 0x0000, 0x2004, 0xa080, 0x0015, 0x2098, 0x7808, 0xa088, 0x0002, - 0x21a8, 0x53a6, 0xa080, 0x0004, 0x8003, 0x60c2, 0x1078, 0x6dfb, - 0x027f, 0x017f, 0x147f, 0x157f, 0x007c, 0x157e, 0x147e, 0x20a1, - 0x020b, 0x1078, 0x6731, 0x20a3, 0x6200, 0x20a3, 0x0000, 0x20a3, - 0x0000, 0x7808, 0x20a2, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x147f, - 0x157f, 0x007c, 0x157e, 0x147e, 0x017e, 0x027e, 0x20a1, 0x020b, - 0x1078, 0x6731, 0x7810, 0xa080, 0x0000, 0x2004, 0xa080, 0x0017, - 0x2098, 0x7808, 0xa088, 0x0002, 0x21a8, 0x53a6, 0x8003, 0x60c2, - 0x1078, 0x6dfb, 0x027f, 0x017f, 0x147f, 0x157f, 0x007c, 0x0e7e, - 0x0c7e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071, 0xa9b1, 0x700c, - 0x2060, 0x8cff, 0x0040, 0x6fbb, 0x1078, 0x8f10, 0x00c0, 0x6fb2, - 0x1078, 0x7c83, 0x600c, 0x007e, 0x1078, 0x772d, 0x1078, 0x7233, - 0x0c7f, 0x0078, 0x6fa9, 0x700f, 0x0000, 0x700b, 0x0000, 0x127f, - 0x007f, 0x0c7f, 0x0e7f, 0x007c, 0x127e, 0x157e, 0x0f7e, 0x0e7e, - 0x0d7e, 0x0c7e, 0x027e, 0x017e, 0x007e, 0x2091, 0x8000, 0x2069, - 0x0100, 0x2079, 0x0140, 0x2071, 0xa9b1, 0x7024, 0x2060, 0x8cff, - 0x0040, 0x7014, 0x1078, 0x6e0f, 0x68c3, 0x0000, 0x1078, 0x5acb, - 0x2009, 0x0013, 0x1078, 0x775c, 0x20a9, 0x01f4, 0x6824, 0xd094, - 0x0040, 0x6ff7, 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x0040, - 0x7009, 0x7803, 0x1000, 0x7803, 0x0000, 0x0078, 0x7009, 0xd084, - 0x0040, 0x6ffe, 0x6827, 0x0001, 0x0078, 0x7000, 0x00f0, 0x6fe6, - 0x7804, 0xa084, 0x1000, 0x0040, 0x7009, 0x7803, 0x0100, 0x7803, - 0x0000, 0x6824, 0x007f, 0x017f, 0x027f, 0x0c7f, 0x0d7f, 0x0e7f, - 0x0f7f, 0x157f, 0x127f, 0x007c, 0x2001, 0xa700, 0x2004, 0xa096, - 0x0001, 0x0040, 0x704e, 0xa096, 0x0004, 0x0040, 0x704e, 0x1078, - 0x5acb, 0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, 0x41dc, 0x1078, - 0x5a45, 0x20a9, 0x01f4, 0x6824, 0xd094, 0x0040, 0x703c, 0x6827, - 0x0004, 0x7804, 0xa084, 0x4000, 0x0040, 0x704e, 0x7803, 0x1000, - 0x7803, 0x0000, 0x0078, 0x704e, 0xd084, 0x0040, 0x7043, 0x6827, - 0x0001, 0x0078, 0x7045, 0x00f0, 0x702b, 0x7804, 0xa084, 0x1000, - 0x0040, 0x704e, 0x7803, 0x0100, 0x7803, 0x0000, 0x007f, 0x017f, - 0x027f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x157f, 0x127f, 0x007c, - 0x127e, 0x157e, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x027e, 0x017e, - 0x007e, 0x2091, 0x8000, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, - 0xa9b1, 0x703c, 0x2060, 0x8cff, 0x0040, 0x70d6, 0x68af, 0x95f5, - 0x6817, 0x0010, 0x2009, 0x00fa, 0x8109, 0x00c0, 0x7074, 0x68c7, - 0x0000, 0x68cb, 0x0008, 0x1078, 0x5ad8, 0x1078, 0x1f7e, 0x047e, - 0x057e, 0x2009, 0x017f, 0x212c, 0x200b, 0x00a5, 0x2021, 0x0169, - 0x2404, 0xa084, 0x000f, 0xa086, 0x0004, 0x00c0, 0x70a5, 0x68c7, - 0x0000, 0x68cb, 0x0008, 0x0e7e, 0x0f7e, 0x2079, 0x0020, 0x2071, - 0xaa08, 0x6814, 0xa084, 0x0004, 0xa085, 0x0012, 0x6816, 0x7803, - 0x0008, 0x7003, 0x0000, 0x0f7f, 0x0e7f, 0x250a, 0x057f, 0x047f, - 0xa39d, 0x0000, 0x00c0, 0x70b0, 0x2009, 0x0049, 0x1078, 0x775c, - 0x20a9, 0x03e8, 0x6824, 0xd094, 0x0040, 0x70c3, 0x6827, 0x0004, - 0x7804, 0xa084, 0x4000, 0x0040, 0x70d5, 0x7803, 0x1000, 0x7803, - 0x0000, 0x0078, 0x70d5, 0xd08c, 0x0040, 0x70ca, 0x6827, 0x0002, - 0x0078, 0x70cc, 0x00f0, 0x70b2, 0x7804, 0xa084, 0x1000, 0x0040, - 0x70d5, 0x7803, 0x0100, 0x7803, 0x0000, 0x6824, 0x007f, 0x017f, - 0x027f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x157f, 0x127f, 0x007c, - 0x0d7e, 0x127e, 0x2091, 0x8000, 0x2069, 0xa9b1, 0x6a06, 0x127f, - 0x0d7f, 0x007c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x2069, 0xa9b1, - 0x6a32, 0x127f, 0x0d7f, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x067e, - 0x007e, 0x127e, 0x2071, 0xa9b1, 0x7614, 0x2660, 0x2678, 0x2091, - 0x8000, 0x8cff, 0x0040, 0x7134, 0x601c, 0xa206, 0x00c0, 0x712f, - 0x7014, 0xac36, 0x00c0, 0x710e, 0x660c, 0x7616, 0x7010, 0xac36, - 0x00c0, 0x711c, 0x2c00, 0xaf36, 0x0040, 0x711a, 0x2f00, 0x7012, - 0x0078, 0x711c, 0x7013, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06, - 0x0040, 0x7125, 0x7e0e, 0x0078, 0x7126, 0x2678, 0x600f, 0x0000, - 0x1078, 0x8ed6, 0x1078, 0x7233, 0x0c7f, 0x0078, 0x7101, 0x2c78, - 0x600c, 0x2060, 0x0078, 0x7101, 0x127f, 0x007f, 0x067f, 0x0c7f, - 0x0e7f, 0x0f7f, 0x007c, 0x157e, 0x147e, 0x20a1, 0x020b, 0x1078, - 0x69d0, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, - 0x20a3, 0x1000, 0x0078, 0x718e, 0x157e, 0x147e, 0x20a1, 0x020b, - 0x1078, 0x69d0, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, - 0x20a2, 0x20a3, 0x4000, 0x0078, 0x718e, 0x157e, 0x147e, 0x20a1, - 0x020b, 0x1078, 0x69d0, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2, - 0x20a2, 0x20a2, 0x20a3, 0x2000, 0x0078, 0x718e, 0x157e, 0x147e, - 0x20a1, 0x020b, 0x1078, 0x69d0, 0x7810, 0x20a2, 0xa006, 0x20a2, - 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0400, 0x0078, 0x718e, 0x157e, - 0x147e, 0x20a1, 0x020b, 0x1078, 0x69d0, 0x7810, 0x20a2, 0xa006, - 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0200, 0x1078, 0x723e, - 0x60c3, 0x0020, 0x1078, 0x6dfb, 0x147f, 0x157f, 0x007c, 0x127e, - 0x0c7e, 0x2091, 0x8000, 0x2061, 0x0100, 0x6120, 0xd1b4, 0x00c0, - 0x71a6, 0xd1bc, 0x00c0, 0x71f0, 0x0078, 0x7230, 0x2009, 0x017f, - 0x200b, 0x00a1, 0x157e, 0x007e, 0x0d7e, 0x2069, 0x0140, 0x20a9, - 0x001e, 0x2009, 0x0169, 0x6804, 0xa084, 0x4000, 0x0040, 0x71e7, - 0x6020, 0xd0b4, 0x0040, 0x71e7, 0x6024, 0xd094, 0x00c0, 0x71e7, - 0x2104, 0xa084, 0x000f, 0xa086, 0x0004, 0x00c0, 0x71e7, 0x00f0, - 0x71b3, 0x027e, 0x6198, 0xa18c, 0x00ff, 0x8107, 0x6130, 0xa18c, - 0x00ff, 0xa10d, 0x6088, 0x628c, 0x618e, 0x608b, 0xbc91, 0x6043, - 0x0001, 0x6043, 0x0000, 0x608a, 0x628e, 0x6024, 0xd094, 0x00c0, - 0x71e6, 0x6a04, 0xa294, 0x4000, 0x00c0, 0x71dd, 0x027f, 0x0d7f, - 0x007f, 0x157f, 0x2009, 0x017f, 0x200b, 0x0000, 0x0078, 0x7230, - 0x2009, 0x017f, 0x200b, 0x00a1, 0x157e, 0x007e, 0x0d7e, 0x2069, - 0x0140, 0x20a9, 0x001e, 0x2009, 0x0169, 0x6804, 0xa084, 0x4000, - 0x0040, 0x7229, 0x6020, 0xd0bc, 0x0040, 0x7229, 0x2104, 0xa084, - 0x000f, 0xa086, 0x0004, 0x00c0, 0x7229, 0x00f0, 0x71fd, 0x027e, - 0x6164, 0xa18c, 0x00ff, 0x8107, 0x6130, 0xa18c, 0x00ff, 0xa10d, - 0x6088, 0x628c, 0x608b, 0xbc91, 0x618e, 0x6043, 0x0001, 0x6043, - 0x0000, 0x608a, 0x628e, 0x6a04, 0xa294, 0x4000, 0x00c0, 0x7223, - 0x027f, 0x0d7f, 0x007f, 0x157f, 0x2009, 0x017f, 0x200b, 0x0000, - 0x0c7f, 0x127f, 0x007c, 0x0e7e, 0x2071, 0xa9b1, 0x7020, 0xa005, - 0x0040, 0x723c, 0x8001, 0x7022, 0x0e7f, 0x007c, 0x20a9, 0x0008, - 0x20a2, 0x00f0, 0x7240, 0x20a2, 0x20a2, 0x007c, 0x0f7e, 0x0e7e, - 0x0d7e, 0x0c7e, 0x077e, 0x067e, 0x007e, 0x127e, 0x2091, 0x8000, - 0x2071, 0xa9b1, 0x7614, 0x2660, 0x2678, 0x2039, 0x0001, 0x87ff, - 0x0040, 0x72e2, 0x8cff, 0x0040, 0x72e2, 0x601c, 0xa086, 0x0006, - 0x00c0, 0x72dd, 0x88ff, 0x0040, 0x726d, 0x2800, 0xac06, 0x00c0, - 0x72dd, 0x2039, 0x0000, 0x0078, 0x7278, 0x6018, 0xa206, 0x00c0, - 0x72dd, 0x85ff, 0x0040, 0x7278, 0x6020, 0xa106, 0x00c0, 0x72dd, - 0x7024, 0xac06, 0x00c0, 0x72a8, 0x2069, 0x0100, 0x68c0, 0xa005, - 0x0040, 0x72a3, 0x1078, 0x5acb, 0x6817, 0x0008, 0x68c3, 0x0000, - 0x1078, 0x7378, 0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, - 0xa384, 0x1000, 0x0040, 0x7298, 0x6803, 0x0100, 0x6803, 0x0000, - 0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x72a0, 0x6827, 0x0001, - 0x037f, 0x0078, 0x72a8, 0x6003, 0x0009, 0x630a, 0x0078, 0x72dd, - 0x7014, 0xac36, 0x00c0, 0x72ae, 0x660c, 0x7616, 0x7010, 0xac36, - 0x00c0, 0x72bc, 0x2c00, 0xaf36, 0x0040, 0x72ba, 0x2f00, 0x7012, - 0x0078, 0x72bc, 0x7013, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06, - 0x0040, 0x72c5, 0x7e0e, 0x0078, 0x72c6, 0x2678, 0x89ff, 0x00c0, - 0x72d5, 0x600f, 0x0000, 0x6010, 0x2068, 0x1078, 0x8d16, 0x0040, - 0x72d3, 0x1078, 0xa1da, 0x1078, 0x8ed6, 0x1078, 0x7233, 0x88ff, - 0x00c0, 0x72ec, 0x0c7f, 0x0078, 0x7257, 0x2c78, 0x600c, 0x2060, - 0x0078, 0x7257, 0xa006, 0x127f, 0x007f, 0x067f, 0x077f, 0x0c7f, - 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x6017, 0x0000, 0x0c7f, 0xa8c5, - 0x0001, 0x0078, 0x72e3, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, - 0x027e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071, 0xa9b1, 0x7638, - 0x2660, 0x2678, 0x8cff, 0x0040, 0x7367, 0x601c, 0xa086, 0x0006, - 0x00c0, 0x7362, 0x87ff, 0x0040, 0x7313, 0x2700, 0xac06, 0x00c0, - 0x7362, 0x0078, 0x731e, 0x6018, 0xa206, 0x00c0, 0x7362, 0x85ff, - 0x0040, 0x731e, 0x6020, 0xa106, 0x00c0, 0x7362, 0x703c, 0xac06, - 0x00c0, 0x7332, 0x037e, 0x2019, 0x0001, 0x1078, 0x7058, 0x7033, - 0x0000, 0x703f, 0x0000, 0x7043, 0x0000, 0x7047, 0x0000, 0x704b, - 0x0000, 0x037f, 0x7038, 0xac36, 0x00c0, 0x7338, 0x660c, 0x763a, - 0x7034, 0xac36, 0x00c0, 0x7346, 0x2c00, 0xaf36, 0x0040, 0x7344, - 0x2f00, 0x7036, 0x0078, 0x7346, 0x7037, 0x0000, 0x660c, 0x067e, - 0x2c00, 0xaf06, 0x0040, 0x734f, 0x7e0e, 0x0078, 0x7350, 0x2678, - 0x600f, 0x0000, 0x6010, 0x2068, 0x1078, 0x8d16, 0x0040, 0x735a, - 0x1078, 0xa1da, 0x1078, 0x8ed6, 0x87ff, 0x00c0, 0x7371, 0x0c7f, - 0x0078, 0x7302, 0x2c78, 0x600c, 0x2060, 0x0078, 0x7302, 0xa006, - 0x127f, 0x007f, 0x027f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, - 0x007c, 0x6017, 0x0000, 0x0c7f, 0xa7bd, 0x0001, 0x0078, 0x7368, - 0x0e7e, 0x2071, 0xa9b1, 0x2001, 0xa700, 0x2004, 0xa086, 0x0002, - 0x00c0, 0x7386, 0x7007, 0x0005, 0x0078, 0x7388, 0x7007, 0x0000, - 0x0e7f, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x067e, 0x027e, 0x007e, - 0x127e, 0x2091, 0x8000, 0x2071, 0xa9b1, 0x2c10, 0x7638, 0x2660, - 0x2678, 0x8cff, 0x0040, 0x73c8, 0x2200, 0xac06, 0x00c0, 0x73c3, - 0x7038, 0xac36, 0x00c0, 0x73a6, 0x660c, 0x763a, 0x7034, 0xac36, - 0x00c0, 0x73b4, 0x2c00, 0xaf36, 0x0040, 0x73b2, 0x2f00, 0x7036, - 0x0078, 0x73b4, 0x7037, 0x0000, 0x660c, 0x2c00, 0xaf06, 0x0040, - 0x73bc, 0x7e0e, 0x0078, 0x73bd, 0x2678, 0x600f, 0x0000, 0xa085, - 0x0001, 0x0078, 0x73c8, 0x2c78, 0x600c, 0x2060, 0x0078, 0x7399, - 0x127f, 0x007f, 0x027f, 0x067f, 0x0c7f, 0x0e7f, 0x0f7f, 0x007c, - 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x007e, 0x127e, 0x2091, - 0x8000, 0x2071, 0xa9b1, 0x760c, 0x2660, 0x2678, 0x8cff, 0x0040, - 0x7469, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x00c0, 0x7464, - 0x7024, 0xac06, 0x00c0, 0x740f, 0x2069, 0x0100, 0x68c0, 0xa005, - 0x0040, 0x743d, 0x1078, 0x6e0f, 0x68c3, 0x0000, 0x1078, 0x7378, - 0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, - 0x0040, 0x7406, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, - 0x6824, 0xd084, 0x0040, 0x740e, 0x6827, 0x0001, 0x037f, 0x700c, - 0xac36, 0x00c0, 0x7415, 0x660c, 0x760e, 0x7008, 0xac36, 0x00c0, - 0x7423, 0x2c00, 0xaf36, 0x0040, 0x7421, 0x2f00, 0x700a, 0x0078, - 0x7423, 0x700b, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040, - 0x742c, 0x7e0e, 0x0078, 0x742d, 0x2678, 0x600f, 0x0000, 0x1078, - 0x8efc, 0x00c0, 0x7441, 0x1078, 0x28a6, 0x1078, 0x8f10, 0x00c0, - 0x745d, 0x1078, 0x7c83, 0x0078, 0x745d, 0x1078, 0x7378, 0x0078, - 0x740f, 0x1078, 0x8f10, 0x00c0, 0x7449, 0x1078, 0x7c83, 0x0078, - 0x745d, 0x6010, 0x2068, 0x1078, 0x8d16, 0x0040, 0x745d, 0x601c, - 0xa086, 0x0003, 0x00c0, 0x7471, 0x6837, 0x0103, 0x6b4a, 0x6847, - 0x0000, 0x1078, 0x4a73, 0x1078, 0x8ec9, 0x1078, 0x8ed6, 0x1078, - 0x7233, 0x0c7f, 0x0078, 0x73de, 0x2c78, 0x600c, 0x2060, 0x0078, - 0x73de, 0x127f, 0x007f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, - 0x007c, 0x601c, 0xa086, 0x0006, 0x00c0, 0x745d, 0x1078, 0xa1da, - 0x0078, 0x745d, 0x037e, 0x157e, 0x137e, 0x147e, 0x3908, 0xa006, - 0xa190, 0x0020, 0x221c, 0xa39e, 0x2676, 0x00c0, 0x748b, 0x8210, - 0x8000, 0x0078, 0x7482, 0xa005, 0x0040, 0x7497, 0x20a9, 0x0020, - 0x2198, 0x8211, 0xa282, 0x0020, 0x20c8, 0x20a0, 0x53a3, 0x147f, - 0x137f, 0x157f, 0x037f, 0x007c, 0x0d7e, 0x20a1, 0x020b, 0x1078, - 0x67c2, 0x20a3, 0x0200, 0x20a3, 0x0014, 0x60c3, 0x0014, 0x20a3, - 0x0000, 0x20a3, 0x0000, 0x2099, 0xa9a5, 0x20a9, 0x0004, 0x53a6, - 0x20a3, 0x0004, 0x20a3, 0x7878, 0x20a3, 0x0000, 0x20a3, 0x0000, - 0x1078, 0x6dfb, 0x0d7f, 0x007c, 0x20a1, 0x020b, 0x1078, 0x67c2, - 0x20a3, 0x0214, 0x20a3, 0x0018, 0x20a3, 0x0800, 0x7810, 0xa084, - 0xff00, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, - 0x20a3, 0x0000, 0x7810, 0xa084, 0x00ff, 0x20a2, 0x7828, 0x20a2, - 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0018, 0x1078, 0x6dfb, - 0x007c, 0x0d7e, 0x017e, 0x2f68, 0x2009, 0x0035, 0x1078, 0x91cc, - 0x00c0, 0x7551, 0x20a1, 0x020b, 0x1078, 0x6731, 0x20a3, 0x1300, - 0x20a3, 0x0000, 0x7828, 0x2068, 0x681c, 0xa086, 0x0003, 0x0040, - 0x752d, 0x7818, 0xa080, 0x0028, 0x2014, 0xa286, 0x007e, 0x00c0, - 0x7507, 0x20a3, 0x00ff, 0x20a3, 0xfffe, 0x0078, 0x7542, 0xa286, - 0x007f, 0x00c0, 0x7511, 0x20a3, 0x00ff, 0x20a3, 0xfffd, 0x0078, - 0x7542, 0xd2bc, 0x0040, 0x7527, 0xa286, 0x0080, 0x00c0, 0x751e, - 0x20a3, 0x00ff, 0x20a3, 0xfffc, 0x0078, 0x7542, 0xa2e8, 0xa835, - 0x2d6c, 0x6810, 0x20a2, 0x6814, 0x20a2, 0x0078, 0x7542, 0x20a3, - 0x0000, 0x6098, 0x20a2, 0x0078, 0x7542, 0x7818, 0xa080, 0x0028, - 0x2004, 0xa082, 0x007e, 0x0048, 0x753e, 0x0d7e, 0x2069, 0xa71b, - 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x7542, 0x20a3, 0x0000, - 0x6030, 0x20a2, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x20a3, 0x0000, - 0x20a3, 0x0000, 0x60c3, 0x000c, 0x1078, 0x6dfb, 0x017f, 0x0d7f, - 0x007c, 0x7817, 0x0001, 0x7803, 0x0006, 0x017f, 0x0d7f, 0x007c, - 0x0d7e, 0x027e, 0x7928, 0x2168, 0x691c, 0xa186, 0x0006, 0x0040, - 0x757a, 0xa186, 0x0003, 0x0040, 0x75d5, 0xa186, 0x0005, 0x0040, - 0x75b8, 0xa186, 0x0004, 0x0040, 0x75a8, 0xa186, 0x0008, 0x0040, - 0x75c2, 0x7807, 0x0037, 0x7813, 0x1700, 0x1078, 0x7640, 0x027f, - 0x0d7f, 0x007c, 0x1078, 0x75fd, 0x2009, 0x4000, 0x6800, 0x0079, - 0x7581, 0x7594, 0x75a2, 0x7596, 0x75a2, 0x759d, 0x7594, 0x7594, - 0x75a2, 0x75a2, 0x75a2, 0x75a2, 0x7594, 0x7594, 0x7594, 0x7594, - 0x7594, 0x75a2, 0x7594, 0x75a2, 0x1078, 0x1332, 0x6824, 0xd0e4, - 0x0040, 0x759d, 0xd0cc, 0x0040, 0x75a0, 0xa00e, 0x0078, 0x75a2, - 0x2009, 0x2000, 0x6828, 0x20a2, 0x682c, 0x20a2, 0x0078, 0x75f3, - 0x1078, 0x75fd, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x2009, 0x4000, - 0x6a00, 0xa286, 0x0002, 0x00c0, 0x75b6, 0xa00e, 0x0078, 0x75f3, - 0x1078, 0x75fd, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x2009, 0x4000, - 0x0078, 0x75f3, 0x1078, 0x75fd, 0x20a3, 0x0000, 0x20a3, 0x0000, - 0x2009, 0x4000, 0xa286, 0x0005, 0x0040, 0x75d2, 0xa286, 0x0002, - 0x00c0, 0x75d3, 0xa00e, 0x0078, 0x75f3, 0x1078, 0x75fd, 0x6810, - 0x2068, 0x697c, 0x6810, 0xa112, 0x6980, 0x6814, 0xa103, 0x20a2, - 0x22a2, 0x7928, 0xa180, 0x0000, 0x2004, 0xa08e, 0x0002, 0x0040, - 0x75f1, 0xa08e, 0x0004, 0x0040, 0x75f1, 0x2009, 0x4000, 0x0078, - 0x75f3, 0x2009, 0x0000, 0x21a2, 0x20a3, 0x0000, 0x60c3, 0x0018, - 0x1078, 0x6dfb, 0x027f, 0x0d7f, 0x007c, 0x037e, 0x047e, 0x057e, - 0x067e, 0x20a1, 0x020b, 0x1078, 0x67c2, 0xa006, 0x20a3, 0x0200, - 0x20a2, 0x7934, 0x21a2, 0x7938, 0x21a2, 0x7818, 0xa080, 0x0028, - 0x2004, 0xa092, 0x007e, 0x0048, 0x7623, 0x0d7e, 0x2069, 0xa71b, - 0x2d2c, 0x8d68, 0x2d34, 0xa0e8, 0xa835, 0x2d6c, 0x6b10, 0x6c14, - 0x0d7f, 0x0078, 0x7629, 0x2019, 0x0000, 0x6498, 0x2029, 0x0000, - 0x6630, 0x7828, 0xa080, 0x0007, 0x2004, 0xa086, 0x0003, 0x00c0, - 0x7637, 0x25a2, 0x26a2, 0x23a2, 0x24a2, 0x0078, 0x763b, 0x23a2, - 0x24a2, 0x25a2, 0x26a2, 0x067f, 0x057f, 0x047f, 0x037f, 0x007c, - 0x20a1, 0x020b, 0x1078, 0x67c2, 0x20a3, 0x0100, 0x20a3, 0x0000, - 0x20a3, 0x0009, 0x7810, 0x20a2, 0x60c3, 0x0008, 0x1078, 0x6dfb, - 0x007c, 0x20a1, 0x020b, 0x1078, 0x6728, 0x20a3, 0x1400, 0x20a3, - 0x0000, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x7828, 0x20a2, 0x782c, - 0x20a2, 0x7830, 0xa084, 0x00ff, 0x8007, 0x20a2, 0x20a3, 0x0000, - 0x60c3, 0x0010, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, - 0x67b9, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x7828, 0x20a2, 0x7810, - 0x20a2, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x007c, 0x147e, 0x20a1, - 0x020b, 0x1078, 0x7689, 0x60c3, 0x0000, 0x1078, 0x6dfb, 0x147f, - 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, - 0x2004, 0xd0bc, 0x0040, 0x76a6, 0x0d7e, 0xa0e8, 0xa835, 0x2d6c, - 0x6810, 0xa085, 0x0300, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa71b, - 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x76ae, 0x20a3, 0x0300, - 0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0819, - 0x20a3, 0x0000, 0x1078, 0x6dea, 0x22a2, 0x20a3, 0x0000, 0x2fa2, - 0x7a08, 0x22a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x007c, 0x2061, - 0xae00, 0x2a70, 0x7064, 0x704a, 0x704f, 0xae00, 0x007c, 0x0e7e, - 0x127e, 0x2071, 0xa700, 0x2091, 0x8000, 0x7548, 0xa582, 0x0010, - 0x0048, 0x76f9, 0x704c, 0x2060, 0x6000, 0xa086, 0x0000, 0x0040, - 0x76e5, 0xace0, 0x0010, 0x7058, 0xac02, 0x00c8, 0x76e1, 0x0078, - 0x76d4, 0x2061, 0xae00, 0x0078, 0x76d4, 0x6003, 0x0008, 0x8529, - 0x754a, 0xaca8, 0x0010, 0x7058, 0xa502, 0x00c8, 0x76f5, 0x754e, - 0xa085, 0x0001, 0x127f, 0x0e7f, 0x007c, 0x704f, 0xae00, 0x0078, - 0x76f0, 0xa006, 0x0078, 0x76f2, 0x0e7e, 0x2071, 0xa700, 0x7548, - 0xa582, 0x0010, 0x0048, 0x772a, 0x704c, 0x2060, 0x6000, 0xa086, - 0x0000, 0x0040, 0x7717, 0xace0, 0x0010, 0x7058, 0xac02, 0x00c8, - 0x7713, 0x0078, 0x7706, 0x2061, 0xae00, 0x0078, 0x7706, 0x6003, - 0x0008, 0x8529, 0x754a, 0xaca8, 0x0010, 0x7058, 0xa502, 0x00c8, - 0x7726, 0x754e, 0xa085, 0x0001, 0x0e7f, 0x007c, 0x704f, 0xae00, - 0x0078, 0x7722, 0xa006, 0x0078, 0x7724, 0xac82, 0xae00, 0x1048, - 0x1332, 0x2001, 0xa716, 0x2004, 0xac02, 0x10c8, 0x1332, 0xa006, - 0x6006, 0x600a, 0x600e, 0x6012, 0x6016, 0x601a, 0x601f, 0x0000, - 0x6003, 0x0000, 0x6022, 0x6026, 0x602a, 0x602e, 0x6032, 0x6036, - 0x603a, 0x603e, 0x2061, 0xa700, 0x6048, 0x8000, 0x604a, 0xa086, - 0x0001, 0x0040, 0x7754, 0x007c, 0x127e, 0x2091, 0x8000, 0x1078, - 0x62d1, 0x127f, 0x0078, 0x7753, 0x601c, 0xa084, 0x000f, 0x0079, - 0x7761, 0x776a, 0x777b, 0x7797, 0x77b3, 0x921e, 0x923a, 0x9256, - 0x776a, 0x777b, 0xa186, 0x0013, 0x00c0, 0x7773, 0x1078, 0x61cd, - 0x1078, 0x62d1, 0x007c, 0xa18e, 0x0047, 0x00c0, 0x777a, 0xa016, - 0x1078, 0x15fa, 0x007c, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8, - 0x1332, 0x1079, 0x7785, 0x067f, 0x007c, 0x7795, 0x7b00, 0x7cb2, - 0x7795, 0x7d36, 0x77cf, 0x7795, 0x7795, 0x7a92, 0x80f6, 0x7795, - 0x7795, 0x7795, 0x7795, 0x7795, 0x7795, 0x1078, 0x1332, 0x067e, - 0x6000, 0xa0b2, 0x0010, 0x10c8, 0x1332, 0x1079, 0x77a1, 0x067f, - 0x007c, 0x77b1, 0x87d3, 0x77b1, 0x77b1, 0x77b1, 0x77b1, 0x77b1, - 0x77b1, 0x8776, 0x8961, 0x77b1, 0x8803, 0x8889, 0x8803, 0x8889, - 0x77b1, 0x1078, 0x1332, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8, - 0x1332, 0x1079, 0x77bd, 0x067f, 0x007c, 0x77cd, 0x813d, 0x820e, - 0x8372, 0x84f1, 0x77cd, 0x77cd, 0x77cd, 0x8116, 0x871e, 0x8722, - 0x77cd, 0x77cd, 0x77cd, 0x77cd, 0x8752, 0x1078, 0x1332, 0xa1b6, - 0x0015, 0x00c0, 0x77d7, 0x1078, 0x772d, 0x0078, 0x77dd, 0xa1b6, - 0x0016, 0x10c0, 0x1332, 0x1078, 0x772d, 0x007c, 0x20a9, 0x000e, - 0x2e98, 0x6010, 0x20a0, 0x53a3, 0x20a9, 0x0006, 0x3310, 0x3420, - 0x9398, 0x94a0, 0x3318, 0x3428, 0x222e, 0x2326, 0xa290, 0x0002, - 0xa5a8, 0x0002, 0xa398, 0x0002, 0xa4a0, 0x0002, 0x00f0, 0x77ec, - 0x0e7e, 0x1078, 0x8d16, 0x0040, 0x7803, 0x6010, 0x2070, 0x7007, - 0x0000, 0x7037, 0x0103, 0x0e7f, 0x1078, 0x772d, 0x007c, 0x0d7e, - 0x037e, 0x7330, 0xa386, 0x0200, 0x00c0, 0x7814, 0x6018, 0x2068, - 0x6813, 0x00ff, 0x6817, 0xfffd, 0x6010, 0xa005, 0x0040, 0x781e, - 0x2068, 0x6807, 0x0000, 0x6837, 0x0103, 0x6b32, 0x1078, 0x772d, - 0x037f, 0x0d7f, 0x007c, 0x017e, 0x20a9, 0x002a, 0xae80, 0x000c, - 0x2098, 0x6010, 0xa080, 0x0002, 0x20a0, 0x53a3, 0x20a9, 0x002a, - 0x6010, 0xa080, 0x0001, 0x2004, 0xa080, 0x0002, 0x20a0, 0x53a3, - 0x0e7e, 0x6010, 0x2004, 0x2070, 0x7037, 0x0103, 0x0e7f, 0x1078, - 0x772d, 0x017f, 0x007c, 0x0e7e, 0x0d7e, 0x603f, 0x0000, 0x2c68, - 0x017e, 0x2009, 0x0035, 0x1078, 0x91cc, 0x017f, 0x00c0, 0x785f, - 0x027e, 0x6228, 0x2268, 0x027f, 0x2071, 0xac8c, 0x6b1c, 0xa386, - 0x0003, 0x0040, 0x7863, 0xa386, 0x0006, 0x0040, 0x7867, 0x1078, - 0x772d, 0x0078, 0x7869, 0x1078, 0x786c, 0x0078, 0x7869, 0x1078, - 0x7938, 0x0d7f, 0x0e7f, 0x007c, 0x0f7e, 0x6810, 0x2078, 0xa186, - 0x0015, 0x0040, 0x791d, 0xa18e, 0x0016, 0x00c0, 0x7936, 0x700c, - 0xa08c, 0xff00, 0xa186, 0x1700, 0x0040, 0x7882, 0xa186, 0x0300, - 0x00c0, 0x78f8, 0x8fff, 0x00c0, 0x788c, 0x6800, 0xa086, 0x000f, - 0x0040, 0x78db, 0x0078, 0x7934, 0x6808, 0xa086, 0xffff, 0x00c0, - 0x7921, 0x784c, 0xa084, 0x0060, 0xa086, 0x0020, 0x00c0, 0x78a2, - 0x797c, 0x7810, 0xa106, 0x00c0, 0x7921, 0x7980, 0x7814, 0xa106, - 0x00c0, 0x7921, 0x1078, 0x8ec9, 0x6830, 0x7852, 0x784c, 0xc0dc, - 0xc0f4, 0xc0d4, 0x784e, 0x027e, 0xa00e, 0x6a14, 0x2001, 0x000a, - 0x1078, 0x5c1c, 0x7854, 0xa20a, 0x0048, 0x78b7, 0x8011, 0x7a56, - 0x82ff, 0x027f, 0x00c0, 0x78c3, 0x0c7e, 0x2d60, 0x1078, 0x8af0, - 0x0c7f, 0x0078, 0x7934, 0x0c7e, 0x0d7e, 0x2f68, 0x6838, 0xd0fc, - 0x00c0, 0x78ce, 0x1078, 0x4353, 0x0078, 0x78d0, 0x1078, 0x4431, - 0x0d7f, 0x0c7f, 0x00c0, 0x7921, 0x0c7e, 0x2d60, 0x1078, 0x772d, - 0x0c7f, 0x0078, 0x7934, 0x0c7e, 0x1078, 0x9197, 0x0040, 0x78f1, - 0x6013, 0x0000, 0x6818, 0x601a, 0x601f, 0x0003, 0x6904, 0x0c7e, - 0x2d60, 0x1078, 0x772d, 0x0c7f, 0x1078, 0x775c, 0x0c7f, 0x0078, - 0x7934, 0x2001, 0xa9a4, 0x2004, 0x683e, 0x0c7f, 0x0078, 0x7934, - 0x7008, 0xa086, 0x000b, 0x00c0, 0x7912, 0x6018, 0x200c, 0xc1bc, - 0x2102, 0x0c7e, 0x2d60, 0x7853, 0x0003, 0x6007, 0x0085, 0x6003, - 0x000b, 0x601f, 0x0002, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0c7f, - 0x0078, 0x7934, 0x700c, 0xa086, 0x2a00, 0x00c0, 0x7921, 0x2001, - 0xa9a4, 0x2004, 0x683e, 0x0078, 0x7934, 0x1078, 0x7953, 0x0078, - 0x7936, 0x8fff, 0x1040, 0x1332, 0x0c7e, 0x0d7e, 0x2d60, 0x2f68, - 0x6837, 0x0103, 0x684b, 0x0003, 0x1078, 0x89df, 0x1078, 0x8ec9, - 0x1078, 0x8ed6, 0x0d7f, 0x0c7f, 0x1078, 0x772d, 0x0f7f, 0x007c, - 0xa186, 0x0015, 0x00c0, 0x7942, 0x2001, 0xa9a4, 0x2004, 0x683e, - 0x0078, 0x7950, 0xa18e, 0x0016, 0x00c0, 0x7952, 0x0c7e, 0x2d00, - 0x2060, 0x1078, 0xa4a5, 0x1078, 0x5bc1, 0x1078, 0x772d, 0x0c7f, - 0x1078, 0x772d, 0x007c, 0x027e, 0x037e, 0x047e, 0x7228, 0x7c80, - 0x7b7c, 0xd2f4, 0x0040, 0x7962, 0x2001, 0xa9a4, 0x2004, 0x683e, - 0x0078, 0x79c6, 0x0c7e, 0x2d60, 0x1078, 0x8a03, 0x0c7f, 0x6804, - 0xa086, 0x0050, 0x00c0, 0x797a, 0x0c7e, 0x2d00, 0x2060, 0x6003, - 0x0001, 0x6007, 0x0050, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0c7f, - 0x0078, 0x79c6, 0x6800, 0xa086, 0x000f, 0x0040, 0x799c, 0x8fff, - 0x1040, 0x1332, 0x6824, 0xd0dc, 0x00c0, 0x799c, 0x6800, 0xa086, - 0x0004, 0x00c0, 0x79a1, 0x784c, 0xd0ac, 0x0040, 0x79a1, 0x784c, - 0xc0dc, 0xc0f4, 0x784e, 0x7850, 0xc0f4, 0xc0fc, 0x7852, 0x2001, - 0x0001, 0x682e, 0x0078, 0x79c0, 0x2001, 0x0007, 0x682e, 0x0078, - 0x79c0, 0x784c, 0xd0b4, 0x00c0, 0x79ae, 0xd0ac, 0x0040, 0x799c, - 0x784c, 0xd0f4, 0x00c0, 0x799c, 0x0078, 0x798f, 0xd2ec, 0x00c0, - 0x799c, 0x7024, 0xa306, 0x00c0, 0x79b9, 0x7020, 0xa406, 0x0040, - 0x799c, 0x7020, 0x6836, 0x7024, 0x683a, 0x2001, 0x0005, 0x682e, - 0x1078, 0x9000, 0x1078, 0x62d1, 0x0078, 0x79c8, 0x1078, 0x772d, - 0x047f, 0x037f, 0x027f, 0x007c, 0x0e7e, 0x0d7e, 0x027e, 0x6034, - 0x2068, 0x6a1c, 0xa286, 0x0007, 0x0040, 0x7a35, 0xa286, 0x0002, - 0x0040, 0x7a35, 0xa286, 0x0000, 0x0040, 0x7a35, 0x6808, 0x6338, - 0xa306, 0x00c0, 0x7a35, 0x2071, 0xac8c, 0xa186, 0x0015, 0x0040, - 0x7a2f, 0xa18e, 0x0016, 0x00c0, 0x7a02, 0x6030, 0xa084, 0x00ff, - 0xa086, 0x0001, 0x00c0, 0x7a02, 0x700c, 0xa086, 0x2a00, 0x00c0, - 0x7a02, 0x6034, 0xa080, 0x0009, 0x200c, 0xc1dd, 0xc1f5, 0x2102, - 0x0078, 0x7a2f, 0x0c7e, 0x6034, 0x2060, 0x6104, 0xa186, 0x004b, - 0x0040, 0x7a22, 0xa186, 0x004c, 0x0040, 0x7a22, 0xa186, 0x004d, - 0x0040, 0x7a22, 0xa186, 0x004e, 0x0040, 0x7a22, 0xa186, 0x0052, - 0x0040, 0x7a22, 0x6010, 0x2068, 0x1078, 0x8d16, 0x1040, 0x1332, - 0x6853, 0x0003, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, - 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0c7f, 0x0078, 0x7a35, 0x6034, - 0x2068, 0x2001, 0xa9a4, 0x2004, 0x683e, 0x1078, 0x772d, 0x027f, - 0x0d7f, 0x0e7f, 0x007c, 0x0d7e, 0x20a9, 0x000e, 0x2e98, 0x6010, - 0x20a0, 0x53a3, 0xa1b6, 0x0015, 0x00c0, 0x7a73, 0x6018, 0x2068, - 0x157e, 0x037e, 0x027e, 0xae90, 0x000c, 0xa290, 0x0004, 0x20a9, - 0x0004, 0xad98, 0x000a, 0x1078, 0x80de, 0x027f, 0x037f, 0x157f, - 0x00c0, 0x7a76, 0x157e, 0x037e, 0x027e, 0xae90, 0x000c, 0xa290, - 0x0008, 0x20a9, 0x0004, 0xad98, 0x0006, 0x1078, 0x80de, 0x027f, - 0x037f, 0x157f, 0x00c0, 0x7a76, 0x7038, 0x680a, 0x703c, 0x680e, - 0x6800, 0xc08d, 0x6802, 0x0d7f, 0x0078, 0x77f8, 0x1078, 0x2880, - 0x0c7e, 0x1078, 0x76c7, 0x2f00, 0x601a, 0x6013, 0x0000, 0x601f, - 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007, 0x1078, - 0x4502, 0x1078, 0x4535, 0x1078, 0x5dd7, 0x1078, 0x62d1, 0x0c7f, - 0x0078, 0x7a73, 0x2100, 0xa1b2, 0x0044, 0x10c8, 0x1332, 0xa1b2, - 0x0040, 0x00c8, 0x7af7, 0x0079, 0x7a9d, 0x7aeb, 0x7adf, 0x7aeb, - 0x7aeb, 0x7aeb, 0x7aeb, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, - 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, - 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, - 0x7add, 0x7add, 0x7add, 0x7add, 0x7aeb, 0x7add, 0x7aeb, 0x7aeb, - 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7aeb, 0x7add, 0x7add, - 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7aeb, - 0x7aeb, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, - 0x7add, 0x7add, 0x7aeb, 0x7add, 0x7add, 0x1078, 0x1332, 0x6003, - 0x0001, 0x6106, 0x1078, 0x5dd7, 0x127e, 0x2091, 0x8000, 0x1078, - 0x62d1, 0x127f, 0x007c, 0x6003, 0x0001, 0x6106, 0x1078, 0x5dd7, - 0x127e, 0x2091, 0x8000, 0x1078, 0x62d1, 0x127f, 0x007c, 0x2600, - 0x0079, 0x7afa, 0x7afe, 0x7afe, 0x7afe, 0x7aeb, 0x1078, 0x1332, - 0x6004, 0xa0b2, 0x0044, 0x10c8, 0x1332, 0xa1b6, 0x0013, 0x00c0, - 0x7b10, 0xa0b2, 0x0040, 0x00c8, 0x7c79, 0x2008, 0x0079, 0x7bbf, - 0xa1b6, 0x0027, 0x00c0, 0x7b7c, 0x1078, 0x61cd, 0x6004, 0x1078, - 0x8efc, 0x0040, 0x7b2d, 0x1078, 0x8f10, 0x0040, 0x7b74, 0xa08e, - 0x0021, 0x0040, 0x7b78, 0xa08e, 0x0022, 0x0040, 0x7b74, 0xa08e, - 0x003d, 0x0040, 0x7b78, 0x0078, 0x7b6f, 0x1078, 0x28a6, 0x2001, - 0x0007, 0x1078, 0x4502, 0x6018, 0xa080, 0x0028, 0x200c, 0x1078, - 0x7c83, 0xa186, 0x007e, 0x00c0, 0x7b42, 0x2001, 0xa733, 0x2014, - 0xc285, 0x2202, 0x017e, 0x027e, 0x037e, 0x2110, 0x027e, 0x2019, - 0x0028, 0x1078, 0x73d0, 0x027f, 0x1078, 0xa501, 0x037f, 0x027f, - 0x017f, 0x017e, 0x027e, 0x037e, 0x2110, 0x2019, 0x0028, 0x1078, - 0x5f01, 0x077e, 0x2039, 0x0000, 0x1078, 0x5e0a, 0x0c7e, 0x6018, - 0xa065, 0x0040, 0x7b65, 0x1078, 0x47e9, 0x0c7f, 0x2c08, 0x1078, - 0x9f9b, 0x077f, 0x037f, 0x027f, 0x017f, 0x1078, 0x457f, 0x1078, - 0x772d, 0x1078, 0x62d1, 0x007c, 0x1078, 0x7c83, 0x0078, 0x7b6f, - 0x1078, 0x7ca6, 0x0078, 0x7b6f, 0xa186, 0x0014, 0x00c0, 0x7b73, - 0x1078, 0x61cd, 0x1078, 0x2880, 0x1078, 0x8efc, 0x00c0, 0x7b9b, - 0x1078, 0x28a6, 0x6018, 0xa080, 0x0028, 0x200c, 0x1078, 0x7c83, - 0xa186, 0x007e, 0x00c0, 0x7b99, 0x2001, 0xa733, 0x200c, 0xc185, - 0x2102, 0x0078, 0x7b6f, 0x1078, 0x8f10, 0x00c0, 0x7ba3, 0x1078, - 0x7c83, 0x0078, 0x7b6f, 0x6004, 0xa08e, 0x0032, 0x00c0, 0x7bb4, - 0x0e7e, 0x0f7e, 0x2071, 0xa782, 0x2079, 0x0000, 0x1078, 0x2bd7, - 0x0f7f, 0x0e7f, 0x0078, 0x7b6f, 0x6004, 0xa08e, 0x0021, 0x0040, - 0x7b9f, 0xa08e, 0x0022, 0x1040, 0x7c83, 0x0078, 0x7b6f, 0x7c01, - 0x7c03, 0x7c07, 0x7c0b, 0x7c0f, 0x7c13, 0x7bff, 0x7bff, 0x7bff, - 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, - 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, - 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7c17, 0x7c29, 0x7bff, - 0x7c2b, 0x7c29, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7c29, - 0x7c29, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, - 0x7bff, 0x7c5c, 0x7c29, 0x7bff, 0x7c23, 0x7bff, 0x7bff, 0x7bff, - 0x7c25, 0x7bff, 0x7bff, 0x7bff, 0x7c29, 0x7bff, 0x7bff, 0x1078, - 0x1332, 0x0078, 0x7c29, 0x2001, 0x000b, 0x0078, 0x7c36, 0x2001, - 0x0003, 0x0078, 0x7c36, 0x2001, 0x0005, 0x0078, 0x7c36, 0x2001, - 0x0001, 0x0078, 0x7c36, 0x2001, 0x0009, 0x0078, 0x7c36, 0x1078, - 0x61cd, 0x6003, 0x0005, 0x2001, 0xa9a4, 0x2004, 0x603e, 0x1078, - 0x62d1, 0x0078, 0x7c35, 0x0078, 0x7c29, 0x0078, 0x7c29, 0x1078, - 0x4502, 0x0078, 0x7c6e, 0x1078, 0x61cd, 0x6003, 0x0004, 0x2001, - 0xa9a2, 0x2004, 0x6016, 0x1078, 0x62d1, 0x007c, 0x1078, 0x4502, - 0x1078, 0x61cd, 0x2001, 0xa9a4, 0x2004, 0x603e, 0x6003, 0x0002, - 0x037e, 0x2019, 0xa75d, 0x2304, 0xa084, 0xff00, 0x00c0, 0x7c4d, - 0x2019, 0xa9a2, 0x231c, 0x0078, 0x7c56, 0x8007, 0xa09a, 0x0004, - 0x0048, 0x7c48, 0x8003, 0x801b, 0x831b, 0xa318, 0x6316, 0x037f, - 0x1078, 0x62d1, 0x0078, 0x7c35, 0x0e7e, 0x0f7e, 0x2071, 0xa782, - 0x2079, 0x0000, 0x1078, 0x2bd7, 0x0f7f, 0x0e7f, 0x1078, 0x61cd, - 0x1078, 0x772d, 0x1078, 0x62d1, 0x0078, 0x7c35, 0x1078, 0x61cd, - 0x6003, 0x0002, 0x2001, 0xa9a2, 0x2004, 0x6016, 0x1078, 0x62d1, - 0x007c, 0x2600, 0x2008, 0x0079, 0x7c7d, 0x7c81, 0x7c81, 0x7c81, - 0x7c6e, 0x1078, 0x1332, 0x0e7e, 0x1078, 0x8d16, 0x0040, 0x7c9f, - 0x6010, 0x2070, 0x7038, 0xd0fc, 0x0040, 0x7c9f, 0x7007, 0x0000, - 0x017e, 0x6004, 0xa08e, 0x0021, 0x0040, 0x7ca1, 0xa08e, 0x003d, - 0x0040, 0x7ca1, 0x017f, 0x7037, 0x0103, 0x7033, 0x0100, 0x0e7f, - 0x007c, 0x017f, 0x1078, 0x7ca6, 0x0078, 0x7c9f, 0x0e7e, 0xacf0, - 0x0004, 0x2e74, 0x7000, 0x2070, 0x7037, 0x0103, 0x7023, 0x8001, - 0x0e7f, 0x007c, 0x0d7e, 0x6618, 0x2668, 0x6804, 0xa084, 0x00ff, - 0x0d7f, 0xa0b2, 0x000c, 0x10c8, 0x1332, 0x6604, 0xa6b6, 0x0043, - 0x00c0, 0x7cc6, 0x1078, 0x9144, 0x0078, 0x7d25, 0x6604, 0xa6b6, - 0x0033, 0x00c0, 0x7ccf, 0x1078, 0x90e8, 0x0078, 0x7d25, 0x6604, - 0xa6b6, 0x0028, 0x00c0, 0x7cd8, 0x1078, 0x8f3f, 0x0078, 0x7d25, - 0x6604, 0xa6b6, 0x0029, 0x00c0, 0x7ce1, 0x1078, 0x8f59, 0x0078, - 0x7d25, 0x6604, 0xa6b6, 0x001f, 0x00c0, 0x7cea, 0x1078, 0x77de, - 0x0078, 0x7d25, 0x6604, 0xa6b6, 0x0000, 0x00c0, 0x7cf3, 0x1078, - 0x7a3b, 0x0078, 0x7d25, 0x6604, 0xa6b6, 0x0022, 0x00c0, 0x7cfc, - 0x1078, 0x7807, 0x0078, 0x7d25, 0x6604, 0xa6b6, 0x0035, 0x00c0, - 0x7d05, 0x1078, 0x7843, 0x0078, 0x7d25, 0x6604, 0xa6b6, 0x0039, - 0x00c0, 0x7d0e, 0x1078, 0x79cc, 0x0078, 0x7d25, 0x6604, 0xa6b6, - 0x003d, 0x00c0, 0x7d17, 0x1078, 0x7823, 0x0078, 0x7d25, 0xa1b6, - 0x0015, 0x00c0, 0x7d1f, 0x1079, 0x7d2a, 0x0078, 0x7d25, 0xa1b6, - 0x0016, 0x00c0, 0x7d26, 0x1079, 0x7e7f, 0x007c, 0x1078, 0x7773, - 0x0078, 0x7d25, 0x7d4e, 0x7d51, 0x7d4e, 0x7d9c, 0x7d4e, 0x7e13, - 0x7e8b, 0x7d4e, 0x7d4e, 0x7e57, 0x7d4e, 0x7e6d, 0xa1b6, 0x0048, - 0x0040, 0x7d42, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078, - 0x15fa, 0x007c, 0x0e7e, 0xacf0, 0x0004, 0x2e74, 0x7000, 0x2070, - 0x7037, 0x0103, 0x0e7f, 0x1078, 0x772d, 0x007c, 0x0005, 0x0005, - 0x007c, 0x0e7e, 0x2071, 0xa700, 0x7080, 0xa086, 0x0074, 0x00c0, - 0x7d85, 0x1078, 0x9f6f, 0x00c0, 0x7d77, 0x0d7e, 0x6018, 0x2068, - 0x7030, 0xd08c, 0x0040, 0x7d6a, 0x6800, 0xd0bc, 0x0040, 0x7d6a, - 0xc0c5, 0x6802, 0x1078, 0x7d89, 0x0d7f, 0x2001, 0x0006, 0x1078, - 0x4502, 0x1078, 0x28a6, 0x1078, 0x772d, 0x0078, 0x7d87, 0x2001, - 0x000a, 0x1078, 0x4502, 0x1078, 0x28a6, 0x6003, 0x0001, 0x6007, - 0x0001, 0x1078, 0x5dd7, 0x0078, 0x7d87, 0x1078, 0x7dff, 0x0e7f, - 0x007c, 0x6800, 0xd084, 0x0040, 0x7d9b, 0x2001, 0x0000, 0x1078, - 0x44ee, 0x2069, 0xa752, 0x6804, 0xd0a4, 0x0040, 0x7d9b, 0x2001, - 0x0006, 0x1078, 0x4535, 0x007c, 0x0d7e, 0x2011, 0xa720, 0x2204, - 0xa086, 0x0074, 0x00c0, 0x7dfb, 0x6018, 0x2068, 0x6aa0, 0xa286, - 0x007e, 0x00c0, 0x7daf, 0x1078, 0x7f9b, 0x0078, 0x7dfd, 0x1078, - 0x7f91, 0x6018, 0x2068, 0xa080, 0x0028, 0x2014, 0xa286, 0x0080, - 0x00c0, 0x7dd3, 0x6813, 0x00ff, 0x6817, 0xfffc, 0x6010, 0xa005, - 0x0040, 0x7dc9, 0x2068, 0x6807, 0x0000, 0x6837, 0x0103, 0x6833, - 0x0200, 0x2001, 0x0006, 0x1078, 0x4502, 0x1078, 0x28a6, 0x1078, - 0x772d, 0x0078, 0x7dfd, 0x0e7e, 0x2071, 0xa733, 0x2e04, 0xd09c, - 0x0040, 0x7dee, 0x2071, 0xac80, 0x7108, 0x720c, 0xa18c, 0x00ff, - 0x00c0, 0x7de6, 0xa284, 0xff00, 0x0040, 0x7dee, 0x6018, 0x2070, - 0x70a0, 0xd0bc, 0x00c0, 0x7dee, 0x7112, 0x7216, 0x0e7f, 0x2001, - 0x0004, 0x1078, 0x4502, 0x6003, 0x0001, 0x6007, 0x0003, 0x1078, - 0x5dd7, 0x0078, 0x7dfd, 0x1078, 0x7dff, 0x0d7f, 0x007c, 0x2001, - 0x0007, 0x1078, 0x4502, 0x2001, 0xa700, 0x2004, 0xa086, 0x0003, - 0x00c0, 0x7e0e, 0x2001, 0x0007, 0x1078, 0x4535, 0x1078, 0x28a6, - 0x1078, 0x772d, 0x007c, 0x0e7e, 0x2071, 0xa700, 0x7080, 0xa086, - 0x0014, 0x00c0, 0x7e51, 0x7000, 0xa086, 0x0003, 0x00c0, 0x7e26, - 0x6010, 0xa005, 0x00c0, 0x7e26, 0x1078, 0x3699, 0x0d7e, 0x6018, - 0x2068, 0x1078, 0x4649, 0x1078, 0x7d89, 0x0d7f, 0x1078, 0x8043, - 0x00c0, 0x7e51, 0x0d7e, 0x6018, 0x2068, 0x6890, 0x0d7f, 0xa005, - 0x0040, 0x7e51, 0x2001, 0x0006, 0x1078, 0x4502, 0x0e7e, 0x6010, - 0xa005, 0x0040, 0x7e4a, 0x2070, 0x7007, 0x0000, 0x7037, 0x0103, - 0x7033, 0x0200, 0x0e7f, 0x1078, 0x28a6, 0x1078, 0x772d, 0x0078, - 0x7e55, 0x1078, 0x7c83, 0x1078, 0x7dff, 0x0e7f, 0x007c, 0x2011, - 0xa720, 0x2204, 0xa086, 0x0014, 0x00c0, 0x7e6a, 0x2001, 0x0002, - 0x1078, 0x4502, 0x6003, 0x0001, 0x6007, 0x0001, 0x1078, 0x5dd7, - 0x0078, 0x7e6c, 0x1078, 0x7dff, 0x007c, 0x2011, 0xa720, 0x2204, - 0xa086, 0x0004, 0x00c0, 0x7e7c, 0x2001, 0x0007, 0x1078, 0x4502, - 0x1078, 0x772d, 0x0078, 0x7e7e, 0x1078, 0x7dff, 0x007c, 0x7d4e, - 0x7e97, 0x7d4e, 0x7ed2, 0x7d4e, 0x7f44, 0x7e8b, 0x7d4e, 0x7d4e, - 0x7f59, 0x7d4e, 0x7f6c, 0x6604, 0xa686, 0x0003, 0x0040, 0x7e13, - 0xa6b6, 0x001e, 0x00c0, 0x7e96, 0x1078, 0x772d, 0x007c, 0x0d7e, - 0x0c7e, 0x1078, 0x7f7f, 0x00c0, 0x7ead, 0x2001, 0x0000, 0x1078, - 0x44ee, 0x2001, 0x0002, 0x1078, 0x4502, 0x6003, 0x0001, 0x6007, - 0x0002, 0x1078, 0x5dd7, 0x0078, 0x7ecf, 0x2009, 0xac8e, 0x2104, - 0xa086, 0x0009, 0x00c0, 0x7ec2, 0x6018, 0x2068, 0x6840, 0xa084, - 0x00ff, 0xa005, 0x0040, 0x7ecd, 0x8001, 0x6842, 0x6017, 0x000a, - 0x0078, 0x7ecf, 0x2009, 0xac8f, 0x2104, 0xa084, 0xff00, 0xa086, - 0x1900, 0x00c0, 0x7ecd, 0x0078, 0x7ea1, 0x1078, 0x7dff, 0x0c7f, - 0x0d7f, 0x007c, 0x1078, 0x7f8e, 0x00c0, 0x7ee6, 0x2001, 0x0000, - 0x1078, 0x44ee, 0x2001, 0x0002, 0x1078, 0x4502, 0x6003, 0x0001, - 0x6007, 0x0002, 0x1078, 0x5dd7, 0x0078, 0x7f12, 0x1078, 0x7c83, - 0x2009, 0xac8e, 0x2134, 0xa6b4, 0x00ff, 0xa686, 0x0005, 0x0040, - 0x7f13, 0xa686, 0x000b, 0x0040, 0x7f10, 0x2009, 0xac8f, 0x2104, - 0xa084, 0xff00, 0x00c0, 0x7f00, 0xa686, 0x0009, 0x0040, 0x7f13, - 0xa086, 0x1900, 0x00c0, 0x7f10, 0xa686, 0x0009, 0x0040, 0x7f13, - 0x2001, 0x0004, 0x1078, 0x4502, 0x1078, 0x772d, 0x0078, 0x7f12, - 0x1078, 0x7dff, 0x007c, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x8d16, - 0x0040, 0x7f21, 0x6838, 0xd0fc, 0x0040, 0x7f21, 0x0d7f, 0x0078, - 0x7f10, 0x6018, 0x2068, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0040, - 0x7f32, 0x8001, 0x6842, 0x6017, 0x000a, 0x6007, 0x0016, 0x0d7f, - 0x0078, 0x7f12, 0x68a0, 0xa086, 0x007e, 0x00c0, 0x7f3f, 0x0e7e, - 0x2071, 0xa700, 0x1078, 0x42b8, 0x0e7f, 0x0078, 0x7f41, 0x1078, - 0x2880, 0x0d7f, 0x0078, 0x7f10, 0x1078, 0x7f8e, 0x00c0, 0x7f54, - 0x2001, 0x0004, 0x1078, 0x4502, 0x6003, 0x0001, 0x6007, 0x0003, - 0x1078, 0x5dd7, 0x0078, 0x7f58, 0x1078, 0x7c83, 0x1078, 0x7dff, - 0x007c, 0x1078, 0x7f8e, 0x00c0, 0x7f69, 0x2001, 0x0008, 0x1078, - 0x4502, 0x6003, 0x0001, 0x6007, 0x0005, 0x1078, 0x5dd7, 0x0078, - 0x7f6b, 0x1078, 0x7dff, 0x007c, 0x1078, 0x7f8e, 0x00c0, 0x7f7c, - 0x2001, 0x000a, 0x1078, 0x4502, 0x6003, 0x0001, 0x6007, 0x0001, - 0x1078, 0x5dd7, 0x0078, 0x7f7e, 0x1078, 0x7dff, 0x007c, 0x2009, - 0xac8e, 0x2104, 0xa086, 0x0003, 0x00c0, 0x7f8d, 0x2009, 0xac8f, - 0x2104, 0xa084, 0xff00, 0xa086, 0x2a00, 0x007c, 0xa085, 0x0001, - 0x007c, 0x0c7e, 0x017e, 0xac88, 0x0006, 0x2164, 0x1078, 0x45d6, - 0x017f, 0x0c7f, 0x007c, 0x0f7e, 0x0e7e, 0x0d7e, 0x037e, 0x017e, - 0x6018, 0x2068, 0x2071, 0xa733, 0x2e04, 0xa085, 0x0003, 0x2072, - 0x1078, 0x8014, 0x0040, 0x7fd9, 0x2009, 0xa733, 0x2104, 0xc0cd, - 0x200a, 0x2001, 0xa753, 0x2004, 0xd0a4, 0x0040, 0x7fc2, 0xa006, - 0x2020, 0x2009, 0x002a, 0x1078, 0xa22d, 0x2001, 0xa70c, 0x200c, - 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0001, 0x1078, 0x284f, - 0x2071, 0xa700, 0x1078, 0x2677, 0x0c7e, 0x157e, 0x20a9, 0x0081, - 0x2009, 0x007f, 0x1078, 0x298e, 0x8108, 0x00f0, 0x7fd2, 0x157f, - 0x0c7f, 0x1078, 0x7f91, 0x6813, 0x00ff, 0x6817, 0xfffe, 0x2071, - 0xac80, 0x2079, 0x0100, 0x2e04, 0xa084, 0x00ff, 0x2069, 0xa71b, - 0x206a, 0x78e6, 0x007e, 0x8e70, 0x2e04, 0x2069, 0xa71c, 0x206a, - 0x78ea, 0xa084, 0xff00, 0x017f, 0xa105, 0x2009, 0xa726, 0x200a, - 0x2069, 0xac8e, 0x2071, 0xa99e, 0x6810, 0x2072, 0x6814, 0x7006, - 0x6818, 0x700a, 0x681c, 0x700e, 0x1078, 0x907e, 0x2001, 0x0006, - 0x1078, 0x4502, 0x1078, 0x28a6, 0x1078, 0x772d, 0x017f, 0x037f, - 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x027e, 0x037e, 0x0e7e, 0x157e, - 0x2019, 0xa726, 0x231c, 0x83ff, 0x0040, 0x803e, 0x2071, 0xac80, - 0x2e14, 0xa294, 0x00ff, 0x7004, 0xa084, 0xff00, 0xa205, 0xa306, - 0x00c0, 0x803e, 0x2011, 0xac96, 0xad98, 0x000a, 0x20a9, 0x0004, - 0x1078, 0x80de, 0x00c0, 0x803e, 0x2011, 0xac9a, 0xad98, 0x0006, - 0x20a9, 0x0004, 0x1078, 0x80de, 0x00c0, 0x803e, 0x157f, 0x0e7f, - 0x037f, 0x027f, 0x007c, 0x0e7e, 0x2071, 0xac8c, 0x7004, 0xa086, - 0x0014, 0x00c0, 0x8066, 0x7008, 0xa086, 0x0800, 0x00c0, 0x8066, - 0x700c, 0xd0ec, 0x0040, 0x8064, 0xa084, 0x0f00, 0xa086, 0x0100, - 0x00c0, 0x8064, 0x7024, 0xd0a4, 0x00c0, 0x8061, 0xd0ac, 0x0040, - 0x8064, 0xa006, 0x0078, 0x8066, 0xa085, 0x0001, 0x0e7f, 0x007c, - 0x0e7e, 0x0d7e, 0x0c7e, 0x077e, 0x057e, 0x047e, 0x027e, 0x007e, - 0x127e, 0x2091, 0x8000, 0x2029, 0xa9ba, 0x252c, 0x2021, 0xa9c0, - 0x2424, 0x2061, 0xae00, 0x2071, 0xa700, 0x7248, 0x7064, 0xa202, - 0x00c8, 0x80cc, 0x1078, 0xa252, 0x0040, 0x80c4, 0x671c, 0xa786, - 0x0001, 0x0040, 0x80c4, 0xa786, 0x0007, 0x0040, 0x80c4, 0x2500, - 0xac06, 0x0040, 0x80c4, 0x2400, 0xac06, 0x0040, 0x80c4, 0x0c7e, - 0x6000, 0xa086, 0x0004, 0x00c0, 0x809f, 0x1078, 0x1757, 0xa786, - 0x0008, 0x00c0, 0x80ae, 0x1078, 0x8f10, 0x00c0, 0x80ae, 0x0c7f, - 0x1078, 0x7c83, 0x1078, 0x8ed6, 0x0078, 0x80c4, 0x6010, 0x2068, - 0x1078, 0x8d16, 0x0040, 0x80c1, 0xa786, 0x0003, 0x00c0, 0x80d6, - 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x4a73, 0x1078, - 0x8ec9, 0x1078, 0x8ed6, 0x0c7f, 0xace0, 0x0010, 0x7058, 0xac02, - 0x00c8, 0x80cc, 0x0078, 0x807d, 0x127f, 0x007f, 0x027f, 0x047f, - 0x057f, 0x077f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0xa786, 0x0006, - 0x00c0, 0x80b8, 0x1078, 0xa1da, 0x0078, 0x80c1, 0x220c, 0x2304, - 0xa106, 0x00c0, 0x80e9, 0x8210, 0x8318, 0x00f0, 0x80de, 0xa006, - 0x007c, 0x2304, 0xa102, 0x0048, 0x80f1, 0x2001, 0x0001, 0x0078, - 0x80f3, 0x2001, 0x0000, 0xa18d, 0x0001, 0x007c, 0x6004, 0xa08a, - 0x0044, 0x10c8, 0x1332, 0x1078, 0x8efc, 0x0040, 0x8105, 0x1078, - 0x8f10, 0x0040, 0x8112, 0x0078, 0x810b, 0x1078, 0x28a6, 0x1078, - 0x8f10, 0x0040, 0x8112, 0x1078, 0x61cd, 0x1078, 0x772d, 0x1078, - 0x62d1, 0x007c, 0x1078, 0x7c83, 0x0078, 0x810b, 0xa182, 0x0040, - 0x0079, 0x811a, 0x812d, 0x812d, 0x812d, 0x812d, 0x812d, 0x812d, - 0x812d, 0x812d, 0x812d, 0x812d, 0x812d, 0x812f, 0x812f, 0x812f, - 0x812f, 0x812d, 0x812d, 0x812d, 0x812f, 0x1078, 0x1332, 0x600b, - 0xffff, 0x6003, 0x0001, 0x6106, 0x1078, 0x5d8a, 0x127e, 0x2091, - 0x8000, 0x1078, 0x62d1, 0x127f, 0x007c, 0xa186, 0x0013, 0x00c0, - 0x8146, 0x6004, 0xa082, 0x0040, 0x0079, 0x81d1, 0xa186, 0x0027, - 0x00c0, 0x8168, 0x1078, 0x61cd, 0x1078, 0x2880, 0x0d7e, 0x6110, - 0x2168, 0x1078, 0x8d16, 0x0040, 0x8162, 0x6837, 0x0103, 0x684b, - 0x0029, 0x6847, 0x0000, 0x694c, 0xc1c5, 0x694e, 0x1078, 0x4a73, - 0x1078, 0x8ec9, 0x0d7f, 0x1078, 0x772d, 0x1078, 0x62d1, 0x007c, - 0xa186, 0x0014, 0x00c0, 0x8171, 0x6004, 0xa082, 0x0040, 0x0079, - 0x8199, 0xa186, 0x0046, 0x0040, 0x817d, 0xa186, 0x0045, 0x0040, - 0x817d, 0xa186, 0x0047, 0x10c0, 0x1332, 0x2001, 0x0109, 0x2004, - 0xd084, 0x0040, 0x8196, 0x127e, 0x2091, 0x2200, 0x007e, 0x017e, - 0x027e, 0x1078, 0x5c56, 0x027f, 0x017f, 0x007f, 0x127f, 0x6000, - 0xa086, 0x0002, 0x00c0, 0x8196, 0x0078, 0x820e, 0x1078, 0x7773, - 0x007c, 0x81ae, 0x81ac, 0x81ac, 0x81ac, 0x81ac, 0x81ac, 0x81ac, - 0x81ac, 0x81ac, 0x81ac, 0x81ac, 0x81ca, 0x81ca, 0x81ca, 0x81ca, - 0x81ac, 0x81ca, 0x81ac, 0x81ca, 0x1078, 0x1332, 0x1078, 0x61cd, - 0x0d7e, 0x6110, 0x2168, 0x1078, 0x8d16, 0x0040, 0x81c4, 0x6837, - 0x0103, 0x684b, 0x0006, 0x6847, 0x0000, 0x6850, 0xc0ec, 0x6852, - 0x1078, 0x4a73, 0x1078, 0x8ec9, 0x0d7f, 0x1078, 0x772d, 0x1078, - 0x62d1, 0x007c, 0x1078, 0x61cd, 0x1078, 0x772d, 0x1078, 0x62d1, - 0x007c, 0x81e6, 0x81e4, 0x81e4, 0x81e4, 0x81e4, 0x81e4, 0x81e4, - 0x81e4, 0x81e4, 0x81e4, 0x81e4, 0x81f8, 0x81f8, 0x81f8, 0x81f8, - 0x81e4, 0x8207, 0x81e4, 0x81f8, 0x1078, 0x1332, 0x1078, 0x61cd, - 0x2001, 0xa9a4, 0x2004, 0x603e, 0x6003, 0x0002, 0x1078, 0x62d1, - 0x6010, 0xa088, 0x0013, 0x2104, 0xa085, 0x0400, 0x200a, 0x007c, - 0x1078, 0x61cd, 0x2001, 0xa9a2, 0x2004, 0x6016, 0x2001, 0xa9a4, - 0x2004, 0x603e, 0x6003, 0x000f, 0x1078, 0x62d1, 0x007c, 0x1078, - 0x61cd, 0x1078, 0x772d, 0x1078, 0x62d1, 0x007c, 0xa182, 0x0040, - 0x0079, 0x8212, 0x8225, 0x8225, 0x8225, 0x8225, 0x8225, 0x8227, - 0x8331, 0x8363, 0x8225, 0x8225, 0x8225, 0x8225, 0x8225, 0x8225, - 0x8225, 0x8225, 0x8225, 0x8225, 0x8225, 0x1078, 0x1332, 0x0e7e, - 0x0d7e, 0x603f, 0x0000, 0x2071, 0xac80, 0x7124, 0x610a, 0x2071, - 0xac8c, 0x6110, 0x2168, 0x7614, 0xa6b4, 0x0fff, 0x86ff, 0x0040, - 0x82f0, 0xa68c, 0x0c00, 0x0040, 0x8265, 0x0f7e, 0x2c78, 0x1078, - 0x4963, 0x0f7f, 0x0040, 0x8261, 0x684c, 0xd0ac, 0x0040, 0x8261, - 0x6024, 0xd0dc, 0x00c0, 0x8261, 0x6850, 0xd0bc, 0x00c0, 0x8261, - 0x7318, 0x6814, 0xa306, 0x00c0, 0x8308, 0x731c, 0x6810, 0xa31e, - 0x0040, 0x8261, 0xd6d4, 0x0040, 0x8308, 0x6b14, 0xa305, 0x00c0, - 0x8308, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff, 0xa186, - 0x0002, 0x0040, 0x8298, 0xa186, 0x0028, 0x00c0, 0x8275, 0x1078, - 0x8eea, 0x684b, 0x001c, 0x0078, 0x829a, 0xd6dc, 0x0040, 0x8291, - 0x684b, 0x0015, 0x684c, 0xd0ac, 0x0040, 0x828f, 0x6914, 0x6a10, - 0x2100, 0xa205, 0x0040, 0x828f, 0x7018, 0xa106, 0x00c0, 0x828c, - 0x701c, 0xa206, 0x0040, 0x828f, 0x6962, 0x6a5e, 0xc6dc, 0x0078, - 0x829a, 0xd6d4, 0x0040, 0x8298, 0x684b, 0x0007, 0x0078, 0x829a, - 0x684b, 0x0000, 0x6837, 0x0103, 0x6e46, 0xa01e, 0xd6c4, 0x0040, - 0x82c3, 0xa686, 0x0100, 0x00c0, 0x82ae, 0x2001, 0xac99, 0x2004, - 0xa005, 0x00c0, 0x82ae, 0xc6c4, 0x0078, 0x8236, 0x7328, 0x732c, - 0x6b56, 0x83ff, 0x0040, 0x82c3, 0xa38a, 0x0009, 0x0048, 0x82ba, - 0x2019, 0x0008, 0x037e, 0x2308, 0x2019, 0xac98, 0xad90, 0x0019, - 0x1078, 0x89f2, 0x037f, 0xd6cc, 0x0040, 0x831e, 0x7124, 0x695a, - 0x81ff, 0x0040, 0x831e, 0xa192, 0x0021, 0x00c8, 0x82dc, 0x2071, - 0xac98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x1078, 0x89f2, - 0x1078, 0x9204, 0x0078, 0x831e, 0x6838, 0xd0fc, 0x0040, 0x82e5, - 0x2009, 0x0020, 0x695a, 0x0078, 0x82cf, 0x0f7e, 0x2d78, 0x1078, - 0x898a, 0x0f7f, 0x1078, 0x9204, 0x1078, 0x89df, 0x0078, 0x8320, - 0x0f7e, 0x2c78, 0x1078, 0x4963, 0x0f7f, 0x0040, 0x830e, 0x684c, - 0xd0ac, 0x0040, 0x830e, 0x6024, 0xd0dc, 0x00c0, 0x830e, 0x6850, - 0xd0bc, 0x00c0, 0x830e, 0x6810, 0x6914, 0xa105, 0x0040, 0x830e, - 0x1078, 0x8fcf, 0x0d7f, 0x0e7f, 0x0078, 0x8330, 0x684b, 0x0000, - 0x6837, 0x0103, 0x6e46, 0x684c, 0xd0ac, 0x0040, 0x831e, 0x6810, - 0x6914, 0xa115, 0x0040, 0x831e, 0x1078, 0x84e2, 0x1078, 0x4a73, - 0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0040, 0x8328, 0x8211, 0x6a3e, - 0x1078, 0x8f99, 0x0d7f, 0x0e7f, 0x00c0, 0x8330, 0x1078, 0x772d, - 0x007c, 0x0f7e, 0x6003, 0x0003, 0x2079, 0xac8c, 0x7c04, 0x7b00, - 0x7e0c, 0x7d08, 0x6010, 0x2078, 0x784c, 0xd0ac, 0x0040, 0x8348, - 0x6003, 0x0002, 0x0f7f, 0x007c, 0x2130, 0x2228, 0x0078, 0x8354, - 0x2400, 0x797c, 0xa10a, 0x2300, 0x7a80, 0xa213, 0x2600, 0xa102, - 0x2500, 0xa203, 0x0048, 0x8344, 0x7c12, 0x7b16, 0x7e0a, 0x7d0e, - 0x0f7f, 0x603f, 0x0000, 0x2c10, 0x1078, 0x1cf0, 0x1078, 0x5df6, - 0x1078, 0x639b, 0x007c, 0x2001, 0xa9a4, 0x2004, 0x603e, 0x6003, - 0x0004, 0x6110, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078, - 0x15fa, 0x007c, 0xa182, 0x0040, 0x0079, 0x8376, 0x8389, 0x8389, - 0x8389, 0x8389, 0x8389, 0x838b, 0x8431, 0x8389, 0x8389, 0x8447, - 0x84b8, 0x8389, 0x8389, 0x8389, 0x8389, 0x84c7, 0x8389, 0x8389, - 0x8389, 0x1078, 0x1332, 0x077e, 0x0f7e, 0x0e7e, 0x0d7e, 0x2071, - 0xac8c, 0x6110, 0x2178, 0x7614, 0xa6b4, 0x0fff, 0x7e46, 0x7f4c, - 0xc7e5, 0x7f4e, 0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0040, 0x83a2, - 0x8211, 0x6a3e, 0x86ff, 0x0040, 0x842c, 0xa694, 0xff00, 0xa284, - 0x0c00, 0x0040, 0x83af, 0x7018, 0x7862, 0x701c, 0x785e, 0xa284, - 0x0300, 0x0040, 0x842c, 0x1078, 0x138b, 0x1040, 0x1332, 0x2d00, - 0x784a, 0x7f4c, 0xc7cd, 0x7f4e, 0x6837, 0x0103, 0x7838, 0x683a, - 0x783c, 0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c, 0x0c00, 0x0040, - 0x83cd, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff, 0xa186, - 0x0002, 0x0040, 0x83e9, 0xa186, 0x0028, 0x00c0, 0x83db, 0x684b, - 0x001c, 0x0078, 0x83eb, 0xd6dc, 0x0040, 0x83e2, 0x684b, 0x0015, - 0x0078, 0x83eb, 0xd6d4, 0x0040, 0x83e9, 0x684b, 0x0007, 0x0078, - 0x83eb, 0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852, 0x7854, 0x6856, - 0xa01e, 0xd6c4, 0x0040, 0x8409, 0x7328, 0x732c, 0x6b56, 0x83ff, - 0x0040, 0x8409, 0xa38a, 0x0009, 0x0048, 0x8400, 0x2019, 0x0008, - 0x037e, 0x2308, 0x2019, 0xac98, 0xad90, 0x0019, 0x1078, 0x89f2, - 0x037f, 0xd6cc, 0x0040, 0x842c, 0x7124, 0x695a, 0x81ff, 0x0040, - 0x842c, 0xa192, 0x0021, 0x00c8, 0x8420, 0x2071, 0xac98, 0x831c, - 0x2300, 0xae18, 0xad90, 0x001d, 0x1078, 0x89f2, 0x0078, 0x842c, - 0x7838, 0xd0fc, 0x0040, 0x8429, 0x2009, 0x0020, 0x695a, 0x0078, - 0x8415, 0x2d78, 0x1078, 0x898a, 0x0d7f, 0x0e7f, 0x0f7f, 0x077f, - 0x007c, 0x0f7e, 0x6003, 0x0003, 0x2079, 0xac8c, 0x7c04, 0x7b00, - 0x7e0c, 0x7d08, 0x6010, 0x2078, 0x7c12, 0x7b16, 0x7e0a, 0x7d0e, - 0x0f7f, 0x2c10, 0x1078, 0x1cf0, 0x1078, 0x6df4, 0x007c, 0x0d7e, - 0x0f7e, 0x2c78, 0x1078, 0x4963, 0x0f7f, 0x0040, 0x8453, 0x2001, - 0xa9a4, 0x2004, 0x603e, 0x6003, 0x0002, 0x1078, 0x627a, 0x1078, - 0x639b, 0x6110, 0x2168, 0x694c, 0xd1e4, 0x0040, 0x84b6, 0xd1cc, - 0x0040, 0x848d, 0x6948, 0x6838, 0xd0fc, 0x0040, 0x8485, 0x017e, - 0x684c, 0x007e, 0x6850, 0x007e, 0xad90, 0x000d, 0xa198, 0x000d, - 0x2009, 0x0020, 0x157e, 0x21a8, 0x2304, 0x2012, 0x8318, 0x8210, - 0x00f0, 0x8474, 0x157f, 0x007f, 0x6852, 0x007f, 0x684e, 0x017f, - 0x2168, 0x1078, 0x13b4, 0x0078, 0x84b0, 0x017e, 0x1078, 0x13b4, - 0x0d7f, 0x1078, 0x89df, 0x0078, 0x84b0, 0x6837, 0x0103, 0x6944, - 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x0040, 0x84ac, 0xa086, 0x0028, - 0x00c0, 0x849e, 0x684b, 0x001c, 0x0078, 0x84ae, 0xd1dc, 0x0040, - 0x84a5, 0x684b, 0x0015, 0x0078, 0x84ae, 0xd1d4, 0x0040, 0x84ac, - 0x684b, 0x0007, 0x0078, 0x84ae, 0x684b, 0x0000, 0x1078, 0x4a73, - 0x1078, 0x8f99, 0x00c0, 0x84b6, 0x1078, 0x772d, 0x0d7f, 0x007c, - 0x2019, 0x0001, 0x1078, 0x7058, 0x6003, 0x0002, 0x2001, 0xa9a4, - 0x2004, 0x603e, 0x1078, 0x627a, 0x1078, 0x639b, 0x007c, 0x1078, - 0x627a, 0x1078, 0x2880, 0x0d7e, 0x6110, 0x2168, 0x1078, 0x8d16, - 0x0040, 0x84dc, 0x6837, 0x0103, 0x684b, 0x0029, 0x6847, 0x0000, - 0x1078, 0x4a73, 0x1078, 0x8ec9, 0x0d7f, 0x1078, 0x772d, 0x1078, - 0x639b, 0x007c, 0x684b, 0x0015, 0xd1fc, 0x0040, 0x84ee, 0x684b, - 0x0007, 0x8002, 0x8000, 0x810a, 0xa189, 0x0000, 0x6962, 0x685e, - 0x007c, 0xa182, 0x0040, 0x0079, 0x84f5, 0x8508, 0x8508, 0x8508, - 0x8508, 0x8508, 0x850a, 0x8508, 0x85e0, 0x85ec, 0x8508, 0x8508, - 0x8508, 0x8508, 0x8508, 0x8508, 0x8508, 0x8508, 0x8508, 0x8508, - 0x1078, 0x1332, 0x077e, 0x0f7e, 0x0e7e, 0x0d7e, 0x2071, 0xac8c, - 0x6110, 0x2178, 0x7614, 0xa6b4, 0x0fff, 0x0f7e, 0x2c78, 0x1078, - 0x4963, 0x0f7f, 0x0040, 0x8528, 0xa684, 0x00ff, 0x00c0, 0x8528, - 0x6024, 0xd0f4, 0x0040, 0x8528, 0x1078, 0x8fcf, 0x0078, 0x85db, - 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, 0x6218, 0x2268, 0x6a3c, 0x82ff, - 0x0040, 0x8534, 0x8211, 0x6a3e, 0x86ff, 0x0040, 0x85d0, 0xa694, - 0xff00, 0xa284, 0x0c00, 0x0040, 0x8541, 0x7018, 0x7862, 0x701c, - 0x785e, 0xa284, 0x0300, 0x0040, 0x85cd, 0xa686, 0x0100, 0x00c0, - 0x8553, 0x2001, 0xac99, 0x2004, 0xa005, 0x00c0, 0x8553, 0xc6c4, - 0x7e46, 0x0078, 0x8534, 0x1078, 0x138b, 0x1040, 0x1332, 0x2d00, - 0x784a, 0x7f4c, 0xa7bd, 0x0200, 0x7f4e, 0x6837, 0x0103, 0x7838, - 0x683a, 0x783c, 0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c, 0x0c00, - 0x0040, 0x856e, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff, - 0xa186, 0x0002, 0x0040, 0x858a, 0xa186, 0x0028, 0x00c0, 0x857c, - 0x684b, 0x001c, 0x0078, 0x858c, 0xd6dc, 0x0040, 0x8583, 0x684b, - 0x0015, 0x0078, 0x858c, 0xd6d4, 0x0040, 0x858a, 0x684b, 0x0007, - 0x0078, 0x858c, 0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852, 0x7854, - 0x6856, 0xa01e, 0xd6c4, 0x0040, 0x85aa, 0x7328, 0x732c, 0x6b56, - 0x83ff, 0x0040, 0x85aa, 0xa38a, 0x0009, 0x0048, 0x85a1, 0x2019, - 0x0008, 0x037e, 0x2308, 0x2019, 0xac98, 0xad90, 0x0019, 0x1078, - 0x89f2, 0x037f, 0xd6cc, 0x0040, 0x85cd, 0x7124, 0x695a, 0x81ff, - 0x0040, 0x85cd, 0xa192, 0x0021, 0x00c8, 0x85c1, 0x2071, 0xac98, - 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x1078, 0x89f2, 0x0078, - 0x85cd, 0x7838, 0xd0fc, 0x0040, 0x85ca, 0x2009, 0x0020, 0x695a, - 0x0078, 0x85b6, 0x2d78, 0x1078, 0x898a, 0xd6dc, 0x00c0, 0x85d3, - 0xa006, 0x0078, 0x85d9, 0x2001, 0x0001, 0x2071, 0xac8c, 0x7218, - 0x731c, 0x1078, 0x1653, 0x0d7f, 0x0e7f, 0x0f7f, 0x077f, 0x007c, - 0x2001, 0xa9a4, 0x2004, 0x603e, 0x20e1, 0x0005, 0x3d18, 0x3e20, - 0x2c10, 0x1078, 0x15fa, 0x007c, 0x2001, 0xa9a4, 0x2004, 0x603e, - 0x0d7e, 0x6003, 0x0002, 0x6110, 0x2168, 0x694c, 0xd1e4, 0x0040, - 0x871c, 0x603f, 0x0000, 0x0f7e, 0x2c78, 0x1078, 0x4963, 0x0f7f, - 0x0040, 0x8632, 0x6814, 0x6910, 0xa115, 0x0040, 0x8632, 0x6a60, - 0xa206, 0x00c0, 0x860f, 0x685c, 0xa106, 0x0040, 0x8632, 0x684c, - 0xc0e4, 0x684e, 0x6847, 0x0000, 0x6863, 0x0000, 0x685f, 0x0000, - 0x6024, 0xd0f4, 0x00c0, 0x8627, 0x697c, 0x6810, 0xa102, 0x603a, - 0x6980, 0x6814, 0xa103, 0x6036, 0x6024, 0xc0f5, 0x6026, 0x0d7e, - 0x6018, 0x2068, 0x683c, 0x8000, 0x683e, 0x0d7f, 0x1078, 0x8fcf, - 0x0078, 0x871c, 0x694c, 0xd1cc, 0x0040, 0x86e1, 0x6948, 0x6838, - 0xd0fc, 0x0040, 0x8699, 0x017e, 0x684c, 0x007e, 0x6850, 0x007e, - 0x0f7e, 0x2178, 0x7944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x0040, - 0x866c, 0xa086, 0x0028, 0x00c0, 0x8653, 0x684b, 0x001c, 0x784b, - 0x001c, 0x0078, 0x8677, 0xd1dc, 0x0040, 0x8663, 0x684b, 0x0015, - 0x784b, 0x0015, 0x1078, 0x917c, 0x0040, 0x8661, 0x7944, 0xc1dc, - 0x7946, 0x0078, 0x8677, 0xd1d4, 0x0040, 0x866c, 0x684b, 0x0007, - 0x784b, 0x0007, 0x0078, 0x8677, 0x684c, 0xd0ac, 0x0040, 0x8677, - 0x6810, 0x6914, 0xa115, 0x0040, 0x8677, 0x1078, 0x84e2, 0x6848, - 0x784a, 0x6860, 0x7862, 0x685c, 0x785e, 0xad90, 0x000d, 0xaf98, - 0x000d, 0x2009, 0x0020, 0x157e, 0x21a8, 0x2304, 0x2012, 0x8318, - 0x8210, 0x00f0, 0x8685, 0x157f, 0x0f7f, 0x007f, 0x6852, 0x007f, - 0x684e, 0x1078, 0x9204, 0x017f, 0x2168, 0x1078, 0x13b4, 0x0078, - 0x8716, 0x017e, 0x0f7e, 0x2178, 0x7944, 0xa184, 0x00ff, 0xa0b6, - 0x0002, 0x0040, 0x86c6, 0xa086, 0x0028, 0x00c0, 0x86ad, 0x684b, - 0x001c, 0x784b, 0x001c, 0x0078, 0x86d1, 0xd1dc, 0x0040, 0x86bd, - 0x684b, 0x0015, 0x784b, 0x0015, 0x1078, 0x917c, 0x0040, 0x86bb, - 0x7944, 0xc1dc, 0x7946, 0x0078, 0x86d1, 0xd1d4, 0x0040, 0x86c6, - 0x684b, 0x0007, 0x784b, 0x0007, 0x0078, 0x86d1, 0x684c, 0xd0ac, - 0x0040, 0x86d1, 0x6810, 0x6914, 0xa115, 0x0040, 0x86d1, 0x1078, - 0x84e2, 0x6860, 0x7862, 0x685c, 0x785e, 0x684c, 0x784e, 0x0f7f, - 0x1078, 0x13b4, 0x0d7f, 0x1078, 0x9204, 0x1078, 0x89df, 0x0078, - 0x8716, 0x6837, 0x0103, 0x6944, 0xa184, 0x00ff, 0xa0b6, 0x0002, - 0x0040, 0x8707, 0xa086, 0x0028, 0x00c0, 0x86f2, 0x684b, 0x001c, - 0x0078, 0x8714, 0xd1dc, 0x0040, 0x8700, 0x684b, 0x0015, 0x1078, - 0x917c, 0x0040, 0x86fe, 0x6944, 0xc1dc, 0x6946, 0x0078, 0x8714, - 0xd1d4, 0x0040, 0x8707, 0x684b, 0x0007, 0x0078, 0x8714, 0x684b, - 0x0000, 0x684c, 0xd0ac, 0x0040, 0x8714, 0x6810, 0x6914, 0xa115, - 0x0040, 0x8714, 0x1078, 0x84e2, 0x1078, 0x4a73, 0x1078, 0x8f99, - 0x00c0, 0x871c, 0x1078, 0x772d, 0x0d7f, 0x007c, 0x1078, 0x61cd, - 0x0078, 0x8724, 0x1078, 0x627a, 0x1078, 0x8d16, 0x0040, 0x8743, - 0x0d7e, 0x6110, 0x2168, 0x6837, 0x0103, 0x2009, 0xa70c, 0x210c, - 0xd18c, 0x00c0, 0x874e, 0xd184, 0x00c0, 0x874a, 0x6108, 0x694a, - 0xa18e, 0x0029, 0x00c0, 0x873e, 0x1078, 0xa4f2, 0x6847, 0x0000, - 0x1078, 0x4a73, 0x0d7f, 0x1078, 0x772d, 0x1078, 0x62d1, 0x1078, - 0x639b, 0x007c, 0x684b, 0x0004, 0x0078, 0x873e, 0x684b, 0x0004, - 0x0078, 0x873e, 0xa182, 0x0040, 0x0079, 0x8756, 0x8769, 0x8769, - 0x8769, 0x8769, 0x8769, 0x876b, 0x8769, 0x876e, 0x8769, 0x8769, - 0x8769, 0x8769, 0x8769, 0x8769, 0x8769, 0x8769, 0x8769, 0x8769, - 0x8769, 0x1078, 0x1332, 0x1078, 0x772d, 0x007c, 0x007e, 0x027e, - 0xa016, 0x1078, 0x15fa, 0x027f, 0x007f, 0x007c, 0xa182, 0x0085, - 0x0079, 0x877a, 0x8783, 0x8781, 0x8781, 0x878f, 0x8781, 0x8781, - 0x8781, 0x1078, 0x1332, 0x6003, 0x0001, 0x6106, 0x1078, 0x5d8a, - 0x127e, 0x2091, 0x8000, 0x1078, 0x62d1, 0x127f, 0x007c, 0x027e, - 0x057e, 0x0d7e, 0x0e7e, 0x2071, 0xac80, 0x7224, 0x6212, 0x7220, - 0x1078, 0x8d02, 0x0040, 0x87b4, 0x2268, 0x6800, 0xa086, 0x0000, - 0x0040, 0x87b4, 0x6018, 0x6d18, 0xa52e, 0x00c0, 0x87b4, 0x0c7e, - 0x2d60, 0x1078, 0x8a03, 0x0c7f, 0x0040, 0x87b4, 0x6803, 0x0002, - 0x6007, 0x0086, 0x0078, 0x87b6, 0x6007, 0x0087, 0x6003, 0x0001, - 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0f7e, 0x2278, 0x1078, 0x4963, - 0x0f7f, 0x0040, 0x87ce, 0x6824, 0xd0ec, 0x0040, 0x87ce, 0x0c7e, - 0x2260, 0x603f, 0x0000, 0x1078, 0x8fcf, 0x0c7f, 0x0e7f, 0x0d7f, - 0x057f, 0x027f, 0x007c, 0xa186, 0x0013, 0x00c0, 0x87e4, 0x6004, - 0xa08a, 0x0085, 0x1048, 0x1332, 0xa08a, 0x008c, 0x10c8, 0x1332, - 0xa082, 0x0085, 0x0079, 0x87f3, 0xa186, 0x0027, 0x0040, 0x87ec, - 0xa186, 0x0014, 0x10c0, 0x1332, 0x1078, 0x61cd, 0x1078, 0x8ed6, - 0x1078, 0x62d1, 0x007c, 0x87fa, 0x87fc, 0x87fc, 0x87fa, 0x87fa, - 0x87fa, 0x87fa, 0x1078, 0x1332, 0x1078, 0x61cd, 0x1078, 0x8ed6, - 0x1078, 0x62d1, 0x007c, 0xa186, 0x0013, 0x00c0, 0x880d, 0x6004, - 0xa082, 0x0085, 0x2008, 0x0078, 0x8848, 0xa186, 0x0027, 0x00c0, - 0x8830, 0x1078, 0x61cd, 0x1078, 0x2880, 0x0d7e, 0x6010, 0x2068, - 0x1078, 0x8d16, 0x0040, 0x8826, 0x6837, 0x0103, 0x6847, 0x0000, - 0x684b, 0x0029, 0x1078, 0x4a73, 0x1078, 0x8ec9, 0x0d7f, 0x1078, - 0x772d, 0x1078, 0x62d1, 0x007c, 0x1078, 0x7773, 0x0078, 0x882b, - 0xa186, 0x0014, 0x00c0, 0x882c, 0x1078, 0x61cd, 0x0d7e, 0x6010, - 0x2068, 0x1078, 0x8d16, 0x0040, 0x8826, 0x6837, 0x0103, 0x6847, - 0x0000, 0x684b, 0x0006, 0x6850, 0xc0ec, 0x6852, 0x0078, 0x8822, - 0x0079, 0x884a, 0x8853, 0x8851, 0x8851, 0x8851, 0x8851, 0x8851, - 0x886e, 0x1078, 0x1332, 0x1078, 0x61cd, 0x6030, 0xa08c, 0xff00, - 0x810f, 0xa186, 0x0039, 0x0040, 0x8861, 0xa186, 0x0035, 0x00c0, - 0x8865, 0x2001, 0xa9a2, 0x0078, 0x8867, 0x2001, 0xa9a3, 0x2004, - 0x6016, 0x6003, 0x000c, 0x1078, 0x62d1, 0x007c, 0x1078, 0x61cd, - 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0040, 0x887c, - 0xa186, 0x0035, 0x00c0, 0x8880, 0x2001, 0xa9a2, 0x0078, 0x8882, - 0x2001, 0xa9a3, 0x2004, 0x6016, 0x6003, 0x000e, 0x1078, 0x62d1, - 0x007c, 0xa182, 0x008c, 0x00c8, 0x8893, 0xa182, 0x0085, 0x0048, - 0x8893, 0x0079, 0x8896, 0x1078, 0x7773, 0x007c, 0x889d, 0x889d, - 0x889d, 0x889d, 0x889f, 0x88fc, 0x889d, 0x1078, 0x1332, 0x0f7e, - 0x2c78, 0x1078, 0x4963, 0x0f7f, 0x0040, 0x88b2, 0x6030, 0xa08c, - 0xff00, 0x810f, 0xa186, 0x0039, 0x0040, 0x8913, 0xa186, 0x0035, - 0x0040, 0x8913, 0x0d7e, 0x1078, 0x8d16, 0x00c0, 0x88bb, 0x1078, - 0x8ec9, 0x0078, 0x88de, 0x6010, 0x2068, 0x684c, 0xd0e4, 0x00c0, - 0x88c3, 0x1078, 0x8ec9, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0040, - 0x88cf, 0x684b, 0x0006, 0xc0ec, 0x6852, 0x0078, 0x88da, 0xd0bc, - 0x0040, 0x88d6, 0x684b, 0x0002, 0x0078, 0x88da, 0x684b, 0x0005, - 0x1078, 0x8f95, 0x6847, 0x0000, 0x1078, 0x4a73, 0x2c68, 0x1078, - 0x76c7, 0x0040, 0x88f7, 0x6003, 0x0001, 0x6007, 0x001e, 0x2009, - 0xac8e, 0x210c, 0x6136, 0x2009, 0xac8f, 0x210c, 0x613a, 0x6918, - 0x611a, 0x6920, 0x6122, 0x601f, 0x0001, 0x1078, 0x5d8a, 0x2d60, - 0x1078, 0x772d, 0x0d7f, 0x007c, 0x0f7e, 0x2c78, 0x1078, 0x4963, - 0x0f7f, 0x0040, 0x8939, 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, - 0x0035, 0x0040, 0x8913, 0xa186, 0x001e, 0x0040, 0x8913, 0xa186, - 0x0039, 0x00c0, 0x8939, 0x0d7e, 0x2c68, 0x1078, 0x91cc, 0x00c0, - 0x895d, 0x1078, 0x76c7, 0x0040, 0x8936, 0x6106, 0x6003, 0x0001, - 0x601f, 0x0001, 0x6918, 0x611a, 0x6928, 0x612a, 0x692c, 0x612e, - 0x6930, 0xa18c, 0x00ff, 0x6132, 0x6934, 0x6136, 0x6938, 0x613a, - 0x6920, 0x6122, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x2d60, 0x0078, - 0x895d, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x8d16, 0x0040, 0x895d, - 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0040, 0x894c, 0xc0ec, 0x6852, - 0x684b, 0x0006, 0x0078, 0x8957, 0xd0bc, 0x0040, 0x8953, 0x684b, - 0x0002, 0x0078, 0x8957, 0x684b, 0x0005, 0x1078, 0x8f95, 0x6847, - 0x0000, 0x1078, 0x4a73, 0x1078, 0x8ec9, 0x0d7f, 0x1078, 0x772d, - 0x007c, 0x017e, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x8d16, 0x0040, - 0x8971, 0x6837, 0x0103, 0x684b, 0x0028, 0x6847, 0x0000, 0x1078, - 0x4a73, 0x0d7f, 0x017f, 0xa186, 0x0013, 0x0040, 0x8983, 0xa186, - 0x0014, 0x0040, 0x8983, 0xa186, 0x0027, 0x0040, 0x8983, 0x1078, - 0x7773, 0x0078, 0x8989, 0x1078, 0x61cd, 0x1078, 0x8ed6, 0x1078, - 0x62d1, 0x007c, 0x057e, 0x067e, 0x0d7e, 0x0f7e, 0x2029, 0x0001, - 0xa182, 0x0101, 0x00c8, 0x8996, 0x0078, 0x8998, 0x2009, 0x0100, - 0x2130, 0x2069, 0xac98, 0x831c, 0x2300, 0xad18, 0x2009, 0x0020, - 0xaf90, 0x001d, 0x1078, 0x89f2, 0xa6b2, 0x0020, 0x7804, 0xa06d, - 0x0040, 0x89ac, 0x1078, 0x13b4, 0x1078, 0x138b, 0x0040, 0x89d6, - 0x8528, 0x6837, 0x0110, 0x683b, 0x0000, 0x2d20, 0x7c06, 0xa68a, - 0x003d, 0x00c8, 0x89c2, 0x2608, 0xad90, 0x000f, 0x1078, 0x89f2, - 0x0078, 0x89d6, 0xa6b2, 0x003c, 0x2009, 0x003c, 0x2d78, 0xad90, - 0x000f, 0x1078, 0x89f2, 0x0078, 0x89ac, 0x0f7f, 0x852f, 0xa5ad, - 0x0003, 0x7d36, 0xa5ac, 0x0000, 0x0078, 0x89db, 0x0f7f, 0x852f, - 0xa5ad, 0x0003, 0x7d36, 0x0d7f, 0x067f, 0x057f, 0x007c, 0x0f7e, - 0x8dff, 0x0040, 0x89f0, 0x6804, 0xa07d, 0x0040, 0x89ee, 0x6807, - 0x0000, 0x1078, 0x4a73, 0x2f68, 0x0078, 0x89e3, 0x1078, 0x4a73, - 0x0f7f, 0x007c, 0x157e, 0xa184, 0x0001, 0x0040, 0x89f8, 0x8108, - 0x810c, 0x21a8, 0x2304, 0x8007, 0x2012, 0x8318, 0x8210, 0x00f0, - 0x89fa, 0x157f, 0x007c, 0x067e, 0x127e, 0x2091, 0x8000, 0x2031, - 0x0001, 0x601c, 0xa084, 0x000f, 0x1079, 0x8a1f, 0x127f, 0x067f, - 0x007c, 0x127e, 0x2091, 0x8000, 0x067e, 0x2031, 0x0000, 0x601c, - 0xa084, 0x000f, 0x1079, 0x8a1f, 0x067f, 0x127f, 0x007c, 0x8a39, - 0x8a27, 0x8a34, 0x8a55, 0x8a27, 0x8a34, 0x8a55, 0x8a34, 0x1078, - 0x1332, 0x037e, 0x2019, 0x0010, 0x1078, 0x9dd7, 0x601f, 0x0006, - 0x6003, 0x0007, 0x037f, 0x007c, 0xa006, 0x007c, 0xa085, 0x0001, - 0x007c, 0x0d7e, 0x86ff, 0x00c0, 0x8a50, 0x6010, 0x2068, 0x1078, - 0x8d16, 0x0040, 0x8a52, 0xa00e, 0x2001, 0x0005, 0x1078, 0x4b51, - 0x1078, 0x8f95, 0x1078, 0x4a73, 0x1078, 0x772d, 0xa085, 0x0001, - 0x0d7f, 0x007c, 0xa006, 0x0078, 0x8a50, 0x6000, 0xa08a, 0x0010, - 0x10c8, 0x1332, 0x1079, 0x8a5d, 0x007c, 0x8a6d, 0x8a92, 0x8a6f, - 0x8ab5, 0x8a8e, 0x8a6d, 0x8a34, 0x8a39, 0x8a39, 0x8a34, 0x8a34, - 0x8a34, 0x8a34, 0x8a34, 0x8a34, 0x8a34, 0x1078, 0x1332, 0x86ff, - 0x00c0, 0x8a8b, 0x601c, 0xa086, 0x0006, 0x0040, 0x8a8b, 0x0d7e, - 0x6010, 0x2068, 0x1078, 0x8d16, 0x0040, 0x8a80, 0x1078, 0x8f95, - 0x0d7f, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x1078, - 0x5d8a, 0x1078, 0x62d1, 0xa085, 0x0001, 0x007c, 0x1078, 0x1757, - 0x0078, 0x8a6f, 0x0e7e, 0x2071, 0xa9b1, 0x7024, 0xac06, 0x00c0, - 0x8a9b, 0x1078, 0x6fc4, 0x601c, 0xa084, 0x000f, 0xa086, 0x0006, - 0x00c0, 0x8aad, 0x087e, 0x097e, 0x2049, 0x0001, 0x2c40, 0x1078, - 0x7246, 0x097f, 0x087f, 0x0078, 0x8aaf, 0x1078, 0x6ebe, 0x0e7f, - 0x00c0, 0x8a6f, 0x1078, 0x8a34, 0x007c, 0x037e, 0x0e7e, 0x2071, - 0xa9b1, 0x703c, 0xac06, 0x00c0, 0x8ac5, 0x2019, 0x0000, 0x1078, - 0x7058, 0x0e7f, 0x037f, 0x0078, 0x8a6f, 0x1078, 0x738a, 0x0e7f, - 0x037f, 0x00c0, 0x8a6f, 0x1078, 0x8a34, 0x007c, 0x0c7e, 0x601c, - 0xa084, 0x000f, 0x1079, 0x8ad6, 0x0c7f, 0x007c, 0x8ae5, 0x8b57, - 0x8c8f, 0x8af0, 0x8ed6, 0x8ae5, 0x9dc8, 0x772d, 0x8b57, 0x1078, - 0x8f10, 0x00c0, 0x8ae5, 0x1078, 0x7c83, 0x007c, 0x1078, 0x61cd, - 0x1078, 0x62d1, 0x1078, 0x772d, 0x007c, 0x6017, 0x0001, 0x007c, - 0x1078, 0x8d16, 0x0040, 0x8af8, 0x6010, 0xa080, 0x0019, 0x2c02, - 0x6000, 0xa08a, 0x0010, 0x10c8, 0x1332, 0x1079, 0x8b00, 0x007c, - 0x8b10, 0x8b12, 0x8b34, 0x8b46, 0x8b53, 0x8b10, 0x8ae5, 0x8ae5, - 0x8ae5, 0x8b46, 0x8b46, 0x8b10, 0x8b10, 0x8b10, 0x8b10, 0x8b50, - 0x1078, 0x1332, 0x0e7e, 0x6010, 0x2070, 0x7050, 0xc0b5, 0x7052, - 0x2071, 0xa9b1, 0x7024, 0xac06, 0x0040, 0x8b30, 0x1078, 0x6ebe, - 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x2001, 0xa9a3, - 0x2004, 0x6016, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0e7f, 0x007c, - 0x6017, 0x0001, 0x0078, 0x8b2e, 0x0d7e, 0x6010, 0x2068, 0x6850, - 0xc0b5, 0x6852, 0x0d7f, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, - 0x0002, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x007c, 0x0d7e, 0x6017, - 0x0001, 0x6010, 0x2068, 0x6850, 0xc0b5, 0x6852, 0x0d7f, 0x007c, - 0x1078, 0x772d, 0x007c, 0x1078, 0x1757, 0x0078, 0x8b34, 0x6000, - 0xa08a, 0x0010, 0x10c8, 0x1332, 0x1079, 0x8b5f, 0x007c, 0x8b6f, - 0x8aed, 0x8b71, 0x8b6f, 0x8b71, 0x8b71, 0x8ae6, 0x8b6f, 0x8adf, - 0x8adf, 0x8b6f, 0x8b6f, 0x8b6f, 0x8b6f, 0x8b6f, 0x8b6f, 0x1078, - 0x1332, 0x0d7e, 0x6018, 0x2068, 0x6804, 0xa084, 0x00ff, 0x0d7f, - 0xa08a, 0x000c, 0x10c8, 0x1332, 0x1079, 0x8b7f, 0x007c, 0x8b8b, - 0x8c33, 0x8b8d, 0x8bcd, 0x8b8d, 0x8bcd, 0x8b8d, 0x8b9a, 0x8b8b, - 0x8bcd, 0x8b8b, 0x8bb7, 0x1078, 0x1332, 0x6004, 0xa08e, 0x0016, - 0x0040, 0x8bc8, 0xa08e, 0x0004, 0x0040, 0x8bc8, 0xa08e, 0x0002, - 0x0040, 0x8bc8, 0x6004, 0x1078, 0x8f10, 0x0040, 0x8c4e, 0xa08e, - 0x0021, 0x0040, 0x8c52, 0xa08e, 0x0022, 0x0040, 0x8c4e, 0xa08e, - 0x003d, 0x0040, 0x8c52, 0xa08e, 0x0039, 0x0040, 0x8c56, 0xa08e, - 0x0035, 0x0040, 0x8c56, 0xa08e, 0x001e, 0x0040, 0x8bca, 0xa08e, - 0x0001, 0x00c0, 0x8bc6, 0x0d7e, 0x6018, 0x2068, 0x6804, 0xa084, - 0x00ff, 0x0d7f, 0xa086, 0x0006, 0x0040, 0x8bc8, 0x1078, 0x2880, - 0x1078, 0x7c83, 0x1078, 0x8ed6, 0x007c, 0x0c7e, 0x0d7e, 0x6104, - 0xa186, 0x0016, 0x0040, 0x8c23, 0xa186, 0x0002, 0x00c0, 0x8bf6, - 0x6018, 0x2068, 0x68a0, 0xd0bc, 0x00c0, 0x8c7a, 0x6840, 0xa084, - 0x00ff, 0xa005, 0x0040, 0x8bf6, 0x8001, 0x6842, 0x6013, 0x0000, - 0x601f, 0x0007, 0x6017, 0x0398, 0x1078, 0x76c7, 0x0040, 0x8bf6, - 0x2d00, 0x601a, 0x601f, 0x0001, 0x0078, 0x8c23, 0x0d7f, 0x0c7f, - 0x6004, 0xa08e, 0x0002, 0x00c0, 0x8c14, 0x6018, 0xa080, 0x0028, - 0x2004, 0xa086, 0x007e, 0x00c0, 0x8c14, 0x2009, 0xa733, 0x2104, - 0xc085, 0x200a, 0x0e7e, 0x2071, 0xa700, 0x1078, 0x42b8, 0x0e7f, - 0x1078, 0x7c83, 0x0078, 0x8c18, 0x1078, 0x7c83, 0x1078, 0x2880, - 0x0e7e, 0x127e, 0x2091, 0x8000, 0x1078, 0x28a6, 0x127f, 0x0e7f, - 0x1078, 0x8ed6, 0x007c, 0x2001, 0x0002, 0x1078, 0x4502, 0x6003, - 0x0001, 0x6007, 0x0002, 0x1078, 0x5dd7, 0x1078, 0x62d1, 0x0d7f, - 0x0c7f, 0x0078, 0x8c22, 0x0c7e, 0x0d7e, 0x6104, 0xa186, 0x0016, - 0x0040, 0x8c23, 0x6018, 0x2068, 0x6840, 0xa084, 0x00ff, 0xa005, - 0x0040, 0x8bf6, 0x8001, 0x6842, 0x6003, 0x0001, 0x1078, 0x5dd7, - 0x1078, 0x62d1, 0x0d7f, 0x0c7f, 0x0078, 0x8c22, 0x1078, 0x7c83, - 0x0078, 0x8bca, 0x1078, 0x7ca6, 0x0078, 0x8bca, 0x0d7e, 0x2c68, - 0x6104, 0x1078, 0x91cc, 0x0d7f, 0x0040, 0x8c62, 0x1078, 0x772d, - 0x0078, 0x8c79, 0x6004, 0x8007, 0x6130, 0xa18c, 0x00ff, 0xa105, - 0x6032, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x6038, - 0x600a, 0x2001, 0xa9a3, 0x2004, 0x6016, 0x1078, 0x5d8a, 0x1078, - 0x62d1, 0x007c, 0x0d7f, 0x0c7f, 0x1078, 0x7c83, 0x1078, 0x2880, - 0x0e7e, 0x127e, 0x2091, 0x8000, 0x1078, 0x28a6, 0x6013, 0x0000, - 0x601f, 0x0007, 0x6017, 0x0398, 0x127f, 0x0e7f, 0x007c, 0x6000, - 0xa08a, 0x0010, 0x10c8, 0x1332, 0x1079, 0x8c97, 0x007c, 0x8ca7, - 0x8ca7, 0x8ca7, 0x8ca7, 0x8ca7, 0x8ca7, 0x8ca7, 0x8ca7, 0x8ca7, - 0x8ae5, 0x8ca7, 0x8aed, 0x8ca9, 0x8aed, 0x8cb7, 0x8ca7, 0x1078, - 0x1332, 0x6004, 0xa086, 0x008b, 0x0040, 0x8cb7, 0x6007, 0x008b, - 0x6003, 0x000d, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x007c, 0x1078, - 0x8ec9, 0x1078, 0x8d16, 0x0040, 0x8cef, 0x1078, 0x2880, 0x0d7e, - 0x1078, 0x8d16, 0x0040, 0x8cd1, 0x6010, 0x2068, 0x6837, 0x0103, - 0x684b, 0x0006, 0x6847, 0x0000, 0x6850, 0xc0ed, 0x6852, 0x1078, - 0x4a73, 0x2c68, 0x1078, 0x76c7, 0x0040, 0x8cdf, 0x6818, 0x601a, - 0x0c7e, 0x2d60, 0x1078, 0x8ed6, 0x0c7f, 0x0078, 0x8ce0, 0x2d60, - 0x0d7f, 0x6013, 0x0000, 0x601f, 0x0001, 0x6007, 0x0001, 0x6003, - 0x0001, 0x1078, 0x5dd7, 0x1078, 0x62d1, 0x0078, 0x8d01, 0x6030, - 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0040, 0x8cfb, 0xa186, - 0x0035, 0x00c0, 0x8cff, 0x1078, 0x2880, 0x0078, 0x8cd1, 0x1078, - 0x8ed6, 0x007c, 0xa284, 0x000f, 0x00c0, 0x8d13, 0xa282, 0xae00, - 0x0048, 0x8d13, 0x2001, 0xa716, 0x2004, 0xa202, 0x00c8, 0x8d13, - 0xa085, 0x0001, 0x007c, 0xa006, 0x0078, 0x8d12, 0x027e, 0x0e7e, - 0x2071, 0xa700, 0x6210, 0x705c, 0xa202, 0x0048, 0x8d28, 0x7060, - 0xa202, 0x00c8, 0x8d28, 0xa085, 0x0001, 0x0e7f, 0x027f, 0x007c, - 0xa006, 0x0078, 0x8d25, 0x0e7e, 0x0c7e, 0x037e, 0x007e, 0x127e, - 0x2091, 0x8000, 0x2061, 0xae00, 0x2071, 0xa700, 0x7348, 0x7064, - 0xa302, 0x00c8, 0x8d55, 0x601c, 0xa206, 0x00c0, 0x8d4d, 0x1078, - 0x903b, 0x0040, 0x8d4d, 0x1078, 0x8f10, 0x00c0, 0x8d49, 0x1078, - 0x7c83, 0x0c7e, 0x1078, 0x772d, 0x0c7f, 0xace0, 0x0010, 0x7058, - 0xac02, 0x00c8, 0x8d55, 0x0078, 0x8d36, 0x127f, 0x007f, 0x037f, - 0x0c7f, 0x0e7f, 0x007c, 0x0e7e, 0x0c7e, 0x017e, 0xa188, 0xa835, - 0x210c, 0x81ff, 0x0040, 0x8d69, 0x2061, 0xaab3, 0x611a, 0x1078, - 0x2880, 0xa006, 0x0078, 0x8d6e, 0xa085, 0x0001, 0x017f, 0x0c7f, - 0x0e7f, 0x007c, 0x0c7e, 0x057e, 0x127e, 0x2091, 0x8000, 0x0c7e, - 0x1078, 0x76c7, 0x057f, 0x0040, 0x8d8b, 0x6612, 0x651a, 0x601f, - 0x0003, 0x2009, 0x004b, 0x1078, 0x775c, 0xa085, 0x0001, 0x127f, - 0x057f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x8d87, 0x0c7e, 0x057e, - 0x127e, 0x2091, 0x8000, 0x62a0, 0x0c7e, 0x1078, 0x76c7, 0x057f, - 0x0040, 0x8db9, 0x6013, 0x0000, 0x651a, 0x601f, 0x0003, 0x0c7e, - 0x2560, 0x1078, 0x47e9, 0x0c7f, 0x1078, 0x5f01, 0x077e, 0x2039, - 0x0000, 0x1078, 0x5e0a, 0x2c08, 0x1078, 0x9f9b, 0x077f, 0x2009, - 0x004c, 0x1078, 0x775c, 0xa085, 0x0001, 0x127f, 0x057f, 0x0c7f, - 0x007c, 0xa006, 0x0078, 0x8db5, 0x0f7e, 0x0c7e, 0x047e, 0x0c7e, - 0x1078, 0x76c7, 0x2c78, 0x0c7f, 0x0040, 0x8dd6, 0x7e12, 0x2c00, - 0x781a, 0x781f, 0x0003, 0x2021, 0x0005, 0x1078, 0x8e21, 0x2f60, - 0x2009, 0x004d, 0x1078, 0x775c, 0xa085, 0x0001, 0x047f, 0x0c7f, - 0x0f7f, 0x007c, 0x0f7e, 0x0c7e, 0x047e, 0x0c7e, 0x1078, 0x76c7, - 0x2c78, 0x0c7f, 0x0040, 0x8df4, 0x7e12, 0x2c00, 0x781a, 0x781f, - 0x0003, 0x2021, 0x0005, 0x1078, 0x8e21, 0x2f60, 0x2009, 0x004e, - 0x1078, 0x775c, 0xa085, 0x0001, 0x047f, 0x0c7f, 0x0f7f, 0x007c, - 0x0f7e, 0x0c7e, 0x047e, 0x0c7e, 0x1078, 0x76c7, 0x2c78, 0x0c7f, - 0x0040, 0x8e1d, 0x7e12, 0x2c00, 0x781a, 0x781f, 0x0003, 0x2021, - 0x0004, 0x1078, 0x8e21, 0x2001, 0xa99d, 0x2004, 0xd0fc, 0x0040, - 0x8e16, 0x2f60, 0x1078, 0x772d, 0x0078, 0x8e1b, 0x2f60, 0x2009, - 0x0052, 0x1078, 0x775c, 0xa085, 0x0001, 0x047f, 0x0c7f, 0x0f7f, - 0x007c, 0x097e, 0x077e, 0x127e, 0x2091, 0x8000, 0x1078, 0x4775, - 0x0040, 0x8e2e, 0x2001, 0x8e26, 0x0078, 0x8e34, 0x1078, 0x4739, - 0x0040, 0x8e3d, 0x2001, 0x8e2e, 0x007e, 0xa00e, 0x2400, 0x1078, - 0x4b51, 0x1078, 0x4a73, 0x007f, 0x007a, 0x2418, 0x1078, 0x6161, - 0x62a0, 0x087e, 0x2041, 0x0001, 0x2039, 0x0001, 0x2608, 0x1078, - 0x5f1b, 0x087f, 0x1078, 0x5e0a, 0x2f08, 0x2648, 0x1078, 0x9f9b, - 0x613c, 0x81ff, 0x1040, 0x5fdb, 0x1078, 0x62d1, 0x127f, 0x077f, - 0x097f, 0x007c, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078, - 0x76c7, 0x017f, 0x0040, 0x8e73, 0x660a, 0x611a, 0x601f, 0x0001, - 0x2d00, 0x6012, 0x2009, 0x001f, 0x1078, 0x775c, 0xa085, 0x0001, - 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x8e70, 0x0c7e, 0x127e, - 0x2091, 0x8000, 0x0c7e, 0x1078, 0x76c7, 0x017f, 0x0040, 0x8e8f, - 0x660a, 0x611a, 0x601f, 0x0008, 0x2d00, 0x6012, 0x2009, 0x0021, - 0x1078, 0x775c, 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, - 0x0078, 0x8e8c, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078, - 0x76c7, 0x017f, 0x0040, 0x8eab, 0x660a, 0x611a, 0x601f, 0x0001, - 0x2d00, 0x6012, 0x2009, 0x003d, 0x1078, 0x775c, 0xa085, 0x0001, - 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x8ea8, 0x0c7e, 0x127e, - 0x2091, 0x8000, 0x0c7e, 0x1078, 0x76c7, 0x017f, 0x0040, 0x8ec6, - 0x611a, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0000, 0x1078, - 0x775c, 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, - 0x8ec3, 0x027e, 0x0d7e, 0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0040, - 0x8ed3, 0x8211, 0x6a3e, 0x0d7f, 0x027f, 0x007c, 0x007e, 0x6000, - 0xa086, 0x0000, 0x0040, 0x8ee8, 0x6013, 0x0000, 0x601f, 0x0007, - 0x2001, 0xa9a3, 0x2004, 0x6016, 0x1078, 0xa4a5, 0x603f, 0x0000, - 0x007f, 0x007c, 0x067e, 0x0c7e, 0x0d7e, 0x2031, 0xa753, 0x2634, - 0xd6e4, 0x0040, 0x8ef8, 0x6618, 0x2660, 0x6e48, 0x1078, 0x46e7, - 0x0d7f, 0x0c7f, 0x067f, 0x007c, 0x007e, 0x017e, 0x6004, 0xa08e, - 0x0002, 0x0040, 0x8f0d, 0xa08e, 0x0003, 0x0040, 0x8f0d, 0xa08e, - 0x0004, 0x0040, 0x8f0d, 0xa085, 0x0001, 0x017f, 0x007f, 0x007c, - 0x007e, 0x0d7e, 0x6010, 0xa06d, 0x0040, 0x8f1d, 0x6838, 0xd0fc, - 0x0040, 0x8f1d, 0xa006, 0x0078, 0x8f1f, 0xa085, 0x0001, 0x0d7f, - 0x007f, 0x007c, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078, - 0x76c7, 0x017f, 0x0040, 0x8f3c, 0x611a, 0x601f, 0x0001, 0x2d00, - 0x6012, 0x1078, 0x2880, 0x2009, 0x0028, 0x1078, 0x775c, 0xa085, - 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x8f39, 0xa186, - 0x0015, 0x00c0, 0x8f54, 0x2011, 0xa720, 0x2204, 0xa086, 0x0074, - 0x00c0, 0x8f54, 0x1078, 0x7f91, 0x6003, 0x0001, 0x6007, 0x0029, - 0x1078, 0x5dd7, 0x0078, 0x8f58, 0x1078, 0x7c83, 0x1078, 0x772d, - 0x007c, 0xa186, 0x0016, 0x00c0, 0x8f63, 0x2001, 0x0004, 0x1078, - 0x4502, 0x0078, 0x8f84, 0xa186, 0x0015, 0x00c0, 0x8f88, 0x2011, - 0xa720, 0x2204, 0xa086, 0x0014, 0x00c0, 0x8f88, 0x0d7e, 0x6018, - 0x2068, 0x1078, 0x4649, 0x0d7f, 0x1078, 0x8043, 0x00c0, 0x8f88, - 0x0d7e, 0x6018, 0x2068, 0x6890, 0x0d7f, 0xa005, 0x0040, 0x8f88, - 0x2001, 0x0006, 0x1078, 0x4502, 0x1078, 0x77f8, 0x0078, 0x8f8c, - 0x1078, 0x7c83, 0x1078, 0x772d, 0x007c, 0x6848, 0xa086, 0x0005, - 0x00c0, 0x8f94, 0x1078, 0x8f95, 0x007c, 0x6850, 0xc0ad, 0x6852, - 0x007c, 0x0e7e, 0x2071, 0xac8c, 0x7014, 0xd0e4, 0x0040, 0x8faa, - 0x6013, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, 0x1078, 0x5d8a, - 0x1078, 0x62d1, 0x0e7f, 0x007c, 0x0c7e, 0x0f7e, 0x2c78, 0x1078, - 0x4963, 0x0f7f, 0x0040, 0x8fb9, 0x601c, 0xa084, 0x000f, 0x1079, - 0x8fbb, 0x0c7f, 0x007c, 0x8ae5, 0x8fc6, 0x8fc9, 0x8fcc, 0xa26d, - 0xa289, 0xa28c, 0x8ae5, 0x8ae5, 0x1078, 0x1332, 0x0005, 0x0005, - 0x007c, 0x0005, 0x0005, 0x007c, 0x1078, 0x8fcf, 0x007c, 0x0f7e, - 0x2c78, 0x1078, 0x4963, 0x0040, 0x8ffe, 0x1078, 0x76c7, 0x00c0, - 0x8fdf, 0x2001, 0xa9a4, 0x2004, 0x783e, 0x0078, 0x8ffe, 0x7818, - 0x601a, 0x781c, 0xa086, 0x0003, 0x0040, 0x8fec, 0x7808, 0x6036, - 0x2f00, 0x603a, 0x0078, 0x8ff0, 0x7808, 0x603a, 0x2f00, 0x6036, - 0x602a, 0x601f, 0x0001, 0x6007, 0x0035, 0x6003, 0x0001, 0x7920, - 0x6122, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x2f60, 0x0f7f, 0x007c, - 0x017e, 0x0f7e, 0x682c, 0x6032, 0xa08e, 0x0001, 0x0040, 0x9011, - 0xa086, 0x0005, 0x0040, 0x9015, 0xa006, 0x602a, 0x602e, 0x0078, - 0x9026, 0x6824, 0xc0f4, 0xc0d5, 0x6826, 0x6810, 0x2078, 0x787c, - 0x6938, 0xa102, 0x7880, 0x6934, 0xa103, 0x00c8, 0x900c, 0x6834, - 0x602a, 0x6838, 0xa084, 0xfffc, 0x683a, 0x602e, 0x2d00, 0x6036, - 0x6808, 0x603a, 0x6918, 0x611a, 0x6920, 0x6122, 0x601f, 0x0001, - 0x6007, 0x0039, 0x6003, 0x0001, 0x1078, 0x5d8a, 0x6803, 0x0002, - 0x0f7f, 0x017f, 0x007c, 0x007e, 0x017e, 0x6004, 0xa08e, 0x0034, - 0x0040, 0x9060, 0xa08e, 0x0035, 0x0040, 0x9060, 0xa08e, 0x0036, - 0x0040, 0x9060, 0xa08e, 0x0037, 0x0040, 0x9060, 0xa08e, 0x0038, - 0x0040, 0x9060, 0xa08e, 0x0039, 0x0040, 0x9060, 0xa08e, 0x003a, - 0x0040, 0x9060, 0xa08e, 0x003b, 0x0040, 0x9060, 0xa085, 0x0001, - 0x017f, 0x007f, 0x007c, 0x0f7e, 0x2c78, 0x1078, 0x4963, 0x00c0, - 0x906d, 0xa085, 0x0001, 0x0078, 0x907c, 0x6024, 0xd0f4, 0x00c0, - 0x907b, 0xc0f5, 0x6026, 0x6010, 0x2078, 0x7828, 0x603a, 0x782c, - 0x6036, 0x1078, 0x1757, 0xa006, 0x0f7f, 0x007c, 0x007e, 0x017e, - 0x027e, 0x037e, 0x0e7e, 0x2001, 0xa99e, 0x200c, 0x8000, 0x2014, - 0x2001, 0x0032, 0x1078, 0x5c1c, 0x2001, 0xa9a2, 0x82ff, 0x00c0, - 0x9093, 0x2011, 0x0014, 0x2202, 0x2001, 0xa9a0, 0x200c, 0x8000, - 0x2014, 0x2071, 0xa98d, 0x711a, 0x721e, 0x2001, 0x0064, 0x1078, - 0x5c1c, 0x2001, 0xa9a3, 0x82ff, 0x00c0, 0x90a8, 0x2011, 0x0014, - 0x2202, 0x2009, 0xa9a4, 0xa280, 0x000a, 0x200a, 0x1078, 0x498b, - 0x0e7f, 0x037f, 0x027f, 0x017f, 0x007f, 0x007c, 0x007e, 0x0e7e, - 0x2001, 0xa9a2, 0x2003, 0x0028, 0x2001, 0xa9a3, 0x2003, 0x0014, - 0x2071, 0xa98d, 0x701b, 0x0000, 0x701f, 0x07d0, 0x2001, 0xa9a4, - 0x2003, 0x001e, 0x0e7f, 0x007f, 0x007c, 0x0c7e, 0x127e, 0x2091, - 0x8000, 0x0c7e, 0x1078, 0x76c7, 0x017f, 0x0040, 0x90e5, 0x611a, - 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0033, 0x1078, 0x775c, - 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x90e2, - 0x0d7e, 0x0e7e, 0x0f7e, 0x2071, 0xa700, 0xa186, 0x0015, 0x00c0, - 0x9117, 0x7080, 0xa086, 0x0018, 0x00c0, 0x9117, 0x6010, 0x2068, - 0x6a3c, 0xd2e4, 0x00c0, 0x910b, 0x2c78, 0x1078, 0x6490, 0x0040, - 0x911f, 0x706c, 0x6a50, 0xa206, 0x00c0, 0x9113, 0x7070, 0x6a54, - 0xa206, 0x00c0, 0x9113, 0x6218, 0xa290, 0x0028, 0x2214, 0x2009, - 0x0000, 0x1078, 0x28c8, 0x1078, 0x77f8, 0x0078, 0x911b, 0x1078, - 0x7c83, 0x1078, 0x772d, 0x0f7f, 0x0e7f, 0x0d7f, 0x007c, 0x7050, - 0xa080, 0x29c0, 0x2004, 0x6a54, 0xa206, 0x0040, 0x910b, 0x0078, - 0x9113, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078, 0x76c7, - 0x017f, 0x0040, 0x9141, 0x611a, 0x601f, 0x0001, 0x2d00, 0x6012, - 0x2009, 0x0043, 0x1078, 0x775c, 0xa085, 0x0001, 0x127f, 0x0c7f, - 0x007c, 0xa006, 0x0078, 0x913e, 0x0d7e, 0x0e7e, 0x0f7e, 0x2071, - 0xa700, 0xa186, 0x0015, 0x00c0, 0x916a, 0x7080, 0xa086, 0x0004, - 0x00c0, 0x916a, 0x6010, 0xa0e8, 0x000f, 0x2c78, 0x1078, 0x6490, - 0x0040, 0x9172, 0x706c, 0x6a08, 0xa206, 0x00c0, 0x9166, 0x7070, - 0x6a0c, 0xa206, 0x00c0, 0x9166, 0x1078, 0x2880, 0x1078, 0x77f8, - 0x0078, 0x916e, 0x1078, 0x7c83, 0x1078, 0x772d, 0x0f7f, 0x0e7f, - 0x0d7f, 0x007c, 0x7050, 0xa080, 0x29c0, 0x2004, 0x6a0c, 0xa206, - 0x0040, 0x9164, 0x0078, 0x9166, 0x017e, 0x027e, 0x684c, 0xd0ac, - 0x0040, 0x9194, 0x6914, 0x6a10, 0x2100, 0xa205, 0x0040, 0x9194, - 0x6860, 0xa106, 0x00c0, 0x9190, 0x685c, 0xa206, 0x0040, 0x9194, - 0x6962, 0x6a5e, 0xa085, 0x0001, 0x027f, 0x017f, 0x007c, 0x0e7e, - 0x127e, 0x2071, 0xa700, 0x2091, 0x8000, 0x7548, 0xa582, 0x0001, - 0x0048, 0x91c9, 0x704c, 0x2060, 0x6000, 0xa086, 0x0000, 0x0040, - 0x91b5, 0xace0, 0x0010, 0x7058, 0xac02, 0x00c8, 0x91b1, 0x0078, - 0x91a4, 0x2061, 0xae00, 0x0078, 0x91a4, 0x6003, 0x0008, 0x8529, - 0x754a, 0xaca8, 0x0010, 0x7058, 0xa502, 0x00c8, 0x91c5, 0x754e, - 0xa085, 0x0001, 0x127f, 0x0e7f, 0x007c, 0x704f, 0xae00, 0x0078, - 0x91c0, 0xa006, 0x0078, 0x91c2, 0x0c7e, 0x027e, 0x017e, 0xa186, - 0x0035, 0x0040, 0x91d6, 0x6a34, 0x0078, 0x91d7, 0x6a28, 0x1078, - 0x8d02, 0x0040, 0x9200, 0x2260, 0x611c, 0xa186, 0x0003, 0x0040, - 0x91e5, 0xa186, 0x0006, 0x00c0, 0x91fc, 0x6834, 0xa206, 0x0040, - 0x91f4, 0x6838, 0xa206, 0x00c0, 0x91fc, 0x6108, 0x6834, 0xa106, - 0x00c0, 0x91fc, 0x0078, 0x91f9, 0x6008, 0x6938, 0xa106, 0x00c0, - 0x91fc, 0x6018, 0x6918, 0xa106, 0x017f, 0x027f, 0x0c7f, 0x007c, - 0xa085, 0x0001, 0x0078, 0x91fc, 0x6944, 0xd1cc, 0x0040, 0x921d, - 0xa18c, 0x00ff, 0xa18e, 0x0002, 0x00c0, 0x921d, 0xad88, 0x001e, - 0x210c, 0xa18c, 0x0f00, 0x810f, 0xa18e, 0x0001, 0x00c0, 0x921d, - 0x6810, 0x6914, 0xa115, 0x10c0, 0x84e2, 0x007c, 0x067e, 0x6000, - 0xa0b2, 0x0010, 0x10c8, 0x1332, 0x1079, 0x9228, 0x067f, 0x007c, - 0x9238, 0x96ef, 0x980b, 0x9238, 0x9238, 0x9238, 0x9238, 0x9238, - 0x9272, 0x989e, 0x9238, 0x9238, 0x9238, 0x9238, 0x9238, 0x9238, - 0x1078, 0x1332, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8, 0x1332, - 0x1079, 0x9244, 0x067f, 0x007c, 0x9254, 0x9d63, 0x9254, 0x9254, - 0x9254, 0x9254, 0x9254, 0x9254, 0x9d21, 0x9db1, 0x9254, 0xa3c0, - 0xa3f4, 0xa3c0, 0xa3f4, 0x9254, 0x1078, 0x1332, 0x067e, 0x6000, - 0xa0b2, 0x0010, 0x10c8, 0x1332, 0x1079, 0x9260, 0x067f, 0x007c, - 0x9270, 0x99fb, 0x9ad7, 0x9b05, 0x9b80, 0x9270, 0x9c86, 0x9c2e, - 0x98aa, 0x9cf5, 0x9d0b, 0x9270, 0x9270, 0x9270, 0x9270, 0x9270, - 0x1078, 0x1332, 0xa1b2, 0x0044, 0x10c8, 0x1332, 0x2100, 0x0079, - 0x9279, 0x92b9, 0x94a8, 0x92b9, 0x92b9, 0x92b9, 0x94b0, 0x92b9, - 0x92b9, 0x92b9, 0x92b9, 0x92b9, 0x92b9, 0x92b9, 0x92b9, 0x92b9, - 0x92b9, 0x92b9, 0x92b9, 0x92b9, 0x92b9, 0x92b9, 0x92b9, 0x92b9, - 0x92bb, 0x9321, 0x9330, 0x9387, 0x93a6, 0x9425, 0x9495, 0x92b9, - 0x92b9, 0x94b4, 0x92b9, 0x92b9, 0x94c7, 0x94d2, 0x92b9, 0x92b9, - 0x92b9, 0x92b9, 0x92b9, 0x950a, 0x92b9, 0x92b9, 0x9519, 0x92b9, - 0x92b9, 0x92b9, 0x92b9, 0x92b9, 0x92b9, 0x9532, 0x92b9, 0x92b9, - 0x92b9, 0x95bf, 0x92b9, 0x92b9, 0x92b9, 0x92b9, 0x92b9, 0x92b9, - 0x9639, 0x1078, 0x1332, 0x1078, 0x4967, 0x00c0, 0x92cb, 0x2001, - 0xa733, 0x2004, 0xd0cc, 0x00c0, 0x92cb, 0xa084, 0x0009, 0xa086, - 0x0008, 0x00c0, 0x92d3, 0x6007, 0x0009, 0x602b, 0x0009, 0x6013, - 0x0000, 0x0078, 0x94a3, 0x1078, 0x4957, 0x0e7e, 0x0c7e, 0x037e, - 0x027e, 0x017e, 0x6218, 0x2270, 0x72a0, 0x027e, 0x2019, 0x0029, - 0x1078, 0x5f01, 0x077e, 0x2039, 0x0000, 0x1078, 0x5e0a, 0x2c08, - 0x1078, 0x9f9b, 0x077f, 0x017f, 0x2e60, 0x1078, 0x47e9, 0x017f, - 0x027f, 0x037f, 0x0c7f, 0x0e7f, 0x6618, 0x0c7e, 0x2660, 0x1078, - 0x45d6, 0x0c7f, 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, - 0x0006, 0x0048, 0x9313, 0x1078, 0x9ecf, 0x00c0, 0x9381, 0x1078, - 0x9e60, 0x00c0, 0x930f, 0x6007, 0x0008, 0x0078, 0x94a3, 0x6007, - 0x0009, 0x0078, 0x94a3, 0x1078, 0xa0af, 0x0040, 0x931d, 0x1078, - 0x9ecf, 0x0040, 0x9307, 0x0078, 0x9381, 0x6013, 0x1900, 0x0078, - 0x930f, 0x1078, 0x29bb, 0x00c0, 0x9674, 0x6106, 0x1078, 0x9e15, - 0x6007, 0x0006, 0x0078, 0x94a3, 0x6007, 0x0007, 0x0078, 0x94a3, - 0x1078, 0xa42c, 0x00c0, 0x9674, 0x1078, 0x29bb, 0x00c0, 0x9674, - 0x0d7e, 0x6618, 0x2668, 0x6e04, 0xa684, 0x00ff, 0xa082, 0x0006, - 0x00c8, 0x9346, 0x2001, 0x0001, 0x1078, 0x44ee, 0xa6b4, 0xff00, - 0x8637, 0xa686, 0x0006, 0x0040, 0x9363, 0xa686, 0x0004, 0x0040, - 0x9363, 0x6e04, 0xa6b4, 0x00ff, 0xa686, 0x0006, 0x0040, 0x9363, - 0xa686, 0x0004, 0x0040, 0x9363, 0xa686, 0x0005, 0x0040, 0x9363, - 0x0d7f, 0x0078, 0x9381, 0x1078, 0x9f35, 0x00c0, 0x937c, 0xa686, - 0x0006, 0x00c0, 0x9375, 0x027e, 0x6218, 0xa290, 0x0028, 0x2214, - 0x2009, 0x0000, 0x1078, 0x28c8, 0x027f, 0x1078, 0x4649, 0x6007, - 0x000a, 0x0d7f, 0x0078, 0x94a3, 0x6007, 0x000b, 0x0d7f, 0x0078, - 0x94a3, 0x1078, 0x2880, 0x6007, 0x0001, 0x0078, 0x94a3, 0x1078, - 0xa42c, 0x00c0, 0x9674, 0x1078, 0x29bb, 0x00c0, 0x9674, 0x6618, - 0x0d7e, 0x2668, 0x6e04, 0x0d7f, 0xa686, 0x0707, 0x0040, 0x9381, - 0x027e, 0x6218, 0xa290, 0x0028, 0x2214, 0x2009, 0x0000, 0x1078, - 0x28c8, 0x027f, 0x6007, 0x000c, 0x0078, 0x94a3, 0x1078, 0x4967, - 0x00c0, 0x93b3, 0x2001, 0xa733, 0x2004, 0xa084, 0x0009, 0xa086, - 0x0008, 0x00c0, 0x93bb, 0x6007, 0x0009, 0x602b, 0x0009, 0x6013, - 0x0000, 0x0078, 0x94a3, 0x1078, 0x4957, 0x6618, 0xa6b0, 0x0001, - 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x0048, 0x93ff, 0xa6b4, - 0xff00, 0x8637, 0xa686, 0x0004, 0x0040, 0x93d2, 0xa686, 0x0006, - 0x00c0, 0x9381, 0x1078, 0x9f44, 0x00c0, 0x93da, 0x6007, 0x000e, - 0x0078, 0x94a3, 0x047e, 0x6418, 0xa4a0, 0x0028, 0x2424, 0xa4a4, - 0x00ff, 0x8427, 0x047e, 0x1078, 0x2880, 0x047f, 0x017e, 0xa006, - 0x2009, 0xa753, 0x210c, 0xd1a4, 0x0040, 0x93f9, 0x2009, 0x0029, - 0x1078, 0xa22d, 0x6018, 0x0d7e, 0x2068, 0x6800, 0xc0e5, 0x6802, - 0x0d7f, 0x017f, 0x047f, 0x6007, 0x0001, 0x0078, 0x94a3, 0x2001, - 0x0001, 0x1078, 0x44ee, 0x157e, 0x017e, 0x027e, 0x037e, 0x20a9, - 0x0004, 0x2019, 0xa705, 0x2011, 0xac90, 0x1078, 0x80de, 0x037f, - 0x027f, 0x017f, 0x157f, 0xa005, 0x0040, 0x941f, 0xa6b4, 0xff00, - 0x8637, 0xa686, 0x0006, 0x0040, 0x93d2, 0x0078, 0x9381, 0x6013, - 0x1900, 0x6007, 0x0009, 0x0078, 0x94a3, 0x1078, 0x4967, 0x00c0, - 0x9432, 0x2001, 0xa733, 0x2004, 0xa084, 0x0009, 0xa086, 0x0008, - 0x00c0, 0x943a, 0x6007, 0x0009, 0x602b, 0x0009, 0x6013, 0x0000, - 0x0078, 0x94a3, 0x1078, 0x4957, 0x6618, 0xa6b0, 0x0001, 0x2634, - 0xa684, 0x00ff, 0xa082, 0x0006, 0x0048, 0x9482, 0xa6b4, 0xff00, - 0x8637, 0xa686, 0x0004, 0x0040, 0x9451, 0xa686, 0x0006, 0x00c0, - 0x9381, 0x1078, 0x9f6f, 0x00c0, 0x945d, 0x1078, 0x9e60, 0x00c0, - 0x945d, 0x6007, 0x0010, 0x0078, 0x94a3, 0x047e, 0x6418, 0xa4a0, - 0x0028, 0x2424, 0xa4a4, 0x00ff, 0x8427, 0x047e, 0x1078, 0x2880, - 0x047f, 0x017e, 0xa006, 0x2009, 0xa753, 0x210c, 0xd1a4, 0x0040, - 0x947c, 0x2009, 0x0029, 0x1078, 0xa22d, 0x6018, 0x0d7e, 0x2068, - 0x6800, 0xc0e5, 0x6802, 0x0d7f, 0x017f, 0x047f, 0x6007, 0x0001, - 0x0078, 0x94a3, 0x1078, 0xa0af, 0x0040, 0x948f, 0xa6b4, 0xff00, - 0x8637, 0xa686, 0x0006, 0x0040, 0x9451, 0x0078, 0x9381, 0x6013, - 0x1900, 0x6007, 0x0009, 0x0078, 0x94a3, 0x1078, 0x29bb, 0x00c0, - 0x9674, 0x1078, 0xa42c, 0x00c0, 0x9674, 0x1078, 0x9677, 0x00c0, - 0x9381, 0x6007, 0x0012, 0x6003, 0x0001, 0x1078, 0x5dd7, 0x007c, - 0x6007, 0x0001, 0x6003, 0x0001, 0x1078, 0x5dd7, 0x0078, 0x94a7, - 0x6007, 0x0005, 0x0078, 0x94aa, 0x1078, 0xa42c, 0x00c0, 0x9674, - 0x1078, 0x29bb, 0x00c0, 0x9674, 0x1078, 0x9677, 0x00c0, 0x9381, - 0x6007, 0x0020, 0x6003, 0x0001, 0x1078, 0x5dd7, 0x007c, 0x1078, - 0x29bb, 0x00c0, 0x9674, 0x6007, 0x0023, 0x6003, 0x0001, 0x1078, - 0x5dd7, 0x007c, 0x1078, 0xa42c, 0x00c0, 0x9674, 0x1078, 0x29bb, - 0x00c0, 0x9674, 0x1078, 0x9677, 0x00c0, 0x9381, 0x017e, 0x027e, - 0x2011, 0xac90, 0x2214, 0x2c08, 0xa006, 0x1078, 0xa1f6, 0x00c0, - 0x94f9, 0x2160, 0x6007, 0x0026, 0x6013, 0x1700, 0x2011, 0xac89, - 0x2214, 0xa296, 0xffff, 0x00c0, 0x9503, 0x6007, 0x0025, 0x0078, - 0x9503, 0x6004, 0xa086, 0x0024, 0x00c0, 0x9500, 0x1078, 0x772d, - 0x2160, 0x6007, 0x0025, 0x6003, 0x0001, 0x1078, 0x5dd7, 0x027f, - 0x017f, 0x007c, 0x1078, 0x29bb, 0x00c0, 0x9674, 0x6106, 0x1078, - 0x9697, 0x6007, 0x002b, 0x0078, 0x94a3, 0x6007, 0x002c, 0x0078, - 0x94a3, 0x1078, 0xa42c, 0x00c0, 0x9674, 0x1078, 0x29bb, 0x00c0, - 0x9674, 0x1078, 0x9677, 0x00c0, 0x9381, 0x6106, 0x1078, 0x969c, - 0x00c0, 0x952e, 0x6007, 0x002e, 0x0078, 0x94a3, 0x6007, 0x002f, - 0x0078, 0x94a3, 0x1078, 0x29bb, 0x00c0, 0x9674, 0x0e7e, 0x0d7e, - 0x0c7e, 0x6018, 0xa080, 0x0001, 0x200c, 0xa184, 0x00ff, 0xa086, - 0x0006, 0x0040, 0x954f, 0xa184, 0xff00, 0x8007, 0xa086, 0x0006, - 0x0040, 0x954f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0078, 0x94a8, 0x2001, - 0xa772, 0x2004, 0xd0e4, 0x0040, 0x95bb, 0x2071, 0xac8c, 0x7010, - 0x6036, 0x7014, 0x603a, 0x7108, 0x720c, 0x2001, 0xa753, 0x2004, - 0xd0a4, 0x0040, 0x956d, 0x6018, 0x2068, 0x6810, 0xa106, 0x00c0, - 0x956d, 0x6814, 0xa206, 0x0040, 0x9591, 0x2001, 0xa753, 0x2004, - 0xd0ac, 0x00c0, 0x95af, 0x2069, 0xa700, 0x6870, 0xa206, 0x00c0, - 0x95af, 0x686c, 0xa106, 0x00c0, 0x95af, 0x7210, 0x1078, 0x8d02, - 0x0040, 0x95b5, 0x1078, 0xa29e, 0x0040, 0x95b5, 0x622a, 0x6007, - 0x0036, 0x6003, 0x0001, 0x1078, 0x5d8a, 0x0c7f, 0x0d7f, 0x0e7f, - 0x007c, 0x7214, 0xa286, 0xffff, 0x0040, 0x95a3, 0x1078, 0x8d02, - 0x0040, 0x95b5, 0xa280, 0x0002, 0x2004, 0x7110, 0xa106, 0x00c0, - 0x95b5, 0x0078, 0x957e, 0x7210, 0x2c08, 0xa085, 0x0001, 0x1078, - 0xa1f6, 0x2c10, 0x2160, 0x0040, 0x95b5, 0x0078, 0x957e, 0x6007, - 0x0037, 0x6013, 0x1500, 0x0078, 0x9589, 0x6007, 0x0037, 0x6013, - 0x1700, 0x0078, 0x9589, 0x6007, 0x0012, 0x0078, 0x9589, 0x1078, - 0x29bb, 0x00c0, 0x9674, 0x6018, 0xa080, 0x0001, 0x2004, 0xa084, - 0xff00, 0x8007, 0xa086, 0x0006, 0x00c0, 0x94a8, 0x0e7e, 0x0d7e, - 0x0c7e, 0x2001, 0xa772, 0x2004, 0xd0e4, 0x0040, 0x9631, 0x2069, - 0xa700, 0x2071, 0xac8c, 0x7008, 0x6036, 0x720c, 0x623a, 0xa286, - 0xffff, 0x00c0, 0x95ee, 0x7208, 0x0c7e, 0x2c08, 0xa085, 0x0001, - 0x1078, 0xa1f6, 0x2c10, 0x0c7f, 0x0040, 0x9625, 0x1078, 0x8d02, - 0x0040, 0x9625, 0x0c7e, 0x027e, 0x2260, 0x1078, 0x8a03, 0x027f, - 0x0c7f, 0x7118, 0xa18c, 0xff00, 0x810f, 0xa186, 0x0001, 0x0040, - 0x960f, 0xa186, 0x0005, 0x0040, 0x9609, 0xa186, 0x0007, 0x00c0, - 0x9619, 0xa280, 0x0004, 0x2004, 0xa005, 0x0040, 0x9619, 0x057e, - 0x7510, 0x7614, 0x1078, 0xa2b3, 0x057f, 0x0c7f, 0x0d7f, 0x0e7f, - 0x007c, 0x6007, 0x003b, 0x602b, 0x0009, 0x6013, 0x2a00, 0x6003, - 0x0001, 0x1078, 0x5d8a, 0x0078, 0x9615, 0x6007, 0x003b, 0x602b, - 0x0009, 0x6013, 0x1700, 0x6003, 0x0001, 0x1078, 0x5d8a, 0x0078, - 0x9615, 0x6007, 0x003b, 0x602b, 0x000b, 0x6013, 0x0000, 0x0078, - 0x9589, 0x0e7e, 0x027e, 0x1078, 0x4967, 0x0040, 0x966e, 0x1078, - 0x4957, 0x1078, 0xa4b9, 0x00c0, 0x966c, 0x2071, 0xa700, 0x70cc, - 0xc085, 0x70ce, 0x0f7e, 0x2079, 0x0100, 0x7298, 0xa284, 0x00ff, - 0x706e, 0x78e6, 0xa284, 0xff00, 0x7270, 0xa205, 0x7072, 0x78ea, - 0x0f7f, 0x70d7, 0x0000, 0x2001, 0xa753, 0x2004, 0xd0a4, 0x0040, - 0x9665, 0x2011, 0xa9ca, 0x2013, 0x07d0, 0xd0ac, 0x00c0, 0x966e, - 0x1078, 0x2677, 0x0078, 0x966e, 0x1078, 0xa4e9, 0x027f, 0x0e7f, - 0x1078, 0x772d, 0x0078, 0x94a7, 0x1078, 0x772d, 0x007c, 0x0d7e, - 0x067e, 0x6618, 0x2668, 0x6e04, 0xa6b4, 0xff00, 0x8637, 0xa686, - 0x0006, 0x0040, 0x9694, 0xa686, 0x0004, 0x0040, 0x9694, 0x6e04, - 0xa6b4, 0x00ff, 0xa686, 0x0006, 0x0040, 0x9694, 0xa686, 0x0004, - 0x0040, 0x9694, 0xa085, 0x0001, 0x067f, 0x0d7f, 0x007c, 0x0d7e, - 0x1078, 0x96cb, 0x0d7f, 0x007c, 0x0d7e, 0x1078, 0x96da, 0x00c0, - 0x96c4, 0x680c, 0xa08c, 0xff00, 0x6820, 0xa084, 0x00ff, 0xa115, - 0x6212, 0x6824, 0x602a, 0xd1e4, 0x0040, 0x96b2, 0x2009, 0x0001, - 0x0078, 0x96c0, 0xd1ec, 0x0040, 0x96c4, 0x6920, 0xa18c, 0x00ff, - 0x6824, 0x1078, 0x254d, 0x00c0, 0x96c4, 0x2110, 0x2009, 0x0000, - 0x1078, 0x28c8, 0x0078, 0x96c8, 0xa085, 0x0001, 0x0078, 0x96c9, - 0xa006, 0x0d7f, 0x007c, 0x2069, 0xac8d, 0x6800, 0xa082, 0x0010, - 0x00c8, 0x96d8, 0x6013, 0x0000, 0xa085, 0x0001, 0x0078, 0x96d9, - 0xa006, 0x007c, 0x6013, 0x0000, 0x2069, 0xac8c, 0x6808, 0xa084, - 0xff00, 0xa086, 0x0800, 0x00c0, 0x96ee, 0x6800, 0xa084, 0x00ff, - 0xa08e, 0x0014, 0x0040, 0x96ee, 0xa08e, 0x0010, 0x007c, 0x6004, - 0xa0b2, 0x0044, 0x10c8, 0x1332, 0xa1b6, 0x0013, 0x00c0, 0x96fb, - 0x2008, 0x0079, 0x970e, 0xa1b6, 0x0027, 0x0040, 0x9703, 0xa1b6, - 0x0014, 0x10c0, 0x1332, 0x2001, 0x0007, 0x1078, 0x4535, 0x1078, - 0x61cd, 0x1078, 0x8ed6, 0x1078, 0x62d1, 0x007c, 0x974e, 0x9750, - 0x974e, 0x974e, 0x974e, 0x9750, 0x975c, 0x97e6, 0x97a9, 0x97e6, - 0x97bd, 0x97e6, 0x975c, 0x97e6, 0x97de, 0x97e6, 0x97de, 0x97e6, - 0x97e6, 0x974e, 0x974e, 0x974e, 0x974e, 0x974e, 0x974e, 0x974e, - 0x974e, 0x974e, 0x974e, 0x974e, 0x9750, 0x974e, 0x97e6, 0x974e, - 0x974e, 0x97e6, 0x974e, 0x97e6, 0x97e6, 0x974e, 0x974e, 0x974e, - 0x974e, 0x97e6, 0x97e6, 0x974e, 0x97e6, 0x97e6, 0x974e, 0x974e, - 0x974e, 0x974e, 0x974e, 0x9750, 0x97e6, 0x97e6, 0x974e, 0x974e, - 0x97e6, 0x97e6, 0x974e, 0x974e, 0x974e, 0x974e, 0x1078, 0x1332, - 0x1078, 0x61cd, 0x2001, 0xa9a2, 0x2004, 0x6016, 0x6003, 0x0002, - 0x1078, 0x62d1, 0x0078, 0x97ec, 0x0f7e, 0x2079, 0xa752, 0x7804, - 0x0f7f, 0xd0ac, 0x00c0, 0x97e6, 0x2001, 0x0000, 0x1078, 0x44ee, - 0x6018, 0xa080, 0x0004, 0x2004, 0xa086, 0x00ff, 0x0040, 0x97e6, - 0x0c7e, 0x6018, 0x2060, 0x6000, 0xd0f4, 0x00c0, 0x9780, 0x6010, - 0xa005, 0x0040, 0x9780, 0x0c7f, 0x1078, 0x3699, 0x0078, 0x97e6, - 0x0c7f, 0x2001, 0xa700, 0x2004, 0xa086, 0x0002, 0x00c0, 0x978f, - 0x0f7e, 0x2079, 0xa700, 0x7890, 0x8000, 0x7892, 0x0f7f, 0x2001, - 0x0002, 0x1078, 0x4502, 0x1078, 0x61cd, 0x601f, 0x0001, 0x6003, - 0x0001, 0x6007, 0x0002, 0x1078, 0x5dd7, 0x1078, 0x62d1, 0x0c7e, - 0x6118, 0x2160, 0x2009, 0x0001, 0x1078, 0x5a52, 0x0c7f, 0x0078, - 0x97ec, 0x6618, 0x0d7e, 0x2668, 0x6e04, 0x0d7f, 0xa6b4, 0xff00, - 0x8637, 0xa686, 0x0006, 0x0040, 0x97e6, 0xa686, 0x0004, 0x0040, - 0x97e6, 0x2001, 0x0004, 0x0078, 0x97e4, 0x2001, 0xa700, 0x2004, - 0xa086, 0x0003, 0x00c0, 0x97c6, 0x1078, 0x3699, 0x2001, 0x0006, - 0x1078, 0x97ed, 0x6618, 0x0d7e, 0x2668, 0x6e04, 0x0d7f, 0xa6b4, - 0xff00, 0x8637, 0xa686, 0x0006, 0x0040, 0x97e6, 0x2001, 0x0006, - 0x0078, 0x97e4, 0x2001, 0x0004, 0x0078, 0x97e4, 0x2001, 0x0006, - 0x1078, 0x97ed, 0x0078, 0x97e6, 0x1078, 0x4535, 0x1078, 0x61cd, - 0x1078, 0x772d, 0x1078, 0x62d1, 0x007c, 0x017e, 0x0d7e, 0x6118, - 0x2168, 0x6900, 0xd184, 0x0040, 0x9808, 0x6104, 0xa18e, 0x000a, - 0x00c0, 0x9800, 0x699c, 0xd1a4, 0x00c0, 0x9800, 0x2001, 0x0007, - 0x1078, 0x4502, 0x2001, 0x0000, 0x1078, 0x44ee, 0x1078, 0x28a6, - 0x0d7f, 0x017f, 0x007c, 0x0d7e, 0x6618, 0x2668, 0x6804, 0xa084, - 0xff00, 0x8007, 0x0d7f, 0xa0b2, 0x000c, 0x10c8, 0x1332, 0xa1b6, - 0x0015, 0x00c0, 0x981f, 0x1079, 0x9826, 0x0078, 0x9825, 0xa1b6, - 0x0016, 0x10c0, 0x1332, 0x1079, 0x9832, 0x007c, 0x7d4e, 0x7d4e, - 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x9887, 0x983e, 0x7d4e, 0x7d4e, - 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, - 0x9887, 0x988f, 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x0f7e, 0x2079, - 0xa752, 0x7804, 0xd0ac, 0x00c0, 0x9865, 0x6018, 0xa07d, 0x0040, - 0x9865, 0x7800, 0xd0f4, 0x00c0, 0x9851, 0x7810, 0xa005, 0x00c0, - 0x9865, 0x2001, 0x0000, 0x1078, 0x44ee, 0x2001, 0x0002, 0x1078, - 0x4502, 0x601f, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x1078, - 0x5dd7, 0x1078, 0x62d1, 0x0078, 0x9885, 0x2011, 0xac83, 0x2204, - 0x8211, 0x220c, 0x1078, 0x254d, 0x00c0, 0x9885, 0x0c7e, 0x1078, - 0x45c4, 0x0040, 0x9878, 0x0c7f, 0x1078, 0x772d, 0x0078, 0x9885, - 0x6010, 0x007e, 0x6014, 0x007e, 0x1078, 0x42f8, 0x007f, 0x6016, - 0x007f, 0x6012, 0x0c7f, 0x1078, 0x772d, 0x0f7f, 0x007c, 0x6604, - 0xa6b6, 0x001e, 0x00c0, 0x988e, 0x1078, 0x772d, 0x007c, 0x1078, - 0x7f8e, 0x00c0, 0x989b, 0x6003, 0x0001, 0x6007, 0x0001, 0x1078, - 0x5dd7, 0x0078, 0x989d, 0x1078, 0x772d, 0x007c, 0x6004, 0xa08a, - 0x0044, 0x10c8, 0x1332, 0x1078, 0x61cd, 0x1078, 0x8ed6, 0x1078, - 0x62d1, 0x007c, 0xa182, 0x0040, 0x0079, 0x98ae, 0x98c1, 0x98c1, - 0x98c1, 0x98c1, 0x98c3, 0x98c1, 0x98c1, 0x98c1, 0x98c1, 0x98c1, - 0x98c1, 0x98c1, 0x98c1, 0x98c1, 0x98c1, 0x98c1, 0x98c1, 0x98c1, - 0x98c1, 0x1078, 0x1332, 0x0d7e, 0x0e7e, 0x0f7e, 0x157e, 0x047e, - 0x027e, 0x6218, 0xa280, 0x002b, 0x2004, 0xa005, 0x0040, 0x98d4, - 0x2021, 0x0000, 0x1078, 0xa482, 0x6106, 0x2071, 0xac80, 0x7444, - 0xa4a4, 0xff00, 0x0040, 0x992b, 0xa486, 0x2000, 0x00c0, 0x98e6, - 0x2009, 0x0001, 0x2011, 0x0200, 0x1078, 0x5bf1, 0x1078, 0x138b, - 0x1040, 0x1332, 0x6003, 0x0007, 0x2d00, 0x6837, 0x010d, 0x6803, - 0x0000, 0x683b, 0x0000, 0x6c5a, 0x2c00, 0x685e, 0x6008, 0x68b2, - 0x6018, 0x2078, 0x78a0, 0x8007, 0x7130, 0x694a, 0x017e, 0xa084, - 0xff00, 0x6846, 0x684f, 0x0000, 0x6857, 0x0036, 0x1078, 0x4a73, - 0x017f, 0xa486, 0x2000, 0x00c0, 0x9913, 0x2019, 0x0017, 0x1078, - 0xa1a5, 0x0078, 0x998d, 0xa486, 0x0400, 0x00c0, 0x991d, 0x2019, - 0x0002, 0x1078, 0xa156, 0x0078, 0x998d, 0xa486, 0x0200, 0x00c0, - 0x9923, 0x1078, 0xa13b, 0xa486, 0x1000, 0x00c0, 0x9929, 0x1078, - 0xa18a, 0x0078, 0x998d, 0x2069, 0xaa33, 0x6a00, 0xd284, 0x0040, - 0x99f7, 0xa284, 0x0300, 0x00c0, 0x99ef, 0x6804, 0xa005, 0x0040, - 0x99d5, 0x2d78, 0x6003, 0x0007, 0x1078, 0x1370, 0x0040, 0x9994, - 0x7800, 0xd08c, 0x00c0, 0x9947, 0x7804, 0x8001, 0x7806, 0x6013, - 0x0000, 0x6803, 0x0000, 0x6837, 0x0116, 0x683b, 0x0000, 0x6008, - 0x68b2, 0x2c00, 0x684a, 0x6018, 0x2078, 0x78a0, 0x8007, 0x7130, - 0x6986, 0x6846, 0x7928, 0x698a, 0x792c, 0x698e, 0x7930, 0x6992, - 0x7934, 0x6996, 0x6853, 0x003d, 0x7244, 0xa294, 0x0003, 0xa286, - 0x0002, 0x00c0, 0x996f, 0x684f, 0x0040, 0x0078, 0x9979, 0xa286, - 0x0001, 0x00c0, 0x9977, 0x684f, 0x0080, 0x0078, 0x9979, 0x684f, - 0x0000, 0x20a9, 0x000a, 0x2001, 0xac90, 0xad90, 0x0015, 0x200c, - 0x810f, 0x2112, 0x8000, 0x8210, 0x00f0, 0x997f, 0x200c, 0x6982, - 0x8000, 0x200c, 0x697e, 0x1078, 0x4a73, 0x027f, 0x047f, 0x157f, - 0x0f7f, 0x0e7f, 0x0d7f, 0x007c, 0x2001, 0xa70e, 0x2004, 0xd084, - 0x0040, 0x999e, 0x1078, 0x138b, 0x00c0, 0x9940, 0x6013, 0x0100, - 0x6003, 0x0001, 0x6007, 0x0041, 0x1078, 0x5d8a, 0x1078, 0x62d1, - 0x0078, 0x998d, 0x2069, 0xac92, 0x2d04, 0xa084, 0xff00, 0xa086, - 0x1200, 0x00c0, 0x99c9, 0x2069, 0xac80, 0x686c, 0xa084, 0x00ff, - 0x017e, 0x6110, 0xa18c, 0x0700, 0xa10d, 0x6112, 0x017f, 0x6003, - 0x0001, 0x6007, 0x0043, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0078, - 0x998d, 0x6013, 0x0200, 0x6003, 0x0001, 0x6007, 0x0041, 0x1078, - 0x5d8a, 0x1078, 0x62d1, 0x0078, 0x998d, 0x2001, 0xa70d, 0x2004, - 0xd0ec, 0x0040, 0x99df, 0x2011, 0x8049, 0x1078, 0x361b, 0x6013, - 0x0300, 0x0078, 0x99e5, 0x6013, 0x0100, 0x6003, 0x0001, 0x6007, - 0x0041, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0078, 0x998d, 0x6013, - 0x0500, 0x0078, 0x99e5, 0x6013, 0x0600, 0x0078, 0x99aa, 0x6013, - 0x0200, 0x0078, 0x99aa, 0xa186, 0x0013, 0x00c0, 0x9a0d, 0x6004, - 0xa08a, 0x0040, 0x1048, 0x1332, 0xa08a, 0x0053, 0x10c8, 0x1332, - 0xa082, 0x0040, 0x2008, 0x0079, 0x9a92, 0xa186, 0x0051, 0x0040, - 0x9a1a, 0xa186, 0x0047, 0x00c0, 0x9a33, 0x6004, 0xa086, 0x0041, - 0x0040, 0x9a41, 0x2001, 0x0109, 0x2004, 0xd084, 0x0040, 0x9a41, - 0x127e, 0x2091, 0x2200, 0x007e, 0x017e, 0x027e, 0x1078, 0x5c56, - 0x027f, 0x017f, 0x007f, 0x127f, 0x6000, 0xa086, 0x0002, 0x00c0, - 0x9a41, 0x0078, 0x9ad7, 0xa186, 0x0027, 0x0040, 0x9a3b, 0xa186, - 0x0014, 0x10c0, 0x1332, 0x6004, 0xa082, 0x0040, 0x2008, 0x0079, - 0x9a44, 0x1078, 0x7773, 0x007c, 0x9a57, 0x9a59, 0x9a59, 0x9a81, - 0x9a57, 0x9a57, 0x9a57, 0x9a57, 0x9a57, 0x9a57, 0x9a57, 0x9a57, - 0x9a57, 0x9a57, 0x9a57, 0x9a57, 0x9a57, 0x9a57, 0x9a57, 0x1078, - 0x1332, 0x1078, 0x61cd, 0x1078, 0x62d1, 0x037e, 0x0d7e, 0x6010, - 0xa06d, 0x0040, 0x9a7e, 0xad84, 0xf000, 0x0040, 0x9a7e, 0x6003, - 0x0002, 0x6018, 0x2004, 0xd0bc, 0x00c0, 0x9a7e, 0x2019, 0x0004, - 0x1078, 0xa1da, 0x6013, 0x0000, 0x6014, 0xa005, 0x00c0, 0x9a7c, - 0x2001, 0xa9a3, 0x2004, 0x6016, 0x6003, 0x0007, 0x0d7f, 0x037f, - 0x007c, 0x0d7e, 0x1078, 0x61cd, 0x1078, 0x62d1, 0x1078, 0x8d16, - 0x0040, 0x9a8e, 0x6010, 0x2068, 0x1078, 0x13a4, 0x1078, 0x8ed6, - 0x0d7f, 0x007c, 0x9aa5, 0x9ac4, 0x9aae, 0x9ad1, 0x9aa5, 0x9aa5, - 0x9aa5, 0x9aa5, 0x9aa5, 0x9aa5, 0x9aa5, 0x9aa5, 0x9aa5, 0x9aa5, - 0x9aa5, 0x9aa5, 0x9aa5, 0x9aa5, 0x9aa5, 0x1078, 0x1332, 0x6010, - 0xa088, 0x0013, 0x2104, 0xa085, 0x0400, 0x200a, 0x1078, 0x61cd, - 0x6010, 0xa080, 0x0013, 0x2004, 0xd0b4, 0x0040, 0x9abf, 0x6003, - 0x0007, 0x2009, 0x0043, 0x1078, 0x775c, 0x0078, 0x9ac1, 0x6003, - 0x0002, 0x1078, 0x62d1, 0x007c, 0x1078, 0x61cd, 0x1078, 0xa433, - 0x00c0, 0x9ace, 0x1078, 0x5bc1, 0x1078, 0x772d, 0x1078, 0x62d1, - 0x007c, 0x1078, 0x61cd, 0x2009, 0x0041, 0x0078, 0x9c2e, 0xa182, - 0x0040, 0x0079, 0x9adb, 0x9aee, 0x9af0, 0x9aee, 0x9aee, 0x9aee, - 0x9aee, 0x9aee, 0x9af1, 0x9aee, 0x9aee, 0x9aee, 0x9aee, 0x9aee, - 0x9aee, 0x9aee, 0x9aee, 0x9aee, 0x9afc, 0x9aee, 0x1078, 0x1332, - 0x007c, 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005, 0x3d18, 0x3e20, - 0x2c10, 0x1078, 0x15fa, 0x007c, 0x0d7e, 0x1078, 0x5bc1, 0x0d7f, - 0x1078, 0xa4a5, 0x1078, 0x772d, 0x007c, 0xa182, 0x0040, 0x0079, - 0x9b09, 0x9b1c, 0x9b1c, 0x9b1c, 0x9b1c, 0x9b1c, 0x9b1c, 0x9b1c, - 0x9b1e, 0x9b1c, 0x9b21, 0x9b4c, 0x9b1c, 0x9b1c, 0x9b1c, 0x9b1c, - 0x9b4c, 0x9b1c, 0x9b1c, 0x9b1c, 0x1078, 0x1332, 0x1078, 0x7773, - 0x007c, 0x1078, 0x627a, 0x1078, 0x639b, 0x6010, 0x0d7e, 0x2068, - 0x684c, 0xd0fc, 0x0040, 0x9b37, 0xa08c, 0x0003, 0xa18e, 0x0002, - 0x0040, 0x9b3f, 0x2009, 0x0041, 0x0d7f, 0x0078, 0x9c2e, 0x6003, - 0x0007, 0x6017, 0x0000, 0x1078, 0x5bc1, 0x0d7f, 0x007c, 0x1078, - 0xa433, 0x0040, 0x9b45, 0x0d7f, 0x007c, 0x1078, 0x5bc1, 0x1078, - 0x772d, 0x0d7f, 0x0078, 0x9b3e, 0x037e, 0x1078, 0x627a, 0x1078, - 0x639b, 0x6010, 0x0d7e, 0x2068, 0x6018, 0x2004, 0xd0bc, 0x0040, - 0x9b6c, 0x684c, 0xa084, 0x0003, 0xa086, 0x0002, 0x0040, 0x9b68, - 0x687c, 0x632c, 0xa31a, 0x632e, 0x6880, 0x6328, 0xa31b, 0x632a, - 0x6003, 0x0002, 0x0078, 0x9b7d, 0x2019, 0x0004, 0x1078, 0xa1da, - 0x6014, 0xa005, 0x00c0, 0x9b79, 0x2001, 0xa9a3, 0x2004, 0x8003, - 0x6016, 0x6013, 0x0000, 0x6003, 0x0007, 0x0d7f, 0x037f, 0x007c, - 0xa186, 0x0013, 0x00c0, 0x9b8e, 0x6004, 0xa086, 0x0042, 0x10c0, - 0x1332, 0x1078, 0x61cd, 0x1078, 0x62d1, 0x007c, 0xa186, 0x0027, - 0x0040, 0x9b96, 0xa186, 0x0014, 0x00c0, 0x9ba6, 0x6004, 0xa086, - 0x0042, 0x10c0, 0x1332, 0x2001, 0x0007, 0x1078, 0x4535, 0x1078, - 0x61cd, 0x1078, 0x8ed6, 0x1078, 0x62d1, 0x007c, 0xa182, 0x0040, - 0x0079, 0x9baa, 0x9bbd, 0x9bbd, 0x9bbd, 0x9bbd, 0x9bbd, 0x9bbd, - 0x9bbd, 0x9bbf, 0x9bcb, 0x9bbd, 0x9bbd, 0x9bbd, 0x9bbd, 0x9bbd, - 0x9bbd, 0x9bbd, 0x9bbd, 0x9bbd, 0x9bbd, 0x1078, 0x1332, 0x037e, - 0x047e, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078, 0x15fa, - 0x047f, 0x037f, 0x007c, 0x6010, 0x0d7e, 0x2068, 0x6810, 0x6a14, - 0x6118, 0x210c, 0xd1bc, 0x0040, 0x9bea, 0x6124, 0xd1f4, 0x00c0, - 0x9bea, 0x007e, 0x047e, 0x057e, 0x6c7c, 0xa422, 0x6d80, 0x2200, - 0xa52b, 0x602c, 0xa420, 0x642e, 0x6028, 0xa529, 0x652a, 0x057f, - 0x047f, 0x007f, 0xa20d, 0x00c0, 0x9bfe, 0x684c, 0xd0fc, 0x0040, - 0x9bf6, 0x2009, 0x0041, 0x0d7f, 0x0078, 0x9c2e, 0x6003, 0x0007, - 0x6017, 0x0000, 0x1078, 0x5bc1, 0x0d7f, 0x007c, 0x007e, 0x0f7e, - 0x2c78, 0x1078, 0x4963, 0x0f7f, 0x007f, 0x0040, 0x9c0b, 0x6003, - 0x0002, 0x0d7f, 0x007c, 0x2009, 0xa70d, 0x210c, 0xd19c, 0x0040, - 0x9c15, 0x6003, 0x0007, 0x0078, 0x9c17, 0x6003, 0x0006, 0x1078, - 0x9c1d, 0x1078, 0x5bc3, 0x0d7f, 0x007c, 0xd2fc, 0x0040, 0x9c29, - 0x8002, 0x8000, 0x8212, 0xa291, 0x0000, 0x2009, 0x0009, 0x0078, - 0x9c2b, 0x2009, 0x0015, 0x6a6a, 0x6866, 0x007c, 0xa182, 0x0040, - 0x0048, 0x9c34, 0x0079, 0x9c41, 0xa186, 0x0013, 0x0040, 0x9c3c, - 0xa186, 0x0014, 0x10c0, 0x1332, 0x6024, 0xd0dc, 0x1040, 0x1332, - 0x007c, 0x9c54, 0x9c5b, 0x9c67, 0x9c73, 0x9c54, 0x9c54, 0x9c54, - 0x9c82, 0x9c54, 0x9c56, 0x9c56, 0x9c54, 0x9c54, 0x9c54, 0x9c54, - 0x9c54, 0x9c54, 0x9c54, 0x9c54, 0x1078, 0x1332, 0x6024, 0xd0dc, - 0x1040, 0x1332, 0x007c, 0x6003, 0x0001, 0x6106, 0x1078, 0x5d8a, - 0x127e, 0x2091, 0x8000, 0x1078, 0x62d1, 0x127f, 0x007c, 0x6003, - 0x0001, 0x6106, 0x1078, 0x5d8a, 0x127e, 0x2091, 0x8000, 0x1078, - 0x62d1, 0x127f, 0x007c, 0x6003, 0x0003, 0x6106, 0x2c10, 0x1078, - 0x1cf0, 0x127e, 0x2091, 0x8000, 0x1078, 0x5df6, 0x1078, 0x639b, - 0x127f, 0x007c, 0xa016, 0x1078, 0x15fa, 0x007c, 0x127e, 0x2091, - 0x8000, 0x037e, 0x0d7e, 0xa182, 0x0040, 0x1079, 0x9c93, 0x0d7f, - 0x037f, 0x127f, 0x007c, 0x9ca3, 0x9ca5, 0x9cba, 0x9cd9, 0x9ca3, - 0x9ca3, 0x9ca3, 0x9cf1, 0x9ca3, 0x9ca3, 0x9ca3, 0x9ca3, 0x9ca3, - 0x9ca3, 0x9ca3, 0x9ca3, 0x1078, 0x1332, 0x6010, 0x2068, 0x684c, - 0xd0fc, 0x0040, 0x9ccf, 0xa09c, 0x0003, 0xa39e, 0x0003, 0x0040, - 0x9ccf, 0x6003, 0x0001, 0x6106, 0x1078, 0x5d8a, 0x1078, 0x62d1, - 0x0078, 0x9cf4, 0x6010, 0x2068, 0x684c, 0xd0fc, 0x0040, 0x9ccf, - 0xa09c, 0x0003, 0xa39e, 0x0003, 0x0040, 0x9ccf, 0x6003, 0x0001, - 0x6106, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0078, 0x9cf4, 0x6013, - 0x0000, 0x6017, 0x0000, 0x2019, 0x0004, 0x1078, 0xa1da, 0x0078, - 0x9cf4, 0x6010, 0x2068, 0x684c, 0xd0fc, 0x0040, 0x9ccf, 0xa09c, - 0x0003, 0xa39e, 0x0003, 0x0040, 0x9ccf, 0x6003, 0x0003, 0x6106, - 0x2c10, 0x1078, 0x1cf0, 0x1078, 0x5df6, 0x1078, 0x639b, 0x0078, - 0x9cf4, 0xa016, 0x1078, 0x15fa, 0x007c, 0x1078, 0x61cd, 0x6110, - 0x81ff, 0x0040, 0x9d06, 0x0d7e, 0x2168, 0x1078, 0xa4f2, 0x037e, - 0x2019, 0x0029, 0x1078, 0xa1da, 0x037f, 0x0d7f, 0x1078, 0x8ed6, - 0x1078, 0x62d1, 0x007c, 0x1078, 0x627a, 0x6110, 0x81ff, 0x0040, - 0x9d1c, 0x0d7e, 0x2168, 0x1078, 0xa4f2, 0x037e, 0x2019, 0x0029, - 0x1078, 0xa1da, 0x037f, 0x0d7f, 0x1078, 0x8ed6, 0x1078, 0x639b, - 0x007c, 0xa182, 0x0085, 0x0079, 0x9d25, 0x9d2e, 0x9d2c, 0x9d2c, - 0x9d3a, 0x9d2c, 0x9d2c, 0x9d2c, 0x1078, 0x1332, 0x6003, 0x000b, - 0x6106, 0x1078, 0x5d8a, 0x127e, 0x2091, 0x8000, 0x1078, 0x62d1, - 0x127f, 0x007c, 0x027e, 0x0e7e, 0x1078, 0xa42c, 0x0040, 0x9d44, - 0x1078, 0x772d, 0x0078, 0x9d60, 0x2071, 0xac80, 0x7224, 0x6212, - 0x7220, 0x1078, 0xa079, 0x0040, 0x9d51, 0x6007, 0x0086, 0x0078, - 0x9d5a, 0x6007, 0x0087, 0x7224, 0xa296, 0xffff, 0x00c0, 0x9d5a, - 0x6007, 0x0086, 0x6003, 0x0001, 0x1078, 0x5d8a, 0x1078, 0x62d1, - 0x0e7f, 0x027f, 0x007c, 0xa186, 0x0013, 0x00c0, 0x9d74, 0x6004, - 0xa08a, 0x0085, 0x1048, 0x1332, 0xa08a, 0x008c, 0x10c8, 0x1332, - 0xa082, 0x0085, 0x0079, 0x9d8b, 0xa186, 0x0027, 0x0040, 0x9d80, - 0xa186, 0x0014, 0x0040, 0x9d80, 0x1078, 0x7773, 0x0078, 0x9d8a, - 0x2001, 0x0007, 0x1078, 0x4535, 0x1078, 0x61cd, 0x1078, 0x8ed6, - 0x1078, 0x62d1, 0x007c, 0x9d92, 0x9d94, 0x9d94, 0x9d92, 0x9d92, - 0x9d92, 0x9d92, 0x1078, 0x1332, 0x1078, 0x61cd, 0x1078, 0x8ed6, - 0x1078, 0x62d1, 0x007c, 0xa182, 0x0085, 0x1048, 0x1332, 0xa182, - 0x008c, 0x10c8, 0x1332, 0xa182, 0x0085, 0x0079, 0x9da7, 0x9dae, - 0x9dae, 0x9dae, 0x9db0, 0x9dae, 0x9dae, 0x9dae, 0x1078, 0x1332, - 0x007c, 0xa186, 0x0013, 0x0040, 0x9dc1, 0xa186, 0x0014, 0x0040, - 0x9dc1, 0xa186, 0x0027, 0x0040, 0x9dc1, 0x1078, 0x7773, 0x0078, - 0x9dc7, 0x1078, 0x61cd, 0x1078, 0x8ed6, 0x1078, 0x62d1, 0x007c, - 0x037e, 0x1078, 0xa4a5, 0x603f, 0x0000, 0x2019, 0x000b, 0x1078, - 0x9dd7, 0x601f, 0x0006, 0x6003, 0x0007, 0x037f, 0x007c, 0x127e, - 0x037e, 0x2091, 0x8000, 0x087e, 0x2c40, 0x097e, 0x2049, 0x0000, - 0x1078, 0x7246, 0x097f, 0x087f, 0x00c0, 0x9e12, 0x077e, 0x2c38, - 0x1078, 0x72f3, 0x077f, 0x00c0, 0x9e12, 0x6000, 0xa086, 0x0000, - 0x0040, 0x9e12, 0x601c, 0xa086, 0x0007, 0x0040, 0x9e12, 0x0d7e, - 0x6000, 0xa086, 0x0004, 0x00c0, 0x9e03, 0x1078, 0xa4a5, 0x601f, - 0x0007, 0x1078, 0x1757, 0x6010, 0x2068, 0x1078, 0x8d16, 0x0040, - 0x9e0b, 0x1078, 0xa1da, 0x0d7f, 0x6013, 0x0000, 0x1078, 0xa4a5, - 0x601f, 0x0007, 0x037f, 0x127f, 0x007c, 0x0f7e, 0x0c7e, 0x037e, - 0x157e, 0x2079, 0xac80, 0x7938, 0x783c, 0x1078, 0x254d, 0x00c0, - 0x9e59, 0x017e, 0x0c7e, 0x1078, 0x45c4, 0x00c0, 0x9e59, 0x017f, - 0x027f, 0x027e, 0x017e, 0x2019, 0x0029, 0x1078, 0x73d0, 0x1078, - 0x5f01, 0x077e, 0x2039, 0x0000, 0x1078, 0x5e0a, 0x077f, 0x017f, - 0x077e, 0x2039, 0x0000, 0x1078, 0x9f9b, 0x077f, 0x1078, 0x47e9, - 0x027e, 0x6204, 0xa294, 0xff00, 0x8217, 0xa286, 0x0006, 0x0040, - 0x9e4d, 0xa286, 0x0004, 0x00c0, 0x9e50, 0x62a0, 0x1078, 0x2942, - 0x027f, 0x017f, 0x1078, 0x42f8, 0x6612, 0x6516, 0xa006, 0x0078, - 0x9e5b, 0x0c7f, 0x017f, 0x157f, 0x037f, 0x0c7f, 0x0f7f, 0x007c, - 0x0c7e, 0x0d7e, 0x0e7e, 0x017e, 0x2009, 0xa720, 0x2104, 0xa086, - 0x0074, 0x00c0, 0x9ec3, 0x2069, 0xac8e, 0x690c, 0xa182, 0x0100, - 0x0048, 0x9eb3, 0x6908, 0xa184, 0x8000, 0x0040, 0x9ebf, 0x6018, - 0x2070, 0x7010, 0xa084, 0x00ff, 0x0040, 0x9e82, 0x7000, 0xd0f4, - 0x0040, 0x9e86, 0xa184, 0x0800, 0x0040, 0x9ebf, 0x6910, 0xa18a, - 0x0001, 0x0048, 0x9eb7, 0x6914, 0x2069, 0xacae, 0x6904, 0x81ff, - 0x00c0, 0x9eab, 0x690c, 0xa182, 0x0100, 0x0048, 0x9eb3, 0x6908, - 0x81ff, 0x00c0, 0x9eaf, 0x6910, 0xa18a, 0x0001, 0x0048, 0x9eb7, - 0x6918, 0xa18a, 0x0001, 0x0048, 0x9ebf, 0x0078, 0x9ec9, 0x6013, - 0x0100, 0x0078, 0x9ec5, 0x6013, 0x0300, 0x0078, 0x9ec5, 0x6013, - 0x0500, 0x0078, 0x9ec5, 0x6013, 0x0700, 0x0078, 0x9ec5, 0x6013, - 0x0900, 0x0078, 0x9ec5, 0x6013, 0x0b00, 0x0078, 0x9ec5, 0x6013, - 0x0f00, 0x0078, 0x9ec5, 0x6013, 0x2d00, 0xa085, 0x0001, 0x0078, - 0x9eca, 0xa006, 0x017f, 0x0e7f, 0x0d7f, 0x0c7f, 0x007c, 0x0c7e, - 0x0d7e, 0x027e, 0x037e, 0x157e, 0x6218, 0x2268, 0x6b04, 0xa394, - 0x00ff, 0xa286, 0x0006, 0x0040, 0x9ef3, 0xa286, 0x0004, 0x0040, - 0x9ef3, 0xa394, 0xff00, 0x8217, 0xa286, 0x0006, 0x0040, 0x9ef3, - 0xa286, 0x0004, 0x0040, 0x9ef3, 0x0c7e, 0x2d60, 0x1078, 0x45d6, - 0x0c7f, 0x0078, 0x9f2e, 0x2011, 0xac96, 0xad98, 0x000a, 0x20a9, - 0x0004, 0x1078, 0x80de, 0x00c0, 0x9f2f, 0x2011, 0xac9a, 0xad98, - 0x0006, 0x20a9, 0x0004, 0x1078, 0x80de, 0x00c0, 0x9f2f, 0x047e, - 0x017e, 0x6aa0, 0xa294, 0x00ff, 0x8227, 0xa006, 0x2009, 0xa753, - 0x210c, 0xd1a4, 0x0040, 0x9f1b, 0x2009, 0x0029, 0x1078, 0xa22d, - 0x6800, 0xc0e5, 0x6802, 0x2019, 0x0029, 0x1078, 0x5f01, 0x077e, - 0x2039, 0x0000, 0x1078, 0x5e0a, 0x2c08, 0x1078, 0x9f9b, 0x077f, - 0x2001, 0x0007, 0x1078, 0x4535, 0x017f, 0x047f, 0xa006, 0x157f, - 0x037f, 0x027f, 0x0d7f, 0x0c7f, 0x007c, 0x0d7e, 0x2069, 0xac8e, - 0x6800, 0xa086, 0x0800, 0x0040, 0x9f41, 0x6013, 0x0000, 0x0078, - 0x9f42, 0xa006, 0x0d7f, 0x007c, 0x0c7e, 0x0f7e, 0x017e, 0x027e, - 0x037e, 0x157e, 0x2079, 0xac8c, 0x7930, 0x7834, 0x1078, 0x254d, - 0x00c0, 0x9f68, 0x1078, 0x45c4, 0x00c0, 0x9f68, 0x2011, 0xac90, - 0xac98, 0x000a, 0x20a9, 0x0004, 0x1078, 0x80de, 0x00c0, 0x9f68, - 0x2011, 0xac94, 0xac98, 0x0006, 0x20a9, 0x0004, 0x1078, 0x80de, - 0x157f, 0x037f, 0x027f, 0x017f, 0x0f7f, 0x0c7f, 0x007c, 0x0c7e, - 0x007e, 0x017e, 0x027e, 0x037e, 0x157e, 0x2011, 0xac83, 0x2204, - 0x8211, 0x220c, 0x1078, 0x254d, 0x00c0, 0x9f94, 0x1078, 0x45c4, - 0x00c0, 0x9f94, 0x2011, 0xac96, 0xac98, 0x000a, 0x20a9, 0x0004, - 0x1078, 0x80de, 0x00c0, 0x9f94, 0x2011, 0xac9a, 0xac98, 0x0006, - 0x20a9, 0x0004, 0x1078, 0x80de, 0x157f, 0x037f, 0x027f, 0x017f, - 0x007f, 0x0c7f, 0x007c, 0x0e7e, 0x0c7e, 0x087e, 0x077e, 0x067e, - 0x057e, 0x047e, 0x027e, 0x127e, 0x2091, 0x8000, 0x2740, 0x2029, - 0xa9ba, 0x252c, 0x2021, 0xa9c0, 0x2424, 0x2061, 0xae00, 0x2071, - 0xa700, 0x7648, 0x7064, 0x81ff, 0x0040, 0x9fc2, 0x007e, 0xa186, - 0xaab3, 0x007f, 0x0040, 0x9fc2, 0x8001, 0xa602, 0x00c8, 0xa02c, - 0x0078, 0x9fc5, 0xa606, 0x0040, 0xa02c, 0x2100, 0xac06, 0x0040, - 0xa022, 0x1078, 0xa252, 0x0040, 0xa022, 0x671c, 0xa786, 0x0001, - 0x0040, 0xa047, 0xa786, 0x0004, 0x0040, 0xa047, 0xa786, 0x0007, - 0x0040, 0xa022, 0x2500, 0xac06, 0x0040, 0xa022, 0x2400, 0xac06, - 0x0040, 0xa022, 0x1078, 0xa266, 0x00c0, 0xa022, 0x88ff, 0x0040, - 0x9fed, 0x6020, 0xa906, 0x00c0, 0xa022, 0x0d7e, 0x6000, 0xa086, - 0x0004, 0x00c0, 0x9ff7, 0x017e, 0x1078, 0x1757, 0x017f, 0xa786, - 0x0008, 0x00c0, 0xa006, 0x1078, 0x8f10, 0x00c0, 0xa006, 0x1078, - 0x7c83, 0x0d7f, 0x1078, 0x8ed6, 0x0078, 0xa022, 0x6010, 0x2068, - 0x1078, 0x8d16, 0x0040, 0xa01f, 0xa786, 0x0003, 0x00c0, 0xa036, - 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0xa4f2, 0x017e, - 0x1078, 0x8f8d, 0x1078, 0x4a73, 0x017f, 0x1078, 0x8ec9, 0x0d7f, - 0x1078, 0x8ed6, 0xace0, 0x0010, 0x2001, 0xa716, 0x2004, 0xac02, - 0x00c8, 0xa02c, 0x0078, 0x9faf, 0x127f, 0x027f, 0x047f, 0x057f, - 0x067f, 0x077f, 0x087f, 0x0c7f, 0x0e7f, 0x007c, 0xa786, 0x0006, - 0x00c0, 0xa010, 0xa386, 0x0005, 0x0040, 0xa044, 0x1078, 0xa4f2, - 0x1078, 0xa1da, 0x0078, 0xa01f, 0x0d7f, 0x0078, 0xa022, 0x1078, - 0xa266, 0x00c0, 0xa022, 0x81ff, 0x0040, 0xa022, 0xa180, 0x0001, - 0x2004, 0xa086, 0x0018, 0x0040, 0xa05c, 0xa180, 0x0001, 0x2004, - 0xa086, 0x002d, 0x00c0, 0xa022, 0x6000, 0xa086, 0x0002, 0x00c0, - 0xa022, 0x1078, 0x8efc, 0x0040, 0xa06d, 0x1078, 0x8f10, 0x00c0, - 0xa022, 0x1078, 0x7c83, 0x0078, 0xa075, 0x1078, 0x28a6, 0x1078, - 0x8f10, 0x00c0, 0xa075, 0x1078, 0x7c83, 0x1078, 0x8ed6, 0x0078, - 0xa022, 0x0c7e, 0x0e7e, 0x017e, 0x2c08, 0x2170, 0xa006, 0x1078, - 0xa1f6, 0x017f, 0x0040, 0xa089, 0x601c, 0xa084, 0x000f, 0x1079, - 0xa08c, 0x0e7f, 0x0c7f, 0x007c, 0xa094, 0xa094, 0xa094, 0xa094, - 0xa094, 0xa094, 0xa096, 0xa094, 0xa006, 0x007c, 0x047e, 0x017e, - 0x7018, 0xa080, 0x0028, 0x2024, 0xa4a4, 0x00ff, 0x8427, 0x2c00, - 0x2009, 0x0020, 0x1078, 0xa22d, 0x017f, 0x047f, 0x037e, 0x2019, - 0x0002, 0x1078, 0x9dd7, 0x037f, 0xa085, 0x0001, 0x007c, 0x2001, - 0x0001, 0x1078, 0x44ee, 0x157e, 0x017e, 0x027e, 0x037e, 0x20a9, - 0x0004, 0x2019, 0xa705, 0x2011, 0xac96, 0x1078, 0x80de, 0x037f, - 0x027f, 0x017f, 0x157f, 0xa005, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, - 0x087e, 0x077e, 0x067e, 0x027e, 0x127e, 0x2091, 0x8000, 0x2740, - 0x2061, 0xae00, 0x2079, 0x0001, 0x8fff, 0x0040, 0xa12d, 0x2071, - 0xa700, 0x7648, 0x7064, 0x8001, 0xa602, 0x00c8, 0xa12d, 0x88ff, - 0x0040, 0xa0e8, 0x2800, 0xac06, 0x00c0, 0xa123, 0x2079, 0x0000, - 0x1078, 0xa252, 0x0040, 0xa123, 0x2400, 0xac06, 0x0040, 0xa123, - 0x671c, 0xa786, 0x0006, 0x00c0, 0xa123, 0xa786, 0x0007, 0x0040, - 0xa123, 0x88ff, 0x00c0, 0xa107, 0x6018, 0xa206, 0x00c0, 0xa123, - 0x85ff, 0x0040, 0xa107, 0x6020, 0xa106, 0x00c0, 0xa123, 0x0d7e, - 0x6000, 0xa086, 0x0004, 0x00c0, 0xa113, 0x1078, 0xa4a5, 0x601f, - 0x0007, 0x1078, 0x1757, 0x6010, 0x2068, 0x1078, 0x8d16, 0x0040, - 0xa11d, 0x047e, 0x1078, 0xa1da, 0x047f, 0x0d7f, 0x1078, 0x8ed6, - 0x88ff, 0x00c0, 0xa137, 0xace0, 0x0010, 0x2001, 0xa716, 0x2004, - 0xac02, 0x00c8, 0xa12d, 0x0078, 0xa0d4, 0xa006, 0x127f, 0x027f, - 0x067f, 0x077f, 0x087f, 0x0c7f, 0x0e7f, 0x0f7f, 0x007c, 0xa8c5, - 0x0001, 0x0078, 0xa12e, 0x077e, 0x057e, 0x087e, 0x2041, 0x0000, - 0x2029, 0x0001, 0x2c20, 0x2019, 0x0002, 0x6218, 0x097e, 0x2049, - 0x0000, 0x1078, 0x7246, 0x097f, 0x087f, 0x2039, 0x0000, 0x1078, - 0x72f3, 0x1078, 0xa0c5, 0x057f, 0x077f, 0x007c, 0x027e, 0x047e, - 0x057e, 0x077e, 0x0c7e, 0x157e, 0x2c20, 0x2128, 0x20a9, 0x007f, - 0x2009, 0x0000, 0x017e, 0x037e, 0x1078, 0x45c4, 0x00c0, 0xa17e, - 0x2c10, 0x057e, 0x087e, 0x2041, 0x0000, 0x2508, 0x2029, 0x0001, - 0x097e, 0x2049, 0x0000, 0x1078, 0x7246, 0x097f, 0x087f, 0x2039, - 0x0000, 0x1078, 0x72f3, 0x1078, 0xa0c5, 0x057f, 0x037f, 0x017f, - 0x8108, 0x00f0, 0xa162, 0x157f, 0x0c7f, 0x077f, 0x057f, 0x047f, - 0x027f, 0x007c, 0x077e, 0x057e, 0x6218, 0x087e, 0x2041, 0x0000, - 0x2029, 0x0001, 0x2019, 0x0048, 0x097e, 0x2049, 0x0000, 0x1078, - 0x7246, 0x097f, 0x087f, 0x2039, 0x0000, 0x1078, 0x72f3, 0x2c20, - 0x1078, 0xa0c5, 0x057f, 0x077f, 0x007c, 0x027e, 0x047e, 0x057e, - 0x077e, 0x0c7e, 0x157e, 0x2c20, 0x20a9, 0x007f, 0x2009, 0x0000, - 0x017e, 0x037e, 0x1078, 0x45c4, 0x00c0, 0xa1ce, 0x2c10, 0x087e, - 0x2041, 0x0000, 0x2828, 0x047e, 0x2021, 0x0001, 0x1078, 0xa482, - 0x047f, 0x097e, 0x2049, 0x0000, 0x1078, 0x7246, 0x097f, 0x087f, - 0x2039, 0x0000, 0x1078, 0x72f3, 0x1078, 0xa0c5, 0x037f, 0x017f, - 0x8108, 0x00f0, 0xa1b0, 0x157f, 0x0c7f, 0x077f, 0x057f, 0x047f, - 0x027f, 0x007c, 0x017e, 0x0f7e, 0xad82, 0xce00, 0x0048, 0xa1f3, - 0xad82, 0xffff, 0x00c8, 0xa1f3, 0x6800, 0xa07d, 0x0040, 0xa1f0, - 0x6803, 0x0000, 0x6b52, 0x1078, 0x4a73, 0x2f68, 0x0078, 0xa1e4, - 0x6b52, 0x1078, 0x4a73, 0x0f7f, 0x017f, 0x007c, 0x0e7e, 0x047e, - 0x037e, 0x2061, 0xae00, 0xa005, 0x00c0, 0xa206, 0x2071, 0xa700, - 0x7448, 0x7064, 0x8001, 0xa402, 0x00c8, 0xa228, 0x2100, 0xac06, - 0x0040, 0xa21a, 0x6000, 0xa086, 0x0000, 0x0040, 0xa21a, 0x6008, - 0xa206, 0x00c0, 0xa21a, 0x6018, 0xa1a0, 0x0006, 0x2424, 0xa406, - 0x0040, 0xa224, 0xace0, 0x0010, 0x2001, 0xa716, 0x2004, 0xac02, - 0x00c8, 0xa228, 0x0078, 0xa206, 0xa085, 0x0001, 0x0078, 0xa229, - 0xa006, 0x037f, 0x047f, 0x0e7f, 0x007c, 0x0d7e, 0x007e, 0x1078, - 0x138b, 0x007f, 0x1040, 0x1332, 0x6837, 0x010d, 0x685e, 0x027e, - 0x2010, 0x1078, 0x8d02, 0x2001, 0x0000, 0x0040, 0xa243, 0x2200, - 0xa080, 0x0008, 0x2004, 0x027f, 0x684a, 0x6956, 0x6c46, 0x684f, - 0x0000, 0xa006, 0x68b2, 0x6802, 0x683a, 0x685a, 0x1078, 0x4a73, - 0x0d7f, 0x007c, 0x6700, 0xa786, 0x0000, 0x0040, 0xa265, 0xa786, - 0x0001, 0x0040, 0xa265, 0xa786, 0x000a, 0x0040, 0xa265, 0xa786, - 0x0009, 0x0040, 0xa265, 0xa085, 0x0001, 0x007c, 0x0e7e, 0x6018, - 0x2070, 0x70a0, 0xa206, 0x0e7f, 0x007c, 0x017e, 0x6004, 0xa08e, - 0x001e, 0x00c0, 0xa287, 0x8007, 0x6130, 0xa18c, 0x00ff, 0xa105, - 0x6032, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0005, 0x2001, - 0xa9a3, 0x2004, 0x6016, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x017f, - 0x007c, 0x0005, 0x0005, 0x007c, 0x6024, 0xd0e4, 0x0040, 0xa29d, - 0xd0cc, 0x0040, 0xa297, 0x1078, 0x8fcf, 0x0078, 0xa29d, 0x1078, - 0xa4a5, 0x1078, 0x5bc1, 0x1078, 0x772d, 0x007c, 0xa280, 0x0007, - 0x2004, 0xa084, 0x000f, 0x0079, 0xa2a5, 0xa2ae, 0xa2ae, 0xa2ae, - 0xa2b0, 0xa2ae, 0xa2b0, 0xa2b0, 0xa2ae, 0xa2b0, 0xa006, 0x007c, - 0xa085, 0x0001, 0x007c, 0xa280, 0x0007, 0x2004, 0xa084, 0x000f, - 0x0079, 0xa2ba, 0xa2c3, 0xa2c3, 0xa2c3, 0xa2c3, 0xa2c3, 0xa2c3, - 0xa2ce, 0xa2c3, 0xa2c3, 0x6007, 0x003b, 0x602b, 0x0009, 0x6013, - 0x2a00, 0x6003, 0x0001, 0x1078, 0x5d8a, 0x007c, 0x0c7e, 0x2260, - 0x1078, 0xa4a5, 0x603f, 0x0000, 0x6024, 0xc0f4, 0xc0cc, 0x6026, - 0x0c7f, 0x0d7e, 0x2268, 0xa186, 0x0007, 0x00c0, 0xa32f, 0x6810, - 0xa005, 0x0040, 0xa2ec, 0xa080, 0x0013, 0x2004, 0xd0fc, 0x00c0, - 0xa2ec, 0x0d7f, 0x0078, 0xa2c3, 0x6007, 0x003a, 0x6003, 0x0001, - 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0c7e, 0x2d60, 0x6100, 0xa186, - 0x0002, 0x00c0, 0xa3bd, 0x6010, 0xa005, 0x00c0, 0xa306, 0x6000, - 0xa086, 0x0007, 0x10c0, 0x1332, 0x0078, 0xa3bd, 0xa08c, 0xf000, - 0x00c0, 0xa312, 0x0078, 0xa312, 0x2068, 0x6800, 0xa005, 0x00c0, - 0xa30c, 0x2d00, 0xa080, 0x0013, 0x2004, 0xa084, 0x0003, 0xa086, - 0x0002, 0x00c0, 0xa32b, 0x6010, 0x2068, 0x684c, 0xc0dc, 0xc0f4, - 0x684e, 0x6850, 0xc0f4, 0xc0fc, 0x6852, 0x2009, 0x0043, 0x1078, - 0x9c2e, 0x0078, 0xa3bd, 0x2009, 0x0041, 0x0078, 0xa3b7, 0xa186, - 0x0005, 0x00c0, 0xa376, 0x6810, 0xa080, 0x0013, 0x2004, 0xd0bc, - 0x00c0, 0xa33d, 0x0d7f, 0x0078, 0xa2c3, 0xd0b4, 0x0040, 0xa345, - 0xd0fc, 0x1040, 0x1332, 0x0078, 0xa2df, 0x6007, 0x003a, 0x6003, - 0x0001, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0c7e, 0x2d60, 0x6100, - 0xa186, 0x0002, 0x0040, 0xa358, 0xa186, 0x0004, 0x00c0, 0xa3bd, - 0x2071, 0xa9e7, 0x7000, 0xa086, 0x0003, 0x00c0, 0xa365, 0x7004, - 0xac06, 0x00c0, 0xa365, 0x7003, 0x0000, 0x6810, 0xa080, 0x0013, - 0x200c, 0xc1f4, 0xc1dc, 0x2102, 0x8000, 0x200c, 0xc1f4, 0xc1fc, - 0xc1bc, 0x2102, 0x2009, 0x0042, 0x0078, 0xa3b7, 0x037e, 0x0d7e, - 0x0d7e, 0x1078, 0x138b, 0x037f, 0x1040, 0x1332, 0x6837, 0x010d, - 0x6803, 0x0000, 0x683b, 0x0000, 0x685b, 0x0000, 0x6b5e, 0x6857, - 0x0045, 0x2c00, 0x6862, 0x6034, 0x6872, 0x2360, 0x6024, 0xc0dd, - 0x6026, 0x6018, 0xa080, 0x0028, 0x2004, 0xa084, 0x00ff, 0x8007, - 0x6320, 0x6b4a, 0x6846, 0x684f, 0x0000, 0x6d6a, 0x6e66, 0x686f, - 0x0001, 0x1078, 0x4a73, 0x2019, 0x0045, 0x6008, 0x2068, 0x1078, - 0x9dd7, 0x2d00, 0x600a, 0x601f, 0x0006, 0x6003, 0x0007, 0x6017, - 0x0000, 0x603f, 0x0000, 0x0d7f, 0x037f, 0x0078, 0xa3be, 0x603f, - 0x0000, 0x6003, 0x0007, 0x1078, 0x9c2e, 0x0c7f, 0x0d7f, 0x007c, - 0xa186, 0x0013, 0x00c0, 0xa3ca, 0x6004, 0xa082, 0x0085, 0x2008, - 0x0079, 0xa3e4, 0xa186, 0x0027, 0x00c0, 0xa3dd, 0x1078, 0x61cd, - 0x037e, 0x0d7e, 0x6010, 0x2068, 0x2019, 0x0004, 0x1078, 0xa1da, - 0x0d7f, 0x037f, 0x1078, 0x62d1, 0x007c, 0xa186, 0x0014, 0x0040, - 0xa3ce, 0x1078, 0x7773, 0x007c, 0xa3ed, 0xa3eb, 0xa3eb, 0xa3eb, - 0xa3eb, 0xa3eb, 0xa3ed, 0x1078, 0x1332, 0x1078, 0x61cd, 0x6003, - 0x000c, 0x1078, 0x62d1, 0x007c, 0xa182, 0x008c, 0x00c8, 0xa3fe, - 0xa182, 0x0085, 0x0048, 0xa3fe, 0x0079, 0xa401, 0x1078, 0x7773, - 0x007c, 0xa408, 0xa408, 0xa408, 0xa408, 0xa40a, 0xa429, 0xa408, - 0x1078, 0x1332, 0x0d7e, 0x2c68, 0x1078, 0x76c7, 0x0040, 0xa424, - 0x6003, 0x0001, 0x6007, 0x001e, 0x2009, 0xac8e, 0x210c, 0x6136, - 0x2009, 0xac8f, 0x210c, 0x613a, 0x600b, 0xffff, 0x6918, 0x611a, - 0x601f, 0x0004, 0x1078, 0x5d8a, 0x2d60, 0x1078, 0x772d, 0x0d7f, - 0x007c, 0x1078, 0x772d, 0x007c, 0x0e7e, 0x6018, 0x2070, 0x7000, - 0xd0ec, 0x0e7f, 0x007c, 0x6010, 0xa08c, 0xf000, 0x0040, 0xa481, - 0xa080, 0x0013, 0x200c, 0xd1ec, 0x0040, 0xa481, 0x2001, 0xa772, - 0x2004, 0xd0ec, 0x0040, 0xa481, 0x6003, 0x0002, 0x6024, 0xc0e5, - 0x6026, 0xd1ac, 0x0040, 0xa45f, 0x0f7e, 0x2c78, 0x1078, 0x495f, - 0x0f7f, 0x0040, 0xa45f, 0x2001, 0xa9a4, 0x2004, 0x603e, 0x2009, - 0xa772, 0x210c, 0xd1f4, 0x00c0, 0xa47f, 0x0078, 0xa471, 0x2009, - 0xa772, 0x210c, 0xd1f4, 0x0040, 0xa46b, 0x6024, 0xc0e4, 0x6026, - 0xa006, 0x0078, 0xa481, 0x2001, 0xa9a4, 0x200c, 0x8103, 0xa100, - 0x603e, 0x6018, 0xa088, 0x002b, 0x2104, 0xa005, 0x0040, 0xa47c, - 0xa088, 0x0003, 0x0078, 0xa474, 0x2c0a, 0x600f, 0x0000, 0xa085, - 0x0001, 0x007c, 0x017e, 0x0c7e, 0x0e7e, 0x6120, 0xa2f0, 0x002b, - 0x2e04, 0x2060, 0x8cff, 0x0040, 0xa4a1, 0x84ff, 0x00c0, 0xa494, - 0x6020, 0xa106, 0x00c0, 0xa49c, 0x600c, 0x2072, 0x1078, 0x5bc1, - 0x1078, 0x772d, 0x0078, 0xa49e, 0xacf0, 0x0003, 0x2e64, 0x0078, - 0xa48a, 0x0e7f, 0x0c7f, 0x017f, 0x007c, 0x0d7e, 0x6018, 0xa0e8, - 0x002b, 0x2d04, 0xa005, 0x0040, 0xa4b7, 0xac06, 0x0040, 0xa4b5, - 0x2d04, 0xa0e8, 0x0003, 0x0078, 0xa4a9, 0x600c, 0x206a, 0x0d7f, - 0x007c, 0x027e, 0x037e, 0x157e, 0x2011, 0xa726, 0x2204, 0xa084, - 0x00ff, 0x2019, 0xac8e, 0x2334, 0xa636, 0x00c0, 0xa4e5, 0x8318, - 0x2334, 0x2204, 0xa084, 0xff00, 0xa636, 0x00c0, 0xa4e5, 0x2011, - 0xac90, 0x6018, 0xa098, 0x000a, 0x20a9, 0x0004, 0x1078, 0x80de, - 0x00c0, 0xa4e5, 0x2011, 0xac94, 0x6018, 0xa098, 0x0006, 0x20a9, - 0x0004, 0x1078, 0x80de, 0x00c0, 0xa4e5, 0x157f, 0x037f, 0x027f, - 0x007c, 0x0e7e, 0x2071, 0xa700, 0x1078, 0x42b8, 0x1078, 0x2677, - 0x0e7f, 0x007c, 0x0e7e, 0x6018, 0x2070, 0x7000, 0xd0fc, 0x0040, - 0xa4fb, 0x1078, 0xa4fd, 0x0e7f, 0x007c, 0x6850, 0xc0e5, 0x6852, - 0x007c, 0x0e7e, 0x0c7e, 0x077e, 0x067e, 0x057e, 0x047e, 0x027e, - 0x017e, 0x127e, 0x2091, 0x8000, 0x2029, 0xa9ba, 0x252c, 0x2021, - 0xa9c0, 0x2424, 0x2061, 0xae00, 0x2071, 0xa700, 0x7648, 0x7064, - 0xa606, 0x0040, 0xa555, 0x671c, 0xa786, 0x0001, 0x0040, 0xa524, - 0xa786, 0x0008, 0x00c0, 0xa54b, 0x2500, 0xac06, 0x0040, 0xa54b, - 0x2400, 0xac06, 0x0040, 0xa54b, 0x1078, 0xa252, 0x0040, 0xa54b, - 0x1078, 0xa266, 0x00c0, 0xa54b, 0x6000, 0xa086, 0x0004, 0x00c0, - 0xa53d, 0x017e, 0x1078, 0x1757, 0x017f, 0x1078, 0x8efc, 0x00c0, - 0xa543, 0x1078, 0x28a6, 0x1078, 0x8f10, 0x00c0, 0xa549, 0x1078, - 0x7c83, 0x1078, 0x8ed6, 0xace0, 0x0010, 0x2001, 0xa716, 0x2004, - 0xac02, 0x00c8, 0xa555, 0x0078, 0xa514, 0x127f, 0x017f, 0x027f, - 0x047f, 0x057f, 0x067f, 0x077f, 0x0c7f, 0x0e7f, 0x007c, 0x127e, - 0x007e, 0x0e7e, 0x017e, 0x2091, 0x8000, 0x2071, 0xa740, 0xd5a4, - 0x0040, 0xa56d, 0x7034, 0x8000, 0x7036, 0xd5b4, 0x0040, 0xa573, - 0x7030, 0x8000, 0x7032, 0xd5ac, 0x0040, 0xa589, 0x2500, 0xa084, - 0x0007, 0xa08e, 0x0003, 0x0040, 0xa589, 0xa08e, 0x0004, 0x0040, - 0xa589, 0xa08e, 0x0005, 0x0040, 0xa589, 0x2071, 0xa74a, 0x1078, - 0xa5ca, 0x017f, 0x0e7f, 0x007f, 0x127f, 0x007c, 0x127e, 0x007e, - 0x0e7e, 0x017e, 0x2091, 0x8000, 0x2071, 0xa740, 0xd5a4, 0x0040, - 0xa59c, 0x7034, 0x8000, 0x7036, 0xd5b4, 0x0040, 0xa5a2, 0x7030, - 0x8000, 0x7032, 0xd5ac, 0x0040, 0xa5b8, 0x2500, 0xa084, 0x0007, - 0xa08e, 0x0003, 0x0040, 0xa5b8, 0xa08e, 0x0004, 0x0040, 0xa5b8, - 0xa08e, 0x0005, 0x0040, 0xa5b8, 0x2071, 0xa74a, 0x1078, 0xa5ca, - 0x017f, 0x0e7f, 0x007f, 0x127f, 0x007c, 0x127e, 0x007e, 0x0e7e, - 0x2091, 0x8000, 0x2071, 0xa742, 0x1078, 0xa5ca, 0x0e7f, 0x007f, - 0x127f, 0x007c, 0x2e04, 0x8000, 0x2072, 0x00c8, 0xa5d3, 0x8e70, - 0x2e04, 0x8000, 0x2072, 0x007c, 0x0e7e, 0x2071, 0xa740, 0x1078, - 0xa5ca, 0x0e7f, 0x007c, 0x0e7e, 0x2071, 0xa744, 0x1078, 0xa5ca, - 0x0e7f, 0x007c, 0x127e, 0x007e, 0x0e7e, 0x2091, 0x8000, 0x2071, - 0xa740, 0x7044, 0x8000, 0x7046, 0x0e7f, 0x007f, 0x127f, 0x007c, - 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, - 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000, - 0x4811 +static u8 ql2100_fw_bin[] = { + 0x00, 0x78, 0x10, 0x2d, 0x00, 0x00, 0x96, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x13, 0x00, 0x19, 0x00, 0x17, 0x20, 0x43, 0x4f, 0x50, 0x59, 0x52, + 0x49, 0x47, 0x48, 0x54, 0x20, 0x32, 0x30, 0x30, 0x31, 0x20, 0x51, 0x4c, + 0x4f, 0x47, 0x49, 0x43, 0x20, 0x43, 0x4f, 0x52, 0x50, 0x4f, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x20, 0x49, 0x53, 0x50, 0x32, 0x31, 0x30, 0x30, + 0x20, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x20, 0x20, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x30, 0x31, 0x2e, 0x31, 0x39, + 0x20, 0x20, 0x20, 0x20, 0x24, 0x00, 0x20, 0x91, 0x20, 0x00, 0x20, 0xc1, + 0x00, 0x21, 0x20, 0x39, 0xff, 0xff, 0x20, 0x19, 0xaa, 0xaa, 0x27, 0x60, + 0x20, 0x69, 0x7f, 0xff, 0x20, 0xc1, 0x00, 0x20, 0x2c, 0x2c, 0x2d, 0x34, + 0x27, 0x62, 0x23, 0x6a, 0x2c, 0x24, 0x2d, 0x04, 0x26, 0x6a, 0x25, 0x62, + 0xa4, 0x06, 0x00, 0xc0, 0x10, 0x52, 0x20, 0xc1, 0x00, 0x21, 0x2c, 0x2c, + 0x23, 0x62, 0x2c, 0x04, 0x25, 0x62, 0xa3, 0x06, 0x00, 0x40, 0x10, 0x52, + 0x20, 0xc1, 0x00, 0x20, 0x20, 0x39, 0x8f, 0xff, 0x20, 0xa1, 0xae, 0x00, + 0x27, 0x08, 0x81, 0x0d, 0x81, 0x0d, 0x81, 0x0d, 0x81, 0x0d, 0xa1, 0x8c, + 0x00, 0x0f, 0x20, 0x01, 0x00, 0x0a, 0xa1, 0x12, 0xa0, 0x0e, 0x21, 0xa8, + 0x41, 0xa4, 0x34, 0x00, 0x82, 0x11, 0x00, 0xc0, 0x10, 0x5f, 0x27, 0x08, + 0x34, 0x00, 0xa1, 0x02, 0x00, 0x40, 0x10, 0x6f, 0x00, 0x48, 0x10, 0x6f, + 0x20, 0xa8, 0xa0, 0x0e, 0x41, 0xa4, 0x20, 0xa1, 0xa6, 0x01, 0x20, 0x09, + 0x00, 0x00, 0x20, 0xa9, 0x07, 0xff, 0x41, 0xa4, 0x34, 0x00, 0x20, 0xc9, + 0xab, 0xff, 0x20, 0x59, 0x00, 0x00, 0x2b, 0x78, 0x78, 0x23, 0x00, 0x04, + 0x20, 0x89, 0x25, 0xc7, 0x20, 0x51, 0xa7, 0x00, 0x2a, 0x70, 0x77, 0x62, + 0xa7, 0x86, 0x8f, 0xff, 0x00, 0x40, 0x10, 0x92, 0x70, 0x5f, 0xce, 0x00, + 0x70, 0x5b, 0xcd, 0xf1, 0x70, 0x67, 0x02, 0x00, 0x70, 0x6b, 0x02, 0x00, + 0x00, 0x78, 0x10, 0x9a, 0x70, 0x5b, 0xbe, 0x01, 0x70, 0x67, 0x01, 0x00, + 0x70, 0x6b, 0x01, 0x00, 0x70, 0x5f, 0xbe, 0x00, 0x10, 0x78, 0x12, 0xdf, + 0x10, 0x78, 0x13, 0xca, 0x10, 0x78, 0x15, 0x77, 0x10, 0x78, 0x1c, 0xe9, + 0x10, 0x78, 0x42, 0xec, 0x10, 0x78, 0x76, 0xbf, 0x10, 0x78, 0x13, 0x55, + 0x10, 0x78, 0x2a, 0xc0, 0x10, 0x78, 0x4e, 0x93, 0x10, 0x78, 0x49, 0xa3, + 0x10, 0x78, 0x59, 0x4a, 0x10, 0x78, 0x22, 0x63, 0x10, 0x78, 0x5c, 0x43, + 0x10, 0x78, 0x54, 0x85, 0x10, 0x78, 0x21, 0x62, 0x10, 0x78, 0x22, 0x40, + 0x20, 0x91, 0x30, 0x09, 0x78, 0x23, 0x00, 0x00, 0x00, 0x90, 0x10, 0xcf, + 0x78, 0x20, 0xa0, 0x86, 0x00, 0x02, 0x00, 0xc0, 0x10, 0xcf, 0x78, 0x23, + 0x40, 0x00, 0x00, 0x68, 0x10, 0xc7, 0x78, 0x1b, 0x00, 0x01, 0x20, 0x91, + 0x50, 0x00, 0x20, 0x91, 0x40, 0x80, 0x2a, 0x70, 0x70, 0x03, 0x00, 0x00, + 0x20, 0x01, 0x01, 0x7f, 0x20, 0x03, 0x00, 0x00, 0x2a, 0x70, 0x70, 0x00, + 0xa0, 0x8e, 0x00, 0x03, 0x00, 0xc0, 0x10, 0xef, 0x10, 0x78, 0x36, 0x5e, + 0x10, 0x78, 0x2a, 0xe8, 0x10, 0x78, 0x4e, 0xe3, 0x10, 0x78, 0x4b, 0x66, + 0x20, 0x09, 0x01, 0x00, 0x21, 0x04, 0xa0, 0x82, 0x00, 0x02, 0x00, 0x48, + 0x10, 0xf3, 0x10, 0x78, 0x59, 0x66, 0x00, 0x78, 0x10, 0xd6, 0x10, 0x79, + 0x10, 0xf7, 0x00, 0x78, 0x10, 0xdc, 0x10, 0x78, 0x71, 0x97, 0x00, 0x78, + 0x10, 0xeb, 0x11, 0x01, 0x11, 0x02, 0x11, 0xbe, 0x10, 0xff, 0x12, 0x46, + 0x12, 0xdc, 0x12, 0xdd, 0x12, 0xde, 0x10, 0x78, 0x13, 0x32, 0x00, 0x7c, + 0x12, 0x7e, 0x0f, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x70, 0x00, 0xa0, 0x86, + 0x00, 0x01, 0x00, 0xc0, 0x11, 0x98, 0x10, 0x78, 0x3a, 0xec, 0x20, 0x79, + 0x01, 0x00, 0x78, 0x44, 0xa0, 0x05, 0x00, 0xc0, 0x11, 0x98, 0x20, 0x11, + 0x41, 0xdc, 0x10, 0x78, 0x5a, 0x45, 0x10, 0x78, 0x1a, 0xdf, 0x78, 0x0f, + 0x00, 0xff, 0x78, 0x40, 0xa0, 0x84, 0xff, 0xfb, 0x78, 0x42, 0x20, 0x11, + 0x80, 0x10, 0x73, 0xc4, 0x10, 0x78, 0x36, 0x1b, 0x20, 0x01, 0xff, 0xff, + 0x10, 0x78, 0x5a, 0xe6, 0x72, 0x3c, 0xc2, 0x84, 0x72, 0x3e, 0x20, 0x01, + 0xa7, 0x0c, 0x20, 0x14, 0xc2, 0xac, 0x22, 0x02, 0x10, 0x78, 0x6f, 0x9f, + 0x20, 0x11, 0x00, 0x04, 0x10, 0x78, 0x8d, 0x2b, 0x10, 0x78, 0x48, 0x9e, + 0x10, 0x78, 0x42, 0xd4, 0x00, 0x40, 0x11, 0x44, 0x70, 0x87, 0x00, 0x01, + 0x70, 0xbf, 0x00, 0x00, 0x10, 0x78, 0x3c, 0x9e, 0x00, 0x78, 0x11, 0x98, + 0x10, 0x78, 0x49, 0x67, 0x00, 0x40, 0x11, 0x4d, 0x7a, 0x0c, 0xc2, 0xb4, + 0x7a, 0x0e, 0x00, 0x78, 0x11, 0x59, 0x10, 0x78, 0x90, 0xb6, 0x70, 0xcc, + 0xd0, 0x9c, 0x00, 0xc0, 0x11, 0x59, 0x70, 0x98, 0xa0, 0x05, 0x00, 0x40, + 0x11, 0x59, 0x10, 0x78, 0x42, 0xb8, 0x70, 0xd7, 0x00, 0x00, 0x70, 0xd3, + 0x00, 0x00, 0x72, 0xcc, 0x20, 0x79, 0xa7, 0x52, 0x78, 0x04, 0xd0, 0xac, + 0x00, 0x40, 0x11, 0x65, 0xc2, 0x95, 0x72, 0xce, 0xa2, 0x96, 0x00, 0x04, + 0x00, 0x40, 0x11, 0x86, 0x20, 0x11, 0x00, 0x01, 0x10, 0x78, 0x8d, 0x2b, + 0x70, 0x93, 0x00, 0x00, 0x70, 0x97, 0xff, 0xff, 0x70, 0x03, 0x00, 0x02, + 0x0f, 0x7f, 0x10, 0x78, 0x26, 0x77, 0x20, 0x11, 0x00, 0x05, 0x10, 0x78, + 0x70, 0xe0, 0x10, 0x78, 0x62, 0xd1, 0x0c, 0x7e, 0x20, 0x61, 0x01, 0x00, + 0x60, 0xe3, 0x00, 0x08, 0x0c, 0x7f, 0x12, 0x7f, 0x00, 0x78, 0x11, 0x9a, + 0x70, 0x93, 0x00, 0x00, 0x70, 0x97, 0xff, 0xff, 0x70, 0x03, 0x00, 0x02, + 0x20, 0x11, 0x00, 0x05, 0x10, 0x78, 0x70, 0xe0, 0x10, 0x78, 0x62, 0xd1, + 0x0c, 0x7e, 0x20, 0x61, 0x01, 0x00, 0x60, 0xe3, 0x00, 0x08, 0x0c, 0x7f, + 0x0f, 0x7f, 0x12, 0x7f, 0x00, 0x7c, 0x0c, 0x7e, 0x20, 0xa9, 0x00, 0x82, + 0x20, 0x09, 0x00, 0x7e, 0x01, 0x7e, 0x02, 0x7e, 0x03, 0x7e, 0x21, 0x10, + 0x02, 0x7e, 0x20, 0x19, 0x00, 0x29, 0x10, 0x78, 0x73, 0xd0, 0x02, 0x7f, + 0x10, 0x78, 0xa5, 0x01, 0x03, 0x7f, 0x02, 0x7f, 0x01, 0x7f, 0x10, 0x78, + 0x29, 0x8e, 0x81, 0x08, 0x00, 0xf0, 0x11, 0xa0, 0x0c, 0x7f, 0x70, 0x6f, + 0x00, 0x00, 0x70, 0x70, 0xa0, 0x84, 0x00, 0xff, 0x70, 0x72, 0x70, 0x9b, + 0x00, 0x00, 0x00, 0x7c, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x70, 0x00, + 0xa0, 0x86, 0x00, 0x02, 0x00, 0xc0, 0x12, 0x44, 0x70, 0x94, 0xa0, 0x86, + 0xff, 0xff, 0x00, 0x40, 0x11, 0xd1, 0x10, 0x78, 0x26, 0x77, 0x10, 0x78, + 0x62, 0xd1, 0x00, 0x78, 0x12, 0x44, 0x70, 0xcc, 0xd0, 0x9c, 0x00, 0x40, + 0x11, 0xfd, 0xd0, 0x84, 0x00, 0x40, 0x11, 0xfd, 0x0f, 0x7e, 0x20, 0x79, + 0x01, 0x00, 0x79, 0x0c, 0xc1, 0xb5, 0x79, 0x0e, 0x0f, 0x7f, 0xd0, 0x8c, + 0x00, 0x40, 0x11, 0xfd, 0x70, 0xd0, 0xa0, 0x86, 0xff, 0xff, 0x00, 0x40, + 0x11, 0xf9, 0x10, 0x78, 0x27, 0xf7, 0x10, 0x78, 0x62, 0xd1, 0x70, 0xcc, + 0xd0, 0x94, 0x00, 0xc0, 0x12, 0x44, 0x20, 0x11, 0x00, 0x01, 0x20, 0x19, + 0x00, 0x00, 0x10, 0x78, 0x28, 0x2f, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x78, + 0x12, 0x44, 0x70, 0xd4, 0xa0, 0x05, 0x00, 0xc0, 0x12, 0x44, 0x70, 0x90, + 0xa0, 0x05, 0x00, 0xc0, 0x12, 0x44, 0x10, 0x78, 0x49, 0x67, 0x00, 0xc0, + 0x12, 0x44, 0x20, 0x01, 0xa7, 0x53, 0x20, 0x04, 0xd0, 0xac, 0x00, 0x40, + 0x12, 0x27, 0x15, 0x7e, 0x0c, 0x7e, 0x20, 0xa9, 0x00, 0x7f, 0x20, 0x09, + 0x00, 0x00, 0x01, 0x7e, 0x10, 0x78, 0x45, 0xc4, 0x00, 0xc0, 0x12, 0x1a, + 0x60, 0x00, 0xd0, 0xec, 0x00, 0xc0, 0x12, 0x22, 0x01, 0x7f, 0x81, 0x08, + 0x00, 0xf0, 0x12, 0x11, 0x0c, 0x7f, 0x15, 0x7f, 0x00, 0x78, 0x12, 0x27, + 0x01, 0x7f, 0x0c, 0x7f, 0x15, 0x7f, 0x00, 0x78, 0x12, 0x44, 0x70, 0x03, + 0x00, 0x03, 0x70, 0x97, 0xff, 0xff, 0x20, 0x01, 0x00, 0x00, 0x10, 0x78, + 0x24, 0xe8, 0x10, 0x78, 0x36, 0x99, 0x20, 0x01, 0xa9, 0xb2, 0x20, 0x04, + 0xa0, 0x86, 0x00, 0x05, 0x00, 0xc0, 0x12, 0x3c, 0x20, 0x11, 0x00, 0x00, + 0x10, 0x78, 0x70, 0xe0, 0x20, 0x11, 0x00, 0x00, 0x10, 0x78, 0x70, 0xea, + 0x10, 0x78, 0x62, 0xd1, 0x10, 0x78, 0x63, 0x9b, 0x12, 0x7f, 0x00, 0x7c, + 0x01, 0x7e, 0x0f, 0x7e, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x20, 0x79, + 0x01, 0x00, 0x20, 0x09, 0x00, 0xf7, 0x10, 0x78, 0x42, 0xa1, 0x79, 0x40, + 0xa1, 0x8c, 0x00, 0x10, 0x79, 0x42, 0x79, 0x24, 0xd1, 0xb4, 0x00, 0x40, + 0x12, 0x5b, 0x78, 0x27, 0x00, 0x40, 0xd1, 0x9c, 0x00, 0x40, 0x12, 0x60, + 0x78, 0x27, 0x00, 0x08, 0x00, 0x7e, 0x03, 0x7e, 0x15, 0x7e, 0xa0, 0x06, + 0x10, 0x78, 0x5a, 0xe6, 0x79, 0x00, 0xa1, 0x8a, 0x00, 0x03, 0x00, 0x50, + 0x12, 0x89, 0x79, 0x54, 0xd1, 0xac, 0x00, 0xc0, 0x12, 0x89, 0x20, 0x09, + 0x00, 0xf8, 0x10, 0x78, 0x42, 0xa1, 0x78, 0x43, 0x00, 0x90, 0x78, 0x43, + 0x00, 0x10, 0x20, 0xa9, 0x09, 0xc4, 0x78, 0x20, 0xd0, 0x9c, 0x00, 0xc0, + 0x12, 0x81, 0x78, 0x24, 0xd0, 0xac, 0x00, 0xc0, 0x12, 0xca, 0x00, 0xf0, + 0x12, 0x79, 0x20, 0x01, 0x00, 0x01, 0x10, 0x78, 0x24, 0xe8, 0x00, 0x78, + 0x12, 0xd5, 0x78, 0x53, 0x00, 0x00, 0x78, 0x2f, 0x00, 0x20, 0x20, 0xa9, + 0x00, 0x50, 0x00, 0xe0, 0x12, 0x8f, 0x20, 0x91, 0x60, 0x00, 0x00, 0xf0, + 0x12, 0x8f, 0x78, 0x53, 0x04, 0x00, 0x78, 0x2f, 0x00, 0x00, 0x20, 0x09, + 0x00, 0xf8, 0x10, 0x78, 0x42, 0xa1, 0x20, 0xa9, 0x00, 0x0e, 0x00, 0x05, + 0x00, 0xf0, 0x12, 0x9f, 0x78, 0x53, 0x14, 0x00, 0x78, 0x43, 0x00, 0x90, + 0x78, 0x43, 0x00, 0x10, 0x20, 0x19, 0x61, 0xa8, 0x78, 0x54, 0x00, 0x05, + 0x00, 0x05, 0xd0, 0x8c, 0x00, 0x40, 0x12, 0xb4, 0x78, 0x24, 0xd0, 0xac, + 0x00, 0xc0, 0x12, 0xca, 0x83, 0x19, 0x00, 0xc0, 0x12, 0xaa, 0x20, 0x09, + 0xa7, 0x32, 0x21, 0x04, 0x80, 0x00, 0x20, 0x0a, 0xa0, 0x84, 0xff, 0xf0, + 0x00, 0x40, 0x12, 0xc4, 0x20, 0x0b, 0x00, 0x00, 0x10, 0x78, 0x25, 0x88, + 0x20, 0x01, 0x00, 0x01, 0x10, 0x78, 0x24, 0xe8, 0x00, 0x78, 0x12, 0xd3, + 0x20, 0x01, 0xa7, 0x32, 0x20, 0x03, 0x00, 0x00, 0x78, 0x28, 0xc0, 0x9d, + 0x78, 0x2a, 0x78, 0x27, 0x00, 0x48, 0x78, 0x53, 0x04, 0x00, 0x15, 0x7f, + 0x03, 0x7f, 0x00, 0x7f, 0x12, 0x7f, 0x0f, 0x7f, 0x01, 0x7f, 0x00, 0x7c, + 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x2a, 0x70, 0x20, 0x61, 0xa9, 0xad, + 0x20, 0x63, 0x00, 0x01, 0x60, 0x07, 0x00, 0x13, 0x60, 0x0b, 0x00, 0x19, + 0x60, 0x0f, 0x00, 0x17, 0x20, 0x09, 0x01, 0x00, 0x21, 0x04, 0xa0, 0x82, + 0x00, 0x02, 0x00, 0x48, 0x12, 0xf5, 0x70, 0x53, 0xff, 0xff, 0x00, 0x78, + 0x12, 0xf7, 0x70, 0x53, 0x00, 0x00, 0x70, 0x57, 0xff, 0xff, 0x70, 0x6f, + 0x00, 0x00, 0x70, 0x73, 0x00, 0x00, 0x10, 0x78, 0x90, 0xb6, 0x20, 0x61, + 0xa9, 0x8d, 0x60, 0x03, 0x09, 0x09, 0x60, 0x07, 0x00, 0x00, 0x60, 0x0b, + 0x88, 0x00, 0x60, 0x0f, 0x02, 0x00, 0x60, 0x13, 0x00, 0xff, 0x60, 0x17, + 0x00, 0x03, 0x60, 0x1b, 0x00, 0x00, 0x60, 0x1f, 0x07, 0xd0, 0x20, 0x61, + 0xa9, 0x95, 0x60, 0x03, 0x80, 0x00, 0x60, 0x07, 0x00, 0x00, 0x60, 0x0b, + 0x00, 0x00, 0x60, 0x0f, 0x02, 0x00, 0x60, 0x13, 0x00, 0xff, 0x60, 0x17, + 0x00, 0x00, 0x60, 0x1b, 0x00, 0x01, 0x60, 0x1f, 0x00, 0x00, 0x20, 0x61, + 0xa9, 0xa5, 0x60, 0x03, 0x51, 0x4c, 0x60, 0x07, 0x4f, 0x47, 0x60, 0x0b, + 0x49, 0x43, 0x60, 0x0f, 0x20, 0x20, 0x20, 0x01, 0xa7, 0x26, 0x20, 0x03, + 0x00, 0x00, 0x00, 0x7c, 0x20, 0x91, 0x80, 0x00, 0x00, 0x68, 0x13, 0x34, + 0x00, 0x7e, 0x01, 0x7e, 0x20, 0x79, 0x00, 0x00, 0x78, 0x18, 0xd0, 0x84, + 0x00, 0xc0, 0x13, 0x3a, 0x01, 0x7f, 0x79, 0x2e, 0x00, 0x7f, 0x78, 0x2a, + 0x00, 0x7f, 0x78, 0x26, 0x39, 0x00, 0x78, 0x3a, 0x78, 0x23, 0x80, 0x02, + 0x78, 0x1b, 0x00, 0x01, 0x20, 0x91, 0x50, 0x00, 0x20, 0x91, 0x40, 0x80, + 0x20, 0x79, 0xa7, 0x00, 0x78, 0x03, 0x00, 0x05, 0x00, 0x78, 0x13, 0x52, + 0x00, 0x7c, 0x20, 0x71, 0xa7, 0x00, 0x71, 0x5c, 0x71, 0x2e, 0x20, 0x21, + 0x00, 0x01, 0xa1, 0x90, 0x00, 0x2d, 0xa2, 0x98, 0x00, 0x2d, 0x00, 0x48, + 0x13, 0x6b, 0x70, 0x60, 0xa3, 0x02, 0x00, 0xc8, 0x13, 0x6b, 0x22, 0x0a, + 0x22, 0x08, 0x23, 0x10, 0x84, 0x20, 0x00, 0x78, 0x13, 0x5d, 0x20, 0x0b, + 0x00, 0x00, 0x74, 0xaa, 0x74, 0xae, 0x00, 0x7c, 0x0e, 0x7e, 0x12, 0x7e, + 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0xa7, 0x00, 0x70, 0xac, 0xa0, 0xea, + 0x00, 0x10, 0x00, 0xc8, 0x13, 0x7e, 0xa0, 0x6e, 0x00, 0x78, 0x13, 0x88, + 0x80, 0x01, 0x70, 0xae, 0x70, 0x2c, 0x20, 0x68, 0x2d, 0x04, 0x70, 0x2e, + 0x20, 0x6b, 0x00, 0x00, 0x68, 0x07, 0x00, 0x00, 0x12, 0x7f, 0x0e, 0x7f, + 0x00, 0x7c, 0x0e, 0x7e, 0x20, 0x71, 0xa7, 0x00, 0x12, 0x7e, 0x20, 0x91, + 0x80, 0x00, 0x70, 0xac, 0x80, 0x01, 0x00, 0xc8, 0x13, 0x98, 0xa0, 0x6e, + 0x00, 0x78, 0x13, 0xa1, 0x70, 0xae, 0x70, 0x2c, 0x20, 0x68, 0x2d, 0x04, + 0x70, 0x2e, 0x20, 0x6b, 0x00, 0x00, 0x68, 0x07, 0x00, 0x00, 0x12, 0x7f, + 0x0e, 0x7f, 0x00, 0x7c, 0x0e, 0x7e, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x71, 0xa7, 0x00, 0x70, 0x2c, 0x20, 0x6a, 0x2d, 0x00, 0x70, 0x2e, + 0x70, 0xac, 0x80, 0x00, 0x70, 0xae, 0x12, 0x7f, 0x0e, 0x7f, 0x00, 0x7c, + 0x8d, 0xff, 0x00, 0x40, 0x13, 0xc0, 0x68, 0x04, 0x68, 0x07, 0x00, 0x00, + 0x00, 0x7e, 0x10, 0x78, 0x13, 0xa4, 0x0d, 0x7f, 0x00, 0x78, 0x13, 0xb4, + 0x00, 0x7c, 0x0e, 0x7e, 0x20, 0x71, 0xa7, 0x00, 0x70, 0xac, 0xa0, 0x8a, + 0x00, 0x10, 0xa0, 0x0d, 0x0e, 0x7f, 0x00, 0x7c, 0x0e, 0x7e, 0x20, 0x71, + 0xa9, 0xd6, 0x70, 0x07, 0x00, 0x00, 0x70, 0x1b, 0x00, 0x00, 0x70, 0x1f, + 0x00, 0x00, 0x20, 0x71, 0x00, 0x00, 0x70, 0x10, 0xa0, 0x85, 0x80, 0x04, + 0x70, 0x12, 0x0e, 0x7f, 0x00, 0x7c, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, + 0x0e, 0x7e, 0x22, 0x70, 0x70, 0x0b, 0x00, 0x00, 0x20, 0x71, 0xa9, 0xd6, + 0x70, 0x18, 0xa0, 0x88, 0xa9, 0xdf, 0x22, 0x0a, 0x80, 0x00, 0xa0, 0x84, + 0x00, 0x07, 0x70, 0x1a, 0x70, 0x04, 0xa0, 0x05, 0x00, 0xc0, 0x13, 0xf6, + 0x0f, 0x7e, 0x20, 0x79, 0x00, 0x10, 0x10, 0x78, 0x14, 0x08, 0x0f, 0x7f, + 0x0e, 0x7f, 0x12, 0x7f, 0x00, 0x7c, 0x0e, 0x7e, 0x20, 0x71, 0xa9, 0xd6, + 0x70, 0x04, 0xa0, 0x05, 0x00, 0xc0, 0x14, 0x06, 0x0f, 0x7e, 0x20, 0x79, + 0x00, 0x10, 0x10, 0x78, 0x14, 0x08, 0x0f, 0x7f, 0x0e, 0x7f, 0x00, 0x7c, + 0x70, 0x00, 0x00, 0x79, 0x14, 0x0b, 0x14, 0x0f, 0x14, 0x79, 0x14, 0x96, + 0x14, 0x96, 0x70, 0x18, 0x71, 0x1c, 0xa1, 0x06, 0x00, 0xc0, 0x14, 0x17, + 0x70, 0x07, 0x00, 0x00, 0x00, 0x7c, 0x0d, 0x7e, 0xa1, 0x80, 0xa9, 0xdf, + 0x20, 0x04, 0x70, 0x0a, 0x20, 0x68, 0x81, 0x08, 0xa1, 0x8c, 0x00, 0x07, + 0x71, 0x1e, 0x78, 0x03, 0x00, 0x26, 0x68, 0x24, 0x78, 0x32, 0x68, 0x28, + 0x78, 0x36, 0x68, 0x2c, 0x78, 0x3a, 0x68, 0x30, 0x78, 0x3e, 0x68, 0x10, + 0x70, 0x0e, 0x68, 0x0c, 0x70, 0x16, 0x68, 0x04, 0x0d, 0x7f, 0xd0, 0x84, + 0x00, 0x40, 0x14, 0x39, 0x70, 0x07, 0x00, 0x01, 0x10, 0x78, 0x14, 0x3e, + 0x00, 0x7c, 0x70, 0x07, 0x00, 0x02, 0x10, 0x78, 0x14, 0x54, 0x00, 0x7c, + 0x01, 0x7e, 0x02, 0x7e, 0x71, 0x0c, 0x20, 0x11, 0x00, 0x40, 0xa1, 0x82, + 0x00, 0x40, 0x00, 0xc8, 0x14, 0x49, 0x21, 0x10, 0xa0, 0x06, 0x70, 0x0e, + 0x72, 0x12, 0x82, 0x03, 0x78, 0x22, 0x78, 0x03, 0x00, 0x20, 0x78, 0x03, + 0x00, 0x41, 0x02, 0x7f, 0x01, 0x7f, 0x00, 0x7c, 0x01, 0x7e, 0x02, 0x7e, + 0x13, 0x7e, 0x14, 0x7e, 0x15, 0x7e, 0x70, 0x14, 0x20, 0x98, 0x20, 0xa1, + 0x00, 0x14, 0x78, 0x03, 0x00, 0x26, 0x71, 0x0c, 0x20, 0x11, 0x00, 0x40, + 0xa1, 0x82, 0x00, 0x40, 0x00, 0xc8, 0x14, 0x68, 0x21, 0x10, 0xa0, 0x06, + 0x70, 0x0e, 0x22, 0xa8, 0x53, 0xa6, 0x82, 0x03, 0x78, 0x22, 0x78, 0x03, + 0x00, 0x20, 0x33, 0x00, 0x70, 0x16, 0x78, 0x03, 0x00, 0x01, 0x15, 0x7f, + 0x14, 0x7f, 0x13, 0x7f, 0x02, 0x7f, 0x01, 0x7f, 0x00, 0x7c, 0x13, 0x7e, + 0x14, 0x7e, 0x15, 0x7e, 0x20, 0x99, 0xa7, 0xfa, 0x20, 0xa1, 0x00, 0x18, + 0x20, 0xa9, 0x00, 0x08, 0x53, 0xa3, 0x78, 0x03, 0x00, 0x20, 0x12, 0x7e, + 0x20, 0x91, 0x80, 0x00, 0x78, 0x03, 0x00, 0x41, 0x70, 0x07, 0x00, 0x03, + 0x70, 0x00, 0xc0, 0x84, 0x70, 0x02, 0x70, 0x0b, 0xa7, 0xf5, 0x12, 0x7f, + 0x15, 0x7f, 0x14, 0x7f, 0x13, 0x7f, 0x00, 0x7c, 0x13, 0x7e, 0x14, 0x7e, + 0x15, 0x7e, 0x20, 0x01, 0xa8, 0x29, 0x20, 0x9c, 0x20, 0xa1, 0x00, 0x14, + 0x78, 0x03, 0x00, 0x26, 0x20, 0x01, 0xa8, 0x2a, 0x20, 0xac, 0x53, 0xa6, + 0x20, 0x99, 0xa8, 0x2b, 0x20, 0xa1, 0x00, 0x18, 0x20, 0xa9, 0x00, 0x08, + 0x53, 0xa3, 0x78, 0x03, 0x00, 0x20, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, + 0x78, 0x03, 0x00, 0x01, 0x70, 0x07, 0x00, 0x04, 0x70, 0x00, 0xc0, 0x8c, + 0x70, 0x02, 0x70, 0x0b, 0xa8, 0x26, 0x12, 0x7f, 0x15, 0x7f, 0x14, 0x7f, + 0x13, 0x7f, 0x00, 0x7c, 0x01, 0x7e, 0x0e, 0x7e, 0x20, 0x71, 0xa9, 0xd6, + 0x0f, 0x7e, 0x20, 0x79, 0x00, 0x10, 0x79, 0x04, 0x78, 0x03, 0x00, 0x02, + 0xd1, 0xfc, 0x00, 0x40, 0x14, 0xd0, 0xa1, 0x8c, 0x07, 0x00, 0x70, 0x04, + 0x10, 0x79, 0x14, 0xd4, 0x0f, 0x7f, 0x0e, 0x7f, 0x01, 0x7f, 0x00, 0x7c, + 0x14, 0x08, 0x14, 0xdc, 0x15, 0x09, 0x15, 0x31, 0x15, 0x64, 0x14, 0xda, + 0x00, 0x78, 0x14, 0xda, 0xa1, 0x8c, 0x07, 0x00, 0x00, 0xc0, 0x15, 0x02, + 0x13, 0x7e, 0x14, 0x7e, 0x15, 0x7e, 0x70, 0x14, 0x20, 0xa0, 0x20, 0x99, + 0x00, 0x14, 0x78, 0x03, 0x00, 0x40, 0x70, 0x10, 0x20, 0xa8, 0x53, 0xa5, + 0x34, 0x00, 0x70, 0x16, 0x15, 0x7f, 0x14, 0x7f, 0x13, 0x7f, 0x70, 0x0c, + 0xa0, 0x05, 0x00, 0x40, 0x15, 0x1e, 0x10, 0x78, 0x14, 0x3e, 0x00, 0x7c, + 0x70, 0x08, 0xa0, 0x80, 0x00, 0x02, 0x20, 0x03, 0x01, 0x00, 0x70, 0x07, + 0x00, 0x00, 0x10, 0x78, 0x14, 0x08, 0x00, 0x7c, 0x70, 0x08, 0xa0, 0x80, + 0x00, 0x02, 0x20, 0x03, 0x02, 0x00, 0x00, 0x78, 0x14, 0xfd, 0xa1, 0x8c, + 0x07, 0x00, 0x00, 0xc0, 0x15, 0x14, 0x70, 0x0c, 0xa0, 0x05, 0x00, 0x40, + 0x15, 0x1e, 0x10, 0x78, 0x14, 0x54, 0x00, 0x7c, 0x70, 0x08, 0xa0, 0x80, + 0x00, 0x02, 0x20, 0x03, 0x02, 0x00, 0x70, 0x07, 0x00, 0x00, 0x10, 0x78, + 0x14, 0x08, 0x00, 0x7c, 0x0d, 0x7e, 0x70, 0x08, 0x20, 0x68, 0x78, 0x30, + 0x68, 0x26, 0x78, 0x34, 0x68, 0x2a, 0x78, 0x38, 0x68, 0x2e, 0x78, 0x3c, + 0x68, 0x32, 0x68, 0x0b, 0x01, 0x00, 0x0d, 0x7f, 0x70, 0x07, 0x00, 0x00, + 0x10, 0x78, 0x14, 0x08, 0x00, 0x7c, 0xa1, 0x8c, 0x07, 0x00, 0x00, 0xc0, + 0x15, 0x5e, 0x13, 0x7e, 0x14, 0x7e, 0x15, 0x7e, 0x20, 0x01, 0xa7, 0xf8, + 0x20, 0x04, 0xa0, 0x80, 0x00, 0x0d, 0x20, 0xa0, 0x20, 0x99, 0x00, 0x14, + 0x78, 0x03, 0x00, 0x40, 0x20, 0xa9, 0x00, 0x20, 0x53, 0xa5, 0x20, 0x01, + 0xa7, 0xfa, 0x20, 0x04, 0xd0, 0xbc, 0x00, 0x40, 0x15, 0x54, 0x20, 0x01, + 0xa8, 0x03, 0x20, 0x04, 0xa0, 0x80, 0x00, 0x0d, 0x20, 0xa0, 0x20, 0xa9, + 0x00, 0x20, 0x53, 0xa5, 0x15, 0x7f, 0x14, 0x7f, 0x13, 0x7f, 0x70, 0x07, + 0x00, 0x00, 0x10, 0x78, 0x4f, 0x8c, 0x10, 0x78, 0x14, 0x08, 0x00, 0x7c, + 0x20, 0x11, 0x80, 0x03, 0x10, 0x78, 0x36, 0x1b, 0x00, 0x78, 0x15, 0x62, + 0xa1, 0x8c, 0x07, 0x00, 0x00, 0xc0, 0x15, 0x71, 0x20, 0x01, 0xa8, 0x28, + 0x20, 0x03, 0x01, 0x00, 0x70, 0x07, 0x00, 0x00, 0x10, 0x78, 0x14, 0x08, + 0x00, 0x7c, 0x20, 0x11, 0x80, 0x04, 0x10, 0x78, 0x36, 0x1b, 0x00, 0x78, + 0x15, 0x75, 0x12, 0x7e, 0x20, 0x91, 0x21, 0x00, 0x20, 0x79, 0x00, 0x30, + 0x20, 0x71, 0xa9, 0xe7, 0x78, 0x03, 0x00, 0x04, 0x70, 0x03, 0x00, 0x00, + 0x70, 0x0f, 0xa9, 0xed, 0x70, 0x13, 0xa9, 0xed, 0x78, 0x0f, 0x00, 0x76, + 0x78, 0x03, 0x00, 0x04, 0x12, 0x7f, 0x00, 0x7c, 0x69, 0x34, 0xa1, 0x84, + 0x00, 0x07, 0x00, 0x79, 0x15, 0x91, 0x15, 0x99, 0x15, 0xdf, 0x15, 0x99, + 0x15, 0x99, 0x15, 0x99, 0x15, 0xc4, 0x15, 0xa8, 0x15, 0x9d, 0xa0, 0x85, + 0x00, 0x01, 0x00, 0x78, 0x15, 0xf9, 0x68, 0x4c, 0xd0, 0xbc, 0x00, 0x40, + 0x15, 0x99, 0x68, 0x60, 0x68, 0x2e, 0x68, 0x5c, 0x68, 0x2a, 0x68, 0x58, + 0x00, 0x78, 0x15, 0xe7, 0xa1, 0x8c, 0x00, 0xff, 0xa1, 0x86, 0x00, 0x1e, + 0x00, 0xc0, 0x15, 0x99, 0x68, 0x4c, 0xd0, 0xbc, 0x00, 0x40, 0x15, 0x99, + 0x68, 0x60, 0x68, 0x2e, 0x68, 0x5c, 0x68, 0x2a, 0x68, 0x04, 0x68, 0x1a, + 0xa0, 0x80, 0x00, 0x0d, 0x20, 0x04, 0xa0, 0x84, 0x00, 0x0f, 0xa0, 0x80, + 0x20, 0x6a, 0x20, 0x04, 0x68, 0x32, 0x68, 0x58, 0x00, 0x78, 0x15, 0xef, + 0xa1, 0x8c, 0x00, 0xff, 0xa1, 0x86, 0x00, 0x15, 0x00, 0xc0, 0x15, 0x99, + 0x68, 0x4c, 0xd0, 0xac, 0x00, 0x40, 0x15, 0x99, 0x68, 0x04, 0x68, 0x1a, + 0xa0, 0x80, 0x00, 0x0d, 0x20, 0x04, 0xa0, 0x84, 0x00, 0x0f, 0xa0, 0x80, + 0x20, 0x6a, 0x20, 0x04, 0x68, 0x32, 0xa0, 0x06, 0x68, 0x2e, 0x68, 0x2a, + 0x68, 0x58, 0x00, 0x78, 0x15, 0xef, 0x68, 0x4c, 0xd0, 0xac, 0x00, 0x40, + 0x15, 0x99, 0xa0, 0x06, 0x68, 0x2e, 0x68, 0x2a, 0x68, 0x58, 0xa1, 0x8c, + 0x00, 0x0f, 0xa1, 0x88, 0x20, 0x6a, 0x21, 0x0c, 0x69, 0x32, 0x2d, 0x08, + 0x69, 0x1a, 0x68, 0x26, 0x68, 0x4c, 0xc0, 0xdd, 0x68, 0x4e, 0xa0, 0x06, + 0x68, 0x0a, 0x69, 0x7c, 0x69, 0x12, 0x69, 0x80, 0x69, 0x16, 0x00, 0x7c, + 0x20, 0xe1, 0x00, 0x07, 0x20, 0xe1, 0x20, 0x00, 0x20, 0x01, 0x02, 0x0a, + 0x20, 0x04, 0x82, 0xff, 0x00, 0x40, 0x16, 0x1c, 0xa2, 0x80, 0x00, 0x04, + 0x0d, 0x7e, 0x20, 0x6c, 0x68, 0x4c, 0xd0, 0xdc, 0x00, 0xc0, 0x16, 0x18, + 0x10, 0x78, 0x15, 0x8c, 0x00, 0x40, 0x16, 0x18, 0x0d, 0x7f, 0xa2, 0x80, + 0x00, 0x00, 0x20, 0x03, 0x00, 0x02, 0xa0, 0x16, 0x00, 0x78, 0x16, 0x1c, + 0x68, 0x08, 0x80, 0x00, 0x68, 0x0a, 0x0d, 0x7f, 0x12, 0x7e, 0x04, 0x7e, + 0x03, 0x7e, 0x02, 0x7e, 0x20, 0x91, 0x21, 0x00, 0x02, 0x7f, 0x03, 0x7f, + 0x04, 0x7f, 0x70, 0x00, 0xa0, 0x05, 0x00, 0xc0, 0x16, 0x30, 0x72, 0x06, + 0x20, 0x01, 0x16, 0x51, 0x00, 0x7e, 0x22, 0x60, 0x00, 0x78, 0x17, 0xe0, + 0x71, 0x0c, 0x22, 0x0a, 0x81, 0x08, 0x23, 0x0a, 0x81, 0x08, 0x24, 0x0a, + 0x81, 0x08, 0xa1, 0x82, 0xaa, 0x08, 0x00, 0x48, 0x16, 0x3d, 0x20, 0x09, + 0xa9, 0xed, 0x71, 0x0e, 0x70, 0x10, 0xa1, 0x02, 0xa0, 0x82, 0x00, 0x09, + 0x00, 0x40, 0x16, 0x48, 0xa0, 0x80, 0x00, 0x1b, 0x00, 0xc0, 0x16, 0x4b, + 0x20, 0x09, 0x01, 0x38, 0x20, 0x0a, 0x70, 0x00, 0xa0, 0x05, 0x00, 0xc0, + 0x16, 0x51, 0x10, 0x78, 0x17, 0xc1, 0x12, 0x7f, 0x00, 0x7c, 0x12, 0x7e, + 0x02, 0x7e, 0x03, 0x7e, 0x0c, 0x7e, 0x00, 0x7e, 0x20, 0x91, 0x21, 0x00, + 0x00, 0x7f, 0x04, 0x7f, 0x03, 0x7f, 0x02, 0x7f, 0x0d, 0x7e, 0x0c, 0x7e, + 0x24, 0x60, 0x61, 0x10, 0x21, 0x68, 0x6a, 0x62, 0x6b, 0x5e, 0xa0, 0x05, + 0x00, 0x40, 0x16, 0xdd, 0x68, 0x08, 0xa0, 0x05, 0x00, 0x40, 0x17, 0x4a, + 0x70, 0x00, 0xa0, 0x05, 0x00, 0xc0, 0x16, 0x72, 0x00, 0x78, 0x16, 0xd2, + 0x70, 0x0c, 0x71, 0x10, 0xa1, 0x06, 0x00, 0xc0, 0x17, 0x53, 0x70, 0x04, + 0xa4, 0x06, 0x00, 0xc0, 0x16, 0xd2, 0x20, 0x01, 0x00, 0x05, 0x20, 0x04, + 0xd0, 0x8c, 0x00, 0x40, 0x16, 0x8f, 0x04, 0x7e, 0x10, 0x78, 0x19, 0x13, + 0x04, 0x7f, 0x24, 0x60, 0x60, 0x10, 0xa0, 0x80, 0x00, 0x02, 0x20, 0x04, + 0xa0, 0x05, 0x00, 0x40, 0x17, 0x4a, 0x00, 0x78, 0x16, 0x6c, 0x20, 0x01, + 0x02, 0x07, 0x20, 0x04, 0xd0, 0x9c, 0x00, 0xc0, 0x16, 0x7b, 0x78, 0x04, + 0xa0, 0x84, 0x60, 0x00, 0x00, 0x40, 0x16, 0xa0, 0xa0, 0x86, 0x60, 0x00, + 0x00, 0x40, 0x16, 0xa0, 0x00, 0x78, 0x16, 0x7b, 0x71, 0x00, 0xa1, 0x86, + 0x00, 0x02, 0x00, 0xc0, 0x16, 0xc0, 0x0e, 0x7e, 0x2b, 0x68, 0x68, 0x18, + 0x20, 0x60, 0x10, 0x78, 0x20, 0x3f, 0x28, 0x04, 0xac, 0x70, 0x60, 0x34, + 0xd0, 0x9c, 0x00, 0xc0, 0x16, 0xb5, 0x71, 0x08, 0x72, 0x0c, 0x00, 0x78, + 0x16, 0xb7, 0x71, 0x10, 0x72, 0x14, 0x68, 0x10, 0xa1, 0x00, 0x68, 0x12, + 0x68, 0x14, 0xa2, 0x01, 0x68, 0x16, 0x0e, 0x7f, 0x00, 0x78, 0x16, 0xc4, + 0xa1, 0x86, 0x00, 0x01, 0x00, 0xc0, 0x16, 0xcc, 0x78, 0x20, 0x69, 0x10, + 0xa1, 0x00, 0x68, 0x12, 0x78, 0x24, 0x69, 0x14, 0xa1, 0x01, 0x68, 0x16, + 0x78, 0x03, 0x00, 0x04, 0x70, 0x03, 0x00, 0x00, 0x70, 0x04, 0x20, 0x60, + 0x61, 0x00, 0xa1, 0x8e, 0x00, 0x04, 0x00, 0xc0, 0x17, 0x53, 0x20, 0x09, + 0x00, 0x48, 0x10, 0x78, 0x77, 0x5c, 0x00, 0x78, 0x17, 0x53, 0x68, 0x08, + 0xa0, 0x05, 0x00, 0x40, 0x17, 0x4a, 0x70, 0x00, 0xa0, 0x05, 0x00, 0xc0, + 0x16, 0xe7, 0x00, 0x78, 0x17, 0x4a, 0x70, 0x0c, 0x71, 0x10, 0xa1, 0x06, + 0x00, 0xc0, 0x16, 0xf0, 0x70, 0x04, 0xa4, 0x06, 0x00, 0xc0, 0x17, 0x4a, + 0x20, 0x01, 0x00, 0x05, 0x20, 0x04, 0xd0, 0x8c, 0x00, 0x40, 0x17, 0x04, + 0x04, 0x7e, 0x10, 0x78, 0x19, 0x13, 0x04, 0x7f, 0x24, 0x60, 0x60, 0x10, + 0xa0, 0x80, 0x00, 0x02, 0x20, 0x04, 0xa0, 0x05, 0x00, 0x40, 0x17, 0x4a, + 0x00, 0x78, 0x16, 0xe1, 0x20, 0x01, 0x02, 0x07, 0x20, 0x04, 0xd0, 0x9c, + 0x00, 0xc0, 0x16, 0xf0, 0x20, 0x01, 0x00, 0x05, 0x20, 0x04, 0xd0, 0x8c, + 0x00, 0xc0, 0x16, 0xf6, 0x78, 0x04, 0xa0, 0x84, 0x60, 0x00, 0x00, 0x40, + 0x17, 0x1b, 0xa0, 0x86, 0x60, 0x00, 0x00, 0x40, 0x17, 0x1b, 0x00, 0x78, + 0x16, 0xf0, 0x70, 0x07, 0x00, 0x00, 0xa0, 0x16, 0x22, 0x18, 0x70, 0x00, + 0xa0, 0x8e, 0x00, 0x01, 0x00, 0x40, 0x17, 0x3c, 0xa0, 0x8e, 0x00, 0x02, + 0x00, 0xc0, 0x17, 0x4a, 0x0c, 0x7e, 0x0e, 0x7e, 0x68, 0x18, 0x20, 0x60, + 0x10, 0x78, 0x20, 0x3f, 0x28, 0x04, 0xac, 0x70, 0x60, 0x34, 0xd0, 0x9c, + 0x00, 0xc0, 0x17, 0x38, 0x73, 0x08, 0x72, 0x0c, 0x00, 0x78, 0x17, 0x3a, + 0x73, 0x10, 0x72, 0x14, 0x0e, 0x7f, 0x0c, 0x7f, 0x78, 0x20, 0xa3, 0x18, + 0x78, 0x24, 0xa2, 0x11, 0x68, 0x10, 0xa3, 0x00, 0x68, 0x12, 0x68, 0x14, + 0xa2, 0x01, 0x68, 0x16, 0x78, 0x03, 0x00, 0x04, 0x70, 0x03, 0x00, 0x00, + 0x61, 0x00, 0xa1, 0x8e, 0x00, 0x04, 0x00, 0xc0, 0x17, 0x53, 0x20, 0x09, + 0x00, 0x48, 0x10, 0x78, 0x77, 0x5c, 0x0c, 0x7f, 0x0d, 0x7f, 0x12, 0x7f, + 0x00, 0x7c, 0x0f, 0x7e, 0x0e, 0x7e, 0x02, 0x7e, 0x03, 0x7e, 0x04, 0x7e, + 0x05, 0x7e, 0x20, 0x71, 0xa9, 0xe7, 0x70, 0x00, 0xa0, 0x86, 0x00, 0x00, + 0x00, 0x40, 0x17, 0xba, 0x70, 0x04, 0xac, 0x06, 0x00, 0xc0, 0x17, 0xab, + 0x20, 0x79, 0x00, 0x30, 0x70, 0x00, 0xa0, 0x86, 0x00, 0x03, 0x00, 0x40, + 0x17, 0xab, 0x78, 0x04, 0xd0, 0xfc, 0x00, 0xc0, 0x17, 0xa7, 0x20, 0xe1, + 0x60, 0x00, 0x20, 0x11, 0x00, 0x32, 0x20, 0x01, 0x02, 0x08, 0x20, 0x0c, + 0x20, 0x01, 0x02, 0x09, 0x20, 0x04, 0xa1, 0x06, 0x00, 0xc0, 0x17, 0x6f, + 0x82, 0x11, 0x00, 0xc0, 0x17, 0x77, 0x78, 0x04, 0xd0, 0xfc, 0x00, 0xc0, + 0x17, 0xa7, 0x10, 0x78, 0x1b, 0x22, 0x02, 0x7e, 0x05, 0x7e, 0x78, 0x03, + 0x00, 0x04, 0x78, 0x04, 0xd0, 0xac, 0x00, 0xc0, 0x17, 0x8d, 0x78, 0x03, + 0x00, 0x02, 0x78, 0x03, 0x00, 0x09, 0x70, 0x03, 0x00, 0x03, 0x70, 0x07, + 0x00, 0x00, 0x05, 0x7f, 0x02, 0x7f, 0x20, 0x01, 0x01, 0x5d, 0x20, 0x03, + 0x00, 0x00, 0x20, 0x01, 0x01, 0x60, 0x25, 0x02, 0x20, 0x01, 0x01, 0x38, + 0x22, 0x02, 0x00, 0x78, 0x17, 0xab, 0x10, 0x78, 0x19, 0x13, 0x00, 0x78, + 0x17, 0x5f, 0x15, 0x7e, 0x20, 0xa9, 0x00, 0x09, 0x20, 0x09, 0xa9, 0xed, + 0x21, 0x04, 0xac, 0x06, 0x00, 0xc0, 0x17, 0xb5, 0x20, 0x0a, 0xa1, 0x88, + 0x00, 0x03, 0x00, 0xf0, 0x17, 0xb0, 0x15, 0x7f, 0x05, 0x7f, 0x04, 0x7f, + 0x03, 0x7f, 0x02, 0x7f, 0x0e, 0x7f, 0x0f, 0x7f, 0x00, 0x7c, 0x70, 0x0c, + 0x71, 0x10, 0xa1, 0x06, 0x00, 0xc0, 0x17, 0xc9, 0x70, 0x03, 0x00, 0x00, + 0x00, 0x7c, 0x21, 0x04, 0x70, 0x06, 0x20, 0x60, 0x81, 0x08, 0x21, 0x1c, + 0x81, 0x08, 0x21, 0x24, 0x81, 0x08, 0xa1, 0x82, 0xaa, 0x08, 0x00, 0x48, + 0x17, 0xd7, 0x20, 0x09, 0xa9, 0xed, 0x71, 0x12, 0x70, 0x0c, 0xa1, 0x06, + 0x00, 0xc0, 0x17, 0xe0, 0x20, 0x01, 0x01, 0x38, 0x20, 0x03, 0x00, 0x08, + 0x8c, 0xff, 0x00, 0xc0, 0x17, 0xe7, 0x10, 0x78, 0x1b, 0x4d, 0x00, 0x78, + 0x18, 0x54, 0x60, 0x10, 0x20, 0x68, 0x2d, 0x58, 0x68, 0x28, 0xa4, 0x06, + 0x00, 0xc0, 0x17, 0xf2, 0x68, 0x2c, 0xa3, 0x06, 0x00, 0x40, 0x18, 0x2f, + 0x60, 0x1c, 0xa0, 0x86, 0x00, 0x08, 0x00, 0x40, 0x18, 0x2f, 0x60, 0x24, + 0xd0, 0xf4, 0x00, 0xc0, 0x18, 0x1c, 0xd0, 0xd4, 0x00, 0x40, 0x18, 0x18, + 0x60, 0x38, 0xa4, 0x02, 0x60, 0x34, 0xa3, 0x03, 0x00, 0x40, 0x18, 0x06, + 0x00, 0xc8, 0x18, 0x18, 0x64, 0x3a, 0x63, 0x36, 0x6c, 0x2a, 0x6b, 0x2e, + 0x04, 0x7e, 0x03, 0x7e, 0x24, 0x00, 0x6c, 0x7c, 0xa4, 0x02, 0x68, 0x12, + 0x23, 0x00, 0x6b, 0x80, 0xa3, 0x03, 0x68, 0x16, 0x03, 0x7f, 0x04, 0x7f, + 0x00, 0x78, 0x18, 0x1c, 0x10, 0x78, 0x90, 0x63, 0x00, 0x40, 0x17, 0xe3, + 0x20, 0x01, 0xa7, 0x74, 0x20, 0x04, 0xd0, 0xb4, 0x00, 0xc0, 0x18, 0x2b, + 0x60, 0x18, 0x20, 0x04, 0xd0, 0xbc, 0x00, 0xc0, 0x18, 0x2b, 0x68, 0x17, + 0x7f, 0xff, 0x68, 0x13, 0xff, 0xff, 0x10, 0x78, 0x20, 0x8a, 0x00, 0xc0, + 0x17, 0xe3, 0x0c, 0x7e, 0x70, 0x04, 0x20, 0x60, 0x60, 0x24, 0xc0, 0xd4, + 0x60, 0x26, 0x0c, 0x7f, 0x68, 0x4c, 0xd0, 0xf4, 0x00, 0x40, 0x18, 0x40, + 0x68, 0x17, 0xff, 0xff, 0x68, 0x13, 0xff, 0xff, 0x00, 0x78, 0x17, 0xe3, + 0x68, 0x24, 0x20, 0x50, 0x68, 0x18, 0x20, 0x60, 0x68, 0x30, 0x20, 0x40, + 0x60, 0x34, 0xa0, 0xcc, 0x00, 0x0f, 0x20, 0x09, 0x00, 0x11, 0x10, 0x78, + 0x18, 0x55, 0x00, 0x40, 0x18, 0x53, 0x20, 0x09, 0x00, 0x01, 0x10, 0x78, + 0x18, 0x55, 0x2d, 0x58, 0x00, 0x7c, 0x8a, 0xff, 0x00, 0x40, 0x18, 0xec, + 0xa0, 0x3e, 0x27, 0x30, 0x68, 0x50, 0xd0, 0xfc, 0x00, 0xc0, 0x18, 0x77, + 0xd0, 0xf4, 0x00, 0xc0, 0x18, 0x87, 0x0d, 0x7e, 0x28, 0x04, 0xac, 0x68, + 0x29, 0x00, 0x00, 0x79, 0x18, 0x67, 0x18, 0xce, 0x18, 0x8e, 0x18, 0x8e, + 0x18, 0xce, 0x18, 0xce, 0x18, 0xc6, 0x18, 0xce, 0x18, 0x8e, 0x18, 0xce, + 0x18, 0x94, 0x18, 0x94, 0x18, 0xce, 0x18, 0xce, 0x18, 0xce, 0x18, 0xbd, + 0x18, 0x94, 0xc0, 0xfc, 0x68, 0x52, 0x6b, 0x6c, 0x6a, 0x70, 0x6d, 0x1c, + 0x6c, 0x20, 0x0d, 0x7e, 0xd9, 0x9c, 0x00, 0x40, 0x18, 0xd1, 0x28, 0x04, + 0xac, 0x68, 0x6f, 0x08, 0x6e, 0x0c, 0x00, 0x78, 0x18, 0xd1, 0xc0, 0xf4, + 0x68, 0x52, 0x6b, 0x6c, 0x6a, 0x70, 0x0d, 0x7e, 0x00, 0x78, 0x18, 0xd8, + 0x6b, 0x08, 0x6a, 0x0c, 0x6d, 0x00, 0x6c, 0x04, 0x00, 0x78, 0x18, 0xd1, + 0x7b, 0x0c, 0xd3, 0xbc, 0x00, 0x40, 0x18, 0xb5, 0x70, 0x04, 0x0e, 0x7e, + 0x20, 0x70, 0x70, 0x1c, 0x0e, 0x7f, 0xa0, 0x86, 0x00, 0x08, 0x00, 0xc0, + 0x18, 0xb5, 0x7b, 0x08, 0xa3, 0x9c, 0x0f, 0xff, 0x2d, 0x20, 0x0d, 0x7f, + 0x0d, 0x7e, 0x6a, 0x14, 0x82, 0xff, 0x00, 0xc0, 0x18, 0xb0, 0x68, 0x10, + 0xa3, 0x02, 0x00, 0x48, 0x18, 0xb0, 0x6b, 0x10, 0x20, 0x11, 0x00, 0x00, + 0x24, 0x68, 0x00, 0x78, 0x18, 0xb7, 0x6b, 0x10, 0x6a, 0x14, 0x6d, 0x00, + 0x6c, 0x04, 0x6f, 0x08, 0x6e, 0x0c, 0x00, 0x78, 0x18, 0xd1, 0x0d, 0x7f, + 0x0d, 0x7e, 0x68, 0x34, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, 0x00, 0x1e, + 0x00, 0xc0, 0x18, 0xce, 0x0d, 0x7f, 0x10, 0x78, 0x20, 0x26, 0x00, 0xc0, + 0x18, 0x55, 0xa0, 0x0e, 0x00, 0x78, 0x18, 0xec, 0x0d, 0x7f, 0x10, 0x78, + 0x13, 0x32, 0x7b, 0x22, 0x7a, 0x26, 0x7d, 0x32, 0x7c, 0x36, 0x7f, 0x3a, + 0x7e, 0x3e, 0x79, 0x02, 0x70, 0x00, 0x80, 0x00, 0x70, 0x02, 0x0d, 0x7f, + 0x68, 0x28, 0xa3, 0x00, 0x68, 0x2a, 0x68, 0x2c, 0xa2, 0x01, 0x68, 0x2e, + 0x23, 0x00, 0x6b, 0x10, 0xa3, 0x02, 0x68, 0x12, 0x22, 0x00, 0x6a, 0x14, + 0xa2, 0x03, 0x68, 0x16, 0x10, 0x78, 0x20, 0x26, 0x00, 0x7c, 0x10, 0x78, + 0x13, 0x32, 0x10, 0x78, 0x1c, 0x97, 0x70, 0x04, 0x20, 0x60, 0x0d, 0x7e, + 0x60, 0x10, 0x20, 0x68, 0x70, 0x03, 0x00, 0x00, 0x10, 0x78, 0x1a, 0xf4, + 0x10, 0x78, 0x8d, 0x16, 0x00, 0x40, 0x19, 0x0c, 0x68, 0x08, 0x80, 0x01, + 0x68, 0x0a, 0x69, 0x7c, 0x69, 0x12, 0x69, 0x80, 0x69, 0x16, 0x68, 0x2b, + 0xff, 0xff, 0x68, 0x2f, 0xff, 0xff, 0x68, 0x50, 0xc0, 0xbd, 0x68, 0x52, + 0x0d, 0x7f, 0x10, 0x78, 0x8a, 0x11, 0x00, 0x78, 0x1a, 0xdb, 0x10, 0x78, + 0x13, 0x32, 0x12, 0x7e, 0x20, 0x91, 0x21, 0x00, 0x00, 0x7e, 0x01, 0x7e, + 0x2b, 0x68, 0x68, 0x18, 0x20, 0x60, 0x79, 0x04, 0x78, 0x03, 0x00, 0x02, + 0xa1, 0x84, 0x07, 0x00, 0x00, 0xc0, 0x18, 0xef, 0xa1, 0x84, 0x00, 0x03, + 0xa0, 0x86, 0x00, 0x03, 0x00, 0x40, 0x19, 0x11, 0x70, 0x00, 0x00, 0x79, + 0x19, 0x2b, 0x19, 0x33, 0x19, 0x35, 0x1a, 0x34, 0x1a, 0xb2, 0x1a, 0xc9, + 0x19, 0x33, 0x19, 0x33, 0x19, 0x33, 0x10, 0x78, 0x13, 0x32, 0x80, 0x01, + 0x70, 0x02, 0xa1, 0x84, 0x08, 0x80, 0x00, 0xc0, 0x19, 0x4a, 0x8a, 0xff, + 0x00, 0x40, 0x19, 0xd4, 0x20, 0x09, 0x00, 0x01, 0x10, 0x78, 0x18, 0x55, + 0x00, 0x40, 0x1a, 0xdb, 0x20, 0x09, 0x00, 0x01, 0x10, 0x78, 0x18, 0x55, + 0x00, 0x78, 0x1a, 0xdb, 0x78, 0x03, 0x00, 0x04, 0x70, 0x03, 0x00, 0x00, + 0xd1, 0xbc, 0x00, 0xc0, 0x19, 0xb2, 0x02, 0x7e, 0x03, 0x7e, 0x01, 0x7e, + 0x78, 0x08, 0xd0, 0xec, 0x00, 0xc0, 0x19, 0x62, 0x7c, 0x20, 0x7d, 0x24, + 0x7e, 0x30, 0x7f, 0x34, 0x78, 0x03, 0x00, 0x09, 0x70, 0x03, 0x00, 0x04, + 0x00, 0x78, 0x19, 0x64, 0x10, 0x78, 0x1b, 0xd7, 0x01, 0x7f, 0xd1, 0x94, + 0x00, 0x40, 0x19, 0x6b, 0x8a, 0xff, 0x00, 0x40, 0x19, 0xa1, 0x6b, 0x28, + 0x6a, 0x2c, 0x24, 0x00, 0x68, 0x6e, 0xa3, 0x1a, 0x25, 0x00, 0x68, 0x72, + 0xa2, 0x13, 0x6b, 0x2a, 0x6a, 0x2e, 0x0c, 0x7e, 0x70, 0x04, 0x20, 0x60, + 0x60, 0x24, 0xd0, 0xf4, 0x00, 0xc0, 0x19, 0x7e, 0x63, 0x3a, 0x62, 0x36, + 0x0c, 0x7f, 0x24, 0x00, 0x69, 0x10, 0xa1, 0x00, 0x68, 0x12, 0x25, 0x00, + 0x69, 0x14, 0xa1, 0x01, 0x68, 0x16, 0x03, 0x7f, 0x02, 0x7f, 0x26, 0x00, + 0x68, 0x1e, 0x27, 0x00, 0x68, 0x22, 0x10, 0x78, 0x20, 0x3f, 0x2a, 0x00, + 0x68, 0x26, 0x2c, 0x00, 0x68, 0x1a, 0x28, 0x00, 0x68, 0x32, 0x68, 0x50, + 0xc0, 0xfd, 0x68, 0x52, 0x68, 0x08, 0x80, 0x01, 0x68, 0x0a, 0x00, 0xc0, + 0x19, 0xa7, 0x68, 0x4c, 0xd0, 0xe4, 0x00, 0x40, 0x19, 0xa7, 0x70, 0x04, + 0x20, 0x60, 0x20, 0x09, 0x00, 0x48, 0x10, 0x78, 0x77, 0x5c, 0x70, 0x00, + 0xa0, 0x86, 0x00, 0x04, 0x00, 0x40, 0x1a, 0xdb, 0x70, 0x03, 0x00, 0x00, + 0x10, 0x78, 0x17, 0xc1, 0x00, 0x78, 0x1a, 0xdb, 0x05, 0x7e, 0x7d, 0x0c, + 0xd5, 0xbc, 0x00, 0xc0, 0x19, 0xb9, 0x10, 0x78, 0xa5, 0x8e, 0x05, 0x7f, + 0x10, 0x78, 0x1a, 0xf4, 0x0f, 0x7e, 0x70, 0x04, 0x20, 0x78, 0x10, 0x78, + 0x49, 0x63, 0x00, 0x40, 0x19, 0xc6, 0x78, 0x24, 0xc0, 0xf5, 0x78, 0x26, + 0x0f, 0x7f, 0x68, 0x2b, 0xff, 0xff, 0x68, 0x2f, 0xff, 0xff, 0x68, 0x08, + 0x80, 0x01, 0x68, 0x0a, 0x69, 0x7c, 0x69, 0x12, 0x69, 0x80, 0x69, 0x16, + 0x00, 0x78, 0x1a, 0xdb, 0x70, 0x04, 0x0c, 0x7e, 0x20, 0x60, 0x60, 0x24, + 0x0c, 0x7f, 0xd0, 0xf4, 0x00, 0x40, 0x19, 0xe1, 0x68, 0x08, 0x80, 0x01, + 0x68, 0x0a, 0x00, 0x78, 0x19, 0xf5, 0x68, 0x4c, 0xc0, 0xf5, 0x68, 0x4e, + 0x78, 0x14, 0xa0, 0x05, 0x00, 0xc0, 0x19, 0xf9, 0x70, 0x03, 0x00, 0x00, + 0x68, 0x08, 0x80, 0x01, 0x68, 0x0a, 0x00, 0xc0, 0x19, 0xf5, 0x70, 0x04, + 0x20, 0x60, 0x20, 0x09, 0x00, 0x48, 0x10, 0x78, 0x77, 0x5c, 0x10, 0x78, + 0x17, 0xc1, 0x00, 0x78, 0x1a, 0xdb, 0x78, 0x14, 0x69, 0x10, 0xa1, 0x02, + 0x68, 0x12, 0x69, 0x14, 0xa1, 0x83, 0x00, 0x00, 0x68, 0x16, 0x78, 0x14, + 0x79, 0x08, 0xa1, 0x8c, 0x0f, 0xff, 0xa1, 0x92, 0x08, 0x41, 0x00, 0xc8, + 0x18, 0xef, 0xa1, 0x88, 0x00, 0x07, 0x81, 0x14, 0x82, 0x14, 0x82, 0x14, + 0xa1, 0x0a, 0x81, 0x04, 0x80, 0x04, 0x80, 0x04, 0xa2, 0x0a, 0x81, 0x0b, + 0x81, 0x0b, 0x81, 0x0b, 0x10, 0x78, 0x1b, 0x5e, 0x78, 0x03, 0x00, 0x04, + 0x78, 0x0f, 0xff, 0xff, 0x78, 0x03, 0x00, 0x01, 0x78, 0x04, 0xd0, 0xfc, + 0x00, 0x40, 0x1a, 0x1e, 0x78, 0x03, 0x00, 0x02, 0x78, 0x03, 0x00, 0x04, + 0x78, 0x0f, 0x00, 0x76, 0x70, 0x04, 0x70, 0x07, 0x00, 0x00, 0x20, 0x60, + 0x20, 0x09, 0x00, 0x48, 0x10, 0x78, 0x77, 0x5c, 0x10, 0x78, 0x1b, 0x92, + 0x00, 0x40, 0x19, 0xf5, 0x80, 0x01, 0x70, 0x02, 0xd1, 0x94, 0x00, 0x40, + 0x1a, 0x46, 0x78, 0x04, 0xd0, 0xfc, 0x00, 0xc0, 0x19, 0x1b, 0x8a, 0xff, + 0x00, 0x40, 0x1a, 0xdb, 0x20, 0x09, 0x00, 0x01, 0x10, 0x78, 0x18, 0x55, + 0x00, 0x78, 0x1a, 0xdb, 0xa1, 0x84, 0x08, 0x80, 0x00, 0xc0, 0x1a, 0x53, + 0x8a, 0xff, 0x00, 0x40, 0x1a, 0xdb, 0x20, 0x09, 0x00, 0x01, 0x10, 0x78, + 0x18, 0x55, 0x00, 0x78, 0x1a, 0xdb, 0x78, 0x03, 0x00, 0x04, 0x70, 0x03, + 0x00, 0x00, 0xd1, 0xbc, 0x00, 0xc0, 0x1a, 0x93, 0x02, 0x7e, 0x03, 0x7e, + 0x78, 0x08, 0xd0, 0xec, 0x00, 0xc0, 0x1a, 0x66, 0x78, 0x03, 0x00, 0x09, + 0x70, 0x03, 0x00, 0x04, 0x00, 0x78, 0x1a, 0x68, 0x10, 0x78, 0x1b, 0xd7, + 0x6b, 0x28, 0x6a, 0x2c, 0x10, 0x78, 0x20, 0x3f, 0x0d, 0x7e, 0x0f, 0x7e, + 0x2d, 0x78, 0x28, 0x04, 0xac, 0x68, 0x60, 0x34, 0xd0, 0x9c, 0x00, 0xc0, + 0x1a, 0x83, 0x68, 0x08, 0x20, 0x08, 0xa3, 0x1a, 0x68, 0x0c, 0xa2, 0x13, + 0x78, 0x10, 0xa1, 0x00, 0x78, 0x12, 0x69, 0x0c, 0x78, 0x14, 0xa1, 0x01, + 0x78, 0x16, 0x00, 0x78, 0x1a, 0x8f, 0x68, 0x10, 0x20, 0x08, 0xa3, 0x1a, + 0x68, 0x14, 0xa2, 0x13, 0x78, 0x10, 0xa1, 0x00, 0x78, 0x12, 0x69, 0x14, + 0x78, 0x14, 0xa1, 0x01, 0x78, 0x16, 0x0f, 0x7f, 0x0d, 0x7f, 0x00, 0x78, + 0x19, 0x6d, 0x05, 0x7e, 0x7d, 0x0c, 0x10, 0x78, 0xa5, 0x8e, 0x05, 0x7f, + 0x10, 0x78, 0x1a, 0xf4, 0x0f, 0x7e, 0x70, 0x04, 0x20, 0x78, 0x10, 0x78, + 0x49, 0x63, 0x00, 0x40, 0x1a, 0xa4, 0x78, 0x24, 0xc0, 0xf5, 0x78, 0x26, + 0x0f, 0x7f, 0x68, 0x2b, 0xff, 0xff, 0x68, 0x2f, 0xff, 0xff, 0x68, 0x08, + 0x80, 0x01, 0x68, 0x0a, 0x69, 0x7c, 0x69, 0x12, 0x69, 0x80, 0x69, 0x16, + 0x00, 0x78, 0x1a, 0xdb, 0x78, 0x03, 0x00, 0x04, 0x70, 0x03, 0x00, 0x00, + 0x70, 0x04, 0xa0, 0x0d, 0x00, 0x40, 0x1a, 0xc5, 0x68, 0x08, 0x80, 0x01, + 0x68, 0x0a, 0x00, 0xc0, 0x1a, 0xc5, 0x70, 0x04, 0x20, 0x60, 0x20, 0x09, + 0x00, 0x48, 0x10, 0x78, 0x77, 0x5c, 0x10, 0x78, 0x17, 0xc1, 0x00, 0x78, + 0x1a, 0xdb, 0x78, 0x03, 0x00, 0x04, 0x70, 0x03, 0x00, 0x00, 0x70, 0x04, + 0x20, 0x60, 0x60, 0x10, 0xa0, 0x05, 0x00, 0x40, 0x1a, 0xc5, 0x20, 0x68, + 0x68, 0x08, 0x80, 0x00, 0x68, 0x0a, 0x6c, 0x28, 0x6b, 0x2c, 0x10, 0x78, + 0x17, 0xe0, 0x01, 0x7f, 0x00, 0x7f, 0x12, 0x7f, 0x00, 0x7c, 0x12, 0x7e, + 0x20, 0x91, 0x21, 0x00, 0x70, 0x00, 0xa0, 0x86, 0x00, 0x03, 0x00, 0xc0, + 0x1a, 0xf2, 0x70, 0x0c, 0x71, 0x10, 0xa1, 0x06, 0x00, 0x40, 0x1a, 0xf2, + 0x20, 0xe1, 0x90, 0x28, 0x70, 0x0f, 0xa9, 0xed, 0x70, 0x13, 0xa9, 0xed, + 0x12, 0x7f, 0x00, 0x7c, 0x0c, 0x7e, 0x10, 0x78, 0x1b, 0x22, 0x20, 0xe1, + 0x90, 0x28, 0x70, 0x0c, 0x71, 0x10, 0xa1, 0x06, 0x00, 0x40, 0x1b, 0x19, + 0x21, 0x04, 0xa0, 0x05, 0x00, 0x40, 0x1b, 0x08, 0x20, 0x60, 0x60, 0x10, + 0x20, 0x60, 0x60, 0x08, 0x80, 0x01, 0x60, 0x0a, 0xa1, 0x88, 0x00, 0x03, + 0xa1, 0x82, 0xaa, 0x08, 0x00, 0x48, 0x1b, 0x10, 0x20, 0x09, 0xa9, 0xed, + 0x71, 0x12, 0x70, 0x0c, 0xa1, 0x06, 0x00, 0xc0, 0x1a, 0xf9, 0x20, 0x11, + 0x00, 0x08, 0x00, 0x78, 0x1a, 0xf9, 0x20, 0x01, 0x01, 0x5d, 0x20, 0x03, + 0x00, 0x00, 0x20, 0x01, 0x01, 0x38, 0x22, 0x02, 0x0c, 0x7f, 0x00, 0x7c, + 0x20, 0x01, 0x01, 0x38, 0x20, 0x14, 0x20, 0x03, 0x00, 0x00, 0x20, 0x21, + 0xb0, 0x15, 0x20, 0x01, 0x01, 0x41, 0x20, 0x1c, 0xd3, 0xdc, 0x00, 0xc0, + 0x1b, 0x3f, 0x20, 0x01, 0x01, 0x09, 0x20, 0x1c, 0xa3, 0x9c, 0x00, 0x48, + 0x00, 0xc0, 0x1b, 0x3f, 0x20, 0x01, 0x01, 0x11, 0x20, 0x1c, 0x83, 0xff, + 0x00, 0xc0, 0x1b, 0x3f, 0x84, 0x21, 0x00, 0xc0, 0x1b, 0x29, 0x00, 0x7c, + 0x20, 0x11, 0x02, 0x01, 0x20, 0x09, 0x00, 0x3c, 0x22, 0x04, 0xa0, 0x05, + 0x00, 0xc0, 0x1b, 0x4c, 0x81, 0x09, 0x00, 0xc0, 0x1b, 0x44, 0x00, 0x7c, + 0x00, 0x7c, 0x10, 0x78, 0x1b, 0x40, 0x00, 0x40, 0x1b, 0x55, 0x78, 0x0c, + 0xd0, 0xa4, 0x00, 0x40, 0x1b, 0x5b, 0x10, 0x78, 0x1a, 0xf4, 0xa0, 0x85, + 0x00, 0x01, 0x00, 0x78, 0x1b, 0x5d, 0x10, 0x78, 0x1b, 0x92, 0x00, 0x7c, + 0x0e, 0x7e, 0x20, 0x71, 0x02, 0x00, 0x78, 0x08, 0xa0, 0x84, 0xf0, 0x00, + 0xa1, 0x0d, 0x10, 0x78, 0x1b, 0x22, 0x20, 0x19, 0x50, 0x00, 0x83, 0x19, + 0x00, 0x40, 0x1b, 0x7c, 0x20, 0x01, 0xaa, 0x08, 0x20, 0x04, 0xa0, 0x86, + 0x00, 0x00, 0x00, 0x40, 0x1b, 0x7c, 0x20, 0x01, 0x00, 0x21, 0xd0, 0xfc, + 0x00, 0x40, 0x1b, 0x69, 0x10, 0x78, 0x1e, 0xaa, 0x00, 0x78, 0x1b, 0x67, + 0x20, 0xe1, 0x70, 0x00, 0x73, 0x24, 0x74, 0x20, 0x70, 0x28, 0x70, 0x28, + 0x74, 0x26, 0x70, 0x37, 0x00, 0x01, 0x81, 0x0f, 0x71, 0x2e, 0x70, 0x2f, + 0x01, 0x00, 0x70, 0x37, 0x00, 0x08, 0x73, 0x26, 0x74, 0x22, 0x20, 0x01, + 0x01, 0x38, 0x22, 0x02, 0x0e, 0x7f, 0x00, 0x7c, 0x02, 0x7e, 0x20, 0x01, + 0x01, 0x5d, 0x20, 0x01, 0x00, 0x00, 0x79, 0x08, 0xa1, 0x8c, 0x0f, 0xff, + 0xa1, 0x82, 0x0f, 0xfd, 0x00, 0x48, 0x1b, 0xa0, 0x20, 0x09, 0x00, 0x00, + 0xa1, 0x90, 0x00, 0x07, 0xa2, 0x94, 0x1f, 0xf8, 0x82, 0x14, 0x82, 0x14, + 0x82, 0x14, 0x20, 0x01, 0x02, 0x0a, 0x82, 0xff, 0x00, 0x40, 0x1b, 0xb5, + 0x20, 0xe1, 0x60, 0x00, 0x20, 0x0c, 0x20, 0x0c, 0x20, 0x0c, 0x20, 0x0c, + 0x82, 0x11, 0x00, 0xc0, 0x1b, 0xae, 0x20, 0xe1, 0x70, 0x00, 0x20, 0x0c, + 0x20, 0x0c, 0x70, 0x03, 0x00, 0x00, 0x20, 0xe1, 0x60, 0x00, 0x20, 0x01, + 0x02, 0x08, 0x20, 0x0c, 0x20, 0x01, 0x02, 0x09, 0x20, 0x04, 0xa1, 0x06, + 0x00, 0x40, 0x1b, 0xd4, 0x10, 0x78, 0x1b, 0x40, 0x00, 0x40, 0x1b, 0xd2, + 0x79, 0x08, 0xd1, 0xec, 0x00, 0xc0, 0x1b, 0xd4, 0x79, 0x0c, 0xd1, 0xa4, + 0x00, 0x40, 0x1b, 0x97, 0x10, 0x78, 0x1a, 0xf4, 0xa0, 0x06, 0x02, 0x7f, + 0x00, 0x7c, 0x7c, 0x20, 0x7d, 0x24, 0x7e, 0x30, 0x7f, 0x34, 0x70, 0x0c, + 0x71, 0x10, 0xa1, 0x06, 0x00, 0x40, 0x1c, 0x69, 0x70, 0x04, 0x01, 0x7e, + 0x21, 0x0c, 0xa1, 0x06, 0x01, 0x7f, 0x00, 0x40, 0x1c, 0x69, 0x0d, 0x7e, + 0x0c, 0x7e, 0x21, 0x6c, 0x2d, 0x00, 0xa0, 0x05, 0x00, 0x40, 0x1c, 0x67, + 0x68, 0x1c, 0xa0, 0x86, 0x00, 0x08, 0x00, 0x40, 0x1c, 0x67, 0x68, 0x24, + 0xd0, 0xd4, 0x00, 0xc0, 0x1c, 0x67, 0x68, 0x10, 0x20, 0x68, 0x68, 0x50, + 0xd0, 0xfc, 0x00, 0x40, 0x1c, 0x29, 0x81, 0x08, 0x21, 0x04, 0x6b, 0x2c, + 0xa3, 0x06, 0x00, 0xc0, 0x1c, 0x67, 0x81, 0x08, 0x21, 0x04, 0x6a, 0x28, + 0xa2, 0x06, 0x00, 0xc0, 0x1c, 0x67, 0x68, 0x50, 0xc0, 0xfc, 0xc0, 0xf5, + 0x68, 0x52, 0x68, 0x6c, 0x78, 0x22, 0x68, 0x70, 0x78, 0x26, 0x68, 0x1c, + 0x78, 0x32, 0x68, 0x20, 0x78, 0x36, 0x68, 0x18, 0x20, 0x60, 0x60, 0x34, + 0xd0, 0x9c, 0x00, 0x40, 0x1c, 0x24, 0x68, 0x30, 0x20, 0x04, 0xac, 0x68, + 0x68, 0x08, 0x78, 0x3a, 0x68, 0x0c, 0x78, 0x3e, 0x00, 0x78, 0x1c, 0x65, + 0xa0, 0x06, 0x78, 0x3a, 0x78, 0x3e, 0x00, 0x78, 0x1c, 0x65, 0x81, 0x08, + 0x21, 0x04, 0xa0, 0x05, 0x00, 0xc0, 0x1c, 0x67, 0x6b, 0x2c, 0xa3, 0x06, + 0x00, 0xc0, 0x1c, 0x67, 0x81, 0x08, 0x21, 0x04, 0xa0, 0x05, 0x00, 0xc0, + 0x1c, 0x67, 0x6a, 0x28, 0xa2, 0x06, 0x00, 0xc0, 0x1c, 0x67, 0x68, 0x50, + 0xc0, 0xf5, 0x68, 0x52, 0x68, 0x30, 0x20, 0x04, 0x69, 0x18, 0xa1, 0x60, + 0xa1, 0x80, 0x00, 0x0d, 0x20, 0x04, 0xd0, 0x9c, 0x00, 0xc0, 0x1c, 0x57, + 0x60, 0x08, 0x78, 0x22, 0x68, 0x6e, 0x60, 0x0c, 0x78, 0x26, 0x68, 0x72, + 0x60, 0x00, 0x78, 0x32, 0x60, 0x04, 0x78, 0x36, 0xa0, 0x06, 0x78, 0x3a, + 0x78, 0x3e, 0x00, 0x78, 0x1c, 0x65, 0x60, 0x10, 0x78, 0x22, 0x68, 0x6e, + 0x60, 0x14, 0x78, 0x26, 0x68, 0x72, 0x60, 0x00, 0x78, 0x32, 0x60, 0x04, + 0x78, 0x36, 0x60, 0x08, 0x78, 0x3a, 0x60, 0x0c, 0x78, 0x3e, 0x78, 0x03, + 0x00, 0x11, 0x0c, 0x7f, 0x0d, 0x7f, 0x00, 0x7c, 0x0f, 0x7e, 0x0e, 0x7e, + 0x01, 0x7e, 0x02, 0x7e, 0x20, 0x71, 0xa9, 0xe7, 0x20, 0x79, 0x00, 0x30, + 0x20, 0x11, 0x00, 0x50, 0x70, 0x00, 0xa0, 0x86, 0x00, 0x00, 0x00, 0x40, + 0x1c, 0x92, 0x82, 0x11, 0x00, 0x40, 0x1c, 0x90, 0x20, 0x01, 0x00, 0x05, + 0x20, 0x04, 0xd0, 0x8c, 0x00, 0x40, 0x1c, 0x79, 0x79, 0x04, 0xa1, 0x8c, + 0x07, 0x80, 0x01, 0x7e, 0x10, 0x78, 0x19, 0x13, 0x01, 0x7f, 0x81, 0xff, + 0x00, 0xc0, 0x1c, 0x90, 0x20, 0x11, 0x00, 0x50, 0x00, 0x78, 0x1c, 0x74, + 0xa0, 0x85, 0x00, 0x01, 0x02, 0x7f, 0x01, 0x7f, 0x0e, 0x7f, 0x0f, 0x7f, + 0x00, 0x7c, 0x78, 0x03, 0x00, 0x04, 0x20, 0x09, 0x00, 0x64, 0x78, 0x04, + 0xd0, 0xac, 0x00, 0x40, 0x1c, 0xe8, 0x81, 0x09, 0x00, 0xc0, 0x1c, 0x9b, + 0x20, 0x09, 0x01, 0x00, 0x21, 0x0c, 0xa1, 0x8a, 0x00, 0x03, 0x10, 0x48, + 0x13, 0x32, 0x10, 0x78, 0x1f, 0xca, 0x0e, 0x7e, 0x0f, 0x7e, 0x20, 0x71, + 0xa9, 0xd6, 0x20, 0x79, 0x00, 0x10, 0x70, 0x04, 0xa0, 0x86, 0x00, 0x00, + 0x00, 0x40, 0x1c, 0xe0, 0x78, 0x00, 0x00, 0x7e, 0x78, 0x20, 0x00, 0x7e, + 0x78, 0x30, 0x00, 0x7e, 0x78, 0x34, 0x00, 0x7e, 0x78, 0x38, 0x00, 0x7e, + 0x78, 0x3c, 0x00, 0x7e, 0x78, 0x03, 0x00, 0x04, 0x78, 0x23, 0x00, 0x00, + 0x00, 0x05, 0x00, 0x05, 0x20, 0x79, 0x00, 0x30, 0x78, 0x04, 0xd0, 0xac, + 0x10, 0xc0, 0x13, 0x32, 0x20, 0x79, 0x00, 0x10, 0x00, 0x7f, 0x78, 0x3e, + 0x00, 0x7f, 0x78, 0x3a, 0x00, 0x7f, 0x78, 0x36, 0x00, 0x7f, 0x78, 0x32, + 0x00, 0x7f, 0x78, 0x22, 0x00, 0x7f, 0x78, 0x02, 0x0f, 0x7f, 0x0e, 0x7f, + 0x00, 0x78, 0x1c, 0xe6, 0x0f, 0x7f, 0x0e, 0x7f, 0x78, 0x04, 0xd0, 0xac, + 0x10, 0xc0, 0x13, 0x32, 0x10, 0x78, 0x63, 0x9b, 0x00, 0x7c, 0x0e, 0x7e, + 0x20, 0x71, 0xaa, 0x08, 0x70, 0x03, 0x00, 0x00, 0x0e, 0x7f, 0x00, 0x7c, + 0x0d, 0x7e, 0xa2, 0x80, 0x00, 0x04, 0x20, 0x6c, 0x69, 0x4c, 0xd1, 0xdc, + 0x00, 0xc0, 0x1d, 0x6b, 0x69, 0x34, 0xa1, 0x84, 0x00, 0x07, 0x00, 0x79, + 0x1c, 0xfd, 0x1d, 0x05, 0x1d, 0x56, 0x1d, 0x05, 0x1d, 0x05, 0x1d, 0x05, + 0x1d, 0x3b, 0x1d, 0x18, 0x1d, 0x07, 0x10, 0x78, 0x13, 0x32, 0x68, 0x4c, + 0xd0, 0xb4, 0x00, 0x40, 0x1e, 0x79, 0x68, 0x60, 0x68, 0x2e, 0x68, 0x16, + 0x68, 0x5c, 0x68, 0x2a, 0x68, 0x12, 0x68, 0x7c, 0x68, 0x0a, 0x68, 0x80, + 0x68, 0x0e, 0x69, 0x58, 0x00, 0x78, 0x1d, 0x5e, 0x68, 0x34, 0xa0, 0x84, + 0x00, 0xff, 0xa0, 0x86, 0x00, 0x1e, 0x00, 0xc0, 0x1d, 0x05, 0x68, 0x4c, + 0xd0, 0xb4, 0x00, 0x40, 0x1e, 0x79, 0x68, 0x60, 0x68, 0x2e, 0x68, 0x16, + 0x68, 0x5c, 0x68, 0x2a, 0x68, 0x12, 0x68, 0x7c, 0x68, 0x0a, 0x68, 0x80, + 0x68, 0x0e, 0x68, 0x04, 0x68, 0x1a, 0xa0, 0x80, 0x00, 0x0d, 0x20, 0x04, + 0xa0, 0x84, 0x00, 0x0f, 0xa0, 0x80, 0x20, 0x6a, 0x20, 0x04, 0x68, 0x32, + 0x69, 0x58, 0x00, 0x78, 0x1d, 0x67, 0xa1, 0x8c, 0x00, 0xff, 0xa1, 0x86, + 0x00, 0x15, 0x00, 0xc0, 0x1d, 0x6b, 0x68, 0x4c, 0xd0, 0xb4, 0x00, 0x40, + 0x1e, 0x79, 0x68, 0x04, 0x68, 0x1a, 0xa0, 0x80, 0x00, 0x0d, 0x20, 0x04, + 0xa0, 0x84, 0x00, 0x0f, 0xa0, 0x80, 0x20, 0x6a, 0x20, 0x04, 0x68, 0x32, + 0x69, 0x58, 0xa0, 0x06, 0x68, 0x2e, 0x68, 0x2a, 0x00, 0x78, 0x1d, 0x67, + 0x68, 0x4c, 0xd0, 0xb4, 0x00, 0x40, 0x18, 0xed, 0x69, 0x58, 0xa0, 0x06, + 0x68, 0x2e, 0x68, 0x2a, 0x2d, 0x00, 0x68, 0x1a, 0x68, 0x34, 0xa0, 0x84, + 0x00, 0x0f, 0xa0, 0x80, 0x20, 0x6a, 0x20, 0x04, 0x68, 0x32, 0x69, 0x26, + 0x68, 0x4c, 0xc0, 0xdd, 0x68, 0x4e, 0x0d, 0x7f, 0x00, 0x7c, 0x0f, 0x7e, + 0x20, 0x79, 0x00, 0x20, 0x78, 0x04, 0xd0, 0xfc, 0x10, 0xc0, 0x1e, 0xaa, + 0x0e, 0x7e, 0x0d, 0x7e, 0x20, 0x71, 0xaa, 0x08, 0x70, 0x00, 0xa0, 0x05, + 0x00, 0xc0, 0x1d, 0xf0, 0x0c, 0x7e, 0x72, 0x06, 0xa2, 0x80, 0x00, 0x04, + 0x20, 0x5c, 0x70, 0x04, 0x20, 0x68, 0x78, 0x03, 0x00, 0x04, 0x68, 0x18, + 0x0d, 0x7e, 0x20, 0x68, 0x68, 0x6c, 0x78, 0x12, 0x68, 0x90, 0x0f, 0x7e, + 0x20, 0xe1, 0x90, 0x40, 0x20, 0x79, 0x02, 0x00, 0x78, 0x1a, 0x20, 0x79, + 0x01, 0x00, 0x80, 0x04, 0x78, 0xd6, 0x0f, 0x7f, 0x0d, 0x7f, 0x2b, 0x68, + 0x68, 0x24, 0x20, 0x50, 0x68, 0x18, 0x20, 0x60, 0x68, 0x30, 0x20, 0x40, + 0x60, 0x34, 0xa0, 0xcc, 0x00, 0x0f, 0x69, 0x08, 0x20, 0x01, 0x04, 0xfd, + 0x20, 0x04, 0xa0, 0x86, 0x00, 0x07, 0x00, 0x40, 0x1d, 0xb2, 0xa1, 0x84, + 0x00, 0x07, 0x00, 0x40, 0x1d, 0xb2, 0x01, 0x7e, 0x20, 0x09, 0x00, 0x08, + 0xa1, 0x02, 0x01, 0x7f, 0xa1, 0x08, 0x79, 0x1a, 0x71, 0x16, 0x70, 0x1e, + 0x68, 0x0c, 0xa0, 0x81, 0x00, 0x00, 0x78, 0x1e, 0x70, 0x1a, 0xa0, 0x06, + 0x70, 0x0e, 0x70, 0x12, 0x70, 0x04, 0x69, 0x2c, 0x68, 0x14, 0xa1, 0x06, + 0x00, 0xc0, 0x1d, 0xc9, 0x69, 0x28, 0x68, 0x10, 0xa1, 0x06, 0x00, 0x40, + 0x1d, 0xd6, 0x03, 0x7e, 0x04, 0x7e, 0x6b, 0x14, 0x6c, 0x10, 0x10, 0x78, + 0x20, 0x8a, 0x04, 0x7f, 0x03, 0x7f, 0x00, 0x40, 0x1d, 0xd6, 0x0c, 0x7f, + 0x00, 0x78, 0x1d, 0xf0, 0x8a, 0xff, 0x00, 0xc0, 0x1d, 0xde, 0x0c, 0x7f, + 0xa0, 0x85, 0x00, 0x01, 0x00, 0x78, 0x1d, 0xf0, 0x12, 0x7e, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x79, 0x00, 0x20, 0x20, 0x09, 0x00, 0x01, 0x10, 0x78, + 0x1d, 0xf4, 0x00, 0x40, 0x1d, 0xed, 0x20, 0x09, 0x00, 0x01, 0x10, 0x78, + 0x1d, 0xf4, 0x12, 0x7f, 0x0c, 0x7f, 0xa0, 0x06, 0x0d, 0x7f, 0x0e, 0x7f, + 0x0f, 0x7f, 0x00, 0x7c, 0x07, 0x7e, 0x06, 0x7e, 0x05, 0x7e, 0x04, 0x7e, + 0x03, 0x7e, 0x02, 0x7e, 0x8a, 0xff, 0x00, 0x40, 0x1e, 0x72, 0x70, 0x0c, + 0x72, 0x14, 0xa2, 0x3a, 0x70, 0x10, 0x72, 0x18, 0xa2, 0x03, 0x00, 0x48, + 0x1e, 0x71, 0xa7, 0x05, 0x00, 0x40, 0x1e, 0x71, 0xa0, 0x3e, 0x27, 0x30, + 0x68, 0x50, 0xd0, 0xfc, 0x00, 0xc0, 0x1e, 0x24, 0x0d, 0x7e, 0x28, 0x04, + 0xac, 0x68, 0x29, 0x00, 0x00, 0x79, 0x1e, 0x14, 0x1e, 0x53, 0x1e, 0x34, + 0x1e, 0x34, 0x1e, 0x53, 0x1e, 0x53, 0x1e, 0x4b, 0x1e, 0x53, 0x1e, 0x34, + 0x1e, 0x53, 0x1e, 0x3a, 0x1e, 0x3a, 0x1e, 0x53, 0x1e, 0x53, 0x1e, 0x53, + 0x1e, 0x42, 0x1e, 0x3a, 0xc0, 0xfc, 0x68, 0x52, 0x6b, 0x6c, 0x6a, 0x70, + 0x6d, 0x1c, 0x6c, 0x20, 0xd9, 0x9c, 0x00, 0x40, 0x1e, 0x57, 0x0d, 0x7e, + 0x28, 0x04, 0xac, 0x68, 0x6f, 0x08, 0x6e, 0x0c, 0x00, 0x78, 0x1e, 0x56, + 0x6b, 0x08, 0x6a, 0x0c, 0x6d, 0x00, 0x6c, 0x04, 0x00, 0x78, 0x1e, 0x56, + 0x6b, 0x10, 0x6a, 0x14, 0x6d, 0x00, 0x6c, 0x04, 0x6f, 0x08, 0x6e, 0x0c, + 0x00, 0x78, 0x1e, 0x56, 0x0d, 0x7f, 0x0d, 0x7e, 0x68, 0x34, 0xa0, 0x84, + 0x00, 0xff, 0xa0, 0x86, 0x00, 0x1e, 0x00, 0xc0, 0x1e, 0x53, 0x0d, 0x7f, + 0x10, 0x78, 0x20, 0x26, 0x00, 0xc0, 0x1d, 0xfa, 0xa0, 0x0e, 0x00, 0x78, + 0x1e, 0x72, 0x0d, 0x7f, 0x10, 0x78, 0x13, 0x32, 0x0d, 0x7f, 0x7b, 0x22, + 0x7a, 0x26, 0x7d, 0x32, 0x7c, 0x36, 0x7f, 0x3a, 0x7e, 0x3e, 0x79, 0x02, + 0x70, 0x00, 0x80, 0x00, 0x70, 0x02, 0x68, 0x28, 0xa3, 0x00, 0x68, 0x2a, + 0x68, 0x2c, 0xa2, 0x01, 0x68, 0x2e, 0x70, 0x0c, 0xa3, 0x00, 0x70, 0x0e, + 0x70, 0x10, 0xa2, 0x01, 0x70, 0x12, 0x10, 0x78, 0x20, 0x26, 0x00, 0x78, + 0x1e, 0x72, 0xa0, 0x06, 0x02, 0x7f, 0x03, 0x7f, 0x04, 0x7f, 0x05, 0x7f, + 0x06, 0x7f, 0x07, 0x7f, 0x00, 0x7c, 0x10, 0x78, 0x13, 0x32, 0x02, 0x7e, + 0x20, 0x01, 0x01, 0x05, 0x20, 0x03, 0x00, 0x10, 0x20, 0xe1, 0x90, 0x40, + 0x78, 0x03, 0x00, 0x04, 0x70, 0x03, 0x00, 0x00, 0x70, 0x04, 0x20, 0x60, + 0x0d, 0x7e, 0x60, 0x10, 0x20, 0x68, 0x10, 0x78, 0x8d, 0x16, 0x00, 0x40, + 0x1e, 0x92, 0x68, 0x50, 0xc0, 0xbd, 0x68, 0x52, 0x0d, 0x7f, 0x0c, 0x7e, + 0x10, 0x78, 0x8a, 0x11, 0x0c, 0x7f, 0x20, 0x01, 0xa9, 0xc0, 0x20, 0x04, + 0xac, 0x06, 0x00, 0xc0, 0x1e, 0xa7, 0x20, 0xe1, 0x90, 0x40, 0x10, 0x78, + 0x73, 0x8a, 0x20, 0x11, 0x00, 0x00, 0x10, 0x78, 0x70, 0xea, 0x10, 0x78, + 0x63, 0x9b, 0x02, 0x7f, 0x00, 0x78, 0x1f, 0x76, 0x12, 0x7e, 0x20, 0x91, + 0x22, 0x00, 0x00, 0x7e, 0x01, 0x7e, 0x0f, 0x7e, 0x0e, 0x7e, 0x0d, 0x7e, + 0x0c, 0x7e, 0x20, 0x79, 0x00, 0x20, 0x20, 0x71, 0xaa, 0x08, 0x2b, 0x68, + 0x68, 0x18, 0x20, 0x60, 0x79, 0x04, 0x78, 0x03, 0x00, 0x02, 0xa1, 0x84, + 0x07, 0x00, 0x00, 0xc0, 0x1e, 0x7b, 0x70, 0x00, 0x00, 0x79, 0x1e, 0xc4, + 0x1f, 0x76, 0x1e, 0xc8, 0x1f, 0x43, 0x1f, 0x74, 0x80, 0x01, 0x70, 0x02, + 0xd1, 0x9c, 0x00, 0xc0, 0x1e, 0xdc, 0x8a, 0xff, 0x00, 0x40, 0x1e, 0xfb, + 0x20, 0x09, 0x00, 0x01, 0x10, 0x78, 0x1d, 0xf4, 0x00, 0x40, 0x1f, 0x76, + 0x20, 0x09, 0x00, 0x01, 0x10, 0x78, 0x1d, 0xf4, 0x00, 0x78, 0x1f, 0x76, + 0x78, 0x03, 0x00, 0x04, 0xd1, 0x94, 0x00, 0x40, 0x1e, 0xec, 0x68, 0x50, + 0xc0, 0xfc, 0x68, 0x52, 0x8a, 0xff, 0x00, 0xc0, 0x1e, 0xf1, 0x68, 0x4c, + 0xc0, 0xf5, 0x68, 0x4e, 0x00, 0x78, 0x1e, 0xf1, 0x10, 0x78, 0x20, 0x3f, + 0x68, 0x50, 0xc0, 0xfd, 0x68, 0x52, 0x2a, 0x00, 0x68, 0x26, 0x2c, 0x00, + 0x68, 0x1a, 0x28, 0x00, 0x68, 0x32, 0x70, 0x03, 0x00, 0x00, 0x00, 0x78, + 0x1f, 0x76, 0x71, 0x1c, 0x81, 0xff, 0x00, 0x40, 0x1f, 0x11, 0x79, 0x18, + 0x79, 0x22, 0x78, 0x27, 0x00, 0x00, 0x78, 0x03, 0x00, 0x01, 0x70, 0x00, + 0x80, 0x00, 0x70, 0x02, 0x70, 0x0c, 0xa1, 0x00, 0x70, 0x0e, 0x70, 0x10, + 0xa0, 0x81, 0x00, 0x00, 0x70, 0x12, 0x00, 0x78, 0x1f, 0x76, 0x0f, 0x7e, + 0x02, 0x7e, 0x78, 0x1c, 0x00, 0x7e, 0x78, 0x18, 0x00, 0x7e, 0x20, 0x79, + 0x01, 0x00, 0x7a, 0x14, 0xa2, 0x84, 0x00, 0x04, 0xa0, 0x85, 0x00, 0x12, + 0x78, 0x16, 0x03, 0x7e, 0x20, 0x19, 0x10, 0x00, 0x83, 0x19, 0x10, 0x40, + 0x13, 0x32, 0x78, 0x20, 0xd0, 0xbc, 0x00, 0xc0, 0x1f, 0x22, 0x03, 0x7f, + 0x79, 0xc8, 0x00, 0x7f, 0xa1, 0x02, 0x01, 0x7f, 0x00, 0x7e, 0x01, 0x7e, + 0x79, 0xc4, 0x00, 0x7f, 0xa1, 0x03, 0x78, 0xc6, 0x00, 0x7f, 0x78, 0xca, + 0xa2, 0x84, 0x00, 0x04, 0xa0, 0x85, 0x00, 0x12, 0x78, 0x16, 0x02, 0x7f, + 0x0f, 0x7f, 0x78, 0x03, 0x00, 0x08, 0x70, 0x03, 0x00, 0x00, 0x00, 0x78, + 0x1f, 0x76, 0x80, 0x01, 0x70, 0x02, 0xd1, 0x94, 0x00, 0x40, 0x1f, 0x58, + 0x78, 0x04, 0xd0, 0xfc, 0x00, 0xc0, 0x1e, 0xba, 0xd1, 0x9c, 0x00, 0xc0, + 0x1f, 0x72, 0x8a, 0xff, 0x00, 0x40, 0x1f, 0x76, 0x20, 0x09, 0x00, 0x01, + 0x10, 0x78, 0x1d, 0xf4, 0x00, 0x78, 0x1f, 0x76, 0x02, 0x7e, 0x03, 0x7e, + 0x6b, 0x28, 0x6a, 0x2c, 0x10, 0x78, 0x20, 0x3f, 0x0d, 0x7e, 0x28, 0x04, + 0xac, 0x68, 0x60, 0x34, 0xd0, 0x9c, 0x00, 0xc0, 0x1f, 0x6b, 0x68, 0x08, + 0xa3, 0x1a, 0x68, 0x0c, 0xa2, 0x13, 0x00, 0x78, 0x1f, 0x6f, 0x68, 0x10, + 0xa3, 0x1a, 0x68, 0x14, 0xa2, 0x13, 0x0d, 0x7f, 0x00, 0x78, 0x1e, 0xec, + 0x00, 0x78, 0x1e, 0xec, 0x10, 0x78, 0x13, 0x32, 0x0c, 0x7f, 0x0d, 0x7f, + 0x0e, 0x7f, 0x0f, 0x7f, 0x01, 0x7f, 0x00, 0x7f, 0x12, 0x7f, 0x00, 0x7c, + 0x0f, 0x7e, 0x0e, 0x7e, 0x20, 0x71, 0xaa, 0x08, 0x70, 0x00, 0xa0, 0x86, + 0x00, 0x00, 0x00, 0x40, 0x1f, 0xc7, 0x20, 0x79, 0x00, 0x20, 0x01, 0x7e, + 0x20, 0x09, 0x02, 0x07, 0x21, 0x0c, 0xd1, 0x94, 0x00, 0x40, 0x1f, 0xa4, + 0x20, 0x09, 0x02, 0x0c, 0x21, 0x0c, 0xa1, 0x84, 0x00, 0x03, 0x00, 0x40, + 0x1f, 0xa4, 0x10, 0x78, 0xa5, 0xe2, 0x20, 0x01, 0x01, 0x33, 0x20, 0x04, + 0xa0, 0x05, 0x10, 0x40, 0x13, 0x32, 0x20, 0xe1, 0x90, 0x40, 0x20, 0x01, + 0x02, 0x0c, 0x21, 0x02, 0x20, 0x09, 0x02, 0x06, 0x21, 0x04, 0x20, 0x09, + 0x02, 0x03, 0x21, 0x0c, 0xa1, 0x06, 0x00, 0xc0, 0x1f, 0xaf, 0x20, 0xe1, + 0x90, 0x40, 0x78, 0x04, 0xd0, 0xfc, 0x00, 0x40, 0x1f, 0x8a, 0x10, 0x78, + 0x1e, 0xaa, 0x70, 0x00, 0xa0, 0x86, 0x00, 0x00, 0x00, 0xc0, 0x1f, 0x8a, + 0x01, 0x7f, 0x78, 0x03, 0x00, 0x04, 0x78, 0x04, 0xd0, 0xac, 0x00, 0xc0, + 0x1f, 0xbd, 0x20, 0xe1, 0x90, 0x40, 0x78, 0x03, 0x00, 0x02, 0x70, 0x03, + 0x00, 0x00, 0x0e, 0x7f, 0x0f, 0x7f, 0x00, 0x7c, 0x02, 0x7e, 0x0c, 0x7e, + 0x0d, 0x7e, 0x0e, 0x7e, 0x0f, 0x7e, 0x20, 0x71, 0xaa, 0x08, 0x20, 0x79, + 0x00, 0x20, 0x70, 0x00, 0xa0, 0x86, 0x00, 0x00, 0x00, 0x40, 0x20, 0x03, + 0x70, 0x04, 0x20, 0x60, 0x60, 0x10, 0x20, 0x68, 0x10, 0x78, 0x8d, 0x16, + 0x00, 0x40, 0x1f, 0xed, 0x68, 0x50, 0xc0, 0xb5, 0x68, 0x52, 0x68, 0x0c, + 0x7a, 0x1c, 0xa2, 0x06, 0x00, 0xc0, 0x1f, 0xed, 0x68, 0x08, 0x7a, 0x18, + 0xa2, 0x06, 0x00, 0x40, 0x20, 0x09, 0x20, 0x01, 0x01, 0x05, 0x20, 0x03, + 0x00, 0x10, 0x20, 0xe1, 0x90, 0x40, 0x78, 0x03, 0x00, 0x04, 0x70, 0x03, + 0x00, 0x00, 0x70, 0x04, 0x20, 0x60, 0x10, 0x78, 0x8a, 0x11, 0x20, 0xe1, + 0x90, 0x40, 0x10, 0x78, 0x73, 0x8a, 0x20, 0x11, 0x00, 0x00, 0x10, 0x78, + 0x70, 0xea, 0x0f, 0x7f, 0x0e, 0x7f, 0x0d, 0x7f, 0x0c, 0x7f, 0x02, 0x7f, + 0x00, 0x7c, 0x68, 0x10, 0x6a, 0x14, 0xa2, 0x05, 0x00, 0xc0, 0x1f, 0xed, + 0x68, 0x4c, 0xc0, 0xdc, 0x68, 0x4e, 0x2c, 0x10, 0x10, 0x78, 0x1c, 0xf0, + 0x20, 0x01, 0x01, 0x05, 0x20, 0x03, 0x00, 0x10, 0x20, 0xe1, 0x90, 0x40, + 0x78, 0x03, 0x00, 0x04, 0x70, 0x03, 0x00, 0x00, 0x20, 0x69, 0xa9, 0xb1, + 0x68, 0x33, 0x00, 0x00, 0x68, 0x3f, 0x00, 0x00, 0x00, 0x78, 0x20, 0x03, + 0x88, 0x40, 0x28, 0x04, 0xa0, 0x05, 0x00, 0xc0, 0x20, 0x3a, 0x60, 0x04, + 0xa0, 0x05, 0x00, 0x40, 0x20, 0x3c, 0x68, 0x1a, 0x20, 0x60, 0x60, 0x34, + 0xa0, 0x84, 0x00, 0x0f, 0xa0, 0x80, 0x20, 0x6a, 0x20, 0x44, 0x88, 0xff, + 0x10, 0x40, 0x13, 0x32, 0x8a, 0x51, 0x00, 0x7c, 0x20, 0x51, 0x00, 0x00, + 0x00, 0x7c, 0x8a, 0x50, 0x88, 0x41, 0x28, 0x04, 0xa0, 0x05, 0x00, 0xc0, + 0x20, 0x59, 0x2c, 0x00, 0xad, 0x06, 0x00, 0x40, 0x20, 0x4e, 0x60, 0x00, + 0xa0, 0x05, 0x00, 0xc0, 0x20, 0x4e, 0x2d, 0x00, 0x20, 0x60, 0x68, 0x1a, + 0x60, 0x34, 0xa0, 0x84, 0x00, 0x0f, 0xa0, 0x80, 0x20, 0x7a, 0x20, 0x44, + 0x88, 0xff, 0x10, 0x40, 0x13, 0x32, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x11, + 0x00, 0x15, 0x00, 0x19, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x25, 0x00, 0x29, + 0x00, 0x00, 0x00, 0x0f, 0x00, 0x15, 0x00, 0x1b, 0x00, 0x21, 0x00, 0x27, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5f, 0x20, 0x5b, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x69, 0x00, 0x00, 0x20, 0x5f, 0x00, 0x00, 0x20, 0x66, + 0x20, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x69, 0x20, 0x66, + 0x00, 0x00, 0x20, 0x61, 0x20, 0x61, 0x00, 0x00, 0x00, 0x00, 0x20, 0x69, + 0x00, 0x00, 0x20, 0x61, 0x00, 0x00, 0x20, 0x67, 0x20, 0x67, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x69, 0x20, 0x67, 0x0a, 0x7e, 0x09, 0x7e, + 0x08, 0x7e, 0x6b, 0x2e, 0x6c, 0x2a, 0x68, 0x58, 0xa0, 0x55, 0x00, 0x40, + 0x21, 0x2d, 0x2d, 0x60, 0x60, 0x34, 0xa0, 0xcc, 0x00, 0x0f, 0xa9, 0xc0, + 0x20, 0x6a, 0xa9, 0x86, 0x00, 0x07, 0x00, 0x40, 0x20, 0xa5, 0xa9, 0x86, + 0x00, 0x0e, 0x00, 0x40, 0x20, 0xa5, 0xa9, 0x86, 0x00, 0x0f, 0x00, 0xc0, + 0x20, 0xa9, 0x60, 0x5c, 0xa4, 0x22, 0x60, 0x60, 0xa3, 0x1b, 0x28, 0x04, + 0xa0, 0x45, 0x00, 0xc0, 0x20, 0xb7, 0x00, 0x50, 0x20, 0xb1, 0x00, 0x78, + 0x21, 0x2d, 0x60, 0x04, 0xa0, 0x65, 0x00, 0x40, 0x21, 0x2d, 0x00, 0x78, + 0x20, 0x94, 0x28, 0x04, 0xa0, 0x05, 0x00, 0x40, 0x20, 0xd5, 0xac, 0x68, + 0xd9, 0x9c, 0x00, 0xc0, 0x20, 0xc5, 0x68, 0x08, 0xa4, 0x22, 0x68, 0x0c, + 0xa3, 0x1b, 0x00, 0x78, 0x20, 0xc9, 0x68, 0x10, 0xa4, 0x22, 0x68, 0x14, + 0xa3, 0x1b, 0x00, 0x48, 0x20, 0xf4, 0x23, 0x00, 0xa4, 0x05, 0x00, 0x40, + 0x20, 0xdb, 0x8a, 0x51, 0x00, 0x40, 0x21, 0x2d, 0x88, 0x40, 0x00, 0x78, + 0x20, 0xb7, 0x60, 0x04, 0xa0, 0x65, 0x00, 0x40, 0x21, 0x2d, 0x00, 0x78, + 0x20, 0x94, 0x8a, 0x51, 0x00, 0x40, 0x21, 0x2d, 0x88, 0x40, 0x28, 0x04, + 0xa0, 0x05, 0x00, 0xc0, 0x20, 0xee, 0x60, 0x04, 0xa0, 0x65, 0x00, 0x40, + 0x21, 0x2d, 0x60, 0x34, 0xa0, 0xcc, 0x00, 0x0f, 0xa9, 0xc0, 0x20, 0x6a, + 0x28, 0x04, 0x20, 0x40, 0x2b, 0x68, 0x68, 0x50, 0xc0, 0xfc, 0x68, 0x52, + 0x00, 0x78, 0x21, 0x21, 0x84, 0x22, 0x84, 0x20, 0x83, 0x1a, 0xa3, 0x99, + 0x00, 0x00, 0x0d, 0x7e, 0x2b, 0x68, 0x6c, 0x6e, 0x6b, 0x72, 0x0d, 0x7f, + 0xd9, 0x9c, 0x00, 0xc0, 0x21, 0x0f, 0x69, 0x08, 0x24, 0x00, 0xa1, 0x22, + 0x69, 0x0c, 0x23, 0x00, 0xa1, 0x1b, 0x10, 0x48, 0x13, 0x32, 0x68, 0x00, + 0xa4, 0x20, 0x68, 0x04, 0xa3, 0x19, 0x00, 0x78, 0x21, 0x1b, 0x69, 0x10, + 0x24, 0x00, 0xa1, 0x22, 0x69, 0x14, 0x23, 0x00, 0xa1, 0x1b, 0x10, 0x48, + 0x13, 0x32, 0x68, 0x00, 0xa4, 0x20, 0x68, 0x04, 0xa3, 0x19, 0x2b, 0x68, + 0x6c, 0x1e, 0x6b, 0x22, 0x68, 0x50, 0xc0, 0xfd, 0x68, 0x52, 0x2c, 0x00, + 0x68, 0x1a, 0x28, 0x00, 0x68, 0x32, 0x2a, 0x00, 0x68, 0x26, 0x00, 0x7f, + 0x00, 0x7f, 0x00, 0x7f, 0xa0, 0x06, 0x00, 0x78, 0x21, 0x32, 0x08, 0x7f, + 0x09, 0x7f, 0x0a, 0x7f, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x7c, 0x20, 0x01, + 0x00, 0x05, 0x20, 0x04, 0xa0, 0x84, 0x00, 0x07, 0x00, 0x79, 0x21, 0x3a, + 0x21, 0x42, 0x21, 0x43, 0x21, 0x46, 0x21, 0x49, 0x21, 0x4e, 0x21, 0x51, + 0x21, 0x56, 0x21, 0x5b, 0x00, 0x7c, 0x10, 0x78, 0x1e, 0xaa, 0x00, 0x7c, + 0x10, 0x78, 0x19, 0x13, 0x00, 0x7c, 0x10, 0x78, 0x19, 0x13, 0x10, 0x78, + 0x1e, 0xaa, 0x00, 0x7c, 0x10, 0x78, 0x14, 0xbe, 0x00, 0x7c, 0x10, 0x78, + 0x1e, 0xaa, 0x10, 0x78, 0x14, 0xbe, 0x00, 0x7c, 0x10, 0x78, 0x19, 0x13, + 0x10, 0x78, 0x14, 0xbe, 0x00, 0x7c, 0x10, 0x78, 0x19, 0x13, 0x10, 0x78, + 0x1e, 0xaa, 0x10, 0x78, 0x14, 0xbe, 0x00, 0x7c, 0x12, 0x7e, 0x20, 0x91, + 0x23, 0x00, 0x20, 0x79, 0x02, 0x00, 0x20, 0x71, 0xac, 0x80, 0x20, 0x69, + 0xa7, 0x00, 0x20, 0x09, 0x00, 0x04, 0x79, 0x12, 0x78, 0x17, 0x00, 0x04, + 0x10, 0x78, 0x25, 0x1f, 0x78, 0x1b, 0x00, 0x02, 0x20, 0xe1, 0x87, 0x00, + 0x12, 0x7f, 0x00, 0x7c, 0x12, 0x7e, 0x20, 0x91, 0x23, 0x00, 0x78, 0x1c, + 0xa0, 0x84, 0x00, 0x07, 0x00, 0x79, 0x21, 0x80, 0x21, 0xa4, 0x21, 0x88, + 0x21, 0x8c, 0x21, 0x90, 0x21, 0x96, 0x21, 0x9a, 0x21, 0x9e, 0x21, 0xa2, + 0x10, 0x78, 0x54, 0x8e, 0x00, 0x78, 0x21, 0xa4, 0x10, 0x78, 0x54, 0xda, + 0x00, 0x78, 0x21, 0xa4, 0x10, 0x78, 0x54, 0x8e, 0x10, 0x78, 0x54, 0xda, + 0x00, 0x78, 0x21, 0xa4, 0x10, 0x78, 0x21, 0xa6, 0x00, 0x78, 0x21, 0xa4, + 0x10, 0x78, 0x21, 0xa6, 0x00, 0x78, 0x21, 0xa4, 0x10, 0x78, 0x21, 0xa6, + 0x00, 0x78, 0x21, 0xa4, 0x10, 0x78, 0x21, 0xa6, 0x12, 0x7f, 0x00, 0x7c, + 0x00, 0x7e, 0x01, 0x7e, 0x02, 0x7e, 0x10, 0x78, 0xa5, 0xe2, 0x79, 0x30, + 0xa1, 0x84, 0x00, 0x03, 0x00, 0x40, 0x21, 0xc9, 0x20, 0x01, 0xa9, 0xc0, + 0x20, 0x04, 0xa0, 0x05, 0x00, 0x40, 0x21, 0xc5, 0x20, 0x01, 0x01, 0x33, + 0x20, 0x04, 0xa0, 0x05, 0x10, 0x40, 0x13, 0x32, 0x0c, 0x7e, 0x20, 0x01, + 0xa9, 0xc0, 0x20, 0x64, 0x10, 0x78, 0x8a, 0x11, 0x0c, 0x7f, 0x00, 0x78, + 0x21, 0xf2, 0x20, 0xe1, 0x90, 0x40, 0x00, 0x78, 0x21, 0xf2, 0xa1, 0x84, + 0x00, 0x30, 0x00, 0x40, 0x21, 0xda, 0x6a, 0x00, 0xa2, 0x86, 0x00, 0x03, + 0x00, 0xc0, 0x21, 0xd4, 0x00, 0x78, 0x21, 0xd6, 0x10, 0x78, 0x42, 0x24, + 0x20, 0xe1, 0x90, 0x10, 0x00, 0x78, 0x21, 0xf2, 0xa1, 0x84, 0x00, 0xc0, + 0x00, 0x40, 0x21, 0xec, 0x0e, 0x7e, 0x03, 0x7e, 0x04, 0x7e, 0x05, 0x7e, + 0x20, 0x71, 0xa9, 0xe7, 0x10, 0x78, 0x1a, 0xf4, 0x05, 0x7f, 0x04, 0x7f, + 0x03, 0x7f, 0x0e, 0x7f, 0x00, 0x78, 0x21, 0xf2, 0xa1, 0x84, 0x03, 0x00, + 0x00, 0x40, 0x21, 0xf2, 0x20, 0xe1, 0x90, 0x20, 0x79, 0x32, 0x02, 0x7f, + 0x01, 0x7f, 0x00, 0x7f, 0x00, 0x7c, 0x01, 0x7e, 0x0e, 0x7e, 0x0f, 0x7e, + 0x20, 0x71, 0xa7, 0x00, 0x71, 0x28, 0x20, 0x01, 0xa9, 0x90, 0x21, 0x02, + 0x20, 0x01, 0xa9, 0x98, 0x21, 0x02, 0xa1, 0x82, 0x02, 0x11, 0x00, 0xc8, + 0x22, 0x0b, 0x20, 0x09, 0x00, 0x08, 0x00, 0x78, 0x22, 0x35, 0xa1, 0x82, + 0x02, 0x59, 0x00, 0xc8, 0x22, 0x13, 0x20, 0x09, 0x00, 0x07, 0x00, 0x78, + 0x22, 0x35, 0xa1, 0x82, 0x02, 0xc1, 0x00, 0xc8, 0x22, 0x1b, 0x20, 0x09, + 0x00, 0x06, 0x00, 0x78, 0x22, 0x35, 0xa1, 0x82, 0x03, 0x49, 0x00, 0xc8, + 0x22, 0x23, 0x20, 0x09, 0x00, 0x05, 0x00, 0x78, 0x22, 0x35, 0xa1, 0x82, + 0x04, 0x21, 0x00, 0xc8, 0x22, 0x2b, 0x20, 0x09, 0x00, 0x04, 0x00, 0x78, + 0x22, 0x35, 0xa1, 0x82, 0x05, 0x81, 0x00, 0xc8, 0x22, 0x33, 0x20, 0x09, + 0x00, 0x03, 0x00, 0x78, 0x22, 0x35, 0x20, 0x09, 0x00, 0x02, 0x20, 0x79, + 0x02, 0x00, 0x79, 0x12, 0x78, 0x17, 0x00, 0x04, 0x10, 0x78, 0x25, 0x1f, + 0x0f, 0x7f, 0x0e, 0x7f, 0x01, 0x7f, 0x00, 0x7c, 0x12, 0x7e, 0x20, 0x91, + 0x22, 0x00, 0x20, 0x61, 0x01, 0x00, 0x20, 0x71, 0xa7, 0x00, 0x60, 0x24, + 0x60, 0x26, 0x60, 0x53, 0x00, 0x30, 0x60, 0x33, 0x00, 0xef, 0x60, 0xe7, + 0x00, 0x00, 0x60, 0xeb, 0x00, 0xef, 0x60, 0xe3, 0x00, 0x08, 0x60, 0x4b, + 0xf7, 0xf7, 0x60, 0x43, 0x00, 0x00, 0x60, 0x2f, 0x00, 0x80, 0x60, 0x2f, + 0x00, 0x00, 0x60, 0x07, 0x0e, 0xaf, 0x60, 0x0f, 0x00, 0xff, 0x60, 0x2b, + 0x00, 0x2f, 0x12, 0x7f, 0x00, 0x7c, 0x20, 0x01, 0xa7, 0x30, 0x20, 0x03, + 0x00, 0x00, 0x20, 0x01, 0xa7, 0x2f, 0x20, 0x03, 0x00, 0x01, 0x00, 0x7c, + 0x12, 0x7e, 0x20, 0x91, 0x22, 0x00, 0x00, 0x7e, 0x01, 0x7e, 0x02, 0x7e, + 0x61, 0x24, 0xa1, 0x84, 0x00, 0x2c, 0x00, 0xc0, 0x22, 0x7b, 0xa1, 0x84, + 0x00, 0x07, 0x00, 0x79, 0x22, 0x81, 0xa1, 0x95, 0x00, 0x04, 0xa2, 0x84, + 0x00, 0x07, 0x00, 0x79, 0x22, 0x81, 0x22, 0xad, 0x22, 0x89, 0x22, 0x8d, + 0x22, 0x91, 0x22, 0x97, 0x22, 0x9b, 0x22, 0xa1, 0x22, 0xa7, 0x10, 0x78, + 0x5c, 0x56, 0x00, 0x78, 0x22, 0xad, 0x10, 0x78, 0x5d, 0x45, 0x00, 0x78, + 0x22, 0xad, 0x10, 0x78, 0x5d, 0x45, 0x10, 0x78, 0x5c, 0x56, 0x00, 0x78, + 0x22, 0xad, 0x10, 0x78, 0x22, 0xb2, 0x00, 0x78, 0x22, 0xad, 0x10, 0x78, + 0x5c, 0x56, 0x10, 0x78, 0x22, 0xb2, 0x00, 0x78, 0x22, 0xad, 0x10, 0x78, + 0x5d, 0x45, 0x10, 0x78, 0x22, 0xb2, 0x00, 0x78, 0x22, 0xad, 0x10, 0x78, + 0x5d, 0x45, 0x10, 0x78, 0x5c, 0x56, 0x10, 0x78, 0x22, 0xb2, 0x02, 0x7f, + 0x01, 0x7f, 0x00, 0x7f, 0x12, 0x7f, 0x00, 0x7c, 0x61, 0x24, 0xd1, 0xac, + 0x00, 0x40, 0x23, 0xac, 0x01, 0x7e, 0x04, 0x7e, 0x0c, 0x7e, 0x64, 0x4c, + 0xa4, 0x86, 0xf0, 0xf0, 0x00, 0xc0, 0x22, 0xc5, 0x20, 0x61, 0x01, 0x00, + 0x64, 0x4a, 0x60, 0x43, 0x00, 0x90, 0x60, 0x43, 0x00, 0x10, 0x74, 0xc6, + 0xa4, 0x8c, 0xff, 0x00, 0x70, 0x34, 0xd0, 0x84, 0x00, 0x40, 0x22, 0xdd, + 0xa1, 0x86, 0xf8, 0x00, 0x00, 0xc0, 0x22, 0xdd, 0x70, 0x3c, 0xd0, 0x84, + 0x00, 0xc0, 0x22, 0xdd, 0xc0, 0x85, 0x70, 0x3e, 0x03, 0x7e, 0x24, 0x18, + 0x20, 0x11, 0x80, 0x16, 0x10, 0x78, 0x36, 0x1b, 0x03, 0x7f, 0xa1, 0x96, + 0xff, 0x00, 0x00, 0x40, 0x23, 0x1f, 0x60, 0x30, 0xa0, 0x84, 0x00, 0xff, + 0x81, 0x0f, 0xa1, 0x16, 0x00, 0x40, 0x23, 0x1f, 0x71, 0x30, 0xd1, 0x84, + 0x00, 0xc0, 0x23, 0x1f, 0x20, 0x11, 0xa7, 0x53, 0x22, 0x14, 0xd2, 0xec, + 0x00, 0x40, 0x22, 0xfa, 0xc1, 0x8d, 0x71, 0x32, 0x20, 0x11, 0xa7, 0x53, + 0x22, 0x14, 0xd2, 0xac, 0x00, 0xc0, 0x23, 0x1f, 0x62, 0x40, 0xa2, 0x94, + 0x00, 0x10, 0x00, 0x40, 0x23, 0x06, 0x62, 0x48, 0xa2, 0x94, 0xff, 0x00, + 0xa2, 0x96, 0xff, 0x00, 0x00, 0x40, 0x23, 0x1f, 0x70, 0x30, 0xd0, 0x8c, + 0x00, 0x40, 0x23, 0x71, 0x70, 0x34, 0xd0, 0x8c, 0x00, 0xc0, 0x23, 0x16, + 0x20, 0x01, 0xa7, 0x0c, 0x20, 0x0c, 0xd1, 0xac, 0x00, 0xc0, 0x23, 0x71, + 0xc1, 0xad, 0x21, 0x02, 0x03, 0x7e, 0x73, 0xc4, 0x20, 0x11, 0x80, 0x13, + 0x10, 0x78, 0x36, 0x1b, 0x03, 0x7f, 0x00, 0x78, 0x23, 0x71, 0x70, 0x34, + 0xd0, 0x8c, 0x00, 0xc0, 0x23, 0x2b, 0x20, 0x01, 0xa7, 0x0c, 0x20, 0x0c, + 0xd1, 0xac, 0x00, 0xc0, 0x23, 0x71, 0xc1, 0xad, 0x21, 0x02, 0x03, 0x7e, + 0x73, 0xc4, 0x20, 0x11, 0x80, 0x13, 0x10, 0x78, 0x36, 0x1b, 0x03, 0x7f, + 0x71, 0x30, 0xc1, 0x85, 0x71, 0x32, 0x20, 0x11, 0xa7, 0x53, 0x22, 0x0c, + 0xd1, 0xa4, 0x00, 0x40, 0x23, 0x55, 0x01, 0x7e, 0x20, 0x09, 0x00, 0x01, + 0x20, 0x11, 0x01, 0x00, 0x10, 0x78, 0x5b, 0xf1, 0x20, 0x19, 0x00, 0x0e, + 0x10, 0x78, 0xa1, 0xa5, 0xa4, 0x84, 0x00, 0xff, 0xa0, 0x80, 0x29, 0xc0, + 0x20, 0x0c, 0xa1, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0x81, 0x27, 0xa0, 0x06, + 0x20, 0x09, 0x00, 0x0e, 0x10, 0x78, 0xa2, 0x2d, 0x01, 0x7f, 0xd1, 0xac, + 0x00, 0xc0, 0x23, 0x62, 0x01, 0x7e, 0x20, 0x09, 0x00, 0x00, 0x20, 0x19, + 0x00, 0x04, 0x10, 0x78, 0x28, 0x4f, 0x01, 0x7f, 0x00, 0x78, 0x23, 0x71, + 0x15, 0x7e, 0x20, 0xa9, 0x00, 0x7f, 0x20, 0x09, 0x00, 0x00, 0x10, 0x78, + 0x45, 0xc4, 0x00, 0xc0, 0x23, 0x6d, 0x10, 0x78, 0x42, 0xf8, 0x81, 0x08, + 0x00, 0xf0, 0x23, 0x67, 0x15, 0x7f, 0x0c, 0x7f, 0x04, 0x7f, 0x0f, 0x7e, + 0x20, 0x79, 0xa9, 0xc4, 0x78, 0x3c, 0xa0, 0x86, 0x00, 0x00, 0x00, 0x40, + 0x23, 0x83, 0x60, 0x27, 0x00, 0x04, 0x78, 0x3f, 0x00, 0x00, 0x20, 0x79, + 0x01, 0x40, 0x78, 0x03, 0x00, 0x00, 0x0f, 0x7f, 0x20, 0x11, 0x00, 0x03, + 0x10, 0x78, 0x70, 0xe0, 0x20, 0x11, 0x00, 0x02, 0x10, 0x78, 0x70, 0xea, + 0x10, 0x78, 0x6f, 0xc4, 0x03, 0x7e, 0x20, 0x19, 0x00, 0x00, 0x10, 0x78, + 0x70, 0x58, 0x03, 0x7f, 0x60, 0xe3, 0x00, 0x00, 0x01, 0x7f, 0x20, 0x01, + 0xa7, 0x00, 0x20, 0x14, 0xa2, 0x96, 0x00, 0x04, 0x00, 0xc0, 0x23, 0xa4, + 0xd1, 0x9c, 0x00, 0xc0, 0x23, 0xac, 0x62, 0x28, 0xc2, 0x9d, 0x62, 0x2a, + 0x20, 0x03, 0x00, 0x01, 0x20, 0x01, 0xa7, 0x22, 0x20, 0x03, 0x00, 0x00, + 0x60, 0x27, 0x00, 0x20, 0xd1, 0x94, 0x00, 0x40, 0x24, 0x90, 0x0f, 0x7e, + 0x20, 0x79, 0xa9, 0xc4, 0x78, 0x3c, 0xa0, 0x86, 0x00, 0x01, 0x00, 0xc0, + 0x23, 0xd0, 0x01, 0x7e, 0x60, 0x27, 0x00, 0x04, 0x78, 0x3f, 0x00, 0x00, + 0x20, 0x79, 0x01, 0x40, 0x78, 0x03, 0x10, 0x00, 0x78, 0x03, 0x00, 0x00, + 0x20, 0x79, 0xa9, 0xb1, 0x78, 0x07, 0x00, 0x00, 0x78, 0x33, 0x00, 0x00, + 0x10, 0x78, 0x62, 0xd1, 0x10, 0x78, 0x63, 0x9b, 0x01, 0x7f, 0x0f, 0x7f, + 0x00, 0x78, 0x24, 0x90, 0x0f, 0x7f, 0x01, 0x7e, 0x39, 0x00, 0xa0, 0x82, + 0xaa, 0xe3, 0x00, 0xc8, 0x23, 0xdb, 0x01, 0x7e, 0x10, 0x78, 0x74, 0x7a, + 0x01, 0x7f, 0x62, 0x20, 0xd2, 0xb4, 0x00, 0x40, 0x24, 0x46, 0x10, 0x78, + 0x5a, 0xcb, 0x10, 0x78, 0x6e, 0x0f, 0x60, 0x27, 0x00, 0x04, 0x0f, 0x7e, + 0x20, 0x19, 0xa9, 0xba, 0x23, 0x04, 0xa0, 0x7d, 0x00, 0x40, 0x24, 0x1c, + 0x78, 0x04, 0xa0, 0x86, 0x00, 0x32, 0x00, 0xc0, 0x24, 0x1c, 0x0d, 0x7e, + 0x0c, 0x7e, 0x0e, 0x7e, 0x20, 0x69, 0x01, 0x40, 0x61, 0x8c, 0x62, 0x88, + 0x78, 0x18, 0x60, 0x8e, 0x78, 0x08, 0x60, 0x8a, 0x60, 0x43, 0x00, 0x02, + 0x20, 0x01, 0x00, 0x03, 0x80, 0x01, 0x00, 0xc0, 0x24, 0x00, 0x60, 0x43, + 0x00, 0x00, 0x68, 0x03, 0x10, 0x00, 0x68, 0x03, 0x00, 0x00, 0x61, 0x8e, + 0x62, 0x8a, 0x10, 0x78, 0x61, 0xcd, 0x10, 0x78, 0x62, 0xd1, 0x78, 0x10, + 0x20, 0x70, 0x70, 0x37, 0x01, 0x03, 0x2f, 0x60, 0x10, 0x78, 0x77, 0x2d, + 0x0e, 0x7f, 0x0c, 0x7f, 0x0d, 0x7f, 0x0f, 0x7f, 0x01, 0x7f, 0x00, 0x7c, + 0x0f, 0x7f, 0x0d, 0x7e, 0x20, 0x69, 0x01, 0x40, 0x68, 0x04, 0xa0, 0x84, + 0x40, 0x00, 0x00, 0x40, 0x24, 0x29, 0x68, 0x03, 0x10, 0x00, 0x68, 0x03, + 0x00, 0x00, 0x0d, 0x7f, 0x0c, 0x7e, 0x20, 0x61, 0xa9, 0xb1, 0x60, 0x28, + 0xa0, 0x9a, 0x00, 0xc8, 0x00, 0xc8, 0x24, 0x39, 0x80, 0x00, 0x60, 0x2a, + 0x0c, 0x7f, 0x10, 0x78, 0x6e, 0x01, 0x00, 0x78, 0x24, 0x8f, 0x20, 0x19, + 0xa9, 0xba, 0x23, 0x04, 0xa0, 0x65, 0x00, 0x40, 0x24, 0x43, 0x20, 0x09, + 0x00, 0x27, 0x10, 0x78, 0x77, 0x5c, 0x0c, 0x7f, 0x00, 0x78, 0x24, 0x8f, + 0xd2, 0xbc, 0x00, 0x40, 0x24, 0x8f, 0x10, 0x78, 0x5a, 0xd8, 0x60, 0x17, + 0x00, 0x10, 0x60, 0x27, 0x00, 0x04, 0x0d, 0x7e, 0x20, 0x69, 0x01, 0x40, + 0x68, 0x04, 0xa0, 0x84, 0x40, 0x00, 0x00, 0x40, 0x24, 0x5b, 0x68, 0x03, + 0x10, 0x00, 0x68, 0x03, 0x00, 0x00, 0x0d, 0x7f, 0x0c, 0x7e, 0x20, 0x61, + 0xa9, 0xb1, 0x60, 0x44, 0xa0, 0x9a, 0x00, 0xc8, 0x00, 0xc8, 0x24, 0x7e, + 0x80, 0x00, 0x60, 0x46, 0x60, 0x3c, 0x0c, 0x7f, 0xa0, 0x05, 0x00, 0x40, + 0x24, 0x8f, 0x20, 0x09, 0x07, 0xd0, 0x10, 0x78, 0x5a, 0xd0, 0xa0, 0x80, + 0x00, 0x07, 0x20, 0x04, 0xa0, 0x86, 0x00, 0x06, 0x00, 0xc0, 0x24, 0x7a, + 0x60, 0x17, 0x00, 0x12, 0x00, 0x78, 0x24, 0x8f, 0x60, 0x17, 0x00, 0x16, + 0x00, 0x78, 0x24, 0x8f, 0x03, 0x7e, 0x20, 0x19, 0x00, 0x01, 0x10, 0x78, + 0x70, 0x58, 0x03, 0x7f, 0x20, 0x19, 0xa9, 0xc0, 0x23, 0x04, 0xa0, 0x65, + 0x00, 0x40, 0x24, 0x8e, 0x20, 0x09, 0x00, 0x4f, 0x10, 0x78, 0x77, 0x5c, + 0x0c, 0x7f, 0x01, 0x7f, 0xd1, 0x9c, 0x00, 0x40, 0x24, 0xe4, 0x70, 0x34, + 0xd0, 0xac, 0x00, 0xc0, 0x24, 0xc1, 0x01, 0x7e, 0x15, 0x7e, 0x60, 0x27, + 0x00, 0x08, 0x60, 0x2f, 0x00, 0x20, 0x20, 0xa9, 0x00, 0x0a, 0x00, 0xf0, + 0x24, 0x9f, 0x60, 0x2f, 0x00, 0x00, 0x61, 0x50, 0xa1, 0x85, 0x14, 0x00, + 0x60, 0x52, 0x20, 0xa9, 0x03, 0x20, 0x00, 0xe0, 0x24, 0xa9, 0x20, 0x91, + 0x60, 0x00, 0x60, 0x20, 0xd0, 0x9c, 0x00, 0xc0, 0x24, 0xb8, 0x15, 0x7f, + 0x61, 0x52, 0x01, 0x7f, 0x60, 0x27, 0x00, 0x08, 0x00, 0x78, 0x24, 0xe4, + 0x10, 0x78, 0x25, 0x77, 0x00, 0xf0, 0x24, 0xa9, 0x15, 0x7f, 0x61, 0x52, + 0x01, 0x7f, 0x60, 0x27, 0x00, 0x08, 0x01, 0x7e, 0x60, 0x28, 0xc0, 0x9c, + 0x60, 0x2a, 0x20, 0x11, 0x00, 0x03, 0x10, 0x78, 0x70, 0xe0, 0x20, 0x11, + 0x00, 0x02, 0x10, 0x78, 0x70, 0xea, 0x10, 0x78, 0x6f, 0xc4, 0x03, 0x7e, + 0x20, 0x19, 0x00, 0x00, 0x10, 0x78, 0x70, 0x58, 0x03, 0x7f, 0x60, 0xe3, + 0x00, 0x00, 0x10, 0x78, 0xa5, 0xbd, 0x10, 0x78, 0xa5, 0xdb, 0x20, 0x01, + 0xa7, 0x00, 0x20, 0x03, 0x00, 0x04, 0x60, 0x27, 0x00, 0x08, 0x10, 0x78, + 0x12, 0x46, 0x01, 0x7f, 0xa1, 0x8c, 0xff, 0xd0, 0x61, 0x26, 0x00, 0x7c, + 0x00, 0x7e, 0x01, 0x7e, 0x02, 0x7e, 0x0e, 0x7e, 0x0f, 0x7e, 0x12, 0x7e, + 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0xa7, 0x00, 0x71, 0xbc, 0x70, 0xbe, + 0xa1, 0x16, 0x00, 0x40, 0x25, 0x18, 0x81, 0xff, 0x00, 0x40, 0x25, 0x00, + 0x20, 0x11, 0x80, 0x11, 0x10, 0x78, 0x36, 0x1b, 0x00, 0x78, 0x25, 0x18, + 0x20, 0x11, 0x80, 0x12, 0x10, 0x78, 0x36, 0x1b, 0x20, 0x01, 0xa7, 0x72, + 0x20, 0x04, 0xd0, 0xfc, 0x00, 0xc0, 0x25, 0x18, 0x03, 0x7e, 0x0c, 0x7e, + 0x10, 0x78, 0x6f, 0x9f, 0x20, 0x61, 0x01, 0x00, 0x20, 0x19, 0x00, 0x28, + 0x20, 0x09, 0x00, 0x00, 0x10, 0x78, 0x28, 0x4f, 0x0c, 0x7f, 0x03, 0x7f, + 0x12, 0x7f, 0x0f, 0x7f, 0x0e, 0x7f, 0x02, 0x7f, 0x01, 0x7f, 0x00, 0x7f, + 0x00, 0x7c, 0x0c, 0x7e, 0x0f, 0x7e, 0x00, 0x7e, 0x02, 0x7e, 0x20, 0x61, + 0x01, 0x00, 0xa1, 0x90, 0x25, 0x3b, 0x22, 0x04, 0x60, 0xf2, 0x20, 0x11, + 0x25, 0x48, 0x60, 0x00, 0xa0, 0x82, 0x00, 0x03, 0x00, 0xc8, 0x25, 0x34, + 0x20, 0x01, 0x00, 0xff, 0x00, 0x78, 0x25, 0x35, 0x22, 0x04, 0x60, 0xee, + 0x02, 0x7f, 0x00, 0x7f, 0x0f, 0x7f, 0x0c, 0x7f, 0x00, 0x7c, 0x08, 0x40, + 0x08, 0x40, 0x08, 0x40, 0x05, 0x80, 0x04, 0x20, 0x03, 0x48, 0x02, 0xc0, + 0x02, 0x58, 0x02, 0x10, 0x01, 0xa8, 0x01, 0xa8, 0x01, 0xa8, 0x01, 0xa8, + 0x01, 0x40, 0x00, 0xf8, 0x00, 0xd0, 0x00, 0xb0, 0x00, 0xa0, 0x20, 0x28, + 0xa1, 0x8c, 0x00, 0xff, 0x21, 0x30, 0xa0, 0x94, 0xff, 0x00, 0x00, 0xc0, + 0x25, 0x58, 0x81, 0xff, 0x00, 0x40, 0x25, 0x5c, 0x10, 0x78, 0x57, 0x61, + 0x00, 0x78, 0x25, 0x63, 0xa0, 0x80, 0x29, 0xc0, 0x20, 0x0c, 0xa1, 0x8c, + 0xff, 0x00, 0x81, 0x0f, 0xa0, 0x06, 0x00, 0x7c, 0xa0, 0x80, 0x29, 0xc0, + 0x20, 0x0c, 0xa1, 0x8c, 0x00, 0xff, 0x00, 0x7c, 0x0c, 0x7e, 0x20, 0x61, + 0xa7, 0x00, 0x60, 0x30, 0x00, 0x40, 0x25, 0x73, 0xc0, 0x9d, 0x00, 0x78, + 0x25, 0x74, 0xc0, 0x9c, 0x60, 0x32, 0x0c, 0x7f, 0x00, 0x7c, 0x00, 0x7e, + 0x15, 0x7e, 0x0f, 0x7e, 0x20, 0x79, 0x01, 0x00, 0x20, 0xa9, 0x00, 0x0a, + 0x78, 0x54, 0xd0, 0x8c, 0x00, 0xc0, 0x25, 0x84, 0x00, 0xf0, 0x25, 0x7e, + 0x0f, 0x7f, 0x15, 0x7f, 0x00, 0x7f, 0x00, 0x7c, 0x0c, 0x7e, 0x00, 0x7e, + 0x20, 0x61, 0x01, 0x00, 0x60, 0x30, 0x00, 0x7e, 0x60, 0x48, 0x00, 0x7e, + 0x60, 0xe4, 0x00, 0x7e, 0x60, 0xe8, 0x00, 0x7e, 0x60, 0x50, 0x00, 0x7e, + 0x60, 0xf0, 0x00, 0x7e, 0x60, 0xec, 0x00, 0x7e, 0x60, 0x0c, 0x00, 0x7e, + 0x60, 0x04, 0x00, 0x7e, 0x60, 0x28, 0x00, 0x7e, 0x60, 0xe0, 0x00, 0x7e, + 0x60, 0x2f, 0x01, 0x00, 0x60, 0x2f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, + 0x00, 0x05, 0x00, 0x05, 0x60, 0x2f, 0x00, 0x40, 0x60, 0x2f, 0x00, 0x00, + 0x00, 0x7f, 0x60, 0xe2, 0x00, 0x7f, 0x60, 0x2a, 0x00, 0x7f, 0x60, 0x06, + 0x00, 0x7f, 0x60, 0x0e, 0x00, 0x7f, 0x60, 0xee, 0x00, 0x7f, 0x60, 0xf2, + 0x00, 0x7f, 0x60, 0x52, 0x00, 0x7f, 0x60, 0xea, 0x00, 0x7f, 0x60, 0xe6, + 0x00, 0x7f, 0x60, 0x4a, 0x00, 0x7f, 0x60, 0x32, 0x00, 0x7f, 0x0c, 0x7f, + 0x00, 0x7c, 0x25, 0xe7, 0x25, 0xeb, 0x25, 0xef, 0x25, 0xf5, 0x25, 0xfb, + 0x26, 0x01, 0x26, 0x07, 0x26, 0x0f, 0x26, 0x17, 0x26, 0x1d, 0x26, 0x23, + 0x26, 0x2b, 0x26, 0x33, 0x26, 0x3b, 0x26, 0x43, 0x26, 0x4d, 0x26, 0x57, + 0x26, 0x57, 0x26, 0x57, 0x26, 0x57, 0x26, 0x57, 0x26, 0x57, 0x26, 0x57, + 0x26, 0x57, 0x26, 0x57, 0x26, 0x57, 0x26, 0x57, 0x26, 0x57, 0x26, 0x57, + 0x26, 0x57, 0x26, 0x57, 0x26, 0x57, 0x10, 0x7e, 0x00, 0x7e, 0x00, 0x78, + 0x26, 0x70, 0x10, 0x7e, 0x00, 0x7e, 0x00, 0x78, 0x26, 0x70, 0x10, 0x7e, + 0x00, 0x7e, 0x10, 0x78, 0x22, 0x6c, 0x00, 0x78, 0x26, 0x70, 0x10, 0x7e, + 0x00, 0x7e, 0x10, 0x78, 0x22, 0x6c, 0x00, 0x78, 0x26, 0x70, 0x10, 0x7e, + 0x00, 0x7e, 0x10, 0x78, 0x21, 0x33, 0x00, 0x78, 0x26, 0x70, 0x10, 0x7e, + 0x00, 0x7e, 0x10, 0x78, 0x21, 0x33, 0x00, 0x78, 0x26, 0x70, 0x10, 0x7e, + 0x00, 0x7e, 0x10, 0x78, 0x22, 0x6c, 0x10, 0x78, 0x21, 0x33, 0x00, 0x78, + 0x26, 0x70, 0x10, 0x7e, 0x00, 0x7e, 0x10, 0x78, 0x22, 0x6c, 0x10, 0x78, + 0x21, 0x33, 0x00, 0x78, 0x26, 0x70, 0x10, 0x7e, 0x00, 0x7e, 0x10, 0x78, + 0x21, 0x78, 0x00, 0x78, 0x26, 0x70, 0x10, 0x7e, 0x00, 0x7e, 0x10, 0x78, + 0x21, 0x78, 0x00, 0x78, 0x26, 0x70, 0x10, 0x7e, 0x00, 0x7e, 0x10, 0x78, + 0x22, 0x6c, 0x10, 0x78, 0x21, 0x78, 0x00, 0x78, 0x26, 0x70, 0x10, 0x7e, + 0x00, 0x7e, 0x10, 0x78, 0x22, 0x6c, 0x10, 0x78, 0x21, 0x78, 0x00, 0x78, + 0x26, 0x70, 0x10, 0x7e, 0x00, 0x7e, 0x10, 0x78, 0x21, 0x33, 0x10, 0x78, + 0x21, 0x78, 0x00, 0x78, 0x26, 0x70, 0x10, 0x7e, 0x00, 0x7e, 0x10, 0x78, + 0x21, 0x33, 0x10, 0x78, 0x21, 0x78, 0x00, 0x78, 0x26, 0x70, 0x10, 0x7e, + 0x00, 0x7e, 0x10, 0x78, 0x22, 0x6c, 0x10, 0x78, 0x21, 0x33, 0x10, 0x78, + 0x21, 0x78, 0x00, 0x78, 0x26, 0x70, 0x10, 0x7e, 0x00, 0x7e, 0x10, 0x78, + 0x22, 0x6c, 0x10, 0x78, 0x21, 0x33, 0x10, 0x78, 0x21, 0x78, 0x00, 0x78, + 0x26, 0x70, 0x00, 0x05, 0x00, 0x78, 0x26, 0x57, 0xb0, 0x84, 0x00, 0x3c, + 0x80, 0x04, 0x80, 0x04, 0x00, 0x79, 0x26, 0x60, 0x26, 0x70, 0x25, 0xed, + 0x25, 0xf1, 0x25, 0xf7, 0x25, 0xfd, 0x26, 0x03, 0x26, 0x09, 0x26, 0x11, + 0x26, 0x19, 0x26, 0x1f, 0x26, 0x25, 0x26, 0x2d, 0x26, 0x35, 0x26, 0x3d, + 0x26, 0x45, 0x26, 0x4f, 0x00, 0x08, 0x26, 0x5a, 0x00, 0x7f, 0x10, 0x7f, + 0x20, 0x91, 0x80, 0x01, 0x00, 0x7c, 0x0c, 0x7e, 0x02, 0x7e, 0x04, 0x7e, + 0x20, 0x21, 0x00, 0x00, 0x10, 0x78, 0x49, 0x67, 0x00, 0xc0, 0x27, 0x72, + 0x70, 0xcc, 0xd0, 0x9c, 0x00, 0x40, 0x26, 0x8e, 0xd0, 0x84, 0x00, 0xc0, + 0x26, 0x8e, 0xd0, 0xbc, 0x00, 0xc0, 0x27, 0x72, 0x10, 0x78, 0x27, 0x76, + 0x00, 0x78, 0x27, 0x72, 0xd0, 0xcc, 0x00, 0xc0, 0x27, 0x72, 0xd0, 0x94, + 0x00, 0x40, 0x26, 0x98, 0x70, 0x97, 0xff, 0xff, 0x00, 0x78, 0x27, 0x72, + 0x20, 0x01, 0x01, 0x0c, 0x20, 0x3c, 0x72, 0x84, 0xd2, 0x84, 0x00, 0x40, + 0x27, 0x01, 0xd2, 0x8c, 0x00, 0xc0, 0x27, 0x01, 0x03, 0x7e, 0x73, 0x94, + 0xa3, 0x8e, 0xff, 0xff, 0x00, 0x40, 0x26, 0xab, 0x83, 0xff, 0x00, 0xc0, + 0x26, 0xad, 0x20, 0x19, 0x00, 0x01, 0x83, 0x14, 0xa2, 0xe0, 0xad, 0xc0, + 0x2c, 0x04, 0xa3, 0x8c, 0x00, 0x01, 0x00, 0x40, 0x26, 0xba, 0xa0, 0x84, + 0xff, 0x00, 0x80, 0x07, 0x00, 0x78, 0x26, 0xbc, 0xa0, 0x84, 0x00, 0xff, + 0xa7, 0x0e, 0x00, 0x40, 0x26, 0xf6, 0xa0, 0x8e, 0x00, 0x00, 0x00, 0x40, + 0x26, 0xf6, 0xa0, 0x8e, 0x00, 0xff, 0x00, 0xc0, 0x26, 0xd3, 0x72, 0x30, + 0xd2, 0x84, 0x00, 0xc0, 0x26, 0xfc, 0x72, 0x84, 0xc2, 0x8d, 0x72, 0x86, + 0x70, 0x97, 0xff, 0xff, 0x03, 0x7f, 0x00, 0x78, 0x27, 0x01, 0x20, 0x09, + 0x00, 0x00, 0x10, 0x78, 0x25, 0x4d, 0x10, 0x78, 0x45, 0x5c, 0x00, 0xc0, + 0x26, 0xf9, 0x60, 0x04, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, 0x00, 0x06, + 0x00, 0xc0, 0x26, 0xf0, 0x70, 0x30, 0xd0, 0x8c, 0x00, 0x40, 0x26, 0xea, + 0x60, 0x00, 0xd0, 0xbc, 0x00, 0x40, 0x26, 0xf0, 0x10, 0x78, 0x27, 0x8c, + 0x00, 0x40, 0x26, 0xf9, 0x00, 0x78, 0x26, 0xf6, 0x10, 0x78, 0x28, 0xc4, + 0x10, 0x78, 0x27, 0xb9, 0x00, 0x40, 0x26, 0xf9, 0x83, 0x18, 0x00, 0x78, + 0x26, 0xad, 0x73, 0x96, 0x00, 0x78, 0x26, 0xfe, 0x70, 0x97, 0xff, 0xff, + 0x03, 0x7f, 0x00, 0x78, 0x27, 0x72, 0xa7, 0x80, 0x29, 0xc0, 0x20, 0x3c, + 0xa7, 0xbc, 0xff, 0x00, 0x87, 0x3f, 0x20, 0x41, 0x00, 0x7e, 0x70, 0x94, + 0xa0, 0x96, 0xff, 0xff, 0x00, 0xc0, 0x27, 0x13, 0x20, 0x09, 0x00, 0x00, + 0x28, 0xa8, 0x00, 0x78, 0x27, 0x1f, 0xa8, 0x12, 0x00, 0x48, 0x27, 0x1b, + 0x20, 0x08, 0xa8, 0x02, 0x20, 0xa8, 0x00, 0x78, 0x27, 0x1f, 0x70, 0x97, + 0xff, 0xff, 0x00, 0x78, 0x27, 0x72, 0x27, 0x00, 0x15, 0x7e, 0x01, 0x7e, + 0xa1, 0x06, 0x00, 0x40, 0x27, 0x66, 0xc4, 0x84, 0x10, 0x78, 0x45, 0xc4, + 0x00, 0x40, 0x27, 0x30, 0x10, 0x78, 0x45, 0x5c, 0x00, 0xc0, 0x27, 0x6f, + 0x00, 0x78, 0x27, 0x31, 0xc4, 0x85, 0x60, 0x04, 0xa0, 0x84, 0x00, 0xff, + 0xa0, 0x86, 0x00, 0x06, 0x00, 0xc0, 0x27, 0x40, 0x70, 0x30, 0xd0, 0x8c, + 0x00, 0x40, 0x27, 0x5e, 0x60, 0x00, 0xd0, 0xbc, 0x00, 0xc0, 0x27, 0x5e, + 0x72, 0x84, 0xd2, 0x8c, 0x00, 0x40, 0x27, 0x56, 0x60, 0x04, 0xa0, 0x84, + 0x00, 0xff, 0xa0, 0x82, 0x00, 0x06, 0x00, 0x48, 0x27, 0x66, 0xd4, 0x84, + 0x00, 0xc0, 0x27, 0x52, 0x10, 0x78, 0x45, 0x7f, 0x00, 0x78, 0x27, 0x54, + 0x10, 0x78, 0x29, 0x8e, 0x00, 0x78, 0x27, 0x66, 0x10, 0x78, 0x28, 0xc4, + 0x10, 0x78, 0x27, 0xb9, 0x00, 0x40, 0x27, 0x6f, 0x00, 0x78, 0x27, 0x66, + 0x10, 0x78, 0x29, 0x59, 0x00, 0x40, 0x27, 0x66, 0x10, 0x78, 0x27, 0x8c, + 0x00, 0x40, 0x27, 0x6f, 0x01, 0x7f, 0x81, 0x08, 0x15, 0x7f, 0x00, 0xf0, + 0x27, 0x1f, 0x70, 0x97, 0xff, 0xff, 0x00, 0x78, 0x27, 0x72, 0x01, 0x7f, + 0x15, 0x7f, 0x71, 0x96, 0x04, 0x7f, 0x02, 0x7f, 0x0c, 0x7f, 0x00, 0x7c, + 0x0c, 0x7e, 0x01, 0x7e, 0x70, 0x97, 0x00, 0x01, 0x20, 0x09, 0x00, 0x7e, + 0x10, 0x78, 0x45, 0x5c, 0x00, 0xc0, 0x27, 0x89, 0x10, 0x78, 0x28, 0xc4, + 0x10, 0x78, 0x27, 0xb9, 0x00, 0x40, 0x27, 0x89, 0x70, 0xcc, 0xc0, 0xbd, + 0x70, 0xce, 0x01, 0x7f, 0x0c, 0x7f, 0x00, 0x7c, 0x01, 0x7e, 0x07, 0x7e, + 0x0d, 0x7e, 0x0c, 0x7e, 0x2c, 0x68, 0x20, 0x01, 0xa7, 0x57, 0x20, 0x04, + 0xa0, 0x84, 0x00, 0xff, 0x68, 0x42, 0x10, 0x78, 0x76, 0xc7, 0x00, 0x40, + 0x27, 0xb4, 0x2d, 0x00, 0x60, 0x1a, 0x60, 0x1f, 0x00, 0x01, 0x20, 0x01, + 0x00, 0x00, 0x10, 0x78, 0x44, 0xee, 0x20, 0x01, 0x00, 0x00, 0x10, 0x78, + 0x45, 0x02, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x70, 0x90, 0x80, 0x00, + 0x70, 0x92, 0x12, 0x7f, 0x20, 0x09, 0x00, 0x04, 0x10, 0x78, 0x77, 0x5c, + 0xa0, 0x85, 0x00, 0x01, 0x0c, 0x7f, 0x0d, 0x7f, 0x07, 0x7f, 0x01, 0x7f, + 0x00, 0x7c, 0x01, 0x7e, 0x07, 0x7e, 0x0d, 0x7e, 0x0c, 0x7e, 0x2c, 0x68, + 0x20, 0x01, 0xa7, 0x57, 0x20, 0x04, 0xa0, 0x84, 0x00, 0xff, 0x68, 0x42, + 0x10, 0x78, 0x91, 0x97, 0x00, 0x40, 0x27, 0xf2, 0x2d, 0x00, 0x60, 0x1a, + 0x68, 0x00, 0xc0, 0xc4, 0x68, 0x02, 0x68, 0xa0, 0xa0, 0x86, 0x00, 0x7e, + 0x00, 0x40, 0x27, 0xdb, 0x68, 0x04, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, + 0x00, 0x06, 0x00, 0xc0, 0x27, 0xdb, 0x10, 0x78, 0x28, 0x80, 0x60, 0x1f, + 0x00, 0x01, 0x20, 0x01, 0x00, 0x00, 0x10, 0x78, 0x44, 0xee, 0x20, 0x01, + 0x00, 0x02, 0x10, 0x78, 0x45, 0x02, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, + 0x70, 0x90, 0x80, 0x00, 0x70, 0x92, 0x12, 0x7f, 0x20, 0x09, 0x00, 0x02, + 0x10, 0x78, 0x77, 0x5c, 0xa0, 0x85, 0x00, 0x01, 0x0c, 0x7f, 0x0d, 0x7f, + 0x07, 0x7f, 0x01, 0x7f, 0x00, 0x7c, 0x0c, 0x7e, 0x02, 0x7e, 0x20, 0x09, + 0x00, 0x80, 0x10, 0x78, 0x45, 0x5c, 0x00, 0xc0, 0x28, 0x05, 0x10, 0x78, + 0x28, 0x08, 0x00, 0x40, 0x28, 0x05, 0x70, 0xd3, 0xff, 0xff, 0x02, 0x7f, + 0x0c, 0x7f, 0x00, 0x7c, 0x01, 0x7e, 0x07, 0x7e, 0x0d, 0x7e, 0x0c, 0x7e, + 0x2c, 0x68, 0x10, 0x78, 0x76, 0xc7, 0x00, 0x40, 0x28, 0x2a, 0x2d, 0x00, + 0x60, 0x1a, 0x60, 0x1f, 0x00, 0x01, 0x20, 0x01, 0x00, 0x00, 0x10, 0x78, + 0x44, 0xee, 0x20, 0x01, 0x00, 0x02, 0x10, 0x78, 0x45, 0x02, 0x12, 0x7e, + 0x20, 0x91, 0x80, 0x00, 0x70, 0xd4, 0x80, 0x00, 0x70, 0xd6, 0x12, 0x7f, + 0x20, 0x09, 0x00, 0x02, 0x10, 0x78, 0x77, 0x5c, 0xa0, 0x85, 0x00, 0x01, + 0x0c, 0x7f, 0x0d, 0x7f, 0x07, 0x7f, 0x01, 0x7f, 0x00, 0x7c, 0x0c, 0x7e, + 0x0d, 0x7e, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x20, 0x09, 0x00, 0x7f, + 0x10, 0x78, 0x45, 0x5c, 0x00, 0xc0, 0x28, 0x4b, 0x2c, 0x68, 0x10, 0x78, + 0x76, 0xc7, 0x00, 0x40, 0x28, 0x4b, 0x2d, 0x00, 0x60, 0x1a, 0x63, 0x12, + 0x60, 0x1f, 0x00, 0x01, 0x62, 0x0a, 0x20, 0x09, 0x00, 0x22, 0x10, 0x78, + 0x77, 0x5c, 0xa0, 0x85, 0x00, 0x01, 0x12, 0x7f, 0x0d, 0x7f, 0x0c, 0x7f, + 0x00, 0x7c, 0x0e, 0x7e, 0x0c, 0x7e, 0x06, 0x7e, 0x03, 0x7e, 0x02, 0x7e, + 0x10, 0x78, 0x5f, 0x0e, 0x10, 0x78, 0x5e, 0xae, 0x10, 0x78, 0x80, 0x68, + 0x21, 0x30, 0x81, 0xff, 0x00, 0x40, 0x28, 0x64, 0x20, 0xa9, 0x00, 0x7e, + 0x20, 0x09, 0x00, 0x00, 0x00, 0x78, 0x28, 0x68, 0x20, 0xa9, 0x00, 0x7f, + 0x20, 0x09, 0x00, 0x00, 0x01, 0x7e, 0x10, 0x78, 0x45, 0xc4, 0x00, 0xc0, + 0x28, 0x71, 0x10, 0x78, 0x47, 0xe9, 0x10, 0x78, 0x42, 0xf8, 0x01, 0x7f, + 0x81, 0x08, 0x00, 0xf0, 0x28, 0x68, 0x86, 0xff, 0x00, 0xc0, 0x28, 0x7a, + 0x10, 0x78, 0x11, 0x9b, 0x02, 0x7f, 0x03, 0x7f, 0x06, 0x7f, 0x0c, 0x7f, + 0x0e, 0x7f, 0x00, 0x7c, 0x0e, 0x7e, 0x0c, 0x7e, 0x03, 0x7e, 0x02, 0x7e, + 0x01, 0x7e, 0x62, 0x18, 0x22, 0x70, 0x72, 0xa0, 0x02, 0x7e, 0x20, 0x19, + 0x00, 0x29, 0x10, 0x78, 0x5f, 0x01, 0x07, 0x7e, 0x20, 0x39, 0x00, 0x00, + 0x10, 0x78, 0x5e, 0x0a, 0x2c, 0x08, 0x10, 0x78, 0x9f, 0x9b, 0x07, 0x7f, + 0x01, 0x7f, 0x2e, 0x60, 0x10, 0x78, 0x47, 0xe9, 0x62, 0x10, 0x63, 0x14, + 0x10, 0x78, 0x42, 0xf8, 0x62, 0x12, 0x63, 0x16, 0x01, 0x7f, 0x02, 0x7f, + 0x03, 0x7f, 0x0c, 0x7f, 0x0e, 0x7f, 0x00, 0x7c, 0x0e, 0x7e, 0x00, 0x7e, + 0x60, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, 0xd0, 0xbc, 0x00, 0xc0, + 0x28, 0xba, 0x20, 0x71, 0xa7, 0x00, 0x70, 0x90, 0xa0, 0x05, 0x00, 0x40, + 0x28, 0xb7, 0x80, 0x01, 0x70, 0x92, 0x00, 0x7f, 0x0e, 0x7f, 0x00, 0x7c, + 0x20, 0x71, 0xa7, 0x00, 0x70, 0xd4, 0xa0, 0x05, 0x00, 0x40, 0x28, 0xb7, + 0x80, 0x01, 0x70, 0xd6, 0x00, 0x78, 0x28, 0xb7, 0x60, 0x00, 0xc0, 0x8c, + 0x60, 0x02, 0x00, 0x7c, 0x0f, 0x7e, 0x0e, 0x7e, 0x0c, 0x7e, 0x03, 0x7e, + 0x02, 0x7e, 0x01, 0x7e, 0x15, 0x7e, 0x21, 0x78, 0x81, 0xff, 0x00, 0xc0, + 0x28, 0xd7, 0x20, 0xa9, 0x00, 0x01, 0x00, 0x78, 0x28, 0xf2, 0x20, 0x01, + 0xa7, 0x53, 0x20, 0x04, 0xd0, 0xc4, 0x00, 0x40, 0x28, 0xee, 0xd0, 0xa4, + 0x00, 0x40, 0x28, 0xee, 0x04, 0x7e, 0x60, 0x18, 0xa0, 0x80, 0x00, 0x28, + 0x20, 0x24, 0xa4, 0xa4, 0x00, 0xff, 0x84, 0x27, 0xa0, 0x06, 0x20, 0x09, + 0x00, 0x2d, 0x10, 0x78, 0xa2, 0x2d, 0x04, 0x7f, 0x20, 0xa9, 0x00, 0xff, + 0x20, 0x11, 0x00, 0x00, 0x02, 0x7e, 0xa2, 0x8e, 0x00, 0x7e, 0x00, 0x40, + 0x29, 0x36, 0xa2, 0x8e, 0x00, 0x7f, 0x00, 0x40, 0x29, 0x36, 0xa2, 0x8e, + 0x00, 0x80, 0x00, 0x40, 0x29, 0x36, 0xa2, 0x88, 0xa8, 0x35, 0x21, 0x0c, + 0x81, 0xff, 0x00, 0x40, 0x29, 0x36, 0x8f, 0xff, 0x10, 0x40, 0x29, 0x42, + 0x0c, 0x7e, 0x21, 0x60, 0x20, 0x01, 0x00, 0x01, 0x10, 0x78, 0x49, 0x72, + 0x0c, 0x7f, 0x20, 0x19, 0x00, 0x29, 0x10, 0x78, 0x5f, 0x01, 0x07, 0x7e, + 0x20, 0x39, 0x00, 0x00, 0x10, 0x78, 0x5e, 0x0a, 0x0c, 0x7e, 0x02, 0x7e, + 0x21, 0x60, 0x62, 0x04, 0xa2, 0x94, 0x00, 0xff, 0xa2, 0x86, 0x00, 0x06, + 0x00, 0xc0, 0x29, 0x26, 0x60, 0x07, 0x04, 0x04, 0x00, 0x78, 0x29, 0x2b, + 0x20, 0x01, 0x00, 0x04, 0x80, 0x07, 0xa2, 0x15, 0x62, 0x06, 0x02, 0x7f, + 0x0c, 0x7f, 0x01, 0x7e, 0x2c, 0x08, 0x10, 0x78, 0x9f, 0x9b, 0x01, 0x7f, + 0x07, 0x7f, 0x21, 0x60, 0x10, 0x78, 0x47, 0xe9, 0x02, 0x7f, 0x82, 0x10, + 0x00, 0xf0, 0x28, 0xf2, 0x15, 0x7f, 0x01, 0x7f, 0x02, 0x7f, 0x03, 0x7f, + 0x0c, 0x7f, 0x0e, 0x7f, 0x0f, 0x7f, 0x00, 0x7c, 0x04, 0x7e, 0x02, 0x7e, + 0x01, 0x7e, 0x20, 0x01, 0xa7, 0x53, 0x20, 0x04, 0xd0, 0xc4, 0x00, 0x40, + 0x29, 0x55, 0xd0, 0xa4, 0x00, 0x40, 0x29, 0x55, 0xa0, 0x06, 0x22, 0x20, + 0x84, 0x27, 0x20, 0x09, 0x00, 0x29, 0x10, 0x78, 0xa2, 0x2d, 0x01, 0x7f, + 0x02, 0x7f, 0x04, 0x7f, 0x00, 0x7c, 0x01, 0x7e, 0x02, 0x7e, 0x03, 0x7e, + 0x0c, 0x7e, 0x72, 0x84, 0x82, 0xff, 0x00, 0x40, 0x29, 0x87, 0xa2, 0x90, + 0xa7, 0x53, 0x22, 0x14, 0xd2, 0xac, 0x00, 0xc0, 0x29, 0x87, 0x21, 0x00, + 0x10, 0x78, 0x25, 0x64, 0x81, 0xff, 0x00, 0x40, 0x29, 0x89, 0x20, 0x19, + 0x00, 0x01, 0x83, 0x14, 0xa2, 0xe0, 0xad, 0xc0, 0x2c, 0x04, 0xd3, 0x84, + 0x00, 0x40, 0x29, 0x7b, 0xa0, 0x84, 0xff, 0x00, 0x80, 0x07, 0x00, 0x78, + 0x29, 0x7d, 0xa0, 0x84, 0x00, 0xff, 0xa1, 0x16, 0x00, 0x40, 0x29, 0x89, + 0xa0, 0x96, 0x00, 0xff, 0x00, 0x40, 0x29, 0x87, 0x83, 0x18, 0x00, 0x78, + 0x29, 0x6f, 0xa0, 0x85, 0x00, 0x01, 0x0c, 0x7f, 0x03, 0x7f, 0x02, 0x7f, + 0x01, 0x7f, 0x00, 0x7c, 0x01, 0x7e, 0x0c, 0x7e, 0x12, 0x7e, 0x20, 0x91, + 0x80, 0x00, 0x01, 0x7e, 0x02, 0x7e, 0x03, 0x7e, 0x21, 0x10, 0x02, 0x7e, + 0x20, 0x19, 0x00, 0x29, 0x10, 0x78, 0x73, 0xd0, 0x02, 0x7f, 0x10, 0x78, + 0xa5, 0x01, 0x03, 0x7f, 0x02, 0x7f, 0x01, 0x7f, 0xa1, 0x80, 0xa8, 0x35, + 0x20, 0x04, 0xa0, 0x65, 0x00, 0x40, 0x29, 0xb7, 0x01, 0x7e, 0x0c, 0x7e, + 0x10, 0x78, 0x91, 0x97, 0x01, 0x7f, 0x10, 0x40, 0x13, 0x32, 0x61, 0x1a, + 0x10, 0x78, 0x28, 0x80, 0x10, 0x78, 0x77, 0x2d, 0x01, 0x7f, 0x10, 0x78, + 0x45, 0x7f, 0x12, 0x7f, 0x0c, 0x7f, 0x01, 0x7f, 0x00, 0x7c, 0x20, 0x01, + 0xa7, 0x33, 0x20, 0x04, 0xd0, 0xcc, 0x00, 0x7c, 0x7e, 0xef, 0x7d, 0xe8, + 0x7c, 0xe4, 0x80, 0xe2, 0x7b, 0xe1, 0x80, 0xe0, 0x80, 0xdc, 0x80, 0xda, + 0x7a, 0xd9, 0x80, 0xd6, 0x80, 0xd5, 0x80, 0xd4, 0x80, 0xd3, 0x80, 0xd2, + 0x80, 0xd1, 0x79, 0xce, 0x78, 0xcd, 0x80, 0xcc, 0x80, 0xcb, 0x80, 0xca, + 0x80, 0xc9, 0x80, 0xc7, 0x80, 0xc6, 0x77, 0xc5, 0x76, 0xc3, 0x80, 0xbc, + 0x80, 0xba, 0x75, 0xb9, 0x80, 0xb6, 0x74, 0xb5, 0x73, 0xb4, 0x72, 0xb3, + 0x80, 0xb2, 0x80, 0xb1, 0x80, 0xae, 0x71, 0xad, 0x80, 0xac, 0x70, 0xab, + 0x6f, 0xaa, 0x6e, 0xa9, 0x80, 0xa7, 0x6d, 0xa6, 0x6c, 0xa5, 0x6b, 0xa3, + 0x6a, 0x9f, 0x69, 0x9e, 0x68, 0x9d, 0x80, 0x9b, 0x80, 0x98, 0x67, 0x97, + 0x66, 0x90, 0x65, 0x8f, 0x64, 0x88, 0x63, 0x84, 0x62, 0x82, 0x80, 0x81, + 0x80, 0x80, 0x61, 0x7c, 0x60, 0x7a, 0x80, 0x79, 0x5f, 0x76, 0x80, 0x75, + 0x80, 0x74, 0x80, 0x73, 0x80, 0x72, 0x80, 0x71, 0x80, 0x6e, 0x5e, 0x6d, + 0x80, 0x6c, 0x5d, 0x6b, 0x5c, 0x6a, 0x5b, 0x69, 0x80, 0x67, 0x5a, 0x66, + 0x59, 0x65, 0x58, 0x63, 0x57, 0x5c, 0x56, 0x5a, 0x55, 0x59, 0x80, 0x56, + 0x80, 0x55, 0x54, 0x54, 0x53, 0x53, 0x52, 0x52, 0x51, 0x51, 0x50, 0x4e, + 0x4f, 0x4d, 0x80, 0x4c, 0x80, 0x4b, 0x4e, 0x4a, 0x4d, 0x49, 0x80, 0x47, + 0x4c, 0x46, 0x80, 0x45, 0x80, 0x43, 0x80, 0x3c, 0x80, 0x3a, 0x80, 0x39, + 0x80, 0x36, 0x4b, 0x35, 0x80, 0x34, 0x4a, 0x33, 0x49, 0x32, 0x48, 0x31, + 0x80, 0x2e, 0x47, 0x2d, 0x46, 0x2c, 0x45, 0x2b, 0x44, 0x2a, 0x43, 0x29, + 0x42, 0x27, 0x80, 0x26, 0x80, 0x25, 0x41, 0x23, 0x40, 0x1f, 0x3f, 0x1e, + 0x3e, 0x1d, 0x3d, 0x1b, 0x3c, 0x18, 0x80, 0x17, 0x80, 0x10, 0x3b, 0x0f, + 0x3a, 0x08, 0x80, 0x04, 0x39, 0x02, 0x80, 0x01, 0x80, 0x00, 0x80, 0x00, + 0x38, 0x00, 0x37, 0x00, 0x36, 0x00, 0x80, 0x00, 0x35, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x34, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x33, 0x00, 0x32, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x31, 0x00, + 0x30, 0x00, 0x80, 0x00, 0x80, 0x00, 0x2f, 0x00, 0x80, 0x00, 0x2e, 0x00, + 0x2d, 0x00, 0x2c, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x2b, 0x00, + 0x80, 0x00, 0x2a, 0x00, 0x29, 0x00, 0x28, 0x00, 0x80, 0x00, 0x27, 0x00, + 0x26, 0x00, 0x25, 0x00, 0x24, 0x00, 0x23, 0x00, 0x22, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x21, 0x00, 0x20, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x1d, 0x00, + 0x1c, 0x00, 0x80, 0x00, 0x80, 0x00, 0x1b, 0x00, 0x1a, 0x00, 0x80, 0x00, + 0x19, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x18, 0x00, 0x80, 0x00, 0x17, 0x00, 0x16, 0x00, 0x15, 0x00, + 0x80, 0x00, 0x14, 0x00, 0x13, 0x00, 0x12, 0x00, 0x11, 0x00, 0x10, 0x00, + 0x0f, 0x00, 0x80, 0x00, 0x80, 0x00, 0x0e, 0x00, 0x0d, 0x00, 0x0c, 0x00, + 0x0b, 0x00, 0x0a, 0x00, 0x09, 0x00, 0x80, 0x00, 0x80, 0x00, 0x08, 0x00, + 0x07, 0x00, 0x80, 0x00, 0x06, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x05, 0x00, 0x04, 0x00, 0x03, 0x00, 0x80, 0x00, 0x02, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x01, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x20, 0x71, 0xa7, 0x82, 0x70, 0x03, 0x00, 0x02, + 0xa0, 0x06, 0x70, 0x12, 0x70, 0x16, 0x70, 0x3a, 0x70, 0x3e, 0x70, 0x33, + 0xa7, 0x92, 0x70, 0x37, 0xa7, 0x92, 0x70, 0x07, 0x00, 0x01, 0x20, 0x61, + 0xa7, 0xd2, 0x60, 0x03, 0x00, 0x02, 0x00, 0x7c, 0x00, 0x90, 0x2a, 0xe7, + 0x00, 0x68, 0x2a, 0xe7, 0x20, 0x71, 0xa7, 0x82, 0x2b, 0x78, 0x78, 0x18, + 0xd0, 0x84, 0x00, 0xc0, 0x2a, 0xe7, 0x2a, 0x60, 0x78, 0x20, 0xa0, 0x8e, + 0x00, 0x69, 0x00, 0xc0, 0x2b, 0xd7, 0x00, 0x79, 0x2b, 0x6b, 0x00, 0x7c, + 0x20, 0x71, 0xa7, 0x82, 0x70, 0x04, 0x00, 0x79, 0x2a, 0xed, 0x2a, 0xf1, + 0x2a, 0xf2, 0x2a, 0xfc, 0x2b, 0x0e, 0x00, 0x7c, 0x00, 0x90, 0x2a, 0xfb, + 0x00, 0x68, 0x2a, 0xfb, 0x2b, 0x78, 0x78, 0x18, 0xd0, 0x84, 0x00, 0x40, + 0x2b, 0x1a, 0x00, 0x7c, 0x2b, 0x78, 0x20, 0x61, 0xa7, 0xd2, 0x60, 0x08, + 0xa0, 0x8e, 0x01, 0x00, 0x00, 0x40, 0x2b, 0x09, 0xa0, 0x86, 0x02, 0x00, + 0x00, 0x40, 0x2b, 0xcf, 0x00, 0x7c, 0x70, 0x14, 0x20, 0x68, 0x2a, 0x60, + 0x70, 0x18, 0x00, 0x7a, 0x70, 0x10, 0x20, 0x68, 0x68, 0x34, 0xa0, 0x86, + 0x01, 0x03, 0x00, 0x40, 0x2b, 0x16, 0x00, 0x7c, 0x2a, 0x60, 0x2b, 0x78, + 0x70, 0x18, 0x00, 0x7a, 0x2a, 0x60, 0x78, 0x20, 0xa0, 0x8a, 0x00, 0x40, + 0x00, 0xc8, 0x2b, 0x23, 0x61, 0xbc, 0x00, 0x79, 0x2b, 0x2b, 0x21, 0x00, + 0xa0, 0x8a, 0x00, 0x3f, 0x00, 0xc8, 0x2b, 0xcb, 0x61, 0xbc, 0x00, 0x79, + 0x2b, 0x6b, 0x2b, 0xad, 0x2b, 0xdf, 0x2b, 0xe7, 0x2b, 0xeb, 0x2b, 0xf3, + 0x2b, 0xf9, 0x2b, 0xfd, 0x2c, 0x09, 0x2c, 0x0d, 0x2c, 0x17, 0x2c, 0x1b, + 0x2b, 0xcb, 0x2b, 0xcb, 0x2b, 0xcb, 0x2c, 0x1f, 0x2b, 0xcb, 0x2c, 0x2f, + 0x2c, 0x46, 0x2c, 0x5d, 0x2c, 0xdd, 0x2c, 0xe2, 0x2d, 0x0f, 0x2d, 0x69, + 0x2d, 0x7a, 0x2d, 0x98, 0x2d, 0xd9, 0x2d, 0xe3, 0x2d, 0xf0, 0x2e, 0x03, + 0x2e, 0x22, 0x2e, 0x2b, 0x2e, 0x68, 0x2e, 0x6e, 0x2b, 0xcb, 0x2e, 0x8a, + 0x2b, 0xcb, 0x2b, 0xcb, 0x2b, 0xcb, 0x2b, 0xcb, 0x2b, 0xcb, 0x2e, 0x91, + 0x2e, 0x9b, 0x2b, 0xcb, 0x2b, 0xcb, 0x2b, 0xcb, 0x2b, 0xcb, 0x2b, 0xcb, + 0x2b, 0xcb, 0x2b, 0xcb, 0x2b, 0xcb, 0x2e, 0xa3, 0x2b, 0xcb, 0x2b, 0xcb, + 0x2b, 0xcb, 0x2b, 0xcb, 0x2b, 0xcb, 0x2e, 0xb5, 0x2e, 0xce, 0x2b, 0xcb, + 0x2b, 0xcb, 0x2b, 0xcb, 0x2b, 0xcb, 0x2b, 0xcb, 0x2b, 0xcb, 0x2e, 0xe0, + 0x2f, 0x37, 0x2f, 0x95, 0x2f, 0xa9, 0x2b, 0xcb, 0x2b, 0xcb, 0x2b, 0xcb, + 0x39, 0x8e, 0x2b, 0xcb, 0x2b, 0xcb, 0x2b, 0xcb, 0x2b, 0xcb, 0x2b, 0xcb, + 0x2b, 0xcb, 0x2b, 0xcb, 0x2b, 0xcb, 0x2c, 0x17, 0x2c, 0x1b, 0x2f, 0xc0, + 0x2b, 0xcb, 0x2f, 0xcd, 0x3a, 0x26, 0x3a, 0x83, 0x2b, 0xcb, 0x2b, 0xcb, + 0x2b, 0xcb, 0x2b, 0xcb, 0x2b, 0xcb, 0x2b, 0xcb, 0x2b, 0xcb, 0x2b, 0xcb, + 0x2b, 0xcb, 0x30, 0x1a, 0x31, 0x4f, 0x31, 0x6b, 0x31, 0x77, 0x31, 0xda, + 0x32, 0x33, 0x32, 0x3e, 0x32, 0x7d, 0x32, 0x8c, 0x32, 0x9b, 0x32, 0x9e, + 0x2f, 0xd1, 0x32, 0xc2, 0x33, 0x1e, 0x33, 0x2b, 0x34, 0x3c, 0x35, 0x6f, + 0x35, 0x99, 0x36, 0xa6, 0x2b, 0xcb, 0x36, 0xb6, 0x36, 0xf0, 0x37, 0xbf, + 0x2b, 0xcb, 0x2b, 0xcb, 0x2b, 0xcb, 0x2b, 0xcb, 0x38, 0x27, 0x38, 0x43, + 0x38, 0xbd, 0x39, 0x77, 0x71, 0x3c, 0x00, 0x78, 0x2b, 0xad, 0x20, 0x21, + 0x40, 0x00, 0x10, 0x78, 0x35, 0xf5, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, + 0x00, 0x68, 0x2b, 0xba, 0x78, 0x18, 0xd0, 0x84, 0x00, 0x40, 0x2b, 0xbd, + 0x12, 0x7f, 0x00, 0x78, 0x2b, 0xb1, 0x7c, 0x22, 0x79, 0x26, 0x7a, 0x2a, + 0x7b, 0x2e, 0x78, 0x1b, 0x00, 0x01, 0x20, 0x91, 0x40, 0x80, 0x70, 0x07, + 0x00, 0x01, 0x20, 0x91, 0x50, 0x00, 0x12, 0x7f, 0x00, 0x7c, 0x20, 0x21, + 0x40, 0x01, 0x00, 0x78, 0x2b, 0xaf, 0x20, 0x21, 0x40, 0x02, 0x00, 0x78, + 0x2b, 0xaf, 0x20, 0x21, 0x40, 0x03, 0x00, 0x78, 0x2b, 0xaf, 0x20, 0x21, + 0x40, 0x05, 0x00, 0x78, 0x2b, 0xaf, 0x20, 0x21, 0x40, 0x06, 0x00, 0x78, + 0x2b, 0xaf, 0xa0, 0x2e, 0x25, 0x20, 0x7b, 0x28, 0x7a, 0x2c, 0x78, 0x24, + 0x79, 0x30, 0x00, 0x78, 0x36, 0x04, 0x78, 0x23, 0x00, 0x04, 0x78, 0x24, + 0x00, 0x7a, 0xa0, 0x2e, 0x25, 0x20, 0x7b, 0x28, 0x7a, 0x2c, 0x78, 0x24, + 0x79, 0x30, 0x00, 0x78, 0x36, 0x08, 0x79, 0x24, 0x78, 0x28, 0x21, 0x14, + 0x20, 0x0a, 0x00, 0x78, 0x2b, 0xad, 0x79, 0x24, 0x21, 0x14, 0x00, 0x78, + 0x2b, 0xad, 0x20, 0x99, 0x00, 0x09, 0x20, 0xa1, 0x00, 0x09, 0x20, 0xa9, + 0x00, 0x07, 0x53, 0xa3, 0x79, 0x24, 0x7a, 0x28, 0x7b, 0x2c, 0x00, 0x78, + 0x2b, 0xad, 0x78, 0x24, 0x20, 0x60, 0x00, 0x78, 0x2c, 0x21, 0x20, 0x09, + 0x00, 0x01, 0x20, 0x11, 0x00, 0x13, 0x20, 0x19, 0x00, 0x19, 0x78, 0x3b, + 0x00, 0x17, 0x00, 0x78, 0x2b, 0xad, 0x7d, 0x38, 0x7c, 0x3c, 0x00, 0x78, + 0x2b, 0xe1, 0x7d, 0x38, 0x7c, 0x3c, 0x00, 0x78, 0x2b, 0xed, 0x20, 0x61, + 0x10, 0x00, 0x61, 0x0c, 0xa0, 0x06, 0x2c, 0x14, 0xa2, 0x00, 0x8c, 0x60, + 0x81, 0x09, 0x00, 0xc0, 0x2c, 0x23, 0x20, 0x10, 0xa0, 0x05, 0x00, 0x40, + 0x2b, 0xad, 0x00, 0x78, 0x2b, 0xd3, 0x20, 0x69, 0xa7, 0x52, 0x78, 0x24, + 0x79, 0x30, 0xa1, 0x1a, 0x00, 0xc8, 0x2b, 0xdb, 0x80, 0x19, 0x00, 0x40, + 0x2b, 0xdb, 0x68, 0x4a, 0x69, 0x42, 0x78, 0x2c, 0x68, 0x52, 0x78, 0x28, + 0x68, 0x56, 0xa0, 0x06, 0x68, 0x5a, 0x68, 0x5e, 0x10, 0x78, 0x4e, 0xae, + 0x00, 0x78, 0x2b, 0xad, 0x20, 0x69, 0xa7, 0x52, 0x78, 0x24, 0x79, 0x34, + 0xa1, 0x1a, 0x00, 0xc8, 0x2b, 0xdb, 0x80, 0x19, 0x00, 0x40, 0x2b, 0xdb, + 0x68, 0x4e, 0x69, 0x46, 0x78, 0x2c, 0x68, 0x62, 0x78, 0x28, 0x68, 0x66, + 0xa0, 0x06, 0x68, 0x6a, 0x68, 0x6e, 0x10, 0x78, 0x4a, 0x3e, 0x00, 0x78, + 0x2b, 0xad, 0xa0, 0x2e, 0x25, 0x20, 0x81, 0xff, 0x00, 0xc0, 0x2b, 0xd7, + 0x79, 0x24, 0x7b, 0x28, 0x7a, 0x2c, 0x20, 0xa9, 0x00, 0x05, 0x20, 0xa1, + 0xa7, 0x89, 0x41, 0xa1, 0x10, 0x78, 0x35, 0xba, 0x00, 0x40, 0x2b, 0xd7, + 0x20, 0x09, 0x00, 0x20, 0x10, 0x78, 0x36, 0x04, 0x70, 0x1b, 0x2c, 0x75, + 0x00, 0x7c, 0x68, 0x34, 0x20, 0x08, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x96, + 0x00, 0x11, 0x00, 0x40, 0x2c, 0x85, 0xa0, 0x96, 0x00, 0x19, 0x00, 0x40, + 0x2c, 0x85, 0xa0, 0x96, 0x00, 0x15, 0x00, 0xc0, 0x2b, 0xd7, 0x81, 0x0f, + 0xa1, 0x8c, 0x00, 0xff, 0x00, 0x40, 0x2b, 0xd7, 0x71, 0x0e, 0x70, 0x0c, + 0x80, 0x01, 0x00, 0x40, 0x2c, 0xb6, 0x70, 0x0e, 0x10, 0x78, 0x35, 0xba, + 0x00, 0x40, 0x2b, 0xd7, 0x20, 0x09, 0x00, 0x20, 0x20, 0x61, 0xa7, 0xd2, + 0x62, 0x24, 0x63, 0x28, 0x64, 0x2c, 0x65, 0x30, 0xa2, 0x90, 0x00, 0x40, + 0xa3, 0x99, 0x00, 0x00, 0xa4, 0xa1, 0x00, 0x00, 0xa5, 0xa9, 0x00, 0x00, + 0x10, 0x78, 0x36, 0x04, 0x70, 0x1b, 0x2c, 0xa9, 0x00, 0x7c, 0x68, 0x34, + 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x96, 0x00, 0x02, 0x00, 0x40, 0x2c, 0xb4, + 0xa0, 0x96, 0x00, 0x0a, 0x00, 0xc0, 0x2b, 0xd7, 0x00, 0x78, 0x2c, 0x8b, + 0x70, 0x10, 0x20, 0x68, 0x68, 0x38, 0xc0, 0xfd, 0x68, 0x3a, 0x10, 0x78, + 0x44, 0x31, 0x00, 0xc0, 0x2c, 0xc4, 0x70, 0x07, 0x00, 0x03, 0x70, 0x1b, + 0x2c, 0xc6, 0x00, 0x7c, 0x10, 0x78, 0x4b, 0x51, 0x12, 0x7e, 0x20, 0x91, + 0x80, 0x00, 0x20, 0xa9, 0x00, 0x05, 0x20, 0x99, 0xa7, 0x89, 0x53, 0x0a, + 0x21, 0x00, 0xa2, 0x10, 0xa3, 0x99, 0x00, 0x00, 0xa4, 0xa1, 0x00, 0x00, + 0xa5, 0xa9, 0x00, 0x00, 0xad, 0x80, 0x00, 0x0d, 0x20, 0x09, 0x00, 0x20, + 0x12, 0x7f, 0x00, 0x78, 0x36, 0x08, 0x61, 0xa4, 0x78, 0x24, 0x60, 0xa6, + 0x00, 0x78, 0x2b, 0xad, 0x20, 0x91, 0x80, 0x00, 0x78, 0x23, 0x40, 0x00, + 0x78, 0x27, 0x49, 0x53, 0x78, 0x2b, 0x50, 0x20, 0x78, 0x2f, 0x20, 0x20, + 0x20, 0x09, 0x01, 0x7f, 0x21, 0x04, 0x78, 0x32, 0x3f, 0x00, 0x78, 0x36, + 0x20, 0x61, 0x01, 0x00, 0x62, 0x00, 0x20, 0x61, 0x02, 0x00, 0x60, 0x3c, + 0x80, 0x07, 0xa2, 0x05, 0x78, 0x3a, 0x20, 0x09, 0x04, 0xfd, 0x21, 0x04, + 0x78, 0x3e, 0x78, 0x1b, 0x00, 0x01, 0x20, 0x91, 0x50, 0x00, 0x20, 0x91, + 0x40, 0x80, 0x20, 0x71, 0x00, 0x10, 0x20, 0xc1, 0x00, 0xf0, 0xa0, 0x8a, + 0x00, 0x03, 0x00, 0xc8, 0x04, 0x27, 0x00, 0x78, 0x04, 0x23, 0x81, 0xff, + 0x00, 0xc0, 0x2b, 0xd7, 0x79, 0x24, 0x81, 0x0f, 0xa1, 0x8c, 0x00, 0xff, + 0x10, 0x78, 0x45, 0xc4, 0x00, 0xc0, 0x2b, 0xdb, 0x7e, 0x38, 0xa6, 0x84, + 0x3f, 0xff, 0xa0, 0x82, 0x40, 0x00, 0x00, 0x48, 0x2d, 0x23, 0x00, 0x78, + 0x2b, 0xdb, 0x7c, 0x28, 0x7d, 0x2c, 0x10, 0x78, 0x47, 0xa4, 0xd2, 0x8c, + 0x00, 0xc0, 0x2d, 0x2e, 0x10, 0x78, 0x47, 0x36, 0x00, 0x78, 0x2d, 0x30, + 0x10, 0x78, 0x47, 0x72, 0x00, 0xc0, 0x2d, 0x5a, 0x20, 0x61, 0xae, 0x00, + 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x60, 0x00, 0xa0, 0x86, 0x00, 0x00, + 0x00, 0x40, 0x2d, 0x48, 0x60, 0x10, 0xa0, 0x6d, 0x00, 0x40, 0x2d, 0x48, + 0x68, 0x3c, 0xa4, 0x06, 0x00, 0xc0, 0x2d, 0x48, 0x68, 0x40, 0xa5, 0x06, + 0x00, 0x40, 0x2d, 0x53, 0x12, 0x7f, 0xac, 0xe0, 0x00, 0x10, 0x20, 0x01, + 0xa7, 0x16, 0x20, 0x04, 0xac, 0x02, 0x00, 0xc8, 0x2b, 0xd7, 0x00, 0x78, + 0x2d, 0x34, 0x10, 0x78, 0x8a, 0x11, 0x12, 0x7f, 0x00, 0x40, 0x2b, 0xd7, + 0x00, 0x78, 0x2b, 0xad, 0xa0, 0x0e, 0x20, 0x01, 0x00, 0x05, 0x10, 0x78, + 0x4b, 0x51, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x10, 0x78, 0x8f, 0x95, + 0x10, 0x78, 0x4a, 0x73, 0x12, 0x7f, 0x00, 0x78, 0x2b, 0xad, 0x81, 0xff, + 0x00, 0xc0, 0x2b, 0xd7, 0x10, 0x78, 0x35, 0xd2, 0x00, 0x40, 0x2b, 0xdb, + 0x10, 0x78, 0x46, 0x73, 0x00, 0x40, 0x2b, 0xd7, 0x10, 0x78, 0x47, 0xb2, + 0x00, 0x40, 0x2b, 0xd7, 0x00, 0x78, 0x2b, 0xad, 0x81, 0xff, 0x00, 0xc0, + 0x2b, 0xd7, 0x10, 0x78, 0x35, 0xe4, 0x00, 0x40, 0x2b, 0xdb, 0x10, 0x78, + 0x48, 0x2f, 0x00, 0x40, 0x2b, 0xd7, 0x20, 0x19, 0x00, 0x05, 0x10, 0x78, + 0x47, 0xd3, 0x00, 0x40, 0x2b, 0xd7, 0x78, 0x28, 0xa0, 0x8a, 0x10, 0x00, + 0x00, 0xc8, 0x2b, 0xdb, 0x80, 0x03, 0x80, 0x0b, 0x81, 0x0b, 0xa1, 0x08, + 0x10, 0x78, 0x5a, 0x52, 0x00, 0x78, 0x2b, 0xad, 0x12, 0x7e, 0x20, 0x91, + 0x80, 0x00, 0x81, 0xff, 0x00, 0x40, 0x2d, 0xa2, 0x20, 0x09, 0x00, 0x01, + 0x00, 0x78, 0x2d, 0xd3, 0x20, 0x29, 0x00, 0xff, 0x64, 0x50, 0x24, 0x00, + 0xa5, 0x06, 0x00, 0x40, 0x2d, 0xcd, 0x25, 0x08, 0x10, 0x78, 0x45, 0xc4, + 0x00, 0xc0, 0x2d, 0xcd, 0x10, 0x78, 0x48, 0x2f, 0x00, 0xc0, 0x2d, 0xb8, + 0x20, 0x09, 0x00, 0x02, 0x62, 0xac, 0x25, 0x18, 0x00, 0x78, 0x2d, 0xd3, + 0x20, 0x19, 0x00, 0x04, 0x10, 0x78, 0x47, 0xd3, 0x00, 0xc0, 0x2d, 0xc2, + 0x20, 0x09, 0x00, 0x06, 0x00, 0x78, 0x2d, 0xd3, 0x78, 0x24, 0xa0, 0x8a, + 0x10, 0x00, 0x00, 0xc8, 0x2d, 0xd6, 0x80, 0x03, 0x80, 0x0b, 0x81, 0x0b, + 0xa1, 0x08, 0x10, 0x78, 0x5a, 0x52, 0x85, 0x29, 0x00, 0xc8, 0x2d, 0xa5, + 0x12, 0x7f, 0x00, 0x78, 0x2b, 0xad, 0x12, 0x7f, 0x00, 0x78, 0x2b, 0xd7, + 0x12, 0x7f, 0x00, 0x78, 0x2b, 0xdb, 0x10, 0x78, 0x35, 0xd2, 0x00, 0x40, + 0x2b, 0xdb, 0x10, 0x78, 0x46, 0xe7, 0x10, 0x78, 0x47, 0xa4, 0x00, 0x78, + 0x2b, 0xad, 0x81, 0xff, 0x00, 0xc0, 0x2b, 0xd7, 0x10, 0x78, 0x35, 0xd2, + 0x00, 0x40, 0x2b, 0xdb, 0x10, 0x78, 0x46, 0xd6, 0x10, 0x78, 0x47, 0xa4, + 0x00, 0x78, 0x2b, 0xad, 0x81, 0xff, 0x00, 0xc0, 0x2b, 0xd7, 0x10, 0x78, + 0x35, 0xd2, 0x00, 0x40, 0x2b, 0xdb, 0x10, 0x78, 0x47, 0x75, 0x00, 0x40, + 0x2b, 0xd7, 0x10, 0x78, 0x44, 0x84, 0x10, 0x78, 0x47, 0x2f, 0x10, 0x78, + 0x47, 0xa4, 0x00, 0x78, 0x2b, 0xad, 0x10, 0x78, 0x35, 0xd2, 0x00, 0x40, + 0x2b, 0xdb, 0x10, 0x78, 0x46, 0x73, 0x00, 0x40, 0x2b, 0xd7, 0x62, 0xa0, + 0x20, 0x19, 0x00, 0x05, 0x0c, 0x7e, 0x10, 0x78, 0x47, 0xe9, 0x0c, 0x7f, + 0x10, 0x78, 0x5f, 0x01, 0x07, 0x7e, 0x20, 0x39, 0x00, 0x00, 0x10, 0x78, + 0x5e, 0x0a, 0x20, 0x09, 0x00, 0x00, 0x10, 0x78, 0x9f, 0x9b, 0x07, 0x7f, + 0x10, 0x78, 0x47, 0xa4, 0x00, 0x78, 0x2b, 0xad, 0x10, 0x78, 0x35, 0xd2, + 0x00, 0x40, 0x2b, 0xdb, 0x10, 0x78, 0x47, 0xa4, 0x22, 0x08, 0x00, 0x78, + 0x2b, 0xad, 0x15, 0x7e, 0x0d, 0x7e, 0x0e, 0x7e, 0x20, 0x69, 0xa8, 0x14, + 0x68, 0x10, 0x69, 0x14, 0xa1, 0x0a, 0x00, 0xc8, 0x2e, 0x37, 0x20, 0x09, + 0x00, 0x00, 0x68, 0x16, 0x20, 0x11, 0x00, 0x00, 0x20, 0x19, 0x00, 0x00, + 0x20, 0xa9, 0x00, 0xff, 0x20, 0x69, 0xa8, 0x35, 0x2d, 0x04, 0xa0, 0x75, + 0x00, 0x40, 0x2e, 0x4c, 0x70, 0x4c, 0x10, 0x78, 0x2e, 0x56, 0xa2, 0x10, + 0x70, 0x80, 0x10, 0x78, 0x2e, 0x56, 0xa3, 0x18, 0x8d, 0x68, 0x00, 0xf0, + 0x2e, 0x40, 0x23, 0x00, 0xa2, 0x18, 0x0e, 0x7f, 0x0d, 0x7f, 0x15, 0x7f, + 0x00, 0x78, 0x2b, 0xad, 0x0f, 0x7e, 0x01, 0x7e, 0xa0, 0x7d, 0x00, 0x40, + 0x2e, 0x65, 0x20, 0x01, 0x00, 0x00, 0x80, 0x00, 0x2f, 0x0c, 0x81, 0xff, + 0x00, 0x40, 0x2e, 0x65, 0x21, 0x78, 0x00, 0x78, 0x2e, 0x5d, 0x01, 0x7f, + 0x0f, 0x7f, 0x00, 0x7c, 0x20, 0x69, 0xa8, 0x14, 0x69, 0x10, 0x62, 0xa8, + 0x00, 0x78, 0x2b, 0xad, 0x81, 0xff, 0x00, 0xc0, 0x2b, 0xd7, 0x61, 0x50, + 0xa1, 0x90, 0x29, 0xc0, 0x22, 0x14, 0xa2, 0x94, 0x00, 0xff, 0x60, 0x70, + 0xa0, 0x84, 0xff, 0x00, 0xa2, 0x15, 0x63, 0x6c, 0x67, 0xcc, 0xd7, 0x9c, + 0x00, 0x40, 0x2e, 0x84, 0x20, 0x31, 0x00, 0x01, 0x00, 0x78, 0x2e, 0x86, + 0x20, 0x31, 0x00, 0x00, 0x7e, 0x3a, 0x7f, 0x3e, 0x00, 0x78, 0x2b, 0xad, + 0x61, 0x40, 0x62, 0x44, 0x20, 0x19, 0xa9, 0xa2, 0x23, 0x1c, 0x00, 0x78, + 0x2b, 0xad, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x61, 0x34, 0x63, 0x38, + 0xa0, 0x06, 0x20, 0x10, 0x12, 0x7f, 0x00, 0x78, 0x2b, 0xad, 0x10, 0x78, + 0x35, 0xe4, 0x00, 0x40, 0x2b, 0xdb, 0x62, 0x44, 0x63, 0x38, 0x00, 0x78, + 0x2b, 0xad, 0x61, 0x40, 0x62, 0x44, 0x78, 0x24, 0x60, 0x42, 0x7b, 0x28, + 0x63, 0x46, 0x20, 0x69, 0xa7, 0x52, 0x83, 0x1f, 0xa3, 0x05, 0x68, 0x16, + 0x78, 0x2c, 0x20, 0x69, 0xa9, 0xa2, 0x2d, 0x1c, 0x20, 0x6a, 0x00, 0x78, + 0x2b, 0xad, 0x01, 0x7e, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x78, 0x24, + 0x60, 0x36, 0xd0, 0x94, 0x00, 0x40, 0x2e, 0xc8, 0x78, 0x28, 0xa0, 0x85, + 0x00, 0x01, 0x20, 0x09, 0xa9, 0xab, 0x20, 0x0a, 0x20, 0x01, 0xff, 0xff, + 0x10, 0x78, 0x5a, 0xe6, 0x78, 0x2c, 0x60, 0x3a, 0x12, 0x7f, 0x01, 0x7f, + 0x00, 0x78, 0x2b, 0xad, 0x10, 0x78, 0x35, 0xe4, 0x00, 0x40, 0x2b, 0xdb, + 0x78, 0x28, 0xa0, 0x0d, 0x00, 0x40, 0x2b, 0xdb, 0x78, 0x2c, 0xa0, 0x05, + 0x00, 0x40, 0x2b, 0xdb, 0x62, 0x44, 0x61, 0x46, 0x63, 0x38, 0x60, 0x3a, + 0x00, 0x78, 0x2b, 0xad, 0x20, 0x01, 0xa7, 0x00, 0x20, 0x04, 0xa0, 0x86, + 0x00, 0x03, 0x00, 0xc0, 0x2b, 0xd7, 0x0c, 0x7e, 0x20, 0x61, 0x01, 0x00, + 0x79, 0x24, 0x81, 0x0f, 0xa1, 0x8c, 0x00, 0xff, 0xa1, 0x96, 0x00, 0xff, + 0x00, 0xc0, 0x2e, 0xf7, 0x60, 0x30, 0xa0, 0x85, 0xff, 0x00, 0x00, 0x78, + 0x2f, 0x06, 0xa1, 0x82, 0x00, 0x7f, 0x00, 0xc8, 0x2f, 0x30, 0xa1, 0x88, + 0x29, 0xc0, 0x21, 0x0c, 0xa1, 0x8c, 0x00, 0xff, 0x60, 0x30, 0xa1, 0x16, + 0x00, 0x40, 0x2f, 0x30, 0x81, 0x0f, 0xa1, 0x05, 0x12, 0x7e, 0x20, 0x91, + 0x80, 0x00, 0x00, 0x7e, 0x10, 0x78, 0x76, 0xc7, 0x00, 0x7f, 0x00, 0x40, + 0x2f, 0x2c, 0x60, 0x1a, 0x60, 0x0b, 0xbc, 0x09, 0x60, 0x1f, 0x00, 0x01, + 0x10, 0x78, 0x35, 0xba, 0x00, 0x40, 0x2f, 0x33, 0x68, 0x37, 0x00, 0x00, + 0x70, 0x07, 0x00, 0x03, 0x68, 0x33, 0x00, 0x00, 0x68, 0x38, 0xc0, 0xfd, + 0x68, 0x3a, 0x70, 0x1b, 0x2f, 0x8e, 0x2d, 0x00, 0x60, 0x12, 0x20, 0x09, + 0x00, 0x32, 0x10, 0x78, 0x77, 0x5c, 0x12, 0x7f, 0x0c, 0x7f, 0x00, 0x7c, + 0x12, 0x7f, 0x0c, 0x7f, 0x00, 0x78, 0x2b, 0xd7, 0x0c, 0x7f, 0x00, 0x78, + 0x2b, 0xdb, 0x10, 0x78, 0x77, 0x2d, 0x00, 0x78, 0x2f, 0x2c, 0x20, 0x01, + 0xa7, 0x00, 0x20, 0x04, 0xa0, 0x86, 0x00, 0x03, 0x00, 0xc0, 0x2b, 0xd7, + 0x0c, 0x7e, 0x20, 0x61, 0x01, 0x00, 0x79, 0x24, 0x81, 0x0f, 0xa1, 0x8c, + 0x00, 0xff, 0xa1, 0x96, 0x00, 0xff, 0x00, 0xc0, 0x2f, 0x4e, 0x60, 0x30, + 0xa0, 0x85, 0xff, 0x00, 0x00, 0x78, 0x2f, 0x5d, 0xa1, 0x82, 0x00, 0x7f, + 0x00, 0xc8, 0x2f, 0x87, 0xa1, 0x88, 0x29, 0xc0, 0x21, 0x0c, 0xa1, 0x8c, + 0x00, 0xff, 0x60, 0x30, 0xa1, 0x16, 0x00, 0x40, 0x2f, 0x87, 0x81, 0x0f, + 0xa1, 0x05, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x00, 0x7e, 0x10, 0x78, + 0x76, 0xc7, 0x00, 0x7f, 0x00, 0x40, 0x2f, 0x83, 0x60, 0x1a, 0x60, 0x0b, + 0xbc, 0x05, 0x60, 0x1f, 0x00, 0x01, 0x10, 0x78, 0x35, 0xba, 0x00, 0x40, + 0x2f, 0x8a, 0x68, 0x37, 0x00, 0x00, 0x70, 0x07, 0x00, 0x03, 0x68, 0x33, + 0x00, 0x00, 0x68, 0x38, 0xc0, 0xfd, 0x68, 0x3a, 0x70, 0x1b, 0x2f, 0x8e, + 0x2d, 0x00, 0x60, 0x12, 0x20, 0x09, 0x00, 0x32, 0x10, 0x78, 0x77, 0x5c, + 0x12, 0x7f, 0x0c, 0x7f, 0x00, 0x7c, 0x12, 0x7f, 0x0c, 0x7f, 0x00, 0x78, + 0x2b, 0xd7, 0x0c, 0x7f, 0x00, 0x78, 0x2b, 0xdb, 0x10, 0x78, 0x77, 0x2d, + 0x00, 0x78, 0x2f, 0x83, 0x68, 0x30, 0xa0, 0x86, 0x01, 0x00, 0x00, 0x40, + 0x2b, 0xd7, 0x00, 0x78, 0x2b, 0xad, 0x20, 0x61, 0xaa, 0x33, 0x12, 0x7e, + 0x20, 0x91, 0x80, 0x00, 0x60, 0x00, 0xd0, 0x84, 0x00, 0x40, 0x2f, 0xa6, + 0x61, 0x04, 0x62, 0x08, 0x20, 0x19, 0xa7, 0x12, 0x23, 0x1c, 0x12, 0x7f, + 0x00, 0x78, 0x2b, 0xad, 0x12, 0x7f, 0x00, 0x78, 0x2b, 0xdb, 0x81, 0xff, + 0x00, 0xc0, 0x2b, 0xd7, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x62, 0x48, + 0x60, 0x64, 0xa2, 0x02, 0x00, 0x48, 0x2f, 0xbd, 0xa0, 0x85, 0x00, 0x01, + 0x10, 0x78, 0x25, 0x6a, 0x10, 0x78, 0x3c, 0x9e, 0x12, 0x7f, 0x00, 0x78, + 0x2b, 0xad, 0x12, 0x7f, 0x00, 0x78, 0x2b, 0xdb, 0x12, 0x7e, 0x20, 0x91, + 0x80, 0x00, 0x20, 0xa9, 0x00, 0x12, 0x20, 0x01, 0xa7, 0x40, 0x20, 0xa0, + 0xa0, 0x06, 0x40, 0xa4, 0x12, 0x7f, 0x00, 0x78, 0x2b, 0xad, 0x7d, 0x38, + 0x7c, 0x3c, 0x00, 0x78, 0x2c, 0x5f, 0x78, 0x24, 0xa0, 0x9c, 0x00, 0xff, + 0xa3, 0x9a, 0x00, 0x03, 0x00, 0xc8, 0x2b, 0xd7, 0x62, 0x50, 0xa0, 0x84, + 0xff, 0x00, 0x80, 0x07, 0xa2, 0x06, 0x00, 0xc0, 0x2f, 0xe9, 0x20, 0x01, + 0xa7, 0x40, 0x20, 0x09, 0x00, 0x0c, 0x7a, 0x2c, 0x7b, 0x28, 0x7c, 0x3c, + 0x7d, 0x38, 0x00, 0x78, 0x36, 0x08, 0x81, 0xff, 0x00, 0xc0, 0x2b, 0xd7, + 0x10, 0x78, 0x35, 0xe4, 0x00, 0x40, 0x2b, 0xdb, 0x60, 0x04, 0xa0, 0x84, + 0x00, 0xff, 0xa0, 0x86, 0x00, 0x06, 0x00, 0xc0, 0x2b, 0xd7, 0x0c, 0x7e, + 0x10, 0x78, 0x35, 0xba, 0x0c, 0x7f, 0x00, 0x40, 0x2b, 0xd7, 0x68, 0x37, + 0x00, 0x00, 0x68, 0x38, 0xc0, 0xfd, 0x68, 0x3a, 0x10, 0x78, 0x8e, 0x5a, + 0x00, 0x40, 0x2b, 0xd7, 0x70, 0x07, 0x00, 0x03, 0x70, 0x1b, 0x30, 0x0b, + 0x00, 0x7c, 0x68, 0x30, 0xa0, 0x86, 0x01, 0x00, 0x00, 0x40, 0x2b, 0xd7, + 0xad, 0x80, 0x00, 0x0e, 0x20, 0x09, 0x00, 0x0c, 0x7a, 0x2c, 0x7b, 0x28, + 0x7c, 0x3c, 0x7d, 0x38, 0x00, 0x78, 0x36, 0x08, 0x10, 0x78, 0x35, 0xba, + 0x00, 0x40, 0x2b, 0xd7, 0x10, 0x78, 0x42, 0xdd, 0x20, 0x09, 0x00, 0x1c, + 0x7a, 0x2c, 0x7b, 0x28, 0x7c, 0x3c, 0x7d, 0x38, 0x10, 0x78, 0x36, 0x04, + 0x70, 0x1b, 0x30, 0x2b, 0x00, 0x7c, 0xad, 0xe8, 0x00, 0x0d, 0x68, 0x00, + 0xa0, 0x05, 0x00, 0x40, 0x2b, 0xdb, 0x68, 0x04, 0xd0, 0xac, 0x00, 0x40, + 0x30, 0x38, 0xd0, 0xa4, 0x00, 0x40, 0x2b, 0xdb, 0xd0, 0x94, 0x00, 0x40, + 0x30, 0x43, 0x0c, 0x7e, 0x20, 0x61, 0x01, 0x00, 0x61, 0x04, 0xa1, 0x8c, + 0xff, 0xdf, 0x61, 0x06, 0x0c, 0x7f, 0xd0, 0x8c, 0x00, 0x40, 0x30, 0x4e, + 0x0c, 0x7e, 0x20, 0x61, 0x01, 0x00, 0x61, 0x04, 0xa1, 0x8d, 0x00, 0x10, + 0x61, 0x06, 0x0c, 0x7f, 0x20, 0x09, 0x01, 0x00, 0x21, 0x0c, 0xa1, 0x8a, + 0x00, 0x02, 0x00, 0x48, 0x30, 0x63, 0xd0, 0x84, 0x00, 0x40, 0x30, 0x63, + 0x6a, 0x28, 0xa2, 0x8a, 0x00, 0x7f, 0x00, 0xc8, 0x2b, 0xdb, 0xa2, 0x88, + 0x29, 0xc0, 0x21, 0x0c, 0xa1, 0x8c, 0x00, 0xff, 0x61, 0x56, 0xd0, 0xdc, + 0x00, 0x40, 0x30, 0x6c, 0x68, 0x28, 0xa0, 0x8a, 0x00, 0x7f, 0x00, 0xc8, + 0x2b, 0xdb, 0x60, 0x52, 0x68, 0x08, 0xa0, 0x8a, 0x01, 0x00, 0x00, 0x48, + 0x2b, 0xdb, 0xa0, 0x8a, 0x08, 0x41, 0x00, 0xc8, 0x2b, 0xdb, 0xa0, 0x84, + 0x00, 0x07, 0x00, 0xc0, 0x2b, 0xdb, 0x68, 0x0c, 0xa0, 0x05, 0x00, 0x40, + 0x2b, 0xdb, 0x68, 0x10, 0xa0, 0x05, 0x00, 0x40, 0x2b, 0xdb, 0x68, 0x48, + 0x69, 0x40, 0xa1, 0x0a, 0x00, 0xc8, 0x2b, 0xdb, 0x80, 0x01, 0x00, 0x40, + 0x2b, 0xdb, 0x68, 0x4c, 0x69, 0x44, 0xa1, 0x0a, 0x00, 0xc8, 0x2b, 0xdb, + 0x80, 0x01, 0x00, 0x40, 0x2b, 0xdb, 0x68, 0x04, 0xd0, 0xfc, 0x00, 0x40, + 0x30, 0xc2, 0x10, 0x78, 0x35, 0xba, 0x00, 0x40, 0x2b, 0xd7, 0x20, 0x09, + 0x00, 0x14, 0x7a, 0x2c, 0x7b, 0x28, 0x7c, 0x3c, 0x7d, 0x38, 0xa2, 0x90, + 0x00, 0x38, 0xa3, 0x99, 0x00, 0x00, 0x10, 0x78, 0x36, 0x04, 0x70, 0x1b, + 0x30, 0xa8, 0x00, 0x7c, 0xad, 0xe8, 0x00, 0x0d, 0x20, 0xa9, 0x00, 0x14, + 0x2d, 0x98, 0x20, 0x69, 0xa7, 0x6e, 0x2d, 0xa0, 0x53, 0xa3, 0x70, 0x10, + 0xa0, 0xe8, 0x00, 0x0d, 0x20, 0x01, 0xa7, 0x72, 0x20, 0x0c, 0xd1, 0xe4, + 0x00, 0x40, 0x30, 0xc2, 0x0c, 0x7e, 0x20, 0x61, 0x01, 0x00, 0x60, 0x04, + 0xa0, 0x85, 0x0b, 0x00, 0x60, 0x06, 0x0c, 0x7f, 0x20, 0xa9, 0x00, 0x1c, + 0x2d, 0x98, 0x20, 0x69, 0xa7, 0x52, 0x2d, 0xa0, 0x53, 0xa3, 0x68, 0x14, + 0xa0, 0x8c, 0x00, 0xff, 0x61, 0x42, 0x80, 0x07, 0xa0, 0x84, 0x00, 0xff, + 0x60, 0x46, 0x10, 0x78, 0x4e, 0xae, 0x10, 0x78, 0x49, 0xce, 0x10, 0x78, + 0x4a, 0x3e, 0x60, 0x00, 0xa0, 0x86, 0x00, 0x00, 0x00, 0xc0, 0x31, 0x4d, + 0x68, 0x08, 0x60, 0x2a, 0x10, 0x78, 0x21, 0xf7, 0x68, 0x18, 0x69, 0x1c, + 0x6a, 0x20, 0x6b, 0x24, 0x80, 0x07, 0x81, 0x0f, 0x82, 0x17, 0x83, 0x1f, + 0x60, 0x16, 0x61, 0x1a, 0x62, 0x1e, 0x63, 0x22, 0x6c, 0x04, 0xd4, 0xf4, + 0x00, 0x40, 0x30, 0xfa, 0x68, 0x30, 0x69, 0x34, 0x6a, 0x38, 0x6b, 0x3c, + 0x80, 0x07, 0x81, 0x0f, 0x82, 0x17, 0x83, 0x1f, 0x00, 0x78, 0x30, 0xfc, + 0xa0, 0x84, 0xf0, 0xff, 0x60, 0x06, 0x61, 0x0a, 0x62, 0x0e, 0x63, 0x12, + 0x10, 0x78, 0x5b, 0x19, 0x69, 0x04, 0xd1, 0xfc, 0x00, 0x40, 0x31, 0x2f, + 0x0c, 0x7e, 0x20, 0x09, 0x00, 0x00, 0x20, 0xa9, 0x00, 0x01, 0x6b, 0x70, + 0xd3, 0x84, 0x00, 0x40, 0x31, 0x2c, 0x00, 0x78, 0x31, 0x16, 0x83, 0x9d, + 0x00, 0xc8, 0x31, 0x2c, 0x35, 0x08, 0x81, 0x09, 0x10, 0x78, 0x54, 0x80, + 0x68, 0x78, 0x60, 0x16, 0x68, 0x74, 0x20, 0x08, 0xa0, 0x84, 0xff, 0x00, + 0x80, 0x07, 0x60, 0x0a, 0xa1, 0x84, 0x00, 0xff, 0x60, 0x06, 0x81, 0x08, + 0x00, 0xc0, 0x31, 0x2a, 0x60, 0x03, 0x00, 0x03, 0x00, 0x78, 0x31, 0x2c, + 0x60, 0x03, 0x00, 0x01, 0x00, 0xf0, 0x31, 0x11, 0x0c, 0x7f, 0x0c, 0x7e, + 0x20, 0x61, 0x01, 0x00, 0x60, 0x2f, 0x00, 0x40, 0x60, 0x2f, 0x00, 0x00, + 0x0c, 0x7f, 0x10, 0x78, 0x38, 0x19, 0x00, 0x40, 0x31, 0x3d, 0x10, 0x78, + 0x25, 0x6a, 0x60, 0xc0, 0xa0, 0x05, 0x00, 0x40, 0x31, 0x49, 0x60, 0x03, + 0x00, 0x01, 0x20, 0x91, 0x30, 0x1d, 0x10, 0x78, 0x42, 0x24, 0x00, 0x78, + 0x31, 0x4d, 0x60, 0x03, 0x00, 0x04, 0x20, 0x91, 0x30, 0x1d, 0x00, 0x78, + 0x2b, 0xad, 0x60, 0x00, 0xa0, 0x86, 0x00, 0x00, 0x00, 0x40, 0x2b, 0xd7, + 0x20, 0x69, 0xa7, 0x52, 0x78, 0x30, 0x68, 0x42, 0x78, 0x34, 0x68, 0x46, + 0x68, 0x04, 0xd0, 0xfc, 0x00, 0x40, 0x31, 0x62, 0x20, 0x09, 0x00, 0x30, + 0x00, 0x78, 0x31, 0x64, 0x20, 0x09, 0x00, 0x1c, 0x2d, 0x00, 0x7a, 0x2c, + 0x7b, 0x28, 0x7c, 0x3c, 0x7d, 0x38, 0x00, 0x78, 0x36, 0x08, 0xa0, 0x06, + 0x10, 0x78, 0x25, 0x6a, 0x81, 0xff, 0x00, 0xc0, 0x2b, 0xd7, 0x10, 0x78, + 0x42, 0xdd, 0x10, 0x78, 0x42, 0x24, 0x00, 0x78, 0x2b, 0xad, 0x81, 0xff, + 0x00, 0xc0, 0x2b, 0xd7, 0x61, 0x84, 0x81, 0xff, 0x00, 0x40, 0x31, 0x91, + 0x70, 0x3f, 0x00, 0x00, 0x20, 0x01, 0xad, 0xc0, 0x20, 0x09, 0x00, 0x40, + 0x7a, 0x2c, 0x7b, 0x28, 0x7c, 0x3c, 0x7d, 0x38, 0x12, 0x7e, 0x20, 0x91, + 0x80, 0x00, 0x10, 0x78, 0x36, 0x08, 0x70, 0x1b, 0x2b, 0xaa, 0x12, 0x7f, + 0x00, 0x7c, 0x70, 0x3f, 0x00, 0x01, 0x0d, 0x7e, 0x20, 0x69, 0xad, 0xc0, + 0x20, 0xa9, 0x00, 0x40, 0x20, 0xa1, 0xad, 0xc0, 0x20, 0x19, 0xff, 0xff, + 0x43, 0xa4, 0x65, 0x50, 0xa5, 0x88, 0x29, 0xc0, 0x21, 0x0c, 0xa1, 0x8c, + 0x00, 0xff, 0x21, 0x6a, 0xa0, 0x0e, 0x20, 0x11, 0x00, 0x02, 0x21, 0x00, + 0xa5, 0x06, 0x00, 0x40, 0x31, 0xc3, 0x10, 0x78, 0x45, 0xc4, 0x00, 0xc0, + 0x31, 0xc3, 0x60, 0x14, 0x82, 0x1c, 0x00, 0x48, 0x31, 0xbb, 0xa3, 0x98, + 0xad, 0xc0, 0xa0, 0x85, 0xff, 0x00, 0x80, 0x07, 0x20, 0x1a, 0x00, 0x78, + 0x31, 0xc2, 0xa3, 0x98, 0xad, 0xc0, 0x23, 0x24, 0xa4, 0xa4, 0xff, 0x00, + 0xa4, 0x05, 0x20, 0x1a, 0x82, 0x10, 0x81, 0x08, 0xa1, 0x82, 0x00, 0x80, + 0x00, 0xc8, 0x31, 0xca, 0x00, 0x78, 0x31, 0xa7, 0x82, 0x01, 0x80, 0x07, + 0x2d, 0x0c, 0xa1, 0x05, 0x20, 0x6a, 0x0d, 0x7f, 0x20, 0xa9, 0x00, 0x40, + 0x20, 0xa1, 0xad, 0xc0, 0x20, 0x99, 0xad, 0xc0, 0x10, 0x78, 0x42, 0x81, + 0x00, 0x78, 0x31, 0x80, 0x10, 0x78, 0x35, 0xe4, 0x00, 0x40, 0x2b, 0xdb, + 0x0c, 0x7e, 0x10, 0x78, 0x35, 0xba, 0x0c, 0x7f, 0x00, 0xc0, 0x31, 0xe8, + 0x20, 0x09, 0x00, 0x02, 0x00, 0x78, 0x2b, 0xd7, 0x20, 0x01, 0xa7, 0x53, + 0x20, 0x04, 0xd0, 0xb4, 0x00, 0x40, 0x32, 0x0f, 0x60, 0x00, 0xd0, 0x8c, + 0x00, 0xc0, 0x32, 0x0f, 0x60, 0x04, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, + 0x00, 0x06, 0x00, 0xc0, 0x32, 0x0f, 0x68, 0x37, 0x00, 0x00, 0x68, 0x38, + 0xc0, 0xfd, 0x68, 0x3a, 0x10, 0x78, 0x8e, 0xae, 0x00, 0xc0, 0x32, 0x06, + 0x20, 0x09, 0x00, 0x03, 0x00, 0x78, 0x2b, 0xd7, 0x70, 0x07, 0x00, 0x03, + 0x70, 0x1b, 0x32, 0x0b, 0x00, 0x7c, 0x10, 0x78, 0x35, 0xe4, 0x00, 0x40, + 0x2b, 0xdb, 0x20, 0xa9, 0x00, 0x2b, 0x2c, 0x98, 0xad, 0xe8, 0x00, 0x02, + 0x2d, 0xa0, 0x53, 0xa3, 0x20, 0xa9, 0x00, 0x04, 0xac, 0x80, 0x00, 0x06, + 0x20, 0x98, 0xad, 0x80, 0x00, 0x06, 0x20, 0xa0, 0x10, 0x78, 0x42, 0x81, + 0x20, 0xa9, 0x00, 0x04, 0xac, 0x80, 0x00, 0x0a, 0x20, 0x98, 0xad, 0x80, + 0x00, 0x0a, 0x20, 0xa0, 0x10, 0x78, 0x42, 0x81, 0x2d, 0x00, 0x20, 0x09, + 0x00, 0x2b, 0x7a, 0x2c, 0x7b, 0x28, 0x7c, 0x3c, 0x7d, 0x38, 0x00, 0x78, + 0x36, 0x08, 0x81, 0xff, 0x00, 0xc0, 0x2b, 0xd7, 0x10, 0x78, 0x35, 0xd2, + 0x00, 0x40, 0x2b, 0xdb, 0x10, 0x78, 0x47, 0xbd, 0x00, 0x78, 0x2b, 0xad, + 0x81, 0xff, 0x00, 0xc0, 0x2b, 0xd7, 0x78, 0x28, 0xa0, 0x8a, 0x10, 0x00, + 0x00, 0xc8, 0x2b, 0xdb, 0x10, 0x78, 0x35, 0xe4, 0x00, 0x40, 0x2b, 0xdb, + 0x10, 0x78, 0x48, 0x2f, 0x00, 0x40, 0x2b, 0xd7, 0x20, 0x19, 0x00, 0x04, + 0x10, 0x78, 0x47, 0xd3, 0x79, 0x24, 0x81, 0x0f, 0x7a, 0x28, 0x10, 0x78, + 0x32, 0x59, 0x00, 0x78, 0x2b, 0xad, 0xa1, 0x86, 0x00, 0xff, 0x00, 0x40, + 0x32, 0x61, 0x10, 0x78, 0x32, 0x71, 0x00, 0x78, 0x32, 0x70, 0x20, 0x29, + 0x00, 0x7e, 0x20, 0x61, 0xa7, 0x00, 0x64, 0x50, 0x24, 0x00, 0xa5, 0x06, + 0x00, 0x40, 0x32, 0x6d, 0x25, 0x08, 0x10, 0x78, 0x32, 0x71, 0x85, 0x29, + 0x00, 0xc8, 0x32, 0x66, 0x00, 0x7c, 0x10, 0x78, 0x45, 0xc4, 0x00, 0xc0, + 0x32, 0x7c, 0x22, 0x00, 0x80, 0x03, 0x80, 0x0b, 0x81, 0x0b, 0xa1, 0x08, + 0x10, 0x78, 0x5a, 0x52, 0x00, 0x7c, 0x81, 0xff, 0x00, 0xc0, 0x2b, 0xd7, + 0x10, 0x78, 0x35, 0xd2, 0x00, 0x40, 0x2b, 0xdb, 0x10, 0x78, 0x46, 0x73, + 0x00, 0x40, 0x2b, 0xd7, 0x10, 0x78, 0x47, 0xc8, 0x00, 0x78, 0x2b, 0xad, + 0x81, 0xff, 0x00, 0xc0, 0x2b, 0xd7, 0x10, 0x78, 0x35, 0xd2, 0x00, 0x40, + 0x2b, 0xdb, 0x10, 0x78, 0x46, 0x73, 0x00, 0x40, 0x2b, 0xd7, 0x10, 0x78, + 0x47, 0xb2, 0x00, 0x78, 0x2b, 0xad, 0x61, 0x00, 0x00, 0x78, 0x2b, 0xad, + 0x10, 0x78, 0x35, 0xe4, 0x00, 0x40, 0x2b, 0xdb, 0x20, 0x01, 0xa7, 0x00, + 0x20, 0x04, 0xa0, 0x86, 0x00, 0x03, 0x00, 0xc0, 0x2b, 0xd7, 0x0d, 0x7e, + 0xac, 0xe8, 0x00, 0x0a, 0x79, 0x24, 0xd1, 0x84, 0x00, 0x40, 0x32, 0xb2, + 0xac, 0xe8, 0x00, 0x06, 0x68, 0x0c, 0x80, 0x07, 0x78, 0x3e, 0x68, 0x08, + 0x80, 0x07, 0x78, 0x3a, 0x6b, 0x04, 0x83, 0x1f, 0x6a, 0x00, 0x82, 0x17, + 0x0d, 0x7f, 0x61, 0x00, 0xa1, 0x8c, 0x02, 0x00, 0x00, 0x78, 0x2b, 0xad, + 0xa0, 0x06, 0x10, 0x78, 0x25, 0x6a, 0x78, 0x24, 0xa0, 0x84, 0x00, 0xff, + 0xa0, 0x86, 0x00, 0xff, 0x00, 0x40, 0x32, 0xcf, 0x81, 0xff, 0x00, 0xc0, + 0x2b, 0xd7, 0x10, 0x78, 0x42, 0xdd, 0x78, 0x28, 0xa0, 0x8a, 0x10, 0x00, + 0x00, 0xc8, 0x2b, 0xdb, 0x79, 0x24, 0xa1, 0x8c, 0xff, 0x00, 0x81, 0x0f, + 0xa1, 0x86, 0x00, 0xff, 0x00, 0x40, 0x32, 0xe5, 0xa1, 0x82, 0x00, 0x7f, + 0x00, 0xc8, 0x2b, 0xdb, 0x21, 0x00, 0x10, 0x78, 0x25, 0x64, 0x02, 0x7e, + 0x0c, 0x7e, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x20, 0x61, 0xa9, 0xc4, + 0x60, 0x1b, 0x00, 0x00, 0x60, 0x1f, 0x00, 0x00, 0x20, 0x11, 0x00, 0x03, + 0x10, 0x78, 0x70, 0xe0, 0x20, 0x11, 0x00, 0x02, 0x10, 0x78, 0x70, 0xea, + 0x10, 0x78, 0x6f, 0xc4, 0x03, 0x7e, 0x20, 0x19, 0x00, 0x00, 0x10, 0x78, + 0x70, 0x58, 0x03, 0x7f, 0x20, 0x61, 0x01, 0x00, 0x60, 0x30, 0xa0, 0x84, + 0x00, 0xff, 0x81, 0x0f, 0xa1, 0x05, 0x60, 0x4a, 0x60, 0x43, 0x00, 0x90, + 0x60, 0x43, 0x00, 0x10, 0x20, 0x09, 0x00, 0x2d, 0x20, 0x11, 0x42, 0x59, + 0x10, 0x78, 0x5a, 0xdd, 0x79, 0x24, 0xa1, 0x8c, 0xff, 0x00, 0x81, 0x0f, + 0x7a, 0x28, 0x10, 0x78, 0x32, 0x59, 0x12, 0x7f, 0x0c, 0x7f, 0x02, 0x7f, + 0x00, 0x78, 0x2b, 0xad, 0x79, 0x24, 0xa1, 0x8c, 0xff, 0x00, 0x81, 0x0f, + 0x0c, 0x7e, 0x10, 0x78, 0x45, 0x5c, 0x2c, 0x08, 0x0c, 0x7f, 0x00, 0xc0, + 0x2b, 0xdb, 0x00, 0x78, 0x2b, 0xad, 0x81, 0xff, 0x00, 0x40, 0x33, 0x32, + 0x20, 0x09, 0x00, 0x01, 0x00, 0x78, 0x2b, 0xd7, 0x60, 0xcc, 0xd0, 0x9c, + 0x00, 0xc0, 0x33, 0x3a, 0x20, 0x09, 0x00, 0x05, 0x00, 0x78, 0x2b, 0xd7, + 0x10, 0x78, 0x35, 0xba, 0x00, 0xc0, 0x33, 0x42, 0x20, 0x09, 0x00, 0x02, + 0x00, 0x78, 0x2b, 0xd7, 0x79, 0x24, 0x7a, 0x2c, 0x7b, 0x28, 0x7c, 0x3c, + 0x7d, 0x38, 0x10, 0x78, 0x36, 0x04, 0x70, 0x1b, 0x33, 0x4c, 0x00, 0x7c, + 0x20, 0x09, 0x00, 0x80, 0x10, 0x78, 0x45, 0xc4, 0x00, 0xc0, 0x33, 0x59, + 0x60, 0x04, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, 0x00, 0x06, 0x00, 0x40, + 0x33, 0x5d, 0x20, 0x21, 0x40, 0x0a, 0x00, 0x78, 0x2b, 0xaf, 0x0d, 0x7e, + 0xad, 0xe8, 0x00, 0x0d, 0x69, 0x00, 0x6a, 0x08, 0x6b, 0x0c, 0x6c, 0x10, + 0x6d, 0x14, 0x6e, 0x18, 0x68, 0x20, 0xa0, 0xbe, 0x01, 0x00, 0x00, 0x40, + 0x33, 0xd0, 0xa0, 0xbe, 0x01, 0x12, 0x00, 0x40, 0x33, 0xd0, 0xa0, 0xbe, + 0x01, 0x13, 0x00, 0x40, 0x33, 0xd0, 0xa0, 0xbe, 0x01, 0x14, 0x00, 0x40, + 0x33, 0xd0, 0xa0, 0xbe, 0x01, 0x17, 0x00, 0x40, 0x33, 0xd0, 0xa0, 0xbe, + 0x01, 0x1a, 0x00, 0x40, 0x33, 0xd0, 0xa0, 0xbe, 0x01, 0x21, 0x00, 0x40, + 0x33, 0xc6, 0xa0, 0xbe, 0x01, 0x31, 0x00, 0x40, 0x33, 0xc6, 0xa0, 0xbe, + 0x01, 0x71, 0x00, 0x40, 0x33, 0xd0, 0xa0, 0xbe, 0x01, 0x73, 0x00, 0x40, + 0x33, 0xd0, 0xa0, 0xbe, 0x01, 0xa1, 0x00, 0xc0, 0x33, 0x98, 0x68, 0x30, + 0x80, 0x07, 0x68, 0x32, 0x00, 0x78, 0x33, 0xd6, 0xa0, 0xbe, 0x02, 0x12, + 0x00, 0x40, 0x33, 0xcc, 0xa0, 0xbe, 0x02, 0x13, 0x00, 0x40, 0x33, 0xcc, + 0xa0, 0xbe, 0x02, 0x14, 0x00, 0x40, 0x33, 0xbe, 0xa0, 0xbe, 0x02, 0x17, + 0x00, 0x40, 0x33, 0xb8, 0xa0, 0xbe, 0x02, 0x1a, 0x00, 0xc0, 0x33, 0xb1, + 0x68, 0x38, 0x80, 0x07, 0x68, 0x3a, 0x00, 0x78, 0x33, 0xd0, 0xa0, 0xbe, + 0x03, 0x00, 0x00, 0x40, 0x33, 0xd0, 0x0d, 0x7f, 0x00, 0x78, 0x2b, 0xdb, + 0xad, 0x80, 0x00, 0x10, 0x20, 0xa9, 0x00, 0x07, 0x10, 0x78, 0x34, 0x18, + 0xad, 0x80, 0x00, 0x0e, 0x20, 0xa9, 0x00, 0x01, 0x10, 0x78, 0x34, 0x18, + 0x00, 0x78, 0x33, 0xd0, 0xad, 0x80, 0x00, 0x0c, 0x10, 0x78, 0x34, 0x26, + 0x00, 0x78, 0x33, 0xd6, 0xad, 0x80, 0x00, 0x0e, 0x10, 0x78, 0x34, 0x26, + 0xad, 0x80, 0x00, 0x0c, 0x20, 0xa9, 0x00, 0x01, 0x10, 0x78, 0x34, 0x18, + 0x0c, 0x7e, 0x10, 0x78, 0x35, 0xba, 0x00, 0x40, 0x34, 0x09, 0x68, 0x38, + 0xc0, 0xfd, 0x68, 0x3a, 0x68, 0x37, 0x01, 0x19, 0x68, 0x53, 0x00, 0x00, + 0x68, 0x4f, 0x00, 0x20, 0x68, 0x5b, 0x00, 0x01, 0x81, 0x0b, 0x69, 0x7e, + 0x68, 0x83, 0x00, 0x00, 0x6a, 0x86, 0x6b, 0x8a, 0x6c, 0x8e, 0x6d, 0x92, + 0x69, 0x96, 0x68, 0x9b, 0x00, 0x00, 0x0c, 0x7f, 0x0d, 0x7f, 0x68, 0x37, + 0x00, 0x00, 0x68, 0x38, 0xc0, 0xfd, 0x68, 0x3a, 0x68, 0x23, 0x00, 0x00, + 0x68, 0x04, 0x20, 0x68, 0x10, 0x78, 0x8e, 0x76, 0x00, 0xc0, 0x34, 0x04, + 0x20, 0x09, 0x00, 0x03, 0x00, 0x78, 0x2b, 0xd7, 0x70, 0x07, 0x00, 0x03, + 0x70, 0x1b, 0x34, 0x0f, 0x00, 0x7c, 0x0c, 0x7f, 0x0d, 0x7f, 0x20, 0x09, + 0x00, 0x02, 0x00, 0x78, 0x2b, 0xd7, 0x68, 0x20, 0xa0, 0x86, 0x80, 0x01, + 0x00, 0xc0, 0x2b, 0xad, 0x20, 0x09, 0x00, 0x04, 0x00, 0x78, 0x2b, 0xd7, + 0x01, 0x7e, 0x20, 0x08, 0x20, 0x44, 0x80, 0x00, 0x20, 0x4c, 0x80, 0x00, + 0x29, 0x0a, 0x81, 0x08, 0x28, 0x0a, 0x81, 0x08, 0x00, 0xf0, 0x34, 0x1a, + 0x01, 0x7f, 0x00, 0x7c, 0x01, 0x7e, 0x0a, 0x7e, 0x0b, 0x7e, 0x20, 0x08, + 0x20, 0x44, 0x80, 0x00, 0x20, 0x4c, 0x80, 0x00, 0x20, 0x54, 0x80, 0x00, + 0x20, 0x5c, 0x2b, 0x0a, 0x81, 0x08, 0x2a, 0x0a, 0x81, 0x08, 0x29, 0x0a, + 0x81, 0x08, 0x28, 0x0a, 0x0b, 0x7f, 0x0a, 0x7f, 0x01, 0x7f, 0x00, 0x7c, + 0x81, 0xff, 0x00, 0x40, 0x34, 0x43, 0x20, 0x09, 0x00, 0x01, 0x00, 0x78, + 0x2b, 0xd7, 0x60, 0xcc, 0xd0, 0x9c, 0x00, 0xc0, 0x34, 0x4b, 0x20, 0x09, + 0x00, 0x05, 0x00, 0x78, 0x2b, 0xd7, 0x79, 0x24, 0x21, 0x40, 0xa1, 0x8c, + 0xff, 0x00, 0x81, 0x0f, 0xa1, 0x82, 0x00, 0x80, 0x00, 0x48, 0x2b, 0xdb, + 0xa1, 0x82, 0x00, 0xff, 0x00, 0xc8, 0x2b, 0xdb, 0x7a, 0x2c, 0x7b, 0x28, + 0x60, 0x6c, 0xa3, 0x06, 0x00, 0xc0, 0x34, 0x66, 0x60, 0x70, 0xa2, 0x4e, + 0x00, 0x40, 0x2b, 0xdb, 0xa9, 0xcc, 0xff, 0x00, 0x00, 0x40, 0x2b, 0xdb, + 0x0c, 0x7e, 0x10, 0x78, 0x35, 0x0f, 0x2c, 0x68, 0x0c, 0x7f, 0x00, 0x40, + 0x34, 0x9e, 0xa0, 0xc6, 0x40, 0x00, 0x00, 0xc0, 0x34, 0x84, 0x0c, 0x7e, + 0x00, 0x7e, 0x2d, 0x60, 0x20, 0x09, 0x00, 0x00, 0x10, 0x78, 0x48, 0x9b, + 0x00, 0xc0, 0x34, 0x7b, 0xc1, 0x85, 0x60, 0x00, 0xd0, 0xbc, 0x00, 0x40, + 0x34, 0x80, 0xc1, 0x8d, 0x00, 0x7f, 0x0c, 0x7f, 0x00, 0x78, 0x34, 0x9b, + 0xa0, 0xc6, 0x40, 0x07, 0x00, 0xc0, 0x34, 0x8b, 0x24, 0x08, 0x00, 0x78, + 0x34, 0x9b, 0xa0, 0xc6, 0x40, 0x08, 0x00, 0xc0, 0x34, 0x93, 0x27, 0x08, + 0x26, 0x10, 0x00, 0x78, 0x34, 0x9b, 0xa0, 0xc6, 0x40, 0x09, 0x00, 0xc0, + 0x34, 0x99, 0x00, 0x78, 0x34, 0x9b, 0x20, 0x01, 0x40, 0x06, 0x20, 0x20, + 0x00, 0x78, 0x2b, 0xaf, 0x2d, 0x00, 0x70, 0x22, 0x01, 0x7e, 0x0b, 0x7e, + 0x0c, 0x7e, 0x0e, 0x7e, 0x2c, 0x70, 0x10, 0x78, 0x76, 0xc7, 0x00, 0x40, + 0x34, 0xe4, 0x2d, 0x00, 0x60, 0x1a, 0x20, 0x01, 0xa7, 0x57, 0x20, 0x04, + 0xa0, 0x84, 0x00, 0xff, 0x68, 0x42, 0x2e, 0x58, 0x0e, 0x7f, 0x0e, 0x7e, + 0x0c, 0x7e, 0x10, 0x78, 0x35, 0xba, 0x0c, 0x7f, 0x2b, 0x70, 0x00, 0xc0, + 0x34, 0xc5, 0x10, 0x78, 0x77, 0x2d, 0x0e, 0x7f, 0x0c, 0x7f, 0x0b, 0x7f, + 0x01, 0x7f, 0x20, 0x09, 0x00, 0x02, 0x00, 0x78, 0x2b, 0xd7, 0x68, 0x37, + 0x00, 0x00, 0x2d, 0x00, 0x60, 0x12, 0x68, 0x33, 0x00, 0x00, 0x68, 0x38, + 0xc0, 0xfd, 0x68, 0x3a, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x10, 0x78, + 0x28, 0x80, 0x12, 0x7f, 0x60, 0x1f, 0x00, 0x01, 0x20, 0x01, 0x00, 0x00, + 0x10, 0x78, 0x44, 0xee, 0x20, 0x01, 0x00, 0x02, 0x10, 0x78, 0x45, 0x02, + 0x20, 0x09, 0x00, 0x02, 0x10, 0x78, 0x77, 0x5c, 0xa0, 0x85, 0x00, 0x01, + 0x0e, 0x7f, 0x0c, 0x7f, 0x0b, 0x7f, 0x01, 0x7f, 0x00, 0xc0, 0x34, 0xee, + 0x20, 0x09, 0x00, 0x03, 0x00, 0x78, 0x2b, 0xd7, 0x70, 0x07, 0x00, 0x03, + 0x70, 0x1b, 0x34, 0xf3, 0x00, 0x7c, 0x68, 0x30, 0xa0, 0x86, 0x01, 0x00, + 0x70, 0x20, 0x20, 0x60, 0x00, 0xc0, 0x35, 0x01, 0x20, 0x09, 0x00, 0x04, + 0x62, 0x04, 0xa2, 0x94, 0x00, 0xff, 0x00, 0x78, 0x2b, 0xd7, 0x20, 0x09, + 0x00, 0x00, 0x10, 0x78, 0x48, 0x9b, 0x00, 0xc0, 0x35, 0x08, 0xc1, 0x85, + 0x60, 0x00, 0xd0, 0xbc, 0x00, 0x40, 0x35, 0x0d, 0xc1, 0x8d, 0x00, 0x78, + 0x2b, 0xad, 0x0e, 0x7e, 0x0d, 0x7e, 0x20, 0x29, 0x00, 0x00, 0x20, 0x21, + 0x00, 0x80, 0x20, 0xa9, 0x00, 0x7f, 0x20, 0x71, 0xa8, 0xb5, 0x2e, 0x04, + 0xa0, 0x05, 0x00, 0xc0, 0x35, 0x24, 0x21, 0x00, 0xa4, 0x06, 0x00, 0xc0, + 0x35, 0x55, 0x24, 0x28, 0x00, 0x78, 0x35, 0x55, 0x20, 0x68, 0x6f, 0x10, + 0x27, 0x00, 0xa3, 0x06, 0x00, 0xc0, 0x35, 0x46, 0x6e, 0x14, 0x26, 0x00, + 0xa2, 0x06, 0x00, 0xc0, 0x35, 0x46, 0x24, 0x00, 0xa1, 0x06, 0x00, 0xc0, + 0x35, 0x42, 0x2d, 0x60, 0xd8, 0x84, 0x00, 0x40, 0x35, 0x6a, 0x60, 0x04, + 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, 0x00, 0x06, 0x00, 0xc0, 0x35, 0x6a, + 0x20, 0x01, 0x40, 0x00, 0x00, 0x78, 0x35, 0x6b, 0x20, 0x01, 0x40, 0x07, + 0x00, 0x78, 0x35, 0x6b, 0x24, 0x00, 0xa1, 0x06, 0x00, 0xc0, 0x35, 0x55, + 0x6e, 0x14, 0x87, 0xff, 0x00, 0xc0, 0x35, 0x51, 0x86, 0xff, 0x00, 0x40, + 0x35, 0x21, 0x20, 0x01, 0x40, 0x08, 0x00, 0x78, 0x35, 0x6b, 0x84, 0x20, + 0x8e, 0x70, 0x00, 0xf0, 0x35, 0x19, 0x85, 0xff, 0x00, 0xc0, 0x35, 0x64, + 0x20, 0x01, 0x40, 0x09, 0x00, 0x78, 0x35, 0x6b, 0x20, 0x01, 0x00, 0x01, + 0x00, 0x78, 0x35, 0x6b, 0x10, 0x78, 0x45, 0x5c, 0x00, 0xc0, 0x35, 0x60, + 0x63, 0x12, 0x62, 0x16, 0xa0, 0x06, 0xa0, 0x05, 0x0d, 0x7f, 0x0e, 0x7f, + 0x00, 0x7c, 0x81, 0xff, 0x00, 0xc0, 0x2b, 0xd7, 0x10, 0x78, 0x35, 0xba, + 0x00, 0x40, 0x2b, 0xd7, 0x68, 0x37, 0x00, 0x00, 0x68, 0x38, 0xc0, 0xfd, + 0x68, 0x3a, 0x78, 0x24, 0xa0, 0x05, 0x00, 0x40, 0x2b, 0xdb, 0xa0, 0x96, + 0x00, 0xff, 0x00, 0x40, 0x35, 0x87, 0xa0, 0x92, 0x00, 0x04, 0x00, 0xc8, + 0x2b, 0xdb, 0x20, 0x10, 0x2d, 0x18, 0x10, 0x78, 0x28, 0x2f, 0x00, 0x40, + 0x2b, 0xd7, 0x70, 0x07, 0x00, 0x03, 0x70, 0x1b, 0x35, 0x92, 0x00, 0x7c, + 0x68, 0x30, 0xa0, 0x86, 0x01, 0x00, 0x00, 0x40, 0x2b, 0xd7, 0x00, 0x78, + 0x2b, 0xad, 0x79, 0x24, 0xa1, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0xa1, 0x82, + 0x00, 0x80, 0x00, 0x48, 0x2b, 0xdb, 0xa1, 0x82, 0x00, 0xff, 0x00, 0xc8, + 0x2b, 0xdb, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x10, 0x78, 0x8d, 0x5b, + 0x00, 0xc0, 0x35, 0xb7, 0xa1, 0x90, 0xa8, 0x35, 0x22, 0x04, 0xa0, 0x65, + 0x00, 0x40, 0x35, 0xb7, 0x10, 0x78, 0x42, 0xf8, 0x12, 0x7f, 0x00, 0x78, + 0x2b, 0xad, 0x12, 0x7f, 0x00, 0x78, 0x2b, 0xd7, 0x10, 0x78, 0x13, 0x8b, + 0x00, 0x40, 0x35, 0xd1, 0xa0, 0x06, 0x68, 0x02, 0x70, 0x10, 0xa0, 0x05, + 0x00, 0xc0, 0x35, 0xc9, 0x2d, 0x00, 0x70, 0x12, 0x70, 0x16, 0x00, 0x78, + 0x35, 0xcf, 0x70, 0x14, 0x68, 0x02, 0x20, 0x60, 0x2d, 0x00, 0x60, 0x06, + 0x70, 0x16, 0xad, 0x80, 0x00, 0x0d, 0x00, 0x7c, 0x79, 0x24, 0x81, 0x0f, + 0xa1, 0x8c, 0x00, 0xff, 0x10, 0x78, 0x45, 0xc4, 0x00, 0xc0, 0x35, 0xe1, + 0x7e, 0x28, 0xa6, 0x84, 0x3f, 0xff, 0xa0, 0x82, 0x40, 0x00, 0x00, 0x48, + 0x35, 0xe2, 0xa0, 0x66, 0x8c, 0xff, 0x00, 0x7c, 0x7e, 0x24, 0x86, 0x0f, + 0xa1, 0x8c, 0x00, 0xff, 0x10, 0x78, 0x45, 0xc4, 0x00, 0xc0, 0x35, 0xf2, + 0xa6, 0xb4, 0x00, 0xff, 0xa6, 0x82, 0x40, 0x00, 0x00, 0x48, 0x35, 0xf3, + 0xa0, 0x66, 0x8c, 0xff, 0x00, 0x7c, 0x01, 0x7e, 0x71, 0x10, 0x81, 0xff, + 0x00, 0x40, 0x36, 0x00, 0x21, 0x68, 0x69, 0x04, 0x10, 0x78, 0x13, 0xa4, + 0x00, 0x78, 0x35, 0xf7, 0x71, 0x12, 0x71, 0x16, 0x01, 0x7f, 0x00, 0x7c, + 0x20, 0x31, 0x00, 0x01, 0x00, 0x78, 0x36, 0x0a, 0x20, 0x31, 0x00, 0x00, + 0x20, 0x61, 0xa7, 0xd2, 0x66, 0x06, 0x61, 0x12, 0x60, 0x0e, 0x62, 0x26, + 0x63, 0x2a, 0x64, 0x2e, 0x65, 0x32, 0x2c, 0x10, 0x10, 0x78, 0x13, 0xdb, + 0x70, 0x07, 0x00, 0x02, 0x70, 0x1b, 0x2b, 0xad, 0x00, 0x7c, 0x0f, 0x7e, + 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x20, 0x79, 0x00, 0x00, 0x20, 0x01, + 0xa7, 0x90, 0x20, 0x04, 0xa0, 0x05, 0x00, 0xc0, 0x36, 0x36, 0x00, 0x68, + 0x36, 0x36, 0x78, 0x18, 0xd0, 0x84, 0x00, 0xc0, 0x36, 0x36, 0x7a, 0x22, + 0x7b, 0x26, 0x7c, 0x2a, 0x78, 0x1b, 0x00, 0x01, 0x20, 0x91, 0x40, 0x80, + 0x00, 0x78, 0x36, 0x5b, 0x01, 0x7e, 0x0c, 0x7e, 0x0e, 0x7e, 0x20, 0x71, + 0xa7, 0x82, 0x71, 0x38, 0xa1, 0x82, 0x00, 0x08, 0x00, 0x48, 0x36, 0x44, + 0x70, 0x30, 0x20, 0x60, 0x00, 0x78, 0x36, 0x55, 0x70, 0x30, 0xa0, 0xe0, + 0x00, 0x08, 0xac, 0x82, 0xa7, 0xd2, 0x00, 0x48, 0x36, 0x4d, 0x20, 0x61, + 0xa7, 0x92, 0x2c, 0x00, 0x70, 0x32, 0x81, 0xff, 0x00, 0xc0, 0x36, 0x53, + 0x70, 0x36, 0x81, 0x08, 0x71, 0x3a, 0x22, 0x62, 0x63, 0x06, 0x64, 0x0a, + 0x0e, 0x7f, 0x0c, 0x7f, 0x01, 0x7f, 0x12, 0x7f, 0x0f, 0x7f, 0x00, 0x7c, + 0x0e, 0x7e, 0x20, 0x71, 0xa7, 0x82, 0x70, 0x38, 0xa0, 0x05, 0x00, 0x40, + 0x36, 0x97, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x00, 0x68, 0x36, 0x96, + 0x0f, 0x7e, 0x20, 0x79, 0x00, 0x00, 0x78, 0x18, 0xd0, 0x84, 0x00, 0xc0, + 0x36, 0x95, 0x0c, 0x7e, 0x70, 0x34, 0x20, 0x60, 0x2c, 0x04, 0x78, 0x22, + 0x60, 0x04, 0x78, 0x26, 0x60, 0x08, 0x78, 0x2a, 0x78, 0x1b, 0x00, 0x01, + 0x20, 0x91, 0x40, 0x80, 0x70, 0x38, 0x80, 0x01, 0x70, 0x3a, 0xa0, 0x05, + 0x00, 0xc0, 0x36, 0x8b, 0x70, 0x33, 0xa7, 0x92, 0x70, 0x37, 0xa7, 0x92, + 0x0c, 0x7f, 0x00, 0x78, 0x36, 0x95, 0xac, 0x80, 0x00, 0x08, 0xa0, 0xfa, + 0xa7, 0xd2, 0x00, 0x48, 0x36, 0x93, 0x20, 0x01, 0xa7, 0x92, 0x70, 0x36, + 0x0c, 0x7f, 0x0f, 0x7f, 0x12, 0x7f, 0x0e, 0x7f, 0x00, 0x7c, 0x02, 0x7e, + 0x20, 0x01, 0xa7, 0x53, 0x20, 0x04, 0xd0, 0xc4, 0x00, 0x40, 0x36, 0xa4, + 0x20, 0x11, 0x80, 0x14, 0x10, 0x78, 0x36, 0x1b, 0x02, 0x7f, 0x00, 0x7c, + 0x81, 0xff, 0x00, 0xc0, 0x2b, 0xd7, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, + 0x60, 0x30, 0xc0, 0x8d, 0xc0, 0x85, 0xc0, 0xac, 0x60, 0x32, 0x10, 0x78, + 0x42, 0x24, 0x12, 0x7f, 0x00, 0x78, 0x2b, 0xad, 0x81, 0xff, 0x00, 0xc0, + 0x2b, 0xd7, 0x60, 0x00, 0xa0, 0x86, 0x00, 0x03, 0x00, 0xc0, 0x2b, 0xd7, + 0x20, 0x01, 0xa7, 0x53, 0x20, 0x04, 0xd0, 0xac, 0x00, 0xc0, 0x2b, 0xd7, + 0x10, 0x78, 0x35, 0xe4, 0x00, 0x40, 0x2b, 0xdb, 0x60, 0x04, 0xa0, 0x84, + 0x00, 0xff, 0xa0, 0x86, 0x00, 0x06, 0x00, 0xc0, 0x36, 0xd3, 0x78, 0x28, + 0xa0, 0x05, 0x00, 0x40, 0x2b, 0xad, 0x0c, 0x7e, 0x10, 0x78, 0x35, 0xba, + 0x0c, 0x7f, 0x00, 0x40, 0x2b, 0xd7, 0x68, 0x37, 0x00, 0x00, 0x68, 0x33, + 0x00, 0x00, 0x68, 0x38, 0xc0, 0xfd, 0x68, 0x3a, 0x10, 0x78, 0x8f, 0x22, + 0x00, 0x40, 0x2b, 0xd7, 0x70, 0x07, 0x00, 0x03, 0x70, 0x1b, 0x36, 0xe9, + 0x00, 0x7c, 0x68, 0x30, 0xa0, 0x86, 0x01, 0x00, 0x00, 0x40, 0x2b, 0xd7, + 0x00, 0x78, 0x2b, 0xad, 0x20, 0x01, 0xa7, 0x00, 0x20, 0x04, 0xa0, 0x86, + 0x00, 0x03, 0x00, 0xc0, 0x2b, 0xd7, 0x7f, 0x24, 0x7a, 0x2c, 0x7b, 0x28, + 0x7c, 0x3c, 0x7d, 0x38, 0x10, 0x78, 0x35, 0xba, 0x00, 0x40, 0x2b, 0xd7, + 0x20, 0x09, 0x00, 0x00, 0x20, 0x31, 0x00, 0x00, 0x70, 0x23, 0x00, 0x00, + 0x70, 0x2f, 0x00, 0x00, 0xad, 0x80, 0x00, 0x05, 0x70, 0x26, 0x20, 0xa0, + 0x10, 0x78, 0x45, 0xc4, 0x00, 0xc0, 0x37, 0x6d, 0x60, 0x04, 0xa0, 0xc4, + 0x00, 0xff, 0xa8, 0xc6, 0x00, 0x06, 0x00, 0x40, 0x37, 0x1d, 0xa0, 0xc4, + 0xff, 0x00, 0xa8, 0xc6, 0x06, 0x00, 0x00, 0xc0, 0x37, 0x6d, 0x20, 0x01, + 0xa7, 0x53, 0x20, 0x04, 0xd0, 0xac, 0x00, 0xc0, 0x37, 0x2a, 0x10, 0x78, + 0x48, 0x9b, 0x00, 0xc0, 0x37, 0x2a, 0xd7, 0x9c, 0x00, 0x40, 0x37, 0x6d, + 0xd7, 0x94, 0x00, 0xc0, 0x37, 0x30, 0xd7, 0x84, 0x00, 0x40, 0x37, 0x3c, + 0xac, 0x80, 0x00, 0x06, 0x20, 0x98, 0x34, 0x00, 0x20, 0xa9, 0x00, 0x04, + 0x53, 0xa3, 0x10, 0x78, 0x34, 0x26, 0xd7, 0x94, 0x00, 0x40, 0x37, 0x45, + 0xac, 0x80, 0x00, 0x0a, 0x20, 0x98, 0x34, 0x00, 0x20, 0xa9, 0x00, 0x04, + 0x53, 0xa3, 0x10, 0x78, 0x34, 0x26, 0x21, 0xa2, 0xd7, 0x94, 0x00, 0x40, + 0x37, 0x65, 0xac, 0x80, 0x00, 0x00, 0x20, 0x98, 0x94, 0xa0, 0x20, 0xa9, + 0x00, 0x02, 0x53, 0xa3, 0xac, 0x80, 0x00, 0x03, 0x20, 0xa6, 0x94, 0xa0, + 0xac, 0x80, 0x00, 0x04, 0x20, 0x98, 0x34, 0x00, 0x20, 0xa9, 0x00, 0x02, + 0x53, 0xa3, 0x10, 0x78, 0x34, 0x18, 0xac, 0x80, 0x00, 0x26, 0x20, 0x98, + 0x20, 0xa9, 0x00, 0x02, 0x53, 0xa3, 0x00, 0x78, 0x37, 0x66, 0x94, 0xa0, + 0xd7, 0x94, 0x00, 0x40, 0x37, 0x6b, 0xa6, 0xb0, 0x00, 0x0b, 0xa6, 0xb0, + 0x00, 0x05, 0x81, 0x08, 0xd7, 0x8c, 0x00, 0x40, 0x37, 0x77, 0xa1, 0x86, + 0x01, 0x00, 0x00, 0x40, 0x37, 0x88, 0x00, 0x78, 0x37, 0x7b, 0xa1, 0x86, + 0x00, 0x7e, 0x00, 0x40, 0x37, 0x88, 0xd7, 0x94, 0x00, 0x40, 0x37, 0x82, + 0xa6, 0x86, 0x00, 0x20, 0x00, 0x78, 0x37, 0x84, 0xa6, 0x86, 0x00, 0x28, + 0x00, 0x40, 0x37, 0x91, 0x00, 0x78, 0x37, 0x0c, 0x86, 0xff, 0x00, 0xc0, + 0x37, 0x8f, 0x71, 0x20, 0x81, 0x0b, 0x00, 0x78, 0x2b, 0xad, 0x70, 0x2f, + 0x00, 0x01, 0x71, 0x1e, 0x70, 0x20, 0xa6, 0x00, 0x70, 0x22, 0x77, 0x2a, + 0x20, 0x61, 0xa7, 0xd2, 0x60, 0x07, 0x00, 0x00, 0x66, 0x12, 0x70, 0x24, + 0x60, 0x0e, 0x62, 0x26, 0x63, 0x2a, 0x64, 0x2e, 0x65, 0x32, 0x2c, 0x10, + 0x10, 0x78, 0x13, 0xdb, 0x70, 0x07, 0x00, 0x02, 0x70, 0x1b, 0x37, 0xa9, + 0x00, 0x7c, 0x70, 0x2c, 0xa0, 0x05, 0x00, 0xc0, 0x37, 0xbb, 0x71, 0x1c, + 0x70, 0x24, 0x20, 0xa0, 0x77, 0x28, 0x20, 0x31, 0x00, 0x00, 0x20, 0x61, + 0xa7, 0xd2, 0x62, 0x24, 0x63, 0x28, 0x64, 0x2c, 0x65, 0x30, 0x00, 0x78, + 0x37, 0x0c, 0x71, 0x20, 0x81, 0x0b, 0x00, 0x78, 0x2b, 0xad, 0x20, 0x29, + 0x00, 0x7e, 0x79, 0x24, 0x7a, 0x28, 0x7b, 0x2c, 0x7c, 0x38, 0xa1, 0x84, + 0xff, 0x00, 0x80, 0x07, 0xa0, 0xe2, 0x00, 0x20, 0x00, 0x48, 0x2b, 0xdb, + 0xa5, 0x02, 0x00, 0x48, 0x2b, 0xdb, 0xa1, 0x84, 0x00, 0xff, 0xa0, 0xe2, + 0x00, 0x20, 0x00, 0x48, 0x2b, 0xdb, 0xa5, 0x02, 0x00, 0x48, 0x2b, 0xdb, + 0xa2, 0x84, 0xff, 0x00, 0x80, 0x07, 0xa0, 0xe2, 0x00, 0x20, 0x00, 0x48, + 0x2b, 0xdb, 0xa5, 0x02, 0x00, 0x48, 0x2b, 0xdb, 0xa2, 0x84, 0x00, 0xff, + 0xa0, 0xe2, 0x00, 0x20, 0x00, 0x48, 0x2b, 0xdb, 0xa5, 0x02, 0x00, 0x48, + 0x2b, 0xdb, 0xa3, 0x84, 0xff, 0x00, 0x80, 0x07, 0xa0, 0xe2, 0x00, 0x20, + 0x00, 0x48, 0x2b, 0xdb, 0xa5, 0x02, 0x00, 0x48, 0x2b, 0xdb, 0xa3, 0x84, + 0x00, 0xff, 0xa0, 0xe2, 0x00, 0x20, 0x00, 0x48, 0x2b, 0xdb, 0xa5, 0x02, + 0x00, 0x48, 0x2b, 0xdb, 0xa4, 0x84, 0xff, 0x00, 0x80, 0x07, 0xa0, 0xe2, + 0x00, 0x20, 0x00, 0x48, 0x2b, 0xdb, 0xa5, 0x02, 0x00, 0x48, 0x2b, 0xdb, + 0xa4, 0x84, 0x00, 0xff, 0xa0, 0xe2, 0x00, 0x20, 0x00, 0x48, 0x2b, 0xdb, + 0xa5, 0x02, 0x00, 0x48, 0x2b, 0xdb, 0x20, 0x61, 0xa9, 0xa5, 0x61, 0x02, + 0x62, 0x06, 0x63, 0x0a, 0x64, 0x0e, 0x00, 0x78, 0x2b, 0xad, 0x00, 0x7e, + 0x20, 0x01, 0xa7, 0x53, 0x20, 0x04, 0xd0, 0xcc, 0x00, 0x7f, 0x00, 0x7c, + 0x00, 0x7e, 0x20, 0x01, 0xa7, 0x72, 0x20, 0x04, 0xd0, 0xbc, 0x00, 0x7f, + 0x00, 0x7c, 0x61, 0x64, 0x7a, 0x24, 0x63, 0x00, 0x82, 0xff, 0x00, 0xc0, + 0x38, 0x30, 0x79, 0x26, 0x00, 0x78, 0x2b, 0xad, 0x83, 0xff, 0x00, 0xc0, + 0x2b, 0xdb, 0x20, 0x01, 0xff, 0xf0, 0xa2, 0x00, 0x00, 0xc8, 0x2b, 0xdb, + 0x20, 0x19, 0xff, 0xff, 0x60, 0x68, 0xa3, 0x02, 0xa2, 0x00, 0x00, 0x48, + 0x2b, 0xdb, 0x79, 0x26, 0x62, 0x66, 0x00, 0x78, 0x2b, 0xad, 0x20, 0x01, + 0xa7, 0x00, 0x20, 0x04, 0xa0, 0x86, 0x00, 0x03, 0x00, 0xc0, 0x2b, 0xd7, + 0x7c, 0x28, 0x7d, 0x24, 0x7e, 0x38, 0x7f, 0x2c, 0x10, 0x78, 0x35, 0xba, + 0x00, 0x40, 0x2b, 0xd7, 0x20, 0x09, 0x00, 0x00, 0x20, 0x19, 0x00, 0x00, + 0x70, 0x23, 0x00, 0x00, 0x70, 0x2f, 0x00, 0x00, 0xad, 0x80, 0x00, 0x03, + 0x70, 0x26, 0x20, 0xa0, 0xa1, 0xe0, 0xa8, 0x35, 0x2c, 0x64, 0x8c, 0xff, + 0x00, 0x40, 0x38, 0x7d, 0x60, 0x04, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, + 0x00, 0x06, 0x00, 0x40, 0x38, 0x72, 0x60, 0x04, 0xa0, 0x84, 0xff, 0x00, + 0xa0, 0x86, 0x06, 0x00, 0x00, 0xc0, 0x38, 0x7d, 0x60, 0x14, 0x20, 0xa2, + 0x94, 0xa0, 0x60, 0x10, 0x80, 0x07, 0xa1, 0x05, 0x80, 0x07, 0x20, 0xa2, + 0x94, 0xa0, 0xa3, 0x98, 0x00, 0x02, 0x81, 0x08, 0xa1, 0x82, 0x00, 0xff, + 0x00, 0x40, 0x38, 0x88, 0xa3, 0x86, 0x00, 0x2a, 0x00, 0x40, 0x38, 0x91, + 0x00, 0x78, 0x38, 0x5e, 0x83, 0xff, 0x00, 0xc0, 0x38, 0x8f, 0x71, 0x20, + 0x81, 0x0c, 0x00, 0x78, 0x2b, 0xad, 0x70, 0x2f, 0x00, 0x01, 0x71, 0x1e, + 0x70, 0x20, 0xa3, 0x00, 0x70, 0x22, 0x20, 0x61, 0xa7, 0xd2, 0x60, 0x07, + 0x00, 0x00, 0x63, 0x12, 0x70, 0x24, 0x60, 0x0e, 0x64, 0x26, 0x65, 0x2a, + 0x66, 0x2e, 0x67, 0x32, 0x2c, 0x10, 0x10, 0x78, 0x13, 0xdb, 0x70, 0x07, + 0x00, 0x02, 0x70, 0x1b, 0x38, 0xa8, 0x00, 0x7c, 0x70, 0x2c, 0xa0, 0x05, + 0x00, 0xc0, 0x38, 0xb9, 0x71, 0x1c, 0x70, 0x24, 0x20, 0xa0, 0x20, 0x19, + 0x00, 0x00, 0x20, 0x61, 0xa7, 0xd2, 0x64, 0x24, 0x65, 0x28, 0x66, 0x2c, + 0x67, 0x30, 0x00, 0x78, 0x38, 0x5e, 0x71, 0x20, 0x81, 0x0c, 0x00, 0x78, + 0x2b, 0xad, 0x81, 0xff, 0x00, 0xc0, 0x2b, 0xd7, 0x60, 0xcc, 0xd0, 0x9c, + 0x00, 0x40, 0x2b, 0xd7, 0x10, 0x78, 0x35, 0xba, 0x00, 0x40, 0x2b, 0xd7, + 0x79, 0x24, 0x7a, 0x2c, 0x7b, 0x28, 0x7c, 0x3c, 0x7d, 0x38, 0x10, 0x78, + 0x36, 0x04, 0x70, 0x1b, 0x38, 0xd2, 0x00, 0x7c, 0x0d, 0x7e, 0xad, 0xe8, + 0x00, 0x0d, 0x68, 0x28, 0xa0, 0xbe, 0x70, 0x00, 0x00, 0x40, 0x38, 0xe5, + 0xa0, 0xbe, 0x71, 0x00, 0x00, 0x40, 0x38, 0xe5, 0xa0, 0xbe, 0x72, 0x00, + 0x00, 0x40, 0x38, 0xe5, 0x0d, 0x7f, 0x00, 0x78, 0x2b, 0xdb, 0x68, 0x20, + 0x69, 0x24, 0x10, 0x78, 0x25, 0x4d, 0x00, 0xc0, 0x39, 0x10, 0x10, 0x78, + 0x45, 0x5c, 0x00, 0xc0, 0x39, 0x10, 0x71, 0x22, 0x66, 0x12, 0x65, 0x16, + 0x6e, 0x18, 0x0c, 0x7e, 0x10, 0x78, 0x35, 0xba, 0x00, 0x40, 0x39, 0x10, + 0x10, 0x78, 0x35, 0xba, 0x00, 0x40, 0x39, 0x10, 0x0c, 0x7f, 0x0d, 0x7f, + 0x68, 0x37, 0x00, 0x00, 0x68, 0x38, 0xc0, 0xfd, 0x68, 0x3a, 0x68, 0x23, + 0x00, 0x00, 0x68, 0x04, 0x20, 0x68, 0x10, 0x78, 0x8e, 0x92, 0x00, 0x40, + 0x2b, 0xd7, 0x70, 0x07, 0x00, 0x03, 0x70, 0x1b, 0x39, 0x13, 0x00, 0x7c, + 0x0d, 0x7f, 0x00, 0x78, 0x2b, 0xd7, 0x71, 0x20, 0x10, 0x78, 0x29, 0x8e, + 0x68, 0x20, 0xa0, 0x86, 0x80, 0x01, 0x00, 0x40, 0x2b, 0xd7, 0x2d, 0x00, + 0x70, 0x1e, 0x68, 0x04, 0xa0, 0x80, 0x00, 0x02, 0x00, 0x7e, 0x20, 0xa9, + 0x00, 0x2a, 0x20, 0x98, 0x20, 0xa0, 0x10, 0x78, 0x42, 0x81, 0x00, 0x7f, + 0xad, 0xe8, 0x00, 0x0d, 0x6a, 0x08, 0x6b, 0x0c, 0x6c, 0x10, 0x6d, 0x14, + 0x20, 0x61, 0xa7, 0xd2, 0x60, 0x07, 0x00, 0x00, 0x6e, 0x00, 0x6f, 0x28, + 0xa7, 0xc6, 0x70, 0x00, 0x00, 0xc0, 0x39, 0x3a, 0x00, 0x78, 0x39, 0x3e, + 0xa7, 0xc6, 0x71, 0x00, 0x00, 0xc0, 0x39, 0x46, 0xa6, 0xc2, 0x00, 0x04, + 0x00, 0x48, 0x2b, 0xdb, 0x20, 0x09, 0x00, 0x04, 0x00, 0x78, 0x36, 0x08, + 0xa7, 0xc6, 0x72, 0x00, 0x00, 0xc0, 0x2b, 0xdb, 0xa6, 0xc2, 0x00, 0x54, + 0x00, 0x48, 0x2b, 0xdb, 0x60, 0x0e, 0x60, 0x13, 0x00, 0x2a, 0x62, 0x26, + 0x63, 0x2a, 0x64, 0x2e, 0x65, 0x32, 0x2c, 0x10, 0x10, 0x78, 0x13, 0xdb, + 0x70, 0x07, 0x00, 0x02, 0x70, 0x1b, 0x39, 0x5d, 0x00, 0x7c, 0x70, 0x1c, + 0x20, 0x68, 0x68, 0x04, 0xa0, 0x80, 0x00, 0x01, 0x20, 0x04, 0xa0, 0x80, + 0x00, 0x02, 0x00, 0x7e, 0x20, 0xa9, 0x00, 0x2a, 0x20, 0x98, 0x20, 0xa0, + 0x10, 0x78, 0x42, 0x81, 0x00, 0x7f, 0x20, 0x09, 0x00, 0x2a, 0x20, 0x61, + 0xa7, 0xd2, 0x62, 0x24, 0x63, 0x28, 0x64, 0x2c, 0x65, 0x30, 0x00, 0x78, + 0x36, 0x08, 0x81, 0xff, 0x00, 0xc0, 0x2b, 0xd7, 0x79, 0x2c, 0x20, 0x01, + 0xa9, 0x9d, 0x21, 0x02, 0x10, 0x78, 0x35, 0xd2, 0x00, 0x40, 0x2b, 0xdb, + 0x10, 0x78, 0x46, 0x73, 0x00, 0x40, 0x2b, 0xd7, 0x12, 0x7e, 0x20, 0x91, + 0x80, 0x00, 0x10, 0x78, 0x47, 0xde, 0x12, 0x7f, 0x00, 0x78, 0x2b, 0xad, + 0x78, 0x24, 0xd0, 0x8c, 0x00, 0xc0, 0x39, 0x95, 0xd0, 0x84, 0x00, 0x40, + 0x31, 0xda, 0x10, 0x78, 0x35, 0xe4, 0x00, 0x40, 0x2b, 0xdb, 0x0c, 0x7e, + 0x10, 0x78, 0x35, 0xba, 0x0c, 0x7f, 0x00, 0xc0, 0x39, 0xa3, 0x20, 0x09, + 0x00, 0x02, 0x00, 0x78, 0x2b, 0xd7, 0x60, 0x04, 0xa0, 0x84, 0x00, 0xff, + 0xa0, 0x86, 0x00, 0x06, 0x00, 0x40, 0x39, 0xb0, 0xa0, 0x8e, 0x00, 0x04, + 0x00, 0x40, 0x39, 0xb0, 0xa0, 0x8e, 0x00, 0x05, 0x00, 0xc0, 0x39, 0xdd, + 0x78, 0x24, 0xd0, 0x8c, 0x00, 0x40, 0x39, 0xbb, 0x60, 0x00, 0xc0, 0x8c, + 0x60, 0x02, 0x00, 0x78, 0x39, 0xc5, 0x20, 0x01, 0xa7, 0x53, 0x20, 0x04, + 0xd0, 0xb4, 0x00, 0x40, 0x32, 0x0f, 0x60, 0x00, 0xd0, 0x8c, 0x00, 0xc0, + 0x32, 0x0f, 0x68, 0x37, 0x00, 0x00, 0x68, 0x38, 0xc0, 0xfd, 0x68, 0x3a, + 0x10, 0x78, 0x8e, 0xae, 0x00, 0xc0, 0x39, 0xd2, 0x20, 0x09, 0x00, 0x03, + 0x00, 0x78, 0x2b, 0xd7, 0x70, 0x07, 0x00, 0x03, 0x70, 0x1b, 0x39, 0xd7, + 0x00, 0x7c, 0x10, 0x78, 0x35, 0xe4, 0x00, 0x40, 0x2b, 0xdb, 0x00, 0x78, + 0x32, 0x0f, 0x20, 0x09, 0xa7, 0x2f, 0x21, 0x0c, 0x81, 0xff, 0x00, 0x40, + 0x39, 0xe7, 0x20, 0x09, 0x00, 0x01, 0x00, 0x78, 0x2b, 0xd7, 0x20, 0x01, + 0xa7, 0x00, 0x20, 0x04, 0xa0, 0x86, 0x00, 0x03, 0x00, 0x40, 0x39, 0xf2, + 0x20, 0x09, 0x00, 0x07, 0x00, 0x78, 0x2b, 0xd7, 0x20, 0x01, 0xa7, 0x53, + 0x20, 0x04, 0xd0, 0xac, 0x00, 0x40, 0x39, 0xfc, 0x20, 0x09, 0x00, 0x08, + 0x00, 0x78, 0x2b, 0xd7, 0x60, 0x9c, 0xd0, 0xa4, 0x00, 0xc0, 0x3a, 0x03, + 0xd0, 0xac, 0x00, 0xc0, 0x32, 0x0f, 0x68, 0x37, 0x00, 0x00, 0x68, 0x33, + 0x00, 0x00, 0x68, 0x38, 0xc0, 0xfd, 0x68, 0x3a, 0x10, 0x78, 0x8f, 0x22, + 0x00, 0xc0, 0x3a, 0x12, 0x20, 0x09, 0x00, 0x03, 0x00, 0x78, 0x2b, 0xd7, + 0x70, 0x07, 0x00, 0x03, 0x70, 0x1b, 0x3a, 0x17, 0x00, 0x7c, 0x68, 0x30, + 0xa0, 0x86, 0x01, 0x00, 0x00, 0xc0, 0x3a, 0x20, 0x20, 0x09, 0x00, 0x04, + 0x00, 0x78, 0x2b, 0xd7, 0x10, 0x78, 0x35, 0xe4, 0x00, 0x40, 0x2b, 0xdb, + 0x00, 0x78, 0x39, 0xb2, 0x81, 0xff, 0x20, 0x09, 0x00, 0x01, 0x00, 0xc0, + 0x2b, 0xd7, 0x60, 0x00, 0xa0, 0x86, 0x00, 0x03, 0x20, 0x09, 0x00, 0x07, + 0x00, 0xc0, 0x2b, 0xd7, 0x20, 0x01, 0xa7, 0x53, 0x20, 0x04, 0xd0, 0xac, + 0x20, 0x09, 0x00, 0x08, 0x00, 0xc0, 0x2b, 0xd7, 0x10, 0x78, 0x35, 0xe4, + 0x00, 0x40, 0x2b, 0xdb, 0x60, 0x04, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, + 0x00, 0x06, 0x20, 0x09, 0x00, 0x09, 0x00, 0xc0, 0x2b, 0xd7, 0x0c, 0x7e, + 0x10, 0x78, 0x35, 0xba, 0x0c, 0x7f, 0x20, 0x09, 0x00, 0x02, 0x00, 0x40, + 0x2b, 0xd7, 0x68, 0x37, 0x00, 0x00, 0x68, 0x33, 0x00, 0x00, 0x68, 0x38, + 0xc0, 0xfd, 0x68, 0x3a, 0x79, 0x28, 0xa1, 0x94, 0xff, 0x00, 0xa1, 0x8c, + 0x00, 0xff, 0xa0, 0x06, 0x82, 0xff, 0x00, 0xc0, 0x3a, 0x65, 0xc0, 0xed, + 0x69, 0x52, 0x79, 0x2c, 0x69, 0x56, 0x00, 0x78, 0x3a, 0x6e, 0xa2, 0x8e, + 0x01, 0x00, 0x00, 0xc0, 0x2b, 0xdb, 0xc0, 0xe5, 0x68, 0x53, 0x00, 0x00, + 0x68, 0x57, 0x00, 0x00, 0x68, 0x3e, 0x10, 0x78, 0x90, 0xcd, 0x20, 0x09, + 0x00, 0x03, 0x00, 0x40, 0x2b, 0xd7, 0x70, 0x07, 0x00, 0x03, 0x70, 0x1b, + 0x3a, 0x7a, 0x00, 0x7c, 0x68, 0x30, 0xa0, 0x86, 0x01, 0x00, 0x20, 0x09, + 0x00, 0x04, 0x00, 0x40, 0x2b, 0xd7, 0x00, 0x78, 0x2b, 0xad, 0x81, 0xff, + 0x20, 0x09, 0x00, 0x01, 0x00, 0xc0, 0x2b, 0xd7, 0x60, 0x00, 0xa0, 0x86, + 0x00, 0x03, 0x20, 0x09, 0x00, 0x07, 0x00, 0xc0, 0x2b, 0xd7, 0x10, 0x78, + 0x35, 0xe4, 0x00, 0x40, 0x2b, 0xdb, 0x60, 0x04, 0xa0, 0x84, 0x00, 0xff, + 0xa0, 0x86, 0x00, 0x06, 0x20, 0x09, 0x00, 0x09, 0x00, 0xc0, 0x2b, 0xd7, + 0x0c, 0x7e, 0x10, 0x78, 0x35, 0xba, 0x0c, 0x7f, 0x20, 0x09, 0x00, 0x02, + 0x00, 0x40, 0x2b, 0xd7, 0xad, 0x80, 0x00, 0x0f, 0x20, 0x09, 0x00, 0x08, + 0x7a, 0x2c, 0x7b, 0x28, 0x7c, 0x3c, 0x7d, 0x38, 0x10, 0x78, 0x36, 0x04, + 0x70, 0x1b, 0x3a, 0xb1, 0x00, 0x7c, 0x0d, 0x7e, 0xad, 0xe8, 0x00, 0x0f, + 0x68, 0x00, 0xa0, 0x86, 0x05, 0x00, 0x00, 0xc0, 0x3a, 0xc4, 0x68, 0x04, + 0xa0, 0x05, 0x00, 0xc0, 0x3a, 0xc4, 0x68, 0x08, 0xa0, 0x84, 0xff, 0x00, + 0x00, 0xc0, 0x3a, 0xc4, 0x00, 0x78, 0x3a, 0xc7, 0x0d, 0x7f, 0x00, 0xc0, + 0x2b, 0xdb, 0x0d, 0x7f, 0x68, 0x37, 0x00, 0x00, 0x68, 0x33, 0x00, 0x00, + 0x68, 0x38, 0xc0, 0xfd, 0x68, 0x3a, 0x0c, 0x7e, 0x10, 0x78, 0x35, 0xe4, + 0x00, 0xc0, 0x3a, 0xd7, 0x0c, 0x7f, 0x00, 0x78, 0x2b, 0xdb, 0x10, 0x78, + 0x91, 0x29, 0x20, 0x09, 0x00, 0x03, 0x0c, 0x7f, 0x00, 0x40, 0x2b, 0xd7, + 0x70, 0x07, 0x00, 0x03, 0x70, 0x1b, 0x3a, 0xe3, 0x00, 0x7c, 0x68, 0x30, + 0xa0, 0x86, 0x01, 0x00, 0x20, 0x09, 0x00, 0x04, 0x00, 0x40, 0x2b, 0xd7, + 0x00, 0x78, 0x2b, 0xad, 0x12, 0x7e, 0x0c, 0x7e, 0x0e, 0x7e, 0x20, 0x61, + 0x01, 0x00, 0x20, 0x71, 0xa7, 0x00, 0x60, 0x44, 0xd0, 0xa4, 0x00, 0xc0, + 0x3b, 0x15, 0xd0, 0x84, 0x00, 0x40, 0x3a, 0xfe, 0x10, 0x78, 0x3c, 0x75, + 0x00, 0x78, 0x3b, 0x11, 0xd0, 0x8c, 0x00, 0x40, 0x3b, 0x05, 0x10, 0x78, + 0x3b, 0x8c, 0x00, 0x78, 0x3b, 0x11, 0xd0, 0x94, 0x00, 0x40, 0x3b, 0x0c, + 0x10, 0x78, 0x3b, 0x60, 0x00, 0x78, 0x3b, 0x11, 0xd0, 0x9c, 0x00, 0x40, + 0x3b, 0x11, 0x10, 0x78, 0x3b, 0x1f, 0x0e, 0x7f, 0x0c, 0x7f, 0x12, 0x7f, + 0x00, 0x7c, 0x01, 0x7e, 0x61, 0x28, 0xd1, 0x9c, 0x00, 0xc0, 0x3b, 0x1c, + 0xc1, 0x9d, 0x61, 0x2a, 0x01, 0x7f, 0x00, 0x78, 0x3b, 0x11, 0x62, 0x4c, + 0xa2, 0x86, 0xf0, 0xf0, 0x00, 0xc0, 0x3b, 0x30, 0x60, 0x48, 0xa0, 0x86, + 0xf0, 0xf0, 0x00, 0x40, 0x3b, 0x30, 0x62, 0x4a, 0x60, 0x43, 0x00, 0x90, + 0x60, 0x43, 0x00, 0x10, 0x00, 0x78, 0x3b, 0x5f, 0xa2, 0x94, 0xff, 0x00, + 0xa2, 0x96, 0xf7, 0x00, 0x00, 0x40, 0x3b, 0x45, 0x71, 0x34, 0xd1, 0xa4, + 0x00, 0xc0, 0x3b, 0x45, 0x62, 0x40, 0xa2, 0x94, 0x00, 0x10, 0x00, 0x40, + 0x3b, 0x45, 0x20, 0x09, 0x00, 0xf7, 0x10, 0x78, 0x42, 0xa1, 0x00, 0x78, + 0x3b, 0x5f, 0x60, 0x43, 0x00, 0x40, 0x60, 0x43, 0x00, 0x00, 0x70, 0x77, + 0x00, 0x00, 0x70, 0x8f, 0x00, 0x01, 0x70, 0xb3, 0x00, 0x00, 0x70, 0xcf, + 0x00, 0x00, 0x20, 0x09, 0xad, 0xc0, 0x20, 0x0b, 0x00, 0x00, 0x70, 0x87, + 0x00, 0x00, 0x70, 0x7b, 0x00, 0x0f, 0x20, 0x09, 0x00, 0x0f, 0x20, 0x11, + 0x41, 0xd5, 0x10, 0x78, 0x5a, 0xdd, 0x00, 0x7c, 0x15, 0x7e, 0x70, 0x78, + 0xa0, 0x05, 0x00, 0xc0, 0x3b, 0x8a, 0x20, 0x11, 0x41, 0xd5, 0x10, 0x78, + 0x5a, 0x45, 0x60, 0x40, 0xa0, 0x94, 0x00, 0x10, 0xa2, 0x85, 0x00, 0x20, + 0x60, 0x42, 0x20, 0xa9, 0x00, 0xc8, 0x60, 0x44, 0xd0, 0x8c, 0x00, 0xc0, + 0x3b, 0x83, 0x00, 0xf0, 0x3b, 0x71, 0x62, 0x42, 0x70, 0x8b, 0x00, 0x00, + 0x60, 0x40, 0xa0, 0x94, 0x00, 0x10, 0xa2, 0x85, 0x00, 0x80, 0x60, 0x42, + 0x62, 0x42, 0x00, 0x78, 0x3b, 0x8a, 0x62, 0x42, 0x70, 0x8b, 0x00, 0x00, + 0x70, 0x7f, 0x00, 0x00, 0x00, 0x78, 0x3b, 0x8a, 0x15, 0x7f, 0x00, 0x7c, + 0x70, 0x7c, 0xa0, 0x8a, 0x00, 0x03, 0x00, 0xc8, 0x3b, 0x95, 0x10, 0x79, + 0x3b, 0x98, 0x00, 0x78, 0x3b, 0x97, 0x10, 0x78, 0x13, 0x32, 0x00, 0x7c, + 0x3b, 0x9b, 0x3b, 0xea, 0x3c, 0x74, 0x0f, 0x7e, 0x70, 0x7f, 0x00, 0x01, + 0x20, 0xe1, 0xa0, 0x00, 0x20, 0xe1, 0x87, 0x00, 0x10, 0x78, 0x21, 0xf7, + 0x20, 0xe1, 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, 0x20, 0x79, 0xac, 0x00, + 0x20, 0x7b, 0x22, 0x00, 0x78, 0x07, 0x00, 0xef, 0x78, 0x0b, 0x00, 0x00, + 0x78, 0x0f, 0x00, 0xef, 0x78, 0x13, 0x01, 0x38, 0x78, 0x17, 0x00, 0x00, + 0x78, 0x1b, 0x00, 0x00, 0x78, 0x1f, 0x00, 0x00, 0x78, 0x23, 0xff, 0xff, + 0x78, 0x27, 0xff, 0xff, 0x78, 0x2b, 0x00, 0x00, 0x78, 0x2f, 0x00, 0x00, + 0x20, 0x79, 0xac, 0x0c, 0x20, 0x7b, 0x11, 0x01, 0x78, 0x07, 0x00, 0x00, + 0x20, 0x99, 0xa7, 0x05, 0x20, 0xa1, 0xac, 0x0e, 0x20, 0xa9, 0x00, 0x04, + 0x53, 0xa3, 0x20, 0x79, 0xac, 0x12, 0x20, 0x7b, 0x00, 0x00, 0x78, 0x07, + 0x00, 0x00, 0x20, 0x99, 0xac, 0x00, 0x20, 0xa1, 0x02, 0x0b, 0x20, 0xa9, + 0x00, 0x14, 0x53, 0xa6, 0x60, 0xc3, 0x00, 0x0c, 0x60, 0x0f, 0x00, 0x00, + 0x10, 0x78, 0x42, 0x0b, 0x0f, 0x7f, 0x70, 0x83, 0x00, 0x00, 0x60, 0x43, + 0x00, 0x08, 0x60, 0x43, 0x00, 0x00, 0x00, 0x7c, 0x0d, 0x7e, 0x70, 0x80, + 0x70, 0x83, 0x00, 0x00, 0xa0, 0x25, 0x00, 0x40, 0x3c, 0x5e, 0x60, 0x20, + 0xd0, 0xb4, 0x00, 0xc0, 0x3c, 0x5c, 0x71, 0x8c, 0x81, 0xff, 0x00, 0x40, + 0x3c, 0x4b, 0xa4, 0x86, 0x00, 0x0c, 0x00, 0xc0, 0x3c, 0x56, 0xa4, 0x80, + 0x00, 0x18, 0x80, 0x04, 0x20, 0xa8, 0x20, 0x11, 0xac, 0x80, 0x20, 0x19, + 0xac, 0x00, 0x22, 0x0c, 0x23, 0x04, 0xa1, 0x06, 0x00, 0xc0, 0x3c, 0x22, + 0x82, 0x10, 0x83, 0x18, 0x00, 0xf0, 0x3c, 0x05, 0x60, 0x43, 0x00, 0x04, + 0x60, 0x8b, 0xbc, 0x94, 0x60, 0x8f, 0xf0, 0xf0, 0x60, 0x43, 0x00, 0x06, + 0x70, 0x7f, 0x00, 0x02, 0x70, 0x8b, 0x00, 0x02, 0x20, 0x09, 0x07, 0xd0, + 0x20, 0x11, 0x41, 0xdc, 0x10, 0x78, 0x5a, 0xdd, 0x00, 0x78, 0x3c, 0x5c, + 0x20, 0x69, 0xac, 0x80, 0x69, 0x30, 0xa1, 0x8e, 0x11, 0x01, 0x00, 0xc0, + 0x3c, 0x56, 0x68, 0x34, 0xa0, 0x05, 0x00, 0xc0, 0x3c, 0x56, 0x69, 0x00, + 0xa1, 0x8c, 0x00, 0xff, 0x00, 0xc0, 0x3c, 0x36, 0x68, 0x04, 0xa0, 0x05, + 0x00, 0x40, 0x3c, 0x4b, 0x20, 0x11, 0xac, 0x8e, 0x20, 0x19, 0xa7, 0x05, + 0x20, 0xa9, 0x00, 0x04, 0x22, 0x0c, 0x23, 0x04, 0xa1, 0x02, 0x00, 0x48, + 0x3c, 0x49, 0x00, 0xc0, 0x3c, 0x56, 0x82, 0x10, 0x83, 0x18, 0x00, 0xf0, + 0x3c, 0x3c, 0x00, 0x78, 0x3c, 0x56, 0x70, 0x8f, 0x00, 0x00, 0x20, 0xe1, + 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, 0x20, 0x99, 0xac, 0x80, 0x20, 0xa1, + 0x02, 0x0b, 0x20, 0xa9, 0x00, 0x14, 0x53, 0xa6, 0x60, 0x43, 0x00, 0x08, + 0x60, 0x43, 0x00, 0x00, 0x00, 0x78, 0x3c, 0x5e, 0x0d, 0x7f, 0x00, 0x7c, + 0x60, 0x20, 0xd0, 0xb4, 0x00, 0xc0, 0x3c, 0x5c, 0x60, 0xc3, 0x00, 0x0c, + 0x20, 0x11, 0xa9, 0xbb, 0x20, 0x13, 0x00, 0x00, 0x70, 0x83, 0x00, 0x00, + 0x20, 0xe1, 0x90, 0x80, 0x60, 0xa3, 0x00, 0x56, 0x60, 0xa7, 0x95, 0x75, + 0x10, 0x78, 0x6e, 0x06, 0x00, 0x78, 0x3c, 0x5c, 0x00, 0x7c, 0x70, 0x88, + 0xa0, 0x8a, 0x00, 0x1d, 0x00, 0xc8, 0x3c, 0x7e, 0x10, 0x79, 0x3c, 0x81, + 0x00, 0x78, 0x3c, 0x80, 0x10, 0x78, 0x13, 0x32, 0x00, 0x7c, 0x3c, 0xab, + 0x3c, 0xba, 0x3c, 0xe9, 0x3d, 0x02, 0x3d, 0x2e, 0x3d, 0x5a, 0x3d, 0x86, + 0x3d, 0xbc, 0x3d, 0xe8, 0x3e, 0x10, 0x3e, 0x53, 0x3e, 0x7d, 0x3e, 0x9f, + 0x3e, 0xb5, 0x3e, 0xdb, 0x3e, 0xee, 0x3e, 0xf7, 0x3f, 0x2b, 0x3f, 0x57, + 0x3f, 0x83, 0x3f, 0xaf, 0x3f, 0xe5, 0x40, 0x30, 0x40, 0x5f, 0x40, 0x81, + 0x40, 0xc3, 0x40, 0xe9, 0x41, 0x02, 0x41, 0x03, 0x0c, 0x7e, 0x20, 0x61, + 0xa7, 0x00, 0x60, 0x03, 0x00, 0x07, 0x20, 0x61, 0x01, 0x00, 0x60, 0x04, + 0xa0, 0x84, 0xff, 0xf9, 0x60, 0x06, 0x0c, 0x7f, 0x00, 0x7c, 0x60, 0x8b, + 0xbc, 0x94, 0x60, 0x8f, 0xf0, 0xf0, 0x60, 0x43, 0x00, 0x02, 0x70, 0x8b, + 0x00, 0x01, 0x20, 0x09, 0x07, 0xd0, 0x20, 0x11, 0x41, 0xdc, 0x10, 0x78, + 0x5a, 0xdd, 0x00, 0x7c, 0x0f, 0x7e, 0x70, 0x80, 0xa0, 0x86, 0x00, 0x14, + 0x00, 0xc0, 0x3c, 0xe7, 0x60, 0x43, 0x00, 0x00, 0x60, 0x20, 0xd0, 0xb4, + 0x00, 0xc0, 0x3c, 0xe7, 0x20, 0x79, 0xac, 0x80, 0x7a, 0x30, 0xa2, 0x96, + 0x11, 0x02, 0x00, 0xc0, 0x3c, 0xe5, 0x78, 0x34, 0xa0, 0x05, 0x00, 0xc0, + 0x3c, 0xe5, 0x7a, 0x38, 0xd2, 0xfc, 0x00, 0x40, 0x3c, 0xdb, 0x70, 0xb0, + 0xa0, 0x05, 0x00, 0xc0, 0x3c, 0xdb, 0x70, 0xb3, 0x00, 0x01, 0x20, 0x11, + 0x41, 0xdc, 0x10, 0x78, 0x5a, 0x45, 0x70, 0x8b, 0x00, 0x10, 0x10, 0x78, + 0x3e, 0xf7, 0x00, 0x78, 0x3c, 0xe7, 0x10, 0x78, 0x42, 0x24, 0x0f, 0x7f, + 0x00, 0x7c, 0x70, 0x8b, 0x00, 0x03, 0x60, 0x43, 0x00, 0x04, 0x20, 0x11, + 0x41, 0xdc, 0x10, 0x78, 0x5a, 0x45, 0x10, 0x78, 0x42, 0x89, 0x20, 0xa3, + 0x11, 0x02, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa9, 0x00, 0x0a, 0x20, 0xa3, + 0x00, 0x00, 0x00, 0xf0, 0x3c, 0xf9, 0x60, 0xc3, 0x00, 0x14, 0x10, 0x78, + 0x42, 0x0b, 0x00, 0x7c, 0x0f, 0x7e, 0x70, 0x80, 0xa0, 0x05, 0x00, 0x40, + 0x3d, 0x2c, 0x20, 0x11, 0x41, 0xdc, 0x10, 0x78, 0x5a, 0x45, 0xa0, 0x86, + 0x00, 0x14, 0x00, 0xc0, 0x3d, 0x2a, 0x20, 0x79, 0xac, 0x80, 0x7a, 0x30, + 0xa2, 0x96, 0x11, 0x02, 0x00, 0xc0, 0x3d, 0x2a, 0x78, 0x34, 0xa0, 0x05, + 0x00, 0xc0, 0x3d, 0x2a, 0x7a, 0x38, 0xd2, 0xfc, 0x00, 0x40, 0x3d, 0x24, + 0x70, 0xb0, 0xa0, 0x05, 0x00, 0xc0, 0x3d, 0x24, 0x70, 0xb3, 0x00, 0x01, + 0x70, 0x8b, 0x00, 0x04, 0x10, 0x78, 0x3d, 0x2e, 0x00, 0x78, 0x3d, 0x2c, + 0x10, 0x78, 0x42, 0x24, 0x0f, 0x7f, 0x00, 0x7c, 0x70, 0x8b, 0x00, 0x05, + 0x10, 0x78, 0x42, 0x89, 0x20, 0xa3, 0x11, 0x03, 0x20, 0xa3, 0x00, 0x00, + 0x34, 0x30, 0x20, 0x11, 0xac, 0x8e, 0x10, 0x78, 0x42, 0xd4, 0x00, 0xc0, + 0x3d, 0x4c, 0x70, 0x74, 0xa0, 0x05, 0x00, 0xc0, 0x3d, 0x4c, 0x71, 0x50, + 0xa1, 0x86, 0xff, 0xff, 0x00, 0x40, 0x3d, 0x4c, 0x10, 0x78, 0x41, 0x9d, + 0x00, 0x40, 0x3d, 0x4c, 0x10, 0x78, 0x42, 0xb8, 0x20, 0xa9, 0x00, 0x08, + 0x22, 0x98, 0x26, 0xa0, 0x53, 0xa6, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x60, 0xc3, 0x00, 0x14, 0x10, 0x78, 0x42, 0x0b, 0x00, 0x7c, + 0x0f, 0x7e, 0x70, 0x80, 0xa0, 0x05, 0x00, 0x40, 0x3d, 0x84, 0x20, 0x11, + 0x41, 0xdc, 0x10, 0x78, 0x5a, 0x45, 0xa0, 0x86, 0x00, 0x14, 0x00, 0xc0, + 0x3d, 0x82, 0x20, 0x79, 0xac, 0x80, 0x7a, 0x30, 0xa2, 0x96, 0x11, 0x03, + 0x00, 0xc0, 0x3d, 0x82, 0x78, 0x34, 0xa0, 0x05, 0x00, 0xc0, 0x3d, 0x82, + 0x7a, 0x38, 0xd2, 0xfc, 0x00, 0x40, 0x3d, 0x7c, 0x70, 0xb0, 0xa0, 0x05, + 0x00, 0xc0, 0x3d, 0x7c, 0x70, 0xb3, 0x00, 0x01, 0x70, 0x8b, 0x00, 0x06, + 0x10, 0x78, 0x3d, 0x86, 0x00, 0x78, 0x3d, 0x84, 0x10, 0x78, 0x42, 0x24, + 0x0f, 0x7f, 0x00, 0x7c, 0x70, 0x8b, 0x00, 0x07, 0x10, 0x78, 0x42, 0x89, + 0x20, 0xa3, 0x11, 0x04, 0x20, 0xa3, 0x00, 0x00, 0x34, 0x30, 0x20, 0x11, + 0xac, 0x8e, 0x10, 0x78, 0x42, 0xd4, 0x00, 0xc0, 0x3d, 0xae, 0x70, 0x74, + 0xa0, 0x05, 0x00, 0xc0, 0x3d, 0xae, 0x71, 0x54, 0xa1, 0x86, 0xff, 0xff, + 0x00, 0x40, 0x3d, 0xae, 0xa1, 0x80, 0x29, 0xc0, 0x20, 0x0c, 0xa1, 0x8c, + 0xff, 0x00, 0x81, 0x0f, 0x10, 0x78, 0x41, 0x9d, 0x00, 0x40, 0x3d, 0xae, + 0x10, 0x78, 0x38, 0x20, 0x00, 0x40, 0x3d, 0xae, 0x10, 0x78, 0x25, 0x6a, + 0x20, 0xa9, 0x00, 0x08, 0x22, 0x98, 0x26, 0xa0, 0x53, 0xa6, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, 0x00, 0x14, 0x10, 0x78, + 0x42, 0x0b, 0x00, 0x7c, 0x0f, 0x7e, 0x70, 0x80, 0xa0, 0x05, 0x00, 0x40, + 0x3d, 0xe6, 0x20, 0x11, 0x41, 0xdc, 0x10, 0x78, 0x5a, 0x45, 0xa0, 0x86, + 0x00, 0x14, 0x00, 0xc0, 0x3d, 0xe4, 0x20, 0x79, 0xac, 0x80, 0x7a, 0x30, + 0xa2, 0x96, 0x11, 0x04, 0x00, 0xc0, 0x3d, 0xe4, 0x78, 0x34, 0xa0, 0x05, + 0x00, 0xc0, 0x3d, 0xe4, 0x7a, 0x38, 0xd2, 0xfc, 0x00, 0x40, 0x3d, 0xde, + 0x70, 0xb0, 0xa0, 0x05, 0x00, 0xc0, 0x3d, 0xde, 0x70, 0xb3, 0x00, 0x01, + 0x70, 0x8b, 0x00, 0x08, 0x10, 0x78, 0x3d, 0xe8, 0x00, 0x78, 0x3d, 0xe6, + 0x10, 0x78, 0x42, 0x24, 0x0f, 0x7f, 0x00, 0x7c, 0x70, 0x8b, 0x00, 0x09, + 0x10, 0x78, 0x42, 0x89, 0x20, 0xa3, 0x11, 0x05, 0x20, 0xa3, 0x01, 0x00, + 0x34, 0x30, 0x10, 0x78, 0x42, 0xd4, 0x00, 0xc0, 0x3e, 0x01, 0x70, 0x74, + 0xa0, 0x05, 0x00, 0xc0, 0x3e, 0x01, 0x10, 0x78, 0x41, 0x04, 0x00, 0xc0, + 0x3e, 0x0b, 0xa0, 0x85, 0x00, 0x01, 0x10, 0x78, 0x25, 0x6a, 0x20, 0xa9, + 0x00, 0x08, 0x20, 0x99, 0xac, 0x8e, 0x26, 0xa0, 0x53, 0xa6, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, 0x00, 0x14, 0x10, 0x78, + 0x42, 0x0b, 0x00, 0x7c, 0x0f, 0x7e, 0x70, 0x80, 0xa0, 0x05, 0x00, 0x40, + 0x3e, 0x51, 0x20, 0x11, 0x41, 0xdc, 0x10, 0x78, 0x5a, 0x45, 0xa0, 0x86, + 0x00, 0x14, 0x00, 0xc0, 0x3e, 0x4f, 0x20, 0x79, 0xac, 0x80, 0x7a, 0x30, + 0xa2, 0x96, 0x11, 0x05, 0x00, 0xc0, 0x3e, 0x4f, 0x78, 0x34, 0x20, 0x11, + 0x01, 0x00, 0xa2, 0x1e, 0x00, 0xc0, 0x3e, 0x3a, 0x7a, 0x38, 0xd2, 0xfc, + 0x00, 0x40, 0x3e, 0x34, 0x70, 0xb0, 0xa0, 0x05, 0x00, 0xc0, 0x3e, 0x34, + 0x70, 0xb3, 0x00, 0x01, 0x70, 0x8b, 0x00, 0x0a, 0x10, 0x78, 0x3e, 0x53, + 0x00, 0x78, 0x3e, 0x51, 0xa0, 0x05, 0x00, 0xc0, 0x3e, 0x4f, 0x7a, 0x38, + 0xd2, 0xfc, 0x00, 0x40, 0x3e, 0x47, 0x70, 0xb0, 0xa0, 0x05, 0x00, 0xc0, + 0x3e, 0x47, 0x70, 0xb3, 0x00, 0x01, 0x70, 0x87, 0x00, 0x00, 0x70, 0x8b, + 0x00, 0x0e, 0x10, 0x78, 0x3e, 0xdb, 0x00, 0x78, 0x3e, 0x51, 0x10, 0x78, + 0x42, 0x24, 0x0f, 0x7f, 0x00, 0x7c, 0x70, 0x8b, 0x00, 0x0b, 0x20, 0x11, + 0xac, 0x0e, 0x22, 0xa0, 0x20, 0xa9, 0x00, 0x40, 0x20, 0x19, 0xff, 0xff, + 0x43, 0xa4, 0x20, 0xa9, 0x00, 0x02, 0x20, 0x09, 0x00, 0x00, 0x41, 0xa4, + 0x10, 0x78, 0x42, 0x89, 0x20, 0xa3, 0x11, 0x06, 0x20, 0xa3, 0x00, 0x00, + 0x10, 0x78, 0x42, 0xd4, 0x00, 0x40, 0x3e, 0x70, 0x20, 0x13, 0x00, 0x00, + 0x00, 0x78, 0x3e, 0x74, 0x60, 0x30, 0xa0, 0x85, 0x01, 0x00, 0x20, 0x12, + 0x22, 0x98, 0x20, 0xa9, 0x00, 0x42, 0x53, 0xa6, 0x60, 0xc3, 0x00, 0x84, + 0x10, 0x78, 0x42, 0x0b, 0x00, 0x7c, 0x0f, 0x7e, 0x70, 0x80, 0xa0, 0x05, + 0x00, 0x40, 0x3e, 0x9d, 0x20, 0x11, 0x41, 0xdc, 0x10, 0x78, 0x5a, 0x45, + 0xa0, 0x86, 0x00, 0x84, 0x00, 0xc0, 0x3e, 0x9b, 0x20, 0x79, 0xac, 0x80, + 0x7a, 0x30, 0xa2, 0x96, 0x11, 0x06, 0x00, 0xc0, 0x3e, 0x9b, 0x78, 0x34, + 0xa0, 0x05, 0x00, 0xc0, 0x3e, 0x9b, 0x70, 0x8b, 0x00, 0x0c, 0x10, 0x78, + 0x3e, 0x9f, 0x00, 0x78, 0x3e, 0x9d, 0x10, 0x78, 0x42, 0x24, 0x0f, 0x7f, + 0x00, 0x7c, 0x70, 0x8b, 0x00, 0x0d, 0x10, 0x78, 0x42, 0x89, 0x20, 0xa3, + 0x11, 0x07, 0x20, 0xa3, 0x00, 0x00, 0x20, 0x99, 0xac, 0x8e, 0x20, 0xa9, + 0x00, 0x40, 0x53, 0xa6, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x60, 0xc3, 0x00, 0x84, 0x10, 0x78, 0x42, 0x0b, 0x00, 0x7c, 0x0f, 0x7e, + 0x70, 0x80, 0xa0, 0x05, 0x00, 0x40, 0x3e, 0xd9, 0x20, 0x11, 0x41, 0xdc, + 0x10, 0x78, 0x5a, 0x45, 0xa0, 0x86, 0x00, 0x84, 0x00, 0xc0, 0x3e, 0xd7, + 0x20, 0x79, 0xac, 0x80, 0x7a, 0x30, 0xa2, 0x96, 0x11, 0x07, 0x00, 0xc0, + 0x3e, 0xd7, 0x78, 0x34, 0xa0, 0x05, 0x00, 0xc0, 0x3e, 0xd7, 0x70, 0x87, + 0x00, 0x01, 0x10, 0x78, 0x42, 0x7b, 0x70, 0x8b, 0x00, 0x0e, 0x10, 0x78, + 0x3e, 0xdb, 0x00, 0x78, 0x3e, 0xd9, 0x10, 0x78, 0x42, 0x24, 0x0f, 0x7f, + 0x00, 0x7c, 0x70, 0x8b, 0x00, 0x0f, 0x70, 0x83, 0x00, 0x00, 0x60, 0x8b, + 0xbc, 0x85, 0x60, 0x8f, 0xb5, 0xb5, 0x60, 0x43, 0x00, 0x05, 0x60, 0x43, + 0x00, 0x04, 0x20, 0x09, 0x07, 0xd0, 0x20, 0x11, 0x41, 0xdc, 0x10, 0x78, + 0x5a, 0x38, 0x00, 0x7c, 0x70, 0x80, 0xa0, 0x05, 0x00, 0x40, 0x3e, 0xf6, + 0x20, 0x11, 0x41, 0xdc, 0x10, 0x78, 0x5a, 0x45, 0x00, 0x7c, 0x70, 0x8b, + 0x00, 0x11, 0x10, 0x78, 0x42, 0xd4, 0x00, 0xc0, 0x3f, 0x14, 0x71, 0x6c, + 0x81, 0xff, 0x00, 0x40, 0x3f, 0x14, 0x20, 0x09, 0x00, 0x00, 0x70, 0x70, + 0xa0, 0x84, 0x00, 0xff, 0x10, 0x78, 0x25, 0x4d, 0xa1, 0x86, 0x00, 0x7e, + 0x00, 0x40, 0x3f, 0x14, 0xa1, 0x86, 0x00, 0x80, 0x00, 0x40, 0x3f, 0x14, + 0x20, 0x11, 0xac, 0x8e, 0x10, 0x78, 0x41, 0x9d, 0x20, 0xe1, 0x90, 0x80, + 0x20, 0xe1, 0x40, 0x00, 0x20, 0x99, 0xac, 0x80, 0x20, 0xa1, 0x02, 0x0b, + 0x74, 0x80, 0xa4, 0x80, 0x00, 0x18, 0xa0, 0x80, 0x00, 0x07, 0xa0, 0x84, + 0x03, 0xf8, 0x80, 0x04, 0x20, 0xa8, 0x53, 0xa6, 0x60, 0xc3, 0x00, 0x14, + 0x10, 0x78, 0x42, 0x0b, 0x00, 0x7c, 0x0f, 0x7e, 0x70, 0x80, 0xa0, 0x05, + 0x00, 0x40, 0x3f, 0x55, 0x20, 0x11, 0x41, 0xdc, 0x10, 0x78, 0x5a, 0x45, + 0xa0, 0x86, 0x00, 0x14, 0x00, 0xc0, 0x3f, 0x53, 0x20, 0x79, 0xac, 0x80, + 0x7a, 0x30, 0xa2, 0x96, 0x11, 0x03, 0x00, 0xc0, 0x3f, 0x53, 0x78, 0x34, + 0xa0, 0x05, 0x00, 0xc0, 0x3f, 0x53, 0x7a, 0x38, 0xd2, 0xfc, 0x00, 0x40, + 0x3f, 0x4d, 0x70, 0xb0, 0xa0, 0x05, 0x00, 0xc0, 0x3f, 0x4d, 0x70, 0xb3, + 0x00, 0x01, 0x70, 0x8b, 0x00, 0x12, 0x10, 0x78, 0x3f, 0x57, 0x00, 0x78, + 0x3f, 0x55, 0x10, 0x78, 0x42, 0x24, 0x0f, 0x7f, 0x00, 0x7c, 0x70, 0x8b, + 0x00, 0x13, 0x10, 0x78, 0x42, 0x95, 0x20, 0xa3, 0x11, 0x03, 0x20, 0xa3, + 0x00, 0x00, 0x34, 0x30, 0x20, 0x11, 0xac, 0x8e, 0x10, 0x78, 0x42, 0xd4, + 0x00, 0xc0, 0x3f, 0x75, 0x70, 0x74, 0xa0, 0x05, 0x00, 0xc0, 0x3f, 0x75, + 0x71, 0x50, 0xa1, 0x86, 0xff, 0xff, 0x00, 0x40, 0x3f, 0x75, 0x10, 0x78, + 0x41, 0x9d, 0x00, 0x40, 0x3f, 0x75, 0x10, 0x78, 0x42, 0xb8, 0x20, 0xa9, + 0x00, 0x08, 0x22, 0x98, 0x26, 0xa0, 0x53, 0xa6, 0x20, 0xa3, 0x00, 0x00, + 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, 0x00, 0x14, 0x10, 0x78, 0x42, 0x0b, + 0x00, 0x7c, 0x0f, 0x7e, 0x70, 0x80, 0xa0, 0x05, 0x00, 0x40, 0x3f, 0xad, + 0x20, 0x11, 0x41, 0xdc, 0x10, 0x78, 0x5a, 0x45, 0xa0, 0x86, 0x00, 0x14, + 0x00, 0xc0, 0x3f, 0xab, 0x20, 0x79, 0xac, 0x80, 0x7a, 0x30, 0xa2, 0x96, + 0x11, 0x04, 0x00, 0xc0, 0x3f, 0xab, 0x78, 0x34, 0xa0, 0x05, 0x00, 0xc0, + 0x3f, 0xab, 0x7a, 0x38, 0xd2, 0xfc, 0x00, 0x40, 0x3f, 0xa5, 0x70, 0xb0, + 0xa0, 0x05, 0x00, 0xc0, 0x3f, 0xa5, 0x70, 0xb3, 0x00, 0x01, 0x70, 0x8b, + 0x00, 0x14, 0x10, 0x78, 0x3f, 0xaf, 0x00, 0x78, 0x3f, 0xad, 0x10, 0x78, + 0x42, 0x24, 0x0f, 0x7f, 0x00, 0x7c, 0x70, 0x8b, 0x00, 0x15, 0x10, 0x78, + 0x42, 0x95, 0x20, 0xa3, 0x11, 0x04, 0x20, 0xa3, 0x00, 0x00, 0x34, 0x30, + 0x20, 0x11, 0xac, 0x8e, 0x10, 0x78, 0x42, 0xd4, 0x00, 0xc0, 0x3f, 0xd7, + 0x70, 0x74, 0xa0, 0x05, 0x00, 0xc0, 0x3f, 0xd7, 0x71, 0x54, 0xa1, 0x86, + 0xff, 0xff, 0x00, 0x40, 0x3f, 0xd7, 0xa1, 0x80, 0x29, 0xc0, 0x20, 0x0c, + 0xa1, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0x10, 0x78, 0x41, 0x9d, 0x00, 0x40, + 0x3f, 0xd7, 0x10, 0x78, 0x38, 0x20, 0x00, 0x40, 0x3f, 0xd7, 0x10, 0x78, + 0x25, 0x6a, 0x20, 0xa9, 0x00, 0x08, 0x22, 0x98, 0x26, 0xa0, 0x53, 0xa6, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, 0x00, 0x14, + 0x10, 0x78, 0x42, 0x0b, 0x00, 0x7c, 0x0f, 0x7e, 0x70, 0x80, 0xa0, 0x05, + 0x00, 0x40, 0x40, 0x2e, 0x20, 0x11, 0x41, 0xdc, 0x10, 0x78, 0x5a, 0x45, + 0xa0, 0x86, 0x00, 0x14, 0x00, 0xc0, 0x40, 0x2c, 0x20, 0x79, 0xac, 0x80, + 0x7a, 0x30, 0xa2, 0x96, 0x11, 0x05, 0x00, 0xc0, 0x40, 0x2c, 0x78, 0x34, + 0x20, 0x11, 0x01, 0x00, 0xa2, 0x1e, 0x00, 0xc0, 0x40, 0x0b, 0x7a, 0x38, + 0xd2, 0xfc, 0x00, 0x40, 0x40, 0x09, 0x70, 0xb0, 0xa0, 0x05, 0x00, 0xc0, + 0x40, 0x09, 0x70, 0xb3, 0x00, 0x01, 0x00, 0x78, 0x40, 0x1a, 0xa0, 0x05, + 0x00, 0xc0, 0x40, 0x2c, 0x7a, 0x38, 0xd2, 0xfc, 0x00, 0x40, 0x40, 0x18, + 0x70, 0xb0, 0xa0, 0x05, 0x00, 0xc0, 0x40, 0x18, 0x70, 0xb3, 0x00, 0x01, + 0x70, 0x87, 0x00, 0x00, 0x7a, 0x38, 0xd2, 0xf4, 0x00, 0x40, 0x40, 0x26, + 0x20, 0x01, 0xa7, 0x74, 0x20, 0x04, 0xd0, 0xa4, 0x00, 0xc0, 0x40, 0x26, + 0x70, 0xcf, 0x00, 0x08, 0x70, 0x8b, 0x00, 0x16, 0x10, 0x78, 0x40, 0x30, + 0x00, 0x78, 0x40, 0x2e, 0x10, 0x78, 0x42, 0x24, 0x0f, 0x7f, 0x00, 0x7c, + 0x20, 0xe1, 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, 0x20, 0x99, 0xac, 0x80, + 0x20, 0xa1, 0x02, 0x0b, 0x20, 0xa9, 0x00, 0x0e, 0x53, 0xa6, 0x34, 0x30, + 0x20, 0x11, 0xac, 0x8e, 0x70, 0x8b, 0x00, 0x17, 0x10, 0x78, 0x42, 0xd4, + 0x00, 0xc0, 0x40, 0x50, 0x70, 0x74, 0xa0, 0x05, 0x00, 0xc0, 0x40, 0x50, + 0x10, 0x78, 0x41, 0x04, 0x00, 0xc0, 0x40, 0x5a, 0xa0, 0x85, 0x00, 0x01, + 0x10, 0x78, 0x25, 0x6a, 0x20, 0xa9, 0x00, 0x08, 0x20, 0x99, 0xac, 0x8e, + 0x26, 0xa0, 0x53, 0xa6, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x60, 0xc3, 0x00, 0x14, 0x10, 0x78, 0x42, 0x0b, 0x00, 0x7c, 0x0f, 0x7e, + 0x70, 0x80, 0xa0, 0x05, 0x00, 0x40, 0x40, 0x7f, 0x20, 0x11, 0x41, 0xdc, + 0x10, 0x78, 0x5a, 0x45, 0xa0, 0x86, 0x00, 0x84, 0x00, 0xc0, 0x40, 0x7d, + 0x20, 0x79, 0xac, 0x80, 0x7a, 0x30, 0xa2, 0x96, 0x11, 0x06, 0x00, 0xc0, + 0x40, 0x7d, 0x78, 0x34, 0xa0, 0x05, 0x00, 0xc0, 0x40, 0x7d, 0x70, 0x8b, + 0x00, 0x18, 0x10, 0x78, 0x40, 0x81, 0x00, 0x78, 0x40, 0x7f, 0x10, 0x78, + 0x42, 0x24, 0x0f, 0x7f, 0x00, 0x7c, 0x70, 0x8b, 0x00, 0x19, 0x10, 0x78, + 0x42, 0x95, 0x20, 0xa3, 0x11, 0x06, 0x20, 0xa3, 0x00, 0x00, 0x34, 0x30, + 0x20, 0x99, 0xac, 0x8e, 0x20, 0x39, 0xac, 0x0e, 0x27, 0xa0, 0x20, 0xa9, + 0x00, 0x40, 0x53, 0xa3, 0x10, 0x78, 0x42, 0xd4, 0x00, 0xc0, 0x40, 0xb5, + 0x27, 0x28, 0x25, 0x14, 0x82, 0x07, 0xa0, 0x84, 0x00, 0xff, 0x80, 0x00, + 0x20, 0x18, 0xa2, 0x94, 0x00, 0xff, 0x80, 0x07, 0xa2, 0x05, 0x20, 0x2a, + 0x60, 0x30, 0x23, 0x10, 0x82, 0x14, 0xa2, 0xa0, 0xac, 0x0e, 0x24, 0x14, + 0xa3, 0x8c, 0x00, 0x01, 0x00, 0x40, 0x40, 0xb0, 0xa2, 0x94, 0xff, 0x00, + 0x00, 0x78, 0x40, 0xb3, 0xa2, 0x94, 0x00, 0xff, 0x80, 0x07, 0xa2, 0x15, + 0x22, 0x22, 0x27, 0x98, 0x26, 0xa0, 0x20, 0xa9, 0x00, 0x40, 0x53, 0xa6, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, 0x00, 0x84, + 0x10, 0x78, 0x42, 0x0b, 0x00, 0x7c, 0x0f, 0x7e, 0x70, 0x80, 0xa0, 0x05, + 0x00, 0x40, 0x40, 0xe7, 0x20, 0x11, 0x41, 0xdc, 0x10, 0x78, 0x5a, 0x45, + 0xa0, 0x86, 0x00, 0x84, 0x00, 0xc0, 0x40, 0xe5, 0x20, 0x79, 0xac, 0x80, + 0x7a, 0x30, 0xa2, 0x96, 0x11, 0x07, 0x00, 0xc0, 0x40, 0xe5, 0x78, 0x34, + 0xa0, 0x05, 0x00, 0xc0, 0x40, 0xe5, 0x70, 0x87, 0x00, 0x01, 0x10, 0x78, + 0x42, 0x7b, 0x70, 0x8b, 0x00, 0x1a, 0x10, 0x78, 0x40, 0xe9, 0x00, 0x78, + 0x40, 0xe7, 0x10, 0x78, 0x42, 0x24, 0x0f, 0x7f, 0x00, 0x7c, 0x70, 0x8b, + 0x00, 0x1b, 0x20, 0xe1, 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, 0x20, 0x99, + 0xac, 0x80, 0x20, 0xa1, 0x02, 0x0b, 0x74, 0x80, 0xa4, 0x80, 0x00, 0x18, + 0xa0, 0x80, 0x00, 0x07, 0xa0, 0x84, 0x03, 0xf8, 0x80, 0x04, 0x20, 0xa8, + 0x53, 0xa6, 0x60, 0xc3, 0x00, 0x84, 0x10, 0x78, 0x42, 0x0b, 0x00, 0x7c, + 0x00, 0x7c, 0x00, 0x7c, 0x08, 0x7e, 0x09, 0x7e, 0x20, 0x29, 0xa7, 0x53, + 0x25, 0x2c, 0x20, 0xa9, 0x00, 0x08, 0x20, 0x41, 0xac, 0x0e, 0x28, 0xa0, + 0x20, 0x99, 0xac, 0x8e, 0x53, 0xa3, 0x20, 0xa9, 0x00, 0x08, 0x20, 0x11, + 0x00, 0x07, 0xd5, 0xd4, 0x00, 0x40, 0x41, 0x1a, 0x20, 0x11, 0x00, 0x00, + 0x28, 0x00, 0xa2, 0x00, 0x20, 0x0c, 0xa1, 0xa6, 0xff, 0xff, 0x00, 0xc0, + 0x41, 0x2c, 0xd5, 0xd4, 0x00, 0x40, 0x41, 0x27, 0x82, 0x10, 0x00, 0x78, + 0x41, 0x28, 0x82, 0x11, 0x00, 0xf0, 0x41, 0x1a, 0x00, 0x78, 0x41, 0x94, + 0x82, 0xff, 0x00, 0xc0, 0x41, 0x3e, 0xd5, 0xd4, 0x00, 0x40, 0x41, 0x38, + 0xa1, 0xa6, 0x3f, 0xff, 0x00, 0x40, 0x41, 0x24, 0x00, 0x78, 0x41, 0x3c, + 0xa1, 0xa6, 0x3f, 0xff, 0x00, 0x40, 0x41, 0x94, 0xa1, 0x8d, 0xc0, 0x00, + 0x20, 0xa9, 0x00, 0x10, 0x20, 0x19, 0x00, 0x01, 0xd5, 0xd4, 0x00, 0x40, + 0x41, 0x47, 0x20, 0x19, 0x00, 0x10, 0x21, 0x20, 0xd5, 0xd4, 0x00, 0x40, + 0x41, 0x4e, 0x84, 0x23, 0x00, 0x78, 0x41, 0x4f, 0x84, 0x24, 0x00, 0xc8, + 0x41, 0x5c, 0xd5, 0xd4, 0x00, 0x40, 0x41, 0x57, 0x83, 0x19, 0x00, 0x78, + 0x41, 0x58, 0x83, 0x18, 0x00, 0xf0, 0x41, 0x48, 0x00, 0x78, 0x41, 0x94, + 0x23, 0xa8, 0x20, 0x21, 0x00, 0x01, 0x84, 0x26, 0x84, 0x25, 0x00, 0xf0, + 0x41, 0x60, 0x23, 0x28, 0x85, 0x29, 0xa2, 0xbe, 0x00, 0x07, 0x00, 0x40, + 0x41, 0x74, 0x00, 0x7e, 0x20, 0x39, 0x00, 0x07, 0x22, 0x00, 0xa7, 0x3a, + 0x00, 0x7f, 0x27, 0xa8, 0xa5, 0xa8, 0x00, 0x10, 0x00, 0xf0, 0x41, 0x70, + 0x75, 0x52, 0xa5, 0xc8, 0x29, 0xc0, 0x29, 0x2c, 0xa5, 0xac, 0x00, 0xff, + 0x65, 0x32, 0x60, 0xe7, 0x00, 0x00, 0x65, 0xea, 0x70, 0x6f, 0x00, 0x00, + 0x75, 0x72, 0x20, 0x18, 0x23, 0x04, 0xa4, 0x05, 0x20, 0x1a, 0x70, 0x77, + 0x00, 0x01, 0x26, 0xa0, 0x28, 0x98, 0x20, 0xa9, 0x00, 0x08, 0x53, 0xa6, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0xa0, 0x85, 0x00, 0x01, + 0x00, 0x78, 0x41, 0x9a, 0xa0, 0x06, 0x00, 0x78, 0x41, 0x9a, 0xa0, 0x06, + 0x10, 0x78, 0x13, 0x32, 0x09, 0x7f, 0x08, 0x7f, 0x00, 0x7c, 0x21, 0x18, + 0x20, 0x21, 0x00, 0x00, 0x20, 0x01, 0x00, 0x07, 0xa3, 0x9a, 0x00, 0x10, + 0x00, 0x48, 0x41, 0xaa, 0x84, 0x20, 0x80, 0x01, 0x00, 0x78, 0x41, 0xa2, + 0x21, 0x18, 0x84, 0xff, 0x00, 0x40, 0x41, 0xb3, 0xa3, 0x9a, 0x00, 0x10, + 0x84, 0x21, 0x00, 0xc0, 0x41, 0xae, 0x20, 0x21, 0x00, 0x01, 0x83, 0xff, + 0x00, 0x40, 0x41, 0xbc, 0x84, 0x23, 0x83, 0x19, 0x00, 0xc0, 0x41, 0xb8, + 0xa2, 0x38, 0x27, 0x04, 0xa4, 0x2c, 0x00, 0xc0, 0x41, 0xd4, 0xa4, 0x05, + 0x20, 0x3a, 0x71, 0x52, 0xa1, 0xa0, 0x29, 0xc0, 0x24, 0x2c, 0xa5, 0xac, + 0x00, 0xff, 0x65, 0x32, 0x60, 0xe7, 0x00, 0x00, 0x65, 0xea, 0x70, 0x6f, + 0x00, 0x00, 0x75, 0x72, 0x70, 0x77, 0x00, 0x01, 0xa0, 0x84, 0x00, 0x00, + 0x00, 0x7c, 0x0e, 0x7e, 0x20, 0x71, 0xa7, 0x00, 0x70, 0x7b, 0x00, 0x00, + 0x0e, 0x7f, 0x00, 0x7c, 0x0e, 0x7e, 0x0f, 0x7e, 0x20, 0x01, 0x00, 0x02, + 0x10, 0x78, 0x5a, 0xe6, 0x20, 0x79, 0x01, 0x00, 0x20, 0x71, 0x01, 0x40, + 0x10, 0x78, 0x6e, 0x0f, 0x70, 0x04, 0xa0, 0x84, 0x40, 0x00, 0x00, 0x40, + 0x41, 0xf1, 0x70, 0x03, 0x10, 0x00, 0x70, 0x03, 0x00, 0x00, 0x12, 0x7e, + 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0xa7, 0x22, 0x20, 0x73, 0x00, 0x00, + 0x78, 0x40, 0x02, 0x7e, 0x01, 0x7e, 0x20, 0x09, 0x00, 0xf7, 0x10, 0x78, + 0x42, 0xa1, 0x01, 0x7f, 0xa0, 0x94, 0x00, 0x10, 0xa2, 0x85, 0x00, 0x80, + 0x78, 0x42, 0x7a, 0x42, 0x02, 0x7f, 0x12, 0x7f, 0x0f, 0x7f, 0x0e, 0x7f, + 0x00, 0x7c, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x20, 0x11, 0xa9, 0xbb, + 0x20, 0x13, 0x00, 0x00, 0x70, 0x83, 0x00, 0x00, 0x12, 0x7f, 0x20, 0xe1, + 0x90, 0x80, 0x60, 0xa3, 0x00, 0x56, 0x60, 0xa7, 0x95, 0x75, 0x10, 0x78, + 0x6e, 0x06, 0x20, 0x09, 0x07, 0xd0, 0x20, 0x11, 0x41, 0xdc, 0x10, 0x78, + 0x5a, 0xdd, 0x00, 0x7c, 0x01, 0x7e, 0x02, 0x7e, 0x0c, 0x7e, 0x12, 0x7e, + 0x20, 0x91, 0x80, 0x00, 0x20, 0x11, 0x00, 0x03, 0x10, 0x78, 0x70, 0xe0, + 0x20, 0x11, 0x00, 0x02, 0x10, 0x78, 0x70, 0xea, 0x10, 0x78, 0x6f, 0xc4, + 0x03, 0x7e, 0x20, 0x19, 0x00, 0x00, 0x10, 0x78, 0x70, 0x58, 0x03, 0x7f, + 0x20, 0x09, 0x00, 0xf7, 0x10, 0x78, 0x42, 0xa1, 0x20, 0x61, 0xa9, 0xc4, + 0x60, 0x1b, 0x00, 0x00, 0x60, 0x1f, 0x00, 0x00, 0x20, 0x61, 0xa7, 0x00, + 0x60, 0x03, 0x00, 0x01, 0x20, 0x61, 0x01, 0x00, 0x60, 0x43, 0x00, 0x90, + 0x60, 0x43, 0x00, 0x10, 0x20, 0x09, 0x00, 0x2d, 0x20, 0x11, 0x42, 0x59, + 0x10, 0x78, 0x5a, 0x38, 0x12, 0x7f, 0x0c, 0x7f, 0x02, 0x7f, 0x01, 0x7f, + 0x00, 0x7c, 0x0e, 0x7e, 0x00, 0x7e, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x01, 0x00, 0x01, 0x10, 0x78, 0x5a, 0xe6, 0x20, 0x71, 0x01, 0x00, + 0x10, 0x78, 0x6e, 0x0f, 0x20, 0x71, 0x01, 0x40, 0x70, 0x04, 0xa0, 0x84, + 0x40, 0x00, 0x00, 0x40, 0x42, 0x71, 0x70, 0x03, 0x10, 0x00, 0x70, 0x03, + 0x00, 0x00, 0x20, 0x01, 0x00, 0x01, 0x10, 0x78, 0x24, 0xe8, 0x10, 0x78, + 0x42, 0x24, 0x12, 0x7f, 0x00, 0x7f, 0x0e, 0x7f, 0x00, 0x7c, 0x20, 0xa9, + 0x00, 0x40, 0x20, 0xa1, 0xad, 0xc0, 0x20, 0x99, 0xac, 0x8e, 0x33, 0x04, + 0x80, 0x07, 0x20, 0xa2, 0x93, 0x98, 0x94, 0xa0, 0x00, 0xf0, 0x42, 0x81, + 0x00, 0x7c, 0x20, 0xe1, 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, 0x20, 0x99, + 0xac, 0x00, 0x20, 0xa1, 0x02, 0x0b, 0x20, 0xa9, 0x00, 0x0c, 0x53, 0xa6, + 0x00, 0x7c, 0x20, 0xe1, 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, 0x20, 0x99, + 0xac, 0x80, 0x20, 0xa1, 0x02, 0x0b, 0x20, 0xa9, 0x00, 0x0c, 0x53, 0xa6, + 0x00, 0x7c, 0x0c, 0x7e, 0x00, 0x7e, 0x20, 0x61, 0x01, 0x00, 0x81, 0x0f, + 0x20, 0x01, 0xa7, 0x2f, 0x20, 0x04, 0xa0, 0x05, 0x00, 0xc0, 0x42, 0xb2, + 0x60, 0x30, 0xa0, 0x84, 0x00, 0xff, 0xa1, 0x05, 0x00, 0x78, 0x42, 0xb4, + 0xa1, 0x85, 0x00, 0xf7, 0x60, 0x4a, 0x00, 0x7f, 0x0c, 0x7f, 0x00, 0x7c, + 0x01, 0x7e, 0x04, 0x7e, 0x20, 0x01, 0xa7, 0x53, 0x20, 0x04, 0xd0, 0xa4, + 0x00, 0x40, 0x42, 0xcb, 0xa0, 0x06, 0x20, 0x20, 0x20, 0x09, 0x00, 0x2a, + 0x10, 0x78, 0xa2, 0x2d, 0x20, 0x01, 0xa7, 0x0c, 0x20, 0x0c, 0xc1, 0x95, + 0x21, 0x02, 0x20, 0x19, 0x00, 0x2a, 0x20, 0x09, 0x00, 0x00, 0x10, 0x78, + 0x28, 0x4f, 0x04, 0x7f, 0x01, 0x7f, 0x00, 0x7c, 0x00, 0x7e, 0x20, 0x01, + 0xa7, 0x0c, 0x20, 0x04, 0xd0, 0x9c, 0x00, 0x40, 0x42, 0xdb, 0x00, 0x7f, + 0x00, 0x7c, 0x00, 0x7e, 0x01, 0x7e, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x01, 0x01, 0x01, 0x20, 0x0c, 0xa1, 0x8d, 0x00, 0x06, 0x21, 0x02, + 0x12, 0x7f, 0x01, 0x7f, 0x00, 0x7f, 0x00, 0x7c, 0x15, 0x7e, 0x20, 0xa9, + 0x00, 0xff, 0x20, 0x09, 0xa8, 0x35, 0xa0, 0x06, 0x20, 0x0a, 0x81, 0x08, + 0x00, 0xf0, 0x42, 0xf2, 0x15, 0x7f, 0x00, 0x7c, 0x0d, 0x7e, 0x03, 0x7e, + 0x15, 0x7e, 0x13, 0x7e, 0x14, 0x7e, 0x20, 0x69, 0xa7, 0x52, 0xa0, 0x06, + 0x60, 0x02, 0x60, 0x07, 0x07, 0x07, 0x60, 0x0a, 0x60, 0x0e, 0x60, 0x12, + 0xa1, 0x98, 0x29, 0xc0, 0x23, 0x1c, 0xa3, 0x9c, 0x00, 0xff, 0x63, 0x16, + 0x20, 0xa9, 0x00, 0x04, 0xac, 0x98, 0x00, 0x06, 0x23, 0xa0, 0x40, 0xa4, + 0x20, 0xa9, 0x00, 0x04, 0xac, 0x98, 0x00, 0x0a, 0x23, 0xa0, 0x40, 0xa4, + 0x60, 0x3e, 0x60, 0x42, 0x60, 0x4e, 0x60, 0x52, 0x60, 0x56, 0x60, 0x5a, + 0x60, 0x5e, 0x60, 0x62, 0x60, 0x66, 0x60, 0x6a, 0x60, 0x6e, 0x60, 0x72, + 0x60, 0x76, 0x60, 0x7a, 0x60, 0x7e, 0x60, 0x82, 0x60, 0x86, 0x60, 0x8a, + 0x60, 0x8e, 0x60, 0x92, 0x60, 0x96, 0x60, 0x9a, 0x60, 0x9e, 0x60, 0xae, + 0x61, 0xa2, 0x0d, 0x7e, 0x60, 0xa4, 0xa0, 0x6d, 0x00, 0x40, 0x43, 0x38, + 0x10, 0x78, 0x13, 0xa4, 0x60, 0xa7, 0x00, 0x00, 0x60, 0xa8, 0xa0, 0x6d, + 0x00, 0x40, 0x43, 0x40, 0x10, 0x78, 0x13, 0xa4, 0x60, 0xab, 0x00, 0x00, + 0x0d, 0x7f, 0xa0, 0x06, 0x60, 0x4a, 0x68, 0x10, 0x60, 0x3a, 0x68, 0x0c, + 0x60, 0x46, 0x68, 0x14, 0xa0, 0x84, 0x00, 0xff, 0x60, 0x42, 0x14, 0x7f, + 0x13, 0x7f, 0x15, 0x7f, 0x03, 0x7f, 0x0d, 0x7f, 0x00, 0x7c, 0x12, 0x7e, + 0x20, 0x91, 0x80, 0x00, 0x69, 0x44, 0x6e, 0x48, 0xa6, 0x84, 0x3f, 0xff, + 0xa0, 0x82, 0x40, 0x00, 0x00, 0xc8, 0x44, 0x24, 0xa1, 0x8c, 0xff, 0x00, + 0x81, 0x0f, 0xa1, 0x82, 0x00, 0xff, 0x00, 0xc8, 0x44, 0x2a, 0x20, 0x01, + 0xa7, 0x0c, 0x20, 0x04, 0xa0, 0x84, 0x00, 0x03, 0x00, 0x40, 0x43, 0x85, + 0x20, 0x01, 0xa7, 0x0c, 0x20, 0x04, 0xd0, 0x84, 0x00, 0xc0, 0x44, 0x05, + 0xa1, 0x88, 0xa8, 0x35, 0x21, 0x04, 0xa0, 0x65, 0x00, 0x40, 0x44, 0x05, + 0x60, 0x04, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x8e, 0x00, 0x06, 0x00, 0xc0, + 0x44, 0x05, 0x60, 0x00, 0xd0, 0xc4, 0x00, 0x40, 0x44, 0x05, 0x00, 0x78, + 0x43, 0x92, 0xa1, 0x88, 0xa8, 0x35, 0x21, 0x04, 0xa0, 0x65, 0x00, 0x40, + 0x43, 0xe9, 0x60, 0x04, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x8e, 0x00, 0x06, + 0x00, 0xc0, 0x43, 0xef, 0x60, 0xa4, 0xa0, 0x0d, 0x00, 0x40, 0x43, 0x9a, + 0x10, 0x78, 0x48, 0x17, 0x00, 0x40, 0x43, 0xe3, 0x60, 0xa8, 0xa0, 0x0d, + 0x00, 0x40, 0x43, 0xb4, 0x10, 0x78, 0x48, 0x6a, 0x00, 0xc0, 0x43, 0xb4, + 0x69, 0x4c, 0xd1, 0xfc, 0x00, 0xc0, 0x43, 0xaa, 0x10, 0x78, 0x44, 0xdf, + 0x00, 0x78, 0x43, 0xde, 0x10, 0x78, 0x44, 0x84, 0x69, 0x4c, 0xd1, 0xec, + 0x00, 0xc0, 0x43, 0xde, 0x10, 0x78, 0x46, 0xd6, 0x00, 0x78, 0x43, 0xde, + 0x69, 0x4c, 0xa1, 0x84, 0xa0, 0x00, 0x00, 0x40, 0x43, 0xce, 0xd1, 0xec, + 0x00, 0x40, 0x43, 0xc7, 0xd1, 0xfc, 0x00, 0x40, 0x43, 0xc3, 0x10, 0x78, + 0x46, 0xe7, 0x00, 0x78, 0x43, 0xca, 0x10, 0x78, 0x46, 0xe7, 0x00, 0x78, + 0x43, 0xce, 0xd1, 0xfc, 0x00, 0x40, 0x43, 0xce, 0x10, 0x78, 0x44, 0x84, + 0x00, 0x78, 0x43, 0xde, 0x60, 0x50, 0xa0, 0x0d, 0x00, 0x40, 0x43, 0xd9, + 0x2d, 0x00, 0x20, 0x0a, 0x68, 0x03, 0x00, 0x00, 0x60, 0x52, 0x00, 0x78, + 0x43, 0xde, 0x2d, 0x00, 0x60, 0x52, 0x60, 0x4e, 0x68, 0x03, 0x00, 0x00, + 0x10, 0x78, 0x5d, 0xa9, 0xa0, 0x06, 0x12, 0x7f, 0x00, 0x7c, 0x20, 0x01, + 0x00, 0x05, 0x20, 0x09, 0x00, 0x00, 0x00, 0x78, 0x44, 0x2e, 0x20, 0x01, + 0x00, 0x28, 0x20, 0x09, 0x00, 0x00, 0x00, 0x78, 0x44, 0x2e, 0xa0, 0x82, + 0x00, 0x06, 0x00, 0xc8, 0x44, 0x05, 0x60, 0xa0, 0xd0, 0xbc, 0x00, 0xc0, + 0x44, 0x01, 0x61, 0x00, 0xd1, 0xfc, 0x00, 0x40, 0x43, 0x92, 0x20, 0x01, + 0x00, 0x29, 0x20, 0x09, 0x10, 0x00, 0x00, 0x78, 0x44, 0x2e, 0x20, 0x01, + 0x00, 0x28, 0x00, 0x78, 0x44, 0x20, 0x20, 0x09, 0xa7, 0x0c, 0x21, 0x0c, + 0xd1, 0x8c, 0x00, 0x40, 0x44, 0x0f, 0x20, 0x01, 0x00, 0x04, 0x00, 0x78, + 0x44, 0x20, 0xd1, 0x84, 0x00, 0x40, 0x44, 0x16, 0x20, 0x01, 0x00, 0x04, + 0x00, 0x78, 0x44, 0x20, 0x20, 0x01, 0x00, 0x29, 0x61, 0x00, 0xd1, 0xfc, + 0x00, 0x40, 0x44, 0x20, 0x20, 0x09, 0x10, 0x00, 0x00, 0x78, 0x44, 0x2e, + 0x20, 0x09, 0x00, 0x00, 0x00, 0x78, 0x44, 0x2e, 0x20, 0x01, 0x00, 0x29, + 0x20, 0x09, 0x00, 0x00, 0x00, 0x78, 0x44, 0x2e, 0x20, 0x01, 0x00, 0x29, + 0x20, 0x09, 0x00, 0x00, 0xa0, 0x05, 0x12, 0x7f, 0x00, 0x7c, 0x69, 0x44, + 0x6e, 0x48, 0xa6, 0x84, 0x3f, 0xff, 0xa0, 0x82, 0x40, 0x00, 0x00, 0xc8, + 0x44, 0x7e, 0xa1, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0xa1, 0x82, 0x00, 0xff, + 0x00, 0xc8, 0x44, 0x64, 0xa1, 0x88, 0xa8, 0x35, 0x21, 0x04, 0xa0, 0x65, + 0x00, 0x40, 0x44, 0x64, 0x60, 0x04, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x8e, + 0x00, 0x06, 0x00, 0xc0, 0x44, 0x6a, 0x68, 0x4c, 0xd0, 0xec, 0x00, 0x40, + 0x44, 0x57, 0x10, 0x78, 0x46, 0xe7, 0x10, 0x78, 0x44, 0x84, 0x00, 0x78, + 0x44, 0x5f, 0x10, 0x78, 0x44, 0x84, 0x68, 0x4c, 0xd0, 0xfc, 0x00, 0x40, + 0x44, 0x5f, 0x10, 0x78, 0x46, 0xd6, 0x10, 0x78, 0x47, 0x2f, 0xa0, 0x06, + 0x00, 0x78, 0x44, 0x82, 0x20, 0x01, 0x00, 0x28, 0x20, 0x09, 0x00, 0x00, + 0x00, 0x78, 0x44, 0x82, 0xa0, 0x82, 0x00, 0x06, 0x00, 0xc8, 0x44, 0x78, + 0x61, 0x00, 0xd1, 0xfc, 0x00, 0x40, 0x44, 0x4d, 0x20, 0x01, 0x00, 0x29, + 0x20, 0x09, 0x10, 0x00, 0x00, 0x78, 0x44, 0x82, 0x20, 0x01, 0x00, 0x29, + 0x20, 0x09, 0x00, 0x00, 0x00, 0x78, 0x44, 0x82, 0x20, 0x01, 0x00, 0x29, + 0x20, 0x09, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x7c, 0x12, 0x7e, 0x20, 0x91, + 0x80, 0x00, 0x60, 0x50, 0xa0, 0x0d, 0x00, 0x40, 0x44, 0x92, 0x2d, 0x00, + 0x20, 0x0a, 0x68, 0x03, 0x00, 0x00, 0x60, 0x52, 0x12, 0x7f, 0x00, 0x7c, + 0x2d, 0x00, 0x60, 0x52, 0x60, 0x4e, 0x68, 0x03, 0x00, 0x00, 0x00, 0x78, + 0x44, 0x90, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x60, 0x4c, 0xa0, 0x05, + 0x00, 0x40, 0x44, 0xaf, 0x0e, 0x7e, 0x20, 0x71, 0xa9, 0xb1, 0x70, 0x04, + 0xa0, 0x86, 0x00, 0x02, 0x00, 0x40, 0x44, 0xb6, 0x0e, 0x7f, 0x60, 0x4c, + 0x68, 0x02, 0x2d, 0x00, 0x60, 0x4e, 0x12, 0x7f, 0x00, 0x7c, 0x2d, 0x00, + 0x60, 0x52, 0x60, 0x4e, 0x68, 0x03, 0x00, 0x00, 0x00, 0x78, 0x44, 0xad, + 0x70, 0x1c, 0xac, 0x06, 0x00, 0xc0, 0x44, 0xa8, 0x60, 0x4c, 0x20, 0x70, + 0x70, 0x00, 0x68, 0x02, 0x2d, 0x00, 0x70, 0x02, 0x0e, 0x7f, 0x12, 0x7f, + 0x00, 0x7c, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x60, 0x4c, 0xa0, 0x6d, + 0x00, 0x40, 0x44, 0xd1, 0x68, 0x00, 0xa0, 0x05, 0x00, 0xc0, 0x44, 0xcf, + 0x60, 0x52, 0x60, 0x4e, 0xad, 0x05, 0x12, 0x7f, 0x00, 0x7c, 0x60, 0x4c, + 0xa0, 0x6d, 0x00, 0x40, 0x44, 0xde, 0x68, 0x00, 0xa0, 0x05, 0x00, 0xc0, + 0x44, 0xdc, 0x60, 0x52, 0x60, 0x4e, 0xad, 0x05, 0x00, 0x7c, 0x68, 0x03, + 0x00, 0x00, 0x60, 0x84, 0xa0, 0x0d, 0x00, 0x40, 0x44, 0xe9, 0x2d, 0x00, + 0x20, 0x0a, 0x60, 0x86, 0x00, 0x7c, 0x2d, 0x00, 0x60, 0x86, 0x60, 0x82, + 0x00, 0x78, 0x44, 0xe8, 0x12, 0x7e, 0x0c, 0x7e, 0x02, 0x7e, 0x20, 0x91, + 0x80, 0x00, 0x62, 0x18, 0x22, 0x60, 0x62, 0x00, 0xa0, 0x05, 0x00, 0x40, + 0x44, 0xfc, 0xc2, 0x85, 0x00, 0x78, 0x44, 0xfd, 0xc2, 0x84, 0x62, 0x02, + 0x02, 0x7f, 0x0c, 0x7f, 0x12, 0x7f, 0x00, 0x7c, 0x12, 0x7e, 0x0c, 0x7e, + 0x20, 0x91, 0x80, 0x00, 0x62, 0x18, 0x22, 0x60, 0x62, 0x04, 0x00, 0x7e, + 0xa0, 0x86, 0x00, 0x06, 0x00, 0xc0, 0x45, 0x21, 0x60, 0x9c, 0xd0, 0xac, + 0x00, 0x40, 0x45, 0x21, 0x20, 0x01, 0xa7, 0x53, 0x20, 0x04, 0xd0, 0xa4, + 0x00, 0x40, 0x45, 0x21, 0xa2, 0x84, 0xff, 0x00, 0x80, 0x07, 0xa0, 0x86, + 0x00, 0x07, 0x00, 0xc0, 0x45, 0x21, 0x20, 0x11, 0x06, 0x00, 0x00, 0x7f, + 0xa2, 0x94, 0xff, 0x00, 0xa2, 0x15, 0x62, 0x06, 0x00, 0x7e, 0xa0, 0x86, + 0x00, 0x06, 0x00, 0xc0, 0x45, 0x31, 0x62, 0x90, 0x82, 0xff, 0x00, 0xc0, + 0x45, 0x31, 0x10, 0x78, 0x13, 0x32, 0x00, 0x7f, 0x0c, 0x7f, 0x12, 0x7f, + 0x00, 0x7c, 0x12, 0x7e, 0x0c, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x62, 0x18, + 0x22, 0x60, 0x62, 0x04, 0x00, 0x7e, 0xa0, 0x86, 0x00, 0x06, 0x00, 0xc0, + 0x45, 0x53, 0x60, 0x9c, 0xd0, 0xa4, 0x00, 0x40, 0x45, 0x53, 0x20, 0x01, + 0xa7, 0x53, 0x20, 0x04, 0xd0, 0xac, 0x00, 0xc0, 0x45, 0x53, 0xa2, 0x84, + 0x00, 0xff, 0xa0, 0x86, 0x00, 0x07, 0x00, 0xc0, 0x45, 0x53, 0x20, 0x11, + 0x00, 0x06, 0x00, 0x7f, 0xa2, 0x94, 0x00, 0xff, 0x80, 0x07, 0xa2, 0x15, + 0x62, 0x06, 0x0c, 0x7f, 0x12, 0x7f, 0x00, 0x7c, 0x02, 0x7e, 0xa1, 0x82, + 0x00, 0xff, 0x00, 0x48, 0x45, 0x65, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x78, + 0x45, 0x7d, 0xa1, 0x90, 0xa8, 0x35, 0x22, 0x04, 0xa0, 0x65, 0x00, 0xc0, + 0x45, 0x7c, 0x01, 0x7e, 0x0d, 0x7e, 0x10, 0x78, 0x13, 0x70, 0x2d, 0x60, + 0x0d, 0x7f, 0x01, 0x7f, 0x00, 0x40, 0x45, 0x61, 0x2c, 0x00, 0x20, 0x12, + 0x60, 0xa7, 0x00, 0x00, 0x60, 0xab, 0x00, 0x00, 0x10, 0x78, 0x42, 0xf8, + 0xa0, 0x06, 0x02, 0x7f, 0x00, 0x7c, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, + 0x02, 0x7e, 0xa1, 0x82, 0x00, 0xff, 0x00, 0x48, 0x45, 0x8b, 0xa0, 0x85, + 0x00, 0x01, 0x00, 0x78, 0x45, 0xc1, 0x0d, 0x7e, 0xa1, 0x90, 0xa8, 0x35, + 0x22, 0x04, 0xa0, 0x6d, 0x00, 0x40, 0x45, 0xbf, 0x20, 0x13, 0x00, 0x00, + 0x0d, 0x7e, 0x0c, 0x7e, 0x2d, 0x60, 0x60, 0xa4, 0xa0, 0x6d, 0x00, 0x40, + 0x45, 0x9d, 0x10, 0x78, 0x13, 0xa4, 0x60, 0xa8, 0xa0, 0x6d, 0x00, 0x40, + 0x45, 0xa3, 0x10, 0x78, 0x13, 0xa4, 0x0c, 0x7f, 0x0d, 0x7f, 0x0d, 0x7e, + 0x0c, 0x7e, 0x68, 0xac, 0x20, 0x60, 0x8c, 0xff, 0x00, 0x40, 0x45, 0xbb, + 0x60, 0x0c, 0x00, 0x7e, 0x60, 0x10, 0x20, 0x68, 0x10, 0x78, 0x8d, 0x16, + 0x00, 0x40, 0x45, 0xb6, 0x10, 0x78, 0x13, 0xb4, 0x10, 0x78, 0x77, 0x2d, + 0x0c, 0x7f, 0x00, 0x78, 0x45, 0xa9, 0x0c, 0x7f, 0x0d, 0x7f, 0x10, 0x78, + 0x13, 0xa4, 0x0d, 0x7f, 0xa0, 0x06, 0x02, 0x7f, 0x12, 0x7f, 0x00, 0x7c, + 0x01, 0x7e, 0xa1, 0x82, 0x00, 0xff, 0x00, 0x48, 0x45, 0xcd, 0xa0, 0x85, + 0x00, 0x01, 0x00, 0x78, 0x45, 0xd4, 0xa1, 0x88, 0xa8, 0x35, 0x21, 0x04, + 0xa0, 0x65, 0x00, 0x40, 0x45, 0xc9, 0xa0, 0x06, 0x01, 0x7f, 0x00, 0x7c, + 0x0d, 0x7e, 0x15, 0x7e, 0x13, 0x7e, 0x14, 0x7e, 0x60, 0x0b, 0x00, 0x00, + 0x60, 0x0f, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x8c, 0x60, 0x02, 0x20, 0x69, + 0xac, 0x8e, 0x68, 0x08, 0x60, 0x5e, 0x68, 0x10, 0x60, 0x62, 0x61, 0x38, + 0xa1, 0x0a, 0x00, 0x48, 0x45, 0xec, 0x60, 0x3a, 0x68, 0x14, 0x60, 0x66, + 0x20, 0x99, 0xac, 0x96, 0xac, 0x88, 0x00, 0x0a, 0x21, 0xa0, 0x20, 0xa9, + 0x00, 0x04, 0x53, 0xa3, 0x20, 0x99, 0xac, 0x9a, 0xac, 0x88, 0x00, 0x06, + 0x21, 0xa0, 0x20, 0xa9, 0x00, 0x04, 0x53, 0xa3, 0x20, 0x69, 0xac, 0xae, + 0x68, 0x08, 0x60, 0x6a, 0x69, 0x0c, 0x61, 0x6e, 0x68, 0x10, 0x60, 0x72, + 0x68, 0x18, 0x60, 0x76, 0x60, 0xa0, 0xa0, 0x86, 0x00, 0x7e, 0x00, 0xc0, + 0x46, 0x11, 0x20, 0x69, 0xac, 0x8e, 0x69, 0x0c, 0x61, 0x6e, 0xa1, 0x82, + 0x02, 0x11, 0x00, 0xc8, 0x46, 0x19, 0x20, 0x09, 0x00, 0x08, 0x00, 0x78, + 0x46, 0x43, 0xa1, 0x82, 0x02, 0x59, 0x00, 0xc8, 0x46, 0x21, 0x20, 0x09, + 0x00, 0x07, 0x00, 0x78, 0x46, 0x43, 0xa1, 0x82, 0x02, 0xc1, 0x00, 0xc8, + 0x46, 0x29, 0x20, 0x09, 0x00, 0x06, 0x00, 0x78, 0x46, 0x43, 0xa1, 0x82, + 0x03, 0x49, 0x00, 0xc8, 0x46, 0x31, 0x20, 0x09, 0x00, 0x05, 0x00, 0x78, + 0x46, 0x43, 0xa1, 0x82, 0x04, 0x21, 0x00, 0xc8, 0x46, 0x39, 0x20, 0x09, + 0x00, 0x04, 0x00, 0x78, 0x46, 0x43, 0xa1, 0x82, 0x05, 0x81, 0x00, 0xc8, + 0x46, 0x41, 0x20, 0x09, 0x00, 0x03, 0x00, 0x78, 0x46, 0x43, 0x20, 0x09, + 0x00, 0x02, 0x61, 0x92, 0x14, 0x7f, 0x13, 0x7f, 0x15, 0x7f, 0x0d, 0x7f, + 0x00, 0x7c, 0x01, 0x7e, 0x02, 0x7e, 0x0e, 0x7e, 0x20, 0x71, 0xac, 0x8d, + 0x2e, 0x04, 0x68, 0x96, 0x20, 0x71, 0xac, 0x8e, 0x70, 0x04, 0x68, 0x9a, + 0x70, 0x1c, 0x68, 0x9e, 0x6a, 0x00, 0x20, 0x09, 0xa7, 0x72, 0x21, 0x0c, + 0xd0, 0xbc, 0x00, 0x40, 0x46, 0x63, 0xd1, 0xec, 0x00, 0x40, 0x46, 0x63, + 0xc2, 0xad, 0x00, 0x78, 0x46, 0x64, 0xc2, 0xac, 0xd0, 0xc4, 0x00, 0x40, + 0x46, 0x6d, 0xd1, 0xe4, 0x00, 0x40, 0x46, 0x6d, 0xc2, 0xbd, 0x00, 0x78, + 0x46, 0x6e, 0xc2, 0xbc, 0x6a, 0x02, 0x0e, 0x7f, 0x02, 0x7f, 0x01, 0x7f, + 0x00, 0x7c, 0x0d, 0x7e, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x60, 0xa4, + 0xa0, 0x6d, 0x00, 0x40, 0x46, 0x97, 0x69, 0x00, 0x81, 0xff, 0x00, 0xc0, + 0x46, 0xab, 0x6a, 0x04, 0xa2, 0x82, 0x00, 0x10, 0x00, 0xc8, 0x46, 0xb0, + 0xad, 0x88, 0x00, 0x04, 0x20, 0xa9, 0x00, 0x10, 0x21, 0x04, 0xa0, 0x86, + 0xff, 0xff, 0x00, 0x40, 0x46, 0x92, 0x81, 0x08, 0x00, 0xf0, 0x46, 0x88, + 0x10, 0x78, 0x13, 0x32, 0x26, 0x0a, 0x82, 0x10, 0x6a, 0x06, 0x00, 0x78, + 0x46, 0xab, 0x10, 0x78, 0x13, 0x8b, 0x00, 0x40, 0x46, 0xb0, 0x2d, 0x00, + 0x60, 0xa6, 0x68, 0x03, 0x00, 0x00, 0xad, 0x88, 0x00, 0x04, 0x20, 0xa9, + 0x00, 0x10, 0x20, 0x0b, 0xff, 0xff, 0x81, 0x08, 0x00, 0xf0, 0x46, 0xa3, + 0x68, 0x07, 0x00, 0x01, 0x6e, 0x12, 0xa0, 0x85, 0x00, 0x01, 0x12, 0x7f, + 0x0d, 0x7f, 0x00, 0x7c, 0xa0, 0x06, 0x00, 0x78, 0x46, 0xad, 0x12, 0x7e, + 0x20, 0x91, 0x80, 0x00, 0x0d, 0x7e, 0x60, 0xa4, 0xa0, 0x0d, 0x00, 0x40, + 0x46, 0xd3, 0x21, 0x68, 0x68, 0x00, 0xa0, 0x05, 0x00, 0xc0, 0x46, 0xcf, + 0x10, 0x78, 0x48, 0x17, 0x00, 0xc0, 0x46, 0xd3, 0x20, 0x0b, 0xff, 0xff, + 0x68, 0x04, 0xa0, 0x8a, 0x00, 0x02, 0x00, 0x48, 0x46, 0xcf, 0x80, 0x01, + 0x68, 0x06, 0x00, 0x78, 0x46, 0xd3, 0x10, 0x78, 0x13, 0xa4, 0x60, 0xa7, + 0x00, 0x00, 0x0d, 0x7f, 0x12, 0x7f, 0x00, 0x7c, 0x12, 0x7e, 0x20, 0x91, + 0x80, 0x00, 0x10, 0x78, 0x48, 0x7f, 0x00, 0x78, 0x46, 0xdf, 0x10, 0x78, + 0x44, 0x84, 0x10, 0x78, 0x47, 0x75, 0x00, 0xc0, 0x46, 0xdd, 0x10, 0x78, + 0x47, 0x2f, 0x12, 0x7f, 0x00, 0x7c, 0x0d, 0x7e, 0x12, 0x7e, 0x20, 0x91, + 0x80, 0x00, 0x60, 0xa8, 0xa0, 0x6d, 0x00, 0x40, 0x47, 0x0b, 0x69, 0x50, + 0x81, 0xff, 0x00, 0xc0, 0x47, 0x1f, 0x6a, 0x54, 0xa2, 0x82, 0x00, 0x10, + 0x00, 0xc8, 0x47, 0x2c, 0xad, 0x88, 0x00, 0x18, 0x20, 0xa9, 0x00, 0x10, + 0x21, 0x04, 0xa0, 0x86, 0xff, 0xff, 0x00, 0x40, 0x47, 0x06, 0x81, 0x08, + 0x00, 0xf0, 0x46, 0xfc, 0x10, 0x78, 0x13, 0x32, 0x26, 0x0a, 0x82, 0x10, + 0x6a, 0x56, 0x00, 0x78, 0x47, 0x1f, 0x10, 0x78, 0x13, 0x8b, 0x00, 0x40, + 0x47, 0x2c, 0x2d, 0x00, 0x60, 0xaa, 0x68, 0x53, 0x00, 0x00, 0xad, 0x88, + 0x00, 0x18, 0x20, 0xa9, 0x00, 0x10, 0x20, 0x0b, 0xff, 0xff, 0x81, 0x08, + 0x00, 0xf0, 0x47, 0x17, 0x68, 0x57, 0x00, 0x01, 0x6e, 0x62, 0x00, 0x78, + 0x47, 0x23, 0x10, 0x78, 0x44, 0xdf, 0x10, 0x78, 0x47, 0x39, 0x00, 0xc0, + 0x47, 0x21, 0xa0, 0x85, 0x00, 0x01, 0x12, 0x7f, 0x0d, 0x7f, 0x00, 0x7c, + 0xa0, 0x06, 0x00, 0x78, 0x47, 0x29, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, + 0x10, 0x78, 0x5d, 0xa9, 0x12, 0x7f, 0x00, 0x7c, 0xa0, 0x1e, 0x00, 0x78, + 0x47, 0x3b, 0x20, 0x19, 0x00, 0x01, 0xa0, 0x0e, 0x12, 0x7e, 0x20, 0x91, + 0x80, 0x00, 0x60, 0x4c, 0x20, 0x68, 0x60, 0x00, 0xd0, 0xdc, 0x00, 0xc0, + 0x47, 0x59, 0x8d, 0xff, 0x00, 0x40, 0x47, 0x70, 0x83, 0xff, 0x00, 0x40, + 0x47, 0x51, 0x68, 0x48, 0xa6, 0x06, 0x00, 0x40, 0x47, 0x5e, 0x00, 0x78, + 0x47, 0x59, 0x68, 0x3c, 0xa4, 0x06, 0x00, 0xc0, 0x47, 0x59, 0x68, 0x40, + 0xa5, 0x06, 0x00, 0x40, 0x47, 0x5e, 0x2d, 0x08, 0x68, 0x00, 0x20, 0x68, + 0x00, 0x78, 0x47, 0x45, 0x10, 0x78, 0x72, 0x33, 0x6a, 0x00, 0x60, 0x4c, + 0xad, 0x06, 0x00, 0xc0, 0x47, 0x68, 0x62, 0x4e, 0x00, 0x78, 0x47, 0x6b, + 0xa1, 0x80, 0x00, 0x00, 0x22, 0x02, 0x82, 0xff, 0x00, 0xc0, 0x47, 0x70, + 0x61, 0x52, 0x8d, 0xff, 0x12, 0x7f, 0x00, 0x7c, 0xa0, 0x1e, 0x00, 0x78, + 0x47, 0x77, 0x20, 0x19, 0x00, 0x01, 0xa0, 0x0e, 0x60, 0x80, 0x20, 0x68, + 0x8d, 0xff, 0x00, 0x40, 0x47, 0xa3, 0x83, 0xff, 0x00, 0x40, 0x47, 0x86, + 0x68, 0x48, 0xa6, 0x06, 0x00, 0x40, 0x47, 0x93, 0x00, 0x78, 0x47, 0x8e, + 0x68, 0x3c, 0xa4, 0x06, 0x00, 0xc0, 0x47, 0x8e, 0x68, 0x40, 0xa5, 0x06, + 0x00, 0x40, 0x47, 0x93, 0x2d, 0x08, 0x68, 0x00, 0x20, 0x68, 0x00, 0x78, + 0x47, 0x7a, 0x6a, 0x00, 0x60, 0x80, 0xad, 0x06, 0x00, 0xc0, 0x47, 0x9b, + 0x62, 0x82, 0x00, 0x78, 0x47, 0x9e, 0xa1, 0x80, 0x00, 0x00, 0x22, 0x02, + 0x82, 0xff, 0x00, 0xc0, 0x47, 0xa3, 0x61, 0x86, 0x8d, 0xff, 0x00, 0x7c, + 0xa0, 0x16, 0x10, 0x78, 0x48, 0x10, 0x00, 0xc0, 0x47, 0xab, 0x20, 0x11, + 0x00, 0x01, 0x10, 0x78, 0x48, 0x63, 0x00, 0xc0, 0x47, 0xb1, 0xa2, 0x95, + 0x00, 0x02, 0x00, 0x7c, 0x10, 0x78, 0x48, 0x9b, 0x00, 0x40, 0x47, 0xba, + 0x10, 0x78, 0x8d, 0xda, 0x00, 0x78, 0x47, 0xbc, 0xa0, 0x85, 0x00, 0x01, + 0x00, 0x7c, 0x10, 0x78, 0x48, 0x9b, 0x00, 0x40, 0x47, 0xc5, 0x10, 0x78, + 0x8d, 0x72, 0x00, 0x78, 0x47, 0xc7, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x7c, + 0x10, 0x78, 0x48, 0x9b, 0x00, 0x40, 0x47, 0xd0, 0x10, 0x78, 0x8d, 0xbc, + 0x00, 0x78, 0x47, 0xd2, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x7c, 0x10, 0x78, + 0x48, 0x9b, 0x00, 0x40, 0x47, 0xdb, 0x10, 0x78, 0x8d, 0x8e, 0x00, 0x78, + 0x47, 0xdd, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x7c, 0x10, 0x78, 0x48, 0x9b, + 0x00, 0x40, 0x47, 0xe6, 0x10, 0x78, 0x8d, 0xf8, 0x00, 0x78, 0x47, 0xe8, + 0xa0, 0x85, 0x00, 0x01, 0x00, 0x7c, 0x12, 0x7e, 0x00, 0x7e, 0x0d, 0x7e, + 0x20, 0x91, 0x80, 0x00, 0x60, 0x80, 0xa0, 0x6d, 0x00, 0x40, 0x48, 0x08, + 0x68, 0x00, 0x00, 0x7e, 0x68, 0x37, 0x01, 0x03, 0x6b, 0x4a, 0x68, 0x47, + 0x00, 0x00, 0x10, 0x78, 0x8f, 0x8d, 0x00, 0x7e, 0x60, 0x00, 0xd0, 0xfc, + 0x00, 0x40, 0x48, 0x02, 0x10, 0x78, 0xa4, 0xfd, 0x00, 0x7f, 0x10, 0x78, + 0x4a, 0x73, 0x00, 0x7f, 0x00, 0x78, 0x47, 0xef, 0x60, 0x83, 0x00, 0x00, + 0x60, 0x87, 0x00, 0x00, 0x0d, 0x7f, 0x00, 0x7f, 0x12, 0x7f, 0x00, 0x7c, + 0x60, 0xa4, 0xa0, 0x0d, 0x00, 0xc0, 0x48, 0x17, 0xa0, 0x85, 0x00, 0x01, + 0x00, 0x7c, 0x0e, 0x7e, 0x21, 0x70, 0x70, 0x00, 0xa0, 0x05, 0x00, 0xc0, + 0x48, 0x2c, 0x20, 0xa9, 0x00, 0x10, 0xae, 0x88, 0x00, 0x04, 0x21, 0x04, + 0xa6, 0x06, 0x00, 0x40, 0x48, 0x2c, 0x81, 0x08, 0x00, 0xf0, 0x48, 0x21, + 0xa0, 0x85, 0x00, 0x01, 0x00, 0x78, 0x48, 0x2d, 0xa0, 0x06, 0x0e, 0x7f, + 0x00, 0x7c, 0x0d, 0x7e, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x60, 0xa4, + 0xa0, 0x6d, 0x00, 0xc0, 0x48, 0x3d, 0x10, 0x78, 0x13, 0x8b, 0x00, 0x40, + 0x48, 0x4f, 0x2d, 0x00, 0x60, 0xa6, 0x68, 0x03, 0x00, 0x01, 0x68, 0x07, + 0x00, 0x00, 0xad, 0x88, 0x00, 0x04, 0x20, 0xa9, 0x00, 0x10, 0x20, 0x0b, + 0xff, 0xff, 0x81, 0x08, 0x00, 0xf0, 0x48, 0x45, 0xa0, 0x85, 0x00, 0x01, + 0x12, 0x7f, 0x0d, 0x7f, 0x00, 0x7c, 0xa0, 0x06, 0x00, 0x78, 0x48, 0x4c, + 0x0d, 0x7e, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x60, 0xa4, 0xa0, 0x6d, + 0x00, 0x40, 0x48, 0x60, 0x60, 0xa7, 0x00, 0x00, 0x10, 0x78, 0x13, 0xa4, + 0xa0, 0x85, 0x00, 0x01, 0x12, 0x7f, 0x0d, 0x7f, 0x00, 0x7c, 0x60, 0xa8, + 0xa0, 0x0d, 0x00, 0xc0, 0x48, 0x6a, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x7c, + 0x0e, 0x7e, 0x21, 0x70, 0x70, 0x50, 0xa0, 0x05, 0x00, 0xc0, 0x48, 0x7d, + 0x20, 0xa9, 0x00, 0x10, 0xae, 0x88, 0x00, 0x18, 0x21, 0x04, 0xa6, 0x06, + 0x00, 0x40, 0x48, 0x7d, 0x81, 0x08, 0x00, 0xf0, 0x48, 0x74, 0xa0, 0x85, + 0x00, 0x01, 0x0e, 0x7f, 0x00, 0x7c, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, + 0x10, 0x78, 0x48, 0x63, 0x00, 0xc0, 0x48, 0x99, 0x20, 0x0b, 0xff, 0xff, + 0x0d, 0x7e, 0x60, 0xa8, 0x20, 0x68, 0x68, 0x54, 0xa0, 0x8a, 0x00, 0x02, + 0x00, 0x48, 0x48, 0x94, 0x80, 0x01, 0x68, 0x56, 0x00, 0x78, 0x48, 0x98, + 0x10, 0x78, 0x13, 0xa4, 0x60, 0xab, 0x00, 0x00, 0x0d, 0x7f, 0x12, 0x7f, + 0x00, 0x7c, 0x60, 0x9c, 0xd0, 0xa4, 0x00, 0x7c, 0x0f, 0x7e, 0x71, 0xb0, + 0x81, 0xff, 0x00, 0xc0, 0x48, 0xb9, 0x71, 0xcc, 0xd1, 0x9c, 0x00, 0x40, + 0x48, 0xb9, 0x20, 0x01, 0x00, 0x7e, 0xa0, 0x80, 0xa8, 0x35, 0x20, 0x04, + 0xa0, 0x7d, 0x00, 0x40, 0x48, 0xb9, 0x78, 0x04, 0xa0, 0x84, 0x00, 0xff, + 0xa0, 0x86, 0x00, 0x06, 0x00, 0xc0, 0x48, 0xb9, 0x78, 0x00, 0xc0, 0xed, + 0x78, 0x02, 0x20, 0x79, 0xa7, 0x52, 0x78, 0x04, 0xd0, 0xa4, 0x00, 0x40, + 0x48, 0xdf, 0x15, 0x7e, 0x0c, 0x7e, 0x20, 0xa9, 0x00, 0x7f, 0x20, 0x09, + 0x00, 0x00, 0x01, 0x7e, 0x10, 0x78, 0x45, 0xc4, 0x00, 0xc0, 0x48, 0xd9, + 0x60, 0x04, 0xa0, 0x84, 0xff, 0x00, 0x80, 0x07, 0xa0, 0x96, 0x00, 0x04, + 0x00, 0x40, 0x48, 0xd6, 0xa0, 0x86, 0x00, 0x06, 0x00, 0xc0, 0x48, 0xd9, + 0x60, 0x00, 0xc0, 0xed, 0x60, 0x02, 0x01, 0x7f, 0x81, 0x08, 0x00, 0xf0, + 0x48, 0xc5, 0x0c, 0x7f, 0x15, 0x7f, 0x10, 0x78, 0x49, 0x67, 0x00, 0x40, + 0x48, 0xe8, 0x20, 0x01, 0xa9, 0xa1, 0x20, 0x0c, 0x00, 0x78, 0x48, 0xf0, + 0x20, 0x79, 0xa7, 0x52, 0x78, 0x04, 0xd0, 0xa4, 0x00, 0x40, 0x48, 0xf4, + 0x20, 0x09, 0x07, 0xd0, 0x20, 0x11, 0x48, 0xf6, 0x10, 0x78, 0x5a, 0xdd, + 0x0f, 0x7f, 0x00, 0x7c, 0x20, 0x11, 0x48, 0xf6, 0x10, 0x78, 0x5a, 0x45, + 0x10, 0x78, 0x49, 0x67, 0x00, 0x40, 0x49, 0x1e, 0x20, 0x01, 0xa8, 0xb3, + 0x20, 0x04, 0xa0, 0x80, 0x00, 0x00, 0x20, 0x0c, 0xc1, 0xec, 0x21, 0x02, + 0x20, 0x01, 0xa7, 0x53, 0x20, 0x04, 0xd0, 0xa4, 0x00, 0x40, 0x49, 0x12, + 0x20, 0x09, 0x07, 0xd0, 0x20, 0x11, 0x48, 0xf6, 0x10, 0x78, 0x5a, 0xdd, + 0x0e, 0x7e, 0x20, 0x71, 0xa7, 0x00, 0x70, 0x6f, 0x00, 0x00, 0x70, 0x73, + 0x00, 0x00, 0x10, 0x78, 0x26, 0x77, 0x0e, 0x7f, 0x00, 0x78, 0x49, 0x56, + 0x15, 0x7e, 0x0c, 0x7e, 0x20, 0xa9, 0x00, 0x7f, 0x20, 0x09, 0x00, 0x00, + 0x01, 0x7e, 0x10, 0x78, 0x45, 0xc4, 0x00, 0xc0, 0x49, 0x50, 0x60, 0x00, + 0xd0, 0xec, 0x00, 0x40, 0x49, 0x50, 0x04, 0x7e, 0x62, 0xa0, 0xa2, 0x94, + 0x00, 0xff, 0x82, 0x27, 0xa0, 0x06, 0x20, 0x09, 0x00, 0x29, 0x10, 0x78, + 0xa2, 0x2d, 0x60, 0x00, 0xc0, 0xe5, 0xc0, 0xec, 0x60, 0x02, 0x60, 0x04, + 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x85, 0x07, 0x00, 0x60, 0x06, 0x20, 0x19, + 0x00, 0x29, 0x10, 0x78, 0x5f, 0x01, 0x07, 0x7e, 0x20, 0x39, 0x00, 0x00, + 0x10, 0x78, 0x5e, 0x0a, 0x20, 0x09, 0x00, 0x00, 0x10, 0x78, 0x9f, 0x9b, + 0x07, 0x7f, 0x04, 0x7f, 0x01, 0x7f, 0x81, 0x08, 0x00, 0xf0, 0x49, 0x24, + 0x0c, 0x7f, 0x15, 0x7f, 0x00, 0x7c, 0x0c, 0x7e, 0x60, 0x18, 0x20, 0x60, + 0x60, 0x00, 0xc0, 0xec, 0x60, 0x02, 0x0c, 0x7f, 0x00, 0x7c, 0x78, 0x18, + 0x20, 0x04, 0xd0, 0xac, 0x00, 0x7c, 0x78, 0x18, 0x20, 0x04, 0xd0, 0xbc, + 0x00, 0x7c, 0x0f, 0x7e, 0x20, 0x01, 0xa8, 0xb3, 0x20, 0x04, 0xa0, 0x7d, + 0x00, 0x40, 0x49, 0x70, 0x78, 0x00, 0xd0, 0xec, 0x0f, 0x7f, 0x00, 0x7c, + 0x12, 0x7e, 0x02, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x00, 0x7e, 0x62, 0xa0, + 0xa2, 0x90, 0xa8, 0x35, 0x22, 0x04, 0xac, 0x06, 0x10, 0xc0, 0x13, 0x32, + 0x00, 0x7f, 0x62, 0x00, 0xa0, 0x05, 0x00, 0x40, 0x49, 0x86, 0xc2, 0xfd, + 0x00, 0x78, 0x49, 0x87, 0xc2, 0xfc, 0x62, 0x02, 0x02, 0x7f, 0x12, 0x7f, + 0x00, 0x7c, 0x20, 0x11, 0xa7, 0x33, 0x22, 0x04, 0xd0, 0xcc, 0x00, 0x40, + 0x49, 0x98, 0x20, 0x01, 0xa9, 0x9f, 0x20, 0x0c, 0x20, 0x11, 0x49, 0x99, + 0x10, 0x78, 0x5a, 0xdd, 0x00, 0x7c, 0x20, 0x11, 0x49, 0x99, 0x10, 0x78, + 0x5a, 0x45, 0x20, 0x11, 0xa7, 0x33, 0x22, 0x04, 0xc0, 0xcc, 0x20, 0x12, + 0x00, 0x7c, 0x20, 0x71, 0xa8, 0x14, 0x70, 0x03, 0x00, 0x01, 0x70, 0x07, + 0x00, 0x00, 0x70, 0x13, 0x00, 0x00, 0x70, 0x17, 0x00, 0x00, 0x70, 0x1b, + 0x00, 0x00, 0x70, 0x1f, 0x00, 0x00, 0x70, 0x0b, 0x00, 0x00, 0x70, 0x4b, + 0x00, 0x01, 0x70, 0x4f, 0x00, 0x00, 0x70, 0x5b, 0x00, 0x20, 0x70, 0x5f, + 0x00, 0x40, 0x70, 0x7f, 0x00, 0x00, 0x20, 0x71, 0xa9, 0x7d, 0x70, 0x03, + 0xa8, 0x14, 0x70, 0x07, 0x00, 0x00, 0x70, 0x0b, 0x00, 0x00, 0x70, 0x0f, + 0xa9, 0x5d, 0x70, 0x13, 0x00, 0x20, 0x70, 0x17, 0x00, 0x40, 0x70, 0x37, + 0x00, 0x00, 0x00, 0x7c, 0x01, 0x7e, 0x0e, 0x7e, 0x20, 0x71, 0xa9, 0x35, + 0xa0, 0x0e, 0x71, 0x86, 0x71, 0x8a, 0x70, 0x97, 0x00, 0x01, 0x20, 0x01, + 0xa7, 0x53, 0x20, 0x04, 0xd0, 0xfc, 0x00, 0xc0, 0x49, 0xe8, 0x20, 0x01, + 0xa7, 0x53, 0x20, 0x04, 0xa0, 0x0e, 0xd0, 0x9c, 0x00, 0x40, 0x49, 0xe5, + 0x81, 0x08, 0x71, 0x02, 0x00, 0x78, 0x4a, 0x3b, 0x20, 0x01, 0xa7, 0x72, + 0x20, 0x0c, 0xa1, 0x84, 0x00, 0x0f, 0x20, 0x09, 0xa7, 0x73, 0x21, 0x0c, + 0x00, 0x79, 0x49, 0xf2, 0x49, 0xdd, 0x4a, 0x13, 0x4a, 0x1b, 0x4a, 0x26, + 0x4a, 0x2c, 0x49, 0xdd, 0x49, 0xdd, 0x49, 0xdd, 0x4a, 0x02, 0x49, 0xdd, + 0x49, 0xdd, 0x49, 0xdd, 0x49, 0xdd, 0x49, 0xdd, 0x49, 0xdd, 0x49, 0xdd, + 0x70, 0x03, 0x00, 0x04, 0x13, 0x7e, 0x14, 0x7e, 0x15, 0x7e, 0x20, 0x99, + 0xa7, 0x76, 0x20, 0xa1, 0xa9, 0x86, 0x20, 0xa9, 0x00, 0x04, 0x53, 0xa3, + 0x15, 0x7f, 0x14, 0x7f, 0x13, 0x7f, 0x00, 0x78, 0x4a, 0x3b, 0x70, 0x8f, + 0x00, 0x05, 0x70, 0x07, 0x01, 0x22, 0x20, 0x01, 0x00, 0x02, 0x00, 0x78, + 0x4a, 0x21, 0x70, 0x8f, 0x00, 0x02, 0x70, 0x07, 0x01, 0x21, 0x20, 0x01, + 0x00, 0x03, 0x70, 0x02, 0x70, 0x97, 0x00, 0x01, 0x00, 0x78, 0x4a, 0x38, + 0x70, 0x07, 0x01, 0x22, 0x20, 0x01, 0x00, 0x02, 0x00, 0x78, 0x4a, 0x30, + 0x70, 0x07, 0x01, 0x21, 0x20, 0x01, 0x00, 0x03, 0x70, 0x02, 0xa0, 0x06, + 0x70, 0x96, 0x70, 0x8e, 0xa1, 0x84, 0xff, 0x00, 0x80, 0x07, 0x70, 0x9a, + 0xa1, 0x84, 0x00, 0xff, 0x70, 0x92, 0x0e, 0x7f, 0x01, 0x7f, 0x00, 0x7c, + 0x0e, 0x7e, 0x20, 0x71, 0xa8, 0x14, 0x68, 0x4c, 0xa0, 0x05, 0x00, 0xc0, + 0x4a, 0x4c, 0x70, 0x28, 0xc0, 0x85, 0x70, 0x2a, 0xa0, 0x85, 0x00, 0x01, + 0x00, 0x78, 0x4a, 0x71, 0x6a, 0x60, 0x72, 0x36, 0x6b, 0x64, 0x73, 0x3a, + 0x68, 0x68, 0x70, 0x3e, 0x70, 0x76, 0x68, 0x6c, 0x70, 0x42, 0x70, 0x7a, + 0x68, 0x4c, 0x70, 0x2e, 0x68, 0x44, 0x70, 0x32, 0x20, 0x09, 0x00, 0x0d, + 0x20, 0x0a, 0x70, 0x0b, 0x00, 0x00, 0x80, 0x07, 0x80, 0x06, 0x80, 0x06, + 0xa0, 0x8c, 0x00, 0x3f, 0xa0, 0x84, 0xff, 0xc0, 0xa2, 0x10, 0x21, 0x00, + 0xa3, 0x19, 0x72, 0x6e, 0x73, 0x72, 0x70, 0x28, 0xc0, 0x84, 0x70, 0x2a, + 0x70, 0x07, 0x00, 0x01, 0xa0, 0x06, 0x0e, 0x7f, 0x00, 0x7c, 0x0e, 0x7e, + 0x02, 0x7e, 0x68, 0x38, 0xd0, 0xfc, 0x00, 0xc0, 0x4a, 0xc9, 0x68, 0x04, + 0xa0, 0x0d, 0x00, 0x40, 0x4a, 0x8f, 0x0d, 0x7e, 0x20, 0x71, 0xa7, 0x00, + 0xa0, 0x16, 0x70, 0x2c, 0x21, 0x68, 0x69, 0x04, 0x20, 0x6a, 0x82, 0x10, + 0x2d, 0x00, 0x81, 0xff, 0x00, 0xc0, 0x4a, 0x82, 0x70, 0x2e, 0x70, 0xac, + 0xa2, 0x00, 0x70, 0xae, 0x0d, 0x7f, 0x20, 0x71, 0xa8, 0x14, 0x70, 0x1c, + 0xa0, 0x05, 0x00, 0xc0, 0x4a, 0xdb, 0x00, 0x68, 0x4a, 0xd9, 0x20, 0x71, + 0xa9, 0x35, 0x72, 0x00, 0x82, 0xff, 0x00, 0x40, 0x4a, 0xd9, 0x69, 0x34, + 0xa1, 0x86, 0x01, 0x03, 0x00, 0xc0, 0x4a, 0xec, 0x69, 0x48, 0x68, 0x44, + 0xa1, 0x05, 0x00, 0xc0, 0x4a, 0xcc, 0x20, 0x09, 0x80, 0x20, 0x22, 0x00, + 0x00, 0x79, 0x4a, 0xac, 0x4a, 0xd9, 0x4a, 0xb1, 0x4b, 0x09, 0x4b, 0x17, + 0x4a, 0xd9, 0x20, 0x71, 0x00, 0x00, 0x70, 0x18, 0xd0, 0x84, 0x00, 0xc0, + 0x4a, 0xd9, 0x71, 0x22, 0x68, 0x3c, 0x70, 0x26, 0x68, 0x40, 0x70, 0x2a, + 0x70, 0x1b, 0x00, 0x01, 0x20, 0x91, 0x40, 0x80, 0x20, 0x71, 0xa7, 0x00, + 0x70, 0x2c, 0x20, 0x6a, 0x2d, 0x00, 0x70, 0x2e, 0x70, 0xac, 0x80, 0x00, + 0x70, 0xae, 0x02, 0x7f, 0x0e, 0x7f, 0x00, 0x7c, 0x68, 0x44, 0xa0, 0x86, + 0x01, 0x00, 0x00, 0xc0, 0x4a, 0xd9, 0x68, 0x68, 0xa0, 0x05, 0x00, 0xc0, + 0x4a, 0xd9, 0x20, 0x09, 0x80, 0x20, 0x00, 0x78, 0x4a, 0xa9, 0x20, 0x71, + 0xa8, 0x14, 0x2d, 0x08, 0x20, 0x6b, 0x00, 0x00, 0x70, 0x10, 0x80, 0x00, + 0x70, 0x12, 0x70, 0x18, 0xa0, 0x6d, 0x71, 0x1a, 0x00, 0x40, 0x4a, 0xe9, + 0x69, 0x02, 0x00, 0x78, 0x4a, 0xea, 0x71, 0x1e, 0x00, 0x78, 0x4a, 0xc9, + 0xa1, 0x8c, 0x00, 0xff, 0xa1, 0x86, 0x00, 0x17, 0x00, 0x40, 0x4a, 0xfa, + 0xa1, 0x86, 0x00, 0x1e, 0x00, 0x40, 0x4a, 0xfa, 0xa1, 0x8e, 0x00, 0x1f, + 0x00, 0xc0, 0x4a, 0xd9, 0x68, 0x4c, 0xd0, 0xcc, 0x00, 0x40, 0x4a, 0xd9, + 0x68, 0x50, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, 0x00, 0x01, 0x00, 0xc0, + 0x4a, 0xd9, 0x20, 0x09, 0x80, 0x21, 0x00, 0x78, 0x4a, 0xa9, 0x70, 0x84, + 0x80, 0x08, 0xa0, 0x92, 0x00, 0x1e, 0x00, 0xc8, 0x4a, 0xd9, 0x71, 0x86, + 0xae, 0x90, 0x00, 0x03, 0xa2, 0x10, 0x68, 0x3c, 0x20, 0x12, 0x00, 0x78, + 0x4b, 0x27, 0x70, 0x84, 0x80, 0x08, 0xa0, 0x92, 0x00, 0x0f, 0x00, 0xc8, + 0x4a, 0xd9, 0x71, 0x86, 0xae, 0x90, 0x00, 0x03, 0x80, 0x03, 0xa2, 0x10, + 0x68, 0x3c, 0x20, 0x12, 0x82, 0x10, 0x68, 0x40, 0x20, 0x12, 0x70, 0x88, + 0xa1, 0x0a, 0x00, 0x48, 0x4a, 0xc0, 0x71, 0x8c, 0x70, 0x84, 0xa1, 0x0a, + 0x00, 0x48, 0x4a, 0xc0, 0x20, 0x71, 0x00, 0x00, 0x70, 0x18, 0xd0, 0x84, + 0x00, 0xc0, 0x4a, 0xc0, 0x20, 0x71, 0xa9, 0x35, 0x70, 0x00, 0xa0, 0x86, + 0x00, 0x02, 0x00, 0xc0, 0x4b, 0x47, 0x10, 0x78, 0x4d, 0xc3, 0x20, 0x71, + 0x00, 0x00, 0x70, 0x1b, 0x00, 0x01, 0x20, 0x91, 0x40, 0x80, 0x00, 0x78, + 0x4a, 0xc0, 0x10, 0x78, 0x4d, 0xee, 0x20, 0x71, 0x00, 0x00, 0x70, 0x1b, + 0x00, 0x01, 0x20, 0x91, 0x40, 0x80, 0x00, 0x78, 0x4a, 0xc0, 0x00, 0x7e, + 0x68, 0x4c, 0x00, 0x7e, 0x68, 0x37, 0x01, 0x03, 0x20, 0xa9, 0x00, 0x1c, + 0xad, 0x80, 0x00, 0x11, 0x20, 0xa0, 0x20, 0x01, 0x00, 0x00, 0x40, 0xa4, + 0x00, 0x7f, 0xa0, 0x84, 0x00, 0xff, 0x68, 0x4e, 0x00, 0x7f, 0x68, 0x4a, + 0x69, 0x52, 0x00, 0x7c, 0x20, 0x71, 0xa8, 0x14, 0x70, 0x04, 0x00, 0x79, + 0x4b, 0x6b, 0x4b, 0x75, 0x4b, 0x86, 0x4d, 0x94, 0x4d, 0x95, 0x4d, 0xbc, + 0x4d, 0xc2, 0x4b, 0x76, 0x4d, 0x82, 0x4d, 0x23, 0x4d, 0xa5, 0x00, 0x7c, + 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x00, 0x68, 0x4b, 0x85, 0x20, 0x09, + 0x00, 0x0d, 0x70, 0x30, 0x20, 0x0a, 0x20, 0x91, 0x40, 0x80, 0x70, 0x07, + 0x00, 0x01, 0x70, 0x0b, 0x00, 0x00, 0x12, 0x7f, 0x20, 0x69, 0xa9, 0xc4, + 0x68, 0x44, 0xa0, 0x05, 0x00, 0x50, 0x4b, 0xae, 0x00, 0xc0, 0x4b, 0xae, + 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x20, 0x69, 0x00, 0x00, 0x69, 0x34, + 0x20, 0x01, 0xa8, 0x20, 0x20, 0x04, 0xa1, 0x0a, 0x00, 0x40, 0x4b, 0xa9, + 0x00, 0x68, 0x4b, 0xad, 0x20, 0x69, 0x00, 0x00, 0x68, 0x18, 0xd0, 0x84, + 0x00, 0xc0, 0x4b, 0xad, 0x20, 0x09, 0x80, 0x40, 0x69, 0x22, 0x68, 0x1b, + 0x00, 0x01, 0x20, 0x91, 0x40, 0x80, 0x20, 0x69, 0xa9, 0xc4, 0x68, 0x47, + 0xff, 0xff, 0x12, 0x7f, 0x20, 0x69, 0xa7, 0x00, 0x68, 0x48, 0x69, 0x64, + 0xa1, 0x02, 0x20, 0x69, 0xa9, 0x35, 0x68, 0x8a, 0x69, 0x84, 0x70, 0x1c, + 0xa0, 0x6d, 0x00, 0x40, 0x4b, 0xc0, 0x81, 0xff, 0x00, 0x40, 0x4c, 0x08, + 0x00, 0x78, 0x4b, 0xd6, 0x81, 0xff, 0x00, 0x40, 0x4c, 0xda, 0x20, 0x71, + 0xa9, 0x35, 0x71, 0x84, 0x70, 0x88, 0xa1, 0x0a, 0x00, 0xc8, 0x4b, 0xd6, + 0x71, 0x90, 0x20, 0x71, 0xa9, 0xc4, 0x70, 0x40, 0xa0, 0x05, 0x00, 0x40, + 0x4b, 0xd6, 0x00, 0xd0, 0x4c, 0xda, 0x71, 0x42, 0x00, 0x78, 0x4c, 0xda, + 0x20, 0x71, 0xa9, 0x35, 0x71, 0x8c, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, + 0x70, 0x84, 0xa1, 0x0a, 0x00, 0x48, 0x4c, 0xf7, 0x00, 0x68, 0x4c, 0x8c, + 0x20, 0x71, 0x00, 0x00, 0x70, 0x18, 0xd0, 0x84, 0x00, 0xc0, 0x4c, 0x8c, + 0x20, 0x01, 0xff, 0xff, 0x20, 0x71, 0xa9, 0xc4, 0x70, 0x42, 0x20, 0x71, + 0xa9, 0x35, 0x70, 0x00, 0xa0, 0x86, 0x00, 0x02, 0x00, 0xc0, 0x4b, 0xfe, + 0x10, 0x78, 0x4d, 0xc3, 0x20, 0x71, 0x00, 0x00, 0x70, 0x1b, 0x00, 0x01, + 0x20, 0x91, 0x40, 0x80, 0x00, 0x78, 0x4c, 0x8c, 0x10, 0x78, 0x4d, 0xee, + 0x20, 0x71, 0x00, 0x00, 0x70, 0x1b, 0x00, 0x01, 0x20, 0x91, 0x40, 0x80, + 0x00, 0x78, 0x4c, 0x8c, 0x20, 0x71, 0xa9, 0x35, 0x70, 0x00, 0xa0, 0x05, + 0x00, 0x40, 0x4c, 0xb9, 0x69, 0x34, 0xa1, 0x86, 0x01, 0x03, 0x00, 0xc0, + 0x4c, 0x8f, 0x68, 0x4c, 0xd0, 0xbc, 0x00, 0xc0, 0x4c, 0xb9, 0x69, 0x48, + 0x68, 0x44, 0xa1, 0x05, 0x00, 0xc0, 0x4c, 0xac, 0x20, 0x09, 0x80, 0x20, + 0x20, 0x71, 0xa9, 0x35, 0x70, 0x00, 0x00, 0x79, 0x4c, 0x23, 0x4c, 0xb9, + 0x4c, 0x71, 0x4c, 0x49, 0x4c, 0x5b, 0x4c, 0x28, 0x13, 0x7e, 0x14, 0x7e, + 0x15, 0x7e, 0x20, 0x99, 0xa7, 0x76, 0x20, 0xa1, 0xa9, 0x86, 0x20, 0xa9, + 0x00, 0x04, 0x53, 0xa3, 0x15, 0x7f, 0x14, 0x7f, 0x13, 0x7f, 0x20, 0x71, + 0xa9, 0x7d, 0xad, 0x80, 0x00, 0x0f, 0x70, 0x0e, 0x70, 0x13, 0x00, 0x02, + 0x70, 0x07, 0x00, 0x02, 0x70, 0x0b, 0x00, 0x00, 0x2e, 0x10, 0x10, 0x78, + 0x13, 0xdb, 0x20, 0x71, 0xa8, 0x14, 0x70, 0x07, 0x00, 0x09, 0x00, 0x78, + 0x4c, 0xda, 0x70, 0x84, 0x80, 0x08, 0xa0, 0x92, 0x00, 0x1e, 0x00, 0xc8, + 0x4c, 0xda, 0xae, 0x90, 0x00, 0x03, 0xa2, 0x10, 0x68, 0x3c, 0x20, 0x12, + 0x71, 0x86, 0x20, 0x71, 0xa8, 0x14, 0x10, 0x78, 0x4e, 0x4c, 0x00, 0x78, + 0x4c, 0xda, 0x70, 0x84, 0x80, 0x08, 0xa0, 0x92, 0x00, 0x0f, 0x00, 0xc8, + 0x4c, 0xda, 0xae, 0x90, 0x00, 0x03, 0x80, 0x03, 0xa2, 0x10, 0x68, 0x3c, + 0x20, 0x12, 0x82, 0x10, 0x68, 0x40, 0x20, 0x12, 0x71, 0x86, 0x20, 0x71, + 0xa8, 0x14, 0x10, 0x78, 0x4e, 0x4c, 0x00, 0x78, 0x4c, 0xda, 0x12, 0x7e, + 0x20, 0x91, 0x80, 0x00, 0x00, 0x68, 0x4c, 0x8c, 0x20, 0x71, 0x00, 0x00, + 0x70, 0x18, 0xd0, 0x84, 0x00, 0xc0, 0x4c, 0x8c, 0x71, 0x22, 0x68, 0x3c, + 0x70, 0x26, 0x68, 0x40, 0x70, 0x2a, 0x70, 0x1b, 0x00, 0x01, 0x20, 0x91, + 0x40, 0x80, 0x12, 0x7f, 0x20, 0x71, 0xa8, 0x14, 0x10, 0x78, 0x4e, 0x4c, + 0x00, 0x78, 0x4c, 0xda, 0x12, 0x7f, 0x00, 0x78, 0x4c, 0xda, 0xa1, 0x8c, + 0x00, 0xff, 0xa1, 0x86, 0x00, 0x17, 0x00, 0x40, 0x4c, 0x9d, 0xa1, 0x86, + 0x00, 0x1e, 0x00, 0x40, 0x4c, 0x9d, 0xa1, 0x8e, 0x00, 0x1f, 0x00, 0xc0, + 0x4c, 0xb9, 0x68, 0x4c, 0xd0, 0xcc, 0x00, 0x40, 0x4c, 0xb9, 0x68, 0x50, + 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, 0x00, 0x01, 0x00, 0xc0, 0x4c, 0xb9, + 0x20, 0x09, 0x80, 0x21, 0x00, 0x78, 0x4c, 0x1e, 0x68, 0x44, 0xa0, 0x86, + 0x01, 0x00, 0x00, 0xc0, 0x4c, 0xb9, 0x68, 0x68, 0xa0, 0x05, 0x00, 0xc0, + 0x4c, 0xb9, 0x20, 0x09, 0x80, 0x20, 0x00, 0x78, 0x4c, 0x1e, 0x20, 0x71, + 0xa8, 0x14, 0x10, 0x78, 0x4e, 0x60, 0x00, 0x40, 0x4c, 0xda, 0x20, 0x71, + 0xa8, 0x14, 0x70, 0x0f, 0x00, 0x01, 0x69, 0x34, 0xa1, 0x84, 0x00, 0xff, + 0xa0, 0x86, 0x00, 0x03, 0x00, 0xc0, 0x4c, 0xd1, 0x81, 0x0f, 0xa1, 0x8c, + 0x00, 0xff, 0x81, 0x01, 0x00, 0x40, 0x4c, 0xd1, 0x71, 0x0e, 0x70, 0x07, + 0x00, 0x03, 0x10, 0x78, 0x4e, 0x80, 0x70, 0x50, 0xa0, 0x86, 0x01, 0x00, + 0x00, 0x40, 0x4d, 0x95, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, + 0xa8, 0x14, 0x70, 0x08, 0xa0, 0x86, 0x00, 0x01, 0x00, 0xc0, 0x4c, 0xf5, + 0x00, 0x68, 0x4c, 0xf5, 0x20, 0x09, 0x00, 0x0d, 0x70, 0x30, 0x20, 0x0a, + 0x20, 0x91, 0x40, 0x80, 0x70, 0x0b, 0x00, 0x00, 0x70, 0x04, 0xa0, 0x86, + 0x00, 0x06, 0x00, 0xc0, 0x4c, 0xf5, 0x70, 0x07, 0x00, 0x01, 0x12, 0x7f, + 0x00, 0x7c, 0x20, 0x71, 0xa8, 0x14, 0x10, 0x78, 0x4e, 0x60, 0x00, 0x40, + 0x4d, 0x20, 0x20, 0x71, 0xa9, 0x35, 0x70, 0x84, 0x70, 0x0a, 0x20, 0xa9, + 0x00, 0x20, 0x20, 0x99, 0xa9, 0x36, 0x20, 0xa1, 0xa9, 0x5d, 0x53, 0xa3, + 0x70, 0x87, 0x00, 0x00, 0x20, 0x71, 0xa8, 0x14, 0x20, 0x69, 0xa9, 0x7d, + 0x70, 0x6c, 0x68, 0x26, 0x70, 0x70, 0x68, 0x2a, 0x70, 0x74, 0x68, 0x2e, + 0x70, 0x78, 0x68, 0x32, 0x2d, 0x10, 0x10, 0x78, 0x13, 0xdb, 0x70, 0x07, + 0x00, 0x08, 0x20, 0x01, 0xff, 0xff, 0x20, 0x71, 0xa9, 0xc4, 0x70, 0x42, + 0x12, 0x7f, 0x00, 0x78, 0x4c, 0xda, 0x20, 0x69, 0xa9, 0x7d, 0x68, 0x08, + 0xa0, 0x8e, 0x00, 0x00, 0x00, 0x40, 0x4d, 0x81, 0xa0, 0x8e, 0x02, 0x00, + 0x00, 0x40, 0x4d, 0x7f, 0xa0, 0x8e, 0x01, 0x00, 0x00, 0xc0, 0x4d, 0x81, + 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x00, 0x68, 0x4d, 0x7c, 0x20, 0x69, + 0x00, 0x00, 0x68, 0x18, 0xd0, 0x84, 0x00, 0xc0, 0x4d, 0x7c, 0x70, 0x2c, + 0x71, 0x30, 0x81, 0x08, 0xa1, 0x02, 0x00, 0x48, 0x4d, 0x4a, 0xa0, 0x0e, + 0x70, 0x34, 0x70, 0x6e, 0x70, 0x38, 0x70, 0x72, 0x00, 0x78, 0x4d, 0x54, + 0x70, 0x6c, 0xa0, 0x80, 0x00, 0x40, 0x70, 0x6e, 0x00, 0xc8, 0x4d, 0x54, + 0x70, 0x70, 0xa0, 0x81, 0x00, 0x00, 0x70, 0x72, 0x71, 0x32, 0x69, 0x36, + 0x70, 0x0b, 0x00, 0x00, 0x20, 0x01, 0xa9, 0x5a, 0x20, 0x04, 0xa0, 0x05, + 0x00, 0xc0, 0x4d, 0x73, 0x69, 0x34, 0x20, 0x69, 0xa9, 0x35, 0x68, 0x9c, + 0x69, 0x9e, 0x20, 0x69, 0xa9, 0xc4, 0xa1, 0x02, 0x00, 0xc0, 0x4d, 0x6c, + 0x68, 0x44, 0xa0, 0x05, 0x00, 0xd0, 0x4d, 0x7a, 0x20, 0x01, 0xa9, 0x5b, + 0x20, 0x0c, 0x81, 0x0d, 0x69, 0x46, 0x00, 0x78, 0x4d, 0x7a, 0x20, 0x09, + 0x80, 0x40, 0x69, 0x22, 0x68, 0x1b, 0x00, 0x01, 0x20, 0x91, 0x40, 0x80, + 0x70, 0x07, 0x00, 0x01, 0x12, 0x7f, 0x00, 0x78, 0x4d, 0x81, 0x70, 0x07, + 0x00, 0x05, 0x00, 0x7c, 0x70, 0x1c, 0xa0, 0x6d, 0x00, 0x40, 0x4d, 0x93, + 0x10, 0x78, 0x4e, 0x60, 0x00, 0x40, 0x4d, 0x93, 0x70, 0x07, 0x00, 0x03, + 0x10, 0x78, 0x4e, 0x80, 0x70, 0x50, 0xa0, 0x86, 0x01, 0x00, 0x00, 0x40, + 0x4d, 0x95, 0x00, 0x7c, 0x00, 0x7c, 0x70, 0x50, 0xa0, 0x9e, 0x01, 0x00, + 0x00, 0xc0, 0x4d, 0x9e, 0x70, 0x07, 0x00, 0x04, 0x00, 0x78, 0x4d, 0xbc, + 0xa0, 0x86, 0x02, 0x00, 0x00, 0xc0, 0x4d, 0xa4, 0x70, 0x07, 0x00, 0x05, + 0x00, 0x7c, 0x20, 0x01, 0xa9, 0x7f, 0x20, 0x04, 0xa0, 0x8e, 0x01, 0x00, + 0x00, 0xc0, 0x4d, 0xb1, 0x70, 0x07, 0x00, 0x01, 0x10, 0x78, 0x4e, 0x4c, + 0x00, 0x7c, 0xa0, 0x8e, 0x00, 0x00, 0x00, 0x40, 0x4d, 0xb0, 0xa0, 0x8e, + 0x02, 0x00, 0x00, 0xc0, 0x4d, 0xb0, 0x70, 0x07, 0x00, 0x05, 0x00, 0x7c, + 0x10, 0x78, 0x4e, 0x16, 0x70, 0x06, 0x10, 0x78, 0x4e, 0x4c, 0x00, 0x7c, + 0x00, 0x7c, 0x0e, 0x7e, 0x15, 0x7e, 0x20, 0x71, 0xa9, 0x35, 0x71, 0x84, + 0x81, 0xff, 0x00, 0x40, 0x4d, 0xeb, 0xa0, 0x06, 0x70, 0x86, 0xae, 0x80, + 0x00, 0x03, 0x20, 0x71, 0x00, 0x00, 0x21, 0xa8, 0x20, 0x14, 0x72, 0x26, + 0x80, 0x00, 0x00, 0x70, 0x4d, 0xe8, 0x20, 0x14, 0x72, 0x2a, 0x80, 0x00, + 0x00, 0x70, 0x4d, 0xe8, 0x20, 0x14, 0x72, 0x2e, 0x80, 0x00, 0x00, 0x70, + 0x4d, 0xe8, 0x20, 0x14, 0x72, 0x3a, 0x80, 0x00, 0x00, 0x70, 0x4d, 0xe8, + 0x20, 0x14, 0x72, 0x3e, 0xa1, 0x80, 0x80, 0x30, 0x70, 0x22, 0x15, 0x7f, + 0x0e, 0x7f, 0x00, 0x7c, 0x0e, 0x7e, 0x15, 0x7e, 0x20, 0x71, 0xa9, 0x35, + 0x71, 0x84, 0x81, 0xff, 0x00, 0x40, 0x4e, 0x13, 0xa0, 0x06, 0x70, 0x86, + 0xae, 0x80, 0x00, 0x03, 0x20, 0x71, 0x00, 0x00, 0x21, 0xa8, 0x20, 0x14, + 0x72, 0x26, 0x80, 0x00, 0x20, 0x14, 0x72, 0x2a, 0x80, 0x00, 0x00, 0x70, + 0x4e, 0x0c, 0x20, 0x14, 0x72, 0x3a, 0x80, 0x00, 0x20, 0x14, 0x72, 0x3e, + 0x00, 0x78, 0x4e, 0x10, 0x20, 0x01, 0x80, 0x20, 0x00, 0x78, 0x4e, 0x12, + 0x20, 0x01, 0x80, 0x42, 0x70, 0x22, 0x15, 0x7f, 0x0e, 0x7f, 0x00, 0x7c, + 0x70, 0x2c, 0x71, 0x30, 0x81, 0x08, 0xa1, 0x02, 0x00, 0x48, 0x4e, 0x23, + 0xa0, 0x0e, 0x70, 0x34, 0x70, 0x6e, 0x70, 0x38, 0x70, 0x72, 0x00, 0x78, + 0x4e, 0x2d, 0x70, 0x6c, 0xa0, 0x80, 0x00, 0x40, 0x70, 0x6e, 0x00, 0xc8, + 0x4e, 0x2d, 0x70, 0x70, 0xa0, 0x81, 0x00, 0x00, 0x70, 0x72, 0x71, 0x32, + 0x70, 0x0c, 0x80, 0x01, 0x70, 0x0e, 0x00, 0xc0, 0x4e, 0x43, 0x12, 0x7e, + 0x20, 0x91, 0x80, 0x00, 0x00, 0x68, 0x4e, 0x46, 0x20, 0x01, 0x00, 0x0d, + 0x21, 0x02, 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, 0x00, 0x01, 0x70, 0x0b, + 0x00, 0x00, 0x12, 0x7f, 0x00, 0x7c, 0x20, 0x01, 0x00, 0x07, 0x00, 0x7c, + 0x20, 0x01, 0x00, 0x06, 0x70, 0x0b, 0x00, 0x01, 0x12, 0x7f, 0x00, 0x7c, + 0x70, 0x1c, 0xa0, 0x6d, 0x00, 0x40, 0x4e, 0x5f, 0x12, 0x7e, 0x20, 0x91, + 0x80, 0x00, 0x70, 0x10, 0x80, 0x01, 0x70, 0x12, 0x2d, 0x04, 0x70, 0x1e, + 0xa0, 0x05, 0x00, 0xc0, 0x4e, 0x5c, 0x70, 0x1a, 0x12, 0x7f, 0x10, 0x78, + 0x13, 0xa4, 0x00, 0x7c, 0x20, 0x19, 0x00, 0x0d, 0x23, 0x04, 0x23, 0x0c, + 0xa1, 0x0e, 0x00, 0x40, 0x4e, 0x6f, 0x23, 0x04, 0x23, 0x0c, 0xa1, 0x0e, + 0x00, 0x40, 0x4e, 0x6f, 0xa0, 0x06, 0x00, 0x78, 0x4e, 0x7f, 0x73, 0x2c, + 0x83, 0x19, 0x71, 0x30, 0xa1, 0x02, 0x00, 0xc0, 0x4e, 0x79, 0x23, 0x00, + 0xa0, 0x05, 0x00, 0x78, 0x4e, 0x7f, 0x00, 0x48, 0x4e, 0x7e, 0xa3, 0x02, + 0x00, 0x78, 0x4e, 0x7f, 0x80, 0x02, 0x00, 0x7c, 0x2d, 0x00, 0x70, 0x26, + 0xa0, 0x80, 0x00, 0x0d, 0x70, 0x56, 0x70, 0x53, 0x00, 0x00, 0x12, 0x7e, + 0x20, 0x91, 0x80, 0x00, 0x20, 0x09, 0xa9, 0xd6, 0x21, 0x04, 0xc0, 0x8d, + 0x20, 0x0a, 0x12, 0x7f, 0x10, 0x78, 0x13, 0xf9, 0x00, 0x7c, 0x20, 0x71, + 0xa7, 0xe2, 0x70, 0x03, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x70, 0x0f, + 0x00, 0x00, 0x70, 0x2b, 0x00, 0x01, 0x70, 0x4f, 0x00, 0x00, 0x70, 0x53, + 0x00, 0x01, 0x70, 0x5f, 0x00, 0x20, 0x70, 0x63, 0x00, 0x40, 0x70, 0x83, + 0x00, 0x00, 0x70, 0x8b, 0x00, 0x00, 0x70, 0x8f, 0x00, 0x01, 0x70, 0xbf, + 0x00, 0x00, 0x00, 0x7c, 0x0e, 0x7e, 0x20, 0x71, 0xa7, 0xe2, 0x68, 0x48, + 0xa0, 0x05, 0x00, 0xc0, 0x4e, 0xbc, 0x70, 0x28, 0xc0, 0x85, 0x70, 0x2a, + 0xa0, 0x85, 0x00, 0x01, 0x00, 0x78, 0x4e, 0xe1, 0x6a, 0x50, 0x72, 0x36, + 0x6b, 0x54, 0x73, 0x3a, 0x68, 0x58, 0x70, 0x3e, 0x70, 0x7a, 0x68, 0x5c, + 0x70, 0x42, 0x70, 0x7e, 0x68, 0x48, 0x70, 0x2e, 0x68, 0x40, 0x70, 0x32, + 0x20, 0x09, 0x00, 0x0c, 0x20, 0x0a, 0x80, 0x07, 0x80, 0x06, 0x80, 0x06, + 0xa0, 0x8c, 0x00, 0x3f, 0xa0, 0x84, 0xff, 0xc0, 0xa2, 0x10, 0x21, 0x00, + 0xa3, 0x19, 0x72, 0x72, 0x73, 0x76, 0x70, 0x28, 0xc0, 0x84, 0x70, 0x2a, + 0x70, 0x07, 0x00, 0x01, 0x70, 0x0f, 0x00, 0x00, 0xa0, 0x06, 0x0e, 0x7f, + 0x00, 0x7c, 0x2b, 0x78, 0x20, 0x71, 0xa7, 0xe2, 0x70, 0x04, 0x10, 0x79, + 0x4f, 0x41, 0x70, 0x0c, 0x00, 0x79, 0x4e, 0xec, 0x4e, 0xf1, 0x4e, 0xe6, + 0x4e, 0xe6, 0x4e, 0xe6, 0x4e, 0xe6, 0x00, 0x7c, 0x70, 0x0c, 0x00, 0x79, + 0x4e, 0xf5, 0x4e, 0xfa, 0x4f, 0x3f, 0x4f, 0x3f, 0x4f, 0x40, 0x4f, 0x40, + 0x78, 0x30, 0x79, 0x30, 0xa1, 0x06, 0x00, 0x40, 0x4f, 0x04, 0x78, 0x30, + 0x79, 0x30, 0xa1, 0x06, 0x00, 0xc0, 0x4f, 0x2a, 0x70, 0x30, 0xa1, 0x0a, + 0x00, 0x40, 0x4f, 0x2a, 0x00, 0xc8, 0x4f, 0x0c, 0x71, 0x2c, 0xa1, 0x0a, + 0xa1, 0x8a, 0x00, 0x02, 0x00, 0xc8, 0x4f, 0x2b, 0x10, 0x78, 0x13, 0x70, + 0x00, 0x40, 0x4f, 0x2a, 0x2d, 0x00, 0x70, 0x5a, 0x70, 0x63, 0x00, 0x40, + 0x20, 0x01, 0x00, 0x03, 0x70, 0x57, 0x00, 0x00, 0x12, 0x7e, 0x00, 0x7e, + 0x20, 0x91, 0x80, 0x00, 0x20, 0x09, 0xa9, 0xd6, 0x21, 0x04, 0xc0, 0x85, + 0x20, 0x0a, 0x00, 0x7f, 0x70, 0x0e, 0x12, 0x7f, 0x10, 0x78, 0x13, 0xf9, + 0x00, 0x7c, 0x10, 0x78, 0x13, 0x70, 0x00, 0x40, 0x4f, 0x2a, 0x2d, 0x00, + 0x70, 0x5a, 0x10, 0x78, 0x13, 0x70, 0x00, 0xc0, 0x4f, 0x37, 0x00, 0x78, + 0x4f, 0x16, 0x2d, 0x00, 0x70, 0x86, 0x70, 0x63, 0x00, 0x80, 0x20, 0x01, + 0x00, 0x04, 0x00, 0x78, 0x4f, 0x1a, 0x00, 0x7c, 0x00, 0x7c, 0x4f, 0x52, + 0x4f, 0x53, 0x4f, 0x8a, 0x4f, 0x8b, 0x4f, 0x3f, 0x4f, 0xc1, 0x4f, 0xc6, + 0x4f, 0xfd, 0x4f, 0xfe, 0x50, 0x19, 0x50, 0x1a, 0x50, 0x1b, 0x50, 0x1c, + 0x50, 0x1d, 0x50, 0x1e, 0x50, 0x9e, 0x50, 0xc8, 0x00, 0x7c, 0x70, 0x0c, + 0x00, 0x79, 0x4f, 0x56, 0x4f, 0x5b, 0x4f, 0x5e, 0x4f, 0x6e, 0x4f, 0x89, + 0x4f, 0x89, 0x10, 0x78, 0x4e, 0xf2, 0x00, 0x7c, 0x12, 0x7e, 0x80, 0x01, + 0x70, 0x0e, 0x70, 0x58, 0x00, 0x7e, 0x10, 0x78, 0x54, 0x64, 0x00, 0x40, + 0x4f, 0x6b, 0x20, 0x91, 0x80, 0x00, 0x10, 0x78, 0x4e, 0xf2, 0x0d, 0x7f, + 0x00, 0x78, 0x4f, 0x77, 0x12, 0x7e, 0x80, 0x01, 0x70, 0x0e, 0x10, 0x78, + 0x54, 0x64, 0x70, 0x58, 0x20, 0x68, 0x70, 0x84, 0x70, 0x5a, 0x68, 0x03, + 0x00, 0x00, 0x68, 0x07, 0x00, 0x00, 0x68, 0x34, 0xa0, 0x84, 0x00, 0xff, + 0xa0, 0x8a, 0x00, 0x20, 0x00, 0xc8, 0x4f, 0x86, 0x10, 0x79, 0x4f, 0xa1, + 0x12, 0x7f, 0x00, 0x7c, 0x12, 0x7f, 0x10, 0x78, 0x50, 0x1f, 0x00, 0x7c, + 0x00, 0x7c, 0x00, 0x7c, 0x0e, 0x7e, 0x20, 0x71, 0xa7, 0xe2, 0x70, 0x0c, + 0x00, 0x79, 0x4f, 0x92, 0x4f, 0x97, 0x4f, 0x97, 0x4f, 0x97, 0x4f, 0x99, + 0x4f, 0x9d, 0x0e, 0x7f, 0x00, 0x7c, 0x70, 0x0f, 0x00, 0x01, 0x00, 0x78, + 0x4f, 0x9f, 0x70, 0x0f, 0x00, 0x02, 0x0e, 0x7f, 0x00, 0x7c, 0x50, 0x1f, + 0x50, 0x1f, 0x50, 0x3b, 0x50, 0x1f, 0x51, 0x71, 0x50, 0x1f, 0x50, 0x1f, + 0x50, 0x1f, 0x50, 0x1f, 0x50, 0x1f, 0x50, 0x3b, 0x51, 0xbb, 0x52, 0x08, + 0x52, 0x61, 0x52, 0x77, 0x50, 0x1f, 0x50, 0x1f, 0x50, 0x57, 0x50, 0x3b, + 0x50, 0x1f, 0x50, 0x1f, 0x50, 0x78, 0x53, 0x38, 0x53, 0x56, 0x50, 0x1f, + 0x50, 0x57, 0x50, 0x1f, 0x50, 0x1f, 0x50, 0x1f, 0x50, 0x1f, 0x50, 0x6d, + 0x53, 0x56, 0x70, 0x20, 0x20, 0x68, 0x10, 0x78, 0x13, 0xa4, 0x00, 0x7c, + 0x70, 0x0c, 0x00, 0x79, 0x4f, 0xc9, 0x4f, 0xce, 0x4f, 0xd1, 0x4f, 0xe1, + 0x4f, 0xfc, 0x4f, 0xfc, 0x10, 0x78, 0x4e, 0xf2, 0x00, 0x7c, 0x12, 0x7e, + 0x80, 0x01, 0x70, 0x0e, 0x70, 0x58, 0x00, 0x7e, 0x10, 0x78, 0x54, 0x64, + 0x00, 0x40, 0x4f, 0xde, 0x20, 0x91, 0x80, 0x00, 0x10, 0x78, 0x4e, 0xf2, + 0x0d, 0x7f, 0x00, 0x78, 0x4f, 0xea, 0x12, 0x7e, 0x80, 0x01, 0x70, 0x0e, + 0x10, 0x78, 0x54, 0x64, 0x70, 0x58, 0x20, 0x68, 0x70, 0x84, 0x70, 0x5a, + 0x68, 0x03, 0x00, 0x00, 0x68, 0x07, 0x00, 0x00, 0x68, 0x34, 0xa0, 0x84, + 0x00, 0xff, 0xa0, 0x8a, 0x00, 0x1a, 0x00, 0xc8, 0x4f, 0xf9, 0x10, 0x79, + 0x4f, 0xff, 0x12, 0x7f, 0x00, 0x7c, 0x12, 0x7f, 0x10, 0x78, 0x50, 0x1f, + 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x50, 0x1f, 0x50, 0x3b, 0x51, 0x5b, + 0x50, 0x1f, 0x50, 0x3b, 0x50, 0x1f, 0x50, 0x3b, 0x50, 0x3b, 0x50, 0x1f, + 0x50, 0x3b, 0x51, 0x5b, 0x50, 0x3b, 0x50, 0x3b, 0x50, 0x3b, 0x50, 0x3b, + 0x50, 0x3b, 0x50, 0x1f, 0x50, 0x3b, 0x51, 0x5b, 0x50, 0x1f, 0x50, 0x1f, + 0x50, 0x3b, 0x50, 0x1f, 0x50, 0x1f, 0x50, 0x1f, 0x50, 0x3b, 0x00, 0x7c, + 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x70, 0x07, + 0x00, 0x01, 0x68, 0x38, 0xa0, 0x84, 0x00, 0xff, 0xc0, 0xd5, 0x68, 0x3a, + 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x10, 0x78, 0x4a, 0x73, 0x12, 0x7f, + 0x00, 0x7c, 0x70, 0x07, 0x00, 0x01, 0x68, 0x38, 0xa0, 0x84, 0x00, 0xff, + 0xc0, 0xe5, 0x68, 0x3a, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x10, 0x78, + 0x4a, 0x73, 0x12, 0x7f, 0x00, 0x7c, 0x70, 0x07, 0x00, 0x01, 0x68, 0x38, + 0xa0, 0x84, 0x00, 0xff, 0xc0, 0xed, 0x68, 0x3a, 0x12, 0x7e, 0x20, 0x91, + 0x80, 0x00, 0x10, 0x78, 0x4a, 0x73, 0x12, 0x7f, 0x00, 0x7c, 0x70, 0x07, + 0x00, 0x01, 0x68, 0x38, 0xa0, 0x84, 0x00, 0xff, 0xc0, 0xdd, 0x68, 0x3a, + 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x10, 0x78, 0x4a, 0x73, 0x12, 0x7f, + 0x00, 0x7c, 0x68, 0x34, 0x80, 0x07, 0xa0, 0x84, 0x00, 0xff, 0x00, 0x40, + 0x50, 0x2d, 0x80, 0x01, 0x00, 0xc0, 0x50, 0x64, 0x70, 0x07, 0x00, 0x01, + 0x00, 0x78, 0x51, 0x3a, 0x70, 0x07, 0x00, 0x06, 0x70, 0x12, 0x2d, 0x00, + 0x70, 0x16, 0x70, 0x1a, 0x70, 0x4b, 0x51, 0x3a, 0x00, 0x7c, 0x68, 0x4c, + 0xa0, 0x84, 0x00, 0xc0, 0xa0, 0x86, 0x00, 0xc0, 0x00, 0xc0, 0x50, 0x78, + 0x70, 0x07, 0x00, 0x01, 0x00, 0x78, 0x53, 0x73, 0x2d, 0x00, 0x70, 0x16, + 0x70, 0x1a, 0x20, 0xa9, 0x00, 0x04, 0xa0, 0x80, 0x00, 0x24, 0x20, 0x98, + 0x20, 0xa1, 0xa8, 0x0d, 0x53, 0xa3, 0x68, 0x58, 0x70, 0x12, 0xa0, 0x82, + 0x04, 0x01, 0x00, 0xc8, 0x50, 0x49, 0x68, 0x84, 0xa0, 0x8a, 0x00, 0x02, + 0x00, 0xc8, 0x50, 0x49, 0x82, 0xff, 0x00, 0xc0, 0x50, 0x9a, 0x68, 0x88, + 0x69, 0x8c, 0xa1, 0x05, 0x00, 0x40, 0x50, 0x9a, 0x20, 0x01, 0x51, 0x0a, + 0x00, 0x78, 0x50, 0x9d, 0xa2, 0x80, 0x51, 0x00, 0x20, 0x04, 0x70, 0xc6, + 0x70, 0x10, 0xa0, 0x15, 0x00, 0x40, 0x50, 0xe8, 0x10, 0x78, 0x13, 0x70, + 0x00, 0xc0, 0x50, 0xa9, 0x70, 0x07, 0x00, 0x0f, 0x00, 0x7c, 0x2d, 0x00, + 0x70, 0x22, 0x70, 0xc4, 0x20, 0x60, 0x60, 0x00, 0x68, 0x36, 0x60, 0x04, + 0xad, 0x00, 0x70, 0x96, 0x60, 0x08, 0xa2, 0x0a, 0x00, 0xc8, 0x50, 0xb8, + 0xa0, 0x0e, 0x22, 0x00, 0x71, 0x12, 0x62, 0x0c, 0x80, 0x03, 0x80, 0x0b, + 0xa2, 0x96, 0x00, 0x04, 0x00, 0x40, 0x50, 0xc1, 0xa1, 0x08, 0x71, 0x9a, + 0x81, 0x0b, 0x71, 0x9e, 0xae, 0x90, 0x00, 0x22, 0x10, 0x78, 0x13, 0xdb, + 0x70, 0x90, 0xa0, 0x8e, 0x01, 0x00, 0x00, 0x40, 0x50, 0xdc, 0xa0, 0x86, + 0x02, 0x00, 0x00, 0x40, 0x50, 0xd4, 0x70, 0x07, 0x00, 0x10, 0x00, 0x7c, + 0x70, 0x20, 0x20, 0x68, 0x10, 0x78, 0x13, 0xa4, 0x70, 0x14, 0x20, 0x68, + 0x00, 0x78, 0x50, 0x49, 0x70, 0x20, 0x20, 0x68, 0x70, 0x18, 0x68, 0x02, + 0x68, 0x07, 0x00, 0x00, 0x2d, 0x08, 0x20, 0x68, 0x69, 0x06, 0x71, 0x1a, + 0x00, 0x78, 0x50, 0x9e, 0x70, 0x14, 0x20, 0x68, 0x70, 0x07, 0x00, 0x01, + 0x68, 0x84, 0xa0, 0x05, 0x00, 0xc0, 0x50, 0xf7, 0x68, 0x88, 0x69, 0x8c, + 0xa1, 0x05, 0x00, 0x40, 0x50, 0xf7, 0x10, 0x78, 0x51, 0x0e, 0x68, 0x34, + 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, 0x00, 0x1e, 0x00, 0x40, 0x53, 0x73, + 0x00, 0x78, 0x51, 0x3a, 0x51, 0x02, 0x51, 0x06, 0x00, 0x02, 0x00, 0x11, + 0x00, 0x07, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x0f, 0x00, 0x05, 0x00, 0x06, + 0x00, 0x0a, 0x00, 0x11, 0x00, 0x05, 0x00, 0x04, 0x0f, 0x7e, 0x0e, 0x7e, + 0x0c, 0x7e, 0x07, 0x7e, 0x06, 0x7e, 0x6f, 0x88, 0x6e, 0x8c, 0x68, 0x04, + 0x20, 0x60, 0xac, 0xf0, 0x00, 0x21, 0xac, 0xf8, 0x00, 0x27, 0x20, 0x09, + 0x00, 0x05, 0x70, 0x0c, 0x78, 0x16, 0x70, 0x08, 0x78, 0x12, 0x70, 0x04, + 0x78, 0x06, 0x70, 0x00, 0x78, 0x02, 0x7e, 0x0e, 0x7f, 0x0a, 0x81, 0x09, + 0x00, 0x40, 0x51, 0x30, 0xae, 0xf2, 0x00, 0x04, 0xaf, 0xfa, 0x00, 0x06, + 0x00, 0x78, 0x51, 0x1d, 0x60, 0x04, 0xa0, 0x65, 0x00, 0xc0, 0x51, 0x17, + 0x06, 0x7f, 0x07, 0x7f, 0x0c, 0x7f, 0x0e, 0x7f, 0x0f, 0x7f, 0x00, 0x7c, + 0x20, 0x09, 0xa7, 0x2f, 0x21, 0x0c, 0x81, 0xff, 0x00, 0xc0, 0x51, 0x55, + 0x68, 0x38, 0xa0, 0x84, 0x00, 0xff, 0x68, 0x3a, 0x10, 0x78, 0x43, 0x53, + 0x00, 0xc0, 0x51, 0x49, 0x00, 0x7c, 0x10, 0x78, 0x4b, 0x51, 0x12, 0x7e, + 0x20, 0x91, 0x80, 0x00, 0x10, 0x78, 0x8f, 0x8d, 0x10, 0x78, 0x4a, 0x73, + 0x12, 0x7f, 0x00, 0x78, 0x51, 0x48, 0x20, 0x01, 0x00, 0x28, 0x20, 0x09, + 0x00, 0x00, 0x00, 0x78, 0x51, 0x49, 0x70, 0x18, 0x68, 0x02, 0x2d, 0x08, + 0x20, 0x68, 0x69, 0x06, 0x71, 0x1a, 0x70, 0x10, 0x80, 0x01, 0x70, 0x12, + 0x00, 0x40, 0x51, 0x6a, 0x70, 0x07, 0x00, 0x06, 0x00, 0x78, 0x51, 0x70, + 0x70, 0x14, 0x20, 0x68, 0x70, 0x07, 0x00, 0x01, 0x70, 0x48, 0x10, 0x7a, + 0x00, 0x7c, 0x70, 0x07, 0x00, 0x01, 0x69, 0x44, 0x81, 0x0f, 0xa1, 0x8c, + 0x00, 0xff, 0x68, 0x48, 0xa0, 0x84, 0x00, 0xff, 0x20, 0xa9, 0x00, 0x01, + 0xa0, 0x96, 0x00, 0x01, 0x00, 0x40, 0x51, 0x9a, 0x20, 0x09, 0x00, 0x00, + 0x20, 0xa9, 0x00, 0xff, 0xa0, 0x96, 0x00, 0x02, 0x00, 0x40, 0x51, 0x9a, + 0xa0, 0x05, 0x00, 0xc0, 0x51, 0xad, 0x69, 0x44, 0x81, 0x0f, 0xa1, 0x8c, + 0x00, 0xff, 0x10, 0x78, 0x45, 0xc4, 0x00, 0xc0, 0x51, 0xad, 0x06, 0x7e, + 0x6e, 0x50, 0x10, 0x78, 0x46, 0xb3, 0x06, 0x7f, 0x00, 0x78, 0x51, 0xad, + 0x04, 0x7e, 0x20, 0x11, 0xa7, 0x0c, 0x22, 0x24, 0xc4, 0x84, 0xc4, 0x8c, + 0x24, 0x12, 0x04, 0x7f, 0x0c, 0x7e, 0x10, 0x78, 0x45, 0xc4, 0x00, 0xc0, + 0x51, 0xa9, 0x10, 0x78, 0x48, 0x52, 0x81, 0x08, 0x00, 0xf0, 0x51, 0xa3, + 0x0c, 0x7f, 0x68, 0x4c, 0xd0, 0x84, 0x00, 0xc0, 0x51, 0xb4, 0x10, 0x78, + 0x13, 0xa4, 0x00, 0x7c, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x10, 0x78, + 0x4a, 0x73, 0x12, 0x7f, 0x00, 0x7c, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, + 0x70, 0x07, 0x00, 0x01, 0x20, 0x01, 0xa7, 0x53, 0x20, 0x04, 0xd0, 0xa4, + 0x00, 0x40, 0x51, 0xff, 0x20, 0x61, 0xaa, 0x33, 0x61, 0x00, 0xd1, 0x84, + 0x00, 0x40, 0x51, 0xdf, 0x68, 0x58, 0xa0, 0x84, 0x00, 0xff, 0x00, 0xc0, + 0x52, 0x02, 0x60, 0x00, 0xd0, 0x84, 0x00, 0x40, 0x51, 0xff, 0x60, 0x04, + 0xa0, 0x05, 0x00, 0xc0, 0x52, 0x05, 0x60, 0x03, 0x00, 0x00, 0x60, 0x0b, + 0x00, 0x00, 0x00, 0x78, 0x51, 0xfc, 0x20, 0x11, 0x00, 0x01, 0x68, 0x60, + 0xa0, 0x05, 0x00, 0xc0, 0x51, 0xe7, 0x20, 0x01, 0x00, 0x1e, 0x80, 0x00, + 0x60, 0x16, 0x68, 0x58, 0xa0, 0x84, 0x00, 0xff, 0x00, 0x40, 0x51, 0xff, + 0x60, 0x06, 0x68, 0x58, 0x80, 0x07, 0xa0, 0x84, 0x00, 0xff, 0x00, 0x40, + 0x51, 0xff, 0x60, 0x0a, 0x68, 0x58, 0x80, 0x00, 0x00, 0xc0, 0x51, 0xfb, + 0xc2, 0x8d, 0x62, 0x02, 0x12, 0x7f, 0x00, 0x78, 0x54, 0x53, 0x12, 0x7f, + 0x00, 0x78, 0x54, 0x4b, 0x12, 0x7f, 0x00, 0x78, 0x54, 0x43, 0x12, 0x7f, + 0x00, 0x78, 0x54, 0x47, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x70, 0x07, + 0x00, 0x01, 0x20, 0x01, 0xa7, 0x53, 0x20, 0x04, 0xd0, 0xa4, 0x00, 0x40, + 0x52, 0x5e, 0x20, 0x61, 0xaa, 0x33, 0x60, 0x00, 0xd0, 0x84, 0x00, 0x40, + 0x52, 0x5e, 0x62, 0x04, 0x63, 0x08, 0xd0, 0x8c, 0x00, 0xc0, 0x52, 0x50, + 0x6c, 0x48, 0xa4, 0x84, 0x00, 0x03, 0x00, 0x40, 0x52, 0x36, 0x69, 0x58, + 0xa1, 0x8c, 0x00, 0xff, 0x80, 0x01, 0x00, 0xc0, 0x52, 0x2f, 0x21, 0x00, + 0xa2, 0x10, 0x00, 0x48, 0x52, 0x5b, 0x00, 0x78, 0x52, 0x36, 0x80, 0x01, + 0x00, 0xc0, 0x52, 0x5b, 0x21, 0x00, 0xa2, 0x12, 0x00, 0x48, 0x52, 0x5b, + 0xa4, 0x84, 0x00, 0x0c, 0x00, 0x40, 0x52, 0x50, 0x69, 0x58, 0x81, 0x0f, + 0xa1, 0x8c, 0x00, 0xff, 0xa0, 0x82, 0x00, 0x04, 0x00, 0xc0, 0x52, 0x48, + 0x21, 0x00, 0xa3, 0x18, 0x00, 0x48, 0x52, 0x5b, 0x00, 0x78, 0x52, 0x50, + 0xa0, 0x82, 0x00, 0x04, 0x00, 0xc0, 0x52, 0x5b, 0x21, 0x00, 0xa3, 0x1a, + 0x00, 0x48, 0x52, 0x5b, 0x68, 0x60, 0xa0, 0x05, 0x00, 0x40, 0x52, 0x56, + 0x80, 0x00, 0x60, 0x16, 0x62, 0x06, 0x63, 0x0a, 0x12, 0x7f, 0x00, 0x78, + 0x54, 0x53, 0x12, 0x7f, 0x00, 0x78, 0x54, 0x4f, 0x12, 0x7f, 0x00, 0x78, + 0x54, 0x4b, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x70, 0x07, 0x00, 0x01, + 0x20, 0x61, 0xaa, 0x33, 0x63, 0x00, 0xd3, 0x8c, 0x00, 0xc0, 0x52, 0x71, + 0x63, 0x08, 0x83, 0x18, 0x00, 0x48, 0x52, 0x74, 0x63, 0x0a, 0x12, 0x7f, + 0x00, 0x78, 0x54, 0x61, 0x12, 0x7f, 0x00, 0x78, 0x54, 0x4f, 0x12, 0x7e, + 0x0c, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x70, 0x07, 0x00, 0x01, 0x68, 0x4c, + 0xd0, 0xac, 0x00, 0x40, 0x52, 0x8b, 0x0c, 0x7e, 0x20, 0x61, 0xaa, 0x33, + 0x60, 0x00, 0xa0, 0x84, 0xfc, 0xff, 0x60, 0x02, 0x0c, 0x7f, 0x00, 0x78, + 0x52, 0xba, 0x68, 0x58, 0xa0, 0x05, 0x00, 0x40, 0x52, 0xd1, 0x68, 0x5c, + 0xa0, 0x65, 0x00, 0x40, 0x52, 0xcd, 0x20, 0x01, 0xa7, 0x2f, 0x20, 0x04, + 0xa0, 0x05, 0x00, 0x40, 0x52, 0x9d, 0x10, 0x78, 0x8e, 0xd6, 0x00, 0x78, + 0x52, 0xab, 0x60, 0x13, 0x04, 0x00, 0x60, 0x37, 0x00, 0x00, 0x69, 0x4c, + 0xd1, 0xa4, 0x00, 0x40, 0x52, 0xa7, 0x69, 0x50, 0x61, 0x36, 0x20, 0x09, + 0x00, 0x41, 0x10, 0x78, 0x77, 0x5c, 0x69, 0x58, 0xa1, 0x8c, 0xff, 0x00, + 0xa1, 0x86, 0x20, 0x00, 0x00, 0xc0, 0x52, 0xba, 0x02, 0x7e, 0x20, 0x09, + 0x00, 0x00, 0x20, 0x11, 0xfd, 0xff, 0x10, 0x78, 0x5b, 0xf1, 0x02, 0x7f, + 0x68, 0x4c, 0xd0, 0xc4, 0x00, 0x40, 0x52, 0xc9, 0x20, 0x61, 0xaa, 0x33, + 0x60, 0x00, 0xd0, 0x8c, 0x00, 0xc0, 0x52, 0xc9, 0x60, 0x08, 0x80, 0x00, + 0x00, 0x48, 0x52, 0xcd, 0x60, 0x0a, 0x0c, 0x7f, 0x12, 0x7f, 0x00, 0x78, + 0x54, 0x53, 0x0c, 0x7f, 0x12, 0x7f, 0x00, 0x78, 0x54, 0x4b, 0x69, 0x54, + 0xa1, 0x86, 0x00, 0x45, 0x00, 0x40, 0x53, 0x06, 0xa1, 0x86, 0x00, 0x2a, + 0x00, 0xc0, 0x52, 0xe1, 0x20, 0x01, 0xa7, 0x0c, 0x20, 0x0c, 0xc1, 0x94, + 0x21, 0x02, 0x00, 0x78, 0x52, 0xba, 0xa1, 0x86, 0x00, 0x20, 0x00, 0x40, + 0x52, 0xfa, 0xa1, 0x86, 0x00, 0x29, 0x00, 0x40, 0x52, 0xed, 0xa1, 0x86, + 0x00, 0x2d, 0x00, 0xc0, 0x52, 0xcd, 0x69, 0x44, 0xa1, 0x8c, 0xff, 0x00, + 0x81, 0x0f, 0x10, 0x78, 0x45, 0xc4, 0x00, 0xc0, 0x52, 0xba, 0x60, 0x00, + 0xc0, 0xe4, 0x60, 0x02, 0x00, 0x78, 0x52, 0xba, 0x68, 0x5c, 0xa0, 0x65, + 0x00, 0x40, 0x52, 0xcd, 0x60, 0x07, 0x00, 0x24, 0x20, 0x01, 0xa9, 0xa3, + 0x20, 0x04, 0x60, 0x16, 0x00, 0x78, 0x52, 0xba, 0x68, 0x5c, 0xa0, 0x65, + 0x00, 0x40, 0x52, 0xcd, 0x0e, 0x7e, 0x68, 0x60, 0xa0, 0x75, 0x20, 0x01, + 0xa7, 0x2f, 0x20, 0x04, 0xa0, 0x05, 0x00, 0x40, 0x53, 0x1e, 0x10, 0x78, + 0x8e, 0xd6, 0x8e, 0xff, 0x00, 0x40, 0x53, 0x1b, 0x2e, 0x60, 0x10, 0x78, + 0x8e, 0xd6, 0x0e, 0x7f, 0x00, 0x78, 0x52, 0xba, 0x60, 0x24, 0xc0, 0xdc, + 0xc0, 0xd5, 0x60, 0x26, 0x2e, 0x60, 0x60, 0x07, 0x00, 0x3a, 0x68, 0x70, + 0xa0, 0x05, 0x00, 0x40, 0x53, 0x2f, 0x60, 0x07, 0x00, 0x3b, 0x68, 0x74, + 0x60, 0x2a, 0x68, 0x78, 0x60, 0x12, 0x60, 0x03, 0x00, 0x01, 0x10, 0x78, + 0x5d, 0x8a, 0x10, 0x78, 0x62, 0xd1, 0x0e, 0x7f, 0x00, 0x78, 0x52, 0xba, + 0x20, 0x61, 0xaa, 0x33, 0x60, 0x00, 0xd0, 0x84, 0x00, 0x40, 0x53, 0x52, + 0xd0, 0x8c, 0x00, 0xc0, 0x54, 0x61, 0x20, 0x91, 0x80, 0x00, 0x62, 0x04, + 0x82, 0x10, 0x00, 0x48, 0x53, 0x4c, 0x62, 0x06, 0x20, 0x91, 0x80, 0x01, + 0x00, 0x78, 0x54, 0x61, 0x20, 0x91, 0x80, 0x01, 0x68, 0x53, 0x00, 0x16, + 0x00, 0x78, 0x54, 0x5a, 0x68, 0x53, 0x00, 0x07, 0x00, 0x78, 0x54, 0x5a, + 0x68, 0x34, 0x80, 0x07, 0xa0, 0x84, 0x00, 0xff, 0x00, 0xc0, 0x53, 0x60, + 0x10, 0x78, 0x50, 0x2d, 0x00, 0x78, 0x53, 0x72, 0x20, 0x30, 0x80, 0x01, + 0x00, 0xc0, 0x53, 0x6a, 0x70, 0x07, 0x00, 0x01, 0x10, 0x78, 0x53, 0x73, + 0x00, 0x78, 0x53, 0x72, 0x70, 0x07, 0x00, 0x06, 0x70, 0x12, 0x2d, 0x00, + 0x70, 0x16, 0x70, 0x1a, 0x70, 0x4b, 0x53, 0x73, 0x00, 0x7c, 0x0e, 0x7e, + 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0xa0, 0x3e, 0x20, 0x09, 0xa7, 0x2f, + 0x21, 0x0c, 0x81, 0xff, 0x00, 0xc0, 0x53, 0xff, 0x20, 0x09, 0xa7, 0x0c, + 0x21, 0x0c, 0xd1, 0x94, 0x00, 0xc0, 0x54, 0x31, 0x68, 0x48, 0x20, 0x70, + 0xae, 0x82, 0xae, 0x00, 0x00, 0x48, 0x53, 0xef, 0x20, 0x01, 0xa7, 0x16, + 0x20, 0x04, 0xae, 0x02, 0x00, 0xc8, 0x53, 0xef, 0x20, 0x61, 0xaa, 0x33, + 0x61, 0x00, 0xa1, 0x84, 0x03, 0x01, 0xa0, 0x86, 0x00, 0x01, 0x00, 0xc0, + 0x53, 0xd2, 0x71, 0x1c, 0xa1, 0x86, 0x00, 0x06, 0x00, 0xc0, 0x53, 0xda, + 0x70, 0x18, 0xa0, 0x05, 0x00, 0x40, 0x53, 0xff, 0x20, 0x04, 0xd0, 0xe4, + 0x00, 0xc0, 0x54, 0x2b, 0x70, 0x24, 0xd0, 0xdc, 0x00, 0xc0, 0x54, 0x35, + 0x68, 0x53, 0x00, 0x00, 0x68, 0x03, 0x00, 0x00, 0x2d, 0x08, 0x70, 0x10, + 0xa0, 0x05, 0x00, 0xc0, 0x53, 0xbe, 0x71, 0x12, 0x68, 0x4c, 0xd0, 0xf4, + 0x00, 0xc0, 0x54, 0x39, 0x2e, 0x60, 0x10, 0x78, 0x5b, 0x27, 0x12, 0x7f, + 0x0e, 0x7f, 0x00, 0x7c, 0x20, 0x68, 0x68, 0x00, 0xa0, 0x05, 0x00, 0xc0, + 0x53, 0xbe, 0x69, 0x02, 0x21, 0x68, 0x68, 0x4c, 0xd0, 0xf4, 0x00, 0xc0, + 0x54, 0x39, 0x12, 0x7f, 0x0e, 0x7f, 0x00, 0x7c, 0x12, 0x7f, 0x0e, 0x7f, + 0x68, 0x53, 0x00, 0x06, 0x00, 0x78, 0x54, 0x5a, 0xd1, 0x84, 0x00, 0x40, + 0x53, 0xcc, 0xd1, 0xc4, 0x00, 0xc0, 0x53, 0xf3, 0x00, 0x78, 0x53, 0xf7, + 0x69, 0x44, 0xa1, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0x10, 0x78, 0x45, 0xc4, + 0x00, 0xc0, 0x54, 0x2b, 0x60, 0x00, 0xd0, 0xe4, 0x00, 0xc0, 0x54, 0x2b, + 0x71, 0x1c, 0xa1, 0x86, 0x00, 0x07, 0x00, 0xc0, 0x53, 0xef, 0x68, 0x53, + 0x00, 0x02, 0x00, 0x78, 0x54, 0x2d, 0x68, 0x53, 0x00, 0x08, 0x00, 0x78, + 0x54, 0x2d, 0x68, 0x53, 0x00, 0x0e, 0x00, 0x78, 0x54, 0x2d, 0x68, 0x53, + 0x00, 0x17, 0x00, 0x78, 0x54, 0x2d, 0x68, 0x53, 0x00, 0x35, 0x00, 0x78, + 0x54, 0x2d, 0x20, 0x01, 0xa7, 0x72, 0x20, 0x04, 0xd0, 0xfc, 0x00, 0x40, + 0x54, 0x27, 0x68, 0x48, 0x20, 0x70, 0xae, 0x82, 0xae, 0x00, 0x00, 0x48, + 0x54, 0x27, 0x60, 0x58, 0xae, 0x02, 0x00, 0xc8, 0x54, 0x27, 0x71, 0x1c, + 0xa1, 0x86, 0x00, 0x06, 0x00, 0xc0, 0x54, 0x27, 0x70, 0x18, 0xa0, 0x05, + 0x00, 0x40, 0x54, 0x27, 0x20, 0x04, 0xd0, 0xbc, 0x00, 0x40, 0x54, 0x27, + 0x20, 0x39, 0x00, 0x01, 0x70, 0x00, 0xa0, 0x86, 0x00, 0x07, 0x00, 0xc0, + 0x53, 0x7e, 0x70, 0x03, 0x00, 0x02, 0x00, 0x78, 0x53, 0x7e, 0x68, 0x53, + 0x00, 0x28, 0x00, 0x78, 0x54, 0x2d, 0x68, 0x53, 0x00, 0x29, 0x12, 0x7f, + 0x0e, 0x7f, 0x00, 0x78, 0x54, 0x5a, 0x68, 0x53, 0x00, 0x2a, 0x00, 0x78, + 0x54, 0x2d, 0x68, 0x53, 0x00, 0x45, 0x00, 0x78, 0x54, 0x2d, 0x2e, 0x60, + 0x20, 0x19, 0x00, 0x02, 0x60, 0x17, 0x00, 0x14, 0x10, 0x78, 0x9d, 0xd7, + 0x12, 0x7f, 0x0e, 0x7f, 0x00, 0x7c, 0x20, 0x09, 0x00, 0x3e, 0x00, 0x78, + 0x54, 0x55, 0x20, 0x09, 0x00, 0x04, 0x00, 0x78, 0x54, 0x55, 0x20, 0x09, + 0x00, 0x06, 0x00, 0x78, 0x54, 0x55, 0x20, 0x09, 0x00, 0x16, 0x00, 0x78, + 0x54, 0x55, 0x20, 0x09, 0x00, 0x01, 0x68, 0x54, 0xa0, 0x84, 0xff, 0x00, + 0xa1, 0x05, 0x68, 0x56, 0x20, 0x91, 0x80, 0x00, 0x10, 0x78, 0x4a, 0x73, + 0x20, 0x91, 0x80, 0x01, 0x00, 0x7c, 0x10, 0x78, 0x13, 0xa4, 0x00, 0x7c, + 0x70, 0x2c, 0x71, 0x30, 0x81, 0x08, 0xa1, 0x02, 0x00, 0x48, 0x54, 0x71, + 0xa0, 0x0e, 0x70, 0x34, 0x70, 0x72, 0x70, 0x38, 0x70, 0x76, 0x00, 0x78, + 0x54, 0x7d, 0x70, 0x70, 0xa0, 0x80, 0x00, 0x40, 0x70, 0x72, 0x00, 0xc8, + 0x54, 0x7d, 0x70, 0x74, 0xa0, 0x81, 0x00, 0x00, 0x70, 0x76, 0xa0, 0x85, + 0x00, 0x01, 0x79, 0x32, 0x71, 0x32, 0x00, 0x7c, 0x0d, 0x7e, 0x10, 0x78, + 0x5b, 0x1e, 0x0d, 0x7f, 0x00, 0x7c, 0x0d, 0x7e, 0x20, 0x11, 0x00, 0x04, + 0x22, 0x04, 0xa0, 0x85, 0x80, 0x02, 0x20, 0x12, 0x0d, 0x7f, 0x00, 0x7c, + 0x20, 0xe1, 0x00, 0x02, 0x3d, 0x08, 0x20, 0xe1, 0x20, 0x00, 0x3d, 0x00, + 0xa0, 0x84, 0x70, 0x00, 0x00, 0x40, 0x54, 0x9c, 0xa0, 0x86, 0x10, 0x00, + 0x00, 0xc0, 0x54, 0xd3, 0x20, 0xe1, 0x00, 0x00, 0x3d, 0x00, 0xa0, 0x94, + 0xff, 0x00, 0x82, 0x17, 0xa0, 0x84, 0xf0, 0x00, 0xa0, 0x86, 0x30, 0x00, + 0x00, 0xc0, 0x54, 0xb7, 0xa1, 0x84, 0xff, 0x00, 0x80, 0x07, 0xa0, 0x86, + 0x00, 0x08, 0x00, 0xc0, 0x54, 0xd3, 0x10, 0x78, 0x29, 0xbb, 0x00, 0xc0, + 0x54, 0xd3, 0x10, 0x78, 0x56, 0xb2, 0x00, 0x78, 0x54, 0xce, 0x20, 0xe1, + 0x00, 0x04, 0x3d, 0x60, 0xd1, 0xbc, 0x00, 0xc0, 0x54, 0xbe, 0x3e, 0x60, + 0xac, 0x84, 0x00, 0x0f, 0x00, 0xc0, 0x54, 0xd3, 0xac, 0x82, 0xae, 0x00, + 0x00, 0x48, 0x54, 0xd3, 0x68, 0x58, 0xac, 0x02, 0x00, 0xc8, 0x54, 0xd3, + 0x20, 0x09, 0x00, 0x47, 0x10, 0x78, 0x77, 0x5c, 0x7a, 0x1c, 0xd2, 0x84, + 0x00, 0xc0, 0x54, 0x8e, 0x00, 0x7c, 0xa0, 0x16, 0x10, 0x78, 0x15, 0xfa, + 0x00, 0x78, 0x54, 0xce, 0x00, 0x78, 0x54, 0xd3, 0x78, 0x1c, 0xd0, 0x8c, + 0x00, 0x40, 0x55, 0x02, 0x15, 0x7e, 0x13, 0x7e, 0x14, 0x7e, 0x20, 0xe1, + 0x30, 0x00, 0x3d, 0x20, 0x3e, 0x28, 0xa5, 0x84, 0x00, 0x76, 0x00, 0xc0, + 0x55, 0x18, 0xa4, 0x84, 0x70, 0x00, 0xa0, 0x86, 0x10, 0x00, 0x00, 0xc0, + 0x55, 0x07, 0x10, 0x78, 0x55, 0x4e, 0x00, 0x40, 0x55, 0x18, 0x20, 0xe1, + 0x30, 0x00, 0x78, 0x28, 0x78, 0x28, 0x10, 0x78, 0x55, 0x6c, 0x14, 0x7f, + 0x13, 0x7f, 0x15, 0x7f, 0x20, 0x09, 0xa9, 0xb9, 0x21, 0x04, 0xa0, 0x05, + 0x00, 0xc0, 0x55, 0x03, 0x00, 0x7c, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x78, + 0x55, 0x02, 0xa4, 0x84, 0x70, 0x00, 0x00, 0xc0, 0x55, 0x18, 0x10, 0x78, + 0x55, 0x4e, 0x00, 0x40, 0x55, 0x2c, 0x70, 0x00, 0xa0, 0x84, 0xff, 0x00, + 0xa0, 0x86, 0x81, 0x00, 0x00, 0x40, 0x54, 0xf3, 0x00, 0x78, 0x55, 0x2c, + 0x10, 0x78, 0xa5, 0x5f, 0xd5, 0xa4, 0x00, 0x40, 0x55, 0x28, 0x04, 0x7e, + 0x10, 0x78, 0x1b, 0x22, 0x04, 0x7f, 0x20, 0xe1, 0x90, 0x10, 0x20, 0x01, + 0x01, 0x38, 0x22, 0x02, 0x00, 0x78, 0x55, 0x30, 0x10, 0x78, 0x55, 0x4e, + 0x68, 0x83, 0x00, 0x00, 0x20, 0xe1, 0x30, 0x00, 0x78, 0x28, 0x78, 0x28, + 0x10, 0x78, 0x55, 0x37, 0x14, 0x7f, 0x13, 0x7f, 0x15, 0x7f, 0x00, 0x78, + 0x55, 0x02, 0x20, 0x01, 0xa7, 0x0e, 0x20, 0x04, 0xd0, 0x8c, 0x00, 0x40, + 0x55, 0x4d, 0x20, 0x01, 0xa7, 0x00, 0x20, 0x04, 0xa0, 0x86, 0x00, 0x03, + 0x00, 0xc0, 0x55, 0x4d, 0x02, 0x7e, 0x03, 0x7e, 0x20, 0x11, 0x80, 0x48, + 0x25, 0x18, 0x10, 0x78, 0x36, 0x1b, 0x03, 0x7f, 0x02, 0x7f, 0x00, 0x7c, + 0xa4, 0x84, 0x01, 0xff, 0x68, 0x82, 0xa0, 0x05, 0x00, 0x40, 0x55, 0x60, + 0xa0, 0x80, 0x00, 0x1f, 0xa0, 0x84, 0x03, 0xf8, 0x80, 0xac, 0x20, 0xe1, + 0x10, 0x00, 0x2e, 0xa0, 0x20, 0x99, 0x02, 0x0a, 0x53, 0xa5, 0x00, 0x7c, + 0x20, 0xa9, 0x00, 0x0c, 0x20, 0xe1, 0x10, 0x00, 0x2e, 0xa0, 0x20, 0x99, + 0x02, 0x0a, 0x53, 0xa5, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x78, 0x55, 0x5f, + 0x70, 0x00, 0xa0, 0x84, 0xff, 0x00, 0xa0, 0x8c, 0xf0, 0x00, 0x80, 0x07, + 0xa1, 0x96, 0x00, 0x00, 0x00, 0xc0, 0x55, 0x79, 0x00, 0x78, 0x57, 0xba, + 0x00, 0x7c, 0xa1, 0x96, 0x20, 0x00, 0x00, 0xc0, 0x55, 0x8a, 0x69, 0x00, + 0xa1, 0x8e, 0x00, 0x01, 0x00, 0xc0, 0x55, 0x86, 0x10, 0x78, 0x3a, 0xec, + 0x00, 0x78, 0x55, 0x78, 0x10, 0x78, 0x55, 0x92, 0x00, 0x78, 0x55, 0x78, + 0xa1, 0x96, 0x80, 0x00, 0x00, 0xc0, 0x55, 0x78, 0x10, 0x78, 0x58, 0x71, + 0x00, 0x78, 0x55, 0x78, 0x0c, 0x7e, 0x71, 0x10, 0xa1, 0x8c, 0xff, 0x00, + 0x81, 0x0f, 0xa1, 0x96, 0x00, 0x01, 0x00, 0x40, 0x55, 0x9f, 0xa1, 0x96, + 0x00, 0x23, 0x00, 0xc0, 0x56, 0xaa, 0xa0, 0x8e, 0x00, 0x23, 0x00, 0xc0, + 0x55, 0xd4, 0x10, 0x78, 0x59, 0x1d, 0x00, 0x40, 0x56, 0xaa, 0x71, 0x24, + 0x61, 0x0a, 0x70, 0x30, 0xa0, 0x8e, 0x02, 0x00, 0x00, 0xc0, 0x55, 0xb8, + 0x70, 0x34, 0xa0, 0x05, 0x00, 0xc0, 0x56, 0xaa, 0x20, 0x09, 0x00, 0x15, + 0x10, 0x78, 0x77, 0x5c, 0x00, 0x78, 0x56, 0xaa, 0xa0, 0x8e, 0x02, 0x14, + 0x00, 0x40, 0x55, 0xc0, 0xa0, 0x8e, 0x02, 0x10, 0x00, 0xc0, 0x55, 0xc6, + 0x20, 0x09, 0x00, 0x15, 0x10, 0x78, 0x77, 0x5c, 0x00, 0x78, 0x56, 0xaa, + 0xa0, 0x8e, 0x01, 0x00, 0x00, 0xc0, 0x56, 0xaa, 0x70, 0x34, 0xa0, 0x05, + 0x00, 0xc0, 0x56, 0xaa, 0x20, 0x09, 0x00, 0x16, 0x10, 0x78, 0x77, 0x5c, + 0x00, 0x78, 0x56, 0xaa, 0xa0, 0x8e, 0x00, 0x22, 0x00, 0xc0, 0x56, 0xaa, + 0x70, 0x30, 0xa0, 0x8e, 0x03, 0x00, 0x00, 0xc0, 0x55, 0xe5, 0x70, 0x34, + 0xa0, 0x05, 0x00, 0xc0, 0x56, 0xaa, 0x20, 0x09, 0x00, 0x17, 0x00, 0x78, + 0x56, 0x76, 0xa0, 0x8e, 0x05, 0x00, 0x00, 0xc0, 0x55, 0xf1, 0x70, 0x34, + 0xa0, 0x05, 0x00, 0xc0, 0x56, 0xaa, 0x20, 0x09, 0x00, 0x18, 0x00, 0x78, + 0x56, 0x76, 0xa0, 0x8e, 0x20, 0x10, 0x00, 0xc0, 0x55, 0xf9, 0x20, 0x09, + 0x00, 0x19, 0x00, 0x78, 0x56, 0x76, 0xa0, 0x8e, 0x21, 0x10, 0x00, 0xc0, + 0x56, 0x01, 0x20, 0x09, 0x00, 0x1a, 0x00, 0x78, 0x56, 0x76, 0xa0, 0x8e, + 0x52, 0x00, 0x00, 0xc0, 0x56, 0x0d, 0x70, 0x34, 0xa0, 0x05, 0x00, 0xc0, + 0x56, 0xaa, 0x20, 0x09, 0x00, 0x1b, 0x00, 0x78, 0x56, 0x76, 0xa0, 0x8e, + 0x50, 0x00, 0x00, 0xc0, 0x56, 0x19, 0x70, 0x34, 0xa0, 0x05, 0x00, 0xc0, + 0x56, 0xaa, 0x20, 0x09, 0x00, 0x1c, 0x00, 0x78, 0x56, 0x76, 0xa0, 0x8e, + 0x13, 0x00, 0x00, 0xc0, 0x56, 0x21, 0x20, 0x09, 0x00, 0x34, 0x00, 0x78, + 0x56, 0x76, 0xa0, 0x8e, 0x12, 0x00, 0x00, 0xc0, 0x56, 0x2d, 0x70, 0x34, + 0xa0, 0x05, 0x00, 0xc0, 0x56, 0xaa, 0x20, 0x09, 0x00, 0x24, 0x00, 0x78, + 0x56, 0x76, 0xa0, 0x8c, 0xff, 0x00, 0xa1, 0x8e, 0x24, 0x00, 0x00, 0xc0, + 0x56, 0x37, 0x20, 0x09, 0x00, 0x2d, 0x00, 0x78, 0x56, 0x76, 0xa0, 0x8c, + 0xff, 0x00, 0xa1, 0x8e, 0x53, 0x00, 0x00, 0xc0, 0x56, 0x41, 0x20, 0x09, + 0x00, 0x2a, 0x00, 0x78, 0x56, 0x76, 0xa0, 0x8e, 0x0f, 0x00, 0x00, 0xc0, + 0x56, 0x49, 0x20, 0x09, 0x00, 0x20, 0x00, 0x78, 0x56, 0x76, 0xa0, 0x8e, + 0x53, 0x00, 0x00, 0xc0, 0x56, 0x4f, 0x00, 0x78, 0x56, 0x6c, 0xa0, 0x8e, + 0x61, 0x04, 0x00, 0xc0, 0x56, 0x6c, 0x20, 0x11, 0xac, 0x8d, 0x82, 0x08, + 0x22, 0x04, 0xa0, 0x82, 0x00, 0x04, 0x20, 0xa8, 0x95, 0xac, 0x95, 0xac, + 0x20, 0x11, 0x80, 0x15, 0x21, 0x1c, 0x81, 0x08, 0x04, 0x7e, 0x21, 0x24, + 0x10, 0x78, 0x36, 0x1b, 0x04, 0x7f, 0x81, 0x08, 0x00, 0xf0, 0x56, 0x5c, + 0x20, 0x09, 0x00, 0x23, 0x00, 0x78, 0x56, 0x76, 0xa0, 0x8e, 0x60, 0x00, + 0x00, 0xc0, 0x56, 0x74, 0x20, 0x09, 0x00, 0x3f, 0x00, 0x78, 0x56, 0x76, + 0x20, 0x09, 0x00, 0x1d, 0x01, 0x7e, 0x20, 0x11, 0xac, 0x83, 0x22, 0x04, + 0x82, 0x11, 0x22, 0x0c, 0x10, 0x78, 0x25, 0x4d, 0x00, 0xc0, 0x56, 0xac, + 0x10, 0x78, 0x45, 0x5c, 0x00, 0xc0, 0x56, 0xac, 0x66, 0x12, 0x65, 0x16, + 0x86, 0xff, 0x00, 0x40, 0x56, 0x9c, 0x01, 0x7f, 0x01, 0x7e, 0xa1, 0x86, + 0x00, 0x17, 0x00, 0xc0, 0x56, 0x9c, 0x68, 0x6c, 0xa6, 0x06, 0x00, 0xc0, + 0x56, 0x9c, 0x68, 0x70, 0xa5, 0x06, 0xa0, 0x84, 0xff, 0x00, 0x00, 0xc0, + 0x56, 0x9c, 0x60, 0x00, 0xc0, 0xf5, 0x60, 0x02, 0x0c, 0x7e, 0x10, 0x78, + 0x76, 0xc7, 0x00, 0x40, 0x56, 0xaf, 0x01, 0x7f, 0x61, 0x1a, 0x60, 0x1f, + 0x00, 0x04, 0x71, 0x20, 0x61, 0x0a, 0x01, 0x7f, 0x10, 0x78, 0x77, 0x5c, + 0x0c, 0x7f, 0x00, 0x7c, 0x01, 0x7f, 0x00, 0x78, 0x56, 0xaa, 0x0c, 0x7f, + 0x00, 0x78, 0x56, 0xac, 0x0c, 0x7e, 0x10, 0x78, 0x57, 0x0f, 0x00, 0xc0, + 0x57, 0x0d, 0xa2, 0x8e, 0x00, 0x33, 0x00, 0xc0, 0x56, 0xde, 0x10, 0x78, + 0x59, 0x1d, 0x00, 0x40, 0x57, 0x0d, 0x71, 0x24, 0x61, 0x0a, 0x70, 0x30, + 0xa0, 0x8e, 0x02, 0x00, 0x00, 0xc0, 0x56, 0xd0, 0x70, 0x34, 0xa0, 0x05, + 0x00, 0xc0, 0x57, 0x0d, 0x20, 0x09, 0x00, 0x15, 0x10, 0x78, 0x77, 0x5c, + 0x00, 0x78, 0x57, 0x0d, 0xa0, 0x8e, 0x01, 0x00, 0x00, 0xc0, 0x57, 0x0d, + 0x70, 0x34, 0xa0, 0x05, 0x00, 0xc0, 0x57, 0x0d, 0x20, 0x09, 0x00, 0x16, + 0x10, 0x78, 0x77, 0x5c, 0x00, 0x78, 0x57, 0x0d, 0xa2, 0x8e, 0x00, 0x32, + 0x00, 0xc0, 0x57, 0x0d, 0x70, 0x30, 0xa0, 0x8e, 0x14, 0x00, 0x00, 0xc0, + 0x57, 0x0d, 0x20, 0x09, 0x00, 0x38, 0x01, 0x7e, 0x20, 0x11, 0xac, 0x83, + 0x22, 0x04, 0x82, 0x11, 0x22, 0x0c, 0x10, 0x78, 0x25, 0x4d, 0x00, 0xc0, + 0x57, 0x0c, 0x10, 0x78, 0x45, 0x5c, 0x00, 0xc0, 0x57, 0x0c, 0x66, 0x12, + 0x65, 0x16, 0x0c, 0x7e, 0x10, 0x78, 0x76, 0xc7, 0x00, 0x40, 0x57, 0x0b, + 0x01, 0x7f, 0x61, 0x1a, 0x60, 0x1f, 0x00, 0x04, 0x71, 0x20, 0x61, 0x0a, + 0x01, 0x7f, 0x10, 0x78, 0x77, 0x5c, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x78, + 0x57, 0x0d, 0x0c, 0x7f, 0x01, 0x7f, 0x0c, 0x7f, 0x00, 0x7c, 0x0f, 0x7e, + 0x0d, 0x7e, 0x02, 0x7e, 0x01, 0x7e, 0x13, 0x7e, 0x14, 0x7e, 0x15, 0x7e, + 0x3c, 0x00, 0x00, 0x7e, 0x20, 0x79, 0x00, 0x30, 0x20, 0x69, 0x02, 0x00, + 0x10, 0x78, 0x1c, 0x6a, 0x00, 0xc0, 0x57, 0x50, 0x10, 0x78, 0x1b, 0x40, + 0x00, 0x40, 0x57, 0x5d, 0x79, 0x08, 0xa1, 0x8c, 0x1f, 0xff, 0xa1, 0x82, + 0x00, 0x11, 0x00, 0xc8, 0x57, 0x5a, 0x20, 0xa9, 0x00, 0x0c, 0x20, 0xe1, + 0x00, 0x00, 0x2e, 0xa0, 0x20, 0x99, 0x02, 0x0a, 0x53, 0xa5, 0x20, 0xe1, + 0x20, 0x00, 0x20, 0x01, 0x02, 0x0a, 0x20, 0x04, 0x7a, 0x0c, 0x78, 0x08, + 0xa0, 0x80, 0x00, 0x07, 0xa0, 0x84, 0x1f, 0xf8, 0xa0, 0x8a, 0x01, 0x40, + 0x10, 0xc8, 0x13, 0x32, 0x80, 0xac, 0x20, 0xe1, 0x60, 0x00, 0x20, 0x99, + 0x02, 0x0a, 0x53, 0xa5, 0x20, 0xe1, 0x70, 0x00, 0x68, 0x28, 0x68, 0x28, + 0x78, 0x03, 0x00, 0x04, 0xa2, 0x94, 0x00, 0x70, 0x00, 0x7f, 0x20, 0xe0, + 0x15, 0x7f, 0x14, 0x7f, 0x13, 0x7f, 0x01, 0x7f, 0x02, 0x7f, 0x0d, 0x7f, + 0x0f, 0x7f, 0x00, 0x7c, 0xa0, 0x16, 0x10, 0x78, 0x15, 0xfa, 0xa0, 0x85, + 0x00, 0x01, 0x00, 0x78, 0x57, 0x50, 0x04, 0x7e, 0x0e, 0x7e, 0x0d, 0x7e, + 0x20, 0x28, 0x21, 0x30, 0xa6, 0x96, 0x00, 0xff, 0x00, 0xc0, 0x57, 0x82, + 0xa5, 0x96, 0xff, 0xfd, 0x00, 0xc0, 0x57, 0x72, 0x20, 0x09, 0x00, 0x7f, + 0x00, 0x78, 0x57, 0xb5, 0xa5, 0x96, 0xff, 0xfe, 0x00, 0xc0, 0x57, 0x7a, + 0x20, 0x09, 0x00, 0x7e, 0x00, 0x78, 0x57, 0xb5, 0xa5, 0x96, 0xff, 0xfc, + 0x00, 0xc0, 0x57, 0x82, 0x20, 0x09, 0x00, 0x80, 0x00, 0x78, 0x57, 0xb5, + 0x20, 0x11, 0x00, 0x00, 0x20, 0x21, 0x00, 0x81, 0x20, 0xa9, 0x00, 0x7e, + 0x20, 0x71, 0xa8, 0xb6, 0x2e, 0x1c, 0x83, 0xff, 0x00, 0xc0, 0x57, 0x94, + 0x82, 0xff, 0x00, 0xc0, 0x57, 0xa9, 0x24, 0x10, 0x00, 0x78, 0x57, 0xa9, + 0x23, 0x68, 0x6f, 0x10, 0x00, 0x7e, 0x21, 0x00, 0xa7, 0x06, 0x00, 0x7f, + 0x6b, 0x14, 0x00, 0xc0, 0x57, 0xa3, 0xa3, 0x46, 0x00, 0xc0, 0x57, 0xa3, + 0x24, 0x08, 0x00, 0x78, 0x57, 0xb5, 0x87, 0xff, 0x00, 0xc0, 0x57, 0xa9, + 0x83, 0xff, 0x00, 0x40, 0x57, 0x8e, 0x84, 0x20, 0x8e, 0x70, 0x00, 0xf0, + 0x57, 0x8a, 0x82, 0xff, 0x00, 0xc0, 0x57, 0xb4, 0xa0, 0x85, 0x00, 0x01, + 0x00, 0x78, 0x57, 0xb6, 0x22, 0x08, 0xa0, 0x06, 0x0d, 0x7f, 0x0e, 0x7f, + 0x04, 0x7f, 0x00, 0x7c, 0xa0, 0x84, 0x00, 0x07, 0x00, 0x79, 0x57, 0xbf, + 0x00, 0x7c, 0x57, 0xc7, 0x57, 0xc7, 0x57, 0xc7, 0x59, 0x33, 0x57, 0xc7, + 0x57, 0xc8, 0x57, 0xe1, 0x58, 0x58, 0x00, 0x7c, 0x71, 0x10, 0xd1, 0xbc, + 0x00, 0x40, 0x57, 0xe0, 0x71, 0x20, 0x21, 0x60, 0xac, 0x8c, 0x00, 0x0f, + 0x00, 0xc0, 0x57, 0xe0, 0xac, 0x8a, 0xae, 0x00, 0x00, 0x48, 0x57, 0xe0, + 0x68, 0x58, 0xac, 0x02, 0x00, 0xc8, 0x57, 0xe0, 0x71, 0x24, 0x61, 0x0a, + 0x20, 0x09, 0x00, 0x46, 0x10, 0x78, 0x77, 0x5c, 0x00, 0x7c, 0x0c, 0x7e, + 0xa4, 0x84, 0x01, 0xff, 0x00, 0x40, 0x58, 0x33, 0x71, 0x10, 0xd1, 0xbc, + 0x00, 0xc0, 0x58, 0x33, 0x20, 0x11, 0xac, 0x83, 0x22, 0x04, 0x82, 0x11, + 0x22, 0x0c, 0x10, 0x78, 0x25, 0x4d, 0x00, 0xc0, 0x58, 0x33, 0x10, 0x78, + 0x45, 0x5c, 0x00, 0xc0, 0x58, 0x33, 0x66, 0x12, 0x65, 0x16, 0x60, 0x00, + 0xd0, 0xec, 0x00, 0xc0, 0x58, 0x33, 0x62, 0x04, 0xa2, 0x94, 0xff, 0x00, + 0x82, 0x17, 0xa2, 0x86, 0x00, 0x06, 0x00, 0xc0, 0x58, 0x18, 0x0c, 0x7e, + 0x10, 0x78, 0x76, 0xc7, 0x01, 0x7f, 0x00, 0x40, 0x58, 0x35, 0x61, 0x1a, + 0x60, 0x1f, 0x00, 0x06, 0x71, 0x20, 0x61, 0x0a, 0x71, 0x30, 0x61, 0x22, + 0x20, 0x09, 0x00, 0x44, 0x10, 0x78, 0x77, 0x5c, 0x00, 0x78, 0x58, 0x33, + 0x0c, 0x7e, 0x10, 0x78, 0x76, 0xc7, 0x01, 0x7f, 0x00, 0x40, 0x58, 0x33, + 0x61, 0x1a, 0x60, 0x1f, 0x00, 0x04, 0x71, 0x20, 0x61, 0x0a, 0xa2, 0x86, + 0x00, 0x04, 0x00, 0xc0, 0x58, 0x2b, 0x60, 0x07, 0x00, 0x05, 0x00, 0x78, + 0x58, 0x2d, 0x60, 0x07, 0x00, 0x01, 0x60, 0x03, 0x00, 0x01, 0x10, 0x78, + 0x5d, 0xd7, 0x10, 0x78, 0x62, 0xd1, 0x0c, 0x7f, 0x00, 0x7c, 0x20, 0x01, + 0xa7, 0x0d, 0x20, 0x04, 0xd0, 0xec, 0x00, 0x40, 0x58, 0x3f, 0x20, 0x11, + 0x80, 0x49, 0x10, 0x78, 0x36, 0x1b, 0x0c, 0x7e, 0x10, 0x78, 0x91, 0x97, + 0x01, 0x7f, 0x00, 0x40, 0x58, 0x33, 0x61, 0x1a, 0x60, 0x1f, 0x00, 0x06, + 0x71, 0x20, 0x61, 0x0a, 0x71, 0x30, 0x61, 0x22, 0x60, 0x13, 0x03, 0x00, + 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x41, 0x10, 0x78, 0x5d, 0x8a, + 0x10, 0x78, 0x62, 0xd1, 0x00, 0x78, 0x58, 0x33, 0x71, 0x10, 0xd1, 0xbc, + 0x00, 0x40, 0x58, 0x70, 0x70, 0x20, 0x20, 0x60, 0xac, 0x84, 0x00, 0x0f, + 0x00, 0xc0, 0x58, 0x70, 0xac, 0x82, 0xae, 0x00, 0x00, 0x48, 0x58, 0x70, + 0x68, 0x58, 0xac, 0x02, 0x00, 0xc8, 0x58, 0x70, 0x71, 0x24, 0x61, 0x0a, + 0x20, 0x09, 0x00, 0x45, 0x10, 0x78, 0x77, 0x5c, 0x00, 0x7c, 0x00, 0x7e, + 0x10, 0x78, 0x29, 0xbb, 0x00, 0x7f, 0x00, 0xc0, 0x58, 0x87, 0x71, 0x10, + 0xa1, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0xa1, 0x8e, 0x00, 0x00, 0x00, 0xc0, + 0x58, 0x87, 0xa0, 0x84, 0x00, 0x0f, 0xa0, 0x8a, 0x00, 0x06, 0x00, 0xc8, + 0x58, 0x87, 0x10, 0x79, 0x58, 0x88, 0x00, 0x7c, 0x58, 0x8e, 0x58, 0x8f, + 0x58, 0x8e, 0x58, 0x8e, 0x58, 0xff, 0x59, 0x0e, 0x00, 0x7c, 0x71, 0x10, + 0xd1, 0xbc, 0x00, 0x40, 0x58, 0x97, 0x70, 0x2c, 0xd0, 0x84, 0x00, 0x40, + 0x58, 0xfe, 0x70, 0x0c, 0x71, 0x08, 0x10, 0x78, 0x25, 0x4d, 0x00, 0xc0, + 0x58, 0xfe, 0x10, 0x78, 0x45, 0x5c, 0x00, 0xc0, 0x58, 0xfe, 0x66, 0x12, + 0x65, 0x16, 0x62, 0x04, 0x71, 0x10, 0xd1, 0xbc, 0x00, 0x40, 0x58, 0xc9, + 0xa2, 0x8c, 0x00, 0xff, 0xa1, 0x86, 0x00, 0x04, 0x00, 0x40, 0x58, 0xb2, + 0xa1, 0x86, 0x00, 0x06, 0x00, 0xc0, 0x58, 0xef, 0x0c, 0x7e, 0x10, 0x78, + 0x59, 0x1d, 0x0c, 0x7f, 0x00, 0x40, 0x58, 0xfe, 0x0c, 0x7e, 0x10, 0x78, + 0x76, 0xc7, 0x01, 0x7f, 0x00, 0x40, 0x58, 0xfe, 0x61, 0x1a, 0x60, 0x1f, + 0x00, 0x02, 0x71, 0x20, 0x61, 0x0a, 0x20, 0x09, 0x00, 0x88, 0x10, 0x78, + 0x77, 0x5c, 0x00, 0x78, 0x58, 0xfe, 0xa2, 0x8c, 0x00, 0xff, 0xa1, 0x86, + 0x00, 0x06, 0x00, 0x40, 0x58, 0xde, 0xa1, 0x86, 0x00, 0x04, 0x00, 0x40, + 0x58, 0xde, 0xa2, 0x94, 0xff, 0x00, 0x82, 0x17, 0xa2, 0x86, 0x00, 0x04, + 0x00, 0x40, 0x58, 0xde, 0xa2, 0x86, 0x00, 0x06, 0x00, 0xc0, 0x58, 0xef, + 0x0c, 0x7e, 0x10, 0x78, 0x76, 0xc7, 0x01, 0x7f, 0x00, 0x40, 0x58, 0xfe, + 0x61, 0x1a, 0x60, 0x1f, 0x00, 0x05, 0x71, 0x20, 0x61, 0x0a, 0x20, 0x09, + 0x00, 0x88, 0x10, 0x78, 0x77, 0x5c, 0x00, 0x78, 0x58, 0xfe, 0x0c, 0x7e, + 0x10, 0x78, 0x76, 0xc7, 0x01, 0x7f, 0x00, 0x40, 0x58, 0xfe, 0x61, 0x1a, + 0x60, 0x1f, 0x00, 0x04, 0x71, 0x20, 0x61, 0x0a, 0x20, 0x09, 0x00, 0x01, + 0x10, 0x78, 0x77, 0x5c, 0x00, 0x7c, 0x71, 0x10, 0xd1, 0xbc, 0x00, 0x40, + 0x59, 0x0d, 0x10, 0x78, 0x59, 0x1d, 0x00, 0x40, 0x59, 0x0d, 0x71, 0x24, + 0x61, 0x0a, 0x20, 0x09, 0x00, 0x89, 0x10, 0x78, 0x77, 0x5c, 0x00, 0x7c, + 0x71, 0x10, 0xd1, 0xbc, 0x00, 0x40, 0x59, 0x1c, 0x10, 0x78, 0x59, 0x1d, + 0x00, 0x40, 0x59, 0x1c, 0x71, 0x24, 0x61, 0x0a, 0x20, 0x09, 0x00, 0x8a, + 0x10, 0x78, 0x77, 0x5c, 0x00, 0x7c, 0x70, 0x20, 0x20, 0x60, 0xac, 0x84, + 0x00, 0x0f, 0x00, 0xc0, 0x59, 0x30, 0xac, 0x82, 0xae, 0x00, 0x00, 0x48, + 0x59, 0x30, 0x20, 0x01, 0xa7, 0x16, 0x20, 0x04, 0xac, 0x02, 0x00, 0xc8, + 0x59, 0x30, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x7c, 0xa0, 0x06, 0x00, 0x78, + 0x59, 0x2f, 0x71, 0x10, 0xd1, 0xbc, 0x00, 0xc0, 0x59, 0x49, 0x70, 0x24, + 0x20, 0x60, 0xac, 0x84, 0x00, 0x0f, 0x00, 0xc0, 0x59, 0x49, 0xac, 0x82, + 0xae, 0x00, 0x00, 0x48, 0x59, 0x49, 0x68, 0x58, 0xac, 0x02, 0x00, 0xc8, + 0x59, 0x49, 0x20, 0x09, 0x00, 0x51, 0x10, 0x78, 0x77, 0x5c, 0x00, 0x7c, + 0x20, 0x71, 0xa9, 0xc4, 0x70, 0x03, 0x00, 0x03, 0x70, 0x0f, 0x03, 0x61, + 0xa0, 0x06, 0x70, 0x1a, 0x70, 0x12, 0x70, 0x17, 0xae, 0x00, 0x70, 0x07, + 0x00, 0x00, 0x70, 0x26, 0x70, 0x2b, 0x6e, 0x1c, 0x70, 0x32, 0x70, 0x37, + 0x6e, 0x70, 0x70, 0x3b, 0x00, 0x02, 0x70, 0x3f, 0x00, 0x00, 0x70, 0x43, + 0xff, 0xff, 0x70, 0x47, 0xff, 0xff, 0x00, 0x7c, 0x20, 0x71, 0xa9, 0xc4, + 0x00, 0xe0, 0x5a, 0x32, 0x20, 0x91, 0x60, 0x00, 0x70, 0x0c, 0x80, 0x01, + 0x70, 0x0e, 0x00, 0xc0, 0x59, 0xde, 0x70, 0x0f, 0x03, 0x61, 0x70, 0x07, + 0x00, 0x01, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x71, 0x38, 0x81, 0x09, + 0x71, 0x3a, 0x00, 0xc0, 0x59, 0xdc, 0x70, 0x3b, 0x00, 0x02, 0x20, 0x09, + 0x01, 0x00, 0x21, 0x04, 0xa0, 0x82, 0x00, 0x03, 0x00, 0xc8, 0x59, 0xdc, + 0x70, 0x3c, 0xa0, 0x86, 0x00, 0x01, 0x00, 0xc0, 0x59, 0xb9, 0x0d, 0x7e, + 0x20, 0x69, 0x01, 0x40, 0x68, 0x04, 0xa0, 0x84, 0x40, 0x00, 0x00, 0x40, + 0x59, 0x97, 0x68, 0x03, 0x10, 0x00, 0x00, 0x78, 0x59, 0x9e, 0x68, 0x04, + 0xa0, 0x84, 0x10, 0x00, 0x00, 0x40, 0x59, 0x9e, 0x68, 0x03, 0x01, 0x00, + 0x68, 0x03, 0x00, 0x00, 0x70, 0x3f, 0x00, 0x00, 0x20, 0x69, 0xa9, 0xb1, + 0x68, 0x04, 0xa0, 0x82, 0x00, 0x06, 0x00, 0xc0, 0x59, 0xab, 0x68, 0x07, + 0x00, 0x00, 0x68, 0x30, 0xa0, 0x82, 0x00, 0x03, 0x00, 0xc0, 0x59, 0xb2, + 0x68, 0x33, 0x00, 0x00, 0x10, 0x78, 0x62, 0xd1, 0x10, 0x78, 0x63, 0x9b, + 0x0d, 0x7f, 0x00, 0x78, 0x59, 0xdc, 0x0d, 0x7e, 0x20, 0x69, 0xa7, 0x00, + 0x69, 0x48, 0x68, 0x64, 0xa1, 0x02, 0x00, 0xc8, 0x59, 0xdb, 0x20, 0x69, + 0xa9, 0xb1, 0x68, 0x04, 0xa0, 0x86, 0x00, 0x00, 0x00, 0xc0, 0x59, 0xdb, + 0x68, 0x30, 0xa0, 0x86, 0x00, 0x00, 0x00, 0xc0, 0x59, 0xdb, 0x70, 0x3f, + 0x00, 0x01, 0x68, 0x07, 0x00, 0x06, 0x68, 0x33, 0x00, 0x03, 0x20, 0x69, + 0x01, 0x00, 0x68, 0x30, 0x68, 0x9e, 0x20, 0x69, 0x01, 0x40, 0x68, 0x03, + 0x06, 0x00, 0x0d, 0x7f, 0x00, 0x78, 0x59, 0xe1, 0x12, 0x7e, 0x20, 0x91, + 0x80, 0x00, 0x70, 0x24, 0xa0, 0x0d, 0x00, 0x40, 0x59, 0xf9, 0x70, 0x20, + 0x80, 0x01, 0x70, 0x22, 0x00, 0xc0, 0x59, 0xf9, 0x70, 0x23, 0x00, 0x09, + 0x81, 0x09, 0x71, 0x26, 0xa1, 0x86, 0x03, 0xe8, 0x00, 0xc0, 0x59, 0xf4, + 0x70, 0x28, 0x10, 0x7a, 0x81, 0xff, 0x00, 0xc0, 0x59, 0xf9, 0x70, 0x28, + 0x10, 0x7a, 0x70, 0x30, 0xa0, 0x0d, 0x00, 0x40, 0x5a, 0x10, 0x70, 0x2c, + 0x80, 0x01, 0x70, 0x2e, 0x00, 0xc0, 0x5a, 0x10, 0x70, 0x2f, 0x00, 0x09, + 0x81, 0x09, 0x71, 0x32, 0x00, 0x40, 0x5a, 0x0e, 0xa1, 0x84, 0x00, 0x7f, + 0x10, 0x40, 0x6e, 0xa2, 0x00, 0x78, 0x5a, 0x10, 0x70, 0x34, 0x10, 0x7a, + 0x70, 0x40, 0xa0, 0x05, 0x00, 0x40, 0x5a, 0x18, 0x00, 0x50, 0x5a, 0x18, + 0x80, 0x01, 0x70, 0x42, 0x70, 0x44, 0xa0, 0x05, 0x00, 0x40, 0x5a, 0x20, + 0x00, 0x50, 0x5a, 0x20, 0x80, 0x01, 0x70, 0x46, 0x70, 0x18, 0xa0, 0x0d, + 0x00, 0x40, 0x5a, 0x31, 0x70, 0x08, 0x80, 0x01, 0x70, 0x0a, 0x00, 0xc0, + 0x5a, 0x31, 0x70, 0x0b, 0x00, 0x09, 0x81, 0x09, 0x71, 0x1a, 0x00, 0xc0, + 0x5a, 0x31, 0x70, 0x1c, 0x10, 0x7a, 0x12, 0x7f, 0x70, 0x04, 0x00, 0x79, + 0x5a, 0x35, 0x5a, 0x5c, 0x5a, 0x5d, 0x5a, 0x79, 0x0e, 0x7e, 0x20, 0x71, + 0xa9, 0xc4, 0x70, 0x18, 0xa0, 0x05, 0x00, 0xc0, 0x5a, 0x43, 0x71, 0x1a, + 0x72, 0x1e, 0x70, 0x0b, 0x00, 0x09, 0x0e, 0x7f, 0x00, 0x7c, 0x0e, 0x7e, + 0x00, 0x7e, 0x20, 0x71, 0xa9, 0xc4, 0x70, 0x1c, 0xa2, 0x06, 0x00, 0xc0, + 0x5a, 0x4f, 0x70, 0x1a, 0x70, 0x1e, 0x00, 0x7f, 0x0e, 0x7f, 0x00, 0x7c, + 0x0e, 0x7e, 0x20, 0x71, 0xa9, 0xc4, 0x60, 0x88, 0xa1, 0x02, 0x00, 0x48, + 0x5a, 0x5a, 0x61, 0x8a, 0x0e, 0x7f, 0x00, 0x7c, 0x00, 0x7c, 0x71, 0x10, + 0x10, 0x78, 0x45, 0xc4, 0x00, 0xc0, 0x5a, 0x6f, 0x60, 0x88, 0x80, 0x01, + 0x00, 0x48, 0x5a, 0x6f, 0x60, 0x8a, 0x00, 0xc0, 0x5a, 0x6f, 0x12, 0x7e, + 0x20, 0x91, 0x80, 0x00, 0x10, 0x78, 0x62, 0xd1, 0x12, 0x7f, 0x81, 0x08, + 0xa1, 0x82, 0x00, 0xff, 0x00, 0x48, 0x5a, 0x77, 0xa0, 0x0e, 0x70, 0x07, + 0x00, 0x02, 0x71, 0x12, 0x00, 0x7c, 0x70, 0x14, 0x20, 0x60, 0x12, 0x7e, + 0x20, 0x91, 0x80, 0x00, 0x60, 0x3c, 0xa0, 0x05, 0x00, 0x40, 0x5a, 0x88, + 0x80, 0x01, 0x60, 0x3e, 0x00, 0xc0, 0x5a, 0x88, 0x10, 0x78, 0x8f, 0xac, + 0x60, 0x14, 0xa0, 0x05, 0x00, 0x40, 0x5a, 0xb2, 0x80, 0x01, 0x60, 0x16, + 0x00, 0xc0, 0x5a, 0xb2, 0x61, 0x1c, 0xa1, 0x86, 0x00, 0x03, 0x00, 0x40, + 0x5a, 0x99, 0xa1, 0x86, 0x00, 0x06, 0x00, 0xc0, 0x5a, 0xb0, 0x60, 0x10, + 0x20, 0x68, 0x68, 0x54, 0xa0, 0x8a, 0x19, 0x9a, 0x00, 0x48, 0x5a, 0xb0, + 0xa0, 0x82, 0x19, 0x99, 0x68, 0x56, 0xa0, 0x8a, 0x19, 0x9a, 0x00, 0x48, + 0x5a, 0xa9, 0x20, 0x01, 0x19, 0x99, 0x80, 0x03, 0x80, 0x0b, 0x81, 0x0b, + 0xa1, 0x08, 0x61, 0x16, 0x00, 0x78, 0x5a, 0xb2, 0x10, 0x78, 0x8a, 0xce, + 0x12, 0x7f, 0xac, 0x88, 0x00, 0x10, 0x71, 0x16, 0x20, 0x01, 0xce, 0x00, + 0xa1, 0x02, 0x00, 0x48, 0x5a, 0xbf, 0x70, 0x17, 0xae, 0x00, 0x70, 0x07, + 0x00, 0x00, 0x00, 0x7c, 0x0e, 0x7e, 0x20, 0x71, 0xa9, 0xc4, 0x70, 0x27, + 0x07, 0xd0, 0x70, 0x23, 0x00, 0x09, 0x70, 0x3b, 0x00, 0x02, 0x0e, 0x7f, + 0x00, 0x7c, 0x20, 0x01, 0xa9, 0xcd, 0x20, 0x03, 0x00, 0x00, 0x00, 0x7c, + 0x0e, 0x7e, 0x20, 0x71, 0xa9, 0xc4, 0x71, 0x32, 0x70, 0x2f, 0x00, 0x09, + 0x0e, 0x7f, 0x00, 0x7c, 0x20, 0x11, 0xa9, 0xd0, 0x20, 0x13, 0x00, 0x00, + 0x00, 0x7c, 0x0e, 0x7e, 0x20, 0x71, 0xa9, 0xc4, 0x71, 0x1a, 0x72, 0x1e, + 0x70, 0x0b, 0x00, 0x09, 0x0e, 0x7f, 0x00, 0x7c, 0x02, 0x7e, 0x0e, 0x7e, + 0x0f, 0x7e, 0x20, 0x79, 0xa7, 0x00, 0x7a, 0x34, 0xd2, 0x94, 0x00, 0x40, + 0x5b, 0x15, 0x20, 0x71, 0xa9, 0xac, 0x2e, 0x14, 0xa0, 0xfe, 0x00, 0x00, + 0x00, 0x40, 0x5b, 0x02, 0xa0, 0xfe, 0x00, 0x01, 0x00, 0x40, 0x5b, 0x06, + 0xa0, 0xfe, 0x00, 0x02, 0x00, 0xc0, 0x5b, 0x11, 0xa2, 0x92, 0x00, 0x85, + 0x00, 0x78, 0x5b, 0x08, 0xa2, 0x92, 0x00, 0x05, 0x00, 0x78, 0x5b, 0x08, + 0xa2, 0x92, 0x00, 0x02, 0x22, 0x72, 0x00, 0x40, 0x5b, 0x0d, 0x00, 0xc8, + 0x5b, 0x15, 0x20, 0x11, 0x80, 0x37, 0x10, 0x78, 0x36, 0x1b, 0x20, 0x11, + 0xa9, 0xab, 0x22, 0x04, 0x20, 0x72, 0x0f, 0x7f, 0x0e, 0x7f, 0x02, 0x7f, + 0x00, 0x7c, 0x0c, 0x7e, 0x20, 0x61, 0xaa, 0x33, 0x0c, 0x7f, 0x00, 0x7c, + 0xa1, 0x84, 0x00, 0x0f, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0xa0, 0x80, + 0xaa, 0x33, 0x20, 0x60, 0x00, 0x7c, 0x68, 0x54, 0xa0, 0x8a, 0x19, 0x9a, + 0x00, 0x48, 0x5b, 0x2e, 0x20, 0x01, 0x19, 0x99, 0xa0, 0x05, 0x00, 0xc0, + 0x5b, 0x3d, 0x0c, 0x7e, 0x20, 0x61, 0xaa, 0x33, 0x60, 0x14, 0x0c, 0x7f, + 0xa0, 0x05, 0x00, 0xc0, 0x5b, 0x42, 0x20, 0x01, 0x00, 0x1e, 0x00, 0x78, + 0x5b, 0x42, 0xa0, 0x8e, 0xff, 0xff, 0x00, 0xc0, 0x5b, 0x42, 0xa0, 0x06, + 0x80, 0x03, 0x80, 0x0b, 0x81, 0x0b, 0xa1, 0x08, 0x61, 0x16, 0x68, 0x4c, + 0xa0, 0x8c, 0x00, 0xc0, 0xa1, 0x8e, 0x00, 0xc0, 0x00, 0x40, 0x5b, 0x9e, + 0xd0, 0xb4, 0x00, 0xc0, 0x5b, 0x59, 0xd0, 0xbc, 0x00, 0xc0, 0x5b, 0x8b, + 0x20, 0x09, 0x00, 0x06, 0x10, 0x78, 0x5b, 0xc3, 0x00, 0x7c, 0xd0, 0xfc, + 0x00, 0x40, 0x5b, 0x64, 0xa0, 0x84, 0x00, 0x03, 0x00, 0x40, 0x5b, 0x64, + 0xa0, 0x86, 0x00, 0x03, 0x00, 0xc0, 0x5b, 0xbc, 0x60, 0x24, 0xd0, 0xd4, + 0x00, 0x40, 0x5b, 0x6e, 0xc0, 0xd4, 0x60, 0x26, 0x68, 0x60, 0x60, 0x2a, + 0x68, 0x5c, 0x60, 0x2e, 0x20, 0x09, 0xa7, 0x74, 0x21, 0x04, 0xd0, 0x84, + 0x00, 0x40, 0x5b, 0x83, 0x61, 0x18, 0xa1, 0x88, 0x00, 0x27, 0x21, 0x04, + 0xd0, 0x8c, 0x00, 0xc0, 0x5b, 0x83, 0x87, 0xff, 0x00, 0xc0, 0x5b, 0x82, + 0x20, 0x09, 0x00, 0x42, 0x10, 0x78, 0x77, 0x5c, 0x00, 0x7c, 0x87, 0xff, + 0x00, 0xc0, 0x5b, 0x8a, 0x20, 0x09, 0x00, 0x43, 0x10, 0x78, 0x77, 0x5c, + 0x00, 0x7c, 0xd0, 0xfc, 0x00, 0x40, 0x5b, 0x96, 0xa0, 0x84, 0x00, 0x03, + 0x00, 0x40, 0x5b, 0x96, 0xa0, 0x86, 0x00, 0x03, 0x00, 0xc0, 0x5b, 0xbc, + 0x87, 0xff, 0x00, 0xc0, 0x5b, 0x9d, 0x20, 0x09, 0x00, 0x42, 0x10, 0x78, + 0x77, 0x5c, 0x00, 0x7c, 0xd0, 0xfc, 0x00, 0x40, 0x5b, 0xaf, 0xa0, 0x84, + 0x00, 0x03, 0xa0, 0x8e, 0x00, 0x02, 0x00, 0x40, 0x5b, 0xb3, 0x87, 0xff, + 0x00, 0xc0, 0x5b, 0xae, 0x20, 0x09, 0x00, 0x41, 0x10, 0x78, 0x77, 0x5c, + 0x00, 0x7c, 0x10, 0x78, 0x5b, 0xc1, 0x00, 0x78, 0x5b, 0xae, 0x87, 0xff, + 0x00, 0xc0, 0x5b, 0xae, 0x20, 0x09, 0x00, 0x43, 0x10, 0x78, 0x77, 0x5c, + 0x00, 0x78, 0x5b, 0xae, 0x20, 0x09, 0x00, 0x04, 0x10, 0x78, 0x5b, 0xc3, + 0x00, 0x7c, 0x20, 0x09, 0x00, 0x01, 0x0d, 0x7e, 0x60, 0x10, 0xa0, 0xec, + 0xf0, 0x00, 0x00, 0x40, 0x5b, 0xef, 0x20, 0x68, 0x69, 0x52, 0x68, 0x00, + 0x60, 0x12, 0xa1, 0x86, 0x00, 0x01, 0x00, 0xc0, 0x5b, 0xe5, 0x69, 0x4c, + 0xa1, 0x8c, 0x81, 0x00, 0xa1, 0x8e, 0x81, 0x00, 0x00, 0xc0, 0x5b, 0xe5, + 0x0c, 0x7e, 0x20, 0x61, 0xaa, 0x33, 0x62, 0x00, 0xd2, 0x8c, 0x00, 0xc0, + 0x5b, 0xe4, 0x62, 0x04, 0x82, 0x10, 0x00, 0x48, 0x5b, 0xe4, 0x62, 0x06, + 0x0c, 0x7f, 0x10, 0x78, 0x4a, 0x73, 0x60, 0x10, 0xa0, 0x6d, 0x07, 0x7e, + 0x20, 0x39, 0x00, 0x00, 0x10, 0xc0, 0x5b, 0x27, 0x07, 0x7f, 0x0d, 0x7f, + 0x00, 0x7c, 0x15, 0x7e, 0x0c, 0x7e, 0x20, 0x61, 0xaa, 0x33, 0x60, 0x00, + 0x81, 0xff, 0x00, 0x40, 0x5b, 0xfc, 0xa2, 0x05, 0x00, 0x78, 0x5b, 0xfd, + 0xa2, 0x04, 0x60, 0x02, 0x0c, 0x7f, 0x15, 0x7f, 0x00, 0x7c, 0x68, 0x00, + 0xd0, 0x8c, 0x00, 0xc0, 0x5c, 0x0d, 0x68, 0x08, 0xa0, 0x05, 0x00, 0x40, + 0x5c, 0x0d, 0x80, 0x01, 0x68, 0x0a, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x7c, + 0x20, 0xa9, 0x00, 0x10, 0xa0, 0x06, 0x80, 0x04, 0x80, 0x86, 0x81, 0x8e, + 0x00, 0xc8, 0x5c, 0x17, 0xa2, 0x00, 0x00, 0xf0, 0x5c, 0x12, 0x80, 0x86, + 0x81, 0x8e, 0x00, 0x7c, 0x15, 0x7e, 0x20, 0xa9, 0x00, 0x10, 0xa0, 0x05, + 0x00, 0x40, 0x5c, 0x3d, 0xa1, 0x1a, 0x00, 0xc8, 0x5c, 0x3d, 0x82, 0x13, + 0x81, 0x8d, 0x00, 0x48, 0x5c, 0x30, 0xa1, 0x1a, 0x00, 0xc8, 0x5c, 0x31, + 0x00, 0xf0, 0x5c, 0x25, 0x00, 0x78, 0x5c, 0x35, 0xa1, 0x1a, 0x23, 0x08, + 0x82, 0x10, 0x00, 0xf0, 0x5c, 0x25, 0x00, 0x7e, 0x32, 0x00, 0xa0, 0x84, + 0xf7, 0xff, 0x20, 0x80, 0x00, 0x7f, 0x15, 0x7f, 0x00, 0x7c, 0x00, 0x7e, + 0x32, 0x00, 0xa0, 0x85, 0x08, 0x00, 0x00, 0x78, 0x5c, 0x39, 0x12, 0x7e, + 0x20, 0x91, 0x22, 0x00, 0x20, 0x79, 0xa9, 0xb1, 0x12, 0x7f, 0x0d, 0x7e, + 0x20, 0x69, 0xa9, 0xb1, 0x68, 0x03, 0x00, 0x05, 0x20, 0x69, 0x00, 0x04, + 0x2d, 0x04, 0xa0, 0x85, 0x80, 0x01, 0x20, 0x6a, 0x0d, 0x7f, 0x00, 0x7c, + 0x0c, 0x7e, 0x60, 0x27, 0x00, 0x01, 0x78, 0x04, 0xa0, 0x84, 0x00, 0x07, + 0x00, 0x79, 0x5c, 0x5e, 0x5c, 0x68, 0x5c, 0x8d, 0x5c, 0xe8, 0x5c, 0x6e, + 0x5c, 0x8d, 0x5c, 0x68, 0x5c, 0x66, 0x5c, 0x66, 0x10, 0x78, 0x13, 0x32, + 0x10, 0x78, 0x5a, 0xcb, 0x10, 0x78, 0x62, 0xd1, 0x0c, 0x7f, 0x00, 0x7c, + 0x62, 0xc0, 0x82, 0xff, 0x00, 0xc0, 0x5c, 0x74, 0x0c, 0x7f, 0x00, 0x7c, + 0x20, 0x11, 0x41, 0xdc, 0x10, 0x78, 0x5a, 0x45, 0x78, 0x28, 0xa0, 0x92, + 0x00, 0xc8, 0x00, 0xc8, 0x5c, 0x83, 0x80, 0x00, 0x78, 0x2a, 0x10, 0x78, + 0x42, 0x1b, 0x00, 0x78, 0x5c, 0x72, 0x10, 0x78, 0x41, 0xdc, 0x78, 0x07, + 0x00, 0x03, 0x78, 0x27, 0x00, 0x00, 0x78, 0x2b, 0x00, 0x00, 0x00, 0x78, + 0x5c, 0x72, 0x10, 0x78, 0x5a, 0xcb, 0x3c, 0x00, 0x00, 0x7e, 0x20, 0x11, + 0x02, 0x09, 0x20, 0xe1, 0x40, 0x00, 0x22, 0x14, 0x00, 0x7f, 0x20, 0xe0, + 0x82, 0xff, 0x00, 0x40, 0x5c, 0xab, 0x62, 0xc0, 0x82, 0xff, 0x00, 0xc0, + 0x5c, 0xab, 0x78, 0x2b, 0x00, 0x00, 0x78, 0x24, 0xa0, 0x65, 0x10, 0x40, + 0x13, 0x32, 0x20, 0x09, 0x00, 0x13, 0x10, 0x78, 0x77, 0x5c, 0x0c, 0x7f, + 0x00, 0x7c, 0x39, 0x00, 0xa0, 0x82, 0xaa, 0xe3, 0x00, 0xc8, 0x5c, 0xb2, + 0x10, 0x78, 0x74, 0x7a, 0x0c, 0x7e, 0x78, 0x24, 0xa0, 0x65, 0x10, 0x40, + 0x13, 0x32, 0x78, 0x04, 0xa0, 0x86, 0x00, 0x04, 0x00, 0x40, 0x5d, 0x2d, + 0x78, 0x28, 0xa0, 0x92, 0x27, 0x10, 0x00, 0xc8, 0x5c, 0xc8, 0x80, 0x00, + 0x78, 0x2a, 0x0c, 0x7f, 0x10, 0x78, 0x6e, 0x01, 0x00, 0x78, 0x5c, 0xa9, + 0x61, 0x04, 0xa1, 0x86, 0x00, 0x03, 0x00, 0xc0, 0x5c, 0xdf, 0x0e, 0x7e, + 0x20, 0x71, 0xa7, 0x00, 0x70, 0xd8, 0x0e, 0x7f, 0xd0, 0x8c, 0x00, 0x40, + 0x5c, 0xdf, 0x0c, 0x7e, 0x0e, 0x7e, 0x20, 0x61, 0x01, 0x00, 0x20, 0x71, + 0xa7, 0x00, 0x10, 0x78, 0x42, 0x24, 0x0e, 0x7f, 0x0c, 0x7f, 0x10, 0x78, + 0xa5, 0xd4, 0x20, 0x09, 0x00, 0x14, 0x10, 0x78, 0x77, 0x5c, 0x0c, 0x7f, + 0x00, 0x78, 0x5c, 0xa9, 0x20, 0x01, 0xa9, 0xcd, 0x20, 0x03, 0x00, 0x00, + 0x62, 0xc0, 0x82, 0xff, 0x00, 0xc0, 0x5c, 0xfc, 0x78, 0x2b, 0x00, 0x00, + 0x78, 0x24, 0xa0, 0x65, 0x10, 0x40, 0x13, 0x32, 0x20, 0x09, 0x00, 0x13, + 0x10, 0x78, 0x77, 0xb3, 0x0c, 0x7f, 0x00, 0x7c, 0x0c, 0x7e, 0x0d, 0x7e, + 0x39, 0x00, 0xa0, 0x82, 0xaa, 0xe3, 0x00, 0xc8, 0x5d, 0x05, 0x10, 0x78, + 0x74, 0x7a, 0x78, 0x24, 0xa0, 0x05, 0x10, 0x40, 0x13, 0x32, 0x78, 0x1c, + 0xa0, 0x6d, 0x10, 0x40, 0x13, 0x32, 0x68, 0x00, 0xc0, 0xdc, 0x68, 0x02, + 0x79, 0x24, 0x21, 0x60, 0x10, 0x78, 0x77, 0x2d, 0x69, 0x3c, 0x81, 0xff, + 0x10, 0x40, 0x13, 0x32, 0x81, 0x09, 0x69, 0x3e, 0x68, 0x54, 0xa0, 0x15, + 0x00, 0x40, 0x5d, 0x21, 0x7a, 0x1e, 0x00, 0x78, 0x5d, 0x23, 0x79, 0x18, + 0x79, 0x1e, 0x78, 0x07, 0x00, 0x00, 0x78, 0x27, 0x00, 0x00, 0x0d, 0x7f, + 0x0c, 0x7f, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x78, 0x5c, 0xfa, 0x61, 0x04, + 0xa1, 0x86, 0x00, 0x02, 0x00, 0x40, 0x5d, 0x38, 0xa1, 0x86, 0x00, 0x04, + 0x00, 0x40, 0x5d, 0x38, 0x00, 0x78, 0x5c, 0xbc, 0x78, 0x08, 0xac, 0x06, + 0x00, 0x40, 0x5c, 0xbc, 0x10, 0x78, 0x61, 0xcd, 0x10, 0x78, 0x5d, 0xd7, + 0x0c, 0x7f, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x78, 0x5c, 0xa9, 0x0c, 0x7e, + 0x60, 0x27, 0x00, 0x02, 0x62, 0xc8, 0x82, 0xff, 0x00, 0xc0, 0x5d, 0x61, + 0x62, 0xc4, 0x82, 0xff, 0x00, 0xc0, 0x5d, 0x61, 0x79, 0x3c, 0xa1, 0xe5, + 0x00, 0x00, 0x00, 0x40, 0x5d, 0x5b, 0x20, 0x09, 0x00, 0x49, 0x10, 0x78, + 0x77, 0x5c, 0x0c, 0x7f, 0x00, 0x7c, 0x20, 0x11, 0xa9, 0xd0, 0x20, 0x13, + 0x00, 0x00, 0x00, 0x78, 0x5d, 0x59, 0x39, 0x08, 0xa1, 0x92, 0xaa, 0xe3, + 0x00, 0xc8, 0x5d, 0x68, 0x10, 0x78, 0x74, 0x7a, 0x60, 0x17, 0x00, 0x10, + 0x79, 0x3c, 0x81, 0xff, 0x00, 0x40, 0x5d, 0x5b, 0x79, 0x44, 0xa1, 0x92, + 0x75, 0x30, 0x00, 0xc8, 0x5d, 0x85, 0x81, 0x08, 0x79, 0x46, 0x79, 0x3c, + 0xa1, 0x88, 0x00, 0x07, 0x21, 0x0c, 0xa1, 0x8e, 0x00, 0x06, 0x00, 0xc0, + 0x5d, 0x81, 0x60, 0x17, 0x00, 0x12, 0x00, 0x78, 0x5d, 0x59, 0x60, 0x17, + 0x00, 0x16, 0x00, 0x78, 0x5d, 0x59, 0x78, 0x48, 0xc0, 0x85, 0x78, 0x4a, + 0x00, 0x78, 0x5d, 0x59, 0x00, 0x7e, 0x01, 0x7e, 0x0c, 0x7e, 0x12, 0x7e, + 0x20, 0x91, 0x80, 0x00, 0x60, 0x0f, 0x00, 0x00, 0x2c, 0x08, 0x20, 0x61, + 0xa9, 0xb1, 0x60, 0x20, 0x80, 0x00, 0x60, 0x22, 0x60, 0x10, 0xa0, 0x05, + 0x00, 0x40, 0x5d, 0xa5, 0xa0, 0x80, 0x00, 0x03, 0x21, 0x02, 0x61, 0x12, + 0x12, 0x7f, 0x0c, 0x7f, 0x01, 0x7f, 0x00, 0x7f, 0x00, 0x7c, 0x61, 0x16, + 0x61, 0x12, 0x00, 0x78, 0x5d, 0xa0, 0x0d, 0x7e, 0x20, 0x69, 0xa9, 0xb1, + 0x60, 0x00, 0xd0, 0xd4, 0x00, 0x40, 0x5d, 0xbe, 0x68, 0x20, 0x80, 0x00, + 0x68, 0x22, 0xa0, 0x86, 0x00, 0x01, 0x00, 0xc0, 0x5d, 0xb9, 0x2c, 0x00, + 0x68, 0x1e, 0x68, 0x04, 0xa0, 0x84, 0x00, 0x07, 0x00, 0x79, 0x62, 0xd9, + 0xc0, 0xd5, 0x60, 0x02, 0x68, 0x18, 0xa0, 0x05, 0x00, 0x40, 0x5d, 0xd0, + 0x60, 0x56, 0x60, 0x5b, 0x00, 0x00, 0x00, 0x7e, 0x2c, 0x00, 0x68, 0x1a, + 0x0d, 0x7f, 0x68, 0x5a, 0x20, 0x69, 0xa9, 0xb1, 0x00, 0x78, 0x5d, 0xb0, + 0x60, 0x56, 0x60, 0x5a, 0x2c, 0x00, 0x68, 0x1a, 0x68, 0x1e, 0x00, 0x78, + 0x5d, 0xb0, 0x00, 0x7e, 0x01, 0x7e, 0x0c, 0x7e, 0x12, 0x7e, 0x20, 0x91, + 0x80, 0x00, 0x60, 0x0f, 0x00, 0x00, 0x2c, 0x08, 0x20, 0x61, 0xa9, 0xb1, + 0x60, 0x20, 0x80, 0x00, 0x60, 0x22, 0x60, 0x08, 0xa0, 0x05, 0x00, 0x40, + 0x5d, 0xf2, 0xa0, 0x80, 0x00, 0x03, 0x21, 0x02, 0x61, 0x0a, 0x12, 0x7f, + 0x0c, 0x7f, 0x01, 0x7f, 0x00, 0x7f, 0x00, 0x7c, 0x61, 0x0e, 0x61, 0x0a, + 0x00, 0x78, 0x5d, 0xed, 0x0c, 0x7e, 0x60, 0x0f, 0x00, 0x00, 0x2c, 0x08, + 0x20, 0x61, 0xa9, 0xb1, 0x60, 0x34, 0xa0, 0x05, 0x00, 0x40, 0x5e, 0x06, + 0xa0, 0x80, 0x00, 0x03, 0x21, 0x02, 0x61, 0x36, 0x0c, 0x7f, 0x00, 0x7c, + 0x61, 0x3a, 0x61, 0x36, 0x00, 0x78, 0x5e, 0x04, 0x0f, 0x7e, 0x0e, 0x7e, + 0x0d, 0x7e, 0x0c, 0x7e, 0x06, 0x7e, 0x05, 0x7e, 0x03, 0x7e, 0x02, 0x7e, + 0x01, 0x7e, 0x00, 0x7e, 0x12, 0x7e, 0xa0, 0x2e, 0x20, 0x71, 0xa9, 0xb1, + 0x76, 0x38, 0x26, 0x60, 0x26, 0x78, 0x20, 0x91, 0x80, 0x00, 0x8c, 0xff, + 0x00, 0x40, 0x5e, 0x8c, 0x60, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, + 0xa2, 0x06, 0x00, 0xc0, 0x5e, 0x87, 0x87, 0xff, 0x00, 0x40, 0x5e, 0x2e, + 0x60, 0x20, 0xa1, 0x06, 0x00, 0xc0, 0x5e, 0x87, 0x70, 0x3c, 0xac, 0x06, + 0x00, 0xc0, 0x5e, 0x44, 0x03, 0x7e, 0x20, 0x19, 0x00, 0x01, 0x10, 0x78, + 0x70, 0x58, 0x70, 0x33, 0x00, 0x00, 0x70, 0x3f, 0x00, 0x00, 0x70, 0x43, + 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0x4b, 0x00, 0x00, 0x03, 0x7f, + 0x20, 0x29, 0x00, 0x01, 0x70, 0x38, 0xac, 0x36, 0x00, 0xc0, 0x5e, 0x4a, + 0x66, 0x0c, 0x76, 0x3a, 0x70, 0x34, 0xac, 0x36, 0x00, 0xc0, 0x5e, 0x58, + 0x2c, 0x00, 0xaf, 0x36, 0x00, 0x40, 0x5e, 0x56, 0x2f, 0x00, 0x70, 0x36, + 0x00, 0x78, 0x5e, 0x58, 0x70, 0x37, 0x00, 0x00, 0x66, 0x0c, 0x06, 0x7e, + 0x2c, 0x00, 0xaf, 0x06, 0x00, 0x40, 0x5e, 0x61, 0x7e, 0x0e, 0x00, 0x78, + 0x5e, 0x62, 0x26, 0x78, 0x60, 0x0f, 0x00, 0x00, 0x10, 0x78, 0x8d, 0x16, + 0x00, 0x40, 0x5e, 0x82, 0x60, 0x10, 0x20, 0x68, 0x60, 0x1c, 0xa0, 0x86, + 0x00, 0x03, 0x00, 0xc0, 0x5e, 0x9d, 0x68, 0x37, 0x01, 0x03, 0x6b, 0x4a, + 0x68, 0x47, 0x00, 0x00, 0x01, 0x7e, 0x03, 0x7e, 0x07, 0x7e, 0x10, 0x78, + 0x8f, 0x8d, 0x10, 0x78, 0xa4, 0xf2, 0x10, 0x78, 0x4a, 0x73, 0x07, 0x7f, + 0x03, 0x7f, 0x01, 0x7f, 0x10, 0x78, 0x8e, 0xc9, 0x10, 0x78, 0x8e, 0xd6, + 0x0c, 0x7f, 0x00, 0x78, 0x5e, 0x1d, 0x2c, 0x78, 0x60, 0x0c, 0x20, 0x60, + 0x00, 0x78, 0x5e, 0x1d, 0x85, 0xff, 0x00, 0x40, 0x5e, 0x91, 0x10, 0x78, + 0x63, 0x9b, 0x12, 0x7f, 0x00, 0x7f, 0x01, 0x7f, 0x02, 0x7f, 0x03, 0x7f, + 0x05, 0x7f, 0x06, 0x7f, 0x0c, 0x7f, 0x0d, 0x7f, 0x0e, 0x7f, 0x0f, 0x7f, + 0x00, 0x7c, 0x60, 0x1c, 0xa0, 0x86, 0x00, 0x06, 0x00, 0xc0, 0x5e, 0x6f, + 0x01, 0x7e, 0x03, 0x7e, 0x07, 0x7e, 0x10, 0x78, 0xa4, 0xf2, 0x10, 0x78, + 0xa1, 0xda, 0x07, 0x7f, 0x03, 0x7f, 0x01, 0x7f, 0x00, 0x78, 0x5e, 0x82, + 0x00, 0x7e, 0x06, 0x7e, 0x0c, 0x7e, 0x0d, 0x7e, 0x0f, 0x7e, 0x20, 0x31, + 0x00, 0x00, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x20, 0x79, 0xa9, 0xb1, + 0x78, 0x38, 0xa0, 0x65, 0x00, 0x40, 0x5e, 0xef, 0x60, 0x0c, 0x00, 0x7e, + 0x60, 0x0f, 0x00, 0x00, 0x78, 0x3c, 0xac, 0x06, 0x00, 0xc0, 0x5e, 0xd6, + 0x03, 0x7e, 0x20, 0x19, 0x00, 0x01, 0x10, 0x78, 0x70, 0x58, 0x78, 0x33, + 0x00, 0x00, 0x78, 0x3f, 0x00, 0x00, 0x78, 0x43, 0x00, 0x00, 0x78, 0x47, + 0x00, 0x00, 0x78, 0x4b, 0x00, 0x00, 0x03, 0x7f, 0x10, 0x78, 0x8d, 0x16, + 0x00, 0x40, 0x5e, 0xea, 0x60, 0x10, 0x20, 0x68, 0x60, 0x1c, 0xa0, 0x86, + 0x00, 0x03, 0x00, 0xc0, 0x5e, 0xf8, 0x68, 0x37, 0x01, 0x03, 0x6b, 0x4a, + 0x68, 0x47, 0x00, 0x00, 0x10, 0x78, 0x4a, 0x73, 0x10, 0x78, 0x8e, 0xc9, + 0x10, 0x78, 0x8e, 0xd6, 0x00, 0x7f, 0x00, 0x78, 0x5e, 0xbb, 0x7e, 0x3a, + 0x7e, 0x36, 0x12, 0x7f, 0x0f, 0x7f, 0x0d, 0x7f, 0x0c, 0x7f, 0x06, 0x7f, + 0x00, 0x7f, 0x00, 0x7c, 0x60, 0x1c, 0xa0, 0x86, 0x00, 0x06, 0x00, 0xc0, + 0x5e, 0xe1, 0x10, 0x78, 0xa1, 0xda, 0x00, 0x78, 0x5e, 0xea, 0x01, 0x7e, + 0x02, 0x7e, 0x08, 0x7e, 0x20, 0x41, 0x00, 0x00, 0x10, 0x78, 0x5f, 0x1b, + 0x10, 0x78, 0x5f, 0xdb, 0x08, 0x7f, 0x02, 0x7f, 0x01, 0x7f, 0x00, 0x7c, + 0x0f, 0x7e, 0x12, 0x7e, 0x20, 0x79, 0xa9, 0xb1, 0x20, 0x91, 0x80, 0x00, + 0x10, 0x78, 0x60, 0x76, 0x10, 0x78, 0x60, 0xec, 0x12, 0x7f, 0x0f, 0x7f, + 0x00, 0x7c, 0x0f, 0x7e, 0x0e, 0x7e, 0x0d, 0x7e, 0x0c, 0x7e, 0x06, 0x7e, + 0x01, 0x7e, 0x00, 0x7e, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, + 0xa9, 0xb1, 0x76, 0x14, 0x26, 0x60, 0x26, 0x78, 0x8c, 0xff, 0x00, 0x40, + 0x5f, 0xb5, 0x60, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, 0xa2, 0x06, + 0x00, 0xc0, 0x5f, 0xb0, 0x88, 0xff, 0x00, 0x40, 0x5f, 0x3b, 0x60, 0x20, + 0xa1, 0x06, 0x00, 0xc0, 0x5f, 0xb0, 0x70, 0x24, 0xac, 0x06, 0x00, 0xc0, + 0x5f, 0x6b, 0x20, 0x69, 0x01, 0x00, 0x68, 0xc0, 0xa0, 0x05, 0x00, 0x40, + 0x5f, 0x66, 0x10, 0x78, 0x5a, 0xcb, 0x10, 0x78, 0x6e, 0x0f, 0x68, 0xc3, + 0x00, 0x00, 0x10, 0x78, 0x73, 0x78, 0x70, 0x27, 0x00, 0x00, 0x03, 0x7e, + 0x20, 0x69, 0x01, 0x40, 0x6b, 0x04, 0xa3, 0x84, 0x10, 0x00, 0x00, 0x40, + 0x5f, 0x5b, 0x68, 0x03, 0x01, 0x00, 0x68, 0x03, 0x00, 0x00, 0x20, 0x69, + 0x01, 0x00, 0x68, 0x24, 0xd0, 0x84, 0x00, 0x40, 0x5f, 0x63, 0x68, 0x27, + 0x00, 0x01, 0x03, 0x7f, 0x00, 0x78, 0x5f, 0x6b, 0x60, 0x03, 0x00, 0x09, + 0x63, 0x0a, 0x00, 0x78, 0x5f, 0xb0, 0x70, 0x14, 0xac, 0x36, 0x00, 0xc0, + 0x5f, 0x71, 0x66, 0x0c, 0x76, 0x16, 0x70, 0x10, 0xac, 0x36, 0x00, 0xc0, + 0x5f, 0x7f, 0x2c, 0x00, 0xaf, 0x36, 0x00, 0x40, 0x5f, 0x7d, 0x2f, 0x00, + 0x70, 0x12, 0x00, 0x78, 0x5f, 0x7f, 0x70, 0x13, 0x00, 0x00, 0x66, 0x0c, + 0x06, 0x7e, 0x2c, 0x00, 0xaf, 0x06, 0x00, 0x40, 0x5f, 0x88, 0x7e, 0x0e, + 0x00, 0x78, 0x5f, 0x89, 0x26, 0x78, 0x60, 0x0f, 0x00, 0x00, 0x60, 0x10, + 0x20, 0x68, 0x10, 0x78, 0x8d, 0x16, 0x00, 0x40, 0x5f, 0xa9, 0x60, 0x1c, + 0xa0, 0x86, 0x00, 0x03, 0x00, 0xc0, 0x5f, 0xbe, 0x68, 0x37, 0x01, 0x03, + 0x6b, 0x4a, 0x68, 0x47, 0x00, 0x00, 0x01, 0x7e, 0x03, 0x7e, 0x08, 0x7e, + 0x10, 0x78, 0x8f, 0x8d, 0x10, 0x78, 0xa4, 0xf2, 0x10, 0x78, 0x4a, 0x73, + 0x08, 0x7f, 0x03, 0x7f, 0x01, 0x7f, 0x10, 0x78, 0x8e, 0xc9, 0x10, 0x78, + 0x8e, 0xd6, 0x10, 0x78, 0x72, 0x33, 0x0c, 0x7f, 0x00, 0x78, 0x5f, 0x2a, + 0x2c, 0x78, 0x60, 0x0c, 0x20, 0x60, 0x00, 0x78, 0x5f, 0x2a, 0x12, 0x7f, + 0x00, 0x7f, 0x01, 0x7f, 0x06, 0x7f, 0x0c, 0x7f, 0x0d, 0x7f, 0x0e, 0x7f, + 0x0f, 0x7f, 0x00, 0x7c, 0x60, 0x1c, 0xa0, 0x86, 0x00, 0x06, 0x00, 0xc0, + 0x5f, 0xcf, 0x01, 0x7e, 0x03, 0x7e, 0x08, 0x7e, 0x10, 0x78, 0xa4, 0xf2, + 0x10, 0x78, 0xa1, 0xda, 0x08, 0x7f, 0x03, 0x7f, 0x01, 0x7f, 0x00, 0x78, + 0x5f, 0xa9, 0x60, 0x1c, 0xa0, 0x86, 0x00, 0x02, 0x00, 0xc0, 0x5f, 0xa9, + 0x60, 0x04, 0xa0, 0x86, 0x00, 0x85, 0x00, 0x40, 0x5f, 0x96, 0x00, 0x78, + 0x5f, 0xa9, 0x0c, 0x7e, 0x00, 0x7e, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, + 0xa2, 0x80, 0xa8, 0x35, 0x20, 0x04, 0xa0, 0x65, 0x00, 0x40, 0x60, 0x72, + 0x0f, 0x7e, 0x0e, 0x7e, 0x0d, 0x7e, 0x06, 0x7e, 0x20, 0x71, 0xa9, 0xb1, + 0x66, 0x54, 0x70, 0x18, 0xac, 0x06, 0x00, 0xc0, 0x5f, 0xf2, 0x76, 0x1a, + 0x70, 0x1c, 0xac, 0x06, 0x00, 0xc0, 0x5f, 0xfe, 0x86, 0xff, 0x00, 0xc0, + 0x5f, 0xfd, 0x70, 0x18, 0x70, 0x1e, 0x00, 0x78, 0x5f, 0xfe, 0x76, 0x1e, + 0x60, 0x58, 0xa0, 0x7d, 0x00, 0x40, 0x60, 0x03, 0x7e, 0x56, 0xa6, 0xed, + 0x00, 0x00, 0x00, 0x40, 0x60, 0x09, 0x2f, 0x00, 0x68, 0x5a, 0x60, 0x57, + 0x00, 0x00, 0x60, 0x5b, 0x00, 0x00, 0x60, 0x00, 0xc0, 0xd4, 0xc0, 0xdc, + 0x60, 0x02, 0x10, 0x78, 0x44, 0xd3, 0x00, 0x40, 0x60, 0x6e, 0x76, 0x24, + 0x86, 0xff, 0x00, 0x40, 0x60, 0x5c, 0xa6, 0x80, 0x00, 0x04, 0x20, 0x04, + 0xad, 0x06, 0x00, 0xc0, 0x60, 0x5c, 0x0d, 0x7e, 0x20, 0x69, 0x01, 0x00, + 0x68, 0xc0, 0xa0, 0x05, 0x00, 0x40, 0x60, 0x53, 0x10, 0x78, 0x5a, 0xcb, + 0x10, 0x78, 0x6e, 0x0f, 0x68, 0xc3, 0x00, 0x00, 0x10, 0x78, 0x73, 0x78, + 0x70, 0x27, 0x00, 0x00, 0x03, 0x7e, 0x20, 0x69, 0x01, 0x40, 0x6b, 0x04, + 0xa3, 0x84, 0x10, 0x00, 0x00, 0x40, 0x60, 0x3c, 0x68, 0x03, 0x01, 0x00, + 0x68, 0x03, 0x00, 0x00, 0x20, 0x69, 0x01, 0x00, 0x68, 0x24, 0xd0, 0x84, + 0x00, 0x40, 0x60, 0x44, 0x68, 0x27, 0x00, 0x01, 0x03, 0x7f, 0x0d, 0x7f, + 0x0c, 0x7e, 0x60, 0x3c, 0xa0, 0x05, 0x00, 0x40, 0x60, 0x4d, 0x80, 0x01, + 0x60, 0x3e, 0x26, 0x60, 0x10, 0x78, 0x8e, 0xd6, 0x0c, 0x7f, 0x00, 0x78, + 0x60, 0x5c, 0x0d, 0x7f, 0x0c, 0x7e, 0x26, 0x60, 0x60, 0x03, 0x00, 0x09, + 0x63, 0x0a, 0x0c, 0x7f, 0x00, 0x78, 0x60, 0x11, 0x8d, 0xff, 0x00, 0x40, + 0x60, 0x6a, 0x68, 0x37, 0x01, 0x03, 0x6b, 0x4a, 0x68, 0x47, 0x00, 0x00, + 0x10, 0x78, 0x8f, 0x8d, 0x10, 0x78, 0xa4, 0xf2, 0x10, 0x78, 0x4a, 0x73, + 0x10, 0x78, 0x72, 0x33, 0x00, 0x78, 0x60, 0x11, 0x06, 0x7f, 0x0d, 0x7f, + 0x0e, 0x7f, 0x0f, 0x7f, 0x12, 0x7f, 0x00, 0x7f, 0x0c, 0x7f, 0x00, 0x7c, + 0x00, 0x7e, 0x06, 0x7e, 0x0c, 0x7e, 0x0d, 0x7e, 0x20, 0x31, 0x00, 0x00, + 0x78, 0x14, 0xa0, 0x65, 0x00, 0x40, 0x60, 0xd0, 0x60, 0x0c, 0x00, 0x7e, + 0x60, 0x0f, 0x00, 0x00, 0x78, 0x24, 0xac, 0x06, 0x00, 0xc0, 0x60, 0xb5, + 0x20, 0x69, 0x01, 0x00, 0x68, 0xc0, 0xa0, 0x05, 0x00, 0x40, 0x60, 0xaf, + 0x10, 0x78, 0x5a, 0xcb, 0x10, 0x78, 0x6e, 0x0f, 0x68, 0xc3, 0x00, 0x00, + 0x10, 0x78, 0x73, 0x78, 0x78, 0x27, 0x00, 0x00, 0x03, 0x7e, 0x20, 0x69, + 0x01, 0x40, 0x6b, 0x04, 0xa3, 0x84, 0x10, 0x00, 0x00, 0x40, 0x60, 0xa4, + 0x68, 0x03, 0x01, 0x00, 0x68, 0x03, 0x00, 0x00, 0x20, 0x69, 0x01, 0x00, + 0x68, 0x24, 0xd0, 0x84, 0x00, 0x40, 0x60, 0xac, 0x68, 0x27, 0x00, 0x01, + 0x03, 0x7f, 0x00, 0x78, 0x60, 0xb5, 0x60, 0x03, 0x00, 0x09, 0x63, 0x0a, + 0x2c, 0x30, 0x00, 0x78, 0x60, 0xcd, 0x60, 0x10, 0x20, 0x68, 0x10, 0x78, + 0x8d, 0x16, 0x00, 0x40, 0x60, 0xc9, 0x60, 0x1c, 0xa0, 0x86, 0x00, 0x03, + 0x00, 0xc0, 0x60, 0xd7, 0x68, 0x37, 0x01, 0x03, 0x6b, 0x4a, 0x68, 0x47, + 0x00, 0x00, 0x10, 0x78, 0x4a, 0x73, 0x10, 0x78, 0x8e, 0xc9, 0x10, 0x78, + 0x8e, 0xd6, 0x10, 0x78, 0x72, 0x33, 0x00, 0x7f, 0x00, 0x78, 0x60, 0x7d, + 0x7e, 0x16, 0x7e, 0x12, 0x0d, 0x7f, 0x0c, 0x7f, 0x06, 0x7f, 0x00, 0x7f, + 0x00, 0x7c, 0x60, 0x1c, 0xa0, 0x86, 0x00, 0x06, 0x00, 0xc0, 0x60, 0xe0, + 0x10, 0x78, 0xa1, 0xda, 0x00, 0x78, 0x60, 0xc9, 0x60, 0x1c, 0xa0, 0x86, + 0x00, 0x02, 0x00, 0xc0, 0x60, 0xc9, 0x60, 0x04, 0xa0, 0x86, 0x00, 0x85, + 0x00, 0x40, 0x60, 0xc0, 0x00, 0x78, 0x60, 0xc9, 0x00, 0x7e, 0x06, 0x7e, + 0x0c, 0x7e, 0x0d, 0x7e, 0x78, 0x18, 0xa0, 0x65, 0x00, 0x40, 0x61, 0x5a, + 0x60, 0x54, 0x00, 0x7e, 0x60, 0x57, 0x00, 0x00, 0x60, 0x5b, 0x00, 0x00, + 0x60, 0x00, 0xc0, 0xd4, 0xc0, 0xdc, 0x60, 0x02, 0x10, 0x78, 0x44, 0xd3, + 0x00, 0x40, 0x61, 0x57, 0x7e, 0x24, 0x86, 0xff, 0x00, 0x40, 0x61, 0x49, + 0xa6, 0x80, 0x00, 0x04, 0x20, 0x04, 0xad, 0x06, 0x00, 0xc0, 0x61, 0x49, + 0x0d, 0x7e, 0x20, 0x69, 0x01, 0x00, 0x68, 0xc0, 0xa0, 0x05, 0x00, 0x40, + 0x61, 0x40, 0x10, 0x78, 0x5a, 0xcb, 0x10, 0x78, 0x6e, 0x0f, 0x68, 0xc3, + 0x00, 0x00, 0x10, 0x78, 0x73, 0x78, 0x78, 0x27, 0x00, 0x00, 0x03, 0x7e, + 0x20, 0x69, 0x01, 0x40, 0x6b, 0x04, 0xa3, 0x84, 0x10, 0x00, 0x00, 0x40, + 0x61, 0x29, 0x68, 0x03, 0x01, 0x00, 0x68, 0x03, 0x00, 0x00, 0x20, 0x69, + 0x01, 0x00, 0x68, 0x24, 0xd0, 0x84, 0x00, 0x40, 0x61, 0x31, 0x68, 0x27, + 0x00, 0x01, 0x03, 0x7f, 0x0d, 0x7f, 0x0c, 0x7e, 0x60, 0x3c, 0xa0, 0x05, + 0x00, 0x40, 0x61, 0x3a, 0x80, 0x01, 0x60, 0x3e, 0x26, 0x60, 0x10, 0x78, + 0x8e, 0xd6, 0x0c, 0x7f, 0x00, 0x78, 0x61, 0x49, 0x0d, 0x7f, 0x0c, 0x7e, + 0x26, 0x60, 0x60, 0x03, 0x00, 0x09, 0x63, 0x0a, 0x0c, 0x7f, 0x00, 0x78, + 0x60, 0xfe, 0x8d, 0xff, 0x00, 0x40, 0x61, 0x53, 0x68, 0x37, 0x01, 0x03, + 0x6b, 0x4a, 0x68, 0x47, 0x00, 0x00, 0x10, 0x78, 0x4a, 0x73, 0x10, 0x78, + 0x72, 0x33, 0x00, 0x78, 0x60, 0xfe, 0x00, 0x7f, 0x00, 0x78, 0x60, 0xf1, + 0x78, 0x1e, 0x78, 0x1a, 0x0d, 0x7f, 0x0c, 0x7f, 0x06, 0x7f, 0x00, 0x7f, + 0x00, 0x7c, 0x0e, 0x7e, 0x0d, 0x7e, 0x06, 0x7e, 0x60, 0x00, 0xd0, 0xdc, + 0x00, 0x40, 0x61, 0x81, 0x60, 0x4c, 0xa0, 0x6d, 0x00, 0x40, 0x61, 0x81, + 0x68, 0x48, 0xa6, 0x06, 0x00, 0xc0, 0x61, 0x81, 0x20, 0x71, 0xa9, 0xb1, + 0x70, 0x24, 0xa0, 0x35, 0x00, 0x40, 0x61, 0x81, 0xa0, 0x80, 0x00, 0x04, + 0x20, 0x04, 0xad, 0x06, 0x00, 0xc0, 0x61, 0x81, 0x60, 0x00, 0xc0, 0xdc, + 0x60, 0x02, 0x10, 0x78, 0x61, 0x85, 0x06, 0x7f, 0x0d, 0x7f, 0x0e, 0x7f, + 0x00, 0x7c, 0x0f, 0x7e, 0x20, 0x79, 0x01, 0x00, 0x78, 0xc0, 0xa0, 0x05, + 0x00, 0xc0, 0x61, 0x94, 0x0c, 0x7e, 0x26, 0x60, 0x60, 0x03, 0x00, 0x09, + 0x63, 0x0a, 0x0c, 0x7f, 0x00, 0x78, 0x61, 0xcb, 0x10, 0x78, 0x6e, 0x0f, + 0x78, 0xc3, 0x00, 0x00, 0x10, 0x78, 0x73, 0x78, 0x70, 0x27, 0x00, 0x00, + 0x03, 0x7e, 0x20, 0x79, 0x01, 0x40, 0x7b, 0x04, 0xa3, 0x84, 0x10, 0x00, + 0x00, 0x40, 0x61, 0xa8, 0x78, 0x03, 0x01, 0x00, 0x78, 0x03, 0x00, 0x00, + 0x20, 0x79, 0x01, 0x00, 0x78, 0x24, 0xd0, 0x84, 0x00, 0x40, 0x61, 0xb0, + 0x78, 0x27, 0x00, 0x01, 0x10, 0x78, 0x73, 0x78, 0x03, 0x7f, 0x10, 0x78, + 0x44, 0xd3, 0x0c, 0x7e, 0x60, 0x3c, 0xa0, 0x05, 0x00, 0x40, 0x61, 0xbc, + 0x80, 0x01, 0x60, 0x3e, 0x26, 0x60, 0x10, 0x78, 0x77, 0x2d, 0x0c, 0x7f, + 0x68, 0x37, 0x01, 0x03, 0x6b, 0x4a, 0x68, 0x47, 0x00, 0x00, 0x10, 0x78, + 0x8f, 0x8d, 0x10, 0x78, 0x4a, 0x73, 0x10, 0x78, 0x72, 0x33, 0x0f, 0x7f, + 0x00, 0x7c, 0x0e, 0x7e, 0x0c, 0x7e, 0x20, 0x71, 0xa9, 0xb1, 0x70, 0x04, + 0xa0, 0x84, 0x00, 0x07, 0x00, 0x79, 0x61, 0xd6, 0x61, 0xe0, 0x61, 0xe3, + 0x61, 0xfc, 0x62, 0x18, 0x62, 0x62, 0x61, 0xe0, 0x61, 0xe0, 0x61, 0xde, + 0x10, 0x78, 0x13, 0x32, 0x0c, 0x7f, 0x0e, 0x7f, 0x00, 0x7c, 0x70, 0x24, + 0xa0, 0x65, 0x00, 0x40, 0x61, 0xf1, 0x70, 0x20, 0x80, 0x01, 0x70, 0x22, + 0x60, 0x0c, 0xa0, 0x15, 0x00, 0x40, 0x61, 0xf8, 0x72, 0x16, 0x60, 0x0f, + 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x70, 0x27, 0x00, 0x00, 0x0c, 0x7f, + 0x0e, 0x7f, 0x00, 0x7c, 0x72, 0x16, 0x72, 0x12, 0x00, 0x78, 0x61, 0xf1, + 0x60, 0x18, 0x20, 0x60, 0x10, 0x78, 0x44, 0xd3, 0x60, 0x00, 0xc0, 0xdc, + 0x60, 0x02, 0x70, 0x20, 0x80, 0x01, 0x70, 0x22, 0x00, 0x40, 0x62, 0x0d, + 0x60, 0x54, 0xa0, 0x15, 0x00, 0x40, 0x62, 0x14, 0x72, 0x1e, 0x70, 0x07, + 0x00, 0x00, 0x70, 0x27, 0x00, 0x00, 0x0c, 0x7f, 0x0e, 0x7f, 0x00, 0x7c, + 0x72, 0x18, 0x72, 0x1e, 0x00, 0x78, 0x62, 0x0d, 0x70, 0x24, 0xa0, 0x65, + 0x00, 0x40, 0x62, 0x5f, 0x70, 0x0c, 0xac, 0x06, 0x00, 0xc0, 0x62, 0x2f, + 0x10, 0x78, 0x72, 0x33, 0x60, 0x0c, 0xa0, 0x15, 0x00, 0x40, 0x62, 0x2b, + 0x72, 0x0e, 0x60, 0x0f, 0x00, 0x00, 0x00, 0x78, 0x62, 0x5d, 0x72, 0x0e, + 0x72, 0x0a, 0x00, 0x78, 0x62, 0x5d, 0x70, 0x14, 0xac, 0x06, 0x00, 0xc0, + 0x62, 0x42, 0x10, 0x78, 0x72, 0x33, 0x60, 0x0c, 0xa0, 0x15, 0x00, 0x40, + 0x62, 0x3e, 0x72, 0x16, 0x60, 0x0f, 0x00, 0x00, 0x00, 0x78, 0x62, 0x5d, + 0x72, 0x16, 0x72, 0x12, 0x00, 0x78, 0x62, 0x5d, 0x60, 0x1c, 0xa0, 0x86, + 0x00, 0x03, 0x00, 0xc0, 0x62, 0x5d, 0x60, 0x18, 0x20, 0x60, 0x10, 0x78, + 0x44, 0xd3, 0x60, 0x00, 0xc0, 0xdc, 0x60, 0x02, 0x10, 0x78, 0x72, 0x33, + 0x70, 0x1c, 0xa0, 0x65, 0x00, 0x40, 0x62, 0x5d, 0x60, 0x54, 0xa0, 0x15, + 0x00, 0x40, 0x62, 0x5b, 0x72, 0x1e, 0x00, 0x78, 0x62, 0x5d, 0x72, 0x18, + 0x72, 0x1e, 0x70, 0x27, 0x00, 0x00, 0x0c, 0x7f, 0x0e, 0x7f, 0x00, 0x7c, + 0x70, 0x24, 0xa0, 0x65, 0x00, 0x40, 0x62, 0x6f, 0x10, 0x78, 0x72, 0x33, + 0x60, 0x0c, 0xa0, 0x15, 0x00, 0x40, 0x62, 0x76, 0x72, 0x0e, 0x60, 0x0f, + 0x00, 0x00, 0x10, 0x78, 0x73, 0x78, 0x70, 0x27, 0x00, 0x00, 0x0c, 0x7f, + 0x0e, 0x7f, 0x00, 0x7c, 0x72, 0x0e, 0x72, 0x0a, 0x00, 0x78, 0x62, 0x6f, + 0x0d, 0x7e, 0x20, 0x69, 0xa9, 0xb1, 0x68, 0x30, 0xa0, 0x84, 0x00, 0x03, + 0x00, 0x79, 0x62, 0x82, 0x62, 0x88, 0x62, 0x8a, 0x62, 0xb4, 0x62, 0x88, + 0x10, 0x78, 0x13, 0x32, 0x0d, 0x7f, 0x00, 0x7c, 0x0c, 0x7e, 0x68, 0x40, + 0xa0, 0x86, 0x00, 0x01, 0x00, 0x40, 0x62, 0xaa, 0x68, 0x3c, 0xa0, 0x65, + 0x00, 0x40, 0x62, 0x9b, 0x60, 0x0c, 0xa0, 0x15, 0x00, 0x40, 0x62, 0xa6, + 0x6a, 0x3a, 0x60, 0x0f, 0x00, 0x00, 0x68, 0x33, 0x00, 0x00, 0x68, 0x3f, + 0x00, 0x00, 0x20, 0x11, 0xa9, 0xd0, 0x20, 0x13, 0x00, 0x00, 0x0c, 0x7f, + 0x0d, 0x7f, 0x00, 0x7c, 0x68, 0x3a, 0x68, 0x36, 0x00, 0x78, 0x62, 0x9b, + 0x68, 0x43, 0x00, 0x00, 0x68, 0x38, 0xa0, 0x65, 0x00, 0x40, 0x62, 0x9b, + 0x60, 0x03, 0x00, 0x03, 0x00, 0x78, 0x62, 0x9b, 0x0c, 0x7e, 0x68, 0x43, + 0x00, 0x00, 0x68, 0x47, 0x00, 0x00, 0x68, 0x4b, 0x00, 0x00, 0x68, 0x3c, + 0xa0, 0x65, 0x00, 0x40, 0x62, 0xce, 0x60, 0x0c, 0xa0, 0x15, 0x00, 0x40, + 0x62, 0xca, 0x6a, 0x3a, 0x60, 0x0f, 0x00, 0x00, 0x68, 0x3f, 0x00, 0x00, + 0x00, 0x78, 0x62, 0xce, 0x68, 0x3f, 0x00, 0x00, 0x68, 0x3a, 0x68, 0x36, + 0x0c, 0x7f, 0x0d, 0x7f, 0x00, 0x7c, 0x0d, 0x7e, 0x20, 0x69, 0xa9, 0xb1, + 0x68, 0x04, 0xa0, 0x84, 0x00, 0x07, 0x00, 0x79, 0x62, 0xd9, 0x62, 0xe3, + 0x63, 0x8a, 0x63, 0x8a, 0x63, 0x8a, 0x63, 0x8a, 0x63, 0x8c, 0x63, 0x8a, + 0x62, 0xe1, 0x10, 0x78, 0x13, 0x32, 0x68, 0x20, 0xa0, 0x05, 0x00, 0xc0, + 0x62, 0xe9, 0x0d, 0x7f, 0x00, 0x7c, 0x0c, 0x7e, 0x68, 0x0c, 0xa0, 0x65, + 0x00, 0x40, 0x62, 0xf8, 0x68, 0x07, 0x00, 0x04, 0x68, 0x26, 0x68, 0x2b, + 0x00, 0x00, 0x10, 0x78, 0x63, 0xd4, 0x0c, 0x7f, 0x0d, 0x7f, 0x00, 0x7c, + 0x68, 0x14, 0xa0, 0x65, 0x00, 0x40, 0x63, 0x06, 0x68, 0x07, 0x00, 0x01, + 0x68, 0x26, 0x68, 0x2b, 0x00, 0x00, 0x10, 0x78, 0x63, 0xd4, 0x0c, 0x7f, + 0x0d, 0x7f, 0x00, 0x7c, 0x0e, 0x7e, 0x03, 0x7e, 0x6a, 0x1c, 0xa2, 0xf5, + 0x00, 0x00, 0x00, 0x40, 0x63, 0x85, 0x70, 0x4c, 0xa0, 0x0d, 0x00, 0x40, + 0x63, 0x15, 0x70, 0x88, 0xa0, 0x05, 0x00, 0x40, 0x63, 0x2d, 0x70, 0x54, + 0xa0, 0x75, 0x00, 0x40, 0x63, 0x1e, 0xa2, 0x0e, 0x00, 0x40, 0x63, 0x85, + 0x00, 0x78, 0x63, 0x23, 0x68, 0x18, 0xa2, 0x0e, 0x00, 0x40, 0x63, 0x85, + 0x20, 0x70, 0x70, 0x4c, 0xa0, 0x0d, 0x00, 0x40, 0x63, 0x15, 0x70, 0x88, + 0xa0, 0x05, 0x00, 0xc0, 0x63, 0x15, 0x2e, 0x00, 0x68, 0x1e, 0x73, 0x3c, + 0x70, 0x38, 0xa3, 0x02, 0x00, 0xc8, 0x63, 0x15, 0x10, 0x78, 0x76, 0xfc, + 0x00, 0x40, 0x63, 0x85, 0x83, 0x18, 0x73, 0x3e, 0x61, 0x12, 0x2e, 0x10, + 0x62, 0x1a, 0xa1, 0x80, 0x00, 0x14, 0x20, 0x04, 0xa0, 0x84, 0x00, 0xff, + 0x60, 0x32, 0xa1, 0x80, 0x00, 0x14, 0x20, 0x03, 0x00, 0x00, 0xa1, 0x80, + 0x00, 0x15, 0x20, 0x04, 0xa0, 0x8a, 0x19, 0x9a, 0x00, 0x48, 0x63, 0x4e, + 0x20, 0x01, 0x19, 0x99, 0x80, 0x03, 0x80, 0x1b, 0x83, 0x1b, 0xa3, 0x18, + 0x63, 0x16, 0x03, 0x7f, 0x0f, 0x7e, 0x2c, 0x78, 0x71, 0xa0, 0xd1, 0xbc, + 0x00, 0x40, 0x63, 0x67, 0x71, 0x00, 0xd1, 0xf4, 0x00, 0x40, 0x63, 0x63, + 0x71, 0x14, 0xa1, 0x8c, 0x00, 0xff, 0x00, 0x78, 0x63, 0x6c, 0x20, 0x09, + 0x00, 0x00, 0x00, 0x78, 0x63, 0x6c, 0xa1, 0xe0, 0x29, 0xc0, 0x2c, 0x0c, + 0xa1, 0x8c, 0x00, 0xff, 0x20, 0x61, 0x01, 0x00, 0x61, 0x9a, 0x10, 0x78, + 0x69, 0x65, 0x73, 0x00, 0xc3, 0xdd, 0x73, 0x02, 0x68, 0x07, 0x00, 0x02, + 0x2f, 0x18, 0x6b, 0x26, 0x68, 0x2b, 0x00, 0x00, 0x78, 0x1f, 0x00, 0x03, + 0x78, 0x03, 0x00, 0x01, 0x78, 0x07, 0x00, 0x40, 0x0f, 0x7f, 0x0e, 0x7f, + 0x0c, 0x7f, 0x0d, 0x7f, 0x00, 0x7c, 0x03, 0x7f, 0x0e, 0x7f, 0x0c, 0x7f, + 0x00, 0x78, 0x63, 0x83, 0x0d, 0x7f, 0x00, 0x7c, 0x0c, 0x7e, 0x68, 0x0c, + 0xa0, 0x65, 0x00, 0x40, 0x63, 0x98, 0x68, 0x07, 0x00, 0x04, 0x68, 0x26, + 0x68, 0x2b, 0x00, 0x00, 0x10, 0x78, 0x63, 0xd4, 0x0c, 0x7f, 0x0d, 0x7f, + 0x00, 0x7c, 0x0f, 0x7e, 0x0d, 0x7e, 0x20, 0x69, 0xa9, 0xb1, 0x68, 0x30, + 0xa0, 0x86, 0x00, 0x00, 0x00, 0xc0, 0x63, 0xbb, 0x68, 0x38, 0xa0, 0x7d, + 0x00, 0x40, 0x63, 0xbb, 0x68, 0x33, 0x00, 0x01, 0x68, 0x3e, 0x68, 0x47, + 0x00, 0x00, 0x68, 0x4b, 0x00, 0x00, 0x12, 0x7e, 0x0f, 0x7e, 0x20, 0x91, + 0x22, 0x00, 0x02, 0x7f, 0x10, 0x78, 0x1d, 0x6d, 0x00, 0xc0, 0x63, 0xbe, + 0x12, 0x7f, 0x10, 0x78, 0x6c, 0xb3, 0x0d, 0x7f, 0x0f, 0x7f, 0x00, 0x7c, + 0x12, 0x7f, 0x68, 0x43, 0x00, 0x00, 0x78, 0x03, 0x00, 0x02, 0x78, 0x0c, + 0xa0, 0x15, 0x00, 0x40, 0x63, 0xd0, 0x6a, 0x3a, 0x78, 0x0f, 0x00, 0x00, + 0x68, 0x33, 0x00, 0x00, 0x68, 0x3f, 0x00, 0x00, 0x00, 0x78, 0x63, 0xbb, + 0x68, 0x3a, 0x68, 0x36, 0x00, 0x78, 0x63, 0xca, 0x60, 0x1c, 0xa0, 0x84, + 0x00, 0x0f, 0x10, 0x79, 0x63, 0xda, 0x00, 0x7c, 0x63, 0xe3, 0x63, 0xe8, + 0x68, 0x09, 0x69, 0x22, 0x63, 0xe8, 0x68, 0x09, 0x69, 0x22, 0x63, 0xe3, + 0x63, 0xe8, 0x10, 0x78, 0x61, 0xcd, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x7c, + 0x15, 0x7e, 0x13, 0x7e, 0x14, 0x7e, 0x0c, 0x7e, 0x0f, 0x7e, 0x60, 0x04, + 0xa0, 0x8a, 0x00, 0x44, 0x10, 0xc8, 0x13, 0x32, 0x61, 0x18, 0x21, 0x78, + 0x79, 0xa0, 0xd1, 0xbc, 0x00, 0x40, 0x64, 0x05, 0x79, 0x00, 0xd1, 0xf4, + 0x00, 0x40, 0x64, 0x01, 0x79, 0x14, 0xa1, 0x8c, 0x00, 0xff, 0x00, 0x78, + 0x64, 0x0a, 0x20, 0x09, 0x00, 0x00, 0x00, 0x78, 0x64, 0x0a, 0xa1, 0xf8, + 0x29, 0xc0, 0x2f, 0x0c, 0xa1, 0x8c, 0x00, 0xff, 0x2c, 0x78, 0x20, 0x61, + 0x01, 0x00, 0x61, 0x9a, 0xa0, 0x8a, 0x00, 0x40, 0x00, 0xc8, 0x64, 0x5c, + 0x10, 0x79, 0x64, 0x1a, 0x0f, 0x7f, 0x0c, 0x7f, 0x14, 0x7f, 0x13, 0x7f, + 0x15, 0x7f, 0x00, 0x7c, 0x64, 0xc2, 0x65, 0x0a, 0x65, 0x32, 0x65, 0xcd, + 0x65, 0xfd, 0x66, 0x05, 0x66, 0x2c, 0x66, 0x3d, 0x66, 0x4e, 0x66, 0x56, + 0x66, 0x6e, 0x66, 0x56, 0x66, 0xd9, 0x66, 0x3d, 0x66, 0xfa, 0x67, 0x02, + 0x66, 0x4e, 0x67, 0x02, 0x67, 0x13, 0x64, 0x5a, 0x64, 0x5a, 0x64, 0x5a, + 0x64, 0x5a, 0x64, 0x5a, 0x64, 0x5a, 0x64, 0x5a, 0x64, 0x5a, 0x64, 0x5a, + 0x64, 0x5a, 0x64, 0x5a, 0x6e, 0xef, 0x6f, 0x14, 0x6f, 0x29, 0x6f, 0x4c, + 0x6f, 0x6d, 0x66, 0x2c, 0x64, 0x5a, 0x66, 0x2c, 0x66, 0x56, 0x64, 0x5a, + 0x65, 0x32, 0x65, 0xcd, 0x64, 0x5a, 0x74, 0x9c, 0x66, 0x56, 0x64, 0x5a, + 0x74, 0xbc, 0x66, 0x56, 0x64, 0x5a, 0x64, 0x5a, 0x64, 0xbd, 0x64, 0x6b, + 0x64, 0x5a, 0x74, 0xe1, 0x75, 0x58, 0x76, 0x40, 0x64, 0x5a, 0x76, 0x51, + 0x66, 0x26, 0x76, 0x6d, 0x64, 0x5a, 0x6f, 0x82, 0x64, 0x5a, 0x64, 0x5a, + 0x10, 0x78, 0x13, 0x32, 0x21, 0x00, 0x10, 0x79, 0x64, 0x65, 0x0f, 0x7f, + 0x0c, 0x7f, 0x14, 0x7f, 0x13, 0x7f, 0x15, 0x7f, 0x00, 0x7c, 0x64, 0x69, + 0x64, 0x69, 0x64, 0x69, 0x64, 0x9f, 0x10, 0x78, 0x13, 0x32, 0x0d, 0x7e, + 0x20, 0xa1, 0x02, 0x0b, 0x10, 0x78, 0x67, 0x31, 0x78, 0x10, 0x20, 0x68, + 0x20, 0xa3, 0x24, 0x14, 0x20, 0xa3, 0x00, 0x18, 0x20, 0xa3, 0x08, 0x00, + 0x68, 0x3c, 0x20, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x68, 0x50, 0x20, 0xa2, + 0x68, 0x54, 0x20, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x60, 0xc3, 0x00, 0x18, 0x10, 0x78, 0x6d, 0xfb, 0x0d, 0x7f, 0x00, 0x7c, + 0x0d, 0x7e, 0x78, 0x18, 0x20, 0x68, 0x68, 0xa0, 0xa0, 0x82, 0x00, 0x7e, + 0x00, 0x48, 0x64, 0x9c, 0xa0, 0x85, 0x00, 0x01, 0x0d, 0x7f, 0x00, 0x7c, + 0xa0, 0x06, 0x00, 0x78, 0x64, 0x9a, 0x0d, 0x7e, 0x20, 0xa1, 0x02, 0x0b, + 0x10, 0x78, 0x67, 0x31, 0x20, 0xa3, 0x05, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x78, 0x10, 0xa0, 0xe8, 0x00, 0x0f, 0x68, 0x08, 0x20, 0xa2, 0x68, 0x0c, + 0x20, 0xa2, 0x68, 0x10, 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, 0x68, 0x18, + 0x20, 0xa2, 0x68, 0x1c, 0x20, 0xa2, 0x60, 0xc3, 0x00, 0x10, 0x10, 0x78, + 0x6d, 0xfb, 0x0d, 0x7f, 0x00, 0x7c, 0x60, 0x30, 0x60, 0x9a, 0x10, 0x78, + 0x6d, 0xfb, 0x00, 0x7c, 0x20, 0xa1, 0x02, 0x0b, 0x10, 0x78, 0x67, 0x31, + 0x20, 0xa3, 0x52, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x0d, 0x7e, 0x20, 0x69, + 0xa7, 0x52, 0x68, 0x04, 0xd0, 0x84, 0x00, 0x40, 0x64, 0xdc, 0x68, 0x28, + 0x20, 0xa3, 0x00, 0x00, 0x01, 0x7e, 0x10, 0x78, 0x25, 0x64, 0x21, 0xa2, + 0x01, 0x7f, 0x0d, 0x7f, 0x00, 0x78, 0x64, 0xe1, 0x0d, 0x7f, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x99, + 0xa7, 0x05, 0x53, 0xa6, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x99, 0xa7, 0x01, + 0x53, 0xa6, 0x78, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, 0xa0, 0x82, + 0x00, 0x7f, 0x00, 0x48, 0x64, 0xfb, 0x20, 0x01, 0xa7, 0x1b, 0x20, 0xa6, + 0x20, 0x01, 0xa7, 0x1c, 0x20, 0xa6, 0x00, 0x78, 0x65, 0x01, 0x20, 0xa3, + 0x00, 0x00, 0x60, 0x30, 0xa0, 0x84, 0x00, 0xff, 0x20, 0xa2, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, 0x00, 0x1c, 0x10, 0x78, + 0x6d, 0xfb, 0x00, 0x7c, 0x20, 0xa1, 0x02, 0x0b, 0x10, 0x78, 0x67, 0x31, + 0x20, 0xa3, 0x05, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x78, 0x18, 0xa0, 0x80, + 0x00, 0x28, 0x20, 0x04, 0xa0, 0x82, 0x00, 0x7f, 0x00, 0x48, 0x65, 0x22, + 0x20, 0x01, 0xa7, 0x1b, 0x20, 0xa6, 0x20, 0x01, 0xa7, 0x1c, 0x20, 0xa6, + 0x00, 0x78, 0x65, 0x28, 0x20, 0xa3, 0x00, 0x00, 0x60, 0x30, 0xa0, 0x84, + 0x00, 0xff, 0x20, 0xa2, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x99, 0xa7, 0x05, + 0x53, 0xa6, 0x60, 0xc3, 0x00, 0x10, 0x10, 0x78, 0x6d, 0xfb, 0x00, 0x7c, + 0x20, 0xa1, 0x02, 0x0b, 0x10, 0x78, 0x67, 0x31, 0x0c, 0x7e, 0x78, 0x18, + 0x20, 0x60, 0x20, 0x01, 0x00, 0x00, 0x10, 0x78, 0x49, 0x72, 0x0c, 0x7f, + 0x78, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, 0xa0, 0x86, 0x00, 0x7e, + 0x00, 0xc0, 0x65, 0x4d, 0x20, 0xa3, 0x04, 0x00, 0x62, 0x0c, 0xc2, 0xb4, + 0x62, 0x0e, 0x00, 0x78, 0x65, 0x4f, 0x20, 0xa3, 0x03, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x78, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, 0xa0, 0x86, + 0x00, 0x7e, 0x00, 0xc0, 0x65, 0x9c, 0x20, 0x99, 0xa9, 0x8d, 0x33, 0xa6, + 0x93, 0x98, 0x33, 0xa6, 0x93, 0x98, 0x33, 0x04, 0xa0, 0x84, 0x3f, 0xff, + 0x20, 0xa2, 0x93, 0x98, 0x33, 0xa6, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa9, + 0x00, 0x04, 0x20, 0x99, 0xa7, 0x05, 0x53, 0xa6, 0x20, 0xa9, 0x00, 0x04, + 0x20, 0x99, 0xa7, 0x01, 0x53, 0xa6, 0x20, 0xa9, 0x00, 0x10, 0x20, 0xa3, + 0x00, 0x00, 0x00, 0xf0, 0x65, 0x79, 0x20, 0x99, 0xa9, 0x95, 0x33, 0x04, + 0xc0, 0xdd, 0x20, 0xa2, 0x20, 0x01, 0xa7, 0x72, 0x20, 0x04, 0xd0, 0xe4, + 0x00, 0x40, 0x65, 0x94, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x93, 0x98, 0x93, 0x98, 0x93, 0x98, 0x33, 0xa6, 0x20, 0xa9, 0x00, 0x04, + 0x00, 0x78, 0x65, 0x96, 0x20, 0xa9, 0x00, 0x07, 0x20, 0xa3, 0x00, 0x00, + 0x00, 0xf0, 0x65, 0x96, 0x00, 0x78, 0x65, 0xbc, 0x20, 0x99, 0xa9, 0x8d, + 0x20, 0xa9, 0x00, 0x08, 0x53, 0xa6, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x99, + 0xa7, 0x05, 0x53, 0xa6, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x99, 0xa7, 0x01, + 0x53, 0xa6, 0x20, 0xa9, 0x00, 0x08, 0x20, 0xa3, 0x00, 0x00, 0x00, 0xf0, + 0x65, 0xad, 0x20, 0xa9, 0x00, 0x08, 0x20, 0xa3, 0x00, 0x00, 0x00, 0xf0, + 0x65, 0xb3, 0x20, 0x99, 0xa9, 0x95, 0x20, 0xa9, 0x00, 0x08, 0x53, 0xa6, + 0x20, 0xa9, 0x00, 0x08, 0x20, 0xa3, 0x00, 0x00, 0x00, 0xf0, 0x65, 0xbe, + 0x20, 0xa9, 0x00, 0x0a, 0x20, 0xa3, 0x00, 0x00, 0x00, 0xf0, 0x65, 0xc4, + 0x60, 0xc3, 0x00, 0x74, 0x10, 0x78, 0x6d, 0xfb, 0x00, 0x7c, 0x20, 0xa1, + 0x02, 0x0b, 0x10, 0x78, 0x67, 0x31, 0x20, 0xa3, 0x20, 0x10, 0x20, 0xa3, + 0x00, 0x14, 0x20, 0xa3, 0x08, 0x00, 0x20, 0xa3, 0x20, 0x00, 0xa0, 0x06, + 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa2, 0x0f, 0x7e, + 0x20, 0x79, 0xa7, 0x52, 0x79, 0x04, 0x0f, 0x7f, 0xd1, 0xac, 0x00, 0xc0, + 0x65, 0xe9, 0xa0, 0x85, 0x00, 0x20, 0xd1, 0xa4, 0x00, 0x40, 0x65, 0xee, + 0xa0, 0x85, 0x00, 0x10, 0xa0, 0x85, 0x00, 0x02, 0x0d, 0x7e, 0x00, 0x78, + 0x66, 0xb7, 0x20, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x60, 0xc3, 0x00, 0x14, 0x10, 0x78, 0x6d, 0xfb, 0x00, 0x7c, 0x20, 0xa1, + 0x02, 0x0b, 0x10, 0x78, 0x67, 0x31, 0x20, 0xa3, 0x50, 0x00, 0x00, 0x78, + 0x65, 0x4f, 0x20, 0xa1, 0x02, 0x0b, 0x10, 0x78, 0x67, 0x31, 0x20, 0xa3, + 0x21, 0x10, 0x20, 0xa3, 0x00, 0x14, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, + 0x00, 0x14, 0x10, 0x78, 0x6d, 0xfb, 0x00, 0x7c, 0x20, 0xa1, 0x02, 0x0b, + 0x10, 0x78, 0x67, 0xb9, 0x00, 0x78, 0x66, 0x30, 0x20, 0xa1, 0x02, 0x0b, + 0x10, 0x78, 0x67, 0xc2, 0x20, 0xa3, 0x02, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, 0x00, 0x04, + 0x10, 0x78, 0x6d, 0xfb, 0x00, 0x7c, 0x20, 0xa1, 0x02, 0x0b, 0x10, 0x78, + 0x67, 0xc2, 0x20, 0xa3, 0x01, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, + 0x00, 0x03, 0x20, 0xa3, 0x2a, 0x00, 0x60, 0xc3, 0x00, 0x08, 0x10, 0x78, + 0x6d, 0xfb, 0x00, 0x7c, 0x20, 0xa1, 0x02, 0x0b, 0x10, 0x78, 0x67, 0xc2, + 0x20, 0xa3, 0x02, 0x00, 0x00, 0x78, 0x65, 0x4f, 0x20, 0xa1, 0x02, 0x0b, + 0x10, 0x78, 0x67, 0xc2, 0x20, 0xa3, 0x01, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x78, 0x28, 0xa0, 0x05, 0x00, 0x40, 0x66, 0x65, 0x20, 0xa2, 0x00, 0x78, + 0x66, 0x67, 0x20, 0xa3, 0x00, 0x03, 0x78, 0x10, 0x20, 0xa2, 0x60, 0xc3, + 0x00, 0x08, 0x10, 0x78, 0x6d, 0xfb, 0x00, 0x7c, 0x0d, 0x7e, 0x20, 0xa1, + 0x02, 0x0b, 0x10, 0x78, 0x67, 0xc2, 0x20, 0xa3, 0x02, 0x10, 0x20, 0xa3, + 0x00, 0x14, 0x20, 0xa3, 0x08, 0x00, 0x78, 0x18, 0x20, 0x68, 0x68, 0x94, + 0xa0, 0x86, 0x00, 0x14, 0x00, 0xc0, 0x66, 0x94, 0x69, 0x98, 0xa1, 0x84, + 0xc0, 0x00, 0x00, 0xc0, 0x66, 0x90, 0xd1, 0xec, 0x00, 0x40, 0x66, 0x8c, + 0x20, 0xa3, 0x21, 0x00, 0x00, 0x78, 0x66, 0x96, 0x20, 0xa3, 0x01, 0x00, + 0x00, 0x78, 0x66, 0x96, 0x20, 0xa3, 0x04, 0x00, 0x00, 0x78, 0x66, 0x96, + 0x20, 0xa3, 0x07, 0x00, 0xa0, 0x06, 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa2, + 0x20, 0xa2, 0x20, 0xa2, 0x0f, 0x7e, 0x20, 0x79, 0xa7, 0x52, 0x79, 0x04, + 0x0f, 0x7f, 0xd1, 0xac, 0x00, 0xc0, 0x66, 0xa6, 0xa0, 0x85, 0x00, 0x20, + 0xd1, 0xa4, 0x00, 0x40, 0x66, 0xab, 0xa0, 0x85, 0x00, 0x10, 0x20, 0x09, + 0xa7, 0x74, 0x21, 0x0c, 0xd1, 0x84, 0x00, 0x40, 0x66, 0xb5, 0x69, 0x9c, + 0xd1, 0x8c, 0x00, 0x40, 0x66, 0xb7, 0xa0, 0x85, 0x00, 0x02, 0x02, 0x7e, + 0x20, 0x09, 0xa7, 0x72, 0x21, 0x0c, 0xd1, 0xe4, 0x00, 0x40, 0x66, 0xc5, + 0xc0, 0xc5, 0xa0, 0x94, 0x00, 0x30, 0xa2, 0x96, 0x00, 0x10, 0x00, 0x40, + 0x66, 0xcf, 0xd1, 0xec, 0x00, 0x40, 0x66, 0xcf, 0xa0, 0x94, 0x00, 0x30, + 0xa2, 0x96, 0x00, 0x10, 0x00, 0x40, 0x66, 0xcf, 0xc0, 0xbd, 0x02, 0x7f, + 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa2, 0x60, 0xc3, 0x00, 0x14, 0x10, 0x78, + 0x6d, 0xfb, 0x0d, 0x7f, 0x00, 0x7c, 0x20, 0xa1, 0x02, 0x0b, 0x10, 0x78, + 0x67, 0xc2, 0x20, 0xa3, 0x02, 0x10, 0x20, 0xa3, 0x00, 0x14, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0xa3, 0x01, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x60, 0xc3, 0x00, 0x14, 0x10, 0x78, 0x6d, 0xfb, 0x00, 0x7c, + 0x20, 0xa1, 0x02, 0x0b, 0x10, 0x78, 0x67, 0xc2, 0x20, 0xa3, 0x02, 0x00, + 0x00, 0x78, 0x64, 0xc8, 0x20, 0xa1, 0x02, 0x0b, 0x10, 0x78, 0x67, 0xc2, + 0x20, 0xa3, 0x01, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x03, + 0x20, 0xa3, 0x2a, 0x00, 0x60, 0xc3, 0x00, 0x08, 0x10, 0x78, 0x6d, 0xfb, + 0x00, 0x7c, 0x20, 0xe1, 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, 0x20, 0xa1, + 0x02, 0x0b, 0x10, 0x78, 0x67, 0xc2, 0x20, 0xa3, 0x01, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0xa3, 0x00, 0x0b, 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, + 0x00, 0x08, 0x10, 0x78, 0x6d, 0xfb, 0x00, 0x7c, 0x02, 0x7e, 0x03, 0x7e, + 0x04, 0x7e, 0x20, 0x19, 0x32, 0x00, 0x20, 0x21, 0x08, 0x00, 0x00, 0x78, + 0x67, 0x38, 0x02, 0x7e, 0x03, 0x7e, 0x04, 0x7e, 0x20, 0x19, 0x22, 0x00, + 0x20, 0x21, 0x01, 0x00, 0x20, 0xe1, 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, + 0x78, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x14, 0xa2, 0x86, 0x00, 0x7e, + 0x00, 0xc0, 0x67, 0x4b, 0xa3, 0x85, 0x00, 0xff, 0x20, 0xa2, 0x20, 0xa3, + 0xff, 0xfe, 0x00, 0x78, 0x67, 0x80, 0xa2, 0x86, 0x00, 0x7f, 0x00, 0xc0, + 0x67, 0x57, 0x0d, 0x7e, 0xa3, 0x85, 0x00, 0xff, 0x20, 0xa2, 0x20, 0xa3, + 0xff, 0xfd, 0x00, 0x78, 0x67, 0x6e, 0xd2, 0xbc, 0x00, 0x40, 0x67, 0x76, + 0xa2, 0x86, 0x00, 0x80, 0x0d, 0x7e, 0x00, 0xc0, 0x67, 0x66, 0xa3, 0x85, + 0x00, 0xff, 0x20, 0xa2, 0x20, 0xa3, 0xff, 0xfc, 0x00, 0x78, 0x67, 0x6e, + 0xa2, 0xe8, 0xa8, 0x35, 0x2d, 0x6c, 0x68, 0x10, 0xa3, 0x05, 0x20, 0xa2, + 0x68, 0x14, 0x20, 0xa2, 0x20, 0x69, 0xa7, 0x1b, 0x2d, 0xa6, 0x8d, 0x68, + 0x2d, 0xa6, 0x0d, 0x7f, 0x00, 0x78, 0x67, 0x84, 0x0d, 0x7e, 0xa2, 0xe8, + 0xa8, 0x35, 0x2d, 0x6c, 0x68, 0x10, 0xa3, 0x05, 0x20, 0xa2, 0x68, 0x14, + 0x20, 0xa2, 0x0d, 0x7f, 0x20, 0xa3, 0x00, 0x00, 0x62, 0x30, 0x22, 0xa2, + 0xa4, 0x85, 0x00, 0x29, 0x20, 0xa2, 0x04, 0x7f, 0x03, 0x7f, 0x20, 0xa3, + 0x00, 0x00, 0x10, 0x78, 0x6d, 0xea, 0x22, 0xa2, 0x20, 0xa3, 0x00, 0x00, + 0x2f, 0xa2, 0x20, 0xa3, 0xff, 0xff, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x02, 0x7f, 0x00, 0x7c, 0x02, 0x7e, 0x20, 0xe1, 0x90, 0x80, + 0x20, 0xe1, 0x40, 0x00, 0x20, 0xa3, 0x02, 0xff, 0x20, 0x11, 0xff, 0xfc, + 0x22, 0xa2, 0x0d, 0x7e, 0x20, 0x69, 0xa7, 0x1b, 0x2d, 0xa6, 0x8d, 0x68, + 0x2d, 0xa6, 0x0d, 0x7f, 0x20, 0xa3, 0x20, 0x29, 0x20, 0xa3, 0x00, 0x00, + 0x00, 0x78, 0x67, 0x8b, 0x20, 0xa3, 0x01, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x20, 0xa3, 0xfc, 0x02, 0x20, 0xa3, 0x00, 0x00, 0x00, 0x7c, 0x02, 0x7e, + 0x03, 0x7e, 0x04, 0x7e, 0x20, 0x19, 0x33, 0x00, 0x20, 0x21, 0x08, 0x00, + 0x00, 0x78, 0x67, 0xc9, 0x02, 0x7e, 0x03, 0x7e, 0x04, 0x7e, 0x20, 0x19, + 0x23, 0x00, 0x20, 0x21, 0x01, 0x00, 0x20, 0xe1, 0x90, 0x80, 0x20, 0xe1, + 0x40, 0x00, 0x78, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, 0xa0, 0x92, + 0x00, 0x7e, 0x00, 0x48, 0x67, 0xe6, 0x0d, 0x7e, 0xa0, 0xe8, 0xa8, 0x35, + 0x2d, 0x6c, 0x68, 0x10, 0xa3, 0x05, 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, + 0x20, 0x69, 0xa7, 0x1b, 0x2d, 0xa6, 0x8d, 0x68, 0x2d, 0xa6, 0x0d, 0x7f, + 0x00, 0x78, 0x67, 0xf4, 0x0d, 0x7e, 0xa0, 0xe8, 0xa8, 0x35, 0x2d, 0x6c, + 0x68, 0x10, 0xa3, 0x05, 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, 0x0d, 0x7f, + 0x20, 0xa3, 0x00, 0x00, 0x62, 0x30, 0x22, 0xa2, 0xa4, 0x85, 0x00, 0x98, + 0x20, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x04, 0x7f, 0x03, 0x7f, 0x10, 0x78, + 0x6d, 0xea, 0x22, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x7a, 0x08, 0x22, 0xa2, + 0x2f, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x02, 0x7f, + 0x00, 0x7c, 0x0c, 0x7e, 0x0f, 0x7e, 0x60, 0x04, 0xa0, 0x8a, 0x00, 0x85, + 0x10, 0x48, 0x13, 0x32, 0xa0, 0x8a, 0x00, 0x8c, 0x10, 0xc8, 0x13, 0x32, + 0x61, 0x18, 0x21, 0x78, 0x79, 0xa0, 0xd1, 0xbc, 0x00, 0x40, 0x68, 0x27, + 0x79, 0x00, 0xd1, 0xf4, 0x00, 0x40, 0x68, 0x23, 0x79, 0x14, 0xa1, 0x8c, + 0x00, 0xff, 0x00, 0x78, 0x68, 0x2c, 0x20, 0x09, 0x00, 0x00, 0x00, 0x78, + 0x68, 0x2c, 0xa1, 0xf8, 0x29, 0xc0, 0x2f, 0x0c, 0xa1, 0x8c, 0x00, 0xff, + 0x2c, 0x78, 0x20, 0x61, 0x01, 0x00, 0x61, 0x9a, 0xa0, 0x82, 0x00, 0x85, + 0x10, 0x79, 0x68, 0x37, 0x0f, 0x7f, 0x0c, 0x7f, 0x00, 0x7c, 0x68, 0x40, + 0x68, 0x4b, 0x68, 0x66, 0x68, 0x3e, 0x68, 0x3e, 0x68, 0x3e, 0x68, 0x40, + 0x10, 0x78, 0x13, 0x32, 0x14, 0x7e, 0x20, 0xa1, 0x02, 0x0b, 0x10, 0x78, + 0x68, 0x79, 0x60, 0xc3, 0x00, 0x00, 0x10, 0x78, 0x6d, 0xfb, 0x14, 0x7f, + 0x00, 0x7c, 0x14, 0x7e, 0x20, 0xa1, 0x02, 0x0b, 0x10, 0x78, 0x68, 0xad, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x78, 0x08, 0x20, 0xa2, + 0x78, 0x10, 0x20, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0xff, 0xff, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, 0x00, 0x0c, + 0x10, 0x78, 0x6d, 0xfb, 0x14, 0x7f, 0x00, 0x7c, 0x14, 0x7e, 0x20, 0xa1, + 0x02, 0x0b, 0x10, 0x78, 0x68, 0xee, 0x20, 0xa3, 0x00, 0x03, 0x20, 0xa3, + 0x03, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, + 0x00, 0x04, 0x10, 0x78, 0x6d, 0xfb, 0x14, 0x7f, 0x00, 0x7c, 0x02, 0x7e, + 0x20, 0xe1, 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, 0x78, 0x18, 0xa0, 0x80, + 0x00, 0x28, 0x20, 0x04, 0xa0, 0x92, 0x00, 0x7e, 0x00, 0x48, 0x68, 0x98, + 0x0d, 0x7e, 0xa0, 0xe8, 0xa8, 0x35, 0x2d, 0x6c, 0x68, 0x10, 0xa0, 0x85, + 0x81, 0x00, 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, 0x20, 0x69, 0xa7, 0x1b, + 0x2d, 0xa6, 0x8d, 0x68, 0x2d, 0xa6, 0x0d, 0x7f, 0x00, 0x78, 0x68, 0xa7, + 0x0d, 0x7e, 0xa0, 0xe8, 0xa8, 0x35, 0x2d, 0x6c, 0x68, 0x10, 0xa0, 0x85, + 0x81, 0x00, 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, 0x0d, 0x7f, 0x20, 0xa3, + 0x00, 0x00, 0x62, 0x30, 0x22, 0xa2, 0x20, 0xa3, 0x00, 0x09, 0x20, 0xa3, + 0x00, 0x00, 0x00, 0x78, 0x67, 0x8b, 0x02, 0x7e, 0x20, 0xe1, 0x90, 0x80, + 0x20, 0xe1, 0x40, 0x00, 0x78, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, + 0xa0, 0x92, 0x00, 0x7e, 0x00, 0x48, 0x68, 0xcc, 0x0d, 0x7e, 0xa0, 0xe8, + 0xa8, 0x35, 0x2d, 0x6c, 0x68, 0x10, 0xa0, 0x85, 0x84, 0x00, 0x20, 0xa2, + 0x68, 0x14, 0x20, 0xa2, 0x20, 0x69, 0xa7, 0x1b, 0x2d, 0xa6, 0x8d, 0x68, + 0x2d, 0xa6, 0x0d, 0x7f, 0x00, 0x78, 0x68, 0xdb, 0x0d, 0x7e, 0xa0, 0xe8, + 0xa8, 0x35, 0x2d, 0x6c, 0x68, 0x10, 0xa0, 0x85, 0x84, 0x00, 0x20, 0xa2, + 0x68, 0x14, 0x20, 0xa2, 0x0d, 0x7f, 0x20, 0xa3, 0x00, 0x00, 0x62, 0x30, + 0x22, 0xa2, 0x20, 0xa3, 0x00, 0x99, 0x20, 0xa3, 0x00, 0x00, 0x10, 0x78, + 0x6d, 0xea, 0x22, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x7a, 0x08, 0x22, 0xa2, + 0x7a, 0x10, 0x22, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x02, 0x7f, 0x00, 0x7c, 0x02, 0x7e, 0x20, 0xe1, 0x90, 0x80, 0x20, 0xe1, + 0x40, 0x00, 0x78, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, 0xa0, 0x92, + 0x00, 0x7e, 0x00, 0x48, 0x69, 0x0d, 0x0d, 0x7e, 0xa0, 0xe8, 0xa8, 0x35, + 0x2d, 0x6c, 0x68, 0x10, 0xa0, 0x85, 0x85, 0x00, 0x20, 0xa2, 0x68, 0x14, + 0x20, 0xa2, 0x20, 0x69, 0xa7, 0x1b, 0x2d, 0xa6, 0x8d, 0x68, 0x2d, 0xa6, + 0x0d, 0x7f, 0x00, 0x78, 0x69, 0x1c, 0x0d, 0x7e, 0xa0, 0xe8, 0xa8, 0x35, + 0x2d, 0x6c, 0x68, 0x10, 0xa0, 0x85, 0x85, 0x00, 0x20, 0xa2, 0x68, 0x14, + 0x20, 0xa2, 0x0d, 0x7f, 0x20, 0xa3, 0x00, 0x00, 0x62, 0x30, 0x22, 0xa2, + 0x20, 0xa3, 0x00, 0x99, 0x20, 0xa3, 0x00, 0x00, 0x00, 0x78, 0x68, 0xdf, + 0x0c, 0x7e, 0x0f, 0x7e, 0x2c, 0x78, 0x78, 0x04, 0xa0, 0x8a, 0x00, 0x40, + 0x10, 0x48, 0x13, 0x32, 0xa0, 0x8a, 0x00, 0x53, 0x10, 0xc8, 0x13, 0x32, + 0x79, 0x18, 0x21, 0x60, 0x61, 0xa0, 0xd1, 0xbc, 0x00, 0x40, 0x69, 0x41, + 0x61, 0x00, 0xd1, 0xf4, 0x00, 0x40, 0x69, 0x3d, 0x61, 0x14, 0xa1, 0x8c, + 0x00, 0xff, 0x00, 0x78, 0x69, 0x46, 0x20, 0x09, 0x00, 0x00, 0x00, 0x78, + 0x69, 0x46, 0xa1, 0xe0, 0x29, 0xc0, 0x2c, 0x0c, 0xa1, 0x8c, 0x00, 0xff, + 0x20, 0x61, 0x01, 0x00, 0x61, 0x9a, 0xa0, 0x82, 0x00, 0x40, 0x10, 0x79, + 0x69, 0x50, 0x0f, 0x7f, 0x0c, 0x7f, 0x00, 0x7c, 0x69, 0x65, 0x6a, 0x73, + 0x6a, 0x14, 0x6c, 0x27, 0x69, 0x63, 0x69, 0x63, 0x69, 0x63, 0x69, 0x63, + 0x69, 0x63, 0x69, 0x63, 0x69, 0x63, 0x71, 0x4c, 0x71, 0x5d, 0x71, 0x6e, + 0x71, 0x7f, 0x69, 0x63, 0x76, 0x7e, 0x69, 0x63, 0x71, 0x3b, 0x10, 0x78, + 0x13, 0x32, 0x0d, 0x7e, 0x15, 0x7e, 0x14, 0x7e, 0x78, 0x0b, 0xff, 0xff, + 0x20, 0xa1, 0x02, 0x0b, 0x10, 0x78, 0x69, 0xd0, 0x79, 0x10, 0x21, 0x68, + 0x69, 0x48, 0x79, 0x22, 0x21, 0xa2, 0xa0, 0x16, 0x22, 0xa2, 0x22, 0xa2, + 0x22, 0xa2, 0x69, 0x4c, 0xa1, 0x84, 0x00, 0x0f, 0x00, 0xc0, 0x69, 0x80, + 0x20, 0x01, 0x00, 0x05, 0x00, 0x78, 0x69, 0x8a, 0xd1, 0x84, 0x00, 0x40, + 0x69, 0x87, 0x20, 0x01, 0x00, 0x04, 0x00, 0x78, 0x69, 0x8a, 0xa0, 0x84, + 0x00, 0x06, 0x80, 0x04, 0x01, 0x7e, 0x20, 0x08, 0x78, 0x30, 0xa0, 0x84, + 0x00, 0xff, 0x80, 0x07, 0xa1, 0x05, 0x01, 0x7f, 0x20, 0xa2, 0xd1, 0xac, + 0x00, 0x40, 0x69, 0x9a, 0x20, 0xa3, 0x00, 0x02, 0x00, 0x78, 0x69, 0xa6, + 0xd1, 0xb4, 0x00, 0x40, 0x69, 0xa1, 0x20, 0xa3, 0x00, 0x01, 0x00, 0x78, + 0x69, 0xa6, 0x20, 0xa3, 0x00, 0x00, 0x22, 0x30, 0x00, 0x78, 0x69, 0xa8, + 0x6a, 0x80, 0x6e, 0x7c, 0x20, 0xa9, 0x00, 0x08, 0xad, 0x80, 0x00, 0x17, + 0x20, 0x0c, 0x81, 0x0f, 0x21, 0xa2, 0x80, 0x00, 0x00, 0xf0, 0x69, 0xac, + 0x22, 0xa2, 0x26, 0xa2, 0x60, 0xc3, 0x00, 0x20, 0x20, 0xe1, 0x90, 0x80, + 0x60, 0x14, 0xa0, 0x84, 0x00, 0x04, 0xa0, 0x85, 0x00, 0x09, 0x60, 0x16, + 0x20, 0x01, 0xa9, 0xcd, 0x20, 0x03, 0x07, 0xd0, 0x20, 0x01, 0xa9, 0xcc, + 0x20, 0x03, 0x00, 0x09, 0x20, 0x01, 0xa9, 0xd2, 0x20, 0x03, 0x00, 0x02, + 0x10, 0x78, 0x15, 0x8c, 0x14, 0x7f, 0x15, 0x7f, 0x0d, 0x7f, 0x00, 0x7c, + 0x20, 0xe1, 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, 0x7a, 0x18, 0xa2, 0x80, + 0x00, 0x23, 0x20, 0x14, 0x82, 0x10, 0xa2, 0x94, 0x00, 0xff, 0x22, 0x02, + 0x82, 0x17, 0x78, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, 0xd0, 0xbc, + 0x00, 0x40, 0x69, 0xf6, 0x0d, 0x7e, 0xa0, 0xe8, 0xa8, 0x35, 0x2d, 0x6c, + 0x68, 0x10, 0xa0, 0x85, 0x06, 0x00, 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, + 0x20, 0x69, 0xa7, 0x1b, 0x2d, 0xa6, 0x8d, 0x68, 0x2d, 0xa6, 0x0d, 0x7f, + 0x00, 0x78, 0x6a, 0x05, 0x0d, 0x7e, 0xa0, 0xe8, 0xa8, 0x35, 0x2d, 0x6c, + 0x68, 0x10, 0xa0, 0x85, 0x06, 0x00, 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, + 0x0d, 0x7f, 0x20, 0xa3, 0x00, 0x00, 0x61, 0x30, 0x21, 0xa2, 0x20, 0xa3, + 0x08, 0x29, 0x20, 0xa3, 0x00, 0x00, 0x22, 0xa2, 0x20, 0xa3, 0x00, 0x00, + 0x2f, 0xa2, 0x20, 0xa3, 0xff, 0xff, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x00, 0x7c, 0x0d, 0x7e, 0x15, 0x7e, 0x13, 0x7e, 0x14, 0x7e, + 0x20, 0xa1, 0x02, 0x0b, 0x10, 0x78, 0x6a, 0x34, 0x78, 0x10, 0x20, 0x68, + 0x68, 0x60, 0x20, 0xa2, 0x68, 0x5c, 0x20, 0xa2, 0x68, 0x80, 0x20, 0xa2, + 0x68, 0x7c, 0x20, 0xa2, 0xa0, 0x06, 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa2, + 0x20, 0xa2, 0x60, 0xc3, 0x00, 0x0c, 0x10, 0x78, 0x6d, 0xfb, 0x14, 0x7f, + 0x13, 0x7f, 0x15, 0x7f, 0x0d, 0x7f, 0x00, 0x7c, 0x02, 0x7e, 0x20, 0xe1, + 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, 0x78, 0x18, 0xa0, 0x80, 0x00, 0x28, + 0x20, 0x04, 0xd0, 0xbc, 0x00, 0x40, 0x6a, 0x52, 0x0d, 0x7e, 0xa0, 0xe8, + 0xa8, 0x35, 0x2d, 0x6c, 0x68, 0x10, 0xa0, 0x85, 0x05, 0x00, 0x20, 0xa2, + 0x68, 0x14, 0x20, 0xa2, 0x20, 0x69, 0xa7, 0x1b, 0x2d, 0xa6, 0x8d, 0x68, + 0x2d, 0xa6, 0x0d, 0x7f, 0x00, 0x78, 0x6a, 0x61, 0x0d, 0x7e, 0xa0, 0xe8, + 0xa8, 0x35, 0x2d, 0x6c, 0x68, 0x10, 0xa0, 0x85, 0x05, 0x00, 0x20, 0xa2, + 0x68, 0x14, 0x20, 0xa2, 0x0d, 0x7f, 0x20, 0xa3, 0x00, 0x00, 0x62, 0x30, + 0x22, 0xa2, 0x20, 0xa3, 0x08, 0x89, 0x20, 0xa3, 0x00, 0x00, 0x10, 0x78, + 0x6d, 0xea, 0x22, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x7a, 0x08, 0x22, 0xa2, + 0x2f, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x02, 0x7f, + 0x00, 0x7c, 0x0d, 0x7e, 0x15, 0x7e, 0x13, 0x7e, 0x14, 0x7e, 0x78, 0x10, + 0xa0, 0xec, 0xf0, 0x00, 0x00, 0x40, 0x6a, 0x8b, 0xa0, 0x6d, 0x10, 0x78, + 0x49, 0x5f, 0x00, 0x40, 0x6a, 0x8b, 0x68, 0x4c, 0xa0, 0x84, 0x20, 0x20, + 0xa0, 0x86, 0x20, 0x20, 0x00, 0xc0, 0x6a, 0x8b, 0x78, 0x24, 0xc0, 0xcd, + 0x78, 0x26, 0x20, 0xa1, 0x02, 0x0b, 0x10, 0x78, 0x6b, 0xe0, 0xa0, 0x16, + 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, 0x78, 0x10, + 0xa0, 0x84, 0xf0, 0x00, 0x00, 0xc0, 0x6a, 0xa2, 0x78, 0x10, 0xa0, 0x84, + 0x07, 0x00, 0x80, 0x07, 0x10, 0x79, 0x6a, 0xaa, 0x00, 0x78, 0x6a, 0xa5, + 0xa0, 0x06, 0x10, 0x79, 0x6a, 0xaa, 0x14, 0x7f, 0x13, 0x7f, 0x15, 0x7f, + 0x0d, 0x7f, 0x00, 0x7c, 0x6a, 0xb4, 0x6b, 0x4c, 0x6b, 0x57, 0x6b, 0x81, + 0x6b, 0x95, 0x6b, 0xb1, 0x6b, 0xbc, 0x6a, 0xb2, 0x10, 0x78, 0x13, 0x32, + 0x01, 0x7e, 0x03, 0x7e, 0x69, 0x4c, 0xa1, 0x8c, 0x00, 0x03, 0x00, 0x40, + 0x6a, 0xbf, 0xa1, 0x86, 0x00, 0x03, 0x00, 0xc0, 0x6a, 0xce, 0x6b, 0x78, + 0x78, 0x24, 0xd0, 0xcc, 0x00, 0x40, 0x6a, 0xc5, 0xc3, 0xe5, 0x23, 0xa2, + 0x68, 0x68, 0x20, 0xa2, 0x68, 0x64, 0x20, 0xa2, 0x03, 0x7f, 0x01, 0x7f, + 0x00, 0x78, 0x6b, 0x8c, 0xa1, 0x86, 0x00, 0x01, 0x10, 0xc0, 0x13, 0x32, + 0x6b, 0x78, 0x78, 0x24, 0xd0, 0xcc, 0x00, 0x40, 0x6a, 0xd8, 0xc3, 0xe5, + 0x23, 0xa2, 0x68, 0x68, 0x20, 0xa2, 0x68, 0x64, 0x20, 0xa2, 0x22, 0xa2, + 0x68, 0x74, 0x20, 0xa2, 0x22, 0xa2, 0x68, 0x7c, 0x20, 0xa2, 0x20, 0x09, + 0x00, 0x18, 0xa3, 0x84, 0x03, 0x00, 0x00, 0x40, 0x6b, 0x46, 0xd3, 0xc4, + 0x00, 0x40, 0x6a, 0xee, 0x68, 0x7c, 0xa1, 0x08, 0xd3, 0xcc, 0x00, 0x40, + 0x6a, 0xf3, 0x68, 0x74, 0xa1, 0x08, 0x15, 0x7e, 0x20, 0xa9, 0x00, 0x0d, + 0xad, 0x80, 0x00, 0x20, 0x20, 0x1c, 0x83, 0x1f, 0x23, 0xa2, 0x80, 0x00, + 0x00, 0xf0, 0x6a, 0xf8, 0x15, 0x7f, 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, + 0xa1, 0x84, 0x00, 0x03, 0x00, 0x40, 0x6b, 0x46, 0x20, 0xa1, 0x02, 0x0b, + 0x20, 0xe1, 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, 0x00, 0x7e, 0x78, 0x18, + 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, 0xd0, 0xbc, 0x00, 0x40, 0x6b, 0x26, + 0x0d, 0x7e, 0xa0, 0xe8, 0xa8, 0x35, 0x2d, 0x6c, 0x68, 0x10, 0xa0, 0x85, + 0x07, 0x00, 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, 0x20, 0x69, 0xa7, 0x1b, + 0x2d, 0xa6, 0x8d, 0x68, 0x2d, 0xa6, 0x0d, 0x7f, 0x00, 0x78, 0x6b, 0x35, + 0x0d, 0x7e, 0xa0, 0xe8, 0xa8, 0x35, 0x2d, 0x6c, 0x68, 0x10, 0xa0, 0x85, + 0x07, 0x00, 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, 0x0d, 0x7f, 0x20, 0xa3, + 0x00, 0x00, 0x62, 0x30, 0x22, 0xa2, 0x00, 0x7f, 0x7b, 0x24, 0xd3, 0xcc, + 0x00, 0x40, 0x6b, 0x3e, 0x20, 0xa3, 0x08, 0x89, 0x00, 0x78, 0x6b, 0x40, + 0x20, 0xa3, 0x08, 0x98, 0x20, 0xa2, 0x10, 0x78, 0x6d, 0xea, 0x22, 0xa2, + 0x20, 0xa3, 0x00, 0x00, 0x61, 0xc2, 0x03, 0x7f, 0x01, 0x7f, 0x10, 0x78, + 0x6d, 0xfb, 0x00, 0x7c, 0x20, 0x11, 0x00, 0x08, 0x78, 0x24, 0xd0, 0xcc, + 0x00, 0x40, 0x6b, 0x53, 0xc2, 0xe5, 0x22, 0xa2, 0xa0, 0x16, 0x00, 0x78, + 0x6b, 0x8a, 0x20, 0x11, 0x03, 0x02, 0x78, 0x24, 0xd0, 0xcc, 0x00, 0x40, + 0x6b, 0x5e, 0xc2, 0xe5, 0x22, 0xa2, 0xa0, 0x16, 0x22, 0xa2, 0x22, 0xa2, + 0x22, 0xa2, 0x20, 0xa3, 0x00, 0x12, 0x22, 0xa2, 0x20, 0xa3, 0x00, 0x08, + 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, 0x20, 0xa3, 0x70, 0x00, + 0x20, 0xa3, 0x05, 0x00, 0x22, 0xa2, 0x20, 0xa3, 0x00, 0x0a, 0x22, 0xa2, + 0x22, 0xa2, 0x20, 0xa3, 0x25, 0x00, 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, + 0x22, 0xa2, 0x22, 0xa2, 0x60, 0xc3, 0x00, 0x32, 0x10, 0x78, 0x6d, 0xfb, + 0x00, 0x7c, 0x20, 0x11, 0x00, 0x28, 0x78, 0x24, 0xd0, 0xcc, 0x00, 0x40, + 0x6b, 0x88, 0xc2, 0xe5, 0x22, 0xa2, 0xa0, 0x16, 0x22, 0xa2, 0x22, 0xa2, + 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, 0x60, 0xc3, 0x00, 0x18, + 0x10, 0x78, 0x6d, 0xfb, 0x00, 0x7c, 0x20, 0x11, 0x01, 0x00, 0x78, 0x24, + 0xd0, 0xcc, 0x00, 0x40, 0x6b, 0x9c, 0xc2, 0xe5, 0x22, 0xa2, 0xa0, 0x16, + 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, 0x20, 0xa3, + 0x00, 0x08, 0x22, 0xa2, 0x78, 0x34, 0xa0, 0x84, 0x00, 0xff, 0x20, 0xa2, + 0x22, 0xa2, 0x22, 0xa2, 0x60, 0xc3, 0x00, 0x20, 0x10, 0x78, 0x6d, 0xfb, + 0x00, 0x7c, 0x20, 0x11, 0x00, 0x08, 0x78, 0x24, 0xd0, 0xcc, 0x00, 0x40, + 0x6b, 0xb8, 0xc2, 0xe5, 0x22, 0xa2, 0xa0, 0x16, 0x00, 0x78, 0x6b, 0x8a, + 0x03, 0x7e, 0x7b, 0x10, 0xa3, 0x84, 0xff, 0x00, 0x78, 0x12, 0xa3, 0x84, + 0x00, 0xff, 0x80, 0x01, 0x00, 0xc0, 0x6b, 0xcf, 0x78, 0x24, 0xd0, 0xcc, + 0x00, 0x40, 0x6b, 0xcb, 0xc2, 0xe5, 0x22, 0xa2, 0x03, 0x7f, 0x00, 0x78, + 0x6b, 0x8a, 0x04, 0x7e, 0x20, 0x21, 0x08, 0x00, 0x00, 0x7e, 0x78, 0x24, + 0xd0, 0xcc, 0x00, 0x7f, 0x00, 0x40, 0x6b, 0xd9, 0xc4, 0xe5, 0x24, 0xa2, + 0x04, 0x7f, 0x22, 0xa2, 0x20, 0xa2, 0x03, 0x7f, 0x00, 0x78, 0x6b, 0x8c, + 0x02, 0x7e, 0x20, 0xe1, 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, 0x78, 0x18, + 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, 0xd0, 0xbc, 0x00, 0x40, 0x6b, 0xfe, + 0x0d, 0x7e, 0xa0, 0xe8, 0xa8, 0x35, 0x2d, 0x6c, 0x68, 0x10, 0xa0, 0x85, + 0x07, 0x00, 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, 0x20, 0x69, 0xa7, 0x1b, + 0x2d, 0xa6, 0x8d, 0x68, 0x2d, 0xa6, 0x0d, 0x7f, 0x00, 0x78, 0x6c, 0x0d, + 0x0d, 0x7e, 0xa0, 0xe8, 0xa8, 0x35, 0x2d, 0x6c, 0x68, 0x10, 0xa0, 0x85, + 0x07, 0x00, 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, 0x0d, 0x7f, 0x20, 0xa3, + 0x00, 0x00, 0x62, 0x30, 0x22, 0xa2, 0x78, 0x24, 0xd0, 0xcc, 0x00, 0x40, + 0x6c, 0x15, 0x20, 0xa3, 0x08, 0x89, 0x00, 0x78, 0x6c, 0x17, 0x20, 0xa3, + 0x08, 0x98, 0x20, 0xa3, 0x00, 0x00, 0x10, 0x78, 0x6d, 0xea, 0x22, 0xa2, + 0x20, 0xa3, 0x00, 0x00, 0x7a, 0x08, 0x22, 0xa2, 0x2f, 0xa2, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x02, 0x7f, 0x00, 0x7c, 0x0d, 0x7e, + 0x15, 0x7e, 0x13, 0x7e, 0x14, 0x7e, 0x01, 0x7e, 0x03, 0x7e, 0x78, 0x10, + 0xa0, 0x84, 0x07, 0x00, 0x80, 0x07, 0x10, 0x79, 0x6c, 0x3a, 0x03, 0x7f, + 0x01, 0x7f, 0x14, 0x7f, 0x13, 0x7f, 0x15, 0x7f, 0x0d, 0x7f, 0x00, 0x7c, + 0x6c, 0x42, 0x6c, 0x42, 0x6c, 0x44, 0x6c, 0x42, 0x6c, 0x42, 0x6c, 0x42, + 0x6c, 0x69, 0x6c, 0x42, 0x10, 0x78, 0x13, 0x32, 0x79, 0x10, 0xa1, 0x8c, + 0xf8, 0xff, 0xa1, 0x8d, 0x06, 0x00, 0x79, 0x12, 0x20, 0xa1, 0x02, 0x0b, + 0x20, 0x09, 0x00, 0x03, 0x10, 0x78, 0x6c, 0x73, 0x0d, 0x7e, 0x20, 0x69, + 0xa7, 0x52, 0x68, 0x04, 0xd0, 0xbc, 0x00, 0x40, 0x6c, 0x5e, 0x68, 0x2c, + 0xa0, 0x84, 0x00, 0xff, 0x80, 0x07, 0x20, 0xa2, 0x00, 0x78, 0x6c, 0x60, + 0x20, 0xa3, 0x3f, 0x00, 0x0d, 0x7f, 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, + 0x60, 0xc3, 0x00, 0x01, 0x10, 0x78, 0x6d, 0xfb, 0x00, 0x7c, 0x20, 0xa1, + 0x02, 0x0b, 0x20, 0x09, 0x00, 0x03, 0x10, 0x78, 0x6c, 0x73, 0x20, 0xa3, + 0x7f, 0x00, 0x00, 0x78, 0x6c, 0x61, 0x02, 0x7e, 0x20, 0xe1, 0x90, 0x80, + 0x20, 0xe1, 0x40, 0x00, 0x78, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, + 0xd0, 0xbc, 0x00, 0x40, 0x6c, 0x91, 0x0d, 0x7e, 0xa0, 0xe8, 0xa8, 0x35, + 0x2d, 0x6c, 0x68, 0x10, 0xa0, 0x85, 0x01, 0x00, 0x20, 0xa2, 0x68, 0x14, + 0x20, 0xa2, 0x20, 0x69, 0xa7, 0x1b, 0x2d, 0xa6, 0x8d, 0x68, 0x2d, 0xa6, + 0x0d, 0x7f, 0x00, 0x78, 0x6c, 0xa0, 0x0d, 0x7e, 0xa0, 0xe8, 0xa8, 0x35, + 0x2d, 0x6c, 0x68, 0x10, 0xa0, 0x85, 0x01, 0x00, 0x20, 0xa2, 0x68, 0x14, + 0x20, 0xa2, 0x0d, 0x7f, 0x20, 0xa3, 0x00, 0x00, 0x62, 0x30, 0x22, 0xa2, + 0x20, 0xa3, 0x08, 0x88, 0xa1, 0x8d, 0x00, 0x08, 0x21, 0xa2, 0x10, 0x78, + 0x6d, 0xea, 0x22, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x7a, 0x08, 0x22, 0xa2, + 0x2f, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x02, 0x7f, + 0x00, 0x7c, 0x0e, 0x7e, 0x0d, 0x7e, 0x0c, 0x7e, 0x05, 0x7e, 0x04, 0x7e, + 0x03, 0x7e, 0x20, 0x61, 0x01, 0x00, 0x20, 0x71, 0xa7, 0x00, 0x61, 0x30, + 0x78, 0x18, 0x20, 0x68, 0x68, 0xa0, 0x20, 0x28, 0xd0, 0xbc, 0x00, 0xc0, + 0x6c, 0xca, 0x69, 0x10, 0x6a, 0x14, 0x64, 0x30, 0x00, 0x78, 0x6c, 0xce, + 0x69, 0x10, 0x6a, 0x14, 0x73, 0x6c, 0x74, 0x70, 0x78, 0x1c, 0xa0, 0x86, + 0x00, 0x06, 0x00, 0x40, 0x6d, 0x2d, 0xd5, 0xbc, 0x00, 0x40, 0x6c, 0xde, + 0xa1, 0x85, 0x01, 0x00, 0x60, 0x62, 0x62, 0x66, 0x63, 0x6a, 0x64, 0x6e, + 0x00, 0x78, 0x6c, 0xe5, 0xa1, 0x85, 0x01, 0x00, 0x60, 0x62, 0x62, 0x66, + 0x60, 0x6b, 0x00, 0x00, 0x64, 0x6e, 0x60, 0x73, 0x08, 0x09, 0x60, 0x77, + 0x00, 0x08, 0x68, 0x8c, 0x80, 0x00, 0xa0, 0x84, 0x00, 0xff, 0x68, 0x8e, + 0x80, 0x07, 0x60, 0x7a, 0x60, 0x7f, 0x00, 0x00, 0x2f, 0x00, 0x60, 0x82, + 0x78, 0x08, 0x60, 0x86, 0x78, 0x10, 0x20, 0x70, 0x70, 0x14, 0x60, 0x8a, + 0x70, 0x10, 0x60, 0x8e, 0x70, 0x0c, 0x60, 0xc6, 0x70, 0x08, 0x60, 0xca, + 0x68, 0x6c, 0x60, 0xce, 0x60, 0xab, 0x00, 0x36, 0x60, 0xaf, 0x95, 0xd5, + 0x60, 0xd7, 0x00, 0x00, 0xa5, 0x82, 0x00, 0x80, 0x00, 0x48, 0x6d, 0x17, + 0x6a, 0x00, 0xd2, 0xf4, 0x00, 0x40, 0x6d, 0x15, 0x6a, 0x14, 0xa2, 0x94, + 0x00, 0xff, 0x00, 0x78, 0x6d, 0x17, 0x20, 0x11, 0x00, 0x00, 0x62, 0x9e, + 0x60, 0x17, 0x00, 0x16, 0x20, 0x09, 0x07, 0xd0, 0x60, 0xc4, 0xa0, 0x84, + 0xff, 0xf0, 0xa0, 0x05, 0x00, 0x40, 0x6d, 0x24, 0x20, 0x09, 0x1b, 0x58, + 0x10, 0x78, 0x5a, 0xd0, 0x03, 0x7f, 0x04, 0x7f, 0x05, 0x7f, 0x0c, 0x7f, + 0x0d, 0x7f, 0x0e, 0x7f, 0x00, 0x7c, 0x78, 0x10, 0x20, 0x70, 0x70, 0x4c, + 0xa0, 0x84, 0x00, 0x03, 0xa0, 0x86, 0x00, 0x02, 0x00, 0x40, 0x6d, 0x85, + 0xd5, 0xbc, 0x00, 0x40, 0x6d, 0x41, 0xa1, 0x85, 0x01, 0x00, 0x60, 0x62, + 0x62, 0x66, 0x63, 0x6a, 0x64, 0x6e, 0x00, 0x78, 0x6d, 0x48, 0xa1, 0x85, + 0x01, 0x00, 0x60, 0x62, 0x62, 0x66, 0x60, 0x6b, 0x00, 0x00, 0x64, 0x6e, + 0x60, 0x73, 0x08, 0x80, 0x60, 0x77, 0x00, 0x08, 0x68, 0x8c, 0x80, 0x00, + 0xa0, 0x84, 0x00, 0xff, 0x68, 0x8e, 0x80, 0x07, 0x60, 0x7a, 0x60, 0x7f, + 0x00, 0x00, 0x2f, 0x00, 0x60, 0x86, 0x78, 0x08, 0x60, 0x82, 0x70, 0x60, + 0x60, 0x8a, 0x70, 0x5c, 0x60, 0x8e, 0x70, 0x80, 0x60, 0xc6, 0x70, 0x7c, + 0x60, 0xca, 0x70, 0x7c, 0x79, 0x2c, 0xa1, 0x08, 0x79, 0x2e, 0x70, 0x80, + 0x79, 0x28, 0xa1, 0x09, 0x79, 0x2a, 0x68, 0x6c, 0x60, 0xce, 0x60, 0xab, + 0x00, 0x36, 0x60, 0xaf, 0x95, 0xd5, 0x60, 0xd7, 0x00, 0x00, 0xa5, 0x82, + 0x00, 0x80, 0x00, 0x48, 0x6d, 0x80, 0x6a, 0x00, 0xd2, 0xf4, 0x00, 0x40, + 0x6d, 0x7e, 0x6a, 0x14, 0xa2, 0x94, 0x00, 0xff, 0x00, 0x78, 0x6d, 0x80, + 0x20, 0x11, 0x00, 0x00, 0x62, 0x9e, 0x60, 0x17, 0x00, 0x12, 0x00, 0x78, + 0x6d, 0x1a, 0xd5, 0xbc, 0x00, 0x40, 0x6d, 0x90, 0xa1, 0x85, 0x07, 0x00, + 0x60, 0x62, 0x62, 0x66, 0x63, 0x6a, 0x64, 0x6e, 0x00, 0x78, 0x6d, 0x97, + 0xa1, 0x85, 0x07, 0x00, 0x60, 0x62, 0x62, 0x66, 0x60, 0x6b, 0x00, 0x00, + 0x64, 0x6e, 0x10, 0x78, 0x49, 0x5f, 0x00, 0x40, 0x6d, 0xad, 0x0d, 0x7e, + 0x78, 0x10, 0xa0, 0x6d, 0x68, 0x4c, 0x0d, 0x7f, 0xa0, 0x84, 0x20, 0x20, + 0xa0, 0x86, 0x20, 0x20, 0x00, 0xc0, 0x6d, 0xad, 0x78, 0x24, 0xc0, 0xcd, + 0x78, 0x26, 0x60, 0x73, 0x08, 0x89, 0x00, 0x78, 0x6d, 0xaf, 0x60, 0x73, + 0x08, 0x98, 0x60, 0x77, 0x00, 0x00, 0x68, 0x8c, 0x80, 0x00, 0xa0, 0x84, + 0x00, 0xff, 0x68, 0x8e, 0x80, 0x07, 0x60, 0x7a, 0x60, 0x7f, 0x00, 0x00, + 0x2f, 0x00, 0x60, 0x86, 0x78, 0x08, 0x60, 0x82, 0x70, 0x14, 0x60, 0x8a, + 0x70, 0x10, 0x60, 0x8e, 0x70, 0x0c, 0x60, 0xc6, 0x70, 0x08, 0x60, 0xca, + 0x68, 0x6c, 0x60, 0xce, 0x60, 0xab, 0x00, 0x36, 0x60, 0xaf, 0x95, 0xd5, + 0x60, 0xd7, 0x00, 0x00, 0xa5, 0x82, 0x00, 0x80, 0x00, 0x48, 0x6d, 0xdd, + 0x6a, 0x00, 0xd2, 0xf4, 0x00, 0x40, 0x6d, 0xdb, 0x6a, 0x14, 0xa2, 0x94, + 0x00, 0xff, 0x00, 0x78, 0x6d, 0xdd, 0x20, 0x11, 0x00, 0x00, 0x62, 0x9e, + 0x78, 0x24, 0xd0, 0xcc, 0x00, 0x40, 0x6d, 0xe6, 0x60, 0x17, 0x00, 0x16, + 0x00, 0x78, 0x6d, 0x1a, 0x60, 0x17, 0x00, 0x12, 0x00, 0x78, 0x6d, 0x1a, + 0x7a, 0x18, 0xa2, 0x80, 0x00, 0x23, 0x20, 0x14, 0x82, 0x10, 0xa2, 0x94, + 0x00, 0xff, 0x22, 0x02, 0x82, 0x17, 0x00, 0x7c, 0x0d, 0x7e, 0x20, 0x69, + 0xa9, 0xb1, 0x68, 0x43, 0x00, 0x01, 0x0d, 0x7f, 0x00, 0x7c, 0x20, 0xe1, + 0x90, 0x80, 0x60, 0xa3, 0x00, 0x56, 0x60, 0xa7, 0x95, 0x75, 0x10, 0x78, + 0x6e, 0x06, 0x10, 0x78, 0x5a, 0xc0, 0x00, 0x7c, 0x00, 0x7e, 0x60, 0x14, + 0xa0, 0x84, 0x00, 0x04, 0xa0, 0x85, 0x00, 0x09, 0x60, 0x16, 0x00, 0x7f, + 0x00, 0x7c, 0x00, 0x7e, 0x0c, 0x7e, 0x20, 0x61, 0x01, 0x00, 0x60, 0x14, + 0xa0, 0x84, 0x00, 0x04, 0xa0, 0x85, 0x00, 0x08, 0x60, 0x16, 0x0c, 0x7f, + 0x00, 0x7f, 0x00, 0x7c, 0x0c, 0x7e, 0x0d, 0x7e, 0x01, 0x7e, 0x02, 0x7e, + 0x20, 0x61, 0x01, 0x00, 0x20, 0x69, 0x01, 0x40, 0x69, 0x04, 0xa1, 0x94, + 0x40, 0x00, 0x00, 0x40, 0x6e, 0x59, 0x10, 0x78, 0x6e, 0x0f, 0x68, 0x03, + 0x10, 0x00, 0x68, 0x03, 0x00, 0x00, 0x0c, 0x7e, 0x20, 0x61, 0xa9, 0xb1, + 0x61, 0x28, 0xa1, 0x92, 0x00, 0xc8, 0x00, 0xc8, 0x6e, 0x44, 0x81, 0x08, + 0x61, 0x2a, 0x61, 0x24, 0x0c, 0x7f, 0x81, 0xff, 0x00, 0x40, 0x6e, 0x54, + 0x10, 0x78, 0x5a, 0xc0, 0x10, 0x78, 0x6e, 0x06, 0x00, 0x78, 0x6e, 0x54, + 0x61, 0x24, 0xa1, 0xe5, 0x00, 0x00, 0x00, 0x40, 0x6e, 0x51, 0x10, 0x78, + 0xa5, 0xd4, 0x10, 0x78, 0x5a, 0xcb, 0x20, 0x09, 0x00, 0x14, 0x10, 0x78, + 0x77, 0x5c, 0x0c, 0x7f, 0x00, 0x78, 0x6e, 0x54, 0x02, 0x7f, 0x01, 0x7f, + 0x0d, 0x7f, 0x0c, 0x7f, 0x00, 0x7c, 0x20, 0x01, 0xa9, 0xcd, 0x20, 0x04, + 0xa0, 0x05, 0x00, 0xc0, 0x6e, 0x54, 0x0c, 0x7e, 0x20, 0x61, 0xa9, 0xb1, + 0x61, 0x28, 0xa1, 0x92, 0x00, 0x03, 0x00, 0xc8, 0x6e, 0x44, 0x81, 0x08, + 0x61, 0x2a, 0x0c, 0x7f, 0x10, 0x78, 0x5a, 0xc0, 0x10, 0x78, 0x42, 0x24, + 0x00, 0x78, 0x6e, 0x54, 0x0c, 0x7e, 0x0d, 0x7e, 0x0e, 0x7e, 0x01, 0x7e, + 0x02, 0x7e, 0x10, 0x78, 0x5a, 0xd8, 0x20, 0x71, 0xa9, 0xb1, 0x71, 0x3c, + 0x81, 0xff, 0x00, 0x40, 0x6e, 0x9a, 0x20, 0x61, 0x01, 0x00, 0x20, 0x69, + 0x01, 0x40, 0x69, 0x04, 0xa1, 0x94, 0x40, 0x00, 0x00, 0x40, 0x6e, 0xa0, + 0x68, 0x03, 0x10, 0x00, 0x68, 0x03, 0x00, 0x00, 0x03, 0x7e, 0x20, 0x19, + 0x00, 0x01, 0x10, 0x78, 0x70, 0x58, 0x03, 0x7f, 0x71, 0x3c, 0x21, 0x60, + 0x10, 0x78, 0xa5, 0xd4, 0x20, 0x09, 0x00, 0x4a, 0x10, 0x78, 0x77, 0x5c, + 0x00, 0x78, 0x6e, 0x9a, 0x02, 0x7f, 0x01, 0x7f, 0x0e, 0x7f, 0x0d, 0x7f, + 0x0c, 0x7f, 0x00, 0x7c, 0x00, 0x78, 0x6e, 0x8a, 0x0e, 0x7e, 0x20, 0x71, + 0xa9, 0xb1, 0x70, 0x48, 0xd0, 0x84, 0x00, 0x40, 0x6e, 0xbc, 0x71, 0x3c, + 0x81, 0xff, 0x00, 0x40, 0x6e, 0xbc, 0x20, 0x71, 0x01, 0x00, 0xa1, 0x88, + 0x00, 0x07, 0x21, 0x0c, 0xa1, 0x8e, 0x00, 0x06, 0x00, 0xc0, 0x6e, 0xba, + 0x70, 0x17, 0x00, 0x12, 0x00, 0x78, 0x6e, 0xbc, 0x70, 0x17, 0x00, 0x16, + 0x0e, 0x7f, 0x00, 0x7c, 0x0e, 0x7e, 0x0d, 0x7e, 0x0c, 0x7e, 0x06, 0x7e, + 0x05, 0x7e, 0x04, 0x7e, 0x00, 0x7e, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, + 0x60, 0x18, 0x20, 0x68, 0x6c, 0xa0, 0x20, 0x71, 0xa9, 0xb1, 0x70, 0x18, + 0x20, 0x68, 0x8d, 0xff, 0x00, 0x40, 0x6e, 0xe6, 0x68, 0xa0, 0xa4, 0x06, + 0x00, 0x40, 0x6e, 0xda, 0x68, 0x54, 0x20, 0x68, 0x00, 0x78, 0x6e, 0xcf, + 0x60, 0x10, 0x20, 0x60, 0x64, 0x3c, 0x65, 0x40, 0x66, 0x48, 0x2d, 0x60, + 0x10, 0x78, 0x47, 0x36, 0x00, 0x40, 0x6e, 0xe6, 0xa0, 0x85, 0x00, 0x01, + 0x12, 0x7f, 0x00, 0x7f, 0x04, 0x7f, 0x05, 0x7f, 0x06, 0x7f, 0x0c, 0x7f, + 0x0d, 0x7f, 0x0e, 0x7f, 0x00, 0x7c, 0x20, 0xa1, 0x02, 0x0b, 0x10, 0x78, + 0x67, 0x31, 0x20, 0xa3, 0x12, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x78, 0x1c, 0xa0, 0x86, 0x00, 0x04, 0x00, 0xc0, 0x6f, 0x01, + 0x60, 0x98, 0x00, 0x78, 0x6f, 0x02, 0x60, 0x30, 0x20, 0xa2, 0x78, 0x34, + 0x20, 0xa2, 0x78, 0x38, 0x20, 0xa2, 0x20, 0xa9, 0x00, 0x10, 0xa0, 0x06, + 0x20, 0xa2, 0x00, 0xf0, 0x6f, 0x0a, 0x20, 0xa2, 0x20, 0xa2, 0x60, 0xc3, + 0x00, 0x2c, 0x10, 0x78, 0x6d, 0xfb, 0x00, 0x7c, 0x15, 0x7e, 0x14, 0x7e, + 0x20, 0xa1, 0x02, 0x0b, 0x10, 0x78, 0x67, 0x31, 0x20, 0xa3, 0x0f, 0x00, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x78, 0x08, 0x20, 0xa2, + 0x60, 0xc3, 0x00, 0x08, 0x10, 0x78, 0x6d, 0xfb, 0x14, 0x7f, 0x15, 0x7f, + 0x00, 0x7c, 0x15, 0x7e, 0x14, 0x7e, 0x20, 0xa1, 0x02, 0x0b, 0x10, 0x78, + 0x67, 0xc2, 0x20, 0xa3, 0x02, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa9, + 0x00, 0x06, 0x20, 0x11, 0xa7, 0x40, 0x20, 0x19, 0xa7, 0x41, 0x23, 0xa6, + 0x22, 0xa6, 0xa3, 0x98, 0x00, 0x02, 0xa2, 0x90, 0x00, 0x02, 0x00, 0xf0, + 0x6f, 0x39, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, + 0x00, 0x1c, 0x10, 0x78, 0x6d, 0xfb, 0x14, 0x7f, 0x15, 0x7f, 0x00, 0x7c, + 0x15, 0x7e, 0x14, 0x7e, 0x01, 0x7e, 0x02, 0x7e, 0x20, 0xa1, 0x02, 0x0b, + 0x10, 0x78, 0x67, 0x99, 0x10, 0x78, 0x67, 0xb0, 0x78, 0x10, 0xa0, 0x80, + 0x00, 0x00, 0x20, 0x04, 0xa0, 0x80, 0x00, 0x15, 0x20, 0x98, 0x78, 0x08, + 0xa0, 0x88, 0x00, 0x02, 0x21, 0xa8, 0x53, 0xa6, 0xa0, 0x80, 0x00, 0x04, + 0x80, 0x03, 0x60, 0xc2, 0x10, 0x78, 0x6d, 0xfb, 0x02, 0x7f, 0x01, 0x7f, + 0x14, 0x7f, 0x15, 0x7f, 0x00, 0x7c, 0x15, 0x7e, 0x14, 0x7e, 0x20, 0xa1, + 0x02, 0x0b, 0x10, 0x78, 0x67, 0x31, 0x20, 0xa3, 0x62, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x78, 0x08, 0x20, 0xa2, 0x60, 0xc3, + 0x00, 0x08, 0x10, 0x78, 0x6d, 0xfb, 0x14, 0x7f, 0x15, 0x7f, 0x00, 0x7c, + 0x15, 0x7e, 0x14, 0x7e, 0x01, 0x7e, 0x02, 0x7e, 0x20, 0xa1, 0x02, 0x0b, + 0x10, 0x78, 0x67, 0x31, 0x78, 0x10, 0xa0, 0x80, 0x00, 0x00, 0x20, 0x04, + 0xa0, 0x80, 0x00, 0x17, 0x20, 0x98, 0x78, 0x08, 0xa0, 0x88, 0x00, 0x02, + 0x21, 0xa8, 0x53, 0xa6, 0x80, 0x03, 0x60, 0xc2, 0x10, 0x78, 0x6d, 0xfb, + 0x02, 0x7f, 0x01, 0x7f, 0x14, 0x7f, 0x15, 0x7f, 0x00, 0x7c, 0x0e, 0x7e, + 0x0c, 0x7e, 0x00, 0x7e, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, + 0xa9, 0xb1, 0x70, 0x0c, 0x20, 0x60, 0x8c, 0xff, 0x00, 0x40, 0x6f, 0xbb, + 0x10, 0x78, 0x8f, 0x10, 0x00, 0xc0, 0x6f, 0xb2, 0x10, 0x78, 0x7c, 0x83, + 0x60, 0x0c, 0x00, 0x7e, 0x10, 0x78, 0x77, 0x2d, 0x10, 0x78, 0x72, 0x33, + 0x0c, 0x7f, 0x00, 0x78, 0x6f, 0xa9, 0x70, 0x0f, 0x00, 0x00, 0x70, 0x0b, + 0x00, 0x00, 0x12, 0x7f, 0x00, 0x7f, 0x0c, 0x7f, 0x0e, 0x7f, 0x00, 0x7c, + 0x12, 0x7e, 0x15, 0x7e, 0x0f, 0x7e, 0x0e, 0x7e, 0x0d, 0x7e, 0x0c, 0x7e, + 0x02, 0x7e, 0x01, 0x7e, 0x00, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x20, 0x69, + 0x01, 0x00, 0x20, 0x79, 0x01, 0x40, 0x20, 0x71, 0xa9, 0xb1, 0x70, 0x24, + 0x20, 0x60, 0x8c, 0xff, 0x00, 0x40, 0x70, 0x14, 0x10, 0x78, 0x6e, 0x0f, + 0x68, 0xc3, 0x00, 0x00, 0x10, 0x78, 0x5a, 0xcb, 0x20, 0x09, 0x00, 0x13, + 0x10, 0x78, 0x77, 0x5c, 0x20, 0xa9, 0x01, 0xf4, 0x68, 0x24, 0xd0, 0x94, + 0x00, 0x40, 0x6f, 0xf7, 0x68, 0x27, 0x00, 0x04, 0x78, 0x04, 0xa0, 0x84, + 0x40, 0x00, 0x00, 0x40, 0x70, 0x09, 0x78, 0x03, 0x10, 0x00, 0x78, 0x03, + 0x00, 0x00, 0x00, 0x78, 0x70, 0x09, 0xd0, 0x84, 0x00, 0x40, 0x6f, 0xfe, + 0x68, 0x27, 0x00, 0x01, 0x00, 0x78, 0x70, 0x00, 0x00, 0xf0, 0x6f, 0xe6, + 0x78, 0x04, 0xa0, 0x84, 0x10, 0x00, 0x00, 0x40, 0x70, 0x09, 0x78, 0x03, + 0x01, 0x00, 0x78, 0x03, 0x00, 0x00, 0x68, 0x24, 0x00, 0x7f, 0x01, 0x7f, + 0x02, 0x7f, 0x0c, 0x7f, 0x0d, 0x7f, 0x0e, 0x7f, 0x0f, 0x7f, 0x15, 0x7f, + 0x12, 0x7f, 0x00, 0x7c, 0x20, 0x01, 0xa7, 0x00, 0x20, 0x04, 0xa0, 0x96, + 0x00, 0x01, 0x00, 0x40, 0x70, 0x4e, 0xa0, 0x96, 0x00, 0x04, 0x00, 0x40, + 0x70, 0x4e, 0x10, 0x78, 0x5a, 0xcb, 0x68, 0x17, 0x00, 0x08, 0x68, 0xc3, + 0x00, 0x00, 0x20, 0x11, 0x41, 0xdc, 0x10, 0x78, 0x5a, 0x45, 0x20, 0xa9, + 0x01, 0xf4, 0x68, 0x24, 0xd0, 0x94, 0x00, 0x40, 0x70, 0x3c, 0x68, 0x27, + 0x00, 0x04, 0x78, 0x04, 0xa0, 0x84, 0x40, 0x00, 0x00, 0x40, 0x70, 0x4e, + 0x78, 0x03, 0x10, 0x00, 0x78, 0x03, 0x00, 0x00, 0x00, 0x78, 0x70, 0x4e, + 0xd0, 0x84, 0x00, 0x40, 0x70, 0x43, 0x68, 0x27, 0x00, 0x01, 0x00, 0x78, + 0x70, 0x45, 0x00, 0xf0, 0x70, 0x2b, 0x78, 0x04, 0xa0, 0x84, 0x10, 0x00, + 0x00, 0x40, 0x70, 0x4e, 0x78, 0x03, 0x01, 0x00, 0x78, 0x03, 0x00, 0x00, + 0x00, 0x7f, 0x01, 0x7f, 0x02, 0x7f, 0x0c, 0x7f, 0x0d, 0x7f, 0x0e, 0x7f, + 0x0f, 0x7f, 0x15, 0x7f, 0x12, 0x7f, 0x00, 0x7c, 0x12, 0x7e, 0x15, 0x7e, + 0x0f, 0x7e, 0x0e, 0x7e, 0x0d, 0x7e, 0x0c, 0x7e, 0x02, 0x7e, 0x01, 0x7e, + 0x00, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x20, 0x69, 0x01, 0x00, 0x20, 0x79, + 0x01, 0x40, 0x20, 0x71, 0xa9, 0xb1, 0x70, 0x3c, 0x20, 0x60, 0x8c, 0xff, + 0x00, 0x40, 0x70, 0xd6, 0x68, 0xaf, 0x95, 0xf5, 0x68, 0x17, 0x00, 0x10, + 0x20, 0x09, 0x00, 0xfa, 0x81, 0x09, 0x00, 0xc0, 0x70, 0x74, 0x68, 0xc7, + 0x00, 0x00, 0x68, 0xcb, 0x00, 0x08, 0x10, 0x78, 0x5a, 0xd8, 0x10, 0x78, + 0x1f, 0x7e, 0x04, 0x7e, 0x05, 0x7e, 0x20, 0x09, 0x01, 0x7f, 0x21, 0x2c, + 0x20, 0x0b, 0x00, 0xa5, 0x20, 0x21, 0x01, 0x69, 0x24, 0x04, 0xa0, 0x84, + 0x00, 0x0f, 0xa0, 0x86, 0x00, 0x04, 0x00, 0xc0, 0x70, 0xa5, 0x68, 0xc7, + 0x00, 0x00, 0x68, 0xcb, 0x00, 0x08, 0x0e, 0x7e, 0x0f, 0x7e, 0x20, 0x79, + 0x00, 0x20, 0x20, 0x71, 0xaa, 0x08, 0x68, 0x14, 0xa0, 0x84, 0x00, 0x04, + 0xa0, 0x85, 0x00, 0x12, 0x68, 0x16, 0x78, 0x03, 0x00, 0x08, 0x70, 0x03, + 0x00, 0x00, 0x0f, 0x7f, 0x0e, 0x7f, 0x25, 0x0a, 0x05, 0x7f, 0x04, 0x7f, + 0xa3, 0x9d, 0x00, 0x00, 0x00, 0xc0, 0x70, 0xb0, 0x20, 0x09, 0x00, 0x49, + 0x10, 0x78, 0x77, 0x5c, 0x20, 0xa9, 0x03, 0xe8, 0x68, 0x24, 0xd0, 0x94, + 0x00, 0x40, 0x70, 0xc3, 0x68, 0x27, 0x00, 0x04, 0x78, 0x04, 0xa0, 0x84, + 0x40, 0x00, 0x00, 0x40, 0x70, 0xd5, 0x78, 0x03, 0x10, 0x00, 0x78, 0x03, + 0x00, 0x00, 0x00, 0x78, 0x70, 0xd5, 0xd0, 0x8c, 0x00, 0x40, 0x70, 0xca, + 0x68, 0x27, 0x00, 0x02, 0x00, 0x78, 0x70, 0xcc, 0x00, 0xf0, 0x70, 0xb2, + 0x78, 0x04, 0xa0, 0x84, 0x10, 0x00, 0x00, 0x40, 0x70, 0xd5, 0x78, 0x03, + 0x01, 0x00, 0x78, 0x03, 0x00, 0x00, 0x68, 0x24, 0x00, 0x7f, 0x01, 0x7f, + 0x02, 0x7f, 0x0c, 0x7f, 0x0d, 0x7f, 0x0e, 0x7f, 0x0f, 0x7f, 0x15, 0x7f, + 0x12, 0x7f, 0x00, 0x7c, 0x0d, 0x7e, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x69, 0xa9, 0xb1, 0x6a, 0x06, 0x12, 0x7f, 0x0d, 0x7f, 0x00, 0x7c, + 0x0d, 0x7e, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x20, 0x69, 0xa9, 0xb1, + 0x6a, 0x32, 0x12, 0x7f, 0x0d, 0x7f, 0x00, 0x7c, 0x0f, 0x7e, 0x0e, 0x7e, + 0x0c, 0x7e, 0x06, 0x7e, 0x00, 0x7e, 0x12, 0x7e, 0x20, 0x71, 0xa9, 0xb1, + 0x76, 0x14, 0x26, 0x60, 0x26, 0x78, 0x20, 0x91, 0x80, 0x00, 0x8c, 0xff, + 0x00, 0x40, 0x71, 0x34, 0x60, 0x1c, 0xa2, 0x06, 0x00, 0xc0, 0x71, 0x2f, + 0x70, 0x14, 0xac, 0x36, 0x00, 0xc0, 0x71, 0x0e, 0x66, 0x0c, 0x76, 0x16, + 0x70, 0x10, 0xac, 0x36, 0x00, 0xc0, 0x71, 0x1c, 0x2c, 0x00, 0xaf, 0x36, + 0x00, 0x40, 0x71, 0x1a, 0x2f, 0x00, 0x70, 0x12, 0x00, 0x78, 0x71, 0x1c, + 0x70, 0x13, 0x00, 0x00, 0x66, 0x0c, 0x06, 0x7e, 0x2c, 0x00, 0xaf, 0x06, + 0x00, 0x40, 0x71, 0x25, 0x7e, 0x0e, 0x00, 0x78, 0x71, 0x26, 0x26, 0x78, + 0x60, 0x0f, 0x00, 0x00, 0x10, 0x78, 0x8e, 0xd6, 0x10, 0x78, 0x72, 0x33, + 0x0c, 0x7f, 0x00, 0x78, 0x71, 0x01, 0x2c, 0x78, 0x60, 0x0c, 0x20, 0x60, + 0x00, 0x78, 0x71, 0x01, 0x12, 0x7f, 0x00, 0x7f, 0x06, 0x7f, 0x0c, 0x7f, + 0x0e, 0x7f, 0x0f, 0x7f, 0x00, 0x7c, 0x15, 0x7e, 0x14, 0x7e, 0x20, 0xa1, + 0x02, 0x0b, 0x10, 0x78, 0x69, 0xd0, 0x78, 0x10, 0x20, 0xa2, 0xa0, 0x06, + 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa3, 0x10, 0x00, + 0x00, 0x78, 0x71, 0x8e, 0x15, 0x7e, 0x14, 0x7e, 0x20, 0xa1, 0x02, 0x0b, + 0x10, 0x78, 0x69, 0xd0, 0x78, 0x10, 0x20, 0xa2, 0xa0, 0x06, 0x20, 0xa2, + 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa3, 0x40, 0x00, 0x00, 0x78, + 0x71, 0x8e, 0x15, 0x7e, 0x14, 0x7e, 0x20, 0xa1, 0x02, 0x0b, 0x10, 0x78, + 0x69, 0xd0, 0x78, 0x10, 0x20, 0xa2, 0xa0, 0x06, 0x20, 0xa2, 0x20, 0xa2, + 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa3, 0x20, 0x00, 0x00, 0x78, 0x71, 0x8e, + 0x15, 0x7e, 0x14, 0x7e, 0x20, 0xa1, 0x02, 0x0b, 0x10, 0x78, 0x69, 0xd0, + 0x78, 0x10, 0x20, 0xa2, 0xa0, 0x06, 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa2, + 0x20, 0xa2, 0x20, 0xa3, 0x04, 0x00, 0x00, 0x78, 0x71, 0x8e, 0x15, 0x7e, + 0x14, 0x7e, 0x20, 0xa1, 0x02, 0x0b, 0x10, 0x78, 0x69, 0xd0, 0x78, 0x10, + 0x20, 0xa2, 0xa0, 0x06, 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa2, + 0x20, 0xa3, 0x02, 0x00, 0x10, 0x78, 0x72, 0x3e, 0x60, 0xc3, 0x00, 0x20, + 0x10, 0x78, 0x6d, 0xfb, 0x14, 0x7f, 0x15, 0x7f, 0x00, 0x7c, 0x12, 0x7e, + 0x0c, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x20, 0x61, 0x01, 0x00, 0x61, 0x20, + 0xd1, 0xb4, 0x00, 0xc0, 0x71, 0xa6, 0xd1, 0xbc, 0x00, 0xc0, 0x71, 0xf0, + 0x00, 0x78, 0x72, 0x30, 0x20, 0x09, 0x01, 0x7f, 0x20, 0x0b, 0x00, 0xa1, + 0x15, 0x7e, 0x00, 0x7e, 0x0d, 0x7e, 0x20, 0x69, 0x01, 0x40, 0x20, 0xa9, + 0x00, 0x1e, 0x20, 0x09, 0x01, 0x69, 0x68, 0x04, 0xa0, 0x84, 0x40, 0x00, + 0x00, 0x40, 0x71, 0xe7, 0x60, 0x20, 0xd0, 0xb4, 0x00, 0x40, 0x71, 0xe7, + 0x60, 0x24, 0xd0, 0x94, 0x00, 0xc0, 0x71, 0xe7, 0x21, 0x04, 0xa0, 0x84, + 0x00, 0x0f, 0xa0, 0x86, 0x00, 0x04, 0x00, 0xc0, 0x71, 0xe7, 0x00, 0xf0, + 0x71, 0xb3, 0x02, 0x7e, 0x61, 0x98, 0xa1, 0x8c, 0x00, 0xff, 0x81, 0x07, + 0x61, 0x30, 0xa1, 0x8c, 0x00, 0xff, 0xa1, 0x0d, 0x60, 0x88, 0x62, 0x8c, + 0x61, 0x8e, 0x60, 0x8b, 0xbc, 0x91, 0x60, 0x43, 0x00, 0x01, 0x60, 0x43, + 0x00, 0x00, 0x60, 0x8a, 0x62, 0x8e, 0x60, 0x24, 0xd0, 0x94, 0x00, 0xc0, + 0x71, 0xe6, 0x6a, 0x04, 0xa2, 0x94, 0x40, 0x00, 0x00, 0xc0, 0x71, 0xdd, + 0x02, 0x7f, 0x0d, 0x7f, 0x00, 0x7f, 0x15, 0x7f, 0x20, 0x09, 0x01, 0x7f, + 0x20, 0x0b, 0x00, 0x00, 0x00, 0x78, 0x72, 0x30, 0x20, 0x09, 0x01, 0x7f, + 0x20, 0x0b, 0x00, 0xa1, 0x15, 0x7e, 0x00, 0x7e, 0x0d, 0x7e, 0x20, 0x69, + 0x01, 0x40, 0x20, 0xa9, 0x00, 0x1e, 0x20, 0x09, 0x01, 0x69, 0x68, 0x04, + 0xa0, 0x84, 0x40, 0x00, 0x00, 0x40, 0x72, 0x29, 0x60, 0x20, 0xd0, 0xbc, + 0x00, 0x40, 0x72, 0x29, 0x21, 0x04, 0xa0, 0x84, 0x00, 0x0f, 0xa0, 0x86, + 0x00, 0x04, 0x00, 0xc0, 0x72, 0x29, 0x00, 0xf0, 0x71, 0xfd, 0x02, 0x7e, + 0x61, 0x64, 0xa1, 0x8c, 0x00, 0xff, 0x81, 0x07, 0x61, 0x30, 0xa1, 0x8c, + 0x00, 0xff, 0xa1, 0x0d, 0x60, 0x88, 0x62, 0x8c, 0x60, 0x8b, 0xbc, 0x91, + 0x61, 0x8e, 0x60, 0x43, 0x00, 0x01, 0x60, 0x43, 0x00, 0x00, 0x60, 0x8a, + 0x62, 0x8e, 0x6a, 0x04, 0xa2, 0x94, 0x40, 0x00, 0x00, 0xc0, 0x72, 0x23, + 0x02, 0x7f, 0x0d, 0x7f, 0x00, 0x7f, 0x15, 0x7f, 0x20, 0x09, 0x01, 0x7f, + 0x20, 0x0b, 0x00, 0x00, 0x0c, 0x7f, 0x12, 0x7f, 0x00, 0x7c, 0x0e, 0x7e, + 0x20, 0x71, 0xa9, 0xb1, 0x70, 0x20, 0xa0, 0x05, 0x00, 0x40, 0x72, 0x3c, + 0x80, 0x01, 0x70, 0x22, 0x0e, 0x7f, 0x00, 0x7c, 0x20, 0xa9, 0x00, 0x08, + 0x20, 0xa2, 0x00, 0xf0, 0x72, 0x40, 0x20, 0xa2, 0x20, 0xa2, 0x00, 0x7c, + 0x0f, 0x7e, 0x0e, 0x7e, 0x0d, 0x7e, 0x0c, 0x7e, 0x07, 0x7e, 0x06, 0x7e, + 0x00, 0x7e, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0xa9, 0xb1, + 0x76, 0x14, 0x26, 0x60, 0x26, 0x78, 0x20, 0x39, 0x00, 0x01, 0x87, 0xff, + 0x00, 0x40, 0x72, 0xe2, 0x8c, 0xff, 0x00, 0x40, 0x72, 0xe2, 0x60, 0x1c, + 0xa0, 0x86, 0x00, 0x06, 0x00, 0xc0, 0x72, 0xdd, 0x88, 0xff, 0x00, 0x40, + 0x72, 0x6d, 0x28, 0x00, 0xac, 0x06, 0x00, 0xc0, 0x72, 0xdd, 0x20, 0x39, + 0x00, 0x00, 0x00, 0x78, 0x72, 0x78, 0x60, 0x18, 0xa2, 0x06, 0x00, 0xc0, + 0x72, 0xdd, 0x85, 0xff, 0x00, 0x40, 0x72, 0x78, 0x60, 0x20, 0xa1, 0x06, + 0x00, 0xc0, 0x72, 0xdd, 0x70, 0x24, 0xac, 0x06, 0x00, 0xc0, 0x72, 0xa8, + 0x20, 0x69, 0x01, 0x00, 0x68, 0xc0, 0xa0, 0x05, 0x00, 0x40, 0x72, 0xa3, + 0x10, 0x78, 0x5a, 0xcb, 0x68, 0x17, 0x00, 0x08, 0x68, 0xc3, 0x00, 0x00, + 0x10, 0x78, 0x73, 0x78, 0x70, 0x27, 0x00, 0x00, 0x03, 0x7e, 0x20, 0x69, + 0x01, 0x40, 0x6b, 0x04, 0xa3, 0x84, 0x10, 0x00, 0x00, 0x40, 0x72, 0x98, + 0x68, 0x03, 0x01, 0x00, 0x68, 0x03, 0x00, 0x00, 0x20, 0x69, 0x01, 0x00, + 0x68, 0x24, 0xd0, 0x84, 0x00, 0x40, 0x72, 0xa0, 0x68, 0x27, 0x00, 0x01, + 0x03, 0x7f, 0x00, 0x78, 0x72, 0xa8, 0x60, 0x03, 0x00, 0x09, 0x63, 0x0a, + 0x00, 0x78, 0x72, 0xdd, 0x70, 0x14, 0xac, 0x36, 0x00, 0xc0, 0x72, 0xae, + 0x66, 0x0c, 0x76, 0x16, 0x70, 0x10, 0xac, 0x36, 0x00, 0xc0, 0x72, 0xbc, + 0x2c, 0x00, 0xaf, 0x36, 0x00, 0x40, 0x72, 0xba, 0x2f, 0x00, 0x70, 0x12, + 0x00, 0x78, 0x72, 0xbc, 0x70, 0x13, 0x00, 0x00, 0x66, 0x0c, 0x06, 0x7e, + 0x2c, 0x00, 0xaf, 0x06, 0x00, 0x40, 0x72, 0xc5, 0x7e, 0x0e, 0x00, 0x78, + 0x72, 0xc6, 0x26, 0x78, 0x89, 0xff, 0x00, 0xc0, 0x72, 0xd5, 0x60, 0x0f, + 0x00, 0x00, 0x60, 0x10, 0x20, 0x68, 0x10, 0x78, 0x8d, 0x16, 0x00, 0x40, + 0x72, 0xd3, 0x10, 0x78, 0xa1, 0xda, 0x10, 0x78, 0x8e, 0xd6, 0x10, 0x78, + 0x72, 0x33, 0x88, 0xff, 0x00, 0xc0, 0x72, 0xec, 0x0c, 0x7f, 0x00, 0x78, + 0x72, 0x57, 0x2c, 0x78, 0x60, 0x0c, 0x20, 0x60, 0x00, 0x78, 0x72, 0x57, + 0xa0, 0x06, 0x12, 0x7f, 0x00, 0x7f, 0x06, 0x7f, 0x07, 0x7f, 0x0c, 0x7f, + 0x0d, 0x7f, 0x0e, 0x7f, 0x0f, 0x7f, 0x00, 0x7c, 0x60, 0x17, 0x00, 0x00, + 0x0c, 0x7f, 0xa8, 0xc5, 0x00, 0x01, 0x00, 0x78, 0x72, 0xe3, 0x0f, 0x7e, + 0x0e, 0x7e, 0x0d, 0x7e, 0x0c, 0x7e, 0x06, 0x7e, 0x02, 0x7e, 0x00, 0x7e, + 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0xa9, 0xb1, 0x76, 0x38, + 0x26, 0x60, 0x26, 0x78, 0x8c, 0xff, 0x00, 0x40, 0x73, 0x67, 0x60, 0x1c, + 0xa0, 0x86, 0x00, 0x06, 0x00, 0xc0, 0x73, 0x62, 0x87, 0xff, 0x00, 0x40, + 0x73, 0x13, 0x27, 0x00, 0xac, 0x06, 0x00, 0xc0, 0x73, 0x62, 0x00, 0x78, + 0x73, 0x1e, 0x60, 0x18, 0xa2, 0x06, 0x00, 0xc0, 0x73, 0x62, 0x85, 0xff, + 0x00, 0x40, 0x73, 0x1e, 0x60, 0x20, 0xa1, 0x06, 0x00, 0xc0, 0x73, 0x62, + 0x70, 0x3c, 0xac, 0x06, 0x00, 0xc0, 0x73, 0x32, 0x03, 0x7e, 0x20, 0x19, + 0x00, 0x01, 0x10, 0x78, 0x70, 0x58, 0x70, 0x33, 0x00, 0x00, 0x70, 0x3f, + 0x00, 0x00, 0x70, 0x43, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0x4b, + 0x00, 0x00, 0x03, 0x7f, 0x70, 0x38, 0xac, 0x36, 0x00, 0xc0, 0x73, 0x38, + 0x66, 0x0c, 0x76, 0x3a, 0x70, 0x34, 0xac, 0x36, 0x00, 0xc0, 0x73, 0x46, + 0x2c, 0x00, 0xaf, 0x36, 0x00, 0x40, 0x73, 0x44, 0x2f, 0x00, 0x70, 0x36, + 0x00, 0x78, 0x73, 0x46, 0x70, 0x37, 0x00, 0x00, 0x66, 0x0c, 0x06, 0x7e, + 0x2c, 0x00, 0xaf, 0x06, 0x00, 0x40, 0x73, 0x4f, 0x7e, 0x0e, 0x00, 0x78, + 0x73, 0x50, 0x26, 0x78, 0x60, 0x0f, 0x00, 0x00, 0x60, 0x10, 0x20, 0x68, + 0x10, 0x78, 0x8d, 0x16, 0x00, 0x40, 0x73, 0x5a, 0x10, 0x78, 0xa1, 0xda, + 0x10, 0x78, 0x8e, 0xd6, 0x87, 0xff, 0x00, 0xc0, 0x73, 0x71, 0x0c, 0x7f, + 0x00, 0x78, 0x73, 0x02, 0x2c, 0x78, 0x60, 0x0c, 0x20, 0x60, 0x00, 0x78, + 0x73, 0x02, 0xa0, 0x06, 0x12, 0x7f, 0x00, 0x7f, 0x02, 0x7f, 0x06, 0x7f, + 0x0c, 0x7f, 0x0d, 0x7f, 0x0e, 0x7f, 0x0f, 0x7f, 0x00, 0x7c, 0x60, 0x17, + 0x00, 0x00, 0x0c, 0x7f, 0xa7, 0xbd, 0x00, 0x01, 0x00, 0x78, 0x73, 0x68, + 0x0e, 0x7e, 0x20, 0x71, 0xa9, 0xb1, 0x20, 0x01, 0xa7, 0x00, 0x20, 0x04, + 0xa0, 0x86, 0x00, 0x02, 0x00, 0xc0, 0x73, 0x86, 0x70, 0x07, 0x00, 0x05, + 0x00, 0x78, 0x73, 0x88, 0x70, 0x07, 0x00, 0x00, 0x0e, 0x7f, 0x00, 0x7c, + 0x0f, 0x7e, 0x0e, 0x7e, 0x0c, 0x7e, 0x06, 0x7e, 0x02, 0x7e, 0x00, 0x7e, + 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0xa9, 0xb1, 0x2c, 0x10, + 0x76, 0x38, 0x26, 0x60, 0x26, 0x78, 0x8c, 0xff, 0x00, 0x40, 0x73, 0xc8, + 0x22, 0x00, 0xac, 0x06, 0x00, 0xc0, 0x73, 0xc3, 0x70, 0x38, 0xac, 0x36, + 0x00, 0xc0, 0x73, 0xa6, 0x66, 0x0c, 0x76, 0x3a, 0x70, 0x34, 0xac, 0x36, + 0x00, 0xc0, 0x73, 0xb4, 0x2c, 0x00, 0xaf, 0x36, 0x00, 0x40, 0x73, 0xb2, + 0x2f, 0x00, 0x70, 0x36, 0x00, 0x78, 0x73, 0xb4, 0x70, 0x37, 0x00, 0x00, + 0x66, 0x0c, 0x2c, 0x00, 0xaf, 0x06, 0x00, 0x40, 0x73, 0xbc, 0x7e, 0x0e, + 0x00, 0x78, 0x73, 0xbd, 0x26, 0x78, 0x60, 0x0f, 0x00, 0x00, 0xa0, 0x85, + 0x00, 0x01, 0x00, 0x78, 0x73, 0xc8, 0x2c, 0x78, 0x60, 0x0c, 0x20, 0x60, + 0x00, 0x78, 0x73, 0x99, 0x12, 0x7f, 0x00, 0x7f, 0x02, 0x7f, 0x06, 0x7f, + 0x0c, 0x7f, 0x0e, 0x7f, 0x0f, 0x7f, 0x00, 0x7c, 0x0f, 0x7e, 0x0e, 0x7e, + 0x0d, 0x7e, 0x0c, 0x7e, 0x06, 0x7e, 0x00, 0x7e, 0x12, 0x7e, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x71, 0xa9, 0xb1, 0x76, 0x0c, 0x26, 0x60, 0x26, 0x78, + 0x8c, 0xff, 0x00, 0x40, 0x74, 0x69, 0x60, 0x18, 0xa0, 0x80, 0x00, 0x28, + 0x20, 0x04, 0xa2, 0x06, 0x00, 0xc0, 0x74, 0x64, 0x70, 0x24, 0xac, 0x06, + 0x00, 0xc0, 0x74, 0x0f, 0x20, 0x69, 0x01, 0x00, 0x68, 0xc0, 0xa0, 0x05, + 0x00, 0x40, 0x74, 0x3d, 0x10, 0x78, 0x6e, 0x0f, 0x68, 0xc3, 0x00, 0x00, + 0x10, 0x78, 0x73, 0x78, 0x70, 0x27, 0x00, 0x00, 0x03, 0x7e, 0x20, 0x69, + 0x01, 0x40, 0x6b, 0x04, 0xa3, 0x84, 0x10, 0x00, 0x00, 0x40, 0x74, 0x06, + 0x68, 0x03, 0x01, 0x00, 0x68, 0x03, 0x00, 0x00, 0x20, 0x69, 0x01, 0x00, + 0x68, 0x24, 0xd0, 0x84, 0x00, 0x40, 0x74, 0x0e, 0x68, 0x27, 0x00, 0x01, + 0x03, 0x7f, 0x70, 0x0c, 0xac, 0x36, 0x00, 0xc0, 0x74, 0x15, 0x66, 0x0c, + 0x76, 0x0e, 0x70, 0x08, 0xac, 0x36, 0x00, 0xc0, 0x74, 0x23, 0x2c, 0x00, + 0xaf, 0x36, 0x00, 0x40, 0x74, 0x21, 0x2f, 0x00, 0x70, 0x0a, 0x00, 0x78, + 0x74, 0x23, 0x70, 0x0b, 0x00, 0x00, 0x66, 0x0c, 0x06, 0x7e, 0x2c, 0x00, + 0xaf, 0x06, 0x00, 0x40, 0x74, 0x2c, 0x7e, 0x0e, 0x00, 0x78, 0x74, 0x2d, + 0x26, 0x78, 0x60, 0x0f, 0x00, 0x00, 0x10, 0x78, 0x8e, 0xfc, 0x00, 0xc0, + 0x74, 0x41, 0x10, 0x78, 0x28, 0xa6, 0x10, 0x78, 0x8f, 0x10, 0x00, 0xc0, + 0x74, 0x5d, 0x10, 0x78, 0x7c, 0x83, 0x00, 0x78, 0x74, 0x5d, 0x10, 0x78, + 0x73, 0x78, 0x00, 0x78, 0x74, 0x0f, 0x10, 0x78, 0x8f, 0x10, 0x00, 0xc0, + 0x74, 0x49, 0x10, 0x78, 0x7c, 0x83, 0x00, 0x78, 0x74, 0x5d, 0x60, 0x10, + 0x20, 0x68, 0x10, 0x78, 0x8d, 0x16, 0x00, 0x40, 0x74, 0x5d, 0x60, 0x1c, + 0xa0, 0x86, 0x00, 0x03, 0x00, 0xc0, 0x74, 0x71, 0x68, 0x37, 0x01, 0x03, + 0x6b, 0x4a, 0x68, 0x47, 0x00, 0x00, 0x10, 0x78, 0x4a, 0x73, 0x10, 0x78, + 0x8e, 0xc9, 0x10, 0x78, 0x8e, 0xd6, 0x10, 0x78, 0x72, 0x33, 0x0c, 0x7f, + 0x00, 0x78, 0x73, 0xde, 0x2c, 0x78, 0x60, 0x0c, 0x20, 0x60, 0x00, 0x78, + 0x73, 0xde, 0x12, 0x7f, 0x00, 0x7f, 0x06, 0x7f, 0x0c, 0x7f, 0x0d, 0x7f, + 0x0e, 0x7f, 0x0f, 0x7f, 0x00, 0x7c, 0x60, 0x1c, 0xa0, 0x86, 0x00, 0x06, + 0x00, 0xc0, 0x74, 0x5d, 0x10, 0x78, 0xa1, 0xda, 0x00, 0x78, 0x74, 0x5d, + 0x03, 0x7e, 0x15, 0x7e, 0x13, 0x7e, 0x14, 0x7e, 0x39, 0x08, 0xa0, 0x06, + 0xa1, 0x90, 0x00, 0x20, 0x22, 0x1c, 0xa3, 0x9e, 0x26, 0x76, 0x00, 0xc0, + 0x74, 0x8b, 0x82, 0x10, 0x80, 0x00, 0x00, 0x78, 0x74, 0x82, 0xa0, 0x05, + 0x00, 0x40, 0x74, 0x97, 0x20, 0xa9, 0x00, 0x20, 0x21, 0x98, 0x82, 0x11, + 0xa2, 0x82, 0x00, 0x20, 0x20, 0xc8, 0x20, 0xa0, 0x53, 0xa3, 0x14, 0x7f, + 0x13, 0x7f, 0x15, 0x7f, 0x03, 0x7f, 0x00, 0x7c, 0x0d, 0x7e, 0x20, 0xa1, + 0x02, 0x0b, 0x10, 0x78, 0x67, 0xc2, 0x20, 0xa3, 0x02, 0x00, 0x20, 0xa3, + 0x00, 0x14, 0x60, 0xc3, 0x00, 0x14, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0x99, 0xa9, 0xa5, 0x20, 0xa9, 0x00, 0x04, 0x53, 0xa6, + 0x20, 0xa3, 0x00, 0x04, 0x20, 0xa3, 0x78, 0x78, 0x20, 0xa3, 0x00, 0x00, + 0x20, 0xa3, 0x00, 0x00, 0x10, 0x78, 0x6d, 0xfb, 0x0d, 0x7f, 0x00, 0x7c, + 0x20, 0xa1, 0x02, 0x0b, 0x10, 0x78, 0x67, 0xc2, 0x20, 0xa3, 0x02, 0x14, + 0x20, 0xa3, 0x00, 0x18, 0x20, 0xa3, 0x08, 0x00, 0x78, 0x10, 0xa0, 0x84, + 0xff, 0x00, 0x20, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x78, 0x10, 0xa0, 0x84, + 0x00, 0xff, 0x20, 0xa2, 0x78, 0x28, 0x20, 0xa2, 0x20, 0xa3, 0x00, 0x00, + 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, 0x00, 0x18, 0x10, 0x78, 0x6d, 0xfb, + 0x00, 0x7c, 0x0d, 0x7e, 0x01, 0x7e, 0x2f, 0x68, 0x20, 0x09, 0x00, 0x35, + 0x10, 0x78, 0x91, 0xcc, 0x00, 0xc0, 0x75, 0x51, 0x20, 0xa1, 0x02, 0x0b, + 0x10, 0x78, 0x67, 0x31, 0x20, 0xa3, 0x13, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x78, 0x28, 0x20, 0x68, 0x68, 0x1c, 0xa0, 0x86, 0x00, 0x03, 0x00, 0x40, + 0x75, 0x2d, 0x78, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x14, 0xa2, 0x86, + 0x00, 0x7e, 0x00, 0xc0, 0x75, 0x07, 0x20, 0xa3, 0x00, 0xff, 0x20, 0xa3, + 0xff, 0xfe, 0x00, 0x78, 0x75, 0x42, 0xa2, 0x86, 0x00, 0x7f, 0x00, 0xc0, + 0x75, 0x11, 0x20, 0xa3, 0x00, 0xff, 0x20, 0xa3, 0xff, 0xfd, 0x00, 0x78, + 0x75, 0x42, 0xd2, 0xbc, 0x00, 0x40, 0x75, 0x27, 0xa2, 0x86, 0x00, 0x80, + 0x00, 0xc0, 0x75, 0x1e, 0x20, 0xa3, 0x00, 0xff, 0x20, 0xa3, 0xff, 0xfc, + 0x00, 0x78, 0x75, 0x42, 0xa2, 0xe8, 0xa8, 0x35, 0x2d, 0x6c, 0x68, 0x10, + 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, 0x00, 0x78, 0x75, 0x42, 0x20, 0xa3, + 0x00, 0x00, 0x60, 0x98, 0x20, 0xa2, 0x00, 0x78, 0x75, 0x42, 0x78, 0x18, + 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, 0xa0, 0x82, 0x00, 0x7e, 0x00, 0x48, + 0x75, 0x3e, 0x0d, 0x7e, 0x20, 0x69, 0xa7, 0x1b, 0x2d, 0xa6, 0x8d, 0x68, + 0x2d, 0xa6, 0x0d, 0x7f, 0x00, 0x78, 0x75, 0x42, 0x20, 0xa3, 0x00, 0x00, + 0x60, 0x30, 0x20, 0xa2, 0x78, 0x34, 0x20, 0xa2, 0x78, 0x38, 0x20, 0xa2, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, 0x00, 0x0c, + 0x10, 0x78, 0x6d, 0xfb, 0x01, 0x7f, 0x0d, 0x7f, 0x00, 0x7c, 0x78, 0x17, + 0x00, 0x01, 0x78, 0x03, 0x00, 0x06, 0x01, 0x7f, 0x0d, 0x7f, 0x00, 0x7c, + 0x0d, 0x7e, 0x02, 0x7e, 0x79, 0x28, 0x21, 0x68, 0x69, 0x1c, 0xa1, 0x86, + 0x00, 0x06, 0x00, 0x40, 0x75, 0x7a, 0xa1, 0x86, 0x00, 0x03, 0x00, 0x40, + 0x75, 0xd5, 0xa1, 0x86, 0x00, 0x05, 0x00, 0x40, 0x75, 0xb8, 0xa1, 0x86, + 0x00, 0x04, 0x00, 0x40, 0x75, 0xa8, 0xa1, 0x86, 0x00, 0x08, 0x00, 0x40, + 0x75, 0xc2, 0x78, 0x07, 0x00, 0x37, 0x78, 0x13, 0x17, 0x00, 0x10, 0x78, + 0x76, 0x40, 0x02, 0x7f, 0x0d, 0x7f, 0x00, 0x7c, 0x10, 0x78, 0x75, 0xfd, + 0x20, 0x09, 0x40, 0x00, 0x68, 0x00, 0x00, 0x79, 0x75, 0x81, 0x75, 0x94, + 0x75, 0xa2, 0x75, 0x96, 0x75, 0xa2, 0x75, 0x9d, 0x75, 0x94, 0x75, 0x94, + 0x75, 0xa2, 0x75, 0xa2, 0x75, 0xa2, 0x75, 0xa2, 0x75, 0x94, 0x75, 0x94, + 0x75, 0x94, 0x75, 0x94, 0x75, 0x94, 0x75, 0xa2, 0x75, 0x94, 0x75, 0xa2, + 0x10, 0x78, 0x13, 0x32, 0x68, 0x24, 0xd0, 0xe4, 0x00, 0x40, 0x75, 0x9d, + 0xd0, 0xcc, 0x00, 0x40, 0x75, 0xa0, 0xa0, 0x0e, 0x00, 0x78, 0x75, 0xa2, + 0x20, 0x09, 0x20, 0x00, 0x68, 0x28, 0x20, 0xa2, 0x68, 0x2c, 0x20, 0xa2, + 0x00, 0x78, 0x75, 0xf3, 0x10, 0x78, 0x75, 0xfd, 0x20, 0xa3, 0x00, 0x00, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0x09, 0x40, 0x00, 0x6a, 0x00, 0xa2, 0x86, + 0x00, 0x02, 0x00, 0xc0, 0x75, 0xb6, 0xa0, 0x0e, 0x00, 0x78, 0x75, 0xf3, + 0x10, 0x78, 0x75, 0xfd, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x20, 0x09, 0x40, 0x00, 0x00, 0x78, 0x75, 0xf3, 0x10, 0x78, 0x75, 0xfd, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0x09, 0x40, 0x00, + 0xa2, 0x86, 0x00, 0x05, 0x00, 0x40, 0x75, 0xd2, 0xa2, 0x86, 0x00, 0x02, + 0x00, 0xc0, 0x75, 0xd3, 0xa0, 0x0e, 0x00, 0x78, 0x75, 0xf3, 0x10, 0x78, + 0x75, 0xfd, 0x68, 0x10, 0x20, 0x68, 0x69, 0x7c, 0x68, 0x10, 0xa1, 0x12, + 0x69, 0x80, 0x68, 0x14, 0xa1, 0x03, 0x20, 0xa2, 0x22, 0xa2, 0x79, 0x28, + 0xa1, 0x80, 0x00, 0x00, 0x20, 0x04, 0xa0, 0x8e, 0x00, 0x02, 0x00, 0x40, + 0x75, 0xf1, 0xa0, 0x8e, 0x00, 0x04, 0x00, 0x40, 0x75, 0xf1, 0x20, 0x09, + 0x40, 0x00, 0x00, 0x78, 0x75, 0xf3, 0x20, 0x09, 0x00, 0x00, 0x21, 0xa2, + 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, 0x00, 0x18, 0x10, 0x78, 0x6d, 0xfb, + 0x02, 0x7f, 0x0d, 0x7f, 0x00, 0x7c, 0x03, 0x7e, 0x04, 0x7e, 0x05, 0x7e, + 0x06, 0x7e, 0x20, 0xa1, 0x02, 0x0b, 0x10, 0x78, 0x67, 0xc2, 0xa0, 0x06, + 0x20, 0xa3, 0x02, 0x00, 0x20, 0xa2, 0x79, 0x34, 0x21, 0xa2, 0x79, 0x38, + 0x21, 0xa2, 0x78, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, 0xa0, 0x92, + 0x00, 0x7e, 0x00, 0x48, 0x76, 0x23, 0x0d, 0x7e, 0x20, 0x69, 0xa7, 0x1b, + 0x2d, 0x2c, 0x8d, 0x68, 0x2d, 0x34, 0xa0, 0xe8, 0xa8, 0x35, 0x2d, 0x6c, + 0x6b, 0x10, 0x6c, 0x14, 0x0d, 0x7f, 0x00, 0x78, 0x76, 0x29, 0x20, 0x19, + 0x00, 0x00, 0x64, 0x98, 0x20, 0x29, 0x00, 0x00, 0x66, 0x30, 0x78, 0x28, + 0xa0, 0x80, 0x00, 0x07, 0x20, 0x04, 0xa0, 0x86, 0x00, 0x03, 0x00, 0xc0, + 0x76, 0x37, 0x25, 0xa2, 0x26, 0xa2, 0x23, 0xa2, 0x24, 0xa2, 0x00, 0x78, + 0x76, 0x3b, 0x23, 0xa2, 0x24, 0xa2, 0x25, 0xa2, 0x26, 0xa2, 0x06, 0x7f, + 0x05, 0x7f, 0x04, 0x7f, 0x03, 0x7f, 0x00, 0x7c, 0x20, 0xa1, 0x02, 0x0b, + 0x10, 0x78, 0x67, 0xc2, 0x20, 0xa3, 0x01, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x20, 0xa3, 0x00, 0x09, 0x78, 0x10, 0x20, 0xa2, 0x60, 0xc3, 0x00, 0x08, + 0x10, 0x78, 0x6d, 0xfb, 0x00, 0x7c, 0x20, 0xa1, 0x02, 0x0b, 0x10, 0x78, + 0x67, 0x28, 0x20, 0xa3, 0x14, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x78, 0x34, + 0x20, 0xa2, 0x78, 0x38, 0x20, 0xa2, 0x78, 0x28, 0x20, 0xa2, 0x78, 0x2c, + 0x20, 0xa2, 0x78, 0x30, 0xa0, 0x84, 0x00, 0xff, 0x80, 0x07, 0x20, 0xa2, + 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, 0x00, 0x10, 0x10, 0x78, 0x6d, 0xfb, + 0x00, 0x7c, 0x20, 0xa1, 0x02, 0x0b, 0x10, 0x78, 0x67, 0xb9, 0x20, 0xa3, + 0x01, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x78, 0x28, 0x20, 0xa2, 0x78, 0x10, + 0x20, 0xa2, 0x60, 0xc3, 0x00, 0x08, 0x10, 0x78, 0x6d, 0xfb, 0x00, 0x7c, + 0x14, 0x7e, 0x20, 0xa1, 0x02, 0x0b, 0x10, 0x78, 0x76, 0x89, 0x60, 0xc3, + 0x00, 0x00, 0x10, 0x78, 0x6d, 0xfb, 0x14, 0x7f, 0x00, 0x7c, 0x20, 0xe1, + 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, 0x78, 0x18, 0xa0, 0x80, 0x00, 0x28, + 0x20, 0x04, 0xd0, 0xbc, 0x00, 0x40, 0x76, 0xa6, 0x0d, 0x7e, 0xa0, 0xe8, + 0xa8, 0x35, 0x2d, 0x6c, 0x68, 0x10, 0xa0, 0x85, 0x03, 0x00, 0x20, 0xa2, + 0x68, 0x14, 0x20, 0xa2, 0x20, 0x69, 0xa7, 0x1b, 0x2d, 0xa6, 0x8d, 0x68, + 0x2d, 0xa6, 0x0d, 0x7f, 0x00, 0x78, 0x76, 0xae, 0x20, 0xa3, 0x03, 0x00, + 0x62, 0x98, 0x22, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x62, 0x30, 0x22, 0xa2, + 0x20, 0xa3, 0x08, 0x19, 0x20, 0xa3, 0x00, 0x00, 0x10, 0x78, 0x6d, 0xea, + 0x22, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x2f, 0xa2, 0x7a, 0x08, 0x22, 0xa2, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x00, 0x7c, 0x20, 0x61, + 0xae, 0x00, 0x2a, 0x70, 0x70, 0x64, 0x70, 0x4a, 0x70, 0x4f, 0xae, 0x00, + 0x00, 0x7c, 0x0e, 0x7e, 0x12, 0x7e, 0x20, 0x71, 0xa7, 0x00, 0x20, 0x91, + 0x80, 0x00, 0x75, 0x48, 0xa5, 0x82, 0x00, 0x10, 0x00, 0x48, 0x76, 0xf9, + 0x70, 0x4c, 0x20, 0x60, 0x60, 0x00, 0xa0, 0x86, 0x00, 0x00, 0x00, 0x40, + 0x76, 0xe5, 0xac, 0xe0, 0x00, 0x10, 0x70, 0x58, 0xac, 0x02, 0x00, 0xc8, + 0x76, 0xe1, 0x00, 0x78, 0x76, 0xd4, 0x20, 0x61, 0xae, 0x00, 0x00, 0x78, + 0x76, 0xd4, 0x60, 0x03, 0x00, 0x08, 0x85, 0x29, 0x75, 0x4a, 0xac, 0xa8, + 0x00, 0x10, 0x70, 0x58, 0xa5, 0x02, 0x00, 0xc8, 0x76, 0xf5, 0x75, 0x4e, + 0xa0, 0x85, 0x00, 0x01, 0x12, 0x7f, 0x0e, 0x7f, 0x00, 0x7c, 0x70, 0x4f, + 0xae, 0x00, 0x00, 0x78, 0x76, 0xf0, 0xa0, 0x06, 0x00, 0x78, 0x76, 0xf2, + 0x0e, 0x7e, 0x20, 0x71, 0xa7, 0x00, 0x75, 0x48, 0xa5, 0x82, 0x00, 0x10, + 0x00, 0x48, 0x77, 0x2a, 0x70, 0x4c, 0x20, 0x60, 0x60, 0x00, 0xa0, 0x86, + 0x00, 0x00, 0x00, 0x40, 0x77, 0x17, 0xac, 0xe0, 0x00, 0x10, 0x70, 0x58, + 0xac, 0x02, 0x00, 0xc8, 0x77, 0x13, 0x00, 0x78, 0x77, 0x06, 0x20, 0x61, + 0xae, 0x00, 0x00, 0x78, 0x77, 0x06, 0x60, 0x03, 0x00, 0x08, 0x85, 0x29, + 0x75, 0x4a, 0xac, 0xa8, 0x00, 0x10, 0x70, 0x58, 0xa5, 0x02, 0x00, 0xc8, + 0x77, 0x26, 0x75, 0x4e, 0xa0, 0x85, 0x00, 0x01, 0x0e, 0x7f, 0x00, 0x7c, + 0x70, 0x4f, 0xae, 0x00, 0x00, 0x78, 0x77, 0x22, 0xa0, 0x06, 0x00, 0x78, + 0x77, 0x24, 0xac, 0x82, 0xae, 0x00, 0x10, 0x48, 0x13, 0x32, 0x20, 0x01, + 0xa7, 0x16, 0x20, 0x04, 0xac, 0x02, 0x10, 0xc8, 0x13, 0x32, 0xa0, 0x06, + 0x60, 0x06, 0x60, 0x0a, 0x60, 0x0e, 0x60, 0x12, 0x60, 0x16, 0x60, 0x1a, + 0x60, 0x1f, 0x00, 0x00, 0x60, 0x03, 0x00, 0x00, 0x60, 0x22, 0x60, 0x26, + 0x60, 0x2a, 0x60, 0x2e, 0x60, 0x32, 0x60, 0x36, 0x60, 0x3a, 0x60, 0x3e, + 0x20, 0x61, 0xa7, 0x00, 0x60, 0x48, 0x80, 0x00, 0x60, 0x4a, 0xa0, 0x86, + 0x00, 0x01, 0x00, 0x40, 0x77, 0x54, 0x00, 0x7c, 0x12, 0x7e, 0x20, 0x91, + 0x80, 0x00, 0x10, 0x78, 0x62, 0xd1, 0x12, 0x7f, 0x00, 0x78, 0x77, 0x53, + 0x60, 0x1c, 0xa0, 0x84, 0x00, 0x0f, 0x00, 0x79, 0x77, 0x61, 0x77, 0x6a, + 0x77, 0x7b, 0x77, 0x97, 0x77, 0xb3, 0x92, 0x1e, 0x92, 0x3a, 0x92, 0x56, + 0x77, 0x6a, 0x77, 0x7b, 0xa1, 0x86, 0x00, 0x13, 0x00, 0xc0, 0x77, 0x73, + 0x10, 0x78, 0x61, 0xcd, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x7c, 0xa1, 0x8e, + 0x00, 0x47, 0x00, 0xc0, 0x77, 0x7a, 0xa0, 0x16, 0x10, 0x78, 0x15, 0xfa, + 0x00, 0x7c, 0x06, 0x7e, 0x60, 0x00, 0xa0, 0xb2, 0x00, 0x10, 0x10, 0xc8, + 0x13, 0x32, 0x10, 0x79, 0x77, 0x85, 0x06, 0x7f, 0x00, 0x7c, 0x77, 0x95, + 0x7b, 0x00, 0x7c, 0xb2, 0x77, 0x95, 0x7d, 0x36, 0x77, 0xcf, 0x77, 0x95, + 0x77, 0x95, 0x7a, 0x92, 0x80, 0xf6, 0x77, 0x95, 0x77, 0x95, 0x77, 0x95, + 0x77, 0x95, 0x77, 0x95, 0x77, 0x95, 0x10, 0x78, 0x13, 0x32, 0x06, 0x7e, + 0x60, 0x00, 0xa0, 0xb2, 0x00, 0x10, 0x10, 0xc8, 0x13, 0x32, 0x10, 0x79, + 0x77, 0xa1, 0x06, 0x7f, 0x00, 0x7c, 0x77, 0xb1, 0x87, 0xd3, 0x77, 0xb1, + 0x77, 0xb1, 0x77, 0xb1, 0x77, 0xb1, 0x77, 0xb1, 0x77, 0xb1, 0x87, 0x76, + 0x89, 0x61, 0x77, 0xb1, 0x88, 0x03, 0x88, 0x89, 0x88, 0x03, 0x88, 0x89, + 0x77, 0xb1, 0x10, 0x78, 0x13, 0x32, 0x06, 0x7e, 0x60, 0x00, 0xa0, 0xb2, + 0x00, 0x10, 0x10, 0xc8, 0x13, 0x32, 0x10, 0x79, 0x77, 0xbd, 0x06, 0x7f, + 0x00, 0x7c, 0x77, 0xcd, 0x81, 0x3d, 0x82, 0x0e, 0x83, 0x72, 0x84, 0xf1, + 0x77, 0xcd, 0x77, 0xcd, 0x77, 0xcd, 0x81, 0x16, 0x87, 0x1e, 0x87, 0x22, + 0x77, 0xcd, 0x77, 0xcd, 0x77, 0xcd, 0x77, 0xcd, 0x87, 0x52, 0x10, 0x78, + 0x13, 0x32, 0xa1, 0xb6, 0x00, 0x15, 0x00, 0xc0, 0x77, 0xd7, 0x10, 0x78, + 0x77, 0x2d, 0x00, 0x78, 0x77, 0xdd, 0xa1, 0xb6, 0x00, 0x16, 0x10, 0xc0, + 0x13, 0x32, 0x10, 0x78, 0x77, 0x2d, 0x00, 0x7c, 0x20, 0xa9, 0x00, 0x0e, + 0x2e, 0x98, 0x60, 0x10, 0x20, 0xa0, 0x53, 0xa3, 0x20, 0xa9, 0x00, 0x06, + 0x33, 0x10, 0x34, 0x20, 0x93, 0x98, 0x94, 0xa0, 0x33, 0x18, 0x34, 0x28, + 0x22, 0x2e, 0x23, 0x26, 0xa2, 0x90, 0x00, 0x02, 0xa5, 0xa8, 0x00, 0x02, + 0xa3, 0x98, 0x00, 0x02, 0xa4, 0xa0, 0x00, 0x02, 0x00, 0xf0, 0x77, 0xec, + 0x0e, 0x7e, 0x10, 0x78, 0x8d, 0x16, 0x00, 0x40, 0x78, 0x03, 0x60, 0x10, + 0x20, 0x70, 0x70, 0x07, 0x00, 0x00, 0x70, 0x37, 0x01, 0x03, 0x0e, 0x7f, + 0x10, 0x78, 0x77, 0x2d, 0x00, 0x7c, 0x0d, 0x7e, 0x03, 0x7e, 0x73, 0x30, + 0xa3, 0x86, 0x02, 0x00, 0x00, 0xc0, 0x78, 0x14, 0x60, 0x18, 0x20, 0x68, + 0x68, 0x13, 0x00, 0xff, 0x68, 0x17, 0xff, 0xfd, 0x60, 0x10, 0xa0, 0x05, + 0x00, 0x40, 0x78, 0x1e, 0x20, 0x68, 0x68, 0x07, 0x00, 0x00, 0x68, 0x37, + 0x01, 0x03, 0x6b, 0x32, 0x10, 0x78, 0x77, 0x2d, 0x03, 0x7f, 0x0d, 0x7f, + 0x00, 0x7c, 0x01, 0x7e, 0x20, 0xa9, 0x00, 0x2a, 0xae, 0x80, 0x00, 0x0c, + 0x20, 0x98, 0x60, 0x10, 0xa0, 0x80, 0x00, 0x02, 0x20, 0xa0, 0x53, 0xa3, + 0x20, 0xa9, 0x00, 0x2a, 0x60, 0x10, 0xa0, 0x80, 0x00, 0x01, 0x20, 0x04, + 0xa0, 0x80, 0x00, 0x02, 0x20, 0xa0, 0x53, 0xa3, 0x0e, 0x7e, 0x60, 0x10, + 0x20, 0x04, 0x20, 0x70, 0x70, 0x37, 0x01, 0x03, 0x0e, 0x7f, 0x10, 0x78, + 0x77, 0x2d, 0x01, 0x7f, 0x00, 0x7c, 0x0e, 0x7e, 0x0d, 0x7e, 0x60, 0x3f, + 0x00, 0x00, 0x2c, 0x68, 0x01, 0x7e, 0x20, 0x09, 0x00, 0x35, 0x10, 0x78, + 0x91, 0xcc, 0x01, 0x7f, 0x00, 0xc0, 0x78, 0x5f, 0x02, 0x7e, 0x62, 0x28, + 0x22, 0x68, 0x02, 0x7f, 0x20, 0x71, 0xac, 0x8c, 0x6b, 0x1c, 0xa3, 0x86, + 0x00, 0x03, 0x00, 0x40, 0x78, 0x63, 0xa3, 0x86, 0x00, 0x06, 0x00, 0x40, + 0x78, 0x67, 0x10, 0x78, 0x77, 0x2d, 0x00, 0x78, 0x78, 0x69, 0x10, 0x78, + 0x78, 0x6c, 0x00, 0x78, 0x78, 0x69, 0x10, 0x78, 0x79, 0x38, 0x0d, 0x7f, + 0x0e, 0x7f, 0x00, 0x7c, 0x0f, 0x7e, 0x68, 0x10, 0x20, 0x78, 0xa1, 0x86, + 0x00, 0x15, 0x00, 0x40, 0x79, 0x1d, 0xa1, 0x8e, 0x00, 0x16, 0x00, 0xc0, + 0x79, 0x36, 0x70, 0x0c, 0xa0, 0x8c, 0xff, 0x00, 0xa1, 0x86, 0x17, 0x00, + 0x00, 0x40, 0x78, 0x82, 0xa1, 0x86, 0x03, 0x00, 0x00, 0xc0, 0x78, 0xf8, + 0x8f, 0xff, 0x00, 0xc0, 0x78, 0x8c, 0x68, 0x00, 0xa0, 0x86, 0x00, 0x0f, + 0x00, 0x40, 0x78, 0xdb, 0x00, 0x78, 0x79, 0x34, 0x68, 0x08, 0xa0, 0x86, + 0xff, 0xff, 0x00, 0xc0, 0x79, 0x21, 0x78, 0x4c, 0xa0, 0x84, 0x00, 0x60, + 0xa0, 0x86, 0x00, 0x20, 0x00, 0xc0, 0x78, 0xa2, 0x79, 0x7c, 0x78, 0x10, + 0xa1, 0x06, 0x00, 0xc0, 0x79, 0x21, 0x79, 0x80, 0x78, 0x14, 0xa1, 0x06, + 0x00, 0xc0, 0x79, 0x21, 0x10, 0x78, 0x8e, 0xc9, 0x68, 0x30, 0x78, 0x52, + 0x78, 0x4c, 0xc0, 0xdc, 0xc0, 0xf4, 0xc0, 0xd4, 0x78, 0x4e, 0x02, 0x7e, + 0xa0, 0x0e, 0x6a, 0x14, 0x20, 0x01, 0x00, 0x0a, 0x10, 0x78, 0x5c, 0x1c, + 0x78, 0x54, 0xa2, 0x0a, 0x00, 0x48, 0x78, 0xb7, 0x80, 0x11, 0x7a, 0x56, + 0x82, 0xff, 0x02, 0x7f, 0x00, 0xc0, 0x78, 0xc3, 0x0c, 0x7e, 0x2d, 0x60, + 0x10, 0x78, 0x8a, 0xf0, 0x0c, 0x7f, 0x00, 0x78, 0x79, 0x34, 0x0c, 0x7e, + 0x0d, 0x7e, 0x2f, 0x68, 0x68, 0x38, 0xd0, 0xfc, 0x00, 0xc0, 0x78, 0xce, + 0x10, 0x78, 0x43, 0x53, 0x00, 0x78, 0x78, 0xd0, 0x10, 0x78, 0x44, 0x31, + 0x0d, 0x7f, 0x0c, 0x7f, 0x00, 0xc0, 0x79, 0x21, 0x0c, 0x7e, 0x2d, 0x60, + 0x10, 0x78, 0x77, 0x2d, 0x0c, 0x7f, 0x00, 0x78, 0x79, 0x34, 0x0c, 0x7e, + 0x10, 0x78, 0x91, 0x97, 0x00, 0x40, 0x78, 0xf1, 0x60, 0x13, 0x00, 0x00, + 0x68, 0x18, 0x60, 0x1a, 0x60, 0x1f, 0x00, 0x03, 0x69, 0x04, 0x0c, 0x7e, + 0x2d, 0x60, 0x10, 0x78, 0x77, 0x2d, 0x0c, 0x7f, 0x10, 0x78, 0x77, 0x5c, + 0x0c, 0x7f, 0x00, 0x78, 0x79, 0x34, 0x20, 0x01, 0xa9, 0xa4, 0x20, 0x04, + 0x68, 0x3e, 0x0c, 0x7f, 0x00, 0x78, 0x79, 0x34, 0x70, 0x08, 0xa0, 0x86, + 0x00, 0x0b, 0x00, 0xc0, 0x79, 0x12, 0x60, 0x18, 0x20, 0x0c, 0xc1, 0xbc, + 0x21, 0x02, 0x0c, 0x7e, 0x2d, 0x60, 0x78, 0x53, 0x00, 0x03, 0x60, 0x07, + 0x00, 0x85, 0x60, 0x03, 0x00, 0x0b, 0x60, 0x1f, 0x00, 0x02, 0x10, 0x78, + 0x5d, 0x8a, 0x10, 0x78, 0x62, 0xd1, 0x0c, 0x7f, 0x00, 0x78, 0x79, 0x34, + 0x70, 0x0c, 0xa0, 0x86, 0x2a, 0x00, 0x00, 0xc0, 0x79, 0x21, 0x20, 0x01, + 0xa9, 0xa4, 0x20, 0x04, 0x68, 0x3e, 0x00, 0x78, 0x79, 0x34, 0x10, 0x78, + 0x79, 0x53, 0x00, 0x78, 0x79, 0x36, 0x8f, 0xff, 0x10, 0x40, 0x13, 0x32, + 0x0c, 0x7e, 0x0d, 0x7e, 0x2d, 0x60, 0x2f, 0x68, 0x68, 0x37, 0x01, 0x03, + 0x68, 0x4b, 0x00, 0x03, 0x10, 0x78, 0x89, 0xdf, 0x10, 0x78, 0x8e, 0xc9, + 0x10, 0x78, 0x8e, 0xd6, 0x0d, 0x7f, 0x0c, 0x7f, 0x10, 0x78, 0x77, 0x2d, + 0x0f, 0x7f, 0x00, 0x7c, 0xa1, 0x86, 0x00, 0x15, 0x00, 0xc0, 0x79, 0x42, + 0x20, 0x01, 0xa9, 0xa4, 0x20, 0x04, 0x68, 0x3e, 0x00, 0x78, 0x79, 0x50, + 0xa1, 0x8e, 0x00, 0x16, 0x00, 0xc0, 0x79, 0x52, 0x0c, 0x7e, 0x2d, 0x00, + 0x20, 0x60, 0x10, 0x78, 0xa4, 0xa5, 0x10, 0x78, 0x5b, 0xc1, 0x10, 0x78, + 0x77, 0x2d, 0x0c, 0x7f, 0x10, 0x78, 0x77, 0x2d, 0x00, 0x7c, 0x02, 0x7e, + 0x03, 0x7e, 0x04, 0x7e, 0x72, 0x28, 0x7c, 0x80, 0x7b, 0x7c, 0xd2, 0xf4, + 0x00, 0x40, 0x79, 0x62, 0x20, 0x01, 0xa9, 0xa4, 0x20, 0x04, 0x68, 0x3e, + 0x00, 0x78, 0x79, 0xc6, 0x0c, 0x7e, 0x2d, 0x60, 0x10, 0x78, 0x8a, 0x03, + 0x0c, 0x7f, 0x68, 0x04, 0xa0, 0x86, 0x00, 0x50, 0x00, 0xc0, 0x79, 0x7a, + 0x0c, 0x7e, 0x2d, 0x00, 0x20, 0x60, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, + 0x00, 0x50, 0x10, 0x78, 0x5d, 0x8a, 0x10, 0x78, 0x62, 0xd1, 0x0c, 0x7f, + 0x00, 0x78, 0x79, 0xc6, 0x68, 0x00, 0xa0, 0x86, 0x00, 0x0f, 0x00, 0x40, + 0x79, 0x9c, 0x8f, 0xff, 0x10, 0x40, 0x13, 0x32, 0x68, 0x24, 0xd0, 0xdc, + 0x00, 0xc0, 0x79, 0x9c, 0x68, 0x00, 0xa0, 0x86, 0x00, 0x04, 0x00, 0xc0, + 0x79, 0xa1, 0x78, 0x4c, 0xd0, 0xac, 0x00, 0x40, 0x79, 0xa1, 0x78, 0x4c, + 0xc0, 0xdc, 0xc0, 0xf4, 0x78, 0x4e, 0x78, 0x50, 0xc0, 0xf4, 0xc0, 0xfc, + 0x78, 0x52, 0x20, 0x01, 0x00, 0x01, 0x68, 0x2e, 0x00, 0x78, 0x79, 0xc0, + 0x20, 0x01, 0x00, 0x07, 0x68, 0x2e, 0x00, 0x78, 0x79, 0xc0, 0x78, 0x4c, + 0xd0, 0xb4, 0x00, 0xc0, 0x79, 0xae, 0xd0, 0xac, 0x00, 0x40, 0x79, 0x9c, + 0x78, 0x4c, 0xd0, 0xf4, 0x00, 0xc0, 0x79, 0x9c, 0x00, 0x78, 0x79, 0x8f, + 0xd2, 0xec, 0x00, 0xc0, 0x79, 0x9c, 0x70, 0x24, 0xa3, 0x06, 0x00, 0xc0, + 0x79, 0xb9, 0x70, 0x20, 0xa4, 0x06, 0x00, 0x40, 0x79, 0x9c, 0x70, 0x20, + 0x68, 0x36, 0x70, 0x24, 0x68, 0x3a, 0x20, 0x01, 0x00, 0x05, 0x68, 0x2e, + 0x10, 0x78, 0x90, 0x00, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x78, 0x79, 0xc8, + 0x10, 0x78, 0x77, 0x2d, 0x04, 0x7f, 0x03, 0x7f, 0x02, 0x7f, 0x00, 0x7c, + 0x0e, 0x7e, 0x0d, 0x7e, 0x02, 0x7e, 0x60, 0x34, 0x20, 0x68, 0x6a, 0x1c, + 0xa2, 0x86, 0x00, 0x07, 0x00, 0x40, 0x7a, 0x35, 0xa2, 0x86, 0x00, 0x02, + 0x00, 0x40, 0x7a, 0x35, 0xa2, 0x86, 0x00, 0x00, 0x00, 0x40, 0x7a, 0x35, + 0x68, 0x08, 0x63, 0x38, 0xa3, 0x06, 0x00, 0xc0, 0x7a, 0x35, 0x20, 0x71, + 0xac, 0x8c, 0xa1, 0x86, 0x00, 0x15, 0x00, 0x40, 0x7a, 0x2f, 0xa1, 0x8e, + 0x00, 0x16, 0x00, 0xc0, 0x7a, 0x02, 0x60, 0x30, 0xa0, 0x84, 0x00, 0xff, + 0xa0, 0x86, 0x00, 0x01, 0x00, 0xc0, 0x7a, 0x02, 0x70, 0x0c, 0xa0, 0x86, + 0x2a, 0x00, 0x00, 0xc0, 0x7a, 0x02, 0x60, 0x34, 0xa0, 0x80, 0x00, 0x09, + 0x20, 0x0c, 0xc1, 0xdd, 0xc1, 0xf5, 0x21, 0x02, 0x00, 0x78, 0x7a, 0x2f, + 0x0c, 0x7e, 0x60, 0x34, 0x20, 0x60, 0x61, 0x04, 0xa1, 0x86, 0x00, 0x4b, + 0x00, 0x40, 0x7a, 0x22, 0xa1, 0x86, 0x00, 0x4c, 0x00, 0x40, 0x7a, 0x22, + 0xa1, 0x86, 0x00, 0x4d, 0x00, 0x40, 0x7a, 0x22, 0xa1, 0x86, 0x00, 0x4e, + 0x00, 0x40, 0x7a, 0x22, 0xa1, 0x86, 0x00, 0x52, 0x00, 0x40, 0x7a, 0x22, + 0x60, 0x10, 0x20, 0x68, 0x10, 0x78, 0x8d, 0x16, 0x10, 0x40, 0x13, 0x32, + 0x68, 0x53, 0x00, 0x03, 0x60, 0x07, 0x00, 0x85, 0x60, 0x03, 0x00, 0x0b, + 0x60, 0x1f, 0x00, 0x02, 0x10, 0x78, 0x5d, 0x8a, 0x10, 0x78, 0x62, 0xd1, + 0x0c, 0x7f, 0x00, 0x78, 0x7a, 0x35, 0x60, 0x34, 0x20, 0x68, 0x20, 0x01, + 0xa9, 0xa4, 0x20, 0x04, 0x68, 0x3e, 0x10, 0x78, 0x77, 0x2d, 0x02, 0x7f, + 0x0d, 0x7f, 0x0e, 0x7f, 0x00, 0x7c, 0x0d, 0x7e, 0x20, 0xa9, 0x00, 0x0e, + 0x2e, 0x98, 0x60, 0x10, 0x20, 0xa0, 0x53, 0xa3, 0xa1, 0xb6, 0x00, 0x15, + 0x00, 0xc0, 0x7a, 0x73, 0x60, 0x18, 0x20, 0x68, 0x15, 0x7e, 0x03, 0x7e, + 0x02, 0x7e, 0xae, 0x90, 0x00, 0x0c, 0xa2, 0x90, 0x00, 0x04, 0x20, 0xa9, + 0x00, 0x04, 0xad, 0x98, 0x00, 0x0a, 0x10, 0x78, 0x80, 0xde, 0x02, 0x7f, + 0x03, 0x7f, 0x15, 0x7f, 0x00, 0xc0, 0x7a, 0x76, 0x15, 0x7e, 0x03, 0x7e, + 0x02, 0x7e, 0xae, 0x90, 0x00, 0x0c, 0xa2, 0x90, 0x00, 0x08, 0x20, 0xa9, + 0x00, 0x04, 0xad, 0x98, 0x00, 0x06, 0x10, 0x78, 0x80, 0xde, 0x02, 0x7f, + 0x03, 0x7f, 0x15, 0x7f, 0x00, 0xc0, 0x7a, 0x76, 0x70, 0x38, 0x68, 0x0a, + 0x70, 0x3c, 0x68, 0x0e, 0x68, 0x00, 0xc0, 0x8d, 0x68, 0x02, 0x0d, 0x7f, + 0x00, 0x78, 0x77, 0xf8, 0x10, 0x78, 0x28, 0x80, 0x0c, 0x7e, 0x10, 0x78, + 0x76, 0xc7, 0x2f, 0x00, 0x60, 0x1a, 0x60, 0x13, 0x00, 0x00, 0x60, 0x1f, + 0x00, 0x01, 0x60, 0x07, 0x00, 0x01, 0x60, 0x03, 0x00, 0x01, 0x20, 0x01, + 0x00, 0x07, 0x10, 0x78, 0x45, 0x02, 0x10, 0x78, 0x45, 0x35, 0x10, 0x78, + 0x5d, 0xd7, 0x10, 0x78, 0x62, 0xd1, 0x0c, 0x7f, 0x00, 0x78, 0x7a, 0x73, + 0x21, 0x00, 0xa1, 0xb2, 0x00, 0x44, 0x10, 0xc8, 0x13, 0x32, 0xa1, 0xb2, + 0x00, 0x40, 0x00, 0xc8, 0x7a, 0xf7, 0x00, 0x79, 0x7a, 0x9d, 0x7a, 0xeb, + 0x7a, 0xdf, 0x7a, 0xeb, 0x7a, 0xeb, 0x7a, 0xeb, 0x7a, 0xeb, 0x7a, 0xdd, + 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xdd, + 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xdd, + 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xdd, + 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xdd, + 0x7a, 0xeb, 0x7a, 0xdd, 0x7a, 0xeb, 0x7a, 0xeb, 0x7a, 0xdd, 0x7a, 0xdd, + 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xeb, 0x7a, 0xdd, 0x7a, 0xdd, + 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xdd, + 0x7a, 0xdd, 0x7a, 0xeb, 0x7a, 0xeb, 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xdd, + 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xdd, 0x7a, 0xdd, + 0x7a, 0xeb, 0x7a, 0xdd, 0x7a, 0xdd, 0x10, 0x78, 0x13, 0x32, 0x60, 0x03, + 0x00, 0x01, 0x61, 0x06, 0x10, 0x78, 0x5d, 0xd7, 0x12, 0x7e, 0x20, 0x91, + 0x80, 0x00, 0x10, 0x78, 0x62, 0xd1, 0x12, 0x7f, 0x00, 0x7c, 0x60, 0x03, + 0x00, 0x01, 0x61, 0x06, 0x10, 0x78, 0x5d, 0xd7, 0x12, 0x7e, 0x20, 0x91, + 0x80, 0x00, 0x10, 0x78, 0x62, 0xd1, 0x12, 0x7f, 0x00, 0x7c, 0x26, 0x00, + 0x00, 0x79, 0x7a, 0xfa, 0x7a, 0xfe, 0x7a, 0xfe, 0x7a, 0xfe, 0x7a, 0xeb, + 0x10, 0x78, 0x13, 0x32, 0x60, 0x04, 0xa0, 0xb2, 0x00, 0x44, 0x10, 0xc8, + 0x13, 0x32, 0xa1, 0xb6, 0x00, 0x13, 0x00, 0xc0, 0x7b, 0x10, 0xa0, 0xb2, + 0x00, 0x40, 0x00, 0xc8, 0x7c, 0x79, 0x20, 0x08, 0x00, 0x79, 0x7b, 0xbf, + 0xa1, 0xb6, 0x00, 0x27, 0x00, 0xc0, 0x7b, 0x7c, 0x10, 0x78, 0x61, 0xcd, + 0x60, 0x04, 0x10, 0x78, 0x8e, 0xfc, 0x00, 0x40, 0x7b, 0x2d, 0x10, 0x78, + 0x8f, 0x10, 0x00, 0x40, 0x7b, 0x74, 0xa0, 0x8e, 0x00, 0x21, 0x00, 0x40, + 0x7b, 0x78, 0xa0, 0x8e, 0x00, 0x22, 0x00, 0x40, 0x7b, 0x74, 0xa0, 0x8e, + 0x00, 0x3d, 0x00, 0x40, 0x7b, 0x78, 0x00, 0x78, 0x7b, 0x6f, 0x10, 0x78, + 0x28, 0xa6, 0x20, 0x01, 0x00, 0x07, 0x10, 0x78, 0x45, 0x02, 0x60, 0x18, + 0xa0, 0x80, 0x00, 0x28, 0x20, 0x0c, 0x10, 0x78, 0x7c, 0x83, 0xa1, 0x86, + 0x00, 0x7e, 0x00, 0xc0, 0x7b, 0x42, 0x20, 0x01, 0xa7, 0x33, 0x20, 0x14, + 0xc2, 0x85, 0x22, 0x02, 0x01, 0x7e, 0x02, 0x7e, 0x03, 0x7e, 0x21, 0x10, + 0x02, 0x7e, 0x20, 0x19, 0x00, 0x28, 0x10, 0x78, 0x73, 0xd0, 0x02, 0x7f, + 0x10, 0x78, 0xa5, 0x01, 0x03, 0x7f, 0x02, 0x7f, 0x01, 0x7f, 0x01, 0x7e, + 0x02, 0x7e, 0x03, 0x7e, 0x21, 0x10, 0x20, 0x19, 0x00, 0x28, 0x10, 0x78, + 0x5f, 0x01, 0x07, 0x7e, 0x20, 0x39, 0x00, 0x00, 0x10, 0x78, 0x5e, 0x0a, + 0x0c, 0x7e, 0x60, 0x18, 0xa0, 0x65, 0x00, 0x40, 0x7b, 0x65, 0x10, 0x78, + 0x47, 0xe9, 0x0c, 0x7f, 0x2c, 0x08, 0x10, 0x78, 0x9f, 0x9b, 0x07, 0x7f, + 0x03, 0x7f, 0x02, 0x7f, 0x01, 0x7f, 0x10, 0x78, 0x45, 0x7f, 0x10, 0x78, + 0x77, 0x2d, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x7c, 0x10, 0x78, 0x7c, 0x83, + 0x00, 0x78, 0x7b, 0x6f, 0x10, 0x78, 0x7c, 0xa6, 0x00, 0x78, 0x7b, 0x6f, + 0xa1, 0x86, 0x00, 0x14, 0x00, 0xc0, 0x7b, 0x73, 0x10, 0x78, 0x61, 0xcd, + 0x10, 0x78, 0x28, 0x80, 0x10, 0x78, 0x8e, 0xfc, 0x00, 0xc0, 0x7b, 0x9b, + 0x10, 0x78, 0x28, 0xa6, 0x60, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x0c, + 0x10, 0x78, 0x7c, 0x83, 0xa1, 0x86, 0x00, 0x7e, 0x00, 0xc0, 0x7b, 0x99, + 0x20, 0x01, 0xa7, 0x33, 0x20, 0x0c, 0xc1, 0x85, 0x21, 0x02, 0x00, 0x78, + 0x7b, 0x6f, 0x10, 0x78, 0x8f, 0x10, 0x00, 0xc0, 0x7b, 0xa3, 0x10, 0x78, + 0x7c, 0x83, 0x00, 0x78, 0x7b, 0x6f, 0x60, 0x04, 0xa0, 0x8e, 0x00, 0x32, + 0x00, 0xc0, 0x7b, 0xb4, 0x0e, 0x7e, 0x0f, 0x7e, 0x20, 0x71, 0xa7, 0x82, + 0x20, 0x79, 0x00, 0x00, 0x10, 0x78, 0x2b, 0xd7, 0x0f, 0x7f, 0x0e, 0x7f, + 0x00, 0x78, 0x7b, 0x6f, 0x60, 0x04, 0xa0, 0x8e, 0x00, 0x21, 0x00, 0x40, + 0x7b, 0x9f, 0xa0, 0x8e, 0x00, 0x22, 0x10, 0x40, 0x7c, 0x83, 0x00, 0x78, + 0x7b, 0x6f, 0x7c, 0x01, 0x7c, 0x03, 0x7c, 0x07, 0x7c, 0x0b, 0x7c, 0x0f, + 0x7c, 0x13, 0x7b, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x7b, 0xff, + 0x7b, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x7b, 0xff, + 0x7b, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x7b, 0xff, + 0x7b, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x7b, 0xff, + 0x7b, 0xff, 0x7c, 0x17, 0x7c, 0x29, 0x7b, 0xff, 0x7c, 0x2b, 0x7c, 0x29, + 0x7b, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x7c, 0x29, + 0x7c, 0x29, 0x7b, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x7b, 0xff, + 0x7b, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x7c, 0x5c, 0x7c, 0x29, 0x7b, 0xff, + 0x7c, 0x23, 0x7b, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x7c, 0x25, 0x7b, 0xff, + 0x7b, 0xff, 0x7b, 0xff, 0x7c, 0x29, 0x7b, 0xff, 0x7b, 0xff, 0x10, 0x78, + 0x13, 0x32, 0x00, 0x78, 0x7c, 0x29, 0x20, 0x01, 0x00, 0x0b, 0x00, 0x78, + 0x7c, 0x36, 0x20, 0x01, 0x00, 0x03, 0x00, 0x78, 0x7c, 0x36, 0x20, 0x01, + 0x00, 0x05, 0x00, 0x78, 0x7c, 0x36, 0x20, 0x01, 0x00, 0x01, 0x00, 0x78, + 0x7c, 0x36, 0x20, 0x01, 0x00, 0x09, 0x00, 0x78, 0x7c, 0x36, 0x10, 0x78, + 0x61, 0xcd, 0x60, 0x03, 0x00, 0x05, 0x20, 0x01, 0xa9, 0xa4, 0x20, 0x04, + 0x60, 0x3e, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x78, 0x7c, 0x35, 0x00, 0x78, + 0x7c, 0x29, 0x00, 0x78, 0x7c, 0x29, 0x10, 0x78, 0x45, 0x02, 0x00, 0x78, + 0x7c, 0x6e, 0x10, 0x78, 0x61, 0xcd, 0x60, 0x03, 0x00, 0x04, 0x20, 0x01, + 0xa9, 0xa2, 0x20, 0x04, 0x60, 0x16, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x7c, + 0x10, 0x78, 0x45, 0x02, 0x10, 0x78, 0x61, 0xcd, 0x20, 0x01, 0xa9, 0xa4, + 0x20, 0x04, 0x60, 0x3e, 0x60, 0x03, 0x00, 0x02, 0x03, 0x7e, 0x20, 0x19, + 0xa7, 0x5d, 0x23, 0x04, 0xa0, 0x84, 0xff, 0x00, 0x00, 0xc0, 0x7c, 0x4d, + 0x20, 0x19, 0xa9, 0xa2, 0x23, 0x1c, 0x00, 0x78, 0x7c, 0x56, 0x80, 0x07, + 0xa0, 0x9a, 0x00, 0x04, 0x00, 0x48, 0x7c, 0x48, 0x80, 0x03, 0x80, 0x1b, + 0x83, 0x1b, 0xa3, 0x18, 0x63, 0x16, 0x03, 0x7f, 0x10, 0x78, 0x62, 0xd1, + 0x00, 0x78, 0x7c, 0x35, 0x0e, 0x7e, 0x0f, 0x7e, 0x20, 0x71, 0xa7, 0x82, + 0x20, 0x79, 0x00, 0x00, 0x10, 0x78, 0x2b, 0xd7, 0x0f, 0x7f, 0x0e, 0x7f, + 0x10, 0x78, 0x61, 0xcd, 0x10, 0x78, 0x77, 0x2d, 0x10, 0x78, 0x62, 0xd1, + 0x00, 0x78, 0x7c, 0x35, 0x10, 0x78, 0x61, 0xcd, 0x60, 0x03, 0x00, 0x02, + 0x20, 0x01, 0xa9, 0xa2, 0x20, 0x04, 0x60, 0x16, 0x10, 0x78, 0x62, 0xd1, + 0x00, 0x7c, 0x26, 0x00, 0x20, 0x08, 0x00, 0x79, 0x7c, 0x7d, 0x7c, 0x81, + 0x7c, 0x81, 0x7c, 0x81, 0x7c, 0x6e, 0x10, 0x78, 0x13, 0x32, 0x0e, 0x7e, + 0x10, 0x78, 0x8d, 0x16, 0x00, 0x40, 0x7c, 0x9f, 0x60, 0x10, 0x20, 0x70, + 0x70, 0x38, 0xd0, 0xfc, 0x00, 0x40, 0x7c, 0x9f, 0x70, 0x07, 0x00, 0x00, + 0x01, 0x7e, 0x60, 0x04, 0xa0, 0x8e, 0x00, 0x21, 0x00, 0x40, 0x7c, 0xa1, + 0xa0, 0x8e, 0x00, 0x3d, 0x00, 0x40, 0x7c, 0xa1, 0x01, 0x7f, 0x70, 0x37, + 0x01, 0x03, 0x70, 0x33, 0x01, 0x00, 0x0e, 0x7f, 0x00, 0x7c, 0x01, 0x7f, + 0x10, 0x78, 0x7c, 0xa6, 0x00, 0x78, 0x7c, 0x9f, 0x0e, 0x7e, 0xac, 0xf0, + 0x00, 0x04, 0x2e, 0x74, 0x70, 0x00, 0x20, 0x70, 0x70, 0x37, 0x01, 0x03, + 0x70, 0x23, 0x80, 0x01, 0x0e, 0x7f, 0x00, 0x7c, 0x0d, 0x7e, 0x66, 0x18, + 0x26, 0x68, 0x68, 0x04, 0xa0, 0x84, 0x00, 0xff, 0x0d, 0x7f, 0xa0, 0xb2, + 0x00, 0x0c, 0x10, 0xc8, 0x13, 0x32, 0x66, 0x04, 0xa6, 0xb6, 0x00, 0x43, + 0x00, 0xc0, 0x7c, 0xc6, 0x10, 0x78, 0x91, 0x44, 0x00, 0x78, 0x7d, 0x25, + 0x66, 0x04, 0xa6, 0xb6, 0x00, 0x33, 0x00, 0xc0, 0x7c, 0xcf, 0x10, 0x78, + 0x90, 0xe8, 0x00, 0x78, 0x7d, 0x25, 0x66, 0x04, 0xa6, 0xb6, 0x00, 0x28, + 0x00, 0xc0, 0x7c, 0xd8, 0x10, 0x78, 0x8f, 0x3f, 0x00, 0x78, 0x7d, 0x25, + 0x66, 0x04, 0xa6, 0xb6, 0x00, 0x29, 0x00, 0xc0, 0x7c, 0xe1, 0x10, 0x78, + 0x8f, 0x59, 0x00, 0x78, 0x7d, 0x25, 0x66, 0x04, 0xa6, 0xb6, 0x00, 0x1f, + 0x00, 0xc0, 0x7c, 0xea, 0x10, 0x78, 0x77, 0xde, 0x00, 0x78, 0x7d, 0x25, + 0x66, 0x04, 0xa6, 0xb6, 0x00, 0x00, 0x00, 0xc0, 0x7c, 0xf3, 0x10, 0x78, + 0x7a, 0x3b, 0x00, 0x78, 0x7d, 0x25, 0x66, 0x04, 0xa6, 0xb6, 0x00, 0x22, + 0x00, 0xc0, 0x7c, 0xfc, 0x10, 0x78, 0x78, 0x07, 0x00, 0x78, 0x7d, 0x25, + 0x66, 0x04, 0xa6, 0xb6, 0x00, 0x35, 0x00, 0xc0, 0x7d, 0x05, 0x10, 0x78, + 0x78, 0x43, 0x00, 0x78, 0x7d, 0x25, 0x66, 0x04, 0xa6, 0xb6, 0x00, 0x39, + 0x00, 0xc0, 0x7d, 0x0e, 0x10, 0x78, 0x79, 0xcc, 0x00, 0x78, 0x7d, 0x25, + 0x66, 0x04, 0xa6, 0xb6, 0x00, 0x3d, 0x00, 0xc0, 0x7d, 0x17, 0x10, 0x78, + 0x78, 0x23, 0x00, 0x78, 0x7d, 0x25, 0xa1, 0xb6, 0x00, 0x15, 0x00, 0xc0, + 0x7d, 0x1f, 0x10, 0x79, 0x7d, 0x2a, 0x00, 0x78, 0x7d, 0x25, 0xa1, 0xb6, + 0x00, 0x16, 0x00, 0xc0, 0x7d, 0x26, 0x10, 0x79, 0x7e, 0x7f, 0x00, 0x7c, + 0x10, 0x78, 0x77, 0x73, 0x00, 0x78, 0x7d, 0x25, 0x7d, 0x4e, 0x7d, 0x51, + 0x7d, 0x4e, 0x7d, 0x9c, 0x7d, 0x4e, 0x7e, 0x13, 0x7e, 0x8b, 0x7d, 0x4e, + 0x7d, 0x4e, 0x7e, 0x57, 0x7d, 0x4e, 0x7e, 0x6d, 0xa1, 0xb6, 0x00, 0x48, + 0x00, 0x40, 0x7d, 0x42, 0x20, 0xe1, 0x00, 0x05, 0x3d, 0x18, 0x3e, 0x20, + 0x2c, 0x10, 0x10, 0x78, 0x15, 0xfa, 0x00, 0x7c, 0x0e, 0x7e, 0xac, 0xf0, + 0x00, 0x04, 0x2e, 0x74, 0x70, 0x00, 0x20, 0x70, 0x70, 0x37, 0x01, 0x03, + 0x0e, 0x7f, 0x10, 0x78, 0x77, 0x2d, 0x00, 0x7c, 0x00, 0x05, 0x00, 0x05, + 0x00, 0x7c, 0x0e, 0x7e, 0x20, 0x71, 0xa7, 0x00, 0x70, 0x80, 0xa0, 0x86, + 0x00, 0x74, 0x00, 0xc0, 0x7d, 0x85, 0x10, 0x78, 0x9f, 0x6f, 0x00, 0xc0, + 0x7d, 0x77, 0x0d, 0x7e, 0x60, 0x18, 0x20, 0x68, 0x70, 0x30, 0xd0, 0x8c, + 0x00, 0x40, 0x7d, 0x6a, 0x68, 0x00, 0xd0, 0xbc, 0x00, 0x40, 0x7d, 0x6a, + 0xc0, 0xc5, 0x68, 0x02, 0x10, 0x78, 0x7d, 0x89, 0x0d, 0x7f, 0x20, 0x01, + 0x00, 0x06, 0x10, 0x78, 0x45, 0x02, 0x10, 0x78, 0x28, 0xa6, 0x10, 0x78, + 0x77, 0x2d, 0x00, 0x78, 0x7d, 0x87, 0x20, 0x01, 0x00, 0x0a, 0x10, 0x78, + 0x45, 0x02, 0x10, 0x78, 0x28, 0xa6, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, + 0x00, 0x01, 0x10, 0x78, 0x5d, 0xd7, 0x00, 0x78, 0x7d, 0x87, 0x10, 0x78, + 0x7d, 0xff, 0x0e, 0x7f, 0x00, 0x7c, 0x68, 0x00, 0xd0, 0x84, 0x00, 0x40, + 0x7d, 0x9b, 0x20, 0x01, 0x00, 0x00, 0x10, 0x78, 0x44, 0xee, 0x20, 0x69, + 0xa7, 0x52, 0x68, 0x04, 0xd0, 0xa4, 0x00, 0x40, 0x7d, 0x9b, 0x20, 0x01, + 0x00, 0x06, 0x10, 0x78, 0x45, 0x35, 0x00, 0x7c, 0x0d, 0x7e, 0x20, 0x11, + 0xa7, 0x20, 0x22, 0x04, 0xa0, 0x86, 0x00, 0x74, 0x00, 0xc0, 0x7d, 0xfb, + 0x60, 0x18, 0x20, 0x68, 0x6a, 0xa0, 0xa2, 0x86, 0x00, 0x7e, 0x00, 0xc0, + 0x7d, 0xaf, 0x10, 0x78, 0x7f, 0x9b, 0x00, 0x78, 0x7d, 0xfd, 0x10, 0x78, + 0x7f, 0x91, 0x60, 0x18, 0x20, 0x68, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x14, + 0xa2, 0x86, 0x00, 0x80, 0x00, 0xc0, 0x7d, 0xd3, 0x68, 0x13, 0x00, 0xff, + 0x68, 0x17, 0xff, 0xfc, 0x60, 0x10, 0xa0, 0x05, 0x00, 0x40, 0x7d, 0xc9, + 0x20, 0x68, 0x68, 0x07, 0x00, 0x00, 0x68, 0x37, 0x01, 0x03, 0x68, 0x33, + 0x02, 0x00, 0x20, 0x01, 0x00, 0x06, 0x10, 0x78, 0x45, 0x02, 0x10, 0x78, + 0x28, 0xa6, 0x10, 0x78, 0x77, 0x2d, 0x00, 0x78, 0x7d, 0xfd, 0x0e, 0x7e, + 0x20, 0x71, 0xa7, 0x33, 0x2e, 0x04, 0xd0, 0x9c, 0x00, 0x40, 0x7d, 0xee, + 0x20, 0x71, 0xac, 0x80, 0x71, 0x08, 0x72, 0x0c, 0xa1, 0x8c, 0x00, 0xff, + 0x00, 0xc0, 0x7d, 0xe6, 0xa2, 0x84, 0xff, 0x00, 0x00, 0x40, 0x7d, 0xee, + 0x60, 0x18, 0x20, 0x70, 0x70, 0xa0, 0xd0, 0xbc, 0x00, 0xc0, 0x7d, 0xee, + 0x71, 0x12, 0x72, 0x16, 0x0e, 0x7f, 0x20, 0x01, 0x00, 0x04, 0x10, 0x78, + 0x45, 0x02, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x03, 0x10, 0x78, + 0x5d, 0xd7, 0x00, 0x78, 0x7d, 0xfd, 0x10, 0x78, 0x7d, 0xff, 0x0d, 0x7f, + 0x00, 0x7c, 0x20, 0x01, 0x00, 0x07, 0x10, 0x78, 0x45, 0x02, 0x20, 0x01, + 0xa7, 0x00, 0x20, 0x04, 0xa0, 0x86, 0x00, 0x03, 0x00, 0xc0, 0x7e, 0x0e, + 0x20, 0x01, 0x00, 0x07, 0x10, 0x78, 0x45, 0x35, 0x10, 0x78, 0x28, 0xa6, + 0x10, 0x78, 0x77, 0x2d, 0x00, 0x7c, 0x0e, 0x7e, 0x20, 0x71, 0xa7, 0x00, + 0x70, 0x80, 0xa0, 0x86, 0x00, 0x14, 0x00, 0xc0, 0x7e, 0x51, 0x70, 0x00, + 0xa0, 0x86, 0x00, 0x03, 0x00, 0xc0, 0x7e, 0x26, 0x60, 0x10, 0xa0, 0x05, + 0x00, 0xc0, 0x7e, 0x26, 0x10, 0x78, 0x36, 0x99, 0x0d, 0x7e, 0x60, 0x18, + 0x20, 0x68, 0x10, 0x78, 0x46, 0x49, 0x10, 0x78, 0x7d, 0x89, 0x0d, 0x7f, + 0x10, 0x78, 0x80, 0x43, 0x00, 0xc0, 0x7e, 0x51, 0x0d, 0x7e, 0x60, 0x18, + 0x20, 0x68, 0x68, 0x90, 0x0d, 0x7f, 0xa0, 0x05, 0x00, 0x40, 0x7e, 0x51, + 0x20, 0x01, 0x00, 0x06, 0x10, 0x78, 0x45, 0x02, 0x0e, 0x7e, 0x60, 0x10, + 0xa0, 0x05, 0x00, 0x40, 0x7e, 0x4a, 0x20, 0x70, 0x70, 0x07, 0x00, 0x00, + 0x70, 0x37, 0x01, 0x03, 0x70, 0x33, 0x02, 0x00, 0x0e, 0x7f, 0x10, 0x78, + 0x28, 0xa6, 0x10, 0x78, 0x77, 0x2d, 0x00, 0x78, 0x7e, 0x55, 0x10, 0x78, + 0x7c, 0x83, 0x10, 0x78, 0x7d, 0xff, 0x0e, 0x7f, 0x00, 0x7c, 0x20, 0x11, + 0xa7, 0x20, 0x22, 0x04, 0xa0, 0x86, 0x00, 0x14, 0x00, 0xc0, 0x7e, 0x6a, + 0x20, 0x01, 0x00, 0x02, 0x10, 0x78, 0x45, 0x02, 0x60, 0x03, 0x00, 0x01, + 0x60, 0x07, 0x00, 0x01, 0x10, 0x78, 0x5d, 0xd7, 0x00, 0x78, 0x7e, 0x6c, + 0x10, 0x78, 0x7d, 0xff, 0x00, 0x7c, 0x20, 0x11, 0xa7, 0x20, 0x22, 0x04, + 0xa0, 0x86, 0x00, 0x04, 0x00, 0xc0, 0x7e, 0x7c, 0x20, 0x01, 0x00, 0x07, + 0x10, 0x78, 0x45, 0x02, 0x10, 0x78, 0x77, 0x2d, 0x00, 0x78, 0x7e, 0x7e, + 0x10, 0x78, 0x7d, 0xff, 0x00, 0x7c, 0x7d, 0x4e, 0x7e, 0x97, 0x7d, 0x4e, + 0x7e, 0xd2, 0x7d, 0x4e, 0x7f, 0x44, 0x7e, 0x8b, 0x7d, 0x4e, 0x7d, 0x4e, + 0x7f, 0x59, 0x7d, 0x4e, 0x7f, 0x6c, 0x66, 0x04, 0xa6, 0x86, 0x00, 0x03, + 0x00, 0x40, 0x7e, 0x13, 0xa6, 0xb6, 0x00, 0x1e, 0x00, 0xc0, 0x7e, 0x96, + 0x10, 0x78, 0x77, 0x2d, 0x00, 0x7c, 0x0d, 0x7e, 0x0c, 0x7e, 0x10, 0x78, + 0x7f, 0x7f, 0x00, 0xc0, 0x7e, 0xad, 0x20, 0x01, 0x00, 0x00, 0x10, 0x78, + 0x44, 0xee, 0x20, 0x01, 0x00, 0x02, 0x10, 0x78, 0x45, 0x02, 0x60, 0x03, + 0x00, 0x01, 0x60, 0x07, 0x00, 0x02, 0x10, 0x78, 0x5d, 0xd7, 0x00, 0x78, + 0x7e, 0xcf, 0x20, 0x09, 0xac, 0x8e, 0x21, 0x04, 0xa0, 0x86, 0x00, 0x09, + 0x00, 0xc0, 0x7e, 0xc2, 0x60, 0x18, 0x20, 0x68, 0x68, 0x40, 0xa0, 0x84, + 0x00, 0xff, 0xa0, 0x05, 0x00, 0x40, 0x7e, 0xcd, 0x80, 0x01, 0x68, 0x42, + 0x60, 0x17, 0x00, 0x0a, 0x00, 0x78, 0x7e, 0xcf, 0x20, 0x09, 0xac, 0x8f, + 0x21, 0x04, 0xa0, 0x84, 0xff, 0x00, 0xa0, 0x86, 0x19, 0x00, 0x00, 0xc0, + 0x7e, 0xcd, 0x00, 0x78, 0x7e, 0xa1, 0x10, 0x78, 0x7d, 0xff, 0x0c, 0x7f, + 0x0d, 0x7f, 0x00, 0x7c, 0x10, 0x78, 0x7f, 0x8e, 0x00, 0xc0, 0x7e, 0xe6, + 0x20, 0x01, 0x00, 0x00, 0x10, 0x78, 0x44, 0xee, 0x20, 0x01, 0x00, 0x02, + 0x10, 0x78, 0x45, 0x02, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x02, + 0x10, 0x78, 0x5d, 0xd7, 0x00, 0x78, 0x7f, 0x12, 0x10, 0x78, 0x7c, 0x83, + 0x20, 0x09, 0xac, 0x8e, 0x21, 0x34, 0xa6, 0xb4, 0x00, 0xff, 0xa6, 0x86, + 0x00, 0x05, 0x00, 0x40, 0x7f, 0x13, 0xa6, 0x86, 0x00, 0x0b, 0x00, 0x40, + 0x7f, 0x10, 0x20, 0x09, 0xac, 0x8f, 0x21, 0x04, 0xa0, 0x84, 0xff, 0x00, + 0x00, 0xc0, 0x7f, 0x00, 0xa6, 0x86, 0x00, 0x09, 0x00, 0x40, 0x7f, 0x13, + 0xa0, 0x86, 0x19, 0x00, 0x00, 0xc0, 0x7f, 0x10, 0xa6, 0x86, 0x00, 0x09, + 0x00, 0x40, 0x7f, 0x13, 0x20, 0x01, 0x00, 0x04, 0x10, 0x78, 0x45, 0x02, + 0x10, 0x78, 0x77, 0x2d, 0x00, 0x78, 0x7f, 0x12, 0x10, 0x78, 0x7d, 0xff, + 0x00, 0x7c, 0x0d, 0x7e, 0x60, 0x10, 0x20, 0x68, 0x10, 0x78, 0x8d, 0x16, + 0x00, 0x40, 0x7f, 0x21, 0x68, 0x38, 0xd0, 0xfc, 0x00, 0x40, 0x7f, 0x21, + 0x0d, 0x7f, 0x00, 0x78, 0x7f, 0x10, 0x60, 0x18, 0x20, 0x68, 0x68, 0x40, + 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x05, 0x00, 0x40, 0x7f, 0x32, 0x80, 0x01, + 0x68, 0x42, 0x60, 0x17, 0x00, 0x0a, 0x60, 0x07, 0x00, 0x16, 0x0d, 0x7f, + 0x00, 0x78, 0x7f, 0x12, 0x68, 0xa0, 0xa0, 0x86, 0x00, 0x7e, 0x00, 0xc0, + 0x7f, 0x3f, 0x0e, 0x7e, 0x20, 0x71, 0xa7, 0x00, 0x10, 0x78, 0x42, 0xb8, + 0x0e, 0x7f, 0x00, 0x78, 0x7f, 0x41, 0x10, 0x78, 0x28, 0x80, 0x0d, 0x7f, + 0x00, 0x78, 0x7f, 0x10, 0x10, 0x78, 0x7f, 0x8e, 0x00, 0xc0, 0x7f, 0x54, + 0x20, 0x01, 0x00, 0x04, 0x10, 0x78, 0x45, 0x02, 0x60, 0x03, 0x00, 0x01, + 0x60, 0x07, 0x00, 0x03, 0x10, 0x78, 0x5d, 0xd7, 0x00, 0x78, 0x7f, 0x58, + 0x10, 0x78, 0x7c, 0x83, 0x10, 0x78, 0x7d, 0xff, 0x00, 0x7c, 0x10, 0x78, + 0x7f, 0x8e, 0x00, 0xc0, 0x7f, 0x69, 0x20, 0x01, 0x00, 0x08, 0x10, 0x78, + 0x45, 0x02, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x05, 0x10, 0x78, + 0x5d, 0xd7, 0x00, 0x78, 0x7f, 0x6b, 0x10, 0x78, 0x7d, 0xff, 0x00, 0x7c, + 0x10, 0x78, 0x7f, 0x8e, 0x00, 0xc0, 0x7f, 0x7c, 0x20, 0x01, 0x00, 0x0a, + 0x10, 0x78, 0x45, 0x02, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x01, + 0x10, 0x78, 0x5d, 0xd7, 0x00, 0x78, 0x7f, 0x7e, 0x10, 0x78, 0x7d, 0xff, + 0x00, 0x7c, 0x20, 0x09, 0xac, 0x8e, 0x21, 0x04, 0xa0, 0x86, 0x00, 0x03, + 0x00, 0xc0, 0x7f, 0x8d, 0x20, 0x09, 0xac, 0x8f, 0x21, 0x04, 0xa0, 0x84, + 0xff, 0x00, 0xa0, 0x86, 0x2a, 0x00, 0x00, 0x7c, 0xa0, 0x85, 0x00, 0x01, + 0x00, 0x7c, 0x0c, 0x7e, 0x01, 0x7e, 0xac, 0x88, 0x00, 0x06, 0x21, 0x64, + 0x10, 0x78, 0x45, 0xd6, 0x01, 0x7f, 0x0c, 0x7f, 0x00, 0x7c, 0x0f, 0x7e, + 0x0e, 0x7e, 0x0d, 0x7e, 0x03, 0x7e, 0x01, 0x7e, 0x60, 0x18, 0x20, 0x68, + 0x20, 0x71, 0xa7, 0x33, 0x2e, 0x04, 0xa0, 0x85, 0x00, 0x03, 0x20, 0x72, + 0x10, 0x78, 0x80, 0x14, 0x00, 0x40, 0x7f, 0xd9, 0x20, 0x09, 0xa7, 0x33, + 0x21, 0x04, 0xc0, 0xcd, 0x20, 0x0a, 0x20, 0x01, 0xa7, 0x53, 0x20, 0x04, + 0xd0, 0xa4, 0x00, 0x40, 0x7f, 0xc2, 0xa0, 0x06, 0x20, 0x20, 0x20, 0x09, + 0x00, 0x2a, 0x10, 0x78, 0xa2, 0x2d, 0x20, 0x01, 0xa7, 0x0c, 0x20, 0x0c, + 0xc1, 0x95, 0x21, 0x02, 0x20, 0x19, 0x00, 0x2a, 0x20, 0x09, 0x00, 0x01, + 0x10, 0x78, 0x28, 0x4f, 0x20, 0x71, 0xa7, 0x00, 0x10, 0x78, 0x26, 0x77, + 0x0c, 0x7e, 0x15, 0x7e, 0x20, 0xa9, 0x00, 0x81, 0x20, 0x09, 0x00, 0x7f, + 0x10, 0x78, 0x29, 0x8e, 0x81, 0x08, 0x00, 0xf0, 0x7f, 0xd2, 0x15, 0x7f, + 0x0c, 0x7f, 0x10, 0x78, 0x7f, 0x91, 0x68, 0x13, 0x00, 0xff, 0x68, 0x17, + 0xff, 0xfe, 0x20, 0x71, 0xac, 0x80, 0x20, 0x79, 0x01, 0x00, 0x2e, 0x04, + 0xa0, 0x84, 0x00, 0xff, 0x20, 0x69, 0xa7, 0x1b, 0x20, 0x6a, 0x78, 0xe6, + 0x00, 0x7e, 0x8e, 0x70, 0x2e, 0x04, 0x20, 0x69, 0xa7, 0x1c, 0x20, 0x6a, + 0x78, 0xea, 0xa0, 0x84, 0xff, 0x00, 0x01, 0x7f, 0xa1, 0x05, 0x20, 0x09, + 0xa7, 0x26, 0x20, 0x0a, 0x20, 0x69, 0xac, 0x8e, 0x20, 0x71, 0xa9, 0x9e, + 0x68, 0x10, 0x20, 0x72, 0x68, 0x14, 0x70, 0x06, 0x68, 0x18, 0x70, 0x0a, + 0x68, 0x1c, 0x70, 0x0e, 0x10, 0x78, 0x90, 0x7e, 0x20, 0x01, 0x00, 0x06, + 0x10, 0x78, 0x45, 0x02, 0x10, 0x78, 0x28, 0xa6, 0x10, 0x78, 0x77, 0x2d, + 0x01, 0x7f, 0x03, 0x7f, 0x0d, 0x7f, 0x0e, 0x7f, 0x0f, 0x7f, 0x00, 0x7c, + 0x02, 0x7e, 0x03, 0x7e, 0x0e, 0x7e, 0x15, 0x7e, 0x20, 0x19, 0xa7, 0x26, + 0x23, 0x1c, 0x83, 0xff, 0x00, 0x40, 0x80, 0x3e, 0x20, 0x71, 0xac, 0x80, + 0x2e, 0x14, 0xa2, 0x94, 0x00, 0xff, 0x70, 0x04, 0xa0, 0x84, 0xff, 0x00, + 0xa2, 0x05, 0xa3, 0x06, 0x00, 0xc0, 0x80, 0x3e, 0x20, 0x11, 0xac, 0x96, + 0xad, 0x98, 0x00, 0x0a, 0x20, 0xa9, 0x00, 0x04, 0x10, 0x78, 0x80, 0xde, + 0x00, 0xc0, 0x80, 0x3e, 0x20, 0x11, 0xac, 0x9a, 0xad, 0x98, 0x00, 0x06, + 0x20, 0xa9, 0x00, 0x04, 0x10, 0x78, 0x80, 0xde, 0x00, 0xc0, 0x80, 0x3e, + 0x15, 0x7f, 0x0e, 0x7f, 0x03, 0x7f, 0x02, 0x7f, 0x00, 0x7c, 0x0e, 0x7e, + 0x20, 0x71, 0xac, 0x8c, 0x70, 0x04, 0xa0, 0x86, 0x00, 0x14, 0x00, 0xc0, + 0x80, 0x66, 0x70, 0x08, 0xa0, 0x86, 0x08, 0x00, 0x00, 0xc0, 0x80, 0x66, + 0x70, 0x0c, 0xd0, 0xec, 0x00, 0x40, 0x80, 0x64, 0xa0, 0x84, 0x0f, 0x00, + 0xa0, 0x86, 0x01, 0x00, 0x00, 0xc0, 0x80, 0x64, 0x70, 0x24, 0xd0, 0xa4, + 0x00, 0xc0, 0x80, 0x61, 0xd0, 0xac, 0x00, 0x40, 0x80, 0x64, 0xa0, 0x06, + 0x00, 0x78, 0x80, 0x66, 0xa0, 0x85, 0x00, 0x01, 0x0e, 0x7f, 0x00, 0x7c, + 0x0e, 0x7e, 0x0d, 0x7e, 0x0c, 0x7e, 0x07, 0x7e, 0x05, 0x7e, 0x04, 0x7e, + 0x02, 0x7e, 0x00, 0x7e, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x20, 0x29, + 0xa9, 0xba, 0x25, 0x2c, 0x20, 0x21, 0xa9, 0xc0, 0x24, 0x24, 0x20, 0x61, + 0xae, 0x00, 0x20, 0x71, 0xa7, 0x00, 0x72, 0x48, 0x70, 0x64, 0xa2, 0x02, + 0x00, 0xc8, 0x80, 0xcc, 0x10, 0x78, 0xa2, 0x52, 0x00, 0x40, 0x80, 0xc4, + 0x67, 0x1c, 0xa7, 0x86, 0x00, 0x01, 0x00, 0x40, 0x80, 0xc4, 0xa7, 0x86, + 0x00, 0x07, 0x00, 0x40, 0x80, 0xc4, 0x25, 0x00, 0xac, 0x06, 0x00, 0x40, + 0x80, 0xc4, 0x24, 0x00, 0xac, 0x06, 0x00, 0x40, 0x80, 0xc4, 0x0c, 0x7e, + 0x60, 0x00, 0xa0, 0x86, 0x00, 0x04, 0x00, 0xc0, 0x80, 0x9f, 0x10, 0x78, + 0x17, 0x57, 0xa7, 0x86, 0x00, 0x08, 0x00, 0xc0, 0x80, 0xae, 0x10, 0x78, + 0x8f, 0x10, 0x00, 0xc0, 0x80, 0xae, 0x0c, 0x7f, 0x10, 0x78, 0x7c, 0x83, + 0x10, 0x78, 0x8e, 0xd6, 0x00, 0x78, 0x80, 0xc4, 0x60, 0x10, 0x20, 0x68, + 0x10, 0x78, 0x8d, 0x16, 0x00, 0x40, 0x80, 0xc1, 0xa7, 0x86, 0x00, 0x03, + 0x00, 0xc0, 0x80, 0xd6, 0x68, 0x37, 0x01, 0x03, 0x6b, 0x4a, 0x68, 0x47, + 0x00, 0x00, 0x10, 0x78, 0x4a, 0x73, 0x10, 0x78, 0x8e, 0xc9, 0x10, 0x78, + 0x8e, 0xd6, 0x0c, 0x7f, 0xac, 0xe0, 0x00, 0x10, 0x70, 0x58, 0xac, 0x02, + 0x00, 0xc8, 0x80, 0xcc, 0x00, 0x78, 0x80, 0x7d, 0x12, 0x7f, 0x00, 0x7f, + 0x02, 0x7f, 0x04, 0x7f, 0x05, 0x7f, 0x07, 0x7f, 0x0c, 0x7f, 0x0d, 0x7f, + 0x0e, 0x7f, 0x00, 0x7c, 0xa7, 0x86, 0x00, 0x06, 0x00, 0xc0, 0x80, 0xb8, + 0x10, 0x78, 0xa1, 0xda, 0x00, 0x78, 0x80, 0xc1, 0x22, 0x0c, 0x23, 0x04, + 0xa1, 0x06, 0x00, 0xc0, 0x80, 0xe9, 0x82, 0x10, 0x83, 0x18, 0x00, 0xf0, + 0x80, 0xde, 0xa0, 0x06, 0x00, 0x7c, 0x23, 0x04, 0xa1, 0x02, 0x00, 0x48, + 0x80, 0xf1, 0x20, 0x01, 0x00, 0x01, 0x00, 0x78, 0x80, 0xf3, 0x20, 0x01, + 0x00, 0x00, 0xa1, 0x8d, 0x00, 0x01, 0x00, 0x7c, 0x60, 0x04, 0xa0, 0x8a, + 0x00, 0x44, 0x10, 0xc8, 0x13, 0x32, 0x10, 0x78, 0x8e, 0xfc, 0x00, 0x40, + 0x81, 0x05, 0x10, 0x78, 0x8f, 0x10, 0x00, 0x40, 0x81, 0x12, 0x00, 0x78, + 0x81, 0x0b, 0x10, 0x78, 0x28, 0xa6, 0x10, 0x78, 0x8f, 0x10, 0x00, 0x40, + 0x81, 0x12, 0x10, 0x78, 0x61, 0xcd, 0x10, 0x78, 0x77, 0x2d, 0x10, 0x78, + 0x62, 0xd1, 0x00, 0x7c, 0x10, 0x78, 0x7c, 0x83, 0x00, 0x78, 0x81, 0x0b, + 0xa1, 0x82, 0x00, 0x40, 0x00, 0x79, 0x81, 0x1a, 0x81, 0x2d, 0x81, 0x2d, + 0x81, 0x2d, 0x81, 0x2d, 0x81, 0x2d, 0x81, 0x2d, 0x81, 0x2d, 0x81, 0x2d, + 0x81, 0x2d, 0x81, 0x2d, 0x81, 0x2d, 0x81, 0x2f, 0x81, 0x2f, 0x81, 0x2f, + 0x81, 0x2f, 0x81, 0x2d, 0x81, 0x2d, 0x81, 0x2d, 0x81, 0x2f, 0x10, 0x78, + 0x13, 0x32, 0x60, 0x0b, 0xff, 0xff, 0x60, 0x03, 0x00, 0x01, 0x61, 0x06, + 0x10, 0x78, 0x5d, 0x8a, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x10, 0x78, + 0x62, 0xd1, 0x12, 0x7f, 0x00, 0x7c, 0xa1, 0x86, 0x00, 0x13, 0x00, 0xc0, + 0x81, 0x46, 0x60, 0x04, 0xa0, 0x82, 0x00, 0x40, 0x00, 0x79, 0x81, 0xd1, + 0xa1, 0x86, 0x00, 0x27, 0x00, 0xc0, 0x81, 0x68, 0x10, 0x78, 0x61, 0xcd, + 0x10, 0x78, 0x28, 0x80, 0x0d, 0x7e, 0x61, 0x10, 0x21, 0x68, 0x10, 0x78, + 0x8d, 0x16, 0x00, 0x40, 0x81, 0x62, 0x68, 0x37, 0x01, 0x03, 0x68, 0x4b, + 0x00, 0x29, 0x68, 0x47, 0x00, 0x00, 0x69, 0x4c, 0xc1, 0xc5, 0x69, 0x4e, + 0x10, 0x78, 0x4a, 0x73, 0x10, 0x78, 0x8e, 0xc9, 0x0d, 0x7f, 0x10, 0x78, + 0x77, 0x2d, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x7c, 0xa1, 0x86, 0x00, 0x14, + 0x00, 0xc0, 0x81, 0x71, 0x60, 0x04, 0xa0, 0x82, 0x00, 0x40, 0x00, 0x79, + 0x81, 0x99, 0xa1, 0x86, 0x00, 0x46, 0x00, 0x40, 0x81, 0x7d, 0xa1, 0x86, + 0x00, 0x45, 0x00, 0x40, 0x81, 0x7d, 0xa1, 0x86, 0x00, 0x47, 0x10, 0xc0, + 0x13, 0x32, 0x20, 0x01, 0x01, 0x09, 0x20, 0x04, 0xd0, 0x84, 0x00, 0x40, + 0x81, 0x96, 0x12, 0x7e, 0x20, 0x91, 0x22, 0x00, 0x00, 0x7e, 0x01, 0x7e, + 0x02, 0x7e, 0x10, 0x78, 0x5c, 0x56, 0x02, 0x7f, 0x01, 0x7f, 0x00, 0x7f, + 0x12, 0x7f, 0x60, 0x00, 0xa0, 0x86, 0x00, 0x02, 0x00, 0xc0, 0x81, 0x96, + 0x00, 0x78, 0x82, 0x0e, 0x10, 0x78, 0x77, 0x73, 0x00, 0x7c, 0x81, 0xae, + 0x81, 0xac, 0x81, 0xac, 0x81, 0xac, 0x81, 0xac, 0x81, 0xac, 0x81, 0xac, + 0x81, 0xac, 0x81, 0xac, 0x81, 0xac, 0x81, 0xac, 0x81, 0xca, 0x81, 0xca, + 0x81, 0xca, 0x81, 0xca, 0x81, 0xac, 0x81, 0xca, 0x81, 0xac, 0x81, 0xca, + 0x10, 0x78, 0x13, 0x32, 0x10, 0x78, 0x61, 0xcd, 0x0d, 0x7e, 0x61, 0x10, + 0x21, 0x68, 0x10, 0x78, 0x8d, 0x16, 0x00, 0x40, 0x81, 0xc4, 0x68, 0x37, + 0x01, 0x03, 0x68, 0x4b, 0x00, 0x06, 0x68, 0x47, 0x00, 0x00, 0x68, 0x50, + 0xc0, 0xec, 0x68, 0x52, 0x10, 0x78, 0x4a, 0x73, 0x10, 0x78, 0x8e, 0xc9, + 0x0d, 0x7f, 0x10, 0x78, 0x77, 0x2d, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x7c, + 0x10, 0x78, 0x61, 0xcd, 0x10, 0x78, 0x77, 0x2d, 0x10, 0x78, 0x62, 0xd1, + 0x00, 0x7c, 0x81, 0xe6, 0x81, 0xe4, 0x81, 0xe4, 0x81, 0xe4, 0x81, 0xe4, + 0x81, 0xe4, 0x81, 0xe4, 0x81, 0xe4, 0x81, 0xe4, 0x81, 0xe4, 0x81, 0xe4, + 0x81, 0xf8, 0x81, 0xf8, 0x81, 0xf8, 0x81, 0xf8, 0x81, 0xe4, 0x82, 0x07, + 0x81, 0xe4, 0x81, 0xf8, 0x10, 0x78, 0x13, 0x32, 0x10, 0x78, 0x61, 0xcd, + 0x20, 0x01, 0xa9, 0xa4, 0x20, 0x04, 0x60, 0x3e, 0x60, 0x03, 0x00, 0x02, + 0x10, 0x78, 0x62, 0xd1, 0x60, 0x10, 0xa0, 0x88, 0x00, 0x13, 0x21, 0x04, + 0xa0, 0x85, 0x04, 0x00, 0x20, 0x0a, 0x00, 0x7c, 0x10, 0x78, 0x61, 0xcd, + 0x20, 0x01, 0xa9, 0xa2, 0x20, 0x04, 0x60, 0x16, 0x20, 0x01, 0xa9, 0xa4, + 0x20, 0x04, 0x60, 0x3e, 0x60, 0x03, 0x00, 0x0f, 0x10, 0x78, 0x62, 0xd1, + 0x00, 0x7c, 0x10, 0x78, 0x61, 0xcd, 0x10, 0x78, 0x77, 0x2d, 0x10, 0x78, + 0x62, 0xd1, 0x00, 0x7c, 0xa1, 0x82, 0x00, 0x40, 0x00, 0x79, 0x82, 0x12, + 0x82, 0x25, 0x82, 0x25, 0x82, 0x25, 0x82, 0x25, 0x82, 0x25, 0x82, 0x27, + 0x83, 0x31, 0x83, 0x63, 0x82, 0x25, 0x82, 0x25, 0x82, 0x25, 0x82, 0x25, + 0x82, 0x25, 0x82, 0x25, 0x82, 0x25, 0x82, 0x25, 0x82, 0x25, 0x82, 0x25, + 0x82, 0x25, 0x10, 0x78, 0x13, 0x32, 0x0e, 0x7e, 0x0d, 0x7e, 0x60, 0x3f, + 0x00, 0x00, 0x20, 0x71, 0xac, 0x80, 0x71, 0x24, 0x61, 0x0a, 0x20, 0x71, + 0xac, 0x8c, 0x61, 0x10, 0x21, 0x68, 0x76, 0x14, 0xa6, 0xb4, 0x0f, 0xff, + 0x86, 0xff, 0x00, 0x40, 0x82, 0xf0, 0xa6, 0x8c, 0x0c, 0x00, 0x00, 0x40, + 0x82, 0x65, 0x0f, 0x7e, 0x2c, 0x78, 0x10, 0x78, 0x49, 0x63, 0x0f, 0x7f, + 0x00, 0x40, 0x82, 0x61, 0x68, 0x4c, 0xd0, 0xac, 0x00, 0x40, 0x82, 0x61, + 0x60, 0x24, 0xd0, 0xdc, 0x00, 0xc0, 0x82, 0x61, 0x68, 0x50, 0xd0, 0xbc, + 0x00, 0xc0, 0x82, 0x61, 0x73, 0x18, 0x68, 0x14, 0xa3, 0x06, 0x00, 0xc0, + 0x83, 0x08, 0x73, 0x1c, 0x68, 0x10, 0xa3, 0x1e, 0x00, 0x40, 0x82, 0x61, + 0xd6, 0xd4, 0x00, 0x40, 0x83, 0x08, 0x6b, 0x14, 0xa3, 0x05, 0x00, 0xc0, + 0x83, 0x08, 0x73, 0x18, 0x6b, 0x62, 0x73, 0x1c, 0x6b, 0x5e, 0xa6, 0x8c, + 0x00, 0xff, 0xa1, 0x86, 0x00, 0x02, 0x00, 0x40, 0x82, 0x98, 0xa1, 0x86, + 0x00, 0x28, 0x00, 0xc0, 0x82, 0x75, 0x10, 0x78, 0x8e, 0xea, 0x68, 0x4b, + 0x00, 0x1c, 0x00, 0x78, 0x82, 0x9a, 0xd6, 0xdc, 0x00, 0x40, 0x82, 0x91, + 0x68, 0x4b, 0x00, 0x15, 0x68, 0x4c, 0xd0, 0xac, 0x00, 0x40, 0x82, 0x8f, + 0x69, 0x14, 0x6a, 0x10, 0x21, 0x00, 0xa2, 0x05, 0x00, 0x40, 0x82, 0x8f, + 0x70, 0x18, 0xa1, 0x06, 0x00, 0xc0, 0x82, 0x8c, 0x70, 0x1c, 0xa2, 0x06, + 0x00, 0x40, 0x82, 0x8f, 0x69, 0x62, 0x6a, 0x5e, 0xc6, 0xdc, 0x00, 0x78, + 0x82, 0x9a, 0xd6, 0xd4, 0x00, 0x40, 0x82, 0x98, 0x68, 0x4b, 0x00, 0x07, + 0x00, 0x78, 0x82, 0x9a, 0x68, 0x4b, 0x00, 0x00, 0x68, 0x37, 0x01, 0x03, + 0x6e, 0x46, 0xa0, 0x1e, 0xd6, 0xc4, 0x00, 0x40, 0x82, 0xc3, 0xa6, 0x86, + 0x01, 0x00, 0x00, 0xc0, 0x82, 0xae, 0x20, 0x01, 0xac, 0x99, 0x20, 0x04, + 0xa0, 0x05, 0x00, 0xc0, 0x82, 0xae, 0xc6, 0xc4, 0x00, 0x78, 0x82, 0x36, + 0x73, 0x28, 0x73, 0x2c, 0x6b, 0x56, 0x83, 0xff, 0x00, 0x40, 0x82, 0xc3, + 0xa3, 0x8a, 0x00, 0x09, 0x00, 0x48, 0x82, 0xba, 0x20, 0x19, 0x00, 0x08, + 0x03, 0x7e, 0x23, 0x08, 0x20, 0x19, 0xac, 0x98, 0xad, 0x90, 0x00, 0x19, + 0x10, 0x78, 0x89, 0xf2, 0x03, 0x7f, 0xd6, 0xcc, 0x00, 0x40, 0x83, 0x1e, + 0x71, 0x24, 0x69, 0x5a, 0x81, 0xff, 0x00, 0x40, 0x83, 0x1e, 0xa1, 0x92, + 0x00, 0x21, 0x00, 0xc8, 0x82, 0xdc, 0x20, 0x71, 0xac, 0x98, 0x83, 0x1c, + 0x23, 0x00, 0xae, 0x18, 0xad, 0x90, 0x00, 0x1d, 0x10, 0x78, 0x89, 0xf2, + 0x10, 0x78, 0x92, 0x04, 0x00, 0x78, 0x83, 0x1e, 0x68, 0x38, 0xd0, 0xfc, + 0x00, 0x40, 0x82, 0xe5, 0x20, 0x09, 0x00, 0x20, 0x69, 0x5a, 0x00, 0x78, + 0x82, 0xcf, 0x0f, 0x7e, 0x2d, 0x78, 0x10, 0x78, 0x89, 0x8a, 0x0f, 0x7f, + 0x10, 0x78, 0x92, 0x04, 0x10, 0x78, 0x89, 0xdf, 0x00, 0x78, 0x83, 0x20, + 0x0f, 0x7e, 0x2c, 0x78, 0x10, 0x78, 0x49, 0x63, 0x0f, 0x7f, 0x00, 0x40, + 0x83, 0x0e, 0x68, 0x4c, 0xd0, 0xac, 0x00, 0x40, 0x83, 0x0e, 0x60, 0x24, + 0xd0, 0xdc, 0x00, 0xc0, 0x83, 0x0e, 0x68, 0x50, 0xd0, 0xbc, 0x00, 0xc0, + 0x83, 0x0e, 0x68, 0x10, 0x69, 0x14, 0xa1, 0x05, 0x00, 0x40, 0x83, 0x0e, + 0x10, 0x78, 0x8f, 0xcf, 0x0d, 0x7f, 0x0e, 0x7f, 0x00, 0x78, 0x83, 0x30, + 0x68, 0x4b, 0x00, 0x00, 0x68, 0x37, 0x01, 0x03, 0x6e, 0x46, 0x68, 0x4c, + 0xd0, 0xac, 0x00, 0x40, 0x83, 0x1e, 0x68, 0x10, 0x69, 0x14, 0xa1, 0x15, + 0x00, 0x40, 0x83, 0x1e, 0x10, 0x78, 0x84, 0xe2, 0x10, 0x78, 0x4a, 0x73, + 0x62, 0x18, 0x22, 0x68, 0x6a, 0x3c, 0x82, 0xff, 0x00, 0x40, 0x83, 0x28, + 0x82, 0x11, 0x6a, 0x3e, 0x10, 0x78, 0x8f, 0x99, 0x0d, 0x7f, 0x0e, 0x7f, + 0x00, 0xc0, 0x83, 0x30, 0x10, 0x78, 0x77, 0x2d, 0x00, 0x7c, 0x0f, 0x7e, + 0x60, 0x03, 0x00, 0x03, 0x20, 0x79, 0xac, 0x8c, 0x7c, 0x04, 0x7b, 0x00, + 0x7e, 0x0c, 0x7d, 0x08, 0x60, 0x10, 0x20, 0x78, 0x78, 0x4c, 0xd0, 0xac, + 0x00, 0x40, 0x83, 0x48, 0x60, 0x03, 0x00, 0x02, 0x0f, 0x7f, 0x00, 0x7c, + 0x21, 0x30, 0x22, 0x28, 0x00, 0x78, 0x83, 0x54, 0x24, 0x00, 0x79, 0x7c, + 0xa1, 0x0a, 0x23, 0x00, 0x7a, 0x80, 0xa2, 0x13, 0x26, 0x00, 0xa1, 0x02, + 0x25, 0x00, 0xa2, 0x03, 0x00, 0x48, 0x83, 0x44, 0x7c, 0x12, 0x7b, 0x16, + 0x7e, 0x0a, 0x7d, 0x0e, 0x0f, 0x7f, 0x60, 0x3f, 0x00, 0x00, 0x2c, 0x10, + 0x10, 0x78, 0x1c, 0xf0, 0x10, 0x78, 0x5d, 0xf6, 0x10, 0x78, 0x63, 0x9b, + 0x00, 0x7c, 0x20, 0x01, 0xa9, 0xa4, 0x20, 0x04, 0x60, 0x3e, 0x60, 0x03, + 0x00, 0x04, 0x61, 0x10, 0x20, 0xe1, 0x00, 0x05, 0x3d, 0x18, 0x3e, 0x20, + 0x2c, 0x10, 0x10, 0x78, 0x15, 0xfa, 0x00, 0x7c, 0xa1, 0x82, 0x00, 0x40, + 0x00, 0x79, 0x83, 0x76, 0x83, 0x89, 0x83, 0x89, 0x83, 0x89, 0x83, 0x89, + 0x83, 0x89, 0x83, 0x8b, 0x84, 0x31, 0x83, 0x89, 0x83, 0x89, 0x84, 0x47, + 0x84, 0xb8, 0x83, 0x89, 0x83, 0x89, 0x83, 0x89, 0x83, 0x89, 0x84, 0xc7, + 0x83, 0x89, 0x83, 0x89, 0x83, 0x89, 0x10, 0x78, 0x13, 0x32, 0x07, 0x7e, + 0x0f, 0x7e, 0x0e, 0x7e, 0x0d, 0x7e, 0x20, 0x71, 0xac, 0x8c, 0x61, 0x10, + 0x21, 0x78, 0x76, 0x14, 0xa6, 0xb4, 0x0f, 0xff, 0x7e, 0x46, 0x7f, 0x4c, + 0xc7, 0xe5, 0x7f, 0x4e, 0x62, 0x18, 0x22, 0x68, 0x6a, 0x3c, 0x82, 0xff, + 0x00, 0x40, 0x83, 0xa2, 0x82, 0x11, 0x6a, 0x3e, 0x86, 0xff, 0x00, 0x40, + 0x84, 0x2c, 0xa6, 0x94, 0xff, 0x00, 0xa2, 0x84, 0x0c, 0x00, 0x00, 0x40, + 0x83, 0xaf, 0x70, 0x18, 0x78, 0x62, 0x70, 0x1c, 0x78, 0x5e, 0xa2, 0x84, + 0x03, 0x00, 0x00, 0x40, 0x84, 0x2c, 0x10, 0x78, 0x13, 0x8b, 0x10, 0x40, + 0x13, 0x32, 0x2d, 0x00, 0x78, 0x4a, 0x7f, 0x4c, 0xc7, 0xcd, 0x7f, 0x4e, + 0x68, 0x37, 0x01, 0x03, 0x78, 0x38, 0x68, 0x3a, 0x78, 0x3c, 0x68, 0x3e, + 0x78, 0x40, 0x68, 0x42, 0x6e, 0x46, 0xa6, 0x8c, 0x0c, 0x00, 0x00, 0x40, + 0x83, 0xcd, 0x73, 0x18, 0x6b, 0x62, 0x73, 0x1c, 0x6b, 0x5e, 0xa6, 0x8c, + 0x00, 0xff, 0xa1, 0x86, 0x00, 0x02, 0x00, 0x40, 0x83, 0xe9, 0xa1, 0x86, + 0x00, 0x28, 0x00, 0xc0, 0x83, 0xdb, 0x68, 0x4b, 0x00, 0x1c, 0x00, 0x78, + 0x83, 0xeb, 0xd6, 0xdc, 0x00, 0x40, 0x83, 0xe2, 0x68, 0x4b, 0x00, 0x15, + 0x00, 0x78, 0x83, 0xeb, 0xd6, 0xd4, 0x00, 0x40, 0x83, 0xe9, 0x68, 0x4b, + 0x00, 0x07, 0x00, 0x78, 0x83, 0xeb, 0x68, 0x4b, 0x00, 0x00, 0x6f, 0x4e, + 0x78, 0x50, 0x68, 0x52, 0x78, 0x54, 0x68, 0x56, 0xa0, 0x1e, 0xd6, 0xc4, + 0x00, 0x40, 0x84, 0x09, 0x73, 0x28, 0x73, 0x2c, 0x6b, 0x56, 0x83, 0xff, + 0x00, 0x40, 0x84, 0x09, 0xa3, 0x8a, 0x00, 0x09, 0x00, 0x48, 0x84, 0x00, + 0x20, 0x19, 0x00, 0x08, 0x03, 0x7e, 0x23, 0x08, 0x20, 0x19, 0xac, 0x98, + 0xad, 0x90, 0x00, 0x19, 0x10, 0x78, 0x89, 0xf2, 0x03, 0x7f, 0xd6, 0xcc, + 0x00, 0x40, 0x84, 0x2c, 0x71, 0x24, 0x69, 0x5a, 0x81, 0xff, 0x00, 0x40, + 0x84, 0x2c, 0xa1, 0x92, 0x00, 0x21, 0x00, 0xc8, 0x84, 0x20, 0x20, 0x71, + 0xac, 0x98, 0x83, 0x1c, 0x23, 0x00, 0xae, 0x18, 0xad, 0x90, 0x00, 0x1d, + 0x10, 0x78, 0x89, 0xf2, 0x00, 0x78, 0x84, 0x2c, 0x78, 0x38, 0xd0, 0xfc, + 0x00, 0x40, 0x84, 0x29, 0x20, 0x09, 0x00, 0x20, 0x69, 0x5a, 0x00, 0x78, + 0x84, 0x15, 0x2d, 0x78, 0x10, 0x78, 0x89, 0x8a, 0x0d, 0x7f, 0x0e, 0x7f, + 0x0f, 0x7f, 0x07, 0x7f, 0x00, 0x7c, 0x0f, 0x7e, 0x60, 0x03, 0x00, 0x03, + 0x20, 0x79, 0xac, 0x8c, 0x7c, 0x04, 0x7b, 0x00, 0x7e, 0x0c, 0x7d, 0x08, + 0x60, 0x10, 0x20, 0x78, 0x7c, 0x12, 0x7b, 0x16, 0x7e, 0x0a, 0x7d, 0x0e, + 0x0f, 0x7f, 0x2c, 0x10, 0x10, 0x78, 0x1c, 0xf0, 0x10, 0x78, 0x6d, 0xf4, + 0x00, 0x7c, 0x0d, 0x7e, 0x0f, 0x7e, 0x2c, 0x78, 0x10, 0x78, 0x49, 0x63, + 0x0f, 0x7f, 0x00, 0x40, 0x84, 0x53, 0x20, 0x01, 0xa9, 0xa4, 0x20, 0x04, + 0x60, 0x3e, 0x60, 0x03, 0x00, 0x02, 0x10, 0x78, 0x62, 0x7a, 0x10, 0x78, + 0x63, 0x9b, 0x61, 0x10, 0x21, 0x68, 0x69, 0x4c, 0xd1, 0xe4, 0x00, 0x40, + 0x84, 0xb6, 0xd1, 0xcc, 0x00, 0x40, 0x84, 0x8d, 0x69, 0x48, 0x68, 0x38, + 0xd0, 0xfc, 0x00, 0x40, 0x84, 0x85, 0x01, 0x7e, 0x68, 0x4c, 0x00, 0x7e, + 0x68, 0x50, 0x00, 0x7e, 0xad, 0x90, 0x00, 0x0d, 0xa1, 0x98, 0x00, 0x0d, + 0x20, 0x09, 0x00, 0x20, 0x15, 0x7e, 0x21, 0xa8, 0x23, 0x04, 0x20, 0x12, + 0x83, 0x18, 0x82, 0x10, 0x00, 0xf0, 0x84, 0x74, 0x15, 0x7f, 0x00, 0x7f, + 0x68, 0x52, 0x00, 0x7f, 0x68, 0x4e, 0x01, 0x7f, 0x21, 0x68, 0x10, 0x78, + 0x13, 0xb4, 0x00, 0x78, 0x84, 0xb0, 0x01, 0x7e, 0x10, 0x78, 0x13, 0xb4, + 0x0d, 0x7f, 0x10, 0x78, 0x89, 0xdf, 0x00, 0x78, 0x84, 0xb0, 0x68, 0x37, + 0x01, 0x03, 0x69, 0x44, 0xa1, 0x84, 0x00, 0xff, 0xa0, 0xb6, 0x00, 0x02, + 0x00, 0x40, 0x84, 0xac, 0xa0, 0x86, 0x00, 0x28, 0x00, 0xc0, 0x84, 0x9e, + 0x68, 0x4b, 0x00, 0x1c, 0x00, 0x78, 0x84, 0xae, 0xd1, 0xdc, 0x00, 0x40, + 0x84, 0xa5, 0x68, 0x4b, 0x00, 0x15, 0x00, 0x78, 0x84, 0xae, 0xd1, 0xd4, + 0x00, 0x40, 0x84, 0xac, 0x68, 0x4b, 0x00, 0x07, 0x00, 0x78, 0x84, 0xae, + 0x68, 0x4b, 0x00, 0x00, 0x10, 0x78, 0x4a, 0x73, 0x10, 0x78, 0x8f, 0x99, + 0x00, 0xc0, 0x84, 0xb6, 0x10, 0x78, 0x77, 0x2d, 0x0d, 0x7f, 0x00, 0x7c, + 0x20, 0x19, 0x00, 0x01, 0x10, 0x78, 0x70, 0x58, 0x60, 0x03, 0x00, 0x02, + 0x20, 0x01, 0xa9, 0xa4, 0x20, 0x04, 0x60, 0x3e, 0x10, 0x78, 0x62, 0x7a, + 0x10, 0x78, 0x63, 0x9b, 0x00, 0x7c, 0x10, 0x78, 0x62, 0x7a, 0x10, 0x78, + 0x28, 0x80, 0x0d, 0x7e, 0x61, 0x10, 0x21, 0x68, 0x10, 0x78, 0x8d, 0x16, + 0x00, 0x40, 0x84, 0xdc, 0x68, 0x37, 0x01, 0x03, 0x68, 0x4b, 0x00, 0x29, + 0x68, 0x47, 0x00, 0x00, 0x10, 0x78, 0x4a, 0x73, 0x10, 0x78, 0x8e, 0xc9, + 0x0d, 0x7f, 0x10, 0x78, 0x77, 0x2d, 0x10, 0x78, 0x63, 0x9b, 0x00, 0x7c, + 0x68, 0x4b, 0x00, 0x15, 0xd1, 0xfc, 0x00, 0x40, 0x84, 0xee, 0x68, 0x4b, + 0x00, 0x07, 0x80, 0x02, 0x80, 0x00, 0x81, 0x0a, 0xa1, 0x89, 0x00, 0x00, + 0x69, 0x62, 0x68, 0x5e, 0x00, 0x7c, 0xa1, 0x82, 0x00, 0x40, 0x00, 0x79, + 0x84, 0xf5, 0x85, 0x08, 0x85, 0x08, 0x85, 0x08, 0x85, 0x08, 0x85, 0x08, + 0x85, 0x0a, 0x85, 0x08, 0x85, 0xe0, 0x85, 0xec, 0x85, 0x08, 0x85, 0x08, + 0x85, 0x08, 0x85, 0x08, 0x85, 0x08, 0x85, 0x08, 0x85, 0x08, 0x85, 0x08, + 0x85, 0x08, 0x85, 0x08, 0x10, 0x78, 0x13, 0x32, 0x07, 0x7e, 0x0f, 0x7e, + 0x0e, 0x7e, 0x0d, 0x7e, 0x20, 0x71, 0xac, 0x8c, 0x61, 0x10, 0x21, 0x78, + 0x76, 0x14, 0xa6, 0xb4, 0x0f, 0xff, 0x0f, 0x7e, 0x2c, 0x78, 0x10, 0x78, + 0x49, 0x63, 0x0f, 0x7f, 0x00, 0x40, 0x85, 0x28, 0xa6, 0x84, 0x00, 0xff, + 0x00, 0xc0, 0x85, 0x28, 0x60, 0x24, 0xd0, 0xf4, 0x00, 0x40, 0x85, 0x28, + 0x10, 0x78, 0x8f, 0xcf, 0x00, 0x78, 0x85, 0xdb, 0x7e, 0x46, 0x7f, 0x4c, + 0xc7, 0xe5, 0x7f, 0x4e, 0x62, 0x18, 0x22, 0x68, 0x6a, 0x3c, 0x82, 0xff, + 0x00, 0x40, 0x85, 0x34, 0x82, 0x11, 0x6a, 0x3e, 0x86, 0xff, 0x00, 0x40, + 0x85, 0xd0, 0xa6, 0x94, 0xff, 0x00, 0xa2, 0x84, 0x0c, 0x00, 0x00, 0x40, + 0x85, 0x41, 0x70, 0x18, 0x78, 0x62, 0x70, 0x1c, 0x78, 0x5e, 0xa2, 0x84, + 0x03, 0x00, 0x00, 0x40, 0x85, 0xcd, 0xa6, 0x86, 0x01, 0x00, 0x00, 0xc0, + 0x85, 0x53, 0x20, 0x01, 0xac, 0x99, 0x20, 0x04, 0xa0, 0x05, 0x00, 0xc0, + 0x85, 0x53, 0xc6, 0xc4, 0x7e, 0x46, 0x00, 0x78, 0x85, 0x34, 0x10, 0x78, + 0x13, 0x8b, 0x10, 0x40, 0x13, 0x32, 0x2d, 0x00, 0x78, 0x4a, 0x7f, 0x4c, + 0xa7, 0xbd, 0x02, 0x00, 0x7f, 0x4e, 0x68, 0x37, 0x01, 0x03, 0x78, 0x38, + 0x68, 0x3a, 0x78, 0x3c, 0x68, 0x3e, 0x78, 0x40, 0x68, 0x42, 0x6e, 0x46, + 0xa6, 0x8c, 0x0c, 0x00, 0x00, 0x40, 0x85, 0x6e, 0x73, 0x18, 0x6b, 0x62, + 0x73, 0x1c, 0x6b, 0x5e, 0xa6, 0x8c, 0x00, 0xff, 0xa1, 0x86, 0x00, 0x02, + 0x00, 0x40, 0x85, 0x8a, 0xa1, 0x86, 0x00, 0x28, 0x00, 0xc0, 0x85, 0x7c, + 0x68, 0x4b, 0x00, 0x1c, 0x00, 0x78, 0x85, 0x8c, 0xd6, 0xdc, 0x00, 0x40, + 0x85, 0x83, 0x68, 0x4b, 0x00, 0x15, 0x00, 0x78, 0x85, 0x8c, 0xd6, 0xd4, + 0x00, 0x40, 0x85, 0x8a, 0x68, 0x4b, 0x00, 0x07, 0x00, 0x78, 0x85, 0x8c, + 0x68, 0x4b, 0x00, 0x00, 0x6f, 0x4e, 0x78, 0x50, 0x68, 0x52, 0x78, 0x54, + 0x68, 0x56, 0xa0, 0x1e, 0xd6, 0xc4, 0x00, 0x40, 0x85, 0xaa, 0x73, 0x28, + 0x73, 0x2c, 0x6b, 0x56, 0x83, 0xff, 0x00, 0x40, 0x85, 0xaa, 0xa3, 0x8a, + 0x00, 0x09, 0x00, 0x48, 0x85, 0xa1, 0x20, 0x19, 0x00, 0x08, 0x03, 0x7e, + 0x23, 0x08, 0x20, 0x19, 0xac, 0x98, 0xad, 0x90, 0x00, 0x19, 0x10, 0x78, + 0x89, 0xf2, 0x03, 0x7f, 0xd6, 0xcc, 0x00, 0x40, 0x85, 0xcd, 0x71, 0x24, + 0x69, 0x5a, 0x81, 0xff, 0x00, 0x40, 0x85, 0xcd, 0xa1, 0x92, 0x00, 0x21, + 0x00, 0xc8, 0x85, 0xc1, 0x20, 0x71, 0xac, 0x98, 0x83, 0x1c, 0x23, 0x00, + 0xae, 0x18, 0xad, 0x90, 0x00, 0x1d, 0x10, 0x78, 0x89, 0xf2, 0x00, 0x78, + 0x85, 0xcd, 0x78, 0x38, 0xd0, 0xfc, 0x00, 0x40, 0x85, 0xca, 0x20, 0x09, + 0x00, 0x20, 0x69, 0x5a, 0x00, 0x78, 0x85, 0xb6, 0x2d, 0x78, 0x10, 0x78, + 0x89, 0x8a, 0xd6, 0xdc, 0x00, 0xc0, 0x85, 0xd3, 0xa0, 0x06, 0x00, 0x78, + 0x85, 0xd9, 0x20, 0x01, 0x00, 0x01, 0x20, 0x71, 0xac, 0x8c, 0x72, 0x18, + 0x73, 0x1c, 0x10, 0x78, 0x16, 0x53, 0x0d, 0x7f, 0x0e, 0x7f, 0x0f, 0x7f, + 0x07, 0x7f, 0x00, 0x7c, 0x20, 0x01, 0xa9, 0xa4, 0x20, 0x04, 0x60, 0x3e, + 0x20, 0xe1, 0x00, 0x05, 0x3d, 0x18, 0x3e, 0x20, 0x2c, 0x10, 0x10, 0x78, + 0x15, 0xfa, 0x00, 0x7c, 0x20, 0x01, 0xa9, 0xa4, 0x20, 0x04, 0x60, 0x3e, + 0x0d, 0x7e, 0x60, 0x03, 0x00, 0x02, 0x61, 0x10, 0x21, 0x68, 0x69, 0x4c, + 0xd1, 0xe4, 0x00, 0x40, 0x87, 0x1c, 0x60, 0x3f, 0x00, 0x00, 0x0f, 0x7e, + 0x2c, 0x78, 0x10, 0x78, 0x49, 0x63, 0x0f, 0x7f, 0x00, 0x40, 0x86, 0x32, + 0x68, 0x14, 0x69, 0x10, 0xa1, 0x15, 0x00, 0x40, 0x86, 0x32, 0x6a, 0x60, + 0xa2, 0x06, 0x00, 0xc0, 0x86, 0x0f, 0x68, 0x5c, 0xa1, 0x06, 0x00, 0x40, + 0x86, 0x32, 0x68, 0x4c, 0xc0, 0xe4, 0x68, 0x4e, 0x68, 0x47, 0x00, 0x00, + 0x68, 0x63, 0x00, 0x00, 0x68, 0x5f, 0x00, 0x00, 0x60, 0x24, 0xd0, 0xf4, + 0x00, 0xc0, 0x86, 0x27, 0x69, 0x7c, 0x68, 0x10, 0xa1, 0x02, 0x60, 0x3a, + 0x69, 0x80, 0x68, 0x14, 0xa1, 0x03, 0x60, 0x36, 0x60, 0x24, 0xc0, 0xf5, + 0x60, 0x26, 0x0d, 0x7e, 0x60, 0x18, 0x20, 0x68, 0x68, 0x3c, 0x80, 0x00, + 0x68, 0x3e, 0x0d, 0x7f, 0x10, 0x78, 0x8f, 0xcf, 0x00, 0x78, 0x87, 0x1c, + 0x69, 0x4c, 0xd1, 0xcc, 0x00, 0x40, 0x86, 0xe1, 0x69, 0x48, 0x68, 0x38, + 0xd0, 0xfc, 0x00, 0x40, 0x86, 0x99, 0x01, 0x7e, 0x68, 0x4c, 0x00, 0x7e, + 0x68, 0x50, 0x00, 0x7e, 0x0f, 0x7e, 0x21, 0x78, 0x79, 0x44, 0xa1, 0x84, + 0x00, 0xff, 0xa0, 0xb6, 0x00, 0x02, 0x00, 0x40, 0x86, 0x6c, 0xa0, 0x86, + 0x00, 0x28, 0x00, 0xc0, 0x86, 0x53, 0x68, 0x4b, 0x00, 0x1c, 0x78, 0x4b, + 0x00, 0x1c, 0x00, 0x78, 0x86, 0x77, 0xd1, 0xdc, 0x00, 0x40, 0x86, 0x63, + 0x68, 0x4b, 0x00, 0x15, 0x78, 0x4b, 0x00, 0x15, 0x10, 0x78, 0x91, 0x7c, + 0x00, 0x40, 0x86, 0x61, 0x79, 0x44, 0xc1, 0xdc, 0x79, 0x46, 0x00, 0x78, + 0x86, 0x77, 0xd1, 0xd4, 0x00, 0x40, 0x86, 0x6c, 0x68, 0x4b, 0x00, 0x07, + 0x78, 0x4b, 0x00, 0x07, 0x00, 0x78, 0x86, 0x77, 0x68, 0x4c, 0xd0, 0xac, + 0x00, 0x40, 0x86, 0x77, 0x68, 0x10, 0x69, 0x14, 0xa1, 0x15, 0x00, 0x40, + 0x86, 0x77, 0x10, 0x78, 0x84, 0xe2, 0x68, 0x48, 0x78, 0x4a, 0x68, 0x60, + 0x78, 0x62, 0x68, 0x5c, 0x78, 0x5e, 0xad, 0x90, 0x00, 0x0d, 0xaf, 0x98, + 0x00, 0x0d, 0x20, 0x09, 0x00, 0x20, 0x15, 0x7e, 0x21, 0xa8, 0x23, 0x04, + 0x20, 0x12, 0x83, 0x18, 0x82, 0x10, 0x00, 0xf0, 0x86, 0x85, 0x15, 0x7f, + 0x0f, 0x7f, 0x00, 0x7f, 0x68, 0x52, 0x00, 0x7f, 0x68, 0x4e, 0x10, 0x78, + 0x92, 0x04, 0x01, 0x7f, 0x21, 0x68, 0x10, 0x78, 0x13, 0xb4, 0x00, 0x78, + 0x87, 0x16, 0x01, 0x7e, 0x0f, 0x7e, 0x21, 0x78, 0x79, 0x44, 0xa1, 0x84, + 0x00, 0xff, 0xa0, 0xb6, 0x00, 0x02, 0x00, 0x40, 0x86, 0xc6, 0xa0, 0x86, + 0x00, 0x28, 0x00, 0xc0, 0x86, 0xad, 0x68, 0x4b, 0x00, 0x1c, 0x78, 0x4b, + 0x00, 0x1c, 0x00, 0x78, 0x86, 0xd1, 0xd1, 0xdc, 0x00, 0x40, 0x86, 0xbd, + 0x68, 0x4b, 0x00, 0x15, 0x78, 0x4b, 0x00, 0x15, 0x10, 0x78, 0x91, 0x7c, + 0x00, 0x40, 0x86, 0xbb, 0x79, 0x44, 0xc1, 0xdc, 0x79, 0x46, 0x00, 0x78, + 0x86, 0xd1, 0xd1, 0xd4, 0x00, 0x40, 0x86, 0xc6, 0x68, 0x4b, 0x00, 0x07, + 0x78, 0x4b, 0x00, 0x07, 0x00, 0x78, 0x86, 0xd1, 0x68, 0x4c, 0xd0, 0xac, + 0x00, 0x40, 0x86, 0xd1, 0x68, 0x10, 0x69, 0x14, 0xa1, 0x15, 0x00, 0x40, + 0x86, 0xd1, 0x10, 0x78, 0x84, 0xe2, 0x68, 0x60, 0x78, 0x62, 0x68, 0x5c, + 0x78, 0x5e, 0x68, 0x4c, 0x78, 0x4e, 0x0f, 0x7f, 0x10, 0x78, 0x13, 0xb4, + 0x0d, 0x7f, 0x10, 0x78, 0x92, 0x04, 0x10, 0x78, 0x89, 0xdf, 0x00, 0x78, + 0x87, 0x16, 0x68, 0x37, 0x01, 0x03, 0x69, 0x44, 0xa1, 0x84, 0x00, 0xff, + 0xa0, 0xb6, 0x00, 0x02, 0x00, 0x40, 0x87, 0x07, 0xa0, 0x86, 0x00, 0x28, + 0x00, 0xc0, 0x86, 0xf2, 0x68, 0x4b, 0x00, 0x1c, 0x00, 0x78, 0x87, 0x14, + 0xd1, 0xdc, 0x00, 0x40, 0x87, 0x00, 0x68, 0x4b, 0x00, 0x15, 0x10, 0x78, + 0x91, 0x7c, 0x00, 0x40, 0x86, 0xfe, 0x69, 0x44, 0xc1, 0xdc, 0x69, 0x46, + 0x00, 0x78, 0x87, 0x14, 0xd1, 0xd4, 0x00, 0x40, 0x87, 0x07, 0x68, 0x4b, + 0x00, 0x07, 0x00, 0x78, 0x87, 0x14, 0x68, 0x4b, 0x00, 0x00, 0x68, 0x4c, + 0xd0, 0xac, 0x00, 0x40, 0x87, 0x14, 0x68, 0x10, 0x69, 0x14, 0xa1, 0x15, + 0x00, 0x40, 0x87, 0x14, 0x10, 0x78, 0x84, 0xe2, 0x10, 0x78, 0x4a, 0x73, + 0x10, 0x78, 0x8f, 0x99, 0x00, 0xc0, 0x87, 0x1c, 0x10, 0x78, 0x77, 0x2d, + 0x0d, 0x7f, 0x00, 0x7c, 0x10, 0x78, 0x61, 0xcd, 0x00, 0x78, 0x87, 0x24, + 0x10, 0x78, 0x62, 0x7a, 0x10, 0x78, 0x8d, 0x16, 0x00, 0x40, 0x87, 0x43, + 0x0d, 0x7e, 0x61, 0x10, 0x21, 0x68, 0x68, 0x37, 0x01, 0x03, 0x20, 0x09, + 0xa7, 0x0c, 0x21, 0x0c, 0xd1, 0x8c, 0x00, 0xc0, 0x87, 0x4e, 0xd1, 0x84, + 0x00, 0xc0, 0x87, 0x4a, 0x61, 0x08, 0x69, 0x4a, 0xa1, 0x8e, 0x00, 0x29, + 0x00, 0xc0, 0x87, 0x3e, 0x10, 0x78, 0xa4, 0xf2, 0x68, 0x47, 0x00, 0x00, + 0x10, 0x78, 0x4a, 0x73, 0x0d, 0x7f, 0x10, 0x78, 0x77, 0x2d, 0x10, 0x78, + 0x62, 0xd1, 0x10, 0x78, 0x63, 0x9b, 0x00, 0x7c, 0x68, 0x4b, 0x00, 0x04, + 0x00, 0x78, 0x87, 0x3e, 0x68, 0x4b, 0x00, 0x04, 0x00, 0x78, 0x87, 0x3e, + 0xa1, 0x82, 0x00, 0x40, 0x00, 0x79, 0x87, 0x56, 0x87, 0x69, 0x87, 0x69, + 0x87, 0x69, 0x87, 0x69, 0x87, 0x69, 0x87, 0x6b, 0x87, 0x69, 0x87, 0x6e, + 0x87, 0x69, 0x87, 0x69, 0x87, 0x69, 0x87, 0x69, 0x87, 0x69, 0x87, 0x69, + 0x87, 0x69, 0x87, 0x69, 0x87, 0x69, 0x87, 0x69, 0x87, 0x69, 0x10, 0x78, + 0x13, 0x32, 0x10, 0x78, 0x77, 0x2d, 0x00, 0x7c, 0x00, 0x7e, 0x02, 0x7e, + 0xa0, 0x16, 0x10, 0x78, 0x15, 0xfa, 0x02, 0x7f, 0x00, 0x7f, 0x00, 0x7c, + 0xa1, 0x82, 0x00, 0x85, 0x00, 0x79, 0x87, 0x7a, 0x87, 0x83, 0x87, 0x81, + 0x87, 0x81, 0x87, 0x8f, 0x87, 0x81, 0x87, 0x81, 0x87, 0x81, 0x10, 0x78, + 0x13, 0x32, 0x60, 0x03, 0x00, 0x01, 0x61, 0x06, 0x10, 0x78, 0x5d, 0x8a, + 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x10, 0x78, 0x62, 0xd1, 0x12, 0x7f, + 0x00, 0x7c, 0x02, 0x7e, 0x05, 0x7e, 0x0d, 0x7e, 0x0e, 0x7e, 0x20, 0x71, + 0xac, 0x80, 0x72, 0x24, 0x62, 0x12, 0x72, 0x20, 0x10, 0x78, 0x8d, 0x02, + 0x00, 0x40, 0x87, 0xb4, 0x22, 0x68, 0x68, 0x00, 0xa0, 0x86, 0x00, 0x00, + 0x00, 0x40, 0x87, 0xb4, 0x60, 0x18, 0x6d, 0x18, 0xa5, 0x2e, 0x00, 0xc0, + 0x87, 0xb4, 0x0c, 0x7e, 0x2d, 0x60, 0x10, 0x78, 0x8a, 0x03, 0x0c, 0x7f, + 0x00, 0x40, 0x87, 0xb4, 0x68, 0x03, 0x00, 0x02, 0x60, 0x07, 0x00, 0x86, + 0x00, 0x78, 0x87, 0xb6, 0x60, 0x07, 0x00, 0x87, 0x60, 0x03, 0x00, 0x01, + 0x10, 0x78, 0x5d, 0x8a, 0x10, 0x78, 0x62, 0xd1, 0x0f, 0x7e, 0x22, 0x78, + 0x10, 0x78, 0x49, 0x63, 0x0f, 0x7f, 0x00, 0x40, 0x87, 0xce, 0x68, 0x24, + 0xd0, 0xec, 0x00, 0x40, 0x87, 0xce, 0x0c, 0x7e, 0x22, 0x60, 0x60, 0x3f, + 0x00, 0x00, 0x10, 0x78, 0x8f, 0xcf, 0x0c, 0x7f, 0x0e, 0x7f, 0x0d, 0x7f, + 0x05, 0x7f, 0x02, 0x7f, 0x00, 0x7c, 0xa1, 0x86, 0x00, 0x13, 0x00, 0xc0, + 0x87, 0xe4, 0x60, 0x04, 0xa0, 0x8a, 0x00, 0x85, 0x10, 0x48, 0x13, 0x32, + 0xa0, 0x8a, 0x00, 0x8c, 0x10, 0xc8, 0x13, 0x32, 0xa0, 0x82, 0x00, 0x85, + 0x00, 0x79, 0x87, 0xf3, 0xa1, 0x86, 0x00, 0x27, 0x00, 0x40, 0x87, 0xec, + 0xa1, 0x86, 0x00, 0x14, 0x10, 0xc0, 0x13, 0x32, 0x10, 0x78, 0x61, 0xcd, + 0x10, 0x78, 0x8e, 0xd6, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x7c, 0x87, 0xfa, + 0x87, 0xfc, 0x87, 0xfc, 0x87, 0xfa, 0x87, 0xfa, 0x87, 0xfa, 0x87, 0xfa, + 0x10, 0x78, 0x13, 0x32, 0x10, 0x78, 0x61, 0xcd, 0x10, 0x78, 0x8e, 0xd6, + 0x10, 0x78, 0x62, 0xd1, 0x00, 0x7c, 0xa1, 0x86, 0x00, 0x13, 0x00, 0xc0, + 0x88, 0x0d, 0x60, 0x04, 0xa0, 0x82, 0x00, 0x85, 0x20, 0x08, 0x00, 0x78, + 0x88, 0x48, 0xa1, 0x86, 0x00, 0x27, 0x00, 0xc0, 0x88, 0x30, 0x10, 0x78, + 0x61, 0xcd, 0x10, 0x78, 0x28, 0x80, 0x0d, 0x7e, 0x60, 0x10, 0x20, 0x68, + 0x10, 0x78, 0x8d, 0x16, 0x00, 0x40, 0x88, 0x26, 0x68, 0x37, 0x01, 0x03, + 0x68, 0x47, 0x00, 0x00, 0x68, 0x4b, 0x00, 0x29, 0x10, 0x78, 0x4a, 0x73, + 0x10, 0x78, 0x8e, 0xc9, 0x0d, 0x7f, 0x10, 0x78, 0x77, 0x2d, 0x10, 0x78, + 0x62, 0xd1, 0x00, 0x7c, 0x10, 0x78, 0x77, 0x73, 0x00, 0x78, 0x88, 0x2b, + 0xa1, 0x86, 0x00, 0x14, 0x00, 0xc0, 0x88, 0x2c, 0x10, 0x78, 0x61, 0xcd, + 0x0d, 0x7e, 0x60, 0x10, 0x20, 0x68, 0x10, 0x78, 0x8d, 0x16, 0x00, 0x40, + 0x88, 0x26, 0x68, 0x37, 0x01, 0x03, 0x68, 0x47, 0x00, 0x00, 0x68, 0x4b, + 0x00, 0x06, 0x68, 0x50, 0xc0, 0xec, 0x68, 0x52, 0x00, 0x78, 0x88, 0x22, + 0x00, 0x79, 0x88, 0x4a, 0x88, 0x53, 0x88, 0x51, 0x88, 0x51, 0x88, 0x51, + 0x88, 0x51, 0x88, 0x51, 0x88, 0x6e, 0x10, 0x78, 0x13, 0x32, 0x10, 0x78, + 0x61, 0xcd, 0x60, 0x30, 0xa0, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0xa1, 0x86, + 0x00, 0x39, 0x00, 0x40, 0x88, 0x61, 0xa1, 0x86, 0x00, 0x35, 0x00, 0xc0, + 0x88, 0x65, 0x20, 0x01, 0xa9, 0xa2, 0x00, 0x78, 0x88, 0x67, 0x20, 0x01, + 0xa9, 0xa3, 0x20, 0x04, 0x60, 0x16, 0x60, 0x03, 0x00, 0x0c, 0x10, 0x78, + 0x62, 0xd1, 0x00, 0x7c, 0x10, 0x78, 0x61, 0xcd, 0x60, 0x30, 0xa0, 0x8c, + 0xff, 0x00, 0x81, 0x0f, 0xa1, 0x86, 0x00, 0x39, 0x00, 0x40, 0x88, 0x7c, + 0xa1, 0x86, 0x00, 0x35, 0x00, 0xc0, 0x88, 0x80, 0x20, 0x01, 0xa9, 0xa2, + 0x00, 0x78, 0x88, 0x82, 0x20, 0x01, 0xa9, 0xa3, 0x20, 0x04, 0x60, 0x16, + 0x60, 0x03, 0x00, 0x0e, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x7c, 0xa1, 0x82, + 0x00, 0x8c, 0x00, 0xc8, 0x88, 0x93, 0xa1, 0x82, 0x00, 0x85, 0x00, 0x48, + 0x88, 0x93, 0x00, 0x79, 0x88, 0x96, 0x10, 0x78, 0x77, 0x73, 0x00, 0x7c, + 0x88, 0x9d, 0x88, 0x9d, 0x88, 0x9d, 0x88, 0x9d, 0x88, 0x9f, 0x88, 0xfc, + 0x88, 0x9d, 0x10, 0x78, 0x13, 0x32, 0x0f, 0x7e, 0x2c, 0x78, 0x10, 0x78, + 0x49, 0x63, 0x0f, 0x7f, 0x00, 0x40, 0x88, 0xb2, 0x60, 0x30, 0xa0, 0x8c, + 0xff, 0x00, 0x81, 0x0f, 0xa1, 0x86, 0x00, 0x39, 0x00, 0x40, 0x89, 0x13, + 0xa1, 0x86, 0x00, 0x35, 0x00, 0x40, 0x89, 0x13, 0x0d, 0x7e, 0x10, 0x78, + 0x8d, 0x16, 0x00, 0xc0, 0x88, 0xbb, 0x10, 0x78, 0x8e, 0xc9, 0x00, 0x78, + 0x88, 0xde, 0x60, 0x10, 0x20, 0x68, 0x68, 0x4c, 0xd0, 0xe4, 0x00, 0xc0, + 0x88, 0xc3, 0x10, 0x78, 0x8e, 0xc9, 0x68, 0x37, 0x01, 0x03, 0x68, 0x50, + 0xd0, 0xb4, 0x00, 0x40, 0x88, 0xcf, 0x68, 0x4b, 0x00, 0x06, 0xc0, 0xec, + 0x68, 0x52, 0x00, 0x78, 0x88, 0xda, 0xd0, 0xbc, 0x00, 0x40, 0x88, 0xd6, + 0x68, 0x4b, 0x00, 0x02, 0x00, 0x78, 0x88, 0xda, 0x68, 0x4b, 0x00, 0x05, + 0x10, 0x78, 0x8f, 0x95, 0x68, 0x47, 0x00, 0x00, 0x10, 0x78, 0x4a, 0x73, + 0x2c, 0x68, 0x10, 0x78, 0x76, 0xc7, 0x00, 0x40, 0x88, 0xf7, 0x60, 0x03, + 0x00, 0x01, 0x60, 0x07, 0x00, 0x1e, 0x20, 0x09, 0xac, 0x8e, 0x21, 0x0c, + 0x61, 0x36, 0x20, 0x09, 0xac, 0x8f, 0x21, 0x0c, 0x61, 0x3a, 0x69, 0x18, + 0x61, 0x1a, 0x69, 0x20, 0x61, 0x22, 0x60, 0x1f, 0x00, 0x01, 0x10, 0x78, + 0x5d, 0x8a, 0x2d, 0x60, 0x10, 0x78, 0x77, 0x2d, 0x0d, 0x7f, 0x00, 0x7c, + 0x0f, 0x7e, 0x2c, 0x78, 0x10, 0x78, 0x49, 0x63, 0x0f, 0x7f, 0x00, 0x40, + 0x89, 0x39, 0x60, 0x30, 0xa0, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0xa1, 0x86, + 0x00, 0x35, 0x00, 0x40, 0x89, 0x13, 0xa1, 0x86, 0x00, 0x1e, 0x00, 0x40, + 0x89, 0x13, 0xa1, 0x86, 0x00, 0x39, 0x00, 0xc0, 0x89, 0x39, 0x0d, 0x7e, + 0x2c, 0x68, 0x10, 0x78, 0x91, 0xcc, 0x00, 0xc0, 0x89, 0x5d, 0x10, 0x78, + 0x76, 0xc7, 0x00, 0x40, 0x89, 0x36, 0x61, 0x06, 0x60, 0x03, 0x00, 0x01, + 0x60, 0x1f, 0x00, 0x01, 0x69, 0x18, 0x61, 0x1a, 0x69, 0x28, 0x61, 0x2a, + 0x69, 0x2c, 0x61, 0x2e, 0x69, 0x30, 0xa1, 0x8c, 0x00, 0xff, 0x61, 0x32, + 0x69, 0x34, 0x61, 0x36, 0x69, 0x38, 0x61, 0x3a, 0x69, 0x20, 0x61, 0x22, + 0x10, 0x78, 0x5d, 0x8a, 0x10, 0x78, 0x62, 0xd1, 0x2d, 0x60, 0x00, 0x78, + 0x89, 0x5d, 0x0d, 0x7e, 0x60, 0x10, 0x20, 0x68, 0x10, 0x78, 0x8d, 0x16, + 0x00, 0x40, 0x89, 0x5d, 0x68, 0x37, 0x01, 0x03, 0x68, 0x50, 0xd0, 0xb4, + 0x00, 0x40, 0x89, 0x4c, 0xc0, 0xec, 0x68, 0x52, 0x68, 0x4b, 0x00, 0x06, + 0x00, 0x78, 0x89, 0x57, 0xd0, 0xbc, 0x00, 0x40, 0x89, 0x53, 0x68, 0x4b, + 0x00, 0x02, 0x00, 0x78, 0x89, 0x57, 0x68, 0x4b, 0x00, 0x05, 0x10, 0x78, + 0x8f, 0x95, 0x68, 0x47, 0x00, 0x00, 0x10, 0x78, 0x4a, 0x73, 0x10, 0x78, + 0x8e, 0xc9, 0x0d, 0x7f, 0x10, 0x78, 0x77, 0x2d, 0x00, 0x7c, 0x01, 0x7e, + 0x0d, 0x7e, 0x60, 0x10, 0x20, 0x68, 0x10, 0x78, 0x8d, 0x16, 0x00, 0x40, + 0x89, 0x71, 0x68, 0x37, 0x01, 0x03, 0x68, 0x4b, 0x00, 0x28, 0x68, 0x47, + 0x00, 0x00, 0x10, 0x78, 0x4a, 0x73, 0x0d, 0x7f, 0x01, 0x7f, 0xa1, 0x86, + 0x00, 0x13, 0x00, 0x40, 0x89, 0x83, 0xa1, 0x86, 0x00, 0x14, 0x00, 0x40, + 0x89, 0x83, 0xa1, 0x86, 0x00, 0x27, 0x00, 0x40, 0x89, 0x83, 0x10, 0x78, + 0x77, 0x73, 0x00, 0x78, 0x89, 0x89, 0x10, 0x78, 0x61, 0xcd, 0x10, 0x78, + 0x8e, 0xd6, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x7c, 0x05, 0x7e, 0x06, 0x7e, + 0x0d, 0x7e, 0x0f, 0x7e, 0x20, 0x29, 0x00, 0x01, 0xa1, 0x82, 0x01, 0x01, + 0x00, 0xc8, 0x89, 0x96, 0x00, 0x78, 0x89, 0x98, 0x20, 0x09, 0x01, 0x00, + 0x21, 0x30, 0x20, 0x69, 0xac, 0x98, 0x83, 0x1c, 0x23, 0x00, 0xad, 0x18, + 0x20, 0x09, 0x00, 0x20, 0xaf, 0x90, 0x00, 0x1d, 0x10, 0x78, 0x89, 0xf2, + 0xa6, 0xb2, 0x00, 0x20, 0x78, 0x04, 0xa0, 0x6d, 0x00, 0x40, 0x89, 0xac, + 0x10, 0x78, 0x13, 0xb4, 0x10, 0x78, 0x13, 0x8b, 0x00, 0x40, 0x89, 0xd6, + 0x85, 0x28, 0x68, 0x37, 0x01, 0x10, 0x68, 0x3b, 0x00, 0x00, 0x2d, 0x20, + 0x7c, 0x06, 0xa6, 0x8a, 0x00, 0x3d, 0x00, 0xc8, 0x89, 0xc2, 0x26, 0x08, + 0xad, 0x90, 0x00, 0x0f, 0x10, 0x78, 0x89, 0xf2, 0x00, 0x78, 0x89, 0xd6, + 0xa6, 0xb2, 0x00, 0x3c, 0x20, 0x09, 0x00, 0x3c, 0x2d, 0x78, 0xad, 0x90, + 0x00, 0x0f, 0x10, 0x78, 0x89, 0xf2, 0x00, 0x78, 0x89, 0xac, 0x0f, 0x7f, + 0x85, 0x2f, 0xa5, 0xad, 0x00, 0x03, 0x7d, 0x36, 0xa5, 0xac, 0x00, 0x00, + 0x00, 0x78, 0x89, 0xdb, 0x0f, 0x7f, 0x85, 0x2f, 0xa5, 0xad, 0x00, 0x03, + 0x7d, 0x36, 0x0d, 0x7f, 0x06, 0x7f, 0x05, 0x7f, 0x00, 0x7c, 0x0f, 0x7e, + 0x8d, 0xff, 0x00, 0x40, 0x89, 0xf0, 0x68, 0x04, 0xa0, 0x7d, 0x00, 0x40, + 0x89, 0xee, 0x68, 0x07, 0x00, 0x00, 0x10, 0x78, 0x4a, 0x73, 0x2f, 0x68, + 0x00, 0x78, 0x89, 0xe3, 0x10, 0x78, 0x4a, 0x73, 0x0f, 0x7f, 0x00, 0x7c, + 0x15, 0x7e, 0xa1, 0x84, 0x00, 0x01, 0x00, 0x40, 0x89, 0xf8, 0x81, 0x08, + 0x81, 0x0c, 0x21, 0xa8, 0x23, 0x04, 0x80, 0x07, 0x20, 0x12, 0x83, 0x18, + 0x82, 0x10, 0x00, 0xf0, 0x89, 0xfa, 0x15, 0x7f, 0x00, 0x7c, 0x06, 0x7e, + 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x20, 0x31, 0x00, 0x01, 0x60, 0x1c, + 0xa0, 0x84, 0x00, 0x0f, 0x10, 0x79, 0x8a, 0x1f, 0x12, 0x7f, 0x06, 0x7f, + 0x00, 0x7c, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x06, 0x7e, 0x20, 0x31, + 0x00, 0x00, 0x60, 0x1c, 0xa0, 0x84, 0x00, 0x0f, 0x10, 0x79, 0x8a, 0x1f, + 0x06, 0x7f, 0x12, 0x7f, 0x00, 0x7c, 0x8a, 0x39, 0x8a, 0x27, 0x8a, 0x34, + 0x8a, 0x55, 0x8a, 0x27, 0x8a, 0x34, 0x8a, 0x55, 0x8a, 0x34, 0x10, 0x78, + 0x13, 0x32, 0x03, 0x7e, 0x20, 0x19, 0x00, 0x10, 0x10, 0x78, 0x9d, 0xd7, + 0x60, 0x1f, 0x00, 0x06, 0x60, 0x03, 0x00, 0x07, 0x03, 0x7f, 0x00, 0x7c, + 0xa0, 0x06, 0x00, 0x7c, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x7c, 0x0d, 0x7e, + 0x86, 0xff, 0x00, 0xc0, 0x8a, 0x50, 0x60, 0x10, 0x20, 0x68, 0x10, 0x78, + 0x8d, 0x16, 0x00, 0x40, 0x8a, 0x52, 0xa0, 0x0e, 0x20, 0x01, 0x00, 0x05, + 0x10, 0x78, 0x4b, 0x51, 0x10, 0x78, 0x8f, 0x95, 0x10, 0x78, 0x4a, 0x73, + 0x10, 0x78, 0x77, 0x2d, 0xa0, 0x85, 0x00, 0x01, 0x0d, 0x7f, 0x00, 0x7c, + 0xa0, 0x06, 0x00, 0x78, 0x8a, 0x50, 0x60, 0x00, 0xa0, 0x8a, 0x00, 0x10, + 0x10, 0xc8, 0x13, 0x32, 0x10, 0x79, 0x8a, 0x5d, 0x00, 0x7c, 0x8a, 0x6d, + 0x8a, 0x92, 0x8a, 0x6f, 0x8a, 0xb5, 0x8a, 0x8e, 0x8a, 0x6d, 0x8a, 0x34, + 0x8a, 0x39, 0x8a, 0x39, 0x8a, 0x34, 0x8a, 0x34, 0x8a, 0x34, 0x8a, 0x34, + 0x8a, 0x34, 0x8a, 0x34, 0x8a, 0x34, 0x10, 0x78, 0x13, 0x32, 0x86, 0xff, + 0x00, 0xc0, 0x8a, 0x8b, 0x60, 0x1c, 0xa0, 0x86, 0x00, 0x06, 0x00, 0x40, + 0x8a, 0x8b, 0x0d, 0x7e, 0x60, 0x10, 0x20, 0x68, 0x10, 0x78, 0x8d, 0x16, + 0x00, 0x40, 0x8a, 0x80, 0x10, 0x78, 0x8f, 0x95, 0x0d, 0x7f, 0x60, 0x07, + 0x00, 0x85, 0x60, 0x03, 0x00, 0x0b, 0x60, 0x1f, 0x00, 0x02, 0x10, 0x78, + 0x5d, 0x8a, 0x10, 0x78, 0x62, 0xd1, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x7c, + 0x10, 0x78, 0x17, 0x57, 0x00, 0x78, 0x8a, 0x6f, 0x0e, 0x7e, 0x20, 0x71, + 0xa9, 0xb1, 0x70, 0x24, 0xac, 0x06, 0x00, 0xc0, 0x8a, 0x9b, 0x10, 0x78, + 0x6f, 0xc4, 0x60, 0x1c, 0xa0, 0x84, 0x00, 0x0f, 0xa0, 0x86, 0x00, 0x06, + 0x00, 0xc0, 0x8a, 0xad, 0x08, 0x7e, 0x09, 0x7e, 0x20, 0x49, 0x00, 0x01, + 0x2c, 0x40, 0x10, 0x78, 0x72, 0x46, 0x09, 0x7f, 0x08, 0x7f, 0x00, 0x78, + 0x8a, 0xaf, 0x10, 0x78, 0x6e, 0xbe, 0x0e, 0x7f, 0x00, 0xc0, 0x8a, 0x6f, + 0x10, 0x78, 0x8a, 0x34, 0x00, 0x7c, 0x03, 0x7e, 0x0e, 0x7e, 0x20, 0x71, + 0xa9, 0xb1, 0x70, 0x3c, 0xac, 0x06, 0x00, 0xc0, 0x8a, 0xc5, 0x20, 0x19, + 0x00, 0x00, 0x10, 0x78, 0x70, 0x58, 0x0e, 0x7f, 0x03, 0x7f, 0x00, 0x78, + 0x8a, 0x6f, 0x10, 0x78, 0x73, 0x8a, 0x0e, 0x7f, 0x03, 0x7f, 0x00, 0xc0, + 0x8a, 0x6f, 0x10, 0x78, 0x8a, 0x34, 0x00, 0x7c, 0x0c, 0x7e, 0x60, 0x1c, + 0xa0, 0x84, 0x00, 0x0f, 0x10, 0x79, 0x8a, 0xd6, 0x0c, 0x7f, 0x00, 0x7c, + 0x8a, 0xe5, 0x8b, 0x57, 0x8c, 0x8f, 0x8a, 0xf0, 0x8e, 0xd6, 0x8a, 0xe5, + 0x9d, 0xc8, 0x77, 0x2d, 0x8b, 0x57, 0x10, 0x78, 0x8f, 0x10, 0x00, 0xc0, + 0x8a, 0xe5, 0x10, 0x78, 0x7c, 0x83, 0x00, 0x7c, 0x10, 0x78, 0x61, 0xcd, + 0x10, 0x78, 0x62, 0xd1, 0x10, 0x78, 0x77, 0x2d, 0x00, 0x7c, 0x60, 0x17, + 0x00, 0x01, 0x00, 0x7c, 0x10, 0x78, 0x8d, 0x16, 0x00, 0x40, 0x8a, 0xf8, + 0x60, 0x10, 0xa0, 0x80, 0x00, 0x19, 0x2c, 0x02, 0x60, 0x00, 0xa0, 0x8a, + 0x00, 0x10, 0x10, 0xc8, 0x13, 0x32, 0x10, 0x79, 0x8b, 0x00, 0x00, 0x7c, + 0x8b, 0x10, 0x8b, 0x12, 0x8b, 0x34, 0x8b, 0x46, 0x8b, 0x53, 0x8b, 0x10, + 0x8a, 0xe5, 0x8a, 0xe5, 0x8a, 0xe5, 0x8b, 0x46, 0x8b, 0x46, 0x8b, 0x10, + 0x8b, 0x10, 0x8b, 0x10, 0x8b, 0x10, 0x8b, 0x50, 0x10, 0x78, 0x13, 0x32, + 0x0e, 0x7e, 0x60, 0x10, 0x20, 0x70, 0x70, 0x50, 0xc0, 0xb5, 0x70, 0x52, + 0x20, 0x71, 0xa9, 0xb1, 0x70, 0x24, 0xac, 0x06, 0x00, 0x40, 0x8b, 0x30, + 0x10, 0x78, 0x6e, 0xbe, 0x60, 0x07, 0x00, 0x85, 0x60, 0x03, 0x00, 0x0b, + 0x60, 0x1f, 0x00, 0x02, 0x20, 0x01, 0xa9, 0xa3, 0x20, 0x04, 0x60, 0x16, + 0x10, 0x78, 0x5d, 0x8a, 0x10, 0x78, 0x62, 0xd1, 0x0e, 0x7f, 0x00, 0x7c, + 0x60, 0x17, 0x00, 0x01, 0x00, 0x78, 0x8b, 0x2e, 0x0d, 0x7e, 0x60, 0x10, + 0x20, 0x68, 0x68, 0x50, 0xc0, 0xb5, 0x68, 0x52, 0x0d, 0x7f, 0x60, 0x07, + 0x00, 0x85, 0x60, 0x03, 0x00, 0x0b, 0x60, 0x1f, 0x00, 0x02, 0x10, 0x78, + 0x5d, 0x8a, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x7c, 0x0d, 0x7e, 0x60, 0x17, + 0x00, 0x01, 0x60, 0x10, 0x20, 0x68, 0x68, 0x50, 0xc0, 0xb5, 0x68, 0x52, + 0x0d, 0x7f, 0x00, 0x7c, 0x10, 0x78, 0x77, 0x2d, 0x00, 0x7c, 0x10, 0x78, + 0x17, 0x57, 0x00, 0x78, 0x8b, 0x34, 0x60, 0x00, 0xa0, 0x8a, 0x00, 0x10, + 0x10, 0xc8, 0x13, 0x32, 0x10, 0x79, 0x8b, 0x5f, 0x00, 0x7c, 0x8b, 0x6f, + 0x8a, 0xed, 0x8b, 0x71, 0x8b, 0x6f, 0x8b, 0x71, 0x8b, 0x71, 0x8a, 0xe6, + 0x8b, 0x6f, 0x8a, 0xdf, 0x8a, 0xdf, 0x8b, 0x6f, 0x8b, 0x6f, 0x8b, 0x6f, + 0x8b, 0x6f, 0x8b, 0x6f, 0x8b, 0x6f, 0x10, 0x78, 0x13, 0x32, 0x0d, 0x7e, + 0x60, 0x18, 0x20, 0x68, 0x68, 0x04, 0xa0, 0x84, 0x00, 0xff, 0x0d, 0x7f, + 0xa0, 0x8a, 0x00, 0x0c, 0x10, 0xc8, 0x13, 0x32, 0x10, 0x79, 0x8b, 0x7f, + 0x00, 0x7c, 0x8b, 0x8b, 0x8c, 0x33, 0x8b, 0x8d, 0x8b, 0xcd, 0x8b, 0x8d, + 0x8b, 0xcd, 0x8b, 0x8d, 0x8b, 0x9a, 0x8b, 0x8b, 0x8b, 0xcd, 0x8b, 0x8b, + 0x8b, 0xb7, 0x10, 0x78, 0x13, 0x32, 0x60, 0x04, 0xa0, 0x8e, 0x00, 0x16, + 0x00, 0x40, 0x8b, 0xc8, 0xa0, 0x8e, 0x00, 0x04, 0x00, 0x40, 0x8b, 0xc8, + 0xa0, 0x8e, 0x00, 0x02, 0x00, 0x40, 0x8b, 0xc8, 0x60, 0x04, 0x10, 0x78, + 0x8f, 0x10, 0x00, 0x40, 0x8c, 0x4e, 0xa0, 0x8e, 0x00, 0x21, 0x00, 0x40, + 0x8c, 0x52, 0xa0, 0x8e, 0x00, 0x22, 0x00, 0x40, 0x8c, 0x4e, 0xa0, 0x8e, + 0x00, 0x3d, 0x00, 0x40, 0x8c, 0x52, 0xa0, 0x8e, 0x00, 0x39, 0x00, 0x40, + 0x8c, 0x56, 0xa0, 0x8e, 0x00, 0x35, 0x00, 0x40, 0x8c, 0x56, 0xa0, 0x8e, + 0x00, 0x1e, 0x00, 0x40, 0x8b, 0xca, 0xa0, 0x8e, 0x00, 0x01, 0x00, 0xc0, + 0x8b, 0xc6, 0x0d, 0x7e, 0x60, 0x18, 0x20, 0x68, 0x68, 0x04, 0xa0, 0x84, + 0x00, 0xff, 0x0d, 0x7f, 0xa0, 0x86, 0x00, 0x06, 0x00, 0x40, 0x8b, 0xc8, + 0x10, 0x78, 0x28, 0x80, 0x10, 0x78, 0x7c, 0x83, 0x10, 0x78, 0x8e, 0xd6, + 0x00, 0x7c, 0x0c, 0x7e, 0x0d, 0x7e, 0x61, 0x04, 0xa1, 0x86, 0x00, 0x16, + 0x00, 0x40, 0x8c, 0x23, 0xa1, 0x86, 0x00, 0x02, 0x00, 0xc0, 0x8b, 0xf6, + 0x60, 0x18, 0x20, 0x68, 0x68, 0xa0, 0xd0, 0xbc, 0x00, 0xc0, 0x8c, 0x7a, + 0x68, 0x40, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x05, 0x00, 0x40, 0x8b, 0xf6, + 0x80, 0x01, 0x68, 0x42, 0x60, 0x13, 0x00, 0x00, 0x60, 0x1f, 0x00, 0x07, + 0x60, 0x17, 0x03, 0x98, 0x10, 0x78, 0x76, 0xc7, 0x00, 0x40, 0x8b, 0xf6, + 0x2d, 0x00, 0x60, 0x1a, 0x60, 0x1f, 0x00, 0x01, 0x00, 0x78, 0x8c, 0x23, + 0x0d, 0x7f, 0x0c, 0x7f, 0x60, 0x04, 0xa0, 0x8e, 0x00, 0x02, 0x00, 0xc0, + 0x8c, 0x14, 0x60, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, 0xa0, 0x86, + 0x00, 0x7e, 0x00, 0xc0, 0x8c, 0x14, 0x20, 0x09, 0xa7, 0x33, 0x21, 0x04, + 0xc0, 0x85, 0x20, 0x0a, 0x0e, 0x7e, 0x20, 0x71, 0xa7, 0x00, 0x10, 0x78, + 0x42, 0xb8, 0x0e, 0x7f, 0x10, 0x78, 0x7c, 0x83, 0x00, 0x78, 0x8c, 0x18, + 0x10, 0x78, 0x7c, 0x83, 0x10, 0x78, 0x28, 0x80, 0x0e, 0x7e, 0x12, 0x7e, + 0x20, 0x91, 0x80, 0x00, 0x10, 0x78, 0x28, 0xa6, 0x12, 0x7f, 0x0e, 0x7f, + 0x10, 0x78, 0x8e, 0xd6, 0x00, 0x7c, 0x20, 0x01, 0x00, 0x02, 0x10, 0x78, + 0x45, 0x02, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x02, 0x10, 0x78, + 0x5d, 0xd7, 0x10, 0x78, 0x62, 0xd1, 0x0d, 0x7f, 0x0c, 0x7f, 0x00, 0x78, + 0x8c, 0x22, 0x0c, 0x7e, 0x0d, 0x7e, 0x61, 0x04, 0xa1, 0x86, 0x00, 0x16, + 0x00, 0x40, 0x8c, 0x23, 0x60, 0x18, 0x20, 0x68, 0x68, 0x40, 0xa0, 0x84, + 0x00, 0xff, 0xa0, 0x05, 0x00, 0x40, 0x8b, 0xf6, 0x80, 0x01, 0x68, 0x42, + 0x60, 0x03, 0x00, 0x01, 0x10, 0x78, 0x5d, 0xd7, 0x10, 0x78, 0x62, 0xd1, + 0x0d, 0x7f, 0x0c, 0x7f, 0x00, 0x78, 0x8c, 0x22, 0x10, 0x78, 0x7c, 0x83, + 0x00, 0x78, 0x8b, 0xca, 0x10, 0x78, 0x7c, 0xa6, 0x00, 0x78, 0x8b, 0xca, + 0x0d, 0x7e, 0x2c, 0x68, 0x61, 0x04, 0x10, 0x78, 0x91, 0xcc, 0x0d, 0x7f, + 0x00, 0x40, 0x8c, 0x62, 0x10, 0x78, 0x77, 0x2d, 0x00, 0x78, 0x8c, 0x79, + 0x60, 0x04, 0x80, 0x07, 0x61, 0x30, 0xa1, 0x8c, 0x00, 0xff, 0xa1, 0x05, + 0x60, 0x32, 0x60, 0x07, 0x00, 0x85, 0x60, 0x03, 0x00, 0x0b, 0x60, 0x1f, + 0x00, 0x02, 0x60, 0x38, 0x60, 0x0a, 0x20, 0x01, 0xa9, 0xa3, 0x20, 0x04, + 0x60, 0x16, 0x10, 0x78, 0x5d, 0x8a, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x7c, + 0x0d, 0x7f, 0x0c, 0x7f, 0x10, 0x78, 0x7c, 0x83, 0x10, 0x78, 0x28, 0x80, + 0x0e, 0x7e, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x10, 0x78, 0x28, 0xa6, + 0x60, 0x13, 0x00, 0x00, 0x60, 0x1f, 0x00, 0x07, 0x60, 0x17, 0x03, 0x98, + 0x12, 0x7f, 0x0e, 0x7f, 0x00, 0x7c, 0x60, 0x00, 0xa0, 0x8a, 0x00, 0x10, + 0x10, 0xc8, 0x13, 0x32, 0x10, 0x79, 0x8c, 0x97, 0x00, 0x7c, 0x8c, 0xa7, + 0x8c, 0xa7, 0x8c, 0xa7, 0x8c, 0xa7, 0x8c, 0xa7, 0x8c, 0xa7, 0x8c, 0xa7, + 0x8c, 0xa7, 0x8c, 0xa7, 0x8a, 0xe5, 0x8c, 0xa7, 0x8a, 0xed, 0x8c, 0xa9, + 0x8a, 0xed, 0x8c, 0xb7, 0x8c, 0xa7, 0x10, 0x78, 0x13, 0x32, 0x60, 0x04, + 0xa0, 0x86, 0x00, 0x8b, 0x00, 0x40, 0x8c, 0xb7, 0x60, 0x07, 0x00, 0x8b, + 0x60, 0x03, 0x00, 0x0d, 0x10, 0x78, 0x5d, 0x8a, 0x10, 0x78, 0x62, 0xd1, + 0x00, 0x7c, 0x10, 0x78, 0x8e, 0xc9, 0x10, 0x78, 0x8d, 0x16, 0x00, 0x40, + 0x8c, 0xef, 0x10, 0x78, 0x28, 0x80, 0x0d, 0x7e, 0x10, 0x78, 0x8d, 0x16, + 0x00, 0x40, 0x8c, 0xd1, 0x60, 0x10, 0x20, 0x68, 0x68, 0x37, 0x01, 0x03, + 0x68, 0x4b, 0x00, 0x06, 0x68, 0x47, 0x00, 0x00, 0x68, 0x50, 0xc0, 0xed, + 0x68, 0x52, 0x10, 0x78, 0x4a, 0x73, 0x2c, 0x68, 0x10, 0x78, 0x76, 0xc7, + 0x00, 0x40, 0x8c, 0xdf, 0x68, 0x18, 0x60, 0x1a, 0x0c, 0x7e, 0x2d, 0x60, + 0x10, 0x78, 0x8e, 0xd6, 0x0c, 0x7f, 0x00, 0x78, 0x8c, 0xe0, 0x2d, 0x60, + 0x0d, 0x7f, 0x60, 0x13, 0x00, 0x00, 0x60, 0x1f, 0x00, 0x01, 0x60, 0x07, + 0x00, 0x01, 0x60, 0x03, 0x00, 0x01, 0x10, 0x78, 0x5d, 0xd7, 0x10, 0x78, + 0x62, 0xd1, 0x00, 0x78, 0x8d, 0x01, 0x60, 0x30, 0xa0, 0x8c, 0xff, 0x00, + 0x81, 0x0f, 0xa1, 0x86, 0x00, 0x39, 0x00, 0x40, 0x8c, 0xfb, 0xa1, 0x86, + 0x00, 0x35, 0x00, 0xc0, 0x8c, 0xff, 0x10, 0x78, 0x28, 0x80, 0x00, 0x78, + 0x8c, 0xd1, 0x10, 0x78, 0x8e, 0xd6, 0x00, 0x7c, 0xa2, 0x84, 0x00, 0x0f, + 0x00, 0xc0, 0x8d, 0x13, 0xa2, 0x82, 0xae, 0x00, 0x00, 0x48, 0x8d, 0x13, + 0x20, 0x01, 0xa7, 0x16, 0x20, 0x04, 0xa2, 0x02, 0x00, 0xc8, 0x8d, 0x13, + 0xa0, 0x85, 0x00, 0x01, 0x00, 0x7c, 0xa0, 0x06, 0x00, 0x78, 0x8d, 0x12, + 0x02, 0x7e, 0x0e, 0x7e, 0x20, 0x71, 0xa7, 0x00, 0x62, 0x10, 0x70, 0x5c, + 0xa2, 0x02, 0x00, 0x48, 0x8d, 0x28, 0x70, 0x60, 0xa2, 0x02, 0x00, 0xc8, + 0x8d, 0x28, 0xa0, 0x85, 0x00, 0x01, 0x0e, 0x7f, 0x02, 0x7f, 0x00, 0x7c, + 0xa0, 0x06, 0x00, 0x78, 0x8d, 0x25, 0x0e, 0x7e, 0x0c, 0x7e, 0x03, 0x7e, + 0x00, 0x7e, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x20, 0x61, 0xae, 0x00, + 0x20, 0x71, 0xa7, 0x00, 0x73, 0x48, 0x70, 0x64, 0xa3, 0x02, 0x00, 0xc8, + 0x8d, 0x55, 0x60, 0x1c, 0xa2, 0x06, 0x00, 0xc0, 0x8d, 0x4d, 0x10, 0x78, + 0x90, 0x3b, 0x00, 0x40, 0x8d, 0x4d, 0x10, 0x78, 0x8f, 0x10, 0x00, 0xc0, + 0x8d, 0x49, 0x10, 0x78, 0x7c, 0x83, 0x0c, 0x7e, 0x10, 0x78, 0x77, 0x2d, + 0x0c, 0x7f, 0xac, 0xe0, 0x00, 0x10, 0x70, 0x58, 0xac, 0x02, 0x00, 0xc8, + 0x8d, 0x55, 0x00, 0x78, 0x8d, 0x36, 0x12, 0x7f, 0x00, 0x7f, 0x03, 0x7f, + 0x0c, 0x7f, 0x0e, 0x7f, 0x00, 0x7c, 0x0e, 0x7e, 0x0c, 0x7e, 0x01, 0x7e, + 0xa1, 0x88, 0xa8, 0x35, 0x21, 0x0c, 0x81, 0xff, 0x00, 0x40, 0x8d, 0x69, + 0x20, 0x61, 0xaa, 0xb3, 0x61, 0x1a, 0x10, 0x78, 0x28, 0x80, 0xa0, 0x06, + 0x00, 0x78, 0x8d, 0x6e, 0xa0, 0x85, 0x00, 0x01, 0x01, 0x7f, 0x0c, 0x7f, + 0x0e, 0x7f, 0x00, 0x7c, 0x0c, 0x7e, 0x05, 0x7e, 0x12, 0x7e, 0x20, 0x91, + 0x80, 0x00, 0x0c, 0x7e, 0x10, 0x78, 0x76, 0xc7, 0x05, 0x7f, 0x00, 0x40, + 0x8d, 0x8b, 0x66, 0x12, 0x65, 0x1a, 0x60, 0x1f, 0x00, 0x03, 0x20, 0x09, + 0x00, 0x4b, 0x10, 0x78, 0x77, 0x5c, 0xa0, 0x85, 0x00, 0x01, 0x12, 0x7f, + 0x05, 0x7f, 0x0c, 0x7f, 0x00, 0x7c, 0xa0, 0x06, 0x00, 0x78, 0x8d, 0x87, + 0x0c, 0x7e, 0x05, 0x7e, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x62, 0xa0, + 0x0c, 0x7e, 0x10, 0x78, 0x76, 0xc7, 0x05, 0x7f, 0x00, 0x40, 0x8d, 0xb9, + 0x60, 0x13, 0x00, 0x00, 0x65, 0x1a, 0x60, 0x1f, 0x00, 0x03, 0x0c, 0x7e, + 0x25, 0x60, 0x10, 0x78, 0x47, 0xe9, 0x0c, 0x7f, 0x10, 0x78, 0x5f, 0x01, + 0x07, 0x7e, 0x20, 0x39, 0x00, 0x00, 0x10, 0x78, 0x5e, 0x0a, 0x2c, 0x08, + 0x10, 0x78, 0x9f, 0x9b, 0x07, 0x7f, 0x20, 0x09, 0x00, 0x4c, 0x10, 0x78, + 0x77, 0x5c, 0xa0, 0x85, 0x00, 0x01, 0x12, 0x7f, 0x05, 0x7f, 0x0c, 0x7f, + 0x00, 0x7c, 0xa0, 0x06, 0x00, 0x78, 0x8d, 0xb5, 0x0f, 0x7e, 0x0c, 0x7e, + 0x04, 0x7e, 0x0c, 0x7e, 0x10, 0x78, 0x76, 0xc7, 0x2c, 0x78, 0x0c, 0x7f, + 0x00, 0x40, 0x8d, 0xd6, 0x7e, 0x12, 0x2c, 0x00, 0x78, 0x1a, 0x78, 0x1f, + 0x00, 0x03, 0x20, 0x21, 0x00, 0x05, 0x10, 0x78, 0x8e, 0x21, 0x2f, 0x60, + 0x20, 0x09, 0x00, 0x4d, 0x10, 0x78, 0x77, 0x5c, 0xa0, 0x85, 0x00, 0x01, + 0x04, 0x7f, 0x0c, 0x7f, 0x0f, 0x7f, 0x00, 0x7c, 0x0f, 0x7e, 0x0c, 0x7e, + 0x04, 0x7e, 0x0c, 0x7e, 0x10, 0x78, 0x76, 0xc7, 0x2c, 0x78, 0x0c, 0x7f, + 0x00, 0x40, 0x8d, 0xf4, 0x7e, 0x12, 0x2c, 0x00, 0x78, 0x1a, 0x78, 0x1f, + 0x00, 0x03, 0x20, 0x21, 0x00, 0x05, 0x10, 0x78, 0x8e, 0x21, 0x2f, 0x60, + 0x20, 0x09, 0x00, 0x4e, 0x10, 0x78, 0x77, 0x5c, 0xa0, 0x85, 0x00, 0x01, + 0x04, 0x7f, 0x0c, 0x7f, 0x0f, 0x7f, 0x00, 0x7c, 0x0f, 0x7e, 0x0c, 0x7e, + 0x04, 0x7e, 0x0c, 0x7e, 0x10, 0x78, 0x76, 0xc7, 0x2c, 0x78, 0x0c, 0x7f, + 0x00, 0x40, 0x8e, 0x1d, 0x7e, 0x12, 0x2c, 0x00, 0x78, 0x1a, 0x78, 0x1f, + 0x00, 0x03, 0x20, 0x21, 0x00, 0x04, 0x10, 0x78, 0x8e, 0x21, 0x20, 0x01, + 0xa9, 0x9d, 0x20, 0x04, 0xd0, 0xfc, 0x00, 0x40, 0x8e, 0x16, 0x2f, 0x60, + 0x10, 0x78, 0x77, 0x2d, 0x00, 0x78, 0x8e, 0x1b, 0x2f, 0x60, 0x20, 0x09, + 0x00, 0x52, 0x10, 0x78, 0x77, 0x5c, 0xa0, 0x85, 0x00, 0x01, 0x04, 0x7f, + 0x0c, 0x7f, 0x0f, 0x7f, 0x00, 0x7c, 0x09, 0x7e, 0x07, 0x7e, 0x12, 0x7e, + 0x20, 0x91, 0x80, 0x00, 0x10, 0x78, 0x47, 0x75, 0x00, 0x40, 0x8e, 0x2e, + 0x20, 0x01, 0x8e, 0x26, 0x00, 0x78, 0x8e, 0x34, 0x10, 0x78, 0x47, 0x39, + 0x00, 0x40, 0x8e, 0x3d, 0x20, 0x01, 0x8e, 0x2e, 0x00, 0x7e, 0xa0, 0x0e, + 0x24, 0x00, 0x10, 0x78, 0x4b, 0x51, 0x10, 0x78, 0x4a, 0x73, 0x00, 0x7f, + 0x00, 0x7a, 0x24, 0x18, 0x10, 0x78, 0x61, 0x61, 0x62, 0xa0, 0x08, 0x7e, + 0x20, 0x41, 0x00, 0x01, 0x20, 0x39, 0x00, 0x01, 0x26, 0x08, 0x10, 0x78, + 0x5f, 0x1b, 0x08, 0x7f, 0x10, 0x78, 0x5e, 0x0a, 0x2f, 0x08, 0x26, 0x48, + 0x10, 0x78, 0x9f, 0x9b, 0x61, 0x3c, 0x81, 0xff, 0x10, 0x40, 0x5f, 0xdb, + 0x10, 0x78, 0x62, 0xd1, 0x12, 0x7f, 0x07, 0x7f, 0x09, 0x7f, 0x00, 0x7c, + 0x0c, 0x7e, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x0c, 0x7e, 0x10, 0x78, + 0x76, 0xc7, 0x01, 0x7f, 0x00, 0x40, 0x8e, 0x73, 0x66, 0x0a, 0x61, 0x1a, + 0x60, 0x1f, 0x00, 0x01, 0x2d, 0x00, 0x60, 0x12, 0x20, 0x09, 0x00, 0x1f, + 0x10, 0x78, 0x77, 0x5c, 0xa0, 0x85, 0x00, 0x01, 0x12, 0x7f, 0x0c, 0x7f, + 0x00, 0x7c, 0xa0, 0x06, 0x00, 0x78, 0x8e, 0x70, 0x0c, 0x7e, 0x12, 0x7e, + 0x20, 0x91, 0x80, 0x00, 0x0c, 0x7e, 0x10, 0x78, 0x76, 0xc7, 0x01, 0x7f, + 0x00, 0x40, 0x8e, 0x8f, 0x66, 0x0a, 0x61, 0x1a, 0x60, 0x1f, 0x00, 0x08, + 0x2d, 0x00, 0x60, 0x12, 0x20, 0x09, 0x00, 0x21, 0x10, 0x78, 0x77, 0x5c, + 0xa0, 0x85, 0x00, 0x01, 0x12, 0x7f, 0x0c, 0x7f, 0x00, 0x7c, 0xa0, 0x06, + 0x00, 0x78, 0x8e, 0x8c, 0x0c, 0x7e, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, + 0x0c, 0x7e, 0x10, 0x78, 0x76, 0xc7, 0x01, 0x7f, 0x00, 0x40, 0x8e, 0xab, + 0x66, 0x0a, 0x61, 0x1a, 0x60, 0x1f, 0x00, 0x01, 0x2d, 0x00, 0x60, 0x12, + 0x20, 0x09, 0x00, 0x3d, 0x10, 0x78, 0x77, 0x5c, 0xa0, 0x85, 0x00, 0x01, + 0x12, 0x7f, 0x0c, 0x7f, 0x00, 0x7c, 0xa0, 0x06, 0x00, 0x78, 0x8e, 0xa8, + 0x0c, 0x7e, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x0c, 0x7e, 0x10, 0x78, + 0x76, 0xc7, 0x01, 0x7f, 0x00, 0x40, 0x8e, 0xc6, 0x61, 0x1a, 0x60, 0x1f, + 0x00, 0x01, 0x2d, 0x00, 0x60, 0x12, 0x20, 0x09, 0x00, 0x00, 0x10, 0x78, + 0x77, 0x5c, 0xa0, 0x85, 0x00, 0x01, 0x12, 0x7f, 0x0c, 0x7f, 0x00, 0x7c, + 0xa0, 0x06, 0x00, 0x78, 0x8e, 0xc3, 0x02, 0x7e, 0x0d, 0x7e, 0x62, 0x18, + 0x22, 0x68, 0x6a, 0x3c, 0x82, 0xff, 0x00, 0x40, 0x8e, 0xd3, 0x82, 0x11, + 0x6a, 0x3e, 0x0d, 0x7f, 0x02, 0x7f, 0x00, 0x7c, 0x00, 0x7e, 0x60, 0x00, + 0xa0, 0x86, 0x00, 0x00, 0x00, 0x40, 0x8e, 0xe8, 0x60, 0x13, 0x00, 0x00, + 0x60, 0x1f, 0x00, 0x07, 0x20, 0x01, 0xa9, 0xa3, 0x20, 0x04, 0x60, 0x16, + 0x10, 0x78, 0xa4, 0xa5, 0x60, 0x3f, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x7c, + 0x06, 0x7e, 0x0c, 0x7e, 0x0d, 0x7e, 0x20, 0x31, 0xa7, 0x53, 0x26, 0x34, + 0xd6, 0xe4, 0x00, 0x40, 0x8e, 0xf8, 0x66, 0x18, 0x26, 0x60, 0x6e, 0x48, + 0x10, 0x78, 0x46, 0xe7, 0x0d, 0x7f, 0x0c, 0x7f, 0x06, 0x7f, 0x00, 0x7c, + 0x00, 0x7e, 0x01, 0x7e, 0x60, 0x04, 0xa0, 0x8e, 0x00, 0x02, 0x00, 0x40, + 0x8f, 0x0d, 0xa0, 0x8e, 0x00, 0x03, 0x00, 0x40, 0x8f, 0x0d, 0xa0, 0x8e, + 0x00, 0x04, 0x00, 0x40, 0x8f, 0x0d, 0xa0, 0x85, 0x00, 0x01, 0x01, 0x7f, + 0x00, 0x7f, 0x00, 0x7c, 0x00, 0x7e, 0x0d, 0x7e, 0x60, 0x10, 0xa0, 0x6d, + 0x00, 0x40, 0x8f, 0x1d, 0x68, 0x38, 0xd0, 0xfc, 0x00, 0x40, 0x8f, 0x1d, + 0xa0, 0x06, 0x00, 0x78, 0x8f, 0x1f, 0xa0, 0x85, 0x00, 0x01, 0x0d, 0x7f, + 0x00, 0x7f, 0x00, 0x7c, 0x0c, 0x7e, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, + 0x0c, 0x7e, 0x10, 0x78, 0x76, 0xc7, 0x01, 0x7f, 0x00, 0x40, 0x8f, 0x3c, + 0x61, 0x1a, 0x60, 0x1f, 0x00, 0x01, 0x2d, 0x00, 0x60, 0x12, 0x10, 0x78, + 0x28, 0x80, 0x20, 0x09, 0x00, 0x28, 0x10, 0x78, 0x77, 0x5c, 0xa0, 0x85, + 0x00, 0x01, 0x12, 0x7f, 0x0c, 0x7f, 0x00, 0x7c, 0xa0, 0x06, 0x00, 0x78, + 0x8f, 0x39, 0xa1, 0x86, 0x00, 0x15, 0x00, 0xc0, 0x8f, 0x54, 0x20, 0x11, + 0xa7, 0x20, 0x22, 0x04, 0xa0, 0x86, 0x00, 0x74, 0x00, 0xc0, 0x8f, 0x54, + 0x10, 0x78, 0x7f, 0x91, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x29, + 0x10, 0x78, 0x5d, 0xd7, 0x00, 0x78, 0x8f, 0x58, 0x10, 0x78, 0x7c, 0x83, + 0x10, 0x78, 0x77, 0x2d, 0x00, 0x7c, 0xa1, 0x86, 0x00, 0x16, 0x00, 0xc0, + 0x8f, 0x63, 0x20, 0x01, 0x00, 0x04, 0x10, 0x78, 0x45, 0x02, 0x00, 0x78, + 0x8f, 0x84, 0xa1, 0x86, 0x00, 0x15, 0x00, 0xc0, 0x8f, 0x88, 0x20, 0x11, + 0xa7, 0x20, 0x22, 0x04, 0xa0, 0x86, 0x00, 0x14, 0x00, 0xc0, 0x8f, 0x88, + 0x0d, 0x7e, 0x60, 0x18, 0x20, 0x68, 0x10, 0x78, 0x46, 0x49, 0x0d, 0x7f, + 0x10, 0x78, 0x80, 0x43, 0x00, 0xc0, 0x8f, 0x88, 0x0d, 0x7e, 0x60, 0x18, + 0x20, 0x68, 0x68, 0x90, 0x0d, 0x7f, 0xa0, 0x05, 0x00, 0x40, 0x8f, 0x88, + 0x20, 0x01, 0x00, 0x06, 0x10, 0x78, 0x45, 0x02, 0x10, 0x78, 0x77, 0xf8, + 0x00, 0x78, 0x8f, 0x8c, 0x10, 0x78, 0x7c, 0x83, 0x10, 0x78, 0x77, 0x2d, + 0x00, 0x7c, 0x68, 0x48, 0xa0, 0x86, 0x00, 0x05, 0x00, 0xc0, 0x8f, 0x94, + 0x10, 0x78, 0x8f, 0x95, 0x00, 0x7c, 0x68, 0x50, 0xc0, 0xad, 0x68, 0x52, + 0x00, 0x7c, 0x0e, 0x7e, 0x20, 0x71, 0xac, 0x8c, 0x70, 0x14, 0xd0, 0xe4, + 0x00, 0x40, 0x8f, 0xaa, 0x60, 0x13, 0x00, 0x00, 0x60, 0x03, 0x00, 0x01, + 0x60, 0x07, 0x00, 0x50, 0x10, 0x78, 0x5d, 0x8a, 0x10, 0x78, 0x62, 0xd1, + 0x0e, 0x7f, 0x00, 0x7c, 0x0c, 0x7e, 0x0f, 0x7e, 0x2c, 0x78, 0x10, 0x78, + 0x49, 0x63, 0x0f, 0x7f, 0x00, 0x40, 0x8f, 0xb9, 0x60, 0x1c, 0xa0, 0x84, + 0x00, 0x0f, 0x10, 0x79, 0x8f, 0xbb, 0x0c, 0x7f, 0x00, 0x7c, 0x8a, 0xe5, + 0x8f, 0xc6, 0x8f, 0xc9, 0x8f, 0xcc, 0xa2, 0x6d, 0xa2, 0x89, 0xa2, 0x8c, + 0x8a, 0xe5, 0x8a, 0xe5, 0x10, 0x78, 0x13, 0x32, 0x00, 0x05, 0x00, 0x05, + 0x00, 0x7c, 0x00, 0x05, 0x00, 0x05, 0x00, 0x7c, 0x10, 0x78, 0x8f, 0xcf, + 0x00, 0x7c, 0x0f, 0x7e, 0x2c, 0x78, 0x10, 0x78, 0x49, 0x63, 0x00, 0x40, + 0x8f, 0xfe, 0x10, 0x78, 0x76, 0xc7, 0x00, 0xc0, 0x8f, 0xdf, 0x20, 0x01, + 0xa9, 0xa4, 0x20, 0x04, 0x78, 0x3e, 0x00, 0x78, 0x8f, 0xfe, 0x78, 0x18, + 0x60, 0x1a, 0x78, 0x1c, 0xa0, 0x86, 0x00, 0x03, 0x00, 0x40, 0x8f, 0xec, + 0x78, 0x08, 0x60, 0x36, 0x2f, 0x00, 0x60, 0x3a, 0x00, 0x78, 0x8f, 0xf0, + 0x78, 0x08, 0x60, 0x3a, 0x2f, 0x00, 0x60, 0x36, 0x60, 0x2a, 0x60, 0x1f, + 0x00, 0x01, 0x60, 0x07, 0x00, 0x35, 0x60, 0x03, 0x00, 0x01, 0x79, 0x20, + 0x61, 0x22, 0x10, 0x78, 0x5d, 0x8a, 0x10, 0x78, 0x62, 0xd1, 0x2f, 0x60, + 0x0f, 0x7f, 0x00, 0x7c, 0x01, 0x7e, 0x0f, 0x7e, 0x68, 0x2c, 0x60, 0x32, + 0xa0, 0x8e, 0x00, 0x01, 0x00, 0x40, 0x90, 0x11, 0xa0, 0x86, 0x00, 0x05, + 0x00, 0x40, 0x90, 0x15, 0xa0, 0x06, 0x60, 0x2a, 0x60, 0x2e, 0x00, 0x78, + 0x90, 0x26, 0x68, 0x24, 0xc0, 0xf4, 0xc0, 0xd5, 0x68, 0x26, 0x68, 0x10, + 0x20, 0x78, 0x78, 0x7c, 0x69, 0x38, 0xa1, 0x02, 0x78, 0x80, 0x69, 0x34, + 0xa1, 0x03, 0x00, 0xc8, 0x90, 0x0c, 0x68, 0x34, 0x60, 0x2a, 0x68, 0x38, + 0xa0, 0x84, 0xff, 0xfc, 0x68, 0x3a, 0x60, 0x2e, 0x2d, 0x00, 0x60, 0x36, + 0x68, 0x08, 0x60, 0x3a, 0x69, 0x18, 0x61, 0x1a, 0x69, 0x20, 0x61, 0x22, + 0x60, 0x1f, 0x00, 0x01, 0x60, 0x07, 0x00, 0x39, 0x60, 0x03, 0x00, 0x01, + 0x10, 0x78, 0x5d, 0x8a, 0x68, 0x03, 0x00, 0x02, 0x0f, 0x7f, 0x01, 0x7f, + 0x00, 0x7c, 0x00, 0x7e, 0x01, 0x7e, 0x60, 0x04, 0xa0, 0x8e, 0x00, 0x34, + 0x00, 0x40, 0x90, 0x60, 0xa0, 0x8e, 0x00, 0x35, 0x00, 0x40, 0x90, 0x60, + 0xa0, 0x8e, 0x00, 0x36, 0x00, 0x40, 0x90, 0x60, 0xa0, 0x8e, 0x00, 0x37, + 0x00, 0x40, 0x90, 0x60, 0xa0, 0x8e, 0x00, 0x38, 0x00, 0x40, 0x90, 0x60, + 0xa0, 0x8e, 0x00, 0x39, 0x00, 0x40, 0x90, 0x60, 0xa0, 0x8e, 0x00, 0x3a, + 0x00, 0x40, 0x90, 0x60, 0xa0, 0x8e, 0x00, 0x3b, 0x00, 0x40, 0x90, 0x60, + 0xa0, 0x85, 0x00, 0x01, 0x01, 0x7f, 0x00, 0x7f, 0x00, 0x7c, 0x0f, 0x7e, + 0x2c, 0x78, 0x10, 0x78, 0x49, 0x63, 0x00, 0xc0, 0x90, 0x6d, 0xa0, 0x85, + 0x00, 0x01, 0x00, 0x78, 0x90, 0x7c, 0x60, 0x24, 0xd0, 0xf4, 0x00, 0xc0, + 0x90, 0x7b, 0xc0, 0xf5, 0x60, 0x26, 0x60, 0x10, 0x20, 0x78, 0x78, 0x28, + 0x60, 0x3a, 0x78, 0x2c, 0x60, 0x36, 0x10, 0x78, 0x17, 0x57, 0xa0, 0x06, + 0x0f, 0x7f, 0x00, 0x7c, 0x00, 0x7e, 0x01, 0x7e, 0x02, 0x7e, 0x03, 0x7e, + 0x0e, 0x7e, 0x20, 0x01, 0xa9, 0x9e, 0x20, 0x0c, 0x80, 0x00, 0x20, 0x14, + 0x20, 0x01, 0x00, 0x32, 0x10, 0x78, 0x5c, 0x1c, 0x20, 0x01, 0xa9, 0xa2, + 0x82, 0xff, 0x00, 0xc0, 0x90, 0x93, 0x20, 0x11, 0x00, 0x14, 0x22, 0x02, + 0x20, 0x01, 0xa9, 0xa0, 0x20, 0x0c, 0x80, 0x00, 0x20, 0x14, 0x20, 0x71, + 0xa9, 0x8d, 0x71, 0x1a, 0x72, 0x1e, 0x20, 0x01, 0x00, 0x64, 0x10, 0x78, + 0x5c, 0x1c, 0x20, 0x01, 0xa9, 0xa3, 0x82, 0xff, 0x00, 0xc0, 0x90, 0xa8, + 0x20, 0x11, 0x00, 0x14, 0x22, 0x02, 0x20, 0x09, 0xa9, 0xa4, 0xa2, 0x80, + 0x00, 0x0a, 0x20, 0x0a, 0x10, 0x78, 0x49, 0x8b, 0x0e, 0x7f, 0x03, 0x7f, + 0x02, 0x7f, 0x01, 0x7f, 0x00, 0x7f, 0x00, 0x7c, 0x00, 0x7e, 0x0e, 0x7e, + 0x20, 0x01, 0xa9, 0xa2, 0x20, 0x03, 0x00, 0x28, 0x20, 0x01, 0xa9, 0xa3, + 0x20, 0x03, 0x00, 0x14, 0x20, 0x71, 0xa9, 0x8d, 0x70, 0x1b, 0x00, 0x00, + 0x70, 0x1f, 0x07, 0xd0, 0x20, 0x01, 0xa9, 0xa4, 0x20, 0x03, 0x00, 0x1e, + 0x0e, 0x7f, 0x00, 0x7f, 0x00, 0x7c, 0x0c, 0x7e, 0x12, 0x7e, 0x20, 0x91, + 0x80, 0x00, 0x0c, 0x7e, 0x10, 0x78, 0x76, 0xc7, 0x01, 0x7f, 0x00, 0x40, + 0x90, 0xe5, 0x61, 0x1a, 0x60, 0x1f, 0x00, 0x01, 0x2d, 0x00, 0x60, 0x12, + 0x20, 0x09, 0x00, 0x33, 0x10, 0x78, 0x77, 0x5c, 0xa0, 0x85, 0x00, 0x01, + 0x12, 0x7f, 0x0c, 0x7f, 0x00, 0x7c, 0xa0, 0x06, 0x00, 0x78, 0x90, 0xe2, + 0x0d, 0x7e, 0x0e, 0x7e, 0x0f, 0x7e, 0x20, 0x71, 0xa7, 0x00, 0xa1, 0x86, + 0x00, 0x15, 0x00, 0xc0, 0x91, 0x17, 0x70, 0x80, 0xa0, 0x86, 0x00, 0x18, + 0x00, 0xc0, 0x91, 0x17, 0x60, 0x10, 0x20, 0x68, 0x6a, 0x3c, 0xd2, 0xe4, + 0x00, 0xc0, 0x91, 0x0b, 0x2c, 0x78, 0x10, 0x78, 0x64, 0x90, 0x00, 0x40, + 0x91, 0x1f, 0x70, 0x6c, 0x6a, 0x50, 0xa2, 0x06, 0x00, 0xc0, 0x91, 0x13, + 0x70, 0x70, 0x6a, 0x54, 0xa2, 0x06, 0x00, 0xc0, 0x91, 0x13, 0x62, 0x18, + 0xa2, 0x90, 0x00, 0x28, 0x22, 0x14, 0x20, 0x09, 0x00, 0x00, 0x10, 0x78, + 0x28, 0xc8, 0x10, 0x78, 0x77, 0xf8, 0x00, 0x78, 0x91, 0x1b, 0x10, 0x78, + 0x7c, 0x83, 0x10, 0x78, 0x77, 0x2d, 0x0f, 0x7f, 0x0e, 0x7f, 0x0d, 0x7f, + 0x00, 0x7c, 0x70, 0x50, 0xa0, 0x80, 0x29, 0xc0, 0x20, 0x04, 0x6a, 0x54, + 0xa2, 0x06, 0x00, 0x40, 0x91, 0x0b, 0x00, 0x78, 0x91, 0x13, 0x0c, 0x7e, + 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x0c, 0x7e, 0x10, 0x78, 0x76, 0xc7, + 0x01, 0x7f, 0x00, 0x40, 0x91, 0x41, 0x61, 0x1a, 0x60, 0x1f, 0x00, 0x01, + 0x2d, 0x00, 0x60, 0x12, 0x20, 0x09, 0x00, 0x43, 0x10, 0x78, 0x77, 0x5c, + 0xa0, 0x85, 0x00, 0x01, 0x12, 0x7f, 0x0c, 0x7f, 0x00, 0x7c, 0xa0, 0x06, + 0x00, 0x78, 0x91, 0x3e, 0x0d, 0x7e, 0x0e, 0x7e, 0x0f, 0x7e, 0x20, 0x71, + 0xa7, 0x00, 0xa1, 0x86, 0x00, 0x15, 0x00, 0xc0, 0x91, 0x6a, 0x70, 0x80, + 0xa0, 0x86, 0x00, 0x04, 0x00, 0xc0, 0x91, 0x6a, 0x60, 0x10, 0xa0, 0xe8, + 0x00, 0x0f, 0x2c, 0x78, 0x10, 0x78, 0x64, 0x90, 0x00, 0x40, 0x91, 0x72, + 0x70, 0x6c, 0x6a, 0x08, 0xa2, 0x06, 0x00, 0xc0, 0x91, 0x66, 0x70, 0x70, + 0x6a, 0x0c, 0xa2, 0x06, 0x00, 0xc0, 0x91, 0x66, 0x10, 0x78, 0x28, 0x80, + 0x10, 0x78, 0x77, 0xf8, 0x00, 0x78, 0x91, 0x6e, 0x10, 0x78, 0x7c, 0x83, + 0x10, 0x78, 0x77, 0x2d, 0x0f, 0x7f, 0x0e, 0x7f, 0x0d, 0x7f, 0x00, 0x7c, + 0x70, 0x50, 0xa0, 0x80, 0x29, 0xc0, 0x20, 0x04, 0x6a, 0x0c, 0xa2, 0x06, + 0x00, 0x40, 0x91, 0x64, 0x00, 0x78, 0x91, 0x66, 0x01, 0x7e, 0x02, 0x7e, + 0x68, 0x4c, 0xd0, 0xac, 0x00, 0x40, 0x91, 0x94, 0x69, 0x14, 0x6a, 0x10, + 0x21, 0x00, 0xa2, 0x05, 0x00, 0x40, 0x91, 0x94, 0x68, 0x60, 0xa1, 0x06, + 0x00, 0xc0, 0x91, 0x90, 0x68, 0x5c, 0xa2, 0x06, 0x00, 0x40, 0x91, 0x94, + 0x69, 0x62, 0x6a, 0x5e, 0xa0, 0x85, 0x00, 0x01, 0x02, 0x7f, 0x01, 0x7f, + 0x00, 0x7c, 0x0e, 0x7e, 0x12, 0x7e, 0x20, 0x71, 0xa7, 0x00, 0x20, 0x91, + 0x80, 0x00, 0x75, 0x48, 0xa5, 0x82, 0x00, 0x01, 0x00, 0x48, 0x91, 0xc9, + 0x70, 0x4c, 0x20, 0x60, 0x60, 0x00, 0xa0, 0x86, 0x00, 0x00, 0x00, 0x40, + 0x91, 0xb5, 0xac, 0xe0, 0x00, 0x10, 0x70, 0x58, 0xac, 0x02, 0x00, 0xc8, + 0x91, 0xb1, 0x00, 0x78, 0x91, 0xa4, 0x20, 0x61, 0xae, 0x00, 0x00, 0x78, + 0x91, 0xa4, 0x60, 0x03, 0x00, 0x08, 0x85, 0x29, 0x75, 0x4a, 0xac, 0xa8, + 0x00, 0x10, 0x70, 0x58, 0xa5, 0x02, 0x00, 0xc8, 0x91, 0xc5, 0x75, 0x4e, + 0xa0, 0x85, 0x00, 0x01, 0x12, 0x7f, 0x0e, 0x7f, 0x00, 0x7c, 0x70, 0x4f, + 0xae, 0x00, 0x00, 0x78, 0x91, 0xc0, 0xa0, 0x06, 0x00, 0x78, 0x91, 0xc2, + 0x0c, 0x7e, 0x02, 0x7e, 0x01, 0x7e, 0xa1, 0x86, 0x00, 0x35, 0x00, 0x40, + 0x91, 0xd6, 0x6a, 0x34, 0x00, 0x78, 0x91, 0xd7, 0x6a, 0x28, 0x10, 0x78, + 0x8d, 0x02, 0x00, 0x40, 0x92, 0x00, 0x22, 0x60, 0x61, 0x1c, 0xa1, 0x86, + 0x00, 0x03, 0x00, 0x40, 0x91, 0xe5, 0xa1, 0x86, 0x00, 0x06, 0x00, 0xc0, + 0x91, 0xfc, 0x68, 0x34, 0xa2, 0x06, 0x00, 0x40, 0x91, 0xf4, 0x68, 0x38, + 0xa2, 0x06, 0x00, 0xc0, 0x91, 0xfc, 0x61, 0x08, 0x68, 0x34, 0xa1, 0x06, + 0x00, 0xc0, 0x91, 0xfc, 0x00, 0x78, 0x91, 0xf9, 0x60, 0x08, 0x69, 0x38, + 0xa1, 0x06, 0x00, 0xc0, 0x91, 0xfc, 0x60, 0x18, 0x69, 0x18, 0xa1, 0x06, + 0x01, 0x7f, 0x02, 0x7f, 0x0c, 0x7f, 0x00, 0x7c, 0xa0, 0x85, 0x00, 0x01, + 0x00, 0x78, 0x91, 0xfc, 0x69, 0x44, 0xd1, 0xcc, 0x00, 0x40, 0x92, 0x1d, + 0xa1, 0x8c, 0x00, 0xff, 0xa1, 0x8e, 0x00, 0x02, 0x00, 0xc0, 0x92, 0x1d, + 0xad, 0x88, 0x00, 0x1e, 0x21, 0x0c, 0xa1, 0x8c, 0x0f, 0x00, 0x81, 0x0f, + 0xa1, 0x8e, 0x00, 0x01, 0x00, 0xc0, 0x92, 0x1d, 0x68, 0x10, 0x69, 0x14, + 0xa1, 0x15, 0x10, 0xc0, 0x84, 0xe2, 0x00, 0x7c, 0x06, 0x7e, 0x60, 0x00, + 0xa0, 0xb2, 0x00, 0x10, 0x10, 0xc8, 0x13, 0x32, 0x10, 0x79, 0x92, 0x28, + 0x06, 0x7f, 0x00, 0x7c, 0x92, 0x38, 0x96, 0xef, 0x98, 0x0b, 0x92, 0x38, + 0x92, 0x38, 0x92, 0x38, 0x92, 0x38, 0x92, 0x38, 0x92, 0x72, 0x98, 0x9e, + 0x92, 0x38, 0x92, 0x38, 0x92, 0x38, 0x92, 0x38, 0x92, 0x38, 0x92, 0x38, + 0x10, 0x78, 0x13, 0x32, 0x06, 0x7e, 0x60, 0x00, 0xa0, 0xb2, 0x00, 0x10, + 0x10, 0xc8, 0x13, 0x32, 0x10, 0x79, 0x92, 0x44, 0x06, 0x7f, 0x00, 0x7c, + 0x92, 0x54, 0x9d, 0x63, 0x92, 0x54, 0x92, 0x54, 0x92, 0x54, 0x92, 0x54, + 0x92, 0x54, 0x92, 0x54, 0x9d, 0x21, 0x9d, 0xb1, 0x92, 0x54, 0xa3, 0xc0, + 0xa3, 0xf4, 0xa3, 0xc0, 0xa3, 0xf4, 0x92, 0x54, 0x10, 0x78, 0x13, 0x32, + 0x06, 0x7e, 0x60, 0x00, 0xa0, 0xb2, 0x00, 0x10, 0x10, 0xc8, 0x13, 0x32, + 0x10, 0x79, 0x92, 0x60, 0x06, 0x7f, 0x00, 0x7c, 0x92, 0x70, 0x99, 0xfb, + 0x9a, 0xd7, 0x9b, 0x05, 0x9b, 0x80, 0x92, 0x70, 0x9c, 0x86, 0x9c, 0x2e, + 0x98, 0xaa, 0x9c, 0xf5, 0x9d, 0x0b, 0x92, 0x70, 0x92, 0x70, 0x92, 0x70, + 0x92, 0x70, 0x92, 0x70, 0x10, 0x78, 0x13, 0x32, 0xa1, 0xb2, 0x00, 0x44, + 0x10, 0xc8, 0x13, 0x32, 0x21, 0x00, 0x00, 0x79, 0x92, 0x79, 0x92, 0xb9, + 0x94, 0xa8, 0x92, 0xb9, 0x92, 0xb9, 0x92, 0xb9, 0x94, 0xb0, 0x92, 0xb9, + 0x92, 0xb9, 0x92, 0xb9, 0x92, 0xb9, 0x92, 0xb9, 0x92, 0xb9, 0x92, 0xb9, + 0x92, 0xb9, 0x92, 0xb9, 0x92, 0xb9, 0x92, 0xb9, 0x92, 0xb9, 0x92, 0xb9, + 0x92, 0xb9, 0x92, 0xb9, 0x92, 0xb9, 0x92, 0xb9, 0x92, 0xbb, 0x93, 0x21, + 0x93, 0x30, 0x93, 0x87, 0x93, 0xa6, 0x94, 0x25, 0x94, 0x95, 0x92, 0xb9, + 0x92, 0xb9, 0x94, 0xb4, 0x92, 0xb9, 0x92, 0xb9, 0x94, 0xc7, 0x94, 0xd2, + 0x92, 0xb9, 0x92, 0xb9, 0x92, 0xb9, 0x92, 0xb9, 0x92, 0xb9, 0x95, 0x0a, + 0x92, 0xb9, 0x92, 0xb9, 0x95, 0x19, 0x92, 0xb9, 0x92, 0xb9, 0x92, 0xb9, + 0x92, 0xb9, 0x92, 0xb9, 0x92, 0xb9, 0x95, 0x32, 0x92, 0xb9, 0x92, 0xb9, + 0x92, 0xb9, 0x95, 0xbf, 0x92, 0xb9, 0x92, 0xb9, 0x92, 0xb9, 0x92, 0xb9, + 0x92, 0xb9, 0x92, 0xb9, 0x96, 0x39, 0x10, 0x78, 0x13, 0x32, 0x10, 0x78, + 0x49, 0x67, 0x00, 0xc0, 0x92, 0xcb, 0x20, 0x01, 0xa7, 0x33, 0x20, 0x04, + 0xd0, 0xcc, 0x00, 0xc0, 0x92, 0xcb, 0xa0, 0x84, 0x00, 0x09, 0xa0, 0x86, + 0x00, 0x08, 0x00, 0xc0, 0x92, 0xd3, 0x60, 0x07, 0x00, 0x09, 0x60, 0x2b, + 0x00, 0x09, 0x60, 0x13, 0x00, 0x00, 0x00, 0x78, 0x94, 0xa3, 0x10, 0x78, + 0x49, 0x57, 0x0e, 0x7e, 0x0c, 0x7e, 0x03, 0x7e, 0x02, 0x7e, 0x01, 0x7e, + 0x62, 0x18, 0x22, 0x70, 0x72, 0xa0, 0x02, 0x7e, 0x20, 0x19, 0x00, 0x29, + 0x10, 0x78, 0x5f, 0x01, 0x07, 0x7e, 0x20, 0x39, 0x00, 0x00, 0x10, 0x78, + 0x5e, 0x0a, 0x2c, 0x08, 0x10, 0x78, 0x9f, 0x9b, 0x07, 0x7f, 0x01, 0x7f, + 0x2e, 0x60, 0x10, 0x78, 0x47, 0xe9, 0x01, 0x7f, 0x02, 0x7f, 0x03, 0x7f, + 0x0c, 0x7f, 0x0e, 0x7f, 0x66, 0x18, 0x0c, 0x7e, 0x26, 0x60, 0x10, 0x78, + 0x45, 0xd6, 0x0c, 0x7f, 0xa6, 0xb0, 0x00, 0x01, 0x26, 0x34, 0xa6, 0x84, + 0x00, 0xff, 0xa0, 0x82, 0x00, 0x06, 0x00, 0x48, 0x93, 0x13, 0x10, 0x78, + 0x9e, 0xcf, 0x00, 0xc0, 0x93, 0x81, 0x10, 0x78, 0x9e, 0x60, 0x00, 0xc0, + 0x93, 0x0f, 0x60, 0x07, 0x00, 0x08, 0x00, 0x78, 0x94, 0xa3, 0x60, 0x07, + 0x00, 0x09, 0x00, 0x78, 0x94, 0xa3, 0x10, 0x78, 0xa0, 0xaf, 0x00, 0x40, + 0x93, 0x1d, 0x10, 0x78, 0x9e, 0xcf, 0x00, 0x40, 0x93, 0x07, 0x00, 0x78, + 0x93, 0x81, 0x60, 0x13, 0x19, 0x00, 0x00, 0x78, 0x93, 0x0f, 0x10, 0x78, + 0x29, 0xbb, 0x00, 0xc0, 0x96, 0x74, 0x61, 0x06, 0x10, 0x78, 0x9e, 0x15, + 0x60, 0x07, 0x00, 0x06, 0x00, 0x78, 0x94, 0xa3, 0x60, 0x07, 0x00, 0x07, + 0x00, 0x78, 0x94, 0xa3, 0x10, 0x78, 0xa4, 0x2c, 0x00, 0xc0, 0x96, 0x74, + 0x10, 0x78, 0x29, 0xbb, 0x00, 0xc0, 0x96, 0x74, 0x0d, 0x7e, 0x66, 0x18, + 0x26, 0x68, 0x6e, 0x04, 0xa6, 0x84, 0x00, 0xff, 0xa0, 0x82, 0x00, 0x06, + 0x00, 0xc8, 0x93, 0x46, 0x20, 0x01, 0x00, 0x01, 0x10, 0x78, 0x44, 0xee, + 0xa6, 0xb4, 0xff, 0x00, 0x86, 0x37, 0xa6, 0x86, 0x00, 0x06, 0x00, 0x40, + 0x93, 0x63, 0xa6, 0x86, 0x00, 0x04, 0x00, 0x40, 0x93, 0x63, 0x6e, 0x04, + 0xa6, 0xb4, 0x00, 0xff, 0xa6, 0x86, 0x00, 0x06, 0x00, 0x40, 0x93, 0x63, + 0xa6, 0x86, 0x00, 0x04, 0x00, 0x40, 0x93, 0x63, 0xa6, 0x86, 0x00, 0x05, + 0x00, 0x40, 0x93, 0x63, 0x0d, 0x7f, 0x00, 0x78, 0x93, 0x81, 0x10, 0x78, + 0x9f, 0x35, 0x00, 0xc0, 0x93, 0x7c, 0xa6, 0x86, 0x00, 0x06, 0x00, 0xc0, + 0x93, 0x75, 0x02, 0x7e, 0x62, 0x18, 0xa2, 0x90, 0x00, 0x28, 0x22, 0x14, + 0x20, 0x09, 0x00, 0x00, 0x10, 0x78, 0x28, 0xc8, 0x02, 0x7f, 0x10, 0x78, + 0x46, 0x49, 0x60, 0x07, 0x00, 0x0a, 0x0d, 0x7f, 0x00, 0x78, 0x94, 0xa3, + 0x60, 0x07, 0x00, 0x0b, 0x0d, 0x7f, 0x00, 0x78, 0x94, 0xa3, 0x10, 0x78, + 0x28, 0x80, 0x60, 0x07, 0x00, 0x01, 0x00, 0x78, 0x94, 0xa3, 0x10, 0x78, + 0xa4, 0x2c, 0x00, 0xc0, 0x96, 0x74, 0x10, 0x78, 0x29, 0xbb, 0x00, 0xc0, + 0x96, 0x74, 0x66, 0x18, 0x0d, 0x7e, 0x26, 0x68, 0x6e, 0x04, 0x0d, 0x7f, + 0xa6, 0x86, 0x07, 0x07, 0x00, 0x40, 0x93, 0x81, 0x02, 0x7e, 0x62, 0x18, + 0xa2, 0x90, 0x00, 0x28, 0x22, 0x14, 0x20, 0x09, 0x00, 0x00, 0x10, 0x78, + 0x28, 0xc8, 0x02, 0x7f, 0x60, 0x07, 0x00, 0x0c, 0x00, 0x78, 0x94, 0xa3, + 0x10, 0x78, 0x49, 0x67, 0x00, 0xc0, 0x93, 0xb3, 0x20, 0x01, 0xa7, 0x33, + 0x20, 0x04, 0xa0, 0x84, 0x00, 0x09, 0xa0, 0x86, 0x00, 0x08, 0x00, 0xc0, + 0x93, 0xbb, 0x60, 0x07, 0x00, 0x09, 0x60, 0x2b, 0x00, 0x09, 0x60, 0x13, + 0x00, 0x00, 0x00, 0x78, 0x94, 0xa3, 0x10, 0x78, 0x49, 0x57, 0x66, 0x18, + 0xa6, 0xb0, 0x00, 0x01, 0x26, 0x34, 0xa6, 0x84, 0x00, 0xff, 0xa0, 0x82, + 0x00, 0x06, 0x00, 0x48, 0x93, 0xff, 0xa6, 0xb4, 0xff, 0x00, 0x86, 0x37, + 0xa6, 0x86, 0x00, 0x04, 0x00, 0x40, 0x93, 0xd2, 0xa6, 0x86, 0x00, 0x06, + 0x00, 0xc0, 0x93, 0x81, 0x10, 0x78, 0x9f, 0x44, 0x00, 0xc0, 0x93, 0xda, + 0x60, 0x07, 0x00, 0x0e, 0x00, 0x78, 0x94, 0xa3, 0x04, 0x7e, 0x64, 0x18, + 0xa4, 0xa0, 0x00, 0x28, 0x24, 0x24, 0xa4, 0xa4, 0x00, 0xff, 0x84, 0x27, + 0x04, 0x7e, 0x10, 0x78, 0x28, 0x80, 0x04, 0x7f, 0x01, 0x7e, 0xa0, 0x06, + 0x20, 0x09, 0xa7, 0x53, 0x21, 0x0c, 0xd1, 0xa4, 0x00, 0x40, 0x93, 0xf9, + 0x20, 0x09, 0x00, 0x29, 0x10, 0x78, 0xa2, 0x2d, 0x60, 0x18, 0x0d, 0x7e, + 0x20, 0x68, 0x68, 0x00, 0xc0, 0xe5, 0x68, 0x02, 0x0d, 0x7f, 0x01, 0x7f, + 0x04, 0x7f, 0x60, 0x07, 0x00, 0x01, 0x00, 0x78, 0x94, 0xa3, 0x20, 0x01, + 0x00, 0x01, 0x10, 0x78, 0x44, 0xee, 0x15, 0x7e, 0x01, 0x7e, 0x02, 0x7e, + 0x03, 0x7e, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x19, 0xa7, 0x05, 0x20, 0x11, + 0xac, 0x90, 0x10, 0x78, 0x80, 0xde, 0x03, 0x7f, 0x02, 0x7f, 0x01, 0x7f, + 0x15, 0x7f, 0xa0, 0x05, 0x00, 0x40, 0x94, 0x1f, 0xa6, 0xb4, 0xff, 0x00, + 0x86, 0x37, 0xa6, 0x86, 0x00, 0x06, 0x00, 0x40, 0x93, 0xd2, 0x00, 0x78, + 0x93, 0x81, 0x60, 0x13, 0x19, 0x00, 0x60, 0x07, 0x00, 0x09, 0x00, 0x78, + 0x94, 0xa3, 0x10, 0x78, 0x49, 0x67, 0x00, 0xc0, 0x94, 0x32, 0x20, 0x01, + 0xa7, 0x33, 0x20, 0x04, 0xa0, 0x84, 0x00, 0x09, 0xa0, 0x86, 0x00, 0x08, + 0x00, 0xc0, 0x94, 0x3a, 0x60, 0x07, 0x00, 0x09, 0x60, 0x2b, 0x00, 0x09, + 0x60, 0x13, 0x00, 0x00, 0x00, 0x78, 0x94, 0xa3, 0x10, 0x78, 0x49, 0x57, + 0x66, 0x18, 0xa6, 0xb0, 0x00, 0x01, 0x26, 0x34, 0xa6, 0x84, 0x00, 0xff, + 0xa0, 0x82, 0x00, 0x06, 0x00, 0x48, 0x94, 0x82, 0xa6, 0xb4, 0xff, 0x00, + 0x86, 0x37, 0xa6, 0x86, 0x00, 0x04, 0x00, 0x40, 0x94, 0x51, 0xa6, 0x86, + 0x00, 0x06, 0x00, 0xc0, 0x93, 0x81, 0x10, 0x78, 0x9f, 0x6f, 0x00, 0xc0, + 0x94, 0x5d, 0x10, 0x78, 0x9e, 0x60, 0x00, 0xc0, 0x94, 0x5d, 0x60, 0x07, + 0x00, 0x10, 0x00, 0x78, 0x94, 0xa3, 0x04, 0x7e, 0x64, 0x18, 0xa4, 0xa0, + 0x00, 0x28, 0x24, 0x24, 0xa4, 0xa4, 0x00, 0xff, 0x84, 0x27, 0x04, 0x7e, + 0x10, 0x78, 0x28, 0x80, 0x04, 0x7f, 0x01, 0x7e, 0xa0, 0x06, 0x20, 0x09, + 0xa7, 0x53, 0x21, 0x0c, 0xd1, 0xa4, 0x00, 0x40, 0x94, 0x7c, 0x20, 0x09, + 0x00, 0x29, 0x10, 0x78, 0xa2, 0x2d, 0x60, 0x18, 0x0d, 0x7e, 0x20, 0x68, + 0x68, 0x00, 0xc0, 0xe5, 0x68, 0x02, 0x0d, 0x7f, 0x01, 0x7f, 0x04, 0x7f, + 0x60, 0x07, 0x00, 0x01, 0x00, 0x78, 0x94, 0xa3, 0x10, 0x78, 0xa0, 0xaf, + 0x00, 0x40, 0x94, 0x8f, 0xa6, 0xb4, 0xff, 0x00, 0x86, 0x37, 0xa6, 0x86, + 0x00, 0x06, 0x00, 0x40, 0x94, 0x51, 0x00, 0x78, 0x93, 0x81, 0x60, 0x13, + 0x19, 0x00, 0x60, 0x07, 0x00, 0x09, 0x00, 0x78, 0x94, 0xa3, 0x10, 0x78, + 0x29, 0xbb, 0x00, 0xc0, 0x96, 0x74, 0x10, 0x78, 0xa4, 0x2c, 0x00, 0xc0, + 0x96, 0x74, 0x10, 0x78, 0x96, 0x77, 0x00, 0xc0, 0x93, 0x81, 0x60, 0x07, + 0x00, 0x12, 0x60, 0x03, 0x00, 0x01, 0x10, 0x78, 0x5d, 0xd7, 0x00, 0x7c, + 0x60, 0x07, 0x00, 0x01, 0x60, 0x03, 0x00, 0x01, 0x10, 0x78, 0x5d, 0xd7, + 0x00, 0x78, 0x94, 0xa7, 0x60, 0x07, 0x00, 0x05, 0x00, 0x78, 0x94, 0xaa, + 0x10, 0x78, 0xa4, 0x2c, 0x00, 0xc0, 0x96, 0x74, 0x10, 0x78, 0x29, 0xbb, + 0x00, 0xc0, 0x96, 0x74, 0x10, 0x78, 0x96, 0x77, 0x00, 0xc0, 0x93, 0x81, + 0x60, 0x07, 0x00, 0x20, 0x60, 0x03, 0x00, 0x01, 0x10, 0x78, 0x5d, 0xd7, + 0x00, 0x7c, 0x10, 0x78, 0x29, 0xbb, 0x00, 0xc0, 0x96, 0x74, 0x60, 0x07, + 0x00, 0x23, 0x60, 0x03, 0x00, 0x01, 0x10, 0x78, 0x5d, 0xd7, 0x00, 0x7c, + 0x10, 0x78, 0xa4, 0x2c, 0x00, 0xc0, 0x96, 0x74, 0x10, 0x78, 0x29, 0xbb, + 0x00, 0xc0, 0x96, 0x74, 0x10, 0x78, 0x96, 0x77, 0x00, 0xc0, 0x93, 0x81, + 0x01, 0x7e, 0x02, 0x7e, 0x20, 0x11, 0xac, 0x90, 0x22, 0x14, 0x2c, 0x08, + 0xa0, 0x06, 0x10, 0x78, 0xa1, 0xf6, 0x00, 0xc0, 0x94, 0xf9, 0x21, 0x60, + 0x60, 0x07, 0x00, 0x26, 0x60, 0x13, 0x17, 0x00, 0x20, 0x11, 0xac, 0x89, + 0x22, 0x14, 0xa2, 0x96, 0xff, 0xff, 0x00, 0xc0, 0x95, 0x03, 0x60, 0x07, + 0x00, 0x25, 0x00, 0x78, 0x95, 0x03, 0x60, 0x04, 0xa0, 0x86, 0x00, 0x24, + 0x00, 0xc0, 0x95, 0x00, 0x10, 0x78, 0x77, 0x2d, 0x21, 0x60, 0x60, 0x07, + 0x00, 0x25, 0x60, 0x03, 0x00, 0x01, 0x10, 0x78, 0x5d, 0xd7, 0x02, 0x7f, + 0x01, 0x7f, 0x00, 0x7c, 0x10, 0x78, 0x29, 0xbb, 0x00, 0xc0, 0x96, 0x74, + 0x61, 0x06, 0x10, 0x78, 0x96, 0x97, 0x60, 0x07, 0x00, 0x2b, 0x00, 0x78, + 0x94, 0xa3, 0x60, 0x07, 0x00, 0x2c, 0x00, 0x78, 0x94, 0xa3, 0x10, 0x78, + 0xa4, 0x2c, 0x00, 0xc0, 0x96, 0x74, 0x10, 0x78, 0x29, 0xbb, 0x00, 0xc0, + 0x96, 0x74, 0x10, 0x78, 0x96, 0x77, 0x00, 0xc0, 0x93, 0x81, 0x61, 0x06, + 0x10, 0x78, 0x96, 0x9c, 0x00, 0xc0, 0x95, 0x2e, 0x60, 0x07, 0x00, 0x2e, + 0x00, 0x78, 0x94, 0xa3, 0x60, 0x07, 0x00, 0x2f, 0x00, 0x78, 0x94, 0xa3, + 0x10, 0x78, 0x29, 0xbb, 0x00, 0xc0, 0x96, 0x74, 0x0e, 0x7e, 0x0d, 0x7e, + 0x0c, 0x7e, 0x60, 0x18, 0xa0, 0x80, 0x00, 0x01, 0x20, 0x0c, 0xa1, 0x84, + 0x00, 0xff, 0xa0, 0x86, 0x00, 0x06, 0x00, 0x40, 0x95, 0x4f, 0xa1, 0x84, + 0xff, 0x00, 0x80, 0x07, 0xa0, 0x86, 0x00, 0x06, 0x00, 0x40, 0x95, 0x4f, + 0x0c, 0x7f, 0x0d, 0x7f, 0x0e, 0x7f, 0x00, 0x78, 0x94, 0xa8, 0x20, 0x01, + 0xa7, 0x72, 0x20, 0x04, 0xd0, 0xe4, 0x00, 0x40, 0x95, 0xbb, 0x20, 0x71, + 0xac, 0x8c, 0x70, 0x10, 0x60, 0x36, 0x70, 0x14, 0x60, 0x3a, 0x71, 0x08, + 0x72, 0x0c, 0x20, 0x01, 0xa7, 0x53, 0x20, 0x04, 0xd0, 0xa4, 0x00, 0x40, + 0x95, 0x6d, 0x60, 0x18, 0x20, 0x68, 0x68, 0x10, 0xa1, 0x06, 0x00, 0xc0, + 0x95, 0x6d, 0x68, 0x14, 0xa2, 0x06, 0x00, 0x40, 0x95, 0x91, 0x20, 0x01, + 0xa7, 0x53, 0x20, 0x04, 0xd0, 0xac, 0x00, 0xc0, 0x95, 0xaf, 0x20, 0x69, + 0xa7, 0x00, 0x68, 0x70, 0xa2, 0x06, 0x00, 0xc0, 0x95, 0xaf, 0x68, 0x6c, + 0xa1, 0x06, 0x00, 0xc0, 0x95, 0xaf, 0x72, 0x10, 0x10, 0x78, 0x8d, 0x02, + 0x00, 0x40, 0x95, 0xb5, 0x10, 0x78, 0xa2, 0x9e, 0x00, 0x40, 0x95, 0xb5, + 0x62, 0x2a, 0x60, 0x07, 0x00, 0x36, 0x60, 0x03, 0x00, 0x01, 0x10, 0x78, + 0x5d, 0x8a, 0x0c, 0x7f, 0x0d, 0x7f, 0x0e, 0x7f, 0x00, 0x7c, 0x72, 0x14, + 0xa2, 0x86, 0xff, 0xff, 0x00, 0x40, 0x95, 0xa3, 0x10, 0x78, 0x8d, 0x02, + 0x00, 0x40, 0x95, 0xb5, 0xa2, 0x80, 0x00, 0x02, 0x20, 0x04, 0x71, 0x10, + 0xa1, 0x06, 0x00, 0xc0, 0x95, 0xb5, 0x00, 0x78, 0x95, 0x7e, 0x72, 0x10, + 0x2c, 0x08, 0xa0, 0x85, 0x00, 0x01, 0x10, 0x78, 0xa1, 0xf6, 0x2c, 0x10, + 0x21, 0x60, 0x00, 0x40, 0x95, 0xb5, 0x00, 0x78, 0x95, 0x7e, 0x60, 0x07, + 0x00, 0x37, 0x60, 0x13, 0x15, 0x00, 0x00, 0x78, 0x95, 0x89, 0x60, 0x07, + 0x00, 0x37, 0x60, 0x13, 0x17, 0x00, 0x00, 0x78, 0x95, 0x89, 0x60, 0x07, + 0x00, 0x12, 0x00, 0x78, 0x95, 0x89, 0x10, 0x78, 0x29, 0xbb, 0x00, 0xc0, + 0x96, 0x74, 0x60, 0x18, 0xa0, 0x80, 0x00, 0x01, 0x20, 0x04, 0xa0, 0x84, + 0xff, 0x00, 0x80, 0x07, 0xa0, 0x86, 0x00, 0x06, 0x00, 0xc0, 0x94, 0xa8, + 0x0e, 0x7e, 0x0d, 0x7e, 0x0c, 0x7e, 0x20, 0x01, 0xa7, 0x72, 0x20, 0x04, + 0xd0, 0xe4, 0x00, 0x40, 0x96, 0x31, 0x20, 0x69, 0xa7, 0x00, 0x20, 0x71, + 0xac, 0x8c, 0x70, 0x08, 0x60, 0x36, 0x72, 0x0c, 0x62, 0x3a, 0xa2, 0x86, + 0xff, 0xff, 0x00, 0xc0, 0x95, 0xee, 0x72, 0x08, 0x0c, 0x7e, 0x2c, 0x08, + 0xa0, 0x85, 0x00, 0x01, 0x10, 0x78, 0xa1, 0xf6, 0x2c, 0x10, 0x0c, 0x7f, + 0x00, 0x40, 0x96, 0x25, 0x10, 0x78, 0x8d, 0x02, 0x00, 0x40, 0x96, 0x25, + 0x0c, 0x7e, 0x02, 0x7e, 0x22, 0x60, 0x10, 0x78, 0x8a, 0x03, 0x02, 0x7f, + 0x0c, 0x7f, 0x71, 0x18, 0xa1, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0xa1, 0x86, + 0x00, 0x01, 0x00, 0x40, 0x96, 0x0f, 0xa1, 0x86, 0x00, 0x05, 0x00, 0x40, + 0x96, 0x09, 0xa1, 0x86, 0x00, 0x07, 0x00, 0xc0, 0x96, 0x19, 0xa2, 0x80, + 0x00, 0x04, 0x20, 0x04, 0xa0, 0x05, 0x00, 0x40, 0x96, 0x19, 0x05, 0x7e, + 0x75, 0x10, 0x76, 0x14, 0x10, 0x78, 0xa2, 0xb3, 0x05, 0x7f, 0x0c, 0x7f, + 0x0d, 0x7f, 0x0e, 0x7f, 0x00, 0x7c, 0x60, 0x07, 0x00, 0x3b, 0x60, 0x2b, + 0x00, 0x09, 0x60, 0x13, 0x2a, 0x00, 0x60, 0x03, 0x00, 0x01, 0x10, 0x78, + 0x5d, 0x8a, 0x00, 0x78, 0x96, 0x15, 0x60, 0x07, 0x00, 0x3b, 0x60, 0x2b, + 0x00, 0x09, 0x60, 0x13, 0x17, 0x00, 0x60, 0x03, 0x00, 0x01, 0x10, 0x78, + 0x5d, 0x8a, 0x00, 0x78, 0x96, 0x15, 0x60, 0x07, 0x00, 0x3b, 0x60, 0x2b, + 0x00, 0x0b, 0x60, 0x13, 0x00, 0x00, 0x00, 0x78, 0x95, 0x89, 0x0e, 0x7e, + 0x02, 0x7e, 0x10, 0x78, 0x49, 0x67, 0x00, 0x40, 0x96, 0x6e, 0x10, 0x78, + 0x49, 0x57, 0x10, 0x78, 0xa4, 0xb9, 0x00, 0xc0, 0x96, 0x6c, 0x20, 0x71, + 0xa7, 0x00, 0x70, 0xcc, 0xc0, 0x85, 0x70, 0xce, 0x0f, 0x7e, 0x20, 0x79, + 0x01, 0x00, 0x72, 0x98, 0xa2, 0x84, 0x00, 0xff, 0x70, 0x6e, 0x78, 0xe6, + 0xa2, 0x84, 0xff, 0x00, 0x72, 0x70, 0xa2, 0x05, 0x70, 0x72, 0x78, 0xea, + 0x0f, 0x7f, 0x70, 0xd7, 0x00, 0x00, 0x20, 0x01, 0xa7, 0x53, 0x20, 0x04, + 0xd0, 0xa4, 0x00, 0x40, 0x96, 0x65, 0x20, 0x11, 0xa9, 0xca, 0x20, 0x13, + 0x07, 0xd0, 0xd0, 0xac, 0x00, 0xc0, 0x96, 0x6e, 0x10, 0x78, 0x26, 0x77, + 0x00, 0x78, 0x96, 0x6e, 0x10, 0x78, 0xa4, 0xe9, 0x02, 0x7f, 0x0e, 0x7f, + 0x10, 0x78, 0x77, 0x2d, 0x00, 0x78, 0x94, 0xa7, 0x10, 0x78, 0x77, 0x2d, + 0x00, 0x7c, 0x0d, 0x7e, 0x06, 0x7e, 0x66, 0x18, 0x26, 0x68, 0x6e, 0x04, + 0xa6, 0xb4, 0xff, 0x00, 0x86, 0x37, 0xa6, 0x86, 0x00, 0x06, 0x00, 0x40, + 0x96, 0x94, 0xa6, 0x86, 0x00, 0x04, 0x00, 0x40, 0x96, 0x94, 0x6e, 0x04, + 0xa6, 0xb4, 0x00, 0xff, 0xa6, 0x86, 0x00, 0x06, 0x00, 0x40, 0x96, 0x94, + 0xa6, 0x86, 0x00, 0x04, 0x00, 0x40, 0x96, 0x94, 0xa0, 0x85, 0x00, 0x01, + 0x06, 0x7f, 0x0d, 0x7f, 0x00, 0x7c, 0x0d, 0x7e, 0x10, 0x78, 0x96, 0xcb, + 0x0d, 0x7f, 0x00, 0x7c, 0x0d, 0x7e, 0x10, 0x78, 0x96, 0xda, 0x00, 0xc0, + 0x96, 0xc4, 0x68, 0x0c, 0xa0, 0x8c, 0xff, 0x00, 0x68, 0x20, 0xa0, 0x84, + 0x00, 0xff, 0xa1, 0x15, 0x62, 0x12, 0x68, 0x24, 0x60, 0x2a, 0xd1, 0xe4, + 0x00, 0x40, 0x96, 0xb2, 0x20, 0x09, 0x00, 0x01, 0x00, 0x78, 0x96, 0xc0, + 0xd1, 0xec, 0x00, 0x40, 0x96, 0xc4, 0x69, 0x20, 0xa1, 0x8c, 0x00, 0xff, + 0x68, 0x24, 0x10, 0x78, 0x25, 0x4d, 0x00, 0xc0, 0x96, 0xc4, 0x21, 0x10, + 0x20, 0x09, 0x00, 0x00, 0x10, 0x78, 0x28, 0xc8, 0x00, 0x78, 0x96, 0xc8, + 0xa0, 0x85, 0x00, 0x01, 0x00, 0x78, 0x96, 0xc9, 0xa0, 0x06, 0x0d, 0x7f, + 0x00, 0x7c, 0x20, 0x69, 0xac, 0x8d, 0x68, 0x00, 0xa0, 0x82, 0x00, 0x10, + 0x00, 0xc8, 0x96, 0xd8, 0x60, 0x13, 0x00, 0x00, 0xa0, 0x85, 0x00, 0x01, + 0x00, 0x78, 0x96, 0xd9, 0xa0, 0x06, 0x00, 0x7c, 0x60, 0x13, 0x00, 0x00, + 0x20, 0x69, 0xac, 0x8c, 0x68, 0x08, 0xa0, 0x84, 0xff, 0x00, 0xa0, 0x86, + 0x08, 0x00, 0x00, 0xc0, 0x96, 0xee, 0x68, 0x00, 0xa0, 0x84, 0x00, 0xff, + 0xa0, 0x8e, 0x00, 0x14, 0x00, 0x40, 0x96, 0xee, 0xa0, 0x8e, 0x00, 0x10, + 0x00, 0x7c, 0x60, 0x04, 0xa0, 0xb2, 0x00, 0x44, 0x10, 0xc8, 0x13, 0x32, + 0xa1, 0xb6, 0x00, 0x13, 0x00, 0xc0, 0x96, 0xfb, 0x20, 0x08, 0x00, 0x79, + 0x97, 0x0e, 0xa1, 0xb6, 0x00, 0x27, 0x00, 0x40, 0x97, 0x03, 0xa1, 0xb6, + 0x00, 0x14, 0x10, 0xc0, 0x13, 0x32, 0x20, 0x01, 0x00, 0x07, 0x10, 0x78, + 0x45, 0x35, 0x10, 0x78, 0x61, 0xcd, 0x10, 0x78, 0x8e, 0xd6, 0x10, 0x78, + 0x62, 0xd1, 0x00, 0x7c, 0x97, 0x4e, 0x97, 0x50, 0x97, 0x4e, 0x97, 0x4e, + 0x97, 0x4e, 0x97, 0x50, 0x97, 0x5c, 0x97, 0xe6, 0x97, 0xa9, 0x97, 0xe6, + 0x97, 0xbd, 0x97, 0xe6, 0x97, 0x5c, 0x97, 0xe6, 0x97, 0xde, 0x97, 0xe6, + 0x97, 0xde, 0x97, 0xe6, 0x97, 0xe6, 0x97, 0x4e, 0x97, 0x4e, 0x97, 0x4e, + 0x97, 0x4e, 0x97, 0x4e, 0x97, 0x4e, 0x97, 0x4e, 0x97, 0x4e, 0x97, 0x4e, + 0x97, 0x4e, 0x97, 0x4e, 0x97, 0x50, 0x97, 0x4e, 0x97, 0xe6, 0x97, 0x4e, + 0x97, 0x4e, 0x97, 0xe6, 0x97, 0x4e, 0x97, 0xe6, 0x97, 0xe6, 0x97, 0x4e, + 0x97, 0x4e, 0x97, 0x4e, 0x97, 0x4e, 0x97, 0xe6, 0x97, 0xe6, 0x97, 0x4e, + 0x97, 0xe6, 0x97, 0xe6, 0x97, 0x4e, 0x97, 0x4e, 0x97, 0x4e, 0x97, 0x4e, + 0x97, 0x4e, 0x97, 0x50, 0x97, 0xe6, 0x97, 0xe6, 0x97, 0x4e, 0x97, 0x4e, + 0x97, 0xe6, 0x97, 0xe6, 0x97, 0x4e, 0x97, 0x4e, 0x97, 0x4e, 0x97, 0x4e, + 0x10, 0x78, 0x13, 0x32, 0x10, 0x78, 0x61, 0xcd, 0x20, 0x01, 0xa9, 0xa2, + 0x20, 0x04, 0x60, 0x16, 0x60, 0x03, 0x00, 0x02, 0x10, 0x78, 0x62, 0xd1, + 0x00, 0x78, 0x97, 0xec, 0x0f, 0x7e, 0x20, 0x79, 0xa7, 0x52, 0x78, 0x04, + 0x0f, 0x7f, 0xd0, 0xac, 0x00, 0xc0, 0x97, 0xe6, 0x20, 0x01, 0x00, 0x00, + 0x10, 0x78, 0x44, 0xee, 0x60, 0x18, 0xa0, 0x80, 0x00, 0x04, 0x20, 0x04, + 0xa0, 0x86, 0x00, 0xff, 0x00, 0x40, 0x97, 0xe6, 0x0c, 0x7e, 0x60, 0x18, + 0x20, 0x60, 0x60, 0x00, 0xd0, 0xf4, 0x00, 0xc0, 0x97, 0x80, 0x60, 0x10, + 0xa0, 0x05, 0x00, 0x40, 0x97, 0x80, 0x0c, 0x7f, 0x10, 0x78, 0x36, 0x99, + 0x00, 0x78, 0x97, 0xe6, 0x0c, 0x7f, 0x20, 0x01, 0xa7, 0x00, 0x20, 0x04, + 0xa0, 0x86, 0x00, 0x02, 0x00, 0xc0, 0x97, 0x8f, 0x0f, 0x7e, 0x20, 0x79, + 0xa7, 0x00, 0x78, 0x90, 0x80, 0x00, 0x78, 0x92, 0x0f, 0x7f, 0x20, 0x01, + 0x00, 0x02, 0x10, 0x78, 0x45, 0x02, 0x10, 0x78, 0x61, 0xcd, 0x60, 0x1f, + 0x00, 0x01, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x02, 0x10, 0x78, + 0x5d, 0xd7, 0x10, 0x78, 0x62, 0xd1, 0x0c, 0x7e, 0x61, 0x18, 0x21, 0x60, + 0x20, 0x09, 0x00, 0x01, 0x10, 0x78, 0x5a, 0x52, 0x0c, 0x7f, 0x00, 0x78, + 0x97, 0xec, 0x66, 0x18, 0x0d, 0x7e, 0x26, 0x68, 0x6e, 0x04, 0x0d, 0x7f, + 0xa6, 0xb4, 0xff, 0x00, 0x86, 0x37, 0xa6, 0x86, 0x00, 0x06, 0x00, 0x40, + 0x97, 0xe6, 0xa6, 0x86, 0x00, 0x04, 0x00, 0x40, 0x97, 0xe6, 0x20, 0x01, + 0x00, 0x04, 0x00, 0x78, 0x97, 0xe4, 0x20, 0x01, 0xa7, 0x00, 0x20, 0x04, + 0xa0, 0x86, 0x00, 0x03, 0x00, 0xc0, 0x97, 0xc6, 0x10, 0x78, 0x36, 0x99, + 0x20, 0x01, 0x00, 0x06, 0x10, 0x78, 0x97, 0xed, 0x66, 0x18, 0x0d, 0x7e, + 0x26, 0x68, 0x6e, 0x04, 0x0d, 0x7f, 0xa6, 0xb4, 0xff, 0x00, 0x86, 0x37, + 0xa6, 0x86, 0x00, 0x06, 0x00, 0x40, 0x97, 0xe6, 0x20, 0x01, 0x00, 0x06, + 0x00, 0x78, 0x97, 0xe4, 0x20, 0x01, 0x00, 0x04, 0x00, 0x78, 0x97, 0xe4, + 0x20, 0x01, 0x00, 0x06, 0x10, 0x78, 0x97, 0xed, 0x00, 0x78, 0x97, 0xe6, + 0x10, 0x78, 0x45, 0x35, 0x10, 0x78, 0x61, 0xcd, 0x10, 0x78, 0x77, 0x2d, + 0x10, 0x78, 0x62, 0xd1, 0x00, 0x7c, 0x01, 0x7e, 0x0d, 0x7e, 0x61, 0x18, + 0x21, 0x68, 0x69, 0x00, 0xd1, 0x84, 0x00, 0x40, 0x98, 0x08, 0x61, 0x04, + 0xa1, 0x8e, 0x00, 0x0a, 0x00, 0xc0, 0x98, 0x00, 0x69, 0x9c, 0xd1, 0xa4, + 0x00, 0xc0, 0x98, 0x00, 0x20, 0x01, 0x00, 0x07, 0x10, 0x78, 0x45, 0x02, + 0x20, 0x01, 0x00, 0x00, 0x10, 0x78, 0x44, 0xee, 0x10, 0x78, 0x28, 0xa6, + 0x0d, 0x7f, 0x01, 0x7f, 0x00, 0x7c, 0x0d, 0x7e, 0x66, 0x18, 0x26, 0x68, + 0x68, 0x04, 0xa0, 0x84, 0xff, 0x00, 0x80, 0x07, 0x0d, 0x7f, 0xa0, 0xb2, + 0x00, 0x0c, 0x10, 0xc8, 0x13, 0x32, 0xa1, 0xb6, 0x00, 0x15, 0x00, 0xc0, + 0x98, 0x1f, 0x10, 0x79, 0x98, 0x26, 0x00, 0x78, 0x98, 0x25, 0xa1, 0xb6, + 0x00, 0x16, 0x10, 0xc0, 0x13, 0x32, 0x10, 0x79, 0x98, 0x32, 0x00, 0x7c, + 0x7d, 0x4e, 0x7d, 0x4e, 0x7d, 0x4e, 0x7d, 0x4e, 0x7d, 0x4e, 0x7d, 0x4e, + 0x98, 0x87, 0x98, 0x3e, 0x7d, 0x4e, 0x7d, 0x4e, 0x7d, 0x4e, 0x7d, 0x4e, + 0x7d, 0x4e, 0x7d, 0x4e, 0x7d, 0x4e, 0x7d, 0x4e, 0x7d, 0x4e, 0x7d, 0x4e, + 0x98, 0x87, 0x98, 0x8f, 0x7d, 0x4e, 0x7d, 0x4e, 0x7d, 0x4e, 0x7d, 0x4e, + 0x0f, 0x7e, 0x20, 0x79, 0xa7, 0x52, 0x78, 0x04, 0xd0, 0xac, 0x00, 0xc0, + 0x98, 0x65, 0x60, 0x18, 0xa0, 0x7d, 0x00, 0x40, 0x98, 0x65, 0x78, 0x00, + 0xd0, 0xf4, 0x00, 0xc0, 0x98, 0x51, 0x78, 0x10, 0xa0, 0x05, 0x00, 0xc0, + 0x98, 0x65, 0x20, 0x01, 0x00, 0x00, 0x10, 0x78, 0x44, 0xee, 0x20, 0x01, + 0x00, 0x02, 0x10, 0x78, 0x45, 0x02, 0x60, 0x1f, 0x00, 0x01, 0x60, 0x03, + 0x00, 0x01, 0x60, 0x07, 0x00, 0x02, 0x10, 0x78, 0x5d, 0xd7, 0x10, 0x78, + 0x62, 0xd1, 0x00, 0x78, 0x98, 0x85, 0x20, 0x11, 0xac, 0x83, 0x22, 0x04, + 0x82, 0x11, 0x22, 0x0c, 0x10, 0x78, 0x25, 0x4d, 0x00, 0xc0, 0x98, 0x85, + 0x0c, 0x7e, 0x10, 0x78, 0x45, 0xc4, 0x00, 0x40, 0x98, 0x78, 0x0c, 0x7f, + 0x10, 0x78, 0x77, 0x2d, 0x00, 0x78, 0x98, 0x85, 0x60, 0x10, 0x00, 0x7e, + 0x60, 0x14, 0x00, 0x7e, 0x10, 0x78, 0x42, 0xf8, 0x00, 0x7f, 0x60, 0x16, + 0x00, 0x7f, 0x60, 0x12, 0x0c, 0x7f, 0x10, 0x78, 0x77, 0x2d, 0x0f, 0x7f, + 0x00, 0x7c, 0x66, 0x04, 0xa6, 0xb6, 0x00, 0x1e, 0x00, 0xc0, 0x98, 0x8e, + 0x10, 0x78, 0x77, 0x2d, 0x00, 0x7c, 0x10, 0x78, 0x7f, 0x8e, 0x00, 0xc0, + 0x98, 0x9b, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x01, 0x10, 0x78, + 0x5d, 0xd7, 0x00, 0x78, 0x98, 0x9d, 0x10, 0x78, 0x77, 0x2d, 0x00, 0x7c, + 0x60, 0x04, 0xa0, 0x8a, 0x00, 0x44, 0x10, 0xc8, 0x13, 0x32, 0x10, 0x78, + 0x61, 0xcd, 0x10, 0x78, 0x8e, 0xd6, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x7c, + 0xa1, 0x82, 0x00, 0x40, 0x00, 0x79, 0x98, 0xae, 0x98, 0xc1, 0x98, 0xc1, + 0x98, 0xc1, 0x98, 0xc1, 0x98, 0xc3, 0x98, 0xc1, 0x98, 0xc1, 0x98, 0xc1, + 0x98, 0xc1, 0x98, 0xc1, 0x98, 0xc1, 0x98, 0xc1, 0x98, 0xc1, 0x98, 0xc1, + 0x98, 0xc1, 0x98, 0xc1, 0x98, 0xc1, 0x98, 0xc1, 0x98, 0xc1, 0x10, 0x78, + 0x13, 0x32, 0x0d, 0x7e, 0x0e, 0x7e, 0x0f, 0x7e, 0x15, 0x7e, 0x04, 0x7e, + 0x02, 0x7e, 0x62, 0x18, 0xa2, 0x80, 0x00, 0x2b, 0x20, 0x04, 0xa0, 0x05, + 0x00, 0x40, 0x98, 0xd4, 0x20, 0x21, 0x00, 0x00, 0x10, 0x78, 0xa4, 0x82, + 0x61, 0x06, 0x20, 0x71, 0xac, 0x80, 0x74, 0x44, 0xa4, 0xa4, 0xff, 0x00, + 0x00, 0x40, 0x99, 0x2b, 0xa4, 0x86, 0x20, 0x00, 0x00, 0xc0, 0x98, 0xe6, + 0x20, 0x09, 0x00, 0x01, 0x20, 0x11, 0x02, 0x00, 0x10, 0x78, 0x5b, 0xf1, + 0x10, 0x78, 0x13, 0x8b, 0x10, 0x40, 0x13, 0x32, 0x60, 0x03, 0x00, 0x07, + 0x2d, 0x00, 0x68, 0x37, 0x01, 0x0d, 0x68, 0x03, 0x00, 0x00, 0x68, 0x3b, + 0x00, 0x00, 0x6c, 0x5a, 0x2c, 0x00, 0x68, 0x5e, 0x60, 0x08, 0x68, 0xb2, + 0x60, 0x18, 0x20, 0x78, 0x78, 0xa0, 0x80, 0x07, 0x71, 0x30, 0x69, 0x4a, + 0x01, 0x7e, 0xa0, 0x84, 0xff, 0x00, 0x68, 0x46, 0x68, 0x4f, 0x00, 0x00, + 0x68, 0x57, 0x00, 0x36, 0x10, 0x78, 0x4a, 0x73, 0x01, 0x7f, 0xa4, 0x86, + 0x20, 0x00, 0x00, 0xc0, 0x99, 0x13, 0x20, 0x19, 0x00, 0x17, 0x10, 0x78, + 0xa1, 0xa5, 0x00, 0x78, 0x99, 0x8d, 0xa4, 0x86, 0x04, 0x00, 0x00, 0xc0, + 0x99, 0x1d, 0x20, 0x19, 0x00, 0x02, 0x10, 0x78, 0xa1, 0x56, 0x00, 0x78, + 0x99, 0x8d, 0xa4, 0x86, 0x02, 0x00, 0x00, 0xc0, 0x99, 0x23, 0x10, 0x78, + 0xa1, 0x3b, 0xa4, 0x86, 0x10, 0x00, 0x00, 0xc0, 0x99, 0x29, 0x10, 0x78, + 0xa1, 0x8a, 0x00, 0x78, 0x99, 0x8d, 0x20, 0x69, 0xaa, 0x33, 0x6a, 0x00, + 0xd2, 0x84, 0x00, 0x40, 0x99, 0xf7, 0xa2, 0x84, 0x03, 0x00, 0x00, 0xc0, + 0x99, 0xef, 0x68, 0x04, 0xa0, 0x05, 0x00, 0x40, 0x99, 0xd5, 0x2d, 0x78, + 0x60, 0x03, 0x00, 0x07, 0x10, 0x78, 0x13, 0x70, 0x00, 0x40, 0x99, 0x94, + 0x78, 0x00, 0xd0, 0x8c, 0x00, 0xc0, 0x99, 0x47, 0x78, 0x04, 0x80, 0x01, + 0x78, 0x06, 0x60, 0x13, 0x00, 0x00, 0x68, 0x03, 0x00, 0x00, 0x68, 0x37, + 0x01, 0x16, 0x68, 0x3b, 0x00, 0x00, 0x60, 0x08, 0x68, 0xb2, 0x2c, 0x00, + 0x68, 0x4a, 0x60, 0x18, 0x20, 0x78, 0x78, 0xa0, 0x80, 0x07, 0x71, 0x30, + 0x69, 0x86, 0x68, 0x46, 0x79, 0x28, 0x69, 0x8a, 0x79, 0x2c, 0x69, 0x8e, + 0x79, 0x30, 0x69, 0x92, 0x79, 0x34, 0x69, 0x96, 0x68, 0x53, 0x00, 0x3d, + 0x72, 0x44, 0xa2, 0x94, 0x00, 0x03, 0xa2, 0x86, 0x00, 0x02, 0x00, 0xc0, + 0x99, 0x6f, 0x68, 0x4f, 0x00, 0x40, 0x00, 0x78, 0x99, 0x79, 0xa2, 0x86, + 0x00, 0x01, 0x00, 0xc0, 0x99, 0x77, 0x68, 0x4f, 0x00, 0x80, 0x00, 0x78, + 0x99, 0x79, 0x68, 0x4f, 0x00, 0x00, 0x20, 0xa9, 0x00, 0x0a, 0x20, 0x01, + 0xac, 0x90, 0xad, 0x90, 0x00, 0x15, 0x20, 0x0c, 0x81, 0x0f, 0x21, 0x12, + 0x80, 0x00, 0x82, 0x10, 0x00, 0xf0, 0x99, 0x7f, 0x20, 0x0c, 0x69, 0x82, + 0x80, 0x00, 0x20, 0x0c, 0x69, 0x7e, 0x10, 0x78, 0x4a, 0x73, 0x02, 0x7f, + 0x04, 0x7f, 0x15, 0x7f, 0x0f, 0x7f, 0x0e, 0x7f, 0x0d, 0x7f, 0x00, 0x7c, + 0x20, 0x01, 0xa7, 0x0e, 0x20, 0x04, 0xd0, 0x84, 0x00, 0x40, 0x99, 0x9e, + 0x10, 0x78, 0x13, 0x8b, 0x00, 0xc0, 0x99, 0x40, 0x60, 0x13, 0x01, 0x00, + 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x41, 0x10, 0x78, 0x5d, 0x8a, + 0x10, 0x78, 0x62, 0xd1, 0x00, 0x78, 0x99, 0x8d, 0x20, 0x69, 0xac, 0x92, + 0x2d, 0x04, 0xa0, 0x84, 0xff, 0x00, 0xa0, 0x86, 0x12, 0x00, 0x00, 0xc0, + 0x99, 0xc9, 0x20, 0x69, 0xac, 0x80, 0x68, 0x6c, 0xa0, 0x84, 0x00, 0xff, + 0x01, 0x7e, 0x61, 0x10, 0xa1, 0x8c, 0x07, 0x00, 0xa1, 0x0d, 0x61, 0x12, + 0x01, 0x7f, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x43, 0x10, 0x78, + 0x5d, 0x8a, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x78, 0x99, 0x8d, 0x60, 0x13, + 0x02, 0x00, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x41, 0x10, 0x78, + 0x5d, 0x8a, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x78, 0x99, 0x8d, 0x20, 0x01, + 0xa7, 0x0d, 0x20, 0x04, 0xd0, 0xec, 0x00, 0x40, 0x99, 0xdf, 0x20, 0x11, + 0x80, 0x49, 0x10, 0x78, 0x36, 0x1b, 0x60, 0x13, 0x03, 0x00, 0x00, 0x78, + 0x99, 0xe5, 0x60, 0x13, 0x01, 0x00, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, + 0x00, 0x41, 0x10, 0x78, 0x5d, 0x8a, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x78, + 0x99, 0x8d, 0x60, 0x13, 0x05, 0x00, 0x00, 0x78, 0x99, 0xe5, 0x60, 0x13, + 0x06, 0x00, 0x00, 0x78, 0x99, 0xaa, 0x60, 0x13, 0x02, 0x00, 0x00, 0x78, + 0x99, 0xaa, 0xa1, 0x86, 0x00, 0x13, 0x00, 0xc0, 0x9a, 0x0d, 0x60, 0x04, + 0xa0, 0x8a, 0x00, 0x40, 0x10, 0x48, 0x13, 0x32, 0xa0, 0x8a, 0x00, 0x53, + 0x10, 0xc8, 0x13, 0x32, 0xa0, 0x82, 0x00, 0x40, 0x20, 0x08, 0x00, 0x79, + 0x9a, 0x92, 0xa1, 0x86, 0x00, 0x51, 0x00, 0x40, 0x9a, 0x1a, 0xa1, 0x86, + 0x00, 0x47, 0x00, 0xc0, 0x9a, 0x33, 0x60, 0x04, 0xa0, 0x86, 0x00, 0x41, + 0x00, 0x40, 0x9a, 0x41, 0x20, 0x01, 0x01, 0x09, 0x20, 0x04, 0xd0, 0x84, + 0x00, 0x40, 0x9a, 0x41, 0x12, 0x7e, 0x20, 0x91, 0x22, 0x00, 0x00, 0x7e, + 0x01, 0x7e, 0x02, 0x7e, 0x10, 0x78, 0x5c, 0x56, 0x02, 0x7f, 0x01, 0x7f, + 0x00, 0x7f, 0x12, 0x7f, 0x60, 0x00, 0xa0, 0x86, 0x00, 0x02, 0x00, 0xc0, + 0x9a, 0x41, 0x00, 0x78, 0x9a, 0xd7, 0xa1, 0x86, 0x00, 0x27, 0x00, 0x40, + 0x9a, 0x3b, 0xa1, 0x86, 0x00, 0x14, 0x10, 0xc0, 0x13, 0x32, 0x60, 0x04, + 0xa0, 0x82, 0x00, 0x40, 0x20, 0x08, 0x00, 0x79, 0x9a, 0x44, 0x10, 0x78, + 0x77, 0x73, 0x00, 0x7c, 0x9a, 0x57, 0x9a, 0x59, 0x9a, 0x59, 0x9a, 0x81, + 0x9a, 0x57, 0x9a, 0x57, 0x9a, 0x57, 0x9a, 0x57, 0x9a, 0x57, 0x9a, 0x57, + 0x9a, 0x57, 0x9a, 0x57, 0x9a, 0x57, 0x9a, 0x57, 0x9a, 0x57, 0x9a, 0x57, + 0x9a, 0x57, 0x9a, 0x57, 0x9a, 0x57, 0x10, 0x78, 0x13, 0x32, 0x10, 0x78, + 0x61, 0xcd, 0x10, 0x78, 0x62, 0xd1, 0x03, 0x7e, 0x0d, 0x7e, 0x60, 0x10, + 0xa0, 0x6d, 0x00, 0x40, 0x9a, 0x7e, 0xad, 0x84, 0xf0, 0x00, 0x00, 0x40, + 0x9a, 0x7e, 0x60, 0x03, 0x00, 0x02, 0x60, 0x18, 0x20, 0x04, 0xd0, 0xbc, + 0x00, 0xc0, 0x9a, 0x7e, 0x20, 0x19, 0x00, 0x04, 0x10, 0x78, 0xa1, 0xda, + 0x60, 0x13, 0x00, 0x00, 0x60, 0x14, 0xa0, 0x05, 0x00, 0xc0, 0x9a, 0x7c, + 0x20, 0x01, 0xa9, 0xa3, 0x20, 0x04, 0x60, 0x16, 0x60, 0x03, 0x00, 0x07, + 0x0d, 0x7f, 0x03, 0x7f, 0x00, 0x7c, 0x0d, 0x7e, 0x10, 0x78, 0x61, 0xcd, + 0x10, 0x78, 0x62, 0xd1, 0x10, 0x78, 0x8d, 0x16, 0x00, 0x40, 0x9a, 0x8e, + 0x60, 0x10, 0x20, 0x68, 0x10, 0x78, 0x13, 0xa4, 0x10, 0x78, 0x8e, 0xd6, + 0x0d, 0x7f, 0x00, 0x7c, 0x9a, 0xa5, 0x9a, 0xc4, 0x9a, 0xae, 0x9a, 0xd1, + 0x9a, 0xa5, 0x9a, 0xa5, 0x9a, 0xa5, 0x9a, 0xa5, 0x9a, 0xa5, 0x9a, 0xa5, + 0x9a, 0xa5, 0x9a, 0xa5, 0x9a, 0xa5, 0x9a, 0xa5, 0x9a, 0xa5, 0x9a, 0xa5, + 0x9a, 0xa5, 0x9a, 0xa5, 0x9a, 0xa5, 0x10, 0x78, 0x13, 0x32, 0x60, 0x10, + 0xa0, 0x88, 0x00, 0x13, 0x21, 0x04, 0xa0, 0x85, 0x04, 0x00, 0x20, 0x0a, + 0x10, 0x78, 0x61, 0xcd, 0x60, 0x10, 0xa0, 0x80, 0x00, 0x13, 0x20, 0x04, + 0xd0, 0xb4, 0x00, 0x40, 0x9a, 0xbf, 0x60, 0x03, 0x00, 0x07, 0x20, 0x09, + 0x00, 0x43, 0x10, 0x78, 0x77, 0x5c, 0x00, 0x78, 0x9a, 0xc1, 0x60, 0x03, + 0x00, 0x02, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x7c, 0x10, 0x78, 0x61, 0xcd, + 0x10, 0x78, 0xa4, 0x33, 0x00, 0xc0, 0x9a, 0xce, 0x10, 0x78, 0x5b, 0xc1, + 0x10, 0x78, 0x77, 0x2d, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x7c, 0x10, 0x78, + 0x61, 0xcd, 0x20, 0x09, 0x00, 0x41, 0x00, 0x78, 0x9c, 0x2e, 0xa1, 0x82, + 0x00, 0x40, 0x00, 0x79, 0x9a, 0xdb, 0x9a, 0xee, 0x9a, 0xf0, 0x9a, 0xee, + 0x9a, 0xee, 0x9a, 0xee, 0x9a, 0xee, 0x9a, 0xee, 0x9a, 0xf1, 0x9a, 0xee, + 0x9a, 0xee, 0x9a, 0xee, 0x9a, 0xee, 0x9a, 0xee, 0x9a, 0xee, 0x9a, 0xee, + 0x9a, 0xee, 0x9a, 0xee, 0x9a, 0xfc, 0x9a, 0xee, 0x10, 0x78, 0x13, 0x32, + 0x00, 0x7c, 0x60, 0x03, 0x00, 0x04, 0x61, 0x10, 0x20, 0xe1, 0x00, 0x05, + 0x3d, 0x18, 0x3e, 0x20, 0x2c, 0x10, 0x10, 0x78, 0x15, 0xfa, 0x00, 0x7c, + 0x0d, 0x7e, 0x10, 0x78, 0x5b, 0xc1, 0x0d, 0x7f, 0x10, 0x78, 0xa4, 0xa5, + 0x10, 0x78, 0x77, 0x2d, 0x00, 0x7c, 0xa1, 0x82, 0x00, 0x40, 0x00, 0x79, + 0x9b, 0x09, 0x9b, 0x1c, 0x9b, 0x1c, 0x9b, 0x1c, 0x9b, 0x1c, 0x9b, 0x1c, + 0x9b, 0x1c, 0x9b, 0x1c, 0x9b, 0x1e, 0x9b, 0x1c, 0x9b, 0x21, 0x9b, 0x4c, + 0x9b, 0x1c, 0x9b, 0x1c, 0x9b, 0x1c, 0x9b, 0x1c, 0x9b, 0x4c, 0x9b, 0x1c, + 0x9b, 0x1c, 0x9b, 0x1c, 0x10, 0x78, 0x13, 0x32, 0x10, 0x78, 0x77, 0x73, + 0x00, 0x7c, 0x10, 0x78, 0x62, 0x7a, 0x10, 0x78, 0x63, 0x9b, 0x60, 0x10, + 0x0d, 0x7e, 0x20, 0x68, 0x68, 0x4c, 0xd0, 0xfc, 0x00, 0x40, 0x9b, 0x37, + 0xa0, 0x8c, 0x00, 0x03, 0xa1, 0x8e, 0x00, 0x02, 0x00, 0x40, 0x9b, 0x3f, + 0x20, 0x09, 0x00, 0x41, 0x0d, 0x7f, 0x00, 0x78, 0x9c, 0x2e, 0x60, 0x03, + 0x00, 0x07, 0x60, 0x17, 0x00, 0x00, 0x10, 0x78, 0x5b, 0xc1, 0x0d, 0x7f, + 0x00, 0x7c, 0x10, 0x78, 0xa4, 0x33, 0x00, 0x40, 0x9b, 0x45, 0x0d, 0x7f, + 0x00, 0x7c, 0x10, 0x78, 0x5b, 0xc1, 0x10, 0x78, 0x77, 0x2d, 0x0d, 0x7f, + 0x00, 0x78, 0x9b, 0x3e, 0x03, 0x7e, 0x10, 0x78, 0x62, 0x7a, 0x10, 0x78, + 0x63, 0x9b, 0x60, 0x10, 0x0d, 0x7e, 0x20, 0x68, 0x60, 0x18, 0x20, 0x04, + 0xd0, 0xbc, 0x00, 0x40, 0x9b, 0x6c, 0x68, 0x4c, 0xa0, 0x84, 0x00, 0x03, + 0xa0, 0x86, 0x00, 0x02, 0x00, 0x40, 0x9b, 0x68, 0x68, 0x7c, 0x63, 0x2c, + 0xa3, 0x1a, 0x63, 0x2e, 0x68, 0x80, 0x63, 0x28, 0xa3, 0x1b, 0x63, 0x2a, + 0x60, 0x03, 0x00, 0x02, 0x00, 0x78, 0x9b, 0x7d, 0x20, 0x19, 0x00, 0x04, + 0x10, 0x78, 0xa1, 0xda, 0x60, 0x14, 0xa0, 0x05, 0x00, 0xc0, 0x9b, 0x79, + 0x20, 0x01, 0xa9, 0xa3, 0x20, 0x04, 0x80, 0x03, 0x60, 0x16, 0x60, 0x13, + 0x00, 0x00, 0x60, 0x03, 0x00, 0x07, 0x0d, 0x7f, 0x03, 0x7f, 0x00, 0x7c, + 0xa1, 0x86, 0x00, 0x13, 0x00, 0xc0, 0x9b, 0x8e, 0x60, 0x04, 0xa0, 0x86, + 0x00, 0x42, 0x10, 0xc0, 0x13, 0x32, 0x10, 0x78, 0x61, 0xcd, 0x10, 0x78, + 0x62, 0xd1, 0x00, 0x7c, 0xa1, 0x86, 0x00, 0x27, 0x00, 0x40, 0x9b, 0x96, + 0xa1, 0x86, 0x00, 0x14, 0x00, 0xc0, 0x9b, 0xa6, 0x60, 0x04, 0xa0, 0x86, + 0x00, 0x42, 0x10, 0xc0, 0x13, 0x32, 0x20, 0x01, 0x00, 0x07, 0x10, 0x78, + 0x45, 0x35, 0x10, 0x78, 0x61, 0xcd, 0x10, 0x78, 0x8e, 0xd6, 0x10, 0x78, + 0x62, 0xd1, 0x00, 0x7c, 0xa1, 0x82, 0x00, 0x40, 0x00, 0x79, 0x9b, 0xaa, + 0x9b, 0xbd, 0x9b, 0xbd, 0x9b, 0xbd, 0x9b, 0xbd, 0x9b, 0xbd, 0x9b, 0xbd, + 0x9b, 0xbd, 0x9b, 0xbf, 0x9b, 0xcb, 0x9b, 0xbd, 0x9b, 0xbd, 0x9b, 0xbd, + 0x9b, 0xbd, 0x9b, 0xbd, 0x9b, 0xbd, 0x9b, 0xbd, 0x9b, 0xbd, 0x9b, 0xbd, + 0x9b, 0xbd, 0x10, 0x78, 0x13, 0x32, 0x03, 0x7e, 0x04, 0x7e, 0x20, 0xe1, + 0x00, 0x05, 0x3d, 0x18, 0x3e, 0x20, 0x2c, 0x10, 0x10, 0x78, 0x15, 0xfa, + 0x04, 0x7f, 0x03, 0x7f, 0x00, 0x7c, 0x60, 0x10, 0x0d, 0x7e, 0x20, 0x68, + 0x68, 0x10, 0x6a, 0x14, 0x61, 0x18, 0x21, 0x0c, 0xd1, 0xbc, 0x00, 0x40, + 0x9b, 0xea, 0x61, 0x24, 0xd1, 0xf4, 0x00, 0xc0, 0x9b, 0xea, 0x00, 0x7e, + 0x04, 0x7e, 0x05, 0x7e, 0x6c, 0x7c, 0xa4, 0x22, 0x6d, 0x80, 0x22, 0x00, + 0xa5, 0x2b, 0x60, 0x2c, 0xa4, 0x20, 0x64, 0x2e, 0x60, 0x28, 0xa5, 0x29, + 0x65, 0x2a, 0x05, 0x7f, 0x04, 0x7f, 0x00, 0x7f, 0xa2, 0x0d, 0x00, 0xc0, + 0x9b, 0xfe, 0x68, 0x4c, 0xd0, 0xfc, 0x00, 0x40, 0x9b, 0xf6, 0x20, 0x09, + 0x00, 0x41, 0x0d, 0x7f, 0x00, 0x78, 0x9c, 0x2e, 0x60, 0x03, 0x00, 0x07, + 0x60, 0x17, 0x00, 0x00, 0x10, 0x78, 0x5b, 0xc1, 0x0d, 0x7f, 0x00, 0x7c, + 0x00, 0x7e, 0x0f, 0x7e, 0x2c, 0x78, 0x10, 0x78, 0x49, 0x63, 0x0f, 0x7f, + 0x00, 0x7f, 0x00, 0x40, 0x9c, 0x0b, 0x60, 0x03, 0x00, 0x02, 0x0d, 0x7f, + 0x00, 0x7c, 0x20, 0x09, 0xa7, 0x0d, 0x21, 0x0c, 0xd1, 0x9c, 0x00, 0x40, + 0x9c, 0x15, 0x60, 0x03, 0x00, 0x07, 0x00, 0x78, 0x9c, 0x17, 0x60, 0x03, + 0x00, 0x06, 0x10, 0x78, 0x9c, 0x1d, 0x10, 0x78, 0x5b, 0xc3, 0x0d, 0x7f, + 0x00, 0x7c, 0xd2, 0xfc, 0x00, 0x40, 0x9c, 0x29, 0x80, 0x02, 0x80, 0x00, + 0x82, 0x12, 0xa2, 0x91, 0x00, 0x00, 0x20, 0x09, 0x00, 0x09, 0x00, 0x78, + 0x9c, 0x2b, 0x20, 0x09, 0x00, 0x15, 0x6a, 0x6a, 0x68, 0x66, 0x00, 0x7c, + 0xa1, 0x82, 0x00, 0x40, 0x00, 0x48, 0x9c, 0x34, 0x00, 0x79, 0x9c, 0x41, + 0xa1, 0x86, 0x00, 0x13, 0x00, 0x40, 0x9c, 0x3c, 0xa1, 0x86, 0x00, 0x14, + 0x10, 0xc0, 0x13, 0x32, 0x60, 0x24, 0xd0, 0xdc, 0x10, 0x40, 0x13, 0x32, + 0x00, 0x7c, 0x9c, 0x54, 0x9c, 0x5b, 0x9c, 0x67, 0x9c, 0x73, 0x9c, 0x54, + 0x9c, 0x54, 0x9c, 0x54, 0x9c, 0x82, 0x9c, 0x54, 0x9c, 0x56, 0x9c, 0x56, + 0x9c, 0x54, 0x9c, 0x54, 0x9c, 0x54, 0x9c, 0x54, 0x9c, 0x54, 0x9c, 0x54, + 0x9c, 0x54, 0x9c, 0x54, 0x10, 0x78, 0x13, 0x32, 0x60, 0x24, 0xd0, 0xdc, + 0x10, 0x40, 0x13, 0x32, 0x00, 0x7c, 0x60, 0x03, 0x00, 0x01, 0x61, 0x06, + 0x10, 0x78, 0x5d, 0x8a, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x10, 0x78, + 0x62, 0xd1, 0x12, 0x7f, 0x00, 0x7c, 0x60, 0x03, 0x00, 0x01, 0x61, 0x06, + 0x10, 0x78, 0x5d, 0x8a, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x10, 0x78, + 0x62, 0xd1, 0x12, 0x7f, 0x00, 0x7c, 0x60, 0x03, 0x00, 0x03, 0x61, 0x06, + 0x2c, 0x10, 0x10, 0x78, 0x1c, 0xf0, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, + 0x10, 0x78, 0x5d, 0xf6, 0x10, 0x78, 0x63, 0x9b, 0x12, 0x7f, 0x00, 0x7c, + 0xa0, 0x16, 0x10, 0x78, 0x15, 0xfa, 0x00, 0x7c, 0x12, 0x7e, 0x20, 0x91, + 0x80, 0x00, 0x03, 0x7e, 0x0d, 0x7e, 0xa1, 0x82, 0x00, 0x40, 0x10, 0x79, + 0x9c, 0x93, 0x0d, 0x7f, 0x03, 0x7f, 0x12, 0x7f, 0x00, 0x7c, 0x9c, 0xa3, + 0x9c, 0xa5, 0x9c, 0xba, 0x9c, 0xd9, 0x9c, 0xa3, 0x9c, 0xa3, 0x9c, 0xa3, + 0x9c, 0xf1, 0x9c, 0xa3, 0x9c, 0xa3, 0x9c, 0xa3, 0x9c, 0xa3, 0x9c, 0xa3, + 0x9c, 0xa3, 0x9c, 0xa3, 0x9c, 0xa3, 0x10, 0x78, 0x13, 0x32, 0x60, 0x10, + 0x20, 0x68, 0x68, 0x4c, 0xd0, 0xfc, 0x00, 0x40, 0x9c, 0xcf, 0xa0, 0x9c, + 0x00, 0x03, 0xa3, 0x9e, 0x00, 0x03, 0x00, 0x40, 0x9c, 0xcf, 0x60, 0x03, + 0x00, 0x01, 0x61, 0x06, 0x10, 0x78, 0x5d, 0x8a, 0x10, 0x78, 0x62, 0xd1, + 0x00, 0x78, 0x9c, 0xf4, 0x60, 0x10, 0x20, 0x68, 0x68, 0x4c, 0xd0, 0xfc, + 0x00, 0x40, 0x9c, 0xcf, 0xa0, 0x9c, 0x00, 0x03, 0xa3, 0x9e, 0x00, 0x03, + 0x00, 0x40, 0x9c, 0xcf, 0x60, 0x03, 0x00, 0x01, 0x61, 0x06, 0x10, 0x78, + 0x5d, 0x8a, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x78, 0x9c, 0xf4, 0x60, 0x13, + 0x00, 0x00, 0x60, 0x17, 0x00, 0x00, 0x20, 0x19, 0x00, 0x04, 0x10, 0x78, + 0xa1, 0xda, 0x00, 0x78, 0x9c, 0xf4, 0x60, 0x10, 0x20, 0x68, 0x68, 0x4c, + 0xd0, 0xfc, 0x00, 0x40, 0x9c, 0xcf, 0xa0, 0x9c, 0x00, 0x03, 0xa3, 0x9e, + 0x00, 0x03, 0x00, 0x40, 0x9c, 0xcf, 0x60, 0x03, 0x00, 0x03, 0x61, 0x06, + 0x2c, 0x10, 0x10, 0x78, 0x1c, 0xf0, 0x10, 0x78, 0x5d, 0xf6, 0x10, 0x78, + 0x63, 0x9b, 0x00, 0x78, 0x9c, 0xf4, 0xa0, 0x16, 0x10, 0x78, 0x15, 0xfa, + 0x00, 0x7c, 0x10, 0x78, 0x61, 0xcd, 0x61, 0x10, 0x81, 0xff, 0x00, 0x40, + 0x9d, 0x06, 0x0d, 0x7e, 0x21, 0x68, 0x10, 0x78, 0xa4, 0xf2, 0x03, 0x7e, + 0x20, 0x19, 0x00, 0x29, 0x10, 0x78, 0xa1, 0xda, 0x03, 0x7f, 0x0d, 0x7f, + 0x10, 0x78, 0x8e, 0xd6, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x7c, 0x10, 0x78, + 0x62, 0x7a, 0x61, 0x10, 0x81, 0xff, 0x00, 0x40, 0x9d, 0x1c, 0x0d, 0x7e, + 0x21, 0x68, 0x10, 0x78, 0xa4, 0xf2, 0x03, 0x7e, 0x20, 0x19, 0x00, 0x29, + 0x10, 0x78, 0xa1, 0xda, 0x03, 0x7f, 0x0d, 0x7f, 0x10, 0x78, 0x8e, 0xd6, + 0x10, 0x78, 0x63, 0x9b, 0x00, 0x7c, 0xa1, 0x82, 0x00, 0x85, 0x00, 0x79, + 0x9d, 0x25, 0x9d, 0x2e, 0x9d, 0x2c, 0x9d, 0x2c, 0x9d, 0x3a, 0x9d, 0x2c, + 0x9d, 0x2c, 0x9d, 0x2c, 0x10, 0x78, 0x13, 0x32, 0x60, 0x03, 0x00, 0x0b, + 0x61, 0x06, 0x10, 0x78, 0x5d, 0x8a, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, + 0x10, 0x78, 0x62, 0xd1, 0x12, 0x7f, 0x00, 0x7c, 0x02, 0x7e, 0x0e, 0x7e, + 0x10, 0x78, 0xa4, 0x2c, 0x00, 0x40, 0x9d, 0x44, 0x10, 0x78, 0x77, 0x2d, + 0x00, 0x78, 0x9d, 0x60, 0x20, 0x71, 0xac, 0x80, 0x72, 0x24, 0x62, 0x12, + 0x72, 0x20, 0x10, 0x78, 0xa0, 0x79, 0x00, 0x40, 0x9d, 0x51, 0x60, 0x07, + 0x00, 0x86, 0x00, 0x78, 0x9d, 0x5a, 0x60, 0x07, 0x00, 0x87, 0x72, 0x24, + 0xa2, 0x96, 0xff, 0xff, 0x00, 0xc0, 0x9d, 0x5a, 0x60, 0x07, 0x00, 0x86, + 0x60, 0x03, 0x00, 0x01, 0x10, 0x78, 0x5d, 0x8a, 0x10, 0x78, 0x62, 0xd1, + 0x0e, 0x7f, 0x02, 0x7f, 0x00, 0x7c, 0xa1, 0x86, 0x00, 0x13, 0x00, 0xc0, + 0x9d, 0x74, 0x60, 0x04, 0xa0, 0x8a, 0x00, 0x85, 0x10, 0x48, 0x13, 0x32, + 0xa0, 0x8a, 0x00, 0x8c, 0x10, 0xc8, 0x13, 0x32, 0xa0, 0x82, 0x00, 0x85, + 0x00, 0x79, 0x9d, 0x8b, 0xa1, 0x86, 0x00, 0x27, 0x00, 0x40, 0x9d, 0x80, + 0xa1, 0x86, 0x00, 0x14, 0x00, 0x40, 0x9d, 0x80, 0x10, 0x78, 0x77, 0x73, + 0x00, 0x78, 0x9d, 0x8a, 0x20, 0x01, 0x00, 0x07, 0x10, 0x78, 0x45, 0x35, + 0x10, 0x78, 0x61, 0xcd, 0x10, 0x78, 0x8e, 0xd6, 0x10, 0x78, 0x62, 0xd1, + 0x00, 0x7c, 0x9d, 0x92, 0x9d, 0x94, 0x9d, 0x94, 0x9d, 0x92, 0x9d, 0x92, + 0x9d, 0x92, 0x9d, 0x92, 0x10, 0x78, 0x13, 0x32, 0x10, 0x78, 0x61, 0xcd, + 0x10, 0x78, 0x8e, 0xd6, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x7c, 0xa1, 0x82, + 0x00, 0x85, 0x10, 0x48, 0x13, 0x32, 0xa1, 0x82, 0x00, 0x8c, 0x10, 0xc8, + 0x13, 0x32, 0xa1, 0x82, 0x00, 0x85, 0x00, 0x79, 0x9d, 0xa7, 0x9d, 0xae, + 0x9d, 0xae, 0x9d, 0xae, 0x9d, 0xb0, 0x9d, 0xae, 0x9d, 0xae, 0x9d, 0xae, + 0x10, 0x78, 0x13, 0x32, 0x00, 0x7c, 0xa1, 0x86, 0x00, 0x13, 0x00, 0x40, + 0x9d, 0xc1, 0xa1, 0x86, 0x00, 0x14, 0x00, 0x40, 0x9d, 0xc1, 0xa1, 0x86, + 0x00, 0x27, 0x00, 0x40, 0x9d, 0xc1, 0x10, 0x78, 0x77, 0x73, 0x00, 0x78, + 0x9d, 0xc7, 0x10, 0x78, 0x61, 0xcd, 0x10, 0x78, 0x8e, 0xd6, 0x10, 0x78, + 0x62, 0xd1, 0x00, 0x7c, 0x03, 0x7e, 0x10, 0x78, 0xa4, 0xa5, 0x60, 0x3f, + 0x00, 0x00, 0x20, 0x19, 0x00, 0x0b, 0x10, 0x78, 0x9d, 0xd7, 0x60, 0x1f, + 0x00, 0x06, 0x60, 0x03, 0x00, 0x07, 0x03, 0x7f, 0x00, 0x7c, 0x12, 0x7e, + 0x03, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x08, 0x7e, 0x2c, 0x40, 0x09, 0x7e, + 0x20, 0x49, 0x00, 0x00, 0x10, 0x78, 0x72, 0x46, 0x09, 0x7f, 0x08, 0x7f, + 0x00, 0xc0, 0x9e, 0x12, 0x07, 0x7e, 0x2c, 0x38, 0x10, 0x78, 0x72, 0xf3, + 0x07, 0x7f, 0x00, 0xc0, 0x9e, 0x12, 0x60, 0x00, 0xa0, 0x86, 0x00, 0x00, + 0x00, 0x40, 0x9e, 0x12, 0x60, 0x1c, 0xa0, 0x86, 0x00, 0x07, 0x00, 0x40, + 0x9e, 0x12, 0x0d, 0x7e, 0x60, 0x00, 0xa0, 0x86, 0x00, 0x04, 0x00, 0xc0, + 0x9e, 0x03, 0x10, 0x78, 0xa4, 0xa5, 0x60, 0x1f, 0x00, 0x07, 0x10, 0x78, + 0x17, 0x57, 0x60, 0x10, 0x20, 0x68, 0x10, 0x78, 0x8d, 0x16, 0x00, 0x40, + 0x9e, 0x0b, 0x10, 0x78, 0xa1, 0xda, 0x0d, 0x7f, 0x60, 0x13, 0x00, 0x00, + 0x10, 0x78, 0xa4, 0xa5, 0x60, 0x1f, 0x00, 0x07, 0x03, 0x7f, 0x12, 0x7f, + 0x00, 0x7c, 0x0f, 0x7e, 0x0c, 0x7e, 0x03, 0x7e, 0x15, 0x7e, 0x20, 0x79, + 0xac, 0x80, 0x79, 0x38, 0x78, 0x3c, 0x10, 0x78, 0x25, 0x4d, 0x00, 0xc0, + 0x9e, 0x59, 0x01, 0x7e, 0x0c, 0x7e, 0x10, 0x78, 0x45, 0xc4, 0x00, 0xc0, + 0x9e, 0x59, 0x01, 0x7f, 0x02, 0x7f, 0x02, 0x7e, 0x01, 0x7e, 0x20, 0x19, + 0x00, 0x29, 0x10, 0x78, 0x73, 0xd0, 0x10, 0x78, 0x5f, 0x01, 0x07, 0x7e, + 0x20, 0x39, 0x00, 0x00, 0x10, 0x78, 0x5e, 0x0a, 0x07, 0x7f, 0x01, 0x7f, + 0x07, 0x7e, 0x20, 0x39, 0x00, 0x00, 0x10, 0x78, 0x9f, 0x9b, 0x07, 0x7f, + 0x10, 0x78, 0x47, 0xe9, 0x02, 0x7e, 0x62, 0x04, 0xa2, 0x94, 0xff, 0x00, + 0x82, 0x17, 0xa2, 0x86, 0x00, 0x06, 0x00, 0x40, 0x9e, 0x4d, 0xa2, 0x86, + 0x00, 0x04, 0x00, 0xc0, 0x9e, 0x50, 0x62, 0xa0, 0x10, 0x78, 0x29, 0x42, + 0x02, 0x7f, 0x01, 0x7f, 0x10, 0x78, 0x42, 0xf8, 0x66, 0x12, 0x65, 0x16, + 0xa0, 0x06, 0x00, 0x78, 0x9e, 0x5b, 0x0c, 0x7f, 0x01, 0x7f, 0x15, 0x7f, + 0x03, 0x7f, 0x0c, 0x7f, 0x0f, 0x7f, 0x00, 0x7c, 0x0c, 0x7e, 0x0d, 0x7e, + 0x0e, 0x7e, 0x01, 0x7e, 0x20, 0x09, 0xa7, 0x20, 0x21, 0x04, 0xa0, 0x86, + 0x00, 0x74, 0x00, 0xc0, 0x9e, 0xc3, 0x20, 0x69, 0xac, 0x8e, 0x69, 0x0c, + 0xa1, 0x82, 0x01, 0x00, 0x00, 0x48, 0x9e, 0xb3, 0x69, 0x08, 0xa1, 0x84, + 0x80, 0x00, 0x00, 0x40, 0x9e, 0xbf, 0x60, 0x18, 0x20, 0x70, 0x70, 0x10, + 0xa0, 0x84, 0x00, 0xff, 0x00, 0x40, 0x9e, 0x82, 0x70, 0x00, 0xd0, 0xf4, + 0x00, 0x40, 0x9e, 0x86, 0xa1, 0x84, 0x08, 0x00, 0x00, 0x40, 0x9e, 0xbf, + 0x69, 0x10, 0xa1, 0x8a, 0x00, 0x01, 0x00, 0x48, 0x9e, 0xb7, 0x69, 0x14, + 0x20, 0x69, 0xac, 0xae, 0x69, 0x04, 0x81, 0xff, 0x00, 0xc0, 0x9e, 0xab, + 0x69, 0x0c, 0xa1, 0x82, 0x01, 0x00, 0x00, 0x48, 0x9e, 0xb3, 0x69, 0x08, + 0x81, 0xff, 0x00, 0xc0, 0x9e, 0xaf, 0x69, 0x10, 0xa1, 0x8a, 0x00, 0x01, + 0x00, 0x48, 0x9e, 0xb7, 0x69, 0x18, 0xa1, 0x8a, 0x00, 0x01, 0x00, 0x48, + 0x9e, 0xbf, 0x00, 0x78, 0x9e, 0xc9, 0x60, 0x13, 0x01, 0x00, 0x00, 0x78, + 0x9e, 0xc5, 0x60, 0x13, 0x03, 0x00, 0x00, 0x78, 0x9e, 0xc5, 0x60, 0x13, + 0x05, 0x00, 0x00, 0x78, 0x9e, 0xc5, 0x60, 0x13, 0x07, 0x00, 0x00, 0x78, + 0x9e, 0xc5, 0x60, 0x13, 0x09, 0x00, 0x00, 0x78, 0x9e, 0xc5, 0x60, 0x13, + 0x0b, 0x00, 0x00, 0x78, 0x9e, 0xc5, 0x60, 0x13, 0x0f, 0x00, 0x00, 0x78, + 0x9e, 0xc5, 0x60, 0x13, 0x2d, 0x00, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x78, + 0x9e, 0xca, 0xa0, 0x06, 0x01, 0x7f, 0x0e, 0x7f, 0x0d, 0x7f, 0x0c, 0x7f, + 0x00, 0x7c, 0x0c, 0x7e, 0x0d, 0x7e, 0x02, 0x7e, 0x03, 0x7e, 0x15, 0x7e, + 0x62, 0x18, 0x22, 0x68, 0x6b, 0x04, 0xa3, 0x94, 0x00, 0xff, 0xa2, 0x86, + 0x00, 0x06, 0x00, 0x40, 0x9e, 0xf3, 0xa2, 0x86, 0x00, 0x04, 0x00, 0x40, + 0x9e, 0xf3, 0xa3, 0x94, 0xff, 0x00, 0x82, 0x17, 0xa2, 0x86, 0x00, 0x06, + 0x00, 0x40, 0x9e, 0xf3, 0xa2, 0x86, 0x00, 0x04, 0x00, 0x40, 0x9e, 0xf3, + 0x0c, 0x7e, 0x2d, 0x60, 0x10, 0x78, 0x45, 0xd6, 0x0c, 0x7f, 0x00, 0x78, + 0x9f, 0x2e, 0x20, 0x11, 0xac, 0x96, 0xad, 0x98, 0x00, 0x0a, 0x20, 0xa9, + 0x00, 0x04, 0x10, 0x78, 0x80, 0xde, 0x00, 0xc0, 0x9f, 0x2f, 0x20, 0x11, + 0xac, 0x9a, 0xad, 0x98, 0x00, 0x06, 0x20, 0xa9, 0x00, 0x04, 0x10, 0x78, + 0x80, 0xde, 0x00, 0xc0, 0x9f, 0x2f, 0x04, 0x7e, 0x01, 0x7e, 0x6a, 0xa0, + 0xa2, 0x94, 0x00, 0xff, 0x82, 0x27, 0xa0, 0x06, 0x20, 0x09, 0xa7, 0x53, + 0x21, 0x0c, 0xd1, 0xa4, 0x00, 0x40, 0x9f, 0x1b, 0x20, 0x09, 0x00, 0x29, + 0x10, 0x78, 0xa2, 0x2d, 0x68, 0x00, 0xc0, 0xe5, 0x68, 0x02, 0x20, 0x19, + 0x00, 0x29, 0x10, 0x78, 0x5f, 0x01, 0x07, 0x7e, 0x20, 0x39, 0x00, 0x00, + 0x10, 0x78, 0x5e, 0x0a, 0x2c, 0x08, 0x10, 0x78, 0x9f, 0x9b, 0x07, 0x7f, + 0x20, 0x01, 0x00, 0x07, 0x10, 0x78, 0x45, 0x35, 0x01, 0x7f, 0x04, 0x7f, + 0xa0, 0x06, 0x15, 0x7f, 0x03, 0x7f, 0x02, 0x7f, 0x0d, 0x7f, 0x0c, 0x7f, + 0x00, 0x7c, 0x0d, 0x7e, 0x20, 0x69, 0xac, 0x8e, 0x68, 0x00, 0xa0, 0x86, + 0x08, 0x00, 0x00, 0x40, 0x9f, 0x41, 0x60, 0x13, 0x00, 0x00, 0x00, 0x78, + 0x9f, 0x42, 0xa0, 0x06, 0x0d, 0x7f, 0x00, 0x7c, 0x0c, 0x7e, 0x0f, 0x7e, + 0x01, 0x7e, 0x02, 0x7e, 0x03, 0x7e, 0x15, 0x7e, 0x20, 0x79, 0xac, 0x8c, + 0x79, 0x30, 0x78, 0x34, 0x10, 0x78, 0x25, 0x4d, 0x00, 0xc0, 0x9f, 0x68, + 0x10, 0x78, 0x45, 0xc4, 0x00, 0xc0, 0x9f, 0x68, 0x20, 0x11, 0xac, 0x90, + 0xac, 0x98, 0x00, 0x0a, 0x20, 0xa9, 0x00, 0x04, 0x10, 0x78, 0x80, 0xde, + 0x00, 0xc0, 0x9f, 0x68, 0x20, 0x11, 0xac, 0x94, 0xac, 0x98, 0x00, 0x06, + 0x20, 0xa9, 0x00, 0x04, 0x10, 0x78, 0x80, 0xde, 0x15, 0x7f, 0x03, 0x7f, + 0x02, 0x7f, 0x01, 0x7f, 0x0f, 0x7f, 0x0c, 0x7f, 0x00, 0x7c, 0x0c, 0x7e, + 0x00, 0x7e, 0x01, 0x7e, 0x02, 0x7e, 0x03, 0x7e, 0x15, 0x7e, 0x20, 0x11, + 0xac, 0x83, 0x22, 0x04, 0x82, 0x11, 0x22, 0x0c, 0x10, 0x78, 0x25, 0x4d, + 0x00, 0xc0, 0x9f, 0x94, 0x10, 0x78, 0x45, 0xc4, 0x00, 0xc0, 0x9f, 0x94, + 0x20, 0x11, 0xac, 0x96, 0xac, 0x98, 0x00, 0x0a, 0x20, 0xa9, 0x00, 0x04, + 0x10, 0x78, 0x80, 0xde, 0x00, 0xc0, 0x9f, 0x94, 0x20, 0x11, 0xac, 0x9a, + 0xac, 0x98, 0x00, 0x06, 0x20, 0xa9, 0x00, 0x04, 0x10, 0x78, 0x80, 0xde, + 0x15, 0x7f, 0x03, 0x7f, 0x02, 0x7f, 0x01, 0x7f, 0x00, 0x7f, 0x0c, 0x7f, + 0x00, 0x7c, 0x0e, 0x7e, 0x0c, 0x7e, 0x08, 0x7e, 0x07, 0x7e, 0x06, 0x7e, + 0x05, 0x7e, 0x04, 0x7e, 0x02, 0x7e, 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, + 0x27, 0x40, 0x20, 0x29, 0xa9, 0xba, 0x25, 0x2c, 0x20, 0x21, 0xa9, 0xc0, + 0x24, 0x24, 0x20, 0x61, 0xae, 0x00, 0x20, 0x71, 0xa7, 0x00, 0x76, 0x48, + 0x70, 0x64, 0x81, 0xff, 0x00, 0x40, 0x9f, 0xc2, 0x00, 0x7e, 0xa1, 0x86, + 0xaa, 0xb3, 0x00, 0x7f, 0x00, 0x40, 0x9f, 0xc2, 0x80, 0x01, 0xa6, 0x02, + 0x00, 0xc8, 0xa0, 0x2c, 0x00, 0x78, 0x9f, 0xc5, 0xa6, 0x06, 0x00, 0x40, + 0xa0, 0x2c, 0x21, 0x00, 0xac, 0x06, 0x00, 0x40, 0xa0, 0x22, 0x10, 0x78, + 0xa2, 0x52, 0x00, 0x40, 0xa0, 0x22, 0x67, 0x1c, 0xa7, 0x86, 0x00, 0x01, + 0x00, 0x40, 0xa0, 0x47, 0xa7, 0x86, 0x00, 0x04, 0x00, 0x40, 0xa0, 0x47, + 0xa7, 0x86, 0x00, 0x07, 0x00, 0x40, 0xa0, 0x22, 0x25, 0x00, 0xac, 0x06, + 0x00, 0x40, 0xa0, 0x22, 0x24, 0x00, 0xac, 0x06, 0x00, 0x40, 0xa0, 0x22, + 0x10, 0x78, 0xa2, 0x66, 0x00, 0xc0, 0xa0, 0x22, 0x88, 0xff, 0x00, 0x40, + 0x9f, 0xed, 0x60, 0x20, 0xa9, 0x06, 0x00, 0xc0, 0xa0, 0x22, 0x0d, 0x7e, + 0x60, 0x00, 0xa0, 0x86, 0x00, 0x04, 0x00, 0xc0, 0x9f, 0xf7, 0x01, 0x7e, + 0x10, 0x78, 0x17, 0x57, 0x01, 0x7f, 0xa7, 0x86, 0x00, 0x08, 0x00, 0xc0, + 0xa0, 0x06, 0x10, 0x78, 0x8f, 0x10, 0x00, 0xc0, 0xa0, 0x06, 0x10, 0x78, + 0x7c, 0x83, 0x0d, 0x7f, 0x10, 0x78, 0x8e, 0xd6, 0x00, 0x78, 0xa0, 0x22, + 0x60, 0x10, 0x20, 0x68, 0x10, 0x78, 0x8d, 0x16, 0x00, 0x40, 0xa0, 0x1f, + 0xa7, 0x86, 0x00, 0x03, 0x00, 0xc0, 0xa0, 0x36, 0x68, 0x37, 0x01, 0x03, + 0x6b, 0x4a, 0x68, 0x47, 0x00, 0x00, 0x10, 0x78, 0xa4, 0xf2, 0x01, 0x7e, + 0x10, 0x78, 0x8f, 0x8d, 0x10, 0x78, 0x4a, 0x73, 0x01, 0x7f, 0x10, 0x78, + 0x8e, 0xc9, 0x0d, 0x7f, 0x10, 0x78, 0x8e, 0xd6, 0xac, 0xe0, 0x00, 0x10, + 0x20, 0x01, 0xa7, 0x16, 0x20, 0x04, 0xac, 0x02, 0x00, 0xc8, 0xa0, 0x2c, + 0x00, 0x78, 0x9f, 0xaf, 0x12, 0x7f, 0x02, 0x7f, 0x04, 0x7f, 0x05, 0x7f, + 0x06, 0x7f, 0x07, 0x7f, 0x08, 0x7f, 0x0c, 0x7f, 0x0e, 0x7f, 0x00, 0x7c, + 0xa7, 0x86, 0x00, 0x06, 0x00, 0xc0, 0xa0, 0x10, 0xa3, 0x86, 0x00, 0x05, + 0x00, 0x40, 0xa0, 0x44, 0x10, 0x78, 0xa4, 0xf2, 0x10, 0x78, 0xa1, 0xda, + 0x00, 0x78, 0xa0, 0x1f, 0x0d, 0x7f, 0x00, 0x78, 0xa0, 0x22, 0x10, 0x78, + 0xa2, 0x66, 0x00, 0xc0, 0xa0, 0x22, 0x81, 0xff, 0x00, 0x40, 0xa0, 0x22, + 0xa1, 0x80, 0x00, 0x01, 0x20, 0x04, 0xa0, 0x86, 0x00, 0x18, 0x00, 0x40, + 0xa0, 0x5c, 0xa1, 0x80, 0x00, 0x01, 0x20, 0x04, 0xa0, 0x86, 0x00, 0x2d, + 0x00, 0xc0, 0xa0, 0x22, 0x60, 0x00, 0xa0, 0x86, 0x00, 0x02, 0x00, 0xc0, + 0xa0, 0x22, 0x10, 0x78, 0x8e, 0xfc, 0x00, 0x40, 0xa0, 0x6d, 0x10, 0x78, + 0x8f, 0x10, 0x00, 0xc0, 0xa0, 0x22, 0x10, 0x78, 0x7c, 0x83, 0x00, 0x78, + 0xa0, 0x75, 0x10, 0x78, 0x28, 0xa6, 0x10, 0x78, 0x8f, 0x10, 0x00, 0xc0, + 0xa0, 0x75, 0x10, 0x78, 0x7c, 0x83, 0x10, 0x78, 0x8e, 0xd6, 0x00, 0x78, + 0xa0, 0x22, 0x0c, 0x7e, 0x0e, 0x7e, 0x01, 0x7e, 0x2c, 0x08, 0x21, 0x70, + 0xa0, 0x06, 0x10, 0x78, 0xa1, 0xf6, 0x01, 0x7f, 0x00, 0x40, 0xa0, 0x89, + 0x60, 0x1c, 0xa0, 0x84, 0x00, 0x0f, 0x10, 0x79, 0xa0, 0x8c, 0x0e, 0x7f, + 0x0c, 0x7f, 0x00, 0x7c, 0xa0, 0x94, 0xa0, 0x94, 0xa0, 0x94, 0xa0, 0x94, + 0xa0, 0x94, 0xa0, 0x94, 0xa0, 0x96, 0xa0, 0x94, 0xa0, 0x06, 0x00, 0x7c, + 0x04, 0x7e, 0x01, 0x7e, 0x70, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x24, + 0xa4, 0xa4, 0x00, 0xff, 0x84, 0x27, 0x2c, 0x00, 0x20, 0x09, 0x00, 0x20, + 0x10, 0x78, 0xa2, 0x2d, 0x01, 0x7f, 0x04, 0x7f, 0x03, 0x7e, 0x20, 0x19, + 0x00, 0x02, 0x10, 0x78, 0x9d, 0xd7, 0x03, 0x7f, 0xa0, 0x85, 0x00, 0x01, + 0x00, 0x7c, 0x20, 0x01, 0x00, 0x01, 0x10, 0x78, 0x44, 0xee, 0x15, 0x7e, + 0x01, 0x7e, 0x02, 0x7e, 0x03, 0x7e, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x19, + 0xa7, 0x05, 0x20, 0x11, 0xac, 0x96, 0x10, 0x78, 0x80, 0xde, 0x03, 0x7f, + 0x02, 0x7f, 0x01, 0x7f, 0x15, 0x7f, 0xa0, 0x05, 0x00, 0x7c, 0x0f, 0x7e, + 0x0e, 0x7e, 0x0c, 0x7e, 0x08, 0x7e, 0x07, 0x7e, 0x06, 0x7e, 0x02, 0x7e, + 0x12, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x27, 0x40, 0x20, 0x61, 0xae, 0x00, + 0x20, 0x79, 0x00, 0x01, 0x8f, 0xff, 0x00, 0x40, 0xa1, 0x2d, 0x20, 0x71, + 0xa7, 0x00, 0x76, 0x48, 0x70, 0x64, 0x80, 0x01, 0xa6, 0x02, 0x00, 0xc8, + 0xa1, 0x2d, 0x88, 0xff, 0x00, 0x40, 0xa0, 0xe8, 0x28, 0x00, 0xac, 0x06, + 0x00, 0xc0, 0xa1, 0x23, 0x20, 0x79, 0x00, 0x00, 0x10, 0x78, 0xa2, 0x52, + 0x00, 0x40, 0xa1, 0x23, 0x24, 0x00, 0xac, 0x06, 0x00, 0x40, 0xa1, 0x23, + 0x67, 0x1c, 0xa7, 0x86, 0x00, 0x06, 0x00, 0xc0, 0xa1, 0x23, 0xa7, 0x86, + 0x00, 0x07, 0x00, 0x40, 0xa1, 0x23, 0x88, 0xff, 0x00, 0xc0, 0xa1, 0x07, + 0x60, 0x18, 0xa2, 0x06, 0x00, 0xc0, 0xa1, 0x23, 0x85, 0xff, 0x00, 0x40, + 0xa1, 0x07, 0x60, 0x20, 0xa1, 0x06, 0x00, 0xc0, 0xa1, 0x23, 0x0d, 0x7e, + 0x60, 0x00, 0xa0, 0x86, 0x00, 0x04, 0x00, 0xc0, 0xa1, 0x13, 0x10, 0x78, + 0xa4, 0xa5, 0x60, 0x1f, 0x00, 0x07, 0x10, 0x78, 0x17, 0x57, 0x60, 0x10, + 0x20, 0x68, 0x10, 0x78, 0x8d, 0x16, 0x00, 0x40, 0xa1, 0x1d, 0x04, 0x7e, + 0x10, 0x78, 0xa1, 0xda, 0x04, 0x7f, 0x0d, 0x7f, 0x10, 0x78, 0x8e, 0xd6, + 0x88, 0xff, 0x00, 0xc0, 0xa1, 0x37, 0xac, 0xe0, 0x00, 0x10, 0x20, 0x01, + 0xa7, 0x16, 0x20, 0x04, 0xac, 0x02, 0x00, 0xc8, 0xa1, 0x2d, 0x00, 0x78, + 0xa0, 0xd4, 0xa0, 0x06, 0x12, 0x7f, 0x02, 0x7f, 0x06, 0x7f, 0x07, 0x7f, + 0x08, 0x7f, 0x0c, 0x7f, 0x0e, 0x7f, 0x0f, 0x7f, 0x00, 0x7c, 0xa8, 0xc5, + 0x00, 0x01, 0x00, 0x78, 0xa1, 0x2e, 0x07, 0x7e, 0x05, 0x7e, 0x08, 0x7e, + 0x20, 0x41, 0x00, 0x00, 0x20, 0x29, 0x00, 0x01, 0x2c, 0x20, 0x20, 0x19, + 0x00, 0x02, 0x62, 0x18, 0x09, 0x7e, 0x20, 0x49, 0x00, 0x00, 0x10, 0x78, + 0x72, 0x46, 0x09, 0x7f, 0x08, 0x7f, 0x20, 0x39, 0x00, 0x00, 0x10, 0x78, + 0x72, 0xf3, 0x10, 0x78, 0xa0, 0xc5, 0x05, 0x7f, 0x07, 0x7f, 0x00, 0x7c, + 0x02, 0x7e, 0x04, 0x7e, 0x05, 0x7e, 0x07, 0x7e, 0x0c, 0x7e, 0x15, 0x7e, + 0x2c, 0x20, 0x21, 0x28, 0x20, 0xa9, 0x00, 0x7f, 0x20, 0x09, 0x00, 0x00, + 0x01, 0x7e, 0x03, 0x7e, 0x10, 0x78, 0x45, 0xc4, 0x00, 0xc0, 0xa1, 0x7e, + 0x2c, 0x10, 0x05, 0x7e, 0x08, 0x7e, 0x20, 0x41, 0x00, 0x00, 0x25, 0x08, + 0x20, 0x29, 0x00, 0x01, 0x09, 0x7e, 0x20, 0x49, 0x00, 0x00, 0x10, 0x78, + 0x72, 0x46, 0x09, 0x7f, 0x08, 0x7f, 0x20, 0x39, 0x00, 0x00, 0x10, 0x78, + 0x72, 0xf3, 0x10, 0x78, 0xa0, 0xc5, 0x05, 0x7f, 0x03, 0x7f, 0x01, 0x7f, + 0x81, 0x08, 0x00, 0xf0, 0xa1, 0x62, 0x15, 0x7f, 0x0c, 0x7f, 0x07, 0x7f, + 0x05, 0x7f, 0x04, 0x7f, 0x02, 0x7f, 0x00, 0x7c, 0x07, 0x7e, 0x05, 0x7e, + 0x62, 0x18, 0x08, 0x7e, 0x20, 0x41, 0x00, 0x00, 0x20, 0x29, 0x00, 0x01, + 0x20, 0x19, 0x00, 0x48, 0x09, 0x7e, 0x20, 0x49, 0x00, 0x00, 0x10, 0x78, + 0x72, 0x46, 0x09, 0x7f, 0x08, 0x7f, 0x20, 0x39, 0x00, 0x00, 0x10, 0x78, + 0x72, 0xf3, 0x2c, 0x20, 0x10, 0x78, 0xa0, 0xc5, 0x05, 0x7f, 0x07, 0x7f, + 0x00, 0x7c, 0x02, 0x7e, 0x04, 0x7e, 0x05, 0x7e, 0x07, 0x7e, 0x0c, 0x7e, + 0x15, 0x7e, 0x2c, 0x20, 0x20, 0xa9, 0x00, 0x7f, 0x20, 0x09, 0x00, 0x00, + 0x01, 0x7e, 0x03, 0x7e, 0x10, 0x78, 0x45, 0xc4, 0x00, 0xc0, 0xa1, 0xce, + 0x2c, 0x10, 0x08, 0x7e, 0x20, 0x41, 0x00, 0x00, 0x28, 0x28, 0x04, 0x7e, + 0x20, 0x21, 0x00, 0x01, 0x10, 0x78, 0xa4, 0x82, 0x04, 0x7f, 0x09, 0x7e, + 0x20, 0x49, 0x00, 0x00, 0x10, 0x78, 0x72, 0x46, 0x09, 0x7f, 0x08, 0x7f, + 0x20, 0x39, 0x00, 0x00, 0x10, 0x78, 0x72, 0xf3, 0x10, 0x78, 0xa0, 0xc5, + 0x03, 0x7f, 0x01, 0x7f, 0x81, 0x08, 0x00, 0xf0, 0xa1, 0xb0, 0x15, 0x7f, + 0x0c, 0x7f, 0x07, 0x7f, 0x05, 0x7f, 0x04, 0x7f, 0x02, 0x7f, 0x00, 0x7c, + 0x01, 0x7e, 0x0f, 0x7e, 0xad, 0x82, 0xce, 0x00, 0x00, 0x48, 0xa1, 0xf3, + 0xad, 0x82, 0xff, 0xff, 0x00, 0xc8, 0xa1, 0xf3, 0x68, 0x00, 0xa0, 0x7d, + 0x00, 0x40, 0xa1, 0xf0, 0x68, 0x03, 0x00, 0x00, 0x6b, 0x52, 0x10, 0x78, + 0x4a, 0x73, 0x2f, 0x68, 0x00, 0x78, 0xa1, 0xe4, 0x6b, 0x52, 0x10, 0x78, + 0x4a, 0x73, 0x0f, 0x7f, 0x01, 0x7f, 0x00, 0x7c, 0x0e, 0x7e, 0x04, 0x7e, + 0x03, 0x7e, 0x20, 0x61, 0xae, 0x00, 0xa0, 0x05, 0x00, 0xc0, 0xa2, 0x06, + 0x20, 0x71, 0xa7, 0x00, 0x74, 0x48, 0x70, 0x64, 0x80, 0x01, 0xa4, 0x02, + 0x00, 0xc8, 0xa2, 0x28, 0x21, 0x00, 0xac, 0x06, 0x00, 0x40, 0xa2, 0x1a, + 0x60, 0x00, 0xa0, 0x86, 0x00, 0x00, 0x00, 0x40, 0xa2, 0x1a, 0x60, 0x08, + 0xa2, 0x06, 0x00, 0xc0, 0xa2, 0x1a, 0x60, 0x18, 0xa1, 0xa0, 0x00, 0x06, + 0x24, 0x24, 0xa4, 0x06, 0x00, 0x40, 0xa2, 0x24, 0xac, 0xe0, 0x00, 0x10, + 0x20, 0x01, 0xa7, 0x16, 0x20, 0x04, 0xac, 0x02, 0x00, 0xc8, 0xa2, 0x28, + 0x00, 0x78, 0xa2, 0x06, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x78, 0xa2, 0x29, + 0xa0, 0x06, 0x03, 0x7f, 0x04, 0x7f, 0x0e, 0x7f, 0x00, 0x7c, 0x0d, 0x7e, + 0x00, 0x7e, 0x10, 0x78, 0x13, 0x8b, 0x00, 0x7f, 0x10, 0x40, 0x13, 0x32, + 0x68, 0x37, 0x01, 0x0d, 0x68, 0x5e, 0x02, 0x7e, 0x20, 0x10, 0x10, 0x78, + 0x8d, 0x02, 0x20, 0x01, 0x00, 0x00, 0x00, 0x40, 0xa2, 0x43, 0x22, 0x00, + 0xa0, 0x80, 0x00, 0x08, 0x20, 0x04, 0x02, 0x7f, 0x68, 0x4a, 0x69, 0x56, + 0x6c, 0x46, 0x68, 0x4f, 0x00, 0x00, 0xa0, 0x06, 0x68, 0xb2, 0x68, 0x02, + 0x68, 0x3a, 0x68, 0x5a, 0x10, 0x78, 0x4a, 0x73, 0x0d, 0x7f, 0x00, 0x7c, + 0x67, 0x00, 0xa7, 0x86, 0x00, 0x00, 0x00, 0x40, 0xa2, 0x65, 0xa7, 0x86, + 0x00, 0x01, 0x00, 0x40, 0xa2, 0x65, 0xa7, 0x86, 0x00, 0x0a, 0x00, 0x40, + 0xa2, 0x65, 0xa7, 0x86, 0x00, 0x09, 0x00, 0x40, 0xa2, 0x65, 0xa0, 0x85, + 0x00, 0x01, 0x00, 0x7c, 0x0e, 0x7e, 0x60, 0x18, 0x20, 0x70, 0x70, 0xa0, + 0xa2, 0x06, 0x0e, 0x7f, 0x00, 0x7c, 0x01, 0x7e, 0x60, 0x04, 0xa0, 0x8e, + 0x00, 0x1e, 0x00, 0xc0, 0xa2, 0x87, 0x80, 0x07, 0x61, 0x30, 0xa1, 0x8c, + 0x00, 0xff, 0xa1, 0x05, 0x60, 0x32, 0x60, 0x07, 0x00, 0x85, 0x60, 0x03, + 0x00, 0x0b, 0x60, 0x1f, 0x00, 0x05, 0x20, 0x01, 0xa9, 0xa3, 0x20, 0x04, + 0x60, 0x16, 0x10, 0x78, 0x5d, 0x8a, 0x10, 0x78, 0x62, 0xd1, 0x01, 0x7f, + 0x00, 0x7c, 0x00, 0x05, 0x00, 0x05, 0x00, 0x7c, 0x60, 0x24, 0xd0, 0xe4, + 0x00, 0x40, 0xa2, 0x9d, 0xd0, 0xcc, 0x00, 0x40, 0xa2, 0x97, 0x10, 0x78, + 0x8f, 0xcf, 0x00, 0x78, 0xa2, 0x9d, 0x10, 0x78, 0xa4, 0xa5, 0x10, 0x78, + 0x5b, 0xc1, 0x10, 0x78, 0x77, 0x2d, 0x00, 0x7c, 0xa2, 0x80, 0x00, 0x07, + 0x20, 0x04, 0xa0, 0x84, 0x00, 0x0f, 0x00, 0x79, 0xa2, 0xa5, 0xa2, 0xae, + 0xa2, 0xae, 0xa2, 0xae, 0xa2, 0xb0, 0xa2, 0xae, 0xa2, 0xb0, 0xa2, 0xb0, + 0xa2, 0xae, 0xa2, 0xb0, 0xa0, 0x06, 0x00, 0x7c, 0xa0, 0x85, 0x00, 0x01, + 0x00, 0x7c, 0xa2, 0x80, 0x00, 0x07, 0x20, 0x04, 0xa0, 0x84, 0x00, 0x0f, + 0x00, 0x79, 0xa2, 0xba, 0xa2, 0xc3, 0xa2, 0xc3, 0xa2, 0xc3, 0xa2, 0xc3, + 0xa2, 0xc3, 0xa2, 0xc3, 0xa2, 0xce, 0xa2, 0xc3, 0xa2, 0xc3, 0x60, 0x07, + 0x00, 0x3b, 0x60, 0x2b, 0x00, 0x09, 0x60, 0x13, 0x2a, 0x00, 0x60, 0x03, + 0x00, 0x01, 0x10, 0x78, 0x5d, 0x8a, 0x00, 0x7c, 0x0c, 0x7e, 0x22, 0x60, + 0x10, 0x78, 0xa4, 0xa5, 0x60, 0x3f, 0x00, 0x00, 0x60, 0x24, 0xc0, 0xf4, + 0xc0, 0xcc, 0x60, 0x26, 0x0c, 0x7f, 0x0d, 0x7e, 0x22, 0x68, 0xa1, 0x86, + 0x00, 0x07, 0x00, 0xc0, 0xa3, 0x2f, 0x68, 0x10, 0xa0, 0x05, 0x00, 0x40, + 0xa2, 0xec, 0xa0, 0x80, 0x00, 0x13, 0x20, 0x04, 0xd0, 0xfc, 0x00, 0xc0, + 0xa2, 0xec, 0x0d, 0x7f, 0x00, 0x78, 0xa2, 0xc3, 0x60, 0x07, 0x00, 0x3a, + 0x60, 0x03, 0x00, 0x01, 0x10, 0x78, 0x5d, 0x8a, 0x10, 0x78, 0x62, 0xd1, + 0x0c, 0x7e, 0x2d, 0x60, 0x61, 0x00, 0xa1, 0x86, 0x00, 0x02, 0x00, 0xc0, + 0xa3, 0xbd, 0x60, 0x10, 0xa0, 0x05, 0x00, 0xc0, 0xa3, 0x06, 0x60, 0x00, + 0xa0, 0x86, 0x00, 0x07, 0x10, 0xc0, 0x13, 0x32, 0x00, 0x78, 0xa3, 0xbd, + 0xa0, 0x8c, 0xf0, 0x00, 0x00, 0xc0, 0xa3, 0x12, 0x00, 0x78, 0xa3, 0x12, + 0x20, 0x68, 0x68, 0x00, 0xa0, 0x05, 0x00, 0xc0, 0xa3, 0x0c, 0x2d, 0x00, + 0xa0, 0x80, 0x00, 0x13, 0x20, 0x04, 0xa0, 0x84, 0x00, 0x03, 0xa0, 0x86, + 0x00, 0x02, 0x00, 0xc0, 0xa3, 0x2b, 0x60, 0x10, 0x20, 0x68, 0x68, 0x4c, + 0xc0, 0xdc, 0xc0, 0xf4, 0x68, 0x4e, 0x68, 0x50, 0xc0, 0xf4, 0xc0, 0xfc, + 0x68, 0x52, 0x20, 0x09, 0x00, 0x43, 0x10, 0x78, 0x9c, 0x2e, 0x00, 0x78, + 0xa3, 0xbd, 0x20, 0x09, 0x00, 0x41, 0x00, 0x78, 0xa3, 0xb7, 0xa1, 0x86, + 0x00, 0x05, 0x00, 0xc0, 0xa3, 0x76, 0x68, 0x10, 0xa0, 0x80, 0x00, 0x13, + 0x20, 0x04, 0xd0, 0xbc, 0x00, 0xc0, 0xa3, 0x3d, 0x0d, 0x7f, 0x00, 0x78, + 0xa2, 0xc3, 0xd0, 0xb4, 0x00, 0x40, 0xa3, 0x45, 0xd0, 0xfc, 0x10, 0x40, + 0x13, 0x32, 0x00, 0x78, 0xa2, 0xdf, 0x60, 0x07, 0x00, 0x3a, 0x60, 0x03, + 0x00, 0x01, 0x10, 0x78, 0x5d, 0x8a, 0x10, 0x78, 0x62, 0xd1, 0x0c, 0x7e, + 0x2d, 0x60, 0x61, 0x00, 0xa1, 0x86, 0x00, 0x02, 0x00, 0x40, 0xa3, 0x58, + 0xa1, 0x86, 0x00, 0x04, 0x00, 0xc0, 0xa3, 0xbd, 0x20, 0x71, 0xa9, 0xe7, + 0x70, 0x00, 0xa0, 0x86, 0x00, 0x03, 0x00, 0xc0, 0xa3, 0x65, 0x70, 0x04, + 0xac, 0x06, 0x00, 0xc0, 0xa3, 0x65, 0x70, 0x03, 0x00, 0x00, 0x68, 0x10, + 0xa0, 0x80, 0x00, 0x13, 0x20, 0x0c, 0xc1, 0xf4, 0xc1, 0xdc, 0x21, 0x02, + 0x80, 0x00, 0x20, 0x0c, 0xc1, 0xf4, 0xc1, 0xfc, 0xc1, 0xbc, 0x21, 0x02, + 0x20, 0x09, 0x00, 0x42, 0x00, 0x78, 0xa3, 0xb7, 0x03, 0x7e, 0x0d, 0x7e, + 0x0d, 0x7e, 0x10, 0x78, 0x13, 0x8b, 0x03, 0x7f, 0x10, 0x40, 0x13, 0x32, + 0x68, 0x37, 0x01, 0x0d, 0x68, 0x03, 0x00, 0x00, 0x68, 0x3b, 0x00, 0x00, + 0x68, 0x5b, 0x00, 0x00, 0x6b, 0x5e, 0x68, 0x57, 0x00, 0x45, 0x2c, 0x00, + 0x68, 0x62, 0x60, 0x34, 0x68, 0x72, 0x23, 0x60, 0x60, 0x24, 0xc0, 0xdd, + 0x60, 0x26, 0x60, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, 0xa0, 0x84, + 0x00, 0xff, 0x80, 0x07, 0x63, 0x20, 0x6b, 0x4a, 0x68, 0x46, 0x68, 0x4f, + 0x00, 0x00, 0x6d, 0x6a, 0x6e, 0x66, 0x68, 0x6f, 0x00, 0x01, 0x10, 0x78, + 0x4a, 0x73, 0x20, 0x19, 0x00, 0x45, 0x60, 0x08, 0x20, 0x68, 0x10, 0x78, + 0x9d, 0xd7, 0x2d, 0x00, 0x60, 0x0a, 0x60, 0x1f, 0x00, 0x06, 0x60, 0x03, + 0x00, 0x07, 0x60, 0x17, 0x00, 0x00, 0x60, 0x3f, 0x00, 0x00, 0x0d, 0x7f, + 0x03, 0x7f, 0x00, 0x78, 0xa3, 0xbe, 0x60, 0x3f, 0x00, 0x00, 0x60, 0x03, + 0x00, 0x07, 0x10, 0x78, 0x9c, 0x2e, 0x0c, 0x7f, 0x0d, 0x7f, 0x00, 0x7c, + 0xa1, 0x86, 0x00, 0x13, 0x00, 0xc0, 0xa3, 0xca, 0x60, 0x04, 0xa0, 0x82, + 0x00, 0x85, 0x20, 0x08, 0x00, 0x79, 0xa3, 0xe4, 0xa1, 0x86, 0x00, 0x27, + 0x00, 0xc0, 0xa3, 0xdd, 0x10, 0x78, 0x61, 0xcd, 0x03, 0x7e, 0x0d, 0x7e, + 0x60, 0x10, 0x20, 0x68, 0x20, 0x19, 0x00, 0x04, 0x10, 0x78, 0xa1, 0xda, + 0x0d, 0x7f, 0x03, 0x7f, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x7c, 0xa1, 0x86, + 0x00, 0x14, 0x00, 0x40, 0xa3, 0xce, 0x10, 0x78, 0x77, 0x73, 0x00, 0x7c, + 0xa3, 0xed, 0xa3, 0xeb, 0xa3, 0xeb, 0xa3, 0xeb, 0xa3, 0xeb, 0xa3, 0xeb, + 0xa3, 0xed, 0x10, 0x78, 0x13, 0x32, 0x10, 0x78, 0x61, 0xcd, 0x60, 0x03, + 0x00, 0x0c, 0x10, 0x78, 0x62, 0xd1, 0x00, 0x7c, 0xa1, 0x82, 0x00, 0x8c, + 0x00, 0xc8, 0xa3, 0xfe, 0xa1, 0x82, 0x00, 0x85, 0x00, 0x48, 0xa3, 0xfe, + 0x00, 0x79, 0xa4, 0x01, 0x10, 0x78, 0x77, 0x73, 0x00, 0x7c, 0xa4, 0x08, + 0xa4, 0x08, 0xa4, 0x08, 0xa4, 0x08, 0xa4, 0x0a, 0xa4, 0x29, 0xa4, 0x08, + 0x10, 0x78, 0x13, 0x32, 0x0d, 0x7e, 0x2c, 0x68, 0x10, 0x78, 0x76, 0xc7, + 0x00, 0x40, 0xa4, 0x24, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x1e, + 0x20, 0x09, 0xac, 0x8e, 0x21, 0x0c, 0x61, 0x36, 0x20, 0x09, 0xac, 0x8f, + 0x21, 0x0c, 0x61, 0x3a, 0x60, 0x0b, 0xff, 0xff, 0x69, 0x18, 0x61, 0x1a, + 0x60, 0x1f, 0x00, 0x04, 0x10, 0x78, 0x5d, 0x8a, 0x2d, 0x60, 0x10, 0x78, + 0x77, 0x2d, 0x0d, 0x7f, 0x00, 0x7c, 0x10, 0x78, 0x77, 0x2d, 0x00, 0x7c, + 0x0e, 0x7e, 0x60, 0x18, 0x20, 0x70, 0x70, 0x00, 0xd0, 0xec, 0x0e, 0x7f, + 0x00, 0x7c, 0x60, 0x10, 0xa0, 0x8c, 0xf0, 0x00, 0x00, 0x40, 0xa4, 0x81, + 0xa0, 0x80, 0x00, 0x13, 0x20, 0x0c, 0xd1, 0xec, 0x00, 0x40, 0xa4, 0x81, + 0x20, 0x01, 0xa7, 0x72, 0x20, 0x04, 0xd0, 0xec, 0x00, 0x40, 0xa4, 0x81, + 0x60, 0x03, 0x00, 0x02, 0x60, 0x24, 0xc0, 0xe5, 0x60, 0x26, 0xd1, 0xac, + 0x00, 0x40, 0xa4, 0x5f, 0x0f, 0x7e, 0x2c, 0x78, 0x10, 0x78, 0x49, 0x5f, + 0x0f, 0x7f, 0x00, 0x40, 0xa4, 0x5f, 0x20, 0x01, 0xa9, 0xa4, 0x20, 0x04, + 0x60, 0x3e, 0x20, 0x09, 0xa7, 0x72, 0x21, 0x0c, 0xd1, 0xf4, 0x00, 0xc0, + 0xa4, 0x7f, 0x00, 0x78, 0xa4, 0x71, 0x20, 0x09, 0xa7, 0x72, 0x21, 0x0c, + 0xd1, 0xf4, 0x00, 0x40, 0xa4, 0x6b, 0x60, 0x24, 0xc0, 0xe4, 0x60, 0x26, + 0xa0, 0x06, 0x00, 0x78, 0xa4, 0x81, 0x20, 0x01, 0xa9, 0xa4, 0x20, 0x0c, + 0x81, 0x03, 0xa1, 0x00, 0x60, 0x3e, 0x60, 0x18, 0xa0, 0x88, 0x00, 0x2b, + 0x21, 0x04, 0xa0, 0x05, 0x00, 0x40, 0xa4, 0x7c, 0xa0, 0x88, 0x00, 0x03, + 0x00, 0x78, 0xa4, 0x74, 0x2c, 0x0a, 0x60, 0x0f, 0x00, 0x00, 0xa0, 0x85, + 0x00, 0x01, 0x00, 0x7c, 0x01, 0x7e, 0x0c, 0x7e, 0x0e, 0x7e, 0x61, 0x20, + 0xa2, 0xf0, 0x00, 0x2b, 0x2e, 0x04, 0x20, 0x60, 0x8c, 0xff, 0x00, 0x40, + 0xa4, 0xa1, 0x84, 0xff, 0x00, 0xc0, 0xa4, 0x94, 0x60, 0x20, 0xa1, 0x06, + 0x00, 0xc0, 0xa4, 0x9c, 0x60, 0x0c, 0x20, 0x72, 0x10, 0x78, 0x5b, 0xc1, + 0x10, 0x78, 0x77, 0x2d, 0x00, 0x78, 0xa4, 0x9e, 0xac, 0xf0, 0x00, 0x03, + 0x2e, 0x64, 0x00, 0x78, 0xa4, 0x8a, 0x0e, 0x7f, 0x0c, 0x7f, 0x01, 0x7f, + 0x00, 0x7c, 0x0d, 0x7e, 0x60, 0x18, 0xa0, 0xe8, 0x00, 0x2b, 0x2d, 0x04, + 0xa0, 0x05, 0x00, 0x40, 0xa4, 0xb7, 0xac, 0x06, 0x00, 0x40, 0xa4, 0xb5, + 0x2d, 0x04, 0xa0, 0xe8, 0x00, 0x03, 0x00, 0x78, 0xa4, 0xa9, 0x60, 0x0c, + 0x20, 0x6a, 0x0d, 0x7f, 0x00, 0x7c, 0x02, 0x7e, 0x03, 0x7e, 0x15, 0x7e, + 0x20, 0x11, 0xa7, 0x26, 0x22, 0x04, 0xa0, 0x84, 0x00, 0xff, 0x20, 0x19, + 0xac, 0x8e, 0x23, 0x34, 0xa6, 0x36, 0x00, 0xc0, 0xa4, 0xe5, 0x83, 0x18, + 0x23, 0x34, 0x22, 0x04, 0xa0, 0x84, 0xff, 0x00, 0xa6, 0x36, 0x00, 0xc0, + 0xa4, 0xe5, 0x20, 0x11, 0xac, 0x90, 0x60, 0x18, 0xa0, 0x98, 0x00, 0x0a, + 0x20, 0xa9, 0x00, 0x04, 0x10, 0x78, 0x80, 0xde, 0x00, 0xc0, 0xa4, 0xe5, + 0x20, 0x11, 0xac, 0x94, 0x60, 0x18, 0xa0, 0x98, 0x00, 0x06, 0x20, 0xa9, + 0x00, 0x04, 0x10, 0x78, 0x80, 0xde, 0x00, 0xc0, 0xa4, 0xe5, 0x15, 0x7f, + 0x03, 0x7f, 0x02, 0x7f, 0x00, 0x7c, 0x0e, 0x7e, 0x20, 0x71, 0xa7, 0x00, + 0x10, 0x78, 0x42, 0xb8, 0x10, 0x78, 0x26, 0x77, 0x0e, 0x7f, 0x00, 0x7c, + 0x0e, 0x7e, 0x60, 0x18, 0x20, 0x70, 0x70, 0x00, 0xd0, 0xfc, 0x00, 0x40, + 0xa4, 0xfb, 0x10, 0x78, 0xa4, 0xfd, 0x0e, 0x7f, 0x00, 0x7c, 0x68, 0x50, + 0xc0, 0xe5, 0x68, 0x52, 0x00, 0x7c, 0x0e, 0x7e, 0x0c, 0x7e, 0x07, 0x7e, + 0x06, 0x7e, 0x05, 0x7e, 0x04, 0x7e, 0x02, 0x7e, 0x01, 0x7e, 0x12, 0x7e, + 0x20, 0x91, 0x80, 0x00, 0x20, 0x29, 0xa9, 0xba, 0x25, 0x2c, 0x20, 0x21, + 0xa9, 0xc0, 0x24, 0x24, 0x20, 0x61, 0xae, 0x00, 0x20, 0x71, 0xa7, 0x00, + 0x76, 0x48, 0x70, 0x64, 0xa6, 0x06, 0x00, 0x40, 0xa5, 0x55, 0x67, 0x1c, + 0xa7, 0x86, 0x00, 0x01, 0x00, 0x40, 0xa5, 0x24, 0xa7, 0x86, 0x00, 0x08, + 0x00, 0xc0, 0xa5, 0x4b, 0x25, 0x00, 0xac, 0x06, 0x00, 0x40, 0xa5, 0x4b, + 0x24, 0x00, 0xac, 0x06, 0x00, 0x40, 0xa5, 0x4b, 0x10, 0x78, 0xa2, 0x52, + 0x00, 0x40, 0xa5, 0x4b, 0x10, 0x78, 0xa2, 0x66, 0x00, 0xc0, 0xa5, 0x4b, + 0x60, 0x00, 0xa0, 0x86, 0x00, 0x04, 0x00, 0xc0, 0xa5, 0x3d, 0x01, 0x7e, + 0x10, 0x78, 0x17, 0x57, 0x01, 0x7f, 0x10, 0x78, 0x8e, 0xfc, 0x00, 0xc0, + 0xa5, 0x43, 0x10, 0x78, 0x28, 0xa6, 0x10, 0x78, 0x8f, 0x10, 0x00, 0xc0, + 0xa5, 0x49, 0x10, 0x78, 0x7c, 0x83, 0x10, 0x78, 0x8e, 0xd6, 0xac, 0xe0, + 0x00, 0x10, 0x20, 0x01, 0xa7, 0x16, 0x20, 0x04, 0xac, 0x02, 0x00, 0xc8, + 0xa5, 0x55, 0x00, 0x78, 0xa5, 0x14, 0x12, 0x7f, 0x01, 0x7f, 0x02, 0x7f, + 0x04, 0x7f, 0x05, 0x7f, 0x06, 0x7f, 0x07, 0x7f, 0x0c, 0x7f, 0x0e, 0x7f, + 0x00, 0x7c, 0x12, 0x7e, 0x00, 0x7e, 0x0e, 0x7e, 0x01, 0x7e, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x71, 0xa7, 0x40, 0xd5, 0xa4, 0x00, 0x40, 0xa5, 0x6d, + 0x70, 0x34, 0x80, 0x00, 0x70, 0x36, 0xd5, 0xb4, 0x00, 0x40, 0xa5, 0x73, + 0x70, 0x30, 0x80, 0x00, 0x70, 0x32, 0xd5, 0xac, 0x00, 0x40, 0xa5, 0x89, + 0x25, 0x00, 0xa0, 0x84, 0x00, 0x07, 0xa0, 0x8e, 0x00, 0x03, 0x00, 0x40, + 0xa5, 0x89, 0xa0, 0x8e, 0x00, 0x04, 0x00, 0x40, 0xa5, 0x89, 0xa0, 0x8e, + 0x00, 0x05, 0x00, 0x40, 0xa5, 0x89, 0x20, 0x71, 0xa7, 0x4a, 0x10, 0x78, + 0xa5, 0xca, 0x01, 0x7f, 0x0e, 0x7f, 0x00, 0x7f, 0x12, 0x7f, 0x00, 0x7c, + 0x12, 0x7e, 0x00, 0x7e, 0x0e, 0x7e, 0x01, 0x7e, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x71, 0xa7, 0x40, 0xd5, 0xa4, 0x00, 0x40, 0xa5, 0x9c, 0x70, 0x34, + 0x80, 0x00, 0x70, 0x36, 0xd5, 0xb4, 0x00, 0x40, 0xa5, 0xa2, 0x70, 0x30, + 0x80, 0x00, 0x70, 0x32, 0xd5, 0xac, 0x00, 0x40, 0xa5, 0xb8, 0x25, 0x00, + 0xa0, 0x84, 0x00, 0x07, 0xa0, 0x8e, 0x00, 0x03, 0x00, 0x40, 0xa5, 0xb8, + 0xa0, 0x8e, 0x00, 0x04, 0x00, 0x40, 0xa5, 0xb8, 0xa0, 0x8e, 0x00, 0x05, + 0x00, 0x40, 0xa5, 0xb8, 0x20, 0x71, 0xa7, 0x4a, 0x10, 0x78, 0xa5, 0xca, + 0x01, 0x7f, 0x0e, 0x7f, 0x00, 0x7f, 0x12, 0x7f, 0x00, 0x7c, 0x12, 0x7e, + 0x00, 0x7e, 0x0e, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0xa7, 0x42, + 0x10, 0x78, 0xa5, 0xca, 0x0e, 0x7f, 0x00, 0x7f, 0x12, 0x7f, 0x00, 0x7c, + 0x2e, 0x04, 0x80, 0x00, 0x20, 0x72, 0x00, 0xc8, 0xa5, 0xd3, 0x8e, 0x70, + 0x2e, 0x04, 0x80, 0x00, 0x20, 0x72, 0x00, 0x7c, 0x0e, 0x7e, 0x20, 0x71, + 0xa7, 0x40, 0x10, 0x78, 0xa5, 0xca, 0x0e, 0x7f, 0x00, 0x7c, 0x0e, 0x7e, + 0x20, 0x71, 0xa7, 0x44, 0x10, 0x78, 0xa5, 0xca, 0x0e, 0x7f, 0x00, 0x7c, + 0x12, 0x7e, 0x00, 0x7e, 0x0e, 0x7e, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, + 0xa7, 0x40, 0x70, 0x44, 0x80, 0x00, 0x70, 0x46, 0x0e, 0x7f, 0x00, 0x7f, + 0x12, 0x7f, 0x00, 0x7c, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, + 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, + 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00, + 0x48, 0x11 }; -#ifdef UNIQUE_FW_NAME -unsigned short fw2100tp_length01 = 0x9601; -#else -unsigned short risc_code_length01 = 0x9601; -#endif +struct firmware ql2100_fw = { + .size = sizeof(ql2100_fw_bin), + .data = ql2100_fw_bin +}; diff --git a/drivers/scsi/qla2xxx/ql2200.c b/drivers/scsi/qla2xxx/ql2200.c deleted file mode 100644 index 0eef72dc8..000000000 --- a/drivers/scsi/qla2xxx/ql2200.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * QLogic Fibre Channel HBA Driver - * Copyright (C) 2003 Christoph Hellwig. - * Copyright (c) 2003-2005 QLogic Corporation - * - * See LICENSE.qla2xxx for copyright and licensing details. - */ -#include -#include -#include - -#include "qla_def.h" - -static char qla_driver_name[] = "qla2200"; - -extern unsigned char fw2200tp_version[]; -extern unsigned char fw2200tp_version_str[]; -extern unsigned short fw2200tp_addr01; -extern unsigned short fw2200tp_code01[]; -extern unsigned short fw2200tp_length01; - -static struct qla_fw_info qla_fw_tbl[] = { - { - .addressing = FW_INFO_ADDR_NORMAL, - .fwcode = &fw2200tp_code01[0], - .fwlen = &fw2200tp_length01, - .fwstart = &fw2200tp_addr01, - }, - - { FW_INFO_ADDR_NOMORE, }, -}; - -static struct qla_board_info qla_board_tbl = { - .drv_name = qla_driver_name, - - .isp_name = "ISP2200", - .fw_info = qla_fw_tbl, -}; - -static struct pci_device_id qla2200_pci_tbl[] = { - { - .vendor = PCI_VENDOR_ID_QLOGIC, - .device = PCI_DEVICE_ID_QLOGIC_ISP2200, - .subvendor = PCI_ANY_ID, - .subdevice = PCI_ANY_ID, - .driver_data = (unsigned long)&qla_board_tbl, - }, - - {0, 0}, -}; -MODULE_DEVICE_TABLE(pci, qla2200_pci_tbl); - -static int __devinit -qla2200_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 -qla2200_remove_one(struct pci_dev *pdev) -{ - qla2x00_remove_one(pdev); -} - -static struct pci_driver qla2200_pci_driver = { - .name = "qla2200", - .id_table = qla2200_pci_tbl, - .probe = qla2200_probe_one, - .remove = __devexit_p(qla2200_remove_one), -}; - -static int __init -qla2200_init(void) -{ - return pci_module_init(&qla2200_pci_driver); -} - -static void __exit -qla2200_exit(void) -{ - pci_unregister_driver(&qla2200_pci_driver); -} - -module_init(qla2200_init); -module_exit(qla2200_exit); - -MODULE_AUTHOR("QLogic Corporation"); -MODULE_DESCRIPTION("QLogic ISP22xx FC-SCSI Host Bus Adapter driver"); -MODULE_LICENSE("GPL"); -MODULE_VERSION(QLA2XXX_VERSION); diff --git a/drivers/scsi/qla2xxx/ql2200_fw.c b/drivers/scsi/qla2xxx/ql2200_fw.c index ac07e18ab..883563b8a 100644 --- a/drivers/scsi/qla2xxx/ql2200_fw.c +++ b/drivers/scsi/qla2xxx/ql2200_fw.c @@ -1,5333 +1,7066 @@ /* - * QLogic Fibre Channel HBA Driver - * Copyright (c) 2003-2005 QLogic Corporation + * Firmware version 2.02.08 from + * + * ftp://ftp.qlogic.com/outgoing/linux/firmware/ql2200_fw.bin + * + * xxd -g 1 -i ql2200_fw.bin | indent -l80 -i8 -o ql2200_fw.c * - * See LICENSE.qla2xxx for copyright and licensing details. - */ - -/* - * Firmware Version 2.02.08 (17:06 Mar 22, 2005) */ -#ifdef UNIQUE_FW_NAME -unsigned short fw2200tp_version = 2*1024+2; -#else -unsigned short risc_code_version = 2*1024+2; -#endif +#include -#ifdef UNIQUE_FW_NAME -unsigned char fw2200tp_version_str[] = {2,2,8}; -#else -unsigned char firmware_version[] = {2,2,8}; -#endif - -#ifdef UNIQUE_FW_NAME -#define fw2200tp_VERSION_STRING "2.02.08" -#else -#define FW_VERSION_STRING "2.02.08" -#endif - -#ifdef UNIQUE_FW_NAME -unsigned short fw2200tp_addr01 = 0x1000 ; -#else -unsigned short risc_code_addr01 = 0x1000 ; -#endif - -#ifdef UNIQUE_FW_NAME -unsigned short fw2200tp_code01[] = { -#else -unsigned short risc_code01[] = { -#endif - 0x0470, 0x0000, 0x0000, 0xa52b, 0x0000, 0x0002, 0x0002, 0x0008, - 0x0017, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2032, 0x3030, - 0x3120, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241, - 0x5449, 0x4f4e, 0x2049, 0x5350, 0x3232, 0x3030, 0x2046, 0x6972, - 0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, - 0x322e, 0x3032, 0x2e30, 0x3820, 0x2020, 0x2020, 0x2400, 0x20c1, - 0x0005, 0x2001, 0x017f, 0x2003, 0x0000, 0x20c9, 0xbbff, 0x2091, - 0x2000, 0x2059, 0x0000, 0x2b78, 0x7823, 0x0004, 0x2089, 0x299f, - 0x2051, 0xb600, 0x2a70, 0x2029, 0xee00, 0x2031, 0xffff, 0x2039, - 0xede9, 0x2021, 0x0200, 0x0804, 0x146d, 0x20a1, 0xb52b, 0xa00e, - 0x20a9, 0x08d5, 0x41a4, 0x3400, 0x7562, 0x7666, 0x775e, 0x746a, - 0x746e, 0x20a1, 0xbe00, 0x7164, 0x810d, 0x810d, 0x810d, 0x810d, - 0xa18c, 0x000f, 0x2001, 0x000b, 0xa112, 0xa00e, 0x21a8, 0x41a4, - 0x3400, 0x8211, 0x1dd8, 0x7164, 0x3400, 0xa102, 0x0120, 0x0218, - 0x20a8, 0xa00e, 0x41a4, 0x3800, 0xd08c, 0x01d8, 0x2009, 0xb600, - 0x810d, 0x810d, 0x810d, 0x810d, 0xa18c, 0x000f, 0x2001, 0x0001, - 0xa112, 0x20a1, 0x1000, 0xa00e, 0x21a8, 0x41a4, 0x8211, 0x1de0, - 0x2009, 0xb600, 0x3400, 0xa102, 0x0120, 0x0218, 0x20a8, 0xa00e, - 0x41a4, 0x080c, 0x1416, 0x080c, 0x1637, 0x080c, 0x17d4, 0x080c, - 0x1fbe, 0x080c, 0x4c72, 0x080c, 0x8646, 0x080c, 0x15c0, 0x080c, - 0x2ef9, 0x080c, 0x5dfc, 0x080c, 0x53b3, 0x080c, 0x6940, 0x080c, - 0x2545, 0x080c, 0x6bd3, 0x080c, 0x642d, 0x080c, 0x23ff, 0x080c, - 0x2513, 0x2091, 0x3009, 0x7823, 0x0000, 0x1004, 0x10c5, 0x7820, - 0xa086, 0x0002, 0x1150, 0x7823, 0x4000, 0x0e04, 0x10bd, 0x781b, - 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2a70, 0x7003, 0x0000, - 0x2a70, 0x7000, 0xa08e, 0x0003, 0x1158, 0x080c, 0x3f4f, 0x080c, - 0x2f20, 0x080c, 0x5e4a, 0x080c, 0x5562, 0x080c, 0x696b, 0x0c80, - 0x000b, 0x0c98, 0x10e4, 0x10e5, 0x1215, 0x10e2, 0x12e2, 0x1413, - 0x1414, 0x1415, 0x080c, 0x151a, 0x0005, 0x0126, 0x00f6, 0x2091, - 0x8000, 0x7000, 0xa086, 0x0001, 0x1904, 0x11f2, 0x080c, 0x158d, - 0x080c, 0x5b41, 0x0150, 0x080c, 0x5b67, 0x15c0, 0x2079, 0x0100, - 0x7828, 0xa085, 0x1800, 0x782a, 0x0488, 0x080c, 0x5a79, 0x7000, - 0xa086, 0x0001, 0x1904, 0x11f2, 0x708c, 0xa086, 0x0028, 0x1904, - 0x11f2, 0x2001, 0x0161, 0x2003, 0x0001, 0x2079, 0x0100, 0x7827, - 0xffff, 0x7a28, 0xa295, 0x1e2f, 0x7a2a, 0x2011, 0x5a14, 0x080c, - 0x6a0e, 0x2011, 0x5a07, 0x080c, 0x6ace, 0x2011, 0x5a56, 0x080c, - 0x6a0e, 0x2011, 0x4b23, 0x080c, 0x6a0e, 0x2011, 0x8030, 0x2019, - 0x0000, 0x708b, 0x0000, 0x080c, 0x1e05, 0x00e8, 0x080c, 0x44d6, - 0x2079, 0x0100, 0x7844, 0xa005, 0x1904, 0x11f2, 0x2011, 0x4b23, - 0x080c, 0x6a0e, 0x2011, 0x5a56, 0x080c, 0x6a0e, 0x080c, 0x1e05, - 0x2001, 0xb88d, 0x2004, 0x780e, 0x7840, 0xa084, 0xfffb, 0x7842, - 0x2011, 0x8010, 0x73cc, 0x080c, 0x3f13, 0x723c, 0xc284, 0x723e, - 0x2001, 0xb60c, 0x200c, 0xc1ac, 0x2102, 0x080c, 0x7fbc, 0x2011, - 0x0004, 0x080c, 0x9d1c, 0x080c, 0x52bf, 0x080c, 0x5b41, 0x0158, - 0x080c, 0x4c4a, 0x0140, 0x708b, 0x0001, 0x70c7, 0x0000, 0x080c, - 0x4673, 0x0804, 0x11f2, 0x080c, 0x537b, 0x0120, 0x7a0c, 0xc2b4, - 0x7a0e, 0x0060, 0x7073, 0x0000, 0x080c, 0xa0c4, 0x70d4, 0xd09c, - 0x1128, 0x70a0, 0xa005, 0x0110, 0x080c, 0x4c28, 0x70df, 0x0000, - 0x70db, 0x0000, 0x72d4, 0x080c, 0x5b41, 0x1180, 0x2011, 0x0000, - 0x0016, 0x080c, 0x2920, 0x2019, 0xb88f, 0x211a, 0x001e, 0x7053, - 0xffff, 0x7057, 0x00ef, 0x7077, 0x0000, 0x0020, 0x2019, 0xb88f, - 0x201b, 0x0000, 0x2079, 0xb652, 0x7804, 0xd0ac, 0x0108, 0xc295, - 0x72d6, 0x080c, 0x5b41, 0x0118, 0xa296, 0x0004, 0x0548, 0x2011, - 0x0001, 0x080c, 0x9d1c, 0x709b, 0x0000, 0x709f, 0xffff, 0x7003, - 0x0002, 0x2079, 0x0100, 0x7827, 0x0003, 0x7828, 0xa085, 0x0003, - 0x782a, 0x00fe, 0x080c, 0x2aed, 0x2011, 0x0005, 0x080c, 0x80fc, - 0x080c, 0x71e5, 0x080c, 0x5b41, 0x0148, 0x00c6, 0x2061, 0x0100, - 0x0016, 0x080c, 0x2920, 0x61e2, 0x001e, 0x00ce, 0x012e, 0x0420, - 0x709b, 0x0000, 0x709f, 0xffff, 0x7003, 0x0002, 0x00f6, 0x2079, - 0x0100, 0x7827, 0x0003, 0x7828, 0xa085, 0x0003, 0x782a, 0x00fe, - 0x2011, 0x0005, 0x080c, 0x80fc, 0x080c, 0x71e5, 0x080c, 0x5b41, - 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, 0x080c, 0x2920, 0x61e2, - 0x001e, 0x00ce, 0x00fe, 0x012e, 0x0005, 0x00c6, 0x080c, 0x5b41, - 0x1118, 0x20a9, 0x0100, 0x0010, 0x20a9, 0x0082, 0x080c, 0x5b41, - 0x1118, 0x2009, 0x0000, 0x0010, 0x2009, 0x007e, 0x080c, 0x2dcc, - 0x8108, 0x1f04, 0x1206, 0x00ce, 0x7073, 0x0000, 0x7074, 0xa084, - 0x00ff, 0x7076, 0x70a3, 0x0000, 0x0005, 0x0126, 0x2091, 0x8000, - 0x7000, 0xa086, 0x0002, 0x1904, 0x12e0, 0x709c, 0xa086, 0xffff, - 0x0130, 0x080c, 0x2aed, 0x080c, 0x71e5, 0x0804, 0x12e0, 0x70d4, - 0xd0ac, 0x1110, 0xd09c, 0x0540, 0xd084, 0x0530, 0x0006, 0x0016, - 0x2001, 0x0103, 0x2009, 0xb88d, 0x210c, 0x2102, 0x001e, 0x000e, - 0xd08c, 0x01d0, 0x70d8, 0xa086, 0xffff, 0x0190, 0x080c, 0x2c4c, - 0x080c, 0x71e5, 0x70d4, 0xd094, 0x1904, 0x12e0, 0x2011, 0x0001, - 0x2019, 0x0000, 0x080c, 0x2c84, 0x080c, 0x71e5, 0x0804, 0x12e0, - 0x70dc, 0xa005, 0x1904, 0x12e0, 0x7098, 0xa005, 0x1904, 0x12e0, - 0x70d4, 0xd0a4, 0x0118, 0xd0b4, 0x0904, 0x12e0, 0x080c, 0x537b, - 0x1904, 0x12e0, 0x2001, 0xb653, 0x2004, 0xd0ac, 0x01c8, 0x0156, - 0x00c6, 0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, 0x080c, 0x501b, - 0x1118, 0x6000, 0xd0ec, 0x1138, 0x001e, 0x8108, 0x1f04, 0x126d, - 0x00ce, 0x015e, 0x0028, 0x001e, 0x00ce, 0x015e, 0x0804, 0x12e0, - 0x0006, 0x0016, 0x2001, 0x0103, 0x2009, 0xb88d, 0x210c, 0x2102, - 0x001e, 0x000e, 0x71a8, 0x81ff, 0x11b0, 0xa006, 0x2009, 0x0200, - 0x20a9, 0x0002, 0x20a1, 0xb8df, 0x40a1, 0x2009, 0x0700, 0x20a9, - 0x0002, 0x20a1, 0xb8cf, 0x40a1, 0x7070, 0x8007, 0x7174, 0x810f, - 0x20a9, 0x0002, 0x40a1, 0x20a1, 0xb8d3, 0x2009, 0x0000, 0x080c, - 0x1500, 0x2001, 0x0000, 0x810f, 0x20a9, 0x0002, 0x40a1, 0x7030, - 0xc08c, 0x7032, 0x7003, 0x0003, 0x709f, 0xffff, 0x080c, 0x1586, - 0xa006, 0x080c, 0x27f8, 0x080c, 0x3f85, 0x00f6, 0x2079, 0x0100, - 0x080c, 0x5b67, 0x0150, 0x080c, 0x5b41, 0x7828, 0x0118, 0xa084, - 0xe1ff, 0x0010, 0xa084, 0xffdf, 0x782a, 0x00fe, 0x2001, 0xb8e2, - 0x2004, 0xa086, 0x0005, 0x1120, 0x2011, 0x0000, 0x080c, 0x80fc, - 0x2011, 0x0000, 0x080c, 0x8106, 0x080c, 0x71e5, 0x080c, 0x72a2, - 0x012e, 0x0005, 0x0016, 0x0046, 0x00f6, 0x0126, 0x2091, 0x8000, - 0x2079, 0x0100, 0x2009, 0xb634, 0x2104, 0xa005, 0x1110, 0x080c, - 0x294c, 0x2009, 0x00f7, 0x080c, 0x4c11, 0x7940, 0xa18c, 0x0010, - 0x7942, 0x7924, 0xd1b4, 0x0110, 0x7827, 0x0040, 0xd19c, 0x0110, - 0x7827, 0x0008, 0x0006, 0x0036, 0x0156, 0x7954, 0xd1ac, 0x1904, - 0x1350, 0x080c, 0x5b53, 0x0158, 0x080c, 0x5b67, 0x1128, 0x2001, - 0xb89e, 0x2003, 0x0000, 0x0070, 0x080c, 0x5b49, 0x0dc0, 0x2001, - 0xb89e, 0x2003, 0xaaaa, 0x2001, 0xb89f, 0x2003, 0x0001, 0x080c, - 0x5a79, 0x0058, 0x080c, 0x5b41, 0x0140, 0x2009, 0x00f8, 0x080c, - 0x4c11, 0x7843, 0x0090, 0x7843, 0x0010, 0x20a9, 0x09c4, 0x7820, - 0xd09c, 0x1138, 0x080c, 0x5b41, 0x0138, 0x7824, 0xd0ac, 0x1904, - 0x13fa, 0x1f04, 0x132f, 0x0070, 0x7824, 0x080c, 0x5b5d, 0x0118, - 0xd0ac, 0x1904, 0x13fa, 0xa084, 0x1800, 0x0d98, 0x7003, 0x0001, - 0x0804, 0x13fa, 0x2001, 0x0001, 0x080c, 0x27f8, 0x0804, 0x1409, - 0x7850, 0xa084, 0x0180, 0x7852, 0x782f, 0x0020, 0x20a9, 0x0046, - 0x1d04, 0x1358, 0x080c, 0x6ab6, 0x1f04, 0x1358, 0x7850, 0xa084, - 0x0180, 0xa085, 0x0400, 0x7852, 0x782f, 0x0000, 0x080c, 0x5b53, - 0x0158, 0x080c, 0x5b67, 0x1128, 0x2001, 0xb89e, 0x2003, 0x0000, - 0x0070, 0x080c, 0x5b49, 0x0dc0, 0x2001, 0xb89e, 0x2003, 0xaaaa, - 0x2001, 0xb89f, 0x2003, 0x0001, 0x080c, 0x5a79, 0x0020, 0x2009, - 0x00f8, 0x080c, 0x4c11, 0x20a9, 0x000e, 0xe000, 0x1f04, 0x1385, - 0x7850, 0xa084, 0x0180, 0xa085, 0x1400, 0x7852, 0x080c, 0x5b41, - 0x0120, 0x7843, 0x0090, 0x7843, 0x0010, 0x2021, 0xe678, 0x2019, - 0xea60, 0x7820, 0xd09c, 0x1558, 0x080c, 0x5b41, 0x05d8, 0x7824, - 0xd0ac, 0x1904, 0x13fa, 0x080c, 0x5b67, 0x1508, 0x0046, 0x2021, - 0x0190, 0x8421, 0x1df0, 0x004e, 0x8421, 0x11c8, 0x7827, 0x0048, - 0x20a9, 0x01f4, 0x1d04, 0x13b2, 0x080c, 0x6ab6, 0x1f04, 0x13b2, - 0x7824, 0xa084, 0x0068, 0x15c8, 0x2001, 0xb89e, 0x2003, 0xaaaa, - 0x2001, 0xb89f, 0x2003, 0x0001, 0x7003, 0x0001, 0x0498, 0x1d04, - 0x13cb, 0x080c, 0x6ab6, 0x8319, 0x1960, 0x2009, 0xb634, 0x2104, - 0x8000, 0x200a, 0xa084, 0xfff0, 0x0120, 0x200b, 0x0000, 0x080c, - 0x294c, 0x00d8, 0x080c, 0x5b53, 0x1140, 0xa4a2, 0x0064, 0x1128, - 0x080c, 0x5b18, 0x7003, 0x0001, 0x00a8, 0x7827, 0x1800, 0xe000, - 0xe000, 0x7824, 0x080c, 0x5b5d, 0x0110, 0xd0ac, 0x1158, 0xa084, - 0x1800, 0x09a8, 0x7003, 0x0001, 0x0028, 0x2001, 0x0001, 0x080c, - 0x27f8, 0x0048, 0x2001, 0xb634, 0x2003, 0x0000, 0x7827, 0x0048, - 0x7828, 0xc09d, 0x782a, 0x7850, 0xa084, 0x0180, 0xa085, 0x0400, - 0x7852, 0x015e, 0x003e, 0x000e, 0x080c, 0x155d, 0x012e, 0x00fe, - 0x004e, 0x001e, 0x0005, 0x0005, 0x0005, 0x0005, 0x2a70, 0x2061, - 0xb8c2, 0x2063, 0x0002, 0x6007, 0x0002, 0x600b, 0x0008, 0x600f, - 0x0017, 0x2001, 0xb89e, 0x2003, 0x0000, 0x708b, 0x0000, 0x2009, - 0x0100, 0x2104, 0xa082, 0x0002, 0x0218, 0x7053, 0xffff, 0x0010, - 0x7053, 0x0000, 0x705b, 0xffff, 0x7073, 0x0000, 0x7077, 0x0000, - 0x080c, 0xa0c4, 0x2061, 0xb88e, 0x6003, 0x0909, 0x6007, 0x0000, - 0x600b, 0x8800, 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x000f, - 0x601b, 0x0000, 0x601f, 0x07d0, 0x2061, 0xb896, 0x6003, 0x8000, - 0x6007, 0x0000, 0x600b, 0x0000, 0x600f, 0x0200, 0x6013, 0x00ff, - 0x6017, 0x0000, 0x601b, 0x0001, 0x601f, 0x0000, 0x2061, 0xb8b9, - 0x6003, 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f, 0x2020, - 0x2001, 0xb628, 0x2003, 0x0000, 0x0005, 0x04a0, 0x2011, 0x0000, - 0x81ff, 0x0570, 0xa186, 0x0001, 0x1148, 0x2031, 0x8fff, 0x2039, - 0xd601, 0x2021, 0x0100, 0x2029, 0xd600, 0x00e8, 0xa186, 0x0002, - 0x1118, 0x2011, 0x0000, 0x00b8, 0xa186, 0x0005, 0x1118, 0x2011, - 0x0001, 0x0088, 0xa186, 0x0009, 0x1118, 0x2011, 0x0002, 0x0058, - 0xa186, 0x000a, 0x1118, 0x2011, 0x0002, 0x0028, 0xa186, 0x0055, - 0x1110, 0x2011, 0x0003, 0x3800, 0xa084, 0xfffc, 0xa205, 0x20c0, - 0x0804, 0x104d, 0xa00e, 0x2011, 0x0003, 0x2019, 0x14a9, 0x0804, - 0x14fa, 0x2019, 0xaaaa, 0x2061, 0xffff, 0x2c14, 0x2362, 0xe000, - 0xe000, 0x2c04, 0xa306, 0x2262, 0x1110, 0xc1b5, 0xc1a5, 0x2011, - 0x0000, 0x2019, 0x14bc, 0x04f0, 0x2019, 0xaaaa, 0x2061, 0xffff, - 0x2c14, 0x2362, 0xe000, 0xe000, 0x2c1c, 0x2061, 0x7fff, 0xe000, - 0xe000, 0x2c04, 0x2061, 0xffff, 0x2262, 0xa306, 0x0110, 0xc18d, - 0x0008, 0xc185, 0x2011, 0x0002, 0x2019, 0x14d7, 0x0418, 0x2061, - 0xffff, 0x2019, 0xaaaa, 0x2c14, 0x2362, 0xe000, 0xe000, 0x2c04, - 0x2262, 0xa306, 0x1180, 0x2c14, 0x2362, 0xe000, 0xe000, 0x2c1c, - 0x2061, 0x7fff, 0x2c04, 0x2061, 0xffff, 0x2262, 0xa306, 0x1110, - 0xc195, 0x0008, 0xc19d, 0x2011, 0x0001, 0x2019, 0x14f8, 0x0010, - 0x0804, 0x146e, 0x3800, 0xa084, 0xfffc, 0xa205, 0x20c0, 0x0837, - 0x2011, 0x0000, 0x080c, 0x501b, 0x1178, 0x6004, 0xa0c4, 0x00ff, - 0xa8c6, 0x0006, 0x0128, 0xa0c4, 0xff00, 0xa8c6, 0x0600, 0x1120, - 0xa186, 0x0080, 0x0108, 0x8210, 0x8108, 0xa186, 0x0100, 0x1d50, - 0x2208, 0x0005, 0x2091, 0x8000, 0x0e04, 0x151c, 0x0006, 0x0016, - 0x2079, 0x0000, 0x7818, 0xd084, 0x1de8, 0x001e, 0x792e, 0x000e, - 0x782a, 0x000e, 0x7826, 0x3900, 0x783a, 0x7823, 0x8002, 0x781b, - 0x0001, 0x2091, 0x5000, 0x0126, 0x0156, 0x0146, 0x20a9, 0x0010, - 0x20a1, 0xba0d, 0x2091, 0x2000, 0x40a1, 0x20a9, 0x0010, 0x2091, - 0x2200, 0x40a1, 0x20a9, 0x0010, 0x2091, 0x2400, 0x40a1, 0x20a9, - 0x0010, 0x2091, 0x2600, 0x40a1, 0x20a9, 0x0010, 0x2091, 0x2800, - 0x40a1, 0x014e, 0x015e, 0x012e, 0x2079, 0xb600, 0x7803, 0x0005, - 0x2091, 0x4080, 0x04c9, 0x0cf8, 0x0005, 0x0006, 0x080c, 0x15a8, - 0x1518, 0x00f6, 0x2079, 0xb624, 0x2f04, 0x8000, 0x207a, 0xa082, - 0x000f, 0x0258, 0xa006, 0x207a, 0x2079, 0xb626, 0x2f04, 0xa084, - 0x0001, 0xa086, 0x0001, 0x207a, 0x0070, 0x2079, 0xb626, 0x2f7c, - 0x8fff, 0x1128, 0x2001, 0x0c03, 0x2003, 0x0040, 0x0020, 0x2001, - 0x0c03, 0x2003, 0x00c0, 0x00fe, 0x000e, 0x0005, 0x0409, 0x1120, - 0x2001, 0x0c03, 0x2003, 0x0080, 0x0005, 0x00d1, 0x1120, 0x2001, - 0x0c03, 0x2003, 0x0040, 0x0005, 0x0006, 0x0091, 0x1178, 0x2001, - 0x0c03, 0x2003, 0x0040, 0x2009, 0x0fff, 0x00a1, 0x2001, 0x0c03, - 0x2003, 0x0080, 0x2009, 0x0fff, 0x0069, 0x0c88, 0x000e, 0x0005, - 0x00c6, 0x2061, 0x0c00, 0x2c04, 0xa084, 0x00ff, 0xa086, 0x00aa, - 0x00ce, 0x0005, 0x0156, 0x0126, 0xa18c, 0x0fff, 0x21a8, 0x1d04, - 0x15b7, 0x2091, 0x6000, 0x1f04, 0x15b7, 0x012e, 0x015e, 0x0005, - 0x2071, 0xb600, 0x7160, 0x712e, 0x2021, 0x0001, 0xa190, 0x0030, - 0xa298, 0x0030, 0x0240, 0x7064, 0xa302, 0x1228, 0x220a, 0x2208, - 0x2310, 0x8420, 0x0ca8, 0x3800, 0xd08c, 0x0148, 0x7064, 0xa086, - 0xb600, 0x0128, 0x7067, 0xb600, 0x2011, 0x1000, 0x0c48, 0x200b, - 0x0000, 0x74b2, 0x74b6, 0x0005, 0x00e6, 0x0126, 0x2091, 0x8000, - 0x2071, 0xb600, 0x70b4, 0xa0ea, 0x0010, 0x0268, 0x8001, 0x70b6, - 0x702c, 0x2068, 0x2d04, 0x702e, 0x206b, 0x0000, 0x6807, 0x0000, - 0x012e, 0x00ee, 0x0005, 0xa06e, 0x0cd8, 0x00e6, 0x2071, 0xb600, - 0x0126, 0x2091, 0x8000, 0x70b4, 0x8001, 0x0260, 0x70b6, 0x702c, - 0x2068, 0x2d04, 0x702e, 0x206b, 0x0000, 0x6807, 0x0000, 0x012e, - 0x00ee, 0x0005, 0xa06e, 0x0cd8, 0x00e6, 0x0126, 0x2091, 0x8000, - 0x2071, 0xb600, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70b4, 0x8000, - 0x70b6, 0x012e, 0x00ee, 0x0005, 0x8dff, 0x0138, 0x6804, 0x6807, - 0x0000, 0x0006, 0x0c49, 0x00de, 0x0cb8, 0x0005, 0x00e6, 0x2071, - 0xb600, 0x70b4, 0xa08a, 0x0010, 0xa00d, 0x00ee, 0x0005, 0x00e6, - 0x2071, 0xb913, 0x7007, 0x0000, 0x701b, 0x0000, 0x701f, 0x0000, - 0x2071, 0x0000, 0x7010, 0xa085, 0x8004, 0x7012, 0x00ee, 0x0005, - 0x0126, 0x2091, 0x8000, 0x00e6, 0x2270, 0x700b, 0x0000, 0x2071, - 0xb913, 0x7018, 0xa088, 0xb91c, 0x220a, 0x8000, 0xa084, 0x0007, - 0x701a, 0x7004, 0xa005, 0x1128, 0x00f6, 0x2079, 0x0010, 0x0089, - 0x00fe, 0x00ee, 0x012e, 0x0005, 0x00e6, 0x2071, 0xb913, 0x7004, - 0xa005, 0x1128, 0x00f6, 0x2079, 0x0010, 0x0019, 0x00fe, 0x00ee, - 0x0005, 0x7000, 0x0002, 0x1677, 0x16db, 0x16f8, 0x16f8, 0x7018, - 0x711c, 0xa106, 0x1118, 0x7007, 0x0000, 0x0005, 0x00d6, 0xa180, - 0xb91c, 0x2004, 0x700a, 0x2068, 0x8108, 0xa18c, 0x0007, 0x711e, - 0x7803, 0x0026, 0x6824, 0x7832, 0x6828, 0x7836, 0x682c, 0x783a, - 0x6830, 0x783e, 0x6810, 0x700e, 0x680c, 0x7016, 0x6804, 0x00de, - 0xd084, 0x0120, 0x7007, 0x0001, 0x0029, 0x0005, 0x7007, 0x0002, - 0x00b1, 0x0005, 0x0016, 0x0026, 0x710c, 0x2011, 0x0040, 0xa182, - 0x0040, 0x1210, 0x2110, 0xa006, 0x700e, 0x7212, 0x8203, 0x7822, - 0x7803, 0x0020, 0x7803, 0x0041, 0x002e, 0x001e, 0x0005, 0x0016, - 0x0026, 0x0136, 0x0146, 0x0156, 0x7014, 0x2098, 0x20a1, 0x0014, - 0x7803, 0x0026, 0x710c, 0x2011, 0x0040, 0xa182, 0x0040, 0x1210, - 0x2110, 0xa006, 0x700e, 0x22a8, 0x53a6, 0x8203, 0x7822, 0x7803, - 0x0020, 0x3300, 0x7016, 0x7803, 0x0001, 0x015e, 0x014e, 0x013e, - 0x002e, 0x001e, 0x0005, 0x0136, 0x0146, 0x0156, 0x2099, 0xb6fa, - 0x20a1, 0x0018, 0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, 0x0126, - 0x2091, 0x8000, 0x7803, 0x0041, 0x7007, 0x0003, 0x7000, 0xc084, - 0x7002, 0x700b, 0xb6f5, 0x012e, 0x015e, 0x014e, 0x013e, 0x0005, - 0x0136, 0x0146, 0x0156, 0x2001, 0xb729, 0x209c, 0x20a1, 0x0014, - 0x7803, 0x0026, 0x2001, 0xb72a, 0x20ac, 0x53a6, 0x2099, 0xb72b, - 0x20a1, 0x0018, 0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, 0x0126, - 0x2091, 0x8000, 0x7803, 0x0001, 0x7007, 0x0004, 0x7000, 0xc08c, - 0x7002, 0x700b, 0xb726, 0x012e, 0x015e, 0x014e, 0x013e, 0x0005, - 0x0016, 0x00e6, 0x2071, 0xb913, 0x00f6, 0x2079, 0x0010, 0x7904, - 0x7803, 0x0002, 0xd1fc, 0x0120, 0xa18c, 0x0700, 0x7004, 0x0023, - 0x00fe, 0x00ee, 0x001e, 0x0005, 0x1671, 0x173b, 0x1769, 0x1793, - 0x17c3, 0x173a, 0x0cf8, 0xa18c, 0x0700, 0x1528, 0x0136, 0x0146, - 0x0156, 0x7014, 0x20a0, 0x2099, 0x0014, 0x7803, 0x0040, 0x7010, - 0x20a8, 0x53a5, 0x3400, 0x7016, 0x015e, 0x014e, 0x013e, 0x700c, - 0xa005, 0x0570, 0x7830, 0x7832, 0x7834, 0x7836, 0x080c, 0x16a2, - 0x0005, 0x7008, 0xa080, 0x0002, 0x2003, 0x0100, 0x7007, 0x0000, - 0x080c, 0x1671, 0x0005, 0x7008, 0xa080, 0x0002, 0x2003, 0x0200, - 0x0ca8, 0xa18c, 0x0700, 0x1150, 0x700c, 0xa005, 0x0188, 0x7830, - 0x7832, 0x7834, 0x7836, 0x080c, 0x16b7, 0x0005, 0x7008, 0xa080, - 0x0002, 0x2003, 0x0200, 0x7007, 0x0000, 0x080c, 0x1671, 0x0005, - 0x00d6, 0x7008, 0x2068, 0x7830, 0x6826, 0x7834, 0x682a, 0x7838, - 0x682e, 0x783c, 0x6832, 0x680b, 0x0100, 0x00de, 0x7007, 0x0000, - 0x080c, 0x1671, 0x0005, 0xa18c, 0x0700, 0x1540, 0x0136, 0x0146, - 0x0156, 0x2001, 0xb6f8, 0x2004, 0xa080, 0x000d, 0x20a0, 0x2099, - 0x0014, 0x7803, 0x0040, 0x20a9, 0x0020, 0x53a5, 0x2001, 0xb6fa, - 0x2004, 0xd0bc, 0x0148, 0x2001, 0xb703, 0x2004, 0xa080, 0x000d, - 0x20a0, 0x20a9, 0x0020, 0x53a5, 0x015e, 0x014e, 0x013e, 0x7007, - 0x0000, 0x080c, 0x5ee1, 0x080c, 0x1671, 0x0005, 0x2011, 0x8003, - 0x080c, 0x3f13, 0x0cf8, 0xa18c, 0x0700, 0x1148, 0x2001, 0xb728, - 0x2003, 0x0100, 0x7007, 0x0000, 0x080c, 0x1671, 0x0005, 0x2011, - 0x8004, 0x080c, 0x3f13, 0x0cf8, 0x0126, 0x2091, 0x2200, 0x2079, - 0x0030, 0x2071, 0xb924, 0x7003, 0x0000, 0x700f, 0xb930, 0x7013, - 0xb930, 0x780f, 0x00f6, 0x7803, 0x0004, 0x012e, 0x0005, 0x6934, - 0xa184, 0x0007, 0x0002, 0x17f3, 0x1831, 0x17f3, 0x17f3, 0x17f3, - 0x1819, 0x1800, 0x17f7, 0xa085, 0x0001, 0x0804, 0x184b, 0x684c, - 0xd0bc, 0x0dc8, 0x6860, 0x682e, 0x685c, 0x682a, 0x6858, 0x04c8, - 0xa18c, 0x00ff, 0xa186, 0x001e, 0x1d70, 0x684c, 0xd0bc, 0x0d58, - 0x6860, 0x682e, 0x685c, 0x682a, 0x6804, 0x681a, 0xa080, 0x000d, - 0x2004, 0xa084, 0x000f, 0xa080, 0x2308, 0x2005, 0x6832, 0x6858, - 0x0440, 0xa18c, 0x00ff, 0xa186, 0x0015, 0x19a8, 0x684c, 0xd0ac, - 0x0990, 0x6804, 0x681a, 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, - 0xa080, 0x2308, 0x2005, 0x6832, 0xa006, 0x682e, 0x682a, 0x6858, - 0x0080, 0x684c, 0xd0ac, 0x0904, 0x17f3, 0xa006, 0x682e, 0x682a, - 0x6858, 0xa18c, 0x000f, 0xa188, 0x2308, 0x210d, 0x6932, 0x2d08, - 0x691a, 0x6826, 0x684c, 0xc0dd, 0x684e, 0xa006, 0x680a, 0x697c, - 0x6912, 0x6980, 0x6916, 0x0005, 0x684c, 0xd0ac, 0x090c, 0x151a, - 0x6833, 0x2305, 0x2d08, 0x691a, 0x6858, 0x8001, 0x6826, 0x684c, - 0xc0dd, 0x684e, 0xa006, 0x680a, 0x682e, 0x682a, 0x697c, 0x6912, - 0x6980, 0x6916, 0x0005, 0x20e1, 0x0007, 0x20e1, 0x2000, 0x2001, - 0x020a, 0x2004, 0x82ff, 0x01e8, 0xa280, 0x0004, 0x00d6, 0x206c, - 0x684c, 0xd0dc, 0x1190, 0xa280, 0x0007, 0x2004, 0xa086, 0x000a, - 0x1110, 0x0891, 0x0010, 0x080c, 0x17e7, 0x0138, 0x00de, 0xa280, - 0x0000, 0x2003, 0x0002, 0xa016, 0x0020, 0x6808, 0x8000, 0x680a, - 0x00de, 0x0126, 0x0046, 0x0036, 0x0026, 0x2091, 0x2200, 0x002e, - 0x003e, 0x004e, 0x7000, 0xa005, 0x01d0, 0x710c, 0x220a, 0x8108, - 0x230a, 0x8108, 0x240a, 0x8108, 0xa182, 0xb94b, 0x0210, 0x2009, - 0xb930, 0x710e, 0x7010, 0xa102, 0xa082, 0x0009, 0x0118, 0xa080, - 0x001b, 0x1118, 0x2009, 0x0138, 0x200a, 0x012e, 0x0005, 0x7206, - 0x2001, 0x18ad, 0x0006, 0x2260, 0x0804, 0x19da, 0x0126, 0x0026, - 0x0036, 0x00c6, 0x0006, 0x2091, 0x2200, 0x000e, 0x004e, 0x003e, - 0x002e, 0x00d6, 0x00c6, 0x2460, 0x6110, 0x2168, 0x6a62, 0x6b5e, - 0xa005, 0x0904, 0x190f, 0x6808, 0xa005, 0x0904, 0x1946, 0x7000, - 0xa005, 0x1108, 0x0488, 0x700c, 0x7110, 0xa106, 0x1904, 0x194e, - 0x7004, 0xa406, 0x1548, 0x2001, 0x0005, 0x2004, 0xd08c, 0x0168, - 0x0046, 0x080c, 0x1b22, 0x004e, 0x2460, 0x6010, 0xa080, 0x0002, - 0x2004, 0xa005, 0x0904, 0x1946, 0x0c10, 0x2001, 0x0207, 0x2004, - 0xd09c, 0x1d48, 0x7804, 0xa084, 0x6000, 0x0120, 0xa086, 0x6000, - 0x0108, 0x0c08, 0x7818, 0x6812, 0x781c, 0x6816, 0x7803, 0x0004, - 0x7003, 0x0000, 0x7004, 0x2060, 0x6100, 0xa18e, 0x0004, 0x1904, - 0x194e, 0x2009, 0x0048, 0x080c, 0x86d3, 0x0804, 0x194e, 0x6808, - 0xa005, 0x05a0, 0x7000, 0xa005, 0x0588, 0x700c, 0x7110, 0xa106, - 0x1118, 0x7004, 0xa406, 0x1550, 0x2001, 0x0005, 0x2004, 0xd08c, - 0x0160, 0x0046, 0x080c, 0x1b22, 0x004e, 0x2460, 0x6010, 0xa080, - 0x0002, 0x2004, 0xa005, 0x01d0, 0x0c28, 0x2001, 0x0207, 0x2004, - 0xd09c, 0x1d50, 0x2001, 0x0005, 0x2004, 0xd08c, 0x1d50, 0x7804, - 0xa084, 0x6000, 0x0118, 0xa086, 0x6000, 0x19f0, 0x7818, 0x6812, - 0x781c, 0x6816, 0x7803, 0x0004, 0x7003, 0x0000, 0x6100, 0xa18e, - 0x0004, 0x1120, 0x2009, 0x0048, 0x080c, 0x86d3, 0x00ce, 0x00de, - 0x012e, 0x0005, 0x00f6, 0x00e6, 0x0026, 0x0036, 0x0046, 0x0056, - 0x2071, 0xb924, 0x7000, 0xa086, 0x0000, 0x0904, 0x19b8, 0x7004, - 0xac06, 0x1904, 0x19aa, 0x2079, 0x0030, 0x7000, 0xa086, 0x0003, - 0x0904, 0x19aa, 0x7804, 0xd0fc, 0x15c8, 0x20e1, 0x6000, 0x2011, - 0x0032, 0x2001, 0x0208, 0x200c, 0x2001, 0x0209, 0x2004, 0xa106, - 0x1d88, 0x8211, 0x1db0, 0x7804, 0xd0fc, 0x1540, 0x080c, 0x1e8a, - 0x0026, 0x0056, 0x7803, 0x0004, 0x7804, 0xd0ac, 0x1de8, 0x7803, - 0x0002, 0x7803, 0x0009, 0x7003, 0x0003, 0x7007, 0x0000, 0x005e, - 0x002e, 0x2001, 0x015d, 0x2003, 0x0000, 0x080c, 0x5b41, 0x1138, - 0x0066, 0x2031, 0x0001, 0x080c, 0x5bc3, 0x006e, 0x0058, 0x2001, - 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x0020, 0x080c, 0x1b22, - 0x0804, 0x195a, 0x0156, 0x20a9, 0x0009, 0x2009, 0xb930, 0x2104, - 0xac06, 0x1108, 0x200a, 0xa188, 0x0003, 0x1f04, 0x19af, 0x015e, - 0x005e, 0x004e, 0x003e, 0x002e, 0x00ee, 0x00fe, 0x0005, 0x700c, - 0x7110, 0xa106, 0x0904, 0x1a4e, 0x2104, 0x7006, 0x2060, 0x8108, - 0x211c, 0x8108, 0x2124, 0x8108, 0xa182, 0xb94b, 0x0210, 0x2009, - 0xb930, 0x7112, 0x700c, 0xa106, 0x1128, 0x080c, 0x2920, 0x2001, - 0x0138, 0x2102, 0x8cff, 0x0598, 0x6010, 0x2068, 0x2d58, 0x6828, - 0xa406, 0x1590, 0x682c, 0xa306, 0x1578, 0x7004, 0x2060, 0x6020, - 0xc0d4, 0x6022, 0x684c, 0xd0f4, 0x0128, 0x6817, 0xffff, 0x6813, - 0xffff, 0x00e8, 0x6850, 0xd0f4, 0x1130, 0x7803, 0x0004, 0x6810, - 0x781a, 0x6814, 0x781e, 0x6824, 0x2050, 0x6818, 0x2060, 0x6830, - 0x2040, 0x6034, 0xa0cc, 0x000f, 0x2009, 0x0011, 0x080c, 0x1a51, - 0x0120, 0x2009, 0x0001, 0x080c, 0x1a51, 0x2d58, 0x0005, 0x080c, - 0x1df9, 0x0904, 0x19bf, 0x0cd0, 0x6020, 0xd0f4, 0x11e0, 0xd0d4, - 0x01b8, 0x6038, 0xa402, 0x6034, 0xa303, 0x0108, 0x1288, 0x643a, - 0x6336, 0x6c2a, 0x6b2e, 0x0046, 0x0036, 0x2400, 0x6c7c, 0xa402, - 0x6812, 0x2300, 0x6b80, 0xa303, 0x6816, 0x003e, 0x004e, 0x0018, - 0x080c, 0xa056, 0x09e0, 0x601c, 0xa08e, 0x0008, 0x0904, 0x19e5, - 0xa08e, 0x000a, 0x0904, 0x19e5, 0x2001, 0xb674, 0x2004, 0xd0b4, - 0x1140, 0x6018, 0x2004, 0xd0bc, 0x1120, 0x6817, 0x7fff, 0x6813, - 0xffff, 0x080c, 0x2328, 0x1918, 0x0804, 0x19e5, 0x7003, 0x0000, - 0x0005, 0x8aff, 0x0904, 0x1afc, 0xa03e, 0x2730, 0xc9fc, 0x6850, - 0xd0fc, 0x11b8, 0xd0f4, 0x1588, 0x00d6, 0x2805, 0xac68, 0x2900, - 0x0002, 0x1aba, 0x1a93, 0x1a93, 0x1aba, 0x1aba, 0x1ab2, 0x1aba, - 0x1a93, 0x1aba, 0x1a9b, 0x1a9b, 0x1aba, 0x1aba, 0x1aba, 0x1aaa, - 0x1a9b, 0x7803, 0x0004, 0xc0fc, 0x6852, 0x6b6c, 0x6a70, 0x6d1c, - 0x6c20, 0x00d6, 0xd99c, 0x0140, 0x2805, 0xac68, 0x6f08, 0x6e0c, - 0x080c, 0x23ed, 0x0120, 0x04d0, 0x080c, 0x23ed, 0x15b0, 0x6850, - 0xc0fd, 0x6852, 0x00de, 0xa006, 0x0005, 0xc0f4, 0x6852, 0x6b6c, - 0x6a70, 0x00d6, 0x04c0, 0x6b08, 0x6a0c, 0x6d00, 0x6c04, 0x080c, - 0x23ed, 0x0d80, 0x0410, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, - 0x6e0c, 0x080c, 0x23ed, 0x0d30, 0x00c8, 0x6d00, 0x6c04, 0x6f08, - 0x6e0c, 0x00a0, 0x00de, 0x00d6, 0x6834, 0xa084, 0x00ff, 0xa086, - 0x001e, 0x1140, 0x00de, 0x080c, 0x22ca, 0x1904, 0x1a51, 0xa00e, - 0x0804, 0x1afc, 0x00de, 0x080c, 0x151a, 0xc9fd, 0x7b22, 0x7a26, - 0x7d32, 0x7c36, 0x7f3a, 0x7e3e, 0x7316, 0x721a, 0x751e, 0x7422, - 0x7726, 0x762a, 0x7902, 0x7100, 0x8108, 0x7102, 0x00de, 0x6828, - 0xa300, 0x682a, 0x682c, 0xa201, 0x682e, 0x8109, 0x2d08, 0x1500, - 0xd9fc, 0x0160, 0xc9fc, 0x080c, 0x22ca, 0x01e8, 0x2805, 0xac68, - 0x6800, 0xa506, 0x11c0, 0x6804, 0xa406, 0x00a8, 0xc9fc, 0x080c, - 0x22ca, 0x0188, 0x2805, 0xac68, 0x6800, 0xa506, 0x1160, 0x6804, - 0xa406, 0x1148, 0x6808, 0xa706, 0x1130, 0x680c, 0xa606, 0x0018, - 0xc9fc, 0x080c, 0x22ca, 0x2168, 0x0005, 0x080c, 0x151a, 0x080c, - 0x1f71, 0x7004, 0x2060, 0x00d6, 0x6010, 0x2068, 0x7003, 0x0000, - 0x080c, 0x1e1a, 0x080c, 0x9d16, 0x0170, 0x6808, 0x8001, 0x680a, - 0x697c, 0x6912, 0x6980, 0x6916, 0x682b, 0xffff, 0x682f, 0xffff, - 0x6850, 0xc0bd, 0x6852, 0x00de, 0x080c, 0x99e6, 0x0804, 0x1d47, - 0x080c, 0x151a, 0x0126, 0x2091, 0x2200, 0x0006, 0x0016, 0x2b68, - 0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184, 0x0700, 0x1978, - 0xa184, 0x0003, 0xa086, 0x0003, 0x0d58, 0x7000, 0x0002, 0x1b3f, - 0x1b45, 0x1c56, 0x1d22, 0x1d36, 0x1b3f, 0x1b3f, 0x1b3f, 0x7804, - 0xd09c, 0x1904, 0x1d47, 0x080c, 0x151a, 0x8001, 0x7002, 0xd1bc, - 0x11a0, 0xd19c, 0x1904, 0x1bda, 0xd1dc, 0x1178, 0x8aff, 0x0904, - 0x1bda, 0x2009, 0x0001, 0x080c, 0x1a51, 0x0904, 0x1d47, 0x2009, - 0x0001, 0x080c, 0x1a51, 0x0804, 0x1d47, 0x7803, 0x0004, 0x7003, - 0x0000, 0xd1bc, 0x1904, 0x1bba, 0x0026, 0x0036, 0x7c20, 0x7d24, - 0x7e30, 0x7f34, 0x7818, 0x6812, 0x781c, 0x6816, 0x2001, 0x0201, - 0x2004, 0xa005, 0x0140, 0x7808, 0xd0ec, 0x1128, 0x7803, 0x0009, - 0x7003, 0x0004, 0x0010, 0x080c, 0x1d4b, 0x6b28, 0x6a2c, 0x2400, - 0x686e, 0xa31a, 0x2500, 0x6872, 0xa213, 0x6b2a, 0x6a2e, 0x00c6, - 0x7004, 0x2060, 0x6020, 0xd0f4, 0x1110, 0x633a, 0x6236, 0x00ce, - 0x003e, 0x002e, 0x6e1e, 0x6f22, 0x2500, 0xa405, 0x0128, 0x080c, - 0x22e0, 0x6850, 0xc0fd, 0x6852, 0x2a00, 0x6826, 0x2c00, 0x681a, - 0x2800, 0x6832, 0x6808, 0x8001, 0x680a, 0x1148, 0x684c, 0xd0e4, - 0x0130, 0x7004, 0x2060, 0x2009, 0x0048, 0x080c, 0x86d3, 0x7000, - 0xa086, 0x0004, 0x0904, 0x1d47, 0x7003, 0x0000, 0x080c, 0x19bf, - 0x0804, 0x1d47, 0x0056, 0x7d0c, 0xd5bc, 0x1110, 0x080c, 0xb4c3, - 0x005e, 0x080c, 0x1e1a, 0x00f6, 0x7004, 0x2078, 0x080c, 0x5377, - 0x0118, 0x7820, 0xc0f5, 0x7822, 0x00fe, 0x682b, 0xffff, 0x682f, - 0xffff, 0x6808, 0x8001, 0x680a, 0x697c, 0x791a, 0x6980, 0x791e, - 0x0804, 0x1d47, 0x7004, 0x00c6, 0x2060, 0x6020, 0x00ce, 0xd0f4, - 0x0120, 0x6808, 0x8001, 0x680a, 0x04c0, 0x7818, 0x6812, 0x7a1c, - 0x6a16, 0xd19c, 0x0160, 0xa205, 0x0150, 0x7004, 0xa080, 0x0007, - 0x2004, 0xa084, 0xfffd, 0xa086, 0x0008, 0x1904, 0x1b5d, 0x684c, - 0xc0f5, 0x684e, 0x7814, 0xa005, 0x1520, 0x7003, 0x0000, 0x6808, - 0x8001, 0x680a, 0x01a0, 0x7004, 0x2060, 0x601c, 0xa086, 0x000a, - 0x11a0, 0x0156, 0x20a9, 0x0009, 0x2009, 0xb930, 0x2104, 0xac06, - 0x1108, 0x200a, 0xa188, 0x0003, 0x1f04, 0x1c0e, 0x015e, 0x7004, - 0x2060, 0x2009, 0x0048, 0x080c, 0x86d3, 0x080c, 0x19bf, 0x0804, - 0x1d47, 0x7818, 0x6812, 0x781c, 0x6816, 0x7814, 0x7908, 0xa18c, - 0x0fff, 0xa192, 0x0841, 0x1a04, 0x1aff, 0xa188, 0x0007, 0x8114, - 0x8214, 0x8214, 0xa10a, 0x8104, 0x8004, 0x8004, 0xa20a, 0x810b, - 0x810b, 0x810b, 0x080c, 0x1eb5, 0x7803, 0x0004, 0x780f, 0xffff, - 0x7803, 0x0001, 0x7804, 0xd0fc, 0x0de8, 0x7803, 0x0002, 0x7803, - 0x0004, 0x780f, 0x00f6, 0x7004, 0x7007, 0x0000, 0x2060, 0x2009, - 0x0048, 0x080c, 0x86d3, 0x080c, 0x1f0b, 0x0838, 0x8001, 0x7002, - 0xd194, 0x01b0, 0x7804, 0xd0fc, 0x1904, 0x1cf2, 0xd09c, 0x0138, - 0x7804, 0xd0fc, 0x1904, 0x1cf2, 0xd09c, 0x1904, 0x1cf6, 0x8aff, - 0x0904, 0x1d47, 0x2009, 0x0001, 0x080c, 0x1a51, 0x0804, 0x1d47, - 0xa184, 0x0888, 0x1148, 0x8aff, 0x0904, 0x1d47, 0x2009, 0x0001, - 0x080c, 0x1a51, 0x0804, 0x1d47, 0x7818, 0x6812, 0x7a1c, 0x6a16, - 0xa205, 0x0904, 0x1bf7, 0x7803, 0x0004, 0x7003, 0x0000, 0xd1bc, - 0x1904, 0x1cd4, 0x6834, 0xa084, 0x00ff, 0xa086, 0x0029, 0x1118, - 0xd19c, 0x1904, 0x1bf7, 0x0026, 0x0036, 0x7c20, 0x7d24, 0x7e30, - 0x7f34, 0x7818, 0x6812, 0x781c, 0x6816, 0x2001, 0x0201, 0x2004, - 0xa005, 0x0140, 0x7808, 0xd0ec, 0x1128, 0x7803, 0x0009, 0x7003, - 0x0004, 0x0020, 0x0016, 0x080c, 0x1d4b, 0x001e, 0x6b28, 0x6a2c, - 0x080c, 0x22e0, 0x00d6, 0x2805, 0xac68, 0x6034, 0xd09c, 0x1128, - 0x6808, 0xa31a, 0x680c, 0xa213, 0x0020, 0x6810, 0xa31a, 0x6814, - 0xa213, 0x00de, 0xd194, 0x0904, 0x1b7f, 0x2a00, 0x6826, 0x2c00, - 0x681a, 0x2800, 0x6832, 0x6808, 0x8001, 0x680a, 0x6b2a, 0x6a2e, - 0x003e, 0x002e, 0x0804, 0x1c1d, 0x0056, 0x7d0c, 0x080c, 0xb4c3, - 0x005e, 0x080c, 0x1e1a, 0x00f6, 0x7004, 0x2078, 0x080c, 0x5377, - 0x0118, 0x7820, 0xc0f5, 0x7822, 0x00fe, 0x682b, 0xffff, 0x682f, - 0xffff, 0x6808, 0x8001, 0x680a, 0x697c, 0x791a, 0x6980, 0x791e, - 0x0804, 0x1d47, 0x7804, 0xd09c, 0x0904, 0x1b2a, 0x7c20, 0x7824, - 0xa405, 0x1904, 0x1b2a, 0x7818, 0x6812, 0x7c1c, 0x6c16, 0xa405, - 0x1120, 0x7803, 0x0002, 0x0804, 0x1bf7, 0x751c, 0x7420, 0x7724, - 0x7628, 0x7014, 0xa528, 0x7018, 0xa421, 0xa7b9, 0x0000, 0xa6b1, - 0x0000, 0x7830, 0xa506, 0x1150, 0x7834, 0xa406, 0x1138, 0x7838, - 0xa706, 0x1120, 0x783c, 0xa606, 0x0904, 0x1b2a, 0x7803, 0x0002, - 0x0804, 0x1c83, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0xa00d, - 0x0150, 0x6808, 0x8001, 0x680a, 0x1130, 0x7004, 0x2060, 0x2009, - 0x0048, 0x080c, 0x86d3, 0x080c, 0x19bf, 0x0088, 0x7803, 0x0004, - 0x7003, 0x0000, 0x7004, 0x2060, 0x6010, 0xa005, 0x0da0, 0x2068, - 0x6808, 0x8000, 0x680a, 0x6c28, 0x6b2c, 0x080c, 0x19da, 0x001e, - 0x000e, 0x012e, 0x0005, 0x700c, 0x7110, 0xa106, 0x0904, 0x1ded, - 0x7004, 0x0016, 0x210c, 0xa106, 0x001e, 0x0904, 0x1ded, 0x00d6, - 0x00c6, 0x216c, 0x2d00, 0xa005, 0x0904, 0x1deb, 0x681c, 0xa086, - 0x0008, 0x0904, 0x1deb, 0x6820, 0xd0d4, 0x1904, 0x1deb, 0x6810, - 0x2068, 0x6850, 0xd0fc, 0x05a8, 0x8108, 0x2104, 0x6b2c, 0xa306, - 0x1904, 0x1deb, 0x8108, 0x2104, 0x6a28, 0xa206, 0x1904, 0x1deb, - 0x6850, 0xc0fc, 0xc0f5, 0x6852, 0x686c, 0x7822, 0x7016, 0x6870, - 0x7826, 0x701a, 0x681c, 0x7832, 0x701e, 0x6820, 0x7836, 0x7022, - 0x6818, 0x2060, 0x6034, 0xd09c, 0x0168, 0x6830, 0x2005, 0x00d6, - 0xac68, 0x6808, 0x783a, 0x7026, 0x680c, 0x783e, 0x702a, 0x00de, - 0x0804, 0x1de5, 0xa006, 0x783a, 0x783e, 0x7026, 0x702a, 0x0804, - 0x1de5, 0x8108, 0x2104, 0xa005, 0x1904, 0x1deb, 0x6b2c, 0xa306, - 0x1904, 0x1deb, 0x8108, 0x2104, 0xa005, 0x15e8, 0x6a28, 0xa206, - 0x15d0, 0x6850, 0xc0f5, 0x6852, 0x6830, 0x2005, 0x6918, 0xa160, - 0xa180, 0x000d, 0x2004, 0xd09c, 0x11a0, 0x6008, 0x7822, 0x7016, - 0x686e, 0x600c, 0x7826, 0x701a, 0x6872, 0x6000, 0x7832, 0x701e, - 0x6004, 0x7836, 0x7022, 0xa006, 0x783a, 0x783e, 0x7026, 0x702a, - 0x00a0, 0x6010, 0x7822, 0x7016, 0x686e, 0x6014, 0x7826, 0x701a, - 0x6872, 0x6000, 0x7832, 0x701e, 0x6004, 0x7836, 0x7022, 0x6008, - 0x783a, 0x7026, 0x600c, 0x783e, 0x702a, 0x6810, 0x781a, 0x6814, - 0x781e, 0x7803, 0x0011, 0x00ce, 0x00de, 0x0005, 0x2011, 0x0201, - 0x2009, 0x003c, 0x2204, 0xa005, 0x1118, 0x8109, 0x1dd8, 0x0005, - 0x0005, 0x0ca1, 0x0118, 0x780c, 0xd0a4, 0x0120, 0x00d9, 0xa085, - 0x0001, 0x0010, 0x080c, 0x1f0b, 0x0005, 0x0126, 0x2091, 0x2200, - 0x7000, 0xa086, 0x0003, 0x1160, 0x700c, 0x7110, 0xa106, 0x0140, - 0x080c, 0x2991, 0x20e1, 0x9028, 0x700f, 0xb930, 0x7013, 0xb930, - 0x012e, 0x0005, 0x00c6, 0x080c, 0x5b41, 0x11b8, 0x2001, 0x0160, - 0x2003, 0x0000, 0x2001, 0x0138, 0x2003, 0x0000, 0x2011, 0x00c8, - 0xe000, 0xe000, 0x8211, 0x1de0, 0x04b1, 0x0066, 0x2031, 0x0000, - 0x080c, 0x5bc3, 0x006e, 0x00ce, 0x0005, 0x080c, 0x1e8a, 0x080c, - 0x2991, 0x20e1, 0x9028, 0x700c, 0x7110, 0xa106, 0x01c0, 0x2104, - 0xa005, 0x0130, 0x2060, 0x6010, 0x2060, 0x6008, 0x8001, 0x600a, - 0xa188, 0x0003, 0xa182, 0xb94b, 0x0210, 0x2009, 0xb930, 0x7112, - 0x700c, 0xa106, 0x1d40, 0x080c, 0x2920, 0x2110, 0x0c20, 0x2001, - 0x015d, 0x2003, 0x0000, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, - 0x2202, 0x00ce, 0x0005, 0x080c, 0x2991, 0x20e1, 0x9028, 0x2001, - 0x015d, 0x2003, 0x0000, 0x00e6, 0x00c6, 0x0016, 0x2071, 0xb924, - 0x700c, 0x7110, 0xa106, 0x0190, 0x2104, 0xa005, 0x0130, 0x2060, - 0x6010, 0x2060, 0x6008, 0x8001, 0x600a, 0xa188, 0x0003, 0xa182, - 0xb94b, 0x0210, 0x2009, 0xb930, 0x7112, 0x0c50, 0x001e, 0x00ce, - 0x00ee, 0x0005, 0x2001, 0x0138, 0x2014, 0x2003, 0x0000, 0x2001, - 0x0160, 0x202c, 0x2003, 0x0000, 0x080c, 0x5b41, 0x1148, 0x2021, - 0x0002, 0x1d04, 0x1e99, 0x2091, 0x6000, 0x8421, 0x1dd0, 0x0005, - 0x2021, 0xb015, 0x2001, 0x0141, 0x201c, 0xd3dc, 0x1168, 0x2001, - 0x0109, 0x201c, 0xa39c, 0x0048, 0x1138, 0x2001, 0x0111, 0x201c, - 0x83ff, 0x1110, 0x8421, 0x1d70, 0x0005, 0x00e6, 0x2071, 0x0200, - 0x7808, 0xa084, 0xf000, 0xa10d, 0x0869, 0x2001, 0x0105, 0x2004, - 0xa084, 0x0003, 0x1130, 0x2001, 0xb94b, 0x2004, 0xa086, 0x0000, - 0x0548, 0xa026, 0x2019, 0xf000, 0x8319, 0x1148, 0x2001, 0x012b, - 0x2003, 0x95f5, 0x2001, 0x0129, 0x2003, 0x95f5, 0x00d8, 0x2001, - 0x0105, 0x2004, 0xa084, 0x0003, 0x1130, 0x2001, 0xb94b, 0x2004, - 0xa086, 0x0000, 0x0178, 0x2001, 0x0132, 0x2004, 0xa436, 0x0110, - 0x2020, 0x0c00, 0x2001, 0x0021, 0x2004, 0xd0fc, 0x09e8, 0x080c, - 0x216d, 0x08c0, 0x20e1, 0x7000, 0x7324, 0x7420, 0x7028, 0x7028, - 0x7426, 0x7037, 0x0001, 0x810f, 0x712e, 0x702f, 0x0100, 0x7037, - 0x0008, 0x7326, 0x7422, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, - 0x2202, 0x00ee, 0x0005, 0x0026, 0x2001, 0x015d, 0x2003, 0x0000, - 0x7908, 0xa18c, 0x0fff, 0xa182, 0x0ffd, 0x0210, 0x2009, 0x0000, - 0xa190, 0x0007, 0xa294, 0x1ff8, 0x8214, 0x8214, 0x8214, 0x2001, - 0x020a, 0x82ff, 0x0140, 0x20e1, 0x6000, 0x200c, 0x200c, 0x200c, - 0x200c, 0x8211, 0x1dd0, 0x20e1, 0x7000, 0x200c, 0x200c, 0x7003, - 0x0000, 0x20e1, 0x6000, 0x2001, 0x0208, 0x200c, 0x2001, 0x0209, - 0x2004, 0xa106, 0x0158, 0x080c, 0x1dee, 0x0130, 0x7908, 0xd1ec, - 0x1128, 0x790c, 0xd1a4, 0x0960, 0x080c, 0x1e1a, 0xa006, 0x002e, - 0x0005, 0x00f6, 0x00e6, 0x0016, 0x0026, 0x2071, 0xb924, 0x2079, - 0x0030, 0x2011, 0x0050, 0x7000, 0xa086, 0x0000, 0x01a8, 0x8211, - 0x0188, 0x2001, 0x0005, 0x2004, 0xd08c, 0x0dc8, 0x7904, 0xa18c, - 0x0780, 0x0016, 0x080c, 0x1b22, 0x001e, 0x81ff, 0x1118, 0x2011, - 0x0050, 0x0c48, 0xa085, 0x0001, 0x002e, 0x001e, 0x00ee, 0x00fe, - 0x0005, 0x7803, 0x0004, 0x2009, 0x0064, 0x7804, 0xd0ac, 0x0904, - 0x1fbd, 0x8109, 0x1dd0, 0x2009, 0x0100, 0x210c, 0xa18a, 0x0003, - 0x0a0c, 0x151a, 0x080c, 0x2274, 0x00e6, 0x00f6, 0x2071, 0xb913, - 0x2079, 0x0010, 0x7004, 0xa086, 0x0000, 0x0538, 0x7800, 0x0006, - 0x7820, 0x0006, 0x7830, 0x0006, 0x7834, 0x0006, 0x7838, 0x0006, - 0x783c, 0x0006, 0x7803, 0x0004, 0xe000, 0xe000, 0x2079, 0x0030, - 0x7804, 0xd0ac, 0x190c, 0x151a, 0x2079, 0x0010, 0x000e, 0x783e, - 0x000e, 0x783a, 0x000e, 0x7836, 0x000e, 0x7832, 0x000e, 0x7822, - 0x000e, 0x7802, 0x00fe, 0x00ee, 0x0030, 0x00fe, 0x00ee, 0x7804, - 0xd0ac, 0x190c, 0x151a, 0x080c, 0x72a2, 0x0005, 0x00e6, 0x2071, - 0xb94b, 0x7003, 0x0000, 0x00ee, 0x0005, 0x00d6, 0xa280, 0x0004, - 0x206c, 0x694c, 0xd1dc, 0x1904, 0x203b, 0x6934, 0xa184, 0x0007, - 0x0002, 0x1fd9, 0x2026, 0x1fd9, 0x1fd9, 0x1fd9, 0x200d, 0x1fec, - 0x1fdb, 0x080c, 0x151a, 0x684c, 0xd0b4, 0x0904, 0x212a, 0x6860, - 0x682e, 0x6816, 0x685c, 0x682a, 0x6812, 0x687c, 0x680a, 0x6880, - 0x680e, 0x6958, 0x0804, 0x202e, 0x6834, 0xa084, 0x00ff, 0xa086, - 0x001e, 0x1d38, 0x684c, 0xd0b4, 0x0904, 0x212a, 0x6860, 0x682e, - 0x6816, 0x685c, 0x682a, 0x6812, 0x687c, 0x680a, 0x6880, 0x680e, - 0x6804, 0x681a, 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, - 0x2308, 0x2005, 0x6832, 0x6958, 0x0450, 0xa18c, 0x00ff, 0xa186, - 0x0015, 0x1548, 0x684c, 0xd0b4, 0x0904, 0x212a, 0x6804, 0x681a, - 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x2308, 0x2005, - 0x6832, 0x6958, 0xa006, 0x682e, 0x682a, 0x0088, 0x684c, 0xd0b4, - 0x0904, 0x1afd, 0x6958, 0xa006, 0x682e, 0x682a, 0x2d00, 0x681a, - 0x6834, 0xa084, 0x000f, 0xa080, 0x2308, 0x2005, 0x6832, 0x6926, - 0x684c, 0xc0dd, 0x684e, 0x00de, 0x0005, 0x00f6, 0x2079, 0x0020, - 0x7804, 0xd0fc, 0x190c, 0x216d, 0x00e6, 0x00d6, 0x2071, 0xb94b, - 0x7000, 0xa005, 0x1904, 0x20aa, 0x00c6, 0x7206, 0xa280, 0x0004, - 0x205c, 0x7004, 0x2068, 0x7803, 0x0004, 0x6818, 0x00d6, 0x2068, - 0x686c, 0x7812, 0x6890, 0x00f6, 0x20e1, 0x9040, 0x2079, 0x0200, - 0x781a, 0x2079, 0x0100, 0x8004, 0x78d6, 0x00fe, 0x00de, 0x2b68, - 0x6824, 0x2050, 0x6818, 0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc, - 0x000f, 0x6908, 0x791a, 0x7116, 0x680c, 0x781e, 0x701a, 0xa006, - 0x700e, 0x7012, 0x7004, 0x692c, 0x6814, 0xa106, 0x1120, 0x6928, - 0x6810, 0xa106, 0x0190, 0x2001, 0xb674, 0x2004, 0xd0cc, 0x0110, - 0x00ce, 0x0400, 0x0036, 0x0046, 0x6b14, 0x6c10, 0x080c, 0x2328, - 0x004e, 0x003e, 0x0110, 0x00ce, 0x00a8, 0x8aff, 0x1120, 0x00ce, - 0xa085, 0x0001, 0x0078, 0x0126, 0x2091, 0x8000, 0x2079, 0x0020, - 0x2009, 0x0001, 0x0059, 0x0118, 0x2009, 0x0001, 0x0039, 0x012e, - 0x00ce, 0xa006, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x0076, 0x0066, - 0x0056, 0x0046, 0x0036, 0x0026, 0x8aff, 0x0904, 0x2123, 0x700c, - 0x7214, 0xa23a, 0x7010, 0x7218, 0xa203, 0x0a04, 0x2122, 0xa705, - 0x0904, 0x2122, 0xa03e, 0x2730, 0x6850, 0xd0fc, 0x11a8, 0x00d6, - 0x2805, 0xac68, 0x2900, 0x0002, 0x2105, 0x20ea, 0x20ea, 0x2105, - 0x2105, 0x20fe, 0x2105, 0x20ea, 0x2105, 0x20ef, 0x20ef, 0x2105, - 0x2105, 0x2105, 0x20f6, 0x20ef, 0xc0fc, 0x6852, 0x6b6c, 0x6a70, - 0x6d1c, 0x6c20, 0xd99c, 0x0528, 0x00d6, 0x2805, 0xac68, 0x6f08, - 0x6e0c, 0x00f0, 0x6b08, 0x6a0c, 0x6d00, 0x6c04, 0x00c8, 0x6b10, - 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, 0x0090, 0x00de, 0x00d6, - 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, 0x1138, 0x00de, 0x080c, - 0x22ca, 0x1904, 0x20b4, 0xa00e, 0x00f0, 0x00de, 0x080c, 0x151a, - 0x00de, 0x7b22, 0x7a26, 0x7d32, 0x7c36, 0x7f3a, 0x7e3e, 0x7902, - 0x7000, 0x8000, 0x7002, 0x6828, 0xa300, 0x682a, 0x682c, 0xa201, - 0x682e, 0x700c, 0xa300, 0x700e, 0x7010, 0xa201, 0x7012, 0x080c, - 0x22ca, 0x0008, 0xa006, 0x002e, 0x003e, 0x004e, 0x005e, 0x006e, - 0x007e, 0x0005, 0x080c, 0x151a, 0x0026, 0x2001, 0x0105, 0x2003, - 0x0010, 0x20e1, 0x9040, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, - 0x2060, 0x00d6, 0x6010, 0x2068, 0x080c, 0x9d16, 0x0118, 0x6850, - 0xc0bd, 0x6852, 0x601c, 0xa086, 0x0006, 0x1180, 0x2061, 0x0100, - 0x62c8, 0x2001, 0x00fa, 0x8001, 0x1df0, 0x60c8, 0xa206, 0x1dc0, - 0x60c4, 0x686a, 0x60c8, 0x6866, 0x7004, 0x2060, 0x00de, 0x00c6, - 0x080c, 0x99e6, 0x00ce, 0x2001, 0xb8f0, 0x2004, 0xac06, 0x1150, - 0x20e1, 0x9040, 0x080c, 0x82e4, 0x2011, 0x0000, 0x080c, 0x8106, - 0x080c, 0x72a2, 0x002e, 0x0804, 0x2227, 0x0126, 0x2091, 0x2400, - 0x0006, 0x0016, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x2079, 0x0020, - 0x2071, 0xb94b, 0x2b68, 0x6818, 0x2060, 0x7904, 0x7803, 0x0002, - 0xa184, 0x0700, 0x1904, 0x212c, 0x7000, 0x0002, 0x2227, 0x218a, - 0x21fa, 0x2225, 0x8001, 0x7002, 0xd19c, 0x1170, 0x8aff, 0x05d0, - 0x2009, 0x0001, 0x080c, 0x20ae, 0x0904, 0x2227, 0x2009, 0x0001, - 0x080c, 0x20ae, 0x0804, 0x2227, 0x7803, 0x0004, 0xd194, 0x0148, - 0x6850, 0xc0fc, 0x6852, 0x8aff, 0x11d8, 0x684c, 0xc0f5, 0x684e, - 0x00b8, 0x0026, 0x0036, 0x6b28, 0x6a2c, 0x7820, 0x686e, 0xa31a, - 0x7824, 0x6872, 0xa213, 0x7830, 0x681e, 0x7834, 0x6822, 0x6b2a, - 0x6a2e, 0x003e, 0x002e, 0x080c, 0x22e0, 0x6850, 0xc0fd, 0x6852, - 0x2a00, 0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x7003, 0x0000, - 0x0804, 0x2227, 0x00f6, 0x0026, 0x781c, 0x0006, 0x7818, 0x0006, - 0x2079, 0x0100, 0x7a14, 0xa284, 0x0184, 0xa085, 0x0012, 0x7816, - 0x0036, 0x2019, 0x1000, 0x8319, 0x090c, 0x151a, 0x7820, 0xd0bc, - 0x1dd0, 0x003e, 0x79c8, 0x000e, 0xa102, 0x001e, 0x0006, 0x0016, - 0x79c4, 0x000e, 0xa103, 0x78c6, 0x000e, 0x78ca, 0xa284, 0x0184, - 0xa085, 0x0012, 0x7816, 0x002e, 0x00fe, 0x7803, 0x0008, 0x7003, - 0x0000, 0x0468, 0x8001, 0x7002, 0xd194, 0x0168, 0x7804, 0xd0fc, - 0x1904, 0x217d, 0xd19c, 0x11f8, 0x8aff, 0x0508, 0x2009, 0x0001, - 0x080c, 0x20ae, 0x00e0, 0x0026, 0x0036, 0x6b28, 0x6a2c, 0x080c, - 0x22e0, 0x00d6, 0x2805, 0xac68, 0x6034, 0xd09c, 0x1128, 0x6808, - 0xa31a, 0x680c, 0xa213, 0x0020, 0x6810, 0xa31a, 0x6814, 0xa213, - 0x00de, 0x0804, 0x21ad, 0x0804, 0x21a9, 0x080c, 0x151a, 0x00ce, - 0x00de, 0x00ee, 0x00fe, 0x001e, 0x000e, 0x012e, 0x0005, 0x00f6, - 0x00e6, 0x2071, 0xb94b, 0x7000, 0xa086, 0x0000, 0x05d0, 0x2079, - 0x0020, 0x0016, 0x2009, 0x0207, 0x210c, 0xd194, 0x0198, 0x2009, - 0x020c, 0x210c, 0xa184, 0x0003, 0x0168, 0x080c, 0xb50c, 0x2001, - 0x0133, 0x2004, 0xa005, 0x090c, 0x151a, 0x20e1, 0x9040, 0x2001, - 0x020c, 0x2102, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, - 0xa106, 0x1110, 0x20e1, 0x9040, 0x7804, 0xd0fc, 0x09d8, 0x080c, - 0x216d, 0x7000, 0xa086, 0x0000, 0x19a8, 0x001e, 0x7803, 0x0004, - 0x7804, 0xd0ac, 0x1de8, 0x20e1, 0x9040, 0x7803, 0x0002, 0x7003, - 0x0000, 0x00ee, 0x00fe, 0x0005, 0x0026, 0x00c6, 0x00d6, 0x00e6, - 0x00f6, 0x2071, 0xb94b, 0x2079, 0x0020, 0x7000, 0xa086, 0x0000, - 0x0540, 0x7004, 0x2060, 0x6010, 0x2068, 0x080c, 0x9d16, 0x0158, - 0x6850, 0xc0b5, 0x6852, 0x680c, 0x7a1c, 0xa206, 0x1120, 0x6808, - 0x7a18, 0xa206, 0x01e0, 0x2001, 0x0105, 0x2003, 0x0010, 0x20e1, - 0x9040, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, 0x080c, - 0x99e6, 0x20e1, 0x9040, 0x080c, 0x82e4, 0x2011, 0x0000, 0x080c, - 0x8106, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x0005, 0x6810, - 0x6a14, 0xa205, 0x1d00, 0x684c, 0xc0dc, 0x684e, 0x2c10, 0x080c, - 0x1fc5, 0x2001, 0x0105, 0x2003, 0x0010, 0x20e1, 0x9040, 0x7803, - 0x0004, 0x7003, 0x0000, 0x2069, 0xb8e1, 0x6833, 0x0000, 0x683f, - 0x0000, 0x08f8, 0x8840, 0x2805, 0xa005, 0x1170, 0x6004, 0xa005, - 0x0168, 0x681a, 0x2060, 0x6034, 0xa084, 0x000f, 0xa080, 0x2308, - 0x2045, 0x88ff, 0x090c, 0x151a, 0x8a51, 0x0005, 0x2050, 0x0005, - 0x8a50, 0x8841, 0x2805, 0xa005, 0x1190, 0x2c00, 0xad06, 0x0120, - 0x6000, 0xa005, 0x1108, 0x2d00, 0x2060, 0x681a, 0x6034, 0xa084, - 0x000f, 0xa080, 0x2318, 0x2045, 0x88ff, 0x090c, 0x151a, 0x0005, - 0x0000, 0x0011, 0x0015, 0x0019, 0x001d, 0x0021, 0x0025, 0x0029, - 0x0000, 0x000f, 0x0015, 0x001b, 0x0021, 0x0027, 0x0000, 0x0000, - 0x0000, 0x22fd, 0x22f9, 0x0000, 0x0000, 0x2307, 0x0000, 0x22fd, - 0x0000, 0x2304, 0x2301, 0x0000, 0x0000, 0x0000, 0x2307, 0x2304, - 0x0000, 0x22ff, 0x22ff, 0x0000, 0x0000, 0x2307, 0x0000, 0x22ff, - 0x0000, 0x2305, 0x2305, 0x0000, 0x0000, 0x0000, 0x2307, 0x2305, - 0x00a6, 0x0096, 0x0086, 0x6b2e, 0x6c2a, 0x6858, 0xa055, 0x0904, - 0x23b9, 0x2d60, 0x6034, 0xa0cc, 0x000f, 0xa9c0, 0x2308, 0xa986, - 0x0007, 0x0130, 0xa986, 0x000e, 0x0118, 0xa986, 0x000f, 0x1120, - 0x605c, 0xa422, 0x6060, 0xa31b, 0x2805, 0xa045, 0x1140, 0x0310, - 0x0804, 0x23b9, 0x6004, 0xa065, 0x0904, 0x23b9, 0x0c18, 0x2805, - 0xa005, 0x01a8, 0xac68, 0xd99c, 0x1128, 0x6808, 0xa422, 0x680c, - 0xa31b, 0x0020, 0x6810, 0xa422, 0x6814, 0xa31b, 0x0620, 0x2300, - 0xa405, 0x0150, 0x8a51, 0x0904, 0x23b9, 0x8840, 0x0c40, 0x6004, - 0xa065, 0x0904, 0x23b9, 0x0830, 0x8a51, 0x0904, 0x23b9, 0x8840, - 0x2805, 0xa005, 0x1158, 0x6004, 0xa065, 0x0904, 0x23b9, 0x6034, - 0xa0cc, 0x000f, 0xa9c0, 0x2308, 0x2805, 0x2040, 0x2b68, 0x6850, - 0xc0fc, 0x6852, 0x0458, 0x8422, 0x8420, 0x831a, 0xa399, 0x0000, - 0x00d6, 0x2b68, 0x6c6e, 0x6b72, 0x00de, 0xd99c, 0x1168, 0x6908, - 0x2400, 0xa122, 0x690c, 0x2300, 0xa11b, 0x0a0c, 0x151a, 0x6800, - 0xa420, 0x6804, 0xa319, 0x0060, 0x6910, 0x2400, 0xa122, 0x6914, - 0x2300, 0xa11b, 0x0a0c, 0x151a, 0x6800, 0xa420, 0x6804, 0xa319, - 0x2b68, 0x6c1e, 0x6b22, 0x6850, 0xc0fd, 0x6852, 0x2c00, 0x681a, - 0x2800, 0x6832, 0x2a00, 0x6826, 0x000e, 0x000e, 0x000e, 0xa006, - 0x0028, 0x008e, 0x009e, 0x00ae, 0xa085, 0x0001, 0x0005, 0x2001, - 0x0005, 0x2004, 0xa084, 0x0007, 0x0002, 0x23cd, 0x23ce, 0x23d1, - 0x23d4, 0x23d9, 0x23dc, 0x23e1, 0x23e6, 0x0005, 0x080c, 0x216d, - 0x0005, 0x080c, 0x1b22, 0x0005, 0x080c, 0x1b22, 0x080c, 0x216d, - 0x0005, 0x080c, 0x1720, 0x0005, 0x080c, 0x216d, 0x080c, 0x1720, - 0x0005, 0x080c, 0x1b22, 0x080c, 0x1720, 0x0005, 0x080c, 0x1b22, - 0x080c, 0x216d, 0x080c, 0x1720, 0x0005, 0x0006, 0x7000, 0xa086, - 0x0001, 0x1158, 0x701c, 0xa506, 0x1140, 0x7020, 0xa406, 0x1128, - 0x7024, 0xa706, 0x1110, 0x7028, 0xa606, 0x000e, 0x0005, 0x0126, - 0x2091, 0x2600, 0x2079, 0x0200, 0x2071, 0xbc80, 0x2069, 0xb600, - 0x080c, 0x24f5, 0x080c, 0x24e5, 0x2009, 0x0004, 0x7912, 0x7817, - 0x0004, 0x080c, 0x282d, 0x781b, 0x0002, 0x20e1, 0x9080, 0x20e1, - 0x4000, 0x20a9, 0x0080, 0x782f, 0x0000, 0x1f04, 0x241b, 0x20e1, - 0x9080, 0x783b, 0x001f, 0x20e1, 0x8700, 0x012e, 0x0005, 0x0126, - 0x2091, 0x2600, 0x781c, 0xd0a4, 0x190c, 0x24e2, 0xa084, 0x0007, - 0x0002, 0x244b, 0x2439, 0x243c, 0x243f, 0x2444, 0x2446, 0x2448, - 0x244a, 0x080c, 0x6436, 0x0078, 0x080c, 0x6475, 0x0060, 0x080c, - 0x6436, 0x080c, 0x6475, 0x0038, 0x0041, 0x0028, 0x0031, 0x0018, - 0x0021, 0x0008, 0x0011, 0x012e, 0x0005, 0x0006, 0x0016, 0x0026, - 0x080c, 0xb50c, 0x7930, 0xa184, 0x0003, 0x01b0, 0x2001, 0xb8f0, - 0x2004, 0xa005, 0x0170, 0x2001, 0x0133, 0x2004, 0xa005, 0x090c, - 0x151a, 0x00c6, 0x2001, 0xb8f0, 0x2064, 0x080c, 0x99e6, 0x00ce, - 0x04b8, 0x20e1, 0x9040, 0x04a0, 0xa184, 0x0030, 0x01e0, 0x6a00, - 0xa286, 0x0003, 0x1108, 0x00a0, 0x080c, 0x5b41, 0x1178, 0x2001, - 0xb89f, 0x2003, 0x0001, 0x2001, 0xb600, 0x2003, 0x0001, 0xa085, - 0x0001, 0x080c, 0x5b85, 0x080c, 0x5a79, 0x0010, 0x080c, 0x4b7b, - 0x080c, 0x24e5, 0x00a8, 0xa184, 0x00c0, 0x0168, 0x00e6, 0x0036, - 0x0046, 0x0056, 0x2071, 0xb924, 0x080c, 0x1e1a, 0x005e, 0x004e, - 0x003e, 0x00ee, 0x0028, 0xa184, 0x0300, 0x0110, 0x20e1, 0x9020, - 0x7932, 0x002e, 0x001e, 0x000e, 0x0005, 0x0016, 0x00e6, 0x00f6, - 0x2071, 0xb600, 0x7128, 0x2001, 0xb891, 0x2102, 0x2001, 0xb899, - 0x2102, 0xa182, 0x0211, 0x1218, 0x2009, 0x0008, 0x0400, 0xa182, - 0x0259, 0x1218, 0x2009, 0x0007, 0x00d0, 0xa182, 0x02c1, 0x1218, - 0x2009, 0x0006, 0x00a0, 0xa182, 0x0349, 0x1218, 0x2009, 0x0005, - 0x0070, 0xa182, 0x0421, 0x1218, 0x2009, 0x0004, 0x0040, 0xa182, - 0x0581, 0x1218, 0x2009, 0x0003, 0x0010, 0x2009, 0x0002, 0x2079, - 0x0200, 0x7912, 0x7817, 0x0004, 0x080c, 0x282d, 0x00fe, 0x00ee, - 0x001e, 0x0005, 0x7938, 0x080c, 0x151a, 0x00e6, 0x0026, 0x2071, - 0x0200, 0x20e1, 0x1000, 0x7220, 0x7028, 0x7020, 0xa206, 0x0de0, - 0x20e1, 0x9010, 0x002e, 0x00ee, 0x0005, 0x20e1, 0xa000, 0x7837, - 0x0001, 0x782f, 0x0000, 0x782f, 0x0000, 0x782f, 0x0000, 0x782f, - 0x0000, 0x7837, 0x0005, 0x20a9, 0x0210, 0x7830, 0xd0bc, 0x1110, - 0x1f04, 0x2505, 0x7837, 0x0001, 0x7837, 0x0000, 0xe000, 0xe000, - 0x20e1, 0xa000, 0x0005, 0x0126, 0x2091, 0x2800, 0x2061, 0x0100, - 0x2071, 0xb600, 0x6024, 0x6026, 0x6053, 0x0030, 0x080c, 0x286c, - 0x6050, 0xa084, 0xfe7f, 0x6052, 0x2009, 0x00ef, 0x6132, 0x6136, - 0x080c, 0x287c, 0x60e7, 0x0000, 0x61ea, 0x60e3, 0x0008, 0x604b, - 0xf7f7, 0x6043, 0x0000, 0x602f, 0x0080, 0x602f, 0x0000, 0x6007, - 0x0e9f, 0x601b, 0x001e, 0x600f, 0x00ff, 0x2001, 0xb88d, 0x2003, - 0x00ff, 0x602b, 0x002f, 0x012e, 0x0005, 0x2001, 0xb632, 0x2003, - 0x0000, 0x2001, 0xb631, 0x2003, 0x0001, 0x0005, 0x0126, 0x2091, - 0x2800, 0x0006, 0x0016, 0x0026, 0x6124, 0xa184, 0x1e2c, 0x1118, - 0xa184, 0x0007, 0x002a, 0xa195, 0x0004, 0xa284, 0x0007, 0x0002, - 0x2582, 0x2568, 0x256b, 0x256e, 0x2573, 0x2575, 0x2579, 0x257d, - 0x080c, 0x6be6, 0x00b8, 0x080c, 0x6cc1, 0x00a0, 0x080c, 0x6cc1, - 0x080c, 0x6be6, 0x0078, 0x0099, 0x0068, 0x080c, 0x6be6, 0x0079, - 0x0048, 0x080c, 0x6cc1, 0x0059, 0x0028, 0x080c, 0x6cc1, 0x080c, - 0x6be6, 0x0029, 0x002e, 0x001e, 0x000e, 0x012e, 0x0005, 0x6124, - 0x6028, 0xd09c, 0x0118, 0xd19c, 0x1904, 0x279b, 0x080c, 0x5b41, - 0x0578, 0x7000, 0xa086, 0x0003, 0x0198, 0x6024, 0xa084, 0x1800, - 0x0178, 0x080c, 0x5b67, 0x0118, 0x080c, 0x5b53, 0x1148, 0x6027, - 0x0020, 0x6043, 0x0000, 0x2001, 0xb89e, 0x2003, 0xaaaa, 0x0458, - 0x080c, 0x5b67, 0x15d0, 0x6024, 0xa084, 0x1800, 0x1108, 0x04a8, - 0x2001, 0xb89e, 0x2003, 0xaaaa, 0x2001, 0xb89f, 0x2003, 0x0001, - 0x2001, 0xb600, 0x2003, 0x0001, 0x080c, 0x5a79, 0x0804, 0x279b, - 0xd1ac, 0x1518, 0x6024, 0xd0dc, 0x1170, 0xd0e4, 0x1188, 0xd0d4, - 0x11a0, 0xd0cc, 0x0130, 0x708c, 0xa086, 0x0028, 0x1110, 0x080c, - 0x5cd0, 0x0804, 0x279b, 0x2001, 0xb89f, 0x2003, 0x0000, 0x0048, - 0x2001, 0xb89f, 0x2003, 0x0002, 0x0020, 0x080c, 0x5c43, 0x0804, - 0x279b, 0x080c, 0x5d75, 0x0804, 0x279b, 0xd1ac, 0x0904, 0x26e3, - 0x080c, 0x5b41, 0x11d8, 0x6027, 0x0020, 0x0006, 0x0026, 0x0036, - 0x080c, 0x5b5d, 0x1170, 0x2001, 0xb89f, 0x2003, 0x0001, 0x2001, - 0xb600, 0x2003, 0x0001, 0x080c, 0x5a79, 0x003e, 0x002e, 0x000e, - 0x0005, 0x003e, 0x002e, 0x000e, 0x080c, 0x5b18, 0x0016, 0x0046, - 0x00c6, 0x644c, 0xa486, 0xf0f0, 0x1138, 0x2061, 0x0100, 0x644a, - 0x6043, 0x0090, 0x6043, 0x0010, 0x74ce, 0xa48c, 0xff00, 0x7034, - 0xd084, 0x0178, 0xa186, 0xf800, 0x1160, 0x703c, 0xd084, 0x1148, - 0xc085, 0x703e, 0x0036, 0x2418, 0x2011, 0x8016, 0x080c, 0x3f13, - 0x003e, 0xa196, 0xff00, 0x05b8, 0x7054, 0xa084, 0x00ff, 0x810f, - 0xa116, 0x0588, 0x7130, 0xd184, 0x1570, 0x2011, 0xb653, 0x2214, - 0xd2ec, 0x0138, 0xc18d, 0x7132, 0x2011, 0xb653, 0x2214, 0xd2ac, - 0x1510, 0x6240, 0xa294, 0x0010, 0x0130, 0x6248, 0xa294, 0xff00, - 0xa296, 0xff00, 0x01c0, 0x7030, 0xd08c, 0x0904, 0x26b0, 0x7034, - 0xd08c, 0x1140, 0x2001, 0xb60c, 0x200c, 0xd1ac, 0x1904, 0x26b0, - 0xc1ad, 0x2102, 0x0036, 0x73cc, 0x2011, 0x8013, 0x080c, 0x3f13, - 0x003e, 0x0804, 0x26b0, 0x7034, 0xd08c, 0x1140, 0x2001, 0xb60c, - 0x200c, 0xd1ac, 0x1904, 0x26b0, 0xc1ad, 0x2102, 0x0036, 0x73cc, - 0x2011, 0x8013, 0x080c, 0x3f13, 0x003e, 0x7130, 0xc185, 0x7132, - 0x2011, 0xb653, 0x220c, 0xd1a4, 0x01d0, 0x0016, 0x2009, 0x0001, - 0x2011, 0x0100, 0x080c, 0x6b8c, 0x2019, 0x000e, 0x080c, 0xb121, - 0xa484, 0x00ff, 0xa080, 0x2df9, 0x200d, 0xa18c, 0xff00, 0x810f, - 0x8127, 0xa006, 0x2009, 0x000e, 0x080c, 0xb1a4, 0x001e, 0xd1ac, - 0x1148, 0x0016, 0x2009, 0x0000, 0x2019, 0x0004, 0x080c, 0x2ca4, - 0x001e, 0x0070, 0x0156, 0x20a9, 0x007f, 0x2009, 0x0000, 0x080c, - 0x501b, 0x1110, 0x080c, 0x4c7e, 0x8108, 0x1f04, 0x26a7, 0x015e, - 0x00ce, 0x004e, 0x2011, 0x0003, 0x080c, 0x80fc, 0x2011, 0x0002, - 0x080c, 0x8106, 0x080c, 0x7fe0, 0x0036, 0x2019, 0x0000, 0x080c, - 0x806b, 0x003e, 0x60e3, 0x0000, 0x001e, 0x2001, 0xb600, 0x2014, - 0xa296, 0x0004, 0x1128, 0xd19c, 0x11b0, 0x6228, 0xc29d, 0x622a, - 0x2003, 0x0001, 0x2001, 0xb623, 0x2003, 0x0000, 0x6027, 0x0020, - 0x080c, 0x5b67, 0x1140, 0x0016, 0x2009, 0x07d0, 0x2011, 0x5a56, - 0x080c, 0x6a94, 0x001e, 0xd194, 0x0904, 0x279b, 0x0016, 0x6220, - 0xd2b4, 0x0904, 0x274c, 0x080c, 0x6a82, 0x080c, 0x7df3, 0x6027, - 0x0004, 0x00f6, 0x2019, 0xb8ea, 0x2304, 0xa07d, 0x0570, 0x7804, - 0xa086, 0x0032, 0x1550, 0x00d6, 0x00c6, 0x00e6, 0x2069, 0x0140, - 0x618c, 0x6288, 0x7818, 0x608e, 0x7808, 0x608a, 0x6043, 0x0002, - 0x2001, 0x0003, 0x8001, 0x1df0, 0x6043, 0x0000, 0x6803, 0x1000, - 0x6803, 0x0000, 0x618e, 0x628a, 0x080c, 0x7102, 0x080c, 0x71e5, - 0x7810, 0x2070, 0x7037, 0x0103, 0x2f60, 0x080c, 0x86a4, 0x00ee, - 0x00ce, 0x00de, 0x00fe, 0x001e, 0x0005, 0x00fe, 0x00d6, 0x2069, - 0x0140, 0x6804, 0xa084, 0x4000, 0x0120, 0x6803, 0x1000, 0x6803, - 0x0000, 0x00de, 0x00c6, 0x2061, 0xb8e1, 0x6028, 0xa09a, 0x00c8, - 0x1238, 0x8000, 0x602a, 0x00ce, 0x080c, 0x7de6, 0x0804, 0x279a, - 0x2019, 0xb8ea, 0x2304, 0xa065, 0x0120, 0x2009, 0x0027, 0x080c, - 0x86d3, 0x00ce, 0x0804, 0x279a, 0xd2bc, 0x0904, 0x279a, 0x080c, - 0x6a8f, 0x6014, 0xa084, 0x0184, 0xa085, 0x0010, 0x6016, 0x6027, - 0x0004, 0x00d6, 0x2069, 0x0140, 0x6804, 0xa084, 0x4000, 0x0120, - 0x6803, 0x1000, 0x6803, 0x0000, 0x00de, 0x00c6, 0x2061, 0xb8e1, - 0x6044, 0xa09a, 0x00c8, 0x12f0, 0x8000, 0x6046, 0x603c, 0x00ce, - 0xa005, 0x0540, 0x2009, 0x07d0, 0x080c, 0x6a87, 0xa080, 0x0007, - 0x2004, 0xa086, 0x0006, 0x1138, 0x6114, 0xa18c, 0x0184, 0xa18d, - 0x0012, 0x6116, 0x00b8, 0x6114, 0xa18c, 0x0184, 0xa18d, 0x0016, - 0x6116, 0x0080, 0x0036, 0x2019, 0x0001, 0x080c, 0x806b, 0x003e, - 0x2019, 0xb8f0, 0x2304, 0xa065, 0x0120, 0x2009, 0x004f, 0x080c, - 0x86d3, 0x00ce, 0x001e, 0xd19c, 0x0904, 0x27f4, 0x7034, 0xd0ac, - 0x1560, 0x0016, 0x0156, 0x6027, 0x0008, 0x602f, 0x0020, 0x20a9, - 0x0006, 0x1d04, 0x27a9, 0x2091, 0x6000, 0x1f04, 0x27a9, 0x602f, - 0x0000, 0x6150, 0xa185, 0x1400, 0x6052, 0x20a9, 0x0366, 0x1d04, - 0x27b7, 0x2091, 0x6000, 0x6020, 0xd09c, 0x1130, 0x015e, 0x6152, - 0x001e, 0x6027, 0x0008, 0x0480, 0x080c, 0x293c, 0x1f04, 0x27b7, - 0x015e, 0x6152, 0x001e, 0x6027, 0x0008, 0x0016, 0x6028, 0xc09c, - 0x602a, 0x2011, 0x0003, 0x080c, 0x80fc, 0x2011, 0x0002, 0x080c, - 0x8106, 0x080c, 0x7fe0, 0x0036, 0x2019, 0x0000, 0x080c, 0x806b, - 0x003e, 0x60e3, 0x0000, 0x080c, 0xb4eb, 0x080c, 0xb506, 0xa085, - 0x0001, 0x080c, 0x5b85, 0x2001, 0xb600, 0x2003, 0x0004, 0x6027, - 0x0008, 0x080c, 0x12e2, 0x001e, 0xa18c, 0xffd0, 0x6126, 0x0005, - 0x0006, 0x0016, 0x0026, 0x00e6, 0x00f6, 0x0126, 0x2091, 0x8000, - 0x2071, 0xb600, 0x71c4, 0x70c6, 0xa116, 0x0500, 0x81ff, 0x0128, - 0x2011, 0x8011, 0x080c, 0x3f13, 0x00c8, 0x2011, 0x8012, 0x080c, - 0x3f13, 0x2001, 0xb672, 0x2004, 0xd0fc, 0x1180, 0x0036, 0x00c6, - 0x080c, 0x28c7, 0x080c, 0x7fbc, 0x2061, 0x0100, 0x2019, 0x0028, - 0x2009, 0x0000, 0x080c, 0x2ca4, 0x00ce, 0x003e, 0x012e, 0x00fe, - 0x00ee, 0x002e, 0x001e, 0x000e, 0x0005, 0x00c6, 0x00f6, 0x0006, - 0x0026, 0x2061, 0x0100, 0xa190, 0x2840, 0x2205, 0x60f2, 0x2011, - 0x284d, 0x2205, 0x60ee, 0x002e, 0x000e, 0x00fe, 0x00ce, 0x0005, - 0x0840, 0x0840, 0x0840, 0x0580, 0x0420, 0x0348, 0x02c0, 0x0258, - 0x0210, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x0140, 0x00f8, 0x00d0, - 0x00b0, 0x00a0, 0x2028, 0xa18c, 0x00ff, 0x2130, 0xa094, 0xff00, - 0x1110, 0x81ff, 0x0118, 0x080c, 0x6723, 0x0038, 0xa080, 0x2df9, - 0x200d, 0xa18c, 0xff00, 0x810f, 0xa006, 0x0005, 0xa080, 0x2df9, - 0x200d, 0xa18c, 0x00ff, 0x0005, 0x00d6, 0x2069, 0x0140, 0x2001, - 0xb615, 0x2003, 0x00ef, 0x20a9, 0x0010, 0xa006, 0x6852, 0x6856, - 0x1f04, 0x2877, 0x00de, 0x0005, 0x0006, 0x00d6, 0x0026, 0x2069, - 0x0140, 0x2001, 0xb615, 0x2102, 0x8114, 0x8214, 0x8214, 0x8214, - 0x20a9, 0x0010, 0x6853, 0x0000, 0xa006, 0x82ff, 0x1128, 0xa184, - 0x000f, 0xa080, 0xb51a, 0x2005, 0x6856, 0x8211, 0x1f04, 0x288c, - 0x002e, 0x00de, 0x000e, 0x0005, 0x00c6, 0x2061, 0xb600, 0x6030, - 0x0110, 0xc09d, 0x0008, 0xc09c, 0x6032, 0x00ce, 0x0005, 0x0156, - 0x00d6, 0x0026, 0x0016, 0x0006, 0x2069, 0x0140, 0x6980, 0xa116, - 0x0180, 0xa112, 0x1230, 0x8212, 0x8210, 0x22a8, 0x2001, 0x0402, - 0x0018, 0x22a8, 0x2001, 0x0404, 0x680e, 0x1f04, 0x28bc, 0x680f, - 0x0000, 0x000e, 0x001e, 0x002e, 0x00de, 0x015e, 0x0005, 0x2001, - 0xb653, 0x2004, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0xa006, 0x0046, - 0x2020, 0x2009, 0x002e, 0x080c, 0xb1a4, 0x004e, 0x0005, 0x00f6, - 0x0016, 0x0026, 0x2079, 0x0140, 0x78c4, 0xd0dc, 0x0548, 0xa084, - 0x0700, 0xa08e, 0x0300, 0x1520, 0x2011, 0x0000, 0x2009, 0x0002, - 0x2300, 0xa080, 0x0020, 0x2018, 0x2300, 0x080c, 0x6bb2, 0x2011, - 0x0030, 0x2200, 0x8007, 0xa085, 0x004c, 0x78c2, 0x2009, 0x0204, - 0x210c, 0x2200, 0xa100, 0x2009, 0x0138, 0x200a, 0x080c, 0x5b41, - 0x1118, 0x2009, 0xb88f, 0x200a, 0x002e, 0x001e, 0x00fe, 0x0005, - 0x78c3, 0x0000, 0x0cc8, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, - 0x0026, 0x2001, 0x0170, 0x200c, 0x8000, 0x2014, 0xa184, 0x0003, - 0x0110, 0x0804, 0x1b20, 0x002e, 0x001e, 0x000e, 0x012e, 0x0005, - 0x0006, 0x2001, 0x0100, 0x2004, 0xa082, 0x0005, 0x000e, 0x0268, - 0x2001, 0x0170, 0x200c, 0xa18c, 0x00ff, 0xa18e, 0x004c, 0x1128, - 0x200c, 0xa18c, 0xff00, 0x810f, 0x0010, 0x2009, 0x0000, 0x2001, - 0x0204, 0x2004, 0xa108, 0x0005, 0x0006, 0x0156, 0x00f6, 0x2079, - 0x0100, 0x20a9, 0x000a, 0x7854, 0xd08c, 0x1110, 0x1f04, 0x2943, - 0x00fe, 0x015e, 0x000e, 0x0005, 0x0016, 0x00c6, 0x0006, 0x2061, - 0x0100, 0x6030, 0x0006, 0x6048, 0x0006, 0x60e4, 0x0006, 0x60e8, - 0x0006, 0x6050, 0x0006, 0x60f0, 0x0006, 0x60ec, 0x0006, 0x600c, - 0x0006, 0x6004, 0x0006, 0x6028, 0x0006, 0x60e0, 0x0006, 0x602f, - 0x0100, 0x602f, 0x0000, 0xe000, 0xe000, 0xe000, 0xe000, 0x602f, - 0x0040, 0x602f, 0x0000, 0x000e, 0x60e2, 0x000e, 0x602a, 0x000e, - 0x6006, 0x000e, 0x600e, 0x000e, 0x60ee, 0x000e, 0x60f2, 0x000e, - 0x6052, 0x000e, 0x60ea, 0x000e, 0x60e6, 0x000e, 0x604a, 0x000e, - 0x6032, 0x6036, 0x2008, 0x080c, 0x287c, 0x000e, 0x00ce, 0x001e, - 0x0005, 0x2009, 0x0171, 0x2104, 0xd0dc, 0x0140, 0x2009, 0x0170, - 0x2104, 0x200b, 0x0080, 0xe000, 0xe000, 0x200a, 0x0005, 0x2a2f, - 0x2a33, 0x2a37, 0x2a3d, 0x2a43, 0x2a49, 0x2a4f, 0x2a57, 0x2a5f, - 0x2a65, 0x2a6b, 0x2a73, 0x2a7b, 0x2a83, 0x2a8b, 0x2a95, 0x2ae2, - 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, - 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2a9f, - 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, - 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, 0x2ae2, - 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, - 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2aa1, - 0x2aa1, 0x2aa7, 0x2aa7, 0x2aae, 0x2aae, 0x2ab5, 0x2ab5, 0x2abe, - 0x2abe, 0x2ac5, 0x2ac5, 0x2ace, 0x2ace, 0x2ad7, 0x2ad7, 0x2ae2, - 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, - 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2a9f, - 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, - 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, 0x2ae2, - 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, - 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2ae2, 0x2a9f, - 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, - 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, 0x2a9f, 0x0106, - 0x0006, 0x0804, 0x2aea, 0x0106, 0x0006, 0x0804, 0x2aea, 0x0106, - 0x0006, 0x080c, 0x254e, 0x0804, 0x2aea, 0x0106, 0x0006, 0x080c, - 0x254e, 0x0804, 0x2aea, 0x0106, 0x0006, 0x080c, 0x23bf, 0x0804, - 0x2aea, 0x0106, 0x0006, 0x080c, 0x23bf, 0x0804, 0x2aea, 0x0106, - 0x0006, 0x080c, 0x254e, 0x080c, 0x23bf, 0x0804, 0x2aea, 0x0106, - 0x0006, 0x080c, 0x254e, 0x080c, 0x23bf, 0x0804, 0x2aea, 0x0106, - 0x0006, 0x080c, 0x2427, 0x0804, 0x2aea, 0x0106, 0x0006, 0x080c, - 0x2427, 0x0804, 0x2aea, 0x0106, 0x0006, 0x080c, 0x254e, 0x080c, - 0x2427, 0x0804, 0x2aea, 0x0106, 0x0006, 0x080c, 0x254e, 0x080c, - 0x2427, 0x0804, 0x2aea, 0x0106, 0x0006, 0x080c, 0x23bf, 0x080c, - 0x2427, 0x0804, 0x2aea, 0x0106, 0x0006, 0x080c, 0x23bf, 0x080c, - 0x2427, 0x0804, 0x2aea, 0x0106, 0x0006, 0x080c, 0x254e, 0x080c, - 0x23bf, 0x080c, 0x2427, 0x0804, 0x2aea, 0x0106, 0x0006, 0x080c, - 0x254e, 0x080c, 0x23bf, 0x080c, 0x2427, 0x0804, 0x2aea, 0xe000, - 0x0cf0, 0x0106, 0x0006, 0x080c, 0x290b, 0x0804, 0x2aea, 0x0106, - 0x0006, 0x080c, 0x290b, 0x080c, 0x254e, 0x04e0, 0x0106, 0x0006, - 0x080c, 0x290b, 0x080c, 0x23bf, 0x04a8, 0x0106, 0x0006, 0x080c, - 0x290b, 0x080c, 0x254e, 0x080c, 0x23bf, 0x0460, 0x0106, 0x0006, - 0x080c, 0x290b, 0x080c, 0x2427, 0x0428, 0x0106, 0x0006, 0x080c, - 0x290b, 0x080c, 0x254e, 0x080c, 0x2427, 0x00e0, 0x0106, 0x0006, - 0x080c, 0x290b, 0x080c, 0x23bf, 0x080c, 0x2427, 0x0098, 0x0106, - 0x0006, 0x080c, 0x290b, 0x080c, 0x254e, 0x080c, 0x23bf, 0x080c, - 0x2427, 0x0040, 0x20d1, 0x0000, 0x20d1, 0x0001, 0x20d1, 0x0000, - 0x080c, 0x151a, 0x000e, 0x010e, 0x000d, 0x00c6, 0x0026, 0x0046, - 0x2021, 0x0000, 0x080c, 0x537b, 0x1904, 0x2bca, 0x72d4, 0x2001, - 0xb89e, 0x2004, 0xa005, 0x1110, 0xd29c, 0x0148, 0xd284, 0x1138, - 0xd2bc, 0x1904, 0x2bca, 0x080c, 0x2bce, 0x0804, 0x2bca, 0xd2cc, - 0x1904, 0x2bca, 0x080c, 0x5b41, 0x1120, 0x709f, 0xffff, 0x0804, - 0x2bca, 0xd294, 0x0120, 0x709f, 0xffff, 0x0804, 0x2bca, 0x2001, - 0xb615, 0x203c, 0x7288, 0xd284, 0x0904, 0x2b6c, 0xd28c, 0x1904, - 0x2b6c, 0x0036, 0x739c, 0xa38e, 0xffff, 0x1110, 0x2019, 0x0001, - 0x8314, 0xa2e0, 0xbdc0, 0x2c04, 0xa38c, 0x0001, 0x0120, 0xa084, - 0xff00, 0x8007, 0x0010, 0xa084, 0x00ff, 0xa70e, 0x0560, 0xa08e, - 0x0000, 0x0548, 0xa08e, 0x00ff, 0x1150, 0x7230, 0xd284, 0x1538, - 0x7288, 0xc28d, 0x728a, 0x709f, 0xffff, 0x003e, 0x0428, 0x2009, - 0x0000, 0x080c, 0x2852, 0x080c, 0x4fbf, 0x11b8, 0x6004, 0xa084, - 0x00ff, 0xa086, 0x0006, 0x1150, 0x7030, 0xd08c, 0x0118, 0x6000, - 0xd0bc, 0x0120, 0x080c, 0x2be1, 0x0140, 0x0028, 0x080c, 0x2d12, - 0x080c, 0x2c0f, 0x0110, 0x8318, 0x0818, 0x739e, 0x0010, 0x709f, - 0xffff, 0x003e, 0x0804, 0x2bca, 0xa780, 0x2df9, 0x203d, 0xa7bc, - 0xff00, 0x873f, 0x2041, 0x007e, 0x709c, 0xa096, 0xffff, 0x1120, - 0x2009, 0x0000, 0x28a8, 0x0050, 0xa812, 0x0220, 0x2008, 0xa802, - 0x20a8, 0x0020, 0x709f, 0xffff, 0x0804, 0x2bca, 0x2700, 0x0156, - 0x0016, 0xa106, 0x05a0, 0xc484, 0x080c, 0x501b, 0x0120, 0x080c, - 0x4fbf, 0x15a8, 0x0008, 0xc485, 0x6004, 0xa084, 0x00ff, 0xa086, - 0x0006, 0x1130, 0x7030, 0xd08c, 0x01e8, 0x6000, 0xd0bc, 0x11d0, - 0x7288, 0xd28c, 0x0188, 0x6004, 0xa084, 0x00ff, 0xa082, 0x0006, - 0x02b0, 0xd484, 0x1118, 0x080c, 0x4fde, 0x0028, 0x080c, 0x2d9f, - 0x0170, 0x080c, 0x2dcc, 0x0058, 0x080c, 0x2d12, 0x080c, 0x2c0f, - 0x0170, 0x0028, 0x080c, 0x2d9f, 0x0110, 0x0419, 0x0140, 0x001e, - 0x8108, 0x015e, 0x1f04, 0x2b86, 0x709f, 0xffff, 0x0018, 0x001e, - 0x015e, 0x719e, 0x004e, 0x002e, 0x00ce, 0x0005, 0x00c6, 0x0016, - 0x709f, 0x0001, 0x2009, 0x007e, 0x080c, 0x4fbf, 0x1138, 0x080c, - 0x2d12, 0x04a9, 0x0118, 0x70d4, 0xc0bd, 0x70d6, 0x001e, 0x00ce, - 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2c68, 0x2001, 0xb657, - 0x2004, 0xa084, 0x00ff, 0x6842, 0x080c, 0x9f92, 0x01d8, 0x2d00, - 0x601a, 0x080c, 0xa0e3, 0x601f, 0x0001, 0x2001, 0x0000, 0x080c, - 0x4f5d, 0x2001, 0x0000, 0x080c, 0x4f6f, 0x0126, 0x2091, 0x8000, - 0x7098, 0x8000, 0x709a, 0x012e, 0x2009, 0x0004, 0x080c, 0x86d3, - 0xa085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x0016, - 0x0076, 0x00d6, 0x00c6, 0x2c68, 0x2001, 0xb657, 0x2004, 0xa084, - 0x00ff, 0x6842, 0x080c, 0x9f92, 0x0550, 0x2d00, 0x601a, 0x6800, - 0xc0c4, 0x6802, 0x68a0, 0xa086, 0x007e, 0x0140, 0x6804, 0xa084, - 0x00ff, 0xa086, 0x0006, 0x1110, 0x080c, 0x2cd1, 0x080c, 0xa0e3, - 0x601f, 0x0001, 0x2001, 0x0000, 0x080c, 0x4f5d, 0x2001, 0x0002, - 0x080c, 0x4f6f, 0x0126, 0x2091, 0x8000, 0x7098, 0x8000, 0x709a, - 0x012e, 0x2009, 0x0002, 0x080c, 0x86d3, 0xa085, 0x0001, 0x00ce, - 0x00de, 0x007e, 0x001e, 0x0005, 0x00c6, 0x0026, 0x2009, 0x0080, - 0x080c, 0x4fbf, 0x1120, 0x0031, 0x0110, 0x70db, 0xffff, 0x002e, - 0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2c68, 0x080c, - 0x864e, 0x01e8, 0x2d00, 0x601a, 0x080c, 0xa0e3, 0x601f, 0x0001, - 0x2001, 0x0000, 0x080c, 0x4f5d, 0x2001, 0x0002, 0x080c, 0x4f6f, - 0x0126, 0x2091, 0x8000, 0x080c, 0x2cd1, 0x70dc, 0x8000, 0x70de, - 0x012e, 0x2009, 0x0002, 0x080c, 0x86d3, 0xa085, 0x0001, 0x00ce, - 0x00de, 0x007e, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0126, 0x2091, - 0x8000, 0x2009, 0x007f, 0x080c, 0x4fbf, 0x1190, 0x2c68, 0x080c, - 0x864e, 0x0170, 0x2d00, 0x601a, 0x6312, 0x601f, 0x0001, 0x620a, - 0x080c, 0xa0e3, 0x2009, 0x0022, 0x080c, 0x86d3, 0xa085, 0x0001, - 0x012e, 0x00de, 0x00ce, 0x0005, 0x00e6, 0x00c6, 0x0066, 0x0036, - 0x0026, 0x080c, 0x6e73, 0x080c, 0x6e16, 0x080c, 0x90fb, 0x2130, - 0x81ff, 0x0128, 0x20a9, 0x007e, 0x2009, 0x0000, 0x0020, 0x20a9, - 0x007f, 0x2009, 0x0000, 0x0016, 0x080c, 0x501b, 0x1120, 0x080c, - 0x521c, 0x080c, 0x4c7e, 0x001e, 0x8108, 0x1f04, 0x2cbb, 0x86ff, - 0x1110, 0x080c, 0x11f5, 0x002e, 0x003e, 0x006e, 0x00ce, 0x00ee, - 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x6218, 0x2270, - 0x72a0, 0x0026, 0x2019, 0x0029, 0x080c, 0x6e67, 0x0076, 0x2039, - 0x0000, 0x080c, 0x6d74, 0x2c08, 0x080c, 0xaf3e, 0x007e, 0x001e, - 0x2e60, 0x080c, 0x521c, 0x6210, 0x6314, 0x080c, 0x4c7e, 0x6212, - 0x6316, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6, - 0x0006, 0x6018, 0xa080, 0x0028, 0x2004, 0xa086, 0x0080, 0x0150, - 0x2071, 0xb600, 0x7098, 0xa005, 0x0110, 0x8001, 0x709a, 0x000e, - 0x00ee, 0x0005, 0x2071, 0xb600, 0x70dc, 0xa005, 0x0dc0, 0x8001, - 0x70de, 0x0ca8, 0x6000, 0xc08c, 0x6002, 0x0005, 0x00f6, 0x00e6, - 0x00c6, 0x0036, 0x0026, 0x0016, 0x0156, 0x2178, 0x81ff, 0x1118, - 0x20a9, 0x0001, 0x0098, 0x2001, 0xb653, 0x2004, 0xd0c4, 0x0150, - 0xd0a4, 0x0140, 0xa006, 0x0046, 0x2020, 0x2009, 0x002d, 0x080c, - 0xb1a4, 0x004e, 0x20a9, 0x00ff, 0x2011, 0x0000, 0x0026, 0xa28e, - 0x007e, 0x0904, 0x2d7e, 0xa28e, 0x007f, 0x0904, 0x2d7e, 0xa28e, - 0x0080, 0x05e0, 0xa288, 0xb735, 0x210c, 0x81ff, 0x05b8, 0x8fff, - 0x1148, 0x2001, 0xb8be, 0x0006, 0x2003, 0x0001, 0x04d9, 0x000e, - 0x2003, 0x0000, 0x00c6, 0x2160, 0x2001, 0x0001, 0x080c, 0x5385, - 0x00ce, 0x2019, 0x0029, 0x080c, 0x6e67, 0x0076, 0x2039, 0x0000, - 0x080c, 0x6d74, 0x00c6, 0x0026, 0x2160, 0x6204, 0xa294, 0x00ff, - 0xa286, 0x0006, 0x1118, 0x6007, 0x0404, 0x0028, 0x2001, 0x0004, - 0x8007, 0xa215, 0x6206, 0x002e, 0x00ce, 0x0016, 0x2c08, 0x080c, - 0xaf3e, 0x001e, 0x007e, 0x2160, 0x080c, 0x521c, 0x002e, 0x8210, - 0x1f04, 0x2d36, 0x015e, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, - 0x00fe, 0x0005, 0x0046, 0x0026, 0x0016, 0x2001, 0xb653, 0x2004, - 0xd0c4, 0x0148, 0xd0a4, 0x0138, 0xa006, 0x2220, 0x8427, 0x2009, - 0x0029, 0x080c, 0xb1a4, 0x001e, 0x002e, 0x004e, 0x0005, 0x0016, - 0x0026, 0x0036, 0x00c6, 0x7288, 0x82ff, 0x01f8, 0x2011, 0xb653, - 0x2214, 0xd2ac, 0x11d0, 0x2100, 0x080c, 0x2866, 0x81ff, 0x01b8, - 0x2019, 0x0001, 0x8314, 0xa2e0, 0xbdc0, 0x2c04, 0xd384, 0x0120, - 0xa084, 0xff00, 0x8007, 0x0010, 0xa084, 0x00ff, 0xa116, 0x0138, - 0xa096, 0x00ff, 0x0110, 0x8318, 0x0c68, 0xa085, 0x0001, 0x00ce, - 0x003e, 0x002e, 0x001e, 0x0005, 0x0016, 0x00c6, 0x0126, 0x2091, - 0x8000, 0x0016, 0x0026, 0x0036, 0x2110, 0x0026, 0x2019, 0x0029, - 0x080c, 0x8320, 0x002e, 0x080c, 0xb449, 0x003e, 0x002e, 0x001e, - 0xa180, 0xb735, 0x2004, 0xa065, 0x0158, 0x0016, 0x00c6, 0x2061, - 0xb9f5, 0x001e, 0x611a, 0x080c, 0x2cd1, 0x001e, 0x080c, 0x4fde, - 0x012e, 0x00ce, 0x001e, 0x0005, 0x2001, 0xb635, 0x2004, 0xd0cc, - 0x0005, 0x7eef, 0x7de8, 0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc, - 0x80da, 0x7ad9, 0x80d6, 0x80d5, 0x80d4, 0x80d3, 0x80d2, 0x80d1, - 0x79ce, 0x78cd, 0x80cc, 0x80cb, 0x80ca, 0x80c9, 0x80c7, 0x80c6, - 0x77c5, 0x76c3, 0x80bc, 0x80ba, 0x75b9, 0x80b6, 0x74b5, 0x73b4, - 0x72b3, 0x80b2, 0x80b1, 0x80ae, 0x71ad, 0x80ac, 0x70ab, 0x6faa, - 0x6ea9, 0x80a7, 0x6da6, 0x6ca5, 0x6ba3, 0x6a9f, 0x699e, 0x689d, - 0x809b, 0x8098, 0x6797, 0x6690, 0x658f, 0x6488, 0x6384, 0x6282, - 0x8081, 0x8080, 0x617c, 0x607a, 0x8079, 0x5f76, 0x8075, 0x8074, - 0x8073, 0x8072, 0x8071, 0x806e, 0x5e6d, 0x806c, 0x5d6b, 0x5c6a, - 0x5b69, 0x8067, 0x5a66, 0x5965, 0x5863, 0x575c, 0x565a, 0x5559, - 0x8056, 0x8055, 0x5454, 0x5353, 0x5252, 0x5151, 0x504e, 0x4f4d, - 0x804c, 0x804b, 0x4e4a, 0x4d49, 0x8047, 0x4c46, 0x8045, 0x8043, - 0x803c, 0x803a, 0x8039, 0x8036, 0x4b35, 0x8034, 0x4a33, 0x4932, - 0x4831, 0x802e, 0x472d, 0x462c, 0x452b, 0x442a, 0x4329, 0x4227, - 0x8026, 0x8025, 0x4123, 0x401f, 0x3f1e, 0x3e1d, 0x3d1b, 0x3c18, - 0x8017, 0x8010, 0x3b0f, 0x3a08, 0x8004, 0x3902, 0x8001, 0x8000, - 0x8000, 0x3800, 0x3700, 0x3600, 0x8000, 0x3500, 0x8000, 0x8000, - 0x8000, 0x3400, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, - 0x3300, 0x3200, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, - 0x3100, 0x3000, 0x8000, 0x8000, 0x2f00, 0x8000, 0x2e00, 0x2d00, - 0x2c00, 0x8000, 0x8000, 0x8000, 0x2b00, 0x8000, 0x2a00, 0x2900, - 0x2800, 0x8000, 0x2700, 0x2600, 0x2500, 0x2400, 0x2300, 0x2200, - 0x8000, 0x8000, 0x2100, 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, - 0x8000, 0x8000, 0x1b00, 0x1a00, 0x8000, 0x1900, 0x8000, 0x8000, - 0x8000, 0x8000, 0x8000, 0x8000, 0x1800, 0x8000, 0x1700, 0x1600, - 0x1500, 0x8000, 0x1400, 0x1300, 0x1200, 0x1100, 0x1000, 0x0f00, - 0x8000, 0x8000, 0x0e00, 0x0d00, 0x0c00, 0x0b00, 0x0a00, 0x0900, - 0x8000, 0x8000, 0x0800, 0x0700, 0x8000, 0x0600, 0x8000, 0x8000, - 0x8000, 0x0500, 0x0400, 0x0300, 0x8000, 0x0200, 0x8000, 0x8000, - 0x8000, 0x0100, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, - 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, - 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, - 0x8000, 0x2071, 0xb682, 0x7003, 0x0002, 0xa006, 0x7012, 0x7016, - 0x703a, 0x703e, 0x7033, 0xb692, 0x7037, 0xb692, 0x7007, 0x0001, - 0x2061, 0xb6d2, 0x6003, 0x0002, 0x0005, 0x1004, 0x2f1f, 0x0e04, - 0x2f1f, 0x2071, 0xb682, 0x2b78, 0x7818, 0xd084, 0x1140, 0x2a60, - 0x7820, 0xa08e, 0x0069, 0x1904, 0x3004, 0x0804, 0x2f9d, 0x0005, - 0x2071, 0xb682, 0x7004, 0x0002, 0x2f28, 0x2f29, 0x2f32, 0x2f43, - 0x0005, 0x1004, 0x2f31, 0x0e04, 0x2f31, 0x2b78, 0x7818, 0xd084, - 0x01e8, 0x0005, 0x2b78, 0x2061, 0xb6d2, 0x6008, 0xa08e, 0x0100, - 0x0128, 0xa086, 0x0200, 0x0904, 0x2ffe, 0x0005, 0x7014, 0x2068, - 0x2a60, 0x7018, 0x0807, 0x7010, 0x2068, 0x6834, 0xa086, 0x0103, - 0x0108, 0x0005, 0x2a60, 0x2b78, 0x7018, 0x0807, 0x2a60, 0x7820, - 0xa08a, 0x0040, 0x1210, 0x61c4, 0x0042, 0x2100, 0xa08a, 0x003f, - 0x1a04, 0x2ffb, 0x61c4, 0x0804, 0x2f9d, 0x2fdf, 0x300a, 0x3012, - 0x3016, 0x301e, 0x3024, 0x3028, 0x3034, 0x3037, 0x3041, 0x3044, - 0x2ffb, 0x2ffb, 0x2ffb, 0x3047, 0x2ffb, 0x3056, 0x306d, 0x3084, - 0x30fe, 0x3103, 0x312c, 0x317d, 0x318e, 0x31ad, 0x31e5, 0x31ef, - 0x31fc, 0x320f, 0x3230, 0x3239, 0x326f, 0x3275, 0x2ffb, 0x329e, - 0x2ffb, 0x2ffb, 0x2ffb, 0x2ffb, 0x2ffb, 0x32a5, 0x32af, 0x2ffb, - 0x2ffb, 0x2ffb, 0x2ffb, 0x2ffb, 0x2ffb, 0x2ffb, 0x2ffb, 0x32b7, - 0x2ffb, 0x2ffb, 0x2ffb, 0x2ffb, 0x2ffb, 0x32c9, 0x32d3, 0x2ffb, - 0x2ffb, 0x2ffb, 0x2ffb, 0x2ffb, 0x2ffb, 0x0002, 0x32fd, 0x3351, - 0x33ac, 0x33c6, 0x2ffb, 0x33f7, 0x382a, 0x427a, 0x2ffb, 0x2ffb, - 0x2ffb, 0x2ffb, 0x2ffb, 0x2ffb, 0x2ffb, 0x2ffb, 0x3041, 0x3044, - 0x382c, 0x2ffb, 0x3839, 0x4313, 0x436e, 0x43d2, 0x2ffb, 0x4435, - 0x445f, 0x447e, 0x44b0, 0x2ffb, 0x2ffb, 0x2ffb, 0x383d, 0x39e2, - 0x39fc, 0x3a26, 0x3a87, 0x3ae7, 0x3af2, 0x3b2a, 0x3b39, 0x3b48, - 0x3b4b, 0x3b6e, 0x3bba, 0x3c34, 0x3c41, 0x3d42, 0x3e6a, 0x3e93, - 0x3f91, 0x3fb3, 0x3fbf, 0x3ff8, 0x40bc, 0x2ffb, 0x2ffb, 0x2ffb, - 0x2ffb, 0x4124, 0x413f, 0x41b1, 0x4263, 0x713c, 0x0000, 0x2021, - 0x4000, 0x080c, 0x3ef0, 0x0126, 0x2091, 0x8000, 0x0e04, 0x2feb, - 0x7818, 0xd084, 0x0110, 0x012e, 0x0cb0, 0x7c22, 0x7926, 0x7a2a, - 0x7b2e, 0x781b, 0x0001, 0x2091, 0x4080, 0x7007, 0x0001, 0x2091, - 0x5000, 0x012e, 0x0005, 0x2021, 0x4001, 0x0c18, 0x2021, 0x4002, - 0x0c00, 0x2021, 0x4003, 0x08e8, 0x2021, 0x4005, 0x08d0, 0x2021, - 0x4006, 0x08b8, 0xa02e, 0x2520, 0x7b28, 0x7a2c, 0x7824, 0x7930, - 0x0804, 0x3efd, 0x7823, 0x0004, 0x7824, 0x0807, 0xa02e, 0x2520, - 0x7b28, 0x7a2c, 0x7824, 0x7930, 0x0804, 0x3f00, 0x7924, 0x7828, - 0x2114, 0x200a, 0x0804, 0x2fdf, 0x7924, 0x2114, 0x0804, 0x2fdf, - 0x2099, 0x0009, 0x20a1, 0x0009, 0x20a9, 0x0007, 0x53a3, 0x7924, - 0x7a28, 0x7b2c, 0x0804, 0x2fdf, 0x7824, 0x2060, 0x0090, 0x2009, - 0x0002, 0x2011, 0x0002, 0x2019, 0x0008, 0x783b, 0x0017, 0x0804, - 0x2fdf, 0x7d38, 0x7c3c, 0x0840, 0x7d38, 0x7c3c, 0x0888, 0x2061, - 0x1000, 0xe10c, 0xa006, 0x2c15, 0xa200, 0x8c60, 0x8109, 0x1dd8, - 0x2010, 0xa005, 0x0904, 0x2fdf, 0x0804, 0x3001, 0x2069, 0xb652, - 0x7824, 0x7930, 0xa11a, 0x1a04, 0x3007, 0x8019, 0x0904, 0x3007, - 0x684a, 0x6942, 0x782c, 0x6852, 0x7828, 0x6856, 0xa006, 0x685a, - 0x685e, 0x080c, 0x5e17, 0x0804, 0x2fdf, 0x2069, 0xb652, 0x7824, - 0x7934, 0xa11a, 0x1a04, 0x3007, 0x8019, 0x0904, 0x3007, 0x684e, - 0x6946, 0x782c, 0x6862, 0x7828, 0x6866, 0xa006, 0x686a, 0x686e, - 0x080c, 0x5447, 0x0804, 0x2fdf, 0xa02e, 0x2520, 0x81ff, 0x1904, - 0x3004, 0x7924, 0x7b28, 0x7a2c, 0x20a9, 0x0005, 0x20a1, 0xb689, - 0x41a1, 0x080c, 0x3ebc, 0x0904, 0x3004, 0x2009, 0x0020, 0x080c, - 0x3efd, 0x701b, 0x309c, 0x0005, 0x6834, 0x2008, 0xa084, 0x00ff, - 0xa096, 0x0011, 0x0138, 0xa096, 0x0019, 0x0120, 0xa096, 0x0015, - 0x1904, 0x3004, 0x810f, 0xa18c, 0x00ff, 0x0904, 0x3004, 0x710e, - 0x700c, 0x8001, 0x0528, 0x700e, 0x080c, 0x3ebc, 0x0904, 0x3004, - 0x2009, 0x0020, 0x2061, 0xb6d2, 0x6224, 0x6328, 0x642c, 0x6530, - 0xa290, 0x0040, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, - 0x080c, 0x3efd, 0x701b, 0x30cd, 0x0005, 0x6834, 0xa084, 0x00ff, - 0xa096, 0x0002, 0x0120, 0xa096, 0x000a, 0x1904, 0x3004, 0x08c0, - 0x7010, 0x2068, 0x6838, 0xc0fd, 0x683a, 0x080c, 0x4ebb, 0x1128, - 0x7007, 0x0003, 0x701b, 0x30e7, 0x0005, 0x080c, 0x554d, 0x0126, - 0x2091, 0x8000, 0x20a9, 0x0005, 0x2099, 0xb689, 0x530a, 0x2100, - 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0xad80, - 0x000d, 0x2009, 0x0020, 0x012e, 0x0804, 0x3f00, 0x61ac, 0x7824, - 0x60ae, 0x0804, 0x2fdf, 0x2091, 0x8000, 0x7823, 0x4000, 0x7827, - 0x4953, 0x782b, 0x5020, 0x782f, 0x2020, 0x2009, 0x017f, 0x2104, - 0x7832, 0x3f00, 0x7836, 0x2061, 0x0100, 0x6200, 0x2061, 0x0200, - 0x603c, 0x8007, 0xa205, 0x783a, 0x2009, 0x04fd, 0x2104, 0x783e, - 0x781b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2071, 0x0010, - 0x20c1, 0x00f0, 0x0804, 0x0427, 0x81ff, 0x1904, 0x3004, 0x7924, - 0x810f, 0xa18c, 0x00ff, 0x080c, 0x501b, 0x1904, 0x3007, 0x7e38, - 0xa684, 0x3fff, 0xa082, 0x4000, 0x0210, 0x0804, 0x3007, 0x7c28, - 0x7d2c, 0x080c, 0x51e3, 0xd28c, 0x1118, 0x080c, 0x518c, 0x0010, - 0x080c, 0x51bc, 0x1518, 0x2061, 0xbe00, 0x0126, 0x2091, 0x8000, - 0x6000, 0xa086, 0x0000, 0x0148, 0x6010, 0xa06d, 0x0130, 0x683c, - 0xa406, 0x1118, 0x6840, 0xa506, 0x0150, 0x012e, 0xace0, 0x0018, - 0x2001, 0xb617, 0x2004, 0xac02, 0x1a04, 0x3004, 0x0c30, 0x080c, - 0x99e6, 0x012e, 0x0904, 0x3004, 0x0804, 0x2fdf, 0xa00e, 0x2001, - 0x0005, 0x080c, 0x554d, 0x0126, 0x2091, 0x8000, 0x080c, 0x9f8e, - 0x080c, 0x547a, 0x012e, 0x0804, 0x2fdf, 0x81ff, 0x1904, 0x3004, - 0x080c, 0x3ed1, 0x0904, 0x3007, 0x080c, 0x50e1, 0x0904, 0x3004, - 0x080c, 0x51ef, 0x0904, 0x3004, 0x0804, 0x2fdf, 0x81ff, 0x1904, - 0x3004, 0x080c, 0x3ee1, 0x0904, 0x3007, 0x080c, 0x525b, 0x0904, - 0x3004, 0x2019, 0x0005, 0x7924, 0x080c, 0x520a, 0x0904, 0x3004, - 0x7828, 0xa08a, 0x1000, 0x1a04, 0x3007, 0x8003, 0x800b, 0x810b, - 0xa108, 0x080c, 0x6a1a, 0x0804, 0x2fdf, 0x0126, 0x2091, 0x8000, - 0x81ff, 0x0118, 0x2009, 0x0001, 0x0450, 0x2029, 0x00ff, 0x6450, - 0x2400, 0xa506, 0x01f8, 0x2508, 0x080c, 0x501b, 0x11d8, 0x080c, - 0x525b, 0x1128, 0x2009, 0x0002, 0x62b4, 0x2518, 0x00c0, 0x2019, - 0x0004, 0xa00e, 0x080c, 0x520a, 0x1118, 0x2009, 0x0006, 0x0078, - 0x7824, 0xa08a, 0x1000, 0x1270, 0x8003, 0x800b, 0x810b, 0xa108, - 0x080c, 0x6a1a, 0x8529, 0x1ae0, 0x012e, 0x0804, 0x2fdf, 0x012e, - 0x0804, 0x3004, 0x012e, 0x0804, 0x3007, 0x080c, 0x3ed1, 0x0904, - 0x3007, 0x080c, 0x5147, 0x080c, 0x51e3, 0x0804, 0x2fdf, 0x81ff, - 0x1904, 0x3004, 0x080c, 0x3ed1, 0x0904, 0x3007, 0x080c, 0x5138, - 0x080c, 0x51e3, 0x0804, 0x2fdf, 0x81ff, 0x1904, 0x3004, 0x080c, - 0x3ed1, 0x0904, 0x3007, 0x080c, 0x51be, 0x0904, 0x3004, 0x080c, - 0x4eff, 0x080c, 0x5185, 0x080c, 0x51e3, 0x0804, 0x2fdf, 0x080c, - 0x3ed1, 0x0904, 0x3007, 0x080c, 0x50e1, 0x0904, 0x3004, 0x62a0, - 0x2019, 0x0005, 0x00c6, 0x080c, 0x521c, 0x2061, 0x0000, 0x080c, - 0x6e67, 0x0076, 0x2039, 0x0000, 0x080c, 0x6d74, 0x2009, 0x0000, - 0x080c, 0xaf3e, 0x007e, 0x00ce, 0x080c, 0x51e3, 0x0804, 0x2fdf, - 0x080c, 0x3ed1, 0x0904, 0x3007, 0x080c, 0x51e3, 0x2208, 0x0804, - 0x2fdf, 0x0156, 0x00d6, 0x00e6, 0x2069, 0xb714, 0x6810, 0x6914, - 0xa10a, 0x1210, 0x2009, 0x0000, 0x6816, 0x2011, 0x0000, 0x2019, - 0x0000, 0x20a9, 0x007e, 0x2069, 0xb735, 0x2d04, 0xa075, 0x0130, - 0x704c, 0x0071, 0xa210, 0x7080, 0x0059, 0xa318, 0x8d68, 0x1f04, - 0x324d, 0x2300, 0xa218, 0x00ee, 0x00de, 0x015e, 0x0804, 0x2fdf, - 0x00f6, 0x0016, 0xa07d, 0x0140, 0x2001, 0x0000, 0x8000, 0x2f0c, - 0x81ff, 0x0110, 0x2178, 0x0cd0, 0x001e, 0x00fe, 0x0005, 0x2069, - 0xb714, 0x6910, 0x62b0, 0x0804, 0x2fdf, 0x81ff, 0x1904, 0x3004, - 0x6150, 0xa190, 0x2df9, 0x2215, 0xa294, 0x00ff, 0x6370, 0x83ff, - 0x0108, 0x6274, 0x67d4, 0xd79c, 0x0118, 0x2031, 0x0001, 0x0090, - 0xd7ac, 0x0118, 0x2031, 0x0003, 0x0068, 0xd7a4, 0x0118, 0x2031, - 0x0002, 0x0040, 0x080c, 0x5b41, 0x1118, 0x2031, 0x0004, 0x0010, - 0x2031, 0x0000, 0x7e3a, 0x7f3e, 0x0804, 0x2fdf, 0x6140, 0x6244, - 0x2019, 0xb8b6, 0x231c, 0x0804, 0x2fdf, 0x0126, 0x2091, 0x8000, - 0x6134, 0xa006, 0x2010, 0x6338, 0x012e, 0x0804, 0x2fdf, 0x080c, - 0x3ee1, 0x0904, 0x3007, 0x6244, 0x6338, 0x0804, 0x2fdf, 0x6140, - 0x6244, 0x7824, 0x6042, 0x7b28, 0x6346, 0x2069, 0xb652, 0x831f, - 0xa305, 0x6816, 0x782c, 0x2069, 0xb8b6, 0x2d1c, 0x206a, 0x0804, - 0x2fdf, 0x0126, 0x2091, 0x8000, 0x7824, 0x6036, 0x782c, 0x603a, - 0x012e, 0x0804, 0x2fdf, 0x7838, 0xa005, 0x01a8, 0x7828, 0xa025, - 0x0904, 0x3007, 0x782c, 0xa02d, 0x0904, 0x3007, 0xa00e, 0x080c, - 0x501b, 0x1120, 0x6244, 0x6338, 0x6446, 0x653a, 0xa186, 0x00ff, - 0x0190, 0x8108, 0x0ca0, 0x080c, 0x3ee1, 0x0904, 0x3007, 0x7828, - 0xa00d, 0x0904, 0x3007, 0x782c, 0xa005, 0x0904, 0x3007, 0x6244, - 0x6146, 0x6338, 0x603a, 0x0804, 0x2fdf, 0x2001, 0xb600, 0x2004, - 0xa086, 0x0003, 0x1904, 0x3004, 0x00c6, 0x2061, 0x0100, 0x7924, - 0x810f, 0xa18c, 0x00ff, 0xa196, 0x00ff, 0x1130, 0x2001, 0xb615, - 0x2004, 0xa085, 0xff00, 0x0078, 0xa182, 0x007f, 0x16a0, 0xa188, - 0x2df9, 0x210d, 0xa18c, 0x00ff, 0x2001, 0xb615, 0x2004, 0xa116, - 0x0550, 0x810f, 0xa105, 0x0126, 0x2091, 0x8000, 0x0006, 0x080c, - 0x864e, 0x000e, 0x01e0, 0x601a, 0x600b, 0xbc09, 0x601f, 0x0001, - 0x080c, 0x3ebc, 0x01d8, 0x6837, 0x0000, 0x7007, 0x0003, 0x6833, - 0x0000, 0x6838, 0xc0fd, 0x683a, 0x701b, 0x33a5, 0x2d00, 0x6012, - 0x2009, 0x0032, 0x080c, 0x86d3, 0x012e, 0x00ce, 0x0005, 0x012e, - 0x00ce, 0x0804, 0x3004, 0x00ce, 0x0804, 0x3007, 0x080c, 0x86a4, - 0x0cb0, 0x2001, 0xb600, 0x2004, 0xa086, 0x0003, 0x1904, 0x3004, - 0x00c6, 0x2061, 0x0100, 0x7924, 0x810f, 0xa18c, 0x00ff, 0xa196, - 0x00ff, 0x1130, 0x2001, 0xb615, 0x2004, 0xa085, 0xff00, 0x0078, - 0xa182, 0x007f, 0x16a0, 0xa188, 0x2df9, 0x210d, 0xa18c, 0x00ff, - 0x2001, 0xb615, 0x2004, 0xa116, 0x0550, 0x810f, 0xa105, 0x0126, - 0x2091, 0x8000, 0x0006, 0x080c, 0x864e, 0x000e, 0x01e0, 0x601a, - 0x600b, 0xbc05, 0x601f, 0x0001, 0x080c, 0x3ebc, 0x01d8, 0x6837, - 0x0000, 0x7007, 0x0003, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, - 0x701b, 0x33a5, 0x2d00, 0x6012, 0x2009, 0x0032, 0x080c, 0x86d3, - 0x012e, 0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, 0x3004, 0x00ce, - 0x0804, 0x3007, 0x080c, 0x86a4, 0x0cb0, 0x6830, 0xa086, 0x0100, - 0x0904, 0x3004, 0x0804, 0x2fdf, 0x2061, 0xb975, 0x0126, 0x2091, - 0x8000, 0x6000, 0xd084, 0x0178, 0x6104, 0x6208, 0x2a60, 0x6068, - 0x783a, 0x60b4, 0x783e, 0x60b0, 0x2019, 0x0072, 0x201a, 0x6348, - 0x012e, 0x0804, 0x2fdf, 0xa00e, 0x2110, 0x0c80, 0x81ff, 0x1904, - 0x3004, 0x080c, 0x5b41, 0x0904, 0x3004, 0x0126, 0x2091, 0x8000, - 0x6248, 0x6068, 0xa202, 0x0248, 0xa085, 0x0001, 0x080c, 0x289c, - 0x080c, 0x4673, 0x012e, 0x0804, 0x2fdf, 0x012e, 0x0804, 0x3007, - 0x0006, 0x0016, 0x00c6, 0x00e6, 0x2001, 0xb8c0, 0x2070, 0x2061, - 0xb652, 0x6008, 0x2072, 0x2009, 0x0000, 0x2011, 0x1000, 0x080c, - 0x6bb2, 0x7206, 0x00ee, 0x00ce, 0x001e, 0x000e, 0x0005, 0x0126, - 0x2091, 0x8000, 0x7824, 0xa084, 0x0007, 0x0002, 0x3409, 0x3412, - 0x3419, 0x3406, 0x3406, 0x3406, 0x3406, 0x3406, 0x012e, 0x0804, - 0x3007, 0x2009, 0x0114, 0x2104, 0xa085, 0x0800, 0x200a, 0x080c, - 0x3584, 0x0070, 0x2009, 0x010b, 0x200b, 0x0010, 0x080c, 0x3584, - 0x0038, 0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, 0x0804, 0x2fe1, - 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, - 0x080c, 0x33e0, 0x2009, 0x0101, 0x210c, 0x0016, 0x2001, 0x0138, - 0x200c, 0x2003, 0x0001, 0x0016, 0x2001, 0x007a, 0x2034, 0x2001, - 0x007b, 0x202c, 0xa006, 0x2048, 0x2050, 0x2058, 0x080c, 0x37cf, - 0x080c, 0x3733, 0xa03e, 0x2720, 0x00f6, 0x00e6, 0x00c6, 0x2d60, - 0x2071, 0xb94b, 0x2079, 0x0020, 0x00d6, 0x2069, 0x0000, 0x6824, - 0xd0b4, 0x0140, 0x2001, 0x007d, 0x2004, 0x783e, 0x2001, 0x007c, - 0x2004, 0x783a, 0x00de, 0x2011, 0x0001, 0x080c, 0x36df, 0x080c, - 0x36df, 0x00ce, 0x00ee, 0x00fe, 0x080c, 0x362a, 0x080c, 0x3707, - 0x080c, 0x3684, 0x080c, 0x35e9, 0x080c, 0x361a, 0x00f6, 0x2079, - 0x0100, 0x7824, 0xd094, 0x0530, 0x7814, 0xa084, 0x0184, 0xa085, - 0x0010, 0x7816, 0x2079, 0x0140, 0x080c, 0x3562, 0x1110, 0x00fe, - 0x0430, 0x7804, 0xd0dc, 0x0dc0, 0x2079, 0x0100, 0x7827, 0x0086, - 0x7814, 0xa084, 0x0184, 0xa085, 0x0032, 0x7816, 0x080c, 0x3562, - 0x1110, 0x00fe, 0x00a0, 0x7824, 0xd0bc, 0x0dc0, 0x7827, 0x0080, - 0xa026, 0x7c16, 0x7824, 0xd0ac, 0x0130, 0x8b58, 0x080c, 0x356c, - 0x00fe, 0x0804, 0x352c, 0x00fe, 0x080c, 0x3562, 0x1150, 0x8948, - 0x2001, 0x007a, 0x2602, 0x2001, 0x007b, 0x2502, 0x080c, 0x356c, - 0x0088, 0x87ff, 0x0140, 0x2001, 0x0201, 0x2004, 0xa005, 0x1904, - 0x3466, 0x8739, 0x0038, 0x2001, 0xb924, 0x2004, 0xa086, 0x0000, - 0x1904, 0x3466, 0x2001, 0x0033, 0x2003, 0x00f6, 0x8631, 0x1208, - 0x8529, 0x2500, 0xa605, 0x0904, 0x352c, 0x7824, 0xd0bc, 0x0128, - 0x2900, 0xaa05, 0xab05, 0x1904, 0x352c, 0x6033, 0x000d, 0x2001, - 0x0030, 0x2003, 0x0004, 0x7824, 0xd0ac, 0x1148, 0x2001, 0xb924, - 0x2003, 0x0003, 0x2001, 0x0030, 0x2003, 0x0009, 0x0040, 0x6027, - 0x0001, 0x2001, 0x0075, 0x2004, 0xa005, 0x0108, 0x6026, 0x2c00, - 0x601a, 0x20e1, 0x9040, 0x2d00, 0x681a, 0x6833, 0x000d, 0x7824, - 0xd0a4, 0x1180, 0x6827, 0x0000, 0x00c6, 0x20a9, 0x0004, 0x2061, - 0x0020, 0x6003, 0x0008, 0x2001, 0x0203, 0x2004, 0x1f04, 0x3501, - 0x00ce, 0x0040, 0x6827, 0x0001, 0x2001, 0x0074, 0x2004, 0xa005, - 0x0108, 0x6826, 0x00f6, 0x00c6, 0x2079, 0x0100, 0x2061, 0x0020, - 0x7827, 0x0002, 0x2001, 0x0072, 0x2004, 0xa084, 0xfff8, 0x601a, - 0x0006, 0x2001, 0x0073, 0x2004, 0x601e, 0x78c6, 0x000e, 0x78ca, - 0x00ce, 0x00fe, 0x0804, 0x3444, 0x2061, 0x0100, 0x6027, 0x0002, - 0x001e, 0x61e2, 0x001e, 0x6106, 0x7824, 0xa084, 0x0003, 0xa086, - 0x0002, 0x0188, 0x20e1, 0x9028, 0x6050, 0xa084, 0xf7ef, 0x6052, - 0x602f, 0x0000, 0x602c, 0xc0ac, 0x602e, 0x604b, 0xf7f7, 0x6043, - 0x0090, 0x6043, 0x0010, 0x2908, 0x2a10, 0x2b18, 0x2b00, 0xaa05, - 0xa905, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, - 0x008e, 0x1118, 0x012e, 0x0804, 0x2fdf, 0x012e, 0x2021, 0x400c, - 0x0804, 0x2fe1, 0xa085, 0x0001, 0x1d04, 0x356b, 0x2091, 0x6000, - 0x8420, 0xa486, 0x0064, 0x0005, 0x2001, 0x0105, 0x2003, 0x0010, - 0x2001, 0x0030, 0x2003, 0x0004, 0x2001, 0x0020, 0x2003, 0x0004, - 0x2001, 0xb924, 0x2003, 0x0000, 0x2001, 0xb94b, 0x2003, 0x0000, - 0x20e1, 0xf000, 0xa026, 0x0005, 0x00f6, 0x2079, 0x0100, 0x2001, - 0xb615, 0x200c, 0x7932, 0x7936, 0x080c, 0x287c, 0x7850, 0xa084, - 0x0980, 0xa085, 0x0030, 0x7852, 0x2019, 0x01f4, 0x8319, 0x1df0, - 0xa084, 0x0980, 0x7852, 0x782c, 0xc0ad, 0x782e, 0x20a9, 0x0046, - 0x1d04, 0x35a0, 0x2091, 0x6000, 0x1f04, 0x35a0, 0x7850, 0xa085, - 0x0400, 0x7852, 0x2001, 0x0009, 0x2004, 0xa084, 0x0003, 0xa086, - 0x0001, 0x1118, 0x782c, 0xc0ac, 0x782e, 0x784b, 0xf7f7, 0x7843, - 0x0090, 0x7843, 0x0010, 0x20a9, 0x000e, 0xe000, 0x1f04, 0x35bd, - 0x7850, 0xa085, 0x1400, 0x7852, 0x2019, 0x61a8, 0x7854, 0xe000, - 0xe000, 0xd08c, 0x1110, 0x8319, 0x1dc8, 0x7827, 0x0048, 0x7850, - 0xa085, 0x0400, 0x7852, 0x7843, 0x0040, 0x2019, 0x01f4, 0xe000, - 0xe000, 0x8319, 0x1de0, 0x2001, 0x0140, 0x2003, 0x0100, 0x7827, - 0x0020, 0x7843, 0x0000, 0x2003, 0x0000, 0x7827, 0x0048, 0x00fe, - 0x0005, 0x7824, 0xd0ac, 0x11c8, 0x00f6, 0x00e6, 0x2071, 0xb924, - 0x2079, 0x0030, 0x2001, 0x0201, 0x2004, 0xa005, 0x0160, 0x7000, - 0xa086, 0x0000, 0x1140, 0x0051, 0xd0bc, 0x0108, 0x8738, 0x7003, - 0x0003, 0x7803, 0x0019, 0x00ee, 0x00fe, 0x0005, 0x780c, 0xa08c, - 0x0070, 0x0178, 0x2009, 0x007a, 0x260a, 0x2009, 0x007b, 0x250a, - 0xd0b4, 0x0108, 0x8a50, 0xd0ac, 0x0108, 0x8948, 0xd0a4, 0x0108, - 0x8b58, 0x0005, 0x00f6, 0x2079, 0x0200, 0x781c, 0xd084, 0x0140, - 0x20e1, 0x0007, 0x20e1, 0x2000, 0x2001, 0x020a, 0x2004, 0x0ca8, - 0x00fe, 0x0005, 0x00e6, 0x2071, 0x0100, 0x2001, 0xb8c1, 0x2004, - 0x70e2, 0x2009, 0xb615, 0x210c, 0x716e, 0x7063, 0x0100, 0x7166, - 0x719e, 0x706b, 0x0000, 0x7073, 0x0809, 0x7077, 0x0008, 0x7078, - 0xa080, 0x0100, 0x707a, 0x7080, 0x8000, 0x7082, 0x7087, 0xaaaa, - 0xa006, 0x708a, 0x708e, 0x707e, 0x70d6, 0x70ab, 0x0036, 0x70af, - 0x95d5, 0x7027, 0x0080, 0x7014, 0xa084, 0x0184, 0xa085, 0x0032, - 0x7016, 0x080c, 0x3707, 0x080c, 0x3562, 0x1110, 0x8421, 0x0028, - 0x7024, 0xd0bc, 0x0db0, 0x7027, 0x0080, 0x00f6, 0x00e6, 0x2071, - 0xb924, 0x2079, 0x0030, 0x00d6, 0x2069, 0x0000, 0x6824, 0xd0b4, - 0x0120, 0x683c, 0x783e, 0x6838, 0x783a, 0x00de, 0x2011, 0x0011, - 0x080c, 0x36df, 0x2011, 0x0001, 0x080c, 0x36df, 0x00ee, 0x00fe, - 0x7017, 0x0000, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x2071, 0xb924, - 0x2079, 0x0030, 0x7904, 0xd1fc, 0x0904, 0x36dc, 0x7803, 0x0002, - 0xa026, 0xd19c, 0x1904, 0x36d8, 0x7000, 0x0002, 0x36dc, 0x369a, - 0x36be, 0x36d8, 0xd1bc, 0x1150, 0xd1dc, 0x1150, 0x8001, 0x7002, - 0x2011, 0x0001, 0x04e1, 0x05c0, 0x04d1, 0x04b0, 0x780f, 0x0000, - 0x7820, 0x7924, 0x7803, 0x0004, 0x7822, 0x7926, 0x2001, 0x0201, - 0x200c, 0x81ff, 0x0de8, 0x080c, 0x3606, 0x2009, 0x0001, 0x7808, - 0xd0ec, 0x0110, 0x2009, 0x0011, 0x7902, 0x00f0, 0x8001, 0x7002, - 0xa184, 0x0880, 0x1138, 0x7804, 0xd0fc, 0x1940, 0x2011, 0x0001, - 0x00b1, 0x0090, 0x6030, 0xa092, 0x0004, 0xa086, 0x0009, 0x1120, - 0x6000, 0x601a, 0x2011, 0x0025, 0x6232, 0xd1dc, 0x1988, 0x0870, - 0x7803, 0x0004, 0x7003, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x6024, - 0xa005, 0x0520, 0x8001, 0x6026, 0x6018, 0x6130, 0xa140, 0x2804, - 0x7832, 0x8840, 0x2804, 0x7836, 0x8840, 0x2804, 0x7822, 0x8840, - 0x2804, 0x7826, 0x8840, 0x7a02, 0x7000, 0x8000, 0x7002, 0x6018, - 0xa802, 0xa08a, 0x0029, 0x1138, 0x6018, 0xa080, 0x0001, 0x2004, - 0x601a, 0x2001, 0x000d, 0x6032, 0xa085, 0x0001, 0x0005, 0x00f6, - 0x00e6, 0x00c6, 0x2071, 0xb94b, 0x2079, 0x0020, 0x7904, 0xd1fc, - 0x01f0, 0x7803, 0x0002, 0x2d60, 0xa026, 0x7000, 0x0002, 0x372f, - 0x371a, 0x3726, 0x8001, 0x7002, 0xd19c, 0x1188, 0x2011, 0x0001, - 0x080c, 0x36df, 0x0160, 0x080c, 0x36df, 0x0048, 0x8001, 0x7002, - 0x7804, 0xd0fc, 0x1d30, 0x2011, 0x0001, 0x080c, 0x36df, 0x00ce, - 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x2061, 0x0200, - 0x2001, 0xb8c1, 0x2004, 0x601a, 0x2061, 0x0100, 0x2001, 0xb8c0, - 0x2004, 0x60ce, 0x6004, 0xc0ac, 0xa085, 0x0200, 0x6006, 0x2001, - 0x0074, 0x2004, 0xa005, 0x01f8, 0x2038, 0x2001, 0x0076, 0x2024, - 0x2001, 0x0077, 0x201c, 0x080c, 0x3ebc, 0x6833, 0x000d, 0x6f26, - 0x2d00, 0x681a, 0xa78a, 0x0007, 0x0220, 0x2138, 0x2009, 0x0007, - 0x0010, 0x2708, 0xa03e, 0x6818, 0xa080, 0x000d, 0x04b1, 0x1d90, - 0x2d00, 0x681a, 0x0088, 0x080c, 0x3ebc, 0x6833, 0x000d, 0x2070, - 0x6827, 0x0001, 0x2d00, 0x681a, 0x2001, 0x0076, 0x2004, 0x2072, - 0x2001, 0x0077, 0x2004, 0x7006, 0x2061, 0x0020, 0x2079, 0x0100, - 0x2001, 0xb8c0, 0x2004, 0x6012, 0x20e1, 0x9040, 0x2001, 0x0072, - 0x2004, 0xa084, 0xfff8, 0x700a, 0x601a, 0x0006, 0x2001, 0x0073, - 0x2004, 0x700e, 0x601e, 0x78c6, 0x000e, 0x78ca, 0xa006, 0x603a, - 0x603e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00e6, 0x2071, 0x0010, - 0x20a0, 0x2099, 0x0014, 0x7003, 0x0026, 0x7432, 0x7336, 0xa006, - 0x703a, 0x703e, 0x810b, 0x810b, 0x21a8, 0x810b, 0x7122, 0x7003, - 0x0041, 0x7004, 0xd0fc, 0x0de8, 0x7003, 0x0002, 0x7003, 0x0040, - 0x53a5, 0x7430, 0x7334, 0x87ff, 0x0180, 0x00c6, 0x00d6, 0x2d60, - 0x00c6, 0x080c, 0x3ebc, 0x00ce, 0x6018, 0x2070, 0x2d00, 0x7006, - 0x601a, 0x00de, 0x00ce, 0xa085, 0x0001, 0x00ee, 0x0005, 0x00e6, - 0x2001, 0x0075, 0x2004, 0xa005, 0x0508, 0x2038, 0x2001, 0x0078, - 0x2024, 0x2001, 0x0079, 0x201c, 0x080c, 0x3ebc, 0x2d60, 0x6833, - 0x000d, 0x6f26, 0x2d00, 0x681a, 0xa78a, 0x0007, 0x0220, 0x2138, - 0x2009, 0x0007, 0x0010, 0x2708, 0xa03e, 0x6818, 0xa080, 0x000d, - 0x080c, 0x379d, 0x1d88, 0x2d00, 0x681a, 0x00e0, 0x080c, 0x3ebc, - 0x2d60, 0x6033, 0x000d, 0x2070, 0x6027, 0x0001, 0x2c00, 0x601a, - 0x2001, 0x0078, 0x2004, 0x2072, 0x2001, 0x0079, 0x2004, 0x7006, - 0x2001, 0x0072, 0x2004, 0xa084, 0xfff8, 0x700a, 0x2001, 0x0073, - 0x2004, 0x700e, 0x2001, 0x0030, 0x2003, 0x0004, 0x7824, 0xd0ac, - 0x1178, 0x2001, 0x0101, 0x200c, 0xc1ed, 0x2102, 0x6027, 0x0000, - 0x2001, 0xb924, 0x2003, 0x0003, 0x2001, 0x0030, 0x2003, 0x0009, - 0x00ee, 0x0005, 0x0804, 0x2fdf, 0x0126, 0x2091, 0x8000, 0x20a9, - 0x0012, 0x2001, 0xb640, 0x20a0, 0xa006, 0x40a4, 0x012e, 0x0804, - 0x2fdf, 0x7d38, 0x7c3c, 0x0804, 0x3086, 0x080c, 0x3ebc, 0x0904, - 0x3004, 0x080c, 0x5b41, 0x0110, 0x080c, 0x4c52, 0x2009, 0x001c, - 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x3efd, 0x701b, 0x3851, - 0x0005, 0xade8, 0x000d, 0x6800, 0xa005, 0x0904, 0x3007, 0x6804, - 0xd0ac, 0x0118, 0xd0a4, 0x0904, 0x3007, 0xd094, 0x00c6, 0x2061, - 0x0100, 0x6104, 0x0138, 0x6200, 0xa292, 0x0005, 0x0218, 0xa18c, - 0xffdf, 0x0010, 0xa18d, 0x0020, 0x6106, 0x00ce, 0xd08c, 0x00c6, - 0x2061, 0x0100, 0x6104, 0x0118, 0xa18d, 0x0010, 0x0010, 0xa18c, - 0xffef, 0x6106, 0x00ce, 0x2009, 0x0100, 0x210c, 0xa18a, 0x0002, - 0x0268, 0xd084, 0x0158, 0x6a28, 0xa28a, 0x007f, 0x1a04, 0x3007, - 0xa288, 0x2df9, 0x210d, 0xa18c, 0x00ff, 0x615a, 0xd0dc, 0x0130, - 0x6828, 0xa08a, 0x007f, 0x1a04, 0x3007, 0x6052, 0x6808, 0xa08a, - 0x0100, 0x0a04, 0x3007, 0xa08a, 0x0841, 0x1a04, 0x3007, 0xa084, - 0x0007, 0x1904, 0x3007, 0x680c, 0xa005, 0x0904, 0x3007, 0x6810, - 0xa005, 0x0904, 0x3007, 0x6848, 0x6940, 0xa10a, 0x1a04, 0x3007, - 0x8001, 0x0904, 0x3007, 0x684c, 0x6944, 0xa10a, 0x1a04, 0x3007, - 0x8001, 0x0904, 0x3007, 0x6804, 0xd0fc, 0x0560, 0x080c, 0x3ebc, - 0x0904, 0x3004, 0x2009, 0x0014, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, - 0xa290, 0x0038, 0xa399, 0x0000, 0x080c, 0x3efd, 0x701b, 0x38d1, - 0x0005, 0xade8, 0x000d, 0x20a9, 0x0014, 0x2d98, 0x2069, 0xb66e, - 0x2da0, 0x53a3, 0x7010, 0xa0e8, 0x000d, 0x2001, 0xb672, 0x200c, - 0xd1e4, 0x0140, 0x00c6, 0x2061, 0x0100, 0x6004, 0xa085, 0x0b00, - 0x6006, 0x00ce, 0x2009, 0xb8b1, 0x200b, 0x0000, 0x2001, 0xb674, - 0x2004, 0xd0ac, 0x0158, 0x7824, 0x200a, 0x2009, 0x017f, 0x200a, - 0x3200, 0xa084, 0x003f, 0xa085, 0x3020, 0x2090, 0x20a9, 0x001c, - 0x2d98, 0x2069, 0xb652, 0x2da0, 0x53a3, 0x6814, 0xa08c, 0x00ff, - 0x6142, 0x8007, 0xa084, 0x00ff, 0x6046, 0x080c, 0x5e17, 0x080c, - 0x53de, 0x080c, 0x5447, 0x6000, 0xa086, 0x0000, 0x1904, 0x39cc, - 0x6808, 0x602a, 0x080c, 0x24a5, 0x0006, 0x2001, 0x0100, 0x2004, - 0xa082, 0x0005, 0x000e, 0x0268, 0x2009, 0x0170, 0x200b, 0x0080, - 0xe000, 0xe000, 0x200b, 0x0000, 0x0036, 0x6b08, 0x080c, 0x28d7, - 0x003e, 0x6818, 0x691c, 0x6a20, 0x6b24, 0x8007, 0x810f, 0x8217, - 0x831f, 0x6016, 0x611a, 0x621e, 0x6322, 0x6c04, 0xd4f4, 0x0148, - 0x6830, 0x6934, 0x6a38, 0x6b3c, 0x8007, 0x810f, 0x8217, 0x831f, - 0x0010, 0xa084, 0xf0ff, 0x6006, 0x610a, 0x620e, 0x6312, 0x8007, - 0x810f, 0x8217, 0x831f, 0x20a9, 0x0004, 0x20a1, 0xb8c7, 0x40a1, - 0x080c, 0x6ada, 0x6904, 0xd1fc, 0x0520, 0x00c6, 0x2009, 0x0000, - 0x20a9, 0x0001, 0x6b70, 0xd384, 0x01c8, 0x0020, 0x839d, 0x12b0, - 0x3508, 0x8109, 0x080c, 0x63ce, 0x6878, 0x6016, 0x6874, 0x2008, - 0xa084, 0xff00, 0x8007, 0x600a, 0xa184, 0x00ff, 0x6006, 0x8108, - 0x1118, 0x6003, 0x0003, 0x0010, 0x6003, 0x0001, 0x1f04, 0x3966, - 0x00ce, 0x2069, 0xb652, 0x2001, 0xb89e, 0x6a80, 0xa294, 0x0030, - 0xa28e, 0x0000, 0x0170, 0xa28e, 0x0010, 0x0118, 0xa28e, 0x0020, - 0x0140, 0x2003, 0xaaaa, 0x080c, 0x2920, 0x2001, 0xb88f, 0x2102, - 0x0008, 0x2102, 0x00c6, 0x2061, 0x0100, 0x602f, 0x0040, 0x602f, - 0x0000, 0x00ce, 0x080c, 0x5b41, 0x0128, 0x080c, 0x4116, 0x0110, - 0x080c, 0x289c, 0x60c8, 0xa005, 0x01d0, 0x6003, 0x0001, 0x2009, - 0x39b2, 0x00e0, 0x080c, 0x5b41, 0x1178, 0x2011, 0x5a14, 0x080c, - 0x6a0e, 0x2011, 0x5a07, 0x080c, 0x6ace, 0x2001, 0xb89f, 0x2003, - 0x0000, 0x080c, 0x5a79, 0x0040, 0x080c, 0x4b7b, 0x0028, 0x6003, - 0x0004, 0x2009, 0x39cc, 0x0010, 0x0804, 0x2fdf, 0x2001, 0x0100, - 0x2004, 0xa082, 0x0005, 0x0258, 0x2001, 0x0170, 0x2004, 0xa084, - 0x00ff, 0xa086, 0x004c, 0x1118, 0x2091, 0x309d, 0x0817, 0x2091, - 0x301d, 0x0817, 0x6000, 0xa086, 0x0000, 0x0904, 0x3004, 0x2069, - 0xb652, 0x7830, 0x6842, 0x7834, 0x6846, 0x6804, 0xd0fc, 0x0118, - 0x2009, 0x0030, 0x0010, 0x2009, 0x001c, 0x2d00, 0x7a2c, 0x7b28, - 0x7c3c, 0x7d38, 0x0804, 0x3f00, 0xa006, 0x080c, 0x289c, 0x81ff, - 0x1904, 0x3004, 0x080c, 0x5b41, 0x1178, 0x2001, 0xb89f, 0x2003, - 0x0001, 0x2001, 0xb600, 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, - 0x5b85, 0x080c, 0x5a79, 0x0080, 0x0016, 0x2009, 0xffff, 0x8109, - 0x0130, 0x2001, 0xb8e2, 0x2004, 0xa086, 0x0000, 0x1dc0, 0x001e, - 0x080c, 0x4c52, 0x080c, 0x4b7b, 0x0804, 0x2fdf, 0x81ff, 0x1904, - 0x3004, 0x080c, 0x5b41, 0x1110, 0x0804, 0x3004, 0x6188, 0x81ff, - 0x0198, 0x703f, 0x0000, 0x2001, 0xbdc0, 0x2009, 0x0040, 0x7a2c, - 0x7b28, 0x7c3c, 0x7d38, 0x0126, 0x2091, 0x8000, 0x080c, 0x3f00, - 0x701b, 0x2fdd, 0x012e, 0x0005, 0x703f, 0x0001, 0x00d6, 0x2069, - 0xbdc0, 0x20a9, 0x0040, 0x20a1, 0xbdc0, 0x2019, 0xffff, 0x43a4, - 0x6550, 0xa588, 0x2df9, 0x210d, 0xa18c, 0x00ff, 0x216a, 0xa00e, - 0x2011, 0x0002, 0x2100, 0xa506, 0x01a8, 0x080c, 0x501b, 0x1190, - 0x6014, 0x821c, 0x0238, 0xa398, 0xbdc0, 0xa085, 0xff00, 0x8007, - 0x201a, 0x0038, 0xa398, 0xbdc0, 0x2324, 0xa4a4, 0xff00, 0xa405, - 0x201a, 0x8210, 0x8108, 0xa182, 0x0080, 0x1208, 0x0c18, 0x8201, - 0x8007, 0x2d0c, 0xa105, 0x206a, 0x00de, 0x20a9, 0x0040, 0x20a1, - 0xbdc0, 0x2099, 0xbdc0, 0x080c, 0x4bf1, 0x0804, 0x3a33, 0x080c, - 0x3ee1, 0x0904, 0x3007, 0x00c6, 0x080c, 0x3ebc, 0x00ce, 0x1120, - 0x2009, 0x0002, 0x0804, 0x3004, 0x2001, 0xb653, 0x2004, 0xd0b4, - 0x0550, 0x7824, 0xa084, 0xff00, 0xa08e, 0x7e00, 0x0520, 0xa08e, - 0x7f00, 0x0508, 0xa08e, 0x8000, 0x01f0, 0x6000, 0xd08c, 0x11d8, - 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x11a8, 0x6837, 0x0000, - 0x6838, 0xc0fd, 0x683a, 0x080c, 0x9e96, 0x1120, 0x2009, 0x0003, - 0x0804, 0x3004, 0x7007, 0x0003, 0x701b, 0x3abf, 0x0005, 0x080c, - 0x3ee1, 0x0904, 0x3007, 0x20a9, 0x002b, 0x2c98, 0xade8, 0x0002, - 0x2da0, 0x53a3, 0x20a9, 0x0004, 0xac80, 0x0006, 0x2098, 0xad80, - 0x0006, 0x20a0, 0x080c, 0x4bf1, 0x20a9, 0x0004, 0xac80, 0x000a, - 0x2098, 0xad80, 0x000a, 0x20a0, 0x080c, 0x4bf1, 0x2d00, 0x2009, - 0x002b, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x3f00, 0x81ff, - 0x1904, 0x3004, 0x080c, 0x3ed1, 0x0904, 0x3007, 0x080c, 0x51f8, - 0x0804, 0x2fdf, 0x81ff, 0x1904, 0x3004, 0x7828, 0xa08a, 0x1000, - 0x1a04, 0x3007, 0x080c, 0x3ee1, 0x0904, 0x3007, 0x080c, 0x525b, - 0x0904, 0x3004, 0x2019, 0x0004, 0xa00e, 0x080c, 0x520a, 0x7924, - 0x810f, 0x7a28, 0x0011, 0x0804, 0x2fdf, 0xa186, 0x00ff, 0x0110, - 0x0071, 0x0060, 0x2029, 0x007e, 0x2061, 0xb600, 0x6450, 0x2400, - 0xa506, 0x0110, 0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005, 0x080c, - 0x501b, 0x1138, 0x2200, 0x8003, 0x800b, 0x810b, 0xa108, 0x080c, - 0x6a1a, 0x0005, 0x81ff, 0x1904, 0x3004, 0x080c, 0x3ed1, 0x0904, - 0x3007, 0x080c, 0x50e1, 0x0904, 0x3004, 0x080c, 0x5201, 0x0804, - 0x2fdf, 0x81ff, 0x1904, 0x3004, 0x080c, 0x3ed1, 0x0904, 0x3007, - 0x080c, 0x50e1, 0x0904, 0x3004, 0x080c, 0x51ef, 0x0804, 0x2fdf, - 0x6100, 0x0804, 0x2fdf, 0x080c, 0x3ee1, 0x0904, 0x3007, 0x2001, - 0xb600, 0x2004, 0xa086, 0x0003, 0x1904, 0x3004, 0x00d6, 0xace8, - 0x000a, 0x7924, 0xd184, 0x0110, 0xace8, 0x0006, 0x680c, 0x8007, - 0x783e, 0x6808, 0x8007, 0x783a, 0x6b04, 0x831f, 0x6a00, 0x8217, - 0x00de, 0x6100, 0xa18c, 0x0200, 0x0804, 0x2fdf, 0x7824, 0xa09c, - 0x0003, 0xd0b4, 0x1160, 0xa39a, 0x0003, 0x1a04, 0x3004, 0x6250, - 0xa294, 0x00ff, 0xa084, 0xff00, 0x8007, 0xa206, 0x1150, 0x2001, - 0xb640, 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, - 0x3f00, 0x81ff, 0x1904, 0x3004, 0x080c, 0x3ee1, 0x0904, 0x3007, - 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1904, 0x3004, 0x00c6, - 0x080c, 0x3ebc, 0x00ce, 0x0904, 0x3004, 0x6837, 0x0000, 0x6838, - 0xc0fd, 0x683a, 0x080c, 0x9e42, 0x0904, 0x3004, 0x7007, 0x0003, - 0x701b, 0x3bab, 0x0005, 0x6830, 0xa086, 0x0100, 0x0904, 0x3004, - 0xad80, 0x000e, 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, - 0x0804, 0x3f00, 0xa006, 0x080c, 0x289c, 0x7824, 0xa084, 0x00ff, - 0xa086, 0x00ff, 0x0118, 0x81ff, 0x1904, 0x3004, 0x080c, 0x5b41, - 0x0110, 0x080c, 0x4c52, 0x7828, 0xa08a, 0x1000, 0x1a04, 0x3007, - 0x7924, 0xa18c, 0xff00, 0x810f, 0xa186, 0x00ff, 0x0138, 0xa182, - 0x007f, 0x1a04, 0x3007, 0x2100, 0x080c, 0x2866, 0x0026, 0x00c6, - 0x0126, 0x2091, 0x8000, 0x2061, 0xb8f4, 0x601b, 0x0000, 0x601f, - 0x0000, 0x080c, 0x5b41, 0x1178, 0x2001, 0xb89f, 0x2003, 0x0001, - 0x2001, 0xb600, 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, 0x5b85, - 0x080c, 0x5a79, 0x0440, 0x2011, 0x0003, 0x080c, 0x80fc, 0x2011, - 0x0002, 0x080c, 0x8106, 0x080c, 0x7fe0, 0x0036, 0x2019, 0x0000, - 0x080c, 0x806b, 0x003e, 0x2061, 0x0100, 0x2001, 0xb615, 0x2004, - 0xa084, 0x00ff, 0x810f, 0xa105, 0x604a, 0x6043, 0x0090, 0x6043, - 0x0010, 0x2009, 0xb8bf, 0x200b, 0x0000, 0x2009, 0x002d, 0x2011, - 0x4bb4, 0x080c, 0x6a94, 0x7924, 0xa18c, 0xff00, 0x810f, 0x080c, - 0x5b41, 0x1110, 0x2009, 0x00ff, 0x7a28, 0x080c, 0x3b0d, 0x012e, - 0x00ce, 0x002e, 0x0804, 0x2fdf, 0x7924, 0xa18c, 0xff00, 0x810f, - 0x00c6, 0x080c, 0x4fbf, 0x2c08, 0x00ce, 0x1904, 0x3007, 0x0804, - 0x2fdf, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3004, 0x60d4, - 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, 0x0005, 0x0804, 0x3004, - 0x080c, 0x3ebc, 0x1120, 0x2009, 0x0002, 0x0804, 0x3004, 0x7924, - 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x3efd, 0x701b, 0x3c61, - 0x0005, 0x2009, 0x0080, 0x080c, 0x501b, 0x1130, 0x6004, 0xa084, - 0x00ff, 0xa086, 0x0006, 0x0120, 0x2021, 0x400a, 0x0804, 0x2fe1, - 0x00d6, 0xade8, 0x000d, 0x6900, 0x6a08, 0x6b0c, 0x6c10, 0x6d14, - 0x6e18, 0x6820, 0xa0be, 0x0100, 0x0904, 0x3cd8, 0xa0be, 0x0112, - 0x0904, 0x3cd8, 0xa0be, 0x0113, 0x0904, 0x3cd8, 0xa0be, 0x0114, - 0x0904, 0x3cd8, 0xa0be, 0x0117, 0x0904, 0x3cd8, 0xa0be, 0x011a, - 0x0904, 0x3cd8, 0xa0be, 0x011c, 0x0904, 0x3cd8, 0xa0be, 0x0121, - 0x05b0, 0xa0be, 0x0131, 0x0598, 0xa0be, 0x0171, 0x05c8, 0xa0be, - 0x0173, 0x05b0, 0xa0be, 0x01a1, 0x1120, 0x6830, 0x8007, 0x6832, - 0x04a8, 0xa0be, 0x0212, 0x0540, 0xa0be, 0x0213, 0x0528, 0xa0be, - 0x0214, 0x01b0, 0xa0be, 0x0217, 0x0168, 0xa0be, 0x021a, 0x1120, - 0x6838, 0x8007, 0x683a, 0x00e0, 0xa0be, 0x0300, 0x01c8, 0x00de, - 0x0804, 0x3007, 0xad80, 0x0010, 0x20a9, 0x0007, 0x080c, 0x3d1e, - 0xad80, 0x000e, 0x20a9, 0x0001, 0x080c, 0x3d1e, 0x0048, 0xad80, - 0x000c, 0x080c, 0x3d2c, 0x0050, 0xad80, 0x000e, 0x080c, 0x3d2c, - 0xad80, 0x000c, 0x20a9, 0x0001, 0x080c, 0x3d1e, 0x00c6, 0x080c, - 0x3ebc, 0x0568, 0x6838, 0xc0fd, 0x683a, 0x6837, 0x0119, 0x6853, - 0x0000, 0x684f, 0x0020, 0x685b, 0x0001, 0x810b, 0x697e, 0x6883, - 0x0000, 0x6a86, 0x6b8a, 0x6c8e, 0x6d92, 0x6996, 0x689b, 0x0000, - 0x00ce, 0x00de, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x6823, - 0x0000, 0x6804, 0x2068, 0x080c, 0x9e5e, 0x1120, 0x2009, 0x0003, - 0x0804, 0x3004, 0x7007, 0x0003, 0x701b, 0x3d15, 0x0005, 0x00ce, - 0x00de, 0x2009, 0x0002, 0x0804, 0x3004, 0x6820, 0xa086, 0x8001, - 0x1904, 0x2fdf, 0x2009, 0x0004, 0x0804, 0x3004, 0x0016, 0x2008, - 0x2044, 0x8000, 0x204c, 0x8000, 0x290a, 0x8108, 0x280a, 0x8108, - 0x1f04, 0x3d20, 0x001e, 0x0005, 0x0016, 0x00a6, 0x00b6, 0x2008, - 0x2044, 0x8000, 0x204c, 0x8000, 0x2054, 0x8000, 0x205c, 0x2b0a, - 0x8108, 0x2a0a, 0x8108, 0x290a, 0x8108, 0x280a, 0x00be, 0x00ae, - 0x001e, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3004, - 0x60d4, 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, 0x0005, 0x0804, - 0x3004, 0x7924, 0x2140, 0xa18c, 0xff00, 0x810f, 0x60d4, 0xd0ac, - 0x1120, 0xa182, 0x0080, 0x0a04, 0x3007, 0xa182, 0x00ff, 0x1a04, - 0x3007, 0x7a2c, 0x7b28, 0x6070, 0xa306, 0x1140, 0x6074, 0xa24e, - 0x0904, 0x3007, 0xa9cc, 0xff00, 0x0904, 0x3007, 0x0126, 0x2091, - 0x8000, 0x00c6, 0x080c, 0x3e0c, 0x2c68, 0x00ce, 0x0538, 0xa0c6, - 0x4000, 0x1178, 0x00c6, 0x0006, 0x2d60, 0xa00e, 0x080c, 0x52bc, - 0x1108, 0xc185, 0x6000, 0xd0bc, 0x0108, 0xc18d, 0x000e, 0x00ce, - 0x0088, 0xa0c6, 0x4007, 0x1110, 0x2408, 0x0060, 0xa0c6, 0x4008, - 0x1118, 0x2708, 0x2610, 0x0030, 0xa0c6, 0x4009, 0x1108, 0x0010, - 0x2001, 0x4006, 0x2020, 0x012e, 0x0804, 0x2fe1, 0x2d00, 0x7022, - 0x0016, 0x00b6, 0x00c6, 0x00e6, 0x2c70, 0x080c, 0x864e, 0x05c0, - 0x2d00, 0x601a, 0x080c, 0xa0e3, 0x2e58, 0x00ee, 0x00e6, 0x00c6, - 0x080c, 0x3ebc, 0x00ce, 0x2b70, 0x1158, 0x080c, 0x86a4, 0x00ee, - 0x00ce, 0x00be, 0x001e, 0x012e, 0x2009, 0x0002, 0x0804, 0x3004, - 0x6837, 0x0000, 0x683b, 0x0000, 0x2d00, 0x6012, 0x6833, 0x0000, - 0x6838, 0xc0fd, 0xd88c, 0x0108, 0xc0f5, 0x683a, 0x080c, 0x2cd1, - 0x601f, 0x0001, 0x2001, 0x0000, 0x080c, 0x4f5d, 0x2001, 0x0002, - 0x080c, 0x4f6f, 0x2009, 0x0002, 0x080c, 0x86d3, 0xa085, 0x0001, - 0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, 0x1120, 0x2009, 0x0003, - 0x0804, 0x3004, 0x7007, 0x0003, 0x701b, 0x3def, 0x0005, 0x6830, - 0xa086, 0x0100, 0x7020, 0x2060, 0x1138, 0x2009, 0x0004, 0x6204, - 0xa294, 0x00ff, 0x0804, 0x3004, 0x2009, 0x0000, 0x6838, 0xd0f4, - 0x1904, 0x2fdf, 0x080c, 0x52bc, 0x1108, 0xc185, 0x6000, 0xd0bc, - 0x0108, 0xc18d, 0x0804, 0x2fdf, 0x00e6, 0x00d6, 0xa02e, 0x2001, - 0xb635, 0x2004, 0xd0ac, 0x0130, 0xa026, 0x20a9, 0x00ff, 0x2071, - 0xb735, 0x0030, 0x2021, 0x0080, 0x20a9, 0x007f, 0x2071, 0xb7b5, - 0x2e04, 0xa005, 0x1130, 0x2100, 0xa406, 0x1570, 0x2428, 0xc5fd, - 0x0458, 0x2068, 0x6f10, 0x2700, 0xa306, 0x11b0, 0x6e14, 0x2600, - 0xa206, 0x1190, 0x2400, 0xa106, 0x1160, 0x2d60, 0xd884, 0x0568, - 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1538, 0x2001, 0x4000, - 0x0428, 0x2001, 0x4007, 0x0410, 0x2400, 0xa106, 0x1168, 0x6e14, - 0x87ff, 0x1138, 0x86ff, 0x09d0, 0x2001, 0xb635, 0x2004, 0xd0ac, - 0x19a8, 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, 0x1f04, 0x3e20, - 0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, 0x2001, 0x0001, 0x0030, - 0x080c, 0x4fbf, 0x1dd0, 0x6312, 0x6216, 0xa006, 0xa005, 0x00de, - 0x00ee, 0x0005, 0x81ff, 0x1904, 0x3004, 0x080c, 0x3ebc, 0x0904, - 0x3004, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x7824, 0xa005, - 0x0904, 0x3007, 0xa096, 0x00ff, 0x0120, 0xa092, 0x0004, 0x1a04, - 0x3007, 0x2010, 0x2d18, 0x080c, 0x2c84, 0x0904, 0x3004, 0x7007, - 0x0003, 0x701b, 0x3e8c, 0x0005, 0x6830, 0xa086, 0x0100, 0x0904, - 0x3004, 0x0804, 0x2fdf, 0x7924, 0xa18c, 0xff00, 0x810f, 0x60d4, - 0xd0ac, 0x1120, 0xa182, 0x0080, 0x0a04, 0x3007, 0xa182, 0x00ff, - 0x1a04, 0x3007, 0x0126, 0x2091, 0x8000, 0x080c, 0x9d46, 0x1188, - 0xa190, 0xb735, 0x2204, 0xa065, 0x0160, 0x080c, 0x4c7e, 0x2001, - 0xb635, 0x2004, 0xd0ac, 0x0110, 0x6017, 0x0000, 0x012e, 0x0804, - 0x2fdf, 0x012e, 0x0804, 0x3004, 0x080c, 0x15fd, 0x0188, 0xa006, - 0x6802, 0x7010, 0xa005, 0x1120, 0x2d00, 0x7012, 0x7016, 0x0030, - 0x7014, 0x6802, 0x2060, 0x2d00, 0x6006, 0x7016, 0xad80, 0x000d, - 0x0005, 0x7924, 0x810f, 0xa18c, 0x00ff, 0x080c, 0x501b, 0x1130, - 0x7e28, 0xa684, 0x3fff, 0xa082, 0x4000, 0x0208, 0xa066, 0x8cff, - 0x0005, 0x7e24, 0x860f, 0xa18c, 0x00ff, 0x080c, 0x501b, 0x1128, - 0xa6b4, 0x00ff, 0xa682, 0x4000, 0x0208, 0xa066, 0x8cff, 0x0005, - 0x0016, 0x7110, 0x81ff, 0x0128, 0x2168, 0x6904, 0x080c, 0x1614, - 0x0cc8, 0x7112, 0x7116, 0x001e, 0x0005, 0x2031, 0x0001, 0x0010, - 0x2031, 0x0000, 0x2061, 0xb6d2, 0x6606, 0x6112, 0x600e, 0x6226, - 0x632a, 0x642e, 0x6532, 0x2c10, 0x080c, 0x1648, 0x7007, 0x0002, - 0x701b, 0x2fdf, 0x0005, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, - 0x0000, 0x2001, 0xb690, 0x2004, 0xa005, 0x1168, 0x0e04, 0x3f2b, - 0x7818, 0xd084, 0x1140, 0x7a22, 0x7b26, 0x7c2a, 0x781b, 0x0001, - 0x2091, 0x4080, 0x0408, 0x0016, 0x00c6, 0x00e6, 0x2071, 0xb682, - 0x7138, 0xa182, 0x0010, 0x0218, 0x7030, 0x2060, 0x0078, 0x7030, - 0xa0e0, 0x0004, 0xac82, 0xb6d2, 0x0210, 0x2061, 0xb692, 0x2c00, - 0x7032, 0x81ff, 0x1108, 0x7036, 0x8108, 0x713a, 0x2262, 0x6306, - 0x640a, 0x00ee, 0x00ce, 0x001e, 0x012e, 0x00fe, 0x0005, 0x00e6, - 0x2071, 0xb682, 0x7038, 0xa005, 0x0570, 0x0126, 0x2091, 0x8000, - 0x0e04, 0x3f82, 0x00f6, 0x2079, 0x0000, 0x7818, 0xd084, 0x1508, - 0x00c6, 0x7034, 0x2060, 0x2c04, 0x7822, 0x6004, 0x7826, 0x6008, - 0x782a, 0x781b, 0x0001, 0x2091, 0x4080, 0x7038, 0x8001, 0x703a, - 0xa005, 0x1130, 0x7033, 0xb692, 0x7037, 0xb692, 0x00ce, 0x0048, - 0xac80, 0x0004, 0xa0fa, 0xb6d2, 0x0210, 0x2001, 0xb692, 0x7036, - 0x00ce, 0x00fe, 0x012e, 0x00ee, 0x0005, 0x0026, 0x2001, 0xb653, - 0x2004, 0xd0c4, 0x0120, 0x2011, 0x8014, 0x080c, 0x3f13, 0x002e, - 0x0005, 0x81ff, 0x1904, 0x3004, 0x0126, 0x2091, 0x8000, 0x6030, - 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, 0x5b41, 0x1178, 0x2001, - 0xb89f, 0x2003, 0x0001, 0x2001, 0xb600, 0x2003, 0x0001, 0xa085, - 0x0001, 0x080c, 0x5b85, 0x080c, 0x5a79, 0x0010, 0x080c, 0x4b7b, - 0x012e, 0x0804, 0x2fdf, 0x7824, 0x2008, 0xa18c, 0xfffd, 0x1128, - 0x61e0, 0xa10d, 0x61e2, 0x0804, 0x2fdf, 0x0804, 0x3007, 0x81ff, - 0x1904, 0x3004, 0x6000, 0xa086, 0x0003, 0x1904, 0x3004, 0x2001, - 0xb653, 0x2004, 0xd0ac, 0x1904, 0x3004, 0x080c, 0x3ee1, 0x0904, - 0x3007, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1120, 0x7828, - 0xa005, 0x0904, 0x2fdf, 0x00c6, 0x080c, 0x3ebc, 0x00ce, 0x0904, - 0x3004, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, - 0x080c, 0x9f27, 0x0904, 0x3004, 0x7007, 0x0003, 0x701b, 0x3ff1, - 0x0005, 0x6830, 0xa086, 0x0100, 0x0904, 0x3004, 0x0804, 0x2fdf, - 0x2001, 0xb600, 0x2004, 0xa086, 0x0003, 0x1904, 0x3004, 0x7f24, - 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x3ebc, 0x0904, 0x3004, - 0x2009, 0x0000, 0x2031, 0x0000, 0x7023, 0x0000, 0x702f, 0x0000, - 0xad80, 0x0005, 0x7026, 0x20a0, 0x080c, 0x501b, 0x1904, 0x406b, - 0x6004, 0xa0c4, 0x00ff, 0xa8c6, 0x0006, 0x0130, 0xa0c4, 0xff00, - 0xa8c6, 0x0600, 0x1904, 0x406b, 0x2001, 0xb653, 0x2004, 0xd0ac, - 0x1128, 0x080c, 0x52bc, 0x1110, 0xd79c, 0x05e8, 0xd794, 0x1110, - 0xd784, 0x0158, 0xac80, 0x0006, 0x2098, 0x3400, 0x20a9, 0x0004, - 0x53a3, 0x080c, 0x3d2c, 0xd794, 0x0148, 0xac80, 0x000a, 0x2098, - 0x3400, 0x20a9, 0x0004, 0x53a3, 0x080c, 0x3d2c, 0x21a2, 0xd794, - 0x01d8, 0xac80, 0x0000, 0x2098, 0x94a0, 0x20a9, 0x0002, 0x53a3, - 0xac80, 0x0003, 0x20a6, 0x94a0, 0xac80, 0x0004, 0x2098, 0x3400, - 0x20a9, 0x0002, 0x53a3, 0x080c, 0x3d1e, 0xac80, 0x0026, 0x2098, - 0x20a9, 0x0002, 0x53a3, 0x0008, 0x94a0, 0xd794, 0x0110, 0xa6b0, - 0x000b, 0xa6b0, 0x0005, 0x8108, 0x2001, 0xb635, 0x2004, 0xd0ac, - 0x0118, 0xa186, 0x0100, 0x0040, 0xd78c, 0x0120, 0xa186, 0x0100, - 0x0170, 0x0018, 0xa186, 0x007e, 0x0150, 0xd794, 0x0118, 0xa686, - 0x0020, 0x0010, 0xa686, 0x0028, 0x0150, 0x0804, 0x4014, 0x86ff, - 0x1120, 0x7120, 0x810b, 0x0804, 0x2fdf, 0x702f, 0x0001, 0x711e, - 0x7020, 0xa600, 0x7022, 0x772a, 0x2061, 0xb6d2, 0x6007, 0x0000, - 0x6612, 0x7024, 0x600e, 0x6226, 0x632a, 0x642e, 0x6532, 0x2c10, - 0x080c, 0x1648, 0x7007, 0x0002, 0x701b, 0x40a7, 0x0005, 0x702c, - 0xa005, 0x1170, 0x711c, 0x7024, 0x20a0, 0x7728, 0x2031, 0x0000, - 0x2061, 0xb6d2, 0x6224, 0x6328, 0x642c, 0x6530, 0x0804, 0x4014, - 0x7120, 0x810b, 0x0804, 0x2fdf, 0x2029, 0x007e, 0x7924, 0x7a28, - 0x7b2c, 0x7c38, 0xa184, 0xff00, 0x8007, 0xa0e2, 0x0020, 0x0a04, - 0x3007, 0xa502, 0x0a04, 0x3007, 0xa184, 0x00ff, 0xa0e2, 0x0020, - 0x0a04, 0x3007, 0xa502, 0x0a04, 0x3007, 0xa284, 0xff00, 0x8007, - 0xa0e2, 0x0020, 0x0a04, 0x3007, 0xa502, 0x0a04, 0x3007, 0xa284, - 0x00ff, 0xa0e2, 0x0020, 0x0a04, 0x3007, 0xa502, 0x0a04, 0x3007, - 0xa384, 0xff00, 0x8007, 0xa0e2, 0x0020, 0x0a04, 0x3007, 0xa502, - 0x0a04, 0x3007, 0xa384, 0x00ff, 0xa0e2, 0x0020, 0x0a04, 0x3007, - 0xa502, 0x0a04, 0x3007, 0xa484, 0xff00, 0x8007, 0xa0e2, 0x0020, - 0x0a04, 0x3007, 0xa502, 0x0a04, 0x3007, 0xa484, 0x00ff, 0xa0e2, - 0x0020, 0x0a04, 0x3007, 0xa502, 0x0a04, 0x3007, 0x2061, 0xb8b9, - 0x6102, 0x6206, 0x630a, 0x640e, 0x0804, 0x2fdf, 0x0006, 0x2001, - 0xb653, 0x2004, 0xd0cc, 0x000e, 0x0005, 0x0006, 0x2001, 0xb672, - 0x2004, 0xd0bc, 0x000e, 0x0005, 0x6168, 0x7a24, 0x6300, 0x82ff, - 0x1118, 0x7926, 0x0804, 0x2fdf, 0x83ff, 0x1904, 0x3007, 0x2001, - 0xfff0, 0xa200, 0x1a04, 0x3007, 0x2019, 0xffff, 0x606c, 0xa302, - 0xa200, 0x0a04, 0x3007, 0x7926, 0x626a, 0x0804, 0x2fdf, 0x2001, - 0xb600, 0x2004, 0xa086, 0x0003, 0x1904, 0x3004, 0x7c28, 0x7d24, - 0x7e38, 0x7f2c, 0x080c, 0x3ebc, 0x0904, 0x3004, 0x2009, 0x0000, - 0x2019, 0x0000, 0x7023, 0x0000, 0x702f, 0x0000, 0xad80, 0x0003, - 0x7026, 0x20a0, 0xa1e0, 0xb735, 0x2c64, 0x8cff, 0x01b8, 0x6004, - 0xa084, 0x00ff, 0xa086, 0x0006, 0x0130, 0x6004, 0xa084, 0xff00, - 0xa086, 0x0600, 0x1158, 0x6014, 0x20a2, 0x94a0, 0x6010, 0x8007, - 0xa105, 0x8007, 0x20a2, 0x94a0, 0xa398, 0x0002, 0x8108, 0xa182, - 0x00ff, 0x0120, 0xa386, 0x002a, 0x0148, 0x08e0, 0x83ff, 0x1120, - 0x7120, 0x810c, 0x0804, 0x2fdf, 0x702f, 0x0001, 0x711e, 0x7020, - 0xa300, 0x7022, 0x2061, 0xb6d2, 0x6007, 0x0000, 0x6312, 0x7024, - 0x600e, 0x6426, 0x652a, 0x662e, 0x6732, 0x2c10, 0x080c, 0x1648, - 0x7007, 0x0002, 0x701b, 0x419d, 0x0005, 0x702c, 0xa005, 0x1168, - 0x711c, 0x7024, 0x20a0, 0x2019, 0x0000, 0x2061, 0xb6d2, 0x6424, - 0x6528, 0x662c, 0x6730, 0x0804, 0x415a, 0x7120, 0x810c, 0x0804, - 0x2fdf, 0x81ff, 0x1904, 0x3004, 0x60d4, 0xd0ac, 0x1118, 0xd09c, - 0x0904, 0x3004, 0x080c, 0x3ebc, 0x0904, 0x3004, 0x7924, 0x7a2c, - 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x3efd, 0x701b, 0x41c8, 0x0005, - 0x00d6, 0xade8, 0x000d, 0x6828, 0xa0be, 0x7000, 0x0148, 0xa0be, - 0x7100, 0x0130, 0xa0be, 0x7200, 0x0118, 0x00de, 0x0804, 0x3007, - 0x6820, 0x6924, 0x080c, 0x2852, 0x1510, 0x080c, 0x4fbf, 0x11f8, - 0x7122, 0x6612, 0x6516, 0x6e18, 0x00c6, 0x080c, 0x3ebc, 0x01b8, - 0x080c, 0x3ebc, 0x01a0, 0x00ce, 0x00de, 0x6837, 0x0000, 0x6838, - 0xc0fd, 0x683a, 0x6823, 0x0000, 0x6804, 0x2068, 0x080c, 0x9e7a, - 0x0904, 0x3004, 0x7007, 0x0003, 0x701b, 0x4202, 0x0005, 0x00de, - 0x0804, 0x3004, 0x7120, 0x080c, 0x2dcc, 0x6820, 0xa086, 0x8001, - 0x0904, 0x3004, 0x2d00, 0x701e, 0x6804, 0xa080, 0x0002, 0x0006, - 0x20a9, 0x002a, 0x2098, 0x20a0, 0x080c, 0x4bf1, 0x000e, 0xade8, - 0x000d, 0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x2061, 0xb6d2, 0x6007, - 0x0000, 0x6e00, 0x6f28, 0xa7c6, 0x7000, 0x1108, 0x0018, 0xa7c6, - 0x7100, 0x1140, 0xa6c2, 0x0004, 0x0a04, 0x3007, 0x2009, 0x0004, - 0x0804, 0x3f00, 0xa7c6, 0x7200, 0x1904, 0x3007, 0xa6c2, 0x0054, - 0x0a04, 0x3007, 0x600e, 0x6013, 0x002a, 0x6226, 0x632a, 0x642e, - 0x6532, 0x2c10, 0x080c, 0x1648, 0x7007, 0x0002, 0x701b, 0x4249, - 0x0005, 0x701c, 0x2068, 0x6804, 0xa080, 0x0001, 0x2004, 0xa080, - 0x0002, 0x0006, 0x20a9, 0x002a, 0x2098, 0x20a0, 0x080c, 0x4bf1, - 0x000e, 0x2009, 0x002a, 0x2061, 0xb6d2, 0x6224, 0x6328, 0x642c, - 0x6530, 0x0804, 0x3f00, 0x81ff, 0x1904, 0x3004, 0x792c, 0x2001, - 0xb8a0, 0x2102, 0x080c, 0x3ed1, 0x0904, 0x3007, 0x080c, 0x50e1, - 0x0904, 0x3004, 0x0126, 0x2091, 0x8000, 0x080c, 0x5213, 0x012e, - 0x0804, 0x2fdf, 0x7824, 0xd08c, 0x1118, 0xd084, 0x0904, 0x3a87, - 0x080c, 0x3ee1, 0x0904, 0x3007, 0x00c6, 0x080c, 0x3ebc, 0x00ce, - 0x1120, 0x2009, 0x0002, 0x0804, 0x3004, 0x6004, 0xa084, 0x00ff, - 0xa086, 0x0006, 0x0128, 0xa08e, 0x0004, 0x0110, 0xa08e, 0x0005, - 0x15b8, 0x7824, 0xd08c, 0x0120, 0x6000, 0xc08c, 0x6002, 0x0030, - 0x2001, 0xb653, 0x2004, 0xd0b4, 0x0904, 0x3ac3, 0x7824, 0xa084, - 0xff00, 0xa08e, 0x7e00, 0x0904, 0x3ac3, 0xa08e, 0x7f00, 0x0904, - 0x3ac3, 0xa08e, 0x8000, 0x0904, 0x3ac3, 0x6000, 0xd08c, 0x1904, - 0x3ac3, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x080c, 0x9e96, - 0x1120, 0x2009, 0x0003, 0x0804, 0x3004, 0x7007, 0x0003, 0x701b, - 0x42ca, 0x0005, 0x080c, 0x3ee1, 0x0904, 0x3007, 0x0804, 0x3ac3, - 0x2009, 0xb631, 0x210c, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, - 0x3004, 0x2001, 0xb600, 0x2004, 0xa086, 0x0003, 0x0120, 0x2009, - 0x0007, 0x0804, 0x3004, 0x2001, 0xb653, 0x2004, 0xd0ac, 0x0120, - 0x2009, 0x0008, 0x0804, 0x3004, 0x609c, 0xd0a4, 0x1118, 0xd0ac, - 0x1904, 0x3ac3, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, - 0x683a, 0x080c, 0x9f27, 0x1120, 0x2009, 0x0003, 0x0804, 0x3004, - 0x7007, 0x0003, 0x701b, 0x4305, 0x0005, 0x6830, 0xa086, 0x0100, - 0x1120, 0x2009, 0x0004, 0x0804, 0x3004, 0x080c, 0x3ee1, 0x0904, - 0x3007, 0x0804, 0x4299, 0x81ff, 0x2009, 0x0001, 0x1904, 0x3004, - 0x6000, 0xa086, 0x0003, 0x2009, 0x0007, 0x1904, 0x3004, 0x2001, - 0xb653, 0x2004, 0xd0ac, 0x2009, 0x0008, 0x1904, 0x3004, 0x080c, - 0x3ee1, 0x0904, 0x3007, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, - 0x2009, 0x0009, 0x1904, 0x3004, 0x00c6, 0x080c, 0x3ebc, 0x00ce, - 0x2009, 0x0002, 0x0904, 0x3004, 0x6837, 0x0000, 0x6833, 0x0000, - 0x6838, 0xc0fd, 0x683a, 0x7928, 0xa194, 0xff00, 0xa18c, 0x00ff, - 0xa006, 0x82ff, 0x1128, 0xc0ed, 0x6952, 0x792c, 0x6956, 0x0048, - 0xa28e, 0x0100, 0x1904, 0x3007, 0xc0e5, 0x6853, 0x0000, 0x6857, - 0x0000, 0x683e, 0x080c, 0xa0e4, 0x2009, 0x0003, 0x0904, 0x3004, - 0x7007, 0x0003, 0x701b, 0x4365, 0x0005, 0x6830, 0xa086, 0x0100, - 0x2009, 0x0004, 0x0904, 0x3004, 0x0804, 0x2fdf, 0x81ff, 0x2009, - 0x0001, 0x1904, 0x3004, 0x6000, 0xa086, 0x0003, 0x2009, 0x0007, - 0x1904, 0x3004, 0x080c, 0x3ee1, 0x0904, 0x3007, 0x6004, 0xa084, - 0x00ff, 0xa086, 0x0006, 0x2009, 0x0009, 0x1904, 0x3004, 0x00c6, - 0x080c, 0x3ebc, 0x00ce, 0x2009, 0x0002, 0x0904, 0x3004, 0xad80, - 0x000f, 0x2009, 0x0008, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, - 0x3efd, 0x701b, 0x439c, 0x0005, 0x00d6, 0xade8, 0x000f, 0x6800, - 0xa086, 0x0500, 0x1140, 0x6804, 0xa005, 0x1128, 0x6808, 0xa084, - 0xff00, 0x1108, 0x0018, 0x00de, 0x1904, 0x3007, 0x00de, 0x6837, - 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x00c6, 0x080c, - 0x3ee1, 0x1118, 0x00ce, 0x0804, 0x3007, 0x080c, 0xa133, 0x2009, - 0x0003, 0x00ce, 0x0904, 0x3004, 0x7007, 0x0003, 0x701b, 0x43c9, - 0x0005, 0x6830, 0xa086, 0x0100, 0x2009, 0x0004, 0x0904, 0x3004, - 0x0804, 0x2fdf, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3004, - 0x6000, 0xa086, 0x0003, 0x0120, 0x2009, 0x0007, 0x0804, 0x3004, - 0x7e24, 0x860f, 0xa18c, 0x00ff, 0xa6b4, 0x00ff, 0x080c, 0x501b, - 0x1904, 0x3007, 0xa186, 0x007f, 0x0150, 0x6004, 0xa084, 0x00ff, - 0xa086, 0x0006, 0x0120, 0x2009, 0x0009, 0x0804, 0x3004, 0x00c6, - 0x080c, 0x3ebc, 0x00ce, 0x1120, 0x2009, 0x0002, 0x0804, 0x3004, - 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x2001, 0x0100, 0x8007, - 0x680a, 0x080c, 0x9eb1, 0x1120, 0x2009, 0x0003, 0x0804, 0x3004, - 0x7007, 0x0003, 0x701b, 0x4415, 0x0005, 0x6808, 0x8007, 0xa086, - 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x3004, 0x68b0, 0x6836, - 0x6810, 0x8007, 0xa084, 0x00ff, 0x800c, 0x6814, 0x8007, 0xa084, - 0x00ff, 0x8004, 0xa080, 0x0002, 0xa108, 0xad80, 0x0004, 0x7a2c, - 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x3f00, 0x080c, 0x3ebc, 0x1120, - 0x2009, 0x0002, 0x0804, 0x3004, 0x7924, 0xa194, 0xff00, 0xa18c, - 0x00ff, 0x8217, 0x82ff, 0x0110, 0x0804, 0x3007, 0x2009, 0x001a, - 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x3efd, 0x701b, 0x4451, - 0x0005, 0x2001, 0xb62a, 0x2003, 0x0001, 0xad80, 0x000d, 0x2098, - 0x20a9, 0x001a, 0x20a1, 0xb8c7, 0x53a3, 0x0804, 0x2fdf, 0x080c, - 0x3ebc, 0x1120, 0x2009, 0x0002, 0x0804, 0x3004, 0x7924, 0xa194, - 0xff00, 0xa18c, 0x00ff, 0x8217, 0x82ff, 0x0110, 0x0804, 0x3007, - 0x2099, 0xb8c7, 0x20a0, 0x20a9, 0x001a, 0x53a3, 0x2009, 0x001a, - 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x3f00, 0x7824, 0xa08a, - 0x1000, 0x1a04, 0x3007, 0x0126, 0x2091, 0x8000, 0x8003, 0x800b, - 0x810b, 0xa108, 0x00c6, 0x2061, 0xb8f4, 0x6142, 0x00ce, 0x012e, - 0x0804, 0x2fdf, 0x00c6, 0x080c, 0x5b41, 0x1188, 0x2001, 0xb89f, - 0x2003, 0x0001, 0x2001, 0xb600, 0x2003, 0x0001, 0xa085, 0x0001, - 0x080c, 0x5b85, 0x080c, 0x5a79, 0x080c, 0x151a, 0x0038, 0x2061, - 0xb600, 0x6030, 0xc09d, 0x6032, 0x080c, 0x4b7b, 0x00ce, 0x0005, - 0x0126, 0x2091, 0x8000, 0x00c6, 0x2061, 0xb8f4, 0x7924, 0x6152, - 0x614e, 0x6057, 0x0000, 0x604b, 0x0009, 0x7838, 0x606a, 0x783c, - 0x6066, 0x7828, 0x6062, 0x782c, 0x605e, 0x2061, 0xb8a1, 0x2001, - 0xb909, 0x600e, 0x6013, 0x0001, 0x6017, 0x0002, 0x6007, 0x0000, - 0x6037, 0x0000, 0x00ce, 0x012e, 0x0804, 0x2fdf, 0x0126, 0x00c6, - 0x00e6, 0x2061, 0x0100, 0x2071, 0xb600, 0x6044, 0xd0a4, 0x11b0, - 0xd084, 0x0118, 0x080c, 0x464d, 0x0068, 0xd08c, 0x0118, 0x080c, - 0x456e, 0x0040, 0xd094, 0x0118, 0x080c, 0x453f, 0x0018, 0xd09c, - 0x0108, 0x0061, 0x00ee, 0x00ce, 0x012e, 0x0005, 0x0016, 0x6128, - 0xd19c, 0x1110, 0xc19d, 0x612a, 0x001e, 0x0ca0, 0x624c, 0xa286, - 0xf0f0, 0x1150, 0x6048, 0xa086, 0xf0f0, 0x0130, 0x624a, 0x6043, - 0x0090, 0x6043, 0x0010, 0x0490, 0xa294, 0xff00, 0xa296, 0xf700, - 0x0178, 0x7134, 0xd1a4, 0x1160, 0x6240, 0xa295, 0x0100, 0x6242, - 0xa294, 0x0010, 0x0128, 0x2009, 0x00f7, 0x080c, 0x4c11, 0x00f0, - 0x6040, 0xa084, 0x0010, 0xa085, 0x0140, 0x6042, 0x6043, 0x0000, - 0x707b, 0x0000, 0x7097, 0x0001, 0x70bb, 0x0000, 0x70d7, 0x0000, - 0x2009, 0xbdc0, 0x200b, 0x0000, 0x708b, 0x0000, 0x707f, 0x000a, - 0x2009, 0x000a, 0x2011, 0x4b1c, 0x080c, 0x6a94, 0x0005, 0x0156, - 0x2001, 0xb674, 0x2004, 0xd08c, 0x0110, 0x7053, 0xffff, 0x707c, - 0xa005, 0x1510, 0x2011, 0x4b1c, 0x080c, 0x6a0e, 0x6040, 0xa094, - 0x0010, 0xa285, 0x0020, 0x6042, 0x20a9, 0x00c8, 0x6044, 0xd08c, - 0x1168, 0x1f04, 0x4556, 0x6242, 0x708f, 0x0000, 0x6040, 0xa094, - 0x0010, 0xa285, 0x0080, 0x6042, 0x6242, 0x0030, 0x6242, 0x708f, - 0x0000, 0x7083, 0x0000, 0x0000, 0x015e, 0x0005, 0x7080, 0xa08a, - 0x0003, 0x1210, 0x0023, 0x0010, 0x080c, 0x151a, 0x0005, 0x457a, - 0x45ca, 0x464c, 0x00f6, 0x7083, 0x0001, 0x20e1, 0xa000, 0xe000, - 0x20e1, 0x8700, 0x080c, 0x24a5, 0x20e1, 0x9080, 0x20e1, 0x4000, - 0x2079, 0xbc00, 0x207b, 0x2200, 0x7807, 0x00ef, 0x780b, 0x0000, - 0x780f, 0x00ef, 0x7813, 0x0138, 0x7817, 0x0000, 0x781b, 0x0000, - 0x781f, 0x0000, 0x7823, 0xffff, 0x7827, 0xffff, 0x782b, 0x0000, - 0x782f, 0x0000, 0x2079, 0xbc0c, 0x207b, 0x1101, 0x7807, 0x0000, - 0x2099, 0xb605, 0x20a1, 0xbc0e, 0x20a9, 0x0004, 0x53a3, 0x2079, - 0xbc12, 0x207b, 0x0000, 0x7807, 0x0000, 0x2099, 0xbc00, 0x20a1, - 0x020b, 0x20a9, 0x0014, 0x53a6, 0x60c3, 0x000c, 0x600f, 0x0000, - 0x080c, 0x4b55, 0x00fe, 0x7087, 0x0000, 0x6043, 0x0008, 0x6043, - 0x0000, 0x0005, 0x00d6, 0x7084, 0x7087, 0x0000, 0xa025, 0x0904, - 0x4634, 0x6020, 0xd0b4, 0x1904, 0x4632, 0x7194, 0x81ff, 0x0904, - 0x4622, 0xa486, 0x000c, 0x1904, 0x462d, 0xa480, 0x0018, 0x8004, - 0x20a8, 0x2011, 0xbc80, 0x2019, 0xbc00, 0x220c, 0x2304, 0xa106, - 0x11b8, 0x8210, 0x8318, 0x1f04, 0x45e5, 0x6043, 0x0004, 0x608b, - 0xbc94, 0x608f, 0xf0f0, 0x6043, 0x0006, 0x7083, 0x0002, 0x708f, - 0x0002, 0x2009, 0x07d0, 0x2011, 0x4b23, 0x080c, 0x6a94, 0x0490, - 0x2069, 0xbc80, 0x6930, 0xa18e, 0x1101, 0x1538, 0x6834, 0xa005, - 0x1520, 0x6900, 0xa18c, 0x00ff, 0x1118, 0x6804, 0xa005, 0x0190, - 0x2011, 0xbc8e, 0x2019, 0xb605, 0x20a9, 0x0004, 0x220c, 0x2304, - 0xa102, 0x0230, 0x1190, 0x8210, 0x8318, 0x1f04, 0x4616, 0x0068, - 0x7097, 0x0000, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xbc80, - 0x20a1, 0x020b, 0x20a9, 0x0014, 0x53a6, 0x6043, 0x0008, 0x6043, - 0x0000, 0x0010, 0x00de, 0x0005, 0x6040, 0xa085, 0x0100, 0x6042, - 0x6020, 0xd0b4, 0x1db8, 0x60c3, 0x000c, 0x2011, 0xb8eb, 0x2013, - 0x0000, 0x7087, 0x0000, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, - 0x9575, 0x080c, 0x7dea, 0x0c30, 0x0005, 0x708c, 0xa08a, 0x001d, - 0x1210, 0x0023, 0x0010, 0x080c, 0x151a, 0x0005, 0x4680, 0x468f, - 0x46b7, 0x46d0, 0x46f4, 0x471c, 0x4740, 0x4771, 0x4795, 0x47bd, - 0x47f4, 0x481c, 0x4838, 0x484e, 0x486e, 0x4881, 0x4889, 0x48b9, - 0x48dd, 0x4905, 0x4929, 0x495a, 0x4997, 0x49c6, 0x49e2, 0x4a21, - 0x4a41, 0x4a5a, 0x4a5b, 0x00c6, 0x2061, 0xb600, 0x6003, 0x0007, - 0x2061, 0x0100, 0x6004, 0xa084, 0xfff9, 0x6006, 0x00ce, 0x0005, - 0x608b, 0xbc94, 0x608f, 0xf0f0, 0x6043, 0x0002, 0x708f, 0x0001, - 0x2009, 0x07d0, 0x2011, 0x4b23, 0x080c, 0x6a94, 0x0005, 0x00f6, - 0x7084, 0xa086, 0x0014, 0x1508, 0x6043, 0x0000, 0x6020, 0xd0b4, - 0x11e0, 0x2079, 0xbc80, 0x7a30, 0xa296, 0x1102, 0x11a0, 0x7834, - 0xa005, 0x1188, 0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, - 0x70bb, 0x0001, 0x2011, 0x4b23, 0x080c, 0x6a0e, 0x708f, 0x0010, - 0x080c, 0x4889, 0x0010, 0x080c, 0x4b7b, 0x00fe, 0x0005, 0x708f, - 0x0003, 0x6043, 0x0004, 0x2011, 0x4b23, 0x080c, 0x6a0e, 0x080c, - 0x4bf9, 0x20a3, 0x1102, 0x20a3, 0x0000, 0x20a9, 0x000a, 0x20a3, - 0x0000, 0x1f04, 0x46c7, 0x60c3, 0x0014, 0x080c, 0x4b55, 0x0005, - 0x00f6, 0x7084, 0xa005, 0x01f0, 0x2011, 0x4b23, 0x080c, 0x6a0e, - 0xa086, 0x0014, 0x11a8, 0x2079, 0xbc80, 0x7a30, 0xa296, 0x1102, - 0x1178, 0x7834, 0xa005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70b8, - 0xa005, 0x1110, 0x70bb, 0x0001, 0x708f, 0x0004, 0x0029, 0x0010, - 0x080c, 0x4b7b, 0x00fe, 0x0005, 0x708f, 0x0005, 0x080c, 0x4bf9, - 0x20a3, 0x1103, 0x20a3, 0x0000, 0x3430, 0x2011, 0xbc8e, 0x080c, - 0x4c4a, 0x1160, 0x7078, 0xa005, 0x1148, 0x7150, 0xa186, 0xffff, - 0x0128, 0x080c, 0x4ae7, 0x0110, 0x080c, 0x4c28, 0x20a9, 0x0008, - 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, - 0x0014, 0x080c, 0x4b55, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01f0, - 0x2011, 0x4b23, 0x080c, 0x6a0e, 0xa086, 0x0014, 0x11a8, 0x2079, - 0xbc80, 0x7a30, 0xa296, 0x1103, 0x1178, 0x7834, 0xa005, 0x1160, - 0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, - 0x708f, 0x0006, 0x0029, 0x0010, 0x080c, 0x4b7b, 0x00fe, 0x0005, - 0x708f, 0x0007, 0x080c, 0x4bf9, 0x20a3, 0x1104, 0x20a3, 0x0000, - 0x3430, 0x2011, 0xbc8e, 0x080c, 0x4c4a, 0x11a8, 0x7078, 0xa005, - 0x1190, 0x7158, 0xa186, 0xffff, 0x0170, 0xa180, 0x2df9, 0x200d, - 0xa18c, 0xff00, 0x810f, 0x080c, 0x4ae7, 0x0128, 0x080c, 0x411d, - 0x0110, 0x080c, 0x289c, 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6, - 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x4b55, - 0x0005, 0x00f6, 0x7084, 0xa005, 0x01f0, 0x2011, 0x4b23, 0x080c, - 0x6a0e, 0xa086, 0x0014, 0x11a8, 0x2079, 0xbc80, 0x7a30, 0xa296, - 0x1104, 0x1178, 0x7834, 0xa005, 0x1160, 0x7a38, 0xd2fc, 0x0128, - 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x708f, 0x0008, 0x0029, - 0x0010, 0x080c, 0x4b7b, 0x00fe, 0x0005, 0x708f, 0x0009, 0x080c, - 0x4bf9, 0x20a3, 0x1105, 0x20a3, 0x0100, 0x3430, 0x080c, 0x4c4a, - 0x1150, 0x7078, 0xa005, 0x1138, 0x080c, 0x4a5c, 0x1170, 0xa085, - 0x0001, 0x080c, 0x289c, 0x20a9, 0x0008, 0x2099, 0xbc8e, 0x26a0, - 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, - 0x4b55, 0x0010, 0x080c, 0x4673, 0x0005, 0x00f6, 0x7084, 0xa005, - 0x0588, 0x2011, 0x4b23, 0x080c, 0x6a0e, 0xa086, 0x0014, 0x1540, - 0x2079, 0xbc80, 0x7a30, 0xa296, 0x1105, 0x1510, 0x7834, 0x2011, - 0x0100, 0xa21e, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, - 0x1110, 0x70bb, 0x0001, 0x708f, 0x000a, 0x00b1, 0x0098, 0xa005, - 0x1178, 0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, - 0x0001, 0x708b, 0x0000, 0x708f, 0x000e, 0x080c, 0x486e, 0x0010, - 0x080c, 0x4b7b, 0x00fe, 0x0005, 0x708f, 0x000b, 0x2011, 0xbc0e, - 0x22a0, 0x20a9, 0x0040, 0x2019, 0xffff, 0x43a4, 0x20a9, 0x0002, - 0x2009, 0x0000, 0x41a4, 0x080c, 0x4bf9, 0x20a3, 0x1106, 0x20a3, - 0x0000, 0x080c, 0x4c4a, 0x0118, 0x2013, 0x0000, 0x0020, 0x7054, - 0xa085, 0x0100, 0x2012, 0x2298, 0x20a9, 0x0042, 0x53a6, 0x60c3, - 0x0084, 0x080c, 0x4b55, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01b0, - 0x2011, 0x4b23, 0x080c, 0x6a0e, 0xa086, 0x0084, 0x1168, 0x2079, - 0xbc80, 0x7a30, 0xa296, 0x1106, 0x1138, 0x7834, 0xa005, 0x1120, - 0x708f, 0x000c, 0x0029, 0x0010, 0x080c, 0x4b7b, 0x00fe, 0x0005, - 0x708f, 0x000d, 0x080c, 0x4bf9, 0x20a3, 0x1107, 0x20a3, 0x0000, - 0x2099, 0xbc8e, 0x20a9, 0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, - 0x0000, 0x60c3, 0x0084, 0x080c, 0x4b55, 0x0005, 0x00f6, 0x7084, - 0xa005, 0x01d0, 0x2011, 0x4b23, 0x080c, 0x6a0e, 0xa086, 0x0084, - 0x1188, 0x2079, 0xbc80, 0x7a30, 0xa296, 0x1107, 0x1158, 0x7834, - 0xa005, 0x1140, 0x708b, 0x0001, 0x080c, 0x4beb, 0x708f, 0x000e, - 0x0029, 0x0010, 0x080c, 0x4b7b, 0x00fe, 0x0005, 0x708f, 0x000f, - 0x7087, 0x0000, 0x608b, 0xbc85, 0x608f, 0xb5b5, 0x6043, 0x0005, - 0x6043, 0x0004, 0x2009, 0x07d0, 0x2011, 0x4b23, 0x080c, 0x6a02, - 0x0005, 0x7084, 0xa005, 0x0120, 0x2011, 0x4b23, 0x080c, 0x6a0e, - 0x0005, 0x708f, 0x0011, 0x080c, 0x4c4a, 0x11a0, 0x7170, 0x81ff, - 0x0188, 0x2009, 0x0000, 0x7074, 0xa084, 0x00ff, 0x080c, 0x2852, - 0xa186, 0x007e, 0x0138, 0xa186, 0x0080, 0x0120, 0x2011, 0xbc8e, - 0x080c, 0x4ae7, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xbc80, - 0x20a1, 0x020b, 0x7484, 0xa480, 0x0018, 0xa080, 0x0007, 0xa084, - 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0014, 0x080c, 0x4b55, - 0x0005, 0x00f6, 0x7084, 0xa005, 0x01f0, 0x2011, 0x4b23, 0x080c, - 0x6a0e, 0xa086, 0x0014, 0x11a8, 0x2079, 0xbc80, 0x7a30, 0xa296, - 0x1103, 0x1178, 0x7834, 0xa005, 0x1160, 0x7a38, 0xd2fc, 0x0128, - 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x708f, 0x0012, 0x0029, - 0x0010, 0x080c, 0x4b7b, 0x00fe, 0x0005, 0x708f, 0x0013, 0x080c, - 0x4c05, 0x20a3, 0x1103, 0x20a3, 0x0000, 0x3430, 0x2011, 0xbc8e, - 0x080c, 0x4c4a, 0x1160, 0x7078, 0xa005, 0x1148, 0x7150, 0xa186, - 0xffff, 0x0128, 0x080c, 0x4ae7, 0x0110, 0x080c, 0x4c28, 0x20a9, - 0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, - 0x60c3, 0x0014, 0x080c, 0x4b55, 0x0005, 0x00f6, 0x7084, 0xa005, - 0x01f0, 0x2011, 0x4b23, 0x080c, 0x6a0e, 0xa086, 0x0014, 0x11a8, - 0x2079, 0xbc80, 0x7a30, 0xa296, 0x1104, 0x1178, 0x7834, 0xa005, - 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, - 0x0001, 0x708f, 0x0014, 0x0029, 0x0010, 0x080c, 0x4b7b, 0x00fe, - 0x0005, 0x708f, 0x0015, 0x080c, 0x4c05, 0x20a3, 0x1104, 0x20a3, - 0x0000, 0x3430, 0x2011, 0xbc8e, 0x080c, 0x4c4a, 0x11a8, 0x7078, - 0xa005, 0x1190, 0x7158, 0xa186, 0xffff, 0x0170, 0xa180, 0x2df9, - 0x200d, 0xa18c, 0xff00, 0x810f, 0x080c, 0x4ae7, 0x0128, 0x080c, - 0x411d, 0x0110, 0x080c, 0x289c, 0x20a9, 0x0008, 0x2298, 0x26a0, - 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, - 0x4b55, 0x0005, 0x00f6, 0x7084, 0xa005, 0x05b8, 0x2011, 0x4b23, - 0x080c, 0x6a0e, 0xa086, 0x0014, 0x1570, 0x2079, 0xbc80, 0x7a30, - 0xa296, 0x1105, 0x1540, 0x7834, 0x2011, 0x0100, 0xa21e, 0x1148, - 0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, - 0x0060, 0xa005, 0x11c0, 0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, - 0x1110, 0x70bb, 0x0001, 0x708b, 0x0000, 0x7a38, 0xd2f4, 0x0138, - 0x2001, 0xb674, 0x2004, 0xd0a4, 0x1110, 0x70d7, 0x0008, 0x708f, - 0x0016, 0x0029, 0x0010, 0x080c, 0x4b7b, 0x00fe, 0x0005, 0x20e1, - 0x9080, 0x20e1, 0x4000, 0x2099, 0xbc80, 0x20a1, 0x020b, 0x20a9, - 0x000e, 0x53a6, 0x3430, 0x2011, 0xbc8e, 0x708f, 0x0017, 0x080c, - 0x4c4a, 0x1150, 0x7078, 0xa005, 0x1138, 0x080c, 0x4a5c, 0x1170, - 0xa085, 0x0001, 0x080c, 0x289c, 0x20a9, 0x0008, 0x2099, 0xbc8e, - 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, - 0x080c, 0x4b55, 0x0010, 0x080c, 0x4673, 0x0005, 0x00f6, 0x7084, - 0xa005, 0x01b0, 0x2011, 0x4b23, 0x080c, 0x6a0e, 0xa086, 0x0084, - 0x1168, 0x2079, 0xbc80, 0x7a30, 0xa296, 0x1106, 0x1138, 0x7834, - 0xa005, 0x1120, 0x708f, 0x0018, 0x0029, 0x0010, 0x080c, 0x4b7b, - 0x00fe, 0x0005, 0x708f, 0x0019, 0x080c, 0x4c05, 0x20a3, 0x1106, - 0x20a3, 0x0000, 0x3430, 0x2099, 0xbc8e, 0x2039, 0xbc0e, 0x27a0, - 0x20a9, 0x0040, 0x53a3, 0x080c, 0x4c4a, 0x11e8, 0x2728, 0x2514, - 0x8207, 0xa084, 0x00ff, 0x8000, 0x2018, 0xa294, 0x00ff, 0x8007, - 0xa205, 0x202a, 0x7054, 0x2310, 0x8214, 0xa2a0, 0xbc0e, 0x2414, - 0xa38c, 0x0001, 0x0118, 0xa294, 0xff00, 0x0018, 0xa294, 0x00ff, - 0x8007, 0xa215, 0x2222, 0x2798, 0x26a0, 0x20a9, 0x0040, 0x53a6, - 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0084, 0x080c, 0x4b55, - 0x0005, 0x00f6, 0x7084, 0xa005, 0x01d0, 0x2011, 0x4b23, 0x080c, - 0x6a0e, 0xa086, 0x0084, 0x1188, 0x2079, 0xbc80, 0x7a30, 0xa296, - 0x1107, 0x1158, 0x7834, 0xa005, 0x1140, 0x708b, 0x0001, 0x080c, - 0x4beb, 0x708f, 0x001a, 0x0029, 0x0010, 0x080c, 0x4b7b, 0x00fe, - 0x0005, 0x708f, 0x001b, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, - 0xbc80, 0x20a1, 0x020b, 0x7484, 0xa480, 0x0018, 0xa080, 0x0007, - 0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0084, 0x080c, - 0x4b55, 0x0005, 0x0005, 0x0005, 0x0086, 0x0096, 0x2029, 0xb653, - 0x252c, 0x20a9, 0x0008, 0x2041, 0xbc0e, 0x28a0, 0x2099, 0xbc8e, - 0x53a3, 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0110, 0x2011, - 0x0000, 0x2800, 0xa200, 0x200c, 0xa1a6, 0xffff, 0x1148, 0xd5d4, - 0x0110, 0x8210, 0x0008, 0x8211, 0x1f04, 0x4a71, 0x0804, 0x4adf, - 0x82ff, 0x1160, 0xd5d4, 0x0120, 0xa1a6, 0x3fff, 0x0d90, 0x0020, - 0xa1a6, 0x3fff, 0x0904, 0x4adf, 0xa18d, 0xc000, 0x20a9, 0x0010, - 0x2019, 0x0001, 0xd5d4, 0x0110, 0x2019, 0x0010, 0x2120, 0xd5d4, - 0x0110, 0x8423, 0x0008, 0x8424, 0x1240, 0xd5d4, 0x0110, 0x8319, - 0x0008, 0x8318, 0x1f04, 0x4a97, 0x04d0, 0x23a8, 0x2021, 0x0001, - 0x8426, 0x8425, 0x1f04, 0x4aa9, 0x2328, 0x8529, 0xa2be, 0x0007, - 0x0158, 0x0006, 0x2039, 0x0007, 0x2200, 0xa73a, 0x000e, 0x27a8, - 0xa5a8, 0x0010, 0x1f04, 0x4ab8, 0x7552, 0xa5c8, 0x2df9, 0x292d, - 0xa5ac, 0x00ff, 0x7576, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, - 0x287c, 0x001e, 0x60e7, 0x0000, 0x65ea, 0x2018, 0x2304, 0xa405, - 0x201a, 0x707b, 0x0001, 0x26a0, 0x2898, 0x20a9, 0x0008, 0x53a6, - 0x20a3, 0x0000, 0x20a3, 0x0000, 0xa085, 0x0001, 0x0028, 0xa006, - 0x0018, 0xa006, 0x080c, 0x151a, 0x009e, 0x008e, 0x0005, 0x2118, - 0x2021, 0x0000, 0x2001, 0x0007, 0xa39a, 0x0010, 0x0218, 0x8420, - 0x8001, 0x0cd0, 0x2118, 0x84ff, 0x0120, 0xa39a, 0x0010, 0x8421, - 0x1de0, 0x2021, 0x0001, 0x83ff, 0x0118, 0x8423, 0x8319, 0x1de8, - 0xa238, 0x2704, 0xa42c, 0x11b8, 0xa405, 0x203a, 0x7152, 0xa1a0, - 0x2df9, 0x242d, 0xa5ac, 0x00ff, 0x7576, 0x6532, 0x6536, 0x0016, - 0x2508, 0x080c, 0x287c, 0x001e, 0x60e7, 0x0000, 0x65ea, 0x707b, - 0x0001, 0xa084, 0x0000, 0x0005, 0x00e6, 0x2071, 0xb600, 0x707f, - 0x0000, 0x00ee, 0x0005, 0x00e6, 0x00f6, 0x2079, 0x0100, 0x2071, - 0x0140, 0x080c, 0x4c61, 0x080c, 0x7df3, 0x7004, 0xa084, 0x4000, - 0x0120, 0x7003, 0x1000, 0x7003, 0x0000, 0x0126, 0x2091, 0x8000, - 0x2071, 0xb623, 0x2073, 0x0000, 0x7840, 0x0026, 0x0016, 0x2009, - 0x00f7, 0x080c, 0x4c11, 0x001e, 0xa094, 0x0010, 0xa285, 0x0080, - 0x7842, 0x7a42, 0x2009, 0x1388, 0x2011, 0x5a14, 0x080c, 0x6a94, - 0x002e, 0x012e, 0x00fe, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, - 0x2011, 0xb8eb, 0x2013, 0x0000, 0x7087, 0x0000, 0x012e, 0x20e1, - 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x7dea, 0x6144, - 0xd184, 0x0120, 0x718c, 0xa18d, 0x2000, 0x0018, 0x7180, 0xa18d, - 0x1000, 0x2011, 0xb8bf, 0x2112, 0x2009, 0x07d0, 0x2011, 0x4b23, - 0x080c, 0x6a94, 0x0005, 0x0016, 0x0026, 0x00c6, 0x0126, 0x2091, - 0x8000, 0x2011, 0x0003, 0x080c, 0x80fc, 0x2011, 0x0002, 0x080c, - 0x8106, 0x080c, 0x7fe0, 0x0036, 0x2019, 0x0000, 0x080c, 0x806b, - 0x003e, 0x2009, 0x00f7, 0x080c, 0x4c11, 0x2061, 0xb8f4, 0x601b, - 0x0000, 0x601f, 0x0000, 0x2061, 0xb600, 0x6003, 0x0001, 0x2061, - 0x0100, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0xb8bf, 0x200b, - 0x0000, 0x2009, 0x002d, 0x2011, 0x4bb4, 0x080c, 0x6a02, 0x012e, - 0x00ce, 0x002e, 0x001e, 0x0005, 0x00e6, 0x0006, 0x0126, 0x2091, - 0x8000, 0x080c, 0x4c61, 0x2071, 0x0100, 0x080c, 0x7df3, 0x2071, - 0x0140, 0x7004, 0xa084, 0x4000, 0x0120, 0x7003, 0x1000, 0x7003, - 0x0000, 0x080c, 0x5b49, 0x01a8, 0x080c, 0x5b67, 0x1190, 0x2001, - 0xb89e, 0x2003, 0xaaaa, 0x0016, 0x080c, 0x2920, 0x2001, 0xb88f, - 0x2102, 0x001e, 0x2001, 0xb89f, 0x2003, 0x0000, 0x080c, 0x5a79, - 0x0030, 0x2001, 0x0001, 0x080c, 0x27f8, 0x080c, 0x4b7b, 0x012e, - 0x000e, 0x00ee, 0x0005, 0x20a9, 0x0040, 0x20a1, 0xbdc0, 0x2099, - 0xbc8e, 0x3304, 0x8007, 0x20a2, 0x9398, 0x94a0, 0x1f04, 0x4bf1, - 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xbc00, 0x20a1, - 0x020b, 0x20a9, 0x000c, 0x53a6, 0x0005, 0x20e1, 0x9080, 0x20e1, - 0x4000, 0x2099, 0xbc80, 0x20a1, 0x020b, 0x20a9, 0x000c, 0x53a6, - 0x0005, 0x00c6, 0x0006, 0x2061, 0x0100, 0x810f, 0x2001, 0xb631, - 0x2004, 0xa005, 0x1138, 0x2001, 0xb615, 0x2004, 0xa084, 0x00ff, - 0xa105, 0x0010, 0xa185, 0x00f7, 0x604a, 0x000e, 0x00ce, 0x0005, - 0x0016, 0x0046, 0x2001, 0xb653, 0x2004, 0xd0a4, 0x0158, 0xa006, - 0x2020, 0x2009, 0x002a, 0x080c, 0xb1a4, 0x2001, 0xb60c, 0x200c, - 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0000, 0x080c, 0x2ca4, - 0x004e, 0x001e, 0x0005, 0x080c, 0x4b7b, 0x708f, 0x0000, 0x7087, - 0x0000, 0x0005, 0x0006, 0x2001, 0xb60c, 0x2004, 0xd09c, 0x0100, - 0x000e, 0x0005, 0x0006, 0x0016, 0x0126, 0x2091, 0x8000, 0x2001, - 0x0101, 0x200c, 0xa18d, 0x0006, 0x2102, 0x012e, 0x001e, 0x000e, - 0x0005, 0x2001, 0xb60d, 0x2004, 0xd0bc, 0x0158, 0x0026, 0x0036, - 0x2011, 0x8017, 0x2001, 0xb8bf, 0x201c, 0x080c, 0x3f13, 0x003e, - 0x002e, 0x0005, 0x0156, 0x20a9, 0x00ff, 0x2009, 0xb735, 0xa006, - 0x200a, 0x8108, 0x1f04, 0x4c78, 0x015e, 0x0005, 0x00d6, 0x0036, - 0x0156, 0x0136, 0x0146, 0x2069, 0xb652, 0xa006, 0x6002, 0x6007, - 0x0707, 0x600a, 0x600e, 0x6012, 0xa198, 0x2df9, 0x231d, 0xa39c, - 0x00ff, 0x6316, 0x20a9, 0x0004, 0xac98, 0x0006, 0x23a0, 0x40a4, - 0x20a9, 0x0004, 0xac98, 0x000a, 0x23a0, 0x40a4, 0x603e, 0x6042, - 0x604e, 0x6052, 0x6056, 0x605a, 0x605e, 0x6062, 0x6066, 0x606a, - 0x606e, 0x6072, 0x6076, 0x607a, 0x607e, 0x6082, 0x6086, 0x608a, - 0x608e, 0x6092, 0x6096, 0x609a, 0x609e, 0x60ae, 0x61a2, 0x00d6, - 0x60a4, 0xa06d, 0x0110, 0x080c, 0x1614, 0x60a7, 0x0000, 0x60a8, - 0xa06d, 0x0110, 0x080c, 0x1614, 0x60ab, 0x0000, 0x00de, 0xa006, - 0x604a, 0x6810, 0x603a, 0x680c, 0x6046, 0x6814, 0xa084, 0x00ff, - 0x6042, 0x014e, 0x013e, 0x015e, 0x003e, 0x00de, 0x0005, 0x0126, - 0x2091, 0x8000, 0x6944, 0x6e48, 0xa684, 0x3fff, 0xa082, 0x4000, - 0x1a04, 0x4d8c, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff, 0x1a04, - 0x4d91, 0x2001, 0xb60c, 0x2004, 0xa084, 0x0003, 0x01c0, 0x2001, - 0xb60c, 0x2004, 0xd084, 0x1904, 0x4d74, 0xa188, 0xb735, 0x2104, - 0xa065, 0x0904, 0x4d74, 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, - 0x1904, 0x4d74, 0x6000, 0xd0c4, 0x0904, 0x4d74, 0x0068, 0xa188, - 0xb735, 0x2104, 0xa065, 0x0904, 0x4d59, 0x6004, 0xa084, 0x00ff, - 0xa08e, 0x0006, 0x1904, 0x4d5e, 0x60a4, 0xa00d, 0x0118, 0x080c, - 0x5246, 0x05d0, 0x60a8, 0xa00d, 0x0188, 0x080c, 0x5291, 0x1170, - 0x694c, 0xd1fc, 0x1118, 0x080c, 0x4f50, 0x0448, 0x080c, 0x4eff, - 0x694c, 0xd1ec, 0x1520, 0x080c, 0x5138, 0x0408, 0x694c, 0xa184, - 0xa000, 0x0178, 0xd1ec, 0x0140, 0xd1fc, 0x0118, 0x080c, 0x5147, - 0x0028, 0x080c, 0x5147, 0x0028, 0xd1fc, 0x0118, 0x080c, 0x4eff, - 0x0070, 0x6050, 0xa00d, 0x0130, 0x2d00, 0x200a, 0x6803, 0x0000, - 0x6052, 0x0028, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x080c, - 0x6d1c, 0xa006, 0x012e, 0x0005, 0x2001, 0x0005, 0x2009, 0x0000, - 0x04e0, 0x2001, 0x0028, 0x2009, 0x0000, 0x04b8, 0xa082, 0x0006, - 0x1298, 0x2001, 0xb635, 0x2004, 0xd0ac, 0x1158, 0x60a0, 0xd0bc, - 0x1140, 0x6100, 0xd1fc, 0x0128, 0x2001, 0x0029, 0x2009, 0x1000, - 0x0420, 0x2001, 0x0028, 0x00a8, 0x2009, 0xb60c, 0x210c, 0xd18c, - 0x0118, 0x2001, 0x0004, 0x0068, 0xd184, 0x0118, 0x2001, 0x0004, - 0x0040, 0x2001, 0x0029, 0x6100, 0xd1fc, 0x0118, 0x2009, 0x1000, - 0x0060, 0x2009, 0x0000, 0x0048, 0x2001, 0x0029, 0x2009, 0x0000, - 0x0020, 0x2001, 0x0029, 0x2009, 0x0000, 0xa005, 0x012e, 0x0005, - 0x00e6, 0x0126, 0x2091, 0x8000, 0x6844, 0x8007, 0xa084, 0x00ff, - 0x2008, 0xa182, 0x00ff, 0x1a04, 0x4deb, 0xa188, 0xb735, 0x2104, - 0xa065, 0x01c0, 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x11a8, - 0x2c70, 0x080c, 0x864e, 0x05e8, 0x2e00, 0x601a, 0x2d00, 0x6012, - 0x600b, 0xffff, 0x601f, 0x000a, 0x2009, 0x0003, 0x080c, 0x86d3, - 0xa006, 0x0460, 0x2001, 0x0028, 0x0440, 0xa082, 0x0006, 0x1298, - 0x2001, 0xb635, 0x2004, 0xd0ac, 0x1158, 0x60a0, 0xd0bc, 0x1140, - 0x6100, 0xd1fc, 0x09e8, 0x2001, 0x0029, 0x2009, 0x1000, 0x00a8, - 0x2001, 0x0028, 0x0090, 0x2009, 0xb60c, 0x210c, 0xd18c, 0x0118, - 0x2001, 0x0004, 0x0050, 0xd184, 0x0118, 0x2001, 0x0004, 0x0028, - 0x2001, 0x0029, 0x0010, 0x2001, 0x0029, 0xa005, 0x012e, 0x00ee, - 0x0005, 0x2001, 0x002c, 0x0cc8, 0x00f6, 0x00e6, 0x0126, 0x2091, - 0x8000, 0x2011, 0x0000, 0x2079, 0xb600, 0x6944, 0xa18c, 0xff00, - 0x810f, 0xa182, 0x00ff, 0x1a04, 0x4eb6, 0x080c, 0x501b, 0x11a0, - 0x6004, 0xa084, 0x00ff, 0xa082, 0x0006, 0x1270, 0x6864, 0xa0c6, - 0x006f, 0x0150, 0x2001, 0xb635, 0x2004, 0xd0ac, 0x1904, 0x4e9f, - 0x60a0, 0xd0bc, 0x1904, 0x4e9f, 0x6864, 0xa0c6, 0x006f, 0x0118, - 0x2008, 0x0804, 0x4e68, 0x6968, 0x2140, 0xa18c, 0xff00, 0x810f, - 0x78d4, 0xd0ac, 0x1118, 0xa182, 0x0080, 0x06d0, 0xa182, 0x00ff, - 0x16b8, 0x6a70, 0x6b6c, 0x7870, 0xa306, 0x1160, 0x7874, 0xa24e, - 0x1118, 0x2208, 0x2310, 0x0460, 0xa9cc, 0xff00, 0x1118, 0x2208, - 0x2310, 0x0430, 0x080c, 0x3e0c, 0x2c70, 0x0550, 0x2009, 0x0000, - 0x2011, 0x0000, 0xa0c6, 0x4000, 0x1160, 0x0006, 0x2e60, 0x080c, - 0x52bc, 0x1108, 0xc185, 0x7000, 0xd0bc, 0x0108, 0xc18d, 0x000e, - 0x0088, 0xa0c6, 0x4007, 0x1110, 0x2408, 0x0060, 0xa0c6, 0x4008, - 0x1118, 0x2708, 0x2610, 0x0030, 0xa0c6, 0x4009, 0x1108, 0x0010, - 0x2001, 0x4006, 0x6866, 0x696a, 0x6a6e, 0x2001, 0x0030, 0x0450, - 0x080c, 0x864e, 0x1138, 0x2001, 0x4005, 0x2009, 0x0003, 0x2011, - 0x0000, 0x0c80, 0x2e00, 0x601a, 0x080c, 0xa0e3, 0x2d00, 0x6012, - 0x601f, 0x0001, 0x6838, 0xd88c, 0x0108, 0xc0f5, 0x683a, 0x0126, - 0x2091, 0x8000, 0x080c, 0x2cd1, 0x012e, 0x2001, 0x0000, 0x080c, - 0x4f5d, 0x2001, 0x0002, 0x080c, 0x4f6f, 0x2009, 0x0002, 0x080c, - 0x86d3, 0xa006, 0xa005, 0x012e, 0x00ee, 0x00fe, 0x0005, 0x2001, - 0x0028, 0x2009, 0x0000, 0x0cb0, 0x2009, 0xb60c, 0x210c, 0xd18c, - 0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, 0x0004, - 0x0010, 0x2001, 0x0029, 0x2009, 0x0000, 0x0c20, 0x2001, 0x0029, - 0x2009, 0x0000, 0x08f8, 0x6944, 0x6e48, 0xa684, 0x3fff, 0xa082, - 0x4000, 0x16b8, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff, 0x12e0, - 0xa188, 0xb735, 0x2104, 0xa065, 0x01b8, 0x6004, 0xa084, 0x00ff, - 0xa08e, 0x0006, 0x11b0, 0x684c, 0xd0ec, 0x0120, 0x080c, 0x5147, - 0x0431, 0x0030, 0x0421, 0x684c, 0xd0fc, 0x0110, 0x080c, 0x5138, - 0x080c, 0x5185, 0xa006, 0x00c8, 0x2001, 0x0028, 0x2009, 0x0000, - 0x00a0, 0xa082, 0x0006, 0x1240, 0x6100, 0xd1fc, 0x0d20, 0x2001, - 0x0029, 0x2009, 0x1000, 0x0048, 0x2001, 0x0029, 0x2009, 0x0000, - 0x0020, 0x2001, 0x0029, 0x2009, 0x0000, 0xa005, 0x0005, 0x0126, - 0x2091, 0x8000, 0x6050, 0xa00d, 0x0138, 0x2d00, 0x200a, 0x6803, - 0x0000, 0x6052, 0x012e, 0x0005, 0x2d00, 0x6052, 0x604e, 0x6803, - 0x0000, 0x0cc0, 0x0126, 0x2091, 0x8000, 0x604c, 0xa005, 0x0170, - 0x00e6, 0x2071, 0xb8e1, 0x7004, 0xa086, 0x0002, 0x0168, 0x00ee, - 0x604c, 0x6802, 0x2d00, 0x604e, 0x012e, 0x0005, 0x2d00, 0x6052, - 0x604e, 0x6803, 0x0000, 0x0cc0, 0x701c, 0xac06, 0x1d80, 0x604c, - 0x2070, 0x7000, 0x6802, 0x2d00, 0x7002, 0x00ee, 0x012e, 0x0005, - 0x0126, 0x2091, 0x8000, 0x604c, 0xa06d, 0x0130, 0x6800, 0xa005, - 0x1108, 0x6052, 0x604e, 0xad05, 0x012e, 0x0005, 0x604c, 0xa06d, - 0x0130, 0x6800, 0xa005, 0x1108, 0x6052, 0x604e, 0xad05, 0x0005, - 0x6803, 0x0000, 0x6084, 0xa00d, 0x0120, 0x2d00, 0x200a, 0x6086, - 0x0005, 0x2d00, 0x6086, 0x6082, 0x0cd8, 0x0126, 0x00c6, 0x0026, - 0x2091, 0x8000, 0x6218, 0x2260, 0x6200, 0xa005, 0x0110, 0xc285, - 0x0008, 0xc284, 0x6202, 0x002e, 0x00ce, 0x012e, 0x0005, 0x0126, - 0x00c6, 0x2091, 0x8000, 0x6218, 0x2260, 0x6204, 0x0006, 0xa086, - 0x0006, 0x1180, 0x609c, 0xd0ac, 0x0168, 0x2001, 0xb653, 0x2004, - 0xd0a4, 0x0140, 0xa284, 0xff00, 0x8007, 0xa086, 0x0007, 0x1110, - 0x2011, 0x0600, 0x000e, 0xa294, 0xff00, 0xa215, 0x6206, 0x0006, - 0xa086, 0x0006, 0x1128, 0x6290, 0x82ff, 0x1110, 0x080c, 0x151a, - 0x000e, 0x00ce, 0x012e, 0x0005, 0x0126, 0x00c6, 0x2091, 0x8000, - 0x6218, 0x2260, 0x6204, 0x0006, 0xa086, 0x0006, 0x1178, 0x609c, - 0xd0a4, 0x0160, 0x2001, 0xb653, 0x2004, 0xd0ac, 0x1138, 0xa284, - 0x00ff, 0xa086, 0x0007, 0x1110, 0x2011, 0x0006, 0x000e, 0xa294, - 0x00ff, 0x8007, 0xa215, 0x6206, 0x00ce, 0x012e, 0x0005, 0x0026, - 0xa182, 0x00ff, 0x0218, 0xa085, 0x0001, 0x00b0, 0xa190, 0xb735, - 0x2204, 0xa065, 0x1180, 0x0016, 0x00d6, 0x080c, 0x15e4, 0x2d60, - 0x00de, 0x001e, 0x0d80, 0x2c00, 0x2012, 0x60a7, 0x0000, 0x60ab, - 0x0000, 0x080c, 0x4c7e, 0xa006, 0x002e, 0x0005, 0x0126, 0x2091, - 0x8000, 0x0026, 0xa182, 0x00ff, 0x0218, 0xa085, 0x0001, 0x0480, - 0x00d6, 0xa190, 0xb735, 0x2204, 0xa06d, 0x0540, 0x2013, 0x0000, - 0x00d6, 0x00c6, 0x2d60, 0x60a4, 0xa06d, 0x0110, 0x080c, 0x1614, - 0x60a8, 0xa06d, 0x0110, 0x080c, 0x1614, 0x00ce, 0x00de, 0x00d6, - 0x00c6, 0x68ac, 0x2060, 0x8cff, 0x0168, 0x600c, 0x0006, 0x6010, - 0x2068, 0x080c, 0x9d16, 0x0110, 0x080c, 0x1624, 0x080c, 0x86a4, - 0x00ce, 0x0c88, 0x00ce, 0x00de, 0x080c, 0x1614, 0x00de, 0xa006, - 0x002e, 0x012e, 0x0005, 0x0016, 0xa182, 0x00ff, 0x0218, 0xa085, - 0x0001, 0x0030, 0xa188, 0xb735, 0x2104, 0xa065, 0x0dc0, 0xa006, - 0x001e, 0x0005, 0x00d6, 0x0156, 0x0136, 0x0146, 0x600b, 0x0000, - 0x600f, 0x0000, 0x6000, 0xc08c, 0x6002, 0x080c, 0x5b41, 0x1558, - 0x60a0, 0xa086, 0x007e, 0x2069, 0xbc90, 0x0130, 0x2001, 0xb635, - 0x2004, 0xd0ac, 0x1500, 0x0098, 0x2d04, 0xd0e4, 0x01e0, 0x00d6, - 0x2069, 0xbc8e, 0x00c6, 0x2061, 0xb8b2, 0x6810, 0x2062, 0x6814, - 0x6006, 0x6818, 0x600a, 0x681c, 0x600e, 0x00ce, 0x00de, 0x8d69, - 0x2d04, 0x2069, 0x0140, 0xa005, 0x1110, 0x2001, 0x0001, 0x6886, - 0x2069, 0xb600, 0x68a6, 0x2069, 0xbc8e, 0x6808, 0x605e, 0x6810, - 0x6062, 0x6138, 0xa10a, 0x0208, 0x603a, 0x6814, 0x6066, 0x2099, - 0xbc96, 0xac88, 0x000a, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2099, - 0xbc9a, 0xac88, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2069, - 0xbcae, 0x6808, 0x606a, 0x690c, 0x616e, 0x6810, 0x6072, 0x6818, - 0x6076, 0x60a0, 0xa086, 0x007e, 0x1120, 0x2069, 0xbc8e, 0x690c, - 0x616e, 0xa182, 0x0211, 0x1218, 0x2009, 0x0008, 0x0400, 0xa182, - 0x0259, 0x1218, 0x2009, 0x0007, 0x00d0, 0xa182, 0x02c1, 0x1218, - 0x2009, 0x0006, 0x00a0, 0xa182, 0x0349, 0x1218, 0x2009, 0x0005, - 0x0070, 0xa182, 0x0421, 0x1218, 0x2009, 0x0004, 0x0040, 0xa182, - 0x0581, 0x1218, 0x2009, 0x0003, 0x0010, 0x2009, 0x0002, 0x6192, - 0x014e, 0x013e, 0x015e, 0x00de, 0x0005, 0x0016, 0x0026, 0x00e6, - 0x2071, 0xbc8d, 0x2e04, 0x6896, 0x2071, 0xbc8e, 0x7004, 0x689a, - 0x701c, 0x689e, 0x6a00, 0x2009, 0xb672, 0x210c, 0xd0bc, 0x0120, - 0xd1ec, 0x0110, 0xc2ad, 0x0008, 0xc2ac, 0xd0c4, 0x0120, 0xd1e4, - 0x0110, 0xc2bd, 0x0008, 0xc2bc, 0x6a02, 0x00ee, 0x002e, 0x001e, - 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x60a4, 0xa06d, 0x01c0, - 0x6900, 0x81ff, 0x1540, 0x6a04, 0xa282, 0x0010, 0x1648, 0xad88, - 0x0004, 0x20a9, 0x0010, 0x2104, 0xa086, 0xffff, 0x0128, 0x8108, - 0x1f04, 0x50f3, 0x080c, 0x151a, 0x260a, 0x8210, 0x6a06, 0x0098, - 0x080c, 0x15fd, 0x01a8, 0x2d00, 0x60a6, 0x6803, 0x0000, 0xad88, - 0x0004, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, 0x1f04, 0x510b, - 0x6807, 0x0001, 0x6e12, 0xa085, 0x0001, 0x012e, 0x00de, 0x0005, - 0xa006, 0x0cd8, 0x0126, 0x2091, 0x8000, 0x00d6, 0x60a4, 0xa00d, - 0x01a0, 0x2168, 0x6800, 0xa005, 0x1160, 0x080c, 0x5246, 0x1168, - 0x200b, 0xffff, 0x6804, 0xa08a, 0x0002, 0x0218, 0x8001, 0x6806, - 0x0020, 0x080c, 0x1614, 0x60a7, 0x0000, 0x00de, 0x012e, 0x0005, - 0x0126, 0x2091, 0x8000, 0x080c, 0x52a4, 0x0010, 0x080c, 0x4eff, - 0x080c, 0x51be, 0x1dd8, 0x080c, 0x5185, 0x012e, 0x0005, 0x00d6, - 0x0126, 0x2091, 0x8000, 0x60a8, 0xa06d, 0x01c0, 0x6950, 0x81ff, - 0x1540, 0x6a54, 0xa282, 0x0010, 0x1670, 0xad88, 0x0018, 0x20a9, - 0x0010, 0x2104, 0xa086, 0xffff, 0x0128, 0x8108, 0x1f04, 0x5159, - 0x080c, 0x151a, 0x260a, 0x8210, 0x6a56, 0x0098, 0x080c, 0x15fd, - 0x01d0, 0x2d00, 0x60aa, 0x6853, 0x0000, 0xad88, 0x0018, 0x20a9, - 0x0010, 0x200b, 0xffff, 0x8108, 0x1f04, 0x5171, 0x6857, 0x0001, - 0x6e62, 0x0010, 0x080c, 0x4f50, 0x0089, 0x1de0, 0xa085, 0x0001, - 0x012e, 0x00de, 0x0005, 0xa006, 0x0cd8, 0x0126, 0x2091, 0x8000, - 0x080c, 0x6d1c, 0x012e, 0x0005, 0xa01e, 0x0010, 0x2019, 0x0001, - 0xa00e, 0x0126, 0x2091, 0x8000, 0x604c, 0x2068, 0x6000, 0xd0dc, - 0x1170, 0x8dff, 0x01f8, 0x83ff, 0x0120, 0x6848, 0xa606, 0x0158, - 0x0030, 0x683c, 0xa406, 0x1118, 0x6840, 0xa506, 0x0120, 0x2d08, - 0x6800, 0x2068, 0x0c70, 0x080c, 0x81a5, 0x6a00, 0x604c, 0xad06, - 0x1110, 0x624e, 0x0018, 0xa180, 0x0000, 0x2202, 0x82ff, 0x1110, - 0x6152, 0x8dff, 0x012e, 0x0005, 0xa01e, 0x0010, 0x2019, 0x0001, - 0xa00e, 0x6080, 0x2068, 0x8dff, 0x01e8, 0x83ff, 0x0120, 0x6848, - 0xa606, 0x0158, 0x0030, 0x683c, 0xa406, 0x1118, 0x6840, 0xa506, - 0x0120, 0x2d08, 0x6800, 0x2068, 0x0c70, 0x6a00, 0x6080, 0xad06, - 0x1110, 0x6282, 0x0018, 0xa180, 0x0000, 0x2202, 0x82ff, 0x1110, - 0x6186, 0x8dff, 0x0005, 0xa016, 0x080c, 0x5240, 0x1110, 0x2011, - 0x0001, 0x080c, 0x528b, 0x1110, 0xa295, 0x0002, 0x0005, 0x080c, - 0x52bc, 0x0118, 0x080c, 0x9dcb, 0x0010, 0xa085, 0x0001, 0x0005, - 0x080c, 0x52bc, 0x0118, 0x080c, 0x9d5b, 0x0010, 0xa085, 0x0001, - 0x0005, 0x080c, 0x52bc, 0x0118, 0x080c, 0x9dae, 0x0010, 0xa085, - 0x0001, 0x0005, 0x080c, 0x52bc, 0x0118, 0x080c, 0x9d77, 0x0010, - 0xa085, 0x0001, 0x0005, 0x080c, 0x52bc, 0x0118, 0x080c, 0x9de7, - 0x0010, 0xa085, 0x0001, 0x0005, 0x0126, 0x0006, 0x00d6, 0x2091, - 0x8000, 0x6080, 0xa06d, 0x01a0, 0x6800, 0x0006, 0x6837, 0x0103, - 0x6b4a, 0x6847, 0x0000, 0x080c, 0x9f88, 0x0006, 0x6000, 0xd0fc, - 0x0110, 0x080c, 0xb445, 0x000e, 0x080c, 0x547a, 0x000e, 0x0c50, - 0x6083, 0x0000, 0x6087, 0x0000, 0x00de, 0x000e, 0x012e, 0x0005, - 0x60a4, 0xa00d, 0x1118, 0xa085, 0x0001, 0x0005, 0x00e6, 0x2170, - 0x7000, 0xa005, 0x1168, 0x20a9, 0x0010, 0xae88, 0x0004, 0x2104, - 0xa606, 0x0130, 0x8108, 0x1f04, 0x524f, 0xa085, 0x0001, 0x0008, - 0xa006, 0x00ee, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x60a4, - 0xa06d, 0x1128, 0x080c, 0x15fd, 0x01a0, 0x2d00, 0x60a6, 0x6803, - 0x0001, 0x6807, 0x0000, 0xad88, 0x0004, 0x20a9, 0x0010, 0x200b, - 0xffff, 0x8108, 0x1f04, 0x526f, 0xa085, 0x0001, 0x012e, 0x00de, - 0x0005, 0xa006, 0x0cd8, 0x00d6, 0x0126, 0x2091, 0x8000, 0x60a4, - 0xa06d, 0x0130, 0x60a7, 0x0000, 0x080c, 0x1614, 0xa085, 0x0001, - 0x012e, 0x00de, 0x0005, 0x60a8, 0xa00d, 0x1118, 0xa085, 0x0001, - 0x0005, 0x00e6, 0x2170, 0x7050, 0xa005, 0x1160, 0x20a9, 0x0010, - 0xae88, 0x0018, 0x2104, 0xa606, 0x0128, 0x8108, 0x1f04, 0x529a, - 0xa085, 0x0001, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x0c19, - 0x1188, 0x200b, 0xffff, 0x00d6, 0x60a8, 0x2068, 0x6854, 0xa08a, - 0x0002, 0x0218, 0x8001, 0x6856, 0x0020, 0x080c, 0x1614, 0x60ab, - 0x0000, 0x00de, 0x012e, 0x0005, 0x609c, 0xd0a4, 0x0005, 0x00f6, - 0x080c, 0x5b41, 0x01b0, 0x71b8, 0x81ff, 0x1198, 0x71d4, 0xd19c, - 0x0180, 0x2001, 0x007e, 0xa080, 0xb735, 0x2004, 0xa07d, 0x0148, - 0x7804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1118, 0x7800, 0xc0ed, - 0x7802, 0x2079, 0xb652, 0x7804, 0xd0a4, 0x01e8, 0x0156, 0x00c6, - 0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, 0x080c, 0x501b, 0x1168, - 0x6004, 0xa084, 0xff00, 0x8007, 0xa096, 0x0004, 0x0118, 0xa086, - 0x0006, 0x1118, 0x6000, 0xc0ed, 0x6002, 0x001e, 0x8108, 0x1f04, - 0x52e4, 0x00ce, 0x015e, 0x080c, 0x537b, 0x0120, 0x2001, 0xb8b5, - 0x200c, 0x0038, 0x2079, 0xb652, 0x7804, 0xd0a4, 0x0130, 0x2009, - 0x07d0, 0x2011, 0x530f, 0x080c, 0x6a94, 0x00fe, 0x0005, 0x2011, - 0x530f, 0x080c, 0x6a0e, 0x080c, 0x537b, 0x01f0, 0x2001, 0xb7b3, - 0x2004, 0xa080, 0x0000, 0x200c, 0xc1ec, 0x2102, 0x2001, 0xb653, - 0x2004, 0xd0a4, 0x0130, 0x2009, 0x07d0, 0x2011, 0x530f, 0x080c, - 0x6a94, 0x00e6, 0x2071, 0xb600, 0x7073, 0x0000, 0x7077, 0x0000, - 0x080c, 0x2aed, 0x00ee, 0x04b0, 0x0156, 0x00c6, 0x20a9, 0x007f, - 0x2009, 0x0000, 0x0016, 0x080c, 0x501b, 0x1530, 0x6000, 0xd0ec, - 0x0518, 0x0046, 0x62a0, 0xa294, 0x00ff, 0x8227, 0xa006, 0x2009, - 0x0029, 0x080c, 0xb1a4, 0x6000, 0xc0e5, 0xc0ec, 0x6002, 0x6004, - 0xa084, 0x00ff, 0xa085, 0x0700, 0x6006, 0x2019, 0x0029, 0x080c, - 0x6e67, 0x0076, 0x2039, 0x0000, 0x080c, 0x6d74, 0x2009, 0x0000, - 0x080c, 0xaf3e, 0x007e, 0x004e, 0x001e, 0x8108, 0x1f04, 0x533a, - 0x00ce, 0x015e, 0x0005, 0x00c6, 0x6018, 0x2060, 0x6000, 0xc0ec, - 0x6002, 0x00ce, 0x0005, 0x7818, 0x2004, 0xd0ac, 0x0005, 0x7818, - 0x2004, 0xd0bc, 0x0005, 0x00f6, 0x2001, 0xb7b3, 0x2004, 0xa07d, - 0x0110, 0x7800, 0xd0ec, 0x00fe, 0x0005, 0x0126, 0x0026, 0x2091, - 0x8000, 0x0006, 0x62a0, 0xa290, 0xb735, 0x2204, 0xac06, 0x190c, - 0x151a, 0x000e, 0x6200, 0xa005, 0x0110, 0xc2fd, 0x0008, 0xc2fc, - 0x6202, 0x002e, 0x012e, 0x0005, 0x2011, 0xb635, 0x2204, 0xd0cc, - 0x0138, 0x2001, 0xb8b3, 0x200c, 0x2011, 0x53a9, 0x080c, 0x6a94, - 0x0005, 0x2011, 0x53a9, 0x080c, 0x6a0e, 0x2011, 0xb635, 0x2204, - 0xc0cc, 0x2012, 0x0005, 0x2071, 0xb714, 0x7003, 0x0001, 0x7007, - 0x0000, 0x7013, 0x0000, 0x7017, 0x0000, 0x701b, 0x0000, 0x701f, - 0x0000, 0x700b, 0x0000, 0x704b, 0x0001, 0x704f, 0x0000, 0x705b, - 0x0020, 0x705f, 0x0040, 0x707f, 0x0000, 0x2071, 0xb87d, 0x7003, - 0xb714, 0x7007, 0x0000, 0x700b, 0x0000, 0x700f, 0xb85d, 0x7013, - 0x0020, 0x7017, 0x0040, 0x7037, 0x0000, 0x0005, 0x0016, 0x00e6, - 0x2071, 0xb835, 0xa00e, 0x7186, 0x718a, 0x7097, 0x0001, 0x2001, - 0xb653, 0x2004, 0xd0fc, 0x1150, 0x2001, 0xb653, 0x2004, 0xa00e, - 0xd09c, 0x0108, 0x8108, 0x7102, 0x0804, 0x5444, 0x2001, 0xb672, - 0x200c, 0xa184, 0x000f, 0x2009, 0xb673, 0x210c, 0x0002, 0x53ec, - 0x541f, 0x5426, 0x5430, 0x5435, 0x53ec, 0x53ec, 0x53ec, 0x540f, - 0x53ec, 0x53ec, 0x53ec, 0x53ec, 0x53ec, 0x53ec, 0x53ec, 0x7003, - 0x0004, 0x0136, 0x0146, 0x0156, 0x2099, 0xb676, 0x20a1, 0xb886, - 0x20a9, 0x0004, 0x53a3, 0x015e, 0x014e, 0x013e, 0x0428, 0x708f, - 0x0005, 0x7007, 0x0122, 0x2001, 0x0002, 0x0030, 0x708f, 0x0002, - 0x7007, 0x0121, 0x2001, 0x0003, 0x7002, 0x7097, 0x0001, 0x0088, - 0x7007, 0x0122, 0x2001, 0x0002, 0x0020, 0x7007, 0x0121, 0x2001, - 0x0003, 0x7002, 0xa006, 0x7096, 0x708e, 0xa184, 0xff00, 0x8007, - 0x709a, 0xa184, 0x00ff, 0x7092, 0x00ee, 0x001e, 0x0005, 0x00e6, - 0x2071, 0xb714, 0x684c, 0xa005, 0x1130, 0x7028, 0xc085, 0x702a, - 0xa085, 0x0001, 0x0428, 0x6a60, 0x7236, 0x6b64, 0x733a, 0x6868, - 0x703e, 0x7076, 0x686c, 0x7042, 0x707a, 0x684c, 0x702e, 0x6844, - 0x7032, 0x2009, 0x000d, 0x200a, 0x700b, 0x0000, 0x8007, 0x8006, - 0x8006, 0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100, 0xa319, - 0x726e, 0x7372, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0xa006, - 0x00ee, 0x0005, 0x0156, 0x00e6, 0x0026, 0x6838, 0xd0fc, 0x1904, - 0x54d3, 0x6804, 0xa00d, 0x0188, 0x00d6, 0x2071, 0xb600, 0xa016, - 0x702c, 0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff, 0x1dc8, - 0x702e, 0x70b4, 0xa200, 0x70b6, 0x00de, 0x2071, 0xb714, 0x701c, - 0xa005, 0x1904, 0x54e3, 0x20a9, 0x0032, 0x0f04, 0x54e1, 0x0e04, - 0x549d, 0x2071, 0xb835, 0x7200, 0x82ff, 0x05d8, 0x6934, 0xa186, - 0x0103, 0x1904, 0x54f1, 0x6948, 0x6844, 0xa105, 0x1540, 0x2009, - 0x8020, 0x2200, 0x0002, 0x54e1, 0x54b8, 0x5509, 0x5515, 0x54e1, - 0x2071, 0x0000, 0x20a9, 0x0032, 0x0f04, 0x54e1, 0x7018, 0xd084, - 0x1dd8, 0x7122, 0x683c, 0x7026, 0x6840, 0x702a, 0x701b, 0x0001, - 0x2091, 0x4080, 0x2071, 0xb600, 0x702c, 0x206a, 0x2d00, 0x702e, - 0x70b4, 0x8000, 0x70b6, 0x002e, 0x00ee, 0x015e, 0x0005, 0x6844, - 0xa086, 0x0100, 0x1130, 0x6868, 0xa005, 0x1118, 0x2009, 0x8020, - 0x0880, 0x2071, 0xb714, 0x2d08, 0x206b, 0x0000, 0x7010, 0x8000, - 0x7012, 0x7018, 0xa06d, 0x711a, 0x0110, 0x6902, 0x0008, 0x711e, - 0x0c10, 0xa18c, 0x00ff, 0xa186, 0x0017, 0x0130, 0xa186, 0x001e, - 0x0118, 0xa18e, 0x001f, 0x1d28, 0x684c, 0xd0cc, 0x0d10, 0x6850, - 0xa084, 0x00ff, 0xa086, 0x0001, 0x19e0, 0x2009, 0x8021, 0x0804, - 0x54b1, 0x7084, 0x8008, 0xa092, 0x001e, 0x1a98, 0x7186, 0xae90, - 0x0003, 0xa210, 0x683c, 0x2012, 0x0078, 0x7084, 0x8008, 0xa092, - 0x000f, 0x1a38, 0x7186, 0xae90, 0x0003, 0x8003, 0xa210, 0x683c, - 0x2012, 0x8210, 0x6840, 0x2012, 0x7088, 0xa10a, 0x0a04, 0x54ca, - 0x718c, 0x7084, 0xa10a, 0x0a04, 0x54ca, 0x2071, 0x0000, 0x7018, - 0xd084, 0x1904, 0x54ca, 0x2071, 0xb835, 0x7000, 0xa086, 0x0002, - 0x1150, 0x080c, 0x5794, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, - 0x4080, 0x0804, 0x54ca, 0x080c, 0x57be, 0x2071, 0x0000, 0x701b, - 0x0001, 0x2091, 0x4080, 0x0804, 0x54ca, 0x0006, 0x684c, 0x0006, - 0x6837, 0x0103, 0x20a9, 0x001c, 0xad80, 0x0011, 0x20a0, 0x2001, - 0x0000, 0x40a4, 0x000e, 0xa084, 0x00ff, 0x684e, 0x000e, 0x684a, - 0x6952, 0x0005, 0x2071, 0xb714, 0x7004, 0x0002, 0x5570, 0x5581, - 0x577f, 0x5780, 0x578d, 0x5793, 0x5571, 0x5770, 0x5706, 0x575c, - 0x0005, 0x0126, 0x2091, 0x8000, 0x0e04, 0x5580, 0x2009, 0x000d, - 0x7030, 0x200a, 0x2091, 0x4080, 0x7007, 0x0001, 0x700b, 0x0000, - 0x012e, 0x2069, 0xb8f4, 0x683c, 0xa005, 0x03f8, 0x11f0, 0x0126, - 0x2091, 0x8000, 0x2069, 0x0000, 0x6934, 0x2001, 0xb720, 0x2004, - 0xa10a, 0x0170, 0x0e04, 0x55a4, 0x2069, 0x0000, 0x6818, 0xd084, - 0x1158, 0x2009, 0x8040, 0x6922, 0x681b, 0x0001, 0x2091, 0x4080, - 0x2069, 0xb8f4, 0x683f, 0xffff, 0x012e, 0x2069, 0xb600, 0x6848, - 0x6968, 0xa102, 0x2069, 0xb835, 0x688a, 0x6984, 0x701c, 0xa06d, - 0x0120, 0x81ff, 0x0904, 0x55fa, 0x00a0, 0x81ff, 0x0904, 0x56c0, - 0x2071, 0xb835, 0x7184, 0x7088, 0xa10a, 0x1258, 0x7190, 0x2071, - 0xb8f4, 0x7038, 0xa005, 0x0128, 0x1b04, 0x56c0, 0x713a, 0x0804, - 0x56c0, 0x2071, 0xb835, 0x718c, 0x0126, 0x2091, 0x8000, 0x7084, - 0xa10a, 0x0a04, 0x56db, 0x0e04, 0x567c, 0x2071, 0x0000, 0x7018, - 0xd084, 0x1904, 0x567c, 0x2001, 0xffff, 0x2071, 0xb8f4, 0x703a, - 0x2071, 0xb835, 0x7000, 0xa086, 0x0002, 0x1150, 0x080c, 0x5794, - 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0804, 0x567c, - 0x080c, 0x57be, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, - 0x0804, 0x567c, 0x2071, 0xb835, 0x7000, 0xa005, 0x0904, 0x56a2, - 0x6934, 0xa186, 0x0103, 0x1904, 0x567f, 0x684c, 0xd0bc, 0x1904, - 0x56a2, 0x6948, 0x6844, 0xa105, 0x1904, 0x5697, 0x2009, 0x8020, - 0x2071, 0xb835, 0x7000, 0x0002, 0x56a2, 0x5662, 0x563a, 0x564c, - 0x5619, 0x0136, 0x0146, 0x0156, 0x2099, 0xb676, 0x20a1, 0xb886, - 0x20a9, 0x0004, 0x53a3, 0x015e, 0x014e, 0x013e, 0x2071, 0xb87d, - 0xad80, 0x000f, 0x700e, 0x7013, 0x0002, 0x7007, 0x0002, 0x700b, - 0x0000, 0x2e10, 0x080c, 0x1648, 0x2071, 0xb714, 0x7007, 0x0009, - 0x0804, 0x56c0, 0x7084, 0x8008, 0xa092, 0x001e, 0x1a04, 0x56c0, - 0xae90, 0x0003, 0xa210, 0x683c, 0x2012, 0x7186, 0x2071, 0xb714, - 0x080c, 0x5815, 0x0804, 0x56c0, 0x7084, 0x8008, 0xa092, 0x000f, - 0x1a04, 0x56c0, 0xae90, 0x0003, 0x8003, 0xa210, 0x683c, 0x2012, - 0x8210, 0x6840, 0x2012, 0x7186, 0x2071, 0xb714, 0x080c, 0x5815, - 0x0804, 0x56c0, 0x0126, 0x2091, 0x8000, 0x0e04, 0x567c, 0x2071, - 0x0000, 0x7018, 0xd084, 0x1180, 0x7122, 0x683c, 0x7026, 0x6840, - 0x702a, 0x701b, 0x0001, 0x2091, 0x4080, 0x012e, 0x2071, 0xb714, - 0x080c, 0x5815, 0x0804, 0x56c0, 0x012e, 0x0804, 0x56c0, 0xa18c, - 0x00ff, 0xa186, 0x0017, 0x0130, 0xa186, 0x001e, 0x0118, 0xa18e, - 0x001f, 0x11c0, 0x684c, 0xd0cc, 0x01a8, 0x6850, 0xa084, 0x00ff, - 0xa086, 0x0001, 0x1178, 0x2009, 0x8021, 0x0804, 0x5610, 0x6844, - 0xa086, 0x0100, 0x1138, 0x6868, 0xa005, 0x1120, 0x2009, 0x8020, - 0x0804, 0x5610, 0x2071, 0xb714, 0x080c, 0x5827, 0x01c8, 0x2071, - 0xb714, 0x700f, 0x0001, 0x6934, 0xa184, 0x00ff, 0xa086, 0x0003, - 0x1130, 0x810f, 0xa18c, 0x00ff, 0x8101, 0x0108, 0x710e, 0x7007, - 0x0003, 0x080c, 0x5840, 0x7050, 0xa086, 0x0100, 0x0904, 0x5780, - 0x0126, 0x2091, 0x8000, 0x2071, 0xb714, 0x7008, 0xa086, 0x0001, - 0x1180, 0x0e04, 0x56d9, 0x2009, 0x000d, 0x7030, 0x200a, 0x2091, - 0x4080, 0x700b, 0x0000, 0x7004, 0xa086, 0x0006, 0x1110, 0x7007, - 0x0001, 0x012e, 0x0005, 0x2071, 0xb714, 0x080c, 0x5827, 0x0518, - 0x2071, 0xb835, 0x7084, 0x700a, 0x20a9, 0x0020, 0x2099, 0xb836, - 0x20a1, 0xb85d, 0x53a3, 0x7087, 0x0000, 0x2071, 0xb714, 0x2069, - 0xb87d, 0x706c, 0x6826, 0x7070, 0x682a, 0x7074, 0x682e, 0x7078, - 0x6832, 0x2d10, 0x080c, 0x1648, 0x7007, 0x0008, 0x2001, 0xffff, - 0x2071, 0xb8f4, 0x703a, 0x012e, 0x0804, 0x56c0, 0x2069, 0xb87d, - 0x6808, 0xa08e, 0x0000, 0x0904, 0x575b, 0xa08e, 0x0200, 0x0904, - 0x5759, 0xa08e, 0x0100, 0x1904, 0x575b, 0x0126, 0x2091, 0x8000, - 0x0e04, 0x5757, 0x2069, 0x0000, 0x6818, 0xd084, 0x15c0, 0x702c, - 0x7130, 0x8108, 0xa102, 0x0230, 0xa00e, 0x7034, 0x706e, 0x7038, - 0x7072, 0x0048, 0x706c, 0xa080, 0x0040, 0x706e, 0x1220, 0x7070, - 0xa081, 0x0000, 0x7072, 0x7132, 0x6936, 0x700b, 0x0000, 0x2001, - 0xb85a, 0x2004, 0xa005, 0x1190, 0x6934, 0x2069, 0xb835, 0x689c, - 0x699e, 0x2069, 0xb8f4, 0xa102, 0x1118, 0x683c, 0xa005, 0x1368, - 0x2001, 0xb85b, 0x200c, 0x810d, 0x693e, 0x0038, 0x2009, 0x8040, - 0x6922, 0x681b, 0x0001, 0x2091, 0x4080, 0x7007, 0x0001, 0x012e, - 0x0010, 0x7007, 0x0005, 0x0005, 0x2001, 0xb87f, 0x2004, 0xa08e, - 0x0100, 0x1128, 0x7007, 0x0001, 0x080c, 0x5815, 0x0005, 0xa08e, - 0x0000, 0x0de0, 0xa08e, 0x0200, 0x1dc8, 0x7007, 0x0005, 0x0005, - 0x701c, 0xa06d, 0x0158, 0x080c, 0x5827, 0x0140, 0x7007, 0x0003, - 0x080c, 0x5840, 0x7050, 0xa086, 0x0100, 0x0110, 0x0005, 0x0005, - 0x7050, 0xa09e, 0x0100, 0x1118, 0x7007, 0x0004, 0x0030, 0xa086, - 0x0200, 0x1110, 0x7007, 0x0005, 0x0005, 0x080c, 0x57e3, 0x7006, - 0x080c, 0x5815, 0x0005, 0x0005, 0x00e6, 0x0156, 0x2071, 0xb835, - 0x7184, 0x81ff, 0x0500, 0xa006, 0x7086, 0xae80, 0x0003, 0x2071, - 0x0000, 0x21a8, 0x2014, 0x7226, 0x8000, 0x0f04, 0x57b8, 0x2014, - 0x722a, 0x8000, 0x0f04, 0x57b8, 0x2014, 0x722e, 0x8000, 0x0f04, - 0x57b8, 0x2014, 0x723a, 0x8000, 0x0f04, 0x57b8, 0x2014, 0x723e, - 0xa180, 0x8030, 0x7022, 0x015e, 0x00ee, 0x0005, 0x00e6, 0x0156, - 0x2071, 0xb835, 0x7184, 0x81ff, 0x01d8, 0xa006, 0x7086, 0xae80, - 0x0003, 0x2071, 0x0000, 0x21a8, 0x2014, 0x7226, 0x8000, 0x2014, - 0x722a, 0x8000, 0x0f04, 0x57da, 0x2014, 0x723a, 0x8000, 0x2014, - 0x723e, 0x0018, 0x2001, 0x8020, 0x0010, 0x2001, 0x8042, 0x7022, - 0x015e, 0x00ee, 0x0005, 0x702c, 0x7130, 0x8108, 0xa102, 0x0230, - 0xa00e, 0x7034, 0x706e, 0x7038, 0x7072, 0x0048, 0x706c, 0xa080, - 0x0040, 0x706e, 0x1220, 0x7070, 0xa081, 0x0000, 0x7072, 0x7132, - 0x700c, 0x8001, 0x700e, 0x1180, 0x0126, 0x2091, 0x8000, 0x0e04, - 0x580f, 0x2001, 0x000d, 0x2102, 0x2091, 0x4080, 0x2001, 0x0001, - 0x700b, 0x0000, 0x012e, 0x0005, 0x2001, 0x0007, 0x0005, 0x2001, - 0x0006, 0x700b, 0x0001, 0x012e, 0x0005, 0x701c, 0xa06d, 0x0170, - 0x0126, 0x2091, 0x8000, 0x7010, 0x8001, 0x7012, 0x2d04, 0x701e, - 0xa005, 0x1108, 0x701a, 0x012e, 0x080c, 0x1614, 0x0005, 0x2019, - 0x000d, 0x2304, 0x230c, 0xa10e, 0x0130, 0x2304, 0x230c, 0xa10e, - 0x0110, 0xa006, 0x0060, 0x732c, 0x8319, 0x7130, 0xa102, 0x1118, - 0x2300, 0xa005, 0x0020, 0x0210, 0xa302, 0x0008, 0x8002, 0x0005, - 0x2d00, 0x7026, 0xa080, 0x000d, 0x7056, 0x7053, 0x0000, 0x0126, - 0x2091, 0x8000, 0x2009, 0xb913, 0x2104, 0xc08d, 0x200a, 0x012e, - 0x080c, 0x1664, 0x0005, 0x708c, 0xa08a, 0x0029, 0x1220, 0xa082, - 0x001d, 0x0033, 0x0010, 0x080c, 0x151a, 0x6027, 0x1e00, 0x0005, - 0x594e, 0x58c9, 0x58e1, 0x591e, 0x593f, 0x5979, 0x598b, 0x58e1, - 0x5965, 0x586d, 0x589b, 0x586c, 0x0005, 0x00d6, 0x2069, 0x0200, - 0x6804, 0xa005, 0x1180, 0x6808, 0xa005, 0x1518, 0x708f, 0x0028, - 0x2069, 0xb8c6, 0x2d04, 0x7002, 0x080c, 0x5c43, 0x6028, 0xa085, - 0x0600, 0x602a, 0x00b0, 0x708f, 0x0028, 0x2069, 0xb8c6, 0x2d04, - 0x7002, 0x6028, 0xa085, 0x0600, 0x602a, 0x00e6, 0x0036, 0x0046, - 0x0056, 0x2071, 0xb924, 0x080c, 0x1e1a, 0x005e, 0x004e, 0x003e, - 0x00ee, 0x00de, 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804, 0xa005, - 0x1180, 0x6808, 0xa005, 0x1518, 0x708f, 0x0028, 0x2069, 0xb8c6, - 0x2d04, 0x7002, 0x080c, 0x5cd0, 0x6028, 0xa085, 0x0600, 0x602a, - 0x00b0, 0x708f, 0x0028, 0x2069, 0xb8c6, 0x2d04, 0x7002, 0x6028, - 0xa085, 0x0600, 0x602a, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, - 0xb924, 0x080c, 0x1e1a, 0x005e, 0x004e, 0x003e, 0x00ee, 0x00de, - 0x0005, 0x6803, 0x0090, 0x6124, 0xd1e4, 0x1190, 0x080c, 0x59f6, - 0xd1d4, 0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x708f, 0x0020, - 0x080c, 0x59f6, 0x0028, 0x708f, 0x001d, 0x0010, 0x708f, 0x001f, - 0x0005, 0x6803, 0x0088, 0x6124, 0xd1cc, 0x1590, 0xd1dc, 0x1568, - 0xd1e4, 0x1540, 0xa184, 0x1e00, 0x1580, 0x60e3, 0x0001, 0x600c, - 0xc0b4, 0x600e, 0x080c, 0x5b71, 0x080c, 0x24e5, 0x0156, 0x6803, - 0x0100, 0x20a9, 0x0014, 0x6804, 0xd0dc, 0x1118, 0x1f04, 0x58fb, - 0x0048, 0x20a9, 0x0014, 0x6803, 0x0080, 0x6804, 0xd0d4, 0x1130, - 0x1f04, 0x5905, 0x080c, 0x5b92, 0x015e, 0x0078, 0x015e, 0x708f, - 0x0028, 0x0058, 0x708f, 0x001e, 0x0040, 0x708f, 0x001d, 0x0028, - 0x708f, 0x0020, 0x0010, 0x708f, 0x001f, 0x0005, 0x60e3, 0x0001, - 0x600c, 0xc0b4, 0x600e, 0x080c, 0x5b71, 0x080c, 0x24e5, 0x6803, - 0x0080, 0x6124, 0xd1d4, 0x1180, 0xd1dc, 0x1158, 0xd1e4, 0x1130, - 0xa184, 0x1e00, 0x1158, 0x708f, 0x0028, 0x0040, 0x708f, 0x001e, - 0x0028, 0x708f, 0x001d, 0x0010, 0x708f, 0x001f, 0x0005, 0x6803, - 0x00a0, 0x6124, 0xd1dc, 0x1138, 0xd1e4, 0x0138, 0x080c, 0x1e63, - 0x708f, 0x001e, 0x0010, 0x708f, 0x001d, 0x0005, 0x080c, 0x5a68, - 0x6124, 0xd1dc, 0x1188, 0x080c, 0x59f6, 0x0016, 0x080c, 0x1e63, - 0x001e, 0xd1d4, 0x1128, 0xd1e4, 0x0138, 0x708f, 0x001e, 0x0020, - 0x708f, 0x001f, 0x080c, 0x59f6, 0x0005, 0x6803, 0x00a0, 0x6124, - 0xd1d4, 0x1160, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, - 0x708f, 0x001e, 0x0028, 0x708f, 0x001d, 0x0010, 0x708f, 0x0021, - 0x0005, 0x080c, 0x5a68, 0x6124, 0xd1d4, 0x1150, 0xd1dc, 0x1128, - 0xd1e4, 0x0140, 0x708f, 0x001e, 0x0028, 0x708f, 0x001d, 0x0010, - 0x708f, 0x001f, 0x0005, 0x6803, 0x0090, 0x6124, 0xd1d4, 0x1178, - 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0158, 0x708f, 0x001e, - 0x0040, 0x708f, 0x001d, 0x0028, 0x708f, 0x0020, 0x0010, 0x708f, - 0x001f, 0x0005, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x0126, 0x2061, - 0x0100, 0x2069, 0x0140, 0x2071, 0xb600, 0x2091, 0x8000, 0x080c, - 0x5b41, 0x11e8, 0x2001, 0xb60c, 0x200c, 0xd1b4, 0x01c0, 0xc1b4, - 0x2102, 0x6027, 0x0200, 0xe000, 0xe000, 0x6024, 0xd0cc, 0x0158, - 0x6803, 0x00a0, 0x2001, 0xb89f, 0x2003, 0x0001, 0x2001, 0xb600, - 0x2003, 0x0001, 0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408, 0x080c, - 0x5b5d, 0x0150, 0x080c, 0x5b53, 0x1138, 0x2001, 0x0001, 0x080c, - 0x27f8, 0x080c, 0x5b18, 0x00a0, 0x080c, 0x5a65, 0x0178, 0x2001, - 0x0001, 0x080c, 0x27f8, 0x708c, 0xa086, 0x001e, 0x0120, 0x708c, - 0xa086, 0x0022, 0x1118, 0x708f, 0x0025, 0x0010, 0x708f, 0x0021, - 0x012e, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x0005, 0x0026, 0x2011, - 0x5a07, 0x080c, 0x6ace, 0x002e, 0x0016, 0x0026, 0x2009, 0x0064, - 0x2011, 0x5a07, 0x080c, 0x6ac5, 0x002e, 0x001e, 0x0005, 0x00e6, - 0x00f6, 0x0016, 0x080c, 0x7df3, 0x2071, 0xb600, 0x080c, 0x59a2, - 0x001e, 0x00fe, 0x00ee, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, - 0x00d6, 0x00e6, 0x00f6, 0x0126, 0x080c, 0x7df3, 0x2061, 0x0100, - 0x2069, 0x0140, 0x2071, 0xb600, 0x2091, 0x8000, 0x6028, 0xc09c, - 0x602a, 0x2011, 0x0003, 0x080c, 0x80fc, 0x2011, 0x0002, 0x080c, - 0x8106, 0x080c, 0x7fe0, 0x080c, 0x6a82, 0x0036, 0x2019, 0x0000, - 0x080c, 0x806b, 0x003e, 0x60e3, 0x0000, 0x080c, 0xb4eb, 0x080c, - 0xb506, 0x2001, 0xb600, 0x2003, 0x0004, 0x6027, 0x0008, 0x080c, - 0x12e2, 0x2001, 0x0001, 0x080c, 0x27f8, 0x012e, 0x00fe, 0x00ee, - 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, 0x2001, 0xb600, - 0x2004, 0xa086, 0x0004, 0x0140, 0x2001, 0xb89e, 0x2003, 0xaaaa, - 0x2001, 0xb89f, 0x2003, 0x0000, 0x0005, 0x6020, 0xd09c, 0x0005, - 0x6800, 0xa086, 0x00c0, 0x0160, 0x6803, 0x00c0, 0x0156, 0x20a9, - 0x002d, 0x1d04, 0x5a71, 0x2091, 0x6000, 0x1f04, 0x5a71, 0x015e, - 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, - 0x2071, 0xb600, 0x2001, 0xb89f, 0x200c, 0xa186, 0x0000, 0x0158, - 0xa186, 0x0001, 0x0158, 0xa186, 0x0002, 0x0158, 0xa186, 0x0003, - 0x0158, 0x0804, 0x5b06, 0x708f, 0x0022, 0x0040, 0x708f, 0x0021, - 0x0028, 0x708f, 0x0023, 0x0020, 0x708f, 0x0024, 0x6043, 0x0000, - 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x28a7, - 0x0026, 0x2011, 0x0003, 0x080c, 0x80fc, 0x2011, 0x0002, 0x080c, - 0x8106, 0x080c, 0x7fe0, 0x0036, 0x2019, 0x0000, 0x080c, 0x806b, - 0x003e, 0x002e, 0x7000, 0xa08e, 0x0004, 0x0118, 0x602b, 0x0028, - 0x0010, 0x602b, 0x0020, 0x0156, 0x0126, 0x2091, 0x8000, 0x20a9, - 0x0005, 0x6024, 0xd0ac, 0x0120, 0x012e, 0x015e, 0x0804, 0x5b14, - 0x6800, 0xa084, 0x00a0, 0xc0bd, 0x6802, 0x6904, 0xd1d4, 0x1130, - 0x6803, 0x0100, 0x1f04, 0x5ac9, 0x080c, 0x5b92, 0x012e, 0x015e, - 0x080c, 0x5b53, 0x01a8, 0x6044, 0xa005, 0x0168, 0x6050, 0x0006, - 0xa085, 0x0020, 0x6052, 0x080c, 0x5b92, 0xa006, 0x8001, 0x1df0, - 0x000e, 0x6052, 0x0028, 0x6804, 0xd0d4, 0x1110, 0x080c, 0x5b92, - 0x0016, 0x0026, 0x2009, 0x00c8, 0x2011, 0x5a14, 0x080c, 0x6a94, - 0x002e, 0x001e, 0x2001, 0xb89f, 0x2003, 0x0004, 0x080c, 0x5853, - 0x080c, 0x5b53, 0x0148, 0x6804, 0xd0d4, 0x1130, 0xd0dc, 0x1100, - 0x2001, 0xb89f, 0x2003, 0x0000, 0x00ee, 0x00de, 0x00ce, 0x0005, - 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, - 0xb600, 0x2001, 0xb89e, 0x2003, 0x0000, 0x2001, 0xb88f, 0x2003, - 0x0000, 0x708f, 0x0000, 0x60e3, 0x0000, 0x6887, 0x0000, 0x2001, - 0x0000, 0x080c, 0x28a7, 0x6803, 0x0000, 0x6043, 0x0090, 0x6043, - 0x0010, 0x6027, 0xffff, 0x602b, 0x182f, 0x00ee, 0x00de, 0x00ce, - 0x0005, 0x0006, 0x2001, 0xb89e, 0x2004, 0xa086, 0xaaaa, 0x000e, - 0x0005, 0x0006, 0x2001, 0xb672, 0x2004, 0xa084, 0x0030, 0xa086, - 0x0000, 0x000e, 0x0005, 0x0006, 0x2001, 0xb672, 0x2004, 0xa084, - 0x0030, 0xa086, 0x0030, 0x000e, 0x0005, 0x0006, 0x2001, 0xb672, - 0x2004, 0xa084, 0x0030, 0xa086, 0x0010, 0x000e, 0x0005, 0x0006, - 0x2001, 0xb672, 0x2004, 0xa084, 0x0030, 0xa086, 0x0020, 0x000e, - 0x0005, 0x2001, 0xb60c, 0x2004, 0xd0a4, 0x0170, 0x080c, 0x28c7, - 0x0036, 0x0016, 0x2009, 0x0000, 0x2019, 0x0028, 0x080c, 0x2ca4, - 0x001e, 0x003e, 0xa006, 0x0009, 0x0005, 0x00e6, 0x2071, 0xb60c, - 0x2e04, 0x0118, 0xa085, 0x0010, 0x0010, 0xa084, 0xffef, 0x2072, - 0x00ee, 0x0005, 0x6050, 0x0006, 0x60f0, 0x0006, 0x60ec, 0x0006, - 0x600c, 0x0006, 0x6004, 0x0006, 0x6028, 0x0006, 0x602f, 0x0100, - 0x602f, 0x0000, 0x602f, 0x0040, 0x602f, 0x0000, 0x000e, 0x602a, - 0x000e, 0x6006, 0x000e, 0x600e, 0x000e, 0x60ee, 0x000e, 0x60f2, - 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x28a7, - 0x6800, 0xa084, 0x00a0, 0xc0bd, 0x6802, 0x6803, 0x00a0, 0x000e, - 0x6052, 0x6050, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, - 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0xb600, - 0x6020, 0xa084, 0x0080, 0x0138, 0x2001, 0xb60c, 0x200c, 0xc1bd, - 0x2102, 0x0804, 0x5c3b, 0x2001, 0xb60c, 0x200c, 0xc1bc, 0x2102, - 0x6028, 0xa084, 0xe1ff, 0x602a, 0x6027, 0x0200, 0x6803, 0x0090, - 0x20a9, 0x0384, 0x6024, 0xd0cc, 0x1508, 0x1d04, 0x5bea, 0x2091, - 0x6000, 0x1f04, 0x5bea, 0x2011, 0x0003, 0x080c, 0x80fc, 0x2011, - 0x0002, 0x080c, 0x8106, 0x080c, 0x7fe0, 0x2019, 0x0000, 0x080c, - 0x806b, 0x6803, 0x00a0, 0x2001, 0xb89f, 0x2003, 0x0001, 0x2001, - 0xb600, 0x2003, 0x0001, 0xa085, 0x0001, 0x0468, 0x86ff, 0x1120, - 0x080c, 0x1e63, 0x080c, 0x24e5, 0x60e3, 0x0000, 0x2001, 0xb88f, - 0x2004, 0x080c, 0x28a7, 0x60e2, 0x6803, 0x0080, 0x20a9, 0x0384, - 0x6027, 0x1e00, 0x2009, 0x1e00, 0xe000, 0x6024, 0xa10c, 0x0138, - 0x1d04, 0x5c20, 0x2091, 0x6000, 0x1f04, 0x5c20, 0x0820, 0x6028, - 0xa085, 0x1e00, 0x602a, 0x70a4, 0xa005, 0x1118, 0x6887, 0x0001, - 0x0008, 0x6886, 0xa006, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, - 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, - 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071, 0xb600, 0x2069, 0x0140, - 0x6020, 0xa084, 0x00c0, 0x0120, 0x6884, 0xa005, 0x1904, 0x5c97, - 0x6803, 0x0088, 0x60e3, 0x0000, 0x6887, 0x0000, 0x2001, 0x0000, - 0x080c, 0x28a7, 0x2069, 0x0200, 0x6804, 0xa005, 0x1118, 0x6808, - 0xa005, 0x01c0, 0x6028, 0xa084, 0xfbff, 0x602a, 0x6027, 0x0400, - 0x2069, 0xb8c6, 0x7000, 0x206a, 0x708f, 0x0026, 0x7003, 0x0001, - 0x20a9, 0x0002, 0x1d04, 0x5c7a, 0x2091, 0x6000, 0x1f04, 0x5c7a, - 0x0804, 0x5cc8, 0x2069, 0x0140, 0x20a9, 0x0384, 0x6027, 0x1e00, - 0x2009, 0x1e00, 0xe000, 0x6024, 0xa10c, 0x0520, 0xa084, 0x1a00, - 0x1508, 0x1d04, 0x5c86, 0x2091, 0x6000, 0x1f04, 0x5c86, 0x2011, - 0x0003, 0x080c, 0x80fc, 0x2011, 0x0002, 0x080c, 0x8106, 0x080c, - 0x7fe0, 0x2019, 0x0000, 0x080c, 0x806b, 0x6803, 0x00a0, 0x2001, - 0xb89f, 0x2003, 0x0001, 0x2001, 0xb600, 0x2003, 0x0001, 0xa085, - 0x0001, 0x00b0, 0x080c, 0x24e5, 0x6803, 0x0080, 0x2069, 0x0140, - 0x60e3, 0x0000, 0x70a4, 0xa005, 0x1118, 0x6887, 0x0001, 0x0008, - 0x6886, 0x2001, 0xb88f, 0x2004, 0x080c, 0x28a7, 0x60e2, 0xa006, - 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, - 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, - 0x0100, 0x2071, 0xb600, 0x6020, 0xa084, 0x00c0, 0x01e0, 0x2011, - 0x0003, 0x080c, 0x80fc, 0x2011, 0x0002, 0x080c, 0x8106, 0x080c, - 0x7fe0, 0x2019, 0x0000, 0x080c, 0x806b, 0x2069, 0x0140, 0x6803, - 0x00a0, 0x2001, 0xb89f, 0x2003, 0x0001, 0x2001, 0xb600, 0x2003, - 0x0001, 0x0804, 0x5d6d, 0x2001, 0xb60c, 0x200c, 0xd1b4, 0x1160, - 0xc1b5, 0x2102, 0x080c, 0x59fc, 0x2069, 0x0140, 0x080c, 0x24e5, - 0x6803, 0x0080, 0x60e3, 0x0000, 0x2069, 0x0200, 0x6804, 0xa005, - 0x1118, 0x6808, 0xa005, 0x01c0, 0x6028, 0xa084, 0xfdff, 0x602a, - 0x6027, 0x0200, 0x2069, 0xb8c6, 0x7000, 0x206a, 0x708f, 0x0027, - 0x7003, 0x0001, 0x20a9, 0x0002, 0x1d04, 0x5d24, 0x2091, 0x6000, - 0x1f04, 0x5d24, 0x0804, 0x5d6d, 0x6027, 0x1e00, 0x2009, 0x1e00, - 0xe000, 0x6024, 0xa10c, 0x01c8, 0xa084, 0x1c00, 0x11b0, 0x1d04, - 0x5d2c, 0x0006, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x080c, 0x696b, - 0x00ee, 0x00de, 0x00ce, 0x001e, 0x000e, 0x00e6, 0x2071, 0xb8f4, - 0x7018, 0x00ee, 0xa005, 0x1d00, 0x0500, 0x0026, 0x2011, 0x5a14, - 0x080c, 0x6a0e, 0x2011, 0x5a07, 0x080c, 0x6ace, 0x002e, 0x2069, - 0x0140, 0x60e3, 0x0000, 0x70a4, 0xa005, 0x1118, 0x6887, 0x0001, - 0x0008, 0x6886, 0x2001, 0xb88f, 0x2004, 0x080c, 0x28a7, 0x60e2, - 0x2001, 0xb60c, 0x200c, 0xc1b4, 0x2102, 0x00ee, 0x00de, 0x00ce, - 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, - 0x0036, 0x0046, 0x00c6, 0x00e6, 0x2061, 0x0100, 0x2071, 0xb600, - 0x7130, 0xd184, 0x1180, 0x2011, 0xb653, 0x2214, 0xd2ec, 0x0138, - 0xc18d, 0x7132, 0x2011, 0xb653, 0x2214, 0xd2ac, 0x1120, 0x7030, - 0xd08c, 0x0904, 0x5dda, 0x7130, 0xc185, 0x7132, 0x2011, 0xb653, - 0x220c, 0xd1a4, 0x0530, 0x0016, 0x2019, 0x000e, 0x080c, 0xb121, - 0x0156, 0x20a9, 0x007f, 0x2009, 0x0000, 0xa186, 0x007e, 0x01a0, - 0xa186, 0x0080, 0x0188, 0x080c, 0x501b, 0x1170, 0x8127, 0xa006, - 0x0016, 0x2009, 0x000e, 0x080c, 0xb1a4, 0x2009, 0x0001, 0x2011, - 0x0100, 0x080c, 0x6b8c, 0x001e, 0x8108, 0x1f04, 0x5da5, 0x015e, - 0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009, 0x0000, 0x2019, 0x0004, - 0x080c, 0x2ca4, 0x001e, 0x0070, 0x0156, 0x20a9, 0x007f, 0x2009, - 0x0000, 0x080c, 0x501b, 0x1110, 0x080c, 0x4c7e, 0x8108, 0x1f04, - 0x5dd1, 0x015e, 0x080c, 0x1e63, 0x2011, 0x0003, 0x080c, 0x80fc, - 0x2011, 0x0002, 0x080c, 0x8106, 0x080c, 0x7fe0, 0x0036, 0x2019, - 0x0000, 0x080c, 0x806b, 0x003e, 0x60e3, 0x0000, 0x2001, 0xb600, - 0x2003, 0x0001, 0x080c, 0x5a79, 0x00ee, 0x00ce, 0x004e, 0x003e, - 0x002e, 0x001e, 0x015e, 0x0005, 0x2071, 0xb6e2, 0x7003, 0x0000, - 0x7007, 0x0000, 0x700f, 0x0000, 0x702b, 0x0001, 0x704f, 0x0000, - 0x7053, 0x0001, 0x705f, 0x0020, 0x7063, 0x0040, 0x7083, 0x0000, - 0x708b, 0x0000, 0x708f, 0x0001, 0x70bf, 0x0000, 0x0005, 0x00e6, - 0x2071, 0xb6e2, 0x6848, 0xa005, 0x1130, 0x7028, 0xc085, 0x702a, - 0xa085, 0x0001, 0x0428, 0x6a50, 0x7236, 0x6b54, 0x733a, 0x6858, - 0x703e, 0x707a, 0x685c, 0x7042, 0x707e, 0x6848, 0x702e, 0x6840, - 0x7032, 0x2009, 0x000c, 0x200a, 0x8007, 0x8006, 0x8006, 0xa08c, - 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100, 0xa319, 0x7272, 0x7376, - 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0x700f, 0x0000, 0xa006, - 0x00ee, 0x0005, 0x2b78, 0x2071, 0xb6e2, 0x7004, 0x0043, 0x700c, - 0x0002, 0x5e56, 0x5e4d, 0x5e4d, 0x5e4d, 0x5e4d, 0x0005, 0x5eac, - 0x5ead, 0x5edf, 0x5ee0, 0x5eaa, 0x5f2e, 0x5f33, 0x5f64, 0x5f65, - 0x5f80, 0x5f81, 0x5f82, 0x5f83, 0x5f84, 0x5f85, 0x603b, 0x6062, - 0x700c, 0x0002, 0x5e6f, 0x5eaa, 0x5eaa, 0x5eab, 0x5eab, 0x7830, - 0x7930, 0xa106, 0x0120, 0x7830, 0x7930, 0xa106, 0x1510, 0x7030, - 0xa10a, 0x01f8, 0x1210, 0x712c, 0xa10a, 0xa18a, 0x0002, 0x12d0, - 0x080c, 0x15e4, 0x01b0, 0x2d00, 0x705a, 0x7063, 0x0040, 0x2001, - 0x0003, 0x7057, 0x0000, 0x0126, 0x0006, 0x2091, 0x8000, 0x2009, - 0xb913, 0x2104, 0xc085, 0x200a, 0x000e, 0x700e, 0x012e, 0x080c, - 0x1664, 0x0005, 0x080c, 0x15e4, 0x0de0, 0x2d00, 0x705a, 0x080c, - 0x15e4, 0x1108, 0x0c10, 0x2d00, 0x7086, 0x7063, 0x0080, 0x2001, - 0x0004, 0x08f8, 0x0005, 0x0005, 0x0005, 0x700c, 0x0002, 0x5eb4, - 0x5eb7, 0x5ec5, 0x5ede, 0x5ede, 0x080c, 0x5e68, 0x0005, 0x0126, - 0x8001, 0x700e, 0x7058, 0x0006, 0x080c, 0x63b5, 0x0120, 0x2091, - 0x8000, 0x080c, 0x5e68, 0x00de, 0x0048, 0x0126, 0x8001, 0x700e, - 0x080c, 0x63b5, 0x7058, 0x2068, 0x7084, 0x705a, 0x6803, 0x0000, - 0x6807, 0x0000, 0x6834, 0xa084, 0x00ff, 0xa08a, 0x003a, 0x1218, - 0x00db, 0x012e, 0x0005, 0x012e, 0x080c, 0x5f86, 0x0005, 0x0005, - 0x0005, 0x00e6, 0x2071, 0xb6e2, 0x700c, 0x0002, 0x5eeb, 0x5eeb, - 0x5eeb, 0x5eed, 0x5ef0, 0x00ee, 0x0005, 0x700f, 0x0001, 0x0010, - 0x700f, 0x0002, 0x00ee, 0x0005, 0x5f86, 0x5f86, 0x5fa2, 0x5f86, - 0x611f, 0x5f86, 0x5f86, 0x5f86, 0x5f86, 0x5f86, 0x5fa2, 0x6161, - 0x61a4, 0x61ed, 0x6201, 0x5f86, 0x5f86, 0x5fbe, 0x5fa2, 0x5f86, - 0x5f86, 0x6018, 0x62ad, 0x62c8, 0x5f86, 0x5fbe, 0x5f86, 0x5f86, - 0x5f86, 0x5f86, 0x600e, 0x62c8, 0x5f86, 0x5f86, 0x5f86, 0x5f86, - 0x5f86, 0x5f86, 0x5f86, 0x5f86, 0x5f86, 0x5fd2, 0x5f86, 0x5f86, - 0x5f86, 0x5f86, 0x5f86, 0x5f86, 0x5f86, 0x5f86, 0x5f86, 0x63d3, - 0x5f86, 0x5f86, 0x5f86, 0x5f86, 0x5f86, 0x5fe7, 0x7020, 0x2068, - 0x080c, 0x1614, 0x0005, 0x700c, 0x0002, 0x5f3a, 0x5f3d, 0x5f4b, - 0x5f63, 0x5f63, 0x080c, 0x5e68, 0x0005, 0x0126, 0x8001, 0x700e, - 0x7058, 0x0006, 0x080c, 0x63b5, 0x0120, 0x2091, 0x8000, 0x080c, - 0x5e68, 0x00de, 0x0048, 0x0126, 0x8001, 0x700e, 0x080c, 0x63b5, - 0x7058, 0x2068, 0x7084, 0x705a, 0x6803, 0x0000, 0x6807, 0x0000, - 0x6834, 0xa084, 0x00ff, 0xa08a, 0x001a, 0x1218, 0x003b, 0x012e, - 0x0005, 0x012e, 0x0419, 0x0005, 0x0005, 0x0005, 0x5f86, 0x5fa2, - 0x610b, 0x5f86, 0x5fa2, 0x5f86, 0x5fa2, 0x5fa2, 0x5f86, 0x5fa2, - 0x610b, 0x5fa2, 0x5fa2, 0x5fa2, 0x5fa2, 0x5fa2, 0x5f86, 0x5fa2, - 0x610b, 0x5f86, 0x5f86, 0x5fa2, 0x5f86, 0x5f86, 0x5f86, 0x5fa2, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x7007, 0x0001, - 0x6838, 0xa084, 0x00ff, 0xc0d5, 0x683a, 0x0126, 0x2091, 0x8000, - 0x080c, 0x547a, 0x012e, 0x0005, 0x7007, 0x0001, 0x6838, 0xa084, - 0x00ff, 0xc0e5, 0x683a, 0x0126, 0x2091, 0x8000, 0x080c, 0x547a, - 0x012e, 0x0005, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0ed, - 0x683a, 0x0126, 0x2091, 0x8000, 0x080c, 0x547a, 0x012e, 0x0005, - 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0dd, 0x683a, 0x0126, - 0x2091, 0x8000, 0x080c, 0x547a, 0x012e, 0x0005, 0x6834, 0x8007, - 0xa084, 0x00ff, 0x0988, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, - 0x60cb, 0x7007, 0x0006, 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, - 0x60cb, 0x0005, 0x6834, 0x8007, 0xa084, 0x00ff, 0x0904, 0x5f94, - 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x60e8, 0x7007, 0x0006, - 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x60e8, 0x0005, 0x6834, - 0x8007, 0xa084, 0x00ff, 0xa086, 0x0001, 0x1904, 0x5f94, 0x7007, - 0x0001, 0x2009, 0xb631, 0x210c, 0x81ff, 0x11a8, 0x6838, 0xa084, - 0x00ff, 0x683a, 0x6853, 0x0000, 0x080c, 0x4df4, 0x1108, 0x0005, - 0x0126, 0x2091, 0x8000, 0x6837, 0x0139, 0x684a, 0x6952, 0x080c, - 0x547a, 0x012e, 0x0ca0, 0x2001, 0x0028, 0x0c90, 0x684c, 0xa084, - 0x00c0, 0xa086, 0x00c0, 0x1120, 0x7007, 0x0001, 0x0804, 0x62e0, - 0x2d00, 0x7016, 0x701a, 0x20a9, 0x0004, 0xa080, 0x0024, 0x2098, - 0x20a1, 0xb70d, 0x53a3, 0x6858, 0x7012, 0xa082, 0x0401, 0x1a04, - 0x5fb0, 0x6a84, 0xa28a, 0x0002, 0x1a04, 0x5fb0, 0x82ff, 0x1138, - 0x6888, 0x698c, 0xa105, 0x0118, 0x2001, 0x609e, 0x0018, 0xa280, - 0x6094, 0x2005, 0x70c6, 0x7010, 0xa015, 0x0904, 0x6080, 0x080c, - 0x15e4, 0x1118, 0x7007, 0x000f, 0x0005, 0x2d00, 0x7022, 0x70c4, - 0x2060, 0x2c05, 0x6836, 0xe004, 0xad00, 0x7096, 0xe008, 0xa20a, - 0x1210, 0xa00e, 0x2200, 0x7112, 0xe20c, 0x8003, 0x800b, 0xa296, - 0x0004, 0x0108, 0xa108, 0x719a, 0x810b, 0x719e, 0xae90, 0x0022, - 0x080c, 0x1648, 0x7090, 0xa08e, 0x0100, 0x0170, 0xa086, 0x0200, - 0x0118, 0x7007, 0x0010, 0x0005, 0x7020, 0x2068, 0x080c, 0x1614, - 0x7014, 0x2068, 0x0804, 0x5fb0, 0x7020, 0x2068, 0x7018, 0x6802, - 0x6807, 0x0000, 0x2d08, 0x2068, 0x6906, 0x711a, 0x0804, 0x603b, - 0x7014, 0x2068, 0x7007, 0x0001, 0x6884, 0xa005, 0x1128, 0x6888, - 0x698c, 0xa105, 0x0108, 0x00b1, 0x6834, 0xa084, 0x00ff, 0xa086, - 0x001e, 0x0904, 0x62e0, 0x04b8, 0x6096, 0x609a, 0x0002, 0x0011, - 0x0007, 0x0004, 0x000a, 0x000f, 0x0005, 0x0006, 0x000a, 0x0011, - 0x0005, 0x0004, 0x00f6, 0x00e6, 0x00c6, 0x0076, 0x0066, 0x6f88, - 0x6e8c, 0x6804, 0x2060, 0xacf0, 0x0021, 0xacf8, 0x0027, 0x2009, - 0x0005, 0x700c, 0x7816, 0x7008, 0x7812, 0x7004, 0x7806, 0x7000, - 0x7802, 0x7e0e, 0x7f0a, 0x8109, 0x0128, 0xaef2, 0x0004, 0xaffa, - 0x0006, 0x0c78, 0x6004, 0xa065, 0x1d30, 0x006e, 0x007e, 0x00ce, - 0x00ee, 0x00fe, 0x0005, 0x2009, 0xb631, 0x210c, 0x81ff, 0x1198, - 0x6838, 0xa084, 0x00ff, 0x683a, 0x080c, 0x4cd7, 0x1108, 0x0005, - 0x080c, 0x554d, 0x0126, 0x2091, 0x8000, 0x080c, 0x9f88, 0x080c, - 0x547a, 0x012e, 0x0ca0, 0x2001, 0x0028, 0x2009, 0x0000, 0x0c80, - 0x2009, 0xb631, 0x210c, 0x81ff, 0x11b0, 0x6858, 0xa005, 0x01c0, - 0x6838, 0xa084, 0x00ff, 0x683a, 0x6853, 0x0000, 0x080c, 0x4d98, - 0x1108, 0x0005, 0x0126, 0x2091, 0x8000, 0x684a, 0x6952, 0x080c, - 0x547a, 0x012e, 0x0cb0, 0x2001, 0x0028, 0x2009, 0x0000, 0x0c90, - 0x2001, 0x0000, 0x0c78, 0x7018, 0x6802, 0x2d08, 0x2068, 0x6906, - 0x711a, 0x7010, 0x8001, 0x7012, 0x0118, 0x7007, 0x0006, 0x0030, - 0x7014, 0x2068, 0x7007, 0x0001, 0x7048, 0x080f, 0x0005, 0x7007, - 0x0001, 0x6944, 0x810f, 0xa18c, 0x00ff, 0x6848, 0xa084, 0x00ff, - 0x20a9, 0x0001, 0xa096, 0x0001, 0x01b0, 0x2009, 0x0000, 0x20a9, - 0x00ff, 0xa096, 0x0002, 0x0178, 0xa005, 0x11f0, 0x6944, 0x810f, - 0xa18c, 0x00ff, 0x080c, 0x501b, 0x11b8, 0x0066, 0x6e50, 0x080c, - 0x511a, 0x006e, 0x0088, 0x0046, 0x2011, 0xb60c, 0x2224, 0xc484, - 0x2412, 0x004e, 0x00c6, 0x080c, 0x501b, 0x1110, 0x080c, 0x527b, - 0x8108, 0x1f04, 0x614b, 0x00ce, 0x684c, 0xd084, 0x1118, 0x080c, - 0x1614, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x547a, 0x012e, - 0x0005, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x2001, 0xb653, - 0x2004, 0xd0a4, 0x0580, 0x2061, 0xb975, 0x6100, 0xd184, 0x0178, - 0x6858, 0xa084, 0x00ff, 0x1550, 0x6000, 0xd084, 0x0520, 0x6004, - 0xa005, 0x1538, 0x6003, 0x0000, 0x600b, 0x0000, 0x00c8, 0x2011, - 0x0001, 0x6860, 0xa005, 0x1110, 0x2001, 0x001e, 0x8000, 0x6016, - 0x6858, 0xa084, 0x00ff, 0x0178, 0x6006, 0x6858, 0x8007, 0xa084, - 0x00ff, 0x0148, 0x600a, 0x6858, 0x8000, 0x1108, 0xc28d, 0x6202, - 0x012e, 0x0804, 0x63a4, 0x012e, 0x0804, 0x639e, 0x012e, 0x0804, - 0x6398, 0x012e, 0x0804, 0x639b, 0x0126, 0x2091, 0x8000, 0x7007, - 0x0001, 0x2001, 0xb653, 0x2004, 0xd0a4, 0x05e0, 0x2061, 0xb975, - 0x6000, 0xd084, 0x05b8, 0x6204, 0x6308, 0xd08c, 0x1530, 0x6c48, - 0xa484, 0x0003, 0x0170, 0x6958, 0xa18c, 0x00ff, 0x8001, 0x1120, - 0x2100, 0xa210, 0x0620, 0x0028, 0x8001, 0x1508, 0x2100, 0xa212, - 0x02f0, 0xa484, 0x000c, 0x0188, 0x6958, 0x810f, 0xa18c, 0x00ff, - 0xa082, 0x0004, 0x1120, 0x2100, 0xa318, 0x0288, 0x0030, 0xa082, - 0x0004, 0x1168, 0x2100, 0xa31a, 0x0250, 0x6860, 0xa005, 0x0110, - 0x8000, 0x6016, 0x6206, 0x630a, 0x012e, 0x0804, 0x63a4, 0x012e, - 0x0804, 0x63a1, 0x012e, 0x0804, 0x639e, 0x0126, 0x2091, 0x8000, - 0x7007, 0x0001, 0x2061, 0xb975, 0x6300, 0xd38c, 0x1120, 0x6308, - 0x8318, 0x0220, 0x630a, 0x012e, 0x0804, 0x63b2, 0x012e, 0x0804, - 0x63a1, 0x0126, 0x00c6, 0x2091, 0x8000, 0x7007, 0x0001, 0x684c, - 0xd0ac, 0x0148, 0x00c6, 0x2061, 0xb975, 0x6000, 0xa084, 0xfcff, - 0x6002, 0x00ce, 0x0448, 0x6858, 0xa005, 0x05d0, 0x685c, 0xa065, - 0x0598, 0x2001, 0xb631, 0x2004, 0xa005, 0x0118, 0x080c, 0x9ed9, - 0x0068, 0x6013, 0x0400, 0x6057, 0x0000, 0x694c, 0xd1a4, 0x0110, - 0x6950, 0x6156, 0x2009, 0x0041, 0x080c, 0x86d3, 0x6958, 0xa18c, - 0xff00, 0xa186, 0x2000, 0x1140, 0x0026, 0x2009, 0x0000, 0x2011, - 0xfdff, 0x080c, 0x6b8c, 0x002e, 0x684c, 0xd0c4, 0x0148, 0x2061, - 0xb975, 0x6000, 0xd08c, 0x1120, 0x6008, 0x8000, 0x0208, 0x600a, - 0x00ce, 0x012e, 0x0804, 0x63a4, 0x00ce, 0x012e, 0x0804, 0x639e, - 0x6954, 0xa186, 0x002e, 0x0d40, 0xa186, 0x002d, 0x0d28, 0xa186, - 0x0045, 0x0528, 0xa186, 0x002a, 0x1130, 0x2001, 0xb60c, 0x200c, - 0xc194, 0x2102, 0x08c8, 0xa186, 0x0020, 0x0170, 0xa186, 0x0029, - 0x1d18, 0x6944, 0xa18c, 0xff00, 0x810f, 0x080c, 0x501b, 0x1960, - 0x6000, 0xc0e4, 0x6002, 0x0840, 0x685c, 0xa065, 0x09a8, 0x6007, - 0x0024, 0x2001, 0xb8b6, 0x2004, 0x6016, 0x0804, 0x623c, 0x685c, - 0xa065, 0x0950, 0x00e6, 0x6860, 0xa075, 0x2001, 0xb631, 0x2004, - 0xa005, 0x0150, 0x080c, 0x9ed9, 0x8eff, 0x0118, 0x2e60, 0x080c, - 0x9ed9, 0x00ee, 0x0804, 0x623c, 0x6020, 0xc0dc, 0xc0d5, 0x6022, - 0x2e60, 0x6007, 0x003a, 0x6870, 0xa005, 0x0130, 0x6007, 0x003b, - 0x6874, 0x602a, 0x6878, 0x6012, 0x6003, 0x0001, 0x080c, 0x6cff, - 0x080c, 0x71e5, 0x00ee, 0x0804, 0x623c, 0x2061, 0xb975, 0x6000, - 0xd084, 0x0190, 0xd08c, 0x1904, 0x63b2, 0x0126, 0x2091, 0x8000, - 0x6204, 0x8210, 0x0220, 0x6206, 0x012e, 0x0804, 0x63b2, 0x012e, - 0x6853, 0x0016, 0x0804, 0x63ab, 0x6853, 0x0007, 0x0804, 0x63ab, - 0x6834, 0x8007, 0xa084, 0x00ff, 0x1118, 0x080c, 0x5f94, 0x0078, - 0x2030, 0x8001, 0x1120, 0x7007, 0x0001, 0x0051, 0x0040, 0x7007, - 0x0006, 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x62e0, 0x0005, - 0x00e6, 0x0126, 0x2091, 0x8000, 0xa03e, 0x2009, 0xb631, 0x210c, - 0x81ff, 0x1904, 0x635e, 0x2009, 0xb60c, 0x210c, 0xd194, 0x1904, - 0x6388, 0x6848, 0x2070, 0xae82, 0xbe00, 0x0a04, 0x6352, 0x2001, - 0xb617, 0x2004, 0xae02, 0x1a04, 0x6352, 0x711c, 0xa186, 0x0006, - 0x1904, 0x6341, 0x7018, 0xa005, 0x0904, 0x635e, 0x2004, 0xd0e4, - 0x1904, 0x6383, 0x2061, 0xb975, 0x6100, 0xa184, 0x0301, 0xa086, - 0x0001, 0x1550, 0x7020, 0xd0dc, 0x1904, 0x638b, 0x6853, 0x0000, - 0x6803, 0x0000, 0x2d08, 0x7010, 0xa005, 0x1158, 0x7112, 0x684c, - 0xd0f4, 0x1904, 0x638e, 0x2e60, 0x080c, 0x6ae8, 0x012e, 0x00ee, - 0x0005, 0x2068, 0x6800, 0xa005, 0x1de0, 0x6902, 0x2168, 0x684c, - 0xd0f4, 0x1904, 0x638e, 0x012e, 0x00ee, 0x0005, 0x012e, 0x00ee, - 0x6853, 0x0006, 0x0804, 0x63ab, 0xd184, 0x0dc0, 0xd1c4, 0x11a8, - 0x00b8, 0x6944, 0xa18c, 0xff00, 0x810f, 0x080c, 0x501b, 0x15d8, - 0x6000, 0xd0e4, 0x15c0, 0x711c, 0xa186, 0x0007, 0x1118, 0x6853, - 0x0002, 0x0498, 0x6853, 0x0008, 0x0480, 0x6853, 0x000e, 0x0468, - 0x6853, 0x0017, 0x0450, 0x6853, 0x0035, 0x0438, 0x2001, 0xb672, - 0x2004, 0xd0fc, 0x01e8, 0x6848, 0x2070, 0xae82, 0xbe00, 0x02c0, - 0x605c, 0xae02, 0x12a8, 0x711c, 0xa186, 0x0006, 0x1188, 0x7018, - 0xa005, 0x0170, 0x2004, 0xd0bc, 0x0158, 0x2039, 0x0001, 0x7000, - 0xa086, 0x0007, 0x1904, 0x62eb, 0x7003, 0x0002, 0x0804, 0x62eb, - 0x6853, 0x0028, 0x0010, 0x6853, 0x0029, 0x012e, 0x00ee, 0x0418, - 0x6853, 0x002a, 0x0cd0, 0x6853, 0x0045, 0x0cb8, 0x2e60, 0x2019, - 0x0002, 0x6017, 0x0014, 0x080c, 0xad9c, 0x012e, 0x00ee, 0x0005, - 0x2009, 0x003e, 0x0058, 0x2009, 0x0004, 0x0040, 0x2009, 0x0006, - 0x0028, 0x2009, 0x0016, 0x0010, 0x2009, 0x0001, 0x6854, 0xa084, - 0xff00, 0xa105, 0x6856, 0x0126, 0x2091, 0x8000, 0x080c, 0x547a, - 0x012e, 0x0005, 0x080c, 0x1614, 0x0005, 0x702c, 0x7130, 0x8108, - 0xa102, 0x0230, 0xa00e, 0x7034, 0x7072, 0x7038, 0x7076, 0x0058, - 0x7070, 0xa080, 0x0040, 0x7072, 0x1230, 0x7074, 0xa081, 0x0000, - 0x7076, 0xa085, 0x0001, 0x7932, 0x7132, 0x0005, 0x00d6, 0x080c, - 0x6adf, 0x00de, 0x0005, 0x00d6, 0x00c6, 0x0036, 0x0026, 0x0016, - 0x7007, 0x0001, 0x6a44, 0xa282, 0x0004, 0x1a04, 0x641e, 0xd284, - 0x0170, 0x6a4c, 0xa290, 0xb735, 0x2204, 0xa065, 0x6004, 0x05e0, - 0x8007, 0xa084, 0x00ff, 0xa084, 0x0006, 0x1108, 0x04a8, 0x2c10, - 0x080c, 0x864e, 0x1118, 0x080c, 0x9f92, 0x05a0, 0x621a, 0x6844, - 0x0002, 0x63fd, 0x6402, 0x6405, 0x640b, 0x2019, 0x0002, 0x080c, - 0xb121, 0x0060, 0x080c, 0xb0b8, 0x0048, 0x2019, 0x0002, 0x6950, - 0x080c, 0xb0d3, 0x0018, 0x6950, 0x080c, 0xb0b8, 0x080c, 0x86a4, - 0x6857, 0x0000, 0x0126, 0x2091, 0x8000, 0x080c, 0x547a, 0x012e, - 0x001e, 0x002e, 0x003e, 0x00ce, 0x00de, 0x0005, 0x6857, 0x0006, - 0x0c88, 0x6857, 0x0002, 0x0c70, 0x6857, 0x0005, 0x0c58, 0x6857, - 0x0004, 0x0c40, 0x6857, 0x0007, 0x0c28, 0x00d6, 0x2011, 0x0004, - 0x2204, 0xa085, 0x8002, 0x2012, 0x00de, 0x0005, 0x20e1, 0x0002, - 0x3d08, 0x20e1, 0x2000, 0x3d00, 0xa084, 0x7000, 0x0118, 0xa086, - 0x1000, 0x1570, 0x20e1, 0x0000, 0x3d00, 0xa094, 0xff00, 0x8217, - 0xa084, 0xf000, 0xa086, 0x3000, 0x1160, 0xa184, 0xff00, 0x8007, - 0xa086, 0x0008, 0x11e8, 0x080c, 0x2df4, 0x11d0, 0x080c, 0x6675, - 0x0098, 0x20e1, 0x0004, 0x3d60, 0xd1bc, 0x1108, 0x3e60, 0xac84, - 0x0007, 0x1170, 0xac82, 0xbe00, 0x0258, 0x685c, 0xac02, 0x1240, - 0x2009, 0x0047, 0x080c, 0x86d3, 0x7a1c, 0xd284, 0x1938, 0x0005, - 0xa016, 0x080c, 0x1863, 0x0cc0, 0x0cd8, 0x781c, 0xd08c, 0x0500, - 0x0156, 0x0136, 0x0146, 0x20e1, 0x3000, 0x3d20, 0x3e28, 0xa584, - 0x0076, 0x1538, 0xa484, 0x7000, 0xa086, 0x1000, 0x11a8, 0x080c, - 0x64f0, 0x01f8, 0x20e1, 0x3000, 0x7828, 0x7828, 0x080c, 0x650c, - 0x014e, 0x013e, 0x015e, 0x2009, 0xb8e9, 0x2104, 0xa005, 0x1108, - 0x0005, 0x080c, 0x71e5, 0x0ce0, 0xa484, 0x7000, 0x1548, 0x080c, - 0x64f0, 0x01d8, 0x7000, 0xa084, 0xff00, 0xa086, 0x8100, 0x0d10, - 0x00a0, 0xd5a4, 0x0178, 0x0056, 0x0046, 0x080c, 0x1e8a, 0x080c, - 0x24e5, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x004e, - 0x005e, 0x0048, 0x04a9, 0x6887, 0x0000, 0x080c, 0xb49b, 0x20e1, - 0x3000, 0x7828, 0x7828, 0x00b9, 0x014e, 0x013e, 0x015e, 0x0880, - 0x0439, 0x1130, 0x7000, 0xa084, 0xff00, 0xa086, 0x8100, 0x1d68, - 0x080c, 0xb49b, 0x20e1, 0x3000, 0x7828, 0x7828, 0x0056, 0x080c, - 0x68e6, 0x005e, 0x0c40, 0x2001, 0xb60e, 0x2004, 0xd08c, 0x0178, - 0x2001, 0xb600, 0x2004, 0xa086, 0x0003, 0x1148, 0x0026, 0x0036, - 0x2011, 0x8048, 0x2518, 0x080c, 0x3f13, 0x003e, 0x002e, 0x0005, - 0xa484, 0x01ff, 0x6886, 0xa005, 0x0160, 0xa080, 0x001f, 0xa084, - 0x03f8, 0x80ac, 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5, - 0x0005, 0x20a9, 0x000c, 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, - 0x53a5, 0xa085, 0x0001, 0x0ca0, 0x7000, 0xa084, 0xff00, 0xa08c, - 0xf000, 0x8007, 0xa196, 0x0000, 0x1118, 0x0804, 0x677a, 0x0005, - 0xa196, 0x2000, 0x1148, 0x6900, 0xa18e, 0x0001, 0x1118, 0x080c, - 0x44d6, 0x0ca8, 0x0039, 0x0c98, 0xa196, 0x8000, 0x1d80, 0x080c, - 0x6826, 0x0c68, 0x00c6, 0x6a84, 0x82ff, 0x0904, 0x666f, 0x7110, - 0xa18c, 0xff00, 0x810f, 0xa196, 0x0001, 0x0120, 0xa196, 0x0023, - 0x1904, 0x666f, 0xa08e, 0x0023, 0x1570, 0x080c, 0x68c1, 0x0904, - 0x666f, 0x7124, 0x610a, 0x7030, 0xa08e, 0x0200, 0x1150, 0x7034, - 0xa005, 0x1904, 0x666f, 0x2009, 0x0015, 0x080c, 0x86d3, 0x0804, - 0x666f, 0xa08e, 0x0214, 0x0118, 0xa08e, 0x0210, 0x1130, 0x2009, - 0x0015, 0x080c, 0x86d3, 0x0804, 0x666f, 0xa08e, 0x0100, 0x1904, - 0x666f, 0x7034, 0xa005, 0x1904, 0x666f, 0x2009, 0x0016, 0x080c, - 0x86d3, 0x0804, 0x666f, 0xa08e, 0x0022, 0x1904, 0x666f, 0x7030, - 0xa08e, 0x0300, 0x1580, 0x68d4, 0xd0a4, 0x0528, 0xc0b5, 0x68d6, - 0x7100, 0xa18c, 0x00ff, 0x6972, 0x7004, 0x6876, 0x00f6, 0x2079, - 0x0100, 0x79e6, 0x78ea, 0x0006, 0xa084, 0x00ff, 0x0016, 0x2008, - 0x080c, 0x287c, 0x7932, 0x7936, 0x001e, 0x000e, 0x00fe, 0x080c, - 0x2852, 0x6952, 0x703c, 0x00e6, 0x2071, 0x0140, 0x7086, 0x2071, - 0xb600, 0x70a6, 0x00ee, 0x7034, 0xa005, 0x1904, 0x666f, 0x2009, - 0x0017, 0x0804, 0x6635, 0xa08e, 0x0400, 0x1158, 0x7034, 0xa005, - 0x1904, 0x666f, 0x68d4, 0xc0a5, 0x68d6, 0x2009, 0x0030, 0x0804, - 0x6635, 0xa08e, 0x0500, 0x1140, 0x7034, 0xa005, 0x1904, 0x666f, - 0x2009, 0x0018, 0x0804, 0x6635, 0xa08e, 0x2010, 0x1120, 0x2009, - 0x0019, 0x0804, 0x6635, 0xa08e, 0x2110, 0x1120, 0x2009, 0x001a, - 0x0804, 0x6635, 0xa08e, 0x5200, 0x1140, 0x7034, 0xa005, 0x1904, - 0x666f, 0x2009, 0x001b, 0x0804, 0x6635, 0xa08e, 0x5000, 0x1140, - 0x7034, 0xa005, 0x1904, 0x666f, 0x2009, 0x001c, 0x0804, 0x6635, - 0xa08e, 0x1300, 0x1120, 0x2009, 0x0034, 0x0804, 0x6635, 0xa08e, - 0x1200, 0x1140, 0x7034, 0xa005, 0x1904, 0x666f, 0x2009, 0x0024, - 0x0804, 0x6635, 0xa08c, 0xff00, 0xa18e, 0x2400, 0x1118, 0x2009, - 0x002d, 0x04d8, 0xa08c, 0xff00, 0xa18e, 0x5300, 0x1118, 0x2009, - 0x002a, 0x0498, 0xa08e, 0x0f00, 0x1118, 0x2009, 0x0020, 0x0468, - 0xa08e, 0x5300, 0x1108, 0x00d8, 0xa08e, 0x6104, 0x11c0, 0x2011, - 0xbc8d, 0x8208, 0x2204, 0xa082, 0x0004, 0x20a8, 0x95ac, 0x95ac, - 0x2011, 0x8015, 0x211c, 0x8108, 0x0046, 0x2124, 0x080c, 0x3f13, - 0x004e, 0x8108, 0x1f04, 0x6618, 0x2009, 0x0023, 0x0070, 0xa08e, - 0x6000, 0x1118, 0x2009, 0x003f, 0x0040, 0xa08e, 0x7800, 0x1118, - 0x2009, 0x0045, 0x0010, 0x2009, 0x001d, 0x0016, 0x2011, 0xbc83, - 0x2204, 0x8211, 0x220c, 0x080c, 0x2852, 0x1598, 0x080c, 0x4fbf, - 0x1580, 0x6612, 0x6516, 0x86ff, 0x01e8, 0x001e, 0x0016, 0xa186, - 0x0017, 0x1158, 0x6870, 0xa606, 0x11a8, 0x6874, 0xa506, 0xa084, - 0xff00, 0x1180, 0x6000, 0xc0f5, 0x6002, 0xa186, 0x0046, 0x1150, - 0x6870, 0xa606, 0x1138, 0x6874, 0xa506, 0xa084, 0xff00, 0x1110, - 0x001e, 0x0068, 0x00c6, 0x080c, 0x864e, 0x0168, 0x001e, 0x611a, - 0x601f, 0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0x86d3, 0x00ce, - 0x0005, 0x001e, 0x0ce0, 0x00ce, 0x0ce0, 0x00c6, 0x0046, 0x080c, - 0x66c9, 0x1904, 0x66c6, 0xa28e, 0x0033, 0x11e8, 0x080c, 0x68c1, - 0x0904, 0x66c6, 0x7124, 0x610a, 0x7030, 0xa08e, 0x0200, 0x1140, - 0x7034, 0xa005, 0x15d8, 0x2009, 0x0015, 0x080c, 0x86d3, 0x04b0, - 0xa08e, 0x0100, 0x1598, 0x7034, 0xa005, 0x1580, 0x2009, 0x0016, - 0x080c, 0x86d3, 0x0458, 0xa28e, 0x0032, 0x1540, 0x7030, 0xa08e, - 0x1400, 0x1520, 0x2009, 0x0038, 0x0016, 0x2011, 0xbc83, 0x2204, - 0x8211, 0x220c, 0x080c, 0x2852, 0x11c0, 0x080c, 0x4fbf, 0x11a8, - 0x6612, 0x6516, 0x00c6, 0x080c, 0x864e, 0x0170, 0x001e, 0x611a, - 0x080c, 0xa0e3, 0x601f, 0x0004, 0x7120, 0x610a, 0x001e, 0x080c, - 0x86d3, 0x080c, 0x71e5, 0x0010, 0x00ce, 0x001e, 0x004e, 0x00ce, - 0x0005, 0x00f6, 0x00d6, 0x0026, 0x0016, 0x0136, 0x0146, 0x0156, - 0x3c00, 0x0006, 0x2079, 0x0030, 0x2069, 0x0200, 0x080c, 0x1f49, - 0x1590, 0x080c, 0x1dee, 0x05e0, 0x04f1, 0x1130, 0x7908, 0xa18c, - 0x1fff, 0xa182, 0x0011, 0x1688, 0x20a9, 0x000c, 0x20e1, 0x0000, - 0x2ea0, 0x2099, 0x020a, 0x53a5, 0x20e1, 0x2000, 0x2001, 0x020a, - 0x2004, 0x7a0c, 0x7808, 0xa080, 0x0007, 0xa084, 0x1ff8, 0x0419, - 0x1120, 0xa08a, 0x0140, 0x1a0c, 0x151a, 0x80ac, 0x20e1, 0x6000, - 0x2099, 0x020a, 0x53a5, 0x20e1, 0x7000, 0x6828, 0x6828, 0x7803, - 0x0004, 0xa294, 0x0070, 0x000e, 0x20e0, 0x015e, 0x014e, 0x013e, - 0x001e, 0x002e, 0x00de, 0x00fe, 0x0005, 0xa016, 0x080c, 0x1863, - 0xa085, 0x0001, 0x0c80, 0x0006, 0x2001, 0x0111, 0x2004, 0xa084, - 0x0003, 0x000e, 0x0005, 0x0046, 0x00e6, 0x00d6, 0x2028, 0x2130, - 0xa696, 0x00ff, 0x1198, 0xa596, 0xfffd, 0x1120, 0x2009, 0x007f, - 0x0804, 0x6775, 0xa596, 0xfffe, 0x1118, 0x2009, 0x007e, 0x04e8, - 0xa596, 0xfffc, 0x1118, 0x2009, 0x0080, 0x04b8, 0x2011, 0x0000, - 0x2019, 0xb635, 0x231c, 0xd3ac, 0x0138, 0x2021, 0x0000, 0x20a9, - 0x00ff, 0x2071, 0xb735, 0x0030, 0x2021, 0x0081, 0x20a9, 0x007e, - 0x2071, 0xb7b6, 0x2e1c, 0x83ff, 0x1128, 0x82ff, 0x1198, 0x2410, - 0xc2fd, 0x0080, 0x2368, 0x6f10, 0x0006, 0x2100, 0xa706, 0x000e, - 0x6b14, 0x1120, 0xa346, 0x1110, 0x2408, 0x0078, 0x87ff, 0x1110, - 0x83ff, 0x0d58, 0x8420, 0x8e70, 0x1f04, 0x6752, 0x82ff, 0x1118, - 0xa085, 0x0001, 0x0018, 0xc2fc, 0x2208, 0xa006, 0x00de, 0x00ee, - 0x004e, 0x0005, 0xa084, 0x0007, 0x000a, 0x0005, 0x6786, 0x6786, - 0x6786, 0x68d3, 0x6786, 0x6787, 0x679c, 0x6811, 0x0005, 0x7110, - 0xd1bc, 0x0188, 0x7120, 0x2160, 0xac8c, 0x0007, 0x1160, 0xac8a, - 0xbe00, 0x0248, 0x685c, 0xac02, 0x1230, 0x7124, 0x610a, 0x2009, - 0x0046, 0x080c, 0x86d3, 0x0005, 0x00c6, 0xa484, 0x01ff, 0x0904, - 0x67ef, 0x7110, 0xd1bc, 0x1904, 0x67ef, 0x2011, 0xbc83, 0x2204, - 0x8211, 0x220c, 0x080c, 0x2852, 0x1904, 0x67ef, 0x080c, 0x4fbf, - 0x15f0, 0x6612, 0x6516, 0x6000, 0xd0ec, 0x15c8, 0x6204, 0xa294, - 0xff00, 0x8217, 0xa286, 0x0006, 0x0148, 0x6204, 0xa294, 0x00ff, - 0xa286, 0x0006, 0x11a0, 0xa295, 0x0600, 0x6206, 0x00c6, 0x080c, - 0x864e, 0x001e, 0x0530, 0x611a, 0x601f, 0x0006, 0x7120, 0x610a, - 0x7130, 0x6152, 0x2009, 0x0044, 0x080c, 0x86d3, 0x00c0, 0x00c6, - 0x080c, 0x864e, 0x001e, 0x0198, 0x611a, 0x601f, 0x0004, 0x7120, - 0x610a, 0xa286, 0x0004, 0x1118, 0x6007, 0x0005, 0x0010, 0x6007, - 0x0001, 0x6003, 0x0001, 0x080c, 0x6d45, 0x080c, 0x71e5, 0x00ce, - 0x0005, 0x2001, 0xb60d, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, - 0x080c, 0x3f13, 0x00c6, 0x080c, 0x9f92, 0x001e, 0x0d80, 0x611a, - 0x601f, 0x0006, 0x7120, 0x610a, 0x7130, 0x6152, 0x6013, 0x0300, - 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x6cff, 0x080c, 0x71e5, - 0x08f0, 0x7110, 0xd1bc, 0x0188, 0x7020, 0x2060, 0xac84, 0x0007, - 0x1160, 0xac82, 0xbe00, 0x0248, 0x685c, 0xac02, 0x1230, 0x7124, - 0x610a, 0x2009, 0x0045, 0x080c, 0x86d3, 0x0005, 0x0006, 0x080c, - 0x2df4, 0x000e, 0x1168, 0x7110, 0xa18c, 0xff00, 0x810f, 0xa18e, - 0x0000, 0x1130, 0xa084, 0x000f, 0xa08a, 0x0006, 0x1208, 0x000b, - 0x0005, 0x683f, 0x6840, 0x683f, 0x683f, 0x68a9, 0x68b5, 0x0005, - 0x7110, 0xd1bc, 0x0120, 0x702c, 0xd084, 0x0904, 0x68a8, 0x700c, - 0x7108, 0x080c, 0x2852, 0x1904, 0x68a8, 0x080c, 0x4fbf, 0x1904, - 0x68a8, 0x6612, 0x6516, 0x6204, 0x7110, 0xd1bc, 0x01f8, 0xa28c, - 0x00ff, 0xa186, 0x0004, 0x0118, 0xa186, 0x0006, 0x15c8, 0x00c6, - 0x080c, 0x68c1, 0x00ce, 0x0904, 0x68a8, 0x00c6, 0x080c, 0x864e, - 0x001e, 0x05f0, 0x611a, 0x080c, 0xa0e3, 0x601f, 0x0002, 0x7120, - 0x610a, 0x2009, 0x0088, 0x080c, 0x86d3, 0x0490, 0xa28c, 0x00ff, - 0xa186, 0x0006, 0x0160, 0xa186, 0x0004, 0x0148, 0xa294, 0xff00, - 0x8217, 0xa286, 0x0004, 0x0118, 0xa286, 0x0006, 0x1188, 0x00c6, - 0x080c, 0x864e, 0x001e, 0x01e0, 0x611a, 0x080c, 0xa0e3, 0x601f, - 0x0005, 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, 0x86d3, 0x0080, - 0x00c6, 0x080c, 0x864e, 0x001e, 0x0158, 0x611a, 0x080c, 0xa0e3, - 0x601f, 0x0004, 0x7120, 0x610a, 0x2009, 0x0001, 0x080c, 0x86d3, - 0x0005, 0x7110, 0xd1bc, 0x0140, 0x00a1, 0x0130, 0x7124, 0x610a, - 0x2009, 0x0089, 0x080c, 0x86d3, 0x0005, 0x7110, 0xd1bc, 0x0140, - 0x0041, 0x0130, 0x7124, 0x610a, 0x2009, 0x008a, 0x080c, 0x86d3, - 0x0005, 0x7020, 0x2060, 0xac84, 0x0007, 0x1158, 0xac82, 0xbe00, - 0x0240, 0x2001, 0xb617, 0x2004, 0xac02, 0x1218, 0xa085, 0x0001, - 0x0005, 0xa006, 0x0ce8, 0x7110, 0xd1bc, 0x1178, 0x7024, 0x2060, - 0xac84, 0x0007, 0x1150, 0xac82, 0xbe00, 0x0238, 0x685c, 0xac02, - 0x1220, 0x2009, 0x0051, 0x080c, 0x86d3, 0x0005, 0x2031, 0x0105, - 0x0069, 0x0005, 0x2031, 0x0206, 0x0049, 0x0005, 0x2031, 0x0207, - 0x0029, 0x0005, 0x2031, 0x0213, 0x0009, 0x0005, 0x00c6, 0x00d6, - 0x00f6, 0x7000, 0xa084, 0xf000, 0xa086, 0xc000, 0x05b0, 0x080c, - 0x864e, 0x0598, 0x0066, 0x00c6, 0x0046, 0x2011, 0xbc83, 0x2204, - 0x8211, 0x220c, 0x080c, 0x2852, 0x1580, 0x080c, 0x4fbf, 0x1568, - 0x6612, 0x6516, 0x2c00, 0x004e, 0x00ce, 0x601a, 0x080c, 0xa0e3, - 0x080c, 0x15fd, 0x01f0, 0x2d00, 0x6056, 0x6803, 0x0000, 0x6837, - 0x0000, 0x6c3a, 0xadf8, 0x000f, 0x20a9, 0x000e, 0x2fa0, 0x2e98, - 0x53a3, 0x006e, 0x6612, 0x6007, 0x003e, 0x601f, 0x0001, 0x6003, - 0x0001, 0x080c, 0x6d45, 0x080c, 0x71e5, 0x00fe, 0x00de, 0x00ce, - 0x0005, 0x080c, 0x86a4, 0x006e, 0x0cc0, 0x004e, 0x00ce, 0x0cc8, - 0x2071, 0xb8f4, 0x7003, 0x0003, 0x700f, 0x0361, 0xa006, 0x701a, - 0x7076, 0x7012, 0x7017, 0xbe00, 0x7007, 0x0000, 0x7026, 0x702b, - 0x7e0a, 0x7032, 0x7037, 0x7e6a, 0x703b, 0xffff, 0x703f, 0xffff, - 0x7042, 0x7047, 0x4492, 0x704a, 0x705b, 0x6a9d, 0x2001, 0xb8a1, - 0x2003, 0x0003, 0x2001, 0xb8a3, 0x2003, 0x0100, 0x3a00, 0xa084, - 0x0005, 0x706e, 0x0005, 0x2071, 0xb8f4, 0x1d04, 0x69fd, 0x2091, - 0x6000, 0x700c, 0x8001, 0x700e, 0x1518, 0x700f, 0x0361, 0x7007, - 0x0001, 0x0126, 0x2091, 0x8000, 0x7040, 0xa00d, 0x0128, 0x8109, - 0x7142, 0x1110, 0x7044, 0x080f, 0x00c6, 0x2061, 0xb600, 0x6034, - 0x00ce, 0xd0cc, 0x0180, 0x3a00, 0xa084, 0x0005, 0x726c, 0xa216, - 0x0150, 0x706e, 0x2011, 0x8043, 0x2018, 0x080c, 0x3f13, 0x0018, - 0x0126, 0x2091, 0x8000, 0x7024, 0xa00d, 0x0188, 0x7020, 0x8001, - 0x7022, 0x1168, 0x7023, 0x0009, 0x8109, 0x7126, 0xa186, 0x03e8, - 0x1110, 0x7028, 0x080f, 0x81ff, 0x1110, 0x7028, 0x080f, 0x7030, - 0xa00d, 0x0180, 0x702c, 0x8001, 0x702e, 0x1160, 0x702f, 0x0009, - 0x8109, 0x7132, 0x0128, 0xa184, 0x007f, 0x090c, 0x7eaf, 0x0010, - 0x7034, 0x080f, 0x7038, 0xa005, 0x0118, 0x0310, 0x8001, 0x703a, - 0x703c, 0xa005, 0x0118, 0x0310, 0x8001, 0x703e, 0x704c, 0xa00d, - 0x0168, 0x7048, 0x8001, 0x704a, 0x1148, 0x704b, 0x0009, 0x8109, - 0x714e, 0x1120, 0x7150, 0x714e, 0x7058, 0x080f, 0x7018, 0xa00d, - 0x01d8, 0x0016, 0x7074, 0xa00d, 0x0158, 0x7070, 0x8001, 0x7072, - 0x1138, 0x7073, 0x0009, 0x8109, 0x7176, 0x1110, 0x7078, 0x080f, - 0x001e, 0x7008, 0x8001, 0x700a, 0x1138, 0x700b, 0x0009, 0x8109, - 0x711a, 0x1110, 0x701c, 0x080f, 0x012e, 0x7004, 0x0002, 0x6a23, - 0x6a24, 0x6a3c, 0x00e6, 0x2071, 0xb8f4, 0x7018, 0xa005, 0x1120, - 0x711a, 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, - 0x2071, 0xb8f4, 0x701c, 0xa206, 0x1110, 0x701a, 0x701e, 0x000e, - 0x00ee, 0x0005, 0x00e6, 0x2071, 0xb8f4, 0x6088, 0xa102, 0x0208, - 0x618a, 0x00ee, 0x0005, 0x0005, 0x7110, 0x080c, 0x501b, 0x1158, - 0x6088, 0x8001, 0x0240, 0x608a, 0x1130, 0x0126, 0x2091, 0x8000, - 0x080c, 0x71e5, 0x012e, 0x8108, 0xa182, 0x00ff, 0x0218, 0xa00e, - 0x7007, 0x0002, 0x7112, 0x0005, 0x7014, 0x2060, 0x0126, 0x2091, - 0x8000, 0x603c, 0xa005, 0x0128, 0x8001, 0x603e, 0x1110, 0x080c, - 0x9fd1, 0x6014, 0xa005, 0x0500, 0x8001, 0x6016, 0x11e8, 0x611c, - 0xa186, 0x0003, 0x0118, 0xa186, 0x0006, 0x11a0, 0x6010, 0x2068, - 0x6854, 0xa08a, 0x199a, 0x0270, 0xa082, 0x1999, 0x6856, 0xa08a, - 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x800b, 0x810b, 0xa108, - 0x6116, 0x0010, 0x080c, 0x9aa1, 0x012e, 0xac88, 0x0018, 0x7116, - 0x2001, 0xee00, 0xa102, 0x0220, 0x7017, 0xbe00, 0x7007, 0x0000, - 0x0005, 0x00e6, 0x2071, 0xb8f4, 0x7027, 0x07d0, 0x7023, 0x0009, - 0x00ee, 0x0005, 0x2001, 0xb8fd, 0x2003, 0x0000, 0x0005, 0x00e6, - 0x2071, 0xb8f4, 0x7132, 0x702f, 0x0009, 0x00ee, 0x0005, 0x2011, - 0xb900, 0x2013, 0x0000, 0x0005, 0x00e6, 0x2071, 0xb8f4, 0x711a, - 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x00c6, 0x0026, 0x7054, - 0x8000, 0x7056, 0x2061, 0xb8a1, 0x6008, 0xa086, 0x0000, 0x0158, - 0x7068, 0x6032, 0x7064, 0x602e, 0x7060, 0x602a, 0x705c, 0x6026, - 0x2c10, 0x080c, 0x1648, 0x002e, 0x00ce, 0x0005, 0x0006, 0x0016, - 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x696b, 0x00fe, 0x00ee, - 0x00de, 0x00ce, 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0xb8f4, - 0x7176, 0x727a, 0x7073, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, - 0x2071, 0xb8f4, 0x7078, 0xa206, 0x1110, 0x7076, 0x707a, 0x000e, - 0x00ee, 0x0005, 0x00c6, 0x2061, 0xb975, 0x00ce, 0x0005, 0xa184, - 0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0xb975, 0x2060, 0x0005, - 0x6854, 0xa08a, 0x199a, 0x0210, 0x2001, 0x1999, 0xa005, 0x1150, - 0x00c6, 0x2061, 0xb975, 0x6014, 0x00ce, 0xa005, 0x1138, 0x2001, - 0x001e, 0x0020, 0xa08e, 0xffff, 0x1108, 0xa006, 0x8003, 0x800b, - 0x810b, 0xa108, 0x6116, 0x684c, 0xa08c, 0x00c0, 0xa18e, 0x00c0, - 0x05e8, 0xd0b4, 0x1138, 0xd0bc, 0x1550, 0x2009, 0x0006, 0x080c, - 0x6b63, 0x0005, 0xd0fc, 0x0138, 0xa084, 0x0003, 0x0120, 0xa086, - 0x0003, 0x1904, 0x6b5d, 0x6020, 0xd0d4, 0x0130, 0xc0d4, 0x6022, - 0x6860, 0x602a, 0x685c, 0x602e, 0x2009, 0xb674, 0x2104, 0xd084, - 0x0138, 0x87ff, 0x1120, 0x2009, 0x0042, 0x080c, 0x86d3, 0x0005, - 0x87ff, 0x1120, 0x2009, 0x0043, 0x080c, 0x86d3, 0x0005, 0xd0fc, - 0x0130, 0xa084, 0x0003, 0x0118, 0xa086, 0x0003, 0x11f0, 0x87ff, - 0x1120, 0x2009, 0x0042, 0x080c, 0x86d3, 0x0005, 0xd0fc, 0x0160, - 0xa084, 0x0003, 0xa08e, 0x0002, 0x0148, 0x87ff, 0x1120, 0x2009, - 0x0041, 0x080c, 0x86d3, 0x0005, 0x0061, 0x0ce8, 0x87ff, 0x1dd8, - 0x2009, 0x0043, 0x080c, 0x86d3, 0x0cb0, 0x2009, 0x0004, 0x0019, - 0x0005, 0x2009, 0x0001, 0x00d6, 0x6010, 0xa0ec, 0xf000, 0x0510, - 0x2068, 0x6952, 0x6800, 0x6012, 0xa186, 0x0001, 0x1188, 0x694c, - 0xa18c, 0x8100, 0xa18e, 0x8100, 0x1158, 0x00c6, 0x2061, 0xb975, - 0x6200, 0xd28c, 0x1120, 0x6204, 0x8210, 0x0208, 0x6206, 0x00ce, - 0x080c, 0x547a, 0x6010, 0xa06d, 0x0076, 0x2039, 0x0000, 0x190c, - 0x6ae8, 0x007e, 0x00de, 0x0005, 0x0156, 0x00c6, 0x2061, 0xb975, - 0x6000, 0x81ff, 0x0110, 0xa205, 0x0008, 0xa204, 0x6002, 0x00ce, - 0x015e, 0x0005, 0x6800, 0xd08c, 0x1138, 0x6808, 0xa005, 0x0120, - 0x8001, 0x680a, 0xa085, 0x0001, 0x0005, 0x20a9, 0x0010, 0xa006, - 0x8004, 0x8086, 0x818e, 0x1208, 0xa200, 0x1f04, 0x6ba9, 0x8086, - 0x818e, 0x0005, 0x0156, 0x20a9, 0x0010, 0xa005, 0x01b8, 0xa11a, - 0x12a8, 0x8213, 0x818d, 0x0228, 0xa11a, 0x1220, 0x1f04, 0x6bb9, - 0x0028, 0xa11a, 0x2308, 0x8210, 0x1f04, 0x6bb9, 0x0006, 0x3200, - 0xa084, 0xefff, 0x2080, 0x000e, 0x015e, 0x0005, 0x0006, 0x3200, - 0xa085, 0x1000, 0x0cb8, 0x0126, 0x2091, 0x2800, 0x2079, 0xb8e1, - 0x012e, 0x00d6, 0x2069, 0xb8e1, 0x6803, 0x0005, 0x2069, 0x0004, - 0x2d04, 0xa085, 0x8001, 0x206a, 0x00de, 0x0005, 0x00c6, 0x6027, - 0x0001, 0x7804, 0xa084, 0x0007, 0x0002, 0x6bf7, 0x6c18, 0x6c6b, - 0x6bfd, 0x6c18, 0x6bf7, 0x6bf5, 0x6bf5, 0x080c, 0x151a, 0x080c, - 0x6a82, 0x080c, 0x71e5, 0x00ce, 0x0005, 0x62c0, 0x82ff, 0x1110, - 0x00ce, 0x0005, 0x2011, 0x4b23, 0x080c, 0x6a0e, 0x7828, 0xa092, - 0x00c8, 0x1228, 0x8000, 0x782a, 0x080c, 0x4b65, 0x0c88, 0x080c, - 0x4b23, 0x7807, 0x0003, 0x7827, 0x0000, 0x782b, 0x0000, 0x0c40, - 0x080c, 0x6a82, 0x3c00, 0x0006, 0x2011, 0x0209, 0x20e1, 0x4000, - 0x2214, 0x000e, 0x20e0, 0x82ff, 0x0178, 0x62c0, 0x82ff, 0x1160, - 0x782b, 0x0000, 0x7824, 0xa065, 0x090c, 0x151a, 0x2009, 0x0013, - 0x080c, 0x86d3, 0x00ce, 0x0005, 0x3900, 0xa082, 0xba2d, 0x1210, - 0x080c, 0x83b9, 0x00c6, 0x7824, 0xa065, 0x090c, 0x151a, 0x7804, - 0xa086, 0x0004, 0x0904, 0x6cab, 0x7828, 0xa092, 0x2710, 0x1230, - 0x8000, 0x782a, 0x00ce, 0x080c, 0x7de6, 0x0c20, 0x6104, 0xa186, - 0x0003, 0x1188, 0x00e6, 0x2071, 0xb600, 0x70e0, 0x00ee, 0xd08c, - 0x0150, 0x00c6, 0x00e6, 0x2061, 0x0100, 0x2071, 0xb600, 0x080c, - 0x4b7b, 0x00ee, 0x00ce, 0x080c, 0xb500, 0x2009, 0x0014, 0x080c, - 0x86d3, 0x00ce, 0x0838, 0x2001, 0xb8fd, 0x2003, 0x0000, 0x62c0, - 0x82ff, 0x1160, 0x782b, 0x0000, 0x7824, 0xa065, 0x090c, 0x151a, - 0x2009, 0x0013, 0x080c, 0x872c, 0x00ce, 0x0005, 0x00c6, 0x00d6, - 0x3900, 0xa082, 0xba2d, 0x1210, 0x080c, 0x83b9, 0x7824, 0xa005, - 0x090c, 0x151a, 0x781c, 0xa06d, 0x090c, 0x151a, 0x6800, 0xc0dc, - 0x6802, 0x7924, 0x2160, 0x080c, 0x86a4, 0x693c, 0x81ff, 0x090c, - 0x151a, 0x8109, 0x693e, 0x6854, 0xa015, 0x0110, 0x7a1e, 0x0010, - 0x7918, 0x791e, 0x7807, 0x0000, 0x7827, 0x0000, 0x00de, 0x00ce, - 0x080c, 0x71e5, 0x0888, 0x6104, 0xa186, 0x0002, 0x0128, 0xa186, - 0x0004, 0x0110, 0x0804, 0x6c44, 0x7808, 0xac06, 0x0904, 0x6c44, - 0x080c, 0x7102, 0x080c, 0x6d45, 0x00ce, 0x080c, 0x71e5, 0x0804, - 0x6c32, 0x00c6, 0x6027, 0x0002, 0x62c8, 0x60c4, 0xa205, 0x1178, - 0x793c, 0xa1e5, 0x0000, 0x0130, 0x2009, 0x0049, 0x080c, 0x86d3, - 0x00ce, 0x0005, 0x2011, 0xb900, 0x2013, 0x0000, 0x0cc8, 0x3908, - 0xa192, 0xba2d, 0x1210, 0x080c, 0x83b9, 0x793c, 0x81ff, 0x0d90, - 0x7944, 0xa192, 0x7530, 0x12b8, 0x8108, 0x7946, 0x793c, 0xa188, - 0x0007, 0x210c, 0xa18e, 0x0006, 0x1138, 0x6014, 0xa084, 0x0184, - 0xa085, 0x0012, 0x6016, 0x08e0, 0x6014, 0xa084, 0x0184, 0xa085, - 0x0016, 0x6016, 0x08a8, 0x7848, 0xc085, 0x784a, 0x0888, 0x0006, - 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, - 0x2061, 0xb8e1, 0x6020, 0x8000, 0x6022, 0x6010, 0xa005, 0x0148, - 0xa080, 0x0003, 0x2102, 0x6112, 0x012e, 0x00ce, 0x001e, 0x000e, - 0x0005, 0x6116, 0x6112, 0x0cc0, 0x00d6, 0x2069, 0xb8e1, 0x6000, - 0xd0d4, 0x0168, 0x6820, 0x8000, 0x6822, 0xa086, 0x0001, 0x1110, - 0x2c00, 0x681e, 0x6804, 0xa084, 0x0007, 0x0804, 0x71eb, 0xc0d5, - 0x6002, 0x6818, 0xa005, 0x0158, 0x6056, 0x605b, 0x0000, 0x0006, - 0x2c00, 0x681a, 0x00de, 0x685a, 0x2069, 0xb8e1, 0x0c18, 0x6056, - 0x605a, 0x2c00, 0x681a, 0x681e, 0x08e8, 0x0006, 0x0016, 0x00c6, - 0x0126, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061, 0xb8e1, - 0x6020, 0x8000, 0x6022, 0x6008, 0xa005, 0x0148, 0xa080, 0x0003, - 0x2102, 0x610a, 0x012e, 0x00ce, 0x001e, 0x000e, 0x0005, 0x610e, - 0x610a, 0x0cc0, 0x00c6, 0x600f, 0x0000, 0x2c08, 0x2061, 0xb8e1, - 0x6034, 0xa005, 0x0130, 0xa080, 0x0003, 0x2102, 0x6136, 0x00ce, - 0x0005, 0x613a, 0x6136, 0x0cd8, 0x00f6, 0x00e6, 0x00d6, 0x00c6, - 0x0076, 0x0066, 0x0056, 0x0036, 0x0026, 0x0016, 0x0006, 0x0126, - 0xa02e, 0x2071, 0xb8e1, 0x7638, 0x2660, 0x2678, 0x2091, 0x8000, - 0x8cff, 0x0904, 0x6ded, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, - 0x1904, 0x6de8, 0x87ff, 0x0120, 0x6050, 0xa106, 0x1904, 0x6de8, - 0x703c, 0xac06, 0x1190, 0x0036, 0x2019, 0x0001, 0x080c, 0x806b, - 0x7033, 0x0000, 0x703f, 0x0000, 0x7043, 0x0000, 0x7047, 0x0000, - 0x704b, 0x0000, 0x003e, 0x2029, 0x0001, 0x7038, 0xac36, 0x1110, - 0x660c, 0x763a, 0x7034, 0xac36, 0x1140, 0x2c00, 0xaf36, 0x0118, - 0x2f00, 0x7036, 0x0010, 0x7037, 0x0000, 0x660c, 0x0066, 0x2c00, - 0xaf06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, - 0x9d16, 0x01c8, 0x6010, 0x2068, 0x601c, 0xa086, 0x0003, 0x1580, - 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x0016, 0x0036, 0x0076, - 0x080c, 0x9f88, 0x080c, 0xb43c, 0x080c, 0x547a, 0x007e, 0x003e, - 0x001e, 0x080c, 0x9ecd, 0x080c, 0x9ed9, 0x00ce, 0x0804, 0x6d88, - 0x2c78, 0x600c, 0x2060, 0x0804, 0x6d88, 0x85ff, 0x0120, 0x0036, - 0x080c, 0x72a2, 0x003e, 0x012e, 0x000e, 0x001e, 0x002e, 0x003e, - 0x005e, 0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, - 0x601c, 0xa086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0076, 0x080c, - 0xb43c, 0x080c, 0xb155, 0x007e, 0x003e, 0x001e, 0x08a0, 0x601c, - 0xa086, 0x000a, 0x0904, 0x6dd2, 0x0804, 0x6dd0, 0x0006, 0x0066, - 0x00c6, 0x00d6, 0x00f6, 0x2031, 0x0000, 0x0126, 0x2091, 0x8000, - 0x2079, 0xb8e1, 0x7838, 0xa065, 0x0568, 0x600c, 0x0006, 0x600f, - 0x0000, 0x783c, 0xac06, 0x1180, 0x0036, 0x2019, 0x0001, 0x080c, - 0x806b, 0x7833, 0x0000, 0x783f, 0x0000, 0x7843, 0x0000, 0x7847, - 0x0000, 0x784b, 0x0000, 0x003e, 0x080c, 0x9d16, 0x0178, 0x6010, - 0x2068, 0x601c, 0xa086, 0x0003, 0x11b0, 0x6837, 0x0103, 0x6b4a, - 0x6847, 0x0000, 0x080c, 0x547a, 0x080c, 0x9ecd, 0x080c, 0x9ed9, - 0x000e, 0x0888, 0x7e3a, 0x7e36, 0x012e, 0x00fe, 0x00de, 0x00ce, - 0x006e, 0x000e, 0x0005, 0x601c, 0xa086, 0x0006, 0x1118, 0x080c, - 0xb155, 0x0c60, 0x601c, 0xa086, 0x000a, 0x0d08, 0x08f0, 0x0016, - 0x0026, 0x0086, 0x2041, 0x0000, 0x0099, 0x080c, 0x6f35, 0x008e, - 0x002e, 0x001e, 0x0005, 0x00f6, 0x0126, 0x2079, 0xb8e1, 0x2091, - 0x8000, 0x080c, 0x6fc2, 0x080c, 0x7034, 0x012e, 0x00fe, 0x0005, - 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0016, 0x0006, 0x0126, - 0x2091, 0x8000, 0x2071, 0xb8e1, 0x7614, 0x2660, 0x2678, 0x8cff, - 0x0904, 0x6f0b, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x1904, - 0x6f06, 0x88ff, 0x0120, 0x6050, 0xa106, 0x1904, 0x6f06, 0x7024, - 0xac06, 0x1538, 0x2069, 0x0100, 0x68c0, 0xa005, 0x01f0, 0x080c, - 0x6a82, 0x080c, 0x7df3, 0x68c3, 0x0000, 0x080c, 0x82d4, 0x7027, - 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0120, - 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, - 0x0110, 0x6827, 0x0001, 0x003e, 0x0020, 0x6003, 0x0009, 0x630a, - 0x04e8, 0x7014, 0xac36, 0x1110, 0x660c, 0x7616, 0x7010, 0xac36, - 0x1140, 0x2c00, 0xaf36, 0x0118, 0x2f00, 0x7012, 0x0010, 0x7013, - 0x0000, 0x660c, 0x0066, 0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008, - 0x2678, 0x600f, 0x0000, 0x6010, 0x2068, 0x080c, 0x9d16, 0x01b8, - 0x601c, 0xa086, 0x0003, 0x1540, 0x6837, 0x0103, 0x6b4a, 0x6847, - 0x0000, 0x0016, 0x0036, 0x0086, 0x080c, 0x9f88, 0x080c, 0xb43c, - 0x080c, 0x547a, 0x008e, 0x003e, 0x001e, 0x080c, 0x9ecd, 0x080c, - 0x9ed9, 0x080c, 0x81a5, 0x00ce, 0x0804, 0x6e8f, 0x2c78, 0x600c, - 0x2060, 0x0804, 0x6e8f, 0x012e, 0x000e, 0x001e, 0x006e, 0x00ce, - 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601c, 0xa086, 0x0006, 0x1158, - 0x0016, 0x0036, 0x0086, 0x080c, 0xb43c, 0x080c, 0xb155, 0x008e, - 0x003e, 0x001e, 0x08e0, 0x601c, 0xa086, 0x0002, 0x1128, 0x6004, - 0xa086, 0x0085, 0x0908, 0x0898, 0x601c, 0xa086, 0x0005, 0x1978, - 0x6004, 0xa086, 0x0085, 0x0d20, 0x0850, 0x00c6, 0x0006, 0x0126, - 0x2091, 0x8000, 0xa280, 0xb735, 0x2004, 0xa065, 0x0904, 0x6fbe, - 0x00f6, 0x00e6, 0x00d6, 0x0066, 0x2071, 0xb8e1, 0x6654, 0x7018, - 0xac06, 0x1108, 0x761a, 0x701c, 0xac06, 0x1130, 0x86ff, 0x1118, - 0x7018, 0x701e, 0x0008, 0x761e, 0x6058, 0xa07d, 0x0108, 0x7e56, - 0xa6ed, 0x0000, 0x0110, 0x2f00, 0x685a, 0x6057, 0x0000, 0x605b, - 0x0000, 0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x080c, 0x4f46, 0x0904, - 0x6fba, 0x7624, 0x86ff, 0x05e8, 0xa680, 0x0004, 0x2004, 0xad06, - 0x15c0, 0x00d6, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0548, 0x080c, - 0x6a82, 0x080c, 0x7df3, 0x68c3, 0x0000, 0x080c, 0x82d4, 0x7027, - 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0120, - 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, - 0x0110, 0x6827, 0x0001, 0x003e, 0x00de, 0x00c6, 0x603c, 0xa005, - 0x0110, 0x8001, 0x603e, 0x2660, 0x080c, 0x9ed9, 0x00ce, 0x0048, - 0x00de, 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, - 0x6f65, 0x8dff, 0x0158, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, - 0x080c, 0x9f88, 0x080c, 0xb43c, 0x080c, 0x547a, 0x080c, 0x81a5, - 0x0804, 0x6f65, 0x006e, 0x00de, 0x00ee, 0x00fe, 0x012e, 0x000e, - 0x00ce, 0x0005, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x2031, 0x0000, - 0x7814, 0xa065, 0x0904, 0x7014, 0x600c, 0x0006, 0x600f, 0x0000, - 0x7824, 0xac06, 0x1540, 0x2069, 0x0100, 0x68c0, 0xa005, 0x01f0, - 0x080c, 0x6a82, 0x080c, 0x7df3, 0x68c3, 0x0000, 0x080c, 0x82d4, - 0x7827, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, - 0x0120, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, - 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0028, 0x6003, 0x0009, - 0x630a, 0x2c30, 0x00b0, 0x6010, 0x2068, 0x080c, 0x9d16, 0x0168, - 0x601c, 0xa086, 0x0003, 0x11b8, 0x6837, 0x0103, 0x6b4a, 0x6847, - 0x0000, 0x080c, 0x547a, 0x080c, 0x9ecd, 0x080c, 0x9ed9, 0x080c, - 0x81a5, 0x000e, 0x0804, 0x6fc9, 0x7e16, 0x7e12, 0x00de, 0x00ce, - 0x006e, 0x000e, 0x0005, 0x601c, 0xa086, 0x0006, 0x1118, 0x080c, - 0xb155, 0x0c58, 0x601c, 0xa086, 0x0002, 0x1128, 0x6004, 0xa086, - 0x0085, 0x09d0, 0x0c10, 0x601c, 0xa086, 0x0005, 0x19f0, 0x6004, - 0xa086, 0x0085, 0x0d60, 0x08c8, 0x0006, 0x0066, 0x00c6, 0x00d6, - 0x7818, 0xa065, 0x0904, 0x709a, 0x6054, 0x0006, 0x6057, 0x0000, - 0x605b, 0x0000, 0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x080c, 0x4f46, - 0x0904, 0x7097, 0x7e24, 0x86ff, 0x05e8, 0xa680, 0x0004, 0x2004, - 0xad06, 0x15c0, 0x00d6, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0548, - 0x080c, 0x6a82, 0x080c, 0x7df3, 0x68c3, 0x0000, 0x080c, 0x82d4, - 0x7827, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, - 0x0120, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, - 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x00de, 0x00c6, 0x603c, - 0xa005, 0x0110, 0x8001, 0x603e, 0x2660, 0x080c, 0x9ed9, 0x00ce, - 0x0048, 0x00de, 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, - 0x0804, 0x7046, 0x8dff, 0x0138, 0x6837, 0x0103, 0x6b4a, 0x6847, - 0x0000, 0x080c, 0x547a, 0x080c, 0x81a5, 0x0804, 0x7046, 0x000e, - 0x0804, 0x7039, 0x781e, 0x781a, 0x00de, 0x00ce, 0x006e, 0x000e, - 0x0005, 0x00e6, 0x00d6, 0x0066, 0x6000, 0xd0dc, 0x01a0, 0x604c, - 0xa06d, 0x0188, 0x6848, 0xa606, 0x1170, 0x2071, 0xb8e1, 0x7024, - 0xa035, 0x0148, 0xa080, 0x0004, 0x2004, 0xad06, 0x1120, 0x6000, - 0xc0dc, 0x6002, 0x0021, 0x006e, 0x00de, 0x00ee, 0x0005, 0x00f6, - 0x2079, 0x0100, 0x78c0, 0xa005, 0x1138, 0x00c6, 0x2660, 0x6003, - 0x0009, 0x630a, 0x00ce, 0x04a0, 0x080c, 0x7df3, 0x78c3, 0x0000, - 0x080c, 0x82d4, 0x7027, 0x0000, 0x0036, 0x2079, 0x0140, 0x7b04, - 0xa384, 0x1000, 0x0120, 0x7803, 0x0100, 0x7803, 0x0000, 0x2079, - 0x0100, 0x7824, 0xd084, 0x0110, 0x7827, 0x0001, 0x080c, 0x82d4, - 0x003e, 0x080c, 0x4f46, 0x00c6, 0x603c, 0xa005, 0x0110, 0x8001, - 0x603e, 0x2660, 0x080c, 0x86a4, 0x00ce, 0x6837, 0x0103, 0x6b4a, - 0x6847, 0x0000, 0x080c, 0x9f88, 0x080c, 0x547a, 0x080c, 0x81a5, - 0x00fe, 0x0005, 0x00e6, 0x00c6, 0x2071, 0xb8e1, 0x7004, 0xa084, - 0x0007, 0x0002, 0x7114, 0x7117, 0x712d, 0x7146, 0x7183, 0x7114, - 0x7112, 0x7112, 0x080c, 0x151a, 0x00ce, 0x00ee, 0x0005, 0x7024, - 0xa065, 0x0148, 0x7020, 0x8001, 0x7022, 0x600c, 0xa015, 0x0150, - 0x7216, 0x600f, 0x0000, 0x7007, 0x0000, 0x7027, 0x0000, 0x00ce, - 0x00ee, 0x0005, 0x7216, 0x7212, 0x0cb0, 0x6018, 0x2060, 0x080c, - 0x4f46, 0x6000, 0xc0dc, 0x6002, 0x7020, 0x8001, 0x7022, 0x0120, - 0x6054, 0xa015, 0x0140, 0x721e, 0x7007, 0x0000, 0x7027, 0x0000, - 0x00ce, 0x00ee, 0x0005, 0x7218, 0x721e, 0x0cb0, 0x7024, 0xa065, - 0x05b8, 0x700c, 0xac06, 0x1160, 0x080c, 0x81a5, 0x600c, 0xa015, - 0x0120, 0x720e, 0x600f, 0x0000, 0x0448, 0x720e, 0x720a, 0x0430, - 0x7014, 0xac06, 0x1160, 0x080c, 0x81a5, 0x600c, 0xa015, 0x0120, - 0x7216, 0x600f, 0x0000, 0x00d0, 0x7216, 0x7212, 0x00b8, 0x601c, - 0xa086, 0x0003, 0x1198, 0x6018, 0x2060, 0x080c, 0x4f46, 0x6000, - 0xc0dc, 0x6002, 0x080c, 0x81a5, 0x701c, 0xa065, 0x0138, 0x6054, - 0xa015, 0x0110, 0x721e, 0x0010, 0x7218, 0x721e, 0x7027, 0x0000, - 0x00ce, 0x00ee, 0x0005, 0x7024, 0xa065, 0x0140, 0x080c, 0x81a5, - 0x600c, 0xa015, 0x0150, 0x720e, 0x600f, 0x0000, 0x080c, 0x82d4, - 0x7027, 0x0000, 0x00ce, 0x00ee, 0x0005, 0x720e, 0x720a, 0x0cb0, - 0x00d6, 0x2069, 0xb8e1, 0x6830, 0xa084, 0x0003, 0x0002, 0x71a5, - 0x71a7, 0x71cb, 0x71a3, 0x080c, 0x151a, 0x00de, 0x0005, 0x00c6, - 0x6840, 0xa086, 0x0001, 0x01b8, 0x683c, 0xa065, 0x0130, 0x600c, - 0xa015, 0x0170, 0x6a3a, 0x600f, 0x0000, 0x6833, 0x0000, 0x683f, - 0x0000, 0x2011, 0xb900, 0x2013, 0x0000, 0x00ce, 0x00de, 0x0005, - 0x683a, 0x6836, 0x0c90, 0x6843, 0x0000, 0x6838, 0xa065, 0x0d68, - 0x6003, 0x0003, 0x0c50, 0x00c6, 0x6843, 0x0000, 0x6847, 0x0000, - 0x684b, 0x0000, 0x683c, 0xa065, 0x0168, 0x600c, 0xa015, 0x0130, - 0x6a3a, 0x600f, 0x0000, 0x683f, 0x0000, 0x0020, 0x683f, 0x0000, - 0x683a, 0x6836, 0x00ce, 0x00de, 0x0005, 0x00d6, 0x2069, 0xb8e1, - 0x6804, 0xa084, 0x0007, 0x0002, 0x71f6, 0x7292, 0x7292, 0x7292, - 0x7292, 0x7294, 0x71f4, 0x71f4, 0x080c, 0x151a, 0x6820, 0xa005, - 0x1110, 0x00de, 0x0005, 0x00c6, 0x680c, 0xa065, 0x0150, 0x6807, - 0x0004, 0x6826, 0x682b, 0x0000, 0x080c, 0x72e4, 0x00ce, 0x00de, - 0x0005, 0x6814, 0xa065, 0x0150, 0x6807, 0x0001, 0x6826, 0x682b, - 0x0000, 0x080c, 0x72e4, 0x00ce, 0x00de, 0x0005, 0x00e6, 0x0036, - 0x6a1c, 0xa2f5, 0x0000, 0x0904, 0x728e, 0x704c, 0xa00d, 0x0118, - 0x7088, 0xa005, 0x01a0, 0x7054, 0xa075, 0x0120, 0xa20e, 0x0904, - 0x728e, 0x0028, 0x6818, 0xa20e, 0x0904, 0x728e, 0x2070, 0x704c, - 0xa00d, 0x0d88, 0x7088, 0xa005, 0x1d70, 0x2e00, 0x681e, 0x733c, - 0x7038, 0xa302, 0x1e40, 0x080c, 0x867b, 0x0904, 0x728e, 0x8318, - 0x733e, 0x6112, 0x2e10, 0x621a, 0xa180, 0x0014, 0x2004, 0xa084, - 0x00ff, 0x605a, 0xa180, 0x0014, 0x2003, 0x0000, 0xa180, 0x0015, - 0x2004, 0xa08a, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x801b, - 0x831b, 0xa318, 0x6316, 0x003e, 0x00f6, 0x2c78, 0x71a0, 0x2001, - 0xb635, 0x2004, 0xd0ac, 0x1110, 0xd1bc, 0x0150, 0x7100, 0xd1f4, - 0x0120, 0x7114, 0xa18c, 0x00ff, 0x0040, 0x2009, 0x0000, 0x0028, - 0xa1e0, 0x2df9, 0x2c0d, 0xa18c, 0x00ff, 0x2061, 0x0100, 0x619a, - 0x080c, 0x7914, 0x7300, 0xc3dd, 0x7302, 0x6807, 0x0002, 0x2f18, - 0x6b26, 0x682b, 0x0000, 0x781f, 0x0003, 0x7803, 0x0001, 0x7807, - 0x0040, 0x00fe, 0x00ee, 0x00ce, 0x00de, 0x0005, 0x003e, 0x00ee, - 0x00ce, 0x0cd0, 0x00de, 0x0005, 0x00c6, 0x680c, 0xa065, 0x0138, - 0x6807, 0x0004, 0x6826, 0x682b, 0x0000, 0x080c, 0x72e4, 0x00ce, - 0x00de, 0x0005, 0x00f6, 0x00d6, 0x2069, 0xb8e1, 0x6830, 0xa086, - 0x0000, 0x11d0, 0x2001, 0xb60c, 0x200c, 0xd1bc, 0x1560, 0x6838, - 0xa07d, 0x0190, 0x6833, 0x0001, 0x683e, 0x6847, 0x0000, 0x684b, - 0x0000, 0x0126, 0x00f6, 0x2091, 0x2400, 0x002e, 0x080c, 0x203d, - 0x1130, 0x012e, 0x080c, 0x7c5d, 0x00de, 0x00fe, 0x0005, 0x012e, - 0xe000, 0x6843, 0x0000, 0x7803, 0x0002, 0x780c, 0xa015, 0x0140, - 0x6a3a, 0x780f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x0c60, - 0x683a, 0x6836, 0x0cc0, 0xc1bc, 0x2102, 0x0066, 0x2031, 0x0001, - 0x080c, 0x5bc3, 0x006e, 0x0858, 0x601c, 0xa084, 0x000f, 0x000b, - 0x0005, 0x72f2, 0x72f7, 0x77b5, 0x78d1, 0x72f7, 0x77b5, 0x78d1, - 0x72f2, 0x72f7, 0x080c, 0x7102, 0x080c, 0x71e5, 0x0005, 0x0156, - 0x0136, 0x0146, 0x00c6, 0x00f6, 0x6004, 0xa08a, 0x0080, 0x1a0c, - 0x151a, 0x6118, 0x2178, 0x79a0, 0x2011, 0xb635, 0x2214, 0xd2ac, - 0x1110, 0xd1bc, 0x0150, 0x7900, 0xd1f4, 0x0120, 0x7914, 0xa18c, - 0x00ff, 0x0040, 0x2009, 0x0000, 0x0028, 0xa1f8, 0x2df9, 0x2f0d, - 0xa18c, 0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, 0xa08a, 0x0040, - 0x1a04, 0x736b, 0x0033, 0x00fe, 0x00ce, 0x014e, 0x013e, 0x015e, - 0x0005, 0x741a, 0x7465, 0x7492, 0x755f, 0x758d, 0x7595, 0x75bb, - 0x75cc, 0x75dd, 0x75e5, 0x75fb, 0x75e5, 0x765c, 0x75cc, 0x767d, - 0x7685, 0x75dd, 0x7685, 0x7696, 0x7369, 0x7369, 0x7369, 0x7369, - 0x7369, 0x7369, 0x7369, 0x7369, 0x7369, 0x7369, 0x7369, 0x7efe, - 0x7f23, 0x7f46, 0x7f69, 0x7f8a, 0x75bb, 0x7369, 0x75bb, 0x75e5, - 0x7369, 0x7492, 0x755f, 0x7369, 0x83d6, 0x75e5, 0x7369, 0x83f6, - 0x75e5, 0x7369, 0x75dd, 0x7413, 0x737e, 0x7369, 0x841b, 0x8490, - 0x8567, 0x7369, 0x8578, 0x75b6, 0x8594, 0x7369, 0x7f9f, 0x85ef, - 0x7369, 0x080c, 0x151a, 0x2100, 0x0033, 0x00fe, 0x00ce, 0x014e, - 0x013e, 0x015e, 0x0005, 0x737c, 0x737c, 0x737c, 0x73b2, 0x73d0, - 0x73e6, 0x737c, 0x737c, 0x737c, 0x080c, 0x151a, 0x00d6, 0x20a1, - 0x020b, 0x080c, 0x76b3, 0x7810, 0x2068, 0x20a3, 0x2414, 0x20a3, - 0x0018, 0x20a3, 0x0800, 0x683c, 0x20a2, 0x20a3, 0x0000, 0x20a3, - 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x6850, 0x20a2, 0x6854, - 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0018, 0x080c, - 0x7de0, 0x00de, 0x0005, 0x00d6, 0x7818, 0x2068, 0x68a0, 0x2069, - 0xb600, 0x6ad4, 0xd2ac, 0x1110, 0xd0bc, 0x0110, 0xa085, 0x0001, - 0x00de, 0x0005, 0x00d6, 0x20a1, 0x020b, 0x080c, 0x76b3, 0x20a3, - 0x0500, 0x20a3, 0x0000, 0x7810, 0xa0e8, 0x000f, 0x6808, 0x20a2, - 0x680c, 0x20a2, 0x6810, 0x20a2, 0x6814, 0x20a2, 0x6818, 0x20a2, - 0x681c, 0x20a2, 0x60c3, 0x0010, 0x080c, 0x7de0, 0x00de, 0x0005, - 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x76b3, 0x20a3, 0x7800, - 0x20a3, 0x0000, 0x7808, 0x8007, 0x20a2, 0x20a3, 0x0000, 0x60c3, - 0x0008, 0x080c, 0x7de0, 0x014e, 0x015e, 0x0005, 0x0156, 0x0146, - 0x20a1, 0x020b, 0x080c, 0x774f, 0x20a3, 0x0200, 0x20a3, 0x0000, - 0x20a3, 0xdf10, 0x20a3, 0x0034, 0x2099, 0xb605, 0x20a9, 0x0004, - 0x53a6, 0x2099, 0xb601, 0x20a9, 0x0004, 0x53a6, 0x2099, 0xb8c7, - 0x20a9, 0x001a, 0x3304, 0x8007, 0x20a2, 0x9398, 0x1f04, 0x7402, - 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x004c, 0x080c, 0x7de0, - 0x014e, 0x015e, 0x0005, 0x2001, 0xb615, 0x2004, 0x609a, 0x080c, - 0x7de0, 0x0005, 0x20a1, 0x020b, 0x080c, 0x76b3, 0x20a3, 0x5200, - 0x20a3, 0x0000, 0x00d6, 0x2069, 0xb652, 0x6804, 0xd084, 0x0150, - 0x6828, 0x20a3, 0x0000, 0x0016, 0x080c, 0x2866, 0x21a2, 0x001e, - 0x00de, 0x0028, 0x00de, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a9, - 0x0004, 0x2099, 0xb605, 0x53a6, 0x20a9, 0x0004, 0x2099, 0xb601, - 0x53a6, 0x2001, 0xb635, 0x2004, 0xd0ac, 0x1138, 0x7818, 0xa080, - 0x0028, 0x2004, 0xa082, 0x007f, 0x0238, 0x2001, 0xb61c, 0x20a6, - 0x2001, 0xb61d, 0x20a6, 0x0040, 0x20a3, 0x0000, 0x2001, 0xb615, - 0x2004, 0xa084, 0x00ff, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, - 0x60c3, 0x001c, 0x080c, 0x7de0, 0x0005, 0x20a1, 0x020b, 0x080c, - 0x76b3, 0x20a3, 0x0500, 0x20a3, 0x0000, 0x2001, 0xb635, 0x2004, - 0xd0ac, 0x1138, 0x7818, 0xa080, 0x0028, 0x2004, 0xa082, 0x007f, - 0x0238, 0x2001, 0xb61c, 0x20a6, 0x2001, 0xb61d, 0x20a6, 0x0040, - 0x20a3, 0x0000, 0x2001, 0xb615, 0x2004, 0xa084, 0x00ff, 0x20a2, - 0x20a9, 0x0004, 0x2099, 0xb605, 0x53a6, 0x60c3, 0x0010, 0x080c, - 0x7de0, 0x0005, 0x20a1, 0x020b, 0x080c, 0x76b3, 0x00c6, 0x7818, - 0x2060, 0x2001, 0x0000, 0x080c, 0x5385, 0x00ce, 0x7818, 0xa080, - 0x0028, 0x2004, 0xa086, 0x007e, 0x1130, 0x20a3, 0x0400, 0x620c, - 0xc2b4, 0x620e, 0x0010, 0x20a3, 0x0300, 0x20a3, 0x0000, 0x7818, - 0xa080, 0x0028, 0x2004, 0xa086, 0x007e, 0x1904, 0x7521, 0x2001, - 0xb635, 0x2004, 0xd0a4, 0x01c8, 0x2099, 0xb88e, 0x33a6, 0x9398, - 0x20a3, 0x0000, 0x9398, 0x3304, 0xa084, 0x2000, 0x20a2, 0x9398, - 0x33a6, 0x9398, 0x20a3, 0x0000, 0x9398, 0x2001, 0x2710, 0x20a2, - 0x9398, 0x33a6, 0x9398, 0x33a6, 0x00d0, 0x2099, 0xb88e, 0x33a6, - 0x9398, 0x33a6, 0x9398, 0x3304, 0x080c, 0x5b41, 0x1118, 0xa084, - 0x37ff, 0x0010, 0xa084, 0x3fff, 0x20a2, 0x9398, 0x33a6, 0x20a3, - 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a9, - 0x0004, 0x2099, 0xb605, 0x53a6, 0x20a9, 0x0004, 0x2099, 0xb601, - 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, 0x74fb, 0x20a9, - 0x0008, 0x20a3, 0x0000, 0x1f04, 0x7501, 0x2099, 0xb896, 0x3304, - 0xc0dd, 0x20a2, 0x2001, 0xb672, 0x2004, 0xd0e4, 0x0158, 0x20a3, - 0x0000, 0x20a3, 0x0000, 0x9398, 0x9398, 0x9398, 0x33a6, 0x20a9, - 0x0004, 0x0010, 0x20a9, 0x0007, 0x20a3, 0x0000, 0x1f04, 0x751c, - 0x0468, 0x2001, 0xb635, 0x2004, 0xd0a4, 0x0140, 0x2001, 0xb88f, - 0x2004, 0x60e3, 0x0000, 0x080c, 0x28a7, 0x60e2, 0x2099, 0xb88e, - 0x20a9, 0x0008, 0x53a6, 0x20a9, 0x0004, 0x2099, 0xb605, 0x53a6, - 0x20a9, 0x0004, 0x2099, 0xb601, 0x53a6, 0x20a9, 0x0008, 0x20a3, - 0x0000, 0x1f04, 0x753f, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, - 0x7545, 0x2099, 0xb896, 0x20a9, 0x0008, 0x53a6, 0x20a9, 0x0008, - 0x20a3, 0x0000, 0x1f04, 0x7550, 0x20a9, 0x000a, 0x20a3, 0x0000, - 0x1f04, 0x7556, 0x60c3, 0x0074, 0x080c, 0x7de0, 0x0005, 0x20a1, - 0x020b, 0x080c, 0x76b3, 0x20a3, 0x2010, 0x20a3, 0x0014, 0x20a3, - 0x0800, 0x20a3, 0x2000, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, - 0x20a2, 0x00f6, 0x2079, 0xb652, 0x7904, 0x00fe, 0xd1ac, 0x1110, - 0xa085, 0x0020, 0xd1a4, 0x0110, 0xa085, 0x0010, 0xa085, 0x0002, - 0x00d6, 0x0804, 0x763e, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, - 0x60c3, 0x0014, 0x080c, 0x7de0, 0x0005, 0x20a1, 0x020b, 0x080c, - 0x76b3, 0x20a3, 0x5000, 0x0804, 0x74ad, 0x20a1, 0x020b, 0x080c, - 0x76b3, 0x20a3, 0x2110, 0x20a3, 0x0014, 0x20a3, 0x0000, 0x20a3, - 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, - 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, - 0x0000, 0x60c3, 0x0014, 0x080c, 0x7de0, 0x0005, 0x20a1, 0x020b, - 0x080c, 0x7747, 0x0020, 0x20a1, 0x020b, 0x080c, 0x774f, 0x20a3, - 0x0200, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, - 0x0004, 0x080c, 0x7de0, 0x0005, 0x20a1, 0x020b, 0x080c, 0x774f, - 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3, 0x2a00, - 0x60c3, 0x0008, 0x080c, 0x7de0, 0x0005, 0x20a1, 0x020b, 0x080c, - 0x774f, 0x20a3, 0x0200, 0x0804, 0x74ad, 0x20a1, 0x020b, 0x080c, - 0x774f, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x7828, 0xa005, 0x0110, - 0x20a2, 0x0010, 0x20a3, 0x0003, 0x7810, 0x20a2, 0x60c3, 0x0008, - 0x080c, 0x7de0, 0x0005, 0x00d6, 0x20a1, 0x020b, 0x080c, 0x774f, - 0x20a3, 0x0210, 0x20a3, 0x0014, 0x20a3, 0x0800, 0x7818, 0x2068, - 0x6894, 0xa086, 0x0014, 0x1198, 0x699c, 0xa184, 0x0030, 0x0190, - 0x6998, 0xa184, 0xc000, 0x1140, 0xd1ec, 0x0118, 0x20a3, 0x2100, - 0x0058, 0x20a3, 0x0100, 0x0040, 0x20a3, 0x0400, 0x0028, 0x20a3, - 0x0700, 0x0010, 0x700f, 0x0800, 0xa006, 0x20a2, 0x20a2, 0x20a2, - 0x20a2, 0x20a2, 0x00f6, 0x2079, 0xb652, 0x7904, 0x00fe, 0xd1ac, - 0x1110, 0xa085, 0x0020, 0xd1a4, 0x0110, 0xa085, 0x0010, 0x2009, - 0xb674, 0x210c, 0xd184, 0x1110, 0xa085, 0x0002, 0x0026, 0x2009, - 0xb672, 0x210c, 0xd1e4, 0x0130, 0xc0c5, 0xa094, 0x0030, 0xa296, - 0x0010, 0x0140, 0xd1ec, 0x0130, 0xa094, 0x0030, 0xa296, 0x0010, - 0x0108, 0xc0bd, 0x002e, 0x20a2, 0x20a2, 0x20a2, 0x60c3, 0x0014, - 0x080c, 0x7de0, 0x00de, 0x0005, 0x20a1, 0x020b, 0x080c, 0x774f, - 0x20a3, 0x0210, 0x20a3, 0x0014, 0x20a3, 0x0000, 0x20a3, 0x0100, - 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, - 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, - 0x60c3, 0x0014, 0x080c, 0x7de0, 0x0005, 0x20a1, 0x020b, 0x080c, - 0x774f, 0x20a3, 0x0200, 0x0804, 0x7420, 0x20a1, 0x020b, 0x080c, - 0x774f, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3, - 0x2a00, 0x60c3, 0x0008, 0x080c, 0x7de0, 0x0005, 0x20e1, 0x9080, - 0x20e1, 0x4000, 0x20a1, 0x020b, 0x080c, 0x774f, 0x20a3, 0x0100, - 0x20a3, 0x0000, 0x20a3, 0x000b, 0x20a3, 0x0000, 0x60c3, 0x0008, - 0x080c, 0x7de0, 0x0005, 0x0026, 0x0036, 0x0046, 0x2019, 0x3200, - 0x2021, 0x0800, 0x0038, 0x0026, 0x0036, 0x0046, 0x2019, 0x2200, - 0x2021, 0x0100, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, - 0x0028, 0x2014, 0xa286, 0x007e, 0x11a0, 0xa385, 0x00ff, 0x20a2, - 0x20a3, 0xfffe, 0x20a3, 0x0000, 0x2011, 0xb615, 0x2214, 0x2001, - 0xb89e, 0x2004, 0xa005, 0x0118, 0x2011, 0xb61d, 0x2214, 0x22a2, - 0x04d0, 0xa286, 0x007f, 0x1138, 0x00d6, 0xa385, 0x00ff, 0x20a2, - 0x20a3, 0xfffd, 0x00c8, 0x2001, 0xb635, 0x2004, 0xd0ac, 0x1110, - 0xd2bc, 0x01c8, 0xa286, 0x0080, 0x00d6, 0x1130, 0xa385, 0x00ff, - 0x20a2, 0x20a3, 0xfffc, 0x0040, 0xa2e8, 0xb735, 0x2d6c, 0x6810, - 0xa305, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xb61c, 0x2da6, 0x8d68, - 0x2da6, 0x00de, 0x0080, 0x00d6, 0xa2e8, 0xb735, 0x2d6c, 0x6810, - 0xa305, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, - 0xb615, 0x2214, 0x22a2, 0xa485, 0x0029, 0x20a2, 0x004e, 0x003e, - 0x20a3, 0x0000, 0x080c, 0x7dcf, 0x22a2, 0x20a3, 0x0000, 0x2fa2, - 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, 0x0005, - 0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a3, 0x02ff, 0x2011, - 0xfffc, 0x22a2, 0x00d6, 0x2069, 0xb61c, 0x2da6, 0x8d68, 0x2da6, - 0x00de, 0x20a3, 0x2029, 0x20a3, 0x0000, 0x08e0, 0x20a3, 0x0100, - 0x20a3, 0x0000, 0x20a3, 0xfc02, 0x20a3, 0x0000, 0x0005, 0x0026, - 0x0036, 0x0046, 0x2019, 0x3300, 0x2021, 0x0800, 0x0038, 0x0026, - 0x0036, 0x0046, 0x2019, 0x2300, 0x2021, 0x0100, 0x20e1, 0x9080, - 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xb635, - 0x2214, 0xd2ac, 0x1118, 0xa092, 0x007e, 0x02d8, 0x00d6, 0xa0e8, - 0xb735, 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x6810, - 0xa005, 0x1140, 0x6814, 0xa005, 0x1128, 0x20a3, 0x00ff, 0x20a3, - 0xfffe, 0x0028, 0x2069, 0xb61c, 0x2da6, 0x8d68, 0x2da6, 0x00de, - 0x0080, 0x00d6, 0xa0e8, 0xb735, 0x2d6c, 0x6810, 0xa305, 0x20a2, - 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb615, 0x2214, - 0x22a2, 0xa485, 0x0098, 0x20a2, 0x20a3, 0x0000, 0x004e, 0x003e, - 0x080c, 0x7dcf, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, - 0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, 0x0005, 0x080c, 0x7dcf, - 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x7810, 0x20a2, 0x20a3, - 0x0000, 0x20a3, 0x0000, 0x002e, 0x0005, 0x00c6, 0x00f6, 0x6004, - 0xa08a, 0x0085, 0x0a0c, 0x151a, 0xa08a, 0x008c, 0x1a0c, 0x151a, - 0x6118, 0x2178, 0x79a0, 0x2011, 0xb635, 0x2214, 0xd2ac, 0x1110, - 0xd1bc, 0x0150, 0x7900, 0xd1f4, 0x0120, 0x7914, 0xa18c, 0x00ff, - 0x0040, 0x2009, 0x0000, 0x0028, 0xa1f8, 0x2df9, 0x2f0d, 0xa18c, - 0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, 0xa082, 0x0085, 0x001b, - 0x00fe, 0x00ce, 0x0005, 0x77ec, 0x77f6, 0x7811, 0x77ea, 0x77ea, - 0x77ea, 0x77ec, 0x080c, 0x151a, 0x0146, 0x20a1, 0x020b, 0x04a1, - 0x60c3, 0x0000, 0x080c, 0x7de0, 0x014e, 0x0005, 0x0146, 0x20a1, - 0x020b, 0x080c, 0x785d, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, - 0x20a2, 0x7810, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0xffff, 0x20a3, - 0x0000, 0x20a3, 0x0000, 0x60c3, 0x000c, 0x080c, 0x7de0, 0x014e, - 0x0005, 0x0146, 0x20a1, 0x020b, 0x080c, 0x7897, 0x20a3, 0x0003, - 0x20a3, 0x0300, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0004, - 0x080c, 0x7de0, 0x014e, 0x0005, 0x0026, 0x20e1, 0x9080, 0x20e1, - 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xb635, 0x2214, - 0xd2ac, 0x1118, 0xa092, 0x007e, 0x0288, 0x00d6, 0xa0e8, 0xb735, - 0x2d6c, 0x6810, 0xa085, 0x8100, 0x20a2, 0x6814, 0x20a2, 0x2069, - 0xb61c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, - 0xb735, 0x2d6c, 0x6810, 0xa085, 0x8100, 0x20a2, 0x6814, 0x20a2, - 0x00de, 0x20a3, 0x0000, 0x2011, 0xb615, 0x2214, 0x22a2, 0x20a3, - 0x0009, 0x20a3, 0x0000, 0x0804, 0x771a, 0x0026, 0x20e1, 0x9080, - 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xb635, - 0x2214, 0xd2ac, 0x1118, 0xa092, 0x007e, 0x0288, 0x00d6, 0xa0e8, - 0xb735, 0x2d6c, 0x6810, 0xa085, 0x8400, 0x20a2, 0x6814, 0x20a2, - 0x2069, 0xb61c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, - 0xa0e8, 0xb735, 0x2d6c, 0x6810, 0xa085, 0x8400, 0x20a2, 0x6814, - 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb615, 0x2214, 0x22a2, - 0x2001, 0x0099, 0x20a2, 0x20a3, 0x0000, 0x0804, 0x77a6, 0x0026, - 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, - 0x2011, 0xb635, 0x2214, 0xd2ac, 0x1118, 0xa092, 0x007e, 0x0288, - 0x00d6, 0xa0e8, 0xb735, 0x2d6c, 0x6810, 0xa085, 0x8500, 0x20a2, - 0x6814, 0x20a2, 0x2069, 0xb61c, 0x2da6, 0x8d68, 0x2da6, 0x00de, - 0x0088, 0x00d6, 0xa0e8, 0xb735, 0x2d6c, 0x6810, 0xa085, 0x8500, - 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb615, - 0x2214, 0x22a2, 0x2001, 0x0099, 0x20a2, 0x20a3, 0x0000, 0x0804, - 0x77a6, 0x00c6, 0x00f6, 0x2c78, 0x7804, 0xa08a, 0x0040, 0x0a0c, - 0x151a, 0xa08a, 0x0053, 0x1a0c, 0x151a, 0x7918, 0x2160, 0x61a0, - 0x2011, 0xb635, 0x2214, 0xd2ac, 0x1110, 0xd1bc, 0x0150, 0x6100, - 0xd1f4, 0x0120, 0x6114, 0xa18c, 0x00ff, 0x0040, 0x2009, 0x0000, - 0x0028, 0xa1e0, 0x2df9, 0x2c0d, 0xa18c, 0x00ff, 0x2061, 0x0100, - 0x619a, 0xa082, 0x0040, 0x001b, 0x00fe, 0x00ce, 0x0005, 0x7914, - 0x7a20, 0x79bd, 0x7bd2, 0x7912, 0x7912, 0x7912, 0x7912, 0x7912, - 0x7912, 0x7912, 0x815e, 0x816e, 0x817e, 0x818e, 0x7912, 0x85a5, - 0x7912, 0x814d, 0x080c, 0x151a, 0x00d6, 0x0156, 0x0146, 0x780b, - 0xffff, 0x20a1, 0x020b, 0x080c, 0x7974, 0x7910, 0x2168, 0x6948, - 0x7952, 0x21a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x694c, 0xa184, - 0x000f, 0x1118, 0x2001, 0x0005, 0x0040, 0xd184, 0x0118, 0x2001, - 0x0004, 0x0018, 0xa084, 0x0006, 0x8004, 0x0016, 0x2008, 0x7858, - 0xa084, 0x00ff, 0x8007, 0xa105, 0x001e, 0x20a2, 0xd1ac, 0x0118, - 0x20a3, 0x0002, 0x0048, 0xd1b4, 0x0118, 0x20a3, 0x0001, 0x0020, - 0x20a3, 0x0000, 0x2230, 0x0010, 0x6a80, 0x6e7c, 0x20a9, 0x0008, - 0x0136, 0xad88, 0x0017, 0x2198, 0x20a1, 0x021b, 0x53a6, 0x013e, - 0x20a1, 0x020b, 0x22a2, 0x26a2, 0x60c3, 0x0020, 0x20e1, 0x9080, - 0x6014, 0xa084, 0x0004, 0xa085, 0x0009, 0x6016, 0x2001, 0xb8fd, - 0x2003, 0x07d0, 0x2001, 0xb8fc, 0x2003, 0x0009, 0x080c, 0x17e7, - 0x014e, 0x015e, 0x00de, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, - 0x7a18, 0xa280, 0x0023, 0x2014, 0x8210, 0xa294, 0x00ff, 0x2202, - 0x8217, 0x7818, 0xa080, 0x0028, 0x2004, 0x2019, 0xb635, 0x231c, - 0xd3ac, 0x1110, 0xd0bc, 0x0188, 0x00d6, 0xa0e8, 0xb735, 0x2d6c, - 0x6810, 0xa085, 0x0600, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xb61c, - 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xb735, - 0x2d6c, 0x6810, 0xa085, 0x0600, 0x20a2, 0x6814, 0x20a2, 0x00de, - 0x20a3, 0x0000, 0x2009, 0xb615, 0x210c, 0x21a2, 0x20a3, 0x0829, - 0x20a3, 0x0000, 0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x20a3, 0xffff, - 0x20a3, 0x0000, 0x20a3, 0x0000, 0x0005, 0x00d6, 0x0156, 0x0136, - 0x0146, 0x20a1, 0x020b, 0x00c1, 0x7810, 0x2068, 0x6860, 0x20a2, - 0x685c, 0x20a2, 0x6880, 0x20a2, 0x687c, 0x20a2, 0xa006, 0x20a2, - 0x20a2, 0x20a2, 0x20a2, 0x60c3, 0x000c, 0x080c, 0x7de0, 0x014e, - 0x013e, 0x015e, 0x00de, 0x0005, 0x0026, 0x20e1, 0x9080, 0x20e1, - 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xb635, 0x2214, - 0xd2ac, 0x1110, 0xd0bc, 0x0188, 0x00d6, 0xa0e8, 0xb735, 0x2d6c, - 0x6810, 0xa085, 0x0500, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xb61c, - 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xb735, - 0x2d6c, 0x6810, 0xa085, 0x0500, 0x20a2, 0x6814, 0x20a2, 0x00de, - 0x20a3, 0x0000, 0x2011, 0xb615, 0x2214, 0x22a2, 0x20a3, 0x0889, - 0x20a3, 0x0000, 0x080c, 0x7dcf, 0x22a2, 0x20a3, 0x0000, 0x7a08, - 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, 0x0005, - 0x00d6, 0x0156, 0x0136, 0x0146, 0x7810, 0xa0ec, 0xf000, 0x0168, - 0xa06d, 0x080c, 0x5373, 0x0148, 0x684c, 0xa084, 0x2020, 0xa086, - 0x2020, 0x1118, 0x7820, 0xc0cd, 0x7822, 0x20a1, 0x020b, 0x080c, - 0x7b88, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x7810, - 0xa084, 0xf000, 0x1130, 0x7810, 0xa084, 0x0700, 0x8007, 0x0043, - 0x0010, 0xa006, 0x002b, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005, - 0x7a5a, 0x7aef, 0x7aff, 0x7b31, 0x7b44, 0x7b5f, 0x7b68, 0x7a58, - 0x080c, 0x151a, 0x0016, 0x0036, 0x694c, 0xa18c, 0x0003, 0x0118, - 0xa186, 0x0003, 0x1170, 0x6b78, 0x7820, 0xd0cc, 0x0108, 0xc3e5, - 0x23a2, 0x6868, 0x20a2, 0x6864, 0x20a2, 0x003e, 0x001e, 0x0804, - 0x7b3b, 0xa186, 0x0001, 0x190c, 0x151a, 0x6b78, 0x7820, 0xd0cc, - 0x0108, 0xc3e5, 0x23a2, 0x6868, 0x20a2, 0x6864, 0x20a2, 0x22a2, - 0x6874, 0x20a2, 0x22a2, 0x687c, 0x20a2, 0x2009, 0x0018, 0xa384, - 0x0300, 0x0904, 0x7ae9, 0xd3c4, 0x0110, 0x687c, 0xa108, 0xd3cc, - 0x0110, 0x6874, 0xa108, 0x0156, 0x20a9, 0x000d, 0xad80, 0x0020, - 0x201c, 0x831f, 0x23a2, 0x8000, 0x1f04, 0x7a98, 0x015e, 0x22a2, - 0x22a2, 0x22a2, 0xa184, 0x0003, 0x0904, 0x7ae9, 0x20a1, 0x020b, - 0x20e1, 0x9080, 0x20e1, 0x4000, 0x0006, 0x7818, 0xa080, 0x0028, - 0x2004, 0x2011, 0xb635, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188, - 0x00d6, 0xa0e8, 0xb735, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, - 0x6814, 0x20a2, 0x2069, 0xb61c, 0x2da6, 0x8d68, 0x2da6, 0x00de, - 0x0088, 0x00d6, 0xa0e8, 0xb735, 0x2d6c, 0x6810, 0xa085, 0x0700, - 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb615, - 0x2214, 0x22a2, 0x000e, 0x7b20, 0xd3cc, 0x0118, 0x20a3, 0x0889, - 0x0010, 0x20a3, 0x0898, 0x20a2, 0x080c, 0x7dcf, 0x22a2, 0x20a3, - 0x0000, 0x61c2, 0x003e, 0x001e, 0x080c, 0x7de0, 0x0005, 0x2011, - 0x0008, 0x2001, 0xb60d, 0x2004, 0xd0f4, 0x0110, 0x2011, 0x0028, - 0x7820, 0xd0cc, 0x0108, 0xc2e5, 0x22a2, 0xa016, 0x04d0, 0x2011, - 0x0302, 0x0016, 0x0036, 0x7828, 0x792c, 0xa11d, 0x0108, 0xc2dd, - 0x7b20, 0xd3cc, 0x0108, 0xc2e5, 0x22a2, 0x20a2, 0x21a2, 0x003e, - 0x001e, 0xa016, 0x22a2, 0x20a3, 0x0012, 0x22a2, 0x20a3, 0x0008, - 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x7000, 0x20a3, 0x0500, - 0x22a2, 0x20a3, 0x000a, 0x22a2, 0x22a2, 0x20a3, 0x2500, 0x22a2, - 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0032, 0x080c, 0x7de0, - 0x0005, 0x2011, 0x0028, 0x7820, 0xd0cc, 0x0108, 0xc2e5, 0x22a2, - 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3, - 0x0018, 0x080c, 0x7de0, 0x0005, 0x2011, 0x0100, 0x7820, 0xd0cc, - 0x0108, 0xc2e5, 0x22a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x22a2, - 0x22a2, 0x20a3, 0x0008, 0x22a2, 0x7854, 0xa084, 0x00ff, 0x20a2, - 0x22a2, 0x22a2, 0x60c3, 0x0020, 0x080c, 0x7de0, 0x0005, 0x2011, - 0x0008, 0x7820, 0xd0cc, 0x0108, 0xc2e5, 0x22a2, 0xa016, 0x0888, - 0x0036, 0x7b10, 0xa384, 0xff00, 0x7812, 0xa384, 0x00ff, 0x8001, - 0x1138, 0x7820, 0xd0cc, 0x0108, 0xc2e5, 0x22a2, 0x003e, 0x0808, - 0x0046, 0x2021, 0x0800, 0x0006, 0x7820, 0xd0cc, 0x000e, 0x0108, - 0xc4e5, 0x24a2, 0x004e, 0x22a2, 0x20a2, 0x003e, 0x0804, 0x7b3b, - 0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, - 0x2004, 0x2011, 0xb635, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188, - 0x00d6, 0xa0e8, 0xb735, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, - 0x6814, 0x20a2, 0x2069, 0xb61c, 0x2da6, 0x8d68, 0x2da6, 0x00de, - 0x0088, 0x00d6, 0xa0e8, 0xb735, 0x2d6c, 0x6810, 0xa085, 0x0700, - 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb615, - 0x2214, 0x22a2, 0x7820, 0xd0cc, 0x0118, 0x20a3, 0x0889, 0x0010, - 0x20a3, 0x0898, 0x20a3, 0x0000, 0x080c, 0x7dcf, 0x22a2, 0x20a3, - 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, - 0x002e, 0x0005, 0x00d6, 0x0156, 0x0136, 0x0146, 0x0016, 0x0036, - 0x7810, 0xa084, 0x0700, 0x8007, 0x003b, 0x003e, 0x001e, 0x014e, - 0x013e, 0x015e, 0x00de, 0x0005, 0x7bec, 0x7bec, 0x7bee, 0x7bec, - 0x7bec, 0x7bec, 0x7c10, 0x7bec, 0x080c, 0x151a, 0x7910, 0xa18c, - 0xf8ff, 0xa18d, 0x0600, 0x7912, 0x20a1, 0x020b, 0x2009, 0x0003, - 0x00f9, 0x00d6, 0x2069, 0xb652, 0x6804, 0xd0bc, 0x0130, 0x682c, - 0xa084, 0x00ff, 0x8007, 0x20a2, 0x0010, 0x20a3, 0x3f00, 0x00de, - 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0001, 0x080c, 0x7de0, 0x0005, - 0x20a1, 0x020b, 0x2009, 0x0003, 0x0019, 0x20a3, 0x7f00, 0x0c80, - 0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, - 0x2004, 0x2011, 0xb635, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188, - 0x00d6, 0xa0e8, 0xb735, 0x2d6c, 0x6810, 0xa085, 0x0100, 0x20a2, - 0x6814, 0x20a2, 0x2069, 0xb61c, 0x2da6, 0x8d68, 0x2da6, 0x00de, - 0x0088, 0x00d6, 0xa0e8, 0xb735, 0x2d6c, 0x6810, 0xa085, 0x0100, - 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb615, - 0x2214, 0x22a2, 0x20a3, 0x0888, 0xa18d, 0x0008, 0x21a2, 0x080c, - 0x7dcf, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, - 0x0000, 0x20a3, 0x0000, 0x002e, 0x0005, 0x00e6, 0x00d6, 0x00c6, - 0x0056, 0x0046, 0x0036, 0x2061, 0x0100, 0x2071, 0xb600, 0x7154, - 0x7818, 0x2068, 0x68a0, 0x2028, 0x76d4, 0xd6ac, 0x1130, 0xd0bc, - 0x1120, 0x6910, 0x6a14, 0x7454, 0x0020, 0x6910, 0x6a14, 0x7370, - 0x7474, 0x781c, 0xa0be, 0x0006, 0x0904, 0x7d1a, 0xa0be, 0x000a, - 0x15e8, 0xa185, 0x0200, 0x6062, 0x6266, 0x636a, 0x646e, 0x6073, - 0x2029, 0x6077, 0x0000, 0x688c, 0x8000, 0xa084, 0x00ff, 0x688e, - 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6082, 0x7808, 0x6086, - 0x7810, 0x2070, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c, 0x60c6, - 0x7008, 0x60ca, 0x686c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, - 0x609f, 0x0000, 0x080c, 0x8640, 0x2009, 0x07d0, 0x60c4, 0xa084, - 0xfff0, 0xa005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x6a87, 0x003e, - 0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x70d4, 0xd0ac, - 0x1110, 0xd5bc, 0x0138, 0xa185, 0x0100, 0x6062, 0x6266, 0x636a, - 0x646e, 0x0038, 0xa185, 0x0100, 0x6062, 0x6266, 0x606b, 0x0000, - 0x646e, 0x6073, 0x0809, 0x6077, 0x0008, 0x688c, 0x8000, 0xa084, - 0x00ff, 0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6082, - 0x7808, 0x6086, 0x7810, 0x2070, 0x7014, 0x608a, 0x7010, 0x608e, - 0x700c, 0x60c6, 0x7008, 0x60ca, 0x792c, 0xa108, 0x792e, 0x700c, - 0x7928, 0xa109, 0x792a, 0x686c, 0x60ce, 0x60af, 0x95d5, 0x60d7, - 0x0000, 0xa582, 0x0080, 0x0248, 0x6a00, 0xd2f4, 0x0120, 0x6a14, - 0xa294, 0x00ff, 0x0010, 0x2011, 0x0000, 0x629e, 0x080c, 0x8640, - 0x2009, 0x07d0, 0x60c4, 0xa084, 0xfff0, 0xa005, 0x0110, 0x2009, - 0x1b58, 0x080c, 0x6a87, 0x003e, 0x004e, 0x005e, 0x00ce, 0x00de, - 0x00ee, 0x0005, 0x7810, 0x2070, 0x704c, 0xa084, 0x0003, 0xa086, - 0x0002, 0x0904, 0x7d70, 0x2001, 0xb635, 0x2004, 0xd0ac, 0x1110, - 0xd5bc, 0x0138, 0xa185, 0x0100, 0x6062, 0x6266, 0x636a, 0x646e, - 0x0038, 0xa185, 0x0100, 0x6062, 0x6266, 0x606b, 0x0000, 0x646e, - 0x6073, 0x0880, 0x6077, 0x0008, 0x688c, 0x8000, 0xa084, 0x00ff, - 0x688e, 0x8007, 0x607a, 0x7834, 0x607e, 0x2f00, 0x6086, 0x7808, - 0x6082, 0x7060, 0x608a, 0x705c, 0x608e, 0x7080, 0x60c6, 0x707c, - 0x60ca, 0x707c, 0x792c, 0xa108, 0x792e, 0x7080, 0x7928, 0xa109, - 0x792a, 0x686c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xa582, - 0x0080, 0x0248, 0x6a00, 0xd2f4, 0x0120, 0x6a14, 0xa294, 0x00ff, - 0x0010, 0x2011, 0x0000, 0x629e, 0x080c, 0x863d, 0x0804, 0x7d08, - 0x2001, 0xb635, 0x2004, 0xd0ac, 0x1110, 0xd5bc, 0x0138, 0xa185, - 0x0700, 0x6062, 0x6266, 0x636a, 0x646e, 0x0038, 0xa185, 0x0700, - 0x6062, 0x6266, 0x606b, 0x0000, 0x646e, 0x080c, 0x5373, 0x0180, - 0x00d6, 0x7810, 0xa06d, 0x684c, 0x00de, 0xa084, 0x2020, 0xa086, - 0x2020, 0x1130, 0x7820, 0xc0cd, 0x7822, 0x6073, 0x0889, 0x0010, - 0x6073, 0x0898, 0x6077, 0x0000, 0x688c, 0x8000, 0xa084, 0x00ff, - 0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6086, 0x7808, - 0x6082, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c, 0x60c6, 0x7008, - 0x60ca, 0x686c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xa582, - 0x0080, 0x0248, 0x6a00, 0xd2f4, 0x0120, 0x6a14, 0xa294, 0x00ff, - 0x0010, 0x2011, 0x0000, 0x629e, 0x7820, 0xd0cc, 0x0120, 0x080c, - 0x8640, 0x0804, 0x7d08, 0x080c, 0x863d, 0x0804, 0x7d08, 0x7a18, - 0xa280, 0x0023, 0x2014, 0x8210, 0xa294, 0x00ff, 0x2202, 0x8217, - 0x0005, 0x00d6, 0x2069, 0xb8e1, 0x6843, 0x0001, 0x00de, 0x0005, - 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x0019, 0x080c, - 0x6a79, 0x0005, 0x0006, 0x6014, 0xa084, 0x0004, 0xa085, 0x0009, - 0x6016, 0x000e, 0x0005, 0x0016, 0x00c6, 0x0006, 0x2061, 0x0100, - 0x61a4, 0x60a7, 0x95f5, 0x6014, 0xa084, 0x0004, 0xa085, 0x0008, - 0x6016, 0x000e, 0xe000, 0xe000, 0xe000, 0xe000, 0x61a6, 0x00ce, - 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0016, 0x0026, 0x2061, 0x0100, - 0x2069, 0x0140, 0x080c, 0x5b41, 0x1198, 0x2001, 0xb8fd, 0x2004, - 0xa005, 0x15b8, 0x0066, 0x2031, 0x0001, 0x080c, 0x5bc3, 0x006e, - 0x1118, 0x080c, 0x6a79, 0x0468, 0x00c6, 0x2061, 0xb8e1, 0x00d8, - 0x6904, 0xa194, 0x4000, 0x0550, 0x0831, 0x6803, 0x1000, 0x6803, - 0x0000, 0x00c6, 0x2061, 0xb8e1, 0x6128, 0xa192, 0x00c8, 0x1258, - 0x8108, 0x612a, 0x6124, 0x00ce, 0x81ff, 0x0198, 0x080c, 0x6a79, - 0x080c, 0x7dea, 0x0070, 0x6124, 0xa1e5, 0x0000, 0x0140, 0x080c, - 0xb500, 0x080c, 0x6a82, 0x2009, 0x0014, 0x080c, 0x86d3, 0x00ce, - 0x0000, 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001, 0xb8fd, - 0x2004, 0xa005, 0x1db0, 0x00c6, 0x2061, 0xb8e1, 0x6128, 0xa192, - 0x0003, 0x1e08, 0x8108, 0x612a, 0x00ce, 0x080c, 0x6a79, 0x080c, - 0x4b7b, 0x0c38, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x0026, 0x080c, - 0x6a8f, 0x2071, 0xb8e1, 0x713c, 0x81ff, 0x0590, 0x2061, 0x0100, - 0x2069, 0x0140, 0x080c, 0x5b41, 0x11a8, 0x0036, 0x2019, 0x0002, - 0x080c, 0x806b, 0x003e, 0x713c, 0x2160, 0x080c, 0xb500, 0x2009, - 0x004a, 0x080c, 0x86d3, 0x0066, 0x2031, 0x0001, 0x080c, 0x5bc3, - 0x006e, 0x00b0, 0x6904, 0xa194, 0x4000, 0x01c0, 0x6803, 0x1000, - 0x6803, 0x0000, 0x0036, 0x2019, 0x0001, 0x080c, 0x806b, 0x003e, - 0x713c, 0x2160, 0x080c, 0xb500, 0x2009, 0x004a, 0x080c, 0x86d3, - 0x002e, 0x001e, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0c58, 0x0026, - 0x00e6, 0x2071, 0xb8e1, 0x7048, 0xd084, 0x01c0, 0x713c, 0x81ff, - 0x01a8, 0x2071, 0x0100, 0xa188, 0x0007, 0x2114, 0xa28e, 0x0006, - 0x1138, 0x7014, 0xa084, 0x0184, 0xa085, 0x0012, 0x7016, 0x0030, - 0x7014, 0xa084, 0x0184, 0xa085, 0x0016, 0x7016, 0x00ee, 0x002e, - 0x0005, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056, 0x0046, 0x0006, - 0x0126, 0x2091, 0x8000, 0x6018, 0x2068, 0x6ca0, 0x2071, 0xb8e1, - 0x7018, 0x2068, 0x8dff, 0x0188, 0x68a0, 0xa406, 0x0118, 0x6854, - 0x2068, 0x0cc0, 0x6010, 0x2060, 0x643c, 0x6540, 0x6648, 0x2d60, - 0x080c, 0x518c, 0x0110, 0xa085, 0x0001, 0x012e, 0x000e, 0x004e, - 0x005e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x20a1, 0x020b, - 0x080c, 0x76b3, 0x20a3, 0x1200, 0x20a3, 0x0000, 0x20a3, 0x0000, - 0x781c, 0xa086, 0x0004, 0x1110, 0x6098, 0x0018, 0x2001, 0xb615, - 0x2004, 0x20a2, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x20a9, 0x0010, - 0xa006, 0x20a2, 0x1f04, 0x7f19, 0x20a2, 0x20a2, 0x60c3, 0x002c, - 0x080c, 0x7de0, 0x0005, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, - 0x76b3, 0x20a3, 0x0f00, 0x20a3, 0x0000, 0x7808, 0xd09c, 0x1150, - 0x20a3, 0x0000, 0x20a2, 0x60c3, 0x0008, 0x080c, 0x7de0, 0x014e, - 0x015e, 0x0005, 0x00d6, 0x7818, 0xa06d, 0x090c, 0x151a, 0x6810, - 0xa084, 0x00ff, 0x20a2, 0x6814, 0x00de, 0x0c60, 0x0156, 0x0146, - 0x20a1, 0x020b, 0x080c, 0x774f, 0x20a3, 0x0200, 0x20a3, 0x0000, - 0x20a9, 0x0006, 0x2011, 0xb640, 0x2019, 0xb641, 0x23a6, 0x22a6, - 0xa398, 0x0002, 0xa290, 0x0002, 0x1f04, 0x7f56, 0x20a3, 0x0000, - 0x20a3, 0x0000, 0x60c3, 0x001c, 0x080c, 0x7de0, 0x014e, 0x015e, - 0x0005, 0x0156, 0x0146, 0x0016, 0x0026, 0x20a1, 0x020b, 0x080c, - 0x7728, 0x080c, 0x773e, 0x7810, 0xa080, 0x0000, 0x2004, 0xa080, - 0x0015, 0x2098, 0x7808, 0xa088, 0x0002, 0x21a8, 0x53a6, 0xa080, - 0x0004, 0x8003, 0x60c2, 0x080c, 0x7de0, 0x002e, 0x001e, 0x014e, - 0x015e, 0x0005, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x76b3, - 0x20a3, 0x6200, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, - 0x60c3, 0x0008, 0x080c, 0x7de0, 0x014e, 0x015e, 0x0005, 0x0156, - 0x0146, 0x0016, 0x0026, 0x20a1, 0x020b, 0x080c, 0x76b3, 0x7810, - 0xa080, 0x0000, 0x2004, 0xa080, 0x0017, 0x2098, 0x7808, 0xa088, - 0x0002, 0x21a8, 0x53a6, 0x8003, 0x60c2, 0x080c, 0x7de0, 0x002e, - 0x001e, 0x014e, 0x015e, 0x0005, 0x00e6, 0x00c6, 0x0006, 0x0126, - 0x2091, 0x8000, 0x2071, 0xb8e1, 0x700c, 0x2060, 0x8cff, 0x0178, - 0x080c, 0x9f14, 0x1110, 0x080c, 0x8ca5, 0x600c, 0x0006, 0x080c, - 0xa0db, 0x080c, 0x86a4, 0x080c, 0x81a5, 0x00ce, 0x0c78, 0x700f, - 0x0000, 0x700b, 0x0000, 0x012e, 0x000e, 0x00ce, 0x00ee, 0x0005, - 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0026, 0x0016, - 0x0006, 0x2091, 0x8000, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, - 0xb8e1, 0x7024, 0x2060, 0x8cff, 0x05a0, 0x080c, 0x7df3, 0x68c3, - 0x0000, 0x080c, 0x6a82, 0x2009, 0x0013, 0x080c, 0x86d3, 0x20a9, - 0x01f4, 0x6824, 0xd094, 0x0158, 0x6827, 0x0004, 0x7804, 0xa084, - 0x4000, 0x01a0, 0x7803, 0x1000, 0x7803, 0x0000, 0x0078, 0xd084, - 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04, 0x8001, 0x7804, 0xa084, - 0x1000, 0x0120, 0x7803, 0x0100, 0x7803, 0x0000, 0x6824, 0x000e, - 0x001e, 0x002e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, - 0x0005, 0x2001, 0xb600, 0x2004, 0xa096, 0x0001, 0x0590, 0xa096, - 0x0004, 0x0578, 0x080c, 0x6a82, 0x6814, 0xa084, 0x0001, 0x0110, - 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, 0x4b23, - 0x080c, 0x6a0e, 0x20a9, 0x01f4, 0x6824, 0xd094, 0x0158, 0x6827, - 0x0004, 0x7804, 0xa084, 0x4000, 0x01a0, 0x7803, 0x1000, 0x7803, - 0x0000, 0x0078, 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04, - 0x8044, 0x7804, 0xa084, 0x1000, 0x0120, 0x7803, 0x0100, 0x7803, - 0x0000, 0x000e, 0x001e, 0x002e, 0x00ce, 0x00de, 0x00ee, 0x00fe, - 0x015e, 0x012e, 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, - 0x00c6, 0x0026, 0x0016, 0x0006, 0x2091, 0x8000, 0x2069, 0x0100, - 0x2079, 0x0140, 0x2071, 0xb8e1, 0x703c, 0x2060, 0x8cff, 0x0904, - 0x80f2, 0xa386, 0x0002, 0x1128, 0x6814, 0xa084, 0x0002, 0x0904, - 0x80f2, 0x68af, 0x95f5, 0x6817, 0x0010, 0x2009, 0x00fa, 0x8109, - 0x1df0, 0x68c7, 0x0000, 0x68cb, 0x0008, 0x080c, 0x6a8f, 0x080c, - 0x222f, 0x0046, 0x2009, 0x017f, 0x200b, 0x00a5, 0x2021, 0x0169, - 0x2404, 0xa084, 0x000f, 0xa086, 0x0004, 0x1500, 0x68af, 0x95f5, - 0x68c7, 0x0000, 0x68cb, 0x0008, 0x00e6, 0x00f6, 0x2079, 0x0020, - 0x2071, 0xb94b, 0x6814, 0xa084, 0x0184, 0xa085, 0x0012, 0x6816, - 0x7803, 0x0008, 0x7003, 0x0000, 0x00fe, 0x00ee, 0xa386, 0x0002, - 0x1128, 0x7884, 0xa005, 0x1110, 0x7887, 0x0001, 0x2001, 0xb8b1, - 0x2004, 0x200a, 0x004e, 0xa39d, 0x0000, 0x1120, 0x2009, 0x0049, - 0x080c, 0x86d3, 0x20a9, 0x03e8, 0x6824, 0xd094, 0x0158, 0x6827, - 0x0004, 0x7804, 0xa084, 0x4000, 0x01a0, 0x7803, 0x1000, 0x7803, - 0x0000, 0x0078, 0xd08c, 0x0118, 0x6827, 0x0002, 0x0010, 0x1f04, - 0x80d4, 0x7804, 0xa084, 0x1000, 0x0120, 0x7803, 0x0100, 0x7803, - 0x0000, 0x6824, 0x000e, 0x001e, 0x002e, 0x00ce, 0x00de, 0x00ee, - 0x00fe, 0x015e, 0x012e, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, - 0x2069, 0xb8e1, 0x6a06, 0x012e, 0x00de, 0x0005, 0x00d6, 0x0126, - 0x2091, 0x8000, 0x2069, 0xb8e1, 0x6a32, 0x012e, 0x00de, 0x0005, - 0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0006, 0x0126, 0x2071, 0xb8e1, - 0x7614, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, 0x0538, 0x601c, - 0xa206, 0x1500, 0x7014, 0xac36, 0x1110, 0x660c, 0x7616, 0x7010, - 0xac36, 0x1140, 0x2c00, 0xaf36, 0x0118, 0x2f00, 0x7012, 0x0010, - 0x7013, 0x0000, 0x660c, 0x0066, 0x2c00, 0xaf06, 0x0110, 0x7e0e, - 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0x9ed9, 0x080c, 0x81a5, - 0x00ce, 0x08d8, 0x2c78, 0x600c, 0x2060, 0x08b8, 0x012e, 0x000e, - 0x006e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0156, 0x0146, 0x20a1, - 0x020b, 0x080c, 0x7974, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2, - 0x20a2, 0x20a2, 0x20a3, 0x1000, 0x0804, 0x819d, 0x0156, 0x0146, - 0x20a1, 0x020b, 0x080c, 0x7974, 0x7810, 0x20a2, 0xa006, 0x20a2, - 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x4000, 0x0478, 0x0156, 0x0146, - 0x20a1, 0x020b, 0x080c, 0x7974, 0x7810, 0x20a2, 0xa006, 0x20a2, - 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x2000, 0x00f8, 0x0156, 0x0146, - 0x20a1, 0x020b, 0x080c, 0x7974, 0x7810, 0x20a2, 0xa006, 0x20a2, - 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0400, 0x0078, 0x0156, 0x0146, - 0x20a1, 0x020b, 0x080c, 0x7974, 0x7810, 0x20a2, 0xa006, 0x20a2, - 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0200, 0x0089, 0x60c3, 0x0020, - 0x080c, 0x7de0, 0x014e, 0x015e, 0x0005, 0x00e6, 0x2071, 0xb8e1, - 0x7020, 0xa005, 0x0110, 0x8001, 0x7022, 0x00ee, 0x0005, 0x20a9, - 0x0008, 0x20a2, 0x1f04, 0x81b1, 0x20a2, 0x20a2, 0x0005, 0x00f6, - 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0006, 0x0126, 0x2091, - 0x8000, 0x2071, 0xb8e1, 0x7614, 0x2660, 0x2678, 0x2039, 0x0001, - 0x87ff, 0x0904, 0x824d, 0x8cff, 0x0904, 0x824d, 0x601c, 0xa086, - 0x0006, 0x1904, 0x8248, 0x88ff, 0x0138, 0x2800, 0xac06, 0x1904, - 0x8248, 0x2039, 0x0000, 0x0050, 0x6018, 0xa206, 0x1904, 0x8248, - 0x85ff, 0x0120, 0x6050, 0xa106, 0x1904, 0x8248, 0x7024, 0xac06, - 0x1598, 0x2069, 0x0100, 0x68c0, 0xa005, 0x1160, 0x6824, 0xd084, - 0x0148, 0x6827, 0x0001, 0x080c, 0x6a82, 0x080c, 0x82d4, 0x7027, - 0x0000, 0x0410, 0x080c, 0x6a82, 0x6820, 0xd0b4, 0x0110, 0x68a7, - 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x080c, 0x82d4, 0x7027, - 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0120, - 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, - 0x0110, 0x6827, 0x0001, 0x003e, 0x7014, 0xac36, 0x1110, 0x660c, - 0x7616, 0x7010, 0xac36, 0x1140, 0x2c00, 0xaf36, 0x0118, 0x2f00, - 0x7012, 0x0010, 0x7013, 0x0000, 0x660c, 0x0066, 0x2c00, 0xaf06, - 0x0110, 0x7e0e, 0x0008, 0x2678, 0x89ff, 0x1158, 0x600f, 0x0000, - 0x6010, 0x2068, 0x080c, 0x9d16, 0x0110, 0x080c, 0xb155, 0x080c, - 0x9ed9, 0x080c, 0x81a5, 0x88ff, 0x1190, 0x00ce, 0x0804, 0x81c8, - 0x2c78, 0x600c, 0x2060, 0x0804, 0x81c8, 0xa006, 0x012e, 0x000e, - 0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6017, - 0x0000, 0x00ce, 0xa8c5, 0x0001, 0x0c88, 0x00f6, 0x00e6, 0x00d6, - 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, - 0xb8e1, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0904, 0x82c4, 0x601c, - 0xa086, 0x0006, 0x1904, 0x82bf, 0x87ff, 0x0128, 0x2700, 0xac06, - 0x1904, 0x82bf, 0x0048, 0x6018, 0xa206, 0x1904, 0x82bf, 0x85ff, - 0x0118, 0x6050, 0xa106, 0x15d8, 0x703c, 0xac06, 0x1180, 0x0036, - 0x2019, 0x0001, 0x080c, 0x806b, 0x7033, 0x0000, 0x703f, 0x0000, - 0x7043, 0x0000, 0x7047, 0x0000, 0x704b, 0x0000, 0x003e, 0x7038, - 0xac36, 0x1110, 0x660c, 0x763a, 0x7034, 0xac36, 0x1140, 0x2c00, - 0xaf36, 0x0118, 0x2f00, 0x7036, 0x0010, 0x7037, 0x0000, 0x660c, - 0x0066, 0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, - 0x0000, 0x6010, 0x2068, 0x080c, 0x9d16, 0x0110, 0x080c, 0xb155, - 0x080c, 0x9ed9, 0x87ff, 0x1190, 0x00ce, 0x0804, 0x826c, 0x2c78, - 0x600c, 0x2060, 0x0804, 0x826c, 0xa006, 0x012e, 0x000e, 0x002e, - 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6017, 0x0000, - 0x00ce, 0xa7bd, 0x0001, 0x0c88, 0x00e6, 0x2071, 0xb8e1, 0x2001, - 0xb600, 0x2004, 0xa086, 0x0002, 0x1118, 0x7007, 0x0005, 0x0010, - 0x7007, 0x0000, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0066, - 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0xb8e1, 0x2c10, - 0x7638, 0x2660, 0x2678, 0x8cff, 0x0518, 0x2200, 0xac06, 0x11e0, - 0x7038, 0xac36, 0x1110, 0x660c, 0x763a, 0x7034, 0xac36, 0x1140, - 0x2c00, 0xaf36, 0x0118, 0x2f00, 0x7036, 0x0010, 0x7037, 0x0000, - 0x660c, 0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, - 0x0000, 0xa085, 0x0001, 0x0020, 0x2c78, 0x600c, 0x2060, 0x08d8, - 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x00ee, 0x00fe, 0x0005, - 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0006, 0x0126, 0x2091, - 0x8000, 0x2071, 0xb8e1, 0x760c, 0x2660, 0x2678, 0x8cff, 0x0904, - 0x83aa, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x1904, 0x83a5, - 0x7024, 0xac06, 0x1508, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0904, - 0x8381, 0x080c, 0x7df3, 0x68c3, 0x0000, 0x080c, 0x82d4, 0x7027, - 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0120, - 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, - 0x0110, 0x6827, 0x0001, 0x003e, 0x700c, 0xac36, 0x1110, 0x660c, - 0x760e, 0x7008, 0xac36, 0x1140, 0x2c00, 0xaf36, 0x0118, 0x2f00, - 0x700a, 0x0010, 0x700b, 0x0000, 0x660c, 0x0066, 0x2c00, 0xaf06, - 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0x9f03, - 0x1158, 0x080c, 0x2cf7, 0x080c, 0x9f14, 0x11f0, 0x080c, 0x8ca5, - 0x00d8, 0x080c, 0x82d4, 0x08c0, 0x080c, 0x9f14, 0x1118, 0x080c, - 0x8ca5, 0x0090, 0x6010, 0x2068, 0x080c, 0x9d16, 0x0168, 0x601c, - 0xa086, 0x0003, 0x11f8, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, - 0x080c, 0x547a, 0x080c, 0x9ecd, 0x080c, 0xa0db, 0x080c, 0x9ed9, - 0x080c, 0x81a5, 0x00ce, 0x0804, 0x832e, 0x2c78, 0x600c, 0x2060, - 0x0804, 0x832e, 0x012e, 0x000e, 0x006e, 0x00ce, 0x00de, 0x00ee, - 0x00fe, 0x0005, 0x601c, 0xa086, 0x0006, 0x1d30, 0x080c, 0xb155, - 0x0c18, 0x0036, 0x0156, 0x0136, 0x0146, 0x3908, 0xa006, 0xa190, - 0x0020, 0x221c, 0xa39e, 0x2aec, 0x1118, 0x8210, 0x8000, 0x0cc8, - 0xa005, 0x0138, 0x20a9, 0x0020, 0x2198, 0xa110, 0x22a0, 0x22c8, - 0x53a3, 0x014e, 0x013e, 0x015e, 0x003e, 0x0005, 0x00d6, 0x20a1, - 0x020b, 0x080c, 0x774f, 0x20a3, 0x0200, 0x20a3, 0x0014, 0x60c3, - 0x0014, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x2099, 0xb8b9, 0x20a9, - 0x0004, 0x53a6, 0x20a3, 0x0004, 0x20a3, 0x7878, 0x20a3, 0x0000, - 0x20a3, 0x0000, 0x080c, 0x7de0, 0x00de, 0x0005, 0x20a1, 0x020b, - 0x080c, 0x774f, 0x20a3, 0x0214, 0x20a3, 0x0018, 0x20a3, 0x0800, - 0x7810, 0xa084, 0xff00, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, - 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7810, 0xa084, 0x00ff, 0x20a2, - 0x7828, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0018, - 0x080c, 0x7de0, 0x0005, 0x00d6, 0x0016, 0x2f68, 0x2009, 0x0035, - 0x080c, 0xa1c6, 0x1904, 0x8489, 0x20a1, 0x020b, 0x080c, 0x76b3, - 0x20a3, 0x1300, 0x20a3, 0x0000, 0x7828, 0x2068, 0x681c, 0xa086, - 0x0003, 0x0580, 0x7818, 0xa080, 0x0028, 0x2014, 0x2001, 0xb635, - 0x2004, 0xd0ac, 0x11d0, 0xa286, 0x007e, 0x1128, 0x20a3, 0x00ff, - 0x20a3, 0xfffe, 0x04b8, 0xa286, 0x007f, 0x1128, 0x20a3, 0x00ff, - 0x20a3, 0xfffd, 0x0478, 0xd2bc, 0x0180, 0xa286, 0x0080, 0x1128, - 0x20a3, 0x00ff, 0x20a3, 0xfffc, 0x0428, 0xa2e8, 0xb735, 0x2d6c, - 0x6810, 0x20a2, 0x6814, 0x20a2, 0x00e8, 0x20a3, 0x0000, 0x6098, - 0x20a2, 0x00c0, 0x2001, 0xb635, 0x2004, 0xd0ac, 0x1138, 0x7818, - 0xa080, 0x0028, 0x2004, 0xa082, 0x007e, 0x0240, 0x00d6, 0x2069, - 0xb61c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0020, 0x20a3, 0x0000, - 0x6034, 0x20a2, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x20a3, 0x0000, - 0x20a3, 0x0000, 0x60c3, 0x000c, 0x080c, 0x7de0, 0x001e, 0x00de, - 0x0005, 0x7817, 0x0001, 0x7803, 0x0006, 0x001e, 0x00de, 0x0005, - 0x00d6, 0x0026, 0x7928, 0x2168, 0x691c, 0xa186, 0x0006, 0x01c0, - 0xa186, 0x0003, 0x0904, 0x84ff, 0xa186, 0x0005, 0x0904, 0x84e8, - 0xa186, 0x0004, 0x05b8, 0xa186, 0x0008, 0x0904, 0x84f0, 0x7807, - 0x0037, 0x7813, 0x1700, 0x080c, 0x8567, 0x002e, 0x00de, 0x0005, - 0x080c, 0x8523, 0x2009, 0x4000, 0x6800, 0x0002, 0x84c9, 0x84d4, - 0x84cb, 0x84d4, 0x84d0, 0x84c9, 0x84c9, 0x84d4, 0x84d4, 0x84d4, - 0x84d4, 0x84c9, 0x84c9, 0x84c9, 0x84c9, 0x84c9, 0x84d4, 0x84c9, - 0x84d4, 0x080c, 0x151a, 0x6820, 0xd0e4, 0x0110, 0xd0cc, 0x0110, - 0xa00e, 0x0010, 0x2009, 0x2000, 0x6828, 0x20a2, 0x682c, 0x20a2, - 0x0804, 0x8519, 0x080c, 0x8523, 0x20a3, 0x0000, 0x20a3, 0x0000, - 0x2009, 0x4000, 0x6a00, 0xa286, 0x0002, 0x1108, 0xa00e, 0x0488, - 0x04d1, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x2009, 0x4000, 0x0448, - 0x0491, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x2009, 0x4000, 0xa286, - 0x0005, 0x0118, 0xa286, 0x0002, 0x1108, 0xa00e, 0x00d0, 0x0419, - 0x6810, 0x2068, 0x697c, 0x6810, 0xa112, 0x6980, 0x6814, 0xa103, - 0x20a2, 0x22a2, 0x7928, 0xa180, 0x0000, 0x2004, 0xa08e, 0x0002, - 0x0130, 0xa08e, 0x0004, 0x0118, 0x2009, 0x4000, 0x0010, 0x2009, - 0x0000, 0x21a2, 0x20a3, 0x0000, 0x60c3, 0x0018, 0x080c, 0x7de0, - 0x002e, 0x00de, 0x0005, 0x0036, 0x0046, 0x0056, 0x0066, 0x20a1, - 0x020b, 0x080c, 0x774f, 0xa006, 0x20a3, 0x0200, 0x20a2, 0x7934, - 0x21a2, 0x7938, 0x21a2, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, - 0xb635, 0x2214, 0xd2ac, 0x1118, 0xa092, 0x007e, 0x0268, 0x00d6, - 0x2069, 0xb61c, 0x2d2c, 0x8d68, 0x2d34, 0xa0e8, 0xb735, 0x2d6c, - 0x6b10, 0x6c14, 0x00de, 0x0030, 0x2019, 0x0000, 0x6498, 0x2029, - 0x0000, 0x6634, 0x7828, 0xa080, 0x0007, 0x2004, 0xa086, 0x0003, - 0x1128, 0x25a2, 0x26a2, 0x23a2, 0x24a2, 0x0020, 0x23a2, 0x24a2, - 0x25a2, 0x26a2, 0x006e, 0x005e, 0x004e, 0x003e, 0x0005, 0x20a1, - 0x020b, 0x080c, 0x774f, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, - 0x0009, 0x7810, 0x20a2, 0x60c3, 0x0008, 0x080c, 0x7de0, 0x0005, - 0x20a1, 0x020b, 0x080c, 0x76ab, 0x20a3, 0x1400, 0x20a3, 0x0000, - 0x7834, 0x20a2, 0x7838, 0x20a2, 0x7828, 0x20a2, 0x782c, 0x20a2, - 0x7830, 0xa084, 0x00ff, 0x8007, 0x20a2, 0x20a3, 0x0000, 0x60c3, - 0x0010, 0x080c, 0x7de0, 0x0005, 0x20a1, 0x020b, 0x080c, 0x7747, - 0x20a3, 0x0100, 0x20a3, 0x0000, 0x7828, 0x20a2, 0x7810, 0x20a2, - 0x60c3, 0x0008, 0x080c, 0x7de0, 0x0005, 0x0146, 0x20a1, 0x020b, - 0x0031, 0x60c3, 0x0000, 0x080c, 0x7de0, 0x014e, 0x0005, 0x20e1, - 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, - 0xb635, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188, 0x00d6, 0xa0e8, - 0xb735, 0x2d6c, 0x6810, 0xa085, 0x0300, 0x20a2, 0x6814, 0x20a2, - 0x2069, 0xb61c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0078, 0x00d6, - 0xa0e8, 0xb735, 0x2d6c, 0x6810, 0xa085, 0x0300, 0x20a2, 0x6814, - 0x20a2, 0x00de, 0x20a3, 0x0000, 0x6234, 0x22a2, 0x20a3, 0x0819, - 0x20a3, 0x0000, 0x080c, 0x7dcf, 0x22a2, 0x20a3, 0x0000, 0x2fa2, - 0x7a08, 0x22a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x0005, 0x20a1, - 0x020b, 0x0079, 0x7910, 0x21a2, 0x20a3, 0x0000, 0x60c3, 0x0000, - 0x20e1, 0x9080, 0x60a7, 0x9575, 0x080c, 0x7dea, 0x080c, 0x6a79, - 0x0005, 0x0156, 0x0136, 0x0036, 0x00d6, 0x00e6, 0x20e1, 0x9080, - 0x20e1, 0x4000, 0x7854, 0x2068, 0xadf0, 0x000f, 0x7210, 0xa296, - 0x00c0, 0xa294, 0xfffd, 0x7212, 0x7214, 0xa294, 0x0300, 0x7216, - 0x7100, 0xa194, 0x00ff, 0x7308, 0xa384, 0x00ff, 0xa08d, 0xc200, - 0x7102, 0xa384, 0xff00, 0xa215, 0x720a, 0x7004, 0x720c, 0x700e, - 0x7206, 0x20a9, 0x000a, 0x2e98, 0x53a6, 0x60a3, 0x0035, 0x6a38, - 0xa294, 0x7000, 0xa286, 0x3000, 0x0110, 0x60a3, 0x0037, 0x00ee, - 0x00de, 0x003e, 0x013e, 0x015e, 0x0005, 0x2009, 0x0092, 0x0010, - 0x2009, 0x0096, 0x60ab, 0x0036, 0x6116, 0x0005, 0x2061, 0xbe00, - 0x2a70, 0x7068, 0x704a, 0x704f, 0xbe00, 0x0005, 0x00e6, 0x0126, - 0x2071, 0xb600, 0x2091, 0x8000, 0x7548, 0xa582, 0x0010, 0x0608, - 0x704c, 0x2060, 0x6000, 0xa086, 0x0000, 0x0148, 0xace0, 0x0018, - 0x705c, 0xac02, 0x1208, 0x0cb0, 0x2061, 0xbe00, 0x0c98, 0x6003, - 0x0008, 0x8529, 0x754a, 0xaca8, 0x0018, 0x705c, 0xa502, 0x1230, - 0x754e, 0xa085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x704f, 0xbe00, - 0x0cc0, 0xa006, 0x0cc0, 0x00e6, 0x2071, 0xb600, 0x7548, 0xa582, - 0x0010, 0x0600, 0x704c, 0x2060, 0x6000, 0xa086, 0x0000, 0x0148, - 0xace0, 0x0018, 0x705c, 0xac02, 0x1208, 0x0cb0, 0x2061, 0xbe00, - 0x0c98, 0x6003, 0x0008, 0x8529, 0x754a, 0xaca8, 0x0018, 0x705c, - 0xa502, 0x1228, 0x754e, 0xa085, 0x0001, 0x00ee, 0x0005, 0x704f, - 0xbe00, 0x0cc8, 0xa006, 0x0cc8, 0xac82, 0xbe00, 0x0a0c, 0x151a, - 0x2001, 0xb617, 0x2004, 0xac02, 0x1a0c, 0x151a, 0xa006, 0x6006, - 0x600a, 0x600e, 0x6012, 0x6016, 0x601a, 0x601f, 0x0000, 0x6003, - 0x0000, 0x6052, 0x6056, 0x6022, 0x6026, 0x602a, 0x602e, 0x6032, - 0x6036, 0x603a, 0x603e, 0x2061, 0xb600, 0x6048, 0x8000, 0x604a, - 0xa086, 0x0001, 0x0108, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, - 0x71e5, 0x012e, 0x0cc0, 0x601c, 0xa084, 0x000f, 0x0002, 0x86e7, - 0x86f6, 0x8711, 0x872c, 0xa20e, 0xa229, 0xa244, 0x86e7, 0x86f6, - 0x86e7, 0x8747, 0x86e7, 0x86e7, 0x86e7, 0x86e7, 0x86e7, 0xa186, - 0x0013, 0x1128, 0x080c, 0x7102, 0x080c, 0x71e5, 0x0005, 0xa18e, - 0x0047, 0x1118, 0xa016, 0x080c, 0x1863, 0x0005, 0x0066, 0x6000, - 0xa0b2, 0x0010, 0x1a0c, 0x151a, 0x0013, 0x006e, 0x0005, 0x870f, - 0x8b27, 0x8cdf, 0x870f, 0x8d54, 0x8805, 0x870f, 0x870f, 0x8ab9, - 0x917b, 0x870f, 0x870f, 0x870f, 0x870f, 0x870f, 0x870f, 0x080c, - 0x151a, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x151a, 0x0013, - 0x006e, 0x0005, 0x872a, 0x97de, 0x872a, 0x872a, 0x872a, 0x872a, - 0x872a, 0x872a, 0x9789, 0x994a, 0x872a, 0x980b, 0x9882, 0x980b, - 0x9882, 0x872a, 0x080c, 0x151a, 0x0066, 0x6000, 0xa0b2, 0x0010, - 0x1a0c, 0x151a, 0x0013, 0x006e, 0x0005, 0x8745, 0x91bc, 0x9286, - 0x93c4, 0x954d, 0x8745, 0x8745, 0x8745, 0x9196, 0x9739, 0x973c, - 0x8745, 0x8745, 0x8745, 0x8745, 0x9766, 0x080c, 0x151a, 0x0066, - 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x151a, 0x0013, 0x006e, 0x0005, - 0x8760, 0x8760, 0x8760, 0x878e, 0x87db, 0x8760, 0x8760, 0x8760, - 0x8762, 0x8760, 0x8760, 0x8760, 0x8760, 0x8760, 0x8760, 0x8760, - 0x080c, 0x151a, 0xa186, 0x0003, 0x190c, 0x151a, 0x00d6, 0x6003, - 0x0003, 0x6106, 0x6010, 0x2068, 0x684f, 0x0040, 0x687c, 0x680a, - 0x6880, 0x680e, 0x6813, 0x0000, 0x6817, 0x0000, 0x6854, 0xa092, - 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x8013, 0x8213, 0xa210, - 0x6216, 0x00de, 0x2c10, 0x080c, 0x1fc5, 0x080c, 0x6d62, 0x0126, - 0x2091, 0x8000, 0x080c, 0x72a2, 0x012e, 0x0005, 0xa182, 0x0047, - 0x0002, 0x879a, 0x879a, 0x879c, 0x87b5, 0x879a, 0x879a, 0x879a, - 0x879a, 0x87c7, 0x080c, 0x151a, 0x00d6, 0x0016, 0x080c, 0x7198, - 0x080c, 0x72a2, 0x6003, 0x0004, 0x6110, 0x2168, 0x684f, 0x0020, - 0x685c, 0x685a, 0x6874, 0x687e, 0x6878, 0x6882, 0x6897, 0x0000, - 0x689b, 0x0000, 0x001e, 0x00de, 0x0005, 0x080c, 0x7198, 0x00d6, - 0x6110, 0x2168, 0x080c, 0x9d16, 0x0120, 0x684b, 0x0006, 0x080c, - 0x547a, 0x00de, 0x080c, 0x86a4, 0x080c, 0x72a2, 0x0005, 0x080c, - 0x7198, 0x080c, 0x2cd1, 0x00d6, 0x6110, 0x2168, 0x080c, 0x9d16, - 0x0120, 0x684b, 0x0029, 0x080c, 0x547a, 0x00de, 0x080c, 0x86a4, - 0x080c, 0x72a2, 0x0005, 0xa182, 0x0047, 0x0002, 0x87e9, 0x87f8, - 0x87e7, 0x87e7, 0x87e7, 0x87e7, 0x87e7, 0x87e7, 0x87e7, 0x080c, - 0x151a, 0x00d6, 0x6010, 0x2068, 0x684c, 0xc0f4, 0x684e, 0x00de, - 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1863, 0x0005, - 0x00d6, 0x6110, 0x2168, 0x684b, 0x0000, 0x6853, 0x0000, 0x080c, - 0x547a, 0x00de, 0x080c, 0x86a4, 0x0005, 0xa1b6, 0x0015, 0x1118, - 0x080c, 0x86a4, 0x0030, 0xa1b6, 0x0016, 0x190c, 0x151a, 0x080c, - 0x86a4, 0x0005, 0x20a9, 0x000e, 0x2e98, 0x6010, 0x20a0, 0x53a3, - 0x20a9, 0x0006, 0x3310, 0x3420, 0x9398, 0x94a0, 0x3318, 0x3428, - 0x222e, 0x2326, 0xa290, 0x0002, 0xa5a8, 0x0002, 0xa398, 0x0002, - 0xa4a0, 0x0002, 0x1f04, 0x8820, 0x00e6, 0x080c, 0x9d16, 0x0130, - 0x6010, 0x2070, 0x7007, 0x0000, 0x7037, 0x0103, 0x00ee, 0x080c, - 0x86a4, 0x0005, 0x00d6, 0x0036, 0x7330, 0xa386, 0x0200, 0x1130, - 0x6018, 0x2068, 0x6813, 0x00ff, 0x6817, 0xfffd, 0x6010, 0xa005, - 0x0130, 0x2068, 0x6807, 0x0000, 0x6837, 0x0103, 0x6b32, 0x080c, - 0x86a4, 0x003e, 0x00de, 0x0005, 0x0016, 0x20a9, 0x002a, 0xae80, - 0x000c, 0x2098, 0x6010, 0xa080, 0x0002, 0x20a0, 0x53a3, 0x20a9, - 0x002a, 0x6010, 0xa080, 0x0001, 0x2004, 0xa080, 0x0002, 0x20a0, - 0x53a3, 0x00e6, 0x6010, 0x2004, 0x2070, 0x7037, 0x0103, 0x00ee, - 0x080c, 0x86a4, 0x001e, 0x0005, 0x0016, 0x2009, 0x0000, 0x7030, - 0xa086, 0x0100, 0x0140, 0x7038, 0xa084, 0x00ff, 0x800c, 0x703c, - 0xa084, 0x00ff, 0x8004, 0xa080, 0x0004, 0xa108, 0x21a8, 0xae80, - 0x000c, 0x2098, 0x6010, 0xa080, 0x0002, 0x20a0, 0x080c, 0x4bf1, - 0x00e6, 0x080c, 0x9d16, 0x0140, 0x6010, 0x2070, 0x7007, 0x0000, - 0x7034, 0x70b2, 0x7037, 0x0103, 0x00ee, 0x080c, 0x86a4, 0x001e, - 0x0005, 0x00e6, 0x00d6, 0x603f, 0x0000, 0x2c68, 0x0016, 0x2009, - 0x0035, 0x080c, 0xa1c6, 0x001e, 0x1168, 0x0026, 0x6228, 0x2268, - 0x002e, 0x2071, 0xbc8c, 0x6b1c, 0xa386, 0x0003, 0x0130, 0xa386, - 0x0006, 0x0128, 0x080c, 0x86a4, 0x0020, 0x0031, 0x0010, 0x080c, - 0x8982, 0x00de, 0x00ee, 0x0005, 0x00f6, 0x6810, 0x2078, 0xa186, - 0x0015, 0x0904, 0x8969, 0xa18e, 0x0016, 0x1904, 0x8980, 0x700c, - 0xa08c, 0xff00, 0xa186, 0x1700, 0x0120, 0xa186, 0x0300, 0x1904, - 0x8948, 0x8fff, 0x1138, 0x6800, 0xa086, 0x000f, 0x0904, 0x892c, - 0x0804, 0x897e, 0x6808, 0xa086, 0xffff, 0x1904, 0x896b, 0x784c, - 0xa084, 0x0060, 0xa086, 0x0020, 0x1150, 0x797c, 0x7810, 0xa106, - 0x1904, 0x896b, 0x7980, 0x7814, 0xa106, 0x1904, 0x896b, 0x080c, - 0x9ecd, 0x6858, 0x7852, 0x784c, 0xc0dc, 0xc0f4, 0xc0d4, 0x784e, - 0x0026, 0xa00e, 0x6a14, 0x2001, 0x000a, 0x080c, 0x6bb2, 0x7854, - 0xa20a, 0x0208, 0x8011, 0x7a56, 0x82ff, 0x002e, 0x1138, 0x00c6, - 0x2d60, 0x080c, 0x9ac5, 0x00ce, 0x0804, 0x897e, 0x00c6, 0x00d6, - 0x2f68, 0x6838, 0xd0fc, 0x1118, 0x080c, 0x4cd7, 0x0010, 0x080c, - 0x4ebb, 0x00de, 0x00ce, 0x1904, 0x896b, 0x00c6, 0x2d60, 0x080c, - 0x86a4, 0x00ce, 0x0804, 0x897e, 0x00c6, 0x080c, 0x9f92, 0x0190, - 0x6013, 0x0000, 0x6818, 0x601a, 0x080c, 0xa0e3, 0x601f, 0x0003, - 0x6904, 0x00c6, 0x2d60, 0x080c, 0x86a4, 0x00ce, 0x080c, 0x86d3, - 0x00ce, 0x04e0, 0x2001, 0xb8b8, 0x2004, 0x683e, 0x00ce, 0x04b0, - 0x7008, 0xa086, 0x000b, 0x11a0, 0x6018, 0x200c, 0xc1bc, 0x2102, - 0x00c6, 0x2d60, 0x784b, 0x0003, 0x6007, 0x0085, 0x6003, 0x000b, - 0x601f, 0x0002, 0x080c, 0x6cff, 0x080c, 0x71e5, 0x00ce, 0x00f0, - 0x700c, 0xa086, 0x2a00, 0x1138, 0x2001, 0xb8b8, 0x2004, 0x683e, - 0x00a8, 0x0481, 0x00a8, 0x8fff, 0x090c, 0x151a, 0x00c6, 0x00d6, - 0x2d60, 0x2f68, 0x6837, 0x0103, 0x684b, 0x0003, 0x080c, 0x99b9, - 0x080c, 0x9ecd, 0x080c, 0x9ed9, 0x00de, 0x00ce, 0x080c, 0x86a4, - 0x00fe, 0x0005, 0xa186, 0x0015, 0x1128, 0x2001, 0xb8b8, 0x2004, - 0x683e, 0x0068, 0xa18e, 0x0016, 0x1160, 0x00c6, 0x2d00, 0x2060, - 0x080c, 0xb3f6, 0x080c, 0x6b61, 0x080c, 0x86a4, 0x00ce, 0x080c, - 0x86a4, 0x0005, 0x0026, 0x0036, 0x0046, 0x7228, 0x7c80, 0x7b7c, - 0xd2f4, 0x0130, 0x2001, 0xb8b8, 0x2004, 0x683e, 0x0804, 0x89fc, - 0x00c6, 0x2d60, 0x080c, 0x99d9, 0x00ce, 0x6804, 0xa086, 0x0050, - 0x1168, 0x00c6, 0x2d00, 0x2060, 0x6003, 0x0001, 0x6007, 0x0050, - 0x080c, 0x6cff, 0x080c, 0x71e5, 0x00ce, 0x04f0, 0x6800, 0xa086, - 0x000f, 0x01c8, 0x8fff, 0x090c, 0x151a, 0x6820, 0xd0dc, 0x1198, - 0x6800, 0xa086, 0x0004, 0x1198, 0x784c, 0xd0ac, 0x0180, 0x784c, - 0xc0dc, 0xc0f4, 0x784e, 0x7850, 0xc0f4, 0xc0fc, 0x7852, 0x2001, - 0x0001, 0x682e, 0x00e0, 0x2001, 0x0007, 0x682e, 0x00c0, 0x784c, - 0xd0b4, 0x1130, 0xd0ac, 0x0db8, 0x784c, 0xd0f4, 0x1da0, 0x0c38, - 0xd2ec, 0x1d88, 0x7024, 0xa306, 0x1118, 0x7020, 0xa406, 0x0d58, - 0x7020, 0x6836, 0x7024, 0x683a, 0x2001, 0x0005, 0x682e, 0x080c, - 0xa01f, 0x080c, 0x71e5, 0x0010, 0x080c, 0x86a4, 0x004e, 0x003e, - 0x002e, 0x0005, 0x00e6, 0x00d6, 0x0026, 0x6034, 0x2068, 0x6a1c, - 0xa286, 0x0007, 0x0904, 0x8a60, 0xa286, 0x0002, 0x0904, 0x8a60, - 0xa286, 0x0000, 0x0904, 0x8a60, 0x6808, 0x6338, 0xa306, 0x1904, - 0x8a60, 0x2071, 0xbc8c, 0xa186, 0x0015, 0x05e0, 0xa18e, 0x0016, - 0x1190, 0x6030, 0xa084, 0x00ff, 0xa086, 0x0001, 0x1160, 0x700c, - 0xa086, 0x2a00, 0x1140, 0x6034, 0xa080, 0x0008, 0x200c, 0xc1dd, - 0xc1f5, 0x2102, 0x0438, 0x00c6, 0x6034, 0x2060, 0x6104, 0xa186, - 0x004b, 0x01a0, 0xa186, 0x004c, 0x0188, 0xa186, 0x004d, 0x0170, - 0xa186, 0x004e, 0x0158, 0xa186, 0x0052, 0x0140, 0x6010, 0x2068, - 0x080c, 0x9d16, 0x090c, 0x151a, 0x684b, 0x0003, 0x6007, 0x0085, - 0x6003, 0x000b, 0x601f, 0x0002, 0x080c, 0x6cff, 0x080c, 0x71e5, - 0x00ce, 0x0030, 0x6034, 0x2070, 0x2001, 0xb8b8, 0x2004, 0x703e, - 0x080c, 0x86a4, 0x002e, 0x00de, 0x00ee, 0x0005, 0x00d6, 0x20a9, - 0x000e, 0x2e98, 0x6010, 0x20a0, 0x53a3, 0xa1b6, 0x0015, 0x1558, - 0x6018, 0x2068, 0x0156, 0x0036, 0x0026, 0xae90, 0x000c, 0xa290, - 0x0004, 0x20a9, 0x0004, 0xad98, 0x000a, 0x080c, 0x9166, 0x002e, - 0x003e, 0x015e, 0x11d8, 0x0156, 0x0036, 0x0026, 0xae90, 0x000c, - 0xa290, 0x0008, 0x20a9, 0x0004, 0xad98, 0x0006, 0x080c, 0x9166, - 0x002e, 0x003e, 0x015e, 0x1150, 0x7038, 0x680a, 0x703c, 0x680e, - 0x6800, 0xc08d, 0x6802, 0x00de, 0x0804, 0x882c, 0x080c, 0x2cd1, - 0x00c6, 0x080c, 0x864e, 0x2f00, 0x601a, 0x6013, 0x0000, 0x601f, - 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007, 0x080c, - 0x4f6f, 0x080c, 0x4f9c, 0x080c, 0x6d45, 0x080c, 0x71e5, 0x00ce, - 0x0c10, 0x2100, 0xa1b2, 0x0080, 0x1a0c, 0x151a, 0xa1b2, 0x0040, - 0x1a04, 0x8b1d, 0x0002, 0x8b11, 0x8b05, 0x8b11, 0x8b11, 0x8b11, - 0x8b11, 0x8b03, 0x8b03, 0x8b03, 0x8b03, 0x8b03, 0x8b03, 0x8b03, - 0x8b03, 0x8b03, 0x8b03, 0x8b03, 0x8b03, 0x8b03, 0x8b03, 0x8b03, - 0x8b03, 0x8b03, 0x8b03, 0x8b03, 0x8b03, 0x8b03, 0x8b03, 0x8b03, - 0x8b03, 0x8b03, 0x8b11, 0x8b03, 0x8b11, 0x8b11, 0x8b03, 0x8b03, - 0x8b03, 0x8b03, 0x8b03, 0x8b11, 0x8b03, 0x8b03, 0x8b03, 0x8b03, - 0x8b03, 0x8b03, 0x8b03, 0x8b03, 0x8b03, 0x8b11, 0x8b11, 0x8b03, - 0x8b03, 0x8b03, 0x8b03, 0x8b03, 0x8b03, 0x8b03, 0x8b03, 0x8b03, - 0x8b11, 0x8b03, 0x8b03, 0x080c, 0x151a, 0x6003, 0x0001, 0x6106, - 0x080c, 0x6d45, 0x0126, 0x2091, 0x8000, 0x080c, 0x71e5, 0x012e, - 0x0005, 0x6003, 0x0001, 0x6106, 0x080c, 0x6d45, 0x0126, 0x2091, - 0x8000, 0x080c, 0x71e5, 0x012e, 0x0005, 0x2600, 0x0002, 0x8b11, - 0x8b11, 0x8b25, 0x8b11, 0x8b11, 0x8b25, 0x080c, 0x151a, 0x6004, - 0xa0b2, 0x0080, 0x1a0c, 0x151a, 0xa1b6, 0x0013, 0x0904, 0x8bd7, - 0xa1b6, 0x0027, 0x1904, 0x8b9d, 0x080c, 0x7102, 0x6004, 0x080c, - 0x9f03, 0x0190, 0x080c, 0x9f14, 0x0904, 0x8b97, 0xa08e, 0x0021, - 0x0904, 0x8b9a, 0xa08e, 0x0022, 0x0904, 0x8b97, 0xa08e, 0x003d, - 0x0904, 0x8b9a, 0x0804, 0x8b90, 0x080c, 0x2cf7, 0x2001, 0x0007, - 0x080c, 0x4f6f, 0x6018, 0xa080, 0x0028, 0x200c, 0x080c, 0x8ca5, - 0xa186, 0x007e, 0x1148, 0x2001, 0xb635, 0x2014, 0xc285, 0x080c, - 0x5b41, 0x1108, 0xc2ad, 0x2202, 0x0016, 0x0026, 0x0036, 0x2110, - 0x0026, 0x2019, 0x0028, 0x080c, 0x8320, 0x002e, 0x080c, 0xb449, - 0x003e, 0x002e, 0x001e, 0x0016, 0x0026, 0x0036, 0x2110, 0x2019, - 0x0028, 0x080c, 0x6e67, 0x0076, 0x2039, 0x0000, 0x080c, 0x6d74, - 0x00c6, 0x6018, 0xa065, 0x0110, 0x080c, 0x521c, 0x00ce, 0x2c08, - 0x080c, 0xaf3e, 0x007e, 0x003e, 0x002e, 0x001e, 0x080c, 0x4fde, - 0x080c, 0xa0db, 0x080c, 0x86a4, 0x080c, 0x71e5, 0x0005, 0x080c, - 0x8ca5, 0x0cb0, 0x080c, 0x8cd3, 0x0c98, 0xa186, 0x0014, 0x1db0, - 0x080c, 0x7102, 0x080c, 0x2cd1, 0x080c, 0x9f03, 0x1188, 0x080c, - 0x2cf7, 0x6018, 0xa080, 0x0028, 0x200c, 0x080c, 0x8ca5, 0xa186, - 0x007e, 0x1128, 0x2001, 0xb635, 0x200c, 0xc185, 0x2102, 0x08c0, - 0x080c, 0x9f14, 0x1118, 0x080c, 0x8ca5, 0x0890, 0x6004, 0xa08e, - 0x0032, 0x1158, 0x00e6, 0x00f6, 0x2071, 0xb682, 0x2079, 0x0000, - 0x080c, 0x3004, 0x00fe, 0x00ee, 0x0818, 0x6004, 0xa08e, 0x0021, - 0x0d50, 0xa08e, 0x0022, 0x090c, 0x8ca5, 0x0804, 0x8b90, 0xa0b2, - 0x0040, 0x1a04, 0x8c9a, 0x2008, 0x0002, 0x8c1f, 0x8c20, 0x8c23, - 0x8c26, 0x8c29, 0x8c2c, 0x8c1d, 0x8c1d, 0x8c1d, 0x8c1d, 0x8c1d, - 0x8c1d, 0x8c1d, 0x8c1d, 0x8c1d, 0x8c1d, 0x8c1d, 0x8c1d, 0x8c1d, - 0x8c1d, 0x8c1d, 0x8c1d, 0x8c1d, 0x8c1d, 0x8c1d, 0x8c1d, 0x8c1d, - 0x8c1d, 0x8c1d, 0x8c1d, 0x8c2f, 0x8c3e, 0x8c1d, 0x8c40, 0x8c3e, - 0x8c1d, 0x8c1d, 0x8c1d, 0x8c1d, 0x8c1d, 0x8c3e, 0x8c3e, 0x8c1d, - 0x8c1d, 0x8c1d, 0x8c1d, 0x8c1d, 0x8c1d, 0x8c1d, 0x8c1d, 0x8c7a, - 0x8c3e, 0x8c1d, 0x8c3a, 0x8c1d, 0x8c1d, 0x8c1d, 0x8c3b, 0x8c1d, - 0x8c1d, 0x8c1d, 0x8c3e, 0x8c71, 0x8c1d, 0x080c, 0x151a, 0x00f0, - 0x2001, 0x000b, 0x0460, 0x2001, 0x0003, 0x0448, 0x2001, 0x0005, - 0x0430, 0x2001, 0x0001, 0x0418, 0x2001, 0x0009, 0x0400, 0x080c, - 0x7102, 0x6003, 0x0005, 0x2001, 0xb8b8, 0x2004, 0x603e, 0x080c, - 0x71e5, 0x00a0, 0x0018, 0x0010, 0x080c, 0x4f6f, 0x0804, 0x8c8b, - 0x080c, 0x7102, 0x2001, 0xb8b6, 0x2004, 0x6016, 0x2001, 0xb8b8, - 0x2004, 0x603e, 0x6003, 0x0004, 0x080c, 0x71e5, 0x0005, 0x080c, - 0x4f6f, 0x080c, 0x7102, 0x6003, 0x0002, 0x2001, 0xb8b8, 0x2004, - 0x603e, 0x0036, 0x2019, 0xb65d, 0x2304, 0xa084, 0xff00, 0x1120, - 0x2001, 0xb8b6, 0x201c, 0x0040, 0x8007, 0xa09a, 0x0004, 0x0ec0, - 0x8003, 0x801b, 0x831b, 0xa318, 0x6316, 0x003e, 0x080c, 0x71e5, - 0x08e8, 0x080c, 0x7102, 0x080c, 0xa0db, 0x080c, 0x86a4, 0x080c, - 0x71e5, 0x08a0, 0x00e6, 0x00f6, 0x2071, 0xb682, 0x2079, 0x0000, - 0x080c, 0x3004, 0x00fe, 0x00ee, 0x080c, 0x7102, 0x080c, 0x86a4, - 0x080c, 0x71e5, 0x0818, 0x080c, 0x7102, 0x2001, 0xb8b8, 0x2004, - 0x603e, 0x6003, 0x0002, 0x2001, 0xb8b6, 0x2004, 0x6016, 0x080c, - 0x71e5, 0x0005, 0x2600, 0x2008, 0x0002, 0x8ca3, 0x8ca3, 0x8ca3, - 0x8c8b, 0x8c8b, 0x8ca3, 0x080c, 0x151a, 0x00e6, 0x0026, 0x0016, - 0x080c, 0x9d16, 0x0508, 0x6010, 0x2070, 0x7034, 0xa086, 0x0139, - 0x1148, 0x2001, 0x0030, 0x2009, 0x0000, 0x2011, 0x4005, 0x080c, - 0xa192, 0x0090, 0x7038, 0xd0fc, 0x0178, 0x7007, 0x0000, 0x0016, - 0x6004, 0xa08e, 0x0021, 0x0160, 0xa08e, 0x003d, 0x0148, 0x001e, - 0x7037, 0x0103, 0x7033, 0x0100, 0x001e, 0x002e, 0x00ee, 0x0005, - 0x001e, 0x0009, 0x0cc8, 0x00e6, 0xacf0, 0x0004, 0x2e74, 0x7000, - 0x2070, 0x7037, 0x0103, 0x7023, 0x8001, 0x00ee, 0x0005, 0x00d6, - 0x6618, 0x2668, 0x6804, 0xa084, 0x00ff, 0x00de, 0xa0b2, 0x000c, - 0x1a0c, 0x151a, 0x6604, 0xa6b6, 0x0043, 0x1120, 0x080c, 0xa14e, - 0x0804, 0x8d44, 0x6604, 0xa6b6, 0x0033, 0x1120, 0x080c, 0xa0fe, - 0x0804, 0x8d44, 0x6604, 0xa6b6, 0x0028, 0x1120, 0x080c, 0x9f44, - 0x0804, 0x8d44, 0x6604, 0xa6b6, 0x0029, 0x1118, 0x080c, 0x9f5b, - 0x04d8, 0x6604, 0xa6b6, 0x001f, 0x1118, 0x080c, 0x8812, 0x04a0, - 0x6604, 0xa6b6, 0x0000, 0x1118, 0x080c, 0x8a66, 0x0468, 0x6604, - 0xa6b6, 0x0022, 0x1118, 0x080c, 0x883a, 0x0430, 0x6604, 0xa6b6, - 0x0035, 0x1118, 0x080c, 0x88a1, 0x00f8, 0x6604, 0xa6b6, 0x0039, - 0x1118, 0x080c, 0x8a02, 0x00c0, 0x6604, 0xa6b6, 0x003d, 0x1118, - 0x080c, 0x8854, 0x0088, 0x6604, 0xa6b6, 0x0044, 0x1118, 0x080c, - 0x8874, 0x0050, 0xa1b6, 0x0015, 0x1110, 0x0053, 0x0028, 0xa1b6, - 0x0016, 0x1118, 0x0804, 0x8f08, 0x0005, 0x080c, 0x86ef, 0x0ce0, - 0x8d6b, 0x8d6e, 0x8d6b, 0x8db0, 0x8d6b, 0x8e95, 0x8f16, 0x8d6b, - 0x8d6b, 0x8ee4, 0x8d6b, 0x8ef8, 0xa1b6, 0x0048, 0x0140, 0x20e1, - 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1863, 0x0005, 0x00e6, - 0xacf0, 0x0004, 0x2e74, 0x7000, 0x2070, 0x7037, 0x0103, 0x00ee, - 0x080c, 0x86a4, 0x0005, 0xe000, 0xe000, 0x0005, 0x00e6, 0x2071, - 0xb600, 0x7084, 0xa086, 0x0074, 0x1530, 0x080c, 0xaf15, 0x11b0, - 0x00d6, 0x6018, 0x2068, 0x7030, 0xd08c, 0x0128, 0x6800, 0xd0bc, - 0x0110, 0xc0c5, 0x6802, 0x00d9, 0x00de, 0x2001, 0x0006, 0x080c, - 0x4f6f, 0x080c, 0x2cf7, 0x080c, 0x86a4, 0x0078, 0x2001, 0x000a, - 0x080c, 0x4f6f, 0x080c, 0x2cf7, 0x6003, 0x0001, 0x6007, 0x0001, - 0x080c, 0x6d45, 0x0010, 0x080c, 0x8e82, 0x00ee, 0x0005, 0x6800, - 0xd084, 0x0168, 0x2001, 0x0000, 0x080c, 0x4f5d, 0x2069, 0xb652, - 0x6804, 0xd0a4, 0x0120, 0x2001, 0x0006, 0x080c, 0x4f9c, 0x0005, - 0x00d6, 0x2011, 0xb621, 0x2204, 0xa086, 0x0074, 0x1904, 0x8e7f, - 0x6018, 0x2068, 0x6aa0, 0xa286, 0x007e, 0x1120, 0x080c, 0x902e, - 0x0804, 0x8e1e, 0x080c, 0x9024, 0x6018, 0x2068, 0xa080, 0x0028, - 0x2014, 0xa286, 0x0080, 0x11c0, 0x6813, 0x00ff, 0x6817, 0xfffc, - 0x6010, 0xa005, 0x0138, 0x2068, 0x6807, 0x0000, 0x6837, 0x0103, - 0x6833, 0x0200, 0x2001, 0x0006, 0x080c, 0x4f6f, 0x080c, 0x2cf7, - 0x080c, 0x86a4, 0x0804, 0x8e80, 0x00e6, 0x2071, 0xb635, 0x2e04, - 0xd09c, 0x0188, 0x2071, 0xbc80, 0x7108, 0x720c, 0xa18c, 0x00ff, - 0x1118, 0xa284, 0xff00, 0x0138, 0x6018, 0x2070, 0x70a0, 0xd0bc, - 0x1110, 0x7112, 0x7216, 0x00ee, 0x6010, 0xa005, 0x0198, 0x2068, - 0x6838, 0xd0f4, 0x0178, 0x6834, 0xa084, 0x00ff, 0xa086, 0x0039, - 0x1958, 0x2001, 0x0000, 0x2009, 0x0000, 0x2011, 0x4000, 0x080c, - 0xa192, 0x0840, 0x2001, 0x0004, 0x080c, 0x4f6f, 0x6003, 0x0001, - 0x6007, 0x0003, 0x080c, 0x6d45, 0x0804, 0x8e80, 0x685c, 0xd0e4, - 0x01d8, 0x080c, 0xa08e, 0x080c, 0x5b41, 0x0118, 0xd0dc, 0x1904, - 0x8dda, 0x2011, 0xb635, 0x2204, 0xc0ad, 0x2012, 0x2001, 0xb88f, - 0x2004, 0x00f6, 0x2079, 0x0100, 0x78e3, 0x0000, 0x080c, 0x28a7, - 0x78e2, 0x00fe, 0x0804, 0x8dda, 0x080c, 0xa0c4, 0x2011, 0xb635, - 0x2204, 0xc0a5, 0x2012, 0x0006, 0x080c, 0xb037, 0x000e, 0x1904, - 0x8dda, 0xc0b5, 0x2012, 0x2001, 0x0006, 0x080c, 0x4f6f, 0x2001, - 0x0000, 0x080c, 0x4f5d, 0x00c6, 0x2009, 0x00ef, 0x00f6, 0x2079, - 0x0100, 0x79ea, 0x7932, 0x7936, 0x00fe, 0x080c, 0x287c, 0x00f6, - 0x2079, 0xb600, 0x7976, 0x2100, 0x2009, 0x0000, 0x080c, 0x2852, - 0x7952, 0x00fe, 0x8108, 0x080c, 0x4fbf, 0x2c00, 0x00ce, 0x1904, - 0x8dda, 0x601a, 0x2001, 0x0002, 0x080c, 0x4f6f, 0x601f, 0x0001, - 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x6d45, 0x0008, 0x0011, - 0x00de, 0x0005, 0x2001, 0x0007, 0x080c, 0x4f6f, 0x2001, 0xb600, - 0x2004, 0xa086, 0x0003, 0x1120, 0x2001, 0x0007, 0x080c, 0x4f9c, - 0x080c, 0x2cf7, 0x080c, 0x86a4, 0x0005, 0x00e6, 0x0026, 0x0016, - 0x2071, 0xb600, 0x7084, 0xa086, 0x0014, 0x15f0, 0x7000, 0xa086, - 0x0003, 0x1128, 0x6010, 0xa005, 0x1110, 0x080c, 0x3f85, 0x00d6, - 0x6018, 0x2068, 0x080c, 0x50bd, 0x080c, 0x8d9f, 0x00de, 0x080c, - 0x90dd, 0x1550, 0x00d6, 0x6018, 0x2068, 0x6890, 0x00de, 0xa005, - 0x0518, 0x2001, 0x0006, 0x080c, 0x4f6f, 0x00e6, 0x6010, 0xa075, - 0x01a8, 0x7034, 0xa084, 0x00ff, 0xa086, 0x0039, 0x1148, 0x2001, - 0x0000, 0x2009, 0x0000, 0x2011, 0x4000, 0x080c, 0xa192, 0x0030, - 0x7007, 0x0000, 0x7037, 0x0103, 0x7033, 0x0200, 0x00ee, 0x080c, - 0x2cf7, 0x080c, 0x86a4, 0x0020, 0x080c, 0x8ca5, 0x080c, 0x8e82, - 0x001e, 0x002e, 0x00ee, 0x0005, 0x2011, 0xb621, 0x2204, 0xa086, - 0x0014, 0x1158, 0x2001, 0x0002, 0x080c, 0x4f6f, 0x6003, 0x0001, - 0x6007, 0x0001, 0x080c, 0x6d45, 0x0010, 0x080c, 0x8e82, 0x0005, - 0x2011, 0xb621, 0x2204, 0xa086, 0x0004, 0x1138, 0x2001, 0x0007, - 0x080c, 0x4f6f, 0x080c, 0x86a4, 0x0010, 0x080c, 0x8e82, 0x0005, - 0x000b, 0x0005, 0x8d6b, 0x8f21, 0x8d6b, 0x8f55, 0x8d6b, 0x8fe0, - 0x8f16, 0x8d6b, 0x8d6b, 0x8ff3, 0x8d6b, 0x9003, 0x6604, 0xa686, - 0x0003, 0x0904, 0x8e95, 0xa6b6, 0x001e, 0x1110, 0x080c, 0x86a4, - 0x0005, 0x00d6, 0x00c6, 0x080c, 0x9013, 0x1178, 0x2001, 0x0000, - 0x080c, 0x4f5d, 0x2001, 0x0002, 0x080c, 0x4f6f, 0x6003, 0x0001, - 0x6007, 0x0002, 0x080c, 0x6d45, 0x00e8, 0x2009, 0xbc8e, 0x2104, - 0xa086, 0x0009, 0x1160, 0x6018, 0x2068, 0x6840, 0xa084, 0x00ff, - 0xa005, 0x0170, 0x8001, 0x6842, 0x6017, 0x000a, 0x0058, 0x2009, - 0xbc8f, 0x2104, 0xa084, 0xff00, 0xa086, 0x1900, 0x1108, 0x08d0, - 0x080c, 0x8e82, 0x00ce, 0x00de, 0x0005, 0x0026, 0x2011, 0x0000, - 0x080c, 0x9021, 0x00d6, 0x2069, 0xb89e, 0x2d04, 0xa005, 0x0168, - 0x6018, 0x2068, 0x68a0, 0xa086, 0x007e, 0x1138, 0x2069, 0xb61d, - 0x2d04, 0x8000, 0x206a, 0x00de, 0x0010, 0x00de, 0x0078, 0x2001, - 0x0000, 0x080c, 0x4f5d, 0x2001, 0x0002, 0x080c, 0x4f6f, 0x6003, - 0x0001, 0x6007, 0x0002, 0x080c, 0x6d45, 0x0480, 0x00d6, 0x6010, - 0x2068, 0x080c, 0x9d16, 0x00de, 0x0108, 0x6a34, 0x080c, 0x8ca5, - 0x2009, 0xbc8e, 0x2134, 0xa6b4, 0x00ff, 0xa686, 0x0005, 0x0500, - 0xa686, 0x000b, 0x01c8, 0x2009, 0xbc8f, 0x2104, 0xa084, 0xff00, - 0x1118, 0xa686, 0x0009, 0x01a0, 0xa086, 0x1900, 0x1168, 0xa686, - 0x0009, 0x0170, 0x2001, 0x0004, 0x080c, 0x4f6f, 0x2001, 0x0028, - 0x6016, 0x6007, 0x004b, 0x0010, 0x080c, 0x8e82, 0x002e, 0x0005, - 0x00d6, 0xa286, 0x0139, 0x0160, 0x6010, 0x2068, 0x080c, 0x9d16, - 0x0148, 0x6834, 0xa086, 0x0139, 0x0118, 0x6838, 0xd0fc, 0x0110, - 0x00de, 0x0c50, 0x6018, 0x2068, 0x6840, 0xa084, 0x00ff, 0xa005, - 0x0140, 0x8001, 0x6842, 0x6017, 0x000a, 0x6007, 0x0016, 0x00de, - 0x08e8, 0x68a0, 0xa086, 0x007e, 0x1138, 0x00e6, 0x2071, 0xb600, - 0x080c, 0x4c28, 0x00ee, 0x0010, 0x080c, 0x2cd1, 0x00de, 0x0860, - 0x080c, 0x9021, 0x1158, 0x2001, 0x0004, 0x080c, 0x4f6f, 0x6003, - 0x0001, 0x6007, 0x0003, 0x080c, 0x6d45, 0x0020, 0x080c, 0x8ca5, - 0x080c, 0x8e82, 0x0005, 0x0469, 0x1158, 0x2001, 0x0008, 0x080c, - 0x4f6f, 0x6003, 0x0001, 0x6007, 0x0005, 0x080c, 0x6d45, 0x0010, - 0x080c, 0x8e82, 0x0005, 0x00e9, 0x1158, 0x2001, 0x000a, 0x080c, - 0x4f6f, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x6d45, 0x0010, - 0x080c, 0x8e82, 0x0005, 0x2009, 0xbc8e, 0x2104, 0xa086, 0x0003, - 0x1138, 0x2009, 0xbc8f, 0x2104, 0xa084, 0xff00, 0xa086, 0x2a00, - 0x0005, 0xa085, 0x0001, 0x0005, 0x00c6, 0x0016, 0xac88, 0x0006, - 0x2164, 0x080c, 0x502a, 0x001e, 0x00ce, 0x0005, 0x00f6, 0x00e6, - 0x00d6, 0x0036, 0x0016, 0x6018, 0x2068, 0x2071, 0xb635, 0x2e04, - 0xa085, 0x0003, 0x2072, 0x080c, 0x90b2, 0x0560, 0x2009, 0xb635, - 0x2104, 0xc0cd, 0x200a, 0x2001, 0xb653, 0x2004, 0xd0a4, 0x0158, - 0xa006, 0x2020, 0x2009, 0x002a, 0x080c, 0xb1a4, 0x2001, 0xb60c, - 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0001, 0x080c, - 0x2ca4, 0x2071, 0xb600, 0x080c, 0x2aed, 0x00c6, 0x0156, 0x20a9, - 0x0081, 0x2009, 0x007f, 0x080c, 0x2dcc, 0x8108, 0x1f04, 0x9063, - 0x015e, 0x00ce, 0x080c, 0x9024, 0x6813, 0x00ff, 0x6817, 0xfffe, - 0x2071, 0xbc80, 0x2079, 0x0100, 0x2e04, 0xa084, 0x00ff, 0x2069, - 0xb61c, 0x206a, 0x78e6, 0x0006, 0x8e70, 0x2e04, 0x2069, 0xb61d, - 0x206a, 0x78ea, 0x7832, 0x7836, 0x2010, 0xa084, 0xff00, 0x001e, - 0xa105, 0x2009, 0xb628, 0x200a, 0x2200, 0xa084, 0x00ff, 0x2008, - 0x080c, 0x287c, 0x080c, 0x5b41, 0x0170, 0x2069, 0xbc8e, 0x2071, - 0xb8b2, 0x6810, 0x2072, 0x6814, 0x7006, 0x6818, 0x700a, 0x681c, - 0x700e, 0x080c, 0xa08e, 0x0040, 0x2001, 0x0006, 0x080c, 0x4f6f, - 0x080c, 0x2cf7, 0x080c, 0x86a4, 0x001e, 0x003e, 0x00de, 0x00ee, - 0x00fe, 0x0005, 0x0026, 0x0036, 0x00e6, 0x0156, 0x2019, 0xb628, - 0x231c, 0x83ff, 0x01e8, 0x2071, 0xbc80, 0x2e14, 0xa294, 0x00ff, - 0x7004, 0xa084, 0xff00, 0xa205, 0xa306, 0x1190, 0x2011, 0xbc96, - 0xad98, 0x000a, 0x20a9, 0x0004, 0x080c, 0x9166, 0x1148, 0x2011, - 0xbc9a, 0xad98, 0x0006, 0x20a9, 0x0004, 0x080c, 0x9166, 0x1100, - 0x015e, 0x00ee, 0x003e, 0x002e, 0x0005, 0x00e6, 0x2071, 0xbc8c, - 0x7004, 0xa086, 0x0014, 0x11a8, 0x7008, 0xa086, 0x0800, 0x1188, - 0x700c, 0xd0ec, 0x0160, 0xa084, 0x0f00, 0xa086, 0x0100, 0x1138, - 0x7024, 0xd0a4, 0x1110, 0xd0ac, 0x0110, 0xa006, 0x0010, 0xa085, - 0x0001, 0x00ee, 0x0005, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0056, - 0x0046, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2029, 0xb8ea, - 0x252c, 0x2021, 0xb8f0, 0x2424, 0x2061, 0xbe00, 0x2071, 0xb600, - 0x7248, 0x7068, 0xa202, 0x16f0, 0x080c, 0xb1cc, 0x05a0, 0x671c, - 0xa786, 0x0001, 0x0580, 0xa786, 0x0007, 0x0568, 0x2500, 0xac06, - 0x0550, 0x2400, 0xac06, 0x0538, 0x00c6, 0x6000, 0xa086, 0x0004, - 0x1110, 0x080c, 0x1952, 0xa786, 0x0008, 0x1148, 0x080c, 0x9f14, - 0x1130, 0x00ce, 0x080c, 0x8ca5, 0x080c, 0x9ed9, 0x00a0, 0x6010, - 0x2068, 0x080c, 0x9d16, 0x0160, 0xa786, 0x0003, 0x11e8, 0x6837, - 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0x547a, 0x080c, 0x9ecd, - 0x080c, 0x9ed9, 0x00ce, 0xace0, 0x0018, 0x705c, 0xac02, 0x1210, - 0x0804, 0x9110, 0x012e, 0x000e, 0x002e, 0x004e, 0x005e, 0x007e, - 0x00ce, 0x00de, 0x00ee, 0x0005, 0xa786, 0x0006, 0x1118, 0x080c, - 0xb155, 0x0c30, 0xa786, 0x000a, 0x09e0, 0x08c8, 0x220c, 0x2304, - 0xa106, 0x1130, 0x8210, 0x8318, 0x1f04, 0x9166, 0xa006, 0x0005, - 0x2304, 0xa102, 0x0218, 0x2001, 0x0001, 0x0010, 0x2001, 0x0000, - 0xa18d, 0x0001, 0x0005, 0x6004, 0xa08a, 0x0080, 0x1a0c, 0x151a, - 0x080c, 0x9f03, 0x0120, 0x080c, 0x9f14, 0x0168, 0x0028, 0x080c, - 0x2cf7, 0x080c, 0x9f14, 0x0138, 0x080c, 0x7102, 0x080c, 0x86a4, - 0x080c, 0x71e5, 0x0005, 0x080c, 0x8ca5, 0x0cb0, 0xa182, 0x0040, - 0x0002, 0x91ac, 0x91ac, 0x91ac, 0x91ac, 0x91ac, 0x91ac, 0x91ac, - 0x91ac, 0x91ac, 0x91ac, 0x91ac, 0x91ae, 0x91ae, 0x91ae, 0x91ae, - 0x91ac, 0x91ac, 0x91ac, 0x91ae, 0x080c, 0x151a, 0x600b, 0xffff, - 0x6003, 0x0001, 0x6106, 0x080c, 0x6cff, 0x0126, 0x2091, 0x8000, - 0x080c, 0x71e5, 0x012e, 0x0005, 0xa186, 0x0013, 0x1128, 0x6004, - 0xa082, 0x0040, 0x0804, 0x9248, 0xa186, 0x0027, 0x11e8, 0x080c, - 0x7102, 0x080c, 0x2cd1, 0x00d6, 0x6110, 0x2168, 0x080c, 0x9d16, - 0x0168, 0x6837, 0x0103, 0x684b, 0x0029, 0x6847, 0x0000, 0x694c, - 0xc1c5, 0x694e, 0x080c, 0x547a, 0x080c, 0x9ecd, 0x00de, 0x080c, - 0x86a4, 0x080c, 0x71e5, 0x0005, 0xa186, 0x0014, 0x1120, 0x6004, - 0xa082, 0x0040, 0x0428, 0xa186, 0x0046, 0x0138, 0xa186, 0x0045, - 0x0120, 0xa186, 0x0047, 0x190c, 0x151a, 0x2001, 0x0109, 0x2004, - 0xd084, 0x0198, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, - 0x080c, 0x6be6, 0x002e, 0x001e, 0x000e, 0x012e, 0xe000, 0x6000, - 0xa086, 0x0002, 0x1110, 0x0804, 0x9286, 0x080c, 0x86ef, 0x0005, - 0x0002, 0x9226, 0x9224, 0x9224, 0x9224, 0x9224, 0x9224, 0x9224, - 0x9224, 0x9224, 0x9224, 0x9224, 0x9241, 0x9241, 0x9241, 0x9241, - 0x9224, 0x9241, 0x9224, 0x9241, 0x080c, 0x151a, 0x080c, 0x7102, - 0x00d6, 0x6110, 0x2168, 0x080c, 0x9d16, 0x0168, 0x6837, 0x0103, - 0x684b, 0x0006, 0x6847, 0x0000, 0x6850, 0xc0ec, 0x6852, 0x080c, - 0x547a, 0x080c, 0x9ecd, 0x00de, 0x080c, 0x86a4, 0x080c, 0x71e5, - 0x0005, 0x080c, 0x7102, 0x080c, 0x86a4, 0x080c, 0x71e5, 0x0005, - 0x0002, 0x925e, 0x925c, 0x925c, 0x925c, 0x925c, 0x925c, 0x925c, - 0x925c, 0x925c, 0x925c, 0x925c, 0x9270, 0x9270, 0x9270, 0x9270, - 0x925c, 0x927f, 0x925c, 0x9270, 0x080c, 0x151a, 0x080c, 0x7102, - 0x2001, 0xb8b8, 0x2004, 0x603e, 0x6003, 0x0002, 0x080c, 0x71e5, - 0x6010, 0xa088, 0x0013, 0x2104, 0xa085, 0x0400, 0x200a, 0x0005, - 0x080c, 0x7102, 0x2001, 0xb8b6, 0x2004, 0x6016, 0x2001, 0xb8b8, - 0x2004, 0x603e, 0x6003, 0x000f, 0x080c, 0x71e5, 0x0005, 0x080c, - 0x7102, 0x080c, 0x86a4, 0x080c, 0x71e5, 0x0005, 0xa182, 0x0040, - 0x0002, 0x929c, 0x929c, 0x929c, 0x929c, 0x929c, 0x929e, 0x9386, - 0x93b5, 0x929c, 0x929c, 0x929c, 0x929c, 0x929c, 0x929c, 0x929c, - 0x929c, 0x929c, 0x929c, 0x929c, 0x080c, 0x151a, 0x00e6, 0x00d6, - 0x603f, 0x0000, 0x2071, 0xbc80, 0x7124, 0x610a, 0x2071, 0xbc8c, - 0x6110, 0x2168, 0x7614, 0xa6b4, 0x0fff, 0x86ff, 0x0904, 0x934c, - 0xa68c, 0x0c00, 0x0518, 0x00f6, 0x2c78, 0x080c, 0x5377, 0x00fe, - 0x01c8, 0x684c, 0xd0ac, 0x01b0, 0x6020, 0xd0dc, 0x1198, 0x6850, - 0xd0bc, 0x1180, 0x7318, 0x6814, 0xa306, 0x1904, 0x935f, 0x731c, - 0x6810, 0xa31e, 0x0138, 0xd6d4, 0x0904, 0x935f, 0x6b14, 0xa305, - 0x1904, 0x935f, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff, - 0xa186, 0x0002, 0x0518, 0xa186, 0x0028, 0x1128, 0x080c, 0x9ef2, - 0x684b, 0x001c, 0x00e8, 0xd6dc, 0x01a0, 0x684b, 0x0015, 0x684c, - 0xd0ac, 0x0170, 0x6914, 0x6a10, 0x2100, 0xa205, 0x0148, 0x7018, - 0xa106, 0x1118, 0x701c, 0xa206, 0x0118, 0x6962, 0x6a5e, 0xc6dc, - 0x0038, 0xd6d4, 0x0118, 0x684b, 0x0007, 0x0010, 0x684b, 0x0000, - 0x6837, 0x0103, 0x6e46, 0xa01e, 0xd6c4, 0x01f0, 0xa686, 0x0100, - 0x1140, 0x2001, 0xbc99, 0x2004, 0xa005, 0x1118, 0xc6c4, 0x0804, - 0x92ad, 0x7328, 0x732c, 0x6b56, 0x83ff, 0x0170, 0xa38a, 0x0009, - 0x0210, 0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0xbc98, 0xad90, - 0x0019, 0x080c, 0x99c9, 0x003e, 0xd6cc, 0x0904, 0x9375, 0x7124, - 0x695a, 0x81ff, 0x0904, 0x9375, 0xa192, 0x0021, 0x1260, 0x2071, - 0xbc98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x080c, 0x99c9, - 0x080c, 0xa1f3, 0x04d0, 0x6838, 0xd0fc, 0x0120, 0x2009, 0x0020, - 0x695a, 0x0c68, 0x00f6, 0x2d78, 0x080c, 0x996e, 0x00fe, 0x080c, - 0xa1f3, 0x080c, 0x99b9, 0x0458, 0x00f6, 0x2c78, 0x080c, 0x5377, - 0x00fe, 0x0190, 0x684c, 0xd0ac, 0x0178, 0x6020, 0xd0dc, 0x1160, - 0x6850, 0xd0bc, 0x1148, 0x6810, 0x6914, 0xa105, 0x0128, 0x080c, - 0x9ff1, 0x00de, 0x00ee, 0x0408, 0x684b, 0x0000, 0x6837, 0x0103, - 0x6e46, 0x080c, 0x9523, 0x1148, 0x684c, 0xd0ac, 0x0130, 0x6810, - 0x6914, 0xa115, 0x0110, 0x080c, 0x953f, 0x080c, 0x547a, 0x6218, - 0x2268, 0x6a3c, 0x82ff, 0x0110, 0x8211, 0x6a3e, 0x080c, 0x9fbf, - 0x00de, 0x00ee, 0x1110, 0x080c, 0x86a4, 0x0005, 0x00f6, 0x6003, - 0x0003, 0x2079, 0xbc8c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6010, - 0x2078, 0x784c, 0xd0ac, 0x0138, 0x6003, 0x0002, 0x00fe, 0x0005, - 0x2130, 0x2228, 0x0058, 0x2400, 0x797c, 0xa10a, 0x2300, 0x7a80, - 0xa213, 0x2600, 0xa102, 0x2500, 0xa203, 0x0e90, 0x7c12, 0x7b16, - 0x7e0a, 0x7d0e, 0x00fe, 0x603f, 0x0000, 0x2c10, 0x080c, 0x1fc5, - 0x080c, 0x6d62, 0x080c, 0x72a2, 0x0005, 0x2001, 0xb8b8, 0x2004, - 0x603e, 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005, 0x3d18, 0x3e20, - 0x2c10, 0x080c, 0x1863, 0x0005, 0xa182, 0x0040, 0x0002, 0x93da, - 0x93da, 0x93da, 0x93da, 0x93da, 0x93dc, 0x946f, 0x93da, 0x93da, - 0x9485, 0x94eb, 0x93da, 0x93da, 0x93da, 0x93da, 0x9509, 0x93da, - 0x93da, 0x93da, 0x080c, 0x151a, 0x0076, 0x00f6, 0x00e6, 0x00d6, - 0x2071, 0xbc8c, 0x6110, 0x2178, 0x7614, 0xa6b4, 0x0fff, 0x7e46, - 0x7f4c, 0xc7e5, 0x7f4e, 0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0110, - 0x8211, 0x6a3e, 0x86ff, 0x0904, 0x946a, 0xa694, 0xff00, 0xa284, - 0x0c00, 0x0120, 0x7018, 0x7862, 0x701c, 0x785e, 0xa284, 0x0300, - 0x0904, 0x946a, 0x080c, 0x15fd, 0x090c, 0x151a, 0x2d00, 0x784a, - 0x7f4c, 0xc7cd, 0x7f4e, 0x6837, 0x0103, 0x7838, 0x683a, 0x783c, - 0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c, 0x0c00, 0x0120, 0x7318, - 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff, 0xa186, 0x0002, 0x0180, - 0xa186, 0x0028, 0x1118, 0x684b, 0x001c, 0x0060, 0xd6dc, 0x0118, - 0x684b, 0x0015, 0x0038, 0xd6d4, 0x0118, 0x684b, 0x0007, 0x0010, - 0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852, 0x7854, 0x6856, 0xa01e, - 0xd6c4, 0x0198, 0x7328, 0x732c, 0x6b56, 0x83ff, 0x0170, 0xa38a, - 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0xbc98, - 0xad90, 0x0019, 0x080c, 0x99c9, 0x003e, 0xd6cc, 0x01d8, 0x7124, - 0x695a, 0x81ff, 0x01b8, 0xa192, 0x0021, 0x1250, 0x2071, 0xbc98, - 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x080c, 0x99c9, 0x0050, - 0x7838, 0xd0fc, 0x0120, 0x2009, 0x0020, 0x695a, 0x0c78, 0x2d78, - 0x080c, 0x996e, 0x00de, 0x00ee, 0x00fe, 0x007e, 0x0005, 0x00f6, - 0x6003, 0x0003, 0x2079, 0xbc8c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, - 0x6010, 0x2078, 0x7c12, 0x7b16, 0x7e0a, 0x7d0e, 0x00fe, 0x2c10, - 0x080c, 0x1fc5, 0x080c, 0x7dd9, 0x0005, 0x00d6, 0x00f6, 0x2c78, - 0x080c, 0x5377, 0x00fe, 0x0120, 0x2001, 0xb8b8, 0x2004, 0x603e, - 0x6003, 0x0002, 0x080c, 0x7198, 0x080c, 0x72a2, 0x6110, 0x2168, - 0x694c, 0xd1e4, 0x0904, 0x94e9, 0xd1cc, 0x0540, 0x6948, 0x6838, - 0xd0fc, 0x01e8, 0x0016, 0x684c, 0x0006, 0x6850, 0x0006, 0xad90, - 0x000d, 0xa198, 0x000d, 0x2009, 0x0020, 0x0156, 0x21a8, 0x2304, - 0x2012, 0x8318, 0x8210, 0x1f04, 0x94af, 0x015e, 0x000e, 0x6852, - 0x000e, 0x684e, 0x001e, 0x2168, 0x080c, 0x1624, 0x0428, 0x0016, - 0x080c, 0x1624, 0x00de, 0x080c, 0x99b9, 0x00f0, 0x6837, 0x0103, - 0x6944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x0180, 0xa086, 0x0028, - 0x1118, 0x684b, 0x001c, 0x0070, 0xd1dc, 0x0118, 0x684b, 0x0015, - 0x0048, 0xd1d4, 0x0118, 0x684b, 0x0007, 0x0020, 0x684b, 0x0000, - 0x080c, 0x9523, 0x080c, 0x547a, 0x080c, 0x9fbf, 0x1110, 0x080c, - 0x86a4, 0x00de, 0x0005, 0x2019, 0x0001, 0x080c, 0x806b, 0x6003, - 0x0002, 0x00d6, 0x6010, 0x2068, 0x080c, 0x9d16, 0x0140, 0x6808, - 0x612c, 0xa10a, 0x612e, 0x680c, 0x6128, 0xa10b, 0x612a, 0x00de, - 0x2001, 0xb8b8, 0x2004, 0x603e, 0x080c, 0x7198, 0x080c, 0x72a2, - 0x0005, 0x080c, 0x7198, 0x080c, 0x2cd1, 0x00d6, 0x6110, 0x2168, - 0x080c, 0x9d16, 0x0150, 0x6837, 0x0103, 0x684b, 0x0029, 0x6847, - 0x0000, 0x080c, 0x547a, 0x080c, 0x9ecd, 0x00de, 0x080c, 0x86a4, - 0x080c, 0x72a2, 0x0005, 0x684c, 0xd0b4, 0x01c0, 0x602c, 0x697c, - 0xa112, 0x6028, 0x6980, 0xa10b, 0x2100, 0xa205, 0x0168, 0x684b, - 0x0015, 0xd1fc, 0x0138, 0x684b, 0x0007, 0x8212, 0x8210, 0x810a, - 0xa189, 0x0000, 0x6962, 0x6a5e, 0xa085, 0x0001, 0x0005, 0x684b, - 0x0015, 0xd1fc, 0x0138, 0x684b, 0x0007, 0x8002, 0x8000, 0x810a, - 0xa189, 0x0000, 0x6962, 0x685e, 0x0005, 0xa182, 0x0040, 0x0002, - 0x9563, 0x9563, 0x9563, 0x9563, 0x9563, 0x9565, 0x9563, 0x9620, - 0x962c, 0x9563, 0x9563, 0x9563, 0x9563, 0x9563, 0x9563, 0x9563, - 0x9563, 0x9563, 0x9563, 0x080c, 0x151a, 0x0076, 0x00f6, 0x00e6, - 0x00d6, 0x2071, 0xbc8c, 0x6110, 0x2178, 0x7614, 0xa6b4, 0x0fff, - 0x00f6, 0x2c78, 0x080c, 0x5377, 0x00fe, 0x0150, 0xa684, 0x00ff, - 0x1138, 0x6020, 0xd0f4, 0x0120, 0x080c, 0x9ff1, 0x0804, 0x961b, - 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, 0x6218, 0x2268, 0x6a3c, 0x82ff, - 0x0110, 0x8211, 0x6a3e, 0x86ff, 0x0904, 0x9611, 0xa694, 0xff00, - 0xa284, 0x0c00, 0x0120, 0x7018, 0x7862, 0x701c, 0x785e, 0xa284, - 0x0300, 0x0904, 0x960f, 0xa686, 0x0100, 0x1140, 0x2001, 0xbc99, - 0x2004, 0xa005, 0x1118, 0xc6c4, 0x7e46, 0x0c28, 0x080c, 0x15fd, - 0x090c, 0x151a, 0x2d00, 0x784a, 0x7f4c, 0xa7bd, 0x0200, 0x7f4e, - 0x6837, 0x0103, 0x7838, 0x683a, 0x783c, 0x683e, 0x7840, 0x6842, - 0x6e46, 0xa68c, 0x0c00, 0x0120, 0x7318, 0x6b62, 0x731c, 0x6b5e, - 0xa68c, 0x00ff, 0xa186, 0x0002, 0x0180, 0xa186, 0x0028, 0x1118, - 0x684b, 0x001c, 0x0060, 0xd6dc, 0x0118, 0x684b, 0x0015, 0x0038, - 0xd6d4, 0x0118, 0x684b, 0x0007, 0x0010, 0x684b, 0x0000, 0x6f4e, - 0x7850, 0x6852, 0x7854, 0x6856, 0xa01e, 0xd6c4, 0x0198, 0x7328, - 0x732c, 0x6b56, 0x83ff, 0x0170, 0xa38a, 0x0009, 0x0210, 0x2019, - 0x0008, 0x0036, 0x2308, 0x2019, 0xbc98, 0xad90, 0x0019, 0x080c, - 0x99c9, 0x003e, 0xd6cc, 0x01d8, 0x7124, 0x695a, 0x81ff, 0x01b8, - 0xa192, 0x0021, 0x1250, 0x2071, 0xbc98, 0x831c, 0x2300, 0xae18, - 0xad90, 0x001d, 0x080c, 0x99c9, 0x0050, 0x7838, 0xd0fc, 0x0120, - 0x2009, 0x0020, 0x695a, 0x0c78, 0x2d78, 0x080c, 0x996e, 0xd6dc, - 0x1110, 0xa006, 0x0030, 0x2001, 0x0001, 0x2071, 0xbc8c, 0x7218, - 0x731c, 0x080c, 0x18b6, 0x00de, 0x00ee, 0x00fe, 0x007e, 0x0005, - 0x2001, 0xb8b8, 0x2004, 0x603e, 0x20e1, 0x0005, 0x3d18, 0x3e20, - 0x2c10, 0x080c, 0x1863, 0x0005, 0x2001, 0xb8b8, 0x2004, 0x603e, - 0x00d6, 0x6003, 0x0002, 0x6110, 0x2168, 0x694c, 0xd1e4, 0x0904, - 0x9737, 0x603f, 0x0000, 0x00f6, 0x2c78, 0x080c, 0x5377, 0x00fe, - 0x0560, 0x6814, 0x6910, 0xa115, 0x0540, 0x6a60, 0xa206, 0x1118, - 0x685c, 0xa106, 0x0510, 0x684c, 0xc0e4, 0x684e, 0x6847, 0x0000, - 0x6863, 0x0000, 0x685f, 0x0000, 0x6020, 0xd0f4, 0x1158, 0x697c, - 0x6810, 0xa102, 0x603a, 0x6980, 0x6814, 0xa103, 0x6036, 0x6020, - 0xc0f5, 0x6022, 0x00d6, 0x6018, 0x2068, 0x683c, 0x8000, 0x683e, - 0x00de, 0x080c, 0x9ff1, 0x0804, 0x9737, 0x694c, 0xd1cc, 0x0904, - 0x9707, 0x6948, 0x6838, 0xd0fc, 0x0904, 0x96ca, 0x0016, 0x684c, - 0x0006, 0x6850, 0x0006, 0x00f6, 0x2178, 0x7944, 0xa184, 0x00ff, - 0xa0b6, 0x0002, 0x01e0, 0xa086, 0x0028, 0x1128, 0x684b, 0x001c, - 0x784b, 0x001c, 0x00e8, 0xd1dc, 0x0158, 0x684b, 0x0015, 0x784b, - 0x0015, 0x080c, 0xa17b, 0x0118, 0x7944, 0xc1dc, 0x7946, 0x0080, - 0xd1d4, 0x0128, 0x684b, 0x0007, 0x784b, 0x0007, 0x0048, 0x684c, - 0xd0ac, 0x0130, 0x6810, 0x6914, 0xa115, 0x0110, 0x080c, 0x953f, - 0x6848, 0x784a, 0x6860, 0x7862, 0x685c, 0x785e, 0xad90, 0x000d, - 0xaf98, 0x000d, 0x2009, 0x0020, 0x0156, 0x21a8, 0x2304, 0x2012, - 0x8318, 0x8210, 0x1f04, 0x96b6, 0x015e, 0x00fe, 0x000e, 0x6852, - 0x000e, 0x684e, 0x080c, 0xa1f3, 0x001e, 0x2168, 0x080c, 0x1624, - 0x0804, 0x9732, 0x0016, 0x00f6, 0x2178, 0x7944, 0xa184, 0x00ff, - 0xa0b6, 0x0002, 0x01e0, 0xa086, 0x0028, 0x1128, 0x684b, 0x001c, - 0x784b, 0x001c, 0x00e8, 0xd1dc, 0x0158, 0x684b, 0x0015, 0x784b, - 0x0015, 0x080c, 0xa17b, 0x0118, 0x7944, 0xc1dc, 0x7946, 0x0080, - 0xd1d4, 0x0128, 0x684b, 0x0007, 0x784b, 0x0007, 0x0048, 0x684c, - 0xd0ac, 0x0130, 0x6810, 0x6914, 0xa115, 0x0110, 0x080c, 0x953f, - 0x6860, 0x7862, 0x685c, 0x785e, 0x684c, 0x784e, 0x00fe, 0x080c, - 0x1624, 0x00de, 0x080c, 0xa1f3, 0x080c, 0x99b9, 0x0458, 0x6837, - 0x0103, 0x6944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x01b0, 0xa086, - 0x0028, 0x1118, 0x684b, 0x001c, 0x00d8, 0xd1dc, 0x0148, 0x684b, - 0x0015, 0x080c, 0xa17b, 0x0118, 0x6944, 0xc1dc, 0x6946, 0x0080, - 0xd1d4, 0x0118, 0x684b, 0x0007, 0x0058, 0x684b, 0x0000, 0x684c, - 0xd0ac, 0x0130, 0x6810, 0x6914, 0xa115, 0x0110, 0x080c, 0x953f, - 0x080c, 0x547a, 0x080c, 0x9fbf, 0x1110, 0x080c, 0x86a4, 0x00de, - 0x0005, 0x080c, 0x7102, 0x0010, 0x080c, 0x7198, 0x080c, 0x9d16, - 0x01c0, 0x00d6, 0x6110, 0x2168, 0x6837, 0x0103, 0x2009, 0xb60c, - 0x210c, 0xd18c, 0x11c0, 0xd184, 0x1198, 0x6108, 0x694a, 0xa18e, - 0x0029, 0x1110, 0x080c, 0xb43c, 0x6847, 0x0000, 0x080c, 0x547a, - 0x00de, 0x080c, 0x86a4, 0x080c, 0x71e5, 0x080c, 0x72a2, 0x0005, - 0x684b, 0x0004, 0x0c88, 0x684b, 0x0004, 0x0c70, 0xa182, 0x0040, - 0x0002, 0x977c, 0x977c, 0x977c, 0x977c, 0x977c, 0x977e, 0x977c, - 0x9781, 0x977c, 0x977c, 0x977c, 0x977c, 0x977c, 0x977c, 0x977c, - 0x977c, 0x977c, 0x977c, 0x977c, 0x080c, 0x151a, 0x080c, 0x86a4, - 0x0005, 0x0006, 0x0026, 0xa016, 0x080c, 0x1863, 0x002e, 0x000e, - 0x0005, 0xa182, 0x0085, 0x0002, 0x9795, 0x9793, 0x9793, 0x97a1, - 0x9793, 0x9793, 0x9793, 0x080c, 0x151a, 0x6003, 0x0001, 0x6106, - 0x080c, 0x6cff, 0x0126, 0x2091, 0x8000, 0x080c, 0x71e5, 0x012e, - 0x0005, 0x0026, 0x0056, 0x00d6, 0x00e6, 0x2071, 0xbc80, 0x7224, - 0x6212, 0x7220, 0x080c, 0x9d06, 0x01a0, 0x2268, 0x6800, 0xa086, - 0x0000, 0x0178, 0x6018, 0x6d18, 0xa52e, 0x1158, 0x00c6, 0x2d60, - 0x080c, 0x99d9, 0x00ce, 0x0128, 0x6803, 0x0002, 0x6007, 0x0086, - 0x0010, 0x6007, 0x0087, 0x6003, 0x0001, 0x080c, 0x6cff, 0x080c, - 0x71e5, 0x00f6, 0x2278, 0x080c, 0x5377, 0x00fe, 0x0150, 0x6820, - 0xd0ec, 0x0138, 0x00c6, 0x2260, 0x603f, 0x0000, 0x080c, 0x9ff1, - 0x00ce, 0x00ee, 0x00de, 0x005e, 0x002e, 0x0005, 0xa186, 0x0013, - 0x1160, 0x6004, 0xa08a, 0x0085, 0x0a0c, 0x151a, 0xa08a, 0x008c, - 0x1a0c, 0x151a, 0xa082, 0x0085, 0x0072, 0xa186, 0x0027, 0x0120, - 0xa186, 0x0014, 0x190c, 0x151a, 0x080c, 0x7102, 0x080c, 0x9ed9, - 0x080c, 0x71e5, 0x0005, 0x9802, 0x9804, 0x9804, 0x9802, 0x9802, - 0x9802, 0x9802, 0x080c, 0x151a, 0x080c, 0x7102, 0x080c, 0x9ed9, - 0x080c, 0x71e5, 0x0005, 0xa186, 0x0013, 0x1128, 0x6004, 0xa082, - 0x0085, 0x2008, 0x04a8, 0xa186, 0x0027, 0x11e8, 0x080c, 0x7102, - 0x080c, 0x2cd1, 0x00d6, 0x6010, 0x2068, 0x080c, 0x9d16, 0x0150, - 0x6837, 0x0103, 0x6847, 0x0000, 0x684b, 0x0029, 0x080c, 0x547a, - 0x080c, 0x9ecd, 0x00de, 0x080c, 0x86a4, 0x080c, 0x71e5, 0x0005, - 0x080c, 0x86ef, 0x0ce0, 0xa186, 0x0014, 0x1dd0, 0x080c, 0x7102, - 0x00d6, 0x6010, 0x2068, 0x080c, 0x9d16, 0x0d60, 0x6837, 0x0103, - 0x6847, 0x0000, 0x684b, 0x0006, 0x6850, 0xc0ec, 0x6852, 0x08f0, - 0x0002, 0x9852, 0x9850, 0x9850, 0x9850, 0x9850, 0x9850, 0x986a, - 0x080c, 0x151a, 0x080c, 0x7102, 0x6030, 0xa08c, 0xff00, 0x810f, - 0xa186, 0x0039, 0x0118, 0xa186, 0x0035, 0x1118, 0x2001, 0xb8b6, - 0x0010, 0x2001, 0xb8b7, 0x2004, 0x6016, 0x6003, 0x000c, 0x080c, - 0x71e5, 0x0005, 0x080c, 0x7102, 0x6030, 0xa08c, 0xff00, 0x810f, - 0xa186, 0x0039, 0x0118, 0xa186, 0x0035, 0x1118, 0x2001, 0xb8b6, - 0x0010, 0x2001, 0xb8b7, 0x2004, 0x6016, 0x6003, 0x000e, 0x080c, - 0x71e5, 0x0005, 0xa182, 0x008c, 0x1220, 0xa182, 0x0085, 0x0208, - 0x001a, 0x080c, 0x86ef, 0x0005, 0x9893, 0x9893, 0x9893, 0x9893, - 0x9895, 0x98ee, 0x9893, 0x080c, 0x151a, 0x00d6, 0x00f6, 0x2c78, - 0x080c, 0x5377, 0x00fe, 0x0168, 0x6030, 0xa08c, 0xff00, 0x810f, - 0xa186, 0x0039, 0x0118, 0xa186, 0x0035, 0x1118, 0x00de, 0x0804, - 0x9901, 0x080c, 0x9d16, 0x1118, 0x080c, 0x9ecd, 0x00f0, 0x6010, - 0x2068, 0x684c, 0xd0e4, 0x1110, 0x080c, 0x9ecd, 0x6837, 0x0103, - 0x6850, 0xd0b4, 0x0128, 0x684b, 0x0006, 0xc0ec, 0x6852, 0x0048, - 0xd0bc, 0x0118, 0x684b, 0x0002, 0x0020, 0x684b, 0x0005, 0x080c, - 0x9f8e, 0x6847, 0x0000, 0x080c, 0x547a, 0x2c68, 0x080c, 0x864e, - 0x01c0, 0x6003, 0x0001, 0x6007, 0x001e, 0x600b, 0xffff, 0x2009, - 0xbc8e, 0x210c, 0x6136, 0x2009, 0xbc8f, 0x210c, 0x613a, 0x6918, - 0x611a, 0x080c, 0xa0e3, 0x6950, 0x6152, 0x601f, 0x0001, 0x080c, - 0x6cff, 0x2d60, 0x080c, 0x86a4, 0x00de, 0x0005, 0x00f6, 0x2c78, - 0x080c, 0x5377, 0x00fe, 0x0598, 0x6030, 0xa08c, 0xff00, 0x810f, - 0xa186, 0x0035, 0x0130, 0xa186, 0x001e, 0x0118, 0xa186, 0x0039, - 0x1530, 0x00d6, 0x2c68, 0x080c, 0xa1c6, 0x1904, 0x9946, 0x080c, - 0x864e, 0x01d8, 0x6106, 0x6003, 0x0001, 0x601f, 0x0001, 0x6918, - 0x611a, 0x6928, 0x612a, 0x692c, 0x612e, 0x6930, 0xa18c, 0x00ff, - 0x6132, 0x6934, 0x6136, 0x6938, 0x613a, 0x6950, 0x6152, 0x080c, - 0xa0e3, 0x080c, 0x6cff, 0x080c, 0x71e5, 0x2d60, 0x00f8, 0x00d6, - 0x6010, 0x2068, 0x080c, 0x9d16, 0x01c8, 0x6837, 0x0103, 0x6850, - 0xd0b4, 0x0128, 0xc0ec, 0x6852, 0x684b, 0x0006, 0x0048, 0xd0bc, - 0x0118, 0x684b, 0x0002, 0x0020, 0x684b, 0x0005, 0x080c, 0x9f8e, - 0x6847, 0x0000, 0x080c, 0x547a, 0x080c, 0x9ecd, 0x00de, 0x080c, - 0x86a4, 0x0005, 0x0016, 0x00d6, 0x6010, 0x2068, 0x080c, 0x9d16, - 0x0140, 0x6837, 0x0103, 0x684b, 0x0028, 0x6847, 0x0000, 0x080c, - 0x547a, 0x00de, 0x001e, 0xa186, 0x0013, 0x0148, 0xa186, 0x0014, - 0x0130, 0xa186, 0x0027, 0x0118, 0x080c, 0x86ef, 0x0030, 0x080c, - 0x7102, 0x080c, 0x9ed9, 0x080c, 0x71e5, 0x0005, 0x0056, 0x0066, - 0x00d6, 0x00f6, 0x2029, 0x0001, 0xa182, 0x0101, 0x1208, 0x0010, - 0x2009, 0x0100, 0x2130, 0x2069, 0xbc98, 0x831c, 0x2300, 0xad18, - 0x2009, 0x0020, 0xaf90, 0x001d, 0x080c, 0x99c9, 0xa6b2, 0x0020, - 0x7804, 0xa06d, 0x0110, 0x080c, 0x1624, 0x080c, 0x15fd, 0x0500, - 0x8528, 0x6837, 0x0110, 0x683b, 0x0000, 0x2d20, 0x7c06, 0xa68a, - 0x003d, 0x1228, 0x2608, 0xad90, 0x000f, 0x0459, 0x0088, 0xa6b2, - 0x003c, 0x2009, 0x003c, 0x2d78, 0xad90, 0x000f, 0x0411, 0x0c28, - 0x00fe, 0x852f, 0xa5ad, 0x0003, 0x7d36, 0xa5ac, 0x0000, 0x0028, - 0x00fe, 0x852f, 0xa5ad, 0x0003, 0x7d36, 0x00de, 0x006e, 0x005e, - 0x0005, 0x00f6, 0x8dff, 0x0158, 0x6804, 0xa07d, 0x0130, 0x6807, - 0x0000, 0x080c, 0x547a, 0x2f68, 0x0cb8, 0x080c, 0x547a, 0x00fe, - 0x0005, 0x0156, 0xa184, 0x0001, 0x0108, 0x8108, 0x810c, 0x21a8, - 0x2304, 0x8007, 0x2012, 0x8318, 0x8210, 0x1f04, 0x99d0, 0x015e, - 0x0005, 0x0066, 0x0126, 0x2091, 0x8000, 0x2031, 0x0001, 0x601c, - 0xa084, 0x000f, 0x0083, 0x012e, 0x006e, 0x0005, 0x0126, 0x2091, - 0x8000, 0x0066, 0x2031, 0x0000, 0x601c, 0xa084, 0x000f, 0x001b, - 0x006e, 0x012e, 0x0005, 0x9a10, 0x9a10, 0x9a0b, 0x9a32, 0x99fe, - 0x9a0b, 0x9a32, 0x9a0b, 0x9a0b, 0x99fe, 0x9a0b, 0x080c, 0x151a, - 0x0036, 0x2019, 0x0010, 0x080c, 0xad9c, 0x601f, 0x0006, 0x6003, - 0x0007, 0x003e, 0x0005, 0xa006, 0x0005, 0xa085, 0x0001, 0x0005, - 0x00d6, 0x86ff, 0x11d8, 0x6010, 0x2068, 0x080c, 0x9d16, 0x01c0, - 0x6834, 0xa086, 0x0139, 0x1128, 0x684b, 0x0005, 0x6853, 0x0000, - 0x0028, 0xa00e, 0x2001, 0x0005, 0x080c, 0x554d, 0x080c, 0x9f8e, - 0x080c, 0x547a, 0x080c, 0x86a4, 0xa085, 0x0001, 0x00de, 0x0005, - 0xa006, 0x0ce0, 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x151a, 0x000b, - 0x0005, 0x9a49, 0x9a6a, 0x9a4b, 0x9a89, 0x9a67, 0x9a49, 0x9a0b, - 0x9a10, 0x9a10, 0x9a0b, 0x9a0b, 0x9a0b, 0x9a0b, 0x9a0b, 0x9a0b, - 0x9a0b, 0x080c, 0x151a, 0x86ff, 0x11b8, 0x601c, 0xa086, 0x0006, - 0x0198, 0x00d6, 0x6010, 0x2068, 0x080c, 0x9d16, 0x0110, 0x080c, - 0x9f8e, 0x00de, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, - 0x080c, 0x6cff, 0x080c, 0x71e5, 0xa085, 0x0001, 0x0005, 0x080c, - 0x1952, 0x0c08, 0x00e6, 0x2071, 0xb8e1, 0x7024, 0xac06, 0x1110, - 0x080c, 0x7fe0, 0x601c, 0xa084, 0x000f, 0xa086, 0x0006, 0x1150, - 0x0086, 0x0096, 0x2049, 0x0001, 0x2c40, 0x080c, 0x81b7, 0x009e, - 0x008e, 0x0010, 0x080c, 0x7ed1, 0x00ee, 0x1928, 0x080c, 0x9a0b, - 0x0005, 0x0036, 0x00e6, 0x2071, 0xb8e1, 0x703c, 0xac06, 0x1140, - 0x2019, 0x0000, 0x080c, 0x806b, 0x00ee, 0x003e, 0x0804, 0x9a4b, - 0x080c, 0x82e4, 0x00ee, 0x003e, 0x1904, 0x9a4b, 0x080c, 0x9a0b, - 0x0005, 0x00c6, 0x601c, 0xa084, 0x000f, 0x0013, 0x00ce, 0x0005, - 0x9aba, 0x9b27, 0x9c75, 0x9ac5, 0x9ed9, 0x9aba, 0xad8e, 0xa20a, - 0x9b27, 0x9ab3, 0x9ce0, 0x080c, 0x151a, 0x080c, 0x9f14, 0x1110, - 0x080c, 0x8ca5, 0x0005, 0x080c, 0x7102, 0x080c, 0x71e5, 0x080c, - 0x86a4, 0x0005, 0x6017, 0x0001, 0x0005, 0x080c, 0x9d16, 0x0120, - 0x6010, 0xa080, 0x0019, 0x2c02, 0x6000, 0xa08a, 0x0010, 0x1a0c, - 0x151a, 0x000b, 0x0005, 0x9ae3, 0x9ae5, 0x9b05, 0x9b17, 0x9b24, - 0x9ae3, 0x9aba, 0x9aba, 0x9aba, 0x9b17, 0x9b17, 0x9ae3, 0x9ae3, - 0x9ae3, 0x9ae3, 0x9b21, 0x080c, 0x151a, 0x00e6, 0x6010, 0x2070, - 0x7050, 0xc0b5, 0x7052, 0x2071, 0xb8e1, 0x7024, 0xac06, 0x0190, - 0x080c, 0x7ed1, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, - 0x2001, 0xb8b7, 0x2004, 0x6016, 0x080c, 0x6cff, 0x080c, 0x71e5, - 0x00ee, 0x0005, 0x6017, 0x0001, 0x0cd8, 0x00d6, 0x6010, 0x2068, - 0x6850, 0xc0b5, 0x6852, 0x00de, 0x6007, 0x0085, 0x6003, 0x000b, - 0x601f, 0x0002, 0x080c, 0x6cff, 0x080c, 0x71e5, 0x0005, 0x00d6, - 0x6017, 0x0001, 0x6010, 0x2068, 0x6850, 0xc0b5, 0x6852, 0x00de, - 0x0005, 0x080c, 0x86a4, 0x0005, 0x080c, 0x1952, 0x08f0, 0x6000, - 0xa08a, 0x0010, 0x1a0c, 0x151a, 0x000b, 0x0005, 0x9b3e, 0x9ac2, - 0x9b40, 0x9b3e, 0x9b40, 0x9b40, 0x9abb, 0x9b3e, 0x9ab5, 0x9ab5, - 0x9b3e, 0x9b3e, 0x9b3e, 0x9b3e, 0x9b3e, 0x9b3e, 0x080c, 0x151a, - 0x00d6, 0x6018, 0x2068, 0x6804, 0xa084, 0x00ff, 0x00de, 0xa08a, - 0x000c, 0x1a0c, 0x151a, 0x000b, 0x0005, 0x9b59, 0x9c1b, 0x9b5b, - 0x9b99, 0x9b5b, 0x9b99, 0x9b5b, 0x9b69, 0x9b59, 0x9b99, 0x9b59, - 0x9b85, 0x080c, 0x151a, 0x6004, 0xa08e, 0x0016, 0x05a8, 0xa08e, - 0x0004, 0x0590, 0xa08e, 0x0002, 0x0578, 0xa08e, 0x004b, 0x0904, - 0x9c17, 0x6004, 0x080c, 0x9f14, 0x0904, 0x9c34, 0xa08e, 0x0021, - 0x0904, 0x9c38, 0xa08e, 0x0022, 0x0904, 0x9c34, 0xa08e, 0x003d, - 0x0904, 0x9c38, 0xa08e, 0x0039, 0x0904, 0x9c3c, 0xa08e, 0x0035, - 0x0904, 0x9c3c, 0xa08e, 0x001e, 0x0188, 0xa08e, 0x0001, 0x1150, - 0x00d6, 0x6018, 0x2068, 0x6804, 0xa084, 0x00ff, 0x00de, 0xa086, - 0x0006, 0x0110, 0x080c, 0x2cd1, 0x080c, 0x8ca5, 0x080c, 0x9ed9, - 0x0005, 0x00c6, 0x00d6, 0x6104, 0xa186, 0x0016, 0x0904, 0x9c08, - 0xa186, 0x0002, 0x15d8, 0x2001, 0xb635, 0x2004, 0xd08c, 0x1198, - 0x080c, 0x5b41, 0x1180, 0x2001, 0xb89f, 0x2003, 0x0001, 0x2001, - 0xb600, 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, 0x5b85, 0x080c, - 0x5a79, 0x0804, 0x9c5e, 0x6018, 0x2068, 0x2001, 0xb635, 0x2004, - 0xd0ac, 0x1904, 0x9c5e, 0x68a0, 0xd0bc, 0x1904, 0x9c5e, 0x6840, - 0xa084, 0x00ff, 0xa005, 0x0190, 0x8001, 0x6842, 0x6013, 0x0000, - 0x601f, 0x0007, 0x6017, 0x0398, 0x603f, 0x0000, 0x080c, 0x864e, - 0x0128, 0x2d00, 0x601a, 0x601f, 0x0001, 0x0450, 0x00de, 0x00ce, - 0x6004, 0xa08e, 0x0002, 0x11a8, 0x6018, 0xa080, 0x0028, 0x2004, - 0xa086, 0x007e, 0x1170, 0x2009, 0xb635, 0x2104, 0xc085, 0x200a, - 0x00e6, 0x2071, 0xb600, 0x080c, 0x4c28, 0x00ee, 0x080c, 0x8ca5, - 0x0020, 0x080c, 0x8ca5, 0x080c, 0x2cd1, 0x00e6, 0x0126, 0x2091, - 0x8000, 0x080c, 0x2cf7, 0x012e, 0x00ee, 0x080c, 0x9ed9, 0x0005, - 0x2001, 0x0002, 0x080c, 0x4f6f, 0x6003, 0x0001, 0x6007, 0x0002, - 0x080c, 0x6d45, 0x080c, 0x71e5, 0x00de, 0x00ce, 0x0c80, 0x080c, - 0x2cf7, 0x0804, 0x9b94, 0x00c6, 0x00d6, 0x6104, 0xa186, 0x0016, - 0x0d38, 0x6018, 0x2068, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0904, - 0x9bde, 0x8001, 0x6842, 0x6003, 0x0001, 0x080c, 0x6d45, 0x080c, - 0x71e5, 0x00de, 0x00ce, 0x0898, 0x080c, 0x8ca5, 0x0804, 0x9b96, - 0x080c, 0x8cd3, 0x0804, 0x9b96, 0x00d6, 0x2c68, 0x6104, 0x080c, - 0xa1c6, 0x00de, 0x0118, 0x080c, 0x86a4, 0x00b8, 0x6004, 0x8007, - 0x6130, 0xa18c, 0x00ff, 0xa105, 0x6032, 0x6007, 0x0085, 0x6003, - 0x000b, 0x601f, 0x0002, 0x6038, 0x600a, 0x2001, 0xb8b7, 0x2004, - 0x6016, 0x080c, 0x6cff, 0x080c, 0x71e5, 0x0005, 0x00de, 0x00ce, - 0x080c, 0x8ca5, 0x080c, 0x2cd1, 0x00e6, 0x0126, 0x2091, 0x8000, - 0x080c, 0x2cf7, 0x6013, 0x0000, 0x601f, 0x0007, 0x6017, 0x0398, - 0x603f, 0x0000, 0x012e, 0x00ee, 0x0005, 0x6000, 0xa08a, 0x0010, - 0x1a0c, 0x151a, 0x000b, 0x0005, 0x9c8c, 0x9c8c, 0x9c8c, 0x9c8c, - 0x9c8c, 0x9c8c, 0x9c8c, 0x9c8c, 0x9c8c, 0x9aba, 0x9c8c, 0x9ac2, - 0x9c8e, 0x9ac2, 0x9c9b, 0x9c8c, 0x080c, 0x151a, 0x6004, 0xa086, - 0x008b, 0x0148, 0x6007, 0x008b, 0x6003, 0x000d, 0x080c, 0x6cff, - 0x080c, 0x71e5, 0x0005, 0x080c, 0x9ecd, 0x080c, 0x9d16, 0x0580, - 0x080c, 0x2cd1, 0x00d6, 0x080c, 0x9d16, 0x0168, 0x6010, 0x2068, - 0x6837, 0x0103, 0x684b, 0x0006, 0x6847, 0x0000, 0x6850, 0xc0ed, - 0x6852, 0x080c, 0x547a, 0x2c68, 0x080c, 0x864e, 0x0150, 0x6818, - 0x601a, 0x080c, 0xa0e3, 0x00c6, 0x2d60, 0x080c, 0x9ed9, 0x00ce, - 0x0008, 0x2d60, 0x00de, 0x6013, 0x0000, 0x601f, 0x0001, 0x6007, - 0x0001, 0x6003, 0x0001, 0x080c, 0x6d45, 0x080c, 0x71e5, 0x0078, - 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0118, 0xa186, - 0x0035, 0x1118, 0x080c, 0x2cd1, 0x08b0, 0x080c, 0x9ed9, 0x0005, - 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x151a, 0x000b, 0x0005, 0x9cf7, - 0x9cf7, 0x9cf7, 0x9cf9, 0x9cf9, 0x9cf7, 0x9cf7, 0x9cf7, 0x9cf7, - 0x9cf7, 0x9cf7, 0x9cf7, 0x9cf7, 0x9cf7, 0x9cf7, 0x9cf7, 0x080c, - 0x151a, 0x080c, 0x82e4, 0x190c, 0x151a, 0x6110, 0x2168, 0x684b, - 0x0006, 0x080c, 0x547a, 0x080c, 0x86a4, 0x0005, 0xa284, 0x0007, - 0x1158, 0xa282, 0xbe00, 0x0240, 0x2001, 0xb617, 0x2004, 0xa202, - 0x1218, 0xa085, 0x0001, 0x0005, 0xa006, 0x0ce8, 0x0026, 0x6210, - 0xa294, 0xf000, 0x002e, 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0006, - 0x0126, 0x2091, 0x8000, 0x2061, 0xbe00, 0x2071, 0xb600, 0x7348, - 0x7068, 0xa302, 0x12a8, 0x601c, 0xa206, 0x1160, 0x080c, 0xa06e, - 0x0148, 0x080c, 0x9f14, 0x1110, 0x080c, 0x8ca5, 0x00c6, 0x080c, - 0x86a4, 0x00ce, 0xace0, 0x0018, 0x705c, 0xac02, 0x1208, 0x0c38, - 0x012e, 0x000e, 0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, - 0x0016, 0xa188, 0xb735, 0x210c, 0x81ff, 0x0128, 0x2061, 0xb9f5, - 0x611a, 0x080c, 0x2cd1, 0xa006, 0x0010, 0xa085, 0x0001, 0x001e, - 0x00ce, 0x00ee, 0x0005, 0x00c6, 0x0056, 0x0126, 0x2091, 0x8000, - 0x00c6, 0x080c, 0x864e, 0x005e, 0x0180, 0x6612, 0x651a, 0x080c, - 0xa0e3, 0x601f, 0x0003, 0x2009, 0x004b, 0x080c, 0x86d3, 0xa085, - 0x0001, 0x012e, 0x005e, 0x00ce, 0x0005, 0xa006, 0x0cd0, 0x00c6, - 0x0056, 0x0126, 0x2091, 0x8000, 0x62a0, 0x00c6, 0x080c, 0x9f92, - 0x005e, 0x0550, 0x6013, 0x0000, 0x651a, 0x080c, 0xa0e3, 0x601f, - 0x0003, 0x0016, 0x00c6, 0x2560, 0x080c, 0x521c, 0x00ce, 0x080c, - 0x6e67, 0x0076, 0x2039, 0x0000, 0x080c, 0x6d74, 0x2c08, 0x080c, - 0xaf3e, 0x007e, 0x001e, 0xd184, 0x0128, 0x080c, 0x86a4, 0xa085, - 0x0001, 0x0030, 0x2009, 0x004c, 0x080c, 0x86d3, 0xa085, 0x0001, - 0x012e, 0x005e, 0x00ce, 0x0005, 0xa006, 0x0cd0, 0x00f6, 0x00c6, - 0x0046, 0x00c6, 0x080c, 0x864e, 0x2c78, 0x00ce, 0x0180, 0x7e12, - 0x2c00, 0x781a, 0x781f, 0x0003, 0x2021, 0x0005, 0x080c, 0x9e0c, - 0x2f60, 0x2009, 0x004d, 0x080c, 0x86d3, 0xa085, 0x0001, 0x004e, - 0x00ce, 0x00fe, 0x0005, 0x00f6, 0x00c6, 0x0046, 0x00c6, 0x080c, - 0x864e, 0x2c78, 0x00ce, 0x0178, 0x7e12, 0x2c00, 0x781a, 0x781f, - 0x0003, 0x2021, 0x0005, 0x0481, 0x2f60, 0x2009, 0x004e, 0x080c, - 0x86d3, 0xa085, 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6, - 0x00c6, 0x0046, 0x00c6, 0x080c, 0x864e, 0x2c78, 0x00ce, 0x01c0, - 0x7e12, 0x2c00, 0x781a, 0x781f, 0x0003, 0x2021, 0x0004, 0x00a1, - 0x2001, 0xb8a0, 0x2004, 0xd0fc, 0x0120, 0x2f60, 0x080c, 0x86a4, - 0x0028, 0x2f60, 0x2009, 0x0052, 0x080c, 0x86d3, 0xa085, 0x0001, - 0x004e, 0x00ce, 0x00fe, 0x0005, 0x0096, 0x0076, 0x0126, 0x2091, - 0x8000, 0x080c, 0x51be, 0x0118, 0x2001, 0x9e11, 0x0028, 0x080c, - 0x518e, 0x0158, 0x2001, 0x9e17, 0x0006, 0xa00e, 0x2400, 0x080c, - 0x554d, 0x080c, 0x547a, 0x000e, 0x0807, 0x2418, 0x080c, 0x70a1, - 0x62a0, 0x0086, 0x2041, 0x0001, 0x2039, 0x0001, 0x2608, 0x080c, - 0x6e80, 0x008e, 0x080c, 0x6d74, 0x2f08, 0x2648, 0x080c, 0xaf3e, - 0x613c, 0x81ff, 0x090c, 0x6f35, 0x080c, 0x71e5, 0x012e, 0x007e, - 0x009e, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, - 0x864e, 0x001e, 0x0188, 0x660a, 0x611a, 0x080c, 0xa0e3, 0x601f, - 0x0001, 0x2d00, 0x6012, 0x2009, 0x001f, 0x080c, 0x86d3, 0xa085, - 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00c6, 0x0126, - 0x2091, 0x8000, 0x00c6, 0x080c, 0x864e, 0x001e, 0x0188, 0x660a, - 0x611a, 0x080c, 0xa0e3, 0x601f, 0x0008, 0x2d00, 0x6012, 0x2009, - 0x0021, 0x080c, 0x86d3, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, - 0xa006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, - 0x864e, 0x001e, 0x0188, 0x660a, 0x611a, 0x080c, 0xa0e3, 0x601f, - 0x0001, 0x2d00, 0x6012, 0x2009, 0x003d, 0x080c, 0x86d3, 0xa085, - 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00c6, 0x0126, - 0x2091, 0x8000, 0x00c6, 0x080c, 0x9f92, 0x001e, 0x0180, 0x611a, - 0x080c, 0xa0e3, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0000, - 0x080c, 0x86d3, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, - 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x864e, - 0x001e, 0x0188, 0x660a, 0x611a, 0x080c, 0xa0e3, 0x601f, 0x0001, - 0x2d00, 0x6012, 0x2009, 0x0044, 0x080c, 0x86d3, 0xa085, 0x0001, - 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x0026, 0x00d6, 0x6218, - 0x2268, 0x6a3c, 0x82ff, 0x0110, 0x8211, 0x6a3e, 0x00de, 0x002e, - 0x0005, 0x0006, 0x6000, 0xa086, 0x0000, 0x0190, 0x6013, 0x0000, - 0x601f, 0x0007, 0x2001, 0xb8b6, 0x2004, 0x0006, 0xa082, 0x0051, - 0x000e, 0x0208, 0x8004, 0x6016, 0x080c, 0xb3f6, 0x603f, 0x0000, - 0x000e, 0x0005, 0x0066, 0x00c6, 0x00d6, 0x2031, 0xb653, 0x2634, - 0xd6e4, 0x0128, 0x6618, 0x2660, 0x6e48, 0x080c, 0x5147, 0x00de, - 0x00ce, 0x006e, 0x0005, 0x0006, 0x0016, 0x6004, 0xa08e, 0x0002, - 0x0140, 0xa08e, 0x0003, 0x0128, 0xa08e, 0x0004, 0x0110, 0xa085, - 0x0001, 0x001e, 0x000e, 0x0005, 0x0006, 0x00d6, 0x6010, 0xa06d, - 0x0148, 0x6834, 0xa086, 0x0139, 0x0138, 0x6838, 0xd0fc, 0x0110, - 0xa006, 0x0010, 0xa085, 0x0001, 0x00de, 0x000e, 0x0005, 0x00c6, - 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x864e, 0x001e, 0x0190, - 0x611a, 0x080c, 0xa0e3, 0x601f, 0x0001, 0x2d00, 0x6012, 0x080c, - 0x2cd1, 0x2009, 0x0028, 0x080c, 0x86d3, 0xa085, 0x0001, 0x012e, - 0x00ce, 0x0005, 0xa006, 0x0cd8, 0xa186, 0x0015, 0x1178, 0x2011, - 0xb621, 0x2204, 0xa086, 0x0074, 0x1148, 0x080c, 0x9024, 0x6003, - 0x0001, 0x6007, 0x0029, 0x080c, 0x6d45, 0x0020, 0x080c, 0x8ca5, - 0x080c, 0x86a4, 0x0005, 0xa186, 0x0016, 0x1128, 0x2001, 0x0004, - 0x080c, 0x4f6f, 0x00e8, 0xa186, 0x0015, 0x11e8, 0x2011, 0xb621, - 0x2204, 0xa086, 0x0014, 0x11b8, 0x00d6, 0x6018, 0x2068, 0x080c, - 0x50bd, 0x00de, 0x080c, 0x90dd, 0x1170, 0x00d6, 0x6018, 0x2068, - 0x6890, 0x00de, 0xa005, 0x0138, 0x2001, 0x0006, 0x080c, 0x4f6f, - 0x080c, 0x882c, 0x0020, 0x080c, 0x8ca5, 0x080c, 0x86a4, 0x0005, - 0x6848, 0xa086, 0x0005, 0x1108, 0x0009, 0x0005, 0x6850, 0xc0ad, - 0x6852, 0x0005, 0x00e6, 0x0126, 0x2071, 0xb600, 0x2091, 0x8000, - 0x7548, 0xa582, 0x0001, 0x0608, 0x704c, 0x2060, 0x6000, 0xa086, - 0x0000, 0x0148, 0xace0, 0x0018, 0x705c, 0xac02, 0x1208, 0x0cb0, - 0x2061, 0xbe00, 0x0c98, 0x6003, 0x0008, 0x8529, 0x754a, 0xaca8, - 0x0018, 0x705c, 0xa502, 0x1230, 0x754e, 0xa085, 0x0001, 0x012e, - 0x00ee, 0x0005, 0x704f, 0xbe00, 0x0cc0, 0xa006, 0x0cc0, 0x00e6, - 0x2071, 0xbc8c, 0x7014, 0xd0e4, 0x0150, 0x6013, 0x0000, 0x6003, - 0x0001, 0x6007, 0x0050, 0x080c, 0x6cff, 0x080c, 0x71e5, 0x00ee, - 0x0005, 0x00c6, 0x00f6, 0x2c78, 0x080c, 0x5377, 0x00fe, 0x0120, - 0x601c, 0xa084, 0x000f, 0x0013, 0x00ce, 0x0005, 0x9aba, 0x9fe9, - 0x9fec, 0x9fef, 0xb1e3, 0xb1fe, 0xb201, 0x9aba, 0x9aba, 0x080c, - 0x151a, 0xe000, 0xe000, 0x0005, 0xe000, 0xe000, 0x0005, 0x0009, - 0x0005, 0x00f6, 0x2c78, 0x080c, 0x5377, 0x0538, 0x080c, 0x864e, - 0x1128, 0x2001, 0xb8b8, 0x2004, 0x783e, 0x00f8, 0x7818, 0x601a, - 0x080c, 0xa0e3, 0x781c, 0xa086, 0x0003, 0x0128, 0x7808, 0x6036, - 0x2f00, 0x603a, 0x0020, 0x7808, 0x603a, 0x2f00, 0x6036, 0x602a, - 0x601f, 0x0001, 0x6007, 0x0035, 0x6003, 0x0001, 0x7950, 0x6152, - 0x080c, 0x6cff, 0x080c, 0x71e5, 0x2f60, 0x00fe, 0x0005, 0x0016, - 0x00f6, 0x682c, 0x6032, 0xa08e, 0x0001, 0x0138, 0xa086, 0x0005, - 0x0140, 0xa006, 0x602a, 0x602e, 0x00a0, 0x6820, 0xc0f4, 0xc0d5, - 0x6822, 0x6810, 0x2078, 0x787c, 0x6938, 0xa102, 0x7880, 0x6934, - 0xa103, 0x1e78, 0x6834, 0x602a, 0x6838, 0xa084, 0xfffc, 0x683a, - 0x602e, 0x2d00, 0x6036, 0x6808, 0x603a, 0x6918, 0x611a, 0x6950, - 0x6152, 0x601f, 0x0001, 0x6007, 0x0039, 0x6003, 0x0001, 0x080c, - 0x6cff, 0x6803, 0x0002, 0x00fe, 0x001e, 0x0005, 0x00f6, 0x2c78, - 0x080c, 0x5377, 0x1118, 0xa085, 0x0001, 0x0070, 0x6020, 0xd0f4, - 0x1150, 0xc0f5, 0x6022, 0x6010, 0x2078, 0x7828, 0x603a, 0x782c, - 0x6036, 0x080c, 0x1952, 0xa006, 0x00fe, 0x0005, 0x0006, 0x0016, - 0x6004, 0xa08e, 0x0034, 0x01b8, 0xa08e, 0x0035, 0x01a0, 0xa08e, - 0x0036, 0x0188, 0xa08e, 0x0037, 0x0170, 0xa08e, 0x0038, 0x0158, - 0xa08e, 0x0039, 0x0140, 0xa08e, 0x003a, 0x0128, 0xa08e, 0x003b, - 0x0110, 0xa085, 0x0001, 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, - 0x0026, 0x0036, 0x00e6, 0x2001, 0xb8b2, 0x200c, 0x8000, 0x2014, - 0x2001, 0x0032, 0x080c, 0x6bb2, 0x2001, 0xb8b6, 0x82ff, 0x1110, - 0x2011, 0x0014, 0x2202, 0x2001, 0xb8b4, 0x200c, 0x8000, 0x2014, - 0x2071, 0xb88e, 0x711a, 0x721e, 0x2001, 0x0064, 0x080c, 0x6bb2, - 0x2001, 0xb8b7, 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2009, - 0xb8b8, 0xa280, 0x000a, 0x200a, 0x080c, 0x539c, 0x00ee, 0x003e, - 0x002e, 0x001e, 0x000e, 0x0005, 0x0006, 0x00e6, 0x2001, 0xb8b6, - 0x2003, 0x0028, 0x2001, 0xb8b7, 0x2003, 0x0014, 0x2071, 0xb88e, - 0x701b, 0x0000, 0x701f, 0x07d0, 0x2001, 0xb8b8, 0x2003, 0x001e, - 0x00ee, 0x000e, 0x0005, 0x00d6, 0x6054, 0xa06d, 0x0110, 0x080c, - 0x1614, 0x00de, 0x0005, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, - 0x00c6, 0x080c, 0x864e, 0x001e, 0x0178, 0x611a, 0x0ca1, 0x601f, - 0x0001, 0x2d00, 0x6012, 0x2009, 0x0033, 0x080c, 0x86d3, 0xa085, - 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00d6, 0x00e6, - 0x00f6, 0x2071, 0xb600, 0xa186, 0x0015, 0x1500, 0x7084, 0xa086, - 0x0018, 0x11e0, 0x6010, 0x2068, 0x6a3c, 0xd2e4, 0x1160, 0x2c78, - 0x080c, 0x73a3, 0x01d8, 0x7070, 0x6a50, 0xa206, 0x1160, 0x7074, - 0x6a54, 0xa206, 0x1140, 0x6218, 0xa290, 0x0028, 0x2214, 0x2009, - 0x0000, 0x080c, 0x2d16, 0x080c, 0x882c, 0x0020, 0x080c, 0x8ca5, - 0x080c, 0x86a4, 0x00fe, 0x00ee, 0x00de, 0x0005, 0x7054, 0x6a54, - 0xa206, 0x0d48, 0x0c80, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, - 0x080c, 0x864e, 0x001e, 0x0180, 0x611a, 0x080c, 0xa0e3, 0x601f, - 0x0001, 0x2d00, 0x6012, 0x2009, 0x0043, 0x080c, 0x86d3, 0xa085, - 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00d6, 0x00e6, - 0x00f6, 0x2071, 0xb600, 0xa186, 0x0015, 0x11c0, 0x7084, 0xa086, - 0x0004, 0x11a0, 0x6010, 0xa0e8, 0x000f, 0x2c78, 0x080c, 0x73a3, - 0x01a8, 0x7070, 0x6a08, 0xa206, 0x1130, 0x7074, 0x6a0c, 0xa206, - 0x1110, 0x080c, 0x2cd1, 0x080c, 0x882c, 0x0020, 0x080c, 0x8ca5, - 0x080c, 0x86a4, 0x00fe, 0x00ee, 0x00de, 0x0005, 0x7054, 0x6a0c, - 0xa206, 0x0d78, 0x0c80, 0x0016, 0x0026, 0x684c, 0xd0ac, 0x0178, - 0x6914, 0x6a10, 0x2100, 0xa205, 0x0150, 0x6860, 0xa106, 0x1118, - 0x685c, 0xa206, 0x0120, 0x6962, 0x6a5e, 0xa085, 0x0001, 0x002e, - 0x001e, 0x0005, 0x00d6, 0x0036, 0x6310, 0x2368, 0x684a, 0x6952, - 0xa29e, 0x4000, 0x11a0, 0x00c6, 0x6318, 0x2360, 0x2009, 0x0000, - 0x6838, 0xd0f4, 0x1140, 0x080c, 0x52bc, 0x1108, 0xc185, 0x6000, - 0xd0bc, 0x0108, 0xc18d, 0x6a66, 0x696a, 0x00ce, 0x0080, 0x6a66, - 0x3918, 0xa398, 0x0006, 0x231c, 0x686b, 0x0004, 0x6b72, 0x00c6, - 0x6318, 0x2360, 0x6004, 0xa084, 0x00ff, 0x686e, 0x00ce, 0x080c, - 0x547a, 0x6013, 0x0000, 0x003e, 0x00de, 0x0005, 0x00c6, 0x0026, - 0x0016, 0xa186, 0x0035, 0x0110, 0x6a34, 0x0008, 0x6a28, 0x080c, - 0x9d06, 0x01f0, 0x2260, 0x611c, 0xa186, 0x0003, 0x0118, 0xa186, - 0x0006, 0x1190, 0x6834, 0xa206, 0x0140, 0x6838, 0xa206, 0x1160, - 0x6108, 0x6834, 0xa106, 0x1140, 0x0020, 0x6008, 0x6938, 0xa106, - 0x1118, 0x6018, 0x6918, 0xa106, 0x001e, 0x002e, 0x00ce, 0x0005, - 0xa085, 0x0001, 0x0cc8, 0x6944, 0xd1cc, 0x0198, 0xa18c, 0x00ff, - 0xa18e, 0x0002, 0x1170, 0xad88, 0x001e, 0x210c, 0xa18c, 0x0f00, - 0x810f, 0xa18e, 0x0001, 0x1128, 0x6810, 0x6914, 0xa115, 0x190c, - 0x953f, 0x0005, 0x080c, 0x86a4, 0x0804, 0x71e5, 0x0066, 0x6000, - 0xa0b2, 0x0010, 0x1a0c, 0x151a, 0x0013, 0x006e, 0x0005, 0xa227, - 0xa702, 0xa828, 0xa227, 0xa227, 0xa227, 0xa227, 0xa227, 0xa25f, - 0xa8ac, 0xa227, 0xa227, 0xa227, 0xa227, 0xa227, 0xa227, 0x080c, - 0x151a, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x151a, 0x0013, - 0x006e, 0x0005, 0xa242, 0xad33, 0xa242, 0xa242, 0xa242, 0xa242, - 0xa242, 0xa242, 0xacf5, 0xad7b, 0xa242, 0xb328, 0xb358, 0xb328, - 0xb358, 0xa242, 0x080c, 0x151a, 0x0066, 0x6000, 0xa0b2, 0x0010, - 0x1a0c, 0x151a, 0x0013, 0x006e, 0x0005, 0xa25d, 0xa9fc, 0xaac9, - 0xaaf6, 0xab7a, 0xa25d, 0xac67, 0xac12, 0xa8b8, 0xaccb, 0xace0, - 0xa25d, 0xa25d, 0xa25d, 0xa25d, 0xa25d, 0x080c, 0x151a, 0xa1b2, - 0x0080, 0x1a0c, 0x151a, 0x2100, 0xa1b2, 0x0040, 0x1a04, 0xa676, - 0x0002, 0xa2a9, 0xa474, 0xa2a9, 0xa2a9, 0xa2a9, 0xa47b, 0xa2a9, - 0xa2a9, 0xa2a9, 0xa2a9, 0xa2a9, 0xa2a9, 0xa2a9, 0xa2a9, 0xa2a9, - 0xa2a9, 0xa2a9, 0xa2a9, 0xa2a9, 0xa2a9, 0xa2a9, 0xa2a9, 0xa2a9, - 0xa2ab, 0xa309, 0xa318, 0xa366, 0xa384, 0xa402, 0xa461, 0xa2a9, - 0xa2a9, 0xa47e, 0xa2a9, 0xa2a9, 0xa491, 0xa49c, 0xa2a9, 0xa2a9, - 0xa2a9, 0xa2a9, 0xa2a9, 0xa527, 0xa2a9, 0xa2a9, 0xa53a, 0xa2a9, - 0xa2a9, 0xa4f2, 0xa2a9, 0xa2a9, 0xa2a9, 0xa552, 0xa2a9, 0xa2a9, - 0xa2a9, 0xa5cc, 0xa2a9, 0xa2a9, 0xa2a9, 0xa2a9, 0xa2a9, 0xa2a9, - 0xa63d, 0x080c, 0x151a, 0x080c, 0x537b, 0x1150, 0x2001, 0xb635, - 0x2004, 0xd0cc, 0x1128, 0xa084, 0x0009, 0xa086, 0x0008, 0x1140, - 0x6007, 0x0009, 0x602b, 0x0009, 0x6013, 0x0000, 0x0804, 0xa46f, - 0x080c, 0x536b, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x6218, - 0x2270, 0x72a0, 0x0026, 0x2019, 0x0029, 0x080c, 0x6e67, 0x0076, - 0x2039, 0x0000, 0x080c, 0x6d74, 0x2c08, 0x080c, 0xaf3e, 0x007e, - 0x001e, 0x2e60, 0x080c, 0x521c, 0x001e, 0x002e, 0x003e, 0x00ce, - 0x00ee, 0x6618, 0x00c6, 0x2660, 0x080c, 0x502a, 0x00ce, 0xa6b0, - 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x0278, 0x080c, - 0xae82, 0x1904, 0xa360, 0x080c, 0xae22, 0x1120, 0x6007, 0x0008, - 0x0804, 0xa46f, 0x6007, 0x0009, 0x0804, 0xa46f, 0x080c, 0xb037, - 0x0128, 0x080c, 0xae82, 0x0d78, 0x0804, 0xa360, 0x6013, 0x1900, - 0x0c88, 0x080c, 0x2df4, 0x1904, 0xa673, 0x6106, 0x080c, 0xaddc, - 0x6007, 0x0006, 0x0804, 0xa46f, 0x6007, 0x0007, 0x0804, 0xa46f, - 0x080c, 0xb38c, 0x1904, 0xa673, 0x080c, 0x2df4, 0x1904, 0xa673, - 0x00d6, 0x6618, 0x2668, 0x6e04, 0xa684, 0x00ff, 0xa082, 0x0006, - 0x1220, 0x2001, 0x0001, 0x080c, 0x4f5d, 0xa6b4, 0xff00, 0x8637, - 0xa686, 0x0006, 0x0188, 0xa686, 0x0004, 0x0170, 0x6e04, 0xa6b4, - 0x00ff, 0xa686, 0x0006, 0x0140, 0xa686, 0x0004, 0x0128, 0xa686, - 0x0005, 0x0110, 0x00de, 0x00e0, 0x080c, 0xaee0, 0x11a0, 0xa686, - 0x0006, 0x1150, 0x0026, 0x6218, 0xa290, 0x0028, 0x2214, 0x2009, - 0x0000, 0x080c, 0x2d16, 0x002e, 0x080c, 0x50bd, 0x6007, 0x000a, - 0x00de, 0x0804, 0xa46f, 0x6007, 0x000b, 0x00de, 0x0804, 0xa46f, - 0x080c, 0x2cd1, 0x6007, 0x0001, 0x0804, 0xa46f, 0x080c, 0xb38c, - 0x1904, 0xa673, 0x080c, 0x2df4, 0x1904, 0xa673, 0x6618, 0x00d6, - 0x2668, 0x6e04, 0x00de, 0xa686, 0x0707, 0x0d50, 0x0026, 0x6218, - 0xa290, 0x0028, 0x2214, 0x2009, 0x0000, 0x080c, 0x2d16, 0x002e, - 0x6007, 0x000c, 0x0804, 0xa46f, 0x080c, 0x537b, 0x1140, 0x2001, - 0xb635, 0x2004, 0xa084, 0x0009, 0xa086, 0x0008, 0x1110, 0x0804, - 0xa2b8, 0x080c, 0x536b, 0x6618, 0xa6b0, 0x0001, 0x2634, 0xa684, - 0x00ff, 0xa082, 0x0006, 0x06e8, 0x1138, 0x0026, 0x2001, 0x0006, - 0x080c, 0x4f9c, 0x002e, 0x0050, 0xa6b4, 0xff00, 0x8637, 0xa686, - 0x0004, 0x0120, 0xa686, 0x0006, 0x1904, 0xa360, 0x080c, 0xaeed, - 0x1120, 0x6007, 0x000e, 0x0804, 0xa46f, 0x0046, 0x6418, 0xa4a0, - 0x0028, 0x2424, 0xa4a4, 0x00ff, 0x8427, 0x0046, 0x080c, 0x2cd1, - 0x004e, 0x0016, 0xa006, 0x2009, 0xb653, 0x210c, 0xd1a4, 0x0158, - 0x2009, 0x0029, 0x080c, 0xb1a4, 0x6018, 0x00d6, 0x2068, 0x6800, - 0xc0e5, 0x6802, 0x00de, 0x001e, 0x004e, 0x6007, 0x0001, 0x0804, - 0xa46f, 0x2001, 0x0001, 0x080c, 0x4f5d, 0x0156, 0x0016, 0x0026, - 0x0036, 0x20a9, 0x0004, 0x2019, 0xb605, 0x2011, 0xbc90, 0x080c, - 0x9166, 0x003e, 0x002e, 0x001e, 0x015e, 0xa005, 0x0168, 0xa6b4, - 0xff00, 0x8637, 0xa682, 0x0004, 0x0a04, 0xa360, 0xa682, 0x0007, - 0x0a04, 0xa3ae, 0x0804, 0xa360, 0x6013, 0x1900, 0x6007, 0x0009, - 0x0804, 0xa46f, 0x080c, 0x537b, 0x1140, 0x2001, 0xb635, 0x2004, - 0xa084, 0x0009, 0xa086, 0x0008, 0x1110, 0x0804, 0xa2b8, 0x080c, - 0x536b, 0x6618, 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, - 0x0006, 0x06b8, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0004, 0x0120, - 0xa686, 0x0006, 0x1904, 0xa360, 0x080c, 0xaf15, 0x1138, 0x080c, - 0xae22, 0x1120, 0x6007, 0x0010, 0x0804, 0xa46f, 0x0046, 0x6418, - 0xa4a0, 0x0028, 0x2424, 0xa4a4, 0x00ff, 0x8427, 0x0046, 0x080c, - 0x2cd1, 0x004e, 0x0016, 0xa006, 0x2009, 0xb653, 0x210c, 0xd1a4, - 0x0158, 0x2009, 0x0029, 0x080c, 0xb1a4, 0x6018, 0x00d6, 0x2068, - 0x6800, 0xc0e5, 0x6802, 0x00de, 0x001e, 0x004e, 0x6007, 0x0001, - 0x00f0, 0x080c, 0xb037, 0x0140, 0xa6b4, 0xff00, 0x8637, 0xa686, - 0x0006, 0x0950, 0x0804, 0xa360, 0x6013, 0x1900, 0x6007, 0x0009, - 0x0070, 0x080c, 0x2df4, 0x1904, 0xa673, 0x080c, 0xb38c, 0x1904, - 0xa673, 0x080c, 0xa69b, 0x1904, 0xa360, 0x6007, 0x0012, 0x6003, - 0x0001, 0x080c, 0x6d45, 0x0005, 0x6007, 0x0001, 0x6003, 0x0001, - 0x080c, 0x6d45, 0x0cc0, 0x6007, 0x0005, 0x0cc0, 0x080c, 0xb38c, - 0x1904, 0xa673, 0x080c, 0x2df4, 0x1904, 0xa673, 0x080c, 0xa69b, - 0x1904, 0xa360, 0x6007, 0x0020, 0x6003, 0x0001, 0x080c, 0x6d45, - 0x0005, 0x080c, 0x2df4, 0x1904, 0xa673, 0x6007, 0x0023, 0x6003, - 0x0001, 0x080c, 0x6d45, 0x0005, 0x080c, 0xb38c, 0x1904, 0xa673, - 0x080c, 0x2df4, 0x1904, 0xa673, 0x080c, 0xa69b, 0x1904, 0xa360, - 0x0016, 0x0026, 0x2011, 0xbc91, 0x2214, 0xa286, 0xffff, 0x0190, - 0x2c08, 0x080c, 0x9d06, 0x01e0, 0x2260, 0x2011, 0xbc90, 0x2214, - 0x6008, 0xa206, 0x11a8, 0x6018, 0xa190, 0x0006, 0x2214, 0xa206, - 0x01e8, 0x0070, 0x2011, 0xbc90, 0x2214, 0x2c08, 0xa006, 0x080c, - 0xb176, 0x11a0, 0x2011, 0xbc91, 0x2214, 0xa286, 0xffff, 0x01c0, - 0x2160, 0x6007, 0x0026, 0x6013, 0x1700, 0x2011, 0xbc89, 0x2214, - 0xa296, 0xffff, 0x1180, 0x6007, 0x0025, 0x0068, 0x601c, 0xa086, - 0x0007, 0x1d70, 0x6004, 0xa086, 0x0024, 0x1110, 0x080c, 0x86a4, - 0x2160, 0x6007, 0x0025, 0x6003, 0x0001, 0x080c, 0x6d45, 0x002e, - 0x001e, 0x0005, 0x2001, 0x0001, 0x080c, 0x4f5d, 0x0156, 0x0016, - 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0xb605, 0x2011, 0xbc96, - 0x080c, 0x9166, 0x003e, 0x002e, 0x001e, 0x015e, 0x0120, 0x6007, - 0x0031, 0x0804, 0xa46f, 0x080c, 0x8e82, 0x080c, 0x5b41, 0x11b0, - 0x0006, 0x0026, 0x0036, 0x080c, 0x5b5d, 0x1158, 0x2001, 0xb89f, - 0x2003, 0x0001, 0x2001, 0xb600, 0x2003, 0x0001, 0x080c, 0x5a79, - 0x0010, 0x080c, 0x5b18, 0x003e, 0x002e, 0x000e, 0x0005, 0x080c, - 0x2df4, 0x1904, 0xa673, 0x080c, 0xa69b, 0x1904, 0xa360, 0x6106, - 0x080c, 0xa6b7, 0x6007, 0x002b, 0x0804, 0xa46f, 0x6007, 0x002c, - 0x0804, 0xa46f, 0x080c, 0xb38c, 0x1904, 0xa673, 0x080c, 0x2df4, - 0x1904, 0xa673, 0x080c, 0xa69b, 0x1904, 0xa360, 0x6106, 0x080c, - 0xa6bb, 0x1120, 0x6007, 0x002e, 0x0804, 0xa46f, 0x6007, 0x002f, - 0x0804, 0xa46f, 0x080c, 0x2df4, 0x1904, 0xa673, 0x00e6, 0x00d6, - 0x00c6, 0x6018, 0xa080, 0x0001, 0x200c, 0xa184, 0x00ff, 0xa086, - 0x0006, 0x0158, 0xa184, 0xff00, 0x8007, 0xa086, 0x0006, 0x0128, - 0x00ce, 0x00de, 0x00ee, 0x0804, 0xa474, 0x2001, 0xb672, 0x2004, - 0xd0e4, 0x0904, 0xa5c9, 0x2071, 0xbc8c, 0x7010, 0x6036, 0x7014, - 0x603a, 0x7108, 0x720c, 0x2001, 0xb653, 0x2004, 0xd0a4, 0x0140, - 0x6018, 0x2068, 0x6810, 0xa106, 0x1118, 0x6814, 0xa206, 0x01f8, - 0x2001, 0xb653, 0x2004, 0xd0ac, 0x1590, 0x2069, 0xb600, 0x6874, - 0xa206, 0x1568, 0x6870, 0xa106, 0x1550, 0x7210, 0x080c, 0x9d06, - 0x0558, 0x080c, 0xb210, 0x0540, 0x622a, 0x6007, 0x0036, 0x6003, - 0x0001, 0x080c, 0x6cff, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x7214, - 0xa286, 0xffff, 0x0150, 0x080c, 0x9d06, 0x01b0, 0xa280, 0x0002, - 0x2004, 0x7110, 0xa106, 0x1180, 0x0c08, 0x7210, 0x2c08, 0xa085, - 0x0001, 0x080c, 0xb176, 0x2c10, 0x2160, 0x0130, 0x08b8, 0x6007, - 0x0037, 0x6013, 0x1500, 0x08d8, 0x6007, 0x0037, 0x6013, 0x1700, - 0x08b0, 0x6007, 0x0012, 0x0898, 0x080c, 0x2df4, 0x1904, 0xa673, - 0x6018, 0xa080, 0x0001, 0x2004, 0xa084, 0xff00, 0x8007, 0xa086, - 0x0006, 0x1904, 0xa474, 0x00e6, 0x00d6, 0x00c6, 0x2001, 0xb672, - 0x2004, 0xd0e4, 0x0904, 0xa635, 0x2069, 0xb600, 0x2071, 0xbc8c, - 0x7008, 0x6036, 0x720c, 0x623a, 0xa286, 0xffff, 0x1150, 0x7208, - 0x00c6, 0x2c08, 0xa085, 0x0001, 0x080c, 0xb176, 0x2c10, 0x00ce, - 0x0588, 0x080c, 0x9d06, 0x0570, 0x00c6, 0x0026, 0x2260, 0x080c, - 0x99d9, 0x002e, 0x00ce, 0x7118, 0xa18c, 0xff00, 0x810f, 0xa186, - 0x0001, 0x0158, 0xa186, 0x0005, 0x0118, 0xa186, 0x0007, 0x1178, - 0xa280, 0x0004, 0x2004, 0xa005, 0x0150, 0x0056, 0x7510, 0x7614, - 0x080c, 0xb227, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x6007, - 0x003b, 0x602b, 0x0009, 0x6013, 0x2a00, 0x6003, 0x0001, 0x080c, - 0x6cff, 0x0c88, 0x6007, 0x003b, 0x602b, 0x0009, 0x6013, 0x1700, - 0x6003, 0x0001, 0x080c, 0x6cff, 0x0c30, 0x6007, 0x003b, 0x602b, - 0x000b, 0x6013, 0x0000, 0x0804, 0xa59f, 0x00e6, 0x0026, 0x080c, - 0x537b, 0x0558, 0x080c, 0x536b, 0x080c, 0xb407, 0x1520, 0x2071, - 0xb600, 0x70d4, 0xc085, 0x70d6, 0x00f6, 0x2079, 0x0100, 0x72a0, - 0xa284, 0x00ff, 0x7072, 0x78e6, 0xa284, 0xff00, 0x7274, 0xa205, - 0x7076, 0x78ea, 0x00fe, 0x70df, 0x0000, 0x2001, 0xb653, 0x2004, - 0xd0a4, 0x0120, 0x2011, 0xb8fa, 0x2013, 0x07d0, 0xd0ac, 0x1128, - 0x080c, 0x2aed, 0x0010, 0x080c, 0xb433, 0x002e, 0x00ee, 0x080c, - 0x86a4, 0x0804, 0xa473, 0x080c, 0x86a4, 0x0005, 0x2600, 0x0002, - 0xa681, 0xa681, 0xa681, 0xa681, 0xa681, 0xa683, 0xa681, 0xa681, - 0xa681, 0x080c, 0x151a, 0x080c, 0xb38c, 0x1d68, 0x080c, 0x2df4, - 0x1d50, 0x0089, 0x1138, 0x6007, 0x0045, 0x6003, 0x0001, 0x080c, - 0x6d45, 0x0005, 0x080c, 0x2cd1, 0x6007, 0x0001, 0x6003, 0x0001, - 0x080c, 0x6d45, 0x0005, 0x00d6, 0x0066, 0x6618, 0x2668, 0x6e04, - 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0170, 0xa686, 0x0004, - 0x0158, 0x6e04, 0xa6b4, 0x00ff, 0xa686, 0x0006, 0x0128, 0xa686, - 0x0004, 0x0110, 0xa085, 0x0001, 0x006e, 0x00de, 0x0005, 0x00d6, - 0x0449, 0x00de, 0x0005, 0x00d6, 0x0491, 0x11f0, 0x680c, 0xa08c, - 0xff00, 0x6820, 0xa084, 0x00ff, 0xa115, 0x6212, 0x6824, 0x602a, - 0xd1e4, 0x0118, 0x2009, 0x0001, 0x0060, 0xd1ec, 0x0168, 0x6920, - 0xa18c, 0x00ff, 0x6824, 0x080c, 0x2852, 0x1130, 0x2110, 0x2009, - 0x0000, 0x080c, 0x2d16, 0x0018, 0xa085, 0x0001, 0x0008, 0xa006, - 0x00de, 0x0005, 0x2069, 0xbc8d, 0x6800, 0xa082, 0x0010, 0x1228, - 0x6013, 0x0000, 0xa085, 0x0001, 0x0008, 0xa006, 0x0005, 0x6013, - 0x0000, 0x2069, 0xbc8c, 0x6808, 0xa084, 0xff00, 0xa086, 0x0800, - 0x1140, 0x6800, 0xa084, 0x00ff, 0xa08e, 0x0014, 0x0110, 0xa08e, - 0x0010, 0x0005, 0x6004, 0xa0b2, 0x0080, 0x1a0c, 0x151a, 0xa1b6, - 0x0013, 0x1130, 0x2008, 0xa1b2, 0x0040, 0x1a04, 0xa802, 0x0092, - 0xa1b6, 0x0027, 0x0120, 0xa1b6, 0x0014, 0x190c, 0x151a, 0x2001, - 0x0007, 0x080c, 0x4f9c, 0x080c, 0x7102, 0x080c, 0x9ed9, 0x080c, - 0x71e5, 0x0005, 0xa762, 0xa764, 0xa762, 0xa762, 0xa762, 0xa764, - 0xa776, 0xa7fb, 0xa7c6, 0xa7fb, 0xa7d7, 0xa7fb, 0xa776, 0xa7fb, - 0xa7f3, 0xa7fb, 0xa7f3, 0xa7fb, 0xa7fb, 0xa762, 0xa762, 0xa762, - 0xa762, 0xa762, 0xa762, 0xa762, 0xa762, 0xa762, 0xa762, 0xa762, - 0xa764, 0xa762, 0xa7fb, 0xa762, 0xa762, 0xa7fb, 0xa762, 0xa7f8, - 0xa7fb, 0xa762, 0xa762, 0xa762, 0xa762, 0xa7fb, 0xa7fb, 0xa762, - 0xa7fb, 0xa7fb, 0xa762, 0xa770, 0xa762, 0xa762, 0xa762, 0xa762, - 0xa7f7, 0xa7fb, 0xa762, 0xa762, 0xa7fb, 0xa7fb, 0xa762, 0xa762, - 0xa762, 0xa762, 0x080c, 0x151a, 0x080c, 0x7102, 0x2001, 0xb8b6, - 0x2004, 0x6016, 0x6003, 0x0002, 0x080c, 0x71e5, 0x0804, 0xa801, - 0x2001, 0x0000, 0x080c, 0x4f5d, 0x0804, 0xa7fb, 0x00f6, 0x2079, - 0xb652, 0x7804, 0x00fe, 0xd0ac, 0x1904, 0xa7fb, 0x2001, 0x0000, - 0x080c, 0x4f5d, 0x6018, 0xa080, 0x0004, 0x2004, 0xa086, 0x00ff, - 0x1140, 0x00f6, 0x2079, 0xb600, 0x7898, 0x8000, 0x789a, 0x00fe, - 0x00e0, 0x00c6, 0x6018, 0x2060, 0x6000, 0xd0f4, 0x1140, 0x6010, - 0xa005, 0x0128, 0x00ce, 0x080c, 0x3f85, 0x0804, 0xa7fb, 0x00ce, - 0x2001, 0xb600, 0x2004, 0xa086, 0x0002, 0x1138, 0x00f6, 0x2079, - 0xb600, 0x7898, 0x8000, 0x789a, 0x00fe, 0x2001, 0x0002, 0x080c, - 0x4f6f, 0x080c, 0x7102, 0x601f, 0x0001, 0x6003, 0x0001, 0x6007, - 0x0002, 0x080c, 0x6d45, 0x080c, 0x71e5, 0x00c6, 0x6118, 0x2160, - 0x2009, 0x0001, 0x080c, 0x6a1a, 0x00ce, 0x04d8, 0x6618, 0x00d6, - 0x2668, 0x6e04, 0x00de, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, - 0x0550, 0xa686, 0x0004, 0x0538, 0x2001, 0x0004, 0x0410, 0x2001, - 0xb600, 0x2004, 0xa086, 0x0003, 0x1110, 0x080c, 0x3f85, 0x2001, - 0x0006, 0x04a1, 0x6618, 0x00d6, 0x2668, 0x6e04, 0x00de, 0xa6b4, - 0xff00, 0x8637, 0xa686, 0x0006, 0x0170, 0x2001, 0x0006, 0x0048, - 0x2001, 0x0004, 0x0030, 0x2001, 0x0006, 0x0401, 0x0020, 0x0018, - 0x0010, 0x080c, 0x4f9c, 0x080c, 0x7102, 0x080c, 0x86a4, 0x080c, - 0x71e5, 0x0005, 0x2600, 0x0002, 0xa80d, 0xa80d, 0xa80d, 0xa80d, - 0xa80d, 0xa80f, 0xa80d, 0xa80d, 0xa80d, 0x080c, 0x151a, 0x080c, - 0x7102, 0x080c, 0x86a4, 0x080c, 0x71e5, 0x0005, 0x0016, 0x00d6, - 0x6118, 0x2168, 0x6900, 0xd184, 0x0140, 0x080c, 0x4f6f, 0x2001, - 0x0000, 0x080c, 0x4f5d, 0x080c, 0x2cf7, 0x00de, 0x001e, 0x0005, - 0x00d6, 0x6618, 0x2668, 0x6804, 0xa084, 0xff00, 0x8007, 0x00de, - 0xa0b2, 0x000c, 0x1a0c, 0x151a, 0xa1b6, 0x0015, 0x1110, 0x003b, - 0x0028, 0xa1b6, 0x0016, 0x190c, 0x151a, 0x006b, 0x0005, 0x8d6b, - 0x8d6b, 0x8d6b, 0x8d6b, 0x8d6b, 0x8d6b, 0xa898, 0xa857, 0x8d6b, - 0x8d6b, 0x8d6b, 0x8d6b, 0x8d6b, 0x8d6b, 0x8d6b, 0x8d6b, 0x8d6b, - 0x8d6b, 0xa898, 0xa89f, 0x8d6b, 0x8d6b, 0x8d6b, 0x8d6b, 0x00f6, - 0x2079, 0xb652, 0x7804, 0xd0ac, 0x11e0, 0x6018, 0xa07d, 0x01c8, - 0x7800, 0xd0f4, 0x1118, 0x7810, 0xa005, 0x1198, 0x2001, 0x0000, - 0x080c, 0x4f5d, 0x2001, 0x0002, 0x080c, 0x4f6f, 0x601f, 0x0001, - 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x6d45, 0x080c, 0x71e5, - 0x00e8, 0x2011, 0xbc83, 0x2204, 0x8211, 0x220c, 0x080c, 0x2852, - 0x11a8, 0x00c6, 0x080c, 0x501b, 0x0120, 0x00ce, 0x080c, 0x86a4, - 0x0068, 0x6010, 0x0006, 0x6014, 0x0006, 0x080c, 0x4c7e, 0x000e, - 0x6016, 0x000e, 0x6012, 0x00ce, 0x080c, 0x86a4, 0x00fe, 0x0005, - 0x6604, 0xa6b6, 0x001e, 0x1110, 0x080c, 0x86a4, 0x0005, 0x080c, - 0x9021, 0x1138, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x6d45, - 0x0010, 0x080c, 0x86a4, 0x0005, 0x6004, 0xa08a, 0x0080, 0x1a0c, - 0x151a, 0x080c, 0x7102, 0x080c, 0x9ed9, 0x080c, 0x71e5, 0x0005, - 0xa182, 0x0040, 0x0002, 0xa8ce, 0xa8ce, 0xa8ce, 0xa8ce, 0xa8d0, - 0xa8ce, 0xa8ce, 0xa8ce, 0xa8ce, 0xa8ce, 0xa8ce, 0xa8ce, 0xa8ce, - 0xa8ce, 0xa8ce, 0xa8ce, 0xa8ce, 0xa8ce, 0xa8ce, 0x080c, 0x151a, - 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x0046, 0x0026, 0x6218, 0xa280, - 0x002b, 0x2004, 0xa005, 0x0120, 0x2021, 0x0000, 0x080c, 0xb3d8, - 0x6106, 0x2071, 0xbc80, 0x7444, 0xa4a4, 0xff00, 0x0904, 0xa934, - 0xa486, 0x2000, 0x1130, 0x2009, 0x0001, 0x2011, 0x0200, 0x080c, - 0x6b8c, 0x080c, 0x15fd, 0x090c, 0x151a, 0x6003, 0x0007, 0x2d00, - 0x6837, 0x010d, 0x6803, 0x0000, 0x683b, 0x0000, 0x6c5a, 0x2c00, - 0x685e, 0x6008, 0x68b2, 0x6018, 0x2078, 0x78a0, 0x8007, 0x7130, - 0x694a, 0x0016, 0xa084, 0xff00, 0x6846, 0x684f, 0x0000, 0x6853, - 0x0000, 0x6857, 0x0036, 0x080c, 0x547a, 0x001e, 0xa486, 0x2000, - 0x1130, 0x2019, 0x0017, 0x080c, 0xb121, 0x0804, 0xa991, 0xa486, - 0x0400, 0x1130, 0x2019, 0x0002, 0x080c, 0xb0d3, 0x0804, 0xa991, - 0xa486, 0x0200, 0x1110, 0x080c, 0xb0b8, 0xa486, 0x1000, 0x1110, - 0x080c, 0xb106, 0x0804, 0xa991, 0x2069, 0xb975, 0x6a00, 0xd284, - 0x0904, 0xa9f8, 0xa284, 0x0300, 0x1904, 0xa9f1, 0x6804, 0xa005, - 0x0904, 0xa9d9, 0x2d78, 0x6003, 0x0007, 0x080c, 0x15e4, 0x0904, - 0xa998, 0x7800, 0xd08c, 0x1118, 0x7804, 0x8001, 0x7806, 0x6013, - 0x0000, 0x6803, 0x0000, 0x6837, 0x0116, 0x683b, 0x0000, 0x6008, - 0x68b2, 0x2c00, 0x684a, 0x6018, 0x2078, 0x78a0, 0x8007, 0x7130, - 0x6986, 0x6846, 0x7928, 0x698a, 0x792c, 0x698e, 0x7930, 0x6992, - 0x7934, 0x6996, 0x6853, 0x003d, 0x7244, 0xa294, 0x0003, 0xa286, - 0x0002, 0x1118, 0x684f, 0x0040, 0x0040, 0xa286, 0x0001, 0x1118, - 0x684f, 0x0080, 0x0010, 0x684f, 0x0000, 0x20a9, 0x000a, 0x2001, - 0xbc90, 0xad90, 0x0015, 0x200c, 0x810f, 0x2112, 0x8000, 0x8210, - 0x1f04, 0xa983, 0x200c, 0x6982, 0x8000, 0x200c, 0x697e, 0x080c, - 0x547a, 0x002e, 0x004e, 0x015e, 0x00fe, 0x00ee, 0x00de, 0x0005, - 0x2001, 0xb60e, 0x2004, 0xd084, 0x0120, 0x080c, 0x15fd, 0x1904, - 0xa949, 0x6013, 0x0100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, - 0x6cff, 0x080c, 0x71e5, 0x0c28, 0x2069, 0xbc92, 0x2d04, 0xa084, - 0xff00, 0xa086, 0x1200, 0x11a8, 0x2069, 0xbc80, 0x686c, 0xa084, - 0x00ff, 0x0016, 0x6110, 0xa18c, 0x0700, 0xa10d, 0x6112, 0x001e, - 0x6003, 0x0001, 0x6007, 0x0043, 0x080c, 0x6cff, 0x080c, 0x71e5, - 0x0840, 0x6868, 0x602a, 0x686c, 0x602e, 0x6013, 0x0200, 0x6003, - 0x0001, 0x6007, 0x0041, 0x080c, 0x6cff, 0x080c, 0x71e5, 0x0804, - 0xa991, 0x2001, 0xb60d, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, - 0x080c, 0x3f13, 0x6013, 0x0300, 0x0010, 0x6013, 0x0100, 0x6003, - 0x0001, 0x6007, 0x0041, 0x080c, 0x6cff, 0x080c, 0x71e5, 0x0804, - 0xa991, 0x6013, 0x0500, 0x0c98, 0x6013, 0x0600, 0x0804, 0xa9ac, - 0x6013, 0x0200, 0x0804, 0xa9ac, 0xa186, 0x0013, 0x1170, 0x6004, - 0xa08a, 0x0040, 0x0a0c, 0x151a, 0xa08a, 0x0053, 0x1a0c, 0x151a, - 0xa082, 0x0040, 0x2008, 0x0804, 0xaa86, 0xa186, 0x0051, 0x0138, - 0xa186, 0x0047, 0x11d8, 0x6004, 0xa086, 0x0041, 0x0518, 0x2001, - 0x0109, 0x2004, 0xd084, 0x01f0, 0x0126, 0x2091, 0x2800, 0x0006, - 0x0016, 0x0026, 0x080c, 0x6be6, 0x002e, 0x001e, 0x000e, 0x012e, - 0x6000, 0xa086, 0x0002, 0x1170, 0x0804, 0xaac9, 0xa186, 0x0027, - 0x0120, 0xa186, 0x0014, 0x190c, 0x151a, 0x6004, 0xa082, 0x0040, - 0x2008, 0x001a, 0x080c, 0x86ef, 0x0005, 0xaa50, 0xaa52, 0xaa52, - 0xaa76, 0xaa50, 0xaa50, 0xaa50, 0xaa50, 0xaa50, 0xaa50, 0xaa50, - 0xaa50, 0xaa50, 0xaa50, 0xaa50, 0xaa50, 0xaa50, 0xaa50, 0xaa50, - 0x080c, 0x151a, 0x080c, 0x7102, 0x080c, 0x71e5, 0x0036, 0x00d6, - 0x6010, 0xa06d, 0x01c0, 0xad84, 0xf000, 0x01a8, 0x6003, 0x0002, - 0x6018, 0x2004, 0xd0bc, 0x1178, 0x2019, 0x0004, 0x080c, 0xb155, - 0x6013, 0x0000, 0x6014, 0xa005, 0x1120, 0x2001, 0xb8b7, 0x2004, - 0x6016, 0x6003, 0x0007, 0x00de, 0x003e, 0x0005, 0x00d6, 0x080c, - 0x7102, 0x080c, 0x71e5, 0x080c, 0x9d16, 0x0120, 0x6010, 0x2068, - 0x080c, 0x1614, 0x080c, 0x9ed9, 0x00de, 0x0005, 0x0002, 0xaa9a, - 0xaab7, 0xaaa3, 0xaac3, 0xaa9a, 0xaa9a, 0xaa9a, 0xaa9a, 0xaa9a, - 0xaa9a, 0xaa9a, 0xaa9a, 0xaa9a, 0xaa9a, 0xaa9a, 0xaa9a, 0xaa9a, - 0xaa9a, 0xaa9a, 0x080c, 0x151a, 0x6010, 0xa088, 0x0013, 0x2104, - 0xa085, 0x0400, 0x200a, 0x080c, 0x7102, 0x6010, 0xa080, 0x0013, - 0x2004, 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009, 0x0043, 0x080c, - 0x86d3, 0x0010, 0x6003, 0x0002, 0x080c, 0x71e5, 0x0005, 0x080c, - 0x7102, 0x080c, 0xb393, 0x1120, 0x080c, 0x6b61, 0x080c, 0x86a4, - 0x080c, 0x71e5, 0x0005, 0x080c, 0x7102, 0x2009, 0x0041, 0x0804, - 0xac12, 0xa182, 0x0040, 0x0002, 0xaadf, 0xaae1, 0xaadf, 0xaadf, - 0xaadf, 0xaadf, 0xaadf, 0xaae2, 0xaadf, 0xaadf, 0xaadf, 0xaadf, - 0xaadf, 0xaadf, 0xaadf, 0xaadf, 0xaadf, 0xaaed, 0xaadf, 0x080c, - 0x151a, 0x0005, 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005, 0x3d18, - 0x3e20, 0x2c10, 0x080c, 0x1863, 0x0005, 0x00d6, 0x080c, 0x6b61, - 0x00de, 0x080c, 0xb3f6, 0x080c, 0x86a4, 0x0005, 0xa182, 0x0040, - 0x0002, 0xab0c, 0xab0c, 0xab0c, 0xab0c, 0xab0c, 0xab0c, 0xab0c, - 0xab0e, 0xab0c, 0xab11, 0xab4a, 0xab0c, 0xab0c, 0xab0c, 0xab0c, - 0xab4a, 0xab0c, 0xab0c, 0xab0c, 0x080c, 0x151a, 0x080c, 0x86ef, - 0x0005, 0x2001, 0xb672, 0x2004, 0xd0e4, 0x0158, 0x2001, 0x0100, - 0x2004, 0xa082, 0x0005, 0x0228, 0x2001, 0x011f, 0x2004, 0x6036, - 0x0010, 0x6037, 0x0000, 0x080c, 0x7198, 0x080c, 0x72a2, 0x6010, - 0x00d6, 0x2068, 0x684c, 0xd0fc, 0x0150, 0xa08c, 0x0003, 0xa18e, - 0x0002, 0x0168, 0x2009, 0x0041, 0x00de, 0x0804, 0xac12, 0x6003, - 0x0007, 0x6017, 0x0000, 0x080c, 0x6b61, 0x00de, 0x0005, 0x080c, - 0xb393, 0x0110, 0x00de, 0x0005, 0x080c, 0x6b61, 0x080c, 0x86a4, - 0x00de, 0x0ca0, 0x0036, 0x080c, 0x7198, 0x080c, 0x72a2, 0x6010, - 0x00d6, 0x2068, 0x6018, 0x2004, 0xd0bc, 0x0188, 0x684c, 0xa084, - 0x0003, 0xa086, 0x0002, 0x0140, 0x687c, 0x632c, 0xa31a, 0x632e, - 0x6880, 0x6328, 0xa31b, 0x632a, 0x6003, 0x0002, 0x0080, 0x2019, - 0x0004, 0x080c, 0xb155, 0x6014, 0xa005, 0x1128, 0x2001, 0xb8b7, - 0x2004, 0x8003, 0x6016, 0x6013, 0x0000, 0x6003, 0x0007, 0x00de, - 0x003e, 0x0005, 0xa186, 0x0013, 0x1150, 0x6004, 0xa086, 0x0042, - 0x190c, 0x151a, 0x080c, 0x7102, 0x080c, 0x71e5, 0x0005, 0xa186, - 0x0027, 0x0118, 0xa186, 0x0014, 0x1180, 0x6004, 0xa086, 0x0042, - 0x190c, 0x151a, 0x2001, 0x0007, 0x080c, 0x4f9c, 0x080c, 0x7102, - 0x080c, 0x9ed9, 0x080c, 0x71e5, 0x0005, 0xa182, 0x0040, 0x0002, - 0xabb3, 0xabb3, 0xabb3, 0xabb3, 0xabb3, 0xabb3, 0xabb3, 0xabb5, - 0xabc1, 0xabb3, 0xabb3, 0xabb3, 0xabb3, 0xabb3, 0xabb3, 0xabb3, - 0xabb3, 0xabb3, 0xabb3, 0x080c, 0x151a, 0x0036, 0x0046, 0x20e1, - 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1863, 0x004e, 0x003e, - 0x0005, 0x6010, 0x00d6, 0x2068, 0x6810, 0x6a14, 0x0006, 0x0046, - 0x0056, 0x6c7c, 0xa422, 0x6d80, 0x2200, 0xa52b, 0x602c, 0xa420, - 0x642e, 0x6028, 0xa529, 0x652a, 0x005e, 0x004e, 0x000e, 0xa20d, - 0x1178, 0x684c, 0xd0fc, 0x0120, 0x2009, 0x0041, 0x00de, 0x0490, - 0x6003, 0x0007, 0x6017, 0x0000, 0x080c, 0x6b61, 0x00de, 0x0005, - 0x0006, 0x00f6, 0x2c78, 0x080c, 0x5377, 0x00fe, 0x000e, 0x0120, - 0x6003, 0x0002, 0x00de, 0x0005, 0x2009, 0xb60d, 0x210c, 0xd19c, - 0x0118, 0x6003, 0x0007, 0x0010, 0x6003, 0x0006, 0x0021, 0x080c, - 0x6b63, 0x00de, 0x0005, 0xd2fc, 0x0140, 0x8002, 0x8000, 0x8212, - 0xa291, 0x0000, 0x2009, 0x0009, 0x0010, 0x2009, 0x0015, 0x6a6a, - 0x6866, 0x0005, 0xa182, 0x0040, 0x0208, 0x0062, 0xa186, 0x0013, - 0x0120, 0xa186, 0x0014, 0x190c, 0x151a, 0x6020, 0xd0dc, 0x090c, - 0x151a, 0x0005, 0xac35, 0xac3c, 0xac48, 0xac54, 0xac35, 0xac35, - 0xac35, 0xac63, 0xac35, 0xac37, 0xac37, 0xac35, 0xac35, 0xac35, - 0xac35, 0xac37, 0xac35, 0xac37, 0xac35, 0x080c, 0x151a, 0x6020, - 0xd0dc, 0x090c, 0x151a, 0x0005, 0x6003, 0x0001, 0x6106, 0x080c, - 0x6cff, 0x0126, 0x2091, 0x8000, 0x080c, 0x71e5, 0x012e, 0x0005, - 0x6003, 0x0001, 0x6106, 0x080c, 0x6cff, 0x0126, 0x2091, 0x8000, - 0x080c, 0x71e5, 0x012e, 0x0005, 0x6003, 0x0003, 0x6106, 0x2c10, - 0x080c, 0x1fc5, 0x0126, 0x2091, 0x8000, 0x080c, 0x6d62, 0x080c, - 0x72a2, 0x012e, 0x0005, 0xa016, 0x080c, 0x1863, 0x0005, 0x0126, - 0x2091, 0x8000, 0x0036, 0x00d6, 0xa182, 0x0040, 0x0023, 0x00de, - 0x003e, 0x012e, 0x0005, 0xac83, 0xac85, 0xac97, 0xacb2, 0xac83, - 0xac83, 0xac83, 0xacc7, 0xac83, 0xac83, 0xac83, 0xac83, 0xac83, - 0xac83, 0xac83, 0xac83, 0x080c, 0x151a, 0x6010, 0x2068, 0x684c, - 0xd0fc, 0x01f8, 0xa09c, 0x0003, 0xa39e, 0x0003, 0x01d0, 0x6003, - 0x0001, 0x6106, 0x080c, 0x6cff, 0x080c, 0x71e5, 0x0498, 0x6010, - 0x2068, 0x684c, 0xd0fc, 0x0168, 0xa09c, 0x0003, 0xa39e, 0x0003, - 0x0140, 0x6003, 0x0001, 0x6106, 0x080c, 0x6cff, 0x080c, 0x71e5, - 0x0408, 0x6013, 0x0000, 0x6017, 0x0000, 0x2019, 0x0004, 0x080c, - 0xb155, 0x00c0, 0x6010, 0x2068, 0x684c, 0xd0fc, 0x0d90, 0xa09c, - 0x0003, 0xa39e, 0x0003, 0x0d68, 0x6003, 0x0003, 0x6106, 0x2c10, - 0x080c, 0x1fc5, 0x080c, 0x6d62, 0x080c, 0x72a2, 0x0018, 0xa016, - 0x080c, 0x1863, 0x0005, 0x080c, 0x7102, 0x6110, 0x81ff, 0x0158, - 0x00d6, 0x2168, 0x080c, 0xb43c, 0x0036, 0x2019, 0x0029, 0x080c, - 0xb155, 0x003e, 0x00de, 0x080c, 0x9ed9, 0x080c, 0x71e5, 0x0005, - 0x080c, 0x7198, 0x6110, 0x81ff, 0x0158, 0x00d6, 0x2168, 0x080c, - 0xb43c, 0x0036, 0x2019, 0x0029, 0x080c, 0xb155, 0x003e, 0x00de, - 0x080c, 0x9ed9, 0x080c, 0x72a2, 0x0005, 0xa182, 0x0085, 0x0002, - 0xad01, 0xacff, 0xacff, 0xad0d, 0xacff, 0xacff, 0xacff, 0x080c, - 0x151a, 0x6003, 0x000b, 0x6106, 0x080c, 0x6cff, 0x0126, 0x2091, - 0x8000, 0x080c, 0x71e5, 0x012e, 0x0005, 0x0026, 0x00e6, 0x080c, - 0xb38c, 0x0118, 0x080c, 0x86a4, 0x00d8, 0x2071, 0xbc80, 0x7224, - 0x6212, 0x7220, 0x080c, 0xb003, 0x0118, 0x6007, 0x0086, 0x0040, - 0x6007, 0x0087, 0x7224, 0xa296, 0xffff, 0x1110, 0x6007, 0x0086, - 0x6003, 0x0001, 0x080c, 0x6cff, 0x080c, 0x71e5, 0x080c, 0x72a2, - 0x00ee, 0x002e, 0x0005, 0xa186, 0x0013, 0x1160, 0x6004, 0xa08a, - 0x0085, 0x0a0c, 0x151a, 0xa08a, 0x008c, 0x1a0c, 0x151a, 0xa082, - 0x0085, 0x00a2, 0xa186, 0x0027, 0x0130, 0xa186, 0x0014, 0x0118, - 0x080c, 0x86ef, 0x0050, 0x2001, 0x0007, 0x080c, 0x4f9c, 0x080c, - 0x7102, 0x080c, 0x9ed9, 0x080c, 0x71e5, 0x0005, 0xad5d, 0xad5f, - 0xad5f, 0xad5d, 0xad5d, 0xad5d, 0xad5d, 0x080c, 0x151a, 0x080c, - 0x7102, 0x080c, 0x9ed9, 0x080c, 0x71e5, 0x0005, 0xa182, 0x0085, - 0x0a0c, 0x151a, 0xa182, 0x008c, 0x1a0c, 0x151a, 0xa182, 0x0085, - 0x0002, 0xad78, 0xad78, 0xad78, 0xad7a, 0xad78, 0xad78, 0xad78, - 0x080c, 0x151a, 0x0005, 0xa186, 0x0013, 0x0148, 0xa186, 0x0014, - 0x0130, 0xa186, 0x0027, 0x0118, 0x080c, 0x86ef, 0x0030, 0x080c, - 0x7102, 0x080c, 0x9ed9, 0x080c, 0x71e5, 0x0005, 0x0036, 0x080c, - 0xb3f6, 0x603f, 0x0000, 0x2019, 0x000b, 0x0031, 0x601f, 0x0006, - 0x6003, 0x0007, 0x003e, 0x0005, 0x0126, 0x0036, 0x2091, 0x8000, - 0x0086, 0x2c40, 0x0096, 0x2049, 0x0000, 0x080c, 0x81b7, 0x009e, - 0x008e, 0x1578, 0x0076, 0x2c38, 0x080c, 0x825d, 0x007e, 0x1548, - 0x6000, 0xa086, 0x0000, 0x0528, 0x601c, 0xa086, 0x0007, 0x0508, - 0x00d6, 0x6000, 0xa086, 0x0004, 0x1150, 0x080c, 0xb3f6, 0x601f, - 0x0007, 0x2001, 0xb8b6, 0x2004, 0x6016, 0x080c, 0x1952, 0x6010, - 0x2068, 0x080c, 0x9d16, 0x0110, 0x080c, 0xb155, 0x00de, 0x6013, - 0x0000, 0x080c, 0xb3f6, 0x601f, 0x0007, 0x2001, 0xb8b6, 0x2004, - 0x6016, 0x003e, 0x012e, 0x0005, 0x00f6, 0x00c6, 0x0036, 0x0156, - 0x2079, 0xbc80, 0x7938, 0x783c, 0x080c, 0x2852, 0x15b0, 0x0016, - 0x00c6, 0x080c, 0x501b, 0x1578, 0x001e, 0x002e, 0x0026, 0x0016, - 0x2019, 0x0029, 0x080c, 0x8320, 0x080c, 0x6e67, 0x0076, 0x2039, - 0x0000, 0x080c, 0x6d74, 0x007e, 0x001e, 0x0076, 0x2039, 0x0000, - 0x080c, 0xaf3e, 0x007e, 0x080c, 0x521c, 0x0026, 0x6204, 0xa294, - 0xff00, 0x8217, 0xa286, 0x0006, 0x0118, 0xa286, 0x0004, 0x1118, - 0x62a0, 0x080c, 0x2d8a, 0x002e, 0x001e, 0x080c, 0x4c7e, 0x6612, - 0x6516, 0xa006, 0x0010, 0x00ce, 0x001e, 0x015e, 0x003e, 0x00ce, - 0x00fe, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x2009, 0xb621, - 0x2104, 0xa086, 0x0074, 0x1904, 0xae77, 0x2069, 0xbc8e, 0x690c, - 0xa182, 0x0100, 0x06c0, 0x6908, 0xa184, 0x8000, 0x05e8, 0x2001, - 0xb89e, 0x2004, 0xa005, 0x1160, 0x6018, 0x2070, 0x7010, 0xa084, - 0x00ff, 0x0118, 0x7000, 0xd0f4, 0x0118, 0xa184, 0x0800, 0x0560, - 0x6910, 0xa18a, 0x0001, 0x0610, 0x6914, 0x2069, 0xbcae, 0x6904, - 0x81ff, 0x1198, 0x690c, 0xa182, 0x0100, 0x02a8, 0x6908, 0x81ff, - 0x1178, 0x6910, 0xa18a, 0x0001, 0x0288, 0x6918, 0xa18a, 0x0001, - 0x0298, 0x00d0, 0x6013, 0x0100, 0x00a0, 0x6013, 0x0300, 0x0088, - 0x6013, 0x0500, 0x0070, 0x6013, 0x0700, 0x0058, 0x6013, 0x0900, - 0x0040, 0x6013, 0x0b00, 0x0028, 0x6013, 0x0f00, 0x0010, 0x6013, - 0x2d00, 0xa085, 0x0001, 0x0008, 0xa006, 0x001e, 0x00ee, 0x00de, - 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x0026, 0x0036, 0x0156, 0x6218, - 0x2268, 0x6b04, 0xa394, 0x00ff, 0xa286, 0x0006, 0x0190, 0xa286, - 0x0004, 0x0178, 0xa394, 0xff00, 0x8217, 0xa286, 0x0006, 0x0148, - 0xa286, 0x0004, 0x0130, 0x00c6, 0x2d60, 0x080c, 0x502a, 0x00ce, - 0x04c0, 0x2011, 0xbc96, 0xad98, 0x000a, 0x20a9, 0x0004, 0x080c, - 0x9166, 0x1580, 0x2011, 0xbc9a, 0xad98, 0x0006, 0x20a9, 0x0004, - 0x080c, 0x9166, 0x1538, 0x0046, 0x0016, 0x6aa0, 0xa294, 0x00ff, - 0x8227, 0xa006, 0x2009, 0xb653, 0x210c, 0xd1a4, 0x0138, 0x2009, - 0x0029, 0x080c, 0xb1a4, 0x6800, 0xc0e5, 0x6802, 0x2019, 0x0029, - 0x080c, 0x6e67, 0x0076, 0x2039, 0x0000, 0x080c, 0x6d74, 0x2c08, - 0x080c, 0xaf3e, 0x007e, 0x2001, 0x0007, 0x080c, 0x4f9c, 0x001e, - 0x004e, 0xa006, 0x015e, 0x003e, 0x002e, 0x00de, 0x00ce, 0x0005, - 0x00d6, 0x2069, 0xbc8e, 0x6800, 0xa086, 0x0800, 0x0118, 0x6013, - 0x0000, 0x0008, 0xa006, 0x00de, 0x0005, 0x00c6, 0x00f6, 0x0016, - 0x0026, 0x0036, 0x0156, 0x2079, 0xbc8c, 0x7930, 0x7834, 0x080c, - 0x2852, 0x11a0, 0x080c, 0x501b, 0x1188, 0x2011, 0xbc90, 0xac98, - 0x000a, 0x20a9, 0x0004, 0x080c, 0x9166, 0x1140, 0x2011, 0xbc94, - 0xac98, 0x0006, 0x20a9, 0x0004, 0x080c, 0x9166, 0x015e, 0x003e, - 0x002e, 0x001e, 0x00fe, 0x00ce, 0x0005, 0x00c6, 0x0006, 0x0016, - 0x0026, 0x0036, 0x0156, 0x2011, 0xbc83, 0x2204, 0x8211, 0x220c, - 0x080c, 0x2852, 0x11a0, 0x080c, 0x501b, 0x1188, 0x2011, 0xbc96, - 0xac98, 0x000a, 0x20a9, 0x0004, 0x080c, 0x9166, 0x1140, 0x2011, - 0xbc9a, 0xac98, 0x0006, 0x20a9, 0x0004, 0x080c, 0x9166, 0x015e, - 0x003e, 0x002e, 0x001e, 0x000e, 0x00ce, 0x0005, 0x00e6, 0x00c6, - 0x0086, 0x0076, 0x0066, 0x0056, 0x0046, 0x0026, 0x0126, 0x2091, - 0x8000, 0x2740, 0x2029, 0xb8ea, 0x252c, 0x2021, 0xb8f0, 0x2424, - 0x2061, 0xbe00, 0x2071, 0xb600, 0x7648, 0x7068, 0x81ff, 0x0150, - 0x0006, 0xa186, 0xb9f5, 0x000e, 0x0128, 0x8001, 0xa602, 0x1a04, - 0xafbf, 0x0018, 0xa606, 0x0904, 0xafbf, 0x2100, 0xac06, 0x0904, - 0xafb6, 0x080c, 0xb1cc, 0x0904, 0xafb6, 0x671c, 0xa786, 0x0001, - 0x0904, 0xafda, 0xa786, 0x0004, 0x0904, 0xafda, 0xa786, 0x0007, - 0x05e8, 0x2500, 0xac06, 0x05d0, 0x2400, 0xac06, 0x05b8, 0x080c, - 0xb1dc, 0x15a0, 0x88ff, 0x0118, 0x6050, 0xa906, 0x1578, 0x00d6, - 0x6000, 0xa086, 0x0004, 0x1120, 0x0016, 0x080c, 0x1952, 0x001e, - 0xa786, 0x0008, 0x1148, 0x080c, 0x9f14, 0x1130, 0x080c, 0x8ca5, - 0x00de, 0x080c, 0x9ed9, 0x00d0, 0x6010, 0x2068, 0x080c, 0x9d16, - 0x0190, 0xa786, 0x0003, 0x1528, 0x6837, 0x0103, 0x6b4a, 0x6847, - 0x0000, 0x080c, 0xb43c, 0x0016, 0x080c, 0x9f88, 0x080c, 0x547a, - 0x001e, 0x080c, 0x9ecd, 0x00de, 0x080c, 0x9ed9, 0xace0, 0x0018, - 0x2001, 0xb617, 0x2004, 0xac02, 0x1210, 0x0804, 0xaf52, 0x012e, - 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee, - 0x0005, 0xa786, 0x0006, 0x1150, 0xa386, 0x0005, 0x0128, 0x080c, - 0xb43c, 0x080c, 0xb155, 0x08f8, 0x00de, 0x0c00, 0xa786, 0x000a, - 0x0968, 0x0850, 0x080c, 0xb1dc, 0x19c8, 0x81ff, 0x09b8, 0xa180, - 0x0001, 0x2004, 0xa086, 0x0018, 0x0130, 0xa180, 0x0001, 0x2004, - 0xa086, 0x002d, 0x1958, 0x6000, 0xa086, 0x0002, 0x1938, 0x080c, - 0x9f03, 0x0130, 0x080c, 0x9f14, 0x1908, 0x080c, 0x8ca5, 0x0038, - 0x080c, 0x2cf7, 0x080c, 0x9f14, 0x1110, 0x080c, 0x8ca5, 0x080c, - 0x9ed9, 0x0804, 0xafb6, 0x00c6, 0x00e6, 0x0016, 0x2c08, 0x2170, - 0xa006, 0x080c, 0xb176, 0x001e, 0x0120, 0x601c, 0xa084, 0x000f, - 0x001b, 0x00ee, 0x00ce, 0x0005, 0xb01c, 0xb01c, 0xb01c, 0xb01c, - 0xb01c, 0xb01c, 0xb01e, 0xb01c, 0xa006, 0x0005, 0x0046, 0x0016, - 0x7018, 0xa080, 0x0028, 0x2024, 0xa4a4, 0x00ff, 0x8427, 0x2c00, - 0x2009, 0x0020, 0x080c, 0xb1a4, 0x001e, 0x004e, 0x0036, 0x2019, - 0x0002, 0x080c, 0xad9c, 0x003e, 0xa085, 0x0001, 0x0005, 0x2001, - 0x0001, 0x080c, 0x4f5d, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, - 0x0004, 0x2019, 0xb605, 0x2011, 0xbc96, 0x080c, 0x9166, 0x003e, - 0x002e, 0x001e, 0x015e, 0xa005, 0x0005, 0x00f6, 0x00e6, 0x00c6, - 0x0086, 0x0076, 0x0066, 0x0026, 0x0126, 0x2091, 0x8000, 0x2740, - 0x2061, 0xbe00, 0x2079, 0x0001, 0x8fff, 0x0904, 0xb0ab, 0x2071, - 0xb600, 0x7648, 0x7068, 0x8001, 0xa602, 0x1a04, 0xb0ab, 0x88ff, - 0x0128, 0x2800, 0xac06, 0x15b0, 0x2079, 0x0000, 0x080c, 0xb1cc, - 0x0588, 0x2400, 0xac06, 0x0570, 0x671c, 0xa786, 0x0006, 0x1550, - 0xa786, 0x0007, 0x0538, 0x88ff, 0x1140, 0x6018, 0xa206, 0x1510, - 0x85ff, 0x0118, 0x6050, 0xa106, 0x11e8, 0x00d6, 0x6000, 0xa086, - 0x0004, 0x1150, 0x080c, 0xb3f6, 0x601f, 0x0007, 0x2001, 0xb8b6, - 0x2004, 0x6016, 0x080c, 0x1952, 0x6010, 0x2068, 0x080c, 0x9d16, - 0x0120, 0x0046, 0x080c, 0xb155, 0x004e, 0x00de, 0x080c, 0x9ed9, - 0x88ff, 0x1198, 0xace0, 0x0018, 0x2001, 0xb617, 0x2004, 0xac02, - 0x1210, 0x0804, 0xb05c, 0xa006, 0x012e, 0x002e, 0x006e, 0x007e, - 0x008e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0xa8c5, 0x0001, 0x0ca0, - 0x0076, 0x0056, 0x0086, 0x2041, 0x0000, 0x2029, 0x0001, 0x2c20, - 0x2019, 0x0002, 0x6218, 0x0096, 0x2049, 0x0000, 0x080c, 0x81b7, - 0x009e, 0x008e, 0x2039, 0x0000, 0x080c, 0x825d, 0x080c, 0xb04d, - 0x005e, 0x007e, 0x0005, 0x0026, 0x0046, 0x0056, 0x0076, 0x00c6, - 0x0156, 0x2c20, 0x2128, 0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, - 0x0036, 0x080c, 0x501b, 0x11b0, 0x2c10, 0x0056, 0x0086, 0x2041, - 0x0000, 0x2508, 0x2029, 0x0001, 0x0096, 0x2049, 0x0000, 0x080c, - 0x81b7, 0x009e, 0x008e, 0x2039, 0x0000, 0x080c, 0x825d, 0x080c, - 0xb04d, 0x005e, 0x003e, 0x001e, 0x8108, 0x1f04, 0xb0df, 0x015e, - 0x00ce, 0x007e, 0x005e, 0x004e, 0x002e, 0x0005, 0x0076, 0x0056, - 0x6218, 0x0086, 0x2041, 0x0000, 0x2029, 0x0001, 0x2019, 0x0048, - 0x0096, 0x2049, 0x0000, 0x080c, 0x81b7, 0x009e, 0x008e, 0x2039, - 0x0000, 0x080c, 0x825d, 0x2c20, 0x080c, 0xb04d, 0x005e, 0x007e, - 0x0005, 0x0026, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, - 0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, 0x0036, 0x080c, 0x501b, - 0x11c0, 0x2c10, 0x0086, 0x2041, 0x0000, 0x2828, 0x0046, 0x2021, - 0x0001, 0x080c, 0xb3d8, 0x004e, 0x0096, 0x2049, 0x0000, 0x080c, - 0x81b7, 0x009e, 0x008e, 0x2039, 0x0000, 0x080c, 0x825d, 0x080c, - 0xb04d, 0x003e, 0x001e, 0x8108, 0x1f04, 0xb12c, 0x015e, 0x00ce, - 0x007e, 0x005e, 0x004e, 0x002e, 0x0005, 0x0016, 0x00f6, 0x3800, - 0xd08c, 0x0130, 0xad82, 0x1000, 0x02b0, 0xad82, 0xb600, 0x0230, - 0xad82, 0xee00, 0x0280, 0xad82, 0xffff, 0x1268, 0x6800, 0xa07d, - 0x0138, 0x6803, 0x0000, 0x6b52, 0x080c, 0x547a, 0x2f68, 0x0cb0, - 0x6b52, 0x080c, 0x547a, 0x00fe, 0x001e, 0x0005, 0x00e6, 0x0046, - 0x0036, 0x2061, 0xbe00, 0xa005, 0x1138, 0x2071, 0xb600, 0x7448, - 0x7068, 0x8001, 0xa402, 0x12d8, 0x2100, 0xac06, 0x0168, 0x6000, - 0xa086, 0x0000, 0x0148, 0x6008, 0xa206, 0x1130, 0x6018, 0xa1a0, - 0x0006, 0x2424, 0xa406, 0x0140, 0xace0, 0x0018, 0x2001, 0xb617, - 0x2004, 0xac02, 0x1220, 0x0c40, 0xa085, 0x0001, 0x0008, 0xa006, - 0x003e, 0x004e, 0x00ee, 0x0005, 0x00d6, 0x0006, 0x080c, 0x15fd, - 0x000e, 0x090c, 0x151a, 0x6837, 0x010d, 0x685e, 0x0026, 0x2010, - 0x080c, 0x9d06, 0x2001, 0x0000, 0x0120, 0x2200, 0xa080, 0x0014, - 0x2004, 0x002e, 0x684a, 0x6956, 0x6c46, 0x684f, 0x0000, 0x2001, - 0xb8be, 0x2004, 0x6852, 0xa006, 0x68b2, 0x6802, 0x683a, 0x685a, - 0x080c, 0x547a, 0x00de, 0x0005, 0x6700, 0xa786, 0x0000, 0x0158, - 0xa786, 0x0001, 0x0140, 0xa786, 0x000a, 0x0128, 0xa786, 0x0009, - 0x0110, 0xa085, 0x0001, 0x0005, 0x00e6, 0x6018, 0x2070, 0x70a0, - 0xa206, 0x00ee, 0x0005, 0x0016, 0x6004, 0xa08e, 0x001e, 0x11a0, - 0x8007, 0x6130, 0xa18c, 0x00ff, 0xa105, 0x6032, 0x6007, 0x0085, - 0x6003, 0x000b, 0x601f, 0x0005, 0x2001, 0xb8b7, 0x2004, 0x6016, - 0x080c, 0x6cff, 0x080c, 0x71e5, 0x001e, 0x0005, 0xe000, 0xe000, - 0x0005, 0x6020, 0xd0e4, 0x0158, 0xd0cc, 0x0118, 0x080c, 0x9ff1, - 0x0030, 0x080c, 0xb3f6, 0x080c, 0x6b61, 0x080c, 0x86a4, 0x0005, - 0xa280, 0x0007, 0x2004, 0xa084, 0x000f, 0x0002, 0xb21f, 0xb21f, - 0xb21f, 0xb224, 0xb21f, 0xb221, 0xb221, 0xb21f, 0xb221, 0xa006, - 0x0005, 0x00c6, 0x2260, 0x00ce, 0xa085, 0x0001, 0x0005, 0xa280, - 0x0007, 0x2004, 0xa084, 0x000f, 0x0002, 0xb236, 0xb236, 0xb236, - 0xb236, 0xb236, 0xb236, 0xb241, 0xb236, 0xb236, 0x6007, 0x003b, - 0x602b, 0x0009, 0x6013, 0x2a00, 0x6003, 0x0001, 0x080c, 0x6cff, - 0x0005, 0x00c6, 0x2260, 0x080c, 0xb3f6, 0x603f, 0x0000, 0x6020, - 0xc0f4, 0xc0cc, 0x6022, 0x6037, 0x0000, 0x00ce, 0x00d6, 0x2268, - 0xa186, 0x0007, 0x1904, 0xb29c, 0x6810, 0xa005, 0x0138, 0xa080, - 0x0013, 0x2004, 0xd0fc, 0x1110, 0x00de, 0x08c0, 0x6007, 0x003a, - 0x6003, 0x0001, 0x080c, 0x6cff, 0x080c, 0x71e5, 0x00c6, 0x2d60, - 0x6100, 0xa186, 0x0002, 0x1904, 0xb325, 0x6010, 0xa005, 0x1138, - 0x6000, 0xa086, 0x0007, 0x190c, 0x151a, 0x0804, 0xb325, 0xa08c, - 0xf000, 0x1130, 0x0028, 0x2068, 0x6800, 0xa005, 0x1de0, 0x2d00, - 0xa080, 0x0013, 0x2004, 0xa084, 0x0003, 0xa086, 0x0002, 0x1180, - 0x6010, 0x2068, 0x684c, 0xc0dc, 0xc0f4, 0x684e, 0x6850, 0xc0f4, - 0xc0fc, 0x6852, 0x2009, 0x0043, 0x080c, 0xac12, 0x0804, 0xb325, - 0x2009, 0x0041, 0x0804, 0xb31f, 0xa186, 0x0005, 0x15f0, 0x6810, - 0xa080, 0x0013, 0x2004, 0xd0bc, 0x1118, 0x00de, 0x0804, 0xb236, - 0xd0b4, 0x0128, 0xd0fc, 0x090c, 0x151a, 0x0804, 0xb254, 0x6007, - 0x003a, 0x6003, 0x0001, 0x080c, 0x6cff, 0x080c, 0x71e5, 0x00c6, - 0x2d60, 0x6100, 0xa186, 0x0002, 0x0120, 0xa186, 0x0004, 0x1904, - 0xb325, 0x2071, 0xb924, 0x7000, 0xa086, 0x0003, 0x1128, 0x7004, - 0xac06, 0x1110, 0x7003, 0x0000, 0x6810, 0xa080, 0x0013, 0x200c, - 0xc1f4, 0xc1dc, 0x2102, 0x8000, 0x200c, 0xc1f4, 0xc1fc, 0xc1bc, - 0x2102, 0x2009, 0x0042, 0x0804, 0xb31f, 0x0036, 0x00d6, 0x00d6, - 0x080c, 0x15fd, 0x003e, 0x090c, 0x151a, 0x6837, 0x010d, 0x6803, - 0x0000, 0x683b, 0x0000, 0x685b, 0x0000, 0x6b5e, 0x6857, 0x0045, - 0x2c00, 0x6862, 0x6034, 0x6872, 0x2360, 0x6020, 0xc0dd, 0x6022, - 0x6018, 0xa080, 0x0028, 0x2004, 0xa084, 0x00ff, 0x8007, 0x6350, - 0x6b4a, 0x6846, 0x684f, 0x0000, 0x6853, 0x0000, 0x6d6a, 0x6e66, - 0x686f, 0x0001, 0x080c, 0x547a, 0x2019, 0x0045, 0x6008, 0x2068, - 0x080c, 0xad9c, 0x2d00, 0x600a, 0x601f, 0x0006, 0x6003, 0x0007, - 0x6017, 0x0000, 0x603f, 0x0000, 0x00de, 0x003e, 0x0038, 0x603f, - 0x0000, 0x6003, 0x0007, 0x080c, 0xac12, 0x00ce, 0x00de, 0x0005, - 0xa186, 0x0013, 0x1128, 0x6004, 0xa082, 0x0085, 0x2008, 0x00c2, - 0xa186, 0x0027, 0x1178, 0x080c, 0x7102, 0x0036, 0x00d6, 0x6010, - 0x2068, 0x2019, 0x0004, 0x080c, 0xb155, 0x00de, 0x003e, 0x080c, - 0x71e5, 0x0005, 0xa186, 0x0014, 0x0d70, 0x080c, 0x86ef, 0x0005, - 0xb351, 0xb34f, 0xb34f, 0xb34f, 0xb34f, 0xb34f, 0xb351, 0x080c, - 0x151a, 0x080c, 0x7102, 0x6003, 0x000c, 0x080c, 0x71e5, 0x0005, - 0xa182, 0x008c, 0x1220, 0xa182, 0x0085, 0x0208, 0x001a, 0x080c, - 0x86ef, 0x0005, 0xb369, 0xb369, 0xb369, 0xb369, 0xb36b, 0xb389, - 0xb369, 0x080c, 0x151a, 0x00d6, 0x2c68, 0x080c, 0x864e, 0x01a0, - 0x6003, 0x0001, 0x6007, 0x001e, 0x2009, 0xbc8e, 0x210c, 0x6136, - 0x2009, 0xbc8f, 0x210c, 0x613a, 0x600b, 0xffff, 0x6918, 0x611a, - 0x601f, 0x0004, 0x080c, 0x6cff, 0x2d60, 0x080c, 0x86a4, 0x00de, - 0x0005, 0x080c, 0x86a4, 0x0005, 0x00e6, 0x6018, 0x2070, 0x7000, - 0xd0ec, 0x00ee, 0x0005, 0x6010, 0xa08c, 0xf000, 0x0904, 0xb3d7, - 0xa080, 0x0013, 0x200c, 0xd1ec, 0x05d0, 0x2001, 0xb672, 0x2004, - 0xd0ec, 0x05a8, 0x6003, 0x0002, 0x6020, 0xc0e5, 0x6022, 0xd1ac, - 0x0180, 0x00f6, 0x2c78, 0x080c, 0x5373, 0x00fe, 0x0150, 0x2001, - 0xb8b8, 0x2004, 0x603e, 0x2009, 0xb672, 0x210c, 0xd1f4, 0x11e8, - 0x0080, 0x2009, 0xb672, 0x210c, 0xd1f4, 0x0128, 0x6020, 0xc0e4, - 0x6022, 0xa006, 0x00a0, 0x2001, 0xb8b8, 0x200c, 0x8103, 0xa100, - 0x603e, 0x6018, 0xa088, 0x002b, 0x2104, 0xa005, 0x0118, 0xa088, - 0x0003, 0x0cd0, 0x2c0a, 0x600f, 0x0000, 0xa085, 0x0001, 0x0005, - 0x0016, 0x00c6, 0x00e6, 0x6150, 0xa2f0, 0x002b, 0x2e04, 0x2060, - 0x8cff, 0x0180, 0x84ff, 0x1118, 0x6050, 0xa106, 0x1138, 0x600c, - 0x2072, 0x080c, 0x6b61, 0x080c, 0x86a4, 0x0010, 0xacf0, 0x0003, - 0x2e64, 0x0c70, 0x00ee, 0x00ce, 0x001e, 0x0005, 0x00d6, 0x6018, - 0xa0e8, 0x002b, 0x2d04, 0xa005, 0x0140, 0xac06, 0x0120, 0x2d04, - 0xa0e8, 0x0003, 0x0cb8, 0x600c, 0x206a, 0x00de, 0x0005, 0x0026, - 0x0036, 0x0156, 0x2011, 0xb628, 0x2204, 0xa084, 0x00ff, 0x2019, - 0xbc8e, 0x2334, 0xa636, 0x11d8, 0x8318, 0x2334, 0x2204, 0xa084, - 0xff00, 0xa636, 0x11a0, 0x2011, 0xbc90, 0x6018, 0xa098, 0x000a, - 0x20a9, 0x0004, 0x080c, 0x9166, 0x1150, 0x2011, 0xbc94, 0x6018, - 0xa098, 0x0006, 0x20a9, 0x0004, 0x080c, 0x9166, 0x1100, 0x015e, - 0x003e, 0x002e, 0x0005, 0x00e6, 0x2071, 0xb600, 0x080c, 0x4c28, - 0x080c, 0x2aed, 0x00ee, 0x0005, 0x00e6, 0x6018, 0x2070, 0x7000, - 0xd0fc, 0x0108, 0x0011, 0x00ee, 0x0005, 0x6850, 0xc0e5, 0x6852, - 0x0005, 0x00e6, 0x00c6, 0x0076, 0x0066, 0x0056, 0x0046, 0x0026, - 0x0016, 0x0126, 0x2091, 0x8000, 0x2029, 0xb8ea, 0x252c, 0x2021, - 0xb8f0, 0x2424, 0x2061, 0xbe00, 0x2071, 0xb600, 0x7648, 0x7068, - 0xa606, 0x0578, 0x671c, 0xa786, 0x0001, 0x0118, 0xa786, 0x0008, - 0x1500, 0x2500, 0xac06, 0x01e8, 0x2400, 0xac06, 0x01d0, 0x080c, - 0xb1cc, 0x01b8, 0x080c, 0xb1dc, 0x11a0, 0x6000, 0xa086, 0x0004, - 0x1120, 0x0016, 0x080c, 0x1952, 0x001e, 0x080c, 0x9f03, 0x1110, - 0x080c, 0x2cf7, 0x080c, 0x9f14, 0x1110, 0x080c, 0x8ca5, 0x080c, - 0x9ed9, 0xace0, 0x0018, 0x2001, 0xb617, 0x2004, 0xac02, 0x1208, - 0x0858, 0x012e, 0x001e, 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, - 0x00ce, 0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6, 0x0016, 0x2091, - 0x8000, 0x2071, 0xb640, 0xd5a4, 0x0118, 0x7034, 0x8000, 0x7036, - 0xd5b4, 0x0118, 0x7030, 0x8000, 0x7032, 0xd5ac, 0x0178, 0x2500, - 0xa084, 0x0007, 0xa08e, 0x0003, 0x0148, 0xa08e, 0x0004, 0x0130, - 0xa08e, 0x0005, 0x0118, 0x2071, 0xb64a, 0x04c9, 0x001e, 0x00ee, - 0x000e, 0x012e, 0x0005, 0x0126, 0x0006, 0x00e6, 0x0016, 0x2091, - 0x8000, 0x2071, 0xb640, 0xd5a4, 0x0118, 0x7034, 0x8000, 0x7036, - 0xd5b4, 0x0118, 0x7030, 0x8000, 0x7032, 0xd5ac, 0x0178, 0x2500, - 0xa084, 0x0007, 0xa08e, 0x0003, 0x0148, 0xa08e, 0x0004, 0x0130, - 0xa08e, 0x0005, 0x0118, 0x2071, 0xb64a, 0x0089, 0x001e, 0x00ee, - 0x000e, 0x012e, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, - 0x2071, 0xb642, 0x0021, 0x00ee, 0x000e, 0x012e, 0x0005, 0x2e04, - 0x8000, 0x2072, 0x1220, 0x8e70, 0x2e04, 0x8000, 0x2072, 0x0005, - 0x00e6, 0x2071, 0xb640, 0x0c99, 0x00ee, 0x0005, 0x00e6, 0x2071, - 0xb644, 0x0c69, 0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, - 0x8000, 0x2071, 0xb640, 0x7044, 0x8000, 0x7046, 0x00ee, 0x000e, - 0x012e, 0x0005, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, - 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, - 0x4000, 0x8000, 0xdb06 +unsigned char ql2200_fw_bin[] = { + 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x2b, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x08, 0x00, 0x17, 0x20, 0x43, 0x4f, 0x50, 0x59, 0x52, + 0x49, 0x47, 0x48, 0x54, 0x20, 0x32, 0x30, 0x30, 0x31, 0x20, 0x51, 0x4c, + 0x4f, 0x47, 0x49, 0x43, 0x20, 0x43, 0x4f, 0x52, 0x50, 0x4f, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x20, 0x49, 0x53, 0x50, 0x32, 0x32, 0x30, 0x30, + 0x20, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x20, 0x20, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x30, 0x32, 0x2e, 0x30, 0x32, + 0x2e, 0x30, 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x00, 0x20, 0xc1, + 0x00, 0x05, 0x20, 0x01, 0x01, 0x7f, 0x20, 0x03, 0x00, 0x00, 0x20, 0xc9, + 0xbb, 0xff, 0x20, 0x91, 0x20, 0x00, 0x20, 0x59, 0x00, 0x00, 0x2b, 0x78, + 0x78, 0x23, 0x00, 0x04, 0x20, 0x89, 0x29, 0x9f, 0x20, 0x51, 0xb6, 0x00, + 0x2a, 0x70, 0x20, 0x29, 0xee, 0x00, 0x20, 0x31, 0xff, 0xff, 0x20, 0x39, + 0xed, 0xe9, 0x20, 0x21, 0x02, 0x00, 0x08, 0x04, 0x14, 0x6d, 0x20, 0xa1, + 0xb5, 0x2b, 0xa0, 0x0e, 0x20, 0xa9, 0x08, 0xd5, 0x41, 0xa4, 0x34, 0x00, + 0x75, 0x62, 0x76, 0x66, 0x77, 0x5e, 0x74, 0x6a, 0x74, 0x6e, 0x20, 0xa1, + 0xbe, 0x00, 0x71, 0x64, 0x81, 0x0d, 0x81, 0x0d, 0x81, 0x0d, 0x81, 0x0d, + 0xa1, 0x8c, 0x00, 0x0f, 0x20, 0x01, 0x00, 0x0b, 0xa1, 0x12, 0xa0, 0x0e, + 0x21, 0xa8, 0x41, 0xa4, 0x34, 0x00, 0x82, 0x11, 0x1d, 0xd8, 0x71, 0x64, + 0x34, 0x00, 0xa1, 0x02, 0x01, 0x20, 0x02, 0x18, 0x20, 0xa8, 0xa0, 0x0e, + 0x41, 0xa4, 0x38, 0x00, 0xd0, 0x8c, 0x01, 0xd8, 0x20, 0x09, 0xb6, 0x00, + 0x81, 0x0d, 0x81, 0x0d, 0x81, 0x0d, 0x81, 0x0d, 0xa1, 0x8c, 0x00, 0x0f, + 0x20, 0x01, 0x00, 0x01, 0xa1, 0x12, 0x20, 0xa1, 0x10, 0x00, 0xa0, 0x0e, + 0x21, 0xa8, 0x41, 0xa4, 0x82, 0x11, 0x1d, 0xe0, 0x20, 0x09, 0xb6, 0x00, + 0x34, 0x00, 0xa1, 0x02, 0x01, 0x20, 0x02, 0x18, 0x20, 0xa8, 0xa0, 0x0e, + 0x41, 0xa4, 0x08, 0x0c, 0x14, 0x16, 0x08, 0x0c, 0x16, 0x37, 0x08, 0x0c, + 0x17, 0xd4, 0x08, 0x0c, 0x1f, 0xbe, 0x08, 0x0c, 0x4c, 0x72, 0x08, 0x0c, + 0x86, 0x46, 0x08, 0x0c, 0x15, 0xc0, 0x08, 0x0c, 0x2e, 0xf9, 0x08, 0x0c, + 0x5d, 0xfc, 0x08, 0x0c, 0x53, 0xb3, 0x08, 0x0c, 0x69, 0x40, 0x08, 0x0c, + 0x25, 0x45, 0x08, 0x0c, 0x6b, 0xd3, 0x08, 0x0c, 0x64, 0x2d, 0x08, 0x0c, + 0x23, 0xff, 0x08, 0x0c, 0x25, 0x13, 0x20, 0x91, 0x30, 0x09, 0x78, 0x23, + 0x00, 0x00, 0x10, 0x04, 0x10, 0xc5, 0x78, 0x20, 0xa0, 0x86, 0x00, 0x02, + 0x11, 0x50, 0x78, 0x23, 0x40, 0x00, 0x0e, 0x04, 0x10, 0xbd, 0x78, 0x1b, + 0x00, 0x01, 0x20, 0x91, 0x50, 0x00, 0x20, 0x91, 0x40, 0x80, 0x2a, 0x70, + 0x70, 0x03, 0x00, 0x00, 0x2a, 0x70, 0x70, 0x00, 0xa0, 0x8e, 0x00, 0x03, + 0x11, 0x58, 0x08, 0x0c, 0x3f, 0x4f, 0x08, 0x0c, 0x2f, 0x20, 0x08, 0x0c, + 0x5e, 0x4a, 0x08, 0x0c, 0x55, 0x62, 0x08, 0x0c, 0x69, 0x6b, 0x0c, 0x80, + 0x00, 0x0b, 0x0c, 0x98, 0x10, 0xe4, 0x10, 0xe5, 0x12, 0x15, 0x10, 0xe2, + 0x12, 0xe2, 0x14, 0x13, 0x14, 0x14, 0x14, 0x15, 0x08, 0x0c, 0x15, 0x1a, + 0x00, 0x05, 0x01, 0x26, 0x00, 0xf6, 0x20, 0x91, 0x80, 0x00, 0x70, 0x00, + 0xa0, 0x86, 0x00, 0x01, 0x19, 0x04, 0x11, 0xf2, 0x08, 0x0c, 0x15, 0x8d, + 0x08, 0x0c, 0x5b, 0x41, 0x01, 0x50, 0x08, 0x0c, 0x5b, 0x67, 0x15, 0xc0, + 0x20, 0x79, 0x01, 0x00, 0x78, 0x28, 0xa0, 0x85, 0x18, 0x00, 0x78, 0x2a, + 0x04, 0x88, 0x08, 0x0c, 0x5a, 0x79, 0x70, 0x00, 0xa0, 0x86, 0x00, 0x01, + 0x19, 0x04, 0x11, 0xf2, 0x70, 0x8c, 0xa0, 0x86, 0x00, 0x28, 0x19, 0x04, + 0x11, 0xf2, 0x20, 0x01, 0x01, 0x61, 0x20, 0x03, 0x00, 0x01, 0x20, 0x79, + 0x01, 0x00, 0x78, 0x27, 0xff, 0xff, 0x7a, 0x28, 0xa2, 0x95, 0x1e, 0x2f, + 0x7a, 0x2a, 0x20, 0x11, 0x5a, 0x14, 0x08, 0x0c, 0x6a, 0x0e, 0x20, 0x11, + 0x5a, 0x07, 0x08, 0x0c, 0x6a, 0xce, 0x20, 0x11, 0x5a, 0x56, 0x08, 0x0c, + 0x6a, 0x0e, 0x20, 0x11, 0x4b, 0x23, 0x08, 0x0c, 0x6a, 0x0e, 0x20, 0x11, + 0x80, 0x30, 0x20, 0x19, 0x00, 0x00, 0x70, 0x8b, 0x00, 0x00, 0x08, 0x0c, + 0x1e, 0x05, 0x00, 0xe8, 0x08, 0x0c, 0x44, 0xd6, 0x20, 0x79, 0x01, 0x00, + 0x78, 0x44, 0xa0, 0x05, 0x19, 0x04, 0x11, 0xf2, 0x20, 0x11, 0x4b, 0x23, + 0x08, 0x0c, 0x6a, 0x0e, 0x20, 0x11, 0x5a, 0x56, 0x08, 0x0c, 0x6a, 0x0e, + 0x08, 0x0c, 0x1e, 0x05, 0x20, 0x01, 0xb8, 0x8d, 0x20, 0x04, 0x78, 0x0e, + 0x78, 0x40, 0xa0, 0x84, 0xff, 0xfb, 0x78, 0x42, 0x20, 0x11, 0x80, 0x10, + 0x73, 0xcc, 0x08, 0x0c, 0x3f, 0x13, 0x72, 0x3c, 0xc2, 0x84, 0x72, 0x3e, + 0x20, 0x01, 0xb6, 0x0c, 0x20, 0x0c, 0xc1, 0xac, 0x21, 0x02, 0x08, 0x0c, + 0x7f, 0xbc, 0x20, 0x11, 0x00, 0x04, 0x08, 0x0c, 0x9d, 0x1c, 0x08, 0x0c, + 0x52, 0xbf, 0x08, 0x0c, 0x5b, 0x41, 0x01, 0x58, 0x08, 0x0c, 0x4c, 0x4a, + 0x01, 0x40, 0x70, 0x8b, 0x00, 0x01, 0x70, 0xc7, 0x00, 0x00, 0x08, 0x0c, + 0x46, 0x73, 0x08, 0x04, 0x11, 0xf2, 0x08, 0x0c, 0x53, 0x7b, 0x01, 0x20, + 0x7a, 0x0c, 0xc2, 0xb4, 0x7a, 0x0e, 0x00, 0x60, 0x70, 0x73, 0x00, 0x00, + 0x08, 0x0c, 0xa0, 0xc4, 0x70, 0xd4, 0xd0, 0x9c, 0x11, 0x28, 0x70, 0xa0, + 0xa0, 0x05, 0x01, 0x10, 0x08, 0x0c, 0x4c, 0x28, 0x70, 0xdf, 0x00, 0x00, + 0x70, 0xdb, 0x00, 0x00, 0x72, 0xd4, 0x08, 0x0c, 0x5b, 0x41, 0x11, 0x80, + 0x20, 0x11, 0x00, 0x00, 0x00, 0x16, 0x08, 0x0c, 0x29, 0x20, 0x20, 0x19, + 0xb8, 0x8f, 0x21, 0x1a, 0x00, 0x1e, 0x70, 0x53, 0xff, 0xff, 0x70, 0x57, + 0x00, 0xef, 0x70, 0x77, 0x00, 0x00, 0x00, 0x20, 0x20, 0x19, 0xb8, 0x8f, + 0x20, 0x1b, 0x00, 0x00, 0x20, 0x79, 0xb6, 0x52, 0x78, 0x04, 0xd0, 0xac, + 0x01, 0x08, 0xc2, 0x95, 0x72, 0xd6, 0x08, 0x0c, 0x5b, 0x41, 0x01, 0x18, + 0xa2, 0x96, 0x00, 0x04, 0x05, 0x48, 0x20, 0x11, 0x00, 0x01, 0x08, 0x0c, + 0x9d, 0x1c, 0x70, 0x9b, 0x00, 0x00, 0x70, 0x9f, 0xff, 0xff, 0x70, 0x03, + 0x00, 0x02, 0x20, 0x79, 0x01, 0x00, 0x78, 0x27, 0x00, 0x03, 0x78, 0x28, + 0xa0, 0x85, 0x00, 0x03, 0x78, 0x2a, 0x00, 0xfe, 0x08, 0x0c, 0x2a, 0xed, + 0x20, 0x11, 0x00, 0x05, 0x08, 0x0c, 0x80, 0xfc, 0x08, 0x0c, 0x71, 0xe5, + 0x08, 0x0c, 0x5b, 0x41, 0x01, 0x48, 0x00, 0xc6, 0x20, 0x61, 0x01, 0x00, + 0x00, 0x16, 0x08, 0x0c, 0x29, 0x20, 0x61, 0xe2, 0x00, 0x1e, 0x00, 0xce, + 0x01, 0x2e, 0x04, 0x20, 0x70, 0x9b, 0x00, 0x00, 0x70, 0x9f, 0xff, 0xff, + 0x70, 0x03, 0x00, 0x02, 0x00, 0xf6, 0x20, 0x79, 0x01, 0x00, 0x78, 0x27, + 0x00, 0x03, 0x78, 0x28, 0xa0, 0x85, 0x00, 0x03, 0x78, 0x2a, 0x00, 0xfe, + 0x20, 0x11, 0x00, 0x05, 0x08, 0x0c, 0x80, 0xfc, 0x08, 0x0c, 0x71, 0xe5, + 0x08, 0x0c, 0x5b, 0x41, 0x01, 0x48, 0x00, 0xc6, 0x20, 0x61, 0x01, 0x00, + 0x00, 0x16, 0x08, 0x0c, 0x29, 0x20, 0x61, 0xe2, 0x00, 0x1e, 0x00, 0xce, + 0x00, 0xfe, 0x01, 0x2e, 0x00, 0x05, 0x00, 0xc6, 0x08, 0x0c, 0x5b, 0x41, + 0x11, 0x18, 0x20, 0xa9, 0x01, 0x00, 0x00, 0x10, 0x20, 0xa9, 0x00, 0x82, + 0x08, 0x0c, 0x5b, 0x41, 0x11, 0x18, 0x20, 0x09, 0x00, 0x00, 0x00, 0x10, + 0x20, 0x09, 0x00, 0x7e, 0x08, 0x0c, 0x2d, 0xcc, 0x81, 0x08, 0x1f, 0x04, + 0x12, 0x06, 0x00, 0xce, 0x70, 0x73, 0x00, 0x00, 0x70, 0x74, 0xa0, 0x84, + 0x00, 0xff, 0x70, 0x76, 0x70, 0xa3, 0x00, 0x00, 0x00, 0x05, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x70, 0x00, 0xa0, 0x86, 0x00, 0x02, 0x19, 0x04, + 0x12, 0xe0, 0x70, 0x9c, 0xa0, 0x86, 0xff, 0xff, 0x01, 0x30, 0x08, 0x0c, + 0x2a, 0xed, 0x08, 0x0c, 0x71, 0xe5, 0x08, 0x04, 0x12, 0xe0, 0x70, 0xd4, + 0xd0, 0xac, 0x11, 0x10, 0xd0, 0x9c, 0x05, 0x40, 0xd0, 0x84, 0x05, 0x30, + 0x00, 0x06, 0x00, 0x16, 0x20, 0x01, 0x01, 0x03, 0x20, 0x09, 0xb8, 0x8d, + 0x21, 0x0c, 0x21, 0x02, 0x00, 0x1e, 0x00, 0x0e, 0xd0, 0x8c, 0x01, 0xd0, + 0x70, 0xd8, 0xa0, 0x86, 0xff, 0xff, 0x01, 0x90, 0x08, 0x0c, 0x2c, 0x4c, + 0x08, 0x0c, 0x71, 0xe5, 0x70, 0xd4, 0xd0, 0x94, 0x19, 0x04, 0x12, 0xe0, + 0x20, 0x11, 0x00, 0x01, 0x20, 0x19, 0x00, 0x00, 0x08, 0x0c, 0x2c, 0x84, + 0x08, 0x0c, 0x71, 0xe5, 0x08, 0x04, 0x12, 0xe0, 0x70, 0xdc, 0xa0, 0x05, + 0x19, 0x04, 0x12, 0xe0, 0x70, 0x98, 0xa0, 0x05, 0x19, 0x04, 0x12, 0xe0, + 0x70, 0xd4, 0xd0, 0xa4, 0x01, 0x18, 0xd0, 0xb4, 0x09, 0x04, 0x12, 0xe0, + 0x08, 0x0c, 0x53, 0x7b, 0x19, 0x04, 0x12, 0xe0, 0x20, 0x01, 0xb6, 0x53, + 0x20, 0x04, 0xd0, 0xac, 0x01, 0xc8, 0x01, 0x56, 0x00, 0xc6, 0x20, 0xa9, + 0x00, 0x7f, 0x20, 0x09, 0x00, 0x00, 0x00, 0x16, 0x08, 0x0c, 0x50, 0x1b, + 0x11, 0x18, 0x60, 0x00, 0xd0, 0xec, 0x11, 0x38, 0x00, 0x1e, 0x81, 0x08, + 0x1f, 0x04, 0x12, 0x6d, 0x00, 0xce, 0x01, 0x5e, 0x00, 0x28, 0x00, 0x1e, + 0x00, 0xce, 0x01, 0x5e, 0x08, 0x04, 0x12, 0xe0, 0x00, 0x06, 0x00, 0x16, + 0x20, 0x01, 0x01, 0x03, 0x20, 0x09, 0xb8, 0x8d, 0x21, 0x0c, 0x21, 0x02, + 0x00, 0x1e, 0x00, 0x0e, 0x71, 0xa8, 0x81, 0xff, 0x11, 0xb0, 0xa0, 0x06, + 0x20, 0x09, 0x02, 0x00, 0x20, 0xa9, 0x00, 0x02, 0x20, 0xa1, 0xb8, 0xdf, + 0x40, 0xa1, 0x20, 0x09, 0x07, 0x00, 0x20, 0xa9, 0x00, 0x02, 0x20, 0xa1, + 0xb8, 0xcf, 0x40, 0xa1, 0x70, 0x70, 0x80, 0x07, 0x71, 0x74, 0x81, 0x0f, + 0x20, 0xa9, 0x00, 0x02, 0x40, 0xa1, 0x20, 0xa1, 0xb8, 0xd3, 0x20, 0x09, + 0x00, 0x00, 0x08, 0x0c, 0x15, 0x00, 0x20, 0x01, 0x00, 0x00, 0x81, 0x0f, + 0x20, 0xa9, 0x00, 0x02, 0x40, 0xa1, 0x70, 0x30, 0xc0, 0x8c, 0x70, 0x32, + 0x70, 0x03, 0x00, 0x03, 0x70, 0x9f, 0xff, 0xff, 0x08, 0x0c, 0x15, 0x86, + 0xa0, 0x06, 0x08, 0x0c, 0x27, 0xf8, 0x08, 0x0c, 0x3f, 0x85, 0x00, 0xf6, + 0x20, 0x79, 0x01, 0x00, 0x08, 0x0c, 0x5b, 0x67, 0x01, 0x50, 0x08, 0x0c, + 0x5b, 0x41, 0x78, 0x28, 0x01, 0x18, 0xa0, 0x84, 0xe1, 0xff, 0x00, 0x10, + 0xa0, 0x84, 0xff, 0xdf, 0x78, 0x2a, 0x00, 0xfe, 0x20, 0x01, 0xb8, 0xe2, + 0x20, 0x04, 0xa0, 0x86, 0x00, 0x05, 0x11, 0x20, 0x20, 0x11, 0x00, 0x00, + 0x08, 0x0c, 0x80, 0xfc, 0x20, 0x11, 0x00, 0x00, 0x08, 0x0c, 0x81, 0x06, + 0x08, 0x0c, 0x71, 0xe5, 0x08, 0x0c, 0x72, 0xa2, 0x01, 0x2e, 0x00, 0x05, + 0x00, 0x16, 0x00, 0x46, 0x00, 0xf6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x79, 0x01, 0x00, 0x20, 0x09, 0xb6, 0x34, 0x21, 0x04, 0xa0, 0x05, + 0x11, 0x10, 0x08, 0x0c, 0x29, 0x4c, 0x20, 0x09, 0x00, 0xf7, 0x08, 0x0c, + 0x4c, 0x11, 0x79, 0x40, 0xa1, 0x8c, 0x00, 0x10, 0x79, 0x42, 0x79, 0x24, + 0xd1, 0xb4, 0x01, 0x10, 0x78, 0x27, 0x00, 0x40, 0xd1, 0x9c, 0x01, 0x10, + 0x78, 0x27, 0x00, 0x08, 0x00, 0x06, 0x00, 0x36, 0x01, 0x56, 0x79, 0x54, + 0xd1, 0xac, 0x19, 0x04, 0x13, 0x50, 0x08, 0x0c, 0x5b, 0x53, 0x01, 0x58, + 0x08, 0x0c, 0x5b, 0x67, 0x11, 0x28, 0x20, 0x01, 0xb8, 0x9e, 0x20, 0x03, + 0x00, 0x00, 0x00, 0x70, 0x08, 0x0c, 0x5b, 0x49, 0x0d, 0xc0, 0x20, 0x01, + 0xb8, 0x9e, 0x20, 0x03, 0xaa, 0xaa, 0x20, 0x01, 0xb8, 0x9f, 0x20, 0x03, + 0x00, 0x01, 0x08, 0x0c, 0x5a, 0x79, 0x00, 0x58, 0x08, 0x0c, 0x5b, 0x41, + 0x01, 0x40, 0x20, 0x09, 0x00, 0xf8, 0x08, 0x0c, 0x4c, 0x11, 0x78, 0x43, + 0x00, 0x90, 0x78, 0x43, 0x00, 0x10, 0x20, 0xa9, 0x09, 0xc4, 0x78, 0x20, + 0xd0, 0x9c, 0x11, 0x38, 0x08, 0x0c, 0x5b, 0x41, 0x01, 0x38, 0x78, 0x24, + 0xd0, 0xac, 0x19, 0x04, 0x13, 0xfa, 0x1f, 0x04, 0x13, 0x2f, 0x00, 0x70, + 0x78, 0x24, 0x08, 0x0c, 0x5b, 0x5d, 0x01, 0x18, 0xd0, 0xac, 0x19, 0x04, + 0x13, 0xfa, 0xa0, 0x84, 0x18, 0x00, 0x0d, 0x98, 0x70, 0x03, 0x00, 0x01, + 0x08, 0x04, 0x13, 0xfa, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x27, 0xf8, + 0x08, 0x04, 0x14, 0x09, 0x78, 0x50, 0xa0, 0x84, 0x01, 0x80, 0x78, 0x52, + 0x78, 0x2f, 0x00, 0x20, 0x20, 0xa9, 0x00, 0x46, 0x1d, 0x04, 0x13, 0x58, + 0x08, 0x0c, 0x6a, 0xb6, 0x1f, 0x04, 0x13, 0x58, 0x78, 0x50, 0xa0, 0x84, + 0x01, 0x80, 0xa0, 0x85, 0x04, 0x00, 0x78, 0x52, 0x78, 0x2f, 0x00, 0x00, + 0x08, 0x0c, 0x5b, 0x53, 0x01, 0x58, 0x08, 0x0c, 0x5b, 0x67, 0x11, 0x28, + 0x20, 0x01, 0xb8, 0x9e, 0x20, 0x03, 0x00, 0x00, 0x00, 0x70, 0x08, 0x0c, + 0x5b, 0x49, 0x0d, 0xc0, 0x20, 0x01, 0xb8, 0x9e, 0x20, 0x03, 0xaa, 0xaa, + 0x20, 0x01, 0xb8, 0x9f, 0x20, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x5a, 0x79, + 0x00, 0x20, 0x20, 0x09, 0x00, 0xf8, 0x08, 0x0c, 0x4c, 0x11, 0x20, 0xa9, + 0x00, 0x0e, 0xe0, 0x00, 0x1f, 0x04, 0x13, 0x85, 0x78, 0x50, 0xa0, 0x84, + 0x01, 0x80, 0xa0, 0x85, 0x14, 0x00, 0x78, 0x52, 0x08, 0x0c, 0x5b, 0x41, + 0x01, 0x20, 0x78, 0x43, 0x00, 0x90, 0x78, 0x43, 0x00, 0x10, 0x20, 0x21, + 0xe6, 0x78, 0x20, 0x19, 0xea, 0x60, 0x78, 0x20, 0xd0, 0x9c, 0x15, 0x58, + 0x08, 0x0c, 0x5b, 0x41, 0x05, 0xd8, 0x78, 0x24, 0xd0, 0xac, 0x19, 0x04, + 0x13, 0xfa, 0x08, 0x0c, 0x5b, 0x67, 0x15, 0x08, 0x00, 0x46, 0x20, 0x21, + 0x01, 0x90, 0x84, 0x21, 0x1d, 0xf0, 0x00, 0x4e, 0x84, 0x21, 0x11, 0xc8, + 0x78, 0x27, 0x00, 0x48, 0x20, 0xa9, 0x01, 0xf4, 0x1d, 0x04, 0x13, 0xb2, + 0x08, 0x0c, 0x6a, 0xb6, 0x1f, 0x04, 0x13, 0xb2, 0x78, 0x24, 0xa0, 0x84, + 0x00, 0x68, 0x15, 0xc8, 0x20, 0x01, 0xb8, 0x9e, 0x20, 0x03, 0xaa, 0xaa, + 0x20, 0x01, 0xb8, 0x9f, 0x20, 0x03, 0x00, 0x01, 0x70, 0x03, 0x00, 0x01, + 0x04, 0x98, 0x1d, 0x04, 0x13, 0xcb, 0x08, 0x0c, 0x6a, 0xb6, 0x83, 0x19, + 0x19, 0x60, 0x20, 0x09, 0xb6, 0x34, 0x21, 0x04, 0x80, 0x00, 0x20, 0x0a, + 0xa0, 0x84, 0xff, 0xf0, 0x01, 0x20, 0x20, 0x0b, 0x00, 0x00, 0x08, 0x0c, + 0x29, 0x4c, 0x00, 0xd8, 0x08, 0x0c, 0x5b, 0x53, 0x11, 0x40, 0xa4, 0xa2, + 0x00, 0x64, 0x11, 0x28, 0x08, 0x0c, 0x5b, 0x18, 0x70, 0x03, 0x00, 0x01, + 0x00, 0xa8, 0x78, 0x27, 0x18, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0x78, 0x24, + 0x08, 0x0c, 0x5b, 0x5d, 0x01, 0x10, 0xd0, 0xac, 0x11, 0x58, 0xa0, 0x84, + 0x18, 0x00, 0x09, 0xa8, 0x70, 0x03, 0x00, 0x01, 0x00, 0x28, 0x20, 0x01, + 0x00, 0x01, 0x08, 0x0c, 0x27, 0xf8, 0x00, 0x48, 0x20, 0x01, 0xb6, 0x34, + 0x20, 0x03, 0x00, 0x00, 0x78, 0x27, 0x00, 0x48, 0x78, 0x28, 0xc0, 0x9d, + 0x78, 0x2a, 0x78, 0x50, 0xa0, 0x84, 0x01, 0x80, 0xa0, 0x85, 0x04, 0x00, + 0x78, 0x52, 0x01, 0x5e, 0x00, 0x3e, 0x00, 0x0e, 0x08, 0x0c, 0x15, 0x5d, + 0x01, 0x2e, 0x00, 0xfe, 0x00, 0x4e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0x05, + 0x00, 0x05, 0x00, 0x05, 0x2a, 0x70, 0x20, 0x61, 0xb8, 0xc2, 0x20, 0x63, + 0x00, 0x02, 0x60, 0x07, 0x00, 0x02, 0x60, 0x0b, 0x00, 0x08, 0x60, 0x0f, + 0x00, 0x17, 0x20, 0x01, 0xb8, 0x9e, 0x20, 0x03, 0x00, 0x00, 0x70, 0x8b, + 0x00, 0x00, 0x20, 0x09, 0x01, 0x00, 0x21, 0x04, 0xa0, 0x82, 0x00, 0x02, + 0x02, 0x18, 0x70, 0x53, 0xff, 0xff, 0x00, 0x10, 0x70, 0x53, 0x00, 0x00, + 0x70, 0x5b, 0xff, 0xff, 0x70, 0x73, 0x00, 0x00, 0x70, 0x77, 0x00, 0x00, + 0x08, 0x0c, 0xa0, 0xc4, 0x20, 0x61, 0xb8, 0x8e, 0x60, 0x03, 0x09, 0x09, + 0x60, 0x07, 0x00, 0x00, 0x60, 0x0b, 0x88, 0x00, 0x60, 0x0f, 0x02, 0x00, + 0x60, 0x13, 0x00, 0xff, 0x60, 0x17, 0x00, 0x0f, 0x60, 0x1b, 0x00, 0x00, + 0x60, 0x1f, 0x07, 0xd0, 0x20, 0x61, 0xb8, 0x96, 0x60, 0x03, 0x80, 0x00, + 0x60, 0x07, 0x00, 0x00, 0x60, 0x0b, 0x00, 0x00, 0x60, 0x0f, 0x02, 0x00, + 0x60, 0x13, 0x00, 0xff, 0x60, 0x17, 0x00, 0x00, 0x60, 0x1b, 0x00, 0x01, + 0x60, 0x1f, 0x00, 0x00, 0x20, 0x61, 0xb8, 0xb9, 0x60, 0x03, 0x51, 0x4c, + 0x60, 0x07, 0x4f, 0x47, 0x60, 0x0b, 0x49, 0x43, 0x60, 0x0f, 0x20, 0x20, + 0x20, 0x01, 0xb6, 0x28, 0x20, 0x03, 0x00, 0x00, 0x00, 0x05, 0x04, 0xa0, + 0x20, 0x11, 0x00, 0x00, 0x81, 0xff, 0x05, 0x70, 0xa1, 0x86, 0x00, 0x01, + 0x11, 0x48, 0x20, 0x31, 0x8f, 0xff, 0x20, 0x39, 0xd6, 0x01, 0x20, 0x21, + 0x01, 0x00, 0x20, 0x29, 0xd6, 0x00, 0x00, 0xe8, 0xa1, 0x86, 0x00, 0x02, + 0x11, 0x18, 0x20, 0x11, 0x00, 0x00, 0x00, 0xb8, 0xa1, 0x86, 0x00, 0x05, + 0x11, 0x18, 0x20, 0x11, 0x00, 0x01, 0x00, 0x88, 0xa1, 0x86, 0x00, 0x09, + 0x11, 0x18, 0x20, 0x11, 0x00, 0x02, 0x00, 0x58, 0xa1, 0x86, 0x00, 0x0a, + 0x11, 0x18, 0x20, 0x11, 0x00, 0x02, 0x00, 0x28, 0xa1, 0x86, 0x00, 0x55, + 0x11, 0x10, 0x20, 0x11, 0x00, 0x03, 0x38, 0x00, 0xa0, 0x84, 0xff, 0xfc, + 0xa2, 0x05, 0x20, 0xc0, 0x08, 0x04, 0x10, 0x4d, 0xa0, 0x0e, 0x20, 0x11, + 0x00, 0x03, 0x20, 0x19, 0x14, 0xa9, 0x08, 0x04, 0x14, 0xfa, 0x20, 0x19, + 0xaa, 0xaa, 0x20, 0x61, 0xff, 0xff, 0x2c, 0x14, 0x23, 0x62, 0xe0, 0x00, + 0xe0, 0x00, 0x2c, 0x04, 0xa3, 0x06, 0x22, 0x62, 0x11, 0x10, 0xc1, 0xb5, + 0xc1, 0xa5, 0x20, 0x11, 0x00, 0x00, 0x20, 0x19, 0x14, 0xbc, 0x04, 0xf0, + 0x20, 0x19, 0xaa, 0xaa, 0x20, 0x61, 0xff, 0xff, 0x2c, 0x14, 0x23, 0x62, + 0xe0, 0x00, 0xe0, 0x00, 0x2c, 0x1c, 0x20, 0x61, 0x7f, 0xff, 0xe0, 0x00, + 0xe0, 0x00, 0x2c, 0x04, 0x20, 0x61, 0xff, 0xff, 0x22, 0x62, 0xa3, 0x06, + 0x01, 0x10, 0xc1, 0x8d, 0x00, 0x08, 0xc1, 0x85, 0x20, 0x11, 0x00, 0x02, + 0x20, 0x19, 0x14, 0xd7, 0x04, 0x18, 0x20, 0x61, 0xff, 0xff, 0x20, 0x19, + 0xaa, 0xaa, 0x2c, 0x14, 0x23, 0x62, 0xe0, 0x00, 0xe0, 0x00, 0x2c, 0x04, + 0x22, 0x62, 0xa3, 0x06, 0x11, 0x80, 0x2c, 0x14, 0x23, 0x62, 0xe0, 0x00, + 0xe0, 0x00, 0x2c, 0x1c, 0x20, 0x61, 0x7f, 0xff, 0x2c, 0x04, 0x20, 0x61, + 0xff, 0xff, 0x22, 0x62, 0xa3, 0x06, 0x11, 0x10, 0xc1, 0x95, 0x00, 0x08, + 0xc1, 0x9d, 0x20, 0x11, 0x00, 0x01, 0x20, 0x19, 0x14, 0xf8, 0x00, 0x10, + 0x08, 0x04, 0x14, 0x6e, 0x38, 0x00, 0xa0, 0x84, 0xff, 0xfc, 0xa2, 0x05, + 0x20, 0xc0, 0x08, 0x37, 0x20, 0x11, 0x00, 0x00, 0x08, 0x0c, 0x50, 0x1b, + 0x11, 0x78, 0x60, 0x04, 0xa0, 0xc4, 0x00, 0xff, 0xa8, 0xc6, 0x00, 0x06, + 0x01, 0x28, 0xa0, 0xc4, 0xff, 0x00, 0xa8, 0xc6, 0x06, 0x00, 0x11, 0x20, + 0xa1, 0x86, 0x00, 0x80, 0x01, 0x08, 0x82, 0x10, 0x81, 0x08, 0xa1, 0x86, + 0x01, 0x00, 0x1d, 0x50, 0x22, 0x08, 0x00, 0x05, 0x20, 0x91, 0x80, 0x00, + 0x0e, 0x04, 0x15, 0x1c, 0x00, 0x06, 0x00, 0x16, 0x20, 0x79, 0x00, 0x00, + 0x78, 0x18, 0xd0, 0x84, 0x1d, 0xe8, 0x00, 0x1e, 0x79, 0x2e, 0x00, 0x0e, + 0x78, 0x2a, 0x00, 0x0e, 0x78, 0x26, 0x39, 0x00, 0x78, 0x3a, 0x78, 0x23, + 0x80, 0x02, 0x78, 0x1b, 0x00, 0x01, 0x20, 0x91, 0x50, 0x00, 0x01, 0x26, + 0x01, 0x56, 0x01, 0x46, 0x20, 0xa9, 0x00, 0x10, 0x20, 0xa1, 0xba, 0x0d, + 0x20, 0x91, 0x20, 0x00, 0x40, 0xa1, 0x20, 0xa9, 0x00, 0x10, 0x20, 0x91, + 0x22, 0x00, 0x40, 0xa1, 0x20, 0xa9, 0x00, 0x10, 0x20, 0x91, 0x24, 0x00, + 0x40, 0xa1, 0x20, 0xa9, 0x00, 0x10, 0x20, 0x91, 0x26, 0x00, 0x40, 0xa1, + 0x20, 0xa9, 0x00, 0x10, 0x20, 0x91, 0x28, 0x00, 0x40, 0xa1, 0x01, 0x4e, + 0x01, 0x5e, 0x01, 0x2e, 0x20, 0x79, 0xb6, 0x00, 0x78, 0x03, 0x00, 0x05, + 0x20, 0x91, 0x40, 0x80, 0x04, 0xc9, 0x0c, 0xf8, 0x00, 0x05, 0x00, 0x06, + 0x08, 0x0c, 0x15, 0xa8, 0x15, 0x18, 0x00, 0xf6, 0x20, 0x79, 0xb6, 0x24, + 0x2f, 0x04, 0x80, 0x00, 0x20, 0x7a, 0xa0, 0x82, 0x00, 0x0f, 0x02, 0x58, + 0xa0, 0x06, 0x20, 0x7a, 0x20, 0x79, 0xb6, 0x26, 0x2f, 0x04, 0xa0, 0x84, + 0x00, 0x01, 0xa0, 0x86, 0x00, 0x01, 0x20, 0x7a, 0x00, 0x70, 0x20, 0x79, + 0xb6, 0x26, 0x2f, 0x7c, 0x8f, 0xff, 0x11, 0x28, 0x20, 0x01, 0x0c, 0x03, + 0x20, 0x03, 0x00, 0x40, 0x00, 0x20, 0x20, 0x01, 0x0c, 0x03, 0x20, 0x03, + 0x00, 0xc0, 0x00, 0xfe, 0x00, 0x0e, 0x00, 0x05, 0x04, 0x09, 0x11, 0x20, + 0x20, 0x01, 0x0c, 0x03, 0x20, 0x03, 0x00, 0x80, 0x00, 0x05, 0x00, 0xd1, + 0x11, 0x20, 0x20, 0x01, 0x0c, 0x03, 0x20, 0x03, 0x00, 0x40, 0x00, 0x05, + 0x00, 0x06, 0x00, 0x91, 0x11, 0x78, 0x20, 0x01, 0x0c, 0x03, 0x20, 0x03, + 0x00, 0x40, 0x20, 0x09, 0x0f, 0xff, 0x00, 0xa1, 0x20, 0x01, 0x0c, 0x03, + 0x20, 0x03, 0x00, 0x80, 0x20, 0x09, 0x0f, 0xff, 0x00, 0x69, 0x0c, 0x88, + 0x00, 0x0e, 0x00, 0x05, 0x00, 0xc6, 0x20, 0x61, 0x0c, 0x00, 0x2c, 0x04, + 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, 0x00, 0xaa, 0x00, 0xce, 0x00, 0x05, + 0x01, 0x56, 0x01, 0x26, 0xa1, 0x8c, 0x0f, 0xff, 0x21, 0xa8, 0x1d, 0x04, + 0x15, 0xb7, 0x20, 0x91, 0x60, 0x00, 0x1f, 0x04, 0x15, 0xb7, 0x01, 0x2e, + 0x01, 0x5e, 0x00, 0x05, 0x20, 0x71, 0xb6, 0x00, 0x71, 0x60, 0x71, 0x2e, + 0x20, 0x21, 0x00, 0x01, 0xa1, 0x90, 0x00, 0x30, 0xa2, 0x98, 0x00, 0x30, + 0x02, 0x40, 0x70, 0x64, 0xa3, 0x02, 0x12, 0x28, 0x22, 0x0a, 0x22, 0x08, + 0x23, 0x10, 0x84, 0x20, 0x0c, 0xa8, 0x38, 0x00, 0xd0, 0x8c, 0x01, 0x48, + 0x70, 0x64, 0xa0, 0x86, 0xb6, 0x00, 0x01, 0x28, 0x70, 0x67, 0xb6, 0x00, + 0x20, 0x11, 0x10, 0x00, 0x0c, 0x48, 0x20, 0x0b, 0x00, 0x00, 0x74, 0xb2, + 0x74, 0xb6, 0x00, 0x05, 0x00, 0xe6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x71, 0xb6, 0x00, 0x70, 0xb4, 0xa0, 0xea, 0x00, 0x10, 0x02, 0x68, + 0x80, 0x01, 0x70, 0xb6, 0x70, 0x2c, 0x20, 0x68, 0x2d, 0x04, 0x70, 0x2e, + 0x20, 0x6b, 0x00, 0x00, 0x68, 0x07, 0x00, 0x00, 0x01, 0x2e, 0x00, 0xee, + 0x00, 0x05, 0xa0, 0x6e, 0x0c, 0xd8, 0x00, 0xe6, 0x20, 0x71, 0xb6, 0x00, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x70, 0xb4, 0x80, 0x01, 0x02, 0x60, + 0x70, 0xb6, 0x70, 0x2c, 0x20, 0x68, 0x2d, 0x04, 0x70, 0x2e, 0x20, 0x6b, + 0x00, 0x00, 0x68, 0x07, 0x00, 0x00, 0x01, 0x2e, 0x00, 0xee, 0x00, 0x05, + 0xa0, 0x6e, 0x0c, 0xd8, 0x00, 0xe6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x71, 0xb6, 0x00, 0x70, 0x2c, 0x20, 0x6a, 0x2d, 0x00, 0x70, 0x2e, + 0x70, 0xb4, 0x80, 0x00, 0x70, 0xb6, 0x01, 0x2e, 0x00, 0xee, 0x00, 0x05, + 0x8d, 0xff, 0x01, 0x38, 0x68, 0x04, 0x68, 0x07, 0x00, 0x00, 0x00, 0x06, + 0x0c, 0x49, 0x00, 0xde, 0x0c, 0xb8, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, + 0xb6, 0x00, 0x70, 0xb4, 0xa0, 0x8a, 0x00, 0x10, 0xa0, 0x0d, 0x00, 0xee, + 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0xb9, 0x13, 0x70, 0x07, 0x00, 0x00, + 0x70, 0x1b, 0x00, 0x00, 0x70, 0x1f, 0x00, 0x00, 0x20, 0x71, 0x00, 0x00, + 0x70, 0x10, 0xa0, 0x85, 0x80, 0x04, 0x70, 0x12, 0x00, 0xee, 0x00, 0x05, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0xe6, 0x22, 0x70, 0x70, 0x0b, + 0x00, 0x00, 0x20, 0x71, 0xb9, 0x13, 0x70, 0x18, 0xa0, 0x88, 0xb9, 0x1c, + 0x22, 0x0a, 0x80, 0x00, 0xa0, 0x84, 0x00, 0x07, 0x70, 0x1a, 0x70, 0x04, + 0xa0, 0x05, 0x11, 0x28, 0x00, 0xf6, 0x20, 0x79, 0x00, 0x10, 0x00, 0x89, + 0x00, 0xfe, 0x00, 0xee, 0x01, 0x2e, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, + 0xb9, 0x13, 0x70, 0x04, 0xa0, 0x05, 0x11, 0x28, 0x00, 0xf6, 0x20, 0x79, + 0x00, 0x10, 0x00, 0x19, 0x00, 0xfe, 0x00, 0xee, 0x00, 0x05, 0x70, 0x00, + 0x00, 0x02, 0x16, 0x77, 0x16, 0xdb, 0x16, 0xf8, 0x16, 0xf8, 0x70, 0x18, + 0x71, 0x1c, 0xa1, 0x06, 0x11, 0x18, 0x70, 0x07, 0x00, 0x00, 0x00, 0x05, + 0x00, 0xd6, 0xa1, 0x80, 0xb9, 0x1c, 0x20, 0x04, 0x70, 0x0a, 0x20, 0x68, + 0x81, 0x08, 0xa1, 0x8c, 0x00, 0x07, 0x71, 0x1e, 0x78, 0x03, 0x00, 0x26, + 0x68, 0x24, 0x78, 0x32, 0x68, 0x28, 0x78, 0x36, 0x68, 0x2c, 0x78, 0x3a, + 0x68, 0x30, 0x78, 0x3e, 0x68, 0x10, 0x70, 0x0e, 0x68, 0x0c, 0x70, 0x16, + 0x68, 0x04, 0x00, 0xde, 0xd0, 0x84, 0x01, 0x20, 0x70, 0x07, 0x00, 0x01, + 0x00, 0x29, 0x00, 0x05, 0x70, 0x07, 0x00, 0x02, 0x00, 0xb1, 0x00, 0x05, + 0x00, 0x16, 0x00, 0x26, 0x71, 0x0c, 0x20, 0x11, 0x00, 0x40, 0xa1, 0x82, + 0x00, 0x40, 0x12, 0x10, 0x21, 0x10, 0xa0, 0x06, 0x70, 0x0e, 0x72, 0x12, + 0x82, 0x03, 0x78, 0x22, 0x78, 0x03, 0x00, 0x20, 0x78, 0x03, 0x00, 0x41, + 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, 0x01, 0x36, + 0x01, 0x46, 0x01, 0x56, 0x70, 0x14, 0x20, 0x98, 0x20, 0xa1, 0x00, 0x14, + 0x78, 0x03, 0x00, 0x26, 0x71, 0x0c, 0x20, 0x11, 0x00, 0x40, 0xa1, 0x82, + 0x00, 0x40, 0x12, 0x10, 0x21, 0x10, 0xa0, 0x06, 0x70, 0x0e, 0x22, 0xa8, + 0x53, 0xa6, 0x82, 0x03, 0x78, 0x22, 0x78, 0x03, 0x00, 0x20, 0x33, 0x00, + 0x70, 0x16, 0x78, 0x03, 0x00, 0x01, 0x01, 0x5e, 0x01, 0x4e, 0x01, 0x3e, + 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, + 0x20, 0x99, 0xb6, 0xfa, 0x20, 0xa1, 0x00, 0x18, 0x20, 0xa9, 0x00, 0x08, + 0x53, 0xa3, 0x78, 0x03, 0x00, 0x20, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x78, 0x03, 0x00, 0x41, 0x70, 0x07, 0x00, 0x03, 0x70, 0x00, 0xc0, 0x84, + 0x70, 0x02, 0x70, 0x0b, 0xb6, 0xf5, 0x01, 0x2e, 0x01, 0x5e, 0x01, 0x4e, + 0x01, 0x3e, 0x00, 0x05, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x20, 0x01, + 0xb7, 0x29, 0x20, 0x9c, 0x20, 0xa1, 0x00, 0x14, 0x78, 0x03, 0x00, 0x26, + 0x20, 0x01, 0xb7, 0x2a, 0x20, 0xac, 0x53, 0xa6, 0x20, 0x99, 0xb7, 0x2b, + 0x20, 0xa1, 0x00, 0x18, 0x20, 0xa9, 0x00, 0x08, 0x53, 0xa3, 0x78, 0x03, + 0x00, 0x20, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x78, 0x03, 0x00, 0x01, + 0x70, 0x07, 0x00, 0x04, 0x70, 0x00, 0xc0, 0x8c, 0x70, 0x02, 0x70, 0x0b, + 0xb7, 0x26, 0x01, 0x2e, 0x01, 0x5e, 0x01, 0x4e, 0x01, 0x3e, 0x00, 0x05, + 0x00, 0x16, 0x00, 0xe6, 0x20, 0x71, 0xb9, 0x13, 0x00, 0xf6, 0x20, 0x79, + 0x00, 0x10, 0x79, 0x04, 0x78, 0x03, 0x00, 0x02, 0xd1, 0xfc, 0x01, 0x20, + 0xa1, 0x8c, 0x07, 0x00, 0x70, 0x04, 0x00, 0x23, 0x00, 0xfe, 0x00, 0xee, + 0x00, 0x1e, 0x00, 0x05, 0x16, 0x71, 0x17, 0x3b, 0x17, 0x69, 0x17, 0x93, + 0x17, 0xc3, 0x17, 0x3a, 0x0c, 0xf8, 0xa1, 0x8c, 0x07, 0x00, 0x15, 0x28, + 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x70, 0x14, 0x20, 0xa0, 0x20, 0x99, + 0x00, 0x14, 0x78, 0x03, 0x00, 0x40, 0x70, 0x10, 0x20, 0xa8, 0x53, 0xa5, + 0x34, 0x00, 0x70, 0x16, 0x01, 0x5e, 0x01, 0x4e, 0x01, 0x3e, 0x70, 0x0c, + 0xa0, 0x05, 0x05, 0x70, 0x78, 0x30, 0x78, 0x32, 0x78, 0x34, 0x78, 0x36, + 0x08, 0x0c, 0x16, 0xa2, 0x00, 0x05, 0x70, 0x08, 0xa0, 0x80, 0x00, 0x02, + 0x20, 0x03, 0x01, 0x00, 0x70, 0x07, 0x00, 0x00, 0x08, 0x0c, 0x16, 0x71, + 0x00, 0x05, 0x70, 0x08, 0xa0, 0x80, 0x00, 0x02, 0x20, 0x03, 0x02, 0x00, + 0x0c, 0xa8, 0xa1, 0x8c, 0x07, 0x00, 0x11, 0x50, 0x70, 0x0c, 0xa0, 0x05, + 0x01, 0x88, 0x78, 0x30, 0x78, 0x32, 0x78, 0x34, 0x78, 0x36, 0x08, 0x0c, + 0x16, 0xb7, 0x00, 0x05, 0x70, 0x08, 0xa0, 0x80, 0x00, 0x02, 0x20, 0x03, + 0x02, 0x00, 0x70, 0x07, 0x00, 0x00, 0x08, 0x0c, 0x16, 0x71, 0x00, 0x05, + 0x00, 0xd6, 0x70, 0x08, 0x20, 0x68, 0x78, 0x30, 0x68, 0x26, 0x78, 0x34, + 0x68, 0x2a, 0x78, 0x38, 0x68, 0x2e, 0x78, 0x3c, 0x68, 0x32, 0x68, 0x0b, + 0x01, 0x00, 0x00, 0xde, 0x70, 0x07, 0x00, 0x00, 0x08, 0x0c, 0x16, 0x71, + 0x00, 0x05, 0xa1, 0x8c, 0x07, 0x00, 0x15, 0x40, 0x01, 0x36, 0x01, 0x46, + 0x01, 0x56, 0x20, 0x01, 0xb6, 0xf8, 0x20, 0x04, 0xa0, 0x80, 0x00, 0x0d, + 0x20, 0xa0, 0x20, 0x99, 0x00, 0x14, 0x78, 0x03, 0x00, 0x40, 0x20, 0xa9, + 0x00, 0x20, 0x53, 0xa5, 0x20, 0x01, 0xb6, 0xfa, 0x20, 0x04, 0xd0, 0xbc, + 0x01, 0x48, 0x20, 0x01, 0xb7, 0x03, 0x20, 0x04, 0xa0, 0x80, 0x00, 0x0d, + 0x20, 0xa0, 0x20, 0xa9, 0x00, 0x20, 0x53, 0xa5, 0x01, 0x5e, 0x01, 0x4e, + 0x01, 0x3e, 0x70, 0x07, 0x00, 0x00, 0x08, 0x0c, 0x5e, 0xe1, 0x08, 0x0c, + 0x16, 0x71, 0x00, 0x05, 0x20, 0x11, 0x80, 0x03, 0x08, 0x0c, 0x3f, 0x13, + 0x0c, 0xf8, 0xa1, 0x8c, 0x07, 0x00, 0x11, 0x48, 0x20, 0x01, 0xb7, 0x28, + 0x20, 0x03, 0x01, 0x00, 0x70, 0x07, 0x00, 0x00, 0x08, 0x0c, 0x16, 0x71, + 0x00, 0x05, 0x20, 0x11, 0x80, 0x04, 0x08, 0x0c, 0x3f, 0x13, 0x0c, 0xf8, + 0x01, 0x26, 0x20, 0x91, 0x22, 0x00, 0x20, 0x79, 0x00, 0x30, 0x20, 0x71, + 0xb9, 0x24, 0x70, 0x03, 0x00, 0x00, 0x70, 0x0f, 0xb9, 0x30, 0x70, 0x13, + 0xb9, 0x30, 0x78, 0x0f, 0x00, 0xf6, 0x78, 0x03, 0x00, 0x04, 0x01, 0x2e, + 0x00, 0x05, 0x69, 0x34, 0xa1, 0x84, 0x00, 0x07, 0x00, 0x02, 0x17, 0xf3, + 0x18, 0x31, 0x17, 0xf3, 0x17, 0xf3, 0x17, 0xf3, 0x18, 0x19, 0x18, 0x00, + 0x17, 0xf7, 0xa0, 0x85, 0x00, 0x01, 0x08, 0x04, 0x18, 0x4b, 0x68, 0x4c, + 0xd0, 0xbc, 0x0d, 0xc8, 0x68, 0x60, 0x68, 0x2e, 0x68, 0x5c, 0x68, 0x2a, + 0x68, 0x58, 0x04, 0xc8, 0xa1, 0x8c, 0x00, 0xff, 0xa1, 0x86, 0x00, 0x1e, + 0x1d, 0x70, 0x68, 0x4c, 0xd0, 0xbc, 0x0d, 0x58, 0x68, 0x60, 0x68, 0x2e, + 0x68, 0x5c, 0x68, 0x2a, 0x68, 0x04, 0x68, 0x1a, 0xa0, 0x80, 0x00, 0x0d, + 0x20, 0x04, 0xa0, 0x84, 0x00, 0x0f, 0xa0, 0x80, 0x23, 0x08, 0x20, 0x05, + 0x68, 0x32, 0x68, 0x58, 0x04, 0x40, 0xa1, 0x8c, 0x00, 0xff, 0xa1, 0x86, + 0x00, 0x15, 0x19, 0xa8, 0x68, 0x4c, 0xd0, 0xac, 0x09, 0x90, 0x68, 0x04, + 0x68, 0x1a, 0xa0, 0x80, 0x00, 0x0d, 0x20, 0x04, 0xa0, 0x84, 0x00, 0x0f, + 0xa0, 0x80, 0x23, 0x08, 0x20, 0x05, 0x68, 0x32, 0xa0, 0x06, 0x68, 0x2e, + 0x68, 0x2a, 0x68, 0x58, 0x00, 0x80, 0x68, 0x4c, 0xd0, 0xac, 0x09, 0x04, + 0x17, 0xf3, 0xa0, 0x06, 0x68, 0x2e, 0x68, 0x2a, 0x68, 0x58, 0xa1, 0x8c, + 0x00, 0x0f, 0xa1, 0x88, 0x23, 0x08, 0x21, 0x0d, 0x69, 0x32, 0x2d, 0x08, + 0x69, 0x1a, 0x68, 0x26, 0x68, 0x4c, 0xc0, 0xdd, 0x68, 0x4e, 0xa0, 0x06, + 0x68, 0x0a, 0x69, 0x7c, 0x69, 0x12, 0x69, 0x80, 0x69, 0x16, 0x00, 0x05, + 0x68, 0x4c, 0xd0, 0xac, 0x09, 0x0c, 0x15, 0x1a, 0x68, 0x33, 0x23, 0x05, + 0x2d, 0x08, 0x69, 0x1a, 0x68, 0x58, 0x80, 0x01, 0x68, 0x26, 0x68, 0x4c, + 0xc0, 0xdd, 0x68, 0x4e, 0xa0, 0x06, 0x68, 0x0a, 0x68, 0x2e, 0x68, 0x2a, + 0x69, 0x7c, 0x69, 0x12, 0x69, 0x80, 0x69, 0x16, 0x00, 0x05, 0x20, 0xe1, + 0x00, 0x07, 0x20, 0xe1, 0x20, 0x00, 0x20, 0x01, 0x02, 0x0a, 0x20, 0x04, + 0x82, 0xff, 0x01, 0xe8, 0xa2, 0x80, 0x00, 0x04, 0x00, 0xd6, 0x20, 0x6c, + 0x68, 0x4c, 0xd0, 0xdc, 0x11, 0x90, 0xa2, 0x80, 0x00, 0x07, 0x20, 0x04, + 0xa0, 0x86, 0x00, 0x0a, 0x11, 0x10, 0x08, 0x91, 0x00, 0x10, 0x08, 0x0c, + 0x17, 0xe7, 0x01, 0x38, 0x00, 0xde, 0xa2, 0x80, 0x00, 0x00, 0x20, 0x03, + 0x00, 0x02, 0xa0, 0x16, 0x00, 0x20, 0x68, 0x08, 0x80, 0x00, 0x68, 0x0a, + 0x00, 0xde, 0x01, 0x26, 0x00, 0x46, 0x00, 0x36, 0x00, 0x26, 0x20, 0x91, + 0x22, 0x00, 0x00, 0x2e, 0x00, 0x3e, 0x00, 0x4e, 0x70, 0x00, 0xa0, 0x05, + 0x01, 0xd0, 0x71, 0x0c, 0x22, 0x0a, 0x81, 0x08, 0x23, 0x0a, 0x81, 0x08, + 0x24, 0x0a, 0x81, 0x08, 0xa1, 0x82, 0xb9, 0x4b, 0x02, 0x10, 0x20, 0x09, + 0xb9, 0x30, 0x71, 0x0e, 0x70, 0x10, 0xa1, 0x02, 0xa0, 0x82, 0x00, 0x09, + 0x01, 0x18, 0xa0, 0x80, 0x00, 0x1b, 0x11, 0x18, 0x20, 0x09, 0x01, 0x38, + 0x20, 0x0a, 0x01, 0x2e, 0x00, 0x05, 0x72, 0x06, 0x20, 0x01, 0x18, 0xad, + 0x00, 0x06, 0x22, 0x60, 0x08, 0x04, 0x19, 0xda, 0x01, 0x26, 0x00, 0x26, + 0x00, 0x36, 0x00, 0xc6, 0x00, 0x06, 0x20, 0x91, 0x22, 0x00, 0x00, 0x0e, + 0x00, 0x4e, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0xd6, 0x00, 0xc6, 0x24, 0x60, + 0x61, 0x10, 0x21, 0x68, 0x6a, 0x62, 0x6b, 0x5e, 0xa0, 0x05, 0x09, 0x04, + 0x19, 0x0f, 0x68, 0x08, 0xa0, 0x05, 0x09, 0x04, 0x19, 0x46, 0x70, 0x00, + 0xa0, 0x05, 0x11, 0x08, 0x04, 0x88, 0x70, 0x0c, 0x71, 0x10, 0xa1, 0x06, + 0x19, 0x04, 0x19, 0x4e, 0x70, 0x04, 0xa4, 0x06, 0x15, 0x48, 0x20, 0x01, + 0x00, 0x05, 0x20, 0x04, 0xd0, 0x8c, 0x01, 0x68, 0x00, 0x46, 0x08, 0x0c, + 0x1b, 0x22, 0x00, 0x4e, 0x24, 0x60, 0x60, 0x10, 0xa0, 0x80, 0x00, 0x02, + 0x20, 0x04, 0xa0, 0x05, 0x09, 0x04, 0x19, 0x46, 0x0c, 0x10, 0x20, 0x01, + 0x02, 0x07, 0x20, 0x04, 0xd0, 0x9c, 0x1d, 0x48, 0x78, 0x04, 0xa0, 0x84, + 0x60, 0x00, 0x01, 0x20, 0xa0, 0x86, 0x60, 0x00, 0x01, 0x08, 0x0c, 0x08, + 0x78, 0x18, 0x68, 0x12, 0x78, 0x1c, 0x68, 0x16, 0x78, 0x03, 0x00, 0x04, + 0x70, 0x03, 0x00, 0x00, 0x70, 0x04, 0x20, 0x60, 0x61, 0x00, 0xa1, 0x8e, + 0x00, 0x04, 0x19, 0x04, 0x19, 0x4e, 0x20, 0x09, 0x00, 0x48, 0x08, 0x0c, + 0x86, 0xd3, 0x08, 0x04, 0x19, 0x4e, 0x68, 0x08, 0xa0, 0x05, 0x05, 0xa0, + 0x70, 0x00, 0xa0, 0x05, 0x05, 0x88, 0x70, 0x0c, 0x71, 0x10, 0xa1, 0x06, + 0x11, 0x18, 0x70, 0x04, 0xa4, 0x06, 0x15, 0x50, 0x20, 0x01, 0x00, 0x05, + 0x20, 0x04, 0xd0, 0x8c, 0x01, 0x60, 0x00, 0x46, 0x08, 0x0c, 0x1b, 0x22, + 0x00, 0x4e, 0x24, 0x60, 0x60, 0x10, 0xa0, 0x80, 0x00, 0x02, 0x20, 0x04, + 0xa0, 0x05, 0x01, 0xd0, 0x0c, 0x28, 0x20, 0x01, 0x02, 0x07, 0x20, 0x04, + 0xd0, 0x9c, 0x1d, 0x50, 0x20, 0x01, 0x00, 0x05, 0x20, 0x04, 0xd0, 0x8c, + 0x1d, 0x50, 0x78, 0x04, 0xa0, 0x84, 0x60, 0x00, 0x01, 0x18, 0xa0, 0x86, + 0x60, 0x00, 0x19, 0xf0, 0x78, 0x18, 0x68, 0x12, 0x78, 0x1c, 0x68, 0x16, + 0x78, 0x03, 0x00, 0x04, 0x70, 0x03, 0x00, 0x00, 0x61, 0x00, 0xa1, 0x8e, + 0x00, 0x04, 0x11, 0x20, 0x20, 0x09, 0x00, 0x48, 0x08, 0x0c, 0x86, 0xd3, + 0x00, 0xce, 0x00, 0xde, 0x01, 0x2e, 0x00, 0x05, 0x00, 0xf6, 0x00, 0xe6, + 0x00, 0x26, 0x00, 0x36, 0x00, 0x46, 0x00, 0x56, 0x20, 0x71, 0xb9, 0x24, + 0x70, 0x00, 0xa0, 0x86, 0x00, 0x00, 0x09, 0x04, 0x19, 0xb8, 0x70, 0x04, + 0xac, 0x06, 0x19, 0x04, 0x19, 0xaa, 0x20, 0x79, 0x00, 0x30, 0x70, 0x00, + 0xa0, 0x86, 0x00, 0x03, 0x09, 0x04, 0x19, 0xaa, 0x78, 0x04, 0xd0, 0xfc, + 0x15, 0xc8, 0x20, 0xe1, 0x60, 0x00, 0x20, 0x11, 0x00, 0x32, 0x20, 0x01, + 0x02, 0x08, 0x20, 0x0c, 0x20, 0x01, 0x02, 0x09, 0x20, 0x04, 0xa1, 0x06, + 0x1d, 0x88, 0x82, 0x11, 0x1d, 0xb0, 0x78, 0x04, 0xd0, 0xfc, 0x15, 0x40, + 0x08, 0x0c, 0x1e, 0x8a, 0x00, 0x26, 0x00, 0x56, 0x78, 0x03, 0x00, 0x04, + 0x78, 0x04, 0xd0, 0xac, 0x1d, 0xe8, 0x78, 0x03, 0x00, 0x02, 0x78, 0x03, + 0x00, 0x09, 0x70, 0x03, 0x00, 0x03, 0x70, 0x07, 0x00, 0x00, 0x00, 0x5e, + 0x00, 0x2e, 0x20, 0x01, 0x01, 0x5d, 0x20, 0x03, 0x00, 0x00, 0x08, 0x0c, + 0x5b, 0x41, 0x11, 0x38, 0x00, 0x66, 0x20, 0x31, 0x00, 0x01, 0x08, 0x0c, + 0x5b, 0xc3, 0x00, 0x6e, 0x00, 0x58, 0x20, 0x01, 0x01, 0x60, 0x25, 0x02, + 0x20, 0x01, 0x01, 0x38, 0x22, 0x02, 0x00, 0x20, 0x08, 0x0c, 0x1b, 0x22, + 0x08, 0x04, 0x19, 0x5a, 0x01, 0x56, 0x20, 0xa9, 0x00, 0x09, 0x20, 0x09, + 0xb9, 0x30, 0x21, 0x04, 0xac, 0x06, 0x11, 0x08, 0x20, 0x0a, 0xa1, 0x88, + 0x00, 0x03, 0x1f, 0x04, 0x19, 0xaf, 0x01, 0x5e, 0x00, 0x5e, 0x00, 0x4e, + 0x00, 0x3e, 0x00, 0x2e, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, 0x70, 0x0c, + 0x71, 0x10, 0xa1, 0x06, 0x09, 0x04, 0x1a, 0x4e, 0x21, 0x04, 0x70, 0x06, + 0x20, 0x60, 0x81, 0x08, 0x21, 0x1c, 0x81, 0x08, 0x21, 0x24, 0x81, 0x08, + 0xa1, 0x82, 0xb9, 0x4b, 0x02, 0x10, 0x20, 0x09, 0xb9, 0x30, 0x71, 0x12, + 0x70, 0x0c, 0xa1, 0x06, 0x11, 0x28, 0x08, 0x0c, 0x29, 0x20, 0x20, 0x01, + 0x01, 0x38, 0x21, 0x02, 0x8c, 0xff, 0x05, 0x98, 0x60, 0x10, 0x20, 0x68, + 0x2d, 0x58, 0x68, 0x28, 0xa4, 0x06, 0x15, 0x90, 0x68, 0x2c, 0xa3, 0x06, + 0x15, 0x78, 0x70, 0x04, 0x20, 0x60, 0x60, 0x20, 0xc0, 0xd4, 0x60, 0x22, + 0x68, 0x4c, 0xd0, 0xf4, 0x01, 0x28, 0x68, 0x17, 0xff, 0xff, 0x68, 0x13, + 0xff, 0xff, 0x00, 0xe8, 0x68, 0x50, 0xd0, 0xf4, 0x11, 0x30, 0x78, 0x03, + 0x00, 0x04, 0x68, 0x10, 0x78, 0x1a, 0x68, 0x14, 0x78, 0x1e, 0x68, 0x24, + 0x20, 0x50, 0x68, 0x18, 0x20, 0x60, 0x68, 0x30, 0x20, 0x40, 0x60, 0x34, + 0xa0, 0xcc, 0x00, 0x0f, 0x20, 0x09, 0x00, 0x11, 0x08, 0x0c, 0x1a, 0x51, + 0x01, 0x20, 0x20, 0x09, 0x00, 0x01, 0x08, 0x0c, 0x1a, 0x51, 0x2d, 0x58, + 0x00, 0x05, 0x08, 0x0c, 0x1d, 0xf9, 0x09, 0x04, 0x19, 0xbf, 0x0c, 0xd0, + 0x60, 0x20, 0xd0, 0xf4, 0x11, 0xe0, 0xd0, 0xd4, 0x01, 0xb8, 0x60, 0x38, + 0xa4, 0x02, 0x60, 0x34, 0xa3, 0x03, 0x01, 0x08, 0x12, 0x88, 0x64, 0x3a, + 0x63, 0x36, 0x6c, 0x2a, 0x6b, 0x2e, 0x00, 0x46, 0x00, 0x36, 0x24, 0x00, + 0x6c, 0x7c, 0xa4, 0x02, 0x68, 0x12, 0x23, 0x00, 0x6b, 0x80, 0xa3, 0x03, + 0x68, 0x16, 0x00, 0x3e, 0x00, 0x4e, 0x00, 0x18, 0x08, 0x0c, 0xa0, 0x56, + 0x09, 0xe0, 0x60, 0x1c, 0xa0, 0x8e, 0x00, 0x08, 0x09, 0x04, 0x19, 0xe5, + 0xa0, 0x8e, 0x00, 0x0a, 0x09, 0x04, 0x19, 0xe5, 0x20, 0x01, 0xb6, 0x74, + 0x20, 0x04, 0xd0, 0xb4, 0x11, 0x40, 0x60, 0x18, 0x20, 0x04, 0xd0, 0xbc, + 0x11, 0x20, 0x68, 0x17, 0x7f, 0xff, 0x68, 0x13, 0xff, 0xff, 0x08, 0x0c, + 0x23, 0x28, 0x19, 0x18, 0x08, 0x04, 0x19, 0xe5, 0x70, 0x03, 0x00, 0x00, + 0x00, 0x05, 0x8a, 0xff, 0x09, 0x04, 0x1a, 0xfc, 0xa0, 0x3e, 0x27, 0x30, + 0xc9, 0xfc, 0x68, 0x50, 0xd0, 0xfc, 0x11, 0xb8, 0xd0, 0xf4, 0x15, 0x88, + 0x00, 0xd6, 0x28, 0x05, 0xac, 0x68, 0x29, 0x00, 0x00, 0x02, 0x1a, 0xba, + 0x1a, 0x93, 0x1a, 0x93, 0x1a, 0xba, 0x1a, 0xba, 0x1a, 0xb2, 0x1a, 0xba, + 0x1a, 0x93, 0x1a, 0xba, 0x1a, 0x9b, 0x1a, 0x9b, 0x1a, 0xba, 0x1a, 0xba, + 0x1a, 0xba, 0x1a, 0xaa, 0x1a, 0x9b, 0x78, 0x03, 0x00, 0x04, 0xc0, 0xfc, + 0x68, 0x52, 0x6b, 0x6c, 0x6a, 0x70, 0x6d, 0x1c, 0x6c, 0x20, 0x00, 0xd6, + 0xd9, 0x9c, 0x01, 0x40, 0x28, 0x05, 0xac, 0x68, 0x6f, 0x08, 0x6e, 0x0c, + 0x08, 0x0c, 0x23, 0xed, 0x01, 0x20, 0x04, 0xd0, 0x08, 0x0c, 0x23, 0xed, + 0x15, 0xb0, 0x68, 0x50, 0xc0, 0xfd, 0x68, 0x52, 0x00, 0xde, 0xa0, 0x06, + 0x00, 0x05, 0xc0, 0xf4, 0x68, 0x52, 0x6b, 0x6c, 0x6a, 0x70, 0x00, 0xd6, + 0x04, 0xc0, 0x6b, 0x08, 0x6a, 0x0c, 0x6d, 0x00, 0x6c, 0x04, 0x08, 0x0c, + 0x23, 0xed, 0x0d, 0x80, 0x04, 0x10, 0x6b, 0x10, 0x6a, 0x14, 0x6d, 0x00, + 0x6c, 0x04, 0x6f, 0x08, 0x6e, 0x0c, 0x08, 0x0c, 0x23, 0xed, 0x0d, 0x30, + 0x00, 0xc8, 0x6d, 0x00, 0x6c, 0x04, 0x6f, 0x08, 0x6e, 0x0c, 0x00, 0xa0, + 0x00, 0xde, 0x00, 0xd6, 0x68, 0x34, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, + 0x00, 0x1e, 0x11, 0x40, 0x00, 0xde, 0x08, 0x0c, 0x22, 0xca, 0x19, 0x04, + 0x1a, 0x51, 0xa0, 0x0e, 0x08, 0x04, 0x1a, 0xfc, 0x00, 0xde, 0x08, 0x0c, + 0x15, 0x1a, 0xc9, 0xfd, 0x7b, 0x22, 0x7a, 0x26, 0x7d, 0x32, 0x7c, 0x36, + 0x7f, 0x3a, 0x7e, 0x3e, 0x73, 0x16, 0x72, 0x1a, 0x75, 0x1e, 0x74, 0x22, + 0x77, 0x26, 0x76, 0x2a, 0x79, 0x02, 0x71, 0x00, 0x81, 0x08, 0x71, 0x02, + 0x00, 0xde, 0x68, 0x28, 0xa3, 0x00, 0x68, 0x2a, 0x68, 0x2c, 0xa2, 0x01, + 0x68, 0x2e, 0x81, 0x09, 0x2d, 0x08, 0x15, 0x00, 0xd9, 0xfc, 0x01, 0x60, + 0xc9, 0xfc, 0x08, 0x0c, 0x22, 0xca, 0x01, 0xe8, 0x28, 0x05, 0xac, 0x68, + 0x68, 0x00, 0xa5, 0x06, 0x11, 0xc0, 0x68, 0x04, 0xa4, 0x06, 0x00, 0xa8, + 0xc9, 0xfc, 0x08, 0x0c, 0x22, 0xca, 0x01, 0x88, 0x28, 0x05, 0xac, 0x68, + 0x68, 0x00, 0xa5, 0x06, 0x11, 0x60, 0x68, 0x04, 0xa4, 0x06, 0x11, 0x48, + 0x68, 0x08, 0xa7, 0x06, 0x11, 0x30, 0x68, 0x0c, 0xa6, 0x06, 0x00, 0x18, + 0xc9, 0xfc, 0x08, 0x0c, 0x22, 0xca, 0x21, 0x68, 0x00, 0x05, 0x08, 0x0c, + 0x15, 0x1a, 0x08, 0x0c, 0x1f, 0x71, 0x70, 0x04, 0x20, 0x60, 0x00, 0xd6, + 0x60, 0x10, 0x20, 0x68, 0x70, 0x03, 0x00, 0x00, 0x08, 0x0c, 0x1e, 0x1a, + 0x08, 0x0c, 0x9d, 0x16, 0x01, 0x70, 0x68, 0x08, 0x80, 0x01, 0x68, 0x0a, + 0x69, 0x7c, 0x69, 0x12, 0x69, 0x80, 0x69, 0x16, 0x68, 0x2b, 0xff, 0xff, + 0x68, 0x2f, 0xff, 0xff, 0x68, 0x50, 0xc0, 0xbd, 0x68, 0x52, 0x00, 0xde, + 0x08, 0x0c, 0x99, 0xe6, 0x08, 0x04, 0x1d, 0x47, 0x08, 0x0c, 0x15, 0x1a, + 0x01, 0x26, 0x20, 0x91, 0x22, 0x00, 0x00, 0x06, 0x00, 0x16, 0x2b, 0x68, + 0x68, 0x18, 0x20, 0x60, 0x79, 0x04, 0x78, 0x03, 0x00, 0x02, 0xa1, 0x84, + 0x07, 0x00, 0x19, 0x78, 0xa1, 0x84, 0x00, 0x03, 0xa0, 0x86, 0x00, 0x03, + 0x0d, 0x58, 0x70, 0x00, 0x00, 0x02, 0x1b, 0x3f, 0x1b, 0x45, 0x1c, 0x56, + 0x1d, 0x22, 0x1d, 0x36, 0x1b, 0x3f, 0x1b, 0x3f, 0x1b, 0x3f, 0x78, 0x04, + 0xd0, 0x9c, 0x19, 0x04, 0x1d, 0x47, 0x08, 0x0c, 0x15, 0x1a, 0x80, 0x01, + 0x70, 0x02, 0xd1, 0xbc, 0x11, 0xa0, 0xd1, 0x9c, 0x19, 0x04, 0x1b, 0xda, + 0xd1, 0xdc, 0x11, 0x78, 0x8a, 0xff, 0x09, 0x04, 0x1b, 0xda, 0x20, 0x09, + 0x00, 0x01, 0x08, 0x0c, 0x1a, 0x51, 0x09, 0x04, 0x1d, 0x47, 0x20, 0x09, + 0x00, 0x01, 0x08, 0x0c, 0x1a, 0x51, 0x08, 0x04, 0x1d, 0x47, 0x78, 0x03, + 0x00, 0x04, 0x70, 0x03, 0x00, 0x00, 0xd1, 0xbc, 0x19, 0x04, 0x1b, 0xba, + 0x00, 0x26, 0x00, 0x36, 0x7c, 0x20, 0x7d, 0x24, 0x7e, 0x30, 0x7f, 0x34, + 0x78, 0x18, 0x68, 0x12, 0x78, 0x1c, 0x68, 0x16, 0x20, 0x01, 0x02, 0x01, + 0x20, 0x04, 0xa0, 0x05, 0x01, 0x40, 0x78, 0x08, 0xd0, 0xec, 0x11, 0x28, + 0x78, 0x03, 0x00, 0x09, 0x70, 0x03, 0x00, 0x04, 0x00, 0x10, 0x08, 0x0c, + 0x1d, 0x4b, 0x6b, 0x28, 0x6a, 0x2c, 0x24, 0x00, 0x68, 0x6e, 0xa3, 0x1a, + 0x25, 0x00, 0x68, 0x72, 0xa2, 0x13, 0x6b, 0x2a, 0x6a, 0x2e, 0x00, 0xc6, + 0x70, 0x04, 0x20, 0x60, 0x60, 0x20, 0xd0, 0xf4, 0x11, 0x10, 0x63, 0x3a, + 0x62, 0x36, 0x00, 0xce, 0x00, 0x3e, 0x00, 0x2e, 0x6e, 0x1e, 0x6f, 0x22, + 0x25, 0x00, 0xa4, 0x05, 0x01, 0x28, 0x08, 0x0c, 0x22, 0xe0, 0x68, 0x50, + 0xc0, 0xfd, 0x68, 0x52, 0x2a, 0x00, 0x68, 0x26, 0x2c, 0x00, 0x68, 0x1a, + 0x28, 0x00, 0x68, 0x32, 0x68, 0x08, 0x80, 0x01, 0x68, 0x0a, 0x11, 0x48, + 0x68, 0x4c, 0xd0, 0xe4, 0x01, 0x30, 0x70, 0x04, 0x20, 0x60, 0x20, 0x09, + 0x00, 0x48, 0x08, 0x0c, 0x86, 0xd3, 0x70, 0x00, 0xa0, 0x86, 0x00, 0x04, + 0x09, 0x04, 0x1d, 0x47, 0x70, 0x03, 0x00, 0x00, 0x08, 0x0c, 0x19, 0xbf, + 0x08, 0x04, 0x1d, 0x47, 0x00, 0x56, 0x7d, 0x0c, 0xd5, 0xbc, 0x11, 0x10, + 0x08, 0x0c, 0xb4, 0xc3, 0x00, 0x5e, 0x08, 0x0c, 0x1e, 0x1a, 0x00, 0xf6, + 0x70, 0x04, 0x20, 0x78, 0x08, 0x0c, 0x53, 0x77, 0x01, 0x18, 0x78, 0x20, + 0xc0, 0xf5, 0x78, 0x22, 0x00, 0xfe, 0x68, 0x2b, 0xff, 0xff, 0x68, 0x2f, + 0xff, 0xff, 0x68, 0x08, 0x80, 0x01, 0x68, 0x0a, 0x69, 0x7c, 0x79, 0x1a, + 0x69, 0x80, 0x79, 0x1e, 0x08, 0x04, 0x1d, 0x47, 0x70, 0x04, 0x00, 0xc6, + 0x20, 0x60, 0x60, 0x20, 0x00, 0xce, 0xd0, 0xf4, 0x01, 0x20, 0x68, 0x08, + 0x80, 0x01, 0x68, 0x0a, 0x04, 0xc0, 0x78, 0x18, 0x68, 0x12, 0x7a, 0x1c, + 0x6a, 0x16, 0xd1, 0x9c, 0x01, 0x60, 0xa2, 0x05, 0x01, 0x50, 0x70, 0x04, + 0xa0, 0x80, 0x00, 0x07, 0x20, 0x04, 0xa0, 0x84, 0xff, 0xfd, 0xa0, 0x86, + 0x00, 0x08, 0x19, 0x04, 0x1b, 0x5d, 0x68, 0x4c, 0xc0, 0xf5, 0x68, 0x4e, + 0x78, 0x14, 0xa0, 0x05, 0x15, 0x20, 0x70, 0x03, 0x00, 0x00, 0x68, 0x08, + 0x80, 0x01, 0x68, 0x0a, 0x01, 0xa0, 0x70, 0x04, 0x20, 0x60, 0x60, 0x1c, + 0xa0, 0x86, 0x00, 0x0a, 0x11, 0xa0, 0x01, 0x56, 0x20, 0xa9, 0x00, 0x09, + 0x20, 0x09, 0xb9, 0x30, 0x21, 0x04, 0xac, 0x06, 0x11, 0x08, 0x20, 0x0a, + 0xa1, 0x88, 0x00, 0x03, 0x1f, 0x04, 0x1c, 0x0e, 0x01, 0x5e, 0x70, 0x04, + 0x20, 0x60, 0x20, 0x09, 0x00, 0x48, 0x08, 0x0c, 0x86, 0xd3, 0x08, 0x0c, + 0x19, 0xbf, 0x08, 0x04, 0x1d, 0x47, 0x78, 0x18, 0x68, 0x12, 0x78, 0x1c, + 0x68, 0x16, 0x78, 0x14, 0x79, 0x08, 0xa1, 0x8c, 0x0f, 0xff, 0xa1, 0x92, + 0x08, 0x41, 0x1a, 0x04, 0x1a, 0xff, 0xa1, 0x88, 0x00, 0x07, 0x81, 0x14, + 0x82, 0x14, 0x82, 0x14, 0xa1, 0x0a, 0x81, 0x04, 0x80, 0x04, 0x80, 0x04, + 0xa2, 0x0a, 0x81, 0x0b, 0x81, 0x0b, 0x81, 0x0b, 0x08, 0x0c, 0x1e, 0xb5, + 0x78, 0x03, 0x00, 0x04, 0x78, 0x0f, 0xff, 0xff, 0x78, 0x03, 0x00, 0x01, + 0x78, 0x04, 0xd0, 0xfc, 0x0d, 0xe8, 0x78, 0x03, 0x00, 0x02, 0x78, 0x03, + 0x00, 0x04, 0x78, 0x0f, 0x00, 0xf6, 0x70, 0x04, 0x70, 0x07, 0x00, 0x00, + 0x20, 0x60, 0x20, 0x09, 0x00, 0x48, 0x08, 0x0c, 0x86, 0xd3, 0x08, 0x0c, + 0x1f, 0x0b, 0x08, 0x38, 0x80, 0x01, 0x70, 0x02, 0xd1, 0x94, 0x01, 0xb0, + 0x78, 0x04, 0xd0, 0xfc, 0x19, 0x04, 0x1c, 0xf2, 0xd0, 0x9c, 0x01, 0x38, + 0x78, 0x04, 0xd0, 0xfc, 0x19, 0x04, 0x1c, 0xf2, 0xd0, 0x9c, 0x19, 0x04, + 0x1c, 0xf6, 0x8a, 0xff, 0x09, 0x04, 0x1d, 0x47, 0x20, 0x09, 0x00, 0x01, + 0x08, 0x0c, 0x1a, 0x51, 0x08, 0x04, 0x1d, 0x47, 0xa1, 0x84, 0x08, 0x88, + 0x11, 0x48, 0x8a, 0xff, 0x09, 0x04, 0x1d, 0x47, 0x20, 0x09, 0x00, 0x01, + 0x08, 0x0c, 0x1a, 0x51, 0x08, 0x04, 0x1d, 0x47, 0x78, 0x18, 0x68, 0x12, + 0x7a, 0x1c, 0x6a, 0x16, 0xa2, 0x05, 0x09, 0x04, 0x1b, 0xf7, 0x78, 0x03, + 0x00, 0x04, 0x70, 0x03, 0x00, 0x00, 0xd1, 0xbc, 0x19, 0x04, 0x1c, 0xd4, + 0x68, 0x34, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, 0x00, 0x29, 0x11, 0x18, + 0xd1, 0x9c, 0x19, 0x04, 0x1b, 0xf7, 0x00, 0x26, 0x00, 0x36, 0x7c, 0x20, + 0x7d, 0x24, 0x7e, 0x30, 0x7f, 0x34, 0x78, 0x18, 0x68, 0x12, 0x78, 0x1c, + 0x68, 0x16, 0x20, 0x01, 0x02, 0x01, 0x20, 0x04, 0xa0, 0x05, 0x01, 0x40, + 0x78, 0x08, 0xd0, 0xec, 0x11, 0x28, 0x78, 0x03, 0x00, 0x09, 0x70, 0x03, + 0x00, 0x04, 0x00, 0x20, 0x00, 0x16, 0x08, 0x0c, 0x1d, 0x4b, 0x00, 0x1e, + 0x6b, 0x28, 0x6a, 0x2c, 0x08, 0x0c, 0x22, 0xe0, 0x00, 0xd6, 0x28, 0x05, + 0xac, 0x68, 0x60, 0x34, 0xd0, 0x9c, 0x11, 0x28, 0x68, 0x08, 0xa3, 0x1a, + 0x68, 0x0c, 0xa2, 0x13, 0x00, 0x20, 0x68, 0x10, 0xa3, 0x1a, 0x68, 0x14, + 0xa2, 0x13, 0x00, 0xde, 0xd1, 0x94, 0x09, 0x04, 0x1b, 0x7f, 0x2a, 0x00, + 0x68, 0x26, 0x2c, 0x00, 0x68, 0x1a, 0x28, 0x00, 0x68, 0x32, 0x68, 0x08, + 0x80, 0x01, 0x68, 0x0a, 0x6b, 0x2a, 0x6a, 0x2e, 0x00, 0x3e, 0x00, 0x2e, + 0x08, 0x04, 0x1c, 0x1d, 0x00, 0x56, 0x7d, 0x0c, 0x08, 0x0c, 0xb4, 0xc3, + 0x00, 0x5e, 0x08, 0x0c, 0x1e, 0x1a, 0x00, 0xf6, 0x70, 0x04, 0x20, 0x78, + 0x08, 0x0c, 0x53, 0x77, 0x01, 0x18, 0x78, 0x20, 0xc0, 0xf5, 0x78, 0x22, + 0x00, 0xfe, 0x68, 0x2b, 0xff, 0xff, 0x68, 0x2f, 0xff, 0xff, 0x68, 0x08, + 0x80, 0x01, 0x68, 0x0a, 0x69, 0x7c, 0x79, 0x1a, 0x69, 0x80, 0x79, 0x1e, + 0x08, 0x04, 0x1d, 0x47, 0x78, 0x04, 0xd0, 0x9c, 0x09, 0x04, 0x1b, 0x2a, + 0x7c, 0x20, 0x78, 0x24, 0xa4, 0x05, 0x19, 0x04, 0x1b, 0x2a, 0x78, 0x18, + 0x68, 0x12, 0x7c, 0x1c, 0x6c, 0x16, 0xa4, 0x05, 0x11, 0x20, 0x78, 0x03, + 0x00, 0x02, 0x08, 0x04, 0x1b, 0xf7, 0x75, 0x1c, 0x74, 0x20, 0x77, 0x24, + 0x76, 0x28, 0x70, 0x14, 0xa5, 0x28, 0x70, 0x18, 0xa4, 0x21, 0xa7, 0xb9, + 0x00, 0x00, 0xa6, 0xb1, 0x00, 0x00, 0x78, 0x30, 0xa5, 0x06, 0x11, 0x50, + 0x78, 0x34, 0xa4, 0x06, 0x11, 0x38, 0x78, 0x38, 0xa7, 0x06, 0x11, 0x20, + 0x78, 0x3c, 0xa6, 0x06, 0x09, 0x04, 0x1b, 0x2a, 0x78, 0x03, 0x00, 0x02, + 0x08, 0x04, 0x1c, 0x83, 0x78, 0x03, 0x00, 0x04, 0x70, 0x03, 0x00, 0x00, + 0x70, 0x04, 0xa0, 0x0d, 0x01, 0x50, 0x68, 0x08, 0x80, 0x01, 0x68, 0x0a, + 0x11, 0x30, 0x70, 0x04, 0x20, 0x60, 0x20, 0x09, 0x00, 0x48, 0x08, 0x0c, + 0x86, 0xd3, 0x08, 0x0c, 0x19, 0xbf, 0x00, 0x88, 0x78, 0x03, 0x00, 0x04, + 0x70, 0x03, 0x00, 0x00, 0x70, 0x04, 0x20, 0x60, 0x60, 0x10, 0xa0, 0x05, + 0x0d, 0xa0, 0x20, 0x68, 0x68, 0x08, 0x80, 0x00, 0x68, 0x0a, 0x6c, 0x28, + 0x6b, 0x2c, 0x08, 0x0c, 0x19, 0xda, 0x00, 0x1e, 0x00, 0x0e, 0x01, 0x2e, + 0x00, 0x05, 0x70, 0x0c, 0x71, 0x10, 0xa1, 0x06, 0x09, 0x04, 0x1d, 0xed, + 0x70, 0x04, 0x00, 0x16, 0x21, 0x0c, 0xa1, 0x06, 0x00, 0x1e, 0x09, 0x04, + 0x1d, 0xed, 0x00, 0xd6, 0x00, 0xc6, 0x21, 0x6c, 0x2d, 0x00, 0xa0, 0x05, + 0x09, 0x04, 0x1d, 0xeb, 0x68, 0x1c, 0xa0, 0x86, 0x00, 0x08, 0x09, 0x04, + 0x1d, 0xeb, 0x68, 0x20, 0xd0, 0xd4, 0x19, 0x04, 0x1d, 0xeb, 0x68, 0x10, + 0x20, 0x68, 0x68, 0x50, 0xd0, 0xfc, 0x05, 0xa8, 0x81, 0x08, 0x21, 0x04, + 0x6b, 0x2c, 0xa3, 0x06, 0x19, 0x04, 0x1d, 0xeb, 0x81, 0x08, 0x21, 0x04, + 0x6a, 0x28, 0xa2, 0x06, 0x19, 0x04, 0x1d, 0xeb, 0x68, 0x50, 0xc0, 0xfc, + 0xc0, 0xf5, 0x68, 0x52, 0x68, 0x6c, 0x78, 0x22, 0x70, 0x16, 0x68, 0x70, + 0x78, 0x26, 0x70, 0x1a, 0x68, 0x1c, 0x78, 0x32, 0x70, 0x1e, 0x68, 0x20, + 0x78, 0x36, 0x70, 0x22, 0x68, 0x18, 0x20, 0x60, 0x60, 0x34, 0xd0, 0x9c, + 0x01, 0x68, 0x68, 0x30, 0x20, 0x05, 0x00, 0xd6, 0xac, 0x68, 0x68, 0x08, + 0x78, 0x3a, 0x70, 0x26, 0x68, 0x0c, 0x78, 0x3e, 0x70, 0x2a, 0x00, 0xde, + 0x08, 0x04, 0x1d, 0xe5, 0xa0, 0x06, 0x78, 0x3a, 0x78, 0x3e, 0x70, 0x26, + 0x70, 0x2a, 0x08, 0x04, 0x1d, 0xe5, 0x81, 0x08, 0x21, 0x04, 0xa0, 0x05, + 0x19, 0x04, 0x1d, 0xeb, 0x6b, 0x2c, 0xa3, 0x06, 0x19, 0x04, 0x1d, 0xeb, + 0x81, 0x08, 0x21, 0x04, 0xa0, 0x05, 0x15, 0xe8, 0x6a, 0x28, 0xa2, 0x06, + 0x15, 0xd0, 0x68, 0x50, 0xc0, 0xf5, 0x68, 0x52, 0x68, 0x30, 0x20, 0x05, + 0x69, 0x18, 0xa1, 0x60, 0xa1, 0x80, 0x00, 0x0d, 0x20, 0x04, 0xd0, 0x9c, + 0x11, 0xa0, 0x60, 0x08, 0x78, 0x22, 0x70, 0x16, 0x68, 0x6e, 0x60, 0x0c, + 0x78, 0x26, 0x70, 0x1a, 0x68, 0x72, 0x60, 0x00, 0x78, 0x32, 0x70, 0x1e, + 0x60, 0x04, 0x78, 0x36, 0x70, 0x22, 0xa0, 0x06, 0x78, 0x3a, 0x78, 0x3e, + 0x70, 0x26, 0x70, 0x2a, 0x00, 0xa0, 0x60, 0x10, 0x78, 0x22, 0x70, 0x16, + 0x68, 0x6e, 0x60, 0x14, 0x78, 0x26, 0x70, 0x1a, 0x68, 0x72, 0x60, 0x00, + 0x78, 0x32, 0x70, 0x1e, 0x60, 0x04, 0x78, 0x36, 0x70, 0x22, 0x60, 0x08, + 0x78, 0x3a, 0x70, 0x26, 0x60, 0x0c, 0x78, 0x3e, 0x70, 0x2a, 0x68, 0x10, + 0x78, 0x1a, 0x68, 0x14, 0x78, 0x1e, 0x78, 0x03, 0x00, 0x11, 0x00, 0xce, + 0x00, 0xde, 0x00, 0x05, 0x20, 0x11, 0x02, 0x01, 0x20, 0x09, 0x00, 0x3c, + 0x22, 0x04, 0xa0, 0x05, 0x11, 0x18, 0x81, 0x09, 0x1d, 0xd8, 0x00, 0x05, + 0x00, 0x05, 0x0c, 0xa1, 0x01, 0x18, 0x78, 0x0c, 0xd0, 0xa4, 0x01, 0x20, + 0x00, 0xd9, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x10, 0x08, 0x0c, 0x1f, 0x0b, + 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x22, 0x00, 0x70, 0x00, 0xa0, 0x86, + 0x00, 0x03, 0x11, 0x60, 0x70, 0x0c, 0x71, 0x10, 0xa1, 0x06, 0x01, 0x40, + 0x08, 0x0c, 0x29, 0x91, 0x20, 0xe1, 0x90, 0x28, 0x70, 0x0f, 0xb9, 0x30, + 0x70, 0x13, 0xb9, 0x30, 0x01, 0x2e, 0x00, 0x05, 0x00, 0xc6, 0x08, 0x0c, + 0x5b, 0x41, 0x11, 0xb8, 0x20, 0x01, 0x01, 0x60, 0x20, 0x03, 0x00, 0x00, + 0x20, 0x01, 0x01, 0x38, 0x20, 0x03, 0x00, 0x00, 0x20, 0x11, 0x00, 0xc8, + 0xe0, 0x00, 0xe0, 0x00, 0x82, 0x11, 0x1d, 0xe0, 0x04, 0xb1, 0x00, 0x66, + 0x20, 0x31, 0x00, 0x00, 0x08, 0x0c, 0x5b, 0xc3, 0x00, 0x6e, 0x00, 0xce, + 0x00, 0x05, 0x08, 0x0c, 0x1e, 0x8a, 0x08, 0x0c, 0x29, 0x91, 0x20, 0xe1, + 0x90, 0x28, 0x70, 0x0c, 0x71, 0x10, 0xa1, 0x06, 0x01, 0xc0, 0x21, 0x04, + 0xa0, 0x05, 0x01, 0x30, 0x20, 0x60, 0x60, 0x10, 0x20, 0x60, 0x60, 0x08, + 0x80, 0x01, 0x60, 0x0a, 0xa1, 0x88, 0x00, 0x03, 0xa1, 0x82, 0xb9, 0x4b, + 0x02, 0x10, 0x20, 0x09, 0xb9, 0x30, 0x71, 0x12, 0x70, 0x0c, 0xa1, 0x06, + 0x1d, 0x40, 0x08, 0x0c, 0x29, 0x20, 0x21, 0x10, 0x0c, 0x20, 0x20, 0x01, + 0x01, 0x5d, 0x20, 0x03, 0x00, 0x00, 0x20, 0x01, 0x01, 0x60, 0x25, 0x02, + 0x20, 0x01, 0x01, 0x38, 0x22, 0x02, 0x00, 0xce, 0x00, 0x05, 0x08, 0x0c, + 0x29, 0x91, 0x20, 0xe1, 0x90, 0x28, 0x20, 0x01, 0x01, 0x5d, 0x20, 0x03, + 0x00, 0x00, 0x00, 0xe6, 0x00, 0xc6, 0x00, 0x16, 0x20, 0x71, 0xb9, 0x24, + 0x70, 0x0c, 0x71, 0x10, 0xa1, 0x06, 0x01, 0x90, 0x21, 0x04, 0xa0, 0x05, + 0x01, 0x30, 0x20, 0x60, 0x60, 0x10, 0x20, 0x60, 0x60, 0x08, 0x80, 0x01, + 0x60, 0x0a, 0xa1, 0x88, 0x00, 0x03, 0xa1, 0x82, 0xb9, 0x4b, 0x02, 0x10, + 0x20, 0x09, 0xb9, 0x30, 0x71, 0x12, 0x0c, 0x50, 0x00, 0x1e, 0x00, 0xce, + 0x00, 0xee, 0x00, 0x05, 0x20, 0x01, 0x01, 0x38, 0x20, 0x14, 0x20, 0x03, + 0x00, 0x00, 0x20, 0x01, 0x01, 0x60, 0x20, 0x2c, 0x20, 0x03, 0x00, 0x00, + 0x08, 0x0c, 0x5b, 0x41, 0x11, 0x48, 0x20, 0x21, 0x00, 0x02, 0x1d, 0x04, + 0x1e, 0x99, 0x20, 0x91, 0x60, 0x00, 0x84, 0x21, 0x1d, 0xd0, 0x00, 0x05, + 0x20, 0x21, 0xb0, 0x15, 0x20, 0x01, 0x01, 0x41, 0x20, 0x1c, 0xd3, 0xdc, + 0x11, 0x68, 0x20, 0x01, 0x01, 0x09, 0x20, 0x1c, 0xa3, 0x9c, 0x00, 0x48, + 0x11, 0x38, 0x20, 0x01, 0x01, 0x11, 0x20, 0x1c, 0x83, 0xff, 0x11, 0x10, + 0x84, 0x21, 0x1d, 0x70, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0x02, 0x00, + 0x78, 0x08, 0xa0, 0x84, 0xf0, 0x00, 0xa1, 0x0d, 0x08, 0x69, 0x20, 0x01, + 0x01, 0x05, 0x20, 0x04, 0xa0, 0x84, 0x00, 0x03, 0x11, 0x30, 0x20, 0x01, + 0xb9, 0x4b, 0x20, 0x04, 0xa0, 0x86, 0x00, 0x00, 0x05, 0x48, 0xa0, 0x26, + 0x20, 0x19, 0xf0, 0x00, 0x83, 0x19, 0x11, 0x48, 0x20, 0x01, 0x01, 0x2b, + 0x20, 0x03, 0x95, 0xf5, 0x20, 0x01, 0x01, 0x29, 0x20, 0x03, 0x95, 0xf5, + 0x00, 0xd8, 0x20, 0x01, 0x01, 0x05, 0x20, 0x04, 0xa0, 0x84, 0x00, 0x03, + 0x11, 0x30, 0x20, 0x01, 0xb9, 0x4b, 0x20, 0x04, 0xa0, 0x86, 0x00, 0x00, + 0x01, 0x78, 0x20, 0x01, 0x01, 0x32, 0x20, 0x04, 0xa4, 0x36, 0x01, 0x10, + 0x20, 0x20, 0x0c, 0x00, 0x20, 0x01, 0x00, 0x21, 0x20, 0x04, 0xd0, 0xfc, + 0x09, 0xe8, 0x08, 0x0c, 0x21, 0x6d, 0x08, 0xc0, 0x20, 0xe1, 0x70, 0x00, + 0x73, 0x24, 0x74, 0x20, 0x70, 0x28, 0x70, 0x28, 0x74, 0x26, 0x70, 0x37, + 0x00, 0x01, 0x81, 0x0f, 0x71, 0x2e, 0x70, 0x2f, 0x01, 0x00, 0x70, 0x37, + 0x00, 0x08, 0x73, 0x26, 0x74, 0x22, 0x20, 0x01, 0x01, 0x60, 0x25, 0x02, + 0x20, 0x01, 0x01, 0x38, 0x22, 0x02, 0x00, 0xee, 0x00, 0x05, 0x00, 0x26, + 0x20, 0x01, 0x01, 0x5d, 0x20, 0x03, 0x00, 0x00, 0x79, 0x08, 0xa1, 0x8c, + 0x0f, 0xff, 0xa1, 0x82, 0x0f, 0xfd, 0x02, 0x10, 0x20, 0x09, 0x00, 0x00, + 0xa1, 0x90, 0x00, 0x07, 0xa2, 0x94, 0x1f, 0xf8, 0x82, 0x14, 0x82, 0x14, + 0x82, 0x14, 0x20, 0x01, 0x02, 0x0a, 0x82, 0xff, 0x01, 0x40, 0x20, 0xe1, + 0x60, 0x00, 0x20, 0x0c, 0x20, 0x0c, 0x20, 0x0c, 0x20, 0x0c, 0x82, 0x11, + 0x1d, 0xd0, 0x20, 0xe1, 0x70, 0x00, 0x20, 0x0c, 0x20, 0x0c, 0x70, 0x03, + 0x00, 0x00, 0x20, 0xe1, 0x60, 0x00, 0x20, 0x01, 0x02, 0x08, 0x20, 0x0c, + 0x20, 0x01, 0x02, 0x09, 0x20, 0x04, 0xa1, 0x06, 0x01, 0x58, 0x08, 0x0c, + 0x1d, 0xee, 0x01, 0x30, 0x79, 0x08, 0xd1, 0xec, 0x11, 0x28, 0x79, 0x0c, + 0xd1, 0xa4, 0x09, 0x60, 0x08, 0x0c, 0x1e, 0x1a, 0xa0, 0x06, 0x00, 0x2e, + 0x00, 0x05, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0x16, 0x00, 0x26, 0x20, 0x71, + 0xb9, 0x24, 0x20, 0x79, 0x00, 0x30, 0x20, 0x11, 0x00, 0x50, 0x70, 0x00, + 0xa0, 0x86, 0x00, 0x00, 0x01, 0xa8, 0x82, 0x11, 0x01, 0x88, 0x20, 0x01, + 0x00, 0x05, 0x20, 0x04, 0xd0, 0x8c, 0x0d, 0xc8, 0x79, 0x04, 0xa1, 0x8c, + 0x07, 0x80, 0x00, 0x16, 0x08, 0x0c, 0x1b, 0x22, 0x00, 0x1e, 0x81, 0xff, + 0x11, 0x18, 0x20, 0x11, 0x00, 0x50, 0x0c, 0x48, 0xa0, 0x85, 0x00, 0x01, + 0x00, 0x2e, 0x00, 0x1e, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, 0x78, 0x03, + 0x00, 0x04, 0x20, 0x09, 0x00, 0x64, 0x78, 0x04, 0xd0, 0xac, 0x09, 0x04, + 0x1f, 0xbd, 0x81, 0x09, 0x1d, 0xd0, 0x20, 0x09, 0x01, 0x00, 0x21, 0x0c, + 0xa1, 0x8a, 0x00, 0x03, 0x0a, 0x0c, 0x15, 0x1a, 0x08, 0x0c, 0x22, 0x74, + 0x00, 0xe6, 0x00, 0xf6, 0x20, 0x71, 0xb9, 0x13, 0x20, 0x79, 0x00, 0x10, + 0x70, 0x04, 0xa0, 0x86, 0x00, 0x00, 0x05, 0x38, 0x78, 0x00, 0x00, 0x06, + 0x78, 0x20, 0x00, 0x06, 0x78, 0x30, 0x00, 0x06, 0x78, 0x34, 0x00, 0x06, + 0x78, 0x38, 0x00, 0x06, 0x78, 0x3c, 0x00, 0x06, 0x78, 0x03, 0x00, 0x04, + 0xe0, 0x00, 0xe0, 0x00, 0x20, 0x79, 0x00, 0x30, 0x78, 0x04, 0xd0, 0xac, + 0x19, 0x0c, 0x15, 0x1a, 0x20, 0x79, 0x00, 0x10, 0x00, 0x0e, 0x78, 0x3e, + 0x00, 0x0e, 0x78, 0x3a, 0x00, 0x0e, 0x78, 0x36, 0x00, 0x0e, 0x78, 0x32, + 0x00, 0x0e, 0x78, 0x22, 0x00, 0x0e, 0x78, 0x02, 0x00, 0xfe, 0x00, 0xee, + 0x00, 0x30, 0x00, 0xfe, 0x00, 0xee, 0x78, 0x04, 0xd0, 0xac, 0x19, 0x0c, + 0x15, 0x1a, 0x08, 0x0c, 0x72, 0xa2, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, + 0xb9, 0x4b, 0x70, 0x03, 0x00, 0x00, 0x00, 0xee, 0x00, 0x05, 0x00, 0xd6, + 0xa2, 0x80, 0x00, 0x04, 0x20, 0x6c, 0x69, 0x4c, 0xd1, 0xdc, 0x19, 0x04, + 0x20, 0x3b, 0x69, 0x34, 0xa1, 0x84, 0x00, 0x07, 0x00, 0x02, 0x1f, 0xd9, + 0x20, 0x26, 0x1f, 0xd9, 0x1f, 0xd9, 0x1f, 0xd9, 0x20, 0x0d, 0x1f, 0xec, + 0x1f, 0xdb, 0x08, 0x0c, 0x15, 0x1a, 0x68, 0x4c, 0xd0, 0xb4, 0x09, 0x04, + 0x21, 0x2a, 0x68, 0x60, 0x68, 0x2e, 0x68, 0x16, 0x68, 0x5c, 0x68, 0x2a, + 0x68, 0x12, 0x68, 0x7c, 0x68, 0x0a, 0x68, 0x80, 0x68, 0x0e, 0x69, 0x58, + 0x08, 0x04, 0x20, 0x2e, 0x68, 0x34, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, + 0x00, 0x1e, 0x1d, 0x38, 0x68, 0x4c, 0xd0, 0xb4, 0x09, 0x04, 0x21, 0x2a, + 0x68, 0x60, 0x68, 0x2e, 0x68, 0x16, 0x68, 0x5c, 0x68, 0x2a, 0x68, 0x12, + 0x68, 0x7c, 0x68, 0x0a, 0x68, 0x80, 0x68, 0x0e, 0x68, 0x04, 0x68, 0x1a, + 0xa0, 0x80, 0x00, 0x0d, 0x20, 0x04, 0xa0, 0x84, 0x00, 0x0f, 0xa0, 0x80, + 0x23, 0x08, 0x20, 0x05, 0x68, 0x32, 0x69, 0x58, 0x04, 0x50, 0xa1, 0x8c, + 0x00, 0xff, 0xa1, 0x86, 0x00, 0x15, 0x15, 0x48, 0x68, 0x4c, 0xd0, 0xb4, + 0x09, 0x04, 0x21, 0x2a, 0x68, 0x04, 0x68, 0x1a, 0xa0, 0x80, 0x00, 0x0d, + 0x20, 0x04, 0xa0, 0x84, 0x00, 0x0f, 0xa0, 0x80, 0x23, 0x08, 0x20, 0x05, + 0x68, 0x32, 0x69, 0x58, 0xa0, 0x06, 0x68, 0x2e, 0x68, 0x2a, 0x00, 0x88, + 0x68, 0x4c, 0xd0, 0xb4, 0x09, 0x04, 0x1a, 0xfd, 0x69, 0x58, 0xa0, 0x06, + 0x68, 0x2e, 0x68, 0x2a, 0x2d, 0x00, 0x68, 0x1a, 0x68, 0x34, 0xa0, 0x84, + 0x00, 0x0f, 0xa0, 0x80, 0x23, 0x08, 0x20, 0x05, 0x68, 0x32, 0x69, 0x26, + 0x68, 0x4c, 0xc0, 0xdd, 0x68, 0x4e, 0x00, 0xde, 0x00, 0x05, 0x00, 0xf6, + 0x20, 0x79, 0x00, 0x20, 0x78, 0x04, 0xd0, 0xfc, 0x19, 0x0c, 0x21, 0x6d, + 0x00, 0xe6, 0x00, 0xd6, 0x20, 0x71, 0xb9, 0x4b, 0x70, 0x00, 0xa0, 0x05, + 0x19, 0x04, 0x20, 0xaa, 0x00, 0xc6, 0x72, 0x06, 0xa2, 0x80, 0x00, 0x04, + 0x20, 0x5c, 0x70, 0x04, 0x20, 0x68, 0x78, 0x03, 0x00, 0x04, 0x68, 0x18, + 0x00, 0xd6, 0x20, 0x68, 0x68, 0x6c, 0x78, 0x12, 0x68, 0x90, 0x00, 0xf6, + 0x20, 0xe1, 0x90, 0x40, 0x20, 0x79, 0x02, 0x00, 0x78, 0x1a, 0x20, 0x79, + 0x01, 0x00, 0x80, 0x04, 0x78, 0xd6, 0x00, 0xfe, 0x00, 0xde, 0x2b, 0x68, + 0x68, 0x24, 0x20, 0x50, 0x68, 0x18, 0x20, 0x60, 0x68, 0x30, 0x20, 0x40, + 0x60, 0x34, 0xa0, 0xcc, 0x00, 0x0f, 0x69, 0x08, 0x79, 0x1a, 0x71, 0x16, + 0x68, 0x0c, 0x78, 0x1e, 0x70, 0x1a, 0xa0, 0x06, 0x70, 0x0e, 0x70, 0x12, + 0x70, 0x04, 0x69, 0x2c, 0x68, 0x14, 0xa1, 0x06, 0x11, 0x20, 0x69, 0x28, + 0x68, 0x10, 0xa1, 0x06, 0x01, 0x90, 0x20, 0x01, 0xb6, 0x74, 0x20, 0x04, + 0xd0, 0xcc, 0x01, 0x10, 0x00, 0xce, 0x04, 0x00, 0x00, 0x36, 0x00, 0x46, + 0x6b, 0x14, 0x6c, 0x10, 0x08, 0x0c, 0x23, 0x28, 0x00, 0x4e, 0x00, 0x3e, + 0x01, 0x10, 0x00, 0xce, 0x00, 0xa8, 0x8a, 0xff, 0x11, 0x20, 0x00, 0xce, + 0xa0, 0x85, 0x00, 0x01, 0x00, 0x78, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x79, 0x00, 0x20, 0x20, 0x09, 0x00, 0x01, 0x00, 0x59, 0x01, 0x18, + 0x20, 0x09, 0x00, 0x01, 0x00, 0x39, 0x01, 0x2e, 0x00, 0xce, 0xa0, 0x06, + 0x00, 0xde, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, 0x00, 0x76, 0x00, 0x66, + 0x00, 0x56, 0x00, 0x46, 0x00, 0x36, 0x00, 0x26, 0x8a, 0xff, 0x09, 0x04, + 0x21, 0x23, 0x70, 0x0c, 0x72, 0x14, 0xa2, 0x3a, 0x70, 0x10, 0x72, 0x18, + 0xa2, 0x03, 0x0a, 0x04, 0x21, 0x22, 0xa7, 0x05, 0x09, 0x04, 0x21, 0x22, + 0xa0, 0x3e, 0x27, 0x30, 0x68, 0x50, 0xd0, 0xfc, 0x11, 0xa8, 0x00, 0xd6, + 0x28, 0x05, 0xac, 0x68, 0x29, 0x00, 0x00, 0x02, 0x21, 0x05, 0x20, 0xea, + 0x20, 0xea, 0x21, 0x05, 0x21, 0x05, 0x20, 0xfe, 0x21, 0x05, 0x20, 0xea, + 0x21, 0x05, 0x20, 0xef, 0x20, 0xef, 0x21, 0x05, 0x21, 0x05, 0x21, 0x05, + 0x20, 0xf6, 0x20, 0xef, 0xc0, 0xfc, 0x68, 0x52, 0x6b, 0x6c, 0x6a, 0x70, + 0x6d, 0x1c, 0x6c, 0x20, 0xd9, 0x9c, 0x05, 0x28, 0x00, 0xd6, 0x28, 0x05, + 0xac, 0x68, 0x6f, 0x08, 0x6e, 0x0c, 0x00, 0xf0, 0x6b, 0x08, 0x6a, 0x0c, + 0x6d, 0x00, 0x6c, 0x04, 0x00, 0xc8, 0x6b, 0x10, 0x6a, 0x14, 0x6d, 0x00, + 0x6c, 0x04, 0x6f, 0x08, 0x6e, 0x0c, 0x00, 0x90, 0x00, 0xde, 0x00, 0xd6, + 0x68, 0x34, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, 0x00, 0x1e, 0x11, 0x38, + 0x00, 0xde, 0x08, 0x0c, 0x22, 0xca, 0x19, 0x04, 0x20, 0xb4, 0xa0, 0x0e, + 0x00, 0xf0, 0x00, 0xde, 0x08, 0x0c, 0x15, 0x1a, 0x00, 0xde, 0x7b, 0x22, + 0x7a, 0x26, 0x7d, 0x32, 0x7c, 0x36, 0x7f, 0x3a, 0x7e, 0x3e, 0x79, 0x02, + 0x70, 0x00, 0x80, 0x00, 0x70, 0x02, 0x68, 0x28, 0xa3, 0x00, 0x68, 0x2a, + 0x68, 0x2c, 0xa2, 0x01, 0x68, 0x2e, 0x70, 0x0c, 0xa3, 0x00, 0x70, 0x0e, + 0x70, 0x10, 0xa2, 0x01, 0x70, 0x12, 0x08, 0x0c, 0x22, 0xca, 0x00, 0x08, + 0xa0, 0x06, 0x00, 0x2e, 0x00, 0x3e, 0x00, 0x4e, 0x00, 0x5e, 0x00, 0x6e, + 0x00, 0x7e, 0x00, 0x05, 0x08, 0x0c, 0x15, 0x1a, 0x00, 0x26, 0x20, 0x01, + 0x01, 0x05, 0x20, 0x03, 0x00, 0x10, 0x20, 0xe1, 0x90, 0x40, 0x78, 0x03, + 0x00, 0x04, 0x70, 0x03, 0x00, 0x00, 0x70, 0x04, 0x20, 0x60, 0x00, 0xd6, + 0x60, 0x10, 0x20, 0x68, 0x08, 0x0c, 0x9d, 0x16, 0x01, 0x18, 0x68, 0x50, + 0xc0, 0xbd, 0x68, 0x52, 0x60, 0x1c, 0xa0, 0x86, 0x00, 0x06, 0x11, 0x80, + 0x20, 0x61, 0x01, 0x00, 0x62, 0xc8, 0x20, 0x01, 0x00, 0xfa, 0x80, 0x01, + 0x1d, 0xf0, 0x60, 0xc8, 0xa2, 0x06, 0x1d, 0xc0, 0x60, 0xc4, 0x68, 0x6a, + 0x60, 0xc8, 0x68, 0x66, 0x70, 0x04, 0x20, 0x60, 0x00, 0xde, 0x00, 0xc6, + 0x08, 0x0c, 0x99, 0xe6, 0x00, 0xce, 0x20, 0x01, 0xb8, 0xf0, 0x20, 0x04, + 0xac, 0x06, 0x11, 0x50, 0x20, 0xe1, 0x90, 0x40, 0x08, 0x0c, 0x82, 0xe4, + 0x20, 0x11, 0x00, 0x00, 0x08, 0x0c, 0x81, 0x06, 0x08, 0x0c, 0x72, 0xa2, + 0x00, 0x2e, 0x08, 0x04, 0x22, 0x27, 0x01, 0x26, 0x20, 0x91, 0x24, 0x00, + 0x00, 0x06, 0x00, 0x16, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, + 0x20, 0x79, 0x00, 0x20, 0x20, 0x71, 0xb9, 0x4b, 0x2b, 0x68, 0x68, 0x18, + 0x20, 0x60, 0x79, 0x04, 0x78, 0x03, 0x00, 0x02, 0xa1, 0x84, 0x07, 0x00, + 0x19, 0x04, 0x21, 0x2c, 0x70, 0x00, 0x00, 0x02, 0x22, 0x27, 0x21, 0x8a, + 0x21, 0xfa, 0x22, 0x25, 0x80, 0x01, 0x70, 0x02, 0xd1, 0x9c, 0x11, 0x70, + 0x8a, 0xff, 0x05, 0xd0, 0x20, 0x09, 0x00, 0x01, 0x08, 0x0c, 0x20, 0xae, + 0x09, 0x04, 0x22, 0x27, 0x20, 0x09, 0x00, 0x01, 0x08, 0x0c, 0x20, 0xae, + 0x08, 0x04, 0x22, 0x27, 0x78, 0x03, 0x00, 0x04, 0xd1, 0x94, 0x01, 0x48, + 0x68, 0x50, 0xc0, 0xfc, 0x68, 0x52, 0x8a, 0xff, 0x11, 0xd8, 0x68, 0x4c, + 0xc0, 0xf5, 0x68, 0x4e, 0x00, 0xb8, 0x00, 0x26, 0x00, 0x36, 0x6b, 0x28, + 0x6a, 0x2c, 0x78, 0x20, 0x68, 0x6e, 0xa3, 0x1a, 0x78, 0x24, 0x68, 0x72, + 0xa2, 0x13, 0x78, 0x30, 0x68, 0x1e, 0x78, 0x34, 0x68, 0x22, 0x6b, 0x2a, + 0x6a, 0x2e, 0x00, 0x3e, 0x00, 0x2e, 0x08, 0x0c, 0x22, 0xe0, 0x68, 0x50, + 0xc0, 0xfd, 0x68, 0x52, 0x2a, 0x00, 0x68, 0x26, 0x2c, 0x00, 0x68, 0x1a, + 0x28, 0x00, 0x68, 0x32, 0x70, 0x03, 0x00, 0x00, 0x08, 0x04, 0x22, 0x27, + 0x00, 0xf6, 0x00, 0x26, 0x78, 0x1c, 0x00, 0x06, 0x78, 0x18, 0x00, 0x06, + 0x20, 0x79, 0x01, 0x00, 0x7a, 0x14, 0xa2, 0x84, 0x01, 0x84, 0xa0, 0x85, + 0x00, 0x12, 0x78, 0x16, 0x00, 0x36, 0x20, 0x19, 0x10, 0x00, 0x83, 0x19, + 0x09, 0x0c, 0x15, 0x1a, 0x78, 0x20, 0xd0, 0xbc, 0x1d, 0xd0, 0x00, 0x3e, + 0x79, 0xc8, 0x00, 0x0e, 0xa1, 0x02, 0x00, 0x1e, 0x00, 0x06, 0x00, 0x16, + 0x79, 0xc4, 0x00, 0x0e, 0xa1, 0x03, 0x78, 0xc6, 0x00, 0x0e, 0x78, 0xca, + 0xa2, 0x84, 0x01, 0x84, 0xa0, 0x85, 0x00, 0x12, 0x78, 0x16, 0x00, 0x2e, + 0x00, 0xfe, 0x78, 0x03, 0x00, 0x08, 0x70, 0x03, 0x00, 0x00, 0x04, 0x68, + 0x80, 0x01, 0x70, 0x02, 0xd1, 0x94, 0x01, 0x68, 0x78, 0x04, 0xd0, 0xfc, + 0x19, 0x04, 0x21, 0x7d, 0xd1, 0x9c, 0x11, 0xf8, 0x8a, 0xff, 0x05, 0x08, + 0x20, 0x09, 0x00, 0x01, 0x08, 0x0c, 0x20, 0xae, 0x00, 0xe0, 0x00, 0x26, + 0x00, 0x36, 0x6b, 0x28, 0x6a, 0x2c, 0x08, 0x0c, 0x22, 0xe0, 0x00, 0xd6, + 0x28, 0x05, 0xac, 0x68, 0x60, 0x34, 0xd0, 0x9c, 0x11, 0x28, 0x68, 0x08, + 0xa3, 0x1a, 0x68, 0x0c, 0xa2, 0x13, 0x00, 0x20, 0x68, 0x10, 0xa3, 0x1a, + 0x68, 0x14, 0xa2, 0x13, 0x00, 0xde, 0x08, 0x04, 0x21, 0xad, 0x08, 0x04, + 0x21, 0xa9, 0x08, 0x0c, 0x15, 0x1a, 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, + 0x00, 0xfe, 0x00, 0x1e, 0x00, 0x0e, 0x01, 0x2e, 0x00, 0x05, 0x00, 0xf6, + 0x00, 0xe6, 0x20, 0x71, 0xb9, 0x4b, 0x70, 0x00, 0xa0, 0x86, 0x00, 0x00, + 0x05, 0xd0, 0x20, 0x79, 0x00, 0x20, 0x00, 0x16, 0x20, 0x09, 0x02, 0x07, + 0x21, 0x0c, 0xd1, 0x94, 0x01, 0x98, 0x20, 0x09, 0x02, 0x0c, 0x21, 0x0c, + 0xa1, 0x84, 0x00, 0x03, 0x01, 0x68, 0x08, 0x0c, 0xb5, 0x0c, 0x20, 0x01, + 0x01, 0x33, 0x20, 0x04, 0xa0, 0x05, 0x09, 0x0c, 0x15, 0x1a, 0x20, 0xe1, + 0x90, 0x40, 0x20, 0x01, 0x02, 0x0c, 0x21, 0x02, 0x20, 0x09, 0x02, 0x06, + 0x21, 0x04, 0x20, 0x09, 0x02, 0x03, 0x21, 0x0c, 0xa1, 0x06, 0x11, 0x10, + 0x20, 0xe1, 0x90, 0x40, 0x78, 0x04, 0xd0, 0xfc, 0x09, 0xd8, 0x08, 0x0c, + 0x21, 0x6d, 0x70, 0x00, 0xa0, 0x86, 0x00, 0x00, 0x19, 0xa8, 0x00, 0x1e, + 0x78, 0x03, 0x00, 0x04, 0x78, 0x04, 0xd0, 0xac, 0x1d, 0xe8, 0x20, 0xe1, + 0x90, 0x40, 0x78, 0x03, 0x00, 0x02, 0x70, 0x03, 0x00, 0x00, 0x00, 0xee, + 0x00, 0xfe, 0x00, 0x05, 0x00, 0x26, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, + 0x00, 0xf6, 0x20, 0x71, 0xb9, 0x4b, 0x20, 0x79, 0x00, 0x20, 0x70, 0x00, + 0xa0, 0x86, 0x00, 0x00, 0x05, 0x40, 0x70, 0x04, 0x20, 0x60, 0x60, 0x10, + 0x20, 0x68, 0x08, 0x0c, 0x9d, 0x16, 0x01, 0x58, 0x68, 0x50, 0xc0, 0xb5, + 0x68, 0x52, 0x68, 0x0c, 0x7a, 0x1c, 0xa2, 0x06, 0x11, 0x20, 0x68, 0x08, + 0x7a, 0x18, 0xa2, 0x06, 0x01, 0xe0, 0x20, 0x01, 0x01, 0x05, 0x20, 0x03, + 0x00, 0x10, 0x20, 0xe1, 0x90, 0x40, 0x78, 0x03, 0x00, 0x04, 0x70, 0x03, + 0x00, 0x00, 0x70, 0x04, 0x20, 0x60, 0x08, 0x0c, 0x99, 0xe6, 0x20, 0xe1, + 0x90, 0x40, 0x08, 0x0c, 0x82, 0xe4, 0x20, 0x11, 0x00, 0x00, 0x08, 0x0c, + 0x81, 0x06, 0x00, 0xfe, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x00, 0x2e, + 0x00, 0x05, 0x68, 0x10, 0x6a, 0x14, 0xa2, 0x05, 0x1d, 0x00, 0x68, 0x4c, + 0xc0, 0xdc, 0x68, 0x4e, 0x2c, 0x10, 0x08, 0x0c, 0x1f, 0xc5, 0x20, 0x01, + 0x01, 0x05, 0x20, 0x03, 0x00, 0x10, 0x20, 0xe1, 0x90, 0x40, 0x78, 0x03, + 0x00, 0x04, 0x70, 0x03, 0x00, 0x00, 0x20, 0x69, 0xb8, 0xe1, 0x68, 0x33, + 0x00, 0x00, 0x68, 0x3f, 0x00, 0x00, 0x08, 0xf8, 0x88, 0x40, 0x28, 0x05, + 0xa0, 0x05, 0x11, 0x70, 0x60, 0x04, 0xa0, 0x05, 0x01, 0x68, 0x68, 0x1a, + 0x20, 0x60, 0x60, 0x34, 0xa0, 0x84, 0x00, 0x0f, 0xa0, 0x80, 0x23, 0x08, + 0x20, 0x45, 0x88, 0xff, 0x09, 0x0c, 0x15, 0x1a, 0x8a, 0x51, 0x00, 0x05, + 0x20, 0x50, 0x00, 0x05, 0x8a, 0x50, 0x88, 0x41, 0x28, 0x05, 0xa0, 0x05, + 0x11, 0x90, 0x2c, 0x00, 0xad, 0x06, 0x01, 0x20, 0x60, 0x00, 0xa0, 0x05, + 0x11, 0x08, 0x2d, 0x00, 0x20, 0x60, 0x68, 0x1a, 0x60, 0x34, 0xa0, 0x84, + 0x00, 0x0f, 0xa0, 0x80, 0x23, 0x18, 0x20, 0x45, 0x88, 0xff, 0x09, 0x0c, + 0x15, 0x1a, 0x00, 0x05, 0x00, 0x00, 0x00, 0x11, 0x00, 0x15, 0x00, 0x19, + 0x00, 0x1d, 0x00, 0x21, 0x00, 0x25, 0x00, 0x29, 0x00, 0x00, 0x00, 0x0f, + 0x00, 0x15, 0x00, 0x1b, 0x00, 0x21, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x22, 0xfd, 0x22, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x23, 0x07, + 0x00, 0x00, 0x22, 0xfd, 0x00, 0x00, 0x23, 0x04, 0x23, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x23, 0x07, 0x23, 0x04, 0x00, 0x00, 0x22, 0xff, + 0x22, 0xff, 0x00, 0x00, 0x00, 0x00, 0x23, 0x07, 0x00, 0x00, 0x22, 0xff, + 0x00, 0x00, 0x23, 0x05, 0x23, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x23, 0x07, 0x23, 0x05, 0x00, 0xa6, 0x00, 0x96, 0x00, 0x86, 0x6b, 0x2e, + 0x6c, 0x2a, 0x68, 0x58, 0xa0, 0x55, 0x09, 0x04, 0x23, 0xb9, 0x2d, 0x60, + 0x60, 0x34, 0xa0, 0xcc, 0x00, 0x0f, 0xa9, 0xc0, 0x23, 0x08, 0xa9, 0x86, + 0x00, 0x07, 0x01, 0x30, 0xa9, 0x86, 0x00, 0x0e, 0x01, 0x18, 0xa9, 0x86, + 0x00, 0x0f, 0x11, 0x20, 0x60, 0x5c, 0xa4, 0x22, 0x60, 0x60, 0xa3, 0x1b, + 0x28, 0x05, 0xa0, 0x45, 0x11, 0x40, 0x03, 0x10, 0x08, 0x04, 0x23, 0xb9, + 0x60, 0x04, 0xa0, 0x65, 0x09, 0x04, 0x23, 0xb9, 0x0c, 0x18, 0x28, 0x05, + 0xa0, 0x05, 0x01, 0xa8, 0xac, 0x68, 0xd9, 0x9c, 0x11, 0x28, 0x68, 0x08, + 0xa4, 0x22, 0x68, 0x0c, 0xa3, 0x1b, 0x00, 0x20, 0x68, 0x10, 0xa4, 0x22, + 0x68, 0x14, 0xa3, 0x1b, 0x06, 0x20, 0x23, 0x00, 0xa4, 0x05, 0x01, 0x50, + 0x8a, 0x51, 0x09, 0x04, 0x23, 0xb9, 0x88, 0x40, 0x0c, 0x40, 0x60, 0x04, + 0xa0, 0x65, 0x09, 0x04, 0x23, 0xb9, 0x08, 0x30, 0x8a, 0x51, 0x09, 0x04, + 0x23, 0xb9, 0x88, 0x40, 0x28, 0x05, 0xa0, 0x05, 0x11, 0x58, 0x60, 0x04, + 0xa0, 0x65, 0x09, 0x04, 0x23, 0xb9, 0x60, 0x34, 0xa0, 0xcc, 0x00, 0x0f, + 0xa9, 0xc0, 0x23, 0x08, 0x28, 0x05, 0x20, 0x40, 0x2b, 0x68, 0x68, 0x50, + 0xc0, 0xfc, 0x68, 0x52, 0x04, 0x58, 0x84, 0x22, 0x84, 0x20, 0x83, 0x1a, + 0xa3, 0x99, 0x00, 0x00, 0x00, 0xd6, 0x2b, 0x68, 0x6c, 0x6e, 0x6b, 0x72, + 0x00, 0xde, 0xd9, 0x9c, 0x11, 0x68, 0x69, 0x08, 0x24, 0x00, 0xa1, 0x22, + 0x69, 0x0c, 0x23, 0x00, 0xa1, 0x1b, 0x0a, 0x0c, 0x15, 0x1a, 0x68, 0x00, + 0xa4, 0x20, 0x68, 0x04, 0xa3, 0x19, 0x00, 0x60, 0x69, 0x10, 0x24, 0x00, + 0xa1, 0x22, 0x69, 0x14, 0x23, 0x00, 0xa1, 0x1b, 0x0a, 0x0c, 0x15, 0x1a, + 0x68, 0x00, 0xa4, 0x20, 0x68, 0x04, 0xa3, 0x19, 0x2b, 0x68, 0x6c, 0x1e, + 0x6b, 0x22, 0x68, 0x50, 0xc0, 0xfd, 0x68, 0x52, 0x2c, 0x00, 0x68, 0x1a, + 0x28, 0x00, 0x68, 0x32, 0x2a, 0x00, 0x68, 0x26, 0x00, 0x0e, 0x00, 0x0e, + 0x00, 0x0e, 0xa0, 0x06, 0x00, 0x28, 0x00, 0x8e, 0x00, 0x9e, 0x00, 0xae, + 0xa0, 0x85, 0x00, 0x01, 0x00, 0x05, 0x20, 0x01, 0x00, 0x05, 0x20, 0x04, + 0xa0, 0x84, 0x00, 0x07, 0x00, 0x02, 0x23, 0xcd, 0x23, 0xce, 0x23, 0xd1, + 0x23, 0xd4, 0x23, 0xd9, 0x23, 0xdc, 0x23, 0xe1, 0x23, 0xe6, 0x00, 0x05, + 0x08, 0x0c, 0x21, 0x6d, 0x00, 0x05, 0x08, 0x0c, 0x1b, 0x22, 0x00, 0x05, + 0x08, 0x0c, 0x1b, 0x22, 0x08, 0x0c, 0x21, 0x6d, 0x00, 0x05, 0x08, 0x0c, + 0x17, 0x20, 0x00, 0x05, 0x08, 0x0c, 0x21, 0x6d, 0x08, 0x0c, 0x17, 0x20, + 0x00, 0x05, 0x08, 0x0c, 0x1b, 0x22, 0x08, 0x0c, 0x17, 0x20, 0x00, 0x05, + 0x08, 0x0c, 0x1b, 0x22, 0x08, 0x0c, 0x21, 0x6d, 0x08, 0x0c, 0x17, 0x20, + 0x00, 0x05, 0x00, 0x06, 0x70, 0x00, 0xa0, 0x86, 0x00, 0x01, 0x11, 0x58, + 0x70, 0x1c, 0xa5, 0x06, 0x11, 0x40, 0x70, 0x20, 0xa4, 0x06, 0x11, 0x28, + 0x70, 0x24, 0xa7, 0x06, 0x11, 0x10, 0x70, 0x28, 0xa6, 0x06, 0x00, 0x0e, + 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x26, 0x00, 0x20, 0x79, 0x02, 0x00, + 0x20, 0x71, 0xbc, 0x80, 0x20, 0x69, 0xb6, 0x00, 0x08, 0x0c, 0x24, 0xf5, + 0x08, 0x0c, 0x24, 0xe5, 0x20, 0x09, 0x00, 0x04, 0x79, 0x12, 0x78, 0x17, + 0x00, 0x04, 0x08, 0x0c, 0x28, 0x2d, 0x78, 0x1b, 0x00, 0x02, 0x20, 0xe1, + 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, 0x20, 0xa9, 0x00, 0x80, 0x78, 0x2f, + 0x00, 0x00, 0x1f, 0x04, 0x24, 0x1b, 0x20, 0xe1, 0x90, 0x80, 0x78, 0x3b, + 0x00, 0x1f, 0x20, 0xe1, 0x87, 0x00, 0x01, 0x2e, 0x00, 0x05, 0x01, 0x26, + 0x20, 0x91, 0x26, 0x00, 0x78, 0x1c, 0xd0, 0xa4, 0x19, 0x0c, 0x24, 0xe2, + 0xa0, 0x84, 0x00, 0x07, 0x00, 0x02, 0x24, 0x4b, 0x24, 0x39, 0x24, 0x3c, + 0x24, 0x3f, 0x24, 0x44, 0x24, 0x46, 0x24, 0x48, 0x24, 0x4a, 0x08, 0x0c, + 0x64, 0x36, 0x00, 0x78, 0x08, 0x0c, 0x64, 0x75, 0x00, 0x60, 0x08, 0x0c, + 0x64, 0x36, 0x08, 0x0c, 0x64, 0x75, 0x00, 0x38, 0x00, 0x41, 0x00, 0x28, + 0x00, 0x31, 0x00, 0x18, 0x00, 0x21, 0x00, 0x08, 0x00, 0x11, 0x01, 0x2e, + 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, 0x00, 0x26, 0x08, 0x0c, 0xb5, 0x0c, + 0x79, 0x30, 0xa1, 0x84, 0x00, 0x03, 0x01, 0xb0, 0x20, 0x01, 0xb8, 0xf0, + 0x20, 0x04, 0xa0, 0x05, 0x01, 0x70, 0x20, 0x01, 0x01, 0x33, 0x20, 0x04, + 0xa0, 0x05, 0x09, 0x0c, 0x15, 0x1a, 0x00, 0xc6, 0x20, 0x01, 0xb8, 0xf0, + 0x20, 0x64, 0x08, 0x0c, 0x99, 0xe6, 0x00, 0xce, 0x04, 0xb8, 0x20, 0xe1, + 0x90, 0x40, 0x04, 0xa0, 0xa1, 0x84, 0x00, 0x30, 0x01, 0xe0, 0x6a, 0x00, + 0xa2, 0x86, 0x00, 0x03, 0x11, 0x08, 0x00, 0xa0, 0x08, 0x0c, 0x5b, 0x41, + 0x11, 0x78, 0x20, 0x01, 0xb8, 0x9f, 0x20, 0x03, 0x00, 0x01, 0x20, 0x01, + 0xb6, 0x00, 0x20, 0x03, 0x00, 0x01, 0xa0, 0x85, 0x00, 0x01, 0x08, 0x0c, + 0x5b, 0x85, 0x08, 0x0c, 0x5a, 0x79, 0x00, 0x10, 0x08, 0x0c, 0x4b, 0x7b, + 0x08, 0x0c, 0x24, 0xe5, 0x00, 0xa8, 0xa1, 0x84, 0x00, 0xc0, 0x01, 0x68, + 0x00, 0xe6, 0x00, 0x36, 0x00, 0x46, 0x00, 0x56, 0x20, 0x71, 0xb9, 0x24, + 0x08, 0x0c, 0x1e, 0x1a, 0x00, 0x5e, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0xee, + 0x00, 0x28, 0xa1, 0x84, 0x03, 0x00, 0x01, 0x10, 0x20, 0xe1, 0x90, 0x20, + 0x79, 0x32, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x16, + 0x00, 0xe6, 0x00, 0xf6, 0x20, 0x71, 0xb6, 0x00, 0x71, 0x28, 0x20, 0x01, + 0xb8, 0x91, 0x21, 0x02, 0x20, 0x01, 0xb8, 0x99, 0x21, 0x02, 0xa1, 0x82, + 0x02, 0x11, 0x12, 0x18, 0x20, 0x09, 0x00, 0x08, 0x04, 0x00, 0xa1, 0x82, + 0x02, 0x59, 0x12, 0x18, 0x20, 0x09, 0x00, 0x07, 0x00, 0xd0, 0xa1, 0x82, + 0x02, 0xc1, 0x12, 0x18, 0x20, 0x09, 0x00, 0x06, 0x00, 0xa0, 0xa1, 0x82, + 0x03, 0x49, 0x12, 0x18, 0x20, 0x09, 0x00, 0x05, 0x00, 0x70, 0xa1, 0x82, + 0x04, 0x21, 0x12, 0x18, 0x20, 0x09, 0x00, 0x04, 0x00, 0x40, 0xa1, 0x82, + 0x05, 0x81, 0x12, 0x18, 0x20, 0x09, 0x00, 0x03, 0x00, 0x10, 0x20, 0x09, + 0x00, 0x02, 0x20, 0x79, 0x02, 0x00, 0x79, 0x12, 0x78, 0x17, 0x00, 0x04, + 0x08, 0x0c, 0x28, 0x2d, 0x00, 0xfe, 0x00, 0xee, 0x00, 0x1e, 0x00, 0x05, + 0x79, 0x38, 0x08, 0x0c, 0x15, 0x1a, 0x00, 0xe6, 0x00, 0x26, 0x20, 0x71, + 0x02, 0x00, 0x20, 0xe1, 0x10, 0x00, 0x72, 0x20, 0x70, 0x28, 0x70, 0x20, + 0xa2, 0x06, 0x0d, 0xe0, 0x20, 0xe1, 0x90, 0x10, 0x00, 0x2e, 0x00, 0xee, + 0x00, 0x05, 0x20, 0xe1, 0xa0, 0x00, 0x78, 0x37, 0x00, 0x01, 0x78, 0x2f, + 0x00, 0x00, 0x78, 0x2f, 0x00, 0x00, 0x78, 0x2f, 0x00, 0x00, 0x78, 0x2f, + 0x00, 0x00, 0x78, 0x37, 0x00, 0x05, 0x20, 0xa9, 0x02, 0x10, 0x78, 0x30, + 0xd0, 0xbc, 0x11, 0x10, 0x1f, 0x04, 0x25, 0x05, 0x78, 0x37, 0x00, 0x01, + 0x78, 0x37, 0x00, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0x20, 0xe1, 0xa0, 0x00, + 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x28, 0x00, 0x20, 0x61, 0x01, 0x00, + 0x20, 0x71, 0xb6, 0x00, 0x60, 0x24, 0x60, 0x26, 0x60, 0x53, 0x00, 0x30, + 0x08, 0x0c, 0x28, 0x6c, 0x60, 0x50, 0xa0, 0x84, 0xfe, 0x7f, 0x60, 0x52, + 0x20, 0x09, 0x00, 0xef, 0x61, 0x32, 0x61, 0x36, 0x08, 0x0c, 0x28, 0x7c, + 0x60, 0xe7, 0x00, 0x00, 0x61, 0xea, 0x60, 0xe3, 0x00, 0x08, 0x60, 0x4b, + 0xf7, 0xf7, 0x60, 0x43, 0x00, 0x00, 0x60, 0x2f, 0x00, 0x80, 0x60, 0x2f, + 0x00, 0x00, 0x60, 0x07, 0x0e, 0x9f, 0x60, 0x1b, 0x00, 0x1e, 0x60, 0x0f, + 0x00, 0xff, 0x20, 0x01, 0xb8, 0x8d, 0x20, 0x03, 0x00, 0xff, 0x60, 0x2b, + 0x00, 0x2f, 0x01, 0x2e, 0x00, 0x05, 0x20, 0x01, 0xb6, 0x32, 0x20, 0x03, + 0x00, 0x00, 0x20, 0x01, 0xb6, 0x31, 0x20, 0x03, 0x00, 0x01, 0x00, 0x05, + 0x01, 0x26, 0x20, 0x91, 0x28, 0x00, 0x00, 0x06, 0x00, 0x16, 0x00, 0x26, + 0x61, 0x24, 0xa1, 0x84, 0x1e, 0x2c, 0x11, 0x18, 0xa1, 0x84, 0x00, 0x07, + 0x00, 0x2a, 0xa1, 0x95, 0x00, 0x04, 0xa2, 0x84, 0x00, 0x07, 0x00, 0x02, + 0x25, 0x82, 0x25, 0x68, 0x25, 0x6b, 0x25, 0x6e, 0x25, 0x73, 0x25, 0x75, + 0x25, 0x79, 0x25, 0x7d, 0x08, 0x0c, 0x6b, 0xe6, 0x00, 0xb8, 0x08, 0x0c, + 0x6c, 0xc1, 0x00, 0xa0, 0x08, 0x0c, 0x6c, 0xc1, 0x08, 0x0c, 0x6b, 0xe6, + 0x00, 0x78, 0x00, 0x99, 0x00, 0x68, 0x08, 0x0c, 0x6b, 0xe6, 0x00, 0x79, + 0x00, 0x48, 0x08, 0x0c, 0x6c, 0xc1, 0x00, 0x59, 0x00, 0x28, 0x08, 0x0c, + 0x6c, 0xc1, 0x08, 0x0c, 0x6b, 0xe6, 0x00, 0x29, 0x00, 0x2e, 0x00, 0x1e, + 0x00, 0x0e, 0x01, 0x2e, 0x00, 0x05, 0x61, 0x24, 0x60, 0x28, 0xd0, 0x9c, + 0x01, 0x18, 0xd1, 0x9c, 0x19, 0x04, 0x27, 0x9b, 0x08, 0x0c, 0x5b, 0x41, + 0x05, 0x78, 0x70, 0x00, 0xa0, 0x86, 0x00, 0x03, 0x01, 0x98, 0x60, 0x24, + 0xa0, 0x84, 0x18, 0x00, 0x01, 0x78, 0x08, 0x0c, 0x5b, 0x67, 0x01, 0x18, + 0x08, 0x0c, 0x5b, 0x53, 0x11, 0x48, 0x60, 0x27, 0x00, 0x20, 0x60, 0x43, + 0x00, 0x00, 0x20, 0x01, 0xb8, 0x9e, 0x20, 0x03, 0xaa, 0xaa, 0x04, 0x58, + 0x08, 0x0c, 0x5b, 0x67, 0x15, 0xd0, 0x60, 0x24, 0xa0, 0x84, 0x18, 0x00, + 0x11, 0x08, 0x04, 0xa8, 0x20, 0x01, 0xb8, 0x9e, 0x20, 0x03, 0xaa, 0xaa, + 0x20, 0x01, 0xb8, 0x9f, 0x20, 0x03, 0x00, 0x01, 0x20, 0x01, 0xb6, 0x00, + 0x20, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x5a, 0x79, 0x08, 0x04, 0x27, 0x9b, + 0xd1, 0xac, 0x15, 0x18, 0x60, 0x24, 0xd0, 0xdc, 0x11, 0x70, 0xd0, 0xe4, + 0x11, 0x88, 0xd0, 0xd4, 0x11, 0xa0, 0xd0, 0xcc, 0x01, 0x30, 0x70, 0x8c, + 0xa0, 0x86, 0x00, 0x28, 0x11, 0x10, 0x08, 0x0c, 0x5c, 0xd0, 0x08, 0x04, + 0x27, 0x9b, 0x20, 0x01, 0xb8, 0x9f, 0x20, 0x03, 0x00, 0x00, 0x00, 0x48, + 0x20, 0x01, 0xb8, 0x9f, 0x20, 0x03, 0x00, 0x02, 0x00, 0x20, 0x08, 0x0c, + 0x5c, 0x43, 0x08, 0x04, 0x27, 0x9b, 0x08, 0x0c, 0x5d, 0x75, 0x08, 0x04, + 0x27, 0x9b, 0xd1, 0xac, 0x09, 0x04, 0x26, 0xe3, 0x08, 0x0c, 0x5b, 0x41, + 0x11, 0xd8, 0x60, 0x27, 0x00, 0x20, 0x00, 0x06, 0x00, 0x26, 0x00, 0x36, + 0x08, 0x0c, 0x5b, 0x5d, 0x11, 0x70, 0x20, 0x01, 0xb8, 0x9f, 0x20, 0x03, + 0x00, 0x01, 0x20, 0x01, 0xb6, 0x00, 0x20, 0x03, 0x00, 0x01, 0x08, 0x0c, + 0x5a, 0x79, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x3e, + 0x00, 0x2e, 0x00, 0x0e, 0x08, 0x0c, 0x5b, 0x18, 0x00, 0x16, 0x00, 0x46, + 0x00, 0xc6, 0x64, 0x4c, 0xa4, 0x86, 0xf0, 0xf0, 0x11, 0x38, 0x20, 0x61, + 0x01, 0x00, 0x64, 0x4a, 0x60, 0x43, 0x00, 0x90, 0x60, 0x43, 0x00, 0x10, + 0x74, 0xce, 0xa4, 0x8c, 0xff, 0x00, 0x70, 0x34, 0xd0, 0x84, 0x01, 0x78, + 0xa1, 0x86, 0xf8, 0x00, 0x11, 0x60, 0x70, 0x3c, 0xd0, 0x84, 0x11, 0x48, + 0xc0, 0x85, 0x70, 0x3e, 0x00, 0x36, 0x24, 0x18, 0x20, 0x11, 0x80, 0x16, + 0x08, 0x0c, 0x3f, 0x13, 0x00, 0x3e, 0xa1, 0x96, 0xff, 0x00, 0x05, 0xb8, + 0x70, 0x54, 0xa0, 0x84, 0x00, 0xff, 0x81, 0x0f, 0xa1, 0x16, 0x05, 0x88, + 0x71, 0x30, 0xd1, 0x84, 0x15, 0x70, 0x20, 0x11, 0xb6, 0x53, 0x22, 0x14, + 0xd2, 0xec, 0x01, 0x38, 0xc1, 0x8d, 0x71, 0x32, 0x20, 0x11, 0xb6, 0x53, + 0x22, 0x14, 0xd2, 0xac, 0x15, 0x10, 0x62, 0x40, 0xa2, 0x94, 0x00, 0x10, + 0x01, 0x30, 0x62, 0x48, 0xa2, 0x94, 0xff, 0x00, 0xa2, 0x96, 0xff, 0x00, + 0x01, 0xc0, 0x70, 0x30, 0xd0, 0x8c, 0x09, 0x04, 0x26, 0xb0, 0x70, 0x34, + 0xd0, 0x8c, 0x11, 0x40, 0x20, 0x01, 0xb6, 0x0c, 0x20, 0x0c, 0xd1, 0xac, + 0x19, 0x04, 0x26, 0xb0, 0xc1, 0xad, 0x21, 0x02, 0x00, 0x36, 0x73, 0xcc, + 0x20, 0x11, 0x80, 0x13, 0x08, 0x0c, 0x3f, 0x13, 0x00, 0x3e, 0x08, 0x04, + 0x26, 0xb0, 0x70, 0x34, 0xd0, 0x8c, 0x11, 0x40, 0x20, 0x01, 0xb6, 0x0c, + 0x20, 0x0c, 0xd1, 0xac, 0x19, 0x04, 0x26, 0xb0, 0xc1, 0xad, 0x21, 0x02, + 0x00, 0x36, 0x73, 0xcc, 0x20, 0x11, 0x80, 0x13, 0x08, 0x0c, 0x3f, 0x13, + 0x00, 0x3e, 0x71, 0x30, 0xc1, 0x85, 0x71, 0x32, 0x20, 0x11, 0xb6, 0x53, + 0x22, 0x0c, 0xd1, 0xa4, 0x01, 0xd0, 0x00, 0x16, 0x20, 0x09, 0x00, 0x01, + 0x20, 0x11, 0x01, 0x00, 0x08, 0x0c, 0x6b, 0x8c, 0x20, 0x19, 0x00, 0x0e, + 0x08, 0x0c, 0xb1, 0x21, 0xa4, 0x84, 0x00, 0xff, 0xa0, 0x80, 0x2d, 0xf9, + 0x20, 0x0d, 0xa1, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0x81, 0x27, 0xa0, 0x06, + 0x20, 0x09, 0x00, 0x0e, 0x08, 0x0c, 0xb1, 0xa4, 0x00, 0x1e, 0xd1, 0xac, + 0x11, 0x48, 0x00, 0x16, 0x20, 0x09, 0x00, 0x00, 0x20, 0x19, 0x00, 0x04, + 0x08, 0x0c, 0x2c, 0xa4, 0x00, 0x1e, 0x00, 0x70, 0x01, 0x56, 0x20, 0xa9, + 0x00, 0x7f, 0x20, 0x09, 0x00, 0x00, 0x08, 0x0c, 0x50, 0x1b, 0x11, 0x10, + 0x08, 0x0c, 0x4c, 0x7e, 0x81, 0x08, 0x1f, 0x04, 0x26, 0xa7, 0x01, 0x5e, + 0x00, 0xce, 0x00, 0x4e, 0x20, 0x11, 0x00, 0x03, 0x08, 0x0c, 0x80, 0xfc, + 0x20, 0x11, 0x00, 0x02, 0x08, 0x0c, 0x81, 0x06, 0x08, 0x0c, 0x7f, 0xe0, + 0x00, 0x36, 0x20, 0x19, 0x00, 0x00, 0x08, 0x0c, 0x80, 0x6b, 0x00, 0x3e, + 0x60, 0xe3, 0x00, 0x00, 0x00, 0x1e, 0x20, 0x01, 0xb6, 0x00, 0x20, 0x14, + 0xa2, 0x96, 0x00, 0x04, 0x11, 0x28, 0xd1, 0x9c, 0x11, 0xb0, 0x62, 0x28, + 0xc2, 0x9d, 0x62, 0x2a, 0x20, 0x03, 0x00, 0x01, 0x20, 0x01, 0xb6, 0x23, + 0x20, 0x03, 0x00, 0x00, 0x60, 0x27, 0x00, 0x20, 0x08, 0x0c, 0x5b, 0x67, + 0x11, 0x40, 0x00, 0x16, 0x20, 0x09, 0x07, 0xd0, 0x20, 0x11, 0x5a, 0x56, + 0x08, 0x0c, 0x6a, 0x94, 0x00, 0x1e, 0xd1, 0x94, 0x09, 0x04, 0x27, 0x9b, + 0x00, 0x16, 0x62, 0x20, 0xd2, 0xb4, 0x09, 0x04, 0x27, 0x4c, 0x08, 0x0c, + 0x6a, 0x82, 0x08, 0x0c, 0x7d, 0xf3, 0x60, 0x27, 0x00, 0x04, 0x00, 0xf6, + 0x20, 0x19, 0xb8, 0xea, 0x23, 0x04, 0xa0, 0x7d, 0x05, 0x70, 0x78, 0x04, + 0xa0, 0x86, 0x00, 0x32, 0x15, 0x50, 0x00, 0xd6, 0x00, 0xc6, 0x00, 0xe6, + 0x20, 0x69, 0x01, 0x40, 0x61, 0x8c, 0x62, 0x88, 0x78, 0x18, 0x60, 0x8e, + 0x78, 0x08, 0x60, 0x8a, 0x60, 0x43, 0x00, 0x02, 0x20, 0x01, 0x00, 0x03, + 0x80, 0x01, 0x1d, 0xf0, 0x60, 0x43, 0x00, 0x00, 0x68, 0x03, 0x10, 0x00, + 0x68, 0x03, 0x00, 0x00, 0x61, 0x8e, 0x62, 0x8a, 0x08, 0x0c, 0x71, 0x02, + 0x08, 0x0c, 0x71, 0xe5, 0x78, 0x10, 0x20, 0x70, 0x70, 0x37, 0x01, 0x03, + 0x2f, 0x60, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0xee, 0x00, 0xce, 0x00, 0xde, + 0x00, 0xfe, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xfe, 0x00, 0xd6, 0x20, 0x69, + 0x01, 0x40, 0x68, 0x04, 0xa0, 0x84, 0x40, 0x00, 0x01, 0x20, 0x68, 0x03, + 0x10, 0x00, 0x68, 0x03, 0x00, 0x00, 0x00, 0xde, 0x00, 0xc6, 0x20, 0x61, + 0xb8, 0xe1, 0x60, 0x28, 0xa0, 0x9a, 0x00, 0xc8, 0x12, 0x38, 0x80, 0x00, + 0x60, 0x2a, 0x00, 0xce, 0x08, 0x0c, 0x7d, 0xe6, 0x08, 0x04, 0x27, 0x9a, + 0x20, 0x19, 0xb8, 0xea, 0x23, 0x04, 0xa0, 0x65, 0x01, 0x20, 0x20, 0x09, + 0x00, 0x27, 0x08, 0x0c, 0x86, 0xd3, 0x00, 0xce, 0x08, 0x04, 0x27, 0x9a, + 0xd2, 0xbc, 0x09, 0x04, 0x27, 0x9a, 0x08, 0x0c, 0x6a, 0x8f, 0x60, 0x14, + 0xa0, 0x84, 0x01, 0x84, 0xa0, 0x85, 0x00, 0x10, 0x60, 0x16, 0x60, 0x27, + 0x00, 0x04, 0x00, 0xd6, 0x20, 0x69, 0x01, 0x40, 0x68, 0x04, 0xa0, 0x84, + 0x40, 0x00, 0x01, 0x20, 0x68, 0x03, 0x10, 0x00, 0x68, 0x03, 0x00, 0x00, + 0x00, 0xde, 0x00, 0xc6, 0x20, 0x61, 0xb8, 0xe1, 0x60, 0x44, 0xa0, 0x9a, + 0x00, 0xc8, 0x12, 0xf0, 0x80, 0x00, 0x60, 0x46, 0x60, 0x3c, 0x00, 0xce, + 0xa0, 0x05, 0x05, 0x40, 0x20, 0x09, 0x07, 0xd0, 0x08, 0x0c, 0x6a, 0x87, + 0xa0, 0x80, 0x00, 0x07, 0x20, 0x04, 0xa0, 0x86, 0x00, 0x06, 0x11, 0x38, + 0x61, 0x14, 0xa1, 0x8c, 0x01, 0x84, 0xa1, 0x8d, 0x00, 0x12, 0x61, 0x16, + 0x00, 0xb8, 0x61, 0x14, 0xa1, 0x8c, 0x01, 0x84, 0xa1, 0x8d, 0x00, 0x16, + 0x61, 0x16, 0x00, 0x80, 0x00, 0x36, 0x20, 0x19, 0x00, 0x01, 0x08, 0x0c, + 0x80, 0x6b, 0x00, 0x3e, 0x20, 0x19, 0xb8, 0xf0, 0x23, 0x04, 0xa0, 0x65, + 0x01, 0x20, 0x20, 0x09, 0x00, 0x4f, 0x08, 0x0c, 0x86, 0xd3, 0x00, 0xce, + 0x00, 0x1e, 0xd1, 0x9c, 0x09, 0x04, 0x27, 0xf4, 0x70, 0x34, 0xd0, 0xac, + 0x15, 0x60, 0x00, 0x16, 0x01, 0x56, 0x60, 0x27, 0x00, 0x08, 0x60, 0x2f, + 0x00, 0x20, 0x20, 0xa9, 0x00, 0x06, 0x1d, 0x04, 0x27, 0xa9, 0x20, 0x91, + 0x60, 0x00, 0x1f, 0x04, 0x27, 0xa9, 0x60, 0x2f, 0x00, 0x00, 0x61, 0x50, + 0xa1, 0x85, 0x14, 0x00, 0x60, 0x52, 0x20, 0xa9, 0x03, 0x66, 0x1d, 0x04, + 0x27, 0xb7, 0x20, 0x91, 0x60, 0x00, 0x60, 0x20, 0xd0, 0x9c, 0x11, 0x30, + 0x01, 0x5e, 0x61, 0x52, 0x00, 0x1e, 0x60, 0x27, 0x00, 0x08, 0x04, 0x80, + 0x08, 0x0c, 0x29, 0x3c, 0x1f, 0x04, 0x27, 0xb7, 0x01, 0x5e, 0x61, 0x52, + 0x00, 0x1e, 0x60, 0x27, 0x00, 0x08, 0x00, 0x16, 0x60, 0x28, 0xc0, 0x9c, + 0x60, 0x2a, 0x20, 0x11, 0x00, 0x03, 0x08, 0x0c, 0x80, 0xfc, 0x20, 0x11, + 0x00, 0x02, 0x08, 0x0c, 0x81, 0x06, 0x08, 0x0c, 0x7f, 0xe0, 0x00, 0x36, + 0x20, 0x19, 0x00, 0x00, 0x08, 0x0c, 0x80, 0x6b, 0x00, 0x3e, 0x60, 0xe3, + 0x00, 0x00, 0x08, 0x0c, 0xb4, 0xeb, 0x08, 0x0c, 0xb5, 0x06, 0xa0, 0x85, + 0x00, 0x01, 0x08, 0x0c, 0x5b, 0x85, 0x20, 0x01, 0xb6, 0x00, 0x20, 0x03, + 0x00, 0x04, 0x60, 0x27, 0x00, 0x08, 0x08, 0x0c, 0x12, 0xe2, 0x00, 0x1e, + 0xa1, 0x8c, 0xff, 0xd0, 0x61, 0x26, 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, + 0x00, 0x26, 0x00, 0xe6, 0x00, 0xf6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x71, 0xb6, 0x00, 0x71, 0xc4, 0x70, 0xc6, 0xa1, 0x16, 0x05, 0x00, + 0x81, 0xff, 0x01, 0x28, 0x20, 0x11, 0x80, 0x11, 0x08, 0x0c, 0x3f, 0x13, + 0x00, 0xc8, 0x20, 0x11, 0x80, 0x12, 0x08, 0x0c, 0x3f, 0x13, 0x20, 0x01, + 0xb6, 0x72, 0x20, 0x04, 0xd0, 0xfc, 0x11, 0x80, 0x00, 0x36, 0x00, 0xc6, + 0x08, 0x0c, 0x28, 0xc7, 0x08, 0x0c, 0x7f, 0xbc, 0x20, 0x61, 0x01, 0x00, + 0x20, 0x19, 0x00, 0x28, 0x20, 0x09, 0x00, 0x00, 0x08, 0x0c, 0x2c, 0xa4, + 0x00, 0xce, 0x00, 0x3e, 0x01, 0x2e, 0x00, 0xfe, 0x00, 0xee, 0x00, 0x2e, + 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, 0x00, 0xc6, 0x00, 0xf6, 0x00, 0x06, + 0x00, 0x26, 0x20, 0x61, 0x01, 0x00, 0xa1, 0x90, 0x28, 0x40, 0x22, 0x05, + 0x60, 0xf2, 0x20, 0x11, 0x28, 0x4d, 0x22, 0x05, 0x60, 0xee, 0x00, 0x2e, + 0x00, 0x0e, 0x00, 0xfe, 0x00, 0xce, 0x00, 0x05, 0x08, 0x40, 0x08, 0x40, + 0x08, 0x40, 0x05, 0x80, 0x04, 0x20, 0x03, 0x48, 0x02, 0xc0, 0x02, 0x58, + 0x02, 0x10, 0x01, 0xa8, 0x01, 0xa8, 0x01, 0xa8, 0x01, 0xa8, 0x01, 0x40, + 0x00, 0xf8, 0x00, 0xd0, 0x00, 0xb0, 0x00, 0xa0, 0x20, 0x28, 0xa1, 0x8c, + 0x00, 0xff, 0x21, 0x30, 0xa0, 0x94, 0xff, 0x00, 0x11, 0x10, 0x81, 0xff, + 0x01, 0x18, 0x08, 0x0c, 0x67, 0x23, 0x00, 0x38, 0xa0, 0x80, 0x2d, 0xf9, + 0x20, 0x0d, 0xa1, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0xa0, 0x06, 0x00, 0x05, + 0xa0, 0x80, 0x2d, 0xf9, 0x20, 0x0d, 0xa1, 0x8c, 0x00, 0xff, 0x00, 0x05, + 0x00, 0xd6, 0x20, 0x69, 0x01, 0x40, 0x20, 0x01, 0xb6, 0x15, 0x20, 0x03, + 0x00, 0xef, 0x20, 0xa9, 0x00, 0x10, 0xa0, 0x06, 0x68, 0x52, 0x68, 0x56, + 0x1f, 0x04, 0x28, 0x77, 0x00, 0xde, 0x00, 0x05, 0x00, 0x06, 0x00, 0xd6, + 0x00, 0x26, 0x20, 0x69, 0x01, 0x40, 0x20, 0x01, 0xb6, 0x15, 0x21, 0x02, + 0x81, 0x14, 0x82, 0x14, 0x82, 0x14, 0x82, 0x14, 0x20, 0xa9, 0x00, 0x10, + 0x68, 0x53, 0x00, 0x00, 0xa0, 0x06, 0x82, 0xff, 0x11, 0x28, 0xa1, 0x84, + 0x00, 0x0f, 0xa0, 0x80, 0xb5, 0x1a, 0x20, 0x05, 0x68, 0x56, 0x82, 0x11, + 0x1f, 0x04, 0x28, 0x8c, 0x00, 0x2e, 0x00, 0xde, 0x00, 0x0e, 0x00, 0x05, + 0x00, 0xc6, 0x20, 0x61, 0xb6, 0x00, 0x60, 0x30, 0x01, 0x10, 0xc0, 0x9d, + 0x00, 0x08, 0xc0, 0x9c, 0x60, 0x32, 0x00, 0xce, 0x00, 0x05, 0x01, 0x56, + 0x00, 0xd6, 0x00, 0x26, 0x00, 0x16, 0x00, 0x06, 0x20, 0x69, 0x01, 0x40, + 0x69, 0x80, 0xa1, 0x16, 0x01, 0x80, 0xa1, 0x12, 0x12, 0x30, 0x82, 0x12, + 0x82, 0x10, 0x22, 0xa8, 0x20, 0x01, 0x04, 0x02, 0x00, 0x18, 0x22, 0xa8, + 0x20, 0x01, 0x04, 0x04, 0x68, 0x0e, 0x1f, 0x04, 0x28, 0xbc, 0x68, 0x0f, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0xde, 0x01, 0x5e, + 0x00, 0x05, 0x20, 0x01, 0xb6, 0x53, 0x20, 0x04, 0xd0, 0xc4, 0x01, 0x50, + 0xd0, 0xa4, 0x01, 0x40, 0xa0, 0x06, 0x00, 0x46, 0x20, 0x20, 0x20, 0x09, + 0x00, 0x2e, 0x08, 0x0c, 0xb1, 0xa4, 0x00, 0x4e, 0x00, 0x05, 0x00, 0xf6, + 0x00, 0x16, 0x00, 0x26, 0x20, 0x79, 0x01, 0x40, 0x78, 0xc4, 0xd0, 0xdc, + 0x05, 0x48, 0xa0, 0x84, 0x07, 0x00, 0xa0, 0x8e, 0x03, 0x00, 0x15, 0x20, + 0x20, 0x11, 0x00, 0x00, 0x20, 0x09, 0x00, 0x02, 0x23, 0x00, 0xa0, 0x80, + 0x00, 0x20, 0x20, 0x18, 0x23, 0x00, 0x08, 0x0c, 0x6b, 0xb2, 0x20, 0x11, + 0x00, 0x30, 0x22, 0x00, 0x80, 0x07, 0xa0, 0x85, 0x00, 0x4c, 0x78, 0xc2, + 0x20, 0x09, 0x02, 0x04, 0x21, 0x0c, 0x22, 0x00, 0xa1, 0x00, 0x20, 0x09, + 0x01, 0x38, 0x20, 0x0a, 0x08, 0x0c, 0x5b, 0x41, 0x11, 0x18, 0x20, 0x09, + 0xb8, 0x8f, 0x20, 0x0a, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0xfe, 0x00, 0x05, + 0x78, 0xc3, 0x00, 0x00, 0x0c, 0xc8, 0x01, 0x26, 0x20, 0x91, 0x28, 0x00, + 0x00, 0x06, 0x00, 0x16, 0x00, 0x26, 0x20, 0x01, 0x01, 0x70, 0x20, 0x0c, + 0x80, 0x00, 0x20, 0x14, 0xa1, 0x84, 0x00, 0x03, 0x01, 0x10, 0x08, 0x04, + 0x1b, 0x20, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x0e, 0x01, 0x2e, 0x00, 0x05, + 0x00, 0x06, 0x20, 0x01, 0x01, 0x00, 0x20, 0x04, 0xa0, 0x82, 0x00, 0x05, + 0x00, 0x0e, 0x02, 0x68, 0x20, 0x01, 0x01, 0x70, 0x20, 0x0c, 0xa1, 0x8c, + 0x00, 0xff, 0xa1, 0x8e, 0x00, 0x4c, 0x11, 0x28, 0x20, 0x0c, 0xa1, 0x8c, + 0xff, 0x00, 0x81, 0x0f, 0x00, 0x10, 0x20, 0x09, 0x00, 0x00, 0x20, 0x01, + 0x02, 0x04, 0x20, 0x04, 0xa1, 0x08, 0x00, 0x05, 0x00, 0x06, 0x01, 0x56, + 0x00, 0xf6, 0x20, 0x79, 0x01, 0x00, 0x20, 0xa9, 0x00, 0x0a, 0x78, 0x54, + 0xd0, 0x8c, 0x11, 0x10, 0x1f, 0x04, 0x29, 0x43, 0x00, 0xfe, 0x01, 0x5e, + 0x00, 0x0e, 0x00, 0x05, 0x00, 0x16, 0x00, 0xc6, 0x00, 0x06, 0x20, 0x61, + 0x01, 0x00, 0x60, 0x30, 0x00, 0x06, 0x60, 0x48, 0x00, 0x06, 0x60, 0xe4, + 0x00, 0x06, 0x60, 0xe8, 0x00, 0x06, 0x60, 0x50, 0x00, 0x06, 0x60, 0xf0, + 0x00, 0x06, 0x60, 0xec, 0x00, 0x06, 0x60, 0x0c, 0x00, 0x06, 0x60, 0x04, + 0x00, 0x06, 0x60, 0x28, 0x00, 0x06, 0x60, 0xe0, 0x00, 0x06, 0x60, 0x2f, + 0x01, 0x00, 0x60, 0x2f, 0x00, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0xe0, 0x00, + 0xe0, 0x00, 0x60, 0x2f, 0x00, 0x40, 0x60, 0x2f, 0x00, 0x00, 0x00, 0x0e, + 0x60, 0xe2, 0x00, 0x0e, 0x60, 0x2a, 0x00, 0x0e, 0x60, 0x06, 0x00, 0x0e, + 0x60, 0x0e, 0x00, 0x0e, 0x60, 0xee, 0x00, 0x0e, 0x60, 0xf2, 0x00, 0x0e, + 0x60, 0x52, 0x00, 0x0e, 0x60, 0xea, 0x00, 0x0e, 0x60, 0xe6, 0x00, 0x0e, + 0x60, 0x4a, 0x00, 0x0e, 0x60, 0x32, 0x60, 0x36, 0x20, 0x08, 0x08, 0x0c, + 0x28, 0x7c, 0x00, 0x0e, 0x00, 0xce, 0x00, 0x1e, 0x00, 0x05, 0x20, 0x09, + 0x01, 0x71, 0x21, 0x04, 0xd0, 0xdc, 0x01, 0x40, 0x20, 0x09, 0x01, 0x70, + 0x21, 0x04, 0x20, 0x0b, 0x00, 0x80, 0xe0, 0x00, 0xe0, 0x00, 0x20, 0x0a, + 0x00, 0x05, 0x2a, 0x2f, 0x2a, 0x33, 0x2a, 0x37, 0x2a, 0x3d, 0x2a, 0x43, + 0x2a, 0x49, 0x2a, 0x4f, 0x2a, 0x57, 0x2a, 0x5f, 0x2a, 0x65, 0x2a, 0x6b, + 0x2a, 0x73, 0x2a, 0x7b, 0x2a, 0x83, 0x2a, 0x8b, 0x2a, 0x95, 0x2a, 0xe2, + 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, + 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, + 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, + 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, + 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, + 0x2a, 0x9f, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, + 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, + 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xa1, + 0x2a, 0xa1, 0x2a, 0xa7, 0x2a, 0xa7, 0x2a, 0xae, 0x2a, 0xae, 0x2a, 0xb5, + 0x2a, 0xb5, 0x2a, 0xbe, 0x2a, 0xbe, 0x2a, 0xc5, 0x2a, 0xc5, 0x2a, 0xce, + 0x2a, 0xce, 0x2a, 0xd7, 0x2a, 0xd7, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, + 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, + 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, + 0x2a, 0xe2, 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, + 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, + 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0xe2, + 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, + 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, + 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0xe2, 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, + 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, + 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, 0x2a, 0x9f, + 0x2a, 0x9f, 0x01, 0x06, 0x00, 0x06, 0x08, 0x04, 0x2a, 0xea, 0x01, 0x06, + 0x00, 0x06, 0x08, 0x04, 0x2a, 0xea, 0x01, 0x06, 0x00, 0x06, 0x08, 0x0c, + 0x25, 0x4e, 0x08, 0x04, 0x2a, 0xea, 0x01, 0x06, 0x00, 0x06, 0x08, 0x0c, + 0x25, 0x4e, 0x08, 0x04, 0x2a, 0xea, 0x01, 0x06, 0x00, 0x06, 0x08, 0x0c, + 0x23, 0xbf, 0x08, 0x04, 0x2a, 0xea, 0x01, 0x06, 0x00, 0x06, 0x08, 0x0c, + 0x23, 0xbf, 0x08, 0x04, 0x2a, 0xea, 0x01, 0x06, 0x00, 0x06, 0x08, 0x0c, + 0x25, 0x4e, 0x08, 0x0c, 0x23, 0xbf, 0x08, 0x04, 0x2a, 0xea, 0x01, 0x06, + 0x00, 0x06, 0x08, 0x0c, 0x25, 0x4e, 0x08, 0x0c, 0x23, 0xbf, 0x08, 0x04, + 0x2a, 0xea, 0x01, 0x06, 0x00, 0x06, 0x08, 0x0c, 0x24, 0x27, 0x08, 0x04, + 0x2a, 0xea, 0x01, 0x06, 0x00, 0x06, 0x08, 0x0c, 0x24, 0x27, 0x08, 0x04, + 0x2a, 0xea, 0x01, 0x06, 0x00, 0x06, 0x08, 0x0c, 0x25, 0x4e, 0x08, 0x0c, + 0x24, 0x27, 0x08, 0x04, 0x2a, 0xea, 0x01, 0x06, 0x00, 0x06, 0x08, 0x0c, + 0x25, 0x4e, 0x08, 0x0c, 0x24, 0x27, 0x08, 0x04, 0x2a, 0xea, 0x01, 0x06, + 0x00, 0x06, 0x08, 0x0c, 0x23, 0xbf, 0x08, 0x0c, 0x24, 0x27, 0x08, 0x04, + 0x2a, 0xea, 0x01, 0x06, 0x00, 0x06, 0x08, 0x0c, 0x23, 0xbf, 0x08, 0x0c, + 0x24, 0x27, 0x08, 0x04, 0x2a, 0xea, 0x01, 0x06, 0x00, 0x06, 0x08, 0x0c, + 0x25, 0x4e, 0x08, 0x0c, 0x23, 0xbf, 0x08, 0x0c, 0x24, 0x27, 0x08, 0x04, + 0x2a, 0xea, 0x01, 0x06, 0x00, 0x06, 0x08, 0x0c, 0x25, 0x4e, 0x08, 0x0c, + 0x23, 0xbf, 0x08, 0x0c, 0x24, 0x27, 0x08, 0x04, 0x2a, 0xea, 0xe0, 0x00, + 0x0c, 0xf0, 0x01, 0x06, 0x00, 0x06, 0x08, 0x0c, 0x29, 0x0b, 0x08, 0x04, + 0x2a, 0xea, 0x01, 0x06, 0x00, 0x06, 0x08, 0x0c, 0x29, 0x0b, 0x08, 0x0c, + 0x25, 0x4e, 0x04, 0xe0, 0x01, 0x06, 0x00, 0x06, 0x08, 0x0c, 0x29, 0x0b, + 0x08, 0x0c, 0x23, 0xbf, 0x04, 0xa8, 0x01, 0x06, 0x00, 0x06, 0x08, 0x0c, + 0x29, 0x0b, 0x08, 0x0c, 0x25, 0x4e, 0x08, 0x0c, 0x23, 0xbf, 0x04, 0x60, + 0x01, 0x06, 0x00, 0x06, 0x08, 0x0c, 0x29, 0x0b, 0x08, 0x0c, 0x24, 0x27, + 0x04, 0x28, 0x01, 0x06, 0x00, 0x06, 0x08, 0x0c, 0x29, 0x0b, 0x08, 0x0c, + 0x25, 0x4e, 0x08, 0x0c, 0x24, 0x27, 0x00, 0xe0, 0x01, 0x06, 0x00, 0x06, + 0x08, 0x0c, 0x29, 0x0b, 0x08, 0x0c, 0x23, 0xbf, 0x08, 0x0c, 0x24, 0x27, + 0x00, 0x98, 0x01, 0x06, 0x00, 0x06, 0x08, 0x0c, 0x29, 0x0b, 0x08, 0x0c, + 0x25, 0x4e, 0x08, 0x0c, 0x23, 0xbf, 0x08, 0x0c, 0x24, 0x27, 0x00, 0x40, + 0x20, 0xd1, 0x00, 0x00, 0x20, 0xd1, 0x00, 0x01, 0x20, 0xd1, 0x00, 0x00, + 0x08, 0x0c, 0x15, 0x1a, 0x00, 0x0e, 0x01, 0x0e, 0x00, 0x0d, 0x00, 0xc6, + 0x00, 0x26, 0x00, 0x46, 0x20, 0x21, 0x00, 0x00, 0x08, 0x0c, 0x53, 0x7b, + 0x19, 0x04, 0x2b, 0xca, 0x72, 0xd4, 0x20, 0x01, 0xb8, 0x9e, 0x20, 0x04, + 0xa0, 0x05, 0x11, 0x10, 0xd2, 0x9c, 0x01, 0x48, 0xd2, 0x84, 0x11, 0x38, + 0xd2, 0xbc, 0x19, 0x04, 0x2b, 0xca, 0x08, 0x0c, 0x2b, 0xce, 0x08, 0x04, + 0x2b, 0xca, 0xd2, 0xcc, 0x19, 0x04, 0x2b, 0xca, 0x08, 0x0c, 0x5b, 0x41, + 0x11, 0x20, 0x70, 0x9f, 0xff, 0xff, 0x08, 0x04, 0x2b, 0xca, 0xd2, 0x94, + 0x01, 0x20, 0x70, 0x9f, 0xff, 0xff, 0x08, 0x04, 0x2b, 0xca, 0x20, 0x01, + 0xb6, 0x15, 0x20, 0x3c, 0x72, 0x88, 0xd2, 0x84, 0x09, 0x04, 0x2b, 0x6c, + 0xd2, 0x8c, 0x19, 0x04, 0x2b, 0x6c, 0x00, 0x36, 0x73, 0x9c, 0xa3, 0x8e, + 0xff, 0xff, 0x11, 0x10, 0x20, 0x19, 0x00, 0x01, 0x83, 0x14, 0xa2, 0xe0, + 0xbd, 0xc0, 0x2c, 0x04, 0xa3, 0x8c, 0x00, 0x01, 0x01, 0x20, 0xa0, 0x84, + 0xff, 0x00, 0x80, 0x07, 0x00, 0x10, 0xa0, 0x84, 0x00, 0xff, 0xa7, 0x0e, + 0x05, 0x60, 0xa0, 0x8e, 0x00, 0x00, 0x05, 0x48, 0xa0, 0x8e, 0x00, 0xff, + 0x11, 0x50, 0x72, 0x30, 0xd2, 0x84, 0x15, 0x38, 0x72, 0x88, 0xc2, 0x8d, + 0x72, 0x8a, 0x70, 0x9f, 0xff, 0xff, 0x00, 0x3e, 0x04, 0x28, 0x20, 0x09, + 0x00, 0x00, 0x08, 0x0c, 0x28, 0x52, 0x08, 0x0c, 0x4f, 0xbf, 0x11, 0xb8, + 0x60, 0x04, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, 0x00, 0x06, 0x11, 0x50, + 0x70, 0x30, 0xd0, 0x8c, 0x01, 0x18, 0x60, 0x00, 0xd0, 0xbc, 0x01, 0x20, + 0x08, 0x0c, 0x2b, 0xe1, 0x01, 0x40, 0x00, 0x28, 0x08, 0x0c, 0x2d, 0x12, + 0x08, 0x0c, 0x2c, 0x0f, 0x01, 0x10, 0x83, 0x18, 0x08, 0x18, 0x73, 0x9e, + 0x00, 0x10, 0x70, 0x9f, 0xff, 0xff, 0x00, 0x3e, 0x08, 0x04, 0x2b, 0xca, + 0xa7, 0x80, 0x2d, 0xf9, 0x20, 0x3d, 0xa7, 0xbc, 0xff, 0x00, 0x87, 0x3f, + 0x20, 0x41, 0x00, 0x7e, 0x70, 0x9c, 0xa0, 0x96, 0xff, 0xff, 0x11, 0x20, + 0x20, 0x09, 0x00, 0x00, 0x28, 0xa8, 0x00, 0x50, 0xa8, 0x12, 0x02, 0x20, + 0x20, 0x08, 0xa8, 0x02, 0x20, 0xa8, 0x00, 0x20, 0x70, 0x9f, 0xff, 0xff, + 0x08, 0x04, 0x2b, 0xca, 0x27, 0x00, 0x01, 0x56, 0x00, 0x16, 0xa1, 0x06, + 0x05, 0xa0, 0xc4, 0x84, 0x08, 0x0c, 0x50, 0x1b, 0x01, 0x20, 0x08, 0x0c, + 0x4f, 0xbf, 0x15, 0xa8, 0x00, 0x08, 0xc4, 0x85, 0x60, 0x04, 0xa0, 0x84, + 0x00, 0xff, 0xa0, 0x86, 0x00, 0x06, 0x11, 0x30, 0x70, 0x30, 0xd0, 0x8c, + 0x01, 0xe8, 0x60, 0x00, 0xd0, 0xbc, 0x11, 0xd0, 0x72, 0x88, 0xd2, 0x8c, + 0x01, 0x88, 0x60, 0x04, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x82, 0x00, 0x06, + 0x02, 0xb0, 0xd4, 0x84, 0x11, 0x18, 0x08, 0x0c, 0x4f, 0xde, 0x00, 0x28, + 0x08, 0x0c, 0x2d, 0x9f, 0x01, 0x70, 0x08, 0x0c, 0x2d, 0xcc, 0x00, 0x58, + 0x08, 0x0c, 0x2d, 0x12, 0x08, 0x0c, 0x2c, 0x0f, 0x01, 0x70, 0x00, 0x28, + 0x08, 0x0c, 0x2d, 0x9f, 0x01, 0x10, 0x04, 0x19, 0x01, 0x40, 0x00, 0x1e, + 0x81, 0x08, 0x01, 0x5e, 0x1f, 0x04, 0x2b, 0x86, 0x70, 0x9f, 0xff, 0xff, + 0x00, 0x18, 0x00, 0x1e, 0x01, 0x5e, 0x71, 0x9e, 0x00, 0x4e, 0x00, 0x2e, + 0x00, 0xce, 0x00, 0x05, 0x00, 0xc6, 0x00, 0x16, 0x70, 0x9f, 0x00, 0x01, + 0x20, 0x09, 0x00, 0x7e, 0x08, 0x0c, 0x4f, 0xbf, 0x11, 0x38, 0x08, 0x0c, + 0x2d, 0x12, 0x04, 0xa9, 0x01, 0x18, 0x70, 0xd4, 0xc0, 0xbd, 0x70, 0xd6, + 0x00, 0x1e, 0x00, 0xce, 0x00, 0x05, 0x00, 0x16, 0x00, 0x76, 0x00, 0xd6, + 0x00, 0xc6, 0x2c, 0x68, 0x20, 0x01, 0xb6, 0x57, 0x20, 0x04, 0xa0, 0x84, + 0x00, 0xff, 0x68, 0x42, 0x08, 0x0c, 0x9f, 0x92, 0x01, 0xd8, 0x2d, 0x00, + 0x60, 0x1a, 0x08, 0x0c, 0xa0, 0xe3, 0x60, 0x1f, 0x00, 0x01, 0x20, 0x01, + 0x00, 0x00, 0x08, 0x0c, 0x4f, 0x5d, 0x20, 0x01, 0x00, 0x00, 0x08, 0x0c, + 0x4f, 0x6f, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x70, 0x98, 0x80, 0x00, + 0x70, 0x9a, 0x01, 0x2e, 0x20, 0x09, 0x00, 0x04, 0x08, 0x0c, 0x86, 0xd3, + 0xa0, 0x85, 0x00, 0x01, 0x00, 0xce, 0x00, 0xde, 0x00, 0x7e, 0x00, 0x1e, + 0x00, 0x05, 0x00, 0x16, 0x00, 0x76, 0x00, 0xd6, 0x00, 0xc6, 0x2c, 0x68, + 0x20, 0x01, 0xb6, 0x57, 0x20, 0x04, 0xa0, 0x84, 0x00, 0xff, 0x68, 0x42, + 0x08, 0x0c, 0x9f, 0x92, 0x05, 0x50, 0x2d, 0x00, 0x60, 0x1a, 0x68, 0x00, + 0xc0, 0xc4, 0x68, 0x02, 0x68, 0xa0, 0xa0, 0x86, 0x00, 0x7e, 0x01, 0x40, + 0x68, 0x04, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, 0x00, 0x06, 0x11, 0x10, + 0x08, 0x0c, 0x2c, 0xd1, 0x08, 0x0c, 0xa0, 0xe3, 0x60, 0x1f, 0x00, 0x01, + 0x20, 0x01, 0x00, 0x00, 0x08, 0x0c, 0x4f, 0x5d, 0x20, 0x01, 0x00, 0x02, + 0x08, 0x0c, 0x4f, 0x6f, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x70, 0x98, + 0x80, 0x00, 0x70, 0x9a, 0x01, 0x2e, 0x20, 0x09, 0x00, 0x02, 0x08, 0x0c, + 0x86, 0xd3, 0xa0, 0x85, 0x00, 0x01, 0x00, 0xce, 0x00, 0xde, 0x00, 0x7e, + 0x00, 0x1e, 0x00, 0x05, 0x00, 0xc6, 0x00, 0x26, 0x20, 0x09, 0x00, 0x80, + 0x08, 0x0c, 0x4f, 0xbf, 0x11, 0x20, 0x00, 0x31, 0x01, 0x10, 0x70, 0xdb, + 0xff, 0xff, 0x00, 0x2e, 0x00, 0xce, 0x00, 0x05, 0x00, 0x16, 0x00, 0x76, + 0x00, 0xd6, 0x00, 0xc6, 0x2c, 0x68, 0x08, 0x0c, 0x86, 0x4e, 0x01, 0xe8, + 0x2d, 0x00, 0x60, 0x1a, 0x08, 0x0c, 0xa0, 0xe3, 0x60, 0x1f, 0x00, 0x01, + 0x20, 0x01, 0x00, 0x00, 0x08, 0x0c, 0x4f, 0x5d, 0x20, 0x01, 0x00, 0x02, + 0x08, 0x0c, 0x4f, 0x6f, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, + 0x2c, 0xd1, 0x70, 0xdc, 0x80, 0x00, 0x70, 0xde, 0x01, 0x2e, 0x20, 0x09, + 0x00, 0x02, 0x08, 0x0c, 0x86, 0xd3, 0xa0, 0x85, 0x00, 0x01, 0x00, 0xce, + 0x00, 0xde, 0x00, 0x7e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xc6, 0x00, 0xd6, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x09, 0x00, 0x7f, 0x08, 0x0c, + 0x4f, 0xbf, 0x11, 0x90, 0x2c, 0x68, 0x08, 0x0c, 0x86, 0x4e, 0x01, 0x70, + 0x2d, 0x00, 0x60, 0x1a, 0x63, 0x12, 0x60, 0x1f, 0x00, 0x01, 0x62, 0x0a, + 0x08, 0x0c, 0xa0, 0xe3, 0x20, 0x09, 0x00, 0x22, 0x08, 0x0c, 0x86, 0xd3, + 0xa0, 0x85, 0x00, 0x01, 0x01, 0x2e, 0x00, 0xde, 0x00, 0xce, 0x00, 0x05, + 0x00, 0xe6, 0x00, 0xc6, 0x00, 0x66, 0x00, 0x36, 0x00, 0x26, 0x08, 0x0c, + 0x6e, 0x73, 0x08, 0x0c, 0x6e, 0x16, 0x08, 0x0c, 0x90, 0xfb, 0x21, 0x30, + 0x81, 0xff, 0x01, 0x28, 0x20, 0xa9, 0x00, 0x7e, 0x20, 0x09, 0x00, 0x00, + 0x00, 0x20, 0x20, 0xa9, 0x00, 0x7f, 0x20, 0x09, 0x00, 0x00, 0x00, 0x16, + 0x08, 0x0c, 0x50, 0x1b, 0x11, 0x20, 0x08, 0x0c, 0x52, 0x1c, 0x08, 0x0c, + 0x4c, 0x7e, 0x00, 0x1e, 0x81, 0x08, 0x1f, 0x04, 0x2c, 0xbb, 0x86, 0xff, + 0x11, 0x10, 0x08, 0x0c, 0x11, 0xf5, 0x00, 0x2e, 0x00, 0x3e, 0x00, 0x6e, + 0x00, 0xce, 0x00, 0xee, 0x00, 0x05, 0x00, 0xe6, 0x00, 0xc6, 0x00, 0x36, + 0x00, 0x26, 0x00, 0x16, 0x62, 0x18, 0x22, 0x70, 0x72, 0xa0, 0x00, 0x26, + 0x20, 0x19, 0x00, 0x29, 0x08, 0x0c, 0x6e, 0x67, 0x00, 0x76, 0x20, 0x39, + 0x00, 0x00, 0x08, 0x0c, 0x6d, 0x74, 0x2c, 0x08, 0x08, 0x0c, 0xaf, 0x3e, + 0x00, 0x7e, 0x00, 0x1e, 0x2e, 0x60, 0x08, 0x0c, 0x52, 0x1c, 0x62, 0x10, + 0x63, 0x14, 0x08, 0x0c, 0x4c, 0x7e, 0x62, 0x12, 0x63, 0x16, 0x00, 0x1e, + 0x00, 0x2e, 0x00, 0x3e, 0x00, 0xce, 0x00, 0xee, 0x00, 0x05, 0x00, 0xe6, + 0x00, 0x06, 0x60, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, 0xa0, 0x86, + 0x00, 0x80, 0x01, 0x50, 0x20, 0x71, 0xb6, 0x00, 0x70, 0x98, 0xa0, 0x05, + 0x01, 0x10, 0x80, 0x01, 0x70, 0x9a, 0x00, 0x0e, 0x00, 0xee, 0x00, 0x05, + 0x20, 0x71, 0xb6, 0x00, 0x70, 0xdc, 0xa0, 0x05, 0x0d, 0xc0, 0x80, 0x01, + 0x70, 0xde, 0x0c, 0xa8, 0x60, 0x00, 0xc0, 0x8c, 0x60, 0x02, 0x00, 0x05, + 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xc6, 0x00, 0x36, 0x00, 0x26, 0x00, 0x16, + 0x01, 0x56, 0x21, 0x78, 0x81, 0xff, 0x11, 0x18, 0x20, 0xa9, 0x00, 0x01, + 0x00, 0x98, 0x20, 0x01, 0xb6, 0x53, 0x20, 0x04, 0xd0, 0xc4, 0x01, 0x50, + 0xd0, 0xa4, 0x01, 0x40, 0xa0, 0x06, 0x00, 0x46, 0x20, 0x20, 0x20, 0x09, + 0x00, 0x2d, 0x08, 0x0c, 0xb1, 0xa4, 0x00, 0x4e, 0x20, 0xa9, 0x00, 0xff, + 0x20, 0x11, 0x00, 0x00, 0x00, 0x26, 0xa2, 0x8e, 0x00, 0x7e, 0x09, 0x04, + 0x2d, 0x7e, 0xa2, 0x8e, 0x00, 0x7f, 0x09, 0x04, 0x2d, 0x7e, 0xa2, 0x8e, + 0x00, 0x80, 0x05, 0xe0, 0xa2, 0x88, 0xb7, 0x35, 0x21, 0x0c, 0x81, 0xff, + 0x05, 0xb8, 0x8f, 0xff, 0x11, 0x48, 0x20, 0x01, 0xb8, 0xbe, 0x00, 0x06, + 0x20, 0x03, 0x00, 0x01, 0x04, 0xd9, 0x00, 0x0e, 0x20, 0x03, 0x00, 0x00, + 0x00, 0xc6, 0x21, 0x60, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x53, 0x85, + 0x00, 0xce, 0x20, 0x19, 0x00, 0x29, 0x08, 0x0c, 0x6e, 0x67, 0x00, 0x76, + 0x20, 0x39, 0x00, 0x00, 0x08, 0x0c, 0x6d, 0x74, 0x00, 0xc6, 0x00, 0x26, + 0x21, 0x60, 0x62, 0x04, 0xa2, 0x94, 0x00, 0xff, 0xa2, 0x86, 0x00, 0x06, + 0x11, 0x18, 0x60, 0x07, 0x04, 0x04, 0x00, 0x28, 0x20, 0x01, 0x00, 0x04, + 0x80, 0x07, 0xa2, 0x15, 0x62, 0x06, 0x00, 0x2e, 0x00, 0xce, 0x00, 0x16, + 0x2c, 0x08, 0x08, 0x0c, 0xaf, 0x3e, 0x00, 0x1e, 0x00, 0x7e, 0x21, 0x60, + 0x08, 0x0c, 0x52, 0x1c, 0x00, 0x2e, 0x82, 0x10, 0x1f, 0x04, 0x2d, 0x36, + 0x01, 0x5e, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x3e, 0x00, 0xce, 0x00, 0xee, + 0x00, 0xfe, 0x00, 0x05, 0x00, 0x46, 0x00, 0x26, 0x00, 0x16, 0x20, 0x01, + 0xb6, 0x53, 0x20, 0x04, 0xd0, 0xc4, 0x01, 0x48, 0xd0, 0xa4, 0x01, 0x38, + 0xa0, 0x06, 0x22, 0x20, 0x84, 0x27, 0x20, 0x09, 0x00, 0x29, 0x08, 0x0c, + 0xb1, 0xa4, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x4e, 0x00, 0x05, 0x00, 0x16, + 0x00, 0x26, 0x00, 0x36, 0x00, 0xc6, 0x72, 0x88, 0x82, 0xff, 0x01, 0xf8, + 0x20, 0x11, 0xb6, 0x53, 0x22, 0x14, 0xd2, 0xac, 0x11, 0xd0, 0x21, 0x00, + 0x08, 0x0c, 0x28, 0x66, 0x81, 0xff, 0x01, 0xb8, 0x20, 0x19, 0x00, 0x01, + 0x83, 0x14, 0xa2, 0xe0, 0xbd, 0xc0, 0x2c, 0x04, 0xd3, 0x84, 0x01, 0x20, + 0xa0, 0x84, 0xff, 0x00, 0x80, 0x07, 0x00, 0x10, 0xa0, 0x84, 0x00, 0xff, + 0xa1, 0x16, 0x01, 0x38, 0xa0, 0x96, 0x00, 0xff, 0x01, 0x10, 0x83, 0x18, + 0x0c, 0x68, 0xa0, 0x85, 0x00, 0x01, 0x00, 0xce, 0x00, 0x3e, 0x00, 0x2e, + 0x00, 0x1e, 0x00, 0x05, 0x00, 0x16, 0x00, 0xc6, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x21, 0x10, 0x00, 0x26, + 0x20, 0x19, 0x00, 0x29, 0x08, 0x0c, 0x83, 0x20, 0x00, 0x2e, 0x08, 0x0c, + 0xb4, 0x49, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, 0xa1, 0x80, 0xb7, 0x35, + 0x20, 0x04, 0xa0, 0x65, 0x01, 0x58, 0x00, 0x16, 0x00, 0xc6, 0x20, 0x61, + 0xb9, 0xf5, 0x00, 0x1e, 0x61, 0x1a, 0x08, 0x0c, 0x2c, 0xd1, 0x00, 0x1e, + 0x08, 0x0c, 0x4f, 0xde, 0x01, 0x2e, 0x00, 0xce, 0x00, 0x1e, 0x00, 0x05, + 0x20, 0x01, 0xb6, 0x35, 0x20, 0x04, 0xd0, 0xcc, 0x00, 0x05, 0x7e, 0xef, + 0x7d, 0xe8, 0x7c, 0xe4, 0x80, 0xe2, 0x7b, 0xe1, 0x80, 0xe0, 0x80, 0xdc, + 0x80, 0xda, 0x7a, 0xd9, 0x80, 0xd6, 0x80, 0xd5, 0x80, 0xd4, 0x80, 0xd3, + 0x80, 0xd2, 0x80, 0xd1, 0x79, 0xce, 0x78, 0xcd, 0x80, 0xcc, 0x80, 0xcb, + 0x80, 0xca, 0x80, 0xc9, 0x80, 0xc7, 0x80, 0xc6, 0x77, 0xc5, 0x76, 0xc3, + 0x80, 0xbc, 0x80, 0xba, 0x75, 0xb9, 0x80, 0xb6, 0x74, 0xb5, 0x73, 0xb4, + 0x72, 0xb3, 0x80, 0xb2, 0x80, 0xb1, 0x80, 0xae, 0x71, 0xad, 0x80, 0xac, + 0x70, 0xab, 0x6f, 0xaa, 0x6e, 0xa9, 0x80, 0xa7, 0x6d, 0xa6, 0x6c, 0xa5, + 0x6b, 0xa3, 0x6a, 0x9f, 0x69, 0x9e, 0x68, 0x9d, 0x80, 0x9b, 0x80, 0x98, + 0x67, 0x97, 0x66, 0x90, 0x65, 0x8f, 0x64, 0x88, 0x63, 0x84, 0x62, 0x82, + 0x80, 0x81, 0x80, 0x80, 0x61, 0x7c, 0x60, 0x7a, 0x80, 0x79, 0x5f, 0x76, + 0x80, 0x75, 0x80, 0x74, 0x80, 0x73, 0x80, 0x72, 0x80, 0x71, 0x80, 0x6e, + 0x5e, 0x6d, 0x80, 0x6c, 0x5d, 0x6b, 0x5c, 0x6a, 0x5b, 0x69, 0x80, 0x67, + 0x5a, 0x66, 0x59, 0x65, 0x58, 0x63, 0x57, 0x5c, 0x56, 0x5a, 0x55, 0x59, + 0x80, 0x56, 0x80, 0x55, 0x54, 0x54, 0x53, 0x53, 0x52, 0x52, 0x51, 0x51, + 0x50, 0x4e, 0x4f, 0x4d, 0x80, 0x4c, 0x80, 0x4b, 0x4e, 0x4a, 0x4d, 0x49, + 0x80, 0x47, 0x4c, 0x46, 0x80, 0x45, 0x80, 0x43, 0x80, 0x3c, 0x80, 0x3a, + 0x80, 0x39, 0x80, 0x36, 0x4b, 0x35, 0x80, 0x34, 0x4a, 0x33, 0x49, 0x32, + 0x48, 0x31, 0x80, 0x2e, 0x47, 0x2d, 0x46, 0x2c, 0x45, 0x2b, 0x44, 0x2a, + 0x43, 0x29, 0x42, 0x27, 0x80, 0x26, 0x80, 0x25, 0x41, 0x23, 0x40, 0x1f, + 0x3f, 0x1e, 0x3e, 0x1d, 0x3d, 0x1b, 0x3c, 0x18, 0x80, 0x17, 0x80, 0x10, + 0x3b, 0x0f, 0x3a, 0x08, 0x80, 0x04, 0x39, 0x02, 0x80, 0x01, 0x80, 0x00, + 0x80, 0x00, 0x38, 0x00, 0x37, 0x00, 0x36, 0x00, 0x80, 0x00, 0x35, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x34, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x33, 0x00, 0x32, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x31, 0x00, 0x30, 0x00, 0x80, 0x00, 0x80, 0x00, 0x2f, 0x00, 0x80, 0x00, + 0x2e, 0x00, 0x2d, 0x00, 0x2c, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x2b, 0x00, 0x80, 0x00, 0x2a, 0x00, 0x29, 0x00, 0x28, 0x00, 0x80, 0x00, + 0x27, 0x00, 0x26, 0x00, 0x25, 0x00, 0x24, 0x00, 0x23, 0x00, 0x22, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x21, 0x00, 0x20, 0x00, 0x1f, 0x00, 0x1e, 0x00, + 0x1d, 0x00, 0x1c, 0x00, 0x80, 0x00, 0x80, 0x00, 0x1b, 0x00, 0x1a, 0x00, + 0x80, 0x00, 0x19, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x18, 0x00, 0x80, 0x00, 0x17, 0x00, 0x16, 0x00, + 0x15, 0x00, 0x80, 0x00, 0x14, 0x00, 0x13, 0x00, 0x12, 0x00, 0x11, 0x00, + 0x10, 0x00, 0x0f, 0x00, 0x80, 0x00, 0x80, 0x00, 0x0e, 0x00, 0x0d, 0x00, + 0x0c, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x09, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x08, 0x00, 0x07, 0x00, 0x80, 0x00, 0x06, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x05, 0x00, 0x04, 0x00, 0x03, 0x00, 0x80, 0x00, 0x02, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x01, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x20, 0x71, 0xb6, 0x82, 0x70, 0x03, + 0x00, 0x02, 0xa0, 0x06, 0x70, 0x12, 0x70, 0x16, 0x70, 0x3a, 0x70, 0x3e, + 0x70, 0x33, 0xb6, 0x92, 0x70, 0x37, 0xb6, 0x92, 0x70, 0x07, 0x00, 0x01, + 0x20, 0x61, 0xb6, 0xd2, 0x60, 0x03, 0x00, 0x02, 0x00, 0x05, 0x10, 0x04, + 0x2f, 0x1f, 0x0e, 0x04, 0x2f, 0x1f, 0x20, 0x71, 0xb6, 0x82, 0x2b, 0x78, + 0x78, 0x18, 0xd0, 0x84, 0x11, 0x40, 0x2a, 0x60, 0x78, 0x20, 0xa0, 0x8e, + 0x00, 0x69, 0x19, 0x04, 0x30, 0x04, 0x08, 0x04, 0x2f, 0x9d, 0x00, 0x05, + 0x20, 0x71, 0xb6, 0x82, 0x70, 0x04, 0x00, 0x02, 0x2f, 0x28, 0x2f, 0x29, + 0x2f, 0x32, 0x2f, 0x43, 0x00, 0x05, 0x10, 0x04, 0x2f, 0x31, 0x0e, 0x04, + 0x2f, 0x31, 0x2b, 0x78, 0x78, 0x18, 0xd0, 0x84, 0x01, 0xe8, 0x00, 0x05, + 0x2b, 0x78, 0x20, 0x61, 0xb6, 0xd2, 0x60, 0x08, 0xa0, 0x8e, 0x01, 0x00, + 0x01, 0x28, 0xa0, 0x86, 0x02, 0x00, 0x09, 0x04, 0x2f, 0xfe, 0x00, 0x05, + 0x70, 0x14, 0x20, 0x68, 0x2a, 0x60, 0x70, 0x18, 0x08, 0x07, 0x70, 0x10, + 0x20, 0x68, 0x68, 0x34, 0xa0, 0x86, 0x01, 0x03, 0x01, 0x08, 0x00, 0x05, + 0x2a, 0x60, 0x2b, 0x78, 0x70, 0x18, 0x08, 0x07, 0x2a, 0x60, 0x78, 0x20, + 0xa0, 0x8a, 0x00, 0x40, 0x12, 0x10, 0x61, 0xc4, 0x00, 0x42, 0x21, 0x00, + 0xa0, 0x8a, 0x00, 0x3f, 0x1a, 0x04, 0x2f, 0xfb, 0x61, 0xc4, 0x08, 0x04, + 0x2f, 0x9d, 0x2f, 0xdf, 0x30, 0x0a, 0x30, 0x12, 0x30, 0x16, 0x30, 0x1e, + 0x30, 0x24, 0x30, 0x28, 0x30, 0x34, 0x30, 0x37, 0x30, 0x41, 0x30, 0x44, + 0x2f, 0xfb, 0x2f, 0xfb, 0x2f, 0xfb, 0x30, 0x47, 0x2f, 0xfb, 0x30, 0x56, + 0x30, 0x6d, 0x30, 0x84, 0x30, 0xfe, 0x31, 0x03, 0x31, 0x2c, 0x31, 0x7d, + 0x31, 0x8e, 0x31, 0xad, 0x31, 0xe5, 0x31, 0xef, 0x31, 0xfc, 0x32, 0x0f, + 0x32, 0x30, 0x32, 0x39, 0x32, 0x6f, 0x32, 0x75, 0x2f, 0xfb, 0x32, 0x9e, + 0x2f, 0xfb, 0x2f, 0xfb, 0x2f, 0xfb, 0x2f, 0xfb, 0x2f, 0xfb, 0x32, 0xa5, + 0x32, 0xaf, 0x2f, 0xfb, 0x2f, 0xfb, 0x2f, 0xfb, 0x2f, 0xfb, 0x2f, 0xfb, + 0x2f, 0xfb, 0x2f, 0xfb, 0x2f, 0xfb, 0x32, 0xb7, 0x2f, 0xfb, 0x2f, 0xfb, + 0x2f, 0xfb, 0x2f, 0xfb, 0x2f, 0xfb, 0x32, 0xc9, 0x32, 0xd3, 0x2f, 0xfb, + 0x2f, 0xfb, 0x2f, 0xfb, 0x2f, 0xfb, 0x2f, 0xfb, 0x2f, 0xfb, 0x00, 0x02, + 0x32, 0xfd, 0x33, 0x51, 0x33, 0xac, 0x33, 0xc6, 0x2f, 0xfb, 0x33, 0xf7, + 0x38, 0x2a, 0x42, 0x7a, 0x2f, 0xfb, 0x2f, 0xfb, 0x2f, 0xfb, 0x2f, 0xfb, + 0x2f, 0xfb, 0x2f, 0xfb, 0x2f, 0xfb, 0x2f, 0xfb, 0x30, 0x41, 0x30, 0x44, + 0x38, 0x2c, 0x2f, 0xfb, 0x38, 0x39, 0x43, 0x13, 0x43, 0x6e, 0x43, 0xd2, + 0x2f, 0xfb, 0x44, 0x35, 0x44, 0x5f, 0x44, 0x7e, 0x44, 0xb0, 0x2f, 0xfb, + 0x2f, 0xfb, 0x2f, 0xfb, 0x38, 0x3d, 0x39, 0xe2, 0x39, 0xfc, 0x3a, 0x26, + 0x3a, 0x87, 0x3a, 0xe7, 0x3a, 0xf2, 0x3b, 0x2a, 0x3b, 0x39, 0x3b, 0x48, + 0x3b, 0x4b, 0x3b, 0x6e, 0x3b, 0xba, 0x3c, 0x34, 0x3c, 0x41, 0x3d, 0x42, + 0x3e, 0x6a, 0x3e, 0x93, 0x3f, 0x91, 0x3f, 0xb3, 0x3f, 0xbf, 0x3f, 0xf8, + 0x40, 0xbc, 0x2f, 0xfb, 0x2f, 0xfb, 0x2f, 0xfb, 0x2f, 0xfb, 0x41, 0x24, + 0x41, 0x3f, 0x41, 0xb1, 0x42, 0x63, 0x71, 0x3c, 0x00, 0x00, 0x20, 0x21, + 0x40, 0x00, 0x08, 0x0c, 0x3e, 0xf0, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x0e, 0x04, 0x2f, 0xeb, 0x78, 0x18, 0xd0, 0x84, 0x01, 0x10, 0x01, 0x2e, + 0x0c, 0xb0, 0x7c, 0x22, 0x79, 0x26, 0x7a, 0x2a, 0x7b, 0x2e, 0x78, 0x1b, + 0x00, 0x01, 0x20, 0x91, 0x40, 0x80, 0x70, 0x07, 0x00, 0x01, 0x20, 0x91, + 0x50, 0x00, 0x01, 0x2e, 0x00, 0x05, 0x20, 0x21, 0x40, 0x01, 0x0c, 0x18, + 0x20, 0x21, 0x40, 0x02, 0x0c, 0x00, 0x20, 0x21, 0x40, 0x03, 0x08, 0xe8, + 0x20, 0x21, 0x40, 0x05, 0x08, 0xd0, 0x20, 0x21, 0x40, 0x06, 0x08, 0xb8, + 0xa0, 0x2e, 0x25, 0x20, 0x7b, 0x28, 0x7a, 0x2c, 0x78, 0x24, 0x79, 0x30, + 0x08, 0x04, 0x3e, 0xfd, 0x78, 0x23, 0x00, 0x04, 0x78, 0x24, 0x08, 0x07, + 0xa0, 0x2e, 0x25, 0x20, 0x7b, 0x28, 0x7a, 0x2c, 0x78, 0x24, 0x79, 0x30, + 0x08, 0x04, 0x3f, 0x00, 0x79, 0x24, 0x78, 0x28, 0x21, 0x14, 0x20, 0x0a, + 0x08, 0x04, 0x2f, 0xdf, 0x79, 0x24, 0x21, 0x14, 0x08, 0x04, 0x2f, 0xdf, + 0x20, 0x99, 0x00, 0x09, 0x20, 0xa1, 0x00, 0x09, 0x20, 0xa9, 0x00, 0x07, + 0x53, 0xa3, 0x79, 0x24, 0x7a, 0x28, 0x7b, 0x2c, 0x08, 0x04, 0x2f, 0xdf, + 0x78, 0x24, 0x20, 0x60, 0x00, 0x90, 0x20, 0x09, 0x00, 0x02, 0x20, 0x11, + 0x00, 0x02, 0x20, 0x19, 0x00, 0x08, 0x78, 0x3b, 0x00, 0x17, 0x08, 0x04, + 0x2f, 0xdf, 0x7d, 0x38, 0x7c, 0x3c, 0x08, 0x40, 0x7d, 0x38, 0x7c, 0x3c, + 0x08, 0x88, 0x20, 0x61, 0x10, 0x00, 0xe1, 0x0c, 0xa0, 0x06, 0x2c, 0x15, + 0xa2, 0x00, 0x8c, 0x60, 0x81, 0x09, 0x1d, 0xd8, 0x20, 0x10, 0xa0, 0x05, + 0x09, 0x04, 0x2f, 0xdf, 0x08, 0x04, 0x30, 0x01, 0x20, 0x69, 0xb6, 0x52, + 0x78, 0x24, 0x79, 0x30, 0xa1, 0x1a, 0x1a, 0x04, 0x30, 0x07, 0x80, 0x19, + 0x09, 0x04, 0x30, 0x07, 0x68, 0x4a, 0x69, 0x42, 0x78, 0x2c, 0x68, 0x52, + 0x78, 0x28, 0x68, 0x56, 0xa0, 0x06, 0x68, 0x5a, 0x68, 0x5e, 0x08, 0x0c, + 0x5e, 0x17, 0x08, 0x04, 0x2f, 0xdf, 0x20, 0x69, 0xb6, 0x52, 0x78, 0x24, + 0x79, 0x34, 0xa1, 0x1a, 0x1a, 0x04, 0x30, 0x07, 0x80, 0x19, 0x09, 0x04, + 0x30, 0x07, 0x68, 0x4e, 0x69, 0x46, 0x78, 0x2c, 0x68, 0x62, 0x78, 0x28, + 0x68, 0x66, 0xa0, 0x06, 0x68, 0x6a, 0x68, 0x6e, 0x08, 0x0c, 0x54, 0x47, + 0x08, 0x04, 0x2f, 0xdf, 0xa0, 0x2e, 0x25, 0x20, 0x81, 0xff, 0x19, 0x04, + 0x30, 0x04, 0x79, 0x24, 0x7b, 0x28, 0x7a, 0x2c, 0x20, 0xa9, 0x00, 0x05, + 0x20, 0xa1, 0xb6, 0x89, 0x41, 0xa1, 0x08, 0x0c, 0x3e, 0xbc, 0x09, 0x04, + 0x30, 0x04, 0x20, 0x09, 0x00, 0x20, 0x08, 0x0c, 0x3e, 0xfd, 0x70, 0x1b, + 0x30, 0x9c, 0x00, 0x05, 0x68, 0x34, 0x20, 0x08, 0xa0, 0x84, 0x00, 0xff, + 0xa0, 0x96, 0x00, 0x11, 0x01, 0x38, 0xa0, 0x96, 0x00, 0x19, 0x01, 0x20, + 0xa0, 0x96, 0x00, 0x15, 0x19, 0x04, 0x30, 0x04, 0x81, 0x0f, 0xa1, 0x8c, + 0x00, 0xff, 0x09, 0x04, 0x30, 0x04, 0x71, 0x0e, 0x70, 0x0c, 0x80, 0x01, + 0x05, 0x28, 0x70, 0x0e, 0x08, 0x0c, 0x3e, 0xbc, 0x09, 0x04, 0x30, 0x04, + 0x20, 0x09, 0x00, 0x20, 0x20, 0x61, 0xb6, 0xd2, 0x62, 0x24, 0x63, 0x28, + 0x64, 0x2c, 0x65, 0x30, 0xa2, 0x90, 0x00, 0x40, 0xa3, 0x99, 0x00, 0x00, + 0xa4, 0xa1, 0x00, 0x00, 0xa5, 0xa9, 0x00, 0x00, 0x08, 0x0c, 0x3e, 0xfd, + 0x70, 0x1b, 0x30, 0xcd, 0x00, 0x05, 0x68, 0x34, 0xa0, 0x84, 0x00, 0xff, + 0xa0, 0x96, 0x00, 0x02, 0x01, 0x20, 0xa0, 0x96, 0x00, 0x0a, 0x19, 0x04, + 0x30, 0x04, 0x08, 0xc0, 0x70, 0x10, 0x20, 0x68, 0x68, 0x38, 0xc0, 0xfd, + 0x68, 0x3a, 0x08, 0x0c, 0x4e, 0xbb, 0x11, 0x28, 0x70, 0x07, 0x00, 0x03, + 0x70, 0x1b, 0x30, 0xe7, 0x00, 0x05, 0x08, 0x0c, 0x55, 0x4d, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x20, 0xa9, 0x00, 0x05, 0x20, 0x99, 0xb6, 0x89, + 0x53, 0x0a, 0x21, 0x00, 0xa2, 0x10, 0xa3, 0x99, 0x00, 0x00, 0xa4, 0xa1, + 0x00, 0x00, 0xa5, 0xa9, 0x00, 0x00, 0xad, 0x80, 0x00, 0x0d, 0x20, 0x09, + 0x00, 0x20, 0x01, 0x2e, 0x08, 0x04, 0x3f, 0x00, 0x61, 0xac, 0x78, 0x24, + 0x60, 0xae, 0x08, 0x04, 0x2f, 0xdf, 0x20, 0x91, 0x80, 0x00, 0x78, 0x23, + 0x40, 0x00, 0x78, 0x27, 0x49, 0x53, 0x78, 0x2b, 0x50, 0x20, 0x78, 0x2f, + 0x20, 0x20, 0x20, 0x09, 0x01, 0x7f, 0x21, 0x04, 0x78, 0x32, 0x3f, 0x00, + 0x78, 0x36, 0x20, 0x61, 0x01, 0x00, 0x62, 0x00, 0x20, 0x61, 0x02, 0x00, + 0x60, 0x3c, 0x80, 0x07, 0xa2, 0x05, 0x78, 0x3a, 0x20, 0x09, 0x04, 0xfd, + 0x21, 0x04, 0x78, 0x3e, 0x78, 0x1b, 0x00, 0x01, 0x20, 0x91, 0x50, 0x00, + 0x20, 0x91, 0x40, 0x80, 0x20, 0x71, 0x00, 0x10, 0x20, 0xc1, 0x00, 0xf0, + 0x08, 0x04, 0x04, 0x27, 0x81, 0xff, 0x19, 0x04, 0x30, 0x04, 0x79, 0x24, + 0x81, 0x0f, 0xa1, 0x8c, 0x00, 0xff, 0x08, 0x0c, 0x50, 0x1b, 0x19, 0x04, + 0x30, 0x07, 0x7e, 0x38, 0xa6, 0x84, 0x3f, 0xff, 0xa0, 0x82, 0x40, 0x00, + 0x02, 0x10, 0x08, 0x04, 0x30, 0x07, 0x7c, 0x28, 0x7d, 0x2c, 0x08, 0x0c, + 0x51, 0xe3, 0xd2, 0x8c, 0x11, 0x18, 0x08, 0x0c, 0x51, 0x8c, 0x00, 0x10, + 0x08, 0x0c, 0x51, 0xbc, 0x15, 0x18, 0x20, 0x61, 0xbe, 0x00, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x60, 0x00, 0xa0, 0x86, 0x00, 0x00, 0x01, 0x48, + 0x60, 0x10, 0xa0, 0x6d, 0x01, 0x30, 0x68, 0x3c, 0xa4, 0x06, 0x11, 0x18, + 0x68, 0x40, 0xa5, 0x06, 0x01, 0x50, 0x01, 0x2e, 0xac, 0xe0, 0x00, 0x18, + 0x20, 0x01, 0xb6, 0x17, 0x20, 0x04, 0xac, 0x02, 0x1a, 0x04, 0x30, 0x04, + 0x0c, 0x30, 0x08, 0x0c, 0x99, 0xe6, 0x01, 0x2e, 0x09, 0x04, 0x30, 0x04, + 0x08, 0x04, 0x2f, 0xdf, 0xa0, 0x0e, 0x20, 0x01, 0x00, 0x05, 0x08, 0x0c, + 0x55, 0x4d, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x9f, 0x8e, + 0x08, 0x0c, 0x54, 0x7a, 0x01, 0x2e, 0x08, 0x04, 0x2f, 0xdf, 0x81, 0xff, + 0x19, 0x04, 0x30, 0x04, 0x08, 0x0c, 0x3e, 0xd1, 0x09, 0x04, 0x30, 0x07, + 0x08, 0x0c, 0x50, 0xe1, 0x09, 0x04, 0x30, 0x04, 0x08, 0x0c, 0x51, 0xef, + 0x09, 0x04, 0x30, 0x04, 0x08, 0x04, 0x2f, 0xdf, 0x81, 0xff, 0x19, 0x04, + 0x30, 0x04, 0x08, 0x0c, 0x3e, 0xe1, 0x09, 0x04, 0x30, 0x07, 0x08, 0x0c, + 0x52, 0x5b, 0x09, 0x04, 0x30, 0x04, 0x20, 0x19, 0x00, 0x05, 0x79, 0x24, + 0x08, 0x0c, 0x52, 0x0a, 0x09, 0x04, 0x30, 0x04, 0x78, 0x28, 0xa0, 0x8a, + 0x10, 0x00, 0x1a, 0x04, 0x30, 0x07, 0x80, 0x03, 0x80, 0x0b, 0x81, 0x0b, + 0xa1, 0x08, 0x08, 0x0c, 0x6a, 0x1a, 0x08, 0x04, 0x2f, 0xdf, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x81, 0xff, 0x01, 0x18, 0x20, 0x09, 0x00, 0x01, + 0x04, 0x50, 0x20, 0x29, 0x00, 0xff, 0x64, 0x50, 0x24, 0x00, 0xa5, 0x06, + 0x01, 0xf8, 0x25, 0x08, 0x08, 0x0c, 0x50, 0x1b, 0x11, 0xd8, 0x08, 0x0c, + 0x52, 0x5b, 0x11, 0x28, 0x20, 0x09, 0x00, 0x02, 0x62, 0xb4, 0x25, 0x18, + 0x00, 0xc0, 0x20, 0x19, 0x00, 0x04, 0xa0, 0x0e, 0x08, 0x0c, 0x52, 0x0a, + 0x11, 0x18, 0x20, 0x09, 0x00, 0x06, 0x00, 0x78, 0x78, 0x24, 0xa0, 0x8a, + 0x10, 0x00, 0x12, 0x70, 0x80, 0x03, 0x80, 0x0b, 0x81, 0x0b, 0xa1, 0x08, + 0x08, 0x0c, 0x6a, 0x1a, 0x85, 0x29, 0x1a, 0xe0, 0x01, 0x2e, 0x08, 0x04, + 0x2f, 0xdf, 0x01, 0x2e, 0x08, 0x04, 0x30, 0x04, 0x01, 0x2e, 0x08, 0x04, + 0x30, 0x07, 0x08, 0x0c, 0x3e, 0xd1, 0x09, 0x04, 0x30, 0x07, 0x08, 0x0c, + 0x51, 0x47, 0x08, 0x0c, 0x51, 0xe3, 0x08, 0x04, 0x2f, 0xdf, 0x81, 0xff, + 0x19, 0x04, 0x30, 0x04, 0x08, 0x0c, 0x3e, 0xd1, 0x09, 0x04, 0x30, 0x07, + 0x08, 0x0c, 0x51, 0x38, 0x08, 0x0c, 0x51, 0xe3, 0x08, 0x04, 0x2f, 0xdf, + 0x81, 0xff, 0x19, 0x04, 0x30, 0x04, 0x08, 0x0c, 0x3e, 0xd1, 0x09, 0x04, + 0x30, 0x07, 0x08, 0x0c, 0x51, 0xbe, 0x09, 0x04, 0x30, 0x04, 0x08, 0x0c, + 0x4e, 0xff, 0x08, 0x0c, 0x51, 0x85, 0x08, 0x0c, 0x51, 0xe3, 0x08, 0x04, + 0x2f, 0xdf, 0x08, 0x0c, 0x3e, 0xd1, 0x09, 0x04, 0x30, 0x07, 0x08, 0x0c, + 0x50, 0xe1, 0x09, 0x04, 0x30, 0x04, 0x62, 0xa0, 0x20, 0x19, 0x00, 0x05, + 0x00, 0xc6, 0x08, 0x0c, 0x52, 0x1c, 0x20, 0x61, 0x00, 0x00, 0x08, 0x0c, + 0x6e, 0x67, 0x00, 0x76, 0x20, 0x39, 0x00, 0x00, 0x08, 0x0c, 0x6d, 0x74, + 0x20, 0x09, 0x00, 0x00, 0x08, 0x0c, 0xaf, 0x3e, 0x00, 0x7e, 0x00, 0xce, + 0x08, 0x0c, 0x51, 0xe3, 0x08, 0x04, 0x2f, 0xdf, 0x08, 0x0c, 0x3e, 0xd1, + 0x09, 0x04, 0x30, 0x07, 0x08, 0x0c, 0x51, 0xe3, 0x22, 0x08, 0x08, 0x04, + 0x2f, 0xdf, 0x01, 0x56, 0x00, 0xd6, 0x00, 0xe6, 0x20, 0x69, 0xb7, 0x14, + 0x68, 0x10, 0x69, 0x14, 0xa1, 0x0a, 0x12, 0x10, 0x20, 0x09, 0x00, 0x00, + 0x68, 0x16, 0x20, 0x11, 0x00, 0x00, 0x20, 0x19, 0x00, 0x00, 0x20, 0xa9, + 0x00, 0x7e, 0x20, 0x69, 0xb7, 0x35, 0x2d, 0x04, 0xa0, 0x75, 0x01, 0x30, + 0x70, 0x4c, 0x00, 0x71, 0xa2, 0x10, 0x70, 0x80, 0x00, 0x59, 0xa3, 0x18, + 0x8d, 0x68, 0x1f, 0x04, 0x32, 0x4d, 0x23, 0x00, 0xa2, 0x18, 0x00, 0xee, + 0x00, 0xde, 0x01, 0x5e, 0x08, 0x04, 0x2f, 0xdf, 0x00, 0xf6, 0x00, 0x16, + 0xa0, 0x7d, 0x01, 0x40, 0x20, 0x01, 0x00, 0x00, 0x80, 0x00, 0x2f, 0x0c, + 0x81, 0xff, 0x01, 0x10, 0x21, 0x78, 0x0c, 0xd0, 0x00, 0x1e, 0x00, 0xfe, + 0x00, 0x05, 0x20, 0x69, 0xb7, 0x14, 0x69, 0x10, 0x62, 0xb0, 0x08, 0x04, + 0x2f, 0xdf, 0x81, 0xff, 0x19, 0x04, 0x30, 0x04, 0x61, 0x50, 0xa1, 0x90, + 0x2d, 0xf9, 0x22, 0x15, 0xa2, 0x94, 0x00, 0xff, 0x63, 0x70, 0x83, 0xff, + 0x01, 0x08, 0x62, 0x74, 0x67, 0xd4, 0xd7, 0x9c, 0x01, 0x18, 0x20, 0x31, + 0x00, 0x01, 0x00, 0x90, 0xd7, 0xac, 0x01, 0x18, 0x20, 0x31, 0x00, 0x03, + 0x00, 0x68, 0xd7, 0xa4, 0x01, 0x18, 0x20, 0x31, 0x00, 0x02, 0x00, 0x40, + 0x08, 0x0c, 0x5b, 0x41, 0x11, 0x18, 0x20, 0x31, 0x00, 0x04, 0x00, 0x10, + 0x20, 0x31, 0x00, 0x00, 0x7e, 0x3a, 0x7f, 0x3e, 0x08, 0x04, 0x2f, 0xdf, + 0x61, 0x40, 0x62, 0x44, 0x20, 0x19, 0xb8, 0xb6, 0x23, 0x1c, 0x08, 0x04, + 0x2f, 0xdf, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x61, 0x34, 0xa0, 0x06, + 0x20, 0x10, 0x63, 0x38, 0x01, 0x2e, 0x08, 0x04, 0x2f, 0xdf, 0x08, 0x0c, + 0x3e, 0xe1, 0x09, 0x04, 0x30, 0x07, 0x62, 0x44, 0x63, 0x38, 0x08, 0x04, + 0x2f, 0xdf, 0x61, 0x40, 0x62, 0x44, 0x78, 0x24, 0x60, 0x42, 0x7b, 0x28, + 0x63, 0x46, 0x20, 0x69, 0xb6, 0x52, 0x83, 0x1f, 0xa3, 0x05, 0x68, 0x16, + 0x78, 0x2c, 0x20, 0x69, 0xb8, 0xb6, 0x2d, 0x1c, 0x20, 0x6a, 0x08, 0x04, + 0x2f, 0xdf, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x78, 0x24, 0x60, 0x36, + 0x78, 0x2c, 0x60, 0x3a, 0x01, 0x2e, 0x08, 0x04, 0x2f, 0xdf, 0x78, 0x38, + 0xa0, 0x05, 0x01, 0xa8, 0x78, 0x28, 0xa0, 0x25, 0x09, 0x04, 0x30, 0x07, + 0x78, 0x2c, 0xa0, 0x2d, 0x09, 0x04, 0x30, 0x07, 0xa0, 0x0e, 0x08, 0x0c, + 0x50, 0x1b, 0x11, 0x20, 0x62, 0x44, 0x63, 0x38, 0x64, 0x46, 0x65, 0x3a, + 0xa1, 0x86, 0x00, 0xff, 0x01, 0x90, 0x81, 0x08, 0x0c, 0xa0, 0x08, 0x0c, + 0x3e, 0xe1, 0x09, 0x04, 0x30, 0x07, 0x78, 0x28, 0xa0, 0x0d, 0x09, 0x04, + 0x30, 0x07, 0x78, 0x2c, 0xa0, 0x05, 0x09, 0x04, 0x30, 0x07, 0x62, 0x44, + 0x61, 0x46, 0x63, 0x38, 0x60, 0x3a, 0x08, 0x04, 0x2f, 0xdf, 0x20, 0x01, + 0xb6, 0x00, 0x20, 0x04, 0xa0, 0x86, 0x00, 0x03, 0x19, 0x04, 0x30, 0x04, + 0x00, 0xc6, 0x20, 0x61, 0x01, 0x00, 0x79, 0x24, 0x81, 0x0f, 0xa1, 0x8c, + 0x00, 0xff, 0xa1, 0x96, 0x00, 0xff, 0x11, 0x30, 0x20, 0x01, 0xb6, 0x15, + 0x20, 0x04, 0xa0, 0x85, 0xff, 0x00, 0x00, 0x78, 0xa1, 0x82, 0x00, 0x7f, + 0x16, 0xa0, 0xa1, 0x88, 0x2d, 0xf9, 0x21, 0x0d, 0xa1, 0x8c, 0x00, 0xff, + 0x20, 0x01, 0xb6, 0x15, 0x20, 0x04, 0xa1, 0x16, 0x05, 0x50, 0x81, 0x0f, + 0xa1, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0x06, 0x08, 0x0c, + 0x86, 0x4e, 0x00, 0x0e, 0x01, 0xe0, 0x60, 0x1a, 0x60, 0x0b, 0xbc, 0x09, + 0x60, 0x1f, 0x00, 0x01, 0x08, 0x0c, 0x3e, 0xbc, 0x01, 0xd8, 0x68, 0x37, + 0x00, 0x00, 0x70, 0x07, 0x00, 0x03, 0x68, 0x33, 0x00, 0x00, 0x68, 0x38, + 0xc0, 0xfd, 0x68, 0x3a, 0x70, 0x1b, 0x33, 0xa5, 0x2d, 0x00, 0x60, 0x12, + 0x20, 0x09, 0x00, 0x32, 0x08, 0x0c, 0x86, 0xd3, 0x01, 0x2e, 0x00, 0xce, + 0x00, 0x05, 0x01, 0x2e, 0x00, 0xce, 0x08, 0x04, 0x30, 0x04, 0x00, 0xce, + 0x08, 0x04, 0x30, 0x07, 0x08, 0x0c, 0x86, 0xa4, 0x0c, 0xb0, 0x20, 0x01, + 0xb6, 0x00, 0x20, 0x04, 0xa0, 0x86, 0x00, 0x03, 0x19, 0x04, 0x30, 0x04, + 0x00, 0xc6, 0x20, 0x61, 0x01, 0x00, 0x79, 0x24, 0x81, 0x0f, 0xa1, 0x8c, + 0x00, 0xff, 0xa1, 0x96, 0x00, 0xff, 0x11, 0x30, 0x20, 0x01, 0xb6, 0x15, + 0x20, 0x04, 0xa0, 0x85, 0xff, 0x00, 0x00, 0x78, 0xa1, 0x82, 0x00, 0x7f, + 0x16, 0xa0, 0xa1, 0x88, 0x2d, 0xf9, 0x21, 0x0d, 0xa1, 0x8c, 0x00, 0xff, + 0x20, 0x01, 0xb6, 0x15, 0x20, 0x04, 0xa1, 0x16, 0x05, 0x50, 0x81, 0x0f, + 0xa1, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0x06, 0x08, 0x0c, + 0x86, 0x4e, 0x00, 0x0e, 0x01, 0xe0, 0x60, 0x1a, 0x60, 0x0b, 0xbc, 0x05, + 0x60, 0x1f, 0x00, 0x01, 0x08, 0x0c, 0x3e, 0xbc, 0x01, 0xd8, 0x68, 0x37, + 0x00, 0x00, 0x70, 0x07, 0x00, 0x03, 0x68, 0x33, 0x00, 0x00, 0x68, 0x38, + 0xc0, 0xfd, 0x68, 0x3a, 0x70, 0x1b, 0x33, 0xa5, 0x2d, 0x00, 0x60, 0x12, + 0x20, 0x09, 0x00, 0x32, 0x08, 0x0c, 0x86, 0xd3, 0x01, 0x2e, 0x00, 0xce, + 0x00, 0x05, 0x01, 0x2e, 0x00, 0xce, 0x08, 0x04, 0x30, 0x04, 0x00, 0xce, + 0x08, 0x04, 0x30, 0x07, 0x08, 0x0c, 0x86, 0xa4, 0x0c, 0xb0, 0x68, 0x30, + 0xa0, 0x86, 0x01, 0x00, 0x09, 0x04, 0x30, 0x04, 0x08, 0x04, 0x2f, 0xdf, + 0x20, 0x61, 0xb9, 0x75, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x60, 0x00, + 0xd0, 0x84, 0x01, 0x78, 0x61, 0x04, 0x62, 0x08, 0x2a, 0x60, 0x60, 0x68, + 0x78, 0x3a, 0x60, 0xb4, 0x78, 0x3e, 0x60, 0xb0, 0x20, 0x19, 0x00, 0x72, + 0x20, 0x1a, 0x63, 0x48, 0x01, 0x2e, 0x08, 0x04, 0x2f, 0xdf, 0xa0, 0x0e, + 0x21, 0x10, 0x0c, 0x80, 0x81, 0xff, 0x19, 0x04, 0x30, 0x04, 0x08, 0x0c, + 0x5b, 0x41, 0x09, 0x04, 0x30, 0x04, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x62, 0x48, 0x60, 0x68, 0xa2, 0x02, 0x02, 0x48, 0xa0, 0x85, 0x00, 0x01, + 0x08, 0x0c, 0x28, 0x9c, 0x08, 0x0c, 0x46, 0x73, 0x01, 0x2e, 0x08, 0x04, + 0x2f, 0xdf, 0x01, 0x2e, 0x08, 0x04, 0x30, 0x07, 0x00, 0x06, 0x00, 0x16, + 0x00, 0xc6, 0x00, 0xe6, 0x20, 0x01, 0xb8, 0xc0, 0x20, 0x70, 0x20, 0x61, + 0xb6, 0x52, 0x60, 0x08, 0x20, 0x72, 0x20, 0x09, 0x00, 0x00, 0x20, 0x11, + 0x10, 0x00, 0x08, 0x0c, 0x6b, 0xb2, 0x72, 0x06, 0x00, 0xee, 0x00, 0xce, + 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x78, 0x24, 0xa0, 0x84, 0x00, 0x07, 0x00, 0x02, 0x34, 0x09, 0x34, 0x12, + 0x34, 0x19, 0x34, 0x06, 0x34, 0x06, 0x34, 0x06, 0x34, 0x06, 0x34, 0x06, + 0x01, 0x2e, 0x08, 0x04, 0x30, 0x07, 0x20, 0x09, 0x01, 0x14, 0x21, 0x04, + 0xa0, 0x85, 0x08, 0x00, 0x20, 0x0a, 0x08, 0x0c, 0x35, 0x84, 0x00, 0x70, + 0x20, 0x09, 0x01, 0x0b, 0x20, 0x0b, 0x00, 0x10, 0x08, 0x0c, 0x35, 0x84, + 0x00, 0x38, 0x81, 0xff, 0x01, 0x28, 0x01, 0x2e, 0x20, 0x21, 0x40, 0x0b, + 0x08, 0x04, 0x2f, 0xe1, 0x00, 0x86, 0x00, 0x96, 0x00, 0xa6, 0x00, 0xb6, + 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x00, 0xf6, 0x08, 0x0c, 0x33, 0xe0, + 0x20, 0x09, 0x01, 0x01, 0x21, 0x0c, 0x00, 0x16, 0x20, 0x01, 0x01, 0x38, + 0x20, 0x0c, 0x20, 0x03, 0x00, 0x01, 0x00, 0x16, 0x20, 0x01, 0x00, 0x7a, + 0x20, 0x34, 0x20, 0x01, 0x00, 0x7b, 0x20, 0x2c, 0xa0, 0x06, 0x20, 0x48, + 0x20, 0x50, 0x20, 0x58, 0x08, 0x0c, 0x37, 0xcf, 0x08, 0x0c, 0x37, 0x33, + 0xa0, 0x3e, 0x27, 0x20, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xc6, 0x2d, 0x60, + 0x20, 0x71, 0xb9, 0x4b, 0x20, 0x79, 0x00, 0x20, 0x00, 0xd6, 0x20, 0x69, + 0x00, 0x00, 0x68, 0x24, 0xd0, 0xb4, 0x01, 0x40, 0x20, 0x01, 0x00, 0x7d, + 0x20, 0x04, 0x78, 0x3e, 0x20, 0x01, 0x00, 0x7c, 0x20, 0x04, 0x78, 0x3a, + 0x00, 0xde, 0x20, 0x11, 0x00, 0x01, 0x08, 0x0c, 0x36, 0xdf, 0x08, 0x0c, + 0x36, 0xdf, 0x00, 0xce, 0x00, 0xee, 0x00, 0xfe, 0x08, 0x0c, 0x36, 0x2a, + 0x08, 0x0c, 0x37, 0x07, 0x08, 0x0c, 0x36, 0x84, 0x08, 0x0c, 0x35, 0xe9, + 0x08, 0x0c, 0x36, 0x1a, 0x00, 0xf6, 0x20, 0x79, 0x01, 0x00, 0x78, 0x24, + 0xd0, 0x94, 0x05, 0x30, 0x78, 0x14, 0xa0, 0x84, 0x01, 0x84, 0xa0, 0x85, + 0x00, 0x10, 0x78, 0x16, 0x20, 0x79, 0x01, 0x40, 0x08, 0x0c, 0x35, 0x62, + 0x11, 0x10, 0x00, 0xfe, 0x04, 0x30, 0x78, 0x04, 0xd0, 0xdc, 0x0d, 0xc0, + 0x20, 0x79, 0x01, 0x00, 0x78, 0x27, 0x00, 0x86, 0x78, 0x14, 0xa0, 0x84, + 0x01, 0x84, 0xa0, 0x85, 0x00, 0x32, 0x78, 0x16, 0x08, 0x0c, 0x35, 0x62, + 0x11, 0x10, 0x00, 0xfe, 0x00, 0xa0, 0x78, 0x24, 0xd0, 0xbc, 0x0d, 0xc0, + 0x78, 0x27, 0x00, 0x80, 0xa0, 0x26, 0x7c, 0x16, 0x78, 0x24, 0xd0, 0xac, + 0x01, 0x30, 0x8b, 0x58, 0x08, 0x0c, 0x35, 0x6c, 0x00, 0xfe, 0x08, 0x04, + 0x35, 0x2c, 0x00, 0xfe, 0x08, 0x0c, 0x35, 0x62, 0x11, 0x50, 0x89, 0x48, + 0x20, 0x01, 0x00, 0x7a, 0x26, 0x02, 0x20, 0x01, 0x00, 0x7b, 0x25, 0x02, + 0x08, 0x0c, 0x35, 0x6c, 0x00, 0x88, 0x87, 0xff, 0x01, 0x40, 0x20, 0x01, + 0x02, 0x01, 0x20, 0x04, 0xa0, 0x05, 0x19, 0x04, 0x34, 0x66, 0x87, 0x39, + 0x00, 0x38, 0x20, 0x01, 0xb9, 0x24, 0x20, 0x04, 0xa0, 0x86, 0x00, 0x00, + 0x19, 0x04, 0x34, 0x66, 0x20, 0x01, 0x00, 0x33, 0x20, 0x03, 0x00, 0xf6, + 0x86, 0x31, 0x12, 0x08, 0x85, 0x29, 0x25, 0x00, 0xa6, 0x05, 0x09, 0x04, + 0x35, 0x2c, 0x78, 0x24, 0xd0, 0xbc, 0x01, 0x28, 0x29, 0x00, 0xaa, 0x05, + 0xab, 0x05, 0x19, 0x04, 0x35, 0x2c, 0x60, 0x33, 0x00, 0x0d, 0x20, 0x01, + 0x00, 0x30, 0x20, 0x03, 0x00, 0x04, 0x78, 0x24, 0xd0, 0xac, 0x11, 0x48, + 0x20, 0x01, 0xb9, 0x24, 0x20, 0x03, 0x00, 0x03, 0x20, 0x01, 0x00, 0x30, + 0x20, 0x03, 0x00, 0x09, 0x00, 0x40, 0x60, 0x27, 0x00, 0x01, 0x20, 0x01, + 0x00, 0x75, 0x20, 0x04, 0xa0, 0x05, 0x01, 0x08, 0x60, 0x26, 0x2c, 0x00, + 0x60, 0x1a, 0x20, 0xe1, 0x90, 0x40, 0x2d, 0x00, 0x68, 0x1a, 0x68, 0x33, + 0x00, 0x0d, 0x78, 0x24, 0xd0, 0xa4, 0x11, 0x80, 0x68, 0x27, 0x00, 0x00, + 0x00, 0xc6, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x61, 0x00, 0x20, 0x60, 0x03, + 0x00, 0x08, 0x20, 0x01, 0x02, 0x03, 0x20, 0x04, 0x1f, 0x04, 0x35, 0x01, + 0x00, 0xce, 0x00, 0x40, 0x68, 0x27, 0x00, 0x01, 0x20, 0x01, 0x00, 0x74, + 0x20, 0x04, 0xa0, 0x05, 0x01, 0x08, 0x68, 0x26, 0x00, 0xf6, 0x00, 0xc6, + 0x20, 0x79, 0x01, 0x00, 0x20, 0x61, 0x00, 0x20, 0x78, 0x27, 0x00, 0x02, + 0x20, 0x01, 0x00, 0x72, 0x20, 0x04, 0xa0, 0x84, 0xff, 0xf8, 0x60, 0x1a, + 0x00, 0x06, 0x20, 0x01, 0x00, 0x73, 0x20, 0x04, 0x60, 0x1e, 0x78, 0xc6, + 0x00, 0x0e, 0x78, 0xca, 0x00, 0xce, 0x00, 0xfe, 0x08, 0x04, 0x34, 0x44, + 0x20, 0x61, 0x01, 0x00, 0x60, 0x27, 0x00, 0x02, 0x00, 0x1e, 0x61, 0xe2, + 0x00, 0x1e, 0x61, 0x06, 0x78, 0x24, 0xa0, 0x84, 0x00, 0x03, 0xa0, 0x86, + 0x00, 0x02, 0x01, 0x88, 0x20, 0xe1, 0x90, 0x28, 0x60, 0x50, 0xa0, 0x84, + 0xf7, 0xef, 0x60, 0x52, 0x60, 0x2f, 0x00, 0x00, 0x60, 0x2c, 0xc0, 0xac, + 0x60, 0x2e, 0x60, 0x4b, 0xf7, 0xf7, 0x60, 0x43, 0x00, 0x90, 0x60, 0x43, + 0x00, 0x10, 0x29, 0x08, 0x2a, 0x10, 0x2b, 0x18, 0x2b, 0x00, 0xaa, 0x05, + 0xa9, 0x05, 0x00, 0xfe, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x00, 0xbe, + 0x00, 0xae, 0x00, 0x9e, 0x00, 0x8e, 0x11, 0x18, 0x01, 0x2e, 0x08, 0x04, + 0x2f, 0xdf, 0x01, 0x2e, 0x20, 0x21, 0x40, 0x0c, 0x08, 0x04, 0x2f, 0xe1, + 0xa0, 0x85, 0x00, 0x01, 0x1d, 0x04, 0x35, 0x6b, 0x20, 0x91, 0x60, 0x00, + 0x84, 0x20, 0xa4, 0x86, 0x00, 0x64, 0x00, 0x05, 0x20, 0x01, 0x01, 0x05, + 0x20, 0x03, 0x00, 0x10, 0x20, 0x01, 0x00, 0x30, 0x20, 0x03, 0x00, 0x04, + 0x20, 0x01, 0x00, 0x20, 0x20, 0x03, 0x00, 0x04, 0x20, 0x01, 0xb9, 0x24, + 0x20, 0x03, 0x00, 0x00, 0x20, 0x01, 0xb9, 0x4b, 0x20, 0x03, 0x00, 0x00, + 0x20, 0xe1, 0xf0, 0x00, 0xa0, 0x26, 0x00, 0x05, 0x00, 0xf6, 0x20, 0x79, + 0x01, 0x00, 0x20, 0x01, 0xb6, 0x15, 0x20, 0x0c, 0x79, 0x32, 0x79, 0x36, + 0x08, 0x0c, 0x28, 0x7c, 0x78, 0x50, 0xa0, 0x84, 0x09, 0x80, 0xa0, 0x85, + 0x00, 0x30, 0x78, 0x52, 0x20, 0x19, 0x01, 0xf4, 0x83, 0x19, 0x1d, 0xf0, + 0xa0, 0x84, 0x09, 0x80, 0x78, 0x52, 0x78, 0x2c, 0xc0, 0xad, 0x78, 0x2e, + 0x20, 0xa9, 0x00, 0x46, 0x1d, 0x04, 0x35, 0xa0, 0x20, 0x91, 0x60, 0x00, + 0x1f, 0x04, 0x35, 0xa0, 0x78, 0x50, 0xa0, 0x85, 0x04, 0x00, 0x78, 0x52, + 0x20, 0x01, 0x00, 0x09, 0x20, 0x04, 0xa0, 0x84, 0x00, 0x03, 0xa0, 0x86, + 0x00, 0x01, 0x11, 0x18, 0x78, 0x2c, 0xc0, 0xac, 0x78, 0x2e, 0x78, 0x4b, + 0xf7, 0xf7, 0x78, 0x43, 0x00, 0x90, 0x78, 0x43, 0x00, 0x10, 0x20, 0xa9, + 0x00, 0x0e, 0xe0, 0x00, 0x1f, 0x04, 0x35, 0xbd, 0x78, 0x50, 0xa0, 0x85, + 0x14, 0x00, 0x78, 0x52, 0x20, 0x19, 0x61, 0xa8, 0x78, 0x54, 0xe0, 0x00, + 0xe0, 0x00, 0xd0, 0x8c, 0x11, 0x10, 0x83, 0x19, 0x1d, 0xc8, 0x78, 0x27, + 0x00, 0x48, 0x78, 0x50, 0xa0, 0x85, 0x04, 0x00, 0x78, 0x52, 0x78, 0x43, + 0x00, 0x40, 0x20, 0x19, 0x01, 0xf4, 0xe0, 0x00, 0xe0, 0x00, 0x83, 0x19, + 0x1d, 0xe0, 0x20, 0x01, 0x01, 0x40, 0x20, 0x03, 0x01, 0x00, 0x78, 0x27, + 0x00, 0x20, 0x78, 0x43, 0x00, 0x00, 0x20, 0x03, 0x00, 0x00, 0x78, 0x27, + 0x00, 0x48, 0x00, 0xfe, 0x00, 0x05, 0x78, 0x24, 0xd0, 0xac, 0x11, 0xc8, + 0x00, 0xf6, 0x00, 0xe6, 0x20, 0x71, 0xb9, 0x24, 0x20, 0x79, 0x00, 0x30, + 0x20, 0x01, 0x02, 0x01, 0x20, 0x04, 0xa0, 0x05, 0x01, 0x60, 0x70, 0x00, + 0xa0, 0x86, 0x00, 0x00, 0x11, 0x40, 0x00, 0x51, 0xd0, 0xbc, 0x01, 0x08, + 0x87, 0x38, 0x70, 0x03, 0x00, 0x03, 0x78, 0x03, 0x00, 0x19, 0x00, 0xee, + 0x00, 0xfe, 0x00, 0x05, 0x78, 0x0c, 0xa0, 0x8c, 0x00, 0x70, 0x01, 0x78, + 0x20, 0x09, 0x00, 0x7a, 0x26, 0x0a, 0x20, 0x09, 0x00, 0x7b, 0x25, 0x0a, + 0xd0, 0xb4, 0x01, 0x08, 0x8a, 0x50, 0xd0, 0xac, 0x01, 0x08, 0x89, 0x48, + 0xd0, 0xa4, 0x01, 0x08, 0x8b, 0x58, 0x00, 0x05, 0x00, 0xf6, 0x20, 0x79, + 0x02, 0x00, 0x78, 0x1c, 0xd0, 0x84, 0x01, 0x40, 0x20, 0xe1, 0x00, 0x07, + 0x20, 0xe1, 0x20, 0x00, 0x20, 0x01, 0x02, 0x0a, 0x20, 0x04, 0x0c, 0xa8, + 0x00, 0xfe, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0x01, 0x00, 0x20, 0x01, + 0xb8, 0xc1, 0x20, 0x04, 0x70, 0xe2, 0x20, 0x09, 0xb6, 0x15, 0x21, 0x0c, + 0x71, 0x6e, 0x70, 0x63, 0x01, 0x00, 0x71, 0x66, 0x71, 0x9e, 0x70, 0x6b, + 0x00, 0x00, 0x70, 0x73, 0x08, 0x09, 0x70, 0x77, 0x00, 0x08, 0x70, 0x78, + 0xa0, 0x80, 0x01, 0x00, 0x70, 0x7a, 0x70, 0x80, 0x80, 0x00, 0x70, 0x82, + 0x70, 0x87, 0xaa, 0xaa, 0xa0, 0x06, 0x70, 0x8a, 0x70, 0x8e, 0x70, 0x7e, + 0x70, 0xd6, 0x70, 0xab, 0x00, 0x36, 0x70, 0xaf, 0x95, 0xd5, 0x70, 0x27, + 0x00, 0x80, 0x70, 0x14, 0xa0, 0x84, 0x01, 0x84, 0xa0, 0x85, 0x00, 0x32, + 0x70, 0x16, 0x08, 0x0c, 0x37, 0x07, 0x08, 0x0c, 0x35, 0x62, 0x11, 0x10, + 0x84, 0x21, 0x00, 0x28, 0x70, 0x24, 0xd0, 0xbc, 0x0d, 0xb0, 0x70, 0x27, + 0x00, 0x80, 0x00, 0xf6, 0x00, 0xe6, 0x20, 0x71, 0xb9, 0x24, 0x20, 0x79, + 0x00, 0x30, 0x00, 0xd6, 0x20, 0x69, 0x00, 0x00, 0x68, 0x24, 0xd0, 0xb4, + 0x01, 0x20, 0x68, 0x3c, 0x78, 0x3e, 0x68, 0x38, 0x78, 0x3a, 0x00, 0xde, + 0x20, 0x11, 0x00, 0x11, 0x08, 0x0c, 0x36, 0xdf, 0x20, 0x11, 0x00, 0x01, + 0x08, 0x0c, 0x36, 0xdf, 0x00, 0xee, 0x00, 0xfe, 0x70, 0x17, 0x00, 0x00, + 0x00, 0xee, 0x00, 0x05, 0x00, 0xf6, 0x00, 0xe6, 0x20, 0x71, 0xb9, 0x24, + 0x20, 0x79, 0x00, 0x30, 0x79, 0x04, 0xd1, 0xfc, 0x09, 0x04, 0x36, 0xdc, + 0x78, 0x03, 0x00, 0x02, 0xa0, 0x26, 0xd1, 0x9c, 0x19, 0x04, 0x36, 0xd8, + 0x70, 0x00, 0x00, 0x02, 0x36, 0xdc, 0x36, 0x9a, 0x36, 0xbe, 0x36, 0xd8, + 0xd1, 0xbc, 0x11, 0x50, 0xd1, 0xdc, 0x11, 0x50, 0x80, 0x01, 0x70, 0x02, + 0x20, 0x11, 0x00, 0x01, 0x04, 0xe1, 0x05, 0xc0, 0x04, 0xd1, 0x04, 0xb0, + 0x78, 0x0f, 0x00, 0x00, 0x78, 0x20, 0x79, 0x24, 0x78, 0x03, 0x00, 0x04, + 0x78, 0x22, 0x79, 0x26, 0x20, 0x01, 0x02, 0x01, 0x20, 0x0c, 0x81, 0xff, + 0x0d, 0xe8, 0x08, 0x0c, 0x36, 0x06, 0x20, 0x09, 0x00, 0x01, 0x78, 0x08, + 0xd0, 0xec, 0x01, 0x10, 0x20, 0x09, 0x00, 0x11, 0x79, 0x02, 0x00, 0xf0, + 0x80, 0x01, 0x70, 0x02, 0xa1, 0x84, 0x08, 0x80, 0x11, 0x38, 0x78, 0x04, + 0xd0, 0xfc, 0x19, 0x40, 0x20, 0x11, 0x00, 0x01, 0x00, 0xb1, 0x00, 0x90, + 0x60, 0x30, 0xa0, 0x92, 0x00, 0x04, 0xa0, 0x86, 0x00, 0x09, 0x11, 0x20, + 0x60, 0x00, 0x60, 0x1a, 0x20, 0x11, 0x00, 0x25, 0x62, 0x32, 0xd1, 0xdc, + 0x19, 0x88, 0x08, 0x70, 0x78, 0x03, 0x00, 0x04, 0x70, 0x03, 0x00, 0x00, + 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, 0x60, 0x24, 0xa0, 0x05, 0x05, 0x20, + 0x80, 0x01, 0x60, 0x26, 0x60, 0x18, 0x61, 0x30, 0xa1, 0x40, 0x28, 0x04, + 0x78, 0x32, 0x88, 0x40, 0x28, 0x04, 0x78, 0x36, 0x88, 0x40, 0x28, 0x04, + 0x78, 0x22, 0x88, 0x40, 0x28, 0x04, 0x78, 0x26, 0x88, 0x40, 0x7a, 0x02, + 0x70, 0x00, 0x80, 0x00, 0x70, 0x02, 0x60, 0x18, 0xa8, 0x02, 0xa0, 0x8a, + 0x00, 0x29, 0x11, 0x38, 0x60, 0x18, 0xa0, 0x80, 0x00, 0x01, 0x20, 0x04, + 0x60, 0x1a, 0x20, 0x01, 0x00, 0x0d, 0x60, 0x32, 0xa0, 0x85, 0x00, 0x01, + 0x00, 0x05, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xc6, 0x20, 0x71, 0xb9, 0x4b, + 0x20, 0x79, 0x00, 0x20, 0x79, 0x04, 0xd1, 0xfc, 0x01, 0xf0, 0x78, 0x03, + 0x00, 0x02, 0x2d, 0x60, 0xa0, 0x26, 0x70, 0x00, 0x00, 0x02, 0x37, 0x2f, + 0x37, 0x1a, 0x37, 0x26, 0x80, 0x01, 0x70, 0x02, 0xd1, 0x9c, 0x11, 0x88, + 0x20, 0x11, 0x00, 0x01, 0x08, 0x0c, 0x36, 0xdf, 0x01, 0x60, 0x08, 0x0c, + 0x36, 0xdf, 0x00, 0x48, 0x80, 0x01, 0x70, 0x02, 0x78, 0x04, 0xd0, 0xfc, + 0x1d, 0x30, 0x20, 0x11, 0x00, 0x01, 0x08, 0x0c, 0x36, 0xdf, 0x00, 0xce, + 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xc6, + 0x20, 0x61, 0x02, 0x00, 0x20, 0x01, 0xb8, 0xc1, 0x20, 0x04, 0x60, 0x1a, + 0x20, 0x61, 0x01, 0x00, 0x20, 0x01, 0xb8, 0xc0, 0x20, 0x04, 0x60, 0xce, + 0x60, 0x04, 0xc0, 0xac, 0xa0, 0x85, 0x02, 0x00, 0x60, 0x06, 0x20, 0x01, + 0x00, 0x74, 0x20, 0x04, 0xa0, 0x05, 0x01, 0xf8, 0x20, 0x38, 0x20, 0x01, + 0x00, 0x76, 0x20, 0x24, 0x20, 0x01, 0x00, 0x77, 0x20, 0x1c, 0x08, 0x0c, + 0x3e, 0xbc, 0x68, 0x33, 0x00, 0x0d, 0x6f, 0x26, 0x2d, 0x00, 0x68, 0x1a, + 0xa7, 0x8a, 0x00, 0x07, 0x02, 0x20, 0x21, 0x38, 0x20, 0x09, 0x00, 0x07, + 0x00, 0x10, 0x27, 0x08, 0xa0, 0x3e, 0x68, 0x18, 0xa0, 0x80, 0x00, 0x0d, + 0x04, 0xb1, 0x1d, 0x90, 0x2d, 0x00, 0x68, 0x1a, 0x00, 0x88, 0x08, 0x0c, + 0x3e, 0xbc, 0x68, 0x33, 0x00, 0x0d, 0x20, 0x70, 0x68, 0x27, 0x00, 0x01, + 0x2d, 0x00, 0x68, 0x1a, 0x20, 0x01, 0x00, 0x76, 0x20, 0x04, 0x20, 0x72, + 0x20, 0x01, 0x00, 0x77, 0x20, 0x04, 0x70, 0x06, 0x20, 0x61, 0x00, 0x20, + 0x20, 0x79, 0x01, 0x00, 0x20, 0x01, 0xb8, 0xc0, 0x20, 0x04, 0x60, 0x12, + 0x20, 0xe1, 0x90, 0x40, 0x20, 0x01, 0x00, 0x72, 0x20, 0x04, 0xa0, 0x84, + 0xff, 0xf8, 0x70, 0x0a, 0x60, 0x1a, 0x00, 0x06, 0x20, 0x01, 0x00, 0x73, + 0x20, 0x04, 0x70, 0x0e, 0x60, 0x1e, 0x78, 0xc6, 0x00, 0x0e, 0x78, 0xca, + 0xa0, 0x06, 0x60, 0x3a, 0x60, 0x3e, 0x00, 0xce, 0x00, 0xee, 0x00, 0xfe, + 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0x00, 0x10, 0x20, 0xa0, 0x20, 0x99, + 0x00, 0x14, 0x70, 0x03, 0x00, 0x26, 0x74, 0x32, 0x73, 0x36, 0xa0, 0x06, + 0x70, 0x3a, 0x70, 0x3e, 0x81, 0x0b, 0x81, 0x0b, 0x21, 0xa8, 0x81, 0x0b, + 0x71, 0x22, 0x70, 0x03, 0x00, 0x41, 0x70, 0x04, 0xd0, 0xfc, 0x0d, 0xe8, + 0x70, 0x03, 0x00, 0x02, 0x70, 0x03, 0x00, 0x40, 0x53, 0xa5, 0x74, 0x30, + 0x73, 0x34, 0x87, 0xff, 0x01, 0x80, 0x00, 0xc6, 0x00, 0xd6, 0x2d, 0x60, + 0x00, 0xc6, 0x08, 0x0c, 0x3e, 0xbc, 0x00, 0xce, 0x60, 0x18, 0x20, 0x70, + 0x2d, 0x00, 0x70, 0x06, 0x60, 0x1a, 0x00, 0xde, 0x00, 0xce, 0xa0, 0x85, + 0x00, 0x01, 0x00, 0xee, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x01, 0x00, 0x75, + 0x20, 0x04, 0xa0, 0x05, 0x05, 0x08, 0x20, 0x38, 0x20, 0x01, 0x00, 0x78, + 0x20, 0x24, 0x20, 0x01, 0x00, 0x79, 0x20, 0x1c, 0x08, 0x0c, 0x3e, 0xbc, + 0x2d, 0x60, 0x68, 0x33, 0x00, 0x0d, 0x6f, 0x26, 0x2d, 0x00, 0x68, 0x1a, + 0xa7, 0x8a, 0x00, 0x07, 0x02, 0x20, 0x21, 0x38, 0x20, 0x09, 0x00, 0x07, + 0x00, 0x10, 0x27, 0x08, 0xa0, 0x3e, 0x68, 0x18, 0xa0, 0x80, 0x00, 0x0d, + 0x08, 0x0c, 0x37, 0x9d, 0x1d, 0x88, 0x2d, 0x00, 0x68, 0x1a, 0x00, 0xe0, + 0x08, 0x0c, 0x3e, 0xbc, 0x2d, 0x60, 0x60, 0x33, 0x00, 0x0d, 0x20, 0x70, + 0x60, 0x27, 0x00, 0x01, 0x2c, 0x00, 0x60, 0x1a, 0x20, 0x01, 0x00, 0x78, + 0x20, 0x04, 0x20, 0x72, 0x20, 0x01, 0x00, 0x79, 0x20, 0x04, 0x70, 0x06, + 0x20, 0x01, 0x00, 0x72, 0x20, 0x04, 0xa0, 0x84, 0xff, 0xf8, 0x70, 0x0a, + 0x20, 0x01, 0x00, 0x73, 0x20, 0x04, 0x70, 0x0e, 0x20, 0x01, 0x00, 0x30, + 0x20, 0x03, 0x00, 0x04, 0x78, 0x24, 0xd0, 0xac, 0x11, 0x78, 0x20, 0x01, + 0x01, 0x01, 0x20, 0x0c, 0xc1, 0xed, 0x21, 0x02, 0x60, 0x27, 0x00, 0x00, + 0x20, 0x01, 0xb9, 0x24, 0x20, 0x03, 0x00, 0x03, 0x20, 0x01, 0x00, 0x30, + 0x20, 0x03, 0x00, 0x09, 0x00, 0xee, 0x00, 0x05, 0x08, 0x04, 0x2f, 0xdf, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0xa9, 0x00, 0x12, 0x20, 0x01, + 0xb6, 0x40, 0x20, 0xa0, 0xa0, 0x06, 0x40, 0xa4, 0x01, 0x2e, 0x08, 0x04, + 0x2f, 0xdf, 0x7d, 0x38, 0x7c, 0x3c, 0x08, 0x04, 0x30, 0x86, 0x08, 0x0c, + 0x3e, 0xbc, 0x09, 0x04, 0x30, 0x04, 0x08, 0x0c, 0x5b, 0x41, 0x01, 0x10, + 0x08, 0x0c, 0x4c, 0x52, 0x20, 0x09, 0x00, 0x1c, 0x7a, 0x2c, 0x7b, 0x28, + 0x7c, 0x3c, 0x7d, 0x38, 0x08, 0x0c, 0x3e, 0xfd, 0x70, 0x1b, 0x38, 0x51, + 0x00, 0x05, 0xad, 0xe8, 0x00, 0x0d, 0x68, 0x00, 0xa0, 0x05, 0x09, 0x04, + 0x30, 0x07, 0x68, 0x04, 0xd0, 0xac, 0x01, 0x18, 0xd0, 0xa4, 0x09, 0x04, + 0x30, 0x07, 0xd0, 0x94, 0x00, 0xc6, 0x20, 0x61, 0x01, 0x00, 0x61, 0x04, + 0x01, 0x38, 0x62, 0x00, 0xa2, 0x92, 0x00, 0x05, 0x02, 0x18, 0xa1, 0x8c, + 0xff, 0xdf, 0x00, 0x10, 0xa1, 0x8d, 0x00, 0x20, 0x61, 0x06, 0x00, 0xce, + 0xd0, 0x8c, 0x00, 0xc6, 0x20, 0x61, 0x01, 0x00, 0x61, 0x04, 0x01, 0x18, + 0xa1, 0x8d, 0x00, 0x10, 0x00, 0x10, 0xa1, 0x8c, 0xff, 0xef, 0x61, 0x06, + 0x00, 0xce, 0x20, 0x09, 0x01, 0x00, 0x21, 0x0c, 0xa1, 0x8a, 0x00, 0x02, + 0x02, 0x68, 0xd0, 0x84, 0x01, 0x58, 0x6a, 0x28, 0xa2, 0x8a, 0x00, 0x7f, + 0x1a, 0x04, 0x30, 0x07, 0xa2, 0x88, 0x2d, 0xf9, 0x21, 0x0d, 0xa1, 0x8c, + 0x00, 0xff, 0x61, 0x5a, 0xd0, 0xdc, 0x01, 0x30, 0x68, 0x28, 0xa0, 0x8a, + 0x00, 0x7f, 0x1a, 0x04, 0x30, 0x07, 0x60, 0x52, 0x68, 0x08, 0xa0, 0x8a, + 0x01, 0x00, 0x0a, 0x04, 0x30, 0x07, 0xa0, 0x8a, 0x08, 0x41, 0x1a, 0x04, + 0x30, 0x07, 0xa0, 0x84, 0x00, 0x07, 0x19, 0x04, 0x30, 0x07, 0x68, 0x0c, + 0xa0, 0x05, 0x09, 0x04, 0x30, 0x07, 0x68, 0x10, 0xa0, 0x05, 0x09, 0x04, + 0x30, 0x07, 0x68, 0x48, 0x69, 0x40, 0xa1, 0x0a, 0x1a, 0x04, 0x30, 0x07, + 0x80, 0x01, 0x09, 0x04, 0x30, 0x07, 0x68, 0x4c, 0x69, 0x44, 0xa1, 0x0a, + 0x1a, 0x04, 0x30, 0x07, 0x80, 0x01, 0x09, 0x04, 0x30, 0x07, 0x68, 0x04, + 0xd0, 0xfc, 0x05, 0x60, 0x08, 0x0c, 0x3e, 0xbc, 0x09, 0x04, 0x30, 0x04, + 0x20, 0x09, 0x00, 0x14, 0x7a, 0x2c, 0x7b, 0x28, 0x7c, 0x3c, 0x7d, 0x38, + 0xa2, 0x90, 0x00, 0x38, 0xa3, 0x99, 0x00, 0x00, 0x08, 0x0c, 0x3e, 0xfd, + 0x70, 0x1b, 0x38, 0xd1, 0x00, 0x05, 0xad, 0xe8, 0x00, 0x0d, 0x20, 0xa9, + 0x00, 0x14, 0x2d, 0x98, 0x20, 0x69, 0xb6, 0x6e, 0x2d, 0xa0, 0x53, 0xa3, + 0x70, 0x10, 0xa0, 0xe8, 0x00, 0x0d, 0x20, 0x01, 0xb6, 0x72, 0x20, 0x0c, + 0xd1, 0xe4, 0x01, 0x40, 0x00, 0xc6, 0x20, 0x61, 0x01, 0x00, 0x60, 0x04, + 0xa0, 0x85, 0x0b, 0x00, 0x60, 0x06, 0x00, 0xce, 0x20, 0x09, 0xb8, 0xb1, + 0x20, 0x0b, 0x00, 0x00, 0x20, 0x01, 0xb6, 0x74, 0x20, 0x04, 0xd0, 0xac, + 0x01, 0x58, 0x78, 0x24, 0x20, 0x0a, 0x20, 0x09, 0x01, 0x7f, 0x20, 0x0a, + 0x32, 0x00, 0xa0, 0x84, 0x00, 0x3f, 0xa0, 0x85, 0x30, 0x20, 0x20, 0x90, + 0x20, 0xa9, 0x00, 0x1c, 0x2d, 0x98, 0x20, 0x69, 0xb6, 0x52, 0x2d, 0xa0, + 0x53, 0xa3, 0x68, 0x14, 0xa0, 0x8c, 0x00, 0xff, 0x61, 0x42, 0x80, 0x07, + 0xa0, 0x84, 0x00, 0xff, 0x60, 0x46, 0x08, 0x0c, 0x5e, 0x17, 0x08, 0x0c, + 0x53, 0xde, 0x08, 0x0c, 0x54, 0x47, 0x60, 0x00, 0xa0, 0x86, 0x00, 0x00, + 0x19, 0x04, 0x39, 0xcc, 0x68, 0x08, 0x60, 0x2a, 0x08, 0x0c, 0x24, 0xa5, + 0x00, 0x06, 0x20, 0x01, 0x01, 0x00, 0x20, 0x04, 0xa0, 0x82, 0x00, 0x05, + 0x00, 0x0e, 0x02, 0x68, 0x20, 0x09, 0x01, 0x70, 0x20, 0x0b, 0x00, 0x80, + 0xe0, 0x00, 0xe0, 0x00, 0x20, 0x0b, 0x00, 0x00, 0x00, 0x36, 0x6b, 0x08, + 0x08, 0x0c, 0x28, 0xd7, 0x00, 0x3e, 0x68, 0x18, 0x69, 0x1c, 0x6a, 0x20, + 0x6b, 0x24, 0x80, 0x07, 0x81, 0x0f, 0x82, 0x17, 0x83, 0x1f, 0x60, 0x16, + 0x61, 0x1a, 0x62, 0x1e, 0x63, 0x22, 0x6c, 0x04, 0xd4, 0xf4, 0x01, 0x48, + 0x68, 0x30, 0x69, 0x34, 0x6a, 0x38, 0x6b, 0x3c, 0x80, 0x07, 0x81, 0x0f, + 0x82, 0x17, 0x83, 0x1f, 0x00, 0x10, 0xa0, 0x84, 0xf0, 0xff, 0x60, 0x06, + 0x61, 0x0a, 0x62, 0x0e, 0x63, 0x12, 0x80, 0x07, 0x81, 0x0f, 0x82, 0x17, + 0x83, 0x1f, 0x20, 0xa9, 0x00, 0x04, 0x20, 0xa1, 0xb8, 0xc7, 0x40, 0xa1, + 0x08, 0x0c, 0x6a, 0xda, 0x69, 0x04, 0xd1, 0xfc, 0x05, 0x20, 0x00, 0xc6, + 0x20, 0x09, 0x00, 0x00, 0x20, 0xa9, 0x00, 0x01, 0x6b, 0x70, 0xd3, 0x84, + 0x01, 0xc8, 0x00, 0x20, 0x83, 0x9d, 0x12, 0xb0, 0x35, 0x08, 0x81, 0x09, + 0x08, 0x0c, 0x63, 0xce, 0x68, 0x78, 0x60, 0x16, 0x68, 0x74, 0x20, 0x08, + 0xa0, 0x84, 0xff, 0x00, 0x80, 0x07, 0x60, 0x0a, 0xa1, 0x84, 0x00, 0xff, + 0x60, 0x06, 0x81, 0x08, 0x11, 0x18, 0x60, 0x03, 0x00, 0x03, 0x00, 0x10, + 0x60, 0x03, 0x00, 0x01, 0x1f, 0x04, 0x39, 0x66, 0x00, 0xce, 0x20, 0x69, + 0xb6, 0x52, 0x20, 0x01, 0xb8, 0x9e, 0x6a, 0x80, 0xa2, 0x94, 0x00, 0x30, + 0xa2, 0x8e, 0x00, 0x00, 0x01, 0x70, 0xa2, 0x8e, 0x00, 0x10, 0x01, 0x18, + 0xa2, 0x8e, 0x00, 0x20, 0x01, 0x40, 0x20, 0x03, 0xaa, 0xaa, 0x08, 0x0c, + 0x29, 0x20, 0x20, 0x01, 0xb8, 0x8f, 0x21, 0x02, 0x00, 0x08, 0x21, 0x02, + 0x00, 0xc6, 0x20, 0x61, 0x01, 0x00, 0x60, 0x2f, 0x00, 0x40, 0x60, 0x2f, + 0x00, 0x00, 0x00, 0xce, 0x08, 0x0c, 0x5b, 0x41, 0x01, 0x28, 0x08, 0x0c, + 0x41, 0x16, 0x01, 0x10, 0x08, 0x0c, 0x28, 0x9c, 0x60, 0xc8, 0xa0, 0x05, + 0x01, 0xd0, 0x60, 0x03, 0x00, 0x01, 0x20, 0x09, 0x39, 0xb2, 0x00, 0xe0, + 0x08, 0x0c, 0x5b, 0x41, 0x11, 0x78, 0x20, 0x11, 0x5a, 0x14, 0x08, 0x0c, + 0x6a, 0x0e, 0x20, 0x11, 0x5a, 0x07, 0x08, 0x0c, 0x6a, 0xce, 0x20, 0x01, + 0xb8, 0x9f, 0x20, 0x03, 0x00, 0x00, 0x08, 0x0c, 0x5a, 0x79, 0x00, 0x40, + 0x08, 0x0c, 0x4b, 0x7b, 0x00, 0x28, 0x60, 0x03, 0x00, 0x04, 0x20, 0x09, + 0x39, 0xcc, 0x00, 0x10, 0x08, 0x04, 0x2f, 0xdf, 0x20, 0x01, 0x01, 0x00, + 0x20, 0x04, 0xa0, 0x82, 0x00, 0x05, 0x02, 0x58, 0x20, 0x01, 0x01, 0x70, + 0x20, 0x04, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, 0x00, 0x4c, 0x11, 0x18, + 0x20, 0x91, 0x30, 0x9d, 0x08, 0x17, 0x20, 0x91, 0x30, 0x1d, 0x08, 0x17, + 0x60, 0x00, 0xa0, 0x86, 0x00, 0x00, 0x09, 0x04, 0x30, 0x04, 0x20, 0x69, + 0xb6, 0x52, 0x78, 0x30, 0x68, 0x42, 0x78, 0x34, 0x68, 0x46, 0x68, 0x04, + 0xd0, 0xfc, 0x01, 0x18, 0x20, 0x09, 0x00, 0x30, 0x00, 0x10, 0x20, 0x09, + 0x00, 0x1c, 0x2d, 0x00, 0x7a, 0x2c, 0x7b, 0x28, 0x7c, 0x3c, 0x7d, 0x38, + 0x08, 0x04, 0x3f, 0x00, 0xa0, 0x06, 0x08, 0x0c, 0x28, 0x9c, 0x81, 0xff, + 0x19, 0x04, 0x30, 0x04, 0x08, 0x0c, 0x5b, 0x41, 0x11, 0x78, 0x20, 0x01, + 0xb8, 0x9f, 0x20, 0x03, 0x00, 0x01, 0x20, 0x01, 0xb6, 0x00, 0x20, 0x03, + 0x00, 0x01, 0xa0, 0x85, 0x00, 0x01, 0x08, 0x0c, 0x5b, 0x85, 0x08, 0x0c, + 0x5a, 0x79, 0x00, 0x80, 0x00, 0x16, 0x20, 0x09, 0xff, 0xff, 0x81, 0x09, + 0x01, 0x30, 0x20, 0x01, 0xb8, 0xe2, 0x20, 0x04, 0xa0, 0x86, 0x00, 0x00, + 0x1d, 0xc0, 0x00, 0x1e, 0x08, 0x0c, 0x4c, 0x52, 0x08, 0x0c, 0x4b, 0x7b, + 0x08, 0x04, 0x2f, 0xdf, 0x81, 0xff, 0x19, 0x04, 0x30, 0x04, 0x08, 0x0c, + 0x5b, 0x41, 0x11, 0x10, 0x08, 0x04, 0x30, 0x04, 0x61, 0x88, 0x81, 0xff, + 0x01, 0x98, 0x70, 0x3f, 0x00, 0x00, 0x20, 0x01, 0xbd, 0xc0, 0x20, 0x09, + 0x00, 0x40, 0x7a, 0x2c, 0x7b, 0x28, 0x7c, 0x3c, 0x7d, 0x38, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x3f, 0x00, 0x70, 0x1b, 0x2f, 0xdd, + 0x01, 0x2e, 0x00, 0x05, 0x70, 0x3f, 0x00, 0x01, 0x00, 0xd6, 0x20, 0x69, + 0xbd, 0xc0, 0x20, 0xa9, 0x00, 0x40, 0x20, 0xa1, 0xbd, 0xc0, 0x20, 0x19, + 0xff, 0xff, 0x43, 0xa4, 0x65, 0x50, 0xa5, 0x88, 0x2d, 0xf9, 0x21, 0x0d, + 0xa1, 0x8c, 0x00, 0xff, 0x21, 0x6a, 0xa0, 0x0e, 0x20, 0x11, 0x00, 0x02, + 0x21, 0x00, 0xa5, 0x06, 0x01, 0xa8, 0x08, 0x0c, 0x50, 0x1b, 0x11, 0x90, + 0x60, 0x14, 0x82, 0x1c, 0x02, 0x38, 0xa3, 0x98, 0xbd, 0xc0, 0xa0, 0x85, + 0xff, 0x00, 0x80, 0x07, 0x20, 0x1a, 0x00, 0x38, 0xa3, 0x98, 0xbd, 0xc0, + 0x23, 0x24, 0xa4, 0xa4, 0xff, 0x00, 0xa4, 0x05, 0x20, 0x1a, 0x82, 0x10, + 0x81, 0x08, 0xa1, 0x82, 0x00, 0x80, 0x12, 0x08, 0x0c, 0x18, 0x82, 0x01, + 0x80, 0x07, 0x2d, 0x0c, 0xa1, 0x05, 0x20, 0x6a, 0x00, 0xde, 0x20, 0xa9, + 0x00, 0x40, 0x20, 0xa1, 0xbd, 0xc0, 0x20, 0x99, 0xbd, 0xc0, 0x08, 0x0c, + 0x4b, 0xf1, 0x08, 0x04, 0x3a, 0x33, 0x08, 0x0c, 0x3e, 0xe1, 0x09, 0x04, + 0x30, 0x07, 0x00, 0xc6, 0x08, 0x0c, 0x3e, 0xbc, 0x00, 0xce, 0x11, 0x20, + 0x20, 0x09, 0x00, 0x02, 0x08, 0x04, 0x30, 0x04, 0x20, 0x01, 0xb6, 0x53, + 0x20, 0x04, 0xd0, 0xb4, 0x05, 0x50, 0x78, 0x24, 0xa0, 0x84, 0xff, 0x00, + 0xa0, 0x8e, 0x7e, 0x00, 0x05, 0x20, 0xa0, 0x8e, 0x7f, 0x00, 0x05, 0x08, + 0xa0, 0x8e, 0x80, 0x00, 0x01, 0xf0, 0x60, 0x00, 0xd0, 0x8c, 0x11, 0xd8, + 0x60, 0x04, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, 0x00, 0x06, 0x11, 0xa8, + 0x68, 0x37, 0x00, 0x00, 0x68, 0x38, 0xc0, 0xfd, 0x68, 0x3a, 0x08, 0x0c, + 0x9e, 0x96, 0x11, 0x20, 0x20, 0x09, 0x00, 0x03, 0x08, 0x04, 0x30, 0x04, + 0x70, 0x07, 0x00, 0x03, 0x70, 0x1b, 0x3a, 0xbf, 0x00, 0x05, 0x08, 0x0c, + 0x3e, 0xe1, 0x09, 0x04, 0x30, 0x07, 0x20, 0xa9, 0x00, 0x2b, 0x2c, 0x98, + 0xad, 0xe8, 0x00, 0x02, 0x2d, 0xa0, 0x53, 0xa3, 0x20, 0xa9, 0x00, 0x04, + 0xac, 0x80, 0x00, 0x06, 0x20, 0x98, 0xad, 0x80, 0x00, 0x06, 0x20, 0xa0, + 0x08, 0x0c, 0x4b, 0xf1, 0x20, 0xa9, 0x00, 0x04, 0xac, 0x80, 0x00, 0x0a, + 0x20, 0x98, 0xad, 0x80, 0x00, 0x0a, 0x20, 0xa0, 0x08, 0x0c, 0x4b, 0xf1, + 0x2d, 0x00, 0x20, 0x09, 0x00, 0x2b, 0x7a, 0x2c, 0x7b, 0x28, 0x7c, 0x3c, + 0x7d, 0x38, 0x08, 0x04, 0x3f, 0x00, 0x81, 0xff, 0x19, 0x04, 0x30, 0x04, + 0x08, 0x0c, 0x3e, 0xd1, 0x09, 0x04, 0x30, 0x07, 0x08, 0x0c, 0x51, 0xf8, + 0x08, 0x04, 0x2f, 0xdf, 0x81, 0xff, 0x19, 0x04, 0x30, 0x04, 0x78, 0x28, + 0xa0, 0x8a, 0x10, 0x00, 0x1a, 0x04, 0x30, 0x07, 0x08, 0x0c, 0x3e, 0xe1, + 0x09, 0x04, 0x30, 0x07, 0x08, 0x0c, 0x52, 0x5b, 0x09, 0x04, 0x30, 0x04, + 0x20, 0x19, 0x00, 0x04, 0xa0, 0x0e, 0x08, 0x0c, 0x52, 0x0a, 0x79, 0x24, + 0x81, 0x0f, 0x7a, 0x28, 0x00, 0x11, 0x08, 0x04, 0x2f, 0xdf, 0xa1, 0x86, + 0x00, 0xff, 0x01, 0x10, 0x00, 0x71, 0x00, 0x60, 0x20, 0x29, 0x00, 0x7e, + 0x20, 0x61, 0xb6, 0x00, 0x64, 0x50, 0x24, 0x00, 0xa5, 0x06, 0x01, 0x10, + 0x25, 0x08, 0x00, 0x19, 0x85, 0x29, 0x1e, 0xc8, 0x00, 0x05, 0x08, 0x0c, + 0x50, 0x1b, 0x11, 0x38, 0x22, 0x00, 0x80, 0x03, 0x80, 0x0b, 0x81, 0x0b, + 0xa1, 0x08, 0x08, 0x0c, 0x6a, 0x1a, 0x00, 0x05, 0x81, 0xff, 0x19, 0x04, + 0x30, 0x04, 0x08, 0x0c, 0x3e, 0xd1, 0x09, 0x04, 0x30, 0x07, 0x08, 0x0c, + 0x50, 0xe1, 0x09, 0x04, 0x30, 0x04, 0x08, 0x0c, 0x52, 0x01, 0x08, 0x04, + 0x2f, 0xdf, 0x81, 0xff, 0x19, 0x04, 0x30, 0x04, 0x08, 0x0c, 0x3e, 0xd1, + 0x09, 0x04, 0x30, 0x07, 0x08, 0x0c, 0x50, 0xe1, 0x09, 0x04, 0x30, 0x04, + 0x08, 0x0c, 0x51, 0xef, 0x08, 0x04, 0x2f, 0xdf, 0x61, 0x00, 0x08, 0x04, + 0x2f, 0xdf, 0x08, 0x0c, 0x3e, 0xe1, 0x09, 0x04, 0x30, 0x07, 0x20, 0x01, + 0xb6, 0x00, 0x20, 0x04, 0xa0, 0x86, 0x00, 0x03, 0x19, 0x04, 0x30, 0x04, + 0x00, 0xd6, 0xac, 0xe8, 0x00, 0x0a, 0x79, 0x24, 0xd1, 0x84, 0x01, 0x10, + 0xac, 0xe8, 0x00, 0x06, 0x68, 0x0c, 0x80, 0x07, 0x78, 0x3e, 0x68, 0x08, + 0x80, 0x07, 0x78, 0x3a, 0x6b, 0x04, 0x83, 0x1f, 0x6a, 0x00, 0x82, 0x17, + 0x00, 0xde, 0x61, 0x00, 0xa1, 0x8c, 0x02, 0x00, 0x08, 0x04, 0x2f, 0xdf, + 0x78, 0x24, 0xa0, 0x9c, 0x00, 0x03, 0xd0, 0xb4, 0x11, 0x60, 0xa3, 0x9a, + 0x00, 0x03, 0x1a, 0x04, 0x30, 0x04, 0x62, 0x50, 0xa2, 0x94, 0x00, 0xff, + 0xa0, 0x84, 0xff, 0x00, 0x80, 0x07, 0xa2, 0x06, 0x11, 0x50, 0x20, 0x01, + 0xb6, 0x40, 0x20, 0x09, 0x00, 0x0c, 0x7a, 0x2c, 0x7b, 0x28, 0x7c, 0x3c, + 0x7d, 0x38, 0x08, 0x04, 0x3f, 0x00, 0x81, 0xff, 0x19, 0x04, 0x30, 0x04, + 0x08, 0x0c, 0x3e, 0xe1, 0x09, 0x04, 0x30, 0x07, 0x60, 0x04, 0xa0, 0x84, + 0x00, 0xff, 0xa0, 0x86, 0x00, 0x06, 0x19, 0x04, 0x30, 0x04, 0x00, 0xc6, + 0x08, 0x0c, 0x3e, 0xbc, 0x00, 0xce, 0x09, 0x04, 0x30, 0x04, 0x68, 0x37, + 0x00, 0x00, 0x68, 0x38, 0xc0, 0xfd, 0x68, 0x3a, 0x08, 0x0c, 0x9e, 0x42, + 0x09, 0x04, 0x30, 0x04, 0x70, 0x07, 0x00, 0x03, 0x70, 0x1b, 0x3b, 0xab, + 0x00, 0x05, 0x68, 0x30, 0xa0, 0x86, 0x01, 0x00, 0x09, 0x04, 0x30, 0x04, + 0xad, 0x80, 0x00, 0x0e, 0x20, 0x09, 0x00, 0x0c, 0x7a, 0x2c, 0x7b, 0x28, + 0x7c, 0x3c, 0x7d, 0x38, 0x08, 0x04, 0x3f, 0x00, 0xa0, 0x06, 0x08, 0x0c, + 0x28, 0x9c, 0x78, 0x24, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, 0x00, 0xff, + 0x01, 0x18, 0x81, 0xff, 0x19, 0x04, 0x30, 0x04, 0x08, 0x0c, 0x5b, 0x41, + 0x01, 0x10, 0x08, 0x0c, 0x4c, 0x52, 0x78, 0x28, 0xa0, 0x8a, 0x10, 0x00, + 0x1a, 0x04, 0x30, 0x07, 0x79, 0x24, 0xa1, 0x8c, 0xff, 0x00, 0x81, 0x0f, + 0xa1, 0x86, 0x00, 0xff, 0x01, 0x38, 0xa1, 0x82, 0x00, 0x7f, 0x1a, 0x04, + 0x30, 0x07, 0x21, 0x00, 0x08, 0x0c, 0x28, 0x66, 0x00, 0x26, 0x00, 0xc6, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x61, 0xb8, 0xf4, 0x60, 0x1b, + 0x00, 0x00, 0x60, 0x1f, 0x00, 0x00, 0x08, 0x0c, 0x5b, 0x41, 0x11, 0x78, + 0x20, 0x01, 0xb8, 0x9f, 0x20, 0x03, 0x00, 0x01, 0x20, 0x01, 0xb6, 0x00, + 0x20, 0x03, 0x00, 0x01, 0xa0, 0x85, 0x00, 0x01, 0x08, 0x0c, 0x5b, 0x85, + 0x08, 0x0c, 0x5a, 0x79, 0x04, 0x40, 0x20, 0x11, 0x00, 0x03, 0x08, 0x0c, + 0x80, 0xfc, 0x20, 0x11, 0x00, 0x02, 0x08, 0x0c, 0x81, 0x06, 0x08, 0x0c, + 0x7f, 0xe0, 0x00, 0x36, 0x20, 0x19, 0x00, 0x00, 0x08, 0x0c, 0x80, 0x6b, + 0x00, 0x3e, 0x20, 0x61, 0x01, 0x00, 0x20, 0x01, 0xb6, 0x15, 0x20, 0x04, + 0xa0, 0x84, 0x00, 0xff, 0x81, 0x0f, 0xa1, 0x05, 0x60, 0x4a, 0x60, 0x43, + 0x00, 0x90, 0x60, 0x43, 0x00, 0x10, 0x20, 0x09, 0xb8, 0xbf, 0x20, 0x0b, + 0x00, 0x00, 0x20, 0x09, 0x00, 0x2d, 0x20, 0x11, 0x4b, 0xb4, 0x08, 0x0c, + 0x6a, 0x94, 0x79, 0x24, 0xa1, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0x08, 0x0c, + 0x5b, 0x41, 0x11, 0x10, 0x20, 0x09, 0x00, 0xff, 0x7a, 0x28, 0x08, 0x0c, + 0x3b, 0x0d, 0x01, 0x2e, 0x00, 0xce, 0x00, 0x2e, 0x08, 0x04, 0x2f, 0xdf, + 0x79, 0x24, 0xa1, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0x00, 0xc6, 0x08, 0x0c, + 0x4f, 0xbf, 0x2c, 0x08, 0x00, 0xce, 0x19, 0x04, 0x30, 0x07, 0x08, 0x04, + 0x2f, 0xdf, 0x81, 0xff, 0x01, 0x20, 0x20, 0x09, 0x00, 0x01, 0x08, 0x04, + 0x30, 0x04, 0x60, 0xd4, 0xd0, 0xac, 0x11, 0x30, 0xd0, 0x9c, 0x11, 0x20, + 0x20, 0x09, 0x00, 0x05, 0x08, 0x04, 0x30, 0x04, 0x08, 0x0c, 0x3e, 0xbc, + 0x11, 0x20, 0x20, 0x09, 0x00, 0x02, 0x08, 0x04, 0x30, 0x04, 0x79, 0x24, + 0x7a, 0x2c, 0x7b, 0x28, 0x7c, 0x3c, 0x7d, 0x38, 0x08, 0x0c, 0x3e, 0xfd, + 0x70, 0x1b, 0x3c, 0x61, 0x00, 0x05, 0x20, 0x09, 0x00, 0x80, 0x08, 0x0c, + 0x50, 0x1b, 0x11, 0x30, 0x60, 0x04, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, + 0x00, 0x06, 0x01, 0x20, 0x20, 0x21, 0x40, 0x0a, 0x08, 0x04, 0x2f, 0xe1, + 0x00, 0xd6, 0xad, 0xe8, 0x00, 0x0d, 0x69, 0x00, 0x6a, 0x08, 0x6b, 0x0c, + 0x6c, 0x10, 0x6d, 0x14, 0x6e, 0x18, 0x68, 0x20, 0xa0, 0xbe, 0x01, 0x00, + 0x09, 0x04, 0x3c, 0xd8, 0xa0, 0xbe, 0x01, 0x12, 0x09, 0x04, 0x3c, 0xd8, + 0xa0, 0xbe, 0x01, 0x13, 0x09, 0x04, 0x3c, 0xd8, 0xa0, 0xbe, 0x01, 0x14, + 0x09, 0x04, 0x3c, 0xd8, 0xa0, 0xbe, 0x01, 0x17, 0x09, 0x04, 0x3c, 0xd8, + 0xa0, 0xbe, 0x01, 0x1a, 0x09, 0x04, 0x3c, 0xd8, 0xa0, 0xbe, 0x01, 0x1c, + 0x09, 0x04, 0x3c, 0xd8, 0xa0, 0xbe, 0x01, 0x21, 0x05, 0xb0, 0xa0, 0xbe, + 0x01, 0x31, 0x05, 0x98, 0xa0, 0xbe, 0x01, 0x71, 0x05, 0xc8, 0xa0, 0xbe, + 0x01, 0x73, 0x05, 0xb0, 0xa0, 0xbe, 0x01, 0xa1, 0x11, 0x20, 0x68, 0x30, + 0x80, 0x07, 0x68, 0x32, 0x04, 0xa8, 0xa0, 0xbe, 0x02, 0x12, 0x05, 0x40, + 0xa0, 0xbe, 0x02, 0x13, 0x05, 0x28, 0xa0, 0xbe, 0x02, 0x14, 0x01, 0xb0, + 0xa0, 0xbe, 0x02, 0x17, 0x01, 0x68, 0xa0, 0xbe, 0x02, 0x1a, 0x11, 0x20, + 0x68, 0x38, 0x80, 0x07, 0x68, 0x3a, 0x00, 0xe0, 0xa0, 0xbe, 0x03, 0x00, + 0x01, 0xc8, 0x00, 0xde, 0x08, 0x04, 0x30, 0x07, 0xad, 0x80, 0x00, 0x10, + 0x20, 0xa9, 0x00, 0x07, 0x08, 0x0c, 0x3d, 0x1e, 0xad, 0x80, 0x00, 0x0e, + 0x20, 0xa9, 0x00, 0x01, 0x08, 0x0c, 0x3d, 0x1e, 0x00, 0x48, 0xad, 0x80, + 0x00, 0x0c, 0x08, 0x0c, 0x3d, 0x2c, 0x00, 0x50, 0xad, 0x80, 0x00, 0x0e, + 0x08, 0x0c, 0x3d, 0x2c, 0xad, 0x80, 0x00, 0x0c, 0x20, 0xa9, 0x00, 0x01, + 0x08, 0x0c, 0x3d, 0x1e, 0x00, 0xc6, 0x08, 0x0c, 0x3e, 0xbc, 0x05, 0x68, + 0x68, 0x38, 0xc0, 0xfd, 0x68, 0x3a, 0x68, 0x37, 0x01, 0x19, 0x68, 0x53, + 0x00, 0x00, 0x68, 0x4f, 0x00, 0x20, 0x68, 0x5b, 0x00, 0x01, 0x81, 0x0b, + 0x69, 0x7e, 0x68, 0x83, 0x00, 0x00, 0x6a, 0x86, 0x6b, 0x8a, 0x6c, 0x8e, + 0x6d, 0x92, 0x69, 0x96, 0x68, 0x9b, 0x00, 0x00, 0x00, 0xce, 0x00, 0xde, + 0x68, 0x37, 0x00, 0x00, 0x68, 0x38, 0xc0, 0xfd, 0x68, 0x3a, 0x68, 0x23, + 0x00, 0x00, 0x68, 0x04, 0x20, 0x68, 0x08, 0x0c, 0x9e, 0x5e, 0x11, 0x20, + 0x20, 0x09, 0x00, 0x03, 0x08, 0x04, 0x30, 0x04, 0x70, 0x07, 0x00, 0x03, + 0x70, 0x1b, 0x3d, 0x15, 0x00, 0x05, 0x00, 0xce, 0x00, 0xde, 0x20, 0x09, + 0x00, 0x02, 0x08, 0x04, 0x30, 0x04, 0x68, 0x20, 0xa0, 0x86, 0x80, 0x01, + 0x19, 0x04, 0x2f, 0xdf, 0x20, 0x09, 0x00, 0x04, 0x08, 0x04, 0x30, 0x04, + 0x00, 0x16, 0x20, 0x08, 0x20, 0x44, 0x80, 0x00, 0x20, 0x4c, 0x80, 0x00, + 0x29, 0x0a, 0x81, 0x08, 0x28, 0x0a, 0x81, 0x08, 0x1f, 0x04, 0x3d, 0x20, + 0x00, 0x1e, 0x00, 0x05, 0x00, 0x16, 0x00, 0xa6, 0x00, 0xb6, 0x20, 0x08, + 0x20, 0x44, 0x80, 0x00, 0x20, 0x4c, 0x80, 0x00, 0x20, 0x54, 0x80, 0x00, + 0x20, 0x5c, 0x2b, 0x0a, 0x81, 0x08, 0x2a, 0x0a, 0x81, 0x08, 0x29, 0x0a, + 0x81, 0x08, 0x28, 0x0a, 0x00, 0xbe, 0x00, 0xae, 0x00, 0x1e, 0x00, 0x05, + 0x81, 0xff, 0x01, 0x20, 0x20, 0x09, 0x00, 0x01, 0x08, 0x04, 0x30, 0x04, + 0x60, 0xd4, 0xd0, 0xac, 0x11, 0x30, 0xd0, 0x9c, 0x11, 0x20, 0x20, 0x09, + 0x00, 0x05, 0x08, 0x04, 0x30, 0x04, 0x79, 0x24, 0x21, 0x40, 0xa1, 0x8c, + 0xff, 0x00, 0x81, 0x0f, 0x60, 0xd4, 0xd0, 0xac, 0x11, 0x20, 0xa1, 0x82, + 0x00, 0x80, 0x0a, 0x04, 0x30, 0x07, 0xa1, 0x82, 0x00, 0xff, 0x1a, 0x04, + 0x30, 0x07, 0x7a, 0x2c, 0x7b, 0x28, 0x60, 0x70, 0xa3, 0x06, 0x11, 0x40, + 0x60, 0x74, 0xa2, 0x4e, 0x09, 0x04, 0x30, 0x07, 0xa9, 0xcc, 0xff, 0x00, + 0x09, 0x04, 0x30, 0x07, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0xc6, + 0x08, 0x0c, 0x3e, 0x0c, 0x2c, 0x68, 0x00, 0xce, 0x05, 0x38, 0xa0, 0xc6, + 0x40, 0x00, 0x11, 0x78, 0x00, 0xc6, 0x00, 0x06, 0x2d, 0x60, 0xa0, 0x0e, + 0x08, 0x0c, 0x52, 0xbc, 0x11, 0x08, 0xc1, 0x85, 0x60, 0x00, 0xd0, 0xbc, + 0x01, 0x08, 0xc1, 0x8d, 0x00, 0x0e, 0x00, 0xce, 0x00, 0x88, 0xa0, 0xc6, + 0x40, 0x07, 0x11, 0x10, 0x24, 0x08, 0x00, 0x60, 0xa0, 0xc6, 0x40, 0x08, + 0x11, 0x18, 0x27, 0x08, 0x26, 0x10, 0x00, 0x30, 0xa0, 0xc6, 0x40, 0x09, + 0x11, 0x08, 0x00, 0x10, 0x20, 0x01, 0x40, 0x06, 0x20, 0x20, 0x01, 0x2e, + 0x08, 0x04, 0x2f, 0xe1, 0x2d, 0x00, 0x70, 0x22, 0x00, 0x16, 0x00, 0xb6, + 0x00, 0xc6, 0x00, 0xe6, 0x2c, 0x70, 0x08, 0x0c, 0x86, 0x4e, 0x05, 0xc0, + 0x2d, 0x00, 0x60, 0x1a, 0x08, 0x0c, 0xa0, 0xe3, 0x2e, 0x58, 0x00, 0xee, + 0x00, 0xe6, 0x00, 0xc6, 0x08, 0x0c, 0x3e, 0xbc, 0x00, 0xce, 0x2b, 0x70, + 0x11, 0x58, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0xee, 0x00, 0xce, 0x00, 0xbe, + 0x00, 0x1e, 0x01, 0x2e, 0x20, 0x09, 0x00, 0x02, 0x08, 0x04, 0x30, 0x04, + 0x68, 0x37, 0x00, 0x00, 0x68, 0x3b, 0x00, 0x00, 0x2d, 0x00, 0x60, 0x12, + 0x68, 0x33, 0x00, 0x00, 0x68, 0x38, 0xc0, 0xfd, 0xd8, 0x8c, 0x01, 0x08, + 0xc0, 0xf5, 0x68, 0x3a, 0x08, 0x0c, 0x2c, 0xd1, 0x60, 0x1f, 0x00, 0x01, + 0x20, 0x01, 0x00, 0x00, 0x08, 0x0c, 0x4f, 0x5d, 0x20, 0x01, 0x00, 0x02, + 0x08, 0x0c, 0x4f, 0x6f, 0x20, 0x09, 0x00, 0x02, 0x08, 0x0c, 0x86, 0xd3, + 0xa0, 0x85, 0x00, 0x01, 0x00, 0xee, 0x00, 0xce, 0x00, 0xbe, 0x00, 0x1e, + 0x01, 0x2e, 0x11, 0x20, 0x20, 0x09, 0x00, 0x03, 0x08, 0x04, 0x30, 0x04, + 0x70, 0x07, 0x00, 0x03, 0x70, 0x1b, 0x3d, 0xef, 0x00, 0x05, 0x68, 0x30, + 0xa0, 0x86, 0x01, 0x00, 0x70, 0x20, 0x20, 0x60, 0x11, 0x38, 0x20, 0x09, + 0x00, 0x04, 0x62, 0x04, 0xa2, 0x94, 0x00, 0xff, 0x08, 0x04, 0x30, 0x04, + 0x20, 0x09, 0x00, 0x00, 0x68, 0x38, 0xd0, 0xf4, 0x19, 0x04, 0x2f, 0xdf, + 0x08, 0x0c, 0x52, 0xbc, 0x11, 0x08, 0xc1, 0x85, 0x60, 0x00, 0xd0, 0xbc, + 0x01, 0x08, 0xc1, 0x8d, 0x08, 0x04, 0x2f, 0xdf, 0x00, 0xe6, 0x00, 0xd6, + 0xa0, 0x2e, 0x20, 0x01, 0xb6, 0x35, 0x20, 0x04, 0xd0, 0xac, 0x01, 0x30, + 0xa0, 0x26, 0x20, 0xa9, 0x00, 0xff, 0x20, 0x71, 0xb7, 0x35, 0x00, 0x30, + 0x20, 0x21, 0x00, 0x80, 0x20, 0xa9, 0x00, 0x7f, 0x20, 0x71, 0xb7, 0xb5, + 0x2e, 0x04, 0xa0, 0x05, 0x11, 0x30, 0x21, 0x00, 0xa4, 0x06, 0x15, 0x70, + 0x24, 0x28, 0xc5, 0xfd, 0x04, 0x58, 0x20, 0x68, 0x6f, 0x10, 0x27, 0x00, + 0xa3, 0x06, 0x11, 0xb0, 0x6e, 0x14, 0x26, 0x00, 0xa2, 0x06, 0x11, 0x90, + 0x24, 0x00, 0xa1, 0x06, 0x11, 0x60, 0x2d, 0x60, 0xd8, 0x84, 0x05, 0x68, + 0x60, 0x04, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, 0x00, 0x06, 0x15, 0x38, + 0x20, 0x01, 0x40, 0x00, 0x04, 0x28, 0x20, 0x01, 0x40, 0x07, 0x04, 0x10, + 0x24, 0x00, 0xa1, 0x06, 0x11, 0x68, 0x6e, 0x14, 0x87, 0xff, 0x11, 0x38, + 0x86, 0xff, 0x09, 0xd0, 0x20, 0x01, 0xb6, 0x35, 0x20, 0x04, 0xd0, 0xac, + 0x19, 0xa8, 0x20, 0x01, 0x40, 0x08, 0x00, 0x90, 0x84, 0x20, 0x8e, 0x70, + 0x1f, 0x04, 0x3e, 0x20, 0x85, 0xff, 0x11, 0x30, 0x20, 0x01, 0x40, 0x09, + 0x00, 0x48, 0x20, 0x01, 0x00, 0x01, 0x00, 0x30, 0x08, 0x0c, 0x4f, 0xbf, + 0x1d, 0xd0, 0x63, 0x12, 0x62, 0x16, 0xa0, 0x06, 0xa0, 0x05, 0x00, 0xde, + 0x00, 0xee, 0x00, 0x05, 0x81, 0xff, 0x19, 0x04, 0x30, 0x04, 0x08, 0x0c, + 0x3e, 0xbc, 0x09, 0x04, 0x30, 0x04, 0x68, 0x37, 0x00, 0x00, 0x68, 0x38, + 0xc0, 0xfd, 0x68, 0x3a, 0x78, 0x24, 0xa0, 0x05, 0x09, 0x04, 0x30, 0x07, + 0xa0, 0x96, 0x00, 0xff, 0x01, 0x20, 0xa0, 0x92, 0x00, 0x04, 0x1a, 0x04, + 0x30, 0x07, 0x20, 0x10, 0x2d, 0x18, 0x08, 0x0c, 0x2c, 0x84, 0x09, 0x04, + 0x30, 0x04, 0x70, 0x07, 0x00, 0x03, 0x70, 0x1b, 0x3e, 0x8c, 0x00, 0x05, + 0x68, 0x30, 0xa0, 0x86, 0x01, 0x00, 0x09, 0x04, 0x30, 0x04, 0x08, 0x04, + 0x2f, 0xdf, 0x79, 0x24, 0xa1, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0x60, 0xd4, + 0xd0, 0xac, 0x11, 0x20, 0xa1, 0x82, 0x00, 0x80, 0x0a, 0x04, 0x30, 0x07, + 0xa1, 0x82, 0x00, 0xff, 0x1a, 0x04, 0x30, 0x07, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0x9d, 0x46, 0x11, 0x88, 0xa1, 0x90, 0xb7, 0x35, + 0x22, 0x04, 0xa0, 0x65, 0x01, 0x60, 0x08, 0x0c, 0x4c, 0x7e, 0x20, 0x01, + 0xb6, 0x35, 0x20, 0x04, 0xd0, 0xac, 0x01, 0x10, 0x60, 0x17, 0x00, 0x00, + 0x01, 0x2e, 0x08, 0x04, 0x2f, 0xdf, 0x01, 0x2e, 0x08, 0x04, 0x30, 0x04, + 0x08, 0x0c, 0x15, 0xfd, 0x01, 0x88, 0xa0, 0x06, 0x68, 0x02, 0x70, 0x10, + 0xa0, 0x05, 0x11, 0x20, 0x2d, 0x00, 0x70, 0x12, 0x70, 0x16, 0x00, 0x30, + 0x70, 0x14, 0x68, 0x02, 0x20, 0x60, 0x2d, 0x00, 0x60, 0x06, 0x70, 0x16, + 0xad, 0x80, 0x00, 0x0d, 0x00, 0x05, 0x79, 0x24, 0x81, 0x0f, 0xa1, 0x8c, + 0x00, 0xff, 0x08, 0x0c, 0x50, 0x1b, 0x11, 0x30, 0x7e, 0x28, 0xa6, 0x84, + 0x3f, 0xff, 0xa0, 0x82, 0x40, 0x00, 0x02, 0x08, 0xa0, 0x66, 0x8c, 0xff, + 0x00, 0x05, 0x7e, 0x24, 0x86, 0x0f, 0xa1, 0x8c, 0x00, 0xff, 0x08, 0x0c, + 0x50, 0x1b, 0x11, 0x28, 0xa6, 0xb4, 0x00, 0xff, 0xa6, 0x82, 0x40, 0x00, + 0x02, 0x08, 0xa0, 0x66, 0x8c, 0xff, 0x00, 0x05, 0x00, 0x16, 0x71, 0x10, + 0x81, 0xff, 0x01, 0x28, 0x21, 0x68, 0x69, 0x04, 0x08, 0x0c, 0x16, 0x14, + 0x0c, 0xc8, 0x71, 0x12, 0x71, 0x16, 0x00, 0x1e, 0x00, 0x05, 0x20, 0x31, + 0x00, 0x01, 0x00, 0x10, 0x20, 0x31, 0x00, 0x00, 0x20, 0x61, 0xb6, 0xd2, + 0x66, 0x06, 0x61, 0x12, 0x60, 0x0e, 0x62, 0x26, 0x63, 0x2a, 0x64, 0x2e, + 0x65, 0x32, 0x2c, 0x10, 0x08, 0x0c, 0x16, 0x48, 0x70, 0x07, 0x00, 0x02, + 0x70, 0x1b, 0x2f, 0xdf, 0x00, 0x05, 0x00, 0xf6, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x79, 0x00, 0x00, 0x20, 0x01, 0xb6, 0x90, 0x20, 0x04, + 0xa0, 0x05, 0x11, 0x68, 0x0e, 0x04, 0x3f, 0x2b, 0x78, 0x18, 0xd0, 0x84, + 0x11, 0x40, 0x7a, 0x22, 0x7b, 0x26, 0x7c, 0x2a, 0x78, 0x1b, 0x00, 0x01, + 0x20, 0x91, 0x40, 0x80, 0x04, 0x08, 0x00, 0x16, 0x00, 0xc6, 0x00, 0xe6, + 0x20, 0x71, 0xb6, 0x82, 0x71, 0x38, 0xa1, 0x82, 0x00, 0x10, 0x02, 0x18, + 0x70, 0x30, 0x20, 0x60, 0x00, 0x78, 0x70, 0x30, 0xa0, 0xe0, 0x00, 0x04, + 0xac, 0x82, 0xb6, 0xd2, 0x02, 0x10, 0x20, 0x61, 0xb6, 0x92, 0x2c, 0x00, + 0x70, 0x32, 0x81, 0xff, 0x11, 0x08, 0x70, 0x36, 0x81, 0x08, 0x71, 0x3a, + 0x22, 0x62, 0x63, 0x06, 0x64, 0x0a, 0x00, 0xee, 0x00, 0xce, 0x00, 0x1e, + 0x01, 0x2e, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0xb6, 0x82, + 0x70, 0x38, 0xa0, 0x05, 0x05, 0x70, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x0e, 0x04, 0x3f, 0x82, 0x00, 0xf6, 0x20, 0x79, 0x00, 0x00, 0x78, 0x18, + 0xd0, 0x84, 0x15, 0x08, 0x00, 0xc6, 0x70, 0x34, 0x20, 0x60, 0x2c, 0x04, + 0x78, 0x22, 0x60, 0x04, 0x78, 0x26, 0x60, 0x08, 0x78, 0x2a, 0x78, 0x1b, + 0x00, 0x01, 0x20, 0x91, 0x40, 0x80, 0x70, 0x38, 0x80, 0x01, 0x70, 0x3a, + 0xa0, 0x05, 0x11, 0x30, 0x70, 0x33, 0xb6, 0x92, 0x70, 0x37, 0xb6, 0x92, + 0x00, 0xce, 0x00, 0x48, 0xac, 0x80, 0x00, 0x04, 0xa0, 0xfa, 0xb6, 0xd2, + 0x02, 0x10, 0x20, 0x01, 0xb6, 0x92, 0x70, 0x36, 0x00, 0xce, 0x00, 0xfe, + 0x01, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x00, 0x26, 0x20, 0x01, 0xb6, 0x53, + 0x20, 0x04, 0xd0, 0xc4, 0x01, 0x20, 0x20, 0x11, 0x80, 0x14, 0x08, 0x0c, + 0x3f, 0x13, 0x00, 0x2e, 0x00, 0x05, 0x81, 0xff, 0x19, 0x04, 0x30, 0x04, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x60, 0x30, 0xc0, 0x8d, 0xc0, 0x85, + 0xc0, 0xac, 0x60, 0x32, 0x08, 0x0c, 0x5b, 0x41, 0x11, 0x78, 0x20, 0x01, + 0xb8, 0x9f, 0x20, 0x03, 0x00, 0x01, 0x20, 0x01, 0xb6, 0x00, 0x20, 0x03, + 0x00, 0x01, 0xa0, 0x85, 0x00, 0x01, 0x08, 0x0c, 0x5b, 0x85, 0x08, 0x0c, + 0x5a, 0x79, 0x00, 0x10, 0x08, 0x0c, 0x4b, 0x7b, 0x01, 0x2e, 0x08, 0x04, + 0x2f, 0xdf, 0x78, 0x24, 0x20, 0x08, 0xa1, 0x8c, 0xff, 0xfd, 0x11, 0x28, + 0x61, 0xe0, 0xa1, 0x0d, 0x61, 0xe2, 0x08, 0x04, 0x2f, 0xdf, 0x08, 0x04, + 0x30, 0x07, 0x81, 0xff, 0x19, 0x04, 0x30, 0x04, 0x60, 0x00, 0xa0, 0x86, + 0x00, 0x03, 0x19, 0x04, 0x30, 0x04, 0x20, 0x01, 0xb6, 0x53, 0x20, 0x04, + 0xd0, 0xac, 0x19, 0x04, 0x30, 0x04, 0x08, 0x0c, 0x3e, 0xe1, 0x09, 0x04, + 0x30, 0x07, 0x60, 0x04, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, 0x00, 0x06, + 0x11, 0x20, 0x78, 0x28, 0xa0, 0x05, 0x09, 0x04, 0x2f, 0xdf, 0x00, 0xc6, + 0x08, 0x0c, 0x3e, 0xbc, 0x00, 0xce, 0x09, 0x04, 0x30, 0x04, 0x68, 0x37, + 0x00, 0x00, 0x68, 0x33, 0x00, 0x00, 0x68, 0x38, 0xc0, 0xfd, 0x68, 0x3a, + 0x08, 0x0c, 0x9f, 0x27, 0x09, 0x04, 0x30, 0x04, 0x70, 0x07, 0x00, 0x03, + 0x70, 0x1b, 0x3f, 0xf1, 0x00, 0x05, 0x68, 0x30, 0xa0, 0x86, 0x01, 0x00, + 0x09, 0x04, 0x30, 0x04, 0x08, 0x04, 0x2f, 0xdf, 0x20, 0x01, 0xb6, 0x00, + 0x20, 0x04, 0xa0, 0x86, 0x00, 0x03, 0x19, 0x04, 0x30, 0x04, 0x7f, 0x24, + 0x7a, 0x2c, 0x7b, 0x28, 0x7c, 0x3c, 0x7d, 0x38, 0x08, 0x0c, 0x3e, 0xbc, + 0x09, 0x04, 0x30, 0x04, 0x20, 0x09, 0x00, 0x00, 0x20, 0x31, 0x00, 0x00, + 0x70, 0x23, 0x00, 0x00, 0x70, 0x2f, 0x00, 0x00, 0xad, 0x80, 0x00, 0x05, + 0x70, 0x26, 0x20, 0xa0, 0x08, 0x0c, 0x50, 0x1b, 0x19, 0x04, 0x40, 0x6b, + 0x60, 0x04, 0xa0, 0xc4, 0x00, 0xff, 0xa8, 0xc6, 0x00, 0x06, 0x01, 0x30, + 0xa0, 0xc4, 0xff, 0x00, 0xa8, 0xc6, 0x06, 0x00, 0x19, 0x04, 0x40, 0x6b, + 0x20, 0x01, 0xb6, 0x53, 0x20, 0x04, 0xd0, 0xac, 0x11, 0x28, 0x08, 0x0c, + 0x52, 0xbc, 0x11, 0x10, 0xd7, 0x9c, 0x05, 0xe8, 0xd7, 0x94, 0x11, 0x10, + 0xd7, 0x84, 0x01, 0x58, 0xac, 0x80, 0x00, 0x06, 0x20, 0x98, 0x34, 0x00, + 0x20, 0xa9, 0x00, 0x04, 0x53, 0xa3, 0x08, 0x0c, 0x3d, 0x2c, 0xd7, 0x94, + 0x01, 0x48, 0xac, 0x80, 0x00, 0x0a, 0x20, 0x98, 0x34, 0x00, 0x20, 0xa9, + 0x00, 0x04, 0x53, 0xa3, 0x08, 0x0c, 0x3d, 0x2c, 0x21, 0xa2, 0xd7, 0x94, + 0x01, 0xd8, 0xac, 0x80, 0x00, 0x00, 0x20, 0x98, 0x94, 0xa0, 0x20, 0xa9, + 0x00, 0x02, 0x53, 0xa3, 0xac, 0x80, 0x00, 0x03, 0x20, 0xa6, 0x94, 0xa0, + 0xac, 0x80, 0x00, 0x04, 0x20, 0x98, 0x34, 0x00, 0x20, 0xa9, 0x00, 0x02, + 0x53, 0xa3, 0x08, 0x0c, 0x3d, 0x1e, 0xac, 0x80, 0x00, 0x26, 0x20, 0x98, + 0x20, 0xa9, 0x00, 0x02, 0x53, 0xa3, 0x00, 0x08, 0x94, 0xa0, 0xd7, 0x94, + 0x01, 0x10, 0xa6, 0xb0, 0x00, 0x0b, 0xa6, 0xb0, 0x00, 0x05, 0x81, 0x08, + 0x20, 0x01, 0xb6, 0x35, 0x20, 0x04, 0xd0, 0xac, 0x01, 0x18, 0xa1, 0x86, + 0x01, 0x00, 0x00, 0x40, 0xd7, 0x8c, 0x01, 0x20, 0xa1, 0x86, 0x01, 0x00, + 0x01, 0x70, 0x00, 0x18, 0xa1, 0x86, 0x00, 0x7e, 0x01, 0x50, 0xd7, 0x94, + 0x01, 0x18, 0xa6, 0x86, 0x00, 0x20, 0x00, 0x10, 0xa6, 0x86, 0x00, 0x28, + 0x01, 0x50, 0x08, 0x04, 0x40, 0x14, 0x86, 0xff, 0x11, 0x20, 0x71, 0x20, + 0x81, 0x0b, 0x08, 0x04, 0x2f, 0xdf, 0x70, 0x2f, 0x00, 0x01, 0x71, 0x1e, + 0x70, 0x20, 0xa6, 0x00, 0x70, 0x22, 0x77, 0x2a, 0x20, 0x61, 0xb6, 0xd2, + 0x60, 0x07, 0x00, 0x00, 0x66, 0x12, 0x70, 0x24, 0x60, 0x0e, 0x62, 0x26, + 0x63, 0x2a, 0x64, 0x2e, 0x65, 0x32, 0x2c, 0x10, 0x08, 0x0c, 0x16, 0x48, + 0x70, 0x07, 0x00, 0x02, 0x70, 0x1b, 0x40, 0xa7, 0x00, 0x05, 0x70, 0x2c, + 0xa0, 0x05, 0x11, 0x70, 0x71, 0x1c, 0x70, 0x24, 0x20, 0xa0, 0x77, 0x28, + 0x20, 0x31, 0x00, 0x00, 0x20, 0x61, 0xb6, 0xd2, 0x62, 0x24, 0x63, 0x28, + 0x64, 0x2c, 0x65, 0x30, 0x08, 0x04, 0x40, 0x14, 0x71, 0x20, 0x81, 0x0b, + 0x08, 0x04, 0x2f, 0xdf, 0x20, 0x29, 0x00, 0x7e, 0x79, 0x24, 0x7a, 0x28, + 0x7b, 0x2c, 0x7c, 0x38, 0xa1, 0x84, 0xff, 0x00, 0x80, 0x07, 0xa0, 0xe2, + 0x00, 0x20, 0x0a, 0x04, 0x30, 0x07, 0xa5, 0x02, 0x0a, 0x04, 0x30, 0x07, + 0xa1, 0x84, 0x00, 0xff, 0xa0, 0xe2, 0x00, 0x20, 0x0a, 0x04, 0x30, 0x07, + 0xa5, 0x02, 0x0a, 0x04, 0x30, 0x07, 0xa2, 0x84, 0xff, 0x00, 0x80, 0x07, + 0xa0, 0xe2, 0x00, 0x20, 0x0a, 0x04, 0x30, 0x07, 0xa5, 0x02, 0x0a, 0x04, + 0x30, 0x07, 0xa2, 0x84, 0x00, 0xff, 0xa0, 0xe2, 0x00, 0x20, 0x0a, 0x04, + 0x30, 0x07, 0xa5, 0x02, 0x0a, 0x04, 0x30, 0x07, 0xa3, 0x84, 0xff, 0x00, + 0x80, 0x07, 0xa0, 0xe2, 0x00, 0x20, 0x0a, 0x04, 0x30, 0x07, 0xa5, 0x02, + 0x0a, 0x04, 0x30, 0x07, 0xa3, 0x84, 0x00, 0xff, 0xa0, 0xe2, 0x00, 0x20, + 0x0a, 0x04, 0x30, 0x07, 0xa5, 0x02, 0x0a, 0x04, 0x30, 0x07, 0xa4, 0x84, + 0xff, 0x00, 0x80, 0x07, 0xa0, 0xe2, 0x00, 0x20, 0x0a, 0x04, 0x30, 0x07, + 0xa5, 0x02, 0x0a, 0x04, 0x30, 0x07, 0xa4, 0x84, 0x00, 0xff, 0xa0, 0xe2, + 0x00, 0x20, 0x0a, 0x04, 0x30, 0x07, 0xa5, 0x02, 0x0a, 0x04, 0x30, 0x07, + 0x20, 0x61, 0xb8, 0xb9, 0x61, 0x02, 0x62, 0x06, 0x63, 0x0a, 0x64, 0x0e, + 0x08, 0x04, 0x2f, 0xdf, 0x00, 0x06, 0x20, 0x01, 0xb6, 0x53, 0x20, 0x04, + 0xd0, 0xcc, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0xb6, 0x72, + 0x20, 0x04, 0xd0, 0xbc, 0x00, 0x0e, 0x00, 0x05, 0x61, 0x68, 0x7a, 0x24, + 0x63, 0x00, 0x82, 0xff, 0x11, 0x18, 0x79, 0x26, 0x08, 0x04, 0x2f, 0xdf, + 0x83, 0xff, 0x19, 0x04, 0x30, 0x07, 0x20, 0x01, 0xff, 0xf0, 0xa2, 0x00, + 0x1a, 0x04, 0x30, 0x07, 0x20, 0x19, 0xff, 0xff, 0x60, 0x6c, 0xa3, 0x02, + 0xa2, 0x00, 0x0a, 0x04, 0x30, 0x07, 0x79, 0x26, 0x62, 0x6a, 0x08, 0x04, + 0x2f, 0xdf, 0x20, 0x01, 0xb6, 0x00, 0x20, 0x04, 0xa0, 0x86, 0x00, 0x03, + 0x19, 0x04, 0x30, 0x04, 0x7c, 0x28, 0x7d, 0x24, 0x7e, 0x38, 0x7f, 0x2c, + 0x08, 0x0c, 0x3e, 0xbc, 0x09, 0x04, 0x30, 0x04, 0x20, 0x09, 0x00, 0x00, + 0x20, 0x19, 0x00, 0x00, 0x70, 0x23, 0x00, 0x00, 0x70, 0x2f, 0x00, 0x00, + 0xad, 0x80, 0x00, 0x03, 0x70, 0x26, 0x20, 0xa0, 0xa1, 0xe0, 0xb7, 0x35, + 0x2c, 0x64, 0x8c, 0xff, 0x01, 0xb8, 0x60, 0x04, 0xa0, 0x84, 0x00, 0xff, + 0xa0, 0x86, 0x00, 0x06, 0x01, 0x30, 0x60, 0x04, 0xa0, 0x84, 0xff, 0x00, + 0xa0, 0x86, 0x06, 0x00, 0x11, 0x58, 0x60, 0x14, 0x20, 0xa2, 0x94, 0xa0, + 0x60, 0x10, 0x80, 0x07, 0xa1, 0x05, 0x80, 0x07, 0x20, 0xa2, 0x94, 0xa0, + 0xa3, 0x98, 0x00, 0x02, 0x81, 0x08, 0xa1, 0x82, 0x00, 0xff, 0x01, 0x20, + 0xa3, 0x86, 0x00, 0x2a, 0x01, 0x48, 0x08, 0xe0, 0x83, 0xff, 0x11, 0x20, + 0x71, 0x20, 0x81, 0x0c, 0x08, 0x04, 0x2f, 0xdf, 0x70, 0x2f, 0x00, 0x01, + 0x71, 0x1e, 0x70, 0x20, 0xa3, 0x00, 0x70, 0x22, 0x20, 0x61, 0xb6, 0xd2, + 0x60, 0x07, 0x00, 0x00, 0x63, 0x12, 0x70, 0x24, 0x60, 0x0e, 0x64, 0x26, + 0x65, 0x2a, 0x66, 0x2e, 0x67, 0x32, 0x2c, 0x10, 0x08, 0x0c, 0x16, 0x48, + 0x70, 0x07, 0x00, 0x02, 0x70, 0x1b, 0x41, 0x9d, 0x00, 0x05, 0x70, 0x2c, + 0xa0, 0x05, 0x11, 0x68, 0x71, 0x1c, 0x70, 0x24, 0x20, 0xa0, 0x20, 0x19, + 0x00, 0x00, 0x20, 0x61, 0xb6, 0xd2, 0x64, 0x24, 0x65, 0x28, 0x66, 0x2c, + 0x67, 0x30, 0x08, 0x04, 0x41, 0x5a, 0x71, 0x20, 0x81, 0x0c, 0x08, 0x04, + 0x2f, 0xdf, 0x81, 0xff, 0x19, 0x04, 0x30, 0x04, 0x60, 0xd4, 0xd0, 0xac, + 0x11, 0x18, 0xd0, 0x9c, 0x09, 0x04, 0x30, 0x04, 0x08, 0x0c, 0x3e, 0xbc, + 0x09, 0x04, 0x30, 0x04, 0x79, 0x24, 0x7a, 0x2c, 0x7b, 0x28, 0x7c, 0x3c, + 0x7d, 0x38, 0x08, 0x0c, 0x3e, 0xfd, 0x70, 0x1b, 0x41, 0xc8, 0x00, 0x05, + 0x00, 0xd6, 0xad, 0xe8, 0x00, 0x0d, 0x68, 0x28, 0xa0, 0xbe, 0x70, 0x00, + 0x01, 0x48, 0xa0, 0xbe, 0x71, 0x00, 0x01, 0x30, 0xa0, 0xbe, 0x72, 0x00, + 0x01, 0x18, 0x00, 0xde, 0x08, 0x04, 0x30, 0x07, 0x68, 0x20, 0x69, 0x24, + 0x08, 0x0c, 0x28, 0x52, 0x15, 0x10, 0x08, 0x0c, 0x4f, 0xbf, 0x11, 0xf8, + 0x71, 0x22, 0x66, 0x12, 0x65, 0x16, 0x6e, 0x18, 0x00, 0xc6, 0x08, 0x0c, + 0x3e, 0xbc, 0x01, 0xb8, 0x08, 0x0c, 0x3e, 0xbc, 0x01, 0xa0, 0x00, 0xce, + 0x00, 0xde, 0x68, 0x37, 0x00, 0x00, 0x68, 0x38, 0xc0, 0xfd, 0x68, 0x3a, + 0x68, 0x23, 0x00, 0x00, 0x68, 0x04, 0x20, 0x68, 0x08, 0x0c, 0x9e, 0x7a, + 0x09, 0x04, 0x30, 0x04, 0x70, 0x07, 0x00, 0x03, 0x70, 0x1b, 0x42, 0x02, + 0x00, 0x05, 0x00, 0xde, 0x08, 0x04, 0x30, 0x04, 0x71, 0x20, 0x08, 0x0c, + 0x2d, 0xcc, 0x68, 0x20, 0xa0, 0x86, 0x80, 0x01, 0x09, 0x04, 0x30, 0x04, + 0x2d, 0x00, 0x70, 0x1e, 0x68, 0x04, 0xa0, 0x80, 0x00, 0x02, 0x00, 0x06, + 0x20, 0xa9, 0x00, 0x2a, 0x20, 0x98, 0x20, 0xa0, 0x08, 0x0c, 0x4b, 0xf1, + 0x00, 0x0e, 0xad, 0xe8, 0x00, 0x0d, 0x6a, 0x08, 0x6b, 0x0c, 0x6c, 0x10, + 0x6d, 0x14, 0x20, 0x61, 0xb6, 0xd2, 0x60, 0x07, 0x00, 0x00, 0x6e, 0x00, + 0x6f, 0x28, 0xa7, 0xc6, 0x70, 0x00, 0x11, 0x08, 0x00, 0x18, 0xa7, 0xc6, + 0x71, 0x00, 0x11, 0x40, 0xa6, 0xc2, 0x00, 0x04, 0x0a, 0x04, 0x30, 0x07, + 0x20, 0x09, 0x00, 0x04, 0x08, 0x04, 0x3f, 0x00, 0xa7, 0xc6, 0x72, 0x00, + 0x19, 0x04, 0x30, 0x07, 0xa6, 0xc2, 0x00, 0x54, 0x0a, 0x04, 0x30, 0x07, + 0x60, 0x0e, 0x60, 0x13, 0x00, 0x2a, 0x62, 0x26, 0x63, 0x2a, 0x64, 0x2e, + 0x65, 0x32, 0x2c, 0x10, 0x08, 0x0c, 0x16, 0x48, 0x70, 0x07, 0x00, 0x02, + 0x70, 0x1b, 0x42, 0x49, 0x00, 0x05, 0x70, 0x1c, 0x20, 0x68, 0x68, 0x04, + 0xa0, 0x80, 0x00, 0x01, 0x20, 0x04, 0xa0, 0x80, 0x00, 0x02, 0x00, 0x06, + 0x20, 0xa9, 0x00, 0x2a, 0x20, 0x98, 0x20, 0xa0, 0x08, 0x0c, 0x4b, 0xf1, + 0x00, 0x0e, 0x20, 0x09, 0x00, 0x2a, 0x20, 0x61, 0xb6, 0xd2, 0x62, 0x24, + 0x63, 0x28, 0x64, 0x2c, 0x65, 0x30, 0x08, 0x04, 0x3f, 0x00, 0x81, 0xff, + 0x19, 0x04, 0x30, 0x04, 0x79, 0x2c, 0x20, 0x01, 0xb8, 0xa0, 0x21, 0x02, + 0x08, 0x0c, 0x3e, 0xd1, 0x09, 0x04, 0x30, 0x07, 0x08, 0x0c, 0x50, 0xe1, + 0x09, 0x04, 0x30, 0x04, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, + 0x52, 0x13, 0x01, 0x2e, 0x08, 0x04, 0x2f, 0xdf, 0x78, 0x24, 0xd0, 0x8c, + 0x11, 0x18, 0xd0, 0x84, 0x09, 0x04, 0x3a, 0x87, 0x08, 0x0c, 0x3e, 0xe1, + 0x09, 0x04, 0x30, 0x07, 0x00, 0xc6, 0x08, 0x0c, 0x3e, 0xbc, 0x00, 0xce, + 0x11, 0x20, 0x20, 0x09, 0x00, 0x02, 0x08, 0x04, 0x30, 0x04, 0x60, 0x04, + 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, 0x00, 0x06, 0x01, 0x28, 0xa0, 0x8e, + 0x00, 0x04, 0x01, 0x10, 0xa0, 0x8e, 0x00, 0x05, 0x15, 0xb8, 0x78, 0x24, + 0xd0, 0x8c, 0x01, 0x20, 0x60, 0x00, 0xc0, 0x8c, 0x60, 0x02, 0x00, 0x30, + 0x20, 0x01, 0xb6, 0x53, 0x20, 0x04, 0xd0, 0xb4, 0x09, 0x04, 0x3a, 0xc3, + 0x78, 0x24, 0xa0, 0x84, 0xff, 0x00, 0xa0, 0x8e, 0x7e, 0x00, 0x09, 0x04, + 0x3a, 0xc3, 0xa0, 0x8e, 0x7f, 0x00, 0x09, 0x04, 0x3a, 0xc3, 0xa0, 0x8e, + 0x80, 0x00, 0x09, 0x04, 0x3a, 0xc3, 0x60, 0x00, 0xd0, 0x8c, 0x19, 0x04, + 0x3a, 0xc3, 0x68, 0x37, 0x00, 0x00, 0x68, 0x38, 0xc0, 0xfd, 0x68, 0x3a, + 0x08, 0x0c, 0x9e, 0x96, 0x11, 0x20, 0x20, 0x09, 0x00, 0x03, 0x08, 0x04, + 0x30, 0x04, 0x70, 0x07, 0x00, 0x03, 0x70, 0x1b, 0x42, 0xca, 0x00, 0x05, + 0x08, 0x0c, 0x3e, 0xe1, 0x09, 0x04, 0x30, 0x07, 0x08, 0x04, 0x3a, 0xc3, + 0x20, 0x09, 0xb6, 0x31, 0x21, 0x0c, 0x81, 0xff, 0x01, 0x20, 0x20, 0x09, + 0x00, 0x01, 0x08, 0x04, 0x30, 0x04, 0x20, 0x01, 0xb6, 0x00, 0x20, 0x04, + 0xa0, 0x86, 0x00, 0x03, 0x01, 0x20, 0x20, 0x09, 0x00, 0x07, 0x08, 0x04, + 0x30, 0x04, 0x20, 0x01, 0xb6, 0x53, 0x20, 0x04, 0xd0, 0xac, 0x01, 0x20, + 0x20, 0x09, 0x00, 0x08, 0x08, 0x04, 0x30, 0x04, 0x60, 0x9c, 0xd0, 0xa4, + 0x11, 0x18, 0xd0, 0xac, 0x19, 0x04, 0x3a, 0xc3, 0x68, 0x37, 0x00, 0x00, + 0x68, 0x33, 0x00, 0x00, 0x68, 0x38, 0xc0, 0xfd, 0x68, 0x3a, 0x08, 0x0c, + 0x9f, 0x27, 0x11, 0x20, 0x20, 0x09, 0x00, 0x03, 0x08, 0x04, 0x30, 0x04, + 0x70, 0x07, 0x00, 0x03, 0x70, 0x1b, 0x43, 0x05, 0x00, 0x05, 0x68, 0x30, + 0xa0, 0x86, 0x01, 0x00, 0x11, 0x20, 0x20, 0x09, 0x00, 0x04, 0x08, 0x04, + 0x30, 0x04, 0x08, 0x0c, 0x3e, 0xe1, 0x09, 0x04, 0x30, 0x07, 0x08, 0x04, + 0x42, 0x99, 0x81, 0xff, 0x20, 0x09, 0x00, 0x01, 0x19, 0x04, 0x30, 0x04, + 0x60, 0x00, 0xa0, 0x86, 0x00, 0x03, 0x20, 0x09, 0x00, 0x07, 0x19, 0x04, + 0x30, 0x04, 0x20, 0x01, 0xb6, 0x53, 0x20, 0x04, 0xd0, 0xac, 0x20, 0x09, + 0x00, 0x08, 0x19, 0x04, 0x30, 0x04, 0x08, 0x0c, 0x3e, 0xe1, 0x09, 0x04, + 0x30, 0x07, 0x60, 0x04, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, 0x00, 0x06, + 0x20, 0x09, 0x00, 0x09, 0x19, 0x04, 0x30, 0x04, 0x00, 0xc6, 0x08, 0x0c, + 0x3e, 0xbc, 0x00, 0xce, 0x20, 0x09, 0x00, 0x02, 0x09, 0x04, 0x30, 0x04, + 0x68, 0x37, 0x00, 0x00, 0x68, 0x33, 0x00, 0x00, 0x68, 0x38, 0xc0, 0xfd, + 0x68, 0x3a, 0x79, 0x28, 0xa1, 0x94, 0xff, 0x00, 0xa1, 0x8c, 0x00, 0xff, + 0xa0, 0x06, 0x82, 0xff, 0x11, 0x28, 0xc0, 0xed, 0x69, 0x52, 0x79, 0x2c, + 0x69, 0x56, 0x00, 0x48, 0xa2, 0x8e, 0x01, 0x00, 0x19, 0x04, 0x30, 0x07, + 0xc0, 0xe5, 0x68, 0x53, 0x00, 0x00, 0x68, 0x57, 0x00, 0x00, 0x68, 0x3e, + 0x08, 0x0c, 0xa0, 0xe4, 0x20, 0x09, 0x00, 0x03, 0x09, 0x04, 0x30, 0x04, + 0x70, 0x07, 0x00, 0x03, 0x70, 0x1b, 0x43, 0x65, 0x00, 0x05, 0x68, 0x30, + 0xa0, 0x86, 0x01, 0x00, 0x20, 0x09, 0x00, 0x04, 0x09, 0x04, 0x30, 0x04, + 0x08, 0x04, 0x2f, 0xdf, 0x81, 0xff, 0x20, 0x09, 0x00, 0x01, 0x19, 0x04, + 0x30, 0x04, 0x60, 0x00, 0xa0, 0x86, 0x00, 0x03, 0x20, 0x09, 0x00, 0x07, + 0x19, 0x04, 0x30, 0x04, 0x08, 0x0c, 0x3e, 0xe1, 0x09, 0x04, 0x30, 0x07, + 0x60, 0x04, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, 0x00, 0x06, 0x20, 0x09, + 0x00, 0x09, 0x19, 0x04, 0x30, 0x04, 0x00, 0xc6, 0x08, 0x0c, 0x3e, 0xbc, + 0x00, 0xce, 0x20, 0x09, 0x00, 0x02, 0x09, 0x04, 0x30, 0x04, 0xad, 0x80, + 0x00, 0x0f, 0x20, 0x09, 0x00, 0x08, 0x7a, 0x2c, 0x7b, 0x28, 0x7c, 0x3c, + 0x7d, 0x38, 0x08, 0x0c, 0x3e, 0xfd, 0x70, 0x1b, 0x43, 0x9c, 0x00, 0x05, + 0x00, 0xd6, 0xad, 0xe8, 0x00, 0x0f, 0x68, 0x00, 0xa0, 0x86, 0x05, 0x00, + 0x11, 0x40, 0x68, 0x04, 0xa0, 0x05, 0x11, 0x28, 0x68, 0x08, 0xa0, 0x84, + 0xff, 0x00, 0x11, 0x08, 0x00, 0x18, 0x00, 0xde, 0x19, 0x04, 0x30, 0x07, + 0x00, 0xde, 0x68, 0x37, 0x00, 0x00, 0x68, 0x33, 0x00, 0x00, 0x68, 0x38, + 0xc0, 0xfd, 0x68, 0x3a, 0x00, 0xc6, 0x08, 0x0c, 0x3e, 0xe1, 0x11, 0x18, + 0x00, 0xce, 0x08, 0x04, 0x30, 0x07, 0x08, 0x0c, 0xa1, 0x33, 0x20, 0x09, + 0x00, 0x03, 0x00, 0xce, 0x09, 0x04, 0x30, 0x04, 0x70, 0x07, 0x00, 0x03, + 0x70, 0x1b, 0x43, 0xc9, 0x00, 0x05, 0x68, 0x30, 0xa0, 0x86, 0x01, 0x00, + 0x20, 0x09, 0x00, 0x04, 0x09, 0x04, 0x30, 0x04, 0x08, 0x04, 0x2f, 0xdf, + 0x81, 0xff, 0x01, 0x20, 0x20, 0x09, 0x00, 0x01, 0x08, 0x04, 0x30, 0x04, + 0x60, 0x00, 0xa0, 0x86, 0x00, 0x03, 0x01, 0x20, 0x20, 0x09, 0x00, 0x07, + 0x08, 0x04, 0x30, 0x04, 0x7e, 0x24, 0x86, 0x0f, 0xa1, 0x8c, 0x00, 0xff, + 0xa6, 0xb4, 0x00, 0xff, 0x08, 0x0c, 0x50, 0x1b, 0x19, 0x04, 0x30, 0x07, + 0xa1, 0x86, 0x00, 0x7f, 0x01, 0x50, 0x60, 0x04, 0xa0, 0x84, 0x00, 0xff, + 0xa0, 0x86, 0x00, 0x06, 0x01, 0x20, 0x20, 0x09, 0x00, 0x09, 0x08, 0x04, + 0x30, 0x04, 0x00, 0xc6, 0x08, 0x0c, 0x3e, 0xbc, 0x00, 0xce, 0x11, 0x20, + 0x20, 0x09, 0x00, 0x02, 0x08, 0x04, 0x30, 0x04, 0x68, 0x37, 0x00, 0x00, + 0x68, 0x38, 0xc0, 0xfd, 0x68, 0x3a, 0x20, 0x01, 0x01, 0x00, 0x80, 0x07, + 0x68, 0x0a, 0x08, 0x0c, 0x9e, 0xb1, 0x11, 0x20, 0x20, 0x09, 0x00, 0x03, + 0x08, 0x04, 0x30, 0x04, 0x70, 0x07, 0x00, 0x03, 0x70, 0x1b, 0x44, 0x15, + 0x00, 0x05, 0x68, 0x08, 0x80, 0x07, 0xa0, 0x86, 0x01, 0x00, 0x11, 0x20, + 0x20, 0x09, 0x00, 0x04, 0x08, 0x04, 0x30, 0x04, 0x68, 0xb0, 0x68, 0x36, + 0x68, 0x10, 0x80, 0x07, 0xa0, 0x84, 0x00, 0xff, 0x80, 0x0c, 0x68, 0x14, + 0x80, 0x07, 0xa0, 0x84, 0x00, 0xff, 0x80, 0x04, 0xa0, 0x80, 0x00, 0x02, + 0xa1, 0x08, 0xad, 0x80, 0x00, 0x04, 0x7a, 0x2c, 0x7b, 0x28, 0x7c, 0x3c, + 0x7d, 0x38, 0x08, 0x04, 0x3f, 0x00, 0x08, 0x0c, 0x3e, 0xbc, 0x11, 0x20, + 0x20, 0x09, 0x00, 0x02, 0x08, 0x04, 0x30, 0x04, 0x79, 0x24, 0xa1, 0x94, + 0xff, 0x00, 0xa1, 0x8c, 0x00, 0xff, 0x82, 0x17, 0x82, 0xff, 0x01, 0x10, + 0x08, 0x04, 0x30, 0x07, 0x20, 0x09, 0x00, 0x1a, 0x7a, 0x2c, 0x7b, 0x28, + 0x7c, 0x3c, 0x7d, 0x38, 0x08, 0x0c, 0x3e, 0xfd, 0x70, 0x1b, 0x44, 0x51, + 0x00, 0x05, 0x20, 0x01, 0xb6, 0x2a, 0x20, 0x03, 0x00, 0x01, 0xad, 0x80, + 0x00, 0x0d, 0x20, 0x98, 0x20, 0xa9, 0x00, 0x1a, 0x20, 0xa1, 0xb8, 0xc7, + 0x53, 0xa3, 0x08, 0x04, 0x2f, 0xdf, 0x08, 0x0c, 0x3e, 0xbc, 0x11, 0x20, + 0x20, 0x09, 0x00, 0x02, 0x08, 0x04, 0x30, 0x04, 0x79, 0x24, 0xa1, 0x94, + 0xff, 0x00, 0xa1, 0x8c, 0x00, 0xff, 0x82, 0x17, 0x82, 0xff, 0x01, 0x10, + 0x08, 0x04, 0x30, 0x07, 0x20, 0x99, 0xb8, 0xc7, 0x20, 0xa0, 0x20, 0xa9, + 0x00, 0x1a, 0x53, 0xa3, 0x20, 0x09, 0x00, 0x1a, 0x7a, 0x2c, 0x7b, 0x28, + 0x7c, 0x3c, 0x7d, 0x38, 0x08, 0x04, 0x3f, 0x00, 0x78, 0x24, 0xa0, 0x8a, + 0x10, 0x00, 0x1a, 0x04, 0x30, 0x07, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x80, 0x03, 0x80, 0x0b, 0x81, 0x0b, 0xa1, 0x08, 0x00, 0xc6, 0x20, 0x61, + 0xb8, 0xf4, 0x61, 0x42, 0x00, 0xce, 0x01, 0x2e, 0x08, 0x04, 0x2f, 0xdf, + 0x00, 0xc6, 0x08, 0x0c, 0x5b, 0x41, 0x11, 0x88, 0x20, 0x01, 0xb8, 0x9f, + 0x20, 0x03, 0x00, 0x01, 0x20, 0x01, 0xb6, 0x00, 0x20, 0x03, 0x00, 0x01, + 0xa0, 0x85, 0x00, 0x01, 0x08, 0x0c, 0x5b, 0x85, 0x08, 0x0c, 0x5a, 0x79, + 0x08, 0x0c, 0x15, 0x1a, 0x00, 0x38, 0x20, 0x61, 0xb6, 0x00, 0x60, 0x30, + 0xc0, 0x9d, 0x60, 0x32, 0x08, 0x0c, 0x4b, 0x7b, 0x00, 0xce, 0x00, 0x05, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0xc6, 0x20, 0x61, 0xb8, 0xf4, + 0x79, 0x24, 0x61, 0x52, 0x61, 0x4e, 0x60, 0x57, 0x00, 0x00, 0x60, 0x4b, + 0x00, 0x09, 0x78, 0x38, 0x60, 0x6a, 0x78, 0x3c, 0x60, 0x66, 0x78, 0x28, + 0x60, 0x62, 0x78, 0x2c, 0x60, 0x5e, 0x20, 0x61, 0xb8, 0xa1, 0x20, 0x01, + 0xb9, 0x09, 0x60, 0x0e, 0x60, 0x13, 0x00, 0x01, 0x60, 0x17, 0x00, 0x02, + 0x60, 0x07, 0x00, 0x00, 0x60, 0x37, 0x00, 0x00, 0x00, 0xce, 0x01, 0x2e, + 0x08, 0x04, 0x2f, 0xdf, 0x01, 0x26, 0x00, 0xc6, 0x00, 0xe6, 0x20, 0x61, + 0x01, 0x00, 0x20, 0x71, 0xb6, 0x00, 0x60, 0x44, 0xd0, 0xa4, 0x11, 0xb0, + 0xd0, 0x84, 0x01, 0x18, 0x08, 0x0c, 0x46, 0x4d, 0x00, 0x68, 0xd0, 0x8c, + 0x01, 0x18, 0x08, 0x0c, 0x45, 0x6e, 0x00, 0x40, 0xd0, 0x94, 0x01, 0x18, + 0x08, 0x0c, 0x45, 0x3f, 0x00, 0x18, 0xd0, 0x9c, 0x01, 0x08, 0x00, 0x61, + 0x00, 0xee, 0x00, 0xce, 0x01, 0x2e, 0x00, 0x05, 0x00, 0x16, 0x61, 0x28, + 0xd1, 0x9c, 0x11, 0x10, 0xc1, 0x9d, 0x61, 0x2a, 0x00, 0x1e, 0x0c, 0xa0, + 0x62, 0x4c, 0xa2, 0x86, 0xf0, 0xf0, 0x11, 0x50, 0x60, 0x48, 0xa0, 0x86, + 0xf0, 0xf0, 0x01, 0x30, 0x62, 0x4a, 0x60, 0x43, 0x00, 0x90, 0x60, 0x43, + 0x00, 0x10, 0x04, 0x90, 0xa2, 0x94, 0xff, 0x00, 0xa2, 0x96, 0xf7, 0x00, + 0x01, 0x78, 0x71, 0x34, 0xd1, 0xa4, 0x11, 0x60, 0x62, 0x40, 0xa2, 0x95, + 0x01, 0x00, 0x62, 0x42, 0xa2, 0x94, 0x00, 0x10, 0x01, 0x28, 0x20, 0x09, + 0x00, 0xf7, 0x08, 0x0c, 0x4c, 0x11, 0x00, 0xf0, 0x60, 0x40, 0xa0, 0x84, + 0x00, 0x10, 0xa0, 0x85, 0x01, 0x40, 0x60, 0x42, 0x60, 0x43, 0x00, 0x00, + 0x70, 0x7b, 0x00, 0x00, 0x70, 0x97, 0x00, 0x01, 0x70, 0xbb, 0x00, 0x00, + 0x70, 0xd7, 0x00, 0x00, 0x20, 0x09, 0xbd, 0xc0, 0x20, 0x0b, 0x00, 0x00, + 0x70, 0x8b, 0x00, 0x00, 0x70, 0x7f, 0x00, 0x0a, 0x20, 0x09, 0x00, 0x0a, + 0x20, 0x11, 0x4b, 0x1c, 0x08, 0x0c, 0x6a, 0x94, 0x00, 0x05, 0x01, 0x56, + 0x20, 0x01, 0xb6, 0x74, 0x20, 0x04, 0xd0, 0x8c, 0x01, 0x10, 0x70, 0x53, + 0xff, 0xff, 0x70, 0x7c, 0xa0, 0x05, 0x15, 0x10, 0x20, 0x11, 0x4b, 0x1c, + 0x08, 0x0c, 0x6a, 0x0e, 0x60, 0x40, 0xa0, 0x94, 0x00, 0x10, 0xa2, 0x85, + 0x00, 0x20, 0x60, 0x42, 0x20, 0xa9, 0x00, 0xc8, 0x60, 0x44, 0xd0, 0x8c, + 0x11, 0x68, 0x1f, 0x04, 0x45, 0x56, 0x62, 0x42, 0x70, 0x8f, 0x00, 0x00, + 0x60, 0x40, 0xa0, 0x94, 0x00, 0x10, 0xa2, 0x85, 0x00, 0x80, 0x60, 0x42, + 0x62, 0x42, 0x00, 0x30, 0x62, 0x42, 0x70, 0x8f, 0x00, 0x00, 0x70, 0x83, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x5e, 0x00, 0x05, 0x70, 0x80, 0xa0, 0x8a, + 0x00, 0x03, 0x12, 0x10, 0x00, 0x23, 0x00, 0x10, 0x08, 0x0c, 0x15, 0x1a, + 0x00, 0x05, 0x45, 0x7a, 0x45, 0xca, 0x46, 0x4c, 0x00, 0xf6, 0x70, 0x83, + 0x00, 0x01, 0x20, 0xe1, 0xa0, 0x00, 0xe0, 0x00, 0x20, 0xe1, 0x87, 0x00, + 0x08, 0x0c, 0x24, 0xa5, 0x20, 0xe1, 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, + 0x20, 0x79, 0xbc, 0x00, 0x20, 0x7b, 0x22, 0x00, 0x78, 0x07, 0x00, 0xef, + 0x78, 0x0b, 0x00, 0x00, 0x78, 0x0f, 0x00, 0xef, 0x78, 0x13, 0x01, 0x38, + 0x78, 0x17, 0x00, 0x00, 0x78, 0x1b, 0x00, 0x00, 0x78, 0x1f, 0x00, 0x00, + 0x78, 0x23, 0xff, 0xff, 0x78, 0x27, 0xff, 0xff, 0x78, 0x2b, 0x00, 0x00, + 0x78, 0x2f, 0x00, 0x00, 0x20, 0x79, 0xbc, 0x0c, 0x20, 0x7b, 0x11, 0x01, + 0x78, 0x07, 0x00, 0x00, 0x20, 0x99, 0xb6, 0x05, 0x20, 0xa1, 0xbc, 0x0e, + 0x20, 0xa9, 0x00, 0x04, 0x53, 0xa3, 0x20, 0x79, 0xbc, 0x12, 0x20, 0x7b, + 0x00, 0x00, 0x78, 0x07, 0x00, 0x00, 0x20, 0x99, 0xbc, 0x00, 0x20, 0xa1, + 0x02, 0x0b, 0x20, 0xa9, 0x00, 0x14, 0x53, 0xa6, 0x60, 0xc3, 0x00, 0x0c, + 0x60, 0x0f, 0x00, 0x00, 0x08, 0x0c, 0x4b, 0x55, 0x00, 0xfe, 0x70, 0x87, + 0x00, 0x00, 0x60, 0x43, 0x00, 0x08, 0x60, 0x43, 0x00, 0x00, 0x00, 0x05, + 0x00, 0xd6, 0x70, 0x84, 0x70, 0x87, 0x00, 0x00, 0xa0, 0x25, 0x09, 0x04, + 0x46, 0x34, 0x60, 0x20, 0xd0, 0xb4, 0x19, 0x04, 0x46, 0x32, 0x71, 0x94, + 0x81, 0xff, 0x09, 0x04, 0x46, 0x22, 0xa4, 0x86, 0x00, 0x0c, 0x19, 0x04, + 0x46, 0x2d, 0xa4, 0x80, 0x00, 0x18, 0x80, 0x04, 0x20, 0xa8, 0x20, 0x11, + 0xbc, 0x80, 0x20, 0x19, 0xbc, 0x00, 0x22, 0x0c, 0x23, 0x04, 0xa1, 0x06, + 0x11, 0xb8, 0x82, 0x10, 0x83, 0x18, 0x1f, 0x04, 0x45, 0xe5, 0x60, 0x43, + 0x00, 0x04, 0x60, 0x8b, 0xbc, 0x94, 0x60, 0x8f, 0xf0, 0xf0, 0x60, 0x43, + 0x00, 0x06, 0x70, 0x83, 0x00, 0x02, 0x70, 0x8f, 0x00, 0x02, 0x20, 0x09, + 0x07, 0xd0, 0x20, 0x11, 0x4b, 0x23, 0x08, 0x0c, 0x6a, 0x94, 0x04, 0x90, + 0x20, 0x69, 0xbc, 0x80, 0x69, 0x30, 0xa1, 0x8e, 0x11, 0x01, 0x15, 0x38, + 0x68, 0x34, 0xa0, 0x05, 0x15, 0x20, 0x69, 0x00, 0xa1, 0x8c, 0x00, 0xff, + 0x11, 0x18, 0x68, 0x04, 0xa0, 0x05, 0x01, 0x90, 0x20, 0x11, 0xbc, 0x8e, + 0x20, 0x19, 0xb6, 0x05, 0x20, 0xa9, 0x00, 0x04, 0x22, 0x0c, 0x23, 0x04, + 0xa1, 0x02, 0x02, 0x30, 0x11, 0x90, 0x82, 0x10, 0x83, 0x18, 0x1f, 0x04, + 0x46, 0x16, 0x00, 0x68, 0x70, 0x97, 0x00, 0x00, 0x20, 0xe1, 0x90, 0x80, + 0x20, 0xe1, 0x40, 0x00, 0x20, 0x99, 0xbc, 0x80, 0x20, 0xa1, 0x02, 0x0b, + 0x20, 0xa9, 0x00, 0x14, 0x53, 0xa6, 0x60, 0x43, 0x00, 0x08, 0x60, 0x43, + 0x00, 0x00, 0x00, 0x10, 0x00, 0xde, 0x00, 0x05, 0x60, 0x40, 0xa0, 0x85, + 0x01, 0x00, 0x60, 0x42, 0x60, 0x20, 0xd0, 0xb4, 0x1d, 0xb8, 0x60, 0xc3, + 0x00, 0x0c, 0x20, 0x11, 0xb8, 0xeb, 0x20, 0x13, 0x00, 0x00, 0x70, 0x87, + 0x00, 0x00, 0x20, 0xe1, 0x90, 0x80, 0x60, 0xa3, 0x00, 0x56, 0x60, 0xa7, + 0x95, 0x75, 0x08, 0x0c, 0x7d, 0xea, 0x0c, 0x30, 0x00, 0x05, 0x70, 0x8c, + 0xa0, 0x8a, 0x00, 0x1d, 0x12, 0x10, 0x00, 0x23, 0x00, 0x10, 0x08, 0x0c, + 0x15, 0x1a, 0x00, 0x05, 0x46, 0x80, 0x46, 0x8f, 0x46, 0xb7, 0x46, 0xd0, + 0x46, 0xf4, 0x47, 0x1c, 0x47, 0x40, 0x47, 0x71, 0x47, 0x95, 0x47, 0xbd, + 0x47, 0xf4, 0x48, 0x1c, 0x48, 0x38, 0x48, 0x4e, 0x48, 0x6e, 0x48, 0x81, + 0x48, 0x89, 0x48, 0xb9, 0x48, 0xdd, 0x49, 0x05, 0x49, 0x29, 0x49, 0x5a, + 0x49, 0x97, 0x49, 0xc6, 0x49, 0xe2, 0x4a, 0x21, 0x4a, 0x41, 0x4a, 0x5a, + 0x4a, 0x5b, 0x00, 0xc6, 0x20, 0x61, 0xb6, 0x00, 0x60, 0x03, 0x00, 0x07, + 0x20, 0x61, 0x01, 0x00, 0x60, 0x04, 0xa0, 0x84, 0xff, 0xf9, 0x60, 0x06, + 0x00, 0xce, 0x00, 0x05, 0x60, 0x8b, 0xbc, 0x94, 0x60, 0x8f, 0xf0, 0xf0, + 0x60, 0x43, 0x00, 0x02, 0x70, 0x8f, 0x00, 0x01, 0x20, 0x09, 0x07, 0xd0, + 0x20, 0x11, 0x4b, 0x23, 0x08, 0x0c, 0x6a, 0x94, 0x00, 0x05, 0x00, 0xf6, + 0x70, 0x84, 0xa0, 0x86, 0x00, 0x14, 0x15, 0x08, 0x60, 0x43, 0x00, 0x00, + 0x60, 0x20, 0xd0, 0xb4, 0x11, 0xe0, 0x20, 0x79, 0xbc, 0x80, 0x7a, 0x30, + 0xa2, 0x96, 0x11, 0x02, 0x11, 0xa0, 0x78, 0x34, 0xa0, 0x05, 0x11, 0x88, + 0x7a, 0x38, 0xd2, 0xfc, 0x01, 0x28, 0x70, 0xb8, 0xa0, 0x05, 0x11, 0x10, + 0x70, 0xbb, 0x00, 0x01, 0x20, 0x11, 0x4b, 0x23, 0x08, 0x0c, 0x6a, 0x0e, + 0x70, 0x8f, 0x00, 0x10, 0x08, 0x0c, 0x48, 0x89, 0x00, 0x10, 0x08, 0x0c, + 0x4b, 0x7b, 0x00, 0xfe, 0x00, 0x05, 0x70, 0x8f, 0x00, 0x03, 0x60, 0x43, + 0x00, 0x04, 0x20, 0x11, 0x4b, 0x23, 0x08, 0x0c, 0x6a, 0x0e, 0x08, 0x0c, + 0x4b, 0xf9, 0x20, 0xa3, 0x11, 0x02, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa9, + 0x00, 0x0a, 0x20, 0xa3, 0x00, 0x00, 0x1f, 0x04, 0x46, 0xc7, 0x60, 0xc3, + 0x00, 0x14, 0x08, 0x0c, 0x4b, 0x55, 0x00, 0x05, 0x00, 0xf6, 0x70, 0x84, + 0xa0, 0x05, 0x01, 0xf0, 0x20, 0x11, 0x4b, 0x23, 0x08, 0x0c, 0x6a, 0x0e, + 0xa0, 0x86, 0x00, 0x14, 0x11, 0xa8, 0x20, 0x79, 0xbc, 0x80, 0x7a, 0x30, + 0xa2, 0x96, 0x11, 0x02, 0x11, 0x78, 0x78, 0x34, 0xa0, 0x05, 0x11, 0x60, + 0x7a, 0x38, 0xd2, 0xfc, 0x01, 0x28, 0x70, 0xb8, 0xa0, 0x05, 0x11, 0x10, + 0x70, 0xbb, 0x00, 0x01, 0x70, 0x8f, 0x00, 0x04, 0x00, 0x29, 0x00, 0x10, + 0x08, 0x0c, 0x4b, 0x7b, 0x00, 0xfe, 0x00, 0x05, 0x70, 0x8f, 0x00, 0x05, + 0x08, 0x0c, 0x4b, 0xf9, 0x20, 0xa3, 0x11, 0x03, 0x20, 0xa3, 0x00, 0x00, + 0x34, 0x30, 0x20, 0x11, 0xbc, 0x8e, 0x08, 0x0c, 0x4c, 0x4a, 0x11, 0x60, + 0x70, 0x78, 0xa0, 0x05, 0x11, 0x48, 0x71, 0x50, 0xa1, 0x86, 0xff, 0xff, + 0x01, 0x28, 0x08, 0x0c, 0x4a, 0xe7, 0x01, 0x10, 0x08, 0x0c, 0x4c, 0x28, + 0x20, 0xa9, 0x00, 0x08, 0x22, 0x98, 0x26, 0xa0, 0x53, 0xa6, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, 0x00, 0x14, 0x08, 0x0c, + 0x4b, 0x55, 0x00, 0x05, 0x00, 0xf6, 0x70, 0x84, 0xa0, 0x05, 0x01, 0xf0, + 0x20, 0x11, 0x4b, 0x23, 0x08, 0x0c, 0x6a, 0x0e, 0xa0, 0x86, 0x00, 0x14, + 0x11, 0xa8, 0x20, 0x79, 0xbc, 0x80, 0x7a, 0x30, 0xa2, 0x96, 0x11, 0x03, + 0x11, 0x78, 0x78, 0x34, 0xa0, 0x05, 0x11, 0x60, 0x7a, 0x38, 0xd2, 0xfc, + 0x01, 0x28, 0x70, 0xb8, 0xa0, 0x05, 0x11, 0x10, 0x70, 0xbb, 0x00, 0x01, + 0x70, 0x8f, 0x00, 0x06, 0x00, 0x29, 0x00, 0x10, 0x08, 0x0c, 0x4b, 0x7b, + 0x00, 0xfe, 0x00, 0x05, 0x70, 0x8f, 0x00, 0x07, 0x08, 0x0c, 0x4b, 0xf9, + 0x20, 0xa3, 0x11, 0x04, 0x20, 0xa3, 0x00, 0x00, 0x34, 0x30, 0x20, 0x11, + 0xbc, 0x8e, 0x08, 0x0c, 0x4c, 0x4a, 0x11, 0xa8, 0x70, 0x78, 0xa0, 0x05, + 0x11, 0x90, 0x71, 0x58, 0xa1, 0x86, 0xff, 0xff, 0x01, 0x70, 0xa1, 0x80, + 0x2d, 0xf9, 0x20, 0x0d, 0xa1, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0x08, 0x0c, + 0x4a, 0xe7, 0x01, 0x28, 0x08, 0x0c, 0x41, 0x1d, 0x01, 0x10, 0x08, 0x0c, + 0x28, 0x9c, 0x20, 0xa9, 0x00, 0x08, 0x22, 0x98, 0x26, 0xa0, 0x53, 0xa6, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, 0x00, 0x14, + 0x08, 0x0c, 0x4b, 0x55, 0x00, 0x05, 0x00, 0xf6, 0x70, 0x84, 0xa0, 0x05, + 0x01, 0xf0, 0x20, 0x11, 0x4b, 0x23, 0x08, 0x0c, 0x6a, 0x0e, 0xa0, 0x86, + 0x00, 0x14, 0x11, 0xa8, 0x20, 0x79, 0xbc, 0x80, 0x7a, 0x30, 0xa2, 0x96, + 0x11, 0x04, 0x11, 0x78, 0x78, 0x34, 0xa0, 0x05, 0x11, 0x60, 0x7a, 0x38, + 0xd2, 0xfc, 0x01, 0x28, 0x70, 0xb8, 0xa0, 0x05, 0x11, 0x10, 0x70, 0xbb, + 0x00, 0x01, 0x70, 0x8f, 0x00, 0x08, 0x00, 0x29, 0x00, 0x10, 0x08, 0x0c, + 0x4b, 0x7b, 0x00, 0xfe, 0x00, 0x05, 0x70, 0x8f, 0x00, 0x09, 0x08, 0x0c, + 0x4b, 0xf9, 0x20, 0xa3, 0x11, 0x05, 0x20, 0xa3, 0x01, 0x00, 0x34, 0x30, + 0x08, 0x0c, 0x4c, 0x4a, 0x11, 0x50, 0x70, 0x78, 0xa0, 0x05, 0x11, 0x38, + 0x08, 0x0c, 0x4a, 0x5c, 0x11, 0x70, 0xa0, 0x85, 0x00, 0x01, 0x08, 0x0c, + 0x28, 0x9c, 0x20, 0xa9, 0x00, 0x08, 0x20, 0x99, 0xbc, 0x8e, 0x26, 0xa0, + 0x53, 0xa6, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, + 0x00, 0x14, 0x08, 0x0c, 0x4b, 0x55, 0x00, 0x10, 0x08, 0x0c, 0x46, 0x73, + 0x00, 0x05, 0x00, 0xf6, 0x70, 0x84, 0xa0, 0x05, 0x05, 0x88, 0x20, 0x11, + 0x4b, 0x23, 0x08, 0x0c, 0x6a, 0x0e, 0xa0, 0x86, 0x00, 0x14, 0x15, 0x40, + 0x20, 0x79, 0xbc, 0x80, 0x7a, 0x30, 0xa2, 0x96, 0x11, 0x05, 0x15, 0x10, + 0x78, 0x34, 0x20, 0x11, 0x01, 0x00, 0xa2, 0x1e, 0x11, 0x60, 0x7a, 0x38, + 0xd2, 0xfc, 0x01, 0x28, 0x70, 0xb8, 0xa0, 0x05, 0x11, 0x10, 0x70, 0xbb, + 0x00, 0x01, 0x70, 0x8f, 0x00, 0x0a, 0x00, 0xb1, 0x00, 0x98, 0xa0, 0x05, + 0x11, 0x78, 0x7a, 0x38, 0xd2, 0xfc, 0x01, 0x28, 0x70, 0xb8, 0xa0, 0x05, + 0x11, 0x10, 0x70, 0xbb, 0x00, 0x01, 0x70, 0x8b, 0x00, 0x00, 0x70, 0x8f, + 0x00, 0x0e, 0x08, 0x0c, 0x48, 0x6e, 0x00, 0x10, 0x08, 0x0c, 0x4b, 0x7b, + 0x00, 0xfe, 0x00, 0x05, 0x70, 0x8f, 0x00, 0x0b, 0x20, 0x11, 0xbc, 0x0e, + 0x22, 0xa0, 0x20, 0xa9, 0x00, 0x40, 0x20, 0x19, 0xff, 0xff, 0x43, 0xa4, + 0x20, 0xa9, 0x00, 0x02, 0x20, 0x09, 0x00, 0x00, 0x41, 0xa4, 0x08, 0x0c, + 0x4b, 0xf9, 0x20, 0xa3, 0x11, 0x06, 0x20, 0xa3, 0x00, 0x00, 0x08, 0x0c, + 0x4c, 0x4a, 0x01, 0x18, 0x20, 0x13, 0x00, 0x00, 0x00, 0x20, 0x70, 0x54, + 0xa0, 0x85, 0x01, 0x00, 0x20, 0x12, 0x22, 0x98, 0x20, 0xa9, 0x00, 0x42, + 0x53, 0xa6, 0x60, 0xc3, 0x00, 0x84, 0x08, 0x0c, 0x4b, 0x55, 0x00, 0x05, + 0x00, 0xf6, 0x70, 0x84, 0xa0, 0x05, 0x01, 0xb0, 0x20, 0x11, 0x4b, 0x23, + 0x08, 0x0c, 0x6a, 0x0e, 0xa0, 0x86, 0x00, 0x84, 0x11, 0x68, 0x20, 0x79, + 0xbc, 0x80, 0x7a, 0x30, 0xa2, 0x96, 0x11, 0x06, 0x11, 0x38, 0x78, 0x34, + 0xa0, 0x05, 0x11, 0x20, 0x70, 0x8f, 0x00, 0x0c, 0x00, 0x29, 0x00, 0x10, + 0x08, 0x0c, 0x4b, 0x7b, 0x00, 0xfe, 0x00, 0x05, 0x70, 0x8f, 0x00, 0x0d, + 0x08, 0x0c, 0x4b, 0xf9, 0x20, 0xa3, 0x11, 0x07, 0x20, 0xa3, 0x00, 0x00, + 0x20, 0x99, 0xbc, 0x8e, 0x20, 0xa9, 0x00, 0x40, 0x53, 0xa6, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, 0x00, 0x84, 0x08, 0x0c, + 0x4b, 0x55, 0x00, 0x05, 0x00, 0xf6, 0x70, 0x84, 0xa0, 0x05, 0x01, 0xd0, + 0x20, 0x11, 0x4b, 0x23, 0x08, 0x0c, 0x6a, 0x0e, 0xa0, 0x86, 0x00, 0x84, + 0x11, 0x88, 0x20, 0x79, 0xbc, 0x80, 0x7a, 0x30, 0xa2, 0x96, 0x11, 0x07, + 0x11, 0x58, 0x78, 0x34, 0xa0, 0x05, 0x11, 0x40, 0x70, 0x8b, 0x00, 0x01, + 0x08, 0x0c, 0x4b, 0xeb, 0x70, 0x8f, 0x00, 0x0e, 0x00, 0x29, 0x00, 0x10, + 0x08, 0x0c, 0x4b, 0x7b, 0x00, 0xfe, 0x00, 0x05, 0x70, 0x8f, 0x00, 0x0f, + 0x70, 0x87, 0x00, 0x00, 0x60, 0x8b, 0xbc, 0x85, 0x60, 0x8f, 0xb5, 0xb5, + 0x60, 0x43, 0x00, 0x05, 0x60, 0x43, 0x00, 0x04, 0x20, 0x09, 0x07, 0xd0, + 0x20, 0x11, 0x4b, 0x23, 0x08, 0x0c, 0x6a, 0x02, 0x00, 0x05, 0x70, 0x84, + 0xa0, 0x05, 0x01, 0x20, 0x20, 0x11, 0x4b, 0x23, 0x08, 0x0c, 0x6a, 0x0e, + 0x00, 0x05, 0x70, 0x8f, 0x00, 0x11, 0x08, 0x0c, 0x4c, 0x4a, 0x11, 0xa0, + 0x71, 0x70, 0x81, 0xff, 0x01, 0x88, 0x20, 0x09, 0x00, 0x00, 0x70, 0x74, + 0xa0, 0x84, 0x00, 0xff, 0x08, 0x0c, 0x28, 0x52, 0xa1, 0x86, 0x00, 0x7e, + 0x01, 0x38, 0xa1, 0x86, 0x00, 0x80, 0x01, 0x20, 0x20, 0x11, 0xbc, 0x8e, + 0x08, 0x0c, 0x4a, 0xe7, 0x20, 0xe1, 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, + 0x20, 0x99, 0xbc, 0x80, 0x20, 0xa1, 0x02, 0x0b, 0x74, 0x84, 0xa4, 0x80, + 0x00, 0x18, 0xa0, 0x80, 0x00, 0x07, 0xa0, 0x84, 0x03, 0xf8, 0x80, 0x04, + 0x20, 0xa8, 0x53, 0xa6, 0x60, 0xc3, 0x00, 0x14, 0x08, 0x0c, 0x4b, 0x55, + 0x00, 0x05, 0x00, 0xf6, 0x70, 0x84, 0xa0, 0x05, 0x01, 0xf0, 0x20, 0x11, + 0x4b, 0x23, 0x08, 0x0c, 0x6a, 0x0e, 0xa0, 0x86, 0x00, 0x14, 0x11, 0xa8, + 0x20, 0x79, 0xbc, 0x80, 0x7a, 0x30, 0xa2, 0x96, 0x11, 0x03, 0x11, 0x78, + 0x78, 0x34, 0xa0, 0x05, 0x11, 0x60, 0x7a, 0x38, 0xd2, 0xfc, 0x01, 0x28, + 0x70, 0xb8, 0xa0, 0x05, 0x11, 0x10, 0x70, 0xbb, 0x00, 0x01, 0x70, 0x8f, + 0x00, 0x12, 0x00, 0x29, 0x00, 0x10, 0x08, 0x0c, 0x4b, 0x7b, 0x00, 0xfe, + 0x00, 0x05, 0x70, 0x8f, 0x00, 0x13, 0x08, 0x0c, 0x4c, 0x05, 0x20, 0xa3, + 0x11, 0x03, 0x20, 0xa3, 0x00, 0x00, 0x34, 0x30, 0x20, 0x11, 0xbc, 0x8e, + 0x08, 0x0c, 0x4c, 0x4a, 0x11, 0x60, 0x70, 0x78, 0xa0, 0x05, 0x11, 0x48, + 0x71, 0x50, 0xa1, 0x86, 0xff, 0xff, 0x01, 0x28, 0x08, 0x0c, 0x4a, 0xe7, + 0x01, 0x10, 0x08, 0x0c, 0x4c, 0x28, 0x20, 0xa9, 0x00, 0x08, 0x22, 0x98, + 0x26, 0xa0, 0x53, 0xa6, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x60, 0xc3, 0x00, 0x14, 0x08, 0x0c, 0x4b, 0x55, 0x00, 0x05, 0x00, 0xf6, + 0x70, 0x84, 0xa0, 0x05, 0x01, 0xf0, 0x20, 0x11, 0x4b, 0x23, 0x08, 0x0c, + 0x6a, 0x0e, 0xa0, 0x86, 0x00, 0x14, 0x11, 0xa8, 0x20, 0x79, 0xbc, 0x80, + 0x7a, 0x30, 0xa2, 0x96, 0x11, 0x04, 0x11, 0x78, 0x78, 0x34, 0xa0, 0x05, + 0x11, 0x60, 0x7a, 0x38, 0xd2, 0xfc, 0x01, 0x28, 0x70, 0xb8, 0xa0, 0x05, + 0x11, 0x10, 0x70, 0xbb, 0x00, 0x01, 0x70, 0x8f, 0x00, 0x14, 0x00, 0x29, + 0x00, 0x10, 0x08, 0x0c, 0x4b, 0x7b, 0x00, 0xfe, 0x00, 0x05, 0x70, 0x8f, + 0x00, 0x15, 0x08, 0x0c, 0x4c, 0x05, 0x20, 0xa3, 0x11, 0x04, 0x20, 0xa3, + 0x00, 0x00, 0x34, 0x30, 0x20, 0x11, 0xbc, 0x8e, 0x08, 0x0c, 0x4c, 0x4a, + 0x11, 0xa8, 0x70, 0x78, 0xa0, 0x05, 0x11, 0x90, 0x71, 0x58, 0xa1, 0x86, + 0xff, 0xff, 0x01, 0x70, 0xa1, 0x80, 0x2d, 0xf9, 0x20, 0x0d, 0xa1, 0x8c, + 0xff, 0x00, 0x81, 0x0f, 0x08, 0x0c, 0x4a, 0xe7, 0x01, 0x28, 0x08, 0x0c, + 0x41, 0x1d, 0x01, 0x10, 0x08, 0x0c, 0x28, 0x9c, 0x20, 0xa9, 0x00, 0x08, + 0x22, 0x98, 0x26, 0xa0, 0x53, 0xa6, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x60, 0xc3, 0x00, 0x14, 0x08, 0x0c, 0x4b, 0x55, 0x00, 0x05, + 0x00, 0xf6, 0x70, 0x84, 0xa0, 0x05, 0x05, 0xb8, 0x20, 0x11, 0x4b, 0x23, + 0x08, 0x0c, 0x6a, 0x0e, 0xa0, 0x86, 0x00, 0x14, 0x15, 0x70, 0x20, 0x79, + 0xbc, 0x80, 0x7a, 0x30, 0xa2, 0x96, 0x11, 0x05, 0x15, 0x40, 0x78, 0x34, + 0x20, 0x11, 0x01, 0x00, 0xa2, 0x1e, 0x11, 0x48, 0x7a, 0x38, 0xd2, 0xfc, + 0x01, 0x28, 0x70, 0xb8, 0xa0, 0x05, 0x11, 0x10, 0x70, 0xbb, 0x00, 0x01, + 0x00, 0x60, 0xa0, 0x05, 0x11, 0xc0, 0x7a, 0x38, 0xd2, 0xfc, 0x01, 0x28, + 0x70, 0xb8, 0xa0, 0x05, 0x11, 0x10, 0x70, 0xbb, 0x00, 0x01, 0x70, 0x8b, + 0x00, 0x00, 0x7a, 0x38, 0xd2, 0xf4, 0x01, 0x38, 0x20, 0x01, 0xb6, 0x74, + 0x20, 0x04, 0xd0, 0xa4, 0x11, 0x10, 0x70, 0xd7, 0x00, 0x08, 0x70, 0x8f, + 0x00, 0x16, 0x00, 0x29, 0x00, 0x10, 0x08, 0x0c, 0x4b, 0x7b, 0x00, 0xfe, + 0x00, 0x05, 0x20, 0xe1, 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, 0x20, 0x99, + 0xbc, 0x80, 0x20, 0xa1, 0x02, 0x0b, 0x20, 0xa9, 0x00, 0x0e, 0x53, 0xa6, + 0x34, 0x30, 0x20, 0x11, 0xbc, 0x8e, 0x70, 0x8f, 0x00, 0x17, 0x08, 0x0c, + 0x4c, 0x4a, 0x11, 0x50, 0x70, 0x78, 0xa0, 0x05, 0x11, 0x38, 0x08, 0x0c, + 0x4a, 0x5c, 0x11, 0x70, 0xa0, 0x85, 0x00, 0x01, 0x08, 0x0c, 0x28, 0x9c, + 0x20, 0xa9, 0x00, 0x08, 0x20, 0x99, 0xbc, 0x8e, 0x26, 0xa0, 0x53, 0xa6, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, 0x00, 0x14, + 0x08, 0x0c, 0x4b, 0x55, 0x00, 0x10, 0x08, 0x0c, 0x46, 0x73, 0x00, 0x05, + 0x00, 0xf6, 0x70, 0x84, 0xa0, 0x05, 0x01, 0xb0, 0x20, 0x11, 0x4b, 0x23, + 0x08, 0x0c, 0x6a, 0x0e, 0xa0, 0x86, 0x00, 0x84, 0x11, 0x68, 0x20, 0x79, + 0xbc, 0x80, 0x7a, 0x30, 0xa2, 0x96, 0x11, 0x06, 0x11, 0x38, 0x78, 0x34, + 0xa0, 0x05, 0x11, 0x20, 0x70, 0x8f, 0x00, 0x18, 0x00, 0x29, 0x00, 0x10, + 0x08, 0x0c, 0x4b, 0x7b, 0x00, 0xfe, 0x00, 0x05, 0x70, 0x8f, 0x00, 0x19, + 0x08, 0x0c, 0x4c, 0x05, 0x20, 0xa3, 0x11, 0x06, 0x20, 0xa3, 0x00, 0x00, + 0x34, 0x30, 0x20, 0x99, 0xbc, 0x8e, 0x20, 0x39, 0xbc, 0x0e, 0x27, 0xa0, + 0x20, 0xa9, 0x00, 0x40, 0x53, 0xa3, 0x08, 0x0c, 0x4c, 0x4a, 0x11, 0xe8, + 0x27, 0x28, 0x25, 0x14, 0x82, 0x07, 0xa0, 0x84, 0x00, 0xff, 0x80, 0x00, + 0x20, 0x18, 0xa2, 0x94, 0x00, 0xff, 0x80, 0x07, 0xa2, 0x05, 0x20, 0x2a, + 0x70, 0x54, 0x23, 0x10, 0x82, 0x14, 0xa2, 0xa0, 0xbc, 0x0e, 0x24, 0x14, + 0xa3, 0x8c, 0x00, 0x01, 0x01, 0x18, 0xa2, 0x94, 0xff, 0x00, 0x00, 0x18, + 0xa2, 0x94, 0x00, 0xff, 0x80, 0x07, 0xa2, 0x15, 0x22, 0x22, 0x27, 0x98, + 0x26, 0xa0, 0x20, 0xa9, 0x00, 0x40, 0x53, 0xa6, 0x20, 0xa3, 0x00, 0x00, + 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, 0x00, 0x84, 0x08, 0x0c, 0x4b, 0x55, + 0x00, 0x05, 0x00, 0xf6, 0x70, 0x84, 0xa0, 0x05, 0x01, 0xd0, 0x20, 0x11, + 0x4b, 0x23, 0x08, 0x0c, 0x6a, 0x0e, 0xa0, 0x86, 0x00, 0x84, 0x11, 0x88, + 0x20, 0x79, 0xbc, 0x80, 0x7a, 0x30, 0xa2, 0x96, 0x11, 0x07, 0x11, 0x58, + 0x78, 0x34, 0xa0, 0x05, 0x11, 0x40, 0x70, 0x8b, 0x00, 0x01, 0x08, 0x0c, + 0x4b, 0xeb, 0x70, 0x8f, 0x00, 0x1a, 0x00, 0x29, 0x00, 0x10, 0x08, 0x0c, + 0x4b, 0x7b, 0x00, 0xfe, 0x00, 0x05, 0x70, 0x8f, 0x00, 0x1b, 0x20, 0xe1, + 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, 0x20, 0x99, 0xbc, 0x80, 0x20, 0xa1, + 0x02, 0x0b, 0x74, 0x84, 0xa4, 0x80, 0x00, 0x18, 0xa0, 0x80, 0x00, 0x07, + 0xa0, 0x84, 0x03, 0xf8, 0x80, 0x04, 0x20, 0xa8, 0x53, 0xa6, 0x60, 0xc3, + 0x00, 0x84, 0x08, 0x0c, 0x4b, 0x55, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, + 0x00, 0x86, 0x00, 0x96, 0x20, 0x29, 0xb6, 0x53, 0x25, 0x2c, 0x20, 0xa9, + 0x00, 0x08, 0x20, 0x41, 0xbc, 0x0e, 0x28, 0xa0, 0x20, 0x99, 0xbc, 0x8e, + 0x53, 0xa3, 0x20, 0xa9, 0x00, 0x08, 0x20, 0x11, 0x00, 0x07, 0xd5, 0xd4, + 0x01, 0x10, 0x20, 0x11, 0x00, 0x00, 0x28, 0x00, 0xa2, 0x00, 0x20, 0x0c, + 0xa1, 0xa6, 0xff, 0xff, 0x11, 0x48, 0xd5, 0xd4, 0x01, 0x10, 0x82, 0x10, + 0x00, 0x08, 0x82, 0x11, 0x1f, 0x04, 0x4a, 0x71, 0x08, 0x04, 0x4a, 0xdf, + 0x82, 0xff, 0x11, 0x60, 0xd5, 0xd4, 0x01, 0x20, 0xa1, 0xa6, 0x3f, 0xff, + 0x0d, 0x90, 0x00, 0x20, 0xa1, 0xa6, 0x3f, 0xff, 0x09, 0x04, 0x4a, 0xdf, + 0xa1, 0x8d, 0xc0, 0x00, 0x20, 0xa9, 0x00, 0x10, 0x20, 0x19, 0x00, 0x01, + 0xd5, 0xd4, 0x01, 0x10, 0x20, 0x19, 0x00, 0x10, 0x21, 0x20, 0xd5, 0xd4, + 0x01, 0x10, 0x84, 0x23, 0x00, 0x08, 0x84, 0x24, 0x12, 0x40, 0xd5, 0xd4, + 0x01, 0x10, 0x83, 0x19, 0x00, 0x08, 0x83, 0x18, 0x1f, 0x04, 0x4a, 0x97, + 0x04, 0xd0, 0x23, 0xa8, 0x20, 0x21, 0x00, 0x01, 0x84, 0x26, 0x84, 0x25, + 0x1f, 0x04, 0x4a, 0xa9, 0x23, 0x28, 0x85, 0x29, 0xa2, 0xbe, 0x00, 0x07, + 0x01, 0x58, 0x00, 0x06, 0x20, 0x39, 0x00, 0x07, 0x22, 0x00, 0xa7, 0x3a, + 0x00, 0x0e, 0x27, 0xa8, 0xa5, 0xa8, 0x00, 0x10, 0x1f, 0x04, 0x4a, 0xb8, + 0x75, 0x52, 0xa5, 0xc8, 0x2d, 0xf9, 0x29, 0x2d, 0xa5, 0xac, 0x00, 0xff, + 0x75, 0x76, 0x65, 0x32, 0x65, 0x36, 0x00, 0x16, 0x25, 0x08, 0x08, 0x0c, + 0x28, 0x7c, 0x00, 0x1e, 0x60, 0xe7, 0x00, 0x00, 0x65, 0xea, 0x20, 0x18, + 0x23, 0x04, 0xa4, 0x05, 0x20, 0x1a, 0x70, 0x7b, 0x00, 0x01, 0x26, 0xa0, + 0x28, 0x98, 0x20, 0xa9, 0x00, 0x08, 0x53, 0xa6, 0x20, 0xa3, 0x00, 0x00, + 0x20, 0xa3, 0x00, 0x00, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x28, 0xa0, 0x06, + 0x00, 0x18, 0xa0, 0x06, 0x08, 0x0c, 0x15, 0x1a, 0x00, 0x9e, 0x00, 0x8e, + 0x00, 0x05, 0x21, 0x18, 0x20, 0x21, 0x00, 0x00, 0x20, 0x01, 0x00, 0x07, + 0xa3, 0x9a, 0x00, 0x10, 0x02, 0x18, 0x84, 0x20, 0x80, 0x01, 0x0c, 0xd0, + 0x21, 0x18, 0x84, 0xff, 0x01, 0x20, 0xa3, 0x9a, 0x00, 0x10, 0x84, 0x21, + 0x1d, 0xe0, 0x20, 0x21, 0x00, 0x01, 0x83, 0xff, 0x01, 0x18, 0x84, 0x23, + 0x83, 0x19, 0x1d, 0xe8, 0xa2, 0x38, 0x27, 0x04, 0xa4, 0x2c, 0x11, 0xb8, + 0xa4, 0x05, 0x20, 0x3a, 0x71, 0x52, 0xa1, 0xa0, 0x2d, 0xf9, 0x24, 0x2d, + 0xa5, 0xac, 0x00, 0xff, 0x75, 0x76, 0x65, 0x32, 0x65, 0x36, 0x00, 0x16, + 0x25, 0x08, 0x08, 0x0c, 0x28, 0x7c, 0x00, 0x1e, 0x60, 0xe7, 0x00, 0x00, + 0x65, 0xea, 0x70, 0x7b, 0x00, 0x01, 0xa0, 0x84, 0x00, 0x00, 0x00, 0x05, + 0x00, 0xe6, 0x20, 0x71, 0xb6, 0x00, 0x70, 0x7f, 0x00, 0x00, 0x00, 0xee, + 0x00, 0x05, 0x00, 0xe6, 0x00, 0xf6, 0x20, 0x79, 0x01, 0x00, 0x20, 0x71, + 0x01, 0x40, 0x08, 0x0c, 0x4c, 0x61, 0x08, 0x0c, 0x7d, 0xf3, 0x70, 0x04, + 0xa0, 0x84, 0x40, 0x00, 0x01, 0x20, 0x70, 0x03, 0x10, 0x00, 0x70, 0x03, + 0x00, 0x00, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0xb6, 0x23, + 0x20, 0x73, 0x00, 0x00, 0x78, 0x40, 0x00, 0x26, 0x00, 0x16, 0x20, 0x09, + 0x00, 0xf7, 0x08, 0x0c, 0x4c, 0x11, 0x00, 0x1e, 0xa0, 0x94, 0x00, 0x10, + 0xa2, 0x85, 0x00, 0x80, 0x78, 0x42, 0x7a, 0x42, 0x20, 0x09, 0x13, 0x88, + 0x20, 0x11, 0x5a, 0x14, 0x08, 0x0c, 0x6a, 0x94, 0x00, 0x2e, 0x01, 0x2e, + 0x00, 0xfe, 0x00, 0xee, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x11, 0xb8, 0xeb, 0x20, 0x13, 0x00, 0x00, 0x70, 0x87, 0x00, 0x00, + 0x01, 0x2e, 0x20, 0xe1, 0x90, 0x80, 0x60, 0xa3, 0x00, 0x56, 0x60, 0xa7, + 0x95, 0x75, 0x08, 0x0c, 0x7d, 0xea, 0x61, 0x44, 0xd1, 0x84, 0x01, 0x20, + 0x71, 0x8c, 0xa1, 0x8d, 0x20, 0x00, 0x00, 0x18, 0x71, 0x80, 0xa1, 0x8d, + 0x10, 0x00, 0x20, 0x11, 0xb8, 0xbf, 0x21, 0x12, 0x20, 0x09, 0x07, 0xd0, + 0x20, 0x11, 0x4b, 0x23, 0x08, 0x0c, 0x6a, 0x94, 0x00, 0x05, 0x00, 0x16, + 0x00, 0x26, 0x00, 0xc6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x11, + 0x00, 0x03, 0x08, 0x0c, 0x80, 0xfc, 0x20, 0x11, 0x00, 0x02, 0x08, 0x0c, + 0x81, 0x06, 0x08, 0x0c, 0x7f, 0xe0, 0x00, 0x36, 0x20, 0x19, 0x00, 0x00, + 0x08, 0x0c, 0x80, 0x6b, 0x00, 0x3e, 0x20, 0x09, 0x00, 0xf7, 0x08, 0x0c, + 0x4c, 0x11, 0x20, 0x61, 0xb8, 0xf4, 0x60, 0x1b, 0x00, 0x00, 0x60, 0x1f, + 0x00, 0x00, 0x20, 0x61, 0xb6, 0x00, 0x60, 0x03, 0x00, 0x01, 0x20, 0x61, + 0x01, 0x00, 0x60, 0x43, 0x00, 0x90, 0x60, 0x43, 0x00, 0x10, 0x20, 0x09, + 0xb8, 0xbf, 0x20, 0x0b, 0x00, 0x00, 0x20, 0x09, 0x00, 0x2d, 0x20, 0x11, + 0x4b, 0xb4, 0x08, 0x0c, 0x6a, 0x02, 0x01, 0x2e, 0x00, 0xce, 0x00, 0x2e, + 0x00, 0x1e, 0x00, 0x05, 0x00, 0xe6, 0x00, 0x06, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0x4c, 0x61, 0x20, 0x71, 0x01, 0x00, 0x08, 0x0c, + 0x7d, 0xf3, 0x20, 0x71, 0x01, 0x40, 0x70, 0x04, 0xa0, 0x84, 0x40, 0x00, + 0x01, 0x20, 0x70, 0x03, 0x10, 0x00, 0x70, 0x03, 0x00, 0x00, 0x08, 0x0c, + 0x5b, 0x49, 0x01, 0xa8, 0x08, 0x0c, 0x5b, 0x67, 0x11, 0x90, 0x20, 0x01, + 0xb8, 0x9e, 0x20, 0x03, 0xaa, 0xaa, 0x00, 0x16, 0x08, 0x0c, 0x29, 0x20, + 0x20, 0x01, 0xb8, 0x8f, 0x21, 0x02, 0x00, 0x1e, 0x20, 0x01, 0xb8, 0x9f, + 0x20, 0x03, 0x00, 0x00, 0x08, 0x0c, 0x5a, 0x79, 0x00, 0x30, 0x20, 0x01, + 0x00, 0x01, 0x08, 0x0c, 0x27, 0xf8, 0x08, 0x0c, 0x4b, 0x7b, 0x01, 0x2e, + 0x00, 0x0e, 0x00, 0xee, 0x00, 0x05, 0x20, 0xa9, 0x00, 0x40, 0x20, 0xa1, + 0xbd, 0xc0, 0x20, 0x99, 0xbc, 0x8e, 0x33, 0x04, 0x80, 0x07, 0x20, 0xa2, + 0x93, 0x98, 0x94, 0xa0, 0x1f, 0x04, 0x4b, 0xf1, 0x00, 0x05, 0x20, 0xe1, + 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, 0x20, 0x99, 0xbc, 0x00, 0x20, 0xa1, + 0x02, 0x0b, 0x20, 0xa9, 0x00, 0x0c, 0x53, 0xa6, 0x00, 0x05, 0x20, 0xe1, + 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, 0x20, 0x99, 0xbc, 0x80, 0x20, 0xa1, + 0x02, 0x0b, 0x20, 0xa9, 0x00, 0x0c, 0x53, 0xa6, 0x00, 0x05, 0x00, 0xc6, + 0x00, 0x06, 0x20, 0x61, 0x01, 0x00, 0x81, 0x0f, 0x20, 0x01, 0xb6, 0x31, + 0x20, 0x04, 0xa0, 0x05, 0x11, 0x38, 0x20, 0x01, 0xb6, 0x15, 0x20, 0x04, + 0xa0, 0x84, 0x00, 0xff, 0xa1, 0x05, 0x00, 0x10, 0xa1, 0x85, 0x00, 0xf7, + 0x60, 0x4a, 0x00, 0x0e, 0x00, 0xce, 0x00, 0x05, 0x00, 0x16, 0x00, 0x46, + 0x20, 0x01, 0xb6, 0x53, 0x20, 0x04, 0xd0, 0xa4, 0x01, 0x58, 0xa0, 0x06, + 0x20, 0x20, 0x20, 0x09, 0x00, 0x2a, 0x08, 0x0c, 0xb1, 0xa4, 0x20, 0x01, + 0xb6, 0x0c, 0x20, 0x0c, 0xc1, 0x95, 0x21, 0x02, 0x20, 0x19, 0x00, 0x2a, + 0x20, 0x09, 0x00, 0x00, 0x08, 0x0c, 0x2c, 0xa4, 0x00, 0x4e, 0x00, 0x1e, + 0x00, 0x05, 0x08, 0x0c, 0x4b, 0x7b, 0x70, 0x8f, 0x00, 0x00, 0x70, 0x87, + 0x00, 0x00, 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0xb6, 0x0c, 0x20, 0x04, + 0xd0, 0x9c, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x01, 0x01, 0x01, 0x20, 0x0c, + 0xa1, 0x8d, 0x00, 0x06, 0x21, 0x02, 0x01, 0x2e, 0x00, 0x1e, 0x00, 0x0e, + 0x00, 0x05, 0x20, 0x01, 0xb6, 0x0d, 0x20, 0x04, 0xd0, 0xbc, 0x01, 0x58, + 0x00, 0x26, 0x00, 0x36, 0x20, 0x11, 0x80, 0x17, 0x20, 0x01, 0xb8, 0xbf, + 0x20, 0x1c, 0x08, 0x0c, 0x3f, 0x13, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x05, + 0x01, 0x56, 0x20, 0xa9, 0x00, 0xff, 0x20, 0x09, 0xb7, 0x35, 0xa0, 0x06, + 0x20, 0x0a, 0x81, 0x08, 0x1f, 0x04, 0x4c, 0x78, 0x01, 0x5e, 0x00, 0x05, + 0x00, 0xd6, 0x00, 0x36, 0x01, 0x56, 0x01, 0x36, 0x01, 0x46, 0x20, 0x69, + 0xb6, 0x52, 0xa0, 0x06, 0x60, 0x02, 0x60, 0x07, 0x07, 0x07, 0x60, 0x0a, + 0x60, 0x0e, 0x60, 0x12, 0xa1, 0x98, 0x2d, 0xf9, 0x23, 0x1d, 0xa3, 0x9c, + 0x00, 0xff, 0x63, 0x16, 0x20, 0xa9, 0x00, 0x04, 0xac, 0x98, 0x00, 0x06, + 0x23, 0xa0, 0x40, 0xa4, 0x20, 0xa9, 0x00, 0x04, 0xac, 0x98, 0x00, 0x0a, + 0x23, 0xa0, 0x40, 0xa4, 0x60, 0x3e, 0x60, 0x42, 0x60, 0x4e, 0x60, 0x52, + 0x60, 0x56, 0x60, 0x5a, 0x60, 0x5e, 0x60, 0x62, 0x60, 0x66, 0x60, 0x6a, + 0x60, 0x6e, 0x60, 0x72, 0x60, 0x76, 0x60, 0x7a, 0x60, 0x7e, 0x60, 0x82, + 0x60, 0x86, 0x60, 0x8a, 0x60, 0x8e, 0x60, 0x92, 0x60, 0x96, 0x60, 0x9a, + 0x60, 0x9e, 0x60, 0xae, 0x61, 0xa2, 0x00, 0xd6, 0x60, 0xa4, 0xa0, 0x6d, + 0x01, 0x10, 0x08, 0x0c, 0x16, 0x14, 0x60, 0xa7, 0x00, 0x00, 0x60, 0xa8, + 0xa0, 0x6d, 0x01, 0x10, 0x08, 0x0c, 0x16, 0x14, 0x60, 0xab, 0x00, 0x00, + 0x00, 0xde, 0xa0, 0x06, 0x60, 0x4a, 0x68, 0x10, 0x60, 0x3a, 0x68, 0x0c, + 0x60, 0x46, 0x68, 0x14, 0xa0, 0x84, 0x00, 0xff, 0x60, 0x42, 0x01, 0x4e, + 0x01, 0x3e, 0x01, 0x5e, 0x00, 0x3e, 0x00, 0xde, 0x00, 0x05, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x69, 0x44, 0x6e, 0x48, 0xa6, 0x84, 0x3f, 0xff, + 0xa0, 0x82, 0x40, 0x00, 0x1a, 0x04, 0x4d, 0x8c, 0xa1, 0x8c, 0xff, 0x00, + 0x81, 0x0f, 0xa1, 0x82, 0x00, 0xff, 0x1a, 0x04, 0x4d, 0x91, 0x20, 0x01, + 0xb6, 0x0c, 0x20, 0x04, 0xa0, 0x84, 0x00, 0x03, 0x01, 0xc0, 0x20, 0x01, + 0xb6, 0x0c, 0x20, 0x04, 0xd0, 0x84, 0x19, 0x04, 0x4d, 0x74, 0xa1, 0x88, + 0xb7, 0x35, 0x21, 0x04, 0xa0, 0x65, 0x09, 0x04, 0x4d, 0x74, 0x60, 0x04, + 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x8e, 0x00, 0x06, 0x19, 0x04, 0x4d, 0x74, + 0x60, 0x00, 0xd0, 0xc4, 0x09, 0x04, 0x4d, 0x74, 0x00, 0x68, 0xa1, 0x88, + 0xb7, 0x35, 0x21, 0x04, 0xa0, 0x65, 0x09, 0x04, 0x4d, 0x59, 0x60, 0x04, + 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x8e, 0x00, 0x06, 0x19, 0x04, 0x4d, 0x5e, + 0x60, 0xa4, 0xa0, 0x0d, 0x01, 0x18, 0x08, 0x0c, 0x52, 0x46, 0x05, 0xd0, + 0x60, 0xa8, 0xa0, 0x0d, 0x01, 0x88, 0x08, 0x0c, 0x52, 0x91, 0x11, 0x70, + 0x69, 0x4c, 0xd1, 0xfc, 0x11, 0x18, 0x08, 0x0c, 0x4f, 0x50, 0x04, 0x48, + 0x08, 0x0c, 0x4e, 0xff, 0x69, 0x4c, 0xd1, 0xec, 0x15, 0x20, 0x08, 0x0c, + 0x51, 0x38, 0x04, 0x08, 0x69, 0x4c, 0xa1, 0x84, 0xa0, 0x00, 0x01, 0x78, + 0xd1, 0xec, 0x01, 0x40, 0xd1, 0xfc, 0x01, 0x18, 0x08, 0x0c, 0x51, 0x47, + 0x00, 0x28, 0x08, 0x0c, 0x51, 0x47, 0x00, 0x28, 0xd1, 0xfc, 0x01, 0x18, + 0x08, 0x0c, 0x4e, 0xff, 0x00, 0x70, 0x60, 0x50, 0xa0, 0x0d, 0x01, 0x30, + 0x2d, 0x00, 0x20, 0x0a, 0x68, 0x03, 0x00, 0x00, 0x60, 0x52, 0x00, 0x28, + 0x2d, 0x00, 0x60, 0x52, 0x60, 0x4e, 0x68, 0x03, 0x00, 0x00, 0x08, 0x0c, + 0x6d, 0x1c, 0xa0, 0x06, 0x01, 0x2e, 0x00, 0x05, 0x20, 0x01, 0x00, 0x05, + 0x20, 0x09, 0x00, 0x00, 0x04, 0xe0, 0x20, 0x01, 0x00, 0x28, 0x20, 0x09, + 0x00, 0x00, 0x04, 0xb8, 0xa0, 0x82, 0x00, 0x06, 0x12, 0x98, 0x20, 0x01, + 0xb6, 0x35, 0x20, 0x04, 0xd0, 0xac, 0x11, 0x58, 0x60, 0xa0, 0xd0, 0xbc, + 0x11, 0x40, 0x61, 0x00, 0xd1, 0xfc, 0x01, 0x28, 0x20, 0x01, 0x00, 0x29, + 0x20, 0x09, 0x10, 0x00, 0x04, 0x20, 0x20, 0x01, 0x00, 0x28, 0x00, 0xa8, + 0x20, 0x09, 0xb6, 0x0c, 0x21, 0x0c, 0xd1, 0x8c, 0x01, 0x18, 0x20, 0x01, + 0x00, 0x04, 0x00, 0x68, 0xd1, 0x84, 0x01, 0x18, 0x20, 0x01, 0x00, 0x04, + 0x00, 0x40, 0x20, 0x01, 0x00, 0x29, 0x61, 0x00, 0xd1, 0xfc, 0x01, 0x18, + 0x20, 0x09, 0x10, 0x00, 0x00, 0x60, 0x20, 0x09, 0x00, 0x00, 0x00, 0x48, + 0x20, 0x01, 0x00, 0x29, 0x20, 0x09, 0x00, 0x00, 0x00, 0x20, 0x20, 0x01, + 0x00, 0x29, 0x20, 0x09, 0x00, 0x00, 0xa0, 0x05, 0x01, 0x2e, 0x00, 0x05, + 0x00, 0xe6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x68, 0x44, 0x80, 0x07, + 0xa0, 0x84, 0x00, 0xff, 0x20, 0x08, 0xa1, 0x82, 0x00, 0xff, 0x1a, 0x04, + 0x4d, 0xeb, 0xa1, 0x88, 0xb7, 0x35, 0x21, 0x04, 0xa0, 0x65, 0x01, 0xc0, + 0x60, 0x04, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x8e, 0x00, 0x06, 0x11, 0xa8, + 0x2c, 0x70, 0x08, 0x0c, 0x86, 0x4e, 0x05, 0xe8, 0x2e, 0x00, 0x60, 0x1a, + 0x2d, 0x00, 0x60, 0x12, 0x60, 0x0b, 0xff, 0xff, 0x60, 0x1f, 0x00, 0x0a, + 0x20, 0x09, 0x00, 0x03, 0x08, 0x0c, 0x86, 0xd3, 0xa0, 0x06, 0x04, 0x60, + 0x20, 0x01, 0x00, 0x28, 0x04, 0x40, 0xa0, 0x82, 0x00, 0x06, 0x12, 0x98, + 0x20, 0x01, 0xb6, 0x35, 0x20, 0x04, 0xd0, 0xac, 0x11, 0x58, 0x60, 0xa0, + 0xd0, 0xbc, 0x11, 0x40, 0x61, 0x00, 0xd1, 0xfc, 0x09, 0xe8, 0x20, 0x01, + 0x00, 0x29, 0x20, 0x09, 0x10, 0x00, 0x00, 0xa8, 0x20, 0x01, 0x00, 0x28, + 0x00, 0x90, 0x20, 0x09, 0xb6, 0x0c, 0x21, 0x0c, 0xd1, 0x8c, 0x01, 0x18, + 0x20, 0x01, 0x00, 0x04, 0x00, 0x50, 0xd1, 0x84, 0x01, 0x18, 0x20, 0x01, + 0x00, 0x04, 0x00, 0x28, 0x20, 0x01, 0x00, 0x29, 0x00, 0x10, 0x20, 0x01, + 0x00, 0x29, 0xa0, 0x05, 0x01, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x20, 0x01, + 0x00, 0x2c, 0x0c, 0xc8, 0x00, 0xf6, 0x00, 0xe6, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x11, 0x00, 0x00, 0x20, 0x79, 0xb6, 0x00, 0x69, 0x44, + 0xa1, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0xa1, 0x82, 0x00, 0xff, 0x1a, 0x04, + 0x4e, 0xb6, 0x08, 0x0c, 0x50, 0x1b, 0x11, 0xa0, 0x60, 0x04, 0xa0, 0x84, + 0x00, 0xff, 0xa0, 0x82, 0x00, 0x06, 0x12, 0x70, 0x68, 0x64, 0xa0, 0xc6, + 0x00, 0x6f, 0x01, 0x50, 0x20, 0x01, 0xb6, 0x35, 0x20, 0x04, 0xd0, 0xac, + 0x19, 0x04, 0x4e, 0x9f, 0x60, 0xa0, 0xd0, 0xbc, 0x19, 0x04, 0x4e, 0x9f, + 0x68, 0x64, 0xa0, 0xc6, 0x00, 0x6f, 0x01, 0x18, 0x20, 0x08, 0x08, 0x04, + 0x4e, 0x68, 0x69, 0x68, 0x21, 0x40, 0xa1, 0x8c, 0xff, 0x00, 0x81, 0x0f, + 0x78, 0xd4, 0xd0, 0xac, 0x11, 0x18, 0xa1, 0x82, 0x00, 0x80, 0x06, 0xd0, + 0xa1, 0x82, 0x00, 0xff, 0x16, 0xb8, 0x6a, 0x70, 0x6b, 0x6c, 0x78, 0x70, + 0xa3, 0x06, 0x11, 0x60, 0x78, 0x74, 0xa2, 0x4e, 0x11, 0x18, 0x22, 0x08, + 0x23, 0x10, 0x04, 0x60, 0xa9, 0xcc, 0xff, 0x00, 0x11, 0x18, 0x22, 0x08, + 0x23, 0x10, 0x04, 0x30, 0x08, 0x0c, 0x3e, 0x0c, 0x2c, 0x70, 0x05, 0x50, + 0x20, 0x09, 0x00, 0x00, 0x20, 0x11, 0x00, 0x00, 0xa0, 0xc6, 0x40, 0x00, + 0x11, 0x60, 0x00, 0x06, 0x2e, 0x60, 0x08, 0x0c, 0x52, 0xbc, 0x11, 0x08, + 0xc1, 0x85, 0x70, 0x00, 0xd0, 0xbc, 0x01, 0x08, 0xc1, 0x8d, 0x00, 0x0e, + 0x00, 0x88, 0xa0, 0xc6, 0x40, 0x07, 0x11, 0x10, 0x24, 0x08, 0x00, 0x60, + 0xa0, 0xc6, 0x40, 0x08, 0x11, 0x18, 0x27, 0x08, 0x26, 0x10, 0x00, 0x30, + 0xa0, 0xc6, 0x40, 0x09, 0x11, 0x08, 0x00, 0x10, 0x20, 0x01, 0x40, 0x06, + 0x68, 0x66, 0x69, 0x6a, 0x6a, 0x6e, 0x20, 0x01, 0x00, 0x30, 0x04, 0x50, + 0x08, 0x0c, 0x86, 0x4e, 0x11, 0x38, 0x20, 0x01, 0x40, 0x05, 0x20, 0x09, + 0x00, 0x03, 0x20, 0x11, 0x00, 0x00, 0x0c, 0x80, 0x2e, 0x00, 0x60, 0x1a, + 0x08, 0x0c, 0xa0, 0xe3, 0x2d, 0x00, 0x60, 0x12, 0x60, 0x1f, 0x00, 0x01, + 0x68, 0x38, 0xd8, 0x8c, 0x01, 0x08, 0xc0, 0xf5, 0x68, 0x3a, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x2c, 0xd1, 0x01, 0x2e, 0x20, 0x01, + 0x00, 0x00, 0x08, 0x0c, 0x4f, 0x5d, 0x20, 0x01, 0x00, 0x02, 0x08, 0x0c, + 0x4f, 0x6f, 0x20, 0x09, 0x00, 0x02, 0x08, 0x0c, 0x86, 0xd3, 0xa0, 0x06, + 0xa0, 0x05, 0x01, 0x2e, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, 0x20, 0x01, + 0x00, 0x28, 0x20, 0x09, 0x00, 0x00, 0x0c, 0xb0, 0x20, 0x09, 0xb6, 0x0c, + 0x21, 0x0c, 0xd1, 0x8c, 0x01, 0x18, 0x20, 0x01, 0x00, 0x04, 0x00, 0x38, + 0xd1, 0x84, 0x01, 0x18, 0x20, 0x01, 0x00, 0x04, 0x00, 0x10, 0x20, 0x01, + 0x00, 0x29, 0x20, 0x09, 0x00, 0x00, 0x0c, 0x20, 0x20, 0x01, 0x00, 0x29, + 0x20, 0x09, 0x00, 0x00, 0x08, 0xf8, 0x69, 0x44, 0x6e, 0x48, 0xa6, 0x84, + 0x3f, 0xff, 0xa0, 0x82, 0x40, 0x00, 0x16, 0xb8, 0xa1, 0x8c, 0xff, 0x00, + 0x81, 0x0f, 0xa1, 0x82, 0x00, 0xff, 0x12, 0xe0, 0xa1, 0x88, 0xb7, 0x35, + 0x21, 0x04, 0xa0, 0x65, 0x01, 0xb8, 0x60, 0x04, 0xa0, 0x84, 0x00, 0xff, + 0xa0, 0x8e, 0x00, 0x06, 0x11, 0xb0, 0x68, 0x4c, 0xd0, 0xec, 0x01, 0x20, + 0x08, 0x0c, 0x51, 0x47, 0x04, 0x31, 0x00, 0x30, 0x04, 0x21, 0x68, 0x4c, + 0xd0, 0xfc, 0x01, 0x10, 0x08, 0x0c, 0x51, 0x38, 0x08, 0x0c, 0x51, 0x85, + 0xa0, 0x06, 0x00, 0xc8, 0x20, 0x01, 0x00, 0x28, 0x20, 0x09, 0x00, 0x00, + 0x00, 0xa0, 0xa0, 0x82, 0x00, 0x06, 0x12, 0x40, 0x61, 0x00, 0xd1, 0xfc, + 0x0d, 0x20, 0x20, 0x01, 0x00, 0x29, 0x20, 0x09, 0x10, 0x00, 0x00, 0x48, + 0x20, 0x01, 0x00, 0x29, 0x20, 0x09, 0x00, 0x00, 0x00, 0x20, 0x20, 0x01, + 0x00, 0x29, 0x20, 0x09, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x05, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x60, 0x50, 0xa0, 0x0d, 0x01, 0x38, 0x2d, 0x00, + 0x20, 0x0a, 0x68, 0x03, 0x00, 0x00, 0x60, 0x52, 0x01, 0x2e, 0x00, 0x05, + 0x2d, 0x00, 0x60, 0x52, 0x60, 0x4e, 0x68, 0x03, 0x00, 0x00, 0x0c, 0xc0, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x60, 0x4c, 0xa0, 0x05, 0x01, 0x70, + 0x00, 0xe6, 0x20, 0x71, 0xb8, 0xe1, 0x70, 0x04, 0xa0, 0x86, 0x00, 0x02, + 0x01, 0x68, 0x00, 0xee, 0x60, 0x4c, 0x68, 0x02, 0x2d, 0x00, 0x60, 0x4e, + 0x01, 0x2e, 0x00, 0x05, 0x2d, 0x00, 0x60, 0x52, 0x60, 0x4e, 0x68, 0x03, + 0x00, 0x00, 0x0c, 0xc0, 0x70, 0x1c, 0xac, 0x06, 0x1d, 0x80, 0x60, 0x4c, + 0x20, 0x70, 0x70, 0x00, 0x68, 0x02, 0x2d, 0x00, 0x70, 0x02, 0x00, 0xee, + 0x01, 0x2e, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x60, 0x4c, + 0xa0, 0x6d, 0x01, 0x30, 0x68, 0x00, 0xa0, 0x05, 0x11, 0x08, 0x60, 0x52, + 0x60, 0x4e, 0xad, 0x05, 0x01, 0x2e, 0x00, 0x05, 0x60, 0x4c, 0xa0, 0x6d, + 0x01, 0x30, 0x68, 0x00, 0xa0, 0x05, 0x11, 0x08, 0x60, 0x52, 0x60, 0x4e, + 0xad, 0x05, 0x00, 0x05, 0x68, 0x03, 0x00, 0x00, 0x60, 0x84, 0xa0, 0x0d, + 0x01, 0x20, 0x2d, 0x00, 0x20, 0x0a, 0x60, 0x86, 0x00, 0x05, 0x2d, 0x00, + 0x60, 0x86, 0x60, 0x82, 0x0c, 0xd8, 0x01, 0x26, 0x00, 0xc6, 0x00, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x62, 0x18, 0x22, 0x60, 0x62, 0x00, 0xa0, 0x05, + 0x01, 0x10, 0xc2, 0x85, 0x00, 0x08, 0xc2, 0x84, 0x62, 0x02, 0x00, 0x2e, + 0x00, 0xce, 0x01, 0x2e, 0x00, 0x05, 0x01, 0x26, 0x00, 0xc6, 0x20, 0x91, + 0x80, 0x00, 0x62, 0x18, 0x22, 0x60, 0x62, 0x04, 0x00, 0x06, 0xa0, 0x86, + 0x00, 0x06, 0x11, 0x80, 0x60, 0x9c, 0xd0, 0xac, 0x01, 0x68, 0x20, 0x01, + 0xb6, 0x53, 0x20, 0x04, 0xd0, 0xa4, 0x01, 0x40, 0xa2, 0x84, 0xff, 0x00, + 0x80, 0x07, 0xa0, 0x86, 0x00, 0x07, 0x11, 0x10, 0x20, 0x11, 0x06, 0x00, + 0x00, 0x0e, 0xa2, 0x94, 0xff, 0x00, 0xa2, 0x15, 0x62, 0x06, 0x00, 0x06, + 0xa0, 0x86, 0x00, 0x06, 0x11, 0x28, 0x62, 0x90, 0x82, 0xff, 0x11, 0x10, + 0x08, 0x0c, 0x15, 0x1a, 0x00, 0x0e, 0x00, 0xce, 0x01, 0x2e, 0x00, 0x05, + 0x01, 0x26, 0x00, 0xc6, 0x20, 0x91, 0x80, 0x00, 0x62, 0x18, 0x22, 0x60, + 0x62, 0x04, 0x00, 0x06, 0xa0, 0x86, 0x00, 0x06, 0x11, 0x78, 0x60, 0x9c, + 0xd0, 0xa4, 0x01, 0x60, 0x20, 0x01, 0xb6, 0x53, 0x20, 0x04, 0xd0, 0xac, + 0x11, 0x38, 0xa2, 0x84, 0x00, 0xff, 0xa0, 0x86, 0x00, 0x07, 0x11, 0x10, + 0x20, 0x11, 0x00, 0x06, 0x00, 0x0e, 0xa2, 0x94, 0x00, 0xff, 0x80, 0x07, + 0xa2, 0x15, 0x62, 0x06, 0x00, 0xce, 0x01, 0x2e, 0x00, 0x05, 0x00, 0x26, + 0xa1, 0x82, 0x00, 0xff, 0x02, 0x18, 0xa0, 0x85, 0x00, 0x01, 0x00, 0xb0, + 0xa1, 0x90, 0xb7, 0x35, 0x22, 0x04, 0xa0, 0x65, 0x11, 0x80, 0x00, 0x16, + 0x00, 0xd6, 0x08, 0x0c, 0x15, 0xe4, 0x2d, 0x60, 0x00, 0xde, 0x00, 0x1e, + 0x0d, 0x80, 0x2c, 0x00, 0x20, 0x12, 0x60, 0xa7, 0x00, 0x00, 0x60, 0xab, + 0x00, 0x00, 0x08, 0x0c, 0x4c, 0x7e, 0xa0, 0x06, 0x00, 0x2e, 0x00, 0x05, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0x26, 0xa1, 0x82, 0x00, 0xff, + 0x02, 0x18, 0xa0, 0x85, 0x00, 0x01, 0x04, 0x80, 0x00, 0xd6, 0xa1, 0x90, + 0xb7, 0x35, 0x22, 0x04, 0xa0, 0x6d, 0x05, 0x40, 0x20, 0x13, 0x00, 0x00, + 0x00, 0xd6, 0x00, 0xc6, 0x2d, 0x60, 0x60, 0xa4, 0xa0, 0x6d, 0x01, 0x10, + 0x08, 0x0c, 0x16, 0x14, 0x60, 0xa8, 0xa0, 0x6d, 0x01, 0x10, 0x08, 0x0c, + 0x16, 0x14, 0x00, 0xce, 0x00, 0xde, 0x00, 0xd6, 0x00, 0xc6, 0x68, 0xac, + 0x20, 0x60, 0x8c, 0xff, 0x01, 0x68, 0x60, 0x0c, 0x00, 0x06, 0x60, 0x10, + 0x20, 0x68, 0x08, 0x0c, 0x9d, 0x16, 0x01, 0x10, 0x08, 0x0c, 0x16, 0x24, + 0x08, 0x0c, 0x86, 0xa4, 0x00, 0xce, 0x0c, 0x88, 0x00, 0xce, 0x00, 0xde, + 0x08, 0x0c, 0x16, 0x14, 0x00, 0xde, 0xa0, 0x06, 0x00, 0x2e, 0x01, 0x2e, + 0x00, 0x05, 0x00, 0x16, 0xa1, 0x82, 0x00, 0xff, 0x02, 0x18, 0xa0, 0x85, + 0x00, 0x01, 0x00, 0x30, 0xa1, 0x88, 0xb7, 0x35, 0x21, 0x04, 0xa0, 0x65, + 0x0d, 0xc0, 0xa0, 0x06, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xd6, 0x01, 0x56, + 0x01, 0x36, 0x01, 0x46, 0x60, 0x0b, 0x00, 0x00, 0x60, 0x0f, 0x00, 0x00, + 0x60, 0x00, 0xc0, 0x8c, 0x60, 0x02, 0x08, 0x0c, 0x5b, 0x41, 0x15, 0x58, + 0x60, 0xa0, 0xa0, 0x86, 0x00, 0x7e, 0x20, 0x69, 0xbc, 0x90, 0x01, 0x30, + 0x20, 0x01, 0xb6, 0x35, 0x20, 0x04, 0xd0, 0xac, 0x15, 0x00, 0x00, 0x98, + 0x2d, 0x04, 0xd0, 0xe4, 0x01, 0xe0, 0x00, 0xd6, 0x20, 0x69, 0xbc, 0x8e, + 0x00, 0xc6, 0x20, 0x61, 0xb8, 0xb2, 0x68, 0x10, 0x20, 0x62, 0x68, 0x14, + 0x60, 0x06, 0x68, 0x18, 0x60, 0x0a, 0x68, 0x1c, 0x60, 0x0e, 0x00, 0xce, + 0x00, 0xde, 0x8d, 0x69, 0x2d, 0x04, 0x20, 0x69, 0x01, 0x40, 0xa0, 0x05, + 0x11, 0x10, 0x20, 0x01, 0x00, 0x01, 0x68, 0x86, 0x20, 0x69, 0xb6, 0x00, + 0x68, 0xa6, 0x20, 0x69, 0xbc, 0x8e, 0x68, 0x08, 0x60, 0x5e, 0x68, 0x10, + 0x60, 0x62, 0x61, 0x38, 0xa1, 0x0a, 0x02, 0x08, 0x60, 0x3a, 0x68, 0x14, + 0x60, 0x66, 0x20, 0x99, 0xbc, 0x96, 0xac, 0x88, 0x00, 0x0a, 0x21, 0xa0, + 0x20, 0xa9, 0x00, 0x04, 0x53, 0xa3, 0x20, 0x99, 0xbc, 0x9a, 0xac, 0x88, + 0x00, 0x06, 0x21, 0xa0, 0x20, 0xa9, 0x00, 0x04, 0x53, 0xa3, 0x20, 0x69, + 0xbc, 0xae, 0x68, 0x08, 0x60, 0x6a, 0x69, 0x0c, 0x61, 0x6e, 0x68, 0x10, + 0x60, 0x72, 0x68, 0x18, 0x60, 0x76, 0x60, 0xa0, 0xa0, 0x86, 0x00, 0x7e, + 0x11, 0x20, 0x20, 0x69, 0xbc, 0x8e, 0x69, 0x0c, 0x61, 0x6e, 0xa1, 0x82, + 0x02, 0x11, 0x12, 0x18, 0x20, 0x09, 0x00, 0x08, 0x04, 0x00, 0xa1, 0x82, + 0x02, 0x59, 0x12, 0x18, 0x20, 0x09, 0x00, 0x07, 0x00, 0xd0, 0xa1, 0x82, + 0x02, 0xc1, 0x12, 0x18, 0x20, 0x09, 0x00, 0x06, 0x00, 0xa0, 0xa1, 0x82, + 0x03, 0x49, 0x12, 0x18, 0x20, 0x09, 0x00, 0x05, 0x00, 0x70, 0xa1, 0x82, + 0x04, 0x21, 0x12, 0x18, 0x20, 0x09, 0x00, 0x04, 0x00, 0x40, 0xa1, 0x82, + 0x05, 0x81, 0x12, 0x18, 0x20, 0x09, 0x00, 0x03, 0x00, 0x10, 0x20, 0x09, + 0x00, 0x02, 0x61, 0x92, 0x01, 0x4e, 0x01, 0x3e, 0x01, 0x5e, 0x00, 0xde, + 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, 0x00, 0xe6, 0x20, 0x71, 0xbc, 0x8d, + 0x2e, 0x04, 0x68, 0x96, 0x20, 0x71, 0xbc, 0x8e, 0x70, 0x04, 0x68, 0x9a, + 0x70, 0x1c, 0x68, 0x9e, 0x6a, 0x00, 0x20, 0x09, 0xb6, 0x72, 0x21, 0x0c, + 0xd0, 0xbc, 0x01, 0x20, 0xd1, 0xec, 0x01, 0x10, 0xc2, 0xad, 0x00, 0x08, + 0xc2, 0xac, 0xd0, 0xc4, 0x01, 0x20, 0xd1, 0xe4, 0x01, 0x10, 0xc2, 0xbd, + 0x00, 0x08, 0xc2, 0xbc, 0x6a, 0x02, 0x00, 0xee, 0x00, 0x2e, 0x00, 0x1e, + 0x00, 0x05, 0x00, 0xd6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x60, 0xa4, + 0xa0, 0x6d, 0x01, 0xc0, 0x69, 0x00, 0x81, 0xff, 0x15, 0x40, 0x6a, 0x04, + 0xa2, 0x82, 0x00, 0x10, 0x16, 0x48, 0xad, 0x88, 0x00, 0x04, 0x20, 0xa9, + 0x00, 0x10, 0x21, 0x04, 0xa0, 0x86, 0xff, 0xff, 0x01, 0x28, 0x81, 0x08, + 0x1f, 0x04, 0x50, 0xf3, 0x08, 0x0c, 0x15, 0x1a, 0x26, 0x0a, 0x82, 0x10, + 0x6a, 0x06, 0x00, 0x98, 0x08, 0x0c, 0x15, 0xfd, 0x01, 0xa8, 0x2d, 0x00, + 0x60, 0xa6, 0x68, 0x03, 0x00, 0x00, 0xad, 0x88, 0x00, 0x04, 0x20, 0xa9, + 0x00, 0x10, 0x20, 0x0b, 0xff, 0xff, 0x81, 0x08, 0x1f, 0x04, 0x51, 0x0b, + 0x68, 0x07, 0x00, 0x01, 0x6e, 0x12, 0xa0, 0x85, 0x00, 0x01, 0x01, 0x2e, + 0x00, 0xde, 0x00, 0x05, 0xa0, 0x06, 0x0c, 0xd8, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x00, 0xd6, 0x60, 0xa4, 0xa0, 0x0d, 0x01, 0xa0, 0x21, 0x68, + 0x68, 0x00, 0xa0, 0x05, 0x11, 0x60, 0x08, 0x0c, 0x52, 0x46, 0x11, 0x68, + 0x20, 0x0b, 0xff, 0xff, 0x68, 0x04, 0xa0, 0x8a, 0x00, 0x02, 0x02, 0x18, + 0x80, 0x01, 0x68, 0x06, 0x00, 0x20, 0x08, 0x0c, 0x16, 0x14, 0x60, 0xa7, + 0x00, 0x00, 0x00, 0xde, 0x01, 0x2e, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0x52, 0xa4, 0x00, 0x10, 0x08, 0x0c, 0x4e, 0xff, + 0x08, 0x0c, 0x51, 0xbe, 0x1d, 0xd8, 0x08, 0x0c, 0x51, 0x85, 0x01, 0x2e, + 0x00, 0x05, 0x00, 0xd6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x60, 0xa8, + 0xa0, 0x6d, 0x01, 0xc0, 0x69, 0x50, 0x81, 0xff, 0x15, 0x40, 0x6a, 0x54, + 0xa2, 0x82, 0x00, 0x10, 0x16, 0x70, 0xad, 0x88, 0x00, 0x18, 0x20, 0xa9, + 0x00, 0x10, 0x21, 0x04, 0xa0, 0x86, 0xff, 0xff, 0x01, 0x28, 0x81, 0x08, + 0x1f, 0x04, 0x51, 0x59, 0x08, 0x0c, 0x15, 0x1a, 0x26, 0x0a, 0x82, 0x10, + 0x6a, 0x56, 0x00, 0x98, 0x08, 0x0c, 0x15, 0xfd, 0x01, 0xd0, 0x2d, 0x00, + 0x60, 0xaa, 0x68, 0x53, 0x00, 0x00, 0xad, 0x88, 0x00, 0x18, 0x20, 0xa9, + 0x00, 0x10, 0x20, 0x0b, 0xff, 0xff, 0x81, 0x08, 0x1f, 0x04, 0x51, 0x71, + 0x68, 0x57, 0x00, 0x01, 0x6e, 0x62, 0x00, 0x10, 0x08, 0x0c, 0x4f, 0x50, + 0x00, 0x89, 0x1d, 0xe0, 0xa0, 0x85, 0x00, 0x01, 0x01, 0x2e, 0x00, 0xde, + 0x00, 0x05, 0xa0, 0x06, 0x0c, 0xd8, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x08, 0x0c, 0x6d, 0x1c, 0x01, 0x2e, 0x00, 0x05, 0xa0, 0x1e, 0x00, 0x10, + 0x20, 0x19, 0x00, 0x01, 0xa0, 0x0e, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x60, 0x4c, 0x20, 0x68, 0x60, 0x00, 0xd0, 0xdc, 0x11, 0x70, 0x8d, 0xff, + 0x01, 0xf8, 0x83, 0xff, 0x01, 0x20, 0x68, 0x48, 0xa6, 0x06, 0x01, 0x58, + 0x00, 0x30, 0x68, 0x3c, 0xa4, 0x06, 0x11, 0x18, 0x68, 0x40, 0xa5, 0x06, + 0x01, 0x20, 0x2d, 0x08, 0x68, 0x00, 0x20, 0x68, 0x0c, 0x70, 0x08, 0x0c, + 0x81, 0xa5, 0x6a, 0x00, 0x60, 0x4c, 0xad, 0x06, 0x11, 0x10, 0x62, 0x4e, + 0x00, 0x18, 0xa1, 0x80, 0x00, 0x00, 0x22, 0x02, 0x82, 0xff, 0x11, 0x10, + 0x61, 0x52, 0x8d, 0xff, 0x01, 0x2e, 0x00, 0x05, 0xa0, 0x1e, 0x00, 0x10, + 0x20, 0x19, 0x00, 0x01, 0xa0, 0x0e, 0x60, 0x80, 0x20, 0x68, 0x8d, 0xff, + 0x01, 0xe8, 0x83, 0xff, 0x01, 0x20, 0x68, 0x48, 0xa6, 0x06, 0x01, 0x58, + 0x00, 0x30, 0x68, 0x3c, 0xa4, 0x06, 0x11, 0x18, 0x68, 0x40, 0xa5, 0x06, + 0x01, 0x20, 0x2d, 0x08, 0x68, 0x00, 0x20, 0x68, 0x0c, 0x70, 0x6a, 0x00, + 0x60, 0x80, 0xad, 0x06, 0x11, 0x10, 0x62, 0x82, 0x00, 0x18, 0xa1, 0x80, + 0x00, 0x00, 0x22, 0x02, 0x82, 0xff, 0x11, 0x10, 0x61, 0x86, 0x8d, 0xff, + 0x00, 0x05, 0xa0, 0x16, 0x08, 0x0c, 0x52, 0x40, 0x11, 0x10, 0x20, 0x11, + 0x00, 0x01, 0x08, 0x0c, 0x52, 0x8b, 0x11, 0x10, 0xa2, 0x95, 0x00, 0x02, + 0x00, 0x05, 0x08, 0x0c, 0x52, 0xbc, 0x01, 0x18, 0x08, 0x0c, 0x9d, 0xcb, + 0x00, 0x10, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x05, 0x08, 0x0c, 0x52, 0xbc, + 0x01, 0x18, 0x08, 0x0c, 0x9d, 0x5b, 0x00, 0x10, 0xa0, 0x85, 0x00, 0x01, + 0x00, 0x05, 0x08, 0x0c, 0x52, 0xbc, 0x01, 0x18, 0x08, 0x0c, 0x9d, 0xae, + 0x00, 0x10, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x05, 0x08, 0x0c, 0x52, 0xbc, + 0x01, 0x18, 0x08, 0x0c, 0x9d, 0x77, 0x00, 0x10, 0xa0, 0x85, 0x00, 0x01, + 0x00, 0x05, 0x08, 0x0c, 0x52, 0xbc, 0x01, 0x18, 0x08, 0x0c, 0x9d, 0xe7, + 0x00, 0x10, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x05, 0x01, 0x26, 0x00, 0x06, + 0x00, 0xd6, 0x20, 0x91, 0x80, 0x00, 0x60, 0x80, 0xa0, 0x6d, 0x01, 0xa0, + 0x68, 0x00, 0x00, 0x06, 0x68, 0x37, 0x01, 0x03, 0x6b, 0x4a, 0x68, 0x47, + 0x00, 0x00, 0x08, 0x0c, 0x9f, 0x88, 0x00, 0x06, 0x60, 0x00, 0xd0, 0xfc, + 0x01, 0x10, 0x08, 0x0c, 0xb4, 0x45, 0x00, 0x0e, 0x08, 0x0c, 0x54, 0x7a, + 0x00, 0x0e, 0x0c, 0x50, 0x60, 0x83, 0x00, 0x00, 0x60, 0x87, 0x00, 0x00, + 0x00, 0xde, 0x00, 0x0e, 0x01, 0x2e, 0x00, 0x05, 0x60, 0xa4, 0xa0, 0x0d, + 0x11, 0x18, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x05, 0x00, 0xe6, 0x21, 0x70, + 0x70, 0x00, 0xa0, 0x05, 0x11, 0x68, 0x20, 0xa9, 0x00, 0x10, 0xae, 0x88, + 0x00, 0x04, 0x21, 0x04, 0xa6, 0x06, 0x01, 0x30, 0x81, 0x08, 0x1f, 0x04, + 0x52, 0x4f, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x08, 0xa0, 0x06, 0x00, 0xee, + 0x00, 0x05, 0x00, 0xd6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x60, 0xa4, + 0xa0, 0x6d, 0x11, 0x28, 0x08, 0x0c, 0x15, 0xfd, 0x01, 0xa0, 0x2d, 0x00, + 0x60, 0xa6, 0x68, 0x03, 0x00, 0x01, 0x68, 0x07, 0x00, 0x00, 0xad, 0x88, + 0x00, 0x04, 0x20, 0xa9, 0x00, 0x10, 0x20, 0x0b, 0xff, 0xff, 0x81, 0x08, + 0x1f, 0x04, 0x52, 0x6f, 0xa0, 0x85, 0x00, 0x01, 0x01, 0x2e, 0x00, 0xde, + 0x00, 0x05, 0xa0, 0x06, 0x0c, 0xd8, 0x00, 0xd6, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x60, 0xa4, 0xa0, 0x6d, 0x01, 0x30, 0x60, 0xa7, 0x00, 0x00, + 0x08, 0x0c, 0x16, 0x14, 0xa0, 0x85, 0x00, 0x01, 0x01, 0x2e, 0x00, 0xde, + 0x00, 0x05, 0x60, 0xa8, 0xa0, 0x0d, 0x11, 0x18, 0xa0, 0x85, 0x00, 0x01, + 0x00, 0x05, 0x00, 0xe6, 0x21, 0x70, 0x70, 0x50, 0xa0, 0x05, 0x11, 0x60, + 0x20, 0xa9, 0x00, 0x10, 0xae, 0x88, 0x00, 0x18, 0x21, 0x04, 0xa6, 0x06, + 0x01, 0x28, 0x81, 0x08, 0x1f, 0x04, 0x52, 0x9a, 0xa0, 0x85, 0x00, 0x01, + 0x00, 0xee, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x0c, 0x19, + 0x11, 0x88, 0x20, 0x0b, 0xff, 0xff, 0x00, 0xd6, 0x60, 0xa8, 0x20, 0x68, + 0x68, 0x54, 0xa0, 0x8a, 0x00, 0x02, 0x02, 0x18, 0x80, 0x01, 0x68, 0x56, + 0x00, 0x20, 0x08, 0x0c, 0x16, 0x14, 0x60, 0xab, 0x00, 0x00, 0x00, 0xde, + 0x01, 0x2e, 0x00, 0x05, 0x60, 0x9c, 0xd0, 0xa4, 0x00, 0x05, 0x00, 0xf6, + 0x08, 0x0c, 0x5b, 0x41, 0x01, 0xb0, 0x71, 0xb8, 0x81, 0xff, 0x11, 0x98, + 0x71, 0xd4, 0xd1, 0x9c, 0x01, 0x80, 0x20, 0x01, 0x00, 0x7e, 0xa0, 0x80, + 0xb7, 0x35, 0x20, 0x04, 0xa0, 0x7d, 0x01, 0x48, 0x78, 0x04, 0xa0, 0x84, + 0x00, 0xff, 0xa0, 0x86, 0x00, 0x06, 0x11, 0x18, 0x78, 0x00, 0xc0, 0xed, + 0x78, 0x02, 0x20, 0x79, 0xb6, 0x52, 0x78, 0x04, 0xd0, 0xa4, 0x01, 0xe8, + 0x01, 0x56, 0x00, 0xc6, 0x20, 0xa9, 0x00, 0x7f, 0x20, 0x09, 0x00, 0x00, + 0x00, 0x16, 0x08, 0x0c, 0x50, 0x1b, 0x11, 0x68, 0x60, 0x04, 0xa0, 0x84, + 0xff, 0x00, 0x80, 0x07, 0xa0, 0x96, 0x00, 0x04, 0x01, 0x18, 0xa0, 0x86, + 0x00, 0x06, 0x11, 0x18, 0x60, 0x00, 0xc0, 0xed, 0x60, 0x02, 0x00, 0x1e, + 0x81, 0x08, 0x1f, 0x04, 0x52, 0xe4, 0x00, 0xce, 0x01, 0x5e, 0x08, 0x0c, + 0x53, 0x7b, 0x01, 0x20, 0x20, 0x01, 0xb8, 0xb5, 0x20, 0x0c, 0x00, 0x38, + 0x20, 0x79, 0xb6, 0x52, 0x78, 0x04, 0xd0, 0xa4, 0x01, 0x30, 0x20, 0x09, + 0x07, 0xd0, 0x20, 0x11, 0x53, 0x0f, 0x08, 0x0c, 0x6a, 0x94, 0x00, 0xfe, + 0x00, 0x05, 0x20, 0x11, 0x53, 0x0f, 0x08, 0x0c, 0x6a, 0x0e, 0x08, 0x0c, + 0x53, 0x7b, 0x01, 0xf0, 0x20, 0x01, 0xb7, 0xb3, 0x20, 0x04, 0xa0, 0x80, + 0x00, 0x00, 0x20, 0x0c, 0xc1, 0xec, 0x21, 0x02, 0x20, 0x01, 0xb6, 0x53, + 0x20, 0x04, 0xd0, 0xa4, 0x01, 0x30, 0x20, 0x09, 0x07, 0xd0, 0x20, 0x11, + 0x53, 0x0f, 0x08, 0x0c, 0x6a, 0x94, 0x00, 0xe6, 0x20, 0x71, 0xb6, 0x00, + 0x70, 0x73, 0x00, 0x00, 0x70, 0x77, 0x00, 0x00, 0x08, 0x0c, 0x2a, 0xed, + 0x00, 0xee, 0x04, 0xb0, 0x01, 0x56, 0x00, 0xc6, 0x20, 0xa9, 0x00, 0x7f, + 0x20, 0x09, 0x00, 0x00, 0x00, 0x16, 0x08, 0x0c, 0x50, 0x1b, 0x15, 0x30, + 0x60, 0x00, 0xd0, 0xec, 0x05, 0x18, 0x00, 0x46, 0x62, 0xa0, 0xa2, 0x94, + 0x00, 0xff, 0x82, 0x27, 0xa0, 0x06, 0x20, 0x09, 0x00, 0x29, 0x08, 0x0c, + 0xb1, 0xa4, 0x60, 0x00, 0xc0, 0xe5, 0xc0, 0xec, 0x60, 0x02, 0x60, 0x04, + 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x85, 0x07, 0x00, 0x60, 0x06, 0x20, 0x19, + 0x00, 0x29, 0x08, 0x0c, 0x6e, 0x67, 0x00, 0x76, 0x20, 0x39, 0x00, 0x00, + 0x08, 0x0c, 0x6d, 0x74, 0x20, 0x09, 0x00, 0x00, 0x08, 0x0c, 0xaf, 0x3e, + 0x00, 0x7e, 0x00, 0x4e, 0x00, 0x1e, 0x81, 0x08, 0x1f, 0x04, 0x53, 0x3a, + 0x00, 0xce, 0x01, 0x5e, 0x00, 0x05, 0x00, 0xc6, 0x60, 0x18, 0x20, 0x60, + 0x60, 0x00, 0xc0, 0xec, 0x60, 0x02, 0x00, 0xce, 0x00, 0x05, 0x78, 0x18, + 0x20, 0x04, 0xd0, 0xac, 0x00, 0x05, 0x78, 0x18, 0x20, 0x04, 0xd0, 0xbc, + 0x00, 0x05, 0x00, 0xf6, 0x20, 0x01, 0xb7, 0xb3, 0x20, 0x04, 0xa0, 0x7d, + 0x01, 0x10, 0x78, 0x00, 0xd0, 0xec, 0x00, 0xfe, 0x00, 0x05, 0x01, 0x26, + 0x00, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0x06, 0x62, 0xa0, 0xa2, 0x90, + 0xb7, 0x35, 0x22, 0x04, 0xac, 0x06, 0x19, 0x0c, 0x15, 0x1a, 0x00, 0x0e, + 0x62, 0x00, 0xa0, 0x05, 0x01, 0x10, 0xc2, 0xfd, 0x00, 0x08, 0xc2, 0xfc, + 0x62, 0x02, 0x00, 0x2e, 0x01, 0x2e, 0x00, 0x05, 0x20, 0x11, 0xb6, 0x35, + 0x22, 0x04, 0xd0, 0xcc, 0x01, 0x38, 0x20, 0x01, 0xb8, 0xb3, 0x20, 0x0c, + 0x20, 0x11, 0x53, 0xa9, 0x08, 0x0c, 0x6a, 0x94, 0x00, 0x05, 0x20, 0x11, + 0x53, 0xa9, 0x08, 0x0c, 0x6a, 0x0e, 0x20, 0x11, 0xb6, 0x35, 0x22, 0x04, + 0xc0, 0xcc, 0x20, 0x12, 0x00, 0x05, 0x20, 0x71, 0xb7, 0x14, 0x70, 0x03, + 0x00, 0x01, 0x70, 0x07, 0x00, 0x00, 0x70, 0x13, 0x00, 0x00, 0x70, 0x17, + 0x00, 0x00, 0x70, 0x1b, 0x00, 0x00, 0x70, 0x1f, 0x00, 0x00, 0x70, 0x0b, + 0x00, 0x00, 0x70, 0x4b, 0x00, 0x01, 0x70, 0x4f, 0x00, 0x00, 0x70, 0x5b, + 0x00, 0x20, 0x70, 0x5f, 0x00, 0x40, 0x70, 0x7f, 0x00, 0x00, 0x20, 0x71, + 0xb8, 0x7d, 0x70, 0x03, 0xb7, 0x14, 0x70, 0x07, 0x00, 0x00, 0x70, 0x0b, + 0x00, 0x00, 0x70, 0x0f, 0xb8, 0x5d, 0x70, 0x13, 0x00, 0x20, 0x70, 0x17, + 0x00, 0x40, 0x70, 0x37, 0x00, 0x00, 0x00, 0x05, 0x00, 0x16, 0x00, 0xe6, + 0x20, 0x71, 0xb8, 0x35, 0xa0, 0x0e, 0x71, 0x86, 0x71, 0x8a, 0x70, 0x97, + 0x00, 0x01, 0x20, 0x01, 0xb6, 0x53, 0x20, 0x04, 0xd0, 0xfc, 0x11, 0x50, + 0x20, 0x01, 0xb6, 0x53, 0x20, 0x04, 0xa0, 0x0e, 0xd0, 0x9c, 0x01, 0x08, + 0x81, 0x08, 0x71, 0x02, 0x08, 0x04, 0x54, 0x44, 0x20, 0x01, 0xb6, 0x72, + 0x20, 0x0c, 0xa1, 0x84, 0x00, 0x0f, 0x20, 0x09, 0xb6, 0x73, 0x21, 0x0c, + 0x00, 0x02, 0x53, 0xec, 0x54, 0x1f, 0x54, 0x26, 0x54, 0x30, 0x54, 0x35, + 0x53, 0xec, 0x53, 0xec, 0x53, 0xec, 0x54, 0x0f, 0x53, 0xec, 0x53, 0xec, + 0x53, 0xec, 0x53, 0xec, 0x53, 0xec, 0x53, 0xec, 0x53, 0xec, 0x70, 0x03, + 0x00, 0x04, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x20, 0x99, 0xb6, 0x76, + 0x20, 0xa1, 0xb8, 0x86, 0x20, 0xa9, 0x00, 0x04, 0x53, 0xa3, 0x01, 0x5e, + 0x01, 0x4e, 0x01, 0x3e, 0x04, 0x28, 0x70, 0x8f, 0x00, 0x05, 0x70, 0x07, + 0x01, 0x22, 0x20, 0x01, 0x00, 0x02, 0x00, 0x30, 0x70, 0x8f, 0x00, 0x02, + 0x70, 0x07, 0x01, 0x21, 0x20, 0x01, 0x00, 0x03, 0x70, 0x02, 0x70, 0x97, + 0x00, 0x01, 0x00, 0x88, 0x70, 0x07, 0x01, 0x22, 0x20, 0x01, 0x00, 0x02, + 0x00, 0x20, 0x70, 0x07, 0x01, 0x21, 0x20, 0x01, 0x00, 0x03, 0x70, 0x02, + 0xa0, 0x06, 0x70, 0x96, 0x70, 0x8e, 0xa1, 0x84, 0xff, 0x00, 0x80, 0x07, + 0x70, 0x9a, 0xa1, 0x84, 0x00, 0xff, 0x70, 0x92, 0x00, 0xee, 0x00, 0x1e, + 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0xb7, 0x14, 0x68, 0x4c, 0xa0, 0x05, + 0x11, 0x30, 0x70, 0x28, 0xc0, 0x85, 0x70, 0x2a, 0xa0, 0x85, 0x00, 0x01, + 0x04, 0x28, 0x6a, 0x60, 0x72, 0x36, 0x6b, 0x64, 0x73, 0x3a, 0x68, 0x68, + 0x70, 0x3e, 0x70, 0x76, 0x68, 0x6c, 0x70, 0x42, 0x70, 0x7a, 0x68, 0x4c, + 0x70, 0x2e, 0x68, 0x44, 0x70, 0x32, 0x20, 0x09, 0x00, 0x0d, 0x20, 0x0a, + 0x70, 0x0b, 0x00, 0x00, 0x80, 0x07, 0x80, 0x06, 0x80, 0x06, 0xa0, 0x8c, + 0x00, 0x3f, 0xa0, 0x84, 0xff, 0xc0, 0xa2, 0x10, 0x21, 0x00, 0xa3, 0x19, + 0x72, 0x6e, 0x73, 0x72, 0x70, 0x28, 0xc0, 0x84, 0x70, 0x2a, 0x70, 0x07, + 0x00, 0x01, 0xa0, 0x06, 0x00, 0xee, 0x00, 0x05, 0x01, 0x56, 0x00, 0xe6, + 0x00, 0x26, 0x68, 0x38, 0xd0, 0xfc, 0x19, 0x04, 0x54, 0xd3, 0x68, 0x04, + 0xa0, 0x0d, 0x01, 0x88, 0x00, 0xd6, 0x20, 0x71, 0xb6, 0x00, 0xa0, 0x16, + 0x70, 0x2c, 0x21, 0x68, 0x69, 0x04, 0x20, 0x6a, 0x82, 0x10, 0x2d, 0x00, + 0x81, 0xff, 0x1d, 0xc8, 0x70, 0x2e, 0x70, 0xb4, 0xa2, 0x00, 0x70, 0xb6, + 0x00, 0xde, 0x20, 0x71, 0xb7, 0x14, 0x70, 0x1c, 0xa0, 0x05, 0x19, 0x04, + 0x54, 0xe3, 0x20, 0xa9, 0x00, 0x32, 0x0f, 0x04, 0x54, 0xe1, 0x0e, 0x04, + 0x54, 0x9d, 0x20, 0x71, 0xb8, 0x35, 0x72, 0x00, 0x82, 0xff, 0x05, 0xd8, + 0x69, 0x34, 0xa1, 0x86, 0x01, 0x03, 0x19, 0x04, 0x54, 0xf1, 0x69, 0x48, + 0x68, 0x44, 0xa1, 0x05, 0x15, 0x40, 0x20, 0x09, 0x80, 0x20, 0x22, 0x00, + 0x00, 0x02, 0x54, 0xe1, 0x54, 0xb8, 0x55, 0x09, 0x55, 0x15, 0x54, 0xe1, + 0x20, 0x71, 0x00, 0x00, 0x20, 0xa9, 0x00, 0x32, 0x0f, 0x04, 0x54, 0xe1, + 0x70, 0x18, 0xd0, 0x84, 0x1d, 0xd8, 0x71, 0x22, 0x68, 0x3c, 0x70, 0x26, + 0x68, 0x40, 0x70, 0x2a, 0x70, 0x1b, 0x00, 0x01, 0x20, 0x91, 0x40, 0x80, + 0x20, 0x71, 0xb6, 0x00, 0x70, 0x2c, 0x20, 0x6a, 0x2d, 0x00, 0x70, 0x2e, + 0x70, 0xb4, 0x80, 0x00, 0x70, 0xb6, 0x00, 0x2e, 0x00, 0xee, 0x01, 0x5e, + 0x00, 0x05, 0x68, 0x44, 0xa0, 0x86, 0x01, 0x00, 0x11, 0x30, 0x68, 0x68, + 0xa0, 0x05, 0x11, 0x18, 0x20, 0x09, 0x80, 0x20, 0x08, 0x80, 0x20, 0x71, + 0xb7, 0x14, 0x2d, 0x08, 0x20, 0x6b, 0x00, 0x00, 0x70, 0x10, 0x80, 0x00, + 0x70, 0x12, 0x70, 0x18, 0xa0, 0x6d, 0x71, 0x1a, 0x01, 0x10, 0x69, 0x02, + 0x00, 0x08, 0x71, 0x1e, 0x0c, 0x10, 0xa1, 0x8c, 0x00, 0xff, 0xa1, 0x86, + 0x00, 0x17, 0x01, 0x30, 0xa1, 0x86, 0x00, 0x1e, 0x01, 0x18, 0xa1, 0x8e, + 0x00, 0x1f, 0x1d, 0x28, 0x68, 0x4c, 0xd0, 0xcc, 0x0d, 0x10, 0x68, 0x50, + 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, 0x00, 0x01, 0x19, 0xe0, 0x20, 0x09, + 0x80, 0x21, 0x08, 0x04, 0x54, 0xb1, 0x70, 0x84, 0x80, 0x08, 0xa0, 0x92, + 0x00, 0x1e, 0x1a, 0x98, 0x71, 0x86, 0xae, 0x90, 0x00, 0x03, 0xa2, 0x10, + 0x68, 0x3c, 0x20, 0x12, 0x00, 0x78, 0x70, 0x84, 0x80, 0x08, 0xa0, 0x92, + 0x00, 0x0f, 0x1a, 0x38, 0x71, 0x86, 0xae, 0x90, 0x00, 0x03, 0x80, 0x03, + 0xa2, 0x10, 0x68, 0x3c, 0x20, 0x12, 0x82, 0x10, 0x68, 0x40, 0x20, 0x12, + 0x70, 0x88, 0xa1, 0x0a, 0x0a, 0x04, 0x54, 0xca, 0x71, 0x8c, 0x70, 0x84, + 0xa1, 0x0a, 0x0a, 0x04, 0x54, 0xca, 0x20, 0x71, 0x00, 0x00, 0x70, 0x18, + 0xd0, 0x84, 0x19, 0x04, 0x54, 0xca, 0x20, 0x71, 0xb8, 0x35, 0x70, 0x00, + 0xa0, 0x86, 0x00, 0x02, 0x11, 0x50, 0x08, 0x0c, 0x57, 0x94, 0x20, 0x71, + 0x00, 0x00, 0x70, 0x1b, 0x00, 0x01, 0x20, 0x91, 0x40, 0x80, 0x08, 0x04, + 0x54, 0xca, 0x08, 0x0c, 0x57, 0xbe, 0x20, 0x71, 0x00, 0x00, 0x70, 0x1b, + 0x00, 0x01, 0x20, 0x91, 0x40, 0x80, 0x08, 0x04, 0x54, 0xca, 0x00, 0x06, + 0x68, 0x4c, 0x00, 0x06, 0x68, 0x37, 0x01, 0x03, 0x20, 0xa9, 0x00, 0x1c, + 0xad, 0x80, 0x00, 0x11, 0x20, 0xa0, 0x20, 0x01, 0x00, 0x00, 0x40, 0xa4, + 0x00, 0x0e, 0xa0, 0x84, 0x00, 0xff, 0x68, 0x4e, 0x00, 0x0e, 0x68, 0x4a, + 0x69, 0x52, 0x00, 0x05, 0x20, 0x71, 0xb7, 0x14, 0x70, 0x04, 0x00, 0x02, + 0x55, 0x70, 0x55, 0x81, 0x57, 0x7f, 0x57, 0x80, 0x57, 0x8d, 0x57, 0x93, + 0x55, 0x71, 0x57, 0x70, 0x57, 0x06, 0x57, 0x5c, 0x00, 0x05, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x0e, 0x04, 0x55, 0x80, 0x20, 0x09, 0x00, 0x0d, + 0x70, 0x30, 0x20, 0x0a, 0x20, 0x91, 0x40, 0x80, 0x70, 0x07, 0x00, 0x01, + 0x70, 0x0b, 0x00, 0x00, 0x01, 0x2e, 0x20, 0x69, 0xb8, 0xf4, 0x68, 0x3c, + 0xa0, 0x05, 0x03, 0xf8, 0x11, 0xf0, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x69, 0x00, 0x00, 0x69, 0x34, 0x20, 0x01, 0xb7, 0x20, 0x20, 0x04, + 0xa1, 0x0a, 0x01, 0x70, 0x0e, 0x04, 0x55, 0xa4, 0x20, 0x69, 0x00, 0x00, + 0x68, 0x18, 0xd0, 0x84, 0x11, 0x58, 0x20, 0x09, 0x80, 0x40, 0x69, 0x22, + 0x68, 0x1b, 0x00, 0x01, 0x20, 0x91, 0x40, 0x80, 0x20, 0x69, 0xb8, 0xf4, + 0x68, 0x3f, 0xff, 0xff, 0x01, 0x2e, 0x20, 0x69, 0xb6, 0x00, 0x68, 0x48, + 0x69, 0x68, 0xa1, 0x02, 0x20, 0x69, 0xb8, 0x35, 0x68, 0x8a, 0x69, 0x84, + 0x70, 0x1c, 0xa0, 0x6d, 0x01, 0x20, 0x81, 0xff, 0x09, 0x04, 0x55, 0xfa, + 0x00, 0xa0, 0x81, 0xff, 0x09, 0x04, 0x56, 0xc0, 0x20, 0x71, 0xb8, 0x35, + 0x71, 0x84, 0x70, 0x88, 0xa1, 0x0a, 0x12, 0x58, 0x71, 0x90, 0x20, 0x71, + 0xb8, 0xf4, 0x70, 0x38, 0xa0, 0x05, 0x01, 0x28, 0x1b, 0x04, 0x56, 0xc0, + 0x71, 0x3a, 0x08, 0x04, 0x56, 0xc0, 0x20, 0x71, 0xb8, 0x35, 0x71, 0x8c, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x70, 0x84, 0xa1, 0x0a, 0x0a, 0x04, + 0x56, 0xdb, 0x0e, 0x04, 0x56, 0x7c, 0x20, 0x71, 0x00, 0x00, 0x70, 0x18, + 0xd0, 0x84, 0x19, 0x04, 0x56, 0x7c, 0x20, 0x01, 0xff, 0xff, 0x20, 0x71, + 0xb8, 0xf4, 0x70, 0x3a, 0x20, 0x71, 0xb8, 0x35, 0x70, 0x00, 0xa0, 0x86, + 0x00, 0x02, 0x11, 0x50, 0x08, 0x0c, 0x57, 0x94, 0x20, 0x71, 0x00, 0x00, + 0x70, 0x1b, 0x00, 0x01, 0x20, 0x91, 0x40, 0x80, 0x08, 0x04, 0x56, 0x7c, + 0x08, 0x0c, 0x57, 0xbe, 0x20, 0x71, 0x00, 0x00, 0x70, 0x1b, 0x00, 0x01, + 0x20, 0x91, 0x40, 0x80, 0x08, 0x04, 0x56, 0x7c, 0x20, 0x71, 0xb8, 0x35, + 0x70, 0x00, 0xa0, 0x05, 0x09, 0x04, 0x56, 0xa2, 0x69, 0x34, 0xa1, 0x86, + 0x01, 0x03, 0x19, 0x04, 0x56, 0x7f, 0x68, 0x4c, 0xd0, 0xbc, 0x19, 0x04, + 0x56, 0xa2, 0x69, 0x48, 0x68, 0x44, 0xa1, 0x05, 0x19, 0x04, 0x56, 0x97, + 0x20, 0x09, 0x80, 0x20, 0x20, 0x71, 0xb8, 0x35, 0x70, 0x00, 0x00, 0x02, + 0x56, 0xa2, 0x56, 0x62, 0x56, 0x3a, 0x56, 0x4c, 0x56, 0x19, 0x01, 0x36, + 0x01, 0x46, 0x01, 0x56, 0x20, 0x99, 0xb6, 0x76, 0x20, 0xa1, 0xb8, 0x86, + 0x20, 0xa9, 0x00, 0x04, 0x53, 0xa3, 0x01, 0x5e, 0x01, 0x4e, 0x01, 0x3e, + 0x20, 0x71, 0xb8, 0x7d, 0xad, 0x80, 0x00, 0x0f, 0x70, 0x0e, 0x70, 0x13, + 0x00, 0x02, 0x70, 0x07, 0x00, 0x02, 0x70, 0x0b, 0x00, 0x00, 0x2e, 0x10, + 0x08, 0x0c, 0x16, 0x48, 0x20, 0x71, 0xb7, 0x14, 0x70, 0x07, 0x00, 0x09, + 0x08, 0x04, 0x56, 0xc0, 0x70, 0x84, 0x80, 0x08, 0xa0, 0x92, 0x00, 0x1e, + 0x1a, 0x04, 0x56, 0xc0, 0xae, 0x90, 0x00, 0x03, 0xa2, 0x10, 0x68, 0x3c, + 0x20, 0x12, 0x71, 0x86, 0x20, 0x71, 0xb7, 0x14, 0x08, 0x0c, 0x58, 0x15, + 0x08, 0x04, 0x56, 0xc0, 0x70, 0x84, 0x80, 0x08, 0xa0, 0x92, 0x00, 0x0f, + 0x1a, 0x04, 0x56, 0xc0, 0xae, 0x90, 0x00, 0x03, 0x80, 0x03, 0xa2, 0x10, + 0x68, 0x3c, 0x20, 0x12, 0x82, 0x10, 0x68, 0x40, 0x20, 0x12, 0x71, 0x86, + 0x20, 0x71, 0xb7, 0x14, 0x08, 0x0c, 0x58, 0x15, 0x08, 0x04, 0x56, 0xc0, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x0e, 0x04, 0x56, 0x7c, 0x20, 0x71, + 0x00, 0x00, 0x70, 0x18, 0xd0, 0x84, 0x11, 0x80, 0x71, 0x22, 0x68, 0x3c, + 0x70, 0x26, 0x68, 0x40, 0x70, 0x2a, 0x70, 0x1b, 0x00, 0x01, 0x20, 0x91, + 0x40, 0x80, 0x01, 0x2e, 0x20, 0x71, 0xb7, 0x14, 0x08, 0x0c, 0x58, 0x15, + 0x08, 0x04, 0x56, 0xc0, 0x01, 0x2e, 0x08, 0x04, 0x56, 0xc0, 0xa1, 0x8c, + 0x00, 0xff, 0xa1, 0x86, 0x00, 0x17, 0x01, 0x30, 0xa1, 0x86, 0x00, 0x1e, + 0x01, 0x18, 0xa1, 0x8e, 0x00, 0x1f, 0x11, 0xc0, 0x68, 0x4c, 0xd0, 0xcc, + 0x01, 0xa8, 0x68, 0x50, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, 0x00, 0x01, + 0x11, 0x78, 0x20, 0x09, 0x80, 0x21, 0x08, 0x04, 0x56, 0x10, 0x68, 0x44, + 0xa0, 0x86, 0x01, 0x00, 0x11, 0x38, 0x68, 0x68, 0xa0, 0x05, 0x11, 0x20, + 0x20, 0x09, 0x80, 0x20, 0x08, 0x04, 0x56, 0x10, 0x20, 0x71, 0xb7, 0x14, + 0x08, 0x0c, 0x58, 0x27, 0x01, 0xc8, 0x20, 0x71, 0xb7, 0x14, 0x70, 0x0f, + 0x00, 0x01, 0x69, 0x34, 0xa1, 0x84, 0x00, 0xff, 0xa0, 0x86, 0x00, 0x03, + 0x11, 0x30, 0x81, 0x0f, 0xa1, 0x8c, 0x00, 0xff, 0x81, 0x01, 0x01, 0x08, + 0x71, 0x0e, 0x70, 0x07, 0x00, 0x03, 0x08, 0x0c, 0x58, 0x40, 0x70, 0x50, + 0xa0, 0x86, 0x01, 0x00, 0x09, 0x04, 0x57, 0x80, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x71, 0xb7, 0x14, 0x70, 0x08, 0xa0, 0x86, 0x00, 0x01, + 0x11, 0x80, 0x0e, 0x04, 0x56, 0xd9, 0x20, 0x09, 0x00, 0x0d, 0x70, 0x30, + 0x20, 0x0a, 0x20, 0x91, 0x40, 0x80, 0x70, 0x0b, 0x00, 0x00, 0x70, 0x04, + 0xa0, 0x86, 0x00, 0x06, 0x11, 0x10, 0x70, 0x07, 0x00, 0x01, 0x01, 0x2e, + 0x00, 0x05, 0x20, 0x71, 0xb7, 0x14, 0x08, 0x0c, 0x58, 0x27, 0x05, 0x18, + 0x20, 0x71, 0xb8, 0x35, 0x70, 0x84, 0x70, 0x0a, 0x20, 0xa9, 0x00, 0x20, + 0x20, 0x99, 0xb8, 0x36, 0x20, 0xa1, 0xb8, 0x5d, 0x53, 0xa3, 0x70, 0x87, + 0x00, 0x00, 0x20, 0x71, 0xb7, 0x14, 0x20, 0x69, 0xb8, 0x7d, 0x70, 0x6c, + 0x68, 0x26, 0x70, 0x70, 0x68, 0x2a, 0x70, 0x74, 0x68, 0x2e, 0x70, 0x78, + 0x68, 0x32, 0x2d, 0x10, 0x08, 0x0c, 0x16, 0x48, 0x70, 0x07, 0x00, 0x08, + 0x20, 0x01, 0xff, 0xff, 0x20, 0x71, 0xb8, 0xf4, 0x70, 0x3a, 0x01, 0x2e, + 0x08, 0x04, 0x56, 0xc0, 0x20, 0x69, 0xb8, 0x7d, 0x68, 0x08, 0xa0, 0x8e, + 0x00, 0x00, 0x09, 0x04, 0x57, 0x5b, 0xa0, 0x8e, 0x02, 0x00, 0x09, 0x04, + 0x57, 0x59, 0xa0, 0x8e, 0x01, 0x00, 0x19, 0x04, 0x57, 0x5b, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x0e, 0x04, 0x57, 0x57, 0x20, 0x69, 0x00, 0x00, + 0x68, 0x18, 0xd0, 0x84, 0x15, 0xc0, 0x70, 0x2c, 0x71, 0x30, 0x81, 0x08, + 0xa1, 0x02, 0x02, 0x30, 0xa0, 0x0e, 0x70, 0x34, 0x70, 0x6e, 0x70, 0x38, + 0x70, 0x72, 0x00, 0x48, 0x70, 0x6c, 0xa0, 0x80, 0x00, 0x40, 0x70, 0x6e, + 0x12, 0x20, 0x70, 0x70, 0xa0, 0x81, 0x00, 0x00, 0x70, 0x72, 0x71, 0x32, + 0x69, 0x36, 0x70, 0x0b, 0x00, 0x00, 0x20, 0x01, 0xb8, 0x5a, 0x20, 0x04, + 0xa0, 0x05, 0x11, 0x90, 0x69, 0x34, 0x20, 0x69, 0xb8, 0x35, 0x68, 0x9c, + 0x69, 0x9e, 0x20, 0x69, 0xb8, 0xf4, 0xa1, 0x02, 0x11, 0x18, 0x68, 0x3c, + 0xa0, 0x05, 0x13, 0x68, 0x20, 0x01, 0xb8, 0x5b, 0x20, 0x0c, 0x81, 0x0d, + 0x69, 0x3e, 0x00, 0x38, 0x20, 0x09, 0x80, 0x40, 0x69, 0x22, 0x68, 0x1b, + 0x00, 0x01, 0x20, 0x91, 0x40, 0x80, 0x70, 0x07, 0x00, 0x01, 0x01, 0x2e, + 0x00, 0x10, 0x70, 0x07, 0x00, 0x05, 0x00, 0x05, 0x20, 0x01, 0xb8, 0x7f, + 0x20, 0x04, 0xa0, 0x8e, 0x01, 0x00, 0x11, 0x28, 0x70, 0x07, 0x00, 0x01, + 0x08, 0x0c, 0x58, 0x15, 0x00, 0x05, 0xa0, 0x8e, 0x00, 0x00, 0x0d, 0xe0, + 0xa0, 0x8e, 0x02, 0x00, 0x1d, 0xc8, 0x70, 0x07, 0x00, 0x05, 0x00, 0x05, + 0x70, 0x1c, 0xa0, 0x6d, 0x01, 0x58, 0x08, 0x0c, 0x58, 0x27, 0x01, 0x40, + 0x70, 0x07, 0x00, 0x03, 0x08, 0x0c, 0x58, 0x40, 0x70, 0x50, 0xa0, 0x86, + 0x01, 0x00, 0x01, 0x10, 0x00, 0x05, 0x00, 0x05, 0x70, 0x50, 0xa0, 0x9e, + 0x01, 0x00, 0x11, 0x18, 0x70, 0x07, 0x00, 0x04, 0x00, 0x30, 0xa0, 0x86, + 0x02, 0x00, 0x11, 0x10, 0x70, 0x07, 0x00, 0x05, 0x00, 0x05, 0x08, 0x0c, + 0x57, 0xe3, 0x70, 0x06, 0x08, 0x0c, 0x58, 0x15, 0x00, 0x05, 0x00, 0x05, + 0x00, 0xe6, 0x01, 0x56, 0x20, 0x71, 0xb8, 0x35, 0x71, 0x84, 0x81, 0xff, + 0x05, 0x00, 0xa0, 0x06, 0x70, 0x86, 0xae, 0x80, 0x00, 0x03, 0x20, 0x71, + 0x00, 0x00, 0x21, 0xa8, 0x20, 0x14, 0x72, 0x26, 0x80, 0x00, 0x0f, 0x04, + 0x57, 0xb8, 0x20, 0x14, 0x72, 0x2a, 0x80, 0x00, 0x0f, 0x04, 0x57, 0xb8, + 0x20, 0x14, 0x72, 0x2e, 0x80, 0x00, 0x0f, 0x04, 0x57, 0xb8, 0x20, 0x14, + 0x72, 0x3a, 0x80, 0x00, 0x0f, 0x04, 0x57, 0xb8, 0x20, 0x14, 0x72, 0x3e, + 0xa1, 0x80, 0x80, 0x30, 0x70, 0x22, 0x01, 0x5e, 0x00, 0xee, 0x00, 0x05, + 0x00, 0xe6, 0x01, 0x56, 0x20, 0x71, 0xb8, 0x35, 0x71, 0x84, 0x81, 0xff, + 0x01, 0xd8, 0xa0, 0x06, 0x70, 0x86, 0xae, 0x80, 0x00, 0x03, 0x20, 0x71, + 0x00, 0x00, 0x21, 0xa8, 0x20, 0x14, 0x72, 0x26, 0x80, 0x00, 0x20, 0x14, + 0x72, 0x2a, 0x80, 0x00, 0x0f, 0x04, 0x57, 0xda, 0x20, 0x14, 0x72, 0x3a, + 0x80, 0x00, 0x20, 0x14, 0x72, 0x3e, 0x00, 0x18, 0x20, 0x01, 0x80, 0x20, + 0x00, 0x10, 0x20, 0x01, 0x80, 0x42, 0x70, 0x22, 0x01, 0x5e, 0x00, 0xee, + 0x00, 0x05, 0x70, 0x2c, 0x71, 0x30, 0x81, 0x08, 0xa1, 0x02, 0x02, 0x30, + 0xa0, 0x0e, 0x70, 0x34, 0x70, 0x6e, 0x70, 0x38, 0x70, 0x72, 0x00, 0x48, + 0x70, 0x6c, 0xa0, 0x80, 0x00, 0x40, 0x70, 0x6e, 0x12, 0x20, 0x70, 0x70, + 0xa0, 0x81, 0x00, 0x00, 0x70, 0x72, 0x71, 0x32, 0x70, 0x0c, 0x80, 0x01, + 0x70, 0x0e, 0x11, 0x80, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x0e, 0x04, + 0x58, 0x0f, 0x20, 0x01, 0x00, 0x0d, 0x21, 0x02, 0x20, 0x91, 0x40, 0x80, + 0x20, 0x01, 0x00, 0x01, 0x70, 0x0b, 0x00, 0x00, 0x01, 0x2e, 0x00, 0x05, + 0x20, 0x01, 0x00, 0x07, 0x00, 0x05, 0x20, 0x01, 0x00, 0x06, 0x70, 0x0b, + 0x00, 0x01, 0x01, 0x2e, 0x00, 0x05, 0x70, 0x1c, 0xa0, 0x6d, 0x01, 0x70, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x70, 0x10, 0x80, 0x01, 0x70, 0x12, + 0x2d, 0x04, 0x70, 0x1e, 0xa0, 0x05, 0x11, 0x08, 0x70, 0x1a, 0x01, 0x2e, + 0x08, 0x0c, 0x16, 0x14, 0x00, 0x05, 0x20, 0x19, 0x00, 0x0d, 0x23, 0x04, + 0x23, 0x0c, 0xa1, 0x0e, 0x01, 0x30, 0x23, 0x04, 0x23, 0x0c, 0xa1, 0x0e, + 0x01, 0x10, 0xa0, 0x06, 0x00, 0x60, 0x73, 0x2c, 0x83, 0x19, 0x71, 0x30, + 0xa1, 0x02, 0x11, 0x18, 0x23, 0x00, 0xa0, 0x05, 0x00, 0x20, 0x02, 0x10, + 0xa3, 0x02, 0x00, 0x08, 0x80, 0x02, 0x00, 0x05, 0x2d, 0x00, 0x70, 0x26, + 0xa0, 0x80, 0x00, 0x0d, 0x70, 0x56, 0x70, 0x53, 0x00, 0x00, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x20, 0x09, 0xb9, 0x13, 0x21, 0x04, 0xc0, 0x8d, + 0x20, 0x0a, 0x01, 0x2e, 0x08, 0x0c, 0x16, 0x64, 0x00, 0x05, 0x70, 0x8c, + 0xa0, 0x8a, 0x00, 0x29, 0x12, 0x20, 0xa0, 0x82, 0x00, 0x1d, 0x00, 0x33, + 0x00, 0x10, 0x08, 0x0c, 0x15, 0x1a, 0x60, 0x27, 0x1e, 0x00, 0x00, 0x05, + 0x59, 0x4e, 0x58, 0xc9, 0x58, 0xe1, 0x59, 0x1e, 0x59, 0x3f, 0x59, 0x79, + 0x59, 0x8b, 0x58, 0xe1, 0x59, 0x65, 0x58, 0x6d, 0x58, 0x9b, 0x58, 0x6c, + 0x00, 0x05, 0x00, 0xd6, 0x20, 0x69, 0x02, 0x00, 0x68, 0x04, 0xa0, 0x05, + 0x11, 0x80, 0x68, 0x08, 0xa0, 0x05, 0x15, 0x18, 0x70, 0x8f, 0x00, 0x28, + 0x20, 0x69, 0xb8, 0xc6, 0x2d, 0x04, 0x70, 0x02, 0x08, 0x0c, 0x5c, 0x43, + 0x60, 0x28, 0xa0, 0x85, 0x06, 0x00, 0x60, 0x2a, 0x00, 0xb0, 0x70, 0x8f, + 0x00, 0x28, 0x20, 0x69, 0xb8, 0xc6, 0x2d, 0x04, 0x70, 0x02, 0x60, 0x28, + 0xa0, 0x85, 0x06, 0x00, 0x60, 0x2a, 0x00, 0xe6, 0x00, 0x36, 0x00, 0x46, + 0x00, 0x56, 0x20, 0x71, 0xb9, 0x24, 0x08, 0x0c, 0x1e, 0x1a, 0x00, 0x5e, + 0x00, 0x4e, 0x00, 0x3e, 0x00, 0xee, 0x00, 0xde, 0x00, 0x05, 0x00, 0xd6, + 0x20, 0x69, 0x02, 0x00, 0x68, 0x04, 0xa0, 0x05, 0x11, 0x80, 0x68, 0x08, + 0xa0, 0x05, 0x15, 0x18, 0x70, 0x8f, 0x00, 0x28, 0x20, 0x69, 0xb8, 0xc6, + 0x2d, 0x04, 0x70, 0x02, 0x08, 0x0c, 0x5c, 0xd0, 0x60, 0x28, 0xa0, 0x85, + 0x06, 0x00, 0x60, 0x2a, 0x00, 0xb0, 0x70, 0x8f, 0x00, 0x28, 0x20, 0x69, + 0xb8, 0xc6, 0x2d, 0x04, 0x70, 0x02, 0x60, 0x28, 0xa0, 0x85, 0x06, 0x00, + 0x60, 0x2a, 0x00, 0xe6, 0x00, 0x36, 0x00, 0x46, 0x00, 0x56, 0x20, 0x71, + 0xb9, 0x24, 0x08, 0x0c, 0x1e, 0x1a, 0x00, 0x5e, 0x00, 0x4e, 0x00, 0x3e, + 0x00, 0xee, 0x00, 0xde, 0x00, 0x05, 0x68, 0x03, 0x00, 0x90, 0x61, 0x24, + 0xd1, 0xe4, 0x11, 0x90, 0x08, 0x0c, 0x59, 0xf6, 0xd1, 0xd4, 0x11, 0x60, + 0xd1, 0xdc, 0x11, 0x38, 0xd1, 0xcc, 0x01, 0x50, 0x70, 0x8f, 0x00, 0x20, + 0x08, 0x0c, 0x59, 0xf6, 0x00, 0x28, 0x70, 0x8f, 0x00, 0x1d, 0x00, 0x10, + 0x70, 0x8f, 0x00, 0x1f, 0x00, 0x05, 0x68, 0x03, 0x00, 0x88, 0x61, 0x24, + 0xd1, 0xcc, 0x15, 0x90, 0xd1, 0xdc, 0x15, 0x68, 0xd1, 0xe4, 0x15, 0x40, + 0xa1, 0x84, 0x1e, 0x00, 0x15, 0x80, 0x60, 0xe3, 0x00, 0x01, 0x60, 0x0c, + 0xc0, 0xb4, 0x60, 0x0e, 0x08, 0x0c, 0x5b, 0x71, 0x08, 0x0c, 0x24, 0xe5, + 0x01, 0x56, 0x68, 0x03, 0x01, 0x00, 0x20, 0xa9, 0x00, 0x14, 0x68, 0x04, + 0xd0, 0xdc, 0x11, 0x18, 0x1f, 0x04, 0x58, 0xfb, 0x00, 0x48, 0x20, 0xa9, + 0x00, 0x14, 0x68, 0x03, 0x00, 0x80, 0x68, 0x04, 0xd0, 0xd4, 0x11, 0x30, + 0x1f, 0x04, 0x59, 0x05, 0x08, 0x0c, 0x5b, 0x92, 0x01, 0x5e, 0x00, 0x78, + 0x01, 0x5e, 0x70, 0x8f, 0x00, 0x28, 0x00, 0x58, 0x70, 0x8f, 0x00, 0x1e, + 0x00, 0x40, 0x70, 0x8f, 0x00, 0x1d, 0x00, 0x28, 0x70, 0x8f, 0x00, 0x20, + 0x00, 0x10, 0x70, 0x8f, 0x00, 0x1f, 0x00, 0x05, 0x60, 0xe3, 0x00, 0x01, + 0x60, 0x0c, 0xc0, 0xb4, 0x60, 0x0e, 0x08, 0x0c, 0x5b, 0x71, 0x08, 0x0c, + 0x24, 0xe5, 0x68, 0x03, 0x00, 0x80, 0x61, 0x24, 0xd1, 0xd4, 0x11, 0x80, + 0xd1, 0xdc, 0x11, 0x58, 0xd1, 0xe4, 0x11, 0x30, 0xa1, 0x84, 0x1e, 0x00, + 0x11, 0x58, 0x70, 0x8f, 0x00, 0x28, 0x00, 0x40, 0x70, 0x8f, 0x00, 0x1e, + 0x00, 0x28, 0x70, 0x8f, 0x00, 0x1d, 0x00, 0x10, 0x70, 0x8f, 0x00, 0x1f, + 0x00, 0x05, 0x68, 0x03, 0x00, 0xa0, 0x61, 0x24, 0xd1, 0xdc, 0x11, 0x38, + 0xd1, 0xe4, 0x01, 0x38, 0x08, 0x0c, 0x1e, 0x63, 0x70, 0x8f, 0x00, 0x1e, + 0x00, 0x10, 0x70, 0x8f, 0x00, 0x1d, 0x00, 0x05, 0x08, 0x0c, 0x5a, 0x68, + 0x61, 0x24, 0xd1, 0xdc, 0x11, 0x88, 0x08, 0x0c, 0x59, 0xf6, 0x00, 0x16, + 0x08, 0x0c, 0x1e, 0x63, 0x00, 0x1e, 0xd1, 0xd4, 0x11, 0x28, 0xd1, 0xe4, + 0x01, 0x38, 0x70, 0x8f, 0x00, 0x1e, 0x00, 0x20, 0x70, 0x8f, 0x00, 0x1f, + 0x08, 0x0c, 0x59, 0xf6, 0x00, 0x05, 0x68, 0x03, 0x00, 0xa0, 0x61, 0x24, + 0xd1, 0xd4, 0x11, 0x60, 0xd1, 0xcc, 0x11, 0x50, 0xd1, 0xdc, 0x11, 0x28, + 0xd1, 0xe4, 0x01, 0x40, 0x70, 0x8f, 0x00, 0x1e, 0x00, 0x28, 0x70, 0x8f, + 0x00, 0x1d, 0x00, 0x10, 0x70, 0x8f, 0x00, 0x21, 0x00, 0x05, 0x08, 0x0c, + 0x5a, 0x68, 0x61, 0x24, 0xd1, 0xd4, 0x11, 0x50, 0xd1, 0xdc, 0x11, 0x28, + 0xd1, 0xe4, 0x01, 0x40, 0x70, 0x8f, 0x00, 0x1e, 0x00, 0x28, 0x70, 0x8f, + 0x00, 0x1d, 0x00, 0x10, 0x70, 0x8f, 0x00, 0x1f, 0x00, 0x05, 0x68, 0x03, + 0x00, 0x90, 0x61, 0x24, 0xd1, 0xd4, 0x11, 0x78, 0xd1, 0xcc, 0x11, 0x50, + 0xd1, 0xdc, 0x11, 0x28, 0xd1, 0xe4, 0x01, 0x58, 0x70, 0x8f, 0x00, 0x1e, + 0x00, 0x40, 0x70, 0x8f, 0x00, 0x1d, 0x00, 0x28, 0x70, 0x8f, 0x00, 0x20, + 0x00, 0x10, 0x70, 0x8f, 0x00, 0x1f, 0x00, 0x05, 0x00, 0x16, 0x00, 0xc6, + 0x00, 0xd6, 0x00, 0xe6, 0x01, 0x26, 0x20, 0x61, 0x01, 0x00, 0x20, 0x69, + 0x01, 0x40, 0x20, 0x71, 0xb6, 0x00, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, + 0x5b, 0x41, 0x11, 0xe8, 0x20, 0x01, 0xb6, 0x0c, 0x20, 0x0c, 0xd1, 0xb4, + 0x01, 0xc0, 0xc1, 0xb4, 0x21, 0x02, 0x60, 0x27, 0x02, 0x00, 0xe0, 0x00, + 0xe0, 0x00, 0x60, 0x24, 0xd0, 0xcc, 0x01, 0x58, 0x68, 0x03, 0x00, 0xa0, + 0x20, 0x01, 0xb8, 0x9f, 0x20, 0x03, 0x00, 0x01, 0x20, 0x01, 0xb6, 0x00, + 0x20, 0x03, 0x00, 0x01, 0x04, 0x28, 0x60, 0x28, 0xc0, 0xcd, 0x60, 0x2a, + 0x04, 0x08, 0x08, 0x0c, 0x5b, 0x5d, 0x01, 0x50, 0x08, 0x0c, 0x5b, 0x53, + 0x11, 0x38, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x27, 0xf8, 0x08, 0x0c, + 0x5b, 0x18, 0x00, 0xa0, 0x08, 0x0c, 0x5a, 0x65, 0x01, 0x78, 0x20, 0x01, + 0x00, 0x01, 0x08, 0x0c, 0x27, 0xf8, 0x70, 0x8c, 0xa0, 0x86, 0x00, 0x1e, + 0x01, 0x20, 0x70, 0x8c, 0xa0, 0x86, 0x00, 0x22, 0x11, 0x18, 0x70, 0x8f, + 0x00, 0x25, 0x00, 0x10, 0x70, 0x8f, 0x00, 0x21, 0x01, 0x2e, 0x00, 0xee, + 0x00, 0xde, 0x00, 0xce, 0x00, 0x1e, 0x00, 0x05, 0x00, 0x26, 0x20, 0x11, + 0x5a, 0x07, 0x08, 0x0c, 0x6a, 0xce, 0x00, 0x2e, 0x00, 0x16, 0x00, 0x26, + 0x20, 0x09, 0x00, 0x64, 0x20, 0x11, 0x5a, 0x07, 0x08, 0x0c, 0x6a, 0xc5, + 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xe6, 0x00, 0xf6, 0x00, 0x16, + 0x08, 0x0c, 0x7d, 0xf3, 0x20, 0x71, 0xb6, 0x00, 0x08, 0x0c, 0x59, 0xa2, + 0x00, 0x1e, 0x00, 0xfe, 0x00, 0xee, 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, + 0x00, 0x36, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x00, 0xf6, 0x01, 0x26, + 0x08, 0x0c, 0x7d, 0xf3, 0x20, 0x61, 0x01, 0x00, 0x20, 0x69, 0x01, 0x40, + 0x20, 0x71, 0xb6, 0x00, 0x20, 0x91, 0x80, 0x00, 0x60, 0x28, 0xc0, 0x9c, + 0x60, 0x2a, 0x20, 0x11, 0x00, 0x03, 0x08, 0x0c, 0x80, 0xfc, 0x20, 0x11, + 0x00, 0x02, 0x08, 0x0c, 0x81, 0x06, 0x08, 0x0c, 0x7f, 0xe0, 0x08, 0x0c, + 0x6a, 0x82, 0x00, 0x36, 0x20, 0x19, 0x00, 0x00, 0x08, 0x0c, 0x80, 0x6b, + 0x00, 0x3e, 0x60, 0xe3, 0x00, 0x00, 0x08, 0x0c, 0xb4, 0xeb, 0x08, 0x0c, + 0xb5, 0x06, 0x20, 0x01, 0xb6, 0x00, 0x20, 0x03, 0x00, 0x04, 0x60, 0x27, + 0x00, 0x08, 0x08, 0x0c, 0x12, 0xe2, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, + 0x27, 0xf8, 0x01, 0x2e, 0x00, 0xfe, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, + 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x20, 0x01, 0xb6, 0x00, + 0x20, 0x04, 0xa0, 0x86, 0x00, 0x04, 0x01, 0x40, 0x20, 0x01, 0xb8, 0x9e, + 0x20, 0x03, 0xaa, 0xaa, 0x20, 0x01, 0xb8, 0x9f, 0x20, 0x03, 0x00, 0x00, + 0x00, 0x05, 0x60, 0x20, 0xd0, 0x9c, 0x00, 0x05, 0x68, 0x00, 0xa0, 0x86, + 0x00, 0xc0, 0x01, 0x60, 0x68, 0x03, 0x00, 0xc0, 0x01, 0x56, 0x20, 0xa9, + 0x00, 0x2d, 0x1d, 0x04, 0x5a, 0x71, 0x20, 0x91, 0x60, 0x00, 0x1f, 0x04, + 0x5a, 0x71, 0x01, 0x5e, 0x00, 0x05, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, + 0x20, 0x61, 0x01, 0x00, 0x20, 0x69, 0x01, 0x40, 0x20, 0x71, 0xb6, 0x00, + 0x20, 0x01, 0xb8, 0x9f, 0x20, 0x0c, 0xa1, 0x86, 0x00, 0x00, 0x01, 0x58, + 0xa1, 0x86, 0x00, 0x01, 0x01, 0x58, 0xa1, 0x86, 0x00, 0x02, 0x01, 0x58, + 0xa1, 0x86, 0x00, 0x03, 0x01, 0x58, 0x08, 0x04, 0x5b, 0x06, 0x70, 0x8f, + 0x00, 0x22, 0x00, 0x40, 0x70, 0x8f, 0x00, 0x21, 0x00, 0x28, 0x70, 0x8f, + 0x00, 0x23, 0x00, 0x20, 0x70, 0x8f, 0x00, 0x24, 0x60, 0x43, 0x00, 0x00, + 0x60, 0xe3, 0x00, 0x00, 0x68, 0x87, 0x00, 0x01, 0x20, 0x01, 0x00, 0x01, + 0x08, 0x0c, 0x28, 0xa7, 0x00, 0x26, 0x20, 0x11, 0x00, 0x03, 0x08, 0x0c, + 0x80, 0xfc, 0x20, 0x11, 0x00, 0x02, 0x08, 0x0c, 0x81, 0x06, 0x08, 0x0c, + 0x7f, 0xe0, 0x00, 0x36, 0x20, 0x19, 0x00, 0x00, 0x08, 0x0c, 0x80, 0x6b, + 0x00, 0x3e, 0x00, 0x2e, 0x70, 0x00, 0xa0, 0x8e, 0x00, 0x04, 0x01, 0x18, + 0x60, 0x2b, 0x00, 0x28, 0x00, 0x10, 0x60, 0x2b, 0x00, 0x20, 0x01, 0x56, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0xa9, 0x00, 0x05, 0x60, 0x24, + 0xd0, 0xac, 0x01, 0x20, 0x01, 0x2e, 0x01, 0x5e, 0x08, 0x04, 0x5b, 0x14, + 0x68, 0x00, 0xa0, 0x84, 0x00, 0xa0, 0xc0, 0xbd, 0x68, 0x02, 0x69, 0x04, + 0xd1, 0xd4, 0x11, 0x30, 0x68, 0x03, 0x01, 0x00, 0x1f, 0x04, 0x5a, 0xc9, + 0x08, 0x0c, 0x5b, 0x92, 0x01, 0x2e, 0x01, 0x5e, 0x08, 0x0c, 0x5b, 0x53, + 0x01, 0xa8, 0x60, 0x44, 0xa0, 0x05, 0x01, 0x68, 0x60, 0x50, 0x00, 0x06, + 0xa0, 0x85, 0x00, 0x20, 0x60, 0x52, 0x08, 0x0c, 0x5b, 0x92, 0xa0, 0x06, + 0x80, 0x01, 0x1d, 0xf0, 0x00, 0x0e, 0x60, 0x52, 0x00, 0x28, 0x68, 0x04, + 0xd0, 0xd4, 0x11, 0x10, 0x08, 0x0c, 0x5b, 0x92, 0x00, 0x16, 0x00, 0x26, + 0x20, 0x09, 0x00, 0xc8, 0x20, 0x11, 0x5a, 0x14, 0x08, 0x0c, 0x6a, 0x94, + 0x00, 0x2e, 0x00, 0x1e, 0x20, 0x01, 0xb8, 0x9f, 0x20, 0x03, 0x00, 0x04, + 0x08, 0x0c, 0x58, 0x53, 0x08, 0x0c, 0x5b, 0x53, 0x01, 0x48, 0x68, 0x04, + 0xd0, 0xd4, 0x11, 0x30, 0xd0, 0xdc, 0x11, 0x00, 0x20, 0x01, 0xb8, 0x9f, + 0x20, 0x03, 0x00, 0x00, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x00, 0x05, + 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x20, 0x61, 0x01, 0x00, 0x20, 0x69, + 0x01, 0x40, 0x20, 0x71, 0xb6, 0x00, 0x20, 0x01, 0xb8, 0x9e, 0x20, 0x03, + 0x00, 0x00, 0x20, 0x01, 0xb8, 0x8f, 0x20, 0x03, 0x00, 0x00, 0x70, 0x8f, + 0x00, 0x00, 0x60, 0xe3, 0x00, 0x00, 0x68, 0x87, 0x00, 0x00, 0x20, 0x01, + 0x00, 0x00, 0x08, 0x0c, 0x28, 0xa7, 0x68, 0x03, 0x00, 0x00, 0x60, 0x43, + 0x00, 0x90, 0x60, 0x43, 0x00, 0x10, 0x60, 0x27, 0xff, 0xff, 0x60, 0x2b, + 0x18, 0x2f, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x00, 0x05, 0x00, 0x06, + 0x20, 0x01, 0xb8, 0x9e, 0x20, 0x04, 0xa0, 0x86, 0xaa, 0xaa, 0x00, 0x0e, + 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0xb6, 0x72, 0x20, 0x04, 0xa0, 0x84, + 0x00, 0x30, 0xa0, 0x86, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, + 0x20, 0x01, 0xb6, 0x72, 0x20, 0x04, 0xa0, 0x84, 0x00, 0x30, 0xa0, 0x86, + 0x00, 0x30, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0xb6, 0x72, + 0x20, 0x04, 0xa0, 0x84, 0x00, 0x30, 0xa0, 0x86, 0x00, 0x10, 0x00, 0x0e, + 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0xb6, 0x72, 0x20, 0x04, 0xa0, 0x84, + 0x00, 0x30, 0xa0, 0x86, 0x00, 0x20, 0x00, 0x0e, 0x00, 0x05, 0x20, 0x01, + 0xb6, 0x0c, 0x20, 0x04, 0xd0, 0xa4, 0x01, 0x70, 0x08, 0x0c, 0x28, 0xc7, + 0x00, 0x36, 0x00, 0x16, 0x20, 0x09, 0x00, 0x00, 0x20, 0x19, 0x00, 0x28, + 0x08, 0x0c, 0x2c, 0xa4, 0x00, 0x1e, 0x00, 0x3e, 0xa0, 0x06, 0x00, 0x09, + 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0xb6, 0x0c, 0x2e, 0x04, 0x01, 0x18, + 0xa0, 0x85, 0x00, 0x10, 0x00, 0x10, 0xa0, 0x84, 0xff, 0xef, 0x20, 0x72, + 0x00, 0xee, 0x00, 0x05, 0x60, 0x50, 0x00, 0x06, 0x60, 0xf0, 0x00, 0x06, + 0x60, 0xec, 0x00, 0x06, 0x60, 0x0c, 0x00, 0x06, 0x60, 0x04, 0x00, 0x06, + 0x60, 0x28, 0x00, 0x06, 0x60, 0x2f, 0x01, 0x00, 0x60, 0x2f, 0x00, 0x00, + 0x60, 0x2f, 0x00, 0x40, 0x60, 0x2f, 0x00, 0x00, 0x00, 0x0e, 0x60, 0x2a, + 0x00, 0x0e, 0x60, 0x06, 0x00, 0x0e, 0x60, 0x0e, 0x00, 0x0e, 0x60, 0xee, + 0x00, 0x0e, 0x60, 0xf2, 0x60, 0xe3, 0x00, 0x00, 0x68, 0x87, 0x00, 0x01, + 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x28, 0xa7, 0x68, 0x00, 0xa0, 0x84, + 0x00, 0xa0, 0xc0, 0xbd, 0x68, 0x02, 0x68, 0x03, 0x00, 0xa0, 0x00, 0x0e, + 0x60, 0x52, 0x60, 0x50, 0x00, 0x05, 0x01, 0x56, 0x00, 0x16, 0x00, 0x26, + 0x00, 0x36, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x20, 0x61, 0x01, 0x00, + 0x20, 0x69, 0x01, 0x40, 0x20, 0x71, 0xb6, 0x00, 0x60, 0x20, 0xa0, 0x84, + 0x00, 0x80, 0x01, 0x38, 0x20, 0x01, 0xb6, 0x0c, 0x20, 0x0c, 0xc1, 0xbd, + 0x21, 0x02, 0x08, 0x04, 0x5c, 0x3b, 0x20, 0x01, 0xb6, 0x0c, 0x20, 0x0c, + 0xc1, 0xbc, 0x21, 0x02, 0x60, 0x28, 0xa0, 0x84, 0xe1, 0xff, 0x60, 0x2a, + 0x60, 0x27, 0x02, 0x00, 0x68, 0x03, 0x00, 0x90, 0x20, 0xa9, 0x03, 0x84, + 0x60, 0x24, 0xd0, 0xcc, 0x15, 0x08, 0x1d, 0x04, 0x5b, 0xea, 0x20, 0x91, + 0x60, 0x00, 0x1f, 0x04, 0x5b, 0xea, 0x20, 0x11, 0x00, 0x03, 0x08, 0x0c, + 0x80, 0xfc, 0x20, 0x11, 0x00, 0x02, 0x08, 0x0c, 0x81, 0x06, 0x08, 0x0c, + 0x7f, 0xe0, 0x20, 0x19, 0x00, 0x00, 0x08, 0x0c, 0x80, 0x6b, 0x68, 0x03, + 0x00, 0xa0, 0x20, 0x01, 0xb8, 0x9f, 0x20, 0x03, 0x00, 0x01, 0x20, 0x01, + 0xb6, 0x00, 0x20, 0x03, 0x00, 0x01, 0xa0, 0x85, 0x00, 0x01, 0x04, 0x68, + 0x86, 0xff, 0x11, 0x20, 0x08, 0x0c, 0x1e, 0x63, 0x08, 0x0c, 0x24, 0xe5, + 0x60, 0xe3, 0x00, 0x00, 0x20, 0x01, 0xb8, 0x8f, 0x20, 0x04, 0x08, 0x0c, + 0x28, 0xa7, 0x60, 0xe2, 0x68, 0x03, 0x00, 0x80, 0x20, 0xa9, 0x03, 0x84, + 0x60, 0x27, 0x1e, 0x00, 0x20, 0x09, 0x1e, 0x00, 0xe0, 0x00, 0x60, 0x24, + 0xa1, 0x0c, 0x01, 0x38, 0x1d, 0x04, 0x5c, 0x20, 0x20, 0x91, 0x60, 0x00, + 0x1f, 0x04, 0x5c, 0x20, 0x08, 0x20, 0x60, 0x28, 0xa0, 0x85, 0x1e, 0x00, + 0x60, 0x2a, 0x70, 0xa4, 0xa0, 0x05, 0x11, 0x18, 0x68, 0x87, 0x00, 0x01, + 0x00, 0x08, 0x68, 0x86, 0xa0, 0x06, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, + 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, 0x01, 0x5e, 0x00, 0x05, 0x01, 0x56, + 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, + 0x20, 0x61, 0x01, 0x00, 0x20, 0x71, 0xb6, 0x00, 0x20, 0x69, 0x01, 0x40, + 0x60, 0x20, 0xa0, 0x84, 0x00, 0xc0, 0x01, 0x20, 0x68, 0x84, 0xa0, 0x05, + 0x19, 0x04, 0x5c, 0x97, 0x68, 0x03, 0x00, 0x88, 0x60, 0xe3, 0x00, 0x00, + 0x68, 0x87, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x08, 0x0c, 0x28, 0xa7, + 0x20, 0x69, 0x02, 0x00, 0x68, 0x04, 0xa0, 0x05, 0x11, 0x18, 0x68, 0x08, + 0xa0, 0x05, 0x01, 0xc0, 0x60, 0x28, 0xa0, 0x84, 0xfb, 0xff, 0x60, 0x2a, + 0x60, 0x27, 0x04, 0x00, 0x20, 0x69, 0xb8, 0xc6, 0x70, 0x00, 0x20, 0x6a, + 0x70, 0x8f, 0x00, 0x26, 0x70, 0x03, 0x00, 0x01, 0x20, 0xa9, 0x00, 0x02, + 0x1d, 0x04, 0x5c, 0x7a, 0x20, 0x91, 0x60, 0x00, 0x1f, 0x04, 0x5c, 0x7a, + 0x08, 0x04, 0x5c, 0xc8, 0x20, 0x69, 0x01, 0x40, 0x20, 0xa9, 0x03, 0x84, + 0x60, 0x27, 0x1e, 0x00, 0x20, 0x09, 0x1e, 0x00, 0xe0, 0x00, 0x60, 0x24, + 0xa1, 0x0c, 0x05, 0x20, 0xa0, 0x84, 0x1a, 0x00, 0x15, 0x08, 0x1d, 0x04, + 0x5c, 0x86, 0x20, 0x91, 0x60, 0x00, 0x1f, 0x04, 0x5c, 0x86, 0x20, 0x11, + 0x00, 0x03, 0x08, 0x0c, 0x80, 0xfc, 0x20, 0x11, 0x00, 0x02, 0x08, 0x0c, + 0x81, 0x06, 0x08, 0x0c, 0x7f, 0xe0, 0x20, 0x19, 0x00, 0x00, 0x08, 0x0c, + 0x80, 0x6b, 0x68, 0x03, 0x00, 0xa0, 0x20, 0x01, 0xb8, 0x9f, 0x20, 0x03, + 0x00, 0x01, 0x20, 0x01, 0xb6, 0x00, 0x20, 0x03, 0x00, 0x01, 0xa0, 0x85, + 0x00, 0x01, 0x00, 0xb0, 0x08, 0x0c, 0x24, 0xe5, 0x68, 0x03, 0x00, 0x80, + 0x20, 0x69, 0x01, 0x40, 0x60, 0xe3, 0x00, 0x00, 0x70, 0xa4, 0xa0, 0x05, + 0x11, 0x18, 0x68, 0x87, 0x00, 0x01, 0x00, 0x08, 0x68, 0x86, 0x20, 0x01, + 0xb8, 0x8f, 0x20, 0x04, 0x08, 0x0c, 0x28, 0xa7, 0x60, 0xe2, 0xa0, 0x06, + 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, + 0x01, 0x5e, 0x00, 0x05, 0x01, 0x56, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, + 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x20, 0x61, 0x01, 0x00, 0x20, 0x71, + 0xb6, 0x00, 0x60, 0x20, 0xa0, 0x84, 0x00, 0xc0, 0x01, 0xe0, 0x20, 0x11, + 0x00, 0x03, 0x08, 0x0c, 0x80, 0xfc, 0x20, 0x11, 0x00, 0x02, 0x08, 0x0c, + 0x81, 0x06, 0x08, 0x0c, 0x7f, 0xe0, 0x20, 0x19, 0x00, 0x00, 0x08, 0x0c, + 0x80, 0x6b, 0x20, 0x69, 0x01, 0x40, 0x68, 0x03, 0x00, 0xa0, 0x20, 0x01, + 0xb8, 0x9f, 0x20, 0x03, 0x00, 0x01, 0x20, 0x01, 0xb6, 0x00, 0x20, 0x03, + 0x00, 0x01, 0x08, 0x04, 0x5d, 0x6d, 0x20, 0x01, 0xb6, 0x0c, 0x20, 0x0c, + 0xd1, 0xb4, 0x11, 0x60, 0xc1, 0xb5, 0x21, 0x02, 0x08, 0x0c, 0x59, 0xfc, + 0x20, 0x69, 0x01, 0x40, 0x08, 0x0c, 0x24, 0xe5, 0x68, 0x03, 0x00, 0x80, + 0x60, 0xe3, 0x00, 0x00, 0x20, 0x69, 0x02, 0x00, 0x68, 0x04, 0xa0, 0x05, + 0x11, 0x18, 0x68, 0x08, 0xa0, 0x05, 0x01, 0xc0, 0x60, 0x28, 0xa0, 0x84, + 0xfd, 0xff, 0x60, 0x2a, 0x60, 0x27, 0x02, 0x00, 0x20, 0x69, 0xb8, 0xc6, + 0x70, 0x00, 0x20, 0x6a, 0x70, 0x8f, 0x00, 0x27, 0x70, 0x03, 0x00, 0x01, + 0x20, 0xa9, 0x00, 0x02, 0x1d, 0x04, 0x5d, 0x24, 0x20, 0x91, 0x60, 0x00, + 0x1f, 0x04, 0x5d, 0x24, 0x08, 0x04, 0x5d, 0x6d, 0x60, 0x27, 0x1e, 0x00, + 0x20, 0x09, 0x1e, 0x00, 0xe0, 0x00, 0x60, 0x24, 0xa1, 0x0c, 0x01, 0xc8, + 0xa0, 0x84, 0x1c, 0x00, 0x11, 0xb0, 0x1d, 0x04, 0x5d, 0x2c, 0x00, 0x06, + 0x00, 0x16, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x08, 0x0c, 0x69, 0x6b, + 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0xe6, + 0x20, 0x71, 0xb8, 0xf4, 0x70, 0x18, 0x00, 0xee, 0xa0, 0x05, 0x1d, 0x00, + 0x05, 0x00, 0x00, 0x26, 0x20, 0x11, 0x5a, 0x14, 0x08, 0x0c, 0x6a, 0x0e, + 0x20, 0x11, 0x5a, 0x07, 0x08, 0x0c, 0x6a, 0xce, 0x00, 0x2e, 0x20, 0x69, + 0x01, 0x40, 0x60, 0xe3, 0x00, 0x00, 0x70, 0xa4, 0xa0, 0x05, 0x11, 0x18, + 0x68, 0x87, 0x00, 0x01, 0x00, 0x08, 0x68, 0x86, 0x20, 0x01, 0xb8, 0x8f, + 0x20, 0x04, 0x08, 0x0c, 0x28, 0xa7, 0x60, 0xe2, 0x20, 0x01, 0xb6, 0x0c, + 0x20, 0x0c, 0xc1, 0xb4, 0x21, 0x02, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, + 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, 0x01, 0x5e, 0x00, 0x05, 0x01, 0x56, + 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x00, 0x46, 0x00, 0xc6, 0x00, 0xe6, + 0x20, 0x61, 0x01, 0x00, 0x20, 0x71, 0xb6, 0x00, 0x71, 0x30, 0xd1, 0x84, + 0x11, 0x80, 0x20, 0x11, 0xb6, 0x53, 0x22, 0x14, 0xd2, 0xec, 0x01, 0x38, + 0xc1, 0x8d, 0x71, 0x32, 0x20, 0x11, 0xb6, 0x53, 0x22, 0x14, 0xd2, 0xac, + 0x11, 0x20, 0x70, 0x30, 0xd0, 0x8c, 0x09, 0x04, 0x5d, 0xda, 0x71, 0x30, + 0xc1, 0x85, 0x71, 0x32, 0x20, 0x11, 0xb6, 0x53, 0x22, 0x0c, 0xd1, 0xa4, + 0x05, 0x30, 0x00, 0x16, 0x20, 0x19, 0x00, 0x0e, 0x08, 0x0c, 0xb1, 0x21, + 0x01, 0x56, 0x20, 0xa9, 0x00, 0x7f, 0x20, 0x09, 0x00, 0x00, 0xa1, 0x86, + 0x00, 0x7e, 0x01, 0xa0, 0xa1, 0x86, 0x00, 0x80, 0x01, 0x88, 0x08, 0x0c, + 0x50, 0x1b, 0x11, 0x70, 0x81, 0x27, 0xa0, 0x06, 0x00, 0x16, 0x20, 0x09, + 0x00, 0x0e, 0x08, 0x0c, 0xb1, 0xa4, 0x20, 0x09, 0x00, 0x01, 0x20, 0x11, + 0x01, 0x00, 0x08, 0x0c, 0x6b, 0x8c, 0x00, 0x1e, 0x81, 0x08, 0x1f, 0x04, + 0x5d, 0xa5, 0x01, 0x5e, 0x00, 0x1e, 0xd1, 0xac, 0x11, 0x48, 0x00, 0x16, + 0x20, 0x09, 0x00, 0x00, 0x20, 0x19, 0x00, 0x04, 0x08, 0x0c, 0x2c, 0xa4, + 0x00, 0x1e, 0x00, 0x70, 0x01, 0x56, 0x20, 0xa9, 0x00, 0x7f, 0x20, 0x09, + 0x00, 0x00, 0x08, 0x0c, 0x50, 0x1b, 0x11, 0x10, 0x08, 0x0c, 0x4c, 0x7e, + 0x81, 0x08, 0x1f, 0x04, 0x5d, 0xd1, 0x01, 0x5e, 0x08, 0x0c, 0x1e, 0x63, + 0x20, 0x11, 0x00, 0x03, 0x08, 0x0c, 0x80, 0xfc, 0x20, 0x11, 0x00, 0x02, + 0x08, 0x0c, 0x81, 0x06, 0x08, 0x0c, 0x7f, 0xe0, 0x00, 0x36, 0x20, 0x19, + 0x00, 0x00, 0x08, 0x0c, 0x80, 0x6b, 0x00, 0x3e, 0x60, 0xe3, 0x00, 0x00, + 0x20, 0x01, 0xb6, 0x00, 0x20, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x5a, 0x79, + 0x00, 0xee, 0x00, 0xce, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, + 0x01, 0x5e, 0x00, 0x05, 0x20, 0x71, 0xb6, 0xe2, 0x70, 0x03, 0x00, 0x00, + 0x70, 0x07, 0x00, 0x00, 0x70, 0x0f, 0x00, 0x00, 0x70, 0x2b, 0x00, 0x01, + 0x70, 0x4f, 0x00, 0x00, 0x70, 0x53, 0x00, 0x01, 0x70, 0x5f, 0x00, 0x20, + 0x70, 0x63, 0x00, 0x40, 0x70, 0x83, 0x00, 0x00, 0x70, 0x8b, 0x00, 0x00, + 0x70, 0x8f, 0x00, 0x01, 0x70, 0xbf, 0x00, 0x00, 0x00, 0x05, 0x00, 0xe6, + 0x20, 0x71, 0xb6, 0xe2, 0x68, 0x48, 0xa0, 0x05, 0x11, 0x30, 0x70, 0x28, + 0xc0, 0x85, 0x70, 0x2a, 0xa0, 0x85, 0x00, 0x01, 0x04, 0x28, 0x6a, 0x50, + 0x72, 0x36, 0x6b, 0x54, 0x73, 0x3a, 0x68, 0x58, 0x70, 0x3e, 0x70, 0x7a, + 0x68, 0x5c, 0x70, 0x42, 0x70, 0x7e, 0x68, 0x48, 0x70, 0x2e, 0x68, 0x40, + 0x70, 0x32, 0x20, 0x09, 0x00, 0x0c, 0x20, 0x0a, 0x80, 0x07, 0x80, 0x06, + 0x80, 0x06, 0xa0, 0x8c, 0x00, 0x3f, 0xa0, 0x84, 0xff, 0xc0, 0xa2, 0x10, + 0x21, 0x00, 0xa3, 0x19, 0x72, 0x72, 0x73, 0x76, 0x70, 0x28, 0xc0, 0x84, + 0x70, 0x2a, 0x70, 0x07, 0x00, 0x01, 0x70, 0x0f, 0x00, 0x00, 0xa0, 0x06, + 0x00, 0xee, 0x00, 0x05, 0x2b, 0x78, 0x20, 0x71, 0xb6, 0xe2, 0x70, 0x04, + 0x00, 0x43, 0x70, 0x0c, 0x00, 0x02, 0x5e, 0x56, 0x5e, 0x4d, 0x5e, 0x4d, + 0x5e, 0x4d, 0x5e, 0x4d, 0x00, 0x05, 0x5e, 0xac, 0x5e, 0xad, 0x5e, 0xdf, + 0x5e, 0xe0, 0x5e, 0xaa, 0x5f, 0x2e, 0x5f, 0x33, 0x5f, 0x64, 0x5f, 0x65, + 0x5f, 0x80, 0x5f, 0x81, 0x5f, 0x82, 0x5f, 0x83, 0x5f, 0x84, 0x5f, 0x85, + 0x60, 0x3b, 0x60, 0x62, 0x70, 0x0c, 0x00, 0x02, 0x5e, 0x6f, 0x5e, 0xaa, + 0x5e, 0xaa, 0x5e, 0xab, 0x5e, 0xab, 0x78, 0x30, 0x79, 0x30, 0xa1, 0x06, + 0x01, 0x20, 0x78, 0x30, 0x79, 0x30, 0xa1, 0x06, 0x15, 0x10, 0x70, 0x30, + 0xa1, 0x0a, 0x01, 0xf8, 0x12, 0x10, 0x71, 0x2c, 0xa1, 0x0a, 0xa1, 0x8a, + 0x00, 0x02, 0x12, 0xd0, 0x08, 0x0c, 0x15, 0xe4, 0x01, 0xb0, 0x2d, 0x00, + 0x70, 0x5a, 0x70, 0x63, 0x00, 0x40, 0x20, 0x01, 0x00, 0x03, 0x70, 0x57, + 0x00, 0x00, 0x01, 0x26, 0x00, 0x06, 0x20, 0x91, 0x80, 0x00, 0x20, 0x09, + 0xb9, 0x13, 0x21, 0x04, 0xc0, 0x85, 0x20, 0x0a, 0x00, 0x0e, 0x70, 0x0e, + 0x01, 0x2e, 0x08, 0x0c, 0x16, 0x64, 0x00, 0x05, 0x08, 0x0c, 0x15, 0xe4, + 0x0d, 0xe0, 0x2d, 0x00, 0x70, 0x5a, 0x08, 0x0c, 0x15, 0xe4, 0x11, 0x08, + 0x0c, 0x10, 0x2d, 0x00, 0x70, 0x86, 0x70, 0x63, 0x00, 0x80, 0x20, 0x01, + 0x00, 0x04, 0x08, 0xf8, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x70, 0x0c, + 0x00, 0x02, 0x5e, 0xb4, 0x5e, 0xb7, 0x5e, 0xc5, 0x5e, 0xde, 0x5e, 0xde, + 0x08, 0x0c, 0x5e, 0x68, 0x00, 0x05, 0x01, 0x26, 0x80, 0x01, 0x70, 0x0e, + 0x70, 0x58, 0x00, 0x06, 0x08, 0x0c, 0x63, 0xb5, 0x01, 0x20, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0x5e, 0x68, 0x00, 0xde, 0x00, 0x48, 0x01, 0x26, + 0x80, 0x01, 0x70, 0x0e, 0x08, 0x0c, 0x63, 0xb5, 0x70, 0x58, 0x20, 0x68, + 0x70, 0x84, 0x70, 0x5a, 0x68, 0x03, 0x00, 0x00, 0x68, 0x07, 0x00, 0x00, + 0x68, 0x34, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x8a, 0x00, 0x3a, 0x12, 0x18, + 0x00, 0xdb, 0x01, 0x2e, 0x00, 0x05, 0x01, 0x2e, 0x08, 0x0c, 0x5f, 0x86, + 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0xb6, 0xe2, + 0x70, 0x0c, 0x00, 0x02, 0x5e, 0xeb, 0x5e, 0xeb, 0x5e, 0xeb, 0x5e, 0xed, + 0x5e, 0xf0, 0x00, 0xee, 0x00, 0x05, 0x70, 0x0f, 0x00, 0x01, 0x00, 0x10, + 0x70, 0x0f, 0x00, 0x02, 0x00, 0xee, 0x00, 0x05, 0x5f, 0x86, 0x5f, 0x86, + 0x5f, 0xa2, 0x5f, 0x86, 0x61, 0x1f, 0x5f, 0x86, 0x5f, 0x86, 0x5f, 0x86, + 0x5f, 0x86, 0x5f, 0x86, 0x5f, 0xa2, 0x61, 0x61, 0x61, 0xa4, 0x61, 0xed, + 0x62, 0x01, 0x5f, 0x86, 0x5f, 0x86, 0x5f, 0xbe, 0x5f, 0xa2, 0x5f, 0x86, + 0x5f, 0x86, 0x60, 0x18, 0x62, 0xad, 0x62, 0xc8, 0x5f, 0x86, 0x5f, 0xbe, + 0x5f, 0x86, 0x5f, 0x86, 0x5f, 0x86, 0x5f, 0x86, 0x60, 0x0e, 0x62, 0xc8, + 0x5f, 0x86, 0x5f, 0x86, 0x5f, 0x86, 0x5f, 0x86, 0x5f, 0x86, 0x5f, 0x86, + 0x5f, 0x86, 0x5f, 0x86, 0x5f, 0x86, 0x5f, 0xd2, 0x5f, 0x86, 0x5f, 0x86, + 0x5f, 0x86, 0x5f, 0x86, 0x5f, 0x86, 0x5f, 0x86, 0x5f, 0x86, 0x5f, 0x86, + 0x5f, 0x86, 0x63, 0xd3, 0x5f, 0x86, 0x5f, 0x86, 0x5f, 0x86, 0x5f, 0x86, + 0x5f, 0x86, 0x5f, 0xe7, 0x70, 0x20, 0x20, 0x68, 0x08, 0x0c, 0x16, 0x14, + 0x00, 0x05, 0x70, 0x0c, 0x00, 0x02, 0x5f, 0x3a, 0x5f, 0x3d, 0x5f, 0x4b, + 0x5f, 0x63, 0x5f, 0x63, 0x08, 0x0c, 0x5e, 0x68, 0x00, 0x05, 0x01, 0x26, + 0x80, 0x01, 0x70, 0x0e, 0x70, 0x58, 0x00, 0x06, 0x08, 0x0c, 0x63, 0xb5, + 0x01, 0x20, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x5e, 0x68, 0x00, 0xde, + 0x00, 0x48, 0x01, 0x26, 0x80, 0x01, 0x70, 0x0e, 0x08, 0x0c, 0x63, 0xb5, + 0x70, 0x58, 0x20, 0x68, 0x70, 0x84, 0x70, 0x5a, 0x68, 0x03, 0x00, 0x00, + 0x68, 0x07, 0x00, 0x00, 0x68, 0x34, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x8a, + 0x00, 0x1a, 0x12, 0x18, 0x00, 0x3b, 0x01, 0x2e, 0x00, 0x05, 0x01, 0x2e, + 0x04, 0x19, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x5f, 0x86, 0x5f, 0xa2, + 0x61, 0x0b, 0x5f, 0x86, 0x5f, 0xa2, 0x5f, 0x86, 0x5f, 0xa2, 0x5f, 0xa2, + 0x5f, 0x86, 0x5f, 0xa2, 0x61, 0x0b, 0x5f, 0xa2, 0x5f, 0xa2, 0x5f, 0xa2, + 0x5f, 0xa2, 0x5f, 0xa2, 0x5f, 0x86, 0x5f, 0xa2, 0x61, 0x0b, 0x5f, 0x86, + 0x5f, 0x86, 0x5f, 0xa2, 0x5f, 0x86, 0x5f, 0x86, 0x5f, 0x86, 0x5f, 0xa2, + 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, + 0x70, 0x07, 0x00, 0x01, 0x68, 0x38, 0xa0, 0x84, 0x00, 0xff, 0xc0, 0xd5, + 0x68, 0x3a, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x54, 0x7a, + 0x01, 0x2e, 0x00, 0x05, 0x70, 0x07, 0x00, 0x01, 0x68, 0x38, 0xa0, 0x84, + 0x00, 0xff, 0xc0, 0xe5, 0x68, 0x3a, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x08, 0x0c, 0x54, 0x7a, 0x01, 0x2e, 0x00, 0x05, 0x70, 0x07, 0x00, 0x01, + 0x68, 0x38, 0xa0, 0x84, 0x00, 0xff, 0xc0, 0xed, 0x68, 0x3a, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x54, 0x7a, 0x01, 0x2e, 0x00, 0x05, + 0x70, 0x07, 0x00, 0x01, 0x68, 0x38, 0xa0, 0x84, 0x00, 0xff, 0xc0, 0xdd, + 0x68, 0x3a, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x54, 0x7a, + 0x01, 0x2e, 0x00, 0x05, 0x68, 0x34, 0x80, 0x07, 0xa0, 0x84, 0x00, 0xff, + 0x09, 0x88, 0x80, 0x01, 0x11, 0x20, 0x70, 0x07, 0x00, 0x01, 0x08, 0x04, + 0x60, 0xcb, 0x70, 0x07, 0x00, 0x06, 0x70, 0x12, 0x2d, 0x00, 0x70, 0x16, + 0x70, 0x1a, 0x70, 0x4b, 0x60, 0xcb, 0x00, 0x05, 0x68, 0x34, 0x80, 0x07, + 0xa0, 0x84, 0x00, 0xff, 0x09, 0x04, 0x5f, 0x94, 0x80, 0x01, 0x11, 0x20, + 0x70, 0x07, 0x00, 0x01, 0x08, 0x04, 0x60, 0xe8, 0x70, 0x07, 0x00, 0x06, + 0x70, 0x12, 0x2d, 0x00, 0x70, 0x16, 0x70, 0x1a, 0x70, 0x4b, 0x60, 0xe8, + 0x00, 0x05, 0x68, 0x34, 0x80, 0x07, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, + 0x00, 0x01, 0x19, 0x04, 0x5f, 0x94, 0x70, 0x07, 0x00, 0x01, 0x20, 0x09, + 0xb6, 0x31, 0x21, 0x0c, 0x81, 0xff, 0x11, 0xa8, 0x68, 0x38, 0xa0, 0x84, + 0x00, 0xff, 0x68, 0x3a, 0x68, 0x53, 0x00, 0x00, 0x08, 0x0c, 0x4d, 0xf4, + 0x11, 0x08, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x68, 0x37, + 0x01, 0x39, 0x68, 0x4a, 0x69, 0x52, 0x08, 0x0c, 0x54, 0x7a, 0x01, 0x2e, + 0x0c, 0xa0, 0x20, 0x01, 0x00, 0x28, 0x0c, 0x90, 0x68, 0x4c, 0xa0, 0x84, + 0x00, 0xc0, 0xa0, 0x86, 0x00, 0xc0, 0x11, 0x20, 0x70, 0x07, 0x00, 0x01, + 0x08, 0x04, 0x62, 0xe0, 0x2d, 0x00, 0x70, 0x16, 0x70, 0x1a, 0x20, 0xa9, + 0x00, 0x04, 0xa0, 0x80, 0x00, 0x24, 0x20, 0x98, 0x20, 0xa1, 0xb7, 0x0d, + 0x53, 0xa3, 0x68, 0x58, 0x70, 0x12, 0xa0, 0x82, 0x04, 0x01, 0x1a, 0x04, + 0x5f, 0xb0, 0x6a, 0x84, 0xa2, 0x8a, 0x00, 0x02, 0x1a, 0x04, 0x5f, 0xb0, + 0x82, 0xff, 0x11, 0x38, 0x68, 0x88, 0x69, 0x8c, 0xa1, 0x05, 0x01, 0x18, + 0x20, 0x01, 0x60, 0x9e, 0x00, 0x18, 0xa2, 0x80, 0x60, 0x94, 0x20, 0x05, + 0x70, 0xc6, 0x70, 0x10, 0xa0, 0x15, 0x09, 0x04, 0x60, 0x80, 0x08, 0x0c, + 0x15, 0xe4, 0x11, 0x18, 0x70, 0x07, 0x00, 0x0f, 0x00, 0x05, 0x2d, 0x00, + 0x70, 0x22, 0x70, 0xc4, 0x20, 0x60, 0x2c, 0x05, 0x68, 0x36, 0xe0, 0x04, + 0xad, 0x00, 0x70, 0x96, 0xe0, 0x08, 0xa2, 0x0a, 0x12, 0x10, 0xa0, 0x0e, + 0x22, 0x00, 0x71, 0x12, 0xe2, 0x0c, 0x80, 0x03, 0x80, 0x0b, 0xa2, 0x96, + 0x00, 0x04, 0x01, 0x08, 0xa1, 0x08, 0x71, 0x9a, 0x81, 0x0b, 0x71, 0x9e, + 0xae, 0x90, 0x00, 0x22, 0x08, 0x0c, 0x16, 0x48, 0x70, 0x90, 0xa0, 0x8e, + 0x01, 0x00, 0x01, 0x70, 0xa0, 0x86, 0x02, 0x00, 0x01, 0x18, 0x70, 0x07, + 0x00, 0x10, 0x00, 0x05, 0x70, 0x20, 0x20, 0x68, 0x08, 0x0c, 0x16, 0x14, + 0x70, 0x14, 0x20, 0x68, 0x08, 0x04, 0x5f, 0xb0, 0x70, 0x20, 0x20, 0x68, + 0x70, 0x18, 0x68, 0x02, 0x68, 0x07, 0x00, 0x00, 0x2d, 0x08, 0x20, 0x68, + 0x69, 0x06, 0x71, 0x1a, 0x08, 0x04, 0x60, 0x3b, 0x70, 0x14, 0x20, 0x68, + 0x70, 0x07, 0x00, 0x01, 0x68, 0x84, 0xa0, 0x05, 0x11, 0x28, 0x68, 0x88, + 0x69, 0x8c, 0xa1, 0x05, 0x01, 0x08, 0x00, 0xb1, 0x68, 0x34, 0xa0, 0x84, + 0x00, 0xff, 0xa0, 0x86, 0x00, 0x1e, 0x09, 0x04, 0x62, 0xe0, 0x04, 0xb8, + 0x60, 0x96, 0x60, 0x9a, 0x00, 0x02, 0x00, 0x11, 0x00, 0x07, 0x00, 0x04, + 0x00, 0x0a, 0x00, 0x0f, 0x00, 0x05, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x11, + 0x00, 0x05, 0x00, 0x04, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xc6, 0x00, 0x76, + 0x00, 0x66, 0x6f, 0x88, 0x6e, 0x8c, 0x68, 0x04, 0x20, 0x60, 0xac, 0xf0, + 0x00, 0x21, 0xac, 0xf8, 0x00, 0x27, 0x20, 0x09, 0x00, 0x05, 0x70, 0x0c, + 0x78, 0x16, 0x70, 0x08, 0x78, 0x12, 0x70, 0x04, 0x78, 0x06, 0x70, 0x00, + 0x78, 0x02, 0x7e, 0x0e, 0x7f, 0x0a, 0x81, 0x09, 0x01, 0x28, 0xae, 0xf2, + 0x00, 0x04, 0xaf, 0xfa, 0x00, 0x06, 0x0c, 0x78, 0x60, 0x04, 0xa0, 0x65, + 0x1d, 0x30, 0x00, 0x6e, 0x00, 0x7e, 0x00, 0xce, 0x00, 0xee, 0x00, 0xfe, + 0x00, 0x05, 0x20, 0x09, 0xb6, 0x31, 0x21, 0x0c, 0x81, 0xff, 0x11, 0x98, + 0x68, 0x38, 0xa0, 0x84, 0x00, 0xff, 0x68, 0x3a, 0x08, 0x0c, 0x4c, 0xd7, + 0x11, 0x08, 0x00, 0x05, 0x08, 0x0c, 0x55, 0x4d, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0x9f, 0x88, 0x08, 0x0c, 0x54, 0x7a, 0x01, 0x2e, + 0x0c, 0xa0, 0x20, 0x01, 0x00, 0x28, 0x20, 0x09, 0x00, 0x00, 0x0c, 0x80, + 0x20, 0x09, 0xb6, 0x31, 0x21, 0x0c, 0x81, 0xff, 0x11, 0xb0, 0x68, 0x58, + 0xa0, 0x05, 0x01, 0xc0, 0x68, 0x38, 0xa0, 0x84, 0x00, 0xff, 0x68, 0x3a, + 0x68, 0x53, 0x00, 0x00, 0x08, 0x0c, 0x4d, 0x98, 0x11, 0x08, 0x00, 0x05, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x68, 0x4a, 0x69, 0x52, 0x08, 0x0c, + 0x54, 0x7a, 0x01, 0x2e, 0x0c, 0xb0, 0x20, 0x01, 0x00, 0x28, 0x20, 0x09, + 0x00, 0x00, 0x0c, 0x90, 0x20, 0x01, 0x00, 0x00, 0x0c, 0x78, 0x70, 0x18, + 0x68, 0x02, 0x2d, 0x08, 0x20, 0x68, 0x69, 0x06, 0x71, 0x1a, 0x70, 0x10, + 0x80, 0x01, 0x70, 0x12, 0x01, 0x18, 0x70, 0x07, 0x00, 0x06, 0x00, 0x30, + 0x70, 0x14, 0x20, 0x68, 0x70, 0x07, 0x00, 0x01, 0x70, 0x48, 0x08, 0x0f, + 0x00, 0x05, 0x70, 0x07, 0x00, 0x01, 0x69, 0x44, 0x81, 0x0f, 0xa1, 0x8c, + 0x00, 0xff, 0x68, 0x48, 0xa0, 0x84, 0x00, 0xff, 0x20, 0xa9, 0x00, 0x01, + 0xa0, 0x96, 0x00, 0x01, 0x01, 0xb0, 0x20, 0x09, 0x00, 0x00, 0x20, 0xa9, + 0x00, 0xff, 0xa0, 0x96, 0x00, 0x02, 0x01, 0x78, 0xa0, 0x05, 0x11, 0xf0, + 0x69, 0x44, 0x81, 0x0f, 0xa1, 0x8c, 0x00, 0xff, 0x08, 0x0c, 0x50, 0x1b, + 0x11, 0xb8, 0x00, 0x66, 0x6e, 0x50, 0x08, 0x0c, 0x51, 0x1a, 0x00, 0x6e, + 0x00, 0x88, 0x00, 0x46, 0x20, 0x11, 0xb6, 0x0c, 0x22, 0x24, 0xc4, 0x84, + 0x24, 0x12, 0x00, 0x4e, 0x00, 0xc6, 0x08, 0x0c, 0x50, 0x1b, 0x11, 0x10, + 0x08, 0x0c, 0x52, 0x7b, 0x81, 0x08, 0x1f, 0x04, 0x61, 0x4b, 0x00, 0xce, + 0x68, 0x4c, 0xd0, 0x84, 0x11, 0x18, 0x08, 0x0c, 0x16, 0x14, 0x00, 0x05, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x54, 0x7a, 0x01, 0x2e, + 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x70, 0x07, 0x00, 0x01, + 0x20, 0x01, 0xb6, 0x53, 0x20, 0x04, 0xd0, 0xa4, 0x05, 0x80, 0x20, 0x61, + 0xb9, 0x75, 0x61, 0x00, 0xd1, 0x84, 0x01, 0x78, 0x68, 0x58, 0xa0, 0x84, + 0x00, 0xff, 0x15, 0x50, 0x60, 0x00, 0xd0, 0x84, 0x05, 0x20, 0x60, 0x04, + 0xa0, 0x05, 0x15, 0x38, 0x60, 0x03, 0x00, 0x00, 0x60, 0x0b, 0x00, 0x00, + 0x00, 0xc8, 0x20, 0x11, 0x00, 0x01, 0x68, 0x60, 0xa0, 0x05, 0x11, 0x10, + 0x20, 0x01, 0x00, 0x1e, 0x80, 0x00, 0x60, 0x16, 0x68, 0x58, 0xa0, 0x84, + 0x00, 0xff, 0x01, 0x78, 0x60, 0x06, 0x68, 0x58, 0x80, 0x07, 0xa0, 0x84, + 0x00, 0xff, 0x01, 0x48, 0x60, 0x0a, 0x68, 0x58, 0x80, 0x00, 0x11, 0x08, + 0xc2, 0x8d, 0x62, 0x02, 0x01, 0x2e, 0x08, 0x04, 0x63, 0xa4, 0x01, 0x2e, + 0x08, 0x04, 0x63, 0x9e, 0x01, 0x2e, 0x08, 0x04, 0x63, 0x98, 0x01, 0x2e, + 0x08, 0x04, 0x63, 0x9b, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x70, 0x07, + 0x00, 0x01, 0x20, 0x01, 0xb6, 0x53, 0x20, 0x04, 0xd0, 0xa4, 0x05, 0xe0, + 0x20, 0x61, 0xb9, 0x75, 0x60, 0x00, 0xd0, 0x84, 0x05, 0xb8, 0x62, 0x04, + 0x63, 0x08, 0xd0, 0x8c, 0x15, 0x30, 0x6c, 0x48, 0xa4, 0x84, 0x00, 0x03, + 0x01, 0x70, 0x69, 0x58, 0xa1, 0x8c, 0x00, 0xff, 0x80, 0x01, 0x11, 0x20, + 0x21, 0x00, 0xa2, 0x10, 0x06, 0x20, 0x00, 0x28, 0x80, 0x01, 0x15, 0x08, + 0x21, 0x00, 0xa2, 0x12, 0x02, 0xf0, 0xa4, 0x84, 0x00, 0x0c, 0x01, 0x88, + 0x69, 0x58, 0x81, 0x0f, 0xa1, 0x8c, 0x00, 0xff, 0xa0, 0x82, 0x00, 0x04, + 0x11, 0x20, 0x21, 0x00, 0xa3, 0x18, 0x02, 0x88, 0x00, 0x30, 0xa0, 0x82, + 0x00, 0x04, 0x11, 0x68, 0x21, 0x00, 0xa3, 0x1a, 0x02, 0x50, 0x68, 0x60, + 0xa0, 0x05, 0x01, 0x10, 0x80, 0x00, 0x60, 0x16, 0x62, 0x06, 0x63, 0x0a, + 0x01, 0x2e, 0x08, 0x04, 0x63, 0xa4, 0x01, 0x2e, 0x08, 0x04, 0x63, 0xa1, + 0x01, 0x2e, 0x08, 0x04, 0x63, 0x9e, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x70, 0x07, 0x00, 0x01, 0x20, 0x61, 0xb9, 0x75, 0x63, 0x00, 0xd3, 0x8c, + 0x11, 0x20, 0x63, 0x08, 0x83, 0x18, 0x02, 0x20, 0x63, 0x0a, 0x01, 0x2e, + 0x08, 0x04, 0x63, 0xb2, 0x01, 0x2e, 0x08, 0x04, 0x63, 0xa1, 0x01, 0x26, + 0x00, 0xc6, 0x20, 0x91, 0x80, 0x00, 0x70, 0x07, 0x00, 0x01, 0x68, 0x4c, + 0xd0, 0xac, 0x01, 0x48, 0x00, 0xc6, 0x20, 0x61, 0xb9, 0x75, 0x60, 0x00, + 0xa0, 0x84, 0xfc, 0xff, 0x60, 0x02, 0x00, 0xce, 0x04, 0x48, 0x68, 0x58, + 0xa0, 0x05, 0x05, 0xd0, 0x68, 0x5c, 0xa0, 0x65, 0x05, 0x98, 0x20, 0x01, + 0xb6, 0x31, 0x20, 0x04, 0xa0, 0x05, 0x01, 0x18, 0x08, 0x0c, 0x9e, 0xd9, + 0x00, 0x68, 0x60, 0x13, 0x04, 0x00, 0x60, 0x57, 0x00, 0x00, 0x69, 0x4c, + 0xd1, 0xa4, 0x01, 0x10, 0x69, 0x50, 0x61, 0x56, 0x20, 0x09, 0x00, 0x41, + 0x08, 0x0c, 0x86, 0xd3, 0x69, 0x58, 0xa1, 0x8c, 0xff, 0x00, 0xa1, 0x86, + 0x20, 0x00, 0x11, 0x40, 0x00, 0x26, 0x20, 0x09, 0x00, 0x00, 0x20, 0x11, + 0xfd, 0xff, 0x08, 0x0c, 0x6b, 0x8c, 0x00, 0x2e, 0x68, 0x4c, 0xd0, 0xc4, + 0x01, 0x48, 0x20, 0x61, 0xb9, 0x75, 0x60, 0x00, 0xd0, 0x8c, 0x11, 0x20, + 0x60, 0x08, 0x80, 0x00, 0x02, 0x08, 0x60, 0x0a, 0x00, 0xce, 0x01, 0x2e, + 0x08, 0x04, 0x63, 0xa4, 0x00, 0xce, 0x01, 0x2e, 0x08, 0x04, 0x63, 0x9e, + 0x69, 0x54, 0xa1, 0x86, 0x00, 0x2e, 0x0d, 0x40, 0xa1, 0x86, 0x00, 0x2d, + 0x0d, 0x28, 0xa1, 0x86, 0x00, 0x45, 0x05, 0x28, 0xa1, 0x86, 0x00, 0x2a, + 0x11, 0x30, 0x20, 0x01, 0xb6, 0x0c, 0x20, 0x0c, 0xc1, 0x94, 0x21, 0x02, + 0x08, 0xc8, 0xa1, 0x86, 0x00, 0x20, 0x01, 0x70, 0xa1, 0x86, 0x00, 0x29, + 0x1d, 0x18, 0x69, 0x44, 0xa1, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0x08, 0x0c, + 0x50, 0x1b, 0x19, 0x60, 0x60, 0x00, 0xc0, 0xe4, 0x60, 0x02, 0x08, 0x40, + 0x68, 0x5c, 0xa0, 0x65, 0x09, 0xa8, 0x60, 0x07, 0x00, 0x24, 0x20, 0x01, + 0xb8, 0xb6, 0x20, 0x04, 0x60, 0x16, 0x08, 0x04, 0x62, 0x3c, 0x68, 0x5c, + 0xa0, 0x65, 0x09, 0x50, 0x00, 0xe6, 0x68, 0x60, 0xa0, 0x75, 0x20, 0x01, + 0xb6, 0x31, 0x20, 0x04, 0xa0, 0x05, 0x01, 0x50, 0x08, 0x0c, 0x9e, 0xd9, + 0x8e, 0xff, 0x01, 0x18, 0x2e, 0x60, 0x08, 0x0c, 0x9e, 0xd9, 0x00, 0xee, + 0x08, 0x04, 0x62, 0x3c, 0x60, 0x20, 0xc0, 0xdc, 0xc0, 0xd5, 0x60, 0x22, + 0x2e, 0x60, 0x60, 0x07, 0x00, 0x3a, 0x68, 0x70, 0xa0, 0x05, 0x01, 0x30, + 0x60, 0x07, 0x00, 0x3b, 0x68, 0x74, 0x60, 0x2a, 0x68, 0x78, 0x60, 0x12, + 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x6c, 0xff, 0x08, 0x0c, 0x71, 0xe5, + 0x00, 0xee, 0x08, 0x04, 0x62, 0x3c, 0x20, 0x61, 0xb9, 0x75, 0x60, 0x00, + 0xd0, 0x84, 0x01, 0x90, 0xd0, 0x8c, 0x19, 0x04, 0x63, 0xb2, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x62, 0x04, 0x82, 0x10, 0x02, 0x20, 0x62, 0x06, + 0x01, 0x2e, 0x08, 0x04, 0x63, 0xb2, 0x01, 0x2e, 0x68, 0x53, 0x00, 0x16, + 0x08, 0x04, 0x63, 0xab, 0x68, 0x53, 0x00, 0x07, 0x08, 0x04, 0x63, 0xab, + 0x68, 0x34, 0x80, 0x07, 0xa0, 0x84, 0x00, 0xff, 0x11, 0x18, 0x08, 0x0c, + 0x5f, 0x94, 0x00, 0x78, 0x20, 0x30, 0x80, 0x01, 0x11, 0x20, 0x70, 0x07, + 0x00, 0x01, 0x00, 0x51, 0x00, 0x40, 0x70, 0x07, 0x00, 0x06, 0x70, 0x12, + 0x2d, 0x00, 0x70, 0x16, 0x70, 0x1a, 0x70, 0x4b, 0x62, 0xe0, 0x00, 0x05, + 0x00, 0xe6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0xa0, 0x3e, 0x20, 0x09, + 0xb6, 0x31, 0x21, 0x0c, 0x81, 0xff, 0x19, 0x04, 0x63, 0x5e, 0x20, 0x09, + 0xb6, 0x0c, 0x21, 0x0c, 0xd1, 0x94, 0x19, 0x04, 0x63, 0x88, 0x68, 0x48, + 0x20, 0x70, 0xae, 0x82, 0xbe, 0x00, 0x0a, 0x04, 0x63, 0x52, 0x20, 0x01, + 0xb6, 0x17, 0x20, 0x04, 0xae, 0x02, 0x1a, 0x04, 0x63, 0x52, 0x71, 0x1c, + 0xa1, 0x86, 0x00, 0x06, 0x19, 0x04, 0x63, 0x41, 0x70, 0x18, 0xa0, 0x05, + 0x09, 0x04, 0x63, 0x5e, 0x20, 0x04, 0xd0, 0xe4, 0x19, 0x04, 0x63, 0x83, + 0x20, 0x61, 0xb9, 0x75, 0x61, 0x00, 0xa1, 0x84, 0x03, 0x01, 0xa0, 0x86, + 0x00, 0x01, 0x15, 0x50, 0x70, 0x20, 0xd0, 0xdc, 0x19, 0x04, 0x63, 0x8b, + 0x68, 0x53, 0x00, 0x00, 0x68, 0x03, 0x00, 0x00, 0x2d, 0x08, 0x70, 0x10, + 0xa0, 0x05, 0x11, 0x58, 0x71, 0x12, 0x68, 0x4c, 0xd0, 0xf4, 0x19, 0x04, + 0x63, 0x8e, 0x2e, 0x60, 0x08, 0x0c, 0x6a, 0xe8, 0x01, 0x2e, 0x00, 0xee, + 0x00, 0x05, 0x20, 0x68, 0x68, 0x00, 0xa0, 0x05, 0x1d, 0xe0, 0x69, 0x02, + 0x21, 0x68, 0x68, 0x4c, 0xd0, 0xf4, 0x19, 0x04, 0x63, 0x8e, 0x01, 0x2e, + 0x00, 0xee, 0x00, 0x05, 0x01, 0x2e, 0x00, 0xee, 0x68, 0x53, 0x00, 0x06, + 0x08, 0x04, 0x63, 0xab, 0xd1, 0x84, 0x0d, 0xc0, 0xd1, 0xc4, 0x11, 0xa8, + 0x00, 0xb8, 0x69, 0x44, 0xa1, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0x08, 0x0c, + 0x50, 0x1b, 0x15, 0xd8, 0x60, 0x00, 0xd0, 0xe4, 0x15, 0xc0, 0x71, 0x1c, + 0xa1, 0x86, 0x00, 0x07, 0x11, 0x18, 0x68, 0x53, 0x00, 0x02, 0x04, 0x98, + 0x68, 0x53, 0x00, 0x08, 0x04, 0x80, 0x68, 0x53, 0x00, 0x0e, 0x04, 0x68, + 0x68, 0x53, 0x00, 0x17, 0x04, 0x50, 0x68, 0x53, 0x00, 0x35, 0x04, 0x38, + 0x20, 0x01, 0xb6, 0x72, 0x20, 0x04, 0xd0, 0xfc, 0x01, 0xe8, 0x68, 0x48, + 0x20, 0x70, 0xae, 0x82, 0xbe, 0x00, 0x02, 0xc0, 0x60, 0x5c, 0xae, 0x02, + 0x12, 0xa8, 0x71, 0x1c, 0xa1, 0x86, 0x00, 0x06, 0x11, 0x88, 0x70, 0x18, + 0xa0, 0x05, 0x01, 0x70, 0x20, 0x04, 0xd0, 0xbc, 0x01, 0x58, 0x20, 0x39, + 0x00, 0x01, 0x70, 0x00, 0xa0, 0x86, 0x00, 0x07, 0x19, 0x04, 0x62, 0xeb, + 0x70, 0x03, 0x00, 0x02, 0x08, 0x04, 0x62, 0xeb, 0x68, 0x53, 0x00, 0x28, + 0x00, 0x10, 0x68, 0x53, 0x00, 0x29, 0x01, 0x2e, 0x00, 0xee, 0x04, 0x18, + 0x68, 0x53, 0x00, 0x2a, 0x0c, 0xd0, 0x68, 0x53, 0x00, 0x45, 0x0c, 0xb8, + 0x2e, 0x60, 0x20, 0x19, 0x00, 0x02, 0x60, 0x17, 0x00, 0x14, 0x08, 0x0c, + 0xad, 0x9c, 0x01, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x20, 0x09, 0x00, 0x3e, + 0x00, 0x58, 0x20, 0x09, 0x00, 0x04, 0x00, 0x40, 0x20, 0x09, 0x00, 0x06, + 0x00, 0x28, 0x20, 0x09, 0x00, 0x16, 0x00, 0x10, 0x20, 0x09, 0x00, 0x01, + 0x68, 0x54, 0xa0, 0x84, 0xff, 0x00, 0xa1, 0x05, 0x68, 0x56, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x54, 0x7a, 0x01, 0x2e, 0x00, 0x05, + 0x08, 0x0c, 0x16, 0x14, 0x00, 0x05, 0x70, 0x2c, 0x71, 0x30, 0x81, 0x08, + 0xa1, 0x02, 0x02, 0x30, 0xa0, 0x0e, 0x70, 0x34, 0x70, 0x72, 0x70, 0x38, + 0x70, 0x76, 0x00, 0x58, 0x70, 0x70, 0xa0, 0x80, 0x00, 0x40, 0x70, 0x72, + 0x12, 0x30, 0x70, 0x74, 0xa0, 0x81, 0x00, 0x00, 0x70, 0x76, 0xa0, 0x85, + 0x00, 0x01, 0x79, 0x32, 0x71, 0x32, 0x00, 0x05, 0x00, 0xd6, 0x08, 0x0c, + 0x6a, 0xdf, 0x00, 0xde, 0x00, 0x05, 0x00, 0xd6, 0x00, 0xc6, 0x00, 0x36, + 0x00, 0x26, 0x00, 0x16, 0x70, 0x07, 0x00, 0x01, 0x6a, 0x44, 0xa2, 0x82, + 0x00, 0x04, 0x1a, 0x04, 0x64, 0x1e, 0xd2, 0x84, 0x01, 0x70, 0x6a, 0x4c, + 0xa2, 0x90, 0xb7, 0x35, 0x22, 0x04, 0xa0, 0x65, 0x60, 0x04, 0x05, 0xe0, + 0x80, 0x07, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x84, 0x00, 0x06, 0x11, 0x08, + 0x04, 0xa8, 0x2c, 0x10, 0x08, 0x0c, 0x86, 0x4e, 0x11, 0x18, 0x08, 0x0c, + 0x9f, 0x92, 0x05, 0xa0, 0x62, 0x1a, 0x68, 0x44, 0x00, 0x02, 0x63, 0xfd, + 0x64, 0x02, 0x64, 0x05, 0x64, 0x0b, 0x20, 0x19, 0x00, 0x02, 0x08, 0x0c, + 0xb1, 0x21, 0x00, 0x60, 0x08, 0x0c, 0xb0, 0xb8, 0x00, 0x48, 0x20, 0x19, + 0x00, 0x02, 0x69, 0x50, 0x08, 0x0c, 0xb0, 0xd3, 0x00, 0x18, 0x69, 0x50, + 0x08, 0x0c, 0xb0, 0xb8, 0x08, 0x0c, 0x86, 0xa4, 0x68, 0x57, 0x00, 0x00, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x54, 0x7a, 0x01, 0x2e, + 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x3e, 0x00, 0xce, 0x00, 0xde, 0x00, 0x05, + 0x68, 0x57, 0x00, 0x06, 0x0c, 0x88, 0x68, 0x57, 0x00, 0x02, 0x0c, 0x70, + 0x68, 0x57, 0x00, 0x05, 0x0c, 0x58, 0x68, 0x57, 0x00, 0x04, 0x0c, 0x40, + 0x68, 0x57, 0x00, 0x07, 0x0c, 0x28, 0x00, 0xd6, 0x20, 0x11, 0x00, 0x04, + 0x22, 0x04, 0xa0, 0x85, 0x80, 0x02, 0x20, 0x12, 0x00, 0xde, 0x00, 0x05, + 0x20, 0xe1, 0x00, 0x02, 0x3d, 0x08, 0x20, 0xe1, 0x20, 0x00, 0x3d, 0x00, + 0xa0, 0x84, 0x70, 0x00, 0x01, 0x18, 0xa0, 0x86, 0x10, 0x00, 0x15, 0x70, + 0x20, 0xe1, 0x00, 0x00, 0x3d, 0x00, 0xa0, 0x94, 0xff, 0x00, 0x82, 0x17, + 0xa0, 0x84, 0xf0, 0x00, 0xa0, 0x86, 0x30, 0x00, 0x11, 0x60, 0xa1, 0x84, + 0xff, 0x00, 0x80, 0x07, 0xa0, 0x86, 0x00, 0x08, 0x11, 0xe8, 0x08, 0x0c, + 0x2d, 0xf4, 0x11, 0xd0, 0x08, 0x0c, 0x66, 0x75, 0x00, 0x98, 0x20, 0xe1, + 0x00, 0x04, 0x3d, 0x60, 0xd1, 0xbc, 0x11, 0x08, 0x3e, 0x60, 0xac, 0x84, + 0x00, 0x07, 0x11, 0x70, 0xac, 0x82, 0xbe, 0x00, 0x02, 0x58, 0x68, 0x5c, + 0xac, 0x02, 0x12, 0x40, 0x20, 0x09, 0x00, 0x47, 0x08, 0x0c, 0x86, 0xd3, + 0x7a, 0x1c, 0xd2, 0x84, 0x19, 0x38, 0x00, 0x05, 0xa0, 0x16, 0x08, 0x0c, + 0x18, 0x63, 0x0c, 0xc0, 0x0c, 0xd8, 0x78, 0x1c, 0xd0, 0x8c, 0x05, 0x00, + 0x01, 0x56, 0x01, 0x36, 0x01, 0x46, 0x20, 0xe1, 0x30, 0x00, 0x3d, 0x20, + 0x3e, 0x28, 0xa5, 0x84, 0x00, 0x76, 0x15, 0x38, 0xa4, 0x84, 0x70, 0x00, + 0xa0, 0x86, 0x10, 0x00, 0x11, 0xa8, 0x08, 0x0c, 0x64, 0xf0, 0x01, 0xf8, + 0x20, 0xe1, 0x30, 0x00, 0x78, 0x28, 0x78, 0x28, 0x08, 0x0c, 0x65, 0x0c, + 0x01, 0x4e, 0x01, 0x3e, 0x01, 0x5e, 0x20, 0x09, 0xb8, 0xe9, 0x21, 0x04, + 0xa0, 0x05, 0x11, 0x08, 0x00, 0x05, 0x08, 0x0c, 0x71, 0xe5, 0x0c, 0xe0, + 0xa4, 0x84, 0x70, 0x00, 0x15, 0x48, 0x08, 0x0c, 0x64, 0xf0, 0x01, 0xd8, + 0x70, 0x00, 0xa0, 0x84, 0xff, 0x00, 0xa0, 0x86, 0x81, 0x00, 0x0d, 0x10, + 0x00, 0xa0, 0xd5, 0xa4, 0x01, 0x78, 0x00, 0x56, 0x00, 0x46, 0x08, 0x0c, + 0x1e, 0x8a, 0x08, 0x0c, 0x24, 0xe5, 0x20, 0x01, 0x01, 0x60, 0x25, 0x02, + 0x20, 0x01, 0x01, 0x38, 0x22, 0x02, 0x00, 0x4e, 0x00, 0x5e, 0x00, 0x48, + 0x04, 0xa9, 0x68, 0x87, 0x00, 0x00, 0x08, 0x0c, 0xb4, 0x9b, 0x20, 0xe1, + 0x30, 0x00, 0x78, 0x28, 0x78, 0x28, 0x00, 0xb9, 0x01, 0x4e, 0x01, 0x3e, + 0x01, 0x5e, 0x08, 0x80, 0x04, 0x39, 0x11, 0x30, 0x70, 0x00, 0xa0, 0x84, + 0xff, 0x00, 0xa0, 0x86, 0x81, 0x00, 0x1d, 0x68, 0x08, 0x0c, 0xb4, 0x9b, + 0x20, 0xe1, 0x30, 0x00, 0x78, 0x28, 0x78, 0x28, 0x00, 0x56, 0x08, 0x0c, + 0x68, 0xe6, 0x00, 0x5e, 0x0c, 0x40, 0x20, 0x01, 0xb6, 0x0e, 0x20, 0x04, + 0xd0, 0x8c, 0x01, 0x78, 0x20, 0x01, 0xb6, 0x00, 0x20, 0x04, 0xa0, 0x86, + 0x00, 0x03, 0x11, 0x48, 0x00, 0x26, 0x00, 0x36, 0x20, 0x11, 0x80, 0x48, + 0x25, 0x18, 0x08, 0x0c, 0x3f, 0x13, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x05, + 0xa4, 0x84, 0x01, 0xff, 0x68, 0x86, 0xa0, 0x05, 0x01, 0x60, 0xa0, 0x80, + 0x00, 0x1f, 0xa0, 0x84, 0x03, 0xf8, 0x80, 0xac, 0x20, 0xe1, 0x10, 0x00, + 0x2e, 0xa0, 0x20, 0x99, 0x02, 0x0a, 0x53, 0xa5, 0x00, 0x05, 0x20, 0xa9, + 0x00, 0x0c, 0x20, 0xe1, 0x10, 0x00, 0x2e, 0xa0, 0x20, 0x99, 0x02, 0x0a, + 0x53, 0xa5, 0xa0, 0x85, 0x00, 0x01, 0x0c, 0xa0, 0x70, 0x00, 0xa0, 0x84, + 0xff, 0x00, 0xa0, 0x8c, 0xf0, 0x00, 0x80, 0x07, 0xa1, 0x96, 0x00, 0x00, + 0x11, 0x18, 0x08, 0x04, 0x67, 0x7a, 0x00, 0x05, 0xa1, 0x96, 0x20, 0x00, + 0x11, 0x48, 0x69, 0x00, 0xa1, 0x8e, 0x00, 0x01, 0x11, 0x18, 0x08, 0x0c, + 0x44, 0xd6, 0x0c, 0xa8, 0x00, 0x39, 0x0c, 0x98, 0xa1, 0x96, 0x80, 0x00, + 0x1d, 0x80, 0x08, 0x0c, 0x68, 0x26, 0x0c, 0x68, 0x00, 0xc6, 0x6a, 0x84, + 0x82, 0xff, 0x09, 0x04, 0x66, 0x6f, 0x71, 0x10, 0xa1, 0x8c, 0xff, 0x00, + 0x81, 0x0f, 0xa1, 0x96, 0x00, 0x01, 0x01, 0x20, 0xa1, 0x96, 0x00, 0x23, + 0x19, 0x04, 0x66, 0x6f, 0xa0, 0x8e, 0x00, 0x23, 0x15, 0x70, 0x08, 0x0c, + 0x68, 0xc1, 0x09, 0x04, 0x66, 0x6f, 0x71, 0x24, 0x61, 0x0a, 0x70, 0x30, + 0xa0, 0x8e, 0x02, 0x00, 0x11, 0x50, 0x70, 0x34, 0xa0, 0x05, 0x19, 0x04, + 0x66, 0x6f, 0x20, 0x09, 0x00, 0x15, 0x08, 0x0c, 0x86, 0xd3, 0x08, 0x04, + 0x66, 0x6f, 0xa0, 0x8e, 0x02, 0x14, 0x01, 0x18, 0xa0, 0x8e, 0x02, 0x10, + 0x11, 0x30, 0x20, 0x09, 0x00, 0x15, 0x08, 0x0c, 0x86, 0xd3, 0x08, 0x04, + 0x66, 0x6f, 0xa0, 0x8e, 0x01, 0x00, 0x19, 0x04, 0x66, 0x6f, 0x70, 0x34, + 0xa0, 0x05, 0x19, 0x04, 0x66, 0x6f, 0x20, 0x09, 0x00, 0x16, 0x08, 0x0c, + 0x86, 0xd3, 0x08, 0x04, 0x66, 0x6f, 0xa0, 0x8e, 0x00, 0x22, 0x19, 0x04, + 0x66, 0x6f, 0x70, 0x30, 0xa0, 0x8e, 0x03, 0x00, 0x15, 0x80, 0x68, 0xd4, + 0xd0, 0xa4, 0x05, 0x28, 0xc0, 0xb5, 0x68, 0xd6, 0x71, 0x00, 0xa1, 0x8c, + 0x00, 0xff, 0x69, 0x72, 0x70, 0x04, 0x68, 0x76, 0x00, 0xf6, 0x20, 0x79, + 0x01, 0x00, 0x79, 0xe6, 0x78, 0xea, 0x00, 0x06, 0xa0, 0x84, 0x00, 0xff, + 0x00, 0x16, 0x20, 0x08, 0x08, 0x0c, 0x28, 0x7c, 0x79, 0x32, 0x79, 0x36, + 0x00, 0x1e, 0x00, 0x0e, 0x00, 0xfe, 0x08, 0x0c, 0x28, 0x52, 0x69, 0x52, + 0x70, 0x3c, 0x00, 0xe6, 0x20, 0x71, 0x01, 0x40, 0x70, 0x86, 0x20, 0x71, + 0xb6, 0x00, 0x70, 0xa6, 0x00, 0xee, 0x70, 0x34, 0xa0, 0x05, 0x19, 0x04, + 0x66, 0x6f, 0x20, 0x09, 0x00, 0x17, 0x08, 0x04, 0x66, 0x35, 0xa0, 0x8e, + 0x04, 0x00, 0x11, 0x58, 0x70, 0x34, 0xa0, 0x05, 0x19, 0x04, 0x66, 0x6f, + 0x68, 0xd4, 0xc0, 0xa5, 0x68, 0xd6, 0x20, 0x09, 0x00, 0x30, 0x08, 0x04, + 0x66, 0x35, 0xa0, 0x8e, 0x05, 0x00, 0x11, 0x40, 0x70, 0x34, 0xa0, 0x05, + 0x19, 0x04, 0x66, 0x6f, 0x20, 0x09, 0x00, 0x18, 0x08, 0x04, 0x66, 0x35, + 0xa0, 0x8e, 0x20, 0x10, 0x11, 0x20, 0x20, 0x09, 0x00, 0x19, 0x08, 0x04, + 0x66, 0x35, 0xa0, 0x8e, 0x21, 0x10, 0x11, 0x20, 0x20, 0x09, 0x00, 0x1a, + 0x08, 0x04, 0x66, 0x35, 0xa0, 0x8e, 0x52, 0x00, 0x11, 0x40, 0x70, 0x34, + 0xa0, 0x05, 0x19, 0x04, 0x66, 0x6f, 0x20, 0x09, 0x00, 0x1b, 0x08, 0x04, + 0x66, 0x35, 0xa0, 0x8e, 0x50, 0x00, 0x11, 0x40, 0x70, 0x34, 0xa0, 0x05, + 0x19, 0x04, 0x66, 0x6f, 0x20, 0x09, 0x00, 0x1c, 0x08, 0x04, 0x66, 0x35, + 0xa0, 0x8e, 0x13, 0x00, 0x11, 0x20, 0x20, 0x09, 0x00, 0x34, 0x08, 0x04, + 0x66, 0x35, 0xa0, 0x8e, 0x12, 0x00, 0x11, 0x40, 0x70, 0x34, 0xa0, 0x05, + 0x19, 0x04, 0x66, 0x6f, 0x20, 0x09, 0x00, 0x24, 0x08, 0x04, 0x66, 0x35, + 0xa0, 0x8c, 0xff, 0x00, 0xa1, 0x8e, 0x24, 0x00, 0x11, 0x18, 0x20, 0x09, + 0x00, 0x2d, 0x04, 0xd8, 0xa0, 0x8c, 0xff, 0x00, 0xa1, 0x8e, 0x53, 0x00, + 0x11, 0x18, 0x20, 0x09, 0x00, 0x2a, 0x04, 0x98, 0xa0, 0x8e, 0x0f, 0x00, + 0x11, 0x18, 0x20, 0x09, 0x00, 0x20, 0x04, 0x68, 0xa0, 0x8e, 0x53, 0x00, + 0x11, 0x08, 0x00, 0xd8, 0xa0, 0x8e, 0x61, 0x04, 0x11, 0xc0, 0x20, 0x11, + 0xbc, 0x8d, 0x82, 0x08, 0x22, 0x04, 0xa0, 0x82, 0x00, 0x04, 0x20, 0xa8, + 0x95, 0xac, 0x95, 0xac, 0x20, 0x11, 0x80, 0x15, 0x21, 0x1c, 0x81, 0x08, + 0x00, 0x46, 0x21, 0x24, 0x08, 0x0c, 0x3f, 0x13, 0x00, 0x4e, 0x81, 0x08, + 0x1f, 0x04, 0x66, 0x18, 0x20, 0x09, 0x00, 0x23, 0x00, 0x70, 0xa0, 0x8e, + 0x60, 0x00, 0x11, 0x18, 0x20, 0x09, 0x00, 0x3f, 0x00, 0x40, 0xa0, 0x8e, + 0x78, 0x00, 0x11, 0x18, 0x20, 0x09, 0x00, 0x45, 0x00, 0x10, 0x20, 0x09, + 0x00, 0x1d, 0x00, 0x16, 0x20, 0x11, 0xbc, 0x83, 0x22, 0x04, 0x82, 0x11, + 0x22, 0x0c, 0x08, 0x0c, 0x28, 0x52, 0x15, 0x98, 0x08, 0x0c, 0x4f, 0xbf, + 0x15, 0x80, 0x66, 0x12, 0x65, 0x16, 0x86, 0xff, 0x01, 0xe8, 0x00, 0x1e, + 0x00, 0x16, 0xa1, 0x86, 0x00, 0x17, 0x11, 0x58, 0x68, 0x70, 0xa6, 0x06, + 0x11, 0xa8, 0x68, 0x74, 0xa5, 0x06, 0xa0, 0x84, 0xff, 0x00, 0x11, 0x80, + 0x60, 0x00, 0xc0, 0xf5, 0x60, 0x02, 0xa1, 0x86, 0x00, 0x46, 0x11, 0x50, + 0x68, 0x70, 0xa6, 0x06, 0x11, 0x38, 0x68, 0x74, 0xa5, 0x06, 0xa0, 0x84, + 0xff, 0x00, 0x11, 0x10, 0x00, 0x1e, 0x00, 0x68, 0x00, 0xc6, 0x08, 0x0c, + 0x86, 0x4e, 0x01, 0x68, 0x00, 0x1e, 0x61, 0x1a, 0x60, 0x1f, 0x00, 0x04, + 0x71, 0x20, 0x61, 0x0a, 0x00, 0x1e, 0x08, 0x0c, 0x86, 0xd3, 0x00, 0xce, + 0x00, 0x05, 0x00, 0x1e, 0x0c, 0xe0, 0x00, 0xce, 0x0c, 0xe0, 0x00, 0xc6, + 0x00, 0x46, 0x08, 0x0c, 0x66, 0xc9, 0x19, 0x04, 0x66, 0xc6, 0xa2, 0x8e, + 0x00, 0x33, 0x11, 0xe8, 0x08, 0x0c, 0x68, 0xc1, 0x09, 0x04, 0x66, 0xc6, + 0x71, 0x24, 0x61, 0x0a, 0x70, 0x30, 0xa0, 0x8e, 0x02, 0x00, 0x11, 0x40, + 0x70, 0x34, 0xa0, 0x05, 0x15, 0xd8, 0x20, 0x09, 0x00, 0x15, 0x08, 0x0c, + 0x86, 0xd3, 0x04, 0xb0, 0xa0, 0x8e, 0x01, 0x00, 0x15, 0x98, 0x70, 0x34, + 0xa0, 0x05, 0x15, 0x80, 0x20, 0x09, 0x00, 0x16, 0x08, 0x0c, 0x86, 0xd3, + 0x04, 0x58, 0xa2, 0x8e, 0x00, 0x32, 0x15, 0x40, 0x70, 0x30, 0xa0, 0x8e, + 0x14, 0x00, 0x15, 0x20, 0x20, 0x09, 0x00, 0x38, 0x00, 0x16, 0x20, 0x11, + 0xbc, 0x83, 0x22, 0x04, 0x82, 0x11, 0x22, 0x0c, 0x08, 0x0c, 0x28, 0x52, + 0x11, 0xc0, 0x08, 0x0c, 0x4f, 0xbf, 0x11, 0xa8, 0x66, 0x12, 0x65, 0x16, + 0x00, 0xc6, 0x08, 0x0c, 0x86, 0x4e, 0x01, 0x70, 0x00, 0x1e, 0x61, 0x1a, + 0x08, 0x0c, 0xa0, 0xe3, 0x60, 0x1f, 0x00, 0x04, 0x71, 0x20, 0x61, 0x0a, + 0x00, 0x1e, 0x08, 0x0c, 0x86, 0xd3, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x10, + 0x00, 0xce, 0x00, 0x1e, 0x00, 0x4e, 0x00, 0xce, 0x00, 0x05, 0x00, 0xf6, + 0x00, 0xd6, 0x00, 0x26, 0x00, 0x16, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, + 0x3c, 0x00, 0x00, 0x06, 0x20, 0x79, 0x00, 0x30, 0x20, 0x69, 0x02, 0x00, + 0x08, 0x0c, 0x1f, 0x49, 0x15, 0x90, 0x08, 0x0c, 0x1d, 0xee, 0x05, 0xe0, + 0x04, 0xf1, 0x11, 0x30, 0x79, 0x08, 0xa1, 0x8c, 0x1f, 0xff, 0xa1, 0x82, + 0x00, 0x11, 0x16, 0x88, 0x20, 0xa9, 0x00, 0x0c, 0x20, 0xe1, 0x00, 0x00, + 0x2e, 0xa0, 0x20, 0x99, 0x02, 0x0a, 0x53, 0xa5, 0x20, 0xe1, 0x20, 0x00, + 0x20, 0x01, 0x02, 0x0a, 0x20, 0x04, 0x7a, 0x0c, 0x78, 0x08, 0xa0, 0x80, + 0x00, 0x07, 0xa0, 0x84, 0x1f, 0xf8, 0x04, 0x19, 0x11, 0x20, 0xa0, 0x8a, + 0x01, 0x40, 0x1a, 0x0c, 0x15, 0x1a, 0x80, 0xac, 0x20, 0xe1, 0x60, 0x00, + 0x20, 0x99, 0x02, 0x0a, 0x53, 0xa5, 0x20, 0xe1, 0x70, 0x00, 0x68, 0x28, + 0x68, 0x28, 0x78, 0x03, 0x00, 0x04, 0xa2, 0x94, 0x00, 0x70, 0x00, 0x0e, + 0x20, 0xe0, 0x01, 0x5e, 0x01, 0x4e, 0x01, 0x3e, 0x00, 0x1e, 0x00, 0x2e, + 0x00, 0xde, 0x00, 0xfe, 0x00, 0x05, 0xa0, 0x16, 0x08, 0x0c, 0x18, 0x63, + 0xa0, 0x85, 0x00, 0x01, 0x0c, 0x80, 0x00, 0x06, 0x20, 0x01, 0x01, 0x11, + 0x20, 0x04, 0xa0, 0x84, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x46, + 0x00, 0xe6, 0x00, 0xd6, 0x20, 0x28, 0x21, 0x30, 0xa6, 0x96, 0x00, 0xff, + 0x11, 0x98, 0xa5, 0x96, 0xff, 0xfd, 0x11, 0x20, 0x20, 0x09, 0x00, 0x7f, + 0x08, 0x04, 0x67, 0x75, 0xa5, 0x96, 0xff, 0xfe, 0x11, 0x18, 0x20, 0x09, + 0x00, 0x7e, 0x04, 0xe8, 0xa5, 0x96, 0xff, 0xfc, 0x11, 0x18, 0x20, 0x09, + 0x00, 0x80, 0x04, 0xb8, 0x20, 0x11, 0x00, 0x00, 0x20, 0x19, 0xb6, 0x35, + 0x23, 0x1c, 0xd3, 0xac, 0x01, 0x38, 0x20, 0x21, 0x00, 0x00, 0x20, 0xa9, + 0x00, 0xff, 0x20, 0x71, 0xb7, 0x35, 0x00, 0x30, 0x20, 0x21, 0x00, 0x81, + 0x20, 0xa9, 0x00, 0x7e, 0x20, 0x71, 0xb7, 0xb6, 0x2e, 0x1c, 0x83, 0xff, + 0x11, 0x28, 0x82, 0xff, 0x11, 0x98, 0x24, 0x10, 0xc2, 0xfd, 0x00, 0x80, + 0x23, 0x68, 0x6f, 0x10, 0x00, 0x06, 0x21, 0x00, 0xa7, 0x06, 0x00, 0x0e, + 0x6b, 0x14, 0x11, 0x20, 0xa3, 0x46, 0x11, 0x10, 0x24, 0x08, 0x00, 0x78, + 0x87, 0xff, 0x11, 0x10, 0x83, 0xff, 0x0d, 0x58, 0x84, 0x20, 0x8e, 0x70, + 0x1f, 0x04, 0x67, 0x52, 0x82, 0xff, 0x11, 0x18, 0xa0, 0x85, 0x00, 0x01, + 0x00, 0x18, 0xc2, 0xfc, 0x22, 0x08, 0xa0, 0x06, 0x00, 0xde, 0x00, 0xee, + 0x00, 0x4e, 0x00, 0x05, 0xa0, 0x84, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x05, + 0x67, 0x86, 0x67, 0x86, 0x67, 0x86, 0x68, 0xd3, 0x67, 0x86, 0x67, 0x87, + 0x67, 0x9c, 0x68, 0x11, 0x00, 0x05, 0x71, 0x10, 0xd1, 0xbc, 0x01, 0x88, + 0x71, 0x20, 0x21, 0x60, 0xac, 0x8c, 0x00, 0x07, 0x11, 0x60, 0xac, 0x8a, + 0xbe, 0x00, 0x02, 0x48, 0x68, 0x5c, 0xac, 0x02, 0x12, 0x30, 0x71, 0x24, + 0x61, 0x0a, 0x20, 0x09, 0x00, 0x46, 0x08, 0x0c, 0x86, 0xd3, 0x00, 0x05, + 0x00, 0xc6, 0xa4, 0x84, 0x01, 0xff, 0x09, 0x04, 0x67, 0xef, 0x71, 0x10, + 0xd1, 0xbc, 0x19, 0x04, 0x67, 0xef, 0x20, 0x11, 0xbc, 0x83, 0x22, 0x04, + 0x82, 0x11, 0x22, 0x0c, 0x08, 0x0c, 0x28, 0x52, 0x19, 0x04, 0x67, 0xef, + 0x08, 0x0c, 0x4f, 0xbf, 0x15, 0xf0, 0x66, 0x12, 0x65, 0x16, 0x60, 0x00, + 0xd0, 0xec, 0x15, 0xc8, 0x62, 0x04, 0xa2, 0x94, 0xff, 0x00, 0x82, 0x17, + 0xa2, 0x86, 0x00, 0x06, 0x01, 0x48, 0x62, 0x04, 0xa2, 0x94, 0x00, 0xff, + 0xa2, 0x86, 0x00, 0x06, 0x11, 0xa0, 0xa2, 0x95, 0x06, 0x00, 0x62, 0x06, + 0x00, 0xc6, 0x08, 0x0c, 0x86, 0x4e, 0x00, 0x1e, 0x05, 0x30, 0x61, 0x1a, + 0x60, 0x1f, 0x00, 0x06, 0x71, 0x20, 0x61, 0x0a, 0x71, 0x30, 0x61, 0x52, + 0x20, 0x09, 0x00, 0x44, 0x08, 0x0c, 0x86, 0xd3, 0x00, 0xc0, 0x00, 0xc6, + 0x08, 0x0c, 0x86, 0x4e, 0x00, 0x1e, 0x01, 0x98, 0x61, 0x1a, 0x60, 0x1f, + 0x00, 0x04, 0x71, 0x20, 0x61, 0x0a, 0xa2, 0x86, 0x00, 0x04, 0x11, 0x18, + 0x60, 0x07, 0x00, 0x05, 0x00, 0x10, 0x60, 0x07, 0x00, 0x01, 0x60, 0x03, + 0x00, 0x01, 0x08, 0x0c, 0x6d, 0x45, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0xce, + 0x00, 0x05, 0x20, 0x01, 0xb6, 0x0d, 0x20, 0x04, 0xd0, 0xec, 0x01, 0x20, + 0x20, 0x11, 0x80, 0x49, 0x08, 0x0c, 0x3f, 0x13, 0x00, 0xc6, 0x08, 0x0c, + 0x9f, 0x92, 0x00, 0x1e, 0x0d, 0x80, 0x61, 0x1a, 0x60, 0x1f, 0x00, 0x06, + 0x71, 0x20, 0x61, 0x0a, 0x71, 0x30, 0x61, 0x52, 0x60, 0x13, 0x03, 0x00, + 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x41, 0x08, 0x0c, 0x6c, 0xff, + 0x08, 0x0c, 0x71, 0xe5, 0x08, 0xf0, 0x71, 0x10, 0xd1, 0xbc, 0x01, 0x88, + 0x70, 0x20, 0x20, 0x60, 0xac, 0x84, 0x00, 0x07, 0x11, 0x60, 0xac, 0x82, + 0xbe, 0x00, 0x02, 0x48, 0x68, 0x5c, 0xac, 0x02, 0x12, 0x30, 0x71, 0x24, + 0x61, 0x0a, 0x20, 0x09, 0x00, 0x45, 0x08, 0x0c, 0x86, 0xd3, 0x00, 0x05, + 0x00, 0x06, 0x08, 0x0c, 0x2d, 0xf4, 0x00, 0x0e, 0x11, 0x68, 0x71, 0x10, + 0xa1, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0xa1, 0x8e, 0x00, 0x00, 0x11, 0x30, + 0xa0, 0x84, 0x00, 0x0f, 0xa0, 0x8a, 0x00, 0x06, 0x12, 0x08, 0x00, 0x0b, + 0x00, 0x05, 0x68, 0x3f, 0x68, 0x40, 0x68, 0x3f, 0x68, 0x3f, 0x68, 0xa9, + 0x68, 0xb5, 0x00, 0x05, 0x71, 0x10, 0xd1, 0xbc, 0x01, 0x20, 0x70, 0x2c, + 0xd0, 0x84, 0x09, 0x04, 0x68, 0xa8, 0x70, 0x0c, 0x71, 0x08, 0x08, 0x0c, + 0x28, 0x52, 0x19, 0x04, 0x68, 0xa8, 0x08, 0x0c, 0x4f, 0xbf, 0x19, 0x04, + 0x68, 0xa8, 0x66, 0x12, 0x65, 0x16, 0x62, 0x04, 0x71, 0x10, 0xd1, 0xbc, + 0x01, 0xf8, 0xa2, 0x8c, 0x00, 0xff, 0xa1, 0x86, 0x00, 0x04, 0x01, 0x18, + 0xa1, 0x86, 0x00, 0x06, 0x15, 0xc8, 0x00, 0xc6, 0x08, 0x0c, 0x68, 0xc1, + 0x00, 0xce, 0x09, 0x04, 0x68, 0xa8, 0x00, 0xc6, 0x08, 0x0c, 0x86, 0x4e, + 0x00, 0x1e, 0x05, 0xf0, 0x61, 0x1a, 0x08, 0x0c, 0xa0, 0xe3, 0x60, 0x1f, + 0x00, 0x02, 0x71, 0x20, 0x61, 0x0a, 0x20, 0x09, 0x00, 0x88, 0x08, 0x0c, + 0x86, 0xd3, 0x04, 0x90, 0xa2, 0x8c, 0x00, 0xff, 0xa1, 0x86, 0x00, 0x06, + 0x01, 0x60, 0xa1, 0x86, 0x00, 0x04, 0x01, 0x48, 0xa2, 0x94, 0xff, 0x00, + 0x82, 0x17, 0xa2, 0x86, 0x00, 0x04, 0x01, 0x18, 0xa2, 0x86, 0x00, 0x06, + 0x11, 0x88, 0x00, 0xc6, 0x08, 0x0c, 0x86, 0x4e, 0x00, 0x1e, 0x01, 0xe0, + 0x61, 0x1a, 0x08, 0x0c, 0xa0, 0xe3, 0x60, 0x1f, 0x00, 0x05, 0x71, 0x20, + 0x61, 0x0a, 0x20, 0x09, 0x00, 0x88, 0x08, 0x0c, 0x86, 0xd3, 0x00, 0x80, + 0x00, 0xc6, 0x08, 0x0c, 0x86, 0x4e, 0x00, 0x1e, 0x01, 0x58, 0x61, 0x1a, + 0x08, 0x0c, 0xa0, 0xe3, 0x60, 0x1f, 0x00, 0x04, 0x71, 0x20, 0x61, 0x0a, + 0x20, 0x09, 0x00, 0x01, 0x08, 0x0c, 0x86, 0xd3, 0x00, 0x05, 0x71, 0x10, + 0xd1, 0xbc, 0x01, 0x40, 0x00, 0xa1, 0x01, 0x30, 0x71, 0x24, 0x61, 0x0a, + 0x20, 0x09, 0x00, 0x89, 0x08, 0x0c, 0x86, 0xd3, 0x00, 0x05, 0x71, 0x10, + 0xd1, 0xbc, 0x01, 0x40, 0x00, 0x41, 0x01, 0x30, 0x71, 0x24, 0x61, 0x0a, + 0x20, 0x09, 0x00, 0x8a, 0x08, 0x0c, 0x86, 0xd3, 0x00, 0x05, 0x70, 0x20, + 0x20, 0x60, 0xac, 0x84, 0x00, 0x07, 0x11, 0x58, 0xac, 0x82, 0xbe, 0x00, + 0x02, 0x40, 0x20, 0x01, 0xb6, 0x17, 0x20, 0x04, 0xac, 0x02, 0x12, 0x18, + 0xa0, 0x85, 0x00, 0x01, 0x00, 0x05, 0xa0, 0x06, 0x0c, 0xe8, 0x71, 0x10, + 0xd1, 0xbc, 0x11, 0x78, 0x70, 0x24, 0x20, 0x60, 0xac, 0x84, 0x00, 0x07, + 0x11, 0x50, 0xac, 0x82, 0xbe, 0x00, 0x02, 0x38, 0x68, 0x5c, 0xac, 0x02, + 0x12, 0x20, 0x20, 0x09, 0x00, 0x51, 0x08, 0x0c, 0x86, 0xd3, 0x00, 0x05, + 0x20, 0x31, 0x01, 0x05, 0x00, 0x69, 0x00, 0x05, 0x20, 0x31, 0x02, 0x06, + 0x00, 0x49, 0x00, 0x05, 0x20, 0x31, 0x02, 0x07, 0x00, 0x29, 0x00, 0x05, + 0x20, 0x31, 0x02, 0x13, 0x00, 0x09, 0x00, 0x05, 0x00, 0xc6, 0x00, 0xd6, + 0x00, 0xf6, 0x70, 0x00, 0xa0, 0x84, 0xf0, 0x00, 0xa0, 0x86, 0xc0, 0x00, + 0x05, 0xb0, 0x08, 0x0c, 0x86, 0x4e, 0x05, 0x98, 0x00, 0x66, 0x00, 0xc6, + 0x00, 0x46, 0x20, 0x11, 0xbc, 0x83, 0x22, 0x04, 0x82, 0x11, 0x22, 0x0c, + 0x08, 0x0c, 0x28, 0x52, 0x15, 0x80, 0x08, 0x0c, 0x4f, 0xbf, 0x15, 0x68, + 0x66, 0x12, 0x65, 0x16, 0x2c, 0x00, 0x00, 0x4e, 0x00, 0xce, 0x60, 0x1a, + 0x08, 0x0c, 0xa0, 0xe3, 0x08, 0x0c, 0x15, 0xfd, 0x01, 0xf0, 0x2d, 0x00, + 0x60, 0x56, 0x68, 0x03, 0x00, 0x00, 0x68, 0x37, 0x00, 0x00, 0x6c, 0x3a, + 0xad, 0xf8, 0x00, 0x0f, 0x20, 0xa9, 0x00, 0x0e, 0x2f, 0xa0, 0x2e, 0x98, + 0x53, 0xa3, 0x00, 0x6e, 0x66, 0x12, 0x60, 0x07, 0x00, 0x3e, 0x60, 0x1f, + 0x00, 0x01, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x6d, 0x45, 0x08, 0x0c, + 0x71, 0xe5, 0x00, 0xfe, 0x00, 0xde, 0x00, 0xce, 0x00, 0x05, 0x08, 0x0c, + 0x86, 0xa4, 0x00, 0x6e, 0x0c, 0xc0, 0x00, 0x4e, 0x00, 0xce, 0x0c, 0xc8, + 0x20, 0x71, 0xb8, 0xf4, 0x70, 0x03, 0x00, 0x03, 0x70, 0x0f, 0x03, 0x61, + 0xa0, 0x06, 0x70, 0x1a, 0x70, 0x76, 0x70, 0x12, 0x70, 0x17, 0xbe, 0x00, + 0x70, 0x07, 0x00, 0x00, 0x70, 0x26, 0x70, 0x2b, 0x7e, 0x0a, 0x70, 0x32, + 0x70, 0x37, 0x7e, 0x6a, 0x70, 0x3b, 0xff, 0xff, 0x70, 0x3f, 0xff, 0xff, + 0x70, 0x42, 0x70, 0x47, 0x44, 0x92, 0x70, 0x4a, 0x70, 0x5b, 0x6a, 0x9d, + 0x20, 0x01, 0xb8, 0xa1, 0x20, 0x03, 0x00, 0x03, 0x20, 0x01, 0xb8, 0xa3, + 0x20, 0x03, 0x01, 0x00, 0x3a, 0x00, 0xa0, 0x84, 0x00, 0x05, 0x70, 0x6e, + 0x00, 0x05, 0x20, 0x71, 0xb8, 0xf4, 0x1d, 0x04, 0x69, 0xfd, 0x20, 0x91, + 0x60, 0x00, 0x70, 0x0c, 0x80, 0x01, 0x70, 0x0e, 0x15, 0x18, 0x70, 0x0f, + 0x03, 0x61, 0x70, 0x07, 0x00, 0x01, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x70, 0x40, 0xa0, 0x0d, 0x01, 0x28, 0x81, 0x09, 0x71, 0x42, 0x11, 0x10, + 0x70, 0x44, 0x08, 0x0f, 0x00, 0xc6, 0x20, 0x61, 0xb6, 0x00, 0x60, 0x34, + 0x00, 0xce, 0xd0, 0xcc, 0x01, 0x80, 0x3a, 0x00, 0xa0, 0x84, 0x00, 0x05, + 0x72, 0x6c, 0xa2, 0x16, 0x01, 0x50, 0x70, 0x6e, 0x20, 0x11, 0x80, 0x43, + 0x20, 0x18, 0x08, 0x0c, 0x3f, 0x13, 0x00, 0x18, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x70, 0x24, 0xa0, 0x0d, 0x01, 0x88, 0x70, 0x20, 0x80, 0x01, + 0x70, 0x22, 0x11, 0x68, 0x70, 0x23, 0x00, 0x09, 0x81, 0x09, 0x71, 0x26, + 0xa1, 0x86, 0x03, 0xe8, 0x11, 0x10, 0x70, 0x28, 0x08, 0x0f, 0x81, 0xff, + 0x11, 0x10, 0x70, 0x28, 0x08, 0x0f, 0x70, 0x30, 0xa0, 0x0d, 0x01, 0x80, + 0x70, 0x2c, 0x80, 0x01, 0x70, 0x2e, 0x11, 0x60, 0x70, 0x2f, 0x00, 0x09, + 0x81, 0x09, 0x71, 0x32, 0x01, 0x28, 0xa1, 0x84, 0x00, 0x7f, 0x09, 0x0c, + 0x7e, 0xaf, 0x00, 0x10, 0x70, 0x34, 0x08, 0x0f, 0x70, 0x38, 0xa0, 0x05, + 0x01, 0x18, 0x03, 0x10, 0x80, 0x01, 0x70, 0x3a, 0x70, 0x3c, 0xa0, 0x05, + 0x01, 0x18, 0x03, 0x10, 0x80, 0x01, 0x70, 0x3e, 0x70, 0x4c, 0xa0, 0x0d, + 0x01, 0x68, 0x70, 0x48, 0x80, 0x01, 0x70, 0x4a, 0x11, 0x48, 0x70, 0x4b, + 0x00, 0x09, 0x81, 0x09, 0x71, 0x4e, 0x11, 0x20, 0x71, 0x50, 0x71, 0x4e, + 0x70, 0x58, 0x08, 0x0f, 0x70, 0x18, 0xa0, 0x0d, 0x01, 0xd8, 0x00, 0x16, + 0x70, 0x74, 0xa0, 0x0d, 0x01, 0x58, 0x70, 0x70, 0x80, 0x01, 0x70, 0x72, + 0x11, 0x38, 0x70, 0x73, 0x00, 0x09, 0x81, 0x09, 0x71, 0x76, 0x11, 0x10, + 0x70, 0x78, 0x08, 0x0f, 0x00, 0x1e, 0x70, 0x08, 0x80, 0x01, 0x70, 0x0a, + 0x11, 0x38, 0x70, 0x0b, 0x00, 0x09, 0x81, 0x09, 0x71, 0x1a, 0x11, 0x10, + 0x70, 0x1c, 0x08, 0x0f, 0x01, 0x2e, 0x70, 0x04, 0x00, 0x02, 0x6a, 0x23, + 0x6a, 0x24, 0x6a, 0x3c, 0x00, 0xe6, 0x20, 0x71, 0xb8, 0xf4, 0x70, 0x18, + 0xa0, 0x05, 0x11, 0x20, 0x71, 0x1a, 0x72, 0x1e, 0x70, 0x0b, 0x00, 0x09, + 0x00, 0xee, 0x00, 0x05, 0x00, 0xe6, 0x00, 0x06, 0x20, 0x71, 0xb8, 0xf4, + 0x70, 0x1c, 0xa2, 0x06, 0x11, 0x10, 0x70, 0x1a, 0x70, 0x1e, 0x00, 0x0e, + 0x00, 0xee, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0xb8, 0xf4, 0x60, 0x88, + 0xa1, 0x02, 0x02, 0x08, 0x61, 0x8a, 0x00, 0xee, 0x00, 0x05, 0x00, 0x05, + 0x71, 0x10, 0x08, 0x0c, 0x50, 0x1b, 0x11, 0x58, 0x60, 0x88, 0x80, 0x01, + 0x02, 0x40, 0x60, 0x8a, 0x11, 0x30, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x08, 0x0c, 0x71, 0xe5, 0x01, 0x2e, 0x81, 0x08, 0xa1, 0x82, 0x00, 0xff, + 0x02, 0x18, 0xa0, 0x0e, 0x70, 0x07, 0x00, 0x02, 0x71, 0x12, 0x00, 0x05, + 0x70, 0x14, 0x20, 0x60, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x60, 0x3c, + 0xa0, 0x05, 0x01, 0x28, 0x80, 0x01, 0x60, 0x3e, 0x11, 0x10, 0x08, 0x0c, + 0x9f, 0xd1, 0x60, 0x14, 0xa0, 0x05, 0x05, 0x00, 0x80, 0x01, 0x60, 0x16, + 0x11, 0xe8, 0x61, 0x1c, 0xa1, 0x86, 0x00, 0x03, 0x01, 0x18, 0xa1, 0x86, + 0x00, 0x06, 0x11, 0xa0, 0x60, 0x10, 0x20, 0x68, 0x68, 0x54, 0xa0, 0x8a, + 0x19, 0x9a, 0x02, 0x70, 0xa0, 0x82, 0x19, 0x99, 0x68, 0x56, 0xa0, 0x8a, + 0x19, 0x9a, 0x02, 0x10, 0x20, 0x01, 0x19, 0x99, 0x80, 0x03, 0x80, 0x0b, + 0x81, 0x0b, 0xa1, 0x08, 0x61, 0x16, 0x00, 0x10, 0x08, 0x0c, 0x9a, 0xa1, + 0x01, 0x2e, 0xac, 0x88, 0x00, 0x18, 0x71, 0x16, 0x20, 0x01, 0xee, 0x00, + 0xa1, 0x02, 0x02, 0x20, 0x70, 0x17, 0xbe, 0x00, 0x70, 0x07, 0x00, 0x00, + 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0xb8, 0xf4, 0x70, 0x27, 0x07, 0xd0, + 0x70, 0x23, 0x00, 0x09, 0x00, 0xee, 0x00, 0x05, 0x20, 0x01, 0xb8, 0xfd, + 0x20, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0xb8, 0xf4, + 0x71, 0x32, 0x70, 0x2f, 0x00, 0x09, 0x00, 0xee, 0x00, 0x05, 0x20, 0x11, + 0xb9, 0x00, 0x20, 0x13, 0x00, 0x00, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, + 0xb8, 0xf4, 0x71, 0x1a, 0x72, 0x1e, 0x70, 0x0b, 0x00, 0x09, 0x00, 0xee, + 0x00, 0x05, 0x00, 0xc6, 0x00, 0x26, 0x70, 0x54, 0x80, 0x00, 0x70, 0x56, + 0x20, 0x61, 0xb8, 0xa1, 0x60, 0x08, 0xa0, 0x86, 0x00, 0x00, 0x01, 0x58, + 0x70, 0x68, 0x60, 0x32, 0x70, 0x64, 0x60, 0x2e, 0x70, 0x60, 0x60, 0x2a, + 0x70, 0x5c, 0x60, 0x26, 0x2c, 0x10, 0x08, 0x0c, 0x16, 0x48, 0x00, 0x2e, + 0x00, 0xce, 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, 0x00, 0xc6, 0x00, 0xd6, + 0x00, 0xe6, 0x00, 0xf6, 0x08, 0x0c, 0x69, 0x6b, 0x00, 0xfe, 0x00, 0xee, + 0x00, 0xde, 0x00, 0xce, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, 0x00, 0xe6, + 0x20, 0x71, 0xb8, 0xf4, 0x71, 0x76, 0x72, 0x7a, 0x70, 0x73, 0x00, 0x09, + 0x00, 0xee, 0x00, 0x05, 0x00, 0xe6, 0x00, 0x06, 0x20, 0x71, 0xb8, 0xf4, + 0x70, 0x78, 0xa2, 0x06, 0x11, 0x10, 0x70, 0x76, 0x70, 0x7a, 0x00, 0x0e, + 0x00, 0xee, 0x00, 0x05, 0x00, 0xc6, 0x20, 0x61, 0xb9, 0x75, 0x00, 0xce, + 0x00, 0x05, 0xa1, 0x84, 0x00, 0x0f, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, + 0xa0, 0x80, 0xb9, 0x75, 0x20, 0x60, 0x00, 0x05, 0x68, 0x54, 0xa0, 0x8a, + 0x19, 0x9a, 0x02, 0x10, 0x20, 0x01, 0x19, 0x99, 0xa0, 0x05, 0x11, 0x50, + 0x00, 0xc6, 0x20, 0x61, 0xb9, 0x75, 0x60, 0x14, 0x00, 0xce, 0xa0, 0x05, + 0x11, 0x38, 0x20, 0x01, 0x00, 0x1e, 0x00, 0x20, 0xa0, 0x8e, 0xff, 0xff, + 0x11, 0x08, 0xa0, 0x06, 0x80, 0x03, 0x80, 0x0b, 0x81, 0x0b, 0xa1, 0x08, + 0x61, 0x16, 0x68, 0x4c, 0xa0, 0x8c, 0x00, 0xc0, 0xa1, 0x8e, 0x00, 0xc0, + 0x05, 0xe8, 0xd0, 0xb4, 0x11, 0x38, 0xd0, 0xbc, 0x15, 0x50, 0x20, 0x09, + 0x00, 0x06, 0x08, 0x0c, 0x6b, 0x63, 0x00, 0x05, 0xd0, 0xfc, 0x01, 0x38, + 0xa0, 0x84, 0x00, 0x03, 0x01, 0x20, 0xa0, 0x86, 0x00, 0x03, 0x19, 0x04, + 0x6b, 0x5d, 0x60, 0x20, 0xd0, 0xd4, 0x01, 0x30, 0xc0, 0xd4, 0x60, 0x22, + 0x68, 0x60, 0x60, 0x2a, 0x68, 0x5c, 0x60, 0x2e, 0x20, 0x09, 0xb6, 0x74, + 0x21, 0x04, 0xd0, 0x84, 0x01, 0x38, 0x87, 0xff, 0x11, 0x20, 0x20, 0x09, + 0x00, 0x42, 0x08, 0x0c, 0x86, 0xd3, 0x00, 0x05, 0x87, 0xff, 0x11, 0x20, + 0x20, 0x09, 0x00, 0x43, 0x08, 0x0c, 0x86, 0xd3, 0x00, 0x05, 0xd0, 0xfc, + 0x01, 0x30, 0xa0, 0x84, 0x00, 0x03, 0x01, 0x18, 0xa0, 0x86, 0x00, 0x03, + 0x11, 0xf0, 0x87, 0xff, 0x11, 0x20, 0x20, 0x09, 0x00, 0x42, 0x08, 0x0c, + 0x86, 0xd3, 0x00, 0x05, 0xd0, 0xfc, 0x01, 0x60, 0xa0, 0x84, 0x00, 0x03, + 0xa0, 0x8e, 0x00, 0x02, 0x01, 0x48, 0x87, 0xff, 0x11, 0x20, 0x20, 0x09, + 0x00, 0x41, 0x08, 0x0c, 0x86, 0xd3, 0x00, 0x05, 0x00, 0x61, 0x0c, 0xe8, + 0x87, 0xff, 0x1d, 0xd8, 0x20, 0x09, 0x00, 0x43, 0x08, 0x0c, 0x86, 0xd3, + 0x0c, 0xb0, 0x20, 0x09, 0x00, 0x04, 0x00, 0x19, 0x00, 0x05, 0x20, 0x09, + 0x00, 0x01, 0x00, 0xd6, 0x60, 0x10, 0xa0, 0xec, 0xf0, 0x00, 0x05, 0x10, + 0x20, 0x68, 0x69, 0x52, 0x68, 0x00, 0x60, 0x12, 0xa1, 0x86, 0x00, 0x01, + 0x11, 0x88, 0x69, 0x4c, 0xa1, 0x8c, 0x81, 0x00, 0xa1, 0x8e, 0x81, 0x00, + 0x11, 0x58, 0x00, 0xc6, 0x20, 0x61, 0xb9, 0x75, 0x62, 0x00, 0xd2, 0x8c, + 0x11, 0x20, 0x62, 0x04, 0x82, 0x10, 0x02, 0x08, 0x62, 0x06, 0x00, 0xce, + 0x08, 0x0c, 0x54, 0x7a, 0x60, 0x10, 0xa0, 0x6d, 0x00, 0x76, 0x20, 0x39, + 0x00, 0x00, 0x19, 0x0c, 0x6a, 0xe8, 0x00, 0x7e, 0x00, 0xde, 0x00, 0x05, + 0x01, 0x56, 0x00, 0xc6, 0x20, 0x61, 0xb9, 0x75, 0x60, 0x00, 0x81, 0xff, + 0x01, 0x10, 0xa2, 0x05, 0x00, 0x08, 0xa2, 0x04, 0x60, 0x02, 0x00, 0xce, + 0x01, 0x5e, 0x00, 0x05, 0x68, 0x00, 0xd0, 0x8c, 0x11, 0x38, 0x68, 0x08, + 0xa0, 0x05, 0x01, 0x20, 0x80, 0x01, 0x68, 0x0a, 0xa0, 0x85, 0x00, 0x01, + 0x00, 0x05, 0x20, 0xa9, 0x00, 0x10, 0xa0, 0x06, 0x80, 0x04, 0x80, 0x86, + 0x81, 0x8e, 0x12, 0x08, 0xa2, 0x00, 0x1f, 0x04, 0x6b, 0xa9, 0x80, 0x86, + 0x81, 0x8e, 0x00, 0x05, 0x01, 0x56, 0x20, 0xa9, 0x00, 0x10, 0xa0, 0x05, + 0x01, 0xb8, 0xa1, 0x1a, 0x12, 0xa8, 0x82, 0x13, 0x81, 0x8d, 0x02, 0x28, + 0xa1, 0x1a, 0x12, 0x20, 0x1f, 0x04, 0x6b, 0xb9, 0x00, 0x28, 0xa1, 0x1a, + 0x23, 0x08, 0x82, 0x10, 0x1f, 0x04, 0x6b, 0xb9, 0x00, 0x06, 0x32, 0x00, + 0xa0, 0x84, 0xef, 0xff, 0x20, 0x80, 0x00, 0x0e, 0x01, 0x5e, 0x00, 0x05, + 0x00, 0x06, 0x32, 0x00, 0xa0, 0x85, 0x10, 0x00, 0x0c, 0xb8, 0x01, 0x26, + 0x20, 0x91, 0x28, 0x00, 0x20, 0x79, 0xb8, 0xe1, 0x01, 0x2e, 0x00, 0xd6, + 0x20, 0x69, 0xb8, 0xe1, 0x68, 0x03, 0x00, 0x05, 0x20, 0x69, 0x00, 0x04, + 0x2d, 0x04, 0xa0, 0x85, 0x80, 0x01, 0x20, 0x6a, 0x00, 0xde, 0x00, 0x05, + 0x00, 0xc6, 0x60, 0x27, 0x00, 0x01, 0x78, 0x04, 0xa0, 0x84, 0x00, 0x07, + 0x00, 0x02, 0x6b, 0xf7, 0x6c, 0x18, 0x6c, 0x6b, 0x6b, 0xfd, 0x6c, 0x18, + 0x6b, 0xf7, 0x6b, 0xf5, 0x6b, 0xf5, 0x08, 0x0c, 0x15, 0x1a, 0x08, 0x0c, + 0x6a, 0x82, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0xce, 0x00, 0x05, 0x62, 0xc0, + 0x82, 0xff, 0x11, 0x10, 0x00, 0xce, 0x00, 0x05, 0x20, 0x11, 0x4b, 0x23, + 0x08, 0x0c, 0x6a, 0x0e, 0x78, 0x28, 0xa0, 0x92, 0x00, 0xc8, 0x12, 0x28, + 0x80, 0x00, 0x78, 0x2a, 0x08, 0x0c, 0x4b, 0x65, 0x0c, 0x88, 0x08, 0x0c, + 0x4b, 0x23, 0x78, 0x07, 0x00, 0x03, 0x78, 0x27, 0x00, 0x00, 0x78, 0x2b, + 0x00, 0x00, 0x0c, 0x40, 0x08, 0x0c, 0x6a, 0x82, 0x3c, 0x00, 0x00, 0x06, + 0x20, 0x11, 0x02, 0x09, 0x20, 0xe1, 0x40, 0x00, 0x22, 0x14, 0x00, 0x0e, + 0x20, 0xe0, 0x82, 0xff, 0x01, 0x78, 0x62, 0xc0, 0x82, 0xff, 0x11, 0x60, + 0x78, 0x2b, 0x00, 0x00, 0x78, 0x24, 0xa0, 0x65, 0x09, 0x0c, 0x15, 0x1a, + 0x20, 0x09, 0x00, 0x13, 0x08, 0x0c, 0x86, 0xd3, 0x00, 0xce, 0x00, 0x05, + 0x39, 0x00, 0xa0, 0x82, 0xba, 0x2d, 0x12, 0x10, 0x08, 0x0c, 0x83, 0xb9, + 0x00, 0xc6, 0x78, 0x24, 0xa0, 0x65, 0x09, 0x0c, 0x15, 0x1a, 0x78, 0x04, + 0xa0, 0x86, 0x00, 0x04, 0x09, 0x04, 0x6c, 0xab, 0x78, 0x28, 0xa0, 0x92, + 0x27, 0x10, 0x12, 0x30, 0x80, 0x00, 0x78, 0x2a, 0x00, 0xce, 0x08, 0x0c, + 0x7d, 0xe6, 0x0c, 0x20, 0x61, 0x04, 0xa1, 0x86, 0x00, 0x03, 0x11, 0x88, + 0x00, 0xe6, 0x20, 0x71, 0xb6, 0x00, 0x70, 0xe0, 0x00, 0xee, 0xd0, 0x8c, + 0x01, 0x50, 0x00, 0xc6, 0x00, 0xe6, 0x20, 0x61, 0x01, 0x00, 0x20, 0x71, + 0xb6, 0x00, 0x08, 0x0c, 0x4b, 0x7b, 0x00, 0xee, 0x00, 0xce, 0x08, 0x0c, + 0xb5, 0x00, 0x20, 0x09, 0x00, 0x14, 0x08, 0x0c, 0x86, 0xd3, 0x00, 0xce, + 0x08, 0x38, 0x20, 0x01, 0xb8, 0xfd, 0x20, 0x03, 0x00, 0x00, 0x62, 0xc0, + 0x82, 0xff, 0x11, 0x60, 0x78, 0x2b, 0x00, 0x00, 0x78, 0x24, 0xa0, 0x65, + 0x09, 0x0c, 0x15, 0x1a, 0x20, 0x09, 0x00, 0x13, 0x08, 0x0c, 0x87, 0x2c, + 0x00, 0xce, 0x00, 0x05, 0x00, 0xc6, 0x00, 0xd6, 0x39, 0x00, 0xa0, 0x82, + 0xba, 0x2d, 0x12, 0x10, 0x08, 0x0c, 0x83, 0xb9, 0x78, 0x24, 0xa0, 0x05, + 0x09, 0x0c, 0x15, 0x1a, 0x78, 0x1c, 0xa0, 0x6d, 0x09, 0x0c, 0x15, 0x1a, + 0x68, 0x00, 0xc0, 0xdc, 0x68, 0x02, 0x79, 0x24, 0x21, 0x60, 0x08, 0x0c, + 0x86, 0xa4, 0x69, 0x3c, 0x81, 0xff, 0x09, 0x0c, 0x15, 0x1a, 0x81, 0x09, + 0x69, 0x3e, 0x68, 0x54, 0xa0, 0x15, 0x01, 0x10, 0x7a, 0x1e, 0x00, 0x10, + 0x79, 0x18, 0x79, 0x1e, 0x78, 0x07, 0x00, 0x00, 0x78, 0x27, 0x00, 0x00, + 0x00, 0xde, 0x00, 0xce, 0x08, 0x0c, 0x71, 0xe5, 0x08, 0x88, 0x61, 0x04, + 0xa1, 0x86, 0x00, 0x02, 0x01, 0x28, 0xa1, 0x86, 0x00, 0x04, 0x01, 0x10, + 0x08, 0x04, 0x6c, 0x44, 0x78, 0x08, 0xac, 0x06, 0x09, 0x04, 0x6c, 0x44, + 0x08, 0x0c, 0x71, 0x02, 0x08, 0x0c, 0x6d, 0x45, 0x00, 0xce, 0x08, 0x0c, + 0x71, 0xe5, 0x08, 0x04, 0x6c, 0x32, 0x00, 0xc6, 0x60, 0x27, 0x00, 0x02, + 0x62, 0xc8, 0x60, 0xc4, 0xa2, 0x05, 0x11, 0x78, 0x79, 0x3c, 0xa1, 0xe5, + 0x00, 0x00, 0x01, 0x30, 0x20, 0x09, 0x00, 0x49, 0x08, 0x0c, 0x86, 0xd3, + 0x00, 0xce, 0x00, 0x05, 0x20, 0x11, 0xb9, 0x00, 0x20, 0x13, 0x00, 0x00, + 0x0c, 0xc8, 0x39, 0x08, 0xa1, 0x92, 0xba, 0x2d, 0x12, 0x10, 0x08, 0x0c, + 0x83, 0xb9, 0x79, 0x3c, 0x81, 0xff, 0x0d, 0x90, 0x79, 0x44, 0xa1, 0x92, + 0x75, 0x30, 0x12, 0xb8, 0x81, 0x08, 0x79, 0x46, 0x79, 0x3c, 0xa1, 0x88, + 0x00, 0x07, 0x21, 0x0c, 0xa1, 0x8e, 0x00, 0x06, 0x11, 0x38, 0x60, 0x14, + 0xa0, 0x84, 0x01, 0x84, 0xa0, 0x85, 0x00, 0x12, 0x60, 0x16, 0x08, 0xe0, + 0x60, 0x14, 0xa0, 0x84, 0x01, 0x84, 0xa0, 0x85, 0x00, 0x16, 0x60, 0x16, + 0x08, 0xa8, 0x78, 0x48, 0xc0, 0x85, 0x78, 0x4a, 0x08, 0x88, 0x00, 0x06, + 0x00, 0x16, 0x00, 0xc6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x60, 0x0f, + 0x00, 0x00, 0x2c, 0x08, 0x20, 0x61, 0xb8, 0xe1, 0x60, 0x20, 0x80, 0x00, + 0x60, 0x22, 0x60, 0x10, 0xa0, 0x05, 0x01, 0x48, 0xa0, 0x80, 0x00, 0x03, + 0x21, 0x02, 0x61, 0x12, 0x01, 0x2e, 0x00, 0xce, 0x00, 0x1e, 0x00, 0x0e, + 0x00, 0x05, 0x61, 0x16, 0x61, 0x12, 0x0c, 0xc0, 0x00, 0xd6, 0x20, 0x69, + 0xb8, 0xe1, 0x60, 0x00, 0xd0, 0xd4, 0x01, 0x68, 0x68, 0x20, 0x80, 0x00, + 0x68, 0x22, 0xa0, 0x86, 0x00, 0x01, 0x11, 0x10, 0x2c, 0x00, 0x68, 0x1e, + 0x68, 0x04, 0xa0, 0x84, 0x00, 0x07, 0x08, 0x04, 0x71, 0xeb, 0xc0, 0xd5, + 0x60, 0x02, 0x68, 0x18, 0xa0, 0x05, 0x01, 0x58, 0x60, 0x56, 0x60, 0x5b, + 0x00, 0x00, 0x00, 0x06, 0x2c, 0x00, 0x68, 0x1a, 0x00, 0xde, 0x68, 0x5a, + 0x20, 0x69, 0xb8, 0xe1, 0x0c, 0x18, 0x60, 0x56, 0x60, 0x5a, 0x2c, 0x00, + 0x68, 0x1a, 0x68, 0x1e, 0x08, 0xe8, 0x00, 0x06, 0x00, 0x16, 0x00, 0xc6, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x60, 0x0f, 0x00, 0x00, 0x2c, 0x08, + 0x20, 0x61, 0xb8, 0xe1, 0x60, 0x20, 0x80, 0x00, 0x60, 0x22, 0x60, 0x08, + 0xa0, 0x05, 0x01, 0x48, 0xa0, 0x80, 0x00, 0x03, 0x21, 0x02, 0x61, 0x0a, + 0x01, 0x2e, 0x00, 0xce, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, 0x61, 0x0e, + 0x61, 0x0a, 0x0c, 0xc0, 0x00, 0xc6, 0x60, 0x0f, 0x00, 0x00, 0x2c, 0x08, + 0x20, 0x61, 0xb8, 0xe1, 0x60, 0x34, 0xa0, 0x05, 0x01, 0x30, 0xa0, 0x80, + 0x00, 0x03, 0x21, 0x02, 0x61, 0x36, 0x00, 0xce, 0x00, 0x05, 0x61, 0x3a, + 0x61, 0x36, 0x0c, 0xd8, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, + 0x00, 0x76, 0x00, 0x66, 0x00, 0x56, 0x00, 0x36, 0x00, 0x26, 0x00, 0x16, + 0x00, 0x06, 0x01, 0x26, 0xa0, 0x2e, 0x20, 0x71, 0xb8, 0xe1, 0x76, 0x38, + 0x26, 0x60, 0x26, 0x78, 0x20, 0x91, 0x80, 0x00, 0x8c, 0xff, 0x09, 0x04, + 0x6d, 0xed, 0x60, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, 0xa2, 0x06, + 0x19, 0x04, 0x6d, 0xe8, 0x87, 0xff, 0x01, 0x20, 0x60, 0x50, 0xa1, 0x06, + 0x19, 0x04, 0x6d, 0xe8, 0x70, 0x3c, 0xac, 0x06, 0x11, 0x90, 0x00, 0x36, + 0x20, 0x19, 0x00, 0x01, 0x08, 0x0c, 0x80, 0x6b, 0x70, 0x33, 0x00, 0x00, + 0x70, 0x3f, 0x00, 0x00, 0x70, 0x43, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x70, 0x4b, 0x00, 0x00, 0x00, 0x3e, 0x20, 0x29, 0x00, 0x01, 0x70, 0x38, + 0xac, 0x36, 0x11, 0x10, 0x66, 0x0c, 0x76, 0x3a, 0x70, 0x34, 0xac, 0x36, + 0x11, 0x40, 0x2c, 0x00, 0xaf, 0x36, 0x01, 0x18, 0x2f, 0x00, 0x70, 0x36, + 0x00, 0x10, 0x70, 0x37, 0x00, 0x00, 0x66, 0x0c, 0x00, 0x66, 0x2c, 0x00, + 0xaf, 0x06, 0x01, 0x10, 0x7e, 0x0e, 0x00, 0x08, 0x26, 0x78, 0x60, 0x0f, + 0x00, 0x00, 0x08, 0x0c, 0x9d, 0x16, 0x01, 0xc8, 0x60, 0x10, 0x20, 0x68, + 0x60, 0x1c, 0xa0, 0x86, 0x00, 0x03, 0x15, 0x80, 0x68, 0x37, 0x01, 0x03, + 0x6b, 0x4a, 0x68, 0x47, 0x00, 0x00, 0x00, 0x16, 0x00, 0x36, 0x00, 0x76, + 0x08, 0x0c, 0x9f, 0x88, 0x08, 0x0c, 0xb4, 0x3c, 0x08, 0x0c, 0x54, 0x7a, + 0x00, 0x7e, 0x00, 0x3e, 0x00, 0x1e, 0x08, 0x0c, 0x9e, 0xcd, 0x08, 0x0c, + 0x9e, 0xd9, 0x00, 0xce, 0x08, 0x04, 0x6d, 0x88, 0x2c, 0x78, 0x60, 0x0c, + 0x20, 0x60, 0x08, 0x04, 0x6d, 0x88, 0x85, 0xff, 0x01, 0x20, 0x00, 0x36, + 0x08, 0x0c, 0x72, 0xa2, 0x00, 0x3e, 0x01, 0x2e, 0x00, 0x0e, 0x00, 0x1e, + 0x00, 0x2e, 0x00, 0x3e, 0x00, 0x5e, 0x00, 0x6e, 0x00, 0x7e, 0x00, 0xce, + 0x00, 0xde, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, 0x60, 0x1c, 0xa0, 0x86, + 0x00, 0x06, 0x11, 0x58, 0x00, 0x16, 0x00, 0x36, 0x00, 0x76, 0x08, 0x0c, + 0xb4, 0x3c, 0x08, 0x0c, 0xb1, 0x55, 0x00, 0x7e, 0x00, 0x3e, 0x00, 0x1e, + 0x08, 0xa0, 0x60, 0x1c, 0xa0, 0x86, 0x00, 0x0a, 0x09, 0x04, 0x6d, 0xd2, + 0x08, 0x04, 0x6d, 0xd0, 0x00, 0x06, 0x00, 0x66, 0x00, 0xc6, 0x00, 0xd6, + 0x00, 0xf6, 0x20, 0x31, 0x00, 0x00, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x79, 0xb8, 0xe1, 0x78, 0x38, 0xa0, 0x65, 0x05, 0x68, 0x60, 0x0c, + 0x00, 0x06, 0x60, 0x0f, 0x00, 0x00, 0x78, 0x3c, 0xac, 0x06, 0x11, 0x80, + 0x00, 0x36, 0x20, 0x19, 0x00, 0x01, 0x08, 0x0c, 0x80, 0x6b, 0x78, 0x33, + 0x00, 0x00, 0x78, 0x3f, 0x00, 0x00, 0x78, 0x43, 0x00, 0x00, 0x78, 0x47, + 0x00, 0x00, 0x78, 0x4b, 0x00, 0x00, 0x00, 0x3e, 0x08, 0x0c, 0x9d, 0x16, + 0x01, 0x78, 0x60, 0x10, 0x20, 0x68, 0x60, 0x1c, 0xa0, 0x86, 0x00, 0x03, + 0x11, 0xb0, 0x68, 0x37, 0x01, 0x03, 0x6b, 0x4a, 0x68, 0x47, 0x00, 0x00, + 0x08, 0x0c, 0x54, 0x7a, 0x08, 0x0c, 0x9e, 0xcd, 0x08, 0x0c, 0x9e, 0xd9, + 0x00, 0x0e, 0x08, 0x88, 0x7e, 0x3a, 0x7e, 0x36, 0x01, 0x2e, 0x00, 0xfe, + 0x00, 0xde, 0x00, 0xce, 0x00, 0x6e, 0x00, 0x0e, 0x00, 0x05, 0x60, 0x1c, + 0xa0, 0x86, 0x00, 0x06, 0x11, 0x18, 0x08, 0x0c, 0xb1, 0x55, 0x0c, 0x60, + 0x60, 0x1c, 0xa0, 0x86, 0x00, 0x0a, 0x0d, 0x08, 0x08, 0xf0, 0x00, 0x16, + 0x00, 0x26, 0x00, 0x86, 0x20, 0x41, 0x00, 0x00, 0x00, 0x99, 0x08, 0x0c, + 0x6f, 0x35, 0x00, 0x8e, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xf6, + 0x01, 0x26, 0x20, 0x79, 0xb8, 0xe1, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, + 0x6f, 0xc2, 0x08, 0x0c, 0x70, 0x34, 0x01, 0x2e, 0x00, 0xfe, 0x00, 0x05, + 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, 0x00, 0x66, 0x00, 0x16, + 0x00, 0x06, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0xb8, 0xe1, + 0x76, 0x14, 0x26, 0x60, 0x26, 0x78, 0x8c, 0xff, 0x09, 0x04, 0x6f, 0x0b, + 0x60, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, 0xa2, 0x06, 0x19, 0x04, + 0x6f, 0x06, 0x88, 0xff, 0x01, 0x20, 0x60, 0x50, 0xa1, 0x06, 0x19, 0x04, + 0x6f, 0x06, 0x70, 0x24, 0xac, 0x06, 0x15, 0x38, 0x20, 0x69, 0x01, 0x00, + 0x68, 0xc0, 0xa0, 0x05, 0x01, 0xf0, 0x08, 0x0c, 0x6a, 0x82, 0x08, 0x0c, + 0x7d, 0xf3, 0x68, 0xc3, 0x00, 0x00, 0x08, 0x0c, 0x82, 0xd4, 0x70, 0x27, + 0x00, 0x00, 0x00, 0x36, 0x20, 0x69, 0x01, 0x40, 0x6b, 0x04, 0xa3, 0x84, + 0x10, 0x00, 0x01, 0x20, 0x68, 0x03, 0x01, 0x00, 0x68, 0x03, 0x00, 0x00, + 0x20, 0x69, 0x01, 0x00, 0x68, 0x24, 0xd0, 0x84, 0x01, 0x10, 0x68, 0x27, + 0x00, 0x01, 0x00, 0x3e, 0x00, 0x20, 0x60, 0x03, 0x00, 0x09, 0x63, 0x0a, + 0x04, 0xe8, 0x70, 0x14, 0xac, 0x36, 0x11, 0x10, 0x66, 0x0c, 0x76, 0x16, + 0x70, 0x10, 0xac, 0x36, 0x11, 0x40, 0x2c, 0x00, 0xaf, 0x36, 0x01, 0x18, + 0x2f, 0x00, 0x70, 0x12, 0x00, 0x10, 0x70, 0x13, 0x00, 0x00, 0x66, 0x0c, + 0x00, 0x66, 0x2c, 0x00, 0xaf, 0x06, 0x01, 0x10, 0x7e, 0x0e, 0x00, 0x08, + 0x26, 0x78, 0x60, 0x0f, 0x00, 0x00, 0x60, 0x10, 0x20, 0x68, 0x08, 0x0c, + 0x9d, 0x16, 0x01, 0xb8, 0x60, 0x1c, 0xa0, 0x86, 0x00, 0x03, 0x15, 0x40, + 0x68, 0x37, 0x01, 0x03, 0x6b, 0x4a, 0x68, 0x47, 0x00, 0x00, 0x00, 0x16, + 0x00, 0x36, 0x00, 0x86, 0x08, 0x0c, 0x9f, 0x88, 0x08, 0x0c, 0xb4, 0x3c, + 0x08, 0x0c, 0x54, 0x7a, 0x00, 0x8e, 0x00, 0x3e, 0x00, 0x1e, 0x08, 0x0c, + 0x9e, 0xcd, 0x08, 0x0c, 0x9e, 0xd9, 0x08, 0x0c, 0x81, 0xa5, 0x00, 0xce, + 0x08, 0x04, 0x6e, 0x8f, 0x2c, 0x78, 0x60, 0x0c, 0x20, 0x60, 0x08, 0x04, + 0x6e, 0x8f, 0x01, 0x2e, 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x6e, 0x00, 0xce, + 0x00, 0xde, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, 0x60, 0x1c, 0xa0, 0x86, + 0x00, 0x06, 0x11, 0x58, 0x00, 0x16, 0x00, 0x36, 0x00, 0x86, 0x08, 0x0c, + 0xb4, 0x3c, 0x08, 0x0c, 0xb1, 0x55, 0x00, 0x8e, 0x00, 0x3e, 0x00, 0x1e, + 0x08, 0xe0, 0x60, 0x1c, 0xa0, 0x86, 0x00, 0x02, 0x11, 0x28, 0x60, 0x04, + 0xa0, 0x86, 0x00, 0x85, 0x09, 0x08, 0x08, 0x98, 0x60, 0x1c, 0xa0, 0x86, + 0x00, 0x05, 0x19, 0x78, 0x60, 0x04, 0xa0, 0x86, 0x00, 0x85, 0x0d, 0x20, + 0x08, 0x50, 0x00, 0xc6, 0x00, 0x06, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0xa2, 0x80, 0xb7, 0x35, 0x20, 0x04, 0xa0, 0x65, 0x09, 0x04, 0x6f, 0xbe, + 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0x66, 0x20, 0x71, 0xb8, 0xe1, + 0x66, 0x54, 0x70, 0x18, 0xac, 0x06, 0x11, 0x08, 0x76, 0x1a, 0x70, 0x1c, + 0xac, 0x06, 0x11, 0x30, 0x86, 0xff, 0x11, 0x18, 0x70, 0x18, 0x70, 0x1e, + 0x00, 0x08, 0x76, 0x1e, 0x60, 0x58, 0xa0, 0x7d, 0x01, 0x08, 0x7e, 0x56, + 0xa6, 0xed, 0x00, 0x00, 0x01, 0x10, 0x2f, 0x00, 0x68, 0x5a, 0x60, 0x57, + 0x00, 0x00, 0x60, 0x5b, 0x00, 0x00, 0x60, 0x00, 0xc0, 0xd4, 0xc0, 0xdc, + 0x60, 0x02, 0x08, 0x0c, 0x4f, 0x46, 0x09, 0x04, 0x6f, 0xba, 0x76, 0x24, + 0x86, 0xff, 0x05, 0xe8, 0xa6, 0x80, 0x00, 0x04, 0x20, 0x04, 0xad, 0x06, + 0x15, 0xc0, 0x00, 0xd6, 0x20, 0x69, 0x01, 0x00, 0x68, 0xc0, 0xa0, 0x05, + 0x05, 0x48, 0x08, 0x0c, 0x6a, 0x82, 0x08, 0x0c, 0x7d, 0xf3, 0x68, 0xc3, + 0x00, 0x00, 0x08, 0x0c, 0x82, 0xd4, 0x70, 0x27, 0x00, 0x00, 0x00, 0x36, + 0x20, 0x69, 0x01, 0x40, 0x6b, 0x04, 0xa3, 0x84, 0x10, 0x00, 0x01, 0x20, + 0x68, 0x03, 0x01, 0x00, 0x68, 0x03, 0x00, 0x00, 0x20, 0x69, 0x01, 0x00, + 0x68, 0x24, 0xd0, 0x84, 0x01, 0x10, 0x68, 0x27, 0x00, 0x01, 0x00, 0x3e, + 0x00, 0xde, 0x00, 0xc6, 0x60, 0x3c, 0xa0, 0x05, 0x01, 0x10, 0x80, 0x01, + 0x60, 0x3e, 0x26, 0x60, 0x08, 0x0c, 0x9e, 0xd9, 0x00, 0xce, 0x00, 0x48, + 0x00, 0xde, 0x00, 0xc6, 0x26, 0x60, 0x60, 0x03, 0x00, 0x09, 0x63, 0x0a, + 0x00, 0xce, 0x08, 0x04, 0x6f, 0x65, 0x8d, 0xff, 0x01, 0x58, 0x68, 0x37, + 0x01, 0x03, 0x6b, 0x4a, 0x68, 0x47, 0x00, 0x00, 0x08, 0x0c, 0x9f, 0x88, + 0x08, 0x0c, 0xb4, 0x3c, 0x08, 0x0c, 0x54, 0x7a, 0x08, 0x0c, 0x81, 0xa5, + 0x08, 0x04, 0x6f, 0x65, 0x00, 0x6e, 0x00, 0xde, 0x00, 0xee, 0x00, 0xfe, + 0x01, 0x2e, 0x00, 0x0e, 0x00, 0xce, 0x00, 0x05, 0x00, 0x06, 0x00, 0x66, + 0x00, 0xc6, 0x00, 0xd6, 0x20, 0x31, 0x00, 0x00, 0x78, 0x14, 0xa0, 0x65, + 0x09, 0x04, 0x70, 0x14, 0x60, 0x0c, 0x00, 0x06, 0x60, 0x0f, 0x00, 0x00, + 0x78, 0x24, 0xac, 0x06, 0x15, 0x40, 0x20, 0x69, 0x01, 0x00, 0x68, 0xc0, + 0xa0, 0x05, 0x01, 0xf0, 0x08, 0x0c, 0x6a, 0x82, 0x08, 0x0c, 0x7d, 0xf3, + 0x68, 0xc3, 0x00, 0x00, 0x08, 0x0c, 0x82, 0xd4, 0x78, 0x27, 0x00, 0x00, + 0x00, 0x36, 0x20, 0x69, 0x01, 0x40, 0x6b, 0x04, 0xa3, 0x84, 0x10, 0x00, + 0x01, 0x20, 0x68, 0x03, 0x01, 0x00, 0x68, 0x03, 0x00, 0x00, 0x20, 0x69, + 0x01, 0x00, 0x68, 0x24, 0xd0, 0x84, 0x01, 0x10, 0x68, 0x27, 0x00, 0x01, + 0x00, 0x3e, 0x00, 0x28, 0x60, 0x03, 0x00, 0x09, 0x63, 0x0a, 0x2c, 0x30, + 0x00, 0xb0, 0x60, 0x10, 0x20, 0x68, 0x08, 0x0c, 0x9d, 0x16, 0x01, 0x68, + 0x60, 0x1c, 0xa0, 0x86, 0x00, 0x03, 0x11, 0xb8, 0x68, 0x37, 0x01, 0x03, + 0x6b, 0x4a, 0x68, 0x47, 0x00, 0x00, 0x08, 0x0c, 0x54, 0x7a, 0x08, 0x0c, + 0x9e, 0xcd, 0x08, 0x0c, 0x9e, 0xd9, 0x08, 0x0c, 0x81, 0xa5, 0x00, 0x0e, + 0x08, 0x04, 0x6f, 0xc9, 0x7e, 0x16, 0x7e, 0x12, 0x00, 0xde, 0x00, 0xce, + 0x00, 0x6e, 0x00, 0x0e, 0x00, 0x05, 0x60, 0x1c, 0xa0, 0x86, 0x00, 0x06, + 0x11, 0x18, 0x08, 0x0c, 0xb1, 0x55, 0x0c, 0x58, 0x60, 0x1c, 0xa0, 0x86, + 0x00, 0x02, 0x11, 0x28, 0x60, 0x04, 0xa0, 0x86, 0x00, 0x85, 0x09, 0xd0, + 0x0c, 0x10, 0x60, 0x1c, 0xa0, 0x86, 0x00, 0x05, 0x19, 0xf0, 0x60, 0x04, + 0xa0, 0x86, 0x00, 0x85, 0x0d, 0x60, 0x08, 0xc8, 0x00, 0x06, 0x00, 0x66, + 0x00, 0xc6, 0x00, 0xd6, 0x78, 0x18, 0xa0, 0x65, 0x09, 0x04, 0x70, 0x9a, + 0x60, 0x54, 0x00, 0x06, 0x60, 0x57, 0x00, 0x00, 0x60, 0x5b, 0x00, 0x00, + 0x60, 0x00, 0xc0, 0xd4, 0xc0, 0xdc, 0x60, 0x02, 0x08, 0x0c, 0x4f, 0x46, + 0x09, 0x04, 0x70, 0x97, 0x7e, 0x24, 0x86, 0xff, 0x05, 0xe8, 0xa6, 0x80, + 0x00, 0x04, 0x20, 0x04, 0xad, 0x06, 0x15, 0xc0, 0x00, 0xd6, 0x20, 0x69, + 0x01, 0x00, 0x68, 0xc0, 0xa0, 0x05, 0x05, 0x48, 0x08, 0x0c, 0x6a, 0x82, + 0x08, 0x0c, 0x7d, 0xf3, 0x68, 0xc3, 0x00, 0x00, 0x08, 0x0c, 0x82, 0xd4, + 0x78, 0x27, 0x00, 0x00, 0x00, 0x36, 0x20, 0x69, 0x01, 0x40, 0x6b, 0x04, + 0xa3, 0x84, 0x10, 0x00, 0x01, 0x20, 0x68, 0x03, 0x01, 0x00, 0x68, 0x03, + 0x00, 0x00, 0x20, 0x69, 0x01, 0x00, 0x68, 0x24, 0xd0, 0x84, 0x01, 0x10, + 0x68, 0x27, 0x00, 0x01, 0x00, 0x3e, 0x00, 0xde, 0x00, 0xc6, 0x60, 0x3c, + 0xa0, 0x05, 0x01, 0x10, 0x80, 0x01, 0x60, 0x3e, 0x26, 0x60, 0x08, 0x0c, + 0x9e, 0xd9, 0x00, 0xce, 0x00, 0x48, 0x00, 0xde, 0x00, 0xc6, 0x26, 0x60, + 0x60, 0x03, 0x00, 0x09, 0x63, 0x0a, 0x00, 0xce, 0x08, 0x04, 0x70, 0x46, + 0x8d, 0xff, 0x01, 0x38, 0x68, 0x37, 0x01, 0x03, 0x6b, 0x4a, 0x68, 0x47, + 0x00, 0x00, 0x08, 0x0c, 0x54, 0x7a, 0x08, 0x0c, 0x81, 0xa5, 0x08, 0x04, + 0x70, 0x46, 0x00, 0x0e, 0x08, 0x04, 0x70, 0x39, 0x78, 0x1e, 0x78, 0x1a, + 0x00, 0xde, 0x00, 0xce, 0x00, 0x6e, 0x00, 0x0e, 0x00, 0x05, 0x00, 0xe6, + 0x00, 0xd6, 0x00, 0x66, 0x60, 0x00, 0xd0, 0xdc, 0x01, 0xa0, 0x60, 0x4c, + 0xa0, 0x6d, 0x01, 0x88, 0x68, 0x48, 0xa6, 0x06, 0x11, 0x70, 0x20, 0x71, + 0xb8, 0xe1, 0x70, 0x24, 0xa0, 0x35, 0x01, 0x48, 0xa0, 0x80, 0x00, 0x04, + 0x20, 0x04, 0xad, 0x06, 0x11, 0x20, 0x60, 0x00, 0xc0, 0xdc, 0x60, 0x02, + 0x00, 0x21, 0x00, 0x6e, 0x00, 0xde, 0x00, 0xee, 0x00, 0x05, 0x00, 0xf6, + 0x20, 0x79, 0x01, 0x00, 0x78, 0xc0, 0xa0, 0x05, 0x11, 0x38, 0x00, 0xc6, + 0x26, 0x60, 0x60, 0x03, 0x00, 0x09, 0x63, 0x0a, 0x00, 0xce, 0x04, 0xa0, + 0x08, 0x0c, 0x7d, 0xf3, 0x78, 0xc3, 0x00, 0x00, 0x08, 0x0c, 0x82, 0xd4, + 0x70, 0x27, 0x00, 0x00, 0x00, 0x36, 0x20, 0x79, 0x01, 0x40, 0x7b, 0x04, + 0xa3, 0x84, 0x10, 0x00, 0x01, 0x20, 0x78, 0x03, 0x01, 0x00, 0x78, 0x03, + 0x00, 0x00, 0x20, 0x79, 0x01, 0x00, 0x78, 0x24, 0xd0, 0x84, 0x01, 0x10, + 0x78, 0x27, 0x00, 0x01, 0x08, 0x0c, 0x82, 0xd4, 0x00, 0x3e, 0x08, 0x0c, + 0x4f, 0x46, 0x00, 0xc6, 0x60, 0x3c, 0xa0, 0x05, 0x01, 0x10, 0x80, 0x01, + 0x60, 0x3e, 0x26, 0x60, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0xce, 0x68, 0x37, + 0x01, 0x03, 0x6b, 0x4a, 0x68, 0x47, 0x00, 0x00, 0x08, 0x0c, 0x9f, 0x88, + 0x08, 0x0c, 0x54, 0x7a, 0x08, 0x0c, 0x81, 0xa5, 0x00, 0xfe, 0x00, 0x05, + 0x00, 0xe6, 0x00, 0xc6, 0x20, 0x71, 0xb8, 0xe1, 0x70, 0x04, 0xa0, 0x84, + 0x00, 0x07, 0x00, 0x02, 0x71, 0x14, 0x71, 0x17, 0x71, 0x2d, 0x71, 0x46, + 0x71, 0x83, 0x71, 0x14, 0x71, 0x12, 0x71, 0x12, 0x08, 0x0c, 0x15, 0x1a, + 0x00, 0xce, 0x00, 0xee, 0x00, 0x05, 0x70, 0x24, 0xa0, 0x65, 0x01, 0x48, + 0x70, 0x20, 0x80, 0x01, 0x70, 0x22, 0x60, 0x0c, 0xa0, 0x15, 0x01, 0x50, + 0x72, 0x16, 0x60, 0x0f, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x70, 0x27, + 0x00, 0x00, 0x00, 0xce, 0x00, 0xee, 0x00, 0x05, 0x72, 0x16, 0x72, 0x12, + 0x0c, 0xb0, 0x60, 0x18, 0x20, 0x60, 0x08, 0x0c, 0x4f, 0x46, 0x60, 0x00, + 0xc0, 0xdc, 0x60, 0x02, 0x70, 0x20, 0x80, 0x01, 0x70, 0x22, 0x01, 0x20, + 0x60, 0x54, 0xa0, 0x15, 0x01, 0x40, 0x72, 0x1e, 0x70, 0x07, 0x00, 0x00, + 0x70, 0x27, 0x00, 0x00, 0x00, 0xce, 0x00, 0xee, 0x00, 0x05, 0x72, 0x18, + 0x72, 0x1e, 0x0c, 0xb0, 0x70, 0x24, 0xa0, 0x65, 0x05, 0xb8, 0x70, 0x0c, + 0xac, 0x06, 0x11, 0x60, 0x08, 0x0c, 0x81, 0xa5, 0x60, 0x0c, 0xa0, 0x15, + 0x01, 0x20, 0x72, 0x0e, 0x60, 0x0f, 0x00, 0x00, 0x04, 0x48, 0x72, 0x0e, + 0x72, 0x0a, 0x04, 0x30, 0x70, 0x14, 0xac, 0x06, 0x11, 0x60, 0x08, 0x0c, + 0x81, 0xa5, 0x60, 0x0c, 0xa0, 0x15, 0x01, 0x20, 0x72, 0x16, 0x60, 0x0f, + 0x00, 0x00, 0x00, 0xd0, 0x72, 0x16, 0x72, 0x12, 0x00, 0xb8, 0x60, 0x1c, + 0xa0, 0x86, 0x00, 0x03, 0x11, 0x98, 0x60, 0x18, 0x20, 0x60, 0x08, 0x0c, + 0x4f, 0x46, 0x60, 0x00, 0xc0, 0xdc, 0x60, 0x02, 0x08, 0x0c, 0x81, 0xa5, + 0x70, 0x1c, 0xa0, 0x65, 0x01, 0x38, 0x60, 0x54, 0xa0, 0x15, 0x01, 0x10, + 0x72, 0x1e, 0x00, 0x10, 0x72, 0x18, 0x72, 0x1e, 0x70, 0x27, 0x00, 0x00, + 0x00, 0xce, 0x00, 0xee, 0x00, 0x05, 0x70, 0x24, 0xa0, 0x65, 0x01, 0x40, + 0x08, 0x0c, 0x81, 0xa5, 0x60, 0x0c, 0xa0, 0x15, 0x01, 0x50, 0x72, 0x0e, + 0x60, 0x0f, 0x00, 0x00, 0x08, 0x0c, 0x82, 0xd4, 0x70, 0x27, 0x00, 0x00, + 0x00, 0xce, 0x00, 0xee, 0x00, 0x05, 0x72, 0x0e, 0x72, 0x0a, 0x0c, 0xb0, + 0x00, 0xd6, 0x20, 0x69, 0xb8, 0xe1, 0x68, 0x30, 0xa0, 0x84, 0x00, 0x03, + 0x00, 0x02, 0x71, 0xa5, 0x71, 0xa7, 0x71, 0xcb, 0x71, 0xa3, 0x08, 0x0c, + 0x15, 0x1a, 0x00, 0xde, 0x00, 0x05, 0x00, 0xc6, 0x68, 0x40, 0xa0, 0x86, + 0x00, 0x01, 0x01, 0xb8, 0x68, 0x3c, 0xa0, 0x65, 0x01, 0x30, 0x60, 0x0c, + 0xa0, 0x15, 0x01, 0x70, 0x6a, 0x3a, 0x60, 0x0f, 0x00, 0x00, 0x68, 0x33, + 0x00, 0x00, 0x68, 0x3f, 0x00, 0x00, 0x20, 0x11, 0xb9, 0x00, 0x20, 0x13, + 0x00, 0x00, 0x00, 0xce, 0x00, 0xde, 0x00, 0x05, 0x68, 0x3a, 0x68, 0x36, + 0x0c, 0x90, 0x68, 0x43, 0x00, 0x00, 0x68, 0x38, 0xa0, 0x65, 0x0d, 0x68, + 0x60, 0x03, 0x00, 0x03, 0x0c, 0x50, 0x00, 0xc6, 0x68, 0x43, 0x00, 0x00, + 0x68, 0x47, 0x00, 0x00, 0x68, 0x4b, 0x00, 0x00, 0x68, 0x3c, 0xa0, 0x65, + 0x01, 0x68, 0x60, 0x0c, 0xa0, 0x15, 0x01, 0x30, 0x6a, 0x3a, 0x60, 0x0f, + 0x00, 0x00, 0x68, 0x3f, 0x00, 0x00, 0x00, 0x20, 0x68, 0x3f, 0x00, 0x00, + 0x68, 0x3a, 0x68, 0x36, 0x00, 0xce, 0x00, 0xde, 0x00, 0x05, 0x00, 0xd6, + 0x20, 0x69, 0xb8, 0xe1, 0x68, 0x04, 0xa0, 0x84, 0x00, 0x07, 0x00, 0x02, + 0x71, 0xf6, 0x72, 0x92, 0x72, 0x92, 0x72, 0x92, 0x72, 0x92, 0x72, 0x94, + 0x71, 0xf4, 0x71, 0xf4, 0x08, 0x0c, 0x15, 0x1a, 0x68, 0x20, 0xa0, 0x05, + 0x11, 0x10, 0x00, 0xde, 0x00, 0x05, 0x00, 0xc6, 0x68, 0x0c, 0xa0, 0x65, + 0x01, 0x50, 0x68, 0x07, 0x00, 0x04, 0x68, 0x26, 0x68, 0x2b, 0x00, 0x00, + 0x08, 0x0c, 0x72, 0xe4, 0x00, 0xce, 0x00, 0xde, 0x00, 0x05, 0x68, 0x14, + 0xa0, 0x65, 0x01, 0x50, 0x68, 0x07, 0x00, 0x01, 0x68, 0x26, 0x68, 0x2b, + 0x00, 0x00, 0x08, 0x0c, 0x72, 0xe4, 0x00, 0xce, 0x00, 0xde, 0x00, 0x05, + 0x00, 0xe6, 0x00, 0x36, 0x6a, 0x1c, 0xa2, 0xf5, 0x00, 0x00, 0x09, 0x04, + 0x72, 0x8e, 0x70, 0x4c, 0xa0, 0x0d, 0x01, 0x18, 0x70, 0x88, 0xa0, 0x05, + 0x01, 0xa0, 0x70, 0x54, 0xa0, 0x75, 0x01, 0x20, 0xa2, 0x0e, 0x09, 0x04, + 0x72, 0x8e, 0x00, 0x28, 0x68, 0x18, 0xa2, 0x0e, 0x09, 0x04, 0x72, 0x8e, + 0x20, 0x70, 0x70, 0x4c, 0xa0, 0x0d, 0x0d, 0x88, 0x70, 0x88, 0xa0, 0x05, + 0x1d, 0x70, 0x2e, 0x00, 0x68, 0x1e, 0x73, 0x3c, 0x70, 0x38, 0xa3, 0x02, + 0x1e, 0x40, 0x08, 0x0c, 0x86, 0x7b, 0x09, 0x04, 0x72, 0x8e, 0x83, 0x18, + 0x73, 0x3e, 0x61, 0x12, 0x2e, 0x10, 0x62, 0x1a, 0xa1, 0x80, 0x00, 0x14, + 0x20, 0x04, 0xa0, 0x84, 0x00, 0xff, 0x60, 0x5a, 0xa1, 0x80, 0x00, 0x14, + 0x20, 0x03, 0x00, 0x00, 0xa1, 0x80, 0x00, 0x15, 0x20, 0x04, 0xa0, 0x8a, + 0x19, 0x9a, 0x02, 0x10, 0x20, 0x01, 0x19, 0x99, 0x80, 0x03, 0x80, 0x1b, + 0x83, 0x1b, 0xa3, 0x18, 0x63, 0x16, 0x00, 0x3e, 0x00, 0xf6, 0x2c, 0x78, + 0x71, 0xa0, 0x20, 0x01, 0xb6, 0x35, 0x20, 0x04, 0xd0, 0xac, 0x11, 0x10, + 0xd1, 0xbc, 0x01, 0x50, 0x71, 0x00, 0xd1, 0xf4, 0x01, 0x20, 0x71, 0x14, + 0xa1, 0x8c, 0x00, 0xff, 0x00, 0x40, 0x20, 0x09, 0x00, 0x00, 0x00, 0x28, + 0xa1, 0xe0, 0x2d, 0xf9, 0x2c, 0x0d, 0xa1, 0x8c, 0x00, 0xff, 0x20, 0x61, + 0x01, 0x00, 0x61, 0x9a, 0x08, 0x0c, 0x79, 0x14, 0x73, 0x00, 0xc3, 0xdd, + 0x73, 0x02, 0x68, 0x07, 0x00, 0x02, 0x2f, 0x18, 0x6b, 0x26, 0x68, 0x2b, + 0x00, 0x00, 0x78, 0x1f, 0x00, 0x03, 0x78, 0x03, 0x00, 0x01, 0x78, 0x07, + 0x00, 0x40, 0x00, 0xfe, 0x00, 0xee, 0x00, 0xce, 0x00, 0xde, 0x00, 0x05, + 0x00, 0x3e, 0x00, 0xee, 0x00, 0xce, 0x0c, 0xd0, 0x00, 0xde, 0x00, 0x05, + 0x00, 0xc6, 0x68, 0x0c, 0xa0, 0x65, 0x01, 0x38, 0x68, 0x07, 0x00, 0x04, + 0x68, 0x26, 0x68, 0x2b, 0x00, 0x00, 0x08, 0x0c, 0x72, 0xe4, 0x00, 0xce, + 0x00, 0xde, 0x00, 0x05, 0x00, 0xf6, 0x00, 0xd6, 0x20, 0x69, 0xb8, 0xe1, + 0x68, 0x30, 0xa0, 0x86, 0x00, 0x00, 0x11, 0xd0, 0x20, 0x01, 0xb6, 0x0c, + 0x20, 0x0c, 0xd1, 0xbc, 0x15, 0x60, 0x68, 0x38, 0xa0, 0x7d, 0x01, 0x90, + 0x68, 0x33, 0x00, 0x01, 0x68, 0x3e, 0x68, 0x47, 0x00, 0x00, 0x68, 0x4b, + 0x00, 0x00, 0x01, 0x26, 0x00, 0xf6, 0x20, 0x91, 0x24, 0x00, 0x00, 0x2e, + 0x08, 0x0c, 0x20, 0x3d, 0x11, 0x30, 0x01, 0x2e, 0x08, 0x0c, 0x7c, 0x5d, + 0x00, 0xde, 0x00, 0xfe, 0x00, 0x05, 0x01, 0x2e, 0xe0, 0x00, 0x68, 0x43, + 0x00, 0x00, 0x78, 0x03, 0x00, 0x02, 0x78, 0x0c, 0xa0, 0x15, 0x01, 0x40, + 0x6a, 0x3a, 0x78, 0x0f, 0x00, 0x00, 0x68, 0x33, 0x00, 0x00, 0x68, 0x3f, + 0x00, 0x00, 0x0c, 0x60, 0x68, 0x3a, 0x68, 0x36, 0x0c, 0xc0, 0xc1, 0xbc, + 0x21, 0x02, 0x00, 0x66, 0x20, 0x31, 0x00, 0x01, 0x08, 0x0c, 0x5b, 0xc3, + 0x00, 0x6e, 0x08, 0x58, 0x60, 0x1c, 0xa0, 0x84, 0x00, 0x0f, 0x00, 0x0b, + 0x00, 0x05, 0x72, 0xf2, 0x72, 0xf7, 0x77, 0xb5, 0x78, 0xd1, 0x72, 0xf7, + 0x77, 0xb5, 0x78, 0xd1, 0x72, 0xf2, 0x72, 0xf7, 0x08, 0x0c, 0x71, 0x02, + 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x05, 0x01, 0x56, 0x01, 0x36, 0x01, 0x46, + 0x00, 0xc6, 0x00, 0xf6, 0x60, 0x04, 0xa0, 0x8a, 0x00, 0x80, 0x1a, 0x0c, + 0x15, 0x1a, 0x61, 0x18, 0x21, 0x78, 0x79, 0xa0, 0x20, 0x11, 0xb6, 0x35, + 0x22, 0x14, 0xd2, 0xac, 0x11, 0x10, 0xd1, 0xbc, 0x01, 0x50, 0x79, 0x00, + 0xd1, 0xf4, 0x01, 0x20, 0x79, 0x14, 0xa1, 0x8c, 0x00, 0xff, 0x00, 0x40, + 0x20, 0x09, 0x00, 0x00, 0x00, 0x28, 0xa1, 0xf8, 0x2d, 0xf9, 0x2f, 0x0d, + 0xa1, 0x8c, 0x00, 0xff, 0x2c, 0x78, 0x20, 0x61, 0x01, 0x00, 0x61, 0x9a, + 0xa0, 0x8a, 0x00, 0x40, 0x1a, 0x04, 0x73, 0x6b, 0x00, 0x33, 0x00, 0xfe, + 0x00, 0xce, 0x01, 0x4e, 0x01, 0x3e, 0x01, 0x5e, 0x00, 0x05, 0x74, 0x1a, + 0x74, 0x65, 0x74, 0x92, 0x75, 0x5f, 0x75, 0x8d, 0x75, 0x95, 0x75, 0xbb, + 0x75, 0xcc, 0x75, 0xdd, 0x75, 0xe5, 0x75, 0xfb, 0x75, 0xe5, 0x76, 0x5c, + 0x75, 0xcc, 0x76, 0x7d, 0x76, 0x85, 0x75, 0xdd, 0x76, 0x85, 0x76, 0x96, + 0x73, 0x69, 0x73, 0x69, 0x73, 0x69, 0x73, 0x69, 0x73, 0x69, 0x73, 0x69, + 0x73, 0x69, 0x73, 0x69, 0x73, 0x69, 0x73, 0x69, 0x73, 0x69, 0x7e, 0xfe, + 0x7f, 0x23, 0x7f, 0x46, 0x7f, 0x69, 0x7f, 0x8a, 0x75, 0xbb, 0x73, 0x69, + 0x75, 0xbb, 0x75, 0xe5, 0x73, 0x69, 0x74, 0x92, 0x75, 0x5f, 0x73, 0x69, + 0x83, 0xd6, 0x75, 0xe5, 0x73, 0x69, 0x83, 0xf6, 0x75, 0xe5, 0x73, 0x69, + 0x75, 0xdd, 0x74, 0x13, 0x73, 0x7e, 0x73, 0x69, 0x84, 0x1b, 0x84, 0x90, + 0x85, 0x67, 0x73, 0x69, 0x85, 0x78, 0x75, 0xb6, 0x85, 0x94, 0x73, 0x69, + 0x7f, 0x9f, 0x85, 0xef, 0x73, 0x69, 0x08, 0x0c, 0x15, 0x1a, 0x21, 0x00, + 0x00, 0x33, 0x00, 0xfe, 0x00, 0xce, 0x01, 0x4e, 0x01, 0x3e, 0x01, 0x5e, + 0x00, 0x05, 0x73, 0x7c, 0x73, 0x7c, 0x73, 0x7c, 0x73, 0xb2, 0x73, 0xd0, + 0x73, 0xe6, 0x73, 0x7c, 0x73, 0x7c, 0x73, 0x7c, 0x08, 0x0c, 0x15, 0x1a, + 0x00, 0xd6, 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, 0x76, 0xb3, 0x78, 0x10, + 0x20, 0x68, 0x20, 0xa3, 0x24, 0x14, 0x20, 0xa3, 0x00, 0x18, 0x20, 0xa3, + 0x08, 0x00, 0x68, 0x3c, 0x20, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x68, 0x50, + 0x20, 0xa2, 0x68, 0x54, 0x20, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x60, 0xc3, 0x00, 0x18, 0x08, 0x0c, 0x7d, 0xe0, 0x00, 0xde, + 0x00, 0x05, 0x00, 0xd6, 0x78, 0x18, 0x20, 0x68, 0x68, 0xa0, 0x20, 0x69, + 0xb6, 0x00, 0x6a, 0xd4, 0xd2, 0xac, 0x11, 0x10, 0xd0, 0xbc, 0x01, 0x10, + 0xa0, 0x85, 0x00, 0x01, 0x00, 0xde, 0x00, 0x05, 0x00, 0xd6, 0x20, 0xa1, + 0x02, 0x0b, 0x08, 0x0c, 0x76, 0xb3, 0x20, 0xa3, 0x05, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x78, 0x10, 0xa0, 0xe8, 0x00, 0x0f, 0x68, 0x08, 0x20, 0xa2, + 0x68, 0x0c, 0x20, 0xa2, 0x68, 0x10, 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, + 0x68, 0x18, 0x20, 0xa2, 0x68, 0x1c, 0x20, 0xa2, 0x60, 0xc3, 0x00, 0x10, + 0x08, 0x0c, 0x7d, 0xe0, 0x00, 0xde, 0x00, 0x05, 0x01, 0x56, 0x01, 0x46, + 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, 0x76, 0xb3, 0x20, 0xa3, 0x78, 0x00, + 0x20, 0xa3, 0x00, 0x00, 0x78, 0x08, 0x80, 0x07, 0x20, 0xa2, 0x20, 0xa3, + 0x00, 0x00, 0x60, 0xc3, 0x00, 0x08, 0x08, 0x0c, 0x7d, 0xe0, 0x01, 0x4e, + 0x01, 0x5e, 0x00, 0x05, 0x01, 0x56, 0x01, 0x46, 0x20, 0xa1, 0x02, 0x0b, + 0x08, 0x0c, 0x77, 0x4f, 0x20, 0xa3, 0x02, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x20, 0xa3, 0xdf, 0x10, 0x20, 0xa3, 0x00, 0x34, 0x20, 0x99, 0xb6, 0x05, + 0x20, 0xa9, 0x00, 0x04, 0x53, 0xa6, 0x20, 0x99, 0xb6, 0x01, 0x20, 0xa9, + 0x00, 0x04, 0x53, 0xa6, 0x20, 0x99, 0xb8, 0xc7, 0x20, 0xa9, 0x00, 0x1a, + 0x33, 0x04, 0x80, 0x07, 0x20, 0xa2, 0x93, 0x98, 0x1f, 0x04, 0x74, 0x02, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, 0x00, 0x4c, + 0x08, 0x0c, 0x7d, 0xe0, 0x01, 0x4e, 0x01, 0x5e, 0x00, 0x05, 0x20, 0x01, + 0xb6, 0x15, 0x20, 0x04, 0x60, 0x9a, 0x08, 0x0c, 0x7d, 0xe0, 0x00, 0x05, + 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, 0x76, 0xb3, 0x20, 0xa3, 0x52, 0x00, + 0x20, 0xa3, 0x00, 0x00, 0x00, 0xd6, 0x20, 0x69, 0xb6, 0x52, 0x68, 0x04, + 0xd0, 0x84, 0x01, 0x50, 0x68, 0x28, 0x20, 0xa3, 0x00, 0x00, 0x00, 0x16, + 0x08, 0x0c, 0x28, 0x66, 0x21, 0xa2, 0x00, 0x1e, 0x00, 0xde, 0x00, 0x28, + 0x00, 0xde, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa9, + 0x00, 0x04, 0x20, 0x99, 0xb6, 0x05, 0x53, 0xa6, 0x20, 0xa9, 0x00, 0x04, + 0x20, 0x99, 0xb6, 0x01, 0x53, 0xa6, 0x20, 0x01, 0xb6, 0x35, 0x20, 0x04, + 0xd0, 0xac, 0x11, 0x38, 0x78, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, + 0xa0, 0x82, 0x00, 0x7f, 0x02, 0x38, 0x20, 0x01, 0xb6, 0x1c, 0x20, 0xa6, + 0x20, 0x01, 0xb6, 0x1d, 0x20, 0xa6, 0x00, 0x40, 0x20, 0xa3, 0x00, 0x00, + 0x20, 0x01, 0xb6, 0x15, 0x20, 0x04, 0xa0, 0x84, 0x00, 0xff, 0x20, 0xa2, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, 0x00, 0x1c, + 0x08, 0x0c, 0x7d, 0xe0, 0x00, 0x05, 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, + 0x76, 0xb3, 0x20, 0xa3, 0x05, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0x01, + 0xb6, 0x35, 0x20, 0x04, 0xd0, 0xac, 0x11, 0x38, 0x78, 0x18, 0xa0, 0x80, + 0x00, 0x28, 0x20, 0x04, 0xa0, 0x82, 0x00, 0x7f, 0x02, 0x38, 0x20, 0x01, + 0xb6, 0x1c, 0x20, 0xa6, 0x20, 0x01, 0xb6, 0x1d, 0x20, 0xa6, 0x00, 0x40, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0x01, 0xb6, 0x15, 0x20, 0x04, 0xa0, 0x84, + 0x00, 0xff, 0x20, 0xa2, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x99, 0xb6, 0x05, + 0x53, 0xa6, 0x60, 0xc3, 0x00, 0x10, 0x08, 0x0c, 0x7d, 0xe0, 0x00, 0x05, + 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, 0x76, 0xb3, 0x00, 0xc6, 0x78, 0x18, + 0x20, 0x60, 0x20, 0x01, 0x00, 0x00, 0x08, 0x0c, 0x53, 0x85, 0x00, 0xce, + 0x78, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, 0xa0, 0x86, 0x00, 0x7e, + 0x11, 0x30, 0x20, 0xa3, 0x04, 0x00, 0x62, 0x0c, 0xc2, 0xb4, 0x62, 0x0e, + 0x00, 0x10, 0x20, 0xa3, 0x03, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x78, 0x18, + 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, 0xa0, 0x86, 0x00, 0x7e, 0x19, 0x04, + 0x75, 0x21, 0x20, 0x01, 0xb6, 0x35, 0x20, 0x04, 0xd0, 0xa4, 0x01, 0xc8, + 0x20, 0x99, 0xb8, 0x8e, 0x33, 0xa6, 0x93, 0x98, 0x20, 0xa3, 0x00, 0x00, + 0x93, 0x98, 0x33, 0x04, 0xa0, 0x84, 0x20, 0x00, 0x20, 0xa2, 0x93, 0x98, + 0x33, 0xa6, 0x93, 0x98, 0x20, 0xa3, 0x00, 0x00, 0x93, 0x98, 0x20, 0x01, + 0x27, 0x10, 0x20, 0xa2, 0x93, 0x98, 0x33, 0xa6, 0x93, 0x98, 0x33, 0xa6, + 0x00, 0xd0, 0x20, 0x99, 0xb8, 0x8e, 0x33, 0xa6, 0x93, 0x98, 0x33, 0xa6, + 0x93, 0x98, 0x33, 0x04, 0x08, 0x0c, 0x5b, 0x41, 0x11, 0x18, 0xa0, 0x84, + 0x37, 0xff, 0x00, 0x10, 0xa0, 0x84, 0x3f, 0xff, 0x20, 0xa2, 0x93, 0x98, + 0x33, 0xa6, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x99, + 0xb6, 0x05, 0x53, 0xa6, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x99, 0xb6, 0x01, + 0x53, 0xa6, 0x20, 0xa9, 0x00, 0x08, 0x20, 0xa3, 0x00, 0x00, 0x1f, 0x04, + 0x74, 0xfb, 0x20, 0xa9, 0x00, 0x08, 0x20, 0xa3, 0x00, 0x00, 0x1f, 0x04, + 0x75, 0x01, 0x20, 0x99, 0xb8, 0x96, 0x33, 0x04, 0xc0, 0xdd, 0x20, 0xa2, + 0x20, 0x01, 0xb6, 0x72, 0x20, 0x04, 0xd0, 0xe4, 0x01, 0x58, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x93, 0x98, 0x93, 0x98, 0x93, 0x98, + 0x33, 0xa6, 0x20, 0xa9, 0x00, 0x04, 0x00, 0x10, 0x20, 0xa9, 0x00, 0x07, + 0x20, 0xa3, 0x00, 0x00, 0x1f, 0x04, 0x75, 0x1c, 0x04, 0x68, 0x20, 0x01, + 0xb6, 0x35, 0x20, 0x04, 0xd0, 0xa4, 0x01, 0x40, 0x20, 0x01, 0xb8, 0x8f, + 0x20, 0x04, 0x60, 0xe3, 0x00, 0x00, 0x08, 0x0c, 0x28, 0xa7, 0x60, 0xe2, + 0x20, 0x99, 0xb8, 0x8e, 0x20, 0xa9, 0x00, 0x08, 0x53, 0xa6, 0x20, 0xa9, + 0x00, 0x04, 0x20, 0x99, 0xb6, 0x05, 0x53, 0xa6, 0x20, 0xa9, 0x00, 0x04, + 0x20, 0x99, 0xb6, 0x01, 0x53, 0xa6, 0x20, 0xa9, 0x00, 0x08, 0x20, 0xa3, + 0x00, 0x00, 0x1f, 0x04, 0x75, 0x3f, 0x20, 0xa9, 0x00, 0x08, 0x20, 0xa3, + 0x00, 0x00, 0x1f, 0x04, 0x75, 0x45, 0x20, 0x99, 0xb8, 0x96, 0x20, 0xa9, + 0x00, 0x08, 0x53, 0xa6, 0x20, 0xa9, 0x00, 0x08, 0x20, 0xa3, 0x00, 0x00, + 0x1f, 0x04, 0x75, 0x50, 0x20, 0xa9, 0x00, 0x0a, 0x20, 0xa3, 0x00, 0x00, + 0x1f, 0x04, 0x75, 0x56, 0x60, 0xc3, 0x00, 0x74, 0x08, 0x0c, 0x7d, 0xe0, + 0x00, 0x05, 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, 0x76, 0xb3, 0x20, 0xa3, + 0x20, 0x10, 0x20, 0xa3, 0x00, 0x14, 0x20, 0xa3, 0x08, 0x00, 0x20, 0xa3, + 0x20, 0x00, 0xa0, 0x06, 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa2, + 0x20, 0xa2, 0x00, 0xf6, 0x20, 0x79, 0xb6, 0x52, 0x79, 0x04, 0x00, 0xfe, + 0xd1, 0xac, 0x11, 0x10, 0xa0, 0x85, 0x00, 0x20, 0xd1, 0xa4, 0x01, 0x10, + 0xa0, 0x85, 0x00, 0x10, 0xa0, 0x85, 0x00, 0x02, 0x00, 0xd6, 0x08, 0x04, + 0x76, 0x3e, 0x20, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x60, 0xc3, 0x00, 0x14, 0x08, 0x0c, 0x7d, 0xe0, 0x00, 0x05, 0x20, 0xa1, + 0x02, 0x0b, 0x08, 0x0c, 0x76, 0xb3, 0x20, 0xa3, 0x50, 0x00, 0x08, 0x04, + 0x74, 0xad, 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, 0x76, 0xb3, 0x20, 0xa3, + 0x21, 0x10, 0x20, 0xa3, 0x00, 0x14, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, + 0x00, 0x14, 0x08, 0x0c, 0x7d, 0xe0, 0x00, 0x05, 0x20, 0xa1, 0x02, 0x0b, + 0x08, 0x0c, 0x77, 0x47, 0x00, 0x20, 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, + 0x77, 0x4f, 0x20, 0xa3, 0x02, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, 0x00, 0x04, 0x08, 0x0c, + 0x7d, 0xe0, 0x00, 0x05, 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, 0x77, 0x4f, + 0x20, 0xa3, 0x01, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x03, + 0x20, 0xa3, 0x2a, 0x00, 0x60, 0xc3, 0x00, 0x08, 0x08, 0x0c, 0x7d, 0xe0, + 0x00, 0x05, 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, 0x77, 0x4f, 0x20, 0xa3, + 0x02, 0x00, 0x08, 0x04, 0x74, 0xad, 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, + 0x77, 0x4f, 0x20, 0xa3, 0x01, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x78, 0x28, + 0xa0, 0x05, 0x01, 0x10, 0x20, 0xa2, 0x00, 0x10, 0x20, 0xa3, 0x00, 0x03, + 0x78, 0x10, 0x20, 0xa2, 0x60, 0xc3, 0x00, 0x08, 0x08, 0x0c, 0x7d, 0xe0, + 0x00, 0x05, 0x00, 0xd6, 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, 0x77, 0x4f, + 0x20, 0xa3, 0x02, 0x10, 0x20, 0xa3, 0x00, 0x14, 0x20, 0xa3, 0x08, 0x00, + 0x78, 0x18, 0x20, 0x68, 0x68, 0x94, 0xa0, 0x86, 0x00, 0x14, 0x11, 0x98, + 0x69, 0x9c, 0xa1, 0x84, 0x00, 0x30, 0x01, 0x90, 0x69, 0x98, 0xa1, 0x84, + 0xc0, 0x00, 0x11, 0x40, 0xd1, 0xec, 0x01, 0x18, 0x20, 0xa3, 0x21, 0x00, + 0x00, 0x58, 0x20, 0xa3, 0x01, 0x00, 0x00, 0x40, 0x20, 0xa3, 0x04, 0x00, + 0x00, 0x28, 0x20, 0xa3, 0x07, 0x00, 0x00, 0x10, 0x70, 0x0f, 0x08, 0x00, + 0xa0, 0x06, 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa2, + 0x00, 0xf6, 0x20, 0x79, 0xb6, 0x52, 0x79, 0x04, 0x00, 0xfe, 0xd1, 0xac, + 0x11, 0x10, 0xa0, 0x85, 0x00, 0x20, 0xd1, 0xa4, 0x01, 0x10, 0xa0, 0x85, + 0x00, 0x10, 0x20, 0x09, 0xb6, 0x74, 0x21, 0x0c, 0xd1, 0x84, 0x11, 0x10, + 0xa0, 0x85, 0x00, 0x02, 0x00, 0x26, 0x20, 0x09, 0xb6, 0x72, 0x21, 0x0c, + 0xd1, 0xe4, 0x01, 0x30, 0xc0, 0xc5, 0xa0, 0x94, 0x00, 0x30, 0xa2, 0x96, + 0x00, 0x10, 0x01, 0x40, 0xd1, 0xec, 0x01, 0x30, 0xa0, 0x94, 0x00, 0x30, + 0xa2, 0x96, 0x00, 0x10, 0x01, 0x08, 0xc0, 0xbd, 0x00, 0x2e, 0x20, 0xa2, + 0x20, 0xa2, 0x20, 0xa2, 0x60, 0xc3, 0x00, 0x14, 0x08, 0x0c, 0x7d, 0xe0, + 0x00, 0xde, 0x00, 0x05, 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, 0x77, 0x4f, + 0x20, 0xa3, 0x02, 0x10, 0x20, 0xa3, 0x00, 0x14, 0x20, 0xa3, 0x00, 0x00, + 0x20, 0xa3, 0x01, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x60, 0xc3, 0x00, 0x14, 0x08, 0x0c, 0x7d, 0xe0, 0x00, 0x05, 0x20, 0xa1, + 0x02, 0x0b, 0x08, 0x0c, 0x77, 0x4f, 0x20, 0xa3, 0x02, 0x00, 0x08, 0x04, + 0x74, 0x20, 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, 0x77, 0x4f, 0x20, 0xa3, + 0x01, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x03, 0x20, 0xa3, + 0x2a, 0x00, 0x60, 0xc3, 0x00, 0x08, 0x08, 0x0c, 0x7d, 0xe0, 0x00, 0x05, + 0x20, 0xe1, 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, 0x20, 0xa1, 0x02, 0x0b, + 0x08, 0x0c, 0x77, 0x4f, 0x20, 0xa3, 0x01, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x20, 0xa3, 0x00, 0x0b, 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, 0x00, 0x08, + 0x08, 0x0c, 0x7d, 0xe0, 0x00, 0x05, 0x00, 0x26, 0x00, 0x36, 0x00, 0x46, + 0x20, 0x19, 0x32, 0x00, 0x20, 0x21, 0x08, 0x00, 0x00, 0x38, 0x00, 0x26, + 0x00, 0x36, 0x00, 0x46, 0x20, 0x19, 0x22, 0x00, 0x20, 0x21, 0x01, 0x00, + 0x20, 0xe1, 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, 0x78, 0x18, 0xa0, 0x80, + 0x00, 0x28, 0x20, 0x14, 0xa2, 0x86, 0x00, 0x7e, 0x11, 0xa0, 0xa3, 0x85, + 0x00, 0xff, 0x20, 0xa2, 0x20, 0xa3, 0xff, 0xfe, 0x20, 0xa3, 0x00, 0x00, + 0x20, 0x11, 0xb6, 0x15, 0x22, 0x14, 0x20, 0x01, 0xb8, 0x9e, 0x20, 0x04, + 0xa0, 0x05, 0x01, 0x18, 0x20, 0x11, 0xb6, 0x1d, 0x22, 0x14, 0x22, 0xa2, + 0x04, 0xd0, 0xa2, 0x86, 0x00, 0x7f, 0x11, 0x38, 0x00, 0xd6, 0xa3, 0x85, + 0x00, 0xff, 0x20, 0xa2, 0x20, 0xa3, 0xff, 0xfd, 0x00, 0xc8, 0x20, 0x01, + 0xb6, 0x35, 0x20, 0x04, 0xd0, 0xac, 0x11, 0x10, 0xd2, 0xbc, 0x01, 0xc8, + 0xa2, 0x86, 0x00, 0x80, 0x00, 0xd6, 0x11, 0x30, 0xa3, 0x85, 0x00, 0xff, + 0x20, 0xa2, 0x20, 0xa3, 0xff, 0xfc, 0x00, 0x40, 0xa2, 0xe8, 0xb7, 0x35, + 0x2d, 0x6c, 0x68, 0x10, 0xa3, 0x05, 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, + 0x20, 0x69, 0xb6, 0x1c, 0x2d, 0xa6, 0x8d, 0x68, 0x2d, 0xa6, 0x00, 0xde, + 0x00, 0x80, 0x00, 0xd6, 0xa2, 0xe8, 0xb7, 0x35, 0x2d, 0x6c, 0x68, 0x10, + 0xa3, 0x05, 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, 0x00, 0xde, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0x11, 0xb6, 0x15, 0x22, 0x14, 0x22, 0xa2, 0xa4, 0x85, + 0x00, 0x29, 0x20, 0xa2, 0x00, 0x4e, 0x00, 0x3e, 0x20, 0xa3, 0x00, 0x00, + 0x08, 0x0c, 0x7d, 0xcf, 0x22, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x2f, 0xa2, + 0x20, 0xa3, 0xff, 0xff, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x00, 0x2e, 0x00, 0x05, 0x00, 0x26, 0x20, 0xe1, 0x90, 0x80, 0x20, 0xe1, + 0x40, 0x00, 0x20, 0xa3, 0x02, 0xff, 0x20, 0x11, 0xff, 0xfc, 0x22, 0xa2, + 0x00, 0xd6, 0x20, 0x69, 0xb6, 0x1c, 0x2d, 0xa6, 0x8d, 0x68, 0x2d, 0xa6, + 0x00, 0xde, 0x20, 0xa3, 0x20, 0x29, 0x20, 0xa3, 0x00, 0x00, 0x08, 0xe0, + 0x20, 0xa3, 0x01, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0xfc, 0x02, + 0x20, 0xa3, 0x00, 0x00, 0x00, 0x05, 0x00, 0x26, 0x00, 0x36, 0x00, 0x46, + 0x20, 0x19, 0x33, 0x00, 0x20, 0x21, 0x08, 0x00, 0x00, 0x38, 0x00, 0x26, + 0x00, 0x36, 0x00, 0x46, 0x20, 0x19, 0x23, 0x00, 0x20, 0x21, 0x01, 0x00, + 0x20, 0xe1, 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, 0x78, 0x18, 0xa0, 0x80, + 0x00, 0x28, 0x20, 0x04, 0x20, 0x11, 0xb6, 0x35, 0x22, 0x14, 0xd2, 0xac, + 0x11, 0x18, 0xa0, 0x92, 0x00, 0x7e, 0x02, 0xd8, 0x00, 0xd6, 0xa0, 0xe8, + 0xb7, 0x35, 0x2d, 0x6c, 0x68, 0x10, 0xa3, 0x05, 0x20, 0xa2, 0x68, 0x14, + 0x20, 0xa2, 0x68, 0x10, 0xa0, 0x05, 0x11, 0x40, 0x68, 0x14, 0xa0, 0x05, + 0x11, 0x28, 0x20, 0xa3, 0x00, 0xff, 0x20, 0xa3, 0xff, 0xfe, 0x00, 0x28, + 0x20, 0x69, 0xb6, 0x1c, 0x2d, 0xa6, 0x8d, 0x68, 0x2d, 0xa6, 0x00, 0xde, + 0x00, 0x80, 0x00, 0xd6, 0xa0, 0xe8, 0xb7, 0x35, 0x2d, 0x6c, 0x68, 0x10, + 0xa3, 0x05, 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, 0x00, 0xde, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0x11, 0xb6, 0x15, 0x22, 0x14, 0x22, 0xa2, 0xa4, 0x85, + 0x00, 0x98, 0x20, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x00, 0x4e, 0x00, 0x3e, + 0x08, 0x0c, 0x7d, 0xcf, 0x22, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x7a, 0x08, + 0x22, 0xa2, 0x2f, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x00, 0x2e, 0x00, 0x05, 0x08, 0x0c, 0x7d, 0xcf, 0x22, 0xa2, 0x20, 0xa3, + 0x00, 0x00, 0x7a, 0x08, 0x22, 0xa2, 0x78, 0x10, 0x20, 0xa2, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x05, 0x00, 0xc6, + 0x00, 0xf6, 0x60, 0x04, 0xa0, 0x8a, 0x00, 0x85, 0x0a, 0x0c, 0x15, 0x1a, + 0xa0, 0x8a, 0x00, 0x8c, 0x1a, 0x0c, 0x15, 0x1a, 0x61, 0x18, 0x21, 0x78, + 0x79, 0xa0, 0x20, 0x11, 0xb6, 0x35, 0x22, 0x14, 0xd2, 0xac, 0x11, 0x10, + 0xd1, 0xbc, 0x01, 0x50, 0x79, 0x00, 0xd1, 0xf4, 0x01, 0x20, 0x79, 0x14, + 0xa1, 0x8c, 0x00, 0xff, 0x00, 0x40, 0x20, 0x09, 0x00, 0x00, 0x00, 0x28, + 0xa1, 0xf8, 0x2d, 0xf9, 0x2f, 0x0d, 0xa1, 0x8c, 0x00, 0xff, 0x2c, 0x78, + 0x20, 0x61, 0x01, 0x00, 0x61, 0x9a, 0xa0, 0x82, 0x00, 0x85, 0x00, 0x1b, + 0x00, 0xfe, 0x00, 0xce, 0x00, 0x05, 0x77, 0xec, 0x77, 0xf6, 0x78, 0x11, + 0x77, 0xea, 0x77, 0xea, 0x77, 0xea, 0x77, 0xec, 0x08, 0x0c, 0x15, 0x1a, + 0x01, 0x46, 0x20, 0xa1, 0x02, 0x0b, 0x04, 0xa1, 0x60, 0xc3, 0x00, 0x00, + 0x08, 0x0c, 0x7d, 0xe0, 0x01, 0x4e, 0x00, 0x05, 0x01, 0x46, 0x20, 0xa1, + 0x02, 0x0b, 0x08, 0x0c, 0x78, 0x5d, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x78, 0x08, 0x20, 0xa2, 0x78, 0x10, 0x20, 0xa2, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0xa3, 0xff, 0xff, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x60, 0xc3, 0x00, 0x0c, 0x08, 0x0c, 0x7d, 0xe0, 0x01, 0x4e, + 0x00, 0x05, 0x01, 0x46, 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, 0x78, 0x97, + 0x20, 0xa3, 0x00, 0x03, 0x20, 0xa3, 0x03, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, 0x00, 0x04, 0x08, 0x0c, 0x7d, 0xe0, + 0x01, 0x4e, 0x00, 0x05, 0x00, 0x26, 0x20, 0xe1, 0x90, 0x80, 0x20, 0xe1, + 0x40, 0x00, 0x78, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, 0x20, 0x11, + 0xb6, 0x35, 0x22, 0x14, 0xd2, 0xac, 0x11, 0x18, 0xa0, 0x92, 0x00, 0x7e, + 0x02, 0x88, 0x00, 0xd6, 0xa0, 0xe8, 0xb7, 0x35, 0x2d, 0x6c, 0x68, 0x10, + 0xa0, 0x85, 0x81, 0x00, 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, 0x20, 0x69, + 0xb6, 0x1c, 0x2d, 0xa6, 0x8d, 0x68, 0x2d, 0xa6, 0x00, 0xde, 0x00, 0x88, + 0x00, 0xd6, 0xa0, 0xe8, 0xb7, 0x35, 0x2d, 0x6c, 0x68, 0x10, 0xa0, 0x85, + 0x81, 0x00, 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, 0x00, 0xde, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0x11, 0xb6, 0x15, 0x22, 0x14, 0x22, 0xa2, 0x20, 0xa3, + 0x00, 0x09, 0x20, 0xa3, 0x00, 0x00, 0x08, 0x04, 0x77, 0x1a, 0x00, 0x26, + 0x20, 0xe1, 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, 0x78, 0x18, 0xa0, 0x80, + 0x00, 0x28, 0x20, 0x04, 0x20, 0x11, 0xb6, 0x35, 0x22, 0x14, 0xd2, 0xac, + 0x11, 0x18, 0xa0, 0x92, 0x00, 0x7e, 0x02, 0x88, 0x00, 0xd6, 0xa0, 0xe8, + 0xb7, 0x35, 0x2d, 0x6c, 0x68, 0x10, 0xa0, 0x85, 0x84, 0x00, 0x20, 0xa2, + 0x68, 0x14, 0x20, 0xa2, 0x20, 0x69, 0xb6, 0x1c, 0x2d, 0xa6, 0x8d, 0x68, + 0x2d, 0xa6, 0x00, 0xde, 0x00, 0x88, 0x00, 0xd6, 0xa0, 0xe8, 0xb7, 0x35, + 0x2d, 0x6c, 0x68, 0x10, 0xa0, 0x85, 0x84, 0x00, 0x20, 0xa2, 0x68, 0x14, + 0x20, 0xa2, 0x00, 0xde, 0x20, 0xa3, 0x00, 0x00, 0x20, 0x11, 0xb6, 0x15, + 0x22, 0x14, 0x22, 0xa2, 0x20, 0x01, 0x00, 0x99, 0x20, 0xa2, 0x20, 0xa3, + 0x00, 0x00, 0x08, 0x04, 0x77, 0xa6, 0x00, 0x26, 0x20, 0xe1, 0x90, 0x80, + 0x20, 0xe1, 0x40, 0x00, 0x78, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, + 0x20, 0x11, 0xb6, 0x35, 0x22, 0x14, 0xd2, 0xac, 0x11, 0x18, 0xa0, 0x92, + 0x00, 0x7e, 0x02, 0x88, 0x00, 0xd6, 0xa0, 0xe8, 0xb7, 0x35, 0x2d, 0x6c, + 0x68, 0x10, 0xa0, 0x85, 0x85, 0x00, 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, + 0x20, 0x69, 0xb6, 0x1c, 0x2d, 0xa6, 0x8d, 0x68, 0x2d, 0xa6, 0x00, 0xde, + 0x00, 0x88, 0x00, 0xd6, 0xa0, 0xe8, 0xb7, 0x35, 0x2d, 0x6c, 0x68, 0x10, + 0xa0, 0x85, 0x85, 0x00, 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, 0x00, 0xde, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0x11, 0xb6, 0x15, 0x22, 0x14, 0x22, 0xa2, + 0x20, 0x01, 0x00, 0x99, 0x20, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x08, 0x04, + 0x77, 0xa6, 0x00, 0xc6, 0x00, 0xf6, 0x2c, 0x78, 0x78, 0x04, 0xa0, 0x8a, + 0x00, 0x40, 0x0a, 0x0c, 0x15, 0x1a, 0xa0, 0x8a, 0x00, 0x53, 0x1a, 0x0c, + 0x15, 0x1a, 0x79, 0x18, 0x21, 0x60, 0x61, 0xa0, 0x20, 0x11, 0xb6, 0x35, + 0x22, 0x14, 0xd2, 0xac, 0x11, 0x10, 0xd1, 0xbc, 0x01, 0x50, 0x61, 0x00, + 0xd1, 0xf4, 0x01, 0x20, 0x61, 0x14, 0xa1, 0x8c, 0x00, 0xff, 0x00, 0x40, + 0x20, 0x09, 0x00, 0x00, 0x00, 0x28, 0xa1, 0xe0, 0x2d, 0xf9, 0x2c, 0x0d, + 0xa1, 0x8c, 0x00, 0xff, 0x20, 0x61, 0x01, 0x00, 0x61, 0x9a, 0xa0, 0x82, + 0x00, 0x40, 0x00, 0x1b, 0x00, 0xfe, 0x00, 0xce, 0x00, 0x05, 0x79, 0x14, + 0x7a, 0x20, 0x79, 0xbd, 0x7b, 0xd2, 0x79, 0x12, 0x79, 0x12, 0x79, 0x12, + 0x79, 0x12, 0x79, 0x12, 0x79, 0x12, 0x79, 0x12, 0x81, 0x5e, 0x81, 0x6e, + 0x81, 0x7e, 0x81, 0x8e, 0x79, 0x12, 0x85, 0xa5, 0x79, 0x12, 0x81, 0x4d, + 0x08, 0x0c, 0x15, 0x1a, 0x00, 0xd6, 0x01, 0x56, 0x01, 0x46, 0x78, 0x0b, + 0xff, 0xff, 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, 0x79, 0x74, 0x79, 0x10, + 0x21, 0x68, 0x69, 0x48, 0x79, 0x52, 0x21, 0xa2, 0xa0, 0x16, 0x22, 0xa2, + 0x22, 0xa2, 0x22, 0xa2, 0x69, 0x4c, 0xa1, 0x84, 0x00, 0x0f, 0x11, 0x18, + 0x20, 0x01, 0x00, 0x05, 0x00, 0x40, 0xd1, 0x84, 0x01, 0x18, 0x20, 0x01, + 0x00, 0x04, 0x00, 0x18, 0xa0, 0x84, 0x00, 0x06, 0x80, 0x04, 0x00, 0x16, + 0x20, 0x08, 0x78, 0x58, 0xa0, 0x84, 0x00, 0xff, 0x80, 0x07, 0xa1, 0x05, + 0x00, 0x1e, 0x20, 0xa2, 0xd1, 0xac, 0x01, 0x18, 0x20, 0xa3, 0x00, 0x02, + 0x00, 0x48, 0xd1, 0xb4, 0x01, 0x18, 0x20, 0xa3, 0x00, 0x01, 0x00, 0x20, + 0x20, 0xa3, 0x00, 0x00, 0x22, 0x30, 0x00, 0x10, 0x6a, 0x80, 0x6e, 0x7c, + 0x20, 0xa9, 0x00, 0x08, 0x01, 0x36, 0xad, 0x88, 0x00, 0x17, 0x21, 0x98, + 0x20, 0xa1, 0x02, 0x1b, 0x53, 0xa6, 0x01, 0x3e, 0x20, 0xa1, 0x02, 0x0b, + 0x22, 0xa2, 0x26, 0xa2, 0x60, 0xc3, 0x00, 0x20, 0x20, 0xe1, 0x90, 0x80, + 0x60, 0x14, 0xa0, 0x84, 0x00, 0x04, 0xa0, 0x85, 0x00, 0x09, 0x60, 0x16, + 0x20, 0x01, 0xb8, 0xfd, 0x20, 0x03, 0x07, 0xd0, 0x20, 0x01, 0xb8, 0xfc, + 0x20, 0x03, 0x00, 0x09, 0x08, 0x0c, 0x17, 0xe7, 0x01, 0x4e, 0x01, 0x5e, + 0x00, 0xde, 0x00, 0x05, 0x20, 0xe1, 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, + 0x7a, 0x18, 0xa2, 0x80, 0x00, 0x23, 0x20, 0x14, 0x82, 0x10, 0xa2, 0x94, + 0x00, 0xff, 0x22, 0x02, 0x82, 0x17, 0x78, 0x18, 0xa0, 0x80, 0x00, 0x28, + 0x20, 0x04, 0x20, 0x19, 0xb6, 0x35, 0x23, 0x1c, 0xd3, 0xac, 0x11, 0x10, + 0xd0, 0xbc, 0x01, 0x88, 0x00, 0xd6, 0xa0, 0xe8, 0xb7, 0x35, 0x2d, 0x6c, + 0x68, 0x10, 0xa0, 0x85, 0x06, 0x00, 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, + 0x20, 0x69, 0xb6, 0x1c, 0x2d, 0xa6, 0x8d, 0x68, 0x2d, 0xa6, 0x00, 0xde, + 0x00, 0x88, 0x00, 0xd6, 0xa0, 0xe8, 0xb7, 0x35, 0x2d, 0x6c, 0x68, 0x10, + 0xa0, 0x85, 0x06, 0x00, 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, 0x00, 0xde, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0x09, 0xb6, 0x15, 0x21, 0x0c, 0x21, 0xa2, + 0x20, 0xa3, 0x08, 0x29, 0x20, 0xa3, 0x00, 0x00, 0x22, 0xa2, 0x20, 0xa3, + 0x00, 0x00, 0x2f, 0xa2, 0x20, 0xa3, 0xff, 0xff, 0x20, 0xa3, 0x00, 0x00, + 0x20, 0xa3, 0x00, 0x00, 0x00, 0x05, 0x00, 0xd6, 0x01, 0x56, 0x01, 0x36, + 0x01, 0x46, 0x20, 0xa1, 0x02, 0x0b, 0x00, 0xc1, 0x78, 0x10, 0x20, 0x68, + 0x68, 0x60, 0x20, 0xa2, 0x68, 0x5c, 0x20, 0xa2, 0x68, 0x80, 0x20, 0xa2, + 0x68, 0x7c, 0x20, 0xa2, 0xa0, 0x06, 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa2, + 0x20, 0xa2, 0x60, 0xc3, 0x00, 0x0c, 0x08, 0x0c, 0x7d, 0xe0, 0x01, 0x4e, + 0x01, 0x3e, 0x01, 0x5e, 0x00, 0xde, 0x00, 0x05, 0x00, 0x26, 0x20, 0xe1, + 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, 0x78, 0x18, 0xa0, 0x80, 0x00, 0x28, + 0x20, 0x04, 0x20, 0x11, 0xb6, 0x35, 0x22, 0x14, 0xd2, 0xac, 0x11, 0x10, + 0xd0, 0xbc, 0x01, 0x88, 0x00, 0xd6, 0xa0, 0xe8, 0xb7, 0x35, 0x2d, 0x6c, + 0x68, 0x10, 0xa0, 0x85, 0x05, 0x00, 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, + 0x20, 0x69, 0xb6, 0x1c, 0x2d, 0xa6, 0x8d, 0x68, 0x2d, 0xa6, 0x00, 0xde, + 0x00, 0x88, 0x00, 0xd6, 0xa0, 0xe8, 0xb7, 0x35, 0x2d, 0x6c, 0x68, 0x10, + 0xa0, 0x85, 0x05, 0x00, 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, 0x00, 0xde, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0x11, 0xb6, 0x15, 0x22, 0x14, 0x22, 0xa2, + 0x20, 0xa3, 0x08, 0x89, 0x20, 0xa3, 0x00, 0x00, 0x08, 0x0c, 0x7d, 0xcf, + 0x22, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x7a, 0x08, 0x22, 0xa2, 0x2f, 0xa2, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x05, + 0x00, 0xd6, 0x01, 0x56, 0x01, 0x36, 0x01, 0x46, 0x78, 0x10, 0xa0, 0xec, + 0xf0, 0x00, 0x01, 0x68, 0xa0, 0x6d, 0x08, 0x0c, 0x53, 0x73, 0x01, 0x48, + 0x68, 0x4c, 0xa0, 0x84, 0x20, 0x20, 0xa0, 0x86, 0x20, 0x20, 0x11, 0x18, + 0x78, 0x20, 0xc0, 0xcd, 0x78, 0x22, 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, + 0x7b, 0x88, 0xa0, 0x16, 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, + 0x22, 0xa2, 0x78, 0x10, 0xa0, 0x84, 0xf0, 0x00, 0x11, 0x30, 0x78, 0x10, + 0xa0, 0x84, 0x07, 0x00, 0x80, 0x07, 0x00, 0x43, 0x00, 0x10, 0xa0, 0x06, + 0x00, 0x2b, 0x01, 0x4e, 0x01, 0x3e, 0x01, 0x5e, 0x00, 0xde, 0x00, 0x05, + 0x7a, 0x5a, 0x7a, 0xef, 0x7a, 0xff, 0x7b, 0x31, 0x7b, 0x44, 0x7b, 0x5f, + 0x7b, 0x68, 0x7a, 0x58, 0x08, 0x0c, 0x15, 0x1a, 0x00, 0x16, 0x00, 0x36, + 0x69, 0x4c, 0xa1, 0x8c, 0x00, 0x03, 0x01, 0x18, 0xa1, 0x86, 0x00, 0x03, + 0x11, 0x70, 0x6b, 0x78, 0x78, 0x20, 0xd0, 0xcc, 0x01, 0x08, 0xc3, 0xe5, + 0x23, 0xa2, 0x68, 0x68, 0x20, 0xa2, 0x68, 0x64, 0x20, 0xa2, 0x00, 0x3e, + 0x00, 0x1e, 0x08, 0x04, 0x7b, 0x3b, 0xa1, 0x86, 0x00, 0x01, 0x19, 0x0c, + 0x15, 0x1a, 0x6b, 0x78, 0x78, 0x20, 0xd0, 0xcc, 0x01, 0x08, 0xc3, 0xe5, + 0x23, 0xa2, 0x68, 0x68, 0x20, 0xa2, 0x68, 0x64, 0x20, 0xa2, 0x22, 0xa2, + 0x68, 0x74, 0x20, 0xa2, 0x22, 0xa2, 0x68, 0x7c, 0x20, 0xa2, 0x20, 0x09, + 0x00, 0x18, 0xa3, 0x84, 0x03, 0x00, 0x09, 0x04, 0x7a, 0xe9, 0xd3, 0xc4, + 0x01, 0x10, 0x68, 0x7c, 0xa1, 0x08, 0xd3, 0xcc, 0x01, 0x10, 0x68, 0x74, + 0xa1, 0x08, 0x01, 0x56, 0x20, 0xa9, 0x00, 0x0d, 0xad, 0x80, 0x00, 0x20, + 0x20, 0x1c, 0x83, 0x1f, 0x23, 0xa2, 0x80, 0x00, 0x1f, 0x04, 0x7a, 0x98, + 0x01, 0x5e, 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, 0xa1, 0x84, 0x00, 0x03, + 0x09, 0x04, 0x7a, 0xe9, 0x20, 0xa1, 0x02, 0x0b, 0x20, 0xe1, 0x90, 0x80, + 0x20, 0xe1, 0x40, 0x00, 0x00, 0x06, 0x78, 0x18, 0xa0, 0x80, 0x00, 0x28, + 0x20, 0x04, 0x20, 0x11, 0xb6, 0x35, 0x22, 0x14, 0xd2, 0xac, 0x11, 0x10, + 0xd0, 0xbc, 0x01, 0x88, 0x00, 0xd6, 0xa0, 0xe8, 0xb7, 0x35, 0x2d, 0x6c, + 0x68, 0x10, 0xa0, 0x85, 0x07, 0x00, 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, + 0x20, 0x69, 0xb6, 0x1c, 0x2d, 0xa6, 0x8d, 0x68, 0x2d, 0xa6, 0x00, 0xde, + 0x00, 0x88, 0x00, 0xd6, 0xa0, 0xe8, 0xb7, 0x35, 0x2d, 0x6c, 0x68, 0x10, + 0xa0, 0x85, 0x07, 0x00, 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, 0x00, 0xde, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0x11, 0xb6, 0x15, 0x22, 0x14, 0x22, 0xa2, + 0x00, 0x0e, 0x7b, 0x20, 0xd3, 0xcc, 0x01, 0x18, 0x20, 0xa3, 0x08, 0x89, + 0x00, 0x10, 0x20, 0xa3, 0x08, 0x98, 0x20, 0xa2, 0x08, 0x0c, 0x7d, 0xcf, + 0x22, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x61, 0xc2, 0x00, 0x3e, 0x00, 0x1e, + 0x08, 0x0c, 0x7d, 0xe0, 0x00, 0x05, 0x20, 0x11, 0x00, 0x08, 0x20, 0x01, + 0xb6, 0x0d, 0x20, 0x04, 0xd0, 0xf4, 0x01, 0x10, 0x20, 0x11, 0x00, 0x28, + 0x78, 0x20, 0xd0, 0xcc, 0x01, 0x08, 0xc2, 0xe5, 0x22, 0xa2, 0xa0, 0x16, + 0x04, 0xd0, 0x20, 0x11, 0x03, 0x02, 0x00, 0x16, 0x00, 0x36, 0x78, 0x28, + 0x79, 0x2c, 0xa1, 0x1d, 0x01, 0x08, 0xc2, 0xdd, 0x7b, 0x20, 0xd3, 0xcc, + 0x01, 0x08, 0xc2, 0xe5, 0x22, 0xa2, 0x20, 0xa2, 0x21, 0xa2, 0x00, 0x3e, + 0x00, 0x1e, 0xa0, 0x16, 0x22, 0xa2, 0x20, 0xa3, 0x00, 0x12, 0x22, 0xa2, + 0x20, 0xa3, 0x00, 0x08, 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, + 0x20, 0xa3, 0x70, 0x00, 0x20, 0xa3, 0x05, 0x00, 0x22, 0xa2, 0x20, 0xa3, + 0x00, 0x0a, 0x22, 0xa2, 0x22, 0xa2, 0x20, 0xa3, 0x25, 0x00, 0x22, 0xa2, + 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, 0x60, 0xc3, 0x00, 0x32, + 0x08, 0x0c, 0x7d, 0xe0, 0x00, 0x05, 0x20, 0x11, 0x00, 0x28, 0x78, 0x20, + 0xd0, 0xcc, 0x01, 0x08, 0xc2, 0xe5, 0x22, 0xa2, 0xa0, 0x16, 0x22, 0xa2, + 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, 0x60, 0xc3, + 0x00, 0x18, 0x08, 0x0c, 0x7d, 0xe0, 0x00, 0x05, 0x20, 0x11, 0x01, 0x00, + 0x78, 0x20, 0xd0, 0xcc, 0x01, 0x08, 0xc2, 0xe5, 0x22, 0xa2, 0xa0, 0x16, + 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, 0x20, 0xa3, + 0x00, 0x08, 0x22, 0xa2, 0x78, 0x54, 0xa0, 0x84, 0x00, 0xff, 0x20, 0xa2, + 0x22, 0xa2, 0x22, 0xa2, 0x60, 0xc3, 0x00, 0x20, 0x08, 0x0c, 0x7d, 0xe0, + 0x00, 0x05, 0x20, 0x11, 0x00, 0x08, 0x78, 0x20, 0xd0, 0xcc, 0x01, 0x08, + 0xc2, 0xe5, 0x22, 0xa2, 0xa0, 0x16, 0x08, 0x88, 0x00, 0x36, 0x7b, 0x10, + 0xa3, 0x84, 0xff, 0x00, 0x78, 0x12, 0xa3, 0x84, 0x00, 0xff, 0x80, 0x01, + 0x11, 0x38, 0x78, 0x20, 0xd0, 0xcc, 0x01, 0x08, 0xc2, 0xe5, 0x22, 0xa2, + 0x00, 0x3e, 0x08, 0x08, 0x00, 0x46, 0x20, 0x21, 0x08, 0x00, 0x00, 0x06, + 0x78, 0x20, 0xd0, 0xcc, 0x00, 0x0e, 0x01, 0x08, 0xc4, 0xe5, 0x24, 0xa2, + 0x00, 0x4e, 0x22, 0xa2, 0x20, 0xa2, 0x00, 0x3e, 0x08, 0x04, 0x7b, 0x3b, + 0x00, 0x26, 0x20, 0xe1, 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, 0x78, 0x18, + 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, 0x20, 0x11, 0xb6, 0x35, 0x22, 0x14, + 0xd2, 0xac, 0x11, 0x10, 0xd0, 0xbc, 0x01, 0x88, 0x00, 0xd6, 0xa0, 0xe8, + 0xb7, 0x35, 0x2d, 0x6c, 0x68, 0x10, 0xa0, 0x85, 0x07, 0x00, 0x20, 0xa2, + 0x68, 0x14, 0x20, 0xa2, 0x20, 0x69, 0xb6, 0x1c, 0x2d, 0xa6, 0x8d, 0x68, + 0x2d, 0xa6, 0x00, 0xde, 0x00, 0x88, 0x00, 0xd6, 0xa0, 0xe8, 0xb7, 0x35, + 0x2d, 0x6c, 0x68, 0x10, 0xa0, 0x85, 0x07, 0x00, 0x20, 0xa2, 0x68, 0x14, + 0x20, 0xa2, 0x00, 0xde, 0x20, 0xa3, 0x00, 0x00, 0x20, 0x11, 0xb6, 0x15, + 0x22, 0x14, 0x22, 0xa2, 0x78, 0x20, 0xd0, 0xcc, 0x01, 0x18, 0x20, 0xa3, + 0x08, 0x89, 0x00, 0x10, 0x20, 0xa3, 0x08, 0x98, 0x20, 0xa3, 0x00, 0x00, + 0x08, 0x0c, 0x7d, 0xcf, 0x22, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x7a, 0x08, + 0x22, 0xa2, 0x2f, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x00, 0x2e, 0x00, 0x05, 0x00, 0xd6, 0x01, 0x56, 0x01, 0x36, 0x01, 0x46, + 0x00, 0x16, 0x00, 0x36, 0x78, 0x10, 0xa0, 0x84, 0x07, 0x00, 0x80, 0x07, + 0x00, 0x3b, 0x00, 0x3e, 0x00, 0x1e, 0x01, 0x4e, 0x01, 0x3e, 0x01, 0x5e, + 0x00, 0xde, 0x00, 0x05, 0x7b, 0xec, 0x7b, 0xec, 0x7b, 0xee, 0x7b, 0xec, + 0x7b, 0xec, 0x7b, 0xec, 0x7c, 0x10, 0x7b, 0xec, 0x08, 0x0c, 0x15, 0x1a, + 0x79, 0x10, 0xa1, 0x8c, 0xf8, 0xff, 0xa1, 0x8d, 0x06, 0x00, 0x79, 0x12, + 0x20, 0xa1, 0x02, 0x0b, 0x20, 0x09, 0x00, 0x03, 0x00, 0xf9, 0x00, 0xd6, + 0x20, 0x69, 0xb6, 0x52, 0x68, 0x04, 0xd0, 0xbc, 0x01, 0x30, 0x68, 0x2c, + 0xa0, 0x84, 0x00, 0xff, 0x80, 0x07, 0x20, 0xa2, 0x00, 0x10, 0x20, 0xa3, + 0x3f, 0x00, 0x00, 0xde, 0x22, 0xa2, 0x22, 0xa2, 0x22, 0xa2, 0x60, 0xc3, + 0x00, 0x01, 0x08, 0x0c, 0x7d, 0xe0, 0x00, 0x05, 0x20, 0xa1, 0x02, 0x0b, + 0x20, 0x09, 0x00, 0x03, 0x00, 0x19, 0x20, 0xa3, 0x7f, 0x00, 0x0c, 0x80, + 0x00, 0x26, 0x20, 0xe1, 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, 0x78, 0x18, + 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, 0x20, 0x11, 0xb6, 0x35, 0x22, 0x14, + 0xd2, 0xac, 0x11, 0x10, 0xd0, 0xbc, 0x01, 0x88, 0x00, 0xd6, 0xa0, 0xe8, + 0xb7, 0x35, 0x2d, 0x6c, 0x68, 0x10, 0xa0, 0x85, 0x01, 0x00, 0x20, 0xa2, + 0x68, 0x14, 0x20, 0xa2, 0x20, 0x69, 0xb6, 0x1c, 0x2d, 0xa6, 0x8d, 0x68, + 0x2d, 0xa6, 0x00, 0xde, 0x00, 0x88, 0x00, 0xd6, 0xa0, 0xe8, 0xb7, 0x35, + 0x2d, 0x6c, 0x68, 0x10, 0xa0, 0x85, 0x01, 0x00, 0x20, 0xa2, 0x68, 0x14, + 0x20, 0xa2, 0x00, 0xde, 0x20, 0xa3, 0x00, 0x00, 0x20, 0x11, 0xb6, 0x15, + 0x22, 0x14, 0x22, 0xa2, 0x20, 0xa3, 0x08, 0x88, 0xa1, 0x8d, 0x00, 0x08, + 0x21, 0xa2, 0x08, 0x0c, 0x7d, 0xcf, 0x22, 0xa2, 0x20, 0xa3, 0x00, 0x00, + 0x7a, 0x08, 0x22, 0xa2, 0x2f, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x00, 0x2e, 0x00, 0x05, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, + 0x00, 0x56, 0x00, 0x46, 0x00, 0x36, 0x20, 0x61, 0x01, 0x00, 0x20, 0x71, + 0xb6, 0x00, 0x71, 0x54, 0x78, 0x18, 0x20, 0x68, 0x68, 0xa0, 0x20, 0x28, + 0x76, 0xd4, 0xd6, 0xac, 0x11, 0x30, 0xd0, 0xbc, 0x11, 0x20, 0x69, 0x10, + 0x6a, 0x14, 0x74, 0x54, 0x00, 0x20, 0x69, 0x10, 0x6a, 0x14, 0x73, 0x70, + 0x74, 0x74, 0x78, 0x1c, 0xa0, 0xbe, 0x00, 0x06, 0x09, 0x04, 0x7d, 0x1a, + 0xa0, 0xbe, 0x00, 0x0a, 0x15, 0xe8, 0xa1, 0x85, 0x02, 0x00, 0x60, 0x62, + 0x62, 0x66, 0x63, 0x6a, 0x64, 0x6e, 0x60, 0x73, 0x20, 0x29, 0x60, 0x77, + 0x00, 0x00, 0x68, 0x8c, 0x80, 0x00, 0xa0, 0x84, 0x00, 0xff, 0x68, 0x8e, + 0x80, 0x07, 0x60, 0x7a, 0x60, 0x7f, 0x00, 0x00, 0x2f, 0x00, 0x60, 0x82, + 0x78, 0x08, 0x60, 0x86, 0x78, 0x10, 0x20, 0x70, 0x70, 0x14, 0x60, 0x8a, + 0x70, 0x10, 0x60, 0x8e, 0x70, 0x0c, 0x60, 0xc6, 0x70, 0x08, 0x60, 0xca, + 0x68, 0x6c, 0x60, 0xce, 0x60, 0xaf, 0x95, 0xd5, 0x60, 0xd7, 0x00, 0x00, + 0x60, 0x9f, 0x00, 0x00, 0x08, 0x0c, 0x86, 0x40, 0x20, 0x09, 0x07, 0xd0, + 0x60, 0xc4, 0xa0, 0x84, 0xff, 0xf0, 0xa0, 0x05, 0x01, 0x10, 0x20, 0x09, + 0x1b, 0x58, 0x08, 0x0c, 0x6a, 0x87, 0x00, 0x3e, 0x00, 0x4e, 0x00, 0x5e, + 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, 0x00, 0x05, 0x70, 0xd4, 0xd0, 0xac, + 0x11, 0x10, 0xd5, 0xbc, 0x01, 0x38, 0xa1, 0x85, 0x01, 0x00, 0x60, 0x62, + 0x62, 0x66, 0x63, 0x6a, 0x64, 0x6e, 0x00, 0x38, 0xa1, 0x85, 0x01, 0x00, + 0x60, 0x62, 0x62, 0x66, 0x60, 0x6b, 0x00, 0x00, 0x64, 0x6e, 0x60, 0x73, + 0x08, 0x09, 0x60, 0x77, 0x00, 0x08, 0x68, 0x8c, 0x80, 0x00, 0xa0, 0x84, + 0x00, 0xff, 0x68, 0x8e, 0x80, 0x07, 0x60, 0x7a, 0x60, 0x7f, 0x00, 0x00, + 0x2f, 0x00, 0x60, 0x82, 0x78, 0x08, 0x60, 0x86, 0x78, 0x10, 0x20, 0x70, + 0x70, 0x14, 0x60, 0x8a, 0x70, 0x10, 0x60, 0x8e, 0x70, 0x0c, 0x60, 0xc6, + 0x70, 0x08, 0x60, 0xca, 0x79, 0x2c, 0xa1, 0x08, 0x79, 0x2e, 0x70, 0x0c, + 0x79, 0x28, 0xa1, 0x09, 0x79, 0x2a, 0x68, 0x6c, 0x60, 0xce, 0x60, 0xaf, + 0x95, 0xd5, 0x60, 0xd7, 0x00, 0x00, 0xa5, 0x82, 0x00, 0x80, 0x02, 0x48, + 0x6a, 0x00, 0xd2, 0xf4, 0x01, 0x20, 0x6a, 0x14, 0xa2, 0x94, 0x00, 0xff, + 0x00, 0x10, 0x20, 0x11, 0x00, 0x00, 0x62, 0x9e, 0x08, 0x0c, 0x86, 0x40, + 0x20, 0x09, 0x07, 0xd0, 0x60, 0xc4, 0xa0, 0x84, 0xff, 0xf0, 0xa0, 0x05, + 0x01, 0x10, 0x20, 0x09, 0x1b, 0x58, 0x08, 0x0c, 0x6a, 0x87, 0x00, 0x3e, + 0x00, 0x4e, 0x00, 0x5e, 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, 0x00, 0x05, + 0x78, 0x10, 0x20, 0x70, 0x70, 0x4c, 0xa0, 0x84, 0x00, 0x03, 0xa0, 0x86, + 0x00, 0x02, 0x09, 0x04, 0x7d, 0x70, 0x20, 0x01, 0xb6, 0x35, 0x20, 0x04, + 0xd0, 0xac, 0x11, 0x10, 0xd5, 0xbc, 0x01, 0x38, 0xa1, 0x85, 0x01, 0x00, + 0x60, 0x62, 0x62, 0x66, 0x63, 0x6a, 0x64, 0x6e, 0x00, 0x38, 0xa1, 0x85, + 0x01, 0x00, 0x60, 0x62, 0x62, 0x66, 0x60, 0x6b, 0x00, 0x00, 0x64, 0x6e, + 0x60, 0x73, 0x08, 0x80, 0x60, 0x77, 0x00, 0x08, 0x68, 0x8c, 0x80, 0x00, + 0xa0, 0x84, 0x00, 0xff, 0x68, 0x8e, 0x80, 0x07, 0x60, 0x7a, 0x78, 0x34, + 0x60, 0x7e, 0x2f, 0x00, 0x60, 0x86, 0x78, 0x08, 0x60, 0x82, 0x70, 0x60, + 0x60, 0x8a, 0x70, 0x5c, 0x60, 0x8e, 0x70, 0x80, 0x60, 0xc6, 0x70, 0x7c, + 0x60, 0xca, 0x70, 0x7c, 0x79, 0x2c, 0xa1, 0x08, 0x79, 0x2e, 0x70, 0x80, + 0x79, 0x28, 0xa1, 0x09, 0x79, 0x2a, 0x68, 0x6c, 0x60, 0xce, 0x60, 0xaf, + 0x95, 0xd5, 0x60, 0xd7, 0x00, 0x00, 0xa5, 0x82, 0x00, 0x80, 0x02, 0x48, + 0x6a, 0x00, 0xd2, 0xf4, 0x01, 0x20, 0x6a, 0x14, 0xa2, 0x94, 0x00, 0xff, + 0x00, 0x10, 0x20, 0x11, 0x00, 0x00, 0x62, 0x9e, 0x08, 0x0c, 0x86, 0x3d, + 0x08, 0x04, 0x7d, 0x08, 0x20, 0x01, 0xb6, 0x35, 0x20, 0x04, 0xd0, 0xac, + 0x11, 0x10, 0xd5, 0xbc, 0x01, 0x38, 0xa1, 0x85, 0x07, 0x00, 0x60, 0x62, + 0x62, 0x66, 0x63, 0x6a, 0x64, 0x6e, 0x00, 0x38, 0xa1, 0x85, 0x07, 0x00, + 0x60, 0x62, 0x62, 0x66, 0x60, 0x6b, 0x00, 0x00, 0x64, 0x6e, 0x08, 0x0c, + 0x53, 0x73, 0x01, 0x80, 0x00, 0xd6, 0x78, 0x10, 0xa0, 0x6d, 0x68, 0x4c, + 0x00, 0xde, 0xa0, 0x84, 0x20, 0x20, 0xa0, 0x86, 0x20, 0x20, 0x11, 0x30, + 0x78, 0x20, 0xc0, 0xcd, 0x78, 0x22, 0x60, 0x73, 0x08, 0x89, 0x00, 0x10, + 0x60, 0x73, 0x08, 0x98, 0x60, 0x77, 0x00, 0x00, 0x68, 0x8c, 0x80, 0x00, + 0xa0, 0x84, 0x00, 0xff, 0x68, 0x8e, 0x80, 0x07, 0x60, 0x7a, 0x60, 0x7f, + 0x00, 0x00, 0x2f, 0x00, 0x60, 0x86, 0x78, 0x08, 0x60, 0x82, 0x70, 0x14, + 0x60, 0x8a, 0x70, 0x10, 0x60, 0x8e, 0x70, 0x0c, 0x60, 0xc6, 0x70, 0x08, + 0x60, 0xca, 0x68, 0x6c, 0x60, 0xce, 0x60, 0xaf, 0x95, 0xd5, 0x60, 0xd7, + 0x00, 0x00, 0xa5, 0x82, 0x00, 0x80, 0x02, 0x48, 0x6a, 0x00, 0xd2, 0xf4, + 0x01, 0x20, 0x6a, 0x14, 0xa2, 0x94, 0x00, 0xff, 0x00, 0x10, 0x20, 0x11, + 0x00, 0x00, 0x62, 0x9e, 0x78, 0x20, 0xd0, 0xcc, 0x01, 0x20, 0x08, 0x0c, + 0x86, 0x40, 0x08, 0x04, 0x7d, 0x08, 0x08, 0x0c, 0x86, 0x3d, 0x08, 0x04, + 0x7d, 0x08, 0x7a, 0x18, 0xa2, 0x80, 0x00, 0x23, 0x20, 0x14, 0x82, 0x10, + 0xa2, 0x94, 0x00, 0xff, 0x22, 0x02, 0x82, 0x17, 0x00, 0x05, 0x00, 0xd6, + 0x20, 0x69, 0xb8, 0xe1, 0x68, 0x43, 0x00, 0x01, 0x00, 0xde, 0x00, 0x05, + 0x20, 0xe1, 0x90, 0x80, 0x60, 0xa3, 0x00, 0x56, 0x60, 0xa7, 0x95, 0x75, + 0x00, 0x19, 0x08, 0x0c, 0x6a, 0x79, 0x00, 0x05, 0x00, 0x06, 0x60, 0x14, + 0xa0, 0x84, 0x00, 0x04, 0xa0, 0x85, 0x00, 0x09, 0x60, 0x16, 0x00, 0x0e, + 0x00, 0x05, 0x00, 0x16, 0x00, 0xc6, 0x00, 0x06, 0x20, 0x61, 0x01, 0x00, + 0x61, 0xa4, 0x60, 0xa7, 0x95, 0xf5, 0x60, 0x14, 0xa0, 0x84, 0x00, 0x04, + 0xa0, 0x85, 0x00, 0x08, 0x60, 0x16, 0x00, 0x0e, 0xe0, 0x00, 0xe0, 0x00, + 0xe0, 0x00, 0xe0, 0x00, 0x61, 0xa6, 0x00, 0xce, 0x00, 0x1e, 0x00, 0x05, + 0x00, 0xc6, 0x00, 0xd6, 0x00, 0x16, 0x00, 0x26, 0x20, 0x61, 0x01, 0x00, + 0x20, 0x69, 0x01, 0x40, 0x08, 0x0c, 0x5b, 0x41, 0x11, 0x98, 0x20, 0x01, + 0xb8, 0xfd, 0x20, 0x04, 0xa0, 0x05, 0x15, 0xb8, 0x00, 0x66, 0x20, 0x31, + 0x00, 0x01, 0x08, 0x0c, 0x5b, 0xc3, 0x00, 0x6e, 0x11, 0x18, 0x08, 0x0c, + 0x6a, 0x79, 0x04, 0x68, 0x00, 0xc6, 0x20, 0x61, 0xb8, 0xe1, 0x00, 0xd8, + 0x69, 0x04, 0xa1, 0x94, 0x40, 0x00, 0x05, 0x50, 0x08, 0x31, 0x68, 0x03, + 0x10, 0x00, 0x68, 0x03, 0x00, 0x00, 0x00, 0xc6, 0x20, 0x61, 0xb8, 0xe1, + 0x61, 0x28, 0xa1, 0x92, 0x00, 0xc8, 0x12, 0x58, 0x81, 0x08, 0x61, 0x2a, + 0x61, 0x24, 0x00, 0xce, 0x81, 0xff, 0x01, 0x98, 0x08, 0x0c, 0x6a, 0x79, + 0x08, 0x0c, 0x7d, 0xea, 0x00, 0x70, 0x61, 0x24, 0xa1, 0xe5, 0x00, 0x00, + 0x01, 0x40, 0x08, 0x0c, 0xb5, 0x00, 0x08, 0x0c, 0x6a, 0x82, 0x20, 0x09, + 0x00, 0x14, 0x08, 0x0c, 0x86, 0xd3, 0x00, 0xce, 0x00, 0x00, 0x00, 0x2e, + 0x00, 0x1e, 0x00, 0xde, 0x00, 0xce, 0x00, 0x05, 0x20, 0x01, 0xb8, 0xfd, + 0x20, 0x04, 0xa0, 0x05, 0x1d, 0xb0, 0x00, 0xc6, 0x20, 0x61, 0xb8, 0xe1, + 0x61, 0x28, 0xa1, 0x92, 0x00, 0x03, 0x1e, 0x08, 0x81, 0x08, 0x61, 0x2a, + 0x00, 0xce, 0x08, 0x0c, 0x6a, 0x79, 0x08, 0x0c, 0x4b, 0x7b, 0x0c, 0x38, + 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x00, 0x16, 0x00, 0x26, 0x08, 0x0c, + 0x6a, 0x8f, 0x20, 0x71, 0xb8, 0xe1, 0x71, 0x3c, 0x81, 0xff, 0x05, 0x90, + 0x20, 0x61, 0x01, 0x00, 0x20, 0x69, 0x01, 0x40, 0x08, 0x0c, 0x5b, 0x41, + 0x11, 0xa8, 0x00, 0x36, 0x20, 0x19, 0x00, 0x02, 0x08, 0x0c, 0x80, 0x6b, + 0x00, 0x3e, 0x71, 0x3c, 0x21, 0x60, 0x08, 0x0c, 0xb5, 0x00, 0x20, 0x09, + 0x00, 0x4a, 0x08, 0x0c, 0x86, 0xd3, 0x00, 0x66, 0x20, 0x31, 0x00, 0x01, + 0x08, 0x0c, 0x5b, 0xc3, 0x00, 0x6e, 0x00, 0xb0, 0x69, 0x04, 0xa1, 0x94, + 0x40, 0x00, 0x01, 0xc0, 0x68, 0x03, 0x10, 0x00, 0x68, 0x03, 0x00, 0x00, + 0x00, 0x36, 0x20, 0x19, 0x00, 0x01, 0x08, 0x0c, 0x80, 0x6b, 0x00, 0x3e, + 0x71, 0x3c, 0x21, 0x60, 0x08, 0x0c, 0xb5, 0x00, 0x20, 0x09, 0x00, 0x4a, + 0x08, 0x0c, 0x86, 0xd3, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0xee, 0x00, 0xde, + 0x00, 0xce, 0x00, 0x05, 0x0c, 0x58, 0x00, 0x26, 0x00, 0xe6, 0x20, 0x71, + 0xb8, 0xe1, 0x70, 0x48, 0xd0, 0x84, 0x01, 0xc0, 0x71, 0x3c, 0x81, 0xff, + 0x01, 0xa8, 0x20, 0x71, 0x01, 0x00, 0xa1, 0x88, 0x00, 0x07, 0x21, 0x14, + 0xa2, 0x8e, 0x00, 0x06, 0x11, 0x38, 0x70, 0x14, 0xa0, 0x84, 0x01, 0x84, + 0xa0, 0x85, 0x00, 0x12, 0x70, 0x16, 0x00, 0x30, 0x70, 0x14, 0xa0, 0x84, + 0x01, 0x84, 0xa0, 0x85, 0x00, 0x16, 0x70, 0x16, 0x00, 0xee, 0x00, 0x2e, + 0x00, 0x05, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, 0x00, 0x66, 0x00, 0x56, + 0x00, 0x46, 0x00, 0x06, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x60, 0x18, + 0x20, 0x68, 0x6c, 0xa0, 0x20, 0x71, 0xb8, 0xe1, 0x70, 0x18, 0x20, 0x68, + 0x8d, 0xff, 0x01, 0x88, 0x68, 0xa0, 0xa4, 0x06, 0x01, 0x18, 0x68, 0x54, + 0x20, 0x68, 0x0c, 0xc0, 0x60, 0x10, 0x20, 0x60, 0x64, 0x3c, 0x65, 0x40, + 0x66, 0x48, 0x2d, 0x60, 0x08, 0x0c, 0x51, 0x8c, 0x01, 0x10, 0xa0, 0x85, + 0x00, 0x01, 0x01, 0x2e, 0x00, 0x0e, 0x00, 0x4e, 0x00, 0x5e, 0x00, 0x6e, + 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, 0x00, 0x05, 0x20, 0xa1, 0x02, 0x0b, + 0x08, 0x0c, 0x76, 0xb3, 0x20, 0xa3, 0x12, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x20, 0xa3, 0x00, 0x00, 0x78, 0x1c, 0xa0, 0x86, 0x00, 0x04, 0x11, 0x10, + 0x60, 0x98, 0x00, 0x18, 0x20, 0x01, 0xb6, 0x15, 0x20, 0x04, 0x20, 0xa2, + 0x78, 0x34, 0x20, 0xa2, 0x78, 0x38, 0x20, 0xa2, 0x20, 0xa9, 0x00, 0x10, + 0xa0, 0x06, 0x20, 0xa2, 0x1f, 0x04, 0x7f, 0x19, 0x20, 0xa2, 0x20, 0xa2, + 0x60, 0xc3, 0x00, 0x2c, 0x08, 0x0c, 0x7d, 0xe0, 0x00, 0x05, 0x01, 0x56, + 0x01, 0x46, 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, 0x76, 0xb3, 0x20, 0xa3, + 0x0f, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x78, 0x08, 0xd0, 0x9c, 0x11, 0x50, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa2, 0x60, 0xc3, 0x00, 0x08, 0x08, 0x0c, + 0x7d, 0xe0, 0x01, 0x4e, 0x01, 0x5e, 0x00, 0x05, 0x00, 0xd6, 0x78, 0x18, + 0xa0, 0x6d, 0x09, 0x0c, 0x15, 0x1a, 0x68, 0x10, 0xa0, 0x84, 0x00, 0xff, + 0x20, 0xa2, 0x68, 0x14, 0x00, 0xde, 0x0c, 0x60, 0x01, 0x56, 0x01, 0x46, + 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, 0x77, 0x4f, 0x20, 0xa3, 0x02, 0x00, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa9, 0x00, 0x06, 0x20, 0x11, 0xb6, 0x40, + 0x20, 0x19, 0xb6, 0x41, 0x23, 0xa6, 0x22, 0xa6, 0xa3, 0x98, 0x00, 0x02, + 0xa2, 0x90, 0x00, 0x02, 0x1f, 0x04, 0x7f, 0x56, 0x20, 0xa3, 0x00, 0x00, + 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, 0x00, 0x1c, 0x08, 0x0c, 0x7d, 0xe0, + 0x01, 0x4e, 0x01, 0x5e, 0x00, 0x05, 0x01, 0x56, 0x01, 0x46, 0x00, 0x16, + 0x00, 0x26, 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, 0x77, 0x28, 0x08, 0x0c, + 0x77, 0x3e, 0x78, 0x10, 0xa0, 0x80, 0x00, 0x00, 0x20, 0x04, 0xa0, 0x80, + 0x00, 0x15, 0x20, 0x98, 0x78, 0x08, 0xa0, 0x88, 0x00, 0x02, 0x21, 0xa8, + 0x53, 0xa6, 0xa0, 0x80, 0x00, 0x04, 0x80, 0x03, 0x60, 0xc2, 0x08, 0x0c, + 0x7d, 0xe0, 0x00, 0x2e, 0x00, 0x1e, 0x01, 0x4e, 0x01, 0x5e, 0x00, 0x05, + 0x01, 0x56, 0x01, 0x46, 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, 0x76, 0xb3, + 0x20, 0xa3, 0x62, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x78, 0x08, 0x20, 0xa2, 0x60, 0xc3, 0x00, 0x08, 0x08, 0x0c, 0x7d, 0xe0, + 0x01, 0x4e, 0x01, 0x5e, 0x00, 0x05, 0x01, 0x56, 0x01, 0x46, 0x00, 0x16, + 0x00, 0x26, 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, 0x76, 0xb3, 0x78, 0x10, + 0xa0, 0x80, 0x00, 0x00, 0x20, 0x04, 0xa0, 0x80, 0x00, 0x17, 0x20, 0x98, + 0x78, 0x08, 0xa0, 0x88, 0x00, 0x02, 0x21, 0xa8, 0x53, 0xa6, 0x80, 0x03, + 0x60, 0xc2, 0x08, 0x0c, 0x7d, 0xe0, 0x00, 0x2e, 0x00, 0x1e, 0x01, 0x4e, + 0x01, 0x5e, 0x00, 0x05, 0x00, 0xe6, 0x00, 0xc6, 0x00, 0x06, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0xb8, 0xe1, 0x70, 0x0c, 0x20, 0x60, + 0x8c, 0xff, 0x01, 0x78, 0x08, 0x0c, 0x9f, 0x14, 0x11, 0x10, 0x08, 0x0c, + 0x8c, 0xa5, 0x60, 0x0c, 0x00, 0x06, 0x08, 0x0c, 0xa0, 0xdb, 0x08, 0x0c, + 0x86, 0xa4, 0x08, 0x0c, 0x81, 0xa5, 0x00, 0xce, 0x0c, 0x78, 0x70, 0x0f, + 0x00, 0x00, 0x70, 0x0b, 0x00, 0x00, 0x01, 0x2e, 0x00, 0x0e, 0x00, 0xce, + 0x00, 0xee, 0x00, 0x05, 0x01, 0x26, 0x01, 0x56, 0x00, 0xf6, 0x00, 0xe6, + 0x00, 0xd6, 0x00, 0xc6, 0x00, 0x26, 0x00, 0x16, 0x00, 0x06, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x69, 0x01, 0x00, 0x20, 0x79, 0x01, 0x40, 0x20, 0x71, + 0xb8, 0xe1, 0x70, 0x24, 0x20, 0x60, 0x8c, 0xff, 0x05, 0xa0, 0x08, 0x0c, + 0x7d, 0xf3, 0x68, 0xc3, 0x00, 0x00, 0x08, 0x0c, 0x6a, 0x82, 0x20, 0x09, + 0x00, 0x13, 0x08, 0x0c, 0x86, 0xd3, 0x20, 0xa9, 0x01, 0xf4, 0x68, 0x24, + 0xd0, 0x94, 0x01, 0x58, 0x68, 0x27, 0x00, 0x04, 0x78, 0x04, 0xa0, 0x84, + 0x40, 0x00, 0x01, 0xa0, 0x78, 0x03, 0x10, 0x00, 0x78, 0x03, 0x00, 0x00, + 0x00, 0x78, 0xd0, 0x84, 0x01, 0x18, 0x68, 0x27, 0x00, 0x01, 0x00, 0x10, + 0x1f, 0x04, 0x80, 0x01, 0x78, 0x04, 0xa0, 0x84, 0x10, 0x00, 0x01, 0x20, + 0x78, 0x03, 0x01, 0x00, 0x78, 0x03, 0x00, 0x00, 0x68, 0x24, 0x00, 0x0e, + 0x00, 0x1e, 0x00, 0x2e, 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, 0x00, 0xfe, + 0x01, 0x5e, 0x01, 0x2e, 0x00, 0x05, 0x20, 0x01, 0xb6, 0x00, 0x20, 0x04, + 0xa0, 0x96, 0x00, 0x01, 0x05, 0x90, 0xa0, 0x96, 0x00, 0x04, 0x05, 0x78, + 0x08, 0x0c, 0x6a, 0x82, 0x68, 0x14, 0xa0, 0x84, 0x00, 0x01, 0x01, 0x10, + 0x68, 0xa7, 0x95, 0xf5, 0x68, 0x17, 0x00, 0x08, 0x68, 0xc3, 0x00, 0x00, + 0x20, 0x11, 0x4b, 0x23, 0x08, 0x0c, 0x6a, 0x0e, 0x20, 0xa9, 0x01, 0xf4, + 0x68, 0x24, 0xd0, 0x94, 0x01, 0x58, 0x68, 0x27, 0x00, 0x04, 0x78, 0x04, + 0xa0, 0x84, 0x40, 0x00, 0x01, 0xa0, 0x78, 0x03, 0x10, 0x00, 0x78, 0x03, + 0x00, 0x00, 0x00, 0x78, 0xd0, 0x84, 0x01, 0x18, 0x68, 0x27, 0x00, 0x01, + 0x00, 0x10, 0x1f, 0x04, 0x80, 0x44, 0x78, 0x04, 0xa0, 0x84, 0x10, 0x00, + 0x01, 0x20, 0x78, 0x03, 0x01, 0x00, 0x78, 0x03, 0x00, 0x00, 0x00, 0x0e, + 0x00, 0x1e, 0x00, 0x2e, 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, 0x00, 0xfe, + 0x01, 0x5e, 0x01, 0x2e, 0x00, 0x05, 0x01, 0x26, 0x01, 0x56, 0x00, 0xf6, + 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, 0x00, 0x26, 0x00, 0x16, 0x00, 0x06, + 0x20, 0x91, 0x80, 0x00, 0x20, 0x69, 0x01, 0x00, 0x20, 0x79, 0x01, 0x40, + 0x20, 0x71, 0xb8, 0xe1, 0x70, 0x3c, 0x20, 0x60, 0x8c, 0xff, 0x09, 0x04, + 0x80, 0xf2, 0xa3, 0x86, 0x00, 0x02, 0x11, 0x28, 0x68, 0x14, 0xa0, 0x84, + 0x00, 0x02, 0x09, 0x04, 0x80, 0xf2, 0x68, 0xaf, 0x95, 0xf5, 0x68, 0x17, + 0x00, 0x10, 0x20, 0x09, 0x00, 0xfa, 0x81, 0x09, 0x1d, 0xf0, 0x68, 0xc7, + 0x00, 0x00, 0x68, 0xcb, 0x00, 0x08, 0x08, 0x0c, 0x6a, 0x8f, 0x08, 0x0c, + 0x22, 0x2f, 0x00, 0x46, 0x20, 0x09, 0x01, 0x7f, 0x20, 0x0b, 0x00, 0xa5, + 0x20, 0x21, 0x01, 0x69, 0x24, 0x04, 0xa0, 0x84, 0x00, 0x0f, 0xa0, 0x86, + 0x00, 0x04, 0x15, 0x00, 0x68, 0xaf, 0x95, 0xf5, 0x68, 0xc7, 0x00, 0x00, + 0x68, 0xcb, 0x00, 0x08, 0x00, 0xe6, 0x00, 0xf6, 0x20, 0x79, 0x00, 0x20, + 0x20, 0x71, 0xb9, 0x4b, 0x68, 0x14, 0xa0, 0x84, 0x01, 0x84, 0xa0, 0x85, + 0x00, 0x12, 0x68, 0x16, 0x78, 0x03, 0x00, 0x08, 0x70, 0x03, 0x00, 0x00, + 0x00, 0xfe, 0x00, 0xee, 0xa3, 0x86, 0x00, 0x02, 0x11, 0x28, 0x78, 0x84, + 0xa0, 0x05, 0x11, 0x10, 0x78, 0x87, 0x00, 0x01, 0x20, 0x01, 0xb8, 0xb1, + 0x20, 0x04, 0x20, 0x0a, 0x00, 0x4e, 0xa3, 0x9d, 0x00, 0x00, 0x11, 0x20, + 0x20, 0x09, 0x00, 0x49, 0x08, 0x0c, 0x86, 0xd3, 0x20, 0xa9, 0x03, 0xe8, + 0x68, 0x24, 0xd0, 0x94, 0x01, 0x58, 0x68, 0x27, 0x00, 0x04, 0x78, 0x04, + 0xa0, 0x84, 0x40, 0x00, 0x01, 0xa0, 0x78, 0x03, 0x10, 0x00, 0x78, 0x03, + 0x00, 0x00, 0x00, 0x78, 0xd0, 0x8c, 0x01, 0x18, 0x68, 0x27, 0x00, 0x02, + 0x00, 0x10, 0x1f, 0x04, 0x80, 0xd4, 0x78, 0x04, 0xa0, 0x84, 0x10, 0x00, + 0x01, 0x20, 0x78, 0x03, 0x01, 0x00, 0x78, 0x03, 0x00, 0x00, 0x68, 0x24, + 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, + 0x00, 0xfe, 0x01, 0x5e, 0x01, 0x2e, 0x00, 0x05, 0x00, 0xd6, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x20, 0x69, 0xb8, 0xe1, 0x6a, 0x06, 0x01, 0x2e, + 0x00, 0xde, 0x00, 0x05, 0x00, 0xd6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x69, 0xb8, 0xe1, 0x6a, 0x32, 0x01, 0x2e, 0x00, 0xde, 0x00, 0x05, + 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xc6, 0x00, 0x66, 0x00, 0x06, 0x01, 0x26, + 0x20, 0x71, 0xb8, 0xe1, 0x76, 0x14, 0x26, 0x60, 0x26, 0x78, 0x20, 0x91, + 0x80, 0x00, 0x8c, 0xff, 0x05, 0x38, 0x60, 0x1c, 0xa2, 0x06, 0x15, 0x00, + 0x70, 0x14, 0xac, 0x36, 0x11, 0x10, 0x66, 0x0c, 0x76, 0x16, 0x70, 0x10, + 0xac, 0x36, 0x11, 0x40, 0x2c, 0x00, 0xaf, 0x36, 0x01, 0x18, 0x2f, 0x00, + 0x70, 0x12, 0x00, 0x10, 0x70, 0x13, 0x00, 0x00, 0x66, 0x0c, 0x00, 0x66, + 0x2c, 0x00, 0xaf, 0x06, 0x01, 0x10, 0x7e, 0x0e, 0x00, 0x08, 0x26, 0x78, + 0x60, 0x0f, 0x00, 0x00, 0x08, 0x0c, 0x9e, 0xd9, 0x08, 0x0c, 0x81, 0xa5, + 0x00, 0xce, 0x08, 0xd8, 0x2c, 0x78, 0x60, 0x0c, 0x20, 0x60, 0x08, 0xb8, + 0x01, 0x2e, 0x00, 0x0e, 0x00, 0x6e, 0x00, 0xce, 0x00, 0xee, 0x00, 0xfe, + 0x00, 0x05, 0x01, 0x56, 0x01, 0x46, 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, + 0x79, 0x74, 0x78, 0x10, 0x20, 0xa2, 0xa0, 0x06, 0x20, 0xa2, 0x20, 0xa2, + 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa3, 0x10, 0x00, 0x08, 0x04, 0x81, 0x9d, + 0x01, 0x56, 0x01, 0x46, 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, 0x79, 0x74, + 0x78, 0x10, 0x20, 0xa2, 0xa0, 0x06, 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa2, + 0x20, 0xa2, 0x20, 0xa3, 0x40, 0x00, 0x04, 0x78, 0x01, 0x56, 0x01, 0x46, + 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, 0x79, 0x74, 0x78, 0x10, 0x20, 0xa2, + 0xa0, 0x06, 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa3, + 0x20, 0x00, 0x00, 0xf8, 0x01, 0x56, 0x01, 0x46, 0x20, 0xa1, 0x02, 0x0b, + 0x08, 0x0c, 0x79, 0x74, 0x78, 0x10, 0x20, 0xa2, 0xa0, 0x06, 0x20, 0xa2, + 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa3, 0x04, 0x00, 0x00, 0x78, + 0x01, 0x56, 0x01, 0x46, 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, 0x79, 0x74, + 0x78, 0x10, 0x20, 0xa2, 0xa0, 0x06, 0x20, 0xa2, 0x20, 0xa2, 0x20, 0xa2, + 0x20, 0xa2, 0x20, 0xa3, 0x02, 0x00, 0x00, 0x89, 0x60, 0xc3, 0x00, 0x20, + 0x08, 0x0c, 0x7d, 0xe0, 0x01, 0x4e, 0x01, 0x5e, 0x00, 0x05, 0x00, 0xe6, + 0x20, 0x71, 0xb8, 0xe1, 0x70, 0x20, 0xa0, 0x05, 0x01, 0x10, 0x80, 0x01, + 0x70, 0x22, 0x00, 0xee, 0x00, 0x05, 0x20, 0xa9, 0x00, 0x08, 0x20, 0xa2, + 0x1f, 0x04, 0x81, 0xb1, 0x20, 0xa2, 0x20, 0xa2, 0x00, 0x05, 0x00, 0xf6, + 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, 0x00, 0x76, 0x00, 0x66, 0x00, 0x06, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0xb8, 0xe1, 0x76, 0x14, + 0x26, 0x60, 0x26, 0x78, 0x20, 0x39, 0x00, 0x01, 0x87, 0xff, 0x09, 0x04, + 0x82, 0x4d, 0x8c, 0xff, 0x09, 0x04, 0x82, 0x4d, 0x60, 0x1c, 0xa0, 0x86, + 0x00, 0x06, 0x19, 0x04, 0x82, 0x48, 0x88, 0xff, 0x01, 0x38, 0x28, 0x00, + 0xac, 0x06, 0x19, 0x04, 0x82, 0x48, 0x20, 0x39, 0x00, 0x00, 0x00, 0x50, + 0x60, 0x18, 0xa2, 0x06, 0x19, 0x04, 0x82, 0x48, 0x85, 0xff, 0x01, 0x20, + 0x60, 0x50, 0xa1, 0x06, 0x19, 0x04, 0x82, 0x48, 0x70, 0x24, 0xac, 0x06, + 0x15, 0x98, 0x20, 0x69, 0x01, 0x00, 0x68, 0xc0, 0xa0, 0x05, 0x11, 0x60, + 0x68, 0x24, 0xd0, 0x84, 0x01, 0x48, 0x68, 0x27, 0x00, 0x01, 0x08, 0x0c, + 0x6a, 0x82, 0x08, 0x0c, 0x82, 0xd4, 0x70, 0x27, 0x00, 0x00, 0x04, 0x10, + 0x08, 0x0c, 0x6a, 0x82, 0x68, 0x20, 0xd0, 0xb4, 0x01, 0x10, 0x68, 0xa7, + 0x95, 0xf5, 0x68, 0x17, 0x00, 0x08, 0x68, 0xc3, 0x00, 0x00, 0x08, 0x0c, + 0x82, 0xd4, 0x70, 0x27, 0x00, 0x00, 0x00, 0x36, 0x20, 0x69, 0x01, 0x40, + 0x6b, 0x04, 0xa3, 0x84, 0x10, 0x00, 0x01, 0x20, 0x68, 0x03, 0x01, 0x00, + 0x68, 0x03, 0x00, 0x00, 0x20, 0x69, 0x01, 0x00, 0x68, 0x24, 0xd0, 0x84, + 0x01, 0x10, 0x68, 0x27, 0x00, 0x01, 0x00, 0x3e, 0x70, 0x14, 0xac, 0x36, + 0x11, 0x10, 0x66, 0x0c, 0x76, 0x16, 0x70, 0x10, 0xac, 0x36, 0x11, 0x40, + 0x2c, 0x00, 0xaf, 0x36, 0x01, 0x18, 0x2f, 0x00, 0x70, 0x12, 0x00, 0x10, + 0x70, 0x13, 0x00, 0x00, 0x66, 0x0c, 0x00, 0x66, 0x2c, 0x00, 0xaf, 0x06, + 0x01, 0x10, 0x7e, 0x0e, 0x00, 0x08, 0x26, 0x78, 0x89, 0xff, 0x11, 0x58, + 0x60, 0x0f, 0x00, 0x00, 0x60, 0x10, 0x20, 0x68, 0x08, 0x0c, 0x9d, 0x16, + 0x01, 0x10, 0x08, 0x0c, 0xb1, 0x55, 0x08, 0x0c, 0x9e, 0xd9, 0x08, 0x0c, + 0x81, 0xa5, 0x88, 0xff, 0x11, 0x90, 0x00, 0xce, 0x08, 0x04, 0x81, 0xc8, + 0x2c, 0x78, 0x60, 0x0c, 0x20, 0x60, 0x08, 0x04, 0x81, 0xc8, 0xa0, 0x06, + 0x01, 0x2e, 0x00, 0x0e, 0x00, 0x6e, 0x00, 0x7e, 0x00, 0xce, 0x00, 0xde, + 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, 0x60, 0x17, 0x00, 0x00, 0x00, 0xce, + 0xa8, 0xc5, 0x00, 0x01, 0x0c, 0x88, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xd6, + 0x00, 0xc6, 0x00, 0x66, 0x00, 0x26, 0x00, 0x06, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x71, 0xb8, 0xe1, 0x76, 0x38, 0x26, 0x60, 0x26, 0x78, + 0x8c, 0xff, 0x09, 0x04, 0x82, 0xc4, 0x60, 0x1c, 0xa0, 0x86, 0x00, 0x06, + 0x19, 0x04, 0x82, 0xbf, 0x87, 0xff, 0x01, 0x28, 0x27, 0x00, 0xac, 0x06, + 0x19, 0x04, 0x82, 0xbf, 0x00, 0x48, 0x60, 0x18, 0xa2, 0x06, 0x19, 0x04, + 0x82, 0xbf, 0x85, 0xff, 0x01, 0x18, 0x60, 0x50, 0xa1, 0x06, 0x15, 0xd8, + 0x70, 0x3c, 0xac, 0x06, 0x11, 0x80, 0x00, 0x36, 0x20, 0x19, 0x00, 0x01, + 0x08, 0x0c, 0x80, 0x6b, 0x70, 0x33, 0x00, 0x00, 0x70, 0x3f, 0x00, 0x00, + 0x70, 0x43, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0x4b, 0x00, 0x00, + 0x00, 0x3e, 0x70, 0x38, 0xac, 0x36, 0x11, 0x10, 0x66, 0x0c, 0x76, 0x3a, + 0x70, 0x34, 0xac, 0x36, 0x11, 0x40, 0x2c, 0x00, 0xaf, 0x36, 0x01, 0x18, + 0x2f, 0x00, 0x70, 0x36, 0x00, 0x10, 0x70, 0x37, 0x00, 0x00, 0x66, 0x0c, + 0x00, 0x66, 0x2c, 0x00, 0xaf, 0x06, 0x01, 0x10, 0x7e, 0x0e, 0x00, 0x08, + 0x26, 0x78, 0x60, 0x0f, 0x00, 0x00, 0x60, 0x10, 0x20, 0x68, 0x08, 0x0c, + 0x9d, 0x16, 0x01, 0x10, 0x08, 0x0c, 0xb1, 0x55, 0x08, 0x0c, 0x9e, 0xd9, + 0x87, 0xff, 0x11, 0x90, 0x00, 0xce, 0x08, 0x04, 0x82, 0x6c, 0x2c, 0x78, + 0x60, 0x0c, 0x20, 0x60, 0x08, 0x04, 0x82, 0x6c, 0xa0, 0x06, 0x01, 0x2e, + 0x00, 0x0e, 0x00, 0x2e, 0x00, 0x6e, 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, + 0x00, 0xfe, 0x00, 0x05, 0x60, 0x17, 0x00, 0x00, 0x00, 0xce, 0xa7, 0xbd, + 0x00, 0x01, 0x0c, 0x88, 0x00, 0xe6, 0x20, 0x71, 0xb8, 0xe1, 0x20, 0x01, + 0xb6, 0x00, 0x20, 0x04, 0xa0, 0x86, 0x00, 0x02, 0x11, 0x18, 0x70, 0x07, + 0x00, 0x05, 0x00, 0x10, 0x70, 0x07, 0x00, 0x00, 0x00, 0xee, 0x00, 0x05, + 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xc6, 0x00, 0x66, 0x00, 0x26, 0x00, 0x06, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0xb8, 0xe1, 0x2c, 0x10, + 0x76, 0x38, 0x26, 0x60, 0x26, 0x78, 0x8c, 0xff, 0x05, 0x18, 0x22, 0x00, + 0xac, 0x06, 0x11, 0xe0, 0x70, 0x38, 0xac, 0x36, 0x11, 0x10, 0x66, 0x0c, + 0x76, 0x3a, 0x70, 0x34, 0xac, 0x36, 0x11, 0x40, 0x2c, 0x00, 0xaf, 0x36, + 0x01, 0x18, 0x2f, 0x00, 0x70, 0x36, 0x00, 0x10, 0x70, 0x37, 0x00, 0x00, + 0x66, 0x0c, 0x2c, 0x00, 0xaf, 0x06, 0x01, 0x10, 0x7e, 0x0e, 0x00, 0x08, + 0x26, 0x78, 0x60, 0x0f, 0x00, 0x00, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x20, + 0x2c, 0x78, 0x60, 0x0c, 0x20, 0x60, 0x08, 0xd8, 0x01, 0x2e, 0x00, 0x0e, + 0x00, 0x2e, 0x00, 0x6e, 0x00, 0xce, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, + 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, 0x00, 0x66, 0x00, 0x06, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0xb8, 0xe1, 0x76, 0x0c, + 0x26, 0x60, 0x26, 0x78, 0x8c, 0xff, 0x09, 0x04, 0x83, 0xaa, 0x60, 0x18, + 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, 0xa2, 0x06, 0x19, 0x04, 0x83, 0xa5, + 0x70, 0x24, 0xac, 0x06, 0x15, 0x08, 0x20, 0x69, 0x01, 0x00, 0x68, 0xc0, + 0xa0, 0x05, 0x09, 0x04, 0x83, 0x81, 0x08, 0x0c, 0x7d, 0xf3, 0x68, 0xc3, + 0x00, 0x00, 0x08, 0x0c, 0x82, 0xd4, 0x70, 0x27, 0x00, 0x00, 0x00, 0x36, + 0x20, 0x69, 0x01, 0x40, 0x6b, 0x04, 0xa3, 0x84, 0x10, 0x00, 0x01, 0x20, + 0x68, 0x03, 0x01, 0x00, 0x68, 0x03, 0x00, 0x00, 0x20, 0x69, 0x01, 0x00, + 0x68, 0x24, 0xd0, 0x84, 0x01, 0x10, 0x68, 0x27, 0x00, 0x01, 0x00, 0x3e, + 0x70, 0x0c, 0xac, 0x36, 0x11, 0x10, 0x66, 0x0c, 0x76, 0x0e, 0x70, 0x08, + 0xac, 0x36, 0x11, 0x40, 0x2c, 0x00, 0xaf, 0x36, 0x01, 0x18, 0x2f, 0x00, + 0x70, 0x0a, 0x00, 0x10, 0x70, 0x0b, 0x00, 0x00, 0x66, 0x0c, 0x00, 0x66, + 0x2c, 0x00, 0xaf, 0x06, 0x01, 0x10, 0x7e, 0x0e, 0x00, 0x08, 0x26, 0x78, + 0x60, 0x0f, 0x00, 0x00, 0x08, 0x0c, 0x9f, 0x03, 0x11, 0x58, 0x08, 0x0c, + 0x2c, 0xf7, 0x08, 0x0c, 0x9f, 0x14, 0x11, 0xf0, 0x08, 0x0c, 0x8c, 0xa5, + 0x00, 0xd8, 0x08, 0x0c, 0x82, 0xd4, 0x08, 0xc0, 0x08, 0x0c, 0x9f, 0x14, + 0x11, 0x18, 0x08, 0x0c, 0x8c, 0xa5, 0x00, 0x90, 0x60, 0x10, 0x20, 0x68, + 0x08, 0x0c, 0x9d, 0x16, 0x01, 0x68, 0x60, 0x1c, 0xa0, 0x86, 0x00, 0x03, + 0x11, 0xf8, 0x68, 0x37, 0x01, 0x03, 0x6b, 0x4a, 0x68, 0x47, 0x00, 0x00, + 0x08, 0x0c, 0x54, 0x7a, 0x08, 0x0c, 0x9e, 0xcd, 0x08, 0x0c, 0xa0, 0xdb, + 0x08, 0x0c, 0x9e, 0xd9, 0x08, 0x0c, 0x81, 0xa5, 0x00, 0xce, 0x08, 0x04, + 0x83, 0x2e, 0x2c, 0x78, 0x60, 0x0c, 0x20, 0x60, 0x08, 0x04, 0x83, 0x2e, + 0x01, 0x2e, 0x00, 0x0e, 0x00, 0x6e, 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, + 0x00, 0xfe, 0x00, 0x05, 0x60, 0x1c, 0xa0, 0x86, 0x00, 0x06, 0x1d, 0x30, + 0x08, 0x0c, 0xb1, 0x55, 0x0c, 0x18, 0x00, 0x36, 0x01, 0x56, 0x01, 0x36, + 0x01, 0x46, 0x39, 0x08, 0xa0, 0x06, 0xa1, 0x90, 0x00, 0x20, 0x22, 0x1c, + 0xa3, 0x9e, 0x2a, 0xec, 0x11, 0x18, 0x82, 0x10, 0x80, 0x00, 0x0c, 0xc8, + 0xa0, 0x05, 0x01, 0x38, 0x20, 0xa9, 0x00, 0x20, 0x21, 0x98, 0xa1, 0x10, + 0x22, 0xa0, 0x22, 0xc8, 0x53, 0xa3, 0x01, 0x4e, 0x01, 0x3e, 0x01, 0x5e, + 0x00, 0x3e, 0x00, 0x05, 0x00, 0xd6, 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, + 0x77, 0x4f, 0x20, 0xa3, 0x02, 0x00, 0x20, 0xa3, 0x00, 0x14, 0x60, 0xc3, + 0x00, 0x14, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0x99, + 0xb8, 0xb9, 0x20, 0xa9, 0x00, 0x04, 0x53, 0xa6, 0x20, 0xa3, 0x00, 0x04, + 0x20, 0xa3, 0x78, 0x78, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x08, 0x0c, 0x7d, 0xe0, 0x00, 0xde, 0x00, 0x05, 0x20, 0xa1, 0x02, 0x0b, + 0x08, 0x0c, 0x77, 0x4f, 0x20, 0xa3, 0x02, 0x14, 0x20, 0xa3, 0x00, 0x18, + 0x20, 0xa3, 0x08, 0x00, 0x78, 0x10, 0xa0, 0x84, 0xff, 0x00, 0x20, 0xa2, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x20, 0xa3, 0x00, 0x00, 0x78, 0x10, 0xa0, 0x84, 0x00, 0xff, 0x20, 0xa2, + 0x78, 0x28, 0x20, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x60, 0xc3, 0x00, 0x18, 0x08, 0x0c, 0x7d, 0xe0, 0x00, 0x05, 0x00, 0xd6, + 0x00, 0x16, 0x2f, 0x68, 0x20, 0x09, 0x00, 0x35, 0x08, 0x0c, 0xa1, 0xc6, + 0x19, 0x04, 0x84, 0x89, 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, 0x76, 0xb3, + 0x20, 0xa3, 0x13, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x78, 0x28, 0x20, 0x68, + 0x68, 0x1c, 0xa0, 0x86, 0x00, 0x03, 0x05, 0x80, 0x78, 0x18, 0xa0, 0x80, + 0x00, 0x28, 0x20, 0x14, 0x20, 0x01, 0xb6, 0x35, 0x20, 0x04, 0xd0, 0xac, + 0x11, 0xd0, 0xa2, 0x86, 0x00, 0x7e, 0x11, 0x28, 0x20, 0xa3, 0x00, 0xff, + 0x20, 0xa3, 0xff, 0xfe, 0x04, 0xb8, 0xa2, 0x86, 0x00, 0x7f, 0x11, 0x28, + 0x20, 0xa3, 0x00, 0xff, 0x20, 0xa3, 0xff, 0xfd, 0x04, 0x78, 0xd2, 0xbc, + 0x01, 0x80, 0xa2, 0x86, 0x00, 0x80, 0x11, 0x28, 0x20, 0xa3, 0x00, 0xff, + 0x20, 0xa3, 0xff, 0xfc, 0x04, 0x28, 0xa2, 0xe8, 0xb7, 0x35, 0x2d, 0x6c, + 0x68, 0x10, 0x20, 0xa2, 0x68, 0x14, 0x20, 0xa2, 0x00, 0xe8, 0x20, 0xa3, + 0x00, 0x00, 0x60, 0x98, 0x20, 0xa2, 0x00, 0xc0, 0x20, 0x01, 0xb6, 0x35, + 0x20, 0x04, 0xd0, 0xac, 0x11, 0x38, 0x78, 0x18, 0xa0, 0x80, 0x00, 0x28, + 0x20, 0x04, 0xa0, 0x82, 0x00, 0x7e, 0x02, 0x40, 0x00, 0xd6, 0x20, 0x69, + 0xb6, 0x1c, 0x2d, 0xa6, 0x8d, 0x68, 0x2d, 0xa6, 0x00, 0xde, 0x00, 0x20, + 0x20, 0xa3, 0x00, 0x00, 0x60, 0x34, 0x20, 0xa2, 0x78, 0x34, 0x20, 0xa2, + 0x78, 0x38, 0x20, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x60, 0xc3, 0x00, 0x0c, 0x08, 0x0c, 0x7d, 0xe0, 0x00, 0x1e, 0x00, 0xde, + 0x00, 0x05, 0x78, 0x17, 0x00, 0x01, 0x78, 0x03, 0x00, 0x06, 0x00, 0x1e, + 0x00, 0xde, 0x00, 0x05, 0x00, 0xd6, 0x00, 0x26, 0x79, 0x28, 0x21, 0x68, + 0x69, 0x1c, 0xa1, 0x86, 0x00, 0x06, 0x01, 0xc0, 0xa1, 0x86, 0x00, 0x03, + 0x09, 0x04, 0x84, 0xff, 0xa1, 0x86, 0x00, 0x05, 0x09, 0x04, 0x84, 0xe8, + 0xa1, 0x86, 0x00, 0x04, 0x05, 0xb8, 0xa1, 0x86, 0x00, 0x08, 0x09, 0x04, + 0x84, 0xf0, 0x78, 0x07, 0x00, 0x37, 0x78, 0x13, 0x17, 0x00, 0x08, 0x0c, + 0x85, 0x67, 0x00, 0x2e, 0x00, 0xde, 0x00, 0x05, 0x08, 0x0c, 0x85, 0x23, + 0x20, 0x09, 0x40, 0x00, 0x68, 0x00, 0x00, 0x02, 0x84, 0xc9, 0x84, 0xd4, + 0x84, 0xcb, 0x84, 0xd4, 0x84, 0xd0, 0x84, 0xc9, 0x84, 0xc9, 0x84, 0xd4, + 0x84, 0xd4, 0x84, 0xd4, 0x84, 0xd4, 0x84, 0xc9, 0x84, 0xc9, 0x84, 0xc9, + 0x84, 0xc9, 0x84, 0xc9, 0x84, 0xd4, 0x84, 0xc9, 0x84, 0xd4, 0x08, 0x0c, + 0x15, 0x1a, 0x68, 0x20, 0xd0, 0xe4, 0x01, 0x10, 0xd0, 0xcc, 0x01, 0x10, + 0xa0, 0x0e, 0x00, 0x10, 0x20, 0x09, 0x20, 0x00, 0x68, 0x28, 0x20, 0xa2, + 0x68, 0x2c, 0x20, 0xa2, 0x08, 0x04, 0x85, 0x19, 0x08, 0x0c, 0x85, 0x23, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0x09, 0x40, 0x00, + 0x6a, 0x00, 0xa2, 0x86, 0x00, 0x02, 0x11, 0x08, 0xa0, 0x0e, 0x04, 0x88, + 0x04, 0xd1, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0x09, + 0x40, 0x00, 0x04, 0x48, 0x04, 0x91, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, + 0x00, 0x00, 0x20, 0x09, 0x40, 0x00, 0xa2, 0x86, 0x00, 0x05, 0x01, 0x18, + 0xa2, 0x86, 0x00, 0x02, 0x11, 0x08, 0xa0, 0x0e, 0x00, 0xd0, 0x04, 0x19, + 0x68, 0x10, 0x20, 0x68, 0x69, 0x7c, 0x68, 0x10, 0xa1, 0x12, 0x69, 0x80, + 0x68, 0x14, 0xa1, 0x03, 0x20, 0xa2, 0x22, 0xa2, 0x79, 0x28, 0xa1, 0x80, + 0x00, 0x00, 0x20, 0x04, 0xa0, 0x8e, 0x00, 0x02, 0x01, 0x30, 0xa0, 0x8e, + 0x00, 0x04, 0x01, 0x18, 0x20, 0x09, 0x40, 0x00, 0x00, 0x10, 0x20, 0x09, + 0x00, 0x00, 0x21, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, 0x00, 0x18, + 0x08, 0x0c, 0x7d, 0xe0, 0x00, 0x2e, 0x00, 0xde, 0x00, 0x05, 0x00, 0x36, + 0x00, 0x46, 0x00, 0x56, 0x00, 0x66, 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, + 0x77, 0x4f, 0xa0, 0x06, 0x20, 0xa3, 0x02, 0x00, 0x20, 0xa2, 0x79, 0x34, + 0x21, 0xa2, 0x79, 0x38, 0x21, 0xa2, 0x78, 0x18, 0xa0, 0x80, 0x00, 0x28, + 0x20, 0x04, 0x20, 0x11, 0xb6, 0x35, 0x22, 0x14, 0xd2, 0xac, 0x11, 0x18, + 0xa0, 0x92, 0x00, 0x7e, 0x02, 0x68, 0x00, 0xd6, 0x20, 0x69, 0xb6, 0x1c, + 0x2d, 0x2c, 0x8d, 0x68, 0x2d, 0x34, 0xa0, 0xe8, 0xb7, 0x35, 0x2d, 0x6c, + 0x6b, 0x10, 0x6c, 0x14, 0x00, 0xde, 0x00, 0x30, 0x20, 0x19, 0x00, 0x00, + 0x64, 0x98, 0x20, 0x29, 0x00, 0x00, 0x66, 0x34, 0x78, 0x28, 0xa0, 0x80, + 0x00, 0x07, 0x20, 0x04, 0xa0, 0x86, 0x00, 0x03, 0x11, 0x28, 0x25, 0xa2, + 0x26, 0xa2, 0x23, 0xa2, 0x24, 0xa2, 0x00, 0x20, 0x23, 0xa2, 0x24, 0xa2, + 0x25, 0xa2, 0x26, 0xa2, 0x00, 0x6e, 0x00, 0x5e, 0x00, 0x4e, 0x00, 0x3e, + 0x00, 0x05, 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, 0x77, 0x4f, 0x20, 0xa3, + 0x01, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x09, 0x78, 0x10, + 0x20, 0xa2, 0x60, 0xc3, 0x00, 0x08, 0x08, 0x0c, 0x7d, 0xe0, 0x00, 0x05, + 0x20, 0xa1, 0x02, 0x0b, 0x08, 0x0c, 0x76, 0xab, 0x20, 0xa3, 0x14, 0x00, + 0x20, 0xa3, 0x00, 0x00, 0x78, 0x34, 0x20, 0xa2, 0x78, 0x38, 0x20, 0xa2, + 0x78, 0x28, 0x20, 0xa2, 0x78, 0x2c, 0x20, 0xa2, 0x78, 0x30, 0xa0, 0x84, + 0x00, 0xff, 0x80, 0x07, 0x20, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x60, 0xc3, + 0x00, 0x10, 0x08, 0x0c, 0x7d, 0xe0, 0x00, 0x05, 0x20, 0xa1, 0x02, 0x0b, + 0x08, 0x0c, 0x77, 0x47, 0x20, 0xa3, 0x01, 0x00, 0x20, 0xa3, 0x00, 0x00, + 0x78, 0x28, 0x20, 0xa2, 0x78, 0x10, 0x20, 0xa2, 0x60, 0xc3, 0x00, 0x08, + 0x08, 0x0c, 0x7d, 0xe0, 0x00, 0x05, 0x01, 0x46, 0x20, 0xa1, 0x02, 0x0b, + 0x00, 0x31, 0x60, 0xc3, 0x00, 0x00, 0x08, 0x0c, 0x7d, 0xe0, 0x01, 0x4e, + 0x00, 0x05, 0x20, 0xe1, 0x90, 0x80, 0x20, 0xe1, 0x40, 0x00, 0x78, 0x18, + 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, 0x20, 0x11, 0xb6, 0x35, 0x22, 0x14, + 0xd2, 0xac, 0x11, 0x10, 0xd0, 0xbc, 0x01, 0x88, 0x00, 0xd6, 0xa0, 0xe8, + 0xb7, 0x35, 0x2d, 0x6c, 0x68, 0x10, 0xa0, 0x85, 0x03, 0x00, 0x20, 0xa2, + 0x68, 0x14, 0x20, 0xa2, 0x20, 0x69, 0xb6, 0x1c, 0x2d, 0xa6, 0x8d, 0x68, + 0x2d, 0xa6, 0x00, 0xde, 0x00, 0x78, 0x00, 0xd6, 0xa0, 0xe8, 0xb7, 0x35, + 0x2d, 0x6c, 0x68, 0x10, 0xa0, 0x85, 0x03, 0x00, 0x20, 0xa2, 0x68, 0x14, + 0x20, 0xa2, 0x00, 0xde, 0x20, 0xa3, 0x00, 0x00, 0x62, 0x34, 0x22, 0xa2, + 0x20, 0xa3, 0x08, 0x19, 0x20, 0xa3, 0x00, 0x00, 0x08, 0x0c, 0x7d, 0xcf, + 0x22, 0xa2, 0x20, 0xa3, 0x00, 0x00, 0x2f, 0xa2, 0x7a, 0x08, 0x22, 0xa2, + 0x20, 0xa3, 0x00, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x00, 0x05, 0x20, 0xa1, + 0x02, 0x0b, 0x00, 0x79, 0x79, 0x10, 0x21, 0xa2, 0x20, 0xa3, 0x00, 0x00, + 0x60, 0xc3, 0x00, 0x00, 0x20, 0xe1, 0x90, 0x80, 0x60, 0xa7, 0x95, 0x75, + 0x08, 0x0c, 0x7d, 0xea, 0x08, 0x0c, 0x6a, 0x79, 0x00, 0x05, 0x01, 0x56, + 0x01, 0x36, 0x00, 0x36, 0x00, 0xd6, 0x00, 0xe6, 0x20, 0xe1, 0x90, 0x80, + 0x20, 0xe1, 0x40, 0x00, 0x78, 0x54, 0x20, 0x68, 0xad, 0xf0, 0x00, 0x0f, + 0x72, 0x10, 0xa2, 0x96, 0x00, 0xc0, 0xa2, 0x94, 0xff, 0xfd, 0x72, 0x12, + 0x72, 0x14, 0xa2, 0x94, 0x03, 0x00, 0x72, 0x16, 0x71, 0x00, 0xa1, 0x94, + 0x00, 0xff, 0x73, 0x08, 0xa3, 0x84, 0x00, 0xff, 0xa0, 0x8d, 0xc2, 0x00, + 0x71, 0x02, 0xa3, 0x84, 0xff, 0x00, 0xa2, 0x15, 0x72, 0x0a, 0x70, 0x04, + 0x72, 0x0c, 0x70, 0x0e, 0x72, 0x06, 0x20, 0xa9, 0x00, 0x0a, 0x2e, 0x98, + 0x53, 0xa6, 0x60, 0xa3, 0x00, 0x35, 0x6a, 0x38, 0xa2, 0x94, 0x70, 0x00, + 0xa2, 0x86, 0x30, 0x00, 0x01, 0x10, 0x60, 0xa3, 0x00, 0x37, 0x00, 0xee, + 0x00, 0xde, 0x00, 0x3e, 0x01, 0x3e, 0x01, 0x5e, 0x00, 0x05, 0x20, 0x09, + 0x00, 0x92, 0x00, 0x10, 0x20, 0x09, 0x00, 0x96, 0x60, 0xab, 0x00, 0x36, + 0x61, 0x16, 0x00, 0x05, 0x20, 0x61, 0xbe, 0x00, 0x2a, 0x70, 0x70, 0x68, + 0x70, 0x4a, 0x70, 0x4f, 0xbe, 0x00, 0x00, 0x05, 0x00, 0xe6, 0x01, 0x26, + 0x20, 0x71, 0xb6, 0x00, 0x20, 0x91, 0x80, 0x00, 0x75, 0x48, 0xa5, 0x82, + 0x00, 0x10, 0x06, 0x08, 0x70, 0x4c, 0x20, 0x60, 0x60, 0x00, 0xa0, 0x86, + 0x00, 0x00, 0x01, 0x48, 0xac, 0xe0, 0x00, 0x18, 0x70, 0x5c, 0xac, 0x02, + 0x12, 0x08, 0x0c, 0xb0, 0x20, 0x61, 0xbe, 0x00, 0x0c, 0x98, 0x60, 0x03, + 0x00, 0x08, 0x85, 0x29, 0x75, 0x4a, 0xac, 0xa8, 0x00, 0x18, 0x70, 0x5c, + 0xa5, 0x02, 0x12, 0x30, 0x75, 0x4e, 0xa0, 0x85, 0x00, 0x01, 0x01, 0x2e, + 0x00, 0xee, 0x00, 0x05, 0x70, 0x4f, 0xbe, 0x00, 0x0c, 0xc0, 0xa0, 0x06, + 0x0c, 0xc0, 0x00, 0xe6, 0x20, 0x71, 0xb6, 0x00, 0x75, 0x48, 0xa5, 0x82, + 0x00, 0x10, 0x06, 0x00, 0x70, 0x4c, 0x20, 0x60, 0x60, 0x00, 0xa0, 0x86, + 0x00, 0x00, 0x01, 0x48, 0xac, 0xe0, 0x00, 0x18, 0x70, 0x5c, 0xac, 0x02, + 0x12, 0x08, 0x0c, 0xb0, 0x20, 0x61, 0xbe, 0x00, 0x0c, 0x98, 0x60, 0x03, + 0x00, 0x08, 0x85, 0x29, 0x75, 0x4a, 0xac, 0xa8, 0x00, 0x18, 0x70, 0x5c, + 0xa5, 0x02, 0x12, 0x28, 0x75, 0x4e, 0xa0, 0x85, 0x00, 0x01, 0x00, 0xee, + 0x00, 0x05, 0x70, 0x4f, 0xbe, 0x00, 0x0c, 0xc8, 0xa0, 0x06, 0x0c, 0xc8, + 0xac, 0x82, 0xbe, 0x00, 0x0a, 0x0c, 0x15, 0x1a, 0x20, 0x01, 0xb6, 0x17, + 0x20, 0x04, 0xac, 0x02, 0x1a, 0x0c, 0x15, 0x1a, 0xa0, 0x06, 0x60, 0x06, + 0x60, 0x0a, 0x60, 0x0e, 0x60, 0x12, 0x60, 0x16, 0x60, 0x1a, 0x60, 0x1f, + 0x00, 0x00, 0x60, 0x03, 0x00, 0x00, 0x60, 0x52, 0x60, 0x56, 0x60, 0x22, + 0x60, 0x26, 0x60, 0x2a, 0x60, 0x2e, 0x60, 0x32, 0x60, 0x36, 0x60, 0x3a, + 0x60, 0x3e, 0x20, 0x61, 0xb6, 0x00, 0x60, 0x48, 0x80, 0x00, 0x60, 0x4a, + 0xa0, 0x86, 0x00, 0x01, 0x01, 0x08, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0x71, 0xe5, 0x01, 0x2e, 0x0c, 0xc0, 0x60, 0x1c, + 0xa0, 0x84, 0x00, 0x0f, 0x00, 0x02, 0x86, 0xe7, 0x86, 0xf6, 0x87, 0x11, + 0x87, 0x2c, 0xa2, 0x0e, 0xa2, 0x29, 0xa2, 0x44, 0x86, 0xe7, 0x86, 0xf6, + 0x86, 0xe7, 0x87, 0x47, 0x86, 0xe7, 0x86, 0xe7, 0x86, 0xe7, 0x86, 0xe7, + 0x86, 0xe7, 0xa1, 0x86, 0x00, 0x13, 0x11, 0x28, 0x08, 0x0c, 0x71, 0x02, + 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x05, 0xa1, 0x8e, 0x00, 0x47, 0x11, 0x18, + 0xa0, 0x16, 0x08, 0x0c, 0x18, 0x63, 0x00, 0x05, 0x00, 0x66, 0x60, 0x00, + 0xa0, 0xb2, 0x00, 0x10, 0x1a, 0x0c, 0x15, 0x1a, 0x00, 0x13, 0x00, 0x6e, + 0x00, 0x05, 0x87, 0x0f, 0x8b, 0x27, 0x8c, 0xdf, 0x87, 0x0f, 0x8d, 0x54, + 0x88, 0x05, 0x87, 0x0f, 0x87, 0x0f, 0x8a, 0xb9, 0x91, 0x7b, 0x87, 0x0f, + 0x87, 0x0f, 0x87, 0x0f, 0x87, 0x0f, 0x87, 0x0f, 0x87, 0x0f, 0x08, 0x0c, + 0x15, 0x1a, 0x00, 0x66, 0x60, 0x00, 0xa0, 0xb2, 0x00, 0x10, 0x1a, 0x0c, + 0x15, 0x1a, 0x00, 0x13, 0x00, 0x6e, 0x00, 0x05, 0x87, 0x2a, 0x97, 0xde, + 0x87, 0x2a, 0x87, 0x2a, 0x87, 0x2a, 0x87, 0x2a, 0x87, 0x2a, 0x87, 0x2a, + 0x97, 0x89, 0x99, 0x4a, 0x87, 0x2a, 0x98, 0x0b, 0x98, 0x82, 0x98, 0x0b, + 0x98, 0x82, 0x87, 0x2a, 0x08, 0x0c, 0x15, 0x1a, 0x00, 0x66, 0x60, 0x00, + 0xa0, 0xb2, 0x00, 0x10, 0x1a, 0x0c, 0x15, 0x1a, 0x00, 0x13, 0x00, 0x6e, + 0x00, 0x05, 0x87, 0x45, 0x91, 0xbc, 0x92, 0x86, 0x93, 0xc4, 0x95, 0x4d, + 0x87, 0x45, 0x87, 0x45, 0x87, 0x45, 0x91, 0x96, 0x97, 0x39, 0x97, 0x3c, + 0x87, 0x45, 0x87, 0x45, 0x87, 0x45, 0x87, 0x45, 0x97, 0x66, 0x08, 0x0c, + 0x15, 0x1a, 0x00, 0x66, 0x60, 0x00, 0xa0, 0xb2, 0x00, 0x10, 0x1a, 0x0c, + 0x15, 0x1a, 0x00, 0x13, 0x00, 0x6e, 0x00, 0x05, 0x87, 0x60, 0x87, 0x60, + 0x87, 0x60, 0x87, 0x8e, 0x87, 0xdb, 0x87, 0x60, 0x87, 0x60, 0x87, 0x60, + 0x87, 0x62, 0x87, 0x60, 0x87, 0x60, 0x87, 0x60, 0x87, 0x60, 0x87, 0x60, + 0x87, 0x60, 0x87, 0x60, 0x08, 0x0c, 0x15, 0x1a, 0xa1, 0x86, 0x00, 0x03, + 0x19, 0x0c, 0x15, 0x1a, 0x00, 0xd6, 0x60, 0x03, 0x00, 0x03, 0x61, 0x06, + 0x60, 0x10, 0x20, 0x68, 0x68, 0x4f, 0x00, 0x40, 0x68, 0x7c, 0x68, 0x0a, + 0x68, 0x80, 0x68, 0x0e, 0x68, 0x13, 0x00, 0x00, 0x68, 0x17, 0x00, 0x00, + 0x68, 0x54, 0xa0, 0x92, 0x19, 0x9a, 0x02, 0x10, 0x20, 0x01, 0x19, 0x99, + 0x80, 0x03, 0x80, 0x13, 0x82, 0x13, 0xa2, 0x10, 0x62, 0x16, 0x00, 0xde, + 0x2c, 0x10, 0x08, 0x0c, 0x1f, 0xc5, 0x08, 0x0c, 0x6d, 0x62, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x72, 0xa2, 0x01, 0x2e, 0x00, 0x05, + 0xa1, 0x82, 0x00, 0x47, 0x00, 0x02, 0x87, 0x9a, 0x87, 0x9a, 0x87, 0x9c, + 0x87, 0xb5, 0x87, 0x9a, 0x87, 0x9a, 0x87, 0x9a, 0x87, 0x9a, 0x87, 0xc7, + 0x08, 0x0c, 0x15, 0x1a, 0x00, 0xd6, 0x00, 0x16, 0x08, 0x0c, 0x71, 0x98, + 0x08, 0x0c, 0x72, 0xa2, 0x60, 0x03, 0x00, 0x04, 0x61, 0x10, 0x21, 0x68, + 0x68, 0x4f, 0x00, 0x20, 0x68, 0x5c, 0x68, 0x5a, 0x68, 0x74, 0x68, 0x7e, + 0x68, 0x78, 0x68, 0x82, 0x68, 0x97, 0x00, 0x00, 0x68, 0x9b, 0x00, 0x00, + 0x00, 0x1e, 0x00, 0xde, 0x00, 0x05, 0x08, 0x0c, 0x71, 0x98, 0x00, 0xd6, + 0x61, 0x10, 0x21, 0x68, 0x08, 0x0c, 0x9d, 0x16, 0x01, 0x20, 0x68, 0x4b, + 0x00, 0x06, 0x08, 0x0c, 0x54, 0x7a, 0x00, 0xde, 0x08, 0x0c, 0x86, 0xa4, + 0x08, 0x0c, 0x72, 0xa2, 0x00, 0x05, 0x08, 0x0c, 0x71, 0x98, 0x08, 0x0c, + 0x2c, 0xd1, 0x00, 0xd6, 0x61, 0x10, 0x21, 0x68, 0x08, 0x0c, 0x9d, 0x16, + 0x01, 0x20, 0x68, 0x4b, 0x00, 0x29, 0x08, 0x0c, 0x54, 0x7a, 0x00, 0xde, + 0x08, 0x0c, 0x86, 0xa4, 0x08, 0x0c, 0x72, 0xa2, 0x00, 0x05, 0xa1, 0x82, + 0x00, 0x47, 0x00, 0x02, 0x87, 0xe9, 0x87, 0xf8, 0x87, 0xe7, 0x87, 0xe7, + 0x87, 0xe7, 0x87, 0xe7, 0x87, 0xe7, 0x87, 0xe7, 0x87, 0xe7, 0x08, 0x0c, + 0x15, 0x1a, 0x00, 0xd6, 0x60, 0x10, 0x20, 0x68, 0x68, 0x4c, 0xc0, 0xf4, + 0x68, 0x4e, 0x00, 0xde, 0x20, 0xe1, 0x00, 0x05, 0x3d, 0x18, 0x3e, 0x20, + 0x2c, 0x10, 0x08, 0x0c, 0x18, 0x63, 0x00, 0x05, 0x00, 0xd6, 0x61, 0x10, + 0x21, 0x68, 0x68, 0x4b, 0x00, 0x00, 0x68, 0x53, 0x00, 0x00, 0x08, 0x0c, + 0x54, 0x7a, 0x00, 0xde, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0x05, 0xa1, 0xb6, + 0x00, 0x15, 0x11, 0x18, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0x30, 0xa1, 0xb6, + 0x00, 0x16, 0x19, 0x0c, 0x15, 0x1a, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0x05, + 0x20, 0xa9, 0x00, 0x0e, 0x2e, 0x98, 0x60, 0x10, 0x20, 0xa0, 0x53, 0xa3, + 0x20, 0xa9, 0x00, 0x06, 0x33, 0x10, 0x34, 0x20, 0x93, 0x98, 0x94, 0xa0, + 0x33, 0x18, 0x34, 0x28, 0x22, 0x2e, 0x23, 0x26, 0xa2, 0x90, 0x00, 0x02, + 0xa5, 0xa8, 0x00, 0x02, 0xa3, 0x98, 0x00, 0x02, 0xa4, 0xa0, 0x00, 0x02, + 0x1f, 0x04, 0x88, 0x20, 0x00, 0xe6, 0x08, 0x0c, 0x9d, 0x16, 0x01, 0x30, + 0x60, 0x10, 0x20, 0x70, 0x70, 0x07, 0x00, 0x00, 0x70, 0x37, 0x01, 0x03, + 0x00, 0xee, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0x05, 0x00, 0xd6, 0x00, 0x36, + 0x73, 0x30, 0xa3, 0x86, 0x02, 0x00, 0x11, 0x30, 0x60, 0x18, 0x20, 0x68, + 0x68, 0x13, 0x00, 0xff, 0x68, 0x17, 0xff, 0xfd, 0x60, 0x10, 0xa0, 0x05, + 0x01, 0x30, 0x20, 0x68, 0x68, 0x07, 0x00, 0x00, 0x68, 0x37, 0x01, 0x03, + 0x6b, 0x32, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0x3e, 0x00, 0xde, 0x00, 0x05, + 0x00, 0x16, 0x20, 0xa9, 0x00, 0x2a, 0xae, 0x80, 0x00, 0x0c, 0x20, 0x98, + 0x60, 0x10, 0xa0, 0x80, 0x00, 0x02, 0x20, 0xa0, 0x53, 0xa3, 0x20, 0xa9, + 0x00, 0x2a, 0x60, 0x10, 0xa0, 0x80, 0x00, 0x01, 0x20, 0x04, 0xa0, 0x80, + 0x00, 0x02, 0x20, 0xa0, 0x53, 0xa3, 0x00, 0xe6, 0x60, 0x10, 0x20, 0x04, + 0x20, 0x70, 0x70, 0x37, 0x01, 0x03, 0x00, 0xee, 0x08, 0x0c, 0x86, 0xa4, + 0x00, 0x1e, 0x00, 0x05, 0x00, 0x16, 0x20, 0x09, 0x00, 0x00, 0x70, 0x30, + 0xa0, 0x86, 0x01, 0x00, 0x01, 0x40, 0x70, 0x38, 0xa0, 0x84, 0x00, 0xff, + 0x80, 0x0c, 0x70, 0x3c, 0xa0, 0x84, 0x00, 0xff, 0x80, 0x04, 0xa0, 0x80, + 0x00, 0x04, 0xa1, 0x08, 0x21, 0xa8, 0xae, 0x80, 0x00, 0x0c, 0x20, 0x98, + 0x60, 0x10, 0xa0, 0x80, 0x00, 0x02, 0x20, 0xa0, 0x08, 0x0c, 0x4b, 0xf1, + 0x00, 0xe6, 0x08, 0x0c, 0x9d, 0x16, 0x01, 0x40, 0x60, 0x10, 0x20, 0x70, + 0x70, 0x07, 0x00, 0x00, 0x70, 0x34, 0x70, 0xb2, 0x70, 0x37, 0x01, 0x03, + 0x00, 0xee, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xe6, + 0x00, 0xd6, 0x60, 0x3f, 0x00, 0x00, 0x2c, 0x68, 0x00, 0x16, 0x20, 0x09, + 0x00, 0x35, 0x08, 0x0c, 0xa1, 0xc6, 0x00, 0x1e, 0x11, 0x68, 0x00, 0x26, + 0x62, 0x28, 0x22, 0x68, 0x00, 0x2e, 0x20, 0x71, 0xbc, 0x8c, 0x6b, 0x1c, + 0xa3, 0x86, 0x00, 0x03, 0x01, 0x30, 0xa3, 0x86, 0x00, 0x06, 0x01, 0x28, + 0x08, 0x0c, 0x86, 0xa4, 0x00, 0x20, 0x00, 0x31, 0x00, 0x10, 0x08, 0x0c, + 0x89, 0x82, 0x00, 0xde, 0x00, 0xee, 0x00, 0x05, 0x00, 0xf6, 0x68, 0x10, + 0x20, 0x78, 0xa1, 0x86, 0x00, 0x15, 0x09, 0x04, 0x89, 0x69, 0xa1, 0x8e, + 0x00, 0x16, 0x19, 0x04, 0x89, 0x80, 0x70, 0x0c, 0xa0, 0x8c, 0xff, 0x00, + 0xa1, 0x86, 0x17, 0x00, 0x01, 0x20, 0xa1, 0x86, 0x03, 0x00, 0x19, 0x04, + 0x89, 0x48, 0x8f, 0xff, 0x11, 0x38, 0x68, 0x00, 0xa0, 0x86, 0x00, 0x0f, + 0x09, 0x04, 0x89, 0x2c, 0x08, 0x04, 0x89, 0x7e, 0x68, 0x08, 0xa0, 0x86, + 0xff, 0xff, 0x19, 0x04, 0x89, 0x6b, 0x78, 0x4c, 0xa0, 0x84, 0x00, 0x60, + 0xa0, 0x86, 0x00, 0x20, 0x11, 0x50, 0x79, 0x7c, 0x78, 0x10, 0xa1, 0x06, + 0x19, 0x04, 0x89, 0x6b, 0x79, 0x80, 0x78, 0x14, 0xa1, 0x06, 0x19, 0x04, + 0x89, 0x6b, 0x08, 0x0c, 0x9e, 0xcd, 0x68, 0x58, 0x78, 0x52, 0x78, 0x4c, + 0xc0, 0xdc, 0xc0, 0xf4, 0xc0, 0xd4, 0x78, 0x4e, 0x00, 0x26, 0xa0, 0x0e, + 0x6a, 0x14, 0x20, 0x01, 0x00, 0x0a, 0x08, 0x0c, 0x6b, 0xb2, 0x78, 0x54, + 0xa2, 0x0a, 0x02, 0x08, 0x80, 0x11, 0x7a, 0x56, 0x82, 0xff, 0x00, 0x2e, + 0x11, 0x38, 0x00, 0xc6, 0x2d, 0x60, 0x08, 0x0c, 0x9a, 0xc5, 0x00, 0xce, + 0x08, 0x04, 0x89, 0x7e, 0x00, 0xc6, 0x00, 0xd6, 0x2f, 0x68, 0x68, 0x38, + 0xd0, 0xfc, 0x11, 0x18, 0x08, 0x0c, 0x4c, 0xd7, 0x00, 0x10, 0x08, 0x0c, + 0x4e, 0xbb, 0x00, 0xde, 0x00, 0xce, 0x19, 0x04, 0x89, 0x6b, 0x00, 0xc6, + 0x2d, 0x60, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0xce, 0x08, 0x04, 0x89, 0x7e, + 0x00, 0xc6, 0x08, 0x0c, 0x9f, 0x92, 0x01, 0x90, 0x60, 0x13, 0x00, 0x00, + 0x68, 0x18, 0x60, 0x1a, 0x08, 0x0c, 0xa0, 0xe3, 0x60, 0x1f, 0x00, 0x03, + 0x69, 0x04, 0x00, 0xc6, 0x2d, 0x60, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0xce, + 0x08, 0x0c, 0x86, 0xd3, 0x00, 0xce, 0x04, 0xe0, 0x20, 0x01, 0xb8, 0xb8, + 0x20, 0x04, 0x68, 0x3e, 0x00, 0xce, 0x04, 0xb0, 0x70, 0x08, 0xa0, 0x86, + 0x00, 0x0b, 0x11, 0xa0, 0x60, 0x18, 0x20, 0x0c, 0xc1, 0xbc, 0x21, 0x02, + 0x00, 0xc6, 0x2d, 0x60, 0x78, 0x4b, 0x00, 0x03, 0x60, 0x07, 0x00, 0x85, + 0x60, 0x03, 0x00, 0x0b, 0x60, 0x1f, 0x00, 0x02, 0x08, 0x0c, 0x6c, 0xff, + 0x08, 0x0c, 0x71, 0xe5, 0x00, 0xce, 0x00, 0xf0, 0x70, 0x0c, 0xa0, 0x86, + 0x2a, 0x00, 0x11, 0x38, 0x20, 0x01, 0xb8, 0xb8, 0x20, 0x04, 0x68, 0x3e, + 0x00, 0xa8, 0x04, 0x81, 0x00, 0xa8, 0x8f, 0xff, 0x09, 0x0c, 0x15, 0x1a, + 0x00, 0xc6, 0x00, 0xd6, 0x2d, 0x60, 0x2f, 0x68, 0x68, 0x37, 0x01, 0x03, + 0x68, 0x4b, 0x00, 0x03, 0x08, 0x0c, 0x99, 0xb9, 0x08, 0x0c, 0x9e, 0xcd, + 0x08, 0x0c, 0x9e, 0xd9, 0x00, 0xde, 0x00, 0xce, 0x08, 0x0c, 0x86, 0xa4, + 0x00, 0xfe, 0x00, 0x05, 0xa1, 0x86, 0x00, 0x15, 0x11, 0x28, 0x20, 0x01, + 0xb8, 0xb8, 0x20, 0x04, 0x68, 0x3e, 0x00, 0x68, 0xa1, 0x8e, 0x00, 0x16, + 0x11, 0x60, 0x00, 0xc6, 0x2d, 0x00, 0x20, 0x60, 0x08, 0x0c, 0xb3, 0xf6, + 0x08, 0x0c, 0x6b, 0x61, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0xce, 0x08, 0x0c, + 0x86, 0xa4, 0x00, 0x05, 0x00, 0x26, 0x00, 0x36, 0x00, 0x46, 0x72, 0x28, + 0x7c, 0x80, 0x7b, 0x7c, 0xd2, 0xf4, 0x01, 0x30, 0x20, 0x01, 0xb8, 0xb8, + 0x20, 0x04, 0x68, 0x3e, 0x08, 0x04, 0x89, 0xfc, 0x00, 0xc6, 0x2d, 0x60, + 0x08, 0x0c, 0x99, 0xd9, 0x00, 0xce, 0x68, 0x04, 0xa0, 0x86, 0x00, 0x50, + 0x11, 0x68, 0x00, 0xc6, 0x2d, 0x00, 0x20, 0x60, 0x60, 0x03, 0x00, 0x01, + 0x60, 0x07, 0x00, 0x50, 0x08, 0x0c, 0x6c, 0xff, 0x08, 0x0c, 0x71, 0xe5, + 0x00, 0xce, 0x04, 0xf0, 0x68, 0x00, 0xa0, 0x86, 0x00, 0x0f, 0x01, 0xc8, + 0x8f, 0xff, 0x09, 0x0c, 0x15, 0x1a, 0x68, 0x20, 0xd0, 0xdc, 0x11, 0x98, + 0x68, 0x00, 0xa0, 0x86, 0x00, 0x04, 0x11, 0x98, 0x78, 0x4c, 0xd0, 0xac, + 0x01, 0x80, 0x78, 0x4c, 0xc0, 0xdc, 0xc0, 0xf4, 0x78, 0x4e, 0x78, 0x50, + 0xc0, 0xf4, 0xc0, 0xfc, 0x78, 0x52, 0x20, 0x01, 0x00, 0x01, 0x68, 0x2e, + 0x00, 0xe0, 0x20, 0x01, 0x00, 0x07, 0x68, 0x2e, 0x00, 0xc0, 0x78, 0x4c, + 0xd0, 0xb4, 0x11, 0x30, 0xd0, 0xac, 0x0d, 0xb8, 0x78, 0x4c, 0xd0, 0xf4, + 0x1d, 0xa0, 0x0c, 0x38, 0xd2, 0xec, 0x1d, 0x88, 0x70, 0x24, 0xa3, 0x06, + 0x11, 0x18, 0x70, 0x20, 0xa4, 0x06, 0x0d, 0x58, 0x70, 0x20, 0x68, 0x36, + 0x70, 0x24, 0x68, 0x3a, 0x20, 0x01, 0x00, 0x05, 0x68, 0x2e, 0x08, 0x0c, + 0xa0, 0x1f, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x10, 0x08, 0x0c, 0x86, 0xa4, + 0x00, 0x4e, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x05, 0x00, 0xe6, 0x00, 0xd6, + 0x00, 0x26, 0x60, 0x34, 0x20, 0x68, 0x6a, 0x1c, 0xa2, 0x86, 0x00, 0x07, + 0x09, 0x04, 0x8a, 0x60, 0xa2, 0x86, 0x00, 0x02, 0x09, 0x04, 0x8a, 0x60, + 0xa2, 0x86, 0x00, 0x00, 0x09, 0x04, 0x8a, 0x60, 0x68, 0x08, 0x63, 0x38, + 0xa3, 0x06, 0x19, 0x04, 0x8a, 0x60, 0x20, 0x71, 0xbc, 0x8c, 0xa1, 0x86, + 0x00, 0x15, 0x05, 0xe0, 0xa1, 0x8e, 0x00, 0x16, 0x11, 0x90, 0x60, 0x30, + 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, 0x00, 0x01, 0x11, 0x60, 0x70, 0x0c, + 0xa0, 0x86, 0x2a, 0x00, 0x11, 0x40, 0x60, 0x34, 0xa0, 0x80, 0x00, 0x08, + 0x20, 0x0c, 0xc1, 0xdd, 0xc1, 0xf5, 0x21, 0x02, 0x04, 0x38, 0x00, 0xc6, + 0x60, 0x34, 0x20, 0x60, 0x61, 0x04, 0xa1, 0x86, 0x00, 0x4b, 0x01, 0xa0, + 0xa1, 0x86, 0x00, 0x4c, 0x01, 0x88, 0xa1, 0x86, 0x00, 0x4d, 0x01, 0x70, + 0xa1, 0x86, 0x00, 0x4e, 0x01, 0x58, 0xa1, 0x86, 0x00, 0x52, 0x01, 0x40, + 0x60, 0x10, 0x20, 0x68, 0x08, 0x0c, 0x9d, 0x16, 0x09, 0x0c, 0x15, 0x1a, + 0x68, 0x4b, 0x00, 0x03, 0x60, 0x07, 0x00, 0x85, 0x60, 0x03, 0x00, 0x0b, + 0x60, 0x1f, 0x00, 0x02, 0x08, 0x0c, 0x6c, 0xff, 0x08, 0x0c, 0x71, 0xe5, + 0x00, 0xce, 0x00, 0x30, 0x60, 0x34, 0x20, 0x70, 0x20, 0x01, 0xb8, 0xb8, + 0x20, 0x04, 0x70, 0x3e, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0x2e, 0x00, 0xde, + 0x00, 0xee, 0x00, 0x05, 0x00, 0xd6, 0x20, 0xa9, 0x00, 0x0e, 0x2e, 0x98, + 0x60, 0x10, 0x20, 0xa0, 0x53, 0xa3, 0xa1, 0xb6, 0x00, 0x15, 0x15, 0x58, + 0x60, 0x18, 0x20, 0x68, 0x01, 0x56, 0x00, 0x36, 0x00, 0x26, 0xae, 0x90, + 0x00, 0x0c, 0xa2, 0x90, 0x00, 0x04, 0x20, 0xa9, 0x00, 0x04, 0xad, 0x98, + 0x00, 0x0a, 0x08, 0x0c, 0x91, 0x66, 0x00, 0x2e, 0x00, 0x3e, 0x01, 0x5e, + 0x11, 0xd8, 0x01, 0x56, 0x00, 0x36, 0x00, 0x26, 0xae, 0x90, 0x00, 0x0c, + 0xa2, 0x90, 0x00, 0x08, 0x20, 0xa9, 0x00, 0x04, 0xad, 0x98, 0x00, 0x06, + 0x08, 0x0c, 0x91, 0x66, 0x00, 0x2e, 0x00, 0x3e, 0x01, 0x5e, 0x11, 0x50, + 0x70, 0x38, 0x68, 0x0a, 0x70, 0x3c, 0x68, 0x0e, 0x68, 0x00, 0xc0, 0x8d, + 0x68, 0x02, 0x00, 0xde, 0x08, 0x04, 0x88, 0x2c, 0x08, 0x0c, 0x2c, 0xd1, + 0x00, 0xc6, 0x08, 0x0c, 0x86, 0x4e, 0x2f, 0x00, 0x60, 0x1a, 0x60, 0x13, + 0x00, 0x00, 0x60, 0x1f, 0x00, 0x01, 0x60, 0x07, 0x00, 0x01, 0x60, 0x03, + 0x00, 0x01, 0x20, 0x01, 0x00, 0x07, 0x08, 0x0c, 0x4f, 0x6f, 0x08, 0x0c, + 0x4f, 0x9c, 0x08, 0x0c, 0x6d, 0x45, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0xce, + 0x0c, 0x10, 0x21, 0x00, 0xa1, 0xb2, 0x00, 0x80, 0x1a, 0x0c, 0x15, 0x1a, + 0xa1, 0xb2, 0x00, 0x40, 0x1a, 0x04, 0x8b, 0x1d, 0x00, 0x02, 0x8b, 0x11, + 0x8b, 0x05, 0x8b, 0x11, 0x8b, 0x11, 0x8b, 0x11, 0x8b, 0x11, 0x8b, 0x03, + 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x03, + 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x03, + 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x03, + 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x03, + 0x8b, 0x11, 0x8b, 0x03, 0x8b, 0x11, 0x8b, 0x11, 0x8b, 0x03, 0x8b, 0x03, + 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x11, 0x8b, 0x03, 0x8b, 0x03, + 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x03, + 0x8b, 0x03, 0x8b, 0x11, 0x8b, 0x11, 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x03, + 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x03, 0x8b, 0x03, + 0x8b, 0x11, 0x8b, 0x03, 0x8b, 0x03, 0x08, 0x0c, 0x15, 0x1a, 0x60, 0x03, + 0x00, 0x01, 0x61, 0x06, 0x08, 0x0c, 0x6d, 0x45, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0x71, 0xe5, 0x01, 0x2e, 0x00, 0x05, 0x60, 0x03, + 0x00, 0x01, 0x61, 0x06, 0x08, 0x0c, 0x6d, 0x45, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0x71, 0xe5, 0x01, 0x2e, 0x00, 0x05, 0x26, 0x00, + 0x00, 0x02, 0x8b, 0x11, 0x8b, 0x11, 0x8b, 0x25, 0x8b, 0x11, 0x8b, 0x11, + 0x8b, 0x25, 0x08, 0x0c, 0x15, 0x1a, 0x60, 0x04, 0xa0, 0xb2, 0x00, 0x80, + 0x1a, 0x0c, 0x15, 0x1a, 0xa1, 0xb6, 0x00, 0x13, 0x09, 0x04, 0x8b, 0xd7, + 0xa1, 0xb6, 0x00, 0x27, 0x19, 0x04, 0x8b, 0x9d, 0x08, 0x0c, 0x71, 0x02, + 0x60, 0x04, 0x08, 0x0c, 0x9f, 0x03, 0x01, 0x90, 0x08, 0x0c, 0x9f, 0x14, + 0x09, 0x04, 0x8b, 0x97, 0xa0, 0x8e, 0x00, 0x21, 0x09, 0x04, 0x8b, 0x9a, + 0xa0, 0x8e, 0x00, 0x22, 0x09, 0x04, 0x8b, 0x97, 0xa0, 0x8e, 0x00, 0x3d, + 0x09, 0x04, 0x8b, 0x9a, 0x08, 0x04, 0x8b, 0x90, 0x08, 0x0c, 0x2c, 0xf7, + 0x20, 0x01, 0x00, 0x07, 0x08, 0x0c, 0x4f, 0x6f, 0x60, 0x18, 0xa0, 0x80, + 0x00, 0x28, 0x20, 0x0c, 0x08, 0x0c, 0x8c, 0xa5, 0xa1, 0x86, 0x00, 0x7e, + 0x11, 0x48, 0x20, 0x01, 0xb6, 0x35, 0x20, 0x14, 0xc2, 0x85, 0x08, 0x0c, + 0x5b, 0x41, 0x11, 0x08, 0xc2, 0xad, 0x22, 0x02, 0x00, 0x16, 0x00, 0x26, + 0x00, 0x36, 0x21, 0x10, 0x00, 0x26, 0x20, 0x19, 0x00, 0x28, 0x08, 0x0c, + 0x83, 0x20, 0x00, 0x2e, 0x08, 0x0c, 0xb4, 0x49, 0x00, 0x3e, 0x00, 0x2e, + 0x00, 0x1e, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x21, 0x10, 0x20, 0x19, + 0x00, 0x28, 0x08, 0x0c, 0x6e, 0x67, 0x00, 0x76, 0x20, 0x39, 0x00, 0x00, + 0x08, 0x0c, 0x6d, 0x74, 0x00, 0xc6, 0x60, 0x18, 0xa0, 0x65, 0x01, 0x10, + 0x08, 0x0c, 0x52, 0x1c, 0x00, 0xce, 0x2c, 0x08, 0x08, 0x0c, 0xaf, 0x3e, + 0x00, 0x7e, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, 0x08, 0x0c, 0x4f, 0xde, + 0x08, 0x0c, 0xa0, 0xdb, 0x08, 0x0c, 0x86, 0xa4, 0x08, 0x0c, 0x71, 0xe5, + 0x00, 0x05, 0x08, 0x0c, 0x8c, 0xa5, 0x0c, 0xb0, 0x08, 0x0c, 0x8c, 0xd3, + 0x0c, 0x98, 0xa1, 0x86, 0x00, 0x14, 0x1d, 0xb0, 0x08, 0x0c, 0x71, 0x02, + 0x08, 0x0c, 0x2c, 0xd1, 0x08, 0x0c, 0x9f, 0x03, 0x11, 0x88, 0x08, 0x0c, + 0x2c, 0xf7, 0x60, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x0c, 0x08, 0x0c, + 0x8c, 0xa5, 0xa1, 0x86, 0x00, 0x7e, 0x11, 0x28, 0x20, 0x01, 0xb6, 0x35, + 0x20, 0x0c, 0xc1, 0x85, 0x21, 0x02, 0x08, 0xc0, 0x08, 0x0c, 0x9f, 0x14, + 0x11, 0x18, 0x08, 0x0c, 0x8c, 0xa5, 0x08, 0x90, 0x60, 0x04, 0xa0, 0x8e, + 0x00, 0x32, 0x11, 0x58, 0x00, 0xe6, 0x00, 0xf6, 0x20, 0x71, 0xb6, 0x82, + 0x20, 0x79, 0x00, 0x00, 0x08, 0x0c, 0x30, 0x04, 0x00, 0xfe, 0x00, 0xee, + 0x08, 0x18, 0x60, 0x04, 0xa0, 0x8e, 0x00, 0x21, 0x0d, 0x50, 0xa0, 0x8e, + 0x00, 0x22, 0x09, 0x0c, 0x8c, 0xa5, 0x08, 0x04, 0x8b, 0x90, 0xa0, 0xb2, + 0x00, 0x40, 0x1a, 0x04, 0x8c, 0x9a, 0x20, 0x08, 0x00, 0x02, 0x8c, 0x1f, + 0x8c, 0x20, 0x8c, 0x23, 0x8c, 0x26, 0x8c, 0x29, 0x8c, 0x2c, 0x8c, 0x1d, + 0x8c, 0x1d, 0x8c, 0x1d, 0x8c, 0x1d, 0x8c, 0x1d, 0x8c, 0x1d, 0x8c, 0x1d, + 0x8c, 0x1d, 0x8c, 0x1d, 0x8c, 0x1d, 0x8c, 0x1d, 0x8c, 0x1d, 0x8c, 0x1d, + 0x8c, 0x1d, 0x8c, 0x1d, 0x8c, 0x1d, 0x8c, 0x1d, 0x8c, 0x1d, 0x8c, 0x1d, + 0x8c, 0x1d, 0x8c, 0x1d, 0x8c, 0x1d, 0x8c, 0x1d, 0x8c, 0x1d, 0x8c, 0x2f, + 0x8c, 0x3e, 0x8c, 0x1d, 0x8c, 0x40, 0x8c, 0x3e, 0x8c, 0x1d, 0x8c, 0x1d, + 0x8c, 0x1d, 0x8c, 0x1d, 0x8c, 0x1d, 0x8c, 0x3e, 0x8c, 0x3e, 0x8c, 0x1d, + 0x8c, 0x1d, 0x8c, 0x1d, 0x8c, 0x1d, 0x8c, 0x1d, 0x8c, 0x1d, 0x8c, 0x1d, + 0x8c, 0x1d, 0x8c, 0x7a, 0x8c, 0x3e, 0x8c, 0x1d, 0x8c, 0x3a, 0x8c, 0x1d, + 0x8c, 0x1d, 0x8c, 0x1d, 0x8c, 0x3b, 0x8c, 0x1d, 0x8c, 0x1d, 0x8c, 0x1d, + 0x8c, 0x3e, 0x8c, 0x71, 0x8c, 0x1d, 0x08, 0x0c, 0x15, 0x1a, 0x00, 0xf0, + 0x20, 0x01, 0x00, 0x0b, 0x04, 0x60, 0x20, 0x01, 0x00, 0x03, 0x04, 0x48, + 0x20, 0x01, 0x00, 0x05, 0x04, 0x30, 0x20, 0x01, 0x00, 0x01, 0x04, 0x18, + 0x20, 0x01, 0x00, 0x09, 0x04, 0x00, 0x08, 0x0c, 0x71, 0x02, 0x60, 0x03, + 0x00, 0x05, 0x20, 0x01, 0xb8, 0xb8, 0x20, 0x04, 0x60, 0x3e, 0x08, 0x0c, + 0x71, 0xe5, 0x00, 0xa0, 0x00, 0x18, 0x00, 0x10, 0x08, 0x0c, 0x4f, 0x6f, + 0x08, 0x04, 0x8c, 0x8b, 0x08, 0x0c, 0x71, 0x02, 0x20, 0x01, 0xb8, 0xb6, + 0x20, 0x04, 0x60, 0x16, 0x20, 0x01, 0xb8, 0xb8, 0x20, 0x04, 0x60, 0x3e, + 0x60, 0x03, 0x00, 0x04, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x05, 0x08, 0x0c, + 0x4f, 0x6f, 0x08, 0x0c, 0x71, 0x02, 0x60, 0x03, 0x00, 0x02, 0x20, 0x01, + 0xb8, 0xb8, 0x20, 0x04, 0x60, 0x3e, 0x00, 0x36, 0x20, 0x19, 0xb6, 0x5d, + 0x23, 0x04, 0xa0, 0x84, 0xff, 0x00, 0x11, 0x20, 0x20, 0x01, 0xb8, 0xb6, + 0x20, 0x1c, 0x00, 0x40, 0x80, 0x07, 0xa0, 0x9a, 0x00, 0x04, 0x0e, 0xc0, + 0x80, 0x03, 0x80, 0x1b, 0x83, 0x1b, 0xa3, 0x18, 0x63, 0x16, 0x00, 0x3e, + 0x08, 0x0c, 0x71, 0xe5, 0x08, 0xe8, 0x08, 0x0c, 0x71, 0x02, 0x08, 0x0c, + 0xa0, 0xdb, 0x08, 0x0c, 0x86, 0xa4, 0x08, 0x0c, 0x71, 0xe5, 0x08, 0xa0, + 0x00, 0xe6, 0x00, 0xf6, 0x20, 0x71, 0xb6, 0x82, 0x20, 0x79, 0x00, 0x00, + 0x08, 0x0c, 0x30, 0x04, 0x00, 0xfe, 0x00, 0xee, 0x08, 0x0c, 0x71, 0x02, + 0x08, 0x0c, 0x86, 0xa4, 0x08, 0x0c, 0x71, 0xe5, 0x08, 0x18, 0x08, 0x0c, + 0x71, 0x02, 0x20, 0x01, 0xb8, 0xb8, 0x20, 0x04, 0x60, 0x3e, 0x60, 0x03, + 0x00, 0x02, 0x20, 0x01, 0xb8, 0xb6, 0x20, 0x04, 0x60, 0x16, 0x08, 0x0c, + 0x71, 0xe5, 0x00, 0x05, 0x26, 0x00, 0x20, 0x08, 0x00, 0x02, 0x8c, 0xa3, + 0x8c, 0xa3, 0x8c, 0xa3, 0x8c, 0x8b, 0x8c, 0x8b, 0x8c, 0xa3, 0x08, 0x0c, + 0x15, 0x1a, 0x00, 0xe6, 0x00, 0x26, 0x00, 0x16, 0x08, 0x0c, 0x9d, 0x16, + 0x05, 0x08, 0x60, 0x10, 0x20, 0x70, 0x70, 0x34, 0xa0, 0x86, 0x01, 0x39, + 0x11, 0x48, 0x20, 0x01, 0x00, 0x30, 0x20, 0x09, 0x00, 0x00, 0x20, 0x11, + 0x40, 0x05, 0x08, 0x0c, 0xa1, 0x92, 0x00, 0x90, 0x70, 0x38, 0xd0, 0xfc, + 0x01, 0x78, 0x70, 0x07, 0x00, 0x00, 0x00, 0x16, 0x60, 0x04, 0xa0, 0x8e, + 0x00, 0x21, 0x01, 0x60, 0xa0, 0x8e, 0x00, 0x3d, 0x01, 0x48, 0x00, 0x1e, + 0x70, 0x37, 0x01, 0x03, 0x70, 0x33, 0x01, 0x00, 0x00, 0x1e, 0x00, 0x2e, + 0x00, 0xee, 0x00, 0x05, 0x00, 0x1e, 0x00, 0x09, 0x0c, 0xc8, 0x00, 0xe6, + 0xac, 0xf0, 0x00, 0x04, 0x2e, 0x74, 0x70, 0x00, 0x20, 0x70, 0x70, 0x37, + 0x01, 0x03, 0x70, 0x23, 0x80, 0x01, 0x00, 0xee, 0x00, 0x05, 0x00, 0xd6, + 0x66, 0x18, 0x26, 0x68, 0x68, 0x04, 0xa0, 0x84, 0x00, 0xff, 0x00, 0xde, + 0xa0, 0xb2, 0x00, 0x0c, 0x1a, 0x0c, 0x15, 0x1a, 0x66, 0x04, 0xa6, 0xb6, + 0x00, 0x43, 0x11, 0x20, 0x08, 0x0c, 0xa1, 0x4e, 0x08, 0x04, 0x8d, 0x44, + 0x66, 0x04, 0xa6, 0xb6, 0x00, 0x33, 0x11, 0x20, 0x08, 0x0c, 0xa0, 0xfe, + 0x08, 0x04, 0x8d, 0x44, 0x66, 0x04, 0xa6, 0xb6, 0x00, 0x28, 0x11, 0x20, + 0x08, 0x0c, 0x9f, 0x44, 0x08, 0x04, 0x8d, 0x44, 0x66, 0x04, 0xa6, 0xb6, + 0x00, 0x29, 0x11, 0x18, 0x08, 0x0c, 0x9f, 0x5b, 0x04, 0xd8, 0x66, 0x04, + 0xa6, 0xb6, 0x00, 0x1f, 0x11, 0x18, 0x08, 0x0c, 0x88, 0x12, 0x04, 0xa0, + 0x66, 0x04, 0xa6, 0xb6, 0x00, 0x00, 0x11, 0x18, 0x08, 0x0c, 0x8a, 0x66, + 0x04, 0x68, 0x66, 0x04, 0xa6, 0xb6, 0x00, 0x22, 0x11, 0x18, 0x08, 0x0c, + 0x88, 0x3a, 0x04, 0x30, 0x66, 0x04, 0xa6, 0xb6, 0x00, 0x35, 0x11, 0x18, + 0x08, 0x0c, 0x88, 0xa1, 0x00, 0xf8, 0x66, 0x04, 0xa6, 0xb6, 0x00, 0x39, + 0x11, 0x18, 0x08, 0x0c, 0x8a, 0x02, 0x00, 0xc0, 0x66, 0x04, 0xa6, 0xb6, + 0x00, 0x3d, 0x11, 0x18, 0x08, 0x0c, 0x88, 0x54, 0x00, 0x88, 0x66, 0x04, + 0xa6, 0xb6, 0x00, 0x44, 0x11, 0x18, 0x08, 0x0c, 0x88, 0x74, 0x00, 0x50, + 0xa1, 0xb6, 0x00, 0x15, 0x11, 0x10, 0x00, 0x53, 0x00, 0x28, 0xa1, 0xb6, + 0x00, 0x16, 0x11, 0x18, 0x08, 0x04, 0x8f, 0x08, 0x00, 0x05, 0x08, 0x0c, + 0x86, 0xef, 0x0c, 0xe0, 0x8d, 0x6b, 0x8d, 0x6e, 0x8d, 0x6b, 0x8d, 0xb0, + 0x8d, 0x6b, 0x8e, 0x95, 0x8f, 0x16, 0x8d, 0x6b, 0x8d, 0x6b, 0x8e, 0xe4, + 0x8d, 0x6b, 0x8e, 0xf8, 0xa1, 0xb6, 0x00, 0x48, 0x01, 0x40, 0x20, 0xe1, + 0x00, 0x05, 0x3d, 0x18, 0x3e, 0x20, 0x2c, 0x10, 0x08, 0x0c, 0x18, 0x63, + 0x00, 0x05, 0x00, 0xe6, 0xac, 0xf0, 0x00, 0x04, 0x2e, 0x74, 0x70, 0x00, + 0x20, 0x70, 0x70, 0x37, 0x01, 0x03, 0x00, 0xee, 0x08, 0x0c, 0x86, 0xa4, + 0x00, 0x05, 0xe0, 0x00, 0xe0, 0x00, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, + 0xb6, 0x00, 0x70, 0x84, 0xa0, 0x86, 0x00, 0x74, 0x15, 0x30, 0x08, 0x0c, + 0xaf, 0x15, 0x11, 0xb0, 0x00, 0xd6, 0x60, 0x18, 0x20, 0x68, 0x70, 0x30, + 0xd0, 0x8c, 0x01, 0x28, 0x68, 0x00, 0xd0, 0xbc, 0x01, 0x10, 0xc0, 0xc5, + 0x68, 0x02, 0x00, 0xd9, 0x00, 0xde, 0x20, 0x01, 0x00, 0x06, 0x08, 0x0c, + 0x4f, 0x6f, 0x08, 0x0c, 0x2c, 0xf7, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0x78, + 0x20, 0x01, 0x00, 0x0a, 0x08, 0x0c, 0x4f, 0x6f, 0x08, 0x0c, 0x2c, 0xf7, + 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x01, 0x08, 0x0c, 0x6d, 0x45, + 0x00, 0x10, 0x08, 0x0c, 0x8e, 0x82, 0x00, 0xee, 0x00, 0x05, 0x68, 0x00, + 0xd0, 0x84, 0x01, 0x68, 0x20, 0x01, 0x00, 0x00, 0x08, 0x0c, 0x4f, 0x5d, + 0x20, 0x69, 0xb6, 0x52, 0x68, 0x04, 0xd0, 0xa4, 0x01, 0x20, 0x20, 0x01, + 0x00, 0x06, 0x08, 0x0c, 0x4f, 0x9c, 0x00, 0x05, 0x00, 0xd6, 0x20, 0x11, + 0xb6, 0x21, 0x22, 0x04, 0xa0, 0x86, 0x00, 0x74, 0x19, 0x04, 0x8e, 0x7f, + 0x60, 0x18, 0x20, 0x68, 0x6a, 0xa0, 0xa2, 0x86, 0x00, 0x7e, 0x11, 0x20, + 0x08, 0x0c, 0x90, 0x2e, 0x08, 0x04, 0x8e, 0x1e, 0x08, 0x0c, 0x90, 0x24, + 0x60, 0x18, 0x20, 0x68, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x14, 0xa2, 0x86, + 0x00, 0x80, 0x11, 0xc0, 0x68, 0x13, 0x00, 0xff, 0x68, 0x17, 0xff, 0xfc, + 0x60, 0x10, 0xa0, 0x05, 0x01, 0x38, 0x20, 0x68, 0x68, 0x07, 0x00, 0x00, + 0x68, 0x37, 0x01, 0x03, 0x68, 0x33, 0x02, 0x00, 0x20, 0x01, 0x00, 0x06, + 0x08, 0x0c, 0x4f, 0x6f, 0x08, 0x0c, 0x2c, 0xf7, 0x08, 0x0c, 0x86, 0xa4, + 0x08, 0x04, 0x8e, 0x80, 0x00, 0xe6, 0x20, 0x71, 0xb6, 0x35, 0x2e, 0x04, + 0xd0, 0x9c, 0x01, 0x88, 0x20, 0x71, 0xbc, 0x80, 0x71, 0x08, 0x72, 0x0c, + 0xa1, 0x8c, 0x00, 0xff, 0x11, 0x18, 0xa2, 0x84, 0xff, 0x00, 0x01, 0x38, + 0x60, 0x18, 0x20, 0x70, 0x70, 0xa0, 0xd0, 0xbc, 0x11, 0x10, 0x71, 0x12, + 0x72, 0x16, 0x00, 0xee, 0x60, 0x10, 0xa0, 0x05, 0x01, 0x98, 0x20, 0x68, + 0x68, 0x38, 0xd0, 0xf4, 0x01, 0x78, 0x68, 0x34, 0xa0, 0x84, 0x00, 0xff, + 0xa0, 0x86, 0x00, 0x39, 0x19, 0x58, 0x20, 0x01, 0x00, 0x00, 0x20, 0x09, + 0x00, 0x00, 0x20, 0x11, 0x40, 0x00, 0x08, 0x0c, 0xa1, 0x92, 0x08, 0x40, + 0x20, 0x01, 0x00, 0x04, 0x08, 0x0c, 0x4f, 0x6f, 0x60, 0x03, 0x00, 0x01, + 0x60, 0x07, 0x00, 0x03, 0x08, 0x0c, 0x6d, 0x45, 0x08, 0x04, 0x8e, 0x80, + 0x68, 0x5c, 0xd0, 0xe4, 0x01, 0xd8, 0x08, 0x0c, 0xa0, 0x8e, 0x08, 0x0c, + 0x5b, 0x41, 0x01, 0x18, 0xd0, 0xdc, 0x19, 0x04, 0x8d, 0xda, 0x20, 0x11, + 0xb6, 0x35, 0x22, 0x04, 0xc0, 0xad, 0x20, 0x12, 0x20, 0x01, 0xb8, 0x8f, + 0x20, 0x04, 0x00, 0xf6, 0x20, 0x79, 0x01, 0x00, 0x78, 0xe3, 0x00, 0x00, + 0x08, 0x0c, 0x28, 0xa7, 0x78, 0xe2, 0x00, 0xfe, 0x08, 0x04, 0x8d, 0xda, + 0x08, 0x0c, 0xa0, 0xc4, 0x20, 0x11, 0xb6, 0x35, 0x22, 0x04, 0xc0, 0xa5, + 0x20, 0x12, 0x00, 0x06, 0x08, 0x0c, 0xb0, 0x37, 0x00, 0x0e, 0x19, 0x04, + 0x8d, 0xda, 0xc0, 0xb5, 0x20, 0x12, 0x20, 0x01, 0x00, 0x06, 0x08, 0x0c, + 0x4f, 0x6f, 0x20, 0x01, 0x00, 0x00, 0x08, 0x0c, 0x4f, 0x5d, 0x00, 0xc6, + 0x20, 0x09, 0x00, 0xef, 0x00, 0xf6, 0x20, 0x79, 0x01, 0x00, 0x79, 0xea, + 0x79, 0x32, 0x79, 0x36, 0x00, 0xfe, 0x08, 0x0c, 0x28, 0x7c, 0x00, 0xf6, + 0x20, 0x79, 0xb6, 0x00, 0x79, 0x76, 0x21, 0x00, 0x20, 0x09, 0x00, 0x00, + 0x08, 0x0c, 0x28, 0x52, 0x79, 0x52, 0x00, 0xfe, 0x81, 0x08, 0x08, 0x0c, + 0x4f, 0xbf, 0x2c, 0x00, 0x00, 0xce, 0x19, 0x04, 0x8d, 0xda, 0x60, 0x1a, + 0x20, 0x01, 0x00, 0x02, 0x08, 0x0c, 0x4f, 0x6f, 0x60, 0x1f, 0x00, 0x01, + 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x02, 0x08, 0x0c, 0x6d, 0x45, + 0x00, 0x08, 0x00, 0x11, 0x00, 0xde, 0x00, 0x05, 0x20, 0x01, 0x00, 0x07, + 0x08, 0x0c, 0x4f, 0x6f, 0x20, 0x01, 0xb6, 0x00, 0x20, 0x04, 0xa0, 0x86, + 0x00, 0x03, 0x11, 0x20, 0x20, 0x01, 0x00, 0x07, 0x08, 0x0c, 0x4f, 0x9c, + 0x08, 0x0c, 0x2c, 0xf7, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0x05, 0x00, 0xe6, + 0x00, 0x26, 0x00, 0x16, 0x20, 0x71, 0xb6, 0x00, 0x70, 0x84, 0xa0, 0x86, + 0x00, 0x14, 0x15, 0xf0, 0x70, 0x00, 0xa0, 0x86, 0x00, 0x03, 0x11, 0x28, + 0x60, 0x10, 0xa0, 0x05, 0x11, 0x10, 0x08, 0x0c, 0x3f, 0x85, 0x00, 0xd6, + 0x60, 0x18, 0x20, 0x68, 0x08, 0x0c, 0x50, 0xbd, 0x08, 0x0c, 0x8d, 0x9f, + 0x00, 0xde, 0x08, 0x0c, 0x90, 0xdd, 0x15, 0x50, 0x00, 0xd6, 0x60, 0x18, + 0x20, 0x68, 0x68, 0x90, 0x00, 0xde, 0xa0, 0x05, 0x05, 0x18, 0x20, 0x01, + 0x00, 0x06, 0x08, 0x0c, 0x4f, 0x6f, 0x00, 0xe6, 0x60, 0x10, 0xa0, 0x75, + 0x01, 0xa8, 0x70, 0x34, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x86, 0x00, 0x39, + 0x11, 0x48, 0x20, 0x01, 0x00, 0x00, 0x20, 0x09, 0x00, 0x00, 0x20, 0x11, + 0x40, 0x00, 0x08, 0x0c, 0xa1, 0x92, 0x00, 0x30, 0x70, 0x07, 0x00, 0x00, + 0x70, 0x37, 0x01, 0x03, 0x70, 0x33, 0x02, 0x00, 0x00, 0xee, 0x08, 0x0c, + 0x2c, 0xf7, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0x20, 0x08, 0x0c, 0x8c, 0xa5, + 0x08, 0x0c, 0x8e, 0x82, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, + 0x20, 0x11, 0xb6, 0x21, 0x22, 0x04, 0xa0, 0x86, 0x00, 0x14, 0x11, 0x58, + 0x20, 0x01, 0x00, 0x02, 0x08, 0x0c, 0x4f, 0x6f, 0x60, 0x03, 0x00, 0x01, + 0x60, 0x07, 0x00, 0x01, 0x08, 0x0c, 0x6d, 0x45, 0x00, 0x10, 0x08, 0x0c, + 0x8e, 0x82, 0x00, 0x05, 0x20, 0x11, 0xb6, 0x21, 0x22, 0x04, 0xa0, 0x86, + 0x00, 0x04, 0x11, 0x38, 0x20, 0x01, 0x00, 0x07, 0x08, 0x0c, 0x4f, 0x6f, + 0x08, 0x0c, 0x86, 0xa4, 0x00, 0x10, 0x08, 0x0c, 0x8e, 0x82, 0x00, 0x05, + 0x00, 0x0b, 0x00, 0x05, 0x8d, 0x6b, 0x8f, 0x21, 0x8d, 0x6b, 0x8f, 0x55, + 0x8d, 0x6b, 0x8f, 0xe0, 0x8f, 0x16, 0x8d, 0x6b, 0x8d, 0x6b, 0x8f, 0xf3, + 0x8d, 0x6b, 0x90, 0x03, 0x66, 0x04, 0xa6, 0x86, 0x00, 0x03, 0x09, 0x04, + 0x8e, 0x95, 0xa6, 0xb6, 0x00, 0x1e, 0x11, 0x10, 0x08, 0x0c, 0x86, 0xa4, + 0x00, 0x05, 0x00, 0xd6, 0x00, 0xc6, 0x08, 0x0c, 0x90, 0x13, 0x11, 0x78, + 0x20, 0x01, 0x00, 0x00, 0x08, 0x0c, 0x4f, 0x5d, 0x20, 0x01, 0x00, 0x02, + 0x08, 0x0c, 0x4f, 0x6f, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x02, + 0x08, 0x0c, 0x6d, 0x45, 0x00, 0xe8, 0x20, 0x09, 0xbc, 0x8e, 0x21, 0x04, + 0xa0, 0x86, 0x00, 0x09, 0x11, 0x60, 0x60, 0x18, 0x20, 0x68, 0x68, 0x40, + 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x05, 0x01, 0x70, 0x80, 0x01, 0x68, 0x42, + 0x60, 0x17, 0x00, 0x0a, 0x00, 0x58, 0x20, 0x09, 0xbc, 0x8f, 0x21, 0x04, + 0xa0, 0x84, 0xff, 0x00, 0xa0, 0x86, 0x19, 0x00, 0x11, 0x08, 0x08, 0xd0, + 0x08, 0x0c, 0x8e, 0x82, 0x00, 0xce, 0x00, 0xde, 0x00, 0x05, 0x00, 0x26, + 0x20, 0x11, 0x00, 0x00, 0x08, 0x0c, 0x90, 0x21, 0x00, 0xd6, 0x20, 0x69, + 0xb8, 0x9e, 0x2d, 0x04, 0xa0, 0x05, 0x01, 0x68, 0x60, 0x18, 0x20, 0x68, + 0x68, 0xa0, 0xa0, 0x86, 0x00, 0x7e, 0x11, 0x38, 0x20, 0x69, 0xb6, 0x1d, + 0x2d, 0x04, 0x80, 0x00, 0x20, 0x6a, 0x00, 0xde, 0x00, 0x10, 0x00, 0xde, + 0x00, 0x78, 0x20, 0x01, 0x00, 0x00, 0x08, 0x0c, 0x4f, 0x5d, 0x20, 0x01, + 0x00, 0x02, 0x08, 0x0c, 0x4f, 0x6f, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, + 0x00, 0x02, 0x08, 0x0c, 0x6d, 0x45, 0x04, 0x80, 0x00, 0xd6, 0x60, 0x10, + 0x20, 0x68, 0x08, 0x0c, 0x9d, 0x16, 0x00, 0xde, 0x01, 0x08, 0x6a, 0x34, + 0x08, 0x0c, 0x8c, 0xa5, 0x20, 0x09, 0xbc, 0x8e, 0x21, 0x34, 0xa6, 0xb4, + 0x00, 0xff, 0xa6, 0x86, 0x00, 0x05, 0x05, 0x00, 0xa6, 0x86, 0x00, 0x0b, + 0x01, 0xc8, 0x20, 0x09, 0xbc, 0x8f, 0x21, 0x04, 0xa0, 0x84, 0xff, 0x00, + 0x11, 0x18, 0xa6, 0x86, 0x00, 0x09, 0x01, 0xa0, 0xa0, 0x86, 0x19, 0x00, + 0x11, 0x68, 0xa6, 0x86, 0x00, 0x09, 0x01, 0x70, 0x20, 0x01, 0x00, 0x04, + 0x08, 0x0c, 0x4f, 0x6f, 0x20, 0x01, 0x00, 0x28, 0x60, 0x16, 0x60, 0x07, + 0x00, 0x4b, 0x00, 0x10, 0x08, 0x0c, 0x8e, 0x82, 0x00, 0x2e, 0x00, 0x05, + 0x00, 0xd6, 0xa2, 0x86, 0x01, 0x39, 0x01, 0x60, 0x60, 0x10, 0x20, 0x68, + 0x08, 0x0c, 0x9d, 0x16, 0x01, 0x48, 0x68, 0x34, 0xa0, 0x86, 0x01, 0x39, + 0x01, 0x18, 0x68, 0x38, 0xd0, 0xfc, 0x01, 0x10, 0x00, 0xde, 0x0c, 0x50, + 0x60, 0x18, 0x20, 0x68, 0x68, 0x40, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x05, + 0x01, 0x40, 0x80, 0x01, 0x68, 0x42, 0x60, 0x17, 0x00, 0x0a, 0x60, 0x07, + 0x00, 0x16, 0x00, 0xde, 0x08, 0xe8, 0x68, 0xa0, 0xa0, 0x86, 0x00, 0x7e, + 0x11, 0x38, 0x00, 0xe6, 0x20, 0x71, 0xb6, 0x00, 0x08, 0x0c, 0x4c, 0x28, + 0x00, 0xee, 0x00, 0x10, 0x08, 0x0c, 0x2c, 0xd1, 0x00, 0xde, 0x08, 0x60, + 0x08, 0x0c, 0x90, 0x21, 0x11, 0x58, 0x20, 0x01, 0x00, 0x04, 0x08, 0x0c, + 0x4f, 0x6f, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x03, 0x08, 0x0c, + 0x6d, 0x45, 0x00, 0x20, 0x08, 0x0c, 0x8c, 0xa5, 0x08, 0x0c, 0x8e, 0x82, + 0x00, 0x05, 0x04, 0x69, 0x11, 0x58, 0x20, 0x01, 0x00, 0x08, 0x08, 0x0c, + 0x4f, 0x6f, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x05, 0x08, 0x0c, + 0x6d, 0x45, 0x00, 0x10, 0x08, 0x0c, 0x8e, 0x82, 0x00, 0x05, 0x00, 0xe9, + 0x11, 0x58, 0x20, 0x01, 0x00, 0x0a, 0x08, 0x0c, 0x4f, 0x6f, 0x60, 0x03, + 0x00, 0x01, 0x60, 0x07, 0x00, 0x01, 0x08, 0x0c, 0x6d, 0x45, 0x00, 0x10, + 0x08, 0x0c, 0x8e, 0x82, 0x00, 0x05, 0x20, 0x09, 0xbc, 0x8e, 0x21, 0x04, + 0xa0, 0x86, 0x00, 0x03, 0x11, 0x38, 0x20, 0x09, 0xbc, 0x8f, 0x21, 0x04, + 0xa0, 0x84, 0xff, 0x00, 0xa0, 0x86, 0x2a, 0x00, 0x00, 0x05, 0xa0, 0x85, + 0x00, 0x01, 0x00, 0x05, 0x00, 0xc6, 0x00, 0x16, 0xac, 0x88, 0x00, 0x06, + 0x21, 0x64, 0x08, 0x0c, 0x50, 0x2a, 0x00, 0x1e, 0x00, 0xce, 0x00, 0x05, + 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0x36, 0x00, 0x16, 0x60, 0x18, + 0x20, 0x68, 0x20, 0x71, 0xb6, 0x35, 0x2e, 0x04, 0xa0, 0x85, 0x00, 0x03, + 0x20, 0x72, 0x08, 0x0c, 0x90, 0xb2, 0x05, 0x60, 0x20, 0x09, 0xb6, 0x35, + 0x21, 0x04, 0xc0, 0xcd, 0x20, 0x0a, 0x20, 0x01, 0xb6, 0x53, 0x20, 0x04, + 0xd0, 0xa4, 0x01, 0x58, 0xa0, 0x06, 0x20, 0x20, 0x20, 0x09, 0x00, 0x2a, + 0x08, 0x0c, 0xb1, 0xa4, 0x20, 0x01, 0xb6, 0x0c, 0x20, 0x0c, 0xc1, 0x95, + 0x21, 0x02, 0x20, 0x19, 0x00, 0x2a, 0x20, 0x09, 0x00, 0x01, 0x08, 0x0c, + 0x2c, 0xa4, 0x20, 0x71, 0xb6, 0x00, 0x08, 0x0c, 0x2a, 0xed, 0x00, 0xc6, + 0x01, 0x56, 0x20, 0xa9, 0x00, 0x81, 0x20, 0x09, 0x00, 0x7f, 0x08, 0x0c, + 0x2d, 0xcc, 0x81, 0x08, 0x1f, 0x04, 0x90, 0x63, 0x01, 0x5e, 0x00, 0xce, + 0x08, 0x0c, 0x90, 0x24, 0x68, 0x13, 0x00, 0xff, 0x68, 0x17, 0xff, 0xfe, + 0x20, 0x71, 0xbc, 0x80, 0x20, 0x79, 0x01, 0x00, 0x2e, 0x04, 0xa0, 0x84, + 0x00, 0xff, 0x20, 0x69, 0xb6, 0x1c, 0x20, 0x6a, 0x78, 0xe6, 0x00, 0x06, + 0x8e, 0x70, 0x2e, 0x04, 0x20, 0x69, 0xb6, 0x1d, 0x20, 0x6a, 0x78, 0xea, + 0x78, 0x32, 0x78, 0x36, 0x20, 0x10, 0xa0, 0x84, 0xff, 0x00, 0x00, 0x1e, + 0xa1, 0x05, 0x20, 0x09, 0xb6, 0x28, 0x20, 0x0a, 0x22, 0x00, 0xa0, 0x84, + 0x00, 0xff, 0x20, 0x08, 0x08, 0x0c, 0x28, 0x7c, 0x08, 0x0c, 0x5b, 0x41, + 0x01, 0x70, 0x20, 0x69, 0xbc, 0x8e, 0x20, 0x71, 0xb8, 0xb2, 0x68, 0x10, + 0x20, 0x72, 0x68, 0x14, 0x70, 0x06, 0x68, 0x18, 0x70, 0x0a, 0x68, 0x1c, + 0x70, 0x0e, 0x08, 0x0c, 0xa0, 0x8e, 0x00, 0x40, 0x20, 0x01, 0x00, 0x06, + 0x08, 0x0c, 0x4f, 0x6f, 0x08, 0x0c, 0x2c, 0xf7, 0x08, 0x0c, 0x86, 0xa4, + 0x00, 0x1e, 0x00, 0x3e, 0x00, 0xde, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, + 0x00, 0x26, 0x00, 0x36, 0x00, 0xe6, 0x01, 0x56, 0x20, 0x19, 0xb6, 0x28, + 0x23, 0x1c, 0x83, 0xff, 0x01, 0xe8, 0x20, 0x71, 0xbc, 0x80, 0x2e, 0x14, + 0xa2, 0x94, 0x00, 0xff, 0x70, 0x04, 0xa0, 0x84, 0xff, 0x00, 0xa2, 0x05, + 0xa3, 0x06, 0x11, 0x90, 0x20, 0x11, 0xbc, 0x96, 0xad, 0x98, 0x00, 0x0a, + 0x20, 0xa9, 0x00, 0x04, 0x08, 0x0c, 0x91, 0x66, 0x11, 0x48, 0x20, 0x11, + 0xbc, 0x9a, 0xad, 0x98, 0x00, 0x06, 0x20, 0xa9, 0x00, 0x04, 0x08, 0x0c, + 0x91, 0x66, 0x11, 0x00, 0x01, 0x5e, 0x00, 0xee, 0x00, 0x3e, 0x00, 0x2e, + 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0xbc, 0x8c, 0x70, 0x04, 0xa0, 0x86, + 0x00, 0x14, 0x11, 0xa8, 0x70, 0x08, 0xa0, 0x86, 0x08, 0x00, 0x11, 0x88, + 0x70, 0x0c, 0xd0, 0xec, 0x01, 0x60, 0xa0, 0x84, 0x0f, 0x00, 0xa0, 0x86, + 0x01, 0x00, 0x11, 0x38, 0x70, 0x24, 0xd0, 0xa4, 0x11, 0x10, 0xd0, 0xac, + 0x01, 0x10, 0xa0, 0x06, 0x00, 0x10, 0xa0, 0x85, 0x00, 0x01, 0x00, 0xee, + 0x00, 0x05, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, 0x00, 0x76, 0x00, 0x56, + 0x00, 0x46, 0x00, 0x26, 0x00, 0x06, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x29, 0xb8, 0xea, 0x25, 0x2c, 0x20, 0x21, 0xb8, 0xf0, 0x24, 0x24, + 0x20, 0x61, 0xbe, 0x00, 0x20, 0x71, 0xb6, 0x00, 0x72, 0x48, 0x70, 0x68, + 0xa2, 0x02, 0x16, 0xf0, 0x08, 0x0c, 0xb1, 0xcc, 0x05, 0xa0, 0x67, 0x1c, + 0xa7, 0x86, 0x00, 0x01, 0x05, 0x80, 0xa7, 0x86, 0x00, 0x07, 0x05, 0x68, + 0x25, 0x00, 0xac, 0x06, 0x05, 0x50, 0x24, 0x00, 0xac, 0x06, 0x05, 0x38, + 0x00, 0xc6, 0x60, 0x00, 0xa0, 0x86, 0x00, 0x04, 0x11, 0x10, 0x08, 0x0c, + 0x19, 0x52, 0xa7, 0x86, 0x00, 0x08, 0x11, 0x48, 0x08, 0x0c, 0x9f, 0x14, + 0x11, 0x30, 0x00, 0xce, 0x08, 0x0c, 0x8c, 0xa5, 0x08, 0x0c, 0x9e, 0xd9, + 0x00, 0xa0, 0x60, 0x10, 0x20, 0x68, 0x08, 0x0c, 0x9d, 0x16, 0x01, 0x60, + 0xa7, 0x86, 0x00, 0x03, 0x11, 0xe8, 0x68, 0x37, 0x01, 0x03, 0x6b, 0x4a, + 0x68, 0x47, 0x00, 0x00, 0x08, 0x0c, 0x54, 0x7a, 0x08, 0x0c, 0x9e, 0xcd, + 0x08, 0x0c, 0x9e, 0xd9, 0x00, 0xce, 0xac, 0xe0, 0x00, 0x18, 0x70, 0x5c, + 0xac, 0x02, 0x12, 0x10, 0x08, 0x04, 0x91, 0x10, 0x01, 0x2e, 0x00, 0x0e, + 0x00, 0x2e, 0x00, 0x4e, 0x00, 0x5e, 0x00, 0x7e, 0x00, 0xce, 0x00, 0xde, + 0x00, 0xee, 0x00, 0x05, 0xa7, 0x86, 0x00, 0x06, 0x11, 0x18, 0x08, 0x0c, + 0xb1, 0x55, 0x0c, 0x30, 0xa7, 0x86, 0x00, 0x0a, 0x09, 0xe0, 0x08, 0xc8, + 0x22, 0x0c, 0x23, 0x04, 0xa1, 0x06, 0x11, 0x30, 0x82, 0x10, 0x83, 0x18, + 0x1f, 0x04, 0x91, 0x66, 0xa0, 0x06, 0x00, 0x05, 0x23, 0x04, 0xa1, 0x02, + 0x02, 0x18, 0x20, 0x01, 0x00, 0x01, 0x00, 0x10, 0x20, 0x01, 0x00, 0x00, + 0xa1, 0x8d, 0x00, 0x01, 0x00, 0x05, 0x60, 0x04, 0xa0, 0x8a, 0x00, 0x80, + 0x1a, 0x0c, 0x15, 0x1a, 0x08, 0x0c, 0x9f, 0x03, 0x01, 0x20, 0x08, 0x0c, + 0x9f, 0x14, 0x01, 0x68, 0x00, 0x28, 0x08, 0x0c, 0x2c, 0xf7, 0x08, 0x0c, + 0x9f, 0x14, 0x01, 0x38, 0x08, 0x0c, 0x71, 0x02, 0x08, 0x0c, 0x86, 0xa4, + 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x05, 0x08, 0x0c, 0x8c, 0xa5, 0x0c, 0xb0, + 0xa1, 0x82, 0x00, 0x40, 0x00, 0x02, 0x91, 0xac, 0x91, 0xac, 0x91, 0xac, + 0x91, 0xac, 0x91, 0xac, 0x91, 0xac, 0x91, 0xac, 0x91, 0xac, 0x91, 0xac, + 0x91, 0xac, 0x91, 0xac, 0x91, 0xae, 0x91, 0xae, 0x91, 0xae, 0x91, 0xae, + 0x91, 0xac, 0x91, 0xac, 0x91, 0xac, 0x91, 0xae, 0x08, 0x0c, 0x15, 0x1a, + 0x60, 0x0b, 0xff, 0xff, 0x60, 0x03, 0x00, 0x01, 0x61, 0x06, 0x08, 0x0c, + 0x6c, 0xff, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x71, 0xe5, + 0x01, 0x2e, 0x00, 0x05, 0xa1, 0x86, 0x00, 0x13, 0x11, 0x28, 0x60, 0x04, + 0xa0, 0x82, 0x00, 0x40, 0x08, 0x04, 0x92, 0x48, 0xa1, 0x86, 0x00, 0x27, + 0x11, 0xe8, 0x08, 0x0c, 0x71, 0x02, 0x08, 0x0c, 0x2c, 0xd1, 0x00, 0xd6, + 0x61, 0x10, 0x21, 0x68, 0x08, 0x0c, 0x9d, 0x16, 0x01, 0x68, 0x68, 0x37, + 0x01, 0x03, 0x68, 0x4b, 0x00, 0x29, 0x68, 0x47, 0x00, 0x00, 0x69, 0x4c, + 0xc1, 0xc5, 0x69, 0x4e, 0x08, 0x0c, 0x54, 0x7a, 0x08, 0x0c, 0x9e, 0xcd, + 0x00, 0xde, 0x08, 0x0c, 0x86, 0xa4, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x05, + 0xa1, 0x86, 0x00, 0x14, 0x11, 0x20, 0x60, 0x04, 0xa0, 0x82, 0x00, 0x40, + 0x04, 0x28, 0xa1, 0x86, 0x00, 0x46, 0x01, 0x38, 0xa1, 0x86, 0x00, 0x45, + 0x01, 0x20, 0xa1, 0x86, 0x00, 0x47, 0x19, 0x0c, 0x15, 0x1a, 0x20, 0x01, + 0x01, 0x09, 0x20, 0x04, 0xd0, 0x84, 0x01, 0x98, 0x01, 0x26, 0x20, 0x91, + 0x28, 0x00, 0x00, 0x06, 0x00, 0x16, 0x00, 0x26, 0x08, 0x0c, 0x6b, 0xe6, + 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x0e, 0x01, 0x2e, 0xe0, 0x00, 0x60, 0x00, + 0xa0, 0x86, 0x00, 0x02, 0x11, 0x10, 0x08, 0x04, 0x92, 0x86, 0x08, 0x0c, + 0x86, 0xef, 0x00, 0x05, 0x00, 0x02, 0x92, 0x26, 0x92, 0x24, 0x92, 0x24, + 0x92, 0x24, 0x92, 0x24, 0x92, 0x24, 0x92, 0x24, 0x92, 0x24, 0x92, 0x24, + 0x92, 0x24, 0x92, 0x24, 0x92, 0x41, 0x92, 0x41, 0x92, 0x41, 0x92, 0x41, + 0x92, 0x24, 0x92, 0x41, 0x92, 0x24, 0x92, 0x41, 0x08, 0x0c, 0x15, 0x1a, + 0x08, 0x0c, 0x71, 0x02, 0x00, 0xd6, 0x61, 0x10, 0x21, 0x68, 0x08, 0x0c, + 0x9d, 0x16, 0x01, 0x68, 0x68, 0x37, 0x01, 0x03, 0x68, 0x4b, 0x00, 0x06, + 0x68, 0x47, 0x00, 0x00, 0x68, 0x50, 0xc0, 0xec, 0x68, 0x52, 0x08, 0x0c, + 0x54, 0x7a, 0x08, 0x0c, 0x9e, 0xcd, 0x00, 0xde, 0x08, 0x0c, 0x86, 0xa4, + 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x05, 0x08, 0x0c, 0x71, 0x02, 0x08, 0x0c, + 0x86, 0xa4, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x05, 0x00, 0x02, 0x92, 0x5e, + 0x92, 0x5c, 0x92, 0x5c, 0x92, 0x5c, 0x92, 0x5c, 0x92, 0x5c, 0x92, 0x5c, + 0x92, 0x5c, 0x92, 0x5c, 0x92, 0x5c, 0x92, 0x5c, 0x92, 0x70, 0x92, 0x70, + 0x92, 0x70, 0x92, 0x70, 0x92, 0x5c, 0x92, 0x7f, 0x92, 0x5c, 0x92, 0x70, + 0x08, 0x0c, 0x15, 0x1a, 0x08, 0x0c, 0x71, 0x02, 0x20, 0x01, 0xb8, 0xb8, + 0x20, 0x04, 0x60, 0x3e, 0x60, 0x03, 0x00, 0x02, 0x08, 0x0c, 0x71, 0xe5, + 0x60, 0x10, 0xa0, 0x88, 0x00, 0x13, 0x21, 0x04, 0xa0, 0x85, 0x04, 0x00, + 0x20, 0x0a, 0x00, 0x05, 0x08, 0x0c, 0x71, 0x02, 0x20, 0x01, 0xb8, 0xb6, + 0x20, 0x04, 0x60, 0x16, 0x20, 0x01, 0xb8, 0xb8, 0x20, 0x04, 0x60, 0x3e, + 0x60, 0x03, 0x00, 0x0f, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x05, 0x08, 0x0c, + 0x71, 0x02, 0x08, 0x0c, 0x86, 0xa4, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x05, + 0xa1, 0x82, 0x00, 0x40, 0x00, 0x02, 0x92, 0x9c, 0x92, 0x9c, 0x92, 0x9c, + 0x92, 0x9c, 0x92, 0x9c, 0x92, 0x9e, 0x93, 0x86, 0x93, 0xb5, 0x92, 0x9c, + 0x92, 0x9c, 0x92, 0x9c, 0x92, 0x9c, 0x92, 0x9c, 0x92, 0x9c, 0x92, 0x9c, + 0x92, 0x9c, 0x92, 0x9c, 0x92, 0x9c, 0x92, 0x9c, 0x08, 0x0c, 0x15, 0x1a, + 0x00, 0xe6, 0x00, 0xd6, 0x60, 0x3f, 0x00, 0x00, 0x20, 0x71, 0xbc, 0x80, + 0x71, 0x24, 0x61, 0x0a, 0x20, 0x71, 0xbc, 0x8c, 0x61, 0x10, 0x21, 0x68, + 0x76, 0x14, 0xa6, 0xb4, 0x0f, 0xff, 0x86, 0xff, 0x09, 0x04, 0x93, 0x4c, + 0xa6, 0x8c, 0x0c, 0x00, 0x05, 0x18, 0x00, 0xf6, 0x2c, 0x78, 0x08, 0x0c, + 0x53, 0x77, 0x00, 0xfe, 0x01, 0xc8, 0x68, 0x4c, 0xd0, 0xac, 0x01, 0xb0, + 0x60, 0x20, 0xd0, 0xdc, 0x11, 0x98, 0x68, 0x50, 0xd0, 0xbc, 0x11, 0x80, + 0x73, 0x18, 0x68, 0x14, 0xa3, 0x06, 0x19, 0x04, 0x93, 0x5f, 0x73, 0x1c, + 0x68, 0x10, 0xa3, 0x1e, 0x01, 0x38, 0xd6, 0xd4, 0x09, 0x04, 0x93, 0x5f, + 0x6b, 0x14, 0xa3, 0x05, 0x19, 0x04, 0x93, 0x5f, 0x73, 0x18, 0x6b, 0x62, + 0x73, 0x1c, 0x6b, 0x5e, 0xa6, 0x8c, 0x00, 0xff, 0xa1, 0x86, 0x00, 0x02, + 0x05, 0x18, 0xa1, 0x86, 0x00, 0x28, 0x11, 0x28, 0x08, 0x0c, 0x9e, 0xf2, + 0x68, 0x4b, 0x00, 0x1c, 0x00, 0xe8, 0xd6, 0xdc, 0x01, 0xa0, 0x68, 0x4b, + 0x00, 0x15, 0x68, 0x4c, 0xd0, 0xac, 0x01, 0x70, 0x69, 0x14, 0x6a, 0x10, + 0x21, 0x00, 0xa2, 0x05, 0x01, 0x48, 0x70, 0x18, 0xa1, 0x06, 0x11, 0x18, + 0x70, 0x1c, 0xa2, 0x06, 0x01, 0x18, 0x69, 0x62, 0x6a, 0x5e, 0xc6, 0xdc, + 0x00, 0x38, 0xd6, 0xd4, 0x01, 0x18, 0x68, 0x4b, 0x00, 0x07, 0x00, 0x10, + 0x68, 0x4b, 0x00, 0x00, 0x68, 0x37, 0x01, 0x03, 0x6e, 0x46, 0xa0, 0x1e, + 0xd6, 0xc4, 0x01, 0xf0, 0xa6, 0x86, 0x01, 0x00, 0x11, 0x40, 0x20, 0x01, + 0xbc, 0x99, 0x20, 0x04, 0xa0, 0x05, 0x11, 0x18, 0xc6, 0xc4, 0x08, 0x04, + 0x92, 0xad, 0x73, 0x28, 0x73, 0x2c, 0x6b, 0x56, 0x83, 0xff, 0x01, 0x70, + 0xa3, 0x8a, 0x00, 0x09, 0x02, 0x10, 0x20, 0x19, 0x00, 0x08, 0x00, 0x36, + 0x23, 0x08, 0x20, 0x19, 0xbc, 0x98, 0xad, 0x90, 0x00, 0x19, 0x08, 0x0c, + 0x99, 0xc9, 0x00, 0x3e, 0xd6, 0xcc, 0x09, 0x04, 0x93, 0x75, 0x71, 0x24, + 0x69, 0x5a, 0x81, 0xff, 0x09, 0x04, 0x93, 0x75, 0xa1, 0x92, 0x00, 0x21, + 0x12, 0x60, 0x20, 0x71, 0xbc, 0x98, 0x83, 0x1c, 0x23, 0x00, 0xae, 0x18, + 0xad, 0x90, 0x00, 0x1d, 0x08, 0x0c, 0x99, 0xc9, 0x08, 0x0c, 0xa1, 0xf3, + 0x04, 0xd0, 0x68, 0x38, 0xd0, 0xfc, 0x01, 0x20, 0x20, 0x09, 0x00, 0x20, + 0x69, 0x5a, 0x0c, 0x68, 0x00, 0xf6, 0x2d, 0x78, 0x08, 0x0c, 0x99, 0x6e, + 0x00, 0xfe, 0x08, 0x0c, 0xa1, 0xf3, 0x08, 0x0c, 0x99, 0xb9, 0x04, 0x58, + 0x00, 0xf6, 0x2c, 0x78, 0x08, 0x0c, 0x53, 0x77, 0x00, 0xfe, 0x01, 0x90, + 0x68, 0x4c, 0xd0, 0xac, 0x01, 0x78, 0x60, 0x20, 0xd0, 0xdc, 0x11, 0x60, + 0x68, 0x50, 0xd0, 0xbc, 0x11, 0x48, 0x68, 0x10, 0x69, 0x14, 0xa1, 0x05, + 0x01, 0x28, 0x08, 0x0c, 0x9f, 0xf1, 0x00, 0xde, 0x00, 0xee, 0x04, 0x08, + 0x68, 0x4b, 0x00, 0x00, 0x68, 0x37, 0x01, 0x03, 0x6e, 0x46, 0x08, 0x0c, + 0x95, 0x23, 0x11, 0x48, 0x68, 0x4c, 0xd0, 0xac, 0x01, 0x30, 0x68, 0x10, + 0x69, 0x14, 0xa1, 0x15, 0x01, 0x10, 0x08, 0x0c, 0x95, 0x3f, 0x08, 0x0c, + 0x54, 0x7a, 0x62, 0x18, 0x22, 0x68, 0x6a, 0x3c, 0x82, 0xff, 0x01, 0x10, + 0x82, 0x11, 0x6a, 0x3e, 0x08, 0x0c, 0x9f, 0xbf, 0x00, 0xde, 0x00, 0xee, + 0x11, 0x10, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0x05, 0x00, 0xf6, 0x60, 0x03, + 0x00, 0x03, 0x20, 0x79, 0xbc, 0x8c, 0x7c, 0x04, 0x7b, 0x00, 0x7e, 0x0c, + 0x7d, 0x08, 0x60, 0x10, 0x20, 0x78, 0x78, 0x4c, 0xd0, 0xac, 0x01, 0x38, + 0x60, 0x03, 0x00, 0x02, 0x00, 0xfe, 0x00, 0x05, 0x21, 0x30, 0x22, 0x28, + 0x00, 0x58, 0x24, 0x00, 0x79, 0x7c, 0xa1, 0x0a, 0x23, 0x00, 0x7a, 0x80, + 0xa2, 0x13, 0x26, 0x00, 0xa1, 0x02, 0x25, 0x00, 0xa2, 0x03, 0x0e, 0x90, + 0x7c, 0x12, 0x7b, 0x16, 0x7e, 0x0a, 0x7d, 0x0e, 0x00, 0xfe, 0x60, 0x3f, + 0x00, 0x00, 0x2c, 0x10, 0x08, 0x0c, 0x1f, 0xc5, 0x08, 0x0c, 0x6d, 0x62, + 0x08, 0x0c, 0x72, 0xa2, 0x00, 0x05, 0x20, 0x01, 0xb8, 0xb8, 0x20, 0x04, + 0x60, 0x3e, 0x60, 0x03, 0x00, 0x04, 0x61, 0x10, 0x20, 0xe1, 0x00, 0x05, + 0x3d, 0x18, 0x3e, 0x20, 0x2c, 0x10, 0x08, 0x0c, 0x18, 0x63, 0x00, 0x05, + 0xa1, 0x82, 0x00, 0x40, 0x00, 0x02, 0x93, 0xda, 0x93, 0xda, 0x93, 0xda, + 0x93, 0xda, 0x93, 0xda, 0x93, 0xdc, 0x94, 0x6f, 0x93, 0xda, 0x93, 0xda, + 0x94, 0x85, 0x94, 0xeb, 0x93, 0xda, 0x93, 0xda, 0x93, 0xda, 0x93, 0xda, + 0x95, 0x09, 0x93, 0xda, 0x93, 0xda, 0x93, 0xda, 0x08, 0x0c, 0x15, 0x1a, + 0x00, 0x76, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xd6, 0x20, 0x71, 0xbc, 0x8c, + 0x61, 0x10, 0x21, 0x78, 0x76, 0x14, 0xa6, 0xb4, 0x0f, 0xff, 0x7e, 0x46, + 0x7f, 0x4c, 0xc7, 0xe5, 0x7f, 0x4e, 0x62, 0x18, 0x22, 0x68, 0x6a, 0x3c, + 0x82, 0xff, 0x01, 0x10, 0x82, 0x11, 0x6a, 0x3e, 0x86, 0xff, 0x09, 0x04, + 0x94, 0x6a, 0xa6, 0x94, 0xff, 0x00, 0xa2, 0x84, 0x0c, 0x00, 0x01, 0x20, + 0x70, 0x18, 0x78, 0x62, 0x70, 0x1c, 0x78, 0x5e, 0xa2, 0x84, 0x03, 0x00, + 0x09, 0x04, 0x94, 0x6a, 0x08, 0x0c, 0x15, 0xfd, 0x09, 0x0c, 0x15, 0x1a, + 0x2d, 0x00, 0x78, 0x4a, 0x7f, 0x4c, 0xc7, 0xcd, 0x7f, 0x4e, 0x68, 0x37, + 0x01, 0x03, 0x78, 0x38, 0x68, 0x3a, 0x78, 0x3c, 0x68, 0x3e, 0x78, 0x40, + 0x68, 0x42, 0x6e, 0x46, 0xa6, 0x8c, 0x0c, 0x00, 0x01, 0x20, 0x73, 0x18, + 0x6b, 0x62, 0x73, 0x1c, 0x6b, 0x5e, 0xa6, 0x8c, 0x00, 0xff, 0xa1, 0x86, + 0x00, 0x02, 0x01, 0x80, 0xa1, 0x86, 0x00, 0x28, 0x11, 0x18, 0x68, 0x4b, + 0x00, 0x1c, 0x00, 0x60, 0xd6, 0xdc, 0x01, 0x18, 0x68, 0x4b, 0x00, 0x15, + 0x00, 0x38, 0xd6, 0xd4, 0x01, 0x18, 0x68, 0x4b, 0x00, 0x07, 0x00, 0x10, + 0x68, 0x4b, 0x00, 0x00, 0x6f, 0x4e, 0x78, 0x50, 0x68, 0x52, 0x78, 0x54, + 0x68, 0x56, 0xa0, 0x1e, 0xd6, 0xc4, 0x01, 0x98, 0x73, 0x28, 0x73, 0x2c, + 0x6b, 0x56, 0x83, 0xff, 0x01, 0x70, 0xa3, 0x8a, 0x00, 0x09, 0x02, 0x10, + 0x20, 0x19, 0x00, 0x08, 0x00, 0x36, 0x23, 0x08, 0x20, 0x19, 0xbc, 0x98, + 0xad, 0x90, 0x00, 0x19, 0x08, 0x0c, 0x99, 0xc9, 0x00, 0x3e, 0xd6, 0xcc, + 0x01, 0xd8, 0x71, 0x24, 0x69, 0x5a, 0x81, 0xff, 0x01, 0xb8, 0xa1, 0x92, + 0x00, 0x21, 0x12, 0x50, 0x20, 0x71, 0xbc, 0x98, 0x83, 0x1c, 0x23, 0x00, + 0xae, 0x18, 0xad, 0x90, 0x00, 0x1d, 0x08, 0x0c, 0x99, 0xc9, 0x00, 0x50, + 0x78, 0x38, 0xd0, 0xfc, 0x01, 0x20, 0x20, 0x09, 0x00, 0x20, 0x69, 0x5a, + 0x0c, 0x78, 0x2d, 0x78, 0x08, 0x0c, 0x99, 0x6e, 0x00, 0xde, 0x00, 0xee, + 0x00, 0xfe, 0x00, 0x7e, 0x00, 0x05, 0x00, 0xf6, 0x60, 0x03, 0x00, 0x03, + 0x20, 0x79, 0xbc, 0x8c, 0x7c, 0x04, 0x7b, 0x00, 0x7e, 0x0c, 0x7d, 0x08, + 0x60, 0x10, 0x20, 0x78, 0x7c, 0x12, 0x7b, 0x16, 0x7e, 0x0a, 0x7d, 0x0e, + 0x00, 0xfe, 0x2c, 0x10, 0x08, 0x0c, 0x1f, 0xc5, 0x08, 0x0c, 0x7d, 0xd9, + 0x00, 0x05, 0x00, 0xd6, 0x00, 0xf6, 0x2c, 0x78, 0x08, 0x0c, 0x53, 0x77, + 0x00, 0xfe, 0x01, 0x20, 0x20, 0x01, 0xb8, 0xb8, 0x20, 0x04, 0x60, 0x3e, + 0x60, 0x03, 0x00, 0x02, 0x08, 0x0c, 0x71, 0x98, 0x08, 0x0c, 0x72, 0xa2, + 0x61, 0x10, 0x21, 0x68, 0x69, 0x4c, 0xd1, 0xe4, 0x09, 0x04, 0x94, 0xe9, + 0xd1, 0xcc, 0x05, 0x40, 0x69, 0x48, 0x68, 0x38, 0xd0, 0xfc, 0x01, 0xe8, + 0x00, 0x16, 0x68, 0x4c, 0x00, 0x06, 0x68, 0x50, 0x00, 0x06, 0xad, 0x90, + 0x00, 0x0d, 0xa1, 0x98, 0x00, 0x0d, 0x20, 0x09, 0x00, 0x20, 0x01, 0x56, + 0x21, 0xa8, 0x23, 0x04, 0x20, 0x12, 0x83, 0x18, 0x82, 0x10, 0x1f, 0x04, + 0x94, 0xaf, 0x01, 0x5e, 0x00, 0x0e, 0x68, 0x52, 0x00, 0x0e, 0x68, 0x4e, + 0x00, 0x1e, 0x21, 0x68, 0x08, 0x0c, 0x16, 0x24, 0x04, 0x28, 0x00, 0x16, + 0x08, 0x0c, 0x16, 0x24, 0x00, 0xde, 0x08, 0x0c, 0x99, 0xb9, 0x00, 0xf0, + 0x68, 0x37, 0x01, 0x03, 0x69, 0x44, 0xa1, 0x84, 0x00, 0xff, 0xa0, 0xb6, + 0x00, 0x02, 0x01, 0x80, 0xa0, 0x86, 0x00, 0x28, 0x11, 0x18, 0x68, 0x4b, + 0x00, 0x1c, 0x00, 0x70, 0xd1, 0xdc, 0x01, 0x18, 0x68, 0x4b, 0x00, 0x15, + 0x00, 0x48, 0xd1, 0xd4, 0x01, 0x18, 0x68, 0x4b, 0x00, 0x07, 0x00, 0x20, + 0x68, 0x4b, 0x00, 0x00, 0x08, 0x0c, 0x95, 0x23, 0x08, 0x0c, 0x54, 0x7a, + 0x08, 0x0c, 0x9f, 0xbf, 0x11, 0x10, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0xde, + 0x00, 0x05, 0x20, 0x19, 0x00, 0x01, 0x08, 0x0c, 0x80, 0x6b, 0x60, 0x03, + 0x00, 0x02, 0x00, 0xd6, 0x60, 0x10, 0x20, 0x68, 0x08, 0x0c, 0x9d, 0x16, + 0x01, 0x40, 0x68, 0x08, 0x61, 0x2c, 0xa1, 0x0a, 0x61, 0x2e, 0x68, 0x0c, + 0x61, 0x28, 0xa1, 0x0b, 0x61, 0x2a, 0x00, 0xde, 0x20, 0x01, 0xb8, 0xb8, + 0x20, 0x04, 0x60, 0x3e, 0x08, 0x0c, 0x71, 0x98, 0x08, 0x0c, 0x72, 0xa2, + 0x00, 0x05, 0x08, 0x0c, 0x71, 0x98, 0x08, 0x0c, 0x2c, 0xd1, 0x00, 0xd6, + 0x61, 0x10, 0x21, 0x68, 0x08, 0x0c, 0x9d, 0x16, 0x01, 0x50, 0x68, 0x37, + 0x01, 0x03, 0x68, 0x4b, 0x00, 0x29, 0x68, 0x47, 0x00, 0x00, 0x08, 0x0c, + 0x54, 0x7a, 0x08, 0x0c, 0x9e, 0xcd, 0x00, 0xde, 0x08, 0x0c, 0x86, 0xa4, + 0x08, 0x0c, 0x72, 0xa2, 0x00, 0x05, 0x68, 0x4c, 0xd0, 0xb4, 0x01, 0xc0, + 0x60, 0x2c, 0x69, 0x7c, 0xa1, 0x12, 0x60, 0x28, 0x69, 0x80, 0xa1, 0x0b, + 0x21, 0x00, 0xa2, 0x05, 0x01, 0x68, 0x68, 0x4b, 0x00, 0x15, 0xd1, 0xfc, + 0x01, 0x38, 0x68, 0x4b, 0x00, 0x07, 0x82, 0x12, 0x82, 0x10, 0x81, 0x0a, + 0xa1, 0x89, 0x00, 0x00, 0x69, 0x62, 0x6a, 0x5e, 0xa0, 0x85, 0x00, 0x01, + 0x00, 0x05, 0x68, 0x4b, 0x00, 0x15, 0xd1, 0xfc, 0x01, 0x38, 0x68, 0x4b, + 0x00, 0x07, 0x80, 0x02, 0x80, 0x00, 0x81, 0x0a, 0xa1, 0x89, 0x00, 0x00, + 0x69, 0x62, 0x68, 0x5e, 0x00, 0x05, 0xa1, 0x82, 0x00, 0x40, 0x00, 0x02, + 0x95, 0x63, 0x95, 0x63, 0x95, 0x63, 0x95, 0x63, 0x95, 0x63, 0x95, 0x65, + 0x95, 0x63, 0x96, 0x20, 0x96, 0x2c, 0x95, 0x63, 0x95, 0x63, 0x95, 0x63, + 0x95, 0x63, 0x95, 0x63, 0x95, 0x63, 0x95, 0x63, 0x95, 0x63, 0x95, 0x63, + 0x95, 0x63, 0x08, 0x0c, 0x15, 0x1a, 0x00, 0x76, 0x00, 0xf6, 0x00, 0xe6, + 0x00, 0xd6, 0x20, 0x71, 0xbc, 0x8c, 0x61, 0x10, 0x21, 0x78, 0x76, 0x14, + 0xa6, 0xb4, 0x0f, 0xff, 0x00, 0xf6, 0x2c, 0x78, 0x08, 0x0c, 0x53, 0x77, + 0x00, 0xfe, 0x01, 0x50, 0xa6, 0x84, 0x00, 0xff, 0x11, 0x38, 0x60, 0x20, + 0xd0, 0xf4, 0x01, 0x20, 0x08, 0x0c, 0x9f, 0xf1, 0x08, 0x04, 0x96, 0x1b, + 0x7e, 0x46, 0x7f, 0x4c, 0xc7, 0xe5, 0x7f, 0x4e, 0x62, 0x18, 0x22, 0x68, + 0x6a, 0x3c, 0x82, 0xff, 0x01, 0x10, 0x82, 0x11, 0x6a, 0x3e, 0x86, 0xff, + 0x09, 0x04, 0x96, 0x11, 0xa6, 0x94, 0xff, 0x00, 0xa2, 0x84, 0x0c, 0x00, + 0x01, 0x20, 0x70, 0x18, 0x78, 0x62, 0x70, 0x1c, 0x78, 0x5e, 0xa2, 0x84, + 0x03, 0x00, 0x09, 0x04, 0x96, 0x0f, 0xa6, 0x86, 0x01, 0x00, 0x11, 0x40, + 0x20, 0x01, 0xbc, 0x99, 0x20, 0x04, 0xa0, 0x05, 0x11, 0x18, 0xc6, 0xc4, + 0x7e, 0x46, 0x0c, 0x28, 0x08, 0x0c, 0x15, 0xfd, 0x09, 0x0c, 0x15, 0x1a, + 0x2d, 0x00, 0x78, 0x4a, 0x7f, 0x4c, 0xa7, 0xbd, 0x02, 0x00, 0x7f, 0x4e, + 0x68, 0x37, 0x01, 0x03, 0x78, 0x38, 0x68, 0x3a, 0x78, 0x3c, 0x68, 0x3e, + 0x78, 0x40, 0x68, 0x42, 0x6e, 0x46, 0xa6, 0x8c, 0x0c, 0x00, 0x01, 0x20, + 0x73, 0x18, 0x6b, 0x62, 0x73, 0x1c, 0x6b, 0x5e, 0xa6, 0x8c, 0x00, 0xff, + 0xa1, 0x86, 0x00, 0x02, 0x01, 0x80, 0xa1, 0x86, 0x00, 0x28, 0x11, 0x18, + 0x68, 0x4b, 0x00, 0x1c, 0x00, 0x60, 0xd6, 0xdc, 0x01, 0x18, 0x68, 0x4b, + 0x00, 0x15, 0x00, 0x38, 0xd6, 0xd4, 0x01, 0x18, 0x68, 0x4b, 0x00, 0x07, + 0x00, 0x10, 0x68, 0x4b, 0x00, 0x00, 0x6f, 0x4e, 0x78, 0x50, 0x68, 0x52, + 0x78, 0x54, 0x68, 0x56, 0xa0, 0x1e, 0xd6, 0xc4, 0x01, 0x98, 0x73, 0x28, + 0x73, 0x2c, 0x6b, 0x56, 0x83, 0xff, 0x01, 0x70, 0xa3, 0x8a, 0x00, 0x09, + 0x02, 0x10, 0x20, 0x19, 0x00, 0x08, 0x00, 0x36, 0x23, 0x08, 0x20, 0x19, + 0xbc, 0x98, 0xad, 0x90, 0x00, 0x19, 0x08, 0x0c, 0x99, 0xc9, 0x00, 0x3e, + 0xd6, 0xcc, 0x01, 0xd8, 0x71, 0x24, 0x69, 0x5a, 0x81, 0xff, 0x01, 0xb8, + 0xa1, 0x92, 0x00, 0x21, 0x12, 0x50, 0x20, 0x71, 0xbc, 0x98, 0x83, 0x1c, + 0x23, 0x00, 0xae, 0x18, 0xad, 0x90, 0x00, 0x1d, 0x08, 0x0c, 0x99, 0xc9, + 0x00, 0x50, 0x78, 0x38, 0xd0, 0xfc, 0x01, 0x20, 0x20, 0x09, 0x00, 0x20, + 0x69, 0x5a, 0x0c, 0x78, 0x2d, 0x78, 0x08, 0x0c, 0x99, 0x6e, 0xd6, 0xdc, + 0x11, 0x10, 0xa0, 0x06, 0x00, 0x30, 0x20, 0x01, 0x00, 0x01, 0x20, 0x71, + 0xbc, 0x8c, 0x72, 0x18, 0x73, 0x1c, 0x08, 0x0c, 0x18, 0xb6, 0x00, 0xde, + 0x00, 0xee, 0x00, 0xfe, 0x00, 0x7e, 0x00, 0x05, 0x20, 0x01, 0xb8, 0xb8, + 0x20, 0x04, 0x60, 0x3e, 0x20, 0xe1, 0x00, 0x05, 0x3d, 0x18, 0x3e, 0x20, + 0x2c, 0x10, 0x08, 0x0c, 0x18, 0x63, 0x00, 0x05, 0x20, 0x01, 0xb8, 0xb8, + 0x20, 0x04, 0x60, 0x3e, 0x00, 0xd6, 0x60, 0x03, 0x00, 0x02, 0x61, 0x10, + 0x21, 0x68, 0x69, 0x4c, 0xd1, 0xe4, 0x09, 0x04, 0x97, 0x37, 0x60, 0x3f, + 0x00, 0x00, 0x00, 0xf6, 0x2c, 0x78, 0x08, 0x0c, 0x53, 0x77, 0x00, 0xfe, + 0x05, 0x60, 0x68, 0x14, 0x69, 0x10, 0xa1, 0x15, 0x05, 0x40, 0x6a, 0x60, + 0xa2, 0x06, 0x11, 0x18, 0x68, 0x5c, 0xa1, 0x06, 0x05, 0x10, 0x68, 0x4c, + 0xc0, 0xe4, 0x68, 0x4e, 0x68, 0x47, 0x00, 0x00, 0x68, 0x63, 0x00, 0x00, + 0x68, 0x5f, 0x00, 0x00, 0x60, 0x20, 0xd0, 0xf4, 0x11, 0x58, 0x69, 0x7c, + 0x68, 0x10, 0xa1, 0x02, 0x60, 0x3a, 0x69, 0x80, 0x68, 0x14, 0xa1, 0x03, + 0x60, 0x36, 0x60, 0x20, 0xc0, 0xf5, 0x60, 0x22, 0x00, 0xd6, 0x60, 0x18, + 0x20, 0x68, 0x68, 0x3c, 0x80, 0x00, 0x68, 0x3e, 0x00, 0xde, 0x08, 0x0c, + 0x9f, 0xf1, 0x08, 0x04, 0x97, 0x37, 0x69, 0x4c, 0xd1, 0xcc, 0x09, 0x04, + 0x97, 0x07, 0x69, 0x48, 0x68, 0x38, 0xd0, 0xfc, 0x09, 0x04, 0x96, 0xca, + 0x00, 0x16, 0x68, 0x4c, 0x00, 0x06, 0x68, 0x50, 0x00, 0x06, 0x00, 0xf6, + 0x21, 0x78, 0x79, 0x44, 0xa1, 0x84, 0x00, 0xff, 0xa0, 0xb6, 0x00, 0x02, + 0x01, 0xe0, 0xa0, 0x86, 0x00, 0x28, 0x11, 0x28, 0x68, 0x4b, 0x00, 0x1c, + 0x78, 0x4b, 0x00, 0x1c, 0x00, 0xe8, 0xd1, 0xdc, 0x01, 0x58, 0x68, 0x4b, + 0x00, 0x15, 0x78, 0x4b, 0x00, 0x15, 0x08, 0x0c, 0xa1, 0x7b, 0x01, 0x18, + 0x79, 0x44, 0xc1, 0xdc, 0x79, 0x46, 0x00, 0x80, 0xd1, 0xd4, 0x01, 0x28, + 0x68, 0x4b, 0x00, 0x07, 0x78, 0x4b, 0x00, 0x07, 0x00, 0x48, 0x68, 0x4c, + 0xd0, 0xac, 0x01, 0x30, 0x68, 0x10, 0x69, 0x14, 0xa1, 0x15, 0x01, 0x10, + 0x08, 0x0c, 0x95, 0x3f, 0x68, 0x48, 0x78, 0x4a, 0x68, 0x60, 0x78, 0x62, + 0x68, 0x5c, 0x78, 0x5e, 0xad, 0x90, 0x00, 0x0d, 0xaf, 0x98, 0x00, 0x0d, + 0x20, 0x09, 0x00, 0x20, 0x01, 0x56, 0x21, 0xa8, 0x23, 0x04, 0x20, 0x12, + 0x83, 0x18, 0x82, 0x10, 0x1f, 0x04, 0x96, 0xb6, 0x01, 0x5e, 0x00, 0xfe, + 0x00, 0x0e, 0x68, 0x52, 0x00, 0x0e, 0x68, 0x4e, 0x08, 0x0c, 0xa1, 0xf3, + 0x00, 0x1e, 0x21, 0x68, 0x08, 0x0c, 0x16, 0x24, 0x08, 0x04, 0x97, 0x32, + 0x00, 0x16, 0x00, 0xf6, 0x21, 0x78, 0x79, 0x44, 0xa1, 0x84, 0x00, 0xff, + 0xa0, 0xb6, 0x00, 0x02, 0x01, 0xe0, 0xa0, 0x86, 0x00, 0x28, 0x11, 0x28, + 0x68, 0x4b, 0x00, 0x1c, 0x78, 0x4b, 0x00, 0x1c, 0x00, 0xe8, 0xd1, 0xdc, + 0x01, 0x58, 0x68, 0x4b, 0x00, 0x15, 0x78, 0x4b, 0x00, 0x15, 0x08, 0x0c, + 0xa1, 0x7b, 0x01, 0x18, 0x79, 0x44, 0xc1, 0xdc, 0x79, 0x46, 0x00, 0x80, + 0xd1, 0xd4, 0x01, 0x28, 0x68, 0x4b, 0x00, 0x07, 0x78, 0x4b, 0x00, 0x07, + 0x00, 0x48, 0x68, 0x4c, 0xd0, 0xac, 0x01, 0x30, 0x68, 0x10, 0x69, 0x14, + 0xa1, 0x15, 0x01, 0x10, 0x08, 0x0c, 0x95, 0x3f, 0x68, 0x60, 0x78, 0x62, + 0x68, 0x5c, 0x78, 0x5e, 0x68, 0x4c, 0x78, 0x4e, 0x00, 0xfe, 0x08, 0x0c, + 0x16, 0x24, 0x00, 0xde, 0x08, 0x0c, 0xa1, 0xf3, 0x08, 0x0c, 0x99, 0xb9, + 0x04, 0x58, 0x68, 0x37, 0x01, 0x03, 0x69, 0x44, 0xa1, 0x84, 0x00, 0xff, + 0xa0, 0xb6, 0x00, 0x02, 0x01, 0xb0, 0xa0, 0x86, 0x00, 0x28, 0x11, 0x18, + 0x68, 0x4b, 0x00, 0x1c, 0x00, 0xd8, 0xd1, 0xdc, 0x01, 0x48, 0x68, 0x4b, + 0x00, 0x15, 0x08, 0x0c, 0xa1, 0x7b, 0x01, 0x18, 0x69, 0x44, 0xc1, 0xdc, + 0x69, 0x46, 0x00, 0x80, 0xd1, 0xd4, 0x01, 0x18, 0x68, 0x4b, 0x00, 0x07, + 0x00, 0x58, 0x68, 0x4b, 0x00, 0x00, 0x68, 0x4c, 0xd0, 0xac, 0x01, 0x30, + 0x68, 0x10, 0x69, 0x14, 0xa1, 0x15, 0x01, 0x10, 0x08, 0x0c, 0x95, 0x3f, + 0x08, 0x0c, 0x54, 0x7a, 0x08, 0x0c, 0x9f, 0xbf, 0x11, 0x10, 0x08, 0x0c, + 0x86, 0xa4, 0x00, 0xde, 0x00, 0x05, 0x08, 0x0c, 0x71, 0x02, 0x00, 0x10, + 0x08, 0x0c, 0x71, 0x98, 0x08, 0x0c, 0x9d, 0x16, 0x01, 0xc0, 0x00, 0xd6, + 0x61, 0x10, 0x21, 0x68, 0x68, 0x37, 0x01, 0x03, 0x20, 0x09, 0xb6, 0x0c, + 0x21, 0x0c, 0xd1, 0x8c, 0x11, 0xc0, 0xd1, 0x84, 0x11, 0x98, 0x61, 0x08, + 0x69, 0x4a, 0xa1, 0x8e, 0x00, 0x29, 0x11, 0x10, 0x08, 0x0c, 0xb4, 0x3c, + 0x68, 0x47, 0x00, 0x00, 0x08, 0x0c, 0x54, 0x7a, 0x00, 0xde, 0x08, 0x0c, + 0x86, 0xa4, 0x08, 0x0c, 0x71, 0xe5, 0x08, 0x0c, 0x72, 0xa2, 0x00, 0x05, + 0x68, 0x4b, 0x00, 0x04, 0x0c, 0x88, 0x68, 0x4b, 0x00, 0x04, 0x0c, 0x70, + 0xa1, 0x82, 0x00, 0x40, 0x00, 0x02, 0x97, 0x7c, 0x97, 0x7c, 0x97, 0x7c, + 0x97, 0x7c, 0x97, 0x7c, 0x97, 0x7e, 0x97, 0x7c, 0x97, 0x81, 0x97, 0x7c, + 0x97, 0x7c, 0x97, 0x7c, 0x97, 0x7c, 0x97, 0x7c, 0x97, 0x7c, 0x97, 0x7c, + 0x97, 0x7c, 0x97, 0x7c, 0x97, 0x7c, 0x97, 0x7c, 0x08, 0x0c, 0x15, 0x1a, + 0x08, 0x0c, 0x86, 0xa4, 0x00, 0x05, 0x00, 0x06, 0x00, 0x26, 0xa0, 0x16, + 0x08, 0x0c, 0x18, 0x63, 0x00, 0x2e, 0x00, 0x0e, 0x00, 0x05, 0xa1, 0x82, + 0x00, 0x85, 0x00, 0x02, 0x97, 0x95, 0x97, 0x93, 0x97, 0x93, 0x97, 0xa1, + 0x97, 0x93, 0x97, 0x93, 0x97, 0x93, 0x08, 0x0c, 0x15, 0x1a, 0x60, 0x03, + 0x00, 0x01, 0x61, 0x06, 0x08, 0x0c, 0x6c, 0xff, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0x71, 0xe5, 0x01, 0x2e, 0x00, 0x05, 0x00, 0x26, + 0x00, 0x56, 0x00, 0xd6, 0x00, 0xe6, 0x20, 0x71, 0xbc, 0x80, 0x72, 0x24, + 0x62, 0x12, 0x72, 0x20, 0x08, 0x0c, 0x9d, 0x06, 0x01, 0xa0, 0x22, 0x68, + 0x68, 0x00, 0xa0, 0x86, 0x00, 0x00, 0x01, 0x78, 0x60, 0x18, 0x6d, 0x18, + 0xa5, 0x2e, 0x11, 0x58, 0x00, 0xc6, 0x2d, 0x60, 0x08, 0x0c, 0x99, 0xd9, + 0x00, 0xce, 0x01, 0x28, 0x68, 0x03, 0x00, 0x02, 0x60, 0x07, 0x00, 0x86, + 0x00, 0x10, 0x60, 0x07, 0x00, 0x87, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, + 0x6c, 0xff, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0xf6, 0x22, 0x78, 0x08, 0x0c, + 0x53, 0x77, 0x00, 0xfe, 0x01, 0x50, 0x68, 0x20, 0xd0, 0xec, 0x01, 0x38, + 0x00, 0xc6, 0x22, 0x60, 0x60, 0x3f, 0x00, 0x00, 0x08, 0x0c, 0x9f, 0xf1, + 0x00, 0xce, 0x00, 0xee, 0x00, 0xde, 0x00, 0x5e, 0x00, 0x2e, 0x00, 0x05, + 0xa1, 0x86, 0x00, 0x13, 0x11, 0x60, 0x60, 0x04, 0xa0, 0x8a, 0x00, 0x85, + 0x0a, 0x0c, 0x15, 0x1a, 0xa0, 0x8a, 0x00, 0x8c, 0x1a, 0x0c, 0x15, 0x1a, + 0xa0, 0x82, 0x00, 0x85, 0x00, 0x72, 0xa1, 0x86, 0x00, 0x27, 0x01, 0x20, + 0xa1, 0x86, 0x00, 0x14, 0x19, 0x0c, 0x15, 0x1a, 0x08, 0x0c, 0x71, 0x02, + 0x08, 0x0c, 0x9e, 0xd9, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x05, 0x98, 0x02, + 0x98, 0x04, 0x98, 0x04, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, 0x98, 0x02, + 0x08, 0x0c, 0x15, 0x1a, 0x08, 0x0c, 0x71, 0x02, 0x08, 0x0c, 0x9e, 0xd9, + 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x05, 0xa1, 0x86, 0x00, 0x13, 0x11, 0x28, + 0x60, 0x04, 0xa0, 0x82, 0x00, 0x85, 0x20, 0x08, 0x04, 0xa8, 0xa1, 0x86, + 0x00, 0x27, 0x11, 0xe8, 0x08, 0x0c, 0x71, 0x02, 0x08, 0x0c, 0x2c, 0xd1, + 0x00, 0xd6, 0x60, 0x10, 0x20, 0x68, 0x08, 0x0c, 0x9d, 0x16, 0x01, 0x50, + 0x68, 0x37, 0x01, 0x03, 0x68, 0x47, 0x00, 0x00, 0x68, 0x4b, 0x00, 0x29, + 0x08, 0x0c, 0x54, 0x7a, 0x08, 0x0c, 0x9e, 0xcd, 0x00, 0xde, 0x08, 0x0c, + 0x86, 0xa4, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x05, 0x08, 0x0c, 0x86, 0xef, + 0x0c, 0xe0, 0xa1, 0x86, 0x00, 0x14, 0x1d, 0xd0, 0x08, 0x0c, 0x71, 0x02, + 0x00, 0xd6, 0x60, 0x10, 0x20, 0x68, 0x08, 0x0c, 0x9d, 0x16, 0x0d, 0x60, + 0x68, 0x37, 0x01, 0x03, 0x68, 0x47, 0x00, 0x00, 0x68, 0x4b, 0x00, 0x06, + 0x68, 0x50, 0xc0, 0xec, 0x68, 0x52, 0x08, 0xf0, 0x00, 0x02, 0x98, 0x52, + 0x98, 0x50, 0x98, 0x50, 0x98, 0x50, 0x98, 0x50, 0x98, 0x50, 0x98, 0x6a, + 0x08, 0x0c, 0x15, 0x1a, 0x08, 0x0c, 0x71, 0x02, 0x60, 0x30, 0xa0, 0x8c, + 0xff, 0x00, 0x81, 0x0f, 0xa1, 0x86, 0x00, 0x39, 0x01, 0x18, 0xa1, 0x86, + 0x00, 0x35, 0x11, 0x18, 0x20, 0x01, 0xb8, 0xb6, 0x00, 0x10, 0x20, 0x01, + 0xb8, 0xb7, 0x20, 0x04, 0x60, 0x16, 0x60, 0x03, 0x00, 0x0c, 0x08, 0x0c, + 0x71, 0xe5, 0x00, 0x05, 0x08, 0x0c, 0x71, 0x02, 0x60, 0x30, 0xa0, 0x8c, + 0xff, 0x00, 0x81, 0x0f, 0xa1, 0x86, 0x00, 0x39, 0x01, 0x18, 0xa1, 0x86, + 0x00, 0x35, 0x11, 0x18, 0x20, 0x01, 0xb8, 0xb6, 0x00, 0x10, 0x20, 0x01, + 0xb8, 0xb7, 0x20, 0x04, 0x60, 0x16, 0x60, 0x03, 0x00, 0x0e, 0x08, 0x0c, + 0x71, 0xe5, 0x00, 0x05, 0xa1, 0x82, 0x00, 0x8c, 0x12, 0x20, 0xa1, 0x82, + 0x00, 0x85, 0x02, 0x08, 0x00, 0x1a, 0x08, 0x0c, 0x86, 0xef, 0x00, 0x05, + 0x98, 0x93, 0x98, 0x93, 0x98, 0x93, 0x98, 0x93, 0x98, 0x95, 0x98, 0xee, + 0x98, 0x93, 0x08, 0x0c, 0x15, 0x1a, 0x00, 0xd6, 0x00, 0xf6, 0x2c, 0x78, + 0x08, 0x0c, 0x53, 0x77, 0x00, 0xfe, 0x01, 0x68, 0x60, 0x30, 0xa0, 0x8c, + 0xff, 0x00, 0x81, 0x0f, 0xa1, 0x86, 0x00, 0x39, 0x01, 0x18, 0xa1, 0x86, + 0x00, 0x35, 0x11, 0x18, 0x00, 0xde, 0x08, 0x04, 0x99, 0x01, 0x08, 0x0c, + 0x9d, 0x16, 0x11, 0x18, 0x08, 0x0c, 0x9e, 0xcd, 0x00, 0xf0, 0x60, 0x10, + 0x20, 0x68, 0x68, 0x4c, 0xd0, 0xe4, 0x11, 0x10, 0x08, 0x0c, 0x9e, 0xcd, + 0x68, 0x37, 0x01, 0x03, 0x68, 0x50, 0xd0, 0xb4, 0x01, 0x28, 0x68, 0x4b, + 0x00, 0x06, 0xc0, 0xec, 0x68, 0x52, 0x00, 0x48, 0xd0, 0xbc, 0x01, 0x18, + 0x68, 0x4b, 0x00, 0x02, 0x00, 0x20, 0x68, 0x4b, 0x00, 0x05, 0x08, 0x0c, + 0x9f, 0x8e, 0x68, 0x47, 0x00, 0x00, 0x08, 0x0c, 0x54, 0x7a, 0x2c, 0x68, + 0x08, 0x0c, 0x86, 0x4e, 0x01, 0xc0, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, + 0x00, 0x1e, 0x60, 0x0b, 0xff, 0xff, 0x20, 0x09, 0xbc, 0x8e, 0x21, 0x0c, + 0x61, 0x36, 0x20, 0x09, 0xbc, 0x8f, 0x21, 0x0c, 0x61, 0x3a, 0x69, 0x18, + 0x61, 0x1a, 0x08, 0x0c, 0xa0, 0xe3, 0x69, 0x50, 0x61, 0x52, 0x60, 0x1f, + 0x00, 0x01, 0x08, 0x0c, 0x6c, 0xff, 0x2d, 0x60, 0x08, 0x0c, 0x86, 0xa4, + 0x00, 0xde, 0x00, 0x05, 0x00, 0xf6, 0x2c, 0x78, 0x08, 0x0c, 0x53, 0x77, + 0x00, 0xfe, 0x05, 0x98, 0x60, 0x30, 0xa0, 0x8c, 0xff, 0x00, 0x81, 0x0f, + 0xa1, 0x86, 0x00, 0x35, 0x01, 0x30, 0xa1, 0x86, 0x00, 0x1e, 0x01, 0x18, + 0xa1, 0x86, 0x00, 0x39, 0x15, 0x30, 0x00, 0xd6, 0x2c, 0x68, 0x08, 0x0c, + 0xa1, 0xc6, 0x19, 0x04, 0x99, 0x46, 0x08, 0x0c, 0x86, 0x4e, 0x01, 0xd8, + 0x61, 0x06, 0x60, 0x03, 0x00, 0x01, 0x60, 0x1f, 0x00, 0x01, 0x69, 0x18, + 0x61, 0x1a, 0x69, 0x28, 0x61, 0x2a, 0x69, 0x2c, 0x61, 0x2e, 0x69, 0x30, + 0xa1, 0x8c, 0x00, 0xff, 0x61, 0x32, 0x69, 0x34, 0x61, 0x36, 0x69, 0x38, + 0x61, 0x3a, 0x69, 0x50, 0x61, 0x52, 0x08, 0x0c, 0xa0, 0xe3, 0x08, 0x0c, + 0x6c, 0xff, 0x08, 0x0c, 0x71, 0xe5, 0x2d, 0x60, 0x00, 0xf8, 0x00, 0xd6, + 0x60, 0x10, 0x20, 0x68, 0x08, 0x0c, 0x9d, 0x16, 0x01, 0xc8, 0x68, 0x37, + 0x01, 0x03, 0x68, 0x50, 0xd0, 0xb4, 0x01, 0x28, 0xc0, 0xec, 0x68, 0x52, + 0x68, 0x4b, 0x00, 0x06, 0x00, 0x48, 0xd0, 0xbc, 0x01, 0x18, 0x68, 0x4b, + 0x00, 0x02, 0x00, 0x20, 0x68, 0x4b, 0x00, 0x05, 0x08, 0x0c, 0x9f, 0x8e, + 0x68, 0x47, 0x00, 0x00, 0x08, 0x0c, 0x54, 0x7a, 0x08, 0x0c, 0x9e, 0xcd, + 0x00, 0xde, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0x05, 0x00, 0x16, 0x00, 0xd6, + 0x60, 0x10, 0x20, 0x68, 0x08, 0x0c, 0x9d, 0x16, 0x01, 0x40, 0x68, 0x37, + 0x01, 0x03, 0x68, 0x4b, 0x00, 0x28, 0x68, 0x47, 0x00, 0x00, 0x08, 0x0c, + 0x54, 0x7a, 0x00, 0xde, 0x00, 0x1e, 0xa1, 0x86, 0x00, 0x13, 0x01, 0x48, + 0xa1, 0x86, 0x00, 0x14, 0x01, 0x30, 0xa1, 0x86, 0x00, 0x27, 0x01, 0x18, + 0x08, 0x0c, 0x86, 0xef, 0x00, 0x30, 0x08, 0x0c, 0x71, 0x02, 0x08, 0x0c, + 0x9e, 0xd9, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x05, 0x00, 0x56, 0x00, 0x66, + 0x00, 0xd6, 0x00, 0xf6, 0x20, 0x29, 0x00, 0x01, 0xa1, 0x82, 0x01, 0x01, + 0x12, 0x08, 0x00, 0x10, 0x20, 0x09, 0x01, 0x00, 0x21, 0x30, 0x20, 0x69, + 0xbc, 0x98, 0x83, 0x1c, 0x23, 0x00, 0xad, 0x18, 0x20, 0x09, 0x00, 0x20, + 0xaf, 0x90, 0x00, 0x1d, 0x08, 0x0c, 0x99, 0xc9, 0xa6, 0xb2, 0x00, 0x20, + 0x78, 0x04, 0xa0, 0x6d, 0x01, 0x10, 0x08, 0x0c, 0x16, 0x24, 0x08, 0x0c, + 0x15, 0xfd, 0x05, 0x00, 0x85, 0x28, 0x68, 0x37, 0x01, 0x10, 0x68, 0x3b, + 0x00, 0x00, 0x2d, 0x20, 0x7c, 0x06, 0xa6, 0x8a, 0x00, 0x3d, 0x12, 0x28, + 0x26, 0x08, 0xad, 0x90, 0x00, 0x0f, 0x04, 0x59, 0x00, 0x88, 0xa6, 0xb2, + 0x00, 0x3c, 0x20, 0x09, 0x00, 0x3c, 0x2d, 0x78, 0xad, 0x90, 0x00, 0x0f, + 0x04, 0x11, 0x0c, 0x28, 0x00, 0xfe, 0x85, 0x2f, 0xa5, 0xad, 0x00, 0x03, + 0x7d, 0x36, 0xa5, 0xac, 0x00, 0x00, 0x00, 0x28, 0x00, 0xfe, 0x85, 0x2f, + 0xa5, 0xad, 0x00, 0x03, 0x7d, 0x36, 0x00, 0xde, 0x00, 0x6e, 0x00, 0x5e, + 0x00, 0x05, 0x00, 0xf6, 0x8d, 0xff, 0x01, 0x58, 0x68, 0x04, 0xa0, 0x7d, + 0x01, 0x30, 0x68, 0x07, 0x00, 0x00, 0x08, 0x0c, 0x54, 0x7a, 0x2f, 0x68, + 0x0c, 0xb8, 0x08, 0x0c, 0x54, 0x7a, 0x00, 0xfe, 0x00, 0x05, 0x01, 0x56, + 0xa1, 0x84, 0x00, 0x01, 0x01, 0x08, 0x81, 0x08, 0x81, 0x0c, 0x21, 0xa8, + 0x23, 0x04, 0x80, 0x07, 0x20, 0x12, 0x83, 0x18, 0x82, 0x10, 0x1f, 0x04, + 0x99, 0xd0, 0x01, 0x5e, 0x00, 0x05, 0x00, 0x66, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x31, 0x00, 0x01, 0x60, 0x1c, 0xa0, 0x84, 0x00, 0x0f, + 0x00, 0x83, 0x01, 0x2e, 0x00, 0x6e, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x00, 0x66, 0x20, 0x31, 0x00, 0x00, 0x60, 0x1c, 0xa0, 0x84, + 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x6e, 0x01, 0x2e, 0x00, 0x05, 0x9a, 0x10, + 0x9a, 0x10, 0x9a, 0x0b, 0x9a, 0x32, 0x99, 0xfe, 0x9a, 0x0b, 0x9a, 0x32, + 0x9a, 0x0b, 0x9a, 0x0b, 0x99, 0xfe, 0x9a, 0x0b, 0x08, 0x0c, 0x15, 0x1a, + 0x00, 0x36, 0x20, 0x19, 0x00, 0x10, 0x08, 0x0c, 0xad, 0x9c, 0x60, 0x1f, + 0x00, 0x06, 0x60, 0x03, 0x00, 0x07, 0x00, 0x3e, 0x00, 0x05, 0xa0, 0x06, + 0x00, 0x05, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x05, 0x00, 0xd6, 0x86, 0xff, + 0x11, 0xd8, 0x60, 0x10, 0x20, 0x68, 0x08, 0x0c, 0x9d, 0x16, 0x01, 0xc0, + 0x68, 0x34, 0xa0, 0x86, 0x01, 0x39, 0x11, 0x28, 0x68, 0x4b, 0x00, 0x05, + 0x68, 0x53, 0x00, 0x00, 0x00, 0x28, 0xa0, 0x0e, 0x20, 0x01, 0x00, 0x05, + 0x08, 0x0c, 0x55, 0x4d, 0x08, 0x0c, 0x9f, 0x8e, 0x08, 0x0c, 0x54, 0x7a, + 0x08, 0x0c, 0x86, 0xa4, 0xa0, 0x85, 0x00, 0x01, 0x00, 0xde, 0x00, 0x05, + 0xa0, 0x06, 0x0c, 0xe0, 0x60, 0x00, 0xa0, 0x8a, 0x00, 0x10, 0x1a, 0x0c, + 0x15, 0x1a, 0x00, 0x0b, 0x00, 0x05, 0x9a, 0x49, 0x9a, 0x6a, 0x9a, 0x4b, + 0x9a, 0x89, 0x9a, 0x67, 0x9a, 0x49, 0x9a, 0x0b, 0x9a, 0x10, 0x9a, 0x10, + 0x9a, 0x0b, 0x9a, 0x0b, 0x9a, 0x0b, 0x9a, 0x0b, 0x9a, 0x0b, 0x9a, 0x0b, + 0x9a, 0x0b, 0x08, 0x0c, 0x15, 0x1a, 0x86, 0xff, 0x11, 0xb8, 0x60, 0x1c, + 0xa0, 0x86, 0x00, 0x06, 0x01, 0x98, 0x00, 0xd6, 0x60, 0x10, 0x20, 0x68, + 0x08, 0x0c, 0x9d, 0x16, 0x01, 0x10, 0x08, 0x0c, 0x9f, 0x8e, 0x00, 0xde, + 0x60, 0x07, 0x00, 0x85, 0x60, 0x03, 0x00, 0x0b, 0x60, 0x1f, 0x00, 0x02, + 0x08, 0x0c, 0x6c, 0xff, 0x08, 0x0c, 0x71, 0xe5, 0xa0, 0x85, 0x00, 0x01, + 0x00, 0x05, 0x08, 0x0c, 0x19, 0x52, 0x0c, 0x08, 0x00, 0xe6, 0x20, 0x71, + 0xb8, 0xe1, 0x70, 0x24, 0xac, 0x06, 0x11, 0x10, 0x08, 0x0c, 0x7f, 0xe0, + 0x60, 0x1c, 0xa0, 0x84, 0x00, 0x0f, 0xa0, 0x86, 0x00, 0x06, 0x11, 0x50, + 0x00, 0x86, 0x00, 0x96, 0x20, 0x49, 0x00, 0x01, 0x2c, 0x40, 0x08, 0x0c, + 0x81, 0xb7, 0x00, 0x9e, 0x00, 0x8e, 0x00, 0x10, 0x08, 0x0c, 0x7e, 0xd1, + 0x00, 0xee, 0x19, 0x28, 0x08, 0x0c, 0x9a, 0x0b, 0x00, 0x05, 0x00, 0x36, + 0x00, 0xe6, 0x20, 0x71, 0xb8, 0xe1, 0x70, 0x3c, 0xac, 0x06, 0x11, 0x40, + 0x20, 0x19, 0x00, 0x00, 0x08, 0x0c, 0x80, 0x6b, 0x00, 0xee, 0x00, 0x3e, + 0x08, 0x04, 0x9a, 0x4b, 0x08, 0x0c, 0x82, 0xe4, 0x00, 0xee, 0x00, 0x3e, + 0x19, 0x04, 0x9a, 0x4b, 0x08, 0x0c, 0x9a, 0x0b, 0x00, 0x05, 0x00, 0xc6, + 0x60, 0x1c, 0xa0, 0x84, 0x00, 0x0f, 0x00, 0x13, 0x00, 0xce, 0x00, 0x05, + 0x9a, 0xba, 0x9b, 0x27, 0x9c, 0x75, 0x9a, 0xc5, 0x9e, 0xd9, 0x9a, 0xba, + 0xad, 0x8e, 0xa2, 0x0a, 0x9b, 0x27, 0x9a, 0xb3, 0x9c, 0xe0, 0x08, 0x0c, + 0x15, 0x1a, 0x08, 0x0c, 0x9f, 0x14, 0x11, 0x10, 0x08, 0x0c, 0x8c, 0xa5, + 0x00, 0x05, 0x08, 0x0c, 0x71, 0x02, 0x08, 0x0c, 0x71, 0xe5, 0x08, 0x0c, + 0x86, 0xa4, 0x00, 0x05, 0x60, 0x17, 0x00, 0x01, 0x00, 0x05, 0x08, 0x0c, + 0x9d, 0x16, 0x01, 0x20, 0x60, 0x10, 0xa0, 0x80, 0x00, 0x19, 0x2c, 0x02, + 0x60, 0x00, 0xa0, 0x8a, 0x00, 0x10, 0x1a, 0x0c, 0x15, 0x1a, 0x00, 0x0b, + 0x00, 0x05, 0x9a, 0xe3, 0x9a, 0xe5, 0x9b, 0x05, 0x9b, 0x17, 0x9b, 0x24, + 0x9a, 0xe3, 0x9a, 0xba, 0x9a, 0xba, 0x9a, 0xba, 0x9b, 0x17, 0x9b, 0x17, + 0x9a, 0xe3, 0x9a, 0xe3, 0x9a, 0xe3, 0x9a, 0xe3, 0x9b, 0x21, 0x08, 0x0c, + 0x15, 0x1a, 0x00, 0xe6, 0x60, 0x10, 0x20, 0x70, 0x70, 0x50, 0xc0, 0xb5, + 0x70, 0x52, 0x20, 0x71, 0xb8, 0xe1, 0x70, 0x24, 0xac, 0x06, 0x01, 0x90, + 0x08, 0x0c, 0x7e, 0xd1, 0x60, 0x07, 0x00, 0x85, 0x60, 0x03, 0x00, 0x0b, + 0x60, 0x1f, 0x00, 0x02, 0x20, 0x01, 0xb8, 0xb7, 0x20, 0x04, 0x60, 0x16, + 0x08, 0x0c, 0x6c, 0xff, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0xee, 0x00, 0x05, + 0x60, 0x17, 0x00, 0x01, 0x0c, 0xd8, 0x00, 0xd6, 0x60, 0x10, 0x20, 0x68, + 0x68, 0x50, 0xc0, 0xb5, 0x68, 0x52, 0x00, 0xde, 0x60, 0x07, 0x00, 0x85, + 0x60, 0x03, 0x00, 0x0b, 0x60, 0x1f, 0x00, 0x02, 0x08, 0x0c, 0x6c, 0xff, + 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x05, 0x00, 0xd6, 0x60, 0x17, 0x00, 0x01, + 0x60, 0x10, 0x20, 0x68, 0x68, 0x50, 0xc0, 0xb5, 0x68, 0x52, 0x00, 0xde, + 0x00, 0x05, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0x05, 0x08, 0x0c, 0x19, 0x52, + 0x08, 0xf0, 0x60, 0x00, 0xa0, 0x8a, 0x00, 0x10, 0x1a, 0x0c, 0x15, 0x1a, + 0x00, 0x0b, 0x00, 0x05, 0x9b, 0x3e, 0x9a, 0xc2, 0x9b, 0x40, 0x9b, 0x3e, + 0x9b, 0x40, 0x9b, 0x40, 0x9a, 0xbb, 0x9b, 0x3e, 0x9a, 0xb5, 0x9a, 0xb5, + 0x9b, 0x3e, 0x9b, 0x3e, 0x9b, 0x3e, 0x9b, 0x3e, 0x9b, 0x3e, 0x9b, 0x3e, + 0x08, 0x0c, 0x15, 0x1a, 0x00, 0xd6, 0x60, 0x18, 0x20, 0x68, 0x68, 0x04, + 0xa0, 0x84, 0x00, 0xff, 0x00, 0xde, 0xa0, 0x8a, 0x00, 0x0c, 0x1a, 0x0c, + 0x15, 0x1a, 0x00, 0x0b, 0x00, 0x05, 0x9b, 0x59, 0x9c, 0x1b, 0x9b, 0x5b, + 0x9b, 0x99, 0x9b, 0x5b, 0x9b, 0x99, 0x9b, 0x5b, 0x9b, 0x69, 0x9b, 0x59, + 0x9b, 0x99, 0x9b, 0x59, 0x9b, 0x85, 0x08, 0x0c, 0x15, 0x1a, 0x60, 0x04, + 0xa0, 0x8e, 0x00, 0x16, 0x05, 0xa8, 0xa0, 0x8e, 0x00, 0x04, 0x05, 0x90, + 0xa0, 0x8e, 0x00, 0x02, 0x05, 0x78, 0xa0, 0x8e, 0x00, 0x4b, 0x09, 0x04, + 0x9c, 0x17, 0x60, 0x04, 0x08, 0x0c, 0x9f, 0x14, 0x09, 0x04, 0x9c, 0x34, + 0xa0, 0x8e, 0x00, 0x21, 0x09, 0x04, 0x9c, 0x38, 0xa0, 0x8e, 0x00, 0x22, + 0x09, 0x04, 0x9c, 0x34, 0xa0, 0x8e, 0x00, 0x3d, 0x09, 0x04, 0x9c, 0x38, + 0xa0, 0x8e, 0x00, 0x39, 0x09, 0x04, 0x9c, 0x3c, 0xa0, 0x8e, 0x00, 0x35, + 0x09, 0x04, 0x9c, 0x3c, 0xa0, 0x8e, 0x00, 0x1e, 0x01, 0x88, 0xa0, 0x8e, + 0x00, 0x01, 0x11, 0x50, 0x00, 0xd6, 0x60, 0x18, 0x20, 0x68, 0x68, 0x04, + 0xa0, 0x84, 0x00, 0xff, 0x00, 0xde, 0xa0, 0x86, 0x00, 0x06, 0x01, 0x10, + 0x08, 0x0c, 0x2c, 0xd1, 0x08, 0x0c, 0x8c, 0xa5, 0x08, 0x0c, 0x9e, 0xd9, + 0x00, 0x05, 0x00, 0xc6, 0x00, 0xd6, 0x61, 0x04, 0xa1, 0x86, 0x00, 0x16, + 0x09, 0x04, 0x9c, 0x08, 0xa1, 0x86, 0x00, 0x02, 0x15, 0xd8, 0x20, 0x01, + 0xb6, 0x35, 0x20, 0x04, 0xd0, 0x8c, 0x11, 0x98, 0x08, 0x0c, 0x5b, 0x41, + 0x11, 0x80, 0x20, 0x01, 0xb8, 0x9f, 0x20, 0x03, 0x00, 0x01, 0x20, 0x01, + 0xb6, 0x00, 0x20, 0x03, 0x00, 0x01, 0xa0, 0x85, 0x00, 0x01, 0x08, 0x0c, + 0x5b, 0x85, 0x08, 0x0c, 0x5a, 0x79, 0x08, 0x04, 0x9c, 0x5e, 0x60, 0x18, + 0x20, 0x68, 0x20, 0x01, 0xb6, 0x35, 0x20, 0x04, 0xd0, 0xac, 0x19, 0x04, + 0x9c, 0x5e, 0x68, 0xa0, 0xd0, 0xbc, 0x19, 0x04, 0x9c, 0x5e, 0x68, 0x40, + 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x05, 0x01, 0x90, 0x80, 0x01, 0x68, 0x42, + 0x60, 0x13, 0x00, 0x00, 0x60, 0x1f, 0x00, 0x07, 0x60, 0x17, 0x03, 0x98, + 0x60, 0x3f, 0x00, 0x00, 0x08, 0x0c, 0x86, 0x4e, 0x01, 0x28, 0x2d, 0x00, + 0x60, 0x1a, 0x60, 0x1f, 0x00, 0x01, 0x04, 0x50, 0x00, 0xde, 0x00, 0xce, + 0x60, 0x04, 0xa0, 0x8e, 0x00, 0x02, 0x11, 0xa8, 0x60, 0x18, 0xa0, 0x80, + 0x00, 0x28, 0x20, 0x04, 0xa0, 0x86, 0x00, 0x7e, 0x11, 0x70, 0x20, 0x09, + 0xb6, 0x35, 0x21, 0x04, 0xc0, 0x85, 0x20, 0x0a, 0x00, 0xe6, 0x20, 0x71, + 0xb6, 0x00, 0x08, 0x0c, 0x4c, 0x28, 0x00, 0xee, 0x08, 0x0c, 0x8c, 0xa5, + 0x00, 0x20, 0x08, 0x0c, 0x8c, 0xa5, 0x08, 0x0c, 0x2c, 0xd1, 0x00, 0xe6, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x2c, 0xf7, 0x01, 0x2e, + 0x00, 0xee, 0x08, 0x0c, 0x9e, 0xd9, 0x00, 0x05, 0x20, 0x01, 0x00, 0x02, + 0x08, 0x0c, 0x4f, 0x6f, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x02, + 0x08, 0x0c, 0x6d, 0x45, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0xde, 0x00, 0xce, + 0x0c, 0x80, 0x08, 0x0c, 0x2c, 0xf7, 0x08, 0x04, 0x9b, 0x94, 0x00, 0xc6, + 0x00, 0xd6, 0x61, 0x04, 0xa1, 0x86, 0x00, 0x16, 0x0d, 0x38, 0x60, 0x18, + 0x20, 0x68, 0x68, 0x40, 0xa0, 0x84, 0x00, 0xff, 0xa0, 0x05, 0x09, 0x04, + 0x9b, 0xde, 0x80, 0x01, 0x68, 0x42, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, + 0x6d, 0x45, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0xde, 0x00, 0xce, 0x08, 0x98, + 0x08, 0x0c, 0x8c, 0xa5, 0x08, 0x04, 0x9b, 0x96, 0x08, 0x0c, 0x8c, 0xd3, + 0x08, 0x04, 0x9b, 0x96, 0x00, 0xd6, 0x2c, 0x68, 0x61, 0x04, 0x08, 0x0c, + 0xa1, 0xc6, 0x00, 0xde, 0x01, 0x18, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0xb8, + 0x60, 0x04, 0x80, 0x07, 0x61, 0x30, 0xa1, 0x8c, 0x00, 0xff, 0xa1, 0x05, + 0x60, 0x32, 0x60, 0x07, 0x00, 0x85, 0x60, 0x03, 0x00, 0x0b, 0x60, 0x1f, + 0x00, 0x02, 0x60, 0x38, 0x60, 0x0a, 0x20, 0x01, 0xb8, 0xb7, 0x20, 0x04, + 0x60, 0x16, 0x08, 0x0c, 0x6c, 0xff, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x05, + 0x00, 0xde, 0x00, 0xce, 0x08, 0x0c, 0x8c, 0xa5, 0x08, 0x0c, 0x2c, 0xd1, + 0x00, 0xe6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x2c, 0xf7, + 0x60, 0x13, 0x00, 0x00, 0x60, 0x1f, 0x00, 0x07, 0x60, 0x17, 0x03, 0x98, + 0x60, 0x3f, 0x00, 0x00, 0x01, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x60, 0x00, + 0xa0, 0x8a, 0x00, 0x10, 0x1a, 0x0c, 0x15, 0x1a, 0x00, 0x0b, 0x00, 0x05, + 0x9c, 0x8c, 0x9c, 0x8c, 0x9c, 0x8c, 0x9c, 0x8c, 0x9c, 0x8c, 0x9c, 0x8c, + 0x9c, 0x8c, 0x9c, 0x8c, 0x9c, 0x8c, 0x9a, 0xba, 0x9c, 0x8c, 0x9a, 0xc2, + 0x9c, 0x8e, 0x9a, 0xc2, 0x9c, 0x9b, 0x9c, 0x8c, 0x08, 0x0c, 0x15, 0x1a, + 0x60, 0x04, 0xa0, 0x86, 0x00, 0x8b, 0x01, 0x48, 0x60, 0x07, 0x00, 0x8b, + 0x60, 0x03, 0x00, 0x0d, 0x08, 0x0c, 0x6c, 0xff, 0x08, 0x0c, 0x71, 0xe5, + 0x00, 0x05, 0x08, 0x0c, 0x9e, 0xcd, 0x08, 0x0c, 0x9d, 0x16, 0x05, 0x80, + 0x08, 0x0c, 0x2c, 0xd1, 0x00, 0xd6, 0x08, 0x0c, 0x9d, 0x16, 0x01, 0x68, + 0x60, 0x10, 0x20, 0x68, 0x68, 0x37, 0x01, 0x03, 0x68, 0x4b, 0x00, 0x06, + 0x68, 0x47, 0x00, 0x00, 0x68, 0x50, 0xc0, 0xed, 0x68, 0x52, 0x08, 0x0c, + 0x54, 0x7a, 0x2c, 0x68, 0x08, 0x0c, 0x86, 0x4e, 0x01, 0x50, 0x68, 0x18, + 0x60, 0x1a, 0x08, 0x0c, 0xa0, 0xe3, 0x00, 0xc6, 0x2d, 0x60, 0x08, 0x0c, + 0x9e, 0xd9, 0x00, 0xce, 0x00, 0x08, 0x2d, 0x60, 0x00, 0xde, 0x60, 0x13, + 0x00, 0x00, 0x60, 0x1f, 0x00, 0x01, 0x60, 0x07, 0x00, 0x01, 0x60, 0x03, + 0x00, 0x01, 0x08, 0x0c, 0x6d, 0x45, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x78, + 0x60, 0x30, 0xa0, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0xa1, 0x86, 0x00, 0x39, + 0x01, 0x18, 0xa1, 0x86, 0x00, 0x35, 0x11, 0x18, 0x08, 0x0c, 0x2c, 0xd1, + 0x08, 0xb0, 0x08, 0x0c, 0x9e, 0xd9, 0x00, 0x05, 0x60, 0x00, 0xa0, 0x8a, + 0x00, 0x10, 0x1a, 0x0c, 0x15, 0x1a, 0x00, 0x0b, 0x00, 0x05, 0x9c, 0xf7, + 0x9c, 0xf7, 0x9c, 0xf7, 0x9c, 0xf9, 0x9c, 0xf9, 0x9c, 0xf7, 0x9c, 0xf7, + 0x9c, 0xf7, 0x9c, 0xf7, 0x9c, 0xf7, 0x9c, 0xf7, 0x9c, 0xf7, 0x9c, 0xf7, + 0x9c, 0xf7, 0x9c, 0xf7, 0x9c, 0xf7, 0x08, 0x0c, 0x15, 0x1a, 0x08, 0x0c, + 0x82, 0xe4, 0x19, 0x0c, 0x15, 0x1a, 0x61, 0x10, 0x21, 0x68, 0x68, 0x4b, + 0x00, 0x06, 0x08, 0x0c, 0x54, 0x7a, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0x05, + 0xa2, 0x84, 0x00, 0x07, 0x11, 0x58, 0xa2, 0x82, 0xbe, 0x00, 0x02, 0x40, + 0x20, 0x01, 0xb6, 0x17, 0x20, 0x04, 0xa2, 0x02, 0x12, 0x18, 0xa0, 0x85, + 0x00, 0x01, 0x00, 0x05, 0xa0, 0x06, 0x0c, 0xe8, 0x00, 0x26, 0x62, 0x10, + 0xa2, 0x94, 0xf0, 0x00, 0x00, 0x2e, 0x00, 0x05, 0x00, 0xe6, 0x00, 0xc6, + 0x00, 0x36, 0x00, 0x06, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x61, + 0xbe, 0x00, 0x20, 0x71, 0xb6, 0x00, 0x73, 0x48, 0x70, 0x68, 0xa3, 0x02, + 0x12, 0xa8, 0x60, 0x1c, 0xa2, 0x06, 0x11, 0x60, 0x08, 0x0c, 0xa0, 0x6e, + 0x01, 0x48, 0x08, 0x0c, 0x9f, 0x14, 0x11, 0x10, 0x08, 0x0c, 0x8c, 0xa5, + 0x00, 0xc6, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0xce, 0xac, 0xe0, 0x00, 0x18, + 0x70, 0x5c, 0xac, 0x02, 0x12, 0x08, 0x0c, 0x38, 0x01, 0x2e, 0x00, 0x0e, + 0x00, 0x3e, 0x00, 0xce, 0x00, 0xee, 0x00, 0x05, 0x00, 0xe6, 0x00, 0xc6, + 0x00, 0x16, 0xa1, 0x88, 0xb7, 0x35, 0x21, 0x0c, 0x81, 0xff, 0x01, 0x28, + 0x20, 0x61, 0xb9, 0xf5, 0x61, 0x1a, 0x08, 0x0c, 0x2c, 0xd1, 0xa0, 0x06, + 0x00, 0x10, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x1e, 0x00, 0xce, 0x00, 0xee, + 0x00, 0x05, 0x00, 0xc6, 0x00, 0x56, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x00, 0xc6, 0x08, 0x0c, 0x86, 0x4e, 0x00, 0x5e, 0x01, 0x80, 0x66, 0x12, + 0x65, 0x1a, 0x08, 0x0c, 0xa0, 0xe3, 0x60, 0x1f, 0x00, 0x03, 0x20, 0x09, + 0x00, 0x4b, 0x08, 0x0c, 0x86, 0xd3, 0xa0, 0x85, 0x00, 0x01, 0x01, 0x2e, + 0x00, 0x5e, 0x00, 0xce, 0x00, 0x05, 0xa0, 0x06, 0x0c, 0xd0, 0x00, 0xc6, + 0x00, 0x56, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x62, 0xa0, 0x00, 0xc6, + 0x08, 0x0c, 0x9f, 0x92, 0x00, 0x5e, 0x05, 0x50, 0x60, 0x13, 0x00, 0x00, + 0x65, 0x1a, 0x08, 0x0c, 0xa0, 0xe3, 0x60, 0x1f, 0x00, 0x03, 0x00, 0x16, + 0x00, 0xc6, 0x25, 0x60, 0x08, 0x0c, 0x52, 0x1c, 0x00, 0xce, 0x08, 0x0c, + 0x6e, 0x67, 0x00, 0x76, 0x20, 0x39, 0x00, 0x00, 0x08, 0x0c, 0x6d, 0x74, + 0x2c, 0x08, 0x08, 0x0c, 0xaf, 0x3e, 0x00, 0x7e, 0x00, 0x1e, 0xd1, 0x84, + 0x01, 0x28, 0x08, 0x0c, 0x86, 0xa4, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x30, + 0x20, 0x09, 0x00, 0x4c, 0x08, 0x0c, 0x86, 0xd3, 0xa0, 0x85, 0x00, 0x01, + 0x01, 0x2e, 0x00, 0x5e, 0x00, 0xce, 0x00, 0x05, 0xa0, 0x06, 0x0c, 0xd0, + 0x00, 0xf6, 0x00, 0xc6, 0x00, 0x46, 0x00, 0xc6, 0x08, 0x0c, 0x86, 0x4e, + 0x2c, 0x78, 0x00, 0xce, 0x01, 0x80, 0x7e, 0x12, 0x2c, 0x00, 0x78, 0x1a, + 0x78, 0x1f, 0x00, 0x03, 0x20, 0x21, 0x00, 0x05, 0x08, 0x0c, 0x9e, 0x0c, + 0x2f, 0x60, 0x20, 0x09, 0x00, 0x4d, 0x08, 0x0c, 0x86, 0xd3, 0xa0, 0x85, + 0x00, 0x01, 0x00, 0x4e, 0x00, 0xce, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, + 0x00, 0xc6, 0x00, 0x46, 0x00, 0xc6, 0x08, 0x0c, 0x86, 0x4e, 0x2c, 0x78, + 0x00, 0xce, 0x01, 0x78, 0x7e, 0x12, 0x2c, 0x00, 0x78, 0x1a, 0x78, 0x1f, + 0x00, 0x03, 0x20, 0x21, 0x00, 0x05, 0x04, 0x81, 0x2f, 0x60, 0x20, 0x09, + 0x00, 0x4e, 0x08, 0x0c, 0x86, 0xd3, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x4e, + 0x00, 0xce, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, 0x00, 0xc6, 0x00, 0x46, + 0x00, 0xc6, 0x08, 0x0c, 0x86, 0x4e, 0x2c, 0x78, 0x00, 0xce, 0x01, 0xc0, + 0x7e, 0x12, 0x2c, 0x00, 0x78, 0x1a, 0x78, 0x1f, 0x00, 0x03, 0x20, 0x21, + 0x00, 0x04, 0x00, 0xa1, 0x20, 0x01, 0xb8, 0xa0, 0x20, 0x04, 0xd0, 0xfc, + 0x01, 0x20, 0x2f, 0x60, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0x28, 0x2f, 0x60, + 0x20, 0x09, 0x00, 0x52, 0x08, 0x0c, 0x86, 0xd3, 0xa0, 0x85, 0x00, 0x01, + 0x00, 0x4e, 0x00, 0xce, 0x00, 0xfe, 0x00, 0x05, 0x00, 0x96, 0x00, 0x76, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x51, 0xbe, 0x01, 0x18, + 0x20, 0x01, 0x9e, 0x11, 0x00, 0x28, 0x08, 0x0c, 0x51, 0x8e, 0x01, 0x58, + 0x20, 0x01, 0x9e, 0x17, 0x00, 0x06, 0xa0, 0x0e, 0x24, 0x00, 0x08, 0x0c, + 0x55, 0x4d, 0x08, 0x0c, 0x54, 0x7a, 0x00, 0x0e, 0x08, 0x07, 0x24, 0x18, + 0x08, 0x0c, 0x70, 0xa1, 0x62, 0xa0, 0x00, 0x86, 0x20, 0x41, 0x00, 0x01, + 0x20, 0x39, 0x00, 0x01, 0x26, 0x08, 0x08, 0x0c, 0x6e, 0x80, 0x00, 0x8e, + 0x08, 0x0c, 0x6d, 0x74, 0x2f, 0x08, 0x26, 0x48, 0x08, 0x0c, 0xaf, 0x3e, + 0x61, 0x3c, 0x81, 0xff, 0x09, 0x0c, 0x6f, 0x35, 0x08, 0x0c, 0x71, 0xe5, + 0x01, 0x2e, 0x00, 0x7e, 0x00, 0x9e, 0x00, 0x05, 0x00, 0xc6, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x00, 0xc6, 0x08, 0x0c, 0x86, 0x4e, 0x00, 0x1e, + 0x01, 0x88, 0x66, 0x0a, 0x61, 0x1a, 0x08, 0x0c, 0xa0, 0xe3, 0x60, 0x1f, + 0x00, 0x01, 0x2d, 0x00, 0x60, 0x12, 0x20, 0x09, 0x00, 0x1f, 0x08, 0x0c, + 0x86, 0xd3, 0xa0, 0x85, 0x00, 0x01, 0x01, 0x2e, 0x00, 0xce, 0x00, 0x05, + 0xa0, 0x06, 0x0c, 0xd8, 0x00, 0xc6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x00, 0xc6, 0x08, 0x0c, 0x86, 0x4e, 0x00, 0x1e, 0x01, 0x88, 0x66, 0x0a, + 0x61, 0x1a, 0x08, 0x0c, 0xa0, 0xe3, 0x60, 0x1f, 0x00, 0x08, 0x2d, 0x00, + 0x60, 0x12, 0x20, 0x09, 0x00, 0x21, 0x08, 0x0c, 0x86, 0xd3, 0xa0, 0x85, + 0x00, 0x01, 0x01, 0x2e, 0x00, 0xce, 0x00, 0x05, 0xa0, 0x06, 0x0c, 0xd8, + 0x00, 0xc6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0xc6, 0x08, 0x0c, + 0x86, 0x4e, 0x00, 0x1e, 0x01, 0x88, 0x66, 0x0a, 0x61, 0x1a, 0x08, 0x0c, + 0xa0, 0xe3, 0x60, 0x1f, 0x00, 0x01, 0x2d, 0x00, 0x60, 0x12, 0x20, 0x09, + 0x00, 0x3d, 0x08, 0x0c, 0x86, 0xd3, 0xa0, 0x85, 0x00, 0x01, 0x01, 0x2e, + 0x00, 0xce, 0x00, 0x05, 0xa0, 0x06, 0x0c, 0xd8, 0x00, 0xc6, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x00, 0xc6, 0x08, 0x0c, 0x9f, 0x92, 0x00, 0x1e, + 0x01, 0x80, 0x61, 0x1a, 0x08, 0x0c, 0xa0, 0xe3, 0x60, 0x1f, 0x00, 0x01, + 0x2d, 0x00, 0x60, 0x12, 0x20, 0x09, 0x00, 0x00, 0x08, 0x0c, 0x86, 0xd3, + 0xa0, 0x85, 0x00, 0x01, 0x01, 0x2e, 0x00, 0xce, 0x00, 0x05, 0xa0, 0x06, + 0x0c, 0xd8, 0x00, 0xc6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0xc6, + 0x08, 0x0c, 0x86, 0x4e, 0x00, 0x1e, 0x01, 0x88, 0x66, 0x0a, 0x61, 0x1a, + 0x08, 0x0c, 0xa0, 0xe3, 0x60, 0x1f, 0x00, 0x01, 0x2d, 0x00, 0x60, 0x12, + 0x20, 0x09, 0x00, 0x44, 0x08, 0x0c, 0x86, 0xd3, 0xa0, 0x85, 0x00, 0x01, + 0x01, 0x2e, 0x00, 0xce, 0x00, 0x05, 0xa0, 0x06, 0x0c, 0xd8, 0x00, 0x26, + 0x00, 0xd6, 0x62, 0x18, 0x22, 0x68, 0x6a, 0x3c, 0x82, 0xff, 0x01, 0x10, + 0x82, 0x11, 0x6a, 0x3e, 0x00, 0xde, 0x00, 0x2e, 0x00, 0x05, 0x00, 0x06, + 0x60, 0x00, 0xa0, 0x86, 0x00, 0x00, 0x01, 0x90, 0x60, 0x13, 0x00, 0x00, + 0x60, 0x1f, 0x00, 0x07, 0x20, 0x01, 0xb8, 0xb6, 0x20, 0x04, 0x00, 0x06, + 0xa0, 0x82, 0x00, 0x51, 0x00, 0x0e, 0x02, 0x08, 0x80, 0x04, 0x60, 0x16, + 0x08, 0x0c, 0xb3, 0xf6, 0x60, 0x3f, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x05, + 0x00, 0x66, 0x00, 0xc6, 0x00, 0xd6, 0x20, 0x31, 0xb6, 0x53, 0x26, 0x34, + 0xd6, 0xe4, 0x01, 0x28, 0x66, 0x18, 0x26, 0x60, 0x6e, 0x48, 0x08, 0x0c, + 0x51, 0x47, 0x00, 0xde, 0x00, 0xce, 0x00, 0x6e, 0x00, 0x05, 0x00, 0x06, + 0x00, 0x16, 0x60, 0x04, 0xa0, 0x8e, 0x00, 0x02, 0x01, 0x40, 0xa0, 0x8e, + 0x00, 0x03, 0x01, 0x28, 0xa0, 0x8e, 0x00, 0x04, 0x01, 0x10, 0xa0, 0x85, + 0x00, 0x01, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, 0x00, 0xd6, + 0x60, 0x10, 0xa0, 0x6d, 0x01, 0x48, 0x68, 0x34, 0xa0, 0x86, 0x01, 0x39, + 0x01, 0x38, 0x68, 0x38, 0xd0, 0xfc, 0x01, 0x10, 0xa0, 0x06, 0x00, 0x10, + 0xa0, 0x85, 0x00, 0x01, 0x00, 0xde, 0x00, 0x0e, 0x00, 0x05, 0x00, 0xc6, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0xc6, 0x08, 0x0c, 0x86, 0x4e, + 0x00, 0x1e, 0x01, 0x90, 0x61, 0x1a, 0x08, 0x0c, 0xa0, 0xe3, 0x60, 0x1f, + 0x00, 0x01, 0x2d, 0x00, 0x60, 0x12, 0x08, 0x0c, 0x2c, 0xd1, 0x20, 0x09, + 0x00, 0x28, 0x08, 0x0c, 0x86, 0xd3, 0xa0, 0x85, 0x00, 0x01, 0x01, 0x2e, + 0x00, 0xce, 0x00, 0x05, 0xa0, 0x06, 0x0c, 0xd8, 0xa1, 0x86, 0x00, 0x15, + 0x11, 0x78, 0x20, 0x11, 0xb6, 0x21, 0x22, 0x04, 0xa0, 0x86, 0x00, 0x74, + 0x11, 0x48, 0x08, 0x0c, 0x90, 0x24, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, + 0x00, 0x29, 0x08, 0x0c, 0x6d, 0x45, 0x00, 0x20, 0x08, 0x0c, 0x8c, 0xa5, + 0x08, 0x0c, 0x86, 0xa4, 0x00, 0x05, 0xa1, 0x86, 0x00, 0x16, 0x11, 0x28, + 0x20, 0x01, 0x00, 0x04, 0x08, 0x0c, 0x4f, 0x6f, 0x00, 0xe8, 0xa1, 0x86, + 0x00, 0x15, 0x11, 0xe8, 0x20, 0x11, 0xb6, 0x21, 0x22, 0x04, 0xa0, 0x86, + 0x00, 0x14, 0x11, 0xb8, 0x00, 0xd6, 0x60, 0x18, 0x20, 0x68, 0x08, 0x0c, + 0x50, 0xbd, 0x00, 0xde, 0x08, 0x0c, 0x90, 0xdd, 0x11, 0x70, 0x00, 0xd6, + 0x60, 0x18, 0x20, 0x68, 0x68, 0x90, 0x00, 0xde, 0xa0, 0x05, 0x01, 0x38, + 0x20, 0x01, 0x00, 0x06, 0x08, 0x0c, 0x4f, 0x6f, 0x08, 0x0c, 0x88, 0x2c, + 0x00, 0x20, 0x08, 0x0c, 0x8c, 0xa5, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0x05, + 0x68, 0x48, 0xa0, 0x86, 0x00, 0x05, 0x11, 0x08, 0x00, 0x09, 0x00, 0x05, + 0x68, 0x50, 0xc0, 0xad, 0x68, 0x52, 0x00, 0x05, 0x00, 0xe6, 0x01, 0x26, + 0x20, 0x71, 0xb6, 0x00, 0x20, 0x91, 0x80, 0x00, 0x75, 0x48, 0xa5, 0x82, + 0x00, 0x01, 0x06, 0x08, 0x70, 0x4c, 0x20, 0x60, 0x60, 0x00, 0xa0, 0x86, + 0x00, 0x00, 0x01, 0x48, 0xac, 0xe0, 0x00, 0x18, 0x70, 0x5c, 0xac, 0x02, + 0x12, 0x08, 0x0c, 0xb0, 0x20, 0x61, 0xbe, 0x00, 0x0c, 0x98, 0x60, 0x03, + 0x00, 0x08, 0x85, 0x29, 0x75, 0x4a, 0xac, 0xa8, 0x00, 0x18, 0x70, 0x5c, + 0xa5, 0x02, 0x12, 0x30, 0x75, 0x4e, 0xa0, 0x85, 0x00, 0x01, 0x01, 0x2e, + 0x00, 0xee, 0x00, 0x05, 0x70, 0x4f, 0xbe, 0x00, 0x0c, 0xc0, 0xa0, 0x06, + 0x0c, 0xc0, 0x00, 0xe6, 0x20, 0x71, 0xbc, 0x8c, 0x70, 0x14, 0xd0, 0xe4, + 0x01, 0x50, 0x60, 0x13, 0x00, 0x00, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, + 0x00, 0x50, 0x08, 0x0c, 0x6c, 0xff, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0xee, + 0x00, 0x05, 0x00, 0xc6, 0x00, 0xf6, 0x2c, 0x78, 0x08, 0x0c, 0x53, 0x77, + 0x00, 0xfe, 0x01, 0x20, 0x60, 0x1c, 0xa0, 0x84, 0x00, 0x0f, 0x00, 0x13, + 0x00, 0xce, 0x00, 0x05, 0x9a, 0xba, 0x9f, 0xe9, 0x9f, 0xec, 0x9f, 0xef, + 0xb1, 0xe3, 0xb1, 0xfe, 0xb2, 0x01, 0x9a, 0xba, 0x9a, 0xba, 0x08, 0x0c, + 0x15, 0x1a, 0xe0, 0x00, 0xe0, 0x00, 0x00, 0x05, 0xe0, 0x00, 0xe0, 0x00, + 0x00, 0x05, 0x00, 0x09, 0x00, 0x05, 0x00, 0xf6, 0x2c, 0x78, 0x08, 0x0c, + 0x53, 0x77, 0x05, 0x38, 0x08, 0x0c, 0x86, 0x4e, 0x11, 0x28, 0x20, 0x01, + 0xb8, 0xb8, 0x20, 0x04, 0x78, 0x3e, 0x00, 0xf8, 0x78, 0x18, 0x60, 0x1a, + 0x08, 0x0c, 0xa0, 0xe3, 0x78, 0x1c, 0xa0, 0x86, 0x00, 0x03, 0x01, 0x28, + 0x78, 0x08, 0x60, 0x36, 0x2f, 0x00, 0x60, 0x3a, 0x00, 0x20, 0x78, 0x08, + 0x60, 0x3a, 0x2f, 0x00, 0x60, 0x36, 0x60, 0x2a, 0x60, 0x1f, 0x00, 0x01, + 0x60, 0x07, 0x00, 0x35, 0x60, 0x03, 0x00, 0x01, 0x79, 0x50, 0x61, 0x52, + 0x08, 0x0c, 0x6c, 0xff, 0x08, 0x0c, 0x71, 0xe5, 0x2f, 0x60, 0x00, 0xfe, + 0x00, 0x05, 0x00, 0x16, 0x00, 0xf6, 0x68, 0x2c, 0x60, 0x32, 0xa0, 0x8e, + 0x00, 0x01, 0x01, 0x38, 0xa0, 0x86, 0x00, 0x05, 0x01, 0x40, 0xa0, 0x06, + 0x60, 0x2a, 0x60, 0x2e, 0x00, 0xa0, 0x68, 0x20, 0xc0, 0xf4, 0xc0, 0xd5, + 0x68, 0x22, 0x68, 0x10, 0x20, 0x78, 0x78, 0x7c, 0x69, 0x38, 0xa1, 0x02, + 0x78, 0x80, 0x69, 0x34, 0xa1, 0x03, 0x1e, 0x78, 0x68, 0x34, 0x60, 0x2a, + 0x68, 0x38, 0xa0, 0x84, 0xff, 0xfc, 0x68, 0x3a, 0x60, 0x2e, 0x2d, 0x00, + 0x60, 0x36, 0x68, 0x08, 0x60, 0x3a, 0x69, 0x18, 0x61, 0x1a, 0x69, 0x50, + 0x61, 0x52, 0x60, 0x1f, 0x00, 0x01, 0x60, 0x07, 0x00, 0x39, 0x60, 0x03, + 0x00, 0x01, 0x08, 0x0c, 0x6c, 0xff, 0x68, 0x03, 0x00, 0x02, 0x00, 0xfe, + 0x00, 0x1e, 0x00, 0x05, 0x00, 0xf6, 0x2c, 0x78, 0x08, 0x0c, 0x53, 0x77, + 0x11, 0x18, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x70, 0x60, 0x20, 0xd0, 0xf4, + 0x11, 0x50, 0xc0, 0xf5, 0x60, 0x22, 0x60, 0x10, 0x20, 0x78, 0x78, 0x28, + 0x60, 0x3a, 0x78, 0x2c, 0x60, 0x36, 0x08, 0x0c, 0x19, 0x52, 0xa0, 0x06, + 0x00, 0xfe, 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, 0x60, 0x04, 0xa0, 0x8e, + 0x00, 0x34, 0x01, 0xb8, 0xa0, 0x8e, 0x00, 0x35, 0x01, 0xa0, 0xa0, 0x8e, + 0x00, 0x36, 0x01, 0x88, 0xa0, 0x8e, 0x00, 0x37, 0x01, 0x70, 0xa0, 0x8e, + 0x00, 0x38, 0x01, 0x58, 0xa0, 0x8e, 0x00, 0x39, 0x01, 0x40, 0xa0, 0x8e, + 0x00, 0x3a, 0x01, 0x28, 0xa0, 0x8e, 0x00, 0x3b, 0x01, 0x10, 0xa0, 0x85, + 0x00, 0x01, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, + 0x00, 0x26, 0x00, 0x36, 0x00, 0xe6, 0x20, 0x01, 0xb8, 0xb2, 0x20, 0x0c, + 0x80, 0x00, 0x20, 0x14, 0x20, 0x01, 0x00, 0x32, 0x08, 0x0c, 0x6b, 0xb2, + 0x20, 0x01, 0xb8, 0xb6, 0x82, 0xff, 0x11, 0x10, 0x20, 0x11, 0x00, 0x14, + 0x22, 0x02, 0x20, 0x01, 0xb8, 0xb4, 0x20, 0x0c, 0x80, 0x00, 0x20, 0x14, + 0x20, 0x71, 0xb8, 0x8e, 0x71, 0x1a, 0x72, 0x1e, 0x20, 0x01, 0x00, 0x64, + 0x08, 0x0c, 0x6b, 0xb2, 0x20, 0x01, 0xb8, 0xb7, 0x82, 0xff, 0x11, 0x10, + 0x20, 0x11, 0x00, 0x14, 0x22, 0x02, 0x20, 0x09, 0xb8, 0xb8, 0xa2, 0x80, + 0x00, 0x0a, 0x20, 0x0a, 0x08, 0x0c, 0x53, 0x9c, 0x00, 0xee, 0x00, 0x3e, + 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, 0x00, 0xe6, + 0x20, 0x01, 0xb8, 0xb6, 0x20, 0x03, 0x00, 0x28, 0x20, 0x01, 0xb8, 0xb7, + 0x20, 0x03, 0x00, 0x14, 0x20, 0x71, 0xb8, 0x8e, 0x70, 0x1b, 0x00, 0x00, + 0x70, 0x1f, 0x07, 0xd0, 0x20, 0x01, 0xb8, 0xb8, 0x20, 0x03, 0x00, 0x1e, + 0x00, 0xee, 0x00, 0x0e, 0x00, 0x05, 0x00, 0xd6, 0x60, 0x54, 0xa0, 0x6d, + 0x01, 0x10, 0x08, 0x0c, 0x16, 0x14, 0x00, 0xde, 0x00, 0x05, 0x00, 0x05, + 0x00, 0xc6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0xc6, 0x08, 0x0c, + 0x86, 0x4e, 0x00, 0x1e, 0x01, 0x78, 0x61, 0x1a, 0x0c, 0xa1, 0x60, 0x1f, + 0x00, 0x01, 0x2d, 0x00, 0x60, 0x12, 0x20, 0x09, 0x00, 0x33, 0x08, 0x0c, + 0x86, 0xd3, 0xa0, 0x85, 0x00, 0x01, 0x01, 0x2e, 0x00, 0xce, 0x00, 0x05, + 0xa0, 0x06, 0x0c, 0xd8, 0x00, 0xd6, 0x00, 0xe6, 0x00, 0xf6, 0x20, 0x71, + 0xb6, 0x00, 0xa1, 0x86, 0x00, 0x15, 0x15, 0x00, 0x70, 0x84, 0xa0, 0x86, + 0x00, 0x18, 0x11, 0xe0, 0x60, 0x10, 0x20, 0x68, 0x6a, 0x3c, 0xd2, 0xe4, + 0x11, 0x60, 0x2c, 0x78, 0x08, 0x0c, 0x73, 0xa3, 0x01, 0xd8, 0x70, 0x70, + 0x6a, 0x50, 0xa2, 0x06, 0x11, 0x60, 0x70, 0x74, 0x6a, 0x54, 0xa2, 0x06, + 0x11, 0x40, 0x62, 0x18, 0xa2, 0x90, 0x00, 0x28, 0x22, 0x14, 0x20, 0x09, + 0x00, 0x00, 0x08, 0x0c, 0x2d, 0x16, 0x08, 0x0c, 0x88, 0x2c, 0x00, 0x20, + 0x08, 0x0c, 0x8c, 0xa5, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0xfe, 0x00, 0xee, + 0x00, 0xde, 0x00, 0x05, 0x70, 0x54, 0x6a, 0x54, 0xa2, 0x06, 0x0d, 0x48, + 0x0c, 0x80, 0x00, 0xc6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0xc6, + 0x08, 0x0c, 0x86, 0x4e, 0x00, 0x1e, 0x01, 0x80, 0x61, 0x1a, 0x08, 0x0c, + 0xa0, 0xe3, 0x60, 0x1f, 0x00, 0x01, 0x2d, 0x00, 0x60, 0x12, 0x20, 0x09, + 0x00, 0x43, 0x08, 0x0c, 0x86, 0xd3, 0xa0, 0x85, 0x00, 0x01, 0x01, 0x2e, + 0x00, 0xce, 0x00, 0x05, 0xa0, 0x06, 0x0c, 0xd8, 0x00, 0xd6, 0x00, 0xe6, + 0x00, 0xf6, 0x20, 0x71, 0xb6, 0x00, 0xa1, 0x86, 0x00, 0x15, 0x11, 0xc0, + 0x70, 0x84, 0xa0, 0x86, 0x00, 0x04, 0x11, 0xa0, 0x60, 0x10, 0xa0, 0xe8, + 0x00, 0x0f, 0x2c, 0x78, 0x08, 0x0c, 0x73, 0xa3, 0x01, 0xa8, 0x70, 0x70, + 0x6a, 0x08, 0xa2, 0x06, 0x11, 0x30, 0x70, 0x74, 0x6a, 0x0c, 0xa2, 0x06, + 0x11, 0x10, 0x08, 0x0c, 0x2c, 0xd1, 0x08, 0x0c, 0x88, 0x2c, 0x00, 0x20, + 0x08, 0x0c, 0x8c, 0xa5, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0xfe, 0x00, 0xee, + 0x00, 0xde, 0x00, 0x05, 0x70, 0x54, 0x6a, 0x0c, 0xa2, 0x06, 0x0d, 0x78, + 0x0c, 0x80, 0x00, 0x16, 0x00, 0x26, 0x68, 0x4c, 0xd0, 0xac, 0x01, 0x78, + 0x69, 0x14, 0x6a, 0x10, 0x21, 0x00, 0xa2, 0x05, 0x01, 0x50, 0x68, 0x60, + 0xa1, 0x06, 0x11, 0x18, 0x68, 0x5c, 0xa2, 0x06, 0x01, 0x20, 0x69, 0x62, + 0x6a, 0x5e, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, + 0x00, 0xd6, 0x00, 0x36, 0x63, 0x10, 0x23, 0x68, 0x68, 0x4a, 0x69, 0x52, + 0xa2, 0x9e, 0x40, 0x00, 0x11, 0xa0, 0x00, 0xc6, 0x63, 0x18, 0x23, 0x60, + 0x20, 0x09, 0x00, 0x00, 0x68, 0x38, 0xd0, 0xf4, 0x11, 0x40, 0x08, 0x0c, + 0x52, 0xbc, 0x11, 0x08, 0xc1, 0x85, 0x60, 0x00, 0xd0, 0xbc, 0x01, 0x08, + 0xc1, 0x8d, 0x6a, 0x66, 0x69, 0x6a, 0x00, 0xce, 0x00, 0x80, 0x6a, 0x66, + 0x39, 0x18, 0xa3, 0x98, 0x00, 0x06, 0x23, 0x1c, 0x68, 0x6b, 0x00, 0x04, + 0x6b, 0x72, 0x00, 0xc6, 0x63, 0x18, 0x23, 0x60, 0x60, 0x04, 0xa0, 0x84, + 0x00, 0xff, 0x68, 0x6e, 0x00, 0xce, 0x08, 0x0c, 0x54, 0x7a, 0x60, 0x13, + 0x00, 0x00, 0x00, 0x3e, 0x00, 0xde, 0x00, 0x05, 0x00, 0xc6, 0x00, 0x26, + 0x00, 0x16, 0xa1, 0x86, 0x00, 0x35, 0x01, 0x10, 0x6a, 0x34, 0x00, 0x08, + 0x6a, 0x28, 0x08, 0x0c, 0x9d, 0x06, 0x01, 0xf0, 0x22, 0x60, 0x61, 0x1c, + 0xa1, 0x86, 0x00, 0x03, 0x01, 0x18, 0xa1, 0x86, 0x00, 0x06, 0x11, 0x90, + 0x68, 0x34, 0xa2, 0x06, 0x01, 0x40, 0x68, 0x38, 0xa2, 0x06, 0x11, 0x60, + 0x61, 0x08, 0x68, 0x34, 0xa1, 0x06, 0x11, 0x40, 0x00, 0x20, 0x60, 0x08, + 0x69, 0x38, 0xa1, 0x06, 0x11, 0x18, 0x60, 0x18, 0x69, 0x18, 0xa1, 0x06, + 0x00, 0x1e, 0x00, 0x2e, 0x00, 0xce, 0x00, 0x05, 0xa0, 0x85, 0x00, 0x01, + 0x0c, 0xc8, 0x69, 0x44, 0xd1, 0xcc, 0x01, 0x98, 0xa1, 0x8c, 0x00, 0xff, + 0xa1, 0x8e, 0x00, 0x02, 0x11, 0x70, 0xad, 0x88, 0x00, 0x1e, 0x21, 0x0c, + 0xa1, 0x8c, 0x0f, 0x00, 0x81, 0x0f, 0xa1, 0x8e, 0x00, 0x01, 0x11, 0x28, + 0x68, 0x10, 0x69, 0x14, 0xa1, 0x15, 0x19, 0x0c, 0x95, 0x3f, 0x00, 0x05, + 0x08, 0x0c, 0x86, 0xa4, 0x08, 0x04, 0x71, 0xe5, 0x00, 0x66, 0x60, 0x00, + 0xa0, 0xb2, 0x00, 0x10, 0x1a, 0x0c, 0x15, 0x1a, 0x00, 0x13, 0x00, 0x6e, + 0x00, 0x05, 0xa2, 0x27, 0xa7, 0x02, 0xa8, 0x28, 0xa2, 0x27, 0xa2, 0x27, + 0xa2, 0x27, 0xa2, 0x27, 0xa2, 0x27, 0xa2, 0x5f, 0xa8, 0xac, 0xa2, 0x27, + 0xa2, 0x27, 0xa2, 0x27, 0xa2, 0x27, 0xa2, 0x27, 0xa2, 0x27, 0x08, 0x0c, + 0x15, 0x1a, 0x00, 0x66, 0x60, 0x00, 0xa0, 0xb2, 0x00, 0x10, 0x1a, 0x0c, + 0x15, 0x1a, 0x00, 0x13, 0x00, 0x6e, 0x00, 0x05, 0xa2, 0x42, 0xad, 0x33, + 0xa2, 0x42, 0xa2, 0x42, 0xa2, 0x42, 0xa2, 0x42, 0xa2, 0x42, 0xa2, 0x42, + 0xac, 0xf5, 0xad, 0x7b, 0xa2, 0x42, 0xb3, 0x28, 0xb3, 0x58, 0xb3, 0x28, + 0xb3, 0x58, 0xa2, 0x42, 0x08, 0x0c, 0x15, 0x1a, 0x00, 0x66, 0x60, 0x00, + 0xa0, 0xb2, 0x00, 0x10, 0x1a, 0x0c, 0x15, 0x1a, 0x00, 0x13, 0x00, 0x6e, + 0x00, 0x05, 0xa2, 0x5d, 0xa9, 0xfc, 0xaa, 0xc9, 0xaa, 0xf6, 0xab, 0x7a, + 0xa2, 0x5d, 0xac, 0x67, 0xac, 0x12, 0xa8, 0xb8, 0xac, 0xcb, 0xac, 0xe0, + 0xa2, 0x5d, 0xa2, 0x5d, 0xa2, 0x5d, 0xa2, 0x5d, 0xa2, 0x5d, 0x08, 0x0c, + 0x15, 0x1a, 0xa1, 0xb2, 0x00, 0x80, 0x1a, 0x0c, 0x15, 0x1a, 0x21, 0x00, + 0xa1, 0xb2, 0x00, 0x40, 0x1a, 0x04, 0xa6, 0x76, 0x00, 0x02, 0xa2, 0xa9, + 0xa4, 0x74, 0xa2, 0xa9, 0xa2, 0xa9, 0xa2, 0xa9, 0xa4, 0x7b, 0xa2, 0xa9, + 0xa2, 0xa9, 0xa2, 0xa9, 0xa2, 0xa9, 0xa2, 0xa9, 0xa2, 0xa9, 0xa2, 0xa9, + 0xa2, 0xa9, 0xa2, 0xa9, 0xa2, 0xa9, 0xa2, 0xa9, 0xa2, 0xa9, 0xa2, 0xa9, + 0xa2, 0xa9, 0xa2, 0xa9, 0xa2, 0xa9, 0xa2, 0xa9, 0xa2, 0xab, 0xa3, 0x09, + 0xa3, 0x18, 0xa3, 0x66, 0xa3, 0x84, 0xa4, 0x02, 0xa4, 0x61, 0xa2, 0xa9, + 0xa2, 0xa9, 0xa4, 0x7e, 0xa2, 0xa9, 0xa2, 0xa9, 0xa4, 0x91, 0xa4, 0x9c, + 0xa2, 0xa9, 0xa2, 0xa9, 0xa2, 0xa9, 0xa2, 0xa9, 0xa2, 0xa9, 0xa5, 0x27, + 0xa2, 0xa9, 0xa2, 0xa9, 0xa5, 0x3a, 0xa2, 0xa9, 0xa2, 0xa9, 0xa4, 0xf2, + 0xa2, 0xa9, 0xa2, 0xa9, 0xa2, 0xa9, 0xa5, 0x52, 0xa2, 0xa9, 0xa2, 0xa9, + 0xa2, 0xa9, 0xa5, 0xcc, 0xa2, 0xa9, 0xa2, 0xa9, 0xa2, 0xa9, 0xa2, 0xa9, + 0xa2, 0xa9, 0xa2, 0xa9, 0xa6, 0x3d, 0x08, 0x0c, 0x15, 0x1a, 0x08, 0x0c, + 0x53, 0x7b, 0x11, 0x50, 0x20, 0x01, 0xb6, 0x35, 0x20, 0x04, 0xd0, 0xcc, + 0x11, 0x28, 0xa0, 0x84, 0x00, 0x09, 0xa0, 0x86, 0x00, 0x08, 0x11, 0x40, + 0x60, 0x07, 0x00, 0x09, 0x60, 0x2b, 0x00, 0x09, 0x60, 0x13, 0x00, 0x00, + 0x08, 0x04, 0xa4, 0x6f, 0x08, 0x0c, 0x53, 0x6b, 0x00, 0xe6, 0x00, 0xc6, + 0x00, 0x36, 0x00, 0x26, 0x00, 0x16, 0x62, 0x18, 0x22, 0x70, 0x72, 0xa0, + 0x00, 0x26, 0x20, 0x19, 0x00, 0x29, 0x08, 0x0c, 0x6e, 0x67, 0x00, 0x76, + 0x20, 0x39, 0x00, 0x00, 0x08, 0x0c, 0x6d, 0x74, 0x2c, 0x08, 0x08, 0x0c, + 0xaf, 0x3e, 0x00, 0x7e, 0x00, 0x1e, 0x2e, 0x60, 0x08, 0x0c, 0x52, 0x1c, + 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x3e, 0x00, 0xce, 0x00, 0xee, 0x66, 0x18, + 0x00, 0xc6, 0x26, 0x60, 0x08, 0x0c, 0x50, 0x2a, 0x00, 0xce, 0xa6, 0xb0, + 0x00, 0x01, 0x26, 0x34, 0xa6, 0x84, 0x00, 0xff, 0xa0, 0x82, 0x00, 0x06, + 0x02, 0x78, 0x08, 0x0c, 0xae, 0x82, 0x19, 0x04, 0xa3, 0x60, 0x08, 0x0c, + 0xae, 0x22, 0x11, 0x20, 0x60, 0x07, 0x00, 0x08, 0x08, 0x04, 0xa4, 0x6f, + 0x60, 0x07, 0x00, 0x09, 0x08, 0x04, 0xa4, 0x6f, 0x08, 0x0c, 0xb0, 0x37, + 0x01, 0x28, 0x08, 0x0c, 0xae, 0x82, 0x0d, 0x78, 0x08, 0x04, 0xa3, 0x60, + 0x60, 0x13, 0x19, 0x00, 0x0c, 0x88, 0x08, 0x0c, 0x2d, 0xf4, 0x19, 0x04, + 0xa6, 0x73, 0x61, 0x06, 0x08, 0x0c, 0xad, 0xdc, 0x60, 0x07, 0x00, 0x06, + 0x08, 0x04, 0xa4, 0x6f, 0x60, 0x07, 0x00, 0x07, 0x08, 0x04, 0xa4, 0x6f, + 0x08, 0x0c, 0xb3, 0x8c, 0x19, 0x04, 0xa6, 0x73, 0x08, 0x0c, 0x2d, 0xf4, + 0x19, 0x04, 0xa6, 0x73, 0x00, 0xd6, 0x66, 0x18, 0x26, 0x68, 0x6e, 0x04, + 0xa6, 0x84, 0x00, 0xff, 0xa0, 0x82, 0x00, 0x06, 0x12, 0x20, 0x20, 0x01, + 0x00, 0x01, 0x08, 0x0c, 0x4f, 0x5d, 0xa6, 0xb4, 0xff, 0x00, 0x86, 0x37, + 0xa6, 0x86, 0x00, 0x06, 0x01, 0x88, 0xa6, 0x86, 0x00, 0x04, 0x01, 0x70, + 0x6e, 0x04, 0xa6, 0xb4, 0x00, 0xff, 0xa6, 0x86, 0x00, 0x06, 0x01, 0x40, + 0xa6, 0x86, 0x00, 0x04, 0x01, 0x28, 0xa6, 0x86, 0x00, 0x05, 0x01, 0x10, + 0x00, 0xde, 0x00, 0xe0, 0x08, 0x0c, 0xae, 0xe0, 0x11, 0xa0, 0xa6, 0x86, + 0x00, 0x06, 0x11, 0x50, 0x00, 0x26, 0x62, 0x18, 0xa2, 0x90, 0x00, 0x28, + 0x22, 0x14, 0x20, 0x09, 0x00, 0x00, 0x08, 0x0c, 0x2d, 0x16, 0x00, 0x2e, + 0x08, 0x0c, 0x50, 0xbd, 0x60, 0x07, 0x00, 0x0a, 0x00, 0xde, 0x08, 0x04, + 0xa4, 0x6f, 0x60, 0x07, 0x00, 0x0b, 0x00, 0xde, 0x08, 0x04, 0xa4, 0x6f, + 0x08, 0x0c, 0x2c, 0xd1, 0x60, 0x07, 0x00, 0x01, 0x08, 0x04, 0xa4, 0x6f, + 0x08, 0x0c, 0xb3, 0x8c, 0x19, 0x04, 0xa6, 0x73, 0x08, 0x0c, 0x2d, 0xf4, + 0x19, 0x04, 0xa6, 0x73, 0x66, 0x18, 0x00, 0xd6, 0x26, 0x68, 0x6e, 0x04, + 0x00, 0xde, 0xa6, 0x86, 0x07, 0x07, 0x0d, 0x50, 0x00, 0x26, 0x62, 0x18, + 0xa2, 0x90, 0x00, 0x28, 0x22, 0x14, 0x20, 0x09, 0x00, 0x00, 0x08, 0x0c, + 0x2d, 0x16, 0x00, 0x2e, 0x60, 0x07, 0x00, 0x0c, 0x08, 0x04, 0xa4, 0x6f, + 0x08, 0x0c, 0x53, 0x7b, 0x11, 0x40, 0x20, 0x01, 0xb6, 0x35, 0x20, 0x04, + 0xa0, 0x84, 0x00, 0x09, 0xa0, 0x86, 0x00, 0x08, 0x11, 0x10, 0x08, 0x04, + 0xa2, 0xb8, 0x08, 0x0c, 0x53, 0x6b, 0x66, 0x18, 0xa6, 0xb0, 0x00, 0x01, + 0x26, 0x34, 0xa6, 0x84, 0x00, 0xff, 0xa0, 0x82, 0x00, 0x06, 0x06, 0xe8, + 0x11, 0x38, 0x00, 0x26, 0x20, 0x01, 0x00, 0x06, 0x08, 0x0c, 0x4f, 0x9c, + 0x00, 0x2e, 0x00, 0x50, 0xa6, 0xb4, 0xff, 0x00, 0x86, 0x37, 0xa6, 0x86, + 0x00, 0x04, 0x01, 0x20, 0xa6, 0x86, 0x00, 0x06, 0x19, 0x04, 0xa3, 0x60, + 0x08, 0x0c, 0xae, 0xed, 0x11, 0x20, 0x60, 0x07, 0x00, 0x0e, 0x08, 0x04, + 0xa4, 0x6f, 0x00, 0x46, 0x64, 0x18, 0xa4, 0xa0, 0x00, 0x28, 0x24, 0x24, + 0xa4, 0xa4, 0x00, 0xff, 0x84, 0x27, 0x00, 0x46, 0x08, 0x0c, 0x2c, 0xd1, + 0x00, 0x4e, 0x00, 0x16, 0xa0, 0x06, 0x20, 0x09, 0xb6, 0x53, 0x21, 0x0c, + 0xd1, 0xa4, 0x01, 0x58, 0x20, 0x09, 0x00, 0x29, 0x08, 0x0c, 0xb1, 0xa4, + 0x60, 0x18, 0x00, 0xd6, 0x20, 0x68, 0x68, 0x00, 0xc0, 0xe5, 0x68, 0x02, + 0x00, 0xde, 0x00, 0x1e, 0x00, 0x4e, 0x60, 0x07, 0x00, 0x01, 0x08, 0x04, + 0xa4, 0x6f, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x4f, 0x5d, 0x01, 0x56, + 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x19, + 0xb6, 0x05, 0x20, 0x11, 0xbc, 0x90, 0x08, 0x0c, 0x91, 0x66, 0x00, 0x3e, + 0x00, 0x2e, 0x00, 0x1e, 0x01, 0x5e, 0xa0, 0x05, 0x01, 0x68, 0xa6, 0xb4, + 0xff, 0x00, 0x86, 0x37, 0xa6, 0x82, 0x00, 0x04, 0x0a, 0x04, 0xa3, 0x60, + 0xa6, 0x82, 0x00, 0x07, 0x0a, 0x04, 0xa3, 0xae, 0x08, 0x04, 0xa3, 0x60, + 0x60, 0x13, 0x19, 0x00, 0x60, 0x07, 0x00, 0x09, 0x08, 0x04, 0xa4, 0x6f, + 0x08, 0x0c, 0x53, 0x7b, 0x11, 0x40, 0x20, 0x01, 0xb6, 0x35, 0x20, 0x04, + 0xa0, 0x84, 0x00, 0x09, 0xa0, 0x86, 0x00, 0x08, 0x11, 0x10, 0x08, 0x04, + 0xa2, 0xb8, 0x08, 0x0c, 0x53, 0x6b, 0x66, 0x18, 0xa6, 0xb0, 0x00, 0x01, + 0x26, 0x34, 0xa6, 0x84, 0x00, 0xff, 0xa0, 0x82, 0x00, 0x06, 0x06, 0xb8, + 0xa6, 0xb4, 0xff, 0x00, 0x86, 0x37, 0xa6, 0x86, 0x00, 0x04, 0x01, 0x20, + 0xa6, 0x86, 0x00, 0x06, 0x19, 0x04, 0xa3, 0x60, 0x08, 0x0c, 0xaf, 0x15, + 0x11, 0x38, 0x08, 0x0c, 0xae, 0x22, 0x11, 0x20, 0x60, 0x07, 0x00, 0x10, + 0x08, 0x04, 0xa4, 0x6f, 0x00, 0x46, 0x64, 0x18, 0xa4, 0xa0, 0x00, 0x28, + 0x24, 0x24, 0xa4, 0xa4, 0x00, 0xff, 0x84, 0x27, 0x00, 0x46, 0x08, 0x0c, + 0x2c, 0xd1, 0x00, 0x4e, 0x00, 0x16, 0xa0, 0x06, 0x20, 0x09, 0xb6, 0x53, + 0x21, 0x0c, 0xd1, 0xa4, 0x01, 0x58, 0x20, 0x09, 0x00, 0x29, 0x08, 0x0c, + 0xb1, 0xa4, 0x60, 0x18, 0x00, 0xd6, 0x20, 0x68, 0x68, 0x00, 0xc0, 0xe5, + 0x68, 0x02, 0x00, 0xde, 0x00, 0x1e, 0x00, 0x4e, 0x60, 0x07, 0x00, 0x01, + 0x00, 0xf0, 0x08, 0x0c, 0xb0, 0x37, 0x01, 0x40, 0xa6, 0xb4, 0xff, 0x00, + 0x86, 0x37, 0xa6, 0x86, 0x00, 0x06, 0x09, 0x50, 0x08, 0x04, 0xa3, 0x60, + 0x60, 0x13, 0x19, 0x00, 0x60, 0x07, 0x00, 0x09, 0x00, 0x70, 0x08, 0x0c, + 0x2d, 0xf4, 0x19, 0x04, 0xa6, 0x73, 0x08, 0x0c, 0xb3, 0x8c, 0x19, 0x04, + 0xa6, 0x73, 0x08, 0x0c, 0xa6, 0x9b, 0x19, 0x04, 0xa3, 0x60, 0x60, 0x07, + 0x00, 0x12, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x6d, 0x45, 0x00, 0x05, + 0x60, 0x07, 0x00, 0x01, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x6d, 0x45, + 0x0c, 0xc0, 0x60, 0x07, 0x00, 0x05, 0x0c, 0xc0, 0x08, 0x0c, 0xb3, 0x8c, + 0x19, 0x04, 0xa6, 0x73, 0x08, 0x0c, 0x2d, 0xf4, 0x19, 0x04, 0xa6, 0x73, + 0x08, 0x0c, 0xa6, 0x9b, 0x19, 0x04, 0xa3, 0x60, 0x60, 0x07, 0x00, 0x20, + 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x6d, 0x45, 0x00, 0x05, 0x08, 0x0c, + 0x2d, 0xf4, 0x19, 0x04, 0xa6, 0x73, 0x60, 0x07, 0x00, 0x23, 0x60, 0x03, + 0x00, 0x01, 0x08, 0x0c, 0x6d, 0x45, 0x00, 0x05, 0x08, 0x0c, 0xb3, 0x8c, + 0x19, 0x04, 0xa6, 0x73, 0x08, 0x0c, 0x2d, 0xf4, 0x19, 0x04, 0xa6, 0x73, + 0x08, 0x0c, 0xa6, 0x9b, 0x19, 0x04, 0xa3, 0x60, 0x00, 0x16, 0x00, 0x26, + 0x20, 0x11, 0xbc, 0x91, 0x22, 0x14, 0xa2, 0x86, 0xff, 0xff, 0x01, 0x90, + 0x2c, 0x08, 0x08, 0x0c, 0x9d, 0x06, 0x01, 0xe0, 0x22, 0x60, 0x20, 0x11, + 0xbc, 0x90, 0x22, 0x14, 0x60, 0x08, 0xa2, 0x06, 0x11, 0xa8, 0x60, 0x18, + 0xa1, 0x90, 0x00, 0x06, 0x22, 0x14, 0xa2, 0x06, 0x01, 0xe8, 0x00, 0x70, + 0x20, 0x11, 0xbc, 0x90, 0x22, 0x14, 0x2c, 0x08, 0xa0, 0x06, 0x08, 0x0c, + 0xb1, 0x76, 0x11, 0xa0, 0x20, 0x11, 0xbc, 0x91, 0x22, 0x14, 0xa2, 0x86, + 0xff, 0xff, 0x01, 0xc0, 0x21, 0x60, 0x60, 0x07, 0x00, 0x26, 0x60, 0x13, + 0x17, 0x00, 0x20, 0x11, 0xbc, 0x89, 0x22, 0x14, 0xa2, 0x96, 0xff, 0xff, + 0x11, 0x80, 0x60, 0x07, 0x00, 0x25, 0x00, 0x68, 0x60, 0x1c, 0xa0, 0x86, + 0x00, 0x07, 0x1d, 0x70, 0x60, 0x04, 0xa0, 0x86, 0x00, 0x24, 0x11, 0x10, + 0x08, 0x0c, 0x86, 0xa4, 0x21, 0x60, 0x60, 0x07, 0x00, 0x25, 0x60, 0x03, + 0x00, 0x01, 0x08, 0x0c, 0x6d, 0x45, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, + 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x4f, 0x5d, 0x01, 0x56, 0x00, 0x16, + 0x00, 0x26, 0x00, 0x36, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x19, 0xb6, 0x05, + 0x20, 0x11, 0xbc, 0x96, 0x08, 0x0c, 0x91, 0x66, 0x00, 0x3e, 0x00, 0x2e, + 0x00, 0x1e, 0x01, 0x5e, 0x01, 0x20, 0x60, 0x07, 0x00, 0x31, 0x08, 0x04, + 0xa4, 0x6f, 0x08, 0x0c, 0x8e, 0x82, 0x08, 0x0c, 0x5b, 0x41, 0x11, 0xb0, + 0x00, 0x06, 0x00, 0x26, 0x00, 0x36, 0x08, 0x0c, 0x5b, 0x5d, 0x11, 0x58, + 0x20, 0x01, 0xb8, 0x9f, 0x20, 0x03, 0x00, 0x01, 0x20, 0x01, 0xb6, 0x00, + 0x20, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x5a, 0x79, 0x00, 0x10, 0x08, 0x0c, + 0x5b, 0x18, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x0e, 0x00, 0x05, 0x08, 0x0c, + 0x2d, 0xf4, 0x19, 0x04, 0xa6, 0x73, 0x08, 0x0c, 0xa6, 0x9b, 0x19, 0x04, + 0xa3, 0x60, 0x61, 0x06, 0x08, 0x0c, 0xa6, 0xb7, 0x60, 0x07, 0x00, 0x2b, + 0x08, 0x04, 0xa4, 0x6f, 0x60, 0x07, 0x00, 0x2c, 0x08, 0x04, 0xa4, 0x6f, + 0x08, 0x0c, 0xb3, 0x8c, 0x19, 0x04, 0xa6, 0x73, 0x08, 0x0c, 0x2d, 0xf4, + 0x19, 0x04, 0xa6, 0x73, 0x08, 0x0c, 0xa6, 0x9b, 0x19, 0x04, 0xa3, 0x60, + 0x61, 0x06, 0x08, 0x0c, 0xa6, 0xbb, 0x11, 0x20, 0x60, 0x07, 0x00, 0x2e, + 0x08, 0x04, 0xa4, 0x6f, 0x60, 0x07, 0x00, 0x2f, 0x08, 0x04, 0xa4, 0x6f, + 0x08, 0x0c, 0x2d, 0xf4, 0x19, 0x04, 0xa6, 0x73, 0x00, 0xe6, 0x00, 0xd6, + 0x00, 0xc6, 0x60, 0x18, 0xa0, 0x80, 0x00, 0x01, 0x20, 0x0c, 0xa1, 0x84, + 0x00, 0xff, 0xa0, 0x86, 0x00, 0x06, 0x01, 0x58, 0xa1, 0x84, 0xff, 0x00, + 0x80, 0x07, 0xa0, 0x86, 0x00, 0x06, 0x01, 0x28, 0x00, 0xce, 0x00, 0xde, + 0x00, 0xee, 0x08, 0x04, 0xa4, 0x74, 0x20, 0x01, 0xb6, 0x72, 0x20, 0x04, + 0xd0, 0xe4, 0x09, 0x04, 0xa5, 0xc9, 0x20, 0x71, 0xbc, 0x8c, 0x70, 0x10, + 0x60, 0x36, 0x70, 0x14, 0x60, 0x3a, 0x71, 0x08, 0x72, 0x0c, 0x20, 0x01, + 0xb6, 0x53, 0x20, 0x04, 0xd0, 0xa4, 0x01, 0x40, 0x60, 0x18, 0x20, 0x68, + 0x68, 0x10, 0xa1, 0x06, 0x11, 0x18, 0x68, 0x14, 0xa2, 0x06, 0x01, 0xf8, + 0x20, 0x01, 0xb6, 0x53, 0x20, 0x04, 0xd0, 0xac, 0x15, 0x90, 0x20, 0x69, + 0xb6, 0x00, 0x68, 0x74, 0xa2, 0x06, 0x15, 0x68, 0x68, 0x70, 0xa1, 0x06, + 0x15, 0x50, 0x72, 0x10, 0x08, 0x0c, 0x9d, 0x06, 0x05, 0x58, 0x08, 0x0c, + 0xb2, 0x10, 0x05, 0x40, 0x62, 0x2a, 0x60, 0x07, 0x00, 0x36, 0x60, 0x03, + 0x00, 0x01, 0x08, 0x0c, 0x6c, 0xff, 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, + 0x00, 0x05, 0x72, 0x14, 0xa2, 0x86, 0xff, 0xff, 0x01, 0x50, 0x08, 0x0c, + 0x9d, 0x06, 0x01, 0xb0, 0xa2, 0x80, 0x00, 0x02, 0x20, 0x04, 0x71, 0x10, + 0xa1, 0x06, 0x11, 0x80, 0x0c, 0x08, 0x72, 0x10, 0x2c, 0x08, 0xa0, 0x85, + 0x00, 0x01, 0x08, 0x0c, 0xb1, 0x76, 0x2c, 0x10, 0x21, 0x60, 0x01, 0x30, + 0x08, 0xb8, 0x60, 0x07, 0x00, 0x37, 0x60, 0x13, 0x15, 0x00, 0x08, 0xd8, + 0x60, 0x07, 0x00, 0x37, 0x60, 0x13, 0x17, 0x00, 0x08, 0xb0, 0x60, 0x07, + 0x00, 0x12, 0x08, 0x98, 0x08, 0x0c, 0x2d, 0xf4, 0x19, 0x04, 0xa6, 0x73, + 0x60, 0x18, 0xa0, 0x80, 0x00, 0x01, 0x20, 0x04, 0xa0, 0x84, 0xff, 0x00, + 0x80, 0x07, 0xa0, 0x86, 0x00, 0x06, 0x19, 0x04, 0xa4, 0x74, 0x00, 0xe6, + 0x00, 0xd6, 0x00, 0xc6, 0x20, 0x01, 0xb6, 0x72, 0x20, 0x04, 0xd0, 0xe4, + 0x09, 0x04, 0xa6, 0x35, 0x20, 0x69, 0xb6, 0x00, 0x20, 0x71, 0xbc, 0x8c, + 0x70, 0x08, 0x60, 0x36, 0x72, 0x0c, 0x62, 0x3a, 0xa2, 0x86, 0xff, 0xff, + 0x11, 0x50, 0x72, 0x08, 0x00, 0xc6, 0x2c, 0x08, 0xa0, 0x85, 0x00, 0x01, + 0x08, 0x0c, 0xb1, 0x76, 0x2c, 0x10, 0x00, 0xce, 0x05, 0x88, 0x08, 0x0c, + 0x9d, 0x06, 0x05, 0x70, 0x00, 0xc6, 0x00, 0x26, 0x22, 0x60, 0x08, 0x0c, + 0x99, 0xd9, 0x00, 0x2e, 0x00, 0xce, 0x71, 0x18, 0xa1, 0x8c, 0xff, 0x00, + 0x81, 0x0f, 0xa1, 0x86, 0x00, 0x01, 0x01, 0x58, 0xa1, 0x86, 0x00, 0x05, + 0x01, 0x18, 0xa1, 0x86, 0x00, 0x07, 0x11, 0x78, 0xa2, 0x80, 0x00, 0x04, + 0x20, 0x04, 0xa0, 0x05, 0x01, 0x50, 0x00, 0x56, 0x75, 0x10, 0x76, 0x14, + 0x08, 0x0c, 0xb2, 0x27, 0x00, 0x5e, 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, + 0x00, 0x05, 0x60, 0x07, 0x00, 0x3b, 0x60, 0x2b, 0x00, 0x09, 0x60, 0x13, + 0x2a, 0x00, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x6c, 0xff, 0x0c, 0x88, + 0x60, 0x07, 0x00, 0x3b, 0x60, 0x2b, 0x00, 0x09, 0x60, 0x13, 0x17, 0x00, + 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x6c, 0xff, 0x0c, 0x30, 0x60, 0x07, + 0x00, 0x3b, 0x60, 0x2b, 0x00, 0x0b, 0x60, 0x13, 0x00, 0x00, 0x08, 0x04, + 0xa5, 0x9f, 0x00, 0xe6, 0x00, 0x26, 0x08, 0x0c, 0x53, 0x7b, 0x05, 0x58, + 0x08, 0x0c, 0x53, 0x6b, 0x08, 0x0c, 0xb4, 0x07, 0x15, 0x20, 0x20, 0x71, + 0xb6, 0x00, 0x70, 0xd4, 0xc0, 0x85, 0x70, 0xd6, 0x00, 0xf6, 0x20, 0x79, + 0x01, 0x00, 0x72, 0xa0, 0xa2, 0x84, 0x00, 0xff, 0x70, 0x72, 0x78, 0xe6, + 0xa2, 0x84, 0xff, 0x00, 0x72, 0x74, 0xa2, 0x05, 0x70, 0x76, 0x78, 0xea, + 0x00, 0xfe, 0x70, 0xdf, 0x00, 0x00, 0x20, 0x01, 0xb6, 0x53, 0x20, 0x04, + 0xd0, 0xa4, 0x01, 0x20, 0x20, 0x11, 0xb8, 0xfa, 0x20, 0x13, 0x07, 0xd0, + 0xd0, 0xac, 0x11, 0x28, 0x08, 0x0c, 0x2a, 0xed, 0x00, 0x10, 0x08, 0x0c, + 0xb4, 0x33, 0x00, 0x2e, 0x00, 0xee, 0x08, 0x0c, 0x86, 0xa4, 0x08, 0x04, + 0xa4, 0x73, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0x05, 0x26, 0x00, 0x00, 0x02, + 0xa6, 0x81, 0xa6, 0x81, 0xa6, 0x81, 0xa6, 0x81, 0xa6, 0x81, 0xa6, 0x83, + 0xa6, 0x81, 0xa6, 0x81, 0xa6, 0x81, 0x08, 0x0c, 0x15, 0x1a, 0x08, 0x0c, + 0xb3, 0x8c, 0x1d, 0x68, 0x08, 0x0c, 0x2d, 0xf4, 0x1d, 0x50, 0x00, 0x89, + 0x11, 0x38, 0x60, 0x07, 0x00, 0x45, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, + 0x6d, 0x45, 0x00, 0x05, 0x08, 0x0c, 0x2c, 0xd1, 0x60, 0x07, 0x00, 0x01, + 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x6d, 0x45, 0x00, 0x05, 0x00, 0xd6, + 0x00, 0x66, 0x66, 0x18, 0x26, 0x68, 0x6e, 0x04, 0xa6, 0xb4, 0xff, 0x00, + 0x86, 0x37, 0xa6, 0x86, 0x00, 0x06, 0x01, 0x70, 0xa6, 0x86, 0x00, 0x04, + 0x01, 0x58, 0x6e, 0x04, 0xa6, 0xb4, 0x00, 0xff, 0xa6, 0x86, 0x00, 0x06, + 0x01, 0x28, 0xa6, 0x86, 0x00, 0x04, 0x01, 0x10, 0xa0, 0x85, 0x00, 0x01, + 0x00, 0x6e, 0x00, 0xde, 0x00, 0x05, 0x00, 0xd6, 0x04, 0x49, 0x00, 0xde, + 0x00, 0x05, 0x00, 0xd6, 0x04, 0x91, 0x11, 0xf0, 0x68, 0x0c, 0xa0, 0x8c, + 0xff, 0x00, 0x68, 0x20, 0xa0, 0x84, 0x00, 0xff, 0xa1, 0x15, 0x62, 0x12, + 0x68, 0x24, 0x60, 0x2a, 0xd1, 0xe4, 0x01, 0x18, 0x20, 0x09, 0x00, 0x01, + 0x00, 0x60, 0xd1, 0xec, 0x01, 0x68, 0x69, 0x20, 0xa1, 0x8c, 0x00, 0xff, + 0x68, 0x24, 0x08, 0x0c, 0x28, 0x52, 0x11, 0x30, 0x21, 0x10, 0x20, 0x09, + 0x00, 0x00, 0x08, 0x0c, 0x2d, 0x16, 0x00, 0x18, 0xa0, 0x85, 0x00, 0x01, + 0x00, 0x08, 0xa0, 0x06, 0x00, 0xde, 0x00, 0x05, 0x20, 0x69, 0xbc, 0x8d, + 0x68, 0x00, 0xa0, 0x82, 0x00, 0x10, 0x12, 0x28, 0x60, 0x13, 0x00, 0x00, + 0xa0, 0x85, 0x00, 0x01, 0x00, 0x08, 0xa0, 0x06, 0x00, 0x05, 0x60, 0x13, + 0x00, 0x00, 0x20, 0x69, 0xbc, 0x8c, 0x68, 0x08, 0xa0, 0x84, 0xff, 0x00, + 0xa0, 0x86, 0x08, 0x00, 0x11, 0x40, 0x68, 0x00, 0xa0, 0x84, 0x00, 0xff, + 0xa0, 0x8e, 0x00, 0x14, 0x01, 0x10, 0xa0, 0x8e, 0x00, 0x10, 0x00, 0x05, + 0x60, 0x04, 0xa0, 0xb2, 0x00, 0x80, 0x1a, 0x0c, 0x15, 0x1a, 0xa1, 0xb6, + 0x00, 0x13, 0x11, 0x30, 0x20, 0x08, 0xa1, 0xb2, 0x00, 0x40, 0x1a, 0x04, + 0xa8, 0x02, 0x00, 0x92, 0xa1, 0xb6, 0x00, 0x27, 0x01, 0x20, 0xa1, 0xb6, + 0x00, 0x14, 0x19, 0x0c, 0x15, 0x1a, 0x20, 0x01, 0x00, 0x07, 0x08, 0x0c, + 0x4f, 0x9c, 0x08, 0x0c, 0x71, 0x02, 0x08, 0x0c, 0x9e, 0xd9, 0x08, 0x0c, + 0x71, 0xe5, 0x00, 0x05, 0xa7, 0x62, 0xa7, 0x64, 0xa7, 0x62, 0xa7, 0x62, + 0xa7, 0x62, 0xa7, 0x64, 0xa7, 0x76, 0xa7, 0xfb, 0xa7, 0xc6, 0xa7, 0xfb, + 0xa7, 0xd7, 0xa7, 0xfb, 0xa7, 0x76, 0xa7, 0xfb, 0xa7, 0xf3, 0xa7, 0xfb, + 0xa7, 0xf3, 0xa7, 0xfb, 0xa7, 0xfb, 0xa7, 0x62, 0xa7, 0x62, 0xa7, 0x62, + 0xa7, 0x62, 0xa7, 0x62, 0xa7, 0x62, 0xa7, 0x62, 0xa7, 0x62, 0xa7, 0x62, + 0xa7, 0x62, 0xa7, 0x62, 0xa7, 0x64, 0xa7, 0x62, 0xa7, 0xfb, 0xa7, 0x62, + 0xa7, 0x62, 0xa7, 0xfb, 0xa7, 0x62, 0xa7, 0xf8, 0xa7, 0xfb, 0xa7, 0x62, + 0xa7, 0x62, 0xa7, 0x62, 0xa7, 0x62, 0xa7, 0xfb, 0xa7, 0xfb, 0xa7, 0x62, + 0xa7, 0xfb, 0xa7, 0xfb, 0xa7, 0x62, 0xa7, 0x70, 0xa7, 0x62, 0xa7, 0x62, + 0xa7, 0x62, 0xa7, 0x62, 0xa7, 0xf7, 0xa7, 0xfb, 0xa7, 0x62, 0xa7, 0x62, + 0xa7, 0xfb, 0xa7, 0xfb, 0xa7, 0x62, 0xa7, 0x62, 0xa7, 0x62, 0xa7, 0x62, + 0x08, 0x0c, 0x15, 0x1a, 0x08, 0x0c, 0x71, 0x02, 0x20, 0x01, 0xb8, 0xb6, + 0x20, 0x04, 0x60, 0x16, 0x60, 0x03, 0x00, 0x02, 0x08, 0x0c, 0x71, 0xe5, + 0x08, 0x04, 0xa8, 0x01, 0x20, 0x01, 0x00, 0x00, 0x08, 0x0c, 0x4f, 0x5d, + 0x08, 0x04, 0xa7, 0xfb, 0x00, 0xf6, 0x20, 0x79, 0xb6, 0x52, 0x78, 0x04, + 0x00, 0xfe, 0xd0, 0xac, 0x19, 0x04, 0xa7, 0xfb, 0x20, 0x01, 0x00, 0x00, + 0x08, 0x0c, 0x4f, 0x5d, 0x60, 0x18, 0xa0, 0x80, 0x00, 0x04, 0x20, 0x04, + 0xa0, 0x86, 0x00, 0xff, 0x11, 0x40, 0x00, 0xf6, 0x20, 0x79, 0xb6, 0x00, + 0x78, 0x98, 0x80, 0x00, 0x78, 0x9a, 0x00, 0xfe, 0x00, 0xe0, 0x00, 0xc6, + 0x60, 0x18, 0x20, 0x60, 0x60, 0x00, 0xd0, 0xf4, 0x11, 0x40, 0x60, 0x10, + 0xa0, 0x05, 0x01, 0x28, 0x00, 0xce, 0x08, 0x0c, 0x3f, 0x85, 0x08, 0x04, + 0xa7, 0xfb, 0x00, 0xce, 0x20, 0x01, 0xb6, 0x00, 0x20, 0x04, 0xa0, 0x86, + 0x00, 0x02, 0x11, 0x38, 0x00, 0xf6, 0x20, 0x79, 0xb6, 0x00, 0x78, 0x98, + 0x80, 0x00, 0x78, 0x9a, 0x00, 0xfe, 0x20, 0x01, 0x00, 0x02, 0x08, 0x0c, + 0x4f, 0x6f, 0x08, 0x0c, 0x71, 0x02, 0x60, 0x1f, 0x00, 0x01, 0x60, 0x03, + 0x00, 0x01, 0x60, 0x07, 0x00, 0x02, 0x08, 0x0c, 0x6d, 0x45, 0x08, 0x0c, + 0x71, 0xe5, 0x00, 0xc6, 0x61, 0x18, 0x21, 0x60, 0x20, 0x09, 0x00, 0x01, + 0x08, 0x0c, 0x6a, 0x1a, 0x00, 0xce, 0x04, 0xd8, 0x66, 0x18, 0x00, 0xd6, + 0x26, 0x68, 0x6e, 0x04, 0x00, 0xde, 0xa6, 0xb4, 0xff, 0x00, 0x86, 0x37, + 0xa6, 0x86, 0x00, 0x06, 0x05, 0x50, 0xa6, 0x86, 0x00, 0x04, 0x05, 0x38, + 0x20, 0x01, 0x00, 0x04, 0x04, 0x10, 0x20, 0x01, 0xb6, 0x00, 0x20, 0x04, + 0xa0, 0x86, 0x00, 0x03, 0x11, 0x10, 0x08, 0x0c, 0x3f, 0x85, 0x20, 0x01, + 0x00, 0x06, 0x04, 0xa1, 0x66, 0x18, 0x00, 0xd6, 0x26, 0x68, 0x6e, 0x04, + 0x00, 0xde, 0xa6, 0xb4, 0xff, 0x00, 0x86, 0x37, 0xa6, 0x86, 0x00, 0x06, + 0x01, 0x70, 0x20, 0x01, 0x00, 0x06, 0x00, 0x48, 0x20, 0x01, 0x00, 0x04, + 0x00, 0x30, 0x20, 0x01, 0x00, 0x06, 0x04, 0x01, 0x00, 0x20, 0x00, 0x18, + 0x00, 0x10, 0x08, 0x0c, 0x4f, 0x9c, 0x08, 0x0c, 0x71, 0x02, 0x08, 0x0c, + 0x86, 0xa4, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x05, 0x26, 0x00, 0x00, 0x02, + 0xa8, 0x0d, 0xa8, 0x0d, 0xa8, 0x0d, 0xa8, 0x0d, 0xa8, 0x0d, 0xa8, 0x0f, + 0xa8, 0x0d, 0xa8, 0x0d, 0xa8, 0x0d, 0x08, 0x0c, 0x15, 0x1a, 0x08, 0x0c, + 0x71, 0x02, 0x08, 0x0c, 0x86, 0xa4, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x05, + 0x00, 0x16, 0x00, 0xd6, 0x61, 0x18, 0x21, 0x68, 0x69, 0x00, 0xd1, 0x84, + 0x01, 0x40, 0x08, 0x0c, 0x4f, 0x6f, 0x20, 0x01, 0x00, 0x00, 0x08, 0x0c, + 0x4f, 0x5d, 0x08, 0x0c, 0x2c, 0xf7, 0x00, 0xde, 0x00, 0x1e, 0x00, 0x05, + 0x00, 0xd6, 0x66, 0x18, 0x26, 0x68, 0x68, 0x04, 0xa0, 0x84, 0xff, 0x00, + 0x80, 0x07, 0x00, 0xde, 0xa0, 0xb2, 0x00, 0x0c, 0x1a, 0x0c, 0x15, 0x1a, + 0xa1, 0xb6, 0x00, 0x15, 0x11, 0x10, 0x00, 0x3b, 0x00, 0x28, 0xa1, 0xb6, + 0x00, 0x16, 0x19, 0x0c, 0x15, 0x1a, 0x00, 0x6b, 0x00, 0x05, 0x8d, 0x6b, + 0x8d, 0x6b, 0x8d, 0x6b, 0x8d, 0x6b, 0x8d, 0x6b, 0x8d, 0x6b, 0xa8, 0x98, + 0xa8, 0x57, 0x8d, 0x6b, 0x8d, 0x6b, 0x8d, 0x6b, 0x8d, 0x6b, 0x8d, 0x6b, + 0x8d, 0x6b, 0x8d, 0x6b, 0x8d, 0x6b, 0x8d, 0x6b, 0x8d, 0x6b, 0xa8, 0x98, + 0xa8, 0x9f, 0x8d, 0x6b, 0x8d, 0x6b, 0x8d, 0x6b, 0x8d, 0x6b, 0x00, 0xf6, + 0x20, 0x79, 0xb6, 0x52, 0x78, 0x04, 0xd0, 0xac, 0x11, 0xe0, 0x60, 0x18, + 0xa0, 0x7d, 0x01, 0xc8, 0x78, 0x00, 0xd0, 0xf4, 0x11, 0x18, 0x78, 0x10, + 0xa0, 0x05, 0x11, 0x98, 0x20, 0x01, 0x00, 0x00, 0x08, 0x0c, 0x4f, 0x5d, + 0x20, 0x01, 0x00, 0x02, 0x08, 0x0c, 0x4f, 0x6f, 0x60, 0x1f, 0x00, 0x01, + 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x02, 0x08, 0x0c, 0x6d, 0x45, + 0x08, 0x0c, 0x71, 0xe5, 0x00, 0xe8, 0x20, 0x11, 0xbc, 0x83, 0x22, 0x04, + 0x82, 0x11, 0x22, 0x0c, 0x08, 0x0c, 0x28, 0x52, 0x11, 0xa8, 0x00, 0xc6, + 0x08, 0x0c, 0x50, 0x1b, 0x01, 0x20, 0x00, 0xce, 0x08, 0x0c, 0x86, 0xa4, + 0x00, 0x68, 0x60, 0x10, 0x00, 0x06, 0x60, 0x14, 0x00, 0x06, 0x08, 0x0c, + 0x4c, 0x7e, 0x00, 0x0e, 0x60, 0x16, 0x00, 0x0e, 0x60, 0x12, 0x00, 0xce, + 0x08, 0x0c, 0x86, 0xa4, 0x00, 0xfe, 0x00, 0x05, 0x66, 0x04, 0xa6, 0xb6, + 0x00, 0x1e, 0x11, 0x10, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0x05, 0x08, 0x0c, + 0x90, 0x21, 0x11, 0x38, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x01, + 0x08, 0x0c, 0x6d, 0x45, 0x00, 0x10, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0x05, + 0x60, 0x04, 0xa0, 0x8a, 0x00, 0x80, 0x1a, 0x0c, 0x15, 0x1a, 0x08, 0x0c, + 0x71, 0x02, 0x08, 0x0c, 0x9e, 0xd9, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x05, + 0xa1, 0x82, 0x00, 0x40, 0x00, 0x02, 0xa8, 0xce, 0xa8, 0xce, 0xa8, 0xce, + 0xa8, 0xce, 0xa8, 0xd0, 0xa8, 0xce, 0xa8, 0xce, 0xa8, 0xce, 0xa8, 0xce, + 0xa8, 0xce, 0xa8, 0xce, 0xa8, 0xce, 0xa8, 0xce, 0xa8, 0xce, 0xa8, 0xce, + 0xa8, 0xce, 0xa8, 0xce, 0xa8, 0xce, 0xa8, 0xce, 0x08, 0x0c, 0x15, 0x1a, + 0x00, 0xd6, 0x00, 0xe6, 0x00, 0xf6, 0x01, 0x56, 0x00, 0x46, 0x00, 0x26, + 0x62, 0x18, 0xa2, 0x80, 0x00, 0x2b, 0x20, 0x04, 0xa0, 0x05, 0x01, 0x20, + 0x20, 0x21, 0x00, 0x00, 0x08, 0x0c, 0xb3, 0xd8, 0x61, 0x06, 0x20, 0x71, + 0xbc, 0x80, 0x74, 0x44, 0xa4, 0xa4, 0xff, 0x00, 0x09, 0x04, 0xa9, 0x34, + 0xa4, 0x86, 0x20, 0x00, 0x11, 0x30, 0x20, 0x09, 0x00, 0x01, 0x20, 0x11, + 0x02, 0x00, 0x08, 0x0c, 0x6b, 0x8c, 0x08, 0x0c, 0x15, 0xfd, 0x09, 0x0c, + 0x15, 0x1a, 0x60, 0x03, 0x00, 0x07, 0x2d, 0x00, 0x68, 0x37, 0x01, 0x0d, + 0x68, 0x03, 0x00, 0x00, 0x68, 0x3b, 0x00, 0x00, 0x6c, 0x5a, 0x2c, 0x00, + 0x68, 0x5e, 0x60, 0x08, 0x68, 0xb2, 0x60, 0x18, 0x20, 0x78, 0x78, 0xa0, + 0x80, 0x07, 0x71, 0x30, 0x69, 0x4a, 0x00, 0x16, 0xa0, 0x84, 0xff, 0x00, + 0x68, 0x46, 0x68, 0x4f, 0x00, 0x00, 0x68, 0x53, 0x00, 0x00, 0x68, 0x57, + 0x00, 0x36, 0x08, 0x0c, 0x54, 0x7a, 0x00, 0x1e, 0xa4, 0x86, 0x20, 0x00, + 0x11, 0x30, 0x20, 0x19, 0x00, 0x17, 0x08, 0x0c, 0xb1, 0x21, 0x08, 0x04, + 0xa9, 0x91, 0xa4, 0x86, 0x04, 0x00, 0x11, 0x30, 0x20, 0x19, 0x00, 0x02, + 0x08, 0x0c, 0xb0, 0xd3, 0x08, 0x04, 0xa9, 0x91, 0xa4, 0x86, 0x02, 0x00, + 0x11, 0x10, 0x08, 0x0c, 0xb0, 0xb8, 0xa4, 0x86, 0x10, 0x00, 0x11, 0x10, + 0x08, 0x0c, 0xb1, 0x06, 0x08, 0x04, 0xa9, 0x91, 0x20, 0x69, 0xb9, 0x75, + 0x6a, 0x00, 0xd2, 0x84, 0x09, 0x04, 0xa9, 0xf8, 0xa2, 0x84, 0x03, 0x00, + 0x19, 0x04, 0xa9, 0xf1, 0x68, 0x04, 0xa0, 0x05, 0x09, 0x04, 0xa9, 0xd9, + 0x2d, 0x78, 0x60, 0x03, 0x00, 0x07, 0x08, 0x0c, 0x15, 0xe4, 0x09, 0x04, + 0xa9, 0x98, 0x78, 0x00, 0xd0, 0x8c, 0x11, 0x18, 0x78, 0x04, 0x80, 0x01, + 0x78, 0x06, 0x60, 0x13, 0x00, 0x00, 0x68, 0x03, 0x00, 0x00, 0x68, 0x37, + 0x01, 0x16, 0x68, 0x3b, 0x00, 0x00, 0x60, 0x08, 0x68, 0xb2, 0x2c, 0x00, + 0x68, 0x4a, 0x60, 0x18, 0x20, 0x78, 0x78, 0xa0, 0x80, 0x07, 0x71, 0x30, + 0x69, 0x86, 0x68, 0x46, 0x79, 0x28, 0x69, 0x8a, 0x79, 0x2c, 0x69, 0x8e, + 0x79, 0x30, 0x69, 0x92, 0x79, 0x34, 0x69, 0x96, 0x68, 0x53, 0x00, 0x3d, + 0x72, 0x44, 0xa2, 0x94, 0x00, 0x03, 0xa2, 0x86, 0x00, 0x02, 0x11, 0x18, + 0x68, 0x4f, 0x00, 0x40, 0x00, 0x40, 0xa2, 0x86, 0x00, 0x01, 0x11, 0x18, + 0x68, 0x4f, 0x00, 0x80, 0x00, 0x10, 0x68, 0x4f, 0x00, 0x00, 0x20, 0xa9, + 0x00, 0x0a, 0x20, 0x01, 0xbc, 0x90, 0xad, 0x90, 0x00, 0x15, 0x20, 0x0c, + 0x81, 0x0f, 0x21, 0x12, 0x80, 0x00, 0x82, 0x10, 0x1f, 0x04, 0xa9, 0x83, + 0x20, 0x0c, 0x69, 0x82, 0x80, 0x00, 0x20, 0x0c, 0x69, 0x7e, 0x08, 0x0c, + 0x54, 0x7a, 0x00, 0x2e, 0x00, 0x4e, 0x01, 0x5e, 0x00, 0xfe, 0x00, 0xee, + 0x00, 0xde, 0x00, 0x05, 0x20, 0x01, 0xb6, 0x0e, 0x20, 0x04, 0xd0, 0x84, + 0x01, 0x20, 0x08, 0x0c, 0x15, 0xfd, 0x19, 0x04, 0xa9, 0x49, 0x60, 0x13, + 0x01, 0x00, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x41, 0x08, 0x0c, + 0x6c, 0xff, 0x08, 0x0c, 0x71, 0xe5, 0x0c, 0x28, 0x20, 0x69, 0xbc, 0x92, + 0x2d, 0x04, 0xa0, 0x84, 0xff, 0x00, 0xa0, 0x86, 0x12, 0x00, 0x11, 0xa8, + 0x20, 0x69, 0xbc, 0x80, 0x68, 0x6c, 0xa0, 0x84, 0x00, 0xff, 0x00, 0x16, + 0x61, 0x10, 0xa1, 0x8c, 0x07, 0x00, 0xa1, 0x0d, 0x61, 0x12, 0x00, 0x1e, + 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x43, 0x08, 0x0c, 0x6c, 0xff, + 0x08, 0x0c, 0x71, 0xe5, 0x08, 0x40, 0x68, 0x68, 0x60, 0x2a, 0x68, 0x6c, + 0x60, 0x2e, 0x60, 0x13, 0x02, 0x00, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, + 0x00, 0x41, 0x08, 0x0c, 0x6c, 0xff, 0x08, 0x0c, 0x71, 0xe5, 0x08, 0x04, + 0xa9, 0x91, 0x20, 0x01, 0xb6, 0x0d, 0x20, 0x04, 0xd0, 0xec, 0x01, 0x20, + 0x20, 0x11, 0x80, 0x49, 0x08, 0x0c, 0x3f, 0x13, 0x60, 0x13, 0x03, 0x00, + 0x00, 0x10, 0x60, 0x13, 0x01, 0x00, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, + 0x00, 0x41, 0x08, 0x0c, 0x6c, 0xff, 0x08, 0x0c, 0x71, 0xe5, 0x08, 0x04, + 0xa9, 0x91, 0x60, 0x13, 0x05, 0x00, 0x0c, 0x98, 0x60, 0x13, 0x06, 0x00, + 0x08, 0x04, 0xa9, 0xac, 0x60, 0x13, 0x02, 0x00, 0x08, 0x04, 0xa9, 0xac, + 0xa1, 0x86, 0x00, 0x13, 0x11, 0x70, 0x60, 0x04, 0xa0, 0x8a, 0x00, 0x40, + 0x0a, 0x0c, 0x15, 0x1a, 0xa0, 0x8a, 0x00, 0x53, 0x1a, 0x0c, 0x15, 0x1a, + 0xa0, 0x82, 0x00, 0x40, 0x20, 0x08, 0x08, 0x04, 0xaa, 0x86, 0xa1, 0x86, + 0x00, 0x51, 0x01, 0x38, 0xa1, 0x86, 0x00, 0x47, 0x11, 0xd8, 0x60, 0x04, + 0xa0, 0x86, 0x00, 0x41, 0x05, 0x18, 0x20, 0x01, 0x01, 0x09, 0x20, 0x04, + 0xd0, 0x84, 0x01, 0xf0, 0x01, 0x26, 0x20, 0x91, 0x28, 0x00, 0x00, 0x06, + 0x00, 0x16, 0x00, 0x26, 0x08, 0x0c, 0x6b, 0xe6, 0x00, 0x2e, 0x00, 0x1e, + 0x00, 0x0e, 0x01, 0x2e, 0x60, 0x00, 0xa0, 0x86, 0x00, 0x02, 0x11, 0x70, + 0x08, 0x04, 0xaa, 0xc9, 0xa1, 0x86, 0x00, 0x27, 0x01, 0x20, 0xa1, 0x86, + 0x00, 0x14, 0x19, 0x0c, 0x15, 0x1a, 0x60, 0x04, 0xa0, 0x82, 0x00, 0x40, + 0x20, 0x08, 0x00, 0x1a, 0x08, 0x0c, 0x86, 0xef, 0x00, 0x05, 0xaa, 0x50, + 0xaa, 0x52, 0xaa, 0x52, 0xaa, 0x76, 0xaa, 0x50, 0xaa, 0x50, 0xaa, 0x50, + 0xaa, 0x50, 0xaa, 0x50, 0xaa, 0x50, 0xaa, 0x50, 0xaa, 0x50, 0xaa, 0x50, + 0xaa, 0x50, 0xaa, 0x50, 0xaa, 0x50, 0xaa, 0x50, 0xaa, 0x50, 0xaa, 0x50, + 0x08, 0x0c, 0x15, 0x1a, 0x08, 0x0c, 0x71, 0x02, 0x08, 0x0c, 0x71, 0xe5, + 0x00, 0x36, 0x00, 0xd6, 0x60, 0x10, 0xa0, 0x6d, 0x01, 0xc0, 0xad, 0x84, + 0xf0, 0x00, 0x01, 0xa8, 0x60, 0x03, 0x00, 0x02, 0x60, 0x18, 0x20, 0x04, + 0xd0, 0xbc, 0x11, 0x78, 0x20, 0x19, 0x00, 0x04, 0x08, 0x0c, 0xb1, 0x55, + 0x60, 0x13, 0x00, 0x00, 0x60, 0x14, 0xa0, 0x05, 0x11, 0x20, 0x20, 0x01, + 0xb8, 0xb7, 0x20, 0x04, 0x60, 0x16, 0x60, 0x03, 0x00, 0x07, 0x00, 0xde, + 0x00, 0x3e, 0x00, 0x05, 0x00, 0xd6, 0x08, 0x0c, 0x71, 0x02, 0x08, 0x0c, + 0x71, 0xe5, 0x08, 0x0c, 0x9d, 0x16, 0x01, 0x20, 0x60, 0x10, 0x20, 0x68, + 0x08, 0x0c, 0x16, 0x14, 0x08, 0x0c, 0x9e, 0xd9, 0x00, 0xde, 0x00, 0x05, + 0x00, 0x02, 0xaa, 0x9a, 0xaa, 0xb7, 0xaa, 0xa3, 0xaa, 0xc3, 0xaa, 0x9a, + 0xaa, 0x9a, 0xaa, 0x9a, 0xaa, 0x9a, 0xaa, 0x9a, 0xaa, 0x9a, 0xaa, 0x9a, + 0xaa, 0x9a, 0xaa, 0x9a, 0xaa, 0x9a, 0xaa, 0x9a, 0xaa, 0x9a, 0xaa, 0x9a, + 0xaa, 0x9a, 0xaa, 0x9a, 0x08, 0x0c, 0x15, 0x1a, 0x60, 0x10, 0xa0, 0x88, + 0x00, 0x13, 0x21, 0x04, 0xa0, 0x85, 0x04, 0x00, 0x20, 0x0a, 0x08, 0x0c, + 0x71, 0x02, 0x60, 0x10, 0xa0, 0x80, 0x00, 0x13, 0x20, 0x04, 0xd0, 0xb4, + 0x01, 0x38, 0x60, 0x03, 0x00, 0x07, 0x20, 0x09, 0x00, 0x43, 0x08, 0x0c, + 0x86, 0xd3, 0x00, 0x10, 0x60, 0x03, 0x00, 0x02, 0x08, 0x0c, 0x71, 0xe5, + 0x00, 0x05, 0x08, 0x0c, 0x71, 0x02, 0x08, 0x0c, 0xb3, 0x93, 0x11, 0x20, + 0x08, 0x0c, 0x6b, 0x61, 0x08, 0x0c, 0x86, 0xa4, 0x08, 0x0c, 0x71, 0xe5, + 0x00, 0x05, 0x08, 0x0c, 0x71, 0x02, 0x20, 0x09, 0x00, 0x41, 0x08, 0x04, + 0xac, 0x12, 0xa1, 0x82, 0x00, 0x40, 0x00, 0x02, 0xaa, 0xdf, 0xaa, 0xe1, + 0xaa, 0xdf, 0xaa, 0xdf, 0xaa, 0xdf, 0xaa, 0xdf, 0xaa, 0xdf, 0xaa, 0xe2, + 0xaa, 0xdf, 0xaa, 0xdf, 0xaa, 0xdf, 0xaa, 0xdf, 0xaa, 0xdf, 0xaa, 0xdf, + 0xaa, 0xdf, 0xaa, 0xdf, 0xaa, 0xdf, 0xaa, 0xed, 0xaa, 0xdf, 0x08, 0x0c, + 0x15, 0x1a, 0x00, 0x05, 0x60, 0x03, 0x00, 0x04, 0x61, 0x10, 0x20, 0xe1, + 0x00, 0x05, 0x3d, 0x18, 0x3e, 0x20, 0x2c, 0x10, 0x08, 0x0c, 0x18, 0x63, + 0x00, 0x05, 0x00, 0xd6, 0x08, 0x0c, 0x6b, 0x61, 0x00, 0xde, 0x08, 0x0c, + 0xb3, 0xf6, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0x05, 0xa1, 0x82, 0x00, 0x40, + 0x00, 0x02, 0xab, 0x0c, 0xab, 0x0c, 0xab, 0x0c, 0xab, 0x0c, 0xab, 0x0c, + 0xab, 0x0c, 0xab, 0x0c, 0xab, 0x0e, 0xab, 0x0c, 0xab, 0x11, 0xab, 0x4a, + 0xab, 0x0c, 0xab, 0x0c, 0xab, 0x0c, 0xab, 0x0c, 0xab, 0x4a, 0xab, 0x0c, + 0xab, 0x0c, 0xab, 0x0c, 0x08, 0x0c, 0x15, 0x1a, 0x08, 0x0c, 0x86, 0xef, + 0x00, 0x05, 0x20, 0x01, 0xb6, 0x72, 0x20, 0x04, 0xd0, 0xe4, 0x01, 0x58, + 0x20, 0x01, 0x01, 0x00, 0x20, 0x04, 0xa0, 0x82, 0x00, 0x05, 0x02, 0x28, + 0x20, 0x01, 0x01, 0x1f, 0x20, 0x04, 0x60, 0x36, 0x00, 0x10, 0x60, 0x37, + 0x00, 0x00, 0x08, 0x0c, 0x71, 0x98, 0x08, 0x0c, 0x72, 0xa2, 0x60, 0x10, + 0x00, 0xd6, 0x20, 0x68, 0x68, 0x4c, 0xd0, 0xfc, 0x01, 0x50, 0xa0, 0x8c, + 0x00, 0x03, 0xa1, 0x8e, 0x00, 0x02, 0x01, 0x68, 0x20, 0x09, 0x00, 0x41, + 0x00, 0xde, 0x08, 0x04, 0xac, 0x12, 0x60, 0x03, 0x00, 0x07, 0x60, 0x17, + 0x00, 0x00, 0x08, 0x0c, 0x6b, 0x61, 0x00, 0xde, 0x00, 0x05, 0x08, 0x0c, + 0xb3, 0x93, 0x01, 0x10, 0x00, 0xde, 0x00, 0x05, 0x08, 0x0c, 0x6b, 0x61, + 0x08, 0x0c, 0x86, 0xa4, 0x00, 0xde, 0x0c, 0xa0, 0x00, 0x36, 0x08, 0x0c, + 0x71, 0x98, 0x08, 0x0c, 0x72, 0xa2, 0x60, 0x10, 0x00, 0xd6, 0x20, 0x68, + 0x60, 0x18, 0x20, 0x04, 0xd0, 0xbc, 0x01, 0x88, 0x68, 0x4c, 0xa0, 0x84, + 0x00, 0x03, 0xa0, 0x86, 0x00, 0x02, 0x01, 0x40, 0x68, 0x7c, 0x63, 0x2c, + 0xa3, 0x1a, 0x63, 0x2e, 0x68, 0x80, 0x63, 0x28, 0xa3, 0x1b, 0x63, 0x2a, + 0x60, 0x03, 0x00, 0x02, 0x00, 0x80, 0x20, 0x19, 0x00, 0x04, 0x08, 0x0c, + 0xb1, 0x55, 0x60, 0x14, 0xa0, 0x05, 0x11, 0x28, 0x20, 0x01, 0xb8, 0xb7, + 0x20, 0x04, 0x80, 0x03, 0x60, 0x16, 0x60, 0x13, 0x00, 0x00, 0x60, 0x03, + 0x00, 0x07, 0x00, 0xde, 0x00, 0x3e, 0x00, 0x05, 0xa1, 0x86, 0x00, 0x13, + 0x11, 0x50, 0x60, 0x04, 0xa0, 0x86, 0x00, 0x42, 0x19, 0x0c, 0x15, 0x1a, + 0x08, 0x0c, 0x71, 0x02, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x05, 0xa1, 0x86, + 0x00, 0x27, 0x01, 0x18, 0xa1, 0x86, 0x00, 0x14, 0x11, 0x80, 0x60, 0x04, + 0xa0, 0x86, 0x00, 0x42, 0x19, 0x0c, 0x15, 0x1a, 0x20, 0x01, 0x00, 0x07, + 0x08, 0x0c, 0x4f, 0x9c, 0x08, 0x0c, 0x71, 0x02, 0x08, 0x0c, 0x9e, 0xd9, + 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x05, 0xa1, 0x82, 0x00, 0x40, 0x00, 0x02, + 0xab, 0xb3, 0xab, 0xb3, 0xab, 0xb3, 0xab, 0xb3, 0xab, 0xb3, 0xab, 0xb3, + 0xab, 0xb3, 0xab, 0xb5, 0xab, 0xc1, 0xab, 0xb3, 0xab, 0xb3, 0xab, 0xb3, + 0xab, 0xb3, 0xab, 0xb3, 0xab, 0xb3, 0xab, 0xb3, 0xab, 0xb3, 0xab, 0xb3, + 0xab, 0xb3, 0x08, 0x0c, 0x15, 0x1a, 0x00, 0x36, 0x00, 0x46, 0x20, 0xe1, + 0x00, 0x05, 0x3d, 0x18, 0x3e, 0x20, 0x2c, 0x10, 0x08, 0x0c, 0x18, 0x63, + 0x00, 0x4e, 0x00, 0x3e, 0x00, 0x05, 0x60, 0x10, 0x00, 0xd6, 0x20, 0x68, + 0x68, 0x10, 0x6a, 0x14, 0x00, 0x06, 0x00, 0x46, 0x00, 0x56, 0x6c, 0x7c, + 0xa4, 0x22, 0x6d, 0x80, 0x22, 0x00, 0xa5, 0x2b, 0x60, 0x2c, 0xa4, 0x20, + 0x64, 0x2e, 0x60, 0x28, 0xa5, 0x29, 0x65, 0x2a, 0x00, 0x5e, 0x00, 0x4e, + 0x00, 0x0e, 0xa2, 0x0d, 0x11, 0x78, 0x68, 0x4c, 0xd0, 0xfc, 0x01, 0x20, + 0x20, 0x09, 0x00, 0x41, 0x00, 0xde, 0x04, 0x90, 0x60, 0x03, 0x00, 0x07, + 0x60, 0x17, 0x00, 0x00, 0x08, 0x0c, 0x6b, 0x61, 0x00, 0xde, 0x00, 0x05, + 0x00, 0x06, 0x00, 0xf6, 0x2c, 0x78, 0x08, 0x0c, 0x53, 0x77, 0x00, 0xfe, + 0x00, 0x0e, 0x01, 0x20, 0x60, 0x03, 0x00, 0x02, 0x00, 0xde, 0x00, 0x05, + 0x20, 0x09, 0xb6, 0x0d, 0x21, 0x0c, 0xd1, 0x9c, 0x01, 0x18, 0x60, 0x03, + 0x00, 0x07, 0x00, 0x10, 0x60, 0x03, 0x00, 0x06, 0x00, 0x21, 0x08, 0x0c, + 0x6b, 0x63, 0x00, 0xde, 0x00, 0x05, 0xd2, 0xfc, 0x01, 0x40, 0x80, 0x02, + 0x80, 0x00, 0x82, 0x12, 0xa2, 0x91, 0x00, 0x00, 0x20, 0x09, 0x00, 0x09, + 0x00, 0x10, 0x20, 0x09, 0x00, 0x15, 0x6a, 0x6a, 0x68, 0x66, 0x00, 0x05, + 0xa1, 0x82, 0x00, 0x40, 0x02, 0x08, 0x00, 0x62, 0xa1, 0x86, 0x00, 0x13, + 0x01, 0x20, 0xa1, 0x86, 0x00, 0x14, 0x19, 0x0c, 0x15, 0x1a, 0x60, 0x20, + 0xd0, 0xdc, 0x09, 0x0c, 0x15, 0x1a, 0x00, 0x05, 0xac, 0x35, 0xac, 0x3c, + 0xac, 0x48, 0xac, 0x54, 0xac, 0x35, 0xac, 0x35, 0xac, 0x35, 0xac, 0x63, + 0xac, 0x35, 0xac, 0x37, 0xac, 0x37, 0xac, 0x35, 0xac, 0x35, 0xac, 0x35, + 0xac, 0x35, 0xac, 0x37, 0xac, 0x35, 0xac, 0x37, 0xac, 0x35, 0x08, 0x0c, + 0x15, 0x1a, 0x60, 0x20, 0xd0, 0xdc, 0x09, 0x0c, 0x15, 0x1a, 0x00, 0x05, + 0x60, 0x03, 0x00, 0x01, 0x61, 0x06, 0x08, 0x0c, 0x6c, 0xff, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x71, 0xe5, 0x01, 0x2e, 0x00, 0x05, + 0x60, 0x03, 0x00, 0x01, 0x61, 0x06, 0x08, 0x0c, 0x6c, 0xff, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x71, 0xe5, 0x01, 0x2e, 0x00, 0x05, + 0x60, 0x03, 0x00, 0x03, 0x61, 0x06, 0x2c, 0x10, 0x08, 0x0c, 0x1f, 0xc5, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x6d, 0x62, 0x08, 0x0c, + 0x72, 0xa2, 0x01, 0x2e, 0x00, 0x05, 0xa0, 0x16, 0x08, 0x0c, 0x18, 0x63, + 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0x36, 0x00, 0xd6, + 0xa1, 0x82, 0x00, 0x40, 0x00, 0x23, 0x00, 0xde, 0x00, 0x3e, 0x01, 0x2e, + 0x00, 0x05, 0xac, 0x83, 0xac, 0x85, 0xac, 0x97, 0xac, 0xb2, 0xac, 0x83, + 0xac, 0x83, 0xac, 0x83, 0xac, 0xc7, 0xac, 0x83, 0xac, 0x83, 0xac, 0x83, + 0xac, 0x83, 0xac, 0x83, 0xac, 0x83, 0xac, 0x83, 0xac, 0x83, 0x08, 0x0c, + 0x15, 0x1a, 0x60, 0x10, 0x20, 0x68, 0x68, 0x4c, 0xd0, 0xfc, 0x01, 0xf8, + 0xa0, 0x9c, 0x00, 0x03, 0xa3, 0x9e, 0x00, 0x03, 0x01, 0xd0, 0x60, 0x03, + 0x00, 0x01, 0x61, 0x06, 0x08, 0x0c, 0x6c, 0xff, 0x08, 0x0c, 0x71, 0xe5, + 0x04, 0x98, 0x60, 0x10, 0x20, 0x68, 0x68, 0x4c, 0xd0, 0xfc, 0x01, 0x68, + 0xa0, 0x9c, 0x00, 0x03, 0xa3, 0x9e, 0x00, 0x03, 0x01, 0x40, 0x60, 0x03, + 0x00, 0x01, 0x61, 0x06, 0x08, 0x0c, 0x6c, 0xff, 0x08, 0x0c, 0x71, 0xe5, + 0x04, 0x08, 0x60, 0x13, 0x00, 0x00, 0x60, 0x17, 0x00, 0x00, 0x20, 0x19, + 0x00, 0x04, 0x08, 0x0c, 0xb1, 0x55, 0x00, 0xc0, 0x60, 0x10, 0x20, 0x68, + 0x68, 0x4c, 0xd0, 0xfc, 0x0d, 0x90, 0xa0, 0x9c, 0x00, 0x03, 0xa3, 0x9e, + 0x00, 0x03, 0x0d, 0x68, 0x60, 0x03, 0x00, 0x03, 0x61, 0x06, 0x2c, 0x10, + 0x08, 0x0c, 0x1f, 0xc5, 0x08, 0x0c, 0x6d, 0x62, 0x08, 0x0c, 0x72, 0xa2, + 0x00, 0x18, 0xa0, 0x16, 0x08, 0x0c, 0x18, 0x63, 0x00, 0x05, 0x08, 0x0c, + 0x71, 0x02, 0x61, 0x10, 0x81, 0xff, 0x01, 0x58, 0x00, 0xd6, 0x21, 0x68, + 0x08, 0x0c, 0xb4, 0x3c, 0x00, 0x36, 0x20, 0x19, 0x00, 0x29, 0x08, 0x0c, + 0xb1, 0x55, 0x00, 0x3e, 0x00, 0xde, 0x08, 0x0c, 0x9e, 0xd9, 0x08, 0x0c, + 0x71, 0xe5, 0x00, 0x05, 0x08, 0x0c, 0x71, 0x98, 0x61, 0x10, 0x81, 0xff, + 0x01, 0x58, 0x00, 0xd6, 0x21, 0x68, 0x08, 0x0c, 0xb4, 0x3c, 0x00, 0x36, + 0x20, 0x19, 0x00, 0x29, 0x08, 0x0c, 0xb1, 0x55, 0x00, 0x3e, 0x00, 0xde, + 0x08, 0x0c, 0x9e, 0xd9, 0x08, 0x0c, 0x72, 0xa2, 0x00, 0x05, 0xa1, 0x82, + 0x00, 0x85, 0x00, 0x02, 0xad, 0x01, 0xac, 0xff, 0xac, 0xff, 0xad, 0x0d, + 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0x08, 0x0c, 0x15, 0x1a, 0x60, 0x03, + 0x00, 0x0b, 0x61, 0x06, 0x08, 0x0c, 0x6c, 0xff, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0x71, 0xe5, 0x01, 0x2e, 0x00, 0x05, 0x00, 0x26, + 0x00, 0xe6, 0x08, 0x0c, 0xb3, 0x8c, 0x01, 0x18, 0x08, 0x0c, 0x86, 0xa4, + 0x00, 0xd8, 0x20, 0x71, 0xbc, 0x80, 0x72, 0x24, 0x62, 0x12, 0x72, 0x20, + 0x08, 0x0c, 0xb0, 0x03, 0x01, 0x18, 0x60, 0x07, 0x00, 0x86, 0x00, 0x40, + 0x60, 0x07, 0x00, 0x87, 0x72, 0x24, 0xa2, 0x96, 0xff, 0xff, 0x11, 0x10, + 0x60, 0x07, 0x00, 0x86, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x6c, 0xff, + 0x08, 0x0c, 0x71, 0xe5, 0x08, 0x0c, 0x72, 0xa2, 0x00, 0xee, 0x00, 0x2e, + 0x00, 0x05, 0xa1, 0x86, 0x00, 0x13, 0x11, 0x60, 0x60, 0x04, 0xa0, 0x8a, + 0x00, 0x85, 0x0a, 0x0c, 0x15, 0x1a, 0xa0, 0x8a, 0x00, 0x8c, 0x1a, 0x0c, + 0x15, 0x1a, 0xa0, 0x82, 0x00, 0x85, 0x00, 0xa2, 0xa1, 0x86, 0x00, 0x27, + 0x01, 0x30, 0xa1, 0x86, 0x00, 0x14, 0x01, 0x18, 0x08, 0x0c, 0x86, 0xef, + 0x00, 0x50, 0x20, 0x01, 0x00, 0x07, 0x08, 0x0c, 0x4f, 0x9c, 0x08, 0x0c, + 0x71, 0x02, 0x08, 0x0c, 0x9e, 0xd9, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x05, + 0xad, 0x5d, 0xad, 0x5f, 0xad, 0x5f, 0xad, 0x5d, 0xad, 0x5d, 0xad, 0x5d, + 0xad, 0x5d, 0x08, 0x0c, 0x15, 0x1a, 0x08, 0x0c, 0x71, 0x02, 0x08, 0x0c, + 0x9e, 0xd9, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x05, 0xa1, 0x82, 0x00, 0x85, + 0x0a, 0x0c, 0x15, 0x1a, 0xa1, 0x82, 0x00, 0x8c, 0x1a, 0x0c, 0x15, 0x1a, + 0xa1, 0x82, 0x00, 0x85, 0x00, 0x02, 0xad, 0x78, 0xad, 0x78, 0xad, 0x78, + 0xad, 0x7a, 0xad, 0x78, 0xad, 0x78, 0xad, 0x78, 0x08, 0x0c, 0x15, 0x1a, + 0x00, 0x05, 0xa1, 0x86, 0x00, 0x13, 0x01, 0x48, 0xa1, 0x86, 0x00, 0x14, + 0x01, 0x30, 0xa1, 0x86, 0x00, 0x27, 0x01, 0x18, 0x08, 0x0c, 0x86, 0xef, + 0x00, 0x30, 0x08, 0x0c, 0x71, 0x02, 0x08, 0x0c, 0x9e, 0xd9, 0x08, 0x0c, + 0x71, 0xe5, 0x00, 0x05, 0x00, 0x36, 0x08, 0x0c, 0xb3, 0xf6, 0x60, 0x3f, + 0x00, 0x00, 0x20, 0x19, 0x00, 0x0b, 0x00, 0x31, 0x60, 0x1f, 0x00, 0x06, + 0x60, 0x03, 0x00, 0x07, 0x00, 0x3e, 0x00, 0x05, 0x01, 0x26, 0x00, 0x36, + 0x20, 0x91, 0x80, 0x00, 0x00, 0x86, 0x2c, 0x40, 0x00, 0x96, 0x20, 0x49, + 0x00, 0x00, 0x08, 0x0c, 0x81, 0xb7, 0x00, 0x9e, 0x00, 0x8e, 0x15, 0x78, + 0x00, 0x76, 0x2c, 0x38, 0x08, 0x0c, 0x82, 0x5d, 0x00, 0x7e, 0x15, 0x48, + 0x60, 0x00, 0xa0, 0x86, 0x00, 0x00, 0x05, 0x28, 0x60, 0x1c, 0xa0, 0x86, + 0x00, 0x07, 0x05, 0x08, 0x00, 0xd6, 0x60, 0x00, 0xa0, 0x86, 0x00, 0x04, + 0x11, 0x50, 0x08, 0x0c, 0xb3, 0xf6, 0x60, 0x1f, 0x00, 0x07, 0x20, 0x01, + 0xb8, 0xb6, 0x20, 0x04, 0x60, 0x16, 0x08, 0x0c, 0x19, 0x52, 0x60, 0x10, + 0x20, 0x68, 0x08, 0x0c, 0x9d, 0x16, 0x01, 0x10, 0x08, 0x0c, 0xb1, 0x55, + 0x00, 0xde, 0x60, 0x13, 0x00, 0x00, 0x08, 0x0c, 0xb3, 0xf6, 0x60, 0x1f, + 0x00, 0x07, 0x20, 0x01, 0xb8, 0xb6, 0x20, 0x04, 0x60, 0x16, 0x00, 0x3e, + 0x01, 0x2e, 0x00, 0x05, 0x00, 0xf6, 0x00, 0xc6, 0x00, 0x36, 0x01, 0x56, + 0x20, 0x79, 0xbc, 0x80, 0x79, 0x38, 0x78, 0x3c, 0x08, 0x0c, 0x28, 0x52, + 0x15, 0xb0, 0x00, 0x16, 0x00, 0xc6, 0x08, 0x0c, 0x50, 0x1b, 0x15, 0x78, + 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x26, 0x00, 0x16, 0x20, 0x19, 0x00, 0x29, + 0x08, 0x0c, 0x83, 0x20, 0x08, 0x0c, 0x6e, 0x67, 0x00, 0x76, 0x20, 0x39, + 0x00, 0x00, 0x08, 0x0c, 0x6d, 0x74, 0x00, 0x7e, 0x00, 0x1e, 0x00, 0x76, + 0x20, 0x39, 0x00, 0x00, 0x08, 0x0c, 0xaf, 0x3e, 0x00, 0x7e, 0x08, 0x0c, + 0x52, 0x1c, 0x00, 0x26, 0x62, 0x04, 0xa2, 0x94, 0xff, 0x00, 0x82, 0x17, + 0xa2, 0x86, 0x00, 0x06, 0x01, 0x18, 0xa2, 0x86, 0x00, 0x04, 0x11, 0x18, + 0x62, 0xa0, 0x08, 0x0c, 0x2d, 0x8a, 0x00, 0x2e, 0x00, 0x1e, 0x08, 0x0c, + 0x4c, 0x7e, 0x66, 0x12, 0x65, 0x16, 0xa0, 0x06, 0x00, 0x10, 0x00, 0xce, + 0x00, 0x1e, 0x01, 0x5e, 0x00, 0x3e, 0x00, 0xce, 0x00, 0xfe, 0x00, 0x05, + 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x00, 0x16, 0x20, 0x09, 0xb6, 0x21, + 0x21, 0x04, 0xa0, 0x86, 0x00, 0x74, 0x19, 0x04, 0xae, 0x77, 0x20, 0x69, + 0xbc, 0x8e, 0x69, 0x0c, 0xa1, 0x82, 0x01, 0x00, 0x06, 0xc0, 0x69, 0x08, + 0xa1, 0x84, 0x80, 0x00, 0x05, 0xe8, 0x20, 0x01, 0xb8, 0x9e, 0x20, 0x04, + 0xa0, 0x05, 0x11, 0x60, 0x60, 0x18, 0x20, 0x70, 0x70, 0x10, 0xa0, 0x84, + 0x00, 0xff, 0x01, 0x18, 0x70, 0x00, 0xd0, 0xf4, 0x01, 0x18, 0xa1, 0x84, + 0x08, 0x00, 0x05, 0x60, 0x69, 0x10, 0xa1, 0x8a, 0x00, 0x01, 0x06, 0x10, + 0x69, 0x14, 0x20, 0x69, 0xbc, 0xae, 0x69, 0x04, 0x81, 0xff, 0x11, 0x98, + 0x69, 0x0c, 0xa1, 0x82, 0x01, 0x00, 0x02, 0xa8, 0x69, 0x08, 0x81, 0xff, + 0x11, 0x78, 0x69, 0x10, 0xa1, 0x8a, 0x00, 0x01, 0x02, 0x88, 0x69, 0x18, + 0xa1, 0x8a, 0x00, 0x01, 0x02, 0x98, 0x00, 0xd0, 0x60, 0x13, 0x01, 0x00, + 0x00, 0xa0, 0x60, 0x13, 0x03, 0x00, 0x00, 0x88, 0x60, 0x13, 0x05, 0x00, + 0x00, 0x70, 0x60, 0x13, 0x07, 0x00, 0x00, 0x58, 0x60, 0x13, 0x09, 0x00, + 0x00, 0x40, 0x60, 0x13, 0x0b, 0x00, 0x00, 0x28, 0x60, 0x13, 0x0f, 0x00, + 0x00, 0x10, 0x60, 0x13, 0x2d, 0x00, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x08, + 0xa0, 0x06, 0x00, 0x1e, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x00, 0x05, + 0x00, 0xc6, 0x00, 0xd6, 0x00, 0x26, 0x00, 0x36, 0x01, 0x56, 0x62, 0x18, + 0x22, 0x68, 0x6b, 0x04, 0xa3, 0x94, 0x00, 0xff, 0xa2, 0x86, 0x00, 0x06, + 0x01, 0x90, 0xa2, 0x86, 0x00, 0x04, 0x01, 0x78, 0xa3, 0x94, 0xff, 0x00, + 0x82, 0x17, 0xa2, 0x86, 0x00, 0x06, 0x01, 0x48, 0xa2, 0x86, 0x00, 0x04, + 0x01, 0x30, 0x00, 0xc6, 0x2d, 0x60, 0x08, 0x0c, 0x50, 0x2a, 0x00, 0xce, + 0x04, 0xc0, 0x20, 0x11, 0xbc, 0x96, 0xad, 0x98, 0x00, 0x0a, 0x20, 0xa9, + 0x00, 0x04, 0x08, 0x0c, 0x91, 0x66, 0x15, 0x80, 0x20, 0x11, 0xbc, 0x9a, + 0xad, 0x98, 0x00, 0x06, 0x20, 0xa9, 0x00, 0x04, 0x08, 0x0c, 0x91, 0x66, + 0x15, 0x38, 0x00, 0x46, 0x00, 0x16, 0x6a, 0xa0, 0xa2, 0x94, 0x00, 0xff, + 0x82, 0x27, 0xa0, 0x06, 0x20, 0x09, 0xb6, 0x53, 0x21, 0x0c, 0xd1, 0xa4, + 0x01, 0x38, 0x20, 0x09, 0x00, 0x29, 0x08, 0x0c, 0xb1, 0xa4, 0x68, 0x00, + 0xc0, 0xe5, 0x68, 0x02, 0x20, 0x19, 0x00, 0x29, 0x08, 0x0c, 0x6e, 0x67, + 0x00, 0x76, 0x20, 0x39, 0x00, 0x00, 0x08, 0x0c, 0x6d, 0x74, 0x2c, 0x08, + 0x08, 0x0c, 0xaf, 0x3e, 0x00, 0x7e, 0x20, 0x01, 0x00, 0x07, 0x08, 0x0c, + 0x4f, 0x9c, 0x00, 0x1e, 0x00, 0x4e, 0xa0, 0x06, 0x01, 0x5e, 0x00, 0x3e, + 0x00, 0x2e, 0x00, 0xde, 0x00, 0xce, 0x00, 0x05, 0x00, 0xd6, 0x20, 0x69, + 0xbc, 0x8e, 0x68, 0x00, 0xa0, 0x86, 0x08, 0x00, 0x01, 0x18, 0x60, 0x13, + 0x00, 0x00, 0x00, 0x08, 0xa0, 0x06, 0x00, 0xde, 0x00, 0x05, 0x00, 0xc6, + 0x00, 0xf6, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x01, 0x56, 0x20, 0x79, + 0xbc, 0x8c, 0x79, 0x30, 0x78, 0x34, 0x08, 0x0c, 0x28, 0x52, 0x11, 0xa0, + 0x08, 0x0c, 0x50, 0x1b, 0x11, 0x88, 0x20, 0x11, 0xbc, 0x90, 0xac, 0x98, + 0x00, 0x0a, 0x20, 0xa9, 0x00, 0x04, 0x08, 0x0c, 0x91, 0x66, 0x11, 0x40, + 0x20, 0x11, 0xbc, 0x94, 0xac, 0x98, 0x00, 0x06, 0x20, 0xa9, 0x00, 0x04, + 0x08, 0x0c, 0x91, 0x66, 0x01, 0x5e, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, + 0x00, 0xfe, 0x00, 0xce, 0x00, 0x05, 0x00, 0xc6, 0x00, 0x06, 0x00, 0x16, + 0x00, 0x26, 0x00, 0x36, 0x01, 0x56, 0x20, 0x11, 0xbc, 0x83, 0x22, 0x04, + 0x82, 0x11, 0x22, 0x0c, 0x08, 0x0c, 0x28, 0x52, 0x11, 0xa0, 0x08, 0x0c, + 0x50, 0x1b, 0x11, 0x88, 0x20, 0x11, 0xbc, 0x96, 0xac, 0x98, 0x00, 0x0a, + 0x20, 0xa9, 0x00, 0x04, 0x08, 0x0c, 0x91, 0x66, 0x11, 0x40, 0x20, 0x11, + 0xbc, 0x9a, 0xac, 0x98, 0x00, 0x06, 0x20, 0xa9, 0x00, 0x04, 0x08, 0x0c, + 0x91, 0x66, 0x01, 0x5e, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x0e, + 0x00, 0xce, 0x00, 0x05, 0x00, 0xe6, 0x00, 0xc6, 0x00, 0x86, 0x00, 0x76, + 0x00, 0x66, 0x00, 0x56, 0x00, 0x46, 0x00, 0x26, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x27, 0x40, 0x20, 0x29, 0xb8, 0xea, 0x25, 0x2c, 0x20, 0x21, + 0xb8, 0xf0, 0x24, 0x24, 0x20, 0x61, 0xbe, 0x00, 0x20, 0x71, 0xb6, 0x00, + 0x76, 0x48, 0x70, 0x68, 0x81, 0xff, 0x01, 0x50, 0x00, 0x06, 0xa1, 0x86, + 0xb9, 0xf5, 0x00, 0x0e, 0x01, 0x28, 0x80, 0x01, 0xa6, 0x02, 0x1a, 0x04, + 0xaf, 0xbf, 0x00, 0x18, 0xa6, 0x06, 0x09, 0x04, 0xaf, 0xbf, 0x21, 0x00, + 0xac, 0x06, 0x09, 0x04, 0xaf, 0xb6, 0x08, 0x0c, 0xb1, 0xcc, 0x09, 0x04, + 0xaf, 0xb6, 0x67, 0x1c, 0xa7, 0x86, 0x00, 0x01, 0x09, 0x04, 0xaf, 0xda, + 0xa7, 0x86, 0x00, 0x04, 0x09, 0x04, 0xaf, 0xda, 0xa7, 0x86, 0x00, 0x07, + 0x05, 0xe8, 0x25, 0x00, 0xac, 0x06, 0x05, 0xd0, 0x24, 0x00, 0xac, 0x06, + 0x05, 0xb8, 0x08, 0x0c, 0xb1, 0xdc, 0x15, 0xa0, 0x88, 0xff, 0x01, 0x18, + 0x60, 0x50, 0xa9, 0x06, 0x15, 0x78, 0x00, 0xd6, 0x60, 0x00, 0xa0, 0x86, + 0x00, 0x04, 0x11, 0x20, 0x00, 0x16, 0x08, 0x0c, 0x19, 0x52, 0x00, 0x1e, + 0xa7, 0x86, 0x00, 0x08, 0x11, 0x48, 0x08, 0x0c, 0x9f, 0x14, 0x11, 0x30, + 0x08, 0x0c, 0x8c, 0xa5, 0x00, 0xde, 0x08, 0x0c, 0x9e, 0xd9, 0x00, 0xd0, + 0x60, 0x10, 0x20, 0x68, 0x08, 0x0c, 0x9d, 0x16, 0x01, 0x90, 0xa7, 0x86, + 0x00, 0x03, 0x15, 0x28, 0x68, 0x37, 0x01, 0x03, 0x6b, 0x4a, 0x68, 0x47, + 0x00, 0x00, 0x08, 0x0c, 0xb4, 0x3c, 0x00, 0x16, 0x08, 0x0c, 0x9f, 0x88, + 0x08, 0x0c, 0x54, 0x7a, 0x00, 0x1e, 0x08, 0x0c, 0x9e, 0xcd, 0x00, 0xde, + 0x08, 0x0c, 0x9e, 0xd9, 0xac, 0xe0, 0x00, 0x18, 0x20, 0x01, 0xb6, 0x17, + 0x20, 0x04, 0xac, 0x02, 0x12, 0x10, 0x08, 0x04, 0xaf, 0x52, 0x01, 0x2e, + 0x00, 0x2e, 0x00, 0x4e, 0x00, 0x5e, 0x00, 0x6e, 0x00, 0x7e, 0x00, 0x8e, + 0x00, 0xce, 0x00, 0xee, 0x00, 0x05, 0xa7, 0x86, 0x00, 0x06, 0x11, 0x50, + 0xa3, 0x86, 0x00, 0x05, 0x01, 0x28, 0x08, 0x0c, 0xb4, 0x3c, 0x08, 0x0c, + 0xb1, 0x55, 0x08, 0xf8, 0x00, 0xde, 0x0c, 0x00, 0xa7, 0x86, 0x00, 0x0a, + 0x09, 0x68, 0x08, 0x50, 0x08, 0x0c, 0xb1, 0xdc, 0x19, 0xc8, 0x81, 0xff, + 0x09, 0xb8, 0xa1, 0x80, 0x00, 0x01, 0x20, 0x04, 0xa0, 0x86, 0x00, 0x18, + 0x01, 0x30, 0xa1, 0x80, 0x00, 0x01, 0x20, 0x04, 0xa0, 0x86, 0x00, 0x2d, + 0x19, 0x58, 0x60, 0x00, 0xa0, 0x86, 0x00, 0x02, 0x19, 0x38, 0x08, 0x0c, + 0x9f, 0x03, 0x01, 0x30, 0x08, 0x0c, 0x9f, 0x14, 0x19, 0x08, 0x08, 0x0c, + 0x8c, 0xa5, 0x00, 0x38, 0x08, 0x0c, 0x2c, 0xf7, 0x08, 0x0c, 0x9f, 0x14, + 0x11, 0x10, 0x08, 0x0c, 0x8c, 0xa5, 0x08, 0x0c, 0x9e, 0xd9, 0x08, 0x04, + 0xaf, 0xb6, 0x00, 0xc6, 0x00, 0xe6, 0x00, 0x16, 0x2c, 0x08, 0x21, 0x70, + 0xa0, 0x06, 0x08, 0x0c, 0xb1, 0x76, 0x00, 0x1e, 0x01, 0x20, 0x60, 0x1c, + 0xa0, 0x84, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0xee, 0x00, 0xce, 0x00, 0x05, + 0xb0, 0x1c, 0xb0, 0x1c, 0xb0, 0x1c, 0xb0, 0x1c, 0xb0, 0x1c, 0xb0, 0x1c, + 0xb0, 0x1e, 0xb0, 0x1c, 0xa0, 0x06, 0x00, 0x05, 0x00, 0x46, 0x00, 0x16, + 0x70, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x24, 0xa4, 0xa4, 0x00, 0xff, + 0x84, 0x27, 0x2c, 0x00, 0x20, 0x09, 0x00, 0x20, 0x08, 0x0c, 0xb1, 0xa4, + 0x00, 0x1e, 0x00, 0x4e, 0x00, 0x36, 0x20, 0x19, 0x00, 0x02, 0x08, 0x0c, + 0xad, 0x9c, 0x00, 0x3e, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x05, 0x20, 0x01, + 0x00, 0x01, 0x08, 0x0c, 0x4f, 0x5d, 0x01, 0x56, 0x00, 0x16, 0x00, 0x26, + 0x00, 0x36, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x19, 0xb6, 0x05, 0x20, 0x11, + 0xbc, 0x96, 0x08, 0x0c, 0x91, 0x66, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, + 0x01, 0x5e, 0xa0, 0x05, 0x00, 0x05, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xc6, + 0x00, 0x86, 0x00, 0x76, 0x00, 0x66, 0x00, 0x26, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x27, 0x40, 0x20, 0x61, 0xbe, 0x00, 0x20, 0x79, 0x00, 0x01, + 0x8f, 0xff, 0x09, 0x04, 0xb0, 0xab, 0x20, 0x71, 0xb6, 0x00, 0x76, 0x48, + 0x70, 0x68, 0x80, 0x01, 0xa6, 0x02, 0x1a, 0x04, 0xb0, 0xab, 0x88, 0xff, + 0x01, 0x28, 0x28, 0x00, 0xac, 0x06, 0x15, 0xb0, 0x20, 0x79, 0x00, 0x00, + 0x08, 0x0c, 0xb1, 0xcc, 0x05, 0x88, 0x24, 0x00, 0xac, 0x06, 0x05, 0x70, + 0x67, 0x1c, 0xa7, 0x86, 0x00, 0x06, 0x15, 0x50, 0xa7, 0x86, 0x00, 0x07, + 0x05, 0x38, 0x88, 0xff, 0x11, 0x40, 0x60, 0x18, 0xa2, 0x06, 0x15, 0x10, + 0x85, 0xff, 0x01, 0x18, 0x60, 0x50, 0xa1, 0x06, 0x11, 0xe8, 0x00, 0xd6, + 0x60, 0x00, 0xa0, 0x86, 0x00, 0x04, 0x11, 0x50, 0x08, 0x0c, 0xb3, 0xf6, + 0x60, 0x1f, 0x00, 0x07, 0x20, 0x01, 0xb8, 0xb6, 0x20, 0x04, 0x60, 0x16, + 0x08, 0x0c, 0x19, 0x52, 0x60, 0x10, 0x20, 0x68, 0x08, 0x0c, 0x9d, 0x16, + 0x01, 0x20, 0x00, 0x46, 0x08, 0x0c, 0xb1, 0x55, 0x00, 0x4e, 0x00, 0xde, + 0x08, 0x0c, 0x9e, 0xd9, 0x88, 0xff, 0x11, 0x98, 0xac, 0xe0, 0x00, 0x18, + 0x20, 0x01, 0xb6, 0x17, 0x20, 0x04, 0xac, 0x02, 0x12, 0x10, 0x08, 0x04, + 0xb0, 0x5c, 0xa0, 0x06, 0x01, 0x2e, 0x00, 0x2e, 0x00, 0x6e, 0x00, 0x7e, + 0x00, 0x8e, 0x00, 0xce, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, 0xa8, 0xc5, + 0x00, 0x01, 0x0c, 0xa0, 0x00, 0x76, 0x00, 0x56, 0x00, 0x86, 0x20, 0x41, + 0x00, 0x00, 0x20, 0x29, 0x00, 0x01, 0x2c, 0x20, 0x20, 0x19, 0x00, 0x02, + 0x62, 0x18, 0x00, 0x96, 0x20, 0x49, 0x00, 0x00, 0x08, 0x0c, 0x81, 0xb7, + 0x00, 0x9e, 0x00, 0x8e, 0x20, 0x39, 0x00, 0x00, 0x08, 0x0c, 0x82, 0x5d, + 0x08, 0x0c, 0xb0, 0x4d, 0x00, 0x5e, 0x00, 0x7e, 0x00, 0x05, 0x00, 0x26, + 0x00, 0x46, 0x00, 0x56, 0x00, 0x76, 0x00, 0xc6, 0x01, 0x56, 0x2c, 0x20, + 0x21, 0x28, 0x20, 0xa9, 0x00, 0x7f, 0x20, 0x09, 0x00, 0x00, 0x00, 0x16, + 0x00, 0x36, 0x08, 0x0c, 0x50, 0x1b, 0x11, 0xb0, 0x2c, 0x10, 0x00, 0x56, + 0x00, 0x86, 0x20, 0x41, 0x00, 0x00, 0x25, 0x08, 0x20, 0x29, 0x00, 0x01, + 0x00, 0x96, 0x20, 0x49, 0x00, 0x00, 0x08, 0x0c, 0x81, 0xb7, 0x00, 0x9e, + 0x00, 0x8e, 0x20, 0x39, 0x00, 0x00, 0x08, 0x0c, 0x82, 0x5d, 0x08, 0x0c, + 0xb0, 0x4d, 0x00, 0x5e, 0x00, 0x3e, 0x00, 0x1e, 0x81, 0x08, 0x1f, 0x04, + 0xb0, 0xdf, 0x01, 0x5e, 0x00, 0xce, 0x00, 0x7e, 0x00, 0x5e, 0x00, 0x4e, + 0x00, 0x2e, 0x00, 0x05, 0x00, 0x76, 0x00, 0x56, 0x62, 0x18, 0x00, 0x86, + 0x20, 0x41, 0x00, 0x00, 0x20, 0x29, 0x00, 0x01, 0x20, 0x19, 0x00, 0x48, + 0x00, 0x96, 0x20, 0x49, 0x00, 0x00, 0x08, 0x0c, 0x81, 0xb7, 0x00, 0x9e, + 0x00, 0x8e, 0x20, 0x39, 0x00, 0x00, 0x08, 0x0c, 0x82, 0x5d, 0x2c, 0x20, + 0x08, 0x0c, 0xb0, 0x4d, 0x00, 0x5e, 0x00, 0x7e, 0x00, 0x05, 0x00, 0x26, + 0x00, 0x46, 0x00, 0x56, 0x00, 0x76, 0x00, 0xc6, 0x01, 0x56, 0x2c, 0x20, + 0x20, 0xa9, 0x00, 0x7f, 0x20, 0x09, 0x00, 0x00, 0x00, 0x16, 0x00, 0x36, + 0x08, 0x0c, 0x50, 0x1b, 0x11, 0xc0, 0x2c, 0x10, 0x00, 0x86, 0x20, 0x41, + 0x00, 0x00, 0x28, 0x28, 0x00, 0x46, 0x20, 0x21, 0x00, 0x01, 0x08, 0x0c, + 0xb3, 0xd8, 0x00, 0x4e, 0x00, 0x96, 0x20, 0x49, 0x00, 0x00, 0x08, 0x0c, + 0x81, 0xb7, 0x00, 0x9e, 0x00, 0x8e, 0x20, 0x39, 0x00, 0x00, 0x08, 0x0c, + 0x82, 0x5d, 0x08, 0x0c, 0xb0, 0x4d, 0x00, 0x3e, 0x00, 0x1e, 0x81, 0x08, + 0x1f, 0x04, 0xb1, 0x2c, 0x01, 0x5e, 0x00, 0xce, 0x00, 0x7e, 0x00, 0x5e, + 0x00, 0x4e, 0x00, 0x2e, 0x00, 0x05, 0x00, 0x16, 0x00, 0xf6, 0x38, 0x00, + 0xd0, 0x8c, 0x01, 0x30, 0xad, 0x82, 0x10, 0x00, 0x02, 0xb0, 0xad, 0x82, + 0xb6, 0x00, 0x02, 0x30, 0xad, 0x82, 0xee, 0x00, 0x02, 0x80, 0xad, 0x82, + 0xff, 0xff, 0x12, 0x68, 0x68, 0x00, 0xa0, 0x7d, 0x01, 0x38, 0x68, 0x03, + 0x00, 0x00, 0x6b, 0x52, 0x08, 0x0c, 0x54, 0x7a, 0x2f, 0x68, 0x0c, 0xb0, + 0x6b, 0x52, 0x08, 0x0c, 0x54, 0x7a, 0x00, 0xfe, 0x00, 0x1e, 0x00, 0x05, + 0x00, 0xe6, 0x00, 0x46, 0x00, 0x36, 0x20, 0x61, 0xbe, 0x00, 0xa0, 0x05, + 0x11, 0x38, 0x20, 0x71, 0xb6, 0x00, 0x74, 0x48, 0x70, 0x68, 0x80, 0x01, + 0xa4, 0x02, 0x12, 0xd8, 0x21, 0x00, 0xac, 0x06, 0x01, 0x68, 0x60, 0x00, + 0xa0, 0x86, 0x00, 0x00, 0x01, 0x48, 0x60, 0x08, 0xa2, 0x06, 0x11, 0x30, + 0x60, 0x18, 0xa1, 0xa0, 0x00, 0x06, 0x24, 0x24, 0xa4, 0x06, 0x01, 0x40, + 0xac, 0xe0, 0x00, 0x18, 0x20, 0x01, 0xb6, 0x17, 0x20, 0x04, 0xac, 0x02, + 0x12, 0x20, 0x0c, 0x40, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x08, 0xa0, 0x06, + 0x00, 0x3e, 0x00, 0x4e, 0x00, 0xee, 0x00, 0x05, 0x00, 0xd6, 0x00, 0x06, + 0x08, 0x0c, 0x15, 0xfd, 0x00, 0x0e, 0x09, 0x0c, 0x15, 0x1a, 0x68, 0x37, + 0x01, 0x0d, 0x68, 0x5e, 0x00, 0x26, 0x20, 0x10, 0x08, 0x0c, 0x9d, 0x06, + 0x20, 0x01, 0x00, 0x00, 0x01, 0x20, 0x22, 0x00, 0xa0, 0x80, 0x00, 0x14, + 0x20, 0x04, 0x00, 0x2e, 0x68, 0x4a, 0x69, 0x56, 0x6c, 0x46, 0x68, 0x4f, + 0x00, 0x00, 0x20, 0x01, 0xb8, 0xbe, 0x20, 0x04, 0x68, 0x52, 0xa0, 0x06, + 0x68, 0xb2, 0x68, 0x02, 0x68, 0x3a, 0x68, 0x5a, 0x08, 0x0c, 0x54, 0x7a, + 0x00, 0xde, 0x00, 0x05, 0x67, 0x00, 0xa7, 0x86, 0x00, 0x00, 0x01, 0x58, + 0xa7, 0x86, 0x00, 0x01, 0x01, 0x40, 0xa7, 0x86, 0x00, 0x0a, 0x01, 0x28, + 0xa7, 0x86, 0x00, 0x09, 0x01, 0x10, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x05, + 0x00, 0xe6, 0x60, 0x18, 0x20, 0x70, 0x70, 0xa0, 0xa2, 0x06, 0x00, 0xee, + 0x00, 0x05, 0x00, 0x16, 0x60, 0x04, 0xa0, 0x8e, 0x00, 0x1e, 0x11, 0xa0, + 0x80, 0x07, 0x61, 0x30, 0xa1, 0x8c, 0x00, 0xff, 0xa1, 0x05, 0x60, 0x32, + 0x60, 0x07, 0x00, 0x85, 0x60, 0x03, 0x00, 0x0b, 0x60, 0x1f, 0x00, 0x05, + 0x20, 0x01, 0xb8, 0xb7, 0x20, 0x04, 0x60, 0x16, 0x08, 0x0c, 0x6c, 0xff, + 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x1e, 0x00, 0x05, 0xe0, 0x00, 0xe0, 0x00, + 0x00, 0x05, 0x60, 0x20, 0xd0, 0xe4, 0x01, 0x58, 0xd0, 0xcc, 0x01, 0x18, + 0x08, 0x0c, 0x9f, 0xf1, 0x00, 0x30, 0x08, 0x0c, 0xb3, 0xf6, 0x08, 0x0c, + 0x6b, 0x61, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0x05, 0xa2, 0x80, 0x00, 0x07, + 0x20, 0x04, 0xa0, 0x84, 0x00, 0x0f, 0x00, 0x02, 0xb2, 0x1f, 0xb2, 0x1f, + 0xb2, 0x1f, 0xb2, 0x24, 0xb2, 0x1f, 0xb2, 0x21, 0xb2, 0x21, 0xb2, 0x1f, + 0xb2, 0x21, 0xa0, 0x06, 0x00, 0x05, 0x00, 0xc6, 0x22, 0x60, 0x00, 0xce, + 0xa0, 0x85, 0x00, 0x01, 0x00, 0x05, 0xa2, 0x80, 0x00, 0x07, 0x20, 0x04, + 0xa0, 0x84, 0x00, 0x0f, 0x00, 0x02, 0xb2, 0x36, 0xb2, 0x36, 0xb2, 0x36, + 0xb2, 0x36, 0xb2, 0x36, 0xb2, 0x36, 0xb2, 0x41, 0xb2, 0x36, 0xb2, 0x36, + 0x60, 0x07, 0x00, 0x3b, 0x60, 0x2b, 0x00, 0x09, 0x60, 0x13, 0x2a, 0x00, + 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x6c, 0xff, 0x00, 0x05, 0x00, 0xc6, + 0x22, 0x60, 0x08, 0x0c, 0xb3, 0xf6, 0x60, 0x3f, 0x00, 0x00, 0x60, 0x20, + 0xc0, 0xf4, 0xc0, 0xcc, 0x60, 0x22, 0x60, 0x37, 0x00, 0x00, 0x00, 0xce, + 0x00, 0xd6, 0x22, 0x68, 0xa1, 0x86, 0x00, 0x07, 0x19, 0x04, 0xb2, 0x9c, + 0x68, 0x10, 0xa0, 0x05, 0x01, 0x38, 0xa0, 0x80, 0x00, 0x13, 0x20, 0x04, + 0xd0, 0xfc, 0x11, 0x10, 0x00, 0xde, 0x08, 0xc0, 0x60, 0x07, 0x00, 0x3a, + 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x6c, 0xff, 0x08, 0x0c, 0x71, 0xe5, + 0x00, 0xc6, 0x2d, 0x60, 0x61, 0x00, 0xa1, 0x86, 0x00, 0x02, 0x19, 0x04, + 0xb3, 0x25, 0x60, 0x10, 0xa0, 0x05, 0x11, 0x38, 0x60, 0x00, 0xa0, 0x86, + 0x00, 0x07, 0x19, 0x0c, 0x15, 0x1a, 0x08, 0x04, 0xb3, 0x25, 0xa0, 0x8c, + 0xf0, 0x00, 0x11, 0x30, 0x00, 0x28, 0x20, 0x68, 0x68, 0x00, 0xa0, 0x05, + 0x1d, 0xe0, 0x2d, 0x00, 0xa0, 0x80, 0x00, 0x13, 0x20, 0x04, 0xa0, 0x84, + 0x00, 0x03, 0xa0, 0x86, 0x00, 0x02, 0x11, 0x80, 0x60, 0x10, 0x20, 0x68, + 0x68, 0x4c, 0xc0, 0xdc, 0xc0, 0xf4, 0x68, 0x4e, 0x68, 0x50, 0xc0, 0xf4, + 0xc0, 0xfc, 0x68, 0x52, 0x20, 0x09, 0x00, 0x43, 0x08, 0x0c, 0xac, 0x12, + 0x08, 0x04, 0xb3, 0x25, 0x20, 0x09, 0x00, 0x41, 0x08, 0x04, 0xb3, 0x1f, + 0xa1, 0x86, 0x00, 0x05, 0x15, 0xf0, 0x68, 0x10, 0xa0, 0x80, 0x00, 0x13, + 0x20, 0x04, 0xd0, 0xbc, 0x11, 0x18, 0x00, 0xde, 0x08, 0x04, 0xb2, 0x36, + 0xd0, 0xb4, 0x01, 0x28, 0xd0, 0xfc, 0x09, 0x0c, 0x15, 0x1a, 0x08, 0x04, + 0xb2, 0x54, 0x60, 0x07, 0x00, 0x3a, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, + 0x6c, 0xff, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0xc6, 0x2d, 0x60, 0x61, 0x00, + 0xa1, 0x86, 0x00, 0x02, 0x01, 0x20, 0xa1, 0x86, 0x00, 0x04, 0x19, 0x04, + 0xb3, 0x25, 0x20, 0x71, 0xb9, 0x24, 0x70, 0x00, 0xa0, 0x86, 0x00, 0x03, + 0x11, 0x28, 0x70, 0x04, 0xac, 0x06, 0x11, 0x10, 0x70, 0x03, 0x00, 0x00, + 0x68, 0x10, 0xa0, 0x80, 0x00, 0x13, 0x20, 0x0c, 0xc1, 0xf4, 0xc1, 0xdc, + 0x21, 0x02, 0x80, 0x00, 0x20, 0x0c, 0xc1, 0xf4, 0xc1, 0xfc, 0xc1, 0xbc, + 0x21, 0x02, 0x20, 0x09, 0x00, 0x42, 0x08, 0x04, 0xb3, 0x1f, 0x00, 0x36, + 0x00, 0xd6, 0x00, 0xd6, 0x08, 0x0c, 0x15, 0xfd, 0x00, 0x3e, 0x09, 0x0c, + 0x15, 0x1a, 0x68, 0x37, 0x01, 0x0d, 0x68, 0x03, 0x00, 0x00, 0x68, 0x3b, + 0x00, 0x00, 0x68, 0x5b, 0x00, 0x00, 0x6b, 0x5e, 0x68, 0x57, 0x00, 0x45, + 0x2c, 0x00, 0x68, 0x62, 0x60, 0x34, 0x68, 0x72, 0x23, 0x60, 0x60, 0x20, + 0xc0, 0xdd, 0x60, 0x22, 0x60, 0x18, 0xa0, 0x80, 0x00, 0x28, 0x20, 0x04, + 0xa0, 0x84, 0x00, 0xff, 0x80, 0x07, 0x63, 0x50, 0x6b, 0x4a, 0x68, 0x46, + 0x68, 0x4f, 0x00, 0x00, 0x68, 0x53, 0x00, 0x00, 0x6d, 0x6a, 0x6e, 0x66, + 0x68, 0x6f, 0x00, 0x01, 0x08, 0x0c, 0x54, 0x7a, 0x20, 0x19, 0x00, 0x45, + 0x60, 0x08, 0x20, 0x68, 0x08, 0x0c, 0xad, 0x9c, 0x2d, 0x00, 0x60, 0x0a, + 0x60, 0x1f, 0x00, 0x06, 0x60, 0x03, 0x00, 0x07, 0x60, 0x17, 0x00, 0x00, + 0x60, 0x3f, 0x00, 0x00, 0x00, 0xde, 0x00, 0x3e, 0x00, 0x38, 0x60, 0x3f, + 0x00, 0x00, 0x60, 0x03, 0x00, 0x07, 0x08, 0x0c, 0xac, 0x12, 0x00, 0xce, + 0x00, 0xde, 0x00, 0x05, 0xa1, 0x86, 0x00, 0x13, 0x11, 0x28, 0x60, 0x04, + 0xa0, 0x82, 0x00, 0x85, 0x20, 0x08, 0x00, 0xc2, 0xa1, 0x86, 0x00, 0x27, + 0x11, 0x78, 0x08, 0x0c, 0x71, 0x02, 0x00, 0x36, 0x00, 0xd6, 0x60, 0x10, + 0x20, 0x68, 0x20, 0x19, 0x00, 0x04, 0x08, 0x0c, 0xb1, 0x55, 0x00, 0xde, + 0x00, 0x3e, 0x08, 0x0c, 0x71, 0xe5, 0x00, 0x05, 0xa1, 0x86, 0x00, 0x14, + 0x0d, 0x70, 0x08, 0x0c, 0x86, 0xef, 0x00, 0x05, 0xb3, 0x51, 0xb3, 0x4f, + 0xb3, 0x4f, 0xb3, 0x4f, 0xb3, 0x4f, 0xb3, 0x4f, 0xb3, 0x51, 0x08, 0x0c, + 0x15, 0x1a, 0x08, 0x0c, 0x71, 0x02, 0x60, 0x03, 0x00, 0x0c, 0x08, 0x0c, + 0x71, 0xe5, 0x00, 0x05, 0xa1, 0x82, 0x00, 0x8c, 0x12, 0x20, 0xa1, 0x82, + 0x00, 0x85, 0x02, 0x08, 0x00, 0x1a, 0x08, 0x0c, 0x86, 0xef, 0x00, 0x05, + 0xb3, 0x69, 0xb3, 0x69, 0xb3, 0x69, 0xb3, 0x69, 0xb3, 0x6b, 0xb3, 0x89, + 0xb3, 0x69, 0x08, 0x0c, 0x15, 0x1a, 0x00, 0xd6, 0x2c, 0x68, 0x08, 0x0c, + 0x86, 0x4e, 0x01, 0xa0, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x1e, + 0x20, 0x09, 0xbc, 0x8e, 0x21, 0x0c, 0x61, 0x36, 0x20, 0x09, 0xbc, 0x8f, + 0x21, 0x0c, 0x61, 0x3a, 0x60, 0x0b, 0xff, 0xff, 0x69, 0x18, 0x61, 0x1a, + 0x60, 0x1f, 0x00, 0x04, 0x08, 0x0c, 0x6c, 0xff, 0x2d, 0x60, 0x08, 0x0c, + 0x86, 0xa4, 0x00, 0xde, 0x00, 0x05, 0x08, 0x0c, 0x86, 0xa4, 0x00, 0x05, + 0x00, 0xe6, 0x60, 0x18, 0x20, 0x70, 0x70, 0x00, 0xd0, 0xec, 0x00, 0xee, + 0x00, 0x05, 0x60, 0x10, 0xa0, 0x8c, 0xf0, 0x00, 0x09, 0x04, 0xb3, 0xd7, + 0xa0, 0x80, 0x00, 0x13, 0x20, 0x0c, 0xd1, 0xec, 0x05, 0xd0, 0x20, 0x01, + 0xb6, 0x72, 0x20, 0x04, 0xd0, 0xec, 0x05, 0xa8, 0x60, 0x03, 0x00, 0x02, + 0x60, 0x20, 0xc0, 0xe5, 0x60, 0x22, 0xd1, 0xac, 0x01, 0x80, 0x00, 0xf6, + 0x2c, 0x78, 0x08, 0x0c, 0x53, 0x73, 0x00, 0xfe, 0x01, 0x50, 0x20, 0x01, + 0xb8, 0xb8, 0x20, 0x04, 0x60, 0x3e, 0x20, 0x09, 0xb6, 0x72, 0x21, 0x0c, + 0xd1, 0xf4, 0x11, 0xe8, 0x00, 0x80, 0x20, 0x09, 0xb6, 0x72, 0x21, 0x0c, + 0xd1, 0xf4, 0x01, 0x28, 0x60, 0x20, 0xc0, 0xe4, 0x60, 0x22, 0xa0, 0x06, + 0x00, 0xa0, 0x20, 0x01, 0xb8, 0xb8, 0x20, 0x0c, 0x81, 0x03, 0xa1, 0x00, + 0x60, 0x3e, 0x60, 0x18, 0xa0, 0x88, 0x00, 0x2b, 0x21, 0x04, 0xa0, 0x05, + 0x01, 0x18, 0xa0, 0x88, 0x00, 0x03, 0x0c, 0xd0, 0x2c, 0x0a, 0x60, 0x0f, + 0x00, 0x00, 0xa0, 0x85, 0x00, 0x01, 0x00, 0x05, 0x00, 0x16, 0x00, 0xc6, + 0x00, 0xe6, 0x61, 0x50, 0xa2, 0xf0, 0x00, 0x2b, 0x2e, 0x04, 0x20, 0x60, + 0x8c, 0xff, 0x01, 0x80, 0x84, 0xff, 0x11, 0x18, 0x60, 0x50, 0xa1, 0x06, + 0x11, 0x38, 0x60, 0x0c, 0x20, 0x72, 0x08, 0x0c, 0x6b, 0x61, 0x08, 0x0c, + 0x86, 0xa4, 0x00, 0x10, 0xac, 0xf0, 0x00, 0x03, 0x2e, 0x64, 0x0c, 0x70, + 0x00, 0xee, 0x00, 0xce, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xd6, 0x60, 0x18, + 0xa0, 0xe8, 0x00, 0x2b, 0x2d, 0x04, 0xa0, 0x05, 0x01, 0x40, 0xac, 0x06, + 0x01, 0x20, 0x2d, 0x04, 0xa0, 0xe8, 0x00, 0x03, 0x0c, 0xb8, 0x60, 0x0c, + 0x20, 0x6a, 0x00, 0xde, 0x00, 0x05, 0x00, 0x26, 0x00, 0x36, 0x01, 0x56, + 0x20, 0x11, 0xb6, 0x28, 0x22, 0x04, 0xa0, 0x84, 0x00, 0xff, 0x20, 0x19, + 0xbc, 0x8e, 0x23, 0x34, 0xa6, 0x36, 0x11, 0xd8, 0x83, 0x18, 0x23, 0x34, + 0x22, 0x04, 0xa0, 0x84, 0xff, 0x00, 0xa6, 0x36, 0x11, 0xa0, 0x20, 0x11, + 0xbc, 0x90, 0x60, 0x18, 0xa0, 0x98, 0x00, 0x0a, 0x20, 0xa9, 0x00, 0x04, + 0x08, 0x0c, 0x91, 0x66, 0x11, 0x50, 0x20, 0x11, 0xbc, 0x94, 0x60, 0x18, + 0xa0, 0x98, 0x00, 0x06, 0x20, 0xa9, 0x00, 0x04, 0x08, 0x0c, 0x91, 0x66, + 0x11, 0x00, 0x01, 0x5e, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x05, 0x00, 0xe6, + 0x20, 0x71, 0xb6, 0x00, 0x08, 0x0c, 0x4c, 0x28, 0x08, 0x0c, 0x2a, 0xed, + 0x00, 0xee, 0x00, 0x05, 0x00, 0xe6, 0x60, 0x18, 0x20, 0x70, 0x70, 0x00, + 0xd0, 0xfc, 0x01, 0x08, 0x00, 0x11, 0x00, 0xee, 0x00, 0x05, 0x68, 0x50, + 0xc0, 0xe5, 0x68, 0x52, 0x00, 0x05, 0x00, 0xe6, 0x00, 0xc6, 0x00, 0x76, + 0x00, 0x66, 0x00, 0x56, 0x00, 0x46, 0x00, 0x26, 0x00, 0x16, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x20, 0x29, 0xb8, 0xea, 0x25, 0x2c, 0x20, 0x21, + 0xb8, 0xf0, 0x24, 0x24, 0x20, 0x61, 0xbe, 0x00, 0x20, 0x71, 0xb6, 0x00, + 0x76, 0x48, 0x70, 0x68, 0xa6, 0x06, 0x05, 0x78, 0x67, 0x1c, 0xa7, 0x86, + 0x00, 0x01, 0x01, 0x18, 0xa7, 0x86, 0x00, 0x08, 0x15, 0x00, 0x25, 0x00, + 0xac, 0x06, 0x01, 0xe8, 0x24, 0x00, 0xac, 0x06, 0x01, 0xd0, 0x08, 0x0c, + 0xb1, 0xcc, 0x01, 0xb8, 0x08, 0x0c, 0xb1, 0xdc, 0x11, 0xa0, 0x60, 0x00, + 0xa0, 0x86, 0x00, 0x04, 0x11, 0x20, 0x00, 0x16, 0x08, 0x0c, 0x19, 0x52, + 0x00, 0x1e, 0x08, 0x0c, 0x9f, 0x03, 0x11, 0x10, 0x08, 0x0c, 0x2c, 0xf7, + 0x08, 0x0c, 0x9f, 0x14, 0x11, 0x10, 0x08, 0x0c, 0x8c, 0xa5, 0x08, 0x0c, + 0x9e, 0xd9, 0xac, 0xe0, 0x00, 0x18, 0x20, 0x01, 0xb6, 0x17, 0x20, 0x04, + 0xac, 0x02, 0x12, 0x08, 0x08, 0x58, 0x01, 0x2e, 0x00, 0x1e, 0x00, 0x2e, + 0x00, 0x4e, 0x00, 0x5e, 0x00, 0x6e, 0x00, 0x7e, 0x00, 0xce, 0x00, 0xee, + 0x00, 0x05, 0x01, 0x26, 0x00, 0x06, 0x00, 0xe6, 0x00, 0x16, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x71, 0xb6, 0x40, 0xd5, 0xa4, 0x01, 0x18, 0x70, 0x34, + 0x80, 0x00, 0x70, 0x36, 0xd5, 0xb4, 0x01, 0x18, 0x70, 0x30, 0x80, 0x00, + 0x70, 0x32, 0xd5, 0xac, 0x01, 0x78, 0x25, 0x00, 0xa0, 0x84, 0x00, 0x07, + 0xa0, 0x8e, 0x00, 0x03, 0x01, 0x48, 0xa0, 0x8e, 0x00, 0x04, 0x01, 0x30, + 0xa0, 0x8e, 0x00, 0x05, 0x01, 0x18, 0x20, 0x71, 0xb6, 0x4a, 0x04, 0xc9, + 0x00, 0x1e, 0x00, 0xee, 0x00, 0x0e, 0x01, 0x2e, 0x00, 0x05, 0x01, 0x26, + 0x00, 0x06, 0x00, 0xe6, 0x00, 0x16, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, + 0xb6, 0x40, 0xd5, 0xa4, 0x01, 0x18, 0x70, 0x34, 0x80, 0x00, 0x70, 0x36, + 0xd5, 0xb4, 0x01, 0x18, 0x70, 0x30, 0x80, 0x00, 0x70, 0x32, 0xd5, 0xac, + 0x01, 0x78, 0x25, 0x00, 0xa0, 0x84, 0x00, 0x07, 0xa0, 0x8e, 0x00, 0x03, + 0x01, 0x48, 0xa0, 0x8e, 0x00, 0x04, 0x01, 0x30, 0xa0, 0x8e, 0x00, 0x05, + 0x01, 0x18, 0x20, 0x71, 0xb6, 0x4a, 0x00, 0x89, 0x00, 0x1e, 0x00, 0xee, + 0x00, 0x0e, 0x01, 0x2e, 0x00, 0x05, 0x01, 0x26, 0x00, 0x06, 0x00, 0xe6, + 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0xb6, 0x42, 0x00, 0x21, 0x00, 0xee, + 0x00, 0x0e, 0x01, 0x2e, 0x00, 0x05, 0x2e, 0x04, 0x80, 0x00, 0x20, 0x72, + 0x12, 0x20, 0x8e, 0x70, 0x2e, 0x04, 0x80, 0x00, 0x20, 0x72, 0x00, 0x05, + 0x00, 0xe6, 0x20, 0x71, 0xb6, 0x40, 0x0c, 0x99, 0x00, 0xee, 0x00, 0x05, + 0x00, 0xe6, 0x20, 0x71, 0xb6, 0x44, 0x0c, 0x69, 0x00, 0xee, 0x00, 0x05, + 0x01, 0x26, 0x00, 0x06, 0x00, 0xe6, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, + 0xb6, 0x40, 0x70, 0x44, 0x80, 0x00, 0x70, 0x46, 0x00, 0xee, 0x00, 0x0e, + 0x01, 0x2e, 0x00, 0x05, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, + 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, + 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00, + 0xdb, 0x06 }; -#ifdef UNIQUE_FW_NAME -unsigned short fw2200tp_length01 = 0xa52b; -#else -unsigned short risc_code_length01 = 0xa52b; -#endif +struct firmware ql2200_fw = { + .size = sizeof(ql2200_fw_bin), + .data = ql2200_fw_bin +}; diff --git a/drivers/scsi/qla2xxx/ql2300.c b/drivers/scsi/qla2xxx/ql2300.c deleted file mode 100644 index e7a93ddda..000000000 --- a/drivers/scsi/qla2xxx/ql2300.c +++ /dev/null @@ -1,114 +0,0 @@ -/* - * QLogic Fibre Channel HBA Driver - * Copyright (C) 2003 Christoph Hellwig. - * Copyright (c) 2003-2005 QLogic Corporation - * - * See LICENSE.qla2xxx for copyright and licensing details. - */ -#include -#include -#include - -#include "qla_def.h" - -static char qla_driver_name[] = "qla2300"; - -extern unsigned char fw2300ipx_version[]; -extern unsigned char fw2300ipx_version_str[]; -extern unsigned short fw2300ipx_addr01; -extern unsigned short fw2300ipx_code01[]; -extern unsigned short fw2300ipx_length01; - -static struct qla_fw_info qla_fw_tbl[] = { - { - .addressing = FW_INFO_ADDR_NORMAL, - .fwcode = &fw2300ipx_code01[0], - .fwlen = &fw2300ipx_length01, - .fwstart = &fw2300ipx_addr01, - }, - { FW_INFO_ADDR_NOMORE, }, -}; - -static struct qla_board_info qla_board_tbl[] = { - { - .drv_name = qla_driver_name, - .isp_name = "ISP2300", - .fw_info = qla_fw_tbl, - }, - { - .drv_name = qla_driver_name, - .isp_name = "ISP2312", - .fw_info = qla_fw_tbl, - }, - { - .drv_name = qla_driver_name, - .isp_name = "ISP6312", - .fw_info = qla_fw_tbl, - }, -}; - -static struct pci_device_id qla2300_pci_tbl[] = { - { - .vendor = PCI_VENDOR_ID_QLOGIC, - .device = PCI_DEVICE_ID_QLOGIC_ISP2300, - .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_ISP2312, - .subvendor = PCI_ANY_ID, - .subdevice = PCI_ANY_ID, - .driver_data = (unsigned long)&qla_board_tbl[1], - }, - { - .vendor = PCI_VENDOR_ID_QLOGIC, - .device = PCI_DEVICE_ID_QLOGIC_ISP6312, - .subvendor = PCI_ANY_ID, - .subdevice = PCI_ANY_ID, - .driver_data = (unsigned long)&qla_board_tbl[2], - }, - {0, 0}, -}; -MODULE_DEVICE_TABLE(pci, qla2300_pci_tbl); - -static int __devinit -qla2300_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 -qla2300_remove_one(struct pci_dev *pdev) -{ - qla2x00_remove_one(pdev); -} - -static struct pci_driver qla2300_pci_driver = { - .name = "qla2300", - .id_table = qla2300_pci_tbl, - .probe = qla2300_probe_one, - .remove = __devexit_p(qla2300_remove_one), -}; - -static int __init -qla2300_init(void) -{ - return pci_module_init(&qla2300_pci_driver); -} - -static void __exit -qla2300_exit(void) -{ - pci_unregister_driver(&qla2300_pci_driver); -} - -module_init(qla2300_init); -module_exit(qla2300_exit); - -MODULE_AUTHOR("QLogic Corporation"); -MODULE_DESCRIPTION("QLogic ISP23xx FC-SCSI Host Bus Adapter driver"); -MODULE_LICENSE("GPL"); -MODULE_VERSION(QLA2XXX_VERSION); diff --git a/drivers/scsi/qla2xxx/ql2300_fw.c b/drivers/scsi/qla2xxx/ql2300_fw.c index b8ce7fe5d..624e1fbe5 100644 --- a/drivers/scsi/qla2xxx/ql2300_fw.c +++ b/drivers/scsi/qla2xxx/ql2300_fw.c @@ -1,7746 +1,10283 @@ /* - * QLogic Fibre Channel HBA Driver - * Copyright (c) 2003-2005 QLogic Corporation + * Firmware version 3.03.20 IPX from + * + * ftp://ftp.qlogic.com/outgoing/linux/firmware/ql2300_fw.bin + * + * xxd -g 1 -i ql2300_fw.bin | indent -l80 -i8 -o ql2300_fw.c * - * See LICENSE.qla2xxx for copyright and licensing details. - */ - -/* - * Firmware Version 3.03.20 (15:39 Feb 01, 2006) */ -#ifdef UNIQUE_FW_NAME -unsigned short fw2300ipx_version = 3*1024+3; -#else -unsigned short risc_code_version = 3*1024+3; -#endif +#include -#ifdef UNIQUE_FW_NAME -unsigned char fw2300ipx_version_str[] = {3, 3,20}; -#else -unsigned char firmware_version[] = {3, 3,20}; -#endif - -#ifdef UNIQUE_FW_NAME -#define fw2300ipx_VERSION_STRING "3.03.20" -#else -#define FW_VERSION_STRING "3.03.20" -#endif - -#ifdef UNIQUE_FW_NAME -unsigned short fw2300ipx_addr01 = 0x0800 ; -#else -unsigned short risc_code_addr01 = 0x0800 ; -#endif - -#ifdef UNIQUE_FW_NAME -unsigned short fw2300ipx_code01[] = { -#else -unsigned short risc_code01[] = { -#endif - 0x0470, 0x0000, 0x0000, 0xf091, 0x0000, 0x0003, 0x0003, 0x0014, - 0x0137, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2032, 0x3030, - 0x3120, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241, - 0x5449, 0x4f4e, 0x2049, 0x5350, 0x3233, 0x3030, 0x2046, 0x6972, - 0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, - 0x332e, 0x3033, 0x2e32, 0x3020, 0x2020, 0x2020, 0x2400, 0x20a9, - 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2200, 0x20a9, 0x000f, - 0x2001, 0x0000, 0x400f, 0x2091, 0x2400, 0x20a9, 0x000f, 0x2001, - 0x0000, 0x400f, 0x2091, 0x2600, 0x20a9, 0x000f, 0x2001, 0x0000, - 0x400f, 0x2091, 0x2800, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, - 0x2091, 0x2a00, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, - 0x2c00, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2e00, - 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2000, 0x2001, - 0x0000, 0x20c1, 0x0004, 0x20c9, 0x1bff, 0x2059, 0x0000, 0x2b78, - 0x7883, 0x0004, 0x2089, 0x2d93, 0x2051, 0x1800, 0x2a70, 0x20e1, - 0x0001, 0x20e9, 0x0001, 0x2009, 0x0000, 0x080c, 0x0e52, 0x2029, - 0x4d00, 0x2031, 0xffff, 0x2039, 0x4cd0, 0x2021, 0x0200, 0x20e9, - 0x0001, 0x20a1, 0x0000, 0x20a9, 0x0800, 0x900e, 0x4104, 0x20e9, - 0x0001, 0x20a1, 0x1000, 0x900e, 0x2001, 0x0cc0, 0x9084, 0x0fff, - 0x20a8, 0x4104, 0x2001, 0x0000, 0x9086, 0x0000, 0x0120, 0x21a8, - 0x4104, 0x8001, 0x1de0, 0x756e, 0x7672, 0x776a, 0x7476, 0x747a, - 0x00e6, 0x2071, 0x1ad1, 0x2472, 0x00ee, 0x20a1, 0x1cd0, 0x7170, - 0x810d, 0x810d, 0x810d, 0x810d, 0x918c, 0x000f, 0x2001, 0x0001, - 0x9112, 0x900e, 0x21a8, 0x4104, 0x8211, 0x1de0, 0x7170, 0x3400, - 0x8001, 0x9102, 0x0120, 0x0218, 0x20a8, 0x900e, 0x4104, 0x2009, - 0x1800, 0x810d, 0x810d, 0x810d, 0x810d, 0x810d, 0x918c, 0x001f, - 0x2001, 0x0001, 0x9112, 0x20e9, 0x0001, 0x20a1, 0x0800, 0x900e, - 0x20a9, 0x0800, 0x4104, 0x8211, 0x1dd8, 0x080c, 0x0f26, 0x080c, - 0x613c, 0x080c, 0xb269, 0x080c, 0x10dd, 0x080c, 0x12fc, 0x080c, - 0x1bd7, 0x080c, 0x0d57, 0x080c, 0x1062, 0x080c, 0x34b6, 0x080c, - 0x7946, 0x080c, 0x6b7c, 0x080c, 0x8a69, 0x080c, 0x874a, 0x080c, - 0x24b7, 0x080c, 0x93a5, 0x080c, 0x8066, 0x080c, 0x22e8, 0x080c, - 0x241c, 0x080c, 0x24ac, 0x2091, 0x3009, 0x7883, 0x0000, 0x1004, - 0x091f, 0x7880, 0x9086, 0x0002, 0x1190, 0x7883, 0x4000, 0x7837, - 0x4000, 0x7833, 0x0010, 0x0e04, 0x0913, 0x2091, 0x5000, 0x2091, - 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11aa, 0x2071, - 0x1800, 0x7003, 0x0000, 0x2071, 0x1800, 0x7000, 0x908e, 0x0003, - 0x1178, 0x080c, 0x4d09, 0x080c, 0x34dd, 0x080c, 0x79b7, 0x080c, - 0x7122, 0x080c, 0x8b50, 0x080c, 0x8776, 0x080c, 0x2cdd, 0x0c58, - 0x000b, 0x0c78, 0x0944, 0x0945, 0x0ae0, 0x0942, 0x0ba0, 0x0d56, - 0x0d56, 0x0d56, 0x080c, 0x0dc5, 0x0005, 0x0126, 0x00f6, 0x2091, - 0x8000, 0x7000, 0x9086, 0x0001, 0x1904, 0x0ab3, 0x080c, 0x0e94, - 0x080c, 0x7637, 0x0150, 0x080c, 0x765a, 0x15a0, 0x2079, 0x0100, - 0x7828, 0x9085, 0x1800, 0x782a, 0x0468, 0x080c, 0x7563, 0x7000, - 0x9086, 0x0001, 0x1904, 0x0ab3, 0x7098, 0x9086, 0x0029, 0x1904, - 0x0ab3, 0x080c, 0x8733, 0x080c, 0x8725, 0x2001, 0x0161, 0x2003, - 0x0001, 0x2079, 0x0100, 0x7827, 0xffff, 0x7a28, 0x9295, 0x5e2f, - 0x7a2a, 0x2011, 0x74b2, 0x080c, 0x883d, 0x2011, 0x74a5, 0x080c, - 0x8917, 0x2011, 0x5f97, 0x080c, 0x883d, 0x2011, 0x8030, 0x901e, - 0x7396, 0x04d0, 0x080c, 0x583f, 0x2079, 0x0100, 0x7844, 0x9005, - 0x1904, 0x0ab3, 0x2011, 0x5f97, 0x080c, 0x883d, 0x2011, 0x74b2, - 0x080c, 0x883d, 0x2011, 0x74a5, 0x080c, 0x8917, 0x2001, 0x0265, - 0x2001, 0x0205, 0x2003, 0x0000, 0x7840, 0x9084, 0xfffb, 0x7842, - 0x2001, 0x19a7, 0x2004, 0x9005, 0x1140, 0x00c6, 0x2061, 0x0100, - 0x080c, 0x60e4, 0x00ce, 0x0804, 0x0ab3, 0x780f, 0x006b, 0x7a28, - 0x080c, 0x763f, 0x0118, 0x9295, 0x5e2f, 0x0010, 0x9295, 0x402f, - 0x7a2a, 0x2011, 0x8010, 0x73d8, 0x2001, 0x19a8, 0x2003, 0x0001, - 0x080c, 0x2b82, 0x080c, 0x4c44, 0x7248, 0xc284, 0x724a, 0x2001, - 0x180c, 0x200c, 0xc1ac, 0xc1cc, 0x2102, 0x080c, 0xa9b0, 0x2011, - 0x0004, 0x080c, 0xd0e8, 0x080c, 0x6947, 0x080c, 0x7637, 0x1120, - 0x080c, 0x2bc6, 0x02e0, 0x0400, 0x080c, 0x60eb, 0x0140, 0x7097, - 0x0001, 0x70d3, 0x0000, 0x080c, 0x5a11, 0x0804, 0x0ab3, 0x080c, - 0x57d5, 0xd094, 0x0188, 0x2011, 0x180c, 0x2204, 0xc0cd, 0x2012, - 0x080c, 0x57d9, 0xd0d4, 0x1118, 0x080c, 0x2bc6, 0x1270, 0x2011, - 0x180c, 0x2204, 0xc0bc, 0x00a8, 0x080c, 0x57d9, 0xd0d4, 0x1db8, - 0x2011, 0x180c, 0x2204, 0xc0bd, 0x0060, 0x2011, 0x180c, 0x2204, - 0xc0bd, 0x2012, 0x080c, 0x6a9b, 0x1128, 0xd0a4, 0x0118, 0x2204, - 0xc0fd, 0x2012, 0x080c, 0x6a61, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e, - 0x00a8, 0x707f, 0x0000, 0x080c, 0x7637, 0x1130, 0x70b0, 0x9005, - 0x1168, 0x080c, 0xd52b, 0x0050, 0x080c, 0xd52b, 0x70dc, 0xd09c, - 0x1128, 0x70b0, 0x9005, 0x0110, 0x080c, 0x60c1, 0x70e7, 0x0000, - 0x70e3, 0x0000, 0x70a7, 0x0000, 0x080c, 0x2bce, 0x0228, 0x2011, - 0x0101, 0x2204, 0xc0c4, 0x2012, 0x72dc, 0x080c, 0x7637, 0x1178, - 0x9016, 0x0016, 0x080c, 0x298b, 0x2019, 0x196d, 0x211a, 0x001e, - 0x705f, 0xffff, 0x7063, 0x00ef, 0x7083, 0x0000, 0x0020, 0x2019, - 0x196d, 0x201b, 0x0000, 0x2079, 0x1847, 0x7804, 0xd0ac, 0x0108, - 0xc295, 0x72de, 0x080c, 0x7637, 0x0118, 0x9296, 0x0004, 0x0548, - 0x2011, 0x0001, 0x080c, 0xd0e8, 0x70ab, 0x0000, 0x70af, 0xffff, - 0x7003, 0x0002, 0x2079, 0x0100, 0x7827, 0x0003, 0x7828, 0x9085, - 0x0003, 0x782a, 0x00fe, 0x080c, 0x3000, 0x2011, 0x0005, 0x080c, - 0xaabf, 0x080c, 0x9ab1, 0x080c, 0x7637, 0x0148, 0x00c6, 0x2061, - 0x0100, 0x0016, 0x080c, 0x298b, 0x61e2, 0x001e, 0x00ce, 0x012e, - 0x0420, 0x70ab, 0x0000, 0x70af, 0xffff, 0x7003, 0x0002, 0x00f6, - 0x2079, 0x0100, 0x7827, 0x0003, 0x7828, 0x9085, 0x0003, 0x782a, - 0x00fe, 0x2011, 0x0005, 0x080c, 0xaabf, 0x080c, 0x9ab1, 0x080c, - 0x7637, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, 0x080c, 0x298b, - 0x61e2, 0x001e, 0x00ce, 0x00fe, 0x012e, 0x0005, 0x00c6, 0x00b6, - 0x080c, 0x7637, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782, - 0x080c, 0x7637, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, 0x86ff, - 0x0138, 0x9180, 0x1000, 0x2004, 0x905d, 0x0110, 0xb800, 0xd0bc, - 0x090c, 0x334c, 0x8108, 0x1f04, 0x0ac7, 0x707f, 0x0000, 0x7080, - 0x9084, 0x00ff, 0x7082, 0x70b3, 0x0000, 0x00be, 0x00ce, 0x0005, - 0x00b6, 0x0126, 0x2091, 0x8000, 0x7000, 0x9086, 0x0002, 0x1904, - 0x0b9d, 0x70ac, 0x9086, 0xffff, 0x0130, 0x080c, 0x3000, 0x080c, - 0x9ab1, 0x0804, 0x0b9d, 0x70dc, 0xd0ac, 0x1110, 0xd09c, 0x0558, - 0xd084, 0x0548, 0x0006, 0x2001, 0x0103, 0x2003, 0x002b, 0x000e, - 0xd08c, 0x0508, 0x080c, 0x33af, 0x11d0, 0x70e0, 0x9086, 0xffff, - 0x01b0, 0x080c, 0x31bc, 0x080c, 0x9ab1, 0x70dc, 0xd094, 0x1904, - 0x0b9d, 0x2011, 0x0001, 0x080c, 0xd7e3, 0x0110, 0x2011, 0x0003, - 0x901e, 0x080c, 0x31f6, 0x080c, 0x9ab1, 0x0804, 0x0b9d, 0x70e4, - 0x9005, 0x1904, 0x0b9d, 0x70a8, 0x9005, 0x1904, 0x0b9d, 0x70dc, - 0xd0a4, 0x0118, 0xd0b4, 0x0904, 0x0b9d, 0x080c, 0x6a61, 0x1904, - 0x0b9d, 0x080c, 0x6ab4, 0x1904, 0x0b9d, 0x080c, 0x6a9b, 0x01c0, - 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x6724, - 0x1118, 0xb800, 0xd0ec, 0x1138, 0x001e, 0x8108, 0x1f04, 0x0b3d, - 0x00ce, 0x015e, 0x0028, 0x001e, 0x00ce, 0x015e, 0x0804, 0x0b9d, - 0x0006, 0x2001, 0x0103, 0x2003, 0x002b, 0x000e, 0x2011, 0x19b4, - 0x080c, 0x0f96, 0x2011, 0x19ce, 0x080c, 0x0f96, 0x7030, 0xc08c, - 0x7032, 0x7003, 0x0003, 0x70af, 0xffff, 0x080c, 0x0e76, 0x9006, - 0x080c, 0x281c, 0x080c, 0x33af, 0x0118, 0x080c, 0x4de1, 0x0050, - 0x0036, 0x0046, 0x2019, 0xffff, 0x2021, 0x0006, 0x080c, 0x4dfb, - 0x004e, 0x003e, 0x00f6, 0x2079, 0x0100, 0x080c, 0x765a, 0x0150, - 0x080c, 0x7637, 0x7828, 0x0118, 0x9084, 0xe1ff, 0x0010, 0x9084, - 0xffdf, 0x782a, 0x00fe, 0x2001, 0x19e9, 0x2004, 0x9086, 0x0005, - 0x1120, 0x2011, 0x0000, 0x080c, 0xaabf, 0x2011, 0x0000, 0x080c, - 0xaac9, 0x080c, 0x9ab1, 0x080c, 0x9bd3, 0x012e, 0x00be, 0x0005, - 0x0016, 0x0046, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100, - 0x7904, 0x918c, 0xfffd, 0x7906, 0x2009, 0x00f7, 0x080c, 0x60aa, - 0x7940, 0x918c, 0x0010, 0x7942, 0x7924, 0xd1b4, 0x0110, 0x7827, - 0x0040, 0xd19c, 0x0110, 0x7827, 0x0008, 0x0006, 0x0036, 0x0156, - 0x7954, 0xd1ac, 0x1904, 0x0c2d, 0x2001, 0x19a8, 0x2004, 0x9005, - 0x1518, 0x080c, 0x2c49, 0x1148, 0x2001, 0x0001, 0x080c, 0x2bb1, - 0x2001, 0x0001, 0x080c, 0x2b94, 0x00b8, 0x080c, 0x2c51, 0x1138, - 0x9006, 0x080c, 0x2bb1, 0x9006, 0x080c, 0x2b94, 0x0068, 0x080c, - 0x2c59, 0x1d50, 0x2001, 0x1998, 0x2004, 0xd0fc, 0x0108, 0x0020, - 0x080c, 0x29bf, 0x0804, 0x0d0d, 0x080c, 0x7648, 0x0148, 0x080c, - 0x765a, 0x1118, 0x080c, 0x7941, 0x0050, 0x080c, 0x763f, 0x0dd0, - 0x080c, 0x793c, 0x080c, 0x7932, 0x080c, 0x7563, 0x0058, 0x080c, - 0x7637, 0x0140, 0x2009, 0x00f8, 0x080c, 0x60aa, 0x7843, 0x0090, - 0x7843, 0x0010, 0x20a9, 0x09c4, 0x7820, 0xd09c, 0x1138, 0x080c, - 0x7637, 0x0138, 0x7824, 0xd0ac, 0x1904, 0x0d12, 0x1f04, 0x0c0c, - 0x0070, 0x7824, 0x080c, 0x7651, 0x0118, 0xd0ac, 0x1904, 0x0d12, - 0x9084, 0x1800, 0x0d98, 0x7003, 0x0001, 0x0804, 0x0d12, 0x2001, - 0x0001, 0x080c, 0x281c, 0x0804, 0x0d25, 0x2001, 0x19a8, 0x2004, - 0x9005, 0x1518, 0x080c, 0x2c49, 0x1148, 0x2001, 0x0001, 0x080c, - 0x2bb1, 0x2001, 0x0001, 0x080c, 0x2b94, 0x00b8, 0x080c, 0x2c51, - 0x1138, 0x9006, 0x080c, 0x2bb1, 0x9006, 0x080c, 0x2b94, 0x0068, - 0x080c, 0x2c59, 0x1d50, 0x2001, 0x1998, 0x2004, 0xd0fc, 0x0108, - 0x0020, 0x080c, 0x29bf, 0x0804, 0x0d0d, 0x7850, 0x9085, 0x0040, - 0x7852, 0x7938, 0x7850, 0x9084, 0xfbcf, 0x7852, 0x080c, 0x2c61, - 0x9085, 0x2000, 0x7852, 0x793a, 0x20a9, 0x0046, 0x1d04, 0x0c66, - 0x080c, 0x88f7, 0x1f04, 0x0c66, 0x7850, 0x9085, 0x0400, 0x9084, - 0xdfbf, 0x7852, 0x793a, 0x080c, 0x7648, 0x0148, 0x080c, 0x765a, - 0x1118, 0x080c, 0x7941, 0x0050, 0x080c, 0x763f, 0x0dd0, 0x080c, - 0x793c, 0x080c, 0x7932, 0x080c, 0x7563, 0x0020, 0x2009, 0x00f8, - 0x080c, 0x60aa, 0x20a9, 0x0028, 0xa001, 0x1f04, 0x0c8c, 0x7850, - 0x9085, 0x1400, 0x7852, 0x080c, 0x7637, 0x0120, 0x7843, 0x0090, - 0x7843, 0x0010, 0x2021, 0xe678, 0x2019, 0xea60, 0x0d0c, 0x88f7, - 0x7820, 0xd09c, 0x1588, 0x080c, 0x7637, 0x0904, 0x0cf2, 0x7824, - 0xd0ac, 0x1904, 0x0d12, 0x080c, 0x765a, 0x1530, 0x0046, 0x2021, - 0x0320, 0x8421, 0x1df0, 0x004e, 0x7827, 0x1800, 0x080c, 0x2c61, - 0x7824, 0x9084, 0x1800, 0x1168, 0x9484, 0x0fff, 0x1140, 0x2001, - 0x1810, 0x2004, 0x9084, 0x9000, 0x0110, 0x080c, 0x0d33, 0x8421, - 0x1158, 0x1d04, 0x0ccd, 0x080c, 0x88f7, 0x080c, 0x793c, 0x080c, - 0x7932, 0x7003, 0x0001, 0x04f0, 0x8319, 0x1940, 0x1d04, 0x0cda, - 0x080c, 0x88f7, 0x2009, 0x199b, 0x2104, 0x9005, 0x0118, 0x8001, - 0x200a, 0x1178, 0x200b, 0x000a, 0x7827, 0x0048, 0x20a9, 0x0002, - 0x080c, 0x2c42, 0x7924, 0x080c, 0x2c61, 0xd19c, 0x0110, 0x080c, - 0x2b82, 0x00d8, 0x080c, 0x7648, 0x1140, 0x94a2, 0x03e8, 0x1128, - 0x080c, 0x760f, 0x7003, 0x0001, 0x00a8, 0x7827, 0x1800, 0x080c, - 0x2c61, 0x7824, 0x080c, 0x7651, 0x0110, 0xd0ac, 0x1158, 0x9084, - 0x1800, 0x0950, 0x7003, 0x0001, 0x0028, 0x2001, 0x0001, 0x080c, - 0x281c, 0x0078, 0x2009, 0x180c, 0x210c, 0xd19c, 0x1120, 0x7904, - 0x918d, 0x0002, 0x7906, 0x7827, 0x0048, 0x7828, 0x9085, 0x0028, - 0x782a, 0x7850, 0x9085, 0x0400, 0x7852, 0x2001, 0x19a8, 0x2003, - 0x0000, 0x9006, 0x78f2, 0x015e, 0x003e, 0x000e, 0x012e, 0x00fe, - 0x004e, 0x001e, 0x0005, 0x0006, 0x0016, 0x0036, 0x0046, 0x00b6, - 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x0069, 0x0d0c, 0x88f7, - 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x004e, 0x003e, - 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0x189e, 0x7004, 0x9086, - 0x0001, 0x1110, 0x080c, 0x34dd, 0x00ee, 0x0005, 0x0005, 0x2a70, - 0x2061, 0x19ac, 0x2063, 0x0003, 0x6007, 0x0003, 0x600b, 0x0014, - 0x600f, 0x0137, 0x2001, 0x197c, 0x900e, 0x2102, 0x7196, 0x2001, - 0x0100, 0x2004, 0x9082, 0x0002, 0x0218, 0x705f, 0xffff, 0x0008, - 0x715e, 0x7067, 0xffff, 0x717e, 0x7182, 0x080c, 0xd52b, 0x70eb, - 0x00c0, 0x2061, 0x196c, 0x6003, 0x0909, 0x6106, 0x600b, 0x8800, - 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x001f, 0x611a, 0x601f, - 0x07d0, 0x2061, 0x1974, 0x6003, 0x8000, 0x6106, 0x610a, 0x600f, - 0x0200, 0x6013, 0x00ff, 0x6116, 0x601b, 0x0001, 0x611e, 0x2061, - 0x1989, 0x6003, 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f, - 0x2020, 0x2001, 0x182c, 0x2102, 0x0005, 0x9016, 0x080c, 0x6724, - 0x1178, 0xb804, 0x90c4, 0x00ff, 0x98c6, 0x0006, 0x0128, 0x90c4, - 0xff00, 0x98c6, 0x0600, 0x1120, 0x9186, 0x0080, 0x0108, 0x8210, - 0x8108, 0x9186, 0x0800, 0x1d50, 0x2208, 0x0005, 0x2091, 0x8000, - 0x2079, 0x0000, 0x000e, 0x00f6, 0x0010, 0x2091, 0x8000, 0x0e04, - 0x0dc7, 0x0006, 0x0016, 0x2001, 0x8002, 0x0006, 0x2079, 0x0000, - 0x000e, 0x7882, 0x7836, 0x001e, 0x798e, 0x000e, 0x788a, 0x000e, - 0x7886, 0x3900, 0x789a, 0x00d6, 0x2069, 0x0300, 0x6818, 0x78ae, - 0x681c, 0x78b2, 0x2001, 0x1a09, 0x2004, 0x78b6, 0x2001, 0x1a86, - 0x2004, 0x78ba, 0x6808, 0x78be, 0x00de, 0x7833, 0x0012, 0x2091, - 0x5000, 0x0156, 0x00d6, 0x0036, 0x0026, 0x2079, 0x0300, 0x2069, - 0x1aa9, 0x7a08, 0x226a, 0x2069, 0x1aaa, 0x7a18, 0x226a, 0x8d68, - 0x7a1c, 0x226a, 0x782c, 0x2019, 0x1ab7, 0x201a, 0x2019, 0x1aba, - 0x9016, 0x7808, 0xd09c, 0x0168, 0x7820, 0x201a, 0x8210, 0x8318, - 0x9386, 0x1acf, 0x0108, 0x0ca8, 0x7808, 0xd09c, 0x0110, 0x2011, - 0xdead, 0x2019, 0x1ab8, 0x782c, 0x201a, 0x8318, 0x221a, 0x7803, - 0x0000, 0x2069, 0x1a89, 0x901e, 0x20a9, 0x0020, 0x7b26, 0x7a28, - 0x226a, 0x8d68, 0x8318, 0x1f04, 0x0e26, 0x002e, 0x003e, 0x00de, - 0x015e, 0x2079, 0x1800, 0x7803, 0x0005, 0x2091, 0x4080, 0x2001, - 0x0089, 0x2004, 0xd084, 0x0180, 0x2001, 0x1a1c, 0x2004, 0x9005, - 0x0128, 0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, - 0x2003, 0x0002, 0x2003, 0x1001, 0x080c, 0x57e4, 0x1108, 0x0099, - 0x0cd8, 0x0005, 0x918c, 0x03ff, 0x2001, 0x0003, 0x2004, 0x9084, - 0x0600, 0x1118, 0x918d, 0x2800, 0x0010, 0x918d, 0x2000, 0x2001, - 0x017f, 0x2102, 0x0005, 0x0026, 0x0126, 0x2011, 0x0080, 0x080c, - 0x0eee, 0x20a9, 0x0900, 0x080c, 0x0f0f, 0x2011, 0x0040, 0x080c, - 0x0eee, 0x20a9, 0x0900, 0x080c, 0x0f0f, 0x0c78, 0x0026, 0x080c, - 0x0efb, 0x1118, 0x2011, 0x0040, 0x0098, 0x2011, 0x010e, 0x2214, - 0x9294, 0x0007, 0x9296, 0x0007, 0x0118, 0x2011, 0xa880, 0x0010, - 0x2011, 0x6840, 0xd0e4, 0x70ef, 0x0000, 0x1120, 0x70ef, 0x0fa0, - 0x080c, 0x0f00, 0x002e, 0x0005, 0x0026, 0x080c, 0x0efb, 0x0128, - 0xd0a4, 0x1138, 0x2011, 0xcdd5, 0x0010, 0x2011, 0x0080, 0x080c, - 0x0f00, 0x002e, 0x0005, 0x0026, 0x70ef, 0x0000, 0x080c, 0x0efb, - 0x1148, 0x080c, 0x2c59, 0x1118, 0x2011, 0x8484, 0x0058, 0x2011, - 0x8282, 0x0040, 0x080c, 0x2c59, 0x1118, 0x2011, 0xcdc5, 0x0010, - 0x2011, 0xcac2, 0x080c, 0x0f00, 0x002e, 0x0005, 0x00e6, 0x0006, - 0x2071, 0x1800, 0xd0b4, 0x70e8, 0x1110, 0xc0e4, 0x0048, 0x0006, - 0x3b00, 0x9084, 0xff3f, 0x20d8, 0x000e, 0x70ef, 0x0000, 0xc0e5, - 0x0079, 0x000e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1800, 0xd0e4, - 0x70e8, 0x1110, 0xc0dc, 0x0008, 0xc0dd, 0x0011, 0x00ee, 0x0005, - 0x70ea, 0x7000, 0x9084, 0x0007, 0x000b, 0x0005, 0x0ebd, 0x0e94, - 0x0e94, 0x0e76, 0x0ea3, 0x0e94, 0x0e94, 0x0ea3, 0x0016, 0x3b08, - 0x3a00, 0x9104, 0x918d, 0x00c0, 0x21d8, 0x9084, 0xff3f, 0x9205, - 0x20d0, 0x001e, 0x0005, 0x2001, 0x183a, 0x2004, 0xd0dc, 0x0005, - 0x9e86, 0x1800, 0x190c, 0x0dc5, 0x70e8, 0xd0e4, 0x0108, 0xc2e5, - 0x72ea, 0xd0e4, 0x1118, 0x9294, 0x00c0, 0x0c01, 0x0005, 0x1d04, - 0x0f0f, 0x2091, 0x6000, 0x1f04, 0x0f0f, 0x0005, 0x890e, 0x810e, - 0x810f, 0x9194, 0x003f, 0x918c, 0xffc0, 0x0005, 0x0006, 0x2200, - 0x914d, 0x894f, 0x894d, 0x894d, 0x000e, 0x0005, 0x01d6, 0x0146, - 0x0036, 0x0096, 0x2061, 0x188d, 0x600b, 0x0000, 0x600f, 0x0000, - 0x6003, 0x0000, 0x6007, 0x0000, 0x2009, 0xffc0, 0x2105, 0x0006, - 0x2001, 0xaaaa, 0x200f, 0x2019, 0x5555, 0x9016, 0x2049, 0x0bff, - 0xab02, 0xa001, 0xa001, 0xa800, 0x9306, 0x1138, 0x2105, 0x9306, - 0x0120, 0x8210, 0x99c8, 0x0400, 0x0c98, 0x000e, 0x200f, 0x2001, - 0x189d, 0x928a, 0x000e, 0x1638, 0x928a, 0x0006, 0x2011, 0x0006, - 0x1210, 0x2011, 0x0000, 0x2202, 0x9006, 0x2008, 0x82ff, 0x01b0, - 0x8200, 0x600a, 0x600f, 0xffff, 0x6003, 0x0002, 0x6007, 0x0000, - 0x0026, 0x2019, 0x0010, 0x9280, 0x0001, 0x20e8, 0x21a0, 0x21a8, - 0x4104, 0x8319, 0x1de0, 0x8211, 0x1da0, 0x002e, 0x009e, 0x003e, - 0x014e, 0x01de, 0x0005, 0x2011, 0x000e, 0x08e8, 0x0016, 0x0026, - 0x0096, 0x3348, 0x080c, 0x0f16, 0x2100, 0x9300, 0x2098, 0x22e0, - 0x009e, 0x002e, 0x001e, 0x0036, 0x3518, 0x20a9, 0x0001, 0x4002, - 0x8007, 0x4004, 0x8319, 0x1dd8, 0x003e, 0x0005, 0x20e9, 0x0001, - 0x71b8, 0x81ff, 0x11c0, 0x9006, 0x2009, 0x0200, 0x20a9, 0x0002, - 0x9298, 0x0018, 0x23a0, 0x4001, 0x2009, 0x0700, 0x20a9, 0x0002, - 0x9298, 0x0008, 0x23a0, 0x4001, 0x707c, 0x8007, 0x7180, 0x810f, - 0x20a9, 0x0002, 0x4001, 0x9298, 0x000c, 0x23a0, 0x900e, 0x080c, - 0x0da5, 0x2001, 0x0000, 0x810f, 0x20a9, 0x0002, 0x4001, 0x0005, - 0x89ff, 0x0140, 0xa804, 0xa807, 0x0000, 0x0006, 0x080c, 0x1040, - 0x009e, 0x0cb0, 0x0005, 0x00e6, 0x2071, 0x1800, 0x080c, 0x10b9, - 0x090c, 0x0dc5, 0x00ee, 0x0005, 0x0086, 0x00e6, 0x0006, 0x0026, - 0x0036, 0x0126, 0x2091, 0x8000, 0x00c9, 0x2071, 0x1800, 0x73c0, - 0x702c, 0x9016, 0x9045, 0x0158, 0x8210, 0x9906, 0x090c, 0x0dc5, - 0x2300, 0x9202, 0x0120, 0x1a0c, 0x0dc5, 0xa000, 0x0c98, 0x012e, - 0x003e, 0x002e, 0x000e, 0x00ee, 0x008e, 0x0005, 0x0086, 0x00e6, - 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x1910, 0x7010, 0x9005, - 0x0140, 0x7018, 0x9045, 0x0128, 0x9906, 0x090c, 0x0dc5, 0xa000, - 0x0cc8, 0x012e, 0x000e, 0x00ee, 0x008e, 0x0005, 0x00e6, 0x2071, - 0x1800, 0x0126, 0x2091, 0x8000, 0x70c0, 0x8001, 0x0270, 0x70c2, - 0x702c, 0x2048, 0x9085, 0x0001, 0xa800, 0x702e, 0xa803, 0x0000, - 0xa807, 0x0000, 0x012e, 0x00ee, 0x0005, 0x904e, 0x0cd8, 0x00e6, - 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x70c0, 0x90ca, 0x0020, - 0x0268, 0x8001, 0x70c2, 0x702c, 0x2048, 0xa800, 0x702e, 0xa803, - 0x0000, 0xa807, 0x0000, 0x012e, 0x00ee, 0x0005, 0x904e, 0x0cd8, - 0x00e6, 0x0126, 0x2091, 0x8000, 0x0016, 0x890e, 0x810e, 0x810f, - 0x9184, 0x003f, 0xa862, 0x9184, 0xffc0, 0xa85e, 0x001e, 0x0020, - 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x702c, 0xa802, - 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8725, 0x012e, - 0x00ee, 0x0005, 0x2071, 0x1800, 0x9026, 0x2009, 0x0000, 0x2049, - 0x0400, 0x2900, 0x702e, 0x8940, 0x2800, 0xa802, 0xa95e, 0xa863, - 0x0001, 0x8420, 0x9886, 0x0440, 0x0120, 0x2848, 0x9188, 0x0040, - 0x0c90, 0x2071, 0x188d, 0x7000, 0x9005, 0x11a0, 0x2001, 0x0534, - 0xa802, 0x2048, 0x2009, 0x4d00, 0x8940, 0x2800, 0xa802, 0xa95e, - 0xa863, 0x0001, 0x8420, 0x9886, 0x0800, 0x0120, 0x2848, 0x9188, - 0x0040, 0x0c90, 0x2071, 0x188d, 0x7104, 0x7200, 0x82ff, 0x01d0, - 0x7308, 0x8318, 0x831f, 0x831b, 0x831b, 0x7312, 0x8319, 0x2001, - 0x0800, 0xa802, 0x2048, 0x8900, 0xa802, 0x2040, 0xa95e, 0xaa62, - 0x8420, 0x2300, 0x9906, 0x0130, 0x2848, 0x9188, 0x0040, 0x9291, - 0x0000, 0x0c88, 0xa803, 0x0000, 0x2071, 0x1800, 0x74be, 0x74c2, - 0x0005, 0x00e6, 0x0016, 0x9984, 0xfc00, 0x01e8, 0x908c, 0xf800, - 0x1168, 0x9982, 0x0400, 0x02b8, 0x9982, 0x0440, 0x0278, 0x9982, - 0x0534, 0x0288, 0x9982, 0x0800, 0x1270, 0x0040, 0x9982, 0x0800, - 0x0250, 0x2071, 0x188d, 0x7010, 0x9902, 0x1228, 0x9085, 0x0001, - 0x001e, 0x00ee, 0x0005, 0x9006, 0x0cd8, 0x00e6, 0x2071, 0x1a1b, - 0x7007, 0x0000, 0x9006, 0x701e, 0x7022, 0x7002, 0x2071, 0x0000, - 0x7010, 0x9085, 0x8044, 0x7012, 0x2071, 0x0080, 0x9006, 0x20a9, - 0x0040, 0x7022, 0x1f04, 0x10f1, 0x702b, 0x0020, 0x00ee, 0x0005, - 0x0126, 0x2091, 0x8000, 0x00e6, 0xa06f, 0x0000, 0x2071, 0x1a1b, - 0x701c, 0x9088, 0x1a25, 0x280a, 0x8000, 0x9084, 0x003f, 0x701e, - 0x7120, 0x9106, 0x090c, 0x0dc5, 0x7004, 0x9005, 0x1128, 0x00f6, - 0x2079, 0x0080, 0x00a9, 0x00fe, 0x00ee, 0x012e, 0x0005, 0x0126, - 0x2091, 0x8000, 0x00e6, 0x2071, 0x1a1b, 0x7004, 0x9005, 0x1128, - 0x00f6, 0x2079, 0x0080, 0x0021, 0x00fe, 0x00ee, 0x012e, 0x0005, - 0x7004, 0x9086, 0x0000, 0x1110, 0x7007, 0x0006, 0x7000, 0x0002, - 0x113a, 0x12bd, 0x1138, 0x1138, 0x12b1, 0x12b1, 0x12b1, 0x12b1, - 0x080c, 0x0dc5, 0x701c, 0x7120, 0x9106, 0x1148, 0x792c, 0x9184, - 0x0001, 0x1120, 0xd1fc, 0x1110, 0x7007, 0x0000, 0x0005, 0x0096, - 0x9180, 0x1a25, 0x2004, 0x700a, 0x2048, 0x8108, 0x918c, 0x003f, - 0x7122, 0x782b, 0x0026, 0xa88c, 0x7802, 0xa890, 0x7806, 0xa894, - 0x780a, 0xa898, 0x780e, 0xa878, 0x700e, 0xa870, 0x7016, 0xa874, - 0x701a, 0xa868, 0x009e, 0xd084, 0x0120, 0x7007, 0x0001, 0x0029, - 0x0005, 0x7007, 0x0002, 0x00b1, 0x0005, 0x0016, 0x0026, 0x710c, - 0x2011, 0x0040, 0x9182, 0x0040, 0x1210, 0x2110, 0x9006, 0x700e, - 0x7212, 0x8203, 0x7812, 0x782b, 0x0020, 0x782b, 0x0041, 0x002e, - 0x001e, 0x0005, 0x0016, 0x0026, 0x0136, 0x0146, 0x0156, 0x7014, - 0x20e0, 0x7018, 0x2098, 0x20e9, 0x0000, 0x20a1, 0x0088, 0x782b, - 0x0026, 0x710c, 0x2011, 0x0040, 0x9182, 0x0040, 0x1210, 0x2110, - 0x9006, 0x700e, 0x22a8, 0x4006, 0x8203, 0x7812, 0x782b, 0x0020, - 0x3300, 0x701a, 0x782b, 0x0001, 0x015e, 0x014e, 0x013e, 0x002e, - 0x001e, 0x0005, 0x2009, 0x1a1b, 0x2104, 0xc095, 0x200a, 0x080c, - 0x1117, 0x0005, 0x0016, 0x00e6, 0x2071, 0x1a1b, 0x00f6, 0x2079, - 0x0080, 0x792c, 0xd1bc, 0x190c, 0x0dbe, 0x782b, 0x0002, 0xd1fc, - 0x0120, 0x918c, 0x0700, 0x7004, 0x0023, 0x00fe, 0x00ee, 0x001e, - 0x0005, 0x1128, 0x11d0, 0x1204, 0x12dc, 0x0dc5, 0x12f7, 0x0dc5, - 0x918c, 0x0700, 0x1550, 0x0136, 0x0146, 0x0156, 0x7014, 0x20e8, - 0x7018, 0x20a0, 0x20e1, 0x0000, 0x2099, 0x0088, 0x782b, 0x0040, - 0x7010, 0x20a8, 0x4005, 0x3400, 0x701a, 0x015e, 0x014e, 0x013e, - 0x700c, 0x9005, 0x0578, 0x7800, 0x7802, 0x7804, 0x7806, 0x080c, - 0x116d, 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0100, 0x009e, - 0x7007, 0x0000, 0x080c, 0x1128, 0x0005, 0x7008, 0x0096, 0x2048, - 0xa86f, 0x0200, 0x009e, 0x0ca0, 0x918c, 0x0700, 0x1150, 0x700c, - 0x9005, 0x0180, 0x7800, 0x7802, 0x7804, 0x7806, 0x080c, 0x1182, - 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0200, 0x009e, 0x7007, - 0x0000, 0x0080, 0x0096, 0x7008, 0x2048, 0x7800, 0xa88e, 0x7804, - 0xa892, 0x7808, 0xa896, 0x780c, 0xa89a, 0xa86f, 0x0100, 0x009e, - 0x7007, 0x0000, 0x0096, 0x00d6, 0x7008, 0x2048, 0x2001, 0x18b9, - 0x2004, 0x9906, 0x1128, 0xa89c, 0x080f, 0x00de, 0x009e, 0x00a0, - 0x00de, 0x009e, 0x0096, 0x00d6, 0x7008, 0x2048, 0x0081, 0x0150, - 0xa89c, 0x0086, 0x2940, 0x080f, 0x008e, 0x00de, 0x009e, 0x080c, - 0x1117, 0x0005, 0x00de, 0x009e, 0x080c, 0x1117, 0x0005, 0xa8a8, - 0xd08c, 0x0005, 0x0096, 0xa0a0, 0x904d, 0x090c, 0x0dc5, 0xa06c, - 0x908e, 0x0100, 0x0130, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, - 0x4002, 0x080c, 0x6e92, 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x2848, - 0x080c, 0x1040, 0x009e, 0x0005, 0x00a6, 0xa0a0, 0x904d, 0x090c, - 0x0dc5, 0xa06c, 0x908e, 0x0100, 0x0128, 0xa87b, 0x0001, 0xa883, - 0x0000, 0x00c0, 0xa80c, 0x2050, 0xb004, 0x9005, 0x0198, 0xa80e, - 0x2050, 0x8006, 0x8006, 0x8007, 0x908c, 0x003f, 0x9084, 0xffc0, - 0x9080, 0x0002, 0xa076, 0xa172, 0xb000, 0xa07a, 0x2810, 0x080c, - 0x10f8, 0x00e8, 0xa97c, 0xa894, 0x0016, 0x0006, 0x080c, 0x6e92, - 0x000e, 0x001e, 0xd1fc, 0x1138, 0xd1f4, 0x0128, 0x00c6, 0x2060, - 0x080c, 0xb2d3, 0x00ce, 0x7008, 0x2048, 0xa89f, 0x0000, 0xa8a3, - 0x0000, 0x080c, 0x1040, 0x7007, 0x0000, 0x080c, 0x1117, 0x00ae, - 0x0005, 0x0126, 0x2091, 0x8000, 0x782b, 0x1001, 0x7007, 0x0005, - 0x7000, 0xc094, 0x7002, 0x012e, 0x0005, 0x0096, 0x2001, 0x192f, - 0x204c, 0xa87c, 0x7812, 0xa88c, 0x7802, 0xa890, 0x7806, 0xa894, - 0x780a, 0xa898, 0x780e, 0x782b, 0x0020, 0x0126, 0x2091, 0x8000, - 0x782b, 0x0041, 0x7007, 0x0003, 0x7000, 0xc084, 0x7002, 0x2900, - 0x700a, 0x012e, 0x009e, 0x0005, 0x20e1, 0x0000, 0x2099, 0x0088, - 0x782b, 0x0040, 0x0096, 0x2001, 0x192f, 0x204c, 0xaa7c, 0x009e, - 0x080c, 0x8d91, 0x2009, 0x188c, 0x2104, 0x9084, 0xfffc, 0x200a, - 0x080c, 0x8bf3, 0x7007, 0x0000, 0x080c, 0x1128, 0x0005, 0x7007, - 0x0000, 0x080c, 0x1128, 0x0005, 0x0126, 0x2091, 0x2200, 0x2079, - 0x0300, 0x2071, 0x1a65, 0x7003, 0x0000, 0x78bf, 0x00f6, 0x781b, - 0x4800, 0x00c1, 0x7803, 0x0003, 0x780f, 0x0000, 0x20a9, 0x03ea, - 0x2061, 0xf0ae, 0x2c0d, 0x7912, 0xe104, 0x9ce0, 0x0002, 0x7916, - 0x1f04, 0x1312, 0x7807, 0x0007, 0x7803, 0x0000, 0x7803, 0x0001, - 0x012e, 0x0005, 0x00c6, 0x7803, 0x0000, 0x7808, 0xd09c, 0x0120, - 0x7820, 0x080c, 0x1376, 0x0cc8, 0x2001, 0x1a66, 0x2003, 0x0000, - 0x78ab, 0x0004, 0x78ac, 0xd0ac, 0x1de8, 0x78ab, 0x0002, 0x7807, - 0x0007, 0x7827, 0x0030, 0x782b, 0x0400, 0x7827, 0x0031, 0x782b, - 0x1a89, 0x781f, 0xff00, 0x781b, 0xb700, 0x2001, 0x0200, 0x2004, - 0xd0dc, 0x0110, 0x781f, 0x0303, 0x2061, 0x1a89, 0x602f, 0x1cd0, - 0x2001, 0x181a, 0x2004, 0x9082, 0x1cd0, 0x6032, 0x603b, 0x20c7, - 0x2001, 0x33b6, 0xd0fc, 0x190c, 0x0dc5, 0x2001, 0x1810, 0x2004, - 0xd0c4, 0x1128, 0x2001, 0x0003, 0x2004, 0xd0d4, 0x1118, 0x783f, - 0x33b6, 0x0020, 0x9084, 0xc000, 0x783f, 0xb3b6, 0x604f, 0x193d, - 0x2001, 0x1928, 0x2004, 0x6042, 0x00ce, 0x0005, 0x9086, 0x000d, - 0x11d0, 0x7808, 0xd09c, 0x01b8, 0x7820, 0x0026, 0x2010, 0x080c, - 0xd0c6, 0x0180, 0x2260, 0x6000, 0x9086, 0x0004, 0x1158, 0x0016, - 0x6120, 0x9186, 0x0009, 0x0108, 0x0020, 0x2009, 0x004c, 0x080c, - 0xb352, 0x001e, 0x002e, 0x0005, 0x0126, 0x2091, 0x2200, 0x7908, - 0x9184, 0x0070, 0x190c, 0x0dbe, 0xd19c, 0x0158, 0x7820, 0x908c, - 0xf000, 0x15e8, 0x908a, 0x0024, 0x1a0c, 0x0dc5, 0x0023, 0x012e, - 0x0005, 0x012e, 0x0005, 0x13cf, 0x13cf, 0x13e6, 0x13eb, 0x13ef, - 0x13f4, 0x141c, 0x1420, 0x142e, 0x1432, 0x13cf, 0x14ff, 0x1503, - 0x1575, 0x157c, 0x13cf, 0x157d, 0x157e, 0x1589, 0x1590, 0x13cf, - 0x13cf, 0x13cf, 0x13cf, 0x13cf, 0x13cf, 0x13cf, 0x13f6, 0x13cf, - 0x13cf, 0x13cf, 0x13cf, 0x13cf, 0x13cf, 0x13d3, 0x13d1, 0x080c, - 0x0dc5, 0x080c, 0x0dbe, 0x080c, 0x159b, 0x2009, 0x1a7e, 0x2104, - 0x8000, 0x200a, 0x080c, 0x813a, 0x080c, 0x1ad9, 0x0005, 0x2009, - 0x0048, 0x2060, 0x080c, 0xb352, 0x012e, 0x0005, 0x7004, 0xc085, - 0xc0b5, 0x7006, 0x0005, 0x7004, 0xc085, 0x7006, 0x0005, 0x080c, - 0x159b, 0x080c, 0x16fb, 0x0005, 0x080c, 0x0dc5, 0x080c, 0x159b, - 0x2060, 0x6014, 0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009, - 0x0048, 0x080c, 0xb352, 0x2001, 0x015d, 0x2003, 0x0000, 0x2009, - 0x03e8, 0x8109, 0x0160, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, - 0x2001, 0x0218, 0x2004, 0xd0ec, 0x1110, 0x080c, 0x15a0, 0x2001, - 0x0307, 0x2003, 0x8000, 0x0005, 0x7004, 0xc095, 0x7006, 0x0005, - 0x080c, 0x159b, 0x2060, 0x6014, 0x0096, 0x2048, 0xa83b, 0xffff, - 0x009e, 0x2009, 0x0048, 0x080c, 0xb352, 0x0005, 0x080c, 0x159b, - 0x080c, 0x0dc5, 0x080c, 0x159b, 0x080c, 0x14ea, 0x7827, 0x0018, - 0x79ac, 0xd1dc, 0x0904, 0x149b, 0x7827, 0x0015, 0x7828, 0x782b, - 0x0000, 0x9065, 0x0140, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, - 0x0020, 0x0804, 0x14a1, 0x7004, 0x9005, 0x01c8, 0x1188, 0x78ab, - 0x0004, 0x7827, 0x0018, 0x782b, 0x0000, 0xd1bc, 0x090c, 0x0dc5, - 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0804, 0x14cf, - 0x78ab, 0x0004, 0x7803, 0x0001, 0x080c, 0x1503, 0x0005, 0x7827, - 0x0018, 0xa001, 0x7828, 0x7827, 0x0011, 0xa001, 0x7928, 0x9106, - 0x0110, 0x79ac, 0x08e0, 0x00e6, 0x2071, 0x0200, 0x702c, 0xd0c4, - 0x0140, 0x00ee, 0x080c, 0x1ad9, 0x080c, 0x1322, 0x7803, 0x0001, - 0x0005, 0x7037, 0x0001, 0xa001, 0x7150, 0x00ee, 0x918c, 0xff00, - 0x9186, 0x0500, 0x0110, 0x79ac, 0x0810, 0x7004, 0xc09d, 0x7006, - 0x78ab, 0x0004, 0x7803, 0x0001, 0x080c, 0x1503, 0x2001, 0x020d, - 0x2003, 0x0020, 0x0005, 0x7828, 0x782b, 0x0000, 0x9065, 0x090c, - 0x0dc5, 0x6014, 0x2048, 0x78ab, 0x0004, 0x918c, 0x0700, 0x01a8, - 0x080c, 0x813a, 0x080c, 0x1ad9, 0x080c, 0xd0d8, 0x0158, 0xa9ac, - 0xa936, 0xa9b0, 0xa93a, 0xa83f, 0xffff, 0xa843, 0xffff, 0xa880, - 0xc0bd, 0xa882, 0x080c, 0xccf3, 0x0005, 0x6020, 0x9086, 0x0009, - 0x1128, 0x2009, 0x004c, 0x080c, 0xb352, 0x0048, 0x6010, 0x00b6, - 0x2058, 0xb800, 0x00be, 0xd0bc, 0x6024, 0x190c, 0xd4c4, 0x2029, - 0x00c8, 0x8529, 0x0128, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, - 0x7dbc, 0x080c, 0xf057, 0xd5a4, 0x1118, 0x080c, 0x15a0, 0x0005, - 0x080c, 0x813a, 0x080c, 0x1ad9, 0x0005, 0x781f, 0x0300, 0x7803, - 0x0001, 0x0005, 0x0016, 0x0066, 0x0076, 0x00f6, 0x2079, 0x0300, - 0x7908, 0x918c, 0x0007, 0x9186, 0x0003, 0x0120, 0x2001, 0x0016, - 0x080c, 0x1611, 0x00fe, 0x007e, 0x006e, 0x001e, 0x0005, 0x7004, - 0xc09d, 0x7006, 0x0005, 0x7104, 0x9184, 0x0004, 0x190c, 0x0dc5, - 0xd184, 0x11b1, 0xd19c, 0x0180, 0xc19c, 0x7106, 0x0016, 0x080c, - 0x16de, 0x001e, 0x0148, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, - 0x0020, 0x080c, 0x15a0, 0x0005, 0x81ff, 0x190c, 0x0dc5, 0x0005, - 0x2100, 0xc184, 0xc1b4, 0x7106, 0xd0b4, 0x0016, 0x00e6, 0x1904, - 0x156a, 0x2071, 0x0200, 0x080c, 0x16cb, 0x05e0, 0x080c, 0x16de, - 0x05b0, 0x6014, 0x9005, 0x05b0, 0x0096, 0x2048, 0xa864, 0x009e, - 0x9084, 0x00ff, 0x908e, 0x0029, 0x0160, 0x908e, 0x0048, 0x1550, - 0x601c, 0xd084, 0x11e0, 0x00f6, 0x2c78, 0x080c, 0x1768, 0x00fe, - 0x00b0, 0x00f6, 0x2c78, 0x080c, 0x18fd, 0x00fe, 0x2009, 0x01f4, - 0x8109, 0x0168, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001, - 0x0218, 0x2004, 0xd0ec, 0x1118, 0x080c, 0x15a0, 0x0040, 0x2001, - 0x020d, 0x2003, 0x0020, 0x080c, 0x1322, 0x7803, 0x0001, 0x00ee, - 0x001e, 0x0005, 0x080c, 0x16de, 0x0dd0, 0x2001, 0x020d, 0x2003, - 0x0050, 0x2003, 0x0020, 0x0461, 0x0c90, 0x0429, 0x2060, 0x2009, - 0x0053, 0x080c, 0xb352, 0x0005, 0x0005, 0x0005, 0x00e1, 0x2008, - 0x00d1, 0x0006, 0x7004, 0xc09d, 0x7006, 0x000e, 0x080c, 0x90de, - 0x0005, 0x0089, 0x9005, 0x0118, 0x080c, 0x8ce2, 0x0cd0, 0x0005, - 0x2001, 0x0036, 0x2009, 0x1820, 0x210c, 0x2011, 0x181f, 0x2214, - 0x080c, 0x1611, 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, 0x0005, - 0x080c, 0x14ea, 0x00d6, 0x2069, 0x0200, 0x2009, 0x01f4, 0x8109, - 0x0510, 0x6804, 0x9005, 0x0dd8, 0x2001, 0x015d, 0x2003, 0x0000, - 0x79bc, 0xd1a4, 0x1528, 0x79b8, 0x918c, 0x0fff, 0x0180, 0x9182, - 0x0841, 0x1268, 0x9188, 0x0007, 0x918c, 0x0ff8, 0x810c, 0x810c, - 0x810c, 0x080c, 0x1603, 0x6827, 0x0001, 0x8109, 0x1dd0, 0x04d9, - 0x6827, 0x0002, 0x04c1, 0x6804, 0x9005, 0x1130, 0x682c, 0xd0e4, - 0x1500, 0x6804, 0x9005, 0x0de8, 0x79b8, 0xd1ec, 0x1130, 0x08c0, - 0x080c, 0x813a, 0x080c, 0x1ad9, 0x0090, 0x7827, 0x0015, 0x782b, - 0x0000, 0x7827, 0x0018, 0x782b, 0x0000, 0x2001, 0x020d, 0x2003, - 0x0020, 0x2001, 0x0307, 0x2003, 0x0300, 0x7803, 0x0001, 0x00de, - 0x0005, 0x682c, 0x9084, 0x5400, 0x9086, 0x5400, 0x0d30, 0x7827, - 0x0015, 0x782b, 0x0000, 0x7803, 0x0001, 0x6800, 0x9085, 0x1800, - 0x6802, 0x00de, 0x0005, 0x6824, 0x9084, 0x0003, 0x1de0, 0x0005, - 0x2001, 0x0030, 0x2c08, 0x621c, 0x0021, 0x7830, 0x9086, 0x0041, - 0x0005, 0x00f6, 0x2079, 0x0300, 0x0006, 0x7808, 0xd09c, 0x0140, - 0x0016, 0x0026, 0x00c6, 0x080c, 0x1394, 0x00ce, 0x002e, 0x001e, - 0x000e, 0x0006, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, 0x0059, - 0x1118, 0x000e, 0x00fe, 0x0005, 0x000e, 0x792c, 0x3900, 0x8000, - 0x2004, 0x080c, 0x0dc5, 0x2009, 0x180c, 0x2104, 0xc0f4, 0x200a, - 0x2009, 0xff00, 0x8109, 0x0904, 0x168f, 0x7a18, 0x9284, 0x0030, - 0x0904, 0x168a, 0x9284, 0x0048, 0x9086, 0x0008, 0x1904, 0x168a, - 0x2001, 0x0109, 0x2004, 0xd08c, 0x01f0, 0x0006, 0x01c6, 0x01d6, - 0x0136, 0x0146, 0x0156, 0x0126, 0x2091, 0x2800, 0x00f6, 0x0026, - 0x0016, 0x2009, 0x1a81, 0x2104, 0x8000, 0x0208, 0x200a, 0x080c, - 0x94b1, 0x001e, 0x002e, 0x00fe, 0x012e, 0x015e, 0x014e, 0x013e, - 0x01de, 0x01ce, 0x000e, 0x2001, 0x009b, 0x2004, 0xd0fc, 0x01d0, - 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x00f6, - 0x0016, 0x2009, 0x1a82, 0x2104, 0x8000, 0x0208, 0x200a, 0x080c, - 0x1eeb, 0x001e, 0x00fe, 0x015e, 0x014e, 0x013e, 0x01de, 0x01ce, - 0x012e, 0x000e, 0x7818, 0xd0bc, 0x1904, 0x163a, 0x0005, 0x2001, - 0x180c, 0x2004, 0xd0f4, 0x1528, 0x7a18, 0x9284, 0x0030, 0x0508, - 0x9284, 0x0048, 0x9086, 0x0008, 0x11e0, 0x2001, 0x19f7, 0x2004, - 0x9005, 0x01b8, 0x2001, 0x1a69, 0x2004, 0x9086, 0x0000, 0x0188, - 0x2009, 0x1a80, 0x2104, 0x8000, 0x0208, 0x200a, 0x080c, 0xa767, - 0x2009, 0x180c, 0x2104, 0xc0f5, 0x200a, 0x2009, 0xff00, 0x0804, - 0x163a, 0x9085, 0x0001, 0x0005, 0x7832, 0x7936, 0x7a3a, 0x781b, - 0x8080, 0x080c, 0x1633, 0x1108, 0x0005, 0x792c, 0x3900, 0x8000, - 0x2004, 0x080c, 0x0dc5, 0x7037, 0x0001, 0x7150, 0x7037, 0x0002, - 0x7050, 0x2060, 0xd1bc, 0x1110, 0x7054, 0x2060, 0x918c, 0xff00, - 0x9186, 0x0500, 0x0110, 0x9085, 0x0001, 0x0005, 0x0006, 0x0046, - 0x00e6, 0x2071, 0x0200, 0x7037, 0x0002, 0x7058, 0x9084, 0xff00, - 0x8007, 0x9086, 0x00bc, 0x1158, 0x2021, 0x1a7f, 0x2404, 0x8000, - 0x0208, 0x2022, 0x080c, 0x813a, 0x080c, 0x1ad9, 0x9006, 0x00ee, - 0x004e, 0x000e, 0x0005, 0x0c11, 0x1108, 0x0005, 0x00e6, 0x0016, - 0x2071, 0x0200, 0x0841, 0x6124, 0xd1dc, 0x01f8, 0x701c, 0xd08c, - 0x0904, 0x175d, 0x7017, 0x0000, 0x2001, 0x0264, 0x2004, 0xd0bc, - 0x0904, 0x175d, 0x2001, 0x0268, 0x00c6, 0x2064, 0x6104, 0x6038, - 0x00ce, 0x918e, 0x0039, 0x1904, 0x175d, 0x9c06, 0x15f0, 0x0126, - 0x2091, 0x2600, 0x080c, 0x8081, 0x012e, 0x7358, 0x745c, 0x6014, - 0x905d, 0x0598, 0x2b48, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, - 0xd0bc, 0x190c, 0xd49f, 0xab42, 0xac3e, 0x2001, 0x1869, 0x2004, - 0xd0b4, 0x1170, 0x601c, 0xd0e4, 0x1158, 0x6010, 0x00b6, 0x2058, - 0xb800, 0x00be, 0xd0bc, 0x1120, 0xa83b, 0x7fff, 0xa837, 0xffff, - 0x080c, 0x20e7, 0x1190, 0x080c, 0x195a, 0x2a00, 0xa816, 0x0130, - 0x2800, 0xa80e, 0x2c05, 0xa80a, 0x2c00, 0xa812, 0x7037, 0x0020, - 0x781f, 0x0300, 0x001e, 0x00ee, 0x0005, 0x7037, 0x0050, 0x7037, - 0x0020, 0x001e, 0x00ee, 0x080c, 0x15a0, 0x0005, 0x080c, 0x0dc5, - 0x2001, 0x180d, 0x2004, 0xd08c, 0x190c, 0x6b5e, 0x2ff0, 0x0126, - 0x2091, 0x2200, 0x0016, 0x00c6, 0x3e60, 0x6014, 0x2048, 0x2940, - 0x903e, 0x2730, 0xa864, 0x2068, 0xa81a, 0x9d84, 0x000f, 0x9088, - 0x20c7, 0x2165, 0x0002, 0x179a, 0x1808, 0x179a, 0x179a, 0x179e, - 0x17e9, 0x179a, 0x17be, 0x1793, 0x17ff, 0x179a, 0x179a, 0x17a3, - 0x18f5, 0x17d2, 0x17c8, 0xa964, 0x918c, 0x00ff, 0x918e, 0x0048, - 0x0904, 0x17ff, 0x9085, 0x0001, 0x0804, 0x18eb, 0xa87c, 0xd0ac, - 0x0dc8, 0x0804, 0x180f, 0xa87c, 0xd0ac, 0x0da0, 0x0804, 0x187a, - 0xa898, 0x901d, 0x1108, 0xab9c, 0x9016, 0xaab2, 0xaa3e, 0xaa42, - 0x3e00, 0x9080, 0x0008, 0x2004, 0x9080, 0x933d, 0x2005, 0x9005, - 0x090c, 0x0dc5, 0x2004, 0xa8ae, 0x0804, 0x18d3, 0xa87c, 0xd0bc, - 0x09c8, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888, 0x0804, 0x180f, - 0xa87c, 0xd0bc, 0x0978, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888, - 0x0804, 0x187a, 0xa87c, 0xd0bc, 0x0928, 0xa890, 0xa842, 0xa88c, - 0xa83e, 0xa804, 0x9045, 0x090c, 0x0dc5, 0xa164, 0xa91a, 0x91ec, - 0x000f, 0x9d80, 0x20c7, 0x2065, 0xa888, 0xd19c, 0x1904, 0x187a, - 0x0430, 0xa87c, 0xd0ac, 0x0904, 0x179a, 0xa804, 0x9045, 0x090c, - 0x0dc5, 0xa164, 0xa91a, 0x91ec, 0x000f, 0x9d80, 0x20c7, 0x2065, - 0x9006, 0xa842, 0xa83e, 0xd19c, 0x1904, 0x187a, 0x0080, 0xa87c, - 0xd0ac, 0x0904, 0x179a, 0x9006, 0xa842, 0xa83e, 0x0804, 0x187a, - 0xa87c, 0xd0ac, 0x0904, 0x179a, 0x9006, 0xa842, 0xa83e, 0x2c05, - 0x908a, 0x0036, 0x1a0c, 0x0dc5, 0x9082, 0x001b, 0x0002, 0x1832, - 0x1832, 0x1834, 0x1832, 0x1832, 0x1832, 0x183e, 0x1832, 0x1832, - 0x1832, 0x1848, 0x1832, 0x1832, 0x1832, 0x1852, 0x1832, 0x1832, - 0x1832, 0x185c, 0x1832, 0x1832, 0x1832, 0x1866, 0x1832, 0x1832, - 0x1832, 0x1870, 0x080c, 0x0dc5, 0xa574, 0xa478, 0x9d86, 0x0024, - 0x0904, 0x17a8, 0xa37c, 0xa280, 0x0804, 0x18d3, 0xa584, 0xa488, - 0x9d86, 0x0024, 0x0904, 0x17a8, 0xa38c, 0xa290, 0x0804, 0x18d3, - 0xa594, 0xa498, 0x9d86, 0x0024, 0x0904, 0x17a8, 0xa39c, 0xa2a0, - 0x0804, 0x18d3, 0xa5a4, 0xa4a8, 0x9d86, 0x0024, 0x0904, 0x17a8, - 0xa3ac, 0xa2b0, 0x0804, 0x18d3, 0xa5b4, 0xa4b8, 0x9d86, 0x0024, - 0x0904, 0x17a8, 0xa3bc, 0xa2c0, 0x0804, 0x18d3, 0xa5c4, 0xa4c8, - 0x9d86, 0x0024, 0x0904, 0x17a8, 0xa3cc, 0xa2d0, 0x0804, 0x18d3, - 0xa5d4, 0xa4d8, 0x9d86, 0x0024, 0x0904, 0x17a8, 0xa3dc, 0xa2e0, - 0x0804, 0x18d3, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dc5, 0x9082, - 0x001b, 0x0002, 0x189d, 0x189b, 0x189b, 0x189b, 0x189b, 0x189b, - 0x18a8, 0x189b, 0x189b, 0x189b, 0x189b, 0x189b, 0x18b3, 0x189b, - 0x189b, 0x189b, 0x189b, 0x189b, 0x18be, 0x189b, 0x189b, 0x189b, - 0x189b, 0x189b, 0x18c9, 0x080c, 0x0dc5, 0xa56c, 0xa470, 0xa774, - 0xa678, 0x9d86, 0x002c, 0x0904, 0x17a8, 0xa37c, 0xa280, 0x0458, - 0xa584, 0xa488, 0xa78c, 0xa690, 0x9d86, 0x002c, 0x0904, 0x17a8, - 0xa394, 0xa298, 0x0400, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0x9d86, - 0x002c, 0x0904, 0x17a8, 0xa3ac, 0xa2b0, 0x00a8, 0xa5b4, 0xa4b8, - 0xa7bc, 0xa6c0, 0x9d86, 0x002c, 0x0904, 0x17a8, 0xa3c4, 0xa2c8, - 0x0050, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0x9d86, 0x002c, 0x0904, - 0x17a8, 0xa3dc, 0xa2e0, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, - 0xae2a, 0xa988, 0x8c60, 0x2c1d, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, - 0x8109, 0xa916, 0x1160, 0x3e60, 0x601c, 0xc085, 0x601e, 0xa87c, - 0xc0dd, 0xa87e, 0x9006, 0x00ce, 0x001e, 0x012e, 0x0005, 0x2800, - 0xa80e, 0xab0a, 0x2c00, 0xa812, 0x0c70, 0x0804, 0x179a, 0x2001, - 0x180d, 0x2004, 0xd08c, 0x190c, 0x6b5e, 0x2ff0, 0x0126, 0x2091, - 0x2200, 0x0016, 0x00c6, 0x3e60, 0x6014, 0x2048, 0x2940, 0xa80e, - 0x2061, 0x20c2, 0xa813, 0x20c2, 0x2c05, 0xa80a, 0xa964, 0xa91a, - 0xa87c, 0xd0ac, 0x090c, 0x0dc5, 0x9006, 0xa842, 0xa83e, 0x2c05, - 0x908a, 0x0034, 0x1a0c, 0x0dc5, 0xadcc, 0xacd0, 0xafd4, 0xaed8, - 0xabdc, 0xaae0, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, - 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0xa988, 0xa864, 0x9084, 0x00ff, - 0x9086, 0x0008, 0x1120, 0x8109, 0xa916, 0x0128, 0x0080, 0x918a, - 0x0002, 0xa916, 0x1160, 0x3e60, 0x601c, 0xc085, 0x601e, 0xa87c, - 0xc0dd, 0xa87e, 0x9006, 0x00ce, 0x001e, 0x012e, 0x0005, 0xa804, - 0x9045, 0x090c, 0x0dc5, 0xa80e, 0xa064, 0xa81a, 0x9084, 0x000f, - 0x9080, 0x20c7, 0x2015, 0x82ff, 0x090c, 0x0dc5, 0xaa12, 0x2205, - 0xa80a, 0x0c08, 0x903e, 0x2730, 0xa880, 0xd0fc, 0x1190, 0x2d00, - 0x0002, 0x1a4f, 0x19b1, 0x19b1, 0x1a4f, 0x1a4f, 0x1a49, 0x1a4f, - 0x19b1, 0x1a00, 0x1a00, 0x1a00, 0x1a4f, 0x1a4f, 0x1a4f, 0x1a46, - 0x1a00, 0xc0fc, 0xa882, 0xab2c, 0xaa30, 0xad1c, 0xac20, 0xdd9c, - 0x0904, 0x1a51, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dc5, 0x9082, - 0x001b, 0x0002, 0x199d, 0x199b, 0x199b, 0x199b, 0x199b, 0x199b, - 0x19a1, 0x199b, 0x199b, 0x199b, 0x199b, 0x199b, 0x19a5, 0x199b, - 0x199b, 0x199b, 0x199b, 0x199b, 0x19a9, 0x199b, 0x199b, 0x199b, - 0x199b, 0x199b, 0x19ad, 0x080c, 0x0dc5, 0xa774, 0xa678, 0x0804, - 0x1a51, 0xa78c, 0xa690, 0x0804, 0x1a51, 0xa7a4, 0xa6a8, 0x0804, - 0x1a51, 0xa7bc, 0xa6c0, 0x0804, 0x1a51, 0xa7d4, 0xa6d8, 0x0804, - 0x1a51, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0dc5, 0x9082, 0x001b, - 0x0002, 0x19d4, 0x19d4, 0x19d6, 0x19d4, 0x19d4, 0x19d4, 0x19dc, - 0x19d4, 0x19d4, 0x19d4, 0x19e2, 0x19d4, 0x19d4, 0x19d4, 0x19e8, - 0x19d4, 0x19d4, 0x19d4, 0x19ee, 0x19d4, 0x19d4, 0x19d4, 0x19f4, - 0x19d4, 0x19d4, 0x19d4, 0x19fa, 0x080c, 0x0dc5, 0xa574, 0xa478, - 0xa37c, 0xa280, 0x0804, 0x1a51, 0xa584, 0xa488, 0xa38c, 0xa290, - 0x0804, 0x1a51, 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, 0x1a51, - 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x1a51, 0xa5b4, 0xa4b8, - 0xa3bc, 0xa2c0, 0x0804, 0x1a51, 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, - 0x0804, 0x1a51, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, 0x1a51, - 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dc5, 0x9082, 0x001b, 0x0002, - 0x1a23, 0x1a21, 0x1a21, 0x1a21, 0x1a21, 0x1a21, 0x1a2a, 0x1a21, - 0x1a21, 0x1a21, 0x1a21, 0x1a21, 0x1a31, 0x1a21, 0x1a21, 0x1a21, - 0x1a21, 0x1a21, 0x1a38, 0x1a21, 0x1a21, 0x1a21, 0x1a21, 0x1a21, - 0x1a3f, 0x080c, 0x0dc5, 0xa56c, 0xa470, 0xa774, 0xa678, 0xa37c, - 0xa280, 0x0438, 0xa584, 0xa488, 0xa78c, 0xa690, 0xa394, 0xa298, - 0x0400, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0xa3ac, 0xa2b0, 0x00c8, - 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4, 0xa2c8, 0x0090, 0xa5cc, - 0xa4d0, 0xa7d4, 0xa6d8, 0xa3dc, 0xa2e0, 0x0058, 0x9d86, 0x000e, - 0x1130, 0x080c, 0x207f, 0x1904, 0x195a, 0x900e, 0x0050, 0x080c, - 0x0dc5, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0x080c, - 0x207f, 0x0005, 0x6014, 0x2048, 0x6118, 0x81ff, 0x0148, 0x810c, - 0x810c, 0x810c, 0x81ff, 0x1118, 0xa887, 0x0001, 0x0008, 0xa986, - 0x601b, 0x0002, 0xa874, 0x9084, 0x00ff, 0x9084, 0x0008, 0x0150, - 0x00e9, 0x6000, 0x9086, 0x0004, 0x1120, 0x2009, 0x0048, 0x080c, - 0xb352, 0x0005, 0xa974, 0xd1dc, 0x1108, 0x0005, 0xa934, 0xa88c, - 0x9106, 0x1158, 0xa938, 0xa890, 0x9106, 0x1138, 0x601c, 0xc084, - 0x601e, 0x2009, 0x0048, 0x0804, 0xb352, 0x0005, 0x0126, 0x00c6, - 0x2091, 0x2200, 0x00ce, 0x7908, 0x918c, 0x0007, 0x9186, 0x0000, - 0x05b0, 0x9186, 0x0003, 0x0598, 0x6020, 0x6023, 0x0000, 0x0006, - 0x2031, 0x0008, 0x00c6, 0x781f, 0x0808, 0x7808, 0xd09c, 0x0120, - 0x080c, 0x1394, 0x8631, 0x1db8, 0x00ce, 0x781f, 0x0800, 0x2031, - 0x0168, 0x00c6, 0x7808, 0xd09c, 0x190c, 0x1394, 0x00ce, 0x2001, - 0x0038, 0x080c, 0x1b69, 0x7930, 0x9186, 0x0040, 0x0160, 0x9186, - 0x0042, 0x190c, 0x0dc5, 0x2001, 0x001e, 0x8001, 0x1df0, 0x8631, - 0x1d40, 0x080c, 0x1b78, 0x000e, 0x6022, 0x012e, 0x0005, 0x080c, - 0x1b65, 0x7827, 0x0015, 0x7828, 0x9c06, 0x1db8, 0x782b, 0x0000, - 0x0ca0, 0x00f6, 0x2079, 0x0300, 0x7803, 0x0000, 0x78ab, 0x0004, - 0x2001, 0xf000, 0x8001, 0x090c, 0x0dc5, 0x7aac, 0xd2ac, 0x1dd0, - 0x00fe, 0x080c, 0x7637, 0x1188, 0x2001, 0x0138, 0x2003, 0x0000, - 0x2001, 0x0160, 0x2003, 0x0000, 0x2011, 0x012c, 0xa001, 0xa001, - 0x8211, 0x1de0, 0x0059, 0x0804, 0x76e4, 0x0479, 0x0039, 0x2001, - 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x0005, 0x00e6, 0x2071, - 0x0200, 0x080c, 0x2c6d, 0x2009, 0x003c, 0x080c, 0x2409, 0x2001, - 0x015d, 0x2003, 0x0000, 0x7000, 0x9084, 0x003c, 0x1de0, 0x080c, - 0x8725, 0x70a0, 0x70a2, 0x7098, 0x709a, 0x709c, 0x709e, 0x2001, - 0x020d, 0x2003, 0x0020, 0x00f6, 0x2079, 0x0300, 0x080c, 0x1322, - 0x7803, 0x0001, 0x00fe, 0x00ee, 0x0005, 0x2001, 0x0138, 0x2014, - 0x2003, 0x0000, 0x2001, 0x0160, 0x202c, 0x2003, 0x0000, 0x080c, - 0x7637, 0x1108, 0x0005, 0x2021, 0x0260, 0x2001, 0x0141, 0x201c, - 0xd3dc, 0x1168, 0x2001, 0x0109, 0x201c, 0x939c, 0x0048, 0x1160, - 0x2001, 0x0111, 0x201c, 0x83ff, 0x1110, 0x8421, 0x1d70, 0x2001, - 0x015d, 0x2003, 0x0000, 0x0005, 0x0046, 0x2021, 0x0019, 0x2003, - 0x0048, 0xa001, 0xa001, 0x201c, 0x939c, 0x0048, 0x0120, 0x8421, - 0x1db0, 0x004e, 0x0c60, 0x004e, 0x0c40, 0x601c, 0xc084, 0x601e, - 0x0005, 0x2c08, 0x621c, 0x080c, 0x1611, 0x7930, 0x0005, 0x2c08, - 0x621c, 0x080c, 0x16bc, 0x7930, 0x0005, 0x8001, 0x1df0, 0x0005, - 0x2031, 0x0064, 0x781c, 0x9084, 0x0007, 0x0170, 0x2001, 0x0038, - 0x0c41, 0x9186, 0x0040, 0x0904, 0x1bd6, 0x2001, 0x001e, 0x0c69, - 0x8631, 0x1d80, 0x080c, 0x0dc5, 0x781f, 0x0202, 0x2001, 0x015d, - 0x2003, 0x0000, 0x2001, 0x0dac, 0x0c01, 0x781c, 0xd084, 0x0110, - 0x0861, 0x04e0, 0x2001, 0x0030, 0x0891, 0x9186, 0x0040, 0x0568, - 0x781c, 0xd084, 0x1da8, 0x781f, 0x0101, 0x2001, 0x0014, 0x0869, - 0x2001, 0x0037, 0x0821, 0x9186, 0x0040, 0x0140, 0x2001, 0x0030, - 0x080c, 0x1b6f, 0x9186, 0x0040, 0x190c, 0x0dc5, 0x00d6, 0x2069, - 0x0200, 0x692c, 0xd1f4, 0x1170, 0xd1c4, 0x0160, 0xd19c, 0x0130, - 0x6800, 0x9085, 0x1800, 0x6802, 0x00de, 0x0080, 0x6908, 0x9184, - 0x0007, 0x1db0, 0x00de, 0x781f, 0x0100, 0x791c, 0x9184, 0x0007, - 0x090c, 0x0dc5, 0xa001, 0xa001, 0x781f, 0x0200, 0x0005, 0x0126, - 0x2091, 0x2400, 0x2071, 0x1a69, 0x2079, 0x0090, 0x012e, 0x0005, - 0x9280, 0x0005, 0x2004, 0x2048, 0xa97c, 0xd1dc, 0x1904, 0x1c78, - 0xa964, 0x9184, 0x0007, 0x0002, 0x1bf4, 0x1c63, 0x1c0b, 0x1c0d, - 0x1c0b, 0x1c4b, 0x1c2b, 0x1c1a, 0x918c, 0x00ff, 0x9186, 0x0008, - 0x1170, 0xa87c, 0xd0b4, 0x0904, 0x1ea5, 0x9006, 0xa842, 0xa83e, - 0xa988, 0x2900, 0xa85a, 0xa813, 0x20c2, 0x0804, 0x1c74, 0x9186, - 0x0048, 0x0904, 0x1c63, 0x080c, 0x0dc5, 0x9184, 0x00ff, 0x9086, - 0x0013, 0x0904, 0x1c63, 0x9184, 0x00ff, 0x9086, 0x001b, 0x0904, - 0x1c63, 0x0c88, 0xa87c, 0xd0b4, 0x0904, 0x1ea5, 0xa890, 0xa842, - 0xa83a, 0xa88c, 0xa83e, 0xa836, 0xa8ac, 0xa846, 0xa8b0, 0xa84a, - 0xa988, 0x0804, 0x1c6b, 0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, - 0x19d0, 0xa87c, 0xd0b4, 0x0904, 0x1ea5, 0xa890, 0xa842, 0xa83a, - 0xa88c, 0xa83e, 0xa836, 0xa8ac, 0xa846, 0xa8b0, 0xa84a, 0xa804, - 0xa85a, 0x2040, 0xa064, 0x9084, 0x000f, 0x9080, 0x20c7, 0x2005, - 0xa812, 0xa988, 0x0448, 0x918c, 0x00ff, 0x9186, 0x0015, 0x1540, - 0xa87c, 0xd0b4, 0x0904, 0x1ea5, 0xa804, 0xa85a, 0x2040, 0xa064, - 0x9084, 0x000f, 0x9080, 0x20c7, 0x2005, 0xa812, 0xa988, 0x9006, - 0xa842, 0xa83e, 0x0088, 0xa87c, 0xd0b4, 0x0904, 0x1ea5, 0xa988, - 0x9006, 0xa842, 0xa83e, 0x2900, 0xa85a, 0xa864, 0x9084, 0x000f, - 0x9080, 0x20c7, 0x2005, 0xa812, 0xa916, 0xa87c, 0xc0dd, 0xa87e, - 0x0005, 0x00f6, 0x2079, 0x0090, 0x782c, 0xd0fc, 0x190c, 0x1eeb, - 0x00e6, 0x2071, 0x1a69, 0x7000, 0x9005, 0x1904, 0x1cdf, 0x7206, - 0x9280, 0x0005, 0x204c, 0x9280, 0x0004, 0x2004, 0x782b, 0x0004, - 0x00f6, 0x2079, 0x0200, 0x7803, 0x0040, 0x00fe, 0x00b6, 0x2058, - 0xb86c, 0x7836, 0xb890, 0x00be, 0x00f6, 0x2079, 0x0200, 0x7803, - 0x0040, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x781a, - 0x78d7, 0x0000, 0x00fe, 0xa814, 0x2050, 0xa858, 0x2040, 0xa810, - 0x2060, 0xa064, 0x90ec, 0x000f, 0xa944, 0x791a, 0x7116, 0xa848, - 0x781e, 0x701a, 0x9006, 0x700e, 0x7012, 0x7004, 0xa940, 0xa838, - 0x9106, 0x1500, 0xa93c, 0xa834, 0x9106, 0x11e0, 0x0006, 0x0016, - 0xa938, 0xa834, 0x9105, 0x0118, 0x001e, 0x000e, 0x0098, 0x001e, - 0x000e, 0x8aff, 0x01c8, 0x0126, 0x2091, 0x8000, 0x2009, 0x0306, - 0x200b, 0x0808, 0x00d9, 0x0108, 0x00c9, 0x012e, 0x9006, 0x00ee, - 0x00fe, 0x0005, 0x0036, 0x0046, 0xab38, 0xac34, 0x080c, 0x20e7, - 0x004e, 0x003e, 0x0d30, 0x0c98, 0x9085, 0x0001, 0x0c80, 0x2009, - 0x0306, 0x200b, 0x4800, 0x7027, 0x0000, 0x0005, 0x0076, 0x0066, - 0x0056, 0x0046, 0x0036, 0x0026, 0x8aff, 0x0904, 0x1e9e, 0x700c, - 0x7214, 0x923a, 0x7010, 0x7218, 0x9203, 0x0a04, 0x1e9d, 0x9705, - 0x0904, 0x1e9d, 0x903e, 0x2730, 0xa880, 0xd0fc, 0x1190, 0x2d00, - 0x0002, 0x1e22, 0x1d61, 0x1d61, 0x1e22, 0x1e22, 0x1dff, 0x1e22, - 0x1d61, 0x1e06, 0x1db0, 0x1db0, 0x1e22, 0x1e22, 0x1e22, 0x1df9, - 0x1db0, 0xc0fc, 0xa882, 0xab2c, 0xaa30, 0xad1c, 0xac20, 0xdd9c, - 0x0904, 0x1e2f, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dc5, 0x9082, - 0x001b, 0x0002, 0x1d4d, 0x1d4b, 0x1d4b, 0x1d4b, 0x1d4b, 0x1d4b, - 0x1d51, 0x1d4b, 0x1d4b, 0x1d4b, 0x1d4b, 0x1d4b, 0x1d55, 0x1d4b, - 0x1d4b, 0x1d4b, 0x1d4b, 0x1d4b, 0x1d59, 0x1d4b, 0x1d4b, 0x1d4b, - 0x1d4b, 0x1d4b, 0x1d5d, 0x080c, 0x0dc5, 0xa774, 0xa678, 0x0804, - 0x1e2f, 0xa78c, 0xa690, 0x0804, 0x1e2f, 0xa7a4, 0xa6a8, 0x0804, - 0x1e2f, 0xa7bc, 0xa6c0, 0x0804, 0x1e2f, 0xa7d4, 0xa6d8, 0x0804, - 0x1e2f, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0dc5, 0x9082, 0x001b, - 0x0002, 0x1d84, 0x1d84, 0x1d86, 0x1d84, 0x1d84, 0x1d84, 0x1d8c, - 0x1d84, 0x1d84, 0x1d84, 0x1d92, 0x1d84, 0x1d84, 0x1d84, 0x1d98, - 0x1d84, 0x1d84, 0x1d84, 0x1d9e, 0x1d84, 0x1d84, 0x1d84, 0x1da4, - 0x1d84, 0x1d84, 0x1d84, 0x1daa, 0x080c, 0x0dc5, 0xa574, 0xa478, - 0xa37c, 0xa280, 0x0804, 0x1e2f, 0xa584, 0xa488, 0xa38c, 0xa290, - 0x0804, 0x1e2f, 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, 0x1e2f, - 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x1e2f, 0xa5b4, 0xa4b8, - 0xa3bc, 0xa2c0, 0x0804, 0x1e2f, 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, - 0x0804, 0x1e2f, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, 0x1e2f, - 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dc5, 0x9082, 0x001b, 0x0002, - 0x1dd3, 0x1dd1, 0x1dd1, 0x1dd1, 0x1dd1, 0x1dd1, 0x1ddb, 0x1dd1, - 0x1dd1, 0x1dd1, 0x1dd1, 0x1dd1, 0x1de3, 0x1dd1, 0x1dd1, 0x1dd1, - 0x1dd1, 0x1dd1, 0x1deb, 0x1dd1, 0x1dd1, 0x1dd1, 0x1dd1, 0x1dd1, - 0x1df2, 0x080c, 0x0dc5, 0xa56c, 0xa470, 0xa774, 0xa678, 0xa37c, - 0xa280, 0x0804, 0x1e2f, 0xa584, 0xa488, 0xa78c, 0xa690, 0xa394, - 0xa298, 0x0804, 0x1e2f, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0xa3ac, - 0xa2b0, 0x0804, 0x1e2f, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4, - 0xa2c8, 0x04e8, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0xa3dc, 0xa2e0, - 0x04b0, 0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x1518, 0x080c, - 0x207f, 0x1904, 0x1cfc, 0x900e, 0x0804, 0x1e9e, 0xab64, 0x939c, - 0x00ff, 0x9386, 0x0048, 0x1180, 0x00c6, 0x7004, 0x2060, 0x6004, - 0x9086, 0x0043, 0x00ce, 0x0904, 0x1db0, 0xab9c, 0x9016, 0xad8c, - 0xac90, 0xaf94, 0xae98, 0x0098, 0x9386, 0x0008, 0x0904, 0x1db0, - 0x080c, 0x0dc5, 0xa964, 0x918c, 0x00ff, 0x9186, 0x0013, 0x0904, - 0x1d61, 0x9186, 0x001b, 0x0904, 0x1db0, 0x080c, 0x0dc5, 0x2009, - 0x030f, 0x2104, 0xd0fc, 0x0538, 0x0066, 0x2009, 0x0306, 0x2134, - 0x200b, 0x4000, 0x2104, 0x9084, 0x0030, 0x15b8, 0x2031, 0x1000, - 0x2600, 0x9302, 0x928b, 0x0000, 0xa82e, 0xa932, 0x0278, 0x9105, - 0x0168, 0x2011, 0x0000, 0x2618, 0x2600, 0x9500, 0xa81e, 0x9481, - 0x0000, 0xa822, 0xa880, 0xc0fd, 0xa882, 0x0020, 0xa82f, 0x0000, - 0xa833, 0x0000, 0x006e, 0x7b12, 0x7a16, 0x7d02, 0x7c06, 0x7f0a, - 0x7e0e, 0x782b, 0x0001, 0x7000, 0x8000, 0x7002, 0xa83c, 0x9300, - 0xa83e, 0xa840, 0x9201, 0xa842, 0x700c, 0x9300, 0x700e, 0x7010, - 0x9201, 0x7012, 0x080c, 0x207f, 0x0448, 0xd6b4, 0x0110, 0x200b, - 0x4040, 0x2031, 0x0080, 0x9584, 0x007f, 0x0108, 0x9632, 0x7124, - 0x7000, 0x9086, 0x0000, 0x1198, 0xc185, 0x7126, 0x2009, 0x0306, - 0x2104, 0xd0b4, 0x1904, 0x1e40, 0x200b, 0x4040, 0x2009, 0x1a83, - 0x2104, 0x8000, 0x0a04, 0x1e40, 0x200a, 0x0804, 0x1e40, 0xc18d, - 0x7126, 0xd184, 0x1d58, 0x0804, 0x1e40, 0x9006, 0x002e, 0x003e, - 0x004e, 0x005e, 0x006e, 0x007e, 0x0005, 0x080c, 0x0dc5, 0x0026, - 0x2001, 0x0105, 0x2003, 0x0010, 0x782b, 0x0004, 0x7003, 0x0000, - 0x7004, 0x2060, 0x6014, 0x2048, 0x080c, 0xd0d8, 0x0118, 0xa880, - 0xc0bd, 0xa882, 0x782c, 0xd0ac, 0x1de8, 0x080c, 0x1cef, 0x6020, - 0x9086, 0x0006, 0x1180, 0x2061, 0x0100, 0x62c8, 0x2001, 0x00fa, - 0x8001, 0x1df0, 0x60c8, 0x9206, 0x1dc0, 0x60c4, 0xa89a, 0x60c8, - 0xa896, 0x7004, 0x2060, 0x00c6, 0x080c, 0xccf3, 0x00ce, 0x2001, - 0x19f7, 0x2004, 0x9c06, 0x1160, 0x2009, 0x0040, 0x080c, 0x2409, - 0x080c, 0xac2b, 0x2011, 0x0000, 0x080c, 0xaac9, 0x080c, 0x9bd3, - 0x002e, 0x0804, 0x202f, 0x0126, 0x2091, 0x2400, 0xa858, 0x2040, - 0x792c, 0x782b, 0x0002, 0x9184, 0x0700, 0x1904, 0x1ea7, 0x7000, - 0x0002, 0x202f, 0x1efd, 0x1f7d, 0x202d, 0x8001, 0x7002, 0x7027, - 0x0000, 0xd19c, 0x1158, 0x8aff, 0x0904, 0x1f4a, 0x080c, 0x1cf6, - 0x0904, 0x202f, 0x080c, 0x1cf6, 0x0804, 0x202f, 0x782b, 0x0004, - 0xd194, 0x0148, 0xa880, 0xc0fc, 0xa882, 0x8aff, 0x1518, 0xa87c, - 0xc0f5, 0xa87e, 0x00f8, 0x0026, 0x0036, 0xab3c, 0xaa40, 0x0016, - 0x7910, 0xa82c, 0x9100, 0xa82e, 0x7914, 0xa830, 0x9101, 0xa832, - 0x001e, 0x7810, 0x931a, 0x7814, 0x9213, 0x7800, 0xa81e, 0x7804, - 0xa822, 0xab3e, 0xaa42, 0x003e, 0x002e, 0x080c, 0x209a, 0xa880, - 0xc0fd, 0xa882, 0x2a00, 0xa816, 0x2800, 0xa85a, 0x2c00, 0xa812, - 0x7003, 0x0000, 0x2009, 0x0306, 0x200b, 0x4800, 0x7027, 0x0000, - 0x0804, 0x202f, 0x00f6, 0x0026, 0x781c, 0x0006, 0x7818, 0x0006, - 0x2079, 0x0100, 0x7a14, 0x9284, 0x1984, 0x9085, 0x0012, 0x7816, - 0x0036, 0x2019, 0x1000, 0x8319, 0x090c, 0x0dc5, 0x7820, 0xd0bc, - 0x1dd0, 0x003e, 0x79c8, 0x000e, 0x9102, 0x001e, 0x0006, 0x0016, - 0x79c4, 0x000e, 0x9103, 0x78c6, 0x000e, 0x78ca, 0x9284, 0x1984, - 0x9085, 0x0012, 0x7816, 0x002e, 0x00fe, 0x782b, 0x0008, 0x7003, - 0x0000, 0x080c, 0x1cef, 0x0804, 0x202f, 0x8001, 0x7002, 0x7024, - 0x8004, 0x7026, 0xd194, 0x0170, 0x782c, 0xd0fc, 0x1904, 0x1ef0, - 0xd19c, 0x1904, 0x202b, 0x8aff, 0x0904, 0x202f, 0x080c, 0x1cf6, - 0x0804, 0x202f, 0x0026, 0x0036, 0xab3c, 0xaa40, 0x080c, 0x209a, - 0xdd9c, 0x1904, 0x1fea, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0dc5, - 0x9082, 0x001b, 0x0002, 0x1fbe, 0x1fbe, 0x1fc0, 0x1fbe, 0x1fbe, - 0x1fbe, 0x1fc6, 0x1fbe, 0x1fbe, 0x1fbe, 0x1fcc, 0x1fbe, 0x1fbe, - 0x1fbe, 0x1fd2, 0x1fbe, 0x1fbe, 0x1fbe, 0x1fd8, 0x1fbe, 0x1fbe, - 0x1fbe, 0x1fde, 0x1fbe, 0x1fbe, 0x1fbe, 0x1fe4, 0x080c, 0x0dc5, - 0xa07c, 0x931a, 0xa080, 0x9213, 0x0804, 0x1f1f, 0xa08c, 0x931a, - 0xa090, 0x9213, 0x0804, 0x1f1f, 0xa09c, 0x931a, 0xa0a0, 0x9213, - 0x0804, 0x1f1f, 0xa0ac, 0x931a, 0xa0b0, 0x9213, 0x0804, 0x1f1f, - 0xa0bc, 0x931a, 0xa0c0, 0x9213, 0x0804, 0x1f1f, 0xa0cc, 0x931a, - 0xa0d0, 0x9213, 0x0804, 0x1f1f, 0xa0dc, 0x931a, 0xa0e0, 0x9213, - 0x0804, 0x1f1f, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dc5, 0x9082, - 0x001b, 0x0002, 0x200d, 0x200b, 0x200b, 0x200b, 0x200b, 0x200b, - 0x2013, 0x200b, 0x200b, 0x200b, 0x200b, 0x200b, 0x2019, 0x200b, - 0x200b, 0x200b, 0x200b, 0x200b, 0x201f, 0x200b, 0x200b, 0x200b, - 0x200b, 0x200b, 0x2025, 0x080c, 0x0dc5, 0xa07c, 0x931a, 0xa080, - 0x9213, 0x0804, 0x1f1f, 0xa094, 0x931a, 0xa098, 0x9213, 0x0804, - 0x1f1f, 0xa0ac, 0x931a, 0xa0b0, 0x9213, 0x0804, 0x1f1f, 0xa0c4, - 0x931a, 0xa0c8, 0x9213, 0x0804, 0x1f1f, 0xa0dc, 0x931a, 0xa0e0, - 0x9213, 0x0804, 0x1f1f, 0x0804, 0x1f1b, 0x080c, 0x0dc5, 0x012e, - 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a69, 0x7000, 0x9086, 0x0000, - 0x0904, 0x207a, 0x2079, 0x0090, 0x2009, 0x0207, 0x210c, 0xd194, - 0x01b8, 0x2009, 0x020c, 0x210c, 0x9184, 0x0003, 0x0188, 0x080c, - 0xf0a0, 0x2001, 0x0133, 0x2004, 0x9005, 0x090c, 0x0dc5, 0x0016, - 0x2009, 0x0040, 0x080c, 0x2409, 0x001e, 0x2001, 0x020c, 0x2102, - 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, 0x1120, - 0x2009, 0x0040, 0x080c, 0x2409, 0x782c, 0xd0fc, 0x09a8, 0x080c, - 0x1eeb, 0x7000, 0x9086, 0x0000, 0x1978, 0x782b, 0x0004, 0x782c, - 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, 0x2409, 0x782b, 0x0002, - 0x7003, 0x0000, 0x080c, 0x1cef, 0x00ee, 0x00fe, 0x0005, 0xa880, - 0xd0fc, 0x11a8, 0x8c60, 0x2c05, 0x9005, 0x0110, 0x8a51, 0x0005, - 0xa004, 0x9005, 0x0168, 0xa85a, 0x2040, 0xa064, 0x9084, 0x000f, - 0x9080, 0x20c7, 0x2065, 0x8cff, 0x090c, 0x0dc5, 0x8a51, 0x0005, - 0x2050, 0x0005, 0xa880, 0xd0fc, 0x11b8, 0x8a50, 0x8c61, 0x2c05, - 0x9005, 0x1190, 0x2800, 0x9906, 0x0120, 0xa000, 0x9005, 0x1108, - 0x2900, 0x2040, 0xa85a, 0xa064, 0x9084, 0x000f, 0x9080, 0x20d7, - 0x2065, 0x8cff, 0x090c, 0x0dc5, 0x0005, 0x0000, 0x001d, 0x0021, - 0x0025, 0x0029, 0x002d, 0x0031, 0x0035, 0x0000, 0x001b, 0x0021, - 0x0027, 0x002d, 0x0033, 0x0000, 0x0000, 0x0023, 0x0000, 0x0000, - 0x20ba, 0x20b6, 0x20ba, 0x20ba, 0x20c4, 0x0000, 0x20ba, 0x20c1, - 0x20c1, 0x20be, 0x20c1, 0x20c1, 0x0000, 0x20c4, 0x20c1, 0x0000, - 0x20bc, 0x20bc, 0x0000, 0x20bc, 0x20c4, 0x0000, 0x20bc, 0x20c2, - 0x20c2, 0x20c2, 0x0000, 0x20c2, 0x0000, 0x20c4, 0x20c2, 0x00c6, - 0x00d6, 0x0086, 0xab42, 0xac3e, 0xa888, 0x9055, 0x0904, 0x22c6, - 0x2940, 0xa064, 0x90ec, 0x000f, 0x9084, 0x00ff, 0x9086, 0x0008, - 0x1118, 0x2061, 0x20c2, 0x00d0, 0x9de0, 0x20c7, 0x9d86, 0x0007, - 0x0130, 0x9d86, 0x000e, 0x0118, 0x9d86, 0x000f, 0x1120, 0xa08c, - 0x9422, 0xa090, 0x931b, 0x2c05, 0x9065, 0x1140, 0x0310, 0x0804, - 0x22c6, 0xa004, 0x9045, 0x0904, 0x22c6, 0x08d8, 0x2c05, 0x9005, - 0x0904, 0x21ae, 0xdd9c, 0x1904, 0x216a, 0x908a, 0x0036, 0x1a0c, - 0x0dc5, 0x9082, 0x001b, 0x0002, 0x213f, 0x213f, 0x2141, 0x213f, - 0x213f, 0x213f, 0x2147, 0x213f, 0x213f, 0x213f, 0x214d, 0x213f, - 0x213f, 0x213f, 0x2153, 0x213f, 0x213f, 0x213f, 0x2159, 0x213f, - 0x213f, 0x213f, 0x215f, 0x213f, 0x213f, 0x213f, 0x2165, 0x080c, - 0x0dc5, 0xa07c, 0x9422, 0xa080, 0x931b, 0x0804, 0x21a4, 0xa08c, - 0x9422, 0xa090, 0x931b, 0x0804, 0x21a4, 0xa09c, 0x9422, 0xa0a0, - 0x931b, 0x0804, 0x21a4, 0xa0ac, 0x9422, 0xa0b0, 0x931b, 0x0804, - 0x21a4, 0xa0bc, 0x9422, 0xa0c0, 0x931b, 0x0804, 0x21a4, 0xa0cc, - 0x9422, 0xa0d0, 0x931b, 0x0804, 0x21a4, 0xa0dc, 0x9422, 0xa0e0, - 0x931b, 0x04d0, 0x908a, 0x0034, 0x1a0c, 0x0dc5, 0x9082, 0x001b, - 0x0002, 0x218c, 0x218a, 0x218a, 0x218a, 0x218a, 0x218a, 0x2191, - 0x218a, 0x218a, 0x218a, 0x218a, 0x218a, 0x2196, 0x218a, 0x218a, - 0x218a, 0x218a, 0x218a, 0x219b, 0x218a, 0x218a, 0x218a, 0x218a, - 0x218a, 0x21a0, 0x080c, 0x0dc5, 0xa07c, 0x9422, 0xa080, 0x931b, - 0x0098, 0xa094, 0x9422, 0xa098, 0x931b, 0x0070, 0xa0ac, 0x9422, - 0xa0b0, 0x931b, 0x0048, 0xa0c4, 0x9422, 0xa0c8, 0x931b, 0x0020, - 0xa0dc, 0x9422, 0xa0e0, 0x931b, 0x0630, 0x2300, 0x9405, 0x0160, - 0x8a51, 0x0904, 0x22c6, 0x8c60, 0x0804, 0x2116, 0xa004, 0x9045, - 0x0904, 0x22c6, 0x0804, 0x20f1, 0x8a51, 0x0904, 0x22c6, 0x8c60, - 0x2c05, 0x9005, 0x1158, 0xa004, 0x9045, 0x0904, 0x22c6, 0xa064, - 0x90ec, 0x000f, 0x9de0, 0x20c7, 0x2c05, 0x2060, 0xa880, 0xc0fc, - 0xa882, 0x0804, 0x22bb, 0x2c05, 0x8422, 0x8420, 0x831a, 0x9399, - 0x0000, 0xac2e, 0xab32, 0xdd9c, 0x1904, 0x2258, 0x9082, 0x001b, - 0x0002, 0x21f4, 0x21f4, 0x21f6, 0x21f4, 0x21f4, 0x21f4, 0x2204, - 0x21f4, 0x21f4, 0x21f4, 0x2212, 0x21f4, 0x21f4, 0x21f4, 0x2220, - 0x21f4, 0x21f4, 0x21f4, 0x222e, 0x21f4, 0x21f4, 0x21f4, 0x223c, - 0x21f4, 0x21f4, 0x21f4, 0x224a, 0x080c, 0x0dc5, 0xa17c, 0x2400, - 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0dc5, 0xa074, 0x9420, - 0xa078, 0x9319, 0x0804, 0x22b6, 0xa18c, 0x2400, 0x9122, 0xa190, - 0x2300, 0x911b, 0x0a0c, 0x0dc5, 0xa084, 0x9420, 0xa088, 0x9319, - 0x0804, 0x22b6, 0xa19c, 0x2400, 0x9122, 0xa1a0, 0x2300, 0x911b, - 0x0a0c, 0x0dc5, 0xa094, 0x9420, 0xa098, 0x9319, 0x0804, 0x22b6, - 0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, 0x0dc5, - 0xa0a4, 0x9420, 0xa0a8, 0x9319, 0x0804, 0x22b6, 0xa1bc, 0x2400, - 0x9122, 0xa1c0, 0x2300, 0x911b, 0x0a0c, 0x0dc5, 0xa0b4, 0x9420, - 0xa0b8, 0x9319, 0x0804, 0x22b6, 0xa1cc, 0x2400, 0x9122, 0xa1d0, - 0x2300, 0x911b, 0x0a0c, 0x0dc5, 0xa0c4, 0x9420, 0xa0c8, 0x9319, - 0x0804, 0x22b6, 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, 0x911b, - 0x0a0c, 0x0dc5, 0xa0d4, 0x9420, 0xa0d8, 0x9319, 0x0804, 0x22b6, - 0x9082, 0x001b, 0x0002, 0x2276, 0x2274, 0x2274, 0x2274, 0x2274, - 0x2274, 0x2283, 0x2274, 0x2274, 0x2274, 0x2274, 0x2274, 0x2290, - 0x2274, 0x2274, 0x2274, 0x2274, 0x2274, 0x229d, 0x2274, 0x2274, - 0x2274, 0x2274, 0x2274, 0x22aa, 0x080c, 0x0dc5, 0xa17c, 0x2400, - 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0dc5, 0xa06c, 0x9420, - 0xa070, 0x9319, 0x0498, 0xa194, 0x2400, 0x9122, 0xa198, 0x2300, - 0x911b, 0x0a0c, 0x0dc5, 0xa084, 0x9420, 0xa088, 0x9319, 0x0430, - 0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, 0x0dc5, - 0xa09c, 0x9420, 0xa0a0, 0x9319, 0x00c8, 0xa1c4, 0x2400, 0x9122, - 0xa1c8, 0x2300, 0x911b, 0x0a0c, 0x0dc5, 0xa0b4, 0x9420, 0xa0b8, - 0x9319, 0x0060, 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, 0x911b, - 0x0a0c, 0x0dc5, 0xa0cc, 0x9420, 0xa0d0, 0x9319, 0xac1e, 0xab22, - 0xa880, 0xc0fd, 0xa882, 0x2800, 0xa85a, 0x2c00, 0xa812, 0x2a00, - 0xa816, 0x000e, 0x000e, 0x000e, 0x9006, 0x0028, 0x008e, 0x00de, - 0x00ce, 0x9085, 0x0001, 0x0005, 0x2001, 0x0005, 0x2004, 0xd0bc, - 0x190c, 0x0dbe, 0x9084, 0x0007, 0x0002, 0x22e7, 0x1eeb, 0x22e7, - 0x22dd, 0x22e0, 0x22e3, 0x22e0, 0x22e3, 0x080c, 0x1eeb, 0x0005, - 0x080c, 0x11b2, 0x0005, 0x080c, 0x1eeb, 0x080c, 0x11b2, 0x0005, - 0x0126, 0x2091, 0x2600, 0x2079, 0x0200, 0x2071, 0x0260, 0x2069, - 0x1800, 0x7817, 0x0000, 0x789b, 0x0814, 0x78a3, 0x0406, 0x789f, - 0x0410, 0x2009, 0x013b, 0x200b, 0x0400, 0x781b, 0x0002, 0x783b, - 0x001f, 0x7837, 0x0020, 0x7803, 0x1600, 0x012e, 0x0005, 0x2091, - 0x2600, 0x781c, 0xd0a4, 0x190c, 0x2406, 0x7900, 0xd1dc, 0x1118, - 0x9084, 0x0006, 0x001a, 0x9084, 0x000e, 0x0002, 0x232e, 0x2326, - 0x8081, 0x2326, 0x2328, 0x2328, 0x2328, 0x2328, 0x8067, 0x2326, - 0x232a, 0x2326, 0x2328, 0x2326, 0x2328, 0x2326, 0x080c, 0x0dc5, - 0x0031, 0x0020, 0x080c, 0x8067, 0x080c, 0x8081, 0x0005, 0x0006, - 0x0016, 0x0026, 0x080c, 0xf0a0, 0x7930, 0x9184, 0x0003, 0x01c0, - 0x2001, 0x19f7, 0x2004, 0x9005, 0x0170, 0x2001, 0x0133, 0x2004, - 0x9005, 0x090c, 0x0dc5, 0x00c6, 0x2001, 0x19f7, 0x2064, 0x080c, - 0xccf3, 0x00ce, 0x00f8, 0x2009, 0x0040, 0x080c, 0x2409, 0x00d0, - 0x9184, 0x0014, 0x01a0, 0x6a00, 0x9286, 0x0003, 0x0160, 0x080c, - 0x7637, 0x1138, 0x080c, 0x7932, 0x080c, 0x612e, 0x080c, 0x7563, - 0x0010, 0x080c, 0x5fed, 0x080c, 0x8130, 0x0041, 0x0018, 0x9184, - 0x9540, 0x1dc8, 0x002e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x0036, - 0x0046, 0x0056, 0x2071, 0x1a65, 0x080c, 0x1ad9, 0x005e, 0x004e, - 0x003e, 0x00ee, 0x0005, 0x0126, 0x2091, 0x2e00, 0x2071, 0x1800, - 0x7128, 0x2001, 0x196f, 0x2102, 0x2001, 0x1977, 0x2102, 0x2001, - 0x013b, 0x2102, 0x2079, 0x0200, 0x2001, 0x0201, 0x789e, 0x78a3, - 0x0200, 0x9198, 0x0007, 0x831c, 0x831c, 0x831c, 0x9398, 0x0005, - 0x2320, 0x9182, 0x0204, 0x1230, 0x2011, 0x0008, 0x8423, 0x8423, - 0x8423, 0x0488, 0x9182, 0x024c, 0x1240, 0x2011, 0x0007, 0x8403, - 0x8003, 0x9400, 0x9400, 0x9420, 0x0430, 0x9182, 0x02bc, 0x1238, - 0x2011, 0x0006, 0x8403, 0x8003, 0x9400, 0x9420, 0x00e0, 0x9182, - 0x034c, 0x1230, 0x2011, 0x0005, 0x8403, 0x8003, 0x9420, 0x0098, - 0x9182, 0x042c, 0x1228, 0x2011, 0x0004, 0x8423, 0x8423, 0x0058, - 0x9182, 0x059c, 0x1228, 0x2011, 0x0003, 0x8403, 0x9420, 0x0018, - 0x2011, 0x0002, 0x8423, 0x9482, 0x0228, 0x8002, 0x8020, 0x8301, - 0x9402, 0x0110, 0x0208, 0x8321, 0x8217, 0x8203, 0x9405, 0x789a, - 0x012e, 0x0005, 0x0006, 0x00d6, 0x2069, 0x0200, 0x6814, 0x9084, - 0xffc0, 0x910d, 0x6916, 0x00de, 0x000e, 0x0005, 0x00d6, 0x2069, - 0x0200, 0x9005, 0x6810, 0x0110, 0xc0a5, 0x0008, 0xc0a4, 0x6812, - 0x00de, 0x0005, 0x0006, 0x00d6, 0x2069, 0x0200, 0x6810, 0x9084, - 0xfff8, 0x910d, 0x6912, 0x00de, 0x000e, 0x0005, 0x7938, 0x080c, - 0x0dbe, 0x00f6, 0x2079, 0x0200, 0x7902, 0xa001, 0xa001, 0xa001, - 0xa001, 0xa001, 0xa001, 0x7902, 0xa001, 0xa001, 0xa001, 0xa001, - 0xa001, 0xa001, 0x00fe, 0x0005, 0x0126, 0x2091, 0x2800, 0x2061, - 0x0100, 0x2071, 0x1800, 0x2009, 0x0000, 0x080c, 0x2c67, 0x080c, - 0x2b82, 0x6054, 0x8004, 0x8004, 0x8004, 0x8004, 0x9084, 0x000c, - 0x6150, 0x918c, 0xfff3, 0x9105, 0x6052, 0x6050, 0x9084, 0xb17f, - 0x9085, 0x2000, 0x6052, 0x2009, 0x199d, 0x2011, 0x199e, 0x6358, - 0x939c, 0x38f0, 0x2320, 0x080c, 0x2bc6, 0x1238, 0x939d, 0x4003, - 0x94a5, 0x8603, 0x230a, 0x2412, 0x0030, 0x939d, 0x0203, 0x94a5, - 0x8603, 0x230a, 0x2412, 0x9006, 0x080c, 0x2bb1, 0x9006, 0x080c, - 0x2b94, 0x20a9, 0x0012, 0x1d04, 0x245b, 0x2091, 0x6000, 0x1f04, - 0x245b, 0x602f, 0x0100, 0x602f, 0x0000, 0x6050, 0x9085, 0x0400, - 0x9084, 0xdfff, 0x6052, 0x6024, 0x6026, 0x080c, 0x28ac, 0x2009, - 0x00ef, 0x6132, 0x6136, 0x080c, 0x28bc, 0x60e7, 0x0000, 0x61ea, - 0x2001, 0x180d, 0x2004, 0xd08c, 0x2001, 0x0002, 0x1110, 0x2001, - 0x0008, 0x60e2, 0x604b, 0xf7f7, 0x6043, 0x0000, 0x602f, 0x0080, - 0x602f, 0x0000, 0x6007, 0x349f, 0x60bb, 0x0000, 0x20a9, 0x0018, - 0x60bf, 0x0000, 0x1f04, 0x2490, 0x60bb, 0x0000, 0x60bf, 0x0108, - 0x60bf, 0x0012, 0x60bf, 0x0405, 0x60bf, 0x0014, 0x60bf, 0x0320, - 0x60bf, 0x0018, 0x601b, 0x00f0, 0x601f, 0x001e, 0x600f, 0x006b, - 0x602b, 0x402f, 0x012e, 0x0005, 0x00f6, 0x2079, 0x0140, 0x78c3, - 0x0080, 0x78c3, 0x0083, 0x78c3, 0x0000, 0x00fe, 0x0005, 0x2001, - 0x1835, 0x2003, 0x0000, 0x2001, 0x1834, 0x2003, 0x0001, 0x0005, - 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x6124, 0x0066, - 0x2031, 0x1837, 0x2634, 0x96b4, 0x0028, 0x006e, 0x1138, 0x6020, - 0xd1bc, 0x0120, 0xd0bc, 0x1168, 0xd0b4, 0x1198, 0x9184, 0x5e2c, - 0x1118, 0x9184, 0x0007, 0x00aa, 0x9195, 0x0004, 0x9284, 0x0007, - 0x0082, 0x0016, 0x2001, 0x188b, 0x200c, 0xd184, 0x001e, 0x0d70, - 0x0c98, 0x0016, 0x2001, 0x188b, 0x200c, 0xd194, 0x001e, 0x0d30, - 0x0c58, 0x2513, 0x24f9, 0x24fc, 0x24ff, 0x2504, 0x2506, 0x250a, - 0x250e, 0x080c, 0x93e2, 0x00b8, 0x080c, 0x94b1, 0x00a0, 0x080c, - 0x94b1, 0x080c, 0x93e2, 0x0078, 0x0099, 0x0068, 0x080c, 0x93e2, - 0x0079, 0x0048, 0x080c, 0x94b1, 0x0059, 0x0028, 0x080c, 0x94b1, - 0x080c, 0x93e2, 0x0029, 0x002e, 0x001e, 0x000e, 0x012e, 0x0005, - 0x00a6, 0x6124, 0x6028, 0xd09c, 0x0118, 0xd19c, 0x1904, 0x2784, - 0xd1f4, 0x190c, 0x0dbe, 0x080c, 0x7637, 0x0904, 0x256e, 0x080c, - 0xd7e3, 0x1120, 0x7000, 0x9086, 0x0003, 0x0570, 0x6024, 0x9084, - 0x1800, 0x0550, 0x080c, 0x765a, 0x0118, 0x080c, 0x7648, 0x1520, - 0x6027, 0x0020, 0x6043, 0x0000, 0x080c, 0xd7e3, 0x0168, 0x080c, - 0x765a, 0x1150, 0x2001, 0x19a8, 0x2003, 0x0001, 0x6027, 0x1800, - 0x080c, 0x74b2, 0x0804, 0x2787, 0x70a4, 0x9005, 0x1150, 0x70a7, - 0x0001, 0x00d6, 0x2069, 0x0140, 0x080c, 0x768b, 0x00de, 0x1904, - 0x2787, 0x080c, 0x793c, 0x0428, 0x080c, 0x765a, 0x1590, 0x6024, - 0x9084, 0x1800, 0x1108, 0x0468, 0x080c, 0x793c, 0x080c, 0x7932, - 0x080c, 0x612e, 0x080c, 0x7563, 0x0804, 0x2784, 0xd1ac, 0x1508, - 0x6024, 0xd0dc, 0x1170, 0xd0e4, 0x1178, 0xd0d4, 0x1190, 0xd0cc, - 0x0130, 0x7098, 0x9086, 0x0029, 0x1110, 0x080c, 0x7818, 0x0804, - 0x2784, 0x080c, 0x7937, 0x0048, 0x2001, 0x197d, 0x2003, 0x0002, - 0x0020, 0x080c, 0x7774, 0x0804, 0x2784, 0x080c, 0x78ba, 0x0804, - 0x2784, 0x6220, 0xd1bc, 0x0138, 0xd2bc, 0x1904, 0x27e1, 0xd2b4, - 0x1904, 0x27f4, 0x0000, 0xd1ac, 0x0904, 0x2699, 0x0036, 0x6328, - 0xc3bc, 0x632a, 0x003e, 0x080c, 0x7637, 0x11c0, 0x6027, 0x0020, - 0x0006, 0x0026, 0x0036, 0x080c, 0x7651, 0x1158, 0x080c, 0x7932, - 0x080c, 0x612e, 0x080c, 0x7563, 0x003e, 0x002e, 0x000e, 0x00ae, - 0x0005, 0x003e, 0x002e, 0x000e, 0x080c, 0x760f, 0x0016, 0x0046, - 0x00c6, 0x644c, 0x9486, 0xf0f0, 0x1138, 0x2061, 0x0100, 0x644a, - 0x6043, 0x0090, 0x6043, 0x0010, 0x74da, 0x948c, 0xff00, 0x7038, - 0xd084, 0x0190, 0x080c, 0xd7e3, 0x1118, 0x9186, 0xf800, 0x1160, - 0x7048, 0xd084, 0x1148, 0xc085, 0x704a, 0x0036, 0x2418, 0x2011, - 0x8016, 0x080c, 0x4c44, 0x003e, 0x080c, 0xd7dc, 0x1904, 0x2676, - 0x9196, 0xff00, 0x05a8, 0x7060, 0x9084, 0x00ff, 0x810f, 0x81ff, - 0x0110, 0x9116, 0x0568, 0x7130, 0xd184, 0x1550, 0x080c, 0x33aa, - 0x0128, 0xc18d, 0x7132, 0x080c, 0x6a9b, 0x1510, 0x6240, 0x9294, - 0x0010, 0x0130, 0x6248, 0x9294, 0xff00, 0x9296, 0xff00, 0x01c0, - 0x7030, 0xd08c, 0x0904, 0x2676, 0x7038, 0xd08c, 0x1140, 0x2001, - 0x180c, 0x200c, 0xd1ac, 0x1904, 0x2676, 0xc1ad, 0x2102, 0x0036, - 0x73d8, 0x2011, 0x8013, 0x080c, 0x4c44, 0x003e, 0x0804, 0x2676, - 0x7038, 0xd08c, 0x1140, 0x2001, 0x180c, 0x200c, 0xd1ac, 0x1904, - 0x2676, 0xc1ad, 0x2102, 0x0036, 0x73d8, 0x2011, 0x8013, 0x080c, - 0x4c44, 0x003e, 0x7130, 0xc185, 0x7132, 0x2011, 0x1848, 0x220c, - 0xd1a4, 0x01f0, 0x0016, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, - 0x8a50, 0x2019, 0x000e, 0x00c6, 0x2061, 0x0000, 0x080c, 0xeba1, - 0x00ce, 0x9484, 0x00ff, 0x9080, 0x33b6, 0x200d, 0x918c, 0xff00, - 0x810f, 0x2120, 0x9006, 0x2009, 0x000e, 0x080c, 0xec31, 0x001e, - 0x0016, 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x321b, 0x001e, - 0x00a8, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x6724, - 0x1140, 0x7030, 0xd084, 0x1118, 0xb800, 0xd0bc, 0x1110, 0x080c, - 0x6148, 0x8108, 0x1f04, 0x2666, 0x00be, 0x015e, 0x00ce, 0x004e, - 0x080c, 0xb244, 0x60e3, 0x0000, 0x001e, 0x2001, 0x1800, 0x2014, - 0x9296, 0x0004, 0x1170, 0xd19c, 0x11a0, 0x2011, 0x180c, 0x2214, - 0xd29c, 0x1120, 0x6204, 0x9295, 0x0002, 0x6206, 0x6228, 0xc29d, - 0x622a, 0x2003, 0x0001, 0x2001, 0x1826, 0x2003, 0x0000, 0x6027, - 0x0020, 0xd194, 0x0904, 0x2784, 0x0016, 0x6220, 0xd2b4, 0x0904, - 0x2721, 0x080c, 0x88c3, 0x080c, 0xa6e9, 0x6027, 0x0004, 0x00f6, - 0x2019, 0x19f1, 0x2304, 0x907d, 0x0904, 0x26f0, 0x7804, 0x9086, - 0x0032, 0x15f0, 0x00d6, 0x00c6, 0x00e6, 0x0096, 0x2069, 0x0140, - 0x782c, 0x685e, 0x7808, 0x685a, 0x6043, 0x0002, 0x2001, 0x0003, - 0x8001, 0x1df0, 0x6043, 0x0000, 0x2001, 0x003c, 0x8001, 0x1df0, - 0x080c, 0x2d49, 0x2001, 0x001e, 0x8001, 0x0240, 0x20a9, 0x0009, - 0x080c, 0x2c42, 0x6904, 0xd1dc, 0x1140, 0x0cb0, 0x2001, 0x0100, - 0x080c, 0x2d39, 0x9006, 0x080c, 0x2d39, 0x080c, 0x99a5, 0x080c, - 0x9ab1, 0x7814, 0x2048, 0xa867, 0x0103, 0x2f60, 0x080c, 0xb2d3, - 0x009e, 0x00ee, 0x00ce, 0x00de, 0x00fe, 0x001e, 0x00ae, 0x0005, - 0x00fe, 0x00d6, 0x2069, 0x0140, 0x6804, 0x9084, 0x4000, 0x0110, - 0x080c, 0x2d49, 0x00de, 0x00c6, 0x2061, 0x19e8, 0x6028, 0x080c, - 0xd7e3, 0x0120, 0x909a, 0x0003, 0x1258, 0x0018, 0x909a, 0x00c8, - 0x1238, 0x8000, 0x602a, 0x00ce, 0x080c, 0xa6c5, 0x0804, 0x2783, - 0x2061, 0x0100, 0x62c0, 0x080c, 0xb0ca, 0x2019, 0x19f1, 0x2304, - 0x9065, 0x0120, 0x2009, 0x0027, 0x080c, 0xb352, 0x00ce, 0x0804, - 0x2783, 0xd2bc, 0x0904, 0x276a, 0x080c, 0x88d0, 0x6014, 0x9084, - 0x1984, 0x9085, 0x0010, 0x6016, 0x6027, 0x0004, 0x00d6, 0x2069, - 0x0140, 0x6804, 0x9084, 0x4000, 0x0110, 0x080c, 0x2d49, 0x00de, - 0x00c6, 0x2061, 0x19e8, 0x6044, 0x080c, 0xd7e3, 0x0120, 0x909a, - 0x0003, 0x1658, 0x0018, 0x909a, 0x00c8, 0x1638, 0x8000, 0x6046, - 0x603c, 0x00ce, 0x9005, 0x05b8, 0x2009, 0x07d0, 0x080c, 0x88c8, - 0x9080, 0x0008, 0x2004, 0x9086, 0x0006, 0x1138, 0x6114, 0x918c, - 0x1984, 0x918d, 0x0012, 0x6116, 0x0430, 0x9080, 0x0008, 0x2004, - 0x9086, 0x0009, 0x0d98, 0x6114, 0x918c, 0x1984, 0x918d, 0x0016, - 0x6116, 0x00c8, 0x6027, 0x0004, 0x00b0, 0x0036, 0x2019, 0x0001, - 0x080c, 0xaa49, 0x003e, 0x2019, 0x19f7, 0x2304, 0x9065, 0x0150, - 0x2009, 0x004f, 0x6020, 0x9086, 0x0009, 0x1110, 0x2009, 0x004f, - 0x080c, 0xb352, 0x00ce, 0x001e, 0xd19c, 0x0904, 0x27dc, 0x7038, - 0xd0ac, 0x1538, 0x0016, 0x0156, 0x6027, 0x0008, 0x080c, 0x2d73, - 0x20a9, 0x0028, 0xa001, 0x1f04, 0x2792, 0x6150, 0x9185, 0x1400, - 0x6052, 0x20a9, 0x0366, 0x1d04, 0x279b, 0x080c, 0x88f7, 0x6020, - 0xd09c, 0x1130, 0x015e, 0x6152, 0x001e, 0x6027, 0x0008, 0x04a0, - 0x080c, 0x2c29, 0x1f04, 0x279b, 0x015e, 0x6152, 0x001e, 0x6027, - 0x0008, 0x0016, 0x6028, 0xc09c, 0x602a, 0x080c, 0xb244, 0x60e3, - 0x0000, 0x080c, 0xf07f, 0x080c, 0xf09a, 0x080c, 0x57d9, 0xd0fc, - 0x1138, 0x080c, 0xd7dc, 0x1120, 0x9085, 0x0001, 0x080c, 0x767b, - 0x9006, 0x080c, 0x2d39, 0x2009, 0x0002, 0x080c, 0x2c67, 0x00e6, - 0x2071, 0x1800, 0x7003, 0x0004, 0x080c, 0x0ea3, 0x00ee, 0x6027, - 0x0008, 0x080c, 0x0ba0, 0x001e, 0x918c, 0xffd0, 0x6126, 0x00ae, - 0x0005, 0x0016, 0x2001, 0x188b, 0x200c, 0xd184, 0x001e, 0x0904, - 0x259b, 0x0016, 0x2009, 0x27ed, 0x00d0, 0x2001, 0x188b, 0x200c, - 0xc184, 0x2102, 0x001e, 0x0c40, 0x0016, 0x2001, 0x188b, 0x200c, - 0xd194, 0x001e, 0x0904, 0x259b, 0x0016, 0x2009, 0x2800, 0x0038, - 0x2001, 0x188b, 0x200c, 0xc194, 0x2102, 0x001e, 0x08a8, 0x6028, - 0xc0bc, 0x602a, 0x2001, 0x0156, 0x2003, 0xbc91, 0x8000, 0x2003, - 0xffff, 0x6043, 0x0001, 0x080c, 0x2c61, 0x6027, 0x0080, 0x6017, - 0x0000, 0x6043, 0x0000, 0x0817, 0x0006, 0x0016, 0x0026, 0x0036, - 0x00e6, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x71d0, - 0x70d2, 0x9116, 0x0904, 0x286b, 0x81ff, 0x01a0, 0x2009, 0x0000, - 0x080c, 0x2c67, 0x2011, 0x8011, 0x2019, 0x010e, 0x231c, 0x939e, - 0x0007, 0x1118, 0x2019, 0x0001, 0x0010, 0x2019, 0x0000, 0x080c, - 0x4c44, 0x0448, 0x2001, 0x19a9, 0x200c, 0x81ff, 0x1140, 0x2001, - 0x0109, 0x2004, 0xd0b4, 0x0118, 0x2019, 0x0003, 0x0008, 0x2118, - 0x2011, 0x8012, 0x080c, 0x4c44, 0x080c, 0x0ea3, 0x080c, 0x57d9, - 0xd0fc, 0x1188, 0x080c, 0xd7dc, 0x1170, 0x00c6, 0x080c, 0x2907, - 0x080c, 0xa9b0, 0x2061, 0x0100, 0x2019, 0x0028, 0x2009, 0x0002, - 0x080c, 0x321b, 0x00ce, 0x012e, 0x00fe, 0x00ee, 0x003e, 0x002e, - 0x001e, 0x000e, 0x0005, 0x2028, 0x918c, 0x00ff, 0x2130, 0x9094, - 0xff00, 0x11f0, 0x2011, 0x1837, 0x2214, 0xd2ac, 0x11c8, 0x81ff, - 0x01e8, 0x2011, 0x181f, 0x2204, 0x9106, 0x1190, 0x2011, 0x1820, - 0x2214, 0x9294, 0xff00, 0x9584, 0xff00, 0x9206, 0x1148, 0x2011, - 0x1820, 0x2214, 0x9294, 0x00ff, 0x9584, 0x00ff, 0x9206, 0x1120, - 0x2500, 0x080c, 0x83a5, 0x0048, 0x9584, 0x00ff, 0x9080, 0x33b6, - 0x200d, 0x918c, 0xff00, 0x810f, 0x9006, 0x0005, 0x9080, 0x33b6, - 0x200d, 0x918c, 0x00ff, 0x0005, 0x00d6, 0x2069, 0x0140, 0x2001, - 0x1818, 0x2003, 0x00ef, 0x20a9, 0x0010, 0x9006, 0x6852, 0x6856, - 0x1f04, 0x28b7, 0x00de, 0x0005, 0x0006, 0x00d6, 0x0026, 0x2069, - 0x0140, 0x2001, 0x1818, 0x2102, 0x8114, 0x8214, 0x8214, 0x8214, - 0x20a9, 0x0010, 0x6853, 0x0000, 0x9006, 0x82ff, 0x1128, 0x9184, - 0x000f, 0x9080, 0xf880, 0x2005, 0x6856, 0x8211, 0x1f04, 0x28cc, - 0x002e, 0x00de, 0x000e, 0x0005, 0x00c6, 0x2061, 0x1800, 0x6030, - 0x0110, 0xc09d, 0x0008, 0xc09c, 0x6032, 0x00ce, 0x0005, 0x0156, - 0x00d6, 0x0026, 0x0016, 0x0006, 0x2069, 0x0140, 0x6980, 0x9116, - 0x0180, 0x9112, 0x1230, 0x8212, 0x8210, 0x22a8, 0x2001, 0x0402, - 0x0018, 0x22a8, 0x2001, 0x0404, 0x680e, 0x1f04, 0x28fc, 0x680f, - 0x0000, 0x000e, 0x001e, 0x002e, 0x00de, 0x015e, 0x0005, 0x080c, - 0x57d5, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0x9006, 0x0046, 0x2020, - 0x2009, 0x002e, 0x080c, 0xec31, 0x004e, 0x0005, 0x00f6, 0x0016, - 0x0026, 0x2079, 0x0140, 0x78c4, 0xd0dc, 0x0904, 0x2973, 0x080c, - 0x2bc6, 0x0660, 0x9084, 0x0700, 0x908e, 0x0600, 0x1120, 0x2011, - 0x4000, 0x900e, 0x0458, 0x908e, 0x0500, 0x1120, 0x2011, 0x8000, - 0x900e, 0x0420, 0x908e, 0x0400, 0x1120, 0x9016, 0x2009, 0x0001, - 0x00e8, 0x908e, 0x0300, 0x1120, 0x9016, 0x2009, 0x0002, 0x00b0, - 0x908e, 0x0200, 0x1120, 0x9016, 0x2009, 0x0004, 0x0078, 0x908e, - 0x0100, 0x1548, 0x9016, 0x2009, 0x0008, 0x0040, 0x9084, 0x0700, - 0x908e, 0x0300, 0x1500, 0x2011, 0x0030, 0x0058, 0x2300, 0x9080, - 0x0020, 0x2018, 0x080c, 0x9375, 0x928c, 0xff00, 0x0110, 0x2011, - 0x00ff, 0x2200, 0x8007, 0x9085, 0x004c, 0x78c2, 0x2009, 0x0138, - 0x220a, 0x080c, 0x7637, 0x1118, 0x2009, 0x196d, 0x220a, 0x002e, - 0x001e, 0x00fe, 0x0005, 0x78c3, 0x0000, 0x0cc8, 0x0126, 0x2091, - 0x2800, 0x0006, 0x0016, 0x0026, 0x2001, 0x0170, 0x200c, 0x8000, - 0x2014, 0x9184, 0x0003, 0x0110, 0x080c, 0x0dbe, 0x002e, 0x001e, - 0x000e, 0x012e, 0x0005, 0x2001, 0x180d, 0x2004, 0xd08c, 0x0118, - 0x2009, 0x0002, 0x0005, 0x2001, 0x0171, 0x2004, 0xd0dc, 0x0168, - 0x2001, 0x0170, 0x200c, 0x918c, 0x00ff, 0x918e, 0x004c, 0x1128, - 0x200c, 0x918c, 0xff00, 0x810f, 0x0005, 0x900e, 0x2001, 0x0227, - 0x2004, 0x8007, 0x9084, 0x00ff, 0x8004, 0x9108, 0x2001, 0x0226, - 0x2004, 0x8007, 0x9084, 0x00ff, 0x8004, 0x9108, 0x0005, 0x0018, - 0x000c, 0x0018, 0x0020, 0x1000, 0x0800, 0x1000, 0x1800, 0x0156, - 0x0006, 0x0016, 0x0026, 0x00e6, 0x2001, 0x1990, 0x2004, 0x908a, - 0x0007, 0x1a0c, 0x0dc5, 0x0033, 0x00ee, 0x002e, 0x001e, 0x000e, - 0x015e, 0x0005, 0x29d9, 0x29f7, 0x2a1b, 0x2a1d, 0x2a46, 0x2a48, - 0x2a4a, 0x2001, 0x0001, 0x080c, 0x281c, 0x080c, 0x2c24, 0x2001, - 0x1992, 0x2003, 0x0000, 0x7828, 0x9084, 0xe1d7, 0x782a, 0x9006, - 0x20a9, 0x0009, 0x080c, 0x2be2, 0x2001, 0x1990, 0x2003, 0x0006, - 0x2009, 0x001e, 0x2011, 0x2a4b, 0x080c, 0x88d5, 0x0005, 0x2009, - 0x1995, 0x200b, 0x0000, 0x2001, 0x199a, 0x2003, 0x0036, 0x2001, - 0x1999, 0x2003, 0x002a, 0x2001, 0x1992, 0x2003, 0x0001, 0x9006, - 0x080c, 0x2b94, 0x2001, 0xffff, 0x20a9, 0x0009, 0x080c, 0x2be2, - 0x2001, 0x1990, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x2a4b, - 0x080c, 0x88d5, 0x0005, 0x080c, 0x0dc5, 0x2001, 0x199a, 0x2003, - 0x0036, 0x2001, 0x1992, 0x2003, 0x0003, 0x7a38, 0x9294, 0x0005, - 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, - 0x2b94, 0x2001, 0x1996, 0x2003, 0x0000, 0x2001, 0xffff, 0x20a9, - 0x0009, 0x080c, 0x2be2, 0x2001, 0x1990, 0x2003, 0x0006, 0x2009, - 0x001e, 0x2011, 0x2a4b, 0x080c, 0x88d5, 0x0005, 0x080c, 0x0dc5, - 0x080c, 0x0dc5, 0x0005, 0x0006, 0x0016, 0x0026, 0x00e6, 0x00f6, - 0x0156, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100, 0x2001, 0x1992, - 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0dc5, 0x0043, 0x012e, 0x015e, - 0x00fe, 0x00ee, 0x002e, 0x001e, 0x000e, 0x0005, 0x2a6d, 0x2a89, - 0x2ac5, 0x2af1, 0x2b11, 0x2b1d, 0x2b1f, 0x080c, 0x2bd6, 0x1190, - 0x2009, 0x1998, 0x2104, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0004, - 0x0110, 0xc08d, 0x0008, 0xc085, 0x200a, 0x2001, 0x1990, 0x2003, - 0x0001, 0x0030, 0x080c, 0x2b43, 0x2001, 0xffff, 0x080c, 0x29e8, - 0x0005, 0x080c, 0x2b21, 0x05c0, 0x2009, 0x1999, 0x2104, 0x8001, - 0x200a, 0x080c, 0x2bd6, 0x1158, 0x7a38, 0x9294, 0x0005, 0x9296, - 0x0005, 0x0518, 0x2009, 0x1998, 0x2104, 0xc085, 0x200a, 0x2009, - 0x1995, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005, 0x0118, 0x080c, - 0x2b29, 0x00c0, 0x200b, 0x0000, 0x7a38, 0x9294, 0x0006, 0x9296, - 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x2bb1, - 0x2001, 0x1992, 0x2003, 0x0002, 0x0028, 0x2001, 0x1990, 0x2003, - 0x0003, 0x0010, 0x080c, 0x2a0a, 0x0005, 0x080c, 0x2b21, 0x0540, - 0x2009, 0x1999, 0x2104, 0x8001, 0x200a, 0x080c, 0x2bd6, 0x1148, - 0x2001, 0x1990, 0x2003, 0x0003, 0x2001, 0x1991, 0x2003, 0x0000, - 0x00b8, 0x2009, 0x1999, 0x2104, 0x9005, 0x1118, 0x080c, 0x2b66, - 0x0010, 0x080c, 0x2b36, 0x080c, 0x2b29, 0x2009, 0x1995, 0x200b, - 0x0000, 0x2001, 0x1992, 0x2003, 0x0001, 0x080c, 0x2a0a, 0x0000, - 0x0005, 0x0479, 0x01e8, 0x080c, 0x2bd6, 0x1198, 0x2009, 0x1996, - 0x2104, 0x8000, 0x200a, 0x9086, 0x0007, 0x0108, 0x0078, 0x2001, - 0x199b, 0x2003, 0x000a, 0x2009, 0x1998, 0x2104, 0xc0fd, 0x200a, - 0x0038, 0x00f9, 0x2001, 0x1992, 0x2003, 0x0004, 0x080c, 0x2a35, - 0x0005, 0x0079, 0x0148, 0x080c, 0x2bd6, 0x1118, 0x080c, 0x2a21, - 0x0018, 0x0079, 0x080c, 0x2a35, 0x0005, 0x080c, 0x0dc5, 0x080c, - 0x0dc5, 0x2009, 0x199a, 0x2104, 0x8001, 0x200a, 0x090c, 0x2b82, - 0x0005, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006, - 0x0010, 0x2001, 0x0001, 0x080c, 0x2bb1, 0x0005, 0x7a38, 0x9294, - 0x0006, 0x9296, 0x0006, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, - 0x080c, 0x2b94, 0x0005, 0x2009, 0x1995, 0x2104, 0x8000, 0x200a, - 0x9086, 0x0005, 0x0108, 0x0068, 0x200b, 0x0000, 0x7a38, 0x9294, - 0x0006, 0x9296, 0x0006, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, - 0x04d9, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006, - 0x0010, 0x2001, 0x0001, 0x080c, 0x2bb1, 0x0005, 0x0086, 0x2001, - 0x1998, 0x2004, 0x9084, 0x7fff, 0x090c, 0x0dc5, 0x2009, 0x1997, - 0x2144, 0x8846, 0x280a, 0x9844, 0x0dd8, 0xd08c, 0x1120, 0xd084, - 0x1120, 0x080c, 0x0dc5, 0x9006, 0x0010, 0x2001, 0x0001, 0x00a1, - 0x008e, 0x0005, 0x0006, 0x0156, 0x2001, 0x1990, 0x20a9, 0x0009, - 0x2003, 0x0000, 0x8000, 0x1f04, 0x2b88, 0x2001, 0x1997, 0x2003, - 0x8000, 0x015e, 0x000e, 0x0005, 0x00f6, 0x2079, 0x0100, 0x9085, - 0x0000, 0x0158, 0x7838, 0x9084, 0xfff9, 0x9085, 0x0004, 0x783a, - 0x2009, 0x199d, 0x210c, 0x795a, 0x0050, 0x7838, 0x9084, 0xfffb, - 0x9085, 0x0006, 0x783a, 0x2009, 0x199e, 0x210c, 0x795a, 0x00fe, - 0x0005, 0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, 0x0138, 0x7838, - 0x9084, 0xfffa, 0x9085, 0x0004, 0x783a, 0x0030, 0x7838, 0x9084, - 0xfffb, 0x9085, 0x0005, 0x783a, 0x00fe, 0x0005, 0x0006, 0x2001, - 0x0100, 0x2004, 0x9082, 0x0007, 0x000e, 0x0005, 0x0006, 0x2001, - 0x0100, 0x2004, 0x9082, 0x0009, 0x000e, 0x0005, 0x0156, 0x20a9, - 0x0064, 0x7820, 0x080c, 0x2c61, 0xd09c, 0x1110, 0x1f04, 0x2bd9, - 0x015e, 0x0005, 0x0126, 0x0016, 0x0006, 0x2091, 0x8000, 0x7850, - 0x9085, 0x0040, 0x7852, 0x7850, 0x9084, 0xfbcf, 0x7852, 0x080c, - 0x2c61, 0x9085, 0x2000, 0x7852, 0x000e, 0x2008, 0x9186, 0x0000, - 0x1118, 0x783b, 0x0007, 0x0090, 0x9186, 0x0001, 0x1118, 0x783b, - 0x0006, 0x0060, 0x9186, 0x0002, 0x1118, 0x783b, 0x0005, 0x0030, - 0x9186, 0x0003, 0x1118, 0x783b, 0x0004, 0x0000, 0x0006, 0x1d04, - 0x2c0f, 0x080c, 0x88f7, 0x1f04, 0x2c0f, 0x7850, 0x9085, 0x0400, - 0x9084, 0xdfbf, 0x7852, 0x080c, 0x2c61, 0x9085, 0x1000, 0x7852, - 0x000e, 0x001e, 0x012e, 0x0005, 0x7850, 0x9084, 0xffcf, 0x7852, - 0x0005, 0x0006, 0x0156, 0x00f6, 0x2079, 0x0100, 0x20a9, 0x000a, - 0x7854, 0xd0ac, 0x1130, 0x7820, 0xd0e4, 0x1140, 0x1f04, 0x2c33, - 0x0028, 0x7854, 0xd08c, 0x1110, 0x1f04, 0x2c39, 0x00fe, 0x015e, - 0x000e, 0x0005, 0x1d04, 0x2c42, 0x080c, 0x88f7, 0x1f04, 0x2c42, - 0x0005, 0x0006, 0x2001, 0x199c, 0x2004, 0x9086, 0x0000, 0x000e, - 0x0005, 0x0006, 0x2001, 0x199c, 0x2004, 0x9086, 0x0001, 0x000e, - 0x0005, 0x0006, 0x2001, 0x199c, 0x2004, 0x9086, 0x0002, 0x000e, - 0x0005, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x0005, 0x0006, - 0x2001, 0x19a9, 0x2102, 0x000e, 0x0005, 0x2009, 0x0171, 0x2104, - 0xd0dc, 0x0140, 0x2009, 0x0170, 0x2104, 0x200b, 0x0080, 0xa001, - 0xa001, 0x200a, 0x0005, 0x0036, 0x0046, 0x2001, 0x0141, 0x200c, - 0x918c, 0xff00, 0x9186, 0x2100, 0x0140, 0x9186, 0x2000, 0x0170, - 0x9186, 0x0100, 0x1904, 0x2cda, 0x0048, 0x0016, 0x2009, 0x1a87, - 0x2104, 0x8000, 0x0208, 0x200a, 0x001e, 0x04f0, 0x2009, 0x00a2, - 0x080c, 0x0e52, 0x2019, 0x0160, 0x2324, 0x2011, 0x0003, 0x2009, - 0x0169, 0x2104, 0x9084, 0x0007, 0x210c, 0x918c, 0x0007, 0x910e, - 0x1db0, 0x9086, 0x0003, 0x1548, 0x2304, 0x0066, 0x0076, 0x2031, - 0x0002, 0x233c, 0x973e, 0x0148, 0x8631, 0x1dd8, 0x2031, 0x1a88, - 0x263c, 0x8738, 0x0208, 0x2732, 0x2304, 0x007e, 0x006e, 0x9402, - 0x02a0, 0x19d0, 0x8211, 0x19d8, 0x84ff, 0x0170, 0x2001, 0x0141, - 0x200c, 0x918c, 0xff00, 0x9186, 0x0100, 0x0130, 0x2009, 0x180c, - 0x2104, 0xc0dd, 0x200a, 0x0008, 0x0421, 0x2001, 0x1981, 0x200c, - 0x080c, 0x0e52, 0x004e, 0x003e, 0x0005, 0x2001, 0x180c, 0x2004, - 0xd0dc, 0x01b0, 0x2001, 0x0160, 0x2004, 0x9005, 0x0140, 0x2001, - 0x0141, 0x2004, 0x9084, 0xff00, 0x9086, 0x0100, 0x1148, 0x0126, - 0x2091, 0x8000, 0x0016, 0x0026, 0x0021, 0x002e, 0x001e, 0x012e, - 0x0005, 0x00c6, 0x2061, 0x0100, 0x6014, 0x0006, 0x2001, 0x0161, - 0x2003, 0x0000, 0x6017, 0x0018, 0xa001, 0xa001, 0x602f, 0x0008, - 0x6104, 0x918e, 0x0010, 0x6106, 0x918e, 0x0010, 0x6106, 0x6017, - 0x0040, 0x04b9, 0x001e, 0x9184, 0x0003, 0x01e0, 0x0036, 0x0016, - 0x2019, 0x0141, 0x6124, 0x918c, 0x0028, 0x1120, 0x2304, 0x9084, - 0x2800, 0x0dc0, 0x001e, 0x919c, 0xffe4, 0x9184, 0x0001, 0x0118, - 0x9385, 0x0009, 0x6016, 0x9184, 0x0002, 0x0118, 0x9385, 0x0012, - 0x6016, 0x003e, 0x2001, 0x180c, 0x200c, 0xc1dc, 0x2102, 0x00ce, - 0x0005, 0x0016, 0x0026, 0x080c, 0x7651, 0x0108, 0xc0bc, 0x2009, - 0x0140, 0x2114, 0x9294, 0x0001, 0x9215, 0x220a, 0x002e, 0x001e, - 0x0005, 0x0016, 0x0026, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001, - 0x9285, 0x1000, 0x200a, 0x220a, 0x002e, 0x001e, 0x0005, 0x0016, - 0x0026, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001, 0x9215, 0x220a, - 0x002e, 0x001e, 0x0005, 0x0006, 0x0016, 0x2009, 0x0140, 0x2104, - 0x1128, 0x080c, 0x7651, 0x0110, 0xc0bc, 0x0008, 0xc0bd, 0x200a, - 0x001e, 0x000e, 0x0005, 0x0006, 0x0156, 0x6050, 0x9085, 0x0040, - 0x6052, 0x6050, 0x9084, 0xfbcf, 0x6052, 0x080c, 0x2c61, 0x9085, - 0x2000, 0x6052, 0x20a9, 0x0012, 0x1d04, 0x2d84, 0x080c, 0x88f7, - 0x1f04, 0x2d84, 0x6050, 0x9085, 0x0400, 0x9084, 0xdfbf, 0x6052, - 0x015e, 0x000e, 0x0005, 0x2fff, 0x2fff, 0x2e23, 0x2e23, 0x2e2f, - 0x2e2f, 0x2e3b, 0x2e3b, 0x2e49, 0x2e49, 0x2e55, 0x2e55, 0x2e63, - 0x2e63, 0x2e71, 0x2e71, 0x2e83, 0x2e83, 0x2e8f, 0x2e8f, 0x2e9d, - 0x2e9d, 0x2ebb, 0x2ebb, 0x2edb, 0x2edb, 0x2eab, 0x2eab, 0x2ecb, - 0x2ecb, 0x2ee9, 0x2ee9, 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, - 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, - 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, - 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, - 0x2e81, 0x2e81, 0x2e81, 0x2efb, 0x2efb, 0x2f07, 0x2f07, 0x2f15, - 0x2f15, 0x2f23, 0x2f23, 0x2f33, 0x2f33, 0x2f41, 0x2f41, 0x2f51, - 0x2f51, 0x2f61, 0x2f61, 0x2f73, 0x2f73, 0x2f81, 0x2f81, 0x2f91, - 0x2f91, 0x2fb3, 0x2fb3, 0x2fd5, 0x2fd5, 0x2fa1, 0x2fa1, 0x2fc4, - 0x2fc4, 0x2fe4, 0x2fe4, 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, - 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, - 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, - 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, - 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, - 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, 0x2e81, - 0x2e81, 0x2e81, 0x2e81, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, - 0x0136, 0x0146, 0x0156, 0x080c, 0x24c0, 0x0804, 0x2ff7, 0x0106, - 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, - 0x22cc, 0x0804, 0x2ff7, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, - 0x0136, 0x0146, 0x0156, 0x080c, 0x22cc, 0x080c, 0x24c0, 0x0804, - 0x2ff7, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, - 0x0156, 0x080c, 0x2307, 0x0804, 0x2ff7, 0x0106, 0x0006, 0x0126, - 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24c0, 0x080c, - 0x2307, 0x0804, 0x2ff7, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, - 0x0136, 0x0146, 0x0156, 0x080c, 0x22cc, 0x080c, 0x2307, 0x0804, - 0x2ff7, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, - 0x0156, 0x080c, 0x22cc, 0x080c, 0x24c0, 0x080c, 0x2307, 0x0804, - 0x2ff7, 0xa001, 0x0cf0, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, - 0x0136, 0x0146, 0x0156, 0x080c, 0x1394, 0x0804, 0x2ff7, 0x0106, - 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, - 0x24c0, 0x080c, 0x1394, 0x0804, 0x2ff7, 0x0106, 0x0006, 0x0126, - 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x22cc, 0x080c, - 0x1394, 0x0804, 0x2ff7, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, - 0x0136, 0x0146, 0x0156, 0x080c, 0x24c0, 0x080c, 0x1394, 0x080c, - 0x2307, 0x0804, 0x2ff7, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, - 0x0136, 0x0146, 0x0156, 0x080c, 0x22cc, 0x080c, 0x24c0, 0x080c, - 0x1394, 0x0804, 0x2ff7, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, - 0x0136, 0x0146, 0x0156, 0x080c, 0x22cc, 0x080c, 0x1394, 0x080c, - 0x2307, 0x0804, 0x2ff7, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, - 0x0136, 0x0146, 0x0156, 0x080c, 0x1394, 0x080c, 0x2307, 0x0804, - 0x2ff7, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, - 0x0156, 0x080c, 0x22cc, 0x080c, 0x24c0, 0x080c, 0x1394, 0x080c, - 0x2307, 0x0804, 0x2ff7, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, - 0x0136, 0x0146, 0x0156, 0x080c, 0x2976, 0x0804, 0x2ff7, 0x0106, - 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, - 0x2976, 0x080c, 0x24c0, 0x0804, 0x2ff7, 0x0106, 0x0006, 0x0126, - 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2976, 0x080c, - 0x22cc, 0x0804, 0x2ff7, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, - 0x0136, 0x0146, 0x0156, 0x080c, 0x2976, 0x080c, 0x22cc, 0x080c, - 0x24c0, 0x0804, 0x2ff7, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, - 0x0136, 0x0146, 0x0156, 0x080c, 0x2976, 0x080c, 0x2307, 0x0804, - 0x2ff7, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, - 0x0156, 0x080c, 0x2976, 0x080c, 0x24c0, 0x080c, 0x2307, 0x0804, - 0x2ff7, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, - 0x0156, 0x080c, 0x2976, 0x080c, 0x22cc, 0x080c, 0x2307, 0x0804, - 0x2ff7, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, - 0x0156, 0x080c, 0x2976, 0x080c, 0x22cc, 0x080c, 0x24c0, 0x080c, - 0x2307, 0x0804, 0x2ff7, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, - 0x0136, 0x0146, 0x0156, 0x080c, 0x2976, 0x080c, 0x1394, 0x0804, - 0x2ff7, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, - 0x0156, 0x080c, 0x2976, 0x080c, 0x24c0, 0x080c, 0x1394, 0x0804, - 0x2ff7, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, - 0x0156, 0x080c, 0x2976, 0x080c, 0x22cc, 0x080c, 0x1394, 0x0804, - 0x2ff7, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, - 0x0156, 0x080c, 0x2976, 0x080c, 0x24c0, 0x080c, 0x1394, 0x080c, - 0x2307, 0x0804, 0x2ff7, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, - 0x0136, 0x0146, 0x0156, 0x080c, 0x2976, 0x080c, 0x22cc, 0x080c, - 0x24c0, 0x080c, 0x1394, 0x0498, 0x0106, 0x0006, 0x0126, 0x01c6, - 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2976, 0x080c, 0x22cc, - 0x080c, 0x1394, 0x080c, 0x2307, 0x0410, 0x0106, 0x0006, 0x0126, - 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2976, 0x080c, - 0x1394, 0x080c, 0x2307, 0x0098, 0x0106, 0x0006, 0x0126, 0x01c6, - 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2976, 0x080c, 0x22cc, - 0x080c, 0x24c0, 0x080c, 0x1394, 0x080c, 0x2307, 0x0000, 0x015e, - 0x014e, 0x013e, 0x01de, 0x01ce, 0x012e, 0x000e, 0x010e, 0x000d, - 0x00b6, 0x00c6, 0x0026, 0x0046, 0x9026, 0x080c, 0x6a61, 0x1904, - 0x3137, 0x72dc, 0x2001, 0x197c, 0x2004, 0x9005, 0x1110, 0xd29c, - 0x0148, 0xd284, 0x1138, 0xd2bc, 0x1904, 0x3137, 0x080c, 0x313c, - 0x0804, 0x3137, 0xd2cc, 0x1904, 0x3137, 0x080c, 0x7637, 0x1120, - 0x70af, 0xffff, 0x0804, 0x3137, 0xd294, 0x0120, 0x70af, 0xffff, - 0x0804, 0x3137, 0x080c, 0x33a5, 0x0160, 0x080c, 0xd7e3, 0x0128, - 0x2001, 0x1818, 0x203c, 0x0804, 0x30b0, 0x70af, 0xffff, 0x0804, - 0x3137, 0x2001, 0x1818, 0x203c, 0x7294, 0xd284, 0x0904, 0x30b0, - 0xd28c, 0x1904, 0x30b0, 0x0036, 0x73ac, 0x938e, 0xffff, 0x1110, - 0x2019, 0x0001, 0x8314, 0x92e0, 0x1c80, 0x2c04, 0x938c, 0x0001, - 0x0120, 0x9084, 0xff00, 0x8007, 0x0010, 0x9084, 0x00ff, 0x970e, - 0x0904, 0x30a6, 0x908e, 0x0000, 0x0904, 0x30a6, 0x908e, 0x00ff, - 0x1160, 0x7230, 0xd284, 0x1904, 0x30ab, 0x7294, 0xc28d, 0x7296, - 0x70af, 0xffff, 0x003e, 0x0804, 0x30b0, 0x2009, 0x180d, 0x210c, - 0xd18c, 0x0150, 0x0026, 0x2011, 0x0010, 0x080c, 0x6ac7, 0x002e, - 0x0118, 0x70af, 0xffff, 0x0488, 0x900e, 0x080c, 0x2873, 0x080c, - 0x66b9, 0x1538, 0x9006, 0xb8bb, 0x0520, 0xb8ac, 0x9005, 0x0148, - 0x00c6, 0x2060, 0x080c, 0x8cf7, 0x00ce, 0x090c, 0x9096, 0xb8af, - 0x0000, 0x080c, 0x6aa3, 0x1168, 0x7030, 0xd08c, 0x0130, 0xb800, - 0xd0bc, 0x0138, 0x080c, 0x6944, 0x0120, 0x080c, 0x3155, 0x0148, - 0x0028, 0x080c, 0x3295, 0x080c, 0x3181, 0x0118, 0x8318, 0x0804, - 0x304a, 0x73ae, 0x0010, 0x70af, 0xffff, 0x003e, 0x0804, 0x3137, - 0x9780, 0x33b6, 0x203d, 0x97bc, 0xff00, 0x873f, 0x2041, 0x007e, - 0x70ac, 0x9096, 0xffff, 0x1118, 0x900e, 0x28a8, 0x0050, 0x9812, - 0x0220, 0x2008, 0x9802, 0x20a8, 0x0020, 0x70af, 0xffff, 0x0804, - 0x3137, 0x2700, 0x0156, 0x0016, 0x9106, 0x0904, 0x312c, 0x2001, - 0x180d, 0x2004, 0xd08c, 0x0158, 0x0026, 0x2011, 0x0010, 0x080c, - 0x6ac7, 0x002e, 0x0120, 0x2009, 0xffff, 0x0804, 0x3134, 0xc484, - 0x080c, 0x6724, 0x0168, 0x080c, 0xd7e3, 0x1904, 0x312c, 0x080c, - 0x33a5, 0x1904, 0x312c, 0x080c, 0x66b9, 0x1904, 0x3134, 0x0008, - 0xc485, 0xb8bb, 0x0520, 0xb8ac, 0x9005, 0x0148, 0x00c6, 0x2060, - 0x080c, 0x8cf7, 0x00ce, 0x090c, 0x9096, 0xb8af, 0x0000, 0x080c, - 0x6aa3, 0x1130, 0x7030, 0xd08c, 0x01f8, 0xb800, 0xd0bc, 0x11e0, - 0x7294, 0xd28c, 0x0180, 0x080c, 0x6aa3, 0x9082, 0x0006, 0x02e0, - 0xd484, 0x1118, 0x080c, 0x66de, 0x0028, 0x080c, 0x3321, 0x01a0, - 0x080c, 0x334c, 0x0088, 0x080c, 0x3295, 0x080c, 0xd7e3, 0x1160, - 0x080c, 0x3181, 0x0188, 0x0040, 0x080c, 0xd7e3, 0x1118, 0x080c, - 0x3321, 0x0110, 0x0451, 0x0140, 0x001e, 0x8108, 0x015e, 0x1f04, - 0x30c9, 0x70af, 0xffff, 0x0018, 0x001e, 0x015e, 0x71ae, 0x004e, - 0x002e, 0x00ce, 0x00be, 0x0005, 0x00c6, 0x0016, 0x70af, 0x0001, - 0x2009, 0x007e, 0x080c, 0x66b9, 0x1168, 0xb813, 0x00ff, 0xb817, - 0xfffe, 0x080c, 0x3295, 0x04a9, 0x0128, 0x70dc, 0xc0bd, 0x70de, - 0x080c, 0xd52b, 0x001e, 0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, - 0x00c6, 0x2001, 0x184c, 0x2004, 0x9084, 0x00ff, 0xb842, 0x080c, - 0xb325, 0x01d0, 0x2b00, 0x6012, 0x080c, 0xd554, 0x6023, 0x0001, - 0x9006, 0x080c, 0x6656, 0x2001, 0x0000, 0x080c, 0x666a, 0x0126, - 0x2091, 0x8000, 0x70a8, 0x8000, 0x70aa, 0x012e, 0x2009, 0x0004, - 0x080c, 0xb352, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, - 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2001, 0x184c, 0x2004, - 0x9084, 0x00ff, 0xb842, 0x080c, 0xb325, 0x0548, 0x2b00, 0x6012, - 0xb800, 0xc0c4, 0xb802, 0xb8a0, 0x9086, 0x007e, 0x0140, 0xb804, - 0x9084, 0x00ff, 0x9086, 0x0006, 0x1110, 0x080c, 0x3250, 0x080c, - 0xd554, 0x6023, 0x0001, 0x9006, 0x080c, 0x6656, 0x2001, 0x0002, - 0x080c, 0x666a, 0x0126, 0x2091, 0x8000, 0x70a8, 0x8000, 0x70aa, - 0x012e, 0x2009, 0x0002, 0x080c, 0xb352, 0x9085, 0x0001, 0x00ce, - 0x00de, 0x007e, 0x001e, 0x0005, 0x00b6, 0x00c6, 0x0026, 0x2009, - 0x0080, 0x080c, 0x66b9, 0x1140, 0xb813, 0x00ff, 0xb817, 0xfffc, - 0x0039, 0x0110, 0x70e3, 0xffff, 0x002e, 0x00ce, 0x00be, 0x0005, - 0x0016, 0x0076, 0x00d6, 0x00c6, 0x080c, 0xb27d, 0x01d0, 0x2b00, - 0x6012, 0x080c, 0xd554, 0x6023, 0x0001, 0x9006, 0x080c, 0x6656, - 0x2001, 0x0002, 0x080c, 0x666a, 0x0126, 0x2091, 0x8000, 0x70e4, - 0x8000, 0x70e6, 0x012e, 0x2009, 0x0002, 0x080c, 0xb352, 0x9085, - 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x00c6, 0x00d6, - 0x0126, 0x2091, 0x8000, 0x2009, 0x007f, 0x080c, 0x66b9, 0x11b8, - 0xb813, 0x00ff, 0xb817, 0xfffd, 0xb8cf, 0x0004, 0x080c, 0xb27d, - 0x0170, 0x2b00, 0x6012, 0x6316, 0x6023, 0x0001, 0x620a, 0x080c, - 0xd554, 0x2009, 0x0022, 0x080c, 0xb352, 0x9085, 0x0001, 0x012e, - 0x00de, 0x00ce, 0x0005, 0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026, - 0x00b6, 0x21f0, 0x080c, 0x96af, 0x080c, 0x962f, 0x080c, 0xb111, - 0x080c, 0xc2d3, 0x3e08, 0x2130, 0x81ff, 0x0120, 0x20a9, 0x007e, - 0x900e, 0x0018, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x6724, - 0x1140, 0x9686, 0x0002, 0x1118, 0xb800, 0xd0bc, 0x1110, 0x080c, - 0x6148, 0x001e, 0x8108, 0x1f04, 0x3235, 0x9686, 0x0001, 0x190c, - 0x3379, 0x00be, 0x002e, 0x003e, 0x006e, 0x00ce, 0x00ee, 0x0005, - 0x00e6, 0x00c6, 0x0046, 0x0036, 0x0026, 0x0016, 0x00b6, 0x6210, - 0x2258, 0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c, 0x96a4, 0x0076, - 0x2039, 0x0000, 0x080c, 0x9577, 0x2c08, 0x080c, 0xe91c, 0x007e, - 0x001e, 0xba10, 0xbb14, 0xbcc0, 0x080c, 0x6148, 0xba12, 0xbb16, - 0xbcc2, 0x00be, 0x001e, 0x002e, 0x003e, 0x004e, 0x00ce, 0x00ee, - 0x0005, 0x00e6, 0x0006, 0x00b6, 0x6010, 0x2058, 0xb8a0, 0x00be, - 0x9086, 0x0080, 0x0150, 0x2071, 0x1800, 0x70a8, 0x9005, 0x0110, - 0x8001, 0x70aa, 0x000e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x70e4, - 0x9005, 0x0dc0, 0x8001, 0x70e6, 0x0ca8, 0xb800, 0xc08c, 0xb802, - 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x00b6, 0x0046, 0x0036, 0x0026, - 0x0016, 0x0156, 0x2178, 0x81ff, 0x1118, 0x20a9, 0x0001, 0x0078, - 0x080c, 0x57d5, 0xd0c4, 0x0140, 0xd0a4, 0x0130, 0x9006, 0x2020, - 0x2009, 0x002d, 0x080c, 0xec31, 0x20a9, 0x0800, 0x9016, 0x0026, - 0x928e, 0x007e, 0x0904, 0x3300, 0x928e, 0x007f, 0x0904, 0x3300, - 0x928e, 0x0080, 0x05e8, 0x9288, 0x1000, 0x210c, 0x81ff, 0x05c0, - 0x8fff, 0x1148, 0x2001, 0x198e, 0x0006, 0x2003, 0x0001, 0x04f1, - 0x000e, 0x2003, 0x0000, 0x00b6, 0x00c6, 0x2158, 0x2001, 0x0001, - 0x080c, 0x6a6d, 0x00ce, 0x00be, 0x2019, 0x0029, 0x080c, 0x96a4, - 0x0076, 0x2039, 0x0000, 0x080c, 0x9577, 0x00b6, 0x00c6, 0x0026, - 0x2158, 0xba04, 0x9294, 0x00ff, 0x9286, 0x0006, 0x1118, 0xb807, - 0x0404, 0x0028, 0x2001, 0x0004, 0x8007, 0x9215, 0xba06, 0x002e, - 0x00ce, 0x00be, 0x0016, 0x2c08, 0x080c, 0xe91c, 0x001e, 0x007e, - 0x002e, 0x8210, 0x1f04, 0x32b7, 0x015e, 0x001e, 0x002e, 0x003e, - 0x004e, 0x00be, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0046, 0x0026, - 0x0016, 0x080c, 0x57d5, 0xd0c4, 0x0140, 0xd0a4, 0x0130, 0x9006, - 0x2220, 0x2009, 0x0029, 0x080c, 0xec31, 0x001e, 0x002e, 0x004e, - 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x7294, 0x82ff, 0x01e8, - 0x080c, 0x6a9b, 0x11d0, 0x2100, 0x080c, 0x28a6, 0x81ff, 0x01b8, - 0x2019, 0x0001, 0x8314, 0x92e0, 0x1c80, 0x2c04, 0xd384, 0x0120, - 0x9084, 0xff00, 0x8007, 0x0010, 0x9084, 0x00ff, 0x9116, 0x0138, - 0x9096, 0x00ff, 0x0110, 0x8318, 0x0c68, 0x9085, 0x0001, 0x00ce, - 0x003e, 0x002e, 0x001e, 0x0005, 0x0016, 0x00c6, 0x0126, 0x2091, - 0x8000, 0x0036, 0x2019, 0x0029, 0x00a9, 0x003e, 0x9180, 0x1000, - 0x2004, 0x9065, 0x0158, 0x0016, 0x00c6, 0x2061, 0x1ab7, 0x001e, - 0x6112, 0x080c, 0x3250, 0x001e, 0x080c, 0x66de, 0x012e, 0x00ce, - 0x001e, 0x0005, 0x0016, 0x0026, 0x2110, 0x080c, 0xac6c, 0x080c, - 0xef94, 0x002e, 0x001e, 0x0005, 0x2001, 0x1837, 0x2004, 0xd0cc, - 0x0005, 0x00c6, 0x00b6, 0x080c, 0x7637, 0x1118, 0x20a9, 0x0800, - 0x0010, 0x20a9, 0x0782, 0x080c, 0x7637, 0x1110, 0x900e, 0x0010, - 0x2009, 0x007e, 0x9180, 0x1000, 0x2004, 0x905d, 0x0130, 0x86ff, - 0x0110, 0xb800, 0xd0bc, 0x090c, 0x66de, 0x8108, 0x1f04, 0x338a, - 0x2061, 0x1800, 0x607f, 0x0000, 0x6080, 0x9084, 0x00ff, 0x6082, - 0x60b3, 0x0000, 0x00be, 0x00ce, 0x0005, 0x2001, 0x1869, 0x2004, - 0xd0bc, 0x0005, 0x2011, 0x1848, 0x2214, 0xd2ec, 0x0005, 0x0026, - 0x2011, 0x1867, 0x2214, 0xd2dc, 0x002e, 0x0005, 0x7eef, 0x7de8, - 0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc, 0x80da, 0x7ad9, 0x80d6, - 0x80d5, 0x80d4, 0x80d3, 0x80d2, 0x80d1, 0x79ce, 0x78cd, 0x80cc, - 0x80cb, 0x80ca, 0x80c9, 0x80c7, 0x80c6, 0x77c5, 0x76c3, 0x80bc, - 0x80ba, 0x75b9, 0x80b6, 0x74b5, 0x73b4, 0x72b3, 0x80b2, 0x80b1, - 0x80ae, 0x71ad, 0x80ac, 0x70ab, 0x6faa, 0x6ea9, 0x80a7, 0x6da6, - 0x6ca5, 0x6ba3, 0x6a9f, 0x699e, 0x689d, 0x809b, 0x8098, 0x6797, - 0x6690, 0x658f, 0x6488, 0x6384, 0x6282, 0x8081, 0x8080, 0x617c, - 0x607a, 0x8079, 0x5f76, 0x8075, 0x8074, 0x8073, 0x8072, 0x8071, - 0x806e, 0x5e6d, 0x806c, 0x5d6b, 0x5c6a, 0x5b69, 0x8067, 0x5a66, - 0x5965, 0x5863, 0x575c, 0x565a, 0x5559, 0x8056, 0x8055, 0x5454, - 0x5353, 0x5252, 0x5151, 0x504e, 0x4f4d, 0x804c, 0x804b, 0x4e4a, - 0x4d49, 0x8047, 0x4c46, 0x8045, 0x8043, 0x803c, 0x803a, 0x8039, - 0x8036, 0x4b35, 0x8034, 0x4a33, 0x4932, 0x4831, 0x802e, 0x472d, - 0x462c, 0x452b, 0x442a, 0x4329, 0x4227, 0x8026, 0x8025, 0x4123, - 0x401f, 0x3f1e, 0x3e1d, 0x3d1b, 0x3c18, 0x8017, 0x8010, 0x3b0f, - 0x3a08, 0x8004, 0x3902, 0x8001, 0x8000, 0x8000, 0x3800, 0x3700, - 0x3600, 0x8000, 0x3500, 0x8000, 0x8000, 0x8000, 0x3400, 0x8000, - 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3300, 0x3200, 0x8000, - 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3100, 0x3000, 0x8000, - 0x8000, 0x2f00, 0x8000, 0x2e00, 0x2d00, 0x2c00, 0x8000, 0x8000, - 0x8000, 0x2b00, 0x8000, 0x2a00, 0x2900, 0x2800, 0x8000, 0x2700, - 0x2600, 0x2500, 0x2400, 0x2300, 0x2200, 0x8000, 0x8000, 0x2100, - 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x8000, 0x8000, 0x1b00, - 0x1a00, 0x8000, 0x1900, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, - 0x8000, 0x1800, 0x8000, 0x1700, 0x1600, 0x1500, 0x8000, 0x1400, - 0x1300, 0x1200, 0x1100, 0x1000, 0x0f00, 0x8000, 0x8000, 0x0e00, - 0x0d00, 0x0c00, 0x0b00, 0x0a00, 0x0900, 0x8000, 0x8000, 0x0800, - 0x0700, 0x8000, 0x0600, 0x8000, 0x8000, 0x8000, 0x0500, 0x0400, - 0x0300, 0x8000, 0x0200, 0x8000, 0x8000, 0x8000, 0x0100, 0x8000, - 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x8000, 0x8000, - 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, - 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x2071, 0x189e, - 0x7003, 0x0002, 0x9006, 0x7016, 0x701a, 0x704a, 0x704e, 0x700e, - 0x7042, 0x7046, 0x703b, 0x18ba, 0x703f, 0x18ba, 0x7007, 0x0001, - 0x080c, 0x1027, 0x090c, 0x0dc5, 0x2900, 0x706a, 0xa867, 0x0002, - 0xa8ab, 0xdcb0, 0x080c, 0x1027, 0x090c, 0x0dc5, 0x2900, 0x706e, - 0xa867, 0x0002, 0xa8ab, 0xdcb0, 0x0005, 0x2071, 0x189e, 0x7004, - 0x0002, 0x34e5, 0x34e6, 0x34f9, 0x350d, 0x0005, 0x1004, 0x34f6, - 0x0e04, 0x34f6, 0x2079, 0x0000, 0x0126, 0x2091, 0x8000, 0x700c, - 0x9005, 0x1128, 0x700f, 0x0001, 0x012e, 0x0468, 0x0005, 0x012e, - 0x0ce8, 0x2079, 0x0000, 0x2061, 0x18b8, 0x2c4c, 0xa86c, 0x908e, - 0x0100, 0x0128, 0x9086, 0x0200, 0x0904, 0x35e1, 0x0005, 0x7018, - 0x2048, 0x2061, 0x1800, 0x701c, 0x0807, 0x7014, 0x2048, 0xa864, - 0x9094, 0x00ff, 0x9296, 0x0029, 0x1120, 0xaa78, 0xd2fc, 0x0128, - 0x0005, 0x9086, 0x0103, 0x0108, 0x0005, 0x2079, 0x0000, 0x2061, - 0x1800, 0x701c, 0x0807, 0x2061, 0x1800, 0x7880, 0x908a, 0x0040, - 0x1210, 0x61d0, 0x0042, 0x2100, 0x908a, 0x003f, 0x1a04, 0x35de, - 0x61d0, 0x0804, 0x3573, 0x35b5, 0x35ed, 0x35de, 0x35f9, 0x3603, - 0x3609, 0x360d, 0x361d, 0x3621, 0x3637, 0x363d, 0x3643, 0x364e, - 0x3659, 0x3668, 0x3677, 0x3685, 0x369c, 0x36b7, 0x35de, 0x3762, - 0x37a0, 0x3846, 0x3857, 0x387a, 0x35de, 0x35de, 0x35de, 0x38b2, - 0x38ce, 0x38d7, 0x3906, 0x390c, 0x35de, 0x3952, 0x35de, 0x35de, - 0x35de, 0x35de, 0x35de, 0x395d, 0x3966, 0x396e, 0x3970, 0x35de, - 0x35de, 0x35de, 0x35de, 0x35de, 0x35de, 0x399c, 0x35de, 0x35de, - 0x35de, 0x35de, 0x35de, 0x39b9, 0x3a40, 0x35de, 0x35de, 0x35de, - 0x35de, 0x35de, 0x35de, 0x0002, 0x3a6a, 0x3a6d, 0x3acc, 0x3ae5, - 0x3b15, 0x3db7, 0x35de, 0x5398, 0x35de, 0x35de, 0x35de, 0x35de, - 0x35de, 0x35de, 0x35de, 0x35de, 0x3637, 0x363d, 0x42ec, 0x57f9, - 0x430a, 0x5427, 0x5479, 0x5584, 0x35de, 0x55e6, 0x5622, 0x5653, - 0x575b, 0x5680, 0x56db, 0x35de, 0x430e, 0x44e1, 0x44f7, 0x451c, - 0x4581, 0x45f5, 0x4615, 0x468c, 0x46e8, 0x4744, 0x4747, 0x476c, - 0x4823, 0x4889, 0x4891, 0x49c6, 0x4b6e, 0x4ba2, 0x4e06, 0x35de, - 0x4e24, 0x4eeb, 0x4fd4, 0x502e, 0x35de, 0x50c1, 0x35de, 0x50d7, - 0x50f2, 0x4891, 0x5338, 0x714c, 0x0000, 0x2021, 0x4000, 0x080c, - 0x4c20, 0x0126, 0x2091, 0x8000, 0x0e04, 0x35bf, 0x0010, 0x012e, - 0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118, 0x7833, 0x0011, 0x0010, - 0x7833, 0x0010, 0x7c82, 0x7986, 0x7a8a, 0x7b8e, 0x2091, 0x4080, - 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11aa, 0x7007, 0x0001, - 0x2091, 0x5000, 0x700f, 0x0000, 0x012e, 0x0005, 0x2021, 0x4001, - 0x08b0, 0x2021, 0x4002, 0x0898, 0x2021, 0x4003, 0x0880, 0x2021, - 0x4005, 0x0868, 0x2021, 0x4006, 0x0850, 0x2039, 0x0001, 0x902e, - 0x2520, 0x7b88, 0x7a8c, 0x7884, 0x7990, 0x81ff, 0x0d98, 0x0804, - 0x4c2d, 0x2039, 0x0001, 0x902e, 0x2520, 0x7b88, 0x7a8c, 0x7884, - 0x7990, 0x0804, 0x4c30, 0x7984, 0x7888, 0x2114, 0x200a, 0x0804, - 0x35b5, 0x7984, 0x2114, 0x0804, 0x35b5, 0x20e1, 0x0000, 0x2099, - 0x0021, 0x20e9, 0x0000, 0x20a1, 0x0021, 0x20a9, 0x001f, 0x4003, - 0x7984, 0x7a88, 0x7b8c, 0x0804, 0x35b5, 0x7884, 0x2060, 0x0804, - 0x366a, 0x2009, 0x0003, 0x2011, 0x0003, 0x2019, 0x0014, 0x789b, - 0x0137, 0x7893, 0xffff, 0x2001, 0x188f, 0x2004, 0x9005, 0x0118, - 0x7896, 0x0804, 0x35b5, 0x7897, 0x0001, 0x0804, 0x35b5, 0x2039, - 0x0001, 0x7d98, 0x7c9c, 0x0804, 0x35f1, 0x2039, 0x0001, 0x7d98, - 0x7c9c, 0x0804, 0x35fd, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, - 0x35ea, 0x2138, 0x7d98, 0x7c9c, 0x0804, 0x35f1, 0x79a0, 0x9182, - 0x0040, 0x0210, 0x0804, 0x35ea, 0x2138, 0x7d98, 0x7c9c, 0x0804, - 0x35fd, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x35ea, 0x21e8, - 0x7984, 0x7888, 0x20a9, 0x0001, 0x21a0, 0x4004, 0x0804, 0x35b5, - 0x2061, 0x0800, 0xe10c, 0x9006, 0x2c15, 0x9200, 0x8c60, 0x8109, - 0x1dd8, 0x2010, 0x9005, 0x0904, 0x35b5, 0x0804, 0x35e4, 0x79a0, - 0x9182, 0x0040, 0x0210, 0x0804, 0x35ea, 0x21e0, 0x20a9, 0x0001, - 0x7984, 0x2198, 0x4012, 0x0804, 0x35b5, 0x2069, 0x1847, 0x7884, - 0x7990, 0x911a, 0x1a04, 0x35ea, 0x8019, 0x0904, 0x35ea, 0x684a, - 0x6942, 0x788c, 0x6852, 0x7888, 0x6856, 0x9006, 0x685a, 0x685e, - 0x080c, 0x7963, 0x0804, 0x35b5, 0x2069, 0x1847, 0x7884, 0x7994, - 0x911a, 0x1a04, 0x35ea, 0x8019, 0x0904, 0x35ea, 0x684e, 0x6946, - 0x788c, 0x6862, 0x7888, 0x6866, 0x9006, 0x686a, 0x686e, 0x0126, - 0x2091, 0x8000, 0x080c, 0x6bf8, 0x012e, 0x0804, 0x35b5, 0x902e, - 0x2520, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x35e7, 0x7984, - 0x7b88, 0x7a8c, 0x20a9, 0x0005, 0x20e9, 0x0001, 0x20a1, 0x18a6, - 0x4101, 0x080c, 0x4be4, 0x1120, 0x2009, 0x0002, 0x0804, 0x35e7, - 0x2009, 0x0020, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4c2d, - 0x701f, 0x36db, 0x0005, 0xa864, 0x2008, 0x9084, 0x00ff, 0x9096, - 0x0011, 0x0168, 0x9096, 0x0019, 0x0150, 0x9096, 0x0015, 0x0138, - 0x9096, 0x0048, 0x0120, 0x9096, 0x0029, 0x1904, 0x35e7, 0x810f, - 0x918c, 0x00ff, 0x0904, 0x35e7, 0x7112, 0x7010, 0x8001, 0x0560, - 0x7012, 0x080c, 0x4be4, 0x1120, 0x2009, 0x0002, 0x0804, 0x35e7, - 0x2009, 0x0020, 0x7068, 0x2040, 0xa28c, 0xa390, 0xa494, 0xa598, - 0x9290, 0x0040, 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000, - 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4c2d, 0x701f, 0x3719, - 0x0005, 0xa864, 0x9084, 0x00ff, 0x9096, 0x0002, 0x0120, 0x9096, - 0x000a, 0x1904, 0x35e7, 0x0888, 0x0126, 0x2091, 0x8000, 0x7014, - 0x2048, 0xa868, 0xc0fd, 0xa86a, 0xa864, 0x9084, 0x00ff, 0x9096, - 0x0029, 0x1148, 0xc2fd, 0xaa7a, 0x080c, 0x629f, 0x0138, 0xa87a, - 0xa982, 0x012e, 0x0060, 0x080c, 0x65cf, 0x1130, 0x7007, 0x0003, - 0x701f, 0x3747, 0x012e, 0x0005, 0x080c, 0x710b, 0x012e, 0x0126, - 0x2091, 0x8000, 0x20a9, 0x0005, 0x20e1, 0x0001, 0x2099, 0x18a6, - 0x400a, 0x2100, 0x9210, 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, - 0x0000, 0xa85c, 0x9080, 0x0019, 0x2009, 0x0020, 0x012e, 0xaf60, - 0x0804, 0x4c30, 0x2091, 0x8000, 0x7837, 0x4000, 0x7833, 0x0010, - 0x7883, 0x4000, 0x7887, 0x4953, 0x788b, 0x5020, 0x788f, 0x2020, - 0x2009, 0x017f, 0x2104, 0x7892, 0x3f00, 0x7896, 0x2061, 0x0100, - 0x6200, 0x2061, 0x0200, 0x603c, 0x8007, 0x9205, 0x789a, 0x2009, - 0x04fd, 0x2104, 0x789e, 0x2091, 0x5000, 0x2091, 0x4080, 0x2001, - 0x0089, 0x2004, 0xd084, 0x0180, 0x2001, 0x1a1c, 0x2004, 0x9005, - 0x0128, 0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, - 0x2003, 0x0002, 0x2003, 0x1001, 0x2071, 0x0080, 0x0804, 0x0427, - 0x81ff, 0x1904, 0x35e7, 0x7984, 0x080c, 0x6724, 0x1904, 0x35ea, - 0x7e98, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1a04, 0x35ea, 0x7c88, - 0x7d8c, 0x080c, 0x6887, 0x080c, 0x6856, 0x0000, 0x1518, 0x2061, - 0x1cd0, 0x0126, 0x2091, 0x8000, 0x6000, 0x9086, 0x0000, 0x0148, - 0x6014, 0x904d, 0x0130, 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, - 0x0150, 0x012e, 0x9ce0, 0x0018, 0x2001, 0x181a, 0x2004, 0x9c02, - 0x1a04, 0x35e7, 0x0c30, 0x080c, 0xccf3, 0x012e, 0x0904, 0x35e7, - 0x0804, 0x35b5, 0x900e, 0x2001, 0x0005, 0x080c, 0x710b, 0x0126, - 0x2091, 0x8000, 0x080c, 0xd3d4, 0x080c, 0x6e9f, 0x012e, 0x0804, - 0x35b5, 0x00a6, 0x2950, 0xb198, 0x080c, 0x6724, 0x1904, 0x3833, - 0xb6a4, 0x9684, 0x3fff, 0x9082, 0x4000, 0x16e8, 0xb49c, 0xb5a0, - 0x080c, 0x6887, 0x080c, 0x6856, 0x1520, 0x2061, 0x1cd0, 0x0126, - 0x2091, 0x8000, 0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x904d, - 0x0130, 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, 0x0158, 0x012e, - 0x9ce0, 0x0018, 0x2001, 0x181a, 0x2004, 0x9c02, 0x2009, 0x000d, - 0x12b0, 0x0c28, 0x080c, 0xccf3, 0x012e, 0x2009, 0x0003, 0x0178, - 0x00e0, 0x900e, 0x2001, 0x0005, 0x080c, 0x710b, 0x0126, 0x2091, - 0x8000, 0x080c, 0xd3d4, 0x080c, 0x6e92, 0x012e, 0x0070, 0xb097, - 0x4005, 0xb19a, 0x0010, 0xb097, 0x4006, 0x900e, 0x9085, 0x0001, - 0x2001, 0x0030, 0x2a48, 0x00ae, 0x0005, 0xb097, 0x4000, 0x9006, - 0x918d, 0x0001, 0x2008, 0x2a48, 0x00ae, 0x0005, 0x81ff, 0x1904, - 0x35e7, 0x080c, 0x4bfb, 0x0904, 0x35ea, 0x080c, 0x67eb, 0x0904, - 0x35e7, 0x080c, 0x688d, 0x0904, 0x35e7, 0x0804, 0x460c, 0x81ff, - 0x1904, 0x35e7, 0x080c, 0x4c17, 0x0904, 0x35ea, 0x080c, 0x691b, - 0x0904, 0x35e7, 0x2019, 0x0005, 0x79a8, 0x080c, 0x68a8, 0x0904, - 0x35e7, 0x7888, 0x908a, 0x1000, 0x1a04, 0x35ea, 0x8003, 0x800b, - 0x810b, 0x9108, 0x080c, 0x884b, 0x79a8, 0xd184, 0x1904, 0x35b5, - 0x0804, 0x460c, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0118, 0x2009, - 0x0001, 0x0450, 0x2029, 0x07ff, 0x645c, 0x2400, 0x9506, 0x01f8, - 0x2508, 0x080c, 0x6724, 0x11d8, 0x080c, 0x691b, 0x1128, 0x2009, - 0x0002, 0x62c0, 0x2518, 0x00c0, 0x2019, 0x0004, 0x900e, 0x080c, - 0x68a8, 0x1118, 0x2009, 0x0006, 0x0078, 0x7884, 0x908a, 0x1000, - 0x1270, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x884b, 0x8529, - 0x1ae0, 0x012e, 0x0804, 0x35b5, 0x012e, 0x0804, 0x35e7, 0x012e, - 0x0804, 0x35ea, 0x080c, 0x4bfb, 0x0904, 0x35ea, 0x080c, 0x67eb, - 0x0904, 0x35e7, 0xbaa0, 0x2019, 0x0005, 0x00c6, 0x9066, 0x080c, - 0x96a4, 0x0076, 0x903e, 0x080c, 0x9577, 0x900e, 0x080c, 0xe91c, - 0x007e, 0x00ce, 0x080c, 0x6887, 0x0804, 0x35b5, 0x080c, 0x4bfb, - 0x0904, 0x35ea, 0x080c, 0x6887, 0x2208, 0x0804, 0x35b5, 0x0156, - 0x00d6, 0x00e6, 0x2069, 0x1910, 0x6810, 0x6914, 0x910a, 0x1208, - 0x900e, 0x6816, 0x9016, 0x901e, 0x20a9, 0x007e, 0x2069, 0x1000, - 0x2d04, 0x905d, 0x0118, 0xb84c, 0x0059, 0x9210, 0x8d68, 0x1f04, - 0x38e8, 0x2300, 0x9218, 0x00ee, 0x00de, 0x015e, 0x0804, 0x35b5, - 0x00f6, 0x0016, 0x907d, 0x0138, 0x9006, 0x8000, 0x2f0c, 0x81ff, - 0x0110, 0x2178, 0x0cd0, 0x001e, 0x00fe, 0x0005, 0x2069, 0x1910, - 0x6910, 0x62bc, 0x0804, 0x35b5, 0x81ff, 0x0120, 0x2009, 0x0001, - 0x0804, 0x35e7, 0x0126, 0x2091, 0x8000, 0x080c, 0x57e9, 0x0128, - 0x2009, 0x0007, 0x012e, 0x0804, 0x35e7, 0x012e, 0x615c, 0x9190, - 0x33b6, 0x2215, 0x9294, 0x00ff, 0x637c, 0x83ff, 0x0108, 0x6280, - 0x67dc, 0x97c4, 0x000a, 0x98c6, 0x000a, 0x1118, 0x2031, 0x0001, - 0x00e8, 0x97c4, 0x0022, 0x98c6, 0x0022, 0x1118, 0x2031, 0x0003, - 0x00a8, 0x97c4, 0x0012, 0x98c6, 0x0012, 0x1118, 0x2031, 0x0002, - 0x0068, 0x080c, 0x7637, 0x1118, 0x2031, 0x0004, 0x0038, 0xd79c, - 0x0120, 0x2009, 0x0005, 0x0804, 0x35e7, 0x9036, 0x7e9a, 0x7f9e, - 0x0804, 0x35b5, 0x614c, 0x6250, 0x2019, 0x1986, 0x231c, 0x2001, - 0x1987, 0x2004, 0x789a, 0x0804, 0x35b5, 0x0126, 0x2091, 0x8000, - 0x6138, 0x623c, 0x6340, 0x012e, 0x0804, 0x35b5, 0x080c, 0x4c17, - 0x0904, 0x35ea, 0xba44, 0xbb38, 0x0804, 0x35b5, 0x080c, 0x0dc5, - 0x080c, 0x4c17, 0x2110, 0x0904, 0x35ea, 0xb804, 0x908c, 0x00ff, - 0x918e, 0x0006, 0x0140, 0x9084, 0xff00, 0x9086, 0x0600, 0x2009, - 0x0009, 0x1904, 0x35e7, 0x0126, 0x2091, 0x8000, 0x2019, 0x0005, - 0x00c6, 0x9066, 0x080c, 0xac6c, 0x080c, 0x96a4, 0x0076, 0x903e, - 0x080c, 0x9577, 0x900e, 0x080c, 0xe91c, 0x007e, 0x00ce, 0xb807, - 0x0407, 0x012e, 0x0804, 0x35b5, 0x614c, 0x6250, 0x7884, 0x604e, - 0x7b88, 0x6352, 0x2069, 0x1847, 0x831f, 0x9305, 0x6816, 0x788c, - 0x2069, 0x1986, 0x2d1c, 0x206a, 0x7e98, 0x9682, 0x0014, 0x1210, - 0x2031, 0x07d0, 0x2069, 0x1987, 0x2d04, 0x266a, 0x789a, 0x0804, - 0x35b5, 0x0126, 0x2091, 0x8000, 0x6138, 0x7884, 0x603a, 0x910e, - 0xd1b4, 0x190c, 0x0ebe, 0xd094, 0x0148, 0x00e6, 0x2071, 0x19fb, - 0x79b4, 0x9192, 0x07d0, 0x1208, 0x713e, 0x00ee, 0xd0c4, 0x01a8, - 0x00d6, 0x78a8, 0x2009, 0x199d, 0x200a, 0x78ac, 0x2011, 0x199e, - 0x2012, 0x2069, 0x0100, 0x6838, 0x9086, 0x0007, 0x1118, 0x2214, - 0x6a5a, 0x0010, 0x210c, 0x695a, 0x00de, 0x7888, 0xd0ec, 0x0178, - 0x6034, 0xc08d, 0x6036, 0x2001, 0x0050, 0x6076, 0x607a, 0x6056, - 0x606b, 0x2450, 0x00c6, 0x2061, 0x1ad1, 0x2062, 0x00ce, 0x2011, - 0x0114, 0x220c, 0x7888, 0xd08c, 0x0118, 0x918d, 0x0080, 0x0010, - 0x918c, 0xff7f, 0x2112, 0x603c, 0x7988, 0x613e, 0x6140, 0x910d, - 0x788c, 0x6042, 0x7a88, 0x9294, 0x1000, 0x9205, 0x910e, 0xd1e4, - 0x190c, 0x0ed4, 0x9084, 0x0020, 0x0130, 0x78b4, 0x6046, 0x9084, - 0x0001, 0x090c, 0x42ec, 0x6040, 0xd0cc, 0x0120, 0x78b0, 0x2011, - 0x0114, 0x2012, 0x012e, 0x0804, 0x35b5, 0x00f6, 0x2079, 0x1800, - 0x7a38, 0xa898, 0x9084, 0xfebf, 0x9215, 0xa89c, 0x9084, 0xfebf, - 0x8002, 0x9214, 0x7838, 0x9084, 0x0140, 0x9215, 0x7a3a, 0xa897, - 0x4000, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x00fe, 0x0005, - 0x7898, 0x9005, 0x01a8, 0x7888, 0x9025, 0x0904, 0x35ea, 0x788c, - 0x902d, 0x0904, 0x35ea, 0x900e, 0x080c, 0x6724, 0x1120, 0xba44, - 0xbb38, 0xbc46, 0xbd3a, 0x9186, 0x07ff, 0x0190, 0x8108, 0x0ca0, - 0x080c, 0x4c17, 0x0904, 0x35ea, 0x7888, 0x900d, 0x0904, 0x35ea, - 0x788c, 0x9005, 0x0904, 0x35ea, 0xba44, 0xb946, 0xbb38, 0xb83a, - 0x0804, 0x35b5, 0x2011, 0xbc09, 0x0010, 0x2011, 0xbc05, 0x080c, - 0x57e9, 0x1904, 0x35e7, 0x00c6, 0x2061, 0x0100, 0x7984, 0x9186, - 0x00ff, 0x1130, 0x2001, 0x1818, 0x2004, 0x9085, 0xff00, 0x0088, - 0x9182, 0x007f, 0x16e0, 0x9188, 0x33b6, 0x210d, 0x918c, 0x00ff, - 0x2001, 0x1818, 0x2004, 0x0026, 0x9116, 0x002e, 0x0580, 0x810f, - 0x9105, 0x0126, 0x2091, 0x8000, 0x0006, 0x080c, 0xb27d, 0x000e, - 0x0510, 0x602e, 0x620a, 0x7984, 0x00b6, 0x080c, 0x66bf, 0x2b08, - 0x00be, 0x1500, 0x6112, 0x6023, 0x0001, 0x080c, 0x4be4, 0x01d0, - 0x9006, 0xa866, 0x7007, 0x0003, 0xa832, 0xa868, 0xc0fd, 0xa86a, - 0x701f, 0x3ac5, 0x2900, 0x6016, 0x2009, 0x0032, 0x080c, 0xb352, - 0x012e, 0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, 0x35e7, 0x00ce, - 0x0804, 0x35ea, 0x080c, 0xb2d3, 0x0cb0, 0xa830, 0x9086, 0x0100, - 0x0904, 0x35e7, 0x0804, 0x35b5, 0x2061, 0x1a74, 0x0126, 0x2091, - 0x8000, 0x6000, 0xd084, 0x0170, 0x6104, 0x6208, 0x2061, 0x1800, - 0x6354, 0x6074, 0x789a, 0x60c0, 0x789e, 0x60bc, 0x78aa, 0x012e, - 0x0804, 0x35b5, 0x900e, 0x2110, 0x0c88, 0x81ff, 0x1904, 0x35e7, - 0x080c, 0x7637, 0x0904, 0x35e7, 0x0126, 0x2091, 0x8000, 0x6254, - 0x6074, 0x9202, 0x0248, 0x9085, 0x0001, 0x080c, 0x28dc, 0x080c, - 0x5a11, 0x012e, 0x0804, 0x35b5, 0x012e, 0x0804, 0x35ea, 0x0006, - 0x0016, 0x00c6, 0x00e6, 0x2001, 0x19aa, 0x2070, 0x2061, 0x1847, - 0x6008, 0x2072, 0x900e, 0x2011, 0x1400, 0x080c, 0x9375, 0x7206, - 0x00ee, 0x00ce, 0x001e, 0x000e, 0x0005, 0x0126, 0x2091, 0x8000, - 0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, 0x0804, 0x35b7, 0x7884, - 0xd0fc, 0x0158, 0x2001, 0x002a, 0x2004, 0x9005, 0x0180, 0x9082, - 0x00e1, 0x0298, 0x012e, 0x0804, 0x35ea, 0x2001, 0x002a, 0x2004, - 0x9005, 0x0128, 0x2069, 0x1847, 0x6908, 0x9102, 0x1230, 0x012e, - 0x0804, 0x35ea, 0x012e, 0x0804, 0x35e7, 0x080c, 0xb23d, 0x0dd0, - 0x7884, 0xd0fc, 0x0904, 0x3b94, 0x00c6, 0x080c, 0x4be4, 0x00ce, - 0x0d88, 0xa867, 0x0000, 0x7884, 0xa80a, 0x7898, 0xa80e, 0x789c, - 0xa812, 0x2001, 0x002e, 0x2004, 0xa81a, 0x2001, 0x002f, 0x2004, - 0xa81e, 0x2001, 0x0030, 0x2004, 0xa822, 0x2001, 0x0031, 0x2004, - 0xa826, 0x2001, 0x0034, 0x2004, 0xa82a, 0x2001, 0x0035, 0x2004, - 0xa82e, 0x2001, 0x002a, 0x2004, 0x9080, 0x0003, 0x9084, 0x00fc, - 0x8004, 0xa816, 0x080c, 0x3d1a, 0x0928, 0x7014, 0x2048, 0xad2c, - 0xac28, 0xab1c, 0xaa18, 0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029, - 0x0000, 0x2021, 0x0000, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, - 0x9084, 0xffc0, 0x9080, 0x001b, 0x080c, 0x4c2d, 0x701f, 0x3c57, - 0x7023, 0x0001, 0x012e, 0x0005, 0x0046, 0x0086, 0x0096, 0x00a6, - 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x3aff, 0x2001, - 0x19a0, 0x2003, 0x0000, 0x2021, 0x000a, 0x2061, 0x0100, 0x6104, - 0x0016, 0x60bb, 0x0000, 0x60bf, 0x32e1, 0x60bf, 0x0012, 0x080c, - 0x3d89, 0x080c, 0x3d48, 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, - 0x1a69, 0x2079, 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, - 0x0140, 0x2001, 0x0035, 0x2004, 0x780e, 0x2001, 0x0034, 0x2004, - 0x780a, 0x00de, 0x2011, 0x0001, 0x080c, 0x4130, 0x008e, 0x00ee, - 0x00fe, 0x080c, 0x4052, 0x080c, 0x3f57, 0x05b8, 0x2001, 0x020b, - 0x2004, 0x9084, 0x0140, 0x1db8, 0x080c, 0x41a4, 0x00f6, 0x2079, - 0x0300, 0x78bc, 0x00fe, 0x908c, 0x0070, 0x1560, 0x2071, 0x0200, - 0x7037, 0x0000, 0x7050, 0x9084, 0xff00, 0x9086, 0x3200, 0x1510, - 0x7037, 0x0001, 0x7050, 0x9084, 0xff00, 0x9086, 0xe100, 0x11d0, - 0x7037, 0x0000, 0x7054, 0x7037, 0x0000, 0x715c, 0x9106, 0x1190, - 0x2001, 0x1820, 0x2004, 0x9106, 0x1168, 0x00c6, 0x2061, 0x0100, - 0x6024, 0x9084, 0x1e00, 0x00ce, 0x0138, 0x080c, 0x3f61, 0x080c, - 0x3d43, 0x0058, 0x080c, 0x3d43, 0x080c, 0x40c8, 0x080c, 0x4048, - 0x2001, 0x020b, 0x2004, 0xd0e4, 0x0dd8, 0x2001, 0x032a, 0x2003, - 0x0004, 0x2061, 0x0100, 0x6027, 0x0002, 0x001e, 0x6106, 0x2011, - 0x020d, 0x2013, 0x0020, 0x60bb, 0x0000, 0x60bf, 0x0108, 0x60bf, - 0x0012, 0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x080c, - 0x12fc, 0x2009, 0x0028, 0x080c, 0x2409, 0x2001, 0x0227, 0x200c, - 0x2102, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, - 0x008e, 0x004e, 0x2001, 0x19a0, 0x2004, 0x9005, 0x1118, 0x012e, - 0x0804, 0x35b5, 0x012e, 0x2021, 0x400c, 0x0804, 0x35b7, 0x0016, - 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, 0x0086, 0x0096, 0x00d6, - 0x0156, 0x7014, 0x2048, 0x7020, 0x20a8, 0x8000, 0x7022, 0xa804, - 0x9005, 0x0904, 0x3cb3, 0x2048, 0x1f04, 0x3c67, 0x7068, 0x2040, - 0xa28c, 0xa390, 0xa494, 0xa598, 0xa930, 0xa808, 0xd0b4, 0x1120, - 0x2029, 0x0000, 0x2021, 0x0000, 0x0096, 0x7014, 0x2048, 0xa864, - 0x009e, 0x9086, 0x0103, 0x0170, 0x8906, 0x8006, 0x8007, 0x90bc, - 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x080c, 0x4c2d, 0x701f, - 0x3c57, 0x00b0, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, - 0xffc0, 0x9080, 0x001b, 0x21a8, 0x27e0, 0x2098, 0x27e8, 0x20a0, - 0x0006, 0x080c, 0x0f8b, 0x000e, 0x080c, 0x4c30, 0x701f, 0x3c57, - 0x015e, 0x00de, 0x009e, 0x008e, 0x007e, 0x005e, 0x004e, 0x003e, - 0x002e, 0x001e, 0x0005, 0x7014, 0x2048, 0xa864, 0x9086, 0x0103, - 0x1118, 0x701f, 0x3d18, 0x0450, 0x7014, 0x2048, 0xa868, 0xc0fd, - 0xa86a, 0x2009, 0x007f, 0x080c, 0x66b9, 0x0110, 0x9006, 0x0030, - 0xb813, 0x00ff, 0xb817, 0xfffd, 0x080c, 0xd5a7, 0x015e, 0x00de, - 0x009e, 0x008e, 0x007e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, - 0x0904, 0x35e7, 0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, - 0x0086, 0x0096, 0x00d6, 0x0156, 0x701f, 0x3cea, 0x7007, 0x0003, - 0x0804, 0x3ca8, 0xa830, 0x9086, 0x0100, 0x2021, 0x400c, 0x0904, - 0x35b7, 0x0076, 0xad10, 0xac0c, 0xab24, 0xaa20, 0xa930, 0xa808, - 0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021, 0x0000, 0x8906, 0x8006, - 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x21a8, - 0x27e0, 0x2098, 0x27e8, 0x20a0, 0x0006, 0x080c, 0x0f8b, 0x000e, - 0x080c, 0x4c30, 0x007e, 0x701f, 0x3c57, 0x7023, 0x0001, 0x0005, - 0x0804, 0x35b5, 0x0156, 0x00c6, 0xa814, 0x908a, 0x001e, 0x0218, - 0xa833, 0x001e, 0x0010, 0xa832, 0x0078, 0x81ff, 0x0168, 0x0016, - 0x080c, 0x4be4, 0x001e, 0x0130, 0xa800, 0x2040, 0xa008, 0xa80a, - 0x2100, 0x0c58, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ce, 0x015e, - 0x0005, 0x0006, 0x00f6, 0x2079, 0x0000, 0x7880, 0x9086, 0x0044, - 0x00fe, 0x000e, 0x0005, 0x2001, 0x19a0, 0x2003, 0x0001, 0x0005, - 0x00f6, 0x00e6, 0x00c6, 0x2061, 0x0200, 0x2001, 0x19ab, 0x2004, - 0x601a, 0x2061, 0x0100, 0x2001, 0x19aa, 0x2004, 0x60ce, 0x6104, - 0xc1ac, 0x6106, 0x080c, 0x4be4, 0xa813, 0x0019, 0xa817, 0x0001, - 0x2900, 0xa85a, 0x2001, 0x002e, 0x2004, 0xa866, 0x2001, 0x002f, - 0x2004, 0xa86a, 0x2061, 0x0090, 0x2079, 0x0100, 0x2001, 0x19aa, - 0x2004, 0x6036, 0x2009, 0x0040, 0x080c, 0x2409, 0x2001, 0x002a, - 0x2004, 0x9084, 0xfff8, 0xa86e, 0x601a, 0xa873, 0x0000, 0x601f, - 0x0000, 0x78ca, 0x9006, 0x600a, 0x600e, 0x00ce, 0x00ee, 0x00fe, - 0x0005, 0x00e6, 0x080c, 0x4be4, 0x2940, 0xa013, 0x0019, 0xa017, - 0x0001, 0x2800, 0xa05a, 0x2001, 0x0030, 0x2004, 0xa866, 0x2001, - 0x0031, 0x2004, 0xa86a, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, - 0xa86e, 0xa873, 0x0000, 0x2001, 0x032a, 0x2003, 0x0004, 0x2001, - 0x0300, 0x2003, 0x0000, 0x2001, 0x020d, 0x2003, 0x0000, 0x2001, - 0x0004, 0x200c, 0x918d, 0x0002, 0x2102, 0x00ee, 0x0005, 0x0126, - 0x2091, 0x8000, 0x81ff, 0x0148, 0x080c, 0x2c59, 0x1130, 0x9006, - 0x080c, 0x2bb1, 0x9006, 0x080c, 0x2b94, 0x2001, 0x199f, 0x2003, - 0x0000, 0x7884, 0x9084, 0x0007, 0x0002, 0x3dd8, 0x3de1, 0x3dea, - 0x3dd5, 0x3dd5, 0x3dd5, 0x3dd5, 0x3dd5, 0x012e, 0x0804, 0x35ea, - 0x2009, 0x0114, 0x2104, 0x9085, 0x0800, 0x200a, 0x080c, 0x3fab, - 0x00c0, 0x2009, 0x0114, 0x2104, 0x9085, 0x4000, 0x200a, 0x080c, - 0x3fab, 0x0078, 0x080c, 0x7637, 0x1128, 0x012e, 0x2009, 0x0016, - 0x0804, 0x35e7, 0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, 0x0804, - 0x35b7, 0x2001, 0x0141, 0x2004, 0xd0dc, 0x0db0, 0x0086, 0x0096, - 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x3aff, - 0x2009, 0x0101, 0x210c, 0x0016, 0x7ec8, 0x7dcc, 0x9006, 0x2068, - 0x2060, 0x2058, 0x080c, 0x427f, 0x080c, 0x41cf, 0x903e, 0x2720, - 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, 0x1a69, 0x2079, 0x0090, - 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0120, 0x68d4, 0x780e, - 0x68d0, 0x780a, 0x00de, 0x2011, 0x0001, 0x080c, 0x4130, 0x080c, - 0x2c61, 0x080c, 0x2c61, 0x080c, 0x2c61, 0x080c, 0x2c61, 0x080c, - 0x4130, 0x008e, 0x00ee, 0x00fe, 0x080c, 0x4052, 0x2009, 0x9c40, - 0x8109, 0x11b0, 0x080c, 0x3f61, 0x2001, 0x0004, 0x200c, 0x918c, - 0xfffd, 0x2102, 0x001e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, - 0x00ae, 0x009e, 0x008e, 0x2009, 0x0017, 0x080c, 0x35e7, 0x0cf8, - 0x2001, 0x020b, 0x2004, 0x9084, 0x0140, 0x1d10, 0x00f6, 0x2079, - 0x0000, 0x7884, 0x00fe, 0xd0bc, 0x0178, 0x2001, 0x0201, 0x200c, - 0x81ff, 0x0150, 0x080c, 0x4030, 0x2d00, 0x9c05, 0x9b05, 0x0120, - 0x080c, 0x3f61, 0x0804, 0x3f0e, 0x080c, 0x41a4, 0x080c, 0x40c8, - 0x080c, 0x4013, 0x080c, 0x4048, 0x00f6, 0x2079, 0x0100, 0x7824, - 0xd0ac, 0x0130, 0x8b58, 0x080c, 0x3f61, 0x00fe, 0x0804, 0x3f0e, - 0x00fe, 0x080c, 0x3f57, 0x1150, 0x8d68, 0x2001, 0x0032, 0x2602, - 0x2001, 0x0033, 0x2502, 0x080c, 0x3f61, 0x0080, 0x87ff, 0x0138, - 0x2001, 0x0201, 0x2004, 0x9005, 0x1908, 0x8739, 0x0038, 0x2001, - 0x1a65, 0x2004, 0x9086, 0x0000, 0x1904, 0x3e5e, 0x2001, 0x032f, - 0x2003, 0x00f6, 0x8631, 0x1208, 0x8529, 0x2500, 0x9605, 0x0904, - 0x3f0e, 0x7884, 0xd0bc, 0x0128, 0x2d00, 0x9c05, 0x9b05, 0x1904, - 0x3f0e, 0xa013, 0x0019, 0x2001, 0x032a, 0x2003, 0x0004, 0x7884, - 0xd0ac, 0x1148, 0x2001, 0x1a65, 0x2003, 0x0003, 0x2001, 0x032a, - 0x2003, 0x0009, 0x0030, 0xa017, 0x0001, 0x78b4, 0x9005, 0x0108, - 0xa016, 0x2800, 0xa05a, 0x2009, 0x0040, 0x080c, 0x2409, 0x2900, - 0xa85a, 0xa813, 0x0019, 0x7884, 0xd0a4, 0x1180, 0xa817, 0x0000, - 0x00c6, 0x20a9, 0x0004, 0x2061, 0x0090, 0x602b, 0x0008, 0x2001, - 0x0203, 0x2004, 0x1f04, 0x3ee5, 0x00ce, 0x0030, 0xa817, 0x0001, - 0x78b0, 0x9005, 0x0108, 0xa816, 0x00f6, 0x00c6, 0x2079, 0x0100, - 0x2061, 0x0090, 0x7827, 0x0002, 0x2001, 0x002a, 0x2004, 0x9084, - 0xfff8, 0x601a, 0x0006, 0x2001, 0x002b, 0x2004, 0x601e, 0x78c6, - 0x000e, 0x78ca, 0x00ce, 0x00fe, 0x0804, 0x3e18, 0x001e, 0x00c6, - 0x2001, 0x032a, 0x2003, 0x0004, 0x2061, 0x0100, 0x6027, 0x0002, - 0x6106, 0x2011, 0x020d, 0x2013, 0x0020, 0x2001, 0x0004, 0x200c, - 0x918c, 0xfffd, 0x2102, 0x080c, 0x12fc, 0x7884, 0x9084, 0x0003, - 0x9086, 0x0002, 0x01a0, 0x2009, 0x0028, 0x080c, 0x2409, 0x2001, - 0x0227, 0x200c, 0x2102, 0x6050, 0x9084, 0xb7ef, 0x6052, 0x602f, - 0x0000, 0x604b, 0xf7f7, 0x6043, 0x0090, 0x6043, 0x0010, 0x00ce, - 0x2d08, 0x2c10, 0x2b18, 0x2b00, 0x9c05, 0x9d05, 0x00fe, 0x00ee, - 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x1118, 0x012e, - 0x0804, 0x35b5, 0x012e, 0x2021, 0x400c, 0x0804, 0x35b7, 0x9085, - 0x0001, 0x1d04, 0x3f60, 0x2091, 0x6000, 0x8420, 0x9486, 0x0064, - 0x0005, 0x2001, 0x0105, 0x2003, 0x0010, 0x2001, 0x032a, 0x2003, - 0x0004, 0x2001, 0x1a65, 0x2003, 0x0000, 0x0071, 0x2009, 0x0048, - 0x080c, 0x2409, 0x2001, 0x0227, 0x2024, 0x2402, 0x2001, 0x0109, - 0x2003, 0x4000, 0x9026, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a69, - 0x7000, 0x9086, 0x0000, 0x0520, 0x2079, 0x0090, 0x2009, 0x0206, - 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, 0x1120, 0x2009, 0x0040, - 0x080c, 0x2409, 0x782c, 0xd0fc, 0x0d88, 0x080c, 0x41a4, 0x7000, - 0x9086, 0x0000, 0x1d58, 0x782b, 0x0004, 0x782c, 0xd0ac, 0x1de8, - 0x2009, 0x0040, 0x080c, 0x2409, 0x782b, 0x0002, 0x7003, 0x0000, - 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0100, 0x2001, 0x1818, - 0x200c, 0x7932, 0x7936, 0x080c, 0x28bc, 0x7850, 0x9084, 0xfbff, - 0x9085, 0x0030, 0x7852, 0x2019, 0x01f4, 0x8319, 0x1df0, 0x9084, - 0xffcf, 0x9085, 0x2000, 0x7852, 0x20a9, 0x0046, 0x1d04, 0x3fc6, - 0x2091, 0x6000, 0x1f04, 0x3fc6, 0x7850, 0x9085, 0x0400, 0x9084, - 0xdfff, 0x7852, 0x2001, 0x0021, 0x2004, 0x9084, 0x0003, 0x9086, - 0x0001, 0x1120, 0x7850, 0x9084, 0xdfff, 0x7852, 0x784b, 0xf7f7, - 0x7843, 0x0090, 0x7843, 0x0010, 0x20a9, 0x0028, 0xa001, 0x1f04, - 0x3fe6, 0x7850, 0x9085, 0x1400, 0x7852, 0x2019, 0x61a8, 0x7854, - 0xa001, 0xa001, 0xd08c, 0x1110, 0x8319, 0x1dc8, 0x7827, 0x0048, - 0x7850, 0x9085, 0x0400, 0x7852, 0x7843, 0x0040, 0x2019, 0x01f4, - 0xa001, 0xa001, 0x8319, 0x1de0, 0x2001, 0x0100, 0x080c, 0x2d39, - 0x7827, 0x0020, 0x7843, 0x0000, 0x9006, 0x080c, 0x2d39, 0x7827, - 0x0048, 0x00fe, 0x0005, 0x7884, 0xd0ac, 0x11c8, 0x00f6, 0x00e6, - 0x2071, 0x1a65, 0x2079, 0x0320, 0x2001, 0x0201, 0x2004, 0x9005, - 0x0160, 0x7000, 0x9086, 0x0000, 0x1140, 0x0051, 0xd0bc, 0x0108, - 0x8738, 0x7003, 0x0003, 0x782b, 0x0019, 0x00ee, 0x00fe, 0x0005, - 0x00f6, 0x2079, 0x0300, 0x78bc, 0x00fe, 0x908c, 0x0070, 0x0178, - 0x2009, 0x0032, 0x260a, 0x2009, 0x0033, 0x250a, 0xd0b4, 0x0108, - 0x8c60, 0xd0ac, 0x0108, 0x8d68, 0xd0a4, 0x0108, 0x8b58, 0x0005, - 0x00f6, 0x2079, 0x0200, 0x781c, 0xd084, 0x0110, 0x7837, 0x0050, - 0x00fe, 0x0005, 0x00e6, 0x2071, 0x0100, 0x2001, 0x19ab, 0x2004, - 0x70e2, 0x080c, 0x3d39, 0x1188, 0x2001, 0x1820, 0x2004, 0x2009, - 0x181f, 0x210c, 0x918c, 0x00ff, 0x706e, 0x716a, 0x7066, 0x918d, - 0x3200, 0x7162, 0x7073, 0xe109, 0x0080, 0x702c, 0x9085, 0x0002, - 0x702e, 0x2009, 0x1818, 0x210c, 0x716e, 0x7063, 0x0100, 0x7166, - 0x719e, 0x706b, 0x0000, 0x7073, 0x0809, 0x7077, 0x0008, 0x7078, - 0x9080, 0x0100, 0x707a, 0x7080, 0x8000, 0x7082, 0x7087, 0xaaaa, - 0x9006, 0x708a, 0x708e, 0x707e, 0x70d6, 0x70ab, 0x0036, 0x70af, - 0x95d5, 0x7014, 0x9084, 0x1984, 0x9085, 0x0092, 0x7016, 0x080c, - 0x41a4, 0x00f6, 0x2071, 0x1a65, 0x2079, 0x0320, 0x00d6, 0x2069, - 0x0000, 0x6884, 0xd0b4, 0x0120, 0x689c, 0x780e, 0x6898, 0x780a, - 0x00de, 0x080c, 0x3d39, 0x0140, 0x2001, 0x199f, 0x200c, 0x2003, - 0x0001, 0x918e, 0x0001, 0x0120, 0x2009, 0x03e8, 0x8109, 0x1df0, - 0x792c, 0xd1fc, 0x0110, 0x782b, 0x0004, 0x2011, 0x0011, 0x080c, - 0x4130, 0x2011, 0x0001, 0x080c, 0x4130, 0x00fe, 0x00ee, 0x0005, - 0x00f6, 0x00e6, 0x2071, 0x1a65, 0x2079, 0x0320, 0x792c, 0xd1fc, - 0x0904, 0x412d, 0x782b, 0x0002, 0x9026, 0xd19c, 0x1904, 0x4129, - 0x7000, 0x0002, 0x412d, 0x40de, 0x410e, 0x4129, 0xd1bc, 0x1170, - 0xd1dc, 0x1190, 0x8001, 0x7002, 0x2011, 0x0001, 0x080c, 0x4130, - 0x0904, 0x412d, 0x080c, 0x4130, 0x0804, 0x412d, 0x00f6, 0x2079, - 0x0300, 0x78bf, 0x0000, 0x00fe, 0x7810, 0x7914, 0x782b, 0x0004, - 0x7812, 0x7916, 0x2001, 0x0201, 0x200c, 0x81ff, 0x0de8, 0x080c, - 0x4030, 0x2009, 0x0001, 0x00f6, 0x2079, 0x0300, 0x78b8, 0x00fe, - 0xd0ec, 0x0110, 0x2009, 0x0011, 0x792a, 0x00f8, 0x8001, 0x7002, - 0x9184, 0x0880, 0x1140, 0x782c, 0xd0fc, 0x1904, 0x40d2, 0x2011, - 0x0001, 0x00b1, 0x0090, 0xa010, 0x9092, 0x0004, 0x9086, 0x0015, - 0x1120, 0xa000, 0xa05a, 0x2011, 0x0031, 0xa212, 0xd1dc, 0x1960, - 0x0828, 0x782b, 0x0004, 0x7003, 0x0000, 0x00ee, 0x00fe, 0x0005, - 0xa014, 0x9005, 0x0550, 0x8001, 0x0036, 0x0096, 0xa016, 0xa058, - 0x2048, 0xa010, 0x2009, 0x0031, 0x911a, 0x831c, 0x831c, 0x938a, - 0x0007, 0x1a0c, 0x0dc5, 0x9398, 0x415e, 0x231d, 0x083f, 0x9080, - 0x0004, 0x7a2a, 0x7100, 0x8108, 0x7102, 0x009e, 0x003e, 0x908a, - 0x0035, 0x1140, 0x0096, 0xa058, 0x2048, 0xa804, 0xa05a, 0x2001, - 0x0019, 0x009e, 0xa012, 0x9085, 0x0001, 0x0005, 0x419b, 0x4192, - 0x4189, 0x4180, 0x4177, 0x416e, 0x4165, 0xa964, 0x7902, 0xa968, - 0x7906, 0xa96c, 0x7912, 0xa970, 0x7916, 0x0005, 0xa974, 0x7902, - 0xa978, 0x7906, 0xa97c, 0x7912, 0xa980, 0x7916, 0x0005, 0xa984, - 0x7902, 0xa988, 0x7906, 0xa98c, 0x7912, 0xa990, 0x7916, 0x0005, - 0xa994, 0x7902, 0xa998, 0x7906, 0xa99c, 0x7912, 0xa9a0, 0x7916, - 0x0005, 0xa9a4, 0x7902, 0xa9a8, 0x7906, 0xa9ac, 0x7912, 0xa9b0, - 0x7916, 0x0005, 0xa9b4, 0x7902, 0xa9b8, 0x7906, 0xa9bc, 0x7912, - 0xa9c0, 0x7916, 0x0005, 0xa9c4, 0x7902, 0xa9c8, 0x7906, 0xa9cc, - 0x7912, 0xa9d0, 0x7916, 0x0005, 0x00f6, 0x00e6, 0x0086, 0x2071, - 0x1a69, 0x2079, 0x0090, 0x792c, 0xd1fc, 0x01e8, 0x782b, 0x0002, - 0x2940, 0x9026, 0x7000, 0x0002, 0x41cb, 0x41b7, 0x41c2, 0x8001, - 0x7002, 0xd19c, 0x1180, 0x2011, 0x0001, 0x080c, 0x4130, 0x190c, - 0x4130, 0x0048, 0x8001, 0x7002, 0x782c, 0xd0fc, 0x1d38, 0x2011, - 0x0001, 0x080c, 0x4130, 0x008e, 0x00ee, 0x00fe, 0x0005, 0x00f6, - 0x00e6, 0x00c6, 0x0086, 0x2061, 0x0200, 0x2001, 0x19ab, 0x2004, - 0x601a, 0x2061, 0x0100, 0x2001, 0x19aa, 0x2004, 0x60ce, 0x6104, - 0xc1ac, 0x6106, 0x2001, 0x002c, 0x2004, 0x9005, 0x0520, 0x2038, - 0x2001, 0x002e, 0x2024, 0x2001, 0x002f, 0x201c, 0x080c, 0x4be4, - 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007, 0x0220, - 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x0096, 0xa858, - 0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, 0x4247, 0x1d68, - 0x2900, 0xa85a, 0x00d0, 0x080c, 0x4be4, 0xa813, 0x0019, 0xa817, - 0x0001, 0x2900, 0xa85a, 0x2001, 0x002e, 0x2004, 0xa866, 0x2001, - 0x002f, 0x2004, 0xa86a, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, - 0xa86e, 0x2001, 0x002b, 0x2004, 0xa872, 0x2061, 0x0090, 0x2079, - 0x0100, 0x2001, 0x19aa, 0x2004, 0x6036, 0x2009, 0x0040, 0x080c, - 0x2409, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0x601a, 0x0006, - 0x2001, 0x002b, 0x2004, 0x601e, 0x78c6, 0x000e, 0x78ca, 0x9006, - 0x600a, 0x600e, 0x008e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00e6, - 0x2071, 0x0080, 0xaa60, 0x22e8, 0x20a0, 0x20e1, 0x0000, 0x2099, - 0x0088, 0x702b, 0x0026, 0x7402, 0x7306, 0x9006, 0x700a, 0x700e, - 0x810b, 0x810b, 0x21a8, 0x810b, 0x7112, 0x702b, 0x0041, 0x702c, - 0xd0fc, 0x0de8, 0x702b, 0x0002, 0x702b, 0x0040, 0x4005, 0x7400, - 0x7304, 0x87ff, 0x0190, 0x0086, 0x0096, 0x2940, 0x0086, 0x080c, - 0x4be4, 0x008e, 0xa058, 0x00a6, 0x2050, 0x2900, 0xb006, 0xa05a, - 0x00ae, 0x009e, 0x008e, 0x9085, 0x0001, 0x00ee, 0x0005, 0x00e6, - 0x2001, 0x002d, 0x2004, 0x9005, 0x0528, 0x2038, 0x2001, 0x0030, - 0x2024, 0x2001, 0x0031, 0x201c, 0x080c, 0x4be4, 0x2940, 0xa813, - 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007, 0x0220, 0x2138, - 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x0096, 0xa858, 0x2048, - 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, 0x4247, 0x1d68, 0x2900, - 0xa85a, 0x00d8, 0x080c, 0x4be4, 0x2940, 0xa013, 0x0019, 0xa017, - 0x0001, 0x2800, 0xa05a, 0x2001, 0x0030, 0x2004, 0xa066, 0x2001, - 0x0031, 0x2004, 0xa06a, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, - 0xa06e, 0x2001, 0x002b, 0x2004, 0xa072, 0x2001, 0x032a, 0x2003, - 0x0004, 0x7884, 0xd0ac, 0x1180, 0x2001, 0x0101, 0x200c, 0x918d, - 0x0200, 0x2102, 0xa017, 0x0000, 0x2001, 0x1a65, 0x2003, 0x0003, - 0x2001, 0x032a, 0x2003, 0x0009, 0x2001, 0x0300, 0x2003, 0x0000, - 0x2001, 0x020d, 0x2003, 0x0000, 0x2001, 0x0004, 0x200c, 0x918d, - 0x0002, 0x2102, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x20a9, - 0x0007, 0x20a1, 0x1840, 0x20e9, 0x0001, 0x9006, 0x4004, 0x20a9, - 0x0014, 0x20a1, 0xffec, 0x20e9, 0x0000, 0x9006, 0x4004, 0x2009, - 0x013c, 0x200a, 0x012e, 0x7880, 0x9086, 0x0052, 0x0108, 0x0005, - 0x0804, 0x35b5, 0x7d98, 0x7c9c, 0x0804, 0x36b9, 0x080c, 0x7637, - 0x190c, 0x60f3, 0x6040, 0x9084, 0x0020, 0x09b1, 0x2069, 0x1847, - 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, - 0x0001, 0x080c, 0x4c2d, 0x701f, 0x4326, 0x0005, 0x080c, 0x57e4, - 0x1130, 0x3b00, 0x3a08, 0xc194, 0xc095, 0x20d8, 0x21d0, 0x2069, - 0x1847, 0x6800, 0x9005, 0x0904, 0x35ea, 0x2001, 0x180d, 0x2004, - 0xd08c, 0x6804, 0x0118, 0xc0a4, 0xc0ac, 0x6806, 0xd0ac, 0x0118, - 0xd0a4, 0x0904, 0x35ea, 0xd094, 0x00c6, 0x2061, 0x0100, 0x6104, - 0x0138, 0x6200, 0x9292, 0x0005, 0x0218, 0x918c, 0xffdf, 0x0010, - 0x918d, 0x0020, 0x6106, 0x00ce, 0xd08c, 0x00c6, 0x2061, 0x0100, - 0x6104, 0x0118, 0x918d, 0x0010, 0x0010, 0x918c, 0xffef, 0x6106, - 0x00ce, 0xd084, 0x0158, 0x6a28, 0x928a, 0x007f, 0x1a04, 0x35ea, - 0x9288, 0x33b6, 0x210d, 0x918c, 0x00ff, 0x6166, 0xd0dc, 0x0130, - 0x6828, 0x908a, 0x007f, 0x1a04, 0x35ea, 0x605e, 0x6888, 0x9084, - 0x0030, 0x8004, 0x8004, 0x8004, 0x8004, 0x0006, 0x2009, 0x19b2, - 0x9080, 0x29b7, 0x2005, 0x200a, 0x000e, 0x2009, 0x19b3, 0x9080, - 0x29bb, 0x2005, 0x200a, 0x6808, 0x908a, 0x0100, 0x0a04, 0x35ea, - 0x908a, 0x0841, 0x1a04, 0x35ea, 0x9084, 0x0007, 0x1904, 0x35ea, - 0x680c, 0x9005, 0x0904, 0x35ea, 0x6810, 0x9005, 0x0904, 0x35ea, - 0x6848, 0x6940, 0x910a, 0x1a04, 0x35ea, 0x8001, 0x0904, 0x35ea, - 0x684c, 0x6944, 0x910a, 0x1a04, 0x35ea, 0x8001, 0x0904, 0x35ea, - 0x2009, 0x1981, 0x200b, 0x0000, 0x2001, 0x1869, 0x2004, 0xd0c4, - 0x0140, 0x7884, 0x200a, 0x2008, 0x080c, 0x0e52, 0x3b00, 0xc085, - 0x20d8, 0x6814, 0x908c, 0x00ff, 0x614e, 0x8007, 0x9084, 0x00ff, - 0x6052, 0x080c, 0x7963, 0x080c, 0x6b8e, 0x080c, 0x6bf8, 0x6808, - 0x602a, 0x080c, 0x237b, 0x2009, 0x0170, 0x200b, 0x0080, 0xa001, - 0xa001, 0x200b, 0x0000, 0x0036, 0x6b08, 0x080c, 0x2916, 0x003e, - 0x6000, 0x9086, 0x0000, 0x1904, 0x44cf, 0x6818, 0x691c, 0x6a20, - 0x6b24, 0x8007, 0x810f, 0x8217, 0x831f, 0x6016, 0x611a, 0x621e, - 0x6322, 0x6c04, 0xd4f4, 0x0148, 0x6830, 0x6934, 0x6a38, 0x6b3c, - 0x8007, 0x810f, 0x8217, 0x831f, 0x0010, 0x9084, 0xf0ff, 0x6006, - 0x610a, 0x620e, 0x6312, 0x8007, 0x810f, 0x8217, 0x831f, 0x20a9, - 0x0004, 0x20a1, 0x19b4, 0x20e9, 0x0001, 0x4001, 0x20a9, 0x0004, - 0x20a1, 0x19ce, 0x20e9, 0x0001, 0x4001, 0x080c, 0x8962, 0x00c6, - 0x900e, 0x20a9, 0x0001, 0x6b70, 0xd384, 0x0510, 0x0068, 0x2009, - 0x0100, 0x210c, 0x918e, 0x0008, 0x1110, 0x839d, 0x0010, 0x83f5, - 0x3e18, 0x12b0, 0x3508, 0x8109, 0x080c, 0x7f6f, 0x6878, 0x6016, - 0x6874, 0x2008, 0x9084, 0xff00, 0x8007, 0x600a, 0x9184, 0x00ff, - 0x6006, 0x8108, 0x1118, 0x6003, 0x0003, 0x0010, 0x6003, 0x0001, - 0x1f04, 0x441f, 0x00ce, 0x00c6, 0x2061, 0x199c, 0x2001, 0x180d, - 0x2004, 0xd08c, 0x11a8, 0x6a88, 0x9284, 0xc000, 0x2010, 0x9286, - 0x0000, 0x1158, 0x2063, 0x0000, 0x2001, 0x0001, 0x080c, 0x2bb1, - 0x2001, 0x0001, 0x080c, 0x2b94, 0x0088, 0x9286, 0x4000, 0x1148, - 0x2063, 0x0001, 0x9006, 0x080c, 0x2bb1, 0x9006, 0x080c, 0x2b94, - 0x0028, 0x9286, 0x8000, 0x1d30, 0x2063, 0x0002, 0x00ce, 0x00e6, - 0x2c70, 0x080c, 0x0ea3, 0x00ee, 0x6888, 0xd0ec, 0x0130, 0x2011, - 0x0114, 0x2204, 0x9085, 0x0100, 0x2012, 0x6a80, 0x9284, 0x0030, - 0x9086, 0x0030, 0x1128, 0x9294, 0xffcf, 0x9295, 0x0020, 0x6a82, - 0x2001, 0x197c, 0x6a80, 0x9294, 0x0030, 0x928e, 0x0000, 0x0170, - 0x928e, 0x0010, 0x0118, 0x928e, 0x0020, 0x0140, 0x2003, 0xaaaa, - 0x080c, 0x298b, 0x2001, 0x196d, 0x2102, 0x0008, 0x2102, 0x00c6, - 0x2061, 0x0100, 0x602f, 0x0040, 0x602f, 0x0000, 0x00ce, 0x080c, - 0x7637, 0x0128, 0x080c, 0x50cb, 0x0110, 0x080c, 0x28dc, 0x60d4, - 0x9005, 0x01c0, 0x6003, 0x0001, 0x2009, 0x44b7, 0x00e0, 0x080c, - 0x7637, 0x1168, 0x2011, 0x74b2, 0x080c, 0x883d, 0x2011, 0x74a5, - 0x080c, 0x8917, 0x080c, 0x7937, 0x080c, 0x7563, 0x0040, 0x080c, - 0x5fed, 0x0028, 0x6003, 0x0004, 0x2009, 0x44cf, 0x0020, 0x080c, - 0x6a05, 0x0804, 0x35b5, 0x2001, 0x0170, 0x2004, 0x9084, 0x00ff, - 0x9086, 0x004c, 0x1118, 0x2091, 0x30bd, 0x0817, 0x2091, 0x303d, - 0x0817, 0x6000, 0x9086, 0x0000, 0x0904, 0x35e7, 0x2069, 0x1847, - 0x7890, 0x6842, 0x7894, 0x6846, 0x2d00, 0x2009, 0x0030, 0x7a8c, - 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x0804, 0x4c30, 0x9006, - 0x080c, 0x28dc, 0x81ff, 0x1904, 0x35e7, 0x080c, 0x7637, 0x11b0, - 0x080c, 0x7932, 0x080c, 0x612e, 0x080c, 0x33aa, 0x0118, 0x6130, - 0xc18d, 0x6132, 0x080c, 0xd7e3, 0x0130, 0x080c, 0x765a, 0x1118, - 0x080c, 0x760f, 0x0038, 0x080c, 0x7563, 0x0020, 0x080c, 0x60f3, - 0x080c, 0x5fed, 0x0804, 0x35b5, 0x81ff, 0x1904, 0x35e7, 0x080c, - 0x7637, 0x1110, 0x0804, 0x35e7, 0x0126, 0x2091, 0x8000, 0x6194, - 0x81ff, 0x0190, 0x704f, 0x0000, 0x2001, 0x1c80, 0x2009, 0x0040, - 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x080c, 0x4c30, - 0x701f, 0x35b3, 0x012e, 0x0005, 0x704f, 0x0001, 0x00d6, 0x2069, - 0x1c80, 0x20a9, 0x0040, 0x20e9, 0x0001, 0x20a1, 0x1c80, 0x2019, - 0xffff, 0x4304, 0x655c, 0x9588, 0x33b6, 0x210d, 0x918c, 0x00ff, - 0x216a, 0x900e, 0x2011, 0x0002, 0x2100, 0x9506, 0x01a8, 0x080c, - 0x6724, 0x1190, 0xb814, 0x821c, 0x0238, 0x9398, 0x1c80, 0x9085, - 0xff00, 0x8007, 0x201a, 0x0038, 0x9398, 0x1c80, 0x2324, 0x94a4, - 0xff00, 0x9405, 0x201a, 0x8210, 0x8108, 0x9182, 0x0080, 0x1208, - 0x0c18, 0x8201, 0x8007, 0x2d0c, 0x9105, 0x206a, 0x00de, 0x20a9, - 0x0040, 0x20a1, 0x1c80, 0x2099, 0x1c80, 0x080c, 0x607e, 0x0804, - 0x452c, 0x080c, 0x4c17, 0x0904, 0x35ea, 0x080c, 0x4be4, 0x1120, - 0x2009, 0x0002, 0x0804, 0x35e7, 0x080c, 0x57d5, 0xd0b4, 0x0558, - 0x7884, 0x908e, 0x007e, 0x0538, 0x908e, 0x007f, 0x0520, 0x908e, - 0x0080, 0x0508, 0x080c, 0x33a5, 0x1148, 0xb800, 0xd08c, 0x11d8, - 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x11a8, 0xa867, 0x0000, - 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xd2a3, 0x1120, 0x2009, 0x0003, - 0x0804, 0x35e7, 0x7007, 0x0003, 0x701f, 0x45b7, 0x0005, 0x080c, - 0x4c17, 0x0904, 0x35ea, 0x20a9, 0x002b, 0xb8c4, 0x20e0, 0xb8c8, - 0x2098, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, - 0x20a9, 0x0008, 0x9080, 0x0006, 0x20a0, 0xb8c4, 0x20e0, 0xb8c8, - 0x9080, 0x0006, 0x2098, 0x080c, 0x0f8b, 0x0070, 0x20a9, 0x0004, - 0xa85c, 0x9080, 0x000a, 0x20a0, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, - 0x000a, 0x2098, 0x080c, 0x0f8b, 0x8906, 0x8006, 0x8007, 0x90bc, - 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2009, 0x002b, 0x7a8c, - 0x7b88, 0x7c9c, 0x7d98, 0x0804, 0x4c30, 0x81ff, 0x1904, 0x35e7, - 0x080c, 0x4bfb, 0x0904, 0x35ea, 0x080c, 0x6896, 0x0904, 0x35e7, - 0x0058, 0xa878, 0x9005, 0x0120, 0x2009, 0x0004, 0x0804, 0x35e7, - 0xa974, 0xaa94, 0x0804, 0x35b5, 0x080c, 0x57dd, 0x0904, 0x35b5, - 0x701f, 0x4601, 0x7007, 0x0003, 0x0005, 0x81ff, 0x1904, 0x35e7, - 0x7888, 0x908a, 0x1000, 0x1a04, 0x35ea, 0x080c, 0x4c17, 0x0904, - 0x35ea, 0x080c, 0x6aa3, 0x0120, 0x080c, 0x6aab, 0x1904, 0x35ea, - 0x080c, 0x691b, 0x0904, 0x35e7, 0x2019, 0x0004, 0x900e, 0x080c, - 0x68a8, 0x0904, 0x35e7, 0x7984, 0x7a88, 0x04c9, 0x08a8, 0xa89c, - 0x908a, 0x1000, 0x12f8, 0x080c, 0x4c15, 0x01e0, 0x080c, 0x6aa3, - 0x0118, 0x080c, 0x6aab, 0x11b0, 0x080c, 0x691b, 0x2009, 0x0002, - 0x0168, 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x68a8, 0x2009, - 0x0003, 0x0120, 0xa998, 0xaa9c, 0x00d1, 0x0060, 0xa897, 0x4005, - 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, - 0x0030, 0x0005, 0xa897, 0x4000, 0x080c, 0x57dd, 0x0110, 0x9006, - 0x0018, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x9186, - 0x00ff, 0x0110, 0x0071, 0x0060, 0x2029, 0x007e, 0x2061, 0x1800, - 0x645c, 0x2400, 0x9506, 0x0110, 0x2508, 0x0019, 0x8529, 0x1ec8, - 0x0005, 0x080c, 0x6724, 0x1138, 0x2200, 0x8003, 0x800b, 0x810b, - 0x9108, 0x080c, 0x884b, 0x0005, 0x81ff, 0x1904, 0x35e7, 0x798c, - 0x2001, 0x1980, 0x918c, 0x8000, 0x2102, 0x080c, 0x4bfb, 0x0904, - 0x35ea, 0x080c, 0x6aa3, 0x0120, 0x080c, 0x6aab, 0x1904, 0x35ea, - 0x080c, 0x67eb, 0x0904, 0x35e7, 0x080c, 0x689f, 0x0904, 0x35e7, - 0x2001, 0x1980, 0x2004, 0xd0fc, 0x1904, 0x35b5, 0x0804, 0x460c, - 0xa9a0, 0x2001, 0x1980, 0x918c, 0x8000, 0xc18d, 0x2102, 0x080c, - 0x4c08, 0x01a0, 0x080c, 0x6aa3, 0x0118, 0x080c, 0x6aab, 0x1170, - 0x080c, 0x67eb, 0x2009, 0x0002, 0x0128, 0x080c, 0x689f, 0x1170, - 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, - 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, - 0x2001, 0x1980, 0x2004, 0xd0fc, 0x1128, 0x080c, 0x57dd, 0x0110, - 0x9006, 0x0018, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, - 0x81ff, 0x1904, 0x35e7, 0x798c, 0x2001, 0x197f, 0x918c, 0x8000, - 0x2102, 0x080c, 0x4bfb, 0x0904, 0x35ea, 0x080c, 0x6aa3, 0x0120, - 0x080c, 0x6aab, 0x1904, 0x35ea, 0x080c, 0x67eb, 0x0904, 0x35e7, - 0x080c, 0x688d, 0x0904, 0x35e7, 0x2001, 0x197f, 0x2004, 0xd0fc, - 0x1904, 0x35b5, 0x0804, 0x460c, 0xa9a0, 0x2001, 0x197f, 0x918c, - 0x8000, 0xc18d, 0x2102, 0x080c, 0x4c08, 0x01a0, 0x080c, 0x6aa3, - 0x0118, 0x080c, 0x6aab, 0x1170, 0x080c, 0x67eb, 0x2009, 0x0002, - 0x0128, 0x080c, 0x688d, 0x1170, 0x2009, 0x0003, 0xa897, 0x4005, - 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, - 0x0030, 0x0005, 0xa897, 0x4000, 0x2001, 0x197f, 0x2004, 0xd0fc, - 0x1128, 0x080c, 0x57dd, 0x0110, 0x9006, 0x0018, 0x900e, 0x9085, - 0x0001, 0x2001, 0x0000, 0x0005, 0x6100, 0x0804, 0x35b5, 0x080c, - 0x4c17, 0x0904, 0x35ea, 0x080c, 0x57e9, 0x1904, 0x35e7, 0x79a8, - 0xd184, 0x1158, 0xb834, 0x8007, 0x789e, 0xb830, 0x8007, 0x789a, - 0xbb2c, 0x831f, 0xba28, 0x8217, 0x0050, 0xb824, 0x8007, 0x789e, - 0xb820, 0x8007, 0x789a, 0xbb1c, 0x831f, 0xba18, 0x8217, 0xb900, - 0x918c, 0x0202, 0x0804, 0x35b5, 0x78a8, 0x909c, 0x0003, 0xd0ac, - 0x1158, 0xd0b4, 0x1148, 0x939a, 0x0003, 0x1a04, 0x35e7, 0x625c, - 0x7884, 0x9206, 0x1904, 0x47c7, 0x080c, 0x894c, 0x2001, 0xffec, - 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0000, - 0x0006, 0x78a8, 0x9084, 0x0080, 0x1528, 0x0006, 0x0036, 0x2001, - 0x1a83, 0x201c, 0x7b9a, 0x2003, 0x0000, 0x2001, 0x1a84, 0x201c, - 0x7b9e, 0x2003, 0x0000, 0x2001, 0x1a85, 0x201c, 0x7bae, 0x2003, - 0x0000, 0x2001, 0x1a7f, 0x201c, 0x7baa, 0x2003, 0x0000, 0x2001, - 0x1a86, 0x201c, 0x7bb2, 0x2003, 0x0000, 0x003e, 0x000e, 0x000e, - 0x0804, 0x4c30, 0x000e, 0x2031, 0x0000, 0x2061, 0x18b8, 0x2c44, - 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a, - 0x080c, 0x10f8, 0x7007, 0x0002, 0x701f, 0x47e7, 0x0005, 0x81ff, - 0x1904, 0x35e7, 0x080c, 0x4c17, 0x0904, 0x35ea, 0x080c, 0x6aa3, - 0x1904, 0x35e7, 0x00c6, 0x080c, 0x4be4, 0x00ce, 0x0904, 0x35e7, - 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7ea8, 0x080c, 0xd249, - 0x0904, 0x35e7, 0x7007, 0x0003, 0x701f, 0x480d, 0x0005, 0x080c, - 0x42ec, 0x0006, 0x0036, 0x2001, 0x1a83, 0x201c, 0x7b9a, 0x2003, - 0x0000, 0x2001, 0x1a84, 0x201c, 0x7b9e, 0x2003, 0x0000, 0x2001, - 0x1a85, 0x201c, 0x7bae, 0x2003, 0x0000, 0x2001, 0x1a7f, 0x201c, - 0x7baa, 0x2003, 0x0000, 0x2001, 0x1a86, 0x201c, 0x7bb2, 0x2003, - 0x0000, 0x003e, 0x000e, 0x0804, 0x35b5, 0xa830, 0x9086, 0x0100, - 0x0904, 0x35e7, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, - 0xffc0, 0x9080, 0x001b, 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, - 0x7d98, 0x0804, 0x4c30, 0x9006, 0x080c, 0x28dc, 0x78a8, 0x9084, - 0x00ff, 0x9086, 0x00ff, 0x0118, 0x81ff, 0x1904, 0x35e7, 0x080c, - 0x7637, 0x0110, 0x080c, 0x60f3, 0x7888, 0x908a, 0x1000, 0x1a04, - 0x35ea, 0x7984, 0x9186, 0x00ff, 0x0138, 0x9182, 0x007f, 0x1a04, - 0x35ea, 0x2100, 0x080c, 0x28a6, 0x0026, 0x00c6, 0x0126, 0x2091, - 0x8000, 0x2061, 0x19fb, 0x601b, 0x0000, 0x601f, 0x0000, 0x607b, - 0x0000, 0x607f, 0x0000, 0x080c, 0x7637, 0x1158, 0x080c, 0x7932, - 0x080c, 0x612e, 0x9085, 0x0001, 0x080c, 0x767b, 0x080c, 0x7563, - 0x00d0, 0x080c, 0xb244, 0x2061, 0x0100, 0x2001, 0x1818, 0x2004, - 0x9084, 0x00ff, 0x810f, 0x9105, 0x604a, 0x6043, 0x0090, 0x6043, - 0x0010, 0x2009, 0x1999, 0x200b, 0x0000, 0x2009, 0x002d, 0x2011, - 0x6019, 0x080c, 0x88d5, 0x7984, 0x080c, 0x7637, 0x1110, 0x2009, - 0x00ff, 0x7a88, 0x080c, 0x466f, 0x012e, 0x00ce, 0x002e, 0x0804, - 0x35b5, 0x7984, 0x080c, 0x66b9, 0x2b08, 0x1904, 0x35ea, 0x0804, - 0x35b5, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x35e7, 0x60dc, - 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, 0x0005, 0x0804, 0x35e7, - 0x080c, 0x4be4, 0x1120, 0x2009, 0x0002, 0x0804, 0x35e7, 0x7984, - 0x81ff, 0x0904, 0x35ea, 0x9192, 0x0021, 0x1a04, 0x35ea, 0x7a8c, - 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0x702a, 0xaf60, - 0x7736, 0x080c, 0x4c2d, 0x701f, 0x48c4, 0x7880, 0x9086, 0x006e, - 0x0110, 0x701f, 0x527d, 0x0005, 0x2009, 0x0080, 0x080c, 0x6724, - 0x1118, 0x080c, 0x6aa3, 0x0120, 0x2021, 0x400a, 0x0804, 0x35b7, - 0x00d6, 0x0096, 0xa964, 0xaa6c, 0xab70, 0xac74, 0xad78, 0xae7c, - 0xa884, 0x90be, 0x0100, 0x0904, 0x495d, 0x90be, 0x0112, 0x0904, - 0x495d, 0x90be, 0x0113, 0x0904, 0x495d, 0x90be, 0x0114, 0x0904, - 0x495d, 0x90be, 0x0117, 0x0904, 0x495d, 0x90be, 0x011a, 0x0904, - 0x495d, 0x90be, 0x011c, 0x0904, 0x495d, 0x90be, 0x0121, 0x0904, - 0x4944, 0x90be, 0x0131, 0x0904, 0x4944, 0x90be, 0x0171, 0x0904, - 0x495d, 0x90be, 0x0173, 0x0904, 0x495d, 0x90be, 0x01a1, 0x1128, - 0xa894, 0x8007, 0xa896, 0x0804, 0x4968, 0x90be, 0x0212, 0x0904, - 0x4951, 0x90be, 0x0213, 0x05e8, 0x90be, 0x0214, 0x0500, 0x90be, - 0x0217, 0x0188, 0x90be, 0x021a, 0x1120, 0xa89c, 0x8007, 0xa89e, - 0x04e0, 0x90be, 0x021f, 0x05c8, 0x90be, 0x0300, 0x05b0, 0x009e, - 0x00de, 0x0804, 0x35ea, 0x7028, 0x9080, 0x0010, 0x2098, 0x20a0, - 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0007, 0x080c, 0x49a6, 0x7028, - 0x9080, 0x000e, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, - 0x0001, 0x080c, 0x49a6, 0x00c8, 0x7028, 0x9080, 0x000c, 0x2098, - 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x49b3, - 0x00b8, 0x7028, 0x9080, 0x000e, 0x2098, 0x20a0, 0x7034, 0x20e0, - 0x20e8, 0x20a9, 0x0001, 0x080c, 0x49b3, 0x7028, 0x9080, 0x000c, - 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x04f1, - 0x00c6, 0x080c, 0x4be4, 0x0550, 0xa868, 0xc0fd, 0xa86a, 0xa867, - 0x0119, 0x9006, 0xa882, 0xa87f, 0x0020, 0xa88b, 0x0001, 0x810b, - 0xa9ae, 0xa8b2, 0xaab6, 0xabba, 0xacbe, 0xadc2, 0xa9c6, 0xa8ca, - 0x00ce, 0x009e, 0x00de, 0xa866, 0xa822, 0xa868, 0xc0fd, 0xa86a, - 0xa804, 0x2048, 0x080c, 0xd264, 0x1120, 0x2009, 0x0003, 0x0804, - 0x35e7, 0x7007, 0x0003, 0x701f, 0x499d, 0x0005, 0x00ce, 0x009e, - 0x00de, 0x2009, 0x0002, 0x0804, 0x35e7, 0xa820, 0x9086, 0x8001, - 0x1904, 0x35b5, 0x2009, 0x0004, 0x0804, 0x35e7, 0x0016, 0x0026, - 0x3510, 0x20a9, 0x0002, 0x4002, 0x4104, 0x4004, 0x8211, 0x1dc8, - 0x002e, 0x001e, 0x0005, 0x0016, 0x0026, 0x0036, 0x0046, 0x3520, - 0x20a9, 0x0004, 0x4002, 0x4304, 0x4204, 0x4104, 0x4004, 0x8421, - 0x1db8, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, 0x81ff, 0x0120, - 0x2009, 0x0001, 0x0804, 0x35e7, 0x60dc, 0xd0ac, 0x1188, 0x2009, - 0x180d, 0x210c, 0xd18c, 0x0130, 0xd09c, 0x0120, 0x2009, 0x0016, - 0x0804, 0x35e7, 0xd09c, 0x1120, 0x2009, 0x0005, 0x0804, 0x35e7, - 0x7984, 0x78a8, 0x2040, 0x080c, 0xb23d, 0x1120, 0x9182, 0x007f, - 0x0a04, 0x35ea, 0x9186, 0x00ff, 0x0904, 0x35ea, 0x9182, 0x0800, - 0x1a04, 0x35ea, 0x7a8c, 0x7b88, 0x607c, 0x9306, 0x1158, 0x6080, - 0x924e, 0x0904, 0x35ea, 0x080c, 0xb23d, 0x1120, 0x99cc, 0xff00, - 0x0904, 0x35ea, 0x0126, 0x2091, 0x8000, 0x2001, 0x180d, 0x2004, - 0xd08c, 0x0198, 0x9386, 0x00ff, 0x0180, 0x0026, 0x2011, 0x8008, - 0x080c, 0x6ac7, 0x002e, 0x0148, 0x918d, 0x8000, 0x080c, 0x6b11, - 0x1120, 0x2001, 0x4009, 0x0804, 0x4a64, 0x080c, 0x4af7, 0x0904, - 0x4a6a, 0x0086, 0x90c6, 0x4000, 0x008e, 0x1538, 0x00c6, 0x0006, - 0x0036, 0xb818, 0xbb1c, 0x9305, 0xbb20, 0x9305, 0xbb24, 0x9305, - 0xbb28, 0x9305, 0xbb2c, 0x9305, 0xbb30, 0x9305, 0xbb34, 0x9305, - 0x003e, 0x0570, 0xd88c, 0x1128, 0x080c, 0x6aa3, 0x0110, 0xc89d, - 0x0438, 0x900e, 0x080c, 0x6944, 0x1108, 0xc185, 0xb800, 0xd0bc, - 0x0108, 0xc18d, 0x000e, 0x00ce, 0x00b8, 0x90c6, 0x4007, 0x1110, - 0x2408, 0x0090, 0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0060, - 0x90c6, 0x4009, 0x1108, 0x0040, 0x90c6, 0x4006, 0x1108, 0x0020, - 0x2001, 0x4005, 0x2009, 0x000a, 0x2020, 0x012e, 0x0804, 0x35b7, - 0x000e, 0x00ce, 0x2b00, 0x7026, 0x0016, 0x00b6, 0x00c6, 0x00e6, - 0x2c70, 0x080c, 0xb325, 0x0904, 0x4abf, 0x2b00, 0x6012, 0x080c, - 0xd554, 0x2e58, 0x00ee, 0x00e6, 0x00c6, 0x080c, 0x4be4, 0x00ce, - 0x2b70, 0x1158, 0x080c, 0xb2d3, 0x00ee, 0x00ce, 0x00be, 0x001e, - 0x012e, 0x2009, 0x0002, 0x0804, 0x35e7, 0x900e, 0xa966, 0xa96a, - 0x2900, 0x6016, 0xa932, 0xa868, 0xc0fd, 0xd88c, 0x0108, 0xc0f5, - 0xa86a, 0xd89c, 0x1110, 0x080c, 0x3250, 0x6023, 0x0001, 0x9006, - 0x080c, 0x6656, 0xd89c, 0x0138, 0x2001, 0x0004, 0x080c, 0x666a, - 0x2009, 0x0003, 0x0030, 0x2001, 0x0002, 0x080c, 0x666a, 0x2009, - 0x0002, 0x080c, 0xb352, 0x78a8, 0xd094, 0x0138, 0x00ee, 0x7024, - 0x00e6, 0x2058, 0xb8cc, 0xc08d, 0xb8ce, 0x9085, 0x0001, 0x00ee, - 0x00ce, 0x00be, 0x001e, 0x012e, 0x1120, 0x2009, 0x0003, 0x0804, - 0x35e7, 0x7007, 0x0003, 0x701f, 0x4ace, 0x0005, 0xa830, 0x2009, - 0x180d, 0x210c, 0xd18c, 0x0140, 0x2008, 0x918e, 0xdead, 0x1120, - 0x2021, 0x4009, 0x0804, 0x35b7, 0x9086, 0x0100, 0x7024, 0x2058, - 0x1138, 0x2009, 0x0004, 0xba04, 0x9294, 0x00ff, 0x0804, 0x5729, - 0x900e, 0xa868, 0xd0f4, 0x1904, 0x35b5, 0x080c, 0x6944, 0x1108, - 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x35b5, 0x00e6, - 0x00d6, 0x0096, 0x83ff, 0x0904, 0x4b46, 0x902e, 0x080c, 0xb23d, - 0x0130, 0x9026, 0x20a9, 0x0800, 0x2071, 0x1000, 0x0030, 0x2021, - 0x007f, 0x20a9, 0x0781, 0x2071, 0x107f, 0x2e04, 0x9005, 0x11b8, - 0x2100, 0x9406, 0x1904, 0x4b57, 0x2428, 0x94ce, 0x007f, 0x1120, - 0x92ce, 0xfffd, 0x1558, 0x0030, 0x94ce, 0x0080, 0x1130, 0x92ce, - 0xfffc, 0x1520, 0x93ce, 0x00ff, 0x1508, 0xc5fd, 0x0480, 0x2058, - 0xbf10, 0x2700, 0x9306, 0x11e8, 0xbe14, 0x2600, 0x9206, 0x11c8, - 0x2400, 0x9106, 0x1180, 0xd884, 0x0598, 0xd894, 0x1588, 0x080c, - 0x6a43, 0x1570, 0x2001, 0x4000, 0x0460, 0x080c, 0x6aa3, 0x1540, - 0x2001, 0x4000, 0x0430, 0x2001, 0x4007, 0x0418, 0x2001, 0x4006, - 0x0400, 0x2400, 0x9106, 0x1158, 0xbe14, 0x87ff, 0x1128, 0x86ff, - 0x0918, 0x080c, 0xb23d, 0x1900, 0x2001, 0x4008, 0x0090, 0x8420, - 0x8e70, 0x1f04, 0x4b0d, 0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, - 0x2001, 0x0001, 0x0030, 0x080c, 0x66b9, 0x1dd0, 0xbb12, 0xba16, - 0x9006, 0x9005, 0x009e, 0x00de, 0x00ee, 0x0005, 0x81ff, 0x0120, - 0x2009, 0x0001, 0x0804, 0x35e7, 0x080c, 0x4be4, 0x1120, 0x2009, - 0x0002, 0x0804, 0x35e7, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, - 0x7884, 0x9005, 0x0904, 0x35ea, 0x9096, 0x00ff, 0x0120, 0x9092, - 0x0004, 0x1a04, 0x35ea, 0x2010, 0x2918, 0x080c, 0x31f6, 0x1120, - 0x2009, 0x0003, 0x0804, 0x35e7, 0x7007, 0x0003, 0x701f, 0x4b99, - 0x0005, 0xa830, 0x9086, 0x0100, 0x1904, 0x35b5, 0x2009, 0x0004, - 0x0804, 0x35e7, 0x7984, 0x080c, 0xb23d, 0x1120, 0x9182, 0x007f, - 0x0a04, 0x35ea, 0x9186, 0x00ff, 0x0904, 0x35ea, 0x9182, 0x0800, - 0x1a04, 0x35ea, 0x2001, 0x9400, 0x080c, 0x5784, 0x1904, 0x35e7, - 0x0804, 0x35b5, 0xa998, 0x080c, 0xb23d, 0x1118, 0x9182, 0x007f, - 0x0280, 0x9186, 0x00ff, 0x0168, 0x9182, 0x0800, 0x1250, 0x2001, - 0x9400, 0x080c, 0x5784, 0x11a8, 0x0060, 0xa897, 0x4005, 0xa99a, - 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, - 0x0005, 0xa897, 0x4000, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, - 0x0005, 0x2009, 0x000a, 0x0c48, 0x080c, 0x100e, 0x0198, 0x9006, - 0xa802, 0x7014, 0x9005, 0x1120, 0x2900, 0x7016, 0x701a, 0x0040, - 0x7018, 0xa802, 0x0086, 0x2040, 0x2900, 0xa006, 0x701a, 0x008e, - 0x9085, 0x0001, 0x0005, 0x7984, 0x080c, 0x6724, 0x1130, 0x7e88, - 0x9684, 0x3fff, 0x9082, 0x4000, 0x0208, 0x905e, 0x8bff, 0x0005, - 0xa998, 0x080c, 0x6724, 0x1130, 0xae9c, 0x9684, 0x3fff, 0x9082, - 0x4000, 0x0208, 0x905e, 0x8bff, 0x0005, 0xae98, 0x0008, 0x7e84, - 0x2608, 0x080c, 0x6724, 0x1108, 0x0008, 0x905e, 0x8bff, 0x0005, - 0x0016, 0x7114, 0x81ff, 0x0128, 0x2148, 0xa904, 0x080c, 0x1040, - 0x0cc8, 0x7116, 0x711a, 0x001e, 0x0005, 0x2031, 0x0001, 0x0010, - 0x2031, 0x0000, 0x2061, 0x18b8, 0x2c44, 0xa66a, 0xa17a, 0xa772, - 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x10f8, 0x7007, - 0x0002, 0x701f, 0x35b5, 0x0005, 0x00f6, 0x0126, 0x2091, 0x8000, - 0x2079, 0x0000, 0x2001, 0x18b0, 0x2004, 0x9005, 0x1190, 0x0e04, - 0x4c61, 0x7a36, 0x7833, 0x0012, 0x7a82, 0x7b86, 0x7c8a, 0x2091, - 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11aa, 0x0804, - 0x4cc7, 0x0016, 0x0086, 0x0096, 0x00c6, 0x00e6, 0x2071, 0x189e, - 0x7044, 0x9005, 0x1540, 0x7148, 0x9182, 0x0010, 0x0288, 0x7038, - 0x2060, 0x080c, 0x100e, 0x0904, 0x4cbf, 0xa84b, 0x0000, 0x2900, - 0x7046, 0x2001, 0x0002, 0x9080, 0x20c7, 0x2005, 0xa846, 0x0098, - 0x7038, 0x90e0, 0x0004, 0x2001, 0x18ba, 0x9c82, 0x18fa, 0x0210, - 0x2061, 0x18ba, 0x2c00, 0x703a, 0x7148, 0x81ff, 0x1108, 0x703e, - 0x8108, 0x714a, 0x0460, 0x7148, 0x8108, 0x714a, 0x7044, 0x2040, - 0xa144, 0x2105, 0x0016, 0x908a, 0x0036, 0x1a0c, 0x0dc5, 0x2060, - 0x001e, 0x8108, 0x2105, 0x9005, 0xa146, 0x1520, 0x080c, 0x100e, - 0x1130, 0x8109, 0xa946, 0x7148, 0x8109, 0x714a, 0x00d8, 0x9006, - 0xa806, 0xa84a, 0xa046, 0x2800, 0xa802, 0x2900, 0xa006, 0x7046, - 0x2001, 0x0002, 0x9080, 0x20c7, 0x2005, 0xa846, 0x0058, 0x2262, - 0x6306, 0x640a, 0x00ee, 0x00ce, 0x009e, 0x008e, 0x001e, 0x012e, - 0x00fe, 0x0005, 0x2c00, 0x9082, 0x001b, 0x0002, 0x4ce9, 0x4ce9, - 0x4ceb, 0x4ce9, 0x4ce9, 0x4ce9, 0x4cef, 0x4ce9, 0x4ce9, 0x4ce9, - 0x4cf3, 0x4ce9, 0x4ce9, 0x4ce9, 0x4cf7, 0x4ce9, 0x4ce9, 0x4ce9, - 0x4cfb, 0x4ce9, 0x4ce9, 0x4ce9, 0x4cff, 0x4ce9, 0x4ce9, 0x4ce9, - 0x4d04, 0x080c, 0x0dc5, 0xa276, 0xa37a, 0xa47e, 0x0898, 0xa286, - 0xa38a, 0xa48e, 0x0878, 0xa296, 0xa39a, 0xa49e, 0x0858, 0xa2a6, - 0xa3aa, 0xa4ae, 0x0838, 0xa2b6, 0xa3ba, 0xa4be, 0x0818, 0xa2c6, - 0xa3ca, 0xa4ce, 0x0804, 0x4cc2, 0xa2d6, 0xa3da, 0xa4de, 0x0804, - 0x4cc2, 0x00e6, 0x2071, 0x189e, 0x7048, 0x9005, 0x0904, 0x4d9b, - 0x0126, 0x2091, 0x8000, 0x0e04, 0x4d9a, 0x00f6, 0x2079, 0x0000, - 0x00c6, 0x0096, 0x0086, 0x0076, 0x9006, 0x2038, 0x7040, 0x2048, - 0x9005, 0x0500, 0xa948, 0x2105, 0x0016, 0x908a, 0x0036, 0x1a0c, - 0x0dc5, 0x2060, 0x001e, 0x8108, 0x2105, 0x9005, 0xa94a, 0x1904, - 0x4d9d, 0xa804, 0x9005, 0x090c, 0x0dc5, 0x7042, 0x2938, 0x2040, - 0xa003, 0x0000, 0x2001, 0x0002, 0x9080, 0x20c7, 0x2005, 0xa04a, - 0x0804, 0x4d9d, 0x703c, 0x2060, 0x2c14, 0x6304, 0x6408, 0x650c, - 0x2200, 0x7836, 0x7833, 0x0012, 0x7882, 0x2300, 0x7886, 0x2400, - 0x788a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, - 0x11aa, 0x87ff, 0x0118, 0x2748, 0x080c, 0x1040, 0x7048, 0x8001, - 0x704a, 0x9005, 0x1170, 0x7040, 0x2048, 0x9005, 0x0128, 0x080c, - 0x1040, 0x9006, 0x7042, 0x7046, 0x703b, 0x18ba, 0x703f, 0x18ba, - 0x0420, 0x7040, 0x9005, 0x1508, 0x7238, 0x2c00, 0x9206, 0x0148, - 0x9c80, 0x0004, 0x90fa, 0x18fa, 0x0210, 0x2001, 0x18ba, 0x703e, - 0x00a0, 0x9006, 0x703e, 0x703a, 0x7044, 0x9005, 0x090c, 0x0dc5, - 0x2048, 0xa800, 0x9005, 0x1de0, 0x2900, 0x7042, 0x2001, 0x0002, - 0x9080, 0x20c7, 0x2005, 0xa84a, 0x0000, 0x007e, 0x008e, 0x009e, - 0x00ce, 0x00fe, 0x012e, 0x00ee, 0x0005, 0x2c00, 0x9082, 0x001b, - 0x0002, 0x4dbc, 0x4dbc, 0x4dbe, 0x4dbc, 0x4dbc, 0x4dbc, 0x4dc3, - 0x4dbc, 0x4dbc, 0x4dbc, 0x4dc8, 0x4dbc, 0x4dbc, 0x4dbc, 0x4dcd, - 0x4dbc, 0x4dbc, 0x4dbc, 0x4dd2, 0x4dbc, 0x4dbc, 0x4dbc, 0x4dd7, - 0x4dbc, 0x4dbc, 0x4dbc, 0x4ddc, 0x080c, 0x0dc5, 0xaa74, 0xab78, - 0xac7c, 0x0804, 0x4d48, 0xaa84, 0xab88, 0xac8c, 0x0804, 0x4d48, - 0xaa94, 0xab98, 0xac9c, 0x0804, 0x4d48, 0xaaa4, 0xaba8, 0xacac, - 0x0804, 0x4d48, 0xaab4, 0xabb8, 0xacbc, 0x0804, 0x4d48, 0xaac4, - 0xabc8, 0xaccc, 0x0804, 0x4d48, 0xaad4, 0xabd8, 0xacdc, 0x0804, - 0x4d48, 0x0016, 0x0026, 0x0036, 0x00b6, 0x00c6, 0x2009, 0x007e, - 0x080c, 0x6724, 0x2019, 0x0001, 0xb85c, 0xd0ac, 0x0110, 0x2019, - 0x0000, 0x2011, 0x801b, 0x080c, 0x4c44, 0x00ce, 0x00be, 0x003e, - 0x002e, 0x001e, 0x0005, 0x0026, 0x080c, 0x57d5, 0xd0c4, 0x0120, - 0x2011, 0x8014, 0x080c, 0x4c44, 0x002e, 0x0005, 0x81ff, 0x1904, - 0x35e7, 0x0126, 0x2091, 0x8000, 0x6030, 0xc08d, 0xc085, 0xc0ac, - 0x6032, 0x080c, 0x7637, 0x1158, 0x080c, 0x7932, 0x080c, 0x612e, - 0x9085, 0x0001, 0x080c, 0x767b, 0x080c, 0x7563, 0x0010, 0x080c, - 0x5fed, 0x012e, 0x0804, 0x35b5, 0x81ff, 0x0120, 0x2009, 0x0001, - 0x0804, 0x35e7, 0x080c, 0x57e9, 0x0120, 0x2009, 0x0007, 0x0804, - 0x35e7, 0x080c, 0x6a9b, 0x0120, 0x2009, 0x0008, 0x0804, 0x35e7, - 0x2001, 0x180d, 0x2004, 0xd08c, 0x0178, 0x0026, 0x2011, 0x0010, - 0x080c, 0x6ac7, 0x002e, 0x0140, 0x7984, 0x080c, 0x6b11, 0x1120, - 0x2009, 0x4009, 0x0804, 0x35e7, 0x7984, 0x080c, 0x66b9, 0x1904, - 0x35ea, 0x080c, 0x4c17, 0x0904, 0x35ea, 0x2b00, 0x7026, 0x080c, - 0x6aa3, 0x7888, 0x1170, 0x9084, 0x0005, 0x1158, 0x900e, 0x080c, - 0x6944, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, - 0x35b5, 0x080c, 0x4be4, 0x0904, 0x35e7, 0x9006, 0xa866, 0xa832, - 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xd302, 0x0904, 0x35e7, 0x7888, - 0xd094, 0x0118, 0xb8cc, 0xc08d, 0xb8ce, 0x7007, 0x0003, 0x701f, - 0x4ecb, 0x0005, 0x2061, 0x1800, 0x080c, 0x57e9, 0x2009, 0x0007, - 0x1560, 0x080c, 0x6a9b, 0x0118, 0x2009, 0x0008, 0x0430, 0xa998, - 0x080c, 0x66b9, 0x1530, 0x080c, 0x4c15, 0x0518, 0x080c, 0x6aa3, - 0xa89c, 0x1168, 0x9084, 0x0005, 0x1150, 0x900e, 0x080c, 0x6944, - 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x00d0, 0xa868, - 0xc0fc, 0xa86a, 0x080c, 0xd302, 0x11e0, 0xa89c, 0xd094, 0x0118, - 0xb8cc, 0xc08d, 0xb8ce, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, - 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, - 0x0005, 0xa897, 0x4000, 0xa99a, 0x9006, 0x918d, 0x0001, 0x2008, - 0x0005, 0x9006, 0x0005, 0xa830, 0x2009, 0x180d, 0x210c, 0xd18c, - 0x0140, 0x2008, 0x918e, 0xdead, 0x1120, 0x2021, 0x4009, 0x0804, - 0x35b7, 0x9086, 0x0100, 0x7024, 0x2058, 0x1110, 0x0804, 0x5729, - 0x900e, 0x080c, 0x6944, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, - 0xc18d, 0x0804, 0x35b5, 0x080c, 0x57e9, 0x0120, 0x2009, 0x0007, - 0x0804, 0x35e7, 0x7f84, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x080c, - 0x4be4, 0x1120, 0x2009, 0x0002, 0x0804, 0x35e7, 0x900e, 0x2130, - 0x7126, 0x7132, 0xa860, 0x20e8, 0x7036, 0xa85c, 0x9080, 0x0005, - 0x702a, 0x20a0, 0x080c, 0x6724, 0x1904, 0x4f81, 0x080c, 0x6aa3, - 0x0138, 0x080c, 0x6aab, 0x0120, 0x080c, 0x6a43, 0x1904, 0x4f81, - 0xd794, 0x1110, 0xd784, 0x01a8, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, - 0x0006, 0x2098, 0x3400, 0xd794, 0x0198, 0x20a9, 0x0008, 0x4003, - 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x20a9, 0x0002, 0x080c, 0x49b3, - 0x0080, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x000a, 0x2098, 0x3400, - 0x20a9, 0x0004, 0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x080c, - 0x49b3, 0x9186, 0x007e, 0x0170, 0x9186, 0x0080, 0x0158, 0x080c, - 0x6aa3, 0x90c2, 0x0006, 0x1210, 0xc1fd, 0x0020, 0x080c, 0x6944, - 0x1108, 0xc1fd, 0x4104, 0xc1fc, 0xd794, 0x0528, 0xb8c4, 0x20e0, - 0xb8c8, 0x2060, 0x9c80, 0x0000, 0x2098, 0x20a9, 0x0002, 0x4003, - 0x9c80, 0x0003, 0x2098, 0x20a9, 0x0001, 0x4005, 0x9c80, 0x0004, - 0x2098, 0x3400, 0x20a9, 0x0002, 0x4003, 0x2098, 0x20a0, 0x3d00, - 0x20e0, 0x080c, 0x49a6, 0x9c80, 0x0026, 0x2098, 0xb8c4, 0x20e0, - 0x20a9, 0x0002, 0x4003, 0xd794, 0x0110, 0x96b0, 0x000b, 0x96b0, - 0x0005, 0x8108, 0x080c, 0xb23d, 0x0118, 0x9186, 0x0800, 0x0040, - 0xd78c, 0x0120, 0x9186, 0x0800, 0x0170, 0x0018, 0x9186, 0x007e, - 0x0150, 0xd794, 0x0118, 0x9686, 0x0020, 0x0010, 0x9686, 0x0028, - 0x0150, 0x0804, 0x4f0a, 0x86ff, 0x1120, 0x7124, 0x810b, 0x0804, - 0x35b5, 0x7033, 0x0001, 0x7122, 0x7024, 0x9600, 0x7026, 0x772e, - 0x2061, 0x18b8, 0x2c44, 0xa06b, 0x0000, 0xa67a, 0x7034, 0xa072, - 0x7028, 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x10f8, - 0x7007, 0x0002, 0x701f, 0x4fbd, 0x0005, 0x7030, 0x9005, 0x1180, - 0x7120, 0x7028, 0x20a0, 0x772c, 0x9036, 0x7034, 0x20e8, 0x2061, - 0x18b8, 0x2c44, 0xa28c, 0xa390, 0xa494, 0xa598, 0x0804, 0x4f0a, - 0x7124, 0x810b, 0x0804, 0x35b5, 0x2029, 0x007e, 0x7984, 0x7a88, - 0x7b8c, 0x7c98, 0x9184, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, - 0x35ea, 0x9502, 0x0a04, 0x35ea, 0x9184, 0x00ff, 0x90e2, 0x0020, - 0x0a04, 0x35ea, 0x9502, 0x0a04, 0x35ea, 0x9284, 0xff00, 0x8007, - 0x90e2, 0x0020, 0x0a04, 0x35ea, 0x9502, 0x0a04, 0x35ea, 0x9284, - 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x35ea, 0x9502, 0x0a04, 0x35ea, - 0x9384, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x35ea, 0x9502, - 0x0a04, 0x35ea, 0x9384, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x35ea, - 0x9502, 0x0a04, 0x35ea, 0x9484, 0xff00, 0x8007, 0x90e2, 0x0020, - 0x0a04, 0x35ea, 0x9502, 0x0a04, 0x35ea, 0x9484, 0x00ff, 0x90e2, - 0x0020, 0x0a04, 0x35ea, 0x9502, 0x0a04, 0x35ea, 0x2061, 0x1989, - 0x6102, 0x6206, 0x630a, 0x640e, 0x0804, 0x35b5, 0x080c, 0x4be4, - 0x0904, 0x35e7, 0x2009, 0x0016, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, - 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4c2d, 0x701f, 0x5041, - 0x0005, 0x20a9, 0x0016, 0x896e, 0x8d6e, 0x8d6f, 0x9d84, 0xffc0, - 0x9080, 0x0019, 0x2098, 0x9d84, 0x003f, 0x20e0, 0x2069, 0x1877, - 0x20e9, 0x0001, 0x2da0, 0x4003, 0x6800, 0x9005, 0x0904, 0x50a8, - 0x6804, 0x2008, 0x918c, 0xfff8, 0x1904, 0x50a8, 0x680c, 0x9005, - 0x0904, 0x50a8, 0x9082, 0xff01, 0x1a04, 0x50a8, 0x6810, 0x9082, - 0x005c, 0x06f0, 0x6824, 0x2008, 0x9082, 0x0008, 0x06c8, 0x9182, - 0x0400, 0x16b0, 0x0056, 0x2029, 0x0000, 0x080c, 0x8e80, 0x005e, - 0x6944, 0x6820, 0x9102, 0x0660, 0x6820, 0x9082, 0x0019, 0x1640, - 0x6828, 0x6944, 0x810c, 0x9102, 0x0618, 0x6840, 0x9082, 0x000f, - 0x12f8, 0x080c, 0x1027, 0x2900, 0x0590, 0x684e, 0x00e6, 0x2071, - 0x1931, 0x00b6, 0x2059, 0x0000, 0x080c, 0x8d3c, 0x00be, 0x00ee, - 0x01e8, 0x080c, 0x8a84, 0x080c, 0x8ad3, 0x1160, 0x6857, 0x0000, - 0x00c6, 0x6b10, 0x2061, 0x1a65, 0x630a, 0x00ce, 0x0804, 0x35b5, - 0x0804, 0x35ea, 0x080c, 0x8acc, 0x00e6, 0x2071, 0x1931, 0x080c, - 0x8f00, 0x080c, 0x8f0f, 0x080c, 0x8d21, 0x00ee, 0x2001, 0x188a, - 0x204c, 0x080c, 0x1040, 0x2001, 0x188a, 0x2003, 0x0000, 0x0804, - 0x35e7, 0x0126, 0x2091, 0x8000, 0x080c, 0x92bf, 0x080c, 0x8acc, - 0x012e, 0x0804, 0x35b5, 0x0006, 0x080c, 0x57d5, 0xd0cc, 0x000e, - 0x0005, 0x0006, 0x080c, 0x57d9, 0xd0bc, 0x000e, 0x0005, 0x6174, - 0x7a84, 0x6300, 0x82ff, 0x1118, 0x7986, 0x0804, 0x35b5, 0x83ff, - 0x1904, 0x35ea, 0x2001, 0xfff0, 0x9200, 0x1a04, 0x35ea, 0x2019, - 0xffff, 0x6078, 0x9302, 0x9200, 0x0a04, 0x35ea, 0x7986, 0x6276, - 0x0804, 0x35b5, 0x080c, 0x57e9, 0x1904, 0x35e7, 0x7c88, 0x7d84, - 0x7e98, 0x7f8c, 0x080c, 0x4be4, 0x0904, 0x35e7, 0x900e, 0x901e, - 0x7326, 0x7332, 0xa860, 0x20e8, 0x7036, 0xa85c, 0x9080, 0x0003, - 0x702a, 0x20a0, 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, - 0x6aa3, 0x0118, 0x080c, 0x6aab, 0x1148, 0x20a9, 0x0001, 0xb814, - 0x4004, 0xb810, 0x4004, 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, - 0x0800, 0x0120, 0x9386, 0x003c, 0x0170, 0x0c20, 0x83ff, 0x1148, - 0x7224, 0x900e, 0x2001, 0x0003, 0x080c, 0x9375, 0x2208, 0x0804, - 0x35b5, 0x7033, 0x0001, 0x7122, 0x7024, 0x9300, 0x7026, 0x2061, - 0x18b8, 0x2c44, 0xa06b, 0x0000, 0xa37a, 0x7028, 0xa076, 0x7034, - 0xa072, 0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c, 0x10f8, 0x7007, - 0x0002, 0x701f, 0x514c, 0x0005, 0x7030, 0x9005, 0x1178, 0x7120, - 0x7028, 0x20a0, 0x901e, 0x7034, 0x20e8, 0x2061, 0x18b8, 0x2c44, - 0xa48c, 0xa590, 0xa694, 0xa798, 0x0804, 0x510a, 0x7224, 0x900e, - 0x2001, 0x0003, 0x080c, 0x9375, 0x2208, 0x0804, 0x35b5, 0x00f6, - 0x00e6, 0x080c, 0x57e9, 0x2009, 0x0007, 0x1904, 0x51df, 0x2071, - 0x189e, 0x745c, 0x84ff, 0x2009, 0x000e, 0x1904, 0x51df, 0xac9c, - 0xad98, 0xaea4, 0xafa0, 0x0096, 0x080c, 0x1027, 0x2009, 0x0002, - 0x0904, 0x51df, 0x2900, 0x705e, 0x900e, 0x901e, 0x7356, 0x7362, - 0xa860, 0x7066, 0xa85c, 0x9080, 0x0003, 0x705a, 0x20a0, 0x91d8, - 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x6aa3, 0x0118, 0x080c, - 0x6aab, 0x1148, 0xb814, 0x20a9, 0x0001, 0x4004, 0xb810, 0x4004, - 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, - 0x003c, 0x01e8, 0x0c20, 0x83ff, 0x11c0, 0x7254, 0x900e, 0x2001, - 0x0003, 0x080c, 0x9375, 0x2208, 0x009e, 0xa897, 0x4000, 0xa99a, - 0x715c, 0x81ff, 0x090c, 0x0dc5, 0x2148, 0x080c, 0x1040, 0x9006, - 0x705e, 0x918d, 0x0001, 0x2008, 0x0418, 0x7063, 0x0001, 0x7152, - 0x7054, 0x9300, 0x7056, 0x2061, 0x18b9, 0x2c44, 0xa37a, 0x7058, - 0xa076, 0x7064, 0xa072, 0xa48e, 0xa592, 0xa696, 0xa79a, 0xa09f, - 0x51eb, 0x000e, 0xa0a2, 0x080c, 0x10f8, 0x9006, 0x0048, 0x009e, - 0xa897, 0x4005, 0xa99a, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, - 0x00ee, 0x00fe, 0x0005, 0x00f6, 0xa0a0, 0x904d, 0x090c, 0x0dc5, - 0x00e6, 0x2071, 0x189e, 0xa06c, 0x908e, 0x0100, 0x0138, 0xa87b, - 0x0030, 0xa883, 0x0000, 0xa897, 0x4002, 0x00d8, 0x7060, 0x9005, - 0x1158, 0x7150, 0x7058, 0x20a0, 0x901e, 0x7064, 0x20e8, 0xa48c, - 0xa590, 0xa694, 0xa798, 0x0428, 0xa87b, 0x0000, 0xa883, 0x0000, - 0xa897, 0x4000, 0x7254, 0x900e, 0x2001, 0x0003, 0x080c, 0x9375, - 0xaa9a, 0x715c, 0x81ff, 0x090c, 0x0dc5, 0x2148, 0x080c, 0x1040, - 0x705f, 0x0000, 0xa0a0, 0x2048, 0x0126, 0x2091, 0x8000, 0x080c, - 0x6e9f, 0x012e, 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x00ee, 0x00fe, - 0x0005, 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x6aa3, - 0x0118, 0x080c, 0x6aab, 0x1148, 0xb814, 0x20a9, 0x0001, 0x4004, - 0xb810, 0x4004, 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, - 0x0120, 0x9386, 0x003c, 0x0518, 0x0c20, 0x83ff, 0x11f0, 0x7154, - 0x810c, 0xa99a, 0xa897, 0x4000, 0x715c, 0x81ff, 0x090c, 0x0dc5, - 0x2148, 0x080c, 0x1040, 0x9006, 0x705e, 0x918d, 0x0001, 0x2008, - 0xa0a0, 0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x6e9f, 0x012e, - 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x0070, 0x7063, 0x0001, 0x7152, - 0x7054, 0x9300, 0x7056, 0xa37a, 0xa48e, 0xa592, 0xa696, 0xa79a, - 0x080c, 0x10f8, 0x9006, 0x00ee, 0x0005, 0x0096, 0xa88c, 0x90be, - 0x7000, 0x0148, 0x90be, 0x7100, 0x0130, 0x90be, 0x7200, 0x0118, - 0x009e, 0x0804, 0x35ea, 0xa884, 0xa988, 0x080c, 0x2873, 0x1518, - 0x080c, 0x66b9, 0x1500, 0x7126, 0xbe12, 0xbd16, 0xae7c, 0x080c, - 0x4be4, 0x01c8, 0x080c, 0x4be4, 0x01b0, 0x009e, 0xa867, 0x0000, - 0xa868, 0xc0fd, 0xa86a, 0xa823, 0x0000, 0xa804, 0x2048, 0x080c, - 0xd284, 0x1120, 0x2009, 0x0003, 0x0804, 0x35e7, 0x7007, 0x0003, - 0x701f, 0x52b8, 0x0005, 0x009e, 0x2009, 0x0002, 0x0804, 0x35e7, - 0x7124, 0x080c, 0x334c, 0xa820, 0x9086, 0x8001, 0x1120, 0x2009, - 0x0004, 0x0804, 0x35e7, 0x2900, 0x7022, 0xa804, 0x0096, 0x2048, - 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x009e, - 0x9080, 0x0002, 0x0076, 0x0006, 0x2098, 0x20a0, 0x27e0, 0x27e8, - 0x20a9, 0x002a, 0x080c, 0x0f8b, 0xaa6c, 0xab70, 0xac74, 0xad78, - 0x2061, 0x18b8, 0x2c44, 0xa06b, 0x0000, 0xae64, 0xaf8c, 0x97c6, - 0x7000, 0x0118, 0x97c6, 0x7100, 0x1148, 0x96c2, 0x0004, 0x0600, - 0x2009, 0x0004, 0x000e, 0x007e, 0x0804, 0x4c30, 0x97c6, 0x7200, - 0x11b8, 0x96c2, 0x0054, 0x02a0, 0x000e, 0x007e, 0x2061, 0x18b8, - 0x2c44, 0xa076, 0xa772, 0xa07b, 0x002a, 0xa28e, 0xa392, 0xa496, - 0xa59a, 0x080c, 0x10f8, 0x7007, 0x0002, 0x701f, 0x5314, 0x0005, - 0x000e, 0x007e, 0x0804, 0x35ea, 0x7020, 0x2048, 0xa804, 0x2048, - 0xa804, 0x2048, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, - 0xffc0, 0x9080, 0x0002, 0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9, - 0x002a, 0x080c, 0x0f8b, 0x2100, 0x2238, 0x2061, 0x18b8, 0x2c44, - 0xa28c, 0xa390, 0xa494, 0xa598, 0x2009, 0x002a, 0x0804, 0x4c30, - 0x81ff, 0x1904, 0x35e7, 0x798c, 0x2001, 0x197e, 0x918c, 0x8000, - 0x2102, 0x080c, 0x4bfb, 0x0904, 0x35ea, 0x080c, 0x6aa3, 0x0120, - 0x080c, 0x6aab, 0x1904, 0x35ea, 0x080c, 0x67eb, 0x0904, 0x35e7, - 0x0126, 0x2091, 0x8000, 0x080c, 0x68b1, 0x012e, 0x0904, 0x35e7, - 0x2001, 0x197e, 0x2004, 0xd0fc, 0x1904, 0x35b5, 0x0804, 0x460c, - 0xa9a0, 0x2001, 0x197e, 0x918c, 0x8000, 0xc18d, 0x2102, 0x080c, - 0x4c08, 0x01a0, 0x080c, 0x6aa3, 0x0118, 0x080c, 0x6aab, 0x1170, - 0x080c, 0x67eb, 0x2009, 0x0002, 0x0128, 0x080c, 0x68b1, 0x1170, - 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, - 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, - 0x2001, 0x197e, 0x2004, 0xd0fc, 0x1128, 0x080c, 0x57dd, 0x0110, - 0x9006, 0x0018, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, - 0x78a8, 0xd08c, 0x1118, 0xd084, 0x0904, 0x4581, 0x080c, 0x4c17, - 0x0904, 0x35ea, 0x080c, 0x4be4, 0x1120, 0x2009, 0x0002, 0x0804, - 0x35e7, 0x080c, 0x6aa3, 0x0130, 0x908e, 0x0004, 0x0118, 0x908e, - 0x0005, 0x15a0, 0x78a8, 0xd08c, 0x0120, 0xb800, 0xc08c, 0xb802, - 0x0028, 0x080c, 0x57d5, 0xd0b4, 0x0904, 0x45bb, 0x7884, 0x908e, - 0x007e, 0x0904, 0x45bb, 0x908e, 0x007f, 0x0904, 0x45bb, 0x908e, - 0x0080, 0x0904, 0x45bb, 0xb800, 0xd08c, 0x1904, 0x45bb, 0xa867, - 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xd2a3, 0x1120, 0x2009, - 0x0003, 0x0804, 0x35e7, 0x7007, 0x0003, 0x701f, 0x53e0, 0x0005, - 0x080c, 0x4c17, 0x0904, 0x35ea, 0x0804, 0x45bb, 0x080c, 0x33a5, - 0x0108, 0x0005, 0x2009, 0x1834, 0x210c, 0x81ff, 0x0120, 0x2009, - 0x0001, 0x0804, 0x35e7, 0x080c, 0x57e9, 0x0120, 0x2009, 0x0007, - 0x0804, 0x35e7, 0x080c, 0x6a9b, 0x0120, 0x2009, 0x0008, 0x0804, - 0x35e7, 0xb89c, 0xd0a4, 0x1118, 0xd0ac, 0x1904, 0x45bb, 0x9006, - 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xd302, 0x1120, - 0x2009, 0x0003, 0x0804, 0x35e7, 0x7007, 0x0003, 0x701f, 0x5419, - 0x0005, 0xa830, 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, - 0x5729, 0x080c, 0x4c17, 0x0904, 0x35ea, 0x0804, 0x53b2, 0x81ff, - 0x2009, 0x0001, 0x1904, 0x35e7, 0x080c, 0x57e9, 0x2009, 0x0007, - 0x1904, 0x35e7, 0x080c, 0x6a9b, 0x0120, 0x2009, 0x0008, 0x0804, - 0x35e7, 0x080c, 0x4c17, 0x0904, 0x35ea, 0x080c, 0x6aa3, 0x2009, - 0x0009, 0x1904, 0x35e7, 0x080c, 0x4be4, 0x2009, 0x0002, 0x0904, - 0x35e7, 0x9006, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x7988, - 0xa95a, 0x9194, 0xfd00, 0x918c, 0x00ff, 0x9006, 0x82ff, 0x1128, - 0xc0ed, 0xa952, 0x798c, 0xa956, 0x0038, 0x928e, 0x0100, 0x1904, - 0x35ea, 0xc0e5, 0xa952, 0xa956, 0xa83e, 0x080c, 0xd555, 0x2009, - 0x0003, 0x0904, 0x35e7, 0x7007, 0x0003, 0x701f, 0x5470, 0x0005, - 0xa830, 0x9086, 0x0100, 0x2009, 0x0004, 0x0904, 0x35e7, 0x0804, - 0x35b5, 0x7aa8, 0x9284, 0xc000, 0x0148, 0xd2ec, 0x01a0, 0x080c, - 0x57e9, 0x1188, 0x2009, 0x0014, 0x0804, 0x35e7, 0xd2dc, 0x1578, - 0x81ff, 0x2009, 0x0001, 0x1904, 0x35e7, 0x080c, 0x57e9, 0x2009, - 0x0007, 0x1904, 0x35e7, 0xd2f4, 0x0138, 0x9284, 0x5000, 0xc0d5, - 0x080c, 0x57af, 0x0804, 0x35b5, 0xd2fc, 0x0160, 0x080c, 0x4c17, - 0x0904, 0x35ea, 0x7984, 0x9284, 0x9000, 0xc0d5, 0x080c, 0x5784, - 0x0804, 0x35b5, 0x080c, 0x4c17, 0x0904, 0x35ea, 0xb804, 0x9084, - 0x00ff, 0x9086, 0x0006, 0x2009, 0x0009, 0x1904, 0x555f, 0x080c, - 0x4be4, 0x2009, 0x0002, 0x0904, 0x555f, 0xa85c, 0x9080, 0x001b, - 0xaf60, 0x2009, 0x0008, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x080c, - 0x4c2d, 0x701f, 0x54cc, 0x0005, 0xa86c, 0x9086, 0x0500, 0x1138, - 0xa870, 0x9005, 0x1120, 0xa874, 0x9084, 0xff00, 0x0110, 0x1904, - 0x35ea, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0x4c17, - 0x1110, 0x0804, 0x35ea, 0x2009, 0x0043, 0x080c, 0xd5c1, 0x2009, - 0x0003, 0x0904, 0x555f, 0x7007, 0x0003, 0x701f, 0x54f0, 0x0005, - 0xa830, 0x9086, 0x0100, 0x2009, 0x0004, 0x0904, 0x555f, 0x7984, - 0x7aa8, 0x9284, 0x1000, 0xc0d5, 0x080c, 0x5784, 0x0804, 0x35b5, - 0x00c6, 0xaab0, 0x9284, 0xc000, 0x0148, 0xd2ec, 0x0170, 0x080c, - 0x57e9, 0x1158, 0x2009, 0x0014, 0x0804, 0x554e, 0x2061, 0x1800, - 0x080c, 0x57e9, 0x2009, 0x0007, 0x15c8, 0xd2f4, 0x0130, 0x9284, - 0x5000, 0xc0d5, 0x080c, 0x57af, 0x0058, 0xd2fc, 0x0180, 0x080c, - 0x4c15, 0x0590, 0xa998, 0x9284, 0x9000, 0xc0d5, 0x080c, 0x5784, - 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x0438, 0x080c, - 0x4c15, 0x0510, 0x080c, 0x6aa3, 0x2009, 0x0009, 0x11b8, 0xa8c4, - 0x9086, 0x0500, 0x11c8, 0xa8c8, 0x9005, 0x11b0, 0xa8cc, 0x9084, - 0xff00, 0x1190, 0x080c, 0x4c15, 0x1108, 0x0070, 0x2009, 0x004b, - 0x080c, 0xd5c1, 0x2009, 0x0003, 0x0108, 0x0078, 0x0431, 0x19c0, - 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, - 0x0001, 0x2001, 0x0030, 0x00ce, 0x0005, 0x9006, 0x0ce0, 0x7aa8, - 0xd2dc, 0x0904, 0x35e7, 0x0016, 0x7984, 0x9284, 0x1000, 0xc0fd, - 0x080c, 0x5784, 0x001e, 0x1904, 0x35e7, 0x0804, 0x35b5, 0x00f6, - 0x2d78, 0xaab0, 0x0021, 0x00fe, 0x0005, 0xaab0, 0xc2d5, 0xd2dc, - 0x0150, 0x0016, 0xa998, 0x9284, 0x1400, 0xc0fd, 0x080c, 0x5784, - 0x001e, 0x9085, 0x0001, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, - 0x0804, 0x35e7, 0x080c, 0x57e9, 0x0120, 0x2009, 0x0007, 0x0804, - 0x35e7, 0x7984, 0x7ea8, 0x96b4, 0x00ff, 0x080c, 0x6724, 0x1904, - 0x35ea, 0x9186, 0x007f, 0x0138, 0x080c, 0x6aa3, 0x0120, 0x2009, - 0x0009, 0x0804, 0x35e7, 0x080c, 0x4be4, 0x1120, 0x2009, 0x0002, - 0x0804, 0x35e7, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x2001, - 0x0100, 0x8007, 0xa80a, 0x080c, 0xd2bd, 0x1120, 0x2009, 0x0003, - 0x0804, 0x35e7, 0x7007, 0x0003, 0x701f, 0x55bf, 0x0005, 0xa808, - 0x8007, 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x35e7, - 0xa8e0, 0xa866, 0xa810, 0x8007, 0x9084, 0x00ff, 0x800c, 0xa814, - 0x8007, 0x9084, 0x00ff, 0x8004, 0x9080, 0x0002, 0x9108, 0x8906, - 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0004, - 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, 0x4c30, 0x080c, 0x4be4, - 0x1120, 0x2009, 0x0002, 0x0804, 0x35e7, 0x7984, 0x9194, 0xff00, - 0x918c, 0x00ff, 0x8217, 0x82ff, 0x1118, 0x7023, 0x19b4, 0x0040, - 0x92c6, 0x0001, 0x1118, 0x7023, 0x19ce, 0x0010, 0x0804, 0x35ea, - 0x2009, 0x001a, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, - 0x0019, 0xaf60, 0x080c, 0x4c2d, 0x701f, 0x560f, 0x0005, 0x2001, - 0x182e, 0x2003, 0x0001, 0xa85c, 0x9080, 0x0019, 0x2098, 0xa860, - 0x20e0, 0x20a9, 0x001a, 0x7020, 0x20a0, 0x20e9, 0x0001, 0x4003, - 0x0804, 0x35b5, 0x080c, 0x4be4, 0x1120, 0x2009, 0x0002, 0x0804, - 0x35e7, 0x7984, 0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff, - 0x1118, 0x2099, 0x19b4, 0x0040, 0x92c6, 0x0001, 0x1118, 0x2099, - 0x19ce, 0x0010, 0x0804, 0x35ea, 0xa85c, 0x9080, 0x0019, 0x20a0, - 0xa860, 0x20e8, 0x20a9, 0x001a, 0x20e1, 0x0001, 0x4003, 0x2009, - 0x001a, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, - 0xaf60, 0x0804, 0x4c30, 0x7884, 0x908a, 0x1000, 0x1a04, 0x35ea, - 0x0126, 0x2091, 0x8000, 0x8003, 0x800b, 0x810b, 0x9108, 0x00c6, - 0x2061, 0x19fb, 0x614a, 0x00ce, 0x012e, 0x0804, 0x35b5, 0x00c6, - 0x080c, 0x7637, 0x1160, 0x080c, 0x7932, 0x080c, 0x612e, 0x9085, - 0x0001, 0x080c, 0x767b, 0x080c, 0x7563, 0x080c, 0x0dc5, 0x2061, - 0x1800, 0x6030, 0xc09d, 0x6032, 0x080c, 0x5fed, 0x00ce, 0x0005, - 0x00c6, 0x2001, 0x1800, 0x2004, 0x908e, 0x0000, 0x0904, 0x35e7, - 0x7884, 0x9005, 0x0188, 0x7888, 0x2061, 0x199c, 0x2c0c, 0x2062, - 0x080c, 0x2c49, 0x01a0, 0x080c, 0x2c51, 0x0188, 0x080c, 0x2c59, - 0x0170, 0x2162, 0x0804, 0x35ea, 0x2061, 0x0100, 0x6038, 0x9086, - 0x0007, 0x1118, 0x2009, 0x0001, 0x0010, 0x2009, 0x0000, 0x7884, - 0x9086, 0x0002, 0x1568, 0x2061, 0x0100, 0x6028, 0xc09c, 0x602a, - 0x0026, 0x2011, 0x0003, 0x080c, 0xaabf, 0x2011, 0x0002, 0x080c, - 0xaac9, 0x002e, 0x080c, 0xa9d3, 0x0036, 0x901e, 0x080c, 0xaa49, - 0x003e, 0x60e3, 0x0000, 0x080c, 0xf07f, 0x080c, 0xf09a, 0x9085, - 0x0001, 0x080c, 0x767b, 0x9006, 0x080c, 0x2d39, 0x2001, 0x1800, - 0x2003, 0x0004, 0x2001, 0x19a8, 0x2003, 0x0000, 0x6027, 0x0008, - 0x00ce, 0x0804, 0x35b5, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, - 0x35e7, 0x080c, 0x57e9, 0x0120, 0x2009, 0x0007, 0x0804, 0x35e7, - 0x7984, 0x7ea8, 0x96b4, 0x00ff, 0x080c, 0x6724, 0x1904, 0x35ea, - 0x9186, 0x007f, 0x0138, 0x080c, 0x6aa3, 0x0120, 0x2009, 0x0009, - 0x0804, 0x35e7, 0x080c, 0x4be4, 0x1120, 0x2009, 0x0002, 0x0804, - 0x35e7, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xd2c0, - 0x1120, 0x2009, 0x0003, 0x0804, 0x35e7, 0x7007, 0x0003, 0x701f, - 0x5712, 0x0005, 0xa830, 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, - 0x0804, 0x35e7, 0xa8e0, 0xa866, 0xa834, 0x8007, 0x800c, 0xa85c, - 0x9080, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xaf60, 0x0804, - 0x4c30, 0xa898, 0x9086, 0x000d, 0x1904, 0x35e7, 0x2021, 0x4005, - 0x0126, 0x2091, 0x8000, 0x0e04, 0x5736, 0x0010, 0x012e, 0x0cc0, - 0x7c36, 0x9486, 0x4000, 0x0118, 0x7833, 0x0011, 0x0010, 0x7833, - 0x0010, 0x7883, 0x4005, 0xa998, 0x7986, 0xa9a4, 0x799a, 0xa9a8, - 0x799e, 0x080c, 0x4c20, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, - 0xd084, 0x190c, 0x11aa, 0x7007, 0x0001, 0x2091, 0x5000, 0x700f, - 0x0000, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00c6, 0x2061, - 0x19fb, 0x7984, 0x615a, 0x6156, 0x605f, 0x0000, 0x6053, 0x0009, - 0x7898, 0x6072, 0x789c, 0x606e, 0x7888, 0x606a, 0x788c, 0x6066, - 0x2001, 0x1a0b, 0x2044, 0x2001, 0x1a12, 0xa076, 0xa060, 0xa072, - 0xa07b, 0x0001, 0xa07f, 0x0002, 0xa06b, 0x0000, 0xa09f, 0x0000, - 0x00ce, 0x012e, 0x0804, 0x35b5, 0x0126, 0x2091, 0x8000, 0x00b6, - 0x00c6, 0x90e4, 0xc000, 0x0168, 0x0006, 0xd0d4, 0x0130, 0x0036, - 0x2019, 0x0029, 0x080c, 0x336a, 0x003e, 0x080c, 0xd125, 0x000e, - 0x1198, 0xd0e4, 0x0160, 0x9180, 0x1000, 0x2004, 0x905d, 0x0160, - 0x080c, 0x6148, 0x080c, 0xb23d, 0x0110, 0xb817, 0x0000, 0x9006, - 0x00ce, 0x00be, 0x012e, 0x0005, 0x9085, 0x0001, 0x0cc8, 0x0126, - 0x2091, 0x8000, 0x0156, 0x2010, 0x900e, 0x20a9, 0x0800, 0x0016, - 0x9180, 0x1000, 0x2004, 0x9005, 0x0188, 0x9186, 0x007e, 0x0170, - 0x9186, 0x007f, 0x0158, 0x9186, 0x0080, 0x0140, 0x9186, 0x00ff, - 0x0128, 0x0026, 0x2200, 0x080c, 0x5784, 0x002e, 0x001e, 0x8108, - 0x1f04, 0x57b7, 0x015e, 0x012e, 0x0005, 0x2001, 0x1848, 0x2004, - 0x0005, 0x2001, 0x1867, 0x2004, 0x0005, 0x0006, 0x2001, 0x1810, - 0x2004, 0xd0d4, 0x000e, 0x0005, 0x2001, 0x180e, 0x2004, 0xd0b4, - 0x0005, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x0005, 0x0016, - 0x00e6, 0x2071, 0x189e, 0x7108, 0x910d, 0x710a, 0x00ee, 0x001e, - 0x0005, 0x79a4, 0x81ff, 0x0904, 0x35ea, 0x9182, 0x0081, 0x1a04, - 0x35ea, 0x810c, 0x0016, 0x080c, 0x4be4, 0x0170, 0x080c, 0x0f16, - 0x2100, 0x2238, 0x7d84, 0x7c88, 0x7b8c, 0x7a90, 0x001e, 0x080c, - 0x4c2d, 0x701f, 0x5819, 0x0005, 0x001e, 0x2009, 0x0002, 0x0804, - 0x35e7, 0x2079, 0x0000, 0x7d94, 0x7c98, 0x7ba8, 0x7aac, 0x79a4, - 0x810c, 0x2061, 0x18b8, 0x2c44, 0xa770, 0xa074, 0x2071, 0x189e, - 0x080c, 0x4c30, 0x701f, 0x582d, 0x0005, 0x2061, 0x18b8, 0x2c44, - 0x0016, 0x0026, 0xa270, 0xa174, 0x080c, 0x0f1e, 0x002e, 0x001e, - 0x080c, 0x0fcb, 0x9006, 0xa802, 0xa806, 0x0804, 0x35b5, 0x0126, - 0x0156, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, - 0x00f6, 0x2061, 0x0100, 0x2069, 0x0200, 0x2071, 0x1800, 0x6044, - 0xd0a4, 0x11e8, 0xd084, 0x0118, 0x080c, 0x59ed, 0x0068, 0xd08c, - 0x0118, 0x080c, 0x58f6, 0x0040, 0xd094, 0x0118, 0x080c, 0x58c6, - 0x0018, 0xd09c, 0x0108, 0x0099, 0x00fe, 0x00ee, 0x00de, 0x00ce, - 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, 0x012e, 0x0005, 0x0016, - 0x6128, 0xd19c, 0x1110, 0xc19d, 0x612a, 0x001e, 0x0c68, 0x7030, - 0xd09c, 0x1120, 0x6004, 0x9085, 0x0002, 0x6006, 0x7098, 0x9005, - 0x0120, 0x709b, 0x0000, 0x7093, 0x0000, 0x624c, 0x9286, 0xf0f0, - 0x1150, 0x6048, 0x9086, 0xf0f0, 0x0130, 0x624a, 0x6043, 0x0090, - 0x6043, 0x0010, 0x0490, 0x9294, 0xff00, 0x9296, 0xf700, 0x0178, - 0x7138, 0xd1a4, 0x1160, 0x6240, 0x9295, 0x0100, 0x6242, 0x9294, - 0x0010, 0x0128, 0x2009, 0x00f7, 0x080c, 0x60aa, 0x00f0, 0x6040, - 0x9084, 0x0010, 0x9085, 0x0140, 0x6042, 0x6043, 0x0000, 0x7087, - 0x0000, 0x70a3, 0x0001, 0x70c7, 0x0000, 0x70df, 0x0000, 0x2009, - 0x1c80, 0x200b, 0x0000, 0x7097, 0x0000, 0x708b, 0x000f, 0x2009, - 0x000f, 0x2011, 0x5f90, 0x080c, 0x88d5, 0x0005, 0x2001, 0x1869, - 0x2004, 0xd08c, 0x0110, 0x705f, 0xffff, 0x7088, 0x9005, 0x1528, - 0x2011, 0x5f90, 0x080c, 0x883d, 0x6040, 0x9094, 0x0010, 0x9285, - 0x0020, 0x6042, 0x20a9, 0x00c8, 0x6044, 0xd08c, 0x1168, 0x1f04, - 0x58dc, 0x6242, 0x709b, 0x0000, 0x6040, 0x9094, 0x0010, 0x9285, - 0x0080, 0x6042, 0x6242, 0x0048, 0x6242, 0x709b, 0x0000, 0x708f, - 0x0000, 0x9006, 0x080c, 0x6133, 0x0000, 0x0005, 0x708c, 0x908a, - 0x0003, 0x1a0c, 0x0dc5, 0x000b, 0x0005, 0x5900, 0x5951, 0x59ec, - 0x00f6, 0x0016, 0x6900, 0x918c, 0x0800, 0x708f, 0x0001, 0x2001, - 0x015d, 0x2003, 0x0000, 0x6803, 0x00fc, 0x20a9, 0x0004, 0x6800, - 0x9084, 0x00fc, 0x0120, 0x1f04, 0x590f, 0x080c, 0x0dc5, 0x68a0, - 0x68a2, 0x689c, 0x689e, 0x6898, 0x689a, 0xa001, 0x918d, 0x1600, - 0x6902, 0x001e, 0x6837, 0x0020, 0x080c, 0x610f, 0x2079, 0x1c00, - 0x7833, 0x1101, 0x7837, 0x0000, 0x20e1, 0x0001, 0x2099, 0x1805, - 0x20e9, 0x0001, 0x20a1, 0x1c0e, 0x20a9, 0x0004, 0x4003, 0x080c, - 0xaf8e, 0x20e1, 0x0001, 0x2099, 0x1c00, 0x20e9, 0x0000, 0x20a1, - 0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, 0x600f, 0x0000, - 0x080c, 0x5fc1, 0x00fe, 0x9006, 0x7092, 0x6043, 0x0008, 0x6042, - 0x0005, 0x00f6, 0x7090, 0x7093, 0x0000, 0x9025, 0x0904, 0x59c9, - 0x6020, 0xd0b4, 0x1904, 0x59c7, 0x71a0, 0x81ff, 0x0904, 0x59b5, - 0x9486, 0x000c, 0x1904, 0x59c2, 0x9480, 0x0018, 0x8004, 0x20a8, - 0x080c, 0x6108, 0x2011, 0x0260, 0x2019, 0x1c00, 0x220c, 0x2304, - 0x9106, 0x11e8, 0x8210, 0x8318, 0x1f04, 0x596e, 0x6043, 0x0004, - 0x2061, 0x0140, 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100, - 0x6043, 0x0006, 0x708f, 0x0002, 0x709b, 0x0002, 0x2009, 0x07d0, - 0x2011, 0x5f97, 0x080c, 0x88d5, 0x080c, 0x610f, 0x04c0, 0x080c, - 0x6108, 0x2079, 0x0260, 0x7930, 0x918e, 0x1101, 0x1558, 0x7834, - 0x9005, 0x1540, 0x7900, 0x918c, 0x00ff, 0x1118, 0x7804, 0x9005, - 0x0190, 0x080c, 0x6108, 0x2011, 0x026e, 0x2019, 0x1805, 0x20a9, - 0x0004, 0x220c, 0x2304, 0x9102, 0x0230, 0x11a0, 0x8210, 0x8318, - 0x1f04, 0x59a9, 0x0078, 0x70a3, 0x0000, 0x080c, 0x6108, 0x20e1, - 0x0000, 0x2099, 0x0260, 0x20e9, 0x0001, 0x20a1, 0x1c00, 0x20a9, - 0x0014, 0x4003, 0x6043, 0x0008, 0x6043, 0x0000, 0x0010, 0x00fe, - 0x0005, 0x6040, 0x9085, 0x0100, 0x6042, 0x6020, 0xd0b4, 0x1db8, - 0x080c, 0xaf8e, 0x20e1, 0x0001, 0x2099, 0x1c00, 0x20e9, 0x0000, - 0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, 0x2011, - 0x19f2, 0x2013, 0x0000, 0x7093, 0x0000, 0x60a3, 0x0056, 0x60a7, - 0x9575, 0x080c, 0xa6e0, 0x08d8, 0x0005, 0x7098, 0x908a, 0x001d, - 0x1a0c, 0x0dc5, 0x000b, 0x0005, 0x5a1e, 0x5a31, 0x5a5a, 0x5a7a, - 0x5aa0, 0x5acf, 0x5af5, 0x5b2d, 0x5b53, 0x5b81, 0x5bbc, 0x5bf4, - 0x5c12, 0x5c3d, 0x5c5f, 0x5c7a, 0x5c84, 0x5cb8, 0x5cde, 0x5d0d, - 0x5d33, 0x5d6b, 0x5daf, 0x5dec, 0x5e0d, 0x5e66, 0x5e88, 0x5eb6, - 0x5eb6, 0x00c6, 0x2061, 0x1800, 0x6003, 0x0007, 0x2061, 0x0100, - 0x6004, 0x9084, 0xfff9, 0x6006, 0x00ce, 0x0005, 0x2061, 0x0140, - 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043, 0x0002, - 0x709b, 0x0001, 0x2009, 0x07d0, 0x2011, 0x5f97, 0x080c, 0x88d5, - 0x0005, 0x00f6, 0x7090, 0x9086, 0x0014, 0x1510, 0x6042, 0x6020, - 0xd0b4, 0x11f0, 0x080c, 0x6108, 0x2079, 0x0260, 0x7a30, 0x9296, - 0x1102, 0x11a0, 0x7834, 0x9005, 0x1188, 0x7a38, 0xd2fc, 0x0128, - 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x2011, 0x5f97, 0x080c, - 0x883d, 0x709b, 0x0010, 0x080c, 0x5c84, 0x0010, 0x7093, 0x0000, - 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0003, 0x6043, 0x0004, 0x2011, - 0x5f97, 0x080c, 0x883d, 0x080c, 0x608c, 0x2079, 0x0240, 0x7833, - 0x1102, 0x7837, 0x0000, 0x20a9, 0x0008, 0x9f88, 0x000e, 0x200b, - 0x0000, 0x8108, 0x1f04, 0x5a6f, 0x60c3, 0x0014, 0x080c, 0x5fc1, - 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500, 0x2011, 0x5f97, - 0x080c, 0x883d, 0x9086, 0x0014, 0x11b8, 0x080c, 0x6108, 0x2079, - 0x0260, 0x7a30, 0x9296, 0x1102, 0x1178, 0x7834, 0x9005, 0x1160, - 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, - 0x709b, 0x0004, 0x0029, 0x0010, 0x080c, 0x60e4, 0x00fe, 0x0005, - 0x00f6, 0x709b, 0x0005, 0x080c, 0x608c, 0x2079, 0x0240, 0x7833, - 0x1103, 0x7837, 0x0000, 0x080c, 0x6108, 0x080c, 0x60eb, 0x1170, - 0x7084, 0x9005, 0x1158, 0x715c, 0x9186, 0xffff, 0x0138, 0x2011, - 0x0008, 0x080c, 0x5f44, 0x0168, 0x080c, 0x60c1, 0x20a9, 0x0008, - 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, - 0x4003, 0x60c3, 0x0014, 0x080c, 0x5fc1, 0x00fe, 0x0005, 0x00f6, - 0x7090, 0x9005, 0x0500, 0x2011, 0x5f97, 0x080c, 0x883d, 0x9086, - 0x0014, 0x11b8, 0x080c, 0x6108, 0x2079, 0x0260, 0x7a30, 0x9296, - 0x1103, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, - 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, 0x0006, 0x0029, - 0x0010, 0x080c, 0x60e4, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0007, - 0x080c, 0x608c, 0x2079, 0x0240, 0x7833, 0x1104, 0x7837, 0x0000, - 0x080c, 0x6108, 0x080c, 0x60eb, 0x11b8, 0x7084, 0x9005, 0x11a0, - 0x7164, 0x9186, 0xffff, 0x0180, 0x9180, 0x33b6, 0x200d, 0x918c, - 0xff00, 0x810f, 0x2011, 0x0008, 0x080c, 0x5f44, 0x0180, 0x080c, - 0x50d1, 0x0110, 0x080c, 0x28dc, 0x20a9, 0x0008, 0x20e1, 0x0000, - 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, - 0x0014, 0x080c, 0x5fc1, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, - 0x0500, 0x2011, 0x5f97, 0x080c, 0x883d, 0x9086, 0x0014, 0x11b8, - 0x080c, 0x6108, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, 0x1178, - 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, - 0x1110, 0x70c7, 0x0001, 0x709b, 0x0008, 0x0029, 0x0010, 0x080c, - 0x60e4, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0009, 0x080c, 0x608c, - 0x2079, 0x0240, 0x7833, 0x1105, 0x7837, 0x0100, 0x080c, 0x60eb, - 0x1150, 0x7084, 0x9005, 0x1138, 0x080c, 0x5eb7, 0x1188, 0x9085, - 0x0001, 0x080c, 0x28dc, 0x20a9, 0x0008, 0x080c, 0x6108, 0x20e1, - 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, - 0x60c3, 0x0014, 0x080c, 0x5fc1, 0x0010, 0x080c, 0x5a11, 0x00fe, - 0x0005, 0x00f6, 0x7090, 0x9005, 0x05a8, 0x2011, 0x5f97, 0x080c, - 0x883d, 0x9086, 0x0014, 0x1560, 0x080c, 0x6108, 0x2079, 0x0260, - 0x7a30, 0x9296, 0x1105, 0x1520, 0x7834, 0x9084, 0x0100, 0x2011, - 0x0100, 0x921e, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, - 0x1110, 0x70c7, 0x0001, 0x709b, 0x000a, 0x00b1, 0x0098, 0x9005, - 0x1178, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, - 0x0001, 0x7097, 0x0000, 0x709b, 0x000e, 0x080c, 0x5c5f, 0x0010, - 0x080c, 0x60e4, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x000b, 0x2011, - 0x1c0e, 0x20e9, 0x0001, 0x22a0, 0x20a9, 0x0040, 0x2019, 0xffff, - 0x4304, 0x080c, 0x608c, 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, - 0x0000, 0x080c, 0x60eb, 0x0118, 0x2013, 0x0000, 0x0020, 0x7060, - 0x9085, 0x0100, 0x2012, 0x20a9, 0x0040, 0x2009, 0x024e, 0x2011, - 0x1c0e, 0x220e, 0x8210, 0x8108, 0x9186, 0x0260, 0x1128, 0x6810, - 0x8000, 0x6812, 0x2009, 0x0240, 0x1f04, 0x5be1, 0x60c3, 0x0084, - 0x080c, 0x5fc1, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x01c0, - 0x2011, 0x5f97, 0x080c, 0x883d, 0x9086, 0x0084, 0x1178, 0x080c, - 0x6108, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1106, 0x1138, 0x7834, - 0x9005, 0x1120, 0x709b, 0x000c, 0x0029, 0x0010, 0x080c, 0x60e4, - 0x00fe, 0x0005, 0x00f6, 0x709b, 0x000d, 0x080c, 0x608c, 0x2079, - 0x0240, 0x7833, 0x1107, 0x7837, 0x0000, 0x080c, 0x6108, 0x20a9, - 0x0040, 0x2011, 0x026e, 0x2009, 0x024e, 0x220e, 0x8210, 0x8108, - 0x9186, 0x0260, 0x1150, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, - 0x6814, 0x8000, 0x6816, 0x2011, 0x0260, 0x1f04, 0x5c25, 0x60c3, - 0x0084, 0x080c, 0x5fc1, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, - 0x01e0, 0x2011, 0x5f97, 0x080c, 0x883d, 0x9086, 0x0084, 0x1198, - 0x080c, 0x6108, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, - 0x7834, 0x9005, 0x1140, 0x7097, 0x0001, 0x080c, 0x605e, 0x709b, - 0x000e, 0x0029, 0x0010, 0x080c, 0x60e4, 0x00fe, 0x0005, 0x918d, - 0x0001, 0x080c, 0x6133, 0x709b, 0x000f, 0x7093, 0x0000, 0x2061, - 0x0140, 0x605b, 0xbc85, 0x605f, 0xb5b5, 0x2061, 0x0100, 0x6043, - 0x0005, 0x6043, 0x0004, 0x2009, 0x07d0, 0x2011, 0x5f97, 0x080c, - 0x8831, 0x0005, 0x7090, 0x9005, 0x0130, 0x2011, 0x5f97, 0x080c, - 0x883d, 0x709b, 0x0000, 0x0005, 0x709b, 0x0011, 0x080c, 0xaf8e, - 0x080c, 0x6108, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, - 0x20a1, 0x0240, 0x7490, 0x9480, 0x0018, 0x9080, 0x0007, 0x9084, - 0x03f8, 0x8004, 0x20a8, 0x4003, 0x080c, 0x60eb, 0x11a0, 0x717c, - 0x81ff, 0x0188, 0x900e, 0x7080, 0x9084, 0x00ff, 0x0160, 0x080c, - 0x2873, 0x9186, 0x007e, 0x0138, 0x9186, 0x0080, 0x0120, 0x2011, - 0x0008, 0x080c, 0x5f44, 0x60c3, 0x0014, 0x080c, 0x5fc1, 0x0005, - 0x00f6, 0x7090, 0x9005, 0x0500, 0x2011, 0x5f97, 0x080c, 0x883d, - 0x9086, 0x0014, 0x11b8, 0x080c, 0x6108, 0x2079, 0x0260, 0x7a30, - 0x9296, 0x1103, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, - 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, 0x0012, - 0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x709b, - 0x0013, 0x080c, 0x609a, 0x2079, 0x0240, 0x7833, 0x1103, 0x7837, - 0x0000, 0x080c, 0x6108, 0x080c, 0x60eb, 0x1170, 0x7084, 0x9005, - 0x1158, 0x715c, 0x9186, 0xffff, 0x0138, 0x2011, 0x0008, 0x080c, - 0x5f44, 0x0168, 0x080c, 0x60c1, 0x20a9, 0x0008, 0x20e1, 0x0000, - 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, - 0x0014, 0x080c, 0x5fc1, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, - 0x0500, 0x2011, 0x5f97, 0x080c, 0x883d, 0x9086, 0x0014, 0x11b8, - 0x080c, 0x6108, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, 0x1178, - 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, - 0x1110, 0x70c7, 0x0001, 0x709b, 0x0014, 0x0029, 0x0010, 0x7093, - 0x0000, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0015, 0x080c, 0x609a, - 0x2079, 0x0240, 0x7833, 0x1104, 0x7837, 0x0000, 0x080c, 0x6108, - 0x080c, 0x60eb, 0x11b8, 0x7084, 0x9005, 0x11a0, 0x7164, 0x9186, - 0xffff, 0x0180, 0x9180, 0x33b6, 0x200d, 0x918c, 0xff00, 0x810f, - 0x2011, 0x0008, 0x080c, 0x5f44, 0x0180, 0x080c, 0x50d1, 0x0110, - 0x080c, 0x28dc, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, - 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, - 0x5fc1, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x05f0, 0x2011, - 0x5f97, 0x080c, 0x883d, 0x9086, 0x0014, 0x15a8, 0x080c, 0x6108, - 0x2079, 0x0260, 0x7a30, 0x9296, 0x1105, 0x1568, 0x7834, 0x9084, - 0x0100, 0x2011, 0x0100, 0x921e, 0x1168, 0x9085, 0x0001, 0x080c, - 0x6133, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, - 0x0001, 0x0080, 0x9005, 0x11b8, 0x7a38, 0xd2fc, 0x0128, 0x70c4, - 0x9005, 0x1110, 0x70c7, 0x0001, 0x9085, 0x0001, 0x080c, 0x6133, - 0x7097, 0x0000, 0x7a38, 0xd2f4, 0x0110, 0x70df, 0x0008, 0x709b, - 0x0016, 0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x080c, - 0xaf8e, 0x080c, 0x6108, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, - 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000e, 0x4003, 0x2011, 0x026d, - 0x2204, 0x9084, 0x0100, 0x2011, 0x024d, 0x2012, 0x2011, 0x026e, - 0x709b, 0x0017, 0x080c, 0x60eb, 0x1150, 0x7084, 0x9005, 0x1138, - 0x080c, 0x5eb7, 0x1188, 0x9085, 0x0001, 0x080c, 0x28dc, 0x20a9, - 0x0008, 0x080c, 0x6108, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, - 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5fc1, - 0x0010, 0x080c, 0x5a11, 0x0005, 0x00f6, 0x7090, 0x9005, 0x01d8, - 0x2011, 0x5f97, 0x080c, 0x883d, 0x9086, 0x0084, 0x1190, 0x080c, - 0x6108, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1106, 0x1150, 0x7834, - 0x9005, 0x1138, 0x9006, 0x080c, 0x6133, 0x709b, 0x0018, 0x0029, - 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0019, - 0x080c, 0x609a, 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, 0x0000, - 0x080c, 0x6108, 0x2009, 0x026e, 0x2039, 0x1c0e, 0x20a9, 0x0040, - 0x213e, 0x8738, 0x8108, 0x9186, 0x0280, 0x1128, 0x6814, 0x8000, - 0x6816, 0x2009, 0x0260, 0x1f04, 0x5e20, 0x2039, 0x1c0e, 0x080c, - 0x60eb, 0x11e8, 0x2728, 0x2514, 0x8207, 0x9084, 0x00ff, 0x8000, - 0x2018, 0x9294, 0x00ff, 0x8007, 0x9205, 0x202a, 0x7060, 0x2310, - 0x8214, 0x92a0, 0x1c0e, 0x2414, 0x938c, 0x0001, 0x0118, 0x9294, - 0xff00, 0x0018, 0x9294, 0x00ff, 0x8007, 0x9215, 0x2222, 0x20a9, - 0x0040, 0x2009, 0x024e, 0x270e, 0x8738, 0x8108, 0x9186, 0x0260, - 0x1128, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x1f04, 0x5e53, - 0x60c3, 0x0084, 0x080c, 0x5fc1, 0x00fe, 0x0005, 0x00f6, 0x7090, - 0x9005, 0x01e0, 0x2011, 0x5f97, 0x080c, 0x883d, 0x9086, 0x0084, - 0x1198, 0x080c, 0x6108, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, - 0x1158, 0x7834, 0x9005, 0x1140, 0x7097, 0x0001, 0x080c, 0x605e, - 0x709b, 0x001a, 0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, - 0x9085, 0x0001, 0x080c, 0x6133, 0x709b, 0x001b, 0x080c, 0xaf8e, - 0x080c, 0x6108, 0x2011, 0x0260, 0x2009, 0x0240, 0x7490, 0x9480, - 0x0018, 0x9080, 0x0007, 0x9084, 0x03f8, 0x8004, 0x20a8, 0x220e, - 0x8210, 0x8108, 0x9186, 0x0260, 0x1150, 0x6810, 0x8000, 0x6812, - 0x2009, 0x0240, 0x6814, 0x8000, 0x6816, 0x2011, 0x0260, 0x1f04, - 0x5e9f, 0x60c3, 0x0084, 0x080c, 0x5fc1, 0x0005, 0x0005, 0x0086, - 0x0096, 0x2029, 0x1848, 0x252c, 0x20a9, 0x0008, 0x2041, 0x1c0e, - 0x20e9, 0x0001, 0x28a0, 0x080c, 0x6108, 0x20e1, 0x0000, 0x2099, - 0x026e, 0x4003, 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0108, - 0x9016, 0x2800, 0x9200, 0x200c, 0x91a6, 0xffff, 0x1148, 0xd5d4, - 0x0110, 0x8210, 0x0008, 0x8211, 0x1f04, 0x5ed1, 0x0804, 0x5f40, - 0x82ff, 0x1160, 0xd5d4, 0x0120, 0x91a6, 0x3fff, 0x0d90, 0x0020, - 0x91a6, 0x3fff, 0x0904, 0x5f40, 0x918d, 0xc000, 0x20a9, 0x0010, - 0x2019, 0x0001, 0xd5d4, 0x0110, 0x2019, 0x0010, 0x2120, 0xd5d4, - 0x0110, 0x8423, 0x0008, 0x8424, 0x1240, 0xd5d4, 0x0110, 0x8319, - 0x0008, 0x8318, 0x1f04, 0x5ef7, 0x04d8, 0x23a8, 0x2021, 0x0001, - 0x8426, 0x8425, 0x1f04, 0x5f09, 0x2328, 0x8529, 0x92be, 0x0007, - 0x0158, 0x0006, 0x2039, 0x0007, 0x2200, 0x973a, 0x000e, 0x27a8, - 0x95a8, 0x0010, 0x1f04, 0x5f18, 0x755e, 0x95c8, 0x33b6, 0x292d, - 0x95ac, 0x00ff, 0x7582, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, - 0x28bc, 0x001e, 0x60e7, 0x0000, 0x65ea, 0x2018, 0x2304, 0x9405, - 0x201a, 0x7087, 0x0001, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x20e1, - 0x0001, 0x2898, 0x20a9, 0x0008, 0x4003, 0x9085, 0x0001, 0x0008, - 0x9006, 0x009e, 0x008e, 0x0005, 0x0156, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x22a8, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, - 0x2011, 0x024e, 0x22a0, 0x4003, 0x014e, 0x013e, 0x01de, 0x01ce, - 0x015e, 0x2118, 0x9026, 0x2001, 0x0007, 0x939a, 0x0010, 0x0218, - 0x8420, 0x8001, 0x0cd0, 0x2118, 0x84ff, 0x0120, 0x939a, 0x0010, - 0x8421, 0x1de0, 0x2021, 0x0001, 0x83ff, 0x0118, 0x8423, 0x8319, - 0x1de8, 0x9238, 0x2029, 0x026e, 0x9528, 0x2504, 0x942c, 0x11b8, - 0x9405, 0x203a, 0x715e, 0x91a0, 0x33b6, 0x242d, 0x95ac, 0x00ff, - 0x7582, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x28bc, 0x001e, - 0x60e7, 0x0000, 0x65ea, 0x7087, 0x0001, 0x9084, 0x0000, 0x0005, - 0x00e6, 0x2071, 0x1800, 0x708b, 0x0000, 0x00ee, 0x0005, 0x00e6, - 0x00f6, 0x2079, 0x0100, 0x2071, 0x0140, 0x080c, 0x604d, 0x080c, - 0xa6e9, 0x7004, 0x9084, 0x4000, 0x0110, 0x080c, 0x2d49, 0x0126, - 0x2091, 0x8000, 0x2071, 0x1826, 0x2073, 0x0000, 0x7840, 0x0026, - 0x0016, 0x2009, 0x00f7, 0x080c, 0x60aa, 0x001e, 0x9094, 0x0010, - 0x9285, 0x0080, 0x7842, 0x7a42, 0x002e, 0x012e, 0x00fe, 0x00ee, - 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x2bce, 0x0228, 0x2011, - 0x0101, 0x2204, 0xc0c5, 0x2012, 0x2011, 0x19f2, 0x2013, 0x0000, - 0x7093, 0x0000, 0x012e, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, - 0xa6e0, 0x6144, 0xd184, 0x0120, 0x7198, 0x918d, 0x2000, 0x0018, - 0x718c, 0x918d, 0x1000, 0x2011, 0x1999, 0x2112, 0x2009, 0x07d0, - 0x2011, 0x5f97, 0x080c, 0x88d5, 0x0005, 0x0016, 0x0026, 0x00c6, - 0x0126, 0x2091, 0x8000, 0x080c, 0xb244, 0x2009, 0x00f7, 0x080c, - 0x60aa, 0x2061, 0x19fb, 0x900e, 0x611a, 0x611e, 0x617a, 0x617e, - 0x2061, 0x1800, 0x6003, 0x0001, 0x2061, 0x0100, 0x6043, 0x0090, - 0x6043, 0x0010, 0x2009, 0x1999, 0x200b, 0x0000, 0x2009, 0x002d, - 0x2011, 0x6019, 0x080c, 0x8831, 0x012e, 0x00ce, 0x002e, 0x001e, - 0x0005, 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, 0x0471, 0x2071, - 0x0100, 0x080c, 0xa6e9, 0x2071, 0x0140, 0x7004, 0x9084, 0x4000, - 0x0110, 0x080c, 0x2d49, 0x080c, 0x763f, 0x0188, 0x080c, 0x765a, - 0x1170, 0x080c, 0x793c, 0x0016, 0x080c, 0x298b, 0x2001, 0x196d, - 0x2102, 0x001e, 0x080c, 0x7937, 0x080c, 0x7563, 0x0050, 0x2009, - 0x0001, 0x080c, 0x2c67, 0x2001, 0x0001, 0x080c, 0x281c, 0x080c, - 0x5fed, 0x012e, 0x000e, 0x00ee, 0x0005, 0x2001, 0x180e, 0x2004, - 0xd0bc, 0x0158, 0x0026, 0x0036, 0x2011, 0x8017, 0x2001, 0x1999, - 0x201c, 0x080c, 0x4c44, 0x003e, 0x002e, 0x0005, 0x20a9, 0x0012, - 0x20e9, 0x0001, 0x20a1, 0x1c80, 0x080c, 0x6108, 0x20e9, 0x0000, - 0x2099, 0x026e, 0x0099, 0x20a9, 0x0020, 0x080c, 0x6102, 0x2099, - 0x0260, 0x20a1, 0x1c92, 0x0051, 0x20a9, 0x000e, 0x080c, 0x6105, - 0x2099, 0x0260, 0x20a1, 0x1cb2, 0x0009, 0x0005, 0x0016, 0x0026, - 0x3410, 0x3308, 0x2104, 0x8007, 0x2012, 0x8108, 0x8210, 0x1f04, - 0x6082, 0x002e, 0x001e, 0x0005, 0x080c, 0xaf8e, 0x20e1, 0x0001, - 0x2099, 0x1c00, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000c, - 0x4003, 0x0005, 0x080c, 0xaf8e, 0x080c, 0x6108, 0x20e1, 0x0000, - 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000c, - 0x4003, 0x0005, 0x00c6, 0x0006, 0x2061, 0x0100, 0x810f, 0x2001, - 0x1834, 0x2004, 0x9005, 0x1138, 0x2001, 0x1818, 0x2004, 0x9084, - 0x00ff, 0x9105, 0x0010, 0x9185, 0x00f7, 0x604a, 0x000e, 0x00ce, - 0x0005, 0x0016, 0x0046, 0x080c, 0x6a9f, 0x0158, 0x9006, 0x2020, - 0x2009, 0x002a, 0x080c, 0xec31, 0x2001, 0x180c, 0x200c, 0xc195, - 0x2102, 0x2019, 0x002a, 0x900e, 0x080c, 0x321b, 0x080c, 0xd7e3, - 0x0140, 0x0036, 0x2019, 0xffff, 0x2021, 0x0007, 0x080c, 0x4dfb, - 0x003e, 0x004e, 0x001e, 0x0005, 0x080c, 0x5fed, 0x709b, 0x0000, - 0x7093, 0x0000, 0x0005, 0x0006, 0x2001, 0x180c, 0x2004, 0xd09c, - 0x0100, 0x000e, 0x0005, 0x0006, 0x0016, 0x0126, 0x2091, 0x8000, - 0x2001, 0x0101, 0x200c, 0x918d, 0x0006, 0x2102, 0x012e, 0x001e, - 0x000e, 0x0005, 0x2009, 0x0001, 0x0020, 0x2009, 0x0002, 0x0008, - 0x900e, 0x6814, 0x9084, 0xffc0, 0x910d, 0x6916, 0x0005, 0x00f6, - 0x0156, 0x0146, 0x01d6, 0x9006, 0x20a9, 0x0080, 0x20e9, 0x0001, - 0x20a1, 0x1c00, 0x4004, 0x2079, 0x1c00, 0x7803, 0x2200, 0x7807, - 0x00ef, 0x780f, 0x00ef, 0x7813, 0x0138, 0x7823, 0xffff, 0x7827, - 0xffff, 0x01de, 0x014e, 0x015e, 0x00fe, 0x0005, 0x2001, 0x1800, - 0x2003, 0x0001, 0x0005, 0x2001, 0x19a7, 0x0118, 0x2003, 0x0001, - 0x0010, 0x2003, 0x0000, 0x0005, 0x0156, 0x20a9, 0x0800, 0x2009, - 0x1000, 0x9006, 0x200a, 0x8108, 0x1f04, 0x6142, 0x015e, 0x0005, - 0x00d6, 0x0036, 0x0156, 0x0136, 0x0146, 0x2069, 0x1847, 0x9006, - 0xb802, 0xb8ce, 0xb807, 0x0707, 0xb80a, 0xb80e, 0xb812, 0x9198, - 0x33b6, 0x231d, 0x939c, 0x00ff, 0xbb16, 0x0016, 0x0026, 0xb8c2, - 0x080c, 0xb23d, 0x1120, 0x9192, 0x007e, 0x1208, 0xbbc2, 0x20a9, - 0x0004, 0xb8c4, 0x20e8, 0xb9c8, 0x9198, 0x0006, 0x9006, 0x23a0, - 0x4004, 0x20a9, 0x0004, 0x9198, 0x000a, 0x23a0, 0x4004, 0x002e, - 0x001e, 0xb83e, 0xb842, 0xb84e, 0xb852, 0xb856, 0xb85a, 0xb85e, - 0xb862, 0xb866, 0xb86a, 0xb86f, 0x0100, 0xb872, 0xb876, 0xb87a, - 0xb88a, 0xb88e, 0xb893, 0x0008, 0xb896, 0xb89a, 0xb89e, 0xb8be, - 0xb9a2, 0x0096, 0xb8a4, 0x904d, 0x0110, 0x080c, 0x1040, 0xb8a7, - 0x0000, 0x009e, 0x9006, 0xb84a, 0x6810, 0xb83a, 0x680c, 0xb846, - 0xb8bb, 0x0520, 0xb8ac, 0x9005, 0x0198, 0x00c6, 0x2060, 0x9c82, - 0x1cd0, 0x0a0c, 0x0dc5, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1a0c, - 0x0dc5, 0x080c, 0x8cf7, 0x00ce, 0x090c, 0x9096, 0xb8af, 0x0000, - 0x6814, 0x9084, 0x00ff, 0xb842, 0x014e, 0x013e, 0x015e, 0x003e, - 0x00de, 0x0005, 0x0126, 0x2091, 0x8000, 0xa974, 0xae78, 0x9684, - 0x3fff, 0x9082, 0x4000, 0x1a04, 0x6230, 0x9182, 0x0800, 0x1a04, - 0x6234, 0x2001, 0x180c, 0x2004, 0x9084, 0x0003, 0x1904, 0x623a, - 0x9188, 0x1000, 0x2104, 0x905d, 0x0518, 0xb804, 0x9084, 0x00ff, - 0x908e, 0x0006, 0x1508, 0xb8a4, 0x900d, 0x1904, 0x624c, 0xb850, - 0x900d, 0x1148, 0xa802, 0x2900, 0xb852, 0xb84e, 0x080c, 0x951c, - 0x9006, 0x012e, 0x0005, 0x00a6, 0x2150, 0x2900, 0xb002, 0xa803, - 0x0000, 0x00ae, 0xb852, 0x0c90, 0x2001, 0x0005, 0x900e, 0x04b8, - 0x2001, 0x0028, 0x900e, 0x0498, 0x9082, 0x0006, 0x1290, 0x080c, - 0xb23d, 0x1160, 0xb8a0, 0x9084, 0xff80, 0x1140, 0xb900, 0xd1fc, - 0x0990, 0x2001, 0x0029, 0x2009, 0x1000, 0x0408, 0x2001, 0x0028, - 0x00a8, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, - 0x0068, 0xd184, 0x0118, 0x2001, 0x0004, 0x0040, 0x2001, 0x0029, - 0xb900, 0xd1fc, 0x0118, 0x2009, 0x1000, 0x0048, 0x900e, 0x0038, - 0x2001, 0x0029, 0x900e, 0x0018, 0x2001, 0x0029, 0x900e, 0x9005, - 0x012e, 0x0005, 0x2001, 0x180c, 0x2004, 0xd084, 0x19d0, 0x9188, - 0x1000, 0x2104, 0x905d, 0x09a8, 0x080c, 0x6aa3, 0x1990, 0xb800, - 0xd0bc, 0x0978, 0x0804, 0x61e3, 0x080c, 0x68c0, 0x0904, 0x61fc, - 0x0804, 0x61e7, 0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, 0xa874, - 0x908e, 0x00ff, 0x1120, 0x2001, 0x196b, 0x205c, 0x0060, 0xa974, - 0x9182, 0x0800, 0x1690, 0x9188, 0x1000, 0x2104, 0x905d, 0x01d0, - 0x080c, 0x6a43, 0x11d0, 0x080c, 0xb27d, 0x0570, 0x2b00, 0x6012, - 0x2900, 0x6016, 0x6023, 0x0009, 0x600b, 0x0000, 0xa874, 0x908e, - 0x00ff, 0x1110, 0x600b, 0x8000, 0x2009, 0x0043, 0x080c, 0xb352, - 0x9006, 0x00b0, 0x2001, 0x0028, 0x0090, 0x2009, 0x180c, 0x210c, - 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, - 0x0004, 0x0010, 0x2001, 0x0029, 0x0010, 0x2001, 0x0029, 0x9005, - 0x012e, 0x00ee, 0x00be, 0x0005, 0x2001, 0x002c, 0x0cc0, 0x00b6, - 0x00e6, 0x0126, 0x2091, 0x8000, 0xa974, 0x9182, 0x0800, 0x1a04, - 0x631d, 0x9188, 0x1000, 0x2104, 0x905d, 0x0904, 0x62f5, 0xb8a0, - 0x9086, 0x007f, 0x0190, 0xa87c, 0xd0fc, 0x1178, 0x080c, 0x6aab, - 0x0160, 0xa994, 0x81ff, 0x0130, 0x908e, 0x0004, 0x0130, 0x908e, - 0x0005, 0x0118, 0x080c, 0x6aa3, 0x1598, 0xa87c, 0xd0fc, 0x01e0, - 0xa894, 0x9005, 0x01c8, 0x2060, 0x0026, 0x2010, 0x080c, 0xd0c6, - 0x002e, 0x1120, 0x2001, 0x0008, 0x0804, 0x631f, 0x6020, 0x9086, - 0x000a, 0x0120, 0x2001, 0x0008, 0x0804, 0x631f, 0x601a, 0x6003, - 0x0008, 0x2900, 0x6016, 0x0058, 0x080c, 0xb27d, 0x05e8, 0x2b00, - 0x6012, 0x2900, 0x6016, 0x600b, 0xffff, 0x6023, 0x000a, 0x2009, - 0x0003, 0x080c, 0xb352, 0x9006, 0x0458, 0x2001, 0x0028, 0x0438, - 0x9082, 0x0006, 0x1290, 0x080c, 0xb23d, 0x1160, 0xb8a0, 0x9084, - 0xff80, 0x1140, 0xb900, 0xd1fc, 0x0900, 0x2001, 0x0029, 0x2009, - 0x1000, 0x00a8, 0x2001, 0x0028, 0x0090, 0x2009, 0x180c, 0x210c, - 0xd18c, 0x0118, 0x2001, 0x0004, 0x0050, 0xd184, 0x0118, 0x2001, - 0x0004, 0x0028, 0x2001, 0x0029, 0x0010, 0x2001, 0x0029, 0x9005, - 0x012e, 0x00ee, 0x00be, 0x0005, 0x2001, 0x002c, 0x0cc0, 0x00f6, - 0x00b6, 0x0126, 0x2091, 0x8000, 0xa8e0, 0x9005, 0x1550, 0xa8dc, - 0x9082, 0x0101, 0x1630, 0xa8c8, 0x9005, 0x1518, 0xa8c4, 0x9082, - 0x0101, 0x12f8, 0xa974, 0x2079, 0x1800, 0x9182, 0x0800, 0x12e8, - 0x7830, 0x9084, 0x0003, 0x1130, 0xaa98, 0xab94, 0xa878, 0x9084, - 0x0007, 0x00ea, 0x7930, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, - 0xd184, 0x0118, 0x2001, 0x0004, 0x0010, 0x2001, 0x0029, 0x900e, - 0x0038, 0x2001, 0x002c, 0x900e, 0x0018, 0x2001, 0x0029, 0x900e, - 0x9006, 0x0008, 0x9005, 0x012e, 0x00be, 0x00fe, 0x0005, 0x63b4, - 0x636f, 0x6386, 0x63b4, 0x63b4, 0x63b4, 0x63b4, 0x63b4, 0x2100, - 0x9082, 0x007e, 0x1278, 0x080c, 0x66b9, 0x0148, 0x9046, 0xb810, - 0x9306, 0x1904, 0x63bc, 0xb814, 0x9206, 0x15f0, 0x0028, 0xbb12, - 0xba16, 0x0010, 0x080c, 0x4af7, 0x0150, 0x04b0, 0x080c, 0x6724, - 0x1598, 0xb810, 0x9306, 0x1580, 0xb814, 0x9206, 0x1568, 0x080c, - 0xb27d, 0x0530, 0x2b00, 0x6012, 0x080c, 0xd554, 0x2900, 0x6016, - 0x600b, 0xffff, 0x6023, 0x000a, 0xa878, 0x9086, 0x0001, 0x1170, - 0x080c, 0x3250, 0x9006, 0x080c, 0x6656, 0x2001, 0x0002, 0x080c, - 0x666a, 0x2001, 0x0200, 0xb86e, 0xb893, 0x0002, 0x2009, 0x0003, - 0x080c, 0xb352, 0x9006, 0x0068, 0x2001, 0x0001, 0x900e, 0x0038, - 0x2001, 0x002c, 0x900e, 0x0018, 0x2001, 0x0028, 0x900e, 0x9005, - 0x0000, 0x012e, 0x00be, 0x00fe, 0x0005, 0x00b6, 0x00f6, 0x00e6, - 0x0126, 0x2091, 0x8000, 0xa894, 0x90c6, 0x0015, 0x0904, 0x65a7, - 0x90c6, 0x0056, 0x0904, 0x65ab, 0x90c6, 0x0066, 0x0904, 0x65af, - 0x90c6, 0x0067, 0x0904, 0x65b3, 0x90c6, 0x0068, 0x0904, 0x65b7, - 0x90c6, 0x0071, 0x0904, 0x65bb, 0x90c6, 0x0074, 0x0904, 0x65bf, - 0x90c6, 0x007c, 0x0904, 0x65c3, 0x90c6, 0x007e, 0x0904, 0x65c7, - 0x90c6, 0x0037, 0x0904, 0x65cb, 0x9016, 0x2079, 0x1800, 0xa974, - 0x9186, 0x00ff, 0x0904, 0x65a2, 0x9182, 0x0800, 0x1a04, 0x65a2, - 0x080c, 0x6724, 0x1198, 0xb804, 0x9084, 0x00ff, 0x9082, 0x0006, - 0x1268, 0xa894, 0x90c6, 0x006f, 0x0148, 0x080c, 0xb23d, 0x1904, - 0x658b, 0xb8a0, 0x9084, 0xff80, 0x1904, 0x658b, 0xa894, 0x90c6, - 0x006f, 0x0158, 0x90c6, 0x005e, 0x0904, 0x64eb, 0x90c6, 0x0064, - 0x0904, 0x6514, 0x2008, 0x0804, 0x64ad, 0xa998, 0xa8b0, 0x2040, - 0x080c, 0xb23d, 0x1120, 0x9182, 0x007f, 0x0a04, 0x64ad, 0x9186, - 0x00ff, 0x0904, 0x64ad, 0x9182, 0x0800, 0x1a04, 0x64ad, 0xaaa0, - 0xab9c, 0x787c, 0x9306, 0x11a8, 0x7880, 0x0096, 0x924e, 0x1128, - 0x2208, 0x2310, 0x009e, 0x0804, 0x64ad, 0x080c, 0xb23d, 0x1140, - 0x99cc, 0xff00, 0x009e, 0x1128, 0x2208, 0x2310, 0x0804, 0x64ad, - 0x009e, 0x080c, 0x4af7, 0x0904, 0x64b7, 0x900e, 0x9016, 0x90c6, - 0x4000, 0x15e0, 0x0006, 0x080c, 0x6944, 0x1108, 0xc185, 0xb800, - 0xd0bc, 0x0108, 0xc18d, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, - 0x9080, 0x0031, 0x20a0, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x0006, - 0x2098, 0x080c, 0x0f8b, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, - 0x9080, 0x0035, 0x20a0, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x000a, - 0x2098, 0x080c, 0x0f8b, 0xa8c4, 0xabc8, 0x9305, 0xabcc, 0x9305, - 0xabd0, 0x9305, 0xabd4, 0x9305, 0xabd8, 0x9305, 0xabdc, 0x9305, - 0xabe0, 0x9305, 0x9005, 0x0510, 0x000e, 0x00c8, 0x90c6, 0x4007, - 0x1110, 0x2408, 0x00a0, 0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, - 0x0070, 0x90c6, 0x4009, 0x1108, 0x0050, 0x90c6, 0x4006, 0x0138, - 0x2001, 0x4005, 0x2009, 0x000a, 0x0010, 0x2001, 0x4006, 0xa896, - 0xa99a, 0xaa9e, 0x2001, 0x0030, 0x900e, 0x0478, 0x000e, 0x080c, - 0xb27d, 0x1130, 0x2001, 0x4005, 0x2009, 0x0003, 0x9016, 0x0c78, - 0x2b00, 0x6012, 0x080c, 0xd554, 0x2900, 0x6016, 0x6023, 0x0001, - 0xa868, 0xd88c, 0x0108, 0xc0f5, 0xa86a, 0x0126, 0x2091, 0x8000, - 0x080c, 0x3250, 0x012e, 0x9006, 0x080c, 0x6656, 0x2001, 0x0002, - 0x080c, 0x666a, 0x2009, 0x0002, 0x080c, 0xb352, 0xa8b0, 0xd094, - 0x0118, 0xb8cc, 0xc08d, 0xb8ce, 0x9006, 0x9005, 0x012e, 0x00ee, - 0x00fe, 0x00be, 0x0005, 0x080c, 0x57e9, 0x0118, 0x2009, 0x0007, - 0x00f8, 0xa998, 0xaeb0, 0x080c, 0x6724, 0x1904, 0x64a8, 0x9186, - 0x007f, 0x0130, 0x080c, 0x6aa3, 0x0118, 0x2009, 0x0009, 0x0080, - 0x0096, 0x080c, 0x100e, 0x1120, 0x009e, 0x2009, 0x0002, 0x0040, - 0x2900, 0x009e, 0xa806, 0x080c, 0xd2c0, 0x19b0, 0x2009, 0x0003, - 0x2001, 0x4005, 0x0804, 0x64af, 0xa998, 0xaeb0, 0x080c, 0x6724, - 0x1904, 0x64a8, 0x0096, 0x080c, 0x100e, 0x1128, 0x009e, 0x2009, - 0x0002, 0x0804, 0x6568, 0x2900, 0x009e, 0xa806, 0x0096, 0x2048, - 0x20a9, 0x002b, 0xb8c4, 0x20e0, 0xb8c8, 0x2098, 0xa860, 0x20e8, - 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008, 0x9080, - 0x0006, 0x20a0, 0xbbc8, 0x9398, 0x0006, 0x2398, 0x080c, 0x0f8b, - 0x009e, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0xd684, - 0x1168, 0x080c, 0x57d5, 0xd0b4, 0x1118, 0xa89b, 0x000b, 0x00e0, - 0xb800, 0xd08c, 0x0118, 0xa89b, 0x000c, 0x00b0, 0x080c, 0x6aa3, - 0x0118, 0xa89b, 0x0009, 0x0080, 0x080c, 0x57e9, 0x0118, 0xa89b, - 0x0007, 0x0050, 0x080c, 0xd2a3, 0x1904, 0x64e4, 0x2009, 0x0003, - 0x2001, 0x4005, 0x0804, 0x64af, 0xa87b, 0x0030, 0xa897, 0x4005, - 0xa804, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, - 0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, - 0x2031, 0x0000, 0x2041, 0x1252, 0x080c, 0xb7f1, 0x1904, 0x64e4, - 0x2009, 0x0002, 0x08e8, 0x2001, 0x0028, 0x900e, 0x0804, 0x64e5, - 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, - 0xd184, 0x0118, 0x2001, 0x0004, 0x0010, 0x2001, 0x0029, 0x900e, - 0x0804, 0x64e5, 0x2001, 0x0029, 0x900e, 0x0804, 0x64e5, 0x080c, - 0x37e9, 0x0804, 0x64e6, 0x080c, 0x5500, 0x0804, 0x64e6, 0x080c, - 0x4637, 0x0804, 0x64e6, 0x080c, 0x46b0, 0x0804, 0x64e6, 0x080c, - 0x470c, 0x0804, 0x64e6, 0x080c, 0x4bba, 0x0804, 0x64e6, 0x080c, - 0x4e82, 0x0804, 0x64e6, 0x080c, 0x5167, 0x0804, 0x64e6, 0x080c, - 0x5360, 0x0804, 0x64e6, 0x080c, 0x3a25, 0x0804, 0x64e6, 0x00b6, - 0xa974, 0xae78, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1618, 0x9182, - 0x0800, 0x1268, 0x9188, 0x1000, 0x2104, 0x905d, 0x0140, 0x080c, - 0x6aa3, 0x1148, 0x00e9, 0x080c, 0x684f, 0x9006, 0x00b0, 0x2001, - 0x0028, 0x900e, 0x0090, 0x9082, 0x0006, 0x1240, 0xb900, 0xd1fc, - 0x0d88, 0x2001, 0x0029, 0x2009, 0x1000, 0x0038, 0x2001, 0x0029, - 0x900e, 0x0018, 0x2001, 0x0029, 0x900e, 0x9005, 0x00be, 0x0005, - 0x0126, 0x2091, 0x8000, 0xb850, 0x900d, 0x0150, 0x2900, 0x0096, - 0x2148, 0xa802, 0x009e, 0xa803, 0x0000, 0xb852, 0x012e, 0x0005, - 0x2900, 0xb852, 0xb84e, 0xa803, 0x0000, 0x0cc0, 0x0126, 0x2091, - 0x8000, 0xb84c, 0x9005, 0x0170, 0x00e6, 0x2071, 0x19e8, 0x7004, - 0x9086, 0x0002, 0x0168, 0x00ee, 0xb84c, 0xa802, 0x2900, 0xb84e, - 0x012e, 0x0005, 0x2900, 0xb852, 0xb84e, 0xa803, 0x0000, 0x0cc0, - 0x701c, 0x9b06, 0x1d80, 0xb84c, 0x00a6, 0x2050, 0xb000, 0xa802, - 0x2900, 0xb002, 0x00ae, 0x00ee, 0x012e, 0x0005, 0x0126, 0x2091, - 0x8000, 0xb84c, 0x904d, 0x0130, 0xa800, 0x9005, 0x1108, 0xb852, - 0xb84e, 0x9905, 0x012e, 0x0005, 0xb84c, 0x904d, 0x0130, 0xa800, - 0x9005, 0x1108, 0xb852, 0xb84e, 0x9905, 0x0005, 0x00b6, 0x0126, - 0x00c6, 0x0026, 0x2091, 0x8000, 0x6210, 0x2258, 0xba00, 0x9005, - 0x0110, 0xc285, 0x0008, 0xc284, 0xba02, 0x002e, 0x00ce, 0x012e, - 0x00be, 0x0005, 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, 0x6210, - 0x2258, 0xba04, 0x0006, 0x9086, 0x0006, 0x1170, 0xb89c, 0xd0ac, - 0x0158, 0x080c, 0x6a9f, 0x0140, 0x9284, 0xff00, 0x8007, 0x9086, - 0x0007, 0x1110, 0x2011, 0x0600, 0x000e, 0x9294, 0xff00, 0x9215, - 0xba06, 0x0006, 0x9086, 0x0006, 0x1120, 0xba90, 0x82ff, 0x090c, - 0x0dc5, 0x000e, 0x00ce, 0x012e, 0x00be, 0x0005, 0x00b6, 0x0126, - 0x00c6, 0x2091, 0x8000, 0x6210, 0x2258, 0xba04, 0x0006, 0x9086, - 0x0006, 0x1168, 0xb89c, 0xd0a4, 0x0150, 0x080c, 0x6a9b, 0x1138, - 0x9284, 0x00ff, 0x9086, 0x0007, 0x1110, 0x2011, 0x0006, 0x000e, - 0x9294, 0x00ff, 0x8007, 0x9215, 0xba06, 0x00ce, 0x012e, 0x00be, - 0x0005, 0x9182, 0x0800, 0x0218, 0x9085, 0x0001, 0x0005, 0x00d6, - 0x0026, 0x9190, 0x1000, 0x2204, 0x905d, 0x1188, 0x0096, 0x080c, - 0x100e, 0x2958, 0x009e, 0x0168, 0x2b00, 0x2012, 0xb85c, 0xb8ca, - 0xb860, 0xb8c6, 0x9006, 0xb8a6, 0xb8ae, 0x080c, 0x6148, 0x9006, - 0x0010, 0x9085, 0x0001, 0x002e, 0x00de, 0x0005, 0x00b6, 0x0096, - 0x0126, 0x2091, 0x8000, 0x0026, 0x9182, 0x0800, 0x0218, 0x9085, - 0x0001, 0x04a8, 0x00d6, 0x9190, 0x1000, 0x2204, 0x905d, 0x0568, - 0x2013, 0x0000, 0xb8a4, 0x904d, 0x0110, 0x080c, 0x1040, 0x00d6, - 0x00c6, 0xb8bc, 0x2060, 0x8cff, 0x0168, 0x600c, 0x0006, 0x6014, - 0x2048, 0x080c, 0xd0d8, 0x0110, 0x080c, 0x0fc0, 0x080c, 0xb2d3, - 0x00ce, 0x0c88, 0x00ce, 0x00de, 0x00c6, 0xb8ac, 0x9065, 0x0128, - 0x621c, 0xd2c4, 0x0110, 0x080c, 0x9096, 0x00ce, 0x2b48, 0xb8c8, - 0xb85e, 0xb8c4, 0xb862, 0x080c, 0x1050, 0x00de, 0x9006, 0x002e, - 0x012e, 0x009e, 0x00be, 0x0005, 0x0016, 0x9182, 0x0800, 0x0218, - 0x9085, 0x0001, 0x0030, 0x9188, 0x1000, 0x2104, 0x905d, 0x0dc0, - 0x9006, 0x001e, 0x0005, 0x00d6, 0x0156, 0x0136, 0x0146, 0x9006, - 0xb80a, 0xb80e, 0xb800, 0xc08c, 0xb802, 0x080c, 0x7637, 0x1510, - 0xb8a0, 0x9086, 0x007e, 0x0120, 0x080c, 0xb23d, 0x11d8, 0x0078, - 0x7040, 0xd0e4, 0x01b8, 0x00c6, 0x2061, 0x1982, 0x7048, 0x2062, - 0x704c, 0x6006, 0x7050, 0x600a, 0x7054, 0x600e, 0x00ce, 0x703c, - 0x2069, 0x0140, 0x9005, 0x1110, 0x2001, 0x0001, 0x6886, 0x2069, - 0x1800, 0x68b6, 0x7040, 0xb85e, 0x7048, 0xb862, 0x704c, 0xb866, - 0x20e1, 0x0000, 0x2099, 0x0276, 0xb8c4, 0x20e8, 0xb8c8, 0x9088, - 0x000a, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2099, 0x027a, 0x9088, - 0x0006, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2069, 0x0200, 0x6817, - 0x0001, 0x7040, 0xb86a, 0x7144, 0xb96e, 0x7048, 0xb872, 0x7050, - 0xb876, 0x2069, 0x0200, 0x6817, 0x0000, 0xb8a0, 0x9086, 0x007e, - 0x1110, 0x7144, 0xb96e, 0x9182, 0x0211, 0x1218, 0x2009, 0x0008, - 0x0400, 0x9182, 0x0259, 0x1218, 0x2009, 0x0007, 0x00d0, 0x9182, - 0x02c1, 0x1218, 0x2009, 0x0006, 0x00a0, 0x9182, 0x0349, 0x1218, - 0x2009, 0x0005, 0x0070, 0x9182, 0x0421, 0x1218, 0x2009, 0x0004, - 0x0040, 0x9182, 0x0581, 0x1218, 0x2009, 0x0003, 0x0010, 0x2009, - 0x0002, 0xb992, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005, 0x0016, - 0x0026, 0x00e6, 0x2071, 0x0260, 0x7034, 0xb896, 0x703c, 0xb89a, - 0x7054, 0xb89e, 0x0036, 0xbbcc, 0xc384, 0xba00, 0x2009, 0x1867, - 0x210c, 0xd0bc, 0x0120, 0xd1ec, 0x0110, 0xc2ad, 0x0008, 0xc2ac, - 0xd0c4, 0x0148, 0xd1e4, 0x0138, 0xc2bd, 0xd0cc, 0x0128, 0xd38c, - 0x1108, 0xc385, 0x0008, 0xc2bc, 0xba02, 0xbbce, 0x003e, 0x00ee, - 0x002e, 0x001e, 0x0005, 0x0096, 0x0126, 0x2091, 0x8000, 0xb8a4, - 0x904d, 0x0578, 0xa900, 0x81ff, 0x15c0, 0xaa04, 0x9282, 0x0010, - 0x16c8, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x8906, 0x8006, 0x8007, - 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0, 0x9080, 0x0004, 0x2098, - 0x2009, 0x0010, 0x20a9, 0x0001, 0x4002, 0x9086, 0xffff, 0x0120, - 0x8109, 0x1dd0, 0x080c, 0x0dc5, 0x3c00, 0x20e8, 0x3300, 0x8001, - 0x20a0, 0x4604, 0x8210, 0xaa06, 0x01de, 0x01ce, 0x014e, 0x013e, - 0x0060, 0x080c, 0x100e, 0x0170, 0x2900, 0xb8a6, 0xa803, 0x0000, - 0x080c, 0x68e0, 0xa807, 0x0001, 0xae12, 0x9085, 0x0001, 0x012e, - 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0126, 0x2091, 0x8000, 0x0096, - 0xb8a4, 0x904d, 0x0188, 0xa800, 0x9005, 0x1150, 0x080c, 0x68ef, - 0x1158, 0xa804, 0x908a, 0x0002, 0x0218, 0x8001, 0xa806, 0x0020, - 0x080c, 0x1040, 0xb8a7, 0x0000, 0x009e, 0x012e, 0x0005, 0x0126, - 0x2091, 0x8000, 0x080c, 0x951c, 0x012e, 0x0005, 0x901e, 0x0010, - 0x2019, 0x0001, 0x900e, 0x0126, 0x2091, 0x8000, 0xb84c, 0x2048, - 0xb800, 0xd0dc, 0x1170, 0x89ff, 0x0500, 0x83ff, 0x0120, 0xa878, - 0x9606, 0x0158, 0x0030, 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, - 0x0120, 0x2908, 0xa800, 0x2048, 0x0c70, 0x080c, 0xaaf1, 0xaa00, - 0xb84c, 0x9906, 0x1110, 0xba4e, 0x0020, 0x00a6, 0x2150, 0xb202, - 0x00ae, 0x82ff, 0x1110, 0xb952, 0x89ff, 0x012e, 0x0005, 0x9016, - 0x0489, 0x1110, 0x2011, 0x0001, 0x0005, 0x080c, 0x6944, 0x0128, - 0x080c, 0xd195, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, 0x6944, - 0x0128, 0x080c, 0xd13a, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, - 0x6944, 0x0128, 0x080c, 0xd192, 0x0010, 0x9085, 0x0001, 0x0005, - 0x080c, 0x6944, 0x0128, 0x080c, 0xd159, 0x0010, 0x9085, 0x0001, - 0x0005, 0x080c, 0x6944, 0x0128, 0x080c, 0xd1d8, 0x0010, 0x9085, - 0x0001, 0x0005, 0xb8a4, 0x900d, 0x1118, 0x9085, 0x0001, 0x0005, - 0x0136, 0x01c6, 0xa800, 0x9005, 0x11b8, 0x890e, 0x810e, 0x810f, - 0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0004, 0x2098, - 0x20a9, 0x0001, 0x2009, 0x0010, 0x4002, 0x9606, 0x0128, 0x8109, - 0x1dd8, 0x9085, 0x0001, 0x0008, 0x9006, 0x01ce, 0x013e, 0x0005, - 0x0146, 0x01d6, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0004, 0x20a0, - 0x20a9, 0x0010, 0x2009, 0xffff, 0x4104, 0x01de, 0x014e, 0x0136, - 0x01c6, 0xa800, 0x9005, 0x11b8, 0x890e, 0x810e, 0x810f, 0x9184, - 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0004, 0x2098, 0x20a9, - 0x0001, 0x2009, 0x0010, 0x4002, 0x9606, 0x0128, 0x8109, 0x1dd8, - 0x9085, 0x0001, 0x0068, 0x0146, 0x01d6, 0x3300, 0x8001, 0x20a0, - 0x3c00, 0x20e8, 0x2001, 0xffff, 0x4004, 0x01de, 0x014e, 0x9006, - 0x01ce, 0x013e, 0x0005, 0x0096, 0x0126, 0x2091, 0x8000, 0xb8a4, - 0x904d, 0x1128, 0x080c, 0x100e, 0x0168, 0x2900, 0xb8a6, 0x080c, - 0x68e0, 0xa803, 0x0001, 0xa807, 0x0000, 0x9085, 0x0001, 0x012e, - 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x0126, 0x2091, 0x8000, - 0xb8a4, 0x904d, 0x0130, 0xb8a7, 0x0000, 0x080c, 0x1040, 0x9085, - 0x0001, 0x012e, 0x009e, 0x0005, 0xb89c, 0xd0a4, 0x0005, 0x00b6, - 0x00f6, 0x080c, 0x7637, 0x01b0, 0x71c4, 0x81ff, 0x1198, 0x71dc, - 0xd19c, 0x0180, 0x2001, 0x007e, 0x9080, 0x1000, 0x2004, 0x905d, - 0x0148, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1118, 0xb800, - 0xc0ed, 0xb802, 0x2079, 0x1847, 0x7804, 0xd0a4, 0x01d0, 0x0156, - 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x6724, 0x1168, 0xb804, - 0x9084, 0xff00, 0x8007, 0x9096, 0x0004, 0x0118, 0x9086, 0x0006, - 0x1118, 0xb800, 0xc0ed, 0xb802, 0x001e, 0x8108, 0x1f04, 0x696b, - 0x015e, 0x080c, 0x6a61, 0x0120, 0x2001, 0x1985, 0x200c, 0x0098, - 0x2079, 0x1847, 0x7804, 0xd0a4, 0x0190, 0x2009, 0x07d0, 0x2001, - 0x182c, 0x2004, 0x9005, 0x0138, 0x2001, 0x1867, 0x2004, 0xd0e4, - 0x0110, 0x2009, 0x5dc0, 0x2011, 0x69a2, 0x080c, 0x88d5, 0x00fe, - 0x00be, 0x0005, 0x00b6, 0x2011, 0x69a2, 0x080c, 0x883d, 0x080c, - 0x6a61, 0x01d8, 0x2001, 0x107e, 0x2004, 0x2058, 0xb900, 0xc1ec, - 0xb902, 0x080c, 0x6a9f, 0x0130, 0x2009, 0x07d0, 0x2011, 0x69a2, - 0x080c, 0x88d5, 0x00e6, 0x2071, 0x1800, 0x9006, 0x707e, 0x7060, - 0x7082, 0x080c, 0x3000, 0x00ee, 0x04b0, 0x0156, 0x00c6, 0x20a9, - 0x007f, 0x900e, 0x0016, 0x080c, 0x6724, 0x1538, 0xb800, 0xd0ec, - 0x0520, 0x0046, 0xbaa0, 0x2220, 0x9006, 0x2009, 0x0029, 0x080c, - 0xec31, 0xb800, 0xc0e5, 0xc0ec, 0xb802, 0x080c, 0x6a9b, 0x2001, - 0x0707, 0x1128, 0xb804, 0x9084, 0x00ff, 0x9085, 0x0700, 0xb806, - 0x2019, 0x0029, 0x080c, 0x96a4, 0x0076, 0x903e, 0x080c, 0x9577, - 0x900e, 0x080c, 0xe91c, 0x007e, 0x004e, 0x001e, 0x8108, 0x1f04, - 0x69ca, 0x00ce, 0x015e, 0x00be, 0x0005, 0x00b6, 0x6010, 0x2058, - 0xb800, 0xc0ec, 0xb802, 0x00be, 0x0005, 0x00b6, 0x00c6, 0x0096, - 0x080c, 0x1027, 0x090c, 0x0dc5, 0x2958, 0x009e, 0x2001, 0x196b, - 0x2b02, 0x8b07, 0x8006, 0x8006, 0x908c, 0x003f, 0xb9c6, 0x908c, - 0xffc0, 0xb9ca, 0xb8af, 0x0000, 0x2009, 0x00ff, 0x080c, 0x6148, - 0xb807, 0x0006, 0xb813, 0x00ff, 0xb817, 0xffff, 0xb86f, 0x0200, - 0xb86c, 0xb893, 0x0002, 0xb8bb, 0x0520, 0xb8a3, 0x00ff, 0xb8af, - 0x0000, 0x00ce, 0x00be, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb800, - 0x00be, 0xd0ac, 0x0005, 0x6010, 0x00b6, 0x905d, 0x0108, 0xb800, - 0x00be, 0xd0bc, 0x0005, 0x0006, 0x0016, 0x0026, 0xb804, 0x908c, - 0x00ff, 0x9196, 0x0006, 0x0188, 0x9196, 0x0004, 0x0170, 0x9196, - 0x0005, 0x0158, 0x908c, 0xff00, 0x810f, 0x9196, 0x0006, 0x0128, - 0x9196, 0x0004, 0x0110, 0x9196, 0x0005, 0x002e, 0x001e, 0x000e, - 0x0005, 0x00b6, 0x00f6, 0x2001, 0x107e, 0x2004, 0x905d, 0x0110, - 0xb800, 0xd0ec, 0x00fe, 0x00be, 0x0005, 0x0126, 0x0026, 0x2091, - 0x8000, 0x0006, 0xbaa0, 0x9290, 0x1000, 0x2204, 0x9b06, 0x190c, - 0x0dc5, 0x000e, 0xba00, 0x9005, 0x0110, 0xc2fd, 0x0008, 0xc2fc, - 0xba02, 0x002e, 0x012e, 0x0005, 0x2011, 0x1837, 0x2204, 0xd0cc, - 0x0138, 0x2001, 0x1983, 0x200c, 0x2011, 0x6a91, 0x080c, 0x88d5, - 0x0005, 0x2011, 0x6a91, 0x080c, 0x883d, 0x2011, 0x1837, 0x2204, - 0xc0cc, 0x2012, 0x0005, 0x080c, 0x57d5, 0xd0ac, 0x0005, 0x080c, - 0x57d5, 0xd0a4, 0x0005, 0x0016, 0xb904, 0x9184, 0x00ff, 0x908e, - 0x0006, 0x001e, 0x0005, 0x0016, 0xb904, 0x9184, 0xff00, 0x8007, - 0x908e, 0x0006, 0x001e, 0x0005, 0x00b6, 0x00f6, 0x080c, 0xd7e3, - 0x0158, 0x70dc, 0x9084, 0x0028, 0x0138, 0x2001, 0x107f, 0x2004, - 0x905d, 0x0110, 0xb8cc, 0xd094, 0x00fe, 0x00be, 0x0005, 0x0006, - 0x0016, 0x0036, 0x0046, 0x0076, 0x00b6, 0x2001, 0x1818, 0x203c, - 0x9780, 0x33b6, 0x203d, 0x97bc, 0xff00, 0x873f, 0x9006, 0x2018, - 0x2008, 0x9284, 0x8000, 0x0110, 0x2019, 0x0001, 0x9294, 0x7fff, - 0x2100, 0x9706, 0x0190, 0x91a0, 0x1000, 0x2404, 0x905d, 0x0168, - 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1138, 0x83ff, 0x0118, - 0xb89c, 0xd0a4, 0x0110, 0x8211, 0x0158, 0x8108, 0x83ff, 0x0120, - 0x9182, 0x0800, 0x0e28, 0x0068, 0x9182, 0x007e, 0x0e08, 0x0048, - 0x00be, 0x007e, 0x004e, 0x003e, 0x001e, 0x9085, 0x0001, 0x000e, - 0x0005, 0x00be, 0x007e, 0x004e, 0x003e, 0x001e, 0x9006, 0x000e, - 0x0005, 0x0046, 0x0056, 0x0076, 0x00b6, 0x2100, 0x9084, 0x7fff, - 0x9080, 0x1000, 0x2004, 0x905d, 0x0130, 0xb804, 0x9084, 0x00ff, - 0x9086, 0x0006, 0x0550, 0x9184, 0x8000, 0x0580, 0x2001, 0x1818, - 0x203c, 0x9780, 0x33b6, 0x203d, 0x97bc, 0xff00, 0x873f, 0x9006, - 0x2020, 0x2400, 0x9706, 0x01a0, 0x94a8, 0x1000, 0x2504, 0x905d, - 0x0178, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1148, 0xb89c, - 0xd0a4, 0x0130, 0xb814, 0x9206, 0x1118, 0xb810, 0x9306, 0x0128, - 0x8420, 0x9482, 0x0800, 0x0e28, 0x0048, 0x918c, 0x7fff, 0x00be, - 0x007e, 0x005e, 0x004e, 0x9085, 0x0001, 0x0005, 0x918c, 0x7fff, - 0x00be, 0x007e, 0x005e, 0x004e, 0x9006, 0x0005, 0x0006, 0x2001, - 0x00a0, 0x8001, 0xa001, 0xa001, 0xa001, 0x1dd8, 0x000e, 0x0005, - 0x0006, 0x2001, 0x00f8, 0x8001, 0xa001, 0xa001, 0xa001, 0x1dd8, - 0x000e, 0x0005, 0x0006, 0x2001, 0x00e8, 0x8001, 0xa001, 0xa001, - 0xa001, 0x1dd8, 0x000e, 0x0005, 0x2071, 0x1910, 0x7003, 0x0001, - 0x7007, 0x0000, 0x9006, 0x7012, 0x7016, 0x701a, 0x701e, 0x700a, - 0x7046, 0x2001, 0x1922, 0x2003, 0x0000, 0x0005, 0x0016, 0x00e6, - 0x2071, 0x1948, 0x900e, 0x710a, 0x080c, 0x57d5, 0xd0fc, 0x1140, - 0x080c, 0x57d5, 0x900e, 0xd09c, 0x0108, 0x8108, 0x7102, 0x0470, - 0x2001, 0x1867, 0x200c, 0x9184, 0x0007, 0x0006, 0x2001, 0x180d, - 0x2004, 0xd08c, 0x000e, 0x0108, 0x9006, 0x0002, 0x6b98, 0x6b98, - 0x6b98, 0x6b98, 0x6b98, 0x6bb6, 0x6bcb, 0x6bd9, 0x7003, 0x0003, - 0x2009, 0x1868, 0x210c, 0x9184, 0xff00, 0x908e, 0xff00, 0x0140, - 0x8007, 0x9005, 0x1110, 0x2001, 0x0002, 0x8003, 0x7006, 0x0030, - 0x7007, 0x0001, 0x0018, 0x7003, 0x0005, 0x0c50, 0x2071, 0x1910, - 0x704f, 0x0000, 0x2071, 0x1800, 0x70f3, 0x0001, 0x00ee, 0x001e, - 0x0005, 0x7003, 0x0000, 0x2071, 0x1910, 0x2009, 0x1868, 0x210c, - 0x9184, 0x7f00, 0x8007, 0x908c, 0x000f, 0x0160, 0x714e, 0x8004, - 0x8004, 0x8004, 0x8004, 0x2071, 0x1800, 0x908c, 0x0007, 0x0128, - 0x70f2, 0x0c20, 0x704f, 0x000f, 0x0c90, 0x70f3, 0x0005, 0x08f0, - 0x00e6, 0x2071, 0x0050, 0x684c, 0x9005, 0x1150, 0x00e6, 0x2071, - 0x1910, 0x7028, 0xc085, 0x702a, 0x00ee, 0x9085, 0x0001, 0x0488, - 0x6844, 0x9005, 0x0158, 0x080c, 0x79a4, 0x6a60, 0x9200, 0x7002, - 0x6864, 0x9101, 0x7006, 0x9006, 0x7012, 0x7016, 0x6860, 0x7002, - 0x6864, 0x7006, 0x6868, 0x700a, 0x686c, 0x700e, 0x6844, 0x9005, - 0x1110, 0x7012, 0x7016, 0x684c, 0x701a, 0x701c, 0x9085, 0x0040, - 0x701e, 0x7037, 0x0019, 0x702b, 0x0001, 0x00e6, 0x2071, 0x1910, - 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0x700b, 0x0000, 0x00ee, - 0x9006, 0x00ee, 0x0005, 0x00e6, 0x0026, 0x2071, 0x1948, 0x7000, - 0x9015, 0x0904, 0x6ea5, 0x9286, 0x0003, 0x0904, 0x6d3e, 0x9286, - 0x0005, 0x0904, 0x6d3e, 0x2071, 0x1877, 0xa87c, 0x9005, 0x0904, - 0x6c99, 0x7140, 0xa868, 0x9102, 0x0a04, 0x6ea5, 0xa878, 0xd084, - 0x15d8, 0xa853, 0x0019, 0x2001, 0x8023, 0xa84e, 0x2071, 0x1910, - 0x701c, 0x9005, 0x1904, 0x7073, 0x0e04, 0x70e1, 0x2071, 0x0000, - 0xa850, 0x7032, 0xa84c, 0x7082, 0xa870, 0x7086, 0xa86c, 0x708a, - 0xa880, 0x708e, 0x7036, 0x0146, 0x01d6, 0x0136, 0x01c6, 0x0156, - 0x20e9, 0x0000, 0x20a1, 0x002a, 0xa868, 0x20a8, 0xa860, 0x20e0, - 0xa85c, 0x9080, 0x0021, 0x2098, 0x4003, 0x015e, 0x01ce, 0x013e, - 0x01de, 0x014e, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, - 0x190c, 0x11aa, 0x0804, 0x6d21, 0xa853, 0x001b, 0x2001, 0x8027, - 0x0820, 0x7004, 0xd08c, 0x1904, 0x6ea5, 0xa853, 0x001a, 0x2001, - 0x8024, 0x0804, 0x6c5d, 0x00e6, 0x0026, 0x2071, 0x1948, 0x7000, - 0x9015, 0x0904, 0x6ea5, 0x9286, 0x0003, 0x0904, 0x6d3e, 0x9286, - 0x0005, 0x0904, 0x6d3e, 0xa84f, 0x8022, 0xa853, 0x0018, 0x0804, - 0x6d06, 0xa868, 0xd0fc, 0x1508, 0x00e6, 0x0026, 0x2001, 0x1948, - 0x2004, 0x9015, 0x0904, 0x6ea5, 0xa978, 0xa874, 0x9105, 0x1904, - 0x6ea5, 0x9286, 0x0003, 0x0904, 0x6d3e, 0x9286, 0x0005, 0x0904, - 0x6d3e, 0xa87c, 0xd0bc, 0x1904, 0x6ea5, 0x2200, 0x0002, 0x6ea5, - 0x6d02, 0x6d3e, 0x6d3e, 0x6ea5, 0x6d3e, 0x0005, 0xa868, 0xd0fc, - 0x1500, 0x00e6, 0x0026, 0x2009, 0x1948, 0x210c, 0x81ff, 0x0904, - 0x6ea5, 0xa880, 0x9084, 0x00ff, 0x9086, 0x0001, 0x1904, 0x6ea5, - 0x9186, 0x0003, 0x0904, 0x6d3e, 0x9186, 0x0005, 0x0904, 0x6d3e, - 0xa87c, 0xd0cc, 0x0904, 0x6ea5, 0xa84f, 0x8021, 0xa853, 0x0017, - 0x0028, 0x0005, 0xa84f, 0x8020, 0xa853, 0x0016, 0x2071, 0x1910, - 0x701c, 0x9005, 0x1904, 0x7073, 0x0e04, 0x70e1, 0x2071, 0x0000, - 0xa84c, 0x7082, 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, - 0x708a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, - 0x11aa, 0x2071, 0x1800, 0x2011, 0x0001, 0xa804, 0x900d, 0x702c, - 0x1158, 0xa802, 0x2900, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, - 0x8725, 0x002e, 0x00ee, 0x0005, 0x0096, 0x2148, 0xa904, 0xa802, - 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x009e, 0x0c58, 0xa84f, 0x0000, - 0x00f6, 0x2079, 0x0050, 0x2071, 0x1910, 0xa803, 0x0000, 0x7010, - 0x9005, 0x1904, 0x6e29, 0x782c, 0x908c, 0x0780, 0x190c, 0x722f, - 0x8004, 0x8004, 0x8004, 0x9084, 0x0003, 0x0002, 0x6d5c, 0x6e29, - 0x6d80, 0x6dc6, 0x080c, 0x0dc5, 0x2071, 0x1800, 0x2900, 0x7822, - 0xa804, 0x900d, 0x1168, 0x2071, 0x19fb, 0x7044, 0x9005, 0x1320, - 0x2001, 0x1949, 0x2004, 0x7046, 0x00fe, 0x002e, 0x00ee, 0x0005, - 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, - 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8725, 0x0c18, - 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1578, 0x7824, - 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148, 0x2009, 0x1830, - 0x210c, 0x918a, 0x0020, 0x0218, 0x7022, 0x00ee, 0x0058, 0x00ee, - 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, - 0x080c, 0x8725, 0x782c, 0x9094, 0x0780, 0x190c, 0x722f, 0xd0a4, - 0x19f0, 0x2071, 0x19fb, 0x7044, 0x9005, 0x1320, 0x2001, 0x1949, - 0x2004, 0x7046, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, - 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, - 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8725, 0x0808, 0x0096, 0x00e6, - 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, - 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8725, 0x782c, 0x9094, 0x0780, - 0x190c, 0x722f, 0xd0a4, 0x1d60, 0x00ee, 0x782c, 0x9094, 0x0780, - 0x190c, 0x722f, 0xd09c, 0x1198, 0x009e, 0x2900, 0x7822, 0xa804, - 0x900d, 0x1550, 0x2071, 0x19fb, 0x7044, 0x9005, 0x1320, 0x2001, - 0x1949, 0x2004, 0x7046, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x009e, - 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, - 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1168, 0x2071, - 0x19fb, 0x7044, 0x9005, 0x1320, 0x2001, 0x1949, 0x2004, 0x7046, - 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, - 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, - 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8725, 0x00fe, 0x002e, 0x00ee, - 0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, - 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1904, - 0x6e7d, 0x782c, 0x9094, 0x0780, 0x190c, 0x722f, 0xd09c, 0x1198, - 0x701c, 0x904d, 0x0180, 0x7010, 0x8001, 0x7012, 0x1108, 0x701a, - 0xa800, 0x701e, 0x2900, 0x7822, 0x782c, 0x9094, 0x0780, 0x190c, - 0x722f, 0xd09c, 0x0d68, 0x782c, 0x9094, 0x0780, 0x190c, 0x722f, - 0xd0a4, 0x01b0, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, - 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8725, - 0x782c, 0x9094, 0x0780, 0x190c, 0x722f, 0xd0a4, 0x1d60, 0x00ee, - 0x2071, 0x19fb, 0x7044, 0x9005, 0x1320, 0x2001, 0x1949, 0x2004, - 0x7046, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1800, - 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, - 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8725, 0x00ee, - 0x0804, 0x6e39, 0xa868, 0xd0fc, 0x1904, 0x6ef3, 0x0096, 0xa804, - 0xa807, 0x0000, 0x904d, 0x190c, 0x0fc0, 0x009e, 0x0020, 0xa868, - 0xd0fc, 0x1904, 0x6ef3, 0x00e6, 0x0026, 0xa84f, 0x0000, 0x00f6, - 0x2079, 0x0050, 0x2071, 0x1800, 0x70ec, 0x8001, 0x0558, 0x1a04, - 0x6ef0, 0x2071, 0x1910, 0xa803, 0x0000, 0xa864, 0x9084, 0x00ff, - 0x908e, 0x0016, 0x01a8, 0x7010, 0x9005, 0x1904, 0x6fef, 0x782c, - 0x908c, 0x0780, 0x190c, 0x722f, 0x8004, 0x8004, 0x8004, 0x9084, - 0x0003, 0x0002, 0x6ef4, 0x6fef, 0x6f0f, 0x6f80, 0x080c, 0x0dc5, - 0x2009, 0x1948, 0x2104, 0x0002, 0x6ebb, 0x6ebb, 0x6ebb, 0x6d47, - 0x6ebb, 0x6d47, 0x70ef, 0x0fa0, 0x71e8, 0x8107, 0x9106, 0x9094, - 0x00c0, 0x9184, 0xff3f, 0x9205, 0x70ea, 0x3b08, 0x3a00, 0x9104, - 0x918d, 0x00c0, 0x21d8, 0x9084, 0xff3f, 0x9205, 0x20d0, 0x0808, - 0x70ee, 0x0804, 0x6eb1, 0x0005, 0x2071, 0x1800, 0x2900, 0x7822, - 0xa804, 0x900d, 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, - 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, - 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8725, 0x0c60, 0x2071, - 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1904, 0x6f6f, 0x7830, - 0x8007, 0x908c, 0x001f, 0x70f0, 0x9102, 0x1220, 0x00fe, 0x002e, - 0x00ee, 0x0005, 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, - 0x1148, 0x2009, 0x1830, 0x210c, 0x918a, 0x0020, 0x0218, 0x7022, - 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, - 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8725, 0x782c, 0x9094, 0x0780, - 0x190c, 0x722f, 0xd0a4, 0x19f0, 0x0e04, 0x6f66, 0x7838, 0x7938, - 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, - 0x00de, 0x2001, 0x1921, 0x200c, 0xc184, 0x2102, 0x2091, 0x4080, - 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11aa, 0x2001, 0x1922, - 0x2003, 0x0000, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2001, 0x1921, - 0x200c, 0xc185, 0x2102, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, - 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, - 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8725, 0x0804, 0x6f22, - 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, - 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8725, 0x782c, - 0x9094, 0x0780, 0x190c, 0x722f, 0xd0a4, 0x1d60, 0x00ee, 0x0e04, - 0x6fc2, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, - 0x6836, 0x6833, 0x0013, 0x00de, 0x7044, 0xc084, 0x7046, 0x2091, - 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11aa, 0x704b, - 0x0000, 0x782c, 0x9094, 0x0780, 0x190c, 0x722f, 0xd09c, 0x1170, - 0x009e, 0x2900, 0x7822, 0xa804, 0x900d, 0x11e0, 0x00fe, 0x002e, - 0x00ee, 0x0005, 0x7044, 0xc085, 0x7046, 0x0c58, 0x009e, 0x2908, - 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, - 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1120, 0x00fe, 0x002e, - 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, - 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, - 0x70c2, 0x080c, 0x8725, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2908, - 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, - 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1904, 0x705e, 0x782c, - 0x9094, 0x0780, 0x190c, 0x722f, 0xd09c, 0x11b0, 0x701c, 0x904d, - 0x0198, 0xa84c, 0x9005, 0x1180, 0x7010, 0x8001, 0x7012, 0x1108, - 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, 0x782c, 0x9094, 0x0780, - 0x190c, 0x722f, 0xd09c, 0x0d50, 0x782c, 0x9094, 0x0780, 0x190c, - 0x722f, 0xd0a4, 0x05b8, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, - 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, - 0x8725, 0x782c, 0x9094, 0x0780, 0x190c, 0x722f, 0xd0a4, 0x1d60, - 0x00ee, 0x0e04, 0x7057, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, - 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x7044, 0xc084, - 0x7046, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, - 0x11aa, 0x704b, 0x0000, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7044, - 0xc085, 0x7046, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x00e6, 0x2071, - 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, - 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8725, - 0x00ee, 0x0804, 0x6fff, 0x2071, 0x1910, 0xa803, 0x0000, 0x2908, - 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, - 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1128, 0x1e04, 0x709e, - 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, - 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, - 0x9200, 0x70c2, 0x080c, 0x8725, 0x0e04, 0x7088, 0x2071, 0x1910, - 0x701c, 0x2048, 0xa84c, 0x900d, 0x0d18, 0x2071, 0x0000, 0x7182, - 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0xa850, - 0x9082, 0x0019, 0x1278, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, - 0xd084, 0x190c, 0x11aa, 0x2071, 0x1910, 0x080c, 0x721b, 0x002e, - 0x00ee, 0x0005, 0xa850, 0x9082, 0x001c, 0x1e68, 0xa880, 0x708e, - 0x7036, 0x0146, 0x01d6, 0x0136, 0x01c6, 0x0156, 0x20e9, 0x0000, - 0x20a1, 0x002a, 0xa868, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, - 0x0021, 0x2098, 0x4003, 0x015e, 0x01ce, 0x013e, 0x01de, 0x014e, - 0x0890, 0x2071, 0x1910, 0xa803, 0x0000, 0x2908, 0x7010, 0x8000, - 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, - 0x2148, 0xa804, 0x900d, 0x1118, 0x002e, 0x00ee, 0x0005, 0x2071, - 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, - 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8725, - 0x002e, 0x00ee, 0x0005, 0x0006, 0xa87c, 0x0006, 0xa867, 0x0103, - 0x20a9, 0x001c, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001d, 0x20a0, - 0x9006, 0x4004, 0x000e, 0x9084, 0x00ff, 0xa87e, 0x000e, 0xa87a, - 0xa982, 0x0005, 0x2071, 0x1910, 0x7004, 0x0002, 0x712e, 0x712f, - 0x721a, 0x712f, 0x712c, 0x721a, 0x080c, 0x0dc5, 0x0005, 0x2001, - 0x1948, 0x2004, 0x0002, 0x7139, 0x7139, 0x71b3, 0x71b4, 0x7139, - 0x71b4, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x723a, 0x701c, 0x904d, - 0x0508, 0xa84c, 0x9005, 0x0904, 0x7184, 0x0e04, 0x7162, 0xa94c, - 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, - 0xa870, 0x708a, 0xa850, 0x9082, 0x0019, 0x1278, 0x2091, 0x4080, - 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11aa, 0x2071, 0x1910, - 0x080c, 0x721b, 0x012e, 0x0804, 0x71b2, 0xa850, 0x9082, 0x001c, - 0x1e68, 0xa880, 0x708e, 0x7036, 0x0146, 0x01d6, 0x0136, 0x01c6, - 0x0156, 0x20e9, 0x0000, 0x20a1, 0x002a, 0xa868, 0x20a8, 0xa860, - 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098, 0x4003, 0x015e, 0x01ce, - 0x013e, 0x01de, 0x014e, 0x0890, 0x2001, 0x005b, 0x2004, 0x9094, - 0x0780, 0x190c, 0x722f, 0xd09c, 0x2071, 0x1910, 0x1510, 0x2071, - 0x1910, 0x700f, 0x0001, 0xa964, 0x9184, 0x00ff, 0x9086, 0x0003, - 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101, 0x0108, 0x710e, 0x2900, - 0x00d6, 0x2069, 0x0050, 0x6822, 0x00de, 0x2071, 0x1910, 0x701c, - 0x2048, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, 0x9005, 0x1108, - 0x701a, 0x012e, 0x0005, 0x0005, 0x00d6, 0x2008, 0x2069, 0x19fb, - 0x6844, 0x9005, 0x0760, 0x0158, 0x9186, 0x0003, 0x0540, 0x2001, - 0x1815, 0x2004, 0x2009, 0x1ad1, 0x210c, 0x9102, 0x1500, 0x0126, - 0x2091, 0x8000, 0x2069, 0x0050, 0x693c, 0x6838, 0x9106, 0x0190, - 0x0e04, 0x71e6, 0x2069, 0x0000, 0x6837, 0x8040, 0x6833, 0x0012, - 0x6883, 0x8040, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, - 0x190c, 0x11aa, 0x2069, 0x19fb, 0x6847, 0xffff, 0x012e, 0x00de, - 0x0126, 0x2091, 0x8000, 0x1e0c, 0x72a5, 0x701c, 0x904d, 0x0540, - 0x2001, 0x005b, 0x2004, 0x9094, 0x0780, 0x15c9, 0xd09c, 0x1500, - 0x2071, 0x1910, 0x700f, 0x0001, 0xa964, 0x9184, 0x00ff, 0x9086, - 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101, 0x0108, 0x710e, - 0x2900, 0x00d6, 0x2069, 0x0050, 0x6822, 0x00de, 0x701c, 0x2048, - 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, 0x9005, 0x1108, 0x701a, - 0x012e, 0x0005, 0x0005, 0x0126, 0x2091, 0x8000, 0x701c, 0x904d, - 0x0160, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, 0x9005, 0x1108, - 0x701a, 0x012e, 0x080c, 0x1040, 0x0005, 0x012e, 0x0005, 0x2091, - 0x8000, 0x0e04, 0x7231, 0x0006, 0x0016, 0x2001, 0x8004, 0x0006, - 0x0804, 0x0dce, 0x0096, 0x00f6, 0x2079, 0x0050, 0x7044, 0xd084, - 0x01d0, 0xc084, 0x7046, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, - 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, 0x4080, - 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11aa, 0x704b, 0x0000, - 0x00fe, 0x009e, 0x0005, 0x782c, 0x9094, 0x0780, 0x1981, 0xd0a4, - 0x0db8, 0x7148, 0x704c, 0x8108, 0x714a, 0x9102, 0x0e88, 0x00e6, - 0x2071, 0x1800, 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, - 0x1148, 0x2009, 0x1830, 0x210c, 0x918a, 0x0020, 0x0218, 0x7022, - 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, - 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8725, 0x782c, 0x9094, 0x0780, - 0x190c, 0x722f, 0xd0a4, 0x19f0, 0x7838, 0x7938, 0x910e, 0x1de0, - 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, - 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11aa, 0x00ee, - 0x704b, 0x0000, 0x00fe, 0x009e, 0x0005, 0x00f6, 0x2079, 0x0050, - 0x7044, 0xd084, 0x01b8, 0xc084, 0x7046, 0x7838, 0x7938, 0x910e, - 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, - 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11aa, - 0x00fe, 0x0005, 0x782c, 0x9094, 0x0780, 0x190c, 0x722f, 0xd0a4, - 0x0db8, 0x00e6, 0x2071, 0x1800, 0x7824, 0x2048, 0x702c, 0xa802, - 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8725, 0x782c, - 0x9094, 0x0780, 0x190c, 0x722f, 0xd0a4, 0x1d70, 0x00d6, 0x2069, - 0x0050, 0x693c, 0x2069, 0x1948, 0x6808, 0x690a, 0x2069, 0x19fb, - 0x9102, 0x1118, 0x6844, 0x9005, 0x1320, 0x2001, 0x1949, 0x200c, - 0x6946, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x7098, 0x908a, 0x002a, - 0x1a0c, 0x0dc5, 0x9082, 0x001d, 0x001b, 0x6027, 0x1e00, 0x0005, - 0x73e6, 0x7353, 0x736f, 0x7399, 0x73d5, 0x7415, 0x7427, 0x736f, - 0x73fd, 0x730e, 0x733c, 0x73bf, 0x730d, 0x0005, 0x00d6, 0x2069, - 0x0200, 0x6804, 0x9005, 0x1180, 0x6808, 0x9005, 0x1518, 0x709b, - 0x0029, 0x2069, 0x198f, 0x2d04, 0x7002, 0x080c, 0x7774, 0x6028, - 0x9085, 0x0600, 0x602a, 0x00b0, 0x709b, 0x0029, 0x2069, 0x198f, - 0x2d04, 0x7002, 0x6028, 0x9085, 0x0600, 0x602a, 0x00e6, 0x0036, - 0x0046, 0x0056, 0x2071, 0x1a65, 0x080c, 0x1ad9, 0x005e, 0x004e, - 0x003e, 0x00ee, 0x00de, 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804, - 0x9005, 0x1178, 0x6808, 0x9005, 0x1160, 0x709b, 0x0029, 0x2069, - 0x198f, 0x2d04, 0x7002, 0x080c, 0x7818, 0x6028, 0x9085, 0x0600, - 0x602a, 0x00de, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c, 0x2d39, - 0x000e, 0x6124, 0xd1e4, 0x1190, 0x080c, 0x7494, 0xd1d4, 0x1160, - 0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x709b, 0x0020, 0x080c, 0x7494, - 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, 0x001f, 0x0005, 0x2001, - 0x0088, 0x080c, 0x2d39, 0x6124, 0xd1cc, 0x11e8, 0xd1dc, 0x11c0, - 0xd1e4, 0x1198, 0x9184, 0x1e00, 0x11d8, 0x080c, 0x1b06, 0x60e3, - 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x7663, 0x2001, 0x0080, - 0x080c, 0x2d39, 0x709b, 0x0029, 0x0058, 0x709b, 0x001e, 0x0040, - 0x709b, 0x001d, 0x0028, 0x709b, 0x0020, 0x0010, 0x709b, 0x001f, - 0x0005, 0x080c, 0x1b06, 0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, - 0x080c, 0x7663, 0x2001, 0x0080, 0x080c, 0x2d39, 0x6124, 0xd1d4, - 0x1198, 0xd1dc, 0x1170, 0xd1e4, 0x1148, 0x9184, 0x1e00, 0x1118, - 0x709b, 0x0029, 0x0058, 0x709b, 0x0028, 0x0040, 0x709b, 0x001e, - 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, 0x001f, 0x0005, 0x6124, - 0xd1d4, 0x1180, 0xd1dc, 0x1158, 0xd1e4, 0x1130, 0x9184, 0x1e00, - 0x1158, 0x709b, 0x0029, 0x0040, 0x709b, 0x001e, 0x0028, 0x709b, - 0x001d, 0x0010, 0x709b, 0x001f, 0x0005, 0x2001, 0x00a0, 0x080c, - 0x2d39, 0x6124, 0xd1dc, 0x1138, 0xd1e4, 0x0138, 0x080c, 0x1b06, - 0x709b, 0x001e, 0x0010, 0x709b, 0x001d, 0x0005, 0x080c, 0x7517, - 0x6124, 0xd1dc, 0x1188, 0x080c, 0x7494, 0x0016, 0x080c, 0x1b06, - 0x001e, 0xd1d4, 0x1128, 0xd1e4, 0x0138, 0x709b, 0x001e, 0x0020, - 0x709b, 0x001f, 0x080c, 0x7494, 0x0005, 0x0006, 0x2001, 0x00a0, - 0x080c, 0x2d39, 0x000e, 0x6124, 0xd1d4, 0x1160, 0xd1cc, 0x1150, - 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x709b, 0x001e, 0x0028, 0x709b, - 0x001d, 0x0010, 0x709b, 0x0021, 0x0005, 0x080c, 0x7517, 0x6124, - 0xd1d4, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x709b, 0x001e, - 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, 0x001f, 0x0005, 0x0006, - 0x2001, 0x0090, 0x080c, 0x2d39, 0x000e, 0x6124, 0xd1d4, 0x1178, - 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0158, 0x709b, 0x001e, - 0x0040, 0x709b, 0x001d, 0x0028, 0x709b, 0x0020, 0x0010, 0x709b, - 0x001f, 0x0005, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x0126, 0x2061, - 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2091, 0x8000, 0x080c, - 0x7637, 0x11d8, 0x2001, 0x180c, 0x200c, 0xd1b4, 0x01b0, 0xc1b4, - 0x2102, 0x6027, 0x0200, 0x080c, 0x2c61, 0x6024, 0xd0cc, 0x0148, - 0x2001, 0x00a0, 0x080c, 0x2d39, 0x080c, 0x7932, 0x080c, 0x612e, - 0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408, 0x080c, 0x7651, 0x0150, - 0x080c, 0x7648, 0x1138, 0x2001, 0x0001, 0x080c, 0x281c, 0x080c, - 0x760f, 0x00a0, 0x080c, 0x7514, 0x0178, 0x2001, 0x0001, 0x080c, - 0x281c, 0x7098, 0x9086, 0x001e, 0x0120, 0x7098, 0x9086, 0x0022, - 0x1118, 0x709b, 0x0025, 0x0010, 0x709b, 0x0021, 0x012e, 0x00ee, - 0x00de, 0x00ce, 0x001e, 0x0005, 0x0026, 0x2011, 0x74a5, 0x080c, - 0x8917, 0x002e, 0x0016, 0x0026, 0x2009, 0x0064, 0x2011, 0x74a5, - 0x080c, 0x890e, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00f6, 0x0016, - 0x080c, 0xa6e9, 0x2071, 0x1800, 0x080c, 0x7442, 0x001e, 0x00fe, - 0x00ee, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, - 0x00f6, 0x0126, 0x2071, 0x1800, 0x080c, 0xa6e9, 0x2061, 0x0100, - 0x2069, 0x0140, 0x2091, 0x8000, 0x6028, 0xc09c, 0x602a, 0x2011, - 0x0003, 0x080c, 0xaabf, 0x2011, 0x0002, 0x080c, 0xaac9, 0x080c, - 0xa9d3, 0x080c, 0x88c3, 0x0036, 0x901e, 0x080c, 0xaa49, 0x003e, - 0x60e3, 0x0000, 0x080c, 0xf07f, 0x080c, 0xf09a, 0x2009, 0x0004, - 0x080c, 0x2c67, 0x080c, 0x2b82, 0x2001, 0x1800, 0x2003, 0x0004, - 0x6027, 0x0008, 0x2011, 0x74a5, 0x080c, 0x8917, 0x080c, 0x7651, - 0x0118, 0x9006, 0x080c, 0x2d39, 0x080c, 0x0ba0, 0x2001, 0x0001, - 0x080c, 0x281c, 0x012e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x003e, - 0x002e, 0x001e, 0x0005, 0x0026, 0x00e6, 0x2011, 0x74b2, 0x2071, - 0x19fb, 0x701c, 0x9206, 0x1118, 0x7018, 0x9005, 0x0110, 0x9085, - 0x0001, 0x00ee, 0x002e, 0x0005, 0x6020, 0xd09c, 0x0005, 0x6800, - 0x9084, 0xfffe, 0x9086, 0x00c0, 0x01b8, 0x2001, 0x00c0, 0x080c, - 0x2d39, 0x0156, 0x20a9, 0x002d, 0x1d04, 0x7524, 0x2091, 0x6000, - 0x1f04, 0x7524, 0x015e, 0x00d6, 0x2069, 0x1800, 0x689c, 0x8001, - 0x0220, 0x0118, 0x689e, 0x00de, 0x0005, 0x689f, 0x0014, 0x68e8, - 0xd0dc, 0x0dc8, 0x6800, 0x9086, 0x0001, 0x1da8, 0x080c, 0x8923, - 0x0c90, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, - 0x2071, 0x1800, 0x080c, 0x7941, 0x2001, 0x196d, 0x2003, 0x0000, - 0x9006, 0x709a, 0x60e2, 0x6886, 0x080c, 0x28e7, 0x9006, 0x080c, - 0x2d39, 0x080c, 0x5fed, 0x6027, 0xffff, 0x602b, 0x182f, 0x00ee, - 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, - 0x2069, 0x0140, 0x2071, 0x1800, 0x2001, 0x197d, 0x200c, 0x9186, - 0x0000, 0x0158, 0x9186, 0x0001, 0x0158, 0x9186, 0x0002, 0x0158, - 0x9186, 0x0003, 0x0158, 0x0804, 0x75ff, 0x709b, 0x0022, 0x0040, - 0x709b, 0x0021, 0x0028, 0x709b, 0x0023, 0x0010, 0x709b, 0x0024, - 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x28e7, - 0x0026, 0x080c, 0xb244, 0x002e, 0x7000, 0x908e, 0x0004, 0x0118, - 0x602b, 0x0028, 0x0010, 0x602b, 0x0020, 0x0156, 0x0126, 0x2091, - 0x8000, 0x20a9, 0x0005, 0x6024, 0xd0ac, 0x0150, 0x012e, 0x015e, - 0x080c, 0xd7e3, 0x0118, 0x9006, 0x080c, 0x2d63, 0x0804, 0x760b, - 0x6800, 0x9084, 0x00a1, 0xc0bd, 0x6802, 0x080c, 0x2c61, 0x6904, - 0xd1d4, 0x1140, 0x2001, 0x0100, 0x080c, 0x2d39, 0x1f04, 0x75a3, - 0x080c, 0x768b, 0x012e, 0x015e, 0x080c, 0x7648, 0x01d8, 0x6044, - 0x9005, 0x0198, 0x2011, 0x0114, 0x2204, 0x9085, 0x0100, 0x2012, - 0x6050, 0x0006, 0x9085, 0x0020, 0x6052, 0x080c, 0x768b, 0x9006, - 0x8001, 0x1df0, 0x000e, 0x6052, 0x0028, 0x6804, 0xd0d4, 0x1110, - 0x080c, 0x768b, 0x080c, 0xd7e3, 0x0118, 0x9006, 0x080c, 0x2d63, - 0x0016, 0x0026, 0x7000, 0x908e, 0x0004, 0x0130, 0x2009, 0x00c8, - 0x2011, 0x74b2, 0x080c, 0x88d5, 0x002e, 0x001e, 0x080c, 0x871c, - 0x7034, 0xc085, 0x7036, 0x2001, 0x197d, 0x2003, 0x0004, 0x080c, - 0x72f5, 0x080c, 0x7648, 0x0138, 0x6804, 0xd0d4, 0x1120, 0xd0dc, - 0x1100, 0x080c, 0x7937, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, - 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, - 0x080c, 0x8733, 0x080c, 0x8725, 0x080c, 0x7941, 0x2001, 0x196d, - 0x2003, 0x0000, 0x9006, 0x709a, 0x60e2, 0x6886, 0x080c, 0x28e7, - 0x9006, 0x080c, 0x2d39, 0x6043, 0x0090, 0x6043, 0x0010, 0x6027, - 0xffff, 0x602b, 0x182f, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0006, - 0x2001, 0x197c, 0x2004, 0x9086, 0xaaaa, 0x000e, 0x0005, 0x0006, - 0x080c, 0x57d9, 0x9084, 0x0030, 0x9086, 0x0000, 0x000e, 0x0005, - 0x0006, 0x080c, 0x57d9, 0x9084, 0x0030, 0x9086, 0x0030, 0x000e, - 0x0005, 0x0006, 0x080c, 0x57d9, 0x9084, 0x0030, 0x9086, 0x0010, - 0x000e, 0x0005, 0x0006, 0x080c, 0x57d9, 0x9084, 0x0030, 0x9086, - 0x0020, 0x000e, 0x0005, 0x0036, 0x0016, 0x2001, 0x180c, 0x2004, - 0x908c, 0x0013, 0x0168, 0x0020, 0x080c, 0x2907, 0x900e, 0x0010, - 0x2009, 0x0002, 0x2019, 0x0028, 0x080c, 0x321b, 0x9006, 0x0019, - 0x001e, 0x003e, 0x0005, 0x00e6, 0x2071, 0x180c, 0x2e04, 0x0130, - 0x080c, 0xd7dc, 0x1128, 0x9085, 0x0010, 0x0010, 0x9084, 0xffef, - 0x2072, 0x00ee, 0x0005, 0x6050, 0x0006, 0x60ec, 0x0006, 0x600c, - 0x0006, 0x6004, 0x0006, 0x6028, 0x0006, 0x0016, 0x6138, 0x6050, - 0x9084, 0xfbff, 0x9085, 0x2000, 0x6052, 0x613a, 0x20a9, 0x0012, - 0x1d04, 0x76a0, 0x2091, 0x6000, 0x1f04, 0x76a0, 0x602f, 0x0100, - 0x602f, 0x0000, 0x6050, 0x9085, 0x0400, 0x9084, 0xdfff, 0x6052, - 0x613a, 0x001e, 0x602f, 0x0040, 0x602f, 0x0000, 0x000e, 0x602a, - 0x000e, 0x6006, 0x000e, 0x600e, 0x000e, 0x60ee, 0x60e3, 0x0000, - 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x28e7, 0x2001, 0x00a0, - 0x0006, 0x080c, 0xd7e3, 0x000e, 0x0130, 0x080c, 0x2d57, 0x9006, - 0x080c, 0x2d63, 0x0010, 0x080c, 0x2d39, 0x000e, 0x6052, 0x6050, - 0x0006, 0xc0e5, 0x6052, 0x00f6, 0x2079, 0x0100, 0x080c, 0x2bd6, - 0x00fe, 0x000e, 0x6052, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, - 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, - 0x1800, 0x6020, 0x9084, 0x0080, 0x0138, 0x2001, 0x180c, 0x200c, - 0xc1c5, 0x2102, 0x0804, 0x7766, 0x2001, 0x180c, 0x200c, 0xc1c4, - 0x2102, 0x6028, 0x9084, 0xe1ff, 0x602a, 0x6027, 0x0200, 0x2001, - 0x0090, 0x080c, 0x2d39, 0x20a9, 0x0366, 0x6024, 0xd0cc, 0x1518, - 0x1d04, 0x770d, 0x2091, 0x6000, 0x1f04, 0x770d, 0x2011, 0x0003, - 0x080c, 0xaabf, 0x2011, 0x0002, 0x080c, 0xaac9, 0x080c, 0xa9d3, - 0x901e, 0x080c, 0xaa49, 0x2001, 0x00a0, 0x080c, 0x2d39, 0x080c, - 0x7932, 0x080c, 0x612e, 0x080c, 0xd7e3, 0x0110, 0x080c, 0x0d33, - 0x9085, 0x0001, 0x04c8, 0x080c, 0x1b06, 0x60e3, 0x0000, 0x2001, - 0x180d, 0x2004, 0xd08c, 0x2001, 0x0002, 0x1118, 0x2001, 0x196d, - 0x2004, 0x080c, 0x28e7, 0x60e2, 0x2001, 0x0080, 0x080c, 0x2d39, - 0x20a9, 0x0366, 0x6027, 0x1e00, 0x2009, 0x1e00, 0x080c, 0x2c61, - 0x6024, 0x910c, 0x0140, 0x1d04, 0x774a, 0x2091, 0x6000, 0x1f04, - 0x774a, 0x0804, 0x7716, 0x6028, 0x9085, 0x1e00, 0x602a, 0x70b4, - 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x080c, 0xd7e3, - 0x0110, 0x080c, 0x0d33, 0x9006, 0x00ee, 0x00de, 0x00ce, 0x003e, - 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, - 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800, 0x7000, - 0x9086, 0x0003, 0x1168, 0x2001, 0x020b, 0x2004, 0x9084, 0x5540, - 0x9086, 0x5540, 0x1128, 0x2069, 0x1a7c, 0x2d04, 0x8000, 0x206a, - 0x2069, 0x0140, 0x6020, 0x9084, 0x00c0, 0x0120, 0x6884, 0x9005, - 0x1904, 0x77d9, 0x2001, 0x0088, 0x080c, 0x2d39, 0x9006, 0x60e2, - 0x6886, 0x080c, 0x28e7, 0x2069, 0x0200, 0x6804, 0x9005, 0x1118, - 0x6808, 0x9005, 0x01c0, 0x6028, 0x9084, 0xfbff, 0x602a, 0x6027, - 0x0400, 0x2069, 0x198f, 0x7000, 0x206a, 0x709b, 0x0026, 0x7003, - 0x0001, 0x20a9, 0x0002, 0x1d04, 0x77bb, 0x2091, 0x6000, 0x1f04, - 0x77bb, 0x0804, 0x7810, 0x2069, 0x0140, 0x20a9, 0x0384, 0x6027, - 0x1e00, 0x2009, 0x1e00, 0x080c, 0x2c61, 0x6024, 0x910c, 0x0508, - 0x9084, 0x1a00, 0x11f0, 0x1d04, 0x77c7, 0x2091, 0x6000, 0x1f04, - 0x77c7, 0x2011, 0x0003, 0x080c, 0xaabf, 0x2011, 0x0002, 0x080c, - 0xaac9, 0x080c, 0xa9d3, 0x901e, 0x080c, 0xaa49, 0x2001, 0x00a0, - 0x080c, 0x2d39, 0x080c, 0x7932, 0x080c, 0x612e, 0x9085, 0x0001, - 0x00f8, 0x080c, 0x1b06, 0x2001, 0x0080, 0x080c, 0x2d39, 0x2069, - 0x0140, 0x60e3, 0x0000, 0x70b4, 0x9005, 0x1118, 0x6887, 0x0001, - 0x0008, 0x6886, 0x2001, 0x180d, 0x2004, 0xd08c, 0x2001, 0x0002, - 0x1118, 0x2001, 0x196d, 0x2004, 0x080c, 0x28e7, 0x60e2, 0x9006, - 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, - 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, - 0x0100, 0x2071, 0x1800, 0x6020, 0x9084, 0x00c0, 0x01c8, 0x2011, - 0x0003, 0x080c, 0xaabf, 0x2011, 0x0002, 0x080c, 0xaac9, 0x080c, - 0xa9d3, 0x901e, 0x080c, 0xaa49, 0x2069, 0x0140, 0x2001, 0x00a0, - 0x080c, 0x2d39, 0x080c, 0x7932, 0x080c, 0x612e, 0x0804, 0x78b2, - 0x2001, 0x180c, 0x200c, 0xd1b4, 0x1160, 0xc1b5, 0x2102, 0x080c, - 0x749a, 0x2069, 0x0140, 0x2001, 0x0080, 0x080c, 0x2d39, 0x60e3, - 0x0000, 0x2069, 0x0200, 0x6804, 0x9005, 0x1118, 0x6808, 0x9005, - 0x0180, 0x6028, 0x9084, 0xfdff, 0x602a, 0x6027, 0x0200, 0x2069, - 0x198f, 0x7000, 0x206a, 0x709b, 0x0027, 0x7003, 0x0001, 0x0804, - 0x78b2, 0x6027, 0x1e00, 0x2009, 0x1e00, 0x080c, 0x2c61, 0x6024, - 0x910c, 0x01c8, 0x9084, 0x1c00, 0x11b0, 0x1d04, 0x7869, 0x0006, - 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x080c, 0x8776, 0x00ee, 0x00de, - 0x00ce, 0x001e, 0x000e, 0x00e6, 0x2071, 0x19fb, 0x7078, 0x00ee, - 0x9005, 0x19f8, 0x0438, 0x0026, 0x2011, 0x74b2, 0x080c, 0x883d, - 0x2011, 0x74a5, 0x080c, 0x8917, 0x002e, 0x2069, 0x0140, 0x60e3, - 0x0000, 0x70b4, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, - 0x2001, 0x180d, 0x2004, 0xd08c, 0x2001, 0x0002, 0x1118, 0x2001, - 0x196d, 0x2004, 0x080c, 0x28e7, 0x60e2, 0x2001, 0x180c, 0x200c, - 0xc1b4, 0x2102, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, - 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x0046, 0x00c6, - 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800, 0x080c, 0xd7dc, 0x1904, - 0x7920, 0x7130, 0xd184, 0x1170, 0x080c, 0x33aa, 0x0138, 0xc18d, - 0x7132, 0x2011, 0x1848, 0x2214, 0xd2ac, 0x1120, 0x7030, 0xd08c, - 0x0904, 0x7920, 0x2011, 0x1848, 0x220c, 0xd1a4, 0x0538, 0x0016, - 0x2019, 0x000e, 0x080c, 0xeba1, 0x0156, 0x00b6, 0x20a9, 0x007f, - 0x900e, 0x9186, 0x007e, 0x01a0, 0x9186, 0x0080, 0x0188, 0x080c, - 0x6724, 0x1170, 0x2120, 0x9006, 0x0016, 0x2009, 0x000e, 0x080c, - 0xec31, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, 0x8a50, 0x001e, - 0x8108, 0x1f04, 0x78e9, 0x00be, 0x015e, 0x001e, 0xd1ac, 0x1148, - 0x0016, 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x321b, 0x001e, - 0x0078, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x6724, - 0x1110, 0x080c, 0x6148, 0x8108, 0x1f04, 0x7916, 0x00be, 0x015e, - 0x080c, 0x1b06, 0x080c, 0xb244, 0x60e3, 0x0000, 0x080c, 0x612e, - 0x080c, 0x7563, 0x00ee, 0x00ce, 0x004e, 0x003e, 0x002e, 0x001e, - 0x015e, 0x0005, 0x2001, 0x197d, 0x2003, 0x0001, 0x0005, 0x2001, - 0x197d, 0x2003, 0x0000, 0x0005, 0x2001, 0x197c, 0x2003, 0xaaaa, - 0x0005, 0x2001, 0x197c, 0x2003, 0x0000, 0x0005, 0x2071, 0x18fa, - 0x7003, 0x0000, 0x7007, 0x0000, 0x080c, 0x1027, 0x090c, 0x0dc5, - 0xa8ab, 0xdcb0, 0x2900, 0x704e, 0x080c, 0x1027, 0x090c, 0x0dc5, - 0xa8ab, 0xdcb0, 0x2900, 0x7052, 0xa867, 0x0000, 0xa86b, 0x0001, - 0xa89f, 0x0000, 0x0005, 0x00e6, 0x2071, 0x0040, 0x6848, 0x9005, - 0x1118, 0x9085, 0x0001, 0x04b0, 0x6840, 0x9005, 0x0150, 0x04a1, - 0x6a50, 0x9200, 0x7002, 0x6854, 0x9101, 0x7006, 0x9006, 0x7012, - 0x7016, 0x6850, 0x7002, 0x6854, 0x7006, 0x6858, 0x700a, 0x685c, - 0x700e, 0x6840, 0x9005, 0x1110, 0x7012, 0x7016, 0x6848, 0x701a, - 0x701c, 0x9085, 0x0040, 0x701e, 0x2001, 0x0019, 0x7036, 0x702b, - 0x0001, 0x2001, 0x0004, 0x200c, 0x918c, 0xfff7, 0x918d, 0x8000, - 0x2102, 0x00d6, 0x2069, 0x18fa, 0x6807, 0x0001, 0x00de, 0x080c, - 0x7f74, 0x9006, 0x00ee, 0x0005, 0x900e, 0x0156, 0x20a9, 0x0006, - 0x8003, 0x2011, 0x0100, 0x2214, 0x9296, 0x0008, 0x1110, 0x818d, - 0x0010, 0x81f5, 0x3e08, 0x1f04, 0x79a8, 0x015e, 0x0005, 0x2079, - 0x0040, 0x2071, 0x18fa, 0x7004, 0x0002, 0x79c7, 0x79c8, 0x7a00, - 0x7a5b, 0x7bbb, 0x79c5, 0x79c5, 0x7be5, 0x080c, 0x0dc5, 0x0005, - 0x2079, 0x0040, 0x782c, 0x908c, 0x0780, 0x190c, 0x8056, 0xd0a4, - 0x01f8, 0x7824, 0x2048, 0x9006, 0xa802, 0xa806, 0xa864, 0x9084, - 0x00ff, 0x908a, 0x0040, 0x0610, 0x00c0, 0x2001, 0x1800, 0x200c, - 0x9186, 0x0003, 0x1168, 0x7004, 0x0002, 0x79f0, 0x79ca, 0x79f0, - 0x79ee, 0x79f0, 0x79f0, 0x79f0, 0x79f0, 0x79f0, 0x080c, 0x7a5b, - 0x782c, 0xd09c, 0x090c, 0x7f74, 0x0005, 0x9082, 0x005a, 0x1218, - 0x2100, 0x003b, 0x0c10, 0x080c, 0x7a91, 0x0c90, 0x00e3, 0x08e8, - 0x0005, 0x7a91, 0x7a91, 0x7a91, 0x7a91, 0x7a91, 0x7a91, 0x7a91, - 0x7a91, 0x7ab3, 0x7a91, 0x7a91, 0x7a91, 0x7a91, 0x7a91, 0x7a91, - 0x7a91, 0x7a91, 0x7a91, 0x7a91, 0x7a91, 0x7a91, 0x7a91, 0x7a91, - 0x7a91, 0x7a91, 0x7a91, 0x7a91, 0x7a91, 0x7a9d, 0x7a91, 0x7cdb, - 0x7a91, 0x7a91, 0x7a91, 0x7ab3, 0x7a91, 0x7a9d, 0x7d1c, 0x7d5d, - 0x7da4, 0x7db8, 0x7a91, 0x7a91, 0x7ab3, 0x7a9d, 0x7ac7, 0x7a91, - 0x7b8f, 0x7e63, 0x7e7e, 0x7a91, 0x7ab3, 0x7a91, 0x7ac7, 0x7a91, - 0x7a91, 0x7b85, 0x7e7e, 0x7a91, 0x7a91, 0x7a91, 0x7a91, 0x7a91, - 0x7a91, 0x7a91, 0x7a91, 0x7a91, 0x7adb, 0x7a91, 0x7a91, 0x7a91, - 0x7a91, 0x7a91, 0x7a91, 0x7a91, 0x7a91, 0x7a91, 0x7ffa, 0x7a91, - 0x7fa4, 0x7a91, 0x7fa4, 0x7a91, 0x7af0, 0x7a91, 0x7a91, 0x7a91, - 0x7a91, 0x7a91, 0x7a91, 0x2079, 0x0040, 0x7004, 0x9086, 0x0003, - 0x1198, 0x782c, 0x080c, 0x7f9d, 0xd0a4, 0x0170, 0x7824, 0x2048, - 0x9006, 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff, 0x908a, 0x001a, - 0x1210, 0x002b, 0x0c50, 0x00e9, 0x080c, 0x7f74, 0x0005, 0x7a91, - 0x7a9d, 0x7cc7, 0x7a91, 0x7a9d, 0x7a91, 0x7a9d, 0x7a9d, 0x7a91, - 0x7a9d, 0x7cc7, 0x7a9d, 0x7a9d, 0x7a9d, 0x7a9d, 0x7a9d, 0x7a91, - 0x7a9d, 0x7cc7, 0x7a91, 0x7a91, 0x7a9d, 0x7a91, 0x7a91, 0x7a91, - 0x7a9d, 0x00e6, 0x2071, 0x18fa, 0x2009, 0x0400, 0x0071, 0x00ee, - 0x0005, 0x2009, 0x1000, 0x0049, 0x0005, 0x2009, 0x2000, 0x0029, - 0x0005, 0x2009, 0x0800, 0x0009, 0x0005, 0x7007, 0x0001, 0xa868, - 0x9084, 0x00ff, 0x9105, 0xa86a, 0x0126, 0x2091, 0x8000, 0x080c, - 0x6e9f, 0x012e, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0d08, - 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x7c64, 0x7007, 0x0003, - 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x7c64, 0x0005, 0xa864, - 0x8007, 0x9084, 0x00ff, 0x0968, 0x8001, 0x1120, 0x7007, 0x0001, - 0x0804, 0x7c7f, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, - 0x704b, 0x7c7f, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0904, - 0x7a99, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x7c9b, 0x7007, - 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x7c9b, 0x0005, - 0xa864, 0x8007, 0x9084, 0x00ff, 0x9086, 0x0001, 0x1904, 0x7a99, - 0x7007, 0x0001, 0x2009, 0x1834, 0x210c, 0x81ff, 0x1904, 0x7b5c, - 0x2001, 0x180d, 0x2004, 0xd08c, 0x0904, 0x7b47, 0xa99c, 0x9186, - 0x00ff, 0x05e8, 0xa994, 0x9186, 0x006f, 0x0188, 0x9186, 0x0074, - 0x15b0, 0x0026, 0x2011, 0x0010, 0x080c, 0x6ac7, 0x002e, 0x0578, - 0x0016, 0xa998, 0x080c, 0x6b11, 0x001e, 0x1548, 0x0400, 0x080c, - 0x7637, 0x0140, 0xa897, 0x4005, 0xa89b, 0x0016, 0x2001, 0x0030, - 0x900e, 0x0438, 0x0026, 0x2011, 0x8008, 0x080c, 0x6ac7, 0x002e, - 0x01b0, 0x0016, 0x0026, 0x0036, 0xa998, 0xaaa0, 0xab9c, 0x918d, - 0x8000, 0x080c, 0x6b11, 0x003e, 0x002e, 0x001e, 0x1140, 0xa897, - 0x4005, 0xa89b, 0x4009, 0x2001, 0x0030, 0x900e, 0x0050, 0xa868, - 0x9084, 0x00ff, 0xa86a, 0xa883, 0x0000, 0x080c, 0x63c5, 0x1108, - 0x0005, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139, 0xa87a, 0xa982, - 0x080c, 0x6e9f, 0x012e, 0x0ca0, 0xa994, 0x9186, 0x0071, 0x0904, - 0x7b00, 0x9186, 0x0064, 0x0904, 0x7b00, 0x9186, 0x007c, 0x0904, - 0x7b00, 0x9186, 0x0028, 0x0904, 0x7b00, 0x9186, 0x0038, 0x0904, - 0x7b00, 0x9186, 0x0078, 0x0904, 0x7b00, 0x9186, 0x005f, 0x0904, - 0x7b00, 0x9186, 0x0056, 0x0904, 0x7b00, 0xa897, 0x4005, 0xa89b, - 0x0001, 0x2001, 0x0030, 0x900e, 0x0860, 0xa87c, 0x9084, 0x00c0, - 0x9086, 0x00c0, 0x1120, 0x7007, 0x0001, 0x0804, 0x7e95, 0x2900, - 0x7016, 0x701a, 0x20a9, 0x0004, 0xa860, 0x20e0, 0xa85c, 0x9080, - 0x0030, 0x2098, 0x7050, 0x2040, 0xa060, 0x20e8, 0xa05c, 0x9080, - 0x0023, 0x20a0, 0x4003, 0xa888, 0x7012, 0x9082, 0x0401, 0x1a04, - 0x7aa1, 0xaab4, 0x928a, 0x0002, 0x1a04, 0x7aa1, 0x82ff, 0x1138, - 0xa8b8, 0xa9bc, 0x9105, 0x0118, 0x2001, 0x7c22, 0x0018, 0x9280, - 0x7c18, 0x2005, 0x7056, 0x7010, 0x9015, 0x0904, 0x7c03, 0x080c, - 0x1027, 0x1118, 0x7007, 0x0004, 0x0005, 0x2900, 0x7022, 0x7054, - 0x2060, 0xe000, 0xa866, 0x7050, 0x2040, 0xa95c, 0xe004, 0x9100, - 0xa076, 0xa860, 0xa072, 0xe008, 0x920a, 0x1210, 0x900e, 0x2200, - 0x7112, 0xe20c, 0x8003, 0x800b, 0x9296, 0x0004, 0x0108, 0x9108, - 0xa17a, 0x810b, 0xa17e, 0x080c, 0x10f8, 0xa06c, 0x908e, 0x0100, - 0x0170, 0x9086, 0x0200, 0x0118, 0x7007, 0x0007, 0x0005, 0x7020, - 0x2048, 0x080c, 0x1040, 0x7014, 0x2048, 0x0804, 0x7aa1, 0x7020, - 0x2048, 0x7018, 0xa802, 0xa807, 0x0000, 0x2908, 0x2048, 0xa906, - 0x711a, 0x0804, 0x7bbb, 0x7014, 0x2048, 0x7007, 0x0001, 0xa8b4, - 0x9005, 0x1128, 0xa8b8, 0xa9bc, 0x9105, 0x0108, 0x00b9, 0xa864, - 0x9084, 0x00ff, 0x9086, 0x001e, 0x0904, 0x7e95, 0x0804, 0x7c64, - 0x7c1a, 0x7c1e, 0x0002, 0x001d, 0x0007, 0x0004, 0x000a, 0x001b, - 0x0005, 0x0006, 0x000a, 0x001d, 0x0005, 0x0004, 0x0076, 0x0066, - 0xafb8, 0xaebc, 0xa804, 0x2050, 0xb0c0, 0xb0e2, 0xb0bc, 0xb0de, - 0xb0b8, 0xb0d2, 0xb0b4, 0xb0ce, 0xb6da, 0xb7d6, 0xb0b0, 0xb0ca, - 0xb0ac, 0xb0c6, 0xb0a8, 0xb0ba, 0xb0a4, 0xb0b6, 0xb6c2, 0xb7be, - 0xb0a0, 0xb0b2, 0xb09c, 0xb0ae, 0xb098, 0xb0a2, 0xb094, 0xb09e, - 0xb6aa, 0xb7a6, 0xb090, 0xb09a, 0xb08c, 0xb096, 0xb088, 0xb08a, - 0xb084, 0xb086, 0xb692, 0xb78e, 0xb080, 0xb082, 0xb07c, 0xb07e, - 0xb078, 0xb072, 0xb074, 0xb06e, 0xb67a, 0xb776, 0xb004, 0x9055, - 0x1958, 0x006e, 0x007e, 0x0005, 0x2009, 0x1834, 0x210c, 0x81ff, - 0x1178, 0x080c, 0x61c2, 0x1108, 0x0005, 0x080c, 0x710b, 0x0126, - 0x2091, 0x8000, 0x080c, 0xd3ce, 0x080c, 0x6e9f, 0x012e, 0x0ca0, - 0x080c, 0xd7dc, 0x1d70, 0x2001, 0x0028, 0x900e, 0x0c70, 0x2009, - 0x1834, 0x210c, 0x81ff, 0x1188, 0xa888, 0x9005, 0x0188, 0xa883, - 0x0000, 0x080c, 0x6252, 0x1108, 0x0005, 0xa87a, 0x0126, 0x2091, - 0x8000, 0x080c, 0x6e9f, 0x012e, 0x0cb8, 0x2001, 0x0028, 0x0ca8, - 0x2001, 0x0000, 0x0c90, 0x0419, 0x11d8, 0xa888, 0x9005, 0x01e0, - 0xa883, 0x0000, 0xa87c, 0xd0f4, 0x0120, 0x080c, 0x6327, 0x1138, - 0x0005, 0x9006, 0xa87a, 0x080c, 0x629f, 0x1108, 0x0005, 0x0126, - 0x2091, 0x8000, 0xa87a, 0xa982, 0x080c, 0x6e9f, 0x012e, 0x0cb0, - 0x2001, 0x0028, 0x900e, 0x0c98, 0x2001, 0x0000, 0x0c80, 0x00c6, - 0x2061, 0x1800, 0x60d0, 0x9005, 0x0100, 0x00ce, 0x0005, 0x7018, - 0xa802, 0x2908, 0x2048, 0xa906, 0x711a, 0x7010, 0x8001, 0x7012, - 0x0118, 0x7007, 0x0003, 0x0030, 0x7014, 0x2048, 0x7007, 0x0001, - 0x7048, 0x080f, 0x0005, 0x00b6, 0x7007, 0x0001, 0xa974, 0xa878, - 0x9084, 0x00ff, 0x9096, 0x0004, 0x0540, 0x20a9, 0x0001, 0x9096, - 0x0001, 0x0190, 0x900e, 0x20a9, 0x0800, 0x9096, 0x0002, 0x0160, - 0x9005, 0x11d8, 0xa974, 0x080c, 0x6724, 0x11b8, 0x0066, 0xae80, - 0x080c, 0x6834, 0x006e, 0x0088, 0x0046, 0x2011, 0x180c, 0x2224, - 0xc484, 0x2412, 0x004e, 0x00c6, 0x080c, 0x6724, 0x1110, 0x080c, - 0x6934, 0x8108, 0x1f04, 0x7d04, 0x00ce, 0xa87c, 0xd084, 0x1120, - 0x080c, 0x1040, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, - 0x6e9f, 0x012e, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, 0x7007, - 0x0001, 0x080c, 0x6a9f, 0x0580, 0x2061, 0x1a74, 0x6100, 0xd184, - 0x0178, 0xa888, 0x9084, 0x00ff, 0x1550, 0x6000, 0xd084, 0x0520, - 0x6004, 0x9005, 0x1538, 0x6003, 0x0000, 0x600b, 0x0000, 0x00c8, - 0x2011, 0x0001, 0xa890, 0x9005, 0x1110, 0x2001, 0x001e, 0x8000, - 0x6016, 0xa888, 0x9084, 0x00ff, 0x0178, 0x6006, 0xa888, 0x8007, - 0x9084, 0x00ff, 0x0148, 0x600a, 0xa888, 0x8000, 0x1108, 0xc28d, - 0x6202, 0x012e, 0x0804, 0x7f5e, 0x012e, 0x0804, 0x7f58, 0x012e, - 0x0804, 0x7f52, 0x012e, 0x0804, 0x7f55, 0x0126, 0x2091, 0x8000, - 0x7007, 0x0001, 0x080c, 0x6a9f, 0x05e0, 0x2061, 0x1a74, 0x6000, - 0xd084, 0x05b8, 0x6204, 0x6308, 0xd08c, 0x1530, 0xac78, 0x9484, - 0x0003, 0x0170, 0xa988, 0x918c, 0x00ff, 0x8001, 0x1120, 0x2100, - 0x9210, 0x0620, 0x0028, 0x8001, 0x1508, 0x2100, 0x9212, 0x02f0, - 0x9484, 0x000c, 0x0188, 0xa988, 0x810f, 0x918c, 0x00ff, 0x9082, - 0x0004, 0x1120, 0x2100, 0x9318, 0x0288, 0x0030, 0x9082, 0x0004, - 0x1168, 0x2100, 0x931a, 0x0250, 0xa890, 0x9005, 0x0110, 0x8000, - 0x6016, 0x6206, 0x630a, 0x012e, 0x0804, 0x7f5e, 0x012e, 0x0804, - 0x7f5b, 0x012e, 0x0804, 0x7f58, 0x0126, 0x2091, 0x8000, 0x7007, - 0x0001, 0x2061, 0x1a74, 0x6300, 0xd38c, 0x1120, 0x6308, 0x8318, - 0x0220, 0x630a, 0x012e, 0x0804, 0x7f6c, 0x012e, 0x0804, 0x7f5b, - 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, 0x7007, 0x0001, 0xa87c, - 0xd0ac, 0x0148, 0x00c6, 0x2061, 0x1a74, 0x6000, 0x9084, 0xfcff, - 0x6002, 0x00ce, 0x0440, 0xa888, 0x9005, 0x05d8, 0xa88c, 0x9065, - 0x0598, 0x2001, 0x1834, 0x2004, 0x9005, 0x0118, 0x080c, 0xb306, - 0x0068, 0x6017, 0xf400, 0x605b, 0x0000, 0xa97c, 0xd1a4, 0x0110, - 0xa980, 0x615a, 0x2009, 0x0041, 0x080c, 0xb352, 0xa988, 0x918c, - 0xff00, 0x9186, 0x2000, 0x1138, 0x0026, 0x900e, 0x2011, 0xfdff, - 0x080c, 0x8a50, 0x002e, 0xa87c, 0xd0c4, 0x0148, 0x2061, 0x1a74, - 0x6000, 0xd08c, 0x1120, 0x6008, 0x8000, 0x0208, 0x600a, 0x00ce, - 0x012e, 0x00be, 0x0804, 0x7f5e, 0x00ce, 0x012e, 0x00be, 0x0804, - 0x7f58, 0xa984, 0x9186, 0x002e, 0x0d30, 0x9186, 0x002d, 0x0d18, - 0x9186, 0x0045, 0x0510, 0x9186, 0x002a, 0x1130, 0x2001, 0x180c, - 0x200c, 0xc194, 0x2102, 0x08b8, 0x9186, 0x0020, 0x0158, 0x9186, - 0x0029, 0x1d10, 0xa974, 0x080c, 0x6724, 0x1968, 0xb800, 0xc0e4, - 0xb802, 0x0848, 0xa88c, 0x9065, 0x09b8, 0x6007, 0x0024, 0x2001, - 0x1986, 0x2004, 0x601a, 0x0804, 0x7df3, 0xa88c, 0x9065, 0x0960, - 0x00e6, 0xa890, 0x9075, 0x2001, 0x1834, 0x2004, 0x9005, 0x0150, - 0x080c, 0xb306, 0x8eff, 0x0118, 0x2e60, 0x080c, 0xb306, 0x00ee, - 0x0804, 0x7df3, 0x6024, 0xc0dc, 0xc0d5, 0x6026, 0x2e60, 0x6007, - 0x003a, 0xa8a0, 0x9005, 0x0130, 0x6007, 0x003b, 0xa8a4, 0x602e, - 0xa8a8, 0x6016, 0x6003, 0x0001, 0x080c, 0x94ff, 0x080c, 0x9ab1, - 0x00ee, 0x0804, 0x7df3, 0x2061, 0x1a74, 0x6000, 0xd084, 0x0190, - 0xd08c, 0x1904, 0x7f6c, 0x0126, 0x2091, 0x8000, 0x6204, 0x8210, - 0x0220, 0x6206, 0x012e, 0x0804, 0x7f6c, 0x012e, 0xa883, 0x0016, - 0x0804, 0x7f65, 0xa883, 0x0007, 0x0804, 0x7f65, 0xa864, 0x8007, - 0x9084, 0x00ff, 0x0130, 0x8001, 0x1138, 0x7007, 0x0001, 0x0069, - 0x0005, 0x080c, 0x7a99, 0x0040, 0x7007, 0x0003, 0x7012, 0x2900, - 0x7016, 0x701a, 0x704b, 0x7e95, 0x0005, 0x00b6, 0x00e6, 0x0126, - 0x2091, 0x8000, 0x903e, 0x2061, 0x1800, 0x61d0, 0x81ff, 0x1904, - 0x7f17, 0x6130, 0xd194, 0x1904, 0x7f41, 0xa878, 0x2070, 0x9e82, - 0x1cd0, 0x0a04, 0x7f0b, 0x6068, 0x9e02, 0x1a04, 0x7f0b, 0x7120, - 0x9186, 0x0006, 0x1904, 0x7efd, 0x7010, 0x905d, 0x0904, 0x7f17, - 0xb800, 0xd0e4, 0x1904, 0x7f3b, 0x2061, 0x1a74, 0x6100, 0x9184, - 0x0301, 0x9086, 0x0001, 0x15a0, 0x7024, 0xd0dc, 0x1904, 0x7f44, - 0xa883, 0x0000, 0xa803, 0x0000, 0x2908, 0x7014, 0x9005, 0x1198, - 0x7116, 0xa87c, 0xd0f4, 0x1904, 0x7f47, 0x080c, 0x57d5, 0xd09c, - 0x1118, 0xa87c, 0xc0cc, 0xa87e, 0x2e60, 0x080c, 0x8970, 0x012e, - 0x00ee, 0x00be, 0x0005, 0x2048, 0xa800, 0x9005, 0x1de0, 0xa902, - 0x2148, 0xa87c, 0xd0f4, 0x1904, 0x7f47, 0x012e, 0x00ee, 0x00be, - 0x0005, 0x012e, 0x00ee, 0xa883, 0x0006, 0x00be, 0x0804, 0x7f65, - 0xd184, 0x0db8, 0xd1c4, 0x1190, 0x00a0, 0xa974, 0x080c, 0x6724, - 0x15d0, 0xb800, 0xd0e4, 0x15b8, 0x7120, 0x9186, 0x0007, 0x1118, - 0xa883, 0x0002, 0x0490, 0xa883, 0x0008, 0x0478, 0xa883, 0x000e, - 0x0460, 0xa883, 0x0017, 0x0448, 0xa883, 0x0035, 0x0430, 0x080c, - 0x57d9, 0xd0fc, 0x01e8, 0xa878, 0x2070, 0x9e82, 0x1cd0, 0x02c0, - 0x6068, 0x9e02, 0x12a8, 0x7120, 0x9186, 0x0006, 0x1188, 0x7010, - 0x905d, 0x0170, 0xb800, 0xd0bc, 0x0158, 0x2039, 0x0001, 0x7000, - 0x9086, 0x0007, 0x1904, 0x7ea1, 0x7003, 0x0002, 0x0804, 0x7ea1, - 0xa883, 0x0028, 0x0010, 0xa883, 0x0029, 0x012e, 0x00ee, 0x00be, - 0x0420, 0xa883, 0x002a, 0x0cc8, 0xa883, 0x0045, 0x0cb0, 0x2e60, - 0x2019, 0x0002, 0x601b, 0x0014, 0x080c, 0xe754, 0x012e, 0x00ee, - 0x00be, 0x0005, 0x2009, 0x003e, 0x0058, 0x2009, 0x0004, 0x0040, - 0x2009, 0x0006, 0x0028, 0x2009, 0x0016, 0x0010, 0x2009, 0x0001, - 0xa884, 0x9084, 0xff00, 0x9105, 0xa886, 0x0126, 0x2091, 0x8000, - 0x080c, 0x6e9f, 0x012e, 0x0005, 0x080c, 0x1040, 0x0005, 0x00d6, - 0x080c, 0x8967, 0x00de, 0x0005, 0x00d6, 0x00e6, 0x0126, 0x2091, - 0x8000, 0x2071, 0x0040, 0x702c, 0xd084, 0x01d8, 0x908c, 0x0780, - 0x190c, 0x8056, 0xd09c, 0x11a8, 0x2071, 0x1800, 0x70c0, 0x90ea, - 0x0020, 0x0278, 0x8001, 0x70c2, 0x702c, 0x2048, 0xa800, 0x702e, - 0x9006, 0xa802, 0xa806, 0x2071, 0x0040, 0x2900, 0x7022, 0x702c, - 0x0c28, 0x012e, 0x00ee, 0x00de, 0x0005, 0x0006, 0x9084, 0x0780, - 0x190c, 0x8056, 0x000e, 0x0005, 0xa898, 0x9084, 0x0003, 0x05a8, - 0x080c, 0xb27d, 0x05d8, 0x2900, 0x6016, 0xa864, 0x9084, 0x00ff, - 0x9086, 0x0035, 0x1138, 0x6008, 0xc0fd, 0x600a, 0x2001, 0x196b, - 0x2004, 0x0098, 0xa8a0, 0x9084, 0x00ff, 0xa99c, 0x918c, 0xff00, - 0x9105, 0xa99c, 0x918c, 0x00ff, 0x080c, 0x2873, 0x1540, 0x00b6, - 0x080c, 0x6724, 0x2b00, 0x00be, 0x1510, 0x6012, 0x6023, 0x0001, - 0x2009, 0x0040, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0035, 0x0110, - 0x2009, 0x0041, 0x080c, 0xb352, 0x0005, 0xa87b, 0x0101, 0x0126, - 0x2091, 0x8000, 0x080c, 0x6e9f, 0x012e, 0x0005, 0xa87b, 0x002c, - 0x0126, 0x2091, 0x8000, 0x080c, 0x6e9f, 0x012e, 0x0005, 0xa87b, - 0x0028, 0x0126, 0x2091, 0x8000, 0x080c, 0x6e9f, 0x012e, 0x080c, - 0xb2d3, 0x0005, 0x00d6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x00b6, - 0x7007, 0x0001, 0xaa74, 0x9282, 0x0004, 0x1a04, 0x8047, 0xa97c, - 0x9188, 0x1000, 0x2104, 0x905d, 0xb804, 0xd284, 0x0140, 0x05e8, - 0x8007, 0x9084, 0x00ff, 0x9084, 0x0006, 0x1108, 0x04b0, 0x2b10, - 0x080c, 0xb27d, 0x1118, 0x080c, 0xb325, 0x05a8, 0x6212, 0xa874, - 0x0002, 0x8025, 0x802a, 0x802d, 0x8033, 0x2019, 0x0002, 0x080c, - 0xeba1, 0x0060, 0x080c, 0xeb38, 0x0048, 0x2019, 0x0002, 0xa980, - 0x080c, 0xeb53, 0x0018, 0xa980, 0x080c, 0xeb38, 0x080c, 0xb2d3, - 0xa887, 0x0000, 0x0126, 0x2091, 0x8000, 0x080c, 0x6e9f, 0x012e, - 0x00be, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00de, 0x0005, 0xa887, - 0x0006, 0x0c80, 0xa887, 0x0002, 0x0c68, 0xa887, 0x0005, 0x0c50, - 0xa887, 0x0004, 0x0c38, 0xa887, 0x0007, 0x0c20, 0x2091, 0x8000, - 0x0e04, 0x8058, 0x0006, 0x0016, 0x2001, 0x8003, 0x0006, 0x0804, - 0x0dce, 0x2001, 0x1834, 0x2004, 0x9005, 0x0005, 0x0005, 0x00f6, - 0x2079, 0x0300, 0x2001, 0x0200, 0x200c, 0xc1e5, 0xc1dc, 0x2102, - 0x2009, 0x0218, 0x210c, 0xd1ec, 0x1120, 0x080c, 0x15a0, 0x00fe, - 0x0005, 0x2001, 0x020d, 0x2003, 0x0020, 0x781f, 0x0300, 0x00fe, - 0x0005, 0x781c, 0xd08c, 0x0904, 0x80d8, 0x68c0, 0x90aa, 0x0005, - 0x0a04, 0x871c, 0x7d44, 0x7c40, 0x9584, 0x00f6, 0x1510, 0x9484, - 0x7000, 0x0140, 0x908a, 0x2000, 0x1260, 0x9584, 0x0700, 0x8007, - 0x0804, 0x80df, 0x7000, 0x9084, 0xff00, 0x9086, 0x8100, 0x0da8, - 0x00b0, 0x9484, 0x0fff, 0x1130, 0x7000, 0x9084, 0xff00, 0x9086, - 0x8100, 0x11c0, 0x080c, 0xf057, 0x080c, 0x8601, 0x7817, 0x0140, - 0x00a8, 0x9584, 0x0076, 0x1118, 0x080c, 0x865f, 0x19c0, 0xd5a4, - 0x0148, 0x0046, 0x0056, 0x080c, 0x813a, 0x080c, 0x236e, 0x005e, - 0x004e, 0x0020, 0x080c, 0xf057, 0x7817, 0x0140, 0x080c, 0x7637, - 0x0168, 0x2001, 0x0111, 0x2004, 0xd08c, 0x0140, 0x6893, 0x0000, - 0x2001, 0x0110, 0x2003, 0x0008, 0x2003, 0x0000, 0x080c, 0x811b, - 0x2001, 0x19f1, 0x2004, 0x9005, 0x090c, 0x9ab1, 0x0005, 0x0002, - 0x80f1, 0x8409, 0x80e8, 0x80e8, 0x80e8, 0x80e8, 0x80e8, 0x80e8, - 0x7817, 0x0140, 0x2001, 0x19f1, 0x2004, 0x9005, 0x090c, 0x9ab1, - 0x0005, 0x7000, 0x908c, 0xff00, 0x9194, 0xf000, 0x810f, 0x9484, - 0x0fff, 0x6892, 0x9286, 0x2000, 0x1150, 0x6800, 0x9086, 0x0001, - 0x1118, 0x080c, 0x583f, 0x0070, 0x080c, 0x815a, 0x0058, 0x9286, - 0x3000, 0x1118, 0x080c, 0x8341, 0x0028, 0x9286, 0x8000, 0x1110, - 0x080c, 0x8528, 0x7817, 0x0140, 0x2001, 0x19f1, 0x2004, 0x9005, - 0x090c, 0x9ab1, 0x0005, 0x2001, 0x1810, 0x2004, 0xd08c, 0x0178, - 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x1148, 0x0026, 0x0036, - 0x2011, 0x8048, 0x2518, 0x080c, 0x4c44, 0x003e, 0x002e, 0x0005, - 0x0036, 0x0046, 0x0056, 0x00f6, 0x2079, 0x0200, 0x2019, 0xfffe, - 0x7c30, 0x0050, 0x0036, 0x0046, 0x0056, 0x00f6, 0x2079, 0x0200, - 0x7d44, 0x7c40, 0x2019, 0xffff, 0x2001, 0x1810, 0x2004, 0xd08c, - 0x0160, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x1130, 0x0026, - 0x2011, 0x8048, 0x080c, 0x4c44, 0x002e, 0x00fe, 0x005e, 0x004e, - 0x003e, 0x0005, 0x00b6, 0x00c6, 0x7010, 0x9084, 0xff00, 0x8007, - 0x9096, 0x0001, 0x0120, 0x9096, 0x0023, 0x1904, 0x8312, 0x9186, - 0x0023, 0x15c0, 0x080c, 0x85c6, 0x0904, 0x8312, 0x6120, 0x9186, - 0x0001, 0x0150, 0x9186, 0x0004, 0x0138, 0x9186, 0x0008, 0x0120, - 0x9186, 0x000a, 0x1904, 0x8312, 0x7124, 0x610a, 0x7030, 0x908e, - 0x0200, 0x1130, 0x2009, 0x0015, 0x080c, 0xb352, 0x0804, 0x8312, - 0x908e, 0x0214, 0x0118, 0x908e, 0x0210, 0x1130, 0x2009, 0x0015, - 0x080c, 0xb352, 0x0804, 0x8312, 0x908e, 0x0100, 0x1904, 0x8312, - 0x7034, 0x9005, 0x1904, 0x8312, 0x2009, 0x0016, 0x080c, 0xb352, - 0x0804, 0x8312, 0x9186, 0x0022, 0x1904, 0x8312, 0x7030, 0x908e, - 0x0300, 0x1580, 0x68dc, 0xd0a4, 0x0528, 0xc0b5, 0x68de, 0x7100, - 0x918c, 0x00ff, 0x697e, 0x7004, 0x6882, 0x00f6, 0x2079, 0x0100, - 0x79e6, 0x78ea, 0x0006, 0x9084, 0x00ff, 0x0016, 0x2008, 0x080c, - 0x28bc, 0x7932, 0x7936, 0x001e, 0x000e, 0x00fe, 0x080c, 0x2873, - 0x695e, 0x703c, 0x00e6, 0x2071, 0x0140, 0x7086, 0x2071, 0x1800, - 0x70b6, 0x00ee, 0x7034, 0x9005, 0x1904, 0x8312, 0x2009, 0x0017, - 0x0804, 0x82c2, 0x908e, 0x0400, 0x1190, 0x7034, 0x9005, 0x1904, - 0x8312, 0x080c, 0x7637, 0x0120, 0x2009, 0x001d, 0x0804, 0x82c2, - 0x68dc, 0xc0a5, 0x68de, 0x2009, 0x0030, 0x0804, 0x82c2, 0x908e, - 0x0500, 0x1140, 0x7034, 0x9005, 0x1904, 0x8312, 0x2009, 0x0018, - 0x0804, 0x82c2, 0x908e, 0x2010, 0x1120, 0x2009, 0x0019, 0x0804, - 0x82c2, 0x908e, 0x2110, 0x1120, 0x2009, 0x001a, 0x0804, 0x82c2, - 0x908e, 0x5200, 0x1140, 0x7034, 0x9005, 0x1904, 0x8312, 0x2009, - 0x001b, 0x0804, 0x82c2, 0x908e, 0x5000, 0x1140, 0x7034, 0x9005, - 0x1904, 0x8312, 0x2009, 0x001c, 0x0804, 0x82c2, 0x908e, 0x1300, - 0x1120, 0x2009, 0x0034, 0x0804, 0x82c2, 0x908e, 0x1200, 0x1140, - 0x7034, 0x9005, 0x1904, 0x8312, 0x2009, 0x0024, 0x0804, 0x82c2, - 0x908c, 0xff00, 0x918e, 0x2400, 0x1170, 0x2009, 0x002d, 0x2001, - 0x1810, 0x2004, 0xd09c, 0x0904, 0x82c2, 0x080c, 0xdf1a, 0x1904, - 0x8312, 0x0804, 0x82c0, 0x908c, 0xff00, 0x918e, 0x5300, 0x1120, - 0x2009, 0x002a, 0x0804, 0x82c2, 0x908e, 0x0f00, 0x1120, 0x2009, - 0x0020, 0x0804, 0x82c2, 0x908e, 0x6104, 0x1530, 0x2029, 0x0205, - 0x2011, 0x026d, 0x8208, 0x2204, 0x9082, 0x0004, 0x8004, 0x8004, - 0x20a8, 0x2011, 0x8015, 0x211c, 0x8108, 0x0046, 0x2124, 0x080c, - 0x4c44, 0x004e, 0x8108, 0x0f04, 0x8276, 0x9186, 0x0280, 0x1d88, - 0x2504, 0x8000, 0x202a, 0x2009, 0x0260, 0x0c58, 0x202b, 0x0000, - 0x2009, 0x0023, 0x0804, 0x82c2, 0x908e, 0x6000, 0x1120, 0x2009, - 0x003f, 0x0804, 0x82c2, 0x908e, 0x5400, 0x1138, 0x080c, 0x86cc, - 0x1904, 0x8312, 0x2009, 0x0046, 0x04a8, 0x908e, 0x5500, 0x1148, - 0x080c, 0x86f4, 0x1118, 0x2009, 0x0041, 0x0460, 0x2009, 0x0042, - 0x0448, 0x908e, 0x7800, 0x1118, 0x2009, 0x0045, 0x0418, 0x908e, - 0x1000, 0x1118, 0x2009, 0x004e, 0x00e8, 0x908e, 0x6300, 0x1118, - 0x2009, 0x004a, 0x00b8, 0x908c, 0xff00, 0x918e, 0x5600, 0x1118, - 0x2009, 0x004f, 0x0078, 0x908c, 0xff00, 0x918e, 0x5700, 0x1118, - 0x2009, 0x0050, 0x0038, 0x2009, 0x001d, 0x6838, 0xd0d4, 0x0110, - 0x2009, 0x004c, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, - 0x080c, 0x2873, 0x1904, 0x8315, 0x080c, 0x66b9, 0x1904, 0x8315, - 0xbe12, 0xbd16, 0x001e, 0x0016, 0x080c, 0x7637, 0x01c0, 0x68dc, - 0xd08c, 0x1148, 0x7000, 0x9084, 0x00ff, 0x1188, 0x7004, 0x9084, - 0xff00, 0x1168, 0x0040, 0x687c, 0x9606, 0x1148, 0x6880, 0x9506, - 0x9084, 0xff00, 0x1120, 0x9584, 0x00ff, 0xb8c2, 0x0080, 0xb8c0, - 0x9005, 0x1168, 0x9186, 0x0046, 0x1150, 0x687c, 0x9606, 0x1138, - 0x6880, 0x9506, 0x9084, 0xff00, 0x1110, 0x001e, 0x0098, 0x080c, - 0xb27d, 0x01a8, 0x2b08, 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, - 0x001e, 0x9186, 0x004c, 0x1110, 0x6023, 0x000a, 0x0016, 0x001e, - 0x080c, 0xb352, 0x00ce, 0x00be, 0x0005, 0x001e, 0x0cd8, 0x2001, - 0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x4c44, - 0x080c, 0xb325, 0x0d90, 0x2b08, 0x6112, 0x6023, 0x0004, 0x7120, - 0x610a, 0x001e, 0x0016, 0x9186, 0x0017, 0x0118, 0x9186, 0x0030, - 0x1128, 0x6007, 0x0009, 0x6017, 0x2900, 0x0020, 0x6007, 0x0051, - 0x6017, 0x0000, 0x602f, 0x0009, 0x6003, 0x0001, 0x080c, 0x9547, - 0x08a0, 0x080c, 0x873b, 0x1158, 0x080c, 0x3374, 0x1140, 0x7010, - 0x9084, 0xff00, 0x8007, 0x908e, 0x0008, 0x1108, 0x0009, 0x0005, - 0x00b6, 0x00c6, 0x0046, 0x7000, 0x908c, 0xff00, 0x810f, 0x9186, - 0x0033, 0x11e8, 0x080c, 0x85c6, 0x0904, 0x83a1, 0x7124, 0x610a, - 0x7030, 0x908e, 0x0200, 0x1140, 0x7034, 0x9005, 0x15d0, 0x2009, - 0x0015, 0x080c, 0xb352, 0x04a8, 0x908e, 0x0100, 0x1590, 0x7034, - 0x9005, 0x1578, 0x2009, 0x0016, 0x080c, 0xb352, 0x0450, 0x9186, - 0x0032, 0x1538, 0x7030, 0x908e, 0x1400, 0x1518, 0x2009, 0x0038, - 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x2873, - 0x11b8, 0x080c, 0x66b9, 0x11a0, 0xbe12, 0xbd16, 0x080c, 0xb27d, - 0x0178, 0x2b08, 0x6112, 0x080c, 0xd554, 0x6023, 0x0004, 0x7120, - 0x610a, 0x001e, 0x080c, 0xb352, 0x080c, 0x9ab1, 0x0010, 0x00ce, - 0x001e, 0x004e, 0x00ce, 0x00be, 0x0005, 0x00b6, 0x0046, 0x00e6, - 0x00d6, 0x2028, 0x2130, 0x9696, 0x00ff, 0x11b8, 0x9592, 0xfffc, - 0x02a0, 0x9596, 0xfffd, 0x1120, 0x2009, 0x007f, 0x0804, 0x8403, - 0x9596, 0xfffe, 0x1120, 0x2009, 0x007e, 0x0804, 0x8403, 0x9596, - 0xfffc, 0x1118, 0x2009, 0x0080, 0x04f0, 0x2011, 0x0000, 0x2019, - 0x1837, 0x231c, 0xd3ac, 0x0130, 0x9026, 0x20a9, 0x0800, 0x2071, - 0x1000, 0x0030, 0x2021, 0x0081, 0x20a9, 0x077f, 0x2071, 0x1081, - 0x2e1c, 0x93dd, 0x0000, 0x1140, 0x82ff, 0x11d0, 0x9496, 0x00ff, - 0x01b8, 0x2410, 0xc2fd, 0x00a0, 0xbf10, 0x2600, 0x9706, 0xb814, - 0x1120, 0x9546, 0x1110, 0x2408, 0x00b0, 0x9745, 0x1148, 0x94c6, - 0x007e, 0x0130, 0x94c6, 0x007f, 0x0118, 0x94c6, 0x0080, 0x1d20, - 0x8420, 0x8e70, 0x1f04, 0x83d8, 0x82ff, 0x1118, 0x9085, 0x0001, - 0x0018, 0xc2fc, 0x2208, 0x9006, 0x00de, 0x00ee, 0x004e, 0x00be, - 0x0005, 0x2001, 0x1837, 0x200c, 0x9184, 0x0080, 0x0110, 0xd18c, - 0x0138, 0x7000, 0x908c, 0xff00, 0x810f, 0x9184, 0x000f, 0x004a, - 0x7817, 0x0140, 0x2001, 0x19f1, 0x2004, 0x9005, 0x090c, 0x9ab1, - 0x0005, 0x8431, 0x8431, 0x8431, 0x85d8, 0x8431, 0x843a, 0x8465, - 0x84f3, 0x8431, 0x8431, 0x8431, 0x8431, 0x8431, 0x8431, 0x8431, - 0x8431, 0x7817, 0x0140, 0x2001, 0x19f1, 0x2004, 0x9005, 0x090c, - 0x9ab1, 0x0005, 0x00b6, 0x7110, 0xd1bc, 0x01e8, 0x7120, 0x2160, - 0x9c8c, 0x0007, 0x11c0, 0x9c8a, 0x1cd0, 0x02a8, 0x6868, 0x9c02, - 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, - 0x1150, 0x700c, 0xb914, 0x9106, 0x1130, 0x7124, 0x610a, 0x2009, - 0x0046, 0x080c, 0xb352, 0x7817, 0x0140, 0x2001, 0x19f1, 0x2004, - 0x9005, 0x090c, 0x9ab1, 0x00be, 0x0005, 0x00b6, 0x00c6, 0x9484, - 0x0fff, 0x0904, 0x84c9, 0x7110, 0xd1bc, 0x1904, 0x84c9, 0x7108, - 0x700c, 0x2028, 0x918c, 0x00ff, 0x2130, 0x9094, 0xff00, 0x15b0, - 0x81ff, 0x15a0, 0x9080, 0x33b6, 0x200d, 0x918c, 0xff00, 0x810f, - 0x2001, 0x0080, 0x9106, 0x0904, 0x84c9, 0x080c, 0x66b9, 0x1904, - 0x84c9, 0xbe12, 0xbd16, 0xb800, 0xd0ec, 0x15d8, 0xba04, 0x9294, - 0xff00, 0x9286, 0x0600, 0x11a0, 0x080c, 0xb27d, 0x05e8, 0x2b08, - 0x7028, 0x6046, 0x702c, 0x604a, 0x6112, 0x6023, 0x0006, 0x7120, - 0x610a, 0x7130, 0x6156, 0x2009, 0x0044, 0x080c, 0xe192, 0x0408, - 0x080c, 0x6aa3, 0x1138, 0xb807, 0x0606, 0x0c30, 0x190c, 0x83a5, - 0x11c0, 0x0898, 0x080c, 0xb27d, 0x2b08, 0x0198, 0x6112, 0x6023, - 0x0004, 0x7120, 0x610a, 0x9286, 0x0400, 0x1118, 0x6007, 0x0005, - 0x0010, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x9547, 0x080c, - 0x9ab1, 0x7817, 0x0140, 0x2001, 0x19f1, 0x2004, 0x9005, 0x090c, - 0x9ab1, 0x00ce, 0x00be, 0x0005, 0x2001, 0x180e, 0x2004, 0xd0ec, - 0x0120, 0x2011, 0x8049, 0x080c, 0x4c44, 0x080c, 0xb325, 0x0d48, - 0x2b08, 0x6112, 0x6023, 0x0006, 0x7120, 0x610a, 0x7130, 0x6156, - 0x6017, 0xf300, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x94ff, - 0x080c, 0x9ab1, 0x08b0, 0x00b6, 0x7110, 0xd1bc, 0x01e8, 0x7020, - 0x2060, 0x9c84, 0x0007, 0x11c0, 0x9c82, 0x1cd0, 0x02a8, 0x6868, - 0x9c02, 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, - 0x9106, 0x1150, 0x700c, 0xb914, 0x9106, 0x1130, 0x7124, 0x610a, - 0x2009, 0x0045, 0x080c, 0xb352, 0x7817, 0x0140, 0x2001, 0x19f1, - 0x2004, 0x9005, 0x090c, 0x9ab1, 0x00be, 0x0005, 0x6120, 0x9186, - 0x0002, 0x0128, 0x9186, 0x0005, 0x0110, 0x9085, 0x0001, 0x0005, - 0x080c, 0x873b, 0x1180, 0x080c, 0x3374, 0x1168, 0x7010, 0x9084, - 0xff00, 0x8007, 0x9086, 0x0000, 0x1130, 0x9184, 0x000f, 0x908a, - 0x0006, 0x1208, 0x000b, 0x0005, 0x8542, 0x8543, 0x8542, 0x8542, - 0x85a8, 0x85b7, 0x0005, 0x00b6, 0x700c, 0x7108, 0x080c, 0x2873, - 0x1904, 0x85a6, 0x080c, 0x66b9, 0x1904, 0x85a6, 0xbe12, 0xbd16, - 0x7110, 0xd1bc, 0x0540, 0x702c, 0xd084, 0x1120, 0xb800, 0xd0bc, - 0x1904, 0x85a6, 0x080c, 0x6aa3, 0x0148, 0x9086, 0x0004, 0x0130, - 0x080c, 0x6aab, 0x0118, 0x9086, 0x0004, 0x1588, 0x00c6, 0x080c, - 0x85c6, 0x00ce, 0x05d8, 0x080c, 0xb27d, 0x2b08, 0x05b8, 0x6112, - 0x080c, 0xd554, 0x6023, 0x0002, 0x7120, 0x610a, 0x2009, 0x0088, - 0x080c, 0xb352, 0x0458, 0x080c, 0x6aa3, 0x0148, 0x9086, 0x0004, - 0x0130, 0x080c, 0x6aab, 0x0118, 0x9086, 0x0004, 0x1180, 0x080c, - 0xb27d, 0x2b08, 0x01d8, 0x6112, 0x080c, 0xd554, 0x6023, 0x0005, - 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, 0xb352, 0x0078, 0x080c, - 0xb27d, 0x2b08, 0x0158, 0x6112, 0x080c, 0xd554, 0x6023, 0x0004, - 0x7120, 0x610a, 0x2009, 0x0001, 0x080c, 0xb352, 0x00be, 0x0005, - 0x7110, 0xd1bc, 0x0158, 0x00d1, 0x0148, 0x080c, 0x851e, 0x1130, - 0x7124, 0x610a, 0x2009, 0x0089, 0x080c, 0xb352, 0x0005, 0x7110, - 0xd1bc, 0x0158, 0x0059, 0x0148, 0x080c, 0x851e, 0x1130, 0x7124, - 0x610a, 0x2009, 0x008a, 0x080c, 0xb352, 0x0005, 0x7020, 0x2060, - 0x9c84, 0x0007, 0x1158, 0x9c82, 0x1cd0, 0x0240, 0x2001, 0x181a, - 0x2004, 0x9c02, 0x1218, 0x9085, 0x0001, 0x0005, 0x9006, 0x0ce8, - 0x00b6, 0x7110, 0xd1bc, 0x11d8, 0x7024, 0x2060, 0x9c84, 0x0007, - 0x11b0, 0x9c82, 0x1cd0, 0x0298, 0x6868, 0x9c02, 0x1280, 0x7008, - 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, 0x1140, 0x700c, - 0xb914, 0x9106, 0x1120, 0x2009, 0x0051, 0x080c, 0xb352, 0x7817, - 0x0140, 0x2001, 0x19f1, 0x2004, 0x9005, 0x090c, 0x9ab1, 0x00be, - 0x0005, 0x2031, 0x0105, 0x0069, 0x0005, 0x2031, 0x0206, 0x0049, - 0x0005, 0x2031, 0x0207, 0x0029, 0x0005, 0x2031, 0x0213, 0x0009, - 0x0005, 0x00c6, 0x0096, 0x00f6, 0x7000, 0x9084, 0xf000, 0x9086, - 0xc000, 0x05d0, 0x080c, 0xb27d, 0x05b8, 0x0066, 0x00c6, 0x0046, - 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x2873, 0x15a0, - 0x080c, 0x66b9, 0x1588, 0xbe12, 0xbd16, 0x2b00, 0x004e, 0x00ce, - 0x6012, 0x080c, 0xd554, 0x080c, 0x100e, 0x0510, 0x2900, 0x605a, - 0x9006, 0xa802, 0xa866, 0xac6a, 0xa85c, 0x90f8, 0x001b, 0x20a9, - 0x000e, 0xa860, 0x20e8, 0x20e1, 0x0000, 0x2fa0, 0x2e98, 0x4003, - 0x006e, 0x6616, 0x6007, 0x003e, 0x6023, 0x0001, 0x6003, 0x0001, - 0x080c, 0x9547, 0x080c, 0x9ab1, 0x00fe, 0x009e, 0x00ce, 0x0005, - 0x080c, 0xb2d3, 0x006e, 0x0cc0, 0x004e, 0x00ce, 0x0cc8, 0x00c6, - 0x7000, 0x908c, 0xff00, 0x9184, 0xf000, 0x810f, 0x9086, 0x2000, - 0x1904, 0x86b6, 0x9186, 0x0022, 0x15f0, 0x2001, 0x0111, 0x2004, - 0x9005, 0x1904, 0x86b8, 0x7030, 0x908e, 0x0400, 0x0904, 0x86b8, - 0x908e, 0x6000, 0x05e8, 0x908e, 0x5400, 0x05d0, 0x908e, 0x0300, - 0x11d8, 0x2009, 0x1837, 0x210c, 0xd18c, 0x1590, 0xd1a4, 0x1580, - 0x080c, 0x6a61, 0x0588, 0x68b0, 0x9084, 0x00ff, 0x7100, 0x918c, - 0x00ff, 0x9106, 0x1518, 0x6880, 0x69b0, 0x918c, 0xff00, 0x9105, - 0x7104, 0x9106, 0x11d8, 0x00e0, 0x2009, 0x0103, 0x210c, 0xd1b4, - 0x11a8, 0x908e, 0x5200, 0x09e8, 0x908e, 0x0500, 0x09d0, 0x908e, - 0x5000, 0x09b8, 0x0058, 0x9186, 0x0023, 0x1140, 0x080c, 0x85c6, - 0x0128, 0x6004, 0x9086, 0x0002, 0x0118, 0x0000, 0x9006, 0x0010, - 0x9085, 0x0001, 0x00ce, 0x0005, 0x7030, 0x908e, 0x0300, 0x0118, - 0x908e, 0x5200, 0x1d98, 0x2001, 0x1837, 0x2004, 0x9084, 0x0009, - 0x9086, 0x0008, 0x0d68, 0x0c50, 0x0156, 0x0046, 0x0016, 0x0036, - 0x7038, 0x2020, 0x8427, 0x94a4, 0x0007, 0xd484, 0x0148, 0x20a9, - 0x0004, 0x2019, 0x1805, 0x2011, 0x027a, 0x080c, 0xc365, 0x1178, - 0xd48c, 0x0148, 0x20a9, 0x0004, 0x2019, 0x1801, 0x2011, 0x027e, - 0x080c, 0xc365, 0x1120, 0xd494, 0x0110, 0x9085, 0x0001, 0x003e, - 0x001e, 0x004e, 0x015e, 0x0005, 0x0156, 0x0046, 0x0016, 0x0036, - 0x7038, 0x2020, 0x8427, 0x94a4, 0x0007, 0xd484, 0x0148, 0x20a9, - 0x0004, 0x2019, 0x1805, 0x2011, 0x0272, 0x080c, 0xc365, 0x1178, - 0xd48c, 0x0148, 0x20a9, 0x0004, 0x2019, 0x1801, 0x2011, 0x0276, - 0x080c, 0xc365, 0x1120, 0xd494, 0x0110, 0x9085, 0x0001, 0x003e, - 0x001e, 0x004e, 0x015e, 0x0005, 0x00f6, 0x2079, 0x0200, 0x7800, - 0xc0e5, 0xc0cc, 0x7802, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x1800, - 0x7834, 0xd084, 0x1130, 0x2079, 0x0200, 0x7800, 0x9085, 0x1200, - 0x7802, 0x00fe, 0x0005, 0x00e6, 0x2071, 0x1800, 0x7034, 0xc084, - 0x7036, 0x00ee, 0x0005, 0x0016, 0x2001, 0x1837, 0x200c, 0x9184, - 0x0080, 0x0118, 0xd18c, 0x0118, 0x9006, 0x001e, 0x0005, 0x9085, - 0x0001, 0x0cd8, 0x2071, 0x19fb, 0x7003, 0x0003, 0x700f, 0x0361, - 0x9006, 0x701a, 0x707a, 0x7012, 0x7017, 0x1cd0, 0x7007, 0x0000, - 0x7026, 0x702b, 0xa6ff, 0x7032, 0x703a, 0x703f, 0x0064, 0x7037, - 0xa767, 0x7047, 0xffff, 0x704a, 0x704f, 0x5667, 0x7052, 0x7063, - 0x88de, 0x080c, 0x1027, 0x090c, 0x0dc5, 0x2900, 0x7042, 0xa867, - 0x0003, 0xa86f, 0x0100, 0xa8ab, 0xdcb0, 0x0005, 0x2071, 0x19fb, - 0x1d04, 0x882c, 0x2091, 0x6000, 0x700c, 0x8001, 0x700e, 0x1540, - 0x2001, 0x013c, 0x2004, 0x9005, 0x190c, 0x894c, 0x2001, 0x1869, - 0x2004, 0xd0c4, 0x0158, 0x3a00, 0xd08c, 0x1140, 0x20d1, 0x0000, - 0x20d1, 0x0001, 0x20d1, 0x0000, 0x080c, 0x0dc5, 0x700f, 0x0361, - 0x7007, 0x0001, 0x0126, 0x2091, 0x8000, 0x080c, 0x8923, 0x7048, - 0x900d, 0x0148, 0x8109, 0x714a, 0x1130, 0x704c, 0x080f, 0x0018, - 0x0126, 0x2091, 0x8000, 0x7024, 0x900d, 0x0188, 0x7020, 0x8001, - 0x7022, 0x1168, 0x7023, 0x0009, 0x8109, 0x7126, 0x9186, 0x03e8, - 0x1110, 0x7028, 0x080f, 0x81ff, 0x1110, 0x7028, 0x080f, 0x7030, - 0x900d, 0x05a8, 0x702c, 0x8001, 0x702e, 0x1588, 0x0016, 0x2009, - 0x0306, 0x210c, 0x9184, 0x0030, 0x01e8, 0x9184, 0x0048, 0x9086, - 0x0008, 0x11c0, 0x7038, 0x9005, 0x01a8, 0x8001, 0x703a, 0x1190, - 0x080c, 0x7637, 0x0178, 0x00e6, 0x2071, 0x19e8, 0x080c, 0xa7f5, - 0x00ee, 0x1140, 0x2009, 0x1a86, 0x2104, 0x8000, 0x0208, 0x200a, - 0x001e, 0x0068, 0x001e, 0x702f, 0x0009, 0x8109, 0x7132, 0x0128, - 0x9184, 0x007f, 0x090c, 0xa8ab, 0x0010, 0x7034, 0x080f, 0x7044, - 0x9005, 0x0118, 0x0310, 0x8001, 0x7046, 0x7054, 0x900d, 0x0168, - 0x7050, 0x8001, 0x7052, 0x1148, 0x7053, 0x0009, 0x8109, 0x7156, - 0x1120, 0x7158, 0x7156, 0x7060, 0x080f, 0x7018, 0x900d, 0x01d8, - 0x0016, 0x7078, 0x900d, 0x0158, 0x7074, 0x8001, 0x7076, 0x1138, - 0x7077, 0x0009, 0x8109, 0x717a, 0x1110, 0x707c, 0x080f, 0x001e, - 0x7008, 0x8001, 0x700a, 0x1138, 0x700b, 0x0009, 0x8109, 0x711a, - 0x1110, 0x701c, 0x080f, 0x012e, 0x7004, 0x0002, 0x8854, 0x8855, - 0x8871, 0x00e6, 0x2071, 0x19fb, 0x7018, 0x9005, 0x1120, 0x711a, - 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, - 0x19fb, 0x701c, 0x9206, 0x1120, 0x701a, 0x701e, 0x707a, 0x707e, - 0x000e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x19fb, 0xb888, 0x9102, - 0x0208, 0xb98a, 0x00ee, 0x0005, 0x0005, 0x00b6, 0x7110, 0x080c, - 0x6724, 0x1168, 0xb888, 0x8001, 0x0250, 0xb88a, 0x1140, 0x0126, - 0x2091, 0x8000, 0x0016, 0x080c, 0x9ab1, 0x001e, 0x012e, 0x8108, - 0x9182, 0x0800, 0x0218, 0x900e, 0x7007, 0x0002, 0x7112, 0x00be, - 0x0005, 0x7014, 0x2060, 0x0126, 0x2091, 0x8000, 0x6040, 0x9005, - 0x0128, 0x8001, 0x6042, 0x1110, 0x080c, 0xd3e5, 0x6018, 0x9005, - 0x0558, 0x8001, 0x601a, 0x1540, 0x6120, 0x9186, 0x0003, 0x0148, - 0x9186, 0x0006, 0x0130, 0x9186, 0x0009, 0x11e0, 0x611c, 0xd1c4, - 0x1100, 0x080c, 0xd0d8, 0x01b0, 0x6014, 0x2048, 0xa884, 0x908a, - 0x199a, 0x0280, 0x9082, 0x1999, 0xa886, 0x908a, 0x199a, 0x0210, - 0x2001, 0x1999, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0xa87c, - 0xd0e4, 0x0110, 0x080c, 0xcdbc, 0x012e, 0x9c88, 0x0018, 0x7116, - 0x2001, 0x181a, 0x2004, 0x9102, 0x0220, 0x7017, 0x1cd0, 0x7007, - 0x0000, 0x0005, 0x00e6, 0x2071, 0x19fb, 0x7027, 0x07d0, 0x7023, - 0x0009, 0x00ee, 0x0005, 0x2001, 0x1a04, 0x2003, 0x0000, 0x0005, - 0x00e6, 0x2071, 0x19fb, 0x7132, 0x702f, 0x0009, 0x00ee, 0x0005, - 0x2011, 0x1a07, 0x2013, 0x0000, 0x0005, 0x00e6, 0x2071, 0x19fb, - 0x711a, 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x0086, 0x0026, - 0x705c, 0x8000, 0x705e, 0x2001, 0x1a0b, 0x2044, 0xa06c, 0x9086, - 0x0000, 0x0150, 0x7070, 0xa09a, 0x706c, 0xa096, 0x7068, 0xa092, - 0x7064, 0xa08e, 0x080c, 0x10f8, 0x002e, 0x008e, 0x0005, 0x0006, - 0x0016, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, - 0x0156, 0x080c, 0x8776, 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, - 0x00be, 0x00ae, 0x009e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, - 0x19fb, 0x717a, 0x727e, 0x7077, 0x0009, 0x00ee, 0x0005, 0x00e6, - 0x0006, 0x2071, 0x19fb, 0x707c, 0x9206, 0x1110, 0x707a, 0x707e, - 0x000e, 0x00ee, 0x0005, 0x2069, 0x1800, 0x69e8, 0xd1e4, 0x1518, - 0x0026, 0xd1ec, 0x0140, 0x6a54, 0x6874, 0x9202, 0x0288, 0x8117, - 0x9294, 0x00c0, 0x0088, 0x9184, 0x0007, 0x01a0, 0x8109, 0x9184, - 0x0007, 0x0110, 0x69ea, 0x0070, 0x8107, 0x9084, 0x0007, 0x910d, - 0x8107, 0x9106, 0x9094, 0x00c0, 0x9184, 0xff3f, 0x9205, 0x68ea, - 0x080c, 0x0eee, 0x002e, 0x0005, 0x0016, 0x00c6, 0x2009, 0xfff4, - 0x210d, 0x2061, 0x0100, 0x60f0, 0x9100, 0x60f3, 0x0000, 0x2009, - 0xfff4, 0x200f, 0x1220, 0x8108, 0x2105, 0x8000, 0x200f, 0x00ce, - 0x001e, 0x0005, 0x00c6, 0x2061, 0x1a74, 0x00ce, 0x0005, 0x9184, - 0x000f, 0x8003, 0x8003, 0x8003, 0x9080, 0x1a74, 0x2060, 0x0005, - 0xa884, 0x908a, 0x199a, 0x1638, 0x9005, 0x1150, 0x00c6, 0x2061, - 0x1a74, 0x6014, 0x00ce, 0x9005, 0x1130, 0x2001, 0x001e, 0x0018, - 0x908e, 0xffff, 0x01b0, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, - 0xa87c, 0x908c, 0x00c0, 0x918e, 0x00c0, 0x0904, 0x89fa, 0xd0b4, - 0x1168, 0xd0bc, 0x1904, 0x89d3, 0x2009, 0x0006, 0x080c, 0x8a27, - 0x0005, 0x900e, 0x0c60, 0x2001, 0x1999, 0x08b0, 0xd0fc, 0x0160, - 0x908c, 0x0003, 0x0120, 0x918e, 0x0003, 0x1904, 0x8a21, 0x908c, - 0x2020, 0x918e, 0x2020, 0x01a8, 0x6024, 0xd0d4, 0x11e8, 0x2009, - 0x1869, 0x2104, 0xd084, 0x1138, 0x87ff, 0x1120, 0x2009, 0x0043, - 0x0804, 0xb352, 0x0005, 0x87ff, 0x1de8, 0x2009, 0x0042, 0x0804, - 0xb352, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d20, - 0x6024, 0xc0cd, 0x6026, 0x0c00, 0xc0d4, 0x6026, 0xa890, 0x602e, - 0xa88c, 0x6032, 0x08e0, 0xd0fc, 0x0160, 0x908c, 0x0003, 0x0120, - 0x918e, 0x0003, 0x1904, 0x8a21, 0x908c, 0x2020, 0x918e, 0x2020, - 0x0170, 0x0076, 0x00f6, 0x2c78, 0x080c, 0x1768, 0x00fe, 0x007e, - 0x87ff, 0x1120, 0x2009, 0x0042, 0x080c, 0xb352, 0x0005, 0x6110, - 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d58, 0x6124, 0xc1cd, - 0x6126, 0x0c38, 0xd0fc, 0x0188, 0x908c, 0x2020, 0x918e, 0x2020, - 0x01a8, 0x9084, 0x0003, 0x908e, 0x0002, 0x0148, 0x87ff, 0x1120, - 0x2009, 0x0041, 0x080c, 0xb352, 0x0005, 0x00b9, 0x0ce8, 0x87ff, - 0x1dd8, 0x2009, 0x0043, 0x080c, 0xb352, 0x0cb0, 0x6110, 0x00b6, - 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d20, 0x6124, 0xc1cd, 0x6126, - 0x0c00, 0x2009, 0x0004, 0x0019, 0x0005, 0x2009, 0x0001, 0x0096, - 0x080c, 0xd0d8, 0x0518, 0x6014, 0x2048, 0xa982, 0xa800, 0x6016, - 0x9186, 0x0001, 0x1188, 0xa97c, 0x918c, 0x8100, 0x918e, 0x8100, - 0x1158, 0x00c6, 0x2061, 0x1a74, 0x6200, 0xd28c, 0x1120, 0x6204, - 0x8210, 0x0208, 0x6206, 0x00ce, 0x080c, 0x6cde, 0x6014, 0x904d, - 0x0076, 0x2039, 0x0000, 0x190c, 0x8970, 0x007e, 0x009e, 0x0005, - 0x0156, 0x00c6, 0x2061, 0x1a74, 0x6000, 0x81ff, 0x0110, 0x9205, - 0x0008, 0x9204, 0x6002, 0x00ce, 0x015e, 0x0005, 0x6800, 0xd08c, - 0x1138, 0x6808, 0x9005, 0x0120, 0x8001, 0x680a, 0x9085, 0x0001, - 0x0005, 0x2071, 0x1924, 0x7003, 0x0006, 0x7007, 0x0000, 0x700f, - 0x0000, 0x7013, 0x0001, 0x080c, 0x1027, 0x090c, 0x0dc5, 0xa867, - 0x0006, 0xa86b, 0x0001, 0xa8ab, 0xdcb0, 0xa89f, 0x0000, 0x2900, - 0x702e, 0x7033, 0x0000, 0x0005, 0x0126, 0x2091, 0x8000, 0x0096, - 0x00e6, 0x2071, 0x1924, 0x702c, 0x2048, 0x6a2c, 0x721e, 0x6b30, - 0x7322, 0x6834, 0x7026, 0xa896, 0x6838, 0x702a, 0xa89a, 0x6824, - 0x7016, 0x683c, 0x701a, 0x2009, 0x0028, 0x200a, 0x9005, 0x0148, - 0x900e, 0x9188, 0x000c, 0x8001, 0x1de0, 0x2100, 0x9210, 0x1208, - 0x8318, 0xaa8e, 0xab92, 0x7010, 0xd084, 0x0168, 0xc084, 0x7007, - 0x0001, 0x700f, 0x0000, 0x0006, 0x2009, 0x1ad1, 0x2104, 0x9082, - 0x0007, 0x200a, 0x000e, 0xc095, 0x7012, 0x2008, 0x2001, 0x003b, - 0x080c, 0x1611, 0x9006, 0x2071, 0x193d, 0x7002, 0x7006, 0x702a, - 0x00ee, 0x009e, 0x012e, 0x0005, 0x2009, 0x1ad1, 0x2104, 0x9080, - 0x0007, 0x200a, 0x0005, 0x00e6, 0x0126, 0x0156, 0x2091, 0x8000, - 0x2071, 0x1800, 0x7154, 0x2001, 0x0008, 0x910a, 0x0638, 0x2001, - 0x187d, 0x20ac, 0x9006, 0x9080, 0x0008, 0x1f04, 0x8ae3, 0x71c0, - 0x9102, 0x02e0, 0x2071, 0x1877, 0x20a9, 0x0007, 0x00c6, 0x080c, - 0xb27d, 0x6023, 0x0009, 0x6003, 0x0004, 0x601f, 0x0101, 0x0089, - 0x0126, 0x2091, 0x8000, 0x080c, 0x8c61, 0x012e, 0x1f04, 0x8aef, - 0x9006, 0x00ce, 0x015e, 0x012e, 0x00ee, 0x0005, 0x9085, 0x0001, - 0x0cc8, 0x00e6, 0x00b6, 0x0096, 0x0086, 0x0056, 0x0046, 0x0026, - 0x7118, 0x720c, 0x7620, 0x7004, 0xd084, 0x1128, 0x2021, 0x0024, - 0x2029, 0x0002, 0x0020, 0x2021, 0x002c, 0x2029, 0x000a, 0x080c, - 0x100e, 0x090c, 0x0dc5, 0x2900, 0x6016, 0x2058, 0xac66, 0x9006, - 0xa802, 0xa806, 0xa86a, 0xa87a, 0xa8aa, 0xa887, 0x0005, 0xa87f, - 0x0020, 0x7008, 0xa89a, 0x7010, 0xa89e, 0xae8a, 0xa8af, 0xffff, - 0xa8b3, 0x0000, 0x8109, 0x0160, 0x080c, 0x100e, 0x090c, 0x0dc5, - 0xad66, 0x2b00, 0xa802, 0x2900, 0xb806, 0x2058, 0x8109, 0x1da0, - 0x002e, 0x004e, 0x005e, 0x008e, 0x009e, 0x00be, 0x00ee, 0x0005, - 0x2079, 0x0000, 0x2071, 0x1924, 0x7004, 0x004b, 0x700c, 0x0002, - 0x8b5b, 0x8b54, 0x8b54, 0x0005, 0x8b65, 0x8bbb, 0x8bbb, 0x8bbb, - 0x8bbc, 0x8bcd, 0x8bcd, 0x700c, 0x0cba, 0x0126, 0x2091, 0x8000, - 0x78a0, 0x79a0, 0x9106, 0x1904, 0x8bad, 0x7814, 0xd0bc, 0x1904, - 0x8bb6, 0x012e, 0x7018, 0x910a, 0x1128, 0x7030, 0x9005, 0x1904, - 0x8bff, 0x0005, 0x1210, 0x7114, 0x910a, 0x9192, 0x000a, 0x0210, - 0x2009, 0x000a, 0x2001, 0x1888, 0x2014, 0x2001, 0x1936, 0x2004, - 0x9100, 0x9202, 0x0e50, 0x080c, 0x8d5c, 0x2200, 0x9102, 0x0208, - 0x2208, 0x0096, 0x702c, 0x2048, 0xa873, 0x0001, 0xa976, 0x080c, - 0x8e65, 0x2100, 0xa87e, 0xa86f, 0x0000, 0x009e, 0x0126, 0x2091, - 0x8000, 0x2009, 0x1a1b, 0x2104, 0xc085, 0x200a, 0x700f, 0x0002, - 0x012e, 0x080c, 0x1117, 0x1de8, 0x0005, 0x78a0, 0x79a0, 0x9106, - 0x0904, 0x8b6d, 0x080c, 0x8d34, 0x012e, 0x0005, 0x7810, 0xc0c5, - 0x7812, 0x0804, 0x8b6d, 0x0005, 0x700c, 0x0002, 0x8bc1, 0x8bc4, - 0x8bc3, 0x080c, 0x8b63, 0x0005, 0x8001, 0x700e, 0x0096, 0x702c, - 0x2048, 0xa974, 0x009e, 0x0011, 0x0ca0, 0x0005, 0x0096, 0x702c, - 0x2048, 0x7018, 0x9100, 0x7214, 0x921a, 0x1130, 0x701c, 0xa88e, - 0x7020, 0xa892, 0x9006, 0x0068, 0x0006, 0x080c, 0x8e65, 0x2100, - 0xaa8c, 0x9210, 0xaa8e, 0x1220, 0xa890, 0x9081, 0x0000, 0xa892, - 0x000e, 0x009e, 0x0126, 0x2091, 0x8000, 0x78a2, 0x701a, 0x080c, - 0x8d34, 0x012e, 0x0005, 0x00e6, 0x2071, 0x1924, 0x700c, 0x0002, - 0x8bfd, 0x8bfd, 0x8bfb, 0x700f, 0x0001, 0x00ee, 0x0005, 0x0126, - 0x2091, 0x8000, 0x7030, 0x9005, 0x0508, 0x2078, 0x7814, 0x2048, - 0xae88, 0x00b6, 0x2059, 0x0000, 0x080c, 0x8c6a, 0x00be, 0x01b0, - 0x00e6, 0x2071, 0x193d, 0x080c, 0x8cb1, 0x00ee, 0x0178, 0x0096, - 0x080c, 0x1027, 0x2900, 0x009e, 0x0148, 0xa8aa, 0x04b9, 0x0041, - 0x2001, 0x1947, 0x2003, 0x0000, 0x012e, 0x08c8, 0x012e, 0x0005, - 0x00d6, 0x00c6, 0x0086, 0x00a6, 0x2940, 0x2650, 0x2600, 0x9005, - 0x0180, 0xa864, 0x9084, 0x000f, 0x2068, 0x9d88, 0x20c7, 0x2165, - 0x0056, 0x2029, 0x0000, 0x080c, 0x8dea, 0x080c, 0x207f, 0x1dd8, - 0x005e, 0x00ae, 0x2001, 0x187f, 0x2004, 0xa88a, 0x080c, 0x1768, - 0x781f, 0x0101, 0x7813, 0x0000, 0x0126, 0x2091, 0x8000, 0x080c, - 0x8cc0, 0x012e, 0x008e, 0x00ce, 0x00de, 0x0005, 0x7030, 0x9005, - 0x0138, 0x2078, 0x780c, 0x7032, 0x2001, 0x1947, 0x2003, 0x0001, - 0x0005, 0x00e6, 0x2071, 0x1924, 0x7030, 0x600e, 0x2c00, 0x7032, - 0x00ee, 0x0005, 0x00d6, 0x00c6, 0x0026, 0x9b80, 0x8f33, 0x2005, - 0x906d, 0x090c, 0x0dc5, 0x9b80, 0x8f2b, 0x2005, 0x9065, 0x090c, - 0x0dc5, 0x6114, 0x2600, 0x9102, 0x0248, 0x6828, 0x9102, 0x02f0, - 0x9085, 0x0001, 0x002e, 0x00ce, 0x00de, 0x0005, 0x6804, 0xd094, - 0x0148, 0x6854, 0xd084, 0x1178, 0xc085, 0x6856, 0x2011, 0x8026, - 0x080c, 0x4c44, 0x684c, 0x0096, 0x904d, 0x090c, 0x0dc5, 0xa804, - 0x8000, 0xa806, 0x009e, 0x9006, 0x2030, 0x0c20, 0x6854, 0xd08c, - 0x1d08, 0xc08d, 0x6856, 0x2011, 0x8025, 0x080c, 0x4c44, 0x684c, - 0x0096, 0x904d, 0x090c, 0x0dc5, 0xa800, 0x8000, 0xa802, 0x009e, - 0x0888, 0x7000, 0x2019, 0x0008, 0x8319, 0x7104, 0x9102, 0x1118, - 0x2300, 0x9005, 0x0020, 0x0210, 0x9302, 0x0008, 0x8002, 0x0005, - 0x00d6, 0x7814, 0x9005, 0x090c, 0x0dc5, 0x781c, 0x9084, 0x0101, - 0x9086, 0x0101, 0x190c, 0x0dc5, 0x7827, 0x0000, 0x2069, 0x193d, - 0x6804, 0x9080, 0x193f, 0x2f08, 0x2102, 0x6904, 0x8108, 0x9182, - 0x0008, 0x0208, 0x900e, 0x6906, 0x9180, 0x193f, 0x2003, 0x0000, - 0x00de, 0x0005, 0x0096, 0x00c6, 0x2060, 0x6014, 0x2048, 0xa8a8, - 0x0096, 0x2048, 0x9005, 0x190c, 0x1040, 0x009e, 0xa8ab, 0x0000, - 0x080c, 0x0fc0, 0x080c, 0xb2d3, 0x00ce, 0x009e, 0x0005, 0x6020, - 0x9086, 0x0009, 0x1128, 0x601c, 0xd0c4, 0x0110, 0x9006, 0x0005, - 0x9085, 0x0001, 0x0005, 0x6000, 0x9086, 0x0000, 0x0178, 0x6010, - 0x9005, 0x0150, 0x00b6, 0x2058, 0x080c, 0x9067, 0x00be, 0x6013, - 0x0000, 0x601b, 0x0000, 0x0010, 0x2c00, 0x0861, 0x0005, 0x2009, - 0x1928, 0x210c, 0xd194, 0x0005, 0x2009, 0x1928, 0x210c, 0xd1c4, - 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, 0x2071, 0x1924, 0x7110, - 0xc194, 0xc185, 0x7007, 0x0000, 0x7112, 0x2001, 0x003b, 0x080c, - 0x1611, 0x00ee, 0x012e, 0x0005, 0x7814, 0xd0bc, 0x1108, 0x0005, - 0x7810, 0xc0c5, 0x7812, 0x0cc0, 0x0096, 0x00d6, 0x9006, 0x7006, - 0x700e, 0x701a, 0x701e, 0x7022, 0x7016, 0x702a, 0x7026, 0x702f, - 0x0000, 0x080c, 0x8eb3, 0x0170, 0x080c, 0x8ee8, 0x0158, 0x2900, - 0x7002, 0x700a, 0x701a, 0x7013, 0x0001, 0x701f, 0x000a, 0x00de, - 0x009e, 0x0005, 0x900e, 0x0cd8, 0x00e6, 0x0096, 0x0086, 0x00d6, - 0x00c6, 0x2071, 0x1931, 0x721c, 0x2100, 0x9202, 0x1618, 0x080c, - 0x8ee8, 0x090c, 0x0dc5, 0x7018, 0x9005, 0x1160, 0x2900, 0x7002, - 0x700a, 0x701a, 0x9006, 0x7006, 0x700e, 0xa806, 0xa802, 0x7012, - 0x701e, 0x0038, 0x2040, 0xa806, 0x2900, 0xa002, 0x701a, 0xa803, - 0x0000, 0x7010, 0x8000, 0x7012, 0x701c, 0x9080, 0x000a, 0x701e, - 0x721c, 0x08d0, 0x721c, 0x00ce, 0x00de, 0x008e, 0x009e, 0x00ee, - 0x0005, 0x0096, 0x0156, 0x0136, 0x0146, 0x00e6, 0x0126, 0x2091, - 0x8000, 0x2071, 0x1931, 0x7300, 0x831f, 0x831e, 0x831e, 0x9384, - 0x003f, 0x20e8, 0x939c, 0xffc0, 0x9398, 0x0003, 0x7104, 0x080c, - 0x8e65, 0x810c, 0x2100, 0x9318, 0x8003, 0x2228, 0x2021, 0x0078, - 0x9402, 0x9532, 0x0208, 0x2028, 0x2500, 0x8004, 0x20a8, 0x23a0, - 0xa001, 0xa001, 0x4005, 0x2508, 0x080c, 0x8e6e, 0x2130, 0x7014, - 0x9600, 0x7016, 0x2600, 0x711c, 0x9102, 0x701e, 0x7004, 0x9600, - 0x2008, 0x9082, 0x000a, 0x1190, 0x7000, 0x2048, 0xa800, 0x9005, - 0x1148, 0x2009, 0x0001, 0x0026, 0x080c, 0x8d5c, 0x002e, 0x7000, - 0x2048, 0xa800, 0x7002, 0x7007, 0x0000, 0x0008, 0x7106, 0x2500, - 0x9212, 0x1904, 0x8d9b, 0x012e, 0x00ee, 0x014e, 0x013e, 0x015e, - 0x009e, 0x0005, 0x0016, 0x0026, 0x00e6, 0x0126, 0x2091, 0x8000, - 0x9580, 0x8f2b, 0x2005, 0x9075, 0x090c, 0x0dc5, 0x080c, 0x8e40, - 0x012e, 0x9580, 0x8f27, 0x2005, 0x9075, 0x090c, 0x0dc5, 0x0156, - 0x0136, 0x01c6, 0x0146, 0x01d6, 0x831f, 0x831e, 0x831e, 0x9384, - 0x003f, 0x20e0, 0x9384, 0xffc0, 0x9100, 0x2098, 0xa860, 0x20e8, - 0xa95c, 0x2c05, 0x9100, 0x20a0, 0x20a9, 0x0002, 0x4003, 0x2e0c, - 0x2d00, 0x0002, 0x8e2a, 0x8e2a, 0x8e2c, 0x8e2a, 0x8e2c, 0x8e2a, - 0x8e2a, 0x8e2a, 0x8e2a, 0x8e2a, 0x8e32, 0x8e2a, 0x8e32, 0x8e2a, - 0x8e2a, 0x8e2a, 0x080c, 0x0dc5, 0x4104, 0x20a9, 0x0002, 0x4002, - 0x4003, 0x0028, 0x20a9, 0x0002, 0x4003, 0x4104, 0x4003, 0x01de, - 0x014e, 0x01ce, 0x013e, 0x015e, 0x00ee, 0x002e, 0x001e, 0x0005, - 0x0096, 0x7014, 0x8001, 0x7016, 0x710c, 0x2110, 0x00f1, 0x810c, - 0x9188, 0x0003, 0x7308, 0x8210, 0x9282, 0x000a, 0x1198, 0x7008, - 0x2048, 0xa800, 0x9005, 0x0158, 0x0006, 0x080c, 0x8ef7, 0x009e, - 0xa807, 0x0000, 0x2900, 0x700a, 0x7010, 0x8001, 0x7012, 0x700f, - 0x0000, 0x0008, 0x720e, 0x009e, 0x0005, 0x0006, 0x810b, 0x810b, - 0x2100, 0x810b, 0x9100, 0x2008, 0x000e, 0x0005, 0x0006, 0x0026, - 0x2100, 0x9005, 0x0158, 0x9092, 0x000c, 0x0240, 0x900e, 0x8108, - 0x9082, 0x000c, 0x1de0, 0x002e, 0x000e, 0x0005, 0x900e, 0x0cd8, - 0x2d00, 0x90b8, 0x0008, 0x2031, 0x8eb1, 0x901e, 0x6808, 0x9005, - 0x0108, 0x8318, 0x690c, 0x910a, 0x0248, 0x0140, 0x8318, 0x6810, - 0x9112, 0x0220, 0x0118, 0x8318, 0x2208, 0x0cd0, 0x233a, 0x6804, - 0xd084, 0x2300, 0x2021, 0x0001, 0x1150, 0x9082, 0x0003, 0x0967, - 0x0a67, 0x8420, 0x9082, 0x0007, 0x0967, 0x0a67, 0x0cd0, 0x9082, - 0x0002, 0x0967, 0x0a67, 0x8420, 0x9082, 0x0005, 0x0967, 0x0a67, - 0x0cd0, 0x6c1a, 0x0005, 0x0096, 0x0046, 0x0126, 0x2091, 0x8000, - 0x2b00, 0x9080, 0x8f2f, 0x2005, 0x9005, 0x090c, 0x0dc5, 0x2004, - 0x90a0, 0x000a, 0x080c, 0x1027, 0x01d0, 0x2900, 0x7026, 0xa803, - 0x0000, 0xa807, 0x0000, 0x080c, 0x1027, 0x0188, 0x7024, 0xa802, - 0xa807, 0x0000, 0x2900, 0x7026, 0x94a2, 0x000a, 0x0110, 0x0208, - 0x0c90, 0x9085, 0x0001, 0x012e, 0x004e, 0x009e, 0x0005, 0x7024, - 0x9005, 0x0dc8, 0x2048, 0xac00, 0x080c, 0x1040, 0x2400, 0x0cc0, - 0x0126, 0x2091, 0x8000, 0x7024, 0x2048, 0x9005, 0x0130, 0xa800, - 0x7026, 0xa803, 0x0000, 0xa807, 0x0000, 0x012e, 0x0005, 0x0126, - 0x2091, 0x8000, 0x7024, 0xa802, 0x2900, 0x7026, 0x012e, 0x0005, - 0x0096, 0x9e80, 0x0009, 0x2004, 0x9005, 0x0138, 0x2048, 0xa800, - 0x0006, 0x080c, 0x1040, 0x000e, 0x0cb8, 0x009e, 0x0005, 0x0096, - 0x7008, 0x9005, 0x0138, 0x2048, 0xa800, 0x0006, 0x080c, 0x1040, - 0x000e, 0x0cb8, 0x9006, 0x7002, 0x700a, 0x7006, 0x700e, 0x701a, - 0x701e, 0x7022, 0x702a, 0x7026, 0x702e, 0x009e, 0x0005, 0x1a67, - 0x0000, 0x0000, 0x0000, 0x1931, 0x0000, 0x0000, 0x0000, 0x1888, - 0x0000, 0x0000, 0x0000, 0x1877, 0x0000, 0x0000, 0x0000, 0x00e6, - 0x00c6, 0x00b6, 0x00a6, 0xa8a8, 0x2040, 0x2071, 0x1877, 0x080c, - 0x9053, 0xa067, 0x0023, 0x6010, 0x905d, 0x0904, 0x9028, 0xb814, - 0xa06e, 0xb910, 0xa172, 0xb9a0, 0xa176, 0x2001, 0x0003, 0xa07e, - 0xa834, 0xa082, 0xa07b, 0x0000, 0xa898, 0x9005, 0x0118, 0xa078, - 0xc085, 0xa07a, 0x2858, 0x2031, 0x0018, 0xa068, 0x908a, 0x0019, - 0x1a0c, 0x0dc5, 0x2020, 0x2050, 0x2940, 0xa864, 0x90bc, 0x00ff, - 0x908c, 0x000f, 0x91e0, 0x20c7, 0x2c65, 0x9786, 0x0024, 0x2c05, - 0x1590, 0x908a, 0x0036, 0x1a0c, 0x0dc5, 0x9082, 0x001b, 0x0002, - 0x8f93, 0x8f93, 0x8f95, 0x8f93, 0x8f93, 0x8f93, 0x8f97, 0x8f93, - 0x8f93, 0x8f93, 0x8f99, 0x8f93, 0x8f93, 0x8f93, 0x8f9b, 0x8f93, - 0x8f93, 0x8f93, 0x8f9d, 0x8f93, 0x8f93, 0x8f93, 0x8f9f, 0x8f93, - 0x8f93, 0x8f93, 0x8fa1, 0x080c, 0x0dc5, 0xa180, 0x04b8, 0xa190, - 0x04a8, 0xa1a0, 0x0498, 0xa1b0, 0x0488, 0xa1c0, 0x0478, 0xa1d0, - 0x0468, 0xa1e0, 0x0458, 0x908a, 0x0034, 0x1a0c, 0x0dc5, 0x9082, - 0x001b, 0x0002, 0x8fc5, 0x8fc3, 0x8fc3, 0x8fc3, 0x8fc3, 0x8fc3, - 0x8fc7, 0x8fc3, 0x8fc3, 0x8fc3, 0x8fc3, 0x8fc3, 0x8fc9, 0x8fc3, - 0x8fc3, 0x8fc3, 0x8fc3, 0x8fc3, 0x8fcb, 0x8fc3, 0x8fc3, 0x8fc3, - 0x8fc3, 0x8fc3, 0x8fcd, 0x080c, 0x0dc5, 0xa180, 0x0038, 0xa198, - 0x0028, 0xa1b0, 0x0018, 0xa1c8, 0x0008, 0xa1e0, 0x2600, 0x0002, - 0x8fe9, 0x8feb, 0x8fed, 0x8fef, 0x8ff1, 0x8ff3, 0x8ff5, 0x8ff7, - 0x8ff9, 0x8ffb, 0x8ffd, 0x8fff, 0x9001, 0x9003, 0x9005, 0x9007, - 0x9009, 0x900b, 0x900d, 0x900f, 0x9011, 0x9013, 0x9015, 0x9017, - 0x9019, 0x080c, 0x0dc5, 0xb9e2, 0x0468, 0xb9de, 0x0458, 0xb9da, - 0x0448, 0xb9d6, 0x0438, 0xb9d2, 0x0428, 0xb9ce, 0x0418, 0xb9ca, - 0x0408, 0xb9c6, 0x00f8, 0xb9c2, 0x00e8, 0xb9be, 0x00d8, 0xb9ba, - 0x00c8, 0xb9b6, 0x00b8, 0xb9b2, 0x00a8, 0xb9ae, 0x0098, 0xb9aa, - 0x0088, 0xb9a6, 0x0078, 0xb9a2, 0x0068, 0xb99e, 0x0058, 0xb99a, - 0x0048, 0xb996, 0x0038, 0xb992, 0x0028, 0xb98e, 0x0018, 0xb98a, - 0x0008, 0xb986, 0x8631, 0x8421, 0x0130, 0x080c, 0x207f, 0x090c, - 0x0dc5, 0x0804, 0x8f6d, 0x00ae, 0x00be, 0x00ce, 0x00ee, 0x0005, - 0xa86c, 0xa06e, 0xa870, 0xa072, 0xa077, 0x00ff, 0x9006, 0x0804, - 0x8f4f, 0x0006, 0x0016, 0x00b6, 0x6010, 0x2058, 0xb810, 0x9005, - 0x01b0, 0x2001, 0x1925, 0x2004, 0x9005, 0x0188, 0x2001, 0x1800, - 0x2004, 0x9086, 0x0003, 0x1158, 0x0036, 0x0046, 0xbba0, 0x2021, - 0x0004, 0x2011, 0x8014, 0x080c, 0x4c44, 0x004e, 0x003e, 0x00be, - 0x001e, 0x000e, 0x0005, 0x9016, 0x710c, 0xa834, 0x910a, 0xa936, - 0x7008, 0x9005, 0x0120, 0x8210, 0x910a, 0x0230, 0x0128, 0x7010, - 0x8210, 0x910a, 0x0208, 0x1de0, 0xaa8a, 0xa26a, 0x0005, 0x00f6, - 0x00d6, 0x0036, 0x2079, 0x0300, 0x781b, 0x0200, 0x7818, 0xd094, - 0x1dd8, 0x781b, 0x0202, 0xa001, 0xa001, 0x7818, 0xd094, 0x1da0, - 0xb8ac, 0x906d, 0x0198, 0x2079, 0x0000, 0x9c1e, 0x1118, 0x680c, - 0xb8ae, 0x0050, 0x9c06, 0x0130, 0x2d78, 0x680c, 0x906d, 0x1dd0, - 0x080c, 0x0dc5, 0x6b0c, 0x7b0e, 0x600f, 0x0000, 0x2079, 0x0300, - 0x781b, 0x0200, 0x003e, 0x00de, 0x00fe, 0x0005, 0x00e6, 0x00d6, - 0x0096, 0x00c6, 0x0036, 0x0126, 0x2091, 0x8000, 0x0156, 0x20a9, - 0x01ff, 0x2071, 0x0300, 0x701b, 0x0200, 0x7018, 0xd094, 0x0110, - 0x1f04, 0x90a3, 0x701b, 0x0202, 0xa001, 0xa001, 0x7018, 0xd094, - 0x1d90, 0xb8ac, 0x9065, 0x01f0, 0x600c, 0xb8ae, 0x6024, 0xc08d, - 0x6026, 0x6003, 0x0004, 0x601b, 0x0000, 0x6013, 0x0000, 0x601f, - 0x0101, 0x6014, 0x904d, 0x090c, 0x0dc5, 0xa88b, 0x0000, 0xa8a8, - 0xa8ab, 0x0000, 0x904d, 0x090c, 0x0dc5, 0x080c, 0x1040, 0x080c, - 0x8c61, 0x08f8, 0x2071, 0x0300, 0x701b, 0x0200, 0x015e, 0x012e, - 0x003e, 0x00ce, 0x009e, 0x00de, 0x00ee, 0x0005, 0x00c6, 0x00b6, - 0x0016, 0x0006, 0x0156, 0x080c, 0x2873, 0x015e, 0x11b0, 0x080c, - 0x66b9, 0x190c, 0x0dc5, 0x000e, 0x001e, 0xb912, 0xb816, 0x080c, - 0xb27d, 0x0140, 0x2b00, 0x6012, 0x6023, 0x0001, 0x2009, 0x0001, - 0x080c, 0xb352, 0x00be, 0x00ce, 0x0005, 0x000e, 0x001e, 0x0cd0, - 0x0066, 0x6000, 0x90b2, 0x0010, 0x1a0c, 0x0dc5, 0x0013, 0x006e, - 0x0005, 0x9119, 0x9119, 0x9119, 0x911b, 0x916c, 0x9119, 0x9119, - 0x9119, 0x91e6, 0x9119, 0x9223, 0x9119, 0x9119, 0x9119, 0x9119, - 0x9119, 0x080c, 0x0dc5, 0x9182, 0x0040, 0x0002, 0x912e, 0x912e, - 0x912e, 0x912e, 0x912e, 0x912e, 0x912e, 0x912e, 0x912e, 0x9130, - 0x9145, 0x912e, 0x912e, 0x912e, 0x912e, 0x9158, 0x080c, 0x0dc5, - 0x0096, 0x080c, 0x9a61, 0x080c, 0x9bd3, 0x6114, 0x2148, 0xa87b, - 0x0000, 0x6010, 0x00b6, 0x2058, 0xb8bb, 0x0500, 0x00be, 0x080c, - 0x6ca3, 0x080c, 0xb2d3, 0x009e, 0x0005, 0x080c, 0x9a61, 0x00d6, - 0x6114, 0x080c, 0xd0d8, 0x0130, 0x0096, 0x6114, 0x2148, 0x080c, - 0x6e9f, 0x009e, 0x00de, 0x080c, 0xb2d3, 0x080c, 0x9bd3, 0x0005, - 0x080c, 0x9a61, 0x080c, 0x3250, 0x6114, 0x0096, 0x2148, 0x080c, - 0xd0d8, 0x0120, 0xa87b, 0x0029, 0x080c, 0x6e9f, 0x009e, 0x080c, - 0xb2d3, 0x080c, 0x9bd3, 0x0005, 0x601b, 0x0000, 0x9182, 0x0040, - 0x0096, 0x0002, 0x9187, 0x9187, 0x9187, 0x9187, 0x9187, 0x9187, - 0x9187, 0x9187, 0x9189, 0x9187, 0x9187, 0x9187, 0x91e2, 0x9187, - 0x9187, 0x9187, 0x9187, 0x9187, 0x9187, 0x9190, 0x9187, 0x080c, - 0x0dc5, 0x6114, 0x2148, 0xa938, 0x918e, 0xffff, 0x0904, 0x91e2, - 0x6024, 0xd08c, 0x15d8, 0x080c, 0x8d17, 0x05e0, 0x00e6, 0x6114, - 0x2148, 0x080c, 0x8f37, 0x0096, 0xa8a8, 0x2048, 0x080c, 0x6c3b, - 0x009e, 0xa8ab, 0x0000, 0x6010, 0x9005, 0x0128, 0x00b6, 0x2058, - 0x080c, 0x9067, 0x00be, 0xae88, 0x00b6, 0x2059, 0x0000, 0x080c, - 0x8c6a, 0x00be, 0x01e0, 0x2071, 0x193d, 0x080c, 0x8cb1, 0x01b8, - 0x9086, 0x0001, 0x1128, 0x2001, 0x1947, 0x2004, 0x9005, 0x1178, - 0x0096, 0x080c, 0x100e, 0x2900, 0x009e, 0x0148, 0xa8aa, 0x00f6, - 0x2c78, 0x080c, 0x8c28, 0x00fe, 0x00ee, 0x009e, 0x0005, 0x080c, - 0x8c61, 0x0cd0, 0x080c, 0x8d1c, 0x1160, 0x6010, 0x9005, 0x0130, - 0x2058, 0xb8ac, 0x9005, 0x190c, 0x0dc5, 0x6012, 0x2c00, 0x080c, - 0x8ce2, 0x0005, 0x080c, 0x9290, 0x009e, 0x0005, 0x9182, 0x0040, - 0x0096, 0x0002, 0x91fa, 0x91fa, 0x91fa, 0x91fc, 0x91fa, 0x91fa, - 0x91fa, 0x9221, 0x91fa, 0x91fa, 0x91fa, 0x91fa, 0x91fa, 0x91fa, - 0x91fa, 0x91fa, 0x080c, 0x0dc5, 0x6003, 0x0003, 0x6106, 0x6014, - 0x2048, 0xa8ac, 0xa846, 0xa8b0, 0xa84a, 0xa837, 0x0000, 0xa83b, - 0x0000, 0xa884, 0x9092, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, - 0x8013, 0x8213, 0x9210, 0x621a, 0x2c10, 0x080c, 0x1be0, 0x080c, - 0x9564, 0x0126, 0x2091, 0x8000, 0x080c, 0x9bd3, 0x012e, 0x009e, - 0x0005, 0x080c, 0x0dc5, 0x080c, 0x9a61, 0x080c, 0x9bd3, 0x6114, - 0x2148, 0xa87b, 0x0000, 0x6010, 0x00b6, 0x2058, 0xb8bb, 0x0500, - 0x00be, 0x080c, 0x6e9f, 0x080c, 0xb2d3, 0x009e, 0x0005, 0x6000, - 0x908a, 0x0010, 0x1a0c, 0x0dc5, 0x0096, 0x0013, 0x009e, 0x0005, - 0x9250, 0x9250, 0x9250, 0x9252, 0x9263, 0x9250, 0x9250, 0x9250, - 0x9250, 0x9250, 0x9250, 0x9250, 0x9250, 0x9250, 0x9250, 0x9250, - 0x080c, 0x0dc5, 0x080c, 0xac2b, 0x6114, 0x2148, 0xa87b, 0x0006, - 0x6010, 0x00b6, 0x2058, 0xb8bb, 0x0500, 0x00be, 0x080c, 0x6e9f, - 0x080c, 0xb2d3, 0x0005, 0x0461, 0x0005, 0x6000, 0x908a, 0x0010, - 0x1a0c, 0x0dc5, 0x0096, 0x0013, 0x009e, 0x0005, 0x927e, 0x927e, - 0x927e, 0x9280, 0x9290, 0x927e, 0x927e, 0x927e, 0x927e, 0x927e, - 0x927e, 0x927e, 0x927e, 0x927e, 0x927e, 0x927e, 0x080c, 0x0dc5, - 0x0036, 0x00e6, 0x2071, 0x19e8, 0x703c, 0x9c06, 0x1120, 0x2019, - 0x0000, 0x080c, 0xaa49, 0x080c, 0xac2b, 0x00ee, 0x003e, 0x0005, - 0x6024, 0xd08c, 0x11f0, 0x00f6, 0x00e6, 0x601b, 0x0000, 0x6014, - 0x2048, 0x6010, 0x9005, 0x0128, 0x00b6, 0x2058, 0x080c, 0x9067, - 0x00be, 0x2071, 0x193d, 0x080c, 0x8cb1, 0x0160, 0x2001, 0x187f, - 0x2004, 0xa88a, 0x2031, 0x0000, 0x2c78, 0x080c, 0x8c28, 0x00ee, - 0x00fe, 0x0005, 0x0096, 0xa88b, 0x0000, 0xa8a8, 0x2048, 0x080c, - 0x1040, 0x009e, 0xa8ab, 0x0000, 0x080c, 0x8c61, 0x0c80, 0x2001, - 0x1925, 0x200c, 0x918e, 0x0000, 0x190c, 0x8d17, 0x05c8, 0x00e6, - 0x2071, 0x1924, 0x7110, 0xc1c5, 0x7112, 0x080c, 0x8d21, 0x00f6, - 0x00c6, 0x2071, 0x1000, 0x00b6, 0x2e04, 0x905d, 0x0138, 0xb8ac, - 0x9065, 0x0120, 0x080c, 0x8cf7, 0x090c, 0x9096, 0x8e70, 0x9e86, - 0x1800, 0x1d90, 0x00be, 0x00d6, 0x0096, 0x0046, 0x2061, 0x1cd0, - 0x2001, 0x181a, 0x2024, 0x6020, 0x9086, 0x0000, 0x1191, 0x9ce0, - 0x0018, 0x2400, 0x9c06, 0x1db8, 0x004e, 0x009e, 0x00de, 0x00d1, - 0x00ce, 0x00fe, 0x2071, 0x1924, 0x7110, 0xc1c4, 0x7112, 0x00ee, - 0x0005, 0x6020, 0x9086, 0x0009, 0x1160, 0x6100, 0x9186, 0x0004, - 0x1138, 0x6110, 0x81ff, 0x190c, 0x0dc5, 0x2c00, 0x080c, 0x8ce2, - 0x9006, 0x0005, 0x2071, 0x193f, 0x2073, 0x0000, 0x8e70, 0x9e86, - 0x1947, 0x1dd0, 0x2071, 0x193d, 0x7006, 0x7002, 0x2001, 0x1930, - 0x2064, 0x8cff, 0x0130, 0x6120, 0x918e, 0x0000, 0x190c, 0x0dc5, - 0x2102, 0x2001, 0x188a, 0x200c, 0x81ff, 0x0148, 0x0096, 0x2148, - 0x080c, 0x1040, 0x009e, 0x2001, 0x188a, 0x2003, 0x0000, 0x2071, - 0x1931, 0x080c, 0x8f00, 0x0804, 0x8f0f, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x187a, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0126, 0x2091, 0x8000, - 0x0036, 0x0046, 0x20a9, 0x0010, 0x9006, 0x8004, 0x2019, 0x0100, - 0x231c, 0x93a6, 0x0008, 0x1118, 0x8086, 0x818e, 0x0020, 0x80f6, - 0x3e00, 0x81f6, 0x3e08, 0x1208, 0x9200, 0x1f04, 0x9356, 0x93a6, - 0x0008, 0x1118, 0x8086, 0x818e, 0x0020, 0x80f6, 0x3e00, 0x81f6, - 0x3e08, 0x004e, 0x003e, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, - 0x0076, 0x0156, 0x20a9, 0x0010, 0x9005, 0x0510, 0x911a, 0x1600, - 0x8213, 0x2039, 0x0100, 0x273c, 0x97be, 0x0008, 0x1110, 0x818d, - 0x0010, 0x81f5, 0x3e08, 0x0228, 0x911a, 0x1220, 0x1f04, 0x9380, - 0x0028, 0x911a, 0x2308, 0x8210, 0x1f04, 0x9380, 0x0006, 0x3200, - 0x9084, 0xefff, 0x2080, 0x000e, 0x015e, 0x007e, 0x012e, 0x0005, - 0x0006, 0x3200, 0x9085, 0x1000, 0x0ca8, 0x0126, 0x2091, 0x2800, - 0x2079, 0x19e8, 0x012e, 0x00d6, 0x2069, 0x19e8, 0x6803, 0x0005, - 0x0156, 0x0146, 0x01d6, 0x20e9, 0x0000, 0x2069, 0x0200, 0x080c, - 0xaf8e, 0x0401, 0x080c, 0xaf79, 0x00e9, 0x080c, 0xaf7c, 0x00d1, - 0x080c, 0xaf7f, 0x00b9, 0x080c, 0xaf82, 0x00a1, 0x080c, 0xaf85, - 0x0089, 0x080c, 0xaf88, 0x0071, 0x080c, 0xaf8b, 0x0059, 0x01de, - 0x014e, 0x015e, 0x2069, 0x0004, 0x2d04, 0x9085, 0x8001, 0x206a, - 0x00de, 0x0005, 0x20a9, 0x0020, 0x20a1, 0x0240, 0x2001, 0x0000, - 0x4004, 0x0005, 0x00c6, 0x6027, 0x0001, 0x7804, 0x9084, 0x0007, - 0x0002, 0x93f3, 0x9417, 0x9458, 0x93f9, 0x9417, 0x93f3, 0x93f1, - 0x93f1, 0x080c, 0x0dc5, 0x080c, 0x88c3, 0x080c, 0x9ab1, 0x00ce, - 0x0005, 0x62c0, 0x82ff, 0x1110, 0x00ce, 0x0005, 0x2011, 0x5f97, - 0x080c, 0x883d, 0x7828, 0x9092, 0x00c8, 0x1228, 0x8000, 0x782a, - 0x080c, 0x5fd7, 0x0c88, 0x62c0, 0x080c, 0xb0ca, 0x080c, 0x5f97, - 0x7807, 0x0003, 0x7827, 0x0000, 0x782b, 0x0000, 0x0c28, 0x080c, - 0x88c3, 0x6220, 0xd2a4, 0x0170, 0xd2cc, 0x0160, 0x782b, 0x0000, - 0x7824, 0x9065, 0x090c, 0x0dc5, 0x2009, 0x0013, 0x080c, 0xb352, - 0x00ce, 0x0005, 0x00c6, 0x7824, 0x9065, 0x090c, 0x0dc5, 0x7828, - 0x9092, 0xc350, 0x12c0, 0x8000, 0x782a, 0x00ce, 0x080c, 0x2bce, - 0x0278, 0x00c6, 0x7924, 0x2160, 0x6010, 0x906d, 0x090c, 0x0dc5, - 0x7807, 0x0000, 0x7827, 0x0000, 0x00ce, 0x080c, 0x9ab1, 0x0c00, - 0x080c, 0xa6c5, 0x08e8, 0x2011, 0x0130, 0x2214, 0x080c, 0xb0ca, - 0x080c, 0xf094, 0x2009, 0x0014, 0x080c, 0xb352, 0x00ce, 0x0880, - 0x2001, 0x1a04, 0x2003, 0x0000, 0x62c0, 0x82ff, 0x1160, 0x782b, - 0x0000, 0x7824, 0x9065, 0x090c, 0x0dc5, 0x2009, 0x0013, 0x080c, - 0xb3a4, 0x00ce, 0x0005, 0x00b6, 0x00c6, 0x00d6, 0x7824, 0x9005, - 0x090c, 0x0dc5, 0x7828, 0x9092, 0xc350, 0x1648, 0x8000, 0x782a, - 0x00de, 0x00ce, 0x00be, 0x080c, 0x2bce, 0x02f0, 0x00b6, 0x00c6, - 0x00d6, 0x781c, 0x905d, 0x090c, 0x0dc5, 0xb800, 0xc0dc, 0xb802, - 0x7924, 0x2160, 0x080c, 0xb2d3, 0xb93c, 0x81ff, 0x090c, 0x0dc5, - 0x8109, 0xb93e, 0x7807, 0x0000, 0x7827, 0x0000, 0x00de, 0x00ce, - 0x00be, 0x080c, 0x9ab1, 0x0868, 0x080c, 0xa6c5, 0x0850, 0x2011, - 0x0130, 0x2214, 0x080c, 0xb0ca, 0x080c, 0xf094, 0x7824, 0x9065, - 0x2009, 0x0014, 0x080c, 0xb352, 0x00de, 0x00ce, 0x00be, 0x0804, - 0x9469, 0x00c6, 0x2001, 0x009b, 0x2004, 0xd0fc, 0x190c, 0x1eeb, - 0x6024, 0x6027, 0x0002, 0xd0f4, 0x15b8, 0x62c8, 0x60c4, 0x9205, - 0x1170, 0x783c, 0x9065, 0x0130, 0x2009, 0x0049, 0x080c, 0xb352, - 0x00ce, 0x0005, 0x2011, 0x1a07, 0x2013, 0x0000, 0x0cc8, 0x793c, - 0x81ff, 0x0dc0, 0x7944, 0x9192, 0x7530, 0x1628, 0x8108, 0x7946, - 0x793c, 0x9188, 0x0008, 0x210c, 0x918e, 0x0006, 0x1138, 0x6014, - 0x9084, 0x1984, 0x9085, 0x0012, 0x6016, 0x0c10, 0x793c, 0x9188, - 0x0008, 0x210c, 0x918e, 0x0009, 0x0d90, 0x6014, 0x9084, 0x1984, - 0x9085, 0x0016, 0x6016, 0x08a0, 0x793c, 0x2160, 0x2009, 0x004a, - 0x080c, 0xb352, 0x0868, 0x7848, 0xc085, 0x784a, 0x0848, 0x0006, - 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, - 0x2061, 0x19e8, 0x6020, 0x8000, 0x6022, 0x6010, 0x9005, 0x0148, - 0x9080, 0x0003, 0x2102, 0x6112, 0x012e, 0x00ce, 0x001e, 0x000e, - 0x0005, 0x6116, 0x6112, 0x0cc0, 0x00d6, 0x2069, 0x19e8, 0xb800, - 0xd0d4, 0x0168, 0x6820, 0x8000, 0x6822, 0x9086, 0x0001, 0x1110, - 0x2b00, 0x681e, 0x00de, 0x0804, 0x9ab1, 0x00de, 0x0005, 0xc0d5, - 0xb802, 0x6818, 0x9005, 0x0168, 0xb856, 0xb85b, 0x0000, 0x0086, - 0x0006, 0x2b00, 0x681a, 0x008e, 0xa05a, 0x008e, 0x2069, 0x19e8, - 0x0c08, 0xb856, 0xb85a, 0x2b00, 0x681a, 0x681e, 0x08d8, 0x0006, - 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, - 0x2061, 0x19e8, 0x6020, 0x8000, 0x6022, 0x6008, 0x9005, 0x0148, - 0x9080, 0x0003, 0x2102, 0x610a, 0x012e, 0x00ce, 0x001e, 0x000e, - 0x0005, 0x610e, 0x610a, 0x0cc0, 0x00c6, 0x600f, 0x0000, 0x2c08, - 0x2061, 0x19e8, 0x6034, 0x9005, 0x0130, 0x9080, 0x0003, 0x2102, - 0x6136, 0x00ce, 0x0005, 0x613a, 0x6136, 0x00ce, 0x0005, 0x00f6, - 0x00e6, 0x00d6, 0x00c6, 0x00b6, 0x0096, 0x0076, 0x0066, 0x0056, - 0x0036, 0x0026, 0x0016, 0x0006, 0x0126, 0x902e, 0x2071, 0x19e8, - 0x7638, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, 0x0904, 0x95f3, - 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, 0x95ee, 0x87ff, 0x0120, - 0x6054, 0x9106, 0x1904, 0x95ee, 0x703c, 0x9c06, 0x1178, 0x0036, - 0x2019, 0x0001, 0x080c, 0xaa49, 0x7033, 0x0000, 0x9006, 0x703e, - 0x7042, 0x7046, 0x704a, 0x003e, 0x2029, 0x0001, 0x7038, 0x9c36, - 0x1110, 0x660c, 0x763a, 0x7034, 0x9c36, 0x1140, 0x2c00, 0x9f36, - 0x0118, 0x2f00, 0x7036, 0x0010, 0x7037, 0x0000, 0x660c, 0x0066, - 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, - 0x080c, 0xd0d8, 0x01f0, 0x6014, 0x2048, 0x6020, 0x9086, 0x0003, - 0x15b8, 0x6004, 0x9086, 0x0040, 0x090c, 0xac1b, 0xa867, 0x0103, - 0xab7a, 0xa877, 0x0000, 0x0016, 0x0036, 0x0076, 0x080c, 0xd3ce, - 0x080c, 0xef85, 0x080c, 0x6e9f, 0x007e, 0x003e, 0x001e, 0x080c, - 0xd2c3, 0x080c, 0xb306, 0x00ce, 0x0804, 0x958d, 0x2c78, 0x600c, - 0x2060, 0x0804, 0x958d, 0x85ff, 0x0120, 0x0036, 0x080c, 0x9bd3, - 0x003e, 0x012e, 0x000e, 0x001e, 0x002e, 0x003e, 0x005e, 0x006e, - 0x007e, 0x009e, 0x00be, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, - 0x6020, 0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0076, 0x080c, - 0xef85, 0x080c, 0xebd4, 0x007e, 0x003e, 0x001e, 0x0890, 0x6020, - 0x9086, 0x0009, 0x1168, 0xa87b, 0x0006, 0x0016, 0x0036, 0x0076, - 0x080c, 0x6e9f, 0x080c, 0xb2d3, 0x007e, 0x003e, 0x001e, 0x0818, - 0x6020, 0x9086, 0x000a, 0x0904, 0x95d8, 0x0804, 0x95d1, 0x0006, - 0x0066, 0x0096, 0x00c6, 0x00d6, 0x00f6, 0x9036, 0x0126, 0x2091, - 0x8000, 0x2079, 0x19e8, 0x7838, 0x9065, 0x0904, 0x9684, 0x600c, - 0x0006, 0x600f, 0x0000, 0x783c, 0x9c06, 0x1168, 0x0036, 0x2019, - 0x0001, 0x080c, 0xaa49, 0x7833, 0x0000, 0x901e, 0x7b3e, 0x7b42, - 0x7b46, 0x7b4a, 0x003e, 0x080c, 0xd0d8, 0x0548, 0x6014, 0x2048, - 0x6020, 0x9086, 0x0003, 0x1590, 0x3e08, 0x918e, 0x0002, 0x1188, - 0x6010, 0x9005, 0x0170, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, - 0x0140, 0x6040, 0x9005, 0x11a8, 0x2001, 0x1988, 0x2004, 0x6042, - 0x0080, 0x6004, 0x9086, 0x0040, 0x090c, 0xac1b, 0xa867, 0x0103, - 0xab7a, 0xa877, 0x0000, 0x080c, 0x6e92, 0x080c, 0xd2c3, 0x080c, - 0xb306, 0x000e, 0x0804, 0x963c, 0x7e3a, 0x7e36, 0x012e, 0x00fe, - 0x00de, 0x00ce, 0x009e, 0x006e, 0x000e, 0x0005, 0x6020, 0x9086, - 0x0006, 0x1118, 0x080c, 0xebd4, 0x0c50, 0x6020, 0x9086, 0x0009, - 0x1130, 0xab7a, 0x080c, 0x6e9f, 0x080c, 0xb2d3, 0x0c10, 0x6020, - 0x9086, 0x000a, 0x09a8, 0x0868, 0x0016, 0x0026, 0x0086, 0x9046, - 0x0099, 0x080c, 0x978f, 0x008e, 0x002e, 0x001e, 0x0005, 0x00f6, - 0x0126, 0x2079, 0x19e8, 0x2091, 0x8000, 0x080c, 0x9826, 0x080c, - 0x98b6, 0x012e, 0x00fe, 0x0005, 0x00b6, 0x0096, 0x00f6, 0x00e6, - 0x00d6, 0x00c6, 0x0066, 0x0016, 0x0006, 0x0126, 0x2091, 0x8000, - 0x2071, 0x19e8, 0x7614, 0x2660, 0x2678, 0x8cff, 0x0904, 0x9754, - 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, 0x974f, 0x88ff, 0x0120, - 0x6054, 0x9106, 0x1904, 0x974f, 0x7024, 0x9c06, 0x1568, 0x2069, - 0x0100, 0x6820, 0xd0a4, 0x0110, 0xd0cc, 0x1508, 0x080c, 0x88c3, - 0x080c, 0xa6e9, 0x68c3, 0x0000, 0x080c, 0xac1b, 0x7027, 0x0000, - 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, - 0x0100, 0x080c, 0x2d39, 0x9006, 0x080c, 0x2d39, 0x2069, 0x0100, - 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0028, 0x6003, - 0x0009, 0x630a, 0x0804, 0x974f, 0x7014, 0x9c36, 0x1110, 0x660c, - 0x7616, 0x7010, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, - 0x7012, 0x0010, 0x7013, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, - 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x6014, 0x2048, - 0x080c, 0xd0d8, 0x01e8, 0x6020, 0x9086, 0x0003, 0x1580, 0x080c, - 0xd2e0, 0x1118, 0x080c, 0xbcb6, 0x0098, 0xa867, 0x0103, 0xab7a, - 0xa877, 0x0000, 0x0016, 0x0036, 0x0086, 0x080c, 0xd3ce, 0x080c, - 0xef85, 0x080c, 0x6e9f, 0x008e, 0x003e, 0x001e, 0x080c, 0xd2c3, - 0x080c, 0xb306, 0x080c, 0xaaf1, 0x00ce, 0x0804, 0x96cd, 0x2c78, - 0x600c, 0x2060, 0x0804, 0x96cd, 0x012e, 0x000e, 0x001e, 0x006e, - 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x009e, 0x00be, 0x0005, 0x6020, - 0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0086, 0x080c, 0xef85, - 0x080c, 0xebd4, 0x008e, 0x003e, 0x001e, 0x08d0, 0x080c, 0xbcb6, - 0x6020, 0x9086, 0x0002, 0x1160, 0x6004, 0x0006, 0x9086, 0x0085, - 0x000e, 0x0904, 0x9735, 0x9086, 0x008b, 0x0904, 0x9735, 0x0840, - 0x6020, 0x9086, 0x0005, 0x1920, 0x6004, 0x0006, 0x9086, 0x0085, - 0x000e, 0x09c8, 0x9086, 0x008b, 0x09b0, 0x0804, 0x9748, 0x00b6, - 0x00a6, 0x0096, 0x00c6, 0x0006, 0x0126, 0x2091, 0x8000, 0x9280, - 0x1000, 0x2004, 0x905d, 0x0904, 0x981f, 0x00f6, 0x00e6, 0x00d6, - 0x0066, 0x2071, 0x19e8, 0xbe54, 0x7018, 0x9b06, 0x1108, 0x761a, - 0x701c, 0x9b06, 0x1130, 0x86ff, 0x1118, 0x7018, 0x701e, 0x0008, - 0x761e, 0xb858, 0x904d, 0x0108, 0xae56, 0x96d5, 0x0000, 0x0110, - 0x2900, 0xb05a, 0xb857, 0x0000, 0xb85b, 0x0000, 0xb800, 0xc0d4, - 0xc0dc, 0xb802, 0x080c, 0x664c, 0x0904, 0x981b, 0x7624, 0x86ff, - 0x0904, 0x980a, 0x9680, 0x0005, 0x2004, 0x9906, 0x15d8, 0x00d6, - 0x2069, 0x0100, 0x68c0, 0x9005, 0x0560, 0x080c, 0x88c3, 0x080c, - 0xa6e9, 0x68c3, 0x0000, 0x080c, 0xac1b, 0x7027, 0x0000, 0x0036, - 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, - 0x080c, 0x2d39, 0x9006, 0x080c, 0x2d39, 0x2069, 0x0100, 0x6824, - 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x00de, 0x00c6, 0xb83c, - 0x9005, 0x0110, 0x8001, 0xb83e, 0x2660, 0x080c, 0xb306, 0x00ce, - 0x0048, 0x00de, 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, - 0x0804, 0x97c2, 0x89ff, 0x0158, 0xa867, 0x0103, 0xab7a, 0xa877, - 0x0000, 0x080c, 0xd3ce, 0x080c, 0xef85, 0x080c, 0x6e9f, 0x080c, - 0xaaf1, 0x0804, 0x97c2, 0x006e, 0x00de, 0x00ee, 0x00fe, 0x012e, - 0x000e, 0x00ce, 0x009e, 0x00ae, 0x00be, 0x0005, 0x0096, 0x0006, - 0x0066, 0x00c6, 0x00d6, 0x9036, 0x7814, 0x9065, 0x0904, 0x9889, - 0x600c, 0x0006, 0x600f, 0x0000, 0x7824, 0x9c06, 0x1580, 0x2069, - 0x0100, 0x6820, 0xd0a4, 0x0110, 0xd0cc, 0x1508, 0x080c, 0x88c3, - 0x080c, 0xa6e9, 0x68c3, 0x0000, 0x080c, 0xac1b, 0x7827, 0x0000, - 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, - 0x0100, 0x080c, 0x2d39, 0x9006, 0x080c, 0x2d39, 0x2069, 0x0100, - 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0040, 0x080c, - 0x6a3b, 0x1520, 0x6003, 0x0009, 0x630a, 0x2c30, 0x00f8, 0x6014, - 0x2048, 0x080c, 0xd0d6, 0x01b0, 0x6020, 0x9086, 0x0003, 0x1508, - 0x080c, 0xd2e0, 0x1118, 0x080c, 0xbcb6, 0x0060, 0x080c, 0x6a3b, - 0x1168, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6e9f, - 0x080c, 0xd2c3, 0x080c, 0xb306, 0x080c, 0xaaf1, 0x000e, 0x0804, - 0x982d, 0x7e16, 0x7e12, 0x00de, 0x00ce, 0x006e, 0x000e, 0x009e, - 0x0005, 0x6020, 0x9086, 0x0006, 0x1118, 0x080c, 0xebd4, 0x0c50, - 0x080c, 0xbcb6, 0x6020, 0x9086, 0x0002, 0x1150, 0x6004, 0x0006, - 0x9086, 0x0085, 0x000e, 0x0990, 0x9086, 0x008b, 0x0978, 0x08d0, - 0x6020, 0x9086, 0x0005, 0x19b0, 0x6004, 0x0006, 0x9086, 0x0085, - 0x000e, 0x0d18, 0x9086, 0x008b, 0x0d00, 0x0860, 0x0006, 0x0066, - 0x0096, 0x00b6, 0x00c6, 0x00d6, 0x7818, 0x905d, 0x0904, 0x9936, - 0xb854, 0x0006, 0x9006, 0xb856, 0xb85a, 0xb800, 0xc0d4, 0xc0dc, - 0xb802, 0x080c, 0x664c, 0x0904, 0x9933, 0x7e24, 0x86ff, 0x0904, - 0x9926, 0x9680, 0x0005, 0x2004, 0x9906, 0x1904, 0x9926, 0x00d6, - 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0x991d, 0x080c, 0x88c3, - 0x080c, 0xa6e9, 0x68c3, 0x0000, 0x080c, 0xac1b, 0x7827, 0x0000, - 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, - 0x0100, 0x080c, 0x2d39, 0x9006, 0x080c, 0x2d39, 0x2069, 0x0100, - 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x00de, 0x00c6, - 0x3e08, 0x918e, 0x0002, 0x1168, 0xb800, 0xd0bc, 0x0150, 0x9680, - 0x0010, 0x200c, 0x81ff, 0x1518, 0x2009, 0x1988, 0x210c, 0x2102, - 0x00f0, 0xb83c, 0x9005, 0x0110, 0x8001, 0xb83e, 0x2660, 0x600f, - 0x0000, 0x080c, 0xb306, 0x00ce, 0x0048, 0x00de, 0x00c6, 0x2660, - 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x98c9, 0x89ff, 0x0138, - 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6e9f, 0x080c, - 0xaaf1, 0x0804, 0x98c9, 0x000e, 0x0804, 0x98bd, 0x781e, 0x781a, - 0x00de, 0x00ce, 0x00be, 0x009e, 0x006e, 0x000e, 0x0005, 0x00e6, - 0x00d6, 0x0096, 0x0066, 0xb800, 0xd0dc, 0x01a0, 0xb84c, 0x904d, - 0x0188, 0xa878, 0x9606, 0x1170, 0x2071, 0x19e8, 0x7024, 0x9035, - 0x0148, 0x9080, 0x0005, 0x2004, 0x9906, 0x1120, 0xb800, 0xc0dc, - 0xb802, 0x0029, 0x006e, 0x009e, 0x00de, 0x00ee, 0x0005, 0x00f6, - 0x2079, 0x0100, 0x78c0, 0x9005, 0x1138, 0x00c6, 0x2660, 0x6003, - 0x0009, 0x630a, 0x00ce, 0x04b8, 0x080c, 0xa6e9, 0x78c3, 0x0000, - 0x080c, 0xac1b, 0x7027, 0x0000, 0x0036, 0x2079, 0x0140, 0x7b04, - 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2d39, 0x9006, - 0x080c, 0x2d39, 0x2079, 0x0100, 0x7824, 0xd084, 0x0110, 0x7827, - 0x0001, 0x080c, 0xac1b, 0x003e, 0x080c, 0x664c, 0x00c6, 0xb83c, - 0x9005, 0x0110, 0x8001, 0xb83e, 0x2660, 0x080c, 0xb2d3, 0x00ce, - 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xd3ce, 0x080c, - 0x6e9f, 0x080c, 0xaaf1, 0x00fe, 0x0005, 0x00b6, 0x00e6, 0x00c6, - 0x2011, 0x0101, 0x2204, 0xc0c4, 0x2012, 0x2001, 0x180c, 0x2014, - 0xc2e4, 0x2202, 0x2071, 0x19e8, 0x7004, 0x9084, 0x0007, 0x0002, - 0x99c2, 0x99c6, 0x99e4, 0x9a0d, 0x9a4b, 0x99c2, 0x99dd, 0x99c0, - 0x080c, 0x0dc5, 0x00ce, 0x00ee, 0x00be, 0x0005, 0x7024, 0x9065, - 0x0148, 0x7020, 0x8001, 0x7022, 0x600c, 0x9015, 0x0158, 0x7216, - 0x600f, 0x0000, 0x7007, 0x0000, 0x7027, 0x0000, 0x00ce, 0x00ee, - 0x00be, 0x0005, 0x7216, 0x7212, 0x0ca8, 0x7007, 0x0000, 0x7027, - 0x0000, 0x7020, 0x9005, 0x0070, 0x6010, 0x2058, 0x080c, 0x664c, - 0xb800, 0xc0dc, 0xb802, 0x7007, 0x0000, 0x7027, 0x0000, 0x7020, - 0x8001, 0x7022, 0x1148, 0x2001, 0x180c, 0x2014, 0xd2ec, 0x1180, - 0x00ce, 0x00ee, 0x00be, 0x0005, 0xb854, 0x9015, 0x0120, 0x721e, - 0x080c, 0x9ab1, 0x0ca8, 0x7218, 0x721e, 0x080c, 0x9ab1, 0x0c80, - 0xc2ec, 0x2202, 0x080c, 0x9bd3, 0x0c58, 0x7024, 0x9065, 0x05b8, - 0x700c, 0x9c06, 0x1160, 0x080c, 0xaaf1, 0x600c, 0x9015, 0x0120, - 0x720e, 0x600f, 0x0000, 0x0448, 0x720e, 0x720a, 0x0430, 0x7014, - 0x9c06, 0x1160, 0x080c, 0xaaf1, 0x600c, 0x9015, 0x0120, 0x7216, - 0x600f, 0x0000, 0x00d0, 0x7216, 0x7212, 0x00b8, 0x6020, 0x9086, - 0x0003, 0x1198, 0x6010, 0x2058, 0x080c, 0x664c, 0xb800, 0xc0dc, - 0xb802, 0x080c, 0xaaf1, 0x701c, 0x9065, 0x0138, 0xb854, 0x9015, - 0x0110, 0x721e, 0x0010, 0x7218, 0x721e, 0x7027, 0x0000, 0x00ce, - 0x00ee, 0x00be, 0x0005, 0x7024, 0x9065, 0x0140, 0x080c, 0xaaf1, - 0x600c, 0x9015, 0x0158, 0x720e, 0x600f, 0x0000, 0x080c, 0xac1b, - 0x7027, 0x0000, 0x00ce, 0x00ee, 0x00be, 0x0005, 0x720e, 0x720a, - 0x0ca8, 0x00d6, 0x2069, 0x19e8, 0x6830, 0x9084, 0x0003, 0x0002, - 0x9a6e, 0x9a70, 0x9a94, 0x9a6c, 0x080c, 0x0dc5, 0x00de, 0x0005, - 0x00c6, 0x6840, 0x9086, 0x0001, 0x01b8, 0x683c, 0x9065, 0x0130, - 0x600c, 0x9015, 0x0170, 0x6a3a, 0x600f, 0x0000, 0x6833, 0x0000, - 0x683f, 0x0000, 0x2011, 0x1a07, 0x2013, 0x0000, 0x00ce, 0x00de, - 0x0005, 0x683a, 0x6836, 0x0c90, 0x6843, 0x0000, 0x6838, 0x9065, - 0x0d68, 0x6003, 0x0003, 0x0c50, 0x00c6, 0x9006, 0x6842, 0x6846, - 0x684a, 0x683c, 0x9065, 0x0160, 0x600c, 0x9015, 0x0130, 0x6a3a, - 0x600f, 0x0000, 0x683f, 0x0000, 0x0018, 0x683e, 0x683a, 0x6836, - 0x00ce, 0x00de, 0x0005, 0x2001, 0x180c, 0x200c, 0xc1e5, 0x2102, - 0x0005, 0x2001, 0x180c, 0x200c, 0xd1ec, 0x0120, 0xc1ec, 0x2102, - 0x080c, 0x9bd3, 0x2001, 0x19f4, 0x2004, 0x9086, 0x0001, 0x0d58, - 0x00d6, 0x2069, 0x19e8, 0x6804, 0x9084, 0x0007, 0x0006, 0x9005, - 0x11c8, 0x2001, 0x1837, 0x2004, 0x9084, 0x0028, 0x1198, 0x2001, - 0x197c, 0x2004, 0x9086, 0xaaaa, 0x0168, 0x2001, 0x188b, 0x2004, - 0xd08c, 0x1118, 0xd084, 0x1118, 0x0028, 0x080c, 0x9bd3, 0x000e, - 0x00de, 0x0005, 0x000e, 0x0002, 0x9aee, 0x9ba7, 0x9ba7, 0x9ba7, - 0x9ba7, 0x9ba9, 0x9ba7, 0x9aec, 0x080c, 0x0dc5, 0x6820, 0x9005, - 0x1110, 0x00de, 0x0005, 0x00c6, 0x680c, 0x9065, 0x01f0, 0x6104, - 0x918e, 0x0040, 0x1180, 0x2009, 0x1837, 0x210c, 0x918c, 0x0028, - 0x1150, 0x080c, 0x7637, 0x0138, 0x0006, 0x2009, 0x188b, 0x2104, - 0xc095, 0x200a, 0x000e, 0x6807, 0x0004, 0x6826, 0x682b, 0x0000, - 0x080c, 0x9c7c, 0x00ce, 0x00de, 0x0005, 0x6814, 0x9065, 0x0150, - 0x6807, 0x0001, 0x6826, 0x682b, 0x0000, 0x080c, 0x9c7c, 0x00ce, - 0x00de, 0x0005, 0x00b6, 0x00e6, 0x6a1c, 0x92dd, 0x0000, 0x0904, - 0x9b91, 0xb84c, 0x900d, 0x0118, 0xb888, 0x9005, 0x01a0, 0xb854, - 0x905d, 0x0120, 0x920e, 0x0904, 0x9b91, 0x0028, 0x6818, 0x920e, - 0x0904, 0x9b91, 0x2058, 0xb84c, 0x900d, 0x0d88, 0xb888, 0x9005, - 0x1d70, 0x2b00, 0x681e, 0xbb3c, 0xb838, 0x9302, 0x1e40, 0x080c, - 0xb2aa, 0x0904, 0x9b91, 0x8318, 0xbb3e, 0x6116, 0x2b10, 0x6212, - 0x0096, 0x2148, 0xa880, 0x9084, 0x00ff, 0x605e, 0xa883, 0x0000, - 0xa884, 0x009e, 0x908a, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, - 0x801b, 0x831b, 0x9318, 0x631a, 0x6114, 0x0096, 0x2148, 0xa964, - 0x009e, 0x918c, 0x00ff, 0x918e, 0x0048, 0x0538, 0x00f6, 0x2c78, - 0x2061, 0x0100, 0xbac0, 0x629a, 0x2069, 0x0200, 0x2071, 0x0240, - 0x080c, 0xa219, 0x2069, 0x19e8, 0xbb00, 0xc3dd, 0xbb02, 0x6807, - 0x0002, 0x2f18, 0x6b26, 0x682b, 0x0000, 0x7823, 0x0003, 0x7803, - 0x0001, 0x7807, 0x0040, 0x00fe, 0x00ee, 0x00be, 0x00ce, 0x00de, - 0x0005, 0x00ee, 0x00be, 0x00ce, 0x0cd0, 0x6807, 0x0006, 0x2c18, - 0x6b26, 0x6820, 0x8001, 0x6822, 0x682b, 0x0000, 0x080c, 0x664c, - 0x080c, 0xb0ea, 0x00ee, 0x00be, 0x00ce, 0x00de, 0x0005, 0x00de, - 0x0005, 0x00c6, 0x680c, 0x9065, 0x01d8, 0x6104, 0x918e, 0x0040, - 0x1180, 0x2009, 0x1837, 0x210c, 0x918c, 0x0028, 0x1150, 0x080c, - 0x7637, 0x0138, 0x0006, 0x2009, 0x188b, 0x2104, 0xc095, 0x200a, - 0x000e, 0x6807, 0x0004, 0x6826, 0x682b, 0x0000, 0x080c, 0x9c7c, - 0x00ce, 0x00de, 0x0005, 0x2001, 0x180c, 0x2014, 0xc2ed, 0x2202, - 0x00de, 0x00fe, 0x0005, 0x00f6, 0x00d6, 0x2069, 0x19e8, 0x6830, - 0x9086, 0x0000, 0x1570, 0x2001, 0x180c, 0x2014, 0xd2e4, 0x0130, - 0xc2e4, 0x2202, 0x080c, 0x9ac0, 0x2069, 0x19e8, 0x2001, 0x180c, - 0x200c, 0xd1c4, 0x1508, 0x6838, 0x907d, 0x01d8, 0x6a04, 0x9296, - 0x0000, 0x1904, 0x9c70, 0x7920, 0x918e, 0x0009, 0x0568, 0x6833, - 0x0001, 0x683e, 0x6847, 0x0000, 0x684b, 0x0000, 0x0126, 0x00f6, - 0x2091, 0x2400, 0x002e, 0x080c, 0x1c79, 0x1158, 0x012e, 0x080c, - 0xa546, 0x00de, 0x00fe, 0x0005, 0xc1c4, 0x2102, 0x080c, 0x76e4, - 0x08d0, 0x012e, 0x6843, 0x0000, 0x7803, 0x0002, 0x780c, 0x9015, - 0x0140, 0x6a3a, 0x780f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, - 0x0c40, 0x683a, 0x6836, 0x0cc0, 0x7908, 0xd1fc, 0x1198, 0x6833, - 0x0001, 0x683e, 0x6847, 0x0000, 0x684b, 0x0000, 0x0126, 0x00f6, - 0x2091, 0x2400, 0x002e, 0x080c, 0x1c79, 0x19d8, 0x012e, 0x080c, - 0xa4c7, 0x0878, 0x2001, 0x1837, 0x2004, 0x9084, 0x0028, 0x1188, - 0x2001, 0x197c, 0x2004, 0x9086, 0xaaaa, 0x0158, 0x2001, 0x19e9, - 0x2004, 0x9005, 0x11f0, 0x2001, 0x188b, 0x200c, 0xc185, 0xc18c, - 0x2102, 0x2f00, 0x6833, 0x0001, 0x683e, 0x6847, 0x0000, 0x684b, - 0x0000, 0x0126, 0x00f6, 0x2091, 0x2400, 0x002e, 0x080c, 0x1c79, - 0x1904, 0x9c11, 0x012e, 0x6a3c, 0x2278, 0x080c, 0xa451, 0x0804, - 0x9c09, 0x2011, 0x188b, 0x2204, 0xc08d, 0x2012, 0x0804, 0x9c09, - 0x6a04, 0x9296, 0x0006, 0x1904, 0x9bcb, 0x6a30, 0x9296, 0x0000, - 0x0904, 0x9bf3, 0x0804, 0x9bcb, 0x6020, 0x9084, 0x000f, 0x000b, - 0x0005, 0x9c90, 0x9c95, 0xa149, 0xa1e2, 0x9c95, 0xa149, 0xa1e2, - 0x9c90, 0x9c95, 0x9c90, 0x9c90, 0x9c90, 0x9c90, 0x9c90, 0x9c90, - 0x080c, 0x99a5, 0x080c, 0x9ab1, 0x0005, 0x00b6, 0x0156, 0x0136, - 0x0146, 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, - 0x0200, 0x2071, 0x0240, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0dc5, - 0x6110, 0x2158, 0xb9c0, 0x2c78, 0x2061, 0x0100, 0x619a, 0x908a, - 0x0040, 0x1a04, 0x9d01, 0x005b, 0x00fe, 0x00ee, 0x00de, 0x00ce, - 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, 0x00be, 0x0005, 0x9eaa, - 0x9ee5, 0x9f0e, 0x9fd8, 0x9ffa, 0xa000, 0xa00d, 0xa015, 0xa021, - 0xa027, 0xa038, 0xa027, 0xa090, 0xa015, 0xa09c, 0xa0a2, 0xa021, - 0xa0a2, 0xa0ae, 0x9cff, 0x9cff, 0x9cff, 0x9cff, 0x9cff, 0x9cff, - 0x9cff, 0x9cff, 0x9cff, 0x9cff, 0x9cff, 0xa900, 0xa923, 0xa934, - 0xa954, 0xa986, 0xa00d, 0x9cff, 0xa00d, 0xa027, 0x9cff, 0x9f0e, - 0x9fd8, 0x9cff, 0xad12, 0xa027, 0x9cff, 0xad2e, 0xa027, 0x9cff, - 0xa021, 0x9ea4, 0x9d22, 0x9cff, 0xad4a, 0xadb7, 0xae92, 0x9cff, - 0xae9f, 0xa00a, 0xaeca, 0x9cff, 0xa990, 0xaef7, 0x9cff, 0x080c, - 0x0dc5, 0x2100, 0x005b, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, - 0x01ce, 0x014e, 0x013e, 0x015e, 0x00be, 0x0005, 0xaf92, 0xb044, - 0x9d20, 0x9d5a, 0x9e06, 0x9e11, 0x9d20, 0xa00d, 0x9d20, 0x9e6b, - 0x9e77, 0x9d75, 0x9d20, 0x9d90, 0x9dc4, 0xb1b1, 0xb1f6, 0xa027, - 0x080c, 0x0dc5, 0x00d6, 0x0096, 0x080c, 0xa0c1, 0x0026, 0x0036, - 0x7814, 0x2048, 0xa958, 0xd1cc, 0x1138, 0x2009, 0x2414, 0x2011, - 0x0018, 0x2019, 0x0018, 0x0030, 0x2009, 0x2410, 0x2011, 0x0014, - 0x2019, 0x0014, 0x7102, 0x7206, 0x700b, 0x0800, 0xa83c, 0x700e, - 0xa850, 0x7022, 0xa854, 0x7026, 0x63c2, 0x080c, 0xa6bd, 0x003e, - 0x002e, 0x009e, 0x00de, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb8a0, - 0x00be, 0x080c, 0xb23d, 0x1118, 0x9084, 0xff80, 0x0110, 0x9085, - 0x0001, 0x0005, 0x00d6, 0x0096, 0x080c, 0xa0c1, 0x7003, 0x0500, - 0x7814, 0x2048, 0xa874, 0x700a, 0xa878, 0x700e, 0xa87c, 0x7012, - 0xa880, 0x7016, 0xa884, 0x701a, 0xa888, 0x701e, 0x60c3, 0x0010, - 0x080c, 0xa6bd, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x080c, - 0xa0c1, 0x7003, 0x0500, 0x7814, 0x2048, 0xa8cc, 0x700a, 0xa8d0, - 0x700e, 0xa8d4, 0x7012, 0xa8d8, 0x7016, 0xa8dc, 0x701a, 0xa8e0, - 0x701e, 0x60c3, 0x0010, 0x080c, 0xa6bd, 0x009e, 0x00de, 0x0005, - 0x00d6, 0x0096, 0x0126, 0x2091, 0x8000, 0x080c, 0xa0c1, 0x20e9, - 0x0000, 0x2001, 0x19a4, 0x2003, 0x0000, 0x7814, 0x2048, 0xa814, - 0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, - 0x001b, 0x2098, 0x2001, 0x19a4, 0x0016, 0x200c, 0x2001, 0x0001, - 0x080c, 0x23ee, 0x080c, 0xde7c, 0x9006, 0x080c, 0x23ee, 0x001e, - 0xa804, 0x9005, 0x0110, 0x2048, 0x0c28, 0x04d9, 0x080c, 0xa6bd, - 0x012e, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x0126, 0x2091, - 0x8000, 0x080c, 0xa10c, 0x20e9, 0x0000, 0x2001, 0x19a4, 0x2003, - 0x0000, 0x7814, 0x2048, 0xa86f, 0x0200, 0xa873, 0x0000, 0xa814, - 0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, - 0x001b, 0x2098, 0x2001, 0x19a4, 0x0016, 0x200c, 0x080c, 0xde7c, - 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c60, 0x0051, 0x7814, - 0x2048, 0x080c, 0x0fc0, 0x080c, 0xa6bd, 0x012e, 0x009e, 0x00de, - 0x0005, 0x60c0, 0x8004, 0x9084, 0x0003, 0x9005, 0x0130, 0x9082, - 0x0004, 0x20a3, 0x0000, 0x8000, 0x1de0, 0x0005, 0x080c, 0xa0c1, - 0x7003, 0x7800, 0x7808, 0x8007, 0x700a, 0x60c3, 0x0008, 0x0804, - 0xa6bd, 0x00d6, 0x00e6, 0x080c, 0xa10c, 0x7814, 0x9084, 0xff00, - 0x2073, 0x0200, 0x8e70, 0x8e70, 0x9096, 0xdf00, 0x0138, 0x9096, - 0xe000, 0x0120, 0x2073, 0x0010, 0x8e70, 0x0030, 0x9095, 0x0010, - 0x2272, 0x8e70, 0x2073, 0x0034, 0x8e70, 0x2069, 0x1805, 0x20a9, - 0x0004, 0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x9e31, 0x2069, 0x1801, - 0x20a9, 0x0004, 0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x9e3a, 0x9096, - 0xdf00, 0x0130, 0x9096, 0xe000, 0x0118, 0x60c3, 0x0018, 0x00f0, - 0x2069, 0x19b4, 0x9086, 0xdf00, 0x0110, 0x2069, 0x19ce, 0x20a9, - 0x001a, 0x9e86, 0x0260, 0x1148, 0x00c6, 0x2061, 0x0200, 0x6010, - 0x8000, 0x6012, 0x00ce, 0x2071, 0x0240, 0x2d04, 0x8007, 0x2072, - 0x8d68, 0x8e70, 0x1f04, 0x9e51, 0x60c3, 0x004c, 0x080c, 0xa6bd, - 0x00ee, 0x00de, 0x0005, 0x080c, 0xa0c1, 0x7003, 0x6300, 0x7007, - 0x0028, 0x7808, 0x700e, 0x60c3, 0x0008, 0x0804, 0xa6bd, 0x00d6, - 0x0026, 0x0016, 0x080c, 0xa10c, 0x7003, 0x0200, 0x7814, 0x700e, - 0x00e6, 0x9ef0, 0x0004, 0x2009, 0x0001, 0x2011, 0x000c, 0x2069, - 0x1924, 0x6810, 0xd084, 0x1148, 0x2073, 0x0500, 0x8e70, 0x2073, - 0x0000, 0x8e70, 0x8108, 0x9290, 0x0004, 0x2073, 0x0800, 0x8e70, - 0x2073, 0x0000, 0x00ee, 0x7206, 0x710a, 0x62c2, 0x080c, 0xa6bd, - 0x001e, 0x002e, 0x00de, 0x0005, 0x2001, 0x1818, 0x2004, 0x609a, - 0x0804, 0xa6bd, 0x080c, 0xa0c1, 0x7003, 0x5200, 0x2069, 0x1847, - 0x6804, 0xd084, 0x0130, 0x6828, 0x0016, 0x080c, 0x28a6, 0x710e, - 0x001e, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, - 0x0000, 0x20a1, 0x0250, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, - 0x20a1, 0x0254, 0x4003, 0x080c, 0xb23d, 0x1120, 0xb8a0, 0x9082, - 0x007f, 0x0248, 0x2001, 0x181f, 0x2004, 0x7032, 0x2001, 0x1820, - 0x2004, 0x7036, 0x0030, 0x2001, 0x1818, 0x2004, 0x9084, 0x00ff, - 0x7036, 0x60c3, 0x001c, 0x0804, 0xa6bd, 0x080c, 0xa0c1, 0x7003, - 0x0500, 0x080c, 0xb23d, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, - 0x2001, 0x181f, 0x2004, 0x700a, 0x2001, 0x1820, 0x2004, 0x700e, - 0x0030, 0x2001, 0x1818, 0x2004, 0x9084, 0x00ff, 0x700e, 0x20a9, - 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, - 0x0250, 0x4003, 0x60c3, 0x0010, 0x0804, 0xa6bd, 0x080c, 0xa0c1, - 0x9006, 0x080c, 0x6a6d, 0xb8a0, 0x9086, 0x007e, 0x1170, 0x2011, - 0x0240, 0x2013, 0x22ff, 0x2011, 0x0241, 0x2013, 0xfffe, 0x7003, - 0x0400, 0x620c, 0xc2b4, 0x620e, 0x0058, 0x7814, 0x0096, 0x904d, - 0x0120, 0x9006, 0xa89a, 0xa8a6, 0xa8aa, 0x009e, 0x7003, 0x0300, - 0xb8a0, 0x9086, 0x007e, 0x1904, 0x9f98, 0x00d6, 0x2069, 0x196c, - 0x2001, 0x1837, 0x2004, 0xd0a4, 0x0188, 0x6800, 0x700a, 0x6808, - 0x9084, 0x2000, 0x7012, 0x080c, 0xb254, 0x680c, 0x7016, 0x701f, - 0x2710, 0x6818, 0x7022, 0x681c, 0x7026, 0x0428, 0x6800, 0x700a, - 0x6804, 0x700e, 0x2009, 0x180d, 0x210c, 0xd18c, 0x0110, 0x2001, - 0x0002, 0x00f6, 0x2079, 0x0100, 0x080c, 0x7637, 0x1128, 0x78e3, - 0x0000, 0x080c, 0x28e7, 0x78e2, 0x00fe, 0x6808, 0x080c, 0x7637, - 0x1118, 0x9084, 0x37ff, 0x0010, 0x9084, 0x3fff, 0x7012, 0x080c, - 0xb254, 0x680c, 0x7016, 0x00de, 0x20a9, 0x0004, 0x20e1, 0x0001, - 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, 0x20a9, - 0x0004, 0x2099, 0x1801, 0x20a1, 0x025a, 0x4003, 0x00d6, 0x080c, - 0xaf79, 0x2069, 0x1974, 0x2071, 0x024e, 0x6800, 0xc0dd, 0x7002, - 0x080c, 0x57d9, 0xd0e4, 0x0110, 0x680c, 0x700e, 0x00de, 0x04e0, - 0x2001, 0x1837, 0x2004, 0xd0a4, 0x01a8, 0x0016, 0x2001, 0x180d, - 0x2004, 0xd08c, 0x2009, 0x0002, 0x1118, 0x2001, 0x196d, 0x200c, - 0x60e0, 0x9106, 0x0130, 0x2100, 0x60e3, 0x0000, 0x080c, 0x28e7, - 0x61e2, 0x001e, 0x20e1, 0x0001, 0x2099, 0x196c, 0x20e9, 0x0000, - 0x20a1, 0x024e, 0x20a9, 0x0008, 0x4003, 0x20a9, 0x0004, 0x2099, - 0x1805, 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, - 0x20a1, 0x025a, 0x4003, 0x080c, 0xaf79, 0x20a1, 0x024e, 0x20a9, - 0x0008, 0x2099, 0x1974, 0x4003, 0x60c3, 0x0074, 0x0804, 0xa6bd, - 0x080c, 0xa0c1, 0x7003, 0x2010, 0x7007, 0x0014, 0x700b, 0x0800, - 0x700f, 0x2000, 0x9006, 0x00f6, 0x2079, 0x1847, 0x7904, 0x00fe, - 0xd1ac, 0x1110, 0x9085, 0x0020, 0xd1a4, 0x0110, 0x9085, 0x0010, - 0x9085, 0x0002, 0x00d6, 0x0804, 0xa071, 0x7026, 0x60c3, 0x0014, - 0x0804, 0xa6bd, 0x080c, 0xa0c1, 0x7003, 0x5000, 0x0804, 0x9f30, - 0x080c, 0xa0c1, 0x7003, 0x2110, 0x7007, 0x0014, 0x60c3, 0x0014, - 0x0804, 0xa6bd, 0x080c, 0xa103, 0x0010, 0x080c, 0xa10c, 0x7003, - 0x0200, 0x60c3, 0x0004, 0x0804, 0xa6bd, 0x080c, 0xa10c, 0x7003, - 0x0100, 0x700b, 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, - 0xa6bd, 0x080c, 0xa10c, 0x7003, 0x0200, 0x0804, 0x9f30, 0x080c, - 0xa10c, 0x7003, 0x0100, 0x782c, 0x9005, 0x0110, 0x700a, 0x0010, - 0x700b, 0x0003, 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, 0xa6bd, - 0x00d6, 0x080c, 0xa10c, 0x7003, 0x0210, 0x7007, 0x0014, 0x700b, - 0x0800, 0xb894, 0x9086, 0x0014, 0x1198, 0xb99c, 0x9184, 0x0030, - 0x0190, 0xb998, 0x9184, 0xc000, 0x1140, 0xd1ec, 0x0118, 0x700f, - 0x2100, 0x0058, 0x700f, 0x0100, 0x0040, 0x700f, 0x0400, 0x0028, - 0x700f, 0x0700, 0x0010, 0x700f, 0x0800, 0x00f6, 0x2079, 0x1847, - 0x7904, 0x00fe, 0xd1ac, 0x1110, 0x9085, 0x0020, 0xd1a4, 0x0110, - 0x9085, 0x0010, 0x2009, 0x1869, 0x210c, 0xd184, 0x1110, 0x9085, - 0x0002, 0x0026, 0x2009, 0x1867, 0x210c, 0xd1e4, 0x0150, 0xc0c5, - 0xbacc, 0xd28c, 0x1108, 0xc0cd, 0x9094, 0x0030, 0x9296, 0x0010, - 0x0140, 0xd1ec, 0x0130, 0x9094, 0x0030, 0x9296, 0x0010, 0x0108, - 0xc0bd, 0x002e, 0x7026, 0x60c3, 0x0014, 0x00de, 0x0804, 0xa6bd, - 0x080c, 0xa10c, 0x7003, 0x0210, 0x7007, 0x0014, 0x700f, 0x0100, - 0x60c3, 0x0014, 0x0804, 0xa6bd, 0x080c, 0xa10c, 0x7003, 0x0200, - 0x0804, 0x9eae, 0x080c, 0xa10c, 0x7003, 0x0100, 0x700b, 0x0003, - 0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, 0xa6bd, 0x080c, 0xa10c, - 0x7003, 0x0100, 0x700b, 0x000b, 0x60c3, 0x0008, 0x0804, 0xa6bd, - 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x3200, 0x2021, 0x0800, - 0x0040, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x2200, 0x2021, - 0x0100, 0x080c, 0xaf8e, 0xb810, 0x9305, 0x7002, 0xb814, 0x7006, - 0x2069, 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x9485, 0x0029, - 0x7012, 0x004e, 0x003e, 0x00de, 0x080c, 0xa6ab, 0x721a, 0x9f95, - 0x0000, 0x7222, 0x7027, 0xffff, 0x2071, 0x024c, 0x002e, 0x0005, - 0x0026, 0x080c, 0xaf8e, 0x7003, 0x02ff, 0x7007, 0xfffc, 0x00d6, - 0x2069, 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x00de, 0x7013, - 0x2029, 0x0c10, 0x7003, 0x0100, 0x7007, 0x0000, 0x700b, 0xfc02, - 0x700f, 0x0000, 0x0005, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, - 0x3300, 0x2021, 0x0800, 0x0040, 0x0026, 0x00d6, 0x0036, 0x0046, - 0x2019, 0x2300, 0x2021, 0x0100, 0x080c, 0xaf8e, 0xb810, 0x9305, - 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0xb810, 0x9005, 0x1140, - 0xb814, 0x9005, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe, 0x0020, - 0x687c, 0x700a, 0x6880, 0x700e, 0x0000, 0x9485, 0x0098, 0x7012, - 0x004e, 0x003e, 0x00de, 0x080c, 0xa6ab, 0x721a, 0x7a08, 0x7222, - 0x2f10, 0x7226, 0x2071, 0x024c, 0x002e, 0x0005, 0x080c, 0xa6ab, - 0x721a, 0x7a08, 0x7222, 0x7814, 0x7026, 0x2071, 0x024c, 0x002e, - 0x0005, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, - 0x2071, 0x0240, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0dc5, 0x908a, - 0x0092, 0x1a0c, 0x0dc5, 0x6110, 0x2158, 0xb9c0, 0x2c78, 0x2061, - 0x0100, 0x619a, 0x9082, 0x0085, 0x0033, 0x00fe, 0x00ee, 0x00de, - 0x00ce, 0x00be, 0x0005, 0xa17a, 0xa189, 0xa194, 0xa178, 0xa178, - 0xa178, 0xa17a, 0xa178, 0xa178, 0xa178, 0xa178, 0xa178, 0xa178, - 0x080c, 0x0dc5, 0x0411, 0x60c3, 0x0000, 0x0026, 0x080c, 0x2bce, - 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, 0x0804, - 0xa6bd, 0x0431, 0x7808, 0x700a, 0x7814, 0x700e, 0x7017, 0xffff, - 0x60c3, 0x000c, 0x0804, 0xa6bd, 0x04a1, 0x7003, 0x0003, 0x7007, - 0x0300, 0x60c3, 0x0004, 0x0804, 0xa6bd, 0x0026, 0x080c, 0xaf8e, - 0xb810, 0x9085, 0x8100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, - 0x687c, 0x700a, 0x6880, 0x700e, 0x7013, 0x0009, 0x0804, 0xa0dc, - 0x0026, 0x080c, 0xaf8e, 0xb810, 0x9085, 0x8400, 0x7002, 0xb814, - 0x7006, 0x2069, 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x2001, - 0x0099, 0x7a20, 0x9296, 0x0005, 0x0108, 0xc0bc, 0x7012, 0x0804, - 0xa13e, 0x0026, 0x080c, 0xaf8e, 0xb810, 0x9085, 0x8500, 0x7002, - 0xb814, 0x7006, 0x2069, 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, - 0x2001, 0x0099, 0x7a20, 0x9296, 0x0005, 0x0108, 0xc0bc, 0x7012, - 0x0804, 0xa13e, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2c78, - 0x2069, 0x0200, 0x2071, 0x0240, 0x7804, 0x908a, 0x0040, 0x0a0c, - 0x0dc5, 0x908a, 0x0054, 0x1a0c, 0x0dc5, 0x7910, 0x2158, 0xb9c0, - 0x2061, 0x0100, 0x619a, 0x9082, 0x0040, 0x0033, 0x00fe, 0x00ee, - 0x00de, 0x00ce, 0x00be, 0x0005, 0xa219, 0xa2e0, 0xa2b3, 0xa402, - 0xa217, 0xa217, 0xa217, 0xa217, 0xa217, 0xa217, 0xa217, 0xaad8, - 0xaadd, 0xaae2, 0xaae7, 0xa217, 0xaed6, 0xa217, 0xaad3, 0x080c, - 0x0dc5, 0x0096, 0x780b, 0xffff, 0x080c, 0xa284, 0x7914, 0x2148, - 0xa978, 0x7956, 0xae64, 0x96b4, 0x00ff, 0x9686, 0x0008, 0x1148, - 0xa8b4, 0x7032, 0xa8b8, 0x7036, 0xa8bc, 0x703a, 0xa8c0, 0x703e, - 0x0008, 0x7132, 0xa97c, 0x9184, 0x000f, 0x1118, 0x2001, 0x0005, - 0x0040, 0xd184, 0x0118, 0x2001, 0x0004, 0x0018, 0x9084, 0x0006, - 0x8004, 0x2010, 0x785c, 0x9084, 0x00ff, 0x8007, 0x9205, 0x7042, - 0xd1ac, 0x0158, 0x7047, 0x0002, 0x9686, 0x0008, 0x1118, 0x080c, - 0x18f7, 0x0010, 0x080c, 0x1768, 0x0050, 0xd1b4, 0x0118, 0x7047, - 0x0001, 0x0028, 0x7047, 0x0000, 0x9016, 0x2230, 0x0010, 0xaab0, - 0xaeac, 0x726a, 0x766e, 0x20a9, 0x0008, 0x20e9, 0x0000, 0xa860, - 0x20e0, 0xa85c, 0x9080, 0x0023, 0x2098, 0x20a1, 0x0252, 0x2069, - 0x0200, 0x6813, 0x0018, 0x4003, 0x6813, 0x0008, 0x60c3, 0x0020, - 0x6017, 0x0009, 0x2001, 0x1a04, 0x2003, 0x07d0, 0x2001, 0x1a03, - 0x2003, 0x0009, 0x009e, 0x0005, 0x6813, 0x0008, 0xba8c, 0x8210, - 0xb8cc, 0xd084, 0x0180, 0x2001, 0x1ad0, 0x200c, 0x8108, 0x2102, - 0x2001, 0x1acf, 0x201c, 0x1218, 0x8318, 0x2302, 0x0ea0, 0x794a, - 0x712e, 0x7b46, 0x732a, 0x9294, 0x00ff, 0xba8e, 0x8217, 0x721a, - 0xba10, 0x9295, 0x0600, 0x7202, 0xba14, 0x7206, 0x2069, 0x1800, - 0x6a7c, 0x720a, 0x6a80, 0x720e, 0x7013, 0x0829, 0x2f10, 0x7222, - 0x7027, 0xffff, 0x0005, 0x00d6, 0x0096, 0x0081, 0x7814, 0x2048, - 0xa890, 0x7002, 0xa88c, 0x7006, 0xa8b0, 0x700a, 0xa8ac, 0x700e, - 0x60c3, 0x000c, 0x009e, 0x00de, 0x0804, 0xa6bd, 0x6813, 0x0008, - 0xb810, 0x9085, 0x0500, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, - 0x687c, 0x700a, 0x6880, 0x700e, 0x7013, 0x0889, 0x080c, 0xa6ab, - 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x2071, 0x024c, 0x0005, - 0x00d6, 0x0096, 0x080c, 0xa3e0, 0x7814, 0x2048, 0x080c, 0xd0d6, - 0x1130, 0x7814, 0x9084, 0x0700, 0x8007, 0x0033, 0x0010, 0x9006, - 0x001b, 0x009e, 0x00de, 0x0005, 0xa2fe, 0xa367, 0xa377, 0xa39d, - 0xa3a9, 0xa3ba, 0xa3c2, 0xa2fc, 0x080c, 0x0dc5, 0x0016, 0x0036, - 0xa97c, 0x918c, 0x0003, 0x0118, 0x9186, 0x0003, 0x1198, 0xaba8, - 0x7824, 0xd0cc, 0x1168, 0x7316, 0xa898, 0x701a, 0xa894, 0x701e, - 0x003e, 0x001e, 0x2001, 0x19b2, 0x2004, 0x60c2, 0x0804, 0xa6bd, - 0xc3e5, 0x0c88, 0x9186, 0x0001, 0x190c, 0x0dc5, 0xaba8, 0x7824, - 0xd0cc, 0x1904, 0xa364, 0x7316, 0xa898, 0x701a, 0xa894, 0x701e, - 0xa8a4, 0x7026, 0xa8ac, 0x702e, 0x2009, 0x0018, 0x9384, 0x0300, - 0x0570, 0xd3c4, 0x0110, 0xa8ac, 0x9108, 0xd3cc, 0x0110, 0xa8a4, - 0x9108, 0x6810, 0x9085, 0x0010, 0x6812, 0x2011, 0x0258, 0x20e9, - 0x0000, 0x22a0, 0x0156, 0x20a9, 0x0008, 0xa860, 0x20e0, 0xa85c, - 0x9080, 0x002c, 0x2098, 0x4003, 0x6810, 0x8000, 0x6812, 0x2011, - 0x0240, 0x22a0, 0x20a9, 0x0005, 0x4003, 0x6810, 0xc0a4, 0x6812, - 0x015e, 0x9184, 0x0003, 0x0118, 0x2019, 0x0245, 0x201a, 0x61c2, - 0x003e, 0x001e, 0x0804, 0xa6bd, 0xc3e5, 0x0804, 0xa323, 0x2011, - 0x0008, 0x2001, 0x180f, 0x2004, 0xd0a4, 0x0110, 0x2011, 0x0028, - 0x7824, 0xd0cc, 0x1110, 0x7216, 0x0470, 0x0ce8, 0xc2e5, 0x2011, - 0x0302, 0x0016, 0x782c, 0x701a, 0x7930, 0x711e, 0x9105, 0x0108, - 0xc2dd, 0x001e, 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x7027, - 0x0012, 0x702f, 0x0008, 0x7043, 0x7000, 0x7047, 0x0500, 0x704f, - 0x000a, 0x2069, 0x0200, 0x6813, 0x0009, 0x2071, 0x0240, 0x700b, - 0x2500, 0x60c3, 0x0032, 0x0804, 0xa6bd, 0x2011, 0x0028, 0x7824, - 0xd0cc, 0x1128, 0x7216, 0x60c3, 0x0018, 0x0804, 0xa6bd, 0x0cd0, - 0xc2e5, 0x2011, 0x0100, 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, - 0x702f, 0x0008, 0x7858, 0x9084, 0x00ff, 0x7036, 0x60c3, 0x0020, - 0x0804, 0xa6bd, 0x2011, 0x0008, 0x7824, 0xd0cc, 0x0108, 0xc2e5, - 0x7216, 0x0c08, 0x0036, 0x7b14, 0x9384, 0xff00, 0x7816, 0x9384, - 0x00ff, 0x8001, 0x1138, 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, - 0x003e, 0x0888, 0x0046, 0x2021, 0x0800, 0x0006, 0x7824, 0xd0cc, - 0x000e, 0x0108, 0xc4e5, 0x7416, 0x004e, 0x701e, 0x003e, 0x0818, - 0x00d6, 0x6813, 0x0008, 0xb810, 0x9085, 0x0700, 0x7002, 0xb814, - 0x7006, 0x2069, 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x7824, - 0xd0cc, 0x1168, 0x7013, 0x0898, 0x080c, 0xa6ab, 0x721a, 0x7a08, - 0x7222, 0x2f10, 0x7226, 0x2071, 0x024c, 0x00de, 0x0005, 0x7013, - 0x0889, 0x0c90, 0x0016, 0x7814, 0x9084, 0x0700, 0x8007, 0x0013, - 0x001e, 0x0005, 0xa412, 0xa412, 0xa414, 0xa412, 0xa412, 0xa412, - 0xa42e, 0xa412, 0x080c, 0x0dc5, 0x7914, 0x918c, 0x08ff, 0x918d, - 0xf600, 0x7916, 0x2009, 0x0003, 0x00b9, 0x2069, 0x1847, 0x6804, - 0xd0bc, 0x0130, 0x682c, 0x9084, 0x00ff, 0x8007, 0x7032, 0x0010, - 0x7033, 0x3f00, 0x60c3, 0x0001, 0x0804, 0xa6bd, 0x2009, 0x0003, - 0x0019, 0x7033, 0x7f00, 0x0cb0, 0x0016, 0x080c, 0xaf8e, 0x001e, - 0xb810, 0x9085, 0x0100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, - 0x6a7c, 0x720a, 0x6a80, 0x720e, 0x7013, 0x0888, 0x918d, 0x0008, - 0x7116, 0x080c, 0xa6ab, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, - 0x0005, 0x00b6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056, 0x0046, - 0x0036, 0x2061, 0x0100, 0x2071, 0x1800, 0x7160, 0x7810, 0x2058, - 0x76dc, 0x96b4, 0x0028, 0x0110, 0x737c, 0x7480, 0x2500, 0x76dc, - 0x96b4, 0x0028, 0x0140, 0x2001, 0x04ff, 0x6062, 0x6067, 0xffff, - 0x636a, 0x646e, 0x0050, 0x2001, 0x00ff, 0x9085, 0x0400, 0x6062, - 0x6067, 0xffff, 0x606b, 0x0000, 0x616e, 0xb8b8, 0x6073, 0x0530, - 0x6077, 0x0008, 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, - 0x9085, 0x0020, 0x607a, 0x607f, 0x0000, 0x2b00, 0x6082, 0x6087, - 0xffff, 0x7814, 0x0096, 0x2048, 0xa838, 0x608a, 0xa834, 0x608e, - 0xa848, 0x60c6, 0xa844, 0x60ca, 0x009e, 0xb86c, 0x60ce, 0x60ab, - 0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000, 0x2001, 0x1837, 0x2004, - 0x9084, 0x0028, 0x0128, 0x609f, 0x0000, 0x2001, 0x0092, 0x0048, - 0x6028, 0xc0bd, 0x602a, 0x609f, 0x00ff, 0x6027, 0xffff, 0x2001, - 0x00b2, 0x6016, 0x2009, 0x07d0, 0x080c, 0x88c8, 0x003e, 0x004e, - 0x005e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00be, 0x0005, 0x00b6, - 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056, 0x0046, 0x0036, 0x2061, - 0x0100, 0x2071, 0x1800, 0x7160, 0x7810, 0x2058, 0xb8a0, 0x2028, - 0x76dc, 0xd6ac, 0x1168, 0x9582, 0x007e, 0x1250, 0x2500, 0x9094, - 0xff80, 0x1130, 0x9080, 0x33b6, 0x2015, 0x9294, 0x00ff, 0x0020, - 0xb910, 0xba14, 0x737c, 0x7480, 0x70dc, 0xd0ac, 0x1130, 0x9582, - 0x007e, 0x1218, 0x9584, 0xff80, 0x0138, 0x9185, 0x0400, 0x6062, - 0x6266, 0x636a, 0x646e, 0x0030, 0x6063, 0x0400, 0x6266, 0x606b, - 0x0000, 0x616e, 0xb8b8, 0x6072, 0x6077, 0x0000, 0xb864, 0xd0a4, - 0x0110, 0x6077, 0x0008, 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, - 0x8007, 0x9085, 0x0020, 0x607a, 0x607f, 0x0000, 0x2b00, 0x6082, - 0x6087, 0xffff, 0x7814, 0x0096, 0x2048, 0xa838, 0x608a, 0xa834, - 0x608e, 0xa848, 0x60c6, 0xa844, 0x60ca, 0x009e, 0xb86c, 0x60ce, - 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xbac0, 0x629e, - 0x00f6, 0x2079, 0x0140, 0x7803, 0x0000, 0x00fe, 0x2009, 0x0092, - 0x6116, 0x2009, 0x07d0, 0x080c, 0x88c8, 0x003e, 0x004e, 0x005e, - 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00be, 0x0005, 0x00b6, 0x0096, - 0x00e6, 0x00d6, 0x00c6, 0x0056, 0x0046, 0x0036, 0x2061, 0x0100, - 0x2071, 0x1800, 0x7810, 0x2058, 0xb8a0, 0x2028, 0xb910, 0xba14, - 0x737c, 0x7480, 0x7820, 0x90be, 0x0006, 0x0904, 0xa61a, 0x90be, - 0x000a, 0x1904, 0xa5d6, 0xb8c0, 0x609e, 0x7814, 0x2048, 0xa87c, - 0xd0fc, 0x0558, 0xaf90, 0x9784, 0xff00, 0x9105, 0x6062, 0x873f, - 0x9784, 0xff00, 0x0006, 0x7814, 0x2048, 0xa878, 0xc0fc, 0x9005, - 0x000e, 0x1160, 0xaf94, 0x87ff, 0x0198, 0x2039, 0x0098, 0x9705, - 0x6072, 0x7808, 0x6082, 0x2f00, 0x6086, 0x0038, 0x9185, 0x2200, - 0x6062, 0x6073, 0x0129, 0x6077, 0x0000, 0xb8c0, 0x609e, 0x0050, - 0x2039, 0x0029, 0x9705, 0x6072, 0x0cc0, 0x9185, 0x0200, 0x6062, - 0x6073, 0x2029, 0xa87c, 0xd0fc, 0x0118, 0xaf94, 0x87ff, 0x1120, - 0x2f00, 0x6082, 0x7808, 0x6086, 0x6266, 0x636a, 0x646e, 0x6077, - 0x0000, 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x607a, - 0x607f, 0x0000, 0xa838, 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6, - 0xa844, 0x60ca, 0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, - 0x080c, 0xaf73, 0x2009, 0x07d0, 0x60c4, 0x9084, 0xfff0, 0x9005, - 0x0110, 0x2009, 0x1b58, 0x080c, 0x88c8, 0x003e, 0x004e, 0x005e, - 0x00ce, 0x00de, 0x00ee, 0x009e, 0x00be, 0x0005, 0x7804, 0x9086, - 0x0040, 0x0904, 0xa656, 0x9185, 0x0100, 0x6062, 0x6266, 0x636a, - 0x646e, 0x6073, 0x0809, 0x6077, 0x0008, 0x60af, 0x95d5, 0x60d7, - 0x0000, 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x607a, - 0x607f, 0x0000, 0x2f00, 0x6082, 0x7808, 0x6086, 0x7814, 0x2048, - 0xa838, 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6, 0xa844, 0x60ca, - 0xb86c, 0x60ce, 0xbac0, 0x629e, 0x080c, 0xaf73, 0x2009, 0x07d0, - 0x60c4, 0x9084, 0xfff0, 0x9005, 0x0110, 0x2009, 0x1b58, 0x080c, - 0x88c8, 0x003e, 0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x009e, - 0x00be, 0x0005, 0x7814, 0x2048, 0xa87c, 0x9084, 0x0003, 0x9086, - 0x0002, 0x0904, 0xa672, 0x9185, 0x0100, 0x6062, 0x6266, 0x636a, - 0x646e, 0x6073, 0x0880, 0x6077, 0x0008, 0xb88c, 0x8000, 0x9084, - 0x00ff, 0xb88e, 0x8007, 0x607a, 0x7838, 0x607e, 0x2f00, 0x6086, - 0x7808, 0x6082, 0xa890, 0x608a, 0xa88c, 0x608e, 0xa8b0, 0x60c6, - 0xa8ac, 0x60ca, 0xa8ac, 0x7930, 0x9108, 0x7932, 0xa8b0, 0x792c, - 0x9109, 0x792e, 0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, - 0xbac0, 0x629e, 0x080c, 0xaf50, 0x0804, 0xa606, 0xb8cc, 0xd084, - 0x0148, 0xb88c, 0x7814, 0x2048, 0xb88c, 0x784a, 0xa836, 0x2900, - 0xa83a, 0xb046, 0x9185, 0x0600, 0x6062, 0x6266, 0x636a, 0x646e, - 0x6073, 0x0829, 0x6077, 0x0000, 0x60af, 0x9575, 0x60d7, 0x0000, - 0x0804, 0xa5e9, 0x9185, 0x0700, 0x6062, 0x6266, 0x636a, 0x646e, - 0x7824, 0xd0cc, 0x7826, 0x0118, 0x6073, 0x0889, 0x0010, 0x6073, - 0x0898, 0x6077, 0x0000, 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, - 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6086, 0x7808, 0x6082, - 0xa838, 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6, 0xa844, 0x60ca, - 0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xbac0, 0x629e, - 0x7824, 0xd0cc, 0x0120, 0x080c, 0xaf73, 0x0804, 0xa606, 0x080c, - 0xaf50, 0x0804, 0xa606, 0x7a10, 0x00b6, 0x2258, 0xba8c, 0x8210, - 0x9294, 0x00ff, 0xba8e, 0x00be, 0x8217, 0x0005, 0x00d6, 0x2069, - 0x19e8, 0x6843, 0x0001, 0x00de, 0x0005, 0x60a3, 0x0056, 0x60a7, - 0x9575, 0x00f1, 0x080c, 0x88ba, 0x0005, 0x0016, 0x2001, 0x180c, - 0x200c, 0x9184, 0x0600, 0x9086, 0x0600, 0x0128, 0x0089, 0x080c, - 0x88ba, 0x001e, 0x0005, 0xc1e5, 0x2001, 0x180c, 0x2102, 0x2001, - 0x19e9, 0x2003, 0x0000, 0x2001, 0x19f1, 0x2003, 0x0000, 0x0c88, - 0x0006, 0x6014, 0x9084, 0x1804, 0x9085, 0x0009, 0x6016, 0x000e, - 0x0005, 0x0016, 0x00c6, 0x0006, 0x2061, 0x0100, 0x61a4, 0x60a7, - 0x95f5, 0x6014, 0x9084, 0x1804, 0x9085, 0x0008, 0x6016, 0x000e, - 0xa001, 0xa001, 0xa001, 0x61a6, 0x00ce, 0x001e, 0x0005, 0x00c6, - 0x00d6, 0x0016, 0x0026, 0x2061, 0x0100, 0x2069, 0x0140, 0x080c, - 0x7637, 0x11c0, 0x2001, 0x1a04, 0x2004, 0x9005, 0x15d0, 0x080c, - 0x76e4, 0x1160, 0x2061, 0x0100, 0x6020, 0xd0b4, 0x1120, 0x6024, - 0xd084, 0x090c, 0x0dc5, 0x080c, 0x88ba, 0x0458, 0x00c6, 0x2061, - 0x19e8, 0x00c8, 0x6904, 0x9194, 0x4000, 0x0540, 0x0811, 0x080c, - 0x2d49, 0x00c6, 0x2061, 0x19e8, 0x6128, 0x9192, 0x0008, 0x1258, - 0x8108, 0x612a, 0x6124, 0x00ce, 0x81ff, 0x0198, 0x080c, 0x88ba, - 0x080c, 0xa6e0, 0x0070, 0x6124, 0x91e5, 0x0000, 0x0140, 0x080c, - 0xf094, 0x080c, 0x88c3, 0x2009, 0x0014, 0x080c, 0xb352, 0x00ce, - 0x0000, 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001, 0x1a04, - 0x2004, 0x9005, 0x1db0, 0x00c6, 0x2061, 0x19e8, 0x6128, 0x9192, - 0x0003, 0x1e08, 0x8108, 0x612a, 0x00ce, 0x080c, 0x88ba, 0x080c, - 0x5fed, 0x2009, 0x1846, 0x2114, 0x8210, 0x220a, 0x0c10, 0x0096, - 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x0026, 0x080c, 0x88d0, 0x2071, - 0x19e8, 0x713c, 0x81ff, 0x0904, 0xa7e9, 0x2061, 0x0100, 0x2069, - 0x0140, 0x080c, 0x7637, 0x11e0, 0x0036, 0x2019, 0x0002, 0x080c, - 0xaa49, 0x003e, 0x713c, 0x2160, 0x080c, 0xf094, 0x2009, 0x004a, - 0x6220, 0x9296, 0x0009, 0x1130, 0x6114, 0x2148, 0xa87b, 0x0006, - 0x2009, 0x004a, 0x080c, 0xb352, 0x080c, 0x76e4, 0x0804, 0xa7e9, - 0x080c, 0xa7f5, 0x0904, 0xa7e9, 0x6904, 0xd1f4, 0x0904, 0xa7f0, - 0x080c, 0x2d49, 0x00c6, 0x703c, 0x9065, 0x090c, 0x0dc5, 0x6020, - 0x00ce, 0x9086, 0x0006, 0x1528, 0x61c8, 0x60c4, 0x9105, 0x1508, - 0x2009, 0x180c, 0x2104, 0xd0d4, 0x01e0, 0x6214, 0x9294, 0x1800, - 0x1128, 0x6224, 0x9294, 0x0002, 0x1560, 0x0030, 0xc0d4, 0x200a, - 0xd0cc, 0x0110, 0x080c, 0x2c7b, 0x6014, 0x9084, 0xe7fd, 0x9085, - 0x0010, 0x6016, 0x703c, 0x2060, 0x2009, 0x0049, 0x080c, 0xb352, - 0x00c0, 0x0036, 0x2019, 0x0001, 0x080c, 0xaa49, 0x003e, 0x713c, - 0x2160, 0x080c, 0xf094, 0x2009, 0x004a, 0x6220, 0x9296, 0x0009, - 0x1130, 0x6114, 0x2148, 0xa87b, 0x0006, 0x2009, 0x004a, 0x080c, - 0xb352, 0x002e, 0x001e, 0x00ee, 0x00de, 0x00ce, 0x009e, 0x0005, - 0xd1ec, 0x1904, 0xa7a0, 0x0804, 0xa7a2, 0x00d6, 0x00c6, 0x0096, - 0x703c, 0x9065, 0x090c, 0x0dc5, 0x2001, 0x0306, 0x200c, 0x9184, - 0x0030, 0x0904, 0xa8a8, 0x9184, 0x0048, 0x9086, 0x0008, 0x1904, - 0xa8a8, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, - 0x1904, 0xa8a8, 0x2009, 0x022a, 0x2104, 0x2009, 0x022f, 0x210c, - 0x9116, 0x9084, 0x03ff, 0x918c, 0x03ff, 0x9294, 0x0400, 0x0110, - 0x9102, 0x0030, 0x2010, 0x2100, 0x9202, 0x2009, 0x0228, 0x9102, - 0x9082, 0x0005, 0x0250, 0x2008, 0x2001, 0x013b, 0x2004, 0x8004, - 0x8004, 0x8004, 0x9102, 0x1a04, 0xa8a8, 0x2009, 0x1a84, 0x2104, - 0x8000, 0x0208, 0x200a, 0x2069, 0x0100, 0x6914, 0x918c, 0x1984, - 0x918d, 0x0010, 0x6916, 0x69c8, 0x2011, 0x0020, 0x68c8, 0x9106, - 0x15c0, 0x8211, 0x1dd8, 0x2001, 0x0306, 0x2003, 0x4800, 0x2001, - 0x009a, 0x2003, 0x0004, 0x2001, 0x1a69, 0x2003, 0x0000, 0x2001, - 0x1a72, 0x2003, 0x0000, 0x6a88, 0x698c, 0x2200, 0x9105, 0x1170, - 0x0096, 0x6014, 0x2048, 0xa87c, 0xc0dc, 0xa87e, 0xa880, 0xc0fc, - 0xa882, 0x009e, 0x2c10, 0x080c, 0x1be0, 0x0040, 0x6014, 0x2048, - 0xaa3a, 0xa936, 0x6ac4, 0x69c8, 0xa946, 0xaa4a, 0x0126, 0x00c6, - 0x2091, 0x2400, 0x002e, 0x080c, 0x1c79, 0x190c, 0x0dc5, 0x012e, - 0x0090, 0x2009, 0x1a85, 0x2104, 0x8000, 0x0208, 0x200a, 0x69c8, - 0x2011, 0x0020, 0x8211, 0x1df0, 0x68c8, 0x9106, 0x1dc0, 0x69c4, - 0x68c8, 0x9105, 0x0160, 0x6824, 0xd08c, 0x0110, 0x6827, 0x0002, - 0x7048, 0xc085, 0x704a, 0x0079, 0x7048, 0xc084, 0x704a, 0x2009, - 0x07d0, 0x080c, 0x88c8, 0x9006, 0x009e, 0x00ce, 0x00de, 0x0005, - 0x9085, 0x0001, 0x0cc8, 0x0026, 0x00e6, 0x2071, 0x19e8, 0x7048, - 0xd084, 0x01d8, 0x713c, 0x81ff, 0x01c0, 0x2071, 0x0100, 0x9188, - 0x0008, 0x2114, 0x928e, 0x0006, 0x1138, 0x7014, 0x9084, 0x1984, - 0x9085, 0x0012, 0x7016, 0x0048, 0x928e, 0x0009, 0x0db0, 0x7014, - 0x9084, 0x1984, 0x9085, 0x0016, 0x7016, 0x00ee, 0x002e, 0x0005, - 0x00b6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056, 0x0046, 0x0006, - 0x0126, 0x2091, 0x8000, 0x6010, 0x2058, 0xbca0, 0x2071, 0x19e8, - 0x7018, 0x2058, 0x8bff, 0x0190, 0xb8a0, 0x9406, 0x0118, 0xb854, - 0x2058, 0x0cc0, 0x6014, 0x0096, 0x2048, 0xac6c, 0xad70, 0xae78, - 0x009e, 0x080c, 0x6856, 0x0110, 0x9085, 0x0001, 0x012e, 0x000e, - 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00be, 0x0005, - 0x080c, 0xa0c1, 0x7003, 0x1200, 0x7838, 0x7012, 0x783c, 0x7016, - 0x00c6, 0x7820, 0x9086, 0x0004, 0x1148, 0x7810, 0x9005, 0x0130, - 0x00b6, 0x2058, 0xb810, 0xb914, 0x00be, 0x0020, 0x2061, 0x1800, - 0x607c, 0x6180, 0x9084, 0x00ff, 0x700a, 0x710e, 0x00ce, 0x60c3, - 0x002c, 0x0804, 0xa6bd, 0x080c, 0xa0c1, 0x7003, 0x0f00, 0x7808, - 0xd09c, 0x0128, 0xb810, 0x9084, 0x00ff, 0x700a, 0xb814, 0x700e, - 0x60c3, 0x0008, 0x0804, 0xa6bd, 0x0156, 0x080c, 0xa10c, 0x7003, - 0x0200, 0x080c, 0x894c, 0x20a9, 0x0006, 0x2011, 0xffec, 0x2019, - 0xffed, 0x9ef0, 0x0002, 0x2305, 0x2072, 0x8e70, 0x2205, 0x2072, - 0x8e70, 0x9398, 0x0002, 0x9290, 0x0002, 0x1f04, 0xa943, 0x60c3, - 0x001c, 0x015e, 0x0804, 0xa6bd, 0x0016, 0x0026, 0x080c, 0xa0e8, - 0x080c, 0xa0fa, 0x9e80, 0x0004, 0x20e9, 0x0000, 0x20a0, 0x7814, - 0x0096, 0x2048, 0xa800, 0x2048, 0xa860, 0x20e0, 0xa85c, 0x9080, - 0x0021, 0x2098, 0x009e, 0x7808, 0x9088, 0x0002, 0x21a8, 0x9192, - 0x0010, 0x1250, 0x4003, 0x9080, 0x0004, 0x8003, 0x60c2, 0x080c, - 0xa6bd, 0x002e, 0x001e, 0x0005, 0x20a9, 0x0010, 0x4003, 0x080c, - 0xaf79, 0x20a1, 0x0240, 0x22a8, 0x4003, 0x0c68, 0x080c, 0xa0c1, - 0x7003, 0x6200, 0x7808, 0x700e, 0x60c3, 0x0008, 0x0804, 0xa6bd, - 0x0016, 0x0026, 0x080c, 0xa0c1, 0x20e9, 0x0000, 0x20a1, 0x024c, - 0x7814, 0x0096, 0x2048, 0xa800, 0x2048, 0xa860, 0x20e0, 0xa85c, - 0x9080, 0x0023, 0x2098, 0x009e, 0x7808, 0x9088, 0x0002, 0x21a8, - 0x4003, 0x8003, 0x60c2, 0x080c, 0xa6bd, 0x002e, 0x001e, 0x0005, - 0x00e6, 0x00c6, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e8, - 0x700c, 0x2060, 0x8cff, 0x0178, 0x080c, 0xd2e0, 0x1110, 0x080c, - 0xbcb6, 0x600c, 0x0006, 0x080c, 0xd54c, 0x080c, 0xb2d3, 0x080c, - 0xaaf1, 0x00ce, 0x0c78, 0x2c00, 0x700e, 0x700a, 0x012e, 0x000e, - 0x00ce, 0x00ee, 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, - 0x00c6, 0x0066, 0x0026, 0x0016, 0x0006, 0x2091, 0x8000, 0x2001, - 0x180c, 0x200c, 0x918c, 0xe7ff, 0x2102, 0x2069, 0x0100, 0x2079, - 0x0140, 0x2071, 0x19e8, 0x7024, 0x2060, 0x8cff, 0x01f8, 0x080c, - 0xa6e9, 0x6ac0, 0x68c3, 0x0000, 0x080c, 0x88c3, 0x00c6, 0x2061, - 0x0100, 0x080c, 0xb0ca, 0x00ce, 0x20a9, 0x01f4, 0x0461, 0x2009, - 0x0013, 0x080c, 0xb352, 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, - 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x2001, 0x1800, - 0x2004, 0x9096, 0x0001, 0x0d78, 0x9096, 0x0004, 0x0d60, 0x080c, - 0x88c3, 0x6814, 0x9084, 0x0001, 0x0110, 0x68a7, 0x95f5, 0x6817, - 0x0008, 0x68c3, 0x0000, 0x2011, 0x5f97, 0x080c, 0x883d, 0x20a9, - 0x01f4, 0x0009, 0x08c0, 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, - 0x7804, 0x9084, 0x4000, 0x190c, 0x2d49, 0x0090, 0xd084, 0x0118, - 0x6827, 0x4001, 0x0010, 0x1f04, 0xaa2b, 0x7804, 0x9084, 0x1000, - 0x0138, 0x2001, 0x0100, 0x080c, 0x2d39, 0x9006, 0x080c, 0x2d39, - 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, - 0x0026, 0x0016, 0x0006, 0x2091, 0x8000, 0x2001, 0x180c, 0x200c, - 0x918c, 0xdbff, 0x2102, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, - 0x19e8, 0x703c, 0x2060, 0x8cff, 0x0904, 0xaab4, 0x9386, 0x0002, - 0x1128, 0x6814, 0x9084, 0x0002, 0x0904, 0xaab4, 0x68af, 0x95f5, - 0x6817, 0x0010, 0x2009, 0x00fa, 0x8109, 0x1df0, 0x69c6, 0x68cb, - 0x0008, 0x080c, 0x88d0, 0x080c, 0x2031, 0x2001, 0x0032, 0x6920, - 0xd1bc, 0x0130, 0x8001, 0x1dd8, 0x692c, 0x918d, 0x0008, 0x692e, - 0x20a9, 0x03e8, 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, 0x7804, - 0x9084, 0x4000, 0x190c, 0x2d49, 0x0090, 0xd08c, 0x0118, 0x6827, - 0x0002, 0x0010, 0x1f04, 0xaa8a, 0x7804, 0x9084, 0x1000, 0x0138, - 0x2001, 0x0100, 0x080c, 0x2d39, 0x9006, 0x080c, 0x2d39, 0x6827, - 0x4000, 0x6824, 0x83ff, 0x1140, 0x2009, 0x0049, 0x6020, 0x9086, - 0x0009, 0x0110, 0x080c, 0xb352, 0x000e, 0x001e, 0x002e, 0x006e, - 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x00d6, - 0x0126, 0x2091, 0x8000, 0x2069, 0x19e8, 0x6a06, 0x012e, 0x00de, - 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, 0x19e8, 0x6a32, - 0x012e, 0x00de, 0x0005, 0x080c, 0xa284, 0x7047, 0x1000, 0x0098, - 0x080c, 0xa284, 0x7047, 0x4000, 0x0070, 0x080c, 0xa284, 0x7047, - 0x2000, 0x0048, 0x080c, 0xa284, 0x7047, 0x0400, 0x0020, 0x080c, - 0xa284, 0x7047, 0x0200, 0x7854, 0x7032, 0x60c3, 0x0020, 0x0804, - 0xa6bd, 0x00e6, 0x2071, 0x19e8, 0x7020, 0x9005, 0x0110, 0x8001, - 0x7022, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076, - 0x0066, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e8, 0x7614, - 0x2660, 0x2678, 0x2039, 0x0001, 0x87ff, 0x0904, 0xab96, 0x8cff, - 0x0904, 0xab96, 0x6020, 0x9086, 0x0006, 0x1904, 0xab91, 0x88ff, - 0x0138, 0x2800, 0x9c06, 0x1904, 0xab91, 0x2039, 0x0000, 0x0050, - 0x6010, 0x9b06, 0x1904, 0xab91, 0x85ff, 0x0120, 0x6054, 0x9106, - 0x1904, 0xab91, 0x7024, 0x9c06, 0x15b0, 0x2069, 0x0100, 0x68c0, - 0x9005, 0x1160, 0x6824, 0xd084, 0x0148, 0x6827, 0x0001, 0x080c, - 0x88c3, 0x080c, 0xac1b, 0x7027, 0x0000, 0x0428, 0x080c, 0x88c3, - 0x6820, 0xd0b4, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, - 0x0000, 0x080c, 0xac1b, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, - 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2d39, - 0x9006, 0x080c, 0x2d39, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, - 0x6827, 0x0001, 0x003e, 0x7014, 0x9c36, 0x1110, 0x660c, 0x7616, - 0x7010, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7012, - 0x0010, 0x7013, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, - 0x7e0e, 0x0008, 0x2678, 0x89ff, 0x1168, 0x600f, 0x0000, 0x6014, - 0x0096, 0x2048, 0x080c, 0xd0d6, 0x0110, 0x080c, 0xebd4, 0x009e, - 0x080c, 0xb306, 0x080c, 0xaaf1, 0x88ff, 0x1190, 0x00ce, 0x0804, - 0xab0c, 0x2c78, 0x600c, 0x2060, 0x0804, 0xab0c, 0x9006, 0x012e, - 0x000e, 0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, - 0x601b, 0x0000, 0x00ce, 0x98c5, 0x0001, 0x0c88, 0x00f6, 0x00e6, - 0x00d6, 0x0096, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, - 0x8000, 0x2071, 0x19e8, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0904, - 0xac0a, 0x6020, 0x9086, 0x0006, 0x1904, 0xac05, 0x87ff, 0x0128, - 0x2700, 0x9c06, 0x1904, 0xac05, 0x0040, 0x6010, 0x9b06, 0x15e8, - 0x85ff, 0x0118, 0x6054, 0x9106, 0x15c0, 0x703c, 0x9c06, 0x1168, - 0x0036, 0x2019, 0x0001, 0x080c, 0xaa49, 0x7033, 0x0000, 0x9006, - 0x703e, 0x7042, 0x7046, 0x704a, 0x003e, 0x7038, 0x9c36, 0x1110, - 0x660c, 0x763a, 0x7034, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, - 0x2f00, 0x7036, 0x0010, 0x7037, 0x0000, 0x660c, 0x0066, 0x2c00, - 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x6014, - 0x2048, 0x080c, 0xd0d6, 0x0110, 0x080c, 0xebd4, 0x080c, 0xb306, - 0x87ff, 0x1198, 0x00ce, 0x0804, 0xabb6, 0x2c78, 0x600c, 0x2060, - 0x0804, 0xabb6, 0x9006, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, - 0x009e, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce, - 0x97bd, 0x0001, 0x0c80, 0x00e6, 0x2071, 0x19e8, 0x2001, 0x1800, - 0x2004, 0x9086, 0x0002, 0x1118, 0x7007, 0x0005, 0x0010, 0x7007, - 0x0000, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0026, - 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e8, 0x2c10, 0x7638, - 0x2660, 0x2678, 0x8cff, 0x0540, 0x2200, 0x9c06, 0x1508, 0x7038, - 0x9c36, 0x1110, 0x660c, 0x763a, 0x7034, 0x9c36, 0x1140, 0x2c00, - 0x9f36, 0x0118, 0x2f00, 0x7036, 0x0010, 0x7037, 0x0000, 0x660c, - 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, - 0x6004, 0x9086, 0x0040, 0x090c, 0x99a5, 0x9085, 0x0001, 0x0020, - 0x2c78, 0x600c, 0x2060, 0x08b0, 0x012e, 0x000e, 0x002e, 0x006e, - 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0096, 0x00f6, 0x00e6, 0x00d6, - 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, - 0x19e8, 0x760c, 0x2660, 0x2678, 0x8cff, 0x0904, 0xad01, 0x6010, - 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x9206, 0x1904, 0xacfc, 0x7024, - 0x9c06, 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0xacd3, - 0x080c, 0xa6e9, 0x68c3, 0x0000, 0x080c, 0xac1b, 0x7027, 0x0000, - 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, - 0x0100, 0x080c, 0x2d39, 0x9006, 0x080c, 0x2d39, 0x2069, 0x0100, - 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x700c, 0x9c36, - 0x1110, 0x660c, 0x760e, 0x7008, 0x9c36, 0x1140, 0x2c00, 0x9f36, - 0x0118, 0x2f00, 0x700a, 0x0010, 0x700b, 0x0000, 0x660c, 0x0066, - 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, - 0x080c, 0xd2cf, 0x1180, 0x080c, 0x3279, 0x080c, 0xd2e0, 0x1518, - 0x080c, 0xbcb6, 0x0400, 0x080c, 0xac1b, 0x6824, 0xd084, 0x09b0, - 0x6827, 0x0001, 0x0898, 0x080c, 0xd2e0, 0x1118, 0x080c, 0xbcb6, - 0x0090, 0x6014, 0x2048, 0x080c, 0xd0d6, 0x0168, 0x6020, 0x9086, - 0x0003, 0x1508, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, - 0x6e92, 0x080c, 0xd2c3, 0x080c, 0xd54c, 0x080c, 0xb306, 0x080c, - 0xaaf1, 0x00ce, 0x0804, 0xac7c, 0x2c78, 0x600c, 0x2060, 0x0804, - 0xac7c, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, - 0x00fe, 0x009e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1d20, 0x080c, - 0xebd4, 0x0c08, 0x00d6, 0x080c, 0xa10c, 0x7003, 0x0200, 0x7007, - 0x0014, 0x60c3, 0x0014, 0x20e1, 0x0001, 0x2099, 0x1989, 0x20e9, - 0x0000, 0x20a1, 0x0250, 0x20a9, 0x0004, 0x4003, 0x7023, 0x0004, - 0x7027, 0x7878, 0x080c, 0xa6bd, 0x00de, 0x0005, 0x080c, 0xa10c, - 0x700b, 0x0800, 0x7814, 0x9084, 0xff00, 0x700e, 0x7814, 0x9084, - 0x00ff, 0x7022, 0x782c, 0x7026, 0x7858, 0x9084, 0x00ff, 0x9085, - 0x0200, 0x7002, 0x7858, 0x9084, 0xff00, 0x8007, 0x7006, 0x60c2, - 0x0804, 0xa6bd, 0x00b6, 0x00d6, 0x0016, 0x00d6, 0x2f68, 0x2009, - 0x0035, 0x080c, 0xd759, 0x00de, 0x1904, 0xadaf, 0x080c, 0xa0c1, - 0x7003, 0x1300, 0x782c, 0x080c, 0xaeb5, 0x2068, 0x6820, 0x9086, - 0x0003, 0x0560, 0x7810, 0x2058, 0xbaa0, 0x080c, 0xb23d, 0x11d8, - 0x9286, 0x007e, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe, 0x0498, - 0x9286, 0x007f, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffd, 0x0458, - 0x9284, 0xff80, 0x0180, 0x9286, 0x0080, 0x1128, 0x700b, 0x00ff, - 0x700f, 0xfffc, 0x0400, 0x92d8, 0x1000, 0x2b5c, 0xb810, 0x700a, - 0xb814, 0x700e, 0x00c0, 0x6098, 0x700e, 0x00a8, 0x080c, 0xb23d, - 0x1130, 0x7810, 0x2058, 0xb8a0, 0x9082, 0x007e, 0x0250, 0x00d6, - 0x2069, 0x181f, 0x2d04, 0x700a, 0x8d68, 0x2d04, 0x700e, 0x00de, - 0x0010, 0x6034, 0x700e, 0x7838, 0x7012, 0x783c, 0x7016, 0x60c3, - 0x000c, 0x001e, 0x00de, 0x080c, 0xa6bd, 0x00be, 0x0005, 0x781b, - 0x0001, 0x7803, 0x0006, 0x001e, 0x00de, 0x00be, 0x0005, 0x792c, - 0x9180, 0x0008, 0x200c, 0x9186, 0x0006, 0x01c0, 0x9186, 0x0003, - 0x0904, 0xae2a, 0x9186, 0x0005, 0x0904, 0xae12, 0x9186, 0x0004, - 0x05d8, 0x9186, 0x0008, 0x0904, 0xae1b, 0x7807, 0x0037, 0x782f, - 0x0003, 0x7817, 0x1700, 0x080c, 0xae92, 0x0005, 0x080c, 0xae53, - 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x6800, 0x0002, - 0xadf3, 0xadfe, 0xadf5, 0xadfe, 0xadfa, 0xadf3, 0xadf3, 0xadfe, - 0xadfe, 0xadfe, 0xadfe, 0xadf3, 0xadf3, 0xadf3, 0xadf3, 0xadf3, - 0xadfe, 0xadf3, 0xadfe, 0x080c, 0x0dc5, 0x6824, 0xd0e4, 0x0110, - 0xd0cc, 0x0110, 0x900e, 0x0010, 0x2009, 0x2000, 0x682c, 0x7022, - 0x6830, 0x7026, 0x0804, 0xae4c, 0x080c, 0xae53, 0x00d6, 0x0026, - 0x792c, 0x2168, 0x2009, 0x4000, 0x6a00, 0x9286, 0x0002, 0x1108, - 0x900e, 0x04d0, 0x080c, 0xae53, 0x00d6, 0x0026, 0x792c, 0x2168, - 0x2009, 0x4000, 0x0488, 0x04b9, 0x00d6, 0x0026, 0x792c, 0x2168, - 0x2009, 0x4000, 0x9286, 0x0005, 0x0118, 0x9286, 0x0002, 0x1108, - 0x900e, 0x0410, 0x0441, 0x00d6, 0x0026, 0x792c, 0x2168, 0x6814, - 0x6924, 0xc185, 0x6926, 0x0096, 0x2048, 0xa9ac, 0xa834, 0x9112, - 0xa9b0, 0xa838, 0x009e, 0x9103, 0x7022, 0x7226, 0x792c, 0x9180, - 0x0000, 0x2004, 0x908e, 0x0002, 0x0130, 0x908e, 0x0004, 0x0118, - 0x2009, 0x4000, 0x0008, 0x900e, 0x712a, 0x60c3, 0x0018, 0x002e, - 0x00de, 0x0804, 0xa6bd, 0x00b6, 0x0036, 0x0046, 0x0056, 0x0066, - 0x080c, 0xa10c, 0x9006, 0x7003, 0x0200, 0x7938, 0x710a, 0x793c, - 0x710e, 0x7810, 0x2058, 0xb8a0, 0x080c, 0xb23d, 0x1118, 0x9092, - 0x007e, 0x0268, 0x00d6, 0x2069, 0x181f, 0x2d2c, 0x8d68, 0x2d34, - 0x90d8, 0x1000, 0x2b5c, 0xbb10, 0xbc14, 0x00de, 0x0028, 0x901e, - 0x6498, 0x2029, 0x0000, 0x6634, 0x782c, 0x9080, 0x0008, 0x2004, - 0x9086, 0x0003, 0x1128, 0x7512, 0x7616, 0x731a, 0x741e, 0x0020, - 0x7312, 0x7416, 0x751a, 0x761e, 0x006e, 0x005e, 0x004e, 0x003e, - 0x00be, 0x0005, 0x080c, 0xa10c, 0x7003, 0x0100, 0x782c, 0x700a, - 0x7814, 0x700e, 0x700e, 0x60c3, 0x0008, 0x0804, 0xa6bd, 0x080c, - 0xa0b8, 0x7003, 0x1400, 0x7838, 0x700a, 0x0079, 0x783c, 0x700e, - 0x782c, 0x7012, 0x7830, 0x7016, 0x7834, 0x9084, 0x00ff, 0x8007, - 0x701a, 0x60c3, 0x0010, 0x0804, 0xa6bd, 0x00e6, 0x2071, 0x0240, - 0x0006, 0x00f6, 0x2078, 0x7810, 0x00b6, 0x2058, 0xb8cc, 0xd084, - 0x0120, 0x7844, 0x702a, 0x7848, 0x702e, 0x00be, 0x00fe, 0x000e, - 0x00ee, 0x0005, 0x080c, 0xa103, 0x7003, 0x0100, 0x782c, 0x700a, - 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, 0xa6bd, 0x0021, 0x60c3, - 0x0000, 0x0804, 0xa6bd, 0x00d6, 0x080c, 0xaf8e, 0xb810, 0x9085, - 0x0300, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x687c, 0x700a, - 0x6880, 0x700e, 0x7013, 0x0819, 0x080c, 0xa6ab, 0x721a, 0x2f10, - 0x7222, 0x7a08, 0x7226, 0x2071, 0x024c, 0x00de, 0x0005, 0x00a9, - 0x7914, 0x712a, 0x60c3, 0x0000, 0x60a7, 0x9575, 0x0026, 0x080c, - 0x2bce, 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, - 0x080c, 0xa6e0, 0x080c, 0x88ba, 0x0005, 0x0036, 0x0096, 0x00d6, - 0x00e6, 0x7858, 0x2048, 0xaa7c, 0x9296, 0x00c0, 0x9294, 0x00fd, - 0xaa7e, 0xaa80, 0x9294, 0x0300, 0xaa82, 0xa96c, 0x9194, 0x00ff, - 0xab74, 0x9384, 0x00ff, 0x908d, 0xc200, 0xa96e, 0x9384, 0xff00, - 0x9215, 0xaa76, 0xa870, 0xaa78, 0xa87a, 0xaa72, 0x00d6, 0x2069, - 0x0200, 0x080c, 0xaf8e, 0x00de, 0x20e9, 0x0000, 0x20a1, 0x0240, - 0x20a9, 0x000a, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, - 0x4003, 0x60a3, 0x0035, 0xaa68, 0x9294, 0x7000, 0x9286, 0x3000, - 0x0110, 0x60a3, 0x0037, 0x00ee, 0x00de, 0x009e, 0x003e, 0x0005, - 0x900e, 0x7814, 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x01c0, 0x9084, - 0x0003, 0x11a8, 0x2001, 0x180c, 0x2004, 0xd0bc, 0x0180, 0x7824, - 0xd0cc, 0x1168, 0xd0c4, 0x1158, 0xa8a8, 0x9005, 0x1140, 0x2001, - 0x180c, 0x200c, 0xc1d5, 0x2102, 0x2009, 0x19b3, 0x210c, 0x009e, - 0x918d, 0x0092, 0x0010, 0x2009, 0x0096, 0x60ab, 0x0036, 0x6116, - 0x0005, 0x2009, 0x0009, 0x00a0, 0x2009, 0x000a, 0x0088, 0x2009, - 0x000b, 0x0070, 0x2009, 0x000c, 0x0058, 0x2009, 0x000d, 0x0040, - 0x2009, 0x000e, 0x0028, 0x2009, 0x000f, 0x0010, 0x2009, 0x0008, - 0x6912, 0x0005, 0x080c, 0xa0c1, 0x0016, 0x0026, 0x0096, 0x00d6, - 0x7814, 0x2048, 0x7013, 0x0138, 0x2001, 0x1837, 0x2004, 0x9084, - 0x0028, 0x1138, 0x2001, 0x197c, 0x2004, 0x9086, 0xaaaa, 0x1904, - 0xb033, 0x7003, 0x5400, 0x00c6, 0x2061, 0x1800, 0x607c, 0x9084, - 0x00ff, 0xa998, 0x810f, 0x918c, 0xff00, 0x9105, 0x700a, 0x6080, - 0x700e, 0xa998, 0x918c, 0xff00, 0x7112, 0x20a9, 0x0004, 0x2009, - 0x1805, 0x2e10, 0x9290, 0x0006, 0x2104, 0x2012, 0x8108, 0x8210, - 0x1f04, 0xafc4, 0x20a9, 0x0004, 0x2009, 0x1801, 0x2104, 0x2012, - 0x8108, 0x8210, 0x1f04, 0xafce, 0xa860, 0x20e0, 0xa85c, 0x9080, - 0x0029, 0x2098, 0x2009, 0x0006, 0x20a9, 0x0001, 0x4002, 0x8007, - 0x2012, 0x8210, 0x8109, 0x1dc0, 0x00d6, 0x2069, 0x0200, 0x080c, - 0xaf79, 0x00de, 0x2071, 0x0240, 0x2011, 0x0240, 0x2009, 0x0002, - 0x20a9, 0x0001, 0x4002, 0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, - 0x2009, 0x0008, 0x20a9, 0x0001, 0x4002, 0x8007, 0x2012, 0x8210, - 0x8109, 0x1dc0, 0xa85c, 0x9080, 0x0031, 0x2098, 0x2009, 0x0008, - 0x20a9, 0x0001, 0x4002, 0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, - 0x00ce, 0x60c3, 0x004c, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x2001, - 0x1837, 0x2004, 0x9084, 0x0028, 0x1168, 0x080c, 0x7637, 0x0150, - 0x6028, 0xc0bd, 0x602a, 0x6014, 0x9084, 0x1804, 0x9085, 0x0029, - 0x6016, 0x0010, 0x080c, 0xa6bd, 0x080c, 0x88ba, 0x00de, 0x009e, - 0x002e, 0x001e, 0x0005, 0x00e6, 0x2071, 0x0240, 0x2001, 0x2200, - 0x9085, 0x00ff, 0x7002, 0x7007, 0xffff, 0x2071, 0x0100, 0x709b, - 0x00ff, 0x00ee, 0x0804, 0xafa9, 0x080c, 0xa0c1, 0x0016, 0x0026, - 0x0096, 0x00d6, 0x7814, 0x2048, 0x7013, 0x0138, 0x7003, 0x5500, - 0x00c6, 0xa89c, 0x9084, 0x00ff, 0xa998, 0x810f, 0x918c, 0xff00, - 0x9105, 0x700a, 0xa99c, 0x918c, 0xff00, 0xa8a0, 0x9084, 0x00ff, - 0x9105, 0x700e, 0xa998, 0x918c, 0xff00, 0x2061, 0x1800, 0x607c, - 0x9084, 0x00ff, 0x910d, 0x7112, 0x6180, 0x7116, 0x2009, 0x0008, - 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0029, 0x2098, 0x2e10, 0x9290, - 0x0006, 0x20a9, 0x0001, 0x4002, 0x8007, 0x2012, 0x8210, 0x8109, - 0x1dc0, 0x20a9, 0x0004, 0x2009, 0x1805, 0x2104, 0x2012, 0x8108, - 0x8210, 0x1f04, 0xb085, 0x20a9, 0x0002, 0x2009, 0x1801, 0x2104, - 0x2012, 0x8108, 0x8210, 0x1f04, 0xb08f, 0x00d6, 0x0016, 0x2069, - 0x0200, 0x080c, 0xaf79, 0x001e, 0x00de, 0x2071, 0x0240, 0x20a9, - 0x0002, 0x2009, 0x1803, 0x2011, 0x0240, 0x2104, 0x2012, 0x8108, - 0x8210, 0x1f04, 0xb0a5, 0x2009, 0x0008, 0x4002, 0x8007, 0x2012, - 0x8210, 0x8109, 0x1dd0, 0x9006, 0x20a9, 0x0008, 0x2012, 0x8210, - 0x1f04, 0xb0b6, 0x00ce, 0x60c3, 0x004c, 0x60a3, 0x0056, 0x60a7, - 0x9575, 0x080c, 0xa6bd, 0x080c, 0x88ba, 0x00de, 0x009e, 0x002e, - 0x001e, 0x0005, 0x00d6, 0x9290, 0x0018, 0x8214, 0x20e9, 0x0000, - 0x2069, 0x0200, 0x6813, 0x0000, 0x22a8, 0x9284, 0x00e0, 0x0128, - 0x20a9, 0x0020, 0x9292, 0x0020, 0x0008, 0x9016, 0x20a1, 0x0240, - 0x9006, 0x4004, 0x82ff, 0x0120, 0x6810, 0x8000, 0x6812, 0x0c60, - 0x00de, 0x0005, 0x00d6, 0x0096, 0x6014, 0x2048, 0xa878, 0x6056, - 0x9006, 0xa836, 0xa83a, 0xa99c, 0xa946, 0xa84a, 0x6023, 0x0003, - 0x6007, 0x0040, 0x6003, 0x0003, 0x600b, 0xffff, 0xa817, 0x0001, - 0xa842, 0xa83e, 0x2900, 0xa85a, 0xa813, 0x20c5, 0x080c, 0x9564, - 0x0126, 0x2091, 0x8000, 0x080c, 0x9bd3, 0x012e, 0x009e, 0x00de, - 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x00a6, 0x0096, 0x0066, - 0x0126, 0x2091, 0x8000, 0x2071, 0x19e8, 0x760c, 0x2660, 0x2678, - 0x8cff, 0x0904, 0xb19d, 0x7024, 0x9c06, 0x1520, 0x2069, 0x0100, - 0x68c0, 0x9005, 0x0904, 0xb16f, 0x080c, 0xa6e9, 0x68c3, 0x0000, - 0x080c, 0xac1b, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, - 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2d39, 0x9006, - 0x080c, 0x2d39, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, - 0x0001, 0x003e, 0x700c, 0x9c36, 0x1110, 0x660c, 0x760e, 0x7008, - 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x700a, 0x0010, - 0x700b, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, - 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0xd2cf, 0x1180, 0x080c, - 0x3279, 0x080c, 0xd2e0, 0x1518, 0x080c, 0xbcb6, 0x0400, 0x080c, - 0xac1b, 0x6824, 0xd084, 0x09b0, 0x6827, 0x0001, 0x0898, 0x080c, - 0xd2e0, 0x1118, 0x080c, 0xbcb6, 0x0090, 0x6014, 0x2048, 0x080c, - 0xd0d6, 0x0168, 0x6020, 0x9086, 0x0003, 0x1520, 0xa867, 0x0103, - 0xab7a, 0xa877, 0x0000, 0x080c, 0x6e9f, 0x080c, 0xd2c3, 0x080c, - 0xd54c, 0x080c, 0xb306, 0x080c, 0xaaf1, 0x00ce, 0x0804, 0xb120, - 0x2c78, 0x600c, 0x2060, 0x0804, 0xb120, 0x700f, 0x0000, 0x700b, - 0x0000, 0x012e, 0x006e, 0x009e, 0x00ae, 0x00ce, 0x00de, 0x00ee, - 0x00fe, 0x0005, 0x6020, 0x9086, 0x0006, 0x1d08, 0x080c, 0xebd4, - 0x08f0, 0x00d6, 0x0156, 0x080c, 0xa10c, 0x7a14, 0x82ff, 0x0138, - 0x7003, 0x0100, 0x700b, 0x0003, 0x60c3, 0x0008, 0x0490, 0x7003, - 0x0200, 0x7007, 0x0000, 0x2069, 0x1800, 0x901e, 0x6800, 0x9086, - 0x0004, 0x1110, 0xc38d, 0x0060, 0x080c, 0x7637, 0x1110, 0xc3ad, - 0x0008, 0xc3a5, 0x6adc, 0xd29c, 0x1110, 0xd2ac, 0x0108, 0xc39d, - 0x730e, 0x080c, 0x894c, 0x20a9, 0x0006, 0x2011, 0xffec, 0x2019, - 0xffed, 0x2071, 0x0250, 0x2305, 0x2072, 0x8e70, 0x2205, 0x2072, - 0x8e70, 0x9398, 0x0002, 0x9290, 0x0002, 0x1f04, 0xb1e3, 0x60c3, - 0x0020, 0x080c, 0xa6bd, 0x015e, 0x00de, 0x0005, 0x0156, 0x080c, - 0xa10c, 0x7a14, 0x82ff, 0x0168, 0x9286, 0xffff, 0x0118, 0x9282, - 0x000e, 0x1238, 0x7003, 0x0100, 0x700b, 0x0003, 0x60c3, 0x0008, - 0x0488, 0x7003, 0x0200, 0x7007, 0x001c, 0x700f, 0x0001, 0x2011, - 0x19be, 0x2204, 0x8007, 0x701a, 0x8210, 0x2204, 0x8007, 0x701e, - 0x0421, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, 0x181f, - 0x2004, 0x7022, 0x2001, 0x1820, 0x2004, 0x7026, 0x0030, 0x2001, - 0x1818, 0x2004, 0x9084, 0x00ff, 0x7026, 0x20a9, 0x0004, 0x20e1, - 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, - 0x60c3, 0x001c, 0x015e, 0x0804, 0xa6bd, 0x0006, 0x2001, 0x1837, - 0x2004, 0xd0ac, 0x000e, 0x0005, 0x2011, 0x0003, 0x080c, 0xaabf, - 0x2011, 0x0002, 0x080c, 0xaac9, 0x080c, 0xa9d3, 0x0036, 0x901e, - 0x080c, 0xaa49, 0x003e, 0x0005, 0x080c, 0x33af, 0x0188, 0x0016, - 0x00b6, 0x00c6, 0x7010, 0x9085, 0x0020, 0x7012, 0x2009, 0x007e, - 0x080c, 0x6724, 0xb85c, 0xc0ac, 0xb85e, 0x00ce, 0x00be, 0x001e, - 0x0005, 0x2071, 0x188d, 0x7000, 0x9005, 0x0140, 0x2001, 0x0976, - 0x2071, 0x1800, 0x7076, 0x707a, 0x706b, 0xffe0, 0x2071, 0x1800, - 0x7074, 0x7056, 0x705b, 0x1cd0, 0x0005, 0x00e6, 0x0126, 0x2071, - 0x1800, 0x2091, 0x8000, 0x7554, 0x9582, 0x0010, 0x0608, 0x7058, - 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018, 0x7068, - 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1cd0, 0x0c98, 0x6003, 0x0008, - 0x8529, 0x7556, 0x9ca8, 0x0018, 0x7068, 0x9502, 0x1230, 0x755a, - 0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x705b, 0x1cd0, 0x0cc0, - 0x9006, 0x0cc0, 0x00e6, 0x2071, 0x1800, 0x7554, 0x9582, 0x0010, - 0x0600, 0x7058, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, - 0x0018, 0x7068, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1cd0, 0x0c98, - 0x6003, 0x0008, 0x8529, 0x7556, 0x9ca8, 0x0018, 0x7068, 0x9502, - 0x1228, 0x755a, 0x9085, 0x0001, 0x00ee, 0x0005, 0x705b, 0x1cd0, - 0x0cc8, 0x9006, 0x0cc8, 0x9c82, 0x1cd0, 0x0a0c, 0x0dc5, 0x2001, - 0x181a, 0x2004, 0x9c02, 0x1a0c, 0x0dc5, 0x9006, 0x6006, 0x600a, - 0x600e, 0x6016, 0x601a, 0x6012, 0x6023, 0x0000, 0x6003, 0x0000, - 0x601e, 0x6056, 0x605a, 0x6026, 0x602a, 0x602e, 0x6032, 0x6036, - 0x603a, 0x603e, 0x6042, 0x602a, 0x2061, 0x1800, 0x6054, 0x8000, - 0x6056, 0x9086, 0x0001, 0x0108, 0x0005, 0x0126, 0x2091, 0x8000, - 0x0016, 0x080c, 0x9ab1, 0x001e, 0x012e, 0x0cb0, 0x0006, 0x6000, - 0x9086, 0x0000, 0x01c0, 0x601c, 0xd084, 0x190c, 0x1a8e, 0x6017, - 0x0000, 0x6023, 0x0007, 0x2001, 0x1986, 0x2004, 0x0006, 0x9082, - 0x0051, 0x000e, 0x0208, 0x8004, 0x601a, 0x080c, 0xee87, 0x6043, - 0x0000, 0x6013, 0x0000, 0x000e, 0x0005, 0x00e6, 0x0126, 0x2071, - 0x1800, 0x2091, 0x8000, 0x7554, 0x9582, 0x0001, 0x0608, 0x7058, - 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018, 0x7068, - 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1cd0, 0x0c98, 0x6003, 0x0008, - 0x8529, 0x7556, 0x9ca8, 0x0018, 0x7068, 0x9502, 0x1230, 0x755a, - 0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x705b, 0x1cd0, 0x0cc0, - 0x9006, 0x0cc0, 0x6020, 0x9084, 0x000f, 0x0002, 0xb365, 0xb36e, - 0xb389, 0xb3a4, 0xd82b, 0xd848, 0xd863, 0xb365, 0xb36e, 0x9100, - 0xb3bd, 0xb365, 0xb365, 0xb365, 0xb365, 0x9186, 0x0013, 0x1128, - 0x080c, 0x99a5, 0x080c, 0x9ab1, 0x0005, 0x0005, 0x0066, 0x6000, - 0x90b2, 0x0010, 0x1a0c, 0x0dc5, 0x0013, 0x006e, 0x0005, 0xb387, - 0xbb05, 0xbcfd, 0xb387, 0xbd93, 0xb6a0, 0xb387, 0xb387, 0xba87, - 0xc3b1, 0xb387, 0xb387, 0xb387, 0xb387, 0xb387, 0xb387, 0x080c, - 0x0dc5, 0x0066, 0x6000, 0x90b2, 0x0010, 0x1a0c, 0x0dc5, 0x0013, - 0x006e, 0x0005, 0xb3a2, 0xca7e, 0xb3a2, 0xb3a2, 0xb3a2, 0xb3a2, - 0xb3a2, 0xb3a2, 0xca15, 0xcc00, 0xb3a2, 0xcabf, 0xcb3e, 0xcabf, - 0xcb3e, 0xb3a2, 0x080c, 0x0dc5, 0x6000, 0x9082, 0x0010, 0x1a0c, - 0x0dc5, 0x6000, 0x0002, 0xb3bb, 0xc3f8, 0xc4c0, 0xc5f3, 0xc7a2, - 0xb3bb, 0xb3bb, 0xb3bb, 0xc3cc, 0xc9a1, 0xc9a4, 0xb3bb, 0xb3bb, - 0xb3bb, 0xb3bb, 0xc9d3, 0x080c, 0x0dc5, 0x0066, 0x6000, 0x90b2, - 0x0010, 0x1a0c, 0x0dc5, 0x0013, 0x006e, 0x0005, 0xb3d6, 0xb3d6, - 0xb419, 0xb4b8, 0xb54d, 0xb3d6, 0xb3d6, 0xb3d6, 0xb3d8, 0xb3d6, - 0xb3d6, 0xb3d6, 0xb3d6, 0xb3d6, 0xb3d6, 0xb3d6, 0x080c, 0x0dc5, - 0x9186, 0x004c, 0x0588, 0x9186, 0x0003, 0x190c, 0x0dc5, 0x0096, - 0x601c, 0xc0ed, 0x601e, 0x6003, 0x0003, 0x6106, 0x6014, 0x2048, - 0xa87c, 0x9084, 0xa000, 0xc0b5, 0xa87e, 0xa8ac, 0xa846, 0xa8b0, - 0xa84a, 0x9006, 0xa836, 0xa83a, 0xa884, 0x9092, 0x199a, 0x0210, - 0x2001, 0x1999, 0x8003, 0x8013, 0x8213, 0x9210, 0x621a, 0x009e, - 0x2c10, 0x080c, 0x1be0, 0x080c, 0x9564, 0x0126, 0x2091, 0x8000, - 0x080c, 0x9bd3, 0x012e, 0x0005, 0x6010, 0x00b6, 0x2058, 0xbca0, - 0x00be, 0x2c00, 0x080c, 0xb56f, 0x080c, 0xd7fb, 0x6003, 0x0007, - 0x0005, 0x00d6, 0x0096, 0x00f6, 0x2079, 0x1800, 0x7a90, 0x6014, - 0x2048, 0xa87c, 0xd0ec, 0x1110, 0x9290, 0x0018, 0xac78, 0xc4fc, - 0x0046, 0xa8e0, 0x9005, 0x1140, 0xa8dc, 0x921a, 0x0140, 0x0220, - 0xa87b, 0x0007, 0x2010, 0x0028, 0xa87b, 0x0015, 0x0010, 0xa87b, - 0x0000, 0x8214, 0xa883, 0x0000, 0xaa02, 0x0006, 0x0016, 0x0026, - 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2400, 0x9005, 0x1108, 0x009a, - 0x2100, 0x9086, 0x0015, 0x1118, 0x2001, 0x0001, 0x0038, 0x2100, - 0x9086, 0x0016, 0x0118, 0x2001, 0x0001, 0x002a, 0x94a4, 0x0007, - 0x8423, 0x9405, 0x0002, 0xb480, 0xb480, 0xb47b, 0xb47e, 0xb480, - 0xb478, 0xb46b, 0xb46b, 0xb46b, 0xb46b, 0xb46b, 0xb46b, 0xb46b, - 0xb46b, 0xb46b, 0xb46b, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, - 0x001e, 0x000e, 0x004e, 0x00fe, 0x009e, 0x00de, 0x080c, 0x0dc5, - 0x080c, 0xbfab, 0x0028, 0x080c, 0xc0e9, 0x0010, 0x080c, 0xc1df, - 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, 0x2c00, 0xa896, - 0x000e, 0x080c, 0xb62d, 0x0530, 0xa804, 0xa80e, 0x00a6, 0x2050, - 0xb100, 0x00ae, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, - 0xffc0, 0x9080, 0x0002, 0xaacc, 0xabd0, 0xacd4, 0xadd8, 0x2031, - 0x0000, 0x2041, 0x126c, 0x080c, 0xb7f1, 0x0160, 0x000e, 0x9005, - 0x0120, 0x00fe, 0x009e, 0x00de, 0x0005, 0x00fe, 0x009e, 0x00de, - 0x0804, 0xb2d3, 0x2001, 0x002c, 0x900e, 0x080c, 0xb693, 0x0c70, - 0x91b6, 0x0015, 0x0170, 0x91b6, 0x0016, 0x0158, 0x91b2, 0x0047, - 0x0a0c, 0x0dc5, 0x91b2, 0x0050, 0x1a0c, 0x0dc5, 0x9182, 0x0047, - 0x00ca, 0x2001, 0x0109, 0x2004, 0xd08c, 0x0198, 0x0126, 0x2091, - 0x2800, 0x0006, 0x0016, 0x0026, 0x080c, 0x94b1, 0x002e, 0x001e, - 0x000e, 0x012e, 0xa001, 0x6000, 0x9086, 0x0002, 0x1110, 0x0804, - 0xb419, 0x0005, 0xb4eb, 0xb4eb, 0xb4ed, 0xb523, 0xb4eb, 0xb4eb, - 0xb4eb, 0xb4eb, 0xb536, 0x080c, 0x0dc5, 0x00d6, 0x0016, 0x0096, - 0x080c, 0x9a61, 0x080c, 0x9bd3, 0x6003, 0x0004, 0x6114, 0x2148, - 0xa87c, 0xd0fc, 0x01c0, 0xa878, 0xc0fc, 0x9005, 0x1158, 0xa894, - 0x9005, 0x0140, 0x2001, 0x0000, 0x900e, 0x080c, 0xb693, 0x080c, - 0xb2d3, 0x00a8, 0x6003, 0x0002, 0xa8a4, 0xa9a8, 0x9105, 0x1178, - 0xa8ae, 0xa8b2, 0x0c78, 0xa87f, 0x0020, 0xa88c, 0xa88a, 0xa8a4, - 0xa8ae, 0xa8a8, 0xa8b2, 0xa8c7, 0x0000, 0xa8cb, 0x0000, 0x009e, - 0x001e, 0x00de, 0x0005, 0x080c, 0x9a61, 0x00d6, 0x0096, 0x6114, - 0x2148, 0x080c, 0xd0d8, 0x0120, 0xa87b, 0x0006, 0x080c, 0x6e9f, - 0x009e, 0x00de, 0x080c, 0xb2d3, 0x0804, 0x9bd3, 0x080c, 0x9a61, - 0x080c, 0x3250, 0x080c, 0xd7f8, 0x00d6, 0x0096, 0x6114, 0x2148, - 0x080c, 0xd0d8, 0x0120, 0xa87b, 0x0029, 0x080c, 0x6e9f, 0x009e, - 0x00de, 0x080c, 0xb2d3, 0x0804, 0x9bd3, 0x9182, 0x0047, 0x0002, - 0xb55d, 0xb55f, 0xb55d, 0xb55d, 0xb55d, 0xb55d, 0xb55d, 0xb55d, - 0xb55d, 0xb55d, 0xb55d, 0xb55d, 0xb55f, 0x080c, 0x0dc5, 0x00d6, - 0x0096, 0x601f, 0x0000, 0x6114, 0x2148, 0xa87b, 0x0000, 0xa883, - 0x0000, 0x080c, 0x6e9f, 0x009e, 0x00de, 0x0804, 0xb2d3, 0x0026, - 0x0036, 0x0056, 0x0066, 0x0096, 0x00a6, 0x00f6, 0x0006, 0x080c, - 0x100e, 0x000e, 0x090c, 0x0dc5, 0xa960, 0x21e8, 0xa95c, 0x9188, - 0x0019, 0x21a0, 0x900e, 0x20a9, 0x0020, 0x4104, 0xa87a, 0x2079, - 0x1800, 0x7990, 0x9188, 0x0018, 0x918c, 0x0fff, 0xa972, 0xac76, - 0x2950, 0x00a6, 0x2001, 0x0205, 0x2003, 0x0000, 0x901e, 0x2029, - 0x0001, 0x9182, 0x0035, 0x1228, 0x2011, 0x001f, 0x080c, 0xcc85, - 0x04c0, 0x2130, 0x2009, 0x0034, 0x2011, 0x001f, 0x080c, 0xcc85, - 0x96b2, 0x0034, 0xb004, 0x904d, 0x0110, 0x080c, 0x0fc0, 0x080c, - 0x100e, 0x01d0, 0x8528, 0xa867, 0x0110, 0xa86b, 0x0000, 0x2920, - 0xb406, 0x968a, 0x003d, 0x1230, 0x2608, 0x2011, 0x001b, 0x080c, - 0xcc85, 0x00b8, 0x96b2, 0x003c, 0x2009, 0x003c, 0x2950, 0x2011, - 0x001b, 0x080c, 0xcc85, 0x0c18, 0x2001, 0x0205, 0x2003, 0x0000, - 0x00ae, 0x852f, 0x95ad, 0x0050, 0xb566, 0xb070, 0xc0fd, 0xb072, - 0x0048, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, - 0x0050, 0xb566, 0x2a48, 0xa804, 0xa807, 0x0000, 0x0006, 0x080c, - 0x6e9f, 0x000e, 0x2048, 0x9005, 0x1db0, 0x00fe, 0x00ae, 0x009e, - 0x006e, 0x005e, 0x003e, 0x002e, 0x0005, 0x00d6, 0x00f6, 0x0096, - 0x0006, 0x080c, 0x100e, 0x000e, 0x090c, 0x0dc5, 0xa960, 0x21e8, - 0xa95c, 0x9188, 0x0019, 0x21a0, 0x900e, 0x20a9, 0x0020, 0x4104, - 0xaa66, 0xa87a, 0x2079, 0x1800, 0x7990, 0x810c, 0x9188, 0x000c, - 0x9182, 0x001a, 0x0210, 0x2009, 0x001a, 0x21a8, 0x810b, 0xa972, - 0xac76, 0x2e98, 0xa85c, 0x9080, 0x001f, 0x20a0, 0x2001, 0x0205, - 0x200c, 0x918d, 0x0080, 0x2102, 0x4003, 0x2003, 0x0000, 0x080c, - 0x6e9f, 0x009e, 0x00fe, 0x00de, 0x0005, 0x0016, 0x00d6, 0x00f6, - 0x0096, 0x0016, 0x2001, 0x0205, 0x200c, 0x918d, 0x0080, 0x2102, - 0x001e, 0x2079, 0x0200, 0x2e98, 0xa87c, 0xd0ec, 0x0118, 0x9e80, - 0x000c, 0x2098, 0x2021, 0x003e, 0x901e, 0x9282, 0x0020, 0x0218, - 0x2011, 0x0020, 0x2018, 0x9486, 0x003e, 0x1170, 0x0096, 0x080c, - 0x100e, 0x2900, 0x009e, 0x05c0, 0xa806, 0x2048, 0xa860, 0x20e8, - 0xa85c, 0x9080, 0x0002, 0x20a0, 0x3300, 0x908e, 0x0260, 0x0140, - 0x2009, 0x0280, 0x9102, 0x920a, 0x0218, 0x2010, 0x2100, 0x9318, - 0x2200, 0x9402, 0x1228, 0x2400, 0x9202, 0x2410, 0x9318, 0x9006, - 0x2020, 0x22a8, 0xa800, 0x9200, 0xa802, 0x20e1, 0x0000, 0x4003, - 0x83ff, 0x0180, 0x3300, 0x9086, 0x0280, 0x1130, 0x7814, 0x8000, - 0x9085, 0x0080, 0x7816, 0x2e98, 0x2310, 0x84ff, 0x0904, 0xb642, - 0x0804, 0xb644, 0x9085, 0x0001, 0x7817, 0x0000, 0x009e, 0x00fe, - 0x00de, 0x001e, 0x0005, 0x00d6, 0x0036, 0x0096, 0x6314, 0x2348, - 0xa87a, 0xa982, 0x080c, 0x6e92, 0x009e, 0x003e, 0x00de, 0x0005, - 0x91b6, 0x0015, 0x1118, 0x080c, 0xb2d3, 0x0030, 0x91b6, 0x0016, - 0x190c, 0x0dc5, 0x080c, 0xb2d3, 0x0005, 0x20a9, 0x000e, 0x20e1, - 0x0000, 0x2e98, 0x6014, 0x0096, 0x2048, 0xa860, 0x20e8, 0xa85c, - 0x20a0, 0x009e, 0x4003, 0x9196, 0x0016, 0x01f0, 0x0136, 0x9080, - 0x001b, 0x20a0, 0x2011, 0x0006, 0x20a9, 0x0001, 0x3418, 0x8318, - 0x23a0, 0x4003, 0x3318, 0x8318, 0x2398, 0x8211, 0x1db8, 0x2011, - 0x0006, 0x013e, 0x20a0, 0x3318, 0x8318, 0x2398, 0x4003, 0x3418, - 0x8318, 0x23a0, 0x8211, 0x1db8, 0x0096, 0x080c, 0xd0d8, 0x0130, - 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0x009e, 0x0804, - 0xb2d3, 0x0096, 0x00d6, 0x0036, 0x7330, 0x9386, 0x0200, 0x11a8, - 0x6010, 0x00b6, 0x2058, 0xb8cf, 0x0000, 0x00be, 0x6014, 0x9005, - 0x0130, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xab32, 0x080c, - 0xb2d3, 0x003e, 0x00de, 0x009e, 0x0005, 0x0011, 0x1d48, 0x0cc8, - 0x0006, 0x0016, 0x080c, 0xd7e3, 0x0188, 0x6014, 0x9005, 0x1170, - 0x600b, 0x0003, 0x601b, 0x0000, 0x6043, 0x0000, 0x2009, 0x0022, - 0x080c, 0xbadd, 0x9006, 0x001e, 0x000e, 0x0005, 0x9085, 0x0001, - 0x0cd0, 0x0096, 0x0016, 0x20a9, 0x0014, 0x9e80, 0x000c, 0x20e1, - 0x0000, 0x2098, 0x6014, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080, - 0x0002, 0x20a0, 0x4003, 0x2001, 0x0205, 0x2003, 0x0001, 0x2099, - 0x0260, 0x20a9, 0x0016, 0x4003, 0x20a9, 0x000a, 0xa804, 0x2048, - 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x2001, - 0x0205, 0x2003, 0x0002, 0x2099, 0x0260, 0x20a9, 0x0020, 0x4003, - 0x2003, 0x0000, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, 0x0103, - 0x080c, 0xb2d3, 0x001e, 0x009e, 0x0005, 0x0096, 0x0016, 0x900e, - 0x7030, 0x9086, 0x0100, 0x0140, 0x7038, 0x9084, 0x00ff, 0x800c, - 0x703c, 0x9084, 0x00ff, 0x8004, 0x9080, 0x0004, 0x9108, 0x810b, - 0x2011, 0x0002, 0x2019, 0x000c, 0x6014, 0x2048, 0x080c, 0xcc85, - 0x080c, 0xd0d8, 0x0140, 0x6014, 0x2048, 0xa807, 0x0000, 0xa864, - 0xa8e2, 0xa867, 0x0103, 0x080c, 0xb2d3, 0x001e, 0x009e, 0x0005, - 0x0016, 0x2009, 0x0000, 0x7030, 0x9086, 0x0200, 0x0110, 0x2009, - 0x0001, 0x0096, 0x6014, 0x904d, 0x090c, 0x0dc5, 0xa97a, 0x080c, - 0x6e9f, 0x009e, 0x080c, 0xb2d3, 0x001e, 0x0005, 0x0016, 0x0096, - 0x7030, 0x9086, 0x0100, 0x1118, 0x2009, 0x0004, 0x0010, 0x7034, - 0x800c, 0x810b, 0x2011, 0x000c, 0x2019, 0x000c, 0x6014, 0x2048, - 0xa804, 0x0096, 0x9005, 0x0108, 0x2048, 0x080c, 0xcc85, 0x009e, - 0x080c, 0xd0d8, 0x0148, 0xa804, 0x9005, 0x1158, 0xa807, 0x0000, - 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c, 0xb2d3, 0x009e, 0x001e, - 0x0005, 0x0086, 0x2040, 0xa030, 0x8007, 0x9086, 0x0100, 0x1118, - 0x080c, 0xbcb6, 0x00e0, 0xa034, 0x8007, 0x800c, 0x8806, 0x8006, - 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x000c, 0xa87b, - 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0xaaa0, 0xab9c, 0xaca8, - 0xada4, 0x2031, 0x0000, 0x2041, 0x1252, 0x0019, 0x0d08, 0x008e, - 0x0898, 0x0096, 0x0006, 0x080c, 0x100e, 0x000e, 0x01b0, 0xa8ab, - 0x0dcb, 0xa876, 0x000e, 0xa8a2, 0x0006, 0xae6a, 0x2800, 0xa89e, - 0xa97a, 0xaf72, 0xaa8e, 0xab92, 0xac96, 0xad9a, 0x0086, 0x2940, - 0x080c, 0x10f8, 0x008e, 0x9085, 0x0001, 0x009e, 0x0005, 0x00e6, - 0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210, 0x00b6, 0x2258, - 0xba10, 0x00be, 0x9206, 0x1520, 0x700c, 0x6210, 0x00b6, 0x2258, - 0xba14, 0x00be, 0x9206, 0x11e0, 0x6043, 0x0000, 0x2c68, 0x0016, - 0x2009, 0x0035, 0x080c, 0xd759, 0x001e, 0x1158, 0x622c, 0x2268, - 0x2071, 0x026c, 0x6b20, 0x9386, 0x0003, 0x0130, 0x9386, 0x0006, - 0x0128, 0x080c, 0xb2d3, 0x0020, 0x0039, 0x0010, 0x080c, 0xb910, - 0x002e, 0x00de, 0x00ee, 0x0005, 0x0096, 0x6814, 0x2048, 0x9186, - 0x0015, 0x0904, 0xb8f8, 0x918e, 0x0016, 0x1904, 0xb90e, 0x700c, - 0x908c, 0xff00, 0x9186, 0x1700, 0x0120, 0x9186, 0x0300, 0x1904, - 0xb8d2, 0x89ff, 0x1138, 0x6800, 0x9086, 0x000f, 0x0904, 0xb8b5, - 0x0804, 0xb90c, 0x6808, 0x9086, 0xffff, 0x1904, 0xb8fa, 0xa87c, - 0x9084, 0x0060, 0x9086, 0x0020, 0x1128, 0xa83c, 0xa940, 0x9105, - 0x1904, 0xb8fa, 0x6824, 0xd084, 0x1904, 0xb8fa, 0xd0b4, 0x0158, - 0x0016, 0x2001, 0x1986, 0x200c, 0x6018, 0x9102, 0x9082, 0x0005, - 0x001e, 0x1a04, 0xb8fa, 0x080c, 0xd2c3, 0x685c, 0xa882, 0xa87c, - 0xc0dc, 0xc0f4, 0xc0d4, 0xa87e, 0x0026, 0x900e, 0x6a18, 0x2001, - 0x000a, 0x080c, 0x9375, 0xa884, 0x920a, 0x0208, 0x8011, 0xaa86, - 0x82ff, 0x002e, 0x1138, 0x00c6, 0x2d60, 0x080c, 0xcde3, 0x00ce, - 0x0804, 0xb90c, 0x00c6, 0xa868, 0xd0fc, 0x1118, 0x080c, 0x61c2, - 0x0010, 0x080c, 0x65cf, 0x00ce, 0x1904, 0xb8fa, 0x00c6, 0x2d60, - 0x080c, 0xb2d3, 0x00ce, 0x0804, 0xb90c, 0x00c6, 0x080c, 0xb325, - 0x0198, 0x6017, 0x0000, 0x6810, 0x6012, 0x080c, 0xd554, 0x6023, - 0x0003, 0x6904, 0x00c6, 0x2d60, 0x080c, 0xb2d3, 0x00ce, 0x080c, - 0xb352, 0x00ce, 0x0804, 0xb90c, 0x2001, 0x1988, 0x2004, 0x6842, - 0x00ce, 0x04d0, 0x7008, 0x9086, 0x000b, 0x11c8, 0x6010, 0x00b6, - 0x2058, 0xb900, 0xc1bc, 0xb902, 0x00be, 0x00c6, 0x2d60, 0xa87b, - 0x0003, 0x080c, 0xd79d, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, - 0x0002, 0x080c, 0x94ff, 0x080c, 0x9ab1, 0x00ce, 0x00e8, 0x700c, - 0x9086, 0x2a00, 0x1138, 0x2001, 0x1988, 0x2004, 0x6842, 0x00a0, - 0x0479, 0x00a0, 0x89ff, 0x090c, 0x0dc5, 0x00c6, 0x00d6, 0x2d60, - 0xa867, 0x0103, 0xa87b, 0x0003, 0x080c, 0x6cb9, 0x080c, 0xd2c3, - 0x080c, 0xb306, 0x00de, 0x00ce, 0x080c, 0xb2d3, 0x009e, 0x0005, - 0x9186, 0x0015, 0x1128, 0x2001, 0x1988, 0x2004, 0x6842, 0x0068, - 0x918e, 0x0016, 0x1160, 0x00c6, 0x2d00, 0x2060, 0x080c, 0xee87, - 0x080c, 0x8a25, 0x080c, 0xb2d3, 0x00ce, 0x080c, 0xb2d3, 0x0005, - 0x0026, 0x0036, 0x0046, 0x7228, 0xacb0, 0xabac, 0xd2f4, 0x0130, - 0x2001, 0x1988, 0x2004, 0x6842, 0x0804, 0xb98a, 0x00c6, 0x2d60, - 0x080c, 0xcce6, 0x00ce, 0x6804, 0x9086, 0x0050, 0x1168, 0x00c6, - 0x2d00, 0x2060, 0x6003, 0x0001, 0x6007, 0x0050, 0x080c, 0x94ff, - 0x080c, 0x9ab1, 0x00ce, 0x04f0, 0x6800, 0x9086, 0x000f, 0x01a8, - 0x89ff, 0x090c, 0x0dc5, 0x6800, 0x9086, 0x0004, 0x1190, 0xa87c, - 0xd0ac, 0x0178, 0xa843, 0x0fff, 0xa83f, 0x0fff, 0xa880, 0xc0fc, - 0xa882, 0x2001, 0x0001, 0x6832, 0x0400, 0x2001, 0x0007, 0x6832, - 0x00e0, 0xa87c, 0xd0b4, 0x1150, 0xd0ac, 0x0db8, 0x6824, 0xd0f4, - 0x1d48, 0xa838, 0xa934, 0x9105, 0x0d80, 0x0c20, 0xd2ec, 0x1d68, - 0x7024, 0x9306, 0x1118, 0x7020, 0x9406, 0x0d38, 0x7020, 0x683e, - 0x7024, 0x683a, 0x2001, 0x0005, 0x6832, 0x080c, 0xd44b, 0x080c, - 0x9ab1, 0x0010, 0x080c, 0xb2d3, 0x004e, 0x003e, 0x002e, 0x0005, - 0x00e6, 0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210, 0x00b6, - 0x2258, 0xba10, 0x00be, 0x9206, 0x1904, 0xb9f5, 0x700c, 0x6210, - 0x00b6, 0x2258, 0xba14, 0x00be, 0x9206, 0x1904, 0xb9f5, 0x6038, - 0x2068, 0x6824, 0xc0dc, 0x6826, 0x6a20, 0x9286, 0x0007, 0x0904, - 0xb9f5, 0x9286, 0x0002, 0x0904, 0xb9f5, 0x9286, 0x0000, 0x05e8, - 0x6808, 0x633c, 0x9306, 0x15c8, 0x2071, 0x026c, 0x9186, 0x0015, - 0x0570, 0x918e, 0x0016, 0x1100, 0x00c6, 0x6038, 0x2060, 0x6104, - 0x9186, 0x004b, 0x01c0, 0x9186, 0x004c, 0x01a8, 0x9186, 0x004d, - 0x0190, 0x9186, 0x004e, 0x0178, 0x9186, 0x0052, 0x0160, 0x6014, - 0x0096, 0x2048, 0x080c, 0xd0d8, 0x090c, 0x0dc5, 0xa87b, 0x0003, - 0x009e, 0x080c, 0xd79d, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, - 0x0002, 0x080c, 0x94ff, 0x080c, 0x9ab1, 0x00ce, 0x0030, 0x6038, - 0x2070, 0x2001, 0x1988, 0x2004, 0x7042, 0x080c, 0xb2d3, 0x002e, - 0x00de, 0x00ee, 0x0005, 0x00b6, 0x0096, 0x00f6, 0x6014, 0x2048, - 0x6010, 0x2058, 0x91b6, 0x0015, 0x0130, 0xba08, 0xbb0c, 0xbc00, - 0xc48c, 0xbc02, 0x0470, 0x0096, 0x0156, 0x0036, 0x0026, 0x2b48, - 0x9e90, 0x0010, 0x2019, 0x000a, 0x20a9, 0x0004, 0x080c, 0xc379, - 0x002e, 0x003e, 0x015e, 0x009e, 0x1904, 0xba66, 0x0096, 0x0156, - 0x0036, 0x0026, 0x2b48, 0x9e90, 0x0014, 0x2019, 0x0006, 0x20a9, - 0x0004, 0x080c, 0xc379, 0x002e, 0x003e, 0x015e, 0x009e, 0x15b0, - 0x7238, 0xba0a, 0x733c, 0xbb0e, 0x83ff, 0x0118, 0xbc00, 0xc48d, - 0xbc02, 0xa804, 0x9005, 0x1128, 0x00fe, 0x009e, 0x00be, 0x0804, - 0xb6dc, 0x0096, 0x2048, 0xaa12, 0xab16, 0xac0a, 0x009e, 0x8006, - 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, - 0x2009, 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, - 0x2041, 0x1252, 0x080c, 0xb7f1, 0x0130, 0x00fe, 0x009e, 0x080c, - 0xb2d3, 0x00be, 0x0005, 0x080c, 0xbcb6, 0x0cb8, 0x2b78, 0x00f6, - 0x080c, 0x3250, 0x080c, 0xd7f8, 0x00fe, 0x00c6, 0x080c, 0xb27d, - 0x2f00, 0x6012, 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, - 0x6003, 0x0001, 0x2001, 0x0007, 0x080c, 0x666a, 0x080c, 0x6696, - 0x080c, 0x9547, 0x080c, 0x9ab1, 0x00ce, 0x0804, 0xba39, 0x2100, - 0x91b2, 0x0053, 0x1a0c, 0x0dc5, 0x91b2, 0x0040, 0x1a04, 0xbaef, - 0x0002, 0xbadd, 0xbadd, 0xbad3, 0xbadd, 0xbadd, 0xbadd, 0xbad1, - 0xbad1, 0xbad1, 0xbad1, 0xbad1, 0xbad1, 0xbad1, 0xbad1, 0xbad1, - 0xbad1, 0xbad1, 0xbad1, 0xbad1, 0xbad1, 0xbad1, 0xbad1, 0xbad1, - 0xbad1, 0xbad1, 0xbad1, 0xbad1, 0xbad1, 0xbad1, 0xbad1, 0xbad1, - 0xbadd, 0xbad1, 0xbadd, 0xbadd, 0xbad1, 0xbad1, 0xbad1, 0xbad1, - 0xbad1, 0xbad3, 0xbad1, 0xbad1, 0xbad1, 0xbad1, 0xbad1, 0xbad1, - 0xbad1, 0xbad1, 0xbad1, 0xbadd, 0xbadd, 0xbad1, 0xbad1, 0xbad1, - 0xbad1, 0xbad1, 0xbad1, 0xbad1, 0xbad1, 0xbad1, 0xbadd, 0xbad1, - 0xbad1, 0x080c, 0x0dc5, 0x0066, 0x00b6, 0x6610, 0x2658, 0xb8cc, - 0xc08c, 0xb8ce, 0x00be, 0x006e, 0x0000, 0x6003, 0x0001, 0x6106, - 0x9186, 0x0032, 0x0118, 0x080c, 0x9547, 0x0010, 0x080c, 0x94ff, - 0x0126, 0x2091, 0x8000, 0x080c, 0x9ab1, 0x012e, 0x0005, 0x2600, - 0x0002, 0xbadd, 0xbadd, 0xbb03, 0xbadd, 0xbadd, 0xbb03, 0xbb03, - 0xbb03, 0xbb03, 0xbadd, 0xbb03, 0xbadd, 0xbb03, 0xbadd, 0xbb03, - 0xbb03, 0xbb03, 0xbb03, 0x080c, 0x0dc5, 0x6004, 0x90b2, 0x0053, - 0x1a0c, 0x0dc5, 0x91b6, 0x0013, 0x0904, 0xbbd8, 0x91b6, 0x0027, - 0x1904, 0xbb82, 0x080c, 0x99a5, 0x6004, 0x080c, 0xd2cf, 0x01b0, - 0x080c, 0xd2e0, 0x01a8, 0x908e, 0x0021, 0x0904, 0xbb7f, 0x908e, - 0x0022, 0x1130, 0x080c, 0xb708, 0x0904, 0xbb7b, 0x0804, 0xbb7c, - 0x908e, 0x003d, 0x0904, 0xbb7f, 0x0804, 0xbb75, 0x080c, 0x3279, - 0x2001, 0x0007, 0x080c, 0x666a, 0x6010, 0x00b6, 0x2058, 0xb9a0, - 0x00be, 0x080c, 0xbcb6, 0x9186, 0x007e, 0x1148, 0x2001, 0x1837, - 0x2014, 0xc285, 0x080c, 0x7637, 0x1108, 0xc2ad, 0x2202, 0x0036, - 0x0026, 0x2019, 0x0028, 0x2110, 0x080c, 0xef94, 0x002e, 0x003e, - 0x0016, 0x0026, 0x0036, 0x2110, 0x2019, 0x0028, 0x080c, 0x96a4, - 0x0076, 0x903e, 0x080c, 0x9577, 0x6010, 0x00b6, 0x905d, 0x0100, - 0x00be, 0x2c08, 0x080c, 0xe91c, 0x007e, 0x003e, 0x002e, 0x001e, - 0x080c, 0xd7f8, 0x0016, 0x080c, 0xd54c, 0x080c, 0xb2d3, 0x001e, - 0x080c, 0x334c, 0x080c, 0x9ab1, 0x0030, 0x080c, 0xd54c, 0x080c, - 0xb2d3, 0x080c, 0x9ab1, 0x0005, 0x080c, 0xbcb6, 0x0cb0, 0x080c, - 0xbcf2, 0x0c98, 0x9186, 0x0015, 0x0118, 0x9186, 0x0016, 0x1148, - 0x080c, 0xd809, 0x0d80, 0x6000, 0x9086, 0x0002, 0x0904, 0xbcfd, - 0x0c50, 0x9186, 0x0014, 0x1d38, 0x080c, 0x99a5, 0x6004, 0x908e, - 0x0022, 0x1118, 0x080c, 0xb708, 0x09f0, 0x080c, 0x3250, 0x080c, - 0xd7f8, 0x080c, 0xd2cf, 0x1198, 0x080c, 0x3279, 0x6010, 0x00b6, - 0x2058, 0xb9a0, 0x00be, 0x080c, 0xbcb6, 0x9186, 0x007e, 0x1128, - 0x2001, 0x1837, 0x200c, 0xc185, 0x2102, 0x0804, 0xbb75, 0x080c, - 0xd2e0, 0x1120, 0x080c, 0xbcb6, 0x0804, 0xbb75, 0x6004, 0x908e, - 0x0032, 0x1160, 0x00e6, 0x00f6, 0x2071, 0x189e, 0x2079, 0x0000, - 0x080c, 0x35e7, 0x00fe, 0x00ee, 0x0804, 0xbb75, 0x6004, 0x908e, - 0x0021, 0x0d40, 0x908e, 0x0022, 0x090c, 0xbcb6, 0x0804, 0xbb75, - 0x90b2, 0x0040, 0x1a04, 0xbc92, 0x2008, 0x0002, 0xbc20, 0xbc21, - 0xbc24, 0xbc27, 0xbc2a, 0xbc37, 0xbc1e, 0xbc1e, 0xbc1e, 0xbc1e, - 0xbc1e, 0xbc1e, 0xbc1e, 0xbc1e, 0xbc1e, 0xbc1e, 0xbc1e, 0xbc1e, - 0xbc1e, 0xbc1e, 0xbc1e, 0xbc1e, 0xbc1e, 0xbc1e, 0xbc1e, 0xbc1e, - 0xbc1e, 0xbc1e, 0xbc1e, 0xbc1e, 0xbc3a, 0xbc47, 0xbc1e, 0xbc49, - 0xbc47, 0xbc1e, 0xbc1e, 0xbc1e, 0xbc1e, 0xbc1e, 0xbc47, 0xbc47, - 0xbc1e, 0xbc1e, 0xbc1e, 0xbc1e, 0xbc1e, 0xbc1e, 0xbc1e, 0xbc1e, - 0xbc79, 0xbc47, 0xbc1e, 0xbc43, 0xbc1e, 0xbc1e, 0xbc1e, 0xbc44, - 0xbc1e, 0xbc1e, 0xbc1e, 0xbc47, 0xbc70, 0xbc1e, 0x080c, 0x0dc5, - 0x0430, 0x2001, 0x000b, 0x0470, 0x2001, 0x0003, 0x0458, 0x2001, - 0x0005, 0x0440, 0x6010, 0x00b6, 0x2058, 0xb804, 0x00be, 0x9084, - 0x00ff, 0x9086, 0x0000, 0x1500, 0x2001, 0x0001, 0x00d8, 0x2001, - 0x0009, 0x00c0, 0x080c, 0x99a5, 0x6003, 0x0005, 0x080c, 0xd7fb, - 0x080c, 0x9ab1, 0x0070, 0x0018, 0x0010, 0x080c, 0x666a, 0x0804, - 0xbc8a, 0x080c, 0x99a5, 0x080c, 0xd7fb, 0x6003, 0x0004, 0x080c, - 0x9ab1, 0x0005, 0x080c, 0x666a, 0x080c, 0x99a5, 0x6003, 0x0002, - 0x0036, 0x2019, 0x1852, 0x2304, 0x9084, 0xff00, 0x1120, 0x2001, - 0x1986, 0x201c, 0x0040, 0x8007, 0x909a, 0x0004, 0x0ec0, 0x8003, - 0x801b, 0x831b, 0x9318, 0x631a, 0x003e, 0x080c, 0x9ab1, 0x0c08, - 0x080c, 0x99a5, 0x080c, 0xd54c, 0x080c, 0xb2d3, 0x080c, 0x9ab1, - 0x08c0, 0x00e6, 0x00f6, 0x2071, 0x189e, 0x2079, 0x0000, 0x080c, - 0x35e7, 0x00fe, 0x00ee, 0x080c, 0x99a5, 0x080c, 0xb2d3, 0x080c, - 0x9ab1, 0x0838, 0x080c, 0x99a5, 0x6003, 0x0002, 0x080c, 0xd7fb, - 0x0804, 0x9ab1, 0x2600, 0x2008, 0x0002, 0xbca9, 0xbc8a, 0xbca7, - 0xbc8a, 0xbc8a, 0xbca7, 0xbca7, 0xbca7, 0xbca7, 0xbc8a, 0xbca7, - 0xbc8a, 0xbca7, 0xbc8a, 0xbca7, 0xbca7, 0xbca7, 0xbca7, 0x080c, - 0x0dc5, 0x080c, 0x99a5, 0x0096, 0x6014, 0x2048, 0x080c, 0x6e9f, - 0x009e, 0x080c, 0xb2d3, 0x080c, 0x9ab1, 0x0005, 0x00e6, 0x0096, - 0x0026, 0x0016, 0x080c, 0xd0d8, 0x0568, 0x6014, 0x2048, 0xa864, - 0x9086, 0x0139, 0x11a8, 0xa894, 0x9086, 0x0056, 0x1148, 0x080c, - 0x556f, 0x0130, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x0028, - 0x2001, 0x0030, 0x900e, 0x2011, 0x4005, 0x080c, 0xd6bd, 0x0090, - 0xa868, 0xd0fc, 0x0178, 0xa807, 0x0000, 0x0016, 0x6004, 0x908e, - 0x0021, 0x0168, 0x908e, 0x003d, 0x0150, 0x001e, 0xa867, 0x0103, - 0xa833, 0x0100, 0x001e, 0x002e, 0x009e, 0x00ee, 0x0005, 0x001e, - 0x0009, 0x0cc0, 0x0096, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, - 0x0103, 0xa823, 0x8001, 0x009e, 0x0005, 0x00b6, 0x6610, 0x2658, - 0xb804, 0x9084, 0x00ff, 0x90b2, 0x000c, 0x1a0c, 0x0dc5, 0x6604, - 0x96b6, 0x004d, 0x1120, 0x080c, 0xd5dc, 0x0804, 0xbd82, 0x6604, - 0x96b6, 0x0043, 0x1120, 0x080c, 0xd625, 0x0804, 0xbd82, 0x6604, - 0x96b6, 0x004b, 0x1120, 0x080c, 0xd651, 0x0804, 0xbd82, 0x6604, - 0x96b6, 0x0033, 0x1120, 0x080c, 0xd56e, 0x0804, 0xbd82, 0x6604, - 0x96b6, 0x0028, 0x1120, 0x080c, 0xd31e, 0x0804, 0xbd82, 0x6604, - 0x96b6, 0x0029, 0x1120, 0x080c, 0xd35f, 0x0804, 0xbd82, 0x6604, - 0x96b6, 0x001f, 0x1120, 0x080c, 0xb6ad, 0x0804, 0xbd82, 0x6604, - 0x96b6, 0x0000, 0x1118, 0x080c, 0xb9fb, 0x04e0, 0x6604, 0x96b6, - 0x0022, 0x1118, 0x080c, 0xb6e9, 0x04a8, 0x6604, 0x96b6, 0x0035, - 0x1118, 0x080c, 0xb80f, 0x0470, 0x6604, 0x96b6, 0x0039, 0x1118, - 0x080c, 0xb990, 0x0438, 0x6604, 0x96b6, 0x003d, 0x1118, 0x080c, - 0xb721, 0x0400, 0x6604, 0x96b6, 0x0044, 0x1118, 0x080c, 0xb75d, - 0x00c8, 0x6604, 0x96b6, 0x0049, 0x1118, 0x080c, 0xb79e, 0x0090, - 0x6604, 0x96b6, 0x0041, 0x1118, 0x080c, 0xb788, 0x0058, 0x91b6, - 0x0015, 0x1110, 0x0063, 0x0030, 0x91b6, 0x0016, 0x1128, 0x00be, - 0x0804, 0xc08e, 0x00be, 0x0005, 0x080c, 0xb36d, 0x0cd8, 0xbd9f, - 0xbdad, 0xbd9f, 0xbdf4, 0xbd9f, 0xbfab, 0xc09b, 0xbd9f, 0xbd9f, - 0xc064, 0xbd9f, 0xc07a, 0x0096, 0x601f, 0x0000, 0x6014, 0x2048, - 0xa800, 0x2048, 0xa867, 0x0103, 0x009e, 0x0804, 0xb2d3, 0xa001, - 0xa001, 0x0005, 0x6604, 0x96b6, 0x0004, 0x1130, 0x2001, 0x0001, - 0x080c, 0x6656, 0x0804, 0xb2d3, 0x0005, 0x00e6, 0x2071, 0x1800, - 0x7090, 0x9086, 0x0074, 0x1540, 0x080c, 0xe8ed, 0x11b0, 0x6010, - 0x00b6, 0x2058, 0x7030, 0xd08c, 0x0128, 0xb800, 0xd0bc, 0x0110, - 0xc0c5, 0xb802, 0x00f9, 0x00be, 0x2001, 0x0006, 0x080c, 0x666a, - 0x080c, 0x3279, 0x080c, 0xb2d3, 0x0098, 0x2001, 0x000a, 0x080c, - 0x666a, 0x080c, 0x3279, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, - 0x9547, 0x080c, 0x9ab1, 0x0020, 0x2001, 0x0001, 0x080c, 0xbf7b, - 0x00ee, 0x0005, 0x00d6, 0xb800, 0xd084, 0x0160, 0x9006, 0x080c, - 0x6656, 0x2069, 0x1847, 0x6804, 0xd0a4, 0x0120, 0x2001, 0x0006, - 0x080c, 0x6696, 0x00de, 0x0005, 0x00b6, 0x0096, 0x00d6, 0x2011, - 0x1824, 0x2204, 0x9086, 0x0074, 0x1904, 0xbf50, 0x6010, 0x2058, - 0xbaa0, 0x9286, 0x007e, 0x1120, 0x080c, 0xc1ea, 0x0804, 0xbebd, - 0x2001, 0x180d, 0x2004, 0xd08c, 0x0904, 0xbe5f, 0x00d6, 0x080c, - 0x7637, 0x01a0, 0x0026, 0x2011, 0x0010, 0x080c, 0x6ac7, 0x002e, - 0x0904, 0xbe5e, 0x080c, 0x57e9, 0x1598, 0x6014, 0x2048, 0xa807, - 0x0000, 0xa867, 0x0103, 0xa833, 0xdead, 0x0450, 0x6010, 0x00b6, - 0x2058, 0xb910, 0x00be, 0x9186, 0x00ff, 0x0580, 0x0026, 0x2011, - 0x8008, 0x080c, 0x6ac7, 0x002e, 0x0548, 0x6014, 0x9005, 0x090c, - 0x0dc5, 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, - 0x2001, 0x0030, 0x900e, 0x2011, 0x4009, 0x080c, 0xd6bd, 0x0040, - 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0xdead, - 0x6010, 0x2058, 0xb9a0, 0x0016, 0x080c, 0x3279, 0x080c, 0xb2d3, - 0x001e, 0x080c, 0x334c, 0x00de, 0x0804, 0xbf55, 0x00de, 0x080c, - 0xc1df, 0x6010, 0x2058, 0xbaa0, 0x9286, 0x0080, 0x1510, 0x6014, - 0x9005, 0x01a8, 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, - 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xd6bd, - 0x0030, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x2001, - 0x0006, 0x080c, 0x666a, 0x080c, 0x3279, 0x080c, 0xb2d3, 0x0804, - 0xbf55, 0x080c, 0xbf63, 0x6014, 0x9005, 0x0190, 0x2048, 0xa868, - 0xd0f4, 0x01e8, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1d08, - 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xd6bd, 0x08f8, - 0x080c, 0xbf59, 0x0160, 0x9006, 0x080c, 0x6656, 0x2001, 0x0004, - 0x080c, 0x6696, 0x2001, 0x0007, 0x080c, 0x666a, 0x08a0, 0x2001, - 0x0004, 0x080c, 0x666a, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, - 0x9547, 0x080c, 0x9ab1, 0x0804, 0xbf55, 0xb85c, 0xd0e4, 0x0178, - 0x080c, 0xd4ee, 0x080c, 0x7637, 0x0118, 0xd0dc, 0x1904, 0xbe7f, - 0x2011, 0x1837, 0x2204, 0xc0ad, 0x2012, 0x0804, 0xbe7f, 0x080c, - 0xd52b, 0x2011, 0x1837, 0x2204, 0xc0a5, 0x2012, 0x0006, 0x080c, - 0xeab9, 0x000e, 0x1904, 0xbe7f, 0xc0b5, 0x2012, 0x2001, 0x0006, - 0x080c, 0x666a, 0x9006, 0x080c, 0x6656, 0x00c6, 0x2001, 0x180f, - 0x2004, 0xd09c, 0x0520, 0x00f6, 0x2079, 0x0100, 0x00e6, 0x2071, - 0x1800, 0x700c, 0x9084, 0x00ff, 0x78e6, 0x707e, 0x7010, 0x78ea, - 0x7082, 0x908c, 0x00ff, 0x00ee, 0x780c, 0xc0b5, 0x780e, 0x00fe, - 0x080c, 0x28bc, 0x00f6, 0x2100, 0x900e, 0x080c, 0x2873, 0x795e, - 0x00fe, 0x9186, 0x0081, 0x01f0, 0x2009, 0x0081, 0x00e0, 0x2009, - 0x00ef, 0x00f6, 0x2079, 0x0100, 0x79ea, 0x78e7, 0x0000, 0x7932, - 0x7936, 0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x28bc, 0x00f6, - 0x2079, 0x1800, 0x7982, 0x2100, 0x900e, 0x797e, 0x080c, 0x2873, - 0x795e, 0x00fe, 0x8108, 0x080c, 0x66b9, 0x2b00, 0x00ce, 0x1904, - 0xbe7f, 0x6012, 0x2009, 0x180f, 0x210c, 0xd19c, 0x0150, 0x2009, - 0x027c, 0x210c, 0x918c, 0x00ff, 0xb912, 0x2009, 0x027d, 0x210c, - 0xb916, 0x2001, 0x0002, 0x080c, 0x666a, 0x6023, 0x0001, 0x6003, - 0x0001, 0x6007, 0x0002, 0x080c, 0x9547, 0x080c, 0x9ab1, 0x0028, - 0x080c, 0xbcb6, 0x2001, 0x0001, 0x0431, 0x00de, 0x009e, 0x00be, - 0x0005, 0x2001, 0x1810, 0x2004, 0xd0a4, 0x0120, 0x2001, 0x1848, - 0x2004, 0xd0ac, 0x0005, 0x00e6, 0x080c, 0xefed, 0x0190, 0x2071, - 0x0260, 0x7108, 0x720c, 0x918c, 0x00ff, 0x1118, 0x9284, 0xff00, - 0x0140, 0x6010, 0x2058, 0xb8a0, 0x9084, 0xff80, 0x1110, 0xb912, - 0xba16, 0x00ee, 0x0005, 0x2030, 0x9005, 0x0158, 0x2001, 0x0007, - 0x080c, 0x666a, 0x080c, 0x57e9, 0x1120, 0x2001, 0x0007, 0x080c, - 0x6696, 0x2600, 0x9005, 0x11b0, 0x6014, 0x0096, 0x2048, 0xa868, - 0x009e, 0xd0fc, 0x1178, 0x0036, 0x0046, 0x6010, 0x00b6, 0x2058, - 0xbba0, 0x00be, 0x2021, 0x0004, 0x2011, 0x8014, 0x080c, 0x4c44, - 0x004e, 0x003e, 0x080c, 0x3279, 0x6020, 0x9086, 0x000a, 0x1108, - 0x0005, 0x0804, 0xb2d3, 0x00b6, 0x00e6, 0x0026, 0x0016, 0x2071, - 0x1800, 0x7090, 0x9086, 0x0014, 0x1904, 0xc05a, 0x2001, 0x180d, - 0x2004, 0xd08c, 0x0904, 0xc00d, 0x00d6, 0x080c, 0x7637, 0x01a0, - 0x0026, 0x2011, 0x0010, 0x080c, 0x6ac7, 0x002e, 0x0904, 0xc00c, - 0x080c, 0x57e9, 0x1598, 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, - 0x0103, 0xa833, 0xdead, 0x0450, 0x6010, 0x00b6, 0x2058, 0xb910, - 0x00be, 0x9186, 0x00ff, 0x0580, 0x0026, 0x2011, 0x8008, 0x080c, - 0x6ac7, 0x002e, 0x0548, 0x6014, 0x9005, 0x090c, 0x0dc5, 0x2048, - 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0030, - 0x900e, 0x2011, 0x4009, 0x080c, 0xd6bd, 0x0040, 0x6014, 0x2048, - 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0xdead, 0x6010, 0x2058, - 0xb9a0, 0x0016, 0x080c, 0x3279, 0x080c, 0xb2d3, 0x001e, 0x080c, - 0x334c, 0x00de, 0x0804, 0xc05f, 0x00de, 0x080c, 0x57e9, 0x1170, - 0x6014, 0x9005, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058, 0xbba0, - 0x2021, 0x0006, 0x080c, 0x4dfb, 0x004e, 0x003e, 0x00d6, 0x6010, - 0x2058, 0x080c, 0x67bf, 0x080c, 0xbde2, 0x00de, 0x080c, 0xc2b5, - 0x1588, 0x6010, 0x2058, 0xb890, 0x9005, 0x0560, 0x2001, 0x0006, - 0x080c, 0x666a, 0x0096, 0x6014, 0x904d, 0x01d0, 0xa864, 0x9084, - 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, - 0x4000, 0x080c, 0xd6bd, 0x0060, 0xa864, 0x9084, 0x00ff, 0x9086, - 0x0029, 0x0130, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, - 0x009e, 0x080c, 0x3279, 0x6020, 0x9086, 0x000a, 0x0140, 0x080c, - 0xb2d3, 0x0028, 0x080c, 0xbcb6, 0x9006, 0x080c, 0xbf7b, 0x001e, - 0x002e, 0x00ee, 0x00be, 0x0005, 0x2011, 0x1824, 0x2204, 0x9086, - 0x0014, 0x1160, 0x2001, 0x0002, 0x080c, 0x666a, 0x6003, 0x0001, - 0x6007, 0x0001, 0x080c, 0x9547, 0x0804, 0x9ab1, 0x2001, 0x0001, - 0x0804, 0xbf7b, 0x2030, 0x2011, 0x1824, 0x2204, 0x9086, 0x0004, - 0x1148, 0x96b6, 0x000b, 0x1120, 0x2001, 0x0007, 0x080c, 0x666a, - 0x0804, 0xb2d3, 0x2001, 0x0001, 0x0804, 0xbf7b, 0x0002, 0xbd9f, - 0xc0a6, 0xbd9f, 0xc0e9, 0xbd9f, 0xc196, 0xc09b, 0xbda2, 0xbd9f, - 0xc1aa, 0xbd9f, 0xc1bc, 0x6604, 0x9686, 0x0003, 0x0904, 0xbfab, - 0x96b6, 0x001e, 0x1110, 0x080c, 0xb2d3, 0x0005, 0x00b6, 0x00d6, - 0x00c6, 0x080c, 0xc1ce, 0x11a0, 0x9006, 0x080c, 0x6656, 0x080c, - 0x3250, 0x080c, 0xd7f8, 0x2001, 0x0002, 0x080c, 0x666a, 0x6003, - 0x0001, 0x6007, 0x0002, 0x080c, 0x9547, 0x080c, 0x9ab1, 0x0428, - 0x2009, 0x026e, 0x2104, 0x9086, 0x0009, 0x1160, 0x6010, 0x2058, - 0xb840, 0x9084, 0x00ff, 0x9005, 0x0180, 0x8001, 0xb842, 0x601b, - 0x000a, 0x0098, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00, 0x908e, - 0x1900, 0x0158, 0x908e, 0x1e00, 0x0990, 0x080c, 0x3250, 0x080c, - 0xd7f8, 0x2001, 0x0001, 0x080c, 0xbf7b, 0x00ce, 0x00de, 0x00be, - 0x0005, 0x0096, 0x00b6, 0x0026, 0x9016, 0x080c, 0xc1dc, 0x00d6, - 0x2069, 0x197c, 0x2d04, 0x9005, 0x0168, 0x6010, 0x2058, 0xb8a0, - 0x9086, 0x007e, 0x1138, 0x2069, 0x1820, 0x2d04, 0x8000, 0x206a, - 0x00de, 0x0010, 0x00de, 0x0088, 0x9006, 0x080c, 0x6656, 0x2001, - 0x0002, 0x080c, 0x666a, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, - 0x9547, 0x080c, 0x9ab1, 0x0804, 0xc166, 0x080c, 0xd0d8, 0x01b0, - 0x6014, 0x2048, 0xa864, 0x2010, 0x9086, 0x0139, 0x1138, 0x6007, - 0x0016, 0x2001, 0x0002, 0x080c, 0xd71a, 0x00b0, 0x6014, 0x2048, - 0xa864, 0xd0fc, 0x0118, 0x2001, 0x0001, 0x0ca8, 0x2001, 0x180e, - 0x2004, 0xd0dc, 0x0148, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, - 0x9005, 0x1110, 0x9006, 0x0c38, 0x080c, 0xbcb6, 0x2009, 0x026e, - 0x2134, 0x96b4, 0x00ff, 0x9686, 0x0005, 0x0520, 0x9686, 0x000b, - 0x01c8, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00, 0x1118, 0x9686, - 0x0009, 0x01c0, 0x9086, 0x1900, 0x1168, 0x9686, 0x0009, 0x0190, - 0x2001, 0x0004, 0x080c, 0x666a, 0x2001, 0x0028, 0x601a, 0x6007, - 0x0052, 0x0020, 0x2001, 0x0001, 0x080c, 0xbf7b, 0x002e, 0x00be, - 0x009e, 0x0005, 0x9286, 0x0139, 0x0160, 0x6014, 0x2048, 0x080c, - 0xd0d8, 0x0140, 0xa864, 0x9086, 0x0139, 0x0118, 0xa868, 0xd0fc, - 0x0108, 0x0c40, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, - 0x0138, 0x8001, 0xb842, 0x601b, 0x000a, 0x6007, 0x0016, 0x08f0, - 0xb8a0, 0x9086, 0x007e, 0x1138, 0x00e6, 0x2071, 0x1800, 0x080c, - 0x60c1, 0x00ee, 0x0010, 0x080c, 0x3250, 0x0860, 0x2001, 0x0004, - 0x080c, 0x666a, 0x080c, 0xc1dc, 0x1140, 0x6003, 0x0001, 0x6007, - 0x0003, 0x080c, 0x9547, 0x0804, 0x9ab1, 0x080c, 0xbcb6, 0x9006, - 0x0804, 0xbf7b, 0x0489, 0x1160, 0x2001, 0x0008, 0x080c, 0x666a, - 0x6003, 0x0001, 0x6007, 0x0005, 0x080c, 0x9547, 0x0804, 0x9ab1, - 0x2001, 0x0001, 0x0804, 0xbf7b, 0x00f9, 0x1160, 0x2001, 0x000a, - 0x080c, 0x666a, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x9547, - 0x0804, 0x9ab1, 0x2001, 0x0001, 0x0804, 0xbf7b, 0x2009, 0x026e, - 0x2104, 0x9086, 0x0003, 0x1138, 0x2009, 0x026f, 0x2104, 0x9084, - 0xff00, 0x9086, 0x2a00, 0x0005, 0x9085, 0x0001, 0x0005, 0x00b6, - 0x00c6, 0x0016, 0x6110, 0x2158, 0x080c, 0x6733, 0x001e, 0x00ce, - 0x00be, 0x0005, 0x00b6, 0x00f6, 0x00e6, 0x00d6, 0x0036, 0x0016, - 0x6010, 0x2058, 0x2009, 0x1837, 0x2104, 0x9085, 0x0003, 0x200a, - 0x080c, 0xc287, 0x0560, 0x2009, 0x1837, 0x2104, 0xc0cd, 0x200a, - 0x080c, 0x6a9f, 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, - 0xec31, 0x2001, 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, - 0x2009, 0x0001, 0x080c, 0x321b, 0x00e6, 0x2071, 0x1800, 0x080c, - 0x3000, 0x00ee, 0x00c6, 0x0156, 0x20a9, 0x0781, 0x2009, 0x007f, - 0x080c, 0x334c, 0x8108, 0x1f04, 0xc220, 0x015e, 0x00ce, 0x080c, - 0xc1df, 0x2071, 0x0260, 0x2079, 0x0200, 0x7817, 0x0001, 0x2001, - 0x1837, 0x200c, 0xc1c5, 0x7018, 0xd0fc, 0x0110, 0xd0dc, 0x0118, - 0x7038, 0xd0dc, 0x1108, 0xc1c4, 0x7817, 0x0000, 0x2001, 0x1837, - 0x2102, 0x9184, 0x0050, 0x9086, 0x0050, 0x05d0, 0x2079, 0x0100, - 0x2e04, 0x9084, 0x00ff, 0x2069, 0x181f, 0x206a, 0x78e6, 0x0006, - 0x8e70, 0x2e04, 0x2069, 0x1820, 0x206a, 0x78ea, 0x7832, 0x7836, - 0x2010, 0x9084, 0xff00, 0x001e, 0x9105, 0x2009, 0x182c, 0x200a, - 0x2200, 0x9084, 0x00ff, 0x2008, 0x080c, 0x28bc, 0x080c, 0x7637, - 0x0170, 0x2071, 0x0260, 0x2069, 0x1982, 0x7048, 0x206a, 0x704c, - 0x6806, 0x7050, 0x680a, 0x7054, 0x680e, 0x080c, 0xd4ee, 0x0040, - 0x2001, 0x0006, 0x080c, 0x666a, 0x080c, 0x3279, 0x080c, 0xb2d3, - 0x001e, 0x003e, 0x00de, 0x00ee, 0x00fe, 0x00be, 0x0005, 0x0096, - 0x0026, 0x0036, 0x00e6, 0x0156, 0x2019, 0x182c, 0x231c, 0x83ff, - 0x01f0, 0x2071, 0x0260, 0x7200, 0x9294, 0x00ff, 0x7004, 0x9084, - 0xff00, 0x9205, 0x9306, 0x1198, 0x2011, 0x0276, 0x20a9, 0x0004, - 0x2b48, 0x2019, 0x000a, 0x080c, 0xc379, 0x1148, 0x2011, 0x027a, - 0x20a9, 0x0004, 0x2019, 0x0006, 0x080c, 0xc379, 0x1100, 0x015e, - 0x00ee, 0x003e, 0x002e, 0x009e, 0x0005, 0x00e6, 0x2071, 0x0260, - 0x7034, 0x9086, 0x0014, 0x11a8, 0x7038, 0x9086, 0x0800, 0x1188, - 0x703c, 0xd0ec, 0x0160, 0x9084, 0x0f00, 0x9086, 0x0100, 0x1138, - 0x7054, 0xd0a4, 0x1110, 0xd0ac, 0x0110, 0x9006, 0x0010, 0x9085, - 0x0001, 0x00ee, 0x0005, 0x00e6, 0x0096, 0x00c6, 0x0076, 0x0056, - 0x0046, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2029, 0x19f1, - 0x252c, 0x2021, 0x19f7, 0x2424, 0x2061, 0x1cd0, 0x2071, 0x1800, - 0x7254, 0x7074, 0x9202, 0x1a04, 0xc345, 0x080c, 0x8cf7, 0x0904, - 0xc33e, 0x080c, 0xec62, 0x0904, 0xc33e, 0x6720, 0x9786, 0x0007, - 0x0904, 0xc33e, 0x2500, 0x9c06, 0x0904, 0xc33e, 0x2400, 0x9c06, - 0x05e8, 0x3e08, 0x9186, 0x0002, 0x1148, 0x6010, 0x9005, 0x0130, - 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1580, 0x00c6, 0x6000, - 0x9086, 0x0004, 0x1110, 0x080c, 0x1a8e, 0x9786, 0x000a, 0x0148, - 0x080c, 0xd2e0, 0x1130, 0x00ce, 0x080c, 0xbcb6, 0x080c, 0xb306, - 0x00e8, 0x6014, 0x2048, 0x080c, 0xd0d8, 0x01a8, 0x9786, 0x0003, - 0x1530, 0xa867, 0x0103, 0xa87c, 0xd0cc, 0x0130, 0x0096, 0xa878, - 0x2048, 0x080c, 0x0fc0, 0x009e, 0xab7a, 0xa877, 0x0000, 0x080c, - 0x6e92, 0x080c, 0xd2c3, 0x080c, 0xb306, 0x00ce, 0x9ce0, 0x0018, - 0x7068, 0x9c02, 0x1210, 0x0804, 0xc2e8, 0x012e, 0x000e, 0x002e, - 0x004e, 0x005e, 0x007e, 0x00ce, 0x009e, 0x00ee, 0x0005, 0x9786, - 0x0006, 0x1118, 0x080c, 0xebd4, 0x0c30, 0x9786, 0x0009, 0x1148, - 0x6000, 0x9086, 0x0004, 0x0d08, 0x2009, 0x004c, 0x080c, 0xb352, - 0x08e0, 0x9786, 0x000a, 0x0980, 0x0820, 0x220c, 0x2304, 0x9106, - 0x1130, 0x8210, 0x8318, 0x1f04, 0xc365, 0x9006, 0x0005, 0x2304, - 0x9102, 0x0218, 0x2001, 0x0001, 0x0008, 0x9006, 0x918d, 0x0001, - 0x0005, 0x0136, 0x01c6, 0x0016, 0x8906, 0x8006, 0x8007, 0x908c, - 0x003f, 0x21e0, 0x9084, 0xffc0, 0x9300, 0x2098, 0x3518, 0x20a9, - 0x0001, 0x220c, 0x4002, 0x910e, 0x1140, 0x8210, 0x8319, 0x1dc8, - 0x9006, 0x001e, 0x01ce, 0x013e, 0x0005, 0x220c, 0x9102, 0x0218, - 0x2001, 0x0001, 0x0010, 0x2001, 0x0000, 0x918d, 0x0001, 0x001e, - 0x01ce, 0x013e, 0x0005, 0x220c, 0x810f, 0x2304, 0x9106, 0x1130, - 0x8210, 0x8318, 0x1f04, 0xc3a3, 0x9006, 0x0005, 0x918d, 0x0001, - 0x0005, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0dc5, 0x080c, 0xd2cf, - 0x0120, 0x080c, 0xd2e0, 0x0168, 0x0028, 0x080c, 0x3279, 0x080c, - 0xd2e0, 0x0138, 0x080c, 0x99a5, 0x080c, 0xb2d3, 0x080c, 0x9ab1, - 0x0005, 0x080c, 0xbcb6, 0x0cb0, 0x9182, 0x0054, 0x1220, 0x9182, - 0x0040, 0x0208, 0x000a, 0x0005, 0xc3e8, 0xc3e8, 0xc3e8, 0xc3e8, - 0xc3e8, 0xc3e8, 0xc3e8, 0xc3e8, 0xc3e8, 0xc3e8, 0xc3e8, 0xc3ea, - 0xc3ea, 0xc3ea, 0xc3ea, 0xc3e8, 0xc3e8, 0xc3e8, 0xc3ea, 0xc3e8, - 0x080c, 0x0dc5, 0x600b, 0xffff, 0x6003, 0x0001, 0x6106, 0x080c, - 0x94ff, 0x0126, 0x2091, 0x8000, 0x080c, 0x9ab1, 0x012e, 0x0005, - 0x9186, 0x0013, 0x1128, 0x6004, 0x9082, 0x0040, 0x0804, 0xc482, - 0x9186, 0x0027, 0x1520, 0x080c, 0x99a5, 0x080c, 0x3250, 0x080c, - 0xd7f8, 0x0096, 0x6114, 0x2148, 0x080c, 0xd0d8, 0x0198, 0x080c, - 0xd2e0, 0x1118, 0x080c, 0xbcb6, 0x0068, 0xa867, 0x0103, 0xa87b, - 0x0029, 0xa877, 0x0000, 0xa97c, 0xc1c5, 0xa97e, 0x080c, 0x6e9f, - 0x080c, 0xd2c3, 0x009e, 0x080c, 0xb2d3, 0x0804, 0x9ab1, 0x9186, - 0x0014, 0x1120, 0x6004, 0x9082, 0x0040, 0x00b8, 0x9186, 0x0046, - 0x0150, 0x9186, 0x0045, 0x0138, 0x9186, 0x0053, 0x0120, 0x9186, - 0x0048, 0x190c, 0x0dc5, 0x080c, 0xd809, 0x0130, 0x6000, 0x9086, - 0x0002, 0x1110, 0x0804, 0xc4c0, 0x0005, 0x0002, 0xc45c, 0xc45a, - 0xc45a, 0xc45a, 0xc45a, 0xc45a, 0xc45a, 0xc45a, 0xc45a, 0xc45a, - 0xc45a, 0xc477, 0xc477, 0xc477, 0xc477, 0xc45a, 0xc477, 0xc45a, - 0xc477, 0xc45a, 0x080c, 0x0dc5, 0x080c, 0x99a5, 0x0096, 0x6114, - 0x2148, 0x080c, 0xd0d8, 0x0168, 0xa867, 0x0103, 0xa87b, 0x0006, - 0xa877, 0x0000, 0xa880, 0xc0ec, 0xa882, 0x080c, 0x6e9f, 0x080c, - 0xd2c3, 0x009e, 0x080c, 0xb2d3, 0x080c, 0x9ab1, 0x0005, 0x080c, - 0x99a5, 0x080c, 0xd2e0, 0x090c, 0xbcb6, 0x080c, 0xb2d3, 0x080c, - 0x9ab1, 0x0005, 0x0002, 0xc499, 0xc497, 0xc497, 0xc497, 0xc497, - 0xc497, 0xc497, 0xc497, 0xc497, 0xc497, 0xc497, 0xc4b0, 0xc4b0, - 0xc4b0, 0xc4b0, 0xc497, 0xc4ba, 0xc497, 0xc4b0, 0xc497, 0x080c, - 0x0dc5, 0x0096, 0x080c, 0x99a5, 0x6014, 0x2048, 0x2001, 0x1988, - 0x2004, 0x6042, 0xa97c, 0xd1ac, 0x0140, 0x6003, 0x0004, 0xa87c, - 0x9085, 0x0400, 0xa87e, 0x009e, 0x0005, 0x6003, 0x0002, 0x0cb8, - 0x080c, 0x99a5, 0x080c, 0xd7fb, 0x080c, 0xd800, 0x6003, 0x000f, - 0x0804, 0x9ab1, 0x080c, 0x99a5, 0x080c, 0xb2d3, 0x0804, 0x9ab1, - 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, - 0xc4dc, 0xc4dc, 0xc4dc, 0xc4dc, 0xc4dc, 0xc4de, 0xc5be, 0xc4dc, - 0xc5f2, 0xc4dc, 0xc4dc, 0xc4dc, 0xc4dc, 0xc4dc, 0xc4dc, 0xc4dc, - 0xc4dc, 0xc4dc, 0xc4dc, 0xc5f2, 0x080c, 0x0dc5, 0x00b6, 0x0096, - 0x6114, 0x2148, 0x7644, 0x96b4, 0x0fff, 0x86ff, 0x1528, 0x6010, - 0x2058, 0xb800, 0xd0bc, 0x1904, 0xc5ad, 0xa87b, 0x0000, 0xa867, - 0x0103, 0xae76, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, - 0x190c, 0xc78b, 0x080c, 0x6cb9, 0x6210, 0x2258, 0xba3c, 0x82ff, - 0x0110, 0x8211, 0xba3e, 0x7044, 0xd0e4, 0x1904, 0xc58e, 0x080c, - 0xb2d3, 0x009e, 0x00be, 0x0005, 0x968c, 0x0c00, 0x0150, 0x6010, - 0x2058, 0xb800, 0xd0bc, 0x1904, 0xc592, 0x7348, 0xab92, 0x734c, - 0xab8e, 0x968c, 0x00ff, 0x9186, 0x0002, 0x0508, 0x9186, 0x0028, - 0x1118, 0xa87b, 0x001c, 0x00e8, 0xd6dc, 0x01a0, 0xa87b, 0x0015, - 0xa87c, 0xd0ac, 0x0170, 0xa938, 0xaa34, 0x2100, 0x9205, 0x0148, - 0x7048, 0x9106, 0x1118, 0x704c, 0x9206, 0x0118, 0xa992, 0xaa8e, - 0xc6dc, 0x0038, 0xd6d4, 0x0118, 0xa87b, 0x0007, 0x0010, 0xa87b, - 0x0000, 0xa867, 0x0103, 0xae76, 0x901e, 0xd6c4, 0x01d8, 0x9686, - 0x0100, 0x1130, 0x7064, 0x9005, 0x1118, 0xc6c4, 0x0804, 0xc4e5, - 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, - 0x0008, 0x0036, 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, 0x080c, - 0xcc85, 0x003e, 0xd6cc, 0x0904, 0xc4fa, 0x7154, 0xa98a, 0x81ff, - 0x0904, 0xc4fa, 0x9192, 0x0021, 0x1278, 0x8304, 0x9098, 0x0018, - 0x2011, 0x0029, 0x080c, 0xcc85, 0x2011, 0x0205, 0x2013, 0x0000, - 0x080c, 0xd786, 0x0804, 0xc4fa, 0xa868, 0xd0fc, 0x0120, 0x2009, - 0x0020, 0xa98a, 0x0c50, 0x00a6, 0x2950, 0x080c, 0xcc24, 0x00ae, - 0x080c, 0xd786, 0x080c, 0xcc75, 0x0804, 0xc4fc, 0x080c, 0xd3d8, - 0x0804, 0xc509, 0xa87c, 0xd0ac, 0x0904, 0xc515, 0xa880, 0xd0bc, - 0x1904, 0xc515, 0x9684, 0x0400, 0x0130, 0xa838, 0xab34, 0x9305, - 0x0904, 0xc515, 0x00b8, 0x7348, 0xa838, 0x9306, 0x1198, 0x734c, - 0xa834, 0x931e, 0x0904, 0xc515, 0x0068, 0xa87c, 0xd0ac, 0x0904, - 0xc4ed, 0xa838, 0xa934, 0x9105, 0x0904, 0xc4ed, 0xa880, 0xd0bc, - 0x1904, 0xc4ed, 0x080c, 0xd412, 0x0804, 0xc509, 0x0096, 0x00f6, - 0x6003, 0x0003, 0x6007, 0x0043, 0x2079, 0x026c, 0x7c04, 0x7b00, - 0x7e0c, 0x7d08, 0x6014, 0x2048, 0xa87c, 0xd0ac, 0x0140, 0x6003, - 0x0002, 0x00fe, 0x009e, 0x0005, 0x2130, 0x2228, 0x0058, 0x2400, - 0xa9ac, 0x910a, 0x2300, 0xaab0, 0x9213, 0x2600, 0x9102, 0x2500, - 0x9203, 0x0e90, 0xac36, 0xab3a, 0xae46, 0xad4a, 0x00fe, 0x6043, - 0x0000, 0x2c10, 0x080c, 0x1be0, 0x080c, 0x9564, 0x080c, 0x9bd3, - 0x009e, 0x0005, 0x0005, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, - 0x0208, 0x000a, 0x0005, 0xc60f, 0xc60f, 0xc60f, 0xc60f, 0xc60f, - 0xc611, 0xc6a7, 0xc60f, 0xc60f, 0xc6be, 0xc74e, 0xc60f, 0xc60f, - 0xc60f, 0xc60f, 0xc763, 0xc60f, 0xc60f, 0xc60f, 0xc60f, 0x080c, - 0x0dc5, 0x0076, 0x00a6, 0x00e6, 0x0096, 0x2071, 0x0260, 0x6114, - 0x2150, 0x7644, 0xb676, 0x96b4, 0x0fff, 0xb77c, 0xc7e5, 0xb77e, - 0x6210, 0x00b6, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, - 0x00be, 0x86ff, 0x0904, 0xc6a2, 0x9694, 0xff00, 0x9284, 0x0c00, - 0x0120, 0x7048, 0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, 0x0904, - 0xc6a2, 0x080c, 0x100e, 0x090c, 0x0dc5, 0x2900, 0xb07a, 0xb77c, - 0xc7cd, 0xb77e, 0xa867, 0x0103, 0xb068, 0xa86a, 0xb06c, 0xa86e, - 0xb070, 0xa872, 0xae76, 0x968c, 0x0c00, 0x0120, 0x7348, 0xab92, - 0x734c, 0xab8e, 0x968c, 0x00ff, 0x9186, 0x0002, 0x0180, 0x9186, - 0x0028, 0x1118, 0xa87b, 0x001c, 0x0060, 0xd6dc, 0x0118, 0xa87b, - 0x0015, 0x0038, 0xd6d4, 0x0118, 0xa87b, 0x0007, 0x0010, 0xa87b, - 0x0000, 0xaf7e, 0xb080, 0xa882, 0xb084, 0xa886, 0x901e, 0xd6c4, - 0x0190, 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, - 0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, - 0x080c, 0xcc85, 0x003e, 0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff, - 0x01c8, 0x9192, 0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x2011, - 0x0029, 0x080c, 0xcc85, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, - 0xb068, 0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c68, 0x2950, - 0x080c, 0xcc24, 0x009e, 0x00ee, 0x00ae, 0x007e, 0x0005, 0x00f6, - 0x00a6, 0x6003, 0x0003, 0x2079, 0x026c, 0x7c04, 0x7b00, 0x7e0c, - 0x7d08, 0x6014, 0x2050, 0xb436, 0xb33a, 0xb646, 0xb54a, 0x00ae, - 0x00fe, 0x2c10, 0x080c, 0x1be0, 0x0804, 0xa6b6, 0x6003, 0x0002, - 0x6004, 0x9086, 0x0040, 0x11c8, 0x0096, 0x6014, 0x2048, 0xa87c, - 0xd0ac, 0x0160, 0x601c, 0xd084, 0x1130, 0x00f6, 0x2c00, 0x2078, - 0x080c, 0x1768, 0x00fe, 0x6003, 0x0004, 0x0010, 0x6003, 0x0002, - 0x009e, 0x080c, 0x99a5, 0x080c, 0x9ab1, 0x0096, 0x2001, 0x1988, - 0x2004, 0x6042, 0x080c, 0x9a61, 0x080c, 0x9bd3, 0x6114, 0x2148, - 0xa97c, 0xd1e4, 0x0904, 0xc749, 0xd1cc, 0x05c8, 0xa978, 0xa868, - 0xd0fc, 0x0540, 0x0016, 0xa87c, 0x0006, 0xa880, 0x0006, 0xa860, - 0x20e8, 0xa85c, 0x9080, 0x0019, 0x20a0, 0x810e, 0x810e, 0x810f, - 0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0019, 0x2098, - 0x0156, 0x20a9, 0x0020, 0x4003, 0x015e, 0x000e, 0xa882, 0x000e, - 0xc0cc, 0xa87e, 0x001e, 0xa874, 0x0006, 0x2148, 0x080c, 0x0fc0, - 0x001e, 0x0458, 0x0016, 0x080c, 0x0fc0, 0x009e, 0xa87c, 0xc0cc, - 0xa87e, 0xa974, 0x0016, 0x080c, 0xcc75, 0x001e, 0x00f0, 0xa867, - 0x0103, 0xa974, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x0180, 0x9086, - 0x0028, 0x1118, 0xa87b, 0x001c, 0x0060, 0xd1dc, 0x0118, 0xa87b, - 0x0015, 0x0038, 0xd1d4, 0x0118, 0xa87b, 0x0007, 0x0010, 0xa87b, - 0x0000, 0x0016, 0x080c, 0x6cb9, 0x001e, 0xd1e4, 0x1120, 0x080c, - 0xb2d3, 0x009e, 0x0005, 0x080c, 0xd3d8, 0x0cd8, 0x6004, 0x9086, - 0x0040, 0x1120, 0x080c, 0x99a5, 0x080c, 0x9ab1, 0x2019, 0x0001, - 0x080c, 0xaa49, 0x6003, 0x0002, 0x080c, 0xd800, 0x080c, 0x9a61, - 0x080c, 0x9bd3, 0x0005, 0x6004, 0x9086, 0x0040, 0x1120, 0x080c, - 0x99a5, 0x080c, 0x9ab1, 0x2019, 0x0001, 0x080c, 0xaa49, 0x080c, - 0x9a61, 0x080c, 0x3250, 0x080c, 0xd7f8, 0x0096, 0x6114, 0x2148, - 0x080c, 0xd0d8, 0x0150, 0xa867, 0x0103, 0xa87b, 0x0029, 0xa877, - 0x0000, 0x080c, 0x6e9f, 0x080c, 0xd2c3, 0x009e, 0x080c, 0xb2d3, - 0x080c, 0x9bd3, 0x0005, 0xa87b, 0x0015, 0xd1fc, 0x0180, 0xa87b, - 0x0007, 0x8002, 0x8000, 0x810a, 0x9189, 0x0000, 0x0006, 0x0016, - 0x2009, 0x1a7d, 0x2104, 0x8000, 0x200a, 0x001e, 0x000e, 0xa992, - 0xa88e, 0x0005, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, 0x0208, - 0x000a, 0x0005, 0xc7be, 0xc7be, 0xc7be, 0xc7be, 0xc7be, 0xc7c0, - 0xc7be, 0xc7be, 0xc866, 0xc7be, 0xc7be, 0xc7be, 0xc7be, 0xc7be, - 0xc7be, 0xc7be, 0xc7be, 0xc7be, 0xc7be, 0xc998, 0x080c, 0x0dc5, - 0x0076, 0x00a6, 0x00e6, 0x0096, 0x2071, 0x0260, 0x6114, 0x2150, - 0x7644, 0xb676, 0x96b4, 0x0fff, 0xb77c, 0xc7e5, 0xb77e, 0x6210, - 0x00b6, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0x00be, - 0x86ff, 0x0904, 0xc85f, 0x9694, 0xff00, 0x9284, 0x0c00, 0x0120, - 0x7048, 0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, 0x0904, 0xc85f, - 0x9686, 0x0100, 0x1130, 0x7064, 0x9005, 0x1118, 0xc6c4, 0xb676, - 0x0c38, 0x080c, 0x100e, 0x090c, 0x0dc5, 0x2900, 0xb07a, 0xb77c, - 0x97bd, 0x0200, 0xb77e, 0xa867, 0x0103, 0xb068, 0xa86a, 0xb06c, - 0xa86e, 0xb070, 0xa872, 0x7044, 0x9084, 0xf000, 0x9635, 0xae76, - 0x968c, 0x0c00, 0x0120, 0x7348, 0xab92, 0x734c, 0xab8e, 0x968c, - 0x00ff, 0x9186, 0x0002, 0x0180, 0x9186, 0x0028, 0x1118, 0xa87b, - 0x001c, 0x0060, 0xd6dc, 0x0118, 0xa87b, 0x0015, 0x0038, 0xd6d4, - 0x0118, 0xa87b, 0x0007, 0x0010, 0xa87b, 0x0000, 0xaf7e, 0xb080, - 0xa882, 0xb084, 0xa886, 0x901e, 0xd6c4, 0x0190, 0x735c, 0xab86, - 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, - 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, 0x080c, 0xcc85, 0x003e, - 0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff, 0x01c8, 0x9192, 0x0021, - 0x1260, 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, 0x080c, 0xcc85, - 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, 0xb068, 0xd0fc, 0x0120, - 0x2009, 0x0020, 0xa98a, 0x0c68, 0x2950, 0x080c, 0xcc24, 0x080c, - 0x1a5a, 0x009e, 0x00ee, 0x00ae, 0x007e, 0x0005, 0x2001, 0x1988, - 0x2004, 0x6042, 0x0096, 0x6114, 0x2148, 0xa83c, 0xa940, 0x9105, - 0x1118, 0xa87c, 0xc0dc, 0xa87e, 0x6003, 0x0002, 0xa97c, 0xd1e4, - 0x0904, 0xc993, 0x6043, 0x0000, 0x6010, 0x00b6, 0x2058, 0xb800, - 0x00be, 0xd0bc, 0x1500, 0xd1cc, 0x0904, 0xc962, 0xa978, 0xa868, - 0xd0fc, 0x0904, 0xc923, 0x0016, 0xa87c, 0x0006, 0xa880, 0x0006, - 0x00a6, 0x2150, 0xb174, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x0904, - 0xc8f0, 0x9086, 0x0028, 0x1904, 0xc8dc, 0xa87b, 0x001c, 0xb07b, - 0x001c, 0x0804, 0xc8f8, 0x6024, 0xd0f4, 0x11d0, 0xa838, 0xaa34, - 0x9205, 0x09c8, 0xa838, 0xaa90, 0x9206, 0x1120, 0xa88c, 0xaa34, - 0x9206, 0x0988, 0x6024, 0xd0d4, 0x1148, 0xa9ac, 0xa834, 0x9102, - 0x603a, 0xa9b0, 0xa838, 0x9103, 0x603e, 0x6024, 0xc0f5, 0x6026, - 0x6010, 0x00b6, 0x2058, 0xb83c, 0x8000, 0xb83e, 0x00be, 0x9006, - 0xa876, 0xa892, 0xa88e, 0xa87c, 0xc0e4, 0xa87e, 0xd0cc, 0x0140, - 0xc0cc, 0xa87e, 0x0096, 0xa878, 0x2048, 0x080c, 0x0fc0, 0x009e, - 0x080c, 0xd412, 0x0804, 0xc993, 0xd1dc, 0x0158, 0xa87b, 0x0015, - 0xb07b, 0x0015, 0x080c, 0xd6a6, 0x0118, 0xb174, 0xc1dc, 0xb176, - 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b, 0x0007, 0x0040, - 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xc78b, - 0xa87c, 0xb07e, 0xa890, 0xb092, 0xa88c, 0xb08e, 0xa860, 0x20e8, - 0xa85c, 0x9080, 0x0019, 0x20a0, 0x20a9, 0x0020, 0x8a06, 0x8006, - 0x8007, 0x9094, 0x003f, 0x22e0, 0x9084, 0xffc0, 0x9080, 0x0019, - 0x2098, 0x4003, 0x00ae, 0x000e, 0xa882, 0x000e, 0xc0cc, 0xa87e, - 0x080c, 0xd786, 0x001e, 0xa874, 0x0006, 0x2148, 0x080c, 0x0fc0, - 0x001e, 0x0804, 0xc98f, 0x0016, 0x00a6, 0x2150, 0xb174, 0x9184, - 0x00ff, 0x90b6, 0x0002, 0x01e0, 0x9086, 0x0028, 0x1128, 0xa87b, - 0x001c, 0xb07b, 0x001c, 0x00e0, 0xd1dc, 0x0158, 0xa87b, 0x0015, - 0xb07b, 0x0015, 0x080c, 0xd6a6, 0x0118, 0xb174, 0xc1dc, 0xb176, - 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b, 0x0007, 0x0040, - 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xc78b, - 0xa890, 0xb092, 0xa88c, 0xb08e, 0xa87c, 0xb07e, 0x00ae, 0x080c, - 0x0fc0, 0x009e, 0x080c, 0xd786, 0xa974, 0x0016, 0x080c, 0xcc75, - 0x001e, 0x0468, 0xa867, 0x0103, 0xa974, 0x9184, 0x00ff, 0x90b6, - 0x0002, 0x01b0, 0x9086, 0x0028, 0x1118, 0xa87b, 0x001c, 0x00d0, - 0xd1dc, 0x0148, 0xa87b, 0x0015, 0x080c, 0xd6a6, 0x0118, 0xa974, - 0xc1dc, 0xa976, 0x0078, 0xd1d4, 0x0118, 0xa87b, 0x0007, 0x0050, - 0xa87b, 0x0000, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, - 0x190c, 0xc78b, 0xa974, 0x0016, 0x080c, 0x6cb9, 0x001e, 0xd1e4, - 0x1120, 0x080c, 0xb2d3, 0x009e, 0x0005, 0x080c, 0xd3d8, 0x0cd8, - 0x6114, 0x0096, 0x2148, 0xa97c, 0xd1e4, 0x190c, 0x1a7a, 0x009e, - 0x0005, 0x080c, 0x99a5, 0x0010, 0x080c, 0x9a61, 0x080c, 0xd0d8, - 0x01f0, 0x0096, 0x6114, 0x2148, 0x080c, 0xd2e0, 0x1118, 0x080c, - 0xbcb6, 0x00a0, 0xa867, 0x0103, 0x2009, 0x180c, 0x210c, 0xd18c, - 0x11b8, 0xd184, 0x1190, 0x6108, 0xa97a, 0x918e, 0x0029, 0x1110, - 0x080c, 0xef85, 0xa877, 0x0000, 0x080c, 0x6e9f, 0x009e, 0x080c, - 0xb2d3, 0x080c, 0x9ab1, 0x0804, 0x9bd3, 0xa87b, 0x0004, 0x0c90, - 0xa87b, 0x0004, 0x0c78, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, - 0x0208, 0x000a, 0x0005, 0xc9ef, 0xc9ef, 0xc9ef, 0xc9ef, 0xc9ef, - 0xc9f1, 0xc9ef, 0xc9ef, 0xc9ef, 0xc9ef, 0xc9ef, 0xc9ef, 0xc9ef, - 0xc9ef, 0xc9ef, 0xc9ef, 0xc9ef, 0xc9ef, 0xc9ef, 0xc9ef, 0x080c, - 0x0dc5, 0x080c, 0x57dd, 0x01f8, 0x6014, 0x7144, 0x918c, 0x0fff, - 0x9016, 0xd1c4, 0x0118, 0x7264, 0x9294, 0x00ff, 0x0096, 0x904d, - 0x0188, 0xa87b, 0x0000, 0xa864, 0x9086, 0x0139, 0x0128, 0xa867, - 0x0103, 0xa976, 0xaa96, 0x0030, 0xa897, 0x4000, 0xa99a, 0xaa9e, - 0x080c, 0x6e9f, 0x009e, 0x0804, 0xb2d3, 0x9182, 0x0085, 0x0002, - 0xca27, 0xca25, 0xca25, 0xca33, 0xca25, 0xca25, 0xca25, 0xca25, - 0xca25, 0xca25, 0xca25, 0xca25, 0xca25, 0x080c, 0x0dc5, 0x6003, - 0x0001, 0x6106, 0x080c, 0x94ff, 0x0126, 0x2091, 0x8000, 0x080c, - 0x9ab1, 0x012e, 0x0005, 0x0026, 0x0056, 0x00d6, 0x00e6, 0x2071, - 0x0260, 0x7224, 0x6216, 0x7220, 0x080c, 0xd0c6, 0x01f8, 0x2268, - 0x6800, 0x9086, 0x0000, 0x01d0, 0x6010, 0x6d10, 0x952e, 0x11b0, - 0x00c6, 0x2d60, 0x00d6, 0x080c, 0xcce6, 0x00de, 0x00ce, 0x0158, - 0x702c, 0xd084, 0x1118, 0x080c, 0xccb0, 0x0010, 0x6803, 0x0002, - 0x6007, 0x0086, 0x0028, 0x080c, 0xccd2, 0x0d90, 0x6007, 0x0087, - 0x6003, 0x0001, 0x080c, 0x94ff, 0x080c, 0x9ab1, 0x7220, 0x080c, - 0xd0c6, 0x0178, 0x6810, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, - 0x0140, 0x6824, 0xd0ec, 0x0128, 0x00c6, 0x2d60, 0x080c, 0xd412, - 0x00ce, 0x00ee, 0x00de, 0x005e, 0x002e, 0x0005, 0x9186, 0x0013, - 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0dc5, 0x908a, 0x0092, - 0x1a0c, 0x0dc5, 0x9082, 0x0085, 0x00e2, 0x9186, 0x0027, 0x0120, - 0x9186, 0x0014, 0x190c, 0x0dc5, 0x080c, 0x99a5, 0x0096, 0x6014, - 0x2048, 0x080c, 0xd0d8, 0x0140, 0xa867, 0x0103, 0xa877, 0x0000, - 0xa87b, 0x0029, 0x080c, 0x6e9f, 0x009e, 0x080c, 0xb306, 0x0804, - 0x9ab1, 0xcab6, 0xcab8, 0xcab8, 0xcab6, 0xcab6, 0xcab6, 0xcab6, - 0xcab6, 0xcab6, 0xcab6, 0xcab6, 0xcab6, 0xcab6, 0x080c, 0x0dc5, - 0x080c, 0x99a5, 0x080c, 0xb306, 0x080c, 0x9ab1, 0x0005, 0x9186, - 0x0013, 0x1128, 0x6004, 0x9082, 0x0085, 0x2008, 0x04b8, 0x9186, - 0x0027, 0x11f8, 0x080c, 0x99a5, 0x080c, 0x3250, 0x080c, 0xd7f8, - 0x0096, 0x6014, 0x2048, 0x080c, 0xd0d8, 0x0150, 0xa867, 0x0103, - 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, 0x6e9f, 0x080c, 0xd2c3, - 0x009e, 0x080c, 0xb2d3, 0x080c, 0x9ab1, 0x0005, 0x080c, 0xb36d, - 0x0ce0, 0x9186, 0x0014, 0x1dd0, 0x080c, 0x99a5, 0x0096, 0x6014, - 0x2048, 0x080c, 0xd0d8, 0x0d60, 0xa867, 0x0103, 0xa877, 0x0000, - 0xa87b, 0x0006, 0xa880, 0xc0ec, 0xa882, 0x08f0, 0x0002, 0xcb0e, - 0xcb0c, 0xcb0c, 0xcb0c, 0xcb0c, 0xcb0c, 0xcb26, 0xcb0c, 0xcb0c, - 0xcb0c, 0xcb0c, 0xcb0c, 0xcb0c, 0x080c, 0x0dc5, 0x080c, 0x99a5, - 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, - 0x0035, 0x1118, 0x2001, 0x1986, 0x0010, 0x2001, 0x1987, 0x2004, - 0x601a, 0x6003, 0x000c, 0x080c, 0x9ab1, 0x0005, 0x080c, 0x99a5, - 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, - 0x0035, 0x1118, 0x2001, 0x1986, 0x0010, 0x2001, 0x1987, 0x2004, - 0x601a, 0x6003, 0x000e, 0x080c, 0x9ab1, 0x0005, 0x9182, 0x0092, - 0x1220, 0x9182, 0x0085, 0x0208, 0x0012, 0x0804, 0xb36d, 0xcb54, - 0xcb54, 0xcb54, 0xcb54, 0xcb56, 0xcba3, 0xcb54, 0xcb54, 0xcb54, - 0xcb54, 0xcb54, 0xcb54, 0xcb54, 0x080c, 0x0dc5, 0x0096, 0x6010, - 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0168, 0x6034, 0x908c, - 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, - 0x009e, 0x0804, 0xcbb7, 0x080c, 0xd0d8, 0x1118, 0x080c, 0xd2c3, - 0x0068, 0x6014, 0x2048, 0xa87c, 0xd0e4, 0x1110, 0x080c, 0xd2c3, - 0xa867, 0x0103, 0x080c, 0xd7c3, 0x080c, 0x6e9f, 0x00d6, 0x2c68, - 0x080c, 0xb27d, 0x01d0, 0x6003, 0x0001, 0x6007, 0x001e, 0x600b, - 0xffff, 0x2009, 0x026e, 0x210c, 0x613a, 0x2009, 0x026f, 0x210c, - 0x613e, 0x6910, 0x6112, 0x080c, 0xd554, 0x6954, 0x6156, 0x6023, - 0x0001, 0x080c, 0x94ff, 0x080c, 0x9ab1, 0x2d60, 0x00de, 0x080c, - 0xb2d3, 0x009e, 0x0005, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, - 0xd0bc, 0x05a0, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0035, - 0x0130, 0x9186, 0x001e, 0x0118, 0x9186, 0x0039, 0x1538, 0x00d6, - 0x2c68, 0x080c, 0xd759, 0x11f0, 0x080c, 0xb27d, 0x01d8, 0x6106, - 0x6003, 0x0001, 0x6023, 0x0001, 0x6910, 0x6112, 0x692c, 0x612e, - 0x6930, 0x6132, 0x6934, 0x918c, 0x00ff, 0x6136, 0x6938, 0x613a, - 0x693c, 0x613e, 0x6954, 0x6156, 0x080c, 0xd554, 0x080c, 0x94ff, - 0x080c, 0x9ab1, 0x2d60, 0x00de, 0x0804, 0xb2d3, 0x0096, 0x6014, - 0x2048, 0x080c, 0xd0d8, 0x01c8, 0xa867, 0x0103, 0xa880, 0xd0b4, - 0x0128, 0xc0ec, 0xa882, 0xa87b, 0x0006, 0x0048, 0xd0bc, 0x0118, - 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, 0x080c, 0xd3d4, 0xa877, - 0x0000, 0x080c, 0x6e9f, 0x080c, 0xd2c3, 0x009e, 0x0804, 0xb2d3, - 0x0016, 0x0096, 0x6014, 0x2048, 0x080c, 0xd0d8, 0x0140, 0xa867, - 0x0103, 0xa87b, 0x0028, 0xa877, 0x0000, 0x080c, 0x6e9f, 0x009e, - 0x001e, 0x9186, 0x0013, 0x0148, 0x9186, 0x0014, 0x0130, 0x9186, - 0x0027, 0x0118, 0x080c, 0xb36d, 0x0030, 0x080c, 0x99a5, 0x080c, - 0xb306, 0x080c, 0x9ab1, 0x0005, 0x0056, 0x0066, 0x0096, 0x00a6, - 0x2029, 0x0001, 0x9182, 0x0101, 0x1208, 0x0010, 0x2009, 0x0100, - 0x2130, 0x8304, 0x9098, 0x0018, 0x2009, 0x0020, 0x2011, 0x0029, - 0x080c, 0xcc85, 0x96b2, 0x0020, 0xb004, 0x904d, 0x0110, 0x080c, - 0x0fc0, 0x080c, 0x100e, 0x0520, 0x8528, 0xa867, 0x0110, 0xa86b, - 0x0000, 0x2920, 0xb406, 0x968a, 0x003d, 0x1228, 0x2608, 0x2011, - 0x001b, 0x0499, 0x00a8, 0x96b2, 0x003c, 0x2009, 0x003c, 0x2950, - 0x2011, 0x001b, 0x0451, 0x0c28, 0x2001, 0x0205, 0x2003, 0x0000, - 0x00ae, 0x852f, 0x95ad, 0x0003, 0xb566, 0x95ac, 0x0000, 0x0048, - 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0003, - 0xb566, 0x009e, 0x006e, 0x005e, 0x0005, 0x00a6, 0x89ff, 0x0158, - 0xa804, 0x9055, 0x0130, 0xa807, 0x0000, 0x080c, 0x6e9f, 0x2a48, - 0x0cb8, 0x080c, 0x6e9f, 0x00ae, 0x0005, 0x00f6, 0x2079, 0x0200, - 0x7814, 0x9085, 0x0080, 0x7816, 0xd184, 0x0108, 0x8108, 0x810c, - 0x20a9, 0x0001, 0xa860, 0x20e8, 0xa85c, 0x9200, 0x20a0, 0x20e1, - 0x0000, 0x2300, 0x9e00, 0x2098, 0x4003, 0x8318, 0x9386, 0x0020, - 0x1148, 0x2018, 0x2300, 0x9e00, 0x2098, 0x7814, 0x8000, 0x9085, - 0x0080, 0x7816, 0x8109, 0x1d80, 0x7817, 0x0000, 0x00fe, 0x0005, - 0x6920, 0x9186, 0x0003, 0x0118, 0x9186, 0x0002, 0x11d0, 0x00c6, - 0x00d6, 0x00e6, 0x2d60, 0x0096, 0x6014, 0x2048, 0x080c, 0xd0d8, - 0x0150, 0x2001, 0x0006, 0xa980, 0xc1d5, 0x080c, 0x710b, 0x080c, - 0x6e92, 0x080c, 0xd2c3, 0x009e, 0x080c, 0xb306, 0x00ee, 0x00de, - 0x00ce, 0x0005, 0x00c6, 0x702c, 0xd084, 0x1170, 0x6008, 0x2060, - 0x6020, 0x9086, 0x0002, 0x1140, 0x6104, 0x9186, 0x0085, 0x0118, - 0x9186, 0x008b, 0x1108, 0x9006, 0x00ce, 0x0005, 0x0066, 0x0126, - 0x2091, 0x8000, 0x2031, 0x0001, 0x6020, 0x9084, 0x000f, 0x0083, - 0x012e, 0x006e, 0x0005, 0x0126, 0x2091, 0x8000, 0x0066, 0x2031, - 0x0000, 0x6020, 0x9084, 0x000f, 0x001b, 0x006e, 0x012e, 0x0005, - 0xcd1d, 0xcd1d, 0xcd18, 0xcd3f, 0xcd0f, 0xcd18, 0xcd3f, 0xcd18, - 0xcd18, 0x9265, 0xcd18, 0xcd18, 0xcd18, 0xcd0f, 0xcd0f, 0x080c, - 0x0dc5, 0x0036, 0x2019, 0x0010, 0x080c, 0xe746, 0x003e, 0x0005, - 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, 0x0096, 0x86ff, 0x11d8, - 0x6014, 0x2048, 0x080c, 0xd0d8, 0x01c0, 0xa864, 0x9086, 0x0139, - 0x1128, 0xa87b, 0x0005, 0xa883, 0x0000, 0x0028, 0x900e, 0x2001, - 0x0005, 0x080c, 0x710b, 0x080c, 0xd3d4, 0x080c, 0x6e92, 0x080c, - 0xb306, 0x9085, 0x0001, 0x009e, 0x0005, 0x9006, 0x0ce0, 0x6000, - 0x908a, 0x0010, 0x1a0c, 0x0dc5, 0x0002, 0xcd55, 0xcd85, 0xcd57, - 0xcda6, 0xcd80, 0xcd55, 0xcd18, 0xcd1d, 0xcd1d, 0xcd18, 0xcd18, - 0xcd18, 0xcd18, 0xcd18, 0xcd18, 0xcd18, 0x080c, 0x0dc5, 0x86ff, - 0x1520, 0x6020, 0x9086, 0x0006, 0x0500, 0x0096, 0x6014, 0x2048, - 0x080c, 0xd0d8, 0x0168, 0xa87c, 0xd0cc, 0x0140, 0x0096, 0xc0cc, - 0xa87e, 0xa878, 0x2048, 0x080c, 0x0fc0, 0x009e, 0x080c, 0xd3d4, - 0x009e, 0x080c, 0xd79d, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, - 0x0002, 0x080c, 0x94ff, 0x080c, 0x9ab1, 0x9085, 0x0001, 0x0005, - 0x0066, 0x080c, 0x1a8e, 0x006e, 0x0890, 0x00e6, 0x2071, 0x19e8, - 0x7024, 0x9c06, 0x1120, 0x080c, 0xa9d3, 0x00ee, 0x0840, 0x6020, - 0x9084, 0x000f, 0x9086, 0x0006, 0x1150, 0x0086, 0x0096, 0x2049, - 0x0001, 0x2c40, 0x080c, 0xaafb, 0x009e, 0x008e, 0x0010, 0x080c, - 0xa8d0, 0x00ee, 0x1904, 0xcd57, 0x0804, 0xcd18, 0x0036, 0x00e6, - 0x2071, 0x19e8, 0x703c, 0x9c06, 0x1138, 0x901e, 0x080c, 0xaa49, - 0x00ee, 0x003e, 0x0804, 0xcd57, 0x080c, 0xac2b, 0x00ee, 0x003e, - 0x1904, 0xcd57, 0x0804, 0xcd18, 0x00c6, 0x6020, 0x9084, 0x000f, - 0x0013, 0x00ce, 0x0005, 0xcdd9, 0xcea3, 0xd011, 0xcde3, 0xb306, - 0xcdd9, 0xe73c, 0xd805, 0xcea3, 0x9237, 0xd09d, 0xcdd2, 0xcdd2, - 0xcdd2, 0xcdd2, 0x080c, 0x0dc5, 0x080c, 0xd2e0, 0x1110, 0x080c, - 0xbcb6, 0x0005, 0x080c, 0x99a5, 0x080c, 0x9ab1, 0x0804, 0xb2d3, - 0x601b, 0x0001, 0x0005, 0x080c, 0xd0d8, 0x0130, 0x6014, 0x0096, - 0x2048, 0x2c00, 0xa896, 0x009e, 0x6000, 0x908a, 0x0010, 0x1a0c, - 0x0dc5, 0x0002, 0xce02, 0xce04, 0xce28, 0xce3c, 0xce62, 0xce02, - 0xcdd9, 0xcdd9, 0xcdd9, 0xce3c, 0xce3c, 0xce02, 0xce02, 0xce02, - 0xce02, 0xce46, 0x080c, 0x0dc5, 0x00e6, 0x6014, 0x0096, 0x2048, - 0xa880, 0xc0b5, 0xa882, 0x009e, 0x2071, 0x19e8, 0x7024, 0x9c06, - 0x01a0, 0x080c, 0xa8d0, 0x080c, 0xd79d, 0x6007, 0x0085, 0x6003, - 0x000b, 0x6023, 0x0002, 0x2001, 0x1987, 0x2004, 0x601a, 0x080c, - 0x94ff, 0x080c, 0x9ab1, 0x00ee, 0x0005, 0x601b, 0x0001, 0x0cd8, - 0x0096, 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x080c, - 0xd79d, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, - 0x94ff, 0x080c, 0x9ab1, 0x0005, 0x0096, 0x601b, 0x0001, 0x6014, - 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x0005, 0x080c, 0x57dd, - 0x01b8, 0x6014, 0x0096, 0x904d, 0x0190, 0xa864, 0xa867, 0x0103, - 0xa87b, 0x0006, 0x9086, 0x0139, 0x1150, 0xa867, 0x0139, 0xa87b, - 0x0030, 0xa897, 0x4005, 0xa89b, 0x0004, 0x080c, 0x6e9f, 0x009e, - 0x0804, 0xb2d3, 0x6014, 0x0096, 0x904d, 0x05c0, 0xa97c, 0xd1e4, - 0x05a8, 0x2001, 0x180f, 0x2004, 0xd0c4, 0x0110, 0x009e, 0x0005, - 0xa884, 0x009e, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0x2001, - 0x0030, 0x2c08, 0x080c, 0x1611, 0x2001, 0x030c, 0x2004, 0x9086, - 0x0041, 0x1198, 0x6014, 0x0096, 0x904d, 0x090c, 0x0dc5, 0xa880, - 0xd0f4, 0x1130, 0xc0f5, 0xa882, 0x009e, 0x601b, 0x0002, 0x0068, - 0x009e, 0x00c6, 0x080c, 0x236e, 0x00ce, 0x6000, 0x9086, 0x0004, - 0x1120, 0x2009, 0x0048, 0x080c, 0xb352, 0x0005, 0x009e, 0x080c, - 0x1a8e, 0x0804, 0xce28, 0x6000, 0x908a, 0x0010, 0x1a0c, 0x0dc5, - 0x000b, 0x0005, 0xceba, 0xcde0, 0xcebc, 0xceba, 0xcebc, 0xcebc, - 0xcdda, 0xceba, 0xcdd4, 0xcdd4, 0xceba, 0xceba, 0xceba, 0xceba, - 0xceba, 0xceba, 0x080c, 0x0dc5, 0x6010, 0x00b6, 0x2058, 0xb804, - 0x9084, 0x00ff, 0x00be, 0x908a, 0x000c, 0x1a0c, 0x0dc5, 0x00b6, - 0x0013, 0x00be, 0x0005, 0xced7, 0xcfa8, 0xced9, 0xcf19, 0xced9, - 0xcf19, 0xced9, 0xcee7, 0xced7, 0xcf19, 0xced7, 0xcf08, 0x080c, - 0x0dc5, 0x6004, 0x908e, 0x0016, 0x05c0, 0x908e, 0x0004, 0x05a8, - 0x908e, 0x0002, 0x0590, 0x908e, 0x0052, 0x0904, 0xcfa4, 0x6004, - 0x080c, 0xd2e0, 0x0904, 0xcfc1, 0x908e, 0x0004, 0x1110, 0x080c, - 0x3279, 0x908e, 0x0021, 0x0904, 0xcfc5, 0x908e, 0x0022, 0x0904, - 0xd00c, 0x908e, 0x003d, 0x0904, 0xcfc5, 0x908e, 0x0039, 0x0904, - 0xcfc9, 0x908e, 0x0035, 0x0904, 0xcfc9, 0x908e, 0x001e, 0x0178, - 0x908e, 0x0001, 0x1140, 0x6010, 0x2058, 0xb804, 0x9084, 0x00ff, - 0x9086, 0x0006, 0x0110, 0x080c, 0x3250, 0x080c, 0xbcb6, 0x0804, - 0xb306, 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, 0x0904, 0xcf95, - 0x9186, 0x0002, 0x1904, 0xcf6a, 0x2001, 0x1837, 0x2004, 0xd08c, - 0x11c8, 0x080c, 0x7637, 0x11b0, 0x080c, 0xd7e3, 0x0138, 0x080c, - 0x765a, 0x1120, 0x080c, 0x7541, 0x0804, 0xcff5, 0x2001, 0x197d, - 0x2003, 0x0001, 0x2001, 0x1800, 0x2003, 0x0001, 0x080c, 0x7563, - 0x0804, 0xcff5, 0x6010, 0x2058, 0xb8a0, 0x9086, 0x0080, 0x0130, - 0x2001, 0x1837, 0x2004, 0xd0ac, 0x1904, 0xcff5, 0xb8a0, 0x9082, - 0x0081, 0x1a04, 0xcff5, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0190, - 0x8001, 0xb842, 0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, - 0x6043, 0x0000, 0x080c, 0xb27d, 0x0128, 0x2b00, 0x6012, 0x6023, - 0x0001, 0x0458, 0x00de, 0x00ce, 0x6004, 0x908e, 0x0002, 0x11a0, - 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, 0x1170, 0x2009, 0x1837, - 0x2104, 0xc085, 0x200a, 0x00e6, 0x2071, 0x1800, 0x080c, 0x60c1, - 0x00ee, 0x080c, 0xbcb6, 0x0030, 0x080c, 0xbcb6, 0x080c, 0x3250, - 0x080c, 0xd7f8, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x3279, - 0x012e, 0x00ee, 0x080c, 0xb306, 0x0005, 0x2001, 0x0002, 0x080c, - 0x666a, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x9547, 0x080c, - 0x9ab1, 0x00de, 0x00ce, 0x0c80, 0x080c, 0x3279, 0x0804, 0xcf15, - 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, 0x0d38, 0x6010, 0x2058, - 0xb840, 0x9084, 0x00ff, 0x9005, 0x0904, 0xcf6a, 0x8001, 0xb842, - 0x6003, 0x0001, 0x080c, 0x9547, 0x080c, 0x9ab1, 0x00de, 0x00ce, - 0x0898, 0x080c, 0xbcb6, 0x0804, 0xcf17, 0x080c, 0xbcf2, 0x0804, - 0xcf17, 0x00d6, 0x2c68, 0x6104, 0x080c, 0xd759, 0x00de, 0x0118, - 0x080c, 0xb2d3, 0x0408, 0x6004, 0x8007, 0x6134, 0x918c, 0x00ff, - 0x9105, 0x6036, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, - 0x603c, 0x600a, 0x2001, 0x1987, 0x2004, 0x601a, 0x602c, 0x2c08, - 0x2060, 0x6024, 0xd0b4, 0x0108, 0xc085, 0xc0b5, 0x6026, 0x2160, - 0x080c, 0x94ff, 0x080c, 0x9ab1, 0x0005, 0x00de, 0x00ce, 0x080c, - 0xbcb6, 0x080c, 0x3250, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, - 0x3279, 0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, 0x6043, - 0x0000, 0x012e, 0x00ee, 0x0005, 0x080c, 0xb708, 0x1904, 0xcfc1, - 0x0005, 0x6000, 0x908a, 0x0010, 0x1a0c, 0x0dc5, 0x0096, 0x00d6, - 0x001b, 0x00de, 0x009e, 0x0005, 0xd02c, 0xd02c, 0xd02c, 0xd02c, - 0xd02c, 0xd02c, 0xd02c, 0xd02c, 0xd02c, 0xcdd9, 0xd02c, 0xcde0, - 0xd02e, 0xcde0, 0xd048, 0xd02c, 0x080c, 0x0dc5, 0x6004, 0x9086, - 0x008b, 0x01b0, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0035, - 0x1130, 0x602c, 0x9080, 0x0009, 0x200c, 0xc185, 0x2102, 0x6007, - 0x008b, 0x6003, 0x000d, 0x080c, 0x94ff, 0x080c, 0x9ab1, 0x0005, - 0x080c, 0xd7d7, 0x0118, 0x080c, 0xd7ea, 0x0010, 0x080c, 0xd7f8, - 0x080c, 0xd2c3, 0x080c, 0xd0d8, 0x0570, 0x080c, 0x3250, 0x080c, - 0xd0d8, 0x0168, 0x6014, 0x2048, 0xa867, 0x0103, 0xa87b, 0x0006, - 0xa877, 0x0000, 0xa880, 0xc0ed, 0xa882, 0x080c, 0x6e9f, 0x2c68, - 0x080c, 0xb27d, 0x0150, 0x6810, 0x6012, 0x080c, 0xd554, 0x00c6, - 0x2d60, 0x080c, 0xb306, 0x00ce, 0x0008, 0x2d60, 0x6017, 0x0000, - 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x9547, - 0x080c, 0x9ab1, 0x00c8, 0x080c, 0xd7d7, 0x0138, 0x6034, 0x9086, - 0x4000, 0x1118, 0x080c, 0x3250, 0x08d0, 0x6034, 0x908c, 0xff00, - 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x080c, - 0x3250, 0x0868, 0x080c, 0xb306, 0x0005, 0x6000, 0x908a, 0x0010, - 0x1a0c, 0x0dc5, 0x0002, 0xd0b3, 0xd0b3, 0xd0b7, 0xd0b5, 0xd0c1, - 0xd0b3, 0xd0b3, 0xb306, 0xd0b3, 0xd0b3, 0xd0b3, 0xd0b3, 0xd0b3, - 0xd0b3, 0xd0b3, 0xd0b3, 0x080c, 0x0dc5, 0x080c, 0xac2b, 0x6114, - 0x0096, 0x2148, 0xa87b, 0x0006, 0x080c, 0x6e9f, 0x009e, 0x0804, - 0xb2d3, 0x601c, 0xd084, 0x190c, 0x1a8e, 0x0c88, 0x9284, 0x0007, - 0x1158, 0x9282, 0x1cd0, 0x0240, 0x2001, 0x181a, 0x2004, 0x9202, - 0x1218, 0x9085, 0x0001, 0x0005, 0x9006, 0x0ce8, 0x0096, 0x0028, - 0x0096, 0x0006, 0x6014, 0x2048, 0x000e, 0x0006, 0x9984, 0xf000, - 0x9086, 0xf000, 0x0110, 0x080c, 0x10b9, 0x000e, 0x009e, 0x0005, - 0x00e6, 0x00c6, 0x0036, 0x0006, 0x0126, 0x2091, 0x8000, 0x2061, - 0x1cd0, 0x2071, 0x1800, 0x7354, 0x7074, 0x9302, 0x1640, 0x6020, - 0x9206, 0x11f8, 0x080c, 0xd7e3, 0x0180, 0x9286, 0x0001, 0x1168, - 0x6004, 0x9086, 0x0004, 0x1148, 0x080c, 0x3250, 0x080c, 0xd7f8, - 0x00c6, 0x080c, 0xb306, 0x00ce, 0x0060, 0x080c, 0xd4ce, 0x0148, - 0x080c, 0xd2e0, 0x1110, 0x080c, 0xbcb6, 0x00c6, 0x080c, 0xb2d3, - 0x00ce, 0x9ce0, 0x0018, 0x7068, 0x9c02, 0x1208, 0x08a0, 0x012e, - 0x000e, 0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0016, - 0x9188, 0x1000, 0x210c, 0x81ff, 0x0128, 0x2061, 0x1ab7, 0x6112, - 0x080c, 0x3250, 0x9006, 0x0010, 0x9085, 0x0001, 0x001e, 0x00ce, - 0x00ee, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xb27d, - 0x01b0, 0x6656, 0x2b00, 0x6012, 0x080c, 0x57dd, 0x0118, 0x080c, - 0xd207, 0x0168, 0x080c, 0xd554, 0x6023, 0x0003, 0x2009, 0x004b, - 0x080c, 0xb352, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, - 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0xbaa0, 0x080c, 0xb325, - 0x0560, 0x6057, 0x0000, 0x2b00, 0x6012, 0x080c, 0xd554, 0x6023, - 0x0003, 0x0016, 0x080c, 0x96a4, 0x0076, 0x903e, 0x080c, 0x9577, - 0x2c08, 0x080c, 0xe91c, 0x007e, 0x001e, 0xd184, 0x0128, 0x080c, - 0xb2d3, 0x9085, 0x0001, 0x0070, 0x080c, 0x57dd, 0x0128, 0xd18c, - 0x1170, 0x080c, 0xd207, 0x0148, 0x2009, 0x004c, 0x080c, 0xb352, - 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2900, - 0x6016, 0x0c90, 0x2009, 0x004d, 0x0010, 0x2009, 0x004e, 0x00f6, - 0x00c6, 0x0046, 0x0016, 0x080c, 0xb27d, 0x2c78, 0x05a0, 0x7e56, - 0x2b00, 0x7812, 0x7823, 0x0003, 0x0016, 0x2021, 0x0005, 0x080c, - 0xd219, 0x001e, 0x9186, 0x004d, 0x0118, 0x9186, 0x004e, 0x0148, - 0x2001, 0x1980, 0x200c, 0xd1fc, 0x0168, 0x2f60, 0x080c, 0xb2d3, - 0x00d0, 0x2001, 0x197f, 0x200c, 0xd1fc, 0x0120, 0x2f60, 0x080c, - 0xb2d3, 0x0088, 0x2f60, 0x080c, 0x57dd, 0x0138, 0xd18c, 0x1118, - 0x04f1, 0x0148, 0x0010, 0x2900, 0x7816, 0x001e, 0x0016, 0x080c, - 0xb352, 0x9085, 0x0001, 0x001e, 0x004e, 0x00ce, 0x00fe, 0x0005, - 0x00f6, 0x00c6, 0x0046, 0x080c, 0xb27d, 0x2c78, 0x0508, 0x7e56, - 0x2b00, 0x7812, 0x7823, 0x0003, 0x0096, 0x2021, 0x0004, 0x0489, - 0x009e, 0x2001, 0x197e, 0x200c, 0xd1fc, 0x0120, 0x2f60, 0x080c, - 0xb2d3, 0x0060, 0x2f60, 0x080c, 0x57dd, 0x0120, 0xd18c, 0x1160, - 0x0071, 0x0130, 0x2009, 0x0052, 0x080c, 0xb352, 0x9085, 0x0001, - 0x004e, 0x00ce, 0x00fe, 0x0005, 0x2900, 0x7816, 0x0c98, 0x00c6, - 0x080c, 0x4be4, 0x00ce, 0x1120, 0x080c, 0xb2d3, 0x9006, 0x0005, - 0xa867, 0x0000, 0xa86b, 0x8000, 0x2900, 0x6016, 0x9085, 0x0001, - 0x0005, 0x0096, 0x0076, 0x0126, 0x2091, 0x8000, 0x080c, 0x6858, - 0x0158, 0x2001, 0xd21e, 0x0006, 0x900e, 0x2400, 0x080c, 0x710b, - 0x080c, 0x6e9f, 0x000e, 0x0807, 0x2418, 0x080c, 0x993f, 0xbaa0, - 0x0086, 0x2041, 0x0001, 0x2039, 0x0001, 0x2608, 0x080c, 0x96bc, - 0x008e, 0x080c, 0x9577, 0x2f08, 0x2648, 0x080c, 0xe91c, 0xb93c, - 0x81ff, 0x090c, 0x978f, 0x080c, 0x9ab1, 0x012e, 0x007e, 0x009e, - 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xb27d, 0x0190, - 0x660a, 0x2b08, 0x6112, 0x080c, 0xd554, 0x6023, 0x0001, 0x2900, - 0x6016, 0x2009, 0x001f, 0x080c, 0xb352, 0x9085, 0x0001, 0x012e, - 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, - 0x080c, 0xb325, 0x01b8, 0x660a, 0x2b08, 0x6112, 0x080c, 0xd554, - 0x6023, 0x0008, 0x2900, 0x6016, 0x00f6, 0x2c78, 0x080c, 0x1768, - 0x00fe, 0x2009, 0x0021, 0x080c, 0xb352, 0x9085, 0x0001, 0x012e, - 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2009, 0x003d, 0x00c6, 0x0126, - 0x0016, 0x2091, 0x8000, 0x080c, 0xb27d, 0x0198, 0x660a, 0x2b08, - 0x6112, 0x080c, 0xd554, 0x6023, 0x0001, 0x2900, 0x6016, 0x001e, - 0x0016, 0x080c, 0xb352, 0x9085, 0x0001, 0x001e, 0x012e, 0x00ce, - 0x0005, 0x9006, 0x0cd0, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, - 0xb325, 0x0188, 0x2b08, 0x6112, 0x080c, 0xd554, 0x6023, 0x0001, - 0x2900, 0x6016, 0x2009, 0x0000, 0x080c, 0xb352, 0x9085, 0x0001, - 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2009, 0x0044, 0x0830, - 0x2009, 0x0049, 0x0818, 0x0026, 0x00b6, 0x6210, 0x2258, 0xba3c, - 0x82ff, 0x0110, 0x8211, 0xba3e, 0x00be, 0x002e, 0x0005, 0x0006, - 0x0016, 0x6004, 0x908e, 0x0002, 0x0140, 0x908e, 0x0003, 0x0128, - 0x908e, 0x0004, 0x0110, 0x9085, 0x0001, 0x001e, 0x000e, 0x0005, - 0x0006, 0x0086, 0x0096, 0x6020, 0x9086, 0x0004, 0x01a8, 0x6014, - 0x904d, 0x080c, 0xd0d8, 0x0180, 0xa864, 0x9086, 0x0139, 0x0170, - 0x6020, 0x90c6, 0x0003, 0x0140, 0x90c6, 0x0002, 0x0128, 0xa868, - 0xd0fc, 0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x009e, 0x008e, - 0x000e, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xb325, - 0x0198, 0x2b08, 0x6112, 0x080c, 0xd554, 0x6023, 0x0001, 0x2900, - 0x6016, 0x080c, 0x3250, 0x2009, 0x0028, 0x080c, 0xb352, 0x9085, - 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x9186, 0x0015, - 0x11a8, 0x2011, 0x1824, 0x2204, 0x9086, 0x0074, 0x1178, 0x00b6, - 0x080c, 0xbf63, 0x00be, 0x080c, 0xc1df, 0x6003, 0x0001, 0x6007, - 0x0029, 0x080c, 0x9547, 0x080c, 0x9ab1, 0x0078, 0x6014, 0x0096, - 0x2048, 0xa868, 0x009e, 0xd0fc, 0x0148, 0x2001, 0x0001, 0x080c, - 0xd71a, 0x080c, 0xbcb6, 0x080c, 0xb2d3, 0x0005, 0x0096, 0x6014, - 0x904d, 0x090c, 0x0dc5, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, - 0x4005, 0xa89b, 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, - 0x080c, 0x6e9f, 0x012e, 0x009e, 0x080c, 0xb2d3, 0x0c30, 0x0096, - 0x9186, 0x0016, 0x1128, 0x2001, 0x0004, 0x080c, 0x666a, 0x00e8, - 0x9186, 0x0015, 0x1510, 0x2011, 0x1824, 0x2204, 0x9086, 0x0014, - 0x11e0, 0x6010, 0x00b6, 0x2058, 0x080c, 0x67bf, 0x00be, 0x080c, - 0xc2b5, 0x1198, 0x6010, 0x00b6, 0x2058, 0xb890, 0x00be, 0x9005, - 0x0160, 0x2001, 0x0006, 0x080c, 0x666a, 0x6014, 0x2048, 0xa868, - 0xd0fc, 0x0170, 0x080c, 0xb6dc, 0x0048, 0x6014, 0x2048, 0xa868, - 0xd0fc, 0x0528, 0x080c, 0xbcb6, 0x080c, 0xb2d3, 0x009e, 0x0005, - 0x6014, 0x6310, 0x2358, 0x904d, 0x090c, 0x0dc5, 0xa87b, 0x0000, - 0xa883, 0x0000, 0xa897, 0x4000, 0x900e, 0x080c, 0x6944, 0x1108, - 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0xa99a, 0x0126, 0x2091, - 0x8000, 0x080c, 0x6e9f, 0x012e, 0x080c, 0xb2d3, 0x08f8, 0x6014, - 0x904d, 0x090c, 0x0dc5, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, - 0x4005, 0xa89b, 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, - 0x080c, 0x6e9f, 0x012e, 0x080c, 0xb2d3, 0x0840, 0xa878, 0x9086, - 0x0005, 0x1108, 0x0009, 0x0005, 0xa880, 0xc0ad, 0xa882, 0x0005, - 0x6043, 0x0000, 0x6017, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, - 0x080c, 0x94ff, 0x080c, 0x9ab1, 0x0005, 0x00c6, 0x6010, 0x00b6, - 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0120, 0x6020, 0x9084, 0x000f, - 0x0013, 0x00ce, 0x0005, 0xcdd9, 0xd404, 0xd404, 0xd407, 0xec80, - 0xec9b, 0xec9e, 0xcdd9, 0xcdd9, 0xcdd9, 0xcdd9, 0xcdd9, 0xcdd9, - 0xcdd9, 0xcdd9, 0x080c, 0x0dc5, 0xa001, 0xa001, 0x0005, 0x0096, - 0x6014, 0x904d, 0x0118, 0xa87c, 0xd0e4, 0x1110, 0x009e, 0x0010, - 0x009e, 0x0005, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, - 0x0550, 0x2001, 0x1834, 0x2004, 0x9005, 0x1540, 0x00f6, 0x2c78, - 0x080c, 0xb27d, 0x0508, 0x7810, 0x6012, 0x080c, 0xd554, 0x7820, - 0x9086, 0x0003, 0x0128, 0x7808, 0x603a, 0x2f00, 0x603e, 0x0020, - 0x7808, 0x603e, 0x2f00, 0x603a, 0x602e, 0x6023, 0x0001, 0x6007, - 0x0035, 0x6003, 0x0001, 0x7954, 0x6156, 0x080c, 0x94ff, 0x080c, - 0x9ab1, 0x2f60, 0x00fe, 0x0005, 0x2f60, 0x00fe, 0x2001, 0x1988, - 0x2004, 0x6042, 0x0005, 0x0016, 0x0096, 0x6814, 0x2048, 0xa87c, - 0xd0e4, 0x0180, 0xc0e4, 0xa87e, 0xa877, 0x0000, 0xa893, 0x0000, - 0xa88f, 0x0000, 0xd0cc, 0x0130, 0xc0cc, 0xa87e, 0xa878, 0x2048, - 0x080c, 0x0fc0, 0x6830, 0x6036, 0x908e, 0x0001, 0x0148, 0x6803, - 0x0002, 0x9086, 0x0005, 0x0170, 0x9006, 0x602e, 0x6032, 0x00d0, - 0x681c, 0xc085, 0x681e, 0x6803, 0x0004, 0x6824, 0xc0f4, 0x9085, - 0x0c00, 0x6826, 0x6814, 0x2048, 0xa8ac, 0x6938, 0x9102, 0xa8b0, - 0x693c, 0x9103, 0x1e48, 0x683c, 0x602e, 0x6838, 0x9084, 0xfffc, - 0x683a, 0x6032, 0x2d00, 0x603a, 0x6808, 0x603e, 0x6910, 0x6112, - 0x6954, 0x6156, 0x6023, 0x0001, 0x6007, 0x0039, 0x6003, 0x0001, - 0x080c, 0x94ff, 0x080c, 0x9ab1, 0x009e, 0x001e, 0x0005, 0x6024, - 0xd0d4, 0x0510, 0xd0f4, 0x11f8, 0x6038, 0x940a, 0x603c, 0x9303, - 0x0230, 0x9105, 0x0120, 0x6024, 0xc0d4, 0xc0f5, 0x0098, 0x643a, - 0x633e, 0xac3e, 0xab42, 0x0046, 0x0036, 0x2400, 0xacac, 0x9402, - 0xa836, 0x2300, 0xabb0, 0x9303, 0xa83a, 0x003e, 0x004e, 0x6024, - 0xc0d4, 0x0000, 0x6026, 0x0005, 0xd0f4, 0x1138, 0xa83c, 0x603a, - 0xa840, 0x603e, 0x6024, 0xc0f5, 0x6026, 0x0005, 0x0006, 0x0016, - 0x6004, 0x908e, 0x0034, 0x01b8, 0x908e, 0x0035, 0x01a0, 0x908e, - 0x0036, 0x0188, 0x908e, 0x0037, 0x0170, 0x908e, 0x0038, 0x0158, - 0x908e, 0x0039, 0x0140, 0x908e, 0x003a, 0x0128, 0x908e, 0x003b, - 0x0110, 0x9085, 0x0001, 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, - 0x0026, 0x0036, 0x00e6, 0x2001, 0x1982, 0x200c, 0x8000, 0x2014, - 0x2001, 0x0032, 0x080c, 0x9375, 0x2001, 0x1986, 0x82ff, 0x1110, - 0x2011, 0x0014, 0x2202, 0x2001, 0x1984, 0x200c, 0x8000, 0x2014, - 0x2071, 0x196c, 0x711a, 0x721e, 0x2001, 0x0064, 0x080c, 0x9375, - 0x2001, 0x1987, 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001, - 0x1988, 0x9288, 0x000a, 0x2102, 0x2001, 0x1a98, 0x2102, 0x2001, - 0x0032, 0x080c, 0x1611, 0x080c, 0x6a84, 0x00ee, 0x003e, 0x002e, - 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x00e6, 0x2001, 0x1986, - 0x2003, 0x0028, 0x2001, 0x1987, 0x2003, 0x0014, 0x2071, 0x196c, - 0x701b, 0x0000, 0x701f, 0x07d0, 0x2001, 0x1988, 0x2009, 0x001e, - 0x2102, 0x2001, 0x1a98, 0x2102, 0x2001, 0x0032, 0x080c, 0x1611, - 0x00ee, 0x001e, 0x000e, 0x0005, 0x0096, 0x6058, 0x904d, 0x0110, - 0x080c, 0x1040, 0x009e, 0x0005, 0x0005, 0x00c6, 0x0126, 0x2091, - 0x8000, 0x080c, 0xb27d, 0x0180, 0x2b08, 0x6112, 0x0ca9, 0x6023, - 0x0001, 0x2900, 0x6016, 0x2009, 0x0033, 0x080c, 0xb352, 0x9085, - 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x00e6, - 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x1520, 0x7090, 0x9086, - 0x0018, 0x0120, 0x7090, 0x9086, 0x0014, 0x11e0, 0x6014, 0x2048, - 0xaa3c, 0xd2e4, 0x1160, 0x2c78, 0x080c, 0x9d4c, 0x01d8, 0x707c, - 0xaa50, 0x9206, 0x1160, 0x7080, 0xaa54, 0x9206, 0x1140, 0x6210, - 0x00b6, 0x2258, 0xbaa0, 0x00be, 0x900e, 0x080c, 0x3299, 0x080c, - 0xb6dc, 0x0020, 0x080c, 0xbcb6, 0x080c, 0xb2d3, 0x00fe, 0x00ee, - 0x009e, 0x0005, 0x7060, 0xaa54, 0x9206, 0x0d48, 0x0c80, 0x00c6, - 0x0126, 0x2091, 0x8000, 0x080c, 0xb27d, 0x0188, 0x2b08, 0x6112, - 0x080c, 0xd554, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x004d, - 0x080c, 0xb352, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, - 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x0016, 0x080c, 0xb27d, - 0x0180, 0x2b08, 0x6112, 0x080c, 0xd554, 0x6023, 0x0001, 0x2900, - 0x6016, 0x001e, 0x080c, 0xb352, 0x9085, 0x0001, 0x012e, 0x00ce, - 0x0005, 0x001e, 0x9006, 0x0cd0, 0x0016, 0x0026, 0x0036, 0x0046, - 0x0056, 0x0066, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, - 0x0015, 0x1568, 0x7190, 0x6014, 0x2048, 0xa814, 0x8003, 0x9106, - 0x1530, 0x20e1, 0x0000, 0x2001, 0x19a1, 0x2003, 0x0000, 0x6014, - 0x2048, 0xa830, 0x20a8, 0x8906, 0x8006, 0x8007, 0x9094, 0x003f, - 0x22e8, 0x9084, 0xffc0, 0x9080, 0x001b, 0x20a0, 0x2001, 0x19a1, - 0x0016, 0x200c, 0x080c, 0xde2e, 0x001e, 0xa804, 0x9005, 0x0110, - 0x2048, 0x0c38, 0x6014, 0x2048, 0xa867, 0x0103, 0x0010, 0x080c, - 0xbcb6, 0x080c, 0xb2d3, 0x00fe, 0x00ee, 0x009e, 0x006e, 0x005e, - 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, 0x0096, 0x00e6, 0x00f6, - 0x2071, 0x1800, 0x9186, 0x0015, 0x11b8, 0x7090, 0x9086, 0x0004, - 0x1198, 0x6014, 0x2048, 0x2c78, 0x080c, 0x9d4c, 0x01a8, 0x707c, - 0xaa74, 0x9206, 0x1130, 0x7080, 0xaa78, 0x9206, 0x1110, 0x080c, - 0x3250, 0x080c, 0xb6dc, 0x0020, 0x080c, 0xbcb6, 0x080c, 0xb2d3, - 0x00fe, 0x00ee, 0x009e, 0x0005, 0x7060, 0xaa78, 0x9206, 0x0d78, - 0x0c80, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, - 0x1550, 0x7090, 0x9086, 0x0004, 0x1530, 0x6014, 0x2048, 0x2c78, - 0x080c, 0x9d4c, 0x05f0, 0x707c, 0xaacc, 0x9206, 0x1180, 0x7080, - 0xaad0, 0x9206, 0x1160, 0x080c, 0x3250, 0x0016, 0xa998, 0xaab0, - 0x9284, 0x1000, 0xc0fd, 0x080c, 0x5784, 0x001e, 0x0010, 0x080c, - 0x556f, 0x080c, 0xd0d8, 0x0508, 0xa87b, 0x0000, 0xa883, 0x0000, - 0xa897, 0x4000, 0x0080, 0x080c, 0xd0d8, 0x01b8, 0x6014, 0x2048, - 0x080c, 0x556f, 0x1d70, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, - 0x4005, 0xa89b, 0x0004, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139, - 0x080c, 0x6e9f, 0x012e, 0x080c, 0xb2d3, 0x00fe, 0x00ee, 0x009e, - 0x0005, 0x7060, 0xaad0, 0x9206, 0x0930, 0x0888, 0x0016, 0x0026, - 0xa87c, 0xd0ac, 0x0178, 0xa938, 0xaa34, 0x2100, 0x9205, 0x0150, - 0xa890, 0x9106, 0x1118, 0xa88c, 0x9206, 0x0120, 0xa992, 0xaa8e, - 0x9085, 0x0001, 0x002e, 0x001e, 0x0005, 0x00b6, 0x00d6, 0x0036, - 0x080c, 0xd0d8, 0x0904, 0xd716, 0x0096, 0x6314, 0x2348, 0xa87a, - 0xa982, 0x929e, 0x4000, 0x1580, 0x6310, 0x00c6, 0x2358, 0x2009, - 0x0000, 0xa868, 0xd0f4, 0x1140, 0x080c, 0x6944, 0x1108, 0xc185, - 0xb800, 0xd0bc, 0x0108, 0xc18d, 0xaa96, 0xa99a, 0x20a9, 0x0004, - 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, 0xb8c4, 0x20e0, - 0xb8c8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0f8b, 0x20a9, 0x0004, - 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8c8, 0x9080, 0x000a, 0x2098, - 0x080c, 0x0f8b, 0x00ce, 0x0090, 0xaa96, 0x3918, 0x9398, 0x0007, - 0x231c, 0x6004, 0x9086, 0x0016, 0x0110, 0xa89b, 0x0004, 0xaba2, - 0x6310, 0x2358, 0xb804, 0x9084, 0x00ff, 0xa89e, 0xa868, 0xc0f4, - 0xa86a, 0x080c, 0x6e92, 0x6017, 0x0000, 0x009e, 0x003e, 0x00de, - 0x00be, 0x0005, 0x0026, 0x0036, 0x0046, 0x00b6, 0x0096, 0x00f6, - 0x6214, 0x2248, 0x6210, 0x2258, 0x2079, 0x0260, 0x9096, 0x0000, - 0x11a0, 0xb814, 0x9084, 0x00ff, 0x900e, 0x080c, 0x2873, 0x2118, - 0x831f, 0x939c, 0xff00, 0x7838, 0x9084, 0x00ff, 0x931d, 0x7c3c, - 0x2011, 0x8018, 0x080c, 0x4c44, 0x00a8, 0x9096, 0x0001, 0x1148, - 0x89ff, 0x0180, 0xa89b, 0x000d, 0x7838, 0xa8a6, 0x783c, 0xa8aa, - 0x0048, 0x9096, 0x0002, 0x1130, 0xa89b, 0x000d, 0x7838, 0xa8a6, - 0x783c, 0xa8aa, 0x00fe, 0x009e, 0x00be, 0x004e, 0x003e, 0x002e, - 0x0005, 0x00c6, 0x0026, 0x0016, 0x9186, 0x0035, 0x0110, 0x6a38, - 0x0008, 0x6a2c, 0x080c, 0xd0c6, 0x01f0, 0x2260, 0x6120, 0x9186, - 0x0003, 0x0118, 0x9186, 0x0006, 0x1190, 0x6838, 0x9206, 0x0140, - 0x683c, 0x9206, 0x1160, 0x6108, 0x6838, 0x9106, 0x1140, 0x0020, - 0x6008, 0x693c, 0x9106, 0x1118, 0x6010, 0x6910, 0x9106, 0x001e, - 0x002e, 0x00ce, 0x0005, 0x9085, 0x0001, 0x0cc8, 0xa974, 0xd1cc, - 0x0198, 0x918c, 0x00ff, 0x918e, 0x0002, 0x1170, 0xa9a8, 0x918c, - 0x000f, 0x918e, 0x0001, 0x1140, 0xa87c, 0xd0ac, 0x0128, 0xa834, - 0xa938, 0x9115, 0x190c, 0xc78b, 0x0005, 0x0036, 0x2019, 0x0001, - 0x0010, 0x0036, 0x901e, 0x0499, 0x01e0, 0x080c, 0xd0d8, 0x01c8, - 0x080c, 0xd2c3, 0x6037, 0x4000, 0x6014, 0x6017, 0x0000, 0x0096, - 0x2048, 0xa87c, 0x080c, 0xd2e0, 0x1118, 0x080c, 0xbcb6, 0x0040, - 0xa867, 0x0103, 0xa877, 0x0000, 0x83ff, 0x1129, 0x080c, 0x6e9f, - 0x009e, 0x003e, 0x0005, 0xa880, 0xd0b4, 0x0128, 0xa87b, 0x0006, - 0xc0ec, 0xa882, 0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, - 0xa87b, 0x0005, 0x080c, 0xd3d4, 0xa877, 0x0000, 0x0005, 0x2001, - 0x1810, 0x2004, 0xd0ec, 0x0005, 0x0006, 0x2001, 0x1810, 0x2004, - 0xd0f4, 0x000e, 0x0005, 0x0006, 0x2001, 0x1810, 0x2004, 0xd0e4, - 0x000e, 0x0005, 0x0036, 0x0046, 0x6010, 0x00b6, 0x2058, 0xbba0, - 0x00be, 0x2021, 0x0007, 0x080c, 0x4dfb, 0x004e, 0x003e, 0x0005, - 0x0c51, 0x1d81, 0x0005, 0x2001, 0x1986, 0x2004, 0x601a, 0x0005, - 0x2001, 0x1988, 0x2004, 0x6042, 0x0005, 0x080c, 0xb2d3, 0x0804, - 0x9ab1, 0x2001, 0x0109, 0x2004, 0xd084, 0x01e0, 0x0126, 0x2091, - 0x2800, 0x0006, 0x0016, 0x0026, 0x0036, 0x00f6, 0x00e6, 0x00c6, - 0x2079, 0x19e8, 0x2071, 0x1800, 0x2061, 0x0100, 0x080c, 0x93e2, - 0x00ce, 0x00ee, 0x00fe, 0x003e, 0x002e, 0x001e, 0x000e, 0x012e, - 0x9085, 0x0001, 0x0005, 0x00b6, 0x0066, 0x6000, 0x90b2, 0x0010, - 0x1a0c, 0x0dc5, 0x001b, 0x006e, 0x00be, 0x0005, 0xd846, 0xdf8d, - 0xe102, 0xd846, 0xd846, 0xd846, 0xd846, 0xd846, 0xd87d, 0xe186, - 0xd846, 0xd846, 0xd846, 0xd846, 0xd846, 0xd846, 0x080c, 0x0dc5, - 0x0066, 0x6000, 0x90b2, 0x0010, 0x1a0c, 0x0dc5, 0x0013, 0x006e, - 0x0005, 0xd861, 0xe6d5, 0xd861, 0xd861, 0xd861, 0xd861, 0xd861, - 0xd861, 0xe682, 0xe729, 0xd861, 0xedb4, 0xedea, 0xedb4, 0xedea, - 0xd861, 0x080c, 0x0dc5, 0x6000, 0x9082, 0x0010, 0x1a0c, 0x0dc5, - 0x6000, 0x000a, 0x0005, 0xd87b, 0xe364, 0xe433, 0xe456, 0xe516, - 0xd87b, 0xe5f5, 0xe59e, 0xe192, 0xe658, 0xe66d, 0xd87b, 0xd87b, - 0xd87b, 0xd87b, 0xd87b, 0x080c, 0x0dc5, 0x91b2, 0x0053, 0x1a0c, - 0x0dc5, 0x2100, 0x91b2, 0x0040, 0x1a04, 0xdcfd, 0x0002, 0xd8c7, - 0xdacb, 0xd8c7, 0xd8c7, 0xd8c7, 0xdad4, 0xd8c7, 0xd8c7, 0xd8c7, - 0xd8c7, 0xd8c7, 0xd8c7, 0xd8c7, 0xd8c7, 0xd8c7, 0xd8c7, 0xd8c7, - 0xd8c7, 0xd8c7, 0xd8c7, 0xd8c7, 0xd8c7, 0xd8c7, 0xd8c9, 0xd92c, - 0xd93b, 0xd99f, 0xd9ca, 0xda43, 0xdab6, 0xd8c7, 0xd8c7, 0xdad7, - 0xd8c7, 0xd8c7, 0xdaec, 0xdaf9, 0xd8c7, 0xd8c7, 0xd8c7, 0xd8c7, - 0xd8c7, 0xdb9f, 0xd8c7, 0xd8c7, 0xdbb3, 0xd8c7, 0xd8c7, 0xdb6e, - 0xd8c7, 0xd8c7, 0xd8c7, 0xdbcb, 0xd8c7, 0xd8c7, 0xd8c7, 0xdc48, - 0xd8c7, 0xd8c7, 0xd8c7, 0xd8c7, 0xd8c7, 0xd8c7, 0xdcc5, 0x080c, - 0x0dc5, 0x080c, 0x6a61, 0x1150, 0x2001, 0x1837, 0x2004, 0xd0cc, - 0x1128, 0x9084, 0x0009, 0x9086, 0x0008, 0x1140, 0x6007, 0x0009, - 0x602f, 0x0009, 0x6017, 0x0000, 0x0804, 0xdac4, 0x080c, 0x69fd, - 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x6210, 0x2258, 0xbaa0, - 0x0026, 0x2019, 0x0029, 0x080c, 0x96a4, 0x0076, 0x903e, 0x080c, - 0x9577, 0x2c08, 0x080c, 0xe91c, 0x007e, 0x001e, 0x001e, 0x002e, - 0x003e, 0x00ce, 0x00ee, 0x6610, 0x2658, 0x080c, 0x6733, 0xbe04, - 0x9684, 0x00ff, 0x9082, 0x0006, 0x1268, 0x0016, 0x0026, 0x6210, - 0x00b6, 0x2258, 0xbaa0, 0x00be, 0x2c08, 0x080c, 0xf015, 0x002e, - 0x001e, 0x1178, 0x080c, 0xe84e, 0x1904, 0xd997, 0x080c, 0xe7ea, - 0x1120, 0x6007, 0x0008, 0x0804, 0xdac4, 0x6007, 0x0009, 0x0804, - 0xdac4, 0x080c, 0xeab9, 0x0128, 0x080c, 0xe84e, 0x0d78, 0x0804, - 0xd997, 0x6017, 0x1900, 0x0c88, 0x080c, 0x3374, 0x1904, 0xdcfa, - 0x6106, 0x080c, 0xe78e, 0x6007, 0x0006, 0x0804, 0xdac4, 0x6007, - 0x0007, 0x0804, 0xdac4, 0x080c, 0xee26, 0x1904, 0xdcfa, 0x080c, - 0x3374, 0x1904, 0xdcfa, 0x00d6, 0x6610, 0x2658, 0xbe04, 0x9684, - 0x00ff, 0x9082, 0x0006, 0x1220, 0x2001, 0x0001, 0x080c, 0x6656, - 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0188, 0x9686, 0x0004, - 0x0170, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006, 0x0140, 0x9686, - 0x0004, 0x0128, 0x9686, 0x0005, 0x0110, 0x00de, 0x0480, 0x00e6, - 0x2071, 0x0260, 0x7034, 0x9084, 0x0003, 0x1140, 0x7034, 0x9082, - 0x0014, 0x0220, 0x7030, 0x9084, 0x0003, 0x0130, 0x00ee, 0x6017, - 0x0000, 0x602f, 0x0007, 0x00b0, 0x00ee, 0x080c, 0xe8b2, 0x1190, - 0x9686, 0x0006, 0x1140, 0x0026, 0x6210, 0x2258, 0xbaa0, 0x900e, - 0x080c, 0x3299, 0x002e, 0x080c, 0x67bf, 0x6007, 0x000a, 0x00de, - 0x0804, 0xdac4, 0x6007, 0x000b, 0x00de, 0x0804, 0xdac4, 0x080c, - 0x3250, 0x080c, 0xd7f8, 0x6007, 0x0001, 0x0804, 0xdac4, 0x080c, - 0xee26, 0x1904, 0xdcfa, 0x080c, 0x3374, 0x1904, 0xdcfa, 0x2071, - 0x0260, 0x7034, 0x90b4, 0x0003, 0x1948, 0x90b2, 0x0014, 0x0a30, - 0x7030, 0x9084, 0x0003, 0x1910, 0x6610, 0x2658, 0xbe04, 0x9686, - 0x0707, 0x09e8, 0x0026, 0x6210, 0x2258, 0xbaa0, 0x900e, 0x080c, - 0x3299, 0x002e, 0x6007, 0x000c, 0x2001, 0x0001, 0x080c, 0xeff4, - 0x0804, 0xdac4, 0x080c, 0x6a61, 0x1140, 0x2001, 0x1837, 0x2004, - 0x9084, 0x0009, 0x9086, 0x0008, 0x1110, 0x0804, 0xd8d6, 0x080c, - 0x69fd, 0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, - 0x06c8, 0x1138, 0x0026, 0x2001, 0x0006, 0x080c, 0x6696, 0x002e, - 0x0050, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0004, 0x0120, 0x9686, - 0x0006, 0x1904, 0xd997, 0x080c, 0xe8bf, 0x1120, 0x6007, 0x000e, - 0x0804, 0xdac4, 0x0046, 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, - 0x3250, 0x080c, 0xd7f8, 0x004e, 0x0016, 0x9006, 0x2009, 0x1848, - 0x210c, 0xd1a4, 0x0148, 0x2009, 0x0029, 0x080c, 0xec31, 0x6010, - 0x2058, 0xb800, 0xc0e5, 0xb802, 0x001e, 0x004e, 0x6007, 0x0001, - 0x0804, 0xdac4, 0x2001, 0x0001, 0x080c, 0x6656, 0x0156, 0x0016, - 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x0270, - 0x080c, 0xc365, 0x003e, 0x002e, 0x001e, 0x015e, 0x9005, 0x0168, - 0x96b4, 0xff00, 0x8637, 0x9682, 0x0004, 0x0a04, 0xd997, 0x9682, - 0x0007, 0x0a04, 0xd9f3, 0x0804, 0xd997, 0x6017, 0x1900, 0x6007, - 0x0009, 0x0804, 0xdac4, 0x080c, 0x6a61, 0x1140, 0x2001, 0x1837, - 0x2004, 0x9084, 0x0009, 0x9086, 0x0008, 0x1110, 0x0804, 0xd8d6, - 0x080c, 0x69fd, 0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff, 0x0006, - 0x0016, 0x908e, 0x0001, 0x0118, 0x908e, 0x0000, 0x1118, 0x001e, - 0x000e, 0x0080, 0x001e, 0x000e, 0x9082, 0x0006, 0x06a0, 0x0150, - 0x96b4, 0xff00, 0x8637, 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, - 0x1904, 0xd997, 0x080c, 0xe8ed, 0x1138, 0x080c, 0xe7ea, 0x1120, - 0x6007, 0x0010, 0x0804, 0xdac4, 0x0046, 0x6410, 0x2458, 0xbca0, - 0x0046, 0x080c, 0x3250, 0x080c, 0xd7f8, 0x004e, 0x0016, 0x9006, - 0x2009, 0x1848, 0x210c, 0xd1a4, 0x0148, 0x2009, 0x0029, 0x080c, - 0xec31, 0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802, 0x001e, 0x004e, - 0x6007, 0x0001, 0x0448, 0x080c, 0xeab9, 0x0198, 0x0016, 0x968c, - 0x00ff, 0x9186, 0x0002, 0x0160, 0x9186, 0x0003, 0x0148, 0x001e, - 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0920, 0x0804, 0xd997, - 0x001e, 0x6017, 0x1900, 0x6007, 0x0009, 0x0070, 0x080c, 0x3374, - 0x1904, 0xdcfa, 0x080c, 0xee26, 0x1904, 0xdcfa, 0x080c, 0xdecb, - 0x1904, 0xd997, 0x6007, 0x0012, 0x6003, 0x0001, 0x080c, 0x9547, - 0x080c, 0x9ab1, 0x0005, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, - 0x9547, 0x080c, 0x9ab1, 0x0cb0, 0x6007, 0x0005, 0x0c68, 0x080c, - 0xee26, 0x1904, 0xdcfa, 0x080c, 0x3374, 0x1904, 0xdcfa, 0x080c, - 0xdecb, 0x1904, 0xd997, 0x6007, 0x0020, 0x6003, 0x0001, 0x080c, - 0x9547, 0x080c, 0x9ab1, 0x0005, 0x080c, 0x3374, 0x1904, 0xdcfa, - 0x6007, 0x0023, 0x6003, 0x0001, 0x080c, 0x9547, 0x080c, 0x9ab1, - 0x0005, 0x080c, 0xee26, 0x1904, 0xdcfa, 0x080c, 0x3374, 0x1904, - 0xdcfa, 0x080c, 0xdecb, 0x1904, 0xd997, 0x0016, 0x0026, 0x00e6, - 0x2071, 0x0260, 0x2c08, 0x2011, 0x1820, 0x2214, 0x703c, 0x9206, - 0x11e0, 0x2011, 0x181f, 0x2214, 0x7038, 0x9084, 0x00ff, 0x9206, - 0x11a0, 0x7240, 0x080c, 0xd0c6, 0x0570, 0x2260, 0x6008, 0x9086, - 0xffff, 0x0120, 0x7244, 0x6008, 0x9206, 0x1528, 0x6020, 0x9086, - 0x0007, 0x1508, 0x080c, 0xb2d3, 0x04a0, 0x7244, 0x9286, 0xffff, - 0x0180, 0x2c08, 0x080c, 0xd0c6, 0x01b0, 0x2260, 0x7240, 0x6008, - 0x9206, 0x1188, 0x6010, 0x9190, 0x0004, 0x2214, 0x9206, 0x01b8, - 0x0050, 0x7240, 0x2c08, 0x9006, 0x080c, 0xebfb, 0x1180, 0x7244, - 0x9286, 0xffff, 0x01b0, 0x2160, 0x6007, 0x0026, 0x6017, 0x1700, - 0x7214, 0x9296, 0xffff, 0x1180, 0x6007, 0x0025, 0x0068, 0x6020, - 0x9086, 0x0007, 0x1d80, 0x6004, 0x9086, 0x0024, 0x1110, 0x080c, - 0xb2d3, 0x2160, 0x6007, 0x0025, 0x6003, 0x0001, 0x080c, 0x9547, - 0x080c, 0x9ab1, 0x00ee, 0x002e, 0x001e, 0x0005, 0x2001, 0x0001, - 0x080c, 0x6656, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, - 0x2019, 0x1805, 0x2011, 0x0276, 0x080c, 0xc365, 0x003e, 0x002e, - 0x001e, 0x015e, 0x0120, 0x6007, 0x0031, 0x0804, 0xdac4, 0x080c, - 0xbf7b, 0x080c, 0x7637, 0x1190, 0x0006, 0x0026, 0x0036, 0x080c, - 0x7651, 0x1138, 0x080c, 0x7932, 0x080c, 0x612e, 0x080c, 0x7563, - 0x0010, 0x080c, 0x760f, 0x003e, 0x002e, 0x000e, 0x0005, 0x080c, - 0x3374, 0x1904, 0xdcfa, 0x080c, 0xdecb, 0x1904, 0xd997, 0x6106, - 0x080c, 0xdee7, 0x1120, 0x6007, 0x002b, 0x0804, 0xdac4, 0x6007, - 0x002c, 0x0804, 0xdac4, 0x080c, 0xee26, 0x1904, 0xdcfa, 0x080c, - 0x3374, 0x1904, 0xdcfa, 0x080c, 0xdecb, 0x1904, 0xd997, 0x6106, - 0x080c, 0xdeec, 0x1120, 0x6007, 0x002e, 0x0804, 0xdac4, 0x6007, - 0x002f, 0x0804, 0xdac4, 0x080c, 0x3374, 0x1904, 0xdcfa, 0x00e6, - 0x00d6, 0x00c6, 0x6010, 0x2058, 0xb904, 0x9184, 0x00ff, 0x9086, - 0x0006, 0x0158, 0x9184, 0xff00, 0x8007, 0x9086, 0x0006, 0x0128, - 0x00ce, 0x00de, 0x00ee, 0x0804, 0xdacb, 0x080c, 0x57d9, 0xd0e4, - 0x0904, 0xdc45, 0x2071, 0x026c, 0x7010, 0x603a, 0x7014, 0x603e, - 0x7108, 0x720c, 0x080c, 0x6a9f, 0x0140, 0x6010, 0x2058, 0xb810, - 0x9106, 0x1118, 0xb814, 0x9206, 0x0510, 0x080c, 0x6a9b, 0x15b8, - 0x2069, 0x1800, 0x6880, 0x9206, 0x1590, 0x687c, 0x9106, 0x1578, - 0x7210, 0x080c, 0xd0c6, 0x0590, 0x080c, 0xddb8, 0x0578, 0x080c, - 0xecad, 0x0560, 0x622e, 0x6007, 0x0036, 0x6003, 0x0001, 0x080c, - 0x94ff, 0x080c, 0x9ab1, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x7214, - 0x9286, 0xffff, 0x0150, 0x080c, 0xd0c6, 0x01c0, 0x9280, 0x0002, - 0x2004, 0x7110, 0x9106, 0x1190, 0x08e0, 0x7210, 0x2c08, 0x9085, - 0x0001, 0x080c, 0xebfb, 0x2c10, 0x2160, 0x0140, 0x0890, 0x6007, - 0x0037, 0x602f, 0x0009, 0x6017, 0x1500, 0x08b8, 0x6007, 0x0037, - 0x602f, 0x0003, 0x6017, 0x1700, 0x0880, 0x6007, 0x0012, 0x0868, - 0x080c, 0x3374, 0x1904, 0xdcfa, 0x6010, 0x2058, 0xb804, 0x9084, - 0xff00, 0x8007, 0x9086, 0x0006, 0x1904, 0xdacb, 0x00e6, 0x00d6, - 0x00c6, 0x080c, 0x57d9, 0xd0e4, 0x0904, 0xdcbd, 0x2069, 0x1800, - 0x2071, 0x026c, 0x7008, 0x603a, 0x720c, 0x623e, 0x9286, 0xffff, - 0x1150, 0x7208, 0x00c6, 0x2c08, 0x9085, 0x0001, 0x080c, 0xebfb, - 0x2c10, 0x00ce, 0x05e8, 0x080c, 0xd0c6, 0x05d0, 0x7108, 0x9280, - 0x0002, 0x2004, 0x9106, 0x15a0, 0x00c6, 0x0026, 0x2260, 0x080c, - 0xcce6, 0x002e, 0x00ce, 0x7118, 0x918c, 0xff00, 0x810f, 0x9186, - 0x0001, 0x0178, 0x9186, 0x0005, 0x0118, 0x9186, 0x0007, 0x1198, - 0x9280, 0x0005, 0x2004, 0x9005, 0x0170, 0x080c, 0xddb8, 0x0904, - 0xdc3e, 0x0056, 0x7510, 0x7614, 0x080c, 0xecc6, 0x005e, 0x00ce, - 0x00de, 0x00ee, 0x0005, 0x6007, 0x003b, 0x602f, 0x0009, 0x6017, - 0x2a00, 0x6003, 0x0001, 0x080c, 0x94ff, 0x080c, 0x9ab1, 0x0c78, - 0x6007, 0x003b, 0x602f, 0x0003, 0x6017, 0x0300, 0x6003, 0x0001, - 0x080c, 0x94ff, 0x080c, 0x9ab1, 0x0c10, 0x6007, 0x003b, 0x602f, - 0x000b, 0x6017, 0x0000, 0x0804, 0xdc15, 0x00e6, 0x0026, 0x080c, - 0x6a61, 0x0550, 0x080c, 0x69fd, 0x080c, 0xee97, 0x1518, 0x2071, - 0x1800, 0x70dc, 0x9085, 0x0003, 0x70de, 0x00f6, 0x2079, 0x0100, - 0x72b0, 0x9284, 0x00ff, 0x707e, 0x78e6, 0x9284, 0xff00, 0x7280, - 0x9205, 0x7082, 0x78ea, 0x00fe, 0x70e7, 0x0000, 0x080c, 0x6a9f, - 0x0120, 0x2011, 0x1a01, 0x2013, 0x07d0, 0xd0ac, 0x1128, 0x080c, - 0x3000, 0x0010, 0x080c, 0xeecb, 0x002e, 0x00ee, 0x080c, 0xb2d3, - 0x0804, 0xdaca, 0x080c, 0xb2d3, 0x0005, 0x2600, 0x0002, 0xdd11, - 0xdd3f, 0xdd50, 0xdd11, 0xdd11, 0xdd13, 0xdd61, 0xdd11, 0xdd11, - 0xdd11, 0xdd2d, 0xdd11, 0xdd11, 0xdd11, 0xdd6c, 0xdd82, 0xddb3, - 0xdd11, 0x080c, 0x0dc5, 0x080c, 0xee26, 0x1d20, 0x080c, 0x3374, - 0x1d08, 0x7038, 0x6016, 0x6007, 0x0045, 0x6003, 0x0001, 0x080c, - 0x9547, 0x0005, 0x080c, 0x3250, 0x080c, 0xd7f8, 0x6007, 0x0001, - 0x6003, 0x0001, 0x080c, 0x9547, 0x0005, 0x080c, 0xee26, 0x1950, - 0x080c, 0x3374, 0x1938, 0x080c, 0xdecb, 0x1d60, 0x703c, 0x6016, - 0x6007, 0x004a, 0x6003, 0x0001, 0x080c, 0x9547, 0x0005, 0x080c, - 0x3374, 0x1904, 0xdcfa, 0x2009, 0x0041, 0x080c, 0xeed4, 0x6007, - 0x0047, 0x6003, 0x0001, 0x080c, 0x9547, 0x080c, 0x9ab1, 0x0005, - 0x080c, 0x3374, 0x1904, 0xdcfa, 0x2009, 0x0042, 0x080c, 0xeed4, - 0x6007, 0x0047, 0x6003, 0x0001, 0x080c, 0x9547, 0x080c, 0x9ab1, - 0x0005, 0x080c, 0x3374, 0x1904, 0xdcfa, 0x2009, 0x0046, 0x080c, - 0xeed4, 0x080c, 0xb2d3, 0x0005, 0x2001, 0x1824, 0x2004, 0x9082, - 0x00e1, 0x1268, 0x080c, 0xddd5, 0x0904, 0xdcfa, 0x6007, 0x004e, - 0x6003, 0x0001, 0x080c, 0x9547, 0x080c, 0x9ab1, 0x0005, 0x6007, - 0x0012, 0x0cb0, 0x6007, 0x004f, 0x6017, 0x0000, 0x7134, 0x918c, - 0x00ff, 0x81ff, 0x0508, 0x9186, 0x0001, 0x1160, 0x7140, 0x2001, - 0x19be, 0x2004, 0x9106, 0x11b0, 0x7144, 0x2001, 0x19bf, 0x2004, - 0x9106, 0x0190, 0x9186, 0x0002, 0x1168, 0x2011, 0x0276, 0x20a9, - 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x000a, 0x080c, 0xc379, - 0x009e, 0x0110, 0x6017, 0x0001, 0x6003, 0x0001, 0x080c, 0x9547, - 0x080c, 0x9ab1, 0x0005, 0x6007, 0x0050, 0x703c, 0x6016, 0x0ca0, - 0x0016, 0x00e6, 0x2071, 0x0260, 0x00b6, 0x00c6, 0x2260, 0x6010, - 0x2058, 0xb8cc, 0xd084, 0x0150, 0x7128, 0x6044, 0x9106, 0x1120, - 0x712c, 0x6048, 0x9106, 0x0110, 0x9006, 0x0010, 0x9085, 0x0001, - 0x00ce, 0x00be, 0x00ee, 0x001e, 0x0005, 0x0016, 0x0096, 0x0086, - 0x00e6, 0x01c6, 0x01d6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, - 0x20e1, 0x0000, 0x2001, 0x19a1, 0x2003, 0x0000, 0x080c, 0x1027, - 0x05a0, 0x2900, 0x6016, 0x7090, 0x8004, 0xa816, 0x908a, 0x001e, - 0x02d0, 0xa833, 0x001e, 0x20a9, 0x001e, 0xa860, 0x20e8, 0xa85c, - 0x9080, 0x001b, 0x20a0, 0x2001, 0x19a1, 0x0016, 0x200c, 0x0471, - 0x001e, 0x81ff, 0x01b8, 0x2940, 0x080c, 0x1027, 0x01b0, 0x2900, - 0xa006, 0x2100, 0x0c18, 0xa832, 0x20a8, 0xa860, 0x20e8, 0xa85c, - 0x9080, 0x001b, 0x20a0, 0x2001, 0x19a1, 0x0016, 0x200c, 0x00b1, - 0x001e, 0x0000, 0x9085, 0x0001, 0x0048, 0x2071, 0x1800, 0x7093, - 0x0000, 0x6014, 0x2048, 0x080c, 0x0fc0, 0x9006, 0x012e, 0x01de, - 0x01ce, 0x00ee, 0x008e, 0x009e, 0x001e, 0x0005, 0x0006, 0x0016, - 0x0026, 0x0036, 0x00c6, 0x918c, 0xffff, 0x11b0, 0x080c, 0x23e2, - 0x2099, 0x026c, 0x2001, 0x0014, 0x3518, 0x9312, 0x0108, 0x1218, - 0x23a8, 0x4003, 0x0400, 0x20a8, 0x4003, 0x22a8, 0x8108, 0x080c, - 0x23e2, 0x2099, 0x0260, 0x0ca8, 0x080c, 0x23e2, 0x2061, 0x19a1, - 0x6004, 0x2098, 0x6008, 0x3518, 0x9312, 0x0108, 0x1218, 0x23a8, - 0x4003, 0x0048, 0x20a8, 0x4003, 0x22a8, 0x8108, 0x080c, 0x23e2, - 0x2099, 0x0260, 0x0ca8, 0x2061, 0x19a1, 0x2019, 0x0280, 0x3300, - 0x931e, 0x0110, 0x6006, 0x0020, 0x2001, 0x0260, 0x6006, 0x8108, - 0x2162, 0x9292, 0x0021, 0x9296, 0xffff, 0x620a, 0x00ce, 0x003e, - 0x002e, 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, - 0x00c6, 0x81ff, 0x11b8, 0x080c, 0x23fa, 0x20a1, 0x024c, 0x2001, - 0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0418, 0x20a8, - 0x4003, 0x82ff, 0x01f8, 0x22a8, 0x8108, 0x080c, 0x23fa, 0x20a1, - 0x0240, 0x0c98, 0x080c, 0x23fa, 0x2061, 0x19a4, 0x6004, 0x20a0, - 0x6008, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0058, 0x20a8, - 0x4003, 0x82ff, 0x0138, 0x22a8, 0x8108, 0x080c, 0x23fa, 0x20a1, - 0x0240, 0x0c98, 0x2061, 0x19a4, 0x2019, 0x0260, 0x3400, 0x931e, - 0x0110, 0x6006, 0x0020, 0x2001, 0x0240, 0x6006, 0x8108, 0x2162, - 0x9292, 0x0021, 0x9296, 0xffff, 0x620a, 0x00ce, 0x003e, 0x002e, - 0x001e, 0x000e, 0x0005, 0x00b6, 0x0066, 0x6610, 0x2658, 0xbe04, - 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0170, 0x9686, 0x0004, - 0x0158, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006, 0x0128, 0x9686, - 0x0004, 0x0110, 0x9085, 0x0001, 0x006e, 0x00be, 0x0005, 0x00d6, - 0x080c, 0xdf63, 0x00de, 0x0005, 0x00d6, 0x080c, 0xdf70, 0x1520, - 0x680c, 0x908c, 0xff00, 0x6820, 0x9084, 0x00ff, 0x9115, 0x6216, - 0x6824, 0x602e, 0xd1e4, 0x0130, 0x9006, 0x080c, 0xeff4, 0x2009, - 0x0001, 0x0078, 0xd1ec, 0x0180, 0x6920, 0x918c, 0x00ff, 0x6824, - 0x080c, 0x2873, 0x1148, 0x2001, 0x0001, 0x080c, 0xeff4, 0x2110, - 0x900e, 0x080c, 0x3299, 0x0018, 0x9085, 0x0001, 0x0008, 0x9006, - 0x00de, 0x0005, 0x00b6, 0x00c6, 0x080c, 0xb325, 0x05a8, 0x0016, - 0x0026, 0x00c6, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, - 0x2873, 0x1578, 0x080c, 0x66b9, 0x1560, 0xbe12, 0xbd16, 0x00ce, - 0x002e, 0x001e, 0x2b00, 0x6012, 0x080c, 0xee26, 0x11d8, 0x080c, - 0x3374, 0x11c0, 0x080c, 0xdecb, 0x0510, 0x2001, 0x0007, 0x080c, - 0x666a, 0x2001, 0x0007, 0x080c, 0x6696, 0x6017, 0x0000, 0x6023, - 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x9547, 0x080c, - 0x9ab1, 0x0010, 0x080c, 0xb2d3, 0x9085, 0x0001, 0x00ce, 0x00be, - 0x0005, 0x080c, 0xb2d3, 0x00ce, 0x002e, 0x001e, 0x0ca8, 0x080c, - 0xb2d3, 0x9006, 0x0c98, 0x2069, 0x026d, 0x6800, 0x9082, 0x0010, - 0x1228, 0x6017, 0x0000, 0x9085, 0x0001, 0x0008, 0x9006, 0x0005, - 0x6017, 0x0000, 0x2069, 0x026c, 0x6808, 0x9084, 0xff00, 0x9086, - 0x0800, 0x1190, 0x6904, 0x9186, 0x0018, 0x0118, 0x9186, 0x0014, - 0x1158, 0x810f, 0x6800, 0x9084, 0x00ff, 0x910d, 0x615a, 0x908e, - 0x0014, 0x0110, 0x908e, 0x0010, 0x0005, 0x6004, 0x90b2, 0x0053, - 0x1a0c, 0x0dc5, 0x91b6, 0x0013, 0x1130, 0x2008, 0x91b2, 0x0040, - 0x1a04, 0xe0d2, 0x040a, 0x91b6, 0x0027, 0x0198, 0x9186, 0x0015, - 0x0118, 0x9186, 0x0016, 0x1148, 0x080c, 0xd809, 0x0128, 0x6000, - 0x9086, 0x0002, 0x0904, 0xbcfd, 0x0005, 0x91b6, 0x0014, 0x190c, - 0x0dc5, 0x2001, 0x0007, 0x080c, 0x6696, 0x080c, 0x99a5, 0x080c, - 0xb306, 0x080c, 0x9ab1, 0x0005, 0xdffc, 0xdffe, 0xdffc, 0xdffc, - 0xdffc, 0xdffe, 0xe00d, 0xe0cb, 0xe051, 0xe0cb, 0xe079, 0xe0cb, - 0xe00d, 0xe0cb, 0xe0c3, 0xe0cb, 0xe0c3, 0xe0cb, 0xe0cb, 0xdffc, - 0xdffc, 0xdffc, 0xdffc, 0xdffc, 0xdffc, 0xdffc, 0xdffc, 0xdffc, - 0xdffc, 0xdffc, 0xdffe, 0xdffc, 0xe0cb, 0xdffc, 0xdffc, 0xe0cb, - 0xdffc, 0xe0c8, 0xe0cb, 0xdffc, 0xdffc, 0xdffc, 0xdffc, 0xe0cb, - 0xe0cb, 0xdffc, 0xe0cb, 0xe0cb, 0xdffc, 0xe008, 0xdffc, 0xdffc, - 0xdffc, 0xdffc, 0xe0c7, 0xe0cb, 0xdffc, 0xdffc, 0xe0cb, 0xe0cb, - 0xdffc, 0xdffc, 0xdffc, 0xdffc, 0x080c, 0x0dc5, 0x080c, 0x99a5, - 0x080c, 0xd7fb, 0x6003, 0x0002, 0x080c, 0x9ab1, 0x0804, 0xe0d1, - 0x9006, 0x080c, 0x6656, 0x0804, 0xe0cb, 0x080c, 0x6a9b, 0x1904, - 0xe0cb, 0x9006, 0x080c, 0x6656, 0x6010, 0x2058, 0xb810, 0x9086, - 0x00ff, 0x1140, 0x00f6, 0x2079, 0x1800, 0x78a8, 0x8000, 0x78aa, - 0x00fe, 0x00b8, 0x6010, 0x2058, 0xb8c0, 0x9005, 0x0904, 0xe0cb, - 0x080c, 0x33a5, 0x1904, 0xe0cb, 0x2001, 0x1800, 0x2004, 0x9086, - 0x0002, 0x1138, 0x00f6, 0x2079, 0x1800, 0x78a8, 0x8000, 0x78aa, - 0x00fe, 0x2001, 0x0002, 0x080c, 0x666a, 0x080c, 0x99a5, 0x6023, - 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x9547, 0x080c, - 0x9ab1, 0x6110, 0x2158, 0x2009, 0x0001, 0x080c, 0x884b, 0x0804, - 0xe0d1, 0x6610, 0x2658, 0xbe04, 0x96b4, 0xff00, 0x8637, 0x9686, - 0x0006, 0x0148, 0x9686, 0x0004, 0x0130, 0x080c, 0x9031, 0x2001, - 0x0004, 0x080c, 0x6696, 0x080c, 0xf043, 0x0904, 0xe0cb, 0x080c, - 0x99a5, 0x2001, 0x0004, 0x080c, 0x666a, 0x6023, 0x0001, 0x6003, - 0x0001, 0x6007, 0x0003, 0x080c, 0x9547, 0x080c, 0x9ab1, 0x0804, - 0xe0d1, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x1158, 0x0036, - 0x0046, 0x6010, 0x2058, 0xbba0, 0x2021, 0x0006, 0x080c, 0x4dfb, - 0x004e, 0x003e, 0x2001, 0x0006, 0x080c, 0xe0ef, 0x6610, 0x2658, - 0xbe04, 0x0066, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x006e, - 0x0180, 0x2001, 0x0006, 0x080c, 0x6696, 0x9284, 0x00ff, 0x908e, - 0x0007, 0x0118, 0x908e, 0x0004, 0x1120, 0x2001, 0x0006, 0x080c, - 0x666a, 0x080c, 0x6a9b, 0x11f8, 0x2001, 0x1837, 0x2004, 0xd0a4, - 0x01d0, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006, 0x01a0, 0x00f6, - 0x2079, 0x1800, 0x78a8, 0x8000, 0x78aa, 0x00fe, 0x0804, 0xe039, - 0x2001, 0x0004, 0x0030, 0x2001, 0x0006, 0x0449, 0x0020, 0x0018, - 0x0010, 0x080c, 0x6696, 0x080c, 0x99a5, 0x080c, 0xb2d3, 0x080c, - 0x9ab1, 0x0005, 0x2600, 0x0002, 0xe0e6, 0xe0e6, 0xe0e6, 0xe0e6, - 0xe0e6, 0xe0e8, 0xe0e6, 0xe0e8, 0xe0e6, 0xe0e6, 0xe0e8, 0xe0e6, - 0xe0e6, 0xe0e6, 0xe0e8, 0xe0e8, 0xe0e8, 0xe0e8, 0x080c, 0x0dc5, - 0x080c, 0x99a5, 0x080c, 0xb2d3, 0x080c, 0x9ab1, 0x0005, 0x0016, - 0x00b6, 0x00d6, 0x6110, 0x2158, 0xb900, 0xd184, 0x0138, 0x080c, - 0x666a, 0x9006, 0x080c, 0x6656, 0x080c, 0x3279, 0x00de, 0x00be, - 0x001e, 0x0005, 0x6610, 0x2658, 0xb804, 0x9084, 0xff00, 0x8007, - 0x90b2, 0x000c, 0x1a0c, 0x0dc5, 0x91b6, 0x0015, 0x1110, 0x003b, - 0x0028, 0x91b6, 0x0016, 0x190c, 0x0dc5, 0x006b, 0x0005, 0xbd9f, - 0xbd9f, 0xbd9f, 0xbd9f, 0xe184, 0xbd9f, 0xe16e, 0xe12f, 0xbd9f, - 0xbd9f, 0xbd9f, 0xbd9f, 0xbd9f, 0xbd9f, 0xbd9f, 0xbd9f, 0xe184, - 0xbd9f, 0xe16e, 0xe175, 0xbd9f, 0xbd9f, 0xbd9f, 0xbd9f, 0x00f6, - 0x080c, 0x6a9b, 0x11d8, 0x080c, 0xd7e3, 0x11c0, 0x6010, 0x905d, - 0x01a8, 0xb8c0, 0x9005, 0x0190, 0x9006, 0x080c, 0x6656, 0x2001, - 0x0002, 0x080c, 0x666a, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, - 0x0002, 0x080c, 0x9547, 0x080c, 0x9ab1, 0x00f0, 0x2011, 0x0263, - 0x2204, 0x8211, 0x220c, 0x080c, 0x2873, 0x11b0, 0x080c, 0x6724, - 0x0118, 0x080c, 0xb2d3, 0x0080, 0xb810, 0x0006, 0xb814, 0x0006, - 0xb8c0, 0x0006, 0x080c, 0x6148, 0x000e, 0xb8c2, 0x000e, 0xb816, - 0x000e, 0xb812, 0x080c, 0xb2d3, 0x00fe, 0x0005, 0x6604, 0x96b6, - 0x001e, 0x1110, 0x080c, 0xb2d3, 0x0005, 0x080c, 0xc1dc, 0x1148, - 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x9547, 0x080c, 0x9ab1, - 0x0010, 0x080c, 0xb2d3, 0x0005, 0x0804, 0xb2d3, 0x6004, 0x908a, - 0x0053, 0x1a0c, 0x0dc5, 0x080c, 0x99a5, 0x080c, 0xb306, 0x080c, - 0x9ab1, 0x0005, 0x9182, 0x0040, 0x0002, 0xe1a9, 0xe1a9, 0xe1a9, - 0xe1a9, 0xe1ab, 0xe1a9, 0xe1a9, 0xe1a9, 0xe1a9, 0xe1a9, 0xe1a9, - 0xe1a9, 0xe1a9, 0xe1a9, 0xe1a9, 0xe1a9, 0xe1a9, 0xe1a9, 0xe1a9, - 0xe1a9, 0x080c, 0x0dc5, 0x0096, 0x00b6, 0x00d6, 0x00e6, 0x00f6, - 0x0046, 0x0026, 0x6210, 0x2258, 0xb8bc, 0x9005, 0x11a8, 0x6106, - 0x2071, 0x0260, 0x7444, 0x94a4, 0xff00, 0x0904, 0xe211, 0x080c, - 0xefe8, 0x1170, 0x9486, 0x2000, 0x1158, 0x2009, 0x0001, 0x2011, - 0x0200, 0x080c, 0x8a50, 0x0020, 0x9026, 0x080c, 0xee6b, 0x0c38, - 0x080c, 0x100e, 0x090c, 0x0dc5, 0x6003, 0x0007, 0xa867, 0x010d, - 0x9006, 0xa802, 0xa86a, 0xac8a, 0x2c00, 0xa88e, 0x6008, 0xa8e2, - 0x6010, 0x2058, 0xb8a0, 0x7130, 0xa97a, 0x0016, 0xa876, 0xa87f, - 0x0000, 0xa883, 0x0000, 0xa887, 0x0036, 0x080c, 0x6e9f, 0x001e, - 0x080c, 0xefe8, 0x1904, 0xe271, 0x9486, 0x2000, 0x1130, 0x2019, - 0x0017, 0x080c, 0xeba1, 0x0804, 0xe271, 0x9486, 0x0200, 0x1120, - 0x080c, 0xeb38, 0x0804, 0xe271, 0x9486, 0x0400, 0x0120, 0x9486, - 0x1000, 0x1904, 0xe271, 0x2019, 0x0002, 0x080c, 0xeb53, 0x0804, - 0xe271, 0x2069, 0x1a74, 0x6a00, 0xd284, 0x0904, 0xe2db, 0x9284, - 0x0300, 0x1904, 0xe2d4, 0x6804, 0x9005, 0x0904, 0xe2bc, 0x2d78, - 0x6003, 0x0007, 0x080c, 0x1027, 0x0904, 0xe27d, 0x7800, 0xd08c, - 0x1118, 0x7804, 0x8001, 0x7806, 0x6017, 0x0000, 0x2001, 0x180f, - 0x2004, 0xd084, 0x1904, 0xe2df, 0x9006, 0xa802, 0xa867, 0x0116, - 0xa86a, 0x6008, 0xa8e2, 0x2c00, 0xa87a, 0x6010, 0x2058, 0xb8a0, - 0x7130, 0xa9b6, 0xa876, 0xb928, 0xa9ba, 0xb92c, 0xa9be, 0xb930, - 0xa9c2, 0xb934, 0xa9c6, 0xa883, 0x003d, 0x7044, 0x9084, 0x0003, - 0x9080, 0xe279, 0x2005, 0xa87e, 0x20a9, 0x000a, 0x2001, 0x0270, - 0xaa5c, 0x9290, 0x0021, 0x2009, 0x0205, 0x200b, 0x0080, 0x20e1, - 0x0000, 0xab60, 0x23e8, 0x2098, 0x22a0, 0x4003, 0x200b, 0x0000, - 0x2001, 0x027a, 0x200c, 0xa9b2, 0x8000, 0x200c, 0xa9ae, 0x080c, - 0x6e9f, 0x002e, 0x004e, 0x00fe, 0x00ee, 0x00de, 0x00be, 0x009e, - 0x0005, 0x0000, 0x0080, 0x0040, 0x0000, 0x2001, 0x1810, 0x2004, - 0xd084, 0x0120, 0x080c, 0x100e, 0x1904, 0xe226, 0x6017, 0xf100, - 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x94ff, 0x080c, 0x9ab1, - 0x0c00, 0x2069, 0x0260, 0x6848, 0x9084, 0xff00, 0x9086, 0x1200, - 0x1198, 0x686c, 0x9084, 0x00ff, 0x0016, 0x6114, 0x918c, 0xf700, - 0x910d, 0x6116, 0x001e, 0x6003, 0x0001, 0x6007, 0x0043, 0x080c, - 0x94ff, 0x080c, 0x9ab1, 0x0828, 0x6868, 0x602e, 0x686c, 0x6032, - 0x6017, 0xf200, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x94ff, - 0x080c, 0x9ab1, 0x0804, 0xe271, 0x2001, 0x180e, 0x2004, 0xd0ec, - 0x0120, 0x2011, 0x8049, 0x080c, 0x4c44, 0x6017, 0xf300, 0x0010, - 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x94ff, - 0x080c, 0x9ab1, 0x0804, 0xe271, 0x6017, 0xf500, 0x0c98, 0x6017, - 0xf600, 0x0804, 0xe291, 0x6017, 0xf200, 0x0804, 0xe291, 0xa867, - 0x0146, 0xa86b, 0x0000, 0x6008, 0xa886, 0x2c00, 0xa87a, 0x7044, - 0x9084, 0x0003, 0x9080, 0xe279, 0x2005, 0xa87e, 0x2928, 0x6010, - 0x2058, 0xb8a0, 0xa876, 0xb828, 0xa88a, 0xb82c, 0xa88e, 0xb830, - 0xa892, 0xb834, 0xa896, 0xa883, 0x003d, 0x2009, 0x0205, 0x2104, - 0x9085, 0x0080, 0x200a, 0x20e1, 0x0000, 0x2011, 0x0210, 0x2214, - 0x9294, 0x0fff, 0xaaa2, 0x9282, 0x0111, 0x1a0c, 0x0dc5, 0x8210, - 0x821c, 0x2001, 0x026c, 0x2098, 0xa860, 0x20e8, 0xa85c, 0x9080, - 0x0029, 0x20a0, 0x2011, 0xe35b, 0x2041, 0x0001, 0x223d, 0x9784, - 0x00ff, 0x9322, 0x1208, 0x2300, 0x20a8, 0x4003, 0x931a, 0x0530, - 0x8210, 0xd7fc, 0x1130, 0x8d68, 0x2d0a, 0x2001, 0x0260, 0x2098, - 0x0c68, 0x2950, 0x080c, 0x1027, 0x0170, 0x2900, 0xb002, 0xa867, - 0x0147, 0xa86b, 0x0000, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, - 0x20a0, 0x8840, 0x08d8, 0x2548, 0xa800, 0x902d, 0x0118, 0x080c, - 0x1040, 0x0cc8, 0x080c, 0x1040, 0x0804, 0xe27d, 0x2548, 0x8847, - 0x9885, 0x0046, 0xa866, 0x2009, 0x0205, 0x200b, 0x0000, 0x080c, - 0xebd4, 0x0804, 0xe271, 0x8010, 0x0004, 0x801a, 0x0006, 0x8018, - 0x0008, 0x8016, 0x000a, 0x8014, 0x9186, 0x0013, 0x1160, 0x6004, - 0x908a, 0x0054, 0x1a0c, 0x0dc5, 0x9082, 0x0040, 0x0a0c, 0x0dc5, - 0x2008, 0x0804, 0xe3ea, 0x9186, 0x0051, 0x0108, 0x0048, 0x080c, - 0xd809, 0x0500, 0x6000, 0x9086, 0x0002, 0x11e0, 0x0804, 0xe433, - 0x9186, 0x0027, 0x0190, 0x9186, 0x0048, 0x0128, 0x9186, 0x0014, - 0x0160, 0x190c, 0x0dc5, 0x080c, 0xd809, 0x0160, 0x6000, 0x9086, - 0x0004, 0x190c, 0x0dc5, 0x0804, 0xe516, 0x6004, 0x9082, 0x0040, - 0x2008, 0x001a, 0x080c, 0xb36d, 0x0005, 0xe3b1, 0xe3b3, 0xe3b3, - 0xe3da, 0xe3b1, 0xe3b1, 0xe3b1, 0xe3b1, 0xe3b1, 0xe3b1, 0xe3b1, - 0xe3b1, 0xe3b1, 0xe3b1, 0xe3b1, 0xe3b1, 0xe3b1, 0xe3b1, 0xe3b1, - 0xe3b1, 0x080c, 0x0dc5, 0x080c, 0x99a5, 0x080c, 0x9ab1, 0x0036, - 0x0096, 0x6014, 0x904d, 0x01d8, 0x080c, 0xd0d8, 0x01c0, 0x6003, - 0x0002, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1178, - 0x2019, 0x0004, 0x080c, 0xebd4, 0x6017, 0x0000, 0x6018, 0x9005, - 0x1120, 0x2001, 0x1987, 0x2004, 0x601a, 0x6003, 0x0007, 0x009e, - 0x003e, 0x0005, 0x0096, 0x080c, 0x99a5, 0x080c, 0x9ab1, 0x080c, - 0xd0d8, 0x0120, 0x6014, 0x2048, 0x080c, 0x1040, 0x080c, 0xb306, - 0x009e, 0x0005, 0x0002, 0xe3ff, 0xe416, 0xe401, 0xe42d, 0xe3ff, - 0xe3ff, 0xe3ff, 0xe3ff, 0xe3ff, 0xe3ff, 0xe3ff, 0xe3ff, 0xe3ff, - 0xe3ff, 0xe3ff, 0xe3ff, 0xe3ff, 0xe3ff, 0xe3ff, 0xe3ff, 0x080c, - 0x0dc5, 0x0096, 0x080c, 0x99a5, 0x6014, 0x2048, 0xa87c, 0xd0b4, - 0x0138, 0x6003, 0x0007, 0x2009, 0x0043, 0x080c, 0xb352, 0x0010, - 0x6003, 0x0004, 0x080c, 0x9ab1, 0x009e, 0x0005, 0x080c, 0x99a5, - 0x080c, 0xd0d8, 0x0138, 0x6114, 0x0096, 0x2148, 0xa97c, 0x009e, - 0xd1ec, 0x1138, 0x080c, 0x8a25, 0x080c, 0xb2d3, 0x080c, 0x9ab1, - 0x0005, 0x080c, 0xee2f, 0x0db0, 0x0cc8, 0x080c, 0x99a5, 0x2009, - 0x0041, 0x0804, 0xe59e, 0x9182, 0x0040, 0x0002, 0xe44a, 0xe44c, - 0xe44a, 0xe44a, 0xe44a, 0xe44a, 0xe44a, 0xe44a, 0xe44a, 0xe44a, - 0xe44a, 0xe44a, 0xe44a, 0xe44a, 0xe44a, 0xe44a, 0xe44a, 0xe44d, - 0xe44a, 0xe44a, 0x080c, 0x0dc5, 0x0005, 0x00d6, 0x080c, 0x8a25, - 0x00de, 0x080c, 0xee87, 0x080c, 0xb2d3, 0x0005, 0x9182, 0x0040, - 0x0002, 0xe46d, 0xe46d, 0xe46d, 0xe46d, 0xe46d, 0xe46d, 0xe46d, - 0xe46d, 0xe46d, 0xe46f, 0xe4de, 0xe46d, 0xe46d, 0xe46d, 0xe46d, - 0xe4de, 0xe46d, 0xe46d, 0xe46d, 0xe46d, 0x080c, 0x0dc5, 0x2001, - 0x0105, 0x2004, 0x9084, 0x1800, 0x01c8, 0x2001, 0x0132, 0x200c, - 0x2001, 0x0131, 0x2004, 0x9105, 0x1904, 0xe4de, 0x2009, 0x180c, - 0x2104, 0xd0d4, 0x0904, 0xe4de, 0xc0d4, 0x200a, 0x2009, 0x0105, - 0x2104, 0x9084, 0xe7fd, 0x9085, 0x0010, 0x200a, 0x2001, 0x1867, - 0x2004, 0xd0e4, 0x1528, 0x603b, 0x0000, 0x080c, 0x9a61, 0x6014, - 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x0188, 0x908c, 0x0003, 0x918e, - 0x0002, 0x0508, 0x2001, 0x180c, 0x2004, 0xd0d4, 0x11e0, 0x080c, - 0x9bd3, 0x2009, 0x0041, 0x009e, 0x0804, 0xe59e, 0x080c, 0x9bd3, - 0x6003, 0x0007, 0x601b, 0x0000, 0x080c, 0x8a25, 0x009e, 0x0005, - 0x2001, 0x0100, 0x2004, 0x9082, 0x0005, 0x0aa8, 0x2001, 0x011f, - 0x2004, 0x603a, 0x0890, 0x2001, 0x180c, 0x200c, 0xc1d4, 0x2102, - 0xd1cc, 0x0110, 0x080c, 0x2c7b, 0x080c, 0x9bd3, 0x6014, 0x2048, - 0xa97c, 0xd1ec, 0x1130, 0x080c, 0x8a25, 0x080c, 0xb2d3, 0x009e, - 0x0005, 0x080c, 0xee2f, 0x0db8, 0x009e, 0x0005, 0x2001, 0x180c, - 0x200c, 0xc1d4, 0x2102, 0x0036, 0x080c, 0x9a61, 0x080c, 0x9bd3, - 0x6014, 0x0096, 0x2048, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, - 0xd0bc, 0x0188, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, 0x0140, - 0xa8ac, 0x6330, 0x931a, 0x6332, 0xa8b0, 0x632c, 0x931b, 0x632e, - 0x6003, 0x0002, 0x0080, 0x2019, 0x0004, 0x080c, 0xebd4, 0x6018, - 0x9005, 0x1128, 0x2001, 0x1987, 0x2004, 0x8003, 0x601a, 0x6017, - 0x0000, 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x9182, 0x0040, - 0x0002, 0xe52d, 0xe52d, 0xe52d, 0xe52d, 0xe52d, 0xe52d, 0xe52d, - 0xe52d, 0xe52f, 0xe52d, 0xe52d, 0xe52d, 0xe52d, 0xe52d, 0xe52d, - 0xe52d, 0xe52d, 0xe52d, 0xe52d, 0xe57a, 0x080c, 0x0dc5, 0x6014, - 0x0096, 0x2048, 0xa834, 0xaa38, 0x6110, 0x00b6, 0x2158, 0xb900, - 0x00be, 0xd1bc, 0x1190, 0x920d, 0x1518, 0xa87c, 0xd0fc, 0x0128, - 0x2009, 0x0041, 0x009e, 0x0804, 0xe59e, 0x6003, 0x0007, 0x601b, - 0x0000, 0x080c, 0x8a25, 0x009e, 0x0005, 0x6124, 0xd1f4, 0x1d58, - 0x0006, 0x0046, 0xacac, 0x9422, 0xa9b0, 0x2200, 0x910b, 0x6030, - 0x9420, 0x6432, 0x602c, 0x9109, 0x612e, 0x004e, 0x000e, 0x08d8, - 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1bc, 0x1178, 0x2009, - 0x180e, 0x210c, 0xd19c, 0x0118, 0x6003, 0x0007, 0x0010, 0x6003, - 0x0006, 0x00e9, 0x080c, 0x8a27, 0x009e, 0x0005, 0x6003, 0x0002, - 0x009e, 0x0005, 0x6024, 0xd0f4, 0x0128, 0x080c, 0x1608, 0x1904, - 0xe52f, 0x0005, 0x6014, 0x0096, 0x2048, 0xa834, 0xa938, 0x009e, - 0x9105, 0x1120, 0x080c, 0x1608, 0x1904, 0xe52f, 0x0005, 0xd2fc, - 0x0140, 0x8002, 0x8000, 0x8212, 0x9291, 0x0000, 0x2009, 0x0009, - 0x0010, 0x2009, 0x0015, 0xaa9a, 0xa896, 0x0005, 0x9182, 0x0040, - 0x0208, 0x0062, 0x9186, 0x0013, 0x0120, 0x9186, 0x0014, 0x190c, - 0x0dc5, 0x6024, 0xd0dc, 0x090c, 0x0dc5, 0x0005, 0xe5c2, 0xe5ce, - 0xe5da, 0xe5e6, 0xe5c2, 0xe5c2, 0xe5c2, 0xe5c2, 0xe5c9, 0xe5c4, - 0xe5c4, 0xe5c2, 0xe5c2, 0xe5c2, 0xe5c2, 0xe5c4, 0xe5c2, 0xe5c4, - 0xe5c2, 0xe5c9, 0x080c, 0x0dc5, 0x6024, 0xd0dc, 0x090c, 0x0dc5, - 0x0005, 0x6014, 0x9005, 0x190c, 0x0dc5, 0x0005, 0x6003, 0x0001, - 0x6106, 0x080c, 0x94ff, 0x0126, 0x2091, 0x8000, 0x080c, 0x9ab1, - 0x012e, 0x0005, 0x6003, 0x0001, 0x6106, 0x080c, 0x94ff, 0x0126, - 0x2091, 0x8000, 0x080c, 0x9ab1, 0x012e, 0x0005, 0x6003, 0x0003, - 0x6106, 0x2c10, 0x080c, 0x1be0, 0x0126, 0x2091, 0x8000, 0x080c, - 0x9564, 0x080c, 0x9bd3, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, - 0x0036, 0x0096, 0x9182, 0x0040, 0x0023, 0x009e, 0x003e, 0x012e, - 0x0005, 0xe615, 0xe617, 0xe629, 0xe643, 0xe615, 0xe615, 0xe615, - 0xe615, 0xe615, 0xe615, 0xe615, 0xe615, 0xe615, 0xe615, 0xe615, - 0xe615, 0xe615, 0xe615, 0xe615, 0xe615, 0x080c, 0x0dc5, 0x6014, - 0x2048, 0xa87c, 0xd0fc, 0x01f8, 0x909c, 0x0003, 0x939e, 0x0003, - 0x01d0, 0x6003, 0x0001, 0x6106, 0x080c, 0x94ff, 0x080c, 0x9ab1, - 0x0470, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0168, 0x909c, 0x0003, - 0x939e, 0x0003, 0x0140, 0x6003, 0x0001, 0x6106, 0x080c, 0x94ff, - 0x080c, 0x9ab1, 0x00e0, 0x901e, 0x6316, 0x631a, 0x2019, 0x0004, - 0x080c, 0xebd4, 0x00a0, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0d98, - 0x909c, 0x0003, 0x939e, 0x0003, 0x0d70, 0x6003, 0x0003, 0x6106, - 0x2c10, 0x080c, 0x1be0, 0x080c, 0x9564, 0x080c, 0x9bd3, 0x0005, - 0x080c, 0x99a5, 0x6114, 0x81ff, 0x0158, 0x0096, 0x2148, 0x080c, - 0xef85, 0x0036, 0x2019, 0x0029, 0x080c, 0xebd4, 0x003e, 0x009e, - 0x080c, 0xb306, 0x080c, 0x9ab1, 0x0005, 0x080c, 0x9a61, 0x6114, - 0x81ff, 0x0158, 0x0096, 0x2148, 0x080c, 0xef85, 0x0036, 0x2019, - 0x0029, 0x080c, 0xebd4, 0x003e, 0x009e, 0x080c, 0xb306, 0x080c, - 0x9bd3, 0x0005, 0x9182, 0x0085, 0x0002, 0xe694, 0xe692, 0xe692, - 0xe6a0, 0xe692, 0xe692, 0xe692, 0xe692, 0xe692, 0xe692, 0xe692, - 0xe692, 0xe692, 0x080c, 0x0dc5, 0x6003, 0x000b, 0x6106, 0x080c, - 0x94ff, 0x0126, 0x2091, 0x8000, 0x080c, 0x9ab1, 0x012e, 0x0005, - 0x0026, 0x00e6, 0x080c, 0xee26, 0x0118, 0x080c, 0xb2d3, 0x0450, - 0x2071, 0x0260, 0x7224, 0x6216, 0x2001, 0x180e, 0x2004, 0xd0e4, - 0x0150, 0x6010, 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x2011, - 0x014e, 0x080c, 0xb5f5, 0x7220, 0x080c, 0xea29, 0x0118, 0x6007, - 0x0086, 0x0040, 0x6007, 0x0087, 0x7224, 0x9296, 0xffff, 0x1110, - 0x6007, 0x0086, 0x6003, 0x0001, 0x080c, 0x94ff, 0x080c, 0x9ab1, - 0x080c, 0x9bd3, 0x00ee, 0x002e, 0x0005, 0x9186, 0x0013, 0x1160, - 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0dc5, 0x908a, 0x0092, 0x1a0c, - 0x0dc5, 0x9082, 0x0085, 0x00a2, 0x9186, 0x0027, 0x0130, 0x9186, - 0x0014, 0x0118, 0x080c, 0xb36d, 0x0050, 0x2001, 0x0007, 0x080c, - 0x6696, 0x080c, 0x99a5, 0x080c, 0xb306, 0x080c, 0x9ab1, 0x0005, - 0xe705, 0xe707, 0xe707, 0xe705, 0xe705, 0xe705, 0xe705, 0xe705, - 0xe705, 0xe705, 0xe705, 0xe705, 0xe705, 0x080c, 0x0dc5, 0x080c, - 0x99a5, 0x080c, 0xb306, 0x080c, 0x9ab1, 0x0005, 0x9182, 0x0085, - 0x0a0c, 0x0dc5, 0x9182, 0x0092, 0x1a0c, 0x0dc5, 0x9182, 0x0085, - 0x0002, 0xe726, 0xe726, 0xe726, 0xe728, 0xe726, 0xe726, 0xe726, - 0xe726, 0xe726, 0xe726, 0xe726, 0xe726, 0xe726, 0x080c, 0x0dc5, - 0x0005, 0x9186, 0x0013, 0x0148, 0x9186, 0x0014, 0x0130, 0x9186, - 0x0027, 0x0118, 0x080c, 0xb36d, 0x0030, 0x080c, 0x99a5, 0x080c, - 0xb306, 0x080c, 0x9ab1, 0x0005, 0x0036, 0x080c, 0xee87, 0x6043, - 0x0000, 0x2019, 0x000b, 0x0011, 0x003e, 0x0005, 0x6010, 0x0006, - 0x0059, 0x000e, 0x6012, 0x6023, 0x0006, 0x6003, 0x0007, 0x601b, - 0x0000, 0x6043, 0x0000, 0x0005, 0x0126, 0x0036, 0x2091, 0x8000, - 0x0086, 0x2c40, 0x0096, 0x904e, 0x080c, 0xaafb, 0x009e, 0x008e, - 0x1550, 0x0076, 0x2c38, 0x080c, 0xaba6, 0x007e, 0x1520, 0x6000, - 0x9086, 0x0000, 0x0500, 0x6020, 0x9086, 0x0007, 0x01e0, 0x0096, - 0x601c, 0xd084, 0x0140, 0x080c, 0xee87, 0x080c, 0xd7fb, 0x080c, - 0x1a8e, 0x6023, 0x0007, 0x6014, 0x2048, 0x080c, 0xd0d8, 0x0110, - 0x080c, 0xebd4, 0x009e, 0x6017, 0x0000, 0x080c, 0xee87, 0x6023, - 0x0007, 0x080c, 0xd7fb, 0x003e, 0x012e, 0x0005, 0x00f6, 0x00c6, - 0x00b6, 0x0036, 0x0156, 0x2079, 0x0260, 0x7938, 0x783c, 0x080c, - 0x2873, 0x1904, 0xe7e4, 0x0016, 0x00c6, 0x080c, 0x6724, 0x1904, - 0xe7e2, 0x001e, 0x00c6, 0x080c, 0xd7e3, 0x1130, 0xb8c0, 0x9005, - 0x0118, 0x080c, 0x33a5, 0x0148, 0x2b10, 0x2160, 0x6010, 0x0006, - 0x6212, 0x080c, 0xd7ea, 0x000e, 0x6012, 0x00ce, 0x002e, 0x0026, - 0x0016, 0x2019, 0x0029, 0x080c, 0xac6c, 0x080c, 0x96a4, 0x0076, - 0x903e, 0x080c, 0x9577, 0x007e, 0x001e, 0x0076, 0x903e, 0x080c, - 0xe91c, 0x007e, 0x0026, 0xba04, 0x9294, 0xff00, 0x8217, 0x9286, - 0x0006, 0x0118, 0x9286, 0x0004, 0x1118, 0xbaa0, 0x080c, 0x330e, - 0x002e, 0xbcc0, 0x001e, 0x080c, 0x6148, 0xbe12, 0xbd16, 0xbcc2, - 0x9006, 0x0010, 0x00ce, 0x001e, 0x015e, 0x003e, 0x00be, 0x00ce, - 0x00fe, 0x0005, 0x00c6, 0x00d6, 0x00b6, 0x0016, 0x2009, 0x1824, - 0x2104, 0x9086, 0x0074, 0x1904, 0xe843, 0x2069, 0x0260, 0x6944, - 0x9182, 0x0100, 0x06e0, 0x6940, 0x9184, 0x8000, 0x0904, 0xe840, - 0x2001, 0x197c, 0x2004, 0x9005, 0x1140, 0x6010, 0x2058, 0xb8c0, - 0x9005, 0x0118, 0x9184, 0x0800, 0x0598, 0x6948, 0x918a, 0x0001, - 0x0648, 0x080c, 0xefed, 0x0118, 0x6978, 0xd1fc, 0x11b8, 0x2009, - 0x0205, 0x200b, 0x0001, 0x693c, 0x81ff, 0x1198, 0x6944, 0x9182, - 0x0100, 0x02a8, 0x6940, 0x81ff, 0x1178, 0x6948, 0x918a, 0x0001, - 0x0288, 0x6950, 0x918a, 0x0001, 0x0298, 0x00d0, 0x6017, 0x0100, - 0x00a0, 0x6017, 0x0300, 0x0088, 0x6017, 0x0500, 0x0070, 0x6017, - 0x0700, 0x0058, 0x6017, 0x0900, 0x0040, 0x6017, 0x0b00, 0x0028, - 0x6017, 0x0f00, 0x0010, 0x6017, 0x2d00, 0x9085, 0x0001, 0x0008, - 0x9006, 0x001e, 0x00be, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00b6, - 0x0026, 0x0036, 0x0156, 0x6210, 0x2258, 0xbb04, 0x9394, 0x00ff, - 0x9286, 0x0006, 0x0180, 0x9286, 0x0004, 0x0168, 0x9394, 0xff00, - 0x8217, 0x9286, 0x0006, 0x0138, 0x9286, 0x0004, 0x0120, 0x080c, - 0x6733, 0x0804, 0xe8ab, 0x2011, 0x0276, 0x20a9, 0x0004, 0x0096, - 0x2b48, 0x2019, 0x000a, 0x080c, 0xc379, 0x009e, 0x15a8, 0x2011, - 0x027a, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, - 0xc379, 0x009e, 0x1548, 0x0046, 0x0016, 0xbaa0, 0x2220, 0x9006, - 0x2009, 0x1848, 0x210c, 0xd1a4, 0x0138, 0x2009, 0x0029, 0x080c, - 0xec31, 0xb800, 0xc0e5, 0xb802, 0x2019, 0x0029, 0x080c, 0x96a4, - 0x0076, 0x2039, 0x0000, 0x080c, 0x9577, 0x2c08, 0x080c, 0xe91c, - 0x007e, 0x2001, 0x0007, 0x080c, 0x6696, 0x2001, 0x0007, 0x080c, - 0x666a, 0x001e, 0x004e, 0x9006, 0x015e, 0x003e, 0x002e, 0x00be, - 0x00ce, 0x0005, 0x00d6, 0x2069, 0x026e, 0x6800, 0x9086, 0x0800, - 0x0118, 0x6017, 0x0000, 0x0008, 0x9006, 0x00de, 0x0005, 0x00b6, - 0x00f6, 0x0016, 0x0026, 0x0036, 0x0156, 0x2079, 0x026c, 0x7930, - 0x7834, 0x080c, 0x2873, 0x11d0, 0x080c, 0x6724, 0x11b8, 0x2011, - 0x0270, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, - 0xc379, 0x009e, 0x1158, 0x2011, 0x0274, 0x20a9, 0x0004, 0x0096, - 0x2b48, 0x2019, 0x0006, 0x080c, 0xc379, 0x009e, 0x015e, 0x003e, - 0x002e, 0x001e, 0x00fe, 0x00be, 0x0005, 0x00b6, 0x0006, 0x0016, - 0x0026, 0x0036, 0x0156, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, - 0x080c, 0x2873, 0x11d0, 0x080c, 0x6724, 0x11b8, 0x2011, 0x0276, - 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xc379, - 0x009e, 0x1158, 0x2011, 0x027a, 0x20a9, 0x0004, 0x0096, 0x2b48, - 0x2019, 0x0006, 0x080c, 0xc379, 0x009e, 0x015e, 0x003e, 0x002e, - 0x001e, 0x000e, 0x00be, 0x0005, 0x00e6, 0x00c6, 0x0086, 0x0076, - 0x0066, 0x0056, 0x0046, 0x0026, 0x0126, 0x2091, 0x8000, 0x2740, - 0x2029, 0x19f1, 0x252c, 0x2021, 0x19f7, 0x2424, 0x2061, 0x1cd0, - 0x2071, 0x1800, 0x7654, 0x7074, 0x81ff, 0x0150, 0x0006, 0x9186, - 0x1ab7, 0x000e, 0x0128, 0x8001, 0x9602, 0x1a04, 0xe9ba, 0x0018, - 0x9606, 0x0904, 0xe9ba, 0x080c, 0x8cf7, 0x0904, 0xe9b1, 0x2100, - 0x9c06, 0x0904, 0xe9b1, 0x6720, 0x9786, 0x0007, 0x0904, 0xe9b1, - 0x080c, 0xec72, 0x1904, 0xe9b1, 0x080c, 0xf00b, 0x0904, 0xe9b1, - 0x080c, 0xec62, 0x0904, 0xe9b1, 0x6720, 0x9786, 0x0001, 0x1148, - 0x080c, 0x33a5, 0x0904, 0xe9f9, 0x6004, 0x9086, 0x0000, 0x1904, - 0xe9f9, 0x9786, 0x0004, 0x0904, 0xe9f9, 0x2500, 0x9c06, 0x0904, - 0xe9b1, 0x2400, 0x9c06, 0x05e8, 0x88ff, 0x0118, 0x6054, 0x9906, - 0x15c0, 0x0096, 0x6000, 0x9086, 0x0004, 0x1120, 0x0016, 0x080c, - 0x1a8e, 0x001e, 0x9786, 0x000a, 0x0148, 0x080c, 0xd2e0, 0x1130, - 0x080c, 0xbcb6, 0x009e, 0x080c, 0xb306, 0x0418, 0x6014, 0x2048, - 0x080c, 0xd0d8, 0x01d8, 0x9786, 0x0003, 0x1570, 0xa867, 0x0103, - 0xa87c, 0xd0cc, 0x0130, 0x0096, 0xa878, 0x2048, 0x080c, 0x0fc0, - 0x009e, 0xab7a, 0xa877, 0x0000, 0x080c, 0xef85, 0x0016, 0x080c, - 0xd3ce, 0x080c, 0x6e92, 0x001e, 0x080c, 0xd2c3, 0x009e, 0x080c, - 0xb306, 0x9ce0, 0x0018, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1210, - 0x0804, 0xe930, 0x012e, 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, - 0x008e, 0x00ce, 0x00ee, 0x0005, 0x9786, 0x0006, 0x1150, 0x9386, - 0x0005, 0x0128, 0x080c, 0xef85, 0x080c, 0xebd4, 0x08f8, 0x009e, - 0x0c00, 0x9786, 0x0009, 0x11f8, 0x6000, 0x9086, 0x0004, 0x01c0, - 0x6000, 0x9086, 0x0003, 0x11a0, 0x080c, 0x9a61, 0x0096, 0x6114, - 0x2148, 0x080c, 0xd0d8, 0x0118, 0x6010, 0x080c, 0x6e9f, 0x009e, - 0x00c6, 0x080c, 0xb2d3, 0x00ce, 0x0036, 0x080c, 0x9bd3, 0x003e, - 0x009e, 0x0804, 0xe9b1, 0x9786, 0x000a, 0x0904, 0xe9a1, 0x0804, - 0xe996, 0x81ff, 0x0904, 0xe9b1, 0x9180, 0x0001, 0x2004, 0x9086, - 0x0018, 0x0138, 0x9180, 0x0001, 0x2004, 0x9086, 0x002d, 0x1904, - 0xe9b1, 0x6000, 0x9086, 0x0002, 0x1904, 0xe9b1, 0x080c, 0xd2cf, - 0x0138, 0x080c, 0xd2e0, 0x1904, 0xe9b1, 0x080c, 0xbcb6, 0x0038, - 0x080c, 0x3279, 0x080c, 0xd2e0, 0x1110, 0x080c, 0xbcb6, 0x080c, - 0xb306, 0x0804, 0xe9b1, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, - 0x0005, 0x00c6, 0x00e6, 0x0016, 0x2c08, 0x2170, 0x9006, 0x080c, - 0xebfb, 0x001e, 0x0120, 0x6020, 0x9084, 0x000f, 0x001b, 0x00ee, - 0x00ce, 0x0005, 0xea48, 0xea48, 0xea48, 0xea48, 0xea48, 0xea48, - 0xea4a, 0xea48, 0xea48, 0xea48, 0xea73, 0xb306, 0xb306, 0xea48, - 0x9006, 0x0005, 0x0036, 0x0046, 0x0016, 0x7010, 0x00b6, 0x2058, - 0xbca0, 0x00be, 0x2c00, 0x2009, 0x0020, 0x080c, 0xec31, 0x001e, - 0x004e, 0x2019, 0x0002, 0x080c, 0xe754, 0x003e, 0x9085, 0x0001, - 0x0005, 0x0096, 0x080c, 0xd0d8, 0x0140, 0x6014, 0x904d, 0x080c, - 0xccf3, 0x687b, 0x0005, 0x080c, 0x6e9f, 0x009e, 0x080c, 0xb306, - 0x9085, 0x0001, 0x0005, 0x0019, 0x9085, 0x0001, 0x0005, 0x6000, - 0x908a, 0x0010, 0x1a0c, 0x0dc5, 0x000b, 0x0005, 0xea8e, 0xea8e, - 0xeaa5, 0xea95, 0xeab4, 0xea8e, 0xea8e, 0xea90, 0xea8e, 0xea8e, - 0xea8e, 0xea8e, 0xea8e, 0xea8e, 0xea8e, 0xea8e, 0x080c, 0x0dc5, - 0x080c, 0xb306, 0x9085, 0x0001, 0x0005, 0x0036, 0x00e6, 0x2071, - 0x19e8, 0x703c, 0x9c06, 0x1128, 0x2019, 0x0001, 0x080c, 0xaa49, - 0x0010, 0x080c, 0xac2b, 0x00ee, 0x003e, 0x0096, 0x00d6, 0x6014, - 0x2048, 0xa87b, 0x0005, 0x080c, 0x6e9f, 0x080c, 0xb306, 0x00de, - 0x009e, 0x9085, 0x0001, 0x0005, 0x601c, 0xd084, 0x190c, 0x1a8e, - 0x0c60, 0x2001, 0x0001, 0x080c, 0x6656, 0x0156, 0x0016, 0x0026, - 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x0276, 0x080c, - 0xc365, 0x003e, 0x002e, 0x001e, 0x015e, 0x9005, 0x0005, 0x00f6, - 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x00b6, 0x0126, 0x2091, - 0x8000, 0x2740, 0x2061, 0x1cd0, 0x2079, 0x0001, 0x8fff, 0x0904, - 0xeb2b, 0x2071, 0x1800, 0x7654, 0x7074, 0x8001, 0x9602, 0x1a04, - 0xeb2b, 0x88ff, 0x0120, 0x2800, 0x9c06, 0x15a0, 0x2078, 0x080c, - 0xec62, 0x0580, 0x2400, 0x9c06, 0x0568, 0x6720, 0x9786, 0x0006, - 0x1548, 0x9786, 0x0007, 0x0530, 0x88ff, 0x1150, 0xd58c, 0x1118, - 0x6010, 0x9b06, 0x11f8, 0xd584, 0x0118, 0x6054, 0x9106, 0x11d0, - 0x0096, 0x601c, 0xd084, 0x0140, 0x080c, 0xee87, 0x080c, 0xd7fb, - 0x080c, 0x1a8e, 0x6023, 0x0007, 0x6014, 0x2048, 0x080c, 0xd0d8, - 0x0120, 0x0046, 0x080c, 0xebd4, 0x004e, 0x009e, 0x080c, 0xb306, - 0x88ff, 0x1198, 0x9ce0, 0x0018, 0x2001, 0x181a, 0x2004, 0x9c02, - 0x1210, 0x0804, 0xeade, 0x9006, 0x012e, 0x00be, 0x006e, 0x007e, - 0x008e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x98c5, 0x0001, 0x0ca0, - 0x00b6, 0x0076, 0x0056, 0x0086, 0x9046, 0x2029, 0x0001, 0x2c20, - 0x2019, 0x0002, 0x6210, 0x2258, 0x0096, 0x904e, 0x080c, 0xaafb, - 0x009e, 0x008e, 0x903e, 0x080c, 0xaba6, 0x080c, 0xeacf, 0x005e, - 0x007e, 0x00be, 0x0005, 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, - 0x0156, 0x2c20, 0x2128, 0x20a9, 0x007f, 0x900e, 0x0016, 0x0036, - 0x080c, 0x6724, 0x1180, 0x0056, 0x0086, 0x9046, 0x2508, 0x2029, - 0x0001, 0x0096, 0x904e, 0x080c, 0xaafb, 0x009e, 0x008e, 0x903e, - 0x080c, 0xaba6, 0x005e, 0x003e, 0x001e, 0x8108, 0x1f04, 0xeb5e, - 0x0036, 0x2508, 0x2029, 0x0003, 0x080c, 0xeacf, 0x003e, 0x015e, - 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, 0x0005, 0x00b6, 0x0076, - 0x0056, 0x6210, 0x2258, 0x0086, 0x9046, 0x2029, 0x0001, 0x2019, - 0x0048, 0x0096, 0x904e, 0x080c, 0xaafb, 0x009e, 0x008e, 0x903e, - 0x080c, 0xaba6, 0x2c20, 0x080c, 0xeacf, 0x005e, 0x007e, 0x00be, - 0x0005, 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, - 0x20a9, 0x0800, 0x900e, 0x0016, 0x0036, 0x080c, 0x6724, 0x1190, - 0x0086, 0x9046, 0x2828, 0x0046, 0x2021, 0x0001, 0x080c, 0xee6b, - 0x004e, 0x0096, 0x904e, 0x080c, 0xaafb, 0x009e, 0x008e, 0x903e, - 0x080c, 0xaba6, 0x003e, 0x001e, 0x8108, 0x1f04, 0xebab, 0x0036, - 0x2029, 0x0002, 0x080c, 0xeacf, 0x003e, 0x015e, 0x00ce, 0x007e, - 0x005e, 0x004e, 0x00be, 0x0005, 0x0016, 0x00f6, 0x080c, 0xd0d6, - 0x0198, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0046, 0x0180, 0xa800, - 0x907d, 0x0138, 0xa803, 0x0000, 0xab82, 0x080c, 0x6e9f, 0x2f48, - 0x0cb0, 0xab82, 0x080c, 0x6e9f, 0x00fe, 0x001e, 0x0005, 0xa800, - 0x907d, 0x0130, 0xa803, 0x0000, 0x080c, 0x6e9f, 0x2f48, 0x0cb8, - 0x080c, 0x6e9f, 0x0c88, 0x00e6, 0x0046, 0x0036, 0x2061, 0x1cd0, - 0x9005, 0x1138, 0x2071, 0x1800, 0x7454, 0x7074, 0x8001, 0x9402, - 0x12f8, 0x2100, 0x9c06, 0x0188, 0x6000, 0x9086, 0x0000, 0x0168, - 0x6008, 0x9206, 0x1150, 0x6320, 0x9386, 0x0009, 0x01b0, 0x6010, - 0x91a0, 0x0004, 0x2424, 0x9406, 0x0140, 0x9ce0, 0x0018, 0x2001, - 0x181a, 0x2004, 0x9c02, 0x1220, 0x0c20, 0x9085, 0x0001, 0x0008, - 0x9006, 0x003e, 0x004e, 0x00ee, 0x0005, 0x631c, 0xd3c4, 0x1d68, - 0x0c30, 0x0096, 0x0006, 0x080c, 0x100e, 0x000e, 0x090c, 0x0dc5, - 0xaae2, 0xa867, 0x010d, 0xa88e, 0x0026, 0x2010, 0x080c, 0xd0c6, - 0x2001, 0x0000, 0x0120, 0x2200, 0x9080, 0x0015, 0x2004, 0x002e, - 0xa87a, 0x9186, 0x0020, 0x0110, 0xa8e3, 0xffff, 0xa986, 0xac76, - 0xa87f, 0x0000, 0x2001, 0x198e, 0x2004, 0xa882, 0x9006, 0xa802, - 0xa86a, 0xa88a, 0x0126, 0x2091, 0x8000, 0x080c, 0x6e9f, 0x012e, - 0x009e, 0x0005, 0x6700, 0x9786, 0x0000, 0x0158, 0x9786, 0x0001, - 0x0140, 0x9786, 0x000a, 0x0128, 0x9786, 0x0009, 0x0110, 0x9085, - 0x0001, 0x0005, 0x00e6, 0x6010, 0x9075, 0x0138, 0x00b6, 0x2058, - 0xb8a0, 0x00be, 0x9206, 0x00ee, 0x0005, 0x9085, 0x0001, 0x0cd8, - 0x0016, 0x6004, 0x908e, 0x001e, 0x11a0, 0x8007, 0x6134, 0x918c, - 0x00ff, 0x9105, 0x6036, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, - 0x0005, 0x2001, 0x1987, 0x2004, 0x601a, 0x080c, 0x94ff, 0x080c, - 0x9ab1, 0x001e, 0x0005, 0xa001, 0xa001, 0x0005, 0x6024, 0xd0e4, - 0x0158, 0xd0cc, 0x0118, 0x080c, 0xd412, 0x0030, 0x080c, 0xee87, - 0x080c, 0x8a25, 0x080c, 0xb2d3, 0x0005, 0x9280, 0x0008, 0x2004, - 0x9084, 0x000f, 0x0002, 0xecc1, 0xecc1, 0xecc1, 0xecc3, 0xecc1, - 0xecc3, 0xecc3, 0xecc1, 0xecc3, 0xecc1, 0xecc1, 0xecc1, 0xecc1, - 0xecc1, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, 0x9280, 0x0008, - 0x2004, 0x9084, 0x000f, 0x0002, 0xecda, 0xecda, 0xecda, 0xecda, - 0xecda, 0xecda, 0xece7, 0xecda, 0xecda, 0xecda, 0xecda, 0xecda, - 0xecda, 0xecda, 0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, - 0x6003, 0x0001, 0x080c, 0x94ff, 0x080c, 0x9ab1, 0x0005, 0x0096, - 0x00c6, 0x2260, 0x080c, 0xee87, 0x6043, 0x0000, 0x6024, 0xc0f4, - 0xc0e4, 0x6026, 0x603b, 0x0000, 0x00ce, 0x00d6, 0x2268, 0x9186, - 0x0007, 0x1904, 0xed40, 0x6814, 0x9005, 0x0138, 0x2048, 0xa87c, - 0xd0fc, 0x1118, 0x00de, 0x009e, 0x08a8, 0x6007, 0x003a, 0x6003, - 0x0001, 0x080c, 0x94ff, 0x080c, 0x9ab1, 0x00c6, 0x2d60, 0x6100, - 0x9186, 0x0002, 0x1904, 0xedb0, 0x6014, 0x9005, 0x1138, 0x6000, - 0x9086, 0x0007, 0x190c, 0x0dc5, 0x0804, 0xedb0, 0x2048, 0x080c, - 0xd0d8, 0x1130, 0x0028, 0x2048, 0xa800, 0x9005, 0x1de0, 0x2900, - 0x2048, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, 0x1168, 0xa87c, - 0xc0dc, 0xc0f4, 0xa87e, 0xa880, 0xc0fc, 0xa882, 0x2009, 0x0043, - 0x080c, 0xe59e, 0x0804, 0xedb0, 0x2009, 0x0041, 0x0804, 0xedaa, - 0x9186, 0x0005, 0x15a0, 0x6814, 0x2048, 0xa87c, 0xd0bc, 0x1120, - 0x00de, 0x009e, 0x0804, 0xecda, 0xd0b4, 0x0128, 0xd0fc, 0x090c, - 0x0dc5, 0x0804, 0xecfb, 0x6007, 0x003a, 0x6003, 0x0001, 0x080c, - 0x94ff, 0x080c, 0x9ab1, 0x00c6, 0x2d60, 0x6100, 0x9186, 0x0002, - 0x0120, 0x9186, 0x0004, 0x1904, 0xedb0, 0x6814, 0x2048, 0xa97c, - 0xc1f4, 0xc1dc, 0xa97e, 0xa980, 0xc1fc, 0xc1bc, 0xa982, 0x00f6, - 0x2c78, 0x080c, 0x1768, 0x00fe, 0x2009, 0x0042, 0x0498, 0x0036, - 0x080c, 0x100e, 0x090c, 0x0dc5, 0xa867, 0x010d, 0x9006, 0xa802, - 0xa86a, 0xa88a, 0x2d18, 0xab8e, 0xa887, 0x0045, 0x2c00, 0xa892, - 0x6038, 0xa8a2, 0x2360, 0x6024, 0xc0dd, 0x6026, 0x6010, 0x00b6, - 0x2058, 0xb8a0, 0x00be, 0x2004, 0x6354, 0xab7a, 0xa876, 0x9006, - 0xa87e, 0xa882, 0xad9a, 0xae96, 0xa89f, 0x0001, 0x080c, 0x6e9f, - 0x2019, 0x0045, 0x6008, 0x2068, 0x080c, 0xe746, 0x2d00, 0x600a, - 0x003e, 0x0038, 0x6043, 0x0000, 0x6003, 0x0007, 0x080c, 0xe59e, - 0x00ce, 0x00de, 0x009e, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, - 0x9082, 0x0085, 0x2008, 0x00c2, 0x9186, 0x0027, 0x1178, 0x080c, - 0x99a5, 0x0036, 0x0096, 0x6014, 0x2048, 0x2019, 0x0004, 0x080c, - 0xebd4, 0x009e, 0x003e, 0x080c, 0x9ab1, 0x0005, 0x9186, 0x0014, - 0x0d70, 0x080c, 0xb36d, 0x0005, 0xede3, 0xede1, 0xede1, 0xede1, - 0xede1, 0xede1, 0xede3, 0xede1, 0xede1, 0xede1, 0xede1, 0xede1, - 0xede1, 0x080c, 0x0dc5, 0x080c, 0x99a5, 0x6003, 0x000c, 0x080c, - 0x9ab1, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, 0x0208, - 0x001a, 0x080c, 0xb36d, 0x0005, 0xee01, 0xee01, 0xee01, 0xee01, - 0xee03, 0xee23, 0xee01, 0xee01, 0xee01, 0xee01, 0xee01, 0xee01, - 0xee01, 0x080c, 0x0dc5, 0x00d6, 0x2c68, 0x080c, 0xb27d, 0x01b0, - 0x6003, 0x0001, 0x6007, 0x001e, 0x2009, 0x026e, 0x210c, 0x613a, - 0x2009, 0x026f, 0x210c, 0x613e, 0x600b, 0xffff, 0x6910, 0x6112, - 0x6023, 0x0004, 0x080c, 0x94ff, 0x080c, 0x9ab1, 0x2d60, 0x080c, - 0xb2d3, 0x00de, 0x0005, 0x080c, 0xb2d3, 0x0005, 0x00e6, 0x6010, - 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0ec, 0x00ee, 0x0005, 0x2009, - 0x1867, 0x210c, 0xd1ec, 0x05b0, 0x6003, 0x0002, 0x6024, 0xc0e5, - 0x6026, 0xd0cc, 0x0150, 0x2001, 0x1988, 0x2004, 0x6042, 0x2009, - 0x1867, 0x210c, 0xd1f4, 0x1520, 0x00a0, 0x2009, 0x1867, 0x210c, - 0xd1f4, 0x0128, 0x6024, 0xc0e4, 0x6026, 0x9006, 0x00d8, 0x2001, - 0x1988, 0x200c, 0x2001, 0x1986, 0x2004, 0x9100, 0x9080, 0x000a, - 0x6042, 0x6010, 0x00b6, 0x2058, 0xb8bc, 0x00be, 0x0008, 0x2104, - 0x9005, 0x0118, 0x9088, 0x0003, 0x0cd0, 0x2c0a, 0x600f, 0x0000, - 0x9085, 0x0001, 0x0005, 0x0016, 0x00c6, 0x00e6, 0x6154, 0xb8bc, - 0x2060, 0x8cff, 0x0180, 0x84ff, 0x1118, 0x6054, 0x9106, 0x1138, - 0x600c, 0x2072, 0x080c, 0x8a25, 0x080c, 0xb2d3, 0x0010, 0x9cf0, - 0x0003, 0x2e64, 0x0c70, 0x00ee, 0x00ce, 0x001e, 0x0005, 0x00d6, - 0x00b6, 0x6010, 0x2058, 0xb8bc, 0x906d, 0x0130, 0x9c06, 0x0110, - 0x680c, 0x0cd0, 0x600c, 0x680e, 0x00be, 0x00de, 0x0005, 0x0026, - 0x0036, 0x0156, 0x2011, 0x182c, 0x2204, 0x9084, 0x00ff, 0x2019, - 0x026e, 0x2334, 0x96b4, 0x00ff, 0x9636, 0x1508, 0x8318, 0x2334, - 0x2204, 0x9084, 0xff00, 0x9636, 0x11d0, 0x2011, 0x0270, 0x20a9, - 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x000a, 0x080c, 0xc379, - 0x009e, 0x1168, 0x2011, 0x0274, 0x20a9, 0x0004, 0x6010, 0x0096, - 0x2048, 0x2019, 0x0006, 0x080c, 0xc379, 0x009e, 0x1100, 0x015e, - 0x003e, 0x002e, 0x0005, 0x00e6, 0x2071, 0x1800, 0x080c, 0x60c1, - 0x080c, 0x3000, 0x00ee, 0x0005, 0x0096, 0x0026, 0x080c, 0x100e, - 0x090c, 0x0dc5, 0xa85c, 0x9080, 0x001a, 0x20a0, 0x20a9, 0x000c, - 0xa860, 0x20e8, 0x9006, 0x4004, 0x9186, 0x0046, 0x1118, 0xa867, - 0x0136, 0x0038, 0xa867, 0x0138, 0x9186, 0x0041, 0x0110, 0xa87b, - 0x0001, 0x7038, 0x9084, 0xff00, 0x7240, 0x9294, 0xff00, 0x8007, - 0x9215, 0xaa9a, 0x9186, 0x0046, 0x1168, 0x7038, 0x9084, 0x00ff, - 0x723c, 0x9294, 0xff00, 0x9215, 0xaa9e, 0x723c, 0x9294, 0x00ff, - 0xaaa2, 0x0060, 0x7040, 0x9084, 0x00ff, 0x7244, 0x9294, 0xff00, - 0x9215, 0xaa9e, 0x7244, 0x9294, 0x00ff, 0xaaa2, 0x9186, 0x0046, - 0x1118, 0x9e90, 0x0012, 0x0010, 0x9e90, 0x001a, 0x2204, 0x8007, - 0xa8a6, 0x8210, 0x2204, 0x8007, 0xa8aa, 0x8210, 0x2204, 0x8007, - 0xa8ae, 0x8210, 0x2204, 0x8007, 0xa8b2, 0x8210, 0x9186, 0x0046, - 0x11b8, 0x9e90, 0x0016, 0x2204, 0x8007, 0xa8b6, 0x8210, 0x2204, - 0x8007, 0xa8ba, 0x8210, 0x2204, 0x8007, 0xa8be, 0x8210, 0x2204, - 0x8007, 0xa8c2, 0x8210, 0x2011, 0x0205, 0x2013, 0x0001, 0x00b0, - 0x9e90, 0x001e, 0x2204, 0x8007, 0xa8b6, 0x8210, 0x2204, 0x8007, - 0xa8ba, 0x2011, 0x0205, 0x2013, 0x0001, 0x2011, 0x0260, 0x2204, - 0x8007, 0xa8be, 0x8210, 0x2204, 0x8007, 0xa8c2, 0x9186, 0x0046, - 0x1118, 0x2011, 0x0262, 0x0010, 0x2011, 0x026a, 0x0146, 0x01d6, - 0x0036, 0x20a9, 0x0001, 0x2019, 0x0008, 0xa860, 0x20e8, 0xa85c, - 0x9080, 0x0031, 0x20a0, 0x2204, 0x8007, 0x4004, 0x8210, 0x8319, - 0x1dd0, 0x003e, 0x01ce, 0x013e, 0x2011, 0x0205, 0x2013, 0x0000, - 0x002e, 0x080c, 0x6e9f, 0x009e, 0x0005, 0x00e6, 0x6010, 0x00b6, - 0x2058, 0xb800, 0x00be, 0xd0fc, 0x0108, 0x0011, 0x00ee, 0x0005, - 0xa880, 0xc0e5, 0xa882, 0x0005, 0x00e6, 0x00d6, 0x00c6, 0x0076, - 0x0066, 0x0056, 0x0046, 0x0026, 0x0016, 0x0126, 0x2091, 0x8000, - 0x2029, 0x19f1, 0x252c, 0x2021, 0x19f7, 0x2424, 0x2061, 0x1cd0, - 0x2071, 0x1800, 0x7654, 0x7074, 0x9606, 0x0578, 0x6720, 0x9786, - 0x0001, 0x0118, 0x9786, 0x0008, 0x1500, 0x2500, 0x9c06, 0x01e8, - 0x2400, 0x9c06, 0x01d0, 0x080c, 0xec62, 0x01b8, 0x080c, 0xec72, - 0x11a0, 0x6000, 0x9086, 0x0004, 0x1120, 0x0016, 0x080c, 0x1a8e, - 0x001e, 0x080c, 0xd2cf, 0x1110, 0x080c, 0x3279, 0x080c, 0xd2e0, - 0x1110, 0x080c, 0xbcb6, 0x080c, 0xb306, 0x9ce0, 0x0018, 0x2001, - 0x181a, 0x2004, 0x9c02, 0x1208, 0x0858, 0x012e, 0x001e, 0x002e, - 0x004e, 0x005e, 0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x0005, - 0x2001, 0x1810, 0x2004, 0xd0dc, 0x0005, 0x0006, 0x2001, 0x1837, - 0x2004, 0xd09c, 0x000e, 0x0005, 0x0006, 0x0036, 0x0046, 0x080c, - 0xd7e3, 0x0168, 0x2019, 0xffff, 0x9005, 0x0128, 0x6010, 0x00b6, - 0x2058, 0xbba0, 0x00be, 0x2021, 0x0004, 0x080c, 0x4dfb, 0x004e, - 0x003e, 0x000e, 0x0005, 0x6004, 0x9086, 0x0001, 0x1128, 0x080c, - 0xac6c, 0x080c, 0xb306, 0x9006, 0x0005, 0x00e6, 0x00c6, 0x00b6, - 0x0046, 0x2061, 0x1cd0, 0x2071, 0x1800, 0x7454, 0x7074, 0x8001, - 0x9402, 0x12d8, 0x2100, 0x9c06, 0x0168, 0x6000, 0x9086, 0x0000, - 0x0148, 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1120, 0x6004, 0x9086, - 0x0002, 0x0140, 0x9ce0, 0x0018, 0x2001, 0x181a, 0x2004, 0x9c02, - 0x1220, 0x0c40, 0x9085, 0x0001, 0x0008, 0x9006, 0x004e, 0x00be, - 0x00ce, 0x00ee, 0x0005, 0x2001, 0x1810, 0x2004, 0xd0a4, 0x0160, - 0x2001, 0x1837, 0x2004, 0xd0a4, 0x0138, 0x2001, 0x1848, 0x2004, - 0xd0a4, 0x1118, 0x9085, 0x0001, 0x0005, 0x9006, 0x0ce8, 0x0126, - 0x0006, 0x00e6, 0x0016, 0x2091, 0x8000, 0x2071, 0x1840, 0xd5a4, - 0x0118, 0x7004, 0x8000, 0x7006, 0xd5b4, 0x0118, 0x7000, 0x8000, - 0x7002, 0xd5ac, 0x0178, 0x2500, 0x9084, 0x0007, 0x908e, 0x0003, - 0x0148, 0x908e, 0x0004, 0x0130, 0x908e, 0x0005, 0x0118, 0x2071, - 0xfff6, 0x0089, 0x001e, 0x00ee, 0x000e, 0x012e, 0x0005, 0x0126, - 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, 0xffee, 0x0021, 0x00ee, - 0x000e, 0x012e, 0x0005, 0x2e05, 0x8000, 0x2077, 0x1220, 0x8e70, - 0x2e05, 0x8000, 0x2077, 0x0005, 0x00e6, 0x2071, 0xffec, 0x0c99, - 0x00ee, 0x0005, 0x00e6, 0x2071, 0xfff0, 0x0c69, 0x00ee, 0x0005, - 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, 0x1840, 0x7014, - 0x8000, 0x7016, 0x00ee, 0x000e, 0x012e, 0x0005, 0x0003, 0x000b, - 0x07d2, 0x0000, 0xc000, 0x0001, 0x8064, 0x0008, 0x0010, 0x0000, - 0x8066, 0x0000, 0x0101, 0x0008, 0x4407, 0x0003, 0x8060, 0x0000, - 0x0400, 0x0000, 0x580d, 0x000b, 0x79c0, 0x0003, 0x5106, 0x0003, - 0x4c0a, 0x0003, 0xbac0, 0x0009, 0x008a, 0x0000, 0x0c0a, 0x000b, - 0x15fe, 0x0008, 0x340a, 0x0003, 0xc4c0, 0x0009, 0x7000, 0x0000, - 0xffa0, 0x0001, 0x2000, 0x0000, 0x1680, 0x000b, 0x808c, 0x0008, - 0x0001, 0x0000, 0x0000, 0x0007, 0x4028, 0x0000, 0x4047, 0x000a, - 0x808c, 0x0008, 0x0002, 0x0000, 0x0822, 0x0003, 0x4022, 0x0000, - 0x0028, 0x000b, 0x4122, 0x0008, 0x94c0, 0x0009, 0xff00, 0x0008, - 0xffe0, 0x0009, 0x0500, 0x0008, 0x0aab, 0x0003, 0x4447, 0x0002, - 0x0ea8, 0x000b, 0x0bfe, 0x0008, 0x11a0, 0x0001, 0x1286, 0x0003, - 0x0ca0, 0x0001, 0x1286, 0x0003, 0x9180, 0x0001, 0x0004, 0x0000, - 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, - 0x0009, 0x0008, 0x4436, 0x000b, 0x808c, 0x0008, 0x0000, 0x0008, - 0x0060, 0x0008, 0x8062, 0x0008, 0x0004, 0x0000, 0x8066, 0x0000, - 0x0411, 0x0000, 0x443e, 0x0003, 0x03fe, 0x0000, 0x43e0, 0x0001, - 0x0e83, 0x000b, 0xc2c0, 0x0009, 0x00ff, 0x0008, 0x02e0, 0x0001, - 0x0e83, 0x000b, 0x9180, 0x0001, 0x0005, 0x0008, 0x8060, 0x0000, - 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0019, 0x0000, - 0x444d, 0x000b, 0x0240, 0x0002, 0x0a80, 0x0003, 0x00fe, 0x0000, - 0x3283, 0x000b, 0x0248, 0x000a, 0x085c, 0x0003, 0x9180, 0x0001, - 0x0006, 0x0008, 0x7f62, 0x0008, 0x8002, 0x0008, 0x0003, 0x0008, - 0x8066, 0x0000, 0x020a, 0x0000, 0x445b, 0x0003, 0x112a, 0x0000, - 0x002e, 0x0008, 0x022c, 0x0008, 0x3a44, 0x0002, 0x0c0a, 0x000b, - 0x808c, 0x0008, 0x0002, 0x0000, 0x1760, 0x0008, 0x8062, 0x0008, - 0x000f, 0x0008, 0x8066, 0x0000, 0x0011, 0x0008, 0x4468, 0x0003, - 0x01fe, 0x0008, 0x42e0, 0x0009, 0x0e74, 0x0003, 0x00fe, 0x0000, - 0x43e0, 0x0001, 0x0e74, 0x0003, 0x1734, 0x0000, 0x1530, 0x0000, - 0x1632, 0x0008, 0x0d2a, 0x0008, 0x9880, 0x0001, 0x0010, 0x0000, - 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, - 0x1e0a, 0x0008, 0x447a, 0x0003, 0x808a, 0x0008, 0x0003, 0x0008, - 0x1a60, 0x0000, 0x8062, 0x0008, 0x0002, 0x0000, 0x5880, 0x000b, - 0x8066, 0x0000, 0x3679, 0x0000, 0x4483, 0x0003, 0x5884, 0x0003, - 0x3efe, 0x0008, 0x7f4f, 0x0002, 0x088a, 0x000b, 0x0d00, 0x0000, - 0x0092, 0x000c, 0x8054, 0x0008, 0x0011, 0x0008, 0x8074, 0x0000, - 0x1010, 0x0008, 0x1efe, 0x0000, 0x300a, 0x000b, 0x00e0, 0x000c, - 0x000a, 0x000b, 0x00fe, 0x0000, 0x349a, 0x0003, 0x1a60, 0x0000, - 0x8062, 0x0008, 0x0007, 0x0000, 0x8066, 0x0000, 0x0231, 0x0008, - 0x4499, 0x000b, 0x03fe, 0x0000, 0x04d0, 0x0001, 0x0cd4, 0x000b, - 0x82c0, 0x0001, 0x1f00, 0x0000, 0xffa0, 0x0001, 0x0400, 0x0000, - 0x08b2, 0x0003, 0x14dc, 0x0003, 0x01fe, 0x0008, 0x0580, 0x0009, - 0x7f06, 0x0000, 0x8690, 0x0009, 0x0000, 0x0008, 0x7f0c, 0x0000, - 0x02fe, 0x0008, 0xffc0, 0x0001, 0x00ff, 0x0008, 0x0680, 0x0009, - 0x10b2, 0x0003, 0x7f08, 0x0008, 0x84c0, 0x0001, 0xff00, 0x0008, - 0x08d4, 0x0003, 0xb9c0, 0x0009, 0x0030, 0x0008, 0x0cc3, 0x000b, - 0x8060, 0x0000, 0x0400, 0x0000, 0x80fe, 0x0008, 0x1a0a, 0x0009, - 0x7f62, 0x0008, 0x8066, 0x0000, 0x0409, 0x0000, 0x44bc, 0x0003, - 0x80fe, 0x0008, 0x1a09, 0x0009, 0x7f62, 0x0008, 0x8066, 0x0000, - 0x040a, 0x0000, 0x44c2, 0x0003, 0x00fe, 0x0000, 0x34ca, 0x0003, - 0x8072, 0x0000, 0x1010, 0x0008, 0x3944, 0x0002, 0x08c5, 0x0003, - 0x00ce, 0x0003, 0x8072, 0x0000, 0x2020, 0x0008, 0x3945, 0x000a, - 0x08ca, 0x0003, 0x3946, 0x000a, 0x0cdb, 0x000b, 0x0000, 0x0007, - 0x3943, 0x000a, 0x08db, 0x0003, 0x00ce, 0x0003, 0x00fe, 0x0000, - 0x34d9, 0x000b, 0x8072, 0x0000, 0x1000, 0x0000, 0x00db, 0x000b, - 0x8072, 0x0000, 0x2000, 0x0000, 0x4000, 0x000f, 0x86c0, 0x0009, - 0xfc00, 0x0008, 0x08d4, 0x0003, 0x00b2, 0x000b, 0x1c60, 0x0000, - 0x1b62, 0x0000, 0x8066, 0x0000, 0x0231, 0x0008, 0x44e4, 0x000b, - 0x58e5, 0x000b, 0x0140, 0x0008, 0x0242, 0x0000, 0x1f43, 0x0002, - 0x0cf3, 0x000b, 0x0d44, 0x0000, 0x0d46, 0x0008, 0x0348, 0x0008, - 0x044a, 0x0008, 0x030a, 0x0008, 0x040c, 0x0000, 0x0d06, 0x0000, - 0x0d08, 0x0008, 0x00f7, 0x0003, 0x0344, 0x0008, 0x0446, 0x0008, - 0x0548, 0x0008, 0x064a, 0x0000, 0x1948, 0x000a, 0x08fa, 0x0003, - 0x0d4a, 0x0008, 0x58fa, 0x0003, 0x3efe, 0x0008, 0x7f4f, 0x0002, - 0x0901, 0x0003, 0x8000, 0x0000, 0x0001, 0x0000, 0x0092, 0x000c, - 0x8054, 0x0008, 0x0001, 0x0000, 0x8074, 0x0000, 0x2020, 0x0008, - 0x4000, 0x000f, 0x3a40, 0x000a, 0x0c0d, 0x0003, 0x2b24, 0x0008, - 0x2b24, 0x0008, 0x590a, 0x000b, 0x8054, 0x0008, 0x0002, 0x0000, - 0x1242, 0x0002, 0x0958, 0x0003, 0x3a45, 0x000a, 0x0947, 0x000b, - 0x8072, 0x0000, 0x1000, 0x0000, 0x3945, 0x000a, 0x0917, 0x000b, - 0x8072, 0x0000, 0x3010, 0x0000, 0x1e10, 0x000a, 0x7f3c, 0x0000, - 0x0942, 0x000b, 0x1d00, 0x0002, 0x7f3a, 0x0000, 0x0d60, 0x0000, - 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x4520, 0x000b, - 0x00fe, 0x0000, 0x353f, 0x000b, 0x1c60, 0x0000, 0x8062, 0x0008, - 0x0001, 0x0000, 0x8066, 0x0000, 0x0009, 0x0008, 0x4528, 0x0003, - 0x00fe, 0x0000, 0x325b, 0x000b, 0x0038, 0x0000, 0x0060, 0x0008, - 0x8062, 0x0008, 0x0019, 0x0000, 0x8066, 0x0000, 0x0009, 0x0008, - 0x4531, 0x000b, 0x80c0, 0x0009, 0x00ff, 0x0008, 0x7f3e, 0x0008, - 0x0d60, 0x0000, 0x0efe, 0x0008, 0x1f80, 0x0001, 0x7f62, 0x0008, - 0x8066, 0x0000, 0x0009, 0x0008, 0x453b, 0x000b, 0x003a, 0x0008, - 0x1dfe, 0x0000, 0x011c, 0x000b, 0x0036, 0x0008, 0x00e0, 0x000c, - 0x0158, 0x000b, 0x8074, 0x0000, 0x2000, 0x0000, 0x8072, 0x0000, - 0x2000, 0x0000, 0x0158, 0x000b, 0x3a44, 0x0002, 0x0a89, 0x0003, - 0x8074, 0x0000, 0x1000, 0x0000, 0x8072, 0x0000, 0x1000, 0x0000, - 0x2d0e, 0x0000, 0x2d0e, 0x0000, 0x3658, 0x0003, 0x26fe, 0x0008, - 0x26fe, 0x0008, 0x2700, 0x0008, 0x2700, 0x0008, 0x00d0, 0x0009, - 0x0d6a, 0x0003, 0x8074, 0x0000, 0x4040, 0x0008, 0x5958, 0x0003, - 0x5106, 0x0003, 0x3a46, 0x000a, 0x0d6a, 0x0003, 0x3a47, 0x0002, - 0x0965, 0x000b, 0x8054, 0x0008, 0x0004, 0x0000, 0x8074, 0x0000, - 0x8000, 0x0000, 0x8072, 0x0000, 0x3000, 0x0008, 0x01b4, 0x0003, - 0x92c0, 0x0009, 0x0fc8, 0x0000, 0x080a, 0x0003, 0x1246, 0x000a, - 0x0e52, 0x000b, 0x1a60, 0x0000, 0x8062, 0x0008, 0x0002, 0x0000, - 0x8066, 0x0000, 0x362a, 0x0000, 0x456f, 0x0003, 0x2000, 0x0000, - 0x2000, 0x0000, 0x2102, 0x0000, 0x2102, 0x0000, 0x2204, 0x0000, - 0x2204, 0x0000, 0x2306, 0x0000, 0x2306, 0x0000, 0x2408, 0x0000, - 0x2408, 0x0000, 0x250a, 0x0000, 0x250a, 0x0000, 0x260c, 0x0000, - 0x260c, 0x0000, 0x270e, 0x0000, 0x270e, 0x0000, 0x2810, 0x0000, - 0x2810, 0x0000, 0x2912, 0x0000, 0x2912, 0x0000, 0x1a60, 0x0000, - 0x8062, 0x0008, 0x0007, 0x0000, 0x8066, 0x0000, 0x0052, 0x0000, - 0x4589, 0x000b, 0x92c0, 0x0009, 0x0780, 0x0008, 0x0e6e, 0x000b, - 0x124b, 0x0002, 0x0992, 0x0003, 0x2e4d, 0x0002, 0x2e4d, 0x0002, - 0x0a58, 0x0003, 0x3a46, 0x000a, 0x0da2, 0x000b, 0x5994, 0x0003, - 0x8054, 0x0008, 0x0004, 0x0000, 0x1243, 0x000a, 0x09b0, 0x0003, - 0x8010, 0x0008, 0x000d, 0x0000, 0x0233, 0x000c, 0x1948, 0x000a, - 0x099f, 0x000b, 0x0228, 0x000c, 0x1810, 0x0000, 0x0233, 0x000c, - 0x01b0, 0x000b, 0x1948, 0x000a, 0x09a6, 0x000b, 0x1243, 0x000a, - 0x0a5b, 0x0003, 0x194d, 0x000a, 0x09aa, 0x000b, 0x1243, 0x000a, - 0x0a62, 0x0003, 0x59aa, 0x000b, 0x8054, 0x0008, 0x0004, 0x0000, - 0x0228, 0x000c, 0x1810, 0x0000, 0x0233, 0x000c, 0x8074, 0x0000, - 0xf000, 0x0008, 0x8072, 0x0000, 0x3000, 0x0008, 0x0d30, 0x0000, - 0x3a42, 0x0002, 0x0dba, 0x000b, 0x15fe, 0x0008, 0x3461, 0x000b, - 0x000a, 0x000b, 0x8074, 0x0000, 0x0501, 0x0000, 0x8010, 0x0008, - 0x000c, 0x0008, 0x0233, 0x000c, 0x000a, 0x000b, 0xbbe0, 0x0009, - 0x0030, 0x0008, 0x0dd0, 0x000b, 0x18fe, 0x0000, 0x3ce0, 0x0009, - 0x09cd, 0x0003, 0x15fe, 0x0008, 0x3ce0, 0x0009, 0x09cd, 0x0003, - 0x0223, 0x0004, 0x8076, 0x0008, 0x0040, 0x0000, 0x0220, 0x000b, - 0x8076, 0x0008, 0x0041, 0x0008, 0x0220, 0x000b, 0xbbe0, 0x0009, - 0x0032, 0x0000, 0x0dd5, 0x000b, 0x3c1e, 0x0008, 0x0220, 0x000b, - 0xbbe0, 0x0009, 0x003b, 0x0000, 0x0dda, 0x000b, 0x3c20, 0x0000, - 0x0220, 0x000b, 0xbbe0, 0x0009, 0x0035, 0x0008, 0x0de0, 0x000b, - 0x8072, 0x0000, 0x8000, 0x0000, 0x039e, 0x0003, 0xbbe0, 0x0009, - 0x0036, 0x0008, 0x0abd, 0x000b, 0xbbe0, 0x0009, 0x0037, 0x0000, - 0x0e01, 0x000b, 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x0dcd, 0x000b, - 0x8076, 0x0008, 0x0040, 0x0000, 0x1a60, 0x0000, 0x8062, 0x0008, - 0x000d, 0x0000, 0x2604, 0x0008, 0x2604, 0x0008, 0x2706, 0x0008, - 0x2706, 0x0008, 0x2808, 0x0000, 0x2808, 0x0000, 0x290a, 0x0000, - 0x290a, 0x0000, 0x8066, 0x0000, 0x0422, 0x0000, 0x45f8, 0x000b, - 0x0228, 0x000c, 0x8054, 0x0008, 0x0004, 0x0000, 0x8074, 0x0000, - 0xf000, 0x0008, 0x8072, 0x0000, 0xb000, 0x0000, 0x01b4, 0x0003, - 0xbbe0, 0x0009, 0x0038, 0x0000, 0x0e13, 0x000b, 0x18fe, 0x0000, - 0x3ce0, 0x0009, 0x0a10, 0x0003, 0x15fe, 0x0008, 0x3ce0, 0x0009, - 0x0dc9, 0x0003, 0x0223, 0x0004, 0x8076, 0x0008, 0x0040, 0x0000, - 0x8072, 0x0000, 0x8000, 0x0000, 0x0280, 0x000b, 0x8076, 0x0008, - 0x0042, 0x0008, 0x0220, 0x000b, 0xbbe0, 0x0009, 0x0016, 0x0000, - 0x0e20, 0x000b, 0x8074, 0x0000, 0x0808, 0x0008, 0x3a44, 0x0002, - 0x0c0c, 0x000b, 0x8074, 0x0000, 0x0800, 0x0000, 0x8072, 0x0000, - 0x8000, 0x0000, 0x8000, 0x000f, 0x000a, 0x000b, 0x8072, 0x0000, - 0x8000, 0x0000, 0x000a, 0x000b, 0x3d30, 0x000a, 0x7f00, 0x0000, - 0xbc80, 0x0001, 0x0007, 0x0000, 0x022c, 0x000b, 0x1930, 0x000a, - 0x7f00, 0x0000, 0x9880, 0x0001, 0x0007, 0x0000, 0x8060, 0x0000, - 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x000a, 0x0008, - 0x4631, 0x000b, 0x4000, 0x000f, 0x2236, 0x000b, 0x0870, 0x0008, - 0x4000, 0x000f, 0x7e33, 0x000b, 0xbbe0, 0x0009, 0x0030, 0x0008, - 0x0e33, 0x0003, 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x0a44, 0x000b, - 0x15fe, 0x0008, 0x3ce0, 0x0009, 0x0a44, 0x000b, 0x0223, 0x0004, - 0x8076, 0x0008, 0x0040, 0x0000, 0x0246, 0x000b, 0x8076, 0x0008, - 0x0041, 0x0008, 0x8072, 0x0000, 0x8000, 0x0000, 0x0233, 0x0003, - 0xbac0, 0x0009, 0x0090, 0x0008, 0x0a4f, 0x0003, 0x8074, 0x0000, - 0x0706, 0x0000, 0x0251, 0x000b, 0x8074, 0x0000, 0x0703, 0x0000, - 0x4000, 0x000f, 0x8010, 0x0008, 0x0023, 0x0000, 0x028e, 0x0003, - 0x8010, 0x0008, 0x0008, 0x0000, 0x028e, 0x0003, 0x8010, 0x0008, - 0x0022, 0x0008, 0x028e, 0x0003, 0x0228, 0x000c, 0x8010, 0x0008, - 0x0007, 0x0000, 0x0233, 0x000c, 0x1810, 0x0000, 0x0233, 0x000c, - 0x029a, 0x0003, 0x0228, 0x000c, 0x8010, 0x0008, 0x001b, 0x0008, - 0x0233, 0x000c, 0x1810, 0x0000, 0x0233, 0x000c, 0x8074, 0x0000, - 0xf080, 0x0000, 0x8072, 0x0000, 0x3000, 0x0008, 0x0d30, 0x0000, - 0x000a, 0x000b, 0x8010, 0x0008, 0x0009, 0x0008, 0x028e, 0x0003, - 0x8010, 0x0008, 0x0005, 0x0008, 0x028e, 0x0003, 0x1648, 0x000a, - 0x0c6f, 0x000b, 0x808c, 0x0008, 0x0001, 0x0000, 0x8010, 0x0008, - 0x0004, 0x0000, 0x4143, 0x000a, 0x086f, 0x0003, 0x3a44, 0x0002, - 0x0c0a, 0x000b, 0x0d2a, 0x0008, 0x028e, 0x0003, 0x8010, 0x0008, - 0x0003, 0x0008, 0x0292, 0x000b, 0x8010, 0x0008, 0x000b, 0x0000, - 0x0292, 0x000b, 0x8010, 0x0008, 0x0002, 0x0000, 0x0292, 0x000b, - 0x3a47, 0x0002, 0x0d58, 0x000b, 0x8010, 0x0008, 0x0006, 0x0008, - 0x0292, 0x000b, 0x8074, 0x0000, 0xf000, 0x0008, 0x8072, 0x0000, - 0x3000, 0x0008, 0x0233, 0x000c, 0x0249, 0x0004, 0x3a40, 0x000a, - 0x080a, 0x0003, 0x8010, 0x0008, 0x000c, 0x0008, 0x0233, 0x000c, - 0x000a, 0x000b, 0x8074, 0x0000, 0xf080, 0x0000, 0x8072, 0x0000, - 0x3000, 0x0008, 0x0d30, 0x0000, 0x2e4d, 0x0002, 0x2e4d, 0x0002, - 0x0aa5, 0x000b, 0x8054, 0x0008, 0x0019, 0x0000, 0x000a, 0x000b, - 0x8054, 0x0008, 0x0009, 0x0008, 0x000a, 0x000b, 0x3a44, 0x0002, - 0x0c0a, 0x000b, 0x0283, 0x000b, 0x808c, 0x0008, 0x0000, 0x0008, - 0x4447, 0x0002, 0x0ad1, 0x000b, 0xc0c0, 0x0001, 0x00ff, 0x0008, - 0xffe0, 0x0009, 0x00ff, 0x0008, 0x0ea8, 0x000b, 0xc1e0, 0x0001, - 0xffff, 0x0008, 0x0ea8, 0x000b, 0x8010, 0x0008, 0x0013, 0x0000, - 0x0233, 0x000c, 0x8074, 0x0000, 0x0202, 0x0008, 0x000a, 0x000b, - 0x3a40, 0x000a, 0x0ece, 0x000b, 0x8074, 0x0000, 0x0200, 0x0000, - 0x3d00, 0x0000, 0x3cfe, 0x0000, 0x8072, 0x0000, 0x8000, 0x0000, - 0x43e0, 0x0001, 0x0ecc, 0x0003, 0x42fe, 0x0000, 0xffc0, 0x0001, - 0x00ff, 0x0008, 0x00e0, 0x0009, 0x0aa8, 0x0003, 0x0d08, 0x0008, - 0x0321, 0x000b, 0x8072, 0x0000, 0x8000, 0x0000, 0x000a, 0x000b, - 0x03a7, 0x000c, 0x808c, 0x0008, 0x0001, 0x0000, 0x04fe, 0x0008, - 0x338a, 0x0003, 0x0460, 0x0000, 0x8062, 0x0008, 0x0001, 0x0000, - 0x8066, 0x0000, 0x0009, 0x0008, 0x46db, 0x0003, 0x0004, 0x0000, - 0x80c0, 0x0009, 0x00ff, 0x0008, 0x7f00, 0x0000, 0x80e0, 0x0001, - 0x0004, 0x0000, 0x0af5, 0x000b, 0x80e0, 0x0001, 0x0005, 0x0008, - 0x0af5, 0x000b, 0x80e0, 0x0001, 0x0006, 0x0008, 0x0af5, 0x000b, - 0x82c0, 0x0001, 0xff00, 0x0008, 0x7f04, 0x0008, 0x82e0, 0x0009, - 0x0600, 0x0008, 0x0af5, 0x000b, 0x82e0, 0x0009, 0x0500, 0x0008, - 0x0af5, 0x000b, 0x82e0, 0x0009, 0x0400, 0x0000, 0x0f8a, 0x0003, - 0xc4c0, 0x0009, 0x7000, 0x0000, 0xffe0, 0x0009, 0x1000, 0x0000, - 0x0b21, 0x0003, 0x0398, 0x000c, 0x3941, 0x0002, 0x0b00, 0x0003, - 0x8072, 0x0000, 0x0400, 0x0000, 0x000a, 0x000b, 0x0460, 0x0000, - 0x80fe, 0x0008, 0x002b, 0x0008, 0x7f62, 0x0008, 0x8066, 0x0000, - 0x2209, 0x0008, 0x4706, 0x000b, 0x11fe, 0x0000, 0x331c, 0x0003, - 0x9180, 0x0001, 0x0002, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, - 0x7f62, 0x0008, 0x8066, 0x0000, 0x0609, 0x0008, 0x4710, 0x0003, - 0x42fe, 0x0000, 0xffc0, 0x0001, 0xff00, 0x0008, 0x03e0, 0x0009, - 0x0f19, 0x0003, 0x8072, 0x0000, 0x0400, 0x0000, 0x0046, 0x0003, - 0x9180, 0x0001, 0x0003, 0x0008, 0x0303, 0x000b, 0x8072, 0x0000, - 0x0400, 0x0000, 0x8010, 0x0008, 0x0010, 0x0000, 0x037b, 0x000b, - 0x0398, 0x000c, 0x3941, 0x0002, 0x0b27, 0x0003, 0x8072, 0x0000, - 0x0400, 0x0000, 0x000a, 0x000b, 0x1042, 0x000a, 0x0b2c, 0x000b, - 0x0360, 0x0004, 0x11fe, 0x0000, 0x3731, 0x000b, 0x8072, 0x0000, - 0x0400, 0x0000, 0x8010, 0x0008, 0x000e, 0x0000, 0x037b, 0x000b, - 0x8060, 0x0000, 0x0400, 0x0000, 0x04fe, 0x0008, 0x3746, 0x000b, - 0x808c, 0x0008, 0x0000, 0x0008, 0x9180, 0x0001, 0x0005, 0x0008, - 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x473c, 0x000b, - 0x0060, 0x0008, 0x8062, 0x0008, 0x001b, 0x0008, 0x4304, 0x0008, - 0x4206, 0x0008, 0x8066, 0x0000, 0x0412, 0x0000, 0x4744, 0x000b, - 0x035d, 0x0003, 0x808c, 0x0008, 0x0001, 0x0000, 0x0460, 0x0000, - 0x8062, 0x0008, 0x002b, 0x0008, 0x8066, 0x0000, 0x0609, 0x0008, - 0x474d, 0x000b, 0x8066, 0x0000, 0x220a, 0x0008, 0x4750, 0x000b, - 0x42fe, 0x0000, 0xffc0, 0x0001, 0xff00, 0x0008, 0x7f04, 0x0008, - 0x8060, 0x0000, 0x0400, 0x0000, 0x9180, 0x0001, 0x0002, 0x0000, - 0x7f62, 0x0008, 0x8066, 0x0000, 0x041a, 0x0008, 0x475c, 0x000b, - 0x8072, 0x0000, 0x0400, 0x0000, 0x0046, 0x0003, 0x8060, 0x0000, - 0x0400, 0x0000, 0x1362, 0x0008, 0x8066, 0x0000, 0x0411, 0x0000, - 0x4765, 0x000b, 0x02fe, 0x0008, 0x03e0, 0x0009, 0x0f6b, 0x0003, - 0x0d22, 0x0000, 0x4000, 0x000f, 0x8280, 0x0009, 0x0002, 0x0000, - 0x1380, 0x0001, 0x7f62, 0x0008, 0x8066, 0x0000, 0x2209, 0x0008, - 0x4771, 0x000b, 0x0200, 0x000a, 0xffc0, 0x0001, 0x0007, 0x0000, - 0x7f06, 0x0000, 0x1362, 0x0008, 0x8066, 0x0000, 0x060a, 0x0008, - 0x4779, 0x0003, 0x4000, 0x000f, 0x3a44, 0x0002, 0x0c0a, 0x000b, - 0x2f44, 0x000a, 0x2f44, 0x000a, 0x0e83, 0x000b, 0x808a, 0x0008, - 0x0003, 0x0008, 0x8074, 0x0000, 0xf080, 0x0000, 0x8072, 0x0000, - 0x3000, 0x0008, 0x5b86, 0x000b, 0x8054, 0x0008, 0x0019, 0x0000, - 0x000a, 0x000b, 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x808c, 0x0008, - 0x0000, 0x0008, 0x8010, 0x0008, 0x0011, 0x0008, 0x0233, 0x000c, - 0x42fe, 0x0000, 0xffc0, 0x0001, 0x00ff, 0x0008, 0x7f10, 0x0008, - 0x0233, 0x000c, 0x4310, 0x0008, 0x0292, 0x000b, 0x3941, 0x0002, - 0x0b9b, 0x000b, 0x4000, 0x000f, 0x8072, 0x0000, 0x0404, 0x0008, - 0x4000, 0x000f, 0x8010, 0x0008, 0x0012, 0x0008, 0x0233, 0x000c, - 0x0360, 0x0004, 0x1110, 0x0000, 0x0233, 0x000c, 0x11fe, 0x0000, - 0x37a1, 0x000b, 0x000a, 0x000b, 0xc2c0, 0x0009, 0x00ff, 0x0008, - 0x7f00, 0x0000, 0xc3c0, 0x0001, 0xff00, 0x0008, 0x00d0, 0x0009, - 0x0bcc, 0x0003, 0x0d0a, 0x0000, 0x8580, 0x0001, 0x1000, 0x0000, - 0x7f62, 0x0008, 0x8060, 0x0000, 0x0400, 0x0000, 0x8066, 0x0000, - 0x0809, 0x0000, 0x47b6, 0x0003, 0x04fe, 0x0008, 0x33c5, 0x000b, - 0x0460, 0x0000, 0x8062, 0x0008, 0x0004, 0x0000, 0x8066, 0x0000, - 0x0211, 0x0000, 0x47be, 0x000b, 0x01fe, 0x0008, 0x00e0, 0x0009, - 0x0fc5, 0x000b, 0x02fe, 0x0008, 0x43e0, 0x0001, 0x0bcb, 0x000b, - 0x0500, 0x0002, 0x7f0a, 0x0000, 0xffe0, 0x0009, 0x0800, 0x0000, - 0x0faf, 0x000b, 0x0d08, 0x0008, 0x4000, 0x000f, 0x43fe, 0x0008, - 0x3e80, 0x0001, 0xffc0, 0x0001, 0x7fff, 0x0000, 0x0d60, 0x0000, - 0x7f62, 0x0008, 0x8066, 0x0000, 0x0809, 0x0000, 0x47d4, 0x000b, - 0x8060, 0x0000, 0x0400, 0x0000, 0x84c0, 0x0001, 0xff00, 0x0008, - 0x7f60, 0x000a, 0x7f60, 0x000a, 0x7f60, 0x000a, 0x7f60, 0x000a, - 0x7f60, 0x000a, 0x7f60, 0x000a, 0x7f60, 0x000a, 0x7f60, 0x000a, - 0xff80, 0x0009, 0x1000, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, - 0x0809, 0x0000, 0x47e6, 0x0003, 0x4000, 0x000f, 0x8d5b, 0xeac4, - 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, - 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000, - 0x12b0 +static u8 ql2300_fw_bin[] = { + 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x91, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x03, 0x00, 0x14, 0x01, 0x37, 0x20, 0x43, 0x4f, 0x50, 0x59, 0x52, + 0x49, 0x47, 0x48, 0x54, 0x20, 0x32, 0x30, 0x30, 0x31, 0x20, 0x51, 0x4c, + 0x4f, 0x47, 0x49, 0x43, 0x20, 0x43, 0x4f, 0x52, 0x50, 0x4f, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x20, 0x49, 0x53, 0x50, 0x32, 0x33, 0x30, 0x30, + 0x20, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x20, 0x20, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x30, 0x33, 0x2e, 0x30, 0x33, + 0x2e, 0x32, 0x30, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x00, 0x20, 0xa9, + 0x00, 0x0f, 0x20, 0x01, 0x00, 0x00, 0x40, 0x0f, 0x20, 0x91, 0x22, 0x00, + 0x20, 0xa9, 0x00, 0x0f, 0x20, 0x01, 0x00, 0x00, 0x40, 0x0f, 0x20, 0x91, + 0x24, 0x00, 0x20, 0xa9, 0x00, 0x0f, 0x20, 0x01, 0x00, 0x00, 0x40, 0x0f, + 0x20, 0x91, 0x26, 0x00, 0x20, 0xa9, 0x00, 0x0f, 0x20, 0x01, 0x00, 0x00, + 0x40, 0x0f, 0x20, 0x91, 0x28, 0x00, 0x20, 0xa9, 0x00, 0x0f, 0x20, 0x01, + 0x00, 0x00, 0x40, 0x0f, 0x20, 0x91, 0x2a, 0x00, 0x20, 0xa9, 0x00, 0x0f, + 0x20, 0x01, 0x00, 0x00, 0x40, 0x0f, 0x20, 0x91, 0x2c, 0x00, 0x20, 0xa9, + 0x00, 0x0f, 0x20, 0x01, 0x00, 0x00, 0x40, 0x0f, 0x20, 0x91, 0x2e, 0x00, + 0x20, 0xa9, 0x00, 0x0f, 0x20, 0x01, 0x00, 0x00, 0x40, 0x0f, 0x20, 0x91, + 0x20, 0x00, 0x20, 0x01, 0x00, 0x00, 0x20, 0xc1, 0x00, 0x04, 0x20, 0xc9, + 0x1b, 0xff, 0x20, 0x59, 0x00, 0x00, 0x2b, 0x78, 0x78, 0x83, 0x00, 0x04, + 0x20, 0x89, 0x2d, 0x93, 0x20, 0x51, 0x18, 0x00, 0x2a, 0x70, 0x20, 0xe1, + 0x00, 0x01, 0x20, 0xe9, 0x00, 0x01, 0x20, 0x09, 0x00, 0x00, 0x08, 0x0c, + 0x0e, 0x52, 0x20, 0x29, 0x4d, 0x00, 0x20, 0x31, 0xff, 0xff, 0x20, 0x39, + 0x4c, 0xd0, 0x20, 0x21, 0x02, 0x00, 0x20, 0xe9, 0x00, 0x01, 0x20, 0xa1, + 0x00, 0x00, 0x20, 0xa9, 0x08, 0x00, 0x90, 0x0e, 0x41, 0x04, 0x20, 0xe9, + 0x00, 0x01, 0x20, 0xa1, 0x10, 0x00, 0x90, 0x0e, 0x20, 0x01, 0x0c, 0xc0, + 0x90, 0x84, 0x0f, 0xff, 0x20, 0xa8, 0x41, 0x04, 0x20, 0x01, 0x00, 0x00, + 0x90, 0x86, 0x00, 0x00, 0x01, 0x20, 0x21, 0xa8, 0x41, 0x04, 0x80, 0x01, + 0x1d, 0xe0, 0x75, 0x6e, 0x76, 0x72, 0x77, 0x6a, 0x74, 0x76, 0x74, 0x7a, + 0x00, 0xe6, 0x20, 0x71, 0x1a, 0xd1, 0x24, 0x72, 0x00, 0xee, 0x20, 0xa1, + 0x1c, 0xd0, 0x71, 0x70, 0x81, 0x0d, 0x81, 0x0d, 0x81, 0x0d, 0x81, 0x0d, + 0x91, 0x8c, 0x00, 0x0f, 0x20, 0x01, 0x00, 0x01, 0x91, 0x12, 0x90, 0x0e, + 0x21, 0xa8, 0x41, 0x04, 0x82, 0x11, 0x1d, 0xe0, 0x71, 0x70, 0x34, 0x00, + 0x80, 0x01, 0x91, 0x02, 0x01, 0x20, 0x02, 0x18, 0x20, 0xa8, 0x90, 0x0e, + 0x41, 0x04, 0x20, 0x09, 0x18, 0x00, 0x81, 0x0d, 0x81, 0x0d, 0x81, 0x0d, + 0x81, 0x0d, 0x81, 0x0d, 0x91, 0x8c, 0x00, 0x1f, 0x20, 0x01, 0x00, 0x01, + 0x91, 0x12, 0x20, 0xe9, 0x00, 0x01, 0x20, 0xa1, 0x08, 0x00, 0x90, 0x0e, + 0x20, 0xa9, 0x08, 0x00, 0x41, 0x04, 0x82, 0x11, 0x1d, 0xd8, 0x08, 0x0c, + 0x0f, 0x26, 0x08, 0x0c, 0x61, 0x3c, 0x08, 0x0c, 0xb2, 0x69, 0x08, 0x0c, + 0x10, 0xdd, 0x08, 0x0c, 0x12, 0xfc, 0x08, 0x0c, 0x1b, 0xd7, 0x08, 0x0c, + 0x0d, 0x57, 0x08, 0x0c, 0x10, 0x62, 0x08, 0x0c, 0x34, 0xb6, 0x08, 0x0c, + 0x79, 0x46, 0x08, 0x0c, 0x6b, 0x7c, 0x08, 0x0c, 0x8a, 0x69, 0x08, 0x0c, + 0x87, 0x4a, 0x08, 0x0c, 0x24, 0xb7, 0x08, 0x0c, 0x93, 0xa5, 0x08, 0x0c, + 0x80, 0x66, 0x08, 0x0c, 0x22, 0xe8, 0x08, 0x0c, 0x24, 0x1c, 0x08, 0x0c, + 0x24, 0xac, 0x20, 0x91, 0x30, 0x09, 0x78, 0x83, 0x00, 0x00, 0x10, 0x04, + 0x09, 0x1f, 0x78, 0x80, 0x90, 0x86, 0x00, 0x02, 0x11, 0x90, 0x78, 0x83, + 0x40, 0x00, 0x78, 0x37, 0x40, 0x00, 0x78, 0x33, 0x00, 0x10, 0x0e, 0x04, + 0x09, 0x13, 0x20, 0x91, 0x50, 0x00, 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, + 0x00, 0x89, 0x20, 0x04, 0xd0, 0x84, 0x19, 0x0c, 0x11, 0xaa, 0x20, 0x71, + 0x18, 0x00, 0x70, 0x03, 0x00, 0x00, 0x20, 0x71, 0x18, 0x00, 0x70, 0x00, + 0x90, 0x8e, 0x00, 0x03, 0x11, 0x78, 0x08, 0x0c, 0x4d, 0x09, 0x08, 0x0c, + 0x34, 0xdd, 0x08, 0x0c, 0x79, 0xb7, 0x08, 0x0c, 0x71, 0x22, 0x08, 0x0c, + 0x8b, 0x50, 0x08, 0x0c, 0x87, 0x76, 0x08, 0x0c, 0x2c, 0xdd, 0x0c, 0x58, + 0x00, 0x0b, 0x0c, 0x78, 0x09, 0x44, 0x09, 0x45, 0x0a, 0xe0, 0x09, 0x42, + 0x0b, 0xa0, 0x0d, 0x56, 0x0d, 0x56, 0x0d, 0x56, 0x08, 0x0c, 0x0d, 0xc5, + 0x00, 0x05, 0x01, 0x26, 0x00, 0xf6, 0x20, 0x91, 0x80, 0x00, 0x70, 0x00, + 0x90, 0x86, 0x00, 0x01, 0x19, 0x04, 0x0a, 0xb3, 0x08, 0x0c, 0x0e, 0x94, + 0x08, 0x0c, 0x76, 0x37, 0x01, 0x50, 0x08, 0x0c, 0x76, 0x5a, 0x15, 0xa0, + 0x20, 0x79, 0x01, 0x00, 0x78, 0x28, 0x90, 0x85, 0x18, 0x00, 0x78, 0x2a, + 0x04, 0x68, 0x08, 0x0c, 0x75, 0x63, 0x70, 0x00, 0x90, 0x86, 0x00, 0x01, + 0x19, 0x04, 0x0a, 0xb3, 0x70, 0x98, 0x90, 0x86, 0x00, 0x29, 0x19, 0x04, + 0x0a, 0xb3, 0x08, 0x0c, 0x87, 0x33, 0x08, 0x0c, 0x87, 0x25, 0x20, 0x01, + 0x01, 0x61, 0x20, 0x03, 0x00, 0x01, 0x20, 0x79, 0x01, 0x00, 0x78, 0x27, + 0xff, 0xff, 0x7a, 0x28, 0x92, 0x95, 0x5e, 0x2f, 0x7a, 0x2a, 0x20, 0x11, + 0x74, 0xb2, 0x08, 0x0c, 0x88, 0x3d, 0x20, 0x11, 0x74, 0xa5, 0x08, 0x0c, + 0x89, 0x17, 0x20, 0x11, 0x5f, 0x97, 0x08, 0x0c, 0x88, 0x3d, 0x20, 0x11, + 0x80, 0x30, 0x90, 0x1e, 0x73, 0x96, 0x04, 0xd0, 0x08, 0x0c, 0x58, 0x3f, + 0x20, 0x79, 0x01, 0x00, 0x78, 0x44, 0x90, 0x05, 0x19, 0x04, 0x0a, 0xb3, + 0x20, 0x11, 0x5f, 0x97, 0x08, 0x0c, 0x88, 0x3d, 0x20, 0x11, 0x74, 0xb2, + 0x08, 0x0c, 0x88, 0x3d, 0x20, 0x11, 0x74, 0xa5, 0x08, 0x0c, 0x89, 0x17, + 0x20, 0x01, 0x02, 0x65, 0x20, 0x01, 0x02, 0x05, 0x20, 0x03, 0x00, 0x00, + 0x78, 0x40, 0x90, 0x84, 0xff, 0xfb, 0x78, 0x42, 0x20, 0x01, 0x19, 0xa7, + 0x20, 0x04, 0x90, 0x05, 0x11, 0x40, 0x00, 0xc6, 0x20, 0x61, 0x01, 0x00, + 0x08, 0x0c, 0x60, 0xe4, 0x00, 0xce, 0x08, 0x04, 0x0a, 0xb3, 0x78, 0x0f, + 0x00, 0x6b, 0x7a, 0x28, 0x08, 0x0c, 0x76, 0x3f, 0x01, 0x18, 0x92, 0x95, + 0x5e, 0x2f, 0x00, 0x10, 0x92, 0x95, 0x40, 0x2f, 0x7a, 0x2a, 0x20, 0x11, + 0x80, 0x10, 0x73, 0xd8, 0x20, 0x01, 0x19, 0xa8, 0x20, 0x03, 0x00, 0x01, + 0x08, 0x0c, 0x2b, 0x82, 0x08, 0x0c, 0x4c, 0x44, 0x72, 0x48, 0xc2, 0x84, + 0x72, 0x4a, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x0c, 0xc1, 0xac, 0xc1, 0xcc, + 0x21, 0x02, 0x08, 0x0c, 0xa9, 0xb0, 0x20, 0x11, 0x00, 0x04, 0x08, 0x0c, + 0xd0, 0xe8, 0x08, 0x0c, 0x69, 0x47, 0x08, 0x0c, 0x76, 0x37, 0x11, 0x20, + 0x08, 0x0c, 0x2b, 0xc6, 0x02, 0xe0, 0x04, 0x00, 0x08, 0x0c, 0x60, 0xeb, + 0x01, 0x40, 0x70, 0x97, 0x00, 0x01, 0x70, 0xd3, 0x00, 0x00, 0x08, 0x0c, + 0x5a, 0x11, 0x08, 0x04, 0x0a, 0xb3, 0x08, 0x0c, 0x57, 0xd5, 0xd0, 0x94, + 0x01, 0x88, 0x20, 0x11, 0x18, 0x0c, 0x22, 0x04, 0xc0, 0xcd, 0x20, 0x12, + 0x08, 0x0c, 0x57, 0xd9, 0xd0, 0xd4, 0x11, 0x18, 0x08, 0x0c, 0x2b, 0xc6, + 0x12, 0x70, 0x20, 0x11, 0x18, 0x0c, 0x22, 0x04, 0xc0, 0xbc, 0x00, 0xa8, + 0x08, 0x0c, 0x57, 0xd9, 0xd0, 0xd4, 0x1d, 0xb8, 0x20, 0x11, 0x18, 0x0c, + 0x22, 0x04, 0xc0, 0xbd, 0x00, 0x60, 0x20, 0x11, 0x18, 0x0c, 0x22, 0x04, + 0xc0, 0xbd, 0x20, 0x12, 0x08, 0x0c, 0x6a, 0x9b, 0x11, 0x28, 0xd0, 0xa4, + 0x01, 0x18, 0x22, 0x04, 0xc0, 0xfd, 0x20, 0x12, 0x08, 0x0c, 0x6a, 0x61, + 0x01, 0x20, 0x7a, 0x0c, 0xc2, 0xb4, 0x7a, 0x0e, 0x00, 0xa8, 0x70, 0x7f, + 0x00, 0x00, 0x08, 0x0c, 0x76, 0x37, 0x11, 0x30, 0x70, 0xb0, 0x90, 0x05, + 0x11, 0x68, 0x08, 0x0c, 0xd5, 0x2b, 0x00, 0x50, 0x08, 0x0c, 0xd5, 0x2b, + 0x70, 0xdc, 0xd0, 0x9c, 0x11, 0x28, 0x70, 0xb0, 0x90, 0x05, 0x01, 0x10, + 0x08, 0x0c, 0x60, 0xc1, 0x70, 0xe7, 0x00, 0x00, 0x70, 0xe3, 0x00, 0x00, + 0x70, 0xa7, 0x00, 0x00, 0x08, 0x0c, 0x2b, 0xce, 0x02, 0x28, 0x20, 0x11, + 0x01, 0x01, 0x22, 0x04, 0xc0, 0xc4, 0x20, 0x12, 0x72, 0xdc, 0x08, 0x0c, + 0x76, 0x37, 0x11, 0x78, 0x90, 0x16, 0x00, 0x16, 0x08, 0x0c, 0x29, 0x8b, + 0x20, 0x19, 0x19, 0x6d, 0x21, 0x1a, 0x00, 0x1e, 0x70, 0x5f, 0xff, 0xff, + 0x70, 0x63, 0x00, 0xef, 0x70, 0x83, 0x00, 0x00, 0x00, 0x20, 0x20, 0x19, + 0x19, 0x6d, 0x20, 0x1b, 0x00, 0x00, 0x20, 0x79, 0x18, 0x47, 0x78, 0x04, + 0xd0, 0xac, 0x01, 0x08, 0xc2, 0x95, 0x72, 0xde, 0x08, 0x0c, 0x76, 0x37, + 0x01, 0x18, 0x92, 0x96, 0x00, 0x04, 0x05, 0x48, 0x20, 0x11, 0x00, 0x01, + 0x08, 0x0c, 0xd0, 0xe8, 0x70, 0xab, 0x00, 0x00, 0x70, 0xaf, 0xff, 0xff, + 0x70, 0x03, 0x00, 0x02, 0x20, 0x79, 0x01, 0x00, 0x78, 0x27, 0x00, 0x03, + 0x78, 0x28, 0x90, 0x85, 0x00, 0x03, 0x78, 0x2a, 0x00, 0xfe, 0x08, 0x0c, + 0x30, 0x00, 0x20, 0x11, 0x00, 0x05, 0x08, 0x0c, 0xaa, 0xbf, 0x08, 0x0c, + 0x9a, 0xb1, 0x08, 0x0c, 0x76, 0x37, 0x01, 0x48, 0x00, 0xc6, 0x20, 0x61, + 0x01, 0x00, 0x00, 0x16, 0x08, 0x0c, 0x29, 0x8b, 0x61, 0xe2, 0x00, 0x1e, + 0x00, 0xce, 0x01, 0x2e, 0x04, 0x20, 0x70, 0xab, 0x00, 0x00, 0x70, 0xaf, + 0xff, 0xff, 0x70, 0x03, 0x00, 0x02, 0x00, 0xf6, 0x20, 0x79, 0x01, 0x00, + 0x78, 0x27, 0x00, 0x03, 0x78, 0x28, 0x90, 0x85, 0x00, 0x03, 0x78, 0x2a, + 0x00, 0xfe, 0x20, 0x11, 0x00, 0x05, 0x08, 0x0c, 0xaa, 0xbf, 0x08, 0x0c, + 0x9a, 0xb1, 0x08, 0x0c, 0x76, 0x37, 0x01, 0x48, 0x00, 0xc6, 0x20, 0x61, + 0x01, 0x00, 0x00, 0x16, 0x08, 0x0c, 0x29, 0x8b, 0x61, 0xe2, 0x00, 0x1e, + 0x00, 0xce, 0x00, 0xfe, 0x01, 0x2e, 0x00, 0x05, 0x00, 0xc6, 0x00, 0xb6, + 0x08, 0x0c, 0x76, 0x37, 0x11, 0x18, 0x20, 0xa9, 0x08, 0x00, 0x00, 0x10, + 0x20, 0xa9, 0x07, 0x82, 0x08, 0x0c, 0x76, 0x37, 0x11, 0x10, 0x90, 0x0e, + 0x00, 0x10, 0x20, 0x09, 0x00, 0x7e, 0x86, 0xff, 0x01, 0x38, 0x91, 0x80, + 0x10, 0x00, 0x20, 0x04, 0x90, 0x5d, 0x01, 0x10, 0xb8, 0x00, 0xd0, 0xbc, + 0x09, 0x0c, 0x33, 0x4c, 0x81, 0x08, 0x1f, 0x04, 0x0a, 0xc7, 0x70, 0x7f, + 0x00, 0x00, 0x70, 0x80, 0x90, 0x84, 0x00, 0xff, 0x70, 0x82, 0x70, 0xb3, + 0x00, 0x00, 0x00, 0xbe, 0x00, 0xce, 0x00, 0x05, 0x00, 0xb6, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x70, 0x00, 0x90, 0x86, 0x00, 0x02, 0x19, 0x04, + 0x0b, 0x9d, 0x70, 0xac, 0x90, 0x86, 0xff, 0xff, 0x01, 0x30, 0x08, 0x0c, + 0x30, 0x00, 0x08, 0x0c, 0x9a, 0xb1, 0x08, 0x04, 0x0b, 0x9d, 0x70, 0xdc, + 0xd0, 0xac, 0x11, 0x10, 0xd0, 0x9c, 0x05, 0x58, 0xd0, 0x84, 0x05, 0x48, + 0x00, 0x06, 0x20, 0x01, 0x01, 0x03, 0x20, 0x03, 0x00, 0x2b, 0x00, 0x0e, + 0xd0, 0x8c, 0x05, 0x08, 0x08, 0x0c, 0x33, 0xaf, 0x11, 0xd0, 0x70, 0xe0, + 0x90, 0x86, 0xff, 0xff, 0x01, 0xb0, 0x08, 0x0c, 0x31, 0xbc, 0x08, 0x0c, + 0x9a, 0xb1, 0x70, 0xdc, 0xd0, 0x94, 0x19, 0x04, 0x0b, 0x9d, 0x20, 0x11, + 0x00, 0x01, 0x08, 0x0c, 0xd7, 0xe3, 0x01, 0x10, 0x20, 0x11, 0x00, 0x03, + 0x90, 0x1e, 0x08, 0x0c, 0x31, 0xf6, 0x08, 0x0c, 0x9a, 0xb1, 0x08, 0x04, + 0x0b, 0x9d, 0x70, 0xe4, 0x90, 0x05, 0x19, 0x04, 0x0b, 0x9d, 0x70, 0xa8, + 0x90, 0x05, 0x19, 0x04, 0x0b, 0x9d, 0x70, 0xdc, 0xd0, 0xa4, 0x01, 0x18, + 0xd0, 0xb4, 0x09, 0x04, 0x0b, 0x9d, 0x08, 0x0c, 0x6a, 0x61, 0x19, 0x04, + 0x0b, 0x9d, 0x08, 0x0c, 0x6a, 0xb4, 0x19, 0x04, 0x0b, 0x9d, 0x08, 0x0c, + 0x6a, 0x9b, 0x01, 0xc0, 0x01, 0x56, 0x00, 0xc6, 0x20, 0xa9, 0x00, 0x7f, + 0x90, 0x0e, 0x00, 0x16, 0x08, 0x0c, 0x67, 0x24, 0x11, 0x18, 0xb8, 0x00, + 0xd0, 0xec, 0x11, 0x38, 0x00, 0x1e, 0x81, 0x08, 0x1f, 0x04, 0x0b, 0x3d, + 0x00, 0xce, 0x01, 0x5e, 0x00, 0x28, 0x00, 0x1e, 0x00, 0xce, 0x01, 0x5e, + 0x08, 0x04, 0x0b, 0x9d, 0x00, 0x06, 0x20, 0x01, 0x01, 0x03, 0x20, 0x03, + 0x00, 0x2b, 0x00, 0x0e, 0x20, 0x11, 0x19, 0xb4, 0x08, 0x0c, 0x0f, 0x96, + 0x20, 0x11, 0x19, 0xce, 0x08, 0x0c, 0x0f, 0x96, 0x70, 0x30, 0xc0, 0x8c, + 0x70, 0x32, 0x70, 0x03, 0x00, 0x03, 0x70, 0xaf, 0xff, 0xff, 0x08, 0x0c, + 0x0e, 0x76, 0x90, 0x06, 0x08, 0x0c, 0x28, 0x1c, 0x08, 0x0c, 0x33, 0xaf, + 0x01, 0x18, 0x08, 0x0c, 0x4d, 0xe1, 0x00, 0x50, 0x00, 0x36, 0x00, 0x46, + 0x20, 0x19, 0xff, 0xff, 0x20, 0x21, 0x00, 0x06, 0x08, 0x0c, 0x4d, 0xfb, + 0x00, 0x4e, 0x00, 0x3e, 0x00, 0xf6, 0x20, 0x79, 0x01, 0x00, 0x08, 0x0c, + 0x76, 0x5a, 0x01, 0x50, 0x08, 0x0c, 0x76, 0x37, 0x78, 0x28, 0x01, 0x18, + 0x90, 0x84, 0xe1, 0xff, 0x00, 0x10, 0x90, 0x84, 0xff, 0xdf, 0x78, 0x2a, + 0x00, 0xfe, 0x20, 0x01, 0x19, 0xe9, 0x20, 0x04, 0x90, 0x86, 0x00, 0x05, + 0x11, 0x20, 0x20, 0x11, 0x00, 0x00, 0x08, 0x0c, 0xaa, 0xbf, 0x20, 0x11, + 0x00, 0x00, 0x08, 0x0c, 0xaa, 0xc9, 0x08, 0x0c, 0x9a, 0xb1, 0x08, 0x0c, + 0x9b, 0xd3, 0x01, 0x2e, 0x00, 0xbe, 0x00, 0x05, 0x00, 0x16, 0x00, 0x46, + 0x00, 0xf6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x79, 0x01, 0x00, + 0x79, 0x04, 0x91, 0x8c, 0xff, 0xfd, 0x79, 0x06, 0x20, 0x09, 0x00, 0xf7, + 0x08, 0x0c, 0x60, 0xaa, 0x79, 0x40, 0x91, 0x8c, 0x00, 0x10, 0x79, 0x42, + 0x79, 0x24, 0xd1, 0xb4, 0x01, 0x10, 0x78, 0x27, 0x00, 0x40, 0xd1, 0x9c, + 0x01, 0x10, 0x78, 0x27, 0x00, 0x08, 0x00, 0x06, 0x00, 0x36, 0x01, 0x56, + 0x79, 0x54, 0xd1, 0xac, 0x19, 0x04, 0x0c, 0x2d, 0x20, 0x01, 0x19, 0xa8, + 0x20, 0x04, 0x90, 0x05, 0x15, 0x18, 0x08, 0x0c, 0x2c, 0x49, 0x11, 0x48, + 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x2b, 0xb1, 0x20, 0x01, 0x00, 0x01, + 0x08, 0x0c, 0x2b, 0x94, 0x00, 0xb8, 0x08, 0x0c, 0x2c, 0x51, 0x11, 0x38, + 0x90, 0x06, 0x08, 0x0c, 0x2b, 0xb1, 0x90, 0x06, 0x08, 0x0c, 0x2b, 0x94, + 0x00, 0x68, 0x08, 0x0c, 0x2c, 0x59, 0x1d, 0x50, 0x20, 0x01, 0x19, 0x98, + 0x20, 0x04, 0xd0, 0xfc, 0x01, 0x08, 0x00, 0x20, 0x08, 0x0c, 0x29, 0xbf, + 0x08, 0x04, 0x0d, 0x0d, 0x08, 0x0c, 0x76, 0x48, 0x01, 0x48, 0x08, 0x0c, + 0x76, 0x5a, 0x11, 0x18, 0x08, 0x0c, 0x79, 0x41, 0x00, 0x50, 0x08, 0x0c, + 0x76, 0x3f, 0x0d, 0xd0, 0x08, 0x0c, 0x79, 0x3c, 0x08, 0x0c, 0x79, 0x32, + 0x08, 0x0c, 0x75, 0x63, 0x00, 0x58, 0x08, 0x0c, 0x76, 0x37, 0x01, 0x40, + 0x20, 0x09, 0x00, 0xf8, 0x08, 0x0c, 0x60, 0xaa, 0x78, 0x43, 0x00, 0x90, + 0x78, 0x43, 0x00, 0x10, 0x20, 0xa9, 0x09, 0xc4, 0x78, 0x20, 0xd0, 0x9c, + 0x11, 0x38, 0x08, 0x0c, 0x76, 0x37, 0x01, 0x38, 0x78, 0x24, 0xd0, 0xac, + 0x19, 0x04, 0x0d, 0x12, 0x1f, 0x04, 0x0c, 0x0c, 0x00, 0x70, 0x78, 0x24, + 0x08, 0x0c, 0x76, 0x51, 0x01, 0x18, 0xd0, 0xac, 0x19, 0x04, 0x0d, 0x12, + 0x90, 0x84, 0x18, 0x00, 0x0d, 0x98, 0x70, 0x03, 0x00, 0x01, 0x08, 0x04, + 0x0d, 0x12, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x28, 0x1c, 0x08, 0x04, + 0x0d, 0x25, 0x20, 0x01, 0x19, 0xa8, 0x20, 0x04, 0x90, 0x05, 0x15, 0x18, + 0x08, 0x0c, 0x2c, 0x49, 0x11, 0x48, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, + 0x2b, 0xb1, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x2b, 0x94, 0x00, 0xb8, + 0x08, 0x0c, 0x2c, 0x51, 0x11, 0x38, 0x90, 0x06, 0x08, 0x0c, 0x2b, 0xb1, + 0x90, 0x06, 0x08, 0x0c, 0x2b, 0x94, 0x00, 0x68, 0x08, 0x0c, 0x2c, 0x59, + 0x1d, 0x50, 0x20, 0x01, 0x19, 0x98, 0x20, 0x04, 0xd0, 0xfc, 0x01, 0x08, + 0x00, 0x20, 0x08, 0x0c, 0x29, 0xbf, 0x08, 0x04, 0x0d, 0x0d, 0x78, 0x50, + 0x90, 0x85, 0x00, 0x40, 0x78, 0x52, 0x79, 0x38, 0x78, 0x50, 0x90, 0x84, + 0xfb, 0xcf, 0x78, 0x52, 0x08, 0x0c, 0x2c, 0x61, 0x90, 0x85, 0x20, 0x00, + 0x78, 0x52, 0x79, 0x3a, 0x20, 0xa9, 0x00, 0x46, 0x1d, 0x04, 0x0c, 0x66, + 0x08, 0x0c, 0x88, 0xf7, 0x1f, 0x04, 0x0c, 0x66, 0x78, 0x50, 0x90, 0x85, + 0x04, 0x00, 0x90, 0x84, 0xdf, 0xbf, 0x78, 0x52, 0x79, 0x3a, 0x08, 0x0c, + 0x76, 0x48, 0x01, 0x48, 0x08, 0x0c, 0x76, 0x5a, 0x11, 0x18, 0x08, 0x0c, + 0x79, 0x41, 0x00, 0x50, 0x08, 0x0c, 0x76, 0x3f, 0x0d, 0xd0, 0x08, 0x0c, + 0x79, 0x3c, 0x08, 0x0c, 0x79, 0x32, 0x08, 0x0c, 0x75, 0x63, 0x00, 0x20, + 0x20, 0x09, 0x00, 0xf8, 0x08, 0x0c, 0x60, 0xaa, 0x20, 0xa9, 0x00, 0x28, + 0xa0, 0x01, 0x1f, 0x04, 0x0c, 0x8c, 0x78, 0x50, 0x90, 0x85, 0x14, 0x00, + 0x78, 0x52, 0x08, 0x0c, 0x76, 0x37, 0x01, 0x20, 0x78, 0x43, 0x00, 0x90, + 0x78, 0x43, 0x00, 0x10, 0x20, 0x21, 0xe6, 0x78, 0x20, 0x19, 0xea, 0x60, + 0x0d, 0x0c, 0x88, 0xf7, 0x78, 0x20, 0xd0, 0x9c, 0x15, 0x88, 0x08, 0x0c, + 0x76, 0x37, 0x09, 0x04, 0x0c, 0xf2, 0x78, 0x24, 0xd0, 0xac, 0x19, 0x04, + 0x0d, 0x12, 0x08, 0x0c, 0x76, 0x5a, 0x15, 0x30, 0x00, 0x46, 0x20, 0x21, + 0x03, 0x20, 0x84, 0x21, 0x1d, 0xf0, 0x00, 0x4e, 0x78, 0x27, 0x18, 0x00, + 0x08, 0x0c, 0x2c, 0x61, 0x78, 0x24, 0x90, 0x84, 0x18, 0x00, 0x11, 0x68, + 0x94, 0x84, 0x0f, 0xff, 0x11, 0x40, 0x20, 0x01, 0x18, 0x10, 0x20, 0x04, + 0x90, 0x84, 0x90, 0x00, 0x01, 0x10, 0x08, 0x0c, 0x0d, 0x33, 0x84, 0x21, + 0x11, 0x58, 0x1d, 0x04, 0x0c, 0xcd, 0x08, 0x0c, 0x88, 0xf7, 0x08, 0x0c, + 0x79, 0x3c, 0x08, 0x0c, 0x79, 0x32, 0x70, 0x03, 0x00, 0x01, 0x04, 0xf0, + 0x83, 0x19, 0x19, 0x40, 0x1d, 0x04, 0x0c, 0xda, 0x08, 0x0c, 0x88, 0xf7, + 0x20, 0x09, 0x19, 0x9b, 0x21, 0x04, 0x90, 0x05, 0x01, 0x18, 0x80, 0x01, + 0x20, 0x0a, 0x11, 0x78, 0x20, 0x0b, 0x00, 0x0a, 0x78, 0x27, 0x00, 0x48, + 0x20, 0xa9, 0x00, 0x02, 0x08, 0x0c, 0x2c, 0x42, 0x79, 0x24, 0x08, 0x0c, + 0x2c, 0x61, 0xd1, 0x9c, 0x01, 0x10, 0x08, 0x0c, 0x2b, 0x82, 0x00, 0xd8, + 0x08, 0x0c, 0x76, 0x48, 0x11, 0x40, 0x94, 0xa2, 0x03, 0xe8, 0x11, 0x28, + 0x08, 0x0c, 0x76, 0x0f, 0x70, 0x03, 0x00, 0x01, 0x00, 0xa8, 0x78, 0x27, + 0x18, 0x00, 0x08, 0x0c, 0x2c, 0x61, 0x78, 0x24, 0x08, 0x0c, 0x76, 0x51, + 0x01, 0x10, 0xd0, 0xac, 0x11, 0x58, 0x90, 0x84, 0x18, 0x00, 0x09, 0x50, + 0x70, 0x03, 0x00, 0x01, 0x00, 0x28, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, + 0x28, 0x1c, 0x00, 0x78, 0x20, 0x09, 0x18, 0x0c, 0x21, 0x0c, 0xd1, 0x9c, + 0x11, 0x20, 0x79, 0x04, 0x91, 0x8d, 0x00, 0x02, 0x79, 0x06, 0x78, 0x27, + 0x00, 0x48, 0x78, 0x28, 0x90, 0x85, 0x00, 0x28, 0x78, 0x2a, 0x78, 0x50, + 0x90, 0x85, 0x04, 0x00, 0x78, 0x52, 0x20, 0x01, 0x19, 0xa8, 0x20, 0x03, + 0x00, 0x00, 0x90, 0x06, 0x78, 0xf2, 0x01, 0x5e, 0x00, 0x3e, 0x00, 0x0e, + 0x01, 0x2e, 0x00, 0xfe, 0x00, 0x4e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0x06, + 0x00, 0x16, 0x00, 0x36, 0x00, 0x46, 0x00, 0xb6, 0x00, 0xc6, 0x00, 0xd6, + 0x00, 0xe6, 0x00, 0xf6, 0x01, 0x56, 0x00, 0x69, 0x0d, 0x0c, 0x88, 0xf7, + 0x01, 0x5e, 0x00, 0xfe, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x00, 0xbe, + 0x00, 0x4e, 0x00, 0x3e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, 0x00, 0xe6, + 0x20, 0x71, 0x18, 0x9e, 0x70, 0x04, 0x90, 0x86, 0x00, 0x01, 0x11, 0x10, + 0x08, 0x0c, 0x34, 0xdd, 0x00, 0xee, 0x00, 0x05, 0x00, 0x05, 0x2a, 0x70, + 0x20, 0x61, 0x19, 0xac, 0x20, 0x63, 0x00, 0x03, 0x60, 0x07, 0x00, 0x03, + 0x60, 0x0b, 0x00, 0x14, 0x60, 0x0f, 0x01, 0x37, 0x20, 0x01, 0x19, 0x7c, + 0x90, 0x0e, 0x21, 0x02, 0x71, 0x96, 0x20, 0x01, 0x01, 0x00, 0x20, 0x04, + 0x90, 0x82, 0x00, 0x02, 0x02, 0x18, 0x70, 0x5f, 0xff, 0xff, 0x00, 0x08, + 0x71, 0x5e, 0x70, 0x67, 0xff, 0xff, 0x71, 0x7e, 0x71, 0x82, 0x08, 0x0c, + 0xd5, 0x2b, 0x70, 0xeb, 0x00, 0xc0, 0x20, 0x61, 0x19, 0x6c, 0x60, 0x03, + 0x09, 0x09, 0x61, 0x06, 0x60, 0x0b, 0x88, 0x00, 0x60, 0x0f, 0x02, 0x00, + 0x60, 0x13, 0x00, 0xff, 0x60, 0x17, 0x00, 0x1f, 0x61, 0x1a, 0x60, 0x1f, + 0x07, 0xd0, 0x20, 0x61, 0x19, 0x74, 0x60, 0x03, 0x80, 0x00, 0x61, 0x06, + 0x61, 0x0a, 0x60, 0x0f, 0x02, 0x00, 0x60, 0x13, 0x00, 0xff, 0x61, 0x16, + 0x60, 0x1b, 0x00, 0x01, 0x61, 0x1e, 0x20, 0x61, 0x19, 0x89, 0x60, 0x03, + 0x51, 0x4c, 0x60, 0x07, 0x4f, 0x47, 0x60, 0x0b, 0x49, 0x43, 0x60, 0x0f, + 0x20, 0x20, 0x20, 0x01, 0x18, 0x2c, 0x21, 0x02, 0x00, 0x05, 0x90, 0x16, + 0x08, 0x0c, 0x67, 0x24, 0x11, 0x78, 0xb8, 0x04, 0x90, 0xc4, 0x00, 0xff, + 0x98, 0xc6, 0x00, 0x06, 0x01, 0x28, 0x90, 0xc4, 0xff, 0x00, 0x98, 0xc6, + 0x06, 0x00, 0x11, 0x20, 0x91, 0x86, 0x00, 0x80, 0x01, 0x08, 0x82, 0x10, + 0x81, 0x08, 0x91, 0x86, 0x08, 0x00, 0x1d, 0x50, 0x22, 0x08, 0x00, 0x05, + 0x20, 0x91, 0x80, 0x00, 0x20, 0x79, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xf6, + 0x00, 0x10, 0x20, 0x91, 0x80, 0x00, 0x0e, 0x04, 0x0d, 0xc7, 0x00, 0x06, + 0x00, 0x16, 0x20, 0x01, 0x80, 0x02, 0x00, 0x06, 0x20, 0x79, 0x00, 0x00, + 0x00, 0x0e, 0x78, 0x82, 0x78, 0x36, 0x00, 0x1e, 0x79, 0x8e, 0x00, 0x0e, + 0x78, 0x8a, 0x00, 0x0e, 0x78, 0x86, 0x39, 0x00, 0x78, 0x9a, 0x00, 0xd6, + 0x20, 0x69, 0x03, 0x00, 0x68, 0x18, 0x78, 0xae, 0x68, 0x1c, 0x78, 0xb2, + 0x20, 0x01, 0x1a, 0x09, 0x20, 0x04, 0x78, 0xb6, 0x20, 0x01, 0x1a, 0x86, + 0x20, 0x04, 0x78, 0xba, 0x68, 0x08, 0x78, 0xbe, 0x00, 0xde, 0x78, 0x33, + 0x00, 0x12, 0x20, 0x91, 0x50, 0x00, 0x01, 0x56, 0x00, 0xd6, 0x00, 0x36, + 0x00, 0x26, 0x20, 0x79, 0x03, 0x00, 0x20, 0x69, 0x1a, 0xa9, 0x7a, 0x08, + 0x22, 0x6a, 0x20, 0x69, 0x1a, 0xaa, 0x7a, 0x18, 0x22, 0x6a, 0x8d, 0x68, + 0x7a, 0x1c, 0x22, 0x6a, 0x78, 0x2c, 0x20, 0x19, 0x1a, 0xb7, 0x20, 0x1a, + 0x20, 0x19, 0x1a, 0xba, 0x90, 0x16, 0x78, 0x08, 0xd0, 0x9c, 0x01, 0x68, + 0x78, 0x20, 0x20, 0x1a, 0x82, 0x10, 0x83, 0x18, 0x93, 0x86, 0x1a, 0xcf, + 0x01, 0x08, 0x0c, 0xa8, 0x78, 0x08, 0xd0, 0x9c, 0x01, 0x10, 0x20, 0x11, + 0xde, 0xad, 0x20, 0x19, 0x1a, 0xb8, 0x78, 0x2c, 0x20, 0x1a, 0x83, 0x18, + 0x22, 0x1a, 0x78, 0x03, 0x00, 0x00, 0x20, 0x69, 0x1a, 0x89, 0x90, 0x1e, + 0x20, 0xa9, 0x00, 0x20, 0x7b, 0x26, 0x7a, 0x28, 0x22, 0x6a, 0x8d, 0x68, + 0x83, 0x18, 0x1f, 0x04, 0x0e, 0x26, 0x00, 0x2e, 0x00, 0x3e, 0x00, 0xde, + 0x01, 0x5e, 0x20, 0x79, 0x18, 0x00, 0x78, 0x03, 0x00, 0x05, 0x20, 0x91, + 0x40, 0x80, 0x20, 0x01, 0x00, 0x89, 0x20, 0x04, 0xd0, 0x84, 0x01, 0x80, + 0x20, 0x01, 0x1a, 0x1c, 0x20, 0x04, 0x90, 0x05, 0x01, 0x28, 0x20, 0x01, + 0x00, 0x8b, 0x20, 0x04, 0xd0, 0xfc, 0x0d, 0xd8, 0x20, 0x01, 0x00, 0x8a, + 0x20, 0x03, 0x00, 0x02, 0x20, 0x03, 0x10, 0x01, 0x08, 0x0c, 0x57, 0xe4, + 0x11, 0x08, 0x00, 0x99, 0x0c, 0xd8, 0x00, 0x05, 0x91, 0x8c, 0x03, 0xff, + 0x20, 0x01, 0x00, 0x03, 0x20, 0x04, 0x90, 0x84, 0x06, 0x00, 0x11, 0x18, + 0x91, 0x8d, 0x28, 0x00, 0x00, 0x10, 0x91, 0x8d, 0x20, 0x00, 0x20, 0x01, + 0x01, 0x7f, 0x21, 0x02, 0x00, 0x05, 0x00, 0x26, 0x01, 0x26, 0x20, 0x11, + 0x00, 0x80, 0x08, 0x0c, 0x0e, 0xee, 0x20, 0xa9, 0x09, 0x00, 0x08, 0x0c, + 0x0f, 0x0f, 0x20, 0x11, 0x00, 0x40, 0x08, 0x0c, 0x0e, 0xee, 0x20, 0xa9, + 0x09, 0x00, 0x08, 0x0c, 0x0f, 0x0f, 0x0c, 0x78, 0x00, 0x26, 0x08, 0x0c, + 0x0e, 0xfb, 0x11, 0x18, 0x20, 0x11, 0x00, 0x40, 0x00, 0x98, 0x20, 0x11, + 0x01, 0x0e, 0x22, 0x14, 0x92, 0x94, 0x00, 0x07, 0x92, 0x96, 0x00, 0x07, + 0x01, 0x18, 0x20, 0x11, 0xa8, 0x80, 0x00, 0x10, 0x20, 0x11, 0x68, 0x40, + 0xd0, 0xe4, 0x70, 0xef, 0x00, 0x00, 0x11, 0x20, 0x70, 0xef, 0x0f, 0xa0, + 0x08, 0x0c, 0x0f, 0x00, 0x00, 0x2e, 0x00, 0x05, 0x00, 0x26, 0x08, 0x0c, + 0x0e, 0xfb, 0x01, 0x28, 0xd0, 0xa4, 0x11, 0x38, 0x20, 0x11, 0xcd, 0xd5, + 0x00, 0x10, 0x20, 0x11, 0x00, 0x80, 0x08, 0x0c, 0x0f, 0x00, 0x00, 0x2e, + 0x00, 0x05, 0x00, 0x26, 0x70, 0xef, 0x00, 0x00, 0x08, 0x0c, 0x0e, 0xfb, + 0x11, 0x48, 0x08, 0x0c, 0x2c, 0x59, 0x11, 0x18, 0x20, 0x11, 0x84, 0x84, + 0x00, 0x58, 0x20, 0x11, 0x82, 0x82, 0x00, 0x40, 0x08, 0x0c, 0x2c, 0x59, + 0x11, 0x18, 0x20, 0x11, 0xcd, 0xc5, 0x00, 0x10, 0x20, 0x11, 0xca, 0xc2, + 0x08, 0x0c, 0x0f, 0x00, 0x00, 0x2e, 0x00, 0x05, 0x00, 0xe6, 0x00, 0x06, + 0x20, 0x71, 0x18, 0x00, 0xd0, 0xb4, 0x70, 0xe8, 0x11, 0x10, 0xc0, 0xe4, + 0x00, 0x48, 0x00, 0x06, 0x3b, 0x00, 0x90, 0x84, 0xff, 0x3f, 0x20, 0xd8, + 0x00, 0x0e, 0x70, 0xef, 0x00, 0x00, 0xc0, 0xe5, 0x00, 0x79, 0x00, 0x0e, + 0x00, 0xee, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0x18, 0x00, 0xd0, 0xe4, + 0x70, 0xe8, 0x11, 0x10, 0xc0, 0xdc, 0x00, 0x08, 0xc0, 0xdd, 0x00, 0x11, + 0x00, 0xee, 0x00, 0x05, 0x70, 0xea, 0x70, 0x00, 0x90, 0x84, 0x00, 0x07, + 0x00, 0x0b, 0x00, 0x05, 0x0e, 0xbd, 0x0e, 0x94, 0x0e, 0x94, 0x0e, 0x76, + 0x0e, 0xa3, 0x0e, 0x94, 0x0e, 0x94, 0x0e, 0xa3, 0x00, 0x16, 0x3b, 0x08, + 0x3a, 0x00, 0x91, 0x04, 0x91, 0x8d, 0x00, 0xc0, 0x21, 0xd8, 0x90, 0x84, + 0xff, 0x3f, 0x92, 0x05, 0x20, 0xd0, 0x00, 0x1e, 0x00, 0x05, 0x20, 0x01, + 0x18, 0x3a, 0x20, 0x04, 0xd0, 0xdc, 0x00, 0x05, 0x9e, 0x86, 0x18, 0x00, + 0x19, 0x0c, 0x0d, 0xc5, 0x70, 0xe8, 0xd0, 0xe4, 0x01, 0x08, 0xc2, 0xe5, + 0x72, 0xea, 0xd0, 0xe4, 0x11, 0x18, 0x92, 0x94, 0x00, 0xc0, 0x0c, 0x01, + 0x00, 0x05, 0x1d, 0x04, 0x0f, 0x0f, 0x20, 0x91, 0x60, 0x00, 0x1f, 0x04, + 0x0f, 0x0f, 0x00, 0x05, 0x89, 0x0e, 0x81, 0x0e, 0x81, 0x0f, 0x91, 0x94, + 0x00, 0x3f, 0x91, 0x8c, 0xff, 0xc0, 0x00, 0x05, 0x00, 0x06, 0x22, 0x00, + 0x91, 0x4d, 0x89, 0x4f, 0x89, 0x4d, 0x89, 0x4d, 0x00, 0x0e, 0x00, 0x05, + 0x01, 0xd6, 0x01, 0x46, 0x00, 0x36, 0x00, 0x96, 0x20, 0x61, 0x18, 0x8d, + 0x60, 0x0b, 0x00, 0x00, 0x60, 0x0f, 0x00, 0x00, 0x60, 0x03, 0x00, 0x00, + 0x60, 0x07, 0x00, 0x00, 0x20, 0x09, 0xff, 0xc0, 0x21, 0x05, 0x00, 0x06, + 0x20, 0x01, 0xaa, 0xaa, 0x20, 0x0f, 0x20, 0x19, 0x55, 0x55, 0x90, 0x16, + 0x20, 0x49, 0x0b, 0xff, 0xab, 0x02, 0xa0, 0x01, 0xa0, 0x01, 0xa8, 0x00, + 0x93, 0x06, 0x11, 0x38, 0x21, 0x05, 0x93, 0x06, 0x01, 0x20, 0x82, 0x10, + 0x99, 0xc8, 0x04, 0x00, 0x0c, 0x98, 0x00, 0x0e, 0x20, 0x0f, 0x20, 0x01, + 0x18, 0x9d, 0x92, 0x8a, 0x00, 0x0e, 0x16, 0x38, 0x92, 0x8a, 0x00, 0x06, + 0x20, 0x11, 0x00, 0x06, 0x12, 0x10, 0x20, 0x11, 0x00, 0x00, 0x22, 0x02, + 0x90, 0x06, 0x20, 0x08, 0x82, 0xff, 0x01, 0xb0, 0x82, 0x00, 0x60, 0x0a, + 0x60, 0x0f, 0xff, 0xff, 0x60, 0x03, 0x00, 0x02, 0x60, 0x07, 0x00, 0x00, + 0x00, 0x26, 0x20, 0x19, 0x00, 0x10, 0x92, 0x80, 0x00, 0x01, 0x20, 0xe8, + 0x21, 0xa0, 0x21, 0xa8, 0x41, 0x04, 0x83, 0x19, 0x1d, 0xe0, 0x82, 0x11, + 0x1d, 0xa0, 0x00, 0x2e, 0x00, 0x9e, 0x00, 0x3e, 0x01, 0x4e, 0x01, 0xde, + 0x00, 0x05, 0x20, 0x11, 0x00, 0x0e, 0x08, 0xe8, 0x00, 0x16, 0x00, 0x26, + 0x00, 0x96, 0x33, 0x48, 0x08, 0x0c, 0x0f, 0x16, 0x21, 0x00, 0x93, 0x00, + 0x20, 0x98, 0x22, 0xe0, 0x00, 0x9e, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x36, + 0x35, 0x18, 0x20, 0xa9, 0x00, 0x01, 0x40, 0x02, 0x80, 0x07, 0x40, 0x04, + 0x83, 0x19, 0x1d, 0xd8, 0x00, 0x3e, 0x00, 0x05, 0x20, 0xe9, 0x00, 0x01, + 0x71, 0xb8, 0x81, 0xff, 0x11, 0xc0, 0x90, 0x06, 0x20, 0x09, 0x02, 0x00, + 0x20, 0xa9, 0x00, 0x02, 0x92, 0x98, 0x00, 0x18, 0x23, 0xa0, 0x40, 0x01, + 0x20, 0x09, 0x07, 0x00, 0x20, 0xa9, 0x00, 0x02, 0x92, 0x98, 0x00, 0x08, + 0x23, 0xa0, 0x40, 0x01, 0x70, 0x7c, 0x80, 0x07, 0x71, 0x80, 0x81, 0x0f, + 0x20, 0xa9, 0x00, 0x02, 0x40, 0x01, 0x92, 0x98, 0x00, 0x0c, 0x23, 0xa0, + 0x90, 0x0e, 0x08, 0x0c, 0x0d, 0xa5, 0x20, 0x01, 0x00, 0x00, 0x81, 0x0f, + 0x20, 0xa9, 0x00, 0x02, 0x40, 0x01, 0x00, 0x05, 0x89, 0xff, 0x01, 0x40, + 0xa8, 0x04, 0xa8, 0x07, 0x00, 0x00, 0x00, 0x06, 0x08, 0x0c, 0x10, 0x40, + 0x00, 0x9e, 0x0c, 0xb0, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0x18, 0x00, + 0x08, 0x0c, 0x10, 0xb9, 0x09, 0x0c, 0x0d, 0xc5, 0x00, 0xee, 0x00, 0x05, + 0x00, 0x86, 0x00, 0xe6, 0x00, 0x06, 0x00, 0x26, 0x00, 0x36, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x00, 0xc9, 0x20, 0x71, 0x18, 0x00, 0x73, 0xc0, + 0x70, 0x2c, 0x90, 0x16, 0x90, 0x45, 0x01, 0x58, 0x82, 0x10, 0x99, 0x06, + 0x09, 0x0c, 0x0d, 0xc5, 0x23, 0x00, 0x92, 0x02, 0x01, 0x20, 0x1a, 0x0c, + 0x0d, 0xc5, 0xa0, 0x00, 0x0c, 0x98, 0x01, 0x2e, 0x00, 0x3e, 0x00, 0x2e, + 0x00, 0x0e, 0x00, 0xee, 0x00, 0x8e, 0x00, 0x05, 0x00, 0x86, 0x00, 0xe6, + 0x00, 0x06, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0x19, 0x10, + 0x70, 0x10, 0x90, 0x05, 0x01, 0x40, 0x70, 0x18, 0x90, 0x45, 0x01, 0x28, + 0x99, 0x06, 0x09, 0x0c, 0x0d, 0xc5, 0xa0, 0x00, 0x0c, 0xc8, 0x01, 0x2e, + 0x00, 0x0e, 0x00, 0xee, 0x00, 0x8e, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, + 0x18, 0x00, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x70, 0xc0, 0x80, 0x01, + 0x02, 0x70, 0x70, 0xc2, 0x70, 0x2c, 0x20, 0x48, 0x90, 0x85, 0x00, 0x01, + 0xa8, 0x00, 0x70, 0x2e, 0xa8, 0x03, 0x00, 0x00, 0xa8, 0x07, 0x00, 0x00, + 0x01, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x90, 0x4e, 0x0c, 0xd8, 0x00, 0xe6, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0x18, 0x00, 0x70, 0xc0, + 0x90, 0xca, 0x00, 0x20, 0x02, 0x68, 0x80, 0x01, 0x70, 0xc2, 0x70, 0x2c, + 0x20, 0x48, 0xa8, 0x00, 0x70, 0x2e, 0xa8, 0x03, 0x00, 0x00, 0xa8, 0x07, + 0x00, 0x00, 0x01, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x90, 0x4e, 0x0c, 0xd8, + 0x00, 0xe6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0x16, 0x89, 0x0e, + 0x81, 0x0e, 0x81, 0x0f, 0x91, 0x84, 0x00, 0x3f, 0xa8, 0x62, 0x91, 0x84, + 0xff, 0xc0, 0xa8, 0x5e, 0x00, 0x1e, 0x00, 0x20, 0x00, 0xe6, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0x18, 0x00, 0x70, 0x2c, 0xa8, 0x02, + 0x29, 0x00, 0x70, 0x2e, 0x70, 0xc0, 0x80, 0x00, 0x70, 0xc2, 0x08, 0x0c, + 0x87, 0x25, 0x01, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x20, 0x71, 0x18, 0x00, + 0x90, 0x26, 0x20, 0x09, 0x00, 0x00, 0x20, 0x49, 0x04, 0x00, 0x29, 0x00, + 0x70, 0x2e, 0x89, 0x40, 0x28, 0x00, 0xa8, 0x02, 0xa9, 0x5e, 0xa8, 0x63, + 0x00, 0x01, 0x84, 0x20, 0x98, 0x86, 0x04, 0x40, 0x01, 0x20, 0x28, 0x48, + 0x91, 0x88, 0x00, 0x40, 0x0c, 0x90, 0x20, 0x71, 0x18, 0x8d, 0x70, 0x00, + 0x90, 0x05, 0x11, 0xa0, 0x20, 0x01, 0x05, 0x34, 0xa8, 0x02, 0x20, 0x48, + 0x20, 0x09, 0x4d, 0x00, 0x89, 0x40, 0x28, 0x00, 0xa8, 0x02, 0xa9, 0x5e, + 0xa8, 0x63, 0x00, 0x01, 0x84, 0x20, 0x98, 0x86, 0x08, 0x00, 0x01, 0x20, + 0x28, 0x48, 0x91, 0x88, 0x00, 0x40, 0x0c, 0x90, 0x20, 0x71, 0x18, 0x8d, + 0x71, 0x04, 0x72, 0x00, 0x82, 0xff, 0x01, 0xd0, 0x73, 0x08, 0x83, 0x18, + 0x83, 0x1f, 0x83, 0x1b, 0x83, 0x1b, 0x73, 0x12, 0x83, 0x19, 0x20, 0x01, + 0x08, 0x00, 0xa8, 0x02, 0x20, 0x48, 0x89, 0x00, 0xa8, 0x02, 0x20, 0x40, + 0xa9, 0x5e, 0xaa, 0x62, 0x84, 0x20, 0x23, 0x00, 0x99, 0x06, 0x01, 0x30, + 0x28, 0x48, 0x91, 0x88, 0x00, 0x40, 0x92, 0x91, 0x00, 0x00, 0x0c, 0x88, + 0xa8, 0x03, 0x00, 0x00, 0x20, 0x71, 0x18, 0x00, 0x74, 0xbe, 0x74, 0xc2, + 0x00, 0x05, 0x00, 0xe6, 0x00, 0x16, 0x99, 0x84, 0xfc, 0x00, 0x01, 0xe8, + 0x90, 0x8c, 0xf8, 0x00, 0x11, 0x68, 0x99, 0x82, 0x04, 0x00, 0x02, 0xb8, + 0x99, 0x82, 0x04, 0x40, 0x02, 0x78, 0x99, 0x82, 0x05, 0x34, 0x02, 0x88, + 0x99, 0x82, 0x08, 0x00, 0x12, 0x70, 0x00, 0x40, 0x99, 0x82, 0x08, 0x00, + 0x02, 0x50, 0x20, 0x71, 0x18, 0x8d, 0x70, 0x10, 0x99, 0x02, 0x12, 0x28, + 0x90, 0x85, 0x00, 0x01, 0x00, 0x1e, 0x00, 0xee, 0x00, 0x05, 0x90, 0x06, + 0x0c, 0xd8, 0x00, 0xe6, 0x20, 0x71, 0x1a, 0x1b, 0x70, 0x07, 0x00, 0x00, + 0x90, 0x06, 0x70, 0x1e, 0x70, 0x22, 0x70, 0x02, 0x20, 0x71, 0x00, 0x00, + 0x70, 0x10, 0x90, 0x85, 0x80, 0x44, 0x70, 0x12, 0x20, 0x71, 0x00, 0x80, + 0x90, 0x06, 0x20, 0xa9, 0x00, 0x40, 0x70, 0x22, 0x1f, 0x04, 0x10, 0xf1, + 0x70, 0x2b, 0x00, 0x20, 0x00, 0xee, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x00, 0xe6, 0xa0, 0x6f, 0x00, 0x00, 0x20, 0x71, 0x1a, 0x1b, + 0x70, 0x1c, 0x90, 0x88, 0x1a, 0x25, 0x28, 0x0a, 0x80, 0x00, 0x90, 0x84, + 0x00, 0x3f, 0x70, 0x1e, 0x71, 0x20, 0x91, 0x06, 0x09, 0x0c, 0x0d, 0xc5, + 0x70, 0x04, 0x90, 0x05, 0x11, 0x28, 0x00, 0xf6, 0x20, 0x79, 0x00, 0x80, + 0x00, 0xa9, 0x00, 0xfe, 0x00, 0xee, 0x01, 0x2e, 0x00, 0x05, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x00, 0xe6, 0x20, 0x71, 0x1a, 0x1b, 0x70, 0x04, + 0x90, 0x05, 0x11, 0x28, 0x00, 0xf6, 0x20, 0x79, 0x00, 0x80, 0x00, 0x21, + 0x00, 0xfe, 0x00, 0xee, 0x01, 0x2e, 0x00, 0x05, 0x70, 0x04, 0x90, 0x86, + 0x00, 0x00, 0x11, 0x10, 0x70, 0x07, 0x00, 0x06, 0x70, 0x00, 0x00, 0x02, + 0x11, 0x3a, 0x12, 0xbd, 0x11, 0x38, 0x11, 0x38, 0x12, 0xb1, 0x12, 0xb1, + 0x12, 0xb1, 0x12, 0xb1, 0x08, 0x0c, 0x0d, 0xc5, 0x70, 0x1c, 0x71, 0x20, + 0x91, 0x06, 0x11, 0x48, 0x79, 0x2c, 0x91, 0x84, 0x00, 0x01, 0x11, 0x20, + 0xd1, 0xfc, 0x11, 0x10, 0x70, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x96, + 0x91, 0x80, 0x1a, 0x25, 0x20, 0x04, 0x70, 0x0a, 0x20, 0x48, 0x81, 0x08, + 0x91, 0x8c, 0x00, 0x3f, 0x71, 0x22, 0x78, 0x2b, 0x00, 0x26, 0xa8, 0x8c, + 0x78, 0x02, 0xa8, 0x90, 0x78, 0x06, 0xa8, 0x94, 0x78, 0x0a, 0xa8, 0x98, + 0x78, 0x0e, 0xa8, 0x78, 0x70, 0x0e, 0xa8, 0x70, 0x70, 0x16, 0xa8, 0x74, + 0x70, 0x1a, 0xa8, 0x68, 0x00, 0x9e, 0xd0, 0x84, 0x01, 0x20, 0x70, 0x07, + 0x00, 0x01, 0x00, 0x29, 0x00, 0x05, 0x70, 0x07, 0x00, 0x02, 0x00, 0xb1, + 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, 0x71, 0x0c, 0x20, 0x11, 0x00, 0x40, + 0x91, 0x82, 0x00, 0x40, 0x12, 0x10, 0x21, 0x10, 0x90, 0x06, 0x70, 0x0e, + 0x72, 0x12, 0x82, 0x03, 0x78, 0x12, 0x78, 0x2b, 0x00, 0x20, 0x78, 0x2b, + 0x00, 0x41, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, + 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x70, 0x14, 0x20, 0xe0, 0x70, 0x18, + 0x20, 0x98, 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, 0x00, 0x88, 0x78, 0x2b, + 0x00, 0x26, 0x71, 0x0c, 0x20, 0x11, 0x00, 0x40, 0x91, 0x82, 0x00, 0x40, + 0x12, 0x10, 0x21, 0x10, 0x90, 0x06, 0x70, 0x0e, 0x22, 0xa8, 0x40, 0x06, + 0x82, 0x03, 0x78, 0x12, 0x78, 0x2b, 0x00, 0x20, 0x33, 0x00, 0x70, 0x1a, + 0x78, 0x2b, 0x00, 0x01, 0x01, 0x5e, 0x01, 0x4e, 0x01, 0x3e, 0x00, 0x2e, + 0x00, 0x1e, 0x00, 0x05, 0x20, 0x09, 0x1a, 0x1b, 0x21, 0x04, 0xc0, 0x95, + 0x20, 0x0a, 0x08, 0x0c, 0x11, 0x17, 0x00, 0x05, 0x00, 0x16, 0x00, 0xe6, + 0x20, 0x71, 0x1a, 0x1b, 0x00, 0xf6, 0x20, 0x79, 0x00, 0x80, 0x79, 0x2c, + 0xd1, 0xbc, 0x19, 0x0c, 0x0d, 0xbe, 0x78, 0x2b, 0x00, 0x02, 0xd1, 0xfc, + 0x01, 0x20, 0x91, 0x8c, 0x07, 0x00, 0x70, 0x04, 0x00, 0x23, 0x00, 0xfe, + 0x00, 0xee, 0x00, 0x1e, 0x00, 0x05, 0x11, 0x28, 0x11, 0xd0, 0x12, 0x04, + 0x12, 0xdc, 0x0d, 0xc5, 0x12, 0xf7, 0x0d, 0xc5, 0x91, 0x8c, 0x07, 0x00, + 0x15, 0x50, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x70, 0x14, 0x20, 0xe8, + 0x70, 0x18, 0x20, 0xa0, 0x20, 0xe1, 0x00, 0x00, 0x20, 0x99, 0x00, 0x88, + 0x78, 0x2b, 0x00, 0x40, 0x70, 0x10, 0x20, 0xa8, 0x40, 0x05, 0x34, 0x00, + 0x70, 0x1a, 0x01, 0x5e, 0x01, 0x4e, 0x01, 0x3e, 0x70, 0x0c, 0x90, 0x05, + 0x05, 0x78, 0x78, 0x00, 0x78, 0x02, 0x78, 0x04, 0x78, 0x06, 0x08, 0x0c, + 0x11, 0x6d, 0x00, 0x05, 0x70, 0x08, 0x00, 0x96, 0x20, 0x48, 0xa8, 0x6f, + 0x01, 0x00, 0x00, 0x9e, 0x70, 0x07, 0x00, 0x00, 0x08, 0x0c, 0x11, 0x28, + 0x00, 0x05, 0x70, 0x08, 0x00, 0x96, 0x20, 0x48, 0xa8, 0x6f, 0x02, 0x00, + 0x00, 0x9e, 0x0c, 0xa0, 0x91, 0x8c, 0x07, 0x00, 0x11, 0x50, 0x70, 0x0c, + 0x90, 0x05, 0x01, 0x80, 0x78, 0x00, 0x78, 0x02, 0x78, 0x04, 0x78, 0x06, + 0x08, 0x0c, 0x11, 0x82, 0x00, 0x05, 0x70, 0x08, 0x00, 0x96, 0x20, 0x48, + 0xa8, 0x6f, 0x02, 0x00, 0x00, 0x9e, 0x70, 0x07, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x96, 0x70, 0x08, 0x20, 0x48, 0x78, 0x00, 0xa8, 0x8e, 0x78, 0x04, + 0xa8, 0x92, 0x78, 0x08, 0xa8, 0x96, 0x78, 0x0c, 0xa8, 0x9a, 0xa8, 0x6f, + 0x01, 0x00, 0x00, 0x9e, 0x70, 0x07, 0x00, 0x00, 0x00, 0x96, 0x00, 0xd6, + 0x70, 0x08, 0x20, 0x48, 0x20, 0x01, 0x18, 0xb9, 0x20, 0x04, 0x99, 0x06, + 0x11, 0x28, 0xa8, 0x9c, 0x08, 0x0f, 0x00, 0xde, 0x00, 0x9e, 0x00, 0xa0, + 0x00, 0xde, 0x00, 0x9e, 0x00, 0x96, 0x00, 0xd6, 0x70, 0x08, 0x20, 0x48, + 0x00, 0x81, 0x01, 0x50, 0xa8, 0x9c, 0x00, 0x86, 0x29, 0x40, 0x08, 0x0f, + 0x00, 0x8e, 0x00, 0xde, 0x00, 0x9e, 0x08, 0x0c, 0x11, 0x17, 0x00, 0x05, + 0x00, 0xde, 0x00, 0x9e, 0x08, 0x0c, 0x11, 0x17, 0x00, 0x05, 0xa8, 0xa8, + 0xd0, 0x8c, 0x00, 0x05, 0x00, 0x96, 0xa0, 0xa0, 0x90, 0x4d, 0x09, 0x0c, + 0x0d, 0xc5, 0xa0, 0x6c, 0x90, 0x8e, 0x01, 0x00, 0x01, 0x30, 0xa8, 0x7b, + 0x00, 0x30, 0xa8, 0x83, 0x00, 0x00, 0xa8, 0x97, 0x40, 0x02, 0x08, 0x0c, + 0x6e, 0x92, 0xa0, 0x9f, 0x00, 0x00, 0xa0, 0xa3, 0x00, 0x00, 0x28, 0x48, + 0x08, 0x0c, 0x10, 0x40, 0x00, 0x9e, 0x00, 0x05, 0x00, 0xa6, 0xa0, 0xa0, + 0x90, 0x4d, 0x09, 0x0c, 0x0d, 0xc5, 0xa0, 0x6c, 0x90, 0x8e, 0x01, 0x00, + 0x01, 0x28, 0xa8, 0x7b, 0x00, 0x01, 0xa8, 0x83, 0x00, 0x00, 0x00, 0xc0, + 0xa8, 0x0c, 0x20, 0x50, 0xb0, 0x04, 0x90, 0x05, 0x01, 0x98, 0xa8, 0x0e, + 0x20, 0x50, 0x80, 0x06, 0x80, 0x06, 0x80, 0x07, 0x90, 0x8c, 0x00, 0x3f, + 0x90, 0x84, 0xff, 0xc0, 0x90, 0x80, 0x00, 0x02, 0xa0, 0x76, 0xa1, 0x72, + 0xb0, 0x00, 0xa0, 0x7a, 0x28, 0x10, 0x08, 0x0c, 0x10, 0xf8, 0x00, 0xe8, + 0xa9, 0x7c, 0xa8, 0x94, 0x00, 0x16, 0x00, 0x06, 0x08, 0x0c, 0x6e, 0x92, + 0x00, 0x0e, 0x00, 0x1e, 0xd1, 0xfc, 0x11, 0x38, 0xd1, 0xf4, 0x01, 0x28, + 0x00, 0xc6, 0x20, 0x60, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0xce, 0x70, 0x08, + 0x20, 0x48, 0xa8, 0x9f, 0x00, 0x00, 0xa8, 0xa3, 0x00, 0x00, 0x08, 0x0c, + 0x10, 0x40, 0x70, 0x07, 0x00, 0x00, 0x08, 0x0c, 0x11, 0x17, 0x00, 0xae, + 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x78, 0x2b, 0x10, 0x01, + 0x70, 0x07, 0x00, 0x05, 0x70, 0x00, 0xc0, 0x94, 0x70, 0x02, 0x01, 0x2e, + 0x00, 0x05, 0x00, 0x96, 0x20, 0x01, 0x19, 0x2f, 0x20, 0x4c, 0xa8, 0x7c, + 0x78, 0x12, 0xa8, 0x8c, 0x78, 0x02, 0xa8, 0x90, 0x78, 0x06, 0xa8, 0x94, + 0x78, 0x0a, 0xa8, 0x98, 0x78, 0x0e, 0x78, 0x2b, 0x00, 0x20, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x78, 0x2b, 0x00, 0x41, 0x70, 0x07, 0x00, 0x03, + 0x70, 0x00, 0xc0, 0x84, 0x70, 0x02, 0x29, 0x00, 0x70, 0x0a, 0x01, 0x2e, + 0x00, 0x9e, 0x00, 0x05, 0x20, 0xe1, 0x00, 0x00, 0x20, 0x99, 0x00, 0x88, + 0x78, 0x2b, 0x00, 0x40, 0x00, 0x96, 0x20, 0x01, 0x19, 0x2f, 0x20, 0x4c, + 0xaa, 0x7c, 0x00, 0x9e, 0x08, 0x0c, 0x8d, 0x91, 0x20, 0x09, 0x18, 0x8c, + 0x21, 0x04, 0x90, 0x84, 0xff, 0xfc, 0x20, 0x0a, 0x08, 0x0c, 0x8b, 0xf3, + 0x70, 0x07, 0x00, 0x00, 0x08, 0x0c, 0x11, 0x28, 0x00, 0x05, 0x70, 0x07, + 0x00, 0x00, 0x08, 0x0c, 0x11, 0x28, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, + 0x22, 0x00, 0x20, 0x79, 0x03, 0x00, 0x20, 0x71, 0x1a, 0x65, 0x70, 0x03, + 0x00, 0x00, 0x78, 0xbf, 0x00, 0xf6, 0x78, 0x1b, 0x48, 0x00, 0x00, 0xc1, + 0x78, 0x03, 0x00, 0x03, 0x78, 0x0f, 0x00, 0x00, 0x20, 0xa9, 0x03, 0xea, + 0x20, 0x61, 0xf0, 0xae, 0x2c, 0x0d, 0x79, 0x12, 0xe1, 0x04, 0x9c, 0xe0, + 0x00, 0x02, 0x79, 0x16, 0x1f, 0x04, 0x13, 0x12, 0x78, 0x07, 0x00, 0x07, + 0x78, 0x03, 0x00, 0x00, 0x78, 0x03, 0x00, 0x01, 0x01, 0x2e, 0x00, 0x05, + 0x00, 0xc6, 0x78, 0x03, 0x00, 0x00, 0x78, 0x08, 0xd0, 0x9c, 0x01, 0x20, + 0x78, 0x20, 0x08, 0x0c, 0x13, 0x76, 0x0c, 0xc8, 0x20, 0x01, 0x1a, 0x66, + 0x20, 0x03, 0x00, 0x00, 0x78, 0xab, 0x00, 0x04, 0x78, 0xac, 0xd0, 0xac, + 0x1d, 0xe8, 0x78, 0xab, 0x00, 0x02, 0x78, 0x07, 0x00, 0x07, 0x78, 0x27, + 0x00, 0x30, 0x78, 0x2b, 0x04, 0x00, 0x78, 0x27, 0x00, 0x31, 0x78, 0x2b, + 0x1a, 0x89, 0x78, 0x1f, 0xff, 0x00, 0x78, 0x1b, 0xb7, 0x00, 0x20, 0x01, + 0x02, 0x00, 0x20, 0x04, 0xd0, 0xdc, 0x01, 0x10, 0x78, 0x1f, 0x03, 0x03, + 0x20, 0x61, 0x1a, 0x89, 0x60, 0x2f, 0x1c, 0xd0, 0x20, 0x01, 0x18, 0x1a, + 0x20, 0x04, 0x90, 0x82, 0x1c, 0xd0, 0x60, 0x32, 0x60, 0x3b, 0x20, 0xc7, + 0x20, 0x01, 0x33, 0xb6, 0xd0, 0xfc, 0x19, 0x0c, 0x0d, 0xc5, 0x20, 0x01, + 0x18, 0x10, 0x20, 0x04, 0xd0, 0xc4, 0x11, 0x28, 0x20, 0x01, 0x00, 0x03, + 0x20, 0x04, 0xd0, 0xd4, 0x11, 0x18, 0x78, 0x3f, 0x33, 0xb6, 0x00, 0x20, + 0x90, 0x84, 0xc0, 0x00, 0x78, 0x3f, 0xb3, 0xb6, 0x60, 0x4f, 0x19, 0x3d, + 0x20, 0x01, 0x19, 0x28, 0x20, 0x04, 0x60, 0x42, 0x00, 0xce, 0x00, 0x05, + 0x90, 0x86, 0x00, 0x0d, 0x11, 0xd0, 0x78, 0x08, 0xd0, 0x9c, 0x01, 0xb8, + 0x78, 0x20, 0x00, 0x26, 0x20, 0x10, 0x08, 0x0c, 0xd0, 0xc6, 0x01, 0x80, + 0x22, 0x60, 0x60, 0x00, 0x90, 0x86, 0x00, 0x04, 0x11, 0x58, 0x00, 0x16, + 0x61, 0x20, 0x91, 0x86, 0x00, 0x09, 0x01, 0x08, 0x00, 0x20, 0x20, 0x09, + 0x00, 0x4c, 0x08, 0x0c, 0xb3, 0x52, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x05, + 0x01, 0x26, 0x20, 0x91, 0x22, 0x00, 0x79, 0x08, 0x91, 0x84, 0x00, 0x70, + 0x19, 0x0c, 0x0d, 0xbe, 0xd1, 0x9c, 0x01, 0x58, 0x78, 0x20, 0x90, 0x8c, + 0xf0, 0x00, 0x15, 0xe8, 0x90, 0x8a, 0x00, 0x24, 0x1a, 0x0c, 0x0d, 0xc5, + 0x00, 0x23, 0x01, 0x2e, 0x00, 0x05, 0x01, 0x2e, 0x00, 0x05, 0x13, 0xcf, + 0x13, 0xcf, 0x13, 0xe6, 0x13, 0xeb, 0x13, 0xef, 0x13, 0xf4, 0x14, 0x1c, + 0x14, 0x20, 0x14, 0x2e, 0x14, 0x32, 0x13, 0xcf, 0x14, 0xff, 0x15, 0x03, + 0x15, 0x75, 0x15, 0x7c, 0x13, 0xcf, 0x15, 0x7d, 0x15, 0x7e, 0x15, 0x89, + 0x15, 0x90, 0x13, 0xcf, 0x13, 0xcf, 0x13, 0xcf, 0x13, 0xcf, 0x13, 0xcf, + 0x13, 0xcf, 0x13, 0xcf, 0x13, 0xf6, 0x13, 0xcf, 0x13, 0xcf, 0x13, 0xcf, + 0x13, 0xcf, 0x13, 0xcf, 0x13, 0xcf, 0x13, 0xd3, 0x13, 0xd1, 0x08, 0x0c, + 0x0d, 0xc5, 0x08, 0x0c, 0x0d, 0xbe, 0x08, 0x0c, 0x15, 0x9b, 0x20, 0x09, + 0x1a, 0x7e, 0x21, 0x04, 0x80, 0x00, 0x20, 0x0a, 0x08, 0x0c, 0x81, 0x3a, + 0x08, 0x0c, 0x1a, 0xd9, 0x00, 0x05, 0x20, 0x09, 0x00, 0x48, 0x20, 0x60, + 0x08, 0x0c, 0xb3, 0x52, 0x01, 0x2e, 0x00, 0x05, 0x70, 0x04, 0xc0, 0x85, + 0xc0, 0xb5, 0x70, 0x06, 0x00, 0x05, 0x70, 0x04, 0xc0, 0x85, 0x70, 0x06, + 0x00, 0x05, 0x08, 0x0c, 0x15, 0x9b, 0x08, 0x0c, 0x16, 0xfb, 0x00, 0x05, + 0x08, 0x0c, 0x0d, 0xc5, 0x08, 0x0c, 0x15, 0x9b, 0x20, 0x60, 0x60, 0x14, + 0x00, 0x96, 0x20, 0x48, 0xa8, 0x3b, 0xff, 0xff, 0x00, 0x9e, 0x20, 0x09, + 0x00, 0x48, 0x08, 0x0c, 0xb3, 0x52, 0x20, 0x01, 0x01, 0x5d, 0x20, 0x03, + 0x00, 0x00, 0x20, 0x09, 0x03, 0xe8, 0x81, 0x09, 0x01, 0x60, 0x20, 0x01, + 0x02, 0x01, 0x20, 0x04, 0x90, 0x05, 0x0d, 0xc8, 0x20, 0x01, 0x02, 0x18, + 0x20, 0x04, 0xd0, 0xec, 0x11, 0x10, 0x08, 0x0c, 0x15, 0xa0, 0x20, 0x01, + 0x03, 0x07, 0x20, 0x03, 0x80, 0x00, 0x00, 0x05, 0x70, 0x04, 0xc0, 0x95, + 0x70, 0x06, 0x00, 0x05, 0x08, 0x0c, 0x15, 0x9b, 0x20, 0x60, 0x60, 0x14, + 0x00, 0x96, 0x20, 0x48, 0xa8, 0x3b, 0xff, 0xff, 0x00, 0x9e, 0x20, 0x09, + 0x00, 0x48, 0x08, 0x0c, 0xb3, 0x52, 0x00, 0x05, 0x08, 0x0c, 0x15, 0x9b, + 0x08, 0x0c, 0x0d, 0xc5, 0x08, 0x0c, 0x15, 0x9b, 0x08, 0x0c, 0x14, 0xea, + 0x78, 0x27, 0x00, 0x18, 0x79, 0xac, 0xd1, 0xdc, 0x09, 0x04, 0x14, 0x9b, + 0x78, 0x27, 0x00, 0x15, 0x78, 0x28, 0x78, 0x2b, 0x00, 0x00, 0x90, 0x65, + 0x01, 0x40, 0x20, 0x01, 0x02, 0x0d, 0x20, 0x03, 0x00, 0x50, 0x20, 0x03, + 0x00, 0x20, 0x08, 0x04, 0x14, 0xa1, 0x70, 0x04, 0x90, 0x05, 0x01, 0xc8, + 0x11, 0x88, 0x78, 0xab, 0x00, 0x04, 0x78, 0x27, 0x00, 0x18, 0x78, 0x2b, + 0x00, 0x00, 0xd1, 0xbc, 0x09, 0x0c, 0x0d, 0xc5, 0x20, 0x01, 0x02, 0x0d, + 0x20, 0x03, 0x00, 0x50, 0x20, 0x03, 0x00, 0x20, 0x08, 0x04, 0x14, 0xcf, + 0x78, 0xab, 0x00, 0x04, 0x78, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x15, 0x03, + 0x00, 0x05, 0x78, 0x27, 0x00, 0x18, 0xa0, 0x01, 0x78, 0x28, 0x78, 0x27, + 0x00, 0x11, 0xa0, 0x01, 0x79, 0x28, 0x91, 0x06, 0x01, 0x10, 0x79, 0xac, + 0x08, 0xe0, 0x00, 0xe6, 0x20, 0x71, 0x02, 0x00, 0x70, 0x2c, 0xd0, 0xc4, + 0x01, 0x40, 0x00, 0xee, 0x08, 0x0c, 0x1a, 0xd9, 0x08, 0x0c, 0x13, 0x22, + 0x78, 0x03, 0x00, 0x01, 0x00, 0x05, 0x70, 0x37, 0x00, 0x01, 0xa0, 0x01, + 0x71, 0x50, 0x00, 0xee, 0x91, 0x8c, 0xff, 0x00, 0x91, 0x86, 0x05, 0x00, + 0x01, 0x10, 0x79, 0xac, 0x08, 0x10, 0x70, 0x04, 0xc0, 0x9d, 0x70, 0x06, + 0x78, 0xab, 0x00, 0x04, 0x78, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x15, 0x03, + 0x20, 0x01, 0x02, 0x0d, 0x20, 0x03, 0x00, 0x20, 0x00, 0x05, 0x78, 0x28, + 0x78, 0x2b, 0x00, 0x00, 0x90, 0x65, 0x09, 0x0c, 0x0d, 0xc5, 0x60, 0x14, + 0x20, 0x48, 0x78, 0xab, 0x00, 0x04, 0x91, 0x8c, 0x07, 0x00, 0x01, 0xa8, + 0x08, 0x0c, 0x81, 0x3a, 0x08, 0x0c, 0x1a, 0xd9, 0x08, 0x0c, 0xd0, 0xd8, + 0x01, 0x58, 0xa9, 0xac, 0xa9, 0x36, 0xa9, 0xb0, 0xa9, 0x3a, 0xa8, 0x3f, + 0xff, 0xff, 0xa8, 0x43, 0xff, 0xff, 0xa8, 0x80, 0xc0, 0xbd, 0xa8, 0x82, + 0x08, 0x0c, 0xcc, 0xf3, 0x00, 0x05, 0x60, 0x20, 0x90, 0x86, 0x00, 0x09, + 0x11, 0x28, 0x20, 0x09, 0x00, 0x4c, 0x08, 0x0c, 0xb3, 0x52, 0x00, 0x48, + 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x00, 0x00, 0xbe, 0xd0, 0xbc, + 0x60, 0x24, 0x19, 0x0c, 0xd4, 0xc4, 0x20, 0x29, 0x00, 0xc8, 0x85, 0x29, + 0x01, 0x28, 0x20, 0x01, 0x02, 0x01, 0x20, 0x04, 0x90, 0x05, 0x0d, 0xc8, + 0x7d, 0xbc, 0x08, 0x0c, 0xf0, 0x57, 0xd5, 0xa4, 0x11, 0x18, 0x08, 0x0c, + 0x15, 0xa0, 0x00, 0x05, 0x08, 0x0c, 0x81, 0x3a, 0x08, 0x0c, 0x1a, 0xd9, + 0x00, 0x05, 0x78, 0x1f, 0x03, 0x00, 0x78, 0x03, 0x00, 0x01, 0x00, 0x05, + 0x00, 0x16, 0x00, 0x66, 0x00, 0x76, 0x00, 0xf6, 0x20, 0x79, 0x03, 0x00, + 0x79, 0x08, 0x91, 0x8c, 0x00, 0x07, 0x91, 0x86, 0x00, 0x03, 0x01, 0x20, + 0x20, 0x01, 0x00, 0x16, 0x08, 0x0c, 0x16, 0x11, 0x00, 0xfe, 0x00, 0x7e, + 0x00, 0x6e, 0x00, 0x1e, 0x00, 0x05, 0x70, 0x04, 0xc0, 0x9d, 0x70, 0x06, + 0x00, 0x05, 0x71, 0x04, 0x91, 0x84, 0x00, 0x04, 0x19, 0x0c, 0x0d, 0xc5, + 0xd1, 0x84, 0x11, 0xb1, 0xd1, 0x9c, 0x01, 0x80, 0xc1, 0x9c, 0x71, 0x06, + 0x00, 0x16, 0x08, 0x0c, 0x16, 0xde, 0x00, 0x1e, 0x01, 0x48, 0x20, 0x01, + 0x02, 0x0d, 0x20, 0x03, 0x00, 0x50, 0x20, 0x03, 0x00, 0x20, 0x08, 0x0c, + 0x15, 0xa0, 0x00, 0x05, 0x81, 0xff, 0x19, 0x0c, 0x0d, 0xc5, 0x00, 0x05, + 0x21, 0x00, 0xc1, 0x84, 0xc1, 0xb4, 0x71, 0x06, 0xd0, 0xb4, 0x00, 0x16, + 0x00, 0xe6, 0x19, 0x04, 0x15, 0x6a, 0x20, 0x71, 0x02, 0x00, 0x08, 0x0c, + 0x16, 0xcb, 0x05, 0xe0, 0x08, 0x0c, 0x16, 0xde, 0x05, 0xb0, 0x60, 0x14, + 0x90, 0x05, 0x05, 0xb0, 0x00, 0x96, 0x20, 0x48, 0xa8, 0x64, 0x00, 0x9e, + 0x90, 0x84, 0x00, 0xff, 0x90, 0x8e, 0x00, 0x29, 0x01, 0x60, 0x90, 0x8e, + 0x00, 0x48, 0x15, 0x50, 0x60, 0x1c, 0xd0, 0x84, 0x11, 0xe0, 0x00, 0xf6, + 0x2c, 0x78, 0x08, 0x0c, 0x17, 0x68, 0x00, 0xfe, 0x00, 0xb0, 0x00, 0xf6, + 0x2c, 0x78, 0x08, 0x0c, 0x18, 0xfd, 0x00, 0xfe, 0x20, 0x09, 0x01, 0xf4, + 0x81, 0x09, 0x01, 0x68, 0x20, 0x01, 0x02, 0x01, 0x20, 0x04, 0x90, 0x05, + 0x0d, 0xc8, 0x20, 0x01, 0x02, 0x18, 0x20, 0x04, 0xd0, 0xec, 0x11, 0x18, + 0x08, 0x0c, 0x15, 0xa0, 0x00, 0x40, 0x20, 0x01, 0x02, 0x0d, 0x20, 0x03, + 0x00, 0x20, 0x08, 0x0c, 0x13, 0x22, 0x78, 0x03, 0x00, 0x01, 0x00, 0xee, + 0x00, 0x1e, 0x00, 0x05, 0x08, 0x0c, 0x16, 0xde, 0x0d, 0xd0, 0x20, 0x01, + 0x02, 0x0d, 0x20, 0x03, 0x00, 0x50, 0x20, 0x03, 0x00, 0x20, 0x04, 0x61, + 0x0c, 0x90, 0x04, 0x29, 0x20, 0x60, 0x20, 0x09, 0x00, 0x53, 0x08, 0x0c, + 0xb3, 0x52, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0xe1, 0x20, 0x08, + 0x00, 0xd1, 0x00, 0x06, 0x70, 0x04, 0xc0, 0x9d, 0x70, 0x06, 0x00, 0x0e, + 0x08, 0x0c, 0x90, 0xde, 0x00, 0x05, 0x00, 0x89, 0x90, 0x05, 0x01, 0x18, + 0x08, 0x0c, 0x8c, 0xe2, 0x0c, 0xd0, 0x00, 0x05, 0x20, 0x01, 0x00, 0x36, + 0x20, 0x09, 0x18, 0x20, 0x21, 0x0c, 0x20, 0x11, 0x18, 0x1f, 0x22, 0x14, + 0x08, 0x0c, 0x16, 0x11, 0x00, 0x05, 0x78, 0x08, 0xd0, 0x9c, 0x0d, 0xe8, + 0x78, 0x20, 0x00, 0x05, 0x08, 0x0c, 0x14, 0xea, 0x00, 0xd6, 0x20, 0x69, + 0x02, 0x00, 0x20, 0x09, 0x01, 0xf4, 0x81, 0x09, 0x05, 0x10, 0x68, 0x04, + 0x90, 0x05, 0x0d, 0xd8, 0x20, 0x01, 0x01, 0x5d, 0x20, 0x03, 0x00, 0x00, + 0x79, 0xbc, 0xd1, 0xa4, 0x15, 0x28, 0x79, 0xb8, 0x91, 0x8c, 0x0f, 0xff, + 0x01, 0x80, 0x91, 0x82, 0x08, 0x41, 0x12, 0x68, 0x91, 0x88, 0x00, 0x07, + 0x91, 0x8c, 0x0f, 0xf8, 0x81, 0x0c, 0x81, 0x0c, 0x81, 0x0c, 0x08, 0x0c, + 0x16, 0x03, 0x68, 0x27, 0x00, 0x01, 0x81, 0x09, 0x1d, 0xd0, 0x04, 0xd9, + 0x68, 0x27, 0x00, 0x02, 0x04, 0xc1, 0x68, 0x04, 0x90, 0x05, 0x11, 0x30, + 0x68, 0x2c, 0xd0, 0xe4, 0x15, 0x00, 0x68, 0x04, 0x90, 0x05, 0x0d, 0xe8, + 0x79, 0xb8, 0xd1, 0xec, 0x11, 0x30, 0x08, 0xc0, 0x08, 0x0c, 0x81, 0x3a, + 0x08, 0x0c, 0x1a, 0xd9, 0x00, 0x90, 0x78, 0x27, 0x00, 0x15, 0x78, 0x2b, + 0x00, 0x00, 0x78, 0x27, 0x00, 0x18, 0x78, 0x2b, 0x00, 0x00, 0x20, 0x01, + 0x02, 0x0d, 0x20, 0x03, 0x00, 0x20, 0x20, 0x01, 0x03, 0x07, 0x20, 0x03, + 0x03, 0x00, 0x78, 0x03, 0x00, 0x01, 0x00, 0xde, 0x00, 0x05, 0x68, 0x2c, + 0x90, 0x84, 0x54, 0x00, 0x90, 0x86, 0x54, 0x00, 0x0d, 0x30, 0x78, 0x27, + 0x00, 0x15, 0x78, 0x2b, 0x00, 0x00, 0x78, 0x03, 0x00, 0x01, 0x68, 0x00, + 0x90, 0x85, 0x18, 0x00, 0x68, 0x02, 0x00, 0xde, 0x00, 0x05, 0x68, 0x24, + 0x90, 0x84, 0x00, 0x03, 0x1d, 0xe0, 0x00, 0x05, 0x20, 0x01, 0x00, 0x30, + 0x2c, 0x08, 0x62, 0x1c, 0x00, 0x21, 0x78, 0x30, 0x90, 0x86, 0x00, 0x41, + 0x00, 0x05, 0x00, 0xf6, 0x20, 0x79, 0x03, 0x00, 0x00, 0x06, 0x78, 0x08, + 0xd0, 0x9c, 0x01, 0x40, 0x00, 0x16, 0x00, 0x26, 0x00, 0xc6, 0x08, 0x0c, + 0x13, 0x94, 0x00, 0xce, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x06, + 0x78, 0x32, 0x79, 0x36, 0x7a, 0x3a, 0x78, 0x1b, 0x80, 0x80, 0x00, 0x59, + 0x11, 0x18, 0x00, 0x0e, 0x00, 0xfe, 0x00, 0x05, 0x00, 0x0e, 0x79, 0x2c, + 0x39, 0x00, 0x80, 0x00, 0x20, 0x04, 0x08, 0x0c, 0x0d, 0xc5, 0x20, 0x09, + 0x18, 0x0c, 0x21, 0x04, 0xc0, 0xf4, 0x20, 0x0a, 0x20, 0x09, 0xff, 0x00, + 0x81, 0x09, 0x09, 0x04, 0x16, 0x8f, 0x7a, 0x18, 0x92, 0x84, 0x00, 0x30, + 0x09, 0x04, 0x16, 0x8a, 0x92, 0x84, 0x00, 0x48, 0x90, 0x86, 0x00, 0x08, + 0x19, 0x04, 0x16, 0x8a, 0x20, 0x01, 0x01, 0x09, 0x20, 0x04, 0xd0, 0x8c, + 0x01, 0xf0, 0x00, 0x06, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, + 0x01, 0x56, 0x01, 0x26, 0x20, 0x91, 0x28, 0x00, 0x00, 0xf6, 0x00, 0x26, + 0x00, 0x16, 0x20, 0x09, 0x1a, 0x81, 0x21, 0x04, 0x80, 0x00, 0x02, 0x08, + 0x20, 0x0a, 0x08, 0x0c, 0x94, 0xb1, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0xfe, + 0x01, 0x2e, 0x01, 0x5e, 0x01, 0x4e, 0x01, 0x3e, 0x01, 0xde, 0x01, 0xce, + 0x00, 0x0e, 0x20, 0x01, 0x00, 0x9b, 0x20, 0x04, 0xd0, 0xfc, 0x01, 0xd0, + 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, + 0x01, 0x56, 0x00, 0xf6, 0x00, 0x16, 0x20, 0x09, 0x1a, 0x82, 0x21, 0x04, + 0x80, 0x00, 0x02, 0x08, 0x20, 0x0a, 0x08, 0x0c, 0x1e, 0xeb, 0x00, 0x1e, + 0x00, 0xfe, 0x01, 0x5e, 0x01, 0x4e, 0x01, 0x3e, 0x01, 0xde, 0x01, 0xce, + 0x01, 0x2e, 0x00, 0x0e, 0x78, 0x18, 0xd0, 0xbc, 0x19, 0x04, 0x16, 0x3a, + 0x00, 0x05, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x04, 0xd0, 0xf4, 0x15, 0x28, + 0x7a, 0x18, 0x92, 0x84, 0x00, 0x30, 0x05, 0x08, 0x92, 0x84, 0x00, 0x48, + 0x90, 0x86, 0x00, 0x08, 0x11, 0xe0, 0x20, 0x01, 0x19, 0xf7, 0x20, 0x04, + 0x90, 0x05, 0x01, 0xb8, 0x20, 0x01, 0x1a, 0x69, 0x20, 0x04, 0x90, 0x86, + 0x00, 0x00, 0x01, 0x88, 0x20, 0x09, 0x1a, 0x80, 0x21, 0x04, 0x80, 0x00, + 0x02, 0x08, 0x20, 0x0a, 0x08, 0x0c, 0xa7, 0x67, 0x20, 0x09, 0x18, 0x0c, + 0x21, 0x04, 0xc0, 0xf5, 0x20, 0x0a, 0x20, 0x09, 0xff, 0x00, 0x08, 0x04, + 0x16, 0x3a, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x78, 0x32, 0x79, 0x36, + 0x7a, 0x3a, 0x78, 0x1b, 0x80, 0x80, 0x08, 0x0c, 0x16, 0x33, 0x11, 0x08, + 0x00, 0x05, 0x79, 0x2c, 0x39, 0x00, 0x80, 0x00, 0x20, 0x04, 0x08, 0x0c, + 0x0d, 0xc5, 0x70, 0x37, 0x00, 0x01, 0x71, 0x50, 0x70, 0x37, 0x00, 0x02, + 0x70, 0x50, 0x20, 0x60, 0xd1, 0xbc, 0x11, 0x10, 0x70, 0x54, 0x20, 0x60, + 0x91, 0x8c, 0xff, 0x00, 0x91, 0x86, 0x05, 0x00, 0x01, 0x10, 0x90, 0x85, + 0x00, 0x01, 0x00, 0x05, 0x00, 0x06, 0x00, 0x46, 0x00, 0xe6, 0x20, 0x71, + 0x02, 0x00, 0x70, 0x37, 0x00, 0x02, 0x70, 0x58, 0x90, 0x84, 0xff, 0x00, + 0x80, 0x07, 0x90, 0x86, 0x00, 0xbc, 0x11, 0x58, 0x20, 0x21, 0x1a, 0x7f, + 0x24, 0x04, 0x80, 0x00, 0x02, 0x08, 0x20, 0x22, 0x08, 0x0c, 0x81, 0x3a, + 0x08, 0x0c, 0x1a, 0xd9, 0x90, 0x06, 0x00, 0xee, 0x00, 0x4e, 0x00, 0x0e, + 0x00, 0x05, 0x0c, 0x11, 0x11, 0x08, 0x00, 0x05, 0x00, 0xe6, 0x00, 0x16, + 0x20, 0x71, 0x02, 0x00, 0x08, 0x41, 0x61, 0x24, 0xd1, 0xdc, 0x01, 0xf8, + 0x70, 0x1c, 0xd0, 0x8c, 0x09, 0x04, 0x17, 0x5d, 0x70, 0x17, 0x00, 0x00, + 0x20, 0x01, 0x02, 0x64, 0x20, 0x04, 0xd0, 0xbc, 0x09, 0x04, 0x17, 0x5d, + 0x20, 0x01, 0x02, 0x68, 0x00, 0xc6, 0x20, 0x64, 0x61, 0x04, 0x60, 0x38, + 0x00, 0xce, 0x91, 0x8e, 0x00, 0x39, 0x19, 0x04, 0x17, 0x5d, 0x9c, 0x06, + 0x15, 0xf0, 0x01, 0x26, 0x20, 0x91, 0x26, 0x00, 0x08, 0x0c, 0x80, 0x81, + 0x01, 0x2e, 0x73, 0x58, 0x74, 0x5c, 0x60, 0x14, 0x90, 0x5d, 0x05, 0x98, + 0x2b, 0x48, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x00, 0x00, 0xbe, + 0xd0, 0xbc, 0x19, 0x0c, 0xd4, 0x9f, 0xab, 0x42, 0xac, 0x3e, 0x20, 0x01, + 0x18, 0x69, 0x20, 0x04, 0xd0, 0xb4, 0x11, 0x70, 0x60, 0x1c, 0xd0, 0xe4, + 0x11, 0x58, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x00, 0x00, 0xbe, + 0xd0, 0xbc, 0x11, 0x20, 0xa8, 0x3b, 0x7f, 0xff, 0xa8, 0x37, 0xff, 0xff, + 0x08, 0x0c, 0x20, 0xe7, 0x11, 0x90, 0x08, 0x0c, 0x19, 0x5a, 0x2a, 0x00, + 0xa8, 0x16, 0x01, 0x30, 0x28, 0x00, 0xa8, 0x0e, 0x2c, 0x05, 0xa8, 0x0a, + 0x2c, 0x00, 0xa8, 0x12, 0x70, 0x37, 0x00, 0x20, 0x78, 0x1f, 0x03, 0x00, + 0x00, 0x1e, 0x00, 0xee, 0x00, 0x05, 0x70, 0x37, 0x00, 0x50, 0x70, 0x37, + 0x00, 0x20, 0x00, 0x1e, 0x00, 0xee, 0x08, 0x0c, 0x15, 0xa0, 0x00, 0x05, + 0x08, 0x0c, 0x0d, 0xc5, 0x20, 0x01, 0x18, 0x0d, 0x20, 0x04, 0xd0, 0x8c, + 0x19, 0x0c, 0x6b, 0x5e, 0x2f, 0xf0, 0x01, 0x26, 0x20, 0x91, 0x22, 0x00, + 0x00, 0x16, 0x00, 0xc6, 0x3e, 0x60, 0x60, 0x14, 0x20, 0x48, 0x29, 0x40, + 0x90, 0x3e, 0x27, 0x30, 0xa8, 0x64, 0x20, 0x68, 0xa8, 0x1a, 0x9d, 0x84, + 0x00, 0x0f, 0x90, 0x88, 0x20, 0xc7, 0x21, 0x65, 0x00, 0x02, 0x17, 0x9a, + 0x18, 0x08, 0x17, 0x9a, 0x17, 0x9a, 0x17, 0x9e, 0x17, 0xe9, 0x17, 0x9a, + 0x17, 0xbe, 0x17, 0x93, 0x17, 0xff, 0x17, 0x9a, 0x17, 0x9a, 0x17, 0xa3, + 0x18, 0xf5, 0x17, 0xd2, 0x17, 0xc8, 0xa9, 0x64, 0x91, 0x8c, 0x00, 0xff, + 0x91, 0x8e, 0x00, 0x48, 0x09, 0x04, 0x17, 0xff, 0x90, 0x85, 0x00, 0x01, + 0x08, 0x04, 0x18, 0xeb, 0xa8, 0x7c, 0xd0, 0xac, 0x0d, 0xc8, 0x08, 0x04, + 0x18, 0x0f, 0xa8, 0x7c, 0xd0, 0xac, 0x0d, 0xa0, 0x08, 0x04, 0x18, 0x7a, + 0xa8, 0x98, 0x90, 0x1d, 0x11, 0x08, 0xab, 0x9c, 0x90, 0x16, 0xaa, 0xb2, + 0xaa, 0x3e, 0xaa, 0x42, 0x3e, 0x00, 0x90, 0x80, 0x00, 0x08, 0x20, 0x04, + 0x90, 0x80, 0x93, 0x3d, 0x20, 0x05, 0x90, 0x05, 0x09, 0x0c, 0x0d, 0xc5, + 0x20, 0x04, 0xa8, 0xae, 0x08, 0x04, 0x18, 0xd3, 0xa8, 0x7c, 0xd0, 0xbc, + 0x09, 0xc8, 0xa8, 0x90, 0xa8, 0x42, 0xa8, 0x8c, 0xa8, 0x3e, 0xa8, 0x88, + 0x08, 0x04, 0x18, 0x0f, 0xa8, 0x7c, 0xd0, 0xbc, 0x09, 0x78, 0xa8, 0x90, + 0xa8, 0x42, 0xa8, 0x8c, 0xa8, 0x3e, 0xa8, 0x88, 0x08, 0x04, 0x18, 0x7a, + 0xa8, 0x7c, 0xd0, 0xbc, 0x09, 0x28, 0xa8, 0x90, 0xa8, 0x42, 0xa8, 0x8c, + 0xa8, 0x3e, 0xa8, 0x04, 0x90, 0x45, 0x09, 0x0c, 0x0d, 0xc5, 0xa1, 0x64, + 0xa9, 0x1a, 0x91, 0xec, 0x00, 0x0f, 0x9d, 0x80, 0x20, 0xc7, 0x20, 0x65, + 0xa8, 0x88, 0xd1, 0x9c, 0x19, 0x04, 0x18, 0x7a, 0x04, 0x30, 0xa8, 0x7c, + 0xd0, 0xac, 0x09, 0x04, 0x17, 0x9a, 0xa8, 0x04, 0x90, 0x45, 0x09, 0x0c, + 0x0d, 0xc5, 0xa1, 0x64, 0xa9, 0x1a, 0x91, 0xec, 0x00, 0x0f, 0x9d, 0x80, + 0x20, 0xc7, 0x20, 0x65, 0x90, 0x06, 0xa8, 0x42, 0xa8, 0x3e, 0xd1, 0x9c, + 0x19, 0x04, 0x18, 0x7a, 0x00, 0x80, 0xa8, 0x7c, 0xd0, 0xac, 0x09, 0x04, + 0x17, 0x9a, 0x90, 0x06, 0xa8, 0x42, 0xa8, 0x3e, 0x08, 0x04, 0x18, 0x7a, + 0xa8, 0x7c, 0xd0, 0xac, 0x09, 0x04, 0x17, 0x9a, 0x90, 0x06, 0xa8, 0x42, + 0xa8, 0x3e, 0x2c, 0x05, 0x90, 0x8a, 0x00, 0x36, 0x1a, 0x0c, 0x0d, 0xc5, + 0x90, 0x82, 0x00, 0x1b, 0x00, 0x02, 0x18, 0x32, 0x18, 0x32, 0x18, 0x34, + 0x18, 0x32, 0x18, 0x32, 0x18, 0x32, 0x18, 0x3e, 0x18, 0x32, 0x18, 0x32, + 0x18, 0x32, 0x18, 0x48, 0x18, 0x32, 0x18, 0x32, 0x18, 0x32, 0x18, 0x52, + 0x18, 0x32, 0x18, 0x32, 0x18, 0x32, 0x18, 0x5c, 0x18, 0x32, 0x18, 0x32, + 0x18, 0x32, 0x18, 0x66, 0x18, 0x32, 0x18, 0x32, 0x18, 0x32, 0x18, 0x70, + 0x08, 0x0c, 0x0d, 0xc5, 0xa5, 0x74, 0xa4, 0x78, 0x9d, 0x86, 0x00, 0x24, + 0x09, 0x04, 0x17, 0xa8, 0xa3, 0x7c, 0xa2, 0x80, 0x08, 0x04, 0x18, 0xd3, + 0xa5, 0x84, 0xa4, 0x88, 0x9d, 0x86, 0x00, 0x24, 0x09, 0x04, 0x17, 0xa8, + 0xa3, 0x8c, 0xa2, 0x90, 0x08, 0x04, 0x18, 0xd3, 0xa5, 0x94, 0xa4, 0x98, + 0x9d, 0x86, 0x00, 0x24, 0x09, 0x04, 0x17, 0xa8, 0xa3, 0x9c, 0xa2, 0xa0, + 0x08, 0x04, 0x18, 0xd3, 0xa5, 0xa4, 0xa4, 0xa8, 0x9d, 0x86, 0x00, 0x24, + 0x09, 0x04, 0x17, 0xa8, 0xa3, 0xac, 0xa2, 0xb0, 0x08, 0x04, 0x18, 0xd3, + 0xa5, 0xb4, 0xa4, 0xb8, 0x9d, 0x86, 0x00, 0x24, 0x09, 0x04, 0x17, 0xa8, + 0xa3, 0xbc, 0xa2, 0xc0, 0x08, 0x04, 0x18, 0xd3, 0xa5, 0xc4, 0xa4, 0xc8, + 0x9d, 0x86, 0x00, 0x24, 0x09, 0x04, 0x17, 0xa8, 0xa3, 0xcc, 0xa2, 0xd0, + 0x08, 0x04, 0x18, 0xd3, 0xa5, 0xd4, 0xa4, 0xd8, 0x9d, 0x86, 0x00, 0x24, + 0x09, 0x04, 0x17, 0xa8, 0xa3, 0xdc, 0xa2, 0xe0, 0x08, 0x04, 0x18, 0xd3, + 0x2c, 0x05, 0x90, 0x8a, 0x00, 0x34, 0x1a, 0x0c, 0x0d, 0xc5, 0x90, 0x82, + 0x00, 0x1b, 0x00, 0x02, 0x18, 0x9d, 0x18, 0x9b, 0x18, 0x9b, 0x18, 0x9b, + 0x18, 0x9b, 0x18, 0x9b, 0x18, 0xa8, 0x18, 0x9b, 0x18, 0x9b, 0x18, 0x9b, + 0x18, 0x9b, 0x18, 0x9b, 0x18, 0xb3, 0x18, 0x9b, 0x18, 0x9b, 0x18, 0x9b, + 0x18, 0x9b, 0x18, 0x9b, 0x18, 0xbe, 0x18, 0x9b, 0x18, 0x9b, 0x18, 0x9b, + 0x18, 0x9b, 0x18, 0x9b, 0x18, 0xc9, 0x08, 0x0c, 0x0d, 0xc5, 0xa5, 0x6c, + 0xa4, 0x70, 0xa7, 0x74, 0xa6, 0x78, 0x9d, 0x86, 0x00, 0x2c, 0x09, 0x04, + 0x17, 0xa8, 0xa3, 0x7c, 0xa2, 0x80, 0x04, 0x58, 0xa5, 0x84, 0xa4, 0x88, + 0xa7, 0x8c, 0xa6, 0x90, 0x9d, 0x86, 0x00, 0x2c, 0x09, 0x04, 0x17, 0xa8, + 0xa3, 0x94, 0xa2, 0x98, 0x04, 0x00, 0xa5, 0x9c, 0xa4, 0xa0, 0xa7, 0xa4, + 0xa6, 0xa8, 0x9d, 0x86, 0x00, 0x2c, 0x09, 0x04, 0x17, 0xa8, 0xa3, 0xac, + 0xa2, 0xb0, 0x00, 0xa8, 0xa5, 0xb4, 0xa4, 0xb8, 0xa7, 0xbc, 0xa6, 0xc0, + 0x9d, 0x86, 0x00, 0x2c, 0x09, 0x04, 0x17, 0xa8, 0xa3, 0xc4, 0xa2, 0xc8, + 0x00, 0x50, 0xa5, 0xcc, 0xa4, 0xd0, 0xa7, 0xd4, 0xa6, 0xd8, 0x9d, 0x86, + 0x00, 0x2c, 0x09, 0x04, 0x17, 0xa8, 0xa3, 0xdc, 0xa2, 0xe0, 0xab, 0x2e, + 0xaa, 0x32, 0xad, 0x1e, 0xac, 0x22, 0xaf, 0x26, 0xae, 0x2a, 0xa9, 0x88, + 0x8c, 0x60, 0x2c, 0x1d, 0xa8, 0xac, 0xaa, 0xb0, 0xa8, 0x36, 0xaa, 0x3a, + 0x81, 0x09, 0xa9, 0x16, 0x11, 0x60, 0x3e, 0x60, 0x60, 0x1c, 0xc0, 0x85, + 0x60, 0x1e, 0xa8, 0x7c, 0xc0, 0xdd, 0xa8, 0x7e, 0x90, 0x06, 0x00, 0xce, + 0x00, 0x1e, 0x01, 0x2e, 0x00, 0x05, 0x28, 0x00, 0xa8, 0x0e, 0xab, 0x0a, + 0x2c, 0x00, 0xa8, 0x12, 0x0c, 0x70, 0x08, 0x04, 0x17, 0x9a, 0x20, 0x01, + 0x18, 0x0d, 0x20, 0x04, 0xd0, 0x8c, 0x19, 0x0c, 0x6b, 0x5e, 0x2f, 0xf0, + 0x01, 0x26, 0x20, 0x91, 0x22, 0x00, 0x00, 0x16, 0x00, 0xc6, 0x3e, 0x60, + 0x60, 0x14, 0x20, 0x48, 0x29, 0x40, 0xa8, 0x0e, 0x20, 0x61, 0x20, 0xc2, + 0xa8, 0x13, 0x20, 0xc2, 0x2c, 0x05, 0xa8, 0x0a, 0xa9, 0x64, 0xa9, 0x1a, + 0xa8, 0x7c, 0xd0, 0xac, 0x09, 0x0c, 0x0d, 0xc5, 0x90, 0x06, 0xa8, 0x42, + 0xa8, 0x3e, 0x2c, 0x05, 0x90, 0x8a, 0x00, 0x34, 0x1a, 0x0c, 0x0d, 0xc5, + 0xad, 0xcc, 0xac, 0xd0, 0xaf, 0xd4, 0xae, 0xd8, 0xab, 0xdc, 0xaa, 0xe0, + 0xab, 0x2e, 0xaa, 0x32, 0xad, 0x1e, 0xac, 0x22, 0xaf, 0x26, 0xae, 0x2a, + 0xa8, 0xac, 0xaa, 0xb0, 0xa8, 0x36, 0xaa, 0x3a, 0xa9, 0x88, 0xa8, 0x64, + 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x08, 0x11, 0x20, 0x81, 0x09, + 0xa9, 0x16, 0x01, 0x28, 0x00, 0x80, 0x91, 0x8a, 0x00, 0x02, 0xa9, 0x16, + 0x11, 0x60, 0x3e, 0x60, 0x60, 0x1c, 0xc0, 0x85, 0x60, 0x1e, 0xa8, 0x7c, + 0xc0, 0xdd, 0xa8, 0x7e, 0x90, 0x06, 0x00, 0xce, 0x00, 0x1e, 0x01, 0x2e, + 0x00, 0x05, 0xa8, 0x04, 0x90, 0x45, 0x09, 0x0c, 0x0d, 0xc5, 0xa8, 0x0e, + 0xa0, 0x64, 0xa8, 0x1a, 0x90, 0x84, 0x00, 0x0f, 0x90, 0x80, 0x20, 0xc7, + 0x20, 0x15, 0x82, 0xff, 0x09, 0x0c, 0x0d, 0xc5, 0xaa, 0x12, 0x22, 0x05, + 0xa8, 0x0a, 0x0c, 0x08, 0x90, 0x3e, 0x27, 0x30, 0xa8, 0x80, 0xd0, 0xfc, + 0x11, 0x90, 0x2d, 0x00, 0x00, 0x02, 0x1a, 0x4f, 0x19, 0xb1, 0x19, 0xb1, + 0x1a, 0x4f, 0x1a, 0x4f, 0x1a, 0x49, 0x1a, 0x4f, 0x19, 0xb1, 0x1a, 0x00, + 0x1a, 0x00, 0x1a, 0x00, 0x1a, 0x4f, 0x1a, 0x4f, 0x1a, 0x4f, 0x1a, 0x46, + 0x1a, 0x00, 0xc0, 0xfc, 0xa8, 0x82, 0xab, 0x2c, 0xaa, 0x30, 0xad, 0x1c, + 0xac, 0x20, 0xdd, 0x9c, 0x09, 0x04, 0x1a, 0x51, 0x2c, 0x05, 0x90, 0x8a, + 0x00, 0x34, 0x1a, 0x0c, 0x0d, 0xc5, 0x90, 0x82, 0x00, 0x1b, 0x00, 0x02, + 0x19, 0x9d, 0x19, 0x9b, 0x19, 0x9b, 0x19, 0x9b, 0x19, 0x9b, 0x19, 0x9b, + 0x19, 0xa1, 0x19, 0x9b, 0x19, 0x9b, 0x19, 0x9b, 0x19, 0x9b, 0x19, 0x9b, + 0x19, 0xa5, 0x19, 0x9b, 0x19, 0x9b, 0x19, 0x9b, 0x19, 0x9b, 0x19, 0x9b, + 0x19, 0xa9, 0x19, 0x9b, 0x19, 0x9b, 0x19, 0x9b, 0x19, 0x9b, 0x19, 0x9b, + 0x19, 0xad, 0x08, 0x0c, 0x0d, 0xc5, 0xa7, 0x74, 0xa6, 0x78, 0x08, 0x04, + 0x1a, 0x51, 0xa7, 0x8c, 0xa6, 0x90, 0x08, 0x04, 0x1a, 0x51, 0xa7, 0xa4, + 0xa6, 0xa8, 0x08, 0x04, 0x1a, 0x51, 0xa7, 0xbc, 0xa6, 0xc0, 0x08, 0x04, + 0x1a, 0x51, 0xa7, 0xd4, 0xa6, 0xd8, 0x08, 0x04, 0x1a, 0x51, 0x2c, 0x05, + 0x90, 0x8a, 0x00, 0x36, 0x1a, 0x0c, 0x0d, 0xc5, 0x90, 0x82, 0x00, 0x1b, + 0x00, 0x02, 0x19, 0xd4, 0x19, 0xd4, 0x19, 0xd6, 0x19, 0xd4, 0x19, 0xd4, + 0x19, 0xd4, 0x19, 0xdc, 0x19, 0xd4, 0x19, 0xd4, 0x19, 0xd4, 0x19, 0xe2, + 0x19, 0xd4, 0x19, 0xd4, 0x19, 0xd4, 0x19, 0xe8, 0x19, 0xd4, 0x19, 0xd4, + 0x19, 0xd4, 0x19, 0xee, 0x19, 0xd4, 0x19, 0xd4, 0x19, 0xd4, 0x19, 0xf4, + 0x19, 0xd4, 0x19, 0xd4, 0x19, 0xd4, 0x19, 0xfa, 0x08, 0x0c, 0x0d, 0xc5, + 0xa5, 0x74, 0xa4, 0x78, 0xa3, 0x7c, 0xa2, 0x80, 0x08, 0x04, 0x1a, 0x51, + 0xa5, 0x84, 0xa4, 0x88, 0xa3, 0x8c, 0xa2, 0x90, 0x08, 0x04, 0x1a, 0x51, + 0xa5, 0x94, 0xa4, 0x98, 0xa3, 0x9c, 0xa2, 0xa0, 0x08, 0x04, 0x1a, 0x51, + 0xa5, 0xa4, 0xa4, 0xa8, 0xa3, 0xac, 0xa2, 0xb0, 0x08, 0x04, 0x1a, 0x51, + 0xa5, 0xb4, 0xa4, 0xb8, 0xa3, 0xbc, 0xa2, 0xc0, 0x08, 0x04, 0x1a, 0x51, + 0xa5, 0xc4, 0xa4, 0xc8, 0xa3, 0xcc, 0xa2, 0xd0, 0x08, 0x04, 0x1a, 0x51, + 0xa5, 0xd4, 0xa4, 0xd8, 0xa3, 0xdc, 0xa2, 0xe0, 0x08, 0x04, 0x1a, 0x51, + 0x2c, 0x05, 0x90, 0x8a, 0x00, 0x34, 0x1a, 0x0c, 0x0d, 0xc5, 0x90, 0x82, + 0x00, 0x1b, 0x00, 0x02, 0x1a, 0x23, 0x1a, 0x21, 0x1a, 0x21, 0x1a, 0x21, + 0x1a, 0x21, 0x1a, 0x21, 0x1a, 0x2a, 0x1a, 0x21, 0x1a, 0x21, 0x1a, 0x21, + 0x1a, 0x21, 0x1a, 0x21, 0x1a, 0x31, 0x1a, 0x21, 0x1a, 0x21, 0x1a, 0x21, + 0x1a, 0x21, 0x1a, 0x21, 0x1a, 0x38, 0x1a, 0x21, 0x1a, 0x21, 0x1a, 0x21, + 0x1a, 0x21, 0x1a, 0x21, 0x1a, 0x3f, 0x08, 0x0c, 0x0d, 0xc5, 0xa5, 0x6c, + 0xa4, 0x70, 0xa7, 0x74, 0xa6, 0x78, 0xa3, 0x7c, 0xa2, 0x80, 0x04, 0x38, + 0xa5, 0x84, 0xa4, 0x88, 0xa7, 0x8c, 0xa6, 0x90, 0xa3, 0x94, 0xa2, 0x98, + 0x04, 0x00, 0xa5, 0x9c, 0xa4, 0xa0, 0xa7, 0xa4, 0xa6, 0xa8, 0xa3, 0xac, + 0xa2, 0xb0, 0x00, 0xc8, 0xa5, 0xb4, 0xa4, 0xb8, 0xa7, 0xbc, 0xa6, 0xc0, + 0xa3, 0xc4, 0xa2, 0xc8, 0x00, 0x90, 0xa5, 0xcc, 0xa4, 0xd0, 0xa7, 0xd4, + 0xa6, 0xd8, 0xa3, 0xdc, 0xa2, 0xe0, 0x00, 0x58, 0x9d, 0x86, 0x00, 0x0e, + 0x11, 0x30, 0x08, 0x0c, 0x20, 0x7f, 0x19, 0x04, 0x19, 0x5a, 0x90, 0x0e, + 0x00, 0x50, 0x08, 0x0c, 0x0d, 0xc5, 0xab, 0x2e, 0xaa, 0x32, 0xad, 0x1e, + 0xac, 0x22, 0xaf, 0x26, 0xae, 0x2a, 0x08, 0x0c, 0x20, 0x7f, 0x00, 0x05, + 0x60, 0x14, 0x20, 0x48, 0x61, 0x18, 0x81, 0xff, 0x01, 0x48, 0x81, 0x0c, + 0x81, 0x0c, 0x81, 0x0c, 0x81, 0xff, 0x11, 0x18, 0xa8, 0x87, 0x00, 0x01, + 0x00, 0x08, 0xa9, 0x86, 0x60, 0x1b, 0x00, 0x02, 0xa8, 0x74, 0x90, 0x84, + 0x00, 0xff, 0x90, 0x84, 0x00, 0x08, 0x01, 0x50, 0x00, 0xe9, 0x60, 0x00, + 0x90, 0x86, 0x00, 0x04, 0x11, 0x20, 0x20, 0x09, 0x00, 0x48, 0x08, 0x0c, + 0xb3, 0x52, 0x00, 0x05, 0xa9, 0x74, 0xd1, 0xdc, 0x11, 0x08, 0x00, 0x05, + 0xa9, 0x34, 0xa8, 0x8c, 0x91, 0x06, 0x11, 0x58, 0xa9, 0x38, 0xa8, 0x90, + 0x91, 0x06, 0x11, 0x38, 0x60, 0x1c, 0xc0, 0x84, 0x60, 0x1e, 0x20, 0x09, + 0x00, 0x48, 0x08, 0x04, 0xb3, 0x52, 0x00, 0x05, 0x01, 0x26, 0x00, 0xc6, + 0x20, 0x91, 0x22, 0x00, 0x00, 0xce, 0x79, 0x08, 0x91, 0x8c, 0x00, 0x07, + 0x91, 0x86, 0x00, 0x00, 0x05, 0xb0, 0x91, 0x86, 0x00, 0x03, 0x05, 0x98, + 0x60, 0x20, 0x60, 0x23, 0x00, 0x00, 0x00, 0x06, 0x20, 0x31, 0x00, 0x08, + 0x00, 0xc6, 0x78, 0x1f, 0x08, 0x08, 0x78, 0x08, 0xd0, 0x9c, 0x01, 0x20, + 0x08, 0x0c, 0x13, 0x94, 0x86, 0x31, 0x1d, 0xb8, 0x00, 0xce, 0x78, 0x1f, + 0x08, 0x00, 0x20, 0x31, 0x01, 0x68, 0x00, 0xc6, 0x78, 0x08, 0xd0, 0x9c, + 0x19, 0x0c, 0x13, 0x94, 0x00, 0xce, 0x20, 0x01, 0x00, 0x38, 0x08, 0x0c, + 0x1b, 0x69, 0x79, 0x30, 0x91, 0x86, 0x00, 0x40, 0x01, 0x60, 0x91, 0x86, + 0x00, 0x42, 0x19, 0x0c, 0x0d, 0xc5, 0x20, 0x01, 0x00, 0x1e, 0x80, 0x01, + 0x1d, 0xf0, 0x86, 0x31, 0x1d, 0x40, 0x08, 0x0c, 0x1b, 0x78, 0x00, 0x0e, + 0x60, 0x22, 0x01, 0x2e, 0x00, 0x05, 0x08, 0x0c, 0x1b, 0x65, 0x78, 0x27, + 0x00, 0x15, 0x78, 0x28, 0x9c, 0x06, 0x1d, 0xb8, 0x78, 0x2b, 0x00, 0x00, + 0x0c, 0xa0, 0x00, 0xf6, 0x20, 0x79, 0x03, 0x00, 0x78, 0x03, 0x00, 0x00, + 0x78, 0xab, 0x00, 0x04, 0x20, 0x01, 0xf0, 0x00, 0x80, 0x01, 0x09, 0x0c, + 0x0d, 0xc5, 0x7a, 0xac, 0xd2, 0xac, 0x1d, 0xd0, 0x00, 0xfe, 0x08, 0x0c, + 0x76, 0x37, 0x11, 0x88, 0x20, 0x01, 0x01, 0x38, 0x20, 0x03, 0x00, 0x00, + 0x20, 0x01, 0x01, 0x60, 0x20, 0x03, 0x00, 0x00, 0x20, 0x11, 0x01, 0x2c, + 0xa0, 0x01, 0xa0, 0x01, 0x82, 0x11, 0x1d, 0xe0, 0x00, 0x59, 0x08, 0x04, + 0x76, 0xe4, 0x04, 0x79, 0x00, 0x39, 0x20, 0x01, 0x01, 0x60, 0x25, 0x02, + 0x20, 0x01, 0x01, 0x38, 0x22, 0x02, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, + 0x02, 0x00, 0x08, 0x0c, 0x2c, 0x6d, 0x20, 0x09, 0x00, 0x3c, 0x08, 0x0c, + 0x24, 0x09, 0x20, 0x01, 0x01, 0x5d, 0x20, 0x03, 0x00, 0x00, 0x70, 0x00, + 0x90, 0x84, 0x00, 0x3c, 0x1d, 0xe0, 0x08, 0x0c, 0x87, 0x25, 0x70, 0xa0, + 0x70, 0xa2, 0x70, 0x98, 0x70, 0x9a, 0x70, 0x9c, 0x70, 0x9e, 0x20, 0x01, + 0x02, 0x0d, 0x20, 0x03, 0x00, 0x20, 0x00, 0xf6, 0x20, 0x79, 0x03, 0x00, + 0x08, 0x0c, 0x13, 0x22, 0x78, 0x03, 0x00, 0x01, 0x00, 0xfe, 0x00, 0xee, + 0x00, 0x05, 0x20, 0x01, 0x01, 0x38, 0x20, 0x14, 0x20, 0x03, 0x00, 0x00, + 0x20, 0x01, 0x01, 0x60, 0x20, 0x2c, 0x20, 0x03, 0x00, 0x00, 0x08, 0x0c, + 0x76, 0x37, 0x11, 0x08, 0x00, 0x05, 0x20, 0x21, 0x02, 0x60, 0x20, 0x01, + 0x01, 0x41, 0x20, 0x1c, 0xd3, 0xdc, 0x11, 0x68, 0x20, 0x01, 0x01, 0x09, + 0x20, 0x1c, 0x93, 0x9c, 0x00, 0x48, 0x11, 0x60, 0x20, 0x01, 0x01, 0x11, + 0x20, 0x1c, 0x83, 0xff, 0x11, 0x10, 0x84, 0x21, 0x1d, 0x70, 0x20, 0x01, + 0x01, 0x5d, 0x20, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x46, 0x20, 0x21, + 0x00, 0x19, 0x20, 0x03, 0x00, 0x48, 0xa0, 0x01, 0xa0, 0x01, 0x20, 0x1c, + 0x93, 0x9c, 0x00, 0x48, 0x01, 0x20, 0x84, 0x21, 0x1d, 0xb0, 0x00, 0x4e, + 0x0c, 0x60, 0x00, 0x4e, 0x0c, 0x40, 0x60, 0x1c, 0xc0, 0x84, 0x60, 0x1e, + 0x00, 0x05, 0x2c, 0x08, 0x62, 0x1c, 0x08, 0x0c, 0x16, 0x11, 0x79, 0x30, + 0x00, 0x05, 0x2c, 0x08, 0x62, 0x1c, 0x08, 0x0c, 0x16, 0xbc, 0x79, 0x30, + 0x00, 0x05, 0x80, 0x01, 0x1d, 0xf0, 0x00, 0x05, 0x20, 0x31, 0x00, 0x64, + 0x78, 0x1c, 0x90, 0x84, 0x00, 0x07, 0x01, 0x70, 0x20, 0x01, 0x00, 0x38, + 0x0c, 0x41, 0x91, 0x86, 0x00, 0x40, 0x09, 0x04, 0x1b, 0xd6, 0x20, 0x01, + 0x00, 0x1e, 0x0c, 0x69, 0x86, 0x31, 0x1d, 0x80, 0x08, 0x0c, 0x0d, 0xc5, + 0x78, 0x1f, 0x02, 0x02, 0x20, 0x01, 0x01, 0x5d, 0x20, 0x03, 0x00, 0x00, + 0x20, 0x01, 0x0d, 0xac, 0x0c, 0x01, 0x78, 0x1c, 0xd0, 0x84, 0x01, 0x10, + 0x08, 0x61, 0x04, 0xe0, 0x20, 0x01, 0x00, 0x30, 0x08, 0x91, 0x91, 0x86, + 0x00, 0x40, 0x05, 0x68, 0x78, 0x1c, 0xd0, 0x84, 0x1d, 0xa8, 0x78, 0x1f, + 0x01, 0x01, 0x20, 0x01, 0x00, 0x14, 0x08, 0x69, 0x20, 0x01, 0x00, 0x37, + 0x08, 0x21, 0x91, 0x86, 0x00, 0x40, 0x01, 0x40, 0x20, 0x01, 0x00, 0x30, + 0x08, 0x0c, 0x1b, 0x6f, 0x91, 0x86, 0x00, 0x40, 0x19, 0x0c, 0x0d, 0xc5, + 0x00, 0xd6, 0x20, 0x69, 0x02, 0x00, 0x69, 0x2c, 0xd1, 0xf4, 0x11, 0x70, + 0xd1, 0xc4, 0x01, 0x60, 0xd1, 0x9c, 0x01, 0x30, 0x68, 0x00, 0x90, 0x85, + 0x18, 0x00, 0x68, 0x02, 0x00, 0xde, 0x00, 0x80, 0x69, 0x08, 0x91, 0x84, + 0x00, 0x07, 0x1d, 0xb0, 0x00, 0xde, 0x78, 0x1f, 0x01, 0x00, 0x79, 0x1c, + 0x91, 0x84, 0x00, 0x07, 0x09, 0x0c, 0x0d, 0xc5, 0xa0, 0x01, 0xa0, 0x01, + 0x78, 0x1f, 0x02, 0x00, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x24, 0x00, + 0x20, 0x71, 0x1a, 0x69, 0x20, 0x79, 0x00, 0x90, 0x01, 0x2e, 0x00, 0x05, + 0x92, 0x80, 0x00, 0x05, 0x20, 0x04, 0x20, 0x48, 0xa9, 0x7c, 0xd1, 0xdc, + 0x19, 0x04, 0x1c, 0x78, 0xa9, 0x64, 0x91, 0x84, 0x00, 0x07, 0x00, 0x02, + 0x1b, 0xf4, 0x1c, 0x63, 0x1c, 0x0b, 0x1c, 0x0d, 0x1c, 0x0b, 0x1c, 0x4b, + 0x1c, 0x2b, 0x1c, 0x1a, 0x91, 0x8c, 0x00, 0xff, 0x91, 0x86, 0x00, 0x08, + 0x11, 0x70, 0xa8, 0x7c, 0xd0, 0xb4, 0x09, 0x04, 0x1e, 0xa5, 0x90, 0x06, + 0xa8, 0x42, 0xa8, 0x3e, 0xa9, 0x88, 0x29, 0x00, 0xa8, 0x5a, 0xa8, 0x13, + 0x20, 0xc2, 0x08, 0x04, 0x1c, 0x74, 0x91, 0x86, 0x00, 0x48, 0x09, 0x04, + 0x1c, 0x63, 0x08, 0x0c, 0x0d, 0xc5, 0x91, 0x84, 0x00, 0xff, 0x90, 0x86, + 0x00, 0x13, 0x09, 0x04, 0x1c, 0x63, 0x91, 0x84, 0x00, 0xff, 0x90, 0x86, + 0x00, 0x1b, 0x09, 0x04, 0x1c, 0x63, 0x0c, 0x88, 0xa8, 0x7c, 0xd0, 0xb4, + 0x09, 0x04, 0x1e, 0xa5, 0xa8, 0x90, 0xa8, 0x42, 0xa8, 0x3a, 0xa8, 0x8c, + 0xa8, 0x3e, 0xa8, 0x36, 0xa8, 0xac, 0xa8, 0x46, 0xa8, 0xb0, 0xa8, 0x4a, + 0xa9, 0x88, 0x08, 0x04, 0x1c, 0x6b, 0xa8, 0x64, 0x90, 0x84, 0x00, 0xff, + 0x90, 0x86, 0x00, 0x1e, 0x19, 0xd0, 0xa8, 0x7c, 0xd0, 0xb4, 0x09, 0x04, + 0x1e, 0xa5, 0xa8, 0x90, 0xa8, 0x42, 0xa8, 0x3a, 0xa8, 0x8c, 0xa8, 0x3e, + 0xa8, 0x36, 0xa8, 0xac, 0xa8, 0x46, 0xa8, 0xb0, 0xa8, 0x4a, 0xa8, 0x04, + 0xa8, 0x5a, 0x20, 0x40, 0xa0, 0x64, 0x90, 0x84, 0x00, 0x0f, 0x90, 0x80, + 0x20, 0xc7, 0x20, 0x05, 0xa8, 0x12, 0xa9, 0x88, 0x04, 0x48, 0x91, 0x8c, + 0x00, 0xff, 0x91, 0x86, 0x00, 0x15, 0x15, 0x40, 0xa8, 0x7c, 0xd0, 0xb4, + 0x09, 0x04, 0x1e, 0xa5, 0xa8, 0x04, 0xa8, 0x5a, 0x20, 0x40, 0xa0, 0x64, + 0x90, 0x84, 0x00, 0x0f, 0x90, 0x80, 0x20, 0xc7, 0x20, 0x05, 0xa8, 0x12, + 0xa9, 0x88, 0x90, 0x06, 0xa8, 0x42, 0xa8, 0x3e, 0x00, 0x88, 0xa8, 0x7c, + 0xd0, 0xb4, 0x09, 0x04, 0x1e, 0xa5, 0xa9, 0x88, 0x90, 0x06, 0xa8, 0x42, + 0xa8, 0x3e, 0x29, 0x00, 0xa8, 0x5a, 0xa8, 0x64, 0x90, 0x84, 0x00, 0x0f, + 0x90, 0x80, 0x20, 0xc7, 0x20, 0x05, 0xa8, 0x12, 0xa9, 0x16, 0xa8, 0x7c, + 0xc0, 0xdd, 0xa8, 0x7e, 0x00, 0x05, 0x00, 0xf6, 0x20, 0x79, 0x00, 0x90, + 0x78, 0x2c, 0xd0, 0xfc, 0x19, 0x0c, 0x1e, 0xeb, 0x00, 0xe6, 0x20, 0x71, + 0x1a, 0x69, 0x70, 0x00, 0x90, 0x05, 0x19, 0x04, 0x1c, 0xdf, 0x72, 0x06, + 0x92, 0x80, 0x00, 0x05, 0x20, 0x4c, 0x92, 0x80, 0x00, 0x04, 0x20, 0x04, + 0x78, 0x2b, 0x00, 0x04, 0x00, 0xf6, 0x20, 0x79, 0x02, 0x00, 0x78, 0x03, + 0x00, 0x40, 0x00, 0xfe, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x6c, 0x78, 0x36, + 0xb8, 0x90, 0x00, 0xbe, 0x00, 0xf6, 0x20, 0x79, 0x02, 0x00, 0x78, 0x03, + 0x00, 0x40, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, + 0xa0, 0x01, 0x78, 0x1a, 0x78, 0xd7, 0x00, 0x00, 0x00, 0xfe, 0xa8, 0x14, + 0x20, 0x50, 0xa8, 0x58, 0x20, 0x40, 0xa8, 0x10, 0x20, 0x60, 0xa0, 0x64, + 0x90, 0xec, 0x00, 0x0f, 0xa9, 0x44, 0x79, 0x1a, 0x71, 0x16, 0xa8, 0x48, + 0x78, 0x1e, 0x70, 0x1a, 0x90, 0x06, 0x70, 0x0e, 0x70, 0x12, 0x70, 0x04, + 0xa9, 0x40, 0xa8, 0x38, 0x91, 0x06, 0x15, 0x00, 0xa9, 0x3c, 0xa8, 0x34, + 0x91, 0x06, 0x11, 0xe0, 0x00, 0x06, 0x00, 0x16, 0xa9, 0x38, 0xa8, 0x34, + 0x91, 0x05, 0x01, 0x18, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x98, 0x00, 0x1e, + 0x00, 0x0e, 0x8a, 0xff, 0x01, 0xc8, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x09, 0x03, 0x06, 0x20, 0x0b, 0x08, 0x08, 0x00, 0xd9, 0x01, 0x08, + 0x00, 0xc9, 0x01, 0x2e, 0x90, 0x06, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, + 0x00, 0x36, 0x00, 0x46, 0xab, 0x38, 0xac, 0x34, 0x08, 0x0c, 0x20, 0xe7, + 0x00, 0x4e, 0x00, 0x3e, 0x0d, 0x30, 0x0c, 0x98, 0x90, 0x85, 0x00, 0x01, + 0x0c, 0x80, 0x20, 0x09, 0x03, 0x06, 0x20, 0x0b, 0x48, 0x00, 0x70, 0x27, + 0x00, 0x00, 0x00, 0x05, 0x00, 0x76, 0x00, 0x66, 0x00, 0x56, 0x00, 0x46, + 0x00, 0x36, 0x00, 0x26, 0x8a, 0xff, 0x09, 0x04, 0x1e, 0x9e, 0x70, 0x0c, + 0x72, 0x14, 0x92, 0x3a, 0x70, 0x10, 0x72, 0x18, 0x92, 0x03, 0x0a, 0x04, + 0x1e, 0x9d, 0x97, 0x05, 0x09, 0x04, 0x1e, 0x9d, 0x90, 0x3e, 0x27, 0x30, + 0xa8, 0x80, 0xd0, 0xfc, 0x11, 0x90, 0x2d, 0x00, 0x00, 0x02, 0x1e, 0x22, + 0x1d, 0x61, 0x1d, 0x61, 0x1e, 0x22, 0x1e, 0x22, 0x1d, 0xff, 0x1e, 0x22, + 0x1d, 0x61, 0x1e, 0x06, 0x1d, 0xb0, 0x1d, 0xb0, 0x1e, 0x22, 0x1e, 0x22, + 0x1e, 0x22, 0x1d, 0xf9, 0x1d, 0xb0, 0xc0, 0xfc, 0xa8, 0x82, 0xab, 0x2c, + 0xaa, 0x30, 0xad, 0x1c, 0xac, 0x20, 0xdd, 0x9c, 0x09, 0x04, 0x1e, 0x2f, + 0x2c, 0x05, 0x90, 0x8a, 0x00, 0x34, 0x1a, 0x0c, 0x0d, 0xc5, 0x90, 0x82, + 0x00, 0x1b, 0x00, 0x02, 0x1d, 0x4d, 0x1d, 0x4b, 0x1d, 0x4b, 0x1d, 0x4b, + 0x1d, 0x4b, 0x1d, 0x4b, 0x1d, 0x51, 0x1d, 0x4b, 0x1d, 0x4b, 0x1d, 0x4b, + 0x1d, 0x4b, 0x1d, 0x4b, 0x1d, 0x55, 0x1d, 0x4b, 0x1d, 0x4b, 0x1d, 0x4b, + 0x1d, 0x4b, 0x1d, 0x4b, 0x1d, 0x59, 0x1d, 0x4b, 0x1d, 0x4b, 0x1d, 0x4b, + 0x1d, 0x4b, 0x1d, 0x4b, 0x1d, 0x5d, 0x08, 0x0c, 0x0d, 0xc5, 0xa7, 0x74, + 0xa6, 0x78, 0x08, 0x04, 0x1e, 0x2f, 0xa7, 0x8c, 0xa6, 0x90, 0x08, 0x04, + 0x1e, 0x2f, 0xa7, 0xa4, 0xa6, 0xa8, 0x08, 0x04, 0x1e, 0x2f, 0xa7, 0xbc, + 0xa6, 0xc0, 0x08, 0x04, 0x1e, 0x2f, 0xa7, 0xd4, 0xa6, 0xd8, 0x08, 0x04, + 0x1e, 0x2f, 0x2c, 0x05, 0x90, 0x8a, 0x00, 0x36, 0x1a, 0x0c, 0x0d, 0xc5, + 0x90, 0x82, 0x00, 0x1b, 0x00, 0x02, 0x1d, 0x84, 0x1d, 0x84, 0x1d, 0x86, + 0x1d, 0x84, 0x1d, 0x84, 0x1d, 0x84, 0x1d, 0x8c, 0x1d, 0x84, 0x1d, 0x84, + 0x1d, 0x84, 0x1d, 0x92, 0x1d, 0x84, 0x1d, 0x84, 0x1d, 0x84, 0x1d, 0x98, + 0x1d, 0x84, 0x1d, 0x84, 0x1d, 0x84, 0x1d, 0x9e, 0x1d, 0x84, 0x1d, 0x84, + 0x1d, 0x84, 0x1d, 0xa4, 0x1d, 0x84, 0x1d, 0x84, 0x1d, 0x84, 0x1d, 0xaa, + 0x08, 0x0c, 0x0d, 0xc5, 0xa5, 0x74, 0xa4, 0x78, 0xa3, 0x7c, 0xa2, 0x80, + 0x08, 0x04, 0x1e, 0x2f, 0xa5, 0x84, 0xa4, 0x88, 0xa3, 0x8c, 0xa2, 0x90, + 0x08, 0x04, 0x1e, 0x2f, 0xa5, 0x94, 0xa4, 0x98, 0xa3, 0x9c, 0xa2, 0xa0, + 0x08, 0x04, 0x1e, 0x2f, 0xa5, 0xa4, 0xa4, 0xa8, 0xa3, 0xac, 0xa2, 0xb0, + 0x08, 0x04, 0x1e, 0x2f, 0xa5, 0xb4, 0xa4, 0xb8, 0xa3, 0xbc, 0xa2, 0xc0, + 0x08, 0x04, 0x1e, 0x2f, 0xa5, 0xc4, 0xa4, 0xc8, 0xa3, 0xcc, 0xa2, 0xd0, + 0x08, 0x04, 0x1e, 0x2f, 0xa5, 0xd4, 0xa4, 0xd8, 0xa3, 0xdc, 0xa2, 0xe0, + 0x08, 0x04, 0x1e, 0x2f, 0x2c, 0x05, 0x90, 0x8a, 0x00, 0x34, 0x1a, 0x0c, + 0x0d, 0xc5, 0x90, 0x82, 0x00, 0x1b, 0x00, 0x02, 0x1d, 0xd3, 0x1d, 0xd1, + 0x1d, 0xd1, 0x1d, 0xd1, 0x1d, 0xd1, 0x1d, 0xd1, 0x1d, 0xdb, 0x1d, 0xd1, + 0x1d, 0xd1, 0x1d, 0xd1, 0x1d, 0xd1, 0x1d, 0xd1, 0x1d, 0xe3, 0x1d, 0xd1, + 0x1d, 0xd1, 0x1d, 0xd1, 0x1d, 0xd1, 0x1d, 0xd1, 0x1d, 0xeb, 0x1d, 0xd1, + 0x1d, 0xd1, 0x1d, 0xd1, 0x1d, 0xd1, 0x1d, 0xd1, 0x1d, 0xf2, 0x08, 0x0c, + 0x0d, 0xc5, 0xa5, 0x6c, 0xa4, 0x70, 0xa7, 0x74, 0xa6, 0x78, 0xa3, 0x7c, + 0xa2, 0x80, 0x08, 0x04, 0x1e, 0x2f, 0xa5, 0x84, 0xa4, 0x88, 0xa7, 0x8c, + 0xa6, 0x90, 0xa3, 0x94, 0xa2, 0x98, 0x08, 0x04, 0x1e, 0x2f, 0xa5, 0x9c, + 0xa4, 0xa0, 0xa7, 0xa4, 0xa6, 0xa8, 0xa3, 0xac, 0xa2, 0xb0, 0x08, 0x04, + 0x1e, 0x2f, 0xa5, 0xb4, 0xa4, 0xb8, 0xa7, 0xbc, 0xa6, 0xc0, 0xa3, 0xc4, + 0xa2, 0xc8, 0x04, 0xe8, 0xa5, 0xcc, 0xa4, 0xd0, 0xa7, 0xd4, 0xa6, 0xd8, + 0xa3, 0xdc, 0xa2, 0xe0, 0x04, 0xb0, 0xa8, 0x64, 0x90, 0x84, 0x00, 0xff, + 0x90, 0x86, 0x00, 0x1e, 0x15, 0x18, 0x08, 0x0c, 0x20, 0x7f, 0x19, 0x04, + 0x1c, 0xfc, 0x90, 0x0e, 0x08, 0x04, 0x1e, 0x9e, 0xab, 0x64, 0x93, 0x9c, + 0x00, 0xff, 0x93, 0x86, 0x00, 0x48, 0x11, 0x80, 0x00, 0xc6, 0x70, 0x04, + 0x20, 0x60, 0x60, 0x04, 0x90, 0x86, 0x00, 0x43, 0x00, 0xce, 0x09, 0x04, + 0x1d, 0xb0, 0xab, 0x9c, 0x90, 0x16, 0xad, 0x8c, 0xac, 0x90, 0xaf, 0x94, + 0xae, 0x98, 0x00, 0x98, 0x93, 0x86, 0x00, 0x08, 0x09, 0x04, 0x1d, 0xb0, + 0x08, 0x0c, 0x0d, 0xc5, 0xa9, 0x64, 0x91, 0x8c, 0x00, 0xff, 0x91, 0x86, + 0x00, 0x13, 0x09, 0x04, 0x1d, 0x61, 0x91, 0x86, 0x00, 0x1b, 0x09, 0x04, + 0x1d, 0xb0, 0x08, 0x0c, 0x0d, 0xc5, 0x20, 0x09, 0x03, 0x0f, 0x21, 0x04, + 0xd0, 0xfc, 0x05, 0x38, 0x00, 0x66, 0x20, 0x09, 0x03, 0x06, 0x21, 0x34, + 0x20, 0x0b, 0x40, 0x00, 0x21, 0x04, 0x90, 0x84, 0x00, 0x30, 0x15, 0xb8, + 0x20, 0x31, 0x10, 0x00, 0x26, 0x00, 0x93, 0x02, 0x92, 0x8b, 0x00, 0x00, + 0xa8, 0x2e, 0xa9, 0x32, 0x02, 0x78, 0x91, 0x05, 0x01, 0x68, 0x20, 0x11, + 0x00, 0x00, 0x26, 0x18, 0x26, 0x00, 0x95, 0x00, 0xa8, 0x1e, 0x94, 0x81, + 0x00, 0x00, 0xa8, 0x22, 0xa8, 0x80, 0xc0, 0xfd, 0xa8, 0x82, 0x00, 0x20, + 0xa8, 0x2f, 0x00, 0x00, 0xa8, 0x33, 0x00, 0x00, 0x00, 0x6e, 0x7b, 0x12, + 0x7a, 0x16, 0x7d, 0x02, 0x7c, 0x06, 0x7f, 0x0a, 0x7e, 0x0e, 0x78, 0x2b, + 0x00, 0x01, 0x70, 0x00, 0x80, 0x00, 0x70, 0x02, 0xa8, 0x3c, 0x93, 0x00, + 0xa8, 0x3e, 0xa8, 0x40, 0x92, 0x01, 0xa8, 0x42, 0x70, 0x0c, 0x93, 0x00, + 0x70, 0x0e, 0x70, 0x10, 0x92, 0x01, 0x70, 0x12, 0x08, 0x0c, 0x20, 0x7f, + 0x04, 0x48, 0xd6, 0xb4, 0x01, 0x10, 0x20, 0x0b, 0x40, 0x40, 0x20, 0x31, + 0x00, 0x80, 0x95, 0x84, 0x00, 0x7f, 0x01, 0x08, 0x96, 0x32, 0x71, 0x24, + 0x70, 0x00, 0x90, 0x86, 0x00, 0x00, 0x11, 0x98, 0xc1, 0x85, 0x71, 0x26, + 0x20, 0x09, 0x03, 0x06, 0x21, 0x04, 0xd0, 0xb4, 0x19, 0x04, 0x1e, 0x40, + 0x20, 0x0b, 0x40, 0x40, 0x20, 0x09, 0x1a, 0x83, 0x21, 0x04, 0x80, 0x00, + 0x0a, 0x04, 0x1e, 0x40, 0x20, 0x0a, 0x08, 0x04, 0x1e, 0x40, 0xc1, 0x8d, + 0x71, 0x26, 0xd1, 0x84, 0x1d, 0x58, 0x08, 0x04, 0x1e, 0x40, 0x90, 0x06, + 0x00, 0x2e, 0x00, 0x3e, 0x00, 0x4e, 0x00, 0x5e, 0x00, 0x6e, 0x00, 0x7e, + 0x00, 0x05, 0x08, 0x0c, 0x0d, 0xc5, 0x00, 0x26, 0x20, 0x01, 0x01, 0x05, + 0x20, 0x03, 0x00, 0x10, 0x78, 0x2b, 0x00, 0x04, 0x70, 0x03, 0x00, 0x00, + 0x70, 0x04, 0x20, 0x60, 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0xd0, 0xd8, + 0x01, 0x18, 0xa8, 0x80, 0xc0, 0xbd, 0xa8, 0x82, 0x78, 0x2c, 0xd0, 0xac, + 0x1d, 0xe8, 0x08, 0x0c, 0x1c, 0xef, 0x60, 0x20, 0x90, 0x86, 0x00, 0x06, + 0x11, 0x80, 0x20, 0x61, 0x01, 0x00, 0x62, 0xc8, 0x20, 0x01, 0x00, 0xfa, + 0x80, 0x01, 0x1d, 0xf0, 0x60, 0xc8, 0x92, 0x06, 0x1d, 0xc0, 0x60, 0xc4, + 0xa8, 0x9a, 0x60, 0xc8, 0xa8, 0x96, 0x70, 0x04, 0x20, 0x60, 0x00, 0xc6, + 0x08, 0x0c, 0xcc, 0xf3, 0x00, 0xce, 0x20, 0x01, 0x19, 0xf7, 0x20, 0x04, + 0x9c, 0x06, 0x11, 0x60, 0x20, 0x09, 0x00, 0x40, 0x08, 0x0c, 0x24, 0x09, + 0x08, 0x0c, 0xac, 0x2b, 0x20, 0x11, 0x00, 0x00, 0x08, 0x0c, 0xaa, 0xc9, + 0x08, 0x0c, 0x9b, 0xd3, 0x00, 0x2e, 0x08, 0x04, 0x20, 0x2f, 0x01, 0x26, + 0x20, 0x91, 0x24, 0x00, 0xa8, 0x58, 0x20, 0x40, 0x79, 0x2c, 0x78, 0x2b, + 0x00, 0x02, 0x91, 0x84, 0x07, 0x00, 0x19, 0x04, 0x1e, 0xa7, 0x70, 0x00, + 0x00, 0x02, 0x20, 0x2f, 0x1e, 0xfd, 0x1f, 0x7d, 0x20, 0x2d, 0x80, 0x01, + 0x70, 0x02, 0x70, 0x27, 0x00, 0x00, 0xd1, 0x9c, 0x11, 0x58, 0x8a, 0xff, + 0x09, 0x04, 0x1f, 0x4a, 0x08, 0x0c, 0x1c, 0xf6, 0x09, 0x04, 0x20, 0x2f, + 0x08, 0x0c, 0x1c, 0xf6, 0x08, 0x04, 0x20, 0x2f, 0x78, 0x2b, 0x00, 0x04, + 0xd1, 0x94, 0x01, 0x48, 0xa8, 0x80, 0xc0, 0xfc, 0xa8, 0x82, 0x8a, 0xff, + 0x15, 0x18, 0xa8, 0x7c, 0xc0, 0xf5, 0xa8, 0x7e, 0x00, 0xf8, 0x00, 0x26, + 0x00, 0x36, 0xab, 0x3c, 0xaa, 0x40, 0x00, 0x16, 0x79, 0x10, 0xa8, 0x2c, + 0x91, 0x00, 0xa8, 0x2e, 0x79, 0x14, 0xa8, 0x30, 0x91, 0x01, 0xa8, 0x32, + 0x00, 0x1e, 0x78, 0x10, 0x93, 0x1a, 0x78, 0x14, 0x92, 0x13, 0x78, 0x00, + 0xa8, 0x1e, 0x78, 0x04, 0xa8, 0x22, 0xab, 0x3e, 0xaa, 0x42, 0x00, 0x3e, + 0x00, 0x2e, 0x08, 0x0c, 0x20, 0x9a, 0xa8, 0x80, 0xc0, 0xfd, 0xa8, 0x82, + 0x2a, 0x00, 0xa8, 0x16, 0x28, 0x00, 0xa8, 0x5a, 0x2c, 0x00, 0xa8, 0x12, + 0x70, 0x03, 0x00, 0x00, 0x20, 0x09, 0x03, 0x06, 0x20, 0x0b, 0x48, 0x00, + 0x70, 0x27, 0x00, 0x00, 0x08, 0x04, 0x20, 0x2f, 0x00, 0xf6, 0x00, 0x26, + 0x78, 0x1c, 0x00, 0x06, 0x78, 0x18, 0x00, 0x06, 0x20, 0x79, 0x01, 0x00, + 0x7a, 0x14, 0x92, 0x84, 0x19, 0x84, 0x90, 0x85, 0x00, 0x12, 0x78, 0x16, + 0x00, 0x36, 0x20, 0x19, 0x10, 0x00, 0x83, 0x19, 0x09, 0x0c, 0x0d, 0xc5, + 0x78, 0x20, 0xd0, 0xbc, 0x1d, 0xd0, 0x00, 0x3e, 0x79, 0xc8, 0x00, 0x0e, + 0x91, 0x02, 0x00, 0x1e, 0x00, 0x06, 0x00, 0x16, 0x79, 0xc4, 0x00, 0x0e, + 0x91, 0x03, 0x78, 0xc6, 0x00, 0x0e, 0x78, 0xca, 0x92, 0x84, 0x19, 0x84, + 0x90, 0x85, 0x00, 0x12, 0x78, 0x16, 0x00, 0x2e, 0x00, 0xfe, 0x78, 0x2b, + 0x00, 0x08, 0x70, 0x03, 0x00, 0x00, 0x08, 0x0c, 0x1c, 0xef, 0x08, 0x04, + 0x20, 0x2f, 0x80, 0x01, 0x70, 0x02, 0x70, 0x24, 0x80, 0x04, 0x70, 0x26, + 0xd1, 0x94, 0x01, 0x70, 0x78, 0x2c, 0xd0, 0xfc, 0x19, 0x04, 0x1e, 0xf0, + 0xd1, 0x9c, 0x19, 0x04, 0x20, 0x2b, 0x8a, 0xff, 0x09, 0x04, 0x20, 0x2f, + 0x08, 0x0c, 0x1c, 0xf6, 0x08, 0x04, 0x20, 0x2f, 0x00, 0x26, 0x00, 0x36, + 0xab, 0x3c, 0xaa, 0x40, 0x08, 0x0c, 0x20, 0x9a, 0xdd, 0x9c, 0x19, 0x04, + 0x1f, 0xea, 0x2c, 0x05, 0x90, 0x8a, 0x00, 0x36, 0x1a, 0x0c, 0x0d, 0xc5, + 0x90, 0x82, 0x00, 0x1b, 0x00, 0x02, 0x1f, 0xbe, 0x1f, 0xbe, 0x1f, 0xc0, + 0x1f, 0xbe, 0x1f, 0xbe, 0x1f, 0xbe, 0x1f, 0xc6, 0x1f, 0xbe, 0x1f, 0xbe, + 0x1f, 0xbe, 0x1f, 0xcc, 0x1f, 0xbe, 0x1f, 0xbe, 0x1f, 0xbe, 0x1f, 0xd2, + 0x1f, 0xbe, 0x1f, 0xbe, 0x1f, 0xbe, 0x1f, 0xd8, 0x1f, 0xbe, 0x1f, 0xbe, + 0x1f, 0xbe, 0x1f, 0xde, 0x1f, 0xbe, 0x1f, 0xbe, 0x1f, 0xbe, 0x1f, 0xe4, + 0x08, 0x0c, 0x0d, 0xc5, 0xa0, 0x7c, 0x93, 0x1a, 0xa0, 0x80, 0x92, 0x13, + 0x08, 0x04, 0x1f, 0x1f, 0xa0, 0x8c, 0x93, 0x1a, 0xa0, 0x90, 0x92, 0x13, + 0x08, 0x04, 0x1f, 0x1f, 0xa0, 0x9c, 0x93, 0x1a, 0xa0, 0xa0, 0x92, 0x13, + 0x08, 0x04, 0x1f, 0x1f, 0xa0, 0xac, 0x93, 0x1a, 0xa0, 0xb0, 0x92, 0x13, + 0x08, 0x04, 0x1f, 0x1f, 0xa0, 0xbc, 0x93, 0x1a, 0xa0, 0xc0, 0x92, 0x13, + 0x08, 0x04, 0x1f, 0x1f, 0xa0, 0xcc, 0x93, 0x1a, 0xa0, 0xd0, 0x92, 0x13, + 0x08, 0x04, 0x1f, 0x1f, 0xa0, 0xdc, 0x93, 0x1a, 0xa0, 0xe0, 0x92, 0x13, + 0x08, 0x04, 0x1f, 0x1f, 0x2c, 0x05, 0x90, 0x8a, 0x00, 0x34, 0x1a, 0x0c, + 0x0d, 0xc5, 0x90, 0x82, 0x00, 0x1b, 0x00, 0x02, 0x20, 0x0d, 0x20, 0x0b, + 0x20, 0x0b, 0x20, 0x0b, 0x20, 0x0b, 0x20, 0x0b, 0x20, 0x13, 0x20, 0x0b, + 0x20, 0x0b, 0x20, 0x0b, 0x20, 0x0b, 0x20, 0x0b, 0x20, 0x19, 0x20, 0x0b, + 0x20, 0x0b, 0x20, 0x0b, 0x20, 0x0b, 0x20, 0x0b, 0x20, 0x1f, 0x20, 0x0b, + 0x20, 0x0b, 0x20, 0x0b, 0x20, 0x0b, 0x20, 0x0b, 0x20, 0x25, 0x08, 0x0c, + 0x0d, 0xc5, 0xa0, 0x7c, 0x93, 0x1a, 0xa0, 0x80, 0x92, 0x13, 0x08, 0x04, + 0x1f, 0x1f, 0xa0, 0x94, 0x93, 0x1a, 0xa0, 0x98, 0x92, 0x13, 0x08, 0x04, + 0x1f, 0x1f, 0xa0, 0xac, 0x93, 0x1a, 0xa0, 0xb0, 0x92, 0x13, 0x08, 0x04, + 0x1f, 0x1f, 0xa0, 0xc4, 0x93, 0x1a, 0xa0, 0xc8, 0x92, 0x13, 0x08, 0x04, + 0x1f, 0x1f, 0xa0, 0xdc, 0x93, 0x1a, 0xa0, 0xe0, 0x92, 0x13, 0x08, 0x04, + 0x1f, 0x1f, 0x08, 0x04, 0x1f, 0x1b, 0x08, 0x0c, 0x0d, 0xc5, 0x01, 0x2e, + 0x00, 0x05, 0x00, 0xf6, 0x00, 0xe6, 0x20, 0x71, 0x1a, 0x69, 0x70, 0x00, + 0x90, 0x86, 0x00, 0x00, 0x09, 0x04, 0x20, 0x7a, 0x20, 0x79, 0x00, 0x90, + 0x20, 0x09, 0x02, 0x07, 0x21, 0x0c, 0xd1, 0x94, 0x01, 0xb8, 0x20, 0x09, + 0x02, 0x0c, 0x21, 0x0c, 0x91, 0x84, 0x00, 0x03, 0x01, 0x88, 0x08, 0x0c, + 0xf0, 0xa0, 0x20, 0x01, 0x01, 0x33, 0x20, 0x04, 0x90, 0x05, 0x09, 0x0c, + 0x0d, 0xc5, 0x00, 0x16, 0x20, 0x09, 0x00, 0x40, 0x08, 0x0c, 0x24, 0x09, + 0x00, 0x1e, 0x20, 0x01, 0x02, 0x0c, 0x21, 0x02, 0x20, 0x09, 0x02, 0x06, + 0x21, 0x04, 0x20, 0x09, 0x02, 0x03, 0x21, 0x0c, 0x91, 0x06, 0x11, 0x20, + 0x20, 0x09, 0x00, 0x40, 0x08, 0x0c, 0x24, 0x09, 0x78, 0x2c, 0xd0, 0xfc, + 0x09, 0xa8, 0x08, 0x0c, 0x1e, 0xeb, 0x70, 0x00, 0x90, 0x86, 0x00, 0x00, + 0x19, 0x78, 0x78, 0x2b, 0x00, 0x04, 0x78, 0x2c, 0xd0, 0xac, 0x1d, 0xe8, + 0x20, 0x09, 0x00, 0x40, 0x08, 0x0c, 0x24, 0x09, 0x78, 0x2b, 0x00, 0x02, + 0x70, 0x03, 0x00, 0x00, 0x08, 0x0c, 0x1c, 0xef, 0x00, 0xee, 0x00, 0xfe, + 0x00, 0x05, 0xa8, 0x80, 0xd0, 0xfc, 0x11, 0xa8, 0x8c, 0x60, 0x2c, 0x05, + 0x90, 0x05, 0x01, 0x10, 0x8a, 0x51, 0x00, 0x05, 0xa0, 0x04, 0x90, 0x05, + 0x01, 0x68, 0xa8, 0x5a, 0x20, 0x40, 0xa0, 0x64, 0x90, 0x84, 0x00, 0x0f, + 0x90, 0x80, 0x20, 0xc7, 0x20, 0x65, 0x8c, 0xff, 0x09, 0x0c, 0x0d, 0xc5, + 0x8a, 0x51, 0x00, 0x05, 0x20, 0x50, 0x00, 0x05, 0xa8, 0x80, 0xd0, 0xfc, + 0x11, 0xb8, 0x8a, 0x50, 0x8c, 0x61, 0x2c, 0x05, 0x90, 0x05, 0x11, 0x90, + 0x28, 0x00, 0x99, 0x06, 0x01, 0x20, 0xa0, 0x00, 0x90, 0x05, 0x11, 0x08, + 0x29, 0x00, 0x20, 0x40, 0xa8, 0x5a, 0xa0, 0x64, 0x90, 0x84, 0x00, 0x0f, + 0x90, 0x80, 0x20, 0xd7, 0x20, 0x65, 0x8c, 0xff, 0x09, 0x0c, 0x0d, 0xc5, + 0x00, 0x05, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x25, 0x00, 0x29, + 0x00, 0x2d, 0x00, 0x31, 0x00, 0x35, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x21, + 0x00, 0x27, 0x00, 0x2d, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, + 0x00, 0x00, 0x00, 0x00, 0x20, 0xba, 0x20, 0xb6, 0x20, 0xba, 0x20, 0xba, + 0x20, 0xc4, 0x00, 0x00, 0x20, 0xba, 0x20, 0xc1, 0x20, 0xc1, 0x20, 0xbe, + 0x20, 0xc1, 0x20, 0xc1, 0x00, 0x00, 0x20, 0xc4, 0x20, 0xc1, 0x00, 0x00, + 0x20, 0xbc, 0x20, 0xbc, 0x00, 0x00, 0x20, 0xbc, 0x20, 0xc4, 0x00, 0x00, + 0x20, 0xbc, 0x20, 0xc2, 0x20, 0xc2, 0x20, 0xc2, 0x00, 0x00, 0x20, 0xc2, + 0x00, 0x00, 0x20, 0xc4, 0x20, 0xc2, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0x86, + 0xab, 0x42, 0xac, 0x3e, 0xa8, 0x88, 0x90, 0x55, 0x09, 0x04, 0x22, 0xc6, + 0x29, 0x40, 0xa0, 0x64, 0x90, 0xec, 0x00, 0x0f, 0x90, 0x84, 0x00, 0xff, + 0x90, 0x86, 0x00, 0x08, 0x11, 0x18, 0x20, 0x61, 0x20, 0xc2, 0x00, 0xd0, + 0x9d, 0xe0, 0x20, 0xc7, 0x9d, 0x86, 0x00, 0x07, 0x01, 0x30, 0x9d, 0x86, + 0x00, 0x0e, 0x01, 0x18, 0x9d, 0x86, 0x00, 0x0f, 0x11, 0x20, 0xa0, 0x8c, + 0x94, 0x22, 0xa0, 0x90, 0x93, 0x1b, 0x2c, 0x05, 0x90, 0x65, 0x11, 0x40, + 0x03, 0x10, 0x08, 0x04, 0x22, 0xc6, 0xa0, 0x04, 0x90, 0x45, 0x09, 0x04, + 0x22, 0xc6, 0x08, 0xd8, 0x2c, 0x05, 0x90, 0x05, 0x09, 0x04, 0x21, 0xae, + 0xdd, 0x9c, 0x19, 0x04, 0x21, 0x6a, 0x90, 0x8a, 0x00, 0x36, 0x1a, 0x0c, + 0x0d, 0xc5, 0x90, 0x82, 0x00, 0x1b, 0x00, 0x02, 0x21, 0x3f, 0x21, 0x3f, + 0x21, 0x41, 0x21, 0x3f, 0x21, 0x3f, 0x21, 0x3f, 0x21, 0x47, 0x21, 0x3f, + 0x21, 0x3f, 0x21, 0x3f, 0x21, 0x4d, 0x21, 0x3f, 0x21, 0x3f, 0x21, 0x3f, + 0x21, 0x53, 0x21, 0x3f, 0x21, 0x3f, 0x21, 0x3f, 0x21, 0x59, 0x21, 0x3f, + 0x21, 0x3f, 0x21, 0x3f, 0x21, 0x5f, 0x21, 0x3f, 0x21, 0x3f, 0x21, 0x3f, + 0x21, 0x65, 0x08, 0x0c, 0x0d, 0xc5, 0xa0, 0x7c, 0x94, 0x22, 0xa0, 0x80, + 0x93, 0x1b, 0x08, 0x04, 0x21, 0xa4, 0xa0, 0x8c, 0x94, 0x22, 0xa0, 0x90, + 0x93, 0x1b, 0x08, 0x04, 0x21, 0xa4, 0xa0, 0x9c, 0x94, 0x22, 0xa0, 0xa0, + 0x93, 0x1b, 0x08, 0x04, 0x21, 0xa4, 0xa0, 0xac, 0x94, 0x22, 0xa0, 0xb0, + 0x93, 0x1b, 0x08, 0x04, 0x21, 0xa4, 0xa0, 0xbc, 0x94, 0x22, 0xa0, 0xc0, + 0x93, 0x1b, 0x08, 0x04, 0x21, 0xa4, 0xa0, 0xcc, 0x94, 0x22, 0xa0, 0xd0, + 0x93, 0x1b, 0x08, 0x04, 0x21, 0xa4, 0xa0, 0xdc, 0x94, 0x22, 0xa0, 0xe0, + 0x93, 0x1b, 0x04, 0xd0, 0x90, 0x8a, 0x00, 0x34, 0x1a, 0x0c, 0x0d, 0xc5, + 0x90, 0x82, 0x00, 0x1b, 0x00, 0x02, 0x21, 0x8c, 0x21, 0x8a, 0x21, 0x8a, + 0x21, 0x8a, 0x21, 0x8a, 0x21, 0x8a, 0x21, 0x91, 0x21, 0x8a, 0x21, 0x8a, + 0x21, 0x8a, 0x21, 0x8a, 0x21, 0x8a, 0x21, 0x96, 0x21, 0x8a, 0x21, 0x8a, + 0x21, 0x8a, 0x21, 0x8a, 0x21, 0x8a, 0x21, 0x9b, 0x21, 0x8a, 0x21, 0x8a, + 0x21, 0x8a, 0x21, 0x8a, 0x21, 0x8a, 0x21, 0xa0, 0x08, 0x0c, 0x0d, 0xc5, + 0xa0, 0x7c, 0x94, 0x22, 0xa0, 0x80, 0x93, 0x1b, 0x00, 0x98, 0xa0, 0x94, + 0x94, 0x22, 0xa0, 0x98, 0x93, 0x1b, 0x00, 0x70, 0xa0, 0xac, 0x94, 0x22, + 0xa0, 0xb0, 0x93, 0x1b, 0x00, 0x48, 0xa0, 0xc4, 0x94, 0x22, 0xa0, 0xc8, + 0x93, 0x1b, 0x00, 0x20, 0xa0, 0xdc, 0x94, 0x22, 0xa0, 0xe0, 0x93, 0x1b, + 0x06, 0x30, 0x23, 0x00, 0x94, 0x05, 0x01, 0x60, 0x8a, 0x51, 0x09, 0x04, + 0x22, 0xc6, 0x8c, 0x60, 0x08, 0x04, 0x21, 0x16, 0xa0, 0x04, 0x90, 0x45, + 0x09, 0x04, 0x22, 0xc6, 0x08, 0x04, 0x20, 0xf1, 0x8a, 0x51, 0x09, 0x04, + 0x22, 0xc6, 0x8c, 0x60, 0x2c, 0x05, 0x90, 0x05, 0x11, 0x58, 0xa0, 0x04, + 0x90, 0x45, 0x09, 0x04, 0x22, 0xc6, 0xa0, 0x64, 0x90, 0xec, 0x00, 0x0f, + 0x9d, 0xe0, 0x20, 0xc7, 0x2c, 0x05, 0x20, 0x60, 0xa8, 0x80, 0xc0, 0xfc, + 0xa8, 0x82, 0x08, 0x04, 0x22, 0xbb, 0x2c, 0x05, 0x84, 0x22, 0x84, 0x20, + 0x83, 0x1a, 0x93, 0x99, 0x00, 0x00, 0xac, 0x2e, 0xab, 0x32, 0xdd, 0x9c, + 0x19, 0x04, 0x22, 0x58, 0x90, 0x82, 0x00, 0x1b, 0x00, 0x02, 0x21, 0xf4, + 0x21, 0xf4, 0x21, 0xf6, 0x21, 0xf4, 0x21, 0xf4, 0x21, 0xf4, 0x22, 0x04, + 0x21, 0xf4, 0x21, 0xf4, 0x21, 0xf4, 0x22, 0x12, 0x21, 0xf4, 0x21, 0xf4, + 0x21, 0xf4, 0x22, 0x20, 0x21, 0xf4, 0x21, 0xf4, 0x21, 0xf4, 0x22, 0x2e, + 0x21, 0xf4, 0x21, 0xf4, 0x21, 0xf4, 0x22, 0x3c, 0x21, 0xf4, 0x21, 0xf4, + 0x21, 0xf4, 0x22, 0x4a, 0x08, 0x0c, 0x0d, 0xc5, 0xa1, 0x7c, 0x24, 0x00, + 0x91, 0x22, 0xa1, 0x80, 0x23, 0x00, 0x91, 0x1b, 0x0a, 0x0c, 0x0d, 0xc5, + 0xa0, 0x74, 0x94, 0x20, 0xa0, 0x78, 0x93, 0x19, 0x08, 0x04, 0x22, 0xb6, + 0xa1, 0x8c, 0x24, 0x00, 0x91, 0x22, 0xa1, 0x90, 0x23, 0x00, 0x91, 0x1b, + 0x0a, 0x0c, 0x0d, 0xc5, 0xa0, 0x84, 0x94, 0x20, 0xa0, 0x88, 0x93, 0x19, + 0x08, 0x04, 0x22, 0xb6, 0xa1, 0x9c, 0x24, 0x00, 0x91, 0x22, 0xa1, 0xa0, + 0x23, 0x00, 0x91, 0x1b, 0x0a, 0x0c, 0x0d, 0xc5, 0xa0, 0x94, 0x94, 0x20, + 0xa0, 0x98, 0x93, 0x19, 0x08, 0x04, 0x22, 0xb6, 0xa1, 0xac, 0x24, 0x00, + 0x91, 0x22, 0xa1, 0xb0, 0x23, 0x00, 0x91, 0x1b, 0x0a, 0x0c, 0x0d, 0xc5, + 0xa0, 0xa4, 0x94, 0x20, 0xa0, 0xa8, 0x93, 0x19, 0x08, 0x04, 0x22, 0xb6, + 0xa1, 0xbc, 0x24, 0x00, 0x91, 0x22, 0xa1, 0xc0, 0x23, 0x00, 0x91, 0x1b, + 0x0a, 0x0c, 0x0d, 0xc5, 0xa0, 0xb4, 0x94, 0x20, 0xa0, 0xb8, 0x93, 0x19, + 0x08, 0x04, 0x22, 0xb6, 0xa1, 0xcc, 0x24, 0x00, 0x91, 0x22, 0xa1, 0xd0, + 0x23, 0x00, 0x91, 0x1b, 0x0a, 0x0c, 0x0d, 0xc5, 0xa0, 0xc4, 0x94, 0x20, + 0xa0, 0xc8, 0x93, 0x19, 0x08, 0x04, 0x22, 0xb6, 0xa1, 0xdc, 0x24, 0x00, + 0x91, 0x22, 0xa1, 0xe0, 0x23, 0x00, 0x91, 0x1b, 0x0a, 0x0c, 0x0d, 0xc5, + 0xa0, 0xd4, 0x94, 0x20, 0xa0, 0xd8, 0x93, 0x19, 0x08, 0x04, 0x22, 0xb6, + 0x90, 0x82, 0x00, 0x1b, 0x00, 0x02, 0x22, 0x76, 0x22, 0x74, 0x22, 0x74, + 0x22, 0x74, 0x22, 0x74, 0x22, 0x74, 0x22, 0x83, 0x22, 0x74, 0x22, 0x74, + 0x22, 0x74, 0x22, 0x74, 0x22, 0x74, 0x22, 0x90, 0x22, 0x74, 0x22, 0x74, + 0x22, 0x74, 0x22, 0x74, 0x22, 0x74, 0x22, 0x9d, 0x22, 0x74, 0x22, 0x74, + 0x22, 0x74, 0x22, 0x74, 0x22, 0x74, 0x22, 0xaa, 0x08, 0x0c, 0x0d, 0xc5, + 0xa1, 0x7c, 0x24, 0x00, 0x91, 0x22, 0xa1, 0x80, 0x23, 0x00, 0x91, 0x1b, + 0x0a, 0x0c, 0x0d, 0xc5, 0xa0, 0x6c, 0x94, 0x20, 0xa0, 0x70, 0x93, 0x19, + 0x04, 0x98, 0xa1, 0x94, 0x24, 0x00, 0x91, 0x22, 0xa1, 0x98, 0x23, 0x00, + 0x91, 0x1b, 0x0a, 0x0c, 0x0d, 0xc5, 0xa0, 0x84, 0x94, 0x20, 0xa0, 0x88, + 0x93, 0x19, 0x04, 0x30, 0xa1, 0xac, 0x24, 0x00, 0x91, 0x22, 0xa1, 0xb0, + 0x23, 0x00, 0x91, 0x1b, 0x0a, 0x0c, 0x0d, 0xc5, 0xa0, 0x9c, 0x94, 0x20, + 0xa0, 0xa0, 0x93, 0x19, 0x00, 0xc8, 0xa1, 0xc4, 0x24, 0x00, 0x91, 0x22, + 0xa1, 0xc8, 0x23, 0x00, 0x91, 0x1b, 0x0a, 0x0c, 0x0d, 0xc5, 0xa0, 0xb4, + 0x94, 0x20, 0xa0, 0xb8, 0x93, 0x19, 0x00, 0x60, 0xa1, 0xdc, 0x24, 0x00, + 0x91, 0x22, 0xa1, 0xe0, 0x23, 0x00, 0x91, 0x1b, 0x0a, 0x0c, 0x0d, 0xc5, + 0xa0, 0xcc, 0x94, 0x20, 0xa0, 0xd0, 0x93, 0x19, 0xac, 0x1e, 0xab, 0x22, + 0xa8, 0x80, 0xc0, 0xfd, 0xa8, 0x82, 0x28, 0x00, 0xa8, 0x5a, 0x2c, 0x00, + 0xa8, 0x12, 0x2a, 0x00, 0xa8, 0x16, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, + 0x90, 0x06, 0x00, 0x28, 0x00, 0x8e, 0x00, 0xde, 0x00, 0xce, 0x90, 0x85, + 0x00, 0x01, 0x00, 0x05, 0x20, 0x01, 0x00, 0x05, 0x20, 0x04, 0xd0, 0xbc, + 0x19, 0x0c, 0x0d, 0xbe, 0x90, 0x84, 0x00, 0x07, 0x00, 0x02, 0x22, 0xe7, + 0x1e, 0xeb, 0x22, 0xe7, 0x22, 0xdd, 0x22, 0xe0, 0x22, 0xe3, 0x22, 0xe0, + 0x22, 0xe3, 0x08, 0x0c, 0x1e, 0xeb, 0x00, 0x05, 0x08, 0x0c, 0x11, 0xb2, + 0x00, 0x05, 0x08, 0x0c, 0x1e, 0xeb, 0x08, 0x0c, 0x11, 0xb2, 0x00, 0x05, + 0x01, 0x26, 0x20, 0x91, 0x26, 0x00, 0x20, 0x79, 0x02, 0x00, 0x20, 0x71, + 0x02, 0x60, 0x20, 0x69, 0x18, 0x00, 0x78, 0x17, 0x00, 0x00, 0x78, 0x9b, + 0x08, 0x14, 0x78, 0xa3, 0x04, 0x06, 0x78, 0x9f, 0x04, 0x10, 0x20, 0x09, + 0x01, 0x3b, 0x20, 0x0b, 0x04, 0x00, 0x78, 0x1b, 0x00, 0x02, 0x78, 0x3b, + 0x00, 0x1f, 0x78, 0x37, 0x00, 0x20, 0x78, 0x03, 0x16, 0x00, 0x01, 0x2e, + 0x00, 0x05, 0x20, 0x91, 0x26, 0x00, 0x78, 0x1c, 0xd0, 0xa4, 0x19, 0x0c, + 0x24, 0x06, 0x79, 0x00, 0xd1, 0xdc, 0x11, 0x18, 0x90, 0x84, 0x00, 0x06, + 0x00, 0x1a, 0x90, 0x84, 0x00, 0x0e, 0x00, 0x02, 0x23, 0x2e, 0x23, 0x26, + 0x80, 0x81, 0x23, 0x26, 0x23, 0x28, 0x23, 0x28, 0x23, 0x28, 0x23, 0x28, + 0x80, 0x67, 0x23, 0x26, 0x23, 0x2a, 0x23, 0x26, 0x23, 0x28, 0x23, 0x26, + 0x23, 0x28, 0x23, 0x26, 0x08, 0x0c, 0x0d, 0xc5, 0x00, 0x31, 0x00, 0x20, + 0x08, 0x0c, 0x80, 0x67, 0x08, 0x0c, 0x80, 0x81, 0x00, 0x05, 0x00, 0x06, + 0x00, 0x16, 0x00, 0x26, 0x08, 0x0c, 0xf0, 0xa0, 0x79, 0x30, 0x91, 0x84, + 0x00, 0x03, 0x01, 0xc0, 0x20, 0x01, 0x19, 0xf7, 0x20, 0x04, 0x90, 0x05, + 0x01, 0x70, 0x20, 0x01, 0x01, 0x33, 0x20, 0x04, 0x90, 0x05, 0x09, 0x0c, + 0x0d, 0xc5, 0x00, 0xc6, 0x20, 0x01, 0x19, 0xf7, 0x20, 0x64, 0x08, 0x0c, + 0xcc, 0xf3, 0x00, 0xce, 0x00, 0xf8, 0x20, 0x09, 0x00, 0x40, 0x08, 0x0c, + 0x24, 0x09, 0x00, 0xd0, 0x91, 0x84, 0x00, 0x14, 0x01, 0xa0, 0x6a, 0x00, + 0x92, 0x86, 0x00, 0x03, 0x01, 0x60, 0x08, 0x0c, 0x76, 0x37, 0x11, 0x38, + 0x08, 0x0c, 0x79, 0x32, 0x08, 0x0c, 0x61, 0x2e, 0x08, 0x0c, 0x75, 0x63, + 0x00, 0x10, 0x08, 0x0c, 0x5f, 0xed, 0x08, 0x0c, 0x81, 0x30, 0x00, 0x41, + 0x00, 0x18, 0x91, 0x84, 0x95, 0x40, 0x1d, 0xc8, 0x00, 0x2e, 0x00, 0x1e, + 0x00, 0x0e, 0x00, 0x05, 0x00, 0xe6, 0x00, 0x36, 0x00, 0x46, 0x00, 0x56, + 0x20, 0x71, 0x1a, 0x65, 0x08, 0x0c, 0x1a, 0xd9, 0x00, 0x5e, 0x00, 0x4e, + 0x00, 0x3e, 0x00, 0xee, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x2e, 0x00, + 0x20, 0x71, 0x18, 0x00, 0x71, 0x28, 0x20, 0x01, 0x19, 0x6f, 0x21, 0x02, + 0x20, 0x01, 0x19, 0x77, 0x21, 0x02, 0x20, 0x01, 0x01, 0x3b, 0x21, 0x02, + 0x20, 0x79, 0x02, 0x00, 0x20, 0x01, 0x02, 0x01, 0x78, 0x9e, 0x78, 0xa3, + 0x02, 0x00, 0x91, 0x98, 0x00, 0x07, 0x83, 0x1c, 0x83, 0x1c, 0x83, 0x1c, + 0x93, 0x98, 0x00, 0x05, 0x23, 0x20, 0x91, 0x82, 0x02, 0x04, 0x12, 0x30, + 0x20, 0x11, 0x00, 0x08, 0x84, 0x23, 0x84, 0x23, 0x84, 0x23, 0x04, 0x88, + 0x91, 0x82, 0x02, 0x4c, 0x12, 0x40, 0x20, 0x11, 0x00, 0x07, 0x84, 0x03, + 0x80, 0x03, 0x94, 0x00, 0x94, 0x00, 0x94, 0x20, 0x04, 0x30, 0x91, 0x82, + 0x02, 0xbc, 0x12, 0x38, 0x20, 0x11, 0x00, 0x06, 0x84, 0x03, 0x80, 0x03, + 0x94, 0x00, 0x94, 0x20, 0x00, 0xe0, 0x91, 0x82, 0x03, 0x4c, 0x12, 0x30, + 0x20, 0x11, 0x00, 0x05, 0x84, 0x03, 0x80, 0x03, 0x94, 0x20, 0x00, 0x98, + 0x91, 0x82, 0x04, 0x2c, 0x12, 0x28, 0x20, 0x11, 0x00, 0x04, 0x84, 0x23, + 0x84, 0x23, 0x00, 0x58, 0x91, 0x82, 0x05, 0x9c, 0x12, 0x28, 0x20, 0x11, + 0x00, 0x03, 0x84, 0x03, 0x94, 0x20, 0x00, 0x18, 0x20, 0x11, 0x00, 0x02, + 0x84, 0x23, 0x94, 0x82, 0x02, 0x28, 0x80, 0x02, 0x80, 0x20, 0x83, 0x01, + 0x94, 0x02, 0x01, 0x10, 0x02, 0x08, 0x83, 0x21, 0x82, 0x17, 0x82, 0x03, + 0x94, 0x05, 0x78, 0x9a, 0x01, 0x2e, 0x00, 0x05, 0x00, 0x06, 0x00, 0xd6, + 0x20, 0x69, 0x02, 0x00, 0x68, 0x14, 0x90, 0x84, 0xff, 0xc0, 0x91, 0x0d, + 0x69, 0x16, 0x00, 0xde, 0x00, 0x0e, 0x00, 0x05, 0x00, 0xd6, 0x20, 0x69, + 0x02, 0x00, 0x90, 0x05, 0x68, 0x10, 0x01, 0x10, 0xc0, 0xa5, 0x00, 0x08, + 0xc0, 0xa4, 0x68, 0x12, 0x00, 0xde, 0x00, 0x05, 0x00, 0x06, 0x00, 0xd6, + 0x20, 0x69, 0x02, 0x00, 0x68, 0x10, 0x90, 0x84, 0xff, 0xf8, 0x91, 0x0d, + 0x69, 0x12, 0x00, 0xde, 0x00, 0x0e, 0x00, 0x05, 0x79, 0x38, 0x08, 0x0c, + 0x0d, 0xbe, 0x00, 0xf6, 0x20, 0x79, 0x02, 0x00, 0x79, 0x02, 0xa0, 0x01, + 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0x79, 0x02, + 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, + 0x00, 0xfe, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x28, 0x00, 0x20, 0x61, + 0x01, 0x00, 0x20, 0x71, 0x18, 0x00, 0x20, 0x09, 0x00, 0x00, 0x08, 0x0c, + 0x2c, 0x67, 0x08, 0x0c, 0x2b, 0x82, 0x60, 0x54, 0x80, 0x04, 0x80, 0x04, + 0x80, 0x04, 0x80, 0x04, 0x90, 0x84, 0x00, 0x0c, 0x61, 0x50, 0x91, 0x8c, + 0xff, 0xf3, 0x91, 0x05, 0x60, 0x52, 0x60, 0x50, 0x90, 0x84, 0xb1, 0x7f, + 0x90, 0x85, 0x20, 0x00, 0x60, 0x52, 0x20, 0x09, 0x19, 0x9d, 0x20, 0x11, + 0x19, 0x9e, 0x63, 0x58, 0x93, 0x9c, 0x38, 0xf0, 0x23, 0x20, 0x08, 0x0c, + 0x2b, 0xc6, 0x12, 0x38, 0x93, 0x9d, 0x40, 0x03, 0x94, 0xa5, 0x86, 0x03, + 0x23, 0x0a, 0x24, 0x12, 0x00, 0x30, 0x93, 0x9d, 0x02, 0x03, 0x94, 0xa5, + 0x86, 0x03, 0x23, 0x0a, 0x24, 0x12, 0x90, 0x06, 0x08, 0x0c, 0x2b, 0xb1, + 0x90, 0x06, 0x08, 0x0c, 0x2b, 0x94, 0x20, 0xa9, 0x00, 0x12, 0x1d, 0x04, + 0x24, 0x5b, 0x20, 0x91, 0x60, 0x00, 0x1f, 0x04, 0x24, 0x5b, 0x60, 0x2f, + 0x01, 0x00, 0x60, 0x2f, 0x00, 0x00, 0x60, 0x50, 0x90, 0x85, 0x04, 0x00, + 0x90, 0x84, 0xdf, 0xff, 0x60, 0x52, 0x60, 0x24, 0x60, 0x26, 0x08, 0x0c, + 0x28, 0xac, 0x20, 0x09, 0x00, 0xef, 0x61, 0x32, 0x61, 0x36, 0x08, 0x0c, + 0x28, 0xbc, 0x60, 0xe7, 0x00, 0x00, 0x61, 0xea, 0x20, 0x01, 0x18, 0x0d, + 0x20, 0x04, 0xd0, 0x8c, 0x20, 0x01, 0x00, 0x02, 0x11, 0x10, 0x20, 0x01, + 0x00, 0x08, 0x60, 0xe2, 0x60, 0x4b, 0xf7, 0xf7, 0x60, 0x43, 0x00, 0x00, + 0x60, 0x2f, 0x00, 0x80, 0x60, 0x2f, 0x00, 0x00, 0x60, 0x07, 0x34, 0x9f, + 0x60, 0xbb, 0x00, 0x00, 0x20, 0xa9, 0x00, 0x18, 0x60, 0xbf, 0x00, 0x00, + 0x1f, 0x04, 0x24, 0x90, 0x60, 0xbb, 0x00, 0x00, 0x60, 0xbf, 0x01, 0x08, + 0x60, 0xbf, 0x00, 0x12, 0x60, 0xbf, 0x04, 0x05, 0x60, 0xbf, 0x00, 0x14, + 0x60, 0xbf, 0x03, 0x20, 0x60, 0xbf, 0x00, 0x18, 0x60, 0x1b, 0x00, 0xf0, + 0x60, 0x1f, 0x00, 0x1e, 0x60, 0x0f, 0x00, 0x6b, 0x60, 0x2b, 0x40, 0x2f, + 0x01, 0x2e, 0x00, 0x05, 0x00, 0xf6, 0x20, 0x79, 0x01, 0x40, 0x78, 0xc3, + 0x00, 0x80, 0x78, 0xc3, 0x00, 0x83, 0x78, 0xc3, 0x00, 0x00, 0x00, 0xfe, + 0x00, 0x05, 0x20, 0x01, 0x18, 0x35, 0x20, 0x03, 0x00, 0x00, 0x20, 0x01, + 0x18, 0x34, 0x20, 0x03, 0x00, 0x01, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, + 0x28, 0x00, 0x00, 0x06, 0x00, 0x16, 0x00, 0x26, 0x61, 0x24, 0x00, 0x66, + 0x20, 0x31, 0x18, 0x37, 0x26, 0x34, 0x96, 0xb4, 0x00, 0x28, 0x00, 0x6e, + 0x11, 0x38, 0x60, 0x20, 0xd1, 0xbc, 0x01, 0x20, 0xd0, 0xbc, 0x11, 0x68, + 0xd0, 0xb4, 0x11, 0x98, 0x91, 0x84, 0x5e, 0x2c, 0x11, 0x18, 0x91, 0x84, + 0x00, 0x07, 0x00, 0xaa, 0x91, 0x95, 0x00, 0x04, 0x92, 0x84, 0x00, 0x07, + 0x00, 0x82, 0x00, 0x16, 0x20, 0x01, 0x18, 0x8b, 0x20, 0x0c, 0xd1, 0x84, + 0x00, 0x1e, 0x0d, 0x70, 0x0c, 0x98, 0x00, 0x16, 0x20, 0x01, 0x18, 0x8b, + 0x20, 0x0c, 0xd1, 0x94, 0x00, 0x1e, 0x0d, 0x30, 0x0c, 0x58, 0x25, 0x13, + 0x24, 0xf9, 0x24, 0xfc, 0x24, 0xff, 0x25, 0x04, 0x25, 0x06, 0x25, 0x0a, + 0x25, 0x0e, 0x08, 0x0c, 0x93, 0xe2, 0x00, 0xb8, 0x08, 0x0c, 0x94, 0xb1, + 0x00, 0xa0, 0x08, 0x0c, 0x94, 0xb1, 0x08, 0x0c, 0x93, 0xe2, 0x00, 0x78, + 0x00, 0x99, 0x00, 0x68, 0x08, 0x0c, 0x93, 0xe2, 0x00, 0x79, 0x00, 0x48, + 0x08, 0x0c, 0x94, 0xb1, 0x00, 0x59, 0x00, 0x28, 0x08, 0x0c, 0x94, 0xb1, + 0x08, 0x0c, 0x93, 0xe2, 0x00, 0x29, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x0e, + 0x01, 0x2e, 0x00, 0x05, 0x00, 0xa6, 0x61, 0x24, 0x60, 0x28, 0xd0, 0x9c, + 0x01, 0x18, 0xd1, 0x9c, 0x19, 0x04, 0x27, 0x84, 0xd1, 0xf4, 0x19, 0x0c, + 0x0d, 0xbe, 0x08, 0x0c, 0x76, 0x37, 0x09, 0x04, 0x25, 0x6e, 0x08, 0x0c, + 0xd7, 0xe3, 0x11, 0x20, 0x70, 0x00, 0x90, 0x86, 0x00, 0x03, 0x05, 0x70, + 0x60, 0x24, 0x90, 0x84, 0x18, 0x00, 0x05, 0x50, 0x08, 0x0c, 0x76, 0x5a, + 0x01, 0x18, 0x08, 0x0c, 0x76, 0x48, 0x15, 0x20, 0x60, 0x27, 0x00, 0x20, + 0x60, 0x43, 0x00, 0x00, 0x08, 0x0c, 0xd7, 0xe3, 0x01, 0x68, 0x08, 0x0c, + 0x76, 0x5a, 0x11, 0x50, 0x20, 0x01, 0x19, 0xa8, 0x20, 0x03, 0x00, 0x01, + 0x60, 0x27, 0x18, 0x00, 0x08, 0x0c, 0x74, 0xb2, 0x08, 0x04, 0x27, 0x87, + 0x70, 0xa4, 0x90, 0x05, 0x11, 0x50, 0x70, 0xa7, 0x00, 0x01, 0x00, 0xd6, + 0x20, 0x69, 0x01, 0x40, 0x08, 0x0c, 0x76, 0x8b, 0x00, 0xde, 0x19, 0x04, + 0x27, 0x87, 0x08, 0x0c, 0x79, 0x3c, 0x04, 0x28, 0x08, 0x0c, 0x76, 0x5a, + 0x15, 0x90, 0x60, 0x24, 0x90, 0x84, 0x18, 0x00, 0x11, 0x08, 0x04, 0x68, + 0x08, 0x0c, 0x79, 0x3c, 0x08, 0x0c, 0x79, 0x32, 0x08, 0x0c, 0x61, 0x2e, + 0x08, 0x0c, 0x75, 0x63, 0x08, 0x04, 0x27, 0x84, 0xd1, 0xac, 0x15, 0x08, + 0x60, 0x24, 0xd0, 0xdc, 0x11, 0x70, 0xd0, 0xe4, 0x11, 0x78, 0xd0, 0xd4, + 0x11, 0x90, 0xd0, 0xcc, 0x01, 0x30, 0x70, 0x98, 0x90, 0x86, 0x00, 0x29, + 0x11, 0x10, 0x08, 0x0c, 0x78, 0x18, 0x08, 0x04, 0x27, 0x84, 0x08, 0x0c, + 0x79, 0x37, 0x00, 0x48, 0x20, 0x01, 0x19, 0x7d, 0x20, 0x03, 0x00, 0x02, + 0x00, 0x20, 0x08, 0x0c, 0x77, 0x74, 0x08, 0x04, 0x27, 0x84, 0x08, 0x0c, + 0x78, 0xba, 0x08, 0x04, 0x27, 0x84, 0x62, 0x20, 0xd1, 0xbc, 0x01, 0x38, + 0xd2, 0xbc, 0x19, 0x04, 0x27, 0xe1, 0xd2, 0xb4, 0x19, 0x04, 0x27, 0xf4, + 0x00, 0x00, 0xd1, 0xac, 0x09, 0x04, 0x26, 0x99, 0x00, 0x36, 0x63, 0x28, + 0xc3, 0xbc, 0x63, 0x2a, 0x00, 0x3e, 0x08, 0x0c, 0x76, 0x37, 0x11, 0xc0, + 0x60, 0x27, 0x00, 0x20, 0x00, 0x06, 0x00, 0x26, 0x00, 0x36, 0x08, 0x0c, + 0x76, 0x51, 0x11, 0x58, 0x08, 0x0c, 0x79, 0x32, 0x08, 0x0c, 0x61, 0x2e, + 0x08, 0x0c, 0x75, 0x63, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x0e, 0x00, 0xae, + 0x00, 0x05, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x0e, 0x08, 0x0c, 0x76, 0x0f, + 0x00, 0x16, 0x00, 0x46, 0x00, 0xc6, 0x64, 0x4c, 0x94, 0x86, 0xf0, 0xf0, + 0x11, 0x38, 0x20, 0x61, 0x01, 0x00, 0x64, 0x4a, 0x60, 0x43, 0x00, 0x90, + 0x60, 0x43, 0x00, 0x10, 0x74, 0xda, 0x94, 0x8c, 0xff, 0x00, 0x70, 0x38, + 0xd0, 0x84, 0x01, 0x90, 0x08, 0x0c, 0xd7, 0xe3, 0x11, 0x18, 0x91, 0x86, + 0xf8, 0x00, 0x11, 0x60, 0x70, 0x48, 0xd0, 0x84, 0x11, 0x48, 0xc0, 0x85, + 0x70, 0x4a, 0x00, 0x36, 0x24, 0x18, 0x20, 0x11, 0x80, 0x16, 0x08, 0x0c, + 0x4c, 0x44, 0x00, 0x3e, 0x08, 0x0c, 0xd7, 0xdc, 0x19, 0x04, 0x26, 0x76, + 0x91, 0x96, 0xff, 0x00, 0x05, 0xa8, 0x70, 0x60, 0x90, 0x84, 0x00, 0xff, + 0x81, 0x0f, 0x81, 0xff, 0x01, 0x10, 0x91, 0x16, 0x05, 0x68, 0x71, 0x30, + 0xd1, 0x84, 0x15, 0x50, 0x08, 0x0c, 0x33, 0xaa, 0x01, 0x28, 0xc1, 0x8d, + 0x71, 0x32, 0x08, 0x0c, 0x6a, 0x9b, 0x15, 0x10, 0x62, 0x40, 0x92, 0x94, + 0x00, 0x10, 0x01, 0x30, 0x62, 0x48, 0x92, 0x94, 0xff, 0x00, 0x92, 0x96, + 0xff, 0x00, 0x01, 0xc0, 0x70, 0x30, 0xd0, 0x8c, 0x09, 0x04, 0x26, 0x76, + 0x70, 0x38, 0xd0, 0x8c, 0x11, 0x40, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x0c, + 0xd1, 0xac, 0x19, 0x04, 0x26, 0x76, 0xc1, 0xad, 0x21, 0x02, 0x00, 0x36, + 0x73, 0xd8, 0x20, 0x11, 0x80, 0x13, 0x08, 0x0c, 0x4c, 0x44, 0x00, 0x3e, + 0x08, 0x04, 0x26, 0x76, 0x70, 0x38, 0xd0, 0x8c, 0x11, 0x40, 0x20, 0x01, + 0x18, 0x0c, 0x20, 0x0c, 0xd1, 0xac, 0x19, 0x04, 0x26, 0x76, 0xc1, 0xad, + 0x21, 0x02, 0x00, 0x36, 0x73, 0xd8, 0x20, 0x11, 0x80, 0x13, 0x08, 0x0c, + 0x4c, 0x44, 0x00, 0x3e, 0x71, 0x30, 0xc1, 0x85, 0x71, 0x32, 0x20, 0x11, + 0x18, 0x48, 0x22, 0x0c, 0xd1, 0xa4, 0x01, 0xf0, 0x00, 0x16, 0x20, 0x09, + 0x00, 0x01, 0x20, 0x11, 0x01, 0x00, 0x08, 0x0c, 0x8a, 0x50, 0x20, 0x19, + 0x00, 0x0e, 0x00, 0xc6, 0x20, 0x61, 0x00, 0x00, 0x08, 0x0c, 0xeb, 0xa1, + 0x00, 0xce, 0x94, 0x84, 0x00, 0xff, 0x90, 0x80, 0x33, 0xb6, 0x20, 0x0d, + 0x91, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0x21, 0x20, 0x90, 0x06, 0x20, 0x09, + 0x00, 0x0e, 0x08, 0x0c, 0xec, 0x31, 0x00, 0x1e, 0x00, 0x16, 0x20, 0x09, + 0x00, 0x02, 0x20, 0x19, 0x00, 0x04, 0x08, 0x0c, 0x32, 0x1b, 0x00, 0x1e, + 0x00, 0xa8, 0x01, 0x56, 0x00, 0xb6, 0x20, 0xa9, 0x00, 0x7f, 0x90, 0x0e, + 0x08, 0x0c, 0x67, 0x24, 0x11, 0x40, 0x70, 0x30, 0xd0, 0x84, 0x11, 0x18, + 0xb8, 0x00, 0xd0, 0xbc, 0x11, 0x10, 0x08, 0x0c, 0x61, 0x48, 0x81, 0x08, + 0x1f, 0x04, 0x26, 0x66, 0x00, 0xbe, 0x01, 0x5e, 0x00, 0xce, 0x00, 0x4e, + 0x08, 0x0c, 0xb2, 0x44, 0x60, 0xe3, 0x00, 0x00, 0x00, 0x1e, 0x20, 0x01, + 0x18, 0x00, 0x20, 0x14, 0x92, 0x96, 0x00, 0x04, 0x11, 0x70, 0xd1, 0x9c, + 0x11, 0xa0, 0x20, 0x11, 0x18, 0x0c, 0x22, 0x14, 0xd2, 0x9c, 0x11, 0x20, + 0x62, 0x04, 0x92, 0x95, 0x00, 0x02, 0x62, 0x06, 0x62, 0x28, 0xc2, 0x9d, + 0x62, 0x2a, 0x20, 0x03, 0x00, 0x01, 0x20, 0x01, 0x18, 0x26, 0x20, 0x03, + 0x00, 0x00, 0x60, 0x27, 0x00, 0x20, 0xd1, 0x94, 0x09, 0x04, 0x27, 0x84, + 0x00, 0x16, 0x62, 0x20, 0xd2, 0xb4, 0x09, 0x04, 0x27, 0x21, 0x08, 0x0c, + 0x88, 0xc3, 0x08, 0x0c, 0xa6, 0xe9, 0x60, 0x27, 0x00, 0x04, 0x00, 0xf6, + 0x20, 0x19, 0x19, 0xf1, 0x23, 0x04, 0x90, 0x7d, 0x09, 0x04, 0x26, 0xf0, + 0x78, 0x04, 0x90, 0x86, 0x00, 0x32, 0x15, 0xf0, 0x00, 0xd6, 0x00, 0xc6, + 0x00, 0xe6, 0x00, 0x96, 0x20, 0x69, 0x01, 0x40, 0x78, 0x2c, 0x68, 0x5e, + 0x78, 0x08, 0x68, 0x5a, 0x60, 0x43, 0x00, 0x02, 0x20, 0x01, 0x00, 0x03, + 0x80, 0x01, 0x1d, 0xf0, 0x60, 0x43, 0x00, 0x00, 0x20, 0x01, 0x00, 0x3c, + 0x80, 0x01, 0x1d, 0xf0, 0x08, 0x0c, 0x2d, 0x49, 0x20, 0x01, 0x00, 0x1e, + 0x80, 0x01, 0x02, 0x40, 0x20, 0xa9, 0x00, 0x09, 0x08, 0x0c, 0x2c, 0x42, + 0x69, 0x04, 0xd1, 0xdc, 0x11, 0x40, 0x0c, 0xb0, 0x20, 0x01, 0x01, 0x00, + 0x08, 0x0c, 0x2d, 0x39, 0x90, 0x06, 0x08, 0x0c, 0x2d, 0x39, 0x08, 0x0c, + 0x99, 0xa5, 0x08, 0x0c, 0x9a, 0xb1, 0x78, 0x14, 0x20, 0x48, 0xa8, 0x67, + 0x01, 0x03, 0x2f, 0x60, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x9e, 0x00, 0xee, + 0x00, 0xce, 0x00, 0xde, 0x00, 0xfe, 0x00, 0x1e, 0x00, 0xae, 0x00, 0x05, + 0x00, 0xfe, 0x00, 0xd6, 0x20, 0x69, 0x01, 0x40, 0x68, 0x04, 0x90, 0x84, + 0x40, 0x00, 0x01, 0x10, 0x08, 0x0c, 0x2d, 0x49, 0x00, 0xde, 0x00, 0xc6, + 0x20, 0x61, 0x19, 0xe8, 0x60, 0x28, 0x08, 0x0c, 0xd7, 0xe3, 0x01, 0x20, + 0x90, 0x9a, 0x00, 0x03, 0x12, 0x58, 0x00, 0x18, 0x90, 0x9a, 0x00, 0xc8, + 0x12, 0x38, 0x80, 0x00, 0x60, 0x2a, 0x00, 0xce, 0x08, 0x0c, 0xa6, 0xc5, + 0x08, 0x04, 0x27, 0x83, 0x20, 0x61, 0x01, 0x00, 0x62, 0xc0, 0x08, 0x0c, + 0xb0, 0xca, 0x20, 0x19, 0x19, 0xf1, 0x23, 0x04, 0x90, 0x65, 0x01, 0x20, + 0x20, 0x09, 0x00, 0x27, 0x08, 0x0c, 0xb3, 0x52, 0x00, 0xce, 0x08, 0x04, + 0x27, 0x83, 0xd2, 0xbc, 0x09, 0x04, 0x27, 0x6a, 0x08, 0x0c, 0x88, 0xd0, + 0x60, 0x14, 0x90, 0x84, 0x19, 0x84, 0x90, 0x85, 0x00, 0x10, 0x60, 0x16, + 0x60, 0x27, 0x00, 0x04, 0x00, 0xd6, 0x20, 0x69, 0x01, 0x40, 0x68, 0x04, + 0x90, 0x84, 0x40, 0x00, 0x01, 0x10, 0x08, 0x0c, 0x2d, 0x49, 0x00, 0xde, + 0x00, 0xc6, 0x20, 0x61, 0x19, 0xe8, 0x60, 0x44, 0x08, 0x0c, 0xd7, 0xe3, + 0x01, 0x20, 0x90, 0x9a, 0x00, 0x03, 0x16, 0x58, 0x00, 0x18, 0x90, 0x9a, + 0x00, 0xc8, 0x16, 0x38, 0x80, 0x00, 0x60, 0x46, 0x60, 0x3c, 0x00, 0xce, + 0x90, 0x05, 0x05, 0xb8, 0x20, 0x09, 0x07, 0xd0, 0x08, 0x0c, 0x88, 0xc8, + 0x90, 0x80, 0x00, 0x08, 0x20, 0x04, 0x90, 0x86, 0x00, 0x06, 0x11, 0x38, + 0x61, 0x14, 0x91, 0x8c, 0x19, 0x84, 0x91, 0x8d, 0x00, 0x12, 0x61, 0x16, + 0x04, 0x30, 0x90, 0x80, 0x00, 0x08, 0x20, 0x04, 0x90, 0x86, 0x00, 0x09, + 0x0d, 0x98, 0x61, 0x14, 0x91, 0x8c, 0x19, 0x84, 0x91, 0x8d, 0x00, 0x16, + 0x61, 0x16, 0x00, 0xc8, 0x60, 0x27, 0x00, 0x04, 0x00, 0xb0, 0x00, 0x36, + 0x20, 0x19, 0x00, 0x01, 0x08, 0x0c, 0xaa, 0x49, 0x00, 0x3e, 0x20, 0x19, + 0x19, 0xf7, 0x23, 0x04, 0x90, 0x65, 0x01, 0x50, 0x20, 0x09, 0x00, 0x4f, + 0x60, 0x20, 0x90, 0x86, 0x00, 0x09, 0x11, 0x10, 0x20, 0x09, 0x00, 0x4f, + 0x08, 0x0c, 0xb3, 0x52, 0x00, 0xce, 0x00, 0x1e, 0xd1, 0x9c, 0x09, 0x04, + 0x27, 0xdc, 0x70, 0x38, 0xd0, 0xac, 0x15, 0x38, 0x00, 0x16, 0x01, 0x56, + 0x60, 0x27, 0x00, 0x08, 0x08, 0x0c, 0x2d, 0x73, 0x20, 0xa9, 0x00, 0x28, + 0xa0, 0x01, 0x1f, 0x04, 0x27, 0x92, 0x61, 0x50, 0x91, 0x85, 0x14, 0x00, + 0x60, 0x52, 0x20, 0xa9, 0x03, 0x66, 0x1d, 0x04, 0x27, 0x9b, 0x08, 0x0c, + 0x88, 0xf7, 0x60, 0x20, 0xd0, 0x9c, 0x11, 0x30, 0x01, 0x5e, 0x61, 0x52, + 0x00, 0x1e, 0x60, 0x27, 0x00, 0x08, 0x04, 0xa0, 0x08, 0x0c, 0x2c, 0x29, + 0x1f, 0x04, 0x27, 0x9b, 0x01, 0x5e, 0x61, 0x52, 0x00, 0x1e, 0x60, 0x27, + 0x00, 0x08, 0x00, 0x16, 0x60, 0x28, 0xc0, 0x9c, 0x60, 0x2a, 0x08, 0x0c, + 0xb2, 0x44, 0x60, 0xe3, 0x00, 0x00, 0x08, 0x0c, 0xf0, 0x7f, 0x08, 0x0c, + 0xf0, 0x9a, 0x08, 0x0c, 0x57, 0xd9, 0xd0, 0xfc, 0x11, 0x38, 0x08, 0x0c, + 0xd7, 0xdc, 0x11, 0x20, 0x90, 0x85, 0x00, 0x01, 0x08, 0x0c, 0x76, 0x7b, + 0x90, 0x06, 0x08, 0x0c, 0x2d, 0x39, 0x20, 0x09, 0x00, 0x02, 0x08, 0x0c, + 0x2c, 0x67, 0x00, 0xe6, 0x20, 0x71, 0x18, 0x00, 0x70, 0x03, 0x00, 0x04, + 0x08, 0x0c, 0x0e, 0xa3, 0x00, 0xee, 0x60, 0x27, 0x00, 0x08, 0x08, 0x0c, + 0x0b, 0xa0, 0x00, 0x1e, 0x91, 0x8c, 0xff, 0xd0, 0x61, 0x26, 0x00, 0xae, + 0x00, 0x05, 0x00, 0x16, 0x20, 0x01, 0x18, 0x8b, 0x20, 0x0c, 0xd1, 0x84, + 0x00, 0x1e, 0x09, 0x04, 0x25, 0x9b, 0x00, 0x16, 0x20, 0x09, 0x27, 0xed, + 0x00, 0xd0, 0x20, 0x01, 0x18, 0x8b, 0x20, 0x0c, 0xc1, 0x84, 0x21, 0x02, + 0x00, 0x1e, 0x0c, 0x40, 0x00, 0x16, 0x20, 0x01, 0x18, 0x8b, 0x20, 0x0c, + 0xd1, 0x94, 0x00, 0x1e, 0x09, 0x04, 0x25, 0x9b, 0x00, 0x16, 0x20, 0x09, + 0x28, 0x00, 0x00, 0x38, 0x20, 0x01, 0x18, 0x8b, 0x20, 0x0c, 0xc1, 0x94, + 0x21, 0x02, 0x00, 0x1e, 0x08, 0xa8, 0x60, 0x28, 0xc0, 0xbc, 0x60, 0x2a, + 0x20, 0x01, 0x01, 0x56, 0x20, 0x03, 0xbc, 0x91, 0x80, 0x00, 0x20, 0x03, + 0xff, 0xff, 0x60, 0x43, 0x00, 0x01, 0x08, 0x0c, 0x2c, 0x61, 0x60, 0x27, + 0x00, 0x80, 0x60, 0x17, 0x00, 0x00, 0x60, 0x43, 0x00, 0x00, 0x08, 0x17, + 0x00, 0x06, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x00, 0xe6, 0x00, 0xf6, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0x18, 0x00, 0x71, 0xd0, + 0x70, 0xd2, 0x91, 0x16, 0x09, 0x04, 0x28, 0x6b, 0x81, 0xff, 0x01, 0xa0, + 0x20, 0x09, 0x00, 0x00, 0x08, 0x0c, 0x2c, 0x67, 0x20, 0x11, 0x80, 0x11, + 0x20, 0x19, 0x01, 0x0e, 0x23, 0x1c, 0x93, 0x9e, 0x00, 0x07, 0x11, 0x18, + 0x20, 0x19, 0x00, 0x01, 0x00, 0x10, 0x20, 0x19, 0x00, 0x00, 0x08, 0x0c, + 0x4c, 0x44, 0x04, 0x48, 0x20, 0x01, 0x19, 0xa9, 0x20, 0x0c, 0x81, 0xff, + 0x11, 0x40, 0x20, 0x01, 0x01, 0x09, 0x20, 0x04, 0xd0, 0xb4, 0x01, 0x18, + 0x20, 0x19, 0x00, 0x03, 0x00, 0x08, 0x21, 0x18, 0x20, 0x11, 0x80, 0x12, + 0x08, 0x0c, 0x4c, 0x44, 0x08, 0x0c, 0x0e, 0xa3, 0x08, 0x0c, 0x57, 0xd9, + 0xd0, 0xfc, 0x11, 0x88, 0x08, 0x0c, 0xd7, 0xdc, 0x11, 0x70, 0x00, 0xc6, + 0x08, 0x0c, 0x29, 0x07, 0x08, 0x0c, 0xa9, 0xb0, 0x20, 0x61, 0x01, 0x00, + 0x20, 0x19, 0x00, 0x28, 0x20, 0x09, 0x00, 0x02, 0x08, 0x0c, 0x32, 0x1b, + 0x00, 0xce, 0x01, 0x2e, 0x00, 0xfe, 0x00, 0xee, 0x00, 0x3e, 0x00, 0x2e, + 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, 0x20, 0x28, 0x91, 0x8c, 0x00, 0xff, + 0x21, 0x30, 0x90, 0x94, 0xff, 0x00, 0x11, 0xf0, 0x20, 0x11, 0x18, 0x37, + 0x22, 0x14, 0xd2, 0xac, 0x11, 0xc8, 0x81, 0xff, 0x01, 0xe8, 0x20, 0x11, + 0x18, 0x1f, 0x22, 0x04, 0x91, 0x06, 0x11, 0x90, 0x20, 0x11, 0x18, 0x20, + 0x22, 0x14, 0x92, 0x94, 0xff, 0x00, 0x95, 0x84, 0xff, 0x00, 0x92, 0x06, + 0x11, 0x48, 0x20, 0x11, 0x18, 0x20, 0x22, 0x14, 0x92, 0x94, 0x00, 0xff, + 0x95, 0x84, 0x00, 0xff, 0x92, 0x06, 0x11, 0x20, 0x25, 0x00, 0x08, 0x0c, + 0x83, 0xa5, 0x00, 0x48, 0x95, 0x84, 0x00, 0xff, 0x90, 0x80, 0x33, 0xb6, + 0x20, 0x0d, 0x91, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0x90, 0x06, 0x00, 0x05, + 0x90, 0x80, 0x33, 0xb6, 0x20, 0x0d, 0x91, 0x8c, 0x00, 0xff, 0x00, 0x05, + 0x00, 0xd6, 0x20, 0x69, 0x01, 0x40, 0x20, 0x01, 0x18, 0x18, 0x20, 0x03, + 0x00, 0xef, 0x20, 0xa9, 0x00, 0x10, 0x90, 0x06, 0x68, 0x52, 0x68, 0x56, + 0x1f, 0x04, 0x28, 0xb7, 0x00, 0xde, 0x00, 0x05, 0x00, 0x06, 0x00, 0xd6, + 0x00, 0x26, 0x20, 0x69, 0x01, 0x40, 0x20, 0x01, 0x18, 0x18, 0x21, 0x02, + 0x81, 0x14, 0x82, 0x14, 0x82, 0x14, 0x82, 0x14, 0x20, 0xa9, 0x00, 0x10, + 0x68, 0x53, 0x00, 0x00, 0x90, 0x06, 0x82, 0xff, 0x11, 0x28, 0x91, 0x84, + 0x00, 0x0f, 0x90, 0x80, 0xf8, 0x80, 0x20, 0x05, 0x68, 0x56, 0x82, 0x11, + 0x1f, 0x04, 0x28, 0xcc, 0x00, 0x2e, 0x00, 0xde, 0x00, 0x0e, 0x00, 0x05, + 0x00, 0xc6, 0x20, 0x61, 0x18, 0x00, 0x60, 0x30, 0x01, 0x10, 0xc0, 0x9d, + 0x00, 0x08, 0xc0, 0x9c, 0x60, 0x32, 0x00, 0xce, 0x00, 0x05, 0x01, 0x56, + 0x00, 0xd6, 0x00, 0x26, 0x00, 0x16, 0x00, 0x06, 0x20, 0x69, 0x01, 0x40, + 0x69, 0x80, 0x91, 0x16, 0x01, 0x80, 0x91, 0x12, 0x12, 0x30, 0x82, 0x12, + 0x82, 0x10, 0x22, 0xa8, 0x20, 0x01, 0x04, 0x02, 0x00, 0x18, 0x22, 0xa8, + 0x20, 0x01, 0x04, 0x04, 0x68, 0x0e, 0x1f, 0x04, 0x28, 0xfc, 0x68, 0x0f, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0xde, 0x01, 0x5e, + 0x00, 0x05, 0x08, 0x0c, 0x57, 0xd5, 0xd0, 0xc4, 0x01, 0x50, 0xd0, 0xa4, + 0x01, 0x40, 0x90, 0x06, 0x00, 0x46, 0x20, 0x20, 0x20, 0x09, 0x00, 0x2e, + 0x08, 0x0c, 0xec, 0x31, 0x00, 0x4e, 0x00, 0x05, 0x00, 0xf6, 0x00, 0x16, + 0x00, 0x26, 0x20, 0x79, 0x01, 0x40, 0x78, 0xc4, 0xd0, 0xdc, 0x09, 0x04, + 0x29, 0x73, 0x08, 0x0c, 0x2b, 0xc6, 0x06, 0x60, 0x90, 0x84, 0x07, 0x00, + 0x90, 0x8e, 0x06, 0x00, 0x11, 0x20, 0x20, 0x11, 0x40, 0x00, 0x90, 0x0e, + 0x04, 0x58, 0x90, 0x8e, 0x05, 0x00, 0x11, 0x20, 0x20, 0x11, 0x80, 0x00, + 0x90, 0x0e, 0x04, 0x20, 0x90, 0x8e, 0x04, 0x00, 0x11, 0x20, 0x90, 0x16, + 0x20, 0x09, 0x00, 0x01, 0x00, 0xe8, 0x90, 0x8e, 0x03, 0x00, 0x11, 0x20, + 0x90, 0x16, 0x20, 0x09, 0x00, 0x02, 0x00, 0xb0, 0x90, 0x8e, 0x02, 0x00, + 0x11, 0x20, 0x90, 0x16, 0x20, 0x09, 0x00, 0x04, 0x00, 0x78, 0x90, 0x8e, + 0x01, 0x00, 0x15, 0x48, 0x90, 0x16, 0x20, 0x09, 0x00, 0x08, 0x00, 0x40, + 0x90, 0x84, 0x07, 0x00, 0x90, 0x8e, 0x03, 0x00, 0x15, 0x00, 0x20, 0x11, + 0x00, 0x30, 0x00, 0x58, 0x23, 0x00, 0x90, 0x80, 0x00, 0x20, 0x20, 0x18, + 0x08, 0x0c, 0x93, 0x75, 0x92, 0x8c, 0xff, 0x00, 0x01, 0x10, 0x20, 0x11, + 0x00, 0xff, 0x22, 0x00, 0x80, 0x07, 0x90, 0x85, 0x00, 0x4c, 0x78, 0xc2, + 0x20, 0x09, 0x01, 0x38, 0x22, 0x0a, 0x08, 0x0c, 0x76, 0x37, 0x11, 0x18, + 0x20, 0x09, 0x19, 0x6d, 0x22, 0x0a, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0xfe, + 0x00, 0x05, 0x78, 0xc3, 0x00, 0x00, 0x0c, 0xc8, 0x01, 0x26, 0x20, 0x91, + 0x28, 0x00, 0x00, 0x06, 0x00, 0x16, 0x00, 0x26, 0x20, 0x01, 0x01, 0x70, + 0x20, 0x0c, 0x80, 0x00, 0x20, 0x14, 0x91, 0x84, 0x00, 0x03, 0x01, 0x10, + 0x08, 0x0c, 0x0d, 0xbe, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x0e, 0x01, 0x2e, + 0x00, 0x05, 0x20, 0x01, 0x18, 0x0d, 0x20, 0x04, 0xd0, 0x8c, 0x01, 0x18, + 0x20, 0x09, 0x00, 0x02, 0x00, 0x05, 0x20, 0x01, 0x01, 0x71, 0x20, 0x04, + 0xd0, 0xdc, 0x01, 0x68, 0x20, 0x01, 0x01, 0x70, 0x20, 0x0c, 0x91, 0x8c, + 0x00, 0xff, 0x91, 0x8e, 0x00, 0x4c, 0x11, 0x28, 0x20, 0x0c, 0x91, 0x8c, + 0xff, 0x00, 0x81, 0x0f, 0x00, 0x05, 0x90, 0x0e, 0x20, 0x01, 0x02, 0x27, + 0x20, 0x04, 0x80, 0x07, 0x90, 0x84, 0x00, 0xff, 0x80, 0x04, 0x91, 0x08, + 0x20, 0x01, 0x02, 0x26, 0x20, 0x04, 0x80, 0x07, 0x90, 0x84, 0x00, 0xff, + 0x80, 0x04, 0x91, 0x08, 0x00, 0x05, 0x00, 0x18, 0x00, 0x0c, 0x00, 0x18, + 0x00, 0x20, 0x10, 0x00, 0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x01, 0x56, + 0x00, 0x06, 0x00, 0x16, 0x00, 0x26, 0x00, 0xe6, 0x20, 0x01, 0x19, 0x90, + 0x20, 0x04, 0x90, 0x8a, 0x00, 0x07, 0x1a, 0x0c, 0x0d, 0xc5, 0x00, 0x33, + 0x00, 0xee, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x0e, 0x01, 0x5e, 0x00, 0x05, + 0x29, 0xd9, 0x29, 0xf7, 0x2a, 0x1b, 0x2a, 0x1d, 0x2a, 0x46, 0x2a, 0x48, + 0x2a, 0x4a, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x28, 0x1c, 0x08, 0x0c, + 0x2c, 0x24, 0x20, 0x01, 0x19, 0x92, 0x20, 0x03, 0x00, 0x00, 0x78, 0x28, + 0x90, 0x84, 0xe1, 0xd7, 0x78, 0x2a, 0x90, 0x06, 0x20, 0xa9, 0x00, 0x09, + 0x08, 0x0c, 0x2b, 0xe2, 0x20, 0x01, 0x19, 0x90, 0x20, 0x03, 0x00, 0x06, + 0x20, 0x09, 0x00, 0x1e, 0x20, 0x11, 0x2a, 0x4b, 0x08, 0x0c, 0x88, 0xd5, + 0x00, 0x05, 0x20, 0x09, 0x19, 0x95, 0x20, 0x0b, 0x00, 0x00, 0x20, 0x01, + 0x19, 0x9a, 0x20, 0x03, 0x00, 0x36, 0x20, 0x01, 0x19, 0x99, 0x20, 0x03, + 0x00, 0x2a, 0x20, 0x01, 0x19, 0x92, 0x20, 0x03, 0x00, 0x01, 0x90, 0x06, + 0x08, 0x0c, 0x2b, 0x94, 0x20, 0x01, 0xff, 0xff, 0x20, 0xa9, 0x00, 0x09, + 0x08, 0x0c, 0x2b, 0xe2, 0x20, 0x01, 0x19, 0x90, 0x20, 0x03, 0x00, 0x06, + 0x20, 0x09, 0x00, 0x1e, 0x20, 0x11, 0x2a, 0x4b, 0x08, 0x0c, 0x88, 0xd5, + 0x00, 0x05, 0x08, 0x0c, 0x0d, 0xc5, 0x20, 0x01, 0x19, 0x9a, 0x20, 0x03, + 0x00, 0x36, 0x20, 0x01, 0x19, 0x92, 0x20, 0x03, 0x00, 0x03, 0x7a, 0x38, + 0x92, 0x94, 0x00, 0x05, 0x92, 0x96, 0x00, 0x04, 0x01, 0x10, 0x90, 0x06, + 0x00, 0x10, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x2b, 0x94, 0x20, 0x01, + 0x19, 0x96, 0x20, 0x03, 0x00, 0x00, 0x20, 0x01, 0xff, 0xff, 0x20, 0xa9, + 0x00, 0x09, 0x08, 0x0c, 0x2b, 0xe2, 0x20, 0x01, 0x19, 0x90, 0x20, 0x03, + 0x00, 0x06, 0x20, 0x09, 0x00, 0x1e, 0x20, 0x11, 0x2a, 0x4b, 0x08, 0x0c, + 0x88, 0xd5, 0x00, 0x05, 0x08, 0x0c, 0x0d, 0xc5, 0x08, 0x0c, 0x0d, 0xc5, + 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, 0x00, 0x26, 0x00, 0xe6, 0x00, 0xf6, + 0x01, 0x56, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x79, 0x01, 0x00, + 0x20, 0x01, 0x19, 0x92, 0x20, 0x04, 0x90, 0x8a, 0x00, 0x07, 0x1a, 0x0c, + 0x0d, 0xc5, 0x00, 0x43, 0x01, 0x2e, 0x01, 0x5e, 0x00, 0xfe, 0x00, 0xee, + 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, 0x2a, 0x6d, 0x2a, 0x89, + 0x2a, 0xc5, 0x2a, 0xf1, 0x2b, 0x11, 0x2b, 0x1d, 0x2b, 0x1f, 0x08, 0x0c, + 0x2b, 0xd6, 0x11, 0x90, 0x20, 0x09, 0x19, 0x98, 0x21, 0x04, 0x7a, 0x38, + 0x92, 0x94, 0x00, 0x05, 0x92, 0x96, 0x00, 0x04, 0x01, 0x10, 0xc0, 0x8d, + 0x00, 0x08, 0xc0, 0x85, 0x20, 0x0a, 0x20, 0x01, 0x19, 0x90, 0x20, 0x03, + 0x00, 0x01, 0x00, 0x30, 0x08, 0x0c, 0x2b, 0x43, 0x20, 0x01, 0xff, 0xff, + 0x08, 0x0c, 0x29, 0xe8, 0x00, 0x05, 0x08, 0x0c, 0x2b, 0x21, 0x05, 0xc0, + 0x20, 0x09, 0x19, 0x99, 0x21, 0x04, 0x80, 0x01, 0x20, 0x0a, 0x08, 0x0c, + 0x2b, 0xd6, 0x11, 0x58, 0x7a, 0x38, 0x92, 0x94, 0x00, 0x05, 0x92, 0x96, + 0x00, 0x05, 0x05, 0x18, 0x20, 0x09, 0x19, 0x98, 0x21, 0x04, 0xc0, 0x85, + 0x20, 0x0a, 0x20, 0x09, 0x19, 0x95, 0x21, 0x04, 0x80, 0x00, 0x20, 0x0a, + 0x90, 0x86, 0x00, 0x05, 0x01, 0x18, 0x08, 0x0c, 0x2b, 0x29, 0x00, 0xc0, + 0x20, 0x0b, 0x00, 0x00, 0x7a, 0x38, 0x92, 0x94, 0x00, 0x06, 0x92, 0x96, + 0x00, 0x04, 0x01, 0x10, 0x90, 0x06, 0x00, 0x10, 0x20, 0x01, 0x00, 0x01, + 0x08, 0x0c, 0x2b, 0xb1, 0x20, 0x01, 0x19, 0x92, 0x20, 0x03, 0x00, 0x02, + 0x00, 0x28, 0x20, 0x01, 0x19, 0x90, 0x20, 0x03, 0x00, 0x03, 0x00, 0x10, + 0x08, 0x0c, 0x2a, 0x0a, 0x00, 0x05, 0x08, 0x0c, 0x2b, 0x21, 0x05, 0x40, + 0x20, 0x09, 0x19, 0x99, 0x21, 0x04, 0x80, 0x01, 0x20, 0x0a, 0x08, 0x0c, + 0x2b, 0xd6, 0x11, 0x48, 0x20, 0x01, 0x19, 0x90, 0x20, 0x03, 0x00, 0x03, + 0x20, 0x01, 0x19, 0x91, 0x20, 0x03, 0x00, 0x00, 0x00, 0xb8, 0x20, 0x09, + 0x19, 0x99, 0x21, 0x04, 0x90, 0x05, 0x11, 0x18, 0x08, 0x0c, 0x2b, 0x66, + 0x00, 0x10, 0x08, 0x0c, 0x2b, 0x36, 0x08, 0x0c, 0x2b, 0x29, 0x20, 0x09, + 0x19, 0x95, 0x20, 0x0b, 0x00, 0x00, 0x20, 0x01, 0x19, 0x92, 0x20, 0x03, + 0x00, 0x01, 0x08, 0x0c, 0x2a, 0x0a, 0x00, 0x00, 0x00, 0x05, 0x04, 0x79, + 0x01, 0xe8, 0x08, 0x0c, 0x2b, 0xd6, 0x11, 0x98, 0x20, 0x09, 0x19, 0x96, + 0x21, 0x04, 0x80, 0x00, 0x20, 0x0a, 0x90, 0x86, 0x00, 0x07, 0x01, 0x08, + 0x00, 0x78, 0x20, 0x01, 0x19, 0x9b, 0x20, 0x03, 0x00, 0x0a, 0x20, 0x09, + 0x19, 0x98, 0x21, 0x04, 0xc0, 0xfd, 0x20, 0x0a, 0x00, 0x38, 0x00, 0xf9, + 0x20, 0x01, 0x19, 0x92, 0x20, 0x03, 0x00, 0x04, 0x08, 0x0c, 0x2a, 0x35, + 0x00, 0x05, 0x00, 0x79, 0x01, 0x48, 0x08, 0x0c, 0x2b, 0xd6, 0x11, 0x18, + 0x08, 0x0c, 0x2a, 0x21, 0x00, 0x18, 0x00, 0x79, 0x08, 0x0c, 0x2a, 0x35, + 0x00, 0x05, 0x08, 0x0c, 0x0d, 0xc5, 0x08, 0x0c, 0x0d, 0xc5, 0x20, 0x09, + 0x19, 0x9a, 0x21, 0x04, 0x80, 0x01, 0x20, 0x0a, 0x09, 0x0c, 0x2b, 0x82, + 0x00, 0x05, 0x7a, 0x38, 0x92, 0x94, 0x00, 0x05, 0x92, 0x96, 0x00, 0x05, + 0x01, 0x10, 0x90, 0x06, 0x00, 0x10, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, + 0x2b, 0xb1, 0x00, 0x05, 0x7a, 0x38, 0x92, 0x94, 0x00, 0x06, 0x92, 0x96, + 0x00, 0x06, 0x01, 0x10, 0x90, 0x06, 0x00, 0x10, 0x20, 0x01, 0x00, 0x01, + 0x08, 0x0c, 0x2b, 0x94, 0x00, 0x05, 0x20, 0x09, 0x19, 0x95, 0x21, 0x04, + 0x80, 0x00, 0x20, 0x0a, 0x90, 0x86, 0x00, 0x05, 0x01, 0x08, 0x00, 0x68, + 0x20, 0x0b, 0x00, 0x00, 0x7a, 0x38, 0x92, 0x94, 0x00, 0x06, 0x92, 0x96, + 0x00, 0x06, 0x01, 0x10, 0x90, 0x06, 0x00, 0x10, 0x20, 0x01, 0x00, 0x01, + 0x04, 0xd9, 0x7a, 0x38, 0x92, 0x94, 0x00, 0x05, 0x92, 0x96, 0x00, 0x05, + 0x01, 0x10, 0x90, 0x06, 0x00, 0x10, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, + 0x2b, 0xb1, 0x00, 0x05, 0x00, 0x86, 0x20, 0x01, 0x19, 0x98, 0x20, 0x04, + 0x90, 0x84, 0x7f, 0xff, 0x09, 0x0c, 0x0d, 0xc5, 0x20, 0x09, 0x19, 0x97, + 0x21, 0x44, 0x88, 0x46, 0x28, 0x0a, 0x98, 0x44, 0x0d, 0xd8, 0xd0, 0x8c, + 0x11, 0x20, 0xd0, 0x84, 0x11, 0x20, 0x08, 0x0c, 0x0d, 0xc5, 0x90, 0x06, + 0x00, 0x10, 0x20, 0x01, 0x00, 0x01, 0x00, 0xa1, 0x00, 0x8e, 0x00, 0x05, + 0x00, 0x06, 0x01, 0x56, 0x20, 0x01, 0x19, 0x90, 0x20, 0xa9, 0x00, 0x09, + 0x20, 0x03, 0x00, 0x00, 0x80, 0x00, 0x1f, 0x04, 0x2b, 0x88, 0x20, 0x01, + 0x19, 0x97, 0x20, 0x03, 0x80, 0x00, 0x01, 0x5e, 0x00, 0x0e, 0x00, 0x05, + 0x00, 0xf6, 0x20, 0x79, 0x01, 0x00, 0x90, 0x85, 0x00, 0x00, 0x01, 0x58, + 0x78, 0x38, 0x90, 0x84, 0xff, 0xf9, 0x90, 0x85, 0x00, 0x04, 0x78, 0x3a, + 0x20, 0x09, 0x19, 0x9d, 0x21, 0x0c, 0x79, 0x5a, 0x00, 0x50, 0x78, 0x38, + 0x90, 0x84, 0xff, 0xfb, 0x90, 0x85, 0x00, 0x06, 0x78, 0x3a, 0x20, 0x09, + 0x19, 0x9e, 0x21, 0x0c, 0x79, 0x5a, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, + 0x20, 0x79, 0x01, 0x00, 0x90, 0x85, 0x00, 0x00, 0x01, 0x38, 0x78, 0x38, + 0x90, 0x84, 0xff, 0xfa, 0x90, 0x85, 0x00, 0x04, 0x78, 0x3a, 0x00, 0x30, + 0x78, 0x38, 0x90, 0x84, 0xff, 0xfb, 0x90, 0x85, 0x00, 0x05, 0x78, 0x3a, + 0x00, 0xfe, 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0x01, 0x00, 0x20, 0x04, + 0x90, 0x82, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, + 0x01, 0x00, 0x20, 0x04, 0x90, 0x82, 0x00, 0x09, 0x00, 0x0e, 0x00, 0x05, + 0x01, 0x56, 0x20, 0xa9, 0x00, 0x64, 0x78, 0x20, 0x08, 0x0c, 0x2c, 0x61, + 0xd0, 0x9c, 0x11, 0x10, 0x1f, 0x04, 0x2b, 0xd9, 0x01, 0x5e, 0x00, 0x05, + 0x01, 0x26, 0x00, 0x16, 0x00, 0x06, 0x20, 0x91, 0x80, 0x00, 0x78, 0x50, + 0x90, 0x85, 0x00, 0x40, 0x78, 0x52, 0x78, 0x50, 0x90, 0x84, 0xfb, 0xcf, + 0x78, 0x52, 0x08, 0x0c, 0x2c, 0x61, 0x90, 0x85, 0x20, 0x00, 0x78, 0x52, + 0x00, 0x0e, 0x20, 0x08, 0x91, 0x86, 0x00, 0x00, 0x11, 0x18, 0x78, 0x3b, + 0x00, 0x07, 0x00, 0x90, 0x91, 0x86, 0x00, 0x01, 0x11, 0x18, 0x78, 0x3b, + 0x00, 0x06, 0x00, 0x60, 0x91, 0x86, 0x00, 0x02, 0x11, 0x18, 0x78, 0x3b, + 0x00, 0x05, 0x00, 0x30, 0x91, 0x86, 0x00, 0x03, 0x11, 0x18, 0x78, 0x3b, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x1d, 0x04, 0x2c, 0x0f, 0x08, 0x0c, + 0x88, 0xf7, 0x1f, 0x04, 0x2c, 0x0f, 0x78, 0x50, 0x90, 0x85, 0x04, 0x00, + 0x90, 0x84, 0xdf, 0xbf, 0x78, 0x52, 0x08, 0x0c, 0x2c, 0x61, 0x90, 0x85, + 0x10, 0x00, 0x78, 0x52, 0x00, 0x0e, 0x00, 0x1e, 0x01, 0x2e, 0x00, 0x05, + 0x78, 0x50, 0x90, 0x84, 0xff, 0xcf, 0x78, 0x52, 0x00, 0x05, 0x00, 0x06, + 0x01, 0x56, 0x00, 0xf6, 0x20, 0x79, 0x01, 0x00, 0x20, 0xa9, 0x00, 0x0a, + 0x78, 0x54, 0xd0, 0xac, 0x11, 0x30, 0x78, 0x20, 0xd0, 0xe4, 0x11, 0x40, + 0x1f, 0x04, 0x2c, 0x33, 0x00, 0x28, 0x78, 0x54, 0xd0, 0x8c, 0x11, 0x10, + 0x1f, 0x04, 0x2c, 0x39, 0x00, 0xfe, 0x01, 0x5e, 0x00, 0x0e, 0x00, 0x05, + 0x1d, 0x04, 0x2c, 0x42, 0x08, 0x0c, 0x88, 0xf7, 0x1f, 0x04, 0x2c, 0x42, + 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0x19, 0x9c, 0x20, 0x04, 0x90, 0x86, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0x19, 0x9c, + 0x20, 0x04, 0x90, 0x86, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, + 0x20, 0x01, 0x19, 0x9c, 0x20, 0x04, 0x90, 0x86, 0x00, 0x02, 0x00, 0x0e, + 0x00, 0x05, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, + 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0x19, 0xa9, 0x21, 0x02, 0x00, 0x0e, + 0x00, 0x05, 0x20, 0x09, 0x01, 0x71, 0x21, 0x04, 0xd0, 0xdc, 0x01, 0x40, + 0x20, 0x09, 0x01, 0x70, 0x21, 0x04, 0x20, 0x0b, 0x00, 0x80, 0xa0, 0x01, + 0xa0, 0x01, 0x20, 0x0a, 0x00, 0x05, 0x00, 0x36, 0x00, 0x46, 0x20, 0x01, + 0x01, 0x41, 0x20, 0x0c, 0x91, 0x8c, 0xff, 0x00, 0x91, 0x86, 0x21, 0x00, + 0x01, 0x40, 0x91, 0x86, 0x20, 0x00, 0x01, 0x70, 0x91, 0x86, 0x01, 0x00, + 0x19, 0x04, 0x2c, 0xda, 0x00, 0x48, 0x00, 0x16, 0x20, 0x09, 0x1a, 0x87, + 0x21, 0x04, 0x80, 0x00, 0x02, 0x08, 0x20, 0x0a, 0x00, 0x1e, 0x04, 0xf0, + 0x20, 0x09, 0x00, 0xa2, 0x08, 0x0c, 0x0e, 0x52, 0x20, 0x19, 0x01, 0x60, + 0x23, 0x24, 0x20, 0x11, 0x00, 0x03, 0x20, 0x09, 0x01, 0x69, 0x21, 0x04, + 0x90, 0x84, 0x00, 0x07, 0x21, 0x0c, 0x91, 0x8c, 0x00, 0x07, 0x91, 0x0e, + 0x1d, 0xb0, 0x90, 0x86, 0x00, 0x03, 0x15, 0x48, 0x23, 0x04, 0x00, 0x66, + 0x00, 0x76, 0x20, 0x31, 0x00, 0x02, 0x23, 0x3c, 0x97, 0x3e, 0x01, 0x48, + 0x86, 0x31, 0x1d, 0xd8, 0x20, 0x31, 0x1a, 0x88, 0x26, 0x3c, 0x87, 0x38, + 0x02, 0x08, 0x27, 0x32, 0x23, 0x04, 0x00, 0x7e, 0x00, 0x6e, 0x94, 0x02, + 0x02, 0xa0, 0x19, 0xd0, 0x82, 0x11, 0x19, 0xd8, 0x84, 0xff, 0x01, 0x70, + 0x20, 0x01, 0x01, 0x41, 0x20, 0x0c, 0x91, 0x8c, 0xff, 0x00, 0x91, 0x86, + 0x01, 0x00, 0x01, 0x30, 0x20, 0x09, 0x18, 0x0c, 0x21, 0x04, 0xc0, 0xdd, + 0x20, 0x0a, 0x00, 0x08, 0x04, 0x21, 0x20, 0x01, 0x19, 0x81, 0x20, 0x0c, + 0x08, 0x0c, 0x0e, 0x52, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0x05, 0x20, 0x01, + 0x18, 0x0c, 0x20, 0x04, 0xd0, 0xdc, 0x01, 0xb0, 0x20, 0x01, 0x01, 0x60, + 0x20, 0x04, 0x90, 0x05, 0x01, 0x40, 0x20, 0x01, 0x01, 0x41, 0x20, 0x04, + 0x90, 0x84, 0xff, 0x00, 0x90, 0x86, 0x01, 0x00, 0x11, 0x48, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x00, 0x16, 0x00, 0x26, 0x00, 0x21, 0x00, 0x2e, + 0x00, 0x1e, 0x01, 0x2e, 0x00, 0x05, 0x00, 0xc6, 0x20, 0x61, 0x01, 0x00, + 0x60, 0x14, 0x00, 0x06, 0x20, 0x01, 0x01, 0x61, 0x20, 0x03, 0x00, 0x00, + 0x60, 0x17, 0x00, 0x18, 0xa0, 0x01, 0xa0, 0x01, 0x60, 0x2f, 0x00, 0x08, + 0x61, 0x04, 0x91, 0x8e, 0x00, 0x10, 0x61, 0x06, 0x91, 0x8e, 0x00, 0x10, + 0x61, 0x06, 0x60, 0x17, 0x00, 0x40, 0x04, 0xb9, 0x00, 0x1e, 0x91, 0x84, + 0x00, 0x03, 0x01, 0xe0, 0x00, 0x36, 0x00, 0x16, 0x20, 0x19, 0x01, 0x41, + 0x61, 0x24, 0x91, 0x8c, 0x00, 0x28, 0x11, 0x20, 0x23, 0x04, 0x90, 0x84, + 0x28, 0x00, 0x0d, 0xc0, 0x00, 0x1e, 0x91, 0x9c, 0xff, 0xe4, 0x91, 0x84, + 0x00, 0x01, 0x01, 0x18, 0x93, 0x85, 0x00, 0x09, 0x60, 0x16, 0x91, 0x84, + 0x00, 0x02, 0x01, 0x18, 0x93, 0x85, 0x00, 0x12, 0x60, 0x16, 0x00, 0x3e, + 0x20, 0x01, 0x18, 0x0c, 0x20, 0x0c, 0xc1, 0xdc, 0x21, 0x02, 0x00, 0xce, + 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, 0x08, 0x0c, 0x76, 0x51, 0x01, 0x08, + 0xc0, 0xbc, 0x20, 0x09, 0x01, 0x40, 0x21, 0x14, 0x92, 0x94, 0x00, 0x01, + 0x92, 0x15, 0x22, 0x0a, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0x16, + 0x00, 0x26, 0x20, 0x09, 0x01, 0x40, 0x21, 0x14, 0x92, 0x94, 0x00, 0x01, + 0x92, 0x85, 0x10, 0x00, 0x20, 0x0a, 0x22, 0x0a, 0x00, 0x2e, 0x00, 0x1e, + 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, 0x20, 0x09, 0x01, 0x40, 0x21, 0x14, + 0x92, 0x94, 0x00, 0x01, 0x92, 0x15, 0x22, 0x0a, 0x00, 0x2e, 0x00, 0x1e, + 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, 0x20, 0x09, 0x01, 0x40, 0x21, 0x04, + 0x11, 0x28, 0x08, 0x0c, 0x76, 0x51, 0x01, 0x10, 0xc0, 0xbc, 0x00, 0x08, + 0xc0, 0xbd, 0x20, 0x0a, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, + 0x01, 0x56, 0x60, 0x50, 0x90, 0x85, 0x00, 0x40, 0x60, 0x52, 0x60, 0x50, + 0x90, 0x84, 0xfb, 0xcf, 0x60, 0x52, 0x08, 0x0c, 0x2c, 0x61, 0x90, 0x85, + 0x20, 0x00, 0x60, 0x52, 0x20, 0xa9, 0x00, 0x12, 0x1d, 0x04, 0x2d, 0x84, + 0x08, 0x0c, 0x88, 0xf7, 0x1f, 0x04, 0x2d, 0x84, 0x60, 0x50, 0x90, 0x85, + 0x04, 0x00, 0x90, 0x84, 0xdf, 0xbf, 0x60, 0x52, 0x01, 0x5e, 0x00, 0x0e, + 0x00, 0x05, 0x2f, 0xff, 0x2f, 0xff, 0x2e, 0x23, 0x2e, 0x23, 0x2e, 0x2f, + 0x2e, 0x2f, 0x2e, 0x3b, 0x2e, 0x3b, 0x2e, 0x49, 0x2e, 0x49, 0x2e, 0x55, + 0x2e, 0x55, 0x2e, 0x63, 0x2e, 0x63, 0x2e, 0x71, 0x2e, 0x71, 0x2e, 0x83, + 0x2e, 0x83, 0x2e, 0x8f, 0x2e, 0x8f, 0x2e, 0x9d, 0x2e, 0x9d, 0x2e, 0xbb, + 0x2e, 0xbb, 0x2e, 0xdb, 0x2e, 0xdb, 0x2e, 0xab, 0x2e, 0xab, 0x2e, 0xcb, + 0x2e, 0xcb, 0x2e, 0xe9, 0x2e, 0xe9, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, + 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, + 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, + 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, + 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, + 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0xfb, + 0x2e, 0xfb, 0x2f, 0x07, 0x2f, 0x07, 0x2f, 0x15, 0x2f, 0x15, 0x2f, 0x23, + 0x2f, 0x23, 0x2f, 0x33, 0x2f, 0x33, 0x2f, 0x41, 0x2f, 0x41, 0x2f, 0x51, + 0x2f, 0x51, 0x2f, 0x61, 0x2f, 0x61, 0x2f, 0x73, 0x2f, 0x73, 0x2f, 0x81, + 0x2f, 0x81, 0x2f, 0x91, 0x2f, 0x91, 0x2f, 0xb3, 0x2f, 0xb3, 0x2f, 0xd5, + 0x2f, 0xd5, 0x2f, 0xa1, 0x2f, 0xa1, 0x2f, 0xc4, 0x2f, 0xc4, 0x2f, 0xe4, + 0x2f, 0xe4, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, + 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, + 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, + 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, + 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, + 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, + 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, + 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, 0x2e, 0x81, + 0x2e, 0x81, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, + 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x24, 0xc0, 0x08, 0x04, + 0x2f, 0xf7, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, + 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x22, 0xcc, 0x08, 0x04, + 0x2f, 0xf7, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, + 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x22, 0xcc, 0x08, 0x0c, + 0x24, 0xc0, 0x08, 0x04, 0x2f, 0xf7, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, + 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, + 0x23, 0x07, 0x08, 0x04, 0x2f, 0xf7, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, + 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, + 0x24, 0xc0, 0x08, 0x0c, 0x23, 0x07, 0x08, 0x04, 0x2f, 0xf7, 0x01, 0x06, + 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, + 0x01, 0x56, 0x08, 0x0c, 0x22, 0xcc, 0x08, 0x0c, 0x23, 0x07, 0x08, 0x04, + 0x2f, 0xf7, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, + 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x22, 0xcc, 0x08, 0x0c, + 0x24, 0xc0, 0x08, 0x0c, 0x23, 0x07, 0x08, 0x04, 0x2f, 0xf7, 0xa0, 0x01, + 0x0c, 0xf0, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, + 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x13, 0x94, 0x08, 0x04, + 0x2f, 0xf7, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, + 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x24, 0xc0, 0x08, 0x0c, + 0x13, 0x94, 0x08, 0x04, 0x2f, 0xf7, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, + 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, + 0x22, 0xcc, 0x08, 0x0c, 0x13, 0x94, 0x08, 0x04, 0x2f, 0xf7, 0x01, 0x06, + 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, + 0x01, 0x56, 0x08, 0x0c, 0x24, 0xc0, 0x08, 0x0c, 0x13, 0x94, 0x08, 0x0c, + 0x23, 0x07, 0x08, 0x04, 0x2f, 0xf7, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, + 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, + 0x22, 0xcc, 0x08, 0x0c, 0x24, 0xc0, 0x08, 0x0c, 0x13, 0x94, 0x08, 0x04, + 0x2f, 0xf7, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, + 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x22, 0xcc, 0x08, 0x0c, + 0x13, 0x94, 0x08, 0x0c, 0x23, 0x07, 0x08, 0x04, 0x2f, 0xf7, 0x01, 0x06, + 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, + 0x01, 0x56, 0x08, 0x0c, 0x13, 0x94, 0x08, 0x0c, 0x23, 0x07, 0x08, 0x04, + 0x2f, 0xf7, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, + 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x22, 0xcc, 0x08, 0x0c, + 0x24, 0xc0, 0x08, 0x0c, 0x13, 0x94, 0x08, 0x0c, 0x23, 0x07, 0x08, 0x04, + 0x2f, 0xf7, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, + 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x29, 0x76, 0x08, 0x04, + 0x2f, 0xf7, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, + 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x29, 0x76, 0x08, 0x0c, + 0x24, 0xc0, 0x08, 0x04, 0x2f, 0xf7, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, + 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, + 0x29, 0x76, 0x08, 0x0c, 0x22, 0xcc, 0x08, 0x04, 0x2f, 0xf7, 0x01, 0x06, + 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, + 0x01, 0x56, 0x08, 0x0c, 0x29, 0x76, 0x08, 0x0c, 0x22, 0xcc, 0x08, 0x0c, + 0x24, 0xc0, 0x08, 0x04, 0x2f, 0xf7, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, + 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, + 0x29, 0x76, 0x08, 0x0c, 0x23, 0x07, 0x08, 0x04, 0x2f, 0xf7, 0x01, 0x06, + 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, + 0x01, 0x56, 0x08, 0x0c, 0x29, 0x76, 0x08, 0x0c, 0x24, 0xc0, 0x08, 0x0c, + 0x23, 0x07, 0x08, 0x04, 0x2f, 0xf7, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, + 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, + 0x29, 0x76, 0x08, 0x0c, 0x22, 0xcc, 0x08, 0x0c, 0x23, 0x07, 0x08, 0x04, + 0x2f, 0xf7, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, + 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x29, 0x76, 0x08, 0x0c, + 0x22, 0xcc, 0x08, 0x0c, 0x24, 0xc0, 0x08, 0x0c, 0x23, 0x07, 0x08, 0x04, + 0x2f, 0xf7, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, + 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x29, 0x76, 0x08, 0x0c, + 0x13, 0x94, 0x08, 0x04, 0x2f, 0xf7, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, + 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, + 0x29, 0x76, 0x08, 0x0c, 0x24, 0xc0, 0x08, 0x0c, 0x13, 0x94, 0x08, 0x04, + 0x2f, 0xf7, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, + 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x29, 0x76, 0x08, 0x0c, + 0x22, 0xcc, 0x08, 0x0c, 0x13, 0x94, 0x08, 0x04, 0x2f, 0xf7, 0x01, 0x06, + 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, + 0x01, 0x56, 0x08, 0x0c, 0x29, 0x76, 0x08, 0x0c, 0x24, 0xc0, 0x08, 0x0c, + 0x13, 0x94, 0x08, 0x0c, 0x23, 0x07, 0x08, 0x04, 0x2f, 0xf7, 0x01, 0x06, + 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, + 0x01, 0x56, 0x08, 0x0c, 0x29, 0x76, 0x08, 0x0c, 0x22, 0xcc, 0x08, 0x0c, + 0x24, 0xc0, 0x08, 0x0c, 0x13, 0x94, 0x04, 0x98, 0x01, 0x06, 0x00, 0x06, + 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, + 0x08, 0x0c, 0x29, 0x76, 0x08, 0x0c, 0x22, 0xcc, 0x08, 0x0c, 0x13, 0x94, + 0x08, 0x0c, 0x23, 0x07, 0x04, 0x10, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, + 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, + 0x29, 0x76, 0x08, 0x0c, 0x13, 0x94, 0x08, 0x0c, 0x23, 0x07, 0x00, 0x98, + 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, + 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x29, 0x76, 0x08, 0x0c, 0x22, 0xcc, + 0x08, 0x0c, 0x24, 0xc0, 0x08, 0x0c, 0x13, 0x94, 0x08, 0x0c, 0x23, 0x07, + 0x00, 0x00, 0x01, 0x5e, 0x01, 0x4e, 0x01, 0x3e, 0x01, 0xde, 0x01, 0xce, + 0x01, 0x2e, 0x00, 0x0e, 0x01, 0x0e, 0x00, 0x0d, 0x00, 0xb6, 0x00, 0xc6, + 0x00, 0x26, 0x00, 0x46, 0x90, 0x26, 0x08, 0x0c, 0x6a, 0x61, 0x19, 0x04, + 0x31, 0x37, 0x72, 0xdc, 0x20, 0x01, 0x19, 0x7c, 0x20, 0x04, 0x90, 0x05, + 0x11, 0x10, 0xd2, 0x9c, 0x01, 0x48, 0xd2, 0x84, 0x11, 0x38, 0xd2, 0xbc, + 0x19, 0x04, 0x31, 0x37, 0x08, 0x0c, 0x31, 0x3c, 0x08, 0x04, 0x31, 0x37, + 0xd2, 0xcc, 0x19, 0x04, 0x31, 0x37, 0x08, 0x0c, 0x76, 0x37, 0x11, 0x20, + 0x70, 0xaf, 0xff, 0xff, 0x08, 0x04, 0x31, 0x37, 0xd2, 0x94, 0x01, 0x20, + 0x70, 0xaf, 0xff, 0xff, 0x08, 0x04, 0x31, 0x37, 0x08, 0x0c, 0x33, 0xa5, + 0x01, 0x60, 0x08, 0x0c, 0xd7, 0xe3, 0x01, 0x28, 0x20, 0x01, 0x18, 0x18, + 0x20, 0x3c, 0x08, 0x04, 0x30, 0xb0, 0x70, 0xaf, 0xff, 0xff, 0x08, 0x04, + 0x31, 0x37, 0x20, 0x01, 0x18, 0x18, 0x20, 0x3c, 0x72, 0x94, 0xd2, 0x84, + 0x09, 0x04, 0x30, 0xb0, 0xd2, 0x8c, 0x19, 0x04, 0x30, 0xb0, 0x00, 0x36, + 0x73, 0xac, 0x93, 0x8e, 0xff, 0xff, 0x11, 0x10, 0x20, 0x19, 0x00, 0x01, + 0x83, 0x14, 0x92, 0xe0, 0x1c, 0x80, 0x2c, 0x04, 0x93, 0x8c, 0x00, 0x01, + 0x01, 0x20, 0x90, 0x84, 0xff, 0x00, 0x80, 0x07, 0x00, 0x10, 0x90, 0x84, + 0x00, 0xff, 0x97, 0x0e, 0x09, 0x04, 0x30, 0xa6, 0x90, 0x8e, 0x00, 0x00, + 0x09, 0x04, 0x30, 0xa6, 0x90, 0x8e, 0x00, 0xff, 0x11, 0x60, 0x72, 0x30, + 0xd2, 0x84, 0x19, 0x04, 0x30, 0xab, 0x72, 0x94, 0xc2, 0x8d, 0x72, 0x96, + 0x70, 0xaf, 0xff, 0xff, 0x00, 0x3e, 0x08, 0x04, 0x30, 0xb0, 0x20, 0x09, + 0x18, 0x0d, 0x21, 0x0c, 0xd1, 0x8c, 0x01, 0x50, 0x00, 0x26, 0x20, 0x11, + 0x00, 0x10, 0x08, 0x0c, 0x6a, 0xc7, 0x00, 0x2e, 0x01, 0x18, 0x70, 0xaf, + 0xff, 0xff, 0x04, 0x88, 0x90, 0x0e, 0x08, 0x0c, 0x28, 0x73, 0x08, 0x0c, + 0x66, 0xb9, 0x15, 0x38, 0x90, 0x06, 0xb8, 0xbb, 0x05, 0x20, 0xb8, 0xac, + 0x90, 0x05, 0x01, 0x48, 0x00, 0xc6, 0x20, 0x60, 0x08, 0x0c, 0x8c, 0xf7, + 0x00, 0xce, 0x09, 0x0c, 0x90, 0x96, 0xb8, 0xaf, 0x00, 0x00, 0x08, 0x0c, + 0x6a, 0xa3, 0x11, 0x68, 0x70, 0x30, 0xd0, 0x8c, 0x01, 0x30, 0xb8, 0x00, + 0xd0, 0xbc, 0x01, 0x38, 0x08, 0x0c, 0x69, 0x44, 0x01, 0x20, 0x08, 0x0c, + 0x31, 0x55, 0x01, 0x48, 0x00, 0x28, 0x08, 0x0c, 0x32, 0x95, 0x08, 0x0c, + 0x31, 0x81, 0x01, 0x18, 0x83, 0x18, 0x08, 0x04, 0x30, 0x4a, 0x73, 0xae, + 0x00, 0x10, 0x70, 0xaf, 0xff, 0xff, 0x00, 0x3e, 0x08, 0x04, 0x31, 0x37, + 0x97, 0x80, 0x33, 0xb6, 0x20, 0x3d, 0x97, 0xbc, 0xff, 0x00, 0x87, 0x3f, + 0x20, 0x41, 0x00, 0x7e, 0x70, 0xac, 0x90, 0x96, 0xff, 0xff, 0x11, 0x18, + 0x90, 0x0e, 0x28, 0xa8, 0x00, 0x50, 0x98, 0x12, 0x02, 0x20, 0x20, 0x08, + 0x98, 0x02, 0x20, 0xa8, 0x00, 0x20, 0x70, 0xaf, 0xff, 0xff, 0x08, 0x04, + 0x31, 0x37, 0x27, 0x00, 0x01, 0x56, 0x00, 0x16, 0x91, 0x06, 0x09, 0x04, + 0x31, 0x2c, 0x20, 0x01, 0x18, 0x0d, 0x20, 0x04, 0xd0, 0x8c, 0x01, 0x58, + 0x00, 0x26, 0x20, 0x11, 0x00, 0x10, 0x08, 0x0c, 0x6a, 0xc7, 0x00, 0x2e, + 0x01, 0x20, 0x20, 0x09, 0xff, 0xff, 0x08, 0x04, 0x31, 0x34, 0xc4, 0x84, + 0x08, 0x0c, 0x67, 0x24, 0x01, 0x68, 0x08, 0x0c, 0xd7, 0xe3, 0x19, 0x04, + 0x31, 0x2c, 0x08, 0x0c, 0x33, 0xa5, 0x19, 0x04, 0x31, 0x2c, 0x08, 0x0c, + 0x66, 0xb9, 0x19, 0x04, 0x31, 0x34, 0x00, 0x08, 0xc4, 0x85, 0xb8, 0xbb, + 0x05, 0x20, 0xb8, 0xac, 0x90, 0x05, 0x01, 0x48, 0x00, 0xc6, 0x20, 0x60, + 0x08, 0x0c, 0x8c, 0xf7, 0x00, 0xce, 0x09, 0x0c, 0x90, 0x96, 0xb8, 0xaf, + 0x00, 0x00, 0x08, 0x0c, 0x6a, 0xa3, 0x11, 0x30, 0x70, 0x30, 0xd0, 0x8c, + 0x01, 0xf8, 0xb8, 0x00, 0xd0, 0xbc, 0x11, 0xe0, 0x72, 0x94, 0xd2, 0x8c, + 0x01, 0x80, 0x08, 0x0c, 0x6a, 0xa3, 0x90, 0x82, 0x00, 0x06, 0x02, 0xe0, + 0xd4, 0x84, 0x11, 0x18, 0x08, 0x0c, 0x66, 0xde, 0x00, 0x28, 0x08, 0x0c, + 0x33, 0x21, 0x01, 0xa0, 0x08, 0x0c, 0x33, 0x4c, 0x00, 0x88, 0x08, 0x0c, + 0x32, 0x95, 0x08, 0x0c, 0xd7, 0xe3, 0x11, 0x60, 0x08, 0x0c, 0x31, 0x81, + 0x01, 0x88, 0x00, 0x40, 0x08, 0x0c, 0xd7, 0xe3, 0x11, 0x18, 0x08, 0x0c, + 0x33, 0x21, 0x01, 0x10, 0x04, 0x51, 0x01, 0x40, 0x00, 0x1e, 0x81, 0x08, + 0x01, 0x5e, 0x1f, 0x04, 0x30, 0xc9, 0x70, 0xaf, 0xff, 0xff, 0x00, 0x18, + 0x00, 0x1e, 0x01, 0x5e, 0x71, 0xae, 0x00, 0x4e, 0x00, 0x2e, 0x00, 0xce, + 0x00, 0xbe, 0x00, 0x05, 0x00, 0xc6, 0x00, 0x16, 0x70, 0xaf, 0x00, 0x01, + 0x20, 0x09, 0x00, 0x7e, 0x08, 0x0c, 0x66, 0xb9, 0x11, 0x68, 0xb8, 0x13, + 0x00, 0xff, 0xb8, 0x17, 0xff, 0xfe, 0x08, 0x0c, 0x32, 0x95, 0x04, 0xa9, + 0x01, 0x28, 0x70, 0xdc, 0xc0, 0xbd, 0x70, 0xde, 0x08, 0x0c, 0xd5, 0x2b, + 0x00, 0x1e, 0x00, 0xce, 0x00, 0x05, 0x00, 0x16, 0x00, 0x76, 0x00, 0xd6, + 0x00, 0xc6, 0x20, 0x01, 0x18, 0x4c, 0x20, 0x04, 0x90, 0x84, 0x00, 0xff, + 0xb8, 0x42, 0x08, 0x0c, 0xb3, 0x25, 0x01, 0xd0, 0x2b, 0x00, 0x60, 0x12, + 0x08, 0x0c, 0xd5, 0x54, 0x60, 0x23, 0x00, 0x01, 0x90, 0x06, 0x08, 0x0c, + 0x66, 0x56, 0x20, 0x01, 0x00, 0x00, 0x08, 0x0c, 0x66, 0x6a, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x70, 0xa8, 0x80, 0x00, 0x70, 0xaa, 0x01, 0x2e, + 0x20, 0x09, 0x00, 0x04, 0x08, 0x0c, 0xb3, 0x52, 0x90, 0x85, 0x00, 0x01, + 0x00, 0xce, 0x00, 0xde, 0x00, 0x7e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0x16, + 0x00, 0x76, 0x00, 0xd6, 0x00, 0xc6, 0x20, 0x01, 0x18, 0x4c, 0x20, 0x04, + 0x90, 0x84, 0x00, 0xff, 0xb8, 0x42, 0x08, 0x0c, 0xb3, 0x25, 0x05, 0x48, + 0x2b, 0x00, 0x60, 0x12, 0xb8, 0x00, 0xc0, 0xc4, 0xb8, 0x02, 0xb8, 0xa0, + 0x90, 0x86, 0x00, 0x7e, 0x01, 0x40, 0xb8, 0x04, 0x90, 0x84, 0x00, 0xff, + 0x90, 0x86, 0x00, 0x06, 0x11, 0x10, 0x08, 0x0c, 0x32, 0x50, 0x08, 0x0c, + 0xd5, 0x54, 0x60, 0x23, 0x00, 0x01, 0x90, 0x06, 0x08, 0x0c, 0x66, 0x56, + 0x20, 0x01, 0x00, 0x02, 0x08, 0x0c, 0x66, 0x6a, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x70, 0xa8, 0x80, 0x00, 0x70, 0xaa, 0x01, 0x2e, 0x20, 0x09, + 0x00, 0x02, 0x08, 0x0c, 0xb3, 0x52, 0x90, 0x85, 0x00, 0x01, 0x00, 0xce, + 0x00, 0xde, 0x00, 0x7e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xc6, + 0x00, 0x26, 0x20, 0x09, 0x00, 0x80, 0x08, 0x0c, 0x66, 0xb9, 0x11, 0x40, + 0xb8, 0x13, 0x00, 0xff, 0xb8, 0x17, 0xff, 0xfc, 0x00, 0x39, 0x01, 0x10, + 0x70, 0xe3, 0xff, 0xff, 0x00, 0x2e, 0x00, 0xce, 0x00, 0xbe, 0x00, 0x05, + 0x00, 0x16, 0x00, 0x76, 0x00, 0xd6, 0x00, 0xc6, 0x08, 0x0c, 0xb2, 0x7d, + 0x01, 0xd0, 0x2b, 0x00, 0x60, 0x12, 0x08, 0x0c, 0xd5, 0x54, 0x60, 0x23, + 0x00, 0x01, 0x90, 0x06, 0x08, 0x0c, 0x66, 0x56, 0x20, 0x01, 0x00, 0x02, + 0x08, 0x0c, 0x66, 0x6a, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x70, 0xe4, + 0x80, 0x00, 0x70, 0xe6, 0x01, 0x2e, 0x20, 0x09, 0x00, 0x02, 0x08, 0x0c, + 0xb3, 0x52, 0x90, 0x85, 0x00, 0x01, 0x00, 0xce, 0x00, 0xde, 0x00, 0x7e, + 0x00, 0x1e, 0x00, 0x05, 0x00, 0xc6, 0x00, 0xd6, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x09, 0x00, 0x7f, 0x08, 0x0c, 0x66, 0xb9, 0x11, 0xb8, + 0xb8, 0x13, 0x00, 0xff, 0xb8, 0x17, 0xff, 0xfd, 0xb8, 0xcf, 0x00, 0x04, + 0x08, 0x0c, 0xb2, 0x7d, 0x01, 0x70, 0x2b, 0x00, 0x60, 0x12, 0x63, 0x16, + 0x60, 0x23, 0x00, 0x01, 0x62, 0x0a, 0x08, 0x0c, 0xd5, 0x54, 0x20, 0x09, + 0x00, 0x22, 0x08, 0x0c, 0xb3, 0x52, 0x90, 0x85, 0x00, 0x01, 0x01, 0x2e, + 0x00, 0xde, 0x00, 0xce, 0x00, 0x05, 0x00, 0xe6, 0x00, 0xc6, 0x00, 0x66, + 0x00, 0x36, 0x00, 0x26, 0x00, 0xb6, 0x21, 0xf0, 0x08, 0x0c, 0x96, 0xaf, + 0x08, 0x0c, 0x96, 0x2f, 0x08, 0x0c, 0xb1, 0x11, 0x08, 0x0c, 0xc2, 0xd3, + 0x3e, 0x08, 0x21, 0x30, 0x81, 0xff, 0x01, 0x20, 0x20, 0xa9, 0x00, 0x7e, + 0x90, 0x0e, 0x00, 0x18, 0x20, 0xa9, 0x00, 0x7f, 0x90, 0x0e, 0x00, 0x16, + 0x08, 0x0c, 0x67, 0x24, 0x11, 0x40, 0x96, 0x86, 0x00, 0x02, 0x11, 0x18, + 0xb8, 0x00, 0xd0, 0xbc, 0x11, 0x10, 0x08, 0x0c, 0x61, 0x48, 0x00, 0x1e, + 0x81, 0x08, 0x1f, 0x04, 0x32, 0x35, 0x96, 0x86, 0x00, 0x01, 0x19, 0x0c, + 0x33, 0x79, 0x00, 0xbe, 0x00, 0x2e, 0x00, 0x3e, 0x00, 0x6e, 0x00, 0xce, + 0x00, 0xee, 0x00, 0x05, 0x00, 0xe6, 0x00, 0xc6, 0x00, 0x46, 0x00, 0x36, + 0x00, 0x26, 0x00, 0x16, 0x00, 0xb6, 0x62, 0x10, 0x22, 0x58, 0xba, 0xa0, + 0x00, 0x26, 0x20, 0x19, 0x00, 0x29, 0x08, 0x0c, 0x96, 0xa4, 0x00, 0x76, + 0x20, 0x39, 0x00, 0x00, 0x08, 0x0c, 0x95, 0x77, 0x2c, 0x08, 0x08, 0x0c, + 0xe9, 0x1c, 0x00, 0x7e, 0x00, 0x1e, 0xba, 0x10, 0xbb, 0x14, 0xbc, 0xc0, + 0x08, 0x0c, 0x61, 0x48, 0xba, 0x12, 0xbb, 0x16, 0xbc, 0xc2, 0x00, 0xbe, + 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x3e, 0x00, 0x4e, 0x00, 0xce, 0x00, 0xee, + 0x00, 0x05, 0x00, 0xe6, 0x00, 0x06, 0x00, 0xb6, 0x60, 0x10, 0x20, 0x58, + 0xb8, 0xa0, 0x00, 0xbe, 0x90, 0x86, 0x00, 0x80, 0x01, 0x50, 0x20, 0x71, + 0x18, 0x00, 0x70, 0xa8, 0x90, 0x05, 0x01, 0x10, 0x80, 0x01, 0x70, 0xaa, + 0x00, 0x0e, 0x00, 0xee, 0x00, 0x05, 0x20, 0x71, 0x18, 0x00, 0x70, 0xe4, + 0x90, 0x05, 0x0d, 0xc0, 0x80, 0x01, 0x70, 0xe6, 0x0c, 0xa8, 0xb8, 0x00, + 0xc0, 0x8c, 0xb8, 0x02, 0x00, 0x05, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xc6, + 0x00, 0xb6, 0x00, 0x46, 0x00, 0x36, 0x00, 0x26, 0x00, 0x16, 0x01, 0x56, + 0x21, 0x78, 0x81, 0xff, 0x11, 0x18, 0x20, 0xa9, 0x00, 0x01, 0x00, 0x78, + 0x08, 0x0c, 0x57, 0xd5, 0xd0, 0xc4, 0x01, 0x40, 0xd0, 0xa4, 0x01, 0x30, + 0x90, 0x06, 0x20, 0x20, 0x20, 0x09, 0x00, 0x2d, 0x08, 0x0c, 0xec, 0x31, + 0x20, 0xa9, 0x08, 0x00, 0x90, 0x16, 0x00, 0x26, 0x92, 0x8e, 0x00, 0x7e, + 0x09, 0x04, 0x33, 0x00, 0x92, 0x8e, 0x00, 0x7f, 0x09, 0x04, 0x33, 0x00, + 0x92, 0x8e, 0x00, 0x80, 0x05, 0xe8, 0x92, 0x88, 0x10, 0x00, 0x21, 0x0c, + 0x81, 0xff, 0x05, 0xc0, 0x8f, 0xff, 0x11, 0x48, 0x20, 0x01, 0x19, 0x8e, + 0x00, 0x06, 0x20, 0x03, 0x00, 0x01, 0x04, 0xf1, 0x00, 0x0e, 0x20, 0x03, + 0x00, 0x00, 0x00, 0xb6, 0x00, 0xc6, 0x21, 0x58, 0x20, 0x01, 0x00, 0x01, + 0x08, 0x0c, 0x6a, 0x6d, 0x00, 0xce, 0x00, 0xbe, 0x20, 0x19, 0x00, 0x29, + 0x08, 0x0c, 0x96, 0xa4, 0x00, 0x76, 0x20, 0x39, 0x00, 0x00, 0x08, 0x0c, + 0x95, 0x77, 0x00, 0xb6, 0x00, 0xc6, 0x00, 0x26, 0x21, 0x58, 0xba, 0x04, + 0x92, 0x94, 0x00, 0xff, 0x92, 0x86, 0x00, 0x06, 0x11, 0x18, 0xb8, 0x07, + 0x04, 0x04, 0x00, 0x28, 0x20, 0x01, 0x00, 0x04, 0x80, 0x07, 0x92, 0x15, + 0xba, 0x06, 0x00, 0x2e, 0x00, 0xce, 0x00, 0xbe, 0x00, 0x16, 0x2c, 0x08, + 0x08, 0x0c, 0xe9, 0x1c, 0x00, 0x1e, 0x00, 0x7e, 0x00, 0x2e, 0x82, 0x10, + 0x1f, 0x04, 0x32, 0xb7, 0x01, 0x5e, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x3e, + 0x00, 0x4e, 0x00, 0xbe, 0x00, 0xce, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, + 0x00, 0x46, 0x00, 0x26, 0x00, 0x16, 0x08, 0x0c, 0x57, 0xd5, 0xd0, 0xc4, + 0x01, 0x40, 0xd0, 0xa4, 0x01, 0x30, 0x90, 0x06, 0x22, 0x20, 0x20, 0x09, + 0x00, 0x29, 0x08, 0x0c, 0xec, 0x31, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x4e, + 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x00, 0xc6, 0x72, 0x94, + 0x82, 0xff, 0x01, 0xe8, 0x08, 0x0c, 0x6a, 0x9b, 0x11, 0xd0, 0x21, 0x00, + 0x08, 0x0c, 0x28, 0xa6, 0x81, 0xff, 0x01, 0xb8, 0x20, 0x19, 0x00, 0x01, + 0x83, 0x14, 0x92, 0xe0, 0x1c, 0x80, 0x2c, 0x04, 0xd3, 0x84, 0x01, 0x20, + 0x90, 0x84, 0xff, 0x00, 0x80, 0x07, 0x00, 0x10, 0x90, 0x84, 0x00, 0xff, + 0x91, 0x16, 0x01, 0x38, 0x90, 0x96, 0x00, 0xff, 0x01, 0x10, 0x83, 0x18, + 0x0c, 0x68, 0x90, 0x85, 0x00, 0x01, 0x00, 0xce, 0x00, 0x3e, 0x00, 0x2e, + 0x00, 0x1e, 0x00, 0x05, 0x00, 0x16, 0x00, 0xc6, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x00, 0x36, 0x20, 0x19, 0x00, 0x29, 0x00, 0xa9, 0x00, 0x3e, + 0x91, 0x80, 0x10, 0x00, 0x20, 0x04, 0x90, 0x65, 0x01, 0x58, 0x00, 0x16, + 0x00, 0xc6, 0x20, 0x61, 0x1a, 0xb7, 0x00, 0x1e, 0x61, 0x12, 0x08, 0x0c, + 0x32, 0x50, 0x00, 0x1e, 0x08, 0x0c, 0x66, 0xde, 0x01, 0x2e, 0x00, 0xce, + 0x00, 0x1e, 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, 0x21, 0x10, 0x08, 0x0c, + 0xac, 0x6c, 0x08, 0x0c, 0xef, 0x94, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, + 0x20, 0x01, 0x18, 0x37, 0x20, 0x04, 0xd0, 0xcc, 0x00, 0x05, 0x00, 0xc6, + 0x00, 0xb6, 0x08, 0x0c, 0x76, 0x37, 0x11, 0x18, 0x20, 0xa9, 0x08, 0x00, + 0x00, 0x10, 0x20, 0xa9, 0x07, 0x82, 0x08, 0x0c, 0x76, 0x37, 0x11, 0x10, + 0x90, 0x0e, 0x00, 0x10, 0x20, 0x09, 0x00, 0x7e, 0x91, 0x80, 0x10, 0x00, + 0x20, 0x04, 0x90, 0x5d, 0x01, 0x30, 0x86, 0xff, 0x01, 0x10, 0xb8, 0x00, + 0xd0, 0xbc, 0x09, 0x0c, 0x66, 0xde, 0x81, 0x08, 0x1f, 0x04, 0x33, 0x8a, + 0x20, 0x61, 0x18, 0x00, 0x60, 0x7f, 0x00, 0x00, 0x60, 0x80, 0x90, 0x84, + 0x00, 0xff, 0x60, 0x82, 0x60, 0xb3, 0x00, 0x00, 0x00, 0xbe, 0x00, 0xce, + 0x00, 0x05, 0x20, 0x01, 0x18, 0x69, 0x20, 0x04, 0xd0, 0xbc, 0x00, 0x05, + 0x20, 0x11, 0x18, 0x48, 0x22, 0x14, 0xd2, 0xec, 0x00, 0x05, 0x00, 0x26, + 0x20, 0x11, 0x18, 0x67, 0x22, 0x14, 0xd2, 0xdc, 0x00, 0x2e, 0x00, 0x05, + 0x7e, 0xef, 0x7d, 0xe8, 0x7c, 0xe4, 0x80, 0xe2, 0x7b, 0xe1, 0x80, 0xe0, + 0x80, 0xdc, 0x80, 0xda, 0x7a, 0xd9, 0x80, 0xd6, 0x80, 0xd5, 0x80, 0xd4, + 0x80, 0xd3, 0x80, 0xd2, 0x80, 0xd1, 0x79, 0xce, 0x78, 0xcd, 0x80, 0xcc, + 0x80, 0xcb, 0x80, 0xca, 0x80, 0xc9, 0x80, 0xc7, 0x80, 0xc6, 0x77, 0xc5, + 0x76, 0xc3, 0x80, 0xbc, 0x80, 0xba, 0x75, 0xb9, 0x80, 0xb6, 0x74, 0xb5, + 0x73, 0xb4, 0x72, 0xb3, 0x80, 0xb2, 0x80, 0xb1, 0x80, 0xae, 0x71, 0xad, + 0x80, 0xac, 0x70, 0xab, 0x6f, 0xaa, 0x6e, 0xa9, 0x80, 0xa7, 0x6d, 0xa6, + 0x6c, 0xa5, 0x6b, 0xa3, 0x6a, 0x9f, 0x69, 0x9e, 0x68, 0x9d, 0x80, 0x9b, + 0x80, 0x98, 0x67, 0x97, 0x66, 0x90, 0x65, 0x8f, 0x64, 0x88, 0x63, 0x84, + 0x62, 0x82, 0x80, 0x81, 0x80, 0x80, 0x61, 0x7c, 0x60, 0x7a, 0x80, 0x79, + 0x5f, 0x76, 0x80, 0x75, 0x80, 0x74, 0x80, 0x73, 0x80, 0x72, 0x80, 0x71, + 0x80, 0x6e, 0x5e, 0x6d, 0x80, 0x6c, 0x5d, 0x6b, 0x5c, 0x6a, 0x5b, 0x69, + 0x80, 0x67, 0x5a, 0x66, 0x59, 0x65, 0x58, 0x63, 0x57, 0x5c, 0x56, 0x5a, + 0x55, 0x59, 0x80, 0x56, 0x80, 0x55, 0x54, 0x54, 0x53, 0x53, 0x52, 0x52, + 0x51, 0x51, 0x50, 0x4e, 0x4f, 0x4d, 0x80, 0x4c, 0x80, 0x4b, 0x4e, 0x4a, + 0x4d, 0x49, 0x80, 0x47, 0x4c, 0x46, 0x80, 0x45, 0x80, 0x43, 0x80, 0x3c, + 0x80, 0x3a, 0x80, 0x39, 0x80, 0x36, 0x4b, 0x35, 0x80, 0x34, 0x4a, 0x33, + 0x49, 0x32, 0x48, 0x31, 0x80, 0x2e, 0x47, 0x2d, 0x46, 0x2c, 0x45, 0x2b, + 0x44, 0x2a, 0x43, 0x29, 0x42, 0x27, 0x80, 0x26, 0x80, 0x25, 0x41, 0x23, + 0x40, 0x1f, 0x3f, 0x1e, 0x3e, 0x1d, 0x3d, 0x1b, 0x3c, 0x18, 0x80, 0x17, + 0x80, 0x10, 0x3b, 0x0f, 0x3a, 0x08, 0x80, 0x04, 0x39, 0x02, 0x80, 0x01, + 0x80, 0x00, 0x80, 0x00, 0x38, 0x00, 0x37, 0x00, 0x36, 0x00, 0x80, 0x00, + 0x35, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x34, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x33, 0x00, + 0x32, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x31, 0x00, 0x30, 0x00, 0x80, 0x00, 0x80, 0x00, 0x2f, 0x00, + 0x80, 0x00, 0x2e, 0x00, 0x2d, 0x00, 0x2c, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x2b, 0x00, 0x80, 0x00, 0x2a, 0x00, 0x29, 0x00, 0x28, 0x00, + 0x80, 0x00, 0x27, 0x00, 0x26, 0x00, 0x25, 0x00, 0x24, 0x00, 0x23, 0x00, + 0x22, 0x00, 0x80, 0x00, 0x80, 0x00, 0x21, 0x00, 0x20, 0x00, 0x1f, 0x00, + 0x1e, 0x00, 0x1d, 0x00, 0x1c, 0x00, 0x80, 0x00, 0x80, 0x00, 0x1b, 0x00, + 0x1a, 0x00, 0x80, 0x00, 0x19, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x18, 0x00, 0x80, 0x00, 0x17, 0x00, + 0x16, 0x00, 0x15, 0x00, 0x80, 0x00, 0x14, 0x00, 0x13, 0x00, 0x12, 0x00, + 0x11, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x80, 0x00, 0x80, 0x00, 0x0e, 0x00, + 0x0d, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x09, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x08, 0x00, 0x07, 0x00, 0x80, 0x00, 0x06, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x05, 0x00, 0x04, 0x00, 0x03, 0x00, 0x80, 0x00, + 0x02, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x01, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x20, 0x71, 0x18, 0x9e, + 0x70, 0x03, 0x00, 0x02, 0x90, 0x06, 0x70, 0x16, 0x70, 0x1a, 0x70, 0x4a, + 0x70, 0x4e, 0x70, 0x0e, 0x70, 0x42, 0x70, 0x46, 0x70, 0x3b, 0x18, 0xba, + 0x70, 0x3f, 0x18, 0xba, 0x70, 0x07, 0x00, 0x01, 0x08, 0x0c, 0x10, 0x27, + 0x09, 0x0c, 0x0d, 0xc5, 0x29, 0x00, 0x70, 0x6a, 0xa8, 0x67, 0x00, 0x02, + 0xa8, 0xab, 0xdc, 0xb0, 0x08, 0x0c, 0x10, 0x27, 0x09, 0x0c, 0x0d, 0xc5, + 0x29, 0x00, 0x70, 0x6e, 0xa8, 0x67, 0x00, 0x02, 0xa8, 0xab, 0xdc, 0xb0, + 0x00, 0x05, 0x20, 0x71, 0x18, 0x9e, 0x70, 0x04, 0x00, 0x02, 0x34, 0xe5, + 0x34, 0xe6, 0x34, 0xf9, 0x35, 0x0d, 0x00, 0x05, 0x10, 0x04, 0x34, 0xf6, + 0x0e, 0x04, 0x34, 0xf6, 0x20, 0x79, 0x00, 0x00, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x70, 0x0c, 0x90, 0x05, 0x11, 0x28, 0x70, 0x0f, 0x00, 0x01, + 0x01, 0x2e, 0x04, 0x68, 0x00, 0x05, 0x01, 0x2e, 0x0c, 0xe8, 0x20, 0x79, + 0x00, 0x00, 0x20, 0x61, 0x18, 0xb8, 0x2c, 0x4c, 0xa8, 0x6c, 0x90, 0x8e, + 0x01, 0x00, 0x01, 0x28, 0x90, 0x86, 0x02, 0x00, 0x09, 0x04, 0x35, 0xe1, + 0x00, 0x05, 0x70, 0x18, 0x20, 0x48, 0x20, 0x61, 0x18, 0x00, 0x70, 0x1c, + 0x08, 0x07, 0x70, 0x14, 0x20, 0x48, 0xa8, 0x64, 0x90, 0x94, 0x00, 0xff, + 0x92, 0x96, 0x00, 0x29, 0x11, 0x20, 0xaa, 0x78, 0xd2, 0xfc, 0x01, 0x28, + 0x00, 0x05, 0x90, 0x86, 0x01, 0x03, 0x01, 0x08, 0x00, 0x05, 0x20, 0x79, + 0x00, 0x00, 0x20, 0x61, 0x18, 0x00, 0x70, 0x1c, 0x08, 0x07, 0x20, 0x61, + 0x18, 0x00, 0x78, 0x80, 0x90, 0x8a, 0x00, 0x40, 0x12, 0x10, 0x61, 0xd0, + 0x00, 0x42, 0x21, 0x00, 0x90, 0x8a, 0x00, 0x3f, 0x1a, 0x04, 0x35, 0xde, + 0x61, 0xd0, 0x08, 0x04, 0x35, 0x73, 0x35, 0xb5, 0x35, 0xed, 0x35, 0xde, + 0x35, 0xf9, 0x36, 0x03, 0x36, 0x09, 0x36, 0x0d, 0x36, 0x1d, 0x36, 0x21, + 0x36, 0x37, 0x36, 0x3d, 0x36, 0x43, 0x36, 0x4e, 0x36, 0x59, 0x36, 0x68, + 0x36, 0x77, 0x36, 0x85, 0x36, 0x9c, 0x36, 0xb7, 0x35, 0xde, 0x37, 0x62, + 0x37, 0xa0, 0x38, 0x46, 0x38, 0x57, 0x38, 0x7a, 0x35, 0xde, 0x35, 0xde, + 0x35, 0xde, 0x38, 0xb2, 0x38, 0xce, 0x38, 0xd7, 0x39, 0x06, 0x39, 0x0c, + 0x35, 0xde, 0x39, 0x52, 0x35, 0xde, 0x35, 0xde, 0x35, 0xde, 0x35, 0xde, + 0x35, 0xde, 0x39, 0x5d, 0x39, 0x66, 0x39, 0x6e, 0x39, 0x70, 0x35, 0xde, + 0x35, 0xde, 0x35, 0xde, 0x35, 0xde, 0x35, 0xde, 0x35, 0xde, 0x39, 0x9c, + 0x35, 0xde, 0x35, 0xde, 0x35, 0xde, 0x35, 0xde, 0x35, 0xde, 0x39, 0xb9, + 0x3a, 0x40, 0x35, 0xde, 0x35, 0xde, 0x35, 0xde, 0x35, 0xde, 0x35, 0xde, + 0x35, 0xde, 0x00, 0x02, 0x3a, 0x6a, 0x3a, 0x6d, 0x3a, 0xcc, 0x3a, 0xe5, + 0x3b, 0x15, 0x3d, 0xb7, 0x35, 0xde, 0x53, 0x98, 0x35, 0xde, 0x35, 0xde, + 0x35, 0xde, 0x35, 0xde, 0x35, 0xde, 0x35, 0xde, 0x35, 0xde, 0x35, 0xde, + 0x36, 0x37, 0x36, 0x3d, 0x42, 0xec, 0x57, 0xf9, 0x43, 0x0a, 0x54, 0x27, + 0x54, 0x79, 0x55, 0x84, 0x35, 0xde, 0x55, 0xe6, 0x56, 0x22, 0x56, 0x53, + 0x57, 0x5b, 0x56, 0x80, 0x56, 0xdb, 0x35, 0xde, 0x43, 0x0e, 0x44, 0xe1, + 0x44, 0xf7, 0x45, 0x1c, 0x45, 0x81, 0x45, 0xf5, 0x46, 0x15, 0x46, 0x8c, + 0x46, 0xe8, 0x47, 0x44, 0x47, 0x47, 0x47, 0x6c, 0x48, 0x23, 0x48, 0x89, + 0x48, 0x91, 0x49, 0xc6, 0x4b, 0x6e, 0x4b, 0xa2, 0x4e, 0x06, 0x35, 0xde, + 0x4e, 0x24, 0x4e, 0xeb, 0x4f, 0xd4, 0x50, 0x2e, 0x35, 0xde, 0x50, 0xc1, + 0x35, 0xde, 0x50, 0xd7, 0x50, 0xf2, 0x48, 0x91, 0x53, 0x38, 0x71, 0x4c, + 0x00, 0x00, 0x20, 0x21, 0x40, 0x00, 0x08, 0x0c, 0x4c, 0x20, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x0e, 0x04, 0x35, 0xbf, 0x00, 0x10, 0x01, 0x2e, + 0x0c, 0xc0, 0x7c, 0x36, 0x94, 0x86, 0x40, 0x00, 0x01, 0x18, 0x78, 0x33, + 0x00, 0x11, 0x00, 0x10, 0x78, 0x33, 0x00, 0x10, 0x7c, 0x82, 0x79, 0x86, + 0x7a, 0x8a, 0x7b, 0x8e, 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, 0x00, 0x89, + 0x20, 0x04, 0xd0, 0x84, 0x19, 0x0c, 0x11, 0xaa, 0x70, 0x07, 0x00, 0x01, + 0x20, 0x91, 0x50, 0x00, 0x70, 0x0f, 0x00, 0x00, 0x01, 0x2e, 0x00, 0x05, + 0x20, 0x21, 0x40, 0x01, 0x08, 0xb0, 0x20, 0x21, 0x40, 0x02, 0x08, 0x98, + 0x20, 0x21, 0x40, 0x03, 0x08, 0x80, 0x20, 0x21, 0x40, 0x05, 0x08, 0x68, + 0x20, 0x21, 0x40, 0x06, 0x08, 0x50, 0x20, 0x39, 0x00, 0x01, 0x90, 0x2e, + 0x25, 0x20, 0x7b, 0x88, 0x7a, 0x8c, 0x78, 0x84, 0x79, 0x90, 0x81, 0xff, + 0x0d, 0x98, 0x08, 0x04, 0x4c, 0x2d, 0x20, 0x39, 0x00, 0x01, 0x90, 0x2e, + 0x25, 0x20, 0x7b, 0x88, 0x7a, 0x8c, 0x78, 0x84, 0x79, 0x90, 0x08, 0x04, + 0x4c, 0x30, 0x79, 0x84, 0x78, 0x88, 0x21, 0x14, 0x20, 0x0a, 0x08, 0x04, + 0x35, 0xb5, 0x79, 0x84, 0x21, 0x14, 0x08, 0x04, 0x35, 0xb5, 0x20, 0xe1, + 0x00, 0x00, 0x20, 0x99, 0x00, 0x21, 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, + 0x00, 0x21, 0x20, 0xa9, 0x00, 0x1f, 0x40, 0x03, 0x79, 0x84, 0x7a, 0x88, + 0x7b, 0x8c, 0x08, 0x04, 0x35, 0xb5, 0x78, 0x84, 0x20, 0x60, 0x08, 0x04, + 0x36, 0x6a, 0x20, 0x09, 0x00, 0x03, 0x20, 0x11, 0x00, 0x03, 0x20, 0x19, + 0x00, 0x14, 0x78, 0x9b, 0x01, 0x37, 0x78, 0x93, 0xff, 0xff, 0x20, 0x01, + 0x18, 0x8f, 0x20, 0x04, 0x90, 0x05, 0x01, 0x18, 0x78, 0x96, 0x08, 0x04, + 0x35, 0xb5, 0x78, 0x97, 0x00, 0x01, 0x08, 0x04, 0x35, 0xb5, 0x20, 0x39, + 0x00, 0x01, 0x7d, 0x98, 0x7c, 0x9c, 0x08, 0x04, 0x35, 0xf1, 0x20, 0x39, + 0x00, 0x01, 0x7d, 0x98, 0x7c, 0x9c, 0x08, 0x04, 0x35, 0xfd, 0x79, 0xa0, + 0x91, 0x82, 0x00, 0x40, 0x02, 0x10, 0x08, 0x04, 0x35, 0xea, 0x21, 0x38, + 0x7d, 0x98, 0x7c, 0x9c, 0x08, 0x04, 0x35, 0xf1, 0x79, 0xa0, 0x91, 0x82, + 0x00, 0x40, 0x02, 0x10, 0x08, 0x04, 0x35, 0xea, 0x21, 0x38, 0x7d, 0x98, + 0x7c, 0x9c, 0x08, 0x04, 0x35, 0xfd, 0x79, 0xa0, 0x91, 0x82, 0x00, 0x40, + 0x02, 0x10, 0x08, 0x04, 0x35, 0xea, 0x21, 0xe8, 0x79, 0x84, 0x78, 0x88, + 0x20, 0xa9, 0x00, 0x01, 0x21, 0xa0, 0x40, 0x04, 0x08, 0x04, 0x35, 0xb5, + 0x20, 0x61, 0x08, 0x00, 0xe1, 0x0c, 0x90, 0x06, 0x2c, 0x15, 0x92, 0x00, + 0x8c, 0x60, 0x81, 0x09, 0x1d, 0xd8, 0x20, 0x10, 0x90, 0x05, 0x09, 0x04, + 0x35, 0xb5, 0x08, 0x04, 0x35, 0xe4, 0x79, 0xa0, 0x91, 0x82, 0x00, 0x40, + 0x02, 0x10, 0x08, 0x04, 0x35, 0xea, 0x21, 0xe0, 0x20, 0xa9, 0x00, 0x01, + 0x79, 0x84, 0x21, 0x98, 0x40, 0x12, 0x08, 0x04, 0x35, 0xb5, 0x20, 0x69, + 0x18, 0x47, 0x78, 0x84, 0x79, 0x90, 0x91, 0x1a, 0x1a, 0x04, 0x35, 0xea, + 0x80, 0x19, 0x09, 0x04, 0x35, 0xea, 0x68, 0x4a, 0x69, 0x42, 0x78, 0x8c, + 0x68, 0x52, 0x78, 0x88, 0x68, 0x56, 0x90, 0x06, 0x68, 0x5a, 0x68, 0x5e, + 0x08, 0x0c, 0x79, 0x63, 0x08, 0x04, 0x35, 0xb5, 0x20, 0x69, 0x18, 0x47, + 0x78, 0x84, 0x79, 0x94, 0x91, 0x1a, 0x1a, 0x04, 0x35, 0xea, 0x80, 0x19, + 0x09, 0x04, 0x35, 0xea, 0x68, 0x4e, 0x69, 0x46, 0x78, 0x8c, 0x68, 0x62, + 0x78, 0x88, 0x68, 0x66, 0x90, 0x06, 0x68, 0x6a, 0x68, 0x6e, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x6b, 0xf8, 0x01, 0x2e, 0x08, 0x04, + 0x35, 0xb5, 0x90, 0x2e, 0x25, 0x20, 0x81, 0xff, 0x01, 0x20, 0x20, 0x09, + 0x00, 0x01, 0x08, 0x04, 0x35, 0xe7, 0x79, 0x84, 0x7b, 0x88, 0x7a, 0x8c, + 0x20, 0xa9, 0x00, 0x05, 0x20, 0xe9, 0x00, 0x01, 0x20, 0xa1, 0x18, 0xa6, + 0x41, 0x01, 0x08, 0x0c, 0x4b, 0xe4, 0x11, 0x20, 0x20, 0x09, 0x00, 0x02, + 0x08, 0x04, 0x35, 0xe7, 0x20, 0x09, 0x00, 0x20, 0xa8, 0x5c, 0x90, 0x80, + 0x00, 0x19, 0xaf, 0x60, 0x08, 0x0c, 0x4c, 0x2d, 0x70, 0x1f, 0x36, 0xdb, + 0x00, 0x05, 0xa8, 0x64, 0x20, 0x08, 0x90, 0x84, 0x00, 0xff, 0x90, 0x96, + 0x00, 0x11, 0x01, 0x68, 0x90, 0x96, 0x00, 0x19, 0x01, 0x50, 0x90, 0x96, + 0x00, 0x15, 0x01, 0x38, 0x90, 0x96, 0x00, 0x48, 0x01, 0x20, 0x90, 0x96, + 0x00, 0x29, 0x19, 0x04, 0x35, 0xe7, 0x81, 0x0f, 0x91, 0x8c, 0x00, 0xff, + 0x09, 0x04, 0x35, 0xe7, 0x71, 0x12, 0x70, 0x10, 0x80, 0x01, 0x05, 0x60, + 0x70, 0x12, 0x08, 0x0c, 0x4b, 0xe4, 0x11, 0x20, 0x20, 0x09, 0x00, 0x02, + 0x08, 0x04, 0x35, 0xe7, 0x20, 0x09, 0x00, 0x20, 0x70, 0x68, 0x20, 0x40, + 0xa2, 0x8c, 0xa3, 0x90, 0xa4, 0x94, 0xa5, 0x98, 0x92, 0x90, 0x00, 0x40, + 0x93, 0x99, 0x00, 0x00, 0x94, 0xa1, 0x00, 0x00, 0x95, 0xa9, 0x00, 0x00, + 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x19, 0xaf, 0x60, 0x08, 0x0c, 0x4c, 0x2d, + 0x70, 0x1f, 0x37, 0x19, 0x00, 0x05, 0xa8, 0x64, 0x90, 0x84, 0x00, 0xff, + 0x90, 0x96, 0x00, 0x02, 0x01, 0x20, 0x90, 0x96, 0x00, 0x0a, 0x19, 0x04, + 0x35, 0xe7, 0x08, 0x88, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x70, 0x14, + 0x20, 0x48, 0xa8, 0x68, 0xc0, 0xfd, 0xa8, 0x6a, 0xa8, 0x64, 0x90, 0x84, + 0x00, 0xff, 0x90, 0x96, 0x00, 0x29, 0x11, 0x48, 0xc2, 0xfd, 0xaa, 0x7a, + 0x08, 0x0c, 0x62, 0x9f, 0x01, 0x38, 0xa8, 0x7a, 0xa9, 0x82, 0x01, 0x2e, + 0x00, 0x60, 0x08, 0x0c, 0x65, 0xcf, 0x11, 0x30, 0x70, 0x07, 0x00, 0x03, + 0x70, 0x1f, 0x37, 0x47, 0x01, 0x2e, 0x00, 0x05, 0x08, 0x0c, 0x71, 0x0b, + 0x01, 0x2e, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0xa9, 0x00, 0x05, + 0x20, 0xe1, 0x00, 0x01, 0x20, 0x99, 0x18, 0xa6, 0x40, 0x0a, 0x21, 0x00, + 0x92, 0x10, 0x93, 0x99, 0x00, 0x00, 0x94, 0xa1, 0x00, 0x00, 0x95, 0xa9, + 0x00, 0x00, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x19, 0x20, 0x09, 0x00, 0x20, + 0x01, 0x2e, 0xaf, 0x60, 0x08, 0x04, 0x4c, 0x30, 0x20, 0x91, 0x80, 0x00, + 0x78, 0x37, 0x40, 0x00, 0x78, 0x33, 0x00, 0x10, 0x78, 0x83, 0x40, 0x00, + 0x78, 0x87, 0x49, 0x53, 0x78, 0x8b, 0x50, 0x20, 0x78, 0x8f, 0x20, 0x20, + 0x20, 0x09, 0x01, 0x7f, 0x21, 0x04, 0x78, 0x92, 0x3f, 0x00, 0x78, 0x96, + 0x20, 0x61, 0x01, 0x00, 0x62, 0x00, 0x20, 0x61, 0x02, 0x00, 0x60, 0x3c, + 0x80, 0x07, 0x92, 0x05, 0x78, 0x9a, 0x20, 0x09, 0x04, 0xfd, 0x21, 0x04, + 0x78, 0x9e, 0x20, 0x91, 0x50, 0x00, 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, + 0x00, 0x89, 0x20, 0x04, 0xd0, 0x84, 0x01, 0x80, 0x20, 0x01, 0x1a, 0x1c, + 0x20, 0x04, 0x90, 0x05, 0x01, 0x28, 0x20, 0x01, 0x00, 0x8b, 0x20, 0x04, + 0xd0, 0xfc, 0x0d, 0xd8, 0x20, 0x01, 0x00, 0x8a, 0x20, 0x03, 0x00, 0x02, + 0x20, 0x03, 0x10, 0x01, 0x20, 0x71, 0x00, 0x80, 0x08, 0x04, 0x04, 0x27, + 0x81, 0xff, 0x19, 0x04, 0x35, 0xe7, 0x79, 0x84, 0x08, 0x0c, 0x67, 0x24, + 0x19, 0x04, 0x35, 0xea, 0x7e, 0x98, 0x96, 0x84, 0x3f, 0xff, 0x90, 0x82, + 0x40, 0x00, 0x1a, 0x04, 0x35, 0xea, 0x7c, 0x88, 0x7d, 0x8c, 0x08, 0x0c, + 0x68, 0x87, 0x08, 0x0c, 0x68, 0x56, 0x00, 0x00, 0x15, 0x18, 0x20, 0x61, + 0x1c, 0xd0, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x60, 0x00, 0x90, 0x86, + 0x00, 0x00, 0x01, 0x48, 0x60, 0x14, 0x90, 0x4d, 0x01, 0x30, 0xa8, 0x6c, + 0x94, 0x06, 0x11, 0x18, 0xa8, 0x70, 0x95, 0x06, 0x01, 0x50, 0x01, 0x2e, + 0x9c, 0xe0, 0x00, 0x18, 0x20, 0x01, 0x18, 0x1a, 0x20, 0x04, 0x9c, 0x02, + 0x1a, 0x04, 0x35, 0xe7, 0x0c, 0x30, 0x08, 0x0c, 0xcc, 0xf3, 0x01, 0x2e, + 0x09, 0x04, 0x35, 0xe7, 0x08, 0x04, 0x35, 0xb5, 0x90, 0x0e, 0x20, 0x01, + 0x00, 0x05, 0x08, 0x0c, 0x71, 0x0b, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x08, 0x0c, 0xd3, 0xd4, 0x08, 0x0c, 0x6e, 0x9f, 0x01, 0x2e, 0x08, 0x04, + 0x35, 0xb5, 0x00, 0xa6, 0x29, 0x50, 0xb1, 0x98, 0x08, 0x0c, 0x67, 0x24, + 0x19, 0x04, 0x38, 0x33, 0xb6, 0xa4, 0x96, 0x84, 0x3f, 0xff, 0x90, 0x82, + 0x40, 0x00, 0x16, 0xe8, 0xb4, 0x9c, 0xb5, 0xa0, 0x08, 0x0c, 0x68, 0x87, + 0x08, 0x0c, 0x68, 0x56, 0x15, 0x20, 0x20, 0x61, 0x1c, 0xd0, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x60, 0x00, 0x90, 0x86, 0x00, 0x00, 0x01, 0x48, + 0x60, 0x14, 0x90, 0x4d, 0x01, 0x30, 0xa8, 0x6c, 0x94, 0x06, 0x11, 0x18, + 0xa8, 0x70, 0x95, 0x06, 0x01, 0x58, 0x01, 0x2e, 0x9c, 0xe0, 0x00, 0x18, + 0x20, 0x01, 0x18, 0x1a, 0x20, 0x04, 0x9c, 0x02, 0x20, 0x09, 0x00, 0x0d, + 0x12, 0xb0, 0x0c, 0x28, 0x08, 0x0c, 0xcc, 0xf3, 0x01, 0x2e, 0x20, 0x09, + 0x00, 0x03, 0x01, 0x78, 0x00, 0xe0, 0x90, 0x0e, 0x20, 0x01, 0x00, 0x05, + 0x08, 0x0c, 0x71, 0x0b, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, + 0xd3, 0xd4, 0x08, 0x0c, 0x6e, 0x92, 0x01, 0x2e, 0x00, 0x70, 0xb0, 0x97, + 0x40, 0x05, 0xb1, 0x9a, 0x00, 0x10, 0xb0, 0x97, 0x40, 0x06, 0x90, 0x0e, + 0x90, 0x85, 0x00, 0x01, 0x20, 0x01, 0x00, 0x30, 0x2a, 0x48, 0x00, 0xae, + 0x00, 0x05, 0xb0, 0x97, 0x40, 0x00, 0x90, 0x06, 0x91, 0x8d, 0x00, 0x01, + 0x20, 0x08, 0x2a, 0x48, 0x00, 0xae, 0x00, 0x05, 0x81, 0xff, 0x19, 0x04, + 0x35, 0xe7, 0x08, 0x0c, 0x4b, 0xfb, 0x09, 0x04, 0x35, 0xea, 0x08, 0x0c, + 0x67, 0xeb, 0x09, 0x04, 0x35, 0xe7, 0x08, 0x0c, 0x68, 0x8d, 0x09, 0x04, + 0x35, 0xe7, 0x08, 0x04, 0x46, 0x0c, 0x81, 0xff, 0x19, 0x04, 0x35, 0xe7, + 0x08, 0x0c, 0x4c, 0x17, 0x09, 0x04, 0x35, 0xea, 0x08, 0x0c, 0x69, 0x1b, + 0x09, 0x04, 0x35, 0xe7, 0x20, 0x19, 0x00, 0x05, 0x79, 0xa8, 0x08, 0x0c, + 0x68, 0xa8, 0x09, 0x04, 0x35, 0xe7, 0x78, 0x88, 0x90, 0x8a, 0x10, 0x00, + 0x1a, 0x04, 0x35, 0xea, 0x80, 0x03, 0x80, 0x0b, 0x81, 0x0b, 0x91, 0x08, + 0x08, 0x0c, 0x88, 0x4b, 0x79, 0xa8, 0xd1, 0x84, 0x19, 0x04, 0x35, 0xb5, + 0x08, 0x04, 0x46, 0x0c, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x81, 0xff, + 0x01, 0x18, 0x20, 0x09, 0x00, 0x01, 0x04, 0x50, 0x20, 0x29, 0x07, 0xff, + 0x64, 0x5c, 0x24, 0x00, 0x95, 0x06, 0x01, 0xf8, 0x25, 0x08, 0x08, 0x0c, + 0x67, 0x24, 0x11, 0xd8, 0x08, 0x0c, 0x69, 0x1b, 0x11, 0x28, 0x20, 0x09, + 0x00, 0x02, 0x62, 0xc0, 0x25, 0x18, 0x00, 0xc0, 0x20, 0x19, 0x00, 0x04, + 0x90, 0x0e, 0x08, 0x0c, 0x68, 0xa8, 0x11, 0x18, 0x20, 0x09, 0x00, 0x06, + 0x00, 0x78, 0x78, 0x84, 0x90, 0x8a, 0x10, 0x00, 0x12, 0x70, 0x80, 0x03, + 0x80, 0x0b, 0x81, 0x0b, 0x91, 0x08, 0x08, 0x0c, 0x88, 0x4b, 0x85, 0x29, + 0x1a, 0xe0, 0x01, 0x2e, 0x08, 0x04, 0x35, 0xb5, 0x01, 0x2e, 0x08, 0x04, + 0x35, 0xe7, 0x01, 0x2e, 0x08, 0x04, 0x35, 0xea, 0x08, 0x0c, 0x4b, 0xfb, + 0x09, 0x04, 0x35, 0xea, 0x08, 0x0c, 0x67, 0xeb, 0x09, 0x04, 0x35, 0xe7, + 0xba, 0xa0, 0x20, 0x19, 0x00, 0x05, 0x00, 0xc6, 0x90, 0x66, 0x08, 0x0c, + 0x96, 0xa4, 0x00, 0x76, 0x90, 0x3e, 0x08, 0x0c, 0x95, 0x77, 0x90, 0x0e, + 0x08, 0x0c, 0xe9, 0x1c, 0x00, 0x7e, 0x00, 0xce, 0x08, 0x0c, 0x68, 0x87, + 0x08, 0x04, 0x35, 0xb5, 0x08, 0x0c, 0x4b, 0xfb, 0x09, 0x04, 0x35, 0xea, + 0x08, 0x0c, 0x68, 0x87, 0x22, 0x08, 0x08, 0x04, 0x35, 0xb5, 0x01, 0x56, + 0x00, 0xd6, 0x00, 0xe6, 0x20, 0x69, 0x19, 0x10, 0x68, 0x10, 0x69, 0x14, + 0x91, 0x0a, 0x12, 0x08, 0x90, 0x0e, 0x68, 0x16, 0x90, 0x16, 0x90, 0x1e, + 0x20, 0xa9, 0x00, 0x7e, 0x20, 0x69, 0x10, 0x00, 0x2d, 0x04, 0x90, 0x5d, + 0x01, 0x18, 0xb8, 0x4c, 0x00, 0x59, 0x92, 0x10, 0x8d, 0x68, 0x1f, 0x04, + 0x38, 0xe8, 0x23, 0x00, 0x92, 0x18, 0x00, 0xee, 0x00, 0xde, 0x01, 0x5e, + 0x08, 0x04, 0x35, 0xb5, 0x00, 0xf6, 0x00, 0x16, 0x90, 0x7d, 0x01, 0x38, + 0x90, 0x06, 0x80, 0x00, 0x2f, 0x0c, 0x81, 0xff, 0x01, 0x10, 0x21, 0x78, + 0x0c, 0xd0, 0x00, 0x1e, 0x00, 0xfe, 0x00, 0x05, 0x20, 0x69, 0x19, 0x10, + 0x69, 0x10, 0x62, 0xbc, 0x08, 0x04, 0x35, 0xb5, 0x81, 0xff, 0x01, 0x20, + 0x20, 0x09, 0x00, 0x01, 0x08, 0x04, 0x35, 0xe7, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0x57, 0xe9, 0x01, 0x28, 0x20, 0x09, 0x00, 0x07, + 0x01, 0x2e, 0x08, 0x04, 0x35, 0xe7, 0x01, 0x2e, 0x61, 0x5c, 0x91, 0x90, + 0x33, 0xb6, 0x22, 0x15, 0x92, 0x94, 0x00, 0xff, 0x63, 0x7c, 0x83, 0xff, + 0x01, 0x08, 0x62, 0x80, 0x67, 0xdc, 0x97, 0xc4, 0x00, 0x0a, 0x98, 0xc6, + 0x00, 0x0a, 0x11, 0x18, 0x20, 0x31, 0x00, 0x01, 0x00, 0xe8, 0x97, 0xc4, + 0x00, 0x22, 0x98, 0xc6, 0x00, 0x22, 0x11, 0x18, 0x20, 0x31, 0x00, 0x03, + 0x00, 0xa8, 0x97, 0xc4, 0x00, 0x12, 0x98, 0xc6, 0x00, 0x12, 0x11, 0x18, + 0x20, 0x31, 0x00, 0x02, 0x00, 0x68, 0x08, 0x0c, 0x76, 0x37, 0x11, 0x18, + 0x20, 0x31, 0x00, 0x04, 0x00, 0x38, 0xd7, 0x9c, 0x01, 0x20, 0x20, 0x09, + 0x00, 0x05, 0x08, 0x04, 0x35, 0xe7, 0x90, 0x36, 0x7e, 0x9a, 0x7f, 0x9e, + 0x08, 0x04, 0x35, 0xb5, 0x61, 0x4c, 0x62, 0x50, 0x20, 0x19, 0x19, 0x86, + 0x23, 0x1c, 0x20, 0x01, 0x19, 0x87, 0x20, 0x04, 0x78, 0x9a, 0x08, 0x04, + 0x35, 0xb5, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x61, 0x38, 0x62, 0x3c, + 0x63, 0x40, 0x01, 0x2e, 0x08, 0x04, 0x35, 0xb5, 0x08, 0x0c, 0x4c, 0x17, + 0x09, 0x04, 0x35, 0xea, 0xba, 0x44, 0xbb, 0x38, 0x08, 0x04, 0x35, 0xb5, + 0x08, 0x0c, 0x0d, 0xc5, 0x08, 0x0c, 0x4c, 0x17, 0x21, 0x10, 0x09, 0x04, + 0x35, 0xea, 0xb8, 0x04, 0x90, 0x8c, 0x00, 0xff, 0x91, 0x8e, 0x00, 0x06, + 0x01, 0x40, 0x90, 0x84, 0xff, 0x00, 0x90, 0x86, 0x06, 0x00, 0x20, 0x09, + 0x00, 0x09, 0x19, 0x04, 0x35, 0xe7, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x19, 0x00, 0x05, 0x00, 0xc6, 0x90, 0x66, 0x08, 0x0c, 0xac, 0x6c, + 0x08, 0x0c, 0x96, 0xa4, 0x00, 0x76, 0x90, 0x3e, 0x08, 0x0c, 0x95, 0x77, + 0x90, 0x0e, 0x08, 0x0c, 0xe9, 0x1c, 0x00, 0x7e, 0x00, 0xce, 0xb8, 0x07, + 0x04, 0x07, 0x01, 0x2e, 0x08, 0x04, 0x35, 0xb5, 0x61, 0x4c, 0x62, 0x50, + 0x78, 0x84, 0x60, 0x4e, 0x7b, 0x88, 0x63, 0x52, 0x20, 0x69, 0x18, 0x47, + 0x83, 0x1f, 0x93, 0x05, 0x68, 0x16, 0x78, 0x8c, 0x20, 0x69, 0x19, 0x86, + 0x2d, 0x1c, 0x20, 0x6a, 0x7e, 0x98, 0x96, 0x82, 0x00, 0x14, 0x12, 0x10, + 0x20, 0x31, 0x07, 0xd0, 0x20, 0x69, 0x19, 0x87, 0x2d, 0x04, 0x26, 0x6a, + 0x78, 0x9a, 0x08, 0x04, 0x35, 0xb5, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x61, 0x38, 0x78, 0x84, 0x60, 0x3a, 0x91, 0x0e, 0xd1, 0xb4, 0x19, 0x0c, + 0x0e, 0xbe, 0xd0, 0x94, 0x01, 0x48, 0x00, 0xe6, 0x20, 0x71, 0x19, 0xfb, + 0x79, 0xb4, 0x91, 0x92, 0x07, 0xd0, 0x12, 0x08, 0x71, 0x3e, 0x00, 0xee, + 0xd0, 0xc4, 0x01, 0xa8, 0x00, 0xd6, 0x78, 0xa8, 0x20, 0x09, 0x19, 0x9d, + 0x20, 0x0a, 0x78, 0xac, 0x20, 0x11, 0x19, 0x9e, 0x20, 0x12, 0x20, 0x69, + 0x01, 0x00, 0x68, 0x38, 0x90, 0x86, 0x00, 0x07, 0x11, 0x18, 0x22, 0x14, + 0x6a, 0x5a, 0x00, 0x10, 0x21, 0x0c, 0x69, 0x5a, 0x00, 0xde, 0x78, 0x88, + 0xd0, 0xec, 0x01, 0x78, 0x60, 0x34, 0xc0, 0x8d, 0x60, 0x36, 0x20, 0x01, + 0x00, 0x50, 0x60, 0x76, 0x60, 0x7a, 0x60, 0x56, 0x60, 0x6b, 0x24, 0x50, + 0x00, 0xc6, 0x20, 0x61, 0x1a, 0xd1, 0x20, 0x62, 0x00, 0xce, 0x20, 0x11, + 0x01, 0x14, 0x22, 0x0c, 0x78, 0x88, 0xd0, 0x8c, 0x01, 0x18, 0x91, 0x8d, + 0x00, 0x80, 0x00, 0x10, 0x91, 0x8c, 0xff, 0x7f, 0x21, 0x12, 0x60, 0x3c, + 0x79, 0x88, 0x61, 0x3e, 0x61, 0x40, 0x91, 0x0d, 0x78, 0x8c, 0x60, 0x42, + 0x7a, 0x88, 0x92, 0x94, 0x10, 0x00, 0x92, 0x05, 0x91, 0x0e, 0xd1, 0xe4, + 0x19, 0x0c, 0x0e, 0xd4, 0x90, 0x84, 0x00, 0x20, 0x01, 0x30, 0x78, 0xb4, + 0x60, 0x46, 0x90, 0x84, 0x00, 0x01, 0x09, 0x0c, 0x42, 0xec, 0x60, 0x40, + 0xd0, 0xcc, 0x01, 0x20, 0x78, 0xb0, 0x20, 0x11, 0x01, 0x14, 0x20, 0x12, + 0x01, 0x2e, 0x08, 0x04, 0x35, 0xb5, 0x00, 0xf6, 0x20, 0x79, 0x18, 0x00, + 0x7a, 0x38, 0xa8, 0x98, 0x90, 0x84, 0xfe, 0xbf, 0x92, 0x15, 0xa8, 0x9c, + 0x90, 0x84, 0xfe, 0xbf, 0x80, 0x02, 0x92, 0x14, 0x78, 0x38, 0x90, 0x84, + 0x01, 0x40, 0x92, 0x15, 0x7a, 0x3a, 0xa8, 0x97, 0x40, 0x00, 0x90, 0x0e, + 0x90, 0x85, 0x00, 0x01, 0x20, 0x01, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x05, + 0x78, 0x98, 0x90, 0x05, 0x01, 0xa8, 0x78, 0x88, 0x90, 0x25, 0x09, 0x04, + 0x35, 0xea, 0x78, 0x8c, 0x90, 0x2d, 0x09, 0x04, 0x35, 0xea, 0x90, 0x0e, + 0x08, 0x0c, 0x67, 0x24, 0x11, 0x20, 0xba, 0x44, 0xbb, 0x38, 0xbc, 0x46, + 0xbd, 0x3a, 0x91, 0x86, 0x07, 0xff, 0x01, 0x90, 0x81, 0x08, 0x0c, 0xa0, + 0x08, 0x0c, 0x4c, 0x17, 0x09, 0x04, 0x35, 0xea, 0x78, 0x88, 0x90, 0x0d, + 0x09, 0x04, 0x35, 0xea, 0x78, 0x8c, 0x90, 0x05, 0x09, 0x04, 0x35, 0xea, + 0xba, 0x44, 0xb9, 0x46, 0xbb, 0x38, 0xb8, 0x3a, 0x08, 0x04, 0x35, 0xb5, + 0x20, 0x11, 0xbc, 0x09, 0x00, 0x10, 0x20, 0x11, 0xbc, 0x05, 0x08, 0x0c, + 0x57, 0xe9, 0x19, 0x04, 0x35, 0xe7, 0x00, 0xc6, 0x20, 0x61, 0x01, 0x00, + 0x79, 0x84, 0x91, 0x86, 0x00, 0xff, 0x11, 0x30, 0x20, 0x01, 0x18, 0x18, + 0x20, 0x04, 0x90, 0x85, 0xff, 0x00, 0x00, 0x88, 0x91, 0x82, 0x00, 0x7f, + 0x16, 0xe0, 0x91, 0x88, 0x33, 0xb6, 0x21, 0x0d, 0x91, 0x8c, 0x00, 0xff, + 0x20, 0x01, 0x18, 0x18, 0x20, 0x04, 0x00, 0x26, 0x91, 0x16, 0x00, 0x2e, + 0x05, 0x80, 0x81, 0x0f, 0x91, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x00, 0x06, 0x08, 0x0c, 0xb2, 0x7d, 0x00, 0x0e, 0x05, 0x10, 0x60, 0x2e, + 0x62, 0x0a, 0x79, 0x84, 0x00, 0xb6, 0x08, 0x0c, 0x66, 0xbf, 0x2b, 0x08, + 0x00, 0xbe, 0x15, 0x00, 0x61, 0x12, 0x60, 0x23, 0x00, 0x01, 0x08, 0x0c, + 0x4b, 0xe4, 0x01, 0xd0, 0x90, 0x06, 0xa8, 0x66, 0x70, 0x07, 0x00, 0x03, + 0xa8, 0x32, 0xa8, 0x68, 0xc0, 0xfd, 0xa8, 0x6a, 0x70, 0x1f, 0x3a, 0xc5, + 0x29, 0x00, 0x60, 0x16, 0x20, 0x09, 0x00, 0x32, 0x08, 0x0c, 0xb3, 0x52, + 0x01, 0x2e, 0x00, 0xce, 0x00, 0x05, 0x01, 0x2e, 0x00, 0xce, 0x08, 0x04, + 0x35, 0xe7, 0x00, 0xce, 0x08, 0x04, 0x35, 0xea, 0x08, 0x0c, 0xb2, 0xd3, + 0x0c, 0xb0, 0xa8, 0x30, 0x90, 0x86, 0x01, 0x00, 0x09, 0x04, 0x35, 0xe7, + 0x08, 0x04, 0x35, 0xb5, 0x20, 0x61, 0x1a, 0x74, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x60, 0x00, 0xd0, 0x84, 0x01, 0x70, 0x61, 0x04, 0x62, 0x08, + 0x20, 0x61, 0x18, 0x00, 0x63, 0x54, 0x60, 0x74, 0x78, 0x9a, 0x60, 0xc0, + 0x78, 0x9e, 0x60, 0xbc, 0x78, 0xaa, 0x01, 0x2e, 0x08, 0x04, 0x35, 0xb5, + 0x90, 0x0e, 0x21, 0x10, 0x0c, 0x88, 0x81, 0xff, 0x19, 0x04, 0x35, 0xe7, + 0x08, 0x0c, 0x76, 0x37, 0x09, 0x04, 0x35, 0xe7, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x62, 0x54, 0x60, 0x74, 0x92, 0x02, 0x02, 0x48, 0x90, 0x85, + 0x00, 0x01, 0x08, 0x0c, 0x28, 0xdc, 0x08, 0x0c, 0x5a, 0x11, 0x01, 0x2e, + 0x08, 0x04, 0x35, 0xb5, 0x01, 0x2e, 0x08, 0x04, 0x35, 0xea, 0x00, 0x06, + 0x00, 0x16, 0x00, 0xc6, 0x00, 0xe6, 0x20, 0x01, 0x19, 0xaa, 0x20, 0x70, + 0x20, 0x61, 0x18, 0x47, 0x60, 0x08, 0x20, 0x72, 0x90, 0x0e, 0x20, 0x11, + 0x14, 0x00, 0x08, 0x0c, 0x93, 0x75, 0x72, 0x06, 0x00, 0xee, 0x00, 0xce, + 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x81, 0xff, 0x01, 0x28, 0x01, 0x2e, 0x20, 0x21, 0x40, 0x0b, 0x08, 0x04, + 0x35, 0xb7, 0x78, 0x84, 0xd0, 0xfc, 0x01, 0x58, 0x20, 0x01, 0x00, 0x2a, + 0x20, 0x04, 0x90, 0x05, 0x01, 0x80, 0x90, 0x82, 0x00, 0xe1, 0x02, 0x98, + 0x01, 0x2e, 0x08, 0x04, 0x35, 0xea, 0x20, 0x01, 0x00, 0x2a, 0x20, 0x04, + 0x90, 0x05, 0x01, 0x28, 0x20, 0x69, 0x18, 0x47, 0x69, 0x08, 0x91, 0x02, + 0x12, 0x30, 0x01, 0x2e, 0x08, 0x04, 0x35, 0xea, 0x01, 0x2e, 0x08, 0x04, + 0x35, 0xe7, 0x08, 0x0c, 0xb2, 0x3d, 0x0d, 0xd0, 0x78, 0x84, 0xd0, 0xfc, + 0x09, 0x04, 0x3b, 0x94, 0x00, 0xc6, 0x08, 0x0c, 0x4b, 0xe4, 0x00, 0xce, + 0x0d, 0x88, 0xa8, 0x67, 0x00, 0x00, 0x78, 0x84, 0xa8, 0x0a, 0x78, 0x98, + 0xa8, 0x0e, 0x78, 0x9c, 0xa8, 0x12, 0x20, 0x01, 0x00, 0x2e, 0x20, 0x04, + 0xa8, 0x1a, 0x20, 0x01, 0x00, 0x2f, 0x20, 0x04, 0xa8, 0x1e, 0x20, 0x01, + 0x00, 0x30, 0x20, 0x04, 0xa8, 0x22, 0x20, 0x01, 0x00, 0x31, 0x20, 0x04, + 0xa8, 0x26, 0x20, 0x01, 0x00, 0x34, 0x20, 0x04, 0xa8, 0x2a, 0x20, 0x01, + 0x00, 0x35, 0x20, 0x04, 0xa8, 0x2e, 0x20, 0x01, 0x00, 0x2a, 0x20, 0x04, + 0x90, 0x80, 0x00, 0x03, 0x90, 0x84, 0x00, 0xfc, 0x80, 0x04, 0xa8, 0x16, + 0x08, 0x0c, 0x3d, 0x1a, 0x09, 0x28, 0x70, 0x14, 0x20, 0x48, 0xad, 0x2c, + 0xac, 0x28, 0xab, 0x1c, 0xaa, 0x18, 0xa9, 0x30, 0xa8, 0x08, 0xd0, 0xb4, + 0x11, 0x20, 0x20, 0x29, 0x00, 0x00, 0x20, 0x21, 0x00, 0x00, 0x89, 0x06, + 0x80, 0x06, 0x80, 0x07, 0x90, 0xbc, 0x00, 0x3f, 0x90, 0x84, 0xff, 0xc0, + 0x90, 0x80, 0x00, 0x1b, 0x08, 0x0c, 0x4c, 0x2d, 0x70, 0x1f, 0x3c, 0x57, + 0x70, 0x23, 0x00, 0x01, 0x01, 0x2e, 0x00, 0x05, 0x00, 0x46, 0x00, 0x86, + 0x00, 0x96, 0x00, 0xa6, 0x00, 0xb6, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, + 0x00, 0xf6, 0x08, 0x0c, 0x3a, 0xff, 0x20, 0x01, 0x19, 0xa0, 0x20, 0x03, + 0x00, 0x00, 0x20, 0x21, 0x00, 0x0a, 0x20, 0x61, 0x01, 0x00, 0x61, 0x04, + 0x00, 0x16, 0x60, 0xbb, 0x00, 0x00, 0x60, 0xbf, 0x32, 0xe1, 0x60, 0xbf, + 0x00, 0x12, 0x08, 0x0c, 0x3d, 0x89, 0x08, 0x0c, 0x3d, 0x48, 0x00, 0xf6, + 0x00, 0xe6, 0x00, 0x86, 0x29, 0x40, 0x20, 0x71, 0x1a, 0x69, 0x20, 0x79, + 0x00, 0x90, 0x00, 0xd6, 0x20, 0x69, 0x00, 0x00, 0x68, 0x84, 0xd0, 0xb4, + 0x01, 0x40, 0x20, 0x01, 0x00, 0x35, 0x20, 0x04, 0x78, 0x0e, 0x20, 0x01, + 0x00, 0x34, 0x20, 0x04, 0x78, 0x0a, 0x00, 0xde, 0x20, 0x11, 0x00, 0x01, + 0x08, 0x0c, 0x41, 0x30, 0x00, 0x8e, 0x00, 0xee, 0x00, 0xfe, 0x08, 0x0c, + 0x40, 0x52, 0x08, 0x0c, 0x3f, 0x57, 0x05, 0xb8, 0x20, 0x01, 0x02, 0x0b, + 0x20, 0x04, 0x90, 0x84, 0x01, 0x40, 0x1d, 0xb8, 0x08, 0x0c, 0x41, 0xa4, + 0x00, 0xf6, 0x20, 0x79, 0x03, 0x00, 0x78, 0xbc, 0x00, 0xfe, 0x90, 0x8c, + 0x00, 0x70, 0x15, 0x60, 0x20, 0x71, 0x02, 0x00, 0x70, 0x37, 0x00, 0x00, + 0x70, 0x50, 0x90, 0x84, 0xff, 0x00, 0x90, 0x86, 0x32, 0x00, 0x15, 0x10, + 0x70, 0x37, 0x00, 0x01, 0x70, 0x50, 0x90, 0x84, 0xff, 0x00, 0x90, 0x86, + 0xe1, 0x00, 0x11, 0xd0, 0x70, 0x37, 0x00, 0x00, 0x70, 0x54, 0x70, 0x37, + 0x00, 0x00, 0x71, 0x5c, 0x91, 0x06, 0x11, 0x90, 0x20, 0x01, 0x18, 0x20, + 0x20, 0x04, 0x91, 0x06, 0x11, 0x68, 0x00, 0xc6, 0x20, 0x61, 0x01, 0x00, + 0x60, 0x24, 0x90, 0x84, 0x1e, 0x00, 0x00, 0xce, 0x01, 0x38, 0x08, 0x0c, + 0x3f, 0x61, 0x08, 0x0c, 0x3d, 0x43, 0x00, 0x58, 0x08, 0x0c, 0x3d, 0x43, + 0x08, 0x0c, 0x40, 0xc8, 0x08, 0x0c, 0x40, 0x48, 0x20, 0x01, 0x02, 0x0b, + 0x20, 0x04, 0xd0, 0xe4, 0x0d, 0xd8, 0x20, 0x01, 0x03, 0x2a, 0x20, 0x03, + 0x00, 0x04, 0x20, 0x61, 0x01, 0x00, 0x60, 0x27, 0x00, 0x02, 0x00, 0x1e, + 0x61, 0x06, 0x20, 0x11, 0x02, 0x0d, 0x20, 0x13, 0x00, 0x20, 0x60, 0xbb, + 0x00, 0x00, 0x60, 0xbf, 0x01, 0x08, 0x60, 0xbf, 0x00, 0x12, 0x20, 0x01, + 0x00, 0x04, 0x20, 0x0c, 0x91, 0x8c, 0xff, 0xfd, 0x21, 0x02, 0x08, 0x0c, + 0x12, 0xfc, 0x20, 0x09, 0x00, 0x28, 0x08, 0x0c, 0x24, 0x09, 0x20, 0x01, + 0x02, 0x27, 0x20, 0x0c, 0x21, 0x02, 0x00, 0xfe, 0x00, 0xee, 0x00, 0xde, + 0x00, 0xce, 0x00, 0xbe, 0x00, 0xae, 0x00, 0x9e, 0x00, 0x8e, 0x00, 0x4e, + 0x20, 0x01, 0x19, 0xa0, 0x20, 0x04, 0x90, 0x05, 0x11, 0x18, 0x01, 0x2e, + 0x08, 0x04, 0x35, 0xb5, 0x01, 0x2e, 0x20, 0x21, 0x40, 0x0c, 0x08, 0x04, + 0x35, 0xb7, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x00, 0x46, 0x00, 0x56, + 0x00, 0x76, 0x00, 0x86, 0x00, 0x96, 0x00, 0xd6, 0x01, 0x56, 0x70, 0x14, + 0x20, 0x48, 0x70, 0x20, 0x20, 0xa8, 0x80, 0x00, 0x70, 0x22, 0xa8, 0x04, + 0x90, 0x05, 0x09, 0x04, 0x3c, 0xb3, 0x20, 0x48, 0x1f, 0x04, 0x3c, 0x67, + 0x70, 0x68, 0x20, 0x40, 0xa2, 0x8c, 0xa3, 0x90, 0xa4, 0x94, 0xa5, 0x98, + 0xa9, 0x30, 0xa8, 0x08, 0xd0, 0xb4, 0x11, 0x20, 0x20, 0x29, 0x00, 0x00, + 0x20, 0x21, 0x00, 0x00, 0x00, 0x96, 0x70, 0x14, 0x20, 0x48, 0xa8, 0x64, + 0x00, 0x9e, 0x90, 0x86, 0x01, 0x03, 0x01, 0x70, 0x89, 0x06, 0x80, 0x06, + 0x80, 0x07, 0x90, 0xbc, 0x00, 0x3f, 0x90, 0x84, 0xff, 0xc0, 0x90, 0x80, + 0x00, 0x1b, 0x08, 0x0c, 0x4c, 0x2d, 0x70, 0x1f, 0x3c, 0x57, 0x00, 0xb0, + 0x89, 0x06, 0x80, 0x06, 0x80, 0x07, 0x90, 0xbc, 0x00, 0x3f, 0x90, 0x84, + 0xff, 0xc0, 0x90, 0x80, 0x00, 0x1b, 0x21, 0xa8, 0x27, 0xe0, 0x20, 0x98, + 0x27, 0xe8, 0x20, 0xa0, 0x00, 0x06, 0x08, 0x0c, 0x0f, 0x8b, 0x00, 0x0e, + 0x08, 0x0c, 0x4c, 0x30, 0x70, 0x1f, 0x3c, 0x57, 0x01, 0x5e, 0x00, 0xde, + 0x00, 0x9e, 0x00, 0x8e, 0x00, 0x7e, 0x00, 0x5e, 0x00, 0x4e, 0x00, 0x3e, + 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x70, 0x14, 0x20, 0x48, 0xa8, 0x64, + 0x90, 0x86, 0x01, 0x03, 0x11, 0x18, 0x70, 0x1f, 0x3d, 0x18, 0x04, 0x50, + 0x70, 0x14, 0x20, 0x48, 0xa8, 0x68, 0xc0, 0xfd, 0xa8, 0x6a, 0x20, 0x09, + 0x00, 0x7f, 0x08, 0x0c, 0x66, 0xb9, 0x01, 0x10, 0x90, 0x06, 0x00, 0x30, + 0xb8, 0x13, 0x00, 0xff, 0xb8, 0x17, 0xff, 0xfd, 0x08, 0x0c, 0xd5, 0xa7, + 0x01, 0x5e, 0x00, 0xde, 0x00, 0x9e, 0x00, 0x8e, 0x00, 0x7e, 0x00, 0x5e, + 0x00, 0x4e, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, 0x09, 0x04, 0x35, 0xe7, + 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x00, 0x46, 0x00, 0x56, 0x00, 0x76, + 0x00, 0x86, 0x00, 0x96, 0x00, 0xd6, 0x01, 0x56, 0x70, 0x1f, 0x3c, 0xea, + 0x70, 0x07, 0x00, 0x03, 0x08, 0x04, 0x3c, 0xa8, 0xa8, 0x30, 0x90, 0x86, + 0x01, 0x00, 0x20, 0x21, 0x40, 0x0c, 0x09, 0x04, 0x35, 0xb7, 0x00, 0x76, + 0xad, 0x10, 0xac, 0x0c, 0xab, 0x24, 0xaa, 0x20, 0xa9, 0x30, 0xa8, 0x08, + 0xd0, 0xb4, 0x11, 0x20, 0x20, 0x29, 0x00, 0x00, 0x20, 0x21, 0x00, 0x00, + 0x89, 0x06, 0x80, 0x06, 0x80, 0x07, 0x90, 0xbc, 0x00, 0x3f, 0x90, 0x84, + 0xff, 0xc0, 0x90, 0x80, 0x00, 0x1b, 0x21, 0xa8, 0x27, 0xe0, 0x20, 0x98, + 0x27, 0xe8, 0x20, 0xa0, 0x00, 0x06, 0x08, 0x0c, 0x0f, 0x8b, 0x00, 0x0e, + 0x08, 0x0c, 0x4c, 0x30, 0x00, 0x7e, 0x70, 0x1f, 0x3c, 0x57, 0x70, 0x23, + 0x00, 0x01, 0x00, 0x05, 0x08, 0x04, 0x35, 0xb5, 0x01, 0x56, 0x00, 0xc6, + 0xa8, 0x14, 0x90, 0x8a, 0x00, 0x1e, 0x02, 0x18, 0xa8, 0x33, 0x00, 0x1e, + 0x00, 0x10, 0xa8, 0x32, 0x00, 0x78, 0x81, 0xff, 0x01, 0x68, 0x00, 0x16, + 0x08, 0x0c, 0x4b, 0xe4, 0x00, 0x1e, 0x01, 0x30, 0xa8, 0x00, 0x20, 0x40, + 0xa0, 0x08, 0xa8, 0x0a, 0x21, 0x00, 0x0c, 0x58, 0x90, 0x06, 0x00, 0x10, + 0x90, 0x85, 0x00, 0x01, 0x00, 0xce, 0x01, 0x5e, 0x00, 0x05, 0x00, 0x06, + 0x00, 0xf6, 0x20, 0x79, 0x00, 0x00, 0x78, 0x80, 0x90, 0x86, 0x00, 0x44, + 0x00, 0xfe, 0x00, 0x0e, 0x00, 0x05, 0x20, 0x01, 0x19, 0xa0, 0x20, 0x03, + 0x00, 0x01, 0x00, 0x05, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xc6, 0x20, 0x61, + 0x02, 0x00, 0x20, 0x01, 0x19, 0xab, 0x20, 0x04, 0x60, 0x1a, 0x20, 0x61, + 0x01, 0x00, 0x20, 0x01, 0x19, 0xaa, 0x20, 0x04, 0x60, 0xce, 0x61, 0x04, + 0xc1, 0xac, 0x61, 0x06, 0x08, 0x0c, 0x4b, 0xe4, 0xa8, 0x13, 0x00, 0x19, + 0xa8, 0x17, 0x00, 0x01, 0x29, 0x00, 0xa8, 0x5a, 0x20, 0x01, 0x00, 0x2e, + 0x20, 0x04, 0xa8, 0x66, 0x20, 0x01, 0x00, 0x2f, 0x20, 0x04, 0xa8, 0x6a, + 0x20, 0x61, 0x00, 0x90, 0x20, 0x79, 0x01, 0x00, 0x20, 0x01, 0x19, 0xaa, + 0x20, 0x04, 0x60, 0x36, 0x20, 0x09, 0x00, 0x40, 0x08, 0x0c, 0x24, 0x09, + 0x20, 0x01, 0x00, 0x2a, 0x20, 0x04, 0x90, 0x84, 0xff, 0xf8, 0xa8, 0x6e, + 0x60, 0x1a, 0xa8, 0x73, 0x00, 0x00, 0x60, 0x1f, 0x00, 0x00, 0x78, 0xca, + 0x90, 0x06, 0x60, 0x0a, 0x60, 0x0e, 0x00, 0xce, 0x00, 0xee, 0x00, 0xfe, + 0x00, 0x05, 0x00, 0xe6, 0x08, 0x0c, 0x4b, 0xe4, 0x29, 0x40, 0xa0, 0x13, + 0x00, 0x19, 0xa0, 0x17, 0x00, 0x01, 0x28, 0x00, 0xa0, 0x5a, 0x20, 0x01, + 0x00, 0x30, 0x20, 0x04, 0xa8, 0x66, 0x20, 0x01, 0x00, 0x31, 0x20, 0x04, + 0xa8, 0x6a, 0x20, 0x01, 0x00, 0x2a, 0x20, 0x04, 0x90, 0x84, 0xff, 0xf8, + 0xa8, 0x6e, 0xa8, 0x73, 0x00, 0x00, 0x20, 0x01, 0x03, 0x2a, 0x20, 0x03, + 0x00, 0x04, 0x20, 0x01, 0x03, 0x00, 0x20, 0x03, 0x00, 0x00, 0x20, 0x01, + 0x02, 0x0d, 0x20, 0x03, 0x00, 0x00, 0x20, 0x01, 0x00, 0x04, 0x20, 0x0c, + 0x91, 0x8d, 0x00, 0x02, 0x21, 0x02, 0x00, 0xee, 0x00, 0x05, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x81, 0xff, 0x01, 0x48, 0x08, 0x0c, 0x2c, 0x59, + 0x11, 0x30, 0x90, 0x06, 0x08, 0x0c, 0x2b, 0xb1, 0x90, 0x06, 0x08, 0x0c, + 0x2b, 0x94, 0x20, 0x01, 0x19, 0x9f, 0x20, 0x03, 0x00, 0x00, 0x78, 0x84, + 0x90, 0x84, 0x00, 0x07, 0x00, 0x02, 0x3d, 0xd8, 0x3d, 0xe1, 0x3d, 0xea, + 0x3d, 0xd5, 0x3d, 0xd5, 0x3d, 0xd5, 0x3d, 0xd5, 0x3d, 0xd5, 0x01, 0x2e, + 0x08, 0x04, 0x35, 0xea, 0x20, 0x09, 0x01, 0x14, 0x21, 0x04, 0x90, 0x85, + 0x08, 0x00, 0x20, 0x0a, 0x08, 0x0c, 0x3f, 0xab, 0x00, 0xc0, 0x20, 0x09, + 0x01, 0x14, 0x21, 0x04, 0x90, 0x85, 0x40, 0x00, 0x20, 0x0a, 0x08, 0x0c, + 0x3f, 0xab, 0x00, 0x78, 0x08, 0x0c, 0x76, 0x37, 0x11, 0x28, 0x01, 0x2e, + 0x20, 0x09, 0x00, 0x16, 0x08, 0x04, 0x35, 0xe7, 0x81, 0xff, 0x01, 0x28, + 0x01, 0x2e, 0x20, 0x21, 0x40, 0x0b, 0x08, 0x04, 0x35, 0xb7, 0x20, 0x01, + 0x01, 0x41, 0x20, 0x04, 0xd0, 0xdc, 0x0d, 0xb0, 0x00, 0x86, 0x00, 0x96, + 0x00, 0xa6, 0x00, 0xb6, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x00, 0xf6, + 0x08, 0x0c, 0x3a, 0xff, 0x20, 0x09, 0x01, 0x01, 0x21, 0x0c, 0x00, 0x16, + 0x7e, 0xc8, 0x7d, 0xcc, 0x90, 0x06, 0x20, 0x68, 0x20, 0x60, 0x20, 0x58, + 0x08, 0x0c, 0x42, 0x7f, 0x08, 0x0c, 0x41, 0xcf, 0x90, 0x3e, 0x27, 0x20, + 0x00, 0xf6, 0x00, 0xe6, 0x00, 0x86, 0x29, 0x40, 0x20, 0x71, 0x1a, 0x69, + 0x20, 0x79, 0x00, 0x90, 0x00, 0xd6, 0x20, 0x69, 0x00, 0x00, 0x68, 0x84, + 0xd0, 0xb4, 0x01, 0x20, 0x68, 0xd4, 0x78, 0x0e, 0x68, 0xd0, 0x78, 0x0a, + 0x00, 0xde, 0x20, 0x11, 0x00, 0x01, 0x08, 0x0c, 0x41, 0x30, 0x08, 0x0c, + 0x2c, 0x61, 0x08, 0x0c, 0x2c, 0x61, 0x08, 0x0c, 0x2c, 0x61, 0x08, 0x0c, + 0x2c, 0x61, 0x08, 0x0c, 0x41, 0x30, 0x00, 0x8e, 0x00, 0xee, 0x00, 0xfe, + 0x08, 0x0c, 0x40, 0x52, 0x20, 0x09, 0x9c, 0x40, 0x81, 0x09, 0x11, 0xb0, + 0x08, 0x0c, 0x3f, 0x61, 0x20, 0x01, 0x00, 0x04, 0x20, 0x0c, 0x91, 0x8c, + 0xff, 0xfd, 0x21, 0x02, 0x00, 0x1e, 0x00, 0xfe, 0x00, 0xee, 0x00, 0xde, + 0x00, 0xce, 0x00, 0xbe, 0x00, 0xae, 0x00, 0x9e, 0x00, 0x8e, 0x20, 0x09, + 0x00, 0x17, 0x08, 0x0c, 0x35, 0xe7, 0x0c, 0xf8, 0x20, 0x01, 0x02, 0x0b, + 0x20, 0x04, 0x90, 0x84, 0x01, 0x40, 0x1d, 0x10, 0x00, 0xf6, 0x20, 0x79, + 0x00, 0x00, 0x78, 0x84, 0x00, 0xfe, 0xd0, 0xbc, 0x01, 0x78, 0x20, 0x01, + 0x02, 0x01, 0x20, 0x0c, 0x81, 0xff, 0x01, 0x50, 0x08, 0x0c, 0x40, 0x30, + 0x2d, 0x00, 0x9c, 0x05, 0x9b, 0x05, 0x01, 0x20, 0x08, 0x0c, 0x3f, 0x61, + 0x08, 0x04, 0x3f, 0x0e, 0x08, 0x0c, 0x41, 0xa4, 0x08, 0x0c, 0x40, 0xc8, + 0x08, 0x0c, 0x40, 0x13, 0x08, 0x0c, 0x40, 0x48, 0x00, 0xf6, 0x20, 0x79, + 0x01, 0x00, 0x78, 0x24, 0xd0, 0xac, 0x01, 0x30, 0x8b, 0x58, 0x08, 0x0c, + 0x3f, 0x61, 0x00, 0xfe, 0x08, 0x04, 0x3f, 0x0e, 0x00, 0xfe, 0x08, 0x0c, + 0x3f, 0x57, 0x11, 0x50, 0x8d, 0x68, 0x20, 0x01, 0x00, 0x32, 0x26, 0x02, + 0x20, 0x01, 0x00, 0x33, 0x25, 0x02, 0x08, 0x0c, 0x3f, 0x61, 0x00, 0x80, + 0x87, 0xff, 0x01, 0x38, 0x20, 0x01, 0x02, 0x01, 0x20, 0x04, 0x90, 0x05, + 0x19, 0x08, 0x87, 0x39, 0x00, 0x38, 0x20, 0x01, 0x1a, 0x65, 0x20, 0x04, + 0x90, 0x86, 0x00, 0x00, 0x19, 0x04, 0x3e, 0x5e, 0x20, 0x01, 0x03, 0x2f, + 0x20, 0x03, 0x00, 0xf6, 0x86, 0x31, 0x12, 0x08, 0x85, 0x29, 0x25, 0x00, + 0x96, 0x05, 0x09, 0x04, 0x3f, 0x0e, 0x78, 0x84, 0xd0, 0xbc, 0x01, 0x28, + 0x2d, 0x00, 0x9c, 0x05, 0x9b, 0x05, 0x19, 0x04, 0x3f, 0x0e, 0xa0, 0x13, + 0x00, 0x19, 0x20, 0x01, 0x03, 0x2a, 0x20, 0x03, 0x00, 0x04, 0x78, 0x84, + 0xd0, 0xac, 0x11, 0x48, 0x20, 0x01, 0x1a, 0x65, 0x20, 0x03, 0x00, 0x03, + 0x20, 0x01, 0x03, 0x2a, 0x20, 0x03, 0x00, 0x09, 0x00, 0x30, 0xa0, 0x17, + 0x00, 0x01, 0x78, 0xb4, 0x90, 0x05, 0x01, 0x08, 0xa0, 0x16, 0x28, 0x00, + 0xa0, 0x5a, 0x20, 0x09, 0x00, 0x40, 0x08, 0x0c, 0x24, 0x09, 0x29, 0x00, + 0xa8, 0x5a, 0xa8, 0x13, 0x00, 0x19, 0x78, 0x84, 0xd0, 0xa4, 0x11, 0x80, + 0xa8, 0x17, 0x00, 0x00, 0x00, 0xc6, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x61, + 0x00, 0x90, 0x60, 0x2b, 0x00, 0x08, 0x20, 0x01, 0x02, 0x03, 0x20, 0x04, + 0x1f, 0x04, 0x3e, 0xe5, 0x00, 0xce, 0x00, 0x30, 0xa8, 0x17, 0x00, 0x01, + 0x78, 0xb0, 0x90, 0x05, 0x01, 0x08, 0xa8, 0x16, 0x00, 0xf6, 0x00, 0xc6, + 0x20, 0x79, 0x01, 0x00, 0x20, 0x61, 0x00, 0x90, 0x78, 0x27, 0x00, 0x02, + 0x20, 0x01, 0x00, 0x2a, 0x20, 0x04, 0x90, 0x84, 0xff, 0xf8, 0x60, 0x1a, + 0x00, 0x06, 0x20, 0x01, 0x00, 0x2b, 0x20, 0x04, 0x60, 0x1e, 0x78, 0xc6, + 0x00, 0x0e, 0x78, 0xca, 0x00, 0xce, 0x00, 0xfe, 0x08, 0x04, 0x3e, 0x18, + 0x00, 0x1e, 0x00, 0xc6, 0x20, 0x01, 0x03, 0x2a, 0x20, 0x03, 0x00, 0x04, + 0x20, 0x61, 0x01, 0x00, 0x60, 0x27, 0x00, 0x02, 0x61, 0x06, 0x20, 0x11, + 0x02, 0x0d, 0x20, 0x13, 0x00, 0x20, 0x20, 0x01, 0x00, 0x04, 0x20, 0x0c, + 0x91, 0x8c, 0xff, 0xfd, 0x21, 0x02, 0x08, 0x0c, 0x12, 0xfc, 0x78, 0x84, + 0x90, 0x84, 0x00, 0x03, 0x90, 0x86, 0x00, 0x02, 0x01, 0xa0, 0x20, 0x09, + 0x00, 0x28, 0x08, 0x0c, 0x24, 0x09, 0x20, 0x01, 0x02, 0x27, 0x20, 0x0c, + 0x21, 0x02, 0x60, 0x50, 0x90, 0x84, 0xb7, 0xef, 0x60, 0x52, 0x60, 0x2f, + 0x00, 0x00, 0x60, 0x4b, 0xf7, 0xf7, 0x60, 0x43, 0x00, 0x90, 0x60, 0x43, + 0x00, 0x10, 0x00, 0xce, 0x2d, 0x08, 0x2c, 0x10, 0x2b, 0x18, 0x2b, 0x00, + 0x9c, 0x05, 0x9d, 0x05, 0x00, 0xfe, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, + 0x00, 0xbe, 0x00, 0xae, 0x00, 0x9e, 0x00, 0x8e, 0x11, 0x18, 0x01, 0x2e, + 0x08, 0x04, 0x35, 0xb5, 0x01, 0x2e, 0x20, 0x21, 0x40, 0x0c, 0x08, 0x04, + 0x35, 0xb7, 0x90, 0x85, 0x00, 0x01, 0x1d, 0x04, 0x3f, 0x60, 0x20, 0x91, + 0x60, 0x00, 0x84, 0x20, 0x94, 0x86, 0x00, 0x64, 0x00, 0x05, 0x20, 0x01, + 0x01, 0x05, 0x20, 0x03, 0x00, 0x10, 0x20, 0x01, 0x03, 0x2a, 0x20, 0x03, + 0x00, 0x04, 0x20, 0x01, 0x1a, 0x65, 0x20, 0x03, 0x00, 0x00, 0x00, 0x71, + 0x20, 0x09, 0x00, 0x48, 0x08, 0x0c, 0x24, 0x09, 0x20, 0x01, 0x02, 0x27, + 0x20, 0x24, 0x24, 0x02, 0x20, 0x01, 0x01, 0x09, 0x20, 0x03, 0x40, 0x00, + 0x90, 0x26, 0x00, 0x05, 0x00, 0xf6, 0x00, 0xe6, 0x20, 0x71, 0x1a, 0x69, + 0x70, 0x00, 0x90, 0x86, 0x00, 0x00, 0x05, 0x20, 0x20, 0x79, 0x00, 0x90, + 0x20, 0x09, 0x02, 0x06, 0x21, 0x04, 0x20, 0x09, 0x02, 0x03, 0x21, 0x0c, + 0x91, 0x06, 0x11, 0x20, 0x20, 0x09, 0x00, 0x40, 0x08, 0x0c, 0x24, 0x09, + 0x78, 0x2c, 0xd0, 0xfc, 0x0d, 0x88, 0x08, 0x0c, 0x41, 0xa4, 0x70, 0x00, + 0x90, 0x86, 0x00, 0x00, 0x1d, 0x58, 0x78, 0x2b, 0x00, 0x04, 0x78, 0x2c, + 0xd0, 0xac, 0x1d, 0xe8, 0x20, 0x09, 0x00, 0x40, 0x08, 0x0c, 0x24, 0x09, + 0x78, 0x2b, 0x00, 0x02, 0x70, 0x03, 0x00, 0x00, 0x00, 0xee, 0x00, 0xfe, + 0x00, 0x05, 0x00, 0xf6, 0x20, 0x79, 0x01, 0x00, 0x20, 0x01, 0x18, 0x18, + 0x20, 0x0c, 0x79, 0x32, 0x79, 0x36, 0x08, 0x0c, 0x28, 0xbc, 0x78, 0x50, + 0x90, 0x84, 0xfb, 0xff, 0x90, 0x85, 0x00, 0x30, 0x78, 0x52, 0x20, 0x19, + 0x01, 0xf4, 0x83, 0x19, 0x1d, 0xf0, 0x90, 0x84, 0xff, 0xcf, 0x90, 0x85, + 0x20, 0x00, 0x78, 0x52, 0x20, 0xa9, 0x00, 0x46, 0x1d, 0x04, 0x3f, 0xc6, + 0x20, 0x91, 0x60, 0x00, 0x1f, 0x04, 0x3f, 0xc6, 0x78, 0x50, 0x90, 0x85, + 0x04, 0x00, 0x90, 0x84, 0xdf, 0xff, 0x78, 0x52, 0x20, 0x01, 0x00, 0x21, + 0x20, 0x04, 0x90, 0x84, 0x00, 0x03, 0x90, 0x86, 0x00, 0x01, 0x11, 0x20, + 0x78, 0x50, 0x90, 0x84, 0xdf, 0xff, 0x78, 0x52, 0x78, 0x4b, 0xf7, 0xf7, + 0x78, 0x43, 0x00, 0x90, 0x78, 0x43, 0x00, 0x10, 0x20, 0xa9, 0x00, 0x28, + 0xa0, 0x01, 0x1f, 0x04, 0x3f, 0xe6, 0x78, 0x50, 0x90, 0x85, 0x14, 0x00, + 0x78, 0x52, 0x20, 0x19, 0x61, 0xa8, 0x78, 0x54, 0xa0, 0x01, 0xa0, 0x01, + 0xd0, 0x8c, 0x11, 0x10, 0x83, 0x19, 0x1d, 0xc8, 0x78, 0x27, 0x00, 0x48, + 0x78, 0x50, 0x90, 0x85, 0x04, 0x00, 0x78, 0x52, 0x78, 0x43, 0x00, 0x40, + 0x20, 0x19, 0x01, 0xf4, 0xa0, 0x01, 0xa0, 0x01, 0x83, 0x19, 0x1d, 0xe0, + 0x20, 0x01, 0x01, 0x00, 0x08, 0x0c, 0x2d, 0x39, 0x78, 0x27, 0x00, 0x20, + 0x78, 0x43, 0x00, 0x00, 0x90, 0x06, 0x08, 0x0c, 0x2d, 0x39, 0x78, 0x27, + 0x00, 0x48, 0x00, 0xfe, 0x00, 0x05, 0x78, 0x84, 0xd0, 0xac, 0x11, 0xc8, + 0x00, 0xf6, 0x00, 0xe6, 0x20, 0x71, 0x1a, 0x65, 0x20, 0x79, 0x03, 0x20, + 0x20, 0x01, 0x02, 0x01, 0x20, 0x04, 0x90, 0x05, 0x01, 0x60, 0x70, 0x00, + 0x90, 0x86, 0x00, 0x00, 0x11, 0x40, 0x00, 0x51, 0xd0, 0xbc, 0x01, 0x08, + 0x87, 0x38, 0x70, 0x03, 0x00, 0x03, 0x78, 0x2b, 0x00, 0x19, 0x00, 0xee, + 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, 0x20, 0x79, 0x03, 0x00, 0x78, 0xbc, + 0x00, 0xfe, 0x90, 0x8c, 0x00, 0x70, 0x01, 0x78, 0x20, 0x09, 0x00, 0x32, + 0x26, 0x0a, 0x20, 0x09, 0x00, 0x33, 0x25, 0x0a, 0xd0, 0xb4, 0x01, 0x08, + 0x8c, 0x60, 0xd0, 0xac, 0x01, 0x08, 0x8d, 0x68, 0xd0, 0xa4, 0x01, 0x08, + 0x8b, 0x58, 0x00, 0x05, 0x00, 0xf6, 0x20, 0x79, 0x02, 0x00, 0x78, 0x1c, + 0xd0, 0x84, 0x01, 0x10, 0x78, 0x37, 0x00, 0x50, 0x00, 0xfe, 0x00, 0x05, + 0x00, 0xe6, 0x20, 0x71, 0x01, 0x00, 0x20, 0x01, 0x19, 0xab, 0x20, 0x04, + 0x70, 0xe2, 0x08, 0x0c, 0x3d, 0x39, 0x11, 0x88, 0x20, 0x01, 0x18, 0x20, + 0x20, 0x04, 0x20, 0x09, 0x18, 0x1f, 0x21, 0x0c, 0x91, 0x8c, 0x00, 0xff, + 0x70, 0x6e, 0x71, 0x6a, 0x70, 0x66, 0x91, 0x8d, 0x32, 0x00, 0x71, 0x62, + 0x70, 0x73, 0xe1, 0x09, 0x00, 0x80, 0x70, 0x2c, 0x90, 0x85, 0x00, 0x02, + 0x70, 0x2e, 0x20, 0x09, 0x18, 0x18, 0x21, 0x0c, 0x71, 0x6e, 0x70, 0x63, + 0x01, 0x00, 0x71, 0x66, 0x71, 0x9e, 0x70, 0x6b, 0x00, 0x00, 0x70, 0x73, + 0x08, 0x09, 0x70, 0x77, 0x00, 0x08, 0x70, 0x78, 0x90, 0x80, 0x01, 0x00, + 0x70, 0x7a, 0x70, 0x80, 0x80, 0x00, 0x70, 0x82, 0x70, 0x87, 0xaa, 0xaa, + 0x90, 0x06, 0x70, 0x8a, 0x70, 0x8e, 0x70, 0x7e, 0x70, 0xd6, 0x70, 0xab, + 0x00, 0x36, 0x70, 0xaf, 0x95, 0xd5, 0x70, 0x14, 0x90, 0x84, 0x19, 0x84, + 0x90, 0x85, 0x00, 0x92, 0x70, 0x16, 0x08, 0x0c, 0x41, 0xa4, 0x00, 0xf6, + 0x20, 0x71, 0x1a, 0x65, 0x20, 0x79, 0x03, 0x20, 0x00, 0xd6, 0x20, 0x69, + 0x00, 0x00, 0x68, 0x84, 0xd0, 0xb4, 0x01, 0x20, 0x68, 0x9c, 0x78, 0x0e, + 0x68, 0x98, 0x78, 0x0a, 0x00, 0xde, 0x08, 0x0c, 0x3d, 0x39, 0x01, 0x40, + 0x20, 0x01, 0x19, 0x9f, 0x20, 0x0c, 0x20, 0x03, 0x00, 0x01, 0x91, 0x8e, + 0x00, 0x01, 0x01, 0x20, 0x20, 0x09, 0x03, 0xe8, 0x81, 0x09, 0x1d, 0xf0, + 0x79, 0x2c, 0xd1, 0xfc, 0x01, 0x10, 0x78, 0x2b, 0x00, 0x04, 0x20, 0x11, + 0x00, 0x11, 0x08, 0x0c, 0x41, 0x30, 0x20, 0x11, 0x00, 0x01, 0x08, 0x0c, + 0x41, 0x30, 0x00, 0xfe, 0x00, 0xee, 0x00, 0x05, 0x00, 0xf6, 0x00, 0xe6, + 0x20, 0x71, 0x1a, 0x65, 0x20, 0x79, 0x03, 0x20, 0x79, 0x2c, 0xd1, 0xfc, + 0x09, 0x04, 0x41, 0x2d, 0x78, 0x2b, 0x00, 0x02, 0x90, 0x26, 0xd1, 0x9c, + 0x19, 0x04, 0x41, 0x29, 0x70, 0x00, 0x00, 0x02, 0x41, 0x2d, 0x40, 0xde, + 0x41, 0x0e, 0x41, 0x29, 0xd1, 0xbc, 0x11, 0x70, 0xd1, 0xdc, 0x11, 0x90, + 0x80, 0x01, 0x70, 0x02, 0x20, 0x11, 0x00, 0x01, 0x08, 0x0c, 0x41, 0x30, + 0x09, 0x04, 0x41, 0x2d, 0x08, 0x0c, 0x41, 0x30, 0x08, 0x04, 0x41, 0x2d, + 0x00, 0xf6, 0x20, 0x79, 0x03, 0x00, 0x78, 0xbf, 0x00, 0x00, 0x00, 0xfe, + 0x78, 0x10, 0x79, 0x14, 0x78, 0x2b, 0x00, 0x04, 0x78, 0x12, 0x79, 0x16, + 0x20, 0x01, 0x02, 0x01, 0x20, 0x0c, 0x81, 0xff, 0x0d, 0xe8, 0x08, 0x0c, + 0x40, 0x30, 0x20, 0x09, 0x00, 0x01, 0x00, 0xf6, 0x20, 0x79, 0x03, 0x00, + 0x78, 0xb8, 0x00, 0xfe, 0xd0, 0xec, 0x01, 0x10, 0x20, 0x09, 0x00, 0x11, + 0x79, 0x2a, 0x00, 0xf8, 0x80, 0x01, 0x70, 0x02, 0x91, 0x84, 0x08, 0x80, + 0x11, 0x40, 0x78, 0x2c, 0xd0, 0xfc, 0x19, 0x04, 0x40, 0xd2, 0x20, 0x11, + 0x00, 0x01, 0x00, 0xb1, 0x00, 0x90, 0xa0, 0x10, 0x90, 0x92, 0x00, 0x04, + 0x90, 0x86, 0x00, 0x15, 0x11, 0x20, 0xa0, 0x00, 0xa0, 0x5a, 0x20, 0x11, + 0x00, 0x31, 0xa2, 0x12, 0xd1, 0xdc, 0x19, 0x60, 0x08, 0x28, 0x78, 0x2b, + 0x00, 0x04, 0x70, 0x03, 0x00, 0x00, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, + 0xa0, 0x14, 0x90, 0x05, 0x05, 0x50, 0x80, 0x01, 0x00, 0x36, 0x00, 0x96, + 0xa0, 0x16, 0xa0, 0x58, 0x20, 0x48, 0xa0, 0x10, 0x20, 0x09, 0x00, 0x31, + 0x91, 0x1a, 0x83, 0x1c, 0x83, 0x1c, 0x93, 0x8a, 0x00, 0x07, 0x1a, 0x0c, + 0x0d, 0xc5, 0x93, 0x98, 0x41, 0x5e, 0x23, 0x1d, 0x08, 0x3f, 0x90, 0x80, + 0x00, 0x04, 0x7a, 0x2a, 0x71, 0x00, 0x81, 0x08, 0x71, 0x02, 0x00, 0x9e, + 0x00, 0x3e, 0x90, 0x8a, 0x00, 0x35, 0x11, 0x40, 0x00, 0x96, 0xa0, 0x58, + 0x20, 0x48, 0xa8, 0x04, 0xa0, 0x5a, 0x20, 0x01, 0x00, 0x19, 0x00, 0x9e, + 0xa0, 0x12, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x41, 0x9b, 0x41, 0x92, + 0x41, 0x89, 0x41, 0x80, 0x41, 0x77, 0x41, 0x6e, 0x41, 0x65, 0xa9, 0x64, + 0x79, 0x02, 0xa9, 0x68, 0x79, 0x06, 0xa9, 0x6c, 0x79, 0x12, 0xa9, 0x70, + 0x79, 0x16, 0x00, 0x05, 0xa9, 0x74, 0x79, 0x02, 0xa9, 0x78, 0x79, 0x06, + 0xa9, 0x7c, 0x79, 0x12, 0xa9, 0x80, 0x79, 0x16, 0x00, 0x05, 0xa9, 0x84, + 0x79, 0x02, 0xa9, 0x88, 0x79, 0x06, 0xa9, 0x8c, 0x79, 0x12, 0xa9, 0x90, + 0x79, 0x16, 0x00, 0x05, 0xa9, 0x94, 0x79, 0x02, 0xa9, 0x98, 0x79, 0x06, + 0xa9, 0x9c, 0x79, 0x12, 0xa9, 0xa0, 0x79, 0x16, 0x00, 0x05, 0xa9, 0xa4, + 0x79, 0x02, 0xa9, 0xa8, 0x79, 0x06, 0xa9, 0xac, 0x79, 0x12, 0xa9, 0xb0, + 0x79, 0x16, 0x00, 0x05, 0xa9, 0xb4, 0x79, 0x02, 0xa9, 0xb8, 0x79, 0x06, + 0xa9, 0xbc, 0x79, 0x12, 0xa9, 0xc0, 0x79, 0x16, 0x00, 0x05, 0xa9, 0xc4, + 0x79, 0x02, 0xa9, 0xc8, 0x79, 0x06, 0xa9, 0xcc, 0x79, 0x12, 0xa9, 0xd0, + 0x79, 0x16, 0x00, 0x05, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0x86, 0x20, 0x71, + 0x1a, 0x69, 0x20, 0x79, 0x00, 0x90, 0x79, 0x2c, 0xd1, 0xfc, 0x01, 0xe8, + 0x78, 0x2b, 0x00, 0x02, 0x29, 0x40, 0x90, 0x26, 0x70, 0x00, 0x00, 0x02, + 0x41, 0xcb, 0x41, 0xb7, 0x41, 0xc2, 0x80, 0x01, 0x70, 0x02, 0xd1, 0x9c, + 0x11, 0x80, 0x20, 0x11, 0x00, 0x01, 0x08, 0x0c, 0x41, 0x30, 0x19, 0x0c, + 0x41, 0x30, 0x00, 0x48, 0x80, 0x01, 0x70, 0x02, 0x78, 0x2c, 0xd0, 0xfc, + 0x1d, 0x38, 0x20, 0x11, 0x00, 0x01, 0x08, 0x0c, 0x41, 0x30, 0x00, 0x8e, + 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xc6, + 0x00, 0x86, 0x20, 0x61, 0x02, 0x00, 0x20, 0x01, 0x19, 0xab, 0x20, 0x04, + 0x60, 0x1a, 0x20, 0x61, 0x01, 0x00, 0x20, 0x01, 0x19, 0xaa, 0x20, 0x04, + 0x60, 0xce, 0x61, 0x04, 0xc1, 0xac, 0x61, 0x06, 0x20, 0x01, 0x00, 0x2c, + 0x20, 0x04, 0x90, 0x05, 0x05, 0x20, 0x20, 0x38, 0x20, 0x01, 0x00, 0x2e, + 0x20, 0x24, 0x20, 0x01, 0x00, 0x2f, 0x20, 0x1c, 0x08, 0x0c, 0x4b, 0xe4, + 0xa8, 0x13, 0x00, 0x19, 0xaf, 0x16, 0x29, 0x00, 0xa8, 0x5a, 0x97, 0x8a, + 0x00, 0x07, 0x02, 0x20, 0x21, 0x38, 0x20, 0x09, 0x00, 0x07, 0x00, 0x10, + 0x27, 0x08, 0x90, 0x3e, 0x00, 0x96, 0xa8, 0x58, 0x20, 0x48, 0xa8, 0x5c, + 0x90, 0x80, 0x00, 0x19, 0x00, 0x9e, 0x08, 0x0c, 0x42, 0x47, 0x1d, 0x68, + 0x29, 0x00, 0xa8, 0x5a, 0x00, 0xd0, 0x08, 0x0c, 0x4b, 0xe4, 0xa8, 0x13, + 0x00, 0x19, 0xa8, 0x17, 0x00, 0x01, 0x29, 0x00, 0xa8, 0x5a, 0x20, 0x01, + 0x00, 0x2e, 0x20, 0x04, 0xa8, 0x66, 0x20, 0x01, 0x00, 0x2f, 0x20, 0x04, + 0xa8, 0x6a, 0x20, 0x01, 0x00, 0x2a, 0x20, 0x04, 0x90, 0x84, 0xff, 0xf8, + 0xa8, 0x6e, 0x20, 0x01, 0x00, 0x2b, 0x20, 0x04, 0xa8, 0x72, 0x20, 0x61, + 0x00, 0x90, 0x20, 0x79, 0x01, 0x00, 0x20, 0x01, 0x19, 0xaa, 0x20, 0x04, + 0x60, 0x36, 0x20, 0x09, 0x00, 0x40, 0x08, 0x0c, 0x24, 0x09, 0x20, 0x01, + 0x00, 0x2a, 0x20, 0x04, 0x90, 0x84, 0xff, 0xf8, 0x60, 0x1a, 0x00, 0x06, + 0x20, 0x01, 0x00, 0x2b, 0x20, 0x04, 0x60, 0x1e, 0x78, 0xc6, 0x00, 0x0e, + 0x78, 0xca, 0x90, 0x06, 0x60, 0x0a, 0x60, 0x0e, 0x00, 0x8e, 0x00, 0xce, + 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0x00, 0x80, + 0xaa, 0x60, 0x22, 0xe8, 0x20, 0xa0, 0x20, 0xe1, 0x00, 0x00, 0x20, 0x99, + 0x00, 0x88, 0x70, 0x2b, 0x00, 0x26, 0x74, 0x02, 0x73, 0x06, 0x90, 0x06, + 0x70, 0x0a, 0x70, 0x0e, 0x81, 0x0b, 0x81, 0x0b, 0x21, 0xa8, 0x81, 0x0b, + 0x71, 0x12, 0x70, 0x2b, 0x00, 0x41, 0x70, 0x2c, 0xd0, 0xfc, 0x0d, 0xe8, + 0x70, 0x2b, 0x00, 0x02, 0x70, 0x2b, 0x00, 0x40, 0x40, 0x05, 0x74, 0x00, + 0x73, 0x04, 0x87, 0xff, 0x01, 0x90, 0x00, 0x86, 0x00, 0x96, 0x29, 0x40, + 0x00, 0x86, 0x08, 0x0c, 0x4b, 0xe4, 0x00, 0x8e, 0xa0, 0x58, 0x00, 0xa6, + 0x20, 0x50, 0x29, 0x00, 0xb0, 0x06, 0xa0, 0x5a, 0x00, 0xae, 0x00, 0x9e, + 0x00, 0x8e, 0x90, 0x85, 0x00, 0x01, 0x00, 0xee, 0x00, 0x05, 0x00, 0xe6, + 0x20, 0x01, 0x00, 0x2d, 0x20, 0x04, 0x90, 0x05, 0x05, 0x28, 0x20, 0x38, + 0x20, 0x01, 0x00, 0x30, 0x20, 0x24, 0x20, 0x01, 0x00, 0x31, 0x20, 0x1c, + 0x08, 0x0c, 0x4b, 0xe4, 0x29, 0x40, 0xa8, 0x13, 0x00, 0x19, 0xaf, 0x16, + 0x29, 0x00, 0xa8, 0x5a, 0x97, 0x8a, 0x00, 0x07, 0x02, 0x20, 0x21, 0x38, + 0x20, 0x09, 0x00, 0x07, 0x00, 0x10, 0x27, 0x08, 0x90, 0x3e, 0x00, 0x96, + 0xa8, 0x58, 0x20, 0x48, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x19, 0x00, 0x9e, + 0x08, 0x0c, 0x42, 0x47, 0x1d, 0x68, 0x29, 0x00, 0xa8, 0x5a, 0x00, 0xd8, + 0x08, 0x0c, 0x4b, 0xe4, 0x29, 0x40, 0xa0, 0x13, 0x00, 0x19, 0xa0, 0x17, + 0x00, 0x01, 0x28, 0x00, 0xa0, 0x5a, 0x20, 0x01, 0x00, 0x30, 0x20, 0x04, + 0xa0, 0x66, 0x20, 0x01, 0x00, 0x31, 0x20, 0x04, 0xa0, 0x6a, 0x20, 0x01, + 0x00, 0x2a, 0x20, 0x04, 0x90, 0x84, 0xff, 0xf8, 0xa0, 0x6e, 0x20, 0x01, + 0x00, 0x2b, 0x20, 0x04, 0xa0, 0x72, 0x20, 0x01, 0x03, 0x2a, 0x20, 0x03, + 0x00, 0x04, 0x78, 0x84, 0xd0, 0xac, 0x11, 0x80, 0x20, 0x01, 0x01, 0x01, + 0x20, 0x0c, 0x91, 0x8d, 0x02, 0x00, 0x21, 0x02, 0xa0, 0x17, 0x00, 0x00, + 0x20, 0x01, 0x1a, 0x65, 0x20, 0x03, 0x00, 0x03, 0x20, 0x01, 0x03, 0x2a, + 0x20, 0x03, 0x00, 0x09, 0x20, 0x01, 0x03, 0x00, 0x20, 0x03, 0x00, 0x00, + 0x20, 0x01, 0x02, 0x0d, 0x20, 0x03, 0x00, 0x00, 0x20, 0x01, 0x00, 0x04, + 0x20, 0x0c, 0x91, 0x8d, 0x00, 0x02, 0x21, 0x02, 0x00, 0xee, 0x00, 0x05, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0xa9, 0x00, 0x07, 0x20, 0xa1, + 0x18, 0x40, 0x20, 0xe9, 0x00, 0x01, 0x90, 0x06, 0x40, 0x04, 0x20, 0xa9, + 0x00, 0x14, 0x20, 0xa1, 0xff, 0xec, 0x20, 0xe9, 0x00, 0x00, 0x90, 0x06, + 0x40, 0x04, 0x20, 0x09, 0x01, 0x3c, 0x20, 0x0a, 0x01, 0x2e, 0x78, 0x80, + 0x90, 0x86, 0x00, 0x52, 0x01, 0x08, 0x00, 0x05, 0x08, 0x04, 0x35, 0xb5, + 0x7d, 0x98, 0x7c, 0x9c, 0x08, 0x04, 0x36, 0xb9, 0x08, 0x0c, 0x76, 0x37, + 0x19, 0x0c, 0x60, 0xf3, 0x60, 0x40, 0x90, 0x84, 0x00, 0x20, 0x09, 0xb1, + 0x20, 0x69, 0x18, 0x47, 0x2d, 0x00, 0x20, 0x09, 0x00, 0x30, 0x7a, 0x8c, + 0x7b, 0x88, 0x7c, 0x9c, 0x7d, 0x98, 0x20, 0x39, 0x00, 0x01, 0x08, 0x0c, + 0x4c, 0x2d, 0x70, 0x1f, 0x43, 0x26, 0x00, 0x05, 0x08, 0x0c, 0x57, 0xe4, + 0x11, 0x30, 0x3b, 0x00, 0x3a, 0x08, 0xc1, 0x94, 0xc0, 0x95, 0x20, 0xd8, + 0x21, 0xd0, 0x20, 0x69, 0x18, 0x47, 0x68, 0x00, 0x90, 0x05, 0x09, 0x04, + 0x35, 0xea, 0x20, 0x01, 0x18, 0x0d, 0x20, 0x04, 0xd0, 0x8c, 0x68, 0x04, + 0x01, 0x18, 0xc0, 0xa4, 0xc0, 0xac, 0x68, 0x06, 0xd0, 0xac, 0x01, 0x18, + 0xd0, 0xa4, 0x09, 0x04, 0x35, 0xea, 0xd0, 0x94, 0x00, 0xc6, 0x20, 0x61, + 0x01, 0x00, 0x61, 0x04, 0x01, 0x38, 0x62, 0x00, 0x92, 0x92, 0x00, 0x05, + 0x02, 0x18, 0x91, 0x8c, 0xff, 0xdf, 0x00, 0x10, 0x91, 0x8d, 0x00, 0x20, + 0x61, 0x06, 0x00, 0xce, 0xd0, 0x8c, 0x00, 0xc6, 0x20, 0x61, 0x01, 0x00, + 0x61, 0x04, 0x01, 0x18, 0x91, 0x8d, 0x00, 0x10, 0x00, 0x10, 0x91, 0x8c, + 0xff, 0xef, 0x61, 0x06, 0x00, 0xce, 0xd0, 0x84, 0x01, 0x58, 0x6a, 0x28, + 0x92, 0x8a, 0x00, 0x7f, 0x1a, 0x04, 0x35, 0xea, 0x92, 0x88, 0x33, 0xb6, + 0x21, 0x0d, 0x91, 0x8c, 0x00, 0xff, 0x61, 0x66, 0xd0, 0xdc, 0x01, 0x30, + 0x68, 0x28, 0x90, 0x8a, 0x00, 0x7f, 0x1a, 0x04, 0x35, 0xea, 0x60, 0x5e, + 0x68, 0x88, 0x90, 0x84, 0x00, 0x30, 0x80, 0x04, 0x80, 0x04, 0x80, 0x04, + 0x80, 0x04, 0x00, 0x06, 0x20, 0x09, 0x19, 0xb2, 0x90, 0x80, 0x29, 0xb7, + 0x20, 0x05, 0x20, 0x0a, 0x00, 0x0e, 0x20, 0x09, 0x19, 0xb3, 0x90, 0x80, + 0x29, 0xbb, 0x20, 0x05, 0x20, 0x0a, 0x68, 0x08, 0x90, 0x8a, 0x01, 0x00, + 0x0a, 0x04, 0x35, 0xea, 0x90, 0x8a, 0x08, 0x41, 0x1a, 0x04, 0x35, 0xea, + 0x90, 0x84, 0x00, 0x07, 0x19, 0x04, 0x35, 0xea, 0x68, 0x0c, 0x90, 0x05, + 0x09, 0x04, 0x35, 0xea, 0x68, 0x10, 0x90, 0x05, 0x09, 0x04, 0x35, 0xea, + 0x68, 0x48, 0x69, 0x40, 0x91, 0x0a, 0x1a, 0x04, 0x35, 0xea, 0x80, 0x01, + 0x09, 0x04, 0x35, 0xea, 0x68, 0x4c, 0x69, 0x44, 0x91, 0x0a, 0x1a, 0x04, + 0x35, 0xea, 0x80, 0x01, 0x09, 0x04, 0x35, 0xea, 0x20, 0x09, 0x19, 0x81, + 0x20, 0x0b, 0x00, 0x00, 0x20, 0x01, 0x18, 0x69, 0x20, 0x04, 0xd0, 0xc4, + 0x01, 0x40, 0x78, 0x84, 0x20, 0x0a, 0x20, 0x08, 0x08, 0x0c, 0x0e, 0x52, + 0x3b, 0x00, 0xc0, 0x85, 0x20, 0xd8, 0x68, 0x14, 0x90, 0x8c, 0x00, 0xff, + 0x61, 0x4e, 0x80, 0x07, 0x90, 0x84, 0x00, 0xff, 0x60, 0x52, 0x08, 0x0c, + 0x79, 0x63, 0x08, 0x0c, 0x6b, 0x8e, 0x08, 0x0c, 0x6b, 0xf8, 0x68, 0x08, + 0x60, 0x2a, 0x08, 0x0c, 0x23, 0x7b, 0x20, 0x09, 0x01, 0x70, 0x20, 0x0b, + 0x00, 0x80, 0xa0, 0x01, 0xa0, 0x01, 0x20, 0x0b, 0x00, 0x00, 0x00, 0x36, + 0x6b, 0x08, 0x08, 0x0c, 0x29, 0x16, 0x00, 0x3e, 0x60, 0x00, 0x90, 0x86, + 0x00, 0x00, 0x19, 0x04, 0x44, 0xcf, 0x68, 0x18, 0x69, 0x1c, 0x6a, 0x20, + 0x6b, 0x24, 0x80, 0x07, 0x81, 0x0f, 0x82, 0x17, 0x83, 0x1f, 0x60, 0x16, + 0x61, 0x1a, 0x62, 0x1e, 0x63, 0x22, 0x6c, 0x04, 0xd4, 0xf4, 0x01, 0x48, + 0x68, 0x30, 0x69, 0x34, 0x6a, 0x38, 0x6b, 0x3c, 0x80, 0x07, 0x81, 0x0f, + 0x82, 0x17, 0x83, 0x1f, 0x00, 0x10, 0x90, 0x84, 0xf0, 0xff, 0x60, 0x06, + 0x61, 0x0a, 0x62, 0x0e, 0x63, 0x12, 0x80, 0x07, 0x81, 0x0f, 0x82, 0x17, + 0x83, 0x1f, 0x20, 0xa9, 0x00, 0x04, 0x20, 0xa1, 0x19, 0xb4, 0x20, 0xe9, + 0x00, 0x01, 0x40, 0x01, 0x20, 0xa9, 0x00, 0x04, 0x20, 0xa1, 0x19, 0xce, + 0x20, 0xe9, 0x00, 0x01, 0x40, 0x01, 0x08, 0x0c, 0x89, 0x62, 0x00, 0xc6, + 0x90, 0x0e, 0x20, 0xa9, 0x00, 0x01, 0x6b, 0x70, 0xd3, 0x84, 0x05, 0x10, + 0x00, 0x68, 0x20, 0x09, 0x01, 0x00, 0x21, 0x0c, 0x91, 0x8e, 0x00, 0x08, + 0x11, 0x10, 0x83, 0x9d, 0x00, 0x10, 0x83, 0xf5, 0x3e, 0x18, 0x12, 0xb0, + 0x35, 0x08, 0x81, 0x09, 0x08, 0x0c, 0x7f, 0x6f, 0x68, 0x78, 0x60, 0x16, + 0x68, 0x74, 0x20, 0x08, 0x90, 0x84, 0xff, 0x00, 0x80, 0x07, 0x60, 0x0a, + 0x91, 0x84, 0x00, 0xff, 0x60, 0x06, 0x81, 0x08, 0x11, 0x18, 0x60, 0x03, + 0x00, 0x03, 0x00, 0x10, 0x60, 0x03, 0x00, 0x01, 0x1f, 0x04, 0x44, 0x1f, + 0x00, 0xce, 0x00, 0xc6, 0x20, 0x61, 0x19, 0x9c, 0x20, 0x01, 0x18, 0x0d, + 0x20, 0x04, 0xd0, 0x8c, 0x11, 0xa8, 0x6a, 0x88, 0x92, 0x84, 0xc0, 0x00, + 0x20, 0x10, 0x92, 0x86, 0x00, 0x00, 0x11, 0x58, 0x20, 0x63, 0x00, 0x00, + 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x2b, 0xb1, 0x20, 0x01, 0x00, 0x01, + 0x08, 0x0c, 0x2b, 0x94, 0x00, 0x88, 0x92, 0x86, 0x40, 0x00, 0x11, 0x48, + 0x20, 0x63, 0x00, 0x01, 0x90, 0x06, 0x08, 0x0c, 0x2b, 0xb1, 0x90, 0x06, + 0x08, 0x0c, 0x2b, 0x94, 0x00, 0x28, 0x92, 0x86, 0x80, 0x00, 0x1d, 0x30, + 0x20, 0x63, 0x00, 0x02, 0x00, 0xce, 0x00, 0xe6, 0x2c, 0x70, 0x08, 0x0c, + 0x0e, 0xa3, 0x00, 0xee, 0x68, 0x88, 0xd0, 0xec, 0x01, 0x30, 0x20, 0x11, + 0x01, 0x14, 0x22, 0x04, 0x90, 0x85, 0x01, 0x00, 0x20, 0x12, 0x6a, 0x80, + 0x92, 0x84, 0x00, 0x30, 0x90, 0x86, 0x00, 0x30, 0x11, 0x28, 0x92, 0x94, + 0xff, 0xcf, 0x92, 0x95, 0x00, 0x20, 0x6a, 0x82, 0x20, 0x01, 0x19, 0x7c, + 0x6a, 0x80, 0x92, 0x94, 0x00, 0x30, 0x92, 0x8e, 0x00, 0x00, 0x01, 0x70, + 0x92, 0x8e, 0x00, 0x10, 0x01, 0x18, 0x92, 0x8e, 0x00, 0x20, 0x01, 0x40, + 0x20, 0x03, 0xaa, 0xaa, 0x08, 0x0c, 0x29, 0x8b, 0x20, 0x01, 0x19, 0x6d, + 0x21, 0x02, 0x00, 0x08, 0x21, 0x02, 0x00, 0xc6, 0x20, 0x61, 0x01, 0x00, + 0x60, 0x2f, 0x00, 0x40, 0x60, 0x2f, 0x00, 0x00, 0x00, 0xce, 0x08, 0x0c, + 0x76, 0x37, 0x01, 0x28, 0x08, 0x0c, 0x50, 0xcb, 0x01, 0x10, 0x08, 0x0c, + 0x28, 0xdc, 0x60, 0xd4, 0x90, 0x05, 0x01, 0xc0, 0x60, 0x03, 0x00, 0x01, + 0x20, 0x09, 0x44, 0xb7, 0x00, 0xe0, 0x08, 0x0c, 0x76, 0x37, 0x11, 0x68, + 0x20, 0x11, 0x74, 0xb2, 0x08, 0x0c, 0x88, 0x3d, 0x20, 0x11, 0x74, 0xa5, + 0x08, 0x0c, 0x89, 0x17, 0x08, 0x0c, 0x79, 0x37, 0x08, 0x0c, 0x75, 0x63, + 0x00, 0x40, 0x08, 0x0c, 0x5f, 0xed, 0x00, 0x28, 0x60, 0x03, 0x00, 0x04, + 0x20, 0x09, 0x44, 0xcf, 0x00, 0x20, 0x08, 0x0c, 0x6a, 0x05, 0x08, 0x04, + 0x35, 0xb5, 0x20, 0x01, 0x01, 0x70, 0x20, 0x04, 0x90, 0x84, 0x00, 0xff, + 0x90, 0x86, 0x00, 0x4c, 0x11, 0x18, 0x20, 0x91, 0x30, 0xbd, 0x08, 0x17, + 0x20, 0x91, 0x30, 0x3d, 0x08, 0x17, 0x60, 0x00, 0x90, 0x86, 0x00, 0x00, + 0x09, 0x04, 0x35, 0xe7, 0x20, 0x69, 0x18, 0x47, 0x78, 0x90, 0x68, 0x42, + 0x78, 0x94, 0x68, 0x46, 0x2d, 0x00, 0x20, 0x09, 0x00, 0x30, 0x7a, 0x8c, + 0x7b, 0x88, 0x7c, 0x9c, 0x7d, 0x98, 0x20, 0x39, 0x00, 0x01, 0x08, 0x04, + 0x4c, 0x30, 0x90, 0x06, 0x08, 0x0c, 0x28, 0xdc, 0x81, 0xff, 0x19, 0x04, + 0x35, 0xe7, 0x08, 0x0c, 0x76, 0x37, 0x11, 0xb0, 0x08, 0x0c, 0x79, 0x32, + 0x08, 0x0c, 0x61, 0x2e, 0x08, 0x0c, 0x33, 0xaa, 0x01, 0x18, 0x61, 0x30, + 0xc1, 0x8d, 0x61, 0x32, 0x08, 0x0c, 0xd7, 0xe3, 0x01, 0x30, 0x08, 0x0c, + 0x76, 0x5a, 0x11, 0x18, 0x08, 0x0c, 0x76, 0x0f, 0x00, 0x38, 0x08, 0x0c, + 0x75, 0x63, 0x00, 0x20, 0x08, 0x0c, 0x60, 0xf3, 0x08, 0x0c, 0x5f, 0xed, + 0x08, 0x04, 0x35, 0xb5, 0x81, 0xff, 0x19, 0x04, 0x35, 0xe7, 0x08, 0x0c, + 0x76, 0x37, 0x11, 0x10, 0x08, 0x04, 0x35, 0xe7, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x61, 0x94, 0x81, 0xff, 0x01, 0x90, 0x70, 0x4f, 0x00, 0x00, + 0x20, 0x01, 0x1c, 0x80, 0x20, 0x09, 0x00, 0x40, 0x7a, 0x8c, 0x7b, 0x88, + 0x7c, 0x9c, 0x7d, 0x98, 0x20, 0x39, 0x00, 0x01, 0x08, 0x0c, 0x4c, 0x30, + 0x70, 0x1f, 0x35, 0xb3, 0x01, 0x2e, 0x00, 0x05, 0x70, 0x4f, 0x00, 0x01, + 0x00, 0xd6, 0x20, 0x69, 0x1c, 0x80, 0x20, 0xa9, 0x00, 0x40, 0x20, 0xe9, + 0x00, 0x01, 0x20, 0xa1, 0x1c, 0x80, 0x20, 0x19, 0xff, 0xff, 0x43, 0x04, + 0x65, 0x5c, 0x95, 0x88, 0x33, 0xb6, 0x21, 0x0d, 0x91, 0x8c, 0x00, 0xff, + 0x21, 0x6a, 0x90, 0x0e, 0x20, 0x11, 0x00, 0x02, 0x21, 0x00, 0x95, 0x06, + 0x01, 0xa8, 0x08, 0x0c, 0x67, 0x24, 0x11, 0x90, 0xb8, 0x14, 0x82, 0x1c, + 0x02, 0x38, 0x93, 0x98, 0x1c, 0x80, 0x90, 0x85, 0xff, 0x00, 0x80, 0x07, + 0x20, 0x1a, 0x00, 0x38, 0x93, 0x98, 0x1c, 0x80, 0x23, 0x24, 0x94, 0xa4, + 0xff, 0x00, 0x94, 0x05, 0x20, 0x1a, 0x82, 0x10, 0x81, 0x08, 0x91, 0x82, + 0x00, 0x80, 0x12, 0x08, 0x0c, 0x18, 0x82, 0x01, 0x80, 0x07, 0x2d, 0x0c, + 0x91, 0x05, 0x20, 0x6a, 0x00, 0xde, 0x20, 0xa9, 0x00, 0x40, 0x20, 0xa1, + 0x1c, 0x80, 0x20, 0x99, 0x1c, 0x80, 0x08, 0x0c, 0x60, 0x7e, 0x08, 0x04, + 0x45, 0x2c, 0x08, 0x0c, 0x4c, 0x17, 0x09, 0x04, 0x35, 0xea, 0x08, 0x0c, + 0x4b, 0xe4, 0x11, 0x20, 0x20, 0x09, 0x00, 0x02, 0x08, 0x04, 0x35, 0xe7, + 0x08, 0x0c, 0x57, 0xd5, 0xd0, 0xb4, 0x05, 0x58, 0x78, 0x84, 0x90, 0x8e, + 0x00, 0x7e, 0x05, 0x38, 0x90, 0x8e, 0x00, 0x7f, 0x05, 0x20, 0x90, 0x8e, + 0x00, 0x80, 0x05, 0x08, 0x08, 0x0c, 0x33, 0xa5, 0x11, 0x48, 0xb8, 0x00, + 0xd0, 0x8c, 0x11, 0xd8, 0xb8, 0x04, 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, + 0x00, 0x06, 0x11, 0xa8, 0xa8, 0x67, 0x00, 0x00, 0xa8, 0x68, 0xc0, 0xfd, + 0xa8, 0x6a, 0x08, 0x0c, 0xd2, 0xa3, 0x11, 0x20, 0x20, 0x09, 0x00, 0x03, + 0x08, 0x04, 0x35, 0xe7, 0x70, 0x07, 0x00, 0x03, 0x70, 0x1f, 0x45, 0xb7, + 0x00, 0x05, 0x08, 0x0c, 0x4c, 0x17, 0x09, 0x04, 0x35, 0xea, 0x20, 0xa9, + 0x00, 0x2b, 0xb8, 0xc4, 0x20, 0xe0, 0xb8, 0xc8, 0x20, 0x98, 0xa8, 0x60, + 0x20, 0xe8, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x02, 0x20, 0xa0, 0x40, 0x03, + 0x20, 0xa9, 0x00, 0x08, 0x90, 0x80, 0x00, 0x06, 0x20, 0xa0, 0xb8, 0xc4, + 0x20, 0xe0, 0xb8, 0xc8, 0x90, 0x80, 0x00, 0x06, 0x20, 0x98, 0x08, 0x0c, + 0x0f, 0x8b, 0x00, 0x70, 0x20, 0xa9, 0x00, 0x04, 0xa8, 0x5c, 0x90, 0x80, + 0x00, 0x0a, 0x20, 0xa0, 0xb8, 0xc4, 0x20, 0xe0, 0xb8, 0xc8, 0x90, 0x80, + 0x00, 0x0a, 0x20, 0x98, 0x08, 0x0c, 0x0f, 0x8b, 0x89, 0x06, 0x80, 0x06, + 0x80, 0x07, 0x90, 0xbc, 0x00, 0x3f, 0x90, 0x84, 0xff, 0xc0, 0x90, 0x80, + 0x00, 0x02, 0x20, 0x09, 0x00, 0x2b, 0x7a, 0x8c, 0x7b, 0x88, 0x7c, 0x9c, + 0x7d, 0x98, 0x08, 0x04, 0x4c, 0x30, 0x81, 0xff, 0x19, 0x04, 0x35, 0xe7, + 0x08, 0x0c, 0x4b, 0xfb, 0x09, 0x04, 0x35, 0xea, 0x08, 0x0c, 0x68, 0x96, + 0x09, 0x04, 0x35, 0xe7, 0x00, 0x58, 0xa8, 0x78, 0x90, 0x05, 0x01, 0x20, + 0x20, 0x09, 0x00, 0x04, 0x08, 0x04, 0x35, 0xe7, 0xa9, 0x74, 0xaa, 0x94, + 0x08, 0x04, 0x35, 0xb5, 0x08, 0x0c, 0x57, 0xdd, 0x09, 0x04, 0x35, 0xb5, + 0x70, 0x1f, 0x46, 0x01, 0x70, 0x07, 0x00, 0x03, 0x00, 0x05, 0x81, 0xff, + 0x19, 0x04, 0x35, 0xe7, 0x78, 0x88, 0x90, 0x8a, 0x10, 0x00, 0x1a, 0x04, + 0x35, 0xea, 0x08, 0x0c, 0x4c, 0x17, 0x09, 0x04, 0x35, 0xea, 0x08, 0x0c, + 0x6a, 0xa3, 0x01, 0x20, 0x08, 0x0c, 0x6a, 0xab, 0x19, 0x04, 0x35, 0xea, + 0x08, 0x0c, 0x69, 0x1b, 0x09, 0x04, 0x35, 0xe7, 0x20, 0x19, 0x00, 0x04, + 0x90, 0x0e, 0x08, 0x0c, 0x68, 0xa8, 0x09, 0x04, 0x35, 0xe7, 0x79, 0x84, + 0x7a, 0x88, 0x04, 0xc9, 0x08, 0xa8, 0xa8, 0x9c, 0x90, 0x8a, 0x10, 0x00, + 0x12, 0xf8, 0x08, 0x0c, 0x4c, 0x15, 0x01, 0xe0, 0x08, 0x0c, 0x6a, 0xa3, + 0x01, 0x18, 0x08, 0x0c, 0x6a, 0xab, 0x11, 0xb0, 0x08, 0x0c, 0x69, 0x1b, + 0x20, 0x09, 0x00, 0x02, 0x01, 0x68, 0x20, 0x09, 0x00, 0x02, 0x20, 0x19, + 0x00, 0x04, 0x08, 0x0c, 0x68, 0xa8, 0x20, 0x09, 0x00, 0x03, 0x01, 0x20, + 0xa9, 0x98, 0xaa, 0x9c, 0x00, 0xd1, 0x00, 0x60, 0xa8, 0x97, 0x40, 0x05, + 0xa9, 0x9a, 0x00, 0x10, 0xa8, 0x97, 0x40, 0x06, 0x90, 0x0e, 0x90, 0x85, + 0x00, 0x01, 0x20, 0x01, 0x00, 0x30, 0x00, 0x05, 0xa8, 0x97, 0x40, 0x00, + 0x08, 0x0c, 0x57, 0xdd, 0x01, 0x10, 0x90, 0x06, 0x00, 0x18, 0x90, 0x0e, + 0x90, 0x85, 0x00, 0x01, 0x20, 0x01, 0x00, 0x00, 0x00, 0x05, 0x91, 0x86, + 0x00, 0xff, 0x01, 0x10, 0x00, 0x71, 0x00, 0x60, 0x20, 0x29, 0x00, 0x7e, + 0x20, 0x61, 0x18, 0x00, 0x64, 0x5c, 0x24, 0x00, 0x95, 0x06, 0x01, 0x10, + 0x25, 0x08, 0x00, 0x19, 0x85, 0x29, 0x1e, 0xc8, 0x00, 0x05, 0x08, 0x0c, + 0x67, 0x24, 0x11, 0x38, 0x22, 0x00, 0x80, 0x03, 0x80, 0x0b, 0x81, 0x0b, + 0x91, 0x08, 0x08, 0x0c, 0x88, 0x4b, 0x00, 0x05, 0x81, 0xff, 0x19, 0x04, + 0x35, 0xe7, 0x79, 0x8c, 0x20, 0x01, 0x19, 0x80, 0x91, 0x8c, 0x80, 0x00, + 0x21, 0x02, 0x08, 0x0c, 0x4b, 0xfb, 0x09, 0x04, 0x35, 0xea, 0x08, 0x0c, + 0x6a, 0xa3, 0x01, 0x20, 0x08, 0x0c, 0x6a, 0xab, 0x19, 0x04, 0x35, 0xea, + 0x08, 0x0c, 0x67, 0xeb, 0x09, 0x04, 0x35, 0xe7, 0x08, 0x0c, 0x68, 0x9f, + 0x09, 0x04, 0x35, 0xe7, 0x20, 0x01, 0x19, 0x80, 0x20, 0x04, 0xd0, 0xfc, + 0x19, 0x04, 0x35, 0xb5, 0x08, 0x04, 0x46, 0x0c, 0xa9, 0xa0, 0x20, 0x01, + 0x19, 0x80, 0x91, 0x8c, 0x80, 0x00, 0xc1, 0x8d, 0x21, 0x02, 0x08, 0x0c, + 0x4c, 0x08, 0x01, 0xa0, 0x08, 0x0c, 0x6a, 0xa3, 0x01, 0x18, 0x08, 0x0c, + 0x6a, 0xab, 0x11, 0x70, 0x08, 0x0c, 0x67, 0xeb, 0x20, 0x09, 0x00, 0x02, + 0x01, 0x28, 0x08, 0x0c, 0x68, 0x9f, 0x11, 0x70, 0x20, 0x09, 0x00, 0x03, + 0xa8, 0x97, 0x40, 0x05, 0xa9, 0x9a, 0x00, 0x10, 0xa8, 0x97, 0x40, 0x06, + 0x90, 0x0e, 0x90, 0x85, 0x00, 0x01, 0x20, 0x01, 0x00, 0x30, 0x00, 0x05, + 0xa8, 0x97, 0x40, 0x00, 0x20, 0x01, 0x19, 0x80, 0x20, 0x04, 0xd0, 0xfc, + 0x11, 0x28, 0x08, 0x0c, 0x57, 0xdd, 0x01, 0x10, 0x90, 0x06, 0x00, 0x18, + 0x90, 0x0e, 0x90, 0x85, 0x00, 0x01, 0x20, 0x01, 0x00, 0x00, 0x00, 0x05, + 0x81, 0xff, 0x19, 0x04, 0x35, 0xe7, 0x79, 0x8c, 0x20, 0x01, 0x19, 0x7f, + 0x91, 0x8c, 0x80, 0x00, 0x21, 0x02, 0x08, 0x0c, 0x4b, 0xfb, 0x09, 0x04, + 0x35, 0xea, 0x08, 0x0c, 0x6a, 0xa3, 0x01, 0x20, 0x08, 0x0c, 0x6a, 0xab, + 0x19, 0x04, 0x35, 0xea, 0x08, 0x0c, 0x67, 0xeb, 0x09, 0x04, 0x35, 0xe7, + 0x08, 0x0c, 0x68, 0x8d, 0x09, 0x04, 0x35, 0xe7, 0x20, 0x01, 0x19, 0x7f, + 0x20, 0x04, 0xd0, 0xfc, 0x19, 0x04, 0x35, 0xb5, 0x08, 0x04, 0x46, 0x0c, + 0xa9, 0xa0, 0x20, 0x01, 0x19, 0x7f, 0x91, 0x8c, 0x80, 0x00, 0xc1, 0x8d, + 0x21, 0x02, 0x08, 0x0c, 0x4c, 0x08, 0x01, 0xa0, 0x08, 0x0c, 0x6a, 0xa3, + 0x01, 0x18, 0x08, 0x0c, 0x6a, 0xab, 0x11, 0x70, 0x08, 0x0c, 0x67, 0xeb, + 0x20, 0x09, 0x00, 0x02, 0x01, 0x28, 0x08, 0x0c, 0x68, 0x8d, 0x11, 0x70, + 0x20, 0x09, 0x00, 0x03, 0xa8, 0x97, 0x40, 0x05, 0xa9, 0x9a, 0x00, 0x10, + 0xa8, 0x97, 0x40, 0x06, 0x90, 0x0e, 0x90, 0x85, 0x00, 0x01, 0x20, 0x01, + 0x00, 0x30, 0x00, 0x05, 0xa8, 0x97, 0x40, 0x00, 0x20, 0x01, 0x19, 0x7f, + 0x20, 0x04, 0xd0, 0xfc, 0x11, 0x28, 0x08, 0x0c, 0x57, 0xdd, 0x01, 0x10, + 0x90, 0x06, 0x00, 0x18, 0x90, 0x0e, 0x90, 0x85, 0x00, 0x01, 0x20, 0x01, + 0x00, 0x00, 0x00, 0x05, 0x61, 0x00, 0x08, 0x04, 0x35, 0xb5, 0x08, 0x0c, + 0x4c, 0x17, 0x09, 0x04, 0x35, 0xea, 0x08, 0x0c, 0x57, 0xe9, 0x19, 0x04, + 0x35, 0xe7, 0x79, 0xa8, 0xd1, 0x84, 0x11, 0x58, 0xb8, 0x34, 0x80, 0x07, + 0x78, 0x9e, 0xb8, 0x30, 0x80, 0x07, 0x78, 0x9a, 0xbb, 0x2c, 0x83, 0x1f, + 0xba, 0x28, 0x82, 0x17, 0x00, 0x50, 0xb8, 0x24, 0x80, 0x07, 0x78, 0x9e, + 0xb8, 0x20, 0x80, 0x07, 0x78, 0x9a, 0xbb, 0x1c, 0x83, 0x1f, 0xba, 0x18, + 0x82, 0x17, 0xb9, 0x00, 0x91, 0x8c, 0x02, 0x02, 0x08, 0x04, 0x35, 0xb5, + 0x78, 0xa8, 0x90, 0x9c, 0x00, 0x03, 0xd0, 0xac, 0x11, 0x58, 0xd0, 0xb4, + 0x11, 0x48, 0x93, 0x9a, 0x00, 0x03, 0x1a, 0x04, 0x35, 0xe7, 0x62, 0x5c, + 0x78, 0x84, 0x92, 0x06, 0x19, 0x04, 0x47, 0xc7, 0x08, 0x0c, 0x89, 0x4c, + 0x20, 0x01, 0xff, 0xec, 0x20, 0x09, 0x00, 0x0c, 0x7a, 0x8c, 0x7b, 0x88, + 0x7c, 0x9c, 0x7d, 0x98, 0x20, 0x39, 0x00, 0x00, 0x00, 0x06, 0x78, 0xa8, + 0x90, 0x84, 0x00, 0x80, 0x15, 0x28, 0x00, 0x06, 0x00, 0x36, 0x20, 0x01, + 0x1a, 0x83, 0x20, 0x1c, 0x7b, 0x9a, 0x20, 0x03, 0x00, 0x00, 0x20, 0x01, + 0x1a, 0x84, 0x20, 0x1c, 0x7b, 0x9e, 0x20, 0x03, 0x00, 0x00, 0x20, 0x01, + 0x1a, 0x85, 0x20, 0x1c, 0x7b, 0xae, 0x20, 0x03, 0x00, 0x00, 0x20, 0x01, + 0x1a, 0x7f, 0x20, 0x1c, 0x7b, 0xaa, 0x20, 0x03, 0x00, 0x00, 0x20, 0x01, + 0x1a, 0x86, 0x20, 0x1c, 0x7b, 0xb2, 0x20, 0x03, 0x00, 0x00, 0x00, 0x3e, + 0x00, 0x0e, 0x00, 0x0e, 0x08, 0x04, 0x4c, 0x30, 0x00, 0x0e, 0x20, 0x31, + 0x00, 0x00, 0x20, 0x61, 0x18, 0xb8, 0x2c, 0x44, 0xa6, 0x6a, 0xa1, 0x7a, + 0xa7, 0x72, 0xa0, 0x76, 0xa2, 0x8e, 0xa3, 0x92, 0xa4, 0x96, 0xa5, 0x9a, + 0x08, 0x0c, 0x10, 0xf8, 0x70, 0x07, 0x00, 0x02, 0x70, 0x1f, 0x47, 0xe7, + 0x00, 0x05, 0x81, 0xff, 0x19, 0x04, 0x35, 0xe7, 0x08, 0x0c, 0x4c, 0x17, + 0x09, 0x04, 0x35, 0xea, 0x08, 0x0c, 0x6a, 0xa3, 0x19, 0x04, 0x35, 0xe7, + 0x00, 0xc6, 0x08, 0x0c, 0x4b, 0xe4, 0x00, 0xce, 0x09, 0x04, 0x35, 0xe7, + 0xa8, 0x67, 0x00, 0x00, 0xa8, 0x68, 0xc0, 0xfd, 0xa8, 0x6a, 0x7e, 0xa8, + 0x08, 0x0c, 0xd2, 0x49, 0x09, 0x04, 0x35, 0xe7, 0x70, 0x07, 0x00, 0x03, + 0x70, 0x1f, 0x48, 0x0d, 0x00, 0x05, 0x08, 0x0c, 0x42, 0xec, 0x00, 0x06, + 0x00, 0x36, 0x20, 0x01, 0x1a, 0x83, 0x20, 0x1c, 0x7b, 0x9a, 0x20, 0x03, + 0x00, 0x00, 0x20, 0x01, 0x1a, 0x84, 0x20, 0x1c, 0x7b, 0x9e, 0x20, 0x03, + 0x00, 0x00, 0x20, 0x01, 0x1a, 0x85, 0x20, 0x1c, 0x7b, 0xae, 0x20, 0x03, + 0x00, 0x00, 0x20, 0x01, 0x1a, 0x7f, 0x20, 0x1c, 0x7b, 0xaa, 0x20, 0x03, + 0x00, 0x00, 0x20, 0x01, 0x1a, 0x86, 0x20, 0x1c, 0x7b, 0xb2, 0x20, 0x03, + 0x00, 0x00, 0x00, 0x3e, 0x00, 0x0e, 0x08, 0x04, 0x35, 0xb5, 0xa8, 0x30, + 0x90, 0x86, 0x01, 0x00, 0x09, 0x04, 0x35, 0xe7, 0x89, 0x06, 0x80, 0x06, + 0x80, 0x07, 0x90, 0xbc, 0x00, 0x3f, 0x90, 0x84, 0xff, 0xc0, 0x90, 0x80, + 0x00, 0x1b, 0x20, 0x09, 0x00, 0x0c, 0x7a, 0x8c, 0x7b, 0x88, 0x7c, 0x9c, + 0x7d, 0x98, 0x08, 0x04, 0x4c, 0x30, 0x90, 0x06, 0x08, 0x0c, 0x28, 0xdc, + 0x78, 0xa8, 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0xff, 0x01, 0x18, + 0x81, 0xff, 0x19, 0x04, 0x35, 0xe7, 0x08, 0x0c, 0x76, 0x37, 0x01, 0x10, + 0x08, 0x0c, 0x60, 0xf3, 0x78, 0x88, 0x90, 0x8a, 0x10, 0x00, 0x1a, 0x04, + 0x35, 0xea, 0x79, 0x84, 0x91, 0x86, 0x00, 0xff, 0x01, 0x38, 0x91, 0x82, + 0x00, 0x7f, 0x1a, 0x04, 0x35, 0xea, 0x21, 0x00, 0x08, 0x0c, 0x28, 0xa6, + 0x00, 0x26, 0x00, 0xc6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x61, + 0x19, 0xfb, 0x60, 0x1b, 0x00, 0x00, 0x60, 0x1f, 0x00, 0x00, 0x60, 0x7b, + 0x00, 0x00, 0x60, 0x7f, 0x00, 0x00, 0x08, 0x0c, 0x76, 0x37, 0x11, 0x58, + 0x08, 0x0c, 0x79, 0x32, 0x08, 0x0c, 0x61, 0x2e, 0x90, 0x85, 0x00, 0x01, + 0x08, 0x0c, 0x76, 0x7b, 0x08, 0x0c, 0x75, 0x63, 0x00, 0xd0, 0x08, 0x0c, + 0xb2, 0x44, 0x20, 0x61, 0x01, 0x00, 0x20, 0x01, 0x18, 0x18, 0x20, 0x04, + 0x90, 0x84, 0x00, 0xff, 0x81, 0x0f, 0x91, 0x05, 0x60, 0x4a, 0x60, 0x43, + 0x00, 0x90, 0x60, 0x43, 0x00, 0x10, 0x20, 0x09, 0x19, 0x99, 0x20, 0x0b, + 0x00, 0x00, 0x20, 0x09, 0x00, 0x2d, 0x20, 0x11, 0x60, 0x19, 0x08, 0x0c, + 0x88, 0xd5, 0x79, 0x84, 0x08, 0x0c, 0x76, 0x37, 0x11, 0x10, 0x20, 0x09, + 0x00, 0xff, 0x7a, 0x88, 0x08, 0x0c, 0x46, 0x6f, 0x01, 0x2e, 0x00, 0xce, + 0x00, 0x2e, 0x08, 0x04, 0x35, 0xb5, 0x79, 0x84, 0x08, 0x0c, 0x66, 0xb9, + 0x2b, 0x08, 0x19, 0x04, 0x35, 0xea, 0x08, 0x04, 0x35, 0xb5, 0x81, 0xff, + 0x01, 0x20, 0x20, 0x09, 0x00, 0x01, 0x08, 0x04, 0x35, 0xe7, 0x60, 0xdc, + 0xd0, 0xac, 0x11, 0x30, 0xd0, 0x9c, 0x11, 0x20, 0x20, 0x09, 0x00, 0x05, + 0x08, 0x04, 0x35, 0xe7, 0x08, 0x0c, 0x4b, 0xe4, 0x11, 0x20, 0x20, 0x09, + 0x00, 0x02, 0x08, 0x04, 0x35, 0xe7, 0x79, 0x84, 0x81, 0xff, 0x09, 0x04, + 0x35, 0xea, 0x91, 0x92, 0x00, 0x21, 0x1a, 0x04, 0x35, 0xea, 0x7a, 0x8c, + 0x7b, 0x88, 0x7c, 0x9c, 0x7d, 0x98, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x19, + 0x70, 0x2a, 0xaf, 0x60, 0x77, 0x36, 0x08, 0x0c, 0x4c, 0x2d, 0x70, 0x1f, + 0x48, 0xc4, 0x78, 0x80, 0x90, 0x86, 0x00, 0x6e, 0x01, 0x10, 0x70, 0x1f, + 0x52, 0x7d, 0x00, 0x05, 0x20, 0x09, 0x00, 0x80, 0x08, 0x0c, 0x67, 0x24, + 0x11, 0x18, 0x08, 0x0c, 0x6a, 0xa3, 0x01, 0x20, 0x20, 0x21, 0x40, 0x0a, + 0x08, 0x04, 0x35, 0xb7, 0x00, 0xd6, 0x00, 0x96, 0xa9, 0x64, 0xaa, 0x6c, + 0xab, 0x70, 0xac, 0x74, 0xad, 0x78, 0xae, 0x7c, 0xa8, 0x84, 0x90, 0xbe, + 0x01, 0x00, 0x09, 0x04, 0x49, 0x5d, 0x90, 0xbe, 0x01, 0x12, 0x09, 0x04, + 0x49, 0x5d, 0x90, 0xbe, 0x01, 0x13, 0x09, 0x04, 0x49, 0x5d, 0x90, 0xbe, + 0x01, 0x14, 0x09, 0x04, 0x49, 0x5d, 0x90, 0xbe, 0x01, 0x17, 0x09, 0x04, + 0x49, 0x5d, 0x90, 0xbe, 0x01, 0x1a, 0x09, 0x04, 0x49, 0x5d, 0x90, 0xbe, + 0x01, 0x1c, 0x09, 0x04, 0x49, 0x5d, 0x90, 0xbe, 0x01, 0x21, 0x09, 0x04, + 0x49, 0x44, 0x90, 0xbe, 0x01, 0x31, 0x09, 0x04, 0x49, 0x44, 0x90, 0xbe, + 0x01, 0x71, 0x09, 0x04, 0x49, 0x5d, 0x90, 0xbe, 0x01, 0x73, 0x09, 0x04, + 0x49, 0x5d, 0x90, 0xbe, 0x01, 0xa1, 0x11, 0x28, 0xa8, 0x94, 0x80, 0x07, + 0xa8, 0x96, 0x08, 0x04, 0x49, 0x68, 0x90, 0xbe, 0x02, 0x12, 0x09, 0x04, + 0x49, 0x51, 0x90, 0xbe, 0x02, 0x13, 0x05, 0xe8, 0x90, 0xbe, 0x02, 0x14, + 0x05, 0x00, 0x90, 0xbe, 0x02, 0x17, 0x01, 0x88, 0x90, 0xbe, 0x02, 0x1a, + 0x11, 0x20, 0xa8, 0x9c, 0x80, 0x07, 0xa8, 0x9e, 0x04, 0xe0, 0x90, 0xbe, + 0x02, 0x1f, 0x05, 0xc8, 0x90, 0xbe, 0x03, 0x00, 0x05, 0xb0, 0x00, 0x9e, + 0x00, 0xde, 0x08, 0x04, 0x35, 0xea, 0x70, 0x28, 0x90, 0x80, 0x00, 0x10, + 0x20, 0x98, 0x20, 0xa0, 0x70, 0x34, 0x20, 0xe0, 0x20, 0xe8, 0x20, 0xa9, + 0x00, 0x07, 0x08, 0x0c, 0x49, 0xa6, 0x70, 0x28, 0x90, 0x80, 0x00, 0x0e, + 0x20, 0x98, 0x20, 0xa0, 0x70, 0x34, 0x20, 0xe0, 0x20, 0xe8, 0x20, 0xa9, + 0x00, 0x01, 0x08, 0x0c, 0x49, 0xa6, 0x00, 0xc8, 0x70, 0x28, 0x90, 0x80, + 0x00, 0x0c, 0x20, 0x98, 0x20, 0xa0, 0x70, 0x34, 0x20, 0xe0, 0x20, 0xe8, + 0x20, 0xa9, 0x00, 0x01, 0x08, 0x0c, 0x49, 0xb3, 0x00, 0xb8, 0x70, 0x28, + 0x90, 0x80, 0x00, 0x0e, 0x20, 0x98, 0x20, 0xa0, 0x70, 0x34, 0x20, 0xe0, + 0x20, 0xe8, 0x20, 0xa9, 0x00, 0x01, 0x08, 0x0c, 0x49, 0xb3, 0x70, 0x28, + 0x90, 0x80, 0x00, 0x0c, 0x20, 0x98, 0x20, 0xa0, 0x70, 0x34, 0x20, 0xe0, + 0x20, 0xe8, 0x20, 0xa9, 0x00, 0x01, 0x04, 0xf1, 0x00, 0xc6, 0x08, 0x0c, + 0x4b, 0xe4, 0x05, 0x50, 0xa8, 0x68, 0xc0, 0xfd, 0xa8, 0x6a, 0xa8, 0x67, + 0x01, 0x19, 0x90, 0x06, 0xa8, 0x82, 0xa8, 0x7f, 0x00, 0x20, 0xa8, 0x8b, + 0x00, 0x01, 0x81, 0x0b, 0xa9, 0xae, 0xa8, 0xb2, 0xaa, 0xb6, 0xab, 0xba, + 0xac, 0xbe, 0xad, 0xc2, 0xa9, 0xc6, 0xa8, 0xca, 0x00, 0xce, 0x00, 0x9e, + 0x00, 0xde, 0xa8, 0x66, 0xa8, 0x22, 0xa8, 0x68, 0xc0, 0xfd, 0xa8, 0x6a, + 0xa8, 0x04, 0x20, 0x48, 0x08, 0x0c, 0xd2, 0x64, 0x11, 0x20, 0x20, 0x09, + 0x00, 0x03, 0x08, 0x04, 0x35, 0xe7, 0x70, 0x07, 0x00, 0x03, 0x70, 0x1f, + 0x49, 0x9d, 0x00, 0x05, 0x00, 0xce, 0x00, 0x9e, 0x00, 0xde, 0x20, 0x09, + 0x00, 0x02, 0x08, 0x04, 0x35, 0xe7, 0xa8, 0x20, 0x90, 0x86, 0x80, 0x01, + 0x19, 0x04, 0x35, 0xb5, 0x20, 0x09, 0x00, 0x04, 0x08, 0x04, 0x35, 0xe7, + 0x00, 0x16, 0x00, 0x26, 0x35, 0x10, 0x20, 0xa9, 0x00, 0x02, 0x40, 0x02, + 0x41, 0x04, 0x40, 0x04, 0x82, 0x11, 0x1d, 0xc8, 0x00, 0x2e, 0x00, 0x1e, + 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x00, 0x46, 0x35, 0x20, + 0x20, 0xa9, 0x00, 0x04, 0x40, 0x02, 0x43, 0x04, 0x42, 0x04, 0x41, 0x04, + 0x40, 0x04, 0x84, 0x21, 0x1d, 0xb8, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0x2e, + 0x00, 0x1e, 0x00, 0x05, 0x81, 0xff, 0x01, 0x20, 0x20, 0x09, 0x00, 0x01, + 0x08, 0x04, 0x35, 0xe7, 0x60, 0xdc, 0xd0, 0xac, 0x11, 0x88, 0x20, 0x09, + 0x18, 0x0d, 0x21, 0x0c, 0xd1, 0x8c, 0x01, 0x30, 0xd0, 0x9c, 0x01, 0x20, + 0x20, 0x09, 0x00, 0x16, 0x08, 0x04, 0x35, 0xe7, 0xd0, 0x9c, 0x11, 0x20, + 0x20, 0x09, 0x00, 0x05, 0x08, 0x04, 0x35, 0xe7, 0x79, 0x84, 0x78, 0xa8, + 0x20, 0x40, 0x08, 0x0c, 0xb2, 0x3d, 0x11, 0x20, 0x91, 0x82, 0x00, 0x7f, + 0x0a, 0x04, 0x35, 0xea, 0x91, 0x86, 0x00, 0xff, 0x09, 0x04, 0x35, 0xea, + 0x91, 0x82, 0x08, 0x00, 0x1a, 0x04, 0x35, 0xea, 0x7a, 0x8c, 0x7b, 0x88, + 0x60, 0x7c, 0x93, 0x06, 0x11, 0x58, 0x60, 0x80, 0x92, 0x4e, 0x09, 0x04, + 0x35, 0xea, 0x08, 0x0c, 0xb2, 0x3d, 0x11, 0x20, 0x99, 0xcc, 0xff, 0x00, + 0x09, 0x04, 0x35, 0xea, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x01, + 0x18, 0x0d, 0x20, 0x04, 0xd0, 0x8c, 0x01, 0x98, 0x93, 0x86, 0x00, 0xff, + 0x01, 0x80, 0x00, 0x26, 0x20, 0x11, 0x80, 0x08, 0x08, 0x0c, 0x6a, 0xc7, + 0x00, 0x2e, 0x01, 0x48, 0x91, 0x8d, 0x80, 0x00, 0x08, 0x0c, 0x6b, 0x11, + 0x11, 0x20, 0x20, 0x01, 0x40, 0x09, 0x08, 0x04, 0x4a, 0x64, 0x08, 0x0c, + 0x4a, 0xf7, 0x09, 0x04, 0x4a, 0x6a, 0x00, 0x86, 0x90, 0xc6, 0x40, 0x00, + 0x00, 0x8e, 0x15, 0x38, 0x00, 0xc6, 0x00, 0x06, 0x00, 0x36, 0xb8, 0x18, + 0xbb, 0x1c, 0x93, 0x05, 0xbb, 0x20, 0x93, 0x05, 0xbb, 0x24, 0x93, 0x05, + 0xbb, 0x28, 0x93, 0x05, 0xbb, 0x2c, 0x93, 0x05, 0xbb, 0x30, 0x93, 0x05, + 0xbb, 0x34, 0x93, 0x05, 0x00, 0x3e, 0x05, 0x70, 0xd8, 0x8c, 0x11, 0x28, + 0x08, 0x0c, 0x6a, 0xa3, 0x01, 0x10, 0xc8, 0x9d, 0x04, 0x38, 0x90, 0x0e, + 0x08, 0x0c, 0x69, 0x44, 0x11, 0x08, 0xc1, 0x85, 0xb8, 0x00, 0xd0, 0xbc, + 0x01, 0x08, 0xc1, 0x8d, 0x00, 0x0e, 0x00, 0xce, 0x00, 0xb8, 0x90, 0xc6, + 0x40, 0x07, 0x11, 0x10, 0x24, 0x08, 0x00, 0x90, 0x90, 0xc6, 0x40, 0x08, + 0x11, 0x18, 0x27, 0x08, 0x26, 0x10, 0x00, 0x60, 0x90, 0xc6, 0x40, 0x09, + 0x11, 0x08, 0x00, 0x40, 0x90, 0xc6, 0x40, 0x06, 0x11, 0x08, 0x00, 0x20, + 0x20, 0x01, 0x40, 0x05, 0x20, 0x09, 0x00, 0x0a, 0x20, 0x20, 0x01, 0x2e, + 0x08, 0x04, 0x35, 0xb7, 0x00, 0x0e, 0x00, 0xce, 0x2b, 0x00, 0x70, 0x26, + 0x00, 0x16, 0x00, 0xb6, 0x00, 0xc6, 0x00, 0xe6, 0x2c, 0x70, 0x08, 0x0c, + 0xb3, 0x25, 0x09, 0x04, 0x4a, 0xbf, 0x2b, 0x00, 0x60, 0x12, 0x08, 0x0c, + 0xd5, 0x54, 0x2e, 0x58, 0x00, 0xee, 0x00, 0xe6, 0x00, 0xc6, 0x08, 0x0c, + 0x4b, 0xe4, 0x00, 0xce, 0x2b, 0x70, 0x11, 0x58, 0x08, 0x0c, 0xb2, 0xd3, + 0x00, 0xee, 0x00, 0xce, 0x00, 0xbe, 0x00, 0x1e, 0x01, 0x2e, 0x20, 0x09, + 0x00, 0x02, 0x08, 0x04, 0x35, 0xe7, 0x90, 0x0e, 0xa9, 0x66, 0xa9, 0x6a, + 0x29, 0x00, 0x60, 0x16, 0xa9, 0x32, 0xa8, 0x68, 0xc0, 0xfd, 0xd8, 0x8c, + 0x01, 0x08, 0xc0, 0xf5, 0xa8, 0x6a, 0xd8, 0x9c, 0x11, 0x10, 0x08, 0x0c, + 0x32, 0x50, 0x60, 0x23, 0x00, 0x01, 0x90, 0x06, 0x08, 0x0c, 0x66, 0x56, + 0xd8, 0x9c, 0x01, 0x38, 0x20, 0x01, 0x00, 0x04, 0x08, 0x0c, 0x66, 0x6a, + 0x20, 0x09, 0x00, 0x03, 0x00, 0x30, 0x20, 0x01, 0x00, 0x02, 0x08, 0x0c, + 0x66, 0x6a, 0x20, 0x09, 0x00, 0x02, 0x08, 0x0c, 0xb3, 0x52, 0x78, 0xa8, + 0xd0, 0x94, 0x01, 0x38, 0x00, 0xee, 0x70, 0x24, 0x00, 0xe6, 0x20, 0x58, + 0xb8, 0xcc, 0xc0, 0x8d, 0xb8, 0xce, 0x90, 0x85, 0x00, 0x01, 0x00, 0xee, + 0x00, 0xce, 0x00, 0xbe, 0x00, 0x1e, 0x01, 0x2e, 0x11, 0x20, 0x20, 0x09, + 0x00, 0x03, 0x08, 0x04, 0x35, 0xe7, 0x70, 0x07, 0x00, 0x03, 0x70, 0x1f, + 0x4a, 0xce, 0x00, 0x05, 0xa8, 0x30, 0x20, 0x09, 0x18, 0x0d, 0x21, 0x0c, + 0xd1, 0x8c, 0x01, 0x40, 0x20, 0x08, 0x91, 0x8e, 0xde, 0xad, 0x11, 0x20, + 0x20, 0x21, 0x40, 0x09, 0x08, 0x04, 0x35, 0xb7, 0x90, 0x86, 0x01, 0x00, + 0x70, 0x24, 0x20, 0x58, 0x11, 0x38, 0x20, 0x09, 0x00, 0x04, 0xba, 0x04, + 0x92, 0x94, 0x00, 0xff, 0x08, 0x04, 0x57, 0x29, 0x90, 0x0e, 0xa8, 0x68, + 0xd0, 0xf4, 0x19, 0x04, 0x35, 0xb5, 0x08, 0x0c, 0x69, 0x44, 0x11, 0x08, + 0xc1, 0x85, 0xb8, 0x00, 0xd0, 0xbc, 0x01, 0x08, 0xc1, 0x8d, 0x08, 0x04, + 0x35, 0xb5, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0x96, 0x83, 0xff, 0x09, 0x04, + 0x4b, 0x46, 0x90, 0x2e, 0x08, 0x0c, 0xb2, 0x3d, 0x01, 0x30, 0x90, 0x26, + 0x20, 0xa9, 0x08, 0x00, 0x20, 0x71, 0x10, 0x00, 0x00, 0x30, 0x20, 0x21, + 0x00, 0x7f, 0x20, 0xa9, 0x07, 0x81, 0x20, 0x71, 0x10, 0x7f, 0x2e, 0x04, + 0x90, 0x05, 0x11, 0xb8, 0x21, 0x00, 0x94, 0x06, 0x19, 0x04, 0x4b, 0x57, + 0x24, 0x28, 0x94, 0xce, 0x00, 0x7f, 0x11, 0x20, 0x92, 0xce, 0xff, 0xfd, + 0x15, 0x58, 0x00, 0x30, 0x94, 0xce, 0x00, 0x80, 0x11, 0x30, 0x92, 0xce, + 0xff, 0xfc, 0x15, 0x20, 0x93, 0xce, 0x00, 0xff, 0x15, 0x08, 0xc5, 0xfd, + 0x04, 0x80, 0x20, 0x58, 0xbf, 0x10, 0x27, 0x00, 0x93, 0x06, 0x11, 0xe8, + 0xbe, 0x14, 0x26, 0x00, 0x92, 0x06, 0x11, 0xc8, 0x24, 0x00, 0x91, 0x06, + 0x11, 0x80, 0xd8, 0x84, 0x05, 0x98, 0xd8, 0x94, 0x15, 0x88, 0x08, 0x0c, + 0x6a, 0x43, 0x15, 0x70, 0x20, 0x01, 0x40, 0x00, 0x04, 0x60, 0x08, 0x0c, + 0x6a, 0xa3, 0x15, 0x40, 0x20, 0x01, 0x40, 0x00, 0x04, 0x30, 0x20, 0x01, + 0x40, 0x07, 0x04, 0x18, 0x20, 0x01, 0x40, 0x06, 0x04, 0x00, 0x24, 0x00, + 0x91, 0x06, 0x11, 0x58, 0xbe, 0x14, 0x87, 0xff, 0x11, 0x28, 0x86, 0xff, + 0x09, 0x18, 0x08, 0x0c, 0xb2, 0x3d, 0x19, 0x00, 0x20, 0x01, 0x40, 0x08, + 0x00, 0x90, 0x84, 0x20, 0x8e, 0x70, 0x1f, 0x04, 0x4b, 0x0d, 0x85, 0xff, + 0x11, 0x30, 0x20, 0x01, 0x40, 0x09, 0x00, 0x48, 0x20, 0x01, 0x00, 0x01, + 0x00, 0x30, 0x08, 0x0c, 0x66, 0xb9, 0x1d, 0xd0, 0xbb, 0x12, 0xba, 0x16, + 0x90, 0x06, 0x90, 0x05, 0x00, 0x9e, 0x00, 0xde, 0x00, 0xee, 0x00, 0x05, + 0x81, 0xff, 0x01, 0x20, 0x20, 0x09, 0x00, 0x01, 0x08, 0x04, 0x35, 0xe7, + 0x08, 0x0c, 0x4b, 0xe4, 0x11, 0x20, 0x20, 0x09, 0x00, 0x02, 0x08, 0x04, + 0x35, 0xe7, 0xa8, 0x67, 0x00, 0x00, 0xa8, 0x68, 0xc0, 0xfd, 0xa8, 0x6a, + 0x78, 0x84, 0x90, 0x05, 0x09, 0x04, 0x35, 0xea, 0x90, 0x96, 0x00, 0xff, + 0x01, 0x20, 0x90, 0x92, 0x00, 0x04, 0x1a, 0x04, 0x35, 0xea, 0x20, 0x10, + 0x29, 0x18, 0x08, 0x0c, 0x31, 0xf6, 0x11, 0x20, 0x20, 0x09, 0x00, 0x03, + 0x08, 0x04, 0x35, 0xe7, 0x70, 0x07, 0x00, 0x03, 0x70, 0x1f, 0x4b, 0x99, + 0x00, 0x05, 0xa8, 0x30, 0x90, 0x86, 0x01, 0x00, 0x19, 0x04, 0x35, 0xb5, + 0x20, 0x09, 0x00, 0x04, 0x08, 0x04, 0x35, 0xe7, 0x79, 0x84, 0x08, 0x0c, + 0xb2, 0x3d, 0x11, 0x20, 0x91, 0x82, 0x00, 0x7f, 0x0a, 0x04, 0x35, 0xea, + 0x91, 0x86, 0x00, 0xff, 0x09, 0x04, 0x35, 0xea, 0x91, 0x82, 0x08, 0x00, + 0x1a, 0x04, 0x35, 0xea, 0x20, 0x01, 0x94, 0x00, 0x08, 0x0c, 0x57, 0x84, + 0x19, 0x04, 0x35, 0xe7, 0x08, 0x04, 0x35, 0xb5, 0xa9, 0x98, 0x08, 0x0c, + 0xb2, 0x3d, 0x11, 0x18, 0x91, 0x82, 0x00, 0x7f, 0x02, 0x80, 0x91, 0x86, + 0x00, 0xff, 0x01, 0x68, 0x91, 0x82, 0x08, 0x00, 0x12, 0x50, 0x20, 0x01, + 0x94, 0x00, 0x08, 0x0c, 0x57, 0x84, 0x11, 0xa8, 0x00, 0x60, 0xa8, 0x97, + 0x40, 0x05, 0xa9, 0x9a, 0x00, 0x10, 0xa8, 0x97, 0x40, 0x06, 0x90, 0x0e, + 0x90, 0x85, 0x00, 0x01, 0x20, 0x01, 0x00, 0x30, 0x00, 0x05, 0xa8, 0x97, + 0x40, 0x00, 0x90, 0x0e, 0x90, 0x85, 0x00, 0x01, 0x20, 0x01, 0x00, 0x00, + 0x00, 0x05, 0x20, 0x09, 0x00, 0x0a, 0x0c, 0x48, 0x08, 0x0c, 0x10, 0x0e, + 0x01, 0x98, 0x90, 0x06, 0xa8, 0x02, 0x70, 0x14, 0x90, 0x05, 0x11, 0x20, + 0x29, 0x00, 0x70, 0x16, 0x70, 0x1a, 0x00, 0x40, 0x70, 0x18, 0xa8, 0x02, + 0x00, 0x86, 0x20, 0x40, 0x29, 0x00, 0xa0, 0x06, 0x70, 0x1a, 0x00, 0x8e, + 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x79, 0x84, 0x08, 0x0c, 0x67, 0x24, + 0x11, 0x30, 0x7e, 0x88, 0x96, 0x84, 0x3f, 0xff, 0x90, 0x82, 0x40, 0x00, + 0x02, 0x08, 0x90, 0x5e, 0x8b, 0xff, 0x00, 0x05, 0xa9, 0x98, 0x08, 0x0c, + 0x67, 0x24, 0x11, 0x30, 0xae, 0x9c, 0x96, 0x84, 0x3f, 0xff, 0x90, 0x82, + 0x40, 0x00, 0x02, 0x08, 0x90, 0x5e, 0x8b, 0xff, 0x00, 0x05, 0xae, 0x98, + 0x00, 0x08, 0x7e, 0x84, 0x26, 0x08, 0x08, 0x0c, 0x67, 0x24, 0x11, 0x08, + 0x00, 0x08, 0x90, 0x5e, 0x8b, 0xff, 0x00, 0x05, 0x00, 0x16, 0x71, 0x14, + 0x81, 0xff, 0x01, 0x28, 0x21, 0x48, 0xa9, 0x04, 0x08, 0x0c, 0x10, 0x40, + 0x0c, 0xc8, 0x71, 0x16, 0x71, 0x1a, 0x00, 0x1e, 0x00, 0x05, 0x20, 0x31, + 0x00, 0x01, 0x00, 0x10, 0x20, 0x31, 0x00, 0x00, 0x20, 0x61, 0x18, 0xb8, + 0x2c, 0x44, 0xa6, 0x6a, 0xa1, 0x7a, 0xa7, 0x72, 0xa0, 0x76, 0xa2, 0x8e, + 0xa3, 0x92, 0xa4, 0x96, 0xa5, 0x9a, 0x08, 0x0c, 0x10, 0xf8, 0x70, 0x07, + 0x00, 0x02, 0x70, 0x1f, 0x35, 0xb5, 0x00, 0x05, 0x00, 0xf6, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x20, 0x79, 0x00, 0x00, 0x20, 0x01, 0x18, 0xb0, + 0x20, 0x04, 0x90, 0x05, 0x11, 0x90, 0x0e, 0x04, 0x4c, 0x61, 0x7a, 0x36, + 0x78, 0x33, 0x00, 0x12, 0x7a, 0x82, 0x7b, 0x86, 0x7c, 0x8a, 0x20, 0x91, + 0x40, 0x80, 0x20, 0x01, 0x00, 0x89, 0x20, 0x04, 0xd0, 0x84, 0x19, 0x0c, + 0x11, 0xaa, 0x08, 0x04, 0x4c, 0xc7, 0x00, 0x16, 0x00, 0x86, 0x00, 0x96, + 0x00, 0xc6, 0x00, 0xe6, 0x20, 0x71, 0x18, 0x9e, 0x70, 0x44, 0x90, 0x05, + 0x15, 0x40, 0x71, 0x48, 0x91, 0x82, 0x00, 0x10, 0x02, 0x88, 0x70, 0x38, + 0x20, 0x60, 0x08, 0x0c, 0x10, 0x0e, 0x09, 0x04, 0x4c, 0xbf, 0xa8, 0x4b, + 0x00, 0x00, 0x29, 0x00, 0x70, 0x46, 0x20, 0x01, 0x00, 0x02, 0x90, 0x80, + 0x20, 0xc7, 0x20, 0x05, 0xa8, 0x46, 0x00, 0x98, 0x70, 0x38, 0x90, 0xe0, + 0x00, 0x04, 0x20, 0x01, 0x18, 0xba, 0x9c, 0x82, 0x18, 0xfa, 0x02, 0x10, + 0x20, 0x61, 0x18, 0xba, 0x2c, 0x00, 0x70, 0x3a, 0x71, 0x48, 0x81, 0xff, + 0x11, 0x08, 0x70, 0x3e, 0x81, 0x08, 0x71, 0x4a, 0x04, 0x60, 0x71, 0x48, + 0x81, 0x08, 0x71, 0x4a, 0x70, 0x44, 0x20, 0x40, 0xa1, 0x44, 0x21, 0x05, + 0x00, 0x16, 0x90, 0x8a, 0x00, 0x36, 0x1a, 0x0c, 0x0d, 0xc5, 0x20, 0x60, + 0x00, 0x1e, 0x81, 0x08, 0x21, 0x05, 0x90, 0x05, 0xa1, 0x46, 0x15, 0x20, + 0x08, 0x0c, 0x10, 0x0e, 0x11, 0x30, 0x81, 0x09, 0xa9, 0x46, 0x71, 0x48, + 0x81, 0x09, 0x71, 0x4a, 0x00, 0xd8, 0x90, 0x06, 0xa8, 0x06, 0xa8, 0x4a, + 0xa0, 0x46, 0x28, 0x00, 0xa8, 0x02, 0x29, 0x00, 0xa0, 0x06, 0x70, 0x46, + 0x20, 0x01, 0x00, 0x02, 0x90, 0x80, 0x20, 0xc7, 0x20, 0x05, 0xa8, 0x46, + 0x00, 0x58, 0x22, 0x62, 0x63, 0x06, 0x64, 0x0a, 0x00, 0xee, 0x00, 0xce, + 0x00, 0x9e, 0x00, 0x8e, 0x00, 0x1e, 0x01, 0x2e, 0x00, 0xfe, 0x00, 0x05, + 0x2c, 0x00, 0x90, 0x82, 0x00, 0x1b, 0x00, 0x02, 0x4c, 0xe9, 0x4c, 0xe9, + 0x4c, 0xeb, 0x4c, 0xe9, 0x4c, 0xe9, 0x4c, 0xe9, 0x4c, 0xef, 0x4c, 0xe9, + 0x4c, 0xe9, 0x4c, 0xe9, 0x4c, 0xf3, 0x4c, 0xe9, 0x4c, 0xe9, 0x4c, 0xe9, + 0x4c, 0xf7, 0x4c, 0xe9, 0x4c, 0xe9, 0x4c, 0xe9, 0x4c, 0xfb, 0x4c, 0xe9, + 0x4c, 0xe9, 0x4c, 0xe9, 0x4c, 0xff, 0x4c, 0xe9, 0x4c, 0xe9, 0x4c, 0xe9, + 0x4d, 0x04, 0x08, 0x0c, 0x0d, 0xc5, 0xa2, 0x76, 0xa3, 0x7a, 0xa4, 0x7e, + 0x08, 0x98, 0xa2, 0x86, 0xa3, 0x8a, 0xa4, 0x8e, 0x08, 0x78, 0xa2, 0x96, + 0xa3, 0x9a, 0xa4, 0x9e, 0x08, 0x58, 0xa2, 0xa6, 0xa3, 0xaa, 0xa4, 0xae, + 0x08, 0x38, 0xa2, 0xb6, 0xa3, 0xba, 0xa4, 0xbe, 0x08, 0x18, 0xa2, 0xc6, + 0xa3, 0xca, 0xa4, 0xce, 0x08, 0x04, 0x4c, 0xc2, 0xa2, 0xd6, 0xa3, 0xda, + 0xa4, 0xde, 0x08, 0x04, 0x4c, 0xc2, 0x00, 0xe6, 0x20, 0x71, 0x18, 0x9e, + 0x70, 0x48, 0x90, 0x05, 0x09, 0x04, 0x4d, 0x9b, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x0e, 0x04, 0x4d, 0x9a, 0x00, 0xf6, 0x20, 0x79, 0x00, 0x00, + 0x00, 0xc6, 0x00, 0x96, 0x00, 0x86, 0x00, 0x76, 0x90, 0x06, 0x20, 0x38, + 0x70, 0x40, 0x20, 0x48, 0x90, 0x05, 0x05, 0x00, 0xa9, 0x48, 0x21, 0x05, + 0x00, 0x16, 0x90, 0x8a, 0x00, 0x36, 0x1a, 0x0c, 0x0d, 0xc5, 0x20, 0x60, + 0x00, 0x1e, 0x81, 0x08, 0x21, 0x05, 0x90, 0x05, 0xa9, 0x4a, 0x19, 0x04, + 0x4d, 0x9d, 0xa8, 0x04, 0x90, 0x05, 0x09, 0x0c, 0x0d, 0xc5, 0x70, 0x42, + 0x29, 0x38, 0x20, 0x40, 0xa0, 0x03, 0x00, 0x00, 0x20, 0x01, 0x00, 0x02, + 0x90, 0x80, 0x20, 0xc7, 0x20, 0x05, 0xa0, 0x4a, 0x08, 0x04, 0x4d, 0x9d, + 0x70, 0x3c, 0x20, 0x60, 0x2c, 0x14, 0x63, 0x04, 0x64, 0x08, 0x65, 0x0c, + 0x22, 0x00, 0x78, 0x36, 0x78, 0x33, 0x00, 0x12, 0x78, 0x82, 0x23, 0x00, + 0x78, 0x86, 0x24, 0x00, 0x78, 0x8a, 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, + 0x00, 0x89, 0x20, 0x04, 0xd0, 0x84, 0x19, 0x0c, 0x11, 0xaa, 0x87, 0xff, + 0x01, 0x18, 0x27, 0x48, 0x08, 0x0c, 0x10, 0x40, 0x70, 0x48, 0x80, 0x01, + 0x70, 0x4a, 0x90, 0x05, 0x11, 0x70, 0x70, 0x40, 0x20, 0x48, 0x90, 0x05, + 0x01, 0x28, 0x08, 0x0c, 0x10, 0x40, 0x90, 0x06, 0x70, 0x42, 0x70, 0x46, + 0x70, 0x3b, 0x18, 0xba, 0x70, 0x3f, 0x18, 0xba, 0x04, 0x20, 0x70, 0x40, + 0x90, 0x05, 0x15, 0x08, 0x72, 0x38, 0x2c, 0x00, 0x92, 0x06, 0x01, 0x48, + 0x9c, 0x80, 0x00, 0x04, 0x90, 0xfa, 0x18, 0xfa, 0x02, 0x10, 0x20, 0x01, + 0x18, 0xba, 0x70, 0x3e, 0x00, 0xa0, 0x90, 0x06, 0x70, 0x3e, 0x70, 0x3a, + 0x70, 0x44, 0x90, 0x05, 0x09, 0x0c, 0x0d, 0xc5, 0x20, 0x48, 0xa8, 0x00, + 0x90, 0x05, 0x1d, 0xe0, 0x29, 0x00, 0x70, 0x42, 0x20, 0x01, 0x00, 0x02, + 0x90, 0x80, 0x20, 0xc7, 0x20, 0x05, 0xa8, 0x4a, 0x00, 0x00, 0x00, 0x7e, + 0x00, 0x8e, 0x00, 0x9e, 0x00, 0xce, 0x00, 0xfe, 0x01, 0x2e, 0x00, 0xee, + 0x00, 0x05, 0x2c, 0x00, 0x90, 0x82, 0x00, 0x1b, 0x00, 0x02, 0x4d, 0xbc, + 0x4d, 0xbc, 0x4d, 0xbe, 0x4d, 0xbc, 0x4d, 0xbc, 0x4d, 0xbc, 0x4d, 0xc3, + 0x4d, 0xbc, 0x4d, 0xbc, 0x4d, 0xbc, 0x4d, 0xc8, 0x4d, 0xbc, 0x4d, 0xbc, + 0x4d, 0xbc, 0x4d, 0xcd, 0x4d, 0xbc, 0x4d, 0xbc, 0x4d, 0xbc, 0x4d, 0xd2, + 0x4d, 0xbc, 0x4d, 0xbc, 0x4d, 0xbc, 0x4d, 0xd7, 0x4d, 0xbc, 0x4d, 0xbc, + 0x4d, 0xbc, 0x4d, 0xdc, 0x08, 0x0c, 0x0d, 0xc5, 0xaa, 0x74, 0xab, 0x78, + 0xac, 0x7c, 0x08, 0x04, 0x4d, 0x48, 0xaa, 0x84, 0xab, 0x88, 0xac, 0x8c, + 0x08, 0x04, 0x4d, 0x48, 0xaa, 0x94, 0xab, 0x98, 0xac, 0x9c, 0x08, 0x04, + 0x4d, 0x48, 0xaa, 0xa4, 0xab, 0xa8, 0xac, 0xac, 0x08, 0x04, 0x4d, 0x48, + 0xaa, 0xb4, 0xab, 0xb8, 0xac, 0xbc, 0x08, 0x04, 0x4d, 0x48, 0xaa, 0xc4, + 0xab, 0xc8, 0xac, 0xcc, 0x08, 0x04, 0x4d, 0x48, 0xaa, 0xd4, 0xab, 0xd8, + 0xac, 0xdc, 0x08, 0x04, 0x4d, 0x48, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, + 0x00, 0xb6, 0x00, 0xc6, 0x20, 0x09, 0x00, 0x7e, 0x08, 0x0c, 0x67, 0x24, + 0x20, 0x19, 0x00, 0x01, 0xb8, 0x5c, 0xd0, 0xac, 0x01, 0x10, 0x20, 0x19, + 0x00, 0x00, 0x20, 0x11, 0x80, 0x1b, 0x08, 0x0c, 0x4c, 0x44, 0x00, 0xce, + 0x00, 0xbe, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0x26, + 0x08, 0x0c, 0x57, 0xd5, 0xd0, 0xc4, 0x01, 0x20, 0x20, 0x11, 0x80, 0x14, + 0x08, 0x0c, 0x4c, 0x44, 0x00, 0x2e, 0x00, 0x05, 0x81, 0xff, 0x19, 0x04, + 0x35, 0xe7, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x60, 0x30, 0xc0, 0x8d, + 0xc0, 0x85, 0xc0, 0xac, 0x60, 0x32, 0x08, 0x0c, 0x76, 0x37, 0x11, 0x58, + 0x08, 0x0c, 0x79, 0x32, 0x08, 0x0c, 0x61, 0x2e, 0x90, 0x85, 0x00, 0x01, + 0x08, 0x0c, 0x76, 0x7b, 0x08, 0x0c, 0x75, 0x63, 0x00, 0x10, 0x08, 0x0c, + 0x5f, 0xed, 0x01, 0x2e, 0x08, 0x04, 0x35, 0xb5, 0x81, 0xff, 0x01, 0x20, + 0x20, 0x09, 0x00, 0x01, 0x08, 0x04, 0x35, 0xe7, 0x08, 0x0c, 0x57, 0xe9, + 0x01, 0x20, 0x20, 0x09, 0x00, 0x07, 0x08, 0x04, 0x35, 0xe7, 0x08, 0x0c, + 0x6a, 0x9b, 0x01, 0x20, 0x20, 0x09, 0x00, 0x08, 0x08, 0x04, 0x35, 0xe7, + 0x20, 0x01, 0x18, 0x0d, 0x20, 0x04, 0xd0, 0x8c, 0x01, 0x78, 0x00, 0x26, + 0x20, 0x11, 0x00, 0x10, 0x08, 0x0c, 0x6a, 0xc7, 0x00, 0x2e, 0x01, 0x40, + 0x79, 0x84, 0x08, 0x0c, 0x6b, 0x11, 0x11, 0x20, 0x20, 0x09, 0x40, 0x09, + 0x08, 0x04, 0x35, 0xe7, 0x79, 0x84, 0x08, 0x0c, 0x66, 0xb9, 0x19, 0x04, + 0x35, 0xea, 0x08, 0x0c, 0x4c, 0x17, 0x09, 0x04, 0x35, 0xea, 0x2b, 0x00, + 0x70, 0x26, 0x08, 0x0c, 0x6a, 0xa3, 0x78, 0x88, 0x11, 0x70, 0x90, 0x84, + 0x00, 0x05, 0x11, 0x58, 0x90, 0x0e, 0x08, 0x0c, 0x69, 0x44, 0x11, 0x08, + 0xc1, 0x85, 0xb8, 0x00, 0xd0, 0xbc, 0x01, 0x08, 0xc1, 0x8d, 0x08, 0x04, + 0x35, 0xb5, 0x08, 0x0c, 0x4b, 0xe4, 0x09, 0x04, 0x35, 0xe7, 0x90, 0x06, + 0xa8, 0x66, 0xa8, 0x32, 0xa8, 0x68, 0xc0, 0xfd, 0xa8, 0x6a, 0x08, 0x0c, + 0xd3, 0x02, 0x09, 0x04, 0x35, 0xe7, 0x78, 0x88, 0xd0, 0x94, 0x01, 0x18, + 0xb8, 0xcc, 0xc0, 0x8d, 0xb8, 0xce, 0x70, 0x07, 0x00, 0x03, 0x70, 0x1f, + 0x4e, 0xcb, 0x00, 0x05, 0x20, 0x61, 0x18, 0x00, 0x08, 0x0c, 0x57, 0xe9, + 0x20, 0x09, 0x00, 0x07, 0x15, 0x60, 0x08, 0x0c, 0x6a, 0x9b, 0x01, 0x18, + 0x20, 0x09, 0x00, 0x08, 0x04, 0x30, 0xa9, 0x98, 0x08, 0x0c, 0x66, 0xb9, + 0x15, 0x30, 0x08, 0x0c, 0x4c, 0x15, 0x05, 0x18, 0x08, 0x0c, 0x6a, 0xa3, + 0xa8, 0x9c, 0x11, 0x68, 0x90, 0x84, 0x00, 0x05, 0x11, 0x50, 0x90, 0x0e, + 0x08, 0x0c, 0x69, 0x44, 0x11, 0x08, 0xc1, 0x85, 0xb8, 0x00, 0xd0, 0xbc, + 0x01, 0x08, 0xc1, 0x8d, 0x00, 0xd0, 0xa8, 0x68, 0xc0, 0xfc, 0xa8, 0x6a, + 0x08, 0x0c, 0xd3, 0x02, 0x11, 0xe0, 0xa8, 0x9c, 0xd0, 0x94, 0x01, 0x18, + 0xb8, 0xcc, 0xc0, 0x8d, 0xb8, 0xce, 0x20, 0x09, 0x00, 0x03, 0xa8, 0x97, + 0x40, 0x05, 0xa9, 0x9a, 0x00, 0x10, 0xa8, 0x97, 0x40, 0x06, 0x90, 0x0e, + 0x90, 0x85, 0x00, 0x01, 0x20, 0x01, 0x00, 0x30, 0x00, 0x05, 0xa8, 0x97, + 0x40, 0x00, 0xa9, 0x9a, 0x90, 0x06, 0x91, 0x8d, 0x00, 0x01, 0x20, 0x08, + 0x00, 0x05, 0x90, 0x06, 0x00, 0x05, 0xa8, 0x30, 0x20, 0x09, 0x18, 0x0d, + 0x21, 0x0c, 0xd1, 0x8c, 0x01, 0x40, 0x20, 0x08, 0x91, 0x8e, 0xde, 0xad, + 0x11, 0x20, 0x20, 0x21, 0x40, 0x09, 0x08, 0x04, 0x35, 0xb7, 0x90, 0x86, + 0x01, 0x00, 0x70, 0x24, 0x20, 0x58, 0x11, 0x10, 0x08, 0x04, 0x57, 0x29, + 0x90, 0x0e, 0x08, 0x0c, 0x69, 0x44, 0x11, 0x08, 0xc1, 0x85, 0xb8, 0x00, + 0xd0, 0xbc, 0x01, 0x08, 0xc1, 0x8d, 0x08, 0x04, 0x35, 0xb5, 0x08, 0x0c, + 0x57, 0xe9, 0x01, 0x20, 0x20, 0x09, 0x00, 0x07, 0x08, 0x04, 0x35, 0xe7, + 0x7f, 0x84, 0x7a, 0x8c, 0x7b, 0x88, 0x7c, 0x9c, 0x7d, 0x98, 0x08, 0x0c, + 0x4b, 0xe4, 0x11, 0x20, 0x20, 0x09, 0x00, 0x02, 0x08, 0x04, 0x35, 0xe7, + 0x90, 0x0e, 0x21, 0x30, 0x71, 0x26, 0x71, 0x32, 0xa8, 0x60, 0x20, 0xe8, + 0x70, 0x36, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x05, 0x70, 0x2a, 0x20, 0xa0, + 0x08, 0x0c, 0x67, 0x24, 0x19, 0x04, 0x4f, 0x81, 0x08, 0x0c, 0x6a, 0xa3, + 0x01, 0x38, 0x08, 0x0c, 0x6a, 0xab, 0x01, 0x20, 0x08, 0x0c, 0x6a, 0x43, + 0x19, 0x04, 0x4f, 0x81, 0xd7, 0x94, 0x11, 0x10, 0xd7, 0x84, 0x01, 0xa8, + 0xb8, 0xc4, 0x20, 0xe0, 0xb8, 0xc8, 0x90, 0x80, 0x00, 0x06, 0x20, 0x98, + 0x34, 0x00, 0xd7, 0x94, 0x01, 0x98, 0x20, 0xa9, 0x00, 0x08, 0x40, 0x03, + 0x20, 0x98, 0x20, 0xa0, 0x3d, 0x00, 0x20, 0xe0, 0x20, 0xa9, 0x00, 0x02, + 0x08, 0x0c, 0x49, 0xb3, 0x00, 0x80, 0xb8, 0xc4, 0x20, 0xe0, 0xb8, 0xc8, + 0x90, 0x80, 0x00, 0x0a, 0x20, 0x98, 0x34, 0x00, 0x20, 0xa9, 0x00, 0x04, + 0x40, 0x03, 0x20, 0x98, 0x20, 0xa0, 0x3d, 0x00, 0x20, 0xe0, 0x08, 0x0c, + 0x49, 0xb3, 0x91, 0x86, 0x00, 0x7e, 0x01, 0x70, 0x91, 0x86, 0x00, 0x80, + 0x01, 0x58, 0x08, 0x0c, 0x6a, 0xa3, 0x90, 0xc2, 0x00, 0x06, 0x12, 0x10, + 0xc1, 0xfd, 0x00, 0x20, 0x08, 0x0c, 0x69, 0x44, 0x11, 0x08, 0xc1, 0xfd, + 0x41, 0x04, 0xc1, 0xfc, 0xd7, 0x94, 0x05, 0x28, 0xb8, 0xc4, 0x20, 0xe0, + 0xb8, 0xc8, 0x20, 0x60, 0x9c, 0x80, 0x00, 0x00, 0x20, 0x98, 0x20, 0xa9, + 0x00, 0x02, 0x40, 0x03, 0x9c, 0x80, 0x00, 0x03, 0x20, 0x98, 0x20, 0xa9, + 0x00, 0x01, 0x40, 0x05, 0x9c, 0x80, 0x00, 0x04, 0x20, 0x98, 0x34, 0x00, + 0x20, 0xa9, 0x00, 0x02, 0x40, 0x03, 0x20, 0x98, 0x20, 0xa0, 0x3d, 0x00, + 0x20, 0xe0, 0x08, 0x0c, 0x49, 0xa6, 0x9c, 0x80, 0x00, 0x26, 0x20, 0x98, + 0xb8, 0xc4, 0x20, 0xe0, 0x20, 0xa9, 0x00, 0x02, 0x40, 0x03, 0xd7, 0x94, + 0x01, 0x10, 0x96, 0xb0, 0x00, 0x0b, 0x96, 0xb0, 0x00, 0x05, 0x81, 0x08, + 0x08, 0x0c, 0xb2, 0x3d, 0x01, 0x18, 0x91, 0x86, 0x08, 0x00, 0x00, 0x40, + 0xd7, 0x8c, 0x01, 0x20, 0x91, 0x86, 0x08, 0x00, 0x01, 0x70, 0x00, 0x18, + 0x91, 0x86, 0x00, 0x7e, 0x01, 0x50, 0xd7, 0x94, 0x01, 0x18, 0x96, 0x86, + 0x00, 0x20, 0x00, 0x10, 0x96, 0x86, 0x00, 0x28, 0x01, 0x50, 0x08, 0x04, + 0x4f, 0x0a, 0x86, 0xff, 0x11, 0x20, 0x71, 0x24, 0x81, 0x0b, 0x08, 0x04, + 0x35, 0xb5, 0x70, 0x33, 0x00, 0x01, 0x71, 0x22, 0x70, 0x24, 0x96, 0x00, + 0x70, 0x26, 0x77, 0x2e, 0x20, 0x61, 0x18, 0xb8, 0x2c, 0x44, 0xa0, 0x6b, + 0x00, 0x00, 0xa6, 0x7a, 0x70, 0x34, 0xa0, 0x72, 0x70, 0x28, 0xa0, 0x76, + 0xa2, 0x8e, 0xa3, 0x92, 0xa4, 0x96, 0xa5, 0x9a, 0x08, 0x0c, 0x10, 0xf8, + 0x70, 0x07, 0x00, 0x02, 0x70, 0x1f, 0x4f, 0xbd, 0x00, 0x05, 0x70, 0x30, + 0x90, 0x05, 0x11, 0x80, 0x71, 0x20, 0x70, 0x28, 0x20, 0xa0, 0x77, 0x2c, + 0x90, 0x36, 0x70, 0x34, 0x20, 0xe8, 0x20, 0x61, 0x18, 0xb8, 0x2c, 0x44, + 0xa2, 0x8c, 0xa3, 0x90, 0xa4, 0x94, 0xa5, 0x98, 0x08, 0x04, 0x4f, 0x0a, + 0x71, 0x24, 0x81, 0x0b, 0x08, 0x04, 0x35, 0xb5, 0x20, 0x29, 0x00, 0x7e, + 0x79, 0x84, 0x7a, 0x88, 0x7b, 0x8c, 0x7c, 0x98, 0x91, 0x84, 0xff, 0x00, + 0x80, 0x07, 0x90, 0xe2, 0x00, 0x20, 0x0a, 0x04, 0x35, 0xea, 0x95, 0x02, + 0x0a, 0x04, 0x35, 0xea, 0x91, 0x84, 0x00, 0xff, 0x90, 0xe2, 0x00, 0x20, + 0x0a, 0x04, 0x35, 0xea, 0x95, 0x02, 0x0a, 0x04, 0x35, 0xea, 0x92, 0x84, + 0xff, 0x00, 0x80, 0x07, 0x90, 0xe2, 0x00, 0x20, 0x0a, 0x04, 0x35, 0xea, + 0x95, 0x02, 0x0a, 0x04, 0x35, 0xea, 0x92, 0x84, 0x00, 0xff, 0x90, 0xe2, + 0x00, 0x20, 0x0a, 0x04, 0x35, 0xea, 0x95, 0x02, 0x0a, 0x04, 0x35, 0xea, + 0x93, 0x84, 0xff, 0x00, 0x80, 0x07, 0x90, 0xe2, 0x00, 0x20, 0x0a, 0x04, + 0x35, 0xea, 0x95, 0x02, 0x0a, 0x04, 0x35, 0xea, 0x93, 0x84, 0x00, 0xff, + 0x90, 0xe2, 0x00, 0x20, 0x0a, 0x04, 0x35, 0xea, 0x95, 0x02, 0x0a, 0x04, + 0x35, 0xea, 0x94, 0x84, 0xff, 0x00, 0x80, 0x07, 0x90, 0xe2, 0x00, 0x20, + 0x0a, 0x04, 0x35, 0xea, 0x95, 0x02, 0x0a, 0x04, 0x35, 0xea, 0x94, 0x84, + 0x00, 0xff, 0x90, 0xe2, 0x00, 0x20, 0x0a, 0x04, 0x35, 0xea, 0x95, 0x02, + 0x0a, 0x04, 0x35, 0xea, 0x20, 0x61, 0x19, 0x89, 0x61, 0x02, 0x62, 0x06, + 0x63, 0x0a, 0x64, 0x0e, 0x08, 0x04, 0x35, 0xb5, 0x08, 0x0c, 0x4b, 0xe4, + 0x09, 0x04, 0x35, 0xe7, 0x20, 0x09, 0x00, 0x16, 0x7a, 0x8c, 0x7b, 0x88, + 0x7c, 0x9c, 0x7d, 0x98, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x19, 0xaf, 0x60, + 0x08, 0x0c, 0x4c, 0x2d, 0x70, 0x1f, 0x50, 0x41, 0x00, 0x05, 0x20, 0xa9, + 0x00, 0x16, 0x89, 0x6e, 0x8d, 0x6e, 0x8d, 0x6f, 0x9d, 0x84, 0xff, 0xc0, + 0x90, 0x80, 0x00, 0x19, 0x20, 0x98, 0x9d, 0x84, 0x00, 0x3f, 0x20, 0xe0, + 0x20, 0x69, 0x18, 0x77, 0x20, 0xe9, 0x00, 0x01, 0x2d, 0xa0, 0x40, 0x03, + 0x68, 0x00, 0x90, 0x05, 0x09, 0x04, 0x50, 0xa8, 0x68, 0x04, 0x20, 0x08, + 0x91, 0x8c, 0xff, 0xf8, 0x19, 0x04, 0x50, 0xa8, 0x68, 0x0c, 0x90, 0x05, + 0x09, 0x04, 0x50, 0xa8, 0x90, 0x82, 0xff, 0x01, 0x1a, 0x04, 0x50, 0xa8, + 0x68, 0x10, 0x90, 0x82, 0x00, 0x5c, 0x06, 0xf0, 0x68, 0x24, 0x20, 0x08, + 0x90, 0x82, 0x00, 0x08, 0x06, 0xc8, 0x91, 0x82, 0x04, 0x00, 0x16, 0xb0, + 0x00, 0x56, 0x20, 0x29, 0x00, 0x00, 0x08, 0x0c, 0x8e, 0x80, 0x00, 0x5e, + 0x69, 0x44, 0x68, 0x20, 0x91, 0x02, 0x06, 0x60, 0x68, 0x20, 0x90, 0x82, + 0x00, 0x19, 0x16, 0x40, 0x68, 0x28, 0x69, 0x44, 0x81, 0x0c, 0x91, 0x02, + 0x06, 0x18, 0x68, 0x40, 0x90, 0x82, 0x00, 0x0f, 0x12, 0xf8, 0x08, 0x0c, + 0x10, 0x27, 0x29, 0x00, 0x05, 0x90, 0x68, 0x4e, 0x00, 0xe6, 0x20, 0x71, + 0x19, 0x31, 0x00, 0xb6, 0x20, 0x59, 0x00, 0x00, 0x08, 0x0c, 0x8d, 0x3c, + 0x00, 0xbe, 0x00, 0xee, 0x01, 0xe8, 0x08, 0x0c, 0x8a, 0x84, 0x08, 0x0c, + 0x8a, 0xd3, 0x11, 0x60, 0x68, 0x57, 0x00, 0x00, 0x00, 0xc6, 0x6b, 0x10, + 0x20, 0x61, 0x1a, 0x65, 0x63, 0x0a, 0x00, 0xce, 0x08, 0x04, 0x35, 0xb5, + 0x08, 0x04, 0x35, 0xea, 0x08, 0x0c, 0x8a, 0xcc, 0x00, 0xe6, 0x20, 0x71, + 0x19, 0x31, 0x08, 0x0c, 0x8f, 0x00, 0x08, 0x0c, 0x8f, 0x0f, 0x08, 0x0c, + 0x8d, 0x21, 0x00, 0xee, 0x20, 0x01, 0x18, 0x8a, 0x20, 0x4c, 0x08, 0x0c, + 0x10, 0x40, 0x20, 0x01, 0x18, 0x8a, 0x20, 0x03, 0x00, 0x00, 0x08, 0x04, + 0x35, 0xe7, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x92, 0xbf, + 0x08, 0x0c, 0x8a, 0xcc, 0x01, 0x2e, 0x08, 0x04, 0x35, 0xb5, 0x00, 0x06, + 0x08, 0x0c, 0x57, 0xd5, 0xd0, 0xcc, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, + 0x08, 0x0c, 0x57, 0xd9, 0xd0, 0xbc, 0x00, 0x0e, 0x00, 0x05, 0x61, 0x74, + 0x7a, 0x84, 0x63, 0x00, 0x82, 0xff, 0x11, 0x18, 0x79, 0x86, 0x08, 0x04, + 0x35, 0xb5, 0x83, 0xff, 0x19, 0x04, 0x35, 0xea, 0x20, 0x01, 0xff, 0xf0, + 0x92, 0x00, 0x1a, 0x04, 0x35, 0xea, 0x20, 0x19, 0xff, 0xff, 0x60, 0x78, + 0x93, 0x02, 0x92, 0x00, 0x0a, 0x04, 0x35, 0xea, 0x79, 0x86, 0x62, 0x76, + 0x08, 0x04, 0x35, 0xb5, 0x08, 0x0c, 0x57, 0xe9, 0x19, 0x04, 0x35, 0xe7, + 0x7c, 0x88, 0x7d, 0x84, 0x7e, 0x98, 0x7f, 0x8c, 0x08, 0x0c, 0x4b, 0xe4, + 0x09, 0x04, 0x35, 0xe7, 0x90, 0x0e, 0x90, 0x1e, 0x73, 0x26, 0x73, 0x32, + 0xa8, 0x60, 0x20, 0xe8, 0x70, 0x36, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x03, + 0x70, 0x2a, 0x20, 0xa0, 0x91, 0xd8, 0x10, 0x00, 0x2b, 0x5c, 0x8b, 0xff, + 0x01, 0x78, 0x08, 0x0c, 0x6a, 0xa3, 0x01, 0x18, 0x08, 0x0c, 0x6a, 0xab, + 0x11, 0x48, 0x20, 0xa9, 0x00, 0x01, 0xb8, 0x14, 0x40, 0x04, 0xb8, 0x10, + 0x40, 0x04, 0x41, 0x04, 0x93, 0x98, 0x00, 0x03, 0x81, 0x08, 0x91, 0x82, + 0x08, 0x00, 0x01, 0x20, 0x93, 0x86, 0x00, 0x3c, 0x01, 0x70, 0x0c, 0x20, + 0x83, 0xff, 0x11, 0x48, 0x72, 0x24, 0x90, 0x0e, 0x20, 0x01, 0x00, 0x03, + 0x08, 0x0c, 0x93, 0x75, 0x22, 0x08, 0x08, 0x04, 0x35, 0xb5, 0x70, 0x33, + 0x00, 0x01, 0x71, 0x22, 0x70, 0x24, 0x93, 0x00, 0x70, 0x26, 0x20, 0x61, + 0x18, 0xb8, 0x2c, 0x44, 0xa0, 0x6b, 0x00, 0x00, 0xa3, 0x7a, 0x70, 0x28, + 0xa0, 0x76, 0x70, 0x34, 0xa0, 0x72, 0xa4, 0x8e, 0xa5, 0x92, 0xa6, 0x96, + 0xa7, 0x9a, 0x08, 0x0c, 0x10, 0xf8, 0x70, 0x07, 0x00, 0x02, 0x70, 0x1f, + 0x51, 0x4c, 0x00, 0x05, 0x70, 0x30, 0x90, 0x05, 0x11, 0x78, 0x71, 0x20, + 0x70, 0x28, 0x20, 0xa0, 0x90, 0x1e, 0x70, 0x34, 0x20, 0xe8, 0x20, 0x61, + 0x18, 0xb8, 0x2c, 0x44, 0xa4, 0x8c, 0xa5, 0x90, 0xa6, 0x94, 0xa7, 0x98, + 0x08, 0x04, 0x51, 0x0a, 0x72, 0x24, 0x90, 0x0e, 0x20, 0x01, 0x00, 0x03, + 0x08, 0x0c, 0x93, 0x75, 0x22, 0x08, 0x08, 0x04, 0x35, 0xb5, 0x00, 0xf6, + 0x00, 0xe6, 0x08, 0x0c, 0x57, 0xe9, 0x20, 0x09, 0x00, 0x07, 0x19, 0x04, + 0x51, 0xdf, 0x20, 0x71, 0x18, 0x9e, 0x74, 0x5c, 0x84, 0xff, 0x20, 0x09, + 0x00, 0x0e, 0x19, 0x04, 0x51, 0xdf, 0xac, 0x9c, 0xad, 0x98, 0xae, 0xa4, + 0xaf, 0xa0, 0x00, 0x96, 0x08, 0x0c, 0x10, 0x27, 0x20, 0x09, 0x00, 0x02, + 0x09, 0x04, 0x51, 0xdf, 0x29, 0x00, 0x70, 0x5e, 0x90, 0x0e, 0x90, 0x1e, + 0x73, 0x56, 0x73, 0x62, 0xa8, 0x60, 0x70, 0x66, 0xa8, 0x5c, 0x90, 0x80, + 0x00, 0x03, 0x70, 0x5a, 0x20, 0xa0, 0x91, 0xd8, 0x10, 0x00, 0x2b, 0x5c, + 0x8b, 0xff, 0x01, 0x78, 0x08, 0x0c, 0x6a, 0xa3, 0x01, 0x18, 0x08, 0x0c, + 0x6a, 0xab, 0x11, 0x48, 0xb8, 0x14, 0x20, 0xa9, 0x00, 0x01, 0x40, 0x04, + 0xb8, 0x10, 0x40, 0x04, 0x41, 0x04, 0x93, 0x98, 0x00, 0x03, 0x81, 0x08, + 0x91, 0x82, 0x08, 0x00, 0x01, 0x20, 0x93, 0x86, 0x00, 0x3c, 0x01, 0xe8, + 0x0c, 0x20, 0x83, 0xff, 0x11, 0xc0, 0x72, 0x54, 0x90, 0x0e, 0x20, 0x01, + 0x00, 0x03, 0x08, 0x0c, 0x93, 0x75, 0x22, 0x08, 0x00, 0x9e, 0xa8, 0x97, + 0x40, 0x00, 0xa9, 0x9a, 0x71, 0x5c, 0x81, 0xff, 0x09, 0x0c, 0x0d, 0xc5, + 0x21, 0x48, 0x08, 0x0c, 0x10, 0x40, 0x90, 0x06, 0x70, 0x5e, 0x91, 0x8d, + 0x00, 0x01, 0x20, 0x08, 0x04, 0x18, 0x70, 0x63, 0x00, 0x01, 0x71, 0x52, + 0x70, 0x54, 0x93, 0x00, 0x70, 0x56, 0x20, 0x61, 0x18, 0xb9, 0x2c, 0x44, + 0xa3, 0x7a, 0x70, 0x58, 0xa0, 0x76, 0x70, 0x64, 0xa0, 0x72, 0xa4, 0x8e, + 0xa5, 0x92, 0xa6, 0x96, 0xa7, 0x9a, 0xa0, 0x9f, 0x51, 0xeb, 0x00, 0x0e, + 0xa0, 0xa2, 0x08, 0x0c, 0x10, 0xf8, 0x90, 0x06, 0x00, 0x48, 0x00, 0x9e, + 0xa8, 0x97, 0x40, 0x05, 0xa9, 0x9a, 0x90, 0x0e, 0x90, 0x85, 0x00, 0x01, + 0x20, 0x01, 0x00, 0x30, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, + 0xa0, 0xa0, 0x90, 0x4d, 0x09, 0x0c, 0x0d, 0xc5, 0x00, 0xe6, 0x20, 0x71, + 0x18, 0x9e, 0xa0, 0x6c, 0x90, 0x8e, 0x01, 0x00, 0x01, 0x38, 0xa8, 0x7b, + 0x00, 0x30, 0xa8, 0x83, 0x00, 0x00, 0xa8, 0x97, 0x40, 0x02, 0x00, 0xd8, + 0x70, 0x60, 0x90, 0x05, 0x11, 0x58, 0x71, 0x50, 0x70, 0x58, 0x20, 0xa0, + 0x90, 0x1e, 0x70, 0x64, 0x20, 0xe8, 0xa4, 0x8c, 0xa5, 0x90, 0xa6, 0x94, + 0xa7, 0x98, 0x04, 0x28, 0xa8, 0x7b, 0x00, 0x00, 0xa8, 0x83, 0x00, 0x00, + 0xa8, 0x97, 0x40, 0x00, 0x72, 0x54, 0x90, 0x0e, 0x20, 0x01, 0x00, 0x03, + 0x08, 0x0c, 0x93, 0x75, 0xaa, 0x9a, 0x71, 0x5c, 0x81, 0xff, 0x09, 0x0c, + 0x0d, 0xc5, 0x21, 0x48, 0x08, 0x0c, 0x10, 0x40, 0x70, 0x5f, 0x00, 0x00, + 0xa0, 0xa0, 0x20, 0x48, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, + 0x6e, 0x9f, 0x01, 0x2e, 0xa0, 0x9f, 0x00, 0x00, 0xa0, 0xa3, 0x00, 0x00, + 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, 0x91, 0xd8, 0x10, 0x00, 0x2b, 0x5c, + 0x8b, 0xff, 0x01, 0x78, 0x08, 0x0c, 0x6a, 0xa3, 0x01, 0x18, 0x08, 0x0c, + 0x6a, 0xab, 0x11, 0x48, 0xb8, 0x14, 0x20, 0xa9, 0x00, 0x01, 0x40, 0x04, + 0xb8, 0x10, 0x40, 0x04, 0x41, 0x04, 0x93, 0x98, 0x00, 0x03, 0x81, 0x08, + 0x91, 0x82, 0x08, 0x00, 0x01, 0x20, 0x93, 0x86, 0x00, 0x3c, 0x05, 0x18, + 0x0c, 0x20, 0x83, 0xff, 0x11, 0xf0, 0x71, 0x54, 0x81, 0x0c, 0xa9, 0x9a, + 0xa8, 0x97, 0x40, 0x00, 0x71, 0x5c, 0x81, 0xff, 0x09, 0x0c, 0x0d, 0xc5, + 0x21, 0x48, 0x08, 0x0c, 0x10, 0x40, 0x90, 0x06, 0x70, 0x5e, 0x91, 0x8d, + 0x00, 0x01, 0x20, 0x08, 0xa0, 0xa0, 0x20, 0x48, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0x6e, 0x9f, 0x01, 0x2e, 0xa0, 0x9f, 0x00, 0x00, + 0xa0, 0xa3, 0x00, 0x00, 0x00, 0x70, 0x70, 0x63, 0x00, 0x01, 0x71, 0x52, + 0x70, 0x54, 0x93, 0x00, 0x70, 0x56, 0xa3, 0x7a, 0xa4, 0x8e, 0xa5, 0x92, + 0xa6, 0x96, 0xa7, 0x9a, 0x08, 0x0c, 0x10, 0xf8, 0x90, 0x06, 0x00, 0xee, + 0x00, 0x05, 0x00, 0x96, 0xa8, 0x8c, 0x90, 0xbe, 0x70, 0x00, 0x01, 0x48, + 0x90, 0xbe, 0x71, 0x00, 0x01, 0x30, 0x90, 0xbe, 0x72, 0x00, 0x01, 0x18, + 0x00, 0x9e, 0x08, 0x04, 0x35, 0xea, 0xa8, 0x84, 0xa9, 0x88, 0x08, 0x0c, + 0x28, 0x73, 0x15, 0x18, 0x08, 0x0c, 0x66, 0xb9, 0x15, 0x00, 0x71, 0x26, + 0xbe, 0x12, 0xbd, 0x16, 0xae, 0x7c, 0x08, 0x0c, 0x4b, 0xe4, 0x01, 0xc8, + 0x08, 0x0c, 0x4b, 0xe4, 0x01, 0xb0, 0x00, 0x9e, 0xa8, 0x67, 0x00, 0x00, + 0xa8, 0x68, 0xc0, 0xfd, 0xa8, 0x6a, 0xa8, 0x23, 0x00, 0x00, 0xa8, 0x04, + 0x20, 0x48, 0x08, 0x0c, 0xd2, 0x84, 0x11, 0x20, 0x20, 0x09, 0x00, 0x03, + 0x08, 0x04, 0x35, 0xe7, 0x70, 0x07, 0x00, 0x03, 0x70, 0x1f, 0x52, 0xb8, + 0x00, 0x05, 0x00, 0x9e, 0x20, 0x09, 0x00, 0x02, 0x08, 0x04, 0x35, 0xe7, + 0x71, 0x24, 0x08, 0x0c, 0x33, 0x4c, 0xa8, 0x20, 0x90, 0x86, 0x80, 0x01, + 0x11, 0x20, 0x20, 0x09, 0x00, 0x04, 0x08, 0x04, 0x35, 0xe7, 0x29, 0x00, + 0x70, 0x22, 0xa8, 0x04, 0x00, 0x96, 0x20, 0x48, 0x89, 0x06, 0x80, 0x06, + 0x80, 0x07, 0x90, 0xbc, 0x00, 0x3f, 0x90, 0x84, 0xff, 0xc0, 0x00, 0x9e, + 0x90, 0x80, 0x00, 0x02, 0x00, 0x76, 0x00, 0x06, 0x20, 0x98, 0x20, 0xa0, + 0x27, 0xe0, 0x27, 0xe8, 0x20, 0xa9, 0x00, 0x2a, 0x08, 0x0c, 0x0f, 0x8b, + 0xaa, 0x6c, 0xab, 0x70, 0xac, 0x74, 0xad, 0x78, 0x20, 0x61, 0x18, 0xb8, + 0x2c, 0x44, 0xa0, 0x6b, 0x00, 0x00, 0xae, 0x64, 0xaf, 0x8c, 0x97, 0xc6, + 0x70, 0x00, 0x01, 0x18, 0x97, 0xc6, 0x71, 0x00, 0x11, 0x48, 0x96, 0xc2, + 0x00, 0x04, 0x06, 0x00, 0x20, 0x09, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x7e, + 0x08, 0x04, 0x4c, 0x30, 0x97, 0xc6, 0x72, 0x00, 0x11, 0xb8, 0x96, 0xc2, + 0x00, 0x54, 0x02, 0xa0, 0x00, 0x0e, 0x00, 0x7e, 0x20, 0x61, 0x18, 0xb8, + 0x2c, 0x44, 0xa0, 0x76, 0xa7, 0x72, 0xa0, 0x7b, 0x00, 0x2a, 0xa2, 0x8e, + 0xa3, 0x92, 0xa4, 0x96, 0xa5, 0x9a, 0x08, 0x0c, 0x10, 0xf8, 0x70, 0x07, + 0x00, 0x02, 0x70, 0x1f, 0x53, 0x14, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x7e, + 0x08, 0x04, 0x35, 0xea, 0x70, 0x20, 0x20, 0x48, 0xa8, 0x04, 0x20, 0x48, + 0xa8, 0x04, 0x20, 0x48, 0x89, 0x06, 0x80, 0x06, 0x80, 0x07, 0x90, 0xbc, + 0x00, 0x3f, 0x90, 0x84, 0xff, 0xc0, 0x90, 0x80, 0x00, 0x02, 0x20, 0x98, + 0x20, 0xa0, 0x27, 0xe0, 0x27, 0xe8, 0x20, 0xa9, 0x00, 0x2a, 0x08, 0x0c, + 0x0f, 0x8b, 0x21, 0x00, 0x22, 0x38, 0x20, 0x61, 0x18, 0xb8, 0x2c, 0x44, + 0xa2, 0x8c, 0xa3, 0x90, 0xa4, 0x94, 0xa5, 0x98, 0x20, 0x09, 0x00, 0x2a, + 0x08, 0x04, 0x4c, 0x30, 0x81, 0xff, 0x19, 0x04, 0x35, 0xe7, 0x79, 0x8c, + 0x20, 0x01, 0x19, 0x7e, 0x91, 0x8c, 0x80, 0x00, 0x21, 0x02, 0x08, 0x0c, + 0x4b, 0xfb, 0x09, 0x04, 0x35, 0xea, 0x08, 0x0c, 0x6a, 0xa3, 0x01, 0x20, + 0x08, 0x0c, 0x6a, 0xab, 0x19, 0x04, 0x35, 0xea, 0x08, 0x0c, 0x67, 0xeb, + 0x09, 0x04, 0x35, 0xe7, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, + 0x68, 0xb1, 0x01, 0x2e, 0x09, 0x04, 0x35, 0xe7, 0x20, 0x01, 0x19, 0x7e, + 0x20, 0x04, 0xd0, 0xfc, 0x19, 0x04, 0x35, 0xb5, 0x08, 0x04, 0x46, 0x0c, + 0xa9, 0xa0, 0x20, 0x01, 0x19, 0x7e, 0x91, 0x8c, 0x80, 0x00, 0xc1, 0x8d, + 0x21, 0x02, 0x08, 0x0c, 0x4c, 0x08, 0x01, 0xa0, 0x08, 0x0c, 0x6a, 0xa3, + 0x01, 0x18, 0x08, 0x0c, 0x6a, 0xab, 0x11, 0x70, 0x08, 0x0c, 0x67, 0xeb, + 0x20, 0x09, 0x00, 0x02, 0x01, 0x28, 0x08, 0x0c, 0x68, 0xb1, 0x11, 0x70, + 0x20, 0x09, 0x00, 0x03, 0xa8, 0x97, 0x40, 0x05, 0xa9, 0x9a, 0x00, 0x10, + 0xa8, 0x97, 0x40, 0x06, 0x90, 0x0e, 0x90, 0x85, 0x00, 0x01, 0x20, 0x01, + 0x00, 0x30, 0x00, 0x05, 0xa8, 0x97, 0x40, 0x00, 0x20, 0x01, 0x19, 0x7e, + 0x20, 0x04, 0xd0, 0xfc, 0x11, 0x28, 0x08, 0x0c, 0x57, 0xdd, 0x01, 0x10, + 0x90, 0x06, 0x00, 0x18, 0x90, 0x0e, 0x90, 0x85, 0x00, 0x01, 0x20, 0x01, + 0x00, 0x00, 0x00, 0x05, 0x78, 0xa8, 0xd0, 0x8c, 0x11, 0x18, 0xd0, 0x84, + 0x09, 0x04, 0x45, 0x81, 0x08, 0x0c, 0x4c, 0x17, 0x09, 0x04, 0x35, 0xea, + 0x08, 0x0c, 0x4b, 0xe4, 0x11, 0x20, 0x20, 0x09, 0x00, 0x02, 0x08, 0x04, + 0x35, 0xe7, 0x08, 0x0c, 0x6a, 0xa3, 0x01, 0x30, 0x90, 0x8e, 0x00, 0x04, + 0x01, 0x18, 0x90, 0x8e, 0x00, 0x05, 0x15, 0xa0, 0x78, 0xa8, 0xd0, 0x8c, + 0x01, 0x20, 0xb8, 0x00, 0xc0, 0x8c, 0xb8, 0x02, 0x00, 0x28, 0x08, 0x0c, + 0x57, 0xd5, 0xd0, 0xb4, 0x09, 0x04, 0x45, 0xbb, 0x78, 0x84, 0x90, 0x8e, + 0x00, 0x7e, 0x09, 0x04, 0x45, 0xbb, 0x90, 0x8e, 0x00, 0x7f, 0x09, 0x04, + 0x45, 0xbb, 0x90, 0x8e, 0x00, 0x80, 0x09, 0x04, 0x45, 0xbb, 0xb8, 0x00, + 0xd0, 0x8c, 0x19, 0x04, 0x45, 0xbb, 0xa8, 0x67, 0x00, 0x00, 0xa8, 0x68, + 0xc0, 0xfd, 0xa8, 0x6a, 0x08, 0x0c, 0xd2, 0xa3, 0x11, 0x20, 0x20, 0x09, + 0x00, 0x03, 0x08, 0x04, 0x35, 0xe7, 0x70, 0x07, 0x00, 0x03, 0x70, 0x1f, + 0x53, 0xe0, 0x00, 0x05, 0x08, 0x0c, 0x4c, 0x17, 0x09, 0x04, 0x35, 0xea, + 0x08, 0x04, 0x45, 0xbb, 0x08, 0x0c, 0x33, 0xa5, 0x01, 0x08, 0x00, 0x05, + 0x20, 0x09, 0x18, 0x34, 0x21, 0x0c, 0x81, 0xff, 0x01, 0x20, 0x20, 0x09, + 0x00, 0x01, 0x08, 0x04, 0x35, 0xe7, 0x08, 0x0c, 0x57, 0xe9, 0x01, 0x20, + 0x20, 0x09, 0x00, 0x07, 0x08, 0x04, 0x35, 0xe7, 0x08, 0x0c, 0x6a, 0x9b, + 0x01, 0x20, 0x20, 0x09, 0x00, 0x08, 0x08, 0x04, 0x35, 0xe7, 0xb8, 0x9c, + 0xd0, 0xa4, 0x11, 0x18, 0xd0, 0xac, 0x19, 0x04, 0x45, 0xbb, 0x90, 0x06, + 0xa8, 0x66, 0xa8, 0x32, 0xa8, 0x68, 0xc0, 0xfd, 0xa8, 0x6a, 0x08, 0x0c, + 0xd3, 0x02, 0x11, 0x20, 0x20, 0x09, 0x00, 0x03, 0x08, 0x04, 0x35, 0xe7, + 0x70, 0x07, 0x00, 0x03, 0x70, 0x1f, 0x54, 0x19, 0x00, 0x05, 0xa8, 0x30, + 0x90, 0x86, 0x01, 0x00, 0x11, 0x20, 0x20, 0x09, 0x00, 0x04, 0x08, 0x04, + 0x57, 0x29, 0x08, 0x0c, 0x4c, 0x17, 0x09, 0x04, 0x35, 0xea, 0x08, 0x04, + 0x53, 0xb2, 0x81, 0xff, 0x20, 0x09, 0x00, 0x01, 0x19, 0x04, 0x35, 0xe7, + 0x08, 0x0c, 0x57, 0xe9, 0x20, 0x09, 0x00, 0x07, 0x19, 0x04, 0x35, 0xe7, + 0x08, 0x0c, 0x6a, 0x9b, 0x01, 0x20, 0x20, 0x09, 0x00, 0x08, 0x08, 0x04, + 0x35, 0xe7, 0x08, 0x0c, 0x4c, 0x17, 0x09, 0x04, 0x35, 0xea, 0x08, 0x0c, + 0x6a, 0xa3, 0x20, 0x09, 0x00, 0x09, 0x19, 0x04, 0x35, 0xe7, 0x08, 0x0c, + 0x4b, 0xe4, 0x20, 0x09, 0x00, 0x02, 0x09, 0x04, 0x35, 0xe7, 0x90, 0x06, + 0xa8, 0x66, 0xa8, 0x32, 0xa8, 0x68, 0xc0, 0xfd, 0xa8, 0x6a, 0x79, 0x88, + 0xa9, 0x5a, 0x91, 0x94, 0xfd, 0x00, 0x91, 0x8c, 0x00, 0xff, 0x90, 0x06, + 0x82, 0xff, 0x11, 0x28, 0xc0, 0xed, 0xa9, 0x52, 0x79, 0x8c, 0xa9, 0x56, + 0x00, 0x38, 0x92, 0x8e, 0x01, 0x00, 0x19, 0x04, 0x35, 0xea, 0xc0, 0xe5, + 0xa9, 0x52, 0xa9, 0x56, 0xa8, 0x3e, 0x08, 0x0c, 0xd5, 0x55, 0x20, 0x09, + 0x00, 0x03, 0x09, 0x04, 0x35, 0xe7, 0x70, 0x07, 0x00, 0x03, 0x70, 0x1f, + 0x54, 0x70, 0x00, 0x05, 0xa8, 0x30, 0x90, 0x86, 0x01, 0x00, 0x20, 0x09, + 0x00, 0x04, 0x09, 0x04, 0x35, 0xe7, 0x08, 0x04, 0x35, 0xb5, 0x7a, 0xa8, + 0x92, 0x84, 0xc0, 0x00, 0x01, 0x48, 0xd2, 0xec, 0x01, 0xa0, 0x08, 0x0c, + 0x57, 0xe9, 0x11, 0x88, 0x20, 0x09, 0x00, 0x14, 0x08, 0x04, 0x35, 0xe7, + 0xd2, 0xdc, 0x15, 0x78, 0x81, 0xff, 0x20, 0x09, 0x00, 0x01, 0x19, 0x04, + 0x35, 0xe7, 0x08, 0x0c, 0x57, 0xe9, 0x20, 0x09, 0x00, 0x07, 0x19, 0x04, + 0x35, 0xe7, 0xd2, 0xf4, 0x01, 0x38, 0x92, 0x84, 0x50, 0x00, 0xc0, 0xd5, + 0x08, 0x0c, 0x57, 0xaf, 0x08, 0x04, 0x35, 0xb5, 0xd2, 0xfc, 0x01, 0x60, + 0x08, 0x0c, 0x4c, 0x17, 0x09, 0x04, 0x35, 0xea, 0x79, 0x84, 0x92, 0x84, + 0x90, 0x00, 0xc0, 0xd5, 0x08, 0x0c, 0x57, 0x84, 0x08, 0x04, 0x35, 0xb5, + 0x08, 0x0c, 0x4c, 0x17, 0x09, 0x04, 0x35, 0xea, 0xb8, 0x04, 0x90, 0x84, + 0x00, 0xff, 0x90, 0x86, 0x00, 0x06, 0x20, 0x09, 0x00, 0x09, 0x19, 0x04, + 0x55, 0x5f, 0x08, 0x0c, 0x4b, 0xe4, 0x20, 0x09, 0x00, 0x02, 0x09, 0x04, + 0x55, 0x5f, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x1b, 0xaf, 0x60, 0x20, 0x09, + 0x00, 0x08, 0x7a, 0x8c, 0x7b, 0x88, 0x7c, 0x9c, 0x7d, 0x98, 0x08, 0x0c, + 0x4c, 0x2d, 0x70, 0x1f, 0x54, 0xcc, 0x00, 0x05, 0xa8, 0x6c, 0x90, 0x86, + 0x05, 0x00, 0x11, 0x38, 0xa8, 0x70, 0x90, 0x05, 0x11, 0x20, 0xa8, 0x74, + 0x90, 0x84, 0xff, 0x00, 0x01, 0x10, 0x19, 0x04, 0x35, 0xea, 0xa8, 0x66, + 0xa8, 0x32, 0xa8, 0x68, 0xc0, 0xfd, 0xa8, 0x6a, 0x08, 0x0c, 0x4c, 0x17, + 0x11, 0x10, 0x08, 0x04, 0x35, 0xea, 0x20, 0x09, 0x00, 0x43, 0x08, 0x0c, + 0xd5, 0xc1, 0x20, 0x09, 0x00, 0x03, 0x09, 0x04, 0x55, 0x5f, 0x70, 0x07, + 0x00, 0x03, 0x70, 0x1f, 0x54, 0xf0, 0x00, 0x05, 0xa8, 0x30, 0x90, 0x86, + 0x01, 0x00, 0x20, 0x09, 0x00, 0x04, 0x09, 0x04, 0x55, 0x5f, 0x79, 0x84, + 0x7a, 0xa8, 0x92, 0x84, 0x10, 0x00, 0xc0, 0xd5, 0x08, 0x0c, 0x57, 0x84, + 0x08, 0x04, 0x35, 0xb5, 0x00, 0xc6, 0xaa, 0xb0, 0x92, 0x84, 0xc0, 0x00, + 0x01, 0x48, 0xd2, 0xec, 0x01, 0x70, 0x08, 0x0c, 0x57, 0xe9, 0x11, 0x58, + 0x20, 0x09, 0x00, 0x14, 0x08, 0x04, 0x55, 0x4e, 0x20, 0x61, 0x18, 0x00, + 0x08, 0x0c, 0x57, 0xe9, 0x20, 0x09, 0x00, 0x07, 0x15, 0xc8, 0xd2, 0xf4, + 0x01, 0x30, 0x92, 0x84, 0x50, 0x00, 0xc0, 0xd5, 0x08, 0x0c, 0x57, 0xaf, + 0x00, 0x58, 0xd2, 0xfc, 0x01, 0x80, 0x08, 0x0c, 0x4c, 0x15, 0x05, 0x90, + 0xa9, 0x98, 0x92, 0x84, 0x90, 0x00, 0xc0, 0xd5, 0x08, 0x0c, 0x57, 0x84, + 0xa8, 0x7b, 0x00, 0x00, 0xa8, 0x83, 0x00, 0x00, 0xa8, 0x97, 0x40, 0x00, + 0x04, 0x38, 0x08, 0x0c, 0x4c, 0x15, 0x05, 0x10, 0x08, 0x0c, 0x6a, 0xa3, + 0x20, 0x09, 0x00, 0x09, 0x11, 0xb8, 0xa8, 0xc4, 0x90, 0x86, 0x05, 0x00, + 0x11, 0xc8, 0xa8, 0xc8, 0x90, 0x05, 0x11, 0xb0, 0xa8, 0xcc, 0x90, 0x84, + 0xff, 0x00, 0x11, 0x90, 0x08, 0x0c, 0x4c, 0x15, 0x11, 0x08, 0x00, 0x70, + 0x20, 0x09, 0x00, 0x4b, 0x08, 0x0c, 0xd5, 0xc1, 0x20, 0x09, 0x00, 0x03, + 0x01, 0x08, 0x00, 0x78, 0x04, 0x31, 0x19, 0xc0, 0xa8, 0x97, 0x40, 0x05, + 0xa9, 0x9a, 0x00, 0x10, 0xa8, 0x97, 0x40, 0x06, 0x90, 0x0e, 0x90, 0x85, + 0x00, 0x01, 0x20, 0x01, 0x00, 0x30, 0x00, 0xce, 0x00, 0x05, 0x90, 0x06, + 0x0c, 0xe0, 0x7a, 0xa8, 0xd2, 0xdc, 0x09, 0x04, 0x35, 0xe7, 0x00, 0x16, + 0x79, 0x84, 0x92, 0x84, 0x10, 0x00, 0xc0, 0xfd, 0x08, 0x0c, 0x57, 0x84, + 0x00, 0x1e, 0x19, 0x04, 0x35, 0xe7, 0x08, 0x04, 0x35, 0xb5, 0x00, 0xf6, + 0x2d, 0x78, 0xaa, 0xb0, 0x00, 0x21, 0x00, 0xfe, 0x00, 0x05, 0xaa, 0xb0, + 0xc2, 0xd5, 0xd2, 0xdc, 0x01, 0x50, 0x00, 0x16, 0xa9, 0x98, 0x92, 0x84, + 0x14, 0x00, 0xc0, 0xfd, 0x08, 0x0c, 0x57, 0x84, 0x00, 0x1e, 0x90, 0x85, + 0x00, 0x01, 0x00, 0x05, 0x81, 0xff, 0x01, 0x20, 0x20, 0x09, 0x00, 0x01, + 0x08, 0x04, 0x35, 0xe7, 0x08, 0x0c, 0x57, 0xe9, 0x01, 0x20, 0x20, 0x09, + 0x00, 0x07, 0x08, 0x04, 0x35, 0xe7, 0x79, 0x84, 0x7e, 0xa8, 0x96, 0xb4, + 0x00, 0xff, 0x08, 0x0c, 0x67, 0x24, 0x19, 0x04, 0x35, 0xea, 0x91, 0x86, + 0x00, 0x7f, 0x01, 0x38, 0x08, 0x0c, 0x6a, 0xa3, 0x01, 0x20, 0x20, 0x09, + 0x00, 0x09, 0x08, 0x04, 0x35, 0xe7, 0x08, 0x0c, 0x4b, 0xe4, 0x11, 0x20, + 0x20, 0x09, 0x00, 0x02, 0x08, 0x04, 0x35, 0xe7, 0xa8, 0x67, 0x00, 0x00, + 0xa8, 0x68, 0xc0, 0xfd, 0xa8, 0x6a, 0x20, 0x01, 0x01, 0x00, 0x80, 0x07, + 0xa8, 0x0a, 0x08, 0x0c, 0xd2, 0xbd, 0x11, 0x20, 0x20, 0x09, 0x00, 0x03, + 0x08, 0x04, 0x35, 0xe7, 0x70, 0x07, 0x00, 0x03, 0x70, 0x1f, 0x55, 0xbf, + 0x00, 0x05, 0xa8, 0x08, 0x80, 0x07, 0x90, 0x86, 0x01, 0x00, 0x11, 0x20, + 0x20, 0x09, 0x00, 0x04, 0x08, 0x04, 0x35, 0xe7, 0xa8, 0xe0, 0xa8, 0x66, + 0xa8, 0x10, 0x80, 0x07, 0x90, 0x84, 0x00, 0xff, 0x80, 0x0c, 0xa8, 0x14, + 0x80, 0x07, 0x90, 0x84, 0x00, 0xff, 0x80, 0x04, 0x90, 0x80, 0x00, 0x02, + 0x91, 0x08, 0x89, 0x06, 0x80, 0x06, 0x80, 0x07, 0x90, 0xbc, 0x00, 0x3f, + 0x90, 0x84, 0xff, 0xc0, 0x90, 0x80, 0x00, 0x04, 0x7a, 0x8c, 0x7b, 0x88, + 0x7c, 0x9c, 0x7d, 0x98, 0x08, 0x04, 0x4c, 0x30, 0x08, 0x0c, 0x4b, 0xe4, + 0x11, 0x20, 0x20, 0x09, 0x00, 0x02, 0x08, 0x04, 0x35, 0xe7, 0x79, 0x84, + 0x91, 0x94, 0xff, 0x00, 0x91, 0x8c, 0x00, 0xff, 0x82, 0x17, 0x82, 0xff, + 0x11, 0x18, 0x70, 0x23, 0x19, 0xb4, 0x00, 0x40, 0x92, 0xc6, 0x00, 0x01, + 0x11, 0x18, 0x70, 0x23, 0x19, 0xce, 0x00, 0x10, 0x08, 0x04, 0x35, 0xea, + 0x20, 0x09, 0x00, 0x1a, 0x7a, 0x8c, 0x7b, 0x88, 0x7c, 0x9c, 0x7d, 0x98, + 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x19, 0xaf, 0x60, 0x08, 0x0c, 0x4c, 0x2d, + 0x70, 0x1f, 0x56, 0x0f, 0x00, 0x05, 0x20, 0x01, 0x18, 0x2e, 0x20, 0x03, + 0x00, 0x01, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x19, 0x20, 0x98, 0xa8, 0x60, + 0x20, 0xe0, 0x20, 0xa9, 0x00, 0x1a, 0x70, 0x20, 0x20, 0xa0, 0x20, 0xe9, + 0x00, 0x01, 0x40, 0x03, 0x08, 0x04, 0x35, 0xb5, 0x08, 0x0c, 0x4b, 0xe4, + 0x11, 0x20, 0x20, 0x09, 0x00, 0x02, 0x08, 0x04, 0x35, 0xe7, 0x79, 0x84, + 0x91, 0x94, 0xff, 0x00, 0x91, 0x8c, 0x00, 0xff, 0x82, 0x17, 0x82, 0xff, + 0x11, 0x18, 0x20, 0x99, 0x19, 0xb4, 0x00, 0x40, 0x92, 0xc6, 0x00, 0x01, + 0x11, 0x18, 0x20, 0x99, 0x19, 0xce, 0x00, 0x10, 0x08, 0x04, 0x35, 0xea, + 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x19, 0x20, 0xa0, 0xa8, 0x60, 0x20, 0xe8, + 0x20, 0xa9, 0x00, 0x1a, 0x20, 0xe1, 0x00, 0x01, 0x40, 0x03, 0x20, 0x09, + 0x00, 0x1a, 0x7a, 0x8c, 0x7b, 0x88, 0x7c, 0x9c, 0x7d, 0x98, 0xa8, 0x5c, + 0x90, 0x80, 0x00, 0x19, 0xaf, 0x60, 0x08, 0x04, 0x4c, 0x30, 0x78, 0x84, + 0x90, 0x8a, 0x10, 0x00, 0x1a, 0x04, 0x35, 0xea, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x80, 0x03, 0x80, 0x0b, 0x81, 0x0b, 0x91, 0x08, 0x00, 0xc6, + 0x20, 0x61, 0x19, 0xfb, 0x61, 0x4a, 0x00, 0xce, 0x01, 0x2e, 0x08, 0x04, + 0x35, 0xb5, 0x00, 0xc6, 0x08, 0x0c, 0x76, 0x37, 0x11, 0x60, 0x08, 0x0c, + 0x79, 0x32, 0x08, 0x0c, 0x61, 0x2e, 0x90, 0x85, 0x00, 0x01, 0x08, 0x0c, + 0x76, 0x7b, 0x08, 0x0c, 0x75, 0x63, 0x08, 0x0c, 0x0d, 0xc5, 0x20, 0x61, + 0x18, 0x00, 0x60, 0x30, 0xc0, 0x9d, 0x60, 0x32, 0x08, 0x0c, 0x5f, 0xed, + 0x00, 0xce, 0x00, 0x05, 0x00, 0xc6, 0x20, 0x01, 0x18, 0x00, 0x20, 0x04, + 0x90, 0x8e, 0x00, 0x00, 0x09, 0x04, 0x35, 0xe7, 0x78, 0x84, 0x90, 0x05, + 0x01, 0x88, 0x78, 0x88, 0x20, 0x61, 0x19, 0x9c, 0x2c, 0x0c, 0x20, 0x62, + 0x08, 0x0c, 0x2c, 0x49, 0x01, 0xa0, 0x08, 0x0c, 0x2c, 0x51, 0x01, 0x88, + 0x08, 0x0c, 0x2c, 0x59, 0x01, 0x70, 0x21, 0x62, 0x08, 0x04, 0x35, 0xea, + 0x20, 0x61, 0x01, 0x00, 0x60, 0x38, 0x90, 0x86, 0x00, 0x07, 0x11, 0x18, + 0x20, 0x09, 0x00, 0x01, 0x00, 0x10, 0x20, 0x09, 0x00, 0x00, 0x78, 0x84, + 0x90, 0x86, 0x00, 0x02, 0x15, 0x68, 0x20, 0x61, 0x01, 0x00, 0x60, 0x28, + 0xc0, 0x9c, 0x60, 0x2a, 0x00, 0x26, 0x20, 0x11, 0x00, 0x03, 0x08, 0x0c, + 0xaa, 0xbf, 0x20, 0x11, 0x00, 0x02, 0x08, 0x0c, 0xaa, 0xc9, 0x00, 0x2e, + 0x08, 0x0c, 0xa9, 0xd3, 0x00, 0x36, 0x90, 0x1e, 0x08, 0x0c, 0xaa, 0x49, + 0x00, 0x3e, 0x60, 0xe3, 0x00, 0x00, 0x08, 0x0c, 0xf0, 0x7f, 0x08, 0x0c, + 0xf0, 0x9a, 0x90, 0x85, 0x00, 0x01, 0x08, 0x0c, 0x76, 0x7b, 0x90, 0x06, + 0x08, 0x0c, 0x2d, 0x39, 0x20, 0x01, 0x18, 0x00, 0x20, 0x03, 0x00, 0x04, + 0x20, 0x01, 0x19, 0xa8, 0x20, 0x03, 0x00, 0x00, 0x60, 0x27, 0x00, 0x08, + 0x00, 0xce, 0x08, 0x04, 0x35, 0xb5, 0x81, 0xff, 0x01, 0x20, 0x20, 0x09, + 0x00, 0x01, 0x08, 0x04, 0x35, 0xe7, 0x08, 0x0c, 0x57, 0xe9, 0x01, 0x20, + 0x20, 0x09, 0x00, 0x07, 0x08, 0x04, 0x35, 0xe7, 0x79, 0x84, 0x7e, 0xa8, + 0x96, 0xb4, 0x00, 0xff, 0x08, 0x0c, 0x67, 0x24, 0x19, 0x04, 0x35, 0xea, + 0x91, 0x86, 0x00, 0x7f, 0x01, 0x38, 0x08, 0x0c, 0x6a, 0xa3, 0x01, 0x20, + 0x20, 0x09, 0x00, 0x09, 0x08, 0x04, 0x35, 0xe7, 0x08, 0x0c, 0x4b, 0xe4, + 0x11, 0x20, 0x20, 0x09, 0x00, 0x02, 0x08, 0x04, 0x35, 0xe7, 0xa8, 0x67, + 0x00, 0x00, 0xa8, 0x68, 0xc0, 0xfd, 0xa8, 0x6a, 0x08, 0x0c, 0xd2, 0xc0, + 0x11, 0x20, 0x20, 0x09, 0x00, 0x03, 0x08, 0x04, 0x35, 0xe7, 0x70, 0x07, + 0x00, 0x03, 0x70, 0x1f, 0x57, 0x12, 0x00, 0x05, 0xa8, 0x30, 0x90, 0x86, + 0x01, 0x00, 0x11, 0x20, 0x20, 0x09, 0x00, 0x04, 0x08, 0x04, 0x35, 0xe7, + 0xa8, 0xe0, 0xa8, 0x66, 0xa8, 0x34, 0x80, 0x07, 0x80, 0x0c, 0xa8, 0x5c, + 0x90, 0x80, 0x00, 0x0c, 0x7a, 0x8c, 0x7b, 0x88, 0x7c, 0x9c, 0x7d, 0x98, + 0xaf, 0x60, 0x08, 0x04, 0x4c, 0x30, 0xa8, 0x98, 0x90, 0x86, 0x00, 0x0d, + 0x19, 0x04, 0x35, 0xe7, 0x20, 0x21, 0x40, 0x05, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x0e, 0x04, 0x57, 0x36, 0x00, 0x10, 0x01, 0x2e, 0x0c, 0xc0, + 0x7c, 0x36, 0x94, 0x86, 0x40, 0x00, 0x01, 0x18, 0x78, 0x33, 0x00, 0x11, + 0x00, 0x10, 0x78, 0x33, 0x00, 0x10, 0x78, 0x83, 0x40, 0x05, 0xa9, 0x98, + 0x79, 0x86, 0xa9, 0xa4, 0x79, 0x9a, 0xa9, 0xa8, 0x79, 0x9e, 0x08, 0x0c, + 0x4c, 0x20, 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, 0x00, 0x89, 0x20, 0x04, + 0xd0, 0x84, 0x19, 0x0c, 0x11, 0xaa, 0x70, 0x07, 0x00, 0x01, 0x20, 0x91, + 0x50, 0x00, 0x70, 0x0f, 0x00, 0x00, 0x01, 0x2e, 0x00, 0x05, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x00, 0xc6, 0x20, 0x61, 0x19, 0xfb, 0x79, 0x84, + 0x61, 0x5a, 0x61, 0x56, 0x60, 0x5f, 0x00, 0x00, 0x60, 0x53, 0x00, 0x09, + 0x78, 0x98, 0x60, 0x72, 0x78, 0x9c, 0x60, 0x6e, 0x78, 0x88, 0x60, 0x6a, + 0x78, 0x8c, 0x60, 0x66, 0x20, 0x01, 0x1a, 0x0b, 0x20, 0x44, 0x20, 0x01, + 0x1a, 0x12, 0xa0, 0x76, 0xa0, 0x60, 0xa0, 0x72, 0xa0, 0x7b, 0x00, 0x01, + 0xa0, 0x7f, 0x00, 0x02, 0xa0, 0x6b, 0x00, 0x00, 0xa0, 0x9f, 0x00, 0x00, + 0x00, 0xce, 0x01, 0x2e, 0x08, 0x04, 0x35, 0xb5, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x00, 0xb6, 0x00, 0xc6, 0x90, 0xe4, 0xc0, 0x00, 0x01, 0x68, + 0x00, 0x06, 0xd0, 0xd4, 0x01, 0x30, 0x00, 0x36, 0x20, 0x19, 0x00, 0x29, + 0x08, 0x0c, 0x33, 0x6a, 0x00, 0x3e, 0x08, 0x0c, 0xd1, 0x25, 0x00, 0x0e, + 0x11, 0x98, 0xd0, 0xe4, 0x01, 0x60, 0x91, 0x80, 0x10, 0x00, 0x20, 0x04, + 0x90, 0x5d, 0x01, 0x60, 0x08, 0x0c, 0x61, 0x48, 0x08, 0x0c, 0xb2, 0x3d, + 0x01, 0x10, 0xb8, 0x17, 0x00, 0x00, 0x90, 0x06, 0x00, 0xce, 0x00, 0xbe, + 0x01, 0x2e, 0x00, 0x05, 0x90, 0x85, 0x00, 0x01, 0x0c, 0xc8, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x01, 0x56, 0x20, 0x10, 0x90, 0x0e, 0x20, 0xa9, + 0x08, 0x00, 0x00, 0x16, 0x91, 0x80, 0x10, 0x00, 0x20, 0x04, 0x90, 0x05, + 0x01, 0x88, 0x91, 0x86, 0x00, 0x7e, 0x01, 0x70, 0x91, 0x86, 0x00, 0x7f, + 0x01, 0x58, 0x91, 0x86, 0x00, 0x80, 0x01, 0x40, 0x91, 0x86, 0x00, 0xff, + 0x01, 0x28, 0x00, 0x26, 0x22, 0x00, 0x08, 0x0c, 0x57, 0x84, 0x00, 0x2e, + 0x00, 0x1e, 0x81, 0x08, 0x1f, 0x04, 0x57, 0xb7, 0x01, 0x5e, 0x01, 0x2e, + 0x00, 0x05, 0x20, 0x01, 0x18, 0x48, 0x20, 0x04, 0x00, 0x05, 0x20, 0x01, + 0x18, 0x67, 0x20, 0x04, 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0x18, 0x10, + 0x20, 0x04, 0xd0, 0xd4, 0x00, 0x0e, 0x00, 0x05, 0x20, 0x01, 0x18, 0x0e, + 0x20, 0x04, 0xd0, 0xb4, 0x00, 0x05, 0x20, 0x01, 0x18, 0x00, 0x20, 0x04, + 0x90, 0x86, 0x00, 0x03, 0x00, 0x05, 0x00, 0x16, 0x00, 0xe6, 0x20, 0x71, + 0x18, 0x9e, 0x71, 0x08, 0x91, 0x0d, 0x71, 0x0a, 0x00, 0xee, 0x00, 0x1e, + 0x00, 0x05, 0x79, 0xa4, 0x81, 0xff, 0x09, 0x04, 0x35, 0xea, 0x91, 0x82, + 0x00, 0x81, 0x1a, 0x04, 0x35, 0xea, 0x81, 0x0c, 0x00, 0x16, 0x08, 0x0c, + 0x4b, 0xe4, 0x01, 0x70, 0x08, 0x0c, 0x0f, 0x16, 0x21, 0x00, 0x22, 0x38, + 0x7d, 0x84, 0x7c, 0x88, 0x7b, 0x8c, 0x7a, 0x90, 0x00, 0x1e, 0x08, 0x0c, + 0x4c, 0x2d, 0x70, 0x1f, 0x58, 0x19, 0x00, 0x05, 0x00, 0x1e, 0x20, 0x09, + 0x00, 0x02, 0x08, 0x04, 0x35, 0xe7, 0x20, 0x79, 0x00, 0x00, 0x7d, 0x94, + 0x7c, 0x98, 0x7b, 0xa8, 0x7a, 0xac, 0x79, 0xa4, 0x81, 0x0c, 0x20, 0x61, + 0x18, 0xb8, 0x2c, 0x44, 0xa7, 0x70, 0xa0, 0x74, 0x20, 0x71, 0x18, 0x9e, + 0x08, 0x0c, 0x4c, 0x30, 0x70, 0x1f, 0x58, 0x2d, 0x00, 0x05, 0x20, 0x61, + 0x18, 0xb8, 0x2c, 0x44, 0x00, 0x16, 0x00, 0x26, 0xa2, 0x70, 0xa1, 0x74, + 0x08, 0x0c, 0x0f, 0x1e, 0x00, 0x2e, 0x00, 0x1e, 0x08, 0x0c, 0x0f, 0xcb, + 0x90, 0x06, 0xa8, 0x02, 0xa8, 0x06, 0x08, 0x04, 0x35, 0xb5, 0x01, 0x26, + 0x01, 0x56, 0x01, 0x36, 0x01, 0x46, 0x01, 0xc6, 0x01, 0xd6, 0x00, 0xc6, + 0x00, 0xd6, 0x00, 0xe6, 0x00, 0xf6, 0x20, 0x61, 0x01, 0x00, 0x20, 0x69, + 0x02, 0x00, 0x20, 0x71, 0x18, 0x00, 0x60, 0x44, 0xd0, 0xa4, 0x11, 0xe8, + 0xd0, 0x84, 0x01, 0x18, 0x08, 0x0c, 0x59, 0xed, 0x00, 0x68, 0xd0, 0x8c, + 0x01, 0x18, 0x08, 0x0c, 0x58, 0xf6, 0x00, 0x40, 0xd0, 0x94, 0x01, 0x18, + 0x08, 0x0c, 0x58, 0xc6, 0x00, 0x18, 0xd0, 0x9c, 0x01, 0x08, 0x00, 0x99, + 0x00, 0xfe, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x01, 0xde, 0x01, 0xce, + 0x01, 0x4e, 0x01, 0x3e, 0x01, 0x5e, 0x01, 0x2e, 0x00, 0x05, 0x00, 0x16, + 0x61, 0x28, 0xd1, 0x9c, 0x11, 0x10, 0xc1, 0x9d, 0x61, 0x2a, 0x00, 0x1e, + 0x0c, 0x68, 0x70, 0x30, 0xd0, 0x9c, 0x11, 0x20, 0x60, 0x04, 0x90, 0x85, + 0x00, 0x02, 0x60, 0x06, 0x70, 0x98, 0x90, 0x05, 0x01, 0x20, 0x70, 0x9b, + 0x00, 0x00, 0x70, 0x93, 0x00, 0x00, 0x62, 0x4c, 0x92, 0x86, 0xf0, 0xf0, + 0x11, 0x50, 0x60, 0x48, 0x90, 0x86, 0xf0, 0xf0, 0x01, 0x30, 0x62, 0x4a, + 0x60, 0x43, 0x00, 0x90, 0x60, 0x43, 0x00, 0x10, 0x04, 0x90, 0x92, 0x94, + 0xff, 0x00, 0x92, 0x96, 0xf7, 0x00, 0x01, 0x78, 0x71, 0x38, 0xd1, 0xa4, + 0x11, 0x60, 0x62, 0x40, 0x92, 0x95, 0x01, 0x00, 0x62, 0x42, 0x92, 0x94, + 0x00, 0x10, 0x01, 0x28, 0x20, 0x09, 0x00, 0xf7, 0x08, 0x0c, 0x60, 0xaa, + 0x00, 0xf0, 0x60, 0x40, 0x90, 0x84, 0x00, 0x10, 0x90, 0x85, 0x01, 0x40, + 0x60, 0x42, 0x60, 0x43, 0x00, 0x00, 0x70, 0x87, 0x00, 0x00, 0x70, 0xa3, + 0x00, 0x01, 0x70, 0xc7, 0x00, 0x00, 0x70, 0xdf, 0x00, 0x00, 0x20, 0x09, + 0x1c, 0x80, 0x20, 0x0b, 0x00, 0x00, 0x70, 0x97, 0x00, 0x00, 0x70, 0x8b, + 0x00, 0x0f, 0x20, 0x09, 0x00, 0x0f, 0x20, 0x11, 0x5f, 0x90, 0x08, 0x0c, + 0x88, 0xd5, 0x00, 0x05, 0x20, 0x01, 0x18, 0x69, 0x20, 0x04, 0xd0, 0x8c, + 0x01, 0x10, 0x70, 0x5f, 0xff, 0xff, 0x70, 0x88, 0x90, 0x05, 0x15, 0x28, + 0x20, 0x11, 0x5f, 0x90, 0x08, 0x0c, 0x88, 0x3d, 0x60, 0x40, 0x90, 0x94, + 0x00, 0x10, 0x92, 0x85, 0x00, 0x20, 0x60, 0x42, 0x20, 0xa9, 0x00, 0xc8, + 0x60, 0x44, 0xd0, 0x8c, 0x11, 0x68, 0x1f, 0x04, 0x58, 0xdc, 0x62, 0x42, + 0x70, 0x9b, 0x00, 0x00, 0x60, 0x40, 0x90, 0x94, 0x00, 0x10, 0x92, 0x85, + 0x00, 0x80, 0x60, 0x42, 0x62, 0x42, 0x00, 0x48, 0x62, 0x42, 0x70, 0x9b, + 0x00, 0x00, 0x70, 0x8f, 0x00, 0x00, 0x90, 0x06, 0x08, 0x0c, 0x61, 0x33, + 0x00, 0x00, 0x00, 0x05, 0x70, 0x8c, 0x90, 0x8a, 0x00, 0x03, 0x1a, 0x0c, + 0x0d, 0xc5, 0x00, 0x0b, 0x00, 0x05, 0x59, 0x00, 0x59, 0x51, 0x59, 0xec, + 0x00, 0xf6, 0x00, 0x16, 0x69, 0x00, 0x91, 0x8c, 0x08, 0x00, 0x70, 0x8f, + 0x00, 0x01, 0x20, 0x01, 0x01, 0x5d, 0x20, 0x03, 0x00, 0x00, 0x68, 0x03, + 0x00, 0xfc, 0x20, 0xa9, 0x00, 0x04, 0x68, 0x00, 0x90, 0x84, 0x00, 0xfc, + 0x01, 0x20, 0x1f, 0x04, 0x59, 0x0f, 0x08, 0x0c, 0x0d, 0xc5, 0x68, 0xa0, + 0x68, 0xa2, 0x68, 0x9c, 0x68, 0x9e, 0x68, 0x98, 0x68, 0x9a, 0xa0, 0x01, + 0x91, 0x8d, 0x16, 0x00, 0x69, 0x02, 0x00, 0x1e, 0x68, 0x37, 0x00, 0x20, + 0x08, 0x0c, 0x61, 0x0f, 0x20, 0x79, 0x1c, 0x00, 0x78, 0x33, 0x11, 0x01, + 0x78, 0x37, 0x00, 0x00, 0x20, 0xe1, 0x00, 0x01, 0x20, 0x99, 0x18, 0x05, + 0x20, 0xe9, 0x00, 0x01, 0x20, 0xa1, 0x1c, 0x0e, 0x20, 0xa9, 0x00, 0x04, + 0x40, 0x03, 0x08, 0x0c, 0xaf, 0x8e, 0x20, 0xe1, 0x00, 0x01, 0x20, 0x99, + 0x1c, 0x00, 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, 0x02, 0x40, 0x20, 0xa9, + 0x00, 0x14, 0x40, 0x03, 0x60, 0xc3, 0x00, 0x0c, 0x60, 0x0f, 0x00, 0x00, + 0x08, 0x0c, 0x5f, 0xc1, 0x00, 0xfe, 0x90, 0x06, 0x70, 0x92, 0x60, 0x43, + 0x00, 0x08, 0x60, 0x42, 0x00, 0x05, 0x00, 0xf6, 0x70, 0x90, 0x70, 0x93, + 0x00, 0x00, 0x90, 0x25, 0x09, 0x04, 0x59, 0xc9, 0x60, 0x20, 0xd0, 0xb4, + 0x19, 0x04, 0x59, 0xc7, 0x71, 0xa0, 0x81, 0xff, 0x09, 0x04, 0x59, 0xb5, + 0x94, 0x86, 0x00, 0x0c, 0x19, 0x04, 0x59, 0xc2, 0x94, 0x80, 0x00, 0x18, + 0x80, 0x04, 0x20, 0xa8, 0x08, 0x0c, 0x61, 0x08, 0x20, 0x11, 0x02, 0x60, + 0x20, 0x19, 0x1c, 0x00, 0x22, 0x0c, 0x23, 0x04, 0x91, 0x06, 0x11, 0xe8, + 0x82, 0x10, 0x83, 0x18, 0x1f, 0x04, 0x59, 0x6e, 0x60, 0x43, 0x00, 0x04, + 0x20, 0x61, 0x01, 0x40, 0x60, 0x5b, 0xbc, 0x94, 0x60, 0x5f, 0xf0, 0xf0, + 0x20, 0x61, 0x01, 0x00, 0x60, 0x43, 0x00, 0x06, 0x70, 0x8f, 0x00, 0x02, + 0x70, 0x9b, 0x00, 0x02, 0x20, 0x09, 0x07, 0xd0, 0x20, 0x11, 0x5f, 0x97, + 0x08, 0x0c, 0x88, 0xd5, 0x08, 0x0c, 0x61, 0x0f, 0x04, 0xc0, 0x08, 0x0c, + 0x61, 0x08, 0x20, 0x79, 0x02, 0x60, 0x79, 0x30, 0x91, 0x8e, 0x11, 0x01, + 0x15, 0x58, 0x78, 0x34, 0x90, 0x05, 0x15, 0x40, 0x79, 0x00, 0x91, 0x8c, + 0x00, 0xff, 0x11, 0x18, 0x78, 0x04, 0x90, 0x05, 0x01, 0x90, 0x08, 0x0c, + 0x61, 0x08, 0x20, 0x11, 0x02, 0x6e, 0x20, 0x19, 0x18, 0x05, 0x20, 0xa9, + 0x00, 0x04, 0x22, 0x0c, 0x23, 0x04, 0x91, 0x02, 0x02, 0x30, 0x11, 0xa0, + 0x82, 0x10, 0x83, 0x18, 0x1f, 0x04, 0x59, 0xa9, 0x00, 0x78, 0x70, 0xa3, + 0x00, 0x00, 0x08, 0x0c, 0x61, 0x08, 0x20, 0xe1, 0x00, 0x00, 0x20, 0x99, + 0x02, 0x60, 0x20, 0xe9, 0x00, 0x01, 0x20, 0xa1, 0x1c, 0x00, 0x20, 0xa9, + 0x00, 0x14, 0x40, 0x03, 0x60, 0x43, 0x00, 0x08, 0x60, 0x43, 0x00, 0x00, + 0x00, 0x10, 0x00, 0xfe, 0x00, 0x05, 0x60, 0x40, 0x90, 0x85, 0x01, 0x00, + 0x60, 0x42, 0x60, 0x20, 0xd0, 0xb4, 0x1d, 0xb8, 0x08, 0x0c, 0xaf, 0x8e, + 0x20, 0xe1, 0x00, 0x01, 0x20, 0x99, 0x1c, 0x00, 0x20, 0xe9, 0x00, 0x00, + 0x20, 0xa1, 0x02, 0x40, 0x20, 0xa9, 0x00, 0x14, 0x40, 0x03, 0x60, 0xc3, + 0x00, 0x0c, 0x20, 0x11, 0x19, 0xf2, 0x20, 0x13, 0x00, 0x00, 0x70, 0x93, + 0x00, 0x00, 0x60, 0xa3, 0x00, 0x56, 0x60, 0xa7, 0x95, 0x75, 0x08, 0x0c, + 0xa6, 0xe0, 0x08, 0xd8, 0x00, 0x05, 0x70, 0x98, 0x90, 0x8a, 0x00, 0x1d, + 0x1a, 0x0c, 0x0d, 0xc5, 0x00, 0x0b, 0x00, 0x05, 0x5a, 0x1e, 0x5a, 0x31, + 0x5a, 0x5a, 0x5a, 0x7a, 0x5a, 0xa0, 0x5a, 0xcf, 0x5a, 0xf5, 0x5b, 0x2d, + 0x5b, 0x53, 0x5b, 0x81, 0x5b, 0xbc, 0x5b, 0xf4, 0x5c, 0x12, 0x5c, 0x3d, + 0x5c, 0x5f, 0x5c, 0x7a, 0x5c, 0x84, 0x5c, 0xb8, 0x5c, 0xde, 0x5d, 0x0d, + 0x5d, 0x33, 0x5d, 0x6b, 0x5d, 0xaf, 0x5d, 0xec, 0x5e, 0x0d, 0x5e, 0x66, + 0x5e, 0x88, 0x5e, 0xb6, 0x5e, 0xb6, 0x00, 0xc6, 0x20, 0x61, 0x18, 0x00, + 0x60, 0x03, 0x00, 0x07, 0x20, 0x61, 0x01, 0x00, 0x60, 0x04, 0x90, 0x84, + 0xff, 0xf9, 0x60, 0x06, 0x00, 0xce, 0x00, 0x05, 0x20, 0x61, 0x01, 0x40, + 0x60, 0x5b, 0xbc, 0x94, 0x60, 0x5f, 0xf0, 0xf0, 0x20, 0x61, 0x01, 0x00, + 0x60, 0x43, 0x00, 0x02, 0x70, 0x9b, 0x00, 0x01, 0x20, 0x09, 0x07, 0xd0, + 0x20, 0x11, 0x5f, 0x97, 0x08, 0x0c, 0x88, 0xd5, 0x00, 0x05, 0x00, 0xf6, + 0x70, 0x90, 0x90, 0x86, 0x00, 0x14, 0x15, 0x10, 0x60, 0x42, 0x60, 0x20, + 0xd0, 0xb4, 0x11, 0xf0, 0x08, 0x0c, 0x61, 0x08, 0x20, 0x79, 0x02, 0x60, + 0x7a, 0x30, 0x92, 0x96, 0x11, 0x02, 0x11, 0xa0, 0x78, 0x34, 0x90, 0x05, + 0x11, 0x88, 0x7a, 0x38, 0xd2, 0xfc, 0x01, 0x28, 0x70, 0xc4, 0x90, 0x05, + 0x11, 0x10, 0x70, 0xc7, 0x00, 0x01, 0x20, 0x11, 0x5f, 0x97, 0x08, 0x0c, + 0x88, 0x3d, 0x70, 0x9b, 0x00, 0x10, 0x08, 0x0c, 0x5c, 0x84, 0x00, 0x10, + 0x70, 0x93, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, 0x70, 0x9b, + 0x00, 0x03, 0x60, 0x43, 0x00, 0x04, 0x20, 0x11, 0x5f, 0x97, 0x08, 0x0c, + 0x88, 0x3d, 0x08, 0x0c, 0x60, 0x8c, 0x20, 0x79, 0x02, 0x40, 0x78, 0x33, + 0x11, 0x02, 0x78, 0x37, 0x00, 0x00, 0x20, 0xa9, 0x00, 0x08, 0x9f, 0x88, + 0x00, 0x0e, 0x20, 0x0b, 0x00, 0x00, 0x81, 0x08, 0x1f, 0x04, 0x5a, 0x6f, + 0x60, 0xc3, 0x00, 0x14, 0x08, 0x0c, 0x5f, 0xc1, 0x00, 0xfe, 0x00, 0x05, + 0x00, 0xf6, 0x70, 0x90, 0x90, 0x05, 0x05, 0x00, 0x20, 0x11, 0x5f, 0x97, + 0x08, 0x0c, 0x88, 0x3d, 0x90, 0x86, 0x00, 0x14, 0x11, 0xb8, 0x08, 0x0c, + 0x61, 0x08, 0x20, 0x79, 0x02, 0x60, 0x7a, 0x30, 0x92, 0x96, 0x11, 0x02, + 0x11, 0x78, 0x78, 0x34, 0x90, 0x05, 0x11, 0x60, 0x7a, 0x38, 0xd2, 0xfc, + 0x01, 0x28, 0x70, 0xc4, 0x90, 0x05, 0x11, 0x10, 0x70, 0xc7, 0x00, 0x01, + 0x70, 0x9b, 0x00, 0x04, 0x00, 0x29, 0x00, 0x10, 0x08, 0x0c, 0x60, 0xe4, + 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, 0x70, 0x9b, 0x00, 0x05, 0x08, 0x0c, + 0x60, 0x8c, 0x20, 0x79, 0x02, 0x40, 0x78, 0x33, 0x11, 0x03, 0x78, 0x37, + 0x00, 0x00, 0x08, 0x0c, 0x61, 0x08, 0x08, 0x0c, 0x60, 0xeb, 0x11, 0x70, + 0x70, 0x84, 0x90, 0x05, 0x11, 0x58, 0x71, 0x5c, 0x91, 0x86, 0xff, 0xff, + 0x01, 0x38, 0x20, 0x11, 0x00, 0x08, 0x08, 0x0c, 0x5f, 0x44, 0x01, 0x68, + 0x08, 0x0c, 0x60, 0xc1, 0x20, 0xa9, 0x00, 0x08, 0x20, 0xe1, 0x00, 0x00, + 0x20, 0x99, 0x02, 0x6e, 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, 0x02, 0x4e, + 0x40, 0x03, 0x60, 0xc3, 0x00, 0x14, 0x08, 0x0c, 0x5f, 0xc1, 0x00, 0xfe, + 0x00, 0x05, 0x00, 0xf6, 0x70, 0x90, 0x90, 0x05, 0x05, 0x00, 0x20, 0x11, + 0x5f, 0x97, 0x08, 0x0c, 0x88, 0x3d, 0x90, 0x86, 0x00, 0x14, 0x11, 0xb8, + 0x08, 0x0c, 0x61, 0x08, 0x20, 0x79, 0x02, 0x60, 0x7a, 0x30, 0x92, 0x96, + 0x11, 0x03, 0x11, 0x78, 0x78, 0x34, 0x90, 0x05, 0x11, 0x60, 0x7a, 0x38, + 0xd2, 0xfc, 0x01, 0x28, 0x70, 0xc4, 0x90, 0x05, 0x11, 0x10, 0x70, 0xc7, + 0x00, 0x01, 0x70, 0x9b, 0x00, 0x06, 0x00, 0x29, 0x00, 0x10, 0x08, 0x0c, + 0x60, 0xe4, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, 0x70, 0x9b, 0x00, 0x07, + 0x08, 0x0c, 0x60, 0x8c, 0x20, 0x79, 0x02, 0x40, 0x78, 0x33, 0x11, 0x04, + 0x78, 0x37, 0x00, 0x00, 0x08, 0x0c, 0x61, 0x08, 0x08, 0x0c, 0x60, 0xeb, + 0x11, 0xb8, 0x70, 0x84, 0x90, 0x05, 0x11, 0xa0, 0x71, 0x64, 0x91, 0x86, + 0xff, 0xff, 0x01, 0x80, 0x91, 0x80, 0x33, 0xb6, 0x20, 0x0d, 0x91, 0x8c, + 0xff, 0x00, 0x81, 0x0f, 0x20, 0x11, 0x00, 0x08, 0x08, 0x0c, 0x5f, 0x44, + 0x01, 0x80, 0x08, 0x0c, 0x50, 0xd1, 0x01, 0x10, 0x08, 0x0c, 0x28, 0xdc, + 0x20, 0xa9, 0x00, 0x08, 0x20, 0xe1, 0x00, 0x00, 0x20, 0x99, 0x02, 0x6e, + 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, 0x02, 0x4e, 0x40, 0x03, 0x60, 0xc3, + 0x00, 0x14, 0x08, 0x0c, 0x5f, 0xc1, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, + 0x70, 0x90, 0x90, 0x05, 0x05, 0x00, 0x20, 0x11, 0x5f, 0x97, 0x08, 0x0c, + 0x88, 0x3d, 0x90, 0x86, 0x00, 0x14, 0x11, 0xb8, 0x08, 0x0c, 0x61, 0x08, + 0x20, 0x79, 0x02, 0x60, 0x7a, 0x30, 0x92, 0x96, 0x11, 0x04, 0x11, 0x78, + 0x78, 0x34, 0x90, 0x05, 0x11, 0x60, 0x7a, 0x38, 0xd2, 0xfc, 0x01, 0x28, + 0x70, 0xc4, 0x90, 0x05, 0x11, 0x10, 0x70, 0xc7, 0x00, 0x01, 0x70, 0x9b, + 0x00, 0x08, 0x00, 0x29, 0x00, 0x10, 0x08, 0x0c, 0x60, 0xe4, 0x00, 0xfe, + 0x00, 0x05, 0x00, 0xf6, 0x70, 0x9b, 0x00, 0x09, 0x08, 0x0c, 0x60, 0x8c, + 0x20, 0x79, 0x02, 0x40, 0x78, 0x33, 0x11, 0x05, 0x78, 0x37, 0x01, 0x00, + 0x08, 0x0c, 0x60, 0xeb, 0x11, 0x50, 0x70, 0x84, 0x90, 0x05, 0x11, 0x38, + 0x08, 0x0c, 0x5e, 0xb7, 0x11, 0x88, 0x90, 0x85, 0x00, 0x01, 0x08, 0x0c, + 0x28, 0xdc, 0x20, 0xa9, 0x00, 0x08, 0x08, 0x0c, 0x61, 0x08, 0x20, 0xe1, + 0x00, 0x00, 0x20, 0x99, 0x02, 0x6e, 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, + 0x02, 0x4e, 0x40, 0x03, 0x60, 0xc3, 0x00, 0x14, 0x08, 0x0c, 0x5f, 0xc1, + 0x00, 0x10, 0x08, 0x0c, 0x5a, 0x11, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, + 0x70, 0x90, 0x90, 0x05, 0x05, 0xa8, 0x20, 0x11, 0x5f, 0x97, 0x08, 0x0c, + 0x88, 0x3d, 0x90, 0x86, 0x00, 0x14, 0x15, 0x60, 0x08, 0x0c, 0x61, 0x08, + 0x20, 0x79, 0x02, 0x60, 0x7a, 0x30, 0x92, 0x96, 0x11, 0x05, 0x15, 0x20, + 0x78, 0x34, 0x90, 0x84, 0x01, 0x00, 0x20, 0x11, 0x01, 0x00, 0x92, 0x1e, + 0x11, 0x60, 0x7a, 0x38, 0xd2, 0xfc, 0x01, 0x28, 0x70, 0xc4, 0x90, 0x05, + 0x11, 0x10, 0x70, 0xc7, 0x00, 0x01, 0x70, 0x9b, 0x00, 0x0a, 0x00, 0xb1, + 0x00, 0x98, 0x90, 0x05, 0x11, 0x78, 0x7a, 0x38, 0xd2, 0xfc, 0x01, 0x28, + 0x70, 0xc4, 0x90, 0x05, 0x11, 0x10, 0x70, 0xc7, 0x00, 0x01, 0x70, 0x97, + 0x00, 0x00, 0x70, 0x9b, 0x00, 0x0e, 0x08, 0x0c, 0x5c, 0x5f, 0x00, 0x10, + 0x08, 0x0c, 0x60, 0xe4, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, 0x70, 0x9b, + 0x00, 0x0b, 0x20, 0x11, 0x1c, 0x0e, 0x20, 0xe9, 0x00, 0x01, 0x22, 0xa0, + 0x20, 0xa9, 0x00, 0x40, 0x20, 0x19, 0xff, 0xff, 0x43, 0x04, 0x08, 0x0c, + 0x60, 0x8c, 0x20, 0x79, 0x02, 0x40, 0x78, 0x33, 0x11, 0x06, 0x78, 0x37, + 0x00, 0x00, 0x08, 0x0c, 0x60, 0xeb, 0x01, 0x18, 0x20, 0x13, 0x00, 0x00, + 0x00, 0x20, 0x70, 0x60, 0x90, 0x85, 0x01, 0x00, 0x20, 0x12, 0x20, 0xa9, + 0x00, 0x40, 0x20, 0x09, 0x02, 0x4e, 0x20, 0x11, 0x1c, 0x0e, 0x22, 0x0e, + 0x82, 0x10, 0x81, 0x08, 0x91, 0x86, 0x02, 0x60, 0x11, 0x28, 0x68, 0x10, + 0x80, 0x00, 0x68, 0x12, 0x20, 0x09, 0x02, 0x40, 0x1f, 0x04, 0x5b, 0xe1, + 0x60, 0xc3, 0x00, 0x84, 0x08, 0x0c, 0x5f, 0xc1, 0x00, 0xfe, 0x00, 0x05, + 0x00, 0xf6, 0x70, 0x90, 0x90, 0x05, 0x01, 0xc0, 0x20, 0x11, 0x5f, 0x97, + 0x08, 0x0c, 0x88, 0x3d, 0x90, 0x86, 0x00, 0x84, 0x11, 0x78, 0x08, 0x0c, + 0x61, 0x08, 0x20, 0x79, 0x02, 0x60, 0x7a, 0x30, 0x92, 0x96, 0x11, 0x06, + 0x11, 0x38, 0x78, 0x34, 0x90, 0x05, 0x11, 0x20, 0x70, 0x9b, 0x00, 0x0c, + 0x00, 0x29, 0x00, 0x10, 0x08, 0x0c, 0x60, 0xe4, 0x00, 0xfe, 0x00, 0x05, + 0x00, 0xf6, 0x70, 0x9b, 0x00, 0x0d, 0x08, 0x0c, 0x60, 0x8c, 0x20, 0x79, + 0x02, 0x40, 0x78, 0x33, 0x11, 0x07, 0x78, 0x37, 0x00, 0x00, 0x08, 0x0c, + 0x61, 0x08, 0x20, 0xa9, 0x00, 0x40, 0x20, 0x11, 0x02, 0x6e, 0x20, 0x09, + 0x02, 0x4e, 0x22, 0x0e, 0x82, 0x10, 0x81, 0x08, 0x91, 0x86, 0x02, 0x60, + 0x11, 0x50, 0x68, 0x10, 0x80, 0x00, 0x68, 0x12, 0x20, 0x09, 0x02, 0x40, + 0x68, 0x14, 0x80, 0x00, 0x68, 0x16, 0x20, 0x11, 0x02, 0x60, 0x1f, 0x04, + 0x5c, 0x25, 0x60, 0xc3, 0x00, 0x84, 0x08, 0x0c, 0x5f, 0xc1, 0x00, 0xfe, + 0x00, 0x05, 0x00, 0xf6, 0x70, 0x90, 0x90, 0x05, 0x01, 0xe0, 0x20, 0x11, + 0x5f, 0x97, 0x08, 0x0c, 0x88, 0x3d, 0x90, 0x86, 0x00, 0x84, 0x11, 0x98, + 0x08, 0x0c, 0x61, 0x08, 0x20, 0x79, 0x02, 0x60, 0x7a, 0x30, 0x92, 0x96, + 0x11, 0x07, 0x11, 0x58, 0x78, 0x34, 0x90, 0x05, 0x11, 0x40, 0x70, 0x97, + 0x00, 0x01, 0x08, 0x0c, 0x60, 0x5e, 0x70, 0x9b, 0x00, 0x0e, 0x00, 0x29, + 0x00, 0x10, 0x08, 0x0c, 0x60, 0xe4, 0x00, 0xfe, 0x00, 0x05, 0x91, 0x8d, + 0x00, 0x01, 0x08, 0x0c, 0x61, 0x33, 0x70, 0x9b, 0x00, 0x0f, 0x70, 0x93, + 0x00, 0x00, 0x20, 0x61, 0x01, 0x40, 0x60, 0x5b, 0xbc, 0x85, 0x60, 0x5f, + 0xb5, 0xb5, 0x20, 0x61, 0x01, 0x00, 0x60, 0x43, 0x00, 0x05, 0x60, 0x43, + 0x00, 0x04, 0x20, 0x09, 0x07, 0xd0, 0x20, 0x11, 0x5f, 0x97, 0x08, 0x0c, + 0x88, 0x31, 0x00, 0x05, 0x70, 0x90, 0x90, 0x05, 0x01, 0x30, 0x20, 0x11, + 0x5f, 0x97, 0x08, 0x0c, 0x88, 0x3d, 0x70, 0x9b, 0x00, 0x00, 0x00, 0x05, + 0x70, 0x9b, 0x00, 0x11, 0x08, 0x0c, 0xaf, 0x8e, 0x08, 0x0c, 0x61, 0x08, + 0x20, 0xe1, 0x00, 0x00, 0x20, 0x99, 0x02, 0x60, 0x20, 0xe9, 0x00, 0x00, + 0x20, 0xa1, 0x02, 0x40, 0x74, 0x90, 0x94, 0x80, 0x00, 0x18, 0x90, 0x80, + 0x00, 0x07, 0x90, 0x84, 0x03, 0xf8, 0x80, 0x04, 0x20, 0xa8, 0x40, 0x03, + 0x08, 0x0c, 0x60, 0xeb, 0x11, 0xa0, 0x71, 0x7c, 0x81, 0xff, 0x01, 0x88, + 0x90, 0x0e, 0x70, 0x80, 0x90, 0x84, 0x00, 0xff, 0x01, 0x60, 0x08, 0x0c, + 0x28, 0x73, 0x91, 0x86, 0x00, 0x7e, 0x01, 0x38, 0x91, 0x86, 0x00, 0x80, + 0x01, 0x20, 0x20, 0x11, 0x00, 0x08, 0x08, 0x0c, 0x5f, 0x44, 0x60, 0xc3, + 0x00, 0x14, 0x08, 0x0c, 0x5f, 0xc1, 0x00, 0x05, 0x00, 0xf6, 0x70, 0x90, + 0x90, 0x05, 0x05, 0x00, 0x20, 0x11, 0x5f, 0x97, 0x08, 0x0c, 0x88, 0x3d, + 0x90, 0x86, 0x00, 0x14, 0x11, 0xb8, 0x08, 0x0c, 0x61, 0x08, 0x20, 0x79, + 0x02, 0x60, 0x7a, 0x30, 0x92, 0x96, 0x11, 0x03, 0x11, 0x78, 0x78, 0x34, + 0x90, 0x05, 0x11, 0x60, 0x7a, 0x38, 0xd2, 0xfc, 0x01, 0x28, 0x70, 0xc4, + 0x90, 0x05, 0x11, 0x10, 0x70, 0xc7, 0x00, 0x01, 0x70, 0x9b, 0x00, 0x12, + 0x00, 0x29, 0x00, 0x10, 0x70, 0x93, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x05, + 0x00, 0xf6, 0x70, 0x9b, 0x00, 0x13, 0x08, 0x0c, 0x60, 0x9a, 0x20, 0x79, + 0x02, 0x40, 0x78, 0x33, 0x11, 0x03, 0x78, 0x37, 0x00, 0x00, 0x08, 0x0c, + 0x61, 0x08, 0x08, 0x0c, 0x60, 0xeb, 0x11, 0x70, 0x70, 0x84, 0x90, 0x05, + 0x11, 0x58, 0x71, 0x5c, 0x91, 0x86, 0xff, 0xff, 0x01, 0x38, 0x20, 0x11, + 0x00, 0x08, 0x08, 0x0c, 0x5f, 0x44, 0x01, 0x68, 0x08, 0x0c, 0x60, 0xc1, + 0x20, 0xa9, 0x00, 0x08, 0x20, 0xe1, 0x00, 0x00, 0x20, 0x99, 0x02, 0x6e, + 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, 0x02, 0x4e, 0x40, 0x03, 0x60, 0xc3, + 0x00, 0x14, 0x08, 0x0c, 0x5f, 0xc1, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, + 0x70, 0x90, 0x90, 0x05, 0x05, 0x00, 0x20, 0x11, 0x5f, 0x97, 0x08, 0x0c, + 0x88, 0x3d, 0x90, 0x86, 0x00, 0x14, 0x11, 0xb8, 0x08, 0x0c, 0x61, 0x08, + 0x20, 0x79, 0x02, 0x60, 0x7a, 0x30, 0x92, 0x96, 0x11, 0x04, 0x11, 0x78, + 0x78, 0x34, 0x90, 0x05, 0x11, 0x60, 0x7a, 0x38, 0xd2, 0xfc, 0x01, 0x28, + 0x70, 0xc4, 0x90, 0x05, 0x11, 0x10, 0x70, 0xc7, 0x00, 0x01, 0x70, 0x9b, + 0x00, 0x14, 0x00, 0x29, 0x00, 0x10, 0x70, 0x93, 0x00, 0x00, 0x00, 0xfe, + 0x00, 0x05, 0x00, 0xf6, 0x70, 0x9b, 0x00, 0x15, 0x08, 0x0c, 0x60, 0x9a, + 0x20, 0x79, 0x02, 0x40, 0x78, 0x33, 0x11, 0x04, 0x78, 0x37, 0x00, 0x00, + 0x08, 0x0c, 0x61, 0x08, 0x08, 0x0c, 0x60, 0xeb, 0x11, 0xb8, 0x70, 0x84, + 0x90, 0x05, 0x11, 0xa0, 0x71, 0x64, 0x91, 0x86, 0xff, 0xff, 0x01, 0x80, + 0x91, 0x80, 0x33, 0xb6, 0x20, 0x0d, 0x91, 0x8c, 0xff, 0x00, 0x81, 0x0f, + 0x20, 0x11, 0x00, 0x08, 0x08, 0x0c, 0x5f, 0x44, 0x01, 0x80, 0x08, 0x0c, + 0x50, 0xd1, 0x01, 0x10, 0x08, 0x0c, 0x28, 0xdc, 0x20, 0xa9, 0x00, 0x08, + 0x20, 0xe1, 0x00, 0x00, 0x20, 0x99, 0x02, 0x6e, 0x20, 0xe9, 0x00, 0x00, + 0x20, 0xa1, 0x02, 0x4e, 0x40, 0x03, 0x60, 0xc3, 0x00, 0x14, 0x08, 0x0c, + 0x5f, 0xc1, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, 0x70, 0x90, 0x90, 0x05, + 0x05, 0xf0, 0x20, 0x11, 0x5f, 0x97, 0x08, 0x0c, 0x88, 0x3d, 0x90, 0x86, + 0x00, 0x14, 0x15, 0xa8, 0x08, 0x0c, 0x61, 0x08, 0x20, 0x79, 0x02, 0x60, + 0x7a, 0x30, 0x92, 0x96, 0x11, 0x05, 0x15, 0x68, 0x78, 0x34, 0x90, 0x84, + 0x01, 0x00, 0x20, 0x11, 0x01, 0x00, 0x92, 0x1e, 0x11, 0x68, 0x90, 0x85, + 0x00, 0x01, 0x08, 0x0c, 0x61, 0x33, 0x7a, 0x38, 0xd2, 0xfc, 0x01, 0x28, + 0x70, 0xc4, 0x90, 0x05, 0x11, 0x10, 0x70, 0xc7, 0x00, 0x01, 0x00, 0x80, + 0x90, 0x05, 0x11, 0xb8, 0x7a, 0x38, 0xd2, 0xfc, 0x01, 0x28, 0x70, 0xc4, + 0x90, 0x05, 0x11, 0x10, 0x70, 0xc7, 0x00, 0x01, 0x90, 0x85, 0x00, 0x01, + 0x08, 0x0c, 0x61, 0x33, 0x70, 0x97, 0x00, 0x00, 0x7a, 0x38, 0xd2, 0xf4, + 0x01, 0x10, 0x70, 0xdf, 0x00, 0x08, 0x70, 0x9b, 0x00, 0x16, 0x00, 0x29, + 0x00, 0x10, 0x70, 0x93, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x05, 0x08, 0x0c, + 0xaf, 0x8e, 0x08, 0x0c, 0x61, 0x08, 0x20, 0xe1, 0x00, 0x00, 0x20, 0x99, + 0x02, 0x60, 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, 0x02, 0x40, 0x20, 0xa9, + 0x00, 0x0e, 0x40, 0x03, 0x20, 0x11, 0x02, 0x6d, 0x22, 0x04, 0x90, 0x84, + 0x01, 0x00, 0x20, 0x11, 0x02, 0x4d, 0x20, 0x12, 0x20, 0x11, 0x02, 0x6e, + 0x70, 0x9b, 0x00, 0x17, 0x08, 0x0c, 0x60, 0xeb, 0x11, 0x50, 0x70, 0x84, + 0x90, 0x05, 0x11, 0x38, 0x08, 0x0c, 0x5e, 0xb7, 0x11, 0x88, 0x90, 0x85, + 0x00, 0x01, 0x08, 0x0c, 0x28, 0xdc, 0x20, 0xa9, 0x00, 0x08, 0x08, 0x0c, + 0x61, 0x08, 0x20, 0xe1, 0x00, 0x00, 0x20, 0x99, 0x02, 0x6e, 0x20, 0xe9, + 0x00, 0x00, 0x20, 0xa1, 0x02, 0x4e, 0x40, 0x03, 0x60, 0xc3, 0x00, 0x14, + 0x08, 0x0c, 0x5f, 0xc1, 0x00, 0x10, 0x08, 0x0c, 0x5a, 0x11, 0x00, 0x05, + 0x00, 0xf6, 0x70, 0x90, 0x90, 0x05, 0x01, 0xd8, 0x20, 0x11, 0x5f, 0x97, + 0x08, 0x0c, 0x88, 0x3d, 0x90, 0x86, 0x00, 0x84, 0x11, 0x90, 0x08, 0x0c, + 0x61, 0x08, 0x20, 0x79, 0x02, 0x60, 0x7a, 0x30, 0x92, 0x96, 0x11, 0x06, + 0x11, 0x50, 0x78, 0x34, 0x90, 0x05, 0x11, 0x38, 0x90, 0x06, 0x08, 0x0c, + 0x61, 0x33, 0x70, 0x9b, 0x00, 0x18, 0x00, 0x29, 0x00, 0x10, 0x70, 0x93, + 0x00, 0x00, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, 0x70, 0x9b, 0x00, 0x19, + 0x08, 0x0c, 0x60, 0x9a, 0x20, 0x79, 0x02, 0x40, 0x78, 0x33, 0x11, 0x06, + 0x78, 0x37, 0x00, 0x00, 0x08, 0x0c, 0x61, 0x08, 0x20, 0x09, 0x02, 0x6e, + 0x20, 0x39, 0x1c, 0x0e, 0x20, 0xa9, 0x00, 0x40, 0x21, 0x3e, 0x87, 0x38, + 0x81, 0x08, 0x91, 0x86, 0x02, 0x80, 0x11, 0x28, 0x68, 0x14, 0x80, 0x00, + 0x68, 0x16, 0x20, 0x09, 0x02, 0x60, 0x1f, 0x04, 0x5e, 0x20, 0x20, 0x39, + 0x1c, 0x0e, 0x08, 0x0c, 0x60, 0xeb, 0x11, 0xe8, 0x27, 0x28, 0x25, 0x14, + 0x82, 0x07, 0x90, 0x84, 0x00, 0xff, 0x80, 0x00, 0x20, 0x18, 0x92, 0x94, + 0x00, 0xff, 0x80, 0x07, 0x92, 0x05, 0x20, 0x2a, 0x70, 0x60, 0x23, 0x10, + 0x82, 0x14, 0x92, 0xa0, 0x1c, 0x0e, 0x24, 0x14, 0x93, 0x8c, 0x00, 0x01, + 0x01, 0x18, 0x92, 0x94, 0xff, 0x00, 0x00, 0x18, 0x92, 0x94, 0x00, 0xff, + 0x80, 0x07, 0x92, 0x15, 0x22, 0x22, 0x20, 0xa9, 0x00, 0x40, 0x20, 0x09, + 0x02, 0x4e, 0x27, 0x0e, 0x87, 0x38, 0x81, 0x08, 0x91, 0x86, 0x02, 0x60, + 0x11, 0x28, 0x68, 0x10, 0x80, 0x00, 0x68, 0x12, 0x20, 0x09, 0x02, 0x40, + 0x1f, 0x04, 0x5e, 0x53, 0x60, 0xc3, 0x00, 0x84, 0x08, 0x0c, 0x5f, 0xc1, + 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, 0x70, 0x90, 0x90, 0x05, 0x01, 0xe0, + 0x20, 0x11, 0x5f, 0x97, 0x08, 0x0c, 0x88, 0x3d, 0x90, 0x86, 0x00, 0x84, + 0x11, 0x98, 0x08, 0x0c, 0x61, 0x08, 0x20, 0x79, 0x02, 0x60, 0x7a, 0x30, + 0x92, 0x96, 0x11, 0x07, 0x11, 0x58, 0x78, 0x34, 0x90, 0x05, 0x11, 0x40, + 0x70, 0x97, 0x00, 0x01, 0x08, 0x0c, 0x60, 0x5e, 0x70, 0x9b, 0x00, 0x1a, + 0x00, 0x29, 0x00, 0x10, 0x70, 0x93, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x05, + 0x90, 0x85, 0x00, 0x01, 0x08, 0x0c, 0x61, 0x33, 0x70, 0x9b, 0x00, 0x1b, + 0x08, 0x0c, 0xaf, 0x8e, 0x08, 0x0c, 0x61, 0x08, 0x20, 0x11, 0x02, 0x60, + 0x20, 0x09, 0x02, 0x40, 0x74, 0x90, 0x94, 0x80, 0x00, 0x18, 0x90, 0x80, + 0x00, 0x07, 0x90, 0x84, 0x03, 0xf8, 0x80, 0x04, 0x20, 0xa8, 0x22, 0x0e, + 0x82, 0x10, 0x81, 0x08, 0x91, 0x86, 0x02, 0x60, 0x11, 0x50, 0x68, 0x10, + 0x80, 0x00, 0x68, 0x12, 0x20, 0x09, 0x02, 0x40, 0x68, 0x14, 0x80, 0x00, + 0x68, 0x16, 0x20, 0x11, 0x02, 0x60, 0x1f, 0x04, 0x5e, 0x9f, 0x60, 0xc3, + 0x00, 0x84, 0x08, 0x0c, 0x5f, 0xc1, 0x00, 0x05, 0x00, 0x05, 0x00, 0x86, + 0x00, 0x96, 0x20, 0x29, 0x18, 0x48, 0x25, 0x2c, 0x20, 0xa9, 0x00, 0x08, + 0x20, 0x41, 0x1c, 0x0e, 0x20, 0xe9, 0x00, 0x01, 0x28, 0xa0, 0x08, 0x0c, + 0x61, 0x08, 0x20, 0xe1, 0x00, 0x00, 0x20, 0x99, 0x02, 0x6e, 0x40, 0x03, + 0x20, 0xa9, 0x00, 0x08, 0x20, 0x11, 0x00, 0x07, 0xd5, 0xd4, 0x01, 0x08, + 0x90, 0x16, 0x28, 0x00, 0x92, 0x00, 0x20, 0x0c, 0x91, 0xa6, 0xff, 0xff, + 0x11, 0x48, 0xd5, 0xd4, 0x01, 0x10, 0x82, 0x10, 0x00, 0x08, 0x82, 0x11, + 0x1f, 0x04, 0x5e, 0xd1, 0x08, 0x04, 0x5f, 0x40, 0x82, 0xff, 0x11, 0x60, + 0xd5, 0xd4, 0x01, 0x20, 0x91, 0xa6, 0x3f, 0xff, 0x0d, 0x90, 0x00, 0x20, + 0x91, 0xa6, 0x3f, 0xff, 0x09, 0x04, 0x5f, 0x40, 0x91, 0x8d, 0xc0, 0x00, + 0x20, 0xa9, 0x00, 0x10, 0x20, 0x19, 0x00, 0x01, 0xd5, 0xd4, 0x01, 0x10, + 0x20, 0x19, 0x00, 0x10, 0x21, 0x20, 0xd5, 0xd4, 0x01, 0x10, 0x84, 0x23, + 0x00, 0x08, 0x84, 0x24, 0x12, 0x40, 0xd5, 0xd4, 0x01, 0x10, 0x83, 0x19, + 0x00, 0x08, 0x83, 0x18, 0x1f, 0x04, 0x5e, 0xf7, 0x04, 0xd8, 0x23, 0xa8, + 0x20, 0x21, 0x00, 0x01, 0x84, 0x26, 0x84, 0x25, 0x1f, 0x04, 0x5f, 0x09, + 0x23, 0x28, 0x85, 0x29, 0x92, 0xbe, 0x00, 0x07, 0x01, 0x58, 0x00, 0x06, + 0x20, 0x39, 0x00, 0x07, 0x22, 0x00, 0x97, 0x3a, 0x00, 0x0e, 0x27, 0xa8, + 0x95, 0xa8, 0x00, 0x10, 0x1f, 0x04, 0x5f, 0x18, 0x75, 0x5e, 0x95, 0xc8, + 0x33, 0xb6, 0x29, 0x2d, 0x95, 0xac, 0x00, 0xff, 0x75, 0x82, 0x65, 0x32, + 0x65, 0x36, 0x00, 0x16, 0x25, 0x08, 0x08, 0x0c, 0x28, 0xbc, 0x00, 0x1e, + 0x60, 0xe7, 0x00, 0x00, 0x65, 0xea, 0x20, 0x18, 0x23, 0x04, 0x94, 0x05, + 0x20, 0x1a, 0x70, 0x87, 0x00, 0x01, 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, + 0x02, 0x4e, 0x20, 0xe1, 0x00, 0x01, 0x28, 0x98, 0x20, 0xa9, 0x00, 0x08, + 0x40, 0x03, 0x90, 0x85, 0x00, 0x01, 0x00, 0x08, 0x90, 0x06, 0x00, 0x9e, + 0x00, 0x8e, 0x00, 0x05, 0x01, 0x56, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, + 0x01, 0x46, 0x22, 0xa8, 0x20, 0xe1, 0x00, 0x00, 0x20, 0x99, 0x02, 0x6e, + 0x20, 0xe9, 0x00, 0x00, 0x20, 0x11, 0x02, 0x4e, 0x22, 0xa0, 0x40, 0x03, + 0x01, 0x4e, 0x01, 0x3e, 0x01, 0xde, 0x01, 0xce, 0x01, 0x5e, 0x21, 0x18, + 0x90, 0x26, 0x20, 0x01, 0x00, 0x07, 0x93, 0x9a, 0x00, 0x10, 0x02, 0x18, + 0x84, 0x20, 0x80, 0x01, 0x0c, 0xd0, 0x21, 0x18, 0x84, 0xff, 0x01, 0x20, + 0x93, 0x9a, 0x00, 0x10, 0x84, 0x21, 0x1d, 0xe0, 0x20, 0x21, 0x00, 0x01, + 0x83, 0xff, 0x01, 0x18, 0x84, 0x23, 0x83, 0x19, 0x1d, 0xe8, 0x92, 0x38, + 0x20, 0x29, 0x02, 0x6e, 0x95, 0x28, 0x25, 0x04, 0x94, 0x2c, 0x11, 0xb8, + 0x94, 0x05, 0x20, 0x3a, 0x71, 0x5e, 0x91, 0xa0, 0x33, 0xb6, 0x24, 0x2d, + 0x95, 0xac, 0x00, 0xff, 0x75, 0x82, 0x65, 0x32, 0x65, 0x36, 0x00, 0x16, + 0x25, 0x08, 0x08, 0x0c, 0x28, 0xbc, 0x00, 0x1e, 0x60, 0xe7, 0x00, 0x00, + 0x65, 0xea, 0x70, 0x87, 0x00, 0x01, 0x90, 0x84, 0x00, 0x00, 0x00, 0x05, + 0x00, 0xe6, 0x20, 0x71, 0x18, 0x00, 0x70, 0x8b, 0x00, 0x00, 0x00, 0xee, + 0x00, 0x05, 0x00, 0xe6, 0x00, 0xf6, 0x20, 0x79, 0x01, 0x00, 0x20, 0x71, + 0x01, 0x40, 0x08, 0x0c, 0x60, 0x4d, 0x08, 0x0c, 0xa6, 0xe9, 0x70, 0x04, + 0x90, 0x84, 0x40, 0x00, 0x01, 0x10, 0x08, 0x0c, 0x2d, 0x49, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0x18, 0x26, 0x20, 0x73, 0x00, 0x00, + 0x78, 0x40, 0x00, 0x26, 0x00, 0x16, 0x20, 0x09, 0x00, 0xf7, 0x08, 0x0c, + 0x60, 0xaa, 0x00, 0x1e, 0x90, 0x94, 0x00, 0x10, 0x92, 0x85, 0x00, 0x80, + 0x78, 0x42, 0x7a, 0x42, 0x00, 0x2e, 0x01, 0x2e, 0x00, 0xfe, 0x00, 0xee, + 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x2b, 0xce, + 0x02, 0x28, 0x20, 0x11, 0x01, 0x01, 0x22, 0x04, 0xc0, 0xc5, 0x20, 0x12, + 0x20, 0x11, 0x19, 0xf2, 0x20, 0x13, 0x00, 0x00, 0x70, 0x93, 0x00, 0x00, + 0x01, 0x2e, 0x60, 0xa3, 0x00, 0x56, 0x60, 0xa7, 0x95, 0x75, 0x08, 0x0c, + 0xa6, 0xe0, 0x61, 0x44, 0xd1, 0x84, 0x01, 0x20, 0x71, 0x98, 0x91, 0x8d, + 0x20, 0x00, 0x00, 0x18, 0x71, 0x8c, 0x91, 0x8d, 0x10, 0x00, 0x20, 0x11, + 0x19, 0x99, 0x21, 0x12, 0x20, 0x09, 0x07, 0xd0, 0x20, 0x11, 0x5f, 0x97, + 0x08, 0x0c, 0x88, 0xd5, 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, 0x00, 0xc6, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0xb2, 0x44, 0x20, 0x09, + 0x00, 0xf7, 0x08, 0x0c, 0x60, 0xaa, 0x20, 0x61, 0x19, 0xfb, 0x90, 0x0e, + 0x61, 0x1a, 0x61, 0x1e, 0x61, 0x7a, 0x61, 0x7e, 0x20, 0x61, 0x18, 0x00, + 0x60, 0x03, 0x00, 0x01, 0x20, 0x61, 0x01, 0x00, 0x60, 0x43, 0x00, 0x90, + 0x60, 0x43, 0x00, 0x10, 0x20, 0x09, 0x19, 0x99, 0x20, 0x0b, 0x00, 0x00, + 0x20, 0x09, 0x00, 0x2d, 0x20, 0x11, 0x60, 0x19, 0x08, 0x0c, 0x88, 0x31, + 0x01, 0x2e, 0x00, 0xce, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xe6, + 0x00, 0x06, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x04, 0x71, 0x20, 0x71, + 0x01, 0x00, 0x08, 0x0c, 0xa6, 0xe9, 0x20, 0x71, 0x01, 0x40, 0x70, 0x04, + 0x90, 0x84, 0x40, 0x00, 0x01, 0x10, 0x08, 0x0c, 0x2d, 0x49, 0x08, 0x0c, + 0x76, 0x3f, 0x01, 0x88, 0x08, 0x0c, 0x76, 0x5a, 0x11, 0x70, 0x08, 0x0c, + 0x79, 0x3c, 0x00, 0x16, 0x08, 0x0c, 0x29, 0x8b, 0x20, 0x01, 0x19, 0x6d, + 0x21, 0x02, 0x00, 0x1e, 0x08, 0x0c, 0x79, 0x37, 0x08, 0x0c, 0x75, 0x63, + 0x00, 0x50, 0x20, 0x09, 0x00, 0x01, 0x08, 0x0c, 0x2c, 0x67, 0x20, 0x01, + 0x00, 0x01, 0x08, 0x0c, 0x28, 0x1c, 0x08, 0x0c, 0x5f, 0xed, 0x01, 0x2e, + 0x00, 0x0e, 0x00, 0xee, 0x00, 0x05, 0x20, 0x01, 0x18, 0x0e, 0x20, 0x04, + 0xd0, 0xbc, 0x01, 0x58, 0x00, 0x26, 0x00, 0x36, 0x20, 0x11, 0x80, 0x17, + 0x20, 0x01, 0x19, 0x99, 0x20, 0x1c, 0x08, 0x0c, 0x4c, 0x44, 0x00, 0x3e, + 0x00, 0x2e, 0x00, 0x05, 0x20, 0xa9, 0x00, 0x12, 0x20, 0xe9, 0x00, 0x01, + 0x20, 0xa1, 0x1c, 0x80, 0x08, 0x0c, 0x61, 0x08, 0x20, 0xe9, 0x00, 0x00, + 0x20, 0x99, 0x02, 0x6e, 0x00, 0x99, 0x20, 0xa9, 0x00, 0x20, 0x08, 0x0c, + 0x61, 0x02, 0x20, 0x99, 0x02, 0x60, 0x20, 0xa1, 0x1c, 0x92, 0x00, 0x51, + 0x20, 0xa9, 0x00, 0x0e, 0x08, 0x0c, 0x61, 0x05, 0x20, 0x99, 0x02, 0x60, + 0x20, 0xa1, 0x1c, 0xb2, 0x00, 0x09, 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, + 0x34, 0x10, 0x33, 0x08, 0x21, 0x04, 0x80, 0x07, 0x20, 0x12, 0x81, 0x08, + 0x82, 0x10, 0x1f, 0x04, 0x60, 0x82, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, + 0x08, 0x0c, 0xaf, 0x8e, 0x20, 0xe1, 0x00, 0x01, 0x20, 0x99, 0x1c, 0x00, + 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, 0x02, 0x40, 0x20, 0xa9, 0x00, 0x0c, + 0x40, 0x03, 0x00, 0x05, 0x08, 0x0c, 0xaf, 0x8e, 0x08, 0x0c, 0x61, 0x08, + 0x20, 0xe1, 0x00, 0x00, 0x20, 0x99, 0x02, 0x60, 0x20, 0xe9, 0x00, 0x00, + 0x20, 0xa1, 0x02, 0x40, 0x20, 0xa9, 0x00, 0x0c, 0x40, 0x03, 0x00, 0x05, + 0x00, 0xc6, 0x00, 0x06, 0x20, 0x61, 0x01, 0x00, 0x81, 0x0f, 0x20, 0x01, + 0x18, 0x34, 0x20, 0x04, 0x90, 0x05, 0x11, 0x38, 0x20, 0x01, 0x18, 0x18, + 0x20, 0x04, 0x90, 0x84, 0x00, 0xff, 0x91, 0x05, 0x00, 0x10, 0x91, 0x85, + 0x00, 0xf7, 0x60, 0x4a, 0x00, 0x0e, 0x00, 0xce, 0x00, 0x05, 0x00, 0x16, + 0x00, 0x46, 0x08, 0x0c, 0x6a, 0x9f, 0x01, 0x58, 0x90, 0x06, 0x20, 0x20, + 0x20, 0x09, 0x00, 0x2a, 0x08, 0x0c, 0xec, 0x31, 0x20, 0x01, 0x18, 0x0c, + 0x20, 0x0c, 0xc1, 0x95, 0x21, 0x02, 0x20, 0x19, 0x00, 0x2a, 0x90, 0x0e, + 0x08, 0x0c, 0x32, 0x1b, 0x08, 0x0c, 0xd7, 0xe3, 0x01, 0x40, 0x00, 0x36, + 0x20, 0x19, 0xff, 0xff, 0x20, 0x21, 0x00, 0x07, 0x08, 0x0c, 0x4d, 0xfb, + 0x00, 0x3e, 0x00, 0x4e, 0x00, 0x1e, 0x00, 0x05, 0x08, 0x0c, 0x5f, 0xed, + 0x70, 0x9b, 0x00, 0x00, 0x70, 0x93, 0x00, 0x00, 0x00, 0x05, 0x00, 0x06, + 0x20, 0x01, 0x18, 0x0c, 0x20, 0x04, 0xd0, 0x9c, 0x01, 0x00, 0x00, 0x0e, + 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x01, 0x01, 0x01, 0x20, 0x0c, 0x91, 0x8d, 0x00, 0x06, 0x21, 0x02, + 0x01, 0x2e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, 0x20, 0x09, 0x00, 0x01, + 0x00, 0x20, 0x20, 0x09, 0x00, 0x02, 0x00, 0x08, 0x90, 0x0e, 0x68, 0x14, + 0x90, 0x84, 0xff, 0xc0, 0x91, 0x0d, 0x69, 0x16, 0x00, 0x05, 0x00, 0xf6, + 0x01, 0x56, 0x01, 0x46, 0x01, 0xd6, 0x90, 0x06, 0x20, 0xa9, 0x00, 0x80, + 0x20, 0xe9, 0x00, 0x01, 0x20, 0xa1, 0x1c, 0x00, 0x40, 0x04, 0x20, 0x79, + 0x1c, 0x00, 0x78, 0x03, 0x22, 0x00, 0x78, 0x07, 0x00, 0xef, 0x78, 0x0f, + 0x00, 0xef, 0x78, 0x13, 0x01, 0x38, 0x78, 0x23, 0xff, 0xff, 0x78, 0x27, + 0xff, 0xff, 0x01, 0xde, 0x01, 0x4e, 0x01, 0x5e, 0x00, 0xfe, 0x00, 0x05, + 0x20, 0x01, 0x18, 0x00, 0x20, 0x03, 0x00, 0x01, 0x00, 0x05, 0x20, 0x01, + 0x19, 0xa7, 0x01, 0x18, 0x20, 0x03, 0x00, 0x01, 0x00, 0x10, 0x20, 0x03, + 0x00, 0x00, 0x00, 0x05, 0x01, 0x56, 0x20, 0xa9, 0x08, 0x00, 0x20, 0x09, + 0x10, 0x00, 0x90, 0x06, 0x20, 0x0a, 0x81, 0x08, 0x1f, 0x04, 0x61, 0x42, + 0x01, 0x5e, 0x00, 0x05, 0x00, 0xd6, 0x00, 0x36, 0x01, 0x56, 0x01, 0x36, + 0x01, 0x46, 0x20, 0x69, 0x18, 0x47, 0x90, 0x06, 0xb8, 0x02, 0xb8, 0xce, + 0xb8, 0x07, 0x07, 0x07, 0xb8, 0x0a, 0xb8, 0x0e, 0xb8, 0x12, 0x91, 0x98, + 0x33, 0xb6, 0x23, 0x1d, 0x93, 0x9c, 0x00, 0xff, 0xbb, 0x16, 0x00, 0x16, + 0x00, 0x26, 0xb8, 0xc2, 0x08, 0x0c, 0xb2, 0x3d, 0x11, 0x20, 0x91, 0x92, + 0x00, 0x7e, 0x12, 0x08, 0xbb, 0xc2, 0x20, 0xa9, 0x00, 0x04, 0xb8, 0xc4, + 0x20, 0xe8, 0xb9, 0xc8, 0x91, 0x98, 0x00, 0x06, 0x90, 0x06, 0x23, 0xa0, + 0x40, 0x04, 0x20, 0xa9, 0x00, 0x04, 0x91, 0x98, 0x00, 0x0a, 0x23, 0xa0, + 0x40, 0x04, 0x00, 0x2e, 0x00, 0x1e, 0xb8, 0x3e, 0xb8, 0x42, 0xb8, 0x4e, + 0xb8, 0x52, 0xb8, 0x56, 0xb8, 0x5a, 0xb8, 0x5e, 0xb8, 0x62, 0xb8, 0x66, + 0xb8, 0x6a, 0xb8, 0x6f, 0x01, 0x00, 0xb8, 0x72, 0xb8, 0x76, 0xb8, 0x7a, + 0xb8, 0x8a, 0xb8, 0x8e, 0xb8, 0x93, 0x00, 0x08, 0xb8, 0x96, 0xb8, 0x9a, + 0xb8, 0x9e, 0xb8, 0xbe, 0xb9, 0xa2, 0x00, 0x96, 0xb8, 0xa4, 0x90, 0x4d, + 0x01, 0x10, 0x08, 0x0c, 0x10, 0x40, 0xb8, 0xa7, 0x00, 0x00, 0x00, 0x9e, + 0x90, 0x06, 0xb8, 0x4a, 0x68, 0x10, 0xb8, 0x3a, 0x68, 0x0c, 0xb8, 0x46, + 0xb8, 0xbb, 0x05, 0x20, 0xb8, 0xac, 0x90, 0x05, 0x01, 0x98, 0x00, 0xc6, + 0x20, 0x60, 0x9c, 0x82, 0x1c, 0xd0, 0x0a, 0x0c, 0x0d, 0xc5, 0x20, 0x01, + 0x18, 0x1a, 0x20, 0x04, 0x9c, 0x02, 0x1a, 0x0c, 0x0d, 0xc5, 0x08, 0x0c, + 0x8c, 0xf7, 0x00, 0xce, 0x09, 0x0c, 0x90, 0x96, 0xb8, 0xaf, 0x00, 0x00, + 0x68, 0x14, 0x90, 0x84, 0x00, 0xff, 0xb8, 0x42, 0x01, 0x4e, 0x01, 0x3e, + 0x01, 0x5e, 0x00, 0x3e, 0x00, 0xde, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0xa9, 0x74, 0xae, 0x78, 0x96, 0x84, 0x3f, 0xff, 0x90, 0x82, + 0x40, 0x00, 0x1a, 0x04, 0x62, 0x30, 0x91, 0x82, 0x08, 0x00, 0x1a, 0x04, + 0x62, 0x34, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x04, 0x90, 0x84, 0x00, 0x03, + 0x19, 0x04, 0x62, 0x3a, 0x91, 0x88, 0x10, 0x00, 0x21, 0x04, 0x90, 0x5d, + 0x05, 0x18, 0xb8, 0x04, 0x90, 0x84, 0x00, 0xff, 0x90, 0x8e, 0x00, 0x06, + 0x15, 0x08, 0xb8, 0xa4, 0x90, 0x0d, 0x19, 0x04, 0x62, 0x4c, 0xb8, 0x50, + 0x90, 0x0d, 0x11, 0x48, 0xa8, 0x02, 0x29, 0x00, 0xb8, 0x52, 0xb8, 0x4e, + 0x08, 0x0c, 0x95, 0x1c, 0x90, 0x06, 0x01, 0x2e, 0x00, 0x05, 0x00, 0xa6, + 0x21, 0x50, 0x29, 0x00, 0xb0, 0x02, 0xa8, 0x03, 0x00, 0x00, 0x00, 0xae, + 0xb8, 0x52, 0x0c, 0x90, 0x20, 0x01, 0x00, 0x05, 0x90, 0x0e, 0x04, 0xb8, + 0x20, 0x01, 0x00, 0x28, 0x90, 0x0e, 0x04, 0x98, 0x90, 0x82, 0x00, 0x06, + 0x12, 0x90, 0x08, 0x0c, 0xb2, 0x3d, 0x11, 0x60, 0xb8, 0xa0, 0x90, 0x84, + 0xff, 0x80, 0x11, 0x40, 0xb9, 0x00, 0xd1, 0xfc, 0x09, 0x90, 0x20, 0x01, + 0x00, 0x29, 0x20, 0x09, 0x10, 0x00, 0x04, 0x08, 0x20, 0x01, 0x00, 0x28, + 0x00, 0xa8, 0x20, 0x09, 0x18, 0x0c, 0x21, 0x0c, 0xd1, 0x8c, 0x01, 0x18, + 0x20, 0x01, 0x00, 0x04, 0x00, 0x68, 0xd1, 0x84, 0x01, 0x18, 0x20, 0x01, + 0x00, 0x04, 0x00, 0x40, 0x20, 0x01, 0x00, 0x29, 0xb9, 0x00, 0xd1, 0xfc, + 0x01, 0x18, 0x20, 0x09, 0x10, 0x00, 0x00, 0x48, 0x90, 0x0e, 0x00, 0x38, + 0x20, 0x01, 0x00, 0x29, 0x90, 0x0e, 0x00, 0x18, 0x20, 0x01, 0x00, 0x29, + 0x90, 0x0e, 0x90, 0x05, 0x01, 0x2e, 0x00, 0x05, 0x20, 0x01, 0x18, 0x0c, + 0x20, 0x04, 0xd0, 0x84, 0x19, 0xd0, 0x91, 0x88, 0x10, 0x00, 0x21, 0x04, + 0x90, 0x5d, 0x09, 0xa8, 0x08, 0x0c, 0x6a, 0xa3, 0x19, 0x90, 0xb8, 0x00, + 0xd0, 0xbc, 0x09, 0x78, 0x08, 0x04, 0x61, 0xe3, 0x08, 0x0c, 0x68, 0xc0, + 0x09, 0x04, 0x61, 0xfc, 0x08, 0x04, 0x61, 0xe7, 0x00, 0xb6, 0x00, 0xe6, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0xa8, 0x74, 0x90, 0x8e, 0x00, 0xff, + 0x11, 0x20, 0x20, 0x01, 0x19, 0x6b, 0x20, 0x5c, 0x00, 0x60, 0xa9, 0x74, + 0x91, 0x82, 0x08, 0x00, 0x16, 0x90, 0x91, 0x88, 0x10, 0x00, 0x21, 0x04, + 0x90, 0x5d, 0x01, 0xd0, 0x08, 0x0c, 0x6a, 0x43, 0x11, 0xd0, 0x08, 0x0c, + 0xb2, 0x7d, 0x05, 0x70, 0x2b, 0x00, 0x60, 0x12, 0x29, 0x00, 0x60, 0x16, + 0x60, 0x23, 0x00, 0x09, 0x60, 0x0b, 0x00, 0x00, 0xa8, 0x74, 0x90, 0x8e, + 0x00, 0xff, 0x11, 0x10, 0x60, 0x0b, 0x80, 0x00, 0x20, 0x09, 0x00, 0x43, + 0x08, 0x0c, 0xb3, 0x52, 0x90, 0x06, 0x00, 0xb0, 0x20, 0x01, 0x00, 0x28, + 0x00, 0x90, 0x20, 0x09, 0x18, 0x0c, 0x21, 0x0c, 0xd1, 0x8c, 0x01, 0x18, + 0x20, 0x01, 0x00, 0x04, 0x00, 0x38, 0xd1, 0x84, 0x01, 0x18, 0x20, 0x01, + 0x00, 0x04, 0x00, 0x10, 0x20, 0x01, 0x00, 0x29, 0x00, 0x10, 0x20, 0x01, + 0x00, 0x29, 0x90, 0x05, 0x01, 0x2e, 0x00, 0xee, 0x00, 0xbe, 0x00, 0x05, + 0x20, 0x01, 0x00, 0x2c, 0x0c, 0xc0, 0x00, 0xb6, 0x00, 0xe6, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0xa9, 0x74, 0x91, 0x82, 0x08, 0x00, 0x1a, 0x04, + 0x63, 0x1d, 0x91, 0x88, 0x10, 0x00, 0x21, 0x04, 0x90, 0x5d, 0x09, 0x04, + 0x62, 0xf5, 0xb8, 0xa0, 0x90, 0x86, 0x00, 0x7f, 0x01, 0x90, 0xa8, 0x7c, + 0xd0, 0xfc, 0x11, 0x78, 0x08, 0x0c, 0x6a, 0xab, 0x01, 0x60, 0xa9, 0x94, + 0x81, 0xff, 0x01, 0x30, 0x90, 0x8e, 0x00, 0x04, 0x01, 0x30, 0x90, 0x8e, + 0x00, 0x05, 0x01, 0x18, 0x08, 0x0c, 0x6a, 0xa3, 0x15, 0x98, 0xa8, 0x7c, + 0xd0, 0xfc, 0x01, 0xe0, 0xa8, 0x94, 0x90, 0x05, 0x01, 0xc8, 0x20, 0x60, + 0x00, 0x26, 0x20, 0x10, 0x08, 0x0c, 0xd0, 0xc6, 0x00, 0x2e, 0x11, 0x20, + 0x20, 0x01, 0x00, 0x08, 0x08, 0x04, 0x63, 0x1f, 0x60, 0x20, 0x90, 0x86, + 0x00, 0x0a, 0x01, 0x20, 0x20, 0x01, 0x00, 0x08, 0x08, 0x04, 0x63, 0x1f, + 0x60, 0x1a, 0x60, 0x03, 0x00, 0x08, 0x29, 0x00, 0x60, 0x16, 0x00, 0x58, + 0x08, 0x0c, 0xb2, 0x7d, 0x05, 0xe8, 0x2b, 0x00, 0x60, 0x12, 0x29, 0x00, + 0x60, 0x16, 0x60, 0x0b, 0xff, 0xff, 0x60, 0x23, 0x00, 0x0a, 0x20, 0x09, + 0x00, 0x03, 0x08, 0x0c, 0xb3, 0x52, 0x90, 0x06, 0x04, 0x58, 0x20, 0x01, + 0x00, 0x28, 0x04, 0x38, 0x90, 0x82, 0x00, 0x06, 0x12, 0x90, 0x08, 0x0c, + 0xb2, 0x3d, 0x11, 0x60, 0xb8, 0xa0, 0x90, 0x84, 0xff, 0x80, 0x11, 0x40, + 0xb9, 0x00, 0xd1, 0xfc, 0x09, 0x00, 0x20, 0x01, 0x00, 0x29, 0x20, 0x09, + 0x10, 0x00, 0x00, 0xa8, 0x20, 0x01, 0x00, 0x28, 0x00, 0x90, 0x20, 0x09, + 0x18, 0x0c, 0x21, 0x0c, 0xd1, 0x8c, 0x01, 0x18, 0x20, 0x01, 0x00, 0x04, + 0x00, 0x50, 0xd1, 0x84, 0x01, 0x18, 0x20, 0x01, 0x00, 0x04, 0x00, 0x28, + 0x20, 0x01, 0x00, 0x29, 0x00, 0x10, 0x20, 0x01, 0x00, 0x29, 0x90, 0x05, + 0x01, 0x2e, 0x00, 0xee, 0x00, 0xbe, 0x00, 0x05, 0x20, 0x01, 0x00, 0x2c, + 0x0c, 0xc0, 0x00, 0xf6, 0x00, 0xb6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0xa8, 0xe0, 0x90, 0x05, 0x15, 0x50, 0xa8, 0xdc, 0x90, 0x82, 0x01, 0x01, + 0x16, 0x30, 0xa8, 0xc8, 0x90, 0x05, 0x15, 0x18, 0xa8, 0xc4, 0x90, 0x82, + 0x01, 0x01, 0x12, 0xf8, 0xa9, 0x74, 0x20, 0x79, 0x18, 0x00, 0x91, 0x82, + 0x08, 0x00, 0x12, 0xe8, 0x78, 0x30, 0x90, 0x84, 0x00, 0x03, 0x11, 0x30, + 0xaa, 0x98, 0xab, 0x94, 0xa8, 0x78, 0x90, 0x84, 0x00, 0x07, 0x00, 0xea, + 0x79, 0x30, 0xd1, 0x8c, 0x01, 0x18, 0x20, 0x01, 0x00, 0x04, 0x00, 0x38, + 0xd1, 0x84, 0x01, 0x18, 0x20, 0x01, 0x00, 0x04, 0x00, 0x10, 0x20, 0x01, + 0x00, 0x29, 0x90, 0x0e, 0x00, 0x38, 0x20, 0x01, 0x00, 0x2c, 0x90, 0x0e, + 0x00, 0x18, 0x20, 0x01, 0x00, 0x29, 0x90, 0x0e, 0x90, 0x06, 0x00, 0x08, + 0x90, 0x05, 0x01, 0x2e, 0x00, 0xbe, 0x00, 0xfe, 0x00, 0x05, 0x63, 0xb4, + 0x63, 0x6f, 0x63, 0x86, 0x63, 0xb4, 0x63, 0xb4, 0x63, 0xb4, 0x63, 0xb4, + 0x63, 0xb4, 0x21, 0x00, 0x90, 0x82, 0x00, 0x7e, 0x12, 0x78, 0x08, 0x0c, + 0x66, 0xb9, 0x01, 0x48, 0x90, 0x46, 0xb8, 0x10, 0x93, 0x06, 0x19, 0x04, + 0x63, 0xbc, 0xb8, 0x14, 0x92, 0x06, 0x15, 0xf0, 0x00, 0x28, 0xbb, 0x12, + 0xba, 0x16, 0x00, 0x10, 0x08, 0x0c, 0x4a, 0xf7, 0x01, 0x50, 0x04, 0xb0, + 0x08, 0x0c, 0x67, 0x24, 0x15, 0x98, 0xb8, 0x10, 0x93, 0x06, 0x15, 0x80, + 0xb8, 0x14, 0x92, 0x06, 0x15, 0x68, 0x08, 0x0c, 0xb2, 0x7d, 0x05, 0x30, + 0x2b, 0x00, 0x60, 0x12, 0x08, 0x0c, 0xd5, 0x54, 0x29, 0x00, 0x60, 0x16, + 0x60, 0x0b, 0xff, 0xff, 0x60, 0x23, 0x00, 0x0a, 0xa8, 0x78, 0x90, 0x86, + 0x00, 0x01, 0x11, 0x70, 0x08, 0x0c, 0x32, 0x50, 0x90, 0x06, 0x08, 0x0c, + 0x66, 0x56, 0x20, 0x01, 0x00, 0x02, 0x08, 0x0c, 0x66, 0x6a, 0x20, 0x01, + 0x02, 0x00, 0xb8, 0x6e, 0xb8, 0x93, 0x00, 0x02, 0x20, 0x09, 0x00, 0x03, + 0x08, 0x0c, 0xb3, 0x52, 0x90, 0x06, 0x00, 0x68, 0x20, 0x01, 0x00, 0x01, + 0x90, 0x0e, 0x00, 0x38, 0x20, 0x01, 0x00, 0x2c, 0x90, 0x0e, 0x00, 0x18, + 0x20, 0x01, 0x00, 0x28, 0x90, 0x0e, 0x90, 0x05, 0x00, 0x00, 0x01, 0x2e, + 0x00, 0xbe, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xf6, 0x00, 0xe6, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0xa8, 0x94, 0x90, 0xc6, 0x00, 0x15, + 0x09, 0x04, 0x65, 0xa7, 0x90, 0xc6, 0x00, 0x56, 0x09, 0x04, 0x65, 0xab, + 0x90, 0xc6, 0x00, 0x66, 0x09, 0x04, 0x65, 0xaf, 0x90, 0xc6, 0x00, 0x67, + 0x09, 0x04, 0x65, 0xb3, 0x90, 0xc6, 0x00, 0x68, 0x09, 0x04, 0x65, 0xb7, + 0x90, 0xc6, 0x00, 0x71, 0x09, 0x04, 0x65, 0xbb, 0x90, 0xc6, 0x00, 0x74, + 0x09, 0x04, 0x65, 0xbf, 0x90, 0xc6, 0x00, 0x7c, 0x09, 0x04, 0x65, 0xc3, + 0x90, 0xc6, 0x00, 0x7e, 0x09, 0x04, 0x65, 0xc7, 0x90, 0xc6, 0x00, 0x37, + 0x09, 0x04, 0x65, 0xcb, 0x90, 0x16, 0x20, 0x79, 0x18, 0x00, 0xa9, 0x74, + 0x91, 0x86, 0x00, 0xff, 0x09, 0x04, 0x65, 0xa2, 0x91, 0x82, 0x08, 0x00, + 0x1a, 0x04, 0x65, 0xa2, 0x08, 0x0c, 0x67, 0x24, 0x11, 0x98, 0xb8, 0x04, + 0x90, 0x84, 0x00, 0xff, 0x90, 0x82, 0x00, 0x06, 0x12, 0x68, 0xa8, 0x94, + 0x90, 0xc6, 0x00, 0x6f, 0x01, 0x48, 0x08, 0x0c, 0xb2, 0x3d, 0x19, 0x04, + 0x65, 0x8b, 0xb8, 0xa0, 0x90, 0x84, 0xff, 0x80, 0x19, 0x04, 0x65, 0x8b, + 0xa8, 0x94, 0x90, 0xc6, 0x00, 0x6f, 0x01, 0x58, 0x90, 0xc6, 0x00, 0x5e, + 0x09, 0x04, 0x64, 0xeb, 0x90, 0xc6, 0x00, 0x64, 0x09, 0x04, 0x65, 0x14, + 0x20, 0x08, 0x08, 0x04, 0x64, 0xad, 0xa9, 0x98, 0xa8, 0xb0, 0x20, 0x40, + 0x08, 0x0c, 0xb2, 0x3d, 0x11, 0x20, 0x91, 0x82, 0x00, 0x7f, 0x0a, 0x04, + 0x64, 0xad, 0x91, 0x86, 0x00, 0xff, 0x09, 0x04, 0x64, 0xad, 0x91, 0x82, + 0x08, 0x00, 0x1a, 0x04, 0x64, 0xad, 0xaa, 0xa0, 0xab, 0x9c, 0x78, 0x7c, + 0x93, 0x06, 0x11, 0xa8, 0x78, 0x80, 0x00, 0x96, 0x92, 0x4e, 0x11, 0x28, + 0x22, 0x08, 0x23, 0x10, 0x00, 0x9e, 0x08, 0x04, 0x64, 0xad, 0x08, 0x0c, + 0xb2, 0x3d, 0x11, 0x40, 0x99, 0xcc, 0xff, 0x00, 0x00, 0x9e, 0x11, 0x28, + 0x22, 0x08, 0x23, 0x10, 0x08, 0x04, 0x64, 0xad, 0x00, 0x9e, 0x08, 0x0c, + 0x4a, 0xf7, 0x09, 0x04, 0x64, 0xb7, 0x90, 0x0e, 0x90, 0x16, 0x90, 0xc6, + 0x40, 0x00, 0x15, 0xe0, 0x00, 0x06, 0x08, 0x0c, 0x69, 0x44, 0x11, 0x08, + 0xc1, 0x85, 0xb8, 0x00, 0xd0, 0xbc, 0x01, 0x08, 0xc1, 0x8d, 0x20, 0xa9, + 0x00, 0x04, 0xa8, 0x60, 0x20, 0xe8, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x31, + 0x20, 0xa0, 0xb8, 0xc4, 0x20, 0xe0, 0xb8, 0xc8, 0x90, 0x80, 0x00, 0x06, + 0x20, 0x98, 0x08, 0x0c, 0x0f, 0x8b, 0x20, 0xa9, 0x00, 0x04, 0xa8, 0x60, + 0x20, 0xe8, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x35, 0x20, 0xa0, 0xb8, 0xc4, + 0x20, 0xe0, 0xb8, 0xc8, 0x90, 0x80, 0x00, 0x0a, 0x20, 0x98, 0x08, 0x0c, + 0x0f, 0x8b, 0xa8, 0xc4, 0xab, 0xc8, 0x93, 0x05, 0xab, 0xcc, 0x93, 0x05, + 0xab, 0xd0, 0x93, 0x05, 0xab, 0xd4, 0x93, 0x05, 0xab, 0xd8, 0x93, 0x05, + 0xab, 0xdc, 0x93, 0x05, 0xab, 0xe0, 0x93, 0x05, 0x90, 0x05, 0x05, 0x10, + 0x00, 0x0e, 0x00, 0xc8, 0x90, 0xc6, 0x40, 0x07, 0x11, 0x10, 0x24, 0x08, + 0x00, 0xa0, 0x90, 0xc6, 0x40, 0x08, 0x11, 0x18, 0x27, 0x08, 0x26, 0x10, + 0x00, 0x70, 0x90, 0xc6, 0x40, 0x09, 0x11, 0x08, 0x00, 0x50, 0x90, 0xc6, + 0x40, 0x06, 0x01, 0x38, 0x20, 0x01, 0x40, 0x05, 0x20, 0x09, 0x00, 0x0a, + 0x00, 0x10, 0x20, 0x01, 0x40, 0x06, 0xa8, 0x96, 0xa9, 0x9a, 0xaa, 0x9e, + 0x20, 0x01, 0x00, 0x30, 0x90, 0x0e, 0x04, 0x78, 0x00, 0x0e, 0x08, 0x0c, + 0xb2, 0x7d, 0x11, 0x30, 0x20, 0x01, 0x40, 0x05, 0x20, 0x09, 0x00, 0x03, + 0x90, 0x16, 0x0c, 0x78, 0x2b, 0x00, 0x60, 0x12, 0x08, 0x0c, 0xd5, 0x54, + 0x29, 0x00, 0x60, 0x16, 0x60, 0x23, 0x00, 0x01, 0xa8, 0x68, 0xd8, 0x8c, + 0x01, 0x08, 0xc0, 0xf5, 0xa8, 0x6a, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x08, 0x0c, 0x32, 0x50, 0x01, 0x2e, 0x90, 0x06, 0x08, 0x0c, 0x66, 0x56, + 0x20, 0x01, 0x00, 0x02, 0x08, 0x0c, 0x66, 0x6a, 0x20, 0x09, 0x00, 0x02, + 0x08, 0x0c, 0xb3, 0x52, 0xa8, 0xb0, 0xd0, 0x94, 0x01, 0x18, 0xb8, 0xcc, + 0xc0, 0x8d, 0xb8, 0xce, 0x90, 0x06, 0x90, 0x05, 0x01, 0x2e, 0x00, 0xee, + 0x00, 0xfe, 0x00, 0xbe, 0x00, 0x05, 0x08, 0x0c, 0x57, 0xe9, 0x01, 0x18, + 0x20, 0x09, 0x00, 0x07, 0x00, 0xf8, 0xa9, 0x98, 0xae, 0xb0, 0x08, 0x0c, + 0x67, 0x24, 0x19, 0x04, 0x64, 0xa8, 0x91, 0x86, 0x00, 0x7f, 0x01, 0x30, + 0x08, 0x0c, 0x6a, 0xa3, 0x01, 0x18, 0x20, 0x09, 0x00, 0x09, 0x00, 0x80, + 0x00, 0x96, 0x08, 0x0c, 0x10, 0x0e, 0x11, 0x20, 0x00, 0x9e, 0x20, 0x09, + 0x00, 0x02, 0x00, 0x40, 0x29, 0x00, 0x00, 0x9e, 0xa8, 0x06, 0x08, 0x0c, + 0xd2, 0xc0, 0x19, 0xb0, 0x20, 0x09, 0x00, 0x03, 0x20, 0x01, 0x40, 0x05, + 0x08, 0x04, 0x64, 0xaf, 0xa9, 0x98, 0xae, 0xb0, 0x08, 0x0c, 0x67, 0x24, + 0x19, 0x04, 0x64, 0xa8, 0x00, 0x96, 0x08, 0x0c, 0x10, 0x0e, 0x11, 0x28, + 0x00, 0x9e, 0x20, 0x09, 0x00, 0x02, 0x08, 0x04, 0x65, 0x68, 0x29, 0x00, + 0x00, 0x9e, 0xa8, 0x06, 0x00, 0x96, 0x20, 0x48, 0x20, 0xa9, 0x00, 0x2b, + 0xb8, 0xc4, 0x20, 0xe0, 0xb8, 0xc8, 0x20, 0x98, 0xa8, 0x60, 0x20, 0xe8, + 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x02, 0x20, 0xa0, 0x40, 0x03, 0x20, 0xa9, + 0x00, 0x08, 0x90, 0x80, 0x00, 0x06, 0x20, 0xa0, 0xbb, 0xc8, 0x93, 0x98, + 0x00, 0x06, 0x23, 0x98, 0x08, 0x0c, 0x0f, 0x8b, 0x00, 0x9e, 0xa8, 0x7b, + 0x00, 0x00, 0xa8, 0x83, 0x00, 0x00, 0xa8, 0x97, 0x40, 0x00, 0xd6, 0x84, + 0x11, 0x68, 0x08, 0x0c, 0x57, 0xd5, 0xd0, 0xb4, 0x11, 0x18, 0xa8, 0x9b, + 0x00, 0x0b, 0x00, 0xe0, 0xb8, 0x00, 0xd0, 0x8c, 0x01, 0x18, 0xa8, 0x9b, + 0x00, 0x0c, 0x00, 0xb0, 0x08, 0x0c, 0x6a, 0xa3, 0x01, 0x18, 0xa8, 0x9b, + 0x00, 0x09, 0x00, 0x80, 0x08, 0x0c, 0x57, 0xe9, 0x01, 0x18, 0xa8, 0x9b, + 0x00, 0x07, 0x00, 0x50, 0x08, 0x0c, 0xd2, 0xa3, 0x19, 0x04, 0x64, 0xe4, + 0x20, 0x09, 0x00, 0x03, 0x20, 0x01, 0x40, 0x05, 0x08, 0x04, 0x64, 0xaf, + 0xa8, 0x7b, 0x00, 0x30, 0xa8, 0x97, 0x40, 0x05, 0xa8, 0x04, 0x80, 0x06, + 0x80, 0x06, 0x80, 0x07, 0x90, 0xbc, 0x00, 0x3f, 0x90, 0x84, 0xff, 0xc0, + 0x90, 0x80, 0x00, 0x02, 0x20, 0x09, 0x00, 0x2b, 0xaa, 0xa0, 0xab, 0x9c, + 0xac, 0xa8, 0xad, 0xa4, 0x20, 0x31, 0x00, 0x00, 0x20, 0x41, 0x12, 0x52, + 0x08, 0x0c, 0xb7, 0xf1, 0x19, 0x04, 0x64, 0xe4, 0x20, 0x09, 0x00, 0x02, + 0x08, 0xe8, 0x20, 0x01, 0x00, 0x28, 0x90, 0x0e, 0x08, 0x04, 0x64, 0xe5, + 0x20, 0x09, 0x18, 0x0c, 0x21, 0x0c, 0xd1, 0x8c, 0x01, 0x18, 0x20, 0x01, + 0x00, 0x04, 0x00, 0x38, 0xd1, 0x84, 0x01, 0x18, 0x20, 0x01, 0x00, 0x04, + 0x00, 0x10, 0x20, 0x01, 0x00, 0x29, 0x90, 0x0e, 0x08, 0x04, 0x64, 0xe5, + 0x20, 0x01, 0x00, 0x29, 0x90, 0x0e, 0x08, 0x04, 0x64, 0xe5, 0x08, 0x0c, + 0x37, 0xe9, 0x08, 0x04, 0x64, 0xe6, 0x08, 0x0c, 0x55, 0x00, 0x08, 0x04, + 0x64, 0xe6, 0x08, 0x0c, 0x46, 0x37, 0x08, 0x04, 0x64, 0xe6, 0x08, 0x0c, + 0x46, 0xb0, 0x08, 0x04, 0x64, 0xe6, 0x08, 0x0c, 0x47, 0x0c, 0x08, 0x04, + 0x64, 0xe6, 0x08, 0x0c, 0x4b, 0xba, 0x08, 0x04, 0x64, 0xe6, 0x08, 0x0c, + 0x4e, 0x82, 0x08, 0x04, 0x64, 0xe6, 0x08, 0x0c, 0x51, 0x67, 0x08, 0x04, + 0x64, 0xe6, 0x08, 0x0c, 0x53, 0x60, 0x08, 0x04, 0x64, 0xe6, 0x08, 0x0c, + 0x3a, 0x25, 0x08, 0x04, 0x64, 0xe6, 0x00, 0xb6, 0xa9, 0x74, 0xae, 0x78, + 0x96, 0x84, 0x3f, 0xff, 0x90, 0x82, 0x40, 0x00, 0x16, 0x18, 0x91, 0x82, + 0x08, 0x00, 0x12, 0x68, 0x91, 0x88, 0x10, 0x00, 0x21, 0x04, 0x90, 0x5d, + 0x01, 0x40, 0x08, 0x0c, 0x6a, 0xa3, 0x11, 0x48, 0x00, 0xe9, 0x08, 0x0c, + 0x68, 0x4f, 0x90, 0x06, 0x00, 0xb0, 0x20, 0x01, 0x00, 0x28, 0x90, 0x0e, + 0x00, 0x90, 0x90, 0x82, 0x00, 0x06, 0x12, 0x40, 0xb9, 0x00, 0xd1, 0xfc, + 0x0d, 0x88, 0x20, 0x01, 0x00, 0x29, 0x20, 0x09, 0x10, 0x00, 0x00, 0x38, + 0x20, 0x01, 0x00, 0x29, 0x90, 0x0e, 0x00, 0x18, 0x20, 0x01, 0x00, 0x29, + 0x90, 0x0e, 0x90, 0x05, 0x00, 0xbe, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0xb8, 0x50, 0x90, 0x0d, 0x01, 0x50, 0x29, 0x00, 0x00, 0x96, + 0x21, 0x48, 0xa8, 0x02, 0x00, 0x9e, 0xa8, 0x03, 0x00, 0x00, 0xb8, 0x52, + 0x01, 0x2e, 0x00, 0x05, 0x29, 0x00, 0xb8, 0x52, 0xb8, 0x4e, 0xa8, 0x03, + 0x00, 0x00, 0x0c, 0xc0, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0xb8, 0x4c, + 0x90, 0x05, 0x01, 0x70, 0x00, 0xe6, 0x20, 0x71, 0x19, 0xe8, 0x70, 0x04, + 0x90, 0x86, 0x00, 0x02, 0x01, 0x68, 0x00, 0xee, 0xb8, 0x4c, 0xa8, 0x02, + 0x29, 0x00, 0xb8, 0x4e, 0x01, 0x2e, 0x00, 0x05, 0x29, 0x00, 0xb8, 0x52, + 0xb8, 0x4e, 0xa8, 0x03, 0x00, 0x00, 0x0c, 0xc0, 0x70, 0x1c, 0x9b, 0x06, + 0x1d, 0x80, 0xb8, 0x4c, 0x00, 0xa6, 0x20, 0x50, 0xb0, 0x00, 0xa8, 0x02, + 0x29, 0x00, 0xb0, 0x02, 0x00, 0xae, 0x00, 0xee, 0x01, 0x2e, 0x00, 0x05, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0xb8, 0x4c, 0x90, 0x4d, 0x01, 0x30, + 0xa8, 0x00, 0x90, 0x05, 0x11, 0x08, 0xb8, 0x52, 0xb8, 0x4e, 0x99, 0x05, + 0x01, 0x2e, 0x00, 0x05, 0xb8, 0x4c, 0x90, 0x4d, 0x01, 0x30, 0xa8, 0x00, + 0x90, 0x05, 0x11, 0x08, 0xb8, 0x52, 0xb8, 0x4e, 0x99, 0x05, 0x00, 0x05, + 0x00, 0xb6, 0x01, 0x26, 0x00, 0xc6, 0x00, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x62, 0x10, 0x22, 0x58, 0xba, 0x00, 0x90, 0x05, 0x01, 0x10, 0xc2, 0x85, + 0x00, 0x08, 0xc2, 0x84, 0xba, 0x02, 0x00, 0x2e, 0x00, 0xce, 0x01, 0x2e, + 0x00, 0xbe, 0x00, 0x05, 0x00, 0xb6, 0x01, 0x26, 0x00, 0xc6, 0x20, 0x91, + 0x80, 0x00, 0x62, 0x10, 0x22, 0x58, 0xba, 0x04, 0x00, 0x06, 0x90, 0x86, + 0x00, 0x06, 0x11, 0x70, 0xb8, 0x9c, 0xd0, 0xac, 0x01, 0x58, 0x08, 0x0c, + 0x6a, 0x9f, 0x01, 0x40, 0x92, 0x84, 0xff, 0x00, 0x80, 0x07, 0x90, 0x86, + 0x00, 0x07, 0x11, 0x10, 0x20, 0x11, 0x06, 0x00, 0x00, 0x0e, 0x92, 0x94, + 0xff, 0x00, 0x92, 0x15, 0xba, 0x06, 0x00, 0x06, 0x90, 0x86, 0x00, 0x06, + 0x11, 0x20, 0xba, 0x90, 0x82, 0xff, 0x09, 0x0c, 0x0d, 0xc5, 0x00, 0x0e, + 0x00, 0xce, 0x01, 0x2e, 0x00, 0xbe, 0x00, 0x05, 0x00, 0xb6, 0x01, 0x26, + 0x00, 0xc6, 0x20, 0x91, 0x80, 0x00, 0x62, 0x10, 0x22, 0x58, 0xba, 0x04, + 0x00, 0x06, 0x90, 0x86, 0x00, 0x06, 0x11, 0x68, 0xb8, 0x9c, 0xd0, 0xa4, + 0x01, 0x50, 0x08, 0x0c, 0x6a, 0x9b, 0x11, 0x38, 0x92, 0x84, 0x00, 0xff, + 0x90, 0x86, 0x00, 0x07, 0x11, 0x10, 0x20, 0x11, 0x00, 0x06, 0x00, 0x0e, + 0x92, 0x94, 0x00, 0xff, 0x80, 0x07, 0x92, 0x15, 0xba, 0x06, 0x00, 0xce, + 0x01, 0x2e, 0x00, 0xbe, 0x00, 0x05, 0x91, 0x82, 0x08, 0x00, 0x02, 0x18, + 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x00, 0xd6, 0x00, 0x26, 0x91, 0x90, + 0x10, 0x00, 0x22, 0x04, 0x90, 0x5d, 0x11, 0x88, 0x00, 0x96, 0x08, 0x0c, + 0x10, 0x0e, 0x29, 0x58, 0x00, 0x9e, 0x01, 0x68, 0x2b, 0x00, 0x20, 0x12, + 0xb8, 0x5c, 0xb8, 0xca, 0xb8, 0x60, 0xb8, 0xc6, 0x90, 0x06, 0xb8, 0xa6, + 0xb8, 0xae, 0x08, 0x0c, 0x61, 0x48, 0x90, 0x06, 0x00, 0x10, 0x90, 0x85, + 0x00, 0x01, 0x00, 0x2e, 0x00, 0xde, 0x00, 0x05, 0x00, 0xb6, 0x00, 0x96, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0x26, 0x91, 0x82, 0x08, 0x00, + 0x02, 0x18, 0x90, 0x85, 0x00, 0x01, 0x04, 0xa8, 0x00, 0xd6, 0x91, 0x90, + 0x10, 0x00, 0x22, 0x04, 0x90, 0x5d, 0x05, 0x68, 0x20, 0x13, 0x00, 0x00, + 0xb8, 0xa4, 0x90, 0x4d, 0x01, 0x10, 0x08, 0x0c, 0x10, 0x40, 0x00, 0xd6, + 0x00, 0xc6, 0xb8, 0xbc, 0x20, 0x60, 0x8c, 0xff, 0x01, 0x68, 0x60, 0x0c, + 0x00, 0x06, 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0x10, + 0x08, 0x0c, 0x0f, 0xc0, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0xce, 0x0c, 0x88, + 0x00, 0xce, 0x00, 0xde, 0x00, 0xc6, 0xb8, 0xac, 0x90, 0x65, 0x01, 0x28, + 0x62, 0x1c, 0xd2, 0xc4, 0x01, 0x10, 0x08, 0x0c, 0x90, 0x96, 0x00, 0xce, + 0x2b, 0x48, 0xb8, 0xc8, 0xb8, 0x5e, 0xb8, 0xc4, 0xb8, 0x62, 0x08, 0x0c, + 0x10, 0x50, 0x00, 0xde, 0x90, 0x06, 0x00, 0x2e, 0x01, 0x2e, 0x00, 0x9e, + 0x00, 0xbe, 0x00, 0x05, 0x00, 0x16, 0x91, 0x82, 0x08, 0x00, 0x02, 0x18, + 0x90, 0x85, 0x00, 0x01, 0x00, 0x30, 0x91, 0x88, 0x10, 0x00, 0x21, 0x04, + 0x90, 0x5d, 0x0d, 0xc0, 0x90, 0x06, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xd6, + 0x01, 0x56, 0x01, 0x36, 0x01, 0x46, 0x90, 0x06, 0xb8, 0x0a, 0xb8, 0x0e, + 0xb8, 0x00, 0xc0, 0x8c, 0xb8, 0x02, 0x08, 0x0c, 0x76, 0x37, 0x15, 0x10, + 0xb8, 0xa0, 0x90, 0x86, 0x00, 0x7e, 0x01, 0x20, 0x08, 0x0c, 0xb2, 0x3d, + 0x11, 0xd8, 0x00, 0x78, 0x70, 0x40, 0xd0, 0xe4, 0x01, 0xb8, 0x00, 0xc6, + 0x20, 0x61, 0x19, 0x82, 0x70, 0x48, 0x20, 0x62, 0x70, 0x4c, 0x60, 0x06, + 0x70, 0x50, 0x60, 0x0a, 0x70, 0x54, 0x60, 0x0e, 0x00, 0xce, 0x70, 0x3c, + 0x20, 0x69, 0x01, 0x40, 0x90, 0x05, 0x11, 0x10, 0x20, 0x01, 0x00, 0x01, + 0x68, 0x86, 0x20, 0x69, 0x18, 0x00, 0x68, 0xb6, 0x70, 0x40, 0xb8, 0x5e, + 0x70, 0x48, 0xb8, 0x62, 0x70, 0x4c, 0xb8, 0x66, 0x20, 0xe1, 0x00, 0x00, + 0x20, 0x99, 0x02, 0x76, 0xb8, 0xc4, 0x20, 0xe8, 0xb8, 0xc8, 0x90, 0x88, + 0x00, 0x0a, 0x21, 0xa0, 0x20, 0xa9, 0x00, 0x04, 0x40, 0x03, 0x20, 0x99, + 0x02, 0x7a, 0x90, 0x88, 0x00, 0x06, 0x21, 0xa0, 0x20, 0xa9, 0x00, 0x04, + 0x40, 0x03, 0x20, 0x69, 0x02, 0x00, 0x68, 0x17, 0x00, 0x01, 0x70, 0x40, + 0xb8, 0x6a, 0x71, 0x44, 0xb9, 0x6e, 0x70, 0x48, 0xb8, 0x72, 0x70, 0x50, + 0xb8, 0x76, 0x20, 0x69, 0x02, 0x00, 0x68, 0x17, 0x00, 0x00, 0xb8, 0xa0, + 0x90, 0x86, 0x00, 0x7e, 0x11, 0x10, 0x71, 0x44, 0xb9, 0x6e, 0x91, 0x82, + 0x02, 0x11, 0x12, 0x18, 0x20, 0x09, 0x00, 0x08, 0x04, 0x00, 0x91, 0x82, + 0x02, 0x59, 0x12, 0x18, 0x20, 0x09, 0x00, 0x07, 0x00, 0xd0, 0x91, 0x82, + 0x02, 0xc1, 0x12, 0x18, 0x20, 0x09, 0x00, 0x06, 0x00, 0xa0, 0x91, 0x82, + 0x03, 0x49, 0x12, 0x18, 0x20, 0x09, 0x00, 0x05, 0x00, 0x70, 0x91, 0x82, + 0x04, 0x21, 0x12, 0x18, 0x20, 0x09, 0x00, 0x04, 0x00, 0x40, 0x91, 0x82, + 0x05, 0x81, 0x12, 0x18, 0x20, 0x09, 0x00, 0x03, 0x00, 0x10, 0x20, 0x09, + 0x00, 0x02, 0xb9, 0x92, 0x01, 0x4e, 0x01, 0x3e, 0x01, 0x5e, 0x00, 0xde, + 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, 0x00, 0xe6, 0x20, 0x71, 0x02, 0x60, + 0x70, 0x34, 0xb8, 0x96, 0x70, 0x3c, 0xb8, 0x9a, 0x70, 0x54, 0xb8, 0x9e, + 0x00, 0x36, 0xbb, 0xcc, 0xc3, 0x84, 0xba, 0x00, 0x20, 0x09, 0x18, 0x67, + 0x21, 0x0c, 0xd0, 0xbc, 0x01, 0x20, 0xd1, 0xec, 0x01, 0x10, 0xc2, 0xad, + 0x00, 0x08, 0xc2, 0xac, 0xd0, 0xc4, 0x01, 0x48, 0xd1, 0xe4, 0x01, 0x38, + 0xc2, 0xbd, 0xd0, 0xcc, 0x01, 0x28, 0xd3, 0x8c, 0x11, 0x08, 0xc3, 0x85, + 0x00, 0x08, 0xc2, 0xbc, 0xba, 0x02, 0xbb, 0xce, 0x00, 0x3e, 0x00, 0xee, + 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0x96, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0xb8, 0xa4, 0x90, 0x4d, 0x05, 0x78, 0xa9, 0x00, 0x81, 0xff, + 0x15, 0xc0, 0xaa, 0x04, 0x92, 0x82, 0x00, 0x10, 0x16, 0xc8, 0x01, 0x36, + 0x01, 0x46, 0x01, 0xc6, 0x01, 0xd6, 0x89, 0x06, 0x80, 0x06, 0x80, 0x07, + 0x90, 0x8c, 0x00, 0x3f, 0x21, 0xe0, 0x90, 0x84, 0xff, 0xc0, 0x90, 0x80, + 0x00, 0x04, 0x20, 0x98, 0x20, 0x09, 0x00, 0x10, 0x20, 0xa9, 0x00, 0x01, + 0x40, 0x02, 0x90, 0x86, 0xff, 0xff, 0x01, 0x20, 0x81, 0x09, 0x1d, 0xd0, + 0x08, 0x0c, 0x0d, 0xc5, 0x3c, 0x00, 0x20, 0xe8, 0x33, 0x00, 0x80, 0x01, + 0x20, 0xa0, 0x46, 0x04, 0x82, 0x10, 0xaa, 0x06, 0x01, 0xde, 0x01, 0xce, + 0x01, 0x4e, 0x01, 0x3e, 0x00, 0x60, 0x08, 0x0c, 0x10, 0x0e, 0x01, 0x70, + 0x29, 0x00, 0xb8, 0xa6, 0xa8, 0x03, 0x00, 0x00, 0x08, 0x0c, 0x68, 0xe0, + 0xa8, 0x07, 0x00, 0x01, 0xae, 0x12, 0x90, 0x85, 0x00, 0x01, 0x01, 0x2e, + 0x00, 0x9e, 0x00, 0x05, 0x90, 0x06, 0x0c, 0xd8, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x00, 0x96, 0xb8, 0xa4, 0x90, 0x4d, 0x01, 0x88, 0xa8, 0x00, + 0x90, 0x05, 0x11, 0x50, 0x08, 0x0c, 0x68, 0xef, 0x11, 0x58, 0xa8, 0x04, + 0x90, 0x8a, 0x00, 0x02, 0x02, 0x18, 0x80, 0x01, 0xa8, 0x06, 0x00, 0x20, + 0x08, 0x0c, 0x10, 0x40, 0xb8, 0xa7, 0x00, 0x00, 0x00, 0x9e, 0x01, 0x2e, + 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x95, 0x1c, + 0x01, 0x2e, 0x00, 0x05, 0x90, 0x1e, 0x00, 0x10, 0x20, 0x19, 0x00, 0x01, + 0x90, 0x0e, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0xb8, 0x4c, 0x20, 0x48, + 0xb8, 0x00, 0xd0, 0xdc, 0x11, 0x70, 0x89, 0xff, 0x05, 0x00, 0x83, 0xff, + 0x01, 0x20, 0xa8, 0x78, 0x96, 0x06, 0x01, 0x58, 0x00, 0x30, 0xa8, 0x6c, + 0x94, 0x06, 0x11, 0x18, 0xa8, 0x70, 0x95, 0x06, 0x01, 0x20, 0x29, 0x08, + 0xa8, 0x00, 0x20, 0x48, 0x0c, 0x70, 0x08, 0x0c, 0xaa, 0xf1, 0xaa, 0x00, + 0xb8, 0x4c, 0x99, 0x06, 0x11, 0x10, 0xba, 0x4e, 0x00, 0x20, 0x00, 0xa6, + 0x21, 0x50, 0xb2, 0x02, 0x00, 0xae, 0x82, 0xff, 0x11, 0x10, 0xb9, 0x52, + 0x89, 0xff, 0x01, 0x2e, 0x00, 0x05, 0x90, 0x16, 0x04, 0x89, 0x11, 0x10, + 0x20, 0x11, 0x00, 0x01, 0x00, 0x05, 0x08, 0x0c, 0x69, 0x44, 0x01, 0x28, + 0x08, 0x0c, 0xd1, 0x95, 0x00, 0x10, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, + 0x08, 0x0c, 0x69, 0x44, 0x01, 0x28, 0x08, 0x0c, 0xd1, 0x3a, 0x00, 0x10, + 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x08, 0x0c, 0x69, 0x44, 0x01, 0x28, + 0x08, 0x0c, 0xd1, 0x92, 0x00, 0x10, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, + 0x08, 0x0c, 0x69, 0x44, 0x01, 0x28, 0x08, 0x0c, 0xd1, 0x59, 0x00, 0x10, + 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x08, 0x0c, 0x69, 0x44, 0x01, 0x28, + 0x08, 0x0c, 0xd1, 0xd8, 0x00, 0x10, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, + 0xb8, 0xa4, 0x90, 0x0d, 0x11, 0x18, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, + 0x01, 0x36, 0x01, 0xc6, 0xa8, 0x00, 0x90, 0x05, 0x11, 0xb8, 0x89, 0x0e, + 0x81, 0x0e, 0x81, 0x0f, 0x91, 0x84, 0x00, 0x3f, 0x20, 0xe0, 0x91, 0x84, + 0xff, 0xc0, 0x90, 0x80, 0x00, 0x04, 0x20, 0x98, 0x20, 0xa9, 0x00, 0x01, + 0x20, 0x09, 0x00, 0x10, 0x40, 0x02, 0x96, 0x06, 0x01, 0x28, 0x81, 0x09, + 0x1d, 0xd8, 0x90, 0x85, 0x00, 0x01, 0x00, 0x08, 0x90, 0x06, 0x01, 0xce, + 0x01, 0x3e, 0x00, 0x05, 0x01, 0x46, 0x01, 0xd6, 0xa8, 0x60, 0x20, 0xe8, + 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x04, 0x20, 0xa0, 0x20, 0xa9, 0x00, 0x10, + 0x20, 0x09, 0xff, 0xff, 0x41, 0x04, 0x01, 0xde, 0x01, 0x4e, 0x01, 0x36, + 0x01, 0xc6, 0xa8, 0x00, 0x90, 0x05, 0x11, 0xb8, 0x89, 0x0e, 0x81, 0x0e, + 0x81, 0x0f, 0x91, 0x84, 0x00, 0x3f, 0x20, 0xe0, 0x91, 0x84, 0xff, 0xc0, + 0x90, 0x80, 0x00, 0x04, 0x20, 0x98, 0x20, 0xa9, 0x00, 0x01, 0x20, 0x09, + 0x00, 0x10, 0x40, 0x02, 0x96, 0x06, 0x01, 0x28, 0x81, 0x09, 0x1d, 0xd8, + 0x90, 0x85, 0x00, 0x01, 0x00, 0x68, 0x01, 0x46, 0x01, 0xd6, 0x33, 0x00, + 0x80, 0x01, 0x20, 0xa0, 0x3c, 0x00, 0x20, 0xe8, 0x20, 0x01, 0xff, 0xff, + 0x40, 0x04, 0x01, 0xde, 0x01, 0x4e, 0x90, 0x06, 0x01, 0xce, 0x01, 0x3e, + 0x00, 0x05, 0x00, 0x96, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0xb8, 0xa4, + 0x90, 0x4d, 0x11, 0x28, 0x08, 0x0c, 0x10, 0x0e, 0x01, 0x68, 0x29, 0x00, + 0xb8, 0xa6, 0x08, 0x0c, 0x68, 0xe0, 0xa8, 0x03, 0x00, 0x01, 0xa8, 0x07, + 0x00, 0x00, 0x90, 0x85, 0x00, 0x01, 0x01, 0x2e, 0x00, 0x9e, 0x00, 0x05, + 0x90, 0x06, 0x0c, 0xd8, 0x00, 0x96, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0xb8, 0xa4, 0x90, 0x4d, 0x01, 0x30, 0xb8, 0xa7, 0x00, 0x00, 0x08, 0x0c, + 0x10, 0x40, 0x90, 0x85, 0x00, 0x01, 0x01, 0x2e, 0x00, 0x9e, 0x00, 0x05, + 0xb8, 0x9c, 0xd0, 0xa4, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xf6, 0x08, 0x0c, + 0x76, 0x37, 0x01, 0xb0, 0x71, 0xc4, 0x81, 0xff, 0x11, 0x98, 0x71, 0xdc, + 0xd1, 0x9c, 0x01, 0x80, 0x20, 0x01, 0x00, 0x7e, 0x90, 0x80, 0x10, 0x00, + 0x20, 0x04, 0x90, 0x5d, 0x01, 0x48, 0xb8, 0x04, 0x90, 0x84, 0x00, 0xff, + 0x90, 0x86, 0x00, 0x06, 0x11, 0x18, 0xb8, 0x00, 0xc0, 0xed, 0xb8, 0x02, + 0x20, 0x79, 0x18, 0x47, 0x78, 0x04, 0xd0, 0xa4, 0x01, 0xd0, 0x01, 0x56, + 0x20, 0xa9, 0x00, 0x7f, 0x90, 0x0e, 0x00, 0x16, 0x08, 0x0c, 0x67, 0x24, + 0x11, 0x68, 0xb8, 0x04, 0x90, 0x84, 0xff, 0x00, 0x80, 0x07, 0x90, 0x96, + 0x00, 0x04, 0x01, 0x18, 0x90, 0x86, 0x00, 0x06, 0x11, 0x18, 0xb8, 0x00, + 0xc0, 0xed, 0xb8, 0x02, 0x00, 0x1e, 0x81, 0x08, 0x1f, 0x04, 0x69, 0x6b, + 0x01, 0x5e, 0x08, 0x0c, 0x6a, 0x61, 0x01, 0x20, 0x20, 0x01, 0x19, 0x85, + 0x20, 0x0c, 0x00, 0x98, 0x20, 0x79, 0x18, 0x47, 0x78, 0x04, 0xd0, 0xa4, + 0x01, 0x90, 0x20, 0x09, 0x07, 0xd0, 0x20, 0x01, 0x18, 0x2c, 0x20, 0x04, + 0x90, 0x05, 0x01, 0x38, 0x20, 0x01, 0x18, 0x67, 0x20, 0x04, 0xd0, 0xe4, + 0x01, 0x10, 0x20, 0x09, 0x5d, 0xc0, 0x20, 0x11, 0x69, 0xa2, 0x08, 0x0c, + 0x88, 0xd5, 0x00, 0xfe, 0x00, 0xbe, 0x00, 0x05, 0x00, 0xb6, 0x20, 0x11, + 0x69, 0xa2, 0x08, 0x0c, 0x88, 0x3d, 0x08, 0x0c, 0x6a, 0x61, 0x01, 0xd8, + 0x20, 0x01, 0x10, 0x7e, 0x20, 0x04, 0x20, 0x58, 0xb9, 0x00, 0xc1, 0xec, + 0xb9, 0x02, 0x08, 0x0c, 0x6a, 0x9f, 0x01, 0x30, 0x20, 0x09, 0x07, 0xd0, + 0x20, 0x11, 0x69, 0xa2, 0x08, 0x0c, 0x88, 0xd5, 0x00, 0xe6, 0x20, 0x71, + 0x18, 0x00, 0x90, 0x06, 0x70, 0x7e, 0x70, 0x60, 0x70, 0x82, 0x08, 0x0c, + 0x30, 0x00, 0x00, 0xee, 0x04, 0xb0, 0x01, 0x56, 0x00, 0xc6, 0x20, 0xa9, + 0x00, 0x7f, 0x90, 0x0e, 0x00, 0x16, 0x08, 0x0c, 0x67, 0x24, 0x15, 0x38, + 0xb8, 0x00, 0xd0, 0xec, 0x05, 0x20, 0x00, 0x46, 0xba, 0xa0, 0x22, 0x20, + 0x90, 0x06, 0x20, 0x09, 0x00, 0x29, 0x08, 0x0c, 0xec, 0x31, 0xb8, 0x00, + 0xc0, 0xe5, 0xc0, 0xec, 0xb8, 0x02, 0x08, 0x0c, 0x6a, 0x9b, 0x20, 0x01, + 0x07, 0x07, 0x11, 0x28, 0xb8, 0x04, 0x90, 0x84, 0x00, 0xff, 0x90, 0x85, + 0x07, 0x00, 0xb8, 0x06, 0x20, 0x19, 0x00, 0x29, 0x08, 0x0c, 0x96, 0xa4, + 0x00, 0x76, 0x90, 0x3e, 0x08, 0x0c, 0x95, 0x77, 0x90, 0x0e, 0x08, 0x0c, + 0xe9, 0x1c, 0x00, 0x7e, 0x00, 0x4e, 0x00, 0x1e, 0x81, 0x08, 0x1f, 0x04, + 0x69, 0xca, 0x00, 0xce, 0x01, 0x5e, 0x00, 0xbe, 0x00, 0x05, 0x00, 0xb6, + 0x60, 0x10, 0x20, 0x58, 0xb8, 0x00, 0xc0, 0xec, 0xb8, 0x02, 0x00, 0xbe, + 0x00, 0x05, 0x00, 0xb6, 0x00, 0xc6, 0x00, 0x96, 0x08, 0x0c, 0x10, 0x27, + 0x09, 0x0c, 0x0d, 0xc5, 0x29, 0x58, 0x00, 0x9e, 0x20, 0x01, 0x19, 0x6b, + 0x2b, 0x02, 0x8b, 0x07, 0x80, 0x06, 0x80, 0x06, 0x90, 0x8c, 0x00, 0x3f, + 0xb9, 0xc6, 0x90, 0x8c, 0xff, 0xc0, 0xb9, 0xca, 0xb8, 0xaf, 0x00, 0x00, + 0x20, 0x09, 0x00, 0xff, 0x08, 0x0c, 0x61, 0x48, 0xb8, 0x07, 0x00, 0x06, + 0xb8, 0x13, 0x00, 0xff, 0xb8, 0x17, 0xff, 0xff, 0xb8, 0x6f, 0x02, 0x00, + 0xb8, 0x6c, 0xb8, 0x93, 0x00, 0x02, 0xb8, 0xbb, 0x05, 0x20, 0xb8, 0xa3, + 0x00, 0xff, 0xb8, 0xaf, 0x00, 0x00, 0x00, 0xce, 0x00, 0xbe, 0x00, 0x05, + 0x78, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x00, 0x00, 0xbe, 0xd0, 0xac, + 0x00, 0x05, 0x60, 0x10, 0x00, 0xb6, 0x90, 0x5d, 0x01, 0x08, 0xb8, 0x00, + 0x00, 0xbe, 0xd0, 0xbc, 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, 0x00, 0x26, + 0xb8, 0x04, 0x90, 0x8c, 0x00, 0xff, 0x91, 0x96, 0x00, 0x06, 0x01, 0x88, + 0x91, 0x96, 0x00, 0x04, 0x01, 0x70, 0x91, 0x96, 0x00, 0x05, 0x01, 0x58, + 0x90, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0x91, 0x96, 0x00, 0x06, 0x01, 0x28, + 0x91, 0x96, 0x00, 0x04, 0x01, 0x10, 0x91, 0x96, 0x00, 0x05, 0x00, 0x2e, + 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xf6, 0x20, 0x01, + 0x10, 0x7e, 0x20, 0x04, 0x90, 0x5d, 0x01, 0x10, 0xb8, 0x00, 0xd0, 0xec, + 0x00, 0xfe, 0x00, 0xbe, 0x00, 0x05, 0x01, 0x26, 0x00, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x00, 0x06, 0xba, 0xa0, 0x92, 0x90, 0x10, 0x00, 0x22, 0x04, + 0x9b, 0x06, 0x19, 0x0c, 0x0d, 0xc5, 0x00, 0x0e, 0xba, 0x00, 0x90, 0x05, + 0x01, 0x10, 0xc2, 0xfd, 0x00, 0x08, 0xc2, 0xfc, 0xba, 0x02, 0x00, 0x2e, + 0x01, 0x2e, 0x00, 0x05, 0x20, 0x11, 0x18, 0x37, 0x22, 0x04, 0xd0, 0xcc, + 0x01, 0x38, 0x20, 0x01, 0x19, 0x83, 0x20, 0x0c, 0x20, 0x11, 0x6a, 0x91, + 0x08, 0x0c, 0x88, 0xd5, 0x00, 0x05, 0x20, 0x11, 0x6a, 0x91, 0x08, 0x0c, + 0x88, 0x3d, 0x20, 0x11, 0x18, 0x37, 0x22, 0x04, 0xc0, 0xcc, 0x20, 0x12, + 0x00, 0x05, 0x08, 0x0c, 0x57, 0xd5, 0xd0, 0xac, 0x00, 0x05, 0x08, 0x0c, + 0x57, 0xd5, 0xd0, 0xa4, 0x00, 0x05, 0x00, 0x16, 0xb9, 0x04, 0x91, 0x84, + 0x00, 0xff, 0x90, 0x8e, 0x00, 0x06, 0x00, 0x1e, 0x00, 0x05, 0x00, 0x16, + 0xb9, 0x04, 0x91, 0x84, 0xff, 0x00, 0x80, 0x07, 0x90, 0x8e, 0x00, 0x06, + 0x00, 0x1e, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xf6, 0x08, 0x0c, 0xd7, 0xe3, + 0x01, 0x58, 0x70, 0xdc, 0x90, 0x84, 0x00, 0x28, 0x01, 0x38, 0x20, 0x01, + 0x10, 0x7f, 0x20, 0x04, 0x90, 0x5d, 0x01, 0x10, 0xb8, 0xcc, 0xd0, 0x94, + 0x00, 0xfe, 0x00, 0xbe, 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, 0x00, 0x36, + 0x00, 0x46, 0x00, 0x76, 0x00, 0xb6, 0x20, 0x01, 0x18, 0x18, 0x20, 0x3c, + 0x97, 0x80, 0x33, 0xb6, 0x20, 0x3d, 0x97, 0xbc, 0xff, 0x00, 0x87, 0x3f, + 0x90, 0x06, 0x20, 0x18, 0x20, 0x08, 0x92, 0x84, 0x80, 0x00, 0x01, 0x10, + 0x20, 0x19, 0x00, 0x01, 0x92, 0x94, 0x7f, 0xff, 0x21, 0x00, 0x97, 0x06, + 0x01, 0x90, 0x91, 0xa0, 0x10, 0x00, 0x24, 0x04, 0x90, 0x5d, 0x01, 0x68, + 0xb8, 0x04, 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x06, 0x11, 0x38, + 0x83, 0xff, 0x01, 0x18, 0xb8, 0x9c, 0xd0, 0xa4, 0x01, 0x10, 0x82, 0x11, + 0x01, 0x58, 0x81, 0x08, 0x83, 0xff, 0x01, 0x20, 0x91, 0x82, 0x08, 0x00, + 0x0e, 0x28, 0x00, 0x68, 0x91, 0x82, 0x00, 0x7e, 0x0e, 0x08, 0x00, 0x48, + 0x00, 0xbe, 0x00, 0x7e, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0x1e, 0x90, 0x85, + 0x00, 0x01, 0x00, 0x0e, 0x00, 0x05, 0x00, 0xbe, 0x00, 0x7e, 0x00, 0x4e, + 0x00, 0x3e, 0x00, 0x1e, 0x90, 0x06, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x46, + 0x00, 0x56, 0x00, 0x76, 0x00, 0xb6, 0x21, 0x00, 0x90, 0x84, 0x7f, 0xff, + 0x90, 0x80, 0x10, 0x00, 0x20, 0x04, 0x90, 0x5d, 0x01, 0x30, 0xb8, 0x04, + 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x06, 0x05, 0x50, 0x91, 0x84, + 0x80, 0x00, 0x05, 0x80, 0x20, 0x01, 0x18, 0x18, 0x20, 0x3c, 0x97, 0x80, + 0x33, 0xb6, 0x20, 0x3d, 0x97, 0xbc, 0xff, 0x00, 0x87, 0x3f, 0x90, 0x06, + 0x20, 0x20, 0x24, 0x00, 0x97, 0x06, 0x01, 0xa0, 0x94, 0xa8, 0x10, 0x00, + 0x25, 0x04, 0x90, 0x5d, 0x01, 0x78, 0xb8, 0x04, 0x90, 0x84, 0x00, 0xff, + 0x90, 0x86, 0x00, 0x06, 0x11, 0x48, 0xb8, 0x9c, 0xd0, 0xa4, 0x01, 0x30, + 0xb8, 0x14, 0x92, 0x06, 0x11, 0x18, 0xb8, 0x10, 0x93, 0x06, 0x01, 0x28, + 0x84, 0x20, 0x94, 0x82, 0x08, 0x00, 0x0e, 0x28, 0x00, 0x48, 0x91, 0x8c, + 0x7f, 0xff, 0x00, 0xbe, 0x00, 0x7e, 0x00, 0x5e, 0x00, 0x4e, 0x90, 0x85, + 0x00, 0x01, 0x00, 0x05, 0x91, 0x8c, 0x7f, 0xff, 0x00, 0xbe, 0x00, 0x7e, + 0x00, 0x5e, 0x00, 0x4e, 0x90, 0x06, 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, + 0x00, 0xa0, 0x80, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0x1d, 0xd8, + 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0x00, 0xf8, 0x80, 0x01, + 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0x1d, 0xd8, 0x00, 0x0e, 0x00, 0x05, + 0x00, 0x06, 0x20, 0x01, 0x00, 0xe8, 0x80, 0x01, 0xa0, 0x01, 0xa0, 0x01, + 0xa0, 0x01, 0x1d, 0xd8, 0x00, 0x0e, 0x00, 0x05, 0x20, 0x71, 0x19, 0x10, + 0x70, 0x03, 0x00, 0x01, 0x70, 0x07, 0x00, 0x00, 0x90, 0x06, 0x70, 0x12, + 0x70, 0x16, 0x70, 0x1a, 0x70, 0x1e, 0x70, 0x0a, 0x70, 0x46, 0x20, 0x01, + 0x19, 0x22, 0x20, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x16, 0x00, 0xe6, + 0x20, 0x71, 0x19, 0x48, 0x90, 0x0e, 0x71, 0x0a, 0x08, 0x0c, 0x57, 0xd5, + 0xd0, 0xfc, 0x11, 0x40, 0x08, 0x0c, 0x57, 0xd5, 0x90, 0x0e, 0xd0, 0x9c, + 0x01, 0x08, 0x81, 0x08, 0x71, 0x02, 0x04, 0x70, 0x20, 0x01, 0x18, 0x67, + 0x20, 0x0c, 0x91, 0x84, 0x00, 0x07, 0x00, 0x06, 0x20, 0x01, 0x18, 0x0d, + 0x20, 0x04, 0xd0, 0x8c, 0x00, 0x0e, 0x01, 0x08, 0x90, 0x06, 0x00, 0x02, + 0x6b, 0x98, 0x6b, 0x98, 0x6b, 0x98, 0x6b, 0x98, 0x6b, 0x98, 0x6b, 0xb6, + 0x6b, 0xcb, 0x6b, 0xd9, 0x70, 0x03, 0x00, 0x03, 0x20, 0x09, 0x18, 0x68, + 0x21, 0x0c, 0x91, 0x84, 0xff, 0x00, 0x90, 0x8e, 0xff, 0x00, 0x01, 0x40, + 0x80, 0x07, 0x90, 0x05, 0x11, 0x10, 0x20, 0x01, 0x00, 0x02, 0x80, 0x03, + 0x70, 0x06, 0x00, 0x30, 0x70, 0x07, 0x00, 0x01, 0x00, 0x18, 0x70, 0x03, + 0x00, 0x05, 0x0c, 0x50, 0x20, 0x71, 0x19, 0x10, 0x70, 0x4f, 0x00, 0x00, + 0x20, 0x71, 0x18, 0x00, 0x70, 0xf3, 0x00, 0x01, 0x00, 0xee, 0x00, 0x1e, + 0x00, 0x05, 0x70, 0x03, 0x00, 0x00, 0x20, 0x71, 0x19, 0x10, 0x20, 0x09, + 0x18, 0x68, 0x21, 0x0c, 0x91, 0x84, 0x7f, 0x00, 0x80, 0x07, 0x90, 0x8c, + 0x00, 0x0f, 0x01, 0x60, 0x71, 0x4e, 0x80, 0x04, 0x80, 0x04, 0x80, 0x04, + 0x80, 0x04, 0x20, 0x71, 0x18, 0x00, 0x90, 0x8c, 0x00, 0x07, 0x01, 0x28, + 0x70, 0xf2, 0x0c, 0x20, 0x70, 0x4f, 0x00, 0x0f, 0x0c, 0x90, 0x70, 0xf3, + 0x00, 0x05, 0x08, 0xf0, 0x00, 0xe6, 0x20, 0x71, 0x00, 0x50, 0x68, 0x4c, + 0x90, 0x05, 0x11, 0x50, 0x00, 0xe6, 0x20, 0x71, 0x19, 0x10, 0x70, 0x28, + 0xc0, 0x85, 0x70, 0x2a, 0x00, 0xee, 0x90, 0x85, 0x00, 0x01, 0x04, 0x88, + 0x68, 0x44, 0x90, 0x05, 0x01, 0x58, 0x08, 0x0c, 0x79, 0xa4, 0x6a, 0x60, + 0x92, 0x00, 0x70, 0x02, 0x68, 0x64, 0x91, 0x01, 0x70, 0x06, 0x90, 0x06, + 0x70, 0x12, 0x70, 0x16, 0x68, 0x60, 0x70, 0x02, 0x68, 0x64, 0x70, 0x06, + 0x68, 0x68, 0x70, 0x0a, 0x68, 0x6c, 0x70, 0x0e, 0x68, 0x44, 0x90, 0x05, + 0x11, 0x10, 0x70, 0x12, 0x70, 0x16, 0x68, 0x4c, 0x70, 0x1a, 0x70, 0x1c, + 0x90, 0x85, 0x00, 0x40, 0x70, 0x1e, 0x70, 0x37, 0x00, 0x19, 0x70, 0x2b, + 0x00, 0x01, 0x00, 0xe6, 0x20, 0x71, 0x19, 0x10, 0x70, 0x28, 0xc0, 0x84, + 0x70, 0x2a, 0x70, 0x07, 0x00, 0x01, 0x70, 0x0b, 0x00, 0x00, 0x00, 0xee, + 0x90, 0x06, 0x00, 0xee, 0x00, 0x05, 0x00, 0xe6, 0x00, 0x26, 0x20, 0x71, + 0x19, 0x48, 0x70, 0x00, 0x90, 0x15, 0x09, 0x04, 0x6e, 0xa5, 0x92, 0x86, + 0x00, 0x03, 0x09, 0x04, 0x6d, 0x3e, 0x92, 0x86, 0x00, 0x05, 0x09, 0x04, + 0x6d, 0x3e, 0x20, 0x71, 0x18, 0x77, 0xa8, 0x7c, 0x90, 0x05, 0x09, 0x04, + 0x6c, 0x99, 0x71, 0x40, 0xa8, 0x68, 0x91, 0x02, 0x0a, 0x04, 0x6e, 0xa5, + 0xa8, 0x78, 0xd0, 0x84, 0x15, 0xd8, 0xa8, 0x53, 0x00, 0x19, 0x20, 0x01, + 0x80, 0x23, 0xa8, 0x4e, 0x20, 0x71, 0x19, 0x10, 0x70, 0x1c, 0x90, 0x05, + 0x19, 0x04, 0x70, 0x73, 0x0e, 0x04, 0x70, 0xe1, 0x20, 0x71, 0x00, 0x00, + 0xa8, 0x50, 0x70, 0x32, 0xa8, 0x4c, 0x70, 0x82, 0xa8, 0x70, 0x70, 0x86, + 0xa8, 0x6c, 0x70, 0x8a, 0xa8, 0x80, 0x70, 0x8e, 0x70, 0x36, 0x01, 0x46, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0xc6, 0x01, 0x56, 0x20, 0xe9, 0x00, 0x00, + 0x20, 0xa1, 0x00, 0x2a, 0xa8, 0x68, 0x20, 0xa8, 0xa8, 0x60, 0x20, 0xe0, + 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x21, 0x20, 0x98, 0x40, 0x03, 0x01, 0x5e, + 0x01, 0xce, 0x01, 0x3e, 0x01, 0xde, 0x01, 0x4e, 0x20, 0x91, 0x40, 0x80, + 0x20, 0x01, 0x00, 0x89, 0x20, 0x04, 0xd0, 0x84, 0x19, 0x0c, 0x11, 0xaa, + 0x08, 0x04, 0x6d, 0x21, 0xa8, 0x53, 0x00, 0x1b, 0x20, 0x01, 0x80, 0x27, + 0x08, 0x20, 0x70, 0x04, 0xd0, 0x8c, 0x19, 0x04, 0x6e, 0xa5, 0xa8, 0x53, + 0x00, 0x1a, 0x20, 0x01, 0x80, 0x24, 0x08, 0x04, 0x6c, 0x5d, 0x00, 0xe6, + 0x00, 0x26, 0x20, 0x71, 0x19, 0x48, 0x70, 0x00, 0x90, 0x15, 0x09, 0x04, + 0x6e, 0xa5, 0x92, 0x86, 0x00, 0x03, 0x09, 0x04, 0x6d, 0x3e, 0x92, 0x86, + 0x00, 0x05, 0x09, 0x04, 0x6d, 0x3e, 0xa8, 0x4f, 0x80, 0x22, 0xa8, 0x53, + 0x00, 0x18, 0x08, 0x04, 0x6d, 0x06, 0xa8, 0x68, 0xd0, 0xfc, 0x15, 0x08, + 0x00, 0xe6, 0x00, 0x26, 0x20, 0x01, 0x19, 0x48, 0x20, 0x04, 0x90, 0x15, + 0x09, 0x04, 0x6e, 0xa5, 0xa9, 0x78, 0xa8, 0x74, 0x91, 0x05, 0x19, 0x04, + 0x6e, 0xa5, 0x92, 0x86, 0x00, 0x03, 0x09, 0x04, 0x6d, 0x3e, 0x92, 0x86, + 0x00, 0x05, 0x09, 0x04, 0x6d, 0x3e, 0xa8, 0x7c, 0xd0, 0xbc, 0x19, 0x04, + 0x6e, 0xa5, 0x22, 0x00, 0x00, 0x02, 0x6e, 0xa5, 0x6d, 0x02, 0x6d, 0x3e, + 0x6d, 0x3e, 0x6e, 0xa5, 0x6d, 0x3e, 0x00, 0x05, 0xa8, 0x68, 0xd0, 0xfc, + 0x15, 0x00, 0x00, 0xe6, 0x00, 0x26, 0x20, 0x09, 0x19, 0x48, 0x21, 0x0c, + 0x81, 0xff, 0x09, 0x04, 0x6e, 0xa5, 0xa8, 0x80, 0x90, 0x84, 0x00, 0xff, + 0x90, 0x86, 0x00, 0x01, 0x19, 0x04, 0x6e, 0xa5, 0x91, 0x86, 0x00, 0x03, + 0x09, 0x04, 0x6d, 0x3e, 0x91, 0x86, 0x00, 0x05, 0x09, 0x04, 0x6d, 0x3e, + 0xa8, 0x7c, 0xd0, 0xcc, 0x09, 0x04, 0x6e, 0xa5, 0xa8, 0x4f, 0x80, 0x21, + 0xa8, 0x53, 0x00, 0x17, 0x00, 0x28, 0x00, 0x05, 0xa8, 0x4f, 0x80, 0x20, + 0xa8, 0x53, 0x00, 0x16, 0x20, 0x71, 0x19, 0x10, 0x70, 0x1c, 0x90, 0x05, + 0x19, 0x04, 0x70, 0x73, 0x0e, 0x04, 0x70, 0xe1, 0x20, 0x71, 0x00, 0x00, + 0xa8, 0x4c, 0x70, 0x82, 0xa8, 0x50, 0x70, 0x32, 0xa8, 0x6c, 0x70, 0x86, + 0x70, 0x36, 0xa8, 0x70, 0x70, 0x8a, 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, + 0x00, 0x89, 0x20, 0x04, 0xd0, 0x84, 0x19, 0x0c, 0x11, 0xaa, 0x20, 0x71, + 0x18, 0x00, 0x20, 0x11, 0x00, 0x01, 0xa8, 0x04, 0x90, 0x0d, 0x70, 0x2c, + 0x11, 0x58, 0xa8, 0x02, 0x29, 0x00, 0x70, 0x2e, 0x70, 0xc0, 0x92, 0x00, + 0x70, 0xc2, 0x08, 0x0c, 0x87, 0x25, 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, + 0x00, 0x96, 0x21, 0x48, 0xa9, 0x04, 0xa8, 0x02, 0x82, 0x10, 0x29, 0x00, + 0x81, 0xff, 0x1d, 0xc8, 0x00, 0x9e, 0x0c, 0x58, 0xa8, 0x4f, 0x00, 0x00, + 0x00, 0xf6, 0x20, 0x79, 0x00, 0x50, 0x20, 0x71, 0x19, 0x10, 0xa8, 0x03, + 0x00, 0x00, 0x70, 0x10, 0x90, 0x05, 0x19, 0x04, 0x6e, 0x29, 0x78, 0x2c, + 0x90, 0x8c, 0x07, 0x80, 0x19, 0x0c, 0x72, 0x2f, 0x80, 0x04, 0x80, 0x04, + 0x80, 0x04, 0x90, 0x84, 0x00, 0x03, 0x00, 0x02, 0x6d, 0x5c, 0x6e, 0x29, + 0x6d, 0x80, 0x6d, 0xc6, 0x08, 0x0c, 0x0d, 0xc5, 0x20, 0x71, 0x18, 0x00, + 0x29, 0x00, 0x78, 0x22, 0xa8, 0x04, 0x90, 0x0d, 0x11, 0x68, 0x20, 0x71, + 0x19, 0xfb, 0x70, 0x44, 0x90, 0x05, 0x13, 0x20, 0x20, 0x01, 0x19, 0x49, + 0x20, 0x04, 0x70, 0x46, 0x00, 0xfe, 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, + 0x90, 0x16, 0x70, 0x2c, 0x21, 0x48, 0xa9, 0x04, 0xa8, 0x02, 0x82, 0x10, + 0x29, 0x00, 0x81, 0xff, 0x1d, 0xc8, 0x70, 0x2e, 0x70, 0xc0, 0x92, 0x00, + 0x70, 0xc2, 0x08, 0x0c, 0x87, 0x25, 0x0c, 0x18, 0x20, 0x71, 0x18, 0x00, + 0x29, 0x00, 0x78, 0x22, 0xa8, 0x04, 0x90, 0x0d, 0x15, 0x78, 0x78, 0x24, + 0x00, 0xe6, 0x20, 0x71, 0x00, 0x40, 0x71, 0x2c, 0xd1, 0x9c, 0x11, 0x48, + 0x20, 0x09, 0x18, 0x30, 0x21, 0x0c, 0x91, 0x8a, 0x00, 0x20, 0x02, 0x18, + 0x70, 0x22, 0x00, 0xee, 0x00, 0x58, 0x00, 0xee, 0x20, 0x48, 0x70, 0x2c, + 0xa8, 0x02, 0x29, 0x00, 0x70, 0x2e, 0x70, 0xc0, 0x80, 0x00, 0x70, 0xc2, + 0x08, 0x0c, 0x87, 0x25, 0x78, 0x2c, 0x90, 0x94, 0x07, 0x80, 0x19, 0x0c, + 0x72, 0x2f, 0xd0, 0xa4, 0x19, 0xf0, 0x20, 0x71, 0x19, 0xfb, 0x70, 0x44, + 0x90, 0x05, 0x13, 0x20, 0x20, 0x01, 0x19, 0x49, 0x20, 0x04, 0x70, 0x46, + 0x00, 0xfe, 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x90, 0x16, 0x70, 0x2c, + 0x21, 0x48, 0xa9, 0x04, 0xa8, 0x02, 0x82, 0x10, 0x29, 0x00, 0x81, 0xff, + 0x1d, 0xc8, 0x70, 0x2e, 0x70, 0xc0, 0x92, 0x00, 0x70, 0xc2, 0x08, 0x0c, + 0x87, 0x25, 0x08, 0x08, 0x00, 0x96, 0x00, 0xe6, 0x78, 0x24, 0x20, 0x48, + 0x20, 0x71, 0x18, 0x00, 0x70, 0x2c, 0xa8, 0x02, 0x29, 0x00, 0x70, 0x2e, + 0x70, 0xc0, 0x80, 0x00, 0x70, 0xc2, 0x08, 0x0c, 0x87, 0x25, 0x78, 0x2c, + 0x90, 0x94, 0x07, 0x80, 0x19, 0x0c, 0x72, 0x2f, 0xd0, 0xa4, 0x1d, 0x60, + 0x00, 0xee, 0x78, 0x2c, 0x90, 0x94, 0x07, 0x80, 0x19, 0x0c, 0x72, 0x2f, + 0xd0, 0x9c, 0x11, 0x98, 0x00, 0x9e, 0x29, 0x00, 0x78, 0x22, 0xa8, 0x04, + 0x90, 0x0d, 0x15, 0x50, 0x20, 0x71, 0x19, 0xfb, 0x70, 0x44, 0x90, 0x05, + 0x13, 0x20, 0x20, 0x01, 0x19, 0x49, 0x20, 0x04, 0x70, 0x46, 0x00, 0xfe, + 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x00, 0x9e, 0x29, 0x08, 0x70, 0x10, + 0x80, 0x00, 0x70, 0x12, 0x70, 0x18, 0x90, 0x4d, 0x71, 0x1a, 0x01, 0x10, + 0xa9, 0x02, 0x00, 0x08, 0x71, 0x1e, 0x21, 0x48, 0xa8, 0x04, 0x90, 0x0d, + 0x11, 0x68, 0x20, 0x71, 0x19, 0xfb, 0x70, 0x44, 0x90, 0x05, 0x13, 0x20, + 0x20, 0x01, 0x19, 0x49, 0x20, 0x04, 0x70, 0x46, 0x00, 0xfe, 0x00, 0x2e, + 0x00, 0xee, 0x00, 0x05, 0x20, 0x71, 0x18, 0x00, 0x90, 0x16, 0x70, 0x2c, + 0x21, 0x48, 0xa9, 0x04, 0xa8, 0x02, 0x82, 0x10, 0x29, 0x00, 0x81, 0xff, + 0x1d, 0xc8, 0x70, 0x2e, 0x70, 0xc0, 0x92, 0x00, 0x70, 0xc2, 0x08, 0x0c, + 0x87, 0x25, 0x00, 0xfe, 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x29, 0x08, + 0x70, 0x10, 0x80, 0x00, 0x70, 0x12, 0x70, 0x18, 0x90, 0x4d, 0x71, 0x1a, + 0x01, 0x10, 0xa9, 0x02, 0x00, 0x08, 0x71, 0x1e, 0x21, 0x48, 0xa8, 0x04, + 0x90, 0x0d, 0x19, 0x04, 0x6e, 0x7d, 0x78, 0x2c, 0x90, 0x94, 0x07, 0x80, + 0x19, 0x0c, 0x72, 0x2f, 0xd0, 0x9c, 0x11, 0x98, 0x70, 0x1c, 0x90, 0x4d, + 0x01, 0x80, 0x70, 0x10, 0x80, 0x01, 0x70, 0x12, 0x11, 0x08, 0x70, 0x1a, + 0xa8, 0x00, 0x70, 0x1e, 0x29, 0x00, 0x78, 0x22, 0x78, 0x2c, 0x90, 0x94, + 0x07, 0x80, 0x19, 0x0c, 0x72, 0x2f, 0xd0, 0x9c, 0x0d, 0x68, 0x78, 0x2c, + 0x90, 0x94, 0x07, 0x80, 0x19, 0x0c, 0x72, 0x2f, 0xd0, 0xa4, 0x01, 0xb0, + 0x00, 0xe6, 0x78, 0x24, 0x20, 0x48, 0x20, 0x71, 0x18, 0x00, 0x70, 0x2c, + 0xa8, 0x02, 0x29, 0x00, 0x70, 0x2e, 0x70, 0xc0, 0x80, 0x00, 0x70, 0xc2, + 0x08, 0x0c, 0x87, 0x25, 0x78, 0x2c, 0x90, 0x94, 0x07, 0x80, 0x19, 0x0c, + 0x72, 0x2f, 0xd0, 0xa4, 0x1d, 0x60, 0x00, 0xee, 0x20, 0x71, 0x19, 0xfb, + 0x70, 0x44, 0x90, 0x05, 0x13, 0x20, 0x20, 0x01, 0x19, 0x49, 0x20, 0x04, + 0x70, 0x46, 0x00, 0xfe, 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x00, 0xe6, + 0x20, 0x71, 0x18, 0x00, 0x90, 0x16, 0x70, 0x2c, 0x21, 0x48, 0xa9, 0x04, + 0xa8, 0x02, 0x82, 0x10, 0x29, 0x00, 0x81, 0xff, 0x1d, 0xc8, 0x70, 0x2e, + 0x70, 0xc0, 0x92, 0x00, 0x70, 0xc2, 0x08, 0x0c, 0x87, 0x25, 0x00, 0xee, + 0x08, 0x04, 0x6e, 0x39, 0xa8, 0x68, 0xd0, 0xfc, 0x19, 0x04, 0x6e, 0xf3, + 0x00, 0x96, 0xa8, 0x04, 0xa8, 0x07, 0x00, 0x00, 0x90, 0x4d, 0x19, 0x0c, + 0x0f, 0xc0, 0x00, 0x9e, 0x00, 0x20, 0xa8, 0x68, 0xd0, 0xfc, 0x19, 0x04, + 0x6e, 0xf3, 0x00, 0xe6, 0x00, 0x26, 0xa8, 0x4f, 0x00, 0x00, 0x00, 0xf6, + 0x20, 0x79, 0x00, 0x50, 0x20, 0x71, 0x18, 0x00, 0x70, 0xec, 0x80, 0x01, + 0x05, 0x58, 0x1a, 0x04, 0x6e, 0xf0, 0x20, 0x71, 0x19, 0x10, 0xa8, 0x03, + 0x00, 0x00, 0xa8, 0x64, 0x90, 0x84, 0x00, 0xff, 0x90, 0x8e, 0x00, 0x16, + 0x01, 0xa8, 0x70, 0x10, 0x90, 0x05, 0x19, 0x04, 0x6f, 0xef, 0x78, 0x2c, + 0x90, 0x8c, 0x07, 0x80, 0x19, 0x0c, 0x72, 0x2f, 0x80, 0x04, 0x80, 0x04, + 0x80, 0x04, 0x90, 0x84, 0x00, 0x03, 0x00, 0x02, 0x6e, 0xf4, 0x6f, 0xef, + 0x6f, 0x0f, 0x6f, 0x80, 0x08, 0x0c, 0x0d, 0xc5, 0x20, 0x09, 0x19, 0x48, + 0x21, 0x04, 0x00, 0x02, 0x6e, 0xbb, 0x6e, 0xbb, 0x6e, 0xbb, 0x6d, 0x47, + 0x6e, 0xbb, 0x6d, 0x47, 0x70, 0xef, 0x0f, 0xa0, 0x71, 0xe8, 0x81, 0x07, + 0x91, 0x06, 0x90, 0x94, 0x00, 0xc0, 0x91, 0x84, 0xff, 0x3f, 0x92, 0x05, + 0x70, 0xea, 0x3b, 0x08, 0x3a, 0x00, 0x91, 0x04, 0x91, 0x8d, 0x00, 0xc0, + 0x21, 0xd8, 0x90, 0x84, 0xff, 0x3f, 0x92, 0x05, 0x20, 0xd0, 0x08, 0x08, + 0x70, 0xee, 0x08, 0x04, 0x6e, 0xb1, 0x00, 0x05, 0x20, 0x71, 0x18, 0x00, + 0x29, 0x00, 0x78, 0x22, 0xa8, 0x04, 0x90, 0x0d, 0x11, 0x20, 0x00, 0xfe, + 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x90, 0x16, 0x70, 0x2c, 0x21, 0x48, + 0xa9, 0x04, 0xa8, 0x02, 0x82, 0x10, 0x29, 0x00, 0x81, 0xff, 0x1d, 0xc8, + 0x70, 0x2e, 0x70, 0xc0, 0x92, 0x00, 0x70, 0xc2, 0x08, 0x0c, 0x87, 0x25, + 0x0c, 0x60, 0x20, 0x71, 0x18, 0x00, 0x29, 0x00, 0x78, 0x22, 0xa8, 0x04, + 0x90, 0x0d, 0x19, 0x04, 0x6f, 0x6f, 0x78, 0x30, 0x80, 0x07, 0x90, 0x8c, + 0x00, 0x1f, 0x70, 0xf0, 0x91, 0x02, 0x12, 0x20, 0x00, 0xfe, 0x00, 0x2e, + 0x00, 0xee, 0x00, 0x05, 0x78, 0x24, 0x00, 0xe6, 0x20, 0x71, 0x00, 0x40, + 0x71, 0x2c, 0xd1, 0x9c, 0x11, 0x48, 0x20, 0x09, 0x18, 0x30, 0x21, 0x0c, + 0x91, 0x8a, 0x00, 0x20, 0x02, 0x18, 0x70, 0x22, 0x00, 0xee, 0x00, 0x58, + 0x00, 0xee, 0x20, 0x48, 0x70, 0x2c, 0xa8, 0x02, 0x29, 0x00, 0x70, 0x2e, + 0x70, 0xc0, 0x80, 0x00, 0x70, 0xc2, 0x08, 0x0c, 0x87, 0x25, 0x78, 0x2c, + 0x90, 0x94, 0x07, 0x80, 0x19, 0x0c, 0x72, 0x2f, 0xd0, 0xa4, 0x19, 0xf0, + 0x0e, 0x04, 0x6f, 0x66, 0x78, 0x38, 0x79, 0x38, 0x91, 0x0e, 0x1d, 0xe0, + 0x00, 0xd6, 0x20, 0x69, 0x00, 0x00, 0x68, 0x36, 0x68, 0x33, 0x00, 0x13, + 0x00, 0xde, 0x20, 0x01, 0x19, 0x21, 0x20, 0x0c, 0xc1, 0x84, 0x21, 0x02, + 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, 0x00, 0x89, 0x20, 0x04, 0xd0, 0x84, + 0x19, 0x0c, 0x11, 0xaa, 0x20, 0x01, 0x19, 0x22, 0x20, 0x03, 0x00, 0x00, + 0x00, 0xfe, 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x20, 0x01, 0x19, 0x21, + 0x20, 0x0c, 0xc1, 0x85, 0x21, 0x02, 0x00, 0xfe, 0x00, 0x2e, 0x00, 0xee, + 0x00, 0x05, 0x90, 0x16, 0x70, 0x2c, 0x21, 0x48, 0xa9, 0x04, 0xa8, 0x02, + 0x82, 0x10, 0x29, 0x00, 0x81, 0xff, 0x1d, 0xc8, 0x70, 0x2e, 0x70, 0xc0, + 0x92, 0x00, 0x70, 0xc2, 0x08, 0x0c, 0x87, 0x25, 0x08, 0x04, 0x6f, 0x22, + 0x00, 0x96, 0x00, 0xe6, 0x78, 0x24, 0x20, 0x48, 0x20, 0x71, 0x18, 0x00, + 0x70, 0x2c, 0xa8, 0x02, 0x29, 0x00, 0x70, 0x2e, 0x70, 0xc0, 0x80, 0x00, + 0x70, 0xc2, 0x08, 0x0c, 0x87, 0x25, 0x78, 0x2c, 0x90, 0x94, 0x07, 0x80, + 0x19, 0x0c, 0x72, 0x2f, 0xd0, 0xa4, 0x1d, 0x60, 0x00, 0xee, 0x0e, 0x04, + 0x6f, 0xc2, 0x78, 0x38, 0x79, 0x38, 0x91, 0x0e, 0x1d, 0xe0, 0x00, 0xd6, + 0x20, 0x69, 0x00, 0x00, 0x68, 0x36, 0x68, 0x33, 0x00, 0x13, 0x00, 0xde, + 0x70, 0x44, 0xc0, 0x84, 0x70, 0x46, 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, + 0x00, 0x89, 0x20, 0x04, 0xd0, 0x84, 0x19, 0x0c, 0x11, 0xaa, 0x70, 0x4b, + 0x00, 0x00, 0x78, 0x2c, 0x90, 0x94, 0x07, 0x80, 0x19, 0x0c, 0x72, 0x2f, + 0xd0, 0x9c, 0x11, 0x70, 0x00, 0x9e, 0x29, 0x00, 0x78, 0x22, 0xa8, 0x04, + 0x90, 0x0d, 0x11, 0xe0, 0x00, 0xfe, 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, + 0x70, 0x44, 0xc0, 0x85, 0x70, 0x46, 0x0c, 0x58, 0x00, 0x9e, 0x29, 0x08, + 0x70, 0x10, 0x80, 0x00, 0x70, 0x12, 0x70, 0x18, 0x90, 0x4d, 0x71, 0x1a, + 0x01, 0x10, 0xa9, 0x02, 0x00, 0x08, 0x71, 0x1e, 0x21, 0x48, 0xa8, 0x04, + 0x90, 0x0d, 0x11, 0x20, 0x00, 0xfe, 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, + 0x20, 0x71, 0x18, 0x00, 0x90, 0x16, 0x70, 0x2c, 0x21, 0x48, 0xa9, 0x04, + 0xa8, 0x02, 0x82, 0x10, 0x29, 0x00, 0x81, 0xff, 0x1d, 0xc8, 0x70, 0x2e, + 0x70, 0xc0, 0x92, 0x00, 0x70, 0xc2, 0x08, 0x0c, 0x87, 0x25, 0x00, 0xfe, + 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x29, 0x08, 0x70, 0x10, 0x80, 0x00, + 0x70, 0x12, 0x70, 0x18, 0x90, 0x4d, 0x71, 0x1a, 0x01, 0x10, 0xa9, 0x02, + 0x00, 0x08, 0x71, 0x1e, 0x21, 0x48, 0xa8, 0x04, 0x90, 0x0d, 0x19, 0x04, + 0x70, 0x5e, 0x78, 0x2c, 0x90, 0x94, 0x07, 0x80, 0x19, 0x0c, 0x72, 0x2f, + 0xd0, 0x9c, 0x11, 0xb0, 0x70, 0x1c, 0x90, 0x4d, 0x01, 0x98, 0xa8, 0x4c, + 0x90, 0x05, 0x11, 0x80, 0x70, 0x10, 0x80, 0x01, 0x70, 0x12, 0x11, 0x08, + 0x70, 0x1a, 0xa8, 0x00, 0x70, 0x1e, 0x29, 0x00, 0x78, 0x22, 0x78, 0x2c, + 0x90, 0x94, 0x07, 0x80, 0x19, 0x0c, 0x72, 0x2f, 0xd0, 0x9c, 0x0d, 0x50, + 0x78, 0x2c, 0x90, 0x94, 0x07, 0x80, 0x19, 0x0c, 0x72, 0x2f, 0xd0, 0xa4, + 0x05, 0xb8, 0x00, 0xe6, 0x78, 0x24, 0x20, 0x48, 0x20, 0x71, 0x18, 0x00, + 0x70, 0x2c, 0xa8, 0x02, 0x29, 0x00, 0x70, 0x2e, 0x70, 0xc0, 0x80, 0x00, + 0x70, 0xc2, 0x08, 0x0c, 0x87, 0x25, 0x78, 0x2c, 0x90, 0x94, 0x07, 0x80, + 0x19, 0x0c, 0x72, 0x2f, 0xd0, 0xa4, 0x1d, 0x60, 0x00, 0xee, 0x0e, 0x04, + 0x70, 0x57, 0x78, 0x38, 0x79, 0x38, 0x91, 0x0e, 0x1d, 0xe0, 0x00, 0xd6, + 0x20, 0x69, 0x00, 0x00, 0x68, 0x36, 0x68, 0x33, 0x00, 0x13, 0x00, 0xde, + 0x70, 0x44, 0xc0, 0x84, 0x70, 0x46, 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, + 0x00, 0x89, 0x20, 0x04, 0xd0, 0x84, 0x19, 0x0c, 0x11, 0xaa, 0x70, 0x4b, + 0x00, 0x00, 0x00, 0xfe, 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x70, 0x44, + 0xc0, 0x85, 0x70, 0x46, 0x00, 0xfe, 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, + 0x00, 0xe6, 0x20, 0x71, 0x18, 0x00, 0x90, 0x16, 0x70, 0x2c, 0x21, 0x48, + 0xa9, 0x04, 0xa8, 0x02, 0x82, 0x10, 0x29, 0x00, 0x81, 0xff, 0x1d, 0xc8, + 0x70, 0x2e, 0x70, 0xc0, 0x92, 0x00, 0x70, 0xc2, 0x08, 0x0c, 0x87, 0x25, + 0x00, 0xee, 0x08, 0x04, 0x6f, 0xff, 0x20, 0x71, 0x19, 0x10, 0xa8, 0x03, + 0x00, 0x00, 0x29, 0x08, 0x70, 0x10, 0x80, 0x00, 0x70, 0x12, 0x70, 0x18, + 0x90, 0x4d, 0x71, 0x1a, 0x01, 0x10, 0xa9, 0x02, 0x00, 0x08, 0x71, 0x1e, + 0x21, 0x48, 0xa8, 0x04, 0x90, 0x0d, 0x11, 0x28, 0x1e, 0x04, 0x70, 0x9e, + 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x20, 0x71, 0x18, 0x00, 0x90, 0x16, + 0x70, 0x2c, 0x21, 0x48, 0xa9, 0x04, 0xa8, 0x02, 0x82, 0x10, 0x29, 0x00, + 0x81, 0xff, 0x1d, 0xc8, 0x70, 0x2e, 0x70, 0xc0, 0x92, 0x00, 0x70, 0xc2, + 0x08, 0x0c, 0x87, 0x25, 0x0e, 0x04, 0x70, 0x88, 0x20, 0x71, 0x19, 0x10, + 0x70, 0x1c, 0x20, 0x48, 0xa8, 0x4c, 0x90, 0x0d, 0x0d, 0x18, 0x20, 0x71, + 0x00, 0x00, 0x71, 0x82, 0xa8, 0x50, 0x70, 0x32, 0xa8, 0x6c, 0x70, 0x86, + 0x70, 0x36, 0xa8, 0x70, 0x70, 0x8a, 0xa8, 0x50, 0x90, 0x82, 0x00, 0x19, + 0x12, 0x78, 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, 0x00, 0x89, 0x20, 0x04, + 0xd0, 0x84, 0x19, 0x0c, 0x11, 0xaa, 0x20, 0x71, 0x19, 0x10, 0x08, 0x0c, + 0x72, 0x1b, 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, 0xa8, 0x50, 0x90, 0x82, + 0x00, 0x1c, 0x1e, 0x68, 0xa8, 0x80, 0x70, 0x8e, 0x70, 0x36, 0x01, 0x46, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0xc6, 0x01, 0x56, 0x20, 0xe9, 0x00, 0x00, + 0x20, 0xa1, 0x00, 0x2a, 0xa8, 0x68, 0x20, 0xa8, 0xa8, 0x60, 0x20, 0xe0, + 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x21, 0x20, 0x98, 0x40, 0x03, 0x01, 0x5e, + 0x01, 0xce, 0x01, 0x3e, 0x01, 0xde, 0x01, 0x4e, 0x08, 0x90, 0x20, 0x71, + 0x19, 0x10, 0xa8, 0x03, 0x00, 0x00, 0x29, 0x08, 0x70, 0x10, 0x80, 0x00, + 0x70, 0x12, 0x70, 0x18, 0x90, 0x4d, 0x71, 0x1a, 0x01, 0x10, 0xa9, 0x02, + 0x00, 0x08, 0x71, 0x1e, 0x21, 0x48, 0xa8, 0x04, 0x90, 0x0d, 0x11, 0x18, + 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x20, 0x71, 0x18, 0x00, 0x90, 0x16, + 0x70, 0x2c, 0x21, 0x48, 0xa9, 0x04, 0xa8, 0x02, 0x82, 0x10, 0x29, 0x00, + 0x81, 0xff, 0x1d, 0xc8, 0x70, 0x2e, 0x70, 0xc0, 0x92, 0x00, 0x70, 0xc2, + 0x08, 0x0c, 0x87, 0x25, 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x00, 0x06, + 0xa8, 0x7c, 0x00, 0x06, 0xa8, 0x67, 0x01, 0x03, 0x20, 0xa9, 0x00, 0x1c, + 0xa8, 0x60, 0x20, 0xe8, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x1d, 0x20, 0xa0, + 0x90, 0x06, 0x40, 0x04, 0x00, 0x0e, 0x90, 0x84, 0x00, 0xff, 0xa8, 0x7e, + 0x00, 0x0e, 0xa8, 0x7a, 0xa9, 0x82, 0x00, 0x05, 0x20, 0x71, 0x19, 0x10, + 0x70, 0x04, 0x00, 0x02, 0x71, 0x2e, 0x71, 0x2f, 0x72, 0x1a, 0x71, 0x2f, + 0x71, 0x2c, 0x72, 0x1a, 0x08, 0x0c, 0x0d, 0xc5, 0x00, 0x05, 0x20, 0x01, + 0x19, 0x48, 0x20, 0x04, 0x00, 0x02, 0x71, 0x39, 0x71, 0x39, 0x71, 0xb3, + 0x71, 0xb4, 0x71, 0x39, 0x71, 0xb4, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x1e, 0x0c, 0x72, 0x3a, 0x70, 0x1c, 0x90, 0x4d, 0x05, 0x08, 0xa8, 0x4c, + 0x90, 0x05, 0x09, 0x04, 0x71, 0x84, 0x0e, 0x04, 0x71, 0x62, 0xa9, 0x4c, + 0x20, 0x71, 0x00, 0x00, 0x71, 0x82, 0xa8, 0x50, 0x70, 0x32, 0xa8, 0x6c, + 0x70, 0x86, 0x70, 0x36, 0xa8, 0x70, 0x70, 0x8a, 0xa8, 0x50, 0x90, 0x82, + 0x00, 0x19, 0x12, 0x78, 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, 0x00, 0x89, + 0x20, 0x04, 0xd0, 0x84, 0x19, 0x0c, 0x11, 0xaa, 0x20, 0x71, 0x19, 0x10, + 0x08, 0x0c, 0x72, 0x1b, 0x01, 0x2e, 0x08, 0x04, 0x71, 0xb2, 0xa8, 0x50, + 0x90, 0x82, 0x00, 0x1c, 0x1e, 0x68, 0xa8, 0x80, 0x70, 0x8e, 0x70, 0x36, + 0x01, 0x46, 0x01, 0xd6, 0x01, 0x36, 0x01, 0xc6, 0x01, 0x56, 0x20, 0xe9, + 0x00, 0x00, 0x20, 0xa1, 0x00, 0x2a, 0xa8, 0x68, 0x20, 0xa8, 0xa8, 0x60, + 0x20, 0xe0, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x21, 0x20, 0x98, 0x40, 0x03, + 0x01, 0x5e, 0x01, 0xce, 0x01, 0x3e, 0x01, 0xde, 0x01, 0x4e, 0x08, 0x90, + 0x20, 0x01, 0x00, 0x5b, 0x20, 0x04, 0x90, 0x94, 0x07, 0x80, 0x19, 0x0c, + 0x72, 0x2f, 0xd0, 0x9c, 0x20, 0x71, 0x19, 0x10, 0x15, 0x10, 0x20, 0x71, + 0x19, 0x10, 0x70, 0x0f, 0x00, 0x01, 0xa9, 0x64, 0x91, 0x84, 0x00, 0xff, + 0x90, 0x86, 0x00, 0x03, 0x11, 0x30, 0x81, 0x0f, 0x91, 0x8c, 0x00, 0xff, + 0x81, 0x01, 0x01, 0x08, 0x71, 0x0e, 0x29, 0x00, 0x00, 0xd6, 0x20, 0x69, + 0x00, 0x50, 0x68, 0x22, 0x00, 0xde, 0x20, 0x71, 0x19, 0x10, 0x70, 0x1c, + 0x20, 0x48, 0x70, 0x10, 0x80, 0x01, 0x70, 0x12, 0xa8, 0x00, 0x70, 0x1e, + 0x90, 0x05, 0x11, 0x08, 0x70, 0x1a, 0x01, 0x2e, 0x00, 0x05, 0x00, 0x05, + 0x00, 0xd6, 0x20, 0x08, 0x20, 0x69, 0x19, 0xfb, 0x68, 0x44, 0x90, 0x05, + 0x07, 0x60, 0x01, 0x58, 0x91, 0x86, 0x00, 0x03, 0x05, 0x40, 0x20, 0x01, + 0x18, 0x15, 0x20, 0x04, 0x20, 0x09, 0x1a, 0xd1, 0x21, 0x0c, 0x91, 0x02, + 0x15, 0x00, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x69, 0x00, 0x50, + 0x69, 0x3c, 0x68, 0x38, 0x91, 0x06, 0x01, 0x90, 0x0e, 0x04, 0x71, 0xe6, + 0x20, 0x69, 0x00, 0x00, 0x68, 0x37, 0x80, 0x40, 0x68, 0x33, 0x00, 0x12, + 0x68, 0x83, 0x80, 0x40, 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, 0x00, 0x89, + 0x20, 0x04, 0xd0, 0x84, 0x19, 0x0c, 0x11, 0xaa, 0x20, 0x69, 0x19, 0xfb, + 0x68, 0x47, 0xff, 0xff, 0x01, 0x2e, 0x00, 0xde, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x1e, 0x0c, 0x72, 0xa5, 0x70, 0x1c, 0x90, 0x4d, 0x05, 0x40, + 0x20, 0x01, 0x00, 0x5b, 0x20, 0x04, 0x90, 0x94, 0x07, 0x80, 0x15, 0xc9, + 0xd0, 0x9c, 0x15, 0x00, 0x20, 0x71, 0x19, 0x10, 0x70, 0x0f, 0x00, 0x01, + 0xa9, 0x64, 0x91, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x03, 0x11, 0x30, + 0x81, 0x0f, 0x91, 0x8c, 0x00, 0xff, 0x81, 0x01, 0x01, 0x08, 0x71, 0x0e, + 0x29, 0x00, 0x00, 0xd6, 0x20, 0x69, 0x00, 0x50, 0x68, 0x22, 0x00, 0xde, + 0x70, 0x1c, 0x20, 0x48, 0x70, 0x10, 0x80, 0x01, 0x70, 0x12, 0xa8, 0x00, + 0x70, 0x1e, 0x90, 0x05, 0x11, 0x08, 0x70, 0x1a, 0x01, 0x2e, 0x00, 0x05, + 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x70, 0x1c, 0x90, 0x4d, + 0x01, 0x60, 0x70, 0x10, 0x80, 0x01, 0x70, 0x12, 0xa8, 0x00, 0x70, 0x1e, + 0x90, 0x05, 0x11, 0x08, 0x70, 0x1a, 0x01, 0x2e, 0x08, 0x0c, 0x10, 0x40, + 0x00, 0x05, 0x01, 0x2e, 0x00, 0x05, 0x20, 0x91, 0x80, 0x00, 0x0e, 0x04, + 0x72, 0x31, 0x00, 0x06, 0x00, 0x16, 0x20, 0x01, 0x80, 0x04, 0x00, 0x06, + 0x08, 0x04, 0x0d, 0xce, 0x00, 0x96, 0x00, 0xf6, 0x20, 0x79, 0x00, 0x50, + 0x70, 0x44, 0xd0, 0x84, 0x01, 0xd0, 0xc0, 0x84, 0x70, 0x46, 0x78, 0x38, + 0x79, 0x38, 0x91, 0x0e, 0x1d, 0xe0, 0x00, 0xd6, 0x20, 0x69, 0x00, 0x00, + 0x68, 0x36, 0x68, 0x33, 0x00, 0x13, 0x00, 0xde, 0x20, 0x91, 0x40, 0x80, + 0x20, 0x01, 0x00, 0x89, 0x20, 0x04, 0xd0, 0x84, 0x19, 0x0c, 0x11, 0xaa, + 0x70, 0x4b, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x9e, 0x00, 0x05, 0x78, 0x2c, + 0x90, 0x94, 0x07, 0x80, 0x19, 0x81, 0xd0, 0xa4, 0x0d, 0xb8, 0x71, 0x48, + 0x70, 0x4c, 0x81, 0x08, 0x71, 0x4a, 0x91, 0x02, 0x0e, 0x88, 0x00, 0xe6, + 0x20, 0x71, 0x18, 0x00, 0x78, 0x24, 0x00, 0xe6, 0x20, 0x71, 0x00, 0x40, + 0x71, 0x2c, 0xd1, 0x9c, 0x11, 0x48, 0x20, 0x09, 0x18, 0x30, 0x21, 0x0c, + 0x91, 0x8a, 0x00, 0x20, 0x02, 0x18, 0x70, 0x22, 0x00, 0xee, 0x00, 0x58, + 0x00, 0xee, 0x20, 0x48, 0x70, 0x2c, 0xa8, 0x02, 0x29, 0x00, 0x70, 0x2e, + 0x70, 0xc0, 0x80, 0x00, 0x70, 0xc2, 0x08, 0x0c, 0x87, 0x25, 0x78, 0x2c, + 0x90, 0x94, 0x07, 0x80, 0x19, 0x0c, 0x72, 0x2f, 0xd0, 0xa4, 0x19, 0xf0, + 0x78, 0x38, 0x79, 0x38, 0x91, 0x0e, 0x1d, 0xe0, 0x00, 0xd6, 0x20, 0x69, + 0x00, 0x00, 0x68, 0x36, 0x68, 0x33, 0x00, 0x13, 0x00, 0xde, 0x20, 0x91, + 0x40, 0x80, 0x20, 0x01, 0x00, 0x89, 0x20, 0x04, 0xd0, 0x84, 0x19, 0x0c, + 0x11, 0xaa, 0x00, 0xee, 0x70, 0x4b, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x9e, + 0x00, 0x05, 0x00, 0xf6, 0x20, 0x79, 0x00, 0x50, 0x70, 0x44, 0xd0, 0x84, + 0x01, 0xb8, 0xc0, 0x84, 0x70, 0x46, 0x78, 0x38, 0x79, 0x38, 0x91, 0x0e, + 0x1d, 0xe0, 0x00, 0xd6, 0x20, 0x69, 0x00, 0x00, 0x68, 0x36, 0x68, 0x33, + 0x00, 0x13, 0x00, 0xde, 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, 0x00, 0x89, + 0x20, 0x04, 0xd0, 0x84, 0x19, 0x0c, 0x11, 0xaa, 0x00, 0xfe, 0x00, 0x05, + 0x78, 0x2c, 0x90, 0x94, 0x07, 0x80, 0x19, 0x0c, 0x72, 0x2f, 0xd0, 0xa4, + 0x0d, 0xb8, 0x00, 0xe6, 0x20, 0x71, 0x18, 0x00, 0x78, 0x24, 0x20, 0x48, + 0x70, 0x2c, 0xa8, 0x02, 0x29, 0x00, 0x70, 0x2e, 0x70, 0xc0, 0x80, 0x00, + 0x70, 0xc2, 0x08, 0x0c, 0x87, 0x25, 0x78, 0x2c, 0x90, 0x94, 0x07, 0x80, + 0x19, 0x0c, 0x72, 0x2f, 0xd0, 0xa4, 0x1d, 0x70, 0x00, 0xd6, 0x20, 0x69, + 0x00, 0x50, 0x69, 0x3c, 0x20, 0x69, 0x19, 0x48, 0x68, 0x08, 0x69, 0x0a, + 0x20, 0x69, 0x19, 0xfb, 0x91, 0x02, 0x11, 0x18, 0x68, 0x44, 0x90, 0x05, + 0x13, 0x20, 0x20, 0x01, 0x19, 0x49, 0x20, 0x0c, 0x69, 0x46, 0x00, 0xde, + 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, 0x70, 0x98, 0x90, 0x8a, 0x00, 0x2a, + 0x1a, 0x0c, 0x0d, 0xc5, 0x90, 0x82, 0x00, 0x1d, 0x00, 0x1b, 0x60, 0x27, + 0x1e, 0x00, 0x00, 0x05, 0x73, 0xe6, 0x73, 0x53, 0x73, 0x6f, 0x73, 0x99, + 0x73, 0xd5, 0x74, 0x15, 0x74, 0x27, 0x73, 0x6f, 0x73, 0xfd, 0x73, 0x0e, + 0x73, 0x3c, 0x73, 0xbf, 0x73, 0x0d, 0x00, 0x05, 0x00, 0xd6, 0x20, 0x69, + 0x02, 0x00, 0x68, 0x04, 0x90, 0x05, 0x11, 0x80, 0x68, 0x08, 0x90, 0x05, + 0x15, 0x18, 0x70, 0x9b, 0x00, 0x29, 0x20, 0x69, 0x19, 0x8f, 0x2d, 0x04, + 0x70, 0x02, 0x08, 0x0c, 0x77, 0x74, 0x60, 0x28, 0x90, 0x85, 0x06, 0x00, + 0x60, 0x2a, 0x00, 0xb0, 0x70, 0x9b, 0x00, 0x29, 0x20, 0x69, 0x19, 0x8f, + 0x2d, 0x04, 0x70, 0x02, 0x60, 0x28, 0x90, 0x85, 0x06, 0x00, 0x60, 0x2a, + 0x00, 0xe6, 0x00, 0x36, 0x00, 0x46, 0x00, 0x56, 0x20, 0x71, 0x1a, 0x65, + 0x08, 0x0c, 0x1a, 0xd9, 0x00, 0x5e, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0xee, + 0x00, 0xde, 0x00, 0x05, 0x00, 0xd6, 0x20, 0x69, 0x02, 0x00, 0x68, 0x04, + 0x90, 0x05, 0x11, 0x78, 0x68, 0x08, 0x90, 0x05, 0x11, 0x60, 0x70, 0x9b, + 0x00, 0x29, 0x20, 0x69, 0x19, 0x8f, 0x2d, 0x04, 0x70, 0x02, 0x08, 0x0c, + 0x78, 0x18, 0x60, 0x28, 0x90, 0x85, 0x06, 0x00, 0x60, 0x2a, 0x00, 0xde, + 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0x00, 0x90, 0x08, 0x0c, 0x2d, 0x39, + 0x00, 0x0e, 0x61, 0x24, 0xd1, 0xe4, 0x11, 0x90, 0x08, 0x0c, 0x74, 0x94, + 0xd1, 0xd4, 0x11, 0x60, 0xd1, 0xdc, 0x11, 0x38, 0xd1, 0xcc, 0x01, 0x50, + 0x70, 0x9b, 0x00, 0x20, 0x08, 0x0c, 0x74, 0x94, 0x00, 0x28, 0x70, 0x9b, + 0x00, 0x1d, 0x00, 0x10, 0x70, 0x9b, 0x00, 0x1f, 0x00, 0x05, 0x20, 0x01, + 0x00, 0x88, 0x08, 0x0c, 0x2d, 0x39, 0x61, 0x24, 0xd1, 0xcc, 0x11, 0xe8, + 0xd1, 0xdc, 0x11, 0xc0, 0xd1, 0xe4, 0x11, 0x98, 0x91, 0x84, 0x1e, 0x00, + 0x11, 0xd8, 0x08, 0x0c, 0x1b, 0x06, 0x60, 0xe3, 0x00, 0x01, 0x60, 0x0c, + 0xc0, 0xb4, 0x60, 0x0e, 0x08, 0x0c, 0x76, 0x63, 0x20, 0x01, 0x00, 0x80, + 0x08, 0x0c, 0x2d, 0x39, 0x70, 0x9b, 0x00, 0x29, 0x00, 0x58, 0x70, 0x9b, + 0x00, 0x1e, 0x00, 0x40, 0x70, 0x9b, 0x00, 0x1d, 0x00, 0x28, 0x70, 0x9b, + 0x00, 0x20, 0x00, 0x10, 0x70, 0x9b, 0x00, 0x1f, 0x00, 0x05, 0x08, 0x0c, + 0x1b, 0x06, 0x60, 0xe3, 0x00, 0x01, 0x60, 0x0c, 0xc0, 0xb4, 0x60, 0x0e, + 0x08, 0x0c, 0x76, 0x63, 0x20, 0x01, 0x00, 0x80, 0x08, 0x0c, 0x2d, 0x39, + 0x61, 0x24, 0xd1, 0xd4, 0x11, 0x98, 0xd1, 0xdc, 0x11, 0x70, 0xd1, 0xe4, + 0x11, 0x48, 0x91, 0x84, 0x1e, 0x00, 0x11, 0x18, 0x70, 0x9b, 0x00, 0x29, + 0x00, 0x58, 0x70, 0x9b, 0x00, 0x28, 0x00, 0x40, 0x70, 0x9b, 0x00, 0x1e, + 0x00, 0x28, 0x70, 0x9b, 0x00, 0x1d, 0x00, 0x10, 0x70, 0x9b, 0x00, 0x1f, + 0x00, 0x05, 0x61, 0x24, 0xd1, 0xd4, 0x11, 0x80, 0xd1, 0xdc, 0x11, 0x58, + 0xd1, 0xe4, 0x11, 0x30, 0x91, 0x84, 0x1e, 0x00, 0x11, 0x58, 0x70, 0x9b, + 0x00, 0x29, 0x00, 0x40, 0x70, 0x9b, 0x00, 0x1e, 0x00, 0x28, 0x70, 0x9b, + 0x00, 0x1d, 0x00, 0x10, 0x70, 0x9b, 0x00, 0x1f, 0x00, 0x05, 0x20, 0x01, + 0x00, 0xa0, 0x08, 0x0c, 0x2d, 0x39, 0x61, 0x24, 0xd1, 0xdc, 0x11, 0x38, + 0xd1, 0xe4, 0x01, 0x38, 0x08, 0x0c, 0x1b, 0x06, 0x70, 0x9b, 0x00, 0x1e, + 0x00, 0x10, 0x70, 0x9b, 0x00, 0x1d, 0x00, 0x05, 0x08, 0x0c, 0x75, 0x17, + 0x61, 0x24, 0xd1, 0xdc, 0x11, 0x88, 0x08, 0x0c, 0x74, 0x94, 0x00, 0x16, + 0x08, 0x0c, 0x1b, 0x06, 0x00, 0x1e, 0xd1, 0xd4, 0x11, 0x28, 0xd1, 0xe4, + 0x01, 0x38, 0x70, 0x9b, 0x00, 0x1e, 0x00, 0x20, 0x70, 0x9b, 0x00, 0x1f, + 0x08, 0x0c, 0x74, 0x94, 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0x00, 0xa0, + 0x08, 0x0c, 0x2d, 0x39, 0x00, 0x0e, 0x61, 0x24, 0xd1, 0xd4, 0x11, 0x60, + 0xd1, 0xcc, 0x11, 0x50, 0xd1, 0xdc, 0x11, 0x28, 0xd1, 0xe4, 0x01, 0x40, + 0x70, 0x9b, 0x00, 0x1e, 0x00, 0x28, 0x70, 0x9b, 0x00, 0x1d, 0x00, 0x10, + 0x70, 0x9b, 0x00, 0x21, 0x00, 0x05, 0x08, 0x0c, 0x75, 0x17, 0x61, 0x24, + 0xd1, 0xd4, 0x11, 0x50, 0xd1, 0xdc, 0x11, 0x28, 0xd1, 0xe4, 0x01, 0x40, + 0x70, 0x9b, 0x00, 0x1e, 0x00, 0x28, 0x70, 0x9b, 0x00, 0x1d, 0x00, 0x10, + 0x70, 0x9b, 0x00, 0x1f, 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0x00, 0x90, + 0x08, 0x0c, 0x2d, 0x39, 0x00, 0x0e, 0x61, 0x24, 0xd1, 0xd4, 0x11, 0x78, + 0xd1, 0xcc, 0x11, 0x50, 0xd1, 0xdc, 0x11, 0x28, 0xd1, 0xe4, 0x01, 0x58, + 0x70, 0x9b, 0x00, 0x1e, 0x00, 0x40, 0x70, 0x9b, 0x00, 0x1d, 0x00, 0x28, + 0x70, 0x9b, 0x00, 0x20, 0x00, 0x10, 0x70, 0x9b, 0x00, 0x1f, 0x00, 0x05, + 0x00, 0x16, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x01, 0x26, 0x20, 0x61, + 0x01, 0x00, 0x20, 0x69, 0x01, 0x40, 0x20, 0x71, 0x18, 0x00, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0x76, 0x37, 0x11, 0xd8, 0x20, 0x01, 0x18, 0x0c, + 0x20, 0x0c, 0xd1, 0xb4, 0x01, 0xb0, 0xc1, 0xb4, 0x21, 0x02, 0x60, 0x27, + 0x02, 0x00, 0x08, 0x0c, 0x2c, 0x61, 0x60, 0x24, 0xd0, 0xcc, 0x01, 0x48, + 0x20, 0x01, 0x00, 0xa0, 0x08, 0x0c, 0x2d, 0x39, 0x08, 0x0c, 0x79, 0x32, + 0x08, 0x0c, 0x61, 0x2e, 0x04, 0x28, 0x60, 0x28, 0xc0, 0xcd, 0x60, 0x2a, + 0x04, 0x08, 0x08, 0x0c, 0x76, 0x51, 0x01, 0x50, 0x08, 0x0c, 0x76, 0x48, + 0x11, 0x38, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x28, 0x1c, 0x08, 0x0c, + 0x76, 0x0f, 0x00, 0xa0, 0x08, 0x0c, 0x75, 0x14, 0x01, 0x78, 0x20, 0x01, + 0x00, 0x01, 0x08, 0x0c, 0x28, 0x1c, 0x70, 0x98, 0x90, 0x86, 0x00, 0x1e, + 0x01, 0x20, 0x70, 0x98, 0x90, 0x86, 0x00, 0x22, 0x11, 0x18, 0x70, 0x9b, + 0x00, 0x25, 0x00, 0x10, 0x70, 0x9b, 0x00, 0x21, 0x01, 0x2e, 0x00, 0xee, + 0x00, 0xde, 0x00, 0xce, 0x00, 0x1e, 0x00, 0x05, 0x00, 0x26, 0x20, 0x11, + 0x74, 0xa5, 0x08, 0x0c, 0x89, 0x17, 0x00, 0x2e, 0x00, 0x16, 0x00, 0x26, + 0x20, 0x09, 0x00, 0x64, 0x20, 0x11, 0x74, 0xa5, 0x08, 0x0c, 0x89, 0x0e, + 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xe6, 0x00, 0xf6, 0x00, 0x16, + 0x08, 0x0c, 0xa6, 0xe9, 0x20, 0x71, 0x18, 0x00, 0x08, 0x0c, 0x74, 0x42, + 0x00, 0x1e, 0x00, 0xfe, 0x00, 0xee, 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, + 0x00, 0x36, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x00, 0xf6, 0x01, 0x26, + 0x20, 0x71, 0x18, 0x00, 0x08, 0x0c, 0xa6, 0xe9, 0x20, 0x61, 0x01, 0x00, + 0x20, 0x69, 0x01, 0x40, 0x20, 0x91, 0x80, 0x00, 0x60, 0x28, 0xc0, 0x9c, + 0x60, 0x2a, 0x20, 0x11, 0x00, 0x03, 0x08, 0x0c, 0xaa, 0xbf, 0x20, 0x11, + 0x00, 0x02, 0x08, 0x0c, 0xaa, 0xc9, 0x08, 0x0c, 0xa9, 0xd3, 0x08, 0x0c, + 0x88, 0xc3, 0x00, 0x36, 0x90, 0x1e, 0x08, 0x0c, 0xaa, 0x49, 0x00, 0x3e, + 0x60, 0xe3, 0x00, 0x00, 0x08, 0x0c, 0xf0, 0x7f, 0x08, 0x0c, 0xf0, 0x9a, + 0x20, 0x09, 0x00, 0x04, 0x08, 0x0c, 0x2c, 0x67, 0x08, 0x0c, 0x2b, 0x82, + 0x20, 0x01, 0x18, 0x00, 0x20, 0x03, 0x00, 0x04, 0x60, 0x27, 0x00, 0x08, + 0x20, 0x11, 0x74, 0xa5, 0x08, 0x0c, 0x89, 0x17, 0x08, 0x0c, 0x76, 0x51, + 0x01, 0x18, 0x90, 0x06, 0x08, 0x0c, 0x2d, 0x39, 0x08, 0x0c, 0x0b, 0xa0, + 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x28, 0x1c, 0x01, 0x2e, 0x00, 0xfe, + 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, + 0x00, 0x05, 0x00, 0x26, 0x00, 0xe6, 0x20, 0x11, 0x74, 0xb2, 0x20, 0x71, + 0x19, 0xfb, 0x70, 0x1c, 0x92, 0x06, 0x11, 0x18, 0x70, 0x18, 0x90, 0x05, + 0x01, 0x10, 0x90, 0x85, 0x00, 0x01, 0x00, 0xee, 0x00, 0x2e, 0x00, 0x05, + 0x60, 0x20, 0xd0, 0x9c, 0x00, 0x05, 0x68, 0x00, 0x90, 0x84, 0xff, 0xfe, + 0x90, 0x86, 0x00, 0xc0, 0x01, 0xb8, 0x20, 0x01, 0x00, 0xc0, 0x08, 0x0c, + 0x2d, 0x39, 0x01, 0x56, 0x20, 0xa9, 0x00, 0x2d, 0x1d, 0x04, 0x75, 0x24, + 0x20, 0x91, 0x60, 0x00, 0x1f, 0x04, 0x75, 0x24, 0x01, 0x5e, 0x00, 0xd6, + 0x20, 0x69, 0x18, 0x00, 0x68, 0x9c, 0x80, 0x01, 0x02, 0x20, 0x01, 0x18, + 0x68, 0x9e, 0x00, 0xde, 0x00, 0x05, 0x68, 0x9f, 0x00, 0x14, 0x68, 0xe8, + 0xd0, 0xdc, 0x0d, 0xc8, 0x68, 0x00, 0x90, 0x86, 0x00, 0x01, 0x1d, 0xa8, + 0x08, 0x0c, 0x89, 0x23, 0x0c, 0x90, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, + 0x20, 0x61, 0x01, 0x00, 0x20, 0x69, 0x01, 0x40, 0x20, 0x71, 0x18, 0x00, + 0x08, 0x0c, 0x79, 0x41, 0x20, 0x01, 0x19, 0x6d, 0x20, 0x03, 0x00, 0x00, + 0x90, 0x06, 0x70, 0x9a, 0x60, 0xe2, 0x68, 0x86, 0x08, 0x0c, 0x28, 0xe7, + 0x90, 0x06, 0x08, 0x0c, 0x2d, 0x39, 0x08, 0x0c, 0x5f, 0xed, 0x60, 0x27, + 0xff, 0xff, 0x60, 0x2b, 0x18, 0x2f, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, + 0x00, 0x05, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x20, 0x61, 0x01, 0x00, + 0x20, 0x69, 0x01, 0x40, 0x20, 0x71, 0x18, 0x00, 0x20, 0x01, 0x19, 0x7d, + 0x20, 0x0c, 0x91, 0x86, 0x00, 0x00, 0x01, 0x58, 0x91, 0x86, 0x00, 0x01, + 0x01, 0x58, 0x91, 0x86, 0x00, 0x02, 0x01, 0x58, 0x91, 0x86, 0x00, 0x03, + 0x01, 0x58, 0x08, 0x04, 0x75, 0xff, 0x70, 0x9b, 0x00, 0x22, 0x00, 0x40, + 0x70, 0x9b, 0x00, 0x21, 0x00, 0x28, 0x70, 0x9b, 0x00, 0x23, 0x00, 0x10, + 0x70, 0x9b, 0x00, 0x24, 0x60, 0xe3, 0x00, 0x00, 0x68, 0x87, 0x00, 0x01, + 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x28, 0xe7, 0x00, 0x26, 0x08, 0x0c, + 0xb2, 0x44, 0x00, 0x2e, 0x70, 0x00, 0x90, 0x8e, 0x00, 0x04, 0x01, 0x18, + 0x60, 0x2b, 0x00, 0x28, 0x00, 0x10, 0x60, 0x2b, 0x00, 0x20, 0x01, 0x56, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0xa9, 0x00, 0x05, 0x60, 0x24, + 0xd0, 0xac, 0x01, 0x50, 0x01, 0x2e, 0x01, 0x5e, 0x08, 0x0c, 0xd7, 0xe3, + 0x01, 0x18, 0x90, 0x06, 0x08, 0x0c, 0x2d, 0x63, 0x08, 0x04, 0x76, 0x0b, + 0x68, 0x00, 0x90, 0x84, 0x00, 0xa1, 0xc0, 0xbd, 0x68, 0x02, 0x08, 0x0c, + 0x2c, 0x61, 0x69, 0x04, 0xd1, 0xd4, 0x11, 0x40, 0x20, 0x01, 0x01, 0x00, + 0x08, 0x0c, 0x2d, 0x39, 0x1f, 0x04, 0x75, 0xa3, 0x08, 0x0c, 0x76, 0x8b, + 0x01, 0x2e, 0x01, 0x5e, 0x08, 0x0c, 0x76, 0x48, 0x01, 0xd8, 0x60, 0x44, + 0x90, 0x05, 0x01, 0x98, 0x20, 0x11, 0x01, 0x14, 0x22, 0x04, 0x90, 0x85, + 0x01, 0x00, 0x20, 0x12, 0x60, 0x50, 0x00, 0x06, 0x90, 0x85, 0x00, 0x20, + 0x60, 0x52, 0x08, 0x0c, 0x76, 0x8b, 0x90, 0x06, 0x80, 0x01, 0x1d, 0xf0, + 0x00, 0x0e, 0x60, 0x52, 0x00, 0x28, 0x68, 0x04, 0xd0, 0xd4, 0x11, 0x10, + 0x08, 0x0c, 0x76, 0x8b, 0x08, 0x0c, 0xd7, 0xe3, 0x01, 0x18, 0x90, 0x06, + 0x08, 0x0c, 0x2d, 0x63, 0x00, 0x16, 0x00, 0x26, 0x70, 0x00, 0x90, 0x8e, + 0x00, 0x04, 0x01, 0x30, 0x20, 0x09, 0x00, 0xc8, 0x20, 0x11, 0x74, 0xb2, + 0x08, 0x0c, 0x88, 0xd5, 0x00, 0x2e, 0x00, 0x1e, 0x08, 0x0c, 0x87, 0x1c, + 0x70, 0x34, 0xc0, 0x85, 0x70, 0x36, 0x20, 0x01, 0x19, 0x7d, 0x20, 0x03, + 0x00, 0x04, 0x08, 0x0c, 0x72, 0xf5, 0x08, 0x0c, 0x76, 0x48, 0x01, 0x38, + 0x68, 0x04, 0xd0, 0xd4, 0x11, 0x20, 0xd0, 0xdc, 0x11, 0x00, 0x08, 0x0c, + 0x79, 0x37, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x00, 0x05, 0x00, 0xc6, + 0x00, 0xd6, 0x00, 0xe6, 0x20, 0x61, 0x01, 0x00, 0x20, 0x69, 0x01, 0x40, + 0x20, 0x71, 0x18, 0x00, 0x08, 0x0c, 0x87, 0x33, 0x08, 0x0c, 0x87, 0x25, + 0x08, 0x0c, 0x79, 0x41, 0x20, 0x01, 0x19, 0x6d, 0x20, 0x03, 0x00, 0x00, + 0x90, 0x06, 0x70, 0x9a, 0x60, 0xe2, 0x68, 0x86, 0x08, 0x0c, 0x28, 0xe7, + 0x90, 0x06, 0x08, 0x0c, 0x2d, 0x39, 0x60, 0x43, 0x00, 0x90, 0x60, 0x43, + 0x00, 0x10, 0x60, 0x27, 0xff, 0xff, 0x60, 0x2b, 0x18, 0x2f, 0x00, 0xee, + 0x00, 0xde, 0x00, 0xce, 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0x19, 0x7c, + 0x20, 0x04, 0x90, 0x86, 0xaa, 0xaa, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, + 0x08, 0x0c, 0x57, 0xd9, 0x90, 0x84, 0x00, 0x30, 0x90, 0x86, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, 0x08, 0x0c, 0x57, 0xd9, 0x90, 0x84, + 0x00, 0x30, 0x90, 0x86, 0x00, 0x30, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, + 0x08, 0x0c, 0x57, 0xd9, 0x90, 0x84, 0x00, 0x30, 0x90, 0x86, 0x00, 0x10, + 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, 0x08, 0x0c, 0x57, 0xd9, 0x90, 0x84, + 0x00, 0x30, 0x90, 0x86, 0x00, 0x20, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x36, + 0x00, 0x16, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x04, 0x90, 0x8c, 0x00, 0x13, + 0x01, 0x68, 0x00, 0x20, 0x08, 0x0c, 0x29, 0x07, 0x90, 0x0e, 0x00, 0x10, + 0x20, 0x09, 0x00, 0x02, 0x20, 0x19, 0x00, 0x28, 0x08, 0x0c, 0x32, 0x1b, + 0x90, 0x06, 0x00, 0x19, 0x00, 0x1e, 0x00, 0x3e, 0x00, 0x05, 0x00, 0xe6, + 0x20, 0x71, 0x18, 0x0c, 0x2e, 0x04, 0x01, 0x30, 0x08, 0x0c, 0xd7, 0xdc, + 0x11, 0x28, 0x90, 0x85, 0x00, 0x10, 0x00, 0x10, 0x90, 0x84, 0xff, 0xef, + 0x20, 0x72, 0x00, 0xee, 0x00, 0x05, 0x60, 0x50, 0x00, 0x06, 0x60, 0xec, + 0x00, 0x06, 0x60, 0x0c, 0x00, 0x06, 0x60, 0x04, 0x00, 0x06, 0x60, 0x28, + 0x00, 0x06, 0x00, 0x16, 0x61, 0x38, 0x60, 0x50, 0x90, 0x84, 0xfb, 0xff, + 0x90, 0x85, 0x20, 0x00, 0x60, 0x52, 0x61, 0x3a, 0x20, 0xa9, 0x00, 0x12, + 0x1d, 0x04, 0x76, 0xa0, 0x20, 0x91, 0x60, 0x00, 0x1f, 0x04, 0x76, 0xa0, + 0x60, 0x2f, 0x01, 0x00, 0x60, 0x2f, 0x00, 0x00, 0x60, 0x50, 0x90, 0x85, + 0x04, 0x00, 0x90, 0x84, 0xdf, 0xff, 0x60, 0x52, 0x61, 0x3a, 0x00, 0x1e, + 0x60, 0x2f, 0x00, 0x40, 0x60, 0x2f, 0x00, 0x00, 0x00, 0x0e, 0x60, 0x2a, + 0x00, 0x0e, 0x60, 0x06, 0x00, 0x0e, 0x60, 0x0e, 0x00, 0x0e, 0x60, 0xee, + 0x60, 0xe3, 0x00, 0x00, 0x68, 0x87, 0x00, 0x01, 0x20, 0x01, 0x00, 0x01, + 0x08, 0x0c, 0x28, 0xe7, 0x20, 0x01, 0x00, 0xa0, 0x00, 0x06, 0x08, 0x0c, + 0xd7, 0xe3, 0x00, 0x0e, 0x01, 0x30, 0x08, 0x0c, 0x2d, 0x57, 0x90, 0x06, + 0x08, 0x0c, 0x2d, 0x63, 0x00, 0x10, 0x08, 0x0c, 0x2d, 0x39, 0x00, 0x0e, + 0x60, 0x52, 0x60, 0x50, 0x00, 0x06, 0xc0, 0xe5, 0x60, 0x52, 0x00, 0xf6, + 0x20, 0x79, 0x01, 0x00, 0x08, 0x0c, 0x2b, 0xd6, 0x00, 0xfe, 0x00, 0x0e, + 0x60, 0x52, 0x00, 0x05, 0x01, 0x56, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, + 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x20, 0x61, 0x01, 0x00, 0x20, 0x69, + 0x01, 0x40, 0x20, 0x71, 0x18, 0x00, 0x60, 0x20, 0x90, 0x84, 0x00, 0x80, + 0x01, 0x38, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x0c, 0xc1, 0xc5, 0x21, 0x02, + 0x08, 0x04, 0x77, 0x66, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x0c, 0xc1, 0xc4, + 0x21, 0x02, 0x60, 0x28, 0x90, 0x84, 0xe1, 0xff, 0x60, 0x2a, 0x60, 0x27, + 0x02, 0x00, 0x20, 0x01, 0x00, 0x90, 0x08, 0x0c, 0x2d, 0x39, 0x20, 0xa9, + 0x03, 0x66, 0x60, 0x24, 0xd0, 0xcc, 0x15, 0x18, 0x1d, 0x04, 0x77, 0x0d, + 0x20, 0x91, 0x60, 0x00, 0x1f, 0x04, 0x77, 0x0d, 0x20, 0x11, 0x00, 0x03, + 0x08, 0x0c, 0xaa, 0xbf, 0x20, 0x11, 0x00, 0x02, 0x08, 0x0c, 0xaa, 0xc9, + 0x08, 0x0c, 0xa9, 0xd3, 0x90, 0x1e, 0x08, 0x0c, 0xaa, 0x49, 0x20, 0x01, + 0x00, 0xa0, 0x08, 0x0c, 0x2d, 0x39, 0x08, 0x0c, 0x79, 0x32, 0x08, 0x0c, + 0x61, 0x2e, 0x08, 0x0c, 0xd7, 0xe3, 0x01, 0x10, 0x08, 0x0c, 0x0d, 0x33, + 0x90, 0x85, 0x00, 0x01, 0x04, 0xc8, 0x08, 0x0c, 0x1b, 0x06, 0x60, 0xe3, + 0x00, 0x00, 0x20, 0x01, 0x18, 0x0d, 0x20, 0x04, 0xd0, 0x8c, 0x20, 0x01, + 0x00, 0x02, 0x11, 0x18, 0x20, 0x01, 0x19, 0x6d, 0x20, 0x04, 0x08, 0x0c, + 0x28, 0xe7, 0x60, 0xe2, 0x20, 0x01, 0x00, 0x80, 0x08, 0x0c, 0x2d, 0x39, + 0x20, 0xa9, 0x03, 0x66, 0x60, 0x27, 0x1e, 0x00, 0x20, 0x09, 0x1e, 0x00, + 0x08, 0x0c, 0x2c, 0x61, 0x60, 0x24, 0x91, 0x0c, 0x01, 0x40, 0x1d, 0x04, + 0x77, 0x4a, 0x20, 0x91, 0x60, 0x00, 0x1f, 0x04, 0x77, 0x4a, 0x08, 0x04, + 0x77, 0x16, 0x60, 0x28, 0x90, 0x85, 0x1e, 0x00, 0x60, 0x2a, 0x70, 0xb4, + 0x90, 0x05, 0x11, 0x18, 0x68, 0x87, 0x00, 0x01, 0x00, 0x08, 0x68, 0x86, + 0x08, 0x0c, 0xd7, 0xe3, 0x01, 0x10, 0x08, 0x0c, 0x0d, 0x33, 0x90, 0x06, + 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, + 0x01, 0x5e, 0x00, 0x05, 0x01, 0x56, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, + 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x20, 0x61, 0x01, 0x00, 0x20, 0x71, + 0x18, 0x00, 0x70, 0x00, 0x90, 0x86, 0x00, 0x03, 0x11, 0x68, 0x20, 0x01, + 0x02, 0x0b, 0x20, 0x04, 0x90, 0x84, 0x55, 0x40, 0x90, 0x86, 0x55, 0x40, + 0x11, 0x28, 0x20, 0x69, 0x1a, 0x7c, 0x2d, 0x04, 0x80, 0x00, 0x20, 0x6a, + 0x20, 0x69, 0x01, 0x40, 0x60, 0x20, 0x90, 0x84, 0x00, 0xc0, 0x01, 0x20, + 0x68, 0x84, 0x90, 0x05, 0x19, 0x04, 0x77, 0xd9, 0x20, 0x01, 0x00, 0x88, + 0x08, 0x0c, 0x2d, 0x39, 0x90, 0x06, 0x60, 0xe2, 0x68, 0x86, 0x08, 0x0c, + 0x28, 0xe7, 0x20, 0x69, 0x02, 0x00, 0x68, 0x04, 0x90, 0x05, 0x11, 0x18, + 0x68, 0x08, 0x90, 0x05, 0x01, 0xc0, 0x60, 0x28, 0x90, 0x84, 0xfb, 0xff, + 0x60, 0x2a, 0x60, 0x27, 0x04, 0x00, 0x20, 0x69, 0x19, 0x8f, 0x70, 0x00, + 0x20, 0x6a, 0x70, 0x9b, 0x00, 0x26, 0x70, 0x03, 0x00, 0x01, 0x20, 0xa9, + 0x00, 0x02, 0x1d, 0x04, 0x77, 0xbb, 0x20, 0x91, 0x60, 0x00, 0x1f, 0x04, + 0x77, 0xbb, 0x08, 0x04, 0x78, 0x10, 0x20, 0x69, 0x01, 0x40, 0x20, 0xa9, + 0x03, 0x84, 0x60, 0x27, 0x1e, 0x00, 0x20, 0x09, 0x1e, 0x00, 0x08, 0x0c, + 0x2c, 0x61, 0x60, 0x24, 0x91, 0x0c, 0x05, 0x08, 0x90, 0x84, 0x1a, 0x00, + 0x11, 0xf0, 0x1d, 0x04, 0x77, 0xc7, 0x20, 0x91, 0x60, 0x00, 0x1f, 0x04, + 0x77, 0xc7, 0x20, 0x11, 0x00, 0x03, 0x08, 0x0c, 0xaa, 0xbf, 0x20, 0x11, + 0x00, 0x02, 0x08, 0x0c, 0xaa, 0xc9, 0x08, 0x0c, 0xa9, 0xd3, 0x90, 0x1e, + 0x08, 0x0c, 0xaa, 0x49, 0x20, 0x01, 0x00, 0xa0, 0x08, 0x0c, 0x2d, 0x39, + 0x08, 0x0c, 0x79, 0x32, 0x08, 0x0c, 0x61, 0x2e, 0x90, 0x85, 0x00, 0x01, + 0x00, 0xf8, 0x08, 0x0c, 0x1b, 0x06, 0x20, 0x01, 0x00, 0x80, 0x08, 0x0c, + 0x2d, 0x39, 0x20, 0x69, 0x01, 0x40, 0x60, 0xe3, 0x00, 0x00, 0x70, 0xb4, + 0x90, 0x05, 0x11, 0x18, 0x68, 0x87, 0x00, 0x01, 0x00, 0x08, 0x68, 0x86, + 0x20, 0x01, 0x18, 0x0d, 0x20, 0x04, 0xd0, 0x8c, 0x20, 0x01, 0x00, 0x02, + 0x11, 0x18, 0x20, 0x01, 0x19, 0x6d, 0x20, 0x04, 0x08, 0x0c, 0x28, 0xe7, + 0x60, 0xe2, 0x90, 0x06, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x00, 0x3e, + 0x00, 0x2e, 0x00, 0x1e, 0x01, 0x5e, 0x00, 0x05, 0x01, 0x56, 0x00, 0x16, + 0x00, 0x26, 0x00, 0x36, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x20, 0x61, + 0x01, 0x00, 0x20, 0x71, 0x18, 0x00, 0x60, 0x20, 0x90, 0x84, 0x00, 0xc0, + 0x01, 0xc8, 0x20, 0x11, 0x00, 0x03, 0x08, 0x0c, 0xaa, 0xbf, 0x20, 0x11, + 0x00, 0x02, 0x08, 0x0c, 0xaa, 0xc9, 0x08, 0x0c, 0xa9, 0xd3, 0x90, 0x1e, + 0x08, 0x0c, 0xaa, 0x49, 0x20, 0x69, 0x01, 0x40, 0x20, 0x01, 0x00, 0xa0, + 0x08, 0x0c, 0x2d, 0x39, 0x08, 0x0c, 0x79, 0x32, 0x08, 0x0c, 0x61, 0x2e, + 0x08, 0x04, 0x78, 0xb2, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x0c, 0xd1, 0xb4, + 0x11, 0x60, 0xc1, 0xb5, 0x21, 0x02, 0x08, 0x0c, 0x74, 0x9a, 0x20, 0x69, + 0x01, 0x40, 0x20, 0x01, 0x00, 0x80, 0x08, 0x0c, 0x2d, 0x39, 0x60, 0xe3, + 0x00, 0x00, 0x20, 0x69, 0x02, 0x00, 0x68, 0x04, 0x90, 0x05, 0x11, 0x18, + 0x68, 0x08, 0x90, 0x05, 0x01, 0x80, 0x60, 0x28, 0x90, 0x84, 0xfd, 0xff, + 0x60, 0x2a, 0x60, 0x27, 0x02, 0x00, 0x20, 0x69, 0x19, 0x8f, 0x70, 0x00, + 0x20, 0x6a, 0x70, 0x9b, 0x00, 0x27, 0x70, 0x03, 0x00, 0x01, 0x08, 0x04, + 0x78, 0xb2, 0x60, 0x27, 0x1e, 0x00, 0x20, 0x09, 0x1e, 0x00, 0x08, 0x0c, + 0x2c, 0x61, 0x60, 0x24, 0x91, 0x0c, 0x01, 0xc8, 0x90, 0x84, 0x1c, 0x00, + 0x11, 0xb0, 0x1d, 0x04, 0x78, 0x69, 0x00, 0x06, 0x00, 0x16, 0x00, 0xc6, + 0x00, 0xd6, 0x00, 0xe6, 0x08, 0x0c, 0x87, 0x76, 0x00, 0xee, 0x00, 0xde, + 0x00, 0xce, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0xe6, 0x20, 0x71, 0x19, 0xfb, + 0x70, 0x78, 0x00, 0xee, 0x90, 0x05, 0x19, 0xf8, 0x04, 0x38, 0x00, 0x26, + 0x20, 0x11, 0x74, 0xb2, 0x08, 0x0c, 0x88, 0x3d, 0x20, 0x11, 0x74, 0xa5, + 0x08, 0x0c, 0x89, 0x17, 0x00, 0x2e, 0x20, 0x69, 0x01, 0x40, 0x60, 0xe3, + 0x00, 0x00, 0x70, 0xb4, 0x90, 0x05, 0x11, 0x18, 0x68, 0x87, 0x00, 0x01, + 0x00, 0x08, 0x68, 0x86, 0x20, 0x01, 0x18, 0x0d, 0x20, 0x04, 0xd0, 0x8c, + 0x20, 0x01, 0x00, 0x02, 0x11, 0x18, 0x20, 0x01, 0x19, 0x6d, 0x20, 0x04, + 0x08, 0x0c, 0x28, 0xe7, 0x60, 0xe2, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x0c, + 0xc1, 0xb4, 0x21, 0x02, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x00, 0x3e, + 0x00, 0x2e, 0x00, 0x1e, 0x01, 0x5e, 0x00, 0x05, 0x01, 0x56, 0x00, 0x16, + 0x00, 0x26, 0x00, 0x36, 0x00, 0x46, 0x00, 0xc6, 0x00, 0xe6, 0x20, 0x61, + 0x01, 0x00, 0x20, 0x71, 0x18, 0x00, 0x08, 0x0c, 0xd7, 0xdc, 0x19, 0x04, + 0x79, 0x20, 0x71, 0x30, 0xd1, 0x84, 0x11, 0x70, 0x08, 0x0c, 0x33, 0xaa, + 0x01, 0x38, 0xc1, 0x8d, 0x71, 0x32, 0x20, 0x11, 0x18, 0x48, 0x22, 0x14, + 0xd2, 0xac, 0x11, 0x20, 0x70, 0x30, 0xd0, 0x8c, 0x09, 0x04, 0x79, 0x20, + 0x20, 0x11, 0x18, 0x48, 0x22, 0x0c, 0xd1, 0xa4, 0x05, 0x38, 0x00, 0x16, + 0x20, 0x19, 0x00, 0x0e, 0x08, 0x0c, 0xeb, 0xa1, 0x01, 0x56, 0x00, 0xb6, + 0x20, 0xa9, 0x00, 0x7f, 0x90, 0x0e, 0x91, 0x86, 0x00, 0x7e, 0x01, 0xa0, + 0x91, 0x86, 0x00, 0x80, 0x01, 0x88, 0x08, 0x0c, 0x67, 0x24, 0x11, 0x70, + 0x21, 0x20, 0x90, 0x06, 0x00, 0x16, 0x20, 0x09, 0x00, 0x0e, 0x08, 0x0c, + 0xec, 0x31, 0x20, 0x09, 0x00, 0x01, 0x20, 0x11, 0x01, 0x00, 0x08, 0x0c, + 0x8a, 0x50, 0x00, 0x1e, 0x81, 0x08, 0x1f, 0x04, 0x78, 0xe9, 0x00, 0xbe, + 0x01, 0x5e, 0x00, 0x1e, 0xd1, 0xac, 0x11, 0x48, 0x00, 0x16, 0x20, 0x09, + 0x00, 0x02, 0x20, 0x19, 0x00, 0x04, 0x08, 0x0c, 0x32, 0x1b, 0x00, 0x1e, + 0x00, 0x78, 0x01, 0x56, 0x00, 0xb6, 0x20, 0xa9, 0x00, 0x7f, 0x90, 0x0e, + 0x08, 0x0c, 0x67, 0x24, 0x11, 0x10, 0x08, 0x0c, 0x61, 0x48, 0x81, 0x08, + 0x1f, 0x04, 0x79, 0x16, 0x00, 0xbe, 0x01, 0x5e, 0x08, 0x0c, 0x1b, 0x06, + 0x08, 0x0c, 0xb2, 0x44, 0x60, 0xe3, 0x00, 0x00, 0x08, 0x0c, 0x61, 0x2e, + 0x08, 0x0c, 0x75, 0x63, 0x00, 0xee, 0x00, 0xce, 0x00, 0x4e, 0x00, 0x3e, + 0x00, 0x2e, 0x00, 0x1e, 0x01, 0x5e, 0x00, 0x05, 0x20, 0x01, 0x19, 0x7d, + 0x20, 0x03, 0x00, 0x01, 0x00, 0x05, 0x20, 0x01, 0x19, 0x7d, 0x20, 0x03, + 0x00, 0x00, 0x00, 0x05, 0x20, 0x01, 0x19, 0x7c, 0x20, 0x03, 0xaa, 0xaa, + 0x00, 0x05, 0x20, 0x01, 0x19, 0x7c, 0x20, 0x03, 0x00, 0x00, 0x00, 0x05, + 0x20, 0x71, 0x18, 0xfa, 0x70, 0x03, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, + 0x08, 0x0c, 0x10, 0x27, 0x09, 0x0c, 0x0d, 0xc5, 0xa8, 0xab, 0xdc, 0xb0, + 0x29, 0x00, 0x70, 0x4e, 0x08, 0x0c, 0x10, 0x27, 0x09, 0x0c, 0x0d, 0xc5, + 0xa8, 0xab, 0xdc, 0xb0, 0x29, 0x00, 0x70, 0x52, 0xa8, 0x67, 0x00, 0x00, + 0xa8, 0x6b, 0x00, 0x01, 0xa8, 0x9f, 0x00, 0x00, 0x00, 0x05, 0x00, 0xe6, + 0x20, 0x71, 0x00, 0x40, 0x68, 0x48, 0x90, 0x05, 0x11, 0x18, 0x90, 0x85, + 0x00, 0x01, 0x04, 0xb0, 0x68, 0x40, 0x90, 0x05, 0x01, 0x50, 0x04, 0xa1, + 0x6a, 0x50, 0x92, 0x00, 0x70, 0x02, 0x68, 0x54, 0x91, 0x01, 0x70, 0x06, + 0x90, 0x06, 0x70, 0x12, 0x70, 0x16, 0x68, 0x50, 0x70, 0x02, 0x68, 0x54, + 0x70, 0x06, 0x68, 0x58, 0x70, 0x0a, 0x68, 0x5c, 0x70, 0x0e, 0x68, 0x40, + 0x90, 0x05, 0x11, 0x10, 0x70, 0x12, 0x70, 0x16, 0x68, 0x48, 0x70, 0x1a, + 0x70, 0x1c, 0x90, 0x85, 0x00, 0x40, 0x70, 0x1e, 0x20, 0x01, 0x00, 0x19, + 0x70, 0x36, 0x70, 0x2b, 0x00, 0x01, 0x20, 0x01, 0x00, 0x04, 0x20, 0x0c, + 0x91, 0x8c, 0xff, 0xf7, 0x91, 0x8d, 0x80, 0x00, 0x21, 0x02, 0x00, 0xd6, + 0x20, 0x69, 0x18, 0xfa, 0x68, 0x07, 0x00, 0x01, 0x00, 0xde, 0x08, 0x0c, + 0x7f, 0x74, 0x90, 0x06, 0x00, 0xee, 0x00, 0x05, 0x90, 0x0e, 0x01, 0x56, + 0x20, 0xa9, 0x00, 0x06, 0x80, 0x03, 0x20, 0x11, 0x01, 0x00, 0x22, 0x14, + 0x92, 0x96, 0x00, 0x08, 0x11, 0x10, 0x81, 0x8d, 0x00, 0x10, 0x81, 0xf5, + 0x3e, 0x08, 0x1f, 0x04, 0x79, 0xa8, 0x01, 0x5e, 0x00, 0x05, 0x20, 0x79, + 0x00, 0x40, 0x20, 0x71, 0x18, 0xfa, 0x70, 0x04, 0x00, 0x02, 0x79, 0xc7, + 0x79, 0xc8, 0x7a, 0x00, 0x7a, 0x5b, 0x7b, 0xbb, 0x79, 0xc5, 0x79, 0xc5, + 0x7b, 0xe5, 0x08, 0x0c, 0x0d, 0xc5, 0x00, 0x05, 0x20, 0x79, 0x00, 0x40, + 0x78, 0x2c, 0x90, 0x8c, 0x07, 0x80, 0x19, 0x0c, 0x80, 0x56, 0xd0, 0xa4, + 0x01, 0xf8, 0x78, 0x24, 0x20, 0x48, 0x90, 0x06, 0xa8, 0x02, 0xa8, 0x06, + 0xa8, 0x64, 0x90, 0x84, 0x00, 0xff, 0x90, 0x8a, 0x00, 0x40, 0x06, 0x10, + 0x00, 0xc0, 0x20, 0x01, 0x18, 0x00, 0x20, 0x0c, 0x91, 0x86, 0x00, 0x03, + 0x11, 0x68, 0x70, 0x04, 0x00, 0x02, 0x79, 0xf0, 0x79, 0xca, 0x79, 0xf0, + 0x79, 0xee, 0x79, 0xf0, 0x79, 0xf0, 0x79, 0xf0, 0x79, 0xf0, 0x79, 0xf0, + 0x08, 0x0c, 0x7a, 0x5b, 0x78, 0x2c, 0xd0, 0x9c, 0x09, 0x0c, 0x7f, 0x74, + 0x00, 0x05, 0x90, 0x82, 0x00, 0x5a, 0x12, 0x18, 0x21, 0x00, 0x00, 0x3b, + 0x0c, 0x10, 0x08, 0x0c, 0x7a, 0x91, 0x0c, 0x90, 0x00, 0xe3, 0x08, 0xe8, + 0x00, 0x05, 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, + 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0xb3, 0x7a, 0x91, 0x7a, 0x91, + 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, + 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, + 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x9d, + 0x7a, 0x91, 0x7c, 0xdb, 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0xb3, + 0x7a, 0x91, 0x7a, 0x9d, 0x7d, 0x1c, 0x7d, 0x5d, 0x7d, 0xa4, 0x7d, 0xb8, + 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0xb3, 0x7a, 0x9d, 0x7a, 0xc7, 0x7a, 0x91, + 0x7b, 0x8f, 0x7e, 0x63, 0x7e, 0x7e, 0x7a, 0x91, 0x7a, 0xb3, 0x7a, 0x91, + 0x7a, 0xc7, 0x7a, 0x91, 0x7a, 0x91, 0x7b, 0x85, 0x7e, 0x7e, 0x7a, 0x91, + 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, + 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0xdb, 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, + 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, + 0x7f, 0xfa, 0x7a, 0x91, 0x7f, 0xa4, 0x7a, 0x91, 0x7f, 0xa4, 0x7a, 0x91, + 0x7a, 0xf0, 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, + 0x7a, 0x91, 0x20, 0x79, 0x00, 0x40, 0x70, 0x04, 0x90, 0x86, 0x00, 0x03, + 0x11, 0x98, 0x78, 0x2c, 0x08, 0x0c, 0x7f, 0x9d, 0xd0, 0xa4, 0x01, 0x70, + 0x78, 0x24, 0x20, 0x48, 0x90, 0x06, 0xa8, 0x02, 0xa8, 0x06, 0xa8, 0x64, + 0x90, 0x84, 0x00, 0xff, 0x90, 0x8a, 0x00, 0x1a, 0x12, 0x10, 0x00, 0x2b, + 0x0c, 0x50, 0x00, 0xe9, 0x08, 0x0c, 0x7f, 0x74, 0x00, 0x05, 0x7a, 0x91, + 0x7a, 0x9d, 0x7c, 0xc7, 0x7a, 0x91, 0x7a, 0x9d, 0x7a, 0x91, 0x7a, 0x9d, + 0x7a, 0x9d, 0x7a, 0x91, 0x7a, 0x9d, 0x7c, 0xc7, 0x7a, 0x9d, 0x7a, 0x9d, + 0x7a, 0x9d, 0x7a, 0x9d, 0x7a, 0x9d, 0x7a, 0x91, 0x7a, 0x9d, 0x7c, 0xc7, + 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x9d, 0x7a, 0x91, 0x7a, 0x91, 0x7a, 0x91, + 0x7a, 0x9d, 0x00, 0xe6, 0x20, 0x71, 0x18, 0xfa, 0x20, 0x09, 0x04, 0x00, + 0x00, 0x71, 0x00, 0xee, 0x00, 0x05, 0x20, 0x09, 0x10, 0x00, 0x00, 0x49, + 0x00, 0x05, 0x20, 0x09, 0x20, 0x00, 0x00, 0x29, 0x00, 0x05, 0x20, 0x09, + 0x08, 0x00, 0x00, 0x09, 0x00, 0x05, 0x70, 0x07, 0x00, 0x01, 0xa8, 0x68, + 0x90, 0x84, 0x00, 0xff, 0x91, 0x05, 0xa8, 0x6a, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0x6e, 0x9f, 0x01, 0x2e, 0x00, 0x05, 0xa8, 0x64, + 0x80, 0x07, 0x90, 0x84, 0x00, 0xff, 0x0d, 0x08, 0x80, 0x01, 0x11, 0x20, + 0x70, 0x07, 0x00, 0x01, 0x08, 0x04, 0x7c, 0x64, 0x70, 0x07, 0x00, 0x03, + 0x70, 0x12, 0x29, 0x00, 0x70, 0x16, 0x70, 0x1a, 0x70, 0x4b, 0x7c, 0x64, + 0x00, 0x05, 0xa8, 0x64, 0x80, 0x07, 0x90, 0x84, 0x00, 0xff, 0x09, 0x68, + 0x80, 0x01, 0x11, 0x20, 0x70, 0x07, 0x00, 0x01, 0x08, 0x04, 0x7c, 0x7f, + 0x70, 0x07, 0x00, 0x03, 0x70, 0x12, 0x29, 0x00, 0x70, 0x16, 0x70, 0x1a, + 0x70, 0x4b, 0x7c, 0x7f, 0x00, 0x05, 0xa8, 0x64, 0x80, 0x07, 0x90, 0x84, + 0x00, 0xff, 0x09, 0x04, 0x7a, 0x99, 0x80, 0x01, 0x11, 0x20, 0x70, 0x07, + 0x00, 0x01, 0x08, 0x04, 0x7c, 0x9b, 0x70, 0x07, 0x00, 0x03, 0x70, 0x12, + 0x29, 0x00, 0x70, 0x16, 0x70, 0x1a, 0x70, 0x4b, 0x7c, 0x9b, 0x00, 0x05, + 0xa8, 0x64, 0x80, 0x07, 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x01, + 0x19, 0x04, 0x7a, 0x99, 0x70, 0x07, 0x00, 0x01, 0x20, 0x09, 0x18, 0x34, + 0x21, 0x0c, 0x81, 0xff, 0x19, 0x04, 0x7b, 0x5c, 0x20, 0x01, 0x18, 0x0d, + 0x20, 0x04, 0xd0, 0x8c, 0x09, 0x04, 0x7b, 0x47, 0xa9, 0x9c, 0x91, 0x86, + 0x00, 0xff, 0x05, 0xe8, 0xa9, 0x94, 0x91, 0x86, 0x00, 0x6f, 0x01, 0x88, + 0x91, 0x86, 0x00, 0x74, 0x15, 0xb0, 0x00, 0x26, 0x20, 0x11, 0x00, 0x10, + 0x08, 0x0c, 0x6a, 0xc7, 0x00, 0x2e, 0x05, 0x78, 0x00, 0x16, 0xa9, 0x98, + 0x08, 0x0c, 0x6b, 0x11, 0x00, 0x1e, 0x15, 0x48, 0x04, 0x00, 0x08, 0x0c, + 0x76, 0x37, 0x01, 0x40, 0xa8, 0x97, 0x40, 0x05, 0xa8, 0x9b, 0x00, 0x16, + 0x20, 0x01, 0x00, 0x30, 0x90, 0x0e, 0x04, 0x38, 0x00, 0x26, 0x20, 0x11, + 0x80, 0x08, 0x08, 0x0c, 0x6a, 0xc7, 0x00, 0x2e, 0x01, 0xb0, 0x00, 0x16, + 0x00, 0x26, 0x00, 0x36, 0xa9, 0x98, 0xaa, 0xa0, 0xab, 0x9c, 0x91, 0x8d, + 0x80, 0x00, 0x08, 0x0c, 0x6b, 0x11, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, + 0x11, 0x40, 0xa8, 0x97, 0x40, 0x05, 0xa8, 0x9b, 0x40, 0x09, 0x20, 0x01, + 0x00, 0x30, 0x90, 0x0e, 0x00, 0x50, 0xa8, 0x68, 0x90, 0x84, 0x00, 0xff, + 0xa8, 0x6a, 0xa8, 0x83, 0x00, 0x00, 0x08, 0x0c, 0x63, 0xc5, 0x11, 0x08, + 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0xa8, 0x67, 0x01, 0x39, + 0xa8, 0x7a, 0xa9, 0x82, 0x08, 0x0c, 0x6e, 0x9f, 0x01, 0x2e, 0x0c, 0xa0, + 0xa9, 0x94, 0x91, 0x86, 0x00, 0x71, 0x09, 0x04, 0x7b, 0x00, 0x91, 0x86, + 0x00, 0x64, 0x09, 0x04, 0x7b, 0x00, 0x91, 0x86, 0x00, 0x7c, 0x09, 0x04, + 0x7b, 0x00, 0x91, 0x86, 0x00, 0x28, 0x09, 0x04, 0x7b, 0x00, 0x91, 0x86, + 0x00, 0x38, 0x09, 0x04, 0x7b, 0x00, 0x91, 0x86, 0x00, 0x78, 0x09, 0x04, + 0x7b, 0x00, 0x91, 0x86, 0x00, 0x5f, 0x09, 0x04, 0x7b, 0x00, 0x91, 0x86, + 0x00, 0x56, 0x09, 0x04, 0x7b, 0x00, 0xa8, 0x97, 0x40, 0x05, 0xa8, 0x9b, + 0x00, 0x01, 0x20, 0x01, 0x00, 0x30, 0x90, 0x0e, 0x08, 0x60, 0xa8, 0x7c, + 0x90, 0x84, 0x00, 0xc0, 0x90, 0x86, 0x00, 0xc0, 0x11, 0x20, 0x70, 0x07, + 0x00, 0x01, 0x08, 0x04, 0x7e, 0x95, 0x29, 0x00, 0x70, 0x16, 0x70, 0x1a, + 0x20, 0xa9, 0x00, 0x04, 0xa8, 0x60, 0x20, 0xe0, 0xa8, 0x5c, 0x90, 0x80, + 0x00, 0x30, 0x20, 0x98, 0x70, 0x50, 0x20, 0x40, 0xa0, 0x60, 0x20, 0xe8, + 0xa0, 0x5c, 0x90, 0x80, 0x00, 0x23, 0x20, 0xa0, 0x40, 0x03, 0xa8, 0x88, + 0x70, 0x12, 0x90, 0x82, 0x04, 0x01, 0x1a, 0x04, 0x7a, 0xa1, 0xaa, 0xb4, + 0x92, 0x8a, 0x00, 0x02, 0x1a, 0x04, 0x7a, 0xa1, 0x82, 0xff, 0x11, 0x38, + 0xa8, 0xb8, 0xa9, 0xbc, 0x91, 0x05, 0x01, 0x18, 0x20, 0x01, 0x7c, 0x22, + 0x00, 0x18, 0x92, 0x80, 0x7c, 0x18, 0x20, 0x05, 0x70, 0x56, 0x70, 0x10, + 0x90, 0x15, 0x09, 0x04, 0x7c, 0x03, 0x08, 0x0c, 0x10, 0x27, 0x11, 0x18, + 0x70, 0x07, 0x00, 0x04, 0x00, 0x05, 0x29, 0x00, 0x70, 0x22, 0x70, 0x54, + 0x20, 0x60, 0xe0, 0x00, 0xa8, 0x66, 0x70, 0x50, 0x20, 0x40, 0xa9, 0x5c, + 0xe0, 0x04, 0x91, 0x00, 0xa0, 0x76, 0xa8, 0x60, 0xa0, 0x72, 0xe0, 0x08, + 0x92, 0x0a, 0x12, 0x10, 0x90, 0x0e, 0x22, 0x00, 0x71, 0x12, 0xe2, 0x0c, + 0x80, 0x03, 0x80, 0x0b, 0x92, 0x96, 0x00, 0x04, 0x01, 0x08, 0x91, 0x08, + 0xa1, 0x7a, 0x81, 0x0b, 0xa1, 0x7e, 0x08, 0x0c, 0x10, 0xf8, 0xa0, 0x6c, + 0x90, 0x8e, 0x01, 0x00, 0x01, 0x70, 0x90, 0x86, 0x02, 0x00, 0x01, 0x18, + 0x70, 0x07, 0x00, 0x07, 0x00, 0x05, 0x70, 0x20, 0x20, 0x48, 0x08, 0x0c, + 0x10, 0x40, 0x70, 0x14, 0x20, 0x48, 0x08, 0x04, 0x7a, 0xa1, 0x70, 0x20, + 0x20, 0x48, 0x70, 0x18, 0xa8, 0x02, 0xa8, 0x07, 0x00, 0x00, 0x29, 0x08, + 0x20, 0x48, 0xa9, 0x06, 0x71, 0x1a, 0x08, 0x04, 0x7b, 0xbb, 0x70, 0x14, + 0x20, 0x48, 0x70, 0x07, 0x00, 0x01, 0xa8, 0xb4, 0x90, 0x05, 0x11, 0x28, + 0xa8, 0xb8, 0xa9, 0xbc, 0x91, 0x05, 0x01, 0x08, 0x00, 0xb9, 0xa8, 0x64, + 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x1e, 0x09, 0x04, 0x7e, 0x95, + 0x08, 0x04, 0x7c, 0x64, 0x7c, 0x1a, 0x7c, 0x1e, 0x00, 0x02, 0x00, 0x1d, + 0x00, 0x07, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x1b, 0x00, 0x05, 0x00, 0x06, + 0x00, 0x0a, 0x00, 0x1d, 0x00, 0x05, 0x00, 0x04, 0x00, 0x76, 0x00, 0x66, + 0xaf, 0xb8, 0xae, 0xbc, 0xa8, 0x04, 0x20, 0x50, 0xb0, 0xc0, 0xb0, 0xe2, + 0xb0, 0xbc, 0xb0, 0xde, 0xb0, 0xb8, 0xb0, 0xd2, 0xb0, 0xb4, 0xb0, 0xce, + 0xb6, 0xda, 0xb7, 0xd6, 0xb0, 0xb0, 0xb0, 0xca, 0xb0, 0xac, 0xb0, 0xc6, + 0xb0, 0xa8, 0xb0, 0xba, 0xb0, 0xa4, 0xb0, 0xb6, 0xb6, 0xc2, 0xb7, 0xbe, + 0xb0, 0xa0, 0xb0, 0xb2, 0xb0, 0x9c, 0xb0, 0xae, 0xb0, 0x98, 0xb0, 0xa2, + 0xb0, 0x94, 0xb0, 0x9e, 0xb6, 0xaa, 0xb7, 0xa6, 0xb0, 0x90, 0xb0, 0x9a, + 0xb0, 0x8c, 0xb0, 0x96, 0xb0, 0x88, 0xb0, 0x8a, 0xb0, 0x84, 0xb0, 0x86, + 0xb6, 0x92, 0xb7, 0x8e, 0xb0, 0x80, 0xb0, 0x82, 0xb0, 0x7c, 0xb0, 0x7e, + 0xb0, 0x78, 0xb0, 0x72, 0xb0, 0x74, 0xb0, 0x6e, 0xb6, 0x7a, 0xb7, 0x76, + 0xb0, 0x04, 0x90, 0x55, 0x19, 0x58, 0x00, 0x6e, 0x00, 0x7e, 0x00, 0x05, + 0x20, 0x09, 0x18, 0x34, 0x21, 0x0c, 0x81, 0xff, 0x11, 0x78, 0x08, 0x0c, + 0x61, 0xc2, 0x11, 0x08, 0x00, 0x05, 0x08, 0x0c, 0x71, 0x0b, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0xd3, 0xce, 0x08, 0x0c, 0x6e, 0x9f, + 0x01, 0x2e, 0x0c, 0xa0, 0x08, 0x0c, 0xd7, 0xdc, 0x1d, 0x70, 0x20, 0x01, + 0x00, 0x28, 0x90, 0x0e, 0x0c, 0x70, 0x20, 0x09, 0x18, 0x34, 0x21, 0x0c, + 0x81, 0xff, 0x11, 0x88, 0xa8, 0x88, 0x90, 0x05, 0x01, 0x88, 0xa8, 0x83, + 0x00, 0x00, 0x08, 0x0c, 0x62, 0x52, 0x11, 0x08, 0x00, 0x05, 0xa8, 0x7a, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x6e, 0x9f, 0x01, 0x2e, + 0x0c, 0xb8, 0x20, 0x01, 0x00, 0x28, 0x0c, 0xa8, 0x20, 0x01, 0x00, 0x00, + 0x0c, 0x90, 0x04, 0x19, 0x11, 0xd8, 0xa8, 0x88, 0x90, 0x05, 0x01, 0xe0, + 0xa8, 0x83, 0x00, 0x00, 0xa8, 0x7c, 0xd0, 0xf4, 0x01, 0x20, 0x08, 0x0c, + 0x63, 0x27, 0x11, 0x38, 0x00, 0x05, 0x90, 0x06, 0xa8, 0x7a, 0x08, 0x0c, + 0x62, 0x9f, 0x11, 0x08, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0xa8, 0x7a, 0xa9, 0x82, 0x08, 0x0c, 0x6e, 0x9f, 0x01, 0x2e, 0x0c, 0xb0, + 0x20, 0x01, 0x00, 0x28, 0x90, 0x0e, 0x0c, 0x98, 0x20, 0x01, 0x00, 0x00, + 0x0c, 0x80, 0x00, 0xc6, 0x20, 0x61, 0x18, 0x00, 0x60, 0xd0, 0x90, 0x05, + 0x01, 0x00, 0x00, 0xce, 0x00, 0x05, 0x70, 0x18, 0xa8, 0x02, 0x29, 0x08, + 0x20, 0x48, 0xa9, 0x06, 0x71, 0x1a, 0x70, 0x10, 0x80, 0x01, 0x70, 0x12, + 0x01, 0x18, 0x70, 0x07, 0x00, 0x03, 0x00, 0x30, 0x70, 0x14, 0x20, 0x48, + 0x70, 0x07, 0x00, 0x01, 0x70, 0x48, 0x08, 0x0f, 0x00, 0x05, 0x00, 0xb6, + 0x70, 0x07, 0x00, 0x01, 0xa9, 0x74, 0xa8, 0x78, 0x90, 0x84, 0x00, 0xff, + 0x90, 0x96, 0x00, 0x04, 0x05, 0x40, 0x20, 0xa9, 0x00, 0x01, 0x90, 0x96, + 0x00, 0x01, 0x01, 0x90, 0x90, 0x0e, 0x20, 0xa9, 0x08, 0x00, 0x90, 0x96, + 0x00, 0x02, 0x01, 0x60, 0x90, 0x05, 0x11, 0xd8, 0xa9, 0x74, 0x08, 0x0c, + 0x67, 0x24, 0x11, 0xb8, 0x00, 0x66, 0xae, 0x80, 0x08, 0x0c, 0x68, 0x34, + 0x00, 0x6e, 0x00, 0x88, 0x00, 0x46, 0x20, 0x11, 0x18, 0x0c, 0x22, 0x24, + 0xc4, 0x84, 0x24, 0x12, 0x00, 0x4e, 0x00, 0xc6, 0x08, 0x0c, 0x67, 0x24, + 0x11, 0x10, 0x08, 0x0c, 0x69, 0x34, 0x81, 0x08, 0x1f, 0x04, 0x7d, 0x04, + 0x00, 0xce, 0xa8, 0x7c, 0xd0, 0x84, 0x11, 0x20, 0x08, 0x0c, 0x10, 0x40, + 0x00, 0xbe, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, + 0x6e, 0x9f, 0x01, 0x2e, 0x00, 0xbe, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x70, 0x07, 0x00, 0x01, 0x08, 0x0c, 0x6a, 0x9f, 0x05, 0x80, + 0x20, 0x61, 0x1a, 0x74, 0x61, 0x00, 0xd1, 0x84, 0x01, 0x78, 0xa8, 0x88, + 0x90, 0x84, 0x00, 0xff, 0x15, 0x50, 0x60, 0x00, 0xd0, 0x84, 0x05, 0x20, + 0x60, 0x04, 0x90, 0x05, 0x15, 0x38, 0x60, 0x03, 0x00, 0x00, 0x60, 0x0b, + 0x00, 0x00, 0x00, 0xc8, 0x20, 0x11, 0x00, 0x01, 0xa8, 0x90, 0x90, 0x05, + 0x11, 0x10, 0x20, 0x01, 0x00, 0x1e, 0x80, 0x00, 0x60, 0x16, 0xa8, 0x88, + 0x90, 0x84, 0x00, 0xff, 0x01, 0x78, 0x60, 0x06, 0xa8, 0x88, 0x80, 0x07, + 0x90, 0x84, 0x00, 0xff, 0x01, 0x48, 0x60, 0x0a, 0xa8, 0x88, 0x80, 0x00, + 0x11, 0x08, 0xc2, 0x8d, 0x62, 0x02, 0x01, 0x2e, 0x08, 0x04, 0x7f, 0x5e, + 0x01, 0x2e, 0x08, 0x04, 0x7f, 0x58, 0x01, 0x2e, 0x08, 0x04, 0x7f, 0x52, + 0x01, 0x2e, 0x08, 0x04, 0x7f, 0x55, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x70, 0x07, 0x00, 0x01, 0x08, 0x0c, 0x6a, 0x9f, 0x05, 0xe0, 0x20, 0x61, + 0x1a, 0x74, 0x60, 0x00, 0xd0, 0x84, 0x05, 0xb8, 0x62, 0x04, 0x63, 0x08, + 0xd0, 0x8c, 0x15, 0x30, 0xac, 0x78, 0x94, 0x84, 0x00, 0x03, 0x01, 0x70, + 0xa9, 0x88, 0x91, 0x8c, 0x00, 0xff, 0x80, 0x01, 0x11, 0x20, 0x21, 0x00, + 0x92, 0x10, 0x06, 0x20, 0x00, 0x28, 0x80, 0x01, 0x15, 0x08, 0x21, 0x00, + 0x92, 0x12, 0x02, 0xf0, 0x94, 0x84, 0x00, 0x0c, 0x01, 0x88, 0xa9, 0x88, + 0x81, 0x0f, 0x91, 0x8c, 0x00, 0xff, 0x90, 0x82, 0x00, 0x04, 0x11, 0x20, + 0x21, 0x00, 0x93, 0x18, 0x02, 0x88, 0x00, 0x30, 0x90, 0x82, 0x00, 0x04, + 0x11, 0x68, 0x21, 0x00, 0x93, 0x1a, 0x02, 0x50, 0xa8, 0x90, 0x90, 0x05, + 0x01, 0x10, 0x80, 0x00, 0x60, 0x16, 0x62, 0x06, 0x63, 0x0a, 0x01, 0x2e, + 0x08, 0x04, 0x7f, 0x5e, 0x01, 0x2e, 0x08, 0x04, 0x7f, 0x5b, 0x01, 0x2e, + 0x08, 0x04, 0x7f, 0x58, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x70, 0x07, + 0x00, 0x01, 0x20, 0x61, 0x1a, 0x74, 0x63, 0x00, 0xd3, 0x8c, 0x11, 0x20, + 0x63, 0x08, 0x83, 0x18, 0x02, 0x20, 0x63, 0x0a, 0x01, 0x2e, 0x08, 0x04, + 0x7f, 0x6c, 0x01, 0x2e, 0x08, 0x04, 0x7f, 0x5b, 0x00, 0xb6, 0x01, 0x26, + 0x00, 0xc6, 0x20, 0x91, 0x80, 0x00, 0x70, 0x07, 0x00, 0x01, 0xa8, 0x7c, + 0xd0, 0xac, 0x01, 0x48, 0x00, 0xc6, 0x20, 0x61, 0x1a, 0x74, 0x60, 0x00, + 0x90, 0x84, 0xfc, 0xff, 0x60, 0x02, 0x00, 0xce, 0x04, 0x40, 0xa8, 0x88, + 0x90, 0x05, 0x05, 0xd8, 0xa8, 0x8c, 0x90, 0x65, 0x05, 0x98, 0x20, 0x01, + 0x18, 0x34, 0x20, 0x04, 0x90, 0x05, 0x01, 0x18, 0x08, 0x0c, 0xb3, 0x06, + 0x00, 0x68, 0x60, 0x17, 0xf4, 0x00, 0x60, 0x5b, 0x00, 0x00, 0xa9, 0x7c, + 0xd1, 0xa4, 0x01, 0x10, 0xa9, 0x80, 0x61, 0x5a, 0x20, 0x09, 0x00, 0x41, + 0x08, 0x0c, 0xb3, 0x52, 0xa9, 0x88, 0x91, 0x8c, 0xff, 0x00, 0x91, 0x86, + 0x20, 0x00, 0x11, 0x38, 0x00, 0x26, 0x90, 0x0e, 0x20, 0x11, 0xfd, 0xff, + 0x08, 0x0c, 0x8a, 0x50, 0x00, 0x2e, 0xa8, 0x7c, 0xd0, 0xc4, 0x01, 0x48, + 0x20, 0x61, 0x1a, 0x74, 0x60, 0x00, 0xd0, 0x8c, 0x11, 0x20, 0x60, 0x08, + 0x80, 0x00, 0x02, 0x08, 0x60, 0x0a, 0x00, 0xce, 0x01, 0x2e, 0x00, 0xbe, + 0x08, 0x04, 0x7f, 0x5e, 0x00, 0xce, 0x01, 0x2e, 0x00, 0xbe, 0x08, 0x04, + 0x7f, 0x58, 0xa9, 0x84, 0x91, 0x86, 0x00, 0x2e, 0x0d, 0x30, 0x91, 0x86, + 0x00, 0x2d, 0x0d, 0x18, 0x91, 0x86, 0x00, 0x45, 0x05, 0x10, 0x91, 0x86, + 0x00, 0x2a, 0x11, 0x30, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x0c, 0xc1, 0x94, + 0x21, 0x02, 0x08, 0xb8, 0x91, 0x86, 0x00, 0x20, 0x01, 0x58, 0x91, 0x86, + 0x00, 0x29, 0x1d, 0x10, 0xa9, 0x74, 0x08, 0x0c, 0x67, 0x24, 0x19, 0x68, + 0xb8, 0x00, 0xc0, 0xe4, 0xb8, 0x02, 0x08, 0x48, 0xa8, 0x8c, 0x90, 0x65, + 0x09, 0xb8, 0x60, 0x07, 0x00, 0x24, 0x20, 0x01, 0x19, 0x86, 0x20, 0x04, + 0x60, 0x1a, 0x08, 0x04, 0x7d, 0xf3, 0xa8, 0x8c, 0x90, 0x65, 0x09, 0x60, + 0x00, 0xe6, 0xa8, 0x90, 0x90, 0x75, 0x20, 0x01, 0x18, 0x34, 0x20, 0x04, + 0x90, 0x05, 0x01, 0x50, 0x08, 0x0c, 0xb3, 0x06, 0x8e, 0xff, 0x01, 0x18, + 0x2e, 0x60, 0x08, 0x0c, 0xb3, 0x06, 0x00, 0xee, 0x08, 0x04, 0x7d, 0xf3, + 0x60, 0x24, 0xc0, 0xdc, 0xc0, 0xd5, 0x60, 0x26, 0x2e, 0x60, 0x60, 0x07, + 0x00, 0x3a, 0xa8, 0xa0, 0x90, 0x05, 0x01, 0x30, 0x60, 0x07, 0x00, 0x3b, + 0xa8, 0xa4, 0x60, 0x2e, 0xa8, 0xa8, 0x60, 0x16, 0x60, 0x03, 0x00, 0x01, + 0x08, 0x0c, 0x94, 0xff, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0xee, 0x08, 0x04, + 0x7d, 0xf3, 0x20, 0x61, 0x1a, 0x74, 0x60, 0x00, 0xd0, 0x84, 0x01, 0x90, + 0xd0, 0x8c, 0x19, 0x04, 0x7f, 0x6c, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x62, 0x04, 0x82, 0x10, 0x02, 0x20, 0x62, 0x06, 0x01, 0x2e, 0x08, 0x04, + 0x7f, 0x6c, 0x01, 0x2e, 0xa8, 0x83, 0x00, 0x16, 0x08, 0x04, 0x7f, 0x65, + 0xa8, 0x83, 0x00, 0x07, 0x08, 0x04, 0x7f, 0x65, 0xa8, 0x64, 0x80, 0x07, + 0x90, 0x84, 0x00, 0xff, 0x01, 0x30, 0x80, 0x01, 0x11, 0x38, 0x70, 0x07, + 0x00, 0x01, 0x00, 0x69, 0x00, 0x05, 0x08, 0x0c, 0x7a, 0x99, 0x00, 0x40, + 0x70, 0x07, 0x00, 0x03, 0x70, 0x12, 0x29, 0x00, 0x70, 0x16, 0x70, 0x1a, + 0x70, 0x4b, 0x7e, 0x95, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xe6, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x90, 0x3e, 0x20, 0x61, 0x18, 0x00, 0x61, 0xd0, + 0x81, 0xff, 0x19, 0x04, 0x7f, 0x17, 0x61, 0x30, 0xd1, 0x94, 0x19, 0x04, + 0x7f, 0x41, 0xa8, 0x78, 0x20, 0x70, 0x9e, 0x82, 0x1c, 0xd0, 0x0a, 0x04, + 0x7f, 0x0b, 0x60, 0x68, 0x9e, 0x02, 0x1a, 0x04, 0x7f, 0x0b, 0x71, 0x20, + 0x91, 0x86, 0x00, 0x06, 0x19, 0x04, 0x7e, 0xfd, 0x70, 0x10, 0x90, 0x5d, + 0x09, 0x04, 0x7f, 0x17, 0xb8, 0x00, 0xd0, 0xe4, 0x19, 0x04, 0x7f, 0x3b, + 0x20, 0x61, 0x1a, 0x74, 0x61, 0x00, 0x91, 0x84, 0x03, 0x01, 0x90, 0x86, + 0x00, 0x01, 0x15, 0xa0, 0x70, 0x24, 0xd0, 0xdc, 0x19, 0x04, 0x7f, 0x44, + 0xa8, 0x83, 0x00, 0x00, 0xa8, 0x03, 0x00, 0x00, 0x29, 0x08, 0x70, 0x14, + 0x90, 0x05, 0x11, 0x98, 0x71, 0x16, 0xa8, 0x7c, 0xd0, 0xf4, 0x19, 0x04, + 0x7f, 0x47, 0x08, 0x0c, 0x57, 0xd5, 0xd0, 0x9c, 0x11, 0x18, 0xa8, 0x7c, + 0xc0, 0xcc, 0xa8, 0x7e, 0x2e, 0x60, 0x08, 0x0c, 0x89, 0x70, 0x01, 0x2e, + 0x00, 0xee, 0x00, 0xbe, 0x00, 0x05, 0x20, 0x48, 0xa8, 0x00, 0x90, 0x05, + 0x1d, 0xe0, 0xa9, 0x02, 0x21, 0x48, 0xa8, 0x7c, 0xd0, 0xf4, 0x19, 0x04, + 0x7f, 0x47, 0x01, 0x2e, 0x00, 0xee, 0x00, 0xbe, 0x00, 0x05, 0x01, 0x2e, + 0x00, 0xee, 0xa8, 0x83, 0x00, 0x06, 0x00, 0xbe, 0x08, 0x04, 0x7f, 0x65, + 0xd1, 0x84, 0x0d, 0xb8, 0xd1, 0xc4, 0x11, 0x90, 0x00, 0xa0, 0xa9, 0x74, + 0x08, 0x0c, 0x67, 0x24, 0x15, 0xd0, 0xb8, 0x00, 0xd0, 0xe4, 0x15, 0xb8, + 0x71, 0x20, 0x91, 0x86, 0x00, 0x07, 0x11, 0x18, 0xa8, 0x83, 0x00, 0x02, + 0x04, 0x90, 0xa8, 0x83, 0x00, 0x08, 0x04, 0x78, 0xa8, 0x83, 0x00, 0x0e, + 0x04, 0x60, 0xa8, 0x83, 0x00, 0x17, 0x04, 0x48, 0xa8, 0x83, 0x00, 0x35, + 0x04, 0x30, 0x08, 0x0c, 0x57, 0xd9, 0xd0, 0xfc, 0x01, 0xe8, 0xa8, 0x78, + 0x20, 0x70, 0x9e, 0x82, 0x1c, 0xd0, 0x02, 0xc0, 0x60, 0x68, 0x9e, 0x02, + 0x12, 0xa8, 0x71, 0x20, 0x91, 0x86, 0x00, 0x06, 0x11, 0x88, 0x70, 0x10, + 0x90, 0x5d, 0x01, 0x70, 0xb8, 0x00, 0xd0, 0xbc, 0x01, 0x58, 0x20, 0x39, + 0x00, 0x01, 0x70, 0x00, 0x90, 0x86, 0x00, 0x07, 0x19, 0x04, 0x7e, 0xa1, + 0x70, 0x03, 0x00, 0x02, 0x08, 0x04, 0x7e, 0xa1, 0xa8, 0x83, 0x00, 0x28, + 0x00, 0x10, 0xa8, 0x83, 0x00, 0x29, 0x01, 0x2e, 0x00, 0xee, 0x00, 0xbe, + 0x04, 0x20, 0xa8, 0x83, 0x00, 0x2a, 0x0c, 0xc8, 0xa8, 0x83, 0x00, 0x45, + 0x0c, 0xb0, 0x2e, 0x60, 0x20, 0x19, 0x00, 0x02, 0x60, 0x1b, 0x00, 0x14, + 0x08, 0x0c, 0xe7, 0x54, 0x01, 0x2e, 0x00, 0xee, 0x00, 0xbe, 0x00, 0x05, + 0x20, 0x09, 0x00, 0x3e, 0x00, 0x58, 0x20, 0x09, 0x00, 0x04, 0x00, 0x40, + 0x20, 0x09, 0x00, 0x06, 0x00, 0x28, 0x20, 0x09, 0x00, 0x16, 0x00, 0x10, + 0x20, 0x09, 0x00, 0x01, 0xa8, 0x84, 0x90, 0x84, 0xff, 0x00, 0x91, 0x05, + 0xa8, 0x86, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x6e, 0x9f, + 0x01, 0x2e, 0x00, 0x05, 0x08, 0x0c, 0x10, 0x40, 0x00, 0x05, 0x00, 0xd6, + 0x08, 0x0c, 0x89, 0x67, 0x00, 0xde, 0x00, 0x05, 0x00, 0xd6, 0x00, 0xe6, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0x00, 0x40, 0x70, 0x2c, + 0xd0, 0x84, 0x01, 0xd8, 0x90, 0x8c, 0x07, 0x80, 0x19, 0x0c, 0x80, 0x56, + 0xd0, 0x9c, 0x11, 0xa8, 0x20, 0x71, 0x18, 0x00, 0x70, 0xc0, 0x90, 0xea, + 0x00, 0x20, 0x02, 0x78, 0x80, 0x01, 0x70, 0xc2, 0x70, 0x2c, 0x20, 0x48, + 0xa8, 0x00, 0x70, 0x2e, 0x90, 0x06, 0xa8, 0x02, 0xa8, 0x06, 0x20, 0x71, + 0x00, 0x40, 0x29, 0x00, 0x70, 0x22, 0x70, 0x2c, 0x0c, 0x28, 0x01, 0x2e, + 0x00, 0xee, 0x00, 0xde, 0x00, 0x05, 0x00, 0x06, 0x90, 0x84, 0x07, 0x80, + 0x19, 0x0c, 0x80, 0x56, 0x00, 0x0e, 0x00, 0x05, 0xa8, 0x98, 0x90, 0x84, + 0x00, 0x03, 0x05, 0xa8, 0x08, 0x0c, 0xb2, 0x7d, 0x05, 0xd8, 0x29, 0x00, + 0x60, 0x16, 0xa8, 0x64, 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x35, + 0x11, 0x38, 0x60, 0x08, 0xc0, 0xfd, 0x60, 0x0a, 0x20, 0x01, 0x19, 0x6b, + 0x20, 0x04, 0x00, 0x98, 0xa8, 0xa0, 0x90, 0x84, 0x00, 0xff, 0xa9, 0x9c, + 0x91, 0x8c, 0xff, 0x00, 0x91, 0x05, 0xa9, 0x9c, 0x91, 0x8c, 0x00, 0xff, + 0x08, 0x0c, 0x28, 0x73, 0x15, 0x40, 0x00, 0xb6, 0x08, 0x0c, 0x67, 0x24, + 0x2b, 0x00, 0x00, 0xbe, 0x15, 0x10, 0x60, 0x12, 0x60, 0x23, 0x00, 0x01, + 0x20, 0x09, 0x00, 0x40, 0xa8, 0x64, 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, + 0x00, 0x35, 0x01, 0x10, 0x20, 0x09, 0x00, 0x41, 0x08, 0x0c, 0xb3, 0x52, + 0x00, 0x05, 0xa8, 0x7b, 0x01, 0x01, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x08, 0x0c, 0x6e, 0x9f, 0x01, 0x2e, 0x00, 0x05, 0xa8, 0x7b, 0x00, 0x2c, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x6e, 0x9f, 0x01, 0x2e, + 0x00, 0x05, 0xa8, 0x7b, 0x00, 0x28, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x08, 0x0c, 0x6e, 0x9f, 0x01, 0x2e, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x05, + 0x00, 0xd6, 0x00, 0xc6, 0x00, 0x36, 0x00, 0x26, 0x00, 0x16, 0x00, 0xb6, + 0x70, 0x07, 0x00, 0x01, 0xaa, 0x74, 0x92, 0x82, 0x00, 0x04, 0x1a, 0x04, + 0x80, 0x47, 0xa9, 0x7c, 0x91, 0x88, 0x10, 0x00, 0x21, 0x04, 0x90, 0x5d, + 0xb8, 0x04, 0xd2, 0x84, 0x01, 0x40, 0x05, 0xe8, 0x80, 0x07, 0x90, 0x84, + 0x00, 0xff, 0x90, 0x84, 0x00, 0x06, 0x11, 0x08, 0x04, 0xb0, 0x2b, 0x10, + 0x08, 0x0c, 0xb2, 0x7d, 0x11, 0x18, 0x08, 0x0c, 0xb3, 0x25, 0x05, 0xa8, + 0x62, 0x12, 0xa8, 0x74, 0x00, 0x02, 0x80, 0x25, 0x80, 0x2a, 0x80, 0x2d, + 0x80, 0x33, 0x20, 0x19, 0x00, 0x02, 0x08, 0x0c, 0xeb, 0xa1, 0x00, 0x60, + 0x08, 0x0c, 0xeb, 0x38, 0x00, 0x48, 0x20, 0x19, 0x00, 0x02, 0xa9, 0x80, + 0x08, 0x0c, 0xeb, 0x53, 0x00, 0x18, 0xa9, 0x80, 0x08, 0x0c, 0xeb, 0x38, + 0x08, 0x0c, 0xb2, 0xd3, 0xa8, 0x87, 0x00, 0x00, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0x6e, 0x9f, 0x01, 0x2e, 0x00, 0xbe, 0x00, 0x1e, + 0x00, 0x2e, 0x00, 0x3e, 0x00, 0xce, 0x00, 0xde, 0x00, 0x05, 0xa8, 0x87, + 0x00, 0x06, 0x0c, 0x80, 0xa8, 0x87, 0x00, 0x02, 0x0c, 0x68, 0xa8, 0x87, + 0x00, 0x05, 0x0c, 0x50, 0xa8, 0x87, 0x00, 0x04, 0x0c, 0x38, 0xa8, 0x87, + 0x00, 0x07, 0x0c, 0x20, 0x20, 0x91, 0x80, 0x00, 0x0e, 0x04, 0x80, 0x58, + 0x00, 0x06, 0x00, 0x16, 0x20, 0x01, 0x80, 0x03, 0x00, 0x06, 0x08, 0x04, + 0x0d, 0xce, 0x20, 0x01, 0x18, 0x34, 0x20, 0x04, 0x90, 0x05, 0x00, 0x05, + 0x00, 0x05, 0x00, 0xf6, 0x20, 0x79, 0x03, 0x00, 0x20, 0x01, 0x02, 0x00, + 0x20, 0x0c, 0xc1, 0xe5, 0xc1, 0xdc, 0x21, 0x02, 0x20, 0x09, 0x02, 0x18, + 0x21, 0x0c, 0xd1, 0xec, 0x11, 0x20, 0x08, 0x0c, 0x15, 0xa0, 0x00, 0xfe, + 0x00, 0x05, 0x20, 0x01, 0x02, 0x0d, 0x20, 0x03, 0x00, 0x20, 0x78, 0x1f, + 0x03, 0x00, 0x00, 0xfe, 0x00, 0x05, 0x78, 0x1c, 0xd0, 0x8c, 0x09, 0x04, + 0x80, 0xd8, 0x68, 0xc0, 0x90, 0xaa, 0x00, 0x05, 0x0a, 0x04, 0x87, 0x1c, + 0x7d, 0x44, 0x7c, 0x40, 0x95, 0x84, 0x00, 0xf6, 0x15, 0x10, 0x94, 0x84, + 0x70, 0x00, 0x01, 0x40, 0x90, 0x8a, 0x20, 0x00, 0x12, 0x60, 0x95, 0x84, + 0x07, 0x00, 0x80, 0x07, 0x08, 0x04, 0x80, 0xdf, 0x70, 0x00, 0x90, 0x84, + 0xff, 0x00, 0x90, 0x86, 0x81, 0x00, 0x0d, 0xa8, 0x00, 0xb0, 0x94, 0x84, + 0x0f, 0xff, 0x11, 0x30, 0x70, 0x00, 0x90, 0x84, 0xff, 0x00, 0x90, 0x86, + 0x81, 0x00, 0x11, 0xc0, 0x08, 0x0c, 0xf0, 0x57, 0x08, 0x0c, 0x86, 0x01, + 0x78, 0x17, 0x01, 0x40, 0x00, 0xa8, 0x95, 0x84, 0x00, 0x76, 0x11, 0x18, + 0x08, 0x0c, 0x86, 0x5f, 0x19, 0xc0, 0xd5, 0xa4, 0x01, 0x48, 0x00, 0x46, + 0x00, 0x56, 0x08, 0x0c, 0x81, 0x3a, 0x08, 0x0c, 0x23, 0x6e, 0x00, 0x5e, + 0x00, 0x4e, 0x00, 0x20, 0x08, 0x0c, 0xf0, 0x57, 0x78, 0x17, 0x01, 0x40, + 0x08, 0x0c, 0x76, 0x37, 0x01, 0x68, 0x20, 0x01, 0x01, 0x11, 0x20, 0x04, + 0xd0, 0x8c, 0x01, 0x40, 0x68, 0x93, 0x00, 0x00, 0x20, 0x01, 0x01, 0x10, + 0x20, 0x03, 0x00, 0x08, 0x20, 0x03, 0x00, 0x00, 0x08, 0x0c, 0x81, 0x1b, + 0x20, 0x01, 0x19, 0xf1, 0x20, 0x04, 0x90, 0x05, 0x09, 0x0c, 0x9a, 0xb1, + 0x00, 0x05, 0x00, 0x02, 0x80, 0xf1, 0x84, 0x09, 0x80, 0xe8, 0x80, 0xe8, + 0x80, 0xe8, 0x80, 0xe8, 0x80, 0xe8, 0x80, 0xe8, 0x78, 0x17, 0x01, 0x40, + 0x20, 0x01, 0x19, 0xf1, 0x20, 0x04, 0x90, 0x05, 0x09, 0x0c, 0x9a, 0xb1, + 0x00, 0x05, 0x70, 0x00, 0x90, 0x8c, 0xff, 0x00, 0x91, 0x94, 0xf0, 0x00, + 0x81, 0x0f, 0x94, 0x84, 0x0f, 0xff, 0x68, 0x92, 0x92, 0x86, 0x20, 0x00, + 0x11, 0x50, 0x68, 0x00, 0x90, 0x86, 0x00, 0x01, 0x11, 0x18, 0x08, 0x0c, + 0x58, 0x3f, 0x00, 0x70, 0x08, 0x0c, 0x81, 0x5a, 0x00, 0x58, 0x92, 0x86, + 0x30, 0x00, 0x11, 0x18, 0x08, 0x0c, 0x83, 0x41, 0x00, 0x28, 0x92, 0x86, + 0x80, 0x00, 0x11, 0x10, 0x08, 0x0c, 0x85, 0x28, 0x78, 0x17, 0x01, 0x40, + 0x20, 0x01, 0x19, 0xf1, 0x20, 0x04, 0x90, 0x05, 0x09, 0x0c, 0x9a, 0xb1, + 0x00, 0x05, 0x20, 0x01, 0x18, 0x10, 0x20, 0x04, 0xd0, 0x8c, 0x01, 0x78, + 0x20, 0x01, 0x18, 0x00, 0x20, 0x04, 0x90, 0x86, 0x00, 0x03, 0x11, 0x48, + 0x00, 0x26, 0x00, 0x36, 0x20, 0x11, 0x80, 0x48, 0x25, 0x18, 0x08, 0x0c, + 0x4c, 0x44, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x05, 0x00, 0x36, 0x00, 0x46, + 0x00, 0x56, 0x00, 0xf6, 0x20, 0x79, 0x02, 0x00, 0x20, 0x19, 0xff, 0xfe, + 0x7c, 0x30, 0x00, 0x50, 0x00, 0x36, 0x00, 0x46, 0x00, 0x56, 0x00, 0xf6, + 0x20, 0x79, 0x02, 0x00, 0x7d, 0x44, 0x7c, 0x40, 0x20, 0x19, 0xff, 0xff, + 0x20, 0x01, 0x18, 0x10, 0x20, 0x04, 0xd0, 0x8c, 0x01, 0x60, 0x20, 0x01, + 0x18, 0x00, 0x20, 0x04, 0x90, 0x86, 0x00, 0x03, 0x11, 0x30, 0x00, 0x26, + 0x20, 0x11, 0x80, 0x48, 0x08, 0x0c, 0x4c, 0x44, 0x00, 0x2e, 0x00, 0xfe, + 0x00, 0x5e, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xc6, + 0x70, 0x10, 0x90, 0x84, 0xff, 0x00, 0x80, 0x07, 0x90, 0x96, 0x00, 0x01, + 0x01, 0x20, 0x90, 0x96, 0x00, 0x23, 0x19, 0x04, 0x83, 0x12, 0x91, 0x86, + 0x00, 0x23, 0x15, 0xc0, 0x08, 0x0c, 0x85, 0xc6, 0x09, 0x04, 0x83, 0x12, + 0x61, 0x20, 0x91, 0x86, 0x00, 0x01, 0x01, 0x50, 0x91, 0x86, 0x00, 0x04, + 0x01, 0x38, 0x91, 0x86, 0x00, 0x08, 0x01, 0x20, 0x91, 0x86, 0x00, 0x0a, + 0x19, 0x04, 0x83, 0x12, 0x71, 0x24, 0x61, 0x0a, 0x70, 0x30, 0x90, 0x8e, + 0x02, 0x00, 0x11, 0x30, 0x20, 0x09, 0x00, 0x15, 0x08, 0x0c, 0xb3, 0x52, + 0x08, 0x04, 0x83, 0x12, 0x90, 0x8e, 0x02, 0x14, 0x01, 0x18, 0x90, 0x8e, + 0x02, 0x10, 0x11, 0x30, 0x20, 0x09, 0x00, 0x15, 0x08, 0x0c, 0xb3, 0x52, + 0x08, 0x04, 0x83, 0x12, 0x90, 0x8e, 0x01, 0x00, 0x19, 0x04, 0x83, 0x12, + 0x70, 0x34, 0x90, 0x05, 0x19, 0x04, 0x83, 0x12, 0x20, 0x09, 0x00, 0x16, + 0x08, 0x0c, 0xb3, 0x52, 0x08, 0x04, 0x83, 0x12, 0x91, 0x86, 0x00, 0x22, + 0x19, 0x04, 0x83, 0x12, 0x70, 0x30, 0x90, 0x8e, 0x03, 0x00, 0x15, 0x80, + 0x68, 0xdc, 0xd0, 0xa4, 0x05, 0x28, 0xc0, 0xb5, 0x68, 0xde, 0x71, 0x00, + 0x91, 0x8c, 0x00, 0xff, 0x69, 0x7e, 0x70, 0x04, 0x68, 0x82, 0x00, 0xf6, + 0x20, 0x79, 0x01, 0x00, 0x79, 0xe6, 0x78, 0xea, 0x00, 0x06, 0x90, 0x84, + 0x00, 0xff, 0x00, 0x16, 0x20, 0x08, 0x08, 0x0c, 0x28, 0xbc, 0x79, 0x32, + 0x79, 0x36, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0xfe, 0x08, 0x0c, 0x28, 0x73, + 0x69, 0x5e, 0x70, 0x3c, 0x00, 0xe6, 0x20, 0x71, 0x01, 0x40, 0x70, 0x86, + 0x20, 0x71, 0x18, 0x00, 0x70, 0xb6, 0x00, 0xee, 0x70, 0x34, 0x90, 0x05, + 0x19, 0x04, 0x83, 0x12, 0x20, 0x09, 0x00, 0x17, 0x08, 0x04, 0x82, 0xc2, + 0x90, 0x8e, 0x04, 0x00, 0x11, 0x90, 0x70, 0x34, 0x90, 0x05, 0x19, 0x04, + 0x83, 0x12, 0x08, 0x0c, 0x76, 0x37, 0x01, 0x20, 0x20, 0x09, 0x00, 0x1d, + 0x08, 0x04, 0x82, 0xc2, 0x68, 0xdc, 0xc0, 0xa5, 0x68, 0xde, 0x20, 0x09, + 0x00, 0x30, 0x08, 0x04, 0x82, 0xc2, 0x90, 0x8e, 0x05, 0x00, 0x11, 0x40, + 0x70, 0x34, 0x90, 0x05, 0x19, 0x04, 0x83, 0x12, 0x20, 0x09, 0x00, 0x18, + 0x08, 0x04, 0x82, 0xc2, 0x90, 0x8e, 0x20, 0x10, 0x11, 0x20, 0x20, 0x09, + 0x00, 0x19, 0x08, 0x04, 0x82, 0xc2, 0x90, 0x8e, 0x21, 0x10, 0x11, 0x20, + 0x20, 0x09, 0x00, 0x1a, 0x08, 0x04, 0x82, 0xc2, 0x90, 0x8e, 0x52, 0x00, + 0x11, 0x40, 0x70, 0x34, 0x90, 0x05, 0x19, 0x04, 0x83, 0x12, 0x20, 0x09, + 0x00, 0x1b, 0x08, 0x04, 0x82, 0xc2, 0x90, 0x8e, 0x50, 0x00, 0x11, 0x40, + 0x70, 0x34, 0x90, 0x05, 0x19, 0x04, 0x83, 0x12, 0x20, 0x09, 0x00, 0x1c, + 0x08, 0x04, 0x82, 0xc2, 0x90, 0x8e, 0x13, 0x00, 0x11, 0x20, 0x20, 0x09, + 0x00, 0x34, 0x08, 0x04, 0x82, 0xc2, 0x90, 0x8e, 0x12, 0x00, 0x11, 0x40, + 0x70, 0x34, 0x90, 0x05, 0x19, 0x04, 0x83, 0x12, 0x20, 0x09, 0x00, 0x24, + 0x08, 0x04, 0x82, 0xc2, 0x90, 0x8c, 0xff, 0x00, 0x91, 0x8e, 0x24, 0x00, + 0x11, 0x70, 0x20, 0x09, 0x00, 0x2d, 0x20, 0x01, 0x18, 0x10, 0x20, 0x04, + 0xd0, 0x9c, 0x09, 0x04, 0x82, 0xc2, 0x08, 0x0c, 0xdf, 0x1a, 0x19, 0x04, + 0x83, 0x12, 0x08, 0x04, 0x82, 0xc0, 0x90, 0x8c, 0xff, 0x00, 0x91, 0x8e, + 0x53, 0x00, 0x11, 0x20, 0x20, 0x09, 0x00, 0x2a, 0x08, 0x04, 0x82, 0xc2, + 0x90, 0x8e, 0x0f, 0x00, 0x11, 0x20, 0x20, 0x09, 0x00, 0x20, 0x08, 0x04, + 0x82, 0xc2, 0x90, 0x8e, 0x61, 0x04, 0x15, 0x30, 0x20, 0x29, 0x02, 0x05, + 0x20, 0x11, 0x02, 0x6d, 0x82, 0x08, 0x22, 0x04, 0x90, 0x82, 0x00, 0x04, + 0x80, 0x04, 0x80, 0x04, 0x20, 0xa8, 0x20, 0x11, 0x80, 0x15, 0x21, 0x1c, + 0x81, 0x08, 0x00, 0x46, 0x21, 0x24, 0x08, 0x0c, 0x4c, 0x44, 0x00, 0x4e, + 0x81, 0x08, 0x0f, 0x04, 0x82, 0x76, 0x91, 0x86, 0x02, 0x80, 0x1d, 0x88, + 0x25, 0x04, 0x80, 0x00, 0x20, 0x2a, 0x20, 0x09, 0x02, 0x60, 0x0c, 0x58, + 0x20, 0x2b, 0x00, 0x00, 0x20, 0x09, 0x00, 0x23, 0x08, 0x04, 0x82, 0xc2, + 0x90, 0x8e, 0x60, 0x00, 0x11, 0x20, 0x20, 0x09, 0x00, 0x3f, 0x08, 0x04, + 0x82, 0xc2, 0x90, 0x8e, 0x54, 0x00, 0x11, 0x38, 0x08, 0x0c, 0x86, 0xcc, + 0x19, 0x04, 0x83, 0x12, 0x20, 0x09, 0x00, 0x46, 0x04, 0xa8, 0x90, 0x8e, + 0x55, 0x00, 0x11, 0x48, 0x08, 0x0c, 0x86, 0xf4, 0x11, 0x18, 0x20, 0x09, + 0x00, 0x41, 0x04, 0x60, 0x20, 0x09, 0x00, 0x42, 0x04, 0x48, 0x90, 0x8e, + 0x78, 0x00, 0x11, 0x18, 0x20, 0x09, 0x00, 0x45, 0x04, 0x18, 0x90, 0x8e, + 0x10, 0x00, 0x11, 0x18, 0x20, 0x09, 0x00, 0x4e, 0x00, 0xe8, 0x90, 0x8e, + 0x63, 0x00, 0x11, 0x18, 0x20, 0x09, 0x00, 0x4a, 0x00, 0xb8, 0x90, 0x8c, + 0xff, 0x00, 0x91, 0x8e, 0x56, 0x00, 0x11, 0x18, 0x20, 0x09, 0x00, 0x4f, + 0x00, 0x78, 0x90, 0x8c, 0xff, 0x00, 0x91, 0x8e, 0x57, 0x00, 0x11, 0x18, + 0x20, 0x09, 0x00, 0x50, 0x00, 0x38, 0x20, 0x09, 0x00, 0x1d, 0x68, 0x38, + 0xd0, 0xd4, 0x01, 0x10, 0x20, 0x09, 0x00, 0x4c, 0x00, 0x16, 0x20, 0x11, + 0x02, 0x63, 0x22, 0x04, 0x82, 0x11, 0x22, 0x0c, 0x08, 0x0c, 0x28, 0x73, + 0x19, 0x04, 0x83, 0x15, 0x08, 0x0c, 0x66, 0xb9, 0x19, 0x04, 0x83, 0x15, + 0xbe, 0x12, 0xbd, 0x16, 0x00, 0x1e, 0x00, 0x16, 0x08, 0x0c, 0x76, 0x37, + 0x01, 0xc0, 0x68, 0xdc, 0xd0, 0x8c, 0x11, 0x48, 0x70, 0x00, 0x90, 0x84, + 0x00, 0xff, 0x11, 0x88, 0x70, 0x04, 0x90, 0x84, 0xff, 0x00, 0x11, 0x68, + 0x00, 0x40, 0x68, 0x7c, 0x96, 0x06, 0x11, 0x48, 0x68, 0x80, 0x95, 0x06, + 0x90, 0x84, 0xff, 0x00, 0x11, 0x20, 0x95, 0x84, 0x00, 0xff, 0xb8, 0xc2, + 0x00, 0x80, 0xb8, 0xc0, 0x90, 0x05, 0x11, 0x68, 0x91, 0x86, 0x00, 0x46, + 0x11, 0x50, 0x68, 0x7c, 0x96, 0x06, 0x11, 0x38, 0x68, 0x80, 0x95, 0x06, + 0x90, 0x84, 0xff, 0x00, 0x11, 0x10, 0x00, 0x1e, 0x00, 0x98, 0x08, 0x0c, + 0xb2, 0x7d, 0x01, 0xa8, 0x2b, 0x08, 0x61, 0x12, 0x60, 0x23, 0x00, 0x04, + 0x71, 0x20, 0x61, 0x0a, 0x00, 0x1e, 0x91, 0x86, 0x00, 0x4c, 0x11, 0x10, + 0x60, 0x23, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x1e, 0x08, 0x0c, 0xb3, 0x52, + 0x00, 0xce, 0x00, 0xbe, 0x00, 0x05, 0x00, 0x1e, 0x0c, 0xd8, 0x20, 0x01, + 0x18, 0x0e, 0x20, 0x04, 0xd0, 0xec, 0x01, 0x20, 0x20, 0x11, 0x80, 0x49, + 0x08, 0x0c, 0x4c, 0x44, 0x08, 0x0c, 0xb3, 0x25, 0x0d, 0x90, 0x2b, 0x08, + 0x61, 0x12, 0x60, 0x23, 0x00, 0x04, 0x71, 0x20, 0x61, 0x0a, 0x00, 0x1e, + 0x00, 0x16, 0x91, 0x86, 0x00, 0x17, 0x01, 0x18, 0x91, 0x86, 0x00, 0x30, + 0x11, 0x28, 0x60, 0x07, 0x00, 0x09, 0x60, 0x17, 0x29, 0x00, 0x00, 0x20, + 0x60, 0x07, 0x00, 0x51, 0x60, 0x17, 0x00, 0x00, 0x60, 0x2f, 0x00, 0x09, + 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x95, 0x47, 0x08, 0xa0, 0x08, 0x0c, + 0x87, 0x3b, 0x11, 0x58, 0x08, 0x0c, 0x33, 0x74, 0x11, 0x40, 0x70, 0x10, + 0x90, 0x84, 0xff, 0x00, 0x80, 0x07, 0x90, 0x8e, 0x00, 0x08, 0x11, 0x08, + 0x00, 0x09, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xc6, 0x00, 0x46, 0x70, 0x00, + 0x90, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0x91, 0x86, 0x00, 0x33, 0x11, 0xe8, + 0x08, 0x0c, 0x85, 0xc6, 0x09, 0x04, 0x83, 0xa1, 0x71, 0x24, 0x61, 0x0a, + 0x70, 0x30, 0x90, 0x8e, 0x02, 0x00, 0x11, 0x40, 0x70, 0x34, 0x90, 0x05, + 0x15, 0xd0, 0x20, 0x09, 0x00, 0x15, 0x08, 0x0c, 0xb3, 0x52, 0x04, 0xa8, + 0x90, 0x8e, 0x01, 0x00, 0x15, 0x90, 0x70, 0x34, 0x90, 0x05, 0x15, 0x78, + 0x20, 0x09, 0x00, 0x16, 0x08, 0x0c, 0xb3, 0x52, 0x04, 0x50, 0x91, 0x86, + 0x00, 0x32, 0x15, 0x38, 0x70, 0x30, 0x90, 0x8e, 0x14, 0x00, 0x15, 0x18, + 0x20, 0x09, 0x00, 0x38, 0x00, 0x16, 0x20, 0x11, 0x02, 0x63, 0x22, 0x04, + 0x82, 0x11, 0x22, 0x0c, 0x08, 0x0c, 0x28, 0x73, 0x11, 0xb8, 0x08, 0x0c, + 0x66, 0xb9, 0x11, 0xa0, 0xbe, 0x12, 0xbd, 0x16, 0x08, 0x0c, 0xb2, 0x7d, + 0x01, 0x78, 0x2b, 0x08, 0x61, 0x12, 0x08, 0x0c, 0xd5, 0x54, 0x60, 0x23, + 0x00, 0x04, 0x71, 0x20, 0x61, 0x0a, 0x00, 0x1e, 0x08, 0x0c, 0xb3, 0x52, + 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x10, 0x00, 0xce, 0x00, 0x1e, 0x00, 0x4e, + 0x00, 0xce, 0x00, 0xbe, 0x00, 0x05, 0x00, 0xb6, 0x00, 0x46, 0x00, 0xe6, + 0x00, 0xd6, 0x20, 0x28, 0x21, 0x30, 0x96, 0x96, 0x00, 0xff, 0x11, 0xb8, + 0x95, 0x92, 0xff, 0xfc, 0x02, 0xa0, 0x95, 0x96, 0xff, 0xfd, 0x11, 0x20, + 0x20, 0x09, 0x00, 0x7f, 0x08, 0x04, 0x84, 0x03, 0x95, 0x96, 0xff, 0xfe, + 0x11, 0x20, 0x20, 0x09, 0x00, 0x7e, 0x08, 0x04, 0x84, 0x03, 0x95, 0x96, + 0xff, 0xfc, 0x11, 0x18, 0x20, 0x09, 0x00, 0x80, 0x04, 0xf0, 0x20, 0x11, + 0x00, 0x00, 0x20, 0x19, 0x18, 0x37, 0x23, 0x1c, 0xd3, 0xac, 0x01, 0x30, + 0x90, 0x26, 0x20, 0xa9, 0x08, 0x00, 0x20, 0x71, 0x10, 0x00, 0x00, 0x30, + 0x20, 0x21, 0x00, 0x81, 0x20, 0xa9, 0x07, 0x7f, 0x20, 0x71, 0x10, 0x81, + 0x2e, 0x1c, 0x93, 0xdd, 0x00, 0x00, 0x11, 0x40, 0x82, 0xff, 0x11, 0xd0, + 0x94, 0x96, 0x00, 0xff, 0x01, 0xb8, 0x24, 0x10, 0xc2, 0xfd, 0x00, 0xa0, + 0xbf, 0x10, 0x26, 0x00, 0x97, 0x06, 0xb8, 0x14, 0x11, 0x20, 0x95, 0x46, + 0x11, 0x10, 0x24, 0x08, 0x00, 0xb0, 0x97, 0x45, 0x11, 0x48, 0x94, 0xc6, + 0x00, 0x7e, 0x01, 0x30, 0x94, 0xc6, 0x00, 0x7f, 0x01, 0x18, 0x94, 0xc6, + 0x00, 0x80, 0x1d, 0x20, 0x84, 0x20, 0x8e, 0x70, 0x1f, 0x04, 0x83, 0xd8, + 0x82, 0xff, 0x11, 0x18, 0x90, 0x85, 0x00, 0x01, 0x00, 0x18, 0xc2, 0xfc, + 0x22, 0x08, 0x90, 0x06, 0x00, 0xde, 0x00, 0xee, 0x00, 0x4e, 0x00, 0xbe, + 0x00, 0x05, 0x20, 0x01, 0x18, 0x37, 0x20, 0x0c, 0x91, 0x84, 0x00, 0x80, + 0x01, 0x10, 0xd1, 0x8c, 0x01, 0x38, 0x70, 0x00, 0x90, 0x8c, 0xff, 0x00, + 0x81, 0x0f, 0x91, 0x84, 0x00, 0x0f, 0x00, 0x4a, 0x78, 0x17, 0x01, 0x40, + 0x20, 0x01, 0x19, 0xf1, 0x20, 0x04, 0x90, 0x05, 0x09, 0x0c, 0x9a, 0xb1, + 0x00, 0x05, 0x84, 0x31, 0x84, 0x31, 0x84, 0x31, 0x85, 0xd8, 0x84, 0x31, + 0x84, 0x3a, 0x84, 0x65, 0x84, 0xf3, 0x84, 0x31, 0x84, 0x31, 0x84, 0x31, + 0x84, 0x31, 0x84, 0x31, 0x84, 0x31, 0x84, 0x31, 0x84, 0x31, 0x78, 0x17, + 0x01, 0x40, 0x20, 0x01, 0x19, 0xf1, 0x20, 0x04, 0x90, 0x05, 0x09, 0x0c, + 0x9a, 0xb1, 0x00, 0x05, 0x00, 0xb6, 0x71, 0x10, 0xd1, 0xbc, 0x01, 0xe8, + 0x71, 0x20, 0x21, 0x60, 0x9c, 0x8c, 0x00, 0x07, 0x11, 0xc0, 0x9c, 0x8a, + 0x1c, 0xd0, 0x02, 0xa8, 0x68, 0x68, 0x9c, 0x02, 0x12, 0x90, 0x70, 0x08, + 0x90, 0x84, 0x00, 0xff, 0x61, 0x10, 0x21, 0x58, 0xb9, 0x10, 0x91, 0x06, + 0x11, 0x50, 0x70, 0x0c, 0xb9, 0x14, 0x91, 0x06, 0x11, 0x30, 0x71, 0x24, + 0x61, 0x0a, 0x20, 0x09, 0x00, 0x46, 0x08, 0x0c, 0xb3, 0x52, 0x78, 0x17, + 0x01, 0x40, 0x20, 0x01, 0x19, 0xf1, 0x20, 0x04, 0x90, 0x05, 0x09, 0x0c, + 0x9a, 0xb1, 0x00, 0xbe, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xc6, 0x94, 0x84, + 0x0f, 0xff, 0x09, 0x04, 0x84, 0xc9, 0x71, 0x10, 0xd1, 0xbc, 0x19, 0x04, + 0x84, 0xc9, 0x71, 0x08, 0x70, 0x0c, 0x20, 0x28, 0x91, 0x8c, 0x00, 0xff, + 0x21, 0x30, 0x90, 0x94, 0xff, 0x00, 0x15, 0xb0, 0x81, 0xff, 0x15, 0xa0, + 0x90, 0x80, 0x33, 0xb6, 0x20, 0x0d, 0x91, 0x8c, 0xff, 0x00, 0x81, 0x0f, + 0x20, 0x01, 0x00, 0x80, 0x91, 0x06, 0x09, 0x04, 0x84, 0xc9, 0x08, 0x0c, + 0x66, 0xb9, 0x19, 0x04, 0x84, 0xc9, 0xbe, 0x12, 0xbd, 0x16, 0xb8, 0x00, + 0xd0, 0xec, 0x15, 0xd8, 0xba, 0x04, 0x92, 0x94, 0xff, 0x00, 0x92, 0x86, + 0x06, 0x00, 0x11, 0xa0, 0x08, 0x0c, 0xb2, 0x7d, 0x05, 0xe8, 0x2b, 0x08, + 0x70, 0x28, 0x60, 0x46, 0x70, 0x2c, 0x60, 0x4a, 0x61, 0x12, 0x60, 0x23, + 0x00, 0x06, 0x71, 0x20, 0x61, 0x0a, 0x71, 0x30, 0x61, 0x56, 0x20, 0x09, + 0x00, 0x44, 0x08, 0x0c, 0xe1, 0x92, 0x04, 0x08, 0x08, 0x0c, 0x6a, 0xa3, + 0x11, 0x38, 0xb8, 0x07, 0x06, 0x06, 0x0c, 0x30, 0x19, 0x0c, 0x83, 0xa5, + 0x11, 0xc0, 0x08, 0x98, 0x08, 0x0c, 0xb2, 0x7d, 0x2b, 0x08, 0x01, 0x98, + 0x61, 0x12, 0x60, 0x23, 0x00, 0x04, 0x71, 0x20, 0x61, 0x0a, 0x92, 0x86, + 0x04, 0x00, 0x11, 0x18, 0x60, 0x07, 0x00, 0x05, 0x00, 0x10, 0x60, 0x07, + 0x00, 0x01, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x95, 0x47, 0x08, 0x0c, + 0x9a, 0xb1, 0x78, 0x17, 0x01, 0x40, 0x20, 0x01, 0x19, 0xf1, 0x20, 0x04, + 0x90, 0x05, 0x09, 0x0c, 0x9a, 0xb1, 0x00, 0xce, 0x00, 0xbe, 0x00, 0x05, + 0x20, 0x01, 0x18, 0x0e, 0x20, 0x04, 0xd0, 0xec, 0x01, 0x20, 0x20, 0x11, + 0x80, 0x49, 0x08, 0x0c, 0x4c, 0x44, 0x08, 0x0c, 0xb3, 0x25, 0x0d, 0x48, + 0x2b, 0x08, 0x61, 0x12, 0x60, 0x23, 0x00, 0x06, 0x71, 0x20, 0x61, 0x0a, + 0x71, 0x30, 0x61, 0x56, 0x60, 0x17, 0xf3, 0x00, 0x60, 0x03, 0x00, 0x01, + 0x60, 0x07, 0x00, 0x41, 0x08, 0x0c, 0x94, 0xff, 0x08, 0x0c, 0x9a, 0xb1, + 0x08, 0xb0, 0x00, 0xb6, 0x71, 0x10, 0xd1, 0xbc, 0x01, 0xe8, 0x70, 0x20, + 0x20, 0x60, 0x9c, 0x84, 0x00, 0x07, 0x11, 0xc0, 0x9c, 0x82, 0x1c, 0xd0, + 0x02, 0xa8, 0x68, 0x68, 0x9c, 0x02, 0x12, 0x90, 0x70, 0x08, 0x90, 0x84, + 0x00, 0xff, 0x61, 0x10, 0x21, 0x58, 0xb9, 0x10, 0x91, 0x06, 0x11, 0x50, + 0x70, 0x0c, 0xb9, 0x14, 0x91, 0x06, 0x11, 0x30, 0x71, 0x24, 0x61, 0x0a, + 0x20, 0x09, 0x00, 0x45, 0x08, 0x0c, 0xb3, 0x52, 0x78, 0x17, 0x01, 0x40, + 0x20, 0x01, 0x19, 0xf1, 0x20, 0x04, 0x90, 0x05, 0x09, 0x0c, 0x9a, 0xb1, + 0x00, 0xbe, 0x00, 0x05, 0x61, 0x20, 0x91, 0x86, 0x00, 0x02, 0x01, 0x28, + 0x91, 0x86, 0x00, 0x05, 0x01, 0x10, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, + 0x08, 0x0c, 0x87, 0x3b, 0x11, 0x80, 0x08, 0x0c, 0x33, 0x74, 0x11, 0x68, + 0x70, 0x10, 0x90, 0x84, 0xff, 0x00, 0x80, 0x07, 0x90, 0x86, 0x00, 0x00, + 0x11, 0x30, 0x91, 0x84, 0x00, 0x0f, 0x90, 0x8a, 0x00, 0x06, 0x12, 0x08, + 0x00, 0x0b, 0x00, 0x05, 0x85, 0x42, 0x85, 0x43, 0x85, 0x42, 0x85, 0x42, + 0x85, 0xa8, 0x85, 0xb7, 0x00, 0x05, 0x00, 0xb6, 0x70, 0x0c, 0x71, 0x08, + 0x08, 0x0c, 0x28, 0x73, 0x19, 0x04, 0x85, 0xa6, 0x08, 0x0c, 0x66, 0xb9, + 0x19, 0x04, 0x85, 0xa6, 0xbe, 0x12, 0xbd, 0x16, 0x71, 0x10, 0xd1, 0xbc, + 0x05, 0x40, 0x70, 0x2c, 0xd0, 0x84, 0x11, 0x20, 0xb8, 0x00, 0xd0, 0xbc, + 0x19, 0x04, 0x85, 0xa6, 0x08, 0x0c, 0x6a, 0xa3, 0x01, 0x48, 0x90, 0x86, + 0x00, 0x04, 0x01, 0x30, 0x08, 0x0c, 0x6a, 0xab, 0x01, 0x18, 0x90, 0x86, + 0x00, 0x04, 0x15, 0x88, 0x00, 0xc6, 0x08, 0x0c, 0x85, 0xc6, 0x00, 0xce, + 0x05, 0xd8, 0x08, 0x0c, 0xb2, 0x7d, 0x2b, 0x08, 0x05, 0xb8, 0x61, 0x12, + 0x08, 0x0c, 0xd5, 0x54, 0x60, 0x23, 0x00, 0x02, 0x71, 0x20, 0x61, 0x0a, + 0x20, 0x09, 0x00, 0x88, 0x08, 0x0c, 0xb3, 0x52, 0x04, 0x58, 0x08, 0x0c, + 0x6a, 0xa3, 0x01, 0x48, 0x90, 0x86, 0x00, 0x04, 0x01, 0x30, 0x08, 0x0c, + 0x6a, 0xab, 0x01, 0x18, 0x90, 0x86, 0x00, 0x04, 0x11, 0x80, 0x08, 0x0c, + 0xb2, 0x7d, 0x2b, 0x08, 0x01, 0xd8, 0x61, 0x12, 0x08, 0x0c, 0xd5, 0x54, + 0x60, 0x23, 0x00, 0x05, 0x71, 0x20, 0x61, 0x0a, 0x20, 0x09, 0x00, 0x88, + 0x08, 0x0c, 0xb3, 0x52, 0x00, 0x78, 0x08, 0x0c, 0xb2, 0x7d, 0x2b, 0x08, + 0x01, 0x58, 0x61, 0x12, 0x08, 0x0c, 0xd5, 0x54, 0x60, 0x23, 0x00, 0x04, + 0x71, 0x20, 0x61, 0x0a, 0x20, 0x09, 0x00, 0x01, 0x08, 0x0c, 0xb3, 0x52, + 0x00, 0xbe, 0x00, 0x05, 0x71, 0x10, 0xd1, 0xbc, 0x01, 0x58, 0x00, 0xd1, + 0x01, 0x48, 0x08, 0x0c, 0x85, 0x1e, 0x11, 0x30, 0x71, 0x24, 0x61, 0x0a, + 0x20, 0x09, 0x00, 0x89, 0x08, 0x0c, 0xb3, 0x52, 0x00, 0x05, 0x71, 0x10, + 0xd1, 0xbc, 0x01, 0x58, 0x00, 0x59, 0x01, 0x48, 0x08, 0x0c, 0x85, 0x1e, + 0x11, 0x30, 0x71, 0x24, 0x61, 0x0a, 0x20, 0x09, 0x00, 0x8a, 0x08, 0x0c, + 0xb3, 0x52, 0x00, 0x05, 0x70, 0x20, 0x20, 0x60, 0x9c, 0x84, 0x00, 0x07, + 0x11, 0x58, 0x9c, 0x82, 0x1c, 0xd0, 0x02, 0x40, 0x20, 0x01, 0x18, 0x1a, + 0x20, 0x04, 0x9c, 0x02, 0x12, 0x18, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, + 0x90, 0x06, 0x0c, 0xe8, 0x00, 0xb6, 0x71, 0x10, 0xd1, 0xbc, 0x11, 0xd8, + 0x70, 0x24, 0x20, 0x60, 0x9c, 0x84, 0x00, 0x07, 0x11, 0xb0, 0x9c, 0x82, + 0x1c, 0xd0, 0x02, 0x98, 0x68, 0x68, 0x9c, 0x02, 0x12, 0x80, 0x70, 0x08, + 0x90, 0x84, 0x00, 0xff, 0x61, 0x10, 0x21, 0x58, 0xb9, 0x10, 0x91, 0x06, + 0x11, 0x40, 0x70, 0x0c, 0xb9, 0x14, 0x91, 0x06, 0x11, 0x20, 0x20, 0x09, + 0x00, 0x51, 0x08, 0x0c, 0xb3, 0x52, 0x78, 0x17, 0x01, 0x40, 0x20, 0x01, + 0x19, 0xf1, 0x20, 0x04, 0x90, 0x05, 0x09, 0x0c, 0x9a, 0xb1, 0x00, 0xbe, + 0x00, 0x05, 0x20, 0x31, 0x01, 0x05, 0x00, 0x69, 0x00, 0x05, 0x20, 0x31, + 0x02, 0x06, 0x00, 0x49, 0x00, 0x05, 0x20, 0x31, 0x02, 0x07, 0x00, 0x29, + 0x00, 0x05, 0x20, 0x31, 0x02, 0x13, 0x00, 0x09, 0x00, 0x05, 0x00, 0xc6, + 0x00, 0x96, 0x00, 0xf6, 0x70, 0x00, 0x90, 0x84, 0xf0, 0x00, 0x90, 0x86, + 0xc0, 0x00, 0x05, 0xd0, 0x08, 0x0c, 0xb2, 0x7d, 0x05, 0xb8, 0x00, 0x66, + 0x00, 0xc6, 0x00, 0x46, 0x20, 0x11, 0x02, 0x63, 0x22, 0x04, 0x82, 0x11, + 0x22, 0x0c, 0x08, 0x0c, 0x28, 0x73, 0x15, 0xa0, 0x08, 0x0c, 0x66, 0xb9, + 0x15, 0x88, 0xbe, 0x12, 0xbd, 0x16, 0x2b, 0x00, 0x00, 0x4e, 0x00, 0xce, + 0x60, 0x12, 0x08, 0x0c, 0xd5, 0x54, 0x08, 0x0c, 0x10, 0x0e, 0x05, 0x10, + 0x29, 0x00, 0x60, 0x5a, 0x90, 0x06, 0xa8, 0x02, 0xa8, 0x66, 0xac, 0x6a, + 0xa8, 0x5c, 0x90, 0xf8, 0x00, 0x1b, 0x20, 0xa9, 0x00, 0x0e, 0xa8, 0x60, + 0x20, 0xe8, 0x20, 0xe1, 0x00, 0x00, 0x2f, 0xa0, 0x2e, 0x98, 0x40, 0x03, + 0x00, 0x6e, 0x66, 0x16, 0x60, 0x07, 0x00, 0x3e, 0x60, 0x23, 0x00, 0x01, + 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x95, 0x47, 0x08, 0x0c, 0x9a, 0xb1, + 0x00, 0xfe, 0x00, 0x9e, 0x00, 0xce, 0x00, 0x05, 0x08, 0x0c, 0xb2, 0xd3, + 0x00, 0x6e, 0x0c, 0xc0, 0x00, 0x4e, 0x00, 0xce, 0x0c, 0xc8, 0x00, 0xc6, + 0x70, 0x00, 0x90, 0x8c, 0xff, 0x00, 0x91, 0x84, 0xf0, 0x00, 0x81, 0x0f, + 0x90, 0x86, 0x20, 0x00, 0x19, 0x04, 0x86, 0xb6, 0x91, 0x86, 0x00, 0x22, + 0x15, 0xf0, 0x20, 0x01, 0x01, 0x11, 0x20, 0x04, 0x90, 0x05, 0x19, 0x04, + 0x86, 0xb8, 0x70, 0x30, 0x90, 0x8e, 0x04, 0x00, 0x09, 0x04, 0x86, 0xb8, + 0x90, 0x8e, 0x60, 0x00, 0x05, 0xe8, 0x90, 0x8e, 0x54, 0x00, 0x05, 0xd0, + 0x90, 0x8e, 0x03, 0x00, 0x11, 0xd8, 0x20, 0x09, 0x18, 0x37, 0x21, 0x0c, + 0xd1, 0x8c, 0x15, 0x90, 0xd1, 0xa4, 0x15, 0x80, 0x08, 0x0c, 0x6a, 0x61, + 0x05, 0x88, 0x68, 0xb0, 0x90, 0x84, 0x00, 0xff, 0x71, 0x00, 0x91, 0x8c, + 0x00, 0xff, 0x91, 0x06, 0x15, 0x18, 0x68, 0x80, 0x69, 0xb0, 0x91, 0x8c, + 0xff, 0x00, 0x91, 0x05, 0x71, 0x04, 0x91, 0x06, 0x11, 0xd8, 0x00, 0xe0, + 0x20, 0x09, 0x01, 0x03, 0x21, 0x0c, 0xd1, 0xb4, 0x11, 0xa8, 0x90, 0x8e, + 0x52, 0x00, 0x09, 0xe8, 0x90, 0x8e, 0x05, 0x00, 0x09, 0xd0, 0x90, 0x8e, + 0x50, 0x00, 0x09, 0xb8, 0x00, 0x58, 0x91, 0x86, 0x00, 0x23, 0x11, 0x40, + 0x08, 0x0c, 0x85, 0xc6, 0x01, 0x28, 0x60, 0x04, 0x90, 0x86, 0x00, 0x02, + 0x01, 0x18, 0x00, 0x00, 0x90, 0x06, 0x00, 0x10, 0x90, 0x85, 0x00, 0x01, + 0x00, 0xce, 0x00, 0x05, 0x70, 0x30, 0x90, 0x8e, 0x03, 0x00, 0x01, 0x18, + 0x90, 0x8e, 0x52, 0x00, 0x1d, 0x98, 0x20, 0x01, 0x18, 0x37, 0x20, 0x04, + 0x90, 0x84, 0x00, 0x09, 0x90, 0x86, 0x00, 0x08, 0x0d, 0x68, 0x0c, 0x50, + 0x01, 0x56, 0x00, 0x46, 0x00, 0x16, 0x00, 0x36, 0x70, 0x38, 0x20, 0x20, + 0x84, 0x27, 0x94, 0xa4, 0x00, 0x07, 0xd4, 0x84, 0x01, 0x48, 0x20, 0xa9, + 0x00, 0x04, 0x20, 0x19, 0x18, 0x05, 0x20, 0x11, 0x02, 0x7a, 0x08, 0x0c, + 0xc3, 0x65, 0x11, 0x78, 0xd4, 0x8c, 0x01, 0x48, 0x20, 0xa9, 0x00, 0x04, + 0x20, 0x19, 0x18, 0x01, 0x20, 0x11, 0x02, 0x7e, 0x08, 0x0c, 0xc3, 0x65, + 0x11, 0x20, 0xd4, 0x94, 0x01, 0x10, 0x90, 0x85, 0x00, 0x01, 0x00, 0x3e, + 0x00, 0x1e, 0x00, 0x4e, 0x01, 0x5e, 0x00, 0x05, 0x01, 0x56, 0x00, 0x46, + 0x00, 0x16, 0x00, 0x36, 0x70, 0x38, 0x20, 0x20, 0x84, 0x27, 0x94, 0xa4, + 0x00, 0x07, 0xd4, 0x84, 0x01, 0x48, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x19, + 0x18, 0x05, 0x20, 0x11, 0x02, 0x72, 0x08, 0x0c, 0xc3, 0x65, 0x11, 0x78, + 0xd4, 0x8c, 0x01, 0x48, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x19, 0x18, 0x01, + 0x20, 0x11, 0x02, 0x76, 0x08, 0x0c, 0xc3, 0x65, 0x11, 0x20, 0xd4, 0x94, + 0x01, 0x10, 0x90, 0x85, 0x00, 0x01, 0x00, 0x3e, 0x00, 0x1e, 0x00, 0x4e, + 0x01, 0x5e, 0x00, 0x05, 0x00, 0xf6, 0x20, 0x79, 0x02, 0x00, 0x78, 0x00, + 0xc0, 0xe5, 0xc0, 0xcc, 0x78, 0x02, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, + 0x20, 0x79, 0x18, 0x00, 0x78, 0x34, 0xd0, 0x84, 0x11, 0x30, 0x20, 0x79, + 0x02, 0x00, 0x78, 0x00, 0x90, 0x85, 0x12, 0x00, 0x78, 0x02, 0x00, 0xfe, + 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0x18, 0x00, 0x70, 0x34, 0xc0, 0x84, + 0x70, 0x36, 0x00, 0xee, 0x00, 0x05, 0x00, 0x16, 0x20, 0x01, 0x18, 0x37, + 0x20, 0x0c, 0x91, 0x84, 0x00, 0x80, 0x01, 0x18, 0xd1, 0x8c, 0x01, 0x18, + 0x90, 0x06, 0x00, 0x1e, 0x00, 0x05, 0x90, 0x85, 0x00, 0x01, 0x0c, 0xd8, + 0x20, 0x71, 0x19, 0xfb, 0x70, 0x03, 0x00, 0x03, 0x70, 0x0f, 0x03, 0x61, + 0x90, 0x06, 0x70, 0x1a, 0x70, 0x7a, 0x70, 0x12, 0x70, 0x17, 0x1c, 0xd0, + 0x70, 0x07, 0x00, 0x00, 0x70, 0x26, 0x70, 0x2b, 0xa6, 0xff, 0x70, 0x32, + 0x70, 0x3a, 0x70, 0x3f, 0x00, 0x64, 0x70, 0x37, 0xa7, 0x67, 0x70, 0x47, + 0xff, 0xff, 0x70, 0x4a, 0x70, 0x4f, 0x56, 0x67, 0x70, 0x52, 0x70, 0x63, + 0x88, 0xde, 0x08, 0x0c, 0x10, 0x27, 0x09, 0x0c, 0x0d, 0xc5, 0x29, 0x00, + 0x70, 0x42, 0xa8, 0x67, 0x00, 0x03, 0xa8, 0x6f, 0x01, 0x00, 0xa8, 0xab, + 0xdc, 0xb0, 0x00, 0x05, 0x20, 0x71, 0x19, 0xfb, 0x1d, 0x04, 0x88, 0x2c, + 0x20, 0x91, 0x60, 0x00, 0x70, 0x0c, 0x80, 0x01, 0x70, 0x0e, 0x15, 0x40, + 0x20, 0x01, 0x01, 0x3c, 0x20, 0x04, 0x90, 0x05, 0x19, 0x0c, 0x89, 0x4c, + 0x20, 0x01, 0x18, 0x69, 0x20, 0x04, 0xd0, 0xc4, 0x01, 0x58, 0x3a, 0x00, + 0xd0, 0x8c, 0x11, 0x40, 0x20, 0xd1, 0x00, 0x00, 0x20, 0xd1, 0x00, 0x01, + 0x20, 0xd1, 0x00, 0x00, 0x08, 0x0c, 0x0d, 0xc5, 0x70, 0x0f, 0x03, 0x61, + 0x70, 0x07, 0x00, 0x01, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, + 0x89, 0x23, 0x70, 0x48, 0x90, 0x0d, 0x01, 0x48, 0x81, 0x09, 0x71, 0x4a, + 0x11, 0x30, 0x70, 0x4c, 0x08, 0x0f, 0x00, 0x18, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x70, 0x24, 0x90, 0x0d, 0x01, 0x88, 0x70, 0x20, 0x80, 0x01, + 0x70, 0x22, 0x11, 0x68, 0x70, 0x23, 0x00, 0x09, 0x81, 0x09, 0x71, 0x26, + 0x91, 0x86, 0x03, 0xe8, 0x11, 0x10, 0x70, 0x28, 0x08, 0x0f, 0x81, 0xff, + 0x11, 0x10, 0x70, 0x28, 0x08, 0x0f, 0x70, 0x30, 0x90, 0x0d, 0x05, 0xa8, + 0x70, 0x2c, 0x80, 0x01, 0x70, 0x2e, 0x15, 0x88, 0x00, 0x16, 0x20, 0x09, + 0x03, 0x06, 0x21, 0x0c, 0x91, 0x84, 0x00, 0x30, 0x01, 0xe8, 0x91, 0x84, + 0x00, 0x48, 0x90, 0x86, 0x00, 0x08, 0x11, 0xc0, 0x70, 0x38, 0x90, 0x05, + 0x01, 0xa8, 0x80, 0x01, 0x70, 0x3a, 0x11, 0x90, 0x08, 0x0c, 0x76, 0x37, + 0x01, 0x78, 0x00, 0xe6, 0x20, 0x71, 0x19, 0xe8, 0x08, 0x0c, 0xa7, 0xf5, + 0x00, 0xee, 0x11, 0x40, 0x20, 0x09, 0x1a, 0x86, 0x21, 0x04, 0x80, 0x00, + 0x02, 0x08, 0x20, 0x0a, 0x00, 0x1e, 0x00, 0x68, 0x00, 0x1e, 0x70, 0x2f, + 0x00, 0x09, 0x81, 0x09, 0x71, 0x32, 0x01, 0x28, 0x91, 0x84, 0x00, 0x7f, + 0x09, 0x0c, 0xa8, 0xab, 0x00, 0x10, 0x70, 0x34, 0x08, 0x0f, 0x70, 0x44, + 0x90, 0x05, 0x01, 0x18, 0x03, 0x10, 0x80, 0x01, 0x70, 0x46, 0x70, 0x54, + 0x90, 0x0d, 0x01, 0x68, 0x70, 0x50, 0x80, 0x01, 0x70, 0x52, 0x11, 0x48, + 0x70, 0x53, 0x00, 0x09, 0x81, 0x09, 0x71, 0x56, 0x11, 0x20, 0x71, 0x58, + 0x71, 0x56, 0x70, 0x60, 0x08, 0x0f, 0x70, 0x18, 0x90, 0x0d, 0x01, 0xd8, + 0x00, 0x16, 0x70, 0x78, 0x90, 0x0d, 0x01, 0x58, 0x70, 0x74, 0x80, 0x01, + 0x70, 0x76, 0x11, 0x38, 0x70, 0x77, 0x00, 0x09, 0x81, 0x09, 0x71, 0x7a, + 0x11, 0x10, 0x70, 0x7c, 0x08, 0x0f, 0x00, 0x1e, 0x70, 0x08, 0x80, 0x01, + 0x70, 0x0a, 0x11, 0x38, 0x70, 0x0b, 0x00, 0x09, 0x81, 0x09, 0x71, 0x1a, + 0x11, 0x10, 0x70, 0x1c, 0x08, 0x0f, 0x01, 0x2e, 0x70, 0x04, 0x00, 0x02, + 0x88, 0x54, 0x88, 0x55, 0x88, 0x71, 0x00, 0xe6, 0x20, 0x71, 0x19, 0xfb, + 0x70, 0x18, 0x90, 0x05, 0x11, 0x20, 0x71, 0x1a, 0x72, 0x1e, 0x70, 0x0b, + 0x00, 0x09, 0x00, 0xee, 0x00, 0x05, 0x00, 0xe6, 0x00, 0x06, 0x20, 0x71, + 0x19, 0xfb, 0x70, 0x1c, 0x92, 0x06, 0x11, 0x20, 0x70, 0x1a, 0x70, 0x1e, + 0x70, 0x7a, 0x70, 0x7e, 0x00, 0x0e, 0x00, 0xee, 0x00, 0x05, 0x00, 0xe6, + 0x20, 0x71, 0x19, 0xfb, 0xb8, 0x88, 0x91, 0x02, 0x02, 0x08, 0xb9, 0x8a, + 0x00, 0xee, 0x00, 0x05, 0x00, 0x05, 0x00, 0xb6, 0x71, 0x10, 0x08, 0x0c, + 0x67, 0x24, 0x11, 0x68, 0xb8, 0x88, 0x80, 0x01, 0x02, 0x50, 0xb8, 0x8a, + 0x11, 0x40, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0x16, 0x08, 0x0c, + 0x9a, 0xb1, 0x00, 0x1e, 0x01, 0x2e, 0x81, 0x08, 0x91, 0x82, 0x08, 0x00, + 0x02, 0x18, 0x90, 0x0e, 0x70, 0x07, 0x00, 0x02, 0x71, 0x12, 0x00, 0xbe, + 0x00, 0x05, 0x70, 0x14, 0x20, 0x60, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x60, 0x40, 0x90, 0x05, 0x01, 0x28, 0x80, 0x01, 0x60, 0x42, 0x11, 0x10, + 0x08, 0x0c, 0xd3, 0xe5, 0x60, 0x18, 0x90, 0x05, 0x05, 0x58, 0x80, 0x01, + 0x60, 0x1a, 0x15, 0x40, 0x61, 0x20, 0x91, 0x86, 0x00, 0x03, 0x01, 0x48, + 0x91, 0x86, 0x00, 0x06, 0x01, 0x30, 0x91, 0x86, 0x00, 0x09, 0x11, 0xe0, + 0x61, 0x1c, 0xd1, 0xc4, 0x11, 0x00, 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0xb0, + 0x60, 0x14, 0x20, 0x48, 0xa8, 0x84, 0x90, 0x8a, 0x19, 0x9a, 0x02, 0x80, + 0x90, 0x82, 0x19, 0x99, 0xa8, 0x86, 0x90, 0x8a, 0x19, 0x9a, 0x02, 0x10, + 0x20, 0x01, 0x19, 0x99, 0x80, 0x03, 0x80, 0x0b, 0x81, 0x0b, 0x91, 0x08, + 0x61, 0x1a, 0xa8, 0x7c, 0xd0, 0xe4, 0x01, 0x10, 0x08, 0x0c, 0xcd, 0xbc, + 0x01, 0x2e, 0x9c, 0x88, 0x00, 0x18, 0x71, 0x16, 0x20, 0x01, 0x18, 0x1a, + 0x20, 0x04, 0x91, 0x02, 0x02, 0x20, 0x70, 0x17, 0x1c, 0xd0, 0x70, 0x07, + 0x00, 0x00, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0x19, 0xfb, 0x70, 0x27, + 0x07, 0xd0, 0x70, 0x23, 0x00, 0x09, 0x00, 0xee, 0x00, 0x05, 0x20, 0x01, + 0x1a, 0x04, 0x20, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, + 0x19, 0xfb, 0x71, 0x32, 0x70, 0x2f, 0x00, 0x09, 0x00, 0xee, 0x00, 0x05, + 0x20, 0x11, 0x1a, 0x07, 0x20, 0x13, 0x00, 0x00, 0x00, 0x05, 0x00, 0xe6, + 0x20, 0x71, 0x19, 0xfb, 0x71, 0x1a, 0x72, 0x1e, 0x70, 0x0b, 0x00, 0x09, + 0x00, 0xee, 0x00, 0x05, 0x00, 0x86, 0x00, 0x26, 0x70, 0x5c, 0x80, 0x00, + 0x70, 0x5e, 0x20, 0x01, 0x1a, 0x0b, 0x20, 0x44, 0xa0, 0x6c, 0x90, 0x86, + 0x00, 0x00, 0x01, 0x50, 0x70, 0x70, 0xa0, 0x9a, 0x70, 0x6c, 0xa0, 0x96, + 0x70, 0x68, 0xa0, 0x92, 0x70, 0x64, 0xa0, 0x8e, 0x08, 0x0c, 0x10, 0xf8, + 0x00, 0x2e, 0x00, 0x8e, 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, 0x00, 0x96, + 0x00, 0xa6, 0x00, 0xb6, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x00, 0xf6, + 0x01, 0x56, 0x08, 0x0c, 0x87, 0x76, 0x01, 0x5e, 0x00, 0xfe, 0x00, 0xee, + 0x00, 0xde, 0x00, 0xce, 0x00, 0xbe, 0x00, 0xae, 0x00, 0x9e, 0x00, 0x1e, + 0x00, 0x0e, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0x19, 0xfb, 0x71, 0x7a, + 0x72, 0x7e, 0x70, 0x77, 0x00, 0x09, 0x00, 0xee, 0x00, 0x05, 0x00, 0xe6, + 0x00, 0x06, 0x20, 0x71, 0x19, 0xfb, 0x70, 0x7c, 0x92, 0x06, 0x11, 0x10, + 0x70, 0x7a, 0x70, 0x7e, 0x00, 0x0e, 0x00, 0xee, 0x00, 0x05, 0x20, 0x69, + 0x18, 0x00, 0x69, 0xe8, 0xd1, 0xe4, 0x15, 0x18, 0x00, 0x26, 0xd1, 0xec, + 0x01, 0x40, 0x6a, 0x54, 0x68, 0x74, 0x92, 0x02, 0x02, 0x88, 0x81, 0x17, + 0x92, 0x94, 0x00, 0xc0, 0x00, 0x88, 0x91, 0x84, 0x00, 0x07, 0x01, 0xa0, + 0x81, 0x09, 0x91, 0x84, 0x00, 0x07, 0x01, 0x10, 0x69, 0xea, 0x00, 0x70, + 0x81, 0x07, 0x90, 0x84, 0x00, 0x07, 0x91, 0x0d, 0x81, 0x07, 0x91, 0x06, + 0x90, 0x94, 0x00, 0xc0, 0x91, 0x84, 0xff, 0x3f, 0x92, 0x05, 0x68, 0xea, + 0x08, 0x0c, 0x0e, 0xee, 0x00, 0x2e, 0x00, 0x05, 0x00, 0x16, 0x00, 0xc6, + 0x20, 0x09, 0xff, 0xf4, 0x21, 0x0d, 0x20, 0x61, 0x01, 0x00, 0x60, 0xf0, + 0x91, 0x00, 0x60, 0xf3, 0x00, 0x00, 0x20, 0x09, 0xff, 0xf4, 0x20, 0x0f, + 0x12, 0x20, 0x81, 0x08, 0x21, 0x05, 0x80, 0x00, 0x20, 0x0f, 0x00, 0xce, + 0x00, 0x1e, 0x00, 0x05, 0x00, 0xc6, 0x20, 0x61, 0x1a, 0x74, 0x00, 0xce, + 0x00, 0x05, 0x91, 0x84, 0x00, 0x0f, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, + 0x90, 0x80, 0x1a, 0x74, 0x20, 0x60, 0x00, 0x05, 0xa8, 0x84, 0x90, 0x8a, + 0x19, 0x9a, 0x16, 0x38, 0x90, 0x05, 0x11, 0x50, 0x00, 0xc6, 0x20, 0x61, + 0x1a, 0x74, 0x60, 0x14, 0x00, 0xce, 0x90, 0x05, 0x11, 0x30, 0x20, 0x01, + 0x00, 0x1e, 0x00, 0x18, 0x90, 0x8e, 0xff, 0xff, 0x01, 0xb0, 0x80, 0x03, + 0x80, 0x0b, 0x81, 0x0b, 0x91, 0x08, 0x61, 0x1a, 0xa8, 0x7c, 0x90, 0x8c, + 0x00, 0xc0, 0x91, 0x8e, 0x00, 0xc0, 0x09, 0x04, 0x89, 0xfa, 0xd0, 0xb4, + 0x11, 0x68, 0xd0, 0xbc, 0x19, 0x04, 0x89, 0xd3, 0x20, 0x09, 0x00, 0x06, + 0x08, 0x0c, 0x8a, 0x27, 0x00, 0x05, 0x90, 0x0e, 0x0c, 0x60, 0x20, 0x01, + 0x19, 0x99, 0x08, 0xb0, 0xd0, 0xfc, 0x01, 0x60, 0x90, 0x8c, 0x00, 0x03, + 0x01, 0x20, 0x91, 0x8e, 0x00, 0x03, 0x19, 0x04, 0x8a, 0x21, 0x90, 0x8c, + 0x20, 0x20, 0x91, 0x8e, 0x20, 0x20, 0x01, 0xa8, 0x60, 0x24, 0xd0, 0xd4, + 0x11, 0xe8, 0x20, 0x09, 0x18, 0x69, 0x21, 0x04, 0xd0, 0x84, 0x11, 0x38, + 0x87, 0xff, 0x11, 0x20, 0x20, 0x09, 0x00, 0x43, 0x08, 0x04, 0xb3, 0x52, + 0x00, 0x05, 0x87, 0xff, 0x1d, 0xe8, 0x20, 0x09, 0x00, 0x42, 0x08, 0x04, + 0xb3, 0x52, 0x61, 0x10, 0x00, 0xb6, 0x21, 0x58, 0xb9, 0x00, 0x00, 0xbe, + 0xd1, 0xac, 0x0d, 0x20, 0x60, 0x24, 0xc0, 0xcd, 0x60, 0x26, 0x0c, 0x00, + 0xc0, 0xd4, 0x60, 0x26, 0xa8, 0x90, 0x60, 0x2e, 0xa8, 0x8c, 0x60, 0x32, + 0x08, 0xe0, 0xd0, 0xfc, 0x01, 0x60, 0x90, 0x8c, 0x00, 0x03, 0x01, 0x20, + 0x91, 0x8e, 0x00, 0x03, 0x19, 0x04, 0x8a, 0x21, 0x90, 0x8c, 0x20, 0x20, + 0x91, 0x8e, 0x20, 0x20, 0x01, 0x70, 0x00, 0x76, 0x00, 0xf6, 0x2c, 0x78, + 0x08, 0x0c, 0x17, 0x68, 0x00, 0xfe, 0x00, 0x7e, 0x87, 0xff, 0x11, 0x20, + 0x20, 0x09, 0x00, 0x42, 0x08, 0x0c, 0xb3, 0x52, 0x00, 0x05, 0x61, 0x10, + 0x00, 0xb6, 0x21, 0x58, 0xb9, 0x00, 0x00, 0xbe, 0xd1, 0xac, 0x0d, 0x58, + 0x61, 0x24, 0xc1, 0xcd, 0x61, 0x26, 0x0c, 0x38, 0xd0, 0xfc, 0x01, 0x88, + 0x90, 0x8c, 0x20, 0x20, 0x91, 0x8e, 0x20, 0x20, 0x01, 0xa8, 0x90, 0x84, + 0x00, 0x03, 0x90, 0x8e, 0x00, 0x02, 0x01, 0x48, 0x87, 0xff, 0x11, 0x20, + 0x20, 0x09, 0x00, 0x41, 0x08, 0x0c, 0xb3, 0x52, 0x00, 0x05, 0x00, 0xb9, + 0x0c, 0xe8, 0x87, 0xff, 0x1d, 0xd8, 0x20, 0x09, 0x00, 0x43, 0x08, 0x0c, + 0xb3, 0x52, 0x0c, 0xb0, 0x61, 0x10, 0x00, 0xb6, 0x21, 0x58, 0xb9, 0x00, + 0x00, 0xbe, 0xd1, 0xac, 0x0d, 0x20, 0x61, 0x24, 0xc1, 0xcd, 0x61, 0x26, + 0x0c, 0x00, 0x20, 0x09, 0x00, 0x04, 0x00, 0x19, 0x00, 0x05, 0x20, 0x09, + 0x00, 0x01, 0x00, 0x96, 0x08, 0x0c, 0xd0, 0xd8, 0x05, 0x18, 0x60, 0x14, + 0x20, 0x48, 0xa9, 0x82, 0xa8, 0x00, 0x60, 0x16, 0x91, 0x86, 0x00, 0x01, + 0x11, 0x88, 0xa9, 0x7c, 0x91, 0x8c, 0x81, 0x00, 0x91, 0x8e, 0x81, 0x00, + 0x11, 0x58, 0x00, 0xc6, 0x20, 0x61, 0x1a, 0x74, 0x62, 0x00, 0xd2, 0x8c, + 0x11, 0x20, 0x62, 0x04, 0x82, 0x10, 0x02, 0x08, 0x62, 0x06, 0x00, 0xce, + 0x08, 0x0c, 0x6c, 0xde, 0x60, 0x14, 0x90, 0x4d, 0x00, 0x76, 0x20, 0x39, + 0x00, 0x00, 0x19, 0x0c, 0x89, 0x70, 0x00, 0x7e, 0x00, 0x9e, 0x00, 0x05, + 0x01, 0x56, 0x00, 0xc6, 0x20, 0x61, 0x1a, 0x74, 0x60, 0x00, 0x81, 0xff, + 0x01, 0x10, 0x92, 0x05, 0x00, 0x08, 0x92, 0x04, 0x60, 0x02, 0x00, 0xce, + 0x01, 0x5e, 0x00, 0x05, 0x68, 0x00, 0xd0, 0x8c, 0x11, 0x38, 0x68, 0x08, + 0x90, 0x05, 0x01, 0x20, 0x80, 0x01, 0x68, 0x0a, 0x90, 0x85, 0x00, 0x01, + 0x00, 0x05, 0x20, 0x71, 0x19, 0x24, 0x70, 0x03, 0x00, 0x06, 0x70, 0x07, + 0x00, 0x00, 0x70, 0x0f, 0x00, 0x00, 0x70, 0x13, 0x00, 0x01, 0x08, 0x0c, + 0x10, 0x27, 0x09, 0x0c, 0x0d, 0xc5, 0xa8, 0x67, 0x00, 0x06, 0xa8, 0x6b, + 0x00, 0x01, 0xa8, 0xab, 0xdc, 0xb0, 0xa8, 0x9f, 0x00, 0x00, 0x29, 0x00, + 0x70, 0x2e, 0x70, 0x33, 0x00, 0x00, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x00, 0x96, 0x00, 0xe6, 0x20, 0x71, 0x19, 0x24, 0x70, 0x2c, + 0x20, 0x48, 0x6a, 0x2c, 0x72, 0x1e, 0x6b, 0x30, 0x73, 0x22, 0x68, 0x34, + 0x70, 0x26, 0xa8, 0x96, 0x68, 0x38, 0x70, 0x2a, 0xa8, 0x9a, 0x68, 0x24, + 0x70, 0x16, 0x68, 0x3c, 0x70, 0x1a, 0x20, 0x09, 0x00, 0x28, 0x20, 0x0a, + 0x90, 0x05, 0x01, 0x48, 0x90, 0x0e, 0x91, 0x88, 0x00, 0x0c, 0x80, 0x01, + 0x1d, 0xe0, 0x21, 0x00, 0x92, 0x10, 0x12, 0x08, 0x83, 0x18, 0xaa, 0x8e, + 0xab, 0x92, 0x70, 0x10, 0xd0, 0x84, 0x01, 0x68, 0xc0, 0x84, 0x70, 0x07, + 0x00, 0x01, 0x70, 0x0f, 0x00, 0x00, 0x00, 0x06, 0x20, 0x09, 0x1a, 0xd1, + 0x21, 0x04, 0x90, 0x82, 0x00, 0x07, 0x20, 0x0a, 0x00, 0x0e, 0xc0, 0x95, + 0x70, 0x12, 0x20, 0x08, 0x20, 0x01, 0x00, 0x3b, 0x08, 0x0c, 0x16, 0x11, + 0x90, 0x06, 0x20, 0x71, 0x19, 0x3d, 0x70, 0x02, 0x70, 0x06, 0x70, 0x2a, + 0x00, 0xee, 0x00, 0x9e, 0x01, 0x2e, 0x00, 0x05, 0x20, 0x09, 0x1a, 0xd1, + 0x21, 0x04, 0x90, 0x80, 0x00, 0x07, 0x20, 0x0a, 0x00, 0x05, 0x00, 0xe6, + 0x01, 0x26, 0x01, 0x56, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0x18, 0x00, + 0x71, 0x54, 0x20, 0x01, 0x00, 0x08, 0x91, 0x0a, 0x06, 0x38, 0x20, 0x01, + 0x18, 0x7d, 0x20, 0xac, 0x90, 0x06, 0x90, 0x80, 0x00, 0x08, 0x1f, 0x04, + 0x8a, 0xe3, 0x71, 0xc0, 0x91, 0x02, 0x02, 0xe0, 0x20, 0x71, 0x18, 0x77, + 0x20, 0xa9, 0x00, 0x07, 0x00, 0xc6, 0x08, 0x0c, 0xb2, 0x7d, 0x60, 0x23, + 0x00, 0x09, 0x60, 0x03, 0x00, 0x04, 0x60, 0x1f, 0x01, 0x01, 0x00, 0x89, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x8c, 0x61, 0x01, 0x2e, + 0x1f, 0x04, 0x8a, 0xef, 0x90, 0x06, 0x00, 0xce, 0x01, 0x5e, 0x01, 0x2e, + 0x00, 0xee, 0x00, 0x05, 0x90, 0x85, 0x00, 0x01, 0x0c, 0xc8, 0x00, 0xe6, + 0x00, 0xb6, 0x00, 0x96, 0x00, 0x86, 0x00, 0x56, 0x00, 0x46, 0x00, 0x26, + 0x71, 0x18, 0x72, 0x0c, 0x76, 0x20, 0x70, 0x04, 0xd0, 0x84, 0x11, 0x28, + 0x20, 0x21, 0x00, 0x24, 0x20, 0x29, 0x00, 0x02, 0x00, 0x20, 0x20, 0x21, + 0x00, 0x2c, 0x20, 0x29, 0x00, 0x0a, 0x08, 0x0c, 0x10, 0x0e, 0x09, 0x0c, + 0x0d, 0xc5, 0x29, 0x00, 0x60, 0x16, 0x20, 0x58, 0xac, 0x66, 0x90, 0x06, + 0xa8, 0x02, 0xa8, 0x06, 0xa8, 0x6a, 0xa8, 0x7a, 0xa8, 0xaa, 0xa8, 0x87, + 0x00, 0x05, 0xa8, 0x7f, 0x00, 0x20, 0x70, 0x08, 0xa8, 0x9a, 0x70, 0x10, + 0xa8, 0x9e, 0xae, 0x8a, 0xa8, 0xaf, 0xff, 0xff, 0xa8, 0xb3, 0x00, 0x00, + 0x81, 0x09, 0x01, 0x60, 0x08, 0x0c, 0x10, 0x0e, 0x09, 0x0c, 0x0d, 0xc5, + 0xad, 0x66, 0x2b, 0x00, 0xa8, 0x02, 0x29, 0x00, 0xb8, 0x06, 0x20, 0x58, + 0x81, 0x09, 0x1d, 0xa0, 0x00, 0x2e, 0x00, 0x4e, 0x00, 0x5e, 0x00, 0x8e, + 0x00, 0x9e, 0x00, 0xbe, 0x00, 0xee, 0x00, 0x05, 0x20, 0x79, 0x00, 0x00, + 0x20, 0x71, 0x19, 0x24, 0x70, 0x04, 0x00, 0x4b, 0x70, 0x0c, 0x00, 0x02, + 0x8b, 0x5b, 0x8b, 0x54, 0x8b, 0x54, 0x00, 0x05, 0x8b, 0x65, 0x8b, 0xbb, + 0x8b, 0xbb, 0x8b, 0xbb, 0x8b, 0xbc, 0x8b, 0xcd, 0x8b, 0xcd, 0x70, 0x0c, + 0x0c, 0xba, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x78, 0xa0, 0x79, 0xa0, + 0x91, 0x06, 0x19, 0x04, 0x8b, 0xad, 0x78, 0x14, 0xd0, 0xbc, 0x19, 0x04, + 0x8b, 0xb6, 0x01, 0x2e, 0x70, 0x18, 0x91, 0x0a, 0x11, 0x28, 0x70, 0x30, + 0x90, 0x05, 0x19, 0x04, 0x8b, 0xff, 0x00, 0x05, 0x12, 0x10, 0x71, 0x14, + 0x91, 0x0a, 0x91, 0x92, 0x00, 0x0a, 0x02, 0x10, 0x20, 0x09, 0x00, 0x0a, + 0x20, 0x01, 0x18, 0x88, 0x20, 0x14, 0x20, 0x01, 0x19, 0x36, 0x20, 0x04, + 0x91, 0x00, 0x92, 0x02, 0x0e, 0x50, 0x08, 0x0c, 0x8d, 0x5c, 0x22, 0x00, + 0x91, 0x02, 0x02, 0x08, 0x22, 0x08, 0x00, 0x96, 0x70, 0x2c, 0x20, 0x48, + 0xa8, 0x73, 0x00, 0x01, 0xa9, 0x76, 0x08, 0x0c, 0x8e, 0x65, 0x21, 0x00, + 0xa8, 0x7e, 0xa8, 0x6f, 0x00, 0x00, 0x00, 0x9e, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x09, 0x1a, 0x1b, 0x21, 0x04, 0xc0, 0x85, 0x20, 0x0a, + 0x70, 0x0f, 0x00, 0x02, 0x01, 0x2e, 0x08, 0x0c, 0x11, 0x17, 0x1d, 0xe8, + 0x00, 0x05, 0x78, 0xa0, 0x79, 0xa0, 0x91, 0x06, 0x09, 0x04, 0x8b, 0x6d, + 0x08, 0x0c, 0x8d, 0x34, 0x01, 0x2e, 0x00, 0x05, 0x78, 0x10, 0xc0, 0xc5, + 0x78, 0x12, 0x08, 0x04, 0x8b, 0x6d, 0x00, 0x05, 0x70, 0x0c, 0x00, 0x02, + 0x8b, 0xc1, 0x8b, 0xc4, 0x8b, 0xc3, 0x08, 0x0c, 0x8b, 0x63, 0x00, 0x05, + 0x80, 0x01, 0x70, 0x0e, 0x00, 0x96, 0x70, 0x2c, 0x20, 0x48, 0xa9, 0x74, + 0x00, 0x9e, 0x00, 0x11, 0x0c, 0xa0, 0x00, 0x05, 0x00, 0x96, 0x70, 0x2c, + 0x20, 0x48, 0x70, 0x18, 0x91, 0x00, 0x72, 0x14, 0x92, 0x1a, 0x11, 0x30, + 0x70, 0x1c, 0xa8, 0x8e, 0x70, 0x20, 0xa8, 0x92, 0x90, 0x06, 0x00, 0x68, + 0x00, 0x06, 0x08, 0x0c, 0x8e, 0x65, 0x21, 0x00, 0xaa, 0x8c, 0x92, 0x10, + 0xaa, 0x8e, 0x12, 0x20, 0xa8, 0x90, 0x90, 0x81, 0x00, 0x00, 0xa8, 0x92, + 0x00, 0x0e, 0x00, 0x9e, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x78, 0xa2, + 0x70, 0x1a, 0x08, 0x0c, 0x8d, 0x34, 0x01, 0x2e, 0x00, 0x05, 0x00, 0xe6, + 0x20, 0x71, 0x19, 0x24, 0x70, 0x0c, 0x00, 0x02, 0x8b, 0xfd, 0x8b, 0xfd, + 0x8b, 0xfb, 0x70, 0x0f, 0x00, 0x01, 0x00, 0xee, 0x00, 0x05, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x70, 0x30, 0x90, 0x05, 0x05, 0x08, 0x20, 0x78, + 0x78, 0x14, 0x20, 0x48, 0xae, 0x88, 0x00, 0xb6, 0x20, 0x59, 0x00, 0x00, + 0x08, 0x0c, 0x8c, 0x6a, 0x00, 0xbe, 0x01, 0xb0, 0x00, 0xe6, 0x20, 0x71, + 0x19, 0x3d, 0x08, 0x0c, 0x8c, 0xb1, 0x00, 0xee, 0x01, 0x78, 0x00, 0x96, + 0x08, 0x0c, 0x10, 0x27, 0x29, 0x00, 0x00, 0x9e, 0x01, 0x48, 0xa8, 0xaa, + 0x04, 0xb9, 0x00, 0x41, 0x20, 0x01, 0x19, 0x47, 0x20, 0x03, 0x00, 0x00, + 0x01, 0x2e, 0x08, 0xc8, 0x01, 0x2e, 0x00, 0x05, 0x00, 0xd6, 0x00, 0xc6, + 0x00, 0x86, 0x00, 0xa6, 0x29, 0x40, 0x26, 0x50, 0x26, 0x00, 0x90, 0x05, + 0x01, 0x80, 0xa8, 0x64, 0x90, 0x84, 0x00, 0x0f, 0x20, 0x68, 0x9d, 0x88, + 0x20, 0xc7, 0x21, 0x65, 0x00, 0x56, 0x20, 0x29, 0x00, 0x00, 0x08, 0x0c, + 0x8d, 0xea, 0x08, 0x0c, 0x20, 0x7f, 0x1d, 0xd8, 0x00, 0x5e, 0x00, 0xae, + 0x20, 0x01, 0x18, 0x7f, 0x20, 0x04, 0xa8, 0x8a, 0x08, 0x0c, 0x17, 0x68, + 0x78, 0x1f, 0x01, 0x01, 0x78, 0x13, 0x00, 0x00, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0x8c, 0xc0, 0x01, 0x2e, 0x00, 0x8e, 0x00, 0xce, + 0x00, 0xde, 0x00, 0x05, 0x70, 0x30, 0x90, 0x05, 0x01, 0x38, 0x20, 0x78, + 0x78, 0x0c, 0x70, 0x32, 0x20, 0x01, 0x19, 0x47, 0x20, 0x03, 0x00, 0x01, + 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0x19, 0x24, 0x70, 0x30, 0x60, 0x0e, + 0x2c, 0x00, 0x70, 0x32, 0x00, 0xee, 0x00, 0x05, 0x00, 0xd6, 0x00, 0xc6, + 0x00, 0x26, 0x9b, 0x80, 0x8f, 0x33, 0x20, 0x05, 0x90, 0x6d, 0x09, 0x0c, + 0x0d, 0xc5, 0x9b, 0x80, 0x8f, 0x2b, 0x20, 0x05, 0x90, 0x65, 0x09, 0x0c, + 0x0d, 0xc5, 0x61, 0x14, 0x26, 0x00, 0x91, 0x02, 0x02, 0x48, 0x68, 0x28, + 0x91, 0x02, 0x02, 0xf0, 0x90, 0x85, 0x00, 0x01, 0x00, 0x2e, 0x00, 0xce, + 0x00, 0xde, 0x00, 0x05, 0x68, 0x04, 0xd0, 0x94, 0x01, 0x48, 0x68, 0x54, + 0xd0, 0x84, 0x11, 0x78, 0xc0, 0x85, 0x68, 0x56, 0x20, 0x11, 0x80, 0x26, + 0x08, 0x0c, 0x4c, 0x44, 0x68, 0x4c, 0x00, 0x96, 0x90, 0x4d, 0x09, 0x0c, + 0x0d, 0xc5, 0xa8, 0x04, 0x80, 0x00, 0xa8, 0x06, 0x00, 0x9e, 0x90, 0x06, + 0x20, 0x30, 0x0c, 0x20, 0x68, 0x54, 0xd0, 0x8c, 0x1d, 0x08, 0xc0, 0x8d, + 0x68, 0x56, 0x20, 0x11, 0x80, 0x25, 0x08, 0x0c, 0x4c, 0x44, 0x68, 0x4c, + 0x00, 0x96, 0x90, 0x4d, 0x09, 0x0c, 0x0d, 0xc5, 0xa8, 0x00, 0x80, 0x00, + 0xa8, 0x02, 0x00, 0x9e, 0x08, 0x88, 0x70, 0x00, 0x20, 0x19, 0x00, 0x08, + 0x83, 0x19, 0x71, 0x04, 0x91, 0x02, 0x11, 0x18, 0x23, 0x00, 0x90, 0x05, + 0x00, 0x20, 0x02, 0x10, 0x93, 0x02, 0x00, 0x08, 0x80, 0x02, 0x00, 0x05, + 0x00, 0xd6, 0x78, 0x14, 0x90, 0x05, 0x09, 0x0c, 0x0d, 0xc5, 0x78, 0x1c, + 0x90, 0x84, 0x01, 0x01, 0x90, 0x86, 0x01, 0x01, 0x19, 0x0c, 0x0d, 0xc5, + 0x78, 0x27, 0x00, 0x00, 0x20, 0x69, 0x19, 0x3d, 0x68, 0x04, 0x90, 0x80, + 0x19, 0x3f, 0x2f, 0x08, 0x21, 0x02, 0x69, 0x04, 0x81, 0x08, 0x91, 0x82, + 0x00, 0x08, 0x02, 0x08, 0x90, 0x0e, 0x69, 0x06, 0x91, 0x80, 0x19, 0x3f, + 0x20, 0x03, 0x00, 0x00, 0x00, 0xde, 0x00, 0x05, 0x00, 0x96, 0x00, 0xc6, + 0x20, 0x60, 0x60, 0x14, 0x20, 0x48, 0xa8, 0xa8, 0x00, 0x96, 0x20, 0x48, + 0x90, 0x05, 0x19, 0x0c, 0x10, 0x40, 0x00, 0x9e, 0xa8, 0xab, 0x00, 0x00, + 0x08, 0x0c, 0x0f, 0xc0, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0xce, 0x00, 0x9e, + 0x00, 0x05, 0x60, 0x20, 0x90, 0x86, 0x00, 0x09, 0x11, 0x28, 0x60, 0x1c, + 0xd0, 0xc4, 0x01, 0x10, 0x90, 0x06, 0x00, 0x05, 0x90, 0x85, 0x00, 0x01, + 0x00, 0x05, 0x60, 0x00, 0x90, 0x86, 0x00, 0x00, 0x01, 0x78, 0x60, 0x10, + 0x90, 0x05, 0x01, 0x50, 0x00, 0xb6, 0x20, 0x58, 0x08, 0x0c, 0x90, 0x67, + 0x00, 0xbe, 0x60, 0x13, 0x00, 0x00, 0x60, 0x1b, 0x00, 0x00, 0x00, 0x10, + 0x2c, 0x00, 0x08, 0x61, 0x00, 0x05, 0x20, 0x09, 0x19, 0x28, 0x21, 0x0c, + 0xd1, 0x94, 0x00, 0x05, 0x20, 0x09, 0x19, 0x28, 0x21, 0x0c, 0xd1, 0xc4, + 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0xe6, 0x20, 0x71, + 0x19, 0x24, 0x71, 0x10, 0xc1, 0x94, 0xc1, 0x85, 0x70, 0x07, 0x00, 0x00, + 0x71, 0x12, 0x20, 0x01, 0x00, 0x3b, 0x08, 0x0c, 0x16, 0x11, 0x00, 0xee, + 0x01, 0x2e, 0x00, 0x05, 0x78, 0x14, 0xd0, 0xbc, 0x11, 0x08, 0x00, 0x05, + 0x78, 0x10, 0xc0, 0xc5, 0x78, 0x12, 0x0c, 0xc0, 0x00, 0x96, 0x00, 0xd6, + 0x90, 0x06, 0x70, 0x06, 0x70, 0x0e, 0x70, 0x1a, 0x70, 0x1e, 0x70, 0x22, + 0x70, 0x16, 0x70, 0x2a, 0x70, 0x26, 0x70, 0x2f, 0x00, 0x00, 0x08, 0x0c, + 0x8e, 0xb3, 0x01, 0x70, 0x08, 0x0c, 0x8e, 0xe8, 0x01, 0x58, 0x29, 0x00, + 0x70, 0x02, 0x70, 0x0a, 0x70, 0x1a, 0x70, 0x13, 0x00, 0x01, 0x70, 0x1f, + 0x00, 0x0a, 0x00, 0xde, 0x00, 0x9e, 0x00, 0x05, 0x90, 0x0e, 0x0c, 0xd8, + 0x00, 0xe6, 0x00, 0x96, 0x00, 0x86, 0x00, 0xd6, 0x00, 0xc6, 0x20, 0x71, + 0x19, 0x31, 0x72, 0x1c, 0x21, 0x00, 0x92, 0x02, 0x16, 0x18, 0x08, 0x0c, + 0x8e, 0xe8, 0x09, 0x0c, 0x0d, 0xc5, 0x70, 0x18, 0x90, 0x05, 0x11, 0x60, + 0x29, 0x00, 0x70, 0x02, 0x70, 0x0a, 0x70, 0x1a, 0x90, 0x06, 0x70, 0x06, + 0x70, 0x0e, 0xa8, 0x06, 0xa8, 0x02, 0x70, 0x12, 0x70, 0x1e, 0x00, 0x38, + 0x20, 0x40, 0xa8, 0x06, 0x29, 0x00, 0xa0, 0x02, 0x70, 0x1a, 0xa8, 0x03, + 0x00, 0x00, 0x70, 0x10, 0x80, 0x00, 0x70, 0x12, 0x70, 0x1c, 0x90, 0x80, + 0x00, 0x0a, 0x70, 0x1e, 0x72, 0x1c, 0x08, 0xd0, 0x72, 0x1c, 0x00, 0xce, + 0x00, 0xde, 0x00, 0x8e, 0x00, 0x9e, 0x00, 0xee, 0x00, 0x05, 0x00, 0x96, + 0x01, 0x56, 0x01, 0x36, 0x01, 0x46, 0x00, 0xe6, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x71, 0x19, 0x31, 0x73, 0x00, 0x83, 0x1f, 0x83, 0x1e, + 0x83, 0x1e, 0x93, 0x84, 0x00, 0x3f, 0x20, 0xe8, 0x93, 0x9c, 0xff, 0xc0, + 0x93, 0x98, 0x00, 0x03, 0x71, 0x04, 0x08, 0x0c, 0x8e, 0x65, 0x81, 0x0c, + 0x21, 0x00, 0x93, 0x18, 0x80, 0x03, 0x22, 0x28, 0x20, 0x21, 0x00, 0x78, + 0x94, 0x02, 0x95, 0x32, 0x02, 0x08, 0x20, 0x28, 0x25, 0x00, 0x80, 0x04, + 0x20, 0xa8, 0x23, 0xa0, 0xa0, 0x01, 0xa0, 0x01, 0x40, 0x05, 0x25, 0x08, + 0x08, 0x0c, 0x8e, 0x6e, 0x21, 0x30, 0x70, 0x14, 0x96, 0x00, 0x70, 0x16, + 0x26, 0x00, 0x71, 0x1c, 0x91, 0x02, 0x70, 0x1e, 0x70, 0x04, 0x96, 0x00, + 0x20, 0x08, 0x90, 0x82, 0x00, 0x0a, 0x11, 0x90, 0x70, 0x00, 0x20, 0x48, + 0xa8, 0x00, 0x90, 0x05, 0x11, 0x48, 0x20, 0x09, 0x00, 0x01, 0x00, 0x26, + 0x08, 0x0c, 0x8d, 0x5c, 0x00, 0x2e, 0x70, 0x00, 0x20, 0x48, 0xa8, 0x00, + 0x70, 0x02, 0x70, 0x07, 0x00, 0x00, 0x00, 0x08, 0x71, 0x06, 0x25, 0x00, + 0x92, 0x12, 0x19, 0x04, 0x8d, 0x9b, 0x01, 0x2e, 0x00, 0xee, 0x01, 0x4e, + 0x01, 0x3e, 0x01, 0x5e, 0x00, 0x9e, 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, + 0x00, 0xe6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x95, 0x80, 0x8f, 0x2b, + 0x20, 0x05, 0x90, 0x75, 0x09, 0x0c, 0x0d, 0xc5, 0x08, 0x0c, 0x8e, 0x40, + 0x01, 0x2e, 0x95, 0x80, 0x8f, 0x27, 0x20, 0x05, 0x90, 0x75, 0x09, 0x0c, + 0x0d, 0xc5, 0x01, 0x56, 0x01, 0x36, 0x01, 0xc6, 0x01, 0x46, 0x01, 0xd6, + 0x83, 0x1f, 0x83, 0x1e, 0x83, 0x1e, 0x93, 0x84, 0x00, 0x3f, 0x20, 0xe0, + 0x93, 0x84, 0xff, 0xc0, 0x91, 0x00, 0x20, 0x98, 0xa8, 0x60, 0x20, 0xe8, + 0xa9, 0x5c, 0x2c, 0x05, 0x91, 0x00, 0x20, 0xa0, 0x20, 0xa9, 0x00, 0x02, + 0x40, 0x03, 0x2e, 0x0c, 0x2d, 0x00, 0x00, 0x02, 0x8e, 0x2a, 0x8e, 0x2a, + 0x8e, 0x2c, 0x8e, 0x2a, 0x8e, 0x2c, 0x8e, 0x2a, 0x8e, 0x2a, 0x8e, 0x2a, + 0x8e, 0x2a, 0x8e, 0x2a, 0x8e, 0x32, 0x8e, 0x2a, 0x8e, 0x32, 0x8e, 0x2a, + 0x8e, 0x2a, 0x8e, 0x2a, 0x08, 0x0c, 0x0d, 0xc5, 0x41, 0x04, 0x20, 0xa9, + 0x00, 0x02, 0x40, 0x02, 0x40, 0x03, 0x00, 0x28, 0x20, 0xa9, 0x00, 0x02, + 0x40, 0x03, 0x41, 0x04, 0x40, 0x03, 0x01, 0xde, 0x01, 0x4e, 0x01, 0xce, + 0x01, 0x3e, 0x01, 0x5e, 0x00, 0xee, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, + 0x00, 0x96, 0x70, 0x14, 0x80, 0x01, 0x70, 0x16, 0x71, 0x0c, 0x21, 0x10, + 0x00, 0xf1, 0x81, 0x0c, 0x91, 0x88, 0x00, 0x03, 0x73, 0x08, 0x82, 0x10, + 0x92, 0x82, 0x00, 0x0a, 0x11, 0x98, 0x70, 0x08, 0x20, 0x48, 0xa8, 0x00, + 0x90, 0x05, 0x01, 0x58, 0x00, 0x06, 0x08, 0x0c, 0x8e, 0xf7, 0x00, 0x9e, + 0xa8, 0x07, 0x00, 0x00, 0x29, 0x00, 0x70, 0x0a, 0x70, 0x10, 0x80, 0x01, + 0x70, 0x12, 0x70, 0x0f, 0x00, 0x00, 0x00, 0x08, 0x72, 0x0e, 0x00, 0x9e, + 0x00, 0x05, 0x00, 0x06, 0x81, 0x0b, 0x81, 0x0b, 0x21, 0x00, 0x81, 0x0b, + 0x91, 0x00, 0x20, 0x08, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, 0x00, 0x26, + 0x21, 0x00, 0x90, 0x05, 0x01, 0x58, 0x90, 0x92, 0x00, 0x0c, 0x02, 0x40, + 0x90, 0x0e, 0x81, 0x08, 0x90, 0x82, 0x00, 0x0c, 0x1d, 0xe0, 0x00, 0x2e, + 0x00, 0x0e, 0x00, 0x05, 0x90, 0x0e, 0x0c, 0xd8, 0x2d, 0x00, 0x90, 0xb8, + 0x00, 0x08, 0x20, 0x31, 0x8e, 0xb1, 0x90, 0x1e, 0x68, 0x08, 0x90, 0x05, + 0x01, 0x08, 0x83, 0x18, 0x69, 0x0c, 0x91, 0x0a, 0x02, 0x48, 0x01, 0x40, + 0x83, 0x18, 0x68, 0x10, 0x91, 0x12, 0x02, 0x20, 0x01, 0x18, 0x83, 0x18, + 0x22, 0x08, 0x0c, 0xd0, 0x23, 0x3a, 0x68, 0x04, 0xd0, 0x84, 0x23, 0x00, + 0x20, 0x21, 0x00, 0x01, 0x11, 0x50, 0x90, 0x82, 0x00, 0x03, 0x09, 0x67, + 0x0a, 0x67, 0x84, 0x20, 0x90, 0x82, 0x00, 0x07, 0x09, 0x67, 0x0a, 0x67, + 0x0c, 0xd0, 0x90, 0x82, 0x00, 0x02, 0x09, 0x67, 0x0a, 0x67, 0x84, 0x20, + 0x90, 0x82, 0x00, 0x05, 0x09, 0x67, 0x0a, 0x67, 0x0c, 0xd0, 0x6c, 0x1a, + 0x00, 0x05, 0x00, 0x96, 0x00, 0x46, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x2b, 0x00, 0x90, 0x80, 0x8f, 0x2f, 0x20, 0x05, 0x90, 0x05, 0x09, 0x0c, + 0x0d, 0xc5, 0x20, 0x04, 0x90, 0xa0, 0x00, 0x0a, 0x08, 0x0c, 0x10, 0x27, + 0x01, 0xd0, 0x29, 0x00, 0x70, 0x26, 0xa8, 0x03, 0x00, 0x00, 0xa8, 0x07, + 0x00, 0x00, 0x08, 0x0c, 0x10, 0x27, 0x01, 0x88, 0x70, 0x24, 0xa8, 0x02, + 0xa8, 0x07, 0x00, 0x00, 0x29, 0x00, 0x70, 0x26, 0x94, 0xa2, 0x00, 0x0a, + 0x01, 0x10, 0x02, 0x08, 0x0c, 0x90, 0x90, 0x85, 0x00, 0x01, 0x01, 0x2e, + 0x00, 0x4e, 0x00, 0x9e, 0x00, 0x05, 0x70, 0x24, 0x90, 0x05, 0x0d, 0xc8, + 0x20, 0x48, 0xac, 0x00, 0x08, 0x0c, 0x10, 0x40, 0x24, 0x00, 0x0c, 0xc0, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x70, 0x24, 0x20, 0x48, 0x90, 0x05, + 0x01, 0x30, 0xa8, 0x00, 0x70, 0x26, 0xa8, 0x03, 0x00, 0x00, 0xa8, 0x07, + 0x00, 0x00, 0x01, 0x2e, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x70, 0x24, 0xa8, 0x02, 0x29, 0x00, 0x70, 0x26, 0x01, 0x2e, 0x00, 0x05, + 0x00, 0x96, 0x9e, 0x80, 0x00, 0x09, 0x20, 0x04, 0x90, 0x05, 0x01, 0x38, + 0x20, 0x48, 0xa8, 0x00, 0x00, 0x06, 0x08, 0x0c, 0x10, 0x40, 0x00, 0x0e, + 0x0c, 0xb8, 0x00, 0x9e, 0x00, 0x05, 0x00, 0x96, 0x70, 0x08, 0x90, 0x05, + 0x01, 0x38, 0x20, 0x48, 0xa8, 0x00, 0x00, 0x06, 0x08, 0x0c, 0x10, 0x40, + 0x00, 0x0e, 0x0c, 0xb8, 0x90, 0x06, 0x70, 0x02, 0x70, 0x0a, 0x70, 0x06, + 0x70, 0x0e, 0x70, 0x1a, 0x70, 0x1e, 0x70, 0x22, 0x70, 0x2a, 0x70, 0x26, + 0x70, 0x2e, 0x00, 0x9e, 0x00, 0x05, 0x1a, 0x67, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x19, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x88, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x77, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe6, 0x00, 0xc6, 0x00, 0xb6, 0x00, 0xa6, 0xa8, 0xa8, + 0x20, 0x40, 0x20, 0x71, 0x18, 0x77, 0x08, 0x0c, 0x90, 0x53, 0xa0, 0x67, + 0x00, 0x23, 0x60, 0x10, 0x90, 0x5d, 0x09, 0x04, 0x90, 0x28, 0xb8, 0x14, + 0xa0, 0x6e, 0xb9, 0x10, 0xa1, 0x72, 0xb9, 0xa0, 0xa1, 0x76, 0x20, 0x01, + 0x00, 0x03, 0xa0, 0x7e, 0xa8, 0x34, 0xa0, 0x82, 0xa0, 0x7b, 0x00, 0x00, + 0xa8, 0x98, 0x90, 0x05, 0x01, 0x18, 0xa0, 0x78, 0xc0, 0x85, 0xa0, 0x7a, + 0x28, 0x58, 0x20, 0x31, 0x00, 0x18, 0xa0, 0x68, 0x90, 0x8a, 0x00, 0x19, + 0x1a, 0x0c, 0x0d, 0xc5, 0x20, 0x20, 0x20, 0x50, 0x29, 0x40, 0xa8, 0x64, + 0x90, 0xbc, 0x00, 0xff, 0x90, 0x8c, 0x00, 0x0f, 0x91, 0xe0, 0x20, 0xc7, + 0x2c, 0x65, 0x97, 0x86, 0x00, 0x24, 0x2c, 0x05, 0x15, 0x90, 0x90, 0x8a, + 0x00, 0x36, 0x1a, 0x0c, 0x0d, 0xc5, 0x90, 0x82, 0x00, 0x1b, 0x00, 0x02, + 0x8f, 0x93, 0x8f, 0x93, 0x8f, 0x95, 0x8f, 0x93, 0x8f, 0x93, 0x8f, 0x93, + 0x8f, 0x97, 0x8f, 0x93, 0x8f, 0x93, 0x8f, 0x93, 0x8f, 0x99, 0x8f, 0x93, + 0x8f, 0x93, 0x8f, 0x93, 0x8f, 0x9b, 0x8f, 0x93, 0x8f, 0x93, 0x8f, 0x93, + 0x8f, 0x9d, 0x8f, 0x93, 0x8f, 0x93, 0x8f, 0x93, 0x8f, 0x9f, 0x8f, 0x93, + 0x8f, 0x93, 0x8f, 0x93, 0x8f, 0xa1, 0x08, 0x0c, 0x0d, 0xc5, 0xa1, 0x80, + 0x04, 0xb8, 0xa1, 0x90, 0x04, 0xa8, 0xa1, 0xa0, 0x04, 0x98, 0xa1, 0xb0, + 0x04, 0x88, 0xa1, 0xc0, 0x04, 0x78, 0xa1, 0xd0, 0x04, 0x68, 0xa1, 0xe0, + 0x04, 0x58, 0x90, 0x8a, 0x00, 0x34, 0x1a, 0x0c, 0x0d, 0xc5, 0x90, 0x82, + 0x00, 0x1b, 0x00, 0x02, 0x8f, 0xc5, 0x8f, 0xc3, 0x8f, 0xc3, 0x8f, 0xc3, + 0x8f, 0xc3, 0x8f, 0xc3, 0x8f, 0xc7, 0x8f, 0xc3, 0x8f, 0xc3, 0x8f, 0xc3, + 0x8f, 0xc3, 0x8f, 0xc3, 0x8f, 0xc9, 0x8f, 0xc3, 0x8f, 0xc3, 0x8f, 0xc3, + 0x8f, 0xc3, 0x8f, 0xc3, 0x8f, 0xcb, 0x8f, 0xc3, 0x8f, 0xc3, 0x8f, 0xc3, + 0x8f, 0xc3, 0x8f, 0xc3, 0x8f, 0xcd, 0x08, 0x0c, 0x0d, 0xc5, 0xa1, 0x80, + 0x00, 0x38, 0xa1, 0x98, 0x00, 0x28, 0xa1, 0xb0, 0x00, 0x18, 0xa1, 0xc8, + 0x00, 0x08, 0xa1, 0xe0, 0x26, 0x00, 0x00, 0x02, 0x8f, 0xe9, 0x8f, 0xeb, + 0x8f, 0xed, 0x8f, 0xef, 0x8f, 0xf1, 0x8f, 0xf3, 0x8f, 0xf5, 0x8f, 0xf7, + 0x8f, 0xf9, 0x8f, 0xfb, 0x8f, 0xfd, 0x8f, 0xff, 0x90, 0x01, 0x90, 0x03, + 0x90, 0x05, 0x90, 0x07, 0x90, 0x09, 0x90, 0x0b, 0x90, 0x0d, 0x90, 0x0f, + 0x90, 0x11, 0x90, 0x13, 0x90, 0x15, 0x90, 0x17, 0x90, 0x19, 0x08, 0x0c, + 0x0d, 0xc5, 0xb9, 0xe2, 0x04, 0x68, 0xb9, 0xde, 0x04, 0x58, 0xb9, 0xda, + 0x04, 0x48, 0xb9, 0xd6, 0x04, 0x38, 0xb9, 0xd2, 0x04, 0x28, 0xb9, 0xce, + 0x04, 0x18, 0xb9, 0xca, 0x04, 0x08, 0xb9, 0xc6, 0x00, 0xf8, 0xb9, 0xc2, + 0x00, 0xe8, 0xb9, 0xbe, 0x00, 0xd8, 0xb9, 0xba, 0x00, 0xc8, 0xb9, 0xb6, + 0x00, 0xb8, 0xb9, 0xb2, 0x00, 0xa8, 0xb9, 0xae, 0x00, 0x98, 0xb9, 0xaa, + 0x00, 0x88, 0xb9, 0xa6, 0x00, 0x78, 0xb9, 0xa2, 0x00, 0x68, 0xb9, 0x9e, + 0x00, 0x58, 0xb9, 0x9a, 0x00, 0x48, 0xb9, 0x96, 0x00, 0x38, 0xb9, 0x92, + 0x00, 0x28, 0xb9, 0x8e, 0x00, 0x18, 0xb9, 0x8a, 0x00, 0x08, 0xb9, 0x86, + 0x86, 0x31, 0x84, 0x21, 0x01, 0x30, 0x08, 0x0c, 0x20, 0x7f, 0x09, 0x0c, + 0x0d, 0xc5, 0x08, 0x04, 0x8f, 0x6d, 0x00, 0xae, 0x00, 0xbe, 0x00, 0xce, + 0x00, 0xee, 0x00, 0x05, 0xa8, 0x6c, 0xa0, 0x6e, 0xa8, 0x70, 0xa0, 0x72, + 0xa0, 0x77, 0x00, 0xff, 0x90, 0x06, 0x08, 0x04, 0x8f, 0x4f, 0x00, 0x06, + 0x00, 0x16, 0x00, 0xb6, 0x60, 0x10, 0x20, 0x58, 0xb8, 0x10, 0x90, 0x05, + 0x01, 0xb0, 0x20, 0x01, 0x19, 0x25, 0x20, 0x04, 0x90, 0x05, 0x01, 0x88, + 0x20, 0x01, 0x18, 0x00, 0x20, 0x04, 0x90, 0x86, 0x00, 0x03, 0x11, 0x58, + 0x00, 0x36, 0x00, 0x46, 0xbb, 0xa0, 0x20, 0x21, 0x00, 0x04, 0x20, 0x11, + 0x80, 0x14, 0x08, 0x0c, 0x4c, 0x44, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0xbe, + 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, 0x90, 0x16, 0x71, 0x0c, 0xa8, 0x34, + 0x91, 0x0a, 0xa9, 0x36, 0x70, 0x08, 0x90, 0x05, 0x01, 0x20, 0x82, 0x10, + 0x91, 0x0a, 0x02, 0x30, 0x01, 0x28, 0x70, 0x10, 0x82, 0x10, 0x91, 0x0a, + 0x02, 0x08, 0x1d, 0xe0, 0xaa, 0x8a, 0xa2, 0x6a, 0x00, 0x05, 0x00, 0xf6, + 0x00, 0xd6, 0x00, 0x36, 0x20, 0x79, 0x03, 0x00, 0x78, 0x1b, 0x02, 0x00, + 0x78, 0x18, 0xd0, 0x94, 0x1d, 0xd8, 0x78, 0x1b, 0x02, 0x02, 0xa0, 0x01, + 0xa0, 0x01, 0x78, 0x18, 0xd0, 0x94, 0x1d, 0xa0, 0xb8, 0xac, 0x90, 0x6d, + 0x01, 0x98, 0x20, 0x79, 0x00, 0x00, 0x9c, 0x1e, 0x11, 0x18, 0x68, 0x0c, + 0xb8, 0xae, 0x00, 0x50, 0x9c, 0x06, 0x01, 0x30, 0x2d, 0x78, 0x68, 0x0c, + 0x90, 0x6d, 0x1d, 0xd0, 0x08, 0x0c, 0x0d, 0xc5, 0x6b, 0x0c, 0x7b, 0x0e, + 0x60, 0x0f, 0x00, 0x00, 0x20, 0x79, 0x03, 0x00, 0x78, 0x1b, 0x02, 0x00, + 0x00, 0x3e, 0x00, 0xde, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xe6, 0x00, 0xd6, + 0x00, 0x96, 0x00, 0xc6, 0x00, 0x36, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x01, 0x56, 0x20, 0xa9, 0x01, 0xff, 0x20, 0x71, 0x03, 0x00, 0x70, 0x1b, + 0x02, 0x00, 0x70, 0x18, 0xd0, 0x94, 0x01, 0x10, 0x1f, 0x04, 0x90, 0xa3, + 0x70, 0x1b, 0x02, 0x02, 0xa0, 0x01, 0xa0, 0x01, 0x70, 0x18, 0xd0, 0x94, + 0x1d, 0x90, 0xb8, 0xac, 0x90, 0x65, 0x01, 0xf0, 0x60, 0x0c, 0xb8, 0xae, + 0x60, 0x24, 0xc0, 0x8d, 0x60, 0x26, 0x60, 0x03, 0x00, 0x04, 0x60, 0x1b, + 0x00, 0x00, 0x60, 0x13, 0x00, 0x00, 0x60, 0x1f, 0x01, 0x01, 0x60, 0x14, + 0x90, 0x4d, 0x09, 0x0c, 0x0d, 0xc5, 0xa8, 0x8b, 0x00, 0x00, 0xa8, 0xa8, + 0xa8, 0xab, 0x00, 0x00, 0x90, 0x4d, 0x09, 0x0c, 0x0d, 0xc5, 0x08, 0x0c, + 0x10, 0x40, 0x08, 0x0c, 0x8c, 0x61, 0x08, 0xf8, 0x20, 0x71, 0x03, 0x00, + 0x70, 0x1b, 0x02, 0x00, 0x01, 0x5e, 0x01, 0x2e, 0x00, 0x3e, 0x00, 0xce, + 0x00, 0x9e, 0x00, 0xde, 0x00, 0xee, 0x00, 0x05, 0x00, 0xc6, 0x00, 0xb6, + 0x00, 0x16, 0x00, 0x06, 0x01, 0x56, 0x08, 0x0c, 0x28, 0x73, 0x01, 0x5e, + 0x11, 0xb0, 0x08, 0x0c, 0x66, 0xb9, 0x19, 0x0c, 0x0d, 0xc5, 0x00, 0x0e, + 0x00, 0x1e, 0xb9, 0x12, 0xb8, 0x16, 0x08, 0x0c, 0xb2, 0x7d, 0x01, 0x40, + 0x2b, 0x00, 0x60, 0x12, 0x60, 0x23, 0x00, 0x01, 0x20, 0x09, 0x00, 0x01, + 0x08, 0x0c, 0xb3, 0x52, 0x00, 0xbe, 0x00, 0xce, 0x00, 0x05, 0x00, 0x0e, + 0x00, 0x1e, 0x0c, 0xd0, 0x00, 0x66, 0x60, 0x00, 0x90, 0xb2, 0x00, 0x10, + 0x1a, 0x0c, 0x0d, 0xc5, 0x00, 0x13, 0x00, 0x6e, 0x00, 0x05, 0x91, 0x19, + 0x91, 0x19, 0x91, 0x19, 0x91, 0x1b, 0x91, 0x6c, 0x91, 0x19, 0x91, 0x19, + 0x91, 0x19, 0x91, 0xe6, 0x91, 0x19, 0x92, 0x23, 0x91, 0x19, 0x91, 0x19, + 0x91, 0x19, 0x91, 0x19, 0x91, 0x19, 0x08, 0x0c, 0x0d, 0xc5, 0x91, 0x82, + 0x00, 0x40, 0x00, 0x02, 0x91, 0x2e, 0x91, 0x2e, 0x91, 0x2e, 0x91, 0x2e, + 0x91, 0x2e, 0x91, 0x2e, 0x91, 0x2e, 0x91, 0x2e, 0x91, 0x2e, 0x91, 0x30, + 0x91, 0x45, 0x91, 0x2e, 0x91, 0x2e, 0x91, 0x2e, 0x91, 0x2e, 0x91, 0x58, + 0x08, 0x0c, 0x0d, 0xc5, 0x00, 0x96, 0x08, 0x0c, 0x9a, 0x61, 0x08, 0x0c, + 0x9b, 0xd3, 0x61, 0x14, 0x21, 0x48, 0xa8, 0x7b, 0x00, 0x00, 0x60, 0x10, + 0x00, 0xb6, 0x20, 0x58, 0xb8, 0xbb, 0x05, 0x00, 0x00, 0xbe, 0x08, 0x0c, + 0x6c, 0xa3, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x9e, 0x00, 0x05, 0x08, 0x0c, + 0x9a, 0x61, 0x00, 0xd6, 0x61, 0x14, 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0x30, + 0x00, 0x96, 0x61, 0x14, 0x21, 0x48, 0x08, 0x0c, 0x6e, 0x9f, 0x00, 0x9e, + 0x00, 0xde, 0x08, 0x0c, 0xb2, 0xd3, 0x08, 0x0c, 0x9b, 0xd3, 0x00, 0x05, + 0x08, 0x0c, 0x9a, 0x61, 0x08, 0x0c, 0x32, 0x50, 0x61, 0x14, 0x00, 0x96, + 0x21, 0x48, 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0x20, 0xa8, 0x7b, 0x00, 0x29, + 0x08, 0x0c, 0x6e, 0x9f, 0x00, 0x9e, 0x08, 0x0c, 0xb2, 0xd3, 0x08, 0x0c, + 0x9b, 0xd3, 0x00, 0x05, 0x60, 0x1b, 0x00, 0x00, 0x91, 0x82, 0x00, 0x40, + 0x00, 0x96, 0x00, 0x02, 0x91, 0x87, 0x91, 0x87, 0x91, 0x87, 0x91, 0x87, + 0x91, 0x87, 0x91, 0x87, 0x91, 0x87, 0x91, 0x87, 0x91, 0x89, 0x91, 0x87, + 0x91, 0x87, 0x91, 0x87, 0x91, 0xe2, 0x91, 0x87, 0x91, 0x87, 0x91, 0x87, + 0x91, 0x87, 0x91, 0x87, 0x91, 0x87, 0x91, 0x90, 0x91, 0x87, 0x08, 0x0c, + 0x0d, 0xc5, 0x61, 0x14, 0x21, 0x48, 0xa9, 0x38, 0x91, 0x8e, 0xff, 0xff, + 0x09, 0x04, 0x91, 0xe2, 0x60, 0x24, 0xd0, 0x8c, 0x15, 0xd8, 0x08, 0x0c, + 0x8d, 0x17, 0x05, 0xe0, 0x00, 0xe6, 0x61, 0x14, 0x21, 0x48, 0x08, 0x0c, + 0x8f, 0x37, 0x00, 0x96, 0xa8, 0xa8, 0x20, 0x48, 0x08, 0x0c, 0x6c, 0x3b, + 0x00, 0x9e, 0xa8, 0xab, 0x00, 0x00, 0x60, 0x10, 0x90, 0x05, 0x01, 0x28, + 0x00, 0xb6, 0x20, 0x58, 0x08, 0x0c, 0x90, 0x67, 0x00, 0xbe, 0xae, 0x88, + 0x00, 0xb6, 0x20, 0x59, 0x00, 0x00, 0x08, 0x0c, 0x8c, 0x6a, 0x00, 0xbe, + 0x01, 0xe0, 0x20, 0x71, 0x19, 0x3d, 0x08, 0x0c, 0x8c, 0xb1, 0x01, 0xb8, + 0x90, 0x86, 0x00, 0x01, 0x11, 0x28, 0x20, 0x01, 0x19, 0x47, 0x20, 0x04, + 0x90, 0x05, 0x11, 0x78, 0x00, 0x96, 0x08, 0x0c, 0x10, 0x0e, 0x29, 0x00, + 0x00, 0x9e, 0x01, 0x48, 0xa8, 0xaa, 0x00, 0xf6, 0x2c, 0x78, 0x08, 0x0c, + 0x8c, 0x28, 0x00, 0xfe, 0x00, 0xee, 0x00, 0x9e, 0x00, 0x05, 0x08, 0x0c, + 0x8c, 0x61, 0x0c, 0xd0, 0x08, 0x0c, 0x8d, 0x1c, 0x11, 0x60, 0x60, 0x10, + 0x90, 0x05, 0x01, 0x30, 0x20, 0x58, 0xb8, 0xac, 0x90, 0x05, 0x19, 0x0c, + 0x0d, 0xc5, 0x60, 0x12, 0x2c, 0x00, 0x08, 0x0c, 0x8c, 0xe2, 0x00, 0x05, + 0x08, 0x0c, 0x92, 0x90, 0x00, 0x9e, 0x00, 0x05, 0x91, 0x82, 0x00, 0x40, + 0x00, 0x96, 0x00, 0x02, 0x91, 0xfa, 0x91, 0xfa, 0x91, 0xfa, 0x91, 0xfc, + 0x91, 0xfa, 0x91, 0xfa, 0x91, 0xfa, 0x92, 0x21, 0x91, 0xfa, 0x91, 0xfa, + 0x91, 0xfa, 0x91, 0xfa, 0x91, 0xfa, 0x91, 0xfa, 0x91, 0xfa, 0x91, 0xfa, + 0x08, 0x0c, 0x0d, 0xc5, 0x60, 0x03, 0x00, 0x03, 0x61, 0x06, 0x60, 0x14, + 0x20, 0x48, 0xa8, 0xac, 0xa8, 0x46, 0xa8, 0xb0, 0xa8, 0x4a, 0xa8, 0x37, + 0x00, 0x00, 0xa8, 0x3b, 0x00, 0x00, 0xa8, 0x84, 0x90, 0x92, 0x19, 0x9a, + 0x02, 0x10, 0x20, 0x01, 0x19, 0x99, 0x80, 0x03, 0x80, 0x13, 0x82, 0x13, + 0x92, 0x10, 0x62, 0x1a, 0x2c, 0x10, 0x08, 0x0c, 0x1b, 0xe0, 0x08, 0x0c, + 0x95, 0x64, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x9b, 0xd3, + 0x01, 0x2e, 0x00, 0x9e, 0x00, 0x05, 0x08, 0x0c, 0x0d, 0xc5, 0x08, 0x0c, + 0x9a, 0x61, 0x08, 0x0c, 0x9b, 0xd3, 0x61, 0x14, 0x21, 0x48, 0xa8, 0x7b, + 0x00, 0x00, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0xbb, 0x05, 0x00, + 0x00, 0xbe, 0x08, 0x0c, 0x6e, 0x9f, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x9e, + 0x00, 0x05, 0x60, 0x00, 0x90, 0x8a, 0x00, 0x10, 0x1a, 0x0c, 0x0d, 0xc5, + 0x00, 0x96, 0x00, 0x13, 0x00, 0x9e, 0x00, 0x05, 0x92, 0x50, 0x92, 0x50, + 0x92, 0x50, 0x92, 0x52, 0x92, 0x63, 0x92, 0x50, 0x92, 0x50, 0x92, 0x50, + 0x92, 0x50, 0x92, 0x50, 0x92, 0x50, 0x92, 0x50, 0x92, 0x50, 0x92, 0x50, + 0x92, 0x50, 0x92, 0x50, 0x08, 0x0c, 0x0d, 0xc5, 0x08, 0x0c, 0xac, 0x2b, + 0x61, 0x14, 0x21, 0x48, 0xa8, 0x7b, 0x00, 0x06, 0x60, 0x10, 0x00, 0xb6, + 0x20, 0x58, 0xb8, 0xbb, 0x05, 0x00, 0x00, 0xbe, 0x08, 0x0c, 0x6e, 0x9f, + 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x05, 0x04, 0x61, 0x00, 0x05, 0x60, 0x00, + 0x90, 0x8a, 0x00, 0x10, 0x1a, 0x0c, 0x0d, 0xc5, 0x00, 0x96, 0x00, 0x13, + 0x00, 0x9e, 0x00, 0x05, 0x92, 0x7e, 0x92, 0x7e, 0x92, 0x7e, 0x92, 0x80, + 0x92, 0x90, 0x92, 0x7e, 0x92, 0x7e, 0x92, 0x7e, 0x92, 0x7e, 0x92, 0x7e, + 0x92, 0x7e, 0x92, 0x7e, 0x92, 0x7e, 0x92, 0x7e, 0x92, 0x7e, 0x92, 0x7e, + 0x08, 0x0c, 0x0d, 0xc5, 0x00, 0x36, 0x00, 0xe6, 0x20, 0x71, 0x19, 0xe8, + 0x70, 0x3c, 0x9c, 0x06, 0x11, 0x20, 0x20, 0x19, 0x00, 0x00, 0x08, 0x0c, + 0xaa, 0x49, 0x08, 0x0c, 0xac, 0x2b, 0x00, 0xee, 0x00, 0x3e, 0x00, 0x05, + 0x60, 0x24, 0xd0, 0x8c, 0x11, 0xf0, 0x00, 0xf6, 0x00, 0xe6, 0x60, 0x1b, + 0x00, 0x00, 0x60, 0x14, 0x20, 0x48, 0x60, 0x10, 0x90, 0x05, 0x01, 0x28, + 0x00, 0xb6, 0x20, 0x58, 0x08, 0x0c, 0x90, 0x67, 0x00, 0xbe, 0x20, 0x71, + 0x19, 0x3d, 0x08, 0x0c, 0x8c, 0xb1, 0x01, 0x60, 0x20, 0x01, 0x18, 0x7f, + 0x20, 0x04, 0xa8, 0x8a, 0x20, 0x31, 0x00, 0x00, 0x2c, 0x78, 0x08, 0x0c, + 0x8c, 0x28, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, 0x00, 0x96, 0xa8, 0x8b, + 0x00, 0x00, 0xa8, 0xa8, 0x20, 0x48, 0x08, 0x0c, 0x10, 0x40, 0x00, 0x9e, + 0xa8, 0xab, 0x00, 0x00, 0x08, 0x0c, 0x8c, 0x61, 0x0c, 0x80, 0x20, 0x01, + 0x19, 0x25, 0x20, 0x0c, 0x91, 0x8e, 0x00, 0x00, 0x19, 0x0c, 0x8d, 0x17, + 0x05, 0xc8, 0x00, 0xe6, 0x20, 0x71, 0x19, 0x24, 0x71, 0x10, 0xc1, 0xc5, + 0x71, 0x12, 0x08, 0x0c, 0x8d, 0x21, 0x00, 0xf6, 0x00, 0xc6, 0x20, 0x71, + 0x10, 0x00, 0x00, 0xb6, 0x2e, 0x04, 0x90, 0x5d, 0x01, 0x38, 0xb8, 0xac, + 0x90, 0x65, 0x01, 0x20, 0x08, 0x0c, 0x8c, 0xf7, 0x09, 0x0c, 0x90, 0x96, + 0x8e, 0x70, 0x9e, 0x86, 0x18, 0x00, 0x1d, 0x90, 0x00, 0xbe, 0x00, 0xd6, + 0x00, 0x96, 0x00, 0x46, 0x20, 0x61, 0x1c, 0xd0, 0x20, 0x01, 0x18, 0x1a, + 0x20, 0x24, 0x60, 0x20, 0x90, 0x86, 0x00, 0x00, 0x11, 0x91, 0x9c, 0xe0, + 0x00, 0x18, 0x24, 0x00, 0x9c, 0x06, 0x1d, 0xb8, 0x00, 0x4e, 0x00, 0x9e, + 0x00, 0xde, 0x00, 0xd1, 0x00, 0xce, 0x00, 0xfe, 0x20, 0x71, 0x19, 0x24, + 0x71, 0x10, 0xc1, 0xc4, 0x71, 0x12, 0x00, 0xee, 0x00, 0x05, 0x60, 0x20, + 0x90, 0x86, 0x00, 0x09, 0x11, 0x60, 0x61, 0x00, 0x91, 0x86, 0x00, 0x04, + 0x11, 0x38, 0x61, 0x10, 0x81, 0xff, 0x19, 0x0c, 0x0d, 0xc5, 0x2c, 0x00, + 0x08, 0x0c, 0x8c, 0xe2, 0x90, 0x06, 0x00, 0x05, 0x20, 0x71, 0x19, 0x3f, + 0x20, 0x73, 0x00, 0x00, 0x8e, 0x70, 0x9e, 0x86, 0x19, 0x47, 0x1d, 0xd0, + 0x20, 0x71, 0x19, 0x3d, 0x70, 0x06, 0x70, 0x02, 0x20, 0x01, 0x19, 0x30, + 0x20, 0x64, 0x8c, 0xff, 0x01, 0x30, 0x61, 0x20, 0x91, 0x8e, 0x00, 0x00, + 0x19, 0x0c, 0x0d, 0xc5, 0x21, 0x02, 0x20, 0x01, 0x18, 0x8a, 0x20, 0x0c, + 0x81, 0xff, 0x01, 0x48, 0x00, 0x96, 0x21, 0x48, 0x08, 0x0c, 0x10, 0x40, + 0x00, 0x9e, 0x20, 0x01, 0x18, 0x8a, 0x20, 0x03, 0x00, 0x00, 0x20, 0x71, + 0x19, 0x31, 0x08, 0x0c, 0x8f, 0x00, 0x08, 0x04, 0x8f, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x00, 0x36, 0x00, 0x46, 0x20, 0xa9, 0x00, 0x10, 0x90, 0x06, 0x80, 0x04, + 0x20, 0x19, 0x01, 0x00, 0x23, 0x1c, 0x93, 0xa6, 0x00, 0x08, 0x11, 0x18, + 0x80, 0x86, 0x81, 0x8e, 0x00, 0x20, 0x80, 0xf6, 0x3e, 0x00, 0x81, 0xf6, + 0x3e, 0x08, 0x12, 0x08, 0x92, 0x00, 0x1f, 0x04, 0x93, 0x56, 0x93, 0xa6, + 0x00, 0x08, 0x11, 0x18, 0x80, 0x86, 0x81, 0x8e, 0x00, 0x20, 0x80, 0xf6, + 0x3e, 0x00, 0x81, 0xf6, 0x3e, 0x08, 0x00, 0x4e, 0x00, 0x3e, 0x01, 0x2e, + 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0x76, 0x01, 0x56, + 0x20, 0xa9, 0x00, 0x10, 0x90, 0x05, 0x05, 0x10, 0x91, 0x1a, 0x16, 0x00, + 0x82, 0x13, 0x20, 0x39, 0x01, 0x00, 0x27, 0x3c, 0x97, 0xbe, 0x00, 0x08, + 0x11, 0x10, 0x81, 0x8d, 0x00, 0x10, 0x81, 0xf5, 0x3e, 0x08, 0x02, 0x28, + 0x91, 0x1a, 0x12, 0x20, 0x1f, 0x04, 0x93, 0x80, 0x00, 0x28, 0x91, 0x1a, + 0x23, 0x08, 0x82, 0x10, 0x1f, 0x04, 0x93, 0x80, 0x00, 0x06, 0x32, 0x00, + 0x90, 0x84, 0xef, 0xff, 0x20, 0x80, 0x00, 0x0e, 0x01, 0x5e, 0x00, 0x7e, + 0x01, 0x2e, 0x00, 0x05, 0x00, 0x06, 0x32, 0x00, 0x90, 0x85, 0x10, 0x00, + 0x0c, 0xa8, 0x01, 0x26, 0x20, 0x91, 0x28, 0x00, 0x20, 0x79, 0x19, 0xe8, + 0x01, 0x2e, 0x00, 0xd6, 0x20, 0x69, 0x19, 0xe8, 0x68, 0x03, 0x00, 0x05, + 0x01, 0x56, 0x01, 0x46, 0x01, 0xd6, 0x20, 0xe9, 0x00, 0x00, 0x20, 0x69, + 0x02, 0x00, 0x08, 0x0c, 0xaf, 0x8e, 0x04, 0x01, 0x08, 0x0c, 0xaf, 0x79, + 0x00, 0xe9, 0x08, 0x0c, 0xaf, 0x7c, 0x00, 0xd1, 0x08, 0x0c, 0xaf, 0x7f, + 0x00, 0xb9, 0x08, 0x0c, 0xaf, 0x82, 0x00, 0xa1, 0x08, 0x0c, 0xaf, 0x85, + 0x00, 0x89, 0x08, 0x0c, 0xaf, 0x88, 0x00, 0x71, 0x08, 0x0c, 0xaf, 0x8b, + 0x00, 0x59, 0x01, 0xde, 0x01, 0x4e, 0x01, 0x5e, 0x20, 0x69, 0x00, 0x04, + 0x2d, 0x04, 0x90, 0x85, 0x80, 0x01, 0x20, 0x6a, 0x00, 0xde, 0x00, 0x05, + 0x20, 0xa9, 0x00, 0x20, 0x20, 0xa1, 0x02, 0x40, 0x20, 0x01, 0x00, 0x00, + 0x40, 0x04, 0x00, 0x05, 0x00, 0xc6, 0x60, 0x27, 0x00, 0x01, 0x78, 0x04, + 0x90, 0x84, 0x00, 0x07, 0x00, 0x02, 0x93, 0xf3, 0x94, 0x17, 0x94, 0x58, + 0x93, 0xf9, 0x94, 0x17, 0x93, 0xf3, 0x93, 0xf1, 0x93, 0xf1, 0x08, 0x0c, + 0x0d, 0xc5, 0x08, 0x0c, 0x88, 0xc3, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0xce, + 0x00, 0x05, 0x62, 0xc0, 0x82, 0xff, 0x11, 0x10, 0x00, 0xce, 0x00, 0x05, + 0x20, 0x11, 0x5f, 0x97, 0x08, 0x0c, 0x88, 0x3d, 0x78, 0x28, 0x90, 0x92, + 0x00, 0xc8, 0x12, 0x28, 0x80, 0x00, 0x78, 0x2a, 0x08, 0x0c, 0x5f, 0xd7, + 0x0c, 0x88, 0x62, 0xc0, 0x08, 0x0c, 0xb0, 0xca, 0x08, 0x0c, 0x5f, 0x97, + 0x78, 0x07, 0x00, 0x03, 0x78, 0x27, 0x00, 0x00, 0x78, 0x2b, 0x00, 0x00, + 0x0c, 0x28, 0x08, 0x0c, 0x88, 0xc3, 0x62, 0x20, 0xd2, 0xa4, 0x01, 0x70, + 0xd2, 0xcc, 0x01, 0x60, 0x78, 0x2b, 0x00, 0x00, 0x78, 0x24, 0x90, 0x65, + 0x09, 0x0c, 0x0d, 0xc5, 0x20, 0x09, 0x00, 0x13, 0x08, 0x0c, 0xb3, 0x52, + 0x00, 0xce, 0x00, 0x05, 0x00, 0xc6, 0x78, 0x24, 0x90, 0x65, 0x09, 0x0c, + 0x0d, 0xc5, 0x78, 0x28, 0x90, 0x92, 0xc3, 0x50, 0x12, 0xc0, 0x80, 0x00, + 0x78, 0x2a, 0x00, 0xce, 0x08, 0x0c, 0x2b, 0xce, 0x02, 0x78, 0x00, 0xc6, + 0x79, 0x24, 0x21, 0x60, 0x60, 0x10, 0x90, 0x6d, 0x09, 0x0c, 0x0d, 0xc5, + 0x78, 0x07, 0x00, 0x00, 0x78, 0x27, 0x00, 0x00, 0x00, 0xce, 0x08, 0x0c, + 0x9a, 0xb1, 0x0c, 0x00, 0x08, 0x0c, 0xa6, 0xc5, 0x08, 0xe8, 0x20, 0x11, + 0x01, 0x30, 0x22, 0x14, 0x08, 0x0c, 0xb0, 0xca, 0x08, 0x0c, 0xf0, 0x94, + 0x20, 0x09, 0x00, 0x14, 0x08, 0x0c, 0xb3, 0x52, 0x00, 0xce, 0x08, 0x80, + 0x20, 0x01, 0x1a, 0x04, 0x20, 0x03, 0x00, 0x00, 0x62, 0xc0, 0x82, 0xff, + 0x11, 0x60, 0x78, 0x2b, 0x00, 0x00, 0x78, 0x24, 0x90, 0x65, 0x09, 0x0c, + 0x0d, 0xc5, 0x20, 0x09, 0x00, 0x13, 0x08, 0x0c, 0xb3, 0xa4, 0x00, 0xce, + 0x00, 0x05, 0x00, 0xb6, 0x00, 0xc6, 0x00, 0xd6, 0x78, 0x24, 0x90, 0x05, + 0x09, 0x0c, 0x0d, 0xc5, 0x78, 0x28, 0x90, 0x92, 0xc3, 0x50, 0x16, 0x48, + 0x80, 0x00, 0x78, 0x2a, 0x00, 0xde, 0x00, 0xce, 0x00, 0xbe, 0x08, 0x0c, + 0x2b, 0xce, 0x02, 0xf0, 0x00, 0xb6, 0x00, 0xc6, 0x00, 0xd6, 0x78, 0x1c, + 0x90, 0x5d, 0x09, 0x0c, 0x0d, 0xc5, 0xb8, 0x00, 0xc0, 0xdc, 0xb8, 0x02, + 0x79, 0x24, 0x21, 0x60, 0x08, 0x0c, 0xb2, 0xd3, 0xb9, 0x3c, 0x81, 0xff, + 0x09, 0x0c, 0x0d, 0xc5, 0x81, 0x09, 0xb9, 0x3e, 0x78, 0x07, 0x00, 0x00, + 0x78, 0x27, 0x00, 0x00, 0x00, 0xde, 0x00, 0xce, 0x00, 0xbe, 0x08, 0x0c, + 0x9a, 0xb1, 0x08, 0x68, 0x08, 0x0c, 0xa6, 0xc5, 0x08, 0x50, 0x20, 0x11, + 0x01, 0x30, 0x22, 0x14, 0x08, 0x0c, 0xb0, 0xca, 0x08, 0x0c, 0xf0, 0x94, + 0x78, 0x24, 0x90, 0x65, 0x20, 0x09, 0x00, 0x14, 0x08, 0x0c, 0xb3, 0x52, + 0x00, 0xde, 0x00, 0xce, 0x00, 0xbe, 0x08, 0x04, 0x94, 0x69, 0x00, 0xc6, + 0x20, 0x01, 0x00, 0x9b, 0x20, 0x04, 0xd0, 0xfc, 0x19, 0x0c, 0x1e, 0xeb, + 0x60, 0x24, 0x60, 0x27, 0x00, 0x02, 0xd0, 0xf4, 0x15, 0xb8, 0x62, 0xc8, + 0x60, 0xc4, 0x92, 0x05, 0x11, 0x70, 0x78, 0x3c, 0x90, 0x65, 0x01, 0x30, + 0x20, 0x09, 0x00, 0x49, 0x08, 0x0c, 0xb3, 0x52, 0x00, 0xce, 0x00, 0x05, + 0x20, 0x11, 0x1a, 0x07, 0x20, 0x13, 0x00, 0x00, 0x0c, 0xc8, 0x79, 0x3c, + 0x81, 0xff, 0x0d, 0xc0, 0x79, 0x44, 0x91, 0x92, 0x75, 0x30, 0x16, 0x28, + 0x81, 0x08, 0x79, 0x46, 0x79, 0x3c, 0x91, 0x88, 0x00, 0x08, 0x21, 0x0c, + 0x91, 0x8e, 0x00, 0x06, 0x11, 0x38, 0x60, 0x14, 0x90, 0x84, 0x19, 0x84, + 0x90, 0x85, 0x00, 0x12, 0x60, 0x16, 0x0c, 0x10, 0x79, 0x3c, 0x91, 0x88, + 0x00, 0x08, 0x21, 0x0c, 0x91, 0x8e, 0x00, 0x09, 0x0d, 0x90, 0x60, 0x14, + 0x90, 0x84, 0x19, 0x84, 0x90, 0x85, 0x00, 0x16, 0x60, 0x16, 0x08, 0xa0, + 0x79, 0x3c, 0x21, 0x60, 0x20, 0x09, 0x00, 0x4a, 0x08, 0x0c, 0xb3, 0x52, + 0x08, 0x68, 0x78, 0x48, 0xc0, 0x85, 0x78, 0x4a, 0x08, 0x48, 0x00, 0x06, + 0x00, 0x16, 0x00, 0xc6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x60, 0x0f, + 0x00, 0x00, 0x2c, 0x08, 0x20, 0x61, 0x19, 0xe8, 0x60, 0x20, 0x80, 0x00, + 0x60, 0x22, 0x60, 0x10, 0x90, 0x05, 0x01, 0x48, 0x90, 0x80, 0x00, 0x03, + 0x21, 0x02, 0x61, 0x12, 0x01, 0x2e, 0x00, 0xce, 0x00, 0x1e, 0x00, 0x0e, + 0x00, 0x05, 0x61, 0x16, 0x61, 0x12, 0x0c, 0xc0, 0x00, 0xd6, 0x20, 0x69, + 0x19, 0xe8, 0xb8, 0x00, 0xd0, 0xd4, 0x01, 0x68, 0x68, 0x20, 0x80, 0x00, + 0x68, 0x22, 0x90, 0x86, 0x00, 0x01, 0x11, 0x10, 0x2b, 0x00, 0x68, 0x1e, + 0x00, 0xde, 0x08, 0x04, 0x9a, 0xb1, 0x00, 0xde, 0x00, 0x05, 0xc0, 0xd5, + 0xb8, 0x02, 0x68, 0x18, 0x90, 0x05, 0x01, 0x68, 0xb8, 0x56, 0xb8, 0x5b, + 0x00, 0x00, 0x00, 0x86, 0x00, 0x06, 0x2b, 0x00, 0x68, 0x1a, 0x00, 0x8e, + 0xa0, 0x5a, 0x00, 0x8e, 0x20, 0x69, 0x19, 0xe8, 0x0c, 0x08, 0xb8, 0x56, + 0xb8, 0x5a, 0x2b, 0x00, 0x68, 0x1a, 0x68, 0x1e, 0x08, 0xd8, 0x00, 0x06, + 0x00, 0x16, 0x00, 0xc6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x60, 0x0f, + 0x00, 0x00, 0x2c, 0x08, 0x20, 0x61, 0x19, 0xe8, 0x60, 0x20, 0x80, 0x00, + 0x60, 0x22, 0x60, 0x08, 0x90, 0x05, 0x01, 0x48, 0x90, 0x80, 0x00, 0x03, + 0x21, 0x02, 0x61, 0x0a, 0x01, 0x2e, 0x00, 0xce, 0x00, 0x1e, 0x00, 0x0e, + 0x00, 0x05, 0x61, 0x0e, 0x61, 0x0a, 0x0c, 0xc0, 0x00, 0xc6, 0x60, 0x0f, + 0x00, 0x00, 0x2c, 0x08, 0x20, 0x61, 0x19, 0xe8, 0x60, 0x34, 0x90, 0x05, + 0x01, 0x30, 0x90, 0x80, 0x00, 0x03, 0x21, 0x02, 0x61, 0x36, 0x00, 0xce, + 0x00, 0x05, 0x61, 0x3a, 0x61, 0x36, 0x00, 0xce, 0x00, 0x05, 0x00, 0xf6, + 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, 0x00, 0xb6, 0x00, 0x96, 0x00, 0x76, + 0x00, 0x66, 0x00, 0x56, 0x00, 0x36, 0x00, 0x26, 0x00, 0x16, 0x00, 0x06, + 0x01, 0x26, 0x90, 0x2e, 0x20, 0x71, 0x19, 0xe8, 0x76, 0x38, 0x26, 0x60, + 0x26, 0x78, 0x20, 0x91, 0x80, 0x00, 0x8c, 0xff, 0x09, 0x04, 0x95, 0xf3, + 0x60, 0x10, 0x20, 0x58, 0xb8, 0xa0, 0x92, 0x06, 0x19, 0x04, 0x95, 0xee, + 0x87, 0xff, 0x01, 0x20, 0x60, 0x54, 0x91, 0x06, 0x19, 0x04, 0x95, 0xee, + 0x70, 0x3c, 0x9c, 0x06, 0x11, 0x78, 0x00, 0x36, 0x20, 0x19, 0x00, 0x01, + 0x08, 0x0c, 0xaa, 0x49, 0x70, 0x33, 0x00, 0x00, 0x90, 0x06, 0x70, 0x3e, + 0x70, 0x42, 0x70, 0x46, 0x70, 0x4a, 0x00, 0x3e, 0x20, 0x29, 0x00, 0x01, + 0x70, 0x38, 0x9c, 0x36, 0x11, 0x10, 0x66, 0x0c, 0x76, 0x3a, 0x70, 0x34, + 0x9c, 0x36, 0x11, 0x40, 0x2c, 0x00, 0x9f, 0x36, 0x01, 0x18, 0x2f, 0x00, + 0x70, 0x36, 0x00, 0x10, 0x70, 0x37, 0x00, 0x00, 0x66, 0x0c, 0x00, 0x66, + 0x2c, 0x00, 0x9f, 0x06, 0x01, 0x10, 0x7e, 0x0e, 0x00, 0x08, 0x26, 0x78, + 0x60, 0x0f, 0x00, 0x00, 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0xf0, 0x60, 0x14, + 0x20, 0x48, 0x60, 0x20, 0x90, 0x86, 0x00, 0x03, 0x15, 0xb8, 0x60, 0x04, + 0x90, 0x86, 0x00, 0x40, 0x09, 0x0c, 0xac, 0x1b, 0xa8, 0x67, 0x01, 0x03, + 0xab, 0x7a, 0xa8, 0x77, 0x00, 0x00, 0x00, 0x16, 0x00, 0x36, 0x00, 0x76, + 0x08, 0x0c, 0xd3, 0xce, 0x08, 0x0c, 0xef, 0x85, 0x08, 0x0c, 0x6e, 0x9f, + 0x00, 0x7e, 0x00, 0x3e, 0x00, 0x1e, 0x08, 0x0c, 0xd2, 0xc3, 0x08, 0x0c, + 0xb3, 0x06, 0x00, 0xce, 0x08, 0x04, 0x95, 0x8d, 0x2c, 0x78, 0x60, 0x0c, + 0x20, 0x60, 0x08, 0x04, 0x95, 0x8d, 0x85, 0xff, 0x01, 0x20, 0x00, 0x36, + 0x08, 0x0c, 0x9b, 0xd3, 0x00, 0x3e, 0x01, 0x2e, 0x00, 0x0e, 0x00, 0x1e, + 0x00, 0x2e, 0x00, 0x3e, 0x00, 0x5e, 0x00, 0x6e, 0x00, 0x7e, 0x00, 0x9e, + 0x00, 0xbe, 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, + 0x60, 0x20, 0x90, 0x86, 0x00, 0x06, 0x11, 0x58, 0x00, 0x16, 0x00, 0x36, + 0x00, 0x76, 0x08, 0x0c, 0xef, 0x85, 0x08, 0x0c, 0xeb, 0xd4, 0x00, 0x7e, + 0x00, 0x3e, 0x00, 0x1e, 0x08, 0x90, 0x60, 0x20, 0x90, 0x86, 0x00, 0x09, + 0x11, 0x68, 0xa8, 0x7b, 0x00, 0x06, 0x00, 0x16, 0x00, 0x36, 0x00, 0x76, + 0x08, 0x0c, 0x6e, 0x9f, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x7e, 0x00, 0x3e, + 0x00, 0x1e, 0x08, 0x18, 0x60, 0x20, 0x90, 0x86, 0x00, 0x0a, 0x09, 0x04, + 0x95, 0xd8, 0x08, 0x04, 0x95, 0xd1, 0x00, 0x06, 0x00, 0x66, 0x00, 0x96, + 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xf6, 0x90, 0x36, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x79, 0x19, 0xe8, 0x78, 0x38, 0x90, 0x65, 0x09, 0x04, + 0x96, 0x84, 0x60, 0x0c, 0x00, 0x06, 0x60, 0x0f, 0x00, 0x00, 0x78, 0x3c, + 0x9c, 0x06, 0x11, 0x68, 0x00, 0x36, 0x20, 0x19, 0x00, 0x01, 0x08, 0x0c, + 0xaa, 0x49, 0x78, 0x33, 0x00, 0x00, 0x90, 0x1e, 0x7b, 0x3e, 0x7b, 0x42, + 0x7b, 0x46, 0x7b, 0x4a, 0x00, 0x3e, 0x08, 0x0c, 0xd0, 0xd8, 0x05, 0x48, + 0x60, 0x14, 0x20, 0x48, 0x60, 0x20, 0x90, 0x86, 0x00, 0x03, 0x15, 0x90, + 0x3e, 0x08, 0x91, 0x8e, 0x00, 0x02, 0x11, 0x88, 0x60, 0x10, 0x90, 0x05, + 0x01, 0x70, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x00, 0x00, 0xbe, 0xd0, 0xbc, + 0x01, 0x40, 0x60, 0x40, 0x90, 0x05, 0x11, 0xa8, 0x20, 0x01, 0x19, 0x88, + 0x20, 0x04, 0x60, 0x42, 0x00, 0x80, 0x60, 0x04, 0x90, 0x86, 0x00, 0x40, + 0x09, 0x0c, 0xac, 0x1b, 0xa8, 0x67, 0x01, 0x03, 0xab, 0x7a, 0xa8, 0x77, + 0x00, 0x00, 0x08, 0x0c, 0x6e, 0x92, 0x08, 0x0c, 0xd2, 0xc3, 0x08, 0x0c, + 0xb3, 0x06, 0x00, 0x0e, 0x08, 0x04, 0x96, 0x3c, 0x7e, 0x3a, 0x7e, 0x36, + 0x01, 0x2e, 0x00, 0xfe, 0x00, 0xde, 0x00, 0xce, 0x00, 0x9e, 0x00, 0x6e, + 0x00, 0x0e, 0x00, 0x05, 0x60, 0x20, 0x90, 0x86, 0x00, 0x06, 0x11, 0x18, + 0x08, 0x0c, 0xeb, 0xd4, 0x0c, 0x50, 0x60, 0x20, 0x90, 0x86, 0x00, 0x09, + 0x11, 0x30, 0xab, 0x7a, 0x08, 0x0c, 0x6e, 0x9f, 0x08, 0x0c, 0xb2, 0xd3, + 0x0c, 0x10, 0x60, 0x20, 0x90, 0x86, 0x00, 0x0a, 0x09, 0xa8, 0x08, 0x68, + 0x00, 0x16, 0x00, 0x26, 0x00, 0x86, 0x90, 0x46, 0x00, 0x99, 0x08, 0x0c, + 0x97, 0x8f, 0x00, 0x8e, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xf6, + 0x01, 0x26, 0x20, 0x79, 0x19, 0xe8, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, + 0x98, 0x26, 0x08, 0x0c, 0x98, 0xb6, 0x01, 0x2e, 0x00, 0xfe, 0x00, 0x05, + 0x00, 0xb6, 0x00, 0x96, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, + 0x00, 0x66, 0x00, 0x16, 0x00, 0x06, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x71, 0x19, 0xe8, 0x76, 0x14, 0x26, 0x60, 0x26, 0x78, 0x8c, 0xff, + 0x09, 0x04, 0x97, 0x54, 0x60, 0x10, 0x20, 0x58, 0xb8, 0xa0, 0x92, 0x06, + 0x19, 0x04, 0x97, 0x4f, 0x88, 0xff, 0x01, 0x20, 0x60, 0x54, 0x91, 0x06, + 0x19, 0x04, 0x97, 0x4f, 0x70, 0x24, 0x9c, 0x06, 0x15, 0x68, 0x20, 0x69, + 0x01, 0x00, 0x68, 0x20, 0xd0, 0xa4, 0x01, 0x10, 0xd0, 0xcc, 0x15, 0x08, + 0x08, 0x0c, 0x88, 0xc3, 0x08, 0x0c, 0xa6, 0xe9, 0x68, 0xc3, 0x00, 0x00, + 0x08, 0x0c, 0xac, 0x1b, 0x70, 0x27, 0x00, 0x00, 0x00, 0x36, 0x20, 0x69, + 0x01, 0x40, 0x6b, 0x04, 0x93, 0x84, 0x10, 0x00, 0x01, 0x38, 0x20, 0x01, + 0x01, 0x00, 0x08, 0x0c, 0x2d, 0x39, 0x90, 0x06, 0x08, 0x0c, 0x2d, 0x39, + 0x20, 0x69, 0x01, 0x00, 0x68, 0x24, 0xd0, 0x84, 0x01, 0x10, 0x68, 0x27, + 0x00, 0x01, 0x00, 0x3e, 0x00, 0x28, 0x60, 0x03, 0x00, 0x09, 0x63, 0x0a, + 0x08, 0x04, 0x97, 0x4f, 0x70, 0x14, 0x9c, 0x36, 0x11, 0x10, 0x66, 0x0c, + 0x76, 0x16, 0x70, 0x10, 0x9c, 0x36, 0x11, 0x40, 0x2c, 0x00, 0x9f, 0x36, + 0x01, 0x18, 0x2f, 0x00, 0x70, 0x12, 0x00, 0x10, 0x70, 0x13, 0x00, 0x00, + 0x66, 0x0c, 0x00, 0x66, 0x2c, 0x00, 0x9f, 0x06, 0x01, 0x10, 0x7e, 0x0e, + 0x00, 0x08, 0x26, 0x78, 0x60, 0x0f, 0x00, 0x00, 0x60, 0x14, 0x20, 0x48, + 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0xe8, 0x60, 0x20, 0x90, 0x86, 0x00, 0x03, + 0x15, 0x80, 0x08, 0x0c, 0xd2, 0xe0, 0x11, 0x18, 0x08, 0x0c, 0xbc, 0xb6, + 0x00, 0x98, 0xa8, 0x67, 0x01, 0x03, 0xab, 0x7a, 0xa8, 0x77, 0x00, 0x00, + 0x00, 0x16, 0x00, 0x36, 0x00, 0x86, 0x08, 0x0c, 0xd3, 0xce, 0x08, 0x0c, + 0xef, 0x85, 0x08, 0x0c, 0x6e, 0x9f, 0x00, 0x8e, 0x00, 0x3e, 0x00, 0x1e, + 0x08, 0x0c, 0xd2, 0xc3, 0x08, 0x0c, 0xb3, 0x06, 0x08, 0x0c, 0xaa, 0xf1, + 0x00, 0xce, 0x08, 0x04, 0x96, 0xcd, 0x2c, 0x78, 0x60, 0x0c, 0x20, 0x60, + 0x08, 0x04, 0x96, 0xcd, 0x01, 0x2e, 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x6e, + 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x9e, 0x00, 0xbe, + 0x00, 0x05, 0x60, 0x20, 0x90, 0x86, 0x00, 0x06, 0x11, 0x58, 0x00, 0x16, + 0x00, 0x36, 0x00, 0x86, 0x08, 0x0c, 0xef, 0x85, 0x08, 0x0c, 0xeb, 0xd4, + 0x00, 0x8e, 0x00, 0x3e, 0x00, 0x1e, 0x08, 0xd0, 0x08, 0x0c, 0xbc, 0xb6, + 0x60, 0x20, 0x90, 0x86, 0x00, 0x02, 0x11, 0x60, 0x60, 0x04, 0x00, 0x06, + 0x90, 0x86, 0x00, 0x85, 0x00, 0x0e, 0x09, 0x04, 0x97, 0x35, 0x90, 0x86, + 0x00, 0x8b, 0x09, 0x04, 0x97, 0x35, 0x08, 0x40, 0x60, 0x20, 0x90, 0x86, + 0x00, 0x05, 0x19, 0x20, 0x60, 0x04, 0x00, 0x06, 0x90, 0x86, 0x00, 0x85, + 0x00, 0x0e, 0x09, 0xc8, 0x90, 0x86, 0x00, 0x8b, 0x09, 0xb0, 0x08, 0x04, + 0x97, 0x48, 0x00, 0xb6, 0x00, 0xa6, 0x00, 0x96, 0x00, 0xc6, 0x00, 0x06, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x92, 0x80, 0x10, 0x00, 0x20, 0x04, + 0x90, 0x5d, 0x09, 0x04, 0x98, 0x1f, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xd6, + 0x00, 0x66, 0x20, 0x71, 0x19, 0xe8, 0xbe, 0x54, 0x70, 0x18, 0x9b, 0x06, + 0x11, 0x08, 0x76, 0x1a, 0x70, 0x1c, 0x9b, 0x06, 0x11, 0x30, 0x86, 0xff, + 0x11, 0x18, 0x70, 0x18, 0x70, 0x1e, 0x00, 0x08, 0x76, 0x1e, 0xb8, 0x58, + 0x90, 0x4d, 0x01, 0x08, 0xae, 0x56, 0x96, 0xd5, 0x00, 0x00, 0x01, 0x10, + 0x29, 0x00, 0xb0, 0x5a, 0xb8, 0x57, 0x00, 0x00, 0xb8, 0x5b, 0x00, 0x00, + 0xb8, 0x00, 0xc0, 0xd4, 0xc0, 0xdc, 0xb8, 0x02, 0x08, 0x0c, 0x66, 0x4c, + 0x09, 0x04, 0x98, 0x1b, 0x76, 0x24, 0x86, 0xff, 0x09, 0x04, 0x98, 0x0a, + 0x96, 0x80, 0x00, 0x05, 0x20, 0x04, 0x99, 0x06, 0x15, 0xd8, 0x00, 0xd6, + 0x20, 0x69, 0x01, 0x00, 0x68, 0xc0, 0x90, 0x05, 0x05, 0x60, 0x08, 0x0c, + 0x88, 0xc3, 0x08, 0x0c, 0xa6, 0xe9, 0x68, 0xc3, 0x00, 0x00, 0x08, 0x0c, + 0xac, 0x1b, 0x70, 0x27, 0x00, 0x00, 0x00, 0x36, 0x20, 0x69, 0x01, 0x40, + 0x6b, 0x04, 0x93, 0x84, 0x10, 0x00, 0x01, 0x38, 0x20, 0x01, 0x01, 0x00, + 0x08, 0x0c, 0x2d, 0x39, 0x90, 0x06, 0x08, 0x0c, 0x2d, 0x39, 0x20, 0x69, + 0x01, 0x00, 0x68, 0x24, 0xd0, 0x84, 0x01, 0x10, 0x68, 0x27, 0x00, 0x01, + 0x00, 0x3e, 0x00, 0xde, 0x00, 0xc6, 0xb8, 0x3c, 0x90, 0x05, 0x01, 0x10, + 0x80, 0x01, 0xb8, 0x3e, 0x26, 0x60, 0x08, 0x0c, 0xb3, 0x06, 0x00, 0xce, + 0x00, 0x48, 0x00, 0xde, 0x00, 0xc6, 0x26, 0x60, 0x60, 0x03, 0x00, 0x09, + 0x63, 0x0a, 0x00, 0xce, 0x08, 0x04, 0x97, 0xc2, 0x89, 0xff, 0x01, 0x58, + 0xa8, 0x67, 0x01, 0x03, 0xab, 0x7a, 0xa8, 0x77, 0x00, 0x00, 0x08, 0x0c, + 0xd3, 0xce, 0x08, 0x0c, 0xef, 0x85, 0x08, 0x0c, 0x6e, 0x9f, 0x08, 0x0c, + 0xaa, 0xf1, 0x08, 0x04, 0x97, 0xc2, 0x00, 0x6e, 0x00, 0xde, 0x00, 0xee, + 0x00, 0xfe, 0x01, 0x2e, 0x00, 0x0e, 0x00, 0xce, 0x00, 0x9e, 0x00, 0xae, + 0x00, 0xbe, 0x00, 0x05, 0x00, 0x96, 0x00, 0x06, 0x00, 0x66, 0x00, 0xc6, + 0x00, 0xd6, 0x90, 0x36, 0x78, 0x14, 0x90, 0x65, 0x09, 0x04, 0x98, 0x89, + 0x60, 0x0c, 0x00, 0x06, 0x60, 0x0f, 0x00, 0x00, 0x78, 0x24, 0x9c, 0x06, + 0x15, 0x80, 0x20, 0x69, 0x01, 0x00, 0x68, 0x20, 0xd0, 0xa4, 0x01, 0x10, + 0xd0, 0xcc, 0x15, 0x08, 0x08, 0x0c, 0x88, 0xc3, 0x08, 0x0c, 0xa6, 0xe9, + 0x68, 0xc3, 0x00, 0x00, 0x08, 0x0c, 0xac, 0x1b, 0x78, 0x27, 0x00, 0x00, + 0x00, 0x36, 0x20, 0x69, 0x01, 0x40, 0x6b, 0x04, 0x93, 0x84, 0x10, 0x00, + 0x01, 0x38, 0x20, 0x01, 0x01, 0x00, 0x08, 0x0c, 0x2d, 0x39, 0x90, 0x06, + 0x08, 0x0c, 0x2d, 0x39, 0x20, 0x69, 0x01, 0x00, 0x68, 0x24, 0xd0, 0x84, + 0x01, 0x10, 0x68, 0x27, 0x00, 0x01, 0x00, 0x3e, 0x00, 0x40, 0x08, 0x0c, + 0x6a, 0x3b, 0x15, 0x20, 0x60, 0x03, 0x00, 0x09, 0x63, 0x0a, 0x2c, 0x30, + 0x00, 0xf8, 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0xd0, 0xd6, 0x01, 0xb0, + 0x60, 0x20, 0x90, 0x86, 0x00, 0x03, 0x15, 0x08, 0x08, 0x0c, 0xd2, 0xe0, + 0x11, 0x18, 0x08, 0x0c, 0xbc, 0xb6, 0x00, 0x60, 0x08, 0x0c, 0x6a, 0x3b, + 0x11, 0x68, 0xa8, 0x67, 0x01, 0x03, 0xab, 0x7a, 0xa8, 0x77, 0x00, 0x00, + 0x08, 0x0c, 0x6e, 0x9f, 0x08, 0x0c, 0xd2, 0xc3, 0x08, 0x0c, 0xb3, 0x06, + 0x08, 0x0c, 0xaa, 0xf1, 0x00, 0x0e, 0x08, 0x04, 0x98, 0x2d, 0x7e, 0x16, + 0x7e, 0x12, 0x00, 0xde, 0x00, 0xce, 0x00, 0x6e, 0x00, 0x0e, 0x00, 0x9e, + 0x00, 0x05, 0x60, 0x20, 0x90, 0x86, 0x00, 0x06, 0x11, 0x18, 0x08, 0x0c, + 0xeb, 0xd4, 0x0c, 0x50, 0x08, 0x0c, 0xbc, 0xb6, 0x60, 0x20, 0x90, 0x86, + 0x00, 0x02, 0x11, 0x50, 0x60, 0x04, 0x00, 0x06, 0x90, 0x86, 0x00, 0x85, + 0x00, 0x0e, 0x09, 0x90, 0x90, 0x86, 0x00, 0x8b, 0x09, 0x78, 0x08, 0xd0, + 0x60, 0x20, 0x90, 0x86, 0x00, 0x05, 0x19, 0xb0, 0x60, 0x04, 0x00, 0x06, + 0x90, 0x86, 0x00, 0x85, 0x00, 0x0e, 0x0d, 0x18, 0x90, 0x86, 0x00, 0x8b, + 0x0d, 0x00, 0x08, 0x60, 0x00, 0x06, 0x00, 0x66, 0x00, 0x96, 0x00, 0xb6, + 0x00, 0xc6, 0x00, 0xd6, 0x78, 0x18, 0x90, 0x5d, 0x09, 0x04, 0x99, 0x36, + 0xb8, 0x54, 0x00, 0x06, 0x90, 0x06, 0xb8, 0x56, 0xb8, 0x5a, 0xb8, 0x00, + 0xc0, 0xd4, 0xc0, 0xdc, 0xb8, 0x02, 0x08, 0x0c, 0x66, 0x4c, 0x09, 0x04, + 0x99, 0x33, 0x7e, 0x24, 0x86, 0xff, 0x09, 0x04, 0x99, 0x26, 0x96, 0x80, + 0x00, 0x05, 0x20, 0x04, 0x99, 0x06, 0x19, 0x04, 0x99, 0x26, 0x00, 0xd6, + 0x20, 0x69, 0x01, 0x00, 0x68, 0xc0, 0x90, 0x05, 0x09, 0x04, 0x99, 0x1d, + 0x08, 0x0c, 0x88, 0xc3, 0x08, 0x0c, 0xa6, 0xe9, 0x68, 0xc3, 0x00, 0x00, + 0x08, 0x0c, 0xac, 0x1b, 0x78, 0x27, 0x00, 0x00, 0x00, 0x36, 0x20, 0x69, + 0x01, 0x40, 0x6b, 0x04, 0x93, 0x84, 0x10, 0x00, 0x01, 0x38, 0x20, 0x01, + 0x01, 0x00, 0x08, 0x0c, 0x2d, 0x39, 0x90, 0x06, 0x08, 0x0c, 0x2d, 0x39, + 0x20, 0x69, 0x01, 0x00, 0x68, 0x24, 0xd0, 0x84, 0x01, 0x10, 0x68, 0x27, + 0x00, 0x01, 0x00, 0x3e, 0x00, 0xde, 0x00, 0xc6, 0x3e, 0x08, 0x91, 0x8e, + 0x00, 0x02, 0x11, 0x68, 0xb8, 0x00, 0xd0, 0xbc, 0x01, 0x50, 0x96, 0x80, + 0x00, 0x10, 0x20, 0x0c, 0x81, 0xff, 0x15, 0x18, 0x20, 0x09, 0x19, 0x88, + 0x21, 0x0c, 0x21, 0x02, 0x00, 0xf0, 0xb8, 0x3c, 0x90, 0x05, 0x01, 0x10, + 0x80, 0x01, 0xb8, 0x3e, 0x26, 0x60, 0x60, 0x0f, 0x00, 0x00, 0x08, 0x0c, + 0xb3, 0x06, 0x00, 0xce, 0x00, 0x48, 0x00, 0xde, 0x00, 0xc6, 0x26, 0x60, + 0x60, 0x03, 0x00, 0x09, 0x63, 0x0a, 0x00, 0xce, 0x08, 0x04, 0x98, 0xc9, + 0x89, 0xff, 0x01, 0x38, 0xa8, 0x67, 0x01, 0x03, 0xab, 0x7a, 0xa8, 0x77, + 0x00, 0x00, 0x08, 0x0c, 0x6e, 0x9f, 0x08, 0x0c, 0xaa, 0xf1, 0x08, 0x04, + 0x98, 0xc9, 0x00, 0x0e, 0x08, 0x04, 0x98, 0xbd, 0x78, 0x1e, 0x78, 0x1a, + 0x00, 0xde, 0x00, 0xce, 0x00, 0xbe, 0x00, 0x9e, 0x00, 0x6e, 0x00, 0x0e, + 0x00, 0x05, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0x96, 0x00, 0x66, 0xb8, 0x00, + 0xd0, 0xdc, 0x01, 0xa0, 0xb8, 0x4c, 0x90, 0x4d, 0x01, 0x88, 0xa8, 0x78, + 0x96, 0x06, 0x11, 0x70, 0x20, 0x71, 0x19, 0xe8, 0x70, 0x24, 0x90, 0x35, + 0x01, 0x48, 0x90, 0x80, 0x00, 0x05, 0x20, 0x04, 0x99, 0x06, 0x11, 0x20, + 0xb8, 0x00, 0xc0, 0xdc, 0xb8, 0x02, 0x00, 0x29, 0x00, 0x6e, 0x00, 0x9e, + 0x00, 0xde, 0x00, 0xee, 0x00, 0x05, 0x00, 0xf6, 0x20, 0x79, 0x01, 0x00, + 0x78, 0xc0, 0x90, 0x05, 0x11, 0x38, 0x00, 0xc6, 0x26, 0x60, 0x60, 0x03, + 0x00, 0x09, 0x63, 0x0a, 0x00, 0xce, 0x04, 0xb8, 0x08, 0x0c, 0xa6, 0xe9, + 0x78, 0xc3, 0x00, 0x00, 0x08, 0x0c, 0xac, 0x1b, 0x70, 0x27, 0x00, 0x00, + 0x00, 0x36, 0x20, 0x79, 0x01, 0x40, 0x7b, 0x04, 0x93, 0x84, 0x10, 0x00, + 0x01, 0x38, 0x20, 0x01, 0x01, 0x00, 0x08, 0x0c, 0x2d, 0x39, 0x90, 0x06, + 0x08, 0x0c, 0x2d, 0x39, 0x20, 0x79, 0x01, 0x00, 0x78, 0x24, 0xd0, 0x84, + 0x01, 0x10, 0x78, 0x27, 0x00, 0x01, 0x08, 0x0c, 0xac, 0x1b, 0x00, 0x3e, + 0x08, 0x0c, 0x66, 0x4c, 0x00, 0xc6, 0xb8, 0x3c, 0x90, 0x05, 0x01, 0x10, + 0x80, 0x01, 0xb8, 0x3e, 0x26, 0x60, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0xce, + 0xa8, 0x67, 0x01, 0x03, 0xab, 0x7a, 0xa8, 0x77, 0x00, 0x00, 0x08, 0x0c, + 0xd3, 0xce, 0x08, 0x0c, 0x6e, 0x9f, 0x08, 0x0c, 0xaa, 0xf1, 0x00, 0xfe, + 0x00, 0x05, 0x00, 0xb6, 0x00, 0xe6, 0x00, 0xc6, 0x20, 0x11, 0x01, 0x01, + 0x22, 0x04, 0xc0, 0xc4, 0x20, 0x12, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x14, + 0xc2, 0xe4, 0x22, 0x02, 0x20, 0x71, 0x19, 0xe8, 0x70, 0x04, 0x90, 0x84, + 0x00, 0x07, 0x00, 0x02, 0x99, 0xc2, 0x99, 0xc6, 0x99, 0xe4, 0x9a, 0x0d, + 0x9a, 0x4b, 0x99, 0xc2, 0x99, 0xdd, 0x99, 0xc0, 0x08, 0x0c, 0x0d, 0xc5, + 0x00, 0xce, 0x00, 0xee, 0x00, 0xbe, 0x00, 0x05, 0x70, 0x24, 0x90, 0x65, + 0x01, 0x48, 0x70, 0x20, 0x80, 0x01, 0x70, 0x22, 0x60, 0x0c, 0x90, 0x15, + 0x01, 0x58, 0x72, 0x16, 0x60, 0x0f, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, + 0x70, 0x27, 0x00, 0x00, 0x00, 0xce, 0x00, 0xee, 0x00, 0xbe, 0x00, 0x05, + 0x72, 0x16, 0x72, 0x12, 0x0c, 0xa8, 0x70, 0x07, 0x00, 0x00, 0x70, 0x27, + 0x00, 0x00, 0x70, 0x20, 0x90, 0x05, 0x00, 0x70, 0x60, 0x10, 0x20, 0x58, + 0x08, 0x0c, 0x66, 0x4c, 0xb8, 0x00, 0xc0, 0xdc, 0xb8, 0x02, 0x70, 0x07, + 0x00, 0x00, 0x70, 0x27, 0x00, 0x00, 0x70, 0x20, 0x80, 0x01, 0x70, 0x22, + 0x11, 0x48, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x14, 0xd2, 0xec, 0x11, 0x80, + 0x00, 0xce, 0x00, 0xee, 0x00, 0xbe, 0x00, 0x05, 0xb8, 0x54, 0x90, 0x15, + 0x01, 0x20, 0x72, 0x1e, 0x08, 0x0c, 0x9a, 0xb1, 0x0c, 0xa8, 0x72, 0x18, + 0x72, 0x1e, 0x08, 0x0c, 0x9a, 0xb1, 0x0c, 0x80, 0xc2, 0xec, 0x22, 0x02, + 0x08, 0x0c, 0x9b, 0xd3, 0x0c, 0x58, 0x70, 0x24, 0x90, 0x65, 0x05, 0xb8, + 0x70, 0x0c, 0x9c, 0x06, 0x11, 0x60, 0x08, 0x0c, 0xaa, 0xf1, 0x60, 0x0c, + 0x90, 0x15, 0x01, 0x20, 0x72, 0x0e, 0x60, 0x0f, 0x00, 0x00, 0x04, 0x48, + 0x72, 0x0e, 0x72, 0x0a, 0x04, 0x30, 0x70, 0x14, 0x9c, 0x06, 0x11, 0x60, + 0x08, 0x0c, 0xaa, 0xf1, 0x60, 0x0c, 0x90, 0x15, 0x01, 0x20, 0x72, 0x16, + 0x60, 0x0f, 0x00, 0x00, 0x00, 0xd0, 0x72, 0x16, 0x72, 0x12, 0x00, 0xb8, + 0x60, 0x20, 0x90, 0x86, 0x00, 0x03, 0x11, 0x98, 0x60, 0x10, 0x20, 0x58, + 0x08, 0x0c, 0x66, 0x4c, 0xb8, 0x00, 0xc0, 0xdc, 0xb8, 0x02, 0x08, 0x0c, + 0xaa, 0xf1, 0x70, 0x1c, 0x90, 0x65, 0x01, 0x38, 0xb8, 0x54, 0x90, 0x15, + 0x01, 0x10, 0x72, 0x1e, 0x00, 0x10, 0x72, 0x18, 0x72, 0x1e, 0x70, 0x27, + 0x00, 0x00, 0x00, 0xce, 0x00, 0xee, 0x00, 0xbe, 0x00, 0x05, 0x70, 0x24, + 0x90, 0x65, 0x01, 0x40, 0x08, 0x0c, 0xaa, 0xf1, 0x60, 0x0c, 0x90, 0x15, + 0x01, 0x58, 0x72, 0x0e, 0x60, 0x0f, 0x00, 0x00, 0x08, 0x0c, 0xac, 0x1b, + 0x70, 0x27, 0x00, 0x00, 0x00, 0xce, 0x00, 0xee, 0x00, 0xbe, 0x00, 0x05, + 0x72, 0x0e, 0x72, 0x0a, 0x0c, 0xa8, 0x00, 0xd6, 0x20, 0x69, 0x19, 0xe8, + 0x68, 0x30, 0x90, 0x84, 0x00, 0x03, 0x00, 0x02, 0x9a, 0x6e, 0x9a, 0x70, + 0x9a, 0x94, 0x9a, 0x6c, 0x08, 0x0c, 0x0d, 0xc5, 0x00, 0xde, 0x00, 0x05, + 0x00, 0xc6, 0x68, 0x40, 0x90, 0x86, 0x00, 0x01, 0x01, 0xb8, 0x68, 0x3c, + 0x90, 0x65, 0x01, 0x30, 0x60, 0x0c, 0x90, 0x15, 0x01, 0x70, 0x6a, 0x3a, + 0x60, 0x0f, 0x00, 0x00, 0x68, 0x33, 0x00, 0x00, 0x68, 0x3f, 0x00, 0x00, + 0x20, 0x11, 0x1a, 0x07, 0x20, 0x13, 0x00, 0x00, 0x00, 0xce, 0x00, 0xde, + 0x00, 0x05, 0x68, 0x3a, 0x68, 0x36, 0x0c, 0x90, 0x68, 0x43, 0x00, 0x00, + 0x68, 0x38, 0x90, 0x65, 0x0d, 0x68, 0x60, 0x03, 0x00, 0x03, 0x0c, 0x50, + 0x00, 0xc6, 0x90, 0x06, 0x68, 0x42, 0x68, 0x46, 0x68, 0x4a, 0x68, 0x3c, + 0x90, 0x65, 0x01, 0x60, 0x60, 0x0c, 0x90, 0x15, 0x01, 0x30, 0x6a, 0x3a, + 0x60, 0x0f, 0x00, 0x00, 0x68, 0x3f, 0x00, 0x00, 0x00, 0x18, 0x68, 0x3e, + 0x68, 0x3a, 0x68, 0x36, 0x00, 0xce, 0x00, 0xde, 0x00, 0x05, 0x20, 0x01, + 0x18, 0x0c, 0x20, 0x0c, 0xc1, 0xe5, 0x21, 0x02, 0x00, 0x05, 0x20, 0x01, + 0x18, 0x0c, 0x20, 0x0c, 0xd1, 0xec, 0x01, 0x20, 0xc1, 0xec, 0x21, 0x02, + 0x08, 0x0c, 0x9b, 0xd3, 0x20, 0x01, 0x19, 0xf4, 0x20, 0x04, 0x90, 0x86, + 0x00, 0x01, 0x0d, 0x58, 0x00, 0xd6, 0x20, 0x69, 0x19, 0xe8, 0x68, 0x04, + 0x90, 0x84, 0x00, 0x07, 0x00, 0x06, 0x90, 0x05, 0x11, 0xc8, 0x20, 0x01, + 0x18, 0x37, 0x20, 0x04, 0x90, 0x84, 0x00, 0x28, 0x11, 0x98, 0x20, 0x01, + 0x19, 0x7c, 0x20, 0x04, 0x90, 0x86, 0xaa, 0xaa, 0x01, 0x68, 0x20, 0x01, + 0x18, 0x8b, 0x20, 0x04, 0xd0, 0x8c, 0x11, 0x18, 0xd0, 0x84, 0x11, 0x18, + 0x00, 0x28, 0x08, 0x0c, 0x9b, 0xd3, 0x00, 0x0e, 0x00, 0xde, 0x00, 0x05, + 0x00, 0x0e, 0x00, 0x02, 0x9a, 0xee, 0x9b, 0xa7, 0x9b, 0xa7, 0x9b, 0xa7, + 0x9b, 0xa7, 0x9b, 0xa9, 0x9b, 0xa7, 0x9a, 0xec, 0x08, 0x0c, 0x0d, 0xc5, + 0x68, 0x20, 0x90, 0x05, 0x11, 0x10, 0x00, 0xde, 0x00, 0x05, 0x00, 0xc6, + 0x68, 0x0c, 0x90, 0x65, 0x01, 0xf0, 0x61, 0x04, 0x91, 0x8e, 0x00, 0x40, + 0x11, 0x80, 0x20, 0x09, 0x18, 0x37, 0x21, 0x0c, 0x91, 0x8c, 0x00, 0x28, + 0x11, 0x50, 0x08, 0x0c, 0x76, 0x37, 0x01, 0x38, 0x00, 0x06, 0x20, 0x09, + 0x18, 0x8b, 0x21, 0x04, 0xc0, 0x95, 0x20, 0x0a, 0x00, 0x0e, 0x68, 0x07, + 0x00, 0x04, 0x68, 0x26, 0x68, 0x2b, 0x00, 0x00, 0x08, 0x0c, 0x9c, 0x7c, + 0x00, 0xce, 0x00, 0xde, 0x00, 0x05, 0x68, 0x14, 0x90, 0x65, 0x01, 0x50, + 0x68, 0x07, 0x00, 0x01, 0x68, 0x26, 0x68, 0x2b, 0x00, 0x00, 0x08, 0x0c, + 0x9c, 0x7c, 0x00, 0xce, 0x00, 0xde, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xe6, + 0x6a, 0x1c, 0x92, 0xdd, 0x00, 0x00, 0x09, 0x04, 0x9b, 0x91, 0xb8, 0x4c, + 0x90, 0x0d, 0x01, 0x18, 0xb8, 0x88, 0x90, 0x05, 0x01, 0xa0, 0xb8, 0x54, + 0x90, 0x5d, 0x01, 0x20, 0x92, 0x0e, 0x09, 0x04, 0x9b, 0x91, 0x00, 0x28, + 0x68, 0x18, 0x92, 0x0e, 0x09, 0x04, 0x9b, 0x91, 0x20, 0x58, 0xb8, 0x4c, + 0x90, 0x0d, 0x0d, 0x88, 0xb8, 0x88, 0x90, 0x05, 0x1d, 0x70, 0x2b, 0x00, + 0x68, 0x1e, 0xbb, 0x3c, 0xb8, 0x38, 0x93, 0x02, 0x1e, 0x40, 0x08, 0x0c, + 0xb2, 0xaa, 0x09, 0x04, 0x9b, 0x91, 0x83, 0x18, 0xbb, 0x3e, 0x61, 0x16, + 0x2b, 0x10, 0x62, 0x12, 0x00, 0x96, 0x21, 0x48, 0xa8, 0x80, 0x90, 0x84, + 0x00, 0xff, 0x60, 0x5e, 0xa8, 0x83, 0x00, 0x00, 0xa8, 0x84, 0x00, 0x9e, + 0x90, 0x8a, 0x19, 0x9a, 0x02, 0x10, 0x20, 0x01, 0x19, 0x99, 0x80, 0x03, + 0x80, 0x1b, 0x83, 0x1b, 0x93, 0x18, 0x63, 0x1a, 0x61, 0x14, 0x00, 0x96, + 0x21, 0x48, 0xa9, 0x64, 0x00, 0x9e, 0x91, 0x8c, 0x00, 0xff, 0x91, 0x8e, + 0x00, 0x48, 0x05, 0x38, 0x00, 0xf6, 0x2c, 0x78, 0x20, 0x61, 0x01, 0x00, + 0xba, 0xc0, 0x62, 0x9a, 0x20, 0x69, 0x02, 0x00, 0x20, 0x71, 0x02, 0x40, + 0x08, 0x0c, 0xa2, 0x19, 0x20, 0x69, 0x19, 0xe8, 0xbb, 0x00, 0xc3, 0xdd, + 0xbb, 0x02, 0x68, 0x07, 0x00, 0x02, 0x2f, 0x18, 0x6b, 0x26, 0x68, 0x2b, + 0x00, 0x00, 0x78, 0x23, 0x00, 0x03, 0x78, 0x03, 0x00, 0x01, 0x78, 0x07, + 0x00, 0x40, 0x00, 0xfe, 0x00, 0xee, 0x00, 0xbe, 0x00, 0xce, 0x00, 0xde, + 0x00, 0x05, 0x00, 0xee, 0x00, 0xbe, 0x00, 0xce, 0x0c, 0xd0, 0x68, 0x07, + 0x00, 0x06, 0x2c, 0x18, 0x6b, 0x26, 0x68, 0x20, 0x80, 0x01, 0x68, 0x22, + 0x68, 0x2b, 0x00, 0x00, 0x08, 0x0c, 0x66, 0x4c, 0x08, 0x0c, 0xb0, 0xea, + 0x00, 0xee, 0x00, 0xbe, 0x00, 0xce, 0x00, 0xde, 0x00, 0x05, 0x00, 0xde, + 0x00, 0x05, 0x00, 0xc6, 0x68, 0x0c, 0x90, 0x65, 0x01, 0xd8, 0x61, 0x04, + 0x91, 0x8e, 0x00, 0x40, 0x11, 0x80, 0x20, 0x09, 0x18, 0x37, 0x21, 0x0c, + 0x91, 0x8c, 0x00, 0x28, 0x11, 0x50, 0x08, 0x0c, 0x76, 0x37, 0x01, 0x38, + 0x00, 0x06, 0x20, 0x09, 0x18, 0x8b, 0x21, 0x04, 0xc0, 0x95, 0x20, 0x0a, + 0x00, 0x0e, 0x68, 0x07, 0x00, 0x04, 0x68, 0x26, 0x68, 0x2b, 0x00, 0x00, + 0x08, 0x0c, 0x9c, 0x7c, 0x00, 0xce, 0x00, 0xde, 0x00, 0x05, 0x20, 0x01, + 0x18, 0x0c, 0x20, 0x14, 0xc2, 0xed, 0x22, 0x02, 0x00, 0xde, 0x00, 0xfe, + 0x00, 0x05, 0x00, 0xf6, 0x00, 0xd6, 0x20, 0x69, 0x19, 0xe8, 0x68, 0x30, + 0x90, 0x86, 0x00, 0x00, 0x15, 0x70, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x14, + 0xd2, 0xe4, 0x01, 0x30, 0xc2, 0xe4, 0x22, 0x02, 0x08, 0x0c, 0x9a, 0xc0, + 0x20, 0x69, 0x19, 0xe8, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x0c, 0xd1, 0xc4, + 0x15, 0x08, 0x68, 0x38, 0x90, 0x7d, 0x01, 0xd8, 0x6a, 0x04, 0x92, 0x96, + 0x00, 0x00, 0x19, 0x04, 0x9c, 0x70, 0x79, 0x20, 0x91, 0x8e, 0x00, 0x09, + 0x05, 0x68, 0x68, 0x33, 0x00, 0x01, 0x68, 0x3e, 0x68, 0x47, 0x00, 0x00, + 0x68, 0x4b, 0x00, 0x00, 0x01, 0x26, 0x00, 0xf6, 0x20, 0x91, 0x24, 0x00, + 0x00, 0x2e, 0x08, 0x0c, 0x1c, 0x79, 0x11, 0x58, 0x01, 0x2e, 0x08, 0x0c, + 0xa5, 0x46, 0x00, 0xde, 0x00, 0xfe, 0x00, 0x05, 0xc1, 0xc4, 0x21, 0x02, + 0x08, 0x0c, 0x76, 0xe4, 0x08, 0xd0, 0x01, 0x2e, 0x68, 0x43, 0x00, 0x00, + 0x78, 0x03, 0x00, 0x02, 0x78, 0x0c, 0x90, 0x15, 0x01, 0x40, 0x6a, 0x3a, + 0x78, 0x0f, 0x00, 0x00, 0x68, 0x33, 0x00, 0x00, 0x68, 0x3f, 0x00, 0x00, + 0x0c, 0x40, 0x68, 0x3a, 0x68, 0x36, 0x0c, 0xc0, 0x79, 0x08, 0xd1, 0xfc, + 0x11, 0x98, 0x68, 0x33, 0x00, 0x01, 0x68, 0x3e, 0x68, 0x47, 0x00, 0x00, + 0x68, 0x4b, 0x00, 0x00, 0x01, 0x26, 0x00, 0xf6, 0x20, 0x91, 0x24, 0x00, + 0x00, 0x2e, 0x08, 0x0c, 0x1c, 0x79, 0x19, 0xd8, 0x01, 0x2e, 0x08, 0x0c, + 0xa4, 0xc7, 0x08, 0x78, 0x20, 0x01, 0x18, 0x37, 0x20, 0x04, 0x90, 0x84, + 0x00, 0x28, 0x11, 0x88, 0x20, 0x01, 0x19, 0x7c, 0x20, 0x04, 0x90, 0x86, + 0xaa, 0xaa, 0x01, 0x58, 0x20, 0x01, 0x19, 0xe9, 0x20, 0x04, 0x90, 0x05, + 0x11, 0xf0, 0x20, 0x01, 0x18, 0x8b, 0x20, 0x0c, 0xc1, 0x85, 0xc1, 0x8c, + 0x21, 0x02, 0x2f, 0x00, 0x68, 0x33, 0x00, 0x01, 0x68, 0x3e, 0x68, 0x47, + 0x00, 0x00, 0x68, 0x4b, 0x00, 0x00, 0x01, 0x26, 0x00, 0xf6, 0x20, 0x91, + 0x24, 0x00, 0x00, 0x2e, 0x08, 0x0c, 0x1c, 0x79, 0x19, 0x04, 0x9c, 0x11, + 0x01, 0x2e, 0x6a, 0x3c, 0x22, 0x78, 0x08, 0x0c, 0xa4, 0x51, 0x08, 0x04, + 0x9c, 0x09, 0x20, 0x11, 0x18, 0x8b, 0x22, 0x04, 0xc0, 0x8d, 0x20, 0x12, + 0x08, 0x04, 0x9c, 0x09, 0x6a, 0x04, 0x92, 0x96, 0x00, 0x06, 0x19, 0x04, + 0x9b, 0xcb, 0x6a, 0x30, 0x92, 0x96, 0x00, 0x00, 0x09, 0x04, 0x9b, 0xf3, + 0x08, 0x04, 0x9b, 0xcb, 0x60, 0x20, 0x90, 0x84, 0x00, 0x0f, 0x00, 0x0b, + 0x00, 0x05, 0x9c, 0x90, 0x9c, 0x95, 0xa1, 0x49, 0xa1, 0xe2, 0x9c, 0x95, + 0xa1, 0x49, 0xa1, 0xe2, 0x9c, 0x90, 0x9c, 0x95, 0x9c, 0x90, 0x9c, 0x90, + 0x9c, 0x90, 0x9c, 0x90, 0x9c, 0x90, 0x9c, 0x90, 0x08, 0x0c, 0x99, 0xa5, + 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x05, 0x00, 0xb6, 0x01, 0x56, 0x01, 0x36, + 0x01, 0x46, 0x01, 0xc6, 0x01, 0xd6, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, + 0x00, 0xf6, 0x20, 0x69, 0x02, 0x00, 0x20, 0x71, 0x02, 0x40, 0x60, 0x04, + 0x90, 0x8a, 0x00, 0x53, 0x1a, 0x0c, 0x0d, 0xc5, 0x61, 0x10, 0x21, 0x58, + 0xb9, 0xc0, 0x2c, 0x78, 0x20, 0x61, 0x01, 0x00, 0x61, 0x9a, 0x90, 0x8a, + 0x00, 0x40, 0x1a, 0x04, 0x9d, 0x01, 0x00, 0x5b, 0x00, 0xfe, 0x00, 0xee, + 0x00, 0xde, 0x00, 0xce, 0x01, 0xde, 0x01, 0xce, 0x01, 0x4e, 0x01, 0x3e, + 0x01, 0x5e, 0x00, 0xbe, 0x00, 0x05, 0x9e, 0xaa, 0x9e, 0xe5, 0x9f, 0x0e, + 0x9f, 0xd8, 0x9f, 0xfa, 0xa0, 0x00, 0xa0, 0x0d, 0xa0, 0x15, 0xa0, 0x21, + 0xa0, 0x27, 0xa0, 0x38, 0xa0, 0x27, 0xa0, 0x90, 0xa0, 0x15, 0xa0, 0x9c, + 0xa0, 0xa2, 0xa0, 0x21, 0xa0, 0xa2, 0xa0, 0xae, 0x9c, 0xff, 0x9c, 0xff, + 0x9c, 0xff, 0x9c, 0xff, 0x9c, 0xff, 0x9c, 0xff, 0x9c, 0xff, 0x9c, 0xff, + 0x9c, 0xff, 0x9c, 0xff, 0x9c, 0xff, 0xa9, 0x00, 0xa9, 0x23, 0xa9, 0x34, + 0xa9, 0x54, 0xa9, 0x86, 0xa0, 0x0d, 0x9c, 0xff, 0xa0, 0x0d, 0xa0, 0x27, + 0x9c, 0xff, 0x9f, 0x0e, 0x9f, 0xd8, 0x9c, 0xff, 0xad, 0x12, 0xa0, 0x27, + 0x9c, 0xff, 0xad, 0x2e, 0xa0, 0x27, 0x9c, 0xff, 0xa0, 0x21, 0x9e, 0xa4, + 0x9d, 0x22, 0x9c, 0xff, 0xad, 0x4a, 0xad, 0xb7, 0xae, 0x92, 0x9c, 0xff, + 0xae, 0x9f, 0xa0, 0x0a, 0xae, 0xca, 0x9c, 0xff, 0xa9, 0x90, 0xae, 0xf7, + 0x9c, 0xff, 0x08, 0x0c, 0x0d, 0xc5, 0x21, 0x00, 0x00, 0x5b, 0x00, 0xfe, + 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x01, 0xde, 0x01, 0xce, 0x01, 0x4e, + 0x01, 0x3e, 0x01, 0x5e, 0x00, 0xbe, 0x00, 0x05, 0xaf, 0x92, 0xb0, 0x44, + 0x9d, 0x20, 0x9d, 0x5a, 0x9e, 0x06, 0x9e, 0x11, 0x9d, 0x20, 0xa0, 0x0d, + 0x9d, 0x20, 0x9e, 0x6b, 0x9e, 0x77, 0x9d, 0x75, 0x9d, 0x20, 0x9d, 0x90, + 0x9d, 0xc4, 0xb1, 0xb1, 0xb1, 0xf6, 0xa0, 0x27, 0x08, 0x0c, 0x0d, 0xc5, + 0x00, 0xd6, 0x00, 0x96, 0x08, 0x0c, 0xa0, 0xc1, 0x00, 0x26, 0x00, 0x36, + 0x78, 0x14, 0x20, 0x48, 0xa9, 0x58, 0xd1, 0xcc, 0x11, 0x38, 0x20, 0x09, + 0x24, 0x14, 0x20, 0x11, 0x00, 0x18, 0x20, 0x19, 0x00, 0x18, 0x00, 0x30, + 0x20, 0x09, 0x24, 0x10, 0x20, 0x11, 0x00, 0x14, 0x20, 0x19, 0x00, 0x14, + 0x71, 0x02, 0x72, 0x06, 0x70, 0x0b, 0x08, 0x00, 0xa8, 0x3c, 0x70, 0x0e, + 0xa8, 0x50, 0x70, 0x22, 0xa8, 0x54, 0x70, 0x26, 0x63, 0xc2, 0x08, 0x0c, + 0xa6, 0xbd, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x9e, 0x00, 0xde, 0x00, 0x05, + 0x78, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0xa0, 0x00, 0xbe, 0x08, 0x0c, + 0xb2, 0x3d, 0x11, 0x18, 0x90, 0x84, 0xff, 0x80, 0x01, 0x10, 0x90, 0x85, + 0x00, 0x01, 0x00, 0x05, 0x00, 0xd6, 0x00, 0x96, 0x08, 0x0c, 0xa0, 0xc1, + 0x70, 0x03, 0x05, 0x00, 0x78, 0x14, 0x20, 0x48, 0xa8, 0x74, 0x70, 0x0a, + 0xa8, 0x78, 0x70, 0x0e, 0xa8, 0x7c, 0x70, 0x12, 0xa8, 0x80, 0x70, 0x16, + 0xa8, 0x84, 0x70, 0x1a, 0xa8, 0x88, 0x70, 0x1e, 0x60, 0xc3, 0x00, 0x10, + 0x08, 0x0c, 0xa6, 0xbd, 0x00, 0x9e, 0x00, 0xde, 0x00, 0x05, 0x00, 0xd6, + 0x00, 0x96, 0x08, 0x0c, 0xa0, 0xc1, 0x70, 0x03, 0x05, 0x00, 0x78, 0x14, + 0x20, 0x48, 0xa8, 0xcc, 0x70, 0x0a, 0xa8, 0xd0, 0x70, 0x0e, 0xa8, 0xd4, + 0x70, 0x12, 0xa8, 0xd8, 0x70, 0x16, 0xa8, 0xdc, 0x70, 0x1a, 0xa8, 0xe0, + 0x70, 0x1e, 0x60, 0xc3, 0x00, 0x10, 0x08, 0x0c, 0xa6, 0xbd, 0x00, 0x9e, + 0x00, 0xde, 0x00, 0x05, 0x00, 0xd6, 0x00, 0x96, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0xa0, 0xc1, 0x20, 0xe9, 0x00, 0x00, 0x20, 0x01, + 0x19, 0xa4, 0x20, 0x03, 0x00, 0x00, 0x78, 0x14, 0x20, 0x48, 0xa8, 0x14, + 0x80, 0x03, 0x60, 0xc2, 0xa8, 0x30, 0x20, 0xa8, 0xa8, 0x60, 0x20, 0xe0, + 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x1b, 0x20, 0x98, 0x20, 0x01, 0x19, 0xa4, + 0x00, 0x16, 0x20, 0x0c, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x23, 0xee, + 0x08, 0x0c, 0xde, 0x7c, 0x90, 0x06, 0x08, 0x0c, 0x23, 0xee, 0x00, 0x1e, + 0xa8, 0x04, 0x90, 0x05, 0x01, 0x10, 0x20, 0x48, 0x0c, 0x28, 0x04, 0xd9, + 0x08, 0x0c, 0xa6, 0xbd, 0x01, 0x2e, 0x00, 0x9e, 0x00, 0xde, 0x00, 0x05, + 0x00, 0xd6, 0x00, 0x96, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, + 0xa1, 0x0c, 0x20, 0xe9, 0x00, 0x00, 0x20, 0x01, 0x19, 0xa4, 0x20, 0x03, + 0x00, 0x00, 0x78, 0x14, 0x20, 0x48, 0xa8, 0x6f, 0x02, 0x00, 0xa8, 0x73, + 0x00, 0x00, 0xa8, 0x14, 0x80, 0x03, 0x60, 0xc2, 0xa8, 0x30, 0x20, 0xa8, + 0xa8, 0x60, 0x20, 0xe0, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x1b, 0x20, 0x98, + 0x20, 0x01, 0x19, 0xa4, 0x00, 0x16, 0x20, 0x0c, 0x08, 0x0c, 0xde, 0x7c, + 0x00, 0x1e, 0xa8, 0x04, 0x90, 0x05, 0x01, 0x10, 0x20, 0x48, 0x0c, 0x60, + 0x00, 0x51, 0x78, 0x14, 0x20, 0x48, 0x08, 0x0c, 0x0f, 0xc0, 0x08, 0x0c, + 0xa6, 0xbd, 0x01, 0x2e, 0x00, 0x9e, 0x00, 0xde, 0x00, 0x05, 0x60, 0xc0, + 0x80, 0x04, 0x90, 0x84, 0x00, 0x03, 0x90, 0x05, 0x01, 0x30, 0x90, 0x82, + 0x00, 0x04, 0x20, 0xa3, 0x00, 0x00, 0x80, 0x00, 0x1d, 0xe0, 0x00, 0x05, + 0x08, 0x0c, 0xa0, 0xc1, 0x70, 0x03, 0x78, 0x00, 0x78, 0x08, 0x80, 0x07, + 0x70, 0x0a, 0x60, 0xc3, 0x00, 0x08, 0x08, 0x04, 0xa6, 0xbd, 0x00, 0xd6, + 0x00, 0xe6, 0x08, 0x0c, 0xa1, 0x0c, 0x78, 0x14, 0x90, 0x84, 0xff, 0x00, + 0x20, 0x73, 0x02, 0x00, 0x8e, 0x70, 0x8e, 0x70, 0x90, 0x96, 0xdf, 0x00, + 0x01, 0x38, 0x90, 0x96, 0xe0, 0x00, 0x01, 0x20, 0x20, 0x73, 0x00, 0x10, + 0x8e, 0x70, 0x00, 0x30, 0x90, 0x95, 0x00, 0x10, 0x22, 0x72, 0x8e, 0x70, + 0x20, 0x73, 0x00, 0x34, 0x8e, 0x70, 0x20, 0x69, 0x18, 0x05, 0x20, 0xa9, + 0x00, 0x04, 0x2d, 0x76, 0x8d, 0x68, 0x8e, 0x70, 0x1f, 0x04, 0x9e, 0x31, + 0x20, 0x69, 0x18, 0x01, 0x20, 0xa9, 0x00, 0x04, 0x2d, 0x76, 0x8d, 0x68, + 0x8e, 0x70, 0x1f, 0x04, 0x9e, 0x3a, 0x90, 0x96, 0xdf, 0x00, 0x01, 0x30, + 0x90, 0x96, 0xe0, 0x00, 0x01, 0x18, 0x60, 0xc3, 0x00, 0x18, 0x00, 0xf0, + 0x20, 0x69, 0x19, 0xb4, 0x90, 0x86, 0xdf, 0x00, 0x01, 0x10, 0x20, 0x69, + 0x19, 0xce, 0x20, 0xa9, 0x00, 0x1a, 0x9e, 0x86, 0x02, 0x60, 0x11, 0x48, + 0x00, 0xc6, 0x20, 0x61, 0x02, 0x00, 0x60, 0x10, 0x80, 0x00, 0x60, 0x12, + 0x00, 0xce, 0x20, 0x71, 0x02, 0x40, 0x2d, 0x04, 0x80, 0x07, 0x20, 0x72, + 0x8d, 0x68, 0x8e, 0x70, 0x1f, 0x04, 0x9e, 0x51, 0x60, 0xc3, 0x00, 0x4c, + 0x08, 0x0c, 0xa6, 0xbd, 0x00, 0xee, 0x00, 0xde, 0x00, 0x05, 0x08, 0x0c, + 0xa0, 0xc1, 0x70, 0x03, 0x63, 0x00, 0x70, 0x07, 0x00, 0x28, 0x78, 0x08, + 0x70, 0x0e, 0x60, 0xc3, 0x00, 0x08, 0x08, 0x04, 0xa6, 0xbd, 0x00, 0xd6, + 0x00, 0x26, 0x00, 0x16, 0x08, 0x0c, 0xa1, 0x0c, 0x70, 0x03, 0x02, 0x00, + 0x78, 0x14, 0x70, 0x0e, 0x00, 0xe6, 0x9e, 0xf0, 0x00, 0x04, 0x20, 0x09, + 0x00, 0x01, 0x20, 0x11, 0x00, 0x0c, 0x20, 0x69, 0x19, 0x24, 0x68, 0x10, + 0xd0, 0x84, 0x11, 0x48, 0x20, 0x73, 0x05, 0x00, 0x8e, 0x70, 0x20, 0x73, + 0x00, 0x00, 0x8e, 0x70, 0x81, 0x08, 0x92, 0x90, 0x00, 0x04, 0x20, 0x73, + 0x08, 0x00, 0x8e, 0x70, 0x20, 0x73, 0x00, 0x00, 0x00, 0xee, 0x72, 0x06, + 0x71, 0x0a, 0x62, 0xc2, 0x08, 0x0c, 0xa6, 0xbd, 0x00, 0x1e, 0x00, 0x2e, + 0x00, 0xde, 0x00, 0x05, 0x20, 0x01, 0x18, 0x18, 0x20, 0x04, 0x60, 0x9a, + 0x08, 0x04, 0xa6, 0xbd, 0x08, 0x0c, 0xa0, 0xc1, 0x70, 0x03, 0x52, 0x00, + 0x20, 0x69, 0x18, 0x47, 0x68, 0x04, 0xd0, 0x84, 0x01, 0x30, 0x68, 0x28, + 0x00, 0x16, 0x08, 0x0c, 0x28, 0xa6, 0x71, 0x0e, 0x00, 0x1e, 0x20, 0xa9, + 0x00, 0x04, 0x20, 0xe1, 0x00, 0x01, 0x20, 0x99, 0x18, 0x05, 0x20, 0xe9, + 0x00, 0x00, 0x20, 0xa1, 0x02, 0x50, 0x40, 0x03, 0x20, 0xa9, 0x00, 0x04, + 0x20, 0x99, 0x18, 0x01, 0x20, 0xa1, 0x02, 0x54, 0x40, 0x03, 0x08, 0x0c, + 0xb2, 0x3d, 0x11, 0x20, 0xb8, 0xa0, 0x90, 0x82, 0x00, 0x7f, 0x02, 0x48, + 0x20, 0x01, 0x18, 0x1f, 0x20, 0x04, 0x70, 0x32, 0x20, 0x01, 0x18, 0x20, + 0x20, 0x04, 0x70, 0x36, 0x00, 0x30, 0x20, 0x01, 0x18, 0x18, 0x20, 0x04, + 0x90, 0x84, 0x00, 0xff, 0x70, 0x36, 0x60, 0xc3, 0x00, 0x1c, 0x08, 0x04, + 0xa6, 0xbd, 0x08, 0x0c, 0xa0, 0xc1, 0x70, 0x03, 0x05, 0x00, 0x08, 0x0c, + 0xb2, 0x3d, 0x11, 0x20, 0xb8, 0xa0, 0x90, 0x82, 0x00, 0x7f, 0x02, 0x48, + 0x20, 0x01, 0x18, 0x1f, 0x20, 0x04, 0x70, 0x0a, 0x20, 0x01, 0x18, 0x20, + 0x20, 0x04, 0x70, 0x0e, 0x00, 0x30, 0x20, 0x01, 0x18, 0x18, 0x20, 0x04, + 0x90, 0x84, 0x00, 0xff, 0x70, 0x0e, 0x20, 0xa9, 0x00, 0x04, 0x20, 0xe1, + 0x00, 0x01, 0x20, 0x99, 0x18, 0x05, 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, + 0x02, 0x50, 0x40, 0x03, 0x60, 0xc3, 0x00, 0x10, 0x08, 0x04, 0xa6, 0xbd, + 0x08, 0x0c, 0xa0, 0xc1, 0x90, 0x06, 0x08, 0x0c, 0x6a, 0x6d, 0xb8, 0xa0, + 0x90, 0x86, 0x00, 0x7e, 0x11, 0x70, 0x20, 0x11, 0x02, 0x40, 0x20, 0x13, + 0x22, 0xff, 0x20, 0x11, 0x02, 0x41, 0x20, 0x13, 0xff, 0xfe, 0x70, 0x03, + 0x04, 0x00, 0x62, 0x0c, 0xc2, 0xb4, 0x62, 0x0e, 0x00, 0x58, 0x78, 0x14, + 0x00, 0x96, 0x90, 0x4d, 0x01, 0x20, 0x90, 0x06, 0xa8, 0x9a, 0xa8, 0xa6, + 0xa8, 0xaa, 0x00, 0x9e, 0x70, 0x03, 0x03, 0x00, 0xb8, 0xa0, 0x90, 0x86, + 0x00, 0x7e, 0x19, 0x04, 0x9f, 0x98, 0x00, 0xd6, 0x20, 0x69, 0x19, 0x6c, + 0x20, 0x01, 0x18, 0x37, 0x20, 0x04, 0xd0, 0xa4, 0x01, 0x88, 0x68, 0x00, + 0x70, 0x0a, 0x68, 0x08, 0x90, 0x84, 0x20, 0x00, 0x70, 0x12, 0x08, 0x0c, + 0xb2, 0x54, 0x68, 0x0c, 0x70, 0x16, 0x70, 0x1f, 0x27, 0x10, 0x68, 0x18, + 0x70, 0x22, 0x68, 0x1c, 0x70, 0x26, 0x04, 0x28, 0x68, 0x00, 0x70, 0x0a, + 0x68, 0x04, 0x70, 0x0e, 0x20, 0x09, 0x18, 0x0d, 0x21, 0x0c, 0xd1, 0x8c, + 0x01, 0x10, 0x20, 0x01, 0x00, 0x02, 0x00, 0xf6, 0x20, 0x79, 0x01, 0x00, + 0x08, 0x0c, 0x76, 0x37, 0x11, 0x28, 0x78, 0xe3, 0x00, 0x00, 0x08, 0x0c, + 0x28, 0xe7, 0x78, 0xe2, 0x00, 0xfe, 0x68, 0x08, 0x08, 0x0c, 0x76, 0x37, + 0x11, 0x18, 0x90, 0x84, 0x37, 0xff, 0x00, 0x10, 0x90, 0x84, 0x3f, 0xff, + 0x70, 0x12, 0x08, 0x0c, 0xb2, 0x54, 0x68, 0x0c, 0x70, 0x16, 0x00, 0xde, + 0x20, 0xa9, 0x00, 0x04, 0x20, 0xe1, 0x00, 0x01, 0x20, 0x99, 0x18, 0x05, + 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, 0x02, 0x56, 0x40, 0x03, 0x20, 0xa9, + 0x00, 0x04, 0x20, 0x99, 0x18, 0x01, 0x20, 0xa1, 0x02, 0x5a, 0x40, 0x03, + 0x00, 0xd6, 0x08, 0x0c, 0xaf, 0x79, 0x20, 0x69, 0x19, 0x74, 0x20, 0x71, + 0x02, 0x4e, 0x68, 0x00, 0xc0, 0xdd, 0x70, 0x02, 0x08, 0x0c, 0x57, 0xd9, + 0xd0, 0xe4, 0x01, 0x10, 0x68, 0x0c, 0x70, 0x0e, 0x00, 0xde, 0x04, 0xe0, + 0x20, 0x01, 0x18, 0x37, 0x20, 0x04, 0xd0, 0xa4, 0x01, 0xa8, 0x00, 0x16, + 0x20, 0x01, 0x18, 0x0d, 0x20, 0x04, 0xd0, 0x8c, 0x20, 0x09, 0x00, 0x02, + 0x11, 0x18, 0x20, 0x01, 0x19, 0x6d, 0x20, 0x0c, 0x60, 0xe0, 0x91, 0x06, + 0x01, 0x30, 0x21, 0x00, 0x60, 0xe3, 0x00, 0x00, 0x08, 0x0c, 0x28, 0xe7, + 0x61, 0xe2, 0x00, 0x1e, 0x20, 0xe1, 0x00, 0x01, 0x20, 0x99, 0x19, 0x6c, + 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, 0x02, 0x4e, 0x20, 0xa9, 0x00, 0x08, + 0x40, 0x03, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x99, 0x18, 0x05, 0x20, 0xa1, + 0x02, 0x56, 0x40, 0x03, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x99, 0x18, 0x01, + 0x20, 0xa1, 0x02, 0x5a, 0x40, 0x03, 0x08, 0x0c, 0xaf, 0x79, 0x20, 0xa1, + 0x02, 0x4e, 0x20, 0xa9, 0x00, 0x08, 0x20, 0x99, 0x19, 0x74, 0x40, 0x03, + 0x60, 0xc3, 0x00, 0x74, 0x08, 0x04, 0xa6, 0xbd, 0x08, 0x0c, 0xa0, 0xc1, + 0x70, 0x03, 0x20, 0x10, 0x70, 0x07, 0x00, 0x14, 0x70, 0x0b, 0x08, 0x00, + 0x70, 0x0f, 0x20, 0x00, 0x90, 0x06, 0x00, 0xf6, 0x20, 0x79, 0x18, 0x47, + 0x79, 0x04, 0x00, 0xfe, 0xd1, 0xac, 0x11, 0x10, 0x90, 0x85, 0x00, 0x20, + 0xd1, 0xa4, 0x01, 0x10, 0x90, 0x85, 0x00, 0x10, 0x90, 0x85, 0x00, 0x02, + 0x00, 0xd6, 0x08, 0x04, 0xa0, 0x71, 0x70, 0x26, 0x60, 0xc3, 0x00, 0x14, + 0x08, 0x04, 0xa6, 0xbd, 0x08, 0x0c, 0xa0, 0xc1, 0x70, 0x03, 0x50, 0x00, + 0x08, 0x04, 0x9f, 0x30, 0x08, 0x0c, 0xa0, 0xc1, 0x70, 0x03, 0x21, 0x10, + 0x70, 0x07, 0x00, 0x14, 0x60, 0xc3, 0x00, 0x14, 0x08, 0x04, 0xa6, 0xbd, + 0x08, 0x0c, 0xa1, 0x03, 0x00, 0x10, 0x08, 0x0c, 0xa1, 0x0c, 0x70, 0x03, + 0x02, 0x00, 0x60, 0xc3, 0x00, 0x04, 0x08, 0x04, 0xa6, 0xbd, 0x08, 0x0c, + 0xa1, 0x0c, 0x70, 0x03, 0x01, 0x00, 0x70, 0x0b, 0x00, 0x03, 0x70, 0x0f, + 0x2a, 0x00, 0x60, 0xc3, 0x00, 0x08, 0x08, 0x04, 0xa6, 0xbd, 0x08, 0x0c, + 0xa1, 0x0c, 0x70, 0x03, 0x02, 0x00, 0x08, 0x04, 0x9f, 0x30, 0x08, 0x0c, + 0xa1, 0x0c, 0x70, 0x03, 0x01, 0x00, 0x78, 0x2c, 0x90, 0x05, 0x01, 0x10, + 0x70, 0x0a, 0x00, 0x10, 0x70, 0x0b, 0x00, 0x03, 0x78, 0x14, 0x70, 0x0e, + 0x60, 0xc3, 0x00, 0x08, 0x08, 0x04, 0xa6, 0xbd, 0x00, 0xd6, 0x08, 0x0c, + 0xa1, 0x0c, 0x70, 0x03, 0x02, 0x10, 0x70, 0x07, 0x00, 0x14, 0x70, 0x0b, + 0x08, 0x00, 0xb8, 0x94, 0x90, 0x86, 0x00, 0x14, 0x11, 0x98, 0xb9, 0x9c, + 0x91, 0x84, 0x00, 0x30, 0x01, 0x90, 0xb9, 0x98, 0x91, 0x84, 0xc0, 0x00, + 0x11, 0x40, 0xd1, 0xec, 0x01, 0x18, 0x70, 0x0f, 0x21, 0x00, 0x00, 0x58, + 0x70, 0x0f, 0x01, 0x00, 0x00, 0x40, 0x70, 0x0f, 0x04, 0x00, 0x00, 0x28, + 0x70, 0x0f, 0x07, 0x00, 0x00, 0x10, 0x70, 0x0f, 0x08, 0x00, 0x00, 0xf6, + 0x20, 0x79, 0x18, 0x47, 0x79, 0x04, 0x00, 0xfe, 0xd1, 0xac, 0x11, 0x10, + 0x90, 0x85, 0x00, 0x20, 0xd1, 0xa4, 0x01, 0x10, 0x90, 0x85, 0x00, 0x10, + 0x20, 0x09, 0x18, 0x69, 0x21, 0x0c, 0xd1, 0x84, 0x11, 0x10, 0x90, 0x85, + 0x00, 0x02, 0x00, 0x26, 0x20, 0x09, 0x18, 0x67, 0x21, 0x0c, 0xd1, 0xe4, + 0x01, 0x50, 0xc0, 0xc5, 0xba, 0xcc, 0xd2, 0x8c, 0x11, 0x08, 0xc0, 0xcd, + 0x90, 0x94, 0x00, 0x30, 0x92, 0x96, 0x00, 0x10, 0x01, 0x40, 0xd1, 0xec, + 0x01, 0x30, 0x90, 0x94, 0x00, 0x30, 0x92, 0x96, 0x00, 0x10, 0x01, 0x08, + 0xc0, 0xbd, 0x00, 0x2e, 0x70, 0x26, 0x60, 0xc3, 0x00, 0x14, 0x00, 0xde, + 0x08, 0x04, 0xa6, 0xbd, 0x08, 0x0c, 0xa1, 0x0c, 0x70, 0x03, 0x02, 0x10, + 0x70, 0x07, 0x00, 0x14, 0x70, 0x0f, 0x01, 0x00, 0x60, 0xc3, 0x00, 0x14, + 0x08, 0x04, 0xa6, 0xbd, 0x08, 0x0c, 0xa1, 0x0c, 0x70, 0x03, 0x02, 0x00, + 0x08, 0x04, 0x9e, 0xae, 0x08, 0x0c, 0xa1, 0x0c, 0x70, 0x03, 0x01, 0x00, + 0x70, 0x0b, 0x00, 0x03, 0x70, 0x0f, 0x2a, 0x00, 0x60, 0xc3, 0x00, 0x08, + 0x08, 0x04, 0xa6, 0xbd, 0x08, 0x0c, 0xa1, 0x0c, 0x70, 0x03, 0x01, 0x00, + 0x70, 0x0b, 0x00, 0x0b, 0x60, 0xc3, 0x00, 0x08, 0x08, 0x04, 0xa6, 0xbd, + 0x00, 0x26, 0x00, 0xd6, 0x00, 0x36, 0x00, 0x46, 0x20, 0x19, 0x32, 0x00, + 0x20, 0x21, 0x08, 0x00, 0x00, 0x40, 0x00, 0x26, 0x00, 0xd6, 0x00, 0x36, + 0x00, 0x46, 0x20, 0x19, 0x22, 0x00, 0x20, 0x21, 0x01, 0x00, 0x08, 0x0c, + 0xaf, 0x8e, 0xb8, 0x10, 0x93, 0x05, 0x70, 0x02, 0xb8, 0x14, 0x70, 0x06, + 0x20, 0x69, 0x18, 0x00, 0x68, 0x7c, 0x70, 0x0a, 0x68, 0x80, 0x70, 0x0e, + 0x94, 0x85, 0x00, 0x29, 0x70, 0x12, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0xde, + 0x08, 0x0c, 0xa6, 0xab, 0x72, 0x1a, 0x9f, 0x95, 0x00, 0x00, 0x72, 0x22, + 0x70, 0x27, 0xff, 0xff, 0x20, 0x71, 0x02, 0x4c, 0x00, 0x2e, 0x00, 0x05, + 0x00, 0x26, 0x08, 0x0c, 0xaf, 0x8e, 0x70, 0x03, 0x02, 0xff, 0x70, 0x07, + 0xff, 0xfc, 0x00, 0xd6, 0x20, 0x69, 0x18, 0x00, 0x68, 0x7c, 0x70, 0x0a, + 0x68, 0x80, 0x70, 0x0e, 0x00, 0xde, 0x70, 0x13, 0x20, 0x29, 0x0c, 0x10, + 0x70, 0x03, 0x01, 0x00, 0x70, 0x07, 0x00, 0x00, 0x70, 0x0b, 0xfc, 0x02, + 0x70, 0x0f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x26, 0x00, 0xd6, 0x00, 0x36, + 0x00, 0x46, 0x20, 0x19, 0x33, 0x00, 0x20, 0x21, 0x08, 0x00, 0x00, 0x40, + 0x00, 0x26, 0x00, 0xd6, 0x00, 0x36, 0x00, 0x46, 0x20, 0x19, 0x23, 0x00, + 0x20, 0x21, 0x01, 0x00, 0x08, 0x0c, 0xaf, 0x8e, 0xb8, 0x10, 0x93, 0x05, + 0x70, 0x02, 0xb8, 0x14, 0x70, 0x06, 0x20, 0x69, 0x18, 0x00, 0xb8, 0x10, + 0x90, 0x05, 0x11, 0x40, 0xb8, 0x14, 0x90, 0x05, 0x11, 0x28, 0x70, 0x0b, + 0x00, 0xff, 0x70, 0x0f, 0xff, 0xfe, 0x00, 0x20, 0x68, 0x7c, 0x70, 0x0a, + 0x68, 0x80, 0x70, 0x0e, 0x00, 0x00, 0x94, 0x85, 0x00, 0x98, 0x70, 0x12, + 0x00, 0x4e, 0x00, 0x3e, 0x00, 0xde, 0x08, 0x0c, 0xa6, 0xab, 0x72, 0x1a, + 0x7a, 0x08, 0x72, 0x22, 0x2f, 0x10, 0x72, 0x26, 0x20, 0x71, 0x02, 0x4c, + 0x00, 0x2e, 0x00, 0x05, 0x08, 0x0c, 0xa6, 0xab, 0x72, 0x1a, 0x7a, 0x08, + 0x72, 0x22, 0x78, 0x14, 0x70, 0x26, 0x20, 0x71, 0x02, 0x4c, 0x00, 0x2e, + 0x00, 0x05, 0x00, 0xb6, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x00, 0xf6, + 0x20, 0x69, 0x02, 0x00, 0x20, 0x71, 0x02, 0x40, 0x60, 0x04, 0x90, 0x8a, + 0x00, 0x85, 0x0a, 0x0c, 0x0d, 0xc5, 0x90, 0x8a, 0x00, 0x92, 0x1a, 0x0c, + 0x0d, 0xc5, 0x61, 0x10, 0x21, 0x58, 0xb9, 0xc0, 0x2c, 0x78, 0x20, 0x61, + 0x01, 0x00, 0x61, 0x9a, 0x90, 0x82, 0x00, 0x85, 0x00, 0x33, 0x00, 0xfe, + 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x00, 0xbe, 0x00, 0x05, 0xa1, 0x7a, + 0xa1, 0x89, 0xa1, 0x94, 0xa1, 0x78, 0xa1, 0x78, 0xa1, 0x78, 0xa1, 0x7a, + 0xa1, 0x78, 0xa1, 0x78, 0xa1, 0x78, 0xa1, 0x78, 0xa1, 0x78, 0xa1, 0x78, + 0x08, 0x0c, 0x0d, 0xc5, 0x04, 0x11, 0x60, 0xc3, 0x00, 0x00, 0x00, 0x26, + 0x08, 0x0c, 0x2b, 0xce, 0x02, 0x28, 0x20, 0x11, 0x01, 0x01, 0x22, 0x04, + 0xc0, 0xc5, 0x20, 0x12, 0x00, 0x2e, 0x08, 0x04, 0xa6, 0xbd, 0x04, 0x31, + 0x78, 0x08, 0x70, 0x0a, 0x78, 0x14, 0x70, 0x0e, 0x70, 0x17, 0xff, 0xff, + 0x60, 0xc3, 0x00, 0x0c, 0x08, 0x04, 0xa6, 0xbd, 0x04, 0xa1, 0x70, 0x03, + 0x00, 0x03, 0x70, 0x07, 0x03, 0x00, 0x60, 0xc3, 0x00, 0x04, 0x08, 0x04, + 0xa6, 0xbd, 0x00, 0x26, 0x08, 0x0c, 0xaf, 0x8e, 0xb8, 0x10, 0x90, 0x85, + 0x81, 0x00, 0x70, 0x02, 0xb8, 0x14, 0x70, 0x06, 0x20, 0x69, 0x18, 0x00, + 0x68, 0x7c, 0x70, 0x0a, 0x68, 0x80, 0x70, 0x0e, 0x70, 0x13, 0x00, 0x09, + 0x08, 0x04, 0xa0, 0xdc, 0x00, 0x26, 0x08, 0x0c, 0xaf, 0x8e, 0xb8, 0x10, + 0x90, 0x85, 0x84, 0x00, 0x70, 0x02, 0xb8, 0x14, 0x70, 0x06, 0x20, 0x69, + 0x18, 0x00, 0x68, 0x7c, 0x70, 0x0a, 0x68, 0x80, 0x70, 0x0e, 0x20, 0x01, + 0x00, 0x99, 0x7a, 0x20, 0x92, 0x96, 0x00, 0x05, 0x01, 0x08, 0xc0, 0xbc, + 0x70, 0x12, 0x08, 0x04, 0xa1, 0x3e, 0x00, 0x26, 0x08, 0x0c, 0xaf, 0x8e, + 0xb8, 0x10, 0x90, 0x85, 0x85, 0x00, 0x70, 0x02, 0xb8, 0x14, 0x70, 0x06, + 0x20, 0x69, 0x18, 0x00, 0x68, 0x7c, 0x70, 0x0a, 0x68, 0x80, 0x70, 0x0e, + 0x20, 0x01, 0x00, 0x99, 0x7a, 0x20, 0x92, 0x96, 0x00, 0x05, 0x01, 0x08, + 0xc0, 0xbc, 0x70, 0x12, 0x08, 0x04, 0xa1, 0x3e, 0x00, 0xb6, 0x00, 0xc6, + 0x00, 0xd6, 0x00, 0xe6, 0x00, 0xf6, 0x2c, 0x78, 0x20, 0x69, 0x02, 0x00, + 0x20, 0x71, 0x02, 0x40, 0x78, 0x04, 0x90, 0x8a, 0x00, 0x40, 0x0a, 0x0c, + 0x0d, 0xc5, 0x90, 0x8a, 0x00, 0x54, 0x1a, 0x0c, 0x0d, 0xc5, 0x79, 0x10, + 0x21, 0x58, 0xb9, 0xc0, 0x20, 0x61, 0x01, 0x00, 0x61, 0x9a, 0x90, 0x82, + 0x00, 0x40, 0x00, 0x33, 0x00, 0xfe, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, + 0x00, 0xbe, 0x00, 0x05, 0xa2, 0x19, 0xa2, 0xe0, 0xa2, 0xb3, 0xa4, 0x02, + 0xa2, 0x17, 0xa2, 0x17, 0xa2, 0x17, 0xa2, 0x17, 0xa2, 0x17, 0xa2, 0x17, + 0xa2, 0x17, 0xaa, 0xd8, 0xaa, 0xdd, 0xaa, 0xe2, 0xaa, 0xe7, 0xa2, 0x17, + 0xae, 0xd6, 0xa2, 0x17, 0xaa, 0xd3, 0x08, 0x0c, 0x0d, 0xc5, 0x00, 0x96, + 0x78, 0x0b, 0xff, 0xff, 0x08, 0x0c, 0xa2, 0x84, 0x79, 0x14, 0x21, 0x48, + 0xa9, 0x78, 0x79, 0x56, 0xae, 0x64, 0x96, 0xb4, 0x00, 0xff, 0x96, 0x86, + 0x00, 0x08, 0x11, 0x48, 0xa8, 0xb4, 0x70, 0x32, 0xa8, 0xb8, 0x70, 0x36, + 0xa8, 0xbc, 0x70, 0x3a, 0xa8, 0xc0, 0x70, 0x3e, 0x00, 0x08, 0x71, 0x32, + 0xa9, 0x7c, 0x91, 0x84, 0x00, 0x0f, 0x11, 0x18, 0x20, 0x01, 0x00, 0x05, + 0x00, 0x40, 0xd1, 0x84, 0x01, 0x18, 0x20, 0x01, 0x00, 0x04, 0x00, 0x18, + 0x90, 0x84, 0x00, 0x06, 0x80, 0x04, 0x20, 0x10, 0x78, 0x5c, 0x90, 0x84, + 0x00, 0xff, 0x80, 0x07, 0x92, 0x05, 0x70, 0x42, 0xd1, 0xac, 0x01, 0x58, + 0x70, 0x47, 0x00, 0x02, 0x96, 0x86, 0x00, 0x08, 0x11, 0x18, 0x08, 0x0c, + 0x18, 0xf7, 0x00, 0x10, 0x08, 0x0c, 0x17, 0x68, 0x00, 0x50, 0xd1, 0xb4, + 0x01, 0x18, 0x70, 0x47, 0x00, 0x01, 0x00, 0x28, 0x70, 0x47, 0x00, 0x00, + 0x90, 0x16, 0x22, 0x30, 0x00, 0x10, 0xaa, 0xb0, 0xae, 0xac, 0x72, 0x6a, + 0x76, 0x6e, 0x20, 0xa9, 0x00, 0x08, 0x20, 0xe9, 0x00, 0x00, 0xa8, 0x60, + 0x20, 0xe0, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x23, 0x20, 0x98, 0x20, 0xa1, + 0x02, 0x52, 0x20, 0x69, 0x02, 0x00, 0x68, 0x13, 0x00, 0x18, 0x40, 0x03, + 0x68, 0x13, 0x00, 0x08, 0x60, 0xc3, 0x00, 0x20, 0x60, 0x17, 0x00, 0x09, + 0x20, 0x01, 0x1a, 0x04, 0x20, 0x03, 0x07, 0xd0, 0x20, 0x01, 0x1a, 0x03, + 0x20, 0x03, 0x00, 0x09, 0x00, 0x9e, 0x00, 0x05, 0x68, 0x13, 0x00, 0x08, + 0xba, 0x8c, 0x82, 0x10, 0xb8, 0xcc, 0xd0, 0x84, 0x01, 0x80, 0x20, 0x01, + 0x1a, 0xd0, 0x20, 0x0c, 0x81, 0x08, 0x21, 0x02, 0x20, 0x01, 0x1a, 0xcf, + 0x20, 0x1c, 0x12, 0x18, 0x83, 0x18, 0x23, 0x02, 0x0e, 0xa0, 0x79, 0x4a, + 0x71, 0x2e, 0x7b, 0x46, 0x73, 0x2a, 0x92, 0x94, 0x00, 0xff, 0xba, 0x8e, + 0x82, 0x17, 0x72, 0x1a, 0xba, 0x10, 0x92, 0x95, 0x06, 0x00, 0x72, 0x02, + 0xba, 0x14, 0x72, 0x06, 0x20, 0x69, 0x18, 0x00, 0x6a, 0x7c, 0x72, 0x0a, + 0x6a, 0x80, 0x72, 0x0e, 0x70, 0x13, 0x08, 0x29, 0x2f, 0x10, 0x72, 0x22, + 0x70, 0x27, 0xff, 0xff, 0x00, 0x05, 0x00, 0xd6, 0x00, 0x96, 0x00, 0x81, + 0x78, 0x14, 0x20, 0x48, 0xa8, 0x90, 0x70, 0x02, 0xa8, 0x8c, 0x70, 0x06, + 0xa8, 0xb0, 0x70, 0x0a, 0xa8, 0xac, 0x70, 0x0e, 0x60, 0xc3, 0x00, 0x0c, + 0x00, 0x9e, 0x00, 0xde, 0x08, 0x04, 0xa6, 0xbd, 0x68, 0x13, 0x00, 0x08, + 0xb8, 0x10, 0x90, 0x85, 0x05, 0x00, 0x70, 0x02, 0xb8, 0x14, 0x70, 0x06, + 0x20, 0x69, 0x18, 0x00, 0x68, 0x7c, 0x70, 0x0a, 0x68, 0x80, 0x70, 0x0e, + 0x70, 0x13, 0x08, 0x89, 0x08, 0x0c, 0xa6, 0xab, 0x72, 0x1a, 0x7a, 0x08, + 0x72, 0x22, 0x2f, 0x10, 0x72, 0x26, 0x20, 0x71, 0x02, 0x4c, 0x00, 0x05, + 0x00, 0xd6, 0x00, 0x96, 0x08, 0x0c, 0xa3, 0xe0, 0x78, 0x14, 0x20, 0x48, + 0x08, 0x0c, 0xd0, 0xd6, 0x11, 0x30, 0x78, 0x14, 0x90, 0x84, 0x07, 0x00, + 0x80, 0x07, 0x00, 0x33, 0x00, 0x10, 0x90, 0x06, 0x00, 0x1b, 0x00, 0x9e, + 0x00, 0xde, 0x00, 0x05, 0xa2, 0xfe, 0xa3, 0x67, 0xa3, 0x77, 0xa3, 0x9d, + 0xa3, 0xa9, 0xa3, 0xba, 0xa3, 0xc2, 0xa2, 0xfc, 0x08, 0x0c, 0x0d, 0xc5, + 0x00, 0x16, 0x00, 0x36, 0xa9, 0x7c, 0x91, 0x8c, 0x00, 0x03, 0x01, 0x18, + 0x91, 0x86, 0x00, 0x03, 0x11, 0x98, 0xab, 0xa8, 0x78, 0x24, 0xd0, 0xcc, + 0x11, 0x68, 0x73, 0x16, 0xa8, 0x98, 0x70, 0x1a, 0xa8, 0x94, 0x70, 0x1e, + 0x00, 0x3e, 0x00, 0x1e, 0x20, 0x01, 0x19, 0xb2, 0x20, 0x04, 0x60, 0xc2, + 0x08, 0x04, 0xa6, 0xbd, 0xc3, 0xe5, 0x0c, 0x88, 0x91, 0x86, 0x00, 0x01, + 0x19, 0x0c, 0x0d, 0xc5, 0xab, 0xa8, 0x78, 0x24, 0xd0, 0xcc, 0x19, 0x04, + 0xa3, 0x64, 0x73, 0x16, 0xa8, 0x98, 0x70, 0x1a, 0xa8, 0x94, 0x70, 0x1e, + 0xa8, 0xa4, 0x70, 0x26, 0xa8, 0xac, 0x70, 0x2e, 0x20, 0x09, 0x00, 0x18, + 0x93, 0x84, 0x03, 0x00, 0x05, 0x70, 0xd3, 0xc4, 0x01, 0x10, 0xa8, 0xac, + 0x91, 0x08, 0xd3, 0xcc, 0x01, 0x10, 0xa8, 0xa4, 0x91, 0x08, 0x68, 0x10, + 0x90, 0x85, 0x00, 0x10, 0x68, 0x12, 0x20, 0x11, 0x02, 0x58, 0x20, 0xe9, + 0x00, 0x00, 0x22, 0xa0, 0x01, 0x56, 0x20, 0xa9, 0x00, 0x08, 0xa8, 0x60, + 0x20, 0xe0, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x2c, 0x20, 0x98, 0x40, 0x03, + 0x68, 0x10, 0x80, 0x00, 0x68, 0x12, 0x20, 0x11, 0x02, 0x40, 0x22, 0xa0, + 0x20, 0xa9, 0x00, 0x05, 0x40, 0x03, 0x68, 0x10, 0xc0, 0xa4, 0x68, 0x12, + 0x01, 0x5e, 0x91, 0x84, 0x00, 0x03, 0x01, 0x18, 0x20, 0x19, 0x02, 0x45, + 0x20, 0x1a, 0x61, 0xc2, 0x00, 0x3e, 0x00, 0x1e, 0x08, 0x04, 0xa6, 0xbd, + 0xc3, 0xe5, 0x08, 0x04, 0xa3, 0x23, 0x20, 0x11, 0x00, 0x08, 0x20, 0x01, + 0x18, 0x0f, 0x20, 0x04, 0xd0, 0xa4, 0x01, 0x10, 0x20, 0x11, 0x00, 0x28, + 0x78, 0x24, 0xd0, 0xcc, 0x11, 0x10, 0x72, 0x16, 0x04, 0x70, 0x0c, 0xe8, + 0xc2, 0xe5, 0x20, 0x11, 0x03, 0x02, 0x00, 0x16, 0x78, 0x2c, 0x70, 0x1a, + 0x79, 0x30, 0x71, 0x1e, 0x91, 0x05, 0x01, 0x08, 0xc2, 0xdd, 0x00, 0x1e, + 0x78, 0x24, 0xd0, 0xcc, 0x01, 0x08, 0xc2, 0xe5, 0x72, 0x16, 0x70, 0x27, + 0x00, 0x12, 0x70, 0x2f, 0x00, 0x08, 0x70, 0x43, 0x70, 0x00, 0x70, 0x47, + 0x05, 0x00, 0x70, 0x4f, 0x00, 0x0a, 0x20, 0x69, 0x02, 0x00, 0x68, 0x13, + 0x00, 0x09, 0x20, 0x71, 0x02, 0x40, 0x70, 0x0b, 0x25, 0x00, 0x60, 0xc3, + 0x00, 0x32, 0x08, 0x04, 0xa6, 0xbd, 0x20, 0x11, 0x00, 0x28, 0x78, 0x24, + 0xd0, 0xcc, 0x11, 0x28, 0x72, 0x16, 0x60, 0xc3, 0x00, 0x18, 0x08, 0x04, + 0xa6, 0xbd, 0x0c, 0xd0, 0xc2, 0xe5, 0x20, 0x11, 0x01, 0x00, 0x78, 0x24, + 0xd0, 0xcc, 0x01, 0x08, 0xc2, 0xe5, 0x72, 0x16, 0x70, 0x2f, 0x00, 0x08, + 0x78, 0x58, 0x90, 0x84, 0x00, 0xff, 0x70, 0x36, 0x60, 0xc3, 0x00, 0x20, + 0x08, 0x04, 0xa6, 0xbd, 0x20, 0x11, 0x00, 0x08, 0x78, 0x24, 0xd0, 0xcc, + 0x01, 0x08, 0xc2, 0xe5, 0x72, 0x16, 0x0c, 0x08, 0x00, 0x36, 0x7b, 0x14, + 0x93, 0x84, 0xff, 0x00, 0x78, 0x16, 0x93, 0x84, 0x00, 0xff, 0x80, 0x01, + 0x11, 0x38, 0x78, 0x24, 0xd0, 0xcc, 0x01, 0x08, 0xc2, 0xe5, 0x72, 0x16, + 0x00, 0x3e, 0x08, 0x88, 0x00, 0x46, 0x20, 0x21, 0x08, 0x00, 0x00, 0x06, + 0x78, 0x24, 0xd0, 0xcc, 0x00, 0x0e, 0x01, 0x08, 0xc4, 0xe5, 0x74, 0x16, + 0x00, 0x4e, 0x70, 0x1e, 0x00, 0x3e, 0x08, 0x18, 0x00, 0xd6, 0x68, 0x13, + 0x00, 0x08, 0xb8, 0x10, 0x90, 0x85, 0x07, 0x00, 0x70, 0x02, 0xb8, 0x14, + 0x70, 0x06, 0x20, 0x69, 0x18, 0x00, 0x68, 0x7c, 0x70, 0x0a, 0x68, 0x80, + 0x70, 0x0e, 0x78, 0x24, 0xd0, 0xcc, 0x11, 0x68, 0x70, 0x13, 0x08, 0x98, + 0x08, 0x0c, 0xa6, 0xab, 0x72, 0x1a, 0x7a, 0x08, 0x72, 0x22, 0x2f, 0x10, + 0x72, 0x26, 0x20, 0x71, 0x02, 0x4c, 0x00, 0xde, 0x00, 0x05, 0x70, 0x13, + 0x08, 0x89, 0x0c, 0x90, 0x00, 0x16, 0x78, 0x14, 0x90, 0x84, 0x07, 0x00, + 0x80, 0x07, 0x00, 0x13, 0x00, 0x1e, 0x00, 0x05, 0xa4, 0x12, 0xa4, 0x12, + 0xa4, 0x14, 0xa4, 0x12, 0xa4, 0x12, 0xa4, 0x12, 0xa4, 0x2e, 0xa4, 0x12, + 0x08, 0x0c, 0x0d, 0xc5, 0x79, 0x14, 0x91, 0x8c, 0x08, 0xff, 0x91, 0x8d, + 0xf6, 0x00, 0x79, 0x16, 0x20, 0x09, 0x00, 0x03, 0x00, 0xb9, 0x20, 0x69, + 0x18, 0x47, 0x68, 0x04, 0xd0, 0xbc, 0x01, 0x30, 0x68, 0x2c, 0x90, 0x84, + 0x00, 0xff, 0x80, 0x07, 0x70, 0x32, 0x00, 0x10, 0x70, 0x33, 0x3f, 0x00, + 0x60, 0xc3, 0x00, 0x01, 0x08, 0x04, 0xa6, 0xbd, 0x20, 0x09, 0x00, 0x03, + 0x00, 0x19, 0x70, 0x33, 0x7f, 0x00, 0x0c, 0xb0, 0x00, 0x16, 0x08, 0x0c, + 0xaf, 0x8e, 0x00, 0x1e, 0xb8, 0x10, 0x90, 0x85, 0x01, 0x00, 0x70, 0x02, + 0xb8, 0x14, 0x70, 0x06, 0x20, 0x69, 0x18, 0x00, 0x6a, 0x7c, 0x72, 0x0a, + 0x6a, 0x80, 0x72, 0x0e, 0x70, 0x13, 0x08, 0x88, 0x91, 0x8d, 0x00, 0x08, + 0x71, 0x16, 0x08, 0x0c, 0xa6, 0xab, 0x72, 0x1a, 0x7a, 0x08, 0x72, 0x22, + 0x2f, 0x10, 0x72, 0x26, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xe6, 0x00, 0xd6, + 0x00, 0xc6, 0x00, 0x66, 0x00, 0x56, 0x00, 0x46, 0x00, 0x36, 0x20, 0x61, + 0x01, 0x00, 0x20, 0x71, 0x18, 0x00, 0x71, 0x60, 0x78, 0x10, 0x20, 0x58, + 0x76, 0xdc, 0x96, 0xb4, 0x00, 0x28, 0x01, 0x10, 0x73, 0x7c, 0x74, 0x80, + 0x25, 0x00, 0x76, 0xdc, 0x96, 0xb4, 0x00, 0x28, 0x01, 0x40, 0x20, 0x01, + 0x04, 0xff, 0x60, 0x62, 0x60, 0x67, 0xff, 0xff, 0x63, 0x6a, 0x64, 0x6e, + 0x00, 0x50, 0x20, 0x01, 0x00, 0xff, 0x90, 0x85, 0x04, 0x00, 0x60, 0x62, + 0x60, 0x67, 0xff, 0xff, 0x60, 0x6b, 0x00, 0x00, 0x61, 0x6e, 0xb8, 0xb8, + 0x60, 0x73, 0x05, 0x30, 0x60, 0x77, 0x00, 0x08, 0xb8, 0x8c, 0x80, 0x00, + 0x90, 0x84, 0x00, 0xff, 0xb8, 0x8e, 0x80, 0x07, 0x90, 0x85, 0x00, 0x20, + 0x60, 0x7a, 0x60, 0x7f, 0x00, 0x00, 0x2b, 0x00, 0x60, 0x82, 0x60, 0x87, + 0xff, 0xff, 0x78, 0x14, 0x00, 0x96, 0x20, 0x48, 0xa8, 0x38, 0x60, 0x8a, + 0xa8, 0x34, 0x60, 0x8e, 0xa8, 0x48, 0x60, 0xc6, 0xa8, 0x44, 0x60, 0xca, + 0x00, 0x9e, 0xb8, 0x6c, 0x60, 0xce, 0x60, 0xab, 0x00, 0x36, 0x60, 0xaf, + 0x95, 0xd5, 0x60, 0xd7, 0x00, 0x00, 0x20, 0x01, 0x18, 0x37, 0x20, 0x04, + 0x90, 0x84, 0x00, 0x28, 0x01, 0x28, 0x60, 0x9f, 0x00, 0x00, 0x20, 0x01, + 0x00, 0x92, 0x00, 0x48, 0x60, 0x28, 0xc0, 0xbd, 0x60, 0x2a, 0x60, 0x9f, + 0x00, 0xff, 0x60, 0x27, 0xff, 0xff, 0x20, 0x01, 0x00, 0xb2, 0x60, 0x16, + 0x20, 0x09, 0x07, 0xd0, 0x08, 0x0c, 0x88, 0xc8, 0x00, 0x3e, 0x00, 0x4e, + 0x00, 0x5e, 0x00, 0x6e, 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, 0x00, 0xbe, + 0x00, 0x05, 0x00, 0xb6, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, 0x00, 0x66, + 0x00, 0x56, 0x00, 0x46, 0x00, 0x36, 0x20, 0x61, 0x01, 0x00, 0x20, 0x71, + 0x18, 0x00, 0x71, 0x60, 0x78, 0x10, 0x20, 0x58, 0xb8, 0xa0, 0x20, 0x28, + 0x76, 0xdc, 0xd6, 0xac, 0x11, 0x68, 0x95, 0x82, 0x00, 0x7e, 0x12, 0x50, + 0x25, 0x00, 0x90, 0x94, 0xff, 0x80, 0x11, 0x30, 0x90, 0x80, 0x33, 0xb6, + 0x20, 0x15, 0x92, 0x94, 0x00, 0xff, 0x00, 0x20, 0xb9, 0x10, 0xba, 0x14, + 0x73, 0x7c, 0x74, 0x80, 0x70, 0xdc, 0xd0, 0xac, 0x11, 0x30, 0x95, 0x82, + 0x00, 0x7e, 0x12, 0x18, 0x95, 0x84, 0xff, 0x80, 0x01, 0x38, 0x91, 0x85, + 0x04, 0x00, 0x60, 0x62, 0x62, 0x66, 0x63, 0x6a, 0x64, 0x6e, 0x00, 0x30, + 0x60, 0x63, 0x04, 0x00, 0x62, 0x66, 0x60, 0x6b, 0x00, 0x00, 0x61, 0x6e, + 0xb8, 0xb8, 0x60, 0x72, 0x60, 0x77, 0x00, 0x00, 0xb8, 0x64, 0xd0, 0xa4, + 0x01, 0x10, 0x60, 0x77, 0x00, 0x08, 0xb8, 0x8c, 0x80, 0x00, 0x90, 0x84, + 0x00, 0xff, 0xb8, 0x8e, 0x80, 0x07, 0x90, 0x85, 0x00, 0x20, 0x60, 0x7a, + 0x60, 0x7f, 0x00, 0x00, 0x2b, 0x00, 0x60, 0x82, 0x60, 0x87, 0xff, 0xff, + 0x78, 0x14, 0x00, 0x96, 0x20, 0x48, 0xa8, 0x38, 0x60, 0x8a, 0xa8, 0x34, + 0x60, 0x8e, 0xa8, 0x48, 0x60, 0xc6, 0xa8, 0x44, 0x60, 0xca, 0x00, 0x9e, + 0xb8, 0x6c, 0x60, 0xce, 0x60, 0xab, 0x00, 0x36, 0x60, 0xaf, 0x95, 0xd5, + 0x60, 0xd7, 0x00, 0x00, 0xba, 0xc0, 0x62, 0x9e, 0x00, 0xf6, 0x20, 0x79, + 0x01, 0x40, 0x78, 0x03, 0x00, 0x00, 0x00, 0xfe, 0x20, 0x09, 0x00, 0x92, + 0x61, 0x16, 0x20, 0x09, 0x07, 0xd0, 0x08, 0x0c, 0x88, 0xc8, 0x00, 0x3e, + 0x00, 0x4e, 0x00, 0x5e, 0x00, 0x6e, 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, + 0x00, 0xbe, 0x00, 0x05, 0x00, 0xb6, 0x00, 0x96, 0x00, 0xe6, 0x00, 0xd6, + 0x00, 0xc6, 0x00, 0x56, 0x00, 0x46, 0x00, 0x36, 0x20, 0x61, 0x01, 0x00, + 0x20, 0x71, 0x18, 0x00, 0x78, 0x10, 0x20, 0x58, 0xb8, 0xa0, 0x20, 0x28, + 0xb9, 0x10, 0xba, 0x14, 0x73, 0x7c, 0x74, 0x80, 0x78, 0x20, 0x90, 0xbe, + 0x00, 0x06, 0x09, 0x04, 0xa6, 0x1a, 0x90, 0xbe, 0x00, 0x0a, 0x19, 0x04, + 0xa5, 0xd6, 0xb8, 0xc0, 0x60, 0x9e, 0x78, 0x14, 0x20, 0x48, 0xa8, 0x7c, + 0xd0, 0xfc, 0x05, 0x58, 0xaf, 0x90, 0x97, 0x84, 0xff, 0x00, 0x91, 0x05, + 0x60, 0x62, 0x87, 0x3f, 0x97, 0x84, 0xff, 0x00, 0x00, 0x06, 0x78, 0x14, + 0x20, 0x48, 0xa8, 0x78, 0xc0, 0xfc, 0x90, 0x05, 0x00, 0x0e, 0x11, 0x60, + 0xaf, 0x94, 0x87, 0xff, 0x01, 0x98, 0x20, 0x39, 0x00, 0x98, 0x97, 0x05, + 0x60, 0x72, 0x78, 0x08, 0x60, 0x82, 0x2f, 0x00, 0x60, 0x86, 0x00, 0x38, + 0x91, 0x85, 0x22, 0x00, 0x60, 0x62, 0x60, 0x73, 0x01, 0x29, 0x60, 0x77, + 0x00, 0x00, 0xb8, 0xc0, 0x60, 0x9e, 0x00, 0x50, 0x20, 0x39, 0x00, 0x29, + 0x97, 0x05, 0x60, 0x72, 0x0c, 0xc0, 0x91, 0x85, 0x02, 0x00, 0x60, 0x62, + 0x60, 0x73, 0x20, 0x29, 0xa8, 0x7c, 0xd0, 0xfc, 0x01, 0x18, 0xaf, 0x94, + 0x87, 0xff, 0x11, 0x20, 0x2f, 0x00, 0x60, 0x82, 0x78, 0x08, 0x60, 0x86, + 0x62, 0x66, 0x63, 0x6a, 0x64, 0x6e, 0x60, 0x77, 0x00, 0x00, 0xb8, 0x8c, + 0x80, 0x00, 0x90, 0x84, 0x00, 0xff, 0xb8, 0x8e, 0x80, 0x07, 0x60, 0x7a, + 0x60, 0x7f, 0x00, 0x00, 0xa8, 0x38, 0x60, 0x8a, 0xa8, 0x34, 0x60, 0x8e, + 0xa8, 0x48, 0x60, 0xc6, 0xa8, 0x44, 0x60, 0xca, 0xb8, 0x6c, 0x60, 0xce, + 0x60, 0xaf, 0x95, 0xd5, 0x60, 0xd7, 0x00, 0x00, 0x08, 0x0c, 0xaf, 0x73, + 0x20, 0x09, 0x07, 0xd0, 0x60, 0xc4, 0x90, 0x84, 0xff, 0xf0, 0x90, 0x05, + 0x01, 0x10, 0x20, 0x09, 0x1b, 0x58, 0x08, 0x0c, 0x88, 0xc8, 0x00, 0x3e, + 0x00, 0x4e, 0x00, 0x5e, 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, 0x00, 0x9e, + 0x00, 0xbe, 0x00, 0x05, 0x78, 0x04, 0x90, 0x86, 0x00, 0x40, 0x09, 0x04, + 0xa6, 0x56, 0x91, 0x85, 0x01, 0x00, 0x60, 0x62, 0x62, 0x66, 0x63, 0x6a, + 0x64, 0x6e, 0x60, 0x73, 0x08, 0x09, 0x60, 0x77, 0x00, 0x08, 0x60, 0xaf, + 0x95, 0xd5, 0x60, 0xd7, 0x00, 0x00, 0xb8, 0x8c, 0x80, 0x00, 0x90, 0x84, + 0x00, 0xff, 0xb8, 0x8e, 0x80, 0x07, 0x60, 0x7a, 0x60, 0x7f, 0x00, 0x00, + 0x2f, 0x00, 0x60, 0x82, 0x78, 0x08, 0x60, 0x86, 0x78, 0x14, 0x20, 0x48, + 0xa8, 0x38, 0x60, 0x8a, 0xa8, 0x34, 0x60, 0x8e, 0xa8, 0x48, 0x60, 0xc6, + 0xa8, 0x44, 0x60, 0xca, 0xb8, 0x6c, 0x60, 0xce, 0xba, 0xc0, 0x62, 0x9e, + 0x08, 0x0c, 0xaf, 0x73, 0x20, 0x09, 0x07, 0xd0, 0x60, 0xc4, 0x90, 0x84, + 0xff, 0xf0, 0x90, 0x05, 0x01, 0x10, 0x20, 0x09, 0x1b, 0x58, 0x08, 0x0c, + 0x88, 0xc8, 0x00, 0x3e, 0x00, 0x4e, 0x00, 0x5e, 0x00, 0xce, 0x00, 0xde, + 0x00, 0xee, 0x00, 0x9e, 0x00, 0xbe, 0x00, 0x05, 0x78, 0x14, 0x20, 0x48, + 0xa8, 0x7c, 0x90, 0x84, 0x00, 0x03, 0x90, 0x86, 0x00, 0x02, 0x09, 0x04, + 0xa6, 0x72, 0x91, 0x85, 0x01, 0x00, 0x60, 0x62, 0x62, 0x66, 0x63, 0x6a, + 0x64, 0x6e, 0x60, 0x73, 0x08, 0x80, 0x60, 0x77, 0x00, 0x08, 0xb8, 0x8c, + 0x80, 0x00, 0x90, 0x84, 0x00, 0xff, 0xb8, 0x8e, 0x80, 0x07, 0x60, 0x7a, + 0x78, 0x38, 0x60, 0x7e, 0x2f, 0x00, 0x60, 0x86, 0x78, 0x08, 0x60, 0x82, + 0xa8, 0x90, 0x60, 0x8a, 0xa8, 0x8c, 0x60, 0x8e, 0xa8, 0xb0, 0x60, 0xc6, + 0xa8, 0xac, 0x60, 0xca, 0xa8, 0xac, 0x79, 0x30, 0x91, 0x08, 0x79, 0x32, + 0xa8, 0xb0, 0x79, 0x2c, 0x91, 0x09, 0x79, 0x2e, 0xb8, 0x6c, 0x60, 0xce, + 0x60, 0xaf, 0x95, 0xd5, 0x60, 0xd7, 0x00, 0x00, 0xba, 0xc0, 0x62, 0x9e, + 0x08, 0x0c, 0xaf, 0x50, 0x08, 0x04, 0xa6, 0x06, 0xb8, 0xcc, 0xd0, 0x84, + 0x01, 0x48, 0xb8, 0x8c, 0x78, 0x14, 0x20, 0x48, 0xb8, 0x8c, 0x78, 0x4a, + 0xa8, 0x36, 0x29, 0x00, 0xa8, 0x3a, 0xb0, 0x46, 0x91, 0x85, 0x06, 0x00, + 0x60, 0x62, 0x62, 0x66, 0x63, 0x6a, 0x64, 0x6e, 0x60, 0x73, 0x08, 0x29, + 0x60, 0x77, 0x00, 0x00, 0x60, 0xaf, 0x95, 0x75, 0x60, 0xd7, 0x00, 0x00, + 0x08, 0x04, 0xa5, 0xe9, 0x91, 0x85, 0x07, 0x00, 0x60, 0x62, 0x62, 0x66, + 0x63, 0x6a, 0x64, 0x6e, 0x78, 0x24, 0xd0, 0xcc, 0x78, 0x26, 0x01, 0x18, + 0x60, 0x73, 0x08, 0x89, 0x00, 0x10, 0x60, 0x73, 0x08, 0x98, 0x60, 0x77, + 0x00, 0x00, 0xb8, 0x8c, 0x80, 0x00, 0x90, 0x84, 0x00, 0xff, 0xb8, 0x8e, + 0x80, 0x07, 0x60, 0x7a, 0x60, 0x7f, 0x00, 0x00, 0x2f, 0x00, 0x60, 0x86, + 0x78, 0x08, 0x60, 0x82, 0xa8, 0x38, 0x60, 0x8a, 0xa8, 0x34, 0x60, 0x8e, + 0xa8, 0x48, 0x60, 0xc6, 0xa8, 0x44, 0x60, 0xca, 0xb8, 0x6c, 0x60, 0xce, + 0x60, 0xaf, 0x95, 0xd5, 0x60, 0xd7, 0x00, 0x00, 0xba, 0xc0, 0x62, 0x9e, + 0x78, 0x24, 0xd0, 0xcc, 0x01, 0x20, 0x08, 0x0c, 0xaf, 0x73, 0x08, 0x04, + 0xa6, 0x06, 0x08, 0x0c, 0xaf, 0x50, 0x08, 0x04, 0xa6, 0x06, 0x7a, 0x10, + 0x00, 0xb6, 0x22, 0x58, 0xba, 0x8c, 0x82, 0x10, 0x92, 0x94, 0x00, 0xff, + 0xba, 0x8e, 0x00, 0xbe, 0x82, 0x17, 0x00, 0x05, 0x00, 0xd6, 0x20, 0x69, + 0x19, 0xe8, 0x68, 0x43, 0x00, 0x01, 0x00, 0xde, 0x00, 0x05, 0x60, 0xa3, + 0x00, 0x56, 0x60, 0xa7, 0x95, 0x75, 0x00, 0xf1, 0x08, 0x0c, 0x88, 0xba, + 0x00, 0x05, 0x00, 0x16, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x0c, 0x91, 0x84, + 0x06, 0x00, 0x90, 0x86, 0x06, 0x00, 0x01, 0x28, 0x00, 0x89, 0x08, 0x0c, + 0x88, 0xba, 0x00, 0x1e, 0x00, 0x05, 0xc1, 0xe5, 0x20, 0x01, 0x18, 0x0c, + 0x21, 0x02, 0x20, 0x01, 0x19, 0xe9, 0x20, 0x03, 0x00, 0x00, 0x20, 0x01, + 0x19, 0xf1, 0x20, 0x03, 0x00, 0x00, 0x0c, 0x88, 0x00, 0x06, 0x60, 0x14, + 0x90, 0x84, 0x18, 0x04, 0x90, 0x85, 0x00, 0x09, 0x60, 0x16, 0x00, 0x0e, + 0x00, 0x05, 0x00, 0x16, 0x00, 0xc6, 0x00, 0x06, 0x20, 0x61, 0x01, 0x00, + 0x61, 0xa4, 0x60, 0xa7, 0x95, 0xf5, 0x60, 0x14, 0x90, 0x84, 0x18, 0x04, + 0x90, 0x85, 0x00, 0x08, 0x60, 0x16, 0x00, 0x0e, 0xa0, 0x01, 0xa0, 0x01, + 0xa0, 0x01, 0x61, 0xa6, 0x00, 0xce, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xc6, + 0x00, 0xd6, 0x00, 0x16, 0x00, 0x26, 0x20, 0x61, 0x01, 0x00, 0x20, 0x69, + 0x01, 0x40, 0x08, 0x0c, 0x76, 0x37, 0x11, 0xc0, 0x20, 0x01, 0x1a, 0x04, + 0x20, 0x04, 0x90, 0x05, 0x15, 0xd0, 0x08, 0x0c, 0x76, 0xe4, 0x11, 0x60, + 0x20, 0x61, 0x01, 0x00, 0x60, 0x20, 0xd0, 0xb4, 0x11, 0x20, 0x60, 0x24, + 0xd0, 0x84, 0x09, 0x0c, 0x0d, 0xc5, 0x08, 0x0c, 0x88, 0xba, 0x04, 0x58, + 0x00, 0xc6, 0x20, 0x61, 0x19, 0xe8, 0x00, 0xc8, 0x69, 0x04, 0x91, 0x94, + 0x40, 0x00, 0x05, 0x40, 0x08, 0x11, 0x08, 0x0c, 0x2d, 0x49, 0x00, 0xc6, + 0x20, 0x61, 0x19, 0xe8, 0x61, 0x28, 0x91, 0x92, 0x00, 0x08, 0x12, 0x58, + 0x81, 0x08, 0x61, 0x2a, 0x61, 0x24, 0x00, 0xce, 0x81, 0xff, 0x01, 0x98, + 0x08, 0x0c, 0x88, 0xba, 0x08, 0x0c, 0xa6, 0xe0, 0x00, 0x70, 0x61, 0x24, + 0x91, 0xe5, 0x00, 0x00, 0x01, 0x40, 0x08, 0x0c, 0xf0, 0x94, 0x08, 0x0c, + 0x88, 0xc3, 0x20, 0x09, 0x00, 0x14, 0x08, 0x0c, 0xb3, 0x52, 0x00, 0xce, + 0x00, 0x00, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0xde, 0x00, 0xce, 0x00, 0x05, + 0x20, 0x01, 0x1a, 0x04, 0x20, 0x04, 0x90, 0x05, 0x1d, 0xb0, 0x00, 0xc6, + 0x20, 0x61, 0x19, 0xe8, 0x61, 0x28, 0x91, 0x92, 0x00, 0x03, 0x1e, 0x08, + 0x81, 0x08, 0x61, 0x2a, 0x00, 0xce, 0x08, 0x0c, 0x88, 0xba, 0x08, 0x0c, + 0x5f, 0xed, 0x20, 0x09, 0x18, 0x46, 0x21, 0x14, 0x82, 0x10, 0x22, 0x0a, + 0x0c, 0x10, 0x00, 0x96, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x00, 0x16, + 0x00, 0x26, 0x08, 0x0c, 0x88, 0xd0, 0x20, 0x71, 0x19, 0xe8, 0x71, 0x3c, + 0x81, 0xff, 0x09, 0x04, 0xa7, 0xe9, 0x20, 0x61, 0x01, 0x00, 0x20, 0x69, + 0x01, 0x40, 0x08, 0x0c, 0x76, 0x37, 0x11, 0xe0, 0x00, 0x36, 0x20, 0x19, + 0x00, 0x02, 0x08, 0x0c, 0xaa, 0x49, 0x00, 0x3e, 0x71, 0x3c, 0x21, 0x60, + 0x08, 0x0c, 0xf0, 0x94, 0x20, 0x09, 0x00, 0x4a, 0x62, 0x20, 0x92, 0x96, + 0x00, 0x09, 0x11, 0x30, 0x61, 0x14, 0x21, 0x48, 0xa8, 0x7b, 0x00, 0x06, + 0x20, 0x09, 0x00, 0x4a, 0x08, 0x0c, 0xb3, 0x52, 0x08, 0x0c, 0x76, 0xe4, + 0x08, 0x04, 0xa7, 0xe9, 0x08, 0x0c, 0xa7, 0xf5, 0x09, 0x04, 0xa7, 0xe9, + 0x69, 0x04, 0xd1, 0xf4, 0x09, 0x04, 0xa7, 0xf0, 0x08, 0x0c, 0x2d, 0x49, + 0x00, 0xc6, 0x70, 0x3c, 0x90, 0x65, 0x09, 0x0c, 0x0d, 0xc5, 0x60, 0x20, + 0x00, 0xce, 0x90, 0x86, 0x00, 0x06, 0x15, 0x28, 0x61, 0xc8, 0x60, 0xc4, + 0x91, 0x05, 0x15, 0x08, 0x20, 0x09, 0x18, 0x0c, 0x21, 0x04, 0xd0, 0xd4, + 0x01, 0xe0, 0x62, 0x14, 0x92, 0x94, 0x18, 0x00, 0x11, 0x28, 0x62, 0x24, + 0x92, 0x94, 0x00, 0x02, 0x15, 0x60, 0x00, 0x30, 0xc0, 0xd4, 0x20, 0x0a, + 0xd0, 0xcc, 0x01, 0x10, 0x08, 0x0c, 0x2c, 0x7b, 0x60, 0x14, 0x90, 0x84, + 0xe7, 0xfd, 0x90, 0x85, 0x00, 0x10, 0x60, 0x16, 0x70, 0x3c, 0x20, 0x60, + 0x20, 0x09, 0x00, 0x49, 0x08, 0x0c, 0xb3, 0x52, 0x00, 0xc0, 0x00, 0x36, + 0x20, 0x19, 0x00, 0x01, 0x08, 0x0c, 0xaa, 0x49, 0x00, 0x3e, 0x71, 0x3c, + 0x21, 0x60, 0x08, 0x0c, 0xf0, 0x94, 0x20, 0x09, 0x00, 0x4a, 0x62, 0x20, + 0x92, 0x96, 0x00, 0x09, 0x11, 0x30, 0x61, 0x14, 0x21, 0x48, 0xa8, 0x7b, + 0x00, 0x06, 0x20, 0x09, 0x00, 0x4a, 0x08, 0x0c, 0xb3, 0x52, 0x00, 0x2e, + 0x00, 0x1e, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x00, 0x9e, 0x00, 0x05, + 0xd1, 0xec, 0x19, 0x04, 0xa7, 0xa0, 0x08, 0x04, 0xa7, 0xa2, 0x00, 0xd6, + 0x00, 0xc6, 0x00, 0x96, 0x70, 0x3c, 0x90, 0x65, 0x09, 0x0c, 0x0d, 0xc5, + 0x20, 0x01, 0x03, 0x06, 0x20, 0x0c, 0x91, 0x84, 0x00, 0x30, 0x09, 0x04, + 0xa8, 0xa8, 0x91, 0x84, 0x00, 0x48, 0x90, 0x86, 0x00, 0x08, 0x19, 0x04, + 0xa8, 0xa8, 0x20, 0x09, 0x02, 0x06, 0x21, 0x04, 0x20, 0x09, 0x02, 0x03, + 0x21, 0x0c, 0x91, 0x06, 0x19, 0x04, 0xa8, 0xa8, 0x20, 0x09, 0x02, 0x2a, + 0x21, 0x04, 0x20, 0x09, 0x02, 0x2f, 0x21, 0x0c, 0x91, 0x16, 0x90, 0x84, + 0x03, 0xff, 0x91, 0x8c, 0x03, 0xff, 0x92, 0x94, 0x04, 0x00, 0x01, 0x10, + 0x91, 0x02, 0x00, 0x30, 0x20, 0x10, 0x21, 0x00, 0x92, 0x02, 0x20, 0x09, + 0x02, 0x28, 0x91, 0x02, 0x90, 0x82, 0x00, 0x05, 0x02, 0x50, 0x20, 0x08, + 0x20, 0x01, 0x01, 0x3b, 0x20, 0x04, 0x80, 0x04, 0x80, 0x04, 0x80, 0x04, + 0x91, 0x02, 0x1a, 0x04, 0xa8, 0xa8, 0x20, 0x09, 0x1a, 0x84, 0x21, 0x04, + 0x80, 0x00, 0x02, 0x08, 0x20, 0x0a, 0x20, 0x69, 0x01, 0x00, 0x69, 0x14, + 0x91, 0x8c, 0x19, 0x84, 0x91, 0x8d, 0x00, 0x10, 0x69, 0x16, 0x69, 0xc8, + 0x20, 0x11, 0x00, 0x20, 0x68, 0xc8, 0x91, 0x06, 0x15, 0xc0, 0x82, 0x11, + 0x1d, 0xd8, 0x20, 0x01, 0x03, 0x06, 0x20, 0x03, 0x48, 0x00, 0x20, 0x01, + 0x00, 0x9a, 0x20, 0x03, 0x00, 0x04, 0x20, 0x01, 0x1a, 0x69, 0x20, 0x03, + 0x00, 0x00, 0x20, 0x01, 0x1a, 0x72, 0x20, 0x03, 0x00, 0x00, 0x6a, 0x88, + 0x69, 0x8c, 0x22, 0x00, 0x91, 0x05, 0x11, 0x70, 0x00, 0x96, 0x60, 0x14, + 0x20, 0x48, 0xa8, 0x7c, 0xc0, 0xdc, 0xa8, 0x7e, 0xa8, 0x80, 0xc0, 0xfc, + 0xa8, 0x82, 0x00, 0x9e, 0x2c, 0x10, 0x08, 0x0c, 0x1b, 0xe0, 0x00, 0x40, + 0x60, 0x14, 0x20, 0x48, 0xaa, 0x3a, 0xa9, 0x36, 0x6a, 0xc4, 0x69, 0xc8, + 0xa9, 0x46, 0xaa, 0x4a, 0x01, 0x26, 0x00, 0xc6, 0x20, 0x91, 0x24, 0x00, + 0x00, 0x2e, 0x08, 0x0c, 0x1c, 0x79, 0x19, 0x0c, 0x0d, 0xc5, 0x01, 0x2e, + 0x00, 0x90, 0x20, 0x09, 0x1a, 0x85, 0x21, 0x04, 0x80, 0x00, 0x02, 0x08, + 0x20, 0x0a, 0x69, 0xc8, 0x20, 0x11, 0x00, 0x20, 0x82, 0x11, 0x1d, 0xf0, + 0x68, 0xc8, 0x91, 0x06, 0x1d, 0xc0, 0x69, 0xc4, 0x68, 0xc8, 0x91, 0x05, + 0x01, 0x60, 0x68, 0x24, 0xd0, 0x8c, 0x01, 0x10, 0x68, 0x27, 0x00, 0x02, + 0x70, 0x48, 0xc0, 0x85, 0x70, 0x4a, 0x00, 0x79, 0x70, 0x48, 0xc0, 0x84, + 0x70, 0x4a, 0x20, 0x09, 0x07, 0xd0, 0x08, 0x0c, 0x88, 0xc8, 0x90, 0x06, + 0x00, 0x9e, 0x00, 0xce, 0x00, 0xde, 0x00, 0x05, 0x90, 0x85, 0x00, 0x01, + 0x0c, 0xc8, 0x00, 0x26, 0x00, 0xe6, 0x20, 0x71, 0x19, 0xe8, 0x70, 0x48, + 0xd0, 0x84, 0x01, 0xd8, 0x71, 0x3c, 0x81, 0xff, 0x01, 0xc0, 0x20, 0x71, + 0x01, 0x00, 0x91, 0x88, 0x00, 0x08, 0x21, 0x14, 0x92, 0x8e, 0x00, 0x06, + 0x11, 0x38, 0x70, 0x14, 0x90, 0x84, 0x19, 0x84, 0x90, 0x85, 0x00, 0x12, + 0x70, 0x16, 0x00, 0x48, 0x92, 0x8e, 0x00, 0x09, 0x0d, 0xb0, 0x70, 0x14, + 0x90, 0x84, 0x19, 0x84, 0x90, 0x85, 0x00, 0x16, 0x70, 0x16, 0x00, 0xee, + 0x00, 0x2e, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, + 0x00, 0x66, 0x00, 0x56, 0x00, 0x46, 0x00, 0x06, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x60, 0x10, 0x20, 0x58, 0xbc, 0xa0, 0x20, 0x71, 0x19, 0xe8, + 0x70, 0x18, 0x20, 0x58, 0x8b, 0xff, 0x01, 0x90, 0xb8, 0xa0, 0x94, 0x06, + 0x01, 0x18, 0xb8, 0x54, 0x20, 0x58, 0x0c, 0xc0, 0x60, 0x14, 0x00, 0x96, + 0x20, 0x48, 0xac, 0x6c, 0xad, 0x70, 0xae, 0x78, 0x00, 0x9e, 0x08, 0x0c, + 0x68, 0x56, 0x01, 0x10, 0x90, 0x85, 0x00, 0x01, 0x01, 0x2e, 0x00, 0x0e, + 0x00, 0x4e, 0x00, 0x5e, 0x00, 0x6e, 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, + 0x00, 0xbe, 0x00, 0x05, 0x08, 0x0c, 0xa0, 0xc1, 0x70, 0x03, 0x12, 0x00, + 0x78, 0x38, 0x70, 0x12, 0x78, 0x3c, 0x70, 0x16, 0x00, 0xc6, 0x78, 0x20, + 0x90, 0x86, 0x00, 0x04, 0x11, 0x48, 0x78, 0x10, 0x90, 0x05, 0x01, 0x30, + 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x10, 0xb9, 0x14, 0x00, 0xbe, 0x00, 0x20, + 0x20, 0x61, 0x18, 0x00, 0x60, 0x7c, 0x61, 0x80, 0x90, 0x84, 0x00, 0xff, + 0x70, 0x0a, 0x71, 0x0e, 0x00, 0xce, 0x60, 0xc3, 0x00, 0x2c, 0x08, 0x04, + 0xa6, 0xbd, 0x08, 0x0c, 0xa0, 0xc1, 0x70, 0x03, 0x0f, 0x00, 0x78, 0x08, + 0xd0, 0x9c, 0x01, 0x28, 0xb8, 0x10, 0x90, 0x84, 0x00, 0xff, 0x70, 0x0a, + 0xb8, 0x14, 0x70, 0x0e, 0x60, 0xc3, 0x00, 0x08, 0x08, 0x04, 0xa6, 0xbd, + 0x01, 0x56, 0x08, 0x0c, 0xa1, 0x0c, 0x70, 0x03, 0x02, 0x00, 0x08, 0x0c, + 0x89, 0x4c, 0x20, 0xa9, 0x00, 0x06, 0x20, 0x11, 0xff, 0xec, 0x20, 0x19, + 0xff, 0xed, 0x9e, 0xf0, 0x00, 0x02, 0x23, 0x05, 0x20, 0x72, 0x8e, 0x70, + 0x22, 0x05, 0x20, 0x72, 0x8e, 0x70, 0x93, 0x98, 0x00, 0x02, 0x92, 0x90, + 0x00, 0x02, 0x1f, 0x04, 0xa9, 0x43, 0x60, 0xc3, 0x00, 0x1c, 0x01, 0x5e, + 0x08, 0x04, 0xa6, 0xbd, 0x00, 0x16, 0x00, 0x26, 0x08, 0x0c, 0xa0, 0xe8, + 0x08, 0x0c, 0xa0, 0xfa, 0x9e, 0x80, 0x00, 0x04, 0x20, 0xe9, 0x00, 0x00, + 0x20, 0xa0, 0x78, 0x14, 0x00, 0x96, 0x20, 0x48, 0xa8, 0x00, 0x20, 0x48, + 0xa8, 0x60, 0x20, 0xe0, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x21, 0x20, 0x98, + 0x00, 0x9e, 0x78, 0x08, 0x90, 0x88, 0x00, 0x02, 0x21, 0xa8, 0x91, 0x92, + 0x00, 0x10, 0x12, 0x50, 0x40, 0x03, 0x90, 0x80, 0x00, 0x04, 0x80, 0x03, + 0x60, 0xc2, 0x08, 0x0c, 0xa6, 0xbd, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, + 0x20, 0xa9, 0x00, 0x10, 0x40, 0x03, 0x08, 0x0c, 0xaf, 0x79, 0x20, 0xa1, + 0x02, 0x40, 0x22, 0xa8, 0x40, 0x03, 0x0c, 0x68, 0x08, 0x0c, 0xa0, 0xc1, + 0x70, 0x03, 0x62, 0x00, 0x78, 0x08, 0x70, 0x0e, 0x60, 0xc3, 0x00, 0x08, + 0x08, 0x04, 0xa6, 0xbd, 0x00, 0x16, 0x00, 0x26, 0x08, 0x0c, 0xa0, 0xc1, + 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, 0x02, 0x4c, 0x78, 0x14, 0x00, 0x96, + 0x20, 0x48, 0xa8, 0x00, 0x20, 0x48, 0xa8, 0x60, 0x20, 0xe0, 0xa8, 0x5c, + 0x90, 0x80, 0x00, 0x23, 0x20, 0x98, 0x00, 0x9e, 0x78, 0x08, 0x90, 0x88, + 0x00, 0x02, 0x21, 0xa8, 0x40, 0x03, 0x80, 0x03, 0x60, 0xc2, 0x08, 0x0c, + 0xa6, 0xbd, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xe6, 0x00, 0xc6, + 0x00, 0x06, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0x19, 0xe8, + 0x70, 0x0c, 0x20, 0x60, 0x8c, 0xff, 0x01, 0x78, 0x08, 0x0c, 0xd2, 0xe0, + 0x11, 0x10, 0x08, 0x0c, 0xbc, 0xb6, 0x60, 0x0c, 0x00, 0x06, 0x08, 0x0c, + 0xd5, 0x4c, 0x08, 0x0c, 0xb2, 0xd3, 0x08, 0x0c, 0xaa, 0xf1, 0x00, 0xce, + 0x0c, 0x78, 0x2c, 0x00, 0x70, 0x0e, 0x70, 0x0a, 0x01, 0x2e, 0x00, 0x0e, + 0x00, 0xce, 0x00, 0xee, 0x00, 0x05, 0x01, 0x26, 0x01, 0x56, 0x00, 0xf6, + 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, 0x00, 0x66, 0x00, 0x26, 0x00, 0x16, + 0x00, 0x06, 0x20, 0x91, 0x80, 0x00, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x0c, + 0x91, 0x8c, 0xe7, 0xff, 0x21, 0x02, 0x20, 0x69, 0x01, 0x00, 0x20, 0x79, + 0x01, 0x40, 0x20, 0x71, 0x19, 0xe8, 0x70, 0x24, 0x20, 0x60, 0x8c, 0xff, + 0x01, 0xf8, 0x08, 0x0c, 0xa6, 0xe9, 0x6a, 0xc0, 0x68, 0xc3, 0x00, 0x00, + 0x08, 0x0c, 0x88, 0xc3, 0x00, 0xc6, 0x20, 0x61, 0x01, 0x00, 0x08, 0x0c, + 0xb0, 0xca, 0x00, 0xce, 0x20, 0xa9, 0x01, 0xf4, 0x04, 0x61, 0x20, 0x09, + 0x00, 0x13, 0x08, 0x0c, 0xb3, 0x52, 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x2e, + 0x00, 0x6e, 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, 0x00, 0xfe, 0x01, 0x5e, + 0x01, 0x2e, 0x00, 0x05, 0x20, 0x01, 0x18, 0x00, 0x20, 0x04, 0x90, 0x96, + 0x00, 0x01, 0x0d, 0x78, 0x90, 0x96, 0x00, 0x04, 0x0d, 0x60, 0x08, 0x0c, + 0x88, 0xc3, 0x68, 0x14, 0x90, 0x84, 0x00, 0x01, 0x01, 0x10, 0x68, 0xa7, + 0x95, 0xf5, 0x68, 0x17, 0x00, 0x08, 0x68, 0xc3, 0x00, 0x00, 0x20, 0x11, + 0x5f, 0x97, 0x08, 0x0c, 0x88, 0x3d, 0x20, 0xa9, 0x01, 0xf4, 0x00, 0x09, + 0x08, 0xc0, 0x68, 0x24, 0xd0, 0x94, 0x01, 0x40, 0x68, 0x27, 0x00, 0x04, + 0x78, 0x04, 0x90, 0x84, 0x40, 0x00, 0x19, 0x0c, 0x2d, 0x49, 0x00, 0x90, + 0xd0, 0x84, 0x01, 0x18, 0x68, 0x27, 0x40, 0x01, 0x00, 0x10, 0x1f, 0x04, + 0xaa, 0x2b, 0x78, 0x04, 0x90, 0x84, 0x10, 0x00, 0x01, 0x38, 0x20, 0x01, + 0x01, 0x00, 0x08, 0x0c, 0x2d, 0x39, 0x90, 0x06, 0x08, 0x0c, 0x2d, 0x39, + 0x00, 0x05, 0x01, 0x26, 0x01, 0x56, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xd6, + 0x00, 0xc6, 0x00, 0x66, 0x00, 0x26, 0x00, 0x16, 0x00, 0x06, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x0c, 0x91, 0x8c, 0xdb, 0xff, + 0x21, 0x02, 0x20, 0x69, 0x01, 0x00, 0x20, 0x79, 0x01, 0x40, 0x20, 0x71, + 0x19, 0xe8, 0x70, 0x3c, 0x20, 0x60, 0x8c, 0xff, 0x09, 0x04, 0xaa, 0xb4, + 0x93, 0x86, 0x00, 0x02, 0x11, 0x28, 0x68, 0x14, 0x90, 0x84, 0x00, 0x02, + 0x09, 0x04, 0xaa, 0xb4, 0x68, 0xaf, 0x95, 0xf5, 0x68, 0x17, 0x00, 0x10, + 0x20, 0x09, 0x00, 0xfa, 0x81, 0x09, 0x1d, 0xf0, 0x69, 0xc6, 0x68, 0xcb, + 0x00, 0x08, 0x08, 0x0c, 0x88, 0xd0, 0x08, 0x0c, 0x20, 0x31, 0x20, 0x01, + 0x00, 0x32, 0x69, 0x20, 0xd1, 0xbc, 0x01, 0x30, 0x80, 0x01, 0x1d, 0xd8, + 0x69, 0x2c, 0x91, 0x8d, 0x00, 0x08, 0x69, 0x2e, 0x20, 0xa9, 0x03, 0xe8, + 0x68, 0x24, 0xd0, 0x94, 0x01, 0x40, 0x68, 0x27, 0x00, 0x04, 0x78, 0x04, + 0x90, 0x84, 0x40, 0x00, 0x19, 0x0c, 0x2d, 0x49, 0x00, 0x90, 0xd0, 0x8c, + 0x01, 0x18, 0x68, 0x27, 0x00, 0x02, 0x00, 0x10, 0x1f, 0x04, 0xaa, 0x8a, + 0x78, 0x04, 0x90, 0x84, 0x10, 0x00, 0x01, 0x38, 0x20, 0x01, 0x01, 0x00, + 0x08, 0x0c, 0x2d, 0x39, 0x90, 0x06, 0x08, 0x0c, 0x2d, 0x39, 0x68, 0x27, + 0x40, 0x00, 0x68, 0x24, 0x83, 0xff, 0x11, 0x40, 0x20, 0x09, 0x00, 0x49, + 0x60, 0x20, 0x90, 0x86, 0x00, 0x09, 0x01, 0x10, 0x08, 0x0c, 0xb3, 0x52, + 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x6e, 0x00, 0xce, 0x00, 0xde, + 0x00, 0xee, 0x00, 0xfe, 0x01, 0x5e, 0x01, 0x2e, 0x00, 0x05, 0x00, 0xd6, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x69, 0x19, 0xe8, 0x6a, 0x06, + 0x01, 0x2e, 0x00, 0xde, 0x00, 0x05, 0x00, 0xd6, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x69, 0x19, 0xe8, 0x6a, 0x32, 0x01, 0x2e, 0x00, 0xde, + 0x00, 0x05, 0x08, 0x0c, 0xa2, 0x84, 0x70, 0x47, 0x10, 0x00, 0x00, 0x98, + 0x08, 0x0c, 0xa2, 0x84, 0x70, 0x47, 0x40, 0x00, 0x00, 0x70, 0x08, 0x0c, + 0xa2, 0x84, 0x70, 0x47, 0x20, 0x00, 0x00, 0x48, 0x08, 0x0c, 0xa2, 0x84, + 0x70, 0x47, 0x04, 0x00, 0x00, 0x20, 0x08, 0x0c, 0xa2, 0x84, 0x70, 0x47, + 0x02, 0x00, 0x78, 0x54, 0x70, 0x32, 0x60, 0xc3, 0x00, 0x20, 0x08, 0x04, + 0xa6, 0xbd, 0x00, 0xe6, 0x20, 0x71, 0x19, 0xe8, 0x70, 0x20, 0x90, 0x05, + 0x01, 0x10, 0x80, 0x01, 0x70, 0x22, 0x00, 0xee, 0x00, 0x05, 0x00, 0xf6, + 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, 0x00, 0x76, 0x00, 0x66, 0x00, 0x06, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0x19, 0xe8, 0x76, 0x14, + 0x26, 0x60, 0x26, 0x78, 0x20, 0x39, 0x00, 0x01, 0x87, 0xff, 0x09, 0x04, + 0xab, 0x96, 0x8c, 0xff, 0x09, 0x04, 0xab, 0x96, 0x60, 0x20, 0x90, 0x86, + 0x00, 0x06, 0x19, 0x04, 0xab, 0x91, 0x88, 0xff, 0x01, 0x38, 0x28, 0x00, + 0x9c, 0x06, 0x19, 0x04, 0xab, 0x91, 0x20, 0x39, 0x00, 0x00, 0x00, 0x50, + 0x60, 0x10, 0x9b, 0x06, 0x19, 0x04, 0xab, 0x91, 0x85, 0xff, 0x01, 0x20, + 0x60, 0x54, 0x91, 0x06, 0x19, 0x04, 0xab, 0x91, 0x70, 0x24, 0x9c, 0x06, + 0x15, 0xb0, 0x20, 0x69, 0x01, 0x00, 0x68, 0xc0, 0x90, 0x05, 0x11, 0x60, + 0x68, 0x24, 0xd0, 0x84, 0x01, 0x48, 0x68, 0x27, 0x00, 0x01, 0x08, 0x0c, + 0x88, 0xc3, 0x08, 0x0c, 0xac, 0x1b, 0x70, 0x27, 0x00, 0x00, 0x04, 0x28, + 0x08, 0x0c, 0x88, 0xc3, 0x68, 0x20, 0xd0, 0xb4, 0x01, 0x10, 0x68, 0xa7, + 0x95, 0xf5, 0x68, 0x17, 0x00, 0x08, 0x68, 0xc3, 0x00, 0x00, 0x08, 0x0c, + 0xac, 0x1b, 0x70, 0x27, 0x00, 0x00, 0x00, 0x36, 0x20, 0x69, 0x01, 0x40, + 0x6b, 0x04, 0x93, 0x84, 0x10, 0x00, 0x01, 0x38, 0x20, 0x01, 0x01, 0x00, + 0x08, 0x0c, 0x2d, 0x39, 0x90, 0x06, 0x08, 0x0c, 0x2d, 0x39, 0x20, 0x69, + 0x01, 0x00, 0x68, 0x24, 0xd0, 0x84, 0x01, 0x10, 0x68, 0x27, 0x00, 0x01, + 0x00, 0x3e, 0x70, 0x14, 0x9c, 0x36, 0x11, 0x10, 0x66, 0x0c, 0x76, 0x16, + 0x70, 0x10, 0x9c, 0x36, 0x11, 0x40, 0x2c, 0x00, 0x9f, 0x36, 0x01, 0x18, + 0x2f, 0x00, 0x70, 0x12, 0x00, 0x10, 0x70, 0x13, 0x00, 0x00, 0x66, 0x0c, + 0x00, 0x66, 0x2c, 0x00, 0x9f, 0x06, 0x01, 0x10, 0x7e, 0x0e, 0x00, 0x08, + 0x26, 0x78, 0x89, 0xff, 0x11, 0x68, 0x60, 0x0f, 0x00, 0x00, 0x60, 0x14, + 0x00, 0x96, 0x20, 0x48, 0x08, 0x0c, 0xd0, 0xd6, 0x01, 0x10, 0x08, 0x0c, + 0xeb, 0xd4, 0x00, 0x9e, 0x08, 0x0c, 0xb3, 0x06, 0x08, 0x0c, 0xaa, 0xf1, + 0x88, 0xff, 0x11, 0x90, 0x00, 0xce, 0x08, 0x04, 0xab, 0x0c, 0x2c, 0x78, + 0x60, 0x0c, 0x20, 0x60, 0x08, 0x04, 0xab, 0x0c, 0x90, 0x06, 0x01, 0x2e, + 0x00, 0x0e, 0x00, 0x6e, 0x00, 0x7e, 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, + 0x00, 0xfe, 0x00, 0x05, 0x60, 0x1b, 0x00, 0x00, 0x00, 0xce, 0x98, 0xc5, + 0x00, 0x01, 0x0c, 0x88, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0x96, + 0x00, 0xc6, 0x00, 0x66, 0x00, 0x26, 0x00, 0x06, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x71, 0x19, 0xe8, 0x76, 0x38, 0x26, 0x60, 0x26, 0x78, + 0x8c, 0xff, 0x09, 0x04, 0xac, 0x0a, 0x60, 0x20, 0x90, 0x86, 0x00, 0x06, + 0x19, 0x04, 0xac, 0x05, 0x87, 0xff, 0x01, 0x28, 0x27, 0x00, 0x9c, 0x06, + 0x19, 0x04, 0xac, 0x05, 0x00, 0x40, 0x60, 0x10, 0x9b, 0x06, 0x15, 0xe8, + 0x85, 0xff, 0x01, 0x18, 0x60, 0x54, 0x91, 0x06, 0x15, 0xc0, 0x70, 0x3c, + 0x9c, 0x06, 0x11, 0x68, 0x00, 0x36, 0x20, 0x19, 0x00, 0x01, 0x08, 0x0c, + 0xaa, 0x49, 0x70, 0x33, 0x00, 0x00, 0x90, 0x06, 0x70, 0x3e, 0x70, 0x42, + 0x70, 0x46, 0x70, 0x4a, 0x00, 0x3e, 0x70, 0x38, 0x9c, 0x36, 0x11, 0x10, + 0x66, 0x0c, 0x76, 0x3a, 0x70, 0x34, 0x9c, 0x36, 0x11, 0x40, 0x2c, 0x00, + 0x9f, 0x36, 0x01, 0x18, 0x2f, 0x00, 0x70, 0x36, 0x00, 0x10, 0x70, 0x37, + 0x00, 0x00, 0x66, 0x0c, 0x00, 0x66, 0x2c, 0x00, 0x9f, 0x06, 0x01, 0x10, + 0x7e, 0x0e, 0x00, 0x08, 0x26, 0x78, 0x60, 0x0f, 0x00, 0x00, 0x60, 0x14, + 0x20, 0x48, 0x08, 0x0c, 0xd0, 0xd6, 0x01, 0x10, 0x08, 0x0c, 0xeb, 0xd4, + 0x08, 0x0c, 0xb3, 0x06, 0x87, 0xff, 0x11, 0x98, 0x00, 0xce, 0x08, 0x04, + 0xab, 0xb6, 0x2c, 0x78, 0x60, 0x0c, 0x20, 0x60, 0x08, 0x04, 0xab, 0xb6, + 0x90, 0x06, 0x01, 0x2e, 0x00, 0x0e, 0x00, 0x2e, 0x00, 0x6e, 0x00, 0xce, + 0x00, 0x9e, 0x00, 0xde, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, 0x60, 0x1b, + 0x00, 0x00, 0x00, 0xce, 0x97, 0xbd, 0x00, 0x01, 0x0c, 0x80, 0x00, 0xe6, + 0x20, 0x71, 0x19, 0xe8, 0x20, 0x01, 0x18, 0x00, 0x20, 0x04, 0x90, 0x86, + 0x00, 0x02, 0x11, 0x18, 0x70, 0x07, 0x00, 0x05, 0x00, 0x10, 0x70, 0x07, + 0x00, 0x00, 0x00, 0xee, 0x00, 0x05, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xc6, + 0x00, 0x66, 0x00, 0x26, 0x00, 0x06, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x71, 0x19, 0xe8, 0x2c, 0x10, 0x76, 0x38, 0x26, 0x60, 0x26, 0x78, + 0x8c, 0xff, 0x05, 0x40, 0x22, 0x00, 0x9c, 0x06, 0x15, 0x08, 0x70, 0x38, + 0x9c, 0x36, 0x11, 0x10, 0x66, 0x0c, 0x76, 0x3a, 0x70, 0x34, 0x9c, 0x36, + 0x11, 0x40, 0x2c, 0x00, 0x9f, 0x36, 0x01, 0x18, 0x2f, 0x00, 0x70, 0x36, + 0x00, 0x10, 0x70, 0x37, 0x00, 0x00, 0x66, 0x0c, 0x2c, 0x00, 0x9f, 0x06, + 0x01, 0x10, 0x7e, 0x0e, 0x00, 0x08, 0x26, 0x78, 0x60, 0x0f, 0x00, 0x00, + 0x60, 0x04, 0x90, 0x86, 0x00, 0x40, 0x09, 0x0c, 0x99, 0xa5, 0x90, 0x85, + 0x00, 0x01, 0x00, 0x20, 0x2c, 0x78, 0x60, 0x0c, 0x20, 0x60, 0x08, 0xb0, + 0x01, 0x2e, 0x00, 0x0e, 0x00, 0x2e, 0x00, 0x6e, 0x00, 0xce, 0x00, 0xee, + 0x00, 0xfe, 0x00, 0x05, 0x00, 0x96, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xd6, + 0x00, 0xc6, 0x00, 0x66, 0x00, 0x26, 0x00, 0x06, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x71, 0x19, 0xe8, 0x76, 0x0c, 0x26, 0x60, 0x26, 0x78, + 0x8c, 0xff, 0x09, 0x04, 0xad, 0x01, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, + 0xb8, 0xa0, 0x00, 0xbe, 0x92, 0x06, 0x19, 0x04, 0xac, 0xfc, 0x70, 0x24, + 0x9c, 0x06, 0x15, 0x20, 0x20, 0x69, 0x01, 0x00, 0x68, 0xc0, 0x90, 0x05, + 0x09, 0x04, 0xac, 0xd3, 0x08, 0x0c, 0xa6, 0xe9, 0x68, 0xc3, 0x00, 0x00, + 0x08, 0x0c, 0xac, 0x1b, 0x70, 0x27, 0x00, 0x00, 0x00, 0x36, 0x20, 0x69, + 0x01, 0x40, 0x6b, 0x04, 0x93, 0x84, 0x10, 0x00, 0x01, 0x38, 0x20, 0x01, + 0x01, 0x00, 0x08, 0x0c, 0x2d, 0x39, 0x90, 0x06, 0x08, 0x0c, 0x2d, 0x39, + 0x20, 0x69, 0x01, 0x00, 0x68, 0x24, 0xd0, 0x84, 0x01, 0x10, 0x68, 0x27, + 0x00, 0x01, 0x00, 0x3e, 0x70, 0x0c, 0x9c, 0x36, 0x11, 0x10, 0x66, 0x0c, + 0x76, 0x0e, 0x70, 0x08, 0x9c, 0x36, 0x11, 0x40, 0x2c, 0x00, 0x9f, 0x36, + 0x01, 0x18, 0x2f, 0x00, 0x70, 0x0a, 0x00, 0x10, 0x70, 0x0b, 0x00, 0x00, + 0x66, 0x0c, 0x00, 0x66, 0x2c, 0x00, 0x9f, 0x06, 0x01, 0x10, 0x7e, 0x0e, + 0x00, 0x08, 0x26, 0x78, 0x60, 0x0f, 0x00, 0x00, 0x08, 0x0c, 0xd2, 0xcf, + 0x11, 0x80, 0x08, 0x0c, 0x32, 0x79, 0x08, 0x0c, 0xd2, 0xe0, 0x15, 0x18, + 0x08, 0x0c, 0xbc, 0xb6, 0x04, 0x00, 0x08, 0x0c, 0xac, 0x1b, 0x68, 0x24, + 0xd0, 0x84, 0x09, 0xb0, 0x68, 0x27, 0x00, 0x01, 0x08, 0x98, 0x08, 0x0c, + 0xd2, 0xe0, 0x11, 0x18, 0x08, 0x0c, 0xbc, 0xb6, 0x00, 0x90, 0x60, 0x14, + 0x20, 0x48, 0x08, 0x0c, 0xd0, 0xd6, 0x01, 0x68, 0x60, 0x20, 0x90, 0x86, + 0x00, 0x03, 0x15, 0x08, 0xa8, 0x67, 0x01, 0x03, 0xab, 0x7a, 0xa8, 0x77, + 0x00, 0x00, 0x08, 0x0c, 0x6e, 0x92, 0x08, 0x0c, 0xd2, 0xc3, 0x08, 0x0c, + 0xd5, 0x4c, 0x08, 0x0c, 0xb3, 0x06, 0x08, 0x0c, 0xaa, 0xf1, 0x00, 0xce, + 0x08, 0x04, 0xac, 0x7c, 0x2c, 0x78, 0x60, 0x0c, 0x20, 0x60, 0x08, 0x04, + 0xac, 0x7c, 0x01, 0x2e, 0x00, 0x0e, 0x00, 0x2e, 0x00, 0x6e, 0x00, 0xce, + 0x00, 0xde, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x9e, 0x00, 0x05, 0x60, 0x20, + 0x90, 0x86, 0x00, 0x06, 0x1d, 0x20, 0x08, 0x0c, 0xeb, 0xd4, 0x0c, 0x08, + 0x00, 0xd6, 0x08, 0x0c, 0xa1, 0x0c, 0x70, 0x03, 0x02, 0x00, 0x70, 0x07, + 0x00, 0x14, 0x60, 0xc3, 0x00, 0x14, 0x20, 0xe1, 0x00, 0x01, 0x20, 0x99, + 0x19, 0x89, 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, 0x02, 0x50, 0x20, 0xa9, + 0x00, 0x04, 0x40, 0x03, 0x70, 0x23, 0x00, 0x04, 0x70, 0x27, 0x78, 0x78, + 0x08, 0x0c, 0xa6, 0xbd, 0x00, 0xde, 0x00, 0x05, 0x08, 0x0c, 0xa1, 0x0c, + 0x70, 0x0b, 0x08, 0x00, 0x78, 0x14, 0x90, 0x84, 0xff, 0x00, 0x70, 0x0e, + 0x78, 0x14, 0x90, 0x84, 0x00, 0xff, 0x70, 0x22, 0x78, 0x2c, 0x70, 0x26, + 0x78, 0x58, 0x90, 0x84, 0x00, 0xff, 0x90, 0x85, 0x02, 0x00, 0x70, 0x02, + 0x78, 0x58, 0x90, 0x84, 0xff, 0x00, 0x80, 0x07, 0x70, 0x06, 0x60, 0xc2, + 0x08, 0x04, 0xa6, 0xbd, 0x00, 0xb6, 0x00, 0xd6, 0x00, 0x16, 0x00, 0xd6, + 0x2f, 0x68, 0x20, 0x09, 0x00, 0x35, 0x08, 0x0c, 0xd7, 0x59, 0x00, 0xde, + 0x19, 0x04, 0xad, 0xaf, 0x08, 0x0c, 0xa0, 0xc1, 0x70, 0x03, 0x13, 0x00, + 0x78, 0x2c, 0x08, 0x0c, 0xae, 0xb5, 0x20, 0x68, 0x68, 0x20, 0x90, 0x86, + 0x00, 0x03, 0x05, 0x60, 0x78, 0x10, 0x20, 0x58, 0xba, 0xa0, 0x08, 0x0c, + 0xb2, 0x3d, 0x11, 0xd8, 0x92, 0x86, 0x00, 0x7e, 0x11, 0x28, 0x70, 0x0b, + 0x00, 0xff, 0x70, 0x0f, 0xff, 0xfe, 0x04, 0x98, 0x92, 0x86, 0x00, 0x7f, + 0x11, 0x28, 0x70, 0x0b, 0x00, 0xff, 0x70, 0x0f, 0xff, 0xfd, 0x04, 0x58, + 0x92, 0x84, 0xff, 0x80, 0x01, 0x80, 0x92, 0x86, 0x00, 0x80, 0x11, 0x28, + 0x70, 0x0b, 0x00, 0xff, 0x70, 0x0f, 0xff, 0xfc, 0x04, 0x00, 0x92, 0xd8, + 0x10, 0x00, 0x2b, 0x5c, 0xb8, 0x10, 0x70, 0x0a, 0xb8, 0x14, 0x70, 0x0e, + 0x00, 0xc0, 0x60, 0x98, 0x70, 0x0e, 0x00, 0xa8, 0x08, 0x0c, 0xb2, 0x3d, + 0x11, 0x30, 0x78, 0x10, 0x20, 0x58, 0xb8, 0xa0, 0x90, 0x82, 0x00, 0x7e, + 0x02, 0x50, 0x00, 0xd6, 0x20, 0x69, 0x18, 0x1f, 0x2d, 0x04, 0x70, 0x0a, + 0x8d, 0x68, 0x2d, 0x04, 0x70, 0x0e, 0x00, 0xde, 0x00, 0x10, 0x60, 0x34, + 0x70, 0x0e, 0x78, 0x38, 0x70, 0x12, 0x78, 0x3c, 0x70, 0x16, 0x60, 0xc3, + 0x00, 0x0c, 0x00, 0x1e, 0x00, 0xde, 0x08, 0x0c, 0xa6, 0xbd, 0x00, 0xbe, + 0x00, 0x05, 0x78, 0x1b, 0x00, 0x01, 0x78, 0x03, 0x00, 0x06, 0x00, 0x1e, + 0x00, 0xde, 0x00, 0xbe, 0x00, 0x05, 0x79, 0x2c, 0x91, 0x80, 0x00, 0x08, + 0x20, 0x0c, 0x91, 0x86, 0x00, 0x06, 0x01, 0xc0, 0x91, 0x86, 0x00, 0x03, + 0x09, 0x04, 0xae, 0x2a, 0x91, 0x86, 0x00, 0x05, 0x09, 0x04, 0xae, 0x12, + 0x91, 0x86, 0x00, 0x04, 0x05, 0xd8, 0x91, 0x86, 0x00, 0x08, 0x09, 0x04, + 0xae, 0x1b, 0x78, 0x07, 0x00, 0x37, 0x78, 0x2f, 0x00, 0x03, 0x78, 0x17, + 0x17, 0x00, 0x08, 0x0c, 0xae, 0x92, 0x00, 0x05, 0x08, 0x0c, 0xae, 0x53, + 0x00, 0xd6, 0x00, 0x26, 0x79, 0x2c, 0x21, 0x68, 0x20, 0x09, 0x40, 0x00, + 0x68, 0x00, 0x00, 0x02, 0xad, 0xf3, 0xad, 0xfe, 0xad, 0xf5, 0xad, 0xfe, + 0xad, 0xfa, 0xad, 0xf3, 0xad, 0xf3, 0xad, 0xfe, 0xad, 0xfe, 0xad, 0xfe, + 0xad, 0xfe, 0xad, 0xf3, 0xad, 0xf3, 0xad, 0xf3, 0xad, 0xf3, 0xad, 0xf3, + 0xad, 0xfe, 0xad, 0xf3, 0xad, 0xfe, 0x08, 0x0c, 0x0d, 0xc5, 0x68, 0x24, + 0xd0, 0xe4, 0x01, 0x10, 0xd0, 0xcc, 0x01, 0x10, 0x90, 0x0e, 0x00, 0x10, + 0x20, 0x09, 0x20, 0x00, 0x68, 0x2c, 0x70, 0x22, 0x68, 0x30, 0x70, 0x26, + 0x08, 0x04, 0xae, 0x4c, 0x08, 0x0c, 0xae, 0x53, 0x00, 0xd6, 0x00, 0x26, + 0x79, 0x2c, 0x21, 0x68, 0x20, 0x09, 0x40, 0x00, 0x6a, 0x00, 0x92, 0x86, + 0x00, 0x02, 0x11, 0x08, 0x90, 0x0e, 0x04, 0xd0, 0x08, 0x0c, 0xae, 0x53, + 0x00, 0xd6, 0x00, 0x26, 0x79, 0x2c, 0x21, 0x68, 0x20, 0x09, 0x40, 0x00, + 0x04, 0x88, 0x04, 0xb9, 0x00, 0xd6, 0x00, 0x26, 0x79, 0x2c, 0x21, 0x68, + 0x20, 0x09, 0x40, 0x00, 0x92, 0x86, 0x00, 0x05, 0x01, 0x18, 0x92, 0x86, + 0x00, 0x02, 0x11, 0x08, 0x90, 0x0e, 0x04, 0x10, 0x04, 0x41, 0x00, 0xd6, + 0x00, 0x26, 0x79, 0x2c, 0x21, 0x68, 0x68, 0x14, 0x69, 0x24, 0xc1, 0x85, + 0x69, 0x26, 0x00, 0x96, 0x20, 0x48, 0xa9, 0xac, 0xa8, 0x34, 0x91, 0x12, + 0xa9, 0xb0, 0xa8, 0x38, 0x00, 0x9e, 0x91, 0x03, 0x70, 0x22, 0x72, 0x26, + 0x79, 0x2c, 0x91, 0x80, 0x00, 0x00, 0x20, 0x04, 0x90, 0x8e, 0x00, 0x02, + 0x01, 0x30, 0x90, 0x8e, 0x00, 0x04, 0x01, 0x18, 0x20, 0x09, 0x40, 0x00, + 0x00, 0x08, 0x90, 0x0e, 0x71, 0x2a, 0x60, 0xc3, 0x00, 0x18, 0x00, 0x2e, + 0x00, 0xde, 0x08, 0x04, 0xa6, 0xbd, 0x00, 0xb6, 0x00, 0x36, 0x00, 0x46, + 0x00, 0x56, 0x00, 0x66, 0x08, 0x0c, 0xa1, 0x0c, 0x90, 0x06, 0x70, 0x03, + 0x02, 0x00, 0x79, 0x38, 0x71, 0x0a, 0x79, 0x3c, 0x71, 0x0e, 0x78, 0x10, + 0x20, 0x58, 0xb8, 0xa0, 0x08, 0x0c, 0xb2, 0x3d, 0x11, 0x18, 0x90, 0x92, + 0x00, 0x7e, 0x02, 0x68, 0x00, 0xd6, 0x20, 0x69, 0x18, 0x1f, 0x2d, 0x2c, + 0x8d, 0x68, 0x2d, 0x34, 0x90, 0xd8, 0x10, 0x00, 0x2b, 0x5c, 0xbb, 0x10, + 0xbc, 0x14, 0x00, 0xde, 0x00, 0x28, 0x90, 0x1e, 0x64, 0x98, 0x20, 0x29, + 0x00, 0x00, 0x66, 0x34, 0x78, 0x2c, 0x90, 0x80, 0x00, 0x08, 0x20, 0x04, + 0x90, 0x86, 0x00, 0x03, 0x11, 0x28, 0x75, 0x12, 0x76, 0x16, 0x73, 0x1a, + 0x74, 0x1e, 0x00, 0x20, 0x73, 0x12, 0x74, 0x16, 0x75, 0x1a, 0x76, 0x1e, + 0x00, 0x6e, 0x00, 0x5e, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0xbe, 0x00, 0x05, + 0x08, 0x0c, 0xa1, 0x0c, 0x70, 0x03, 0x01, 0x00, 0x78, 0x2c, 0x70, 0x0a, + 0x78, 0x14, 0x70, 0x0e, 0x70, 0x0e, 0x60, 0xc3, 0x00, 0x08, 0x08, 0x04, + 0xa6, 0xbd, 0x08, 0x0c, 0xa0, 0xb8, 0x70, 0x03, 0x14, 0x00, 0x78, 0x38, + 0x70, 0x0a, 0x00, 0x79, 0x78, 0x3c, 0x70, 0x0e, 0x78, 0x2c, 0x70, 0x12, + 0x78, 0x30, 0x70, 0x16, 0x78, 0x34, 0x90, 0x84, 0x00, 0xff, 0x80, 0x07, + 0x70, 0x1a, 0x60, 0xc3, 0x00, 0x10, 0x08, 0x04, 0xa6, 0xbd, 0x00, 0xe6, + 0x20, 0x71, 0x02, 0x40, 0x00, 0x06, 0x00, 0xf6, 0x20, 0x78, 0x78, 0x10, + 0x00, 0xb6, 0x20, 0x58, 0xb8, 0xcc, 0xd0, 0x84, 0x01, 0x20, 0x78, 0x44, + 0x70, 0x2a, 0x78, 0x48, 0x70, 0x2e, 0x00, 0xbe, 0x00, 0xfe, 0x00, 0x0e, + 0x00, 0xee, 0x00, 0x05, 0x08, 0x0c, 0xa1, 0x03, 0x70, 0x03, 0x01, 0x00, + 0x78, 0x2c, 0x70, 0x0a, 0x78, 0x14, 0x70, 0x0e, 0x60, 0xc3, 0x00, 0x08, + 0x08, 0x04, 0xa6, 0xbd, 0x00, 0x21, 0x60, 0xc3, 0x00, 0x00, 0x08, 0x04, + 0xa6, 0xbd, 0x00, 0xd6, 0x08, 0x0c, 0xaf, 0x8e, 0xb8, 0x10, 0x90, 0x85, + 0x03, 0x00, 0x70, 0x02, 0xb8, 0x14, 0x70, 0x06, 0x20, 0x69, 0x18, 0x00, + 0x68, 0x7c, 0x70, 0x0a, 0x68, 0x80, 0x70, 0x0e, 0x70, 0x13, 0x08, 0x19, + 0x08, 0x0c, 0xa6, 0xab, 0x72, 0x1a, 0x2f, 0x10, 0x72, 0x22, 0x7a, 0x08, + 0x72, 0x26, 0x20, 0x71, 0x02, 0x4c, 0x00, 0xde, 0x00, 0x05, 0x00, 0xa9, + 0x79, 0x14, 0x71, 0x2a, 0x60, 0xc3, 0x00, 0x00, 0x60, 0xa7, 0x95, 0x75, + 0x00, 0x26, 0x08, 0x0c, 0x2b, 0xce, 0x02, 0x28, 0x20, 0x11, 0x01, 0x01, + 0x22, 0x04, 0xc0, 0xc5, 0x20, 0x12, 0x00, 0x2e, 0x08, 0x0c, 0xa6, 0xe0, + 0x08, 0x0c, 0x88, 0xba, 0x00, 0x05, 0x00, 0x36, 0x00, 0x96, 0x00, 0xd6, + 0x00, 0xe6, 0x78, 0x58, 0x20, 0x48, 0xaa, 0x7c, 0x92, 0x96, 0x00, 0xc0, + 0x92, 0x94, 0x00, 0xfd, 0xaa, 0x7e, 0xaa, 0x80, 0x92, 0x94, 0x03, 0x00, + 0xaa, 0x82, 0xa9, 0x6c, 0x91, 0x94, 0x00, 0xff, 0xab, 0x74, 0x93, 0x84, + 0x00, 0xff, 0x90, 0x8d, 0xc2, 0x00, 0xa9, 0x6e, 0x93, 0x84, 0xff, 0x00, + 0x92, 0x15, 0xaa, 0x76, 0xa8, 0x70, 0xaa, 0x78, 0xa8, 0x7a, 0xaa, 0x72, + 0x00, 0xd6, 0x20, 0x69, 0x02, 0x00, 0x08, 0x0c, 0xaf, 0x8e, 0x00, 0xde, + 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, 0x02, 0x40, 0x20, 0xa9, 0x00, 0x0a, + 0xa8, 0x60, 0x20, 0xe0, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x1b, 0x20, 0x98, + 0x40, 0x03, 0x60, 0xa3, 0x00, 0x35, 0xaa, 0x68, 0x92, 0x94, 0x70, 0x00, + 0x92, 0x86, 0x30, 0x00, 0x01, 0x10, 0x60, 0xa3, 0x00, 0x37, 0x00, 0xee, + 0x00, 0xde, 0x00, 0x9e, 0x00, 0x3e, 0x00, 0x05, 0x90, 0x0e, 0x78, 0x14, + 0x00, 0x96, 0x20, 0x48, 0xa8, 0x7c, 0xd0, 0xfc, 0x01, 0xc0, 0x90, 0x84, + 0x00, 0x03, 0x11, 0xa8, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x04, 0xd0, 0xbc, + 0x01, 0x80, 0x78, 0x24, 0xd0, 0xcc, 0x11, 0x68, 0xd0, 0xc4, 0x11, 0x58, + 0xa8, 0xa8, 0x90, 0x05, 0x11, 0x40, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x0c, + 0xc1, 0xd5, 0x21, 0x02, 0x20, 0x09, 0x19, 0xb3, 0x21, 0x0c, 0x00, 0x9e, + 0x91, 0x8d, 0x00, 0x92, 0x00, 0x10, 0x20, 0x09, 0x00, 0x96, 0x60, 0xab, + 0x00, 0x36, 0x61, 0x16, 0x00, 0x05, 0x20, 0x09, 0x00, 0x09, 0x00, 0xa0, + 0x20, 0x09, 0x00, 0x0a, 0x00, 0x88, 0x20, 0x09, 0x00, 0x0b, 0x00, 0x70, + 0x20, 0x09, 0x00, 0x0c, 0x00, 0x58, 0x20, 0x09, 0x00, 0x0d, 0x00, 0x40, + 0x20, 0x09, 0x00, 0x0e, 0x00, 0x28, 0x20, 0x09, 0x00, 0x0f, 0x00, 0x10, + 0x20, 0x09, 0x00, 0x08, 0x69, 0x12, 0x00, 0x05, 0x08, 0x0c, 0xa0, 0xc1, + 0x00, 0x16, 0x00, 0x26, 0x00, 0x96, 0x00, 0xd6, 0x78, 0x14, 0x20, 0x48, + 0x70, 0x13, 0x01, 0x38, 0x20, 0x01, 0x18, 0x37, 0x20, 0x04, 0x90, 0x84, + 0x00, 0x28, 0x11, 0x38, 0x20, 0x01, 0x19, 0x7c, 0x20, 0x04, 0x90, 0x86, + 0xaa, 0xaa, 0x19, 0x04, 0xb0, 0x33, 0x70, 0x03, 0x54, 0x00, 0x00, 0xc6, + 0x20, 0x61, 0x18, 0x00, 0x60, 0x7c, 0x90, 0x84, 0x00, 0xff, 0xa9, 0x98, + 0x81, 0x0f, 0x91, 0x8c, 0xff, 0x00, 0x91, 0x05, 0x70, 0x0a, 0x60, 0x80, + 0x70, 0x0e, 0xa9, 0x98, 0x91, 0x8c, 0xff, 0x00, 0x71, 0x12, 0x20, 0xa9, + 0x00, 0x04, 0x20, 0x09, 0x18, 0x05, 0x2e, 0x10, 0x92, 0x90, 0x00, 0x06, + 0x21, 0x04, 0x20, 0x12, 0x81, 0x08, 0x82, 0x10, 0x1f, 0x04, 0xaf, 0xc4, + 0x20, 0xa9, 0x00, 0x04, 0x20, 0x09, 0x18, 0x01, 0x21, 0x04, 0x20, 0x12, + 0x81, 0x08, 0x82, 0x10, 0x1f, 0x04, 0xaf, 0xce, 0xa8, 0x60, 0x20, 0xe0, + 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x29, 0x20, 0x98, 0x20, 0x09, 0x00, 0x06, + 0x20, 0xa9, 0x00, 0x01, 0x40, 0x02, 0x80, 0x07, 0x20, 0x12, 0x82, 0x10, + 0x81, 0x09, 0x1d, 0xc0, 0x00, 0xd6, 0x20, 0x69, 0x02, 0x00, 0x08, 0x0c, + 0xaf, 0x79, 0x00, 0xde, 0x20, 0x71, 0x02, 0x40, 0x20, 0x11, 0x02, 0x40, + 0x20, 0x09, 0x00, 0x02, 0x20, 0xa9, 0x00, 0x01, 0x40, 0x02, 0x80, 0x07, + 0x20, 0x12, 0x82, 0x10, 0x81, 0x09, 0x1d, 0xc0, 0x20, 0x09, 0x00, 0x08, + 0x20, 0xa9, 0x00, 0x01, 0x40, 0x02, 0x80, 0x07, 0x20, 0x12, 0x82, 0x10, + 0x81, 0x09, 0x1d, 0xc0, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x31, 0x20, 0x98, + 0x20, 0x09, 0x00, 0x08, 0x20, 0xa9, 0x00, 0x01, 0x40, 0x02, 0x80, 0x07, + 0x20, 0x12, 0x82, 0x10, 0x81, 0x09, 0x1d, 0xc0, 0x00, 0xce, 0x60, 0xc3, + 0x00, 0x4c, 0x60, 0xa3, 0x00, 0x56, 0x60, 0xa7, 0x95, 0x75, 0x20, 0x01, + 0x18, 0x37, 0x20, 0x04, 0x90, 0x84, 0x00, 0x28, 0x11, 0x68, 0x08, 0x0c, + 0x76, 0x37, 0x01, 0x50, 0x60, 0x28, 0xc0, 0xbd, 0x60, 0x2a, 0x60, 0x14, + 0x90, 0x84, 0x18, 0x04, 0x90, 0x85, 0x00, 0x29, 0x60, 0x16, 0x00, 0x10, + 0x08, 0x0c, 0xa6, 0xbd, 0x08, 0x0c, 0x88, 0xba, 0x00, 0xde, 0x00, 0x9e, + 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0x02, 0x40, + 0x20, 0x01, 0x22, 0x00, 0x90, 0x85, 0x00, 0xff, 0x70, 0x02, 0x70, 0x07, + 0xff, 0xff, 0x20, 0x71, 0x01, 0x00, 0x70, 0x9b, 0x00, 0xff, 0x00, 0xee, + 0x08, 0x04, 0xaf, 0xa9, 0x08, 0x0c, 0xa0, 0xc1, 0x00, 0x16, 0x00, 0x26, + 0x00, 0x96, 0x00, 0xd6, 0x78, 0x14, 0x20, 0x48, 0x70, 0x13, 0x01, 0x38, + 0x70, 0x03, 0x55, 0x00, 0x00, 0xc6, 0xa8, 0x9c, 0x90, 0x84, 0x00, 0xff, + 0xa9, 0x98, 0x81, 0x0f, 0x91, 0x8c, 0xff, 0x00, 0x91, 0x05, 0x70, 0x0a, + 0xa9, 0x9c, 0x91, 0x8c, 0xff, 0x00, 0xa8, 0xa0, 0x90, 0x84, 0x00, 0xff, + 0x91, 0x05, 0x70, 0x0e, 0xa9, 0x98, 0x91, 0x8c, 0xff, 0x00, 0x20, 0x61, + 0x18, 0x00, 0x60, 0x7c, 0x90, 0x84, 0x00, 0xff, 0x91, 0x0d, 0x71, 0x12, + 0x61, 0x80, 0x71, 0x16, 0x20, 0x09, 0x00, 0x08, 0xa8, 0x60, 0x20, 0xe0, + 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x29, 0x20, 0x98, 0x2e, 0x10, 0x92, 0x90, + 0x00, 0x06, 0x20, 0xa9, 0x00, 0x01, 0x40, 0x02, 0x80, 0x07, 0x20, 0x12, + 0x82, 0x10, 0x81, 0x09, 0x1d, 0xc0, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x09, + 0x18, 0x05, 0x21, 0x04, 0x20, 0x12, 0x81, 0x08, 0x82, 0x10, 0x1f, 0x04, + 0xb0, 0x85, 0x20, 0xa9, 0x00, 0x02, 0x20, 0x09, 0x18, 0x01, 0x21, 0x04, + 0x20, 0x12, 0x81, 0x08, 0x82, 0x10, 0x1f, 0x04, 0xb0, 0x8f, 0x00, 0xd6, + 0x00, 0x16, 0x20, 0x69, 0x02, 0x00, 0x08, 0x0c, 0xaf, 0x79, 0x00, 0x1e, + 0x00, 0xde, 0x20, 0x71, 0x02, 0x40, 0x20, 0xa9, 0x00, 0x02, 0x20, 0x09, + 0x18, 0x03, 0x20, 0x11, 0x02, 0x40, 0x21, 0x04, 0x20, 0x12, 0x81, 0x08, + 0x82, 0x10, 0x1f, 0x04, 0xb0, 0xa5, 0x20, 0x09, 0x00, 0x08, 0x40, 0x02, + 0x80, 0x07, 0x20, 0x12, 0x82, 0x10, 0x81, 0x09, 0x1d, 0xd0, 0x90, 0x06, + 0x20, 0xa9, 0x00, 0x08, 0x20, 0x12, 0x82, 0x10, 0x1f, 0x04, 0xb0, 0xb6, + 0x00, 0xce, 0x60, 0xc3, 0x00, 0x4c, 0x60, 0xa3, 0x00, 0x56, 0x60, 0xa7, + 0x95, 0x75, 0x08, 0x0c, 0xa6, 0xbd, 0x08, 0x0c, 0x88, 0xba, 0x00, 0xde, + 0x00, 0x9e, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xd6, 0x92, 0x90, + 0x00, 0x18, 0x82, 0x14, 0x20, 0xe9, 0x00, 0x00, 0x20, 0x69, 0x02, 0x00, + 0x68, 0x13, 0x00, 0x00, 0x22, 0xa8, 0x92, 0x84, 0x00, 0xe0, 0x01, 0x28, + 0x20, 0xa9, 0x00, 0x20, 0x92, 0x92, 0x00, 0x20, 0x00, 0x08, 0x90, 0x16, + 0x20, 0xa1, 0x02, 0x40, 0x90, 0x06, 0x40, 0x04, 0x82, 0xff, 0x01, 0x20, + 0x68, 0x10, 0x80, 0x00, 0x68, 0x12, 0x0c, 0x60, 0x00, 0xde, 0x00, 0x05, + 0x00, 0xd6, 0x00, 0x96, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x78, 0x60, 0x56, + 0x90, 0x06, 0xa8, 0x36, 0xa8, 0x3a, 0xa9, 0x9c, 0xa9, 0x46, 0xa8, 0x4a, + 0x60, 0x23, 0x00, 0x03, 0x60, 0x07, 0x00, 0x40, 0x60, 0x03, 0x00, 0x03, + 0x60, 0x0b, 0xff, 0xff, 0xa8, 0x17, 0x00, 0x01, 0xa8, 0x42, 0xa8, 0x3e, + 0x29, 0x00, 0xa8, 0x5a, 0xa8, 0x13, 0x20, 0xc5, 0x08, 0x0c, 0x95, 0x64, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x9b, 0xd3, 0x01, 0x2e, + 0x00, 0x9e, 0x00, 0xde, 0x00, 0x05, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xd6, + 0x00, 0xc6, 0x00, 0xa6, 0x00, 0x96, 0x00, 0x66, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x71, 0x19, 0xe8, 0x76, 0x0c, 0x26, 0x60, 0x26, 0x78, + 0x8c, 0xff, 0x09, 0x04, 0xb1, 0x9d, 0x70, 0x24, 0x9c, 0x06, 0x15, 0x20, + 0x20, 0x69, 0x01, 0x00, 0x68, 0xc0, 0x90, 0x05, 0x09, 0x04, 0xb1, 0x6f, + 0x08, 0x0c, 0xa6, 0xe9, 0x68, 0xc3, 0x00, 0x00, 0x08, 0x0c, 0xac, 0x1b, + 0x70, 0x27, 0x00, 0x00, 0x00, 0x36, 0x20, 0x69, 0x01, 0x40, 0x6b, 0x04, + 0x93, 0x84, 0x10, 0x00, 0x01, 0x38, 0x20, 0x01, 0x01, 0x00, 0x08, 0x0c, + 0x2d, 0x39, 0x90, 0x06, 0x08, 0x0c, 0x2d, 0x39, 0x20, 0x69, 0x01, 0x00, + 0x68, 0x24, 0xd0, 0x84, 0x01, 0x10, 0x68, 0x27, 0x00, 0x01, 0x00, 0x3e, + 0x70, 0x0c, 0x9c, 0x36, 0x11, 0x10, 0x66, 0x0c, 0x76, 0x0e, 0x70, 0x08, + 0x9c, 0x36, 0x11, 0x40, 0x2c, 0x00, 0x9f, 0x36, 0x01, 0x18, 0x2f, 0x00, + 0x70, 0x0a, 0x00, 0x10, 0x70, 0x0b, 0x00, 0x00, 0x66, 0x0c, 0x00, 0x66, + 0x2c, 0x00, 0x9f, 0x06, 0x01, 0x10, 0x7e, 0x0e, 0x00, 0x08, 0x26, 0x78, + 0x60, 0x0f, 0x00, 0x00, 0x08, 0x0c, 0xd2, 0xcf, 0x11, 0x80, 0x08, 0x0c, + 0x32, 0x79, 0x08, 0x0c, 0xd2, 0xe0, 0x15, 0x18, 0x08, 0x0c, 0xbc, 0xb6, + 0x04, 0x00, 0x08, 0x0c, 0xac, 0x1b, 0x68, 0x24, 0xd0, 0x84, 0x09, 0xb0, + 0x68, 0x27, 0x00, 0x01, 0x08, 0x98, 0x08, 0x0c, 0xd2, 0xe0, 0x11, 0x18, + 0x08, 0x0c, 0xbc, 0xb6, 0x00, 0x90, 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, + 0xd0, 0xd6, 0x01, 0x68, 0x60, 0x20, 0x90, 0x86, 0x00, 0x03, 0x15, 0x20, + 0xa8, 0x67, 0x01, 0x03, 0xab, 0x7a, 0xa8, 0x77, 0x00, 0x00, 0x08, 0x0c, + 0x6e, 0x9f, 0x08, 0x0c, 0xd2, 0xc3, 0x08, 0x0c, 0xd5, 0x4c, 0x08, 0x0c, + 0xb3, 0x06, 0x08, 0x0c, 0xaa, 0xf1, 0x00, 0xce, 0x08, 0x04, 0xb1, 0x20, + 0x2c, 0x78, 0x60, 0x0c, 0x20, 0x60, 0x08, 0x04, 0xb1, 0x20, 0x70, 0x0f, + 0x00, 0x00, 0x70, 0x0b, 0x00, 0x00, 0x01, 0x2e, 0x00, 0x6e, 0x00, 0x9e, + 0x00, 0xae, 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, + 0x60, 0x20, 0x90, 0x86, 0x00, 0x06, 0x1d, 0x08, 0x08, 0x0c, 0xeb, 0xd4, + 0x08, 0xf0, 0x00, 0xd6, 0x01, 0x56, 0x08, 0x0c, 0xa1, 0x0c, 0x7a, 0x14, + 0x82, 0xff, 0x01, 0x38, 0x70, 0x03, 0x01, 0x00, 0x70, 0x0b, 0x00, 0x03, + 0x60, 0xc3, 0x00, 0x08, 0x04, 0x90, 0x70, 0x03, 0x02, 0x00, 0x70, 0x07, + 0x00, 0x00, 0x20, 0x69, 0x18, 0x00, 0x90, 0x1e, 0x68, 0x00, 0x90, 0x86, + 0x00, 0x04, 0x11, 0x10, 0xc3, 0x8d, 0x00, 0x60, 0x08, 0x0c, 0x76, 0x37, + 0x11, 0x10, 0xc3, 0xad, 0x00, 0x08, 0xc3, 0xa5, 0x6a, 0xdc, 0xd2, 0x9c, + 0x11, 0x10, 0xd2, 0xac, 0x01, 0x08, 0xc3, 0x9d, 0x73, 0x0e, 0x08, 0x0c, + 0x89, 0x4c, 0x20, 0xa9, 0x00, 0x06, 0x20, 0x11, 0xff, 0xec, 0x20, 0x19, + 0xff, 0xed, 0x20, 0x71, 0x02, 0x50, 0x23, 0x05, 0x20, 0x72, 0x8e, 0x70, + 0x22, 0x05, 0x20, 0x72, 0x8e, 0x70, 0x93, 0x98, 0x00, 0x02, 0x92, 0x90, + 0x00, 0x02, 0x1f, 0x04, 0xb1, 0xe3, 0x60, 0xc3, 0x00, 0x20, 0x08, 0x0c, + 0xa6, 0xbd, 0x01, 0x5e, 0x00, 0xde, 0x00, 0x05, 0x01, 0x56, 0x08, 0x0c, + 0xa1, 0x0c, 0x7a, 0x14, 0x82, 0xff, 0x01, 0x68, 0x92, 0x86, 0xff, 0xff, + 0x01, 0x18, 0x92, 0x82, 0x00, 0x0e, 0x12, 0x38, 0x70, 0x03, 0x01, 0x00, + 0x70, 0x0b, 0x00, 0x03, 0x60, 0xc3, 0x00, 0x08, 0x04, 0x88, 0x70, 0x03, + 0x02, 0x00, 0x70, 0x07, 0x00, 0x1c, 0x70, 0x0f, 0x00, 0x01, 0x20, 0x11, + 0x19, 0xbe, 0x22, 0x04, 0x80, 0x07, 0x70, 0x1a, 0x82, 0x10, 0x22, 0x04, + 0x80, 0x07, 0x70, 0x1e, 0x04, 0x21, 0x11, 0x20, 0xb8, 0xa0, 0x90, 0x82, + 0x00, 0x7f, 0x02, 0x48, 0x20, 0x01, 0x18, 0x1f, 0x20, 0x04, 0x70, 0x22, + 0x20, 0x01, 0x18, 0x20, 0x20, 0x04, 0x70, 0x26, 0x00, 0x30, 0x20, 0x01, + 0x18, 0x18, 0x20, 0x04, 0x90, 0x84, 0x00, 0xff, 0x70, 0x26, 0x20, 0xa9, + 0x00, 0x04, 0x20, 0xe1, 0x00, 0x01, 0x20, 0x99, 0x18, 0x05, 0x20, 0xe9, + 0x00, 0x00, 0x20, 0xa1, 0x02, 0x56, 0x40, 0x03, 0x60, 0xc3, 0x00, 0x1c, + 0x01, 0x5e, 0x08, 0x04, 0xa6, 0xbd, 0x00, 0x06, 0x20, 0x01, 0x18, 0x37, + 0x20, 0x04, 0xd0, 0xac, 0x00, 0x0e, 0x00, 0x05, 0x20, 0x11, 0x00, 0x03, + 0x08, 0x0c, 0xaa, 0xbf, 0x20, 0x11, 0x00, 0x02, 0x08, 0x0c, 0xaa, 0xc9, + 0x08, 0x0c, 0xa9, 0xd3, 0x00, 0x36, 0x90, 0x1e, 0x08, 0x0c, 0xaa, 0x49, + 0x00, 0x3e, 0x00, 0x05, 0x08, 0x0c, 0x33, 0xaf, 0x01, 0x88, 0x00, 0x16, + 0x00, 0xb6, 0x00, 0xc6, 0x70, 0x10, 0x90, 0x85, 0x00, 0x20, 0x70, 0x12, + 0x20, 0x09, 0x00, 0x7e, 0x08, 0x0c, 0x67, 0x24, 0xb8, 0x5c, 0xc0, 0xac, + 0xb8, 0x5e, 0x00, 0xce, 0x00, 0xbe, 0x00, 0x1e, 0x00, 0x05, 0x20, 0x71, + 0x18, 0x8d, 0x70, 0x00, 0x90, 0x05, 0x01, 0x40, 0x20, 0x01, 0x09, 0x76, + 0x20, 0x71, 0x18, 0x00, 0x70, 0x76, 0x70, 0x7a, 0x70, 0x6b, 0xff, 0xe0, + 0x20, 0x71, 0x18, 0x00, 0x70, 0x74, 0x70, 0x56, 0x70, 0x5b, 0x1c, 0xd0, + 0x00, 0x05, 0x00, 0xe6, 0x01, 0x26, 0x20, 0x71, 0x18, 0x00, 0x20, 0x91, + 0x80, 0x00, 0x75, 0x54, 0x95, 0x82, 0x00, 0x10, 0x06, 0x08, 0x70, 0x58, + 0x20, 0x60, 0x60, 0x00, 0x90, 0x86, 0x00, 0x00, 0x01, 0x48, 0x9c, 0xe0, + 0x00, 0x18, 0x70, 0x68, 0x9c, 0x02, 0x12, 0x08, 0x0c, 0xb0, 0x20, 0x61, + 0x1c, 0xd0, 0x0c, 0x98, 0x60, 0x03, 0x00, 0x08, 0x85, 0x29, 0x75, 0x56, + 0x9c, 0xa8, 0x00, 0x18, 0x70, 0x68, 0x95, 0x02, 0x12, 0x30, 0x75, 0x5a, + 0x90, 0x85, 0x00, 0x01, 0x01, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x70, 0x5b, + 0x1c, 0xd0, 0x0c, 0xc0, 0x90, 0x06, 0x0c, 0xc0, 0x00, 0xe6, 0x20, 0x71, + 0x18, 0x00, 0x75, 0x54, 0x95, 0x82, 0x00, 0x10, 0x06, 0x00, 0x70, 0x58, + 0x20, 0x60, 0x60, 0x00, 0x90, 0x86, 0x00, 0x00, 0x01, 0x48, 0x9c, 0xe0, + 0x00, 0x18, 0x70, 0x68, 0x9c, 0x02, 0x12, 0x08, 0x0c, 0xb0, 0x20, 0x61, + 0x1c, 0xd0, 0x0c, 0x98, 0x60, 0x03, 0x00, 0x08, 0x85, 0x29, 0x75, 0x56, + 0x9c, 0xa8, 0x00, 0x18, 0x70, 0x68, 0x95, 0x02, 0x12, 0x28, 0x75, 0x5a, + 0x90, 0x85, 0x00, 0x01, 0x00, 0xee, 0x00, 0x05, 0x70, 0x5b, 0x1c, 0xd0, + 0x0c, 0xc8, 0x90, 0x06, 0x0c, 0xc8, 0x9c, 0x82, 0x1c, 0xd0, 0x0a, 0x0c, + 0x0d, 0xc5, 0x20, 0x01, 0x18, 0x1a, 0x20, 0x04, 0x9c, 0x02, 0x1a, 0x0c, + 0x0d, 0xc5, 0x90, 0x06, 0x60, 0x06, 0x60, 0x0a, 0x60, 0x0e, 0x60, 0x16, + 0x60, 0x1a, 0x60, 0x12, 0x60, 0x23, 0x00, 0x00, 0x60, 0x03, 0x00, 0x00, + 0x60, 0x1e, 0x60, 0x56, 0x60, 0x5a, 0x60, 0x26, 0x60, 0x2a, 0x60, 0x2e, + 0x60, 0x32, 0x60, 0x36, 0x60, 0x3a, 0x60, 0x3e, 0x60, 0x42, 0x60, 0x2a, + 0x20, 0x61, 0x18, 0x00, 0x60, 0x54, 0x80, 0x00, 0x60, 0x56, 0x90, 0x86, + 0x00, 0x01, 0x01, 0x08, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x00, 0x16, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x1e, 0x01, 0x2e, 0x0c, 0xb0, + 0x00, 0x06, 0x60, 0x00, 0x90, 0x86, 0x00, 0x00, 0x01, 0xc0, 0x60, 0x1c, + 0xd0, 0x84, 0x19, 0x0c, 0x1a, 0x8e, 0x60, 0x17, 0x00, 0x00, 0x60, 0x23, + 0x00, 0x07, 0x20, 0x01, 0x19, 0x86, 0x20, 0x04, 0x00, 0x06, 0x90, 0x82, + 0x00, 0x51, 0x00, 0x0e, 0x02, 0x08, 0x80, 0x04, 0x60, 0x1a, 0x08, 0x0c, + 0xee, 0x87, 0x60, 0x43, 0x00, 0x00, 0x60, 0x13, 0x00, 0x00, 0x00, 0x0e, + 0x00, 0x05, 0x00, 0xe6, 0x01, 0x26, 0x20, 0x71, 0x18, 0x00, 0x20, 0x91, + 0x80, 0x00, 0x75, 0x54, 0x95, 0x82, 0x00, 0x01, 0x06, 0x08, 0x70, 0x58, + 0x20, 0x60, 0x60, 0x00, 0x90, 0x86, 0x00, 0x00, 0x01, 0x48, 0x9c, 0xe0, + 0x00, 0x18, 0x70, 0x68, 0x9c, 0x02, 0x12, 0x08, 0x0c, 0xb0, 0x20, 0x61, + 0x1c, 0xd0, 0x0c, 0x98, 0x60, 0x03, 0x00, 0x08, 0x85, 0x29, 0x75, 0x56, + 0x9c, 0xa8, 0x00, 0x18, 0x70, 0x68, 0x95, 0x02, 0x12, 0x30, 0x75, 0x5a, + 0x90, 0x85, 0x00, 0x01, 0x01, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x70, 0x5b, + 0x1c, 0xd0, 0x0c, 0xc0, 0x90, 0x06, 0x0c, 0xc0, 0x60, 0x20, 0x90, 0x84, + 0x00, 0x0f, 0x00, 0x02, 0xb3, 0x65, 0xb3, 0x6e, 0xb3, 0x89, 0xb3, 0xa4, + 0xd8, 0x2b, 0xd8, 0x48, 0xd8, 0x63, 0xb3, 0x65, 0xb3, 0x6e, 0x91, 0x00, + 0xb3, 0xbd, 0xb3, 0x65, 0xb3, 0x65, 0xb3, 0x65, 0xb3, 0x65, 0x91, 0x86, + 0x00, 0x13, 0x11, 0x28, 0x08, 0x0c, 0x99, 0xa5, 0x08, 0x0c, 0x9a, 0xb1, + 0x00, 0x05, 0x00, 0x05, 0x00, 0x66, 0x60, 0x00, 0x90, 0xb2, 0x00, 0x10, + 0x1a, 0x0c, 0x0d, 0xc5, 0x00, 0x13, 0x00, 0x6e, 0x00, 0x05, 0xb3, 0x87, + 0xbb, 0x05, 0xbc, 0xfd, 0xb3, 0x87, 0xbd, 0x93, 0xb6, 0xa0, 0xb3, 0x87, + 0xb3, 0x87, 0xba, 0x87, 0xc3, 0xb1, 0xb3, 0x87, 0xb3, 0x87, 0xb3, 0x87, + 0xb3, 0x87, 0xb3, 0x87, 0xb3, 0x87, 0x08, 0x0c, 0x0d, 0xc5, 0x00, 0x66, + 0x60, 0x00, 0x90, 0xb2, 0x00, 0x10, 0x1a, 0x0c, 0x0d, 0xc5, 0x00, 0x13, + 0x00, 0x6e, 0x00, 0x05, 0xb3, 0xa2, 0xca, 0x7e, 0xb3, 0xa2, 0xb3, 0xa2, + 0xb3, 0xa2, 0xb3, 0xa2, 0xb3, 0xa2, 0xb3, 0xa2, 0xca, 0x15, 0xcc, 0x00, + 0xb3, 0xa2, 0xca, 0xbf, 0xcb, 0x3e, 0xca, 0xbf, 0xcb, 0x3e, 0xb3, 0xa2, + 0x08, 0x0c, 0x0d, 0xc5, 0x60, 0x00, 0x90, 0x82, 0x00, 0x10, 0x1a, 0x0c, + 0x0d, 0xc5, 0x60, 0x00, 0x00, 0x02, 0xb3, 0xbb, 0xc3, 0xf8, 0xc4, 0xc0, + 0xc5, 0xf3, 0xc7, 0xa2, 0xb3, 0xbb, 0xb3, 0xbb, 0xb3, 0xbb, 0xc3, 0xcc, + 0xc9, 0xa1, 0xc9, 0xa4, 0xb3, 0xbb, 0xb3, 0xbb, 0xb3, 0xbb, 0xb3, 0xbb, + 0xc9, 0xd3, 0x08, 0x0c, 0x0d, 0xc5, 0x00, 0x66, 0x60, 0x00, 0x90, 0xb2, + 0x00, 0x10, 0x1a, 0x0c, 0x0d, 0xc5, 0x00, 0x13, 0x00, 0x6e, 0x00, 0x05, + 0xb3, 0xd6, 0xb3, 0xd6, 0xb4, 0x19, 0xb4, 0xb8, 0xb5, 0x4d, 0xb3, 0xd6, + 0xb3, 0xd6, 0xb3, 0xd6, 0xb3, 0xd8, 0xb3, 0xd6, 0xb3, 0xd6, 0xb3, 0xd6, + 0xb3, 0xd6, 0xb3, 0xd6, 0xb3, 0xd6, 0xb3, 0xd6, 0x08, 0x0c, 0x0d, 0xc5, + 0x91, 0x86, 0x00, 0x4c, 0x05, 0x88, 0x91, 0x86, 0x00, 0x03, 0x19, 0x0c, + 0x0d, 0xc5, 0x00, 0x96, 0x60, 0x1c, 0xc0, 0xed, 0x60, 0x1e, 0x60, 0x03, + 0x00, 0x03, 0x61, 0x06, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x7c, 0x90, 0x84, + 0xa0, 0x00, 0xc0, 0xb5, 0xa8, 0x7e, 0xa8, 0xac, 0xa8, 0x46, 0xa8, 0xb0, + 0xa8, 0x4a, 0x90, 0x06, 0xa8, 0x36, 0xa8, 0x3a, 0xa8, 0x84, 0x90, 0x92, + 0x19, 0x9a, 0x02, 0x10, 0x20, 0x01, 0x19, 0x99, 0x80, 0x03, 0x80, 0x13, + 0x82, 0x13, 0x92, 0x10, 0x62, 0x1a, 0x00, 0x9e, 0x2c, 0x10, 0x08, 0x0c, + 0x1b, 0xe0, 0x08, 0x0c, 0x95, 0x64, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x08, 0x0c, 0x9b, 0xd3, 0x01, 0x2e, 0x00, 0x05, 0x60, 0x10, 0x00, 0xb6, + 0x20, 0x58, 0xbc, 0xa0, 0x00, 0xbe, 0x2c, 0x00, 0x08, 0x0c, 0xb5, 0x6f, + 0x08, 0x0c, 0xd7, 0xfb, 0x60, 0x03, 0x00, 0x07, 0x00, 0x05, 0x00, 0xd6, + 0x00, 0x96, 0x00, 0xf6, 0x20, 0x79, 0x18, 0x00, 0x7a, 0x90, 0x60, 0x14, + 0x20, 0x48, 0xa8, 0x7c, 0xd0, 0xec, 0x11, 0x10, 0x92, 0x90, 0x00, 0x18, + 0xac, 0x78, 0xc4, 0xfc, 0x00, 0x46, 0xa8, 0xe0, 0x90, 0x05, 0x11, 0x40, + 0xa8, 0xdc, 0x92, 0x1a, 0x01, 0x40, 0x02, 0x20, 0xa8, 0x7b, 0x00, 0x07, + 0x20, 0x10, 0x00, 0x28, 0xa8, 0x7b, 0x00, 0x15, 0x00, 0x10, 0xa8, 0x7b, + 0x00, 0x00, 0x82, 0x14, 0xa8, 0x83, 0x00, 0x00, 0xaa, 0x02, 0x00, 0x06, + 0x00, 0x16, 0x00, 0x26, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x00, 0xf6, + 0x24, 0x00, 0x90, 0x05, 0x11, 0x08, 0x00, 0x9a, 0x21, 0x00, 0x90, 0x86, + 0x00, 0x15, 0x11, 0x18, 0x20, 0x01, 0x00, 0x01, 0x00, 0x38, 0x21, 0x00, + 0x90, 0x86, 0x00, 0x16, 0x01, 0x18, 0x20, 0x01, 0x00, 0x01, 0x00, 0x2a, + 0x94, 0xa4, 0x00, 0x07, 0x84, 0x23, 0x94, 0x05, 0x00, 0x02, 0xb4, 0x80, + 0xb4, 0x80, 0xb4, 0x7b, 0xb4, 0x7e, 0xb4, 0x80, 0xb4, 0x78, 0xb4, 0x6b, + 0xb4, 0x6b, 0xb4, 0x6b, 0xb4, 0x6b, 0xb4, 0x6b, 0xb4, 0x6b, 0xb4, 0x6b, + 0xb4, 0x6b, 0xb4, 0x6b, 0xb4, 0x6b, 0x00, 0xfe, 0x00, 0xee, 0x00, 0xde, + 0x00, 0xce, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x4e, 0x00, 0xfe, + 0x00, 0x9e, 0x00, 0xde, 0x08, 0x0c, 0x0d, 0xc5, 0x08, 0x0c, 0xbf, 0xab, + 0x00, 0x28, 0x08, 0x0c, 0xc0, 0xe9, 0x00, 0x10, 0x08, 0x0c, 0xc1, 0xdf, + 0x00, 0xfe, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x00, 0x2e, 0x00, 0x1e, + 0x2c, 0x00, 0xa8, 0x96, 0x00, 0x0e, 0x08, 0x0c, 0xb6, 0x2d, 0x05, 0x30, + 0xa8, 0x04, 0xa8, 0x0e, 0x00, 0xa6, 0x20, 0x50, 0xb1, 0x00, 0x00, 0xae, + 0x80, 0x06, 0x80, 0x06, 0x80, 0x07, 0x90, 0xbc, 0x00, 0x3f, 0x90, 0x84, + 0xff, 0xc0, 0x90, 0x80, 0x00, 0x02, 0xaa, 0xcc, 0xab, 0xd0, 0xac, 0xd4, + 0xad, 0xd8, 0x20, 0x31, 0x00, 0x00, 0x20, 0x41, 0x12, 0x6c, 0x08, 0x0c, + 0xb7, 0xf1, 0x01, 0x60, 0x00, 0x0e, 0x90, 0x05, 0x01, 0x20, 0x00, 0xfe, + 0x00, 0x9e, 0x00, 0xde, 0x00, 0x05, 0x00, 0xfe, 0x00, 0x9e, 0x00, 0xde, + 0x08, 0x04, 0xb2, 0xd3, 0x20, 0x01, 0x00, 0x2c, 0x90, 0x0e, 0x08, 0x0c, + 0xb6, 0x93, 0x0c, 0x70, 0x91, 0xb6, 0x00, 0x15, 0x01, 0x70, 0x91, 0xb6, + 0x00, 0x16, 0x01, 0x58, 0x91, 0xb2, 0x00, 0x47, 0x0a, 0x0c, 0x0d, 0xc5, + 0x91, 0xb2, 0x00, 0x50, 0x1a, 0x0c, 0x0d, 0xc5, 0x91, 0x82, 0x00, 0x47, + 0x00, 0xca, 0x20, 0x01, 0x01, 0x09, 0x20, 0x04, 0xd0, 0x8c, 0x01, 0x98, + 0x01, 0x26, 0x20, 0x91, 0x28, 0x00, 0x00, 0x06, 0x00, 0x16, 0x00, 0x26, + 0x08, 0x0c, 0x94, 0xb1, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x0e, 0x01, 0x2e, + 0xa0, 0x01, 0x60, 0x00, 0x90, 0x86, 0x00, 0x02, 0x11, 0x10, 0x08, 0x04, + 0xb4, 0x19, 0x00, 0x05, 0xb4, 0xeb, 0xb4, 0xeb, 0xb4, 0xed, 0xb5, 0x23, + 0xb4, 0xeb, 0xb4, 0xeb, 0xb4, 0xeb, 0xb4, 0xeb, 0xb5, 0x36, 0x08, 0x0c, + 0x0d, 0xc5, 0x00, 0xd6, 0x00, 0x16, 0x00, 0x96, 0x08, 0x0c, 0x9a, 0x61, + 0x08, 0x0c, 0x9b, 0xd3, 0x60, 0x03, 0x00, 0x04, 0x61, 0x14, 0x21, 0x48, + 0xa8, 0x7c, 0xd0, 0xfc, 0x01, 0xc0, 0xa8, 0x78, 0xc0, 0xfc, 0x90, 0x05, + 0x11, 0x58, 0xa8, 0x94, 0x90, 0x05, 0x01, 0x40, 0x20, 0x01, 0x00, 0x00, + 0x90, 0x0e, 0x08, 0x0c, 0xb6, 0x93, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0xa8, + 0x60, 0x03, 0x00, 0x02, 0xa8, 0xa4, 0xa9, 0xa8, 0x91, 0x05, 0x11, 0x78, + 0xa8, 0xae, 0xa8, 0xb2, 0x0c, 0x78, 0xa8, 0x7f, 0x00, 0x20, 0xa8, 0x8c, + 0xa8, 0x8a, 0xa8, 0xa4, 0xa8, 0xae, 0xa8, 0xa8, 0xa8, 0xb2, 0xa8, 0xc7, + 0x00, 0x00, 0xa8, 0xcb, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x1e, 0x00, 0xde, + 0x00, 0x05, 0x08, 0x0c, 0x9a, 0x61, 0x00, 0xd6, 0x00, 0x96, 0x61, 0x14, + 0x21, 0x48, 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0x20, 0xa8, 0x7b, 0x00, 0x06, + 0x08, 0x0c, 0x6e, 0x9f, 0x00, 0x9e, 0x00, 0xde, 0x08, 0x0c, 0xb2, 0xd3, + 0x08, 0x04, 0x9b, 0xd3, 0x08, 0x0c, 0x9a, 0x61, 0x08, 0x0c, 0x32, 0x50, + 0x08, 0x0c, 0xd7, 0xf8, 0x00, 0xd6, 0x00, 0x96, 0x61, 0x14, 0x21, 0x48, + 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0x20, 0xa8, 0x7b, 0x00, 0x29, 0x08, 0x0c, + 0x6e, 0x9f, 0x00, 0x9e, 0x00, 0xde, 0x08, 0x0c, 0xb2, 0xd3, 0x08, 0x04, + 0x9b, 0xd3, 0x91, 0x82, 0x00, 0x47, 0x00, 0x02, 0xb5, 0x5d, 0xb5, 0x5f, + 0xb5, 0x5d, 0xb5, 0x5d, 0xb5, 0x5d, 0xb5, 0x5d, 0xb5, 0x5d, 0xb5, 0x5d, + 0xb5, 0x5d, 0xb5, 0x5d, 0xb5, 0x5d, 0xb5, 0x5d, 0xb5, 0x5f, 0x08, 0x0c, + 0x0d, 0xc5, 0x00, 0xd6, 0x00, 0x96, 0x60, 0x1f, 0x00, 0x00, 0x61, 0x14, + 0x21, 0x48, 0xa8, 0x7b, 0x00, 0x00, 0xa8, 0x83, 0x00, 0x00, 0x08, 0x0c, + 0x6e, 0x9f, 0x00, 0x9e, 0x00, 0xde, 0x08, 0x04, 0xb2, 0xd3, 0x00, 0x26, + 0x00, 0x36, 0x00, 0x56, 0x00, 0x66, 0x00, 0x96, 0x00, 0xa6, 0x00, 0xf6, + 0x00, 0x06, 0x08, 0x0c, 0x10, 0x0e, 0x00, 0x0e, 0x09, 0x0c, 0x0d, 0xc5, + 0xa9, 0x60, 0x21, 0xe8, 0xa9, 0x5c, 0x91, 0x88, 0x00, 0x19, 0x21, 0xa0, + 0x90, 0x0e, 0x20, 0xa9, 0x00, 0x20, 0x41, 0x04, 0xa8, 0x7a, 0x20, 0x79, + 0x18, 0x00, 0x79, 0x90, 0x91, 0x88, 0x00, 0x18, 0x91, 0x8c, 0x0f, 0xff, + 0xa9, 0x72, 0xac, 0x76, 0x29, 0x50, 0x00, 0xa6, 0x20, 0x01, 0x02, 0x05, + 0x20, 0x03, 0x00, 0x00, 0x90, 0x1e, 0x20, 0x29, 0x00, 0x01, 0x91, 0x82, + 0x00, 0x35, 0x12, 0x28, 0x20, 0x11, 0x00, 0x1f, 0x08, 0x0c, 0xcc, 0x85, + 0x04, 0xc0, 0x21, 0x30, 0x20, 0x09, 0x00, 0x34, 0x20, 0x11, 0x00, 0x1f, + 0x08, 0x0c, 0xcc, 0x85, 0x96, 0xb2, 0x00, 0x34, 0xb0, 0x04, 0x90, 0x4d, + 0x01, 0x10, 0x08, 0x0c, 0x0f, 0xc0, 0x08, 0x0c, 0x10, 0x0e, 0x01, 0xd0, + 0x85, 0x28, 0xa8, 0x67, 0x01, 0x10, 0xa8, 0x6b, 0x00, 0x00, 0x29, 0x20, + 0xb4, 0x06, 0x96, 0x8a, 0x00, 0x3d, 0x12, 0x30, 0x26, 0x08, 0x20, 0x11, + 0x00, 0x1b, 0x08, 0x0c, 0xcc, 0x85, 0x00, 0xb8, 0x96, 0xb2, 0x00, 0x3c, + 0x20, 0x09, 0x00, 0x3c, 0x29, 0x50, 0x20, 0x11, 0x00, 0x1b, 0x08, 0x0c, + 0xcc, 0x85, 0x0c, 0x18, 0x20, 0x01, 0x02, 0x05, 0x20, 0x03, 0x00, 0x00, + 0x00, 0xae, 0x85, 0x2f, 0x95, 0xad, 0x00, 0x50, 0xb5, 0x66, 0xb0, 0x70, + 0xc0, 0xfd, 0xb0, 0x72, 0x00, 0x48, 0x20, 0x01, 0x02, 0x05, 0x20, 0x03, + 0x00, 0x00, 0x00, 0xae, 0x85, 0x2f, 0x95, 0xad, 0x00, 0x50, 0xb5, 0x66, + 0x2a, 0x48, 0xa8, 0x04, 0xa8, 0x07, 0x00, 0x00, 0x00, 0x06, 0x08, 0x0c, + 0x6e, 0x9f, 0x00, 0x0e, 0x20, 0x48, 0x90, 0x05, 0x1d, 0xb0, 0x00, 0xfe, + 0x00, 0xae, 0x00, 0x9e, 0x00, 0x6e, 0x00, 0x5e, 0x00, 0x3e, 0x00, 0x2e, + 0x00, 0x05, 0x00, 0xd6, 0x00, 0xf6, 0x00, 0x96, 0x00, 0x06, 0x08, 0x0c, + 0x10, 0x0e, 0x00, 0x0e, 0x09, 0x0c, 0x0d, 0xc5, 0xa9, 0x60, 0x21, 0xe8, + 0xa9, 0x5c, 0x91, 0x88, 0x00, 0x19, 0x21, 0xa0, 0x90, 0x0e, 0x20, 0xa9, + 0x00, 0x20, 0x41, 0x04, 0xaa, 0x66, 0xa8, 0x7a, 0x20, 0x79, 0x18, 0x00, + 0x79, 0x90, 0x81, 0x0c, 0x91, 0x88, 0x00, 0x0c, 0x91, 0x82, 0x00, 0x1a, + 0x02, 0x10, 0x20, 0x09, 0x00, 0x1a, 0x21, 0xa8, 0x81, 0x0b, 0xa9, 0x72, + 0xac, 0x76, 0x2e, 0x98, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x1f, 0x20, 0xa0, + 0x20, 0x01, 0x02, 0x05, 0x20, 0x0c, 0x91, 0x8d, 0x00, 0x80, 0x21, 0x02, + 0x40, 0x03, 0x20, 0x03, 0x00, 0x00, 0x08, 0x0c, 0x6e, 0x9f, 0x00, 0x9e, + 0x00, 0xfe, 0x00, 0xde, 0x00, 0x05, 0x00, 0x16, 0x00, 0xd6, 0x00, 0xf6, + 0x00, 0x96, 0x00, 0x16, 0x20, 0x01, 0x02, 0x05, 0x20, 0x0c, 0x91, 0x8d, + 0x00, 0x80, 0x21, 0x02, 0x00, 0x1e, 0x20, 0x79, 0x02, 0x00, 0x2e, 0x98, + 0xa8, 0x7c, 0xd0, 0xec, 0x01, 0x18, 0x9e, 0x80, 0x00, 0x0c, 0x20, 0x98, + 0x20, 0x21, 0x00, 0x3e, 0x90, 0x1e, 0x92, 0x82, 0x00, 0x20, 0x02, 0x18, + 0x20, 0x11, 0x00, 0x20, 0x20, 0x18, 0x94, 0x86, 0x00, 0x3e, 0x11, 0x70, + 0x00, 0x96, 0x08, 0x0c, 0x10, 0x0e, 0x29, 0x00, 0x00, 0x9e, 0x05, 0xc0, + 0xa8, 0x06, 0x20, 0x48, 0xa8, 0x60, 0x20, 0xe8, 0xa8, 0x5c, 0x90, 0x80, + 0x00, 0x02, 0x20, 0xa0, 0x33, 0x00, 0x90, 0x8e, 0x02, 0x60, 0x01, 0x40, + 0x20, 0x09, 0x02, 0x80, 0x91, 0x02, 0x92, 0x0a, 0x02, 0x18, 0x20, 0x10, + 0x21, 0x00, 0x93, 0x18, 0x22, 0x00, 0x94, 0x02, 0x12, 0x28, 0x24, 0x00, + 0x92, 0x02, 0x24, 0x10, 0x93, 0x18, 0x90, 0x06, 0x20, 0x20, 0x22, 0xa8, + 0xa8, 0x00, 0x92, 0x00, 0xa8, 0x02, 0x20, 0xe1, 0x00, 0x00, 0x40, 0x03, + 0x83, 0xff, 0x01, 0x80, 0x33, 0x00, 0x90, 0x86, 0x02, 0x80, 0x11, 0x30, + 0x78, 0x14, 0x80, 0x00, 0x90, 0x85, 0x00, 0x80, 0x78, 0x16, 0x2e, 0x98, + 0x23, 0x10, 0x84, 0xff, 0x09, 0x04, 0xb6, 0x42, 0x08, 0x04, 0xb6, 0x44, + 0x90, 0x85, 0x00, 0x01, 0x78, 0x17, 0x00, 0x00, 0x00, 0x9e, 0x00, 0xfe, + 0x00, 0xde, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xd6, 0x00, 0x36, 0x00, 0x96, + 0x63, 0x14, 0x23, 0x48, 0xa8, 0x7a, 0xa9, 0x82, 0x08, 0x0c, 0x6e, 0x92, + 0x00, 0x9e, 0x00, 0x3e, 0x00, 0xde, 0x00, 0x05, 0x91, 0xb6, 0x00, 0x15, + 0x11, 0x18, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x30, 0x91, 0xb6, 0x00, 0x16, + 0x19, 0x0c, 0x0d, 0xc5, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x05, 0x20, 0xa9, + 0x00, 0x0e, 0x20, 0xe1, 0x00, 0x00, 0x2e, 0x98, 0x60, 0x14, 0x00, 0x96, + 0x20, 0x48, 0xa8, 0x60, 0x20, 0xe8, 0xa8, 0x5c, 0x20, 0xa0, 0x00, 0x9e, + 0x40, 0x03, 0x91, 0x96, 0x00, 0x16, 0x01, 0xf0, 0x01, 0x36, 0x90, 0x80, + 0x00, 0x1b, 0x20, 0xa0, 0x20, 0x11, 0x00, 0x06, 0x20, 0xa9, 0x00, 0x01, + 0x34, 0x18, 0x83, 0x18, 0x23, 0xa0, 0x40, 0x03, 0x33, 0x18, 0x83, 0x18, + 0x23, 0x98, 0x82, 0x11, 0x1d, 0xb8, 0x20, 0x11, 0x00, 0x06, 0x01, 0x3e, + 0x20, 0xa0, 0x33, 0x18, 0x83, 0x18, 0x23, 0x98, 0x40, 0x03, 0x34, 0x18, + 0x83, 0x18, 0x23, 0xa0, 0x82, 0x11, 0x1d, 0xb8, 0x00, 0x96, 0x08, 0x0c, + 0xd0, 0xd8, 0x01, 0x30, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x07, 0x00, 0x00, + 0xa8, 0x67, 0x01, 0x03, 0x00, 0x9e, 0x08, 0x04, 0xb2, 0xd3, 0x00, 0x96, + 0x00, 0xd6, 0x00, 0x36, 0x73, 0x30, 0x93, 0x86, 0x02, 0x00, 0x11, 0xa8, + 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0xcf, 0x00, 0x00, 0x00, 0xbe, + 0x60, 0x14, 0x90, 0x05, 0x01, 0x30, 0x20, 0x48, 0xa8, 0x07, 0x00, 0x00, + 0xa8, 0x67, 0x01, 0x03, 0xab, 0x32, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x3e, + 0x00, 0xde, 0x00, 0x9e, 0x00, 0x05, 0x00, 0x11, 0x1d, 0x48, 0x0c, 0xc8, + 0x00, 0x06, 0x00, 0x16, 0x08, 0x0c, 0xd7, 0xe3, 0x01, 0x88, 0x60, 0x14, + 0x90, 0x05, 0x11, 0x70, 0x60, 0x0b, 0x00, 0x03, 0x60, 0x1b, 0x00, 0x00, + 0x60, 0x43, 0x00, 0x00, 0x20, 0x09, 0x00, 0x22, 0x08, 0x0c, 0xba, 0xdd, + 0x90, 0x06, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, 0x90, 0x85, 0x00, 0x01, + 0x0c, 0xd0, 0x00, 0x96, 0x00, 0x16, 0x20, 0xa9, 0x00, 0x14, 0x9e, 0x80, + 0x00, 0x0c, 0x20, 0xe1, 0x00, 0x00, 0x20, 0x98, 0x60, 0x14, 0x20, 0x48, + 0xa8, 0x60, 0x20, 0xe8, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x02, 0x20, 0xa0, + 0x40, 0x03, 0x20, 0x01, 0x02, 0x05, 0x20, 0x03, 0x00, 0x01, 0x20, 0x99, + 0x02, 0x60, 0x20, 0xa9, 0x00, 0x16, 0x40, 0x03, 0x20, 0xa9, 0x00, 0x0a, + 0xa8, 0x04, 0x20, 0x48, 0xa8, 0x60, 0x20, 0xe8, 0xa8, 0x5c, 0x90, 0x80, + 0x00, 0x02, 0x20, 0xa0, 0x40, 0x03, 0x20, 0x01, 0x02, 0x05, 0x20, 0x03, + 0x00, 0x02, 0x20, 0x99, 0x02, 0x60, 0x20, 0xa9, 0x00, 0x20, 0x40, 0x03, + 0x20, 0x03, 0x00, 0x00, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x00, 0x20, 0x48, + 0xa8, 0x67, 0x01, 0x03, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x1e, 0x00, 0x9e, + 0x00, 0x05, 0x00, 0x96, 0x00, 0x16, 0x90, 0x0e, 0x70, 0x30, 0x90, 0x86, + 0x01, 0x00, 0x01, 0x40, 0x70, 0x38, 0x90, 0x84, 0x00, 0xff, 0x80, 0x0c, + 0x70, 0x3c, 0x90, 0x84, 0x00, 0xff, 0x80, 0x04, 0x90, 0x80, 0x00, 0x04, + 0x91, 0x08, 0x81, 0x0b, 0x20, 0x11, 0x00, 0x02, 0x20, 0x19, 0x00, 0x0c, + 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0xcc, 0x85, 0x08, 0x0c, 0xd0, 0xd8, + 0x01, 0x40, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x07, 0x00, 0x00, 0xa8, 0x64, + 0xa8, 0xe2, 0xa8, 0x67, 0x01, 0x03, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x1e, + 0x00, 0x9e, 0x00, 0x05, 0x00, 0x16, 0x20, 0x09, 0x00, 0x00, 0x70, 0x30, + 0x90, 0x86, 0x02, 0x00, 0x01, 0x10, 0x20, 0x09, 0x00, 0x01, 0x00, 0x96, + 0x60, 0x14, 0x90, 0x4d, 0x09, 0x0c, 0x0d, 0xc5, 0xa9, 0x7a, 0x08, 0x0c, + 0x6e, 0x9f, 0x00, 0x9e, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x1e, 0x00, 0x05, + 0x00, 0x16, 0x00, 0x96, 0x70, 0x30, 0x90, 0x86, 0x01, 0x00, 0x11, 0x18, + 0x20, 0x09, 0x00, 0x04, 0x00, 0x10, 0x70, 0x34, 0x80, 0x0c, 0x81, 0x0b, + 0x20, 0x11, 0x00, 0x0c, 0x20, 0x19, 0x00, 0x0c, 0x60, 0x14, 0x20, 0x48, + 0xa8, 0x04, 0x00, 0x96, 0x90, 0x05, 0x01, 0x08, 0x20, 0x48, 0x08, 0x0c, + 0xcc, 0x85, 0x00, 0x9e, 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0x48, 0xa8, 0x04, + 0x90, 0x05, 0x11, 0x58, 0xa8, 0x07, 0x00, 0x00, 0xa8, 0x64, 0xa8, 0xe2, + 0xa8, 0x67, 0x01, 0x03, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x9e, 0x00, 0x1e, + 0x00, 0x05, 0x00, 0x86, 0x20, 0x40, 0xa0, 0x30, 0x80, 0x07, 0x90, 0x86, + 0x01, 0x00, 0x11, 0x18, 0x08, 0x0c, 0xbc, 0xb6, 0x00, 0xe0, 0xa0, 0x34, + 0x80, 0x07, 0x80, 0x0c, 0x88, 0x06, 0x80, 0x06, 0x80, 0x07, 0x90, 0xbc, + 0x00, 0x3f, 0x90, 0x84, 0xff, 0xc0, 0x90, 0x80, 0x00, 0x0c, 0xa8, 0x7b, + 0x00, 0x00, 0xa8, 0x83, 0x00, 0x00, 0xa8, 0x97, 0x40, 0x00, 0xaa, 0xa0, + 0xab, 0x9c, 0xac, 0xa8, 0xad, 0xa4, 0x20, 0x31, 0x00, 0x00, 0x20, 0x41, + 0x12, 0x52, 0x00, 0x19, 0x0d, 0x08, 0x00, 0x8e, 0x08, 0x98, 0x00, 0x96, + 0x00, 0x06, 0x08, 0x0c, 0x10, 0x0e, 0x00, 0x0e, 0x01, 0xb0, 0xa8, 0xab, + 0x0d, 0xcb, 0xa8, 0x76, 0x00, 0x0e, 0xa8, 0xa2, 0x00, 0x06, 0xae, 0x6a, + 0x28, 0x00, 0xa8, 0x9e, 0xa9, 0x7a, 0xaf, 0x72, 0xaa, 0x8e, 0xab, 0x92, + 0xac, 0x96, 0xad, 0x9a, 0x00, 0x86, 0x29, 0x40, 0x08, 0x0c, 0x10, 0xf8, + 0x00, 0x8e, 0x90, 0x85, 0x00, 0x01, 0x00, 0x9e, 0x00, 0x05, 0x00, 0xe6, + 0x00, 0xd6, 0x00, 0x26, 0x70, 0x08, 0x90, 0x84, 0x00, 0xff, 0x62, 0x10, + 0x00, 0xb6, 0x22, 0x58, 0xba, 0x10, 0x00, 0xbe, 0x92, 0x06, 0x15, 0x20, + 0x70, 0x0c, 0x62, 0x10, 0x00, 0xb6, 0x22, 0x58, 0xba, 0x14, 0x00, 0xbe, + 0x92, 0x06, 0x11, 0xe0, 0x60, 0x43, 0x00, 0x00, 0x2c, 0x68, 0x00, 0x16, + 0x20, 0x09, 0x00, 0x35, 0x08, 0x0c, 0xd7, 0x59, 0x00, 0x1e, 0x11, 0x58, + 0x62, 0x2c, 0x22, 0x68, 0x20, 0x71, 0x02, 0x6c, 0x6b, 0x20, 0x93, 0x86, + 0x00, 0x03, 0x01, 0x30, 0x93, 0x86, 0x00, 0x06, 0x01, 0x28, 0x08, 0x0c, + 0xb2, 0xd3, 0x00, 0x20, 0x00, 0x39, 0x00, 0x10, 0x08, 0x0c, 0xb9, 0x10, + 0x00, 0x2e, 0x00, 0xde, 0x00, 0xee, 0x00, 0x05, 0x00, 0x96, 0x68, 0x14, + 0x20, 0x48, 0x91, 0x86, 0x00, 0x15, 0x09, 0x04, 0xb8, 0xf8, 0x91, 0x8e, + 0x00, 0x16, 0x19, 0x04, 0xb9, 0x0e, 0x70, 0x0c, 0x90, 0x8c, 0xff, 0x00, + 0x91, 0x86, 0x17, 0x00, 0x01, 0x20, 0x91, 0x86, 0x03, 0x00, 0x19, 0x04, + 0xb8, 0xd2, 0x89, 0xff, 0x11, 0x38, 0x68, 0x00, 0x90, 0x86, 0x00, 0x0f, + 0x09, 0x04, 0xb8, 0xb5, 0x08, 0x04, 0xb9, 0x0c, 0x68, 0x08, 0x90, 0x86, + 0xff, 0xff, 0x19, 0x04, 0xb8, 0xfa, 0xa8, 0x7c, 0x90, 0x84, 0x00, 0x60, + 0x90, 0x86, 0x00, 0x20, 0x11, 0x28, 0xa8, 0x3c, 0xa9, 0x40, 0x91, 0x05, + 0x19, 0x04, 0xb8, 0xfa, 0x68, 0x24, 0xd0, 0x84, 0x19, 0x04, 0xb8, 0xfa, + 0xd0, 0xb4, 0x01, 0x58, 0x00, 0x16, 0x20, 0x01, 0x19, 0x86, 0x20, 0x0c, + 0x60, 0x18, 0x91, 0x02, 0x90, 0x82, 0x00, 0x05, 0x00, 0x1e, 0x1a, 0x04, + 0xb8, 0xfa, 0x08, 0x0c, 0xd2, 0xc3, 0x68, 0x5c, 0xa8, 0x82, 0xa8, 0x7c, + 0xc0, 0xdc, 0xc0, 0xf4, 0xc0, 0xd4, 0xa8, 0x7e, 0x00, 0x26, 0x90, 0x0e, + 0x6a, 0x18, 0x20, 0x01, 0x00, 0x0a, 0x08, 0x0c, 0x93, 0x75, 0xa8, 0x84, + 0x92, 0x0a, 0x02, 0x08, 0x80, 0x11, 0xaa, 0x86, 0x82, 0xff, 0x00, 0x2e, + 0x11, 0x38, 0x00, 0xc6, 0x2d, 0x60, 0x08, 0x0c, 0xcd, 0xe3, 0x00, 0xce, + 0x08, 0x04, 0xb9, 0x0c, 0x00, 0xc6, 0xa8, 0x68, 0xd0, 0xfc, 0x11, 0x18, + 0x08, 0x0c, 0x61, 0xc2, 0x00, 0x10, 0x08, 0x0c, 0x65, 0xcf, 0x00, 0xce, + 0x19, 0x04, 0xb8, 0xfa, 0x00, 0xc6, 0x2d, 0x60, 0x08, 0x0c, 0xb2, 0xd3, + 0x00, 0xce, 0x08, 0x04, 0xb9, 0x0c, 0x00, 0xc6, 0x08, 0x0c, 0xb3, 0x25, + 0x01, 0x98, 0x60, 0x17, 0x00, 0x00, 0x68, 0x10, 0x60, 0x12, 0x08, 0x0c, + 0xd5, 0x54, 0x60, 0x23, 0x00, 0x03, 0x69, 0x04, 0x00, 0xc6, 0x2d, 0x60, + 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0xce, 0x08, 0x0c, 0xb3, 0x52, 0x00, 0xce, + 0x08, 0x04, 0xb9, 0x0c, 0x20, 0x01, 0x19, 0x88, 0x20, 0x04, 0x68, 0x42, + 0x00, 0xce, 0x04, 0xd0, 0x70, 0x08, 0x90, 0x86, 0x00, 0x0b, 0x11, 0xc8, + 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb9, 0x00, 0xc1, 0xbc, 0xb9, 0x02, + 0x00, 0xbe, 0x00, 0xc6, 0x2d, 0x60, 0xa8, 0x7b, 0x00, 0x03, 0x08, 0x0c, + 0xd7, 0x9d, 0x60, 0x07, 0x00, 0x85, 0x60, 0x03, 0x00, 0x0b, 0x60, 0x23, + 0x00, 0x02, 0x08, 0x0c, 0x94, 0xff, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0xce, + 0x00, 0xe8, 0x70, 0x0c, 0x90, 0x86, 0x2a, 0x00, 0x11, 0x38, 0x20, 0x01, + 0x19, 0x88, 0x20, 0x04, 0x68, 0x42, 0x00, 0xa0, 0x04, 0x79, 0x00, 0xa0, + 0x89, 0xff, 0x09, 0x0c, 0x0d, 0xc5, 0x00, 0xc6, 0x00, 0xd6, 0x2d, 0x60, + 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x7b, 0x00, 0x03, 0x08, 0x0c, 0x6c, 0xb9, + 0x08, 0x0c, 0xd2, 0xc3, 0x08, 0x0c, 0xb3, 0x06, 0x00, 0xde, 0x00, 0xce, + 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x9e, 0x00, 0x05, 0x91, 0x86, 0x00, 0x15, + 0x11, 0x28, 0x20, 0x01, 0x19, 0x88, 0x20, 0x04, 0x68, 0x42, 0x00, 0x68, + 0x91, 0x8e, 0x00, 0x16, 0x11, 0x60, 0x00, 0xc6, 0x2d, 0x00, 0x20, 0x60, + 0x08, 0x0c, 0xee, 0x87, 0x08, 0x0c, 0x8a, 0x25, 0x08, 0x0c, 0xb2, 0xd3, + 0x00, 0xce, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x05, 0x00, 0x26, 0x00, 0x36, + 0x00, 0x46, 0x72, 0x28, 0xac, 0xb0, 0xab, 0xac, 0xd2, 0xf4, 0x01, 0x30, + 0x20, 0x01, 0x19, 0x88, 0x20, 0x04, 0x68, 0x42, 0x08, 0x04, 0xb9, 0x8a, + 0x00, 0xc6, 0x2d, 0x60, 0x08, 0x0c, 0xcc, 0xe6, 0x00, 0xce, 0x68, 0x04, + 0x90, 0x86, 0x00, 0x50, 0x11, 0x68, 0x00, 0xc6, 0x2d, 0x00, 0x20, 0x60, + 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x50, 0x08, 0x0c, 0x94, 0xff, + 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0xce, 0x04, 0xf0, 0x68, 0x00, 0x90, 0x86, + 0x00, 0x0f, 0x01, 0xa8, 0x89, 0xff, 0x09, 0x0c, 0x0d, 0xc5, 0x68, 0x00, + 0x90, 0x86, 0x00, 0x04, 0x11, 0x90, 0xa8, 0x7c, 0xd0, 0xac, 0x01, 0x78, + 0xa8, 0x43, 0x0f, 0xff, 0xa8, 0x3f, 0x0f, 0xff, 0xa8, 0x80, 0xc0, 0xfc, + 0xa8, 0x82, 0x20, 0x01, 0x00, 0x01, 0x68, 0x32, 0x04, 0x00, 0x20, 0x01, + 0x00, 0x07, 0x68, 0x32, 0x00, 0xe0, 0xa8, 0x7c, 0xd0, 0xb4, 0x11, 0x50, + 0xd0, 0xac, 0x0d, 0xb8, 0x68, 0x24, 0xd0, 0xf4, 0x1d, 0x48, 0xa8, 0x38, + 0xa9, 0x34, 0x91, 0x05, 0x0d, 0x80, 0x0c, 0x20, 0xd2, 0xec, 0x1d, 0x68, + 0x70, 0x24, 0x93, 0x06, 0x11, 0x18, 0x70, 0x20, 0x94, 0x06, 0x0d, 0x38, + 0x70, 0x20, 0x68, 0x3e, 0x70, 0x24, 0x68, 0x3a, 0x20, 0x01, 0x00, 0x05, + 0x68, 0x32, 0x08, 0x0c, 0xd4, 0x4b, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x10, + 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x05, + 0x00, 0xe6, 0x00, 0xd6, 0x00, 0x26, 0x70, 0x08, 0x90, 0x84, 0x00, 0xff, + 0x62, 0x10, 0x00, 0xb6, 0x22, 0x58, 0xba, 0x10, 0x00, 0xbe, 0x92, 0x06, + 0x19, 0x04, 0xb9, 0xf5, 0x70, 0x0c, 0x62, 0x10, 0x00, 0xb6, 0x22, 0x58, + 0xba, 0x14, 0x00, 0xbe, 0x92, 0x06, 0x19, 0x04, 0xb9, 0xf5, 0x60, 0x38, + 0x20, 0x68, 0x68, 0x24, 0xc0, 0xdc, 0x68, 0x26, 0x6a, 0x20, 0x92, 0x86, + 0x00, 0x07, 0x09, 0x04, 0xb9, 0xf5, 0x92, 0x86, 0x00, 0x02, 0x09, 0x04, + 0xb9, 0xf5, 0x92, 0x86, 0x00, 0x00, 0x05, 0xe8, 0x68, 0x08, 0x63, 0x3c, + 0x93, 0x06, 0x15, 0xc8, 0x20, 0x71, 0x02, 0x6c, 0x91, 0x86, 0x00, 0x15, + 0x05, 0x70, 0x91, 0x8e, 0x00, 0x16, 0x11, 0x00, 0x00, 0xc6, 0x60, 0x38, + 0x20, 0x60, 0x61, 0x04, 0x91, 0x86, 0x00, 0x4b, 0x01, 0xc0, 0x91, 0x86, + 0x00, 0x4c, 0x01, 0xa8, 0x91, 0x86, 0x00, 0x4d, 0x01, 0x90, 0x91, 0x86, + 0x00, 0x4e, 0x01, 0x78, 0x91, 0x86, 0x00, 0x52, 0x01, 0x60, 0x60, 0x14, + 0x00, 0x96, 0x20, 0x48, 0x08, 0x0c, 0xd0, 0xd8, 0x09, 0x0c, 0x0d, 0xc5, + 0xa8, 0x7b, 0x00, 0x03, 0x00, 0x9e, 0x08, 0x0c, 0xd7, 0x9d, 0x60, 0x07, + 0x00, 0x85, 0x60, 0x03, 0x00, 0x0b, 0x60, 0x23, 0x00, 0x02, 0x08, 0x0c, + 0x94, 0xff, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0xce, 0x00, 0x30, 0x60, 0x38, + 0x20, 0x70, 0x20, 0x01, 0x19, 0x88, 0x20, 0x04, 0x70, 0x42, 0x08, 0x0c, + 0xb2, 0xd3, 0x00, 0x2e, 0x00, 0xde, 0x00, 0xee, 0x00, 0x05, 0x00, 0xb6, + 0x00, 0x96, 0x00, 0xf6, 0x60, 0x14, 0x20, 0x48, 0x60, 0x10, 0x20, 0x58, + 0x91, 0xb6, 0x00, 0x15, 0x01, 0x30, 0xba, 0x08, 0xbb, 0x0c, 0xbc, 0x00, + 0xc4, 0x8c, 0xbc, 0x02, 0x04, 0x70, 0x00, 0x96, 0x01, 0x56, 0x00, 0x36, + 0x00, 0x26, 0x2b, 0x48, 0x9e, 0x90, 0x00, 0x10, 0x20, 0x19, 0x00, 0x0a, + 0x20, 0xa9, 0x00, 0x04, 0x08, 0x0c, 0xc3, 0x79, 0x00, 0x2e, 0x00, 0x3e, + 0x01, 0x5e, 0x00, 0x9e, 0x19, 0x04, 0xba, 0x66, 0x00, 0x96, 0x01, 0x56, + 0x00, 0x36, 0x00, 0x26, 0x2b, 0x48, 0x9e, 0x90, 0x00, 0x14, 0x20, 0x19, + 0x00, 0x06, 0x20, 0xa9, 0x00, 0x04, 0x08, 0x0c, 0xc3, 0x79, 0x00, 0x2e, + 0x00, 0x3e, 0x01, 0x5e, 0x00, 0x9e, 0x15, 0xb0, 0x72, 0x38, 0xba, 0x0a, + 0x73, 0x3c, 0xbb, 0x0e, 0x83, 0xff, 0x01, 0x18, 0xbc, 0x00, 0xc4, 0x8d, + 0xbc, 0x02, 0xa8, 0x04, 0x90, 0x05, 0x11, 0x28, 0x00, 0xfe, 0x00, 0x9e, + 0x00, 0xbe, 0x08, 0x04, 0xb6, 0xdc, 0x00, 0x96, 0x20, 0x48, 0xaa, 0x12, + 0xab, 0x16, 0xac, 0x0a, 0x00, 0x9e, 0x80, 0x06, 0x80, 0x06, 0x80, 0x07, + 0x90, 0xbc, 0x00, 0x3f, 0x90, 0x84, 0xff, 0xc0, 0x90, 0x80, 0x00, 0x02, + 0x20, 0x09, 0x00, 0x2b, 0xaa, 0xa0, 0xab, 0x9c, 0xac, 0xa8, 0xad, 0xa4, + 0x20, 0x31, 0x00, 0x00, 0x20, 0x41, 0x12, 0x52, 0x08, 0x0c, 0xb7, 0xf1, + 0x01, 0x30, 0x00, 0xfe, 0x00, 0x9e, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0xbe, + 0x00, 0x05, 0x08, 0x0c, 0xbc, 0xb6, 0x0c, 0xb8, 0x2b, 0x78, 0x00, 0xf6, + 0x08, 0x0c, 0x32, 0x50, 0x08, 0x0c, 0xd7, 0xf8, 0x00, 0xfe, 0x00, 0xc6, + 0x08, 0x0c, 0xb2, 0x7d, 0x2f, 0x00, 0x60, 0x12, 0x60, 0x17, 0x00, 0x00, + 0x60, 0x23, 0x00, 0x01, 0x60, 0x07, 0x00, 0x01, 0x60, 0x03, 0x00, 0x01, + 0x20, 0x01, 0x00, 0x07, 0x08, 0x0c, 0x66, 0x6a, 0x08, 0x0c, 0x66, 0x96, + 0x08, 0x0c, 0x95, 0x47, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0xce, 0x08, 0x04, + 0xba, 0x39, 0x21, 0x00, 0x91, 0xb2, 0x00, 0x53, 0x1a, 0x0c, 0x0d, 0xc5, + 0x91, 0xb2, 0x00, 0x40, 0x1a, 0x04, 0xba, 0xef, 0x00, 0x02, 0xba, 0xdd, + 0xba, 0xdd, 0xba, 0xd3, 0xba, 0xdd, 0xba, 0xdd, 0xba, 0xdd, 0xba, 0xd1, + 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd1, + 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd1, + 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd1, + 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd1, + 0xba, 0xdd, 0xba, 0xd1, 0xba, 0xdd, 0xba, 0xdd, 0xba, 0xd1, 0xba, 0xd1, + 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd3, 0xba, 0xd1, 0xba, 0xd1, + 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd1, + 0xba, 0xd1, 0xba, 0xdd, 0xba, 0xdd, 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd1, + 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd1, 0xba, 0xd1, + 0xba, 0xdd, 0xba, 0xd1, 0xba, 0xd1, 0x08, 0x0c, 0x0d, 0xc5, 0x00, 0x66, + 0x00, 0xb6, 0x66, 0x10, 0x26, 0x58, 0xb8, 0xcc, 0xc0, 0x8c, 0xb8, 0xce, + 0x00, 0xbe, 0x00, 0x6e, 0x00, 0x00, 0x60, 0x03, 0x00, 0x01, 0x61, 0x06, + 0x91, 0x86, 0x00, 0x32, 0x01, 0x18, 0x08, 0x0c, 0x95, 0x47, 0x00, 0x10, + 0x08, 0x0c, 0x94, 0xff, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, + 0x9a, 0xb1, 0x01, 0x2e, 0x00, 0x05, 0x26, 0x00, 0x00, 0x02, 0xba, 0xdd, + 0xba, 0xdd, 0xbb, 0x03, 0xba, 0xdd, 0xba, 0xdd, 0xbb, 0x03, 0xbb, 0x03, + 0xbb, 0x03, 0xbb, 0x03, 0xba, 0xdd, 0xbb, 0x03, 0xba, 0xdd, 0xbb, 0x03, + 0xba, 0xdd, 0xbb, 0x03, 0xbb, 0x03, 0xbb, 0x03, 0xbb, 0x03, 0x08, 0x0c, + 0x0d, 0xc5, 0x60, 0x04, 0x90, 0xb2, 0x00, 0x53, 0x1a, 0x0c, 0x0d, 0xc5, + 0x91, 0xb6, 0x00, 0x13, 0x09, 0x04, 0xbb, 0xd8, 0x91, 0xb6, 0x00, 0x27, + 0x19, 0x04, 0xbb, 0x82, 0x08, 0x0c, 0x99, 0xa5, 0x60, 0x04, 0x08, 0x0c, + 0xd2, 0xcf, 0x01, 0xb0, 0x08, 0x0c, 0xd2, 0xe0, 0x01, 0xa8, 0x90, 0x8e, + 0x00, 0x21, 0x09, 0x04, 0xbb, 0x7f, 0x90, 0x8e, 0x00, 0x22, 0x11, 0x30, + 0x08, 0x0c, 0xb7, 0x08, 0x09, 0x04, 0xbb, 0x7b, 0x08, 0x04, 0xbb, 0x7c, + 0x90, 0x8e, 0x00, 0x3d, 0x09, 0x04, 0xbb, 0x7f, 0x08, 0x04, 0xbb, 0x75, + 0x08, 0x0c, 0x32, 0x79, 0x20, 0x01, 0x00, 0x07, 0x08, 0x0c, 0x66, 0x6a, + 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb9, 0xa0, 0x00, 0xbe, 0x08, 0x0c, + 0xbc, 0xb6, 0x91, 0x86, 0x00, 0x7e, 0x11, 0x48, 0x20, 0x01, 0x18, 0x37, + 0x20, 0x14, 0xc2, 0x85, 0x08, 0x0c, 0x76, 0x37, 0x11, 0x08, 0xc2, 0xad, + 0x22, 0x02, 0x00, 0x36, 0x00, 0x26, 0x20, 0x19, 0x00, 0x28, 0x21, 0x10, + 0x08, 0x0c, 0xef, 0x94, 0x00, 0x2e, 0x00, 0x3e, 0x00, 0x16, 0x00, 0x26, + 0x00, 0x36, 0x21, 0x10, 0x20, 0x19, 0x00, 0x28, 0x08, 0x0c, 0x96, 0xa4, + 0x00, 0x76, 0x90, 0x3e, 0x08, 0x0c, 0x95, 0x77, 0x60, 0x10, 0x00, 0xb6, + 0x90, 0x5d, 0x01, 0x00, 0x00, 0xbe, 0x2c, 0x08, 0x08, 0x0c, 0xe9, 0x1c, + 0x00, 0x7e, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, 0x08, 0x0c, 0xd7, 0xf8, + 0x00, 0x16, 0x08, 0x0c, 0xd5, 0x4c, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x1e, + 0x08, 0x0c, 0x33, 0x4c, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x30, 0x08, 0x0c, + 0xd5, 0x4c, 0x08, 0x0c, 0xb2, 0xd3, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x05, + 0x08, 0x0c, 0xbc, 0xb6, 0x0c, 0xb0, 0x08, 0x0c, 0xbc, 0xf2, 0x0c, 0x98, + 0x91, 0x86, 0x00, 0x15, 0x01, 0x18, 0x91, 0x86, 0x00, 0x16, 0x11, 0x48, + 0x08, 0x0c, 0xd8, 0x09, 0x0d, 0x80, 0x60, 0x00, 0x90, 0x86, 0x00, 0x02, + 0x09, 0x04, 0xbc, 0xfd, 0x0c, 0x50, 0x91, 0x86, 0x00, 0x14, 0x1d, 0x38, + 0x08, 0x0c, 0x99, 0xa5, 0x60, 0x04, 0x90, 0x8e, 0x00, 0x22, 0x11, 0x18, + 0x08, 0x0c, 0xb7, 0x08, 0x09, 0xf0, 0x08, 0x0c, 0x32, 0x50, 0x08, 0x0c, + 0xd7, 0xf8, 0x08, 0x0c, 0xd2, 0xcf, 0x11, 0x98, 0x08, 0x0c, 0x32, 0x79, + 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb9, 0xa0, 0x00, 0xbe, 0x08, 0x0c, + 0xbc, 0xb6, 0x91, 0x86, 0x00, 0x7e, 0x11, 0x28, 0x20, 0x01, 0x18, 0x37, + 0x20, 0x0c, 0xc1, 0x85, 0x21, 0x02, 0x08, 0x04, 0xbb, 0x75, 0x08, 0x0c, + 0xd2, 0xe0, 0x11, 0x20, 0x08, 0x0c, 0xbc, 0xb6, 0x08, 0x04, 0xbb, 0x75, + 0x60, 0x04, 0x90, 0x8e, 0x00, 0x32, 0x11, 0x60, 0x00, 0xe6, 0x00, 0xf6, + 0x20, 0x71, 0x18, 0x9e, 0x20, 0x79, 0x00, 0x00, 0x08, 0x0c, 0x35, 0xe7, + 0x00, 0xfe, 0x00, 0xee, 0x08, 0x04, 0xbb, 0x75, 0x60, 0x04, 0x90, 0x8e, + 0x00, 0x21, 0x0d, 0x40, 0x90, 0x8e, 0x00, 0x22, 0x09, 0x0c, 0xbc, 0xb6, + 0x08, 0x04, 0xbb, 0x75, 0x90, 0xb2, 0x00, 0x40, 0x1a, 0x04, 0xbc, 0x92, + 0x20, 0x08, 0x00, 0x02, 0xbc, 0x20, 0xbc, 0x21, 0xbc, 0x24, 0xbc, 0x27, + 0xbc, 0x2a, 0xbc, 0x37, 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x1e, + 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x1e, + 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x1e, + 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x1e, + 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x3a, 0xbc, 0x47, 0xbc, 0x1e, 0xbc, 0x49, + 0xbc, 0x47, 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x1e, + 0xbc, 0x47, 0xbc, 0x47, 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x1e, + 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x79, 0xbc, 0x47, + 0xbc, 0x1e, 0xbc, 0x43, 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x44, + 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x1e, 0xbc, 0x47, 0xbc, 0x70, 0xbc, 0x1e, + 0x08, 0x0c, 0x0d, 0xc5, 0x04, 0x30, 0x20, 0x01, 0x00, 0x0b, 0x04, 0x70, + 0x20, 0x01, 0x00, 0x03, 0x04, 0x58, 0x20, 0x01, 0x00, 0x05, 0x04, 0x40, + 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x04, 0x00, 0xbe, 0x90, 0x84, + 0x00, 0xff, 0x90, 0x86, 0x00, 0x00, 0x15, 0x00, 0x20, 0x01, 0x00, 0x01, + 0x00, 0xd8, 0x20, 0x01, 0x00, 0x09, 0x00, 0xc0, 0x08, 0x0c, 0x99, 0xa5, + 0x60, 0x03, 0x00, 0x05, 0x08, 0x0c, 0xd7, 0xfb, 0x08, 0x0c, 0x9a, 0xb1, + 0x00, 0x70, 0x00, 0x18, 0x00, 0x10, 0x08, 0x0c, 0x66, 0x6a, 0x08, 0x04, + 0xbc, 0x8a, 0x08, 0x0c, 0x99, 0xa5, 0x08, 0x0c, 0xd7, 0xfb, 0x60, 0x03, + 0x00, 0x04, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x05, 0x08, 0x0c, 0x66, 0x6a, + 0x08, 0x0c, 0x99, 0xa5, 0x60, 0x03, 0x00, 0x02, 0x00, 0x36, 0x20, 0x19, + 0x18, 0x52, 0x23, 0x04, 0x90, 0x84, 0xff, 0x00, 0x11, 0x20, 0x20, 0x01, + 0x19, 0x86, 0x20, 0x1c, 0x00, 0x40, 0x80, 0x07, 0x90, 0x9a, 0x00, 0x04, + 0x0e, 0xc0, 0x80, 0x03, 0x80, 0x1b, 0x83, 0x1b, 0x93, 0x18, 0x63, 0x1a, + 0x00, 0x3e, 0x08, 0x0c, 0x9a, 0xb1, 0x0c, 0x08, 0x08, 0x0c, 0x99, 0xa5, + 0x08, 0x0c, 0xd5, 0x4c, 0x08, 0x0c, 0xb2, 0xd3, 0x08, 0x0c, 0x9a, 0xb1, + 0x08, 0xc0, 0x00, 0xe6, 0x00, 0xf6, 0x20, 0x71, 0x18, 0x9e, 0x20, 0x79, + 0x00, 0x00, 0x08, 0x0c, 0x35, 0xe7, 0x00, 0xfe, 0x00, 0xee, 0x08, 0x0c, + 0x99, 0xa5, 0x08, 0x0c, 0xb2, 0xd3, 0x08, 0x0c, 0x9a, 0xb1, 0x08, 0x38, + 0x08, 0x0c, 0x99, 0xa5, 0x60, 0x03, 0x00, 0x02, 0x08, 0x0c, 0xd7, 0xfb, + 0x08, 0x04, 0x9a, 0xb1, 0x26, 0x00, 0x20, 0x08, 0x00, 0x02, 0xbc, 0xa9, + 0xbc, 0x8a, 0xbc, 0xa7, 0xbc, 0x8a, 0xbc, 0x8a, 0xbc, 0xa7, 0xbc, 0xa7, + 0xbc, 0xa7, 0xbc, 0xa7, 0xbc, 0x8a, 0xbc, 0xa7, 0xbc, 0x8a, 0xbc, 0xa7, + 0xbc, 0x8a, 0xbc, 0xa7, 0xbc, 0xa7, 0xbc, 0xa7, 0xbc, 0xa7, 0x08, 0x0c, + 0x0d, 0xc5, 0x08, 0x0c, 0x99, 0xa5, 0x00, 0x96, 0x60, 0x14, 0x20, 0x48, + 0x08, 0x0c, 0x6e, 0x9f, 0x00, 0x9e, 0x08, 0x0c, 0xb2, 0xd3, 0x08, 0x0c, + 0x9a, 0xb1, 0x00, 0x05, 0x00, 0xe6, 0x00, 0x96, 0x00, 0x26, 0x00, 0x16, + 0x08, 0x0c, 0xd0, 0xd8, 0x05, 0x68, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x64, + 0x90, 0x86, 0x01, 0x39, 0x11, 0xa8, 0xa8, 0x94, 0x90, 0x86, 0x00, 0x56, + 0x11, 0x48, 0x08, 0x0c, 0x55, 0x6f, 0x01, 0x30, 0x20, 0x01, 0x00, 0x00, + 0x90, 0x0e, 0x20, 0x11, 0x40, 0x00, 0x00, 0x28, 0x20, 0x01, 0x00, 0x30, + 0x90, 0x0e, 0x20, 0x11, 0x40, 0x05, 0x08, 0x0c, 0xd6, 0xbd, 0x00, 0x90, + 0xa8, 0x68, 0xd0, 0xfc, 0x01, 0x78, 0xa8, 0x07, 0x00, 0x00, 0x00, 0x16, + 0x60, 0x04, 0x90, 0x8e, 0x00, 0x21, 0x01, 0x68, 0x90, 0x8e, 0x00, 0x3d, + 0x01, 0x50, 0x00, 0x1e, 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x33, 0x01, 0x00, + 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x9e, 0x00, 0xee, 0x00, 0x05, 0x00, 0x1e, + 0x00, 0x09, 0x0c, 0xc0, 0x00, 0x96, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x00, + 0x20, 0x48, 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x23, 0x80, 0x01, 0x00, 0x9e, + 0x00, 0x05, 0x00, 0xb6, 0x66, 0x10, 0x26, 0x58, 0xb8, 0x04, 0x90, 0x84, + 0x00, 0xff, 0x90, 0xb2, 0x00, 0x0c, 0x1a, 0x0c, 0x0d, 0xc5, 0x66, 0x04, + 0x96, 0xb6, 0x00, 0x4d, 0x11, 0x20, 0x08, 0x0c, 0xd5, 0xdc, 0x08, 0x04, + 0xbd, 0x82, 0x66, 0x04, 0x96, 0xb6, 0x00, 0x43, 0x11, 0x20, 0x08, 0x0c, + 0xd6, 0x25, 0x08, 0x04, 0xbd, 0x82, 0x66, 0x04, 0x96, 0xb6, 0x00, 0x4b, + 0x11, 0x20, 0x08, 0x0c, 0xd6, 0x51, 0x08, 0x04, 0xbd, 0x82, 0x66, 0x04, + 0x96, 0xb6, 0x00, 0x33, 0x11, 0x20, 0x08, 0x0c, 0xd5, 0x6e, 0x08, 0x04, + 0xbd, 0x82, 0x66, 0x04, 0x96, 0xb6, 0x00, 0x28, 0x11, 0x20, 0x08, 0x0c, + 0xd3, 0x1e, 0x08, 0x04, 0xbd, 0x82, 0x66, 0x04, 0x96, 0xb6, 0x00, 0x29, + 0x11, 0x20, 0x08, 0x0c, 0xd3, 0x5f, 0x08, 0x04, 0xbd, 0x82, 0x66, 0x04, + 0x96, 0xb6, 0x00, 0x1f, 0x11, 0x20, 0x08, 0x0c, 0xb6, 0xad, 0x08, 0x04, + 0xbd, 0x82, 0x66, 0x04, 0x96, 0xb6, 0x00, 0x00, 0x11, 0x18, 0x08, 0x0c, + 0xb9, 0xfb, 0x04, 0xe0, 0x66, 0x04, 0x96, 0xb6, 0x00, 0x22, 0x11, 0x18, + 0x08, 0x0c, 0xb6, 0xe9, 0x04, 0xa8, 0x66, 0x04, 0x96, 0xb6, 0x00, 0x35, + 0x11, 0x18, 0x08, 0x0c, 0xb8, 0x0f, 0x04, 0x70, 0x66, 0x04, 0x96, 0xb6, + 0x00, 0x39, 0x11, 0x18, 0x08, 0x0c, 0xb9, 0x90, 0x04, 0x38, 0x66, 0x04, + 0x96, 0xb6, 0x00, 0x3d, 0x11, 0x18, 0x08, 0x0c, 0xb7, 0x21, 0x04, 0x00, + 0x66, 0x04, 0x96, 0xb6, 0x00, 0x44, 0x11, 0x18, 0x08, 0x0c, 0xb7, 0x5d, + 0x00, 0xc8, 0x66, 0x04, 0x96, 0xb6, 0x00, 0x49, 0x11, 0x18, 0x08, 0x0c, + 0xb7, 0x9e, 0x00, 0x90, 0x66, 0x04, 0x96, 0xb6, 0x00, 0x41, 0x11, 0x18, + 0x08, 0x0c, 0xb7, 0x88, 0x00, 0x58, 0x91, 0xb6, 0x00, 0x15, 0x11, 0x10, + 0x00, 0x63, 0x00, 0x30, 0x91, 0xb6, 0x00, 0x16, 0x11, 0x28, 0x00, 0xbe, + 0x08, 0x04, 0xc0, 0x8e, 0x00, 0xbe, 0x00, 0x05, 0x08, 0x0c, 0xb3, 0x6d, + 0x0c, 0xd8, 0xbd, 0x9f, 0xbd, 0xad, 0xbd, 0x9f, 0xbd, 0xf4, 0xbd, 0x9f, + 0xbf, 0xab, 0xc0, 0x9b, 0xbd, 0x9f, 0xbd, 0x9f, 0xc0, 0x64, 0xbd, 0x9f, + 0xc0, 0x7a, 0x00, 0x96, 0x60, 0x1f, 0x00, 0x00, 0x60, 0x14, 0x20, 0x48, + 0xa8, 0x00, 0x20, 0x48, 0xa8, 0x67, 0x01, 0x03, 0x00, 0x9e, 0x08, 0x04, + 0xb2, 0xd3, 0xa0, 0x01, 0xa0, 0x01, 0x00, 0x05, 0x66, 0x04, 0x96, 0xb6, + 0x00, 0x04, 0x11, 0x30, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x66, 0x56, + 0x08, 0x04, 0xb2, 0xd3, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0x18, 0x00, + 0x70, 0x90, 0x90, 0x86, 0x00, 0x74, 0x15, 0x40, 0x08, 0x0c, 0xe8, 0xed, + 0x11, 0xb0, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0x70, 0x30, 0xd0, 0x8c, + 0x01, 0x28, 0xb8, 0x00, 0xd0, 0xbc, 0x01, 0x10, 0xc0, 0xc5, 0xb8, 0x02, + 0x00, 0xf9, 0x00, 0xbe, 0x20, 0x01, 0x00, 0x06, 0x08, 0x0c, 0x66, 0x6a, + 0x08, 0x0c, 0x32, 0x79, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x98, 0x20, 0x01, + 0x00, 0x0a, 0x08, 0x0c, 0x66, 0x6a, 0x08, 0x0c, 0x32, 0x79, 0x60, 0x03, + 0x00, 0x01, 0x60, 0x07, 0x00, 0x01, 0x08, 0x0c, 0x95, 0x47, 0x08, 0x0c, + 0x9a, 0xb1, 0x00, 0x20, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0xbf, 0x7b, + 0x00, 0xee, 0x00, 0x05, 0x00, 0xd6, 0xb8, 0x00, 0xd0, 0x84, 0x01, 0x60, + 0x90, 0x06, 0x08, 0x0c, 0x66, 0x56, 0x20, 0x69, 0x18, 0x47, 0x68, 0x04, + 0xd0, 0xa4, 0x01, 0x20, 0x20, 0x01, 0x00, 0x06, 0x08, 0x0c, 0x66, 0x96, + 0x00, 0xde, 0x00, 0x05, 0x00, 0xb6, 0x00, 0x96, 0x00, 0xd6, 0x20, 0x11, + 0x18, 0x24, 0x22, 0x04, 0x90, 0x86, 0x00, 0x74, 0x19, 0x04, 0xbf, 0x50, + 0x60, 0x10, 0x20, 0x58, 0xba, 0xa0, 0x92, 0x86, 0x00, 0x7e, 0x11, 0x20, + 0x08, 0x0c, 0xc1, 0xea, 0x08, 0x04, 0xbe, 0xbd, 0x20, 0x01, 0x18, 0x0d, + 0x20, 0x04, 0xd0, 0x8c, 0x09, 0x04, 0xbe, 0x5f, 0x00, 0xd6, 0x08, 0x0c, + 0x76, 0x37, 0x01, 0xa0, 0x00, 0x26, 0x20, 0x11, 0x00, 0x10, 0x08, 0x0c, + 0x6a, 0xc7, 0x00, 0x2e, 0x09, 0x04, 0xbe, 0x5e, 0x08, 0x0c, 0x57, 0xe9, + 0x15, 0x98, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x07, 0x00, 0x00, 0xa8, 0x67, + 0x01, 0x03, 0xa8, 0x33, 0xde, 0xad, 0x04, 0x50, 0x60, 0x10, 0x00, 0xb6, + 0x20, 0x58, 0xb9, 0x10, 0x00, 0xbe, 0x91, 0x86, 0x00, 0xff, 0x05, 0x80, + 0x00, 0x26, 0x20, 0x11, 0x80, 0x08, 0x08, 0x0c, 0x6a, 0xc7, 0x00, 0x2e, + 0x05, 0x48, 0x60, 0x14, 0x90, 0x05, 0x09, 0x0c, 0x0d, 0xc5, 0x20, 0x48, + 0xa8, 0x64, 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x39, 0x11, 0x40, + 0x20, 0x01, 0x00, 0x30, 0x90, 0x0e, 0x20, 0x11, 0x40, 0x09, 0x08, 0x0c, + 0xd6, 0xbd, 0x00, 0x40, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x07, 0x00, 0x00, + 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x33, 0xde, 0xad, 0x60, 0x10, 0x20, 0x58, + 0xb9, 0xa0, 0x00, 0x16, 0x08, 0x0c, 0x32, 0x79, 0x08, 0x0c, 0xb2, 0xd3, + 0x00, 0x1e, 0x08, 0x0c, 0x33, 0x4c, 0x00, 0xde, 0x08, 0x04, 0xbf, 0x55, + 0x00, 0xde, 0x08, 0x0c, 0xc1, 0xdf, 0x60, 0x10, 0x20, 0x58, 0xba, 0xa0, + 0x92, 0x86, 0x00, 0x80, 0x15, 0x10, 0x60, 0x14, 0x90, 0x05, 0x01, 0xa8, + 0x20, 0x48, 0xa8, 0x64, 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x39, + 0x11, 0x40, 0x20, 0x01, 0x00, 0x00, 0x90, 0x0e, 0x20, 0x11, 0x40, 0x00, + 0x08, 0x0c, 0xd6, 0xbd, 0x00, 0x30, 0xa8, 0x07, 0x00, 0x00, 0xa8, 0x67, + 0x01, 0x03, 0xa8, 0x33, 0x02, 0x00, 0x20, 0x01, 0x00, 0x06, 0x08, 0x0c, + 0x66, 0x6a, 0x08, 0x0c, 0x32, 0x79, 0x08, 0x0c, 0xb2, 0xd3, 0x08, 0x04, + 0xbf, 0x55, 0x08, 0x0c, 0xbf, 0x63, 0x60, 0x14, 0x90, 0x05, 0x01, 0x90, + 0x20, 0x48, 0xa8, 0x68, 0xd0, 0xf4, 0x01, 0xe8, 0xa8, 0x64, 0x90, 0x84, + 0x00, 0xff, 0x90, 0x86, 0x00, 0x39, 0x1d, 0x08, 0x20, 0x01, 0x00, 0x00, + 0x90, 0x0e, 0x20, 0x11, 0x40, 0x00, 0x08, 0x0c, 0xd6, 0xbd, 0x08, 0xf8, + 0x08, 0x0c, 0xbf, 0x59, 0x01, 0x60, 0x90, 0x06, 0x08, 0x0c, 0x66, 0x56, + 0x20, 0x01, 0x00, 0x04, 0x08, 0x0c, 0x66, 0x96, 0x20, 0x01, 0x00, 0x07, + 0x08, 0x0c, 0x66, 0x6a, 0x08, 0xa0, 0x20, 0x01, 0x00, 0x04, 0x08, 0x0c, + 0x66, 0x6a, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x03, 0x08, 0x0c, + 0x95, 0x47, 0x08, 0x0c, 0x9a, 0xb1, 0x08, 0x04, 0xbf, 0x55, 0xb8, 0x5c, + 0xd0, 0xe4, 0x01, 0x78, 0x08, 0x0c, 0xd4, 0xee, 0x08, 0x0c, 0x76, 0x37, + 0x01, 0x18, 0xd0, 0xdc, 0x19, 0x04, 0xbe, 0x7f, 0x20, 0x11, 0x18, 0x37, + 0x22, 0x04, 0xc0, 0xad, 0x20, 0x12, 0x08, 0x04, 0xbe, 0x7f, 0x08, 0x0c, + 0xd5, 0x2b, 0x20, 0x11, 0x18, 0x37, 0x22, 0x04, 0xc0, 0xa5, 0x20, 0x12, + 0x00, 0x06, 0x08, 0x0c, 0xea, 0xb9, 0x00, 0x0e, 0x19, 0x04, 0xbe, 0x7f, + 0xc0, 0xb5, 0x20, 0x12, 0x20, 0x01, 0x00, 0x06, 0x08, 0x0c, 0x66, 0x6a, + 0x90, 0x06, 0x08, 0x0c, 0x66, 0x56, 0x00, 0xc6, 0x20, 0x01, 0x18, 0x0f, + 0x20, 0x04, 0xd0, 0x9c, 0x05, 0x20, 0x00, 0xf6, 0x20, 0x79, 0x01, 0x00, + 0x00, 0xe6, 0x20, 0x71, 0x18, 0x00, 0x70, 0x0c, 0x90, 0x84, 0x00, 0xff, + 0x78, 0xe6, 0x70, 0x7e, 0x70, 0x10, 0x78, 0xea, 0x70, 0x82, 0x90, 0x8c, + 0x00, 0xff, 0x00, 0xee, 0x78, 0x0c, 0xc0, 0xb5, 0x78, 0x0e, 0x00, 0xfe, + 0x08, 0x0c, 0x28, 0xbc, 0x00, 0xf6, 0x21, 0x00, 0x90, 0x0e, 0x08, 0x0c, + 0x28, 0x73, 0x79, 0x5e, 0x00, 0xfe, 0x91, 0x86, 0x00, 0x81, 0x01, 0xf0, + 0x20, 0x09, 0x00, 0x81, 0x00, 0xe0, 0x20, 0x09, 0x00, 0xef, 0x00, 0xf6, + 0x20, 0x79, 0x01, 0x00, 0x79, 0xea, 0x78, 0xe7, 0x00, 0x00, 0x79, 0x32, + 0x79, 0x36, 0x78, 0x0c, 0xc0, 0xb5, 0x78, 0x0e, 0x00, 0xfe, 0x08, 0x0c, + 0x28, 0xbc, 0x00, 0xf6, 0x20, 0x79, 0x18, 0x00, 0x79, 0x82, 0x21, 0x00, + 0x90, 0x0e, 0x79, 0x7e, 0x08, 0x0c, 0x28, 0x73, 0x79, 0x5e, 0x00, 0xfe, + 0x81, 0x08, 0x08, 0x0c, 0x66, 0xb9, 0x2b, 0x00, 0x00, 0xce, 0x19, 0x04, + 0xbe, 0x7f, 0x60, 0x12, 0x20, 0x09, 0x18, 0x0f, 0x21, 0x0c, 0xd1, 0x9c, + 0x01, 0x50, 0x20, 0x09, 0x02, 0x7c, 0x21, 0x0c, 0x91, 0x8c, 0x00, 0xff, + 0xb9, 0x12, 0x20, 0x09, 0x02, 0x7d, 0x21, 0x0c, 0xb9, 0x16, 0x20, 0x01, + 0x00, 0x02, 0x08, 0x0c, 0x66, 0x6a, 0x60, 0x23, 0x00, 0x01, 0x60, 0x03, + 0x00, 0x01, 0x60, 0x07, 0x00, 0x02, 0x08, 0x0c, 0x95, 0x47, 0x08, 0x0c, + 0x9a, 0xb1, 0x00, 0x28, 0x08, 0x0c, 0xbc, 0xb6, 0x20, 0x01, 0x00, 0x01, + 0x04, 0x31, 0x00, 0xde, 0x00, 0x9e, 0x00, 0xbe, 0x00, 0x05, 0x20, 0x01, + 0x18, 0x10, 0x20, 0x04, 0xd0, 0xa4, 0x01, 0x20, 0x20, 0x01, 0x18, 0x48, + 0x20, 0x04, 0xd0, 0xac, 0x00, 0x05, 0x00, 0xe6, 0x08, 0x0c, 0xef, 0xed, + 0x01, 0x90, 0x20, 0x71, 0x02, 0x60, 0x71, 0x08, 0x72, 0x0c, 0x91, 0x8c, + 0x00, 0xff, 0x11, 0x18, 0x92, 0x84, 0xff, 0x00, 0x01, 0x40, 0x60, 0x10, + 0x20, 0x58, 0xb8, 0xa0, 0x90, 0x84, 0xff, 0x80, 0x11, 0x10, 0xb9, 0x12, + 0xba, 0x16, 0x00, 0xee, 0x00, 0x05, 0x20, 0x30, 0x90, 0x05, 0x01, 0x58, + 0x20, 0x01, 0x00, 0x07, 0x08, 0x0c, 0x66, 0x6a, 0x08, 0x0c, 0x57, 0xe9, + 0x11, 0x20, 0x20, 0x01, 0x00, 0x07, 0x08, 0x0c, 0x66, 0x96, 0x26, 0x00, + 0x90, 0x05, 0x11, 0xb0, 0x60, 0x14, 0x00, 0x96, 0x20, 0x48, 0xa8, 0x68, + 0x00, 0x9e, 0xd0, 0xfc, 0x11, 0x78, 0x00, 0x36, 0x00, 0x46, 0x60, 0x10, + 0x00, 0xb6, 0x20, 0x58, 0xbb, 0xa0, 0x00, 0xbe, 0x20, 0x21, 0x00, 0x04, + 0x20, 0x11, 0x80, 0x14, 0x08, 0x0c, 0x4c, 0x44, 0x00, 0x4e, 0x00, 0x3e, + 0x08, 0x0c, 0x32, 0x79, 0x60, 0x20, 0x90, 0x86, 0x00, 0x0a, 0x11, 0x08, + 0x00, 0x05, 0x08, 0x04, 0xb2, 0xd3, 0x00, 0xb6, 0x00, 0xe6, 0x00, 0x26, + 0x00, 0x16, 0x20, 0x71, 0x18, 0x00, 0x70, 0x90, 0x90, 0x86, 0x00, 0x14, + 0x19, 0x04, 0xc0, 0x5a, 0x20, 0x01, 0x18, 0x0d, 0x20, 0x04, 0xd0, 0x8c, + 0x09, 0x04, 0xc0, 0x0d, 0x00, 0xd6, 0x08, 0x0c, 0x76, 0x37, 0x01, 0xa0, + 0x00, 0x26, 0x20, 0x11, 0x00, 0x10, 0x08, 0x0c, 0x6a, 0xc7, 0x00, 0x2e, + 0x09, 0x04, 0xc0, 0x0c, 0x08, 0x0c, 0x57, 0xe9, 0x15, 0x98, 0x60, 0x14, + 0x20, 0x48, 0xa8, 0x07, 0x00, 0x00, 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x33, + 0xde, 0xad, 0x04, 0x50, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb9, 0x10, + 0x00, 0xbe, 0x91, 0x86, 0x00, 0xff, 0x05, 0x80, 0x00, 0x26, 0x20, 0x11, + 0x80, 0x08, 0x08, 0x0c, 0x6a, 0xc7, 0x00, 0x2e, 0x05, 0x48, 0x60, 0x14, + 0x90, 0x05, 0x09, 0x0c, 0x0d, 0xc5, 0x20, 0x48, 0xa8, 0x64, 0x90, 0x84, + 0x00, 0xff, 0x90, 0x86, 0x00, 0x39, 0x11, 0x40, 0x20, 0x01, 0x00, 0x30, + 0x90, 0x0e, 0x20, 0x11, 0x40, 0x09, 0x08, 0x0c, 0xd6, 0xbd, 0x00, 0x40, + 0x60, 0x14, 0x20, 0x48, 0xa8, 0x07, 0x00, 0x00, 0xa8, 0x67, 0x01, 0x03, + 0xa8, 0x33, 0xde, 0xad, 0x60, 0x10, 0x20, 0x58, 0xb9, 0xa0, 0x00, 0x16, + 0x08, 0x0c, 0x32, 0x79, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x1e, 0x08, 0x0c, + 0x33, 0x4c, 0x00, 0xde, 0x08, 0x04, 0xc0, 0x5f, 0x00, 0xde, 0x08, 0x0c, + 0x57, 0xe9, 0x11, 0x70, 0x60, 0x14, 0x90, 0x05, 0x11, 0x58, 0x00, 0x36, + 0x00, 0x46, 0x60, 0x10, 0x20, 0x58, 0xbb, 0xa0, 0x20, 0x21, 0x00, 0x06, + 0x08, 0x0c, 0x4d, 0xfb, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0xd6, 0x60, 0x10, + 0x20, 0x58, 0x08, 0x0c, 0x67, 0xbf, 0x08, 0x0c, 0xbd, 0xe2, 0x00, 0xde, + 0x08, 0x0c, 0xc2, 0xb5, 0x15, 0x88, 0x60, 0x10, 0x20, 0x58, 0xb8, 0x90, + 0x90, 0x05, 0x05, 0x60, 0x20, 0x01, 0x00, 0x06, 0x08, 0x0c, 0x66, 0x6a, + 0x00, 0x96, 0x60, 0x14, 0x90, 0x4d, 0x01, 0xd0, 0xa8, 0x64, 0x90, 0x84, + 0x00, 0xff, 0x90, 0x86, 0x00, 0x39, 0x11, 0x40, 0x20, 0x01, 0x00, 0x00, + 0x90, 0x0e, 0x20, 0x11, 0x40, 0x00, 0x08, 0x0c, 0xd6, 0xbd, 0x00, 0x60, + 0xa8, 0x64, 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x29, 0x01, 0x30, + 0xa8, 0x07, 0x00, 0x00, 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x33, 0x02, 0x00, + 0x00, 0x9e, 0x08, 0x0c, 0x32, 0x79, 0x60, 0x20, 0x90, 0x86, 0x00, 0x0a, + 0x01, 0x40, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x28, 0x08, 0x0c, 0xbc, 0xb6, + 0x90, 0x06, 0x08, 0x0c, 0xbf, 0x7b, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0xee, + 0x00, 0xbe, 0x00, 0x05, 0x20, 0x11, 0x18, 0x24, 0x22, 0x04, 0x90, 0x86, + 0x00, 0x14, 0x11, 0x60, 0x20, 0x01, 0x00, 0x02, 0x08, 0x0c, 0x66, 0x6a, + 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x01, 0x08, 0x0c, 0x95, 0x47, + 0x08, 0x04, 0x9a, 0xb1, 0x20, 0x01, 0x00, 0x01, 0x08, 0x04, 0xbf, 0x7b, + 0x20, 0x30, 0x20, 0x11, 0x18, 0x24, 0x22, 0x04, 0x90, 0x86, 0x00, 0x04, + 0x11, 0x48, 0x96, 0xb6, 0x00, 0x0b, 0x11, 0x20, 0x20, 0x01, 0x00, 0x07, + 0x08, 0x0c, 0x66, 0x6a, 0x08, 0x04, 0xb2, 0xd3, 0x20, 0x01, 0x00, 0x01, + 0x08, 0x04, 0xbf, 0x7b, 0x00, 0x02, 0xbd, 0x9f, 0xc0, 0xa6, 0xbd, 0x9f, + 0xc0, 0xe9, 0xbd, 0x9f, 0xc1, 0x96, 0xc0, 0x9b, 0xbd, 0xa2, 0xbd, 0x9f, + 0xc1, 0xaa, 0xbd, 0x9f, 0xc1, 0xbc, 0x66, 0x04, 0x96, 0x86, 0x00, 0x03, + 0x09, 0x04, 0xbf, 0xab, 0x96, 0xb6, 0x00, 0x1e, 0x11, 0x10, 0x08, 0x0c, + 0xb2, 0xd3, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xd6, 0x00, 0xc6, 0x08, 0x0c, + 0xc1, 0xce, 0x11, 0xa0, 0x90, 0x06, 0x08, 0x0c, 0x66, 0x56, 0x08, 0x0c, + 0x32, 0x50, 0x08, 0x0c, 0xd7, 0xf8, 0x20, 0x01, 0x00, 0x02, 0x08, 0x0c, + 0x66, 0x6a, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x02, 0x08, 0x0c, + 0x95, 0x47, 0x08, 0x0c, 0x9a, 0xb1, 0x04, 0x28, 0x20, 0x09, 0x02, 0x6e, + 0x21, 0x04, 0x90, 0x86, 0x00, 0x09, 0x11, 0x60, 0x60, 0x10, 0x20, 0x58, + 0xb8, 0x40, 0x90, 0x84, 0x00, 0xff, 0x90, 0x05, 0x01, 0x80, 0x80, 0x01, + 0xb8, 0x42, 0x60, 0x1b, 0x00, 0x0a, 0x00, 0x98, 0x20, 0x09, 0x02, 0x6f, + 0x21, 0x04, 0x90, 0x84, 0xff, 0x00, 0x90, 0x8e, 0x19, 0x00, 0x01, 0x58, + 0x90, 0x8e, 0x1e, 0x00, 0x09, 0x90, 0x08, 0x0c, 0x32, 0x50, 0x08, 0x0c, + 0xd7, 0xf8, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0xbf, 0x7b, 0x00, 0xce, + 0x00, 0xde, 0x00, 0xbe, 0x00, 0x05, 0x00, 0x96, 0x00, 0xb6, 0x00, 0x26, + 0x90, 0x16, 0x08, 0x0c, 0xc1, 0xdc, 0x00, 0xd6, 0x20, 0x69, 0x19, 0x7c, + 0x2d, 0x04, 0x90, 0x05, 0x01, 0x68, 0x60, 0x10, 0x20, 0x58, 0xb8, 0xa0, + 0x90, 0x86, 0x00, 0x7e, 0x11, 0x38, 0x20, 0x69, 0x18, 0x20, 0x2d, 0x04, + 0x80, 0x00, 0x20, 0x6a, 0x00, 0xde, 0x00, 0x10, 0x00, 0xde, 0x00, 0x88, + 0x90, 0x06, 0x08, 0x0c, 0x66, 0x56, 0x20, 0x01, 0x00, 0x02, 0x08, 0x0c, + 0x66, 0x6a, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x02, 0x08, 0x0c, + 0x95, 0x47, 0x08, 0x0c, 0x9a, 0xb1, 0x08, 0x04, 0xc1, 0x66, 0x08, 0x0c, + 0xd0, 0xd8, 0x01, 0xb0, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x64, 0x20, 0x10, + 0x90, 0x86, 0x01, 0x39, 0x11, 0x38, 0x60, 0x07, 0x00, 0x16, 0x20, 0x01, + 0x00, 0x02, 0x08, 0x0c, 0xd7, 0x1a, 0x00, 0xb0, 0x60, 0x14, 0x20, 0x48, + 0xa8, 0x64, 0xd0, 0xfc, 0x01, 0x18, 0x20, 0x01, 0x00, 0x01, 0x0c, 0xa8, + 0x20, 0x01, 0x18, 0x0e, 0x20, 0x04, 0xd0, 0xdc, 0x01, 0x48, 0x60, 0x10, + 0x20, 0x58, 0xb8, 0x40, 0x90, 0x84, 0x00, 0xff, 0x90, 0x05, 0x11, 0x10, + 0x90, 0x06, 0x0c, 0x38, 0x08, 0x0c, 0xbc, 0xb6, 0x20, 0x09, 0x02, 0x6e, + 0x21, 0x34, 0x96, 0xb4, 0x00, 0xff, 0x96, 0x86, 0x00, 0x05, 0x05, 0x20, + 0x96, 0x86, 0x00, 0x0b, 0x01, 0xc8, 0x20, 0x09, 0x02, 0x6f, 0x21, 0x04, + 0x90, 0x84, 0xff, 0x00, 0x11, 0x18, 0x96, 0x86, 0x00, 0x09, 0x01, 0xc0, + 0x90, 0x86, 0x19, 0x00, 0x11, 0x68, 0x96, 0x86, 0x00, 0x09, 0x01, 0x90, + 0x20, 0x01, 0x00, 0x04, 0x08, 0x0c, 0x66, 0x6a, 0x20, 0x01, 0x00, 0x28, + 0x60, 0x1a, 0x60, 0x07, 0x00, 0x52, 0x00, 0x20, 0x20, 0x01, 0x00, 0x01, + 0x08, 0x0c, 0xbf, 0x7b, 0x00, 0x2e, 0x00, 0xbe, 0x00, 0x9e, 0x00, 0x05, + 0x92, 0x86, 0x01, 0x39, 0x01, 0x60, 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, + 0xd0, 0xd8, 0x01, 0x40, 0xa8, 0x64, 0x90, 0x86, 0x01, 0x39, 0x01, 0x18, + 0xa8, 0x68, 0xd0, 0xfc, 0x01, 0x08, 0x0c, 0x40, 0x60, 0x10, 0x20, 0x58, + 0xb8, 0x40, 0x90, 0x84, 0x00, 0xff, 0x90, 0x05, 0x01, 0x38, 0x80, 0x01, + 0xb8, 0x42, 0x60, 0x1b, 0x00, 0x0a, 0x60, 0x07, 0x00, 0x16, 0x08, 0xf0, + 0xb8, 0xa0, 0x90, 0x86, 0x00, 0x7e, 0x11, 0x38, 0x00, 0xe6, 0x20, 0x71, + 0x18, 0x00, 0x08, 0x0c, 0x60, 0xc1, 0x00, 0xee, 0x00, 0x10, 0x08, 0x0c, + 0x32, 0x50, 0x08, 0x60, 0x20, 0x01, 0x00, 0x04, 0x08, 0x0c, 0x66, 0x6a, + 0x08, 0x0c, 0xc1, 0xdc, 0x11, 0x40, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, + 0x00, 0x03, 0x08, 0x0c, 0x95, 0x47, 0x08, 0x04, 0x9a, 0xb1, 0x08, 0x0c, + 0xbc, 0xb6, 0x90, 0x06, 0x08, 0x04, 0xbf, 0x7b, 0x04, 0x89, 0x11, 0x60, + 0x20, 0x01, 0x00, 0x08, 0x08, 0x0c, 0x66, 0x6a, 0x60, 0x03, 0x00, 0x01, + 0x60, 0x07, 0x00, 0x05, 0x08, 0x0c, 0x95, 0x47, 0x08, 0x04, 0x9a, 0xb1, + 0x20, 0x01, 0x00, 0x01, 0x08, 0x04, 0xbf, 0x7b, 0x00, 0xf9, 0x11, 0x60, + 0x20, 0x01, 0x00, 0x0a, 0x08, 0x0c, 0x66, 0x6a, 0x60, 0x03, 0x00, 0x01, + 0x60, 0x07, 0x00, 0x01, 0x08, 0x0c, 0x95, 0x47, 0x08, 0x04, 0x9a, 0xb1, + 0x20, 0x01, 0x00, 0x01, 0x08, 0x04, 0xbf, 0x7b, 0x20, 0x09, 0x02, 0x6e, + 0x21, 0x04, 0x90, 0x86, 0x00, 0x03, 0x11, 0x38, 0x20, 0x09, 0x02, 0x6f, + 0x21, 0x04, 0x90, 0x84, 0xff, 0x00, 0x90, 0x86, 0x2a, 0x00, 0x00, 0x05, + 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xc6, 0x00, 0x16, + 0x61, 0x10, 0x21, 0x58, 0x08, 0x0c, 0x67, 0x33, 0x00, 0x1e, 0x00, 0xce, + 0x00, 0xbe, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xd6, + 0x00, 0x36, 0x00, 0x16, 0x60, 0x10, 0x20, 0x58, 0x20, 0x09, 0x18, 0x37, + 0x21, 0x04, 0x90, 0x85, 0x00, 0x03, 0x20, 0x0a, 0x08, 0x0c, 0xc2, 0x87, + 0x05, 0x60, 0x20, 0x09, 0x18, 0x37, 0x21, 0x04, 0xc0, 0xcd, 0x20, 0x0a, + 0x08, 0x0c, 0x6a, 0x9f, 0x01, 0x58, 0x90, 0x06, 0x20, 0x20, 0x20, 0x09, + 0x00, 0x2a, 0x08, 0x0c, 0xec, 0x31, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x0c, + 0xc1, 0x95, 0x21, 0x02, 0x20, 0x19, 0x00, 0x2a, 0x20, 0x09, 0x00, 0x01, + 0x08, 0x0c, 0x32, 0x1b, 0x00, 0xe6, 0x20, 0x71, 0x18, 0x00, 0x08, 0x0c, + 0x30, 0x00, 0x00, 0xee, 0x00, 0xc6, 0x01, 0x56, 0x20, 0xa9, 0x07, 0x81, + 0x20, 0x09, 0x00, 0x7f, 0x08, 0x0c, 0x33, 0x4c, 0x81, 0x08, 0x1f, 0x04, + 0xc2, 0x20, 0x01, 0x5e, 0x00, 0xce, 0x08, 0x0c, 0xc1, 0xdf, 0x20, 0x71, + 0x02, 0x60, 0x20, 0x79, 0x02, 0x00, 0x78, 0x17, 0x00, 0x01, 0x20, 0x01, + 0x18, 0x37, 0x20, 0x0c, 0xc1, 0xc5, 0x70, 0x18, 0xd0, 0xfc, 0x01, 0x10, + 0xd0, 0xdc, 0x01, 0x18, 0x70, 0x38, 0xd0, 0xdc, 0x11, 0x08, 0xc1, 0xc4, + 0x78, 0x17, 0x00, 0x00, 0x20, 0x01, 0x18, 0x37, 0x21, 0x02, 0x91, 0x84, + 0x00, 0x50, 0x90, 0x86, 0x00, 0x50, 0x05, 0xd0, 0x20, 0x79, 0x01, 0x00, + 0x2e, 0x04, 0x90, 0x84, 0x00, 0xff, 0x20, 0x69, 0x18, 0x1f, 0x20, 0x6a, + 0x78, 0xe6, 0x00, 0x06, 0x8e, 0x70, 0x2e, 0x04, 0x20, 0x69, 0x18, 0x20, + 0x20, 0x6a, 0x78, 0xea, 0x78, 0x32, 0x78, 0x36, 0x20, 0x10, 0x90, 0x84, + 0xff, 0x00, 0x00, 0x1e, 0x91, 0x05, 0x20, 0x09, 0x18, 0x2c, 0x20, 0x0a, + 0x22, 0x00, 0x90, 0x84, 0x00, 0xff, 0x20, 0x08, 0x08, 0x0c, 0x28, 0xbc, + 0x08, 0x0c, 0x76, 0x37, 0x01, 0x70, 0x20, 0x71, 0x02, 0x60, 0x20, 0x69, + 0x19, 0x82, 0x70, 0x48, 0x20, 0x6a, 0x70, 0x4c, 0x68, 0x06, 0x70, 0x50, + 0x68, 0x0a, 0x70, 0x54, 0x68, 0x0e, 0x08, 0x0c, 0xd4, 0xee, 0x00, 0x40, + 0x20, 0x01, 0x00, 0x06, 0x08, 0x0c, 0x66, 0x6a, 0x08, 0x0c, 0x32, 0x79, + 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x1e, 0x00, 0x3e, 0x00, 0xde, 0x00, 0xee, + 0x00, 0xfe, 0x00, 0xbe, 0x00, 0x05, 0x00, 0x96, 0x00, 0x26, 0x00, 0x36, + 0x00, 0xe6, 0x01, 0x56, 0x20, 0x19, 0x18, 0x2c, 0x23, 0x1c, 0x83, 0xff, + 0x01, 0xf0, 0x20, 0x71, 0x02, 0x60, 0x72, 0x00, 0x92, 0x94, 0x00, 0xff, + 0x70, 0x04, 0x90, 0x84, 0xff, 0x00, 0x92, 0x05, 0x93, 0x06, 0x11, 0x98, + 0x20, 0x11, 0x02, 0x76, 0x20, 0xa9, 0x00, 0x04, 0x2b, 0x48, 0x20, 0x19, + 0x00, 0x0a, 0x08, 0x0c, 0xc3, 0x79, 0x11, 0x48, 0x20, 0x11, 0x02, 0x7a, + 0x20, 0xa9, 0x00, 0x04, 0x20, 0x19, 0x00, 0x06, 0x08, 0x0c, 0xc3, 0x79, + 0x11, 0x00, 0x01, 0x5e, 0x00, 0xee, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x9e, + 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0x02, 0x60, 0x70, 0x34, 0x90, 0x86, + 0x00, 0x14, 0x11, 0xa8, 0x70, 0x38, 0x90, 0x86, 0x08, 0x00, 0x11, 0x88, + 0x70, 0x3c, 0xd0, 0xec, 0x01, 0x60, 0x90, 0x84, 0x0f, 0x00, 0x90, 0x86, + 0x01, 0x00, 0x11, 0x38, 0x70, 0x54, 0xd0, 0xa4, 0x11, 0x10, 0xd0, 0xac, + 0x01, 0x10, 0x90, 0x06, 0x00, 0x10, 0x90, 0x85, 0x00, 0x01, 0x00, 0xee, + 0x00, 0x05, 0x00, 0xe6, 0x00, 0x96, 0x00, 0xc6, 0x00, 0x76, 0x00, 0x56, + 0x00, 0x46, 0x00, 0x26, 0x00, 0x06, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x29, 0x19, 0xf1, 0x25, 0x2c, 0x20, 0x21, 0x19, 0xf7, 0x24, 0x24, + 0x20, 0x61, 0x1c, 0xd0, 0x20, 0x71, 0x18, 0x00, 0x72, 0x54, 0x70, 0x74, + 0x92, 0x02, 0x1a, 0x04, 0xc3, 0x45, 0x08, 0x0c, 0x8c, 0xf7, 0x09, 0x04, + 0xc3, 0x3e, 0x08, 0x0c, 0xec, 0x62, 0x09, 0x04, 0xc3, 0x3e, 0x67, 0x20, + 0x97, 0x86, 0x00, 0x07, 0x09, 0x04, 0xc3, 0x3e, 0x25, 0x00, 0x9c, 0x06, + 0x09, 0x04, 0xc3, 0x3e, 0x24, 0x00, 0x9c, 0x06, 0x05, 0xe8, 0x3e, 0x08, + 0x91, 0x86, 0x00, 0x02, 0x11, 0x48, 0x60, 0x10, 0x90, 0x05, 0x01, 0x30, + 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x00, 0x00, 0xbe, 0xd0, 0xbc, 0x15, 0x80, + 0x00, 0xc6, 0x60, 0x00, 0x90, 0x86, 0x00, 0x04, 0x11, 0x10, 0x08, 0x0c, + 0x1a, 0x8e, 0x97, 0x86, 0x00, 0x0a, 0x01, 0x48, 0x08, 0x0c, 0xd2, 0xe0, + 0x11, 0x30, 0x00, 0xce, 0x08, 0x0c, 0xbc, 0xb6, 0x08, 0x0c, 0xb3, 0x06, + 0x00, 0xe8, 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0xa8, + 0x97, 0x86, 0x00, 0x03, 0x15, 0x30, 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x7c, + 0xd0, 0xcc, 0x01, 0x30, 0x00, 0x96, 0xa8, 0x78, 0x20, 0x48, 0x08, 0x0c, + 0x0f, 0xc0, 0x00, 0x9e, 0xab, 0x7a, 0xa8, 0x77, 0x00, 0x00, 0x08, 0x0c, + 0x6e, 0x92, 0x08, 0x0c, 0xd2, 0xc3, 0x08, 0x0c, 0xb3, 0x06, 0x00, 0xce, + 0x9c, 0xe0, 0x00, 0x18, 0x70, 0x68, 0x9c, 0x02, 0x12, 0x10, 0x08, 0x04, + 0xc2, 0xe8, 0x01, 0x2e, 0x00, 0x0e, 0x00, 0x2e, 0x00, 0x4e, 0x00, 0x5e, + 0x00, 0x7e, 0x00, 0xce, 0x00, 0x9e, 0x00, 0xee, 0x00, 0x05, 0x97, 0x86, + 0x00, 0x06, 0x11, 0x18, 0x08, 0x0c, 0xeb, 0xd4, 0x0c, 0x30, 0x97, 0x86, + 0x00, 0x09, 0x11, 0x48, 0x60, 0x00, 0x90, 0x86, 0x00, 0x04, 0x0d, 0x08, + 0x20, 0x09, 0x00, 0x4c, 0x08, 0x0c, 0xb3, 0x52, 0x08, 0xe0, 0x97, 0x86, + 0x00, 0x0a, 0x09, 0x80, 0x08, 0x20, 0x22, 0x0c, 0x23, 0x04, 0x91, 0x06, + 0x11, 0x30, 0x82, 0x10, 0x83, 0x18, 0x1f, 0x04, 0xc3, 0x65, 0x90, 0x06, + 0x00, 0x05, 0x23, 0x04, 0x91, 0x02, 0x02, 0x18, 0x20, 0x01, 0x00, 0x01, + 0x00, 0x08, 0x90, 0x06, 0x91, 0x8d, 0x00, 0x01, 0x00, 0x05, 0x01, 0x36, + 0x01, 0xc6, 0x00, 0x16, 0x89, 0x06, 0x80, 0x06, 0x80, 0x07, 0x90, 0x8c, + 0x00, 0x3f, 0x21, 0xe0, 0x90, 0x84, 0xff, 0xc0, 0x93, 0x00, 0x20, 0x98, + 0x35, 0x18, 0x20, 0xa9, 0x00, 0x01, 0x22, 0x0c, 0x40, 0x02, 0x91, 0x0e, + 0x11, 0x40, 0x82, 0x10, 0x83, 0x19, 0x1d, 0xc8, 0x90, 0x06, 0x00, 0x1e, + 0x01, 0xce, 0x01, 0x3e, 0x00, 0x05, 0x22, 0x0c, 0x91, 0x02, 0x02, 0x18, + 0x20, 0x01, 0x00, 0x01, 0x00, 0x10, 0x20, 0x01, 0x00, 0x00, 0x91, 0x8d, + 0x00, 0x01, 0x00, 0x1e, 0x01, 0xce, 0x01, 0x3e, 0x00, 0x05, 0x22, 0x0c, + 0x81, 0x0f, 0x23, 0x04, 0x91, 0x06, 0x11, 0x30, 0x82, 0x10, 0x83, 0x18, + 0x1f, 0x04, 0xc3, 0xa3, 0x90, 0x06, 0x00, 0x05, 0x91, 0x8d, 0x00, 0x01, + 0x00, 0x05, 0x60, 0x04, 0x90, 0x8a, 0x00, 0x53, 0x1a, 0x0c, 0x0d, 0xc5, + 0x08, 0x0c, 0xd2, 0xcf, 0x01, 0x20, 0x08, 0x0c, 0xd2, 0xe0, 0x01, 0x68, + 0x00, 0x28, 0x08, 0x0c, 0x32, 0x79, 0x08, 0x0c, 0xd2, 0xe0, 0x01, 0x38, + 0x08, 0x0c, 0x99, 0xa5, 0x08, 0x0c, 0xb2, 0xd3, 0x08, 0x0c, 0x9a, 0xb1, + 0x00, 0x05, 0x08, 0x0c, 0xbc, 0xb6, 0x0c, 0xb0, 0x91, 0x82, 0x00, 0x54, + 0x12, 0x20, 0x91, 0x82, 0x00, 0x40, 0x02, 0x08, 0x00, 0x0a, 0x00, 0x05, + 0xc3, 0xe8, 0xc3, 0xe8, 0xc3, 0xe8, 0xc3, 0xe8, 0xc3, 0xe8, 0xc3, 0xe8, + 0xc3, 0xe8, 0xc3, 0xe8, 0xc3, 0xe8, 0xc3, 0xe8, 0xc3, 0xe8, 0xc3, 0xea, + 0xc3, 0xea, 0xc3, 0xea, 0xc3, 0xea, 0xc3, 0xe8, 0xc3, 0xe8, 0xc3, 0xe8, + 0xc3, 0xea, 0xc3, 0xe8, 0x08, 0x0c, 0x0d, 0xc5, 0x60, 0x0b, 0xff, 0xff, + 0x60, 0x03, 0x00, 0x01, 0x61, 0x06, 0x08, 0x0c, 0x94, 0xff, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x9a, 0xb1, 0x01, 0x2e, 0x00, 0x05, + 0x91, 0x86, 0x00, 0x13, 0x11, 0x28, 0x60, 0x04, 0x90, 0x82, 0x00, 0x40, + 0x08, 0x04, 0xc4, 0x82, 0x91, 0x86, 0x00, 0x27, 0x15, 0x20, 0x08, 0x0c, + 0x99, 0xa5, 0x08, 0x0c, 0x32, 0x50, 0x08, 0x0c, 0xd7, 0xf8, 0x00, 0x96, + 0x61, 0x14, 0x21, 0x48, 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0x98, 0x08, 0x0c, + 0xd2, 0xe0, 0x11, 0x18, 0x08, 0x0c, 0xbc, 0xb6, 0x00, 0x68, 0xa8, 0x67, + 0x01, 0x03, 0xa8, 0x7b, 0x00, 0x29, 0xa8, 0x77, 0x00, 0x00, 0xa9, 0x7c, + 0xc1, 0xc5, 0xa9, 0x7e, 0x08, 0x0c, 0x6e, 0x9f, 0x08, 0x0c, 0xd2, 0xc3, + 0x00, 0x9e, 0x08, 0x0c, 0xb2, 0xd3, 0x08, 0x04, 0x9a, 0xb1, 0x91, 0x86, + 0x00, 0x14, 0x11, 0x20, 0x60, 0x04, 0x90, 0x82, 0x00, 0x40, 0x00, 0xb8, + 0x91, 0x86, 0x00, 0x46, 0x01, 0x50, 0x91, 0x86, 0x00, 0x45, 0x01, 0x38, + 0x91, 0x86, 0x00, 0x53, 0x01, 0x20, 0x91, 0x86, 0x00, 0x48, 0x19, 0x0c, + 0x0d, 0xc5, 0x08, 0x0c, 0xd8, 0x09, 0x01, 0x30, 0x60, 0x00, 0x90, 0x86, + 0x00, 0x02, 0x11, 0x10, 0x08, 0x04, 0xc4, 0xc0, 0x00, 0x05, 0x00, 0x02, + 0xc4, 0x5c, 0xc4, 0x5a, 0xc4, 0x5a, 0xc4, 0x5a, 0xc4, 0x5a, 0xc4, 0x5a, + 0xc4, 0x5a, 0xc4, 0x5a, 0xc4, 0x5a, 0xc4, 0x5a, 0xc4, 0x5a, 0xc4, 0x77, + 0xc4, 0x77, 0xc4, 0x77, 0xc4, 0x77, 0xc4, 0x5a, 0xc4, 0x77, 0xc4, 0x5a, + 0xc4, 0x77, 0xc4, 0x5a, 0x08, 0x0c, 0x0d, 0xc5, 0x08, 0x0c, 0x99, 0xa5, + 0x00, 0x96, 0x61, 0x14, 0x21, 0x48, 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0x68, + 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x7b, 0x00, 0x06, 0xa8, 0x77, 0x00, 0x00, + 0xa8, 0x80, 0xc0, 0xec, 0xa8, 0x82, 0x08, 0x0c, 0x6e, 0x9f, 0x08, 0x0c, + 0xd2, 0xc3, 0x00, 0x9e, 0x08, 0x0c, 0xb2, 0xd3, 0x08, 0x0c, 0x9a, 0xb1, + 0x00, 0x05, 0x08, 0x0c, 0x99, 0xa5, 0x08, 0x0c, 0xd2, 0xe0, 0x09, 0x0c, + 0xbc, 0xb6, 0x08, 0x0c, 0xb2, 0xd3, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x05, + 0x00, 0x02, 0xc4, 0x99, 0xc4, 0x97, 0xc4, 0x97, 0xc4, 0x97, 0xc4, 0x97, + 0xc4, 0x97, 0xc4, 0x97, 0xc4, 0x97, 0xc4, 0x97, 0xc4, 0x97, 0xc4, 0x97, + 0xc4, 0xb0, 0xc4, 0xb0, 0xc4, 0xb0, 0xc4, 0xb0, 0xc4, 0x97, 0xc4, 0xba, + 0xc4, 0x97, 0xc4, 0xb0, 0xc4, 0x97, 0x08, 0x0c, 0x0d, 0xc5, 0x00, 0x96, + 0x08, 0x0c, 0x99, 0xa5, 0x60, 0x14, 0x20, 0x48, 0x20, 0x01, 0x19, 0x88, + 0x20, 0x04, 0x60, 0x42, 0xa9, 0x7c, 0xd1, 0xac, 0x01, 0x40, 0x60, 0x03, + 0x00, 0x04, 0xa8, 0x7c, 0x90, 0x85, 0x04, 0x00, 0xa8, 0x7e, 0x00, 0x9e, + 0x00, 0x05, 0x60, 0x03, 0x00, 0x02, 0x0c, 0xb8, 0x08, 0x0c, 0x99, 0xa5, + 0x08, 0x0c, 0xd7, 0xfb, 0x08, 0x0c, 0xd8, 0x00, 0x60, 0x03, 0x00, 0x0f, + 0x08, 0x04, 0x9a, 0xb1, 0x08, 0x0c, 0x99, 0xa5, 0x08, 0x0c, 0xb2, 0xd3, + 0x08, 0x04, 0x9a, 0xb1, 0x91, 0x82, 0x00, 0x54, 0x12, 0x20, 0x91, 0x82, + 0x00, 0x40, 0x02, 0x08, 0x00, 0x0a, 0x00, 0x05, 0xc4, 0xdc, 0xc4, 0xdc, + 0xc4, 0xdc, 0xc4, 0xdc, 0xc4, 0xdc, 0xc4, 0xde, 0xc5, 0xbe, 0xc4, 0xdc, + 0xc5, 0xf2, 0xc4, 0xdc, 0xc4, 0xdc, 0xc4, 0xdc, 0xc4, 0xdc, 0xc4, 0xdc, + 0xc4, 0xdc, 0xc4, 0xdc, 0xc4, 0xdc, 0xc4, 0xdc, 0xc4, 0xdc, 0xc5, 0xf2, + 0x08, 0x0c, 0x0d, 0xc5, 0x00, 0xb6, 0x00, 0x96, 0x61, 0x14, 0x21, 0x48, + 0x76, 0x44, 0x96, 0xb4, 0x0f, 0xff, 0x86, 0xff, 0x15, 0x28, 0x60, 0x10, + 0x20, 0x58, 0xb8, 0x00, 0xd0, 0xbc, 0x19, 0x04, 0xc5, 0xad, 0xa8, 0x7b, + 0x00, 0x00, 0xa8, 0x67, 0x01, 0x03, 0xae, 0x76, 0xa8, 0x7c, 0xd0, 0xac, + 0x01, 0x28, 0xa8, 0x34, 0xa9, 0x38, 0x91, 0x15, 0x19, 0x0c, 0xc7, 0x8b, + 0x08, 0x0c, 0x6c, 0xb9, 0x62, 0x10, 0x22, 0x58, 0xba, 0x3c, 0x82, 0xff, + 0x01, 0x10, 0x82, 0x11, 0xba, 0x3e, 0x70, 0x44, 0xd0, 0xe4, 0x19, 0x04, + 0xc5, 0x8e, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x9e, 0x00, 0xbe, 0x00, 0x05, + 0x96, 0x8c, 0x0c, 0x00, 0x01, 0x50, 0x60, 0x10, 0x20, 0x58, 0xb8, 0x00, + 0xd0, 0xbc, 0x19, 0x04, 0xc5, 0x92, 0x73, 0x48, 0xab, 0x92, 0x73, 0x4c, + 0xab, 0x8e, 0x96, 0x8c, 0x00, 0xff, 0x91, 0x86, 0x00, 0x02, 0x05, 0x08, + 0x91, 0x86, 0x00, 0x28, 0x11, 0x18, 0xa8, 0x7b, 0x00, 0x1c, 0x00, 0xe8, + 0xd6, 0xdc, 0x01, 0xa0, 0xa8, 0x7b, 0x00, 0x15, 0xa8, 0x7c, 0xd0, 0xac, + 0x01, 0x70, 0xa9, 0x38, 0xaa, 0x34, 0x21, 0x00, 0x92, 0x05, 0x01, 0x48, + 0x70, 0x48, 0x91, 0x06, 0x11, 0x18, 0x70, 0x4c, 0x92, 0x06, 0x01, 0x18, + 0xa9, 0x92, 0xaa, 0x8e, 0xc6, 0xdc, 0x00, 0x38, 0xd6, 0xd4, 0x01, 0x18, + 0xa8, 0x7b, 0x00, 0x07, 0x00, 0x10, 0xa8, 0x7b, 0x00, 0x00, 0xa8, 0x67, + 0x01, 0x03, 0xae, 0x76, 0x90, 0x1e, 0xd6, 0xc4, 0x01, 0xd8, 0x96, 0x86, + 0x01, 0x00, 0x11, 0x30, 0x70, 0x64, 0x90, 0x05, 0x11, 0x18, 0xc6, 0xc4, + 0x08, 0x04, 0xc4, 0xe5, 0x73, 0x5c, 0xab, 0x86, 0x83, 0xff, 0x01, 0x70, + 0x93, 0x8a, 0x00, 0x09, 0x02, 0x10, 0x20, 0x19, 0x00, 0x08, 0x00, 0x36, + 0x23, 0x08, 0x20, 0x19, 0x00, 0x18, 0x20, 0x11, 0x00, 0x25, 0x08, 0x0c, + 0xcc, 0x85, 0x00, 0x3e, 0xd6, 0xcc, 0x09, 0x04, 0xc4, 0xfa, 0x71, 0x54, + 0xa9, 0x8a, 0x81, 0xff, 0x09, 0x04, 0xc4, 0xfa, 0x91, 0x92, 0x00, 0x21, + 0x12, 0x78, 0x83, 0x04, 0x90, 0x98, 0x00, 0x18, 0x20, 0x11, 0x00, 0x29, + 0x08, 0x0c, 0xcc, 0x85, 0x20, 0x11, 0x02, 0x05, 0x20, 0x13, 0x00, 0x00, + 0x08, 0x0c, 0xd7, 0x86, 0x08, 0x04, 0xc4, 0xfa, 0xa8, 0x68, 0xd0, 0xfc, + 0x01, 0x20, 0x20, 0x09, 0x00, 0x20, 0xa9, 0x8a, 0x0c, 0x50, 0x00, 0xa6, + 0x29, 0x50, 0x08, 0x0c, 0xcc, 0x24, 0x00, 0xae, 0x08, 0x0c, 0xd7, 0x86, + 0x08, 0x0c, 0xcc, 0x75, 0x08, 0x04, 0xc4, 0xfc, 0x08, 0x0c, 0xd3, 0xd8, + 0x08, 0x04, 0xc5, 0x09, 0xa8, 0x7c, 0xd0, 0xac, 0x09, 0x04, 0xc5, 0x15, + 0xa8, 0x80, 0xd0, 0xbc, 0x19, 0x04, 0xc5, 0x15, 0x96, 0x84, 0x04, 0x00, + 0x01, 0x30, 0xa8, 0x38, 0xab, 0x34, 0x93, 0x05, 0x09, 0x04, 0xc5, 0x15, + 0x00, 0xb8, 0x73, 0x48, 0xa8, 0x38, 0x93, 0x06, 0x11, 0x98, 0x73, 0x4c, + 0xa8, 0x34, 0x93, 0x1e, 0x09, 0x04, 0xc5, 0x15, 0x00, 0x68, 0xa8, 0x7c, + 0xd0, 0xac, 0x09, 0x04, 0xc4, 0xed, 0xa8, 0x38, 0xa9, 0x34, 0x91, 0x05, + 0x09, 0x04, 0xc4, 0xed, 0xa8, 0x80, 0xd0, 0xbc, 0x19, 0x04, 0xc4, 0xed, + 0x08, 0x0c, 0xd4, 0x12, 0x08, 0x04, 0xc5, 0x09, 0x00, 0x96, 0x00, 0xf6, + 0x60, 0x03, 0x00, 0x03, 0x60, 0x07, 0x00, 0x43, 0x20, 0x79, 0x02, 0x6c, + 0x7c, 0x04, 0x7b, 0x00, 0x7e, 0x0c, 0x7d, 0x08, 0x60, 0x14, 0x20, 0x48, + 0xa8, 0x7c, 0xd0, 0xac, 0x01, 0x40, 0x60, 0x03, 0x00, 0x02, 0x00, 0xfe, + 0x00, 0x9e, 0x00, 0x05, 0x21, 0x30, 0x22, 0x28, 0x00, 0x58, 0x24, 0x00, + 0xa9, 0xac, 0x91, 0x0a, 0x23, 0x00, 0xaa, 0xb0, 0x92, 0x13, 0x26, 0x00, + 0x91, 0x02, 0x25, 0x00, 0x92, 0x03, 0x0e, 0x90, 0xac, 0x36, 0xab, 0x3a, + 0xae, 0x46, 0xad, 0x4a, 0x00, 0xfe, 0x60, 0x43, 0x00, 0x00, 0x2c, 0x10, + 0x08, 0x0c, 0x1b, 0xe0, 0x08, 0x0c, 0x95, 0x64, 0x08, 0x0c, 0x9b, 0xd3, + 0x00, 0x9e, 0x00, 0x05, 0x00, 0x05, 0x91, 0x82, 0x00, 0x54, 0x12, 0x20, + 0x91, 0x82, 0x00, 0x40, 0x02, 0x08, 0x00, 0x0a, 0x00, 0x05, 0xc6, 0x0f, + 0xc6, 0x0f, 0xc6, 0x0f, 0xc6, 0x0f, 0xc6, 0x0f, 0xc6, 0x11, 0xc6, 0xa7, + 0xc6, 0x0f, 0xc6, 0x0f, 0xc6, 0xbe, 0xc7, 0x4e, 0xc6, 0x0f, 0xc6, 0x0f, + 0xc6, 0x0f, 0xc6, 0x0f, 0xc7, 0x63, 0xc6, 0x0f, 0xc6, 0x0f, 0xc6, 0x0f, + 0xc6, 0x0f, 0x08, 0x0c, 0x0d, 0xc5, 0x00, 0x76, 0x00, 0xa6, 0x00, 0xe6, + 0x00, 0x96, 0x20, 0x71, 0x02, 0x60, 0x61, 0x14, 0x21, 0x50, 0x76, 0x44, + 0xb6, 0x76, 0x96, 0xb4, 0x0f, 0xff, 0xb7, 0x7c, 0xc7, 0xe5, 0xb7, 0x7e, + 0x62, 0x10, 0x00, 0xb6, 0x22, 0x58, 0xba, 0x3c, 0x82, 0xff, 0x01, 0x10, + 0x82, 0x11, 0xba, 0x3e, 0x00, 0xbe, 0x86, 0xff, 0x09, 0x04, 0xc6, 0xa2, + 0x96, 0x94, 0xff, 0x00, 0x92, 0x84, 0x0c, 0x00, 0x01, 0x20, 0x70, 0x48, + 0xb0, 0x92, 0x70, 0x4c, 0xb0, 0x8e, 0x92, 0x84, 0x03, 0x00, 0x09, 0x04, + 0xc6, 0xa2, 0x08, 0x0c, 0x10, 0x0e, 0x09, 0x0c, 0x0d, 0xc5, 0x29, 0x00, + 0xb0, 0x7a, 0xb7, 0x7c, 0xc7, 0xcd, 0xb7, 0x7e, 0xa8, 0x67, 0x01, 0x03, + 0xb0, 0x68, 0xa8, 0x6a, 0xb0, 0x6c, 0xa8, 0x6e, 0xb0, 0x70, 0xa8, 0x72, + 0xae, 0x76, 0x96, 0x8c, 0x0c, 0x00, 0x01, 0x20, 0x73, 0x48, 0xab, 0x92, + 0x73, 0x4c, 0xab, 0x8e, 0x96, 0x8c, 0x00, 0xff, 0x91, 0x86, 0x00, 0x02, + 0x01, 0x80, 0x91, 0x86, 0x00, 0x28, 0x11, 0x18, 0xa8, 0x7b, 0x00, 0x1c, + 0x00, 0x60, 0xd6, 0xdc, 0x01, 0x18, 0xa8, 0x7b, 0x00, 0x15, 0x00, 0x38, + 0xd6, 0xd4, 0x01, 0x18, 0xa8, 0x7b, 0x00, 0x07, 0x00, 0x10, 0xa8, 0x7b, + 0x00, 0x00, 0xaf, 0x7e, 0xb0, 0x80, 0xa8, 0x82, 0xb0, 0x84, 0xa8, 0x86, + 0x90, 0x1e, 0xd6, 0xc4, 0x01, 0x90, 0x73, 0x5c, 0xab, 0x86, 0x83, 0xff, + 0x01, 0x70, 0x93, 0x8a, 0x00, 0x09, 0x02, 0x10, 0x20, 0x19, 0x00, 0x08, + 0x00, 0x36, 0x23, 0x08, 0x20, 0x19, 0x00, 0x18, 0x20, 0x11, 0x00, 0x25, + 0x08, 0x0c, 0xcc, 0x85, 0x00, 0x3e, 0xd6, 0xcc, 0x01, 0xe8, 0x71, 0x54, + 0xa9, 0x8a, 0x81, 0xff, 0x01, 0xc8, 0x91, 0x92, 0x00, 0x21, 0x12, 0x60, + 0x83, 0x04, 0x90, 0x98, 0x00, 0x18, 0x20, 0x11, 0x00, 0x29, 0x08, 0x0c, + 0xcc, 0x85, 0x20, 0x11, 0x02, 0x05, 0x20, 0x13, 0x00, 0x00, 0x00, 0x50, + 0xb0, 0x68, 0xd0, 0xfc, 0x01, 0x20, 0x20, 0x09, 0x00, 0x20, 0xa9, 0x8a, + 0x0c, 0x68, 0x29, 0x50, 0x08, 0x0c, 0xcc, 0x24, 0x00, 0x9e, 0x00, 0xee, + 0x00, 0xae, 0x00, 0x7e, 0x00, 0x05, 0x00, 0xf6, 0x00, 0xa6, 0x60, 0x03, + 0x00, 0x03, 0x20, 0x79, 0x02, 0x6c, 0x7c, 0x04, 0x7b, 0x00, 0x7e, 0x0c, + 0x7d, 0x08, 0x60, 0x14, 0x20, 0x50, 0xb4, 0x36, 0xb3, 0x3a, 0xb6, 0x46, + 0xb5, 0x4a, 0x00, 0xae, 0x00, 0xfe, 0x2c, 0x10, 0x08, 0x0c, 0x1b, 0xe0, + 0x08, 0x04, 0xa6, 0xb6, 0x60, 0x03, 0x00, 0x02, 0x60, 0x04, 0x90, 0x86, + 0x00, 0x40, 0x11, 0xc8, 0x00, 0x96, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x7c, + 0xd0, 0xac, 0x01, 0x60, 0x60, 0x1c, 0xd0, 0x84, 0x11, 0x30, 0x00, 0xf6, + 0x2c, 0x00, 0x20, 0x78, 0x08, 0x0c, 0x17, 0x68, 0x00, 0xfe, 0x60, 0x03, + 0x00, 0x04, 0x00, 0x10, 0x60, 0x03, 0x00, 0x02, 0x00, 0x9e, 0x08, 0x0c, + 0x99, 0xa5, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x96, 0x20, 0x01, 0x19, 0x88, + 0x20, 0x04, 0x60, 0x42, 0x08, 0x0c, 0x9a, 0x61, 0x08, 0x0c, 0x9b, 0xd3, + 0x61, 0x14, 0x21, 0x48, 0xa9, 0x7c, 0xd1, 0xe4, 0x09, 0x04, 0xc7, 0x49, + 0xd1, 0xcc, 0x05, 0xc8, 0xa9, 0x78, 0xa8, 0x68, 0xd0, 0xfc, 0x05, 0x40, + 0x00, 0x16, 0xa8, 0x7c, 0x00, 0x06, 0xa8, 0x80, 0x00, 0x06, 0xa8, 0x60, + 0x20, 0xe8, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x19, 0x20, 0xa0, 0x81, 0x0e, + 0x81, 0x0e, 0x81, 0x0f, 0x91, 0x84, 0x00, 0x3f, 0x20, 0xe0, 0x91, 0x84, + 0xff, 0xc0, 0x90, 0x80, 0x00, 0x19, 0x20, 0x98, 0x01, 0x56, 0x20, 0xa9, + 0x00, 0x20, 0x40, 0x03, 0x01, 0x5e, 0x00, 0x0e, 0xa8, 0x82, 0x00, 0x0e, + 0xc0, 0xcc, 0xa8, 0x7e, 0x00, 0x1e, 0xa8, 0x74, 0x00, 0x06, 0x21, 0x48, + 0x08, 0x0c, 0x0f, 0xc0, 0x00, 0x1e, 0x04, 0x58, 0x00, 0x16, 0x08, 0x0c, + 0x0f, 0xc0, 0x00, 0x9e, 0xa8, 0x7c, 0xc0, 0xcc, 0xa8, 0x7e, 0xa9, 0x74, + 0x00, 0x16, 0x08, 0x0c, 0xcc, 0x75, 0x00, 0x1e, 0x00, 0xf0, 0xa8, 0x67, + 0x01, 0x03, 0xa9, 0x74, 0x91, 0x84, 0x00, 0xff, 0x90, 0xb6, 0x00, 0x02, + 0x01, 0x80, 0x90, 0x86, 0x00, 0x28, 0x11, 0x18, 0xa8, 0x7b, 0x00, 0x1c, + 0x00, 0x60, 0xd1, 0xdc, 0x01, 0x18, 0xa8, 0x7b, 0x00, 0x15, 0x00, 0x38, + 0xd1, 0xd4, 0x01, 0x18, 0xa8, 0x7b, 0x00, 0x07, 0x00, 0x10, 0xa8, 0x7b, + 0x00, 0x00, 0x00, 0x16, 0x08, 0x0c, 0x6c, 0xb9, 0x00, 0x1e, 0xd1, 0xe4, + 0x11, 0x20, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x9e, 0x00, 0x05, 0x08, 0x0c, + 0xd3, 0xd8, 0x0c, 0xd8, 0x60, 0x04, 0x90, 0x86, 0x00, 0x40, 0x11, 0x20, + 0x08, 0x0c, 0x99, 0xa5, 0x08, 0x0c, 0x9a, 0xb1, 0x20, 0x19, 0x00, 0x01, + 0x08, 0x0c, 0xaa, 0x49, 0x60, 0x03, 0x00, 0x02, 0x08, 0x0c, 0xd8, 0x00, + 0x08, 0x0c, 0x9a, 0x61, 0x08, 0x0c, 0x9b, 0xd3, 0x00, 0x05, 0x60, 0x04, + 0x90, 0x86, 0x00, 0x40, 0x11, 0x20, 0x08, 0x0c, 0x99, 0xa5, 0x08, 0x0c, + 0x9a, 0xb1, 0x20, 0x19, 0x00, 0x01, 0x08, 0x0c, 0xaa, 0x49, 0x08, 0x0c, + 0x9a, 0x61, 0x08, 0x0c, 0x32, 0x50, 0x08, 0x0c, 0xd7, 0xf8, 0x00, 0x96, + 0x61, 0x14, 0x21, 0x48, 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0x50, 0xa8, 0x67, + 0x01, 0x03, 0xa8, 0x7b, 0x00, 0x29, 0xa8, 0x77, 0x00, 0x00, 0x08, 0x0c, + 0x6e, 0x9f, 0x08, 0x0c, 0xd2, 0xc3, 0x00, 0x9e, 0x08, 0x0c, 0xb2, 0xd3, + 0x08, 0x0c, 0x9b, 0xd3, 0x00, 0x05, 0xa8, 0x7b, 0x00, 0x15, 0xd1, 0xfc, + 0x01, 0x80, 0xa8, 0x7b, 0x00, 0x07, 0x80, 0x02, 0x80, 0x00, 0x81, 0x0a, + 0x91, 0x89, 0x00, 0x00, 0x00, 0x06, 0x00, 0x16, 0x20, 0x09, 0x1a, 0x7d, + 0x21, 0x04, 0x80, 0x00, 0x20, 0x0a, 0x00, 0x1e, 0x00, 0x0e, 0xa9, 0x92, + 0xa8, 0x8e, 0x00, 0x05, 0x91, 0x82, 0x00, 0x54, 0x12, 0x20, 0x91, 0x82, + 0x00, 0x40, 0x02, 0x08, 0x00, 0x0a, 0x00, 0x05, 0xc7, 0xbe, 0xc7, 0xbe, + 0xc7, 0xbe, 0xc7, 0xbe, 0xc7, 0xbe, 0xc7, 0xc0, 0xc7, 0xbe, 0xc7, 0xbe, + 0xc8, 0x66, 0xc7, 0xbe, 0xc7, 0xbe, 0xc7, 0xbe, 0xc7, 0xbe, 0xc7, 0xbe, + 0xc7, 0xbe, 0xc7, 0xbe, 0xc7, 0xbe, 0xc7, 0xbe, 0xc7, 0xbe, 0xc9, 0x98, + 0x08, 0x0c, 0x0d, 0xc5, 0x00, 0x76, 0x00, 0xa6, 0x00, 0xe6, 0x00, 0x96, + 0x20, 0x71, 0x02, 0x60, 0x61, 0x14, 0x21, 0x50, 0x76, 0x44, 0xb6, 0x76, + 0x96, 0xb4, 0x0f, 0xff, 0xb7, 0x7c, 0xc7, 0xe5, 0xb7, 0x7e, 0x62, 0x10, + 0x00, 0xb6, 0x22, 0x58, 0xba, 0x3c, 0x82, 0xff, 0x01, 0x10, 0x82, 0x11, + 0xba, 0x3e, 0x00, 0xbe, 0x86, 0xff, 0x09, 0x04, 0xc8, 0x5f, 0x96, 0x94, + 0xff, 0x00, 0x92, 0x84, 0x0c, 0x00, 0x01, 0x20, 0x70, 0x48, 0xb0, 0x92, + 0x70, 0x4c, 0xb0, 0x8e, 0x92, 0x84, 0x03, 0x00, 0x09, 0x04, 0xc8, 0x5f, + 0x96, 0x86, 0x01, 0x00, 0x11, 0x30, 0x70, 0x64, 0x90, 0x05, 0x11, 0x18, + 0xc6, 0xc4, 0xb6, 0x76, 0x0c, 0x38, 0x08, 0x0c, 0x10, 0x0e, 0x09, 0x0c, + 0x0d, 0xc5, 0x29, 0x00, 0xb0, 0x7a, 0xb7, 0x7c, 0x97, 0xbd, 0x02, 0x00, + 0xb7, 0x7e, 0xa8, 0x67, 0x01, 0x03, 0xb0, 0x68, 0xa8, 0x6a, 0xb0, 0x6c, + 0xa8, 0x6e, 0xb0, 0x70, 0xa8, 0x72, 0x70, 0x44, 0x90, 0x84, 0xf0, 0x00, + 0x96, 0x35, 0xae, 0x76, 0x96, 0x8c, 0x0c, 0x00, 0x01, 0x20, 0x73, 0x48, + 0xab, 0x92, 0x73, 0x4c, 0xab, 0x8e, 0x96, 0x8c, 0x00, 0xff, 0x91, 0x86, + 0x00, 0x02, 0x01, 0x80, 0x91, 0x86, 0x00, 0x28, 0x11, 0x18, 0xa8, 0x7b, + 0x00, 0x1c, 0x00, 0x60, 0xd6, 0xdc, 0x01, 0x18, 0xa8, 0x7b, 0x00, 0x15, + 0x00, 0x38, 0xd6, 0xd4, 0x01, 0x18, 0xa8, 0x7b, 0x00, 0x07, 0x00, 0x10, + 0xa8, 0x7b, 0x00, 0x00, 0xaf, 0x7e, 0xb0, 0x80, 0xa8, 0x82, 0xb0, 0x84, + 0xa8, 0x86, 0x90, 0x1e, 0xd6, 0xc4, 0x01, 0x90, 0x73, 0x5c, 0xab, 0x86, + 0x83, 0xff, 0x01, 0x70, 0x93, 0x8a, 0x00, 0x09, 0x02, 0x10, 0x20, 0x19, + 0x00, 0x08, 0x00, 0x36, 0x23, 0x08, 0x20, 0x19, 0x00, 0x18, 0x20, 0x11, + 0x00, 0x25, 0x08, 0x0c, 0xcc, 0x85, 0x00, 0x3e, 0xd6, 0xcc, 0x01, 0xe8, + 0x71, 0x54, 0xa9, 0x8a, 0x81, 0xff, 0x01, 0xc8, 0x91, 0x92, 0x00, 0x21, + 0x12, 0x60, 0x83, 0x04, 0x90, 0x98, 0x00, 0x18, 0x20, 0x11, 0x00, 0x29, + 0x08, 0x0c, 0xcc, 0x85, 0x20, 0x11, 0x02, 0x05, 0x20, 0x13, 0x00, 0x00, + 0x00, 0x50, 0xb0, 0x68, 0xd0, 0xfc, 0x01, 0x20, 0x20, 0x09, 0x00, 0x20, + 0xa9, 0x8a, 0x0c, 0x68, 0x29, 0x50, 0x08, 0x0c, 0xcc, 0x24, 0x08, 0x0c, + 0x1a, 0x5a, 0x00, 0x9e, 0x00, 0xee, 0x00, 0xae, 0x00, 0x7e, 0x00, 0x05, + 0x20, 0x01, 0x19, 0x88, 0x20, 0x04, 0x60, 0x42, 0x00, 0x96, 0x61, 0x14, + 0x21, 0x48, 0xa8, 0x3c, 0xa9, 0x40, 0x91, 0x05, 0x11, 0x18, 0xa8, 0x7c, + 0xc0, 0xdc, 0xa8, 0x7e, 0x60, 0x03, 0x00, 0x02, 0xa9, 0x7c, 0xd1, 0xe4, + 0x09, 0x04, 0xc9, 0x93, 0x60, 0x43, 0x00, 0x00, 0x60, 0x10, 0x00, 0xb6, + 0x20, 0x58, 0xb8, 0x00, 0x00, 0xbe, 0xd0, 0xbc, 0x15, 0x00, 0xd1, 0xcc, + 0x09, 0x04, 0xc9, 0x62, 0xa9, 0x78, 0xa8, 0x68, 0xd0, 0xfc, 0x09, 0x04, + 0xc9, 0x23, 0x00, 0x16, 0xa8, 0x7c, 0x00, 0x06, 0xa8, 0x80, 0x00, 0x06, + 0x00, 0xa6, 0x21, 0x50, 0xb1, 0x74, 0x91, 0x84, 0x00, 0xff, 0x90, 0xb6, + 0x00, 0x02, 0x09, 0x04, 0xc8, 0xf0, 0x90, 0x86, 0x00, 0x28, 0x19, 0x04, + 0xc8, 0xdc, 0xa8, 0x7b, 0x00, 0x1c, 0xb0, 0x7b, 0x00, 0x1c, 0x08, 0x04, + 0xc8, 0xf8, 0x60, 0x24, 0xd0, 0xf4, 0x11, 0xd0, 0xa8, 0x38, 0xaa, 0x34, + 0x92, 0x05, 0x09, 0xc8, 0xa8, 0x38, 0xaa, 0x90, 0x92, 0x06, 0x11, 0x20, + 0xa8, 0x8c, 0xaa, 0x34, 0x92, 0x06, 0x09, 0x88, 0x60, 0x24, 0xd0, 0xd4, + 0x11, 0x48, 0xa9, 0xac, 0xa8, 0x34, 0x91, 0x02, 0x60, 0x3a, 0xa9, 0xb0, + 0xa8, 0x38, 0x91, 0x03, 0x60, 0x3e, 0x60, 0x24, 0xc0, 0xf5, 0x60, 0x26, + 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x3c, 0x80, 0x00, 0xb8, 0x3e, + 0x00, 0xbe, 0x90, 0x06, 0xa8, 0x76, 0xa8, 0x92, 0xa8, 0x8e, 0xa8, 0x7c, + 0xc0, 0xe4, 0xa8, 0x7e, 0xd0, 0xcc, 0x01, 0x40, 0xc0, 0xcc, 0xa8, 0x7e, + 0x00, 0x96, 0xa8, 0x78, 0x20, 0x48, 0x08, 0x0c, 0x0f, 0xc0, 0x00, 0x9e, + 0x08, 0x0c, 0xd4, 0x12, 0x08, 0x04, 0xc9, 0x93, 0xd1, 0xdc, 0x01, 0x58, + 0xa8, 0x7b, 0x00, 0x15, 0xb0, 0x7b, 0x00, 0x15, 0x08, 0x0c, 0xd6, 0xa6, + 0x01, 0x18, 0xb1, 0x74, 0xc1, 0xdc, 0xb1, 0x76, 0x00, 0x78, 0xd1, 0xd4, + 0x01, 0x28, 0xa8, 0x7b, 0x00, 0x07, 0xb0, 0x7b, 0x00, 0x07, 0x00, 0x40, + 0xa8, 0x7c, 0xd0, 0xac, 0x01, 0x28, 0xa8, 0x34, 0xa9, 0x38, 0x91, 0x15, + 0x19, 0x0c, 0xc7, 0x8b, 0xa8, 0x7c, 0xb0, 0x7e, 0xa8, 0x90, 0xb0, 0x92, + 0xa8, 0x8c, 0xb0, 0x8e, 0xa8, 0x60, 0x20, 0xe8, 0xa8, 0x5c, 0x90, 0x80, + 0x00, 0x19, 0x20, 0xa0, 0x20, 0xa9, 0x00, 0x20, 0x8a, 0x06, 0x80, 0x06, + 0x80, 0x07, 0x90, 0x94, 0x00, 0x3f, 0x22, 0xe0, 0x90, 0x84, 0xff, 0xc0, + 0x90, 0x80, 0x00, 0x19, 0x20, 0x98, 0x40, 0x03, 0x00, 0xae, 0x00, 0x0e, + 0xa8, 0x82, 0x00, 0x0e, 0xc0, 0xcc, 0xa8, 0x7e, 0x08, 0x0c, 0xd7, 0x86, + 0x00, 0x1e, 0xa8, 0x74, 0x00, 0x06, 0x21, 0x48, 0x08, 0x0c, 0x0f, 0xc0, + 0x00, 0x1e, 0x08, 0x04, 0xc9, 0x8f, 0x00, 0x16, 0x00, 0xa6, 0x21, 0x50, + 0xb1, 0x74, 0x91, 0x84, 0x00, 0xff, 0x90, 0xb6, 0x00, 0x02, 0x01, 0xe0, + 0x90, 0x86, 0x00, 0x28, 0x11, 0x28, 0xa8, 0x7b, 0x00, 0x1c, 0xb0, 0x7b, + 0x00, 0x1c, 0x00, 0xe0, 0xd1, 0xdc, 0x01, 0x58, 0xa8, 0x7b, 0x00, 0x15, + 0xb0, 0x7b, 0x00, 0x15, 0x08, 0x0c, 0xd6, 0xa6, 0x01, 0x18, 0xb1, 0x74, + 0xc1, 0xdc, 0xb1, 0x76, 0x00, 0x78, 0xd1, 0xd4, 0x01, 0x28, 0xa8, 0x7b, + 0x00, 0x07, 0xb0, 0x7b, 0x00, 0x07, 0x00, 0x40, 0xa8, 0x7c, 0xd0, 0xac, + 0x01, 0x28, 0xa8, 0x34, 0xa9, 0x38, 0x91, 0x15, 0x19, 0x0c, 0xc7, 0x8b, + 0xa8, 0x90, 0xb0, 0x92, 0xa8, 0x8c, 0xb0, 0x8e, 0xa8, 0x7c, 0xb0, 0x7e, + 0x00, 0xae, 0x08, 0x0c, 0x0f, 0xc0, 0x00, 0x9e, 0x08, 0x0c, 0xd7, 0x86, + 0xa9, 0x74, 0x00, 0x16, 0x08, 0x0c, 0xcc, 0x75, 0x00, 0x1e, 0x04, 0x68, + 0xa8, 0x67, 0x01, 0x03, 0xa9, 0x74, 0x91, 0x84, 0x00, 0xff, 0x90, 0xb6, + 0x00, 0x02, 0x01, 0xb0, 0x90, 0x86, 0x00, 0x28, 0x11, 0x18, 0xa8, 0x7b, + 0x00, 0x1c, 0x00, 0xd0, 0xd1, 0xdc, 0x01, 0x48, 0xa8, 0x7b, 0x00, 0x15, + 0x08, 0x0c, 0xd6, 0xa6, 0x01, 0x18, 0xa9, 0x74, 0xc1, 0xdc, 0xa9, 0x76, + 0x00, 0x78, 0xd1, 0xd4, 0x01, 0x18, 0xa8, 0x7b, 0x00, 0x07, 0x00, 0x50, + 0xa8, 0x7b, 0x00, 0x00, 0xa8, 0x7c, 0xd0, 0xac, 0x01, 0x28, 0xa8, 0x34, + 0xa9, 0x38, 0x91, 0x15, 0x19, 0x0c, 0xc7, 0x8b, 0xa9, 0x74, 0x00, 0x16, + 0x08, 0x0c, 0x6c, 0xb9, 0x00, 0x1e, 0xd1, 0xe4, 0x11, 0x20, 0x08, 0x0c, + 0xb2, 0xd3, 0x00, 0x9e, 0x00, 0x05, 0x08, 0x0c, 0xd3, 0xd8, 0x0c, 0xd8, + 0x61, 0x14, 0x00, 0x96, 0x21, 0x48, 0xa9, 0x7c, 0xd1, 0xe4, 0x19, 0x0c, + 0x1a, 0x7a, 0x00, 0x9e, 0x00, 0x05, 0x08, 0x0c, 0x99, 0xa5, 0x00, 0x10, + 0x08, 0x0c, 0x9a, 0x61, 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0xf0, 0x00, 0x96, + 0x61, 0x14, 0x21, 0x48, 0x08, 0x0c, 0xd2, 0xe0, 0x11, 0x18, 0x08, 0x0c, + 0xbc, 0xb6, 0x00, 0xa0, 0xa8, 0x67, 0x01, 0x03, 0x20, 0x09, 0x18, 0x0c, + 0x21, 0x0c, 0xd1, 0x8c, 0x11, 0xb8, 0xd1, 0x84, 0x11, 0x90, 0x61, 0x08, + 0xa9, 0x7a, 0x91, 0x8e, 0x00, 0x29, 0x11, 0x10, 0x08, 0x0c, 0xef, 0x85, + 0xa8, 0x77, 0x00, 0x00, 0x08, 0x0c, 0x6e, 0x9f, 0x00, 0x9e, 0x08, 0x0c, + 0xb2, 0xd3, 0x08, 0x0c, 0x9a, 0xb1, 0x08, 0x04, 0x9b, 0xd3, 0xa8, 0x7b, + 0x00, 0x04, 0x0c, 0x90, 0xa8, 0x7b, 0x00, 0x04, 0x0c, 0x78, 0x91, 0x82, + 0x00, 0x54, 0x12, 0x20, 0x91, 0x82, 0x00, 0x40, 0x02, 0x08, 0x00, 0x0a, + 0x00, 0x05, 0xc9, 0xef, 0xc9, 0xef, 0xc9, 0xef, 0xc9, 0xef, 0xc9, 0xef, + 0xc9, 0xf1, 0xc9, 0xef, 0xc9, 0xef, 0xc9, 0xef, 0xc9, 0xef, 0xc9, 0xef, + 0xc9, 0xef, 0xc9, 0xef, 0xc9, 0xef, 0xc9, 0xef, 0xc9, 0xef, 0xc9, 0xef, + 0xc9, 0xef, 0xc9, 0xef, 0xc9, 0xef, 0x08, 0x0c, 0x0d, 0xc5, 0x08, 0x0c, + 0x57, 0xdd, 0x01, 0xf8, 0x60, 0x14, 0x71, 0x44, 0x91, 0x8c, 0x0f, 0xff, + 0x90, 0x16, 0xd1, 0xc4, 0x01, 0x18, 0x72, 0x64, 0x92, 0x94, 0x00, 0xff, + 0x00, 0x96, 0x90, 0x4d, 0x01, 0x88, 0xa8, 0x7b, 0x00, 0x00, 0xa8, 0x64, + 0x90, 0x86, 0x01, 0x39, 0x01, 0x28, 0xa8, 0x67, 0x01, 0x03, 0xa9, 0x76, + 0xaa, 0x96, 0x00, 0x30, 0xa8, 0x97, 0x40, 0x00, 0xa9, 0x9a, 0xaa, 0x9e, + 0x08, 0x0c, 0x6e, 0x9f, 0x00, 0x9e, 0x08, 0x04, 0xb2, 0xd3, 0x91, 0x82, + 0x00, 0x85, 0x00, 0x02, 0xca, 0x27, 0xca, 0x25, 0xca, 0x25, 0xca, 0x33, + 0xca, 0x25, 0xca, 0x25, 0xca, 0x25, 0xca, 0x25, 0xca, 0x25, 0xca, 0x25, + 0xca, 0x25, 0xca, 0x25, 0xca, 0x25, 0x08, 0x0c, 0x0d, 0xc5, 0x60, 0x03, + 0x00, 0x01, 0x61, 0x06, 0x08, 0x0c, 0x94, 0xff, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0x9a, 0xb1, 0x01, 0x2e, 0x00, 0x05, 0x00, 0x26, + 0x00, 0x56, 0x00, 0xd6, 0x00, 0xe6, 0x20, 0x71, 0x02, 0x60, 0x72, 0x24, + 0x62, 0x16, 0x72, 0x20, 0x08, 0x0c, 0xd0, 0xc6, 0x01, 0xf8, 0x22, 0x68, + 0x68, 0x00, 0x90, 0x86, 0x00, 0x00, 0x01, 0xd0, 0x60, 0x10, 0x6d, 0x10, + 0x95, 0x2e, 0x11, 0xb0, 0x00, 0xc6, 0x2d, 0x60, 0x00, 0xd6, 0x08, 0x0c, + 0xcc, 0xe6, 0x00, 0xde, 0x00, 0xce, 0x01, 0x58, 0x70, 0x2c, 0xd0, 0x84, + 0x11, 0x18, 0x08, 0x0c, 0xcc, 0xb0, 0x00, 0x10, 0x68, 0x03, 0x00, 0x02, + 0x60, 0x07, 0x00, 0x86, 0x00, 0x28, 0x08, 0x0c, 0xcc, 0xd2, 0x0d, 0x90, + 0x60, 0x07, 0x00, 0x87, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x94, 0xff, + 0x08, 0x0c, 0x9a, 0xb1, 0x72, 0x20, 0x08, 0x0c, 0xd0, 0xc6, 0x01, 0x78, + 0x68, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x00, 0x00, 0xbe, 0xd0, 0xbc, + 0x01, 0x40, 0x68, 0x24, 0xd0, 0xec, 0x01, 0x28, 0x00, 0xc6, 0x2d, 0x60, + 0x08, 0x0c, 0xd4, 0x12, 0x00, 0xce, 0x00, 0xee, 0x00, 0xde, 0x00, 0x5e, + 0x00, 0x2e, 0x00, 0x05, 0x91, 0x86, 0x00, 0x13, 0x11, 0x60, 0x60, 0x04, + 0x90, 0x8a, 0x00, 0x85, 0x0a, 0x0c, 0x0d, 0xc5, 0x90, 0x8a, 0x00, 0x92, + 0x1a, 0x0c, 0x0d, 0xc5, 0x90, 0x82, 0x00, 0x85, 0x00, 0xe2, 0x91, 0x86, + 0x00, 0x27, 0x01, 0x20, 0x91, 0x86, 0x00, 0x14, 0x19, 0x0c, 0x0d, 0xc5, + 0x08, 0x0c, 0x99, 0xa5, 0x00, 0x96, 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, + 0xd0, 0xd8, 0x01, 0x40, 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x77, 0x00, 0x00, + 0xa8, 0x7b, 0x00, 0x29, 0x08, 0x0c, 0x6e, 0x9f, 0x00, 0x9e, 0x08, 0x0c, + 0xb3, 0x06, 0x08, 0x04, 0x9a, 0xb1, 0xca, 0xb6, 0xca, 0xb8, 0xca, 0xb8, + 0xca, 0xb6, 0xca, 0xb6, 0xca, 0xb6, 0xca, 0xb6, 0xca, 0xb6, 0xca, 0xb6, + 0xca, 0xb6, 0xca, 0xb6, 0xca, 0xb6, 0xca, 0xb6, 0x08, 0x0c, 0x0d, 0xc5, + 0x08, 0x0c, 0x99, 0xa5, 0x08, 0x0c, 0xb3, 0x06, 0x08, 0x0c, 0x9a, 0xb1, + 0x00, 0x05, 0x91, 0x86, 0x00, 0x13, 0x11, 0x28, 0x60, 0x04, 0x90, 0x82, + 0x00, 0x85, 0x20, 0x08, 0x04, 0xb8, 0x91, 0x86, 0x00, 0x27, 0x11, 0xf8, + 0x08, 0x0c, 0x99, 0xa5, 0x08, 0x0c, 0x32, 0x50, 0x08, 0x0c, 0xd7, 0xf8, + 0x00, 0x96, 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0x50, + 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x77, 0x00, 0x00, 0xa8, 0x7b, 0x00, 0x29, + 0x08, 0x0c, 0x6e, 0x9f, 0x08, 0x0c, 0xd2, 0xc3, 0x00, 0x9e, 0x08, 0x0c, + 0xb2, 0xd3, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x05, 0x08, 0x0c, 0xb3, 0x6d, + 0x0c, 0xe0, 0x91, 0x86, 0x00, 0x14, 0x1d, 0xd0, 0x08, 0x0c, 0x99, 0xa5, + 0x00, 0x96, 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0xd0, 0xd8, 0x0d, 0x60, + 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x77, 0x00, 0x00, 0xa8, 0x7b, 0x00, 0x06, + 0xa8, 0x80, 0xc0, 0xec, 0xa8, 0x82, 0x08, 0xf0, 0x00, 0x02, 0xcb, 0x0e, + 0xcb, 0x0c, 0xcb, 0x0c, 0xcb, 0x0c, 0xcb, 0x0c, 0xcb, 0x0c, 0xcb, 0x26, + 0xcb, 0x0c, 0xcb, 0x0c, 0xcb, 0x0c, 0xcb, 0x0c, 0xcb, 0x0c, 0xcb, 0x0c, + 0x08, 0x0c, 0x0d, 0xc5, 0x08, 0x0c, 0x99, 0xa5, 0x60, 0x34, 0x90, 0x8c, + 0xff, 0x00, 0x81, 0x0f, 0x91, 0x86, 0x00, 0x39, 0x01, 0x18, 0x91, 0x86, + 0x00, 0x35, 0x11, 0x18, 0x20, 0x01, 0x19, 0x86, 0x00, 0x10, 0x20, 0x01, + 0x19, 0x87, 0x20, 0x04, 0x60, 0x1a, 0x60, 0x03, 0x00, 0x0c, 0x08, 0x0c, + 0x9a, 0xb1, 0x00, 0x05, 0x08, 0x0c, 0x99, 0xa5, 0x60, 0x34, 0x90, 0x8c, + 0xff, 0x00, 0x81, 0x0f, 0x91, 0x86, 0x00, 0x39, 0x01, 0x18, 0x91, 0x86, + 0x00, 0x35, 0x11, 0x18, 0x20, 0x01, 0x19, 0x86, 0x00, 0x10, 0x20, 0x01, + 0x19, 0x87, 0x20, 0x04, 0x60, 0x1a, 0x60, 0x03, 0x00, 0x0e, 0x08, 0x0c, + 0x9a, 0xb1, 0x00, 0x05, 0x91, 0x82, 0x00, 0x92, 0x12, 0x20, 0x91, 0x82, + 0x00, 0x85, 0x02, 0x08, 0x00, 0x12, 0x08, 0x04, 0xb3, 0x6d, 0xcb, 0x54, + 0xcb, 0x54, 0xcb, 0x54, 0xcb, 0x54, 0xcb, 0x56, 0xcb, 0xa3, 0xcb, 0x54, + 0xcb, 0x54, 0xcb, 0x54, 0xcb, 0x54, 0xcb, 0x54, 0xcb, 0x54, 0xcb, 0x54, + 0x08, 0x0c, 0x0d, 0xc5, 0x00, 0x96, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, + 0xb8, 0x00, 0x00, 0xbe, 0xd0, 0xbc, 0x01, 0x68, 0x60, 0x34, 0x90, 0x8c, + 0xff, 0x00, 0x81, 0x0f, 0x91, 0x86, 0x00, 0x39, 0x01, 0x18, 0x91, 0x86, + 0x00, 0x35, 0x11, 0x18, 0x00, 0x9e, 0x08, 0x04, 0xcb, 0xb7, 0x08, 0x0c, + 0xd0, 0xd8, 0x11, 0x18, 0x08, 0x0c, 0xd2, 0xc3, 0x00, 0x68, 0x60, 0x14, + 0x20, 0x48, 0xa8, 0x7c, 0xd0, 0xe4, 0x11, 0x10, 0x08, 0x0c, 0xd2, 0xc3, + 0xa8, 0x67, 0x01, 0x03, 0x08, 0x0c, 0xd7, 0xc3, 0x08, 0x0c, 0x6e, 0x9f, + 0x00, 0xd6, 0x2c, 0x68, 0x08, 0x0c, 0xb2, 0x7d, 0x01, 0xd0, 0x60, 0x03, + 0x00, 0x01, 0x60, 0x07, 0x00, 0x1e, 0x60, 0x0b, 0xff, 0xff, 0x20, 0x09, + 0x02, 0x6e, 0x21, 0x0c, 0x61, 0x3a, 0x20, 0x09, 0x02, 0x6f, 0x21, 0x0c, + 0x61, 0x3e, 0x69, 0x10, 0x61, 0x12, 0x08, 0x0c, 0xd5, 0x54, 0x69, 0x54, + 0x61, 0x56, 0x60, 0x23, 0x00, 0x01, 0x08, 0x0c, 0x94, 0xff, 0x08, 0x0c, + 0x9a, 0xb1, 0x2d, 0x60, 0x00, 0xde, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x9e, + 0x00, 0x05, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x00, 0x00, 0xbe, + 0xd0, 0xbc, 0x05, 0xa0, 0x60, 0x34, 0x90, 0x8c, 0xff, 0x00, 0x81, 0x0f, + 0x91, 0x86, 0x00, 0x35, 0x01, 0x30, 0x91, 0x86, 0x00, 0x1e, 0x01, 0x18, + 0x91, 0x86, 0x00, 0x39, 0x15, 0x38, 0x00, 0xd6, 0x2c, 0x68, 0x08, 0x0c, + 0xd7, 0x59, 0x11, 0xf0, 0x08, 0x0c, 0xb2, 0x7d, 0x01, 0xd8, 0x61, 0x06, + 0x60, 0x03, 0x00, 0x01, 0x60, 0x23, 0x00, 0x01, 0x69, 0x10, 0x61, 0x12, + 0x69, 0x2c, 0x61, 0x2e, 0x69, 0x30, 0x61, 0x32, 0x69, 0x34, 0x91, 0x8c, + 0x00, 0xff, 0x61, 0x36, 0x69, 0x38, 0x61, 0x3a, 0x69, 0x3c, 0x61, 0x3e, + 0x69, 0x54, 0x61, 0x56, 0x08, 0x0c, 0xd5, 0x54, 0x08, 0x0c, 0x94, 0xff, + 0x08, 0x0c, 0x9a, 0xb1, 0x2d, 0x60, 0x00, 0xde, 0x08, 0x04, 0xb2, 0xd3, + 0x00, 0x96, 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0xc8, + 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x80, 0xd0, 0xb4, 0x01, 0x28, 0xc0, 0xec, + 0xa8, 0x82, 0xa8, 0x7b, 0x00, 0x06, 0x00, 0x48, 0xd0, 0xbc, 0x01, 0x18, + 0xa8, 0x7b, 0x00, 0x02, 0x00, 0x20, 0xa8, 0x7b, 0x00, 0x05, 0x08, 0x0c, + 0xd3, 0xd4, 0xa8, 0x77, 0x00, 0x00, 0x08, 0x0c, 0x6e, 0x9f, 0x08, 0x0c, + 0xd2, 0xc3, 0x00, 0x9e, 0x08, 0x04, 0xb2, 0xd3, 0x00, 0x16, 0x00, 0x96, + 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0x40, 0xa8, 0x67, + 0x01, 0x03, 0xa8, 0x7b, 0x00, 0x28, 0xa8, 0x77, 0x00, 0x00, 0x08, 0x0c, + 0x6e, 0x9f, 0x00, 0x9e, 0x00, 0x1e, 0x91, 0x86, 0x00, 0x13, 0x01, 0x48, + 0x91, 0x86, 0x00, 0x14, 0x01, 0x30, 0x91, 0x86, 0x00, 0x27, 0x01, 0x18, + 0x08, 0x0c, 0xb3, 0x6d, 0x00, 0x30, 0x08, 0x0c, 0x99, 0xa5, 0x08, 0x0c, + 0xb3, 0x06, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x05, 0x00, 0x56, 0x00, 0x66, + 0x00, 0x96, 0x00, 0xa6, 0x20, 0x29, 0x00, 0x01, 0x91, 0x82, 0x01, 0x01, + 0x12, 0x08, 0x00, 0x10, 0x20, 0x09, 0x01, 0x00, 0x21, 0x30, 0x83, 0x04, + 0x90, 0x98, 0x00, 0x18, 0x20, 0x09, 0x00, 0x20, 0x20, 0x11, 0x00, 0x29, + 0x08, 0x0c, 0xcc, 0x85, 0x96, 0xb2, 0x00, 0x20, 0xb0, 0x04, 0x90, 0x4d, + 0x01, 0x10, 0x08, 0x0c, 0x0f, 0xc0, 0x08, 0x0c, 0x10, 0x0e, 0x05, 0x20, + 0x85, 0x28, 0xa8, 0x67, 0x01, 0x10, 0xa8, 0x6b, 0x00, 0x00, 0x29, 0x20, + 0xb4, 0x06, 0x96, 0x8a, 0x00, 0x3d, 0x12, 0x28, 0x26, 0x08, 0x20, 0x11, + 0x00, 0x1b, 0x04, 0x99, 0x00, 0xa8, 0x96, 0xb2, 0x00, 0x3c, 0x20, 0x09, + 0x00, 0x3c, 0x29, 0x50, 0x20, 0x11, 0x00, 0x1b, 0x04, 0x51, 0x0c, 0x28, + 0x20, 0x01, 0x02, 0x05, 0x20, 0x03, 0x00, 0x00, 0x00, 0xae, 0x85, 0x2f, + 0x95, 0xad, 0x00, 0x03, 0xb5, 0x66, 0x95, 0xac, 0x00, 0x00, 0x00, 0x48, + 0x20, 0x01, 0x02, 0x05, 0x20, 0x03, 0x00, 0x00, 0x00, 0xae, 0x85, 0x2f, + 0x95, 0xad, 0x00, 0x03, 0xb5, 0x66, 0x00, 0x9e, 0x00, 0x6e, 0x00, 0x5e, + 0x00, 0x05, 0x00, 0xa6, 0x89, 0xff, 0x01, 0x58, 0xa8, 0x04, 0x90, 0x55, + 0x01, 0x30, 0xa8, 0x07, 0x00, 0x00, 0x08, 0x0c, 0x6e, 0x9f, 0x2a, 0x48, + 0x0c, 0xb8, 0x08, 0x0c, 0x6e, 0x9f, 0x00, 0xae, 0x00, 0x05, 0x00, 0xf6, + 0x20, 0x79, 0x02, 0x00, 0x78, 0x14, 0x90, 0x85, 0x00, 0x80, 0x78, 0x16, + 0xd1, 0x84, 0x01, 0x08, 0x81, 0x08, 0x81, 0x0c, 0x20, 0xa9, 0x00, 0x01, + 0xa8, 0x60, 0x20, 0xe8, 0xa8, 0x5c, 0x92, 0x00, 0x20, 0xa0, 0x20, 0xe1, + 0x00, 0x00, 0x23, 0x00, 0x9e, 0x00, 0x20, 0x98, 0x40, 0x03, 0x83, 0x18, + 0x93, 0x86, 0x00, 0x20, 0x11, 0x48, 0x20, 0x18, 0x23, 0x00, 0x9e, 0x00, + 0x20, 0x98, 0x78, 0x14, 0x80, 0x00, 0x90, 0x85, 0x00, 0x80, 0x78, 0x16, + 0x81, 0x09, 0x1d, 0x80, 0x78, 0x17, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x05, + 0x69, 0x20, 0x91, 0x86, 0x00, 0x03, 0x01, 0x18, 0x91, 0x86, 0x00, 0x02, + 0x11, 0xd0, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x2d, 0x60, 0x00, 0x96, + 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0x50, 0x20, 0x01, + 0x00, 0x06, 0xa9, 0x80, 0xc1, 0xd5, 0x08, 0x0c, 0x71, 0x0b, 0x08, 0x0c, + 0x6e, 0x92, 0x08, 0x0c, 0xd2, 0xc3, 0x00, 0x9e, 0x08, 0x0c, 0xb3, 0x06, + 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x00, 0x05, 0x00, 0xc6, 0x70, 0x2c, + 0xd0, 0x84, 0x11, 0x70, 0x60, 0x08, 0x20, 0x60, 0x60, 0x20, 0x90, 0x86, + 0x00, 0x02, 0x11, 0x40, 0x61, 0x04, 0x91, 0x86, 0x00, 0x85, 0x01, 0x18, + 0x91, 0x86, 0x00, 0x8b, 0x11, 0x08, 0x90, 0x06, 0x00, 0xce, 0x00, 0x05, + 0x00, 0x66, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x31, 0x00, 0x01, + 0x60, 0x20, 0x90, 0x84, 0x00, 0x0f, 0x00, 0x83, 0x01, 0x2e, 0x00, 0x6e, + 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0x66, 0x20, 0x31, + 0x00, 0x00, 0x60, 0x20, 0x90, 0x84, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x6e, + 0x01, 0x2e, 0x00, 0x05, 0xcd, 0x1d, 0xcd, 0x1d, 0xcd, 0x18, 0xcd, 0x3f, + 0xcd, 0x0f, 0xcd, 0x18, 0xcd, 0x3f, 0xcd, 0x18, 0xcd, 0x18, 0x92, 0x65, + 0xcd, 0x18, 0xcd, 0x18, 0xcd, 0x18, 0xcd, 0x0f, 0xcd, 0x0f, 0x08, 0x0c, + 0x0d, 0xc5, 0x00, 0x36, 0x20, 0x19, 0x00, 0x10, 0x08, 0x0c, 0xe7, 0x46, + 0x00, 0x3e, 0x00, 0x05, 0x90, 0x06, 0x00, 0x05, 0x90, 0x85, 0x00, 0x01, + 0x00, 0x05, 0x00, 0x96, 0x86, 0xff, 0x11, 0xd8, 0x60, 0x14, 0x20, 0x48, + 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0xc0, 0xa8, 0x64, 0x90, 0x86, 0x01, 0x39, + 0x11, 0x28, 0xa8, 0x7b, 0x00, 0x05, 0xa8, 0x83, 0x00, 0x00, 0x00, 0x28, + 0x90, 0x0e, 0x20, 0x01, 0x00, 0x05, 0x08, 0x0c, 0x71, 0x0b, 0x08, 0x0c, + 0xd3, 0xd4, 0x08, 0x0c, 0x6e, 0x92, 0x08, 0x0c, 0xb3, 0x06, 0x90, 0x85, + 0x00, 0x01, 0x00, 0x9e, 0x00, 0x05, 0x90, 0x06, 0x0c, 0xe0, 0x60, 0x00, + 0x90, 0x8a, 0x00, 0x10, 0x1a, 0x0c, 0x0d, 0xc5, 0x00, 0x02, 0xcd, 0x55, + 0xcd, 0x85, 0xcd, 0x57, 0xcd, 0xa6, 0xcd, 0x80, 0xcd, 0x55, 0xcd, 0x18, + 0xcd, 0x1d, 0xcd, 0x1d, 0xcd, 0x18, 0xcd, 0x18, 0xcd, 0x18, 0xcd, 0x18, + 0xcd, 0x18, 0xcd, 0x18, 0xcd, 0x18, 0x08, 0x0c, 0x0d, 0xc5, 0x86, 0xff, + 0x15, 0x20, 0x60, 0x20, 0x90, 0x86, 0x00, 0x06, 0x05, 0x00, 0x00, 0x96, + 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0x68, 0xa8, 0x7c, + 0xd0, 0xcc, 0x01, 0x40, 0x00, 0x96, 0xc0, 0xcc, 0xa8, 0x7e, 0xa8, 0x78, + 0x20, 0x48, 0x08, 0x0c, 0x0f, 0xc0, 0x00, 0x9e, 0x08, 0x0c, 0xd3, 0xd4, + 0x00, 0x9e, 0x08, 0x0c, 0xd7, 0x9d, 0x60, 0x07, 0x00, 0x85, 0x60, 0x03, + 0x00, 0x0b, 0x60, 0x23, 0x00, 0x02, 0x08, 0x0c, 0x94, 0xff, 0x08, 0x0c, + 0x9a, 0xb1, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x00, 0x66, 0x08, 0x0c, + 0x1a, 0x8e, 0x00, 0x6e, 0x08, 0x90, 0x00, 0xe6, 0x20, 0x71, 0x19, 0xe8, + 0x70, 0x24, 0x9c, 0x06, 0x11, 0x20, 0x08, 0x0c, 0xa9, 0xd3, 0x00, 0xee, + 0x08, 0x40, 0x60, 0x20, 0x90, 0x84, 0x00, 0x0f, 0x90, 0x86, 0x00, 0x06, + 0x11, 0x50, 0x00, 0x86, 0x00, 0x96, 0x20, 0x49, 0x00, 0x01, 0x2c, 0x40, + 0x08, 0x0c, 0xaa, 0xfb, 0x00, 0x9e, 0x00, 0x8e, 0x00, 0x10, 0x08, 0x0c, + 0xa8, 0xd0, 0x00, 0xee, 0x19, 0x04, 0xcd, 0x57, 0x08, 0x04, 0xcd, 0x18, + 0x00, 0x36, 0x00, 0xe6, 0x20, 0x71, 0x19, 0xe8, 0x70, 0x3c, 0x9c, 0x06, + 0x11, 0x38, 0x90, 0x1e, 0x08, 0x0c, 0xaa, 0x49, 0x00, 0xee, 0x00, 0x3e, + 0x08, 0x04, 0xcd, 0x57, 0x08, 0x0c, 0xac, 0x2b, 0x00, 0xee, 0x00, 0x3e, + 0x19, 0x04, 0xcd, 0x57, 0x08, 0x04, 0xcd, 0x18, 0x00, 0xc6, 0x60, 0x20, + 0x90, 0x84, 0x00, 0x0f, 0x00, 0x13, 0x00, 0xce, 0x00, 0x05, 0xcd, 0xd9, + 0xce, 0xa3, 0xd0, 0x11, 0xcd, 0xe3, 0xb3, 0x06, 0xcd, 0xd9, 0xe7, 0x3c, + 0xd8, 0x05, 0xce, 0xa3, 0x92, 0x37, 0xd0, 0x9d, 0xcd, 0xd2, 0xcd, 0xd2, + 0xcd, 0xd2, 0xcd, 0xd2, 0x08, 0x0c, 0x0d, 0xc5, 0x08, 0x0c, 0xd2, 0xe0, + 0x11, 0x10, 0x08, 0x0c, 0xbc, 0xb6, 0x00, 0x05, 0x08, 0x0c, 0x99, 0xa5, + 0x08, 0x0c, 0x9a, 0xb1, 0x08, 0x04, 0xb2, 0xd3, 0x60, 0x1b, 0x00, 0x01, + 0x00, 0x05, 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0x30, 0x60, 0x14, 0x00, 0x96, + 0x20, 0x48, 0x2c, 0x00, 0xa8, 0x96, 0x00, 0x9e, 0x60, 0x00, 0x90, 0x8a, + 0x00, 0x10, 0x1a, 0x0c, 0x0d, 0xc5, 0x00, 0x02, 0xce, 0x02, 0xce, 0x04, + 0xce, 0x28, 0xce, 0x3c, 0xce, 0x62, 0xce, 0x02, 0xcd, 0xd9, 0xcd, 0xd9, + 0xcd, 0xd9, 0xce, 0x3c, 0xce, 0x3c, 0xce, 0x02, 0xce, 0x02, 0xce, 0x02, + 0xce, 0x02, 0xce, 0x46, 0x08, 0x0c, 0x0d, 0xc5, 0x00, 0xe6, 0x60, 0x14, + 0x00, 0x96, 0x20, 0x48, 0xa8, 0x80, 0xc0, 0xb5, 0xa8, 0x82, 0x00, 0x9e, + 0x20, 0x71, 0x19, 0xe8, 0x70, 0x24, 0x9c, 0x06, 0x01, 0xa0, 0x08, 0x0c, + 0xa8, 0xd0, 0x08, 0x0c, 0xd7, 0x9d, 0x60, 0x07, 0x00, 0x85, 0x60, 0x03, + 0x00, 0x0b, 0x60, 0x23, 0x00, 0x02, 0x20, 0x01, 0x19, 0x87, 0x20, 0x04, + 0x60, 0x1a, 0x08, 0x0c, 0x94, 0xff, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0xee, + 0x00, 0x05, 0x60, 0x1b, 0x00, 0x01, 0x0c, 0xd8, 0x00, 0x96, 0x60, 0x14, + 0x20, 0x48, 0xa8, 0x80, 0xc0, 0xb5, 0xa8, 0x82, 0x00, 0x9e, 0x08, 0x0c, + 0xd7, 0x9d, 0x60, 0x07, 0x00, 0x85, 0x60, 0x03, 0x00, 0x0b, 0x60, 0x23, + 0x00, 0x02, 0x08, 0x0c, 0x94, 0xff, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x05, + 0x00, 0x96, 0x60, 0x1b, 0x00, 0x01, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x80, + 0xc0, 0xb5, 0xa8, 0x82, 0x00, 0x9e, 0x00, 0x05, 0x08, 0x0c, 0x57, 0xdd, + 0x01, 0xb8, 0x60, 0x14, 0x00, 0x96, 0x90, 0x4d, 0x01, 0x90, 0xa8, 0x64, + 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x7b, 0x00, 0x06, 0x90, 0x86, 0x01, 0x39, + 0x11, 0x50, 0xa8, 0x67, 0x01, 0x39, 0xa8, 0x7b, 0x00, 0x30, 0xa8, 0x97, + 0x40, 0x05, 0xa8, 0x9b, 0x00, 0x04, 0x08, 0x0c, 0x6e, 0x9f, 0x00, 0x9e, + 0x08, 0x04, 0xb2, 0xd3, 0x60, 0x14, 0x00, 0x96, 0x90, 0x4d, 0x05, 0xc0, + 0xa9, 0x7c, 0xd1, 0xe4, 0x05, 0xa8, 0x20, 0x01, 0x18, 0x0f, 0x20, 0x04, + 0xd0, 0xc4, 0x01, 0x10, 0x00, 0x9e, 0x00, 0x05, 0xa8, 0x84, 0x00, 0x9e, + 0x80, 0x03, 0x80, 0x0b, 0x81, 0x0b, 0x91, 0x08, 0x61, 0x1a, 0x20, 0x01, + 0x00, 0x30, 0x2c, 0x08, 0x08, 0x0c, 0x16, 0x11, 0x20, 0x01, 0x03, 0x0c, + 0x20, 0x04, 0x90, 0x86, 0x00, 0x41, 0x11, 0x98, 0x60, 0x14, 0x00, 0x96, + 0x90, 0x4d, 0x09, 0x0c, 0x0d, 0xc5, 0xa8, 0x80, 0xd0, 0xf4, 0x11, 0x30, + 0xc0, 0xf5, 0xa8, 0x82, 0x00, 0x9e, 0x60, 0x1b, 0x00, 0x02, 0x00, 0x68, + 0x00, 0x9e, 0x00, 0xc6, 0x08, 0x0c, 0x23, 0x6e, 0x00, 0xce, 0x60, 0x00, + 0x90, 0x86, 0x00, 0x04, 0x11, 0x20, 0x20, 0x09, 0x00, 0x48, 0x08, 0x0c, + 0xb3, 0x52, 0x00, 0x05, 0x00, 0x9e, 0x08, 0x0c, 0x1a, 0x8e, 0x08, 0x04, + 0xce, 0x28, 0x60, 0x00, 0x90, 0x8a, 0x00, 0x10, 0x1a, 0x0c, 0x0d, 0xc5, + 0x00, 0x0b, 0x00, 0x05, 0xce, 0xba, 0xcd, 0xe0, 0xce, 0xbc, 0xce, 0xba, + 0xce, 0xbc, 0xce, 0xbc, 0xcd, 0xda, 0xce, 0xba, 0xcd, 0xd4, 0xcd, 0xd4, + 0xce, 0xba, 0xce, 0xba, 0xce, 0xba, 0xce, 0xba, 0xce, 0xba, 0xce, 0xba, + 0x08, 0x0c, 0x0d, 0xc5, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x04, + 0x90, 0x84, 0x00, 0xff, 0x00, 0xbe, 0x90, 0x8a, 0x00, 0x0c, 0x1a, 0x0c, + 0x0d, 0xc5, 0x00, 0xb6, 0x00, 0x13, 0x00, 0xbe, 0x00, 0x05, 0xce, 0xd7, + 0xcf, 0xa8, 0xce, 0xd9, 0xcf, 0x19, 0xce, 0xd9, 0xcf, 0x19, 0xce, 0xd9, + 0xce, 0xe7, 0xce, 0xd7, 0xcf, 0x19, 0xce, 0xd7, 0xcf, 0x08, 0x08, 0x0c, + 0x0d, 0xc5, 0x60, 0x04, 0x90, 0x8e, 0x00, 0x16, 0x05, 0xc0, 0x90, 0x8e, + 0x00, 0x04, 0x05, 0xa8, 0x90, 0x8e, 0x00, 0x02, 0x05, 0x90, 0x90, 0x8e, + 0x00, 0x52, 0x09, 0x04, 0xcf, 0xa4, 0x60, 0x04, 0x08, 0x0c, 0xd2, 0xe0, + 0x09, 0x04, 0xcf, 0xc1, 0x90, 0x8e, 0x00, 0x04, 0x11, 0x10, 0x08, 0x0c, + 0x32, 0x79, 0x90, 0x8e, 0x00, 0x21, 0x09, 0x04, 0xcf, 0xc5, 0x90, 0x8e, + 0x00, 0x22, 0x09, 0x04, 0xd0, 0x0c, 0x90, 0x8e, 0x00, 0x3d, 0x09, 0x04, + 0xcf, 0xc5, 0x90, 0x8e, 0x00, 0x39, 0x09, 0x04, 0xcf, 0xc9, 0x90, 0x8e, + 0x00, 0x35, 0x09, 0x04, 0xcf, 0xc9, 0x90, 0x8e, 0x00, 0x1e, 0x01, 0x78, + 0x90, 0x8e, 0x00, 0x01, 0x11, 0x40, 0x60, 0x10, 0x20, 0x58, 0xb8, 0x04, + 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x06, 0x01, 0x10, 0x08, 0x0c, + 0x32, 0x50, 0x08, 0x0c, 0xbc, 0xb6, 0x08, 0x04, 0xb3, 0x06, 0x00, 0xc6, + 0x00, 0xd6, 0x61, 0x04, 0x91, 0x86, 0x00, 0x16, 0x09, 0x04, 0xcf, 0x95, + 0x91, 0x86, 0x00, 0x02, 0x19, 0x04, 0xcf, 0x6a, 0x20, 0x01, 0x18, 0x37, + 0x20, 0x04, 0xd0, 0x8c, 0x11, 0xc8, 0x08, 0x0c, 0x76, 0x37, 0x11, 0xb0, + 0x08, 0x0c, 0xd7, 0xe3, 0x01, 0x38, 0x08, 0x0c, 0x76, 0x5a, 0x11, 0x20, + 0x08, 0x0c, 0x75, 0x41, 0x08, 0x04, 0xcf, 0xf5, 0x20, 0x01, 0x19, 0x7d, + 0x20, 0x03, 0x00, 0x01, 0x20, 0x01, 0x18, 0x00, 0x20, 0x03, 0x00, 0x01, + 0x08, 0x0c, 0x75, 0x63, 0x08, 0x04, 0xcf, 0xf5, 0x60, 0x10, 0x20, 0x58, + 0xb8, 0xa0, 0x90, 0x86, 0x00, 0x80, 0x01, 0x30, 0x20, 0x01, 0x18, 0x37, + 0x20, 0x04, 0xd0, 0xac, 0x19, 0x04, 0xcf, 0xf5, 0xb8, 0xa0, 0x90, 0x82, + 0x00, 0x81, 0x1a, 0x04, 0xcf, 0xf5, 0xb8, 0x40, 0x90, 0x84, 0x00, 0xff, + 0x90, 0x05, 0x01, 0x90, 0x80, 0x01, 0xb8, 0x42, 0x60, 0x17, 0x00, 0x00, + 0x60, 0x23, 0x00, 0x07, 0x60, 0x1b, 0x03, 0x98, 0x60, 0x43, 0x00, 0x00, + 0x08, 0x0c, 0xb2, 0x7d, 0x01, 0x28, 0x2b, 0x00, 0x60, 0x12, 0x60, 0x23, + 0x00, 0x01, 0x04, 0x58, 0x00, 0xde, 0x00, 0xce, 0x60, 0x04, 0x90, 0x8e, + 0x00, 0x02, 0x11, 0xa0, 0x60, 0x10, 0x20, 0x58, 0xb8, 0xa0, 0x90, 0x86, + 0x00, 0x7e, 0x11, 0x70, 0x20, 0x09, 0x18, 0x37, 0x21, 0x04, 0xc0, 0x85, + 0x20, 0x0a, 0x00, 0xe6, 0x20, 0x71, 0x18, 0x00, 0x08, 0x0c, 0x60, 0xc1, + 0x00, 0xee, 0x08, 0x0c, 0xbc, 0xb6, 0x00, 0x30, 0x08, 0x0c, 0xbc, 0xb6, + 0x08, 0x0c, 0x32, 0x50, 0x08, 0x0c, 0xd7, 0xf8, 0x00, 0xe6, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x32, 0x79, 0x01, 0x2e, 0x00, 0xee, + 0x08, 0x0c, 0xb3, 0x06, 0x00, 0x05, 0x20, 0x01, 0x00, 0x02, 0x08, 0x0c, + 0x66, 0x6a, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x02, 0x08, 0x0c, + 0x95, 0x47, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0xde, 0x00, 0xce, 0x0c, 0x80, + 0x08, 0x0c, 0x32, 0x79, 0x08, 0x04, 0xcf, 0x15, 0x00, 0xc6, 0x00, 0xd6, + 0x61, 0x04, 0x91, 0x86, 0x00, 0x16, 0x0d, 0x38, 0x60, 0x10, 0x20, 0x58, + 0xb8, 0x40, 0x90, 0x84, 0x00, 0xff, 0x90, 0x05, 0x09, 0x04, 0xcf, 0x6a, + 0x80, 0x01, 0xb8, 0x42, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x95, 0x47, + 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0xde, 0x00, 0xce, 0x08, 0x98, 0x08, 0x0c, + 0xbc, 0xb6, 0x08, 0x04, 0xcf, 0x17, 0x08, 0x0c, 0xbc, 0xf2, 0x08, 0x04, + 0xcf, 0x17, 0x00, 0xd6, 0x2c, 0x68, 0x61, 0x04, 0x08, 0x0c, 0xd7, 0x59, + 0x00, 0xde, 0x01, 0x18, 0x08, 0x0c, 0xb2, 0xd3, 0x04, 0x08, 0x60, 0x04, + 0x80, 0x07, 0x61, 0x34, 0x91, 0x8c, 0x00, 0xff, 0x91, 0x05, 0x60, 0x36, + 0x60, 0x07, 0x00, 0x85, 0x60, 0x03, 0x00, 0x0b, 0x60, 0x23, 0x00, 0x02, + 0x60, 0x3c, 0x60, 0x0a, 0x20, 0x01, 0x19, 0x87, 0x20, 0x04, 0x60, 0x1a, + 0x60, 0x2c, 0x2c, 0x08, 0x20, 0x60, 0x60, 0x24, 0xd0, 0xb4, 0x01, 0x08, + 0xc0, 0x85, 0xc0, 0xb5, 0x60, 0x26, 0x21, 0x60, 0x08, 0x0c, 0x94, 0xff, + 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x05, 0x00, 0xde, 0x00, 0xce, 0x08, 0x0c, + 0xbc, 0xb6, 0x08, 0x0c, 0x32, 0x50, 0x00, 0xe6, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0x32, 0x79, 0x60, 0x17, 0x00, 0x00, 0x60, 0x23, + 0x00, 0x07, 0x60, 0x1b, 0x03, 0x98, 0x60, 0x43, 0x00, 0x00, 0x01, 0x2e, + 0x00, 0xee, 0x00, 0x05, 0x08, 0x0c, 0xb7, 0x08, 0x19, 0x04, 0xcf, 0xc1, + 0x00, 0x05, 0x60, 0x00, 0x90, 0x8a, 0x00, 0x10, 0x1a, 0x0c, 0x0d, 0xc5, + 0x00, 0x96, 0x00, 0xd6, 0x00, 0x1b, 0x00, 0xde, 0x00, 0x9e, 0x00, 0x05, + 0xd0, 0x2c, 0xd0, 0x2c, 0xd0, 0x2c, 0xd0, 0x2c, 0xd0, 0x2c, 0xd0, 0x2c, + 0xd0, 0x2c, 0xd0, 0x2c, 0xd0, 0x2c, 0xcd, 0xd9, 0xd0, 0x2c, 0xcd, 0xe0, + 0xd0, 0x2e, 0xcd, 0xe0, 0xd0, 0x48, 0xd0, 0x2c, 0x08, 0x0c, 0x0d, 0xc5, + 0x60, 0x04, 0x90, 0x86, 0x00, 0x8b, 0x01, 0xb0, 0x60, 0x34, 0x90, 0x8c, + 0xff, 0x00, 0x81, 0x0f, 0x91, 0x86, 0x00, 0x35, 0x11, 0x30, 0x60, 0x2c, + 0x90, 0x80, 0x00, 0x09, 0x20, 0x0c, 0xc1, 0x85, 0x21, 0x02, 0x60, 0x07, + 0x00, 0x8b, 0x60, 0x03, 0x00, 0x0d, 0x08, 0x0c, 0x94, 0xff, 0x08, 0x0c, + 0x9a, 0xb1, 0x00, 0x05, 0x08, 0x0c, 0xd7, 0xd7, 0x01, 0x18, 0x08, 0x0c, + 0xd7, 0xea, 0x00, 0x10, 0x08, 0x0c, 0xd7, 0xf8, 0x08, 0x0c, 0xd2, 0xc3, + 0x08, 0x0c, 0xd0, 0xd8, 0x05, 0x70, 0x08, 0x0c, 0x32, 0x50, 0x08, 0x0c, + 0xd0, 0xd8, 0x01, 0x68, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x67, 0x01, 0x03, + 0xa8, 0x7b, 0x00, 0x06, 0xa8, 0x77, 0x00, 0x00, 0xa8, 0x80, 0xc0, 0xed, + 0xa8, 0x82, 0x08, 0x0c, 0x6e, 0x9f, 0x2c, 0x68, 0x08, 0x0c, 0xb2, 0x7d, + 0x01, 0x50, 0x68, 0x10, 0x60, 0x12, 0x08, 0x0c, 0xd5, 0x54, 0x00, 0xc6, + 0x2d, 0x60, 0x08, 0x0c, 0xb3, 0x06, 0x00, 0xce, 0x00, 0x08, 0x2d, 0x60, + 0x60, 0x17, 0x00, 0x00, 0x60, 0x23, 0x00, 0x01, 0x60, 0x07, 0x00, 0x01, + 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x95, 0x47, 0x08, 0x0c, 0x9a, 0xb1, + 0x00, 0xc8, 0x08, 0x0c, 0xd7, 0xd7, 0x01, 0x38, 0x60, 0x34, 0x90, 0x86, + 0x40, 0x00, 0x11, 0x18, 0x08, 0x0c, 0x32, 0x50, 0x08, 0xd0, 0x60, 0x34, + 0x90, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0x91, 0x86, 0x00, 0x39, 0x01, 0x18, + 0x91, 0x86, 0x00, 0x35, 0x11, 0x18, 0x08, 0x0c, 0x32, 0x50, 0x08, 0x68, + 0x08, 0x0c, 0xb3, 0x06, 0x00, 0x05, 0x60, 0x00, 0x90, 0x8a, 0x00, 0x10, + 0x1a, 0x0c, 0x0d, 0xc5, 0x00, 0x02, 0xd0, 0xb3, 0xd0, 0xb3, 0xd0, 0xb7, + 0xd0, 0xb5, 0xd0, 0xc1, 0xd0, 0xb3, 0xd0, 0xb3, 0xb3, 0x06, 0xd0, 0xb3, + 0xd0, 0xb3, 0xd0, 0xb3, 0xd0, 0xb3, 0xd0, 0xb3, 0xd0, 0xb3, 0xd0, 0xb3, + 0xd0, 0xb3, 0x08, 0x0c, 0x0d, 0xc5, 0x08, 0x0c, 0xac, 0x2b, 0x61, 0x14, + 0x00, 0x96, 0x21, 0x48, 0xa8, 0x7b, 0x00, 0x06, 0x08, 0x0c, 0x6e, 0x9f, + 0x00, 0x9e, 0x08, 0x04, 0xb2, 0xd3, 0x60, 0x1c, 0xd0, 0x84, 0x19, 0x0c, + 0x1a, 0x8e, 0x0c, 0x88, 0x92, 0x84, 0x00, 0x07, 0x11, 0x58, 0x92, 0x82, + 0x1c, 0xd0, 0x02, 0x40, 0x20, 0x01, 0x18, 0x1a, 0x20, 0x04, 0x92, 0x02, + 0x12, 0x18, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x90, 0x06, 0x0c, 0xe8, + 0x00, 0x96, 0x00, 0x28, 0x00, 0x96, 0x00, 0x06, 0x60, 0x14, 0x20, 0x48, + 0x00, 0x0e, 0x00, 0x06, 0x99, 0x84, 0xf0, 0x00, 0x90, 0x86, 0xf0, 0x00, + 0x01, 0x10, 0x08, 0x0c, 0x10, 0xb9, 0x00, 0x0e, 0x00, 0x9e, 0x00, 0x05, + 0x00, 0xe6, 0x00, 0xc6, 0x00, 0x36, 0x00, 0x06, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x61, 0x1c, 0xd0, 0x20, 0x71, 0x18, 0x00, 0x73, 0x54, + 0x70, 0x74, 0x93, 0x02, 0x16, 0x40, 0x60, 0x20, 0x92, 0x06, 0x11, 0xf8, + 0x08, 0x0c, 0xd7, 0xe3, 0x01, 0x80, 0x92, 0x86, 0x00, 0x01, 0x11, 0x68, + 0x60, 0x04, 0x90, 0x86, 0x00, 0x04, 0x11, 0x48, 0x08, 0x0c, 0x32, 0x50, + 0x08, 0x0c, 0xd7, 0xf8, 0x00, 0xc6, 0x08, 0x0c, 0xb3, 0x06, 0x00, 0xce, + 0x00, 0x60, 0x08, 0x0c, 0xd4, 0xce, 0x01, 0x48, 0x08, 0x0c, 0xd2, 0xe0, + 0x11, 0x10, 0x08, 0x0c, 0xbc, 0xb6, 0x00, 0xc6, 0x08, 0x0c, 0xb2, 0xd3, + 0x00, 0xce, 0x9c, 0xe0, 0x00, 0x18, 0x70, 0x68, 0x9c, 0x02, 0x12, 0x08, + 0x08, 0xa0, 0x01, 0x2e, 0x00, 0x0e, 0x00, 0x3e, 0x00, 0xce, 0x00, 0xee, + 0x00, 0x05, 0x00, 0xe6, 0x00, 0xc6, 0x00, 0x16, 0x91, 0x88, 0x10, 0x00, + 0x21, 0x0c, 0x81, 0xff, 0x01, 0x28, 0x20, 0x61, 0x1a, 0xb7, 0x61, 0x12, + 0x08, 0x0c, 0x32, 0x50, 0x90, 0x06, 0x00, 0x10, 0x90, 0x85, 0x00, 0x01, + 0x00, 0x1e, 0x00, 0xce, 0x00, 0xee, 0x00, 0x05, 0x00, 0xc6, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0xb2, 0x7d, 0x01, 0xb0, 0x66, 0x56, + 0x2b, 0x00, 0x60, 0x12, 0x08, 0x0c, 0x57, 0xdd, 0x01, 0x18, 0x08, 0x0c, + 0xd2, 0x07, 0x01, 0x68, 0x08, 0x0c, 0xd5, 0x54, 0x60, 0x23, 0x00, 0x03, + 0x20, 0x09, 0x00, 0x4b, 0x08, 0x0c, 0xb3, 0x52, 0x90, 0x85, 0x00, 0x01, + 0x01, 0x2e, 0x00, 0xce, 0x00, 0x05, 0x90, 0x06, 0x0c, 0xd8, 0x00, 0xc6, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0xba, 0xa0, 0x08, 0x0c, 0xb3, 0x25, + 0x05, 0x60, 0x60, 0x57, 0x00, 0x00, 0x2b, 0x00, 0x60, 0x12, 0x08, 0x0c, + 0xd5, 0x54, 0x60, 0x23, 0x00, 0x03, 0x00, 0x16, 0x08, 0x0c, 0x96, 0xa4, + 0x00, 0x76, 0x90, 0x3e, 0x08, 0x0c, 0x95, 0x77, 0x2c, 0x08, 0x08, 0x0c, + 0xe9, 0x1c, 0x00, 0x7e, 0x00, 0x1e, 0xd1, 0x84, 0x01, 0x28, 0x08, 0x0c, + 0xb2, 0xd3, 0x90, 0x85, 0x00, 0x01, 0x00, 0x70, 0x08, 0x0c, 0x57, 0xdd, + 0x01, 0x28, 0xd1, 0x8c, 0x11, 0x70, 0x08, 0x0c, 0xd2, 0x07, 0x01, 0x48, + 0x20, 0x09, 0x00, 0x4c, 0x08, 0x0c, 0xb3, 0x52, 0x90, 0x85, 0x00, 0x01, + 0x01, 0x2e, 0x00, 0xce, 0x00, 0x05, 0x90, 0x06, 0x0c, 0xd8, 0x29, 0x00, + 0x60, 0x16, 0x0c, 0x90, 0x20, 0x09, 0x00, 0x4d, 0x00, 0x10, 0x20, 0x09, + 0x00, 0x4e, 0x00, 0xf6, 0x00, 0xc6, 0x00, 0x46, 0x00, 0x16, 0x08, 0x0c, + 0xb2, 0x7d, 0x2c, 0x78, 0x05, 0xa0, 0x7e, 0x56, 0x2b, 0x00, 0x78, 0x12, + 0x78, 0x23, 0x00, 0x03, 0x00, 0x16, 0x20, 0x21, 0x00, 0x05, 0x08, 0x0c, + 0xd2, 0x19, 0x00, 0x1e, 0x91, 0x86, 0x00, 0x4d, 0x01, 0x18, 0x91, 0x86, + 0x00, 0x4e, 0x01, 0x48, 0x20, 0x01, 0x19, 0x80, 0x20, 0x0c, 0xd1, 0xfc, + 0x01, 0x68, 0x2f, 0x60, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0xd0, 0x20, 0x01, + 0x19, 0x7f, 0x20, 0x0c, 0xd1, 0xfc, 0x01, 0x20, 0x2f, 0x60, 0x08, 0x0c, + 0xb2, 0xd3, 0x00, 0x88, 0x2f, 0x60, 0x08, 0x0c, 0x57, 0xdd, 0x01, 0x38, + 0xd1, 0x8c, 0x11, 0x18, 0x04, 0xf1, 0x01, 0x48, 0x00, 0x10, 0x29, 0x00, + 0x78, 0x16, 0x00, 0x1e, 0x00, 0x16, 0x08, 0x0c, 0xb3, 0x52, 0x90, 0x85, + 0x00, 0x01, 0x00, 0x1e, 0x00, 0x4e, 0x00, 0xce, 0x00, 0xfe, 0x00, 0x05, + 0x00, 0xf6, 0x00, 0xc6, 0x00, 0x46, 0x08, 0x0c, 0xb2, 0x7d, 0x2c, 0x78, + 0x05, 0x08, 0x7e, 0x56, 0x2b, 0x00, 0x78, 0x12, 0x78, 0x23, 0x00, 0x03, + 0x00, 0x96, 0x20, 0x21, 0x00, 0x04, 0x04, 0x89, 0x00, 0x9e, 0x20, 0x01, + 0x19, 0x7e, 0x20, 0x0c, 0xd1, 0xfc, 0x01, 0x20, 0x2f, 0x60, 0x08, 0x0c, + 0xb2, 0xd3, 0x00, 0x60, 0x2f, 0x60, 0x08, 0x0c, 0x57, 0xdd, 0x01, 0x20, + 0xd1, 0x8c, 0x11, 0x60, 0x00, 0x71, 0x01, 0x30, 0x20, 0x09, 0x00, 0x52, + 0x08, 0x0c, 0xb3, 0x52, 0x90, 0x85, 0x00, 0x01, 0x00, 0x4e, 0x00, 0xce, + 0x00, 0xfe, 0x00, 0x05, 0x29, 0x00, 0x78, 0x16, 0x0c, 0x98, 0x00, 0xc6, + 0x08, 0x0c, 0x4b, 0xe4, 0x00, 0xce, 0x11, 0x20, 0x08, 0x0c, 0xb2, 0xd3, + 0x90, 0x06, 0x00, 0x05, 0xa8, 0x67, 0x00, 0x00, 0xa8, 0x6b, 0x80, 0x00, + 0x29, 0x00, 0x60, 0x16, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x00, 0x96, + 0x00, 0x76, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x68, 0x58, + 0x01, 0x58, 0x20, 0x01, 0xd2, 0x1e, 0x00, 0x06, 0x90, 0x0e, 0x24, 0x00, + 0x08, 0x0c, 0x71, 0x0b, 0x08, 0x0c, 0x6e, 0x9f, 0x00, 0x0e, 0x08, 0x07, + 0x24, 0x18, 0x08, 0x0c, 0x99, 0x3f, 0xba, 0xa0, 0x00, 0x86, 0x20, 0x41, + 0x00, 0x01, 0x20, 0x39, 0x00, 0x01, 0x26, 0x08, 0x08, 0x0c, 0x96, 0xbc, + 0x00, 0x8e, 0x08, 0x0c, 0x95, 0x77, 0x2f, 0x08, 0x26, 0x48, 0x08, 0x0c, + 0xe9, 0x1c, 0xb9, 0x3c, 0x81, 0xff, 0x09, 0x0c, 0x97, 0x8f, 0x08, 0x0c, + 0x9a, 0xb1, 0x01, 0x2e, 0x00, 0x7e, 0x00, 0x9e, 0x00, 0x05, 0x00, 0xc6, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0xb2, 0x7d, 0x01, 0x90, + 0x66, 0x0a, 0x2b, 0x08, 0x61, 0x12, 0x08, 0x0c, 0xd5, 0x54, 0x60, 0x23, + 0x00, 0x01, 0x29, 0x00, 0x60, 0x16, 0x20, 0x09, 0x00, 0x1f, 0x08, 0x0c, + 0xb3, 0x52, 0x90, 0x85, 0x00, 0x01, 0x01, 0x2e, 0x00, 0xce, 0x00, 0x05, + 0x90, 0x06, 0x0c, 0xd8, 0x00, 0xc6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x08, 0x0c, 0xb3, 0x25, 0x01, 0xb8, 0x66, 0x0a, 0x2b, 0x08, 0x61, 0x12, + 0x08, 0x0c, 0xd5, 0x54, 0x60, 0x23, 0x00, 0x08, 0x29, 0x00, 0x60, 0x16, + 0x00, 0xf6, 0x2c, 0x78, 0x08, 0x0c, 0x17, 0x68, 0x00, 0xfe, 0x20, 0x09, + 0x00, 0x21, 0x08, 0x0c, 0xb3, 0x52, 0x90, 0x85, 0x00, 0x01, 0x01, 0x2e, + 0x00, 0xce, 0x00, 0x05, 0x90, 0x06, 0x0c, 0xd8, 0x20, 0x09, 0x00, 0x3d, + 0x00, 0xc6, 0x01, 0x26, 0x00, 0x16, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, + 0xb2, 0x7d, 0x01, 0x98, 0x66, 0x0a, 0x2b, 0x08, 0x61, 0x12, 0x08, 0x0c, + 0xd5, 0x54, 0x60, 0x23, 0x00, 0x01, 0x29, 0x00, 0x60, 0x16, 0x00, 0x1e, + 0x00, 0x16, 0x08, 0x0c, 0xb3, 0x52, 0x90, 0x85, 0x00, 0x01, 0x00, 0x1e, + 0x01, 0x2e, 0x00, 0xce, 0x00, 0x05, 0x90, 0x06, 0x0c, 0xd0, 0x00, 0xc6, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0xb3, 0x25, 0x01, 0x88, + 0x2b, 0x08, 0x61, 0x12, 0x08, 0x0c, 0xd5, 0x54, 0x60, 0x23, 0x00, 0x01, + 0x29, 0x00, 0x60, 0x16, 0x20, 0x09, 0x00, 0x00, 0x08, 0x0c, 0xb3, 0x52, + 0x90, 0x85, 0x00, 0x01, 0x01, 0x2e, 0x00, 0xce, 0x00, 0x05, 0x90, 0x06, + 0x0c, 0xd8, 0x20, 0x09, 0x00, 0x44, 0x08, 0x30, 0x20, 0x09, 0x00, 0x49, + 0x08, 0x18, 0x00, 0x26, 0x00, 0xb6, 0x62, 0x10, 0x22, 0x58, 0xba, 0x3c, + 0x82, 0xff, 0x01, 0x10, 0x82, 0x11, 0xba, 0x3e, 0x00, 0xbe, 0x00, 0x2e, + 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, 0x60, 0x04, 0x90, 0x8e, 0x00, 0x02, + 0x01, 0x40, 0x90, 0x8e, 0x00, 0x03, 0x01, 0x28, 0x90, 0x8e, 0x00, 0x04, + 0x01, 0x10, 0x90, 0x85, 0x00, 0x01, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, + 0x00, 0x06, 0x00, 0x86, 0x00, 0x96, 0x60, 0x20, 0x90, 0x86, 0x00, 0x04, + 0x01, 0xa8, 0x60, 0x14, 0x90, 0x4d, 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0x80, + 0xa8, 0x64, 0x90, 0x86, 0x01, 0x39, 0x01, 0x70, 0x60, 0x20, 0x90, 0xc6, + 0x00, 0x03, 0x01, 0x40, 0x90, 0xc6, 0x00, 0x02, 0x01, 0x28, 0xa8, 0x68, + 0xd0, 0xfc, 0x01, 0x10, 0x90, 0x06, 0x00, 0x10, 0x90, 0x85, 0x00, 0x01, + 0x00, 0x9e, 0x00, 0x8e, 0x00, 0x0e, 0x00, 0x05, 0x00, 0xc6, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0xb3, 0x25, 0x01, 0x98, 0x2b, 0x08, + 0x61, 0x12, 0x08, 0x0c, 0xd5, 0x54, 0x60, 0x23, 0x00, 0x01, 0x29, 0x00, + 0x60, 0x16, 0x08, 0x0c, 0x32, 0x50, 0x20, 0x09, 0x00, 0x28, 0x08, 0x0c, + 0xb3, 0x52, 0x90, 0x85, 0x00, 0x01, 0x01, 0x2e, 0x00, 0xce, 0x00, 0x05, + 0x90, 0x06, 0x0c, 0xd8, 0x91, 0x86, 0x00, 0x15, 0x11, 0xa8, 0x20, 0x11, + 0x18, 0x24, 0x22, 0x04, 0x90, 0x86, 0x00, 0x74, 0x11, 0x78, 0x00, 0xb6, + 0x08, 0x0c, 0xbf, 0x63, 0x00, 0xbe, 0x08, 0x0c, 0xc1, 0xdf, 0x60, 0x03, + 0x00, 0x01, 0x60, 0x07, 0x00, 0x29, 0x08, 0x0c, 0x95, 0x47, 0x08, 0x0c, + 0x9a, 0xb1, 0x00, 0x78, 0x60, 0x14, 0x00, 0x96, 0x20, 0x48, 0xa8, 0x68, + 0x00, 0x9e, 0xd0, 0xfc, 0x01, 0x48, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, + 0xd7, 0x1a, 0x08, 0x0c, 0xbc, 0xb6, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x05, + 0x00, 0x96, 0x60, 0x14, 0x90, 0x4d, 0x09, 0x0c, 0x0d, 0xc5, 0xa8, 0x7b, + 0x00, 0x30, 0xa8, 0x83, 0x00, 0x00, 0xa8, 0x97, 0x40, 0x05, 0xa8, 0x9b, + 0x00, 0x04, 0xa8, 0x67, 0x01, 0x39, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x08, 0x0c, 0x6e, 0x9f, 0x01, 0x2e, 0x00, 0x9e, 0x08, 0x0c, 0xb2, 0xd3, + 0x0c, 0x30, 0x00, 0x96, 0x91, 0x86, 0x00, 0x16, 0x11, 0x28, 0x20, 0x01, + 0x00, 0x04, 0x08, 0x0c, 0x66, 0x6a, 0x00, 0xe8, 0x91, 0x86, 0x00, 0x15, + 0x15, 0x10, 0x20, 0x11, 0x18, 0x24, 0x22, 0x04, 0x90, 0x86, 0x00, 0x14, + 0x11, 0xe0, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0x08, 0x0c, 0x67, 0xbf, + 0x00, 0xbe, 0x08, 0x0c, 0xc2, 0xb5, 0x11, 0x98, 0x60, 0x10, 0x00, 0xb6, + 0x20, 0x58, 0xb8, 0x90, 0x00, 0xbe, 0x90, 0x05, 0x01, 0x60, 0x20, 0x01, + 0x00, 0x06, 0x08, 0x0c, 0x66, 0x6a, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x68, + 0xd0, 0xfc, 0x01, 0x70, 0x08, 0x0c, 0xb6, 0xdc, 0x00, 0x48, 0x60, 0x14, + 0x20, 0x48, 0xa8, 0x68, 0xd0, 0xfc, 0x05, 0x28, 0x08, 0x0c, 0xbc, 0xb6, + 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x9e, 0x00, 0x05, 0x60, 0x14, 0x63, 0x10, + 0x23, 0x58, 0x90, 0x4d, 0x09, 0x0c, 0x0d, 0xc5, 0xa8, 0x7b, 0x00, 0x00, + 0xa8, 0x83, 0x00, 0x00, 0xa8, 0x97, 0x40, 0x00, 0x90, 0x0e, 0x08, 0x0c, + 0x69, 0x44, 0x11, 0x08, 0xc1, 0x85, 0xb8, 0x00, 0xd0, 0xbc, 0x01, 0x08, + 0xc1, 0x8d, 0xa9, 0x9a, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, + 0x6e, 0x9f, 0x01, 0x2e, 0x08, 0x0c, 0xb2, 0xd3, 0x08, 0xf8, 0x60, 0x14, + 0x90, 0x4d, 0x09, 0x0c, 0x0d, 0xc5, 0xa8, 0x7b, 0x00, 0x30, 0xa8, 0x83, + 0x00, 0x00, 0xa8, 0x97, 0x40, 0x05, 0xa8, 0x9b, 0x00, 0x04, 0xa8, 0x67, + 0x01, 0x39, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x6e, 0x9f, + 0x01, 0x2e, 0x08, 0x0c, 0xb2, 0xd3, 0x08, 0x40, 0xa8, 0x78, 0x90, 0x86, + 0x00, 0x05, 0x11, 0x08, 0x00, 0x09, 0x00, 0x05, 0xa8, 0x80, 0xc0, 0xad, + 0xa8, 0x82, 0x00, 0x05, 0x60, 0x43, 0x00, 0x00, 0x60, 0x17, 0x00, 0x00, + 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x50, 0x08, 0x0c, 0x94, 0xff, + 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x05, 0x00, 0xc6, 0x60, 0x10, 0x00, 0xb6, + 0x20, 0x58, 0xb8, 0x00, 0x00, 0xbe, 0xd0, 0xbc, 0x01, 0x20, 0x60, 0x20, + 0x90, 0x84, 0x00, 0x0f, 0x00, 0x13, 0x00, 0xce, 0x00, 0x05, 0xcd, 0xd9, + 0xd4, 0x04, 0xd4, 0x04, 0xd4, 0x07, 0xec, 0x80, 0xec, 0x9b, 0xec, 0x9e, + 0xcd, 0xd9, 0xcd, 0xd9, 0xcd, 0xd9, 0xcd, 0xd9, 0xcd, 0xd9, 0xcd, 0xd9, + 0xcd, 0xd9, 0xcd, 0xd9, 0x08, 0x0c, 0x0d, 0xc5, 0xa0, 0x01, 0xa0, 0x01, + 0x00, 0x05, 0x00, 0x96, 0x60, 0x14, 0x90, 0x4d, 0x01, 0x18, 0xa8, 0x7c, + 0xd0, 0xe4, 0x11, 0x10, 0x00, 0x9e, 0x00, 0x10, 0x00, 0x9e, 0x00, 0x05, + 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x00, 0x00, 0xbe, 0xd0, 0xbc, + 0x05, 0x50, 0x20, 0x01, 0x18, 0x34, 0x20, 0x04, 0x90, 0x05, 0x15, 0x40, + 0x00, 0xf6, 0x2c, 0x78, 0x08, 0x0c, 0xb2, 0x7d, 0x05, 0x08, 0x78, 0x10, + 0x60, 0x12, 0x08, 0x0c, 0xd5, 0x54, 0x78, 0x20, 0x90, 0x86, 0x00, 0x03, + 0x01, 0x28, 0x78, 0x08, 0x60, 0x3a, 0x2f, 0x00, 0x60, 0x3e, 0x00, 0x20, + 0x78, 0x08, 0x60, 0x3e, 0x2f, 0x00, 0x60, 0x3a, 0x60, 0x2e, 0x60, 0x23, + 0x00, 0x01, 0x60, 0x07, 0x00, 0x35, 0x60, 0x03, 0x00, 0x01, 0x79, 0x54, + 0x61, 0x56, 0x08, 0x0c, 0x94, 0xff, 0x08, 0x0c, 0x9a, 0xb1, 0x2f, 0x60, + 0x00, 0xfe, 0x00, 0x05, 0x2f, 0x60, 0x00, 0xfe, 0x20, 0x01, 0x19, 0x88, + 0x20, 0x04, 0x60, 0x42, 0x00, 0x05, 0x00, 0x16, 0x00, 0x96, 0x68, 0x14, + 0x20, 0x48, 0xa8, 0x7c, 0xd0, 0xe4, 0x01, 0x80, 0xc0, 0xe4, 0xa8, 0x7e, + 0xa8, 0x77, 0x00, 0x00, 0xa8, 0x93, 0x00, 0x00, 0xa8, 0x8f, 0x00, 0x00, + 0xd0, 0xcc, 0x01, 0x30, 0xc0, 0xcc, 0xa8, 0x7e, 0xa8, 0x78, 0x20, 0x48, + 0x08, 0x0c, 0x0f, 0xc0, 0x68, 0x30, 0x60, 0x36, 0x90, 0x8e, 0x00, 0x01, + 0x01, 0x48, 0x68, 0x03, 0x00, 0x02, 0x90, 0x86, 0x00, 0x05, 0x01, 0x70, + 0x90, 0x06, 0x60, 0x2e, 0x60, 0x32, 0x00, 0xd0, 0x68, 0x1c, 0xc0, 0x85, + 0x68, 0x1e, 0x68, 0x03, 0x00, 0x04, 0x68, 0x24, 0xc0, 0xf4, 0x90, 0x85, + 0x0c, 0x00, 0x68, 0x26, 0x68, 0x14, 0x20, 0x48, 0xa8, 0xac, 0x69, 0x38, + 0x91, 0x02, 0xa8, 0xb0, 0x69, 0x3c, 0x91, 0x03, 0x1e, 0x48, 0x68, 0x3c, + 0x60, 0x2e, 0x68, 0x38, 0x90, 0x84, 0xff, 0xfc, 0x68, 0x3a, 0x60, 0x32, + 0x2d, 0x00, 0x60, 0x3a, 0x68, 0x08, 0x60, 0x3e, 0x69, 0x10, 0x61, 0x12, + 0x69, 0x54, 0x61, 0x56, 0x60, 0x23, 0x00, 0x01, 0x60, 0x07, 0x00, 0x39, + 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x94, 0xff, 0x08, 0x0c, 0x9a, 0xb1, + 0x00, 0x9e, 0x00, 0x1e, 0x00, 0x05, 0x60, 0x24, 0xd0, 0xd4, 0x05, 0x10, + 0xd0, 0xf4, 0x11, 0xf8, 0x60, 0x38, 0x94, 0x0a, 0x60, 0x3c, 0x93, 0x03, + 0x02, 0x30, 0x91, 0x05, 0x01, 0x20, 0x60, 0x24, 0xc0, 0xd4, 0xc0, 0xf5, + 0x00, 0x98, 0x64, 0x3a, 0x63, 0x3e, 0xac, 0x3e, 0xab, 0x42, 0x00, 0x46, + 0x00, 0x36, 0x24, 0x00, 0xac, 0xac, 0x94, 0x02, 0xa8, 0x36, 0x23, 0x00, + 0xab, 0xb0, 0x93, 0x03, 0xa8, 0x3a, 0x00, 0x3e, 0x00, 0x4e, 0x60, 0x24, + 0xc0, 0xd4, 0x00, 0x00, 0x60, 0x26, 0x00, 0x05, 0xd0, 0xf4, 0x11, 0x38, + 0xa8, 0x3c, 0x60, 0x3a, 0xa8, 0x40, 0x60, 0x3e, 0x60, 0x24, 0xc0, 0xf5, + 0x60, 0x26, 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, 0x60, 0x04, 0x90, 0x8e, + 0x00, 0x34, 0x01, 0xb8, 0x90, 0x8e, 0x00, 0x35, 0x01, 0xa0, 0x90, 0x8e, + 0x00, 0x36, 0x01, 0x88, 0x90, 0x8e, 0x00, 0x37, 0x01, 0x70, 0x90, 0x8e, + 0x00, 0x38, 0x01, 0x58, 0x90, 0x8e, 0x00, 0x39, 0x01, 0x40, 0x90, 0x8e, + 0x00, 0x3a, 0x01, 0x28, 0x90, 0x8e, 0x00, 0x3b, 0x01, 0x10, 0x90, 0x85, + 0x00, 0x01, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, + 0x00, 0x26, 0x00, 0x36, 0x00, 0xe6, 0x20, 0x01, 0x19, 0x82, 0x20, 0x0c, + 0x80, 0x00, 0x20, 0x14, 0x20, 0x01, 0x00, 0x32, 0x08, 0x0c, 0x93, 0x75, + 0x20, 0x01, 0x19, 0x86, 0x82, 0xff, 0x11, 0x10, 0x20, 0x11, 0x00, 0x14, + 0x22, 0x02, 0x20, 0x01, 0x19, 0x84, 0x20, 0x0c, 0x80, 0x00, 0x20, 0x14, + 0x20, 0x71, 0x19, 0x6c, 0x71, 0x1a, 0x72, 0x1e, 0x20, 0x01, 0x00, 0x64, + 0x08, 0x0c, 0x93, 0x75, 0x20, 0x01, 0x19, 0x87, 0x82, 0xff, 0x11, 0x10, + 0x20, 0x11, 0x00, 0x14, 0x22, 0x02, 0x20, 0x01, 0x19, 0x88, 0x92, 0x88, + 0x00, 0x0a, 0x21, 0x02, 0x20, 0x01, 0x1a, 0x98, 0x21, 0x02, 0x20, 0x01, + 0x00, 0x32, 0x08, 0x0c, 0x16, 0x11, 0x08, 0x0c, 0x6a, 0x84, 0x00, 0xee, + 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, + 0x00, 0x16, 0x00, 0xe6, 0x20, 0x01, 0x19, 0x86, 0x20, 0x03, 0x00, 0x28, + 0x20, 0x01, 0x19, 0x87, 0x20, 0x03, 0x00, 0x14, 0x20, 0x71, 0x19, 0x6c, + 0x70, 0x1b, 0x00, 0x00, 0x70, 0x1f, 0x07, 0xd0, 0x20, 0x01, 0x19, 0x88, + 0x20, 0x09, 0x00, 0x1e, 0x21, 0x02, 0x20, 0x01, 0x1a, 0x98, 0x21, 0x02, + 0x20, 0x01, 0x00, 0x32, 0x08, 0x0c, 0x16, 0x11, 0x00, 0xee, 0x00, 0x1e, + 0x00, 0x0e, 0x00, 0x05, 0x00, 0x96, 0x60, 0x58, 0x90, 0x4d, 0x01, 0x10, + 0x08, 0x0c, 0x10, 0x40, 0x00, 0x9e, 0x00, 0x05, 0x00, 0x05, 0x00, 0xc6, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0xb2, 0x7d, 0x01, 0x80, + 0x2b, 0x08, 0x61, 0x12, 0x0c, 0xa9, 0x60, 0x23, 0x00, 0x01, 0x29, 0x00, + 0x60, 0x16, 0x20, 0x09, 0x00, 0x33, 0x08, 0x0c, 0xb3, 0x52, 0x90, 0x85, + 0x00, 0x01, 0x01, 0x2e, 0x00, 0xce, 0x00, 0x05, 0x90, 0x06, 0x0c, 0xd8, + 0x00, 0x96, 0x00, 0xe6, 0x00, 0xf6, 0x20, 0x71, 0x18, 0x00, 0x91, 0x86, + 0x00, 0x15, 0x15, 0x20, 0x70, 0x90, 0x90, 0x86, 0x00, 0x18, 0x01, 0x20, + 0x70, 0x90, 0x90, 0x86, 0x00, 0x14, 0x11, 0xe0, 0x60, 0x14, 0x20, 0x48, + 0xaa, 0x3c, 0xd2, 0xe4, 0x11, 0x60, 0x2c, 0x78, 0x08, 0x0c, 0x9d, 0x4c, + 0x01, 0xd8, 0x70, 0x7c, 0xaa, 0x50, 0x92, 0x06, 0x11, 0x60, 0x70, 0x80, + 0xaa, 0x54, 0x92, 0x06, 0x11, 0x40, 0x62, 0x10, 0x00, 0xb6, 0x22, 0x58, + 0xba, 0xa0, 0x00, 0xbe, 0x90, 0x0e, 0x08, 0x0c, 0x32, 0x99, 0x08, 0x0c, + 0xb6, 0xdc, 0x00, 0x20, 0x08, 0x0c, 0xbc, 0xb6, 0x08, 0x0c, 0xb2, 0xd3, + 0x00, 0xfe, 0x00, 0xee, 0x00, 0x9e, 0x00, 0x05, 0x70, 0x60, 0xaa, 0x54, + 0x92, 0x06, 0x0d, 0x48, 0x0c, 0x80, 0x00, 0xc6, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0xb2, 0x7d, 0x01, 0x88, 0x2b, 0x08, 0x61, 0x12, + 0x08, 0x0c, 0xd5, 0x54, 0x60, 0x23, 0x00, 0x01, 0x29, 0x00, 0x60, 0x16, + 0x20, 0x09, 0x00, 0x4d, 0x08, 0x0c, 0xb3, 0x52, 0x90, 0x85, 0x00, 0x01, + 0x01, 0x2e, 0x00, 0xce, 0x00, 0x05, 0x90, 0x06, 0x0c, 0xd8, 0x00, 0xc6, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0x16, 0x08, 0x0c, 0xb2, 0x7d, + 0x01, 0x80, 0x2b, 0x08, 0x61, 0x12, 0x08, 0x0c, 0xd5, 0x54, 0x60, 0x23, + 0x00, 0x01, 0x29, 0x00, 0x60, 0x16, 0x00, 0x1e, 0x08, 0x0c, 0xb3, 0x52, + 0x90, 0x85, 0x00, 0x01, 0x01, 0x2e, 0x00, 0xce, 0x00, 0x05, 0x00, 0x1e, + 0x90, 0x06, 0x0c, 0xd0, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x00, 0x46, + 0x00, 0x56, 0x00, 0x66, 0x00, 0x96, 0x00, 0xe6, 0x00, 0xf6, 0x20, 0x71, + 0x18, 0x00, 0x91, 0x86, 0x00, 0x15, 0x15, 0x68, 0x71, 0x90, 0x60, 0x14, + 0x20, 0x48, 0xa8, 0x14, 0x80, 0x03, 0x91, 0x06, 0x15, 0x30, 0x20, 0xe1, + 0x00, 0x00, 0x20, 0x01, 0x19, 0xa1, 0x20, 0x03, 0x00, 0x00, 0x60, 0x14, + 0x20, 0x48, 0xa8, 0x30, 0x20, 0xa8, 0x89, 0x06, 0x80, 0x06, 0x80, 0x07, + 0x90, 0x94, 0x00, 0x3f, 0x22, 0xe8, 0x90, 0x84, 0xff, 0xc0, 0x90, 0x80, + 0x00, 0x1b, 0x20, 0xa0, 0x20, 0x01, 0x19, 0xa1, 0x00, 0x16, 0x20, 0x0c, + 0x08, 0x0c, 0xde, 0x2e, 0x00, 0x1e, 0xa8, 0x04, 0x90, 0x05, 0x01, 0x10, + 0x20, 0x48, 0x0c, 0x38, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x67, 0x01, 0x03, + 0x00, 0x10, 0x08, 0x0c, 0xbc, 0xb6, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0xfe, + 0x00, 0xee, 0x00, 0x9e, 0x00, 0x6e, 0x00, 0x5e, 0x00, 0x4e, 0x00, 0x3e, + 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0x96, 0x00, 0xe6, 0x00, 0xf6, + 0x20, 0x71, 0x18, 0x00, 0x91, 0x86, 0x00, 0x15, 0x11, 0xb8, 0x70, 0x90, + 0x90, 0x86, 0x00, 0x04, 0x11, 0x98, 0x60, 0x14, 0x20, 0x48, 0x2c, 0x78, + 0x08, 0x0c, 0x9d, 0x4c, 0x01, 0xa8, 0x70, 0x7c, 0xaa, 0x74, 0x92, 0x06, + 0x11, 0x30, 0x70, 0x80, 0xaa, 0x78, 0x92, 0x06, 0x11, 0x10, 0x08, 0x0c, + 0x32, 0x50, 0x08, 0x0c, 0xb6, 0xdc, 0x00, 0x20, 0x08, 0x0c, 0xbc, 0xb6, + 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0xfe, 0x00, 0xee, 0x00, 0x9e, 0x00, 0x05, + 0x70, 0x60, 0xaa, 0x78, 0x92, 0x06, 0x0d, 0x78, 0x0c, 0x80, 0x00, 0x96, + 0x00, 0xe6, 0x00, 0xf6, 0x20, 0x71, 0x18, 0x00, 0x91, 0x86, 0x00, 0x15, + 0x15, 0x50, 0x70, 0x90, 0x90, 0x86, 0x00, 0x04, 0x15, 0x30, 0x60, 0x14, + 0x20, 0x48, 0x2c, 0x78, 0x08, 0x0c, 0x9d, 0x4c, 0x05, 0xf0, 0x70, 0x7c, + 0xaa, 0xcc, 0x92, 0x06, 0x11, 0x80, 0x70, 0x80, 0xaa, 0xd0, 0x92, 0x06, + 0x11, 0x60, 0x08, 0x0c, 0x32, 0x50, 0x00, 0x16, 0xa9, 0x98, 0xaa, 0xb0, + 0x92, 0x84, 0x10, 0x00, 0xc0, 0xfd, 0x08, 0x0c, 0x57, 0x84, 0x00, 0x1e, + 0x00, 0x10, 0x08, 0x0c, 0x55, 0x6f, 0x08, 0x0c, 0xd0, 0xd8, 0x05, 0x08, + 0xa8, 0x7b, 0x00, 0x00, 0xa8, 0x83, 0x00, 0x00, 0xa8, 0x97, 0x40, 0x00, + 0x00, 0x80, 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0xb8, 0x60, 0x14, 0x20, 0x48, + 0x08, 0x0c, 0x55, 0x6f, 0x1d, 0x70, 0xa8, 0x7b, 0x00, 0x30, 0xa8, 0x83, + 0x00, 0x00, 0xa8, 0x97, 0x40, 0x05, 0xa8, 0x9b, 0x00, 0x04, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0xa8, 0x67, 0x01, 0x39, 0x08, 0x0c, 0x6e, 0x9f, + 0x01, 0x2e, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0xfe, 0x00, 0xee, 0x00, 0x9e, + 0x00, 0x05, 0x70, 0x60, 0xaa, 0xd0, 0x92, 0x06, 0x09, 0x30, 0x08, 0x88, + 0x00, 0x16, 0x00, 0x26, 0xa8, 0x7c, 0xd0, 0xac, 0x01, 0x78, 0xa9, 0x38, + 0xaa, 0x34, 0x21, 0x00, 0x92, 0x05, 0x01, 0x50, 0xa8, 0x90, 0x91, 0x06, + 0x11, 0x18, 0xa8, 0x8c, 0x92, 0x06, 0x01, 0x20, 0xa9, 0x92, 0xaa, 0x8e, + 0x90, 0x85, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xb6, + 0x00, 0xd6, 0x00, 0x36, 0x08, 0x0c, 0xd0, 0xd8, 0x09, 0x04, 0xd7, 0x16, + 0x00, 0x96, 0x63, 0x14, 0x23, 0x48, 0xa8, 0x7a, 0xa9, 0x82, 0x92, 0x9e, + 0x40, 0x00, 0x15, 0x80, 0x63, 0x10, 0x00, 0xc6, 0x23, 0x58, 0x20, 0x09, + 0x00, 0x00, 0xa8, 0x68, 0xd0, 0xf4, 0x11, 0x40, 0x08, 0x0c, 0x69, 0x44, + 0x11, 0x08, 0xc1, 0x85, 0xb8, 0x00, 0xd0, 0xbc, 0x01, 0x08, 0xc1, 0x8d, + 0xaa, 0x96, 0xa9, 0x9a, 0x20, 0xa9, 0x00, 0x04, 0xa8, 0x60, 0x20, 0xe8, + 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x31, 0x20, 0xa0, 0xb8, 0xc4, 0x20, 0xe0, + 0xb8, 0xc8, 0x90, 0x80, 0x00, 0x06, 0x20, 0x98, 0x08, 0x0c, 0x0f, 0x8b, + 0x20, 0xa9, 0x00, 0x04, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x35, 0x20, 0xa0, + 0xb8, 0xc8, 0x90, 0x80, 0x00, 0x0a, 0x20, 0x98, 0x08, 0x0c, 0x0f, 0x8b, + 0x00, 0xce, 0x00, 0x90, 0xaa, 0x96, 0x39, 0x18, 0x93, 0x98, 0x00, 0x07, + 0x23, 0x1c, 0x60, 0x04, 0x90, 0x86, 0x00, 0x16, 0x01, 0x10, 0xa8, 0x9b, + 0x00, 0x04, 0xab, 0xa2, 0x63, 0x10, 0x23, 0x58, 0xb8, 0x04, 0x90, 0x84, + 0x00, 0xff, 0xa8, 0x9e, 0xa8, 0x68, 0xc0, 0xf4, 0xa8, 0x6a, 0x08, 0x0c, + 0x6e, 0x92, 0x60, 0x17, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x3e, 0x00, 0xde, + 0x00, 0xbe, 0x00, 0x05, 0x00, 0x26, 0x00, 0x36, 0x00, 0x46, 0x00, 0xb6, + 0x00, 0x96, 0x00, 0xf6, 0x62, 0x14, 0x22, 0x48, 0x62, 0x10, 0x22, 0x58, + 0x20, 0x79, 0x02, 0x60, 0x90, 0x96, 0x00, 0x00, 0x11, 0xa0, 0xb8, 0x14, + 0x90, 0x84, 0x00, 0xff, 0x90, 0x0e, 0x08, 0x0c, 0x28, 0x73, 0x21, 0x18, + 0x83, 0x1f, 0x93, 0x9c, 0xff, 0x00, 0x78, 0x38, 0x90, 0x84, 0x00, 0xff, + 0x93, 0x1d, 0x7c, 0x3c, 0x20, 0x11, 0x80, 0x18, 0x08, 0x0c, 0x4c, 0x44, + 0x00, 0xa8, 0x90, 0x96, 0x00, 0x01, 0x11, 0x48, 0x89, 0xff, 0x01, 0x80, + 0xa8, 0x9b, 0x00, 0x0d, 0x78, 0x38, 0xa8, 0xa6, 0x78, 0x3c, 0xa8, 0xaa, + 0x00, 0x48, 0x90, 0x96, 0x00, 0x02, 0x11, 0x30, 0xa8, 0x9b, 0x00, 0x0d, + 0x78, 0x38, 0xa8, 0xa6, 0x78, 0x3c, 0xa8, 0xaa, 0x00, 0xfe, 0x00, 0x9e, + 0x00, 0xbe, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x05, 0x00, 0xc6, + 0x00, 0x26, 0x00, 0x16, 0x91, 0x86, 0x00, 0x35, 0x01, 0x10, 0x6a, 0x38, + 0x00, 0x08, 0x6a, 0x2c, 0x08, 0x0c, 0xd0, 0xc6, 0x01, 0xf0, 0x22, 0x60, + 0x61, 0x20, 0x91, 0x86, 0x00, 0x03, 0x01, 0x18, 0x91, 0x86, 0x00, 0x06, + 0x11, 0x90, 0x68, 0x38, 0x92, 0x06, 0x01, 0x40, 0x68, 0x3c, 0x92, 0x06, + 0x11, 0x60, 0x61, 0x08, 0x68, 0x38, 0x91, 0x06, 0x11, 0x40, 0x00, 0x20, + 0x60, 0x08, 0x69, 0x3c, 0x91, 0x06, 0x11, 0x18, 0x60, 0x10, 0x69, 0x10, + 0x91, 0x06, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0xce, 0x00, 0x05, 0x90, 0x85, + 0x00, 0x01, 0x0c, 0xc8, 0xa9, 0x74, 0xd1, 0xcc, 0x01, 0x98, 0x91, 0x8c, + 0x00, 0xff, 0x91, 0x8e, 0x00, 0x02, 0x11, 0x70, 0xa9, 0xa8, 0x91, 0x8c, + 0x00, 0x0f, 0x91, 0x8e, 0x00, 0x01, 0x11, 0x40, 0xa8, 0x7c, 0xd0, 0xac, + 0x01, 0x28, 0xa8, 0x34, 0xa9, 0x38, 0x91, 0x15, 0x19, 0x0c, 0xc7, 0x8b, + 0x00, 0x05, 0x00, 0x36, 0x20, 0x19, 0x00, 0x01, 0x00, 0x10, 0x00, 0x36, + 0x90, 0x1e, 0x04, 0x99, 0x01, 0xe0, 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0xc8, + 0x08, 0x0c, 0xd2, 0xc3, 0x60, 0x37, 0x40, 0x00, 0x60, 0x14, 0x60, 0x17, + 0x00, 0x00, 0x00, 0x96, 0x20, 0x48, 0xa8, 0x7c, 0x08, 0x0c, 0xd2, 0xe0, + 0x11, 0x18, 0x08, 0x0c, 0xbc, 0xb6, 0x00, 0x40, 0xa8, 0x67, 0x01, 0x03, + 0xa8, 0x77, 0x00, 0x00, 0x83, 0xff, 0x11, 0x29, 0x08, 0x0c, 0x6e, 0x9f, + 0x00, 0x9e, 0x00, 0x3e, 0x00, 0x05, 0xa8, 0x80, 0xd0, 0xb4, 0x01, 0x28, + 0xa8, 0x7b, 0x00, 0x06, 0xc0, 0xec, 0xa8, 0x82, 0x00, 0x48, 0xd0, 0xbc, + 0x01, 0x18, 0xa8, 0x7b, 0x00, 0x02, 0x00, 0x20, 0xa8, 0x7b, 0x00, 0x05, + 0x08, 0x0c, 0xd3, 0xd4, 0xa8, 0x77, 0x00, 0x00, 0x00, 0x05, 0x20, 0x01, + 0x18, 0x10, 0x20, 0x04, 0xd0, 0xec, 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, + 0x18, 0x10, 0x20, 0x04, 0xd0, 0xf4, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, + 0x20, 0x01, 0x18, 0x10, 0x20, 0x04, 0xd0, 0xe4, 0x00, 0x0e, 0x00, 0x05, + 0x00, 0x36, 0x00, 0x46, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xbb, 0xa0, + 0x00, 0xbe, 0x20, 0x21, 0x00, 0x07, 0x08, 0x0c, 0x4d, 0xfb, 0x00, 0x4e, + 0x00, 0x3e, 0x00, 0x05, 0x0c, 0x51, 0x1d, 0x81, 0x00, 0x05, 0x20, 0x01, + 0x19, 0x86, 0x20, 0x04, 0x60, 0x1a, 0x00, 0x05, 0x20, 0x01, 0x19, 0x88, + 0x20, 0x04, 0x60, 0x42, 0x00, 0x05, 0x08, 0x0c, 0xb2, 0xd3, 0x08, 0x04, + 0x9a, 0xb1, 0x20, 0x01, 0x01, 0x09, 0x20, 0x04, 0xd0, 0x84, 0x01, 0xe0, + 0x01, 0x26, 0x20, 0x91, 0x28, 0x00, 0x00, 0x06, 0x00, 0x16, 0x00, 0x26, + 0x00, 0x36, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xc6, 0x20, 0x79, 0x19, 0xe8, + 0x20, 0x71, 0x18, 0x00, 0x20, 0x61, 0x01, 0x00, 0x08, 0x0c, 0x93, 0xe2, + 0x00, 0xce, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, + 0x00, 0x0e, 0x01, 0x2e, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x00, 0xb6, + 0x00, 0x66, 0x60, 0x00, 0x90, 0xb2, 0x00, 0x10, 0x1a, 0x0c, 0x0d, 0xc5, + 0x00, 0x1b, 0x00, 0x6e, 0x00, 0xbe, 0x00, 0x05, 0xd8, 0x46, 0xdf, 0x8d, + 0xe1, 0x02, 0xd8, 0x46, 0xd8, 0x46, 0xd8, 0x46, 0xd8, 0x46, 0xd8, 0x46, + 0xd8, 0x7d, 0xe1, 0x86, 0xd8, 0x46, 0xd8, 0x46, 0xd8, 0x46, 0xd8, 0x46, + 0xd8, 0x46, 0xd8, 0x46, 0x08, 0x0c, 0x0d, 0xc5, 0x00, 0x66, 0x60, 0x00, + 0x90, 0xb2, 0x00, 0x10, 0x1a, 0x0c, 0x0d, 0xc5, 0x00, 0x13, 0x00, 0x6e, + 0x00, 0x05, 0xd8, 0x61, 0xe6, 0xd5, 0xd8, 0x61, 0xd8, 0x61, 0xd8, 0x61, + 0xd8, 0x61, 0xd8, 0x61, 0xd8, 0x61, 0xe6, 0x82, 0xe7, 0x29, 0xd8, 0x61, + 0xed, 0xb4, 0xed, 0xea, 0xed, 0xb4, 0xed, 0xea, 0xd8, 0x61, 0x08, 0x0c, + 0x0d, 0xc5, 0x60, 0x00, 0x90, 0x82, 0x00, 0x10, 0x1a, 0x0c, 0x0d, 0xc5, + 0x60, 0x00, 0x00, 0x0a, 0x00, 0x05, 0xd8, 0x7b, 0xe3, 0x64, 0xe4, 0x33, + 0xe4, 0x56, 0xe5, 0x16, 0xd8, 0x7b, 0xe5, 0xf5, 0xe5, 0x9e, 0xe1, 0x92, + 0xe6, 0x58, 0xe6, 0x6d, 0xd8, 0x7b, 0xd8, 0x7b, 0xd8, 0x7b, 0xd8, 0x7b, + 0xd8, 0x7b, 0x08, 0x0c, 0x0d, 0xc5, 0x91, 0xb2, 0x00, 0x53, 0x1a, 0x0c, + 0x0d, 0xc5, 0x21, 0x00, 0x91, 0xb2, 0x00, 0x40, 0x1a, 0x04, 0xdc, 0xfd, + 0x00, 0x02, 0xd8, 0xc7, 0xda, 0xcb, 0xd8, 0xc7, 0xd8, 0xc7, 0xd8, 0xc7, + 0xda, 0xd4, 0xd8, 0xc7, 0xd8, 0xc7, 0xd8, 0xc7, 0xd8, 0xc7, 0xd8, 0xc7, + 0xd8, 0xc7, 0xd8, 0xc7, 0xd8, 0xc7, 0xd8, 0xc7, 0xd8, 0xc7, 0xd8, 0xc7, + 0xd8, 0xc7, 0xd8, 0xc7, 0xd8, 0xc7, 0xd8, 0xc7, 0xd8, 0xc7, 0xd8, 0xc7, + 0xd8, 0xc9, 0xd9, 0x2c, 0xd9, 0x3b, 0xd9, 0x9f, 0xd9, 0xca, 0xda, 0x43, + 0xda, 0xb6, 0xd8, 0xc7, 0xd8, 0xc7, 0xda, 0xd7, 0xd8, 0xc7, 0xd8, 0xc7, + 0xda, 0xec, 0xda, 0xf9, 0xd8, 0xc7, 0xd8, 0xc7, 0xd8, 0xc7, 0xd8, 0xc7, + 0xd8, 0xc7, 0xdb, 0x9f, 0xd8, 0xc7, 0xd8, 0xc7, 0xdb, 0xb3, 0xd8, 0xc7, + 0xd8, 0xc7, 0xdb, 0x6e, 0xd8, 0xc7, 0xd8, 0xc7, 0xd8, 0xc7, 0xdb, 0xcb, + 0xd8, 0xc7, 0xd8, 0xc7, 0xd8, 0xc7, 0xdc, 0x48, 0xd8, 0xc7, 0xd8, 0xc7, + 0xd8, 0xc7, 0xd8, 0xc7, 0xd8, 0xc7, 0xd8, 0xc7, 0xdc, 0xc5, 0x08, 0x0c, + 0x0d, 0xc5, 0x08, 0x0c, 0x6a, 0x61, 0x11, 0x50, 0x20, 0x01, 0x18, 0x37, + 0x20, 0x04, 0xd0, 0xcc, 0x11, 0x28, 0x90, 0x84, 0x00, 0x09, 0x90, 0x86, + 0x00, 0x08, 0x11, 0x40, 0x60, 0x07, 0x00, 0x09, 0x60, 0x2f, 0x00, 0x09, + 0x60, 0x17, 0x00, 0x00, 0x08, 0x04, 0xda, 0xc4, 0x08, 0x0c, 0x69, 0xfd, + 0x00, 0xe6, 0x00, 0xc6, 0x00, 0x36, 0x00, 0x26, 0x00, 0x16, 0x62, 0x10, + 0x22, 0x58, 0xba, 0xa0, 0x00, 0x26, 0x20, 0x19, 0x00, 0x29, 0x08, 0x0c, + 0x96, 0xa4, 0x00, 0x76, 0x90, 0x3e, 0x08, 0x0c, 0x95, 0x77, 0x2c, 0x08, + 0x08, 0x0c, 0xe9, 0x1c, 0x00, 0x7e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x2e, + 0x00, 0x3e, 0x00, 0xce, 0x00, 0xee, 0x66, 0x10, 0x26, 0x58, 0x08, 0x0c, + 0x67, 0x33, 0xbe, 0x04, 0x96, 0x84, 0x00, 0xff, 0x90, 0x82, 0x00, 0x06, + 0x12, 0x68, 0x00, 0x16, 0x00, 0x26, 0x62, 0x10, 0x00, 0xb6, 0x22, 0x58, + 0xba, 0xa0, 0x00, 0xbe, 0x2c, 0x08, 0x08, 0x0c, 0xf0, 0x15, 0x00, 0x2e, + 0x00, 0x1e, 0x11, 0x78, 0x08, 0x0c, 0xe8, 0x4e, 0x19, 0x04, 0xd9, 0x97, + 0x08, 0x0c, 0xe7, 0xea, 0x11, 0x20, 0x60, 0x07, 0x00, 0x08, 0x08, 0x04, + 0xda, 0xc4, 0x60, 0x07, 0x00, 0x09, 0x08, 0x04, 0xda, 0xc4, 0x08, 0x0c, + 0xea, 0xb9, 0x01, 0x28, 0x08, 0x0c, 0xe8, 0x4e, 0x0d, 0x78, 0x08, 0x04, + 0xd9, 0x97, 0x60, 0x17, 0x19, 0x00, 0x0c, 0x88, 0x08, 0x0c, 0x33, 0x74, + 0x19, 0x04, 0xdc, 0xfa, 0x61, 0x06, 0x08, 0x0c, 0xe7, 0x8e, 0x60, 0x07, + 0x00, 0x06, 0x08, 0x04, 0xda, 0xc4, 0x60, 0x07, 0x00, 0x07, 0x08, 0x04, + 0xda, 0xc4, 0x08, 0x0c, 0xee, 0x26, 0x19, 0x04, 0xdc, 0xfa, 0x08, 0x0c, + 0x33, 0x74, 0x19, 0x04, 0xdc, 0xfa, 0x00, 0xd6, 0x66, 0x10, 0x26, 0x58, + 0xbe, 0x04, 0x96, 0x84, 0x00, 0xff, 0x90, 0x82, 0x00, 0x06, 0x12, 0x20, + 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x66, 0x56, 0x96, 0xb4, 0xff, 0x00, + 0x86, 0x37, 0x96, 0x86, 0x00, 0x06, 0x01, 0x88, 0x96, 0x86, 0x00, 0x04, + 0x01, 0x70, 0xbe, 0x04, 0x96, 0xb4, 0x00, 0xff, 0x96, 0x86, 0x00, 0x06, + 0x01, 0x40, 0x96, 0x86, 0x00, 0x04, 0x01, 0x28, 0x96, 0x86, 0x00, 0x05, + 0x01, 0x10, 0x00, 0xde, 0x04, 0x80, 0x00, 0xe6, 0x20, 0x71, 0x02, 0x60, + 0x70, 0x34, 0x90, 0x84, 0x00, 0x03, 0x11, 0x40, 0x70, 0x34, 0x90, 0x82, + 0x00, 0x14, 0x02, 0x20, 0x70, 0x30, 0x90, 0x84, 0x00, 0x03, 0x01, 0x30, + 0x00, 0xee, 0x60, 0x17, 0x00, 0x00, 0x60, 0x2f, 0x00, 0x07, 0x00, 0xb0, + 0x00, 0xee, 0x08, 0x0c, 0xe8, 0xb2, 0x11, 0x90, 0x96, 0x86, 0x00, 0x06, + 0x11, 0x40, 0x00, 0x26, 0x62, 0x10, 0x22, 0x58, 0xba, 0xa0, 0x90, 0x0e, + 0x08, 0x0c, 0x32, 0x99, 0x00, 0x2e, 0x08, 0x0c, 0x67, 0xbf, 0x60, 0x07, + 0x00, 0x0a, 0x00, 0xde, 0x08, 0x04, 0xda, 0xc4, 0x60, 0x07, 0x00, 0x0b, + 0x00, 0xde, 0x08, 0x04, 0xda, 0xc4, 0x08, 0x0c, 0x32, 0x50, 0x08, 0x0c, + 0xd7, 0xf8, 0x60, 0x07, 0x00, 0x01, 0x08, 0x04, 0xda, 0xc4, 0x08, 0x0c, + 0xee, 0x26, 0x19, 0x04, 0xdc, 0xfa, 0x08, 0x0c, 0x33, 0x74, 0x19, 0x04, + 0xdc, 0xfa, 0x20, 0x71, 0x02, 0x60, 0x70, 0x34, 0x90, 0xb4, 0x00, 0x03, + 0x19, 0x48, 0x90, 0xb2, 0x00, 0x14, 0x0a, 0x30, 0x70, 0x30, 0x90, 0x84, + 0x00, 0x03, 0x19, 0x10, 0x66, 0x10, 0x26, 0x58, 0xbe, 0x04, 0x96, 0x86, + 0x07, 0x07, 0x09, 0xe8, 0x00, 0x26, 0x62, 0x10, 0x22, 0x58, 0xba, 0xa0, + 0x90, 0x0e, 0x08, 0x0c, 0x32, 0x99, 0x00, 0x2e, 0x60, 0x07, 0x00, 0x0c, + 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0xef, 0xf4, 0x08, 0x04, 0xda, 0xc4, + 0x08, 0x0c, 0x6a, 0x61, 0x11, 0x40, 0x20, 0x01, 0x18, 0x37, 0x20, 0x04, + 0x90, 0x84, 0x00, 0x09, 0x90, 0x86, 0x00, 0x08, 0x11, 0x10, 0x08, 0x04, + 0xd8, 0xd6, 0x08, 0x0c, 0x69, 0xfd, 0x66, 0x10, 0x26, 0x58, 0xbe, 0x04, + 0x96, 0x84, 0x00, 0xff, 0x90, 0x82, 0x00, 0x06, 0x06, 0xc8, 0x11, 0x38, + 0x00, 0x26, 0x20, 0x01, 0x00, 0x06, 0x08, 0x0c, 0x66, 0x96, 0x00, 0x2e, + 0x00, 0x50, 0x96, 0xb4, 0xff, 0x00, 0x86, 0x37, 0x96, 0x86, 0x00, 0x04, + 0x01, 0x20, 0x96, 0x86, 0x00, 0x06, 0x19, 0x04, 0xd9, 0x97, 0x08, 0x0c, + 0xe8, 0xbf, 0x11, 0x20, 0x60, 0x07, 0x00, 0x0e, 0x08, 0x04, 0xda, 0xc4, + 0x00, 0x46, 0x64, 0x10, 0x24, 0x58, 0xbc, 0xa0, 0x00, 0x46, 0x08, 0x0c, + 0x32, 0x50, 0x08, 0x0c, 0xd7, 0xf8, 0x00, 0x4e, 0x00, 0x16, 0x90, 0x06, + 0x20, 0x09, 0x18, 0x48, 0x21, 0x0c, 0xd1, 0xa4, 0x01, 0x48, 0x20, 0x09, + 0x00, 0x29, 0x08, 0x0c, 0xec, 0x31, 0x60, 0x10, 0x20, 0x58, 0xb8, 0x00, + 0xc0, 0xe5, 0xb8, 0x02, 0x00, 0x1e, 0x00, 0x4e, 0x60, 0x07, 0x00, 0x01, + 0x08, 0x04, 0xda, 0xc4, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x66, 0x56, + 0x01, 0x56, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x20, 0xa9, 0x00, 0x04, + 0x20, 0x19, 0x18, 0x05, 0x20, 0x11, 0x02, 0x70, 0x08, 0x0c, 0xc3, 0x65, + 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, 0x01, 0x5e, 0x90, 0x05, 0x01, 0x68, + 0x96, 0xb4, 0xff, 0x00, 0x86, 0x37, 0x96, 0x82, 0x00, 0x04, 0x0a, 0x04, + 0xd9, 0x97, 0x96, 0x82, 0x00, 0x07, 0x0a, 0x04, 0xd9, 0xf3, 0x08, 0x04, + 0xd9, 0x97, 0x60, 0x17, 0x19, 0x00, 0x60, 0x07, 0x00, 0x09, 0x08, 0x04, + 0xda, 0xc4, 0x08, 0x0c, 0x6a, 0x61, 0x11, 0x40, 0x20, 0x01, 0x18, 0x37, + 0x20, 0x04, 0x90, 0x84, 0x00, 0x09, 0x90, 0x86, 0x00, 0x08, 0x11, 0x10, + 0x08, 0x04, 0xd8, 0xd6, 0x08, 0x0c, 0x69, 0xfd, 0x66, 0x10, 0x26, 0x58, + 0xbe, 0x04, 0x96, 0x84, 0x00, 0xff, 0x00, 0x06, 0x00, 0x16, 0x90, 0x8e, + 0x00, 0x01, 0x01, 0x18, 0x90, 0x8e, 0x00, 0x00, 0x11, 0x18, 0x00, 0x1e, + 0x00, 0x0e, 0x00, 0x80, 0x00, 0x1e, 0x00, 0x0e, 0x90, 0x82, 0x00, 0x06, + 0x06, 0xa0, 0x01, 0x50, 0x96, 0xb4, 0xff, 0x00, 0x86, 0x37, 0x96, 0x86, + 0x00, 0x04, 0x01, 0x20, 0x96, 0x86, 0x00, 0x06, 0x19, 0x04, 0xd9, 0x97, + 0x08, 0x0c, 0xe8, 0xed, 0x11, 0x38, 0x08, 0x0c, 0xe7, 0xea, 0x11, 0x20, + 0x60, 0x07, 0x00, 0x10, 0x08, 0x04, 0xda, 0xc4, 0x00, 0x46, 0x64, 0x10, + 0x24, 0x58, 0xbc, 0xa0, 0x00, 0x46, 0x08, 0x0c, 0x32, 0x50, 0x08, 0x0c, + 0xd7, 0xf8, 0x00, 0x4e, 0x00, 0x16, 0x90, 0x06, 0x20, 0x09, 0x18, 0x48, + 0x21, 0x0c, 0xd1, 0xa4, 0x01, 0x48, 0x20, 0x09, 0x00, 0x29, 0x08, 0x0c, + 0xec, 0x31, 0x60, 0x10, 0x20, 0x58, 0xb8, 0x00, 0xc0, 0xe5, 0xb8, 0x02, + 0x00, 0x1e, 0x00, 0x4e, 0x60, 0x07, 0x00, 0x01, 0x04, 0x48, 0x08, 0x0c, + 0xea, 0xb9, 0x01, 0x98, 0x00, 0x16, 0x96, 0x8c, 0x00, 0xff, 0x91, 0x86, + 0x00, 0x02, 0x01, 0x60, 0x91, 0x86, 0x00, 0x03, 0x01, 0x48, 0x00, 0x1e, + 0x96, 0xb4, 0xff, 0x00, 0x86, 0x37, 0x96, 0x86, 0x00, 0x06, 0x09, 0x20, + 0x08, 0x04, 0xd9, 0x97, 0x00, 0x1e, 0x60, 0x17, 0x19, 0x00, 0x60, 0x07, + 0x00, 0x09, 0x00, 0x70, 0x08, 0x0c, 0x33, 0x74, 0x19, 0x04, 0xdc, 0xfa, + 0x08, 0x0c, 0xee, 0x26, 0x19, 0x04, 0xdc, 0xfa, 0x08, 0x0c, 0xde, 0xcb, + 0x19, 0x04, 0xd9, 0x97, 0x60, 0x07, 0x00, 0x12, 0x60, 0x03, 0x00, 0x01, + 0x08, 0x0c, 0x95, 0x47, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x05, 0x60, 0x07, + 0x00, 0x01, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x95, 0x47, 0x08, 0x0c, + 0x9a, 0xb1, 0x0c, 0xb0, 0x60, 0x07, 0x00, 0x05, 0x0c, 0x68, 0x08, 0x0c, + 0xee, 0x26, 0x19, 0x04, 0xdc, 0xfa, 0x08, 0x0c, 0x33, 0x74, 0x19, 0x04, + 0xdc, 0xfa, 0x08, 0x0c, 0xde, 0xcb, 0x19, 0x04, 0xd9, 0x97, 0x60, 0x07, + 0x00, 0x20, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x95, 0x47, 0x08, 0x0c, + 0x9a, 0xb1, 0x00, 0x05, 0x08, 0x0c, 0x33, 0x74, 0x19, 0x04, 0xdc, 0xfa, + 0x60, 0x07, 0x00, 0x23, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x95, 0x47, + 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x05, 0x08, 0x0c, 0xee, 0x26, 0x19, 0x04, + 0xdc, 0xfa, 0x08, 0x0c, 0x33, 0x74, 0x19, 0x04, 0xdc, 0xfa, 0x08, 0x0c, + 0xde, 0xcb, 0x19, 0x04, 0xd9, 0x97, 0x00, 0x16, 0x00, 0x26, 0x00, 0xe6, + 0x20, 0x71, 0x02, 0x60, 0x2c, 0x08, 0x20, 0x11, 0x18, 0x20, 0x22, 0x14, + 0x70, 0x3c, 0x92, 0x06, 0x11, 0xe0, 0x20, 0x11, 0x18, 0x1f, 0x22, 0x14, + 0x70, 0x38, 0x90, 0x84, 0x00, 0xff, 0x92, 0x06, 0x11, 0xa0, 0x72, 0x40, + 0x08, 0x0c, 0xd0, 0xc6, 0x05, 0x70, 0x22, 0x60, 0x60, 0x08, 0x90, 0x86, + 0xff, 0xff, 0x01, 0x20, 0x72, 0x44, 0x60, 0x08, 0x92, 0x06, 0x15, 0x28, + 0x60, 0x20, 0x90, 0x86, 0x00, 0x07, 0x15, 0x08, 0x08, 0x0c, 0xb2, 0xd3, + 0x04, 0xa0, 0x72, 0x44, 0x92, 0x86, 0xff, 0xff, 0x01, 0x80, 0x2c, 0x08, + 0x08, 0x0c, 0xd0, 0xc6, 0x01, 0xb0, 0x22, 0x60, 0x72, 0x40, 0x60, 0x08, + 0x92, 0x06, 0x11, 0x88, 0x60, 0x10, 0x91, 0x90, 0x00, 0x04, 0x22, 0x14, + 0x92, 0x06, 0x01, 0xb8, 0x00, 0x50, 0x72, 0x40, 0x2c, 0x08, 0x90, 0x06, + 0x08, 0x0c, 0xeb, 0xfb, 0x11, 0x80, 0x72, 0x44, 0x92, 0x86, 0xff, 0xff, + 0x01, 0xb0, 0x21, 0x60, 0x60, 0x07, 0x00, 0x26, 0x60, 0x17, 0x17, 0x00, + 0x72, 0x14, 0x92, 0x96, 0xff, 0xff, 0x11, 0x80, 0x60, 0x07, 0x00, 0x25, + 0x00, 0x68, 0x60, 0x20, 0x90, 0x86, 0x00, 0x07, 0x1d, 0x80, 0x60, 0x04, + 0x90, 0x86, 0x00, 0x24, 0x11, 0x10, 0x08, 0x0c, 0xb2, 0xd3, 0x21, 0x60, + 0x60, 0x07, 0x00, 0x25, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x95, 0x47, + 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0xee, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, + 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x66, 0x56, 0x01, 0x56, 0x00, 0x16, + 0x00, 0x26, 0x00, 0x36, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x19, 0x18, 0x05, + 0x20, 0x11, 0x02, 0x76, 0x08, 0x0c, 0xc3, 0x65, 0x00, 0x3e, 0x00, 0x2e, + 0x00, 0x1e, 0x01, 0x5e, 0x01, 0x20, 0x60, 0x07, 0x00, 0x31, 0x08, 0x04, + 0xda, 0xc4, 0x08, 0x0c, 0xbf, 0x7b, 0x08, 0x0c, 0x76, 0x37, 0x11, 0x90, + 0x00, 0x06, 0x00, 0x26, 0x00, 0x36, 0x08, 0x0c, 0x76, 0x51, 0x11, 0x38, + 0x08, 0x0c, 0x79, 0x32, 0x08, 0x0c, 0x61, 0x2e, 0x08, 0x0c, 0x75, 0x63, + 0x00, 0x10, 0x08, 0x0c, 0x76, 0x0f, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x0e, + 0x00, 0x05, 0x08, 0x0c, 0x33, 0x74, 0x19, 0x04, 0xdc, 0xfa, 0x08, 0x0c, + 0xde, 0xcb, 0x19, 0x04, 0xd9, 0x97, 0x61, 0x06, 0x08, 0x0c, 0xde, 0xe7, + 0x11, 0x20, 0x60, 0x07, 0x00, 0x2b, 0x08, 0x04, 0xda, 0xc4, 0x60, 0x07, + 0x00, 0x2c, 0x08, 0x04, 0xda, 0xc4, 0x08, 0x0c, 0xee, 0x26, 0x19, 0x04, + 0xdc, 0xfa, 0x08, 0x0c, 0x33, 0x74, 0x19, 0x04, 0xdc, 0xfa, 0x08, 0x0c, + 0xde, 0xcb, 0x19, 0x04, 0xd9, 0x97, 0x61, 0x06, 0x08, 0x0c, 0xde, 0xec, + 0x11, 0x20, 0x60, 0x07, 0x00, 0x2e, 0x08, 0x04, 0xda, 0xc4, 0x60, 0x07, + 0x00, 0x2f, 0x08, 0x04, 0xda, 0xc4, 0x08, 0x0c, 0x33, 0x74, 0x19, 0x04, + 0xdc, 0xfa, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, 0x60, 0x10, 0x20, 0x58, + 0xb9, 0x04, 0x91, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x06, 0x01, 0x58, + 0x91, 0x84, 0xff, 0x00, 0x80, 0x07, 0x90, 0x86, 0x00, 0x06, 0x01, 0x28, + 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, 0x08, 0x04, 0xda, 0xcb, 0x08, 0x0c, + 0x57, 0xd9, 0xd0, 0xe4, 0x09, 0x04, 0xdc, 0x45, 0x20, 0x71, 0x02, 0x6c, + 0x70, 0x10, 0x60, 0x3a, 0x70, 0x14, 0x60, 0x3e, 0x71, 0x08, 0x72, 0x0c, + 0x08, 0x0c, 0x6a, 0x9f, 0x01, 0x40, 0x60, 0x10, 0x20, 0x58, 0xb8, 0x10, + 0x91, 0x06, 0x11, 0x18, 0xb8, 0x14, 0x92, 0x06, 0x05, 0x10, 0x08, 0x0c, + 0x6a, 0x9b, 0x15, 0xb8, 0x20, 0x69, 0x18, 0x00, 0x68, 0x80, 0x92, 0x06, + 0x15, 0x90, 0x68, 0x7c, 0x91, 0x06, 0x15, 0x78, 0x72, 0x10, 0x08, 0x0c, + 0xd0, 0xc6, 0x05, 0x90, 0x08, 0x0c, 0xdd, 0xb8, 0x05, 0x78, 0x08, 0x0c, + 0xec, 0xad, 0x05, 0x60, 0x62, 0x2e, 0x60, 0x07, 0x00, 0x36, 0x60, 0x03, + 0x00, 0x01, 0x08, 0x0c, 0x94, 0xff, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0xce, + 0x00, 0xde, 0x00, 0xee, 0x00, 0x05, 0x72, 0x14, 0x92, 0x86, 0xff, 0xff, + 0x01, 0x50, 0x08, 0x0c, 0xd0, 0xc6, 0x01, 0xc0, 0x92, 0x80, 0x00, 0x02, + 0x20, 0x04, 0x71, 0x10, 0x91, 0x06, 0x11, 0x90, 0x08, 0xe0, 0x72, 0x10, + 0x2c, 0x08, 0x90, 0x85, 0x00, 0x01, 0x08, 0x0c, 0xeb, 0xfb, 0x2c, 0x10, + 0x21, 0x60, 0x01, 0x40, 0x08, 0x90, 0x60, 0x07, 0x00, 0x37, 0x60, 0x2f, + 0x00, 0x09, 0x60, 0x17, 0x15, 0x00, 0x08, 0xb8, 0x60, 0x07, 0x00, 0x37, + 0x60, 0x2f, 0x00, 0x03, 0x60, 0x17, 0x17, 0x00, 0x08, 0x80, 0x60, 0x07, + 0x00, 0x12, 0x08, 0x68, 0x08, 0x0c, 0x33, 0x74, 0x19, 0x04, 0xdc, 0xfa, + 0x60, 0x10, 0x20, 0x58, 0xb8, 0x04, 0x90, 0x84, 0xff, 0x00, 0x80, 0x07, + 0x90, 0x86, 0x00, 0x06, 0x19, 0x04, 0xda, 0xcb, 0x00, 0xe6, 0x00, 0xd6, + 0x00, 0xc6, 0x08, 0x0c, 0x57, 0xd9, 0xd0, 0xe4, 0x09, 0x04, 0xdc, 0xbd, + 0x20, 0x69, 0x18, 0x00, 0x20, 0x71, 0x02, 0x6c, 0x70, 0x08, 0x60, 0x3a, + 0x72, 0x0c, 0x62, 0x3e, 0x92, 0x86, 0xff, 0xff, 0x11, 0x50, 0x72, 0x08, + 0x00, 0xc6, 0x2c, 0x08, 0x90, 0x85, 0x00, 0x01, 0x08, 0x0c, 0xeb, 0xfb, + 0x2c, 0x10, 0x00, 0xce, 0x05, 0xe8, 0x08, 0x0c, 0xd0, 0xc6, 0x05, 0xd0, + 0x71, 0x08, 0x92, 0x80, 0x00, 0x02, 0x20, 0x04, 0x91, 0x06, 0x15, 0xa0, + 0x00, 0xc6, 0x00, 0x26, 0x22, 0x60, 0x08, 0x0c, 0xcc, 0xe6, 0x00, 0x2e, + 0x00, 0xce, 0x71, 0x18, 0x91, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0x91, 0x86, + 0x00, 0x01, 0x01, 0x78, 0x91, 0x86, 0x00, 0x05, 0x01, 0x18, 0x91, 0x86, + 0x00, 0x07, 0x11, 0x98, 0x92, 0x80, 0x00, 0x05, 0x20, 0x04, 0x90, 0x05, + 0x01, 0x70, 0x08, 0x0c, 0xdd, 0xb8, 0x09, 0x04, 0xdc, 0x3e, 0x00, 0x56, + 0x75, 0x10, 0x76, 0x14, 0x08, 0x0c, 0xec, 0xc6, 0x00, 0x5e, 0x00, 0xce, + 0x00, 0xde, 0x00, 0xee, 0x00, 0x05, 0x60, 0x07, 0x00, 0x3b, 0x60, 0x2f, + 0x00, 0x09, 0x60, 0x17, 0x2a, 0x00, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, + 0x94, 0xff, 0x08, 0x0c, 0x9a, 0xb1, 0x0c, 0x78, 0x60, 0x07, 0x00, 0x3b, + 0x60, 0x2f, 0x00, 0x03, 0x60, 0x17, 0x03, 0x00, 0x60, 0x03, 0x00, 0x01, + 0x08, 0x0c, 0x94, 0xff, 0x08, 0x0c, 0x9a, 0xb1, 0x0c, 0x10, 0x60, 0x07, + 0x00, 0x3b, 0x60, 0x2f, 0x00, 0x0b, 0x60, 0x17, 0x00, 0x00, 0x08, 0x04, + 0xdc, 0x15, 0x00, 0xe6, 0x00, 0x26, 0x08, 0x0c, 0x6a, 0x61, 0x05, 0x50, + 0x08, 0x0c, 0x69, 0xfd, 0x08, 0x0c, 0xee, 0x97, 0x15, 0x18, 0x20, 0x71, + 0x18, 0x00, 0x70, 0xdc, 0x90, 0x85, 0x00, 0x03, 0x70, 0xde, 0x00, 0xf6, + 0x20, 0x79, 0x01, 0x00, 0x72, 0xb0, 0x92, 0x84, 0x00, 0xff, 0x70, 0x7e, + 0x78, 0xe6, 0x92, 0x84, 0xff, 0x00, 0x72, 0x80, 0x92, 0x05, 0x70, 0x82, + 0x78, 0xea, 0x00, 0xfe, 0x70, 0xe7, 0x00, 0x00, 0x08, 0x0c, 0x6a, 0x9f, + 0x01, 0x20, 0x20, 0x11, 0x1a, 0x01, 0x20, 0x13, 0x07, 0xd0, 0xd0, 0xac, + 0x11, 0x28, 0x08, 0x0c, 0x30, 0x00, 0x00, 0x10, 0x08, 0x0c, 0xee, 0xcb, + 0x00, 0x2e, 0x00, 0xee, 0x08, 0x0c, 0xb2, 0xd3, 0x08, 0x04, 0xda, 0xca, + 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x05, 0x26, 0x00, 0x00, 0x02, 0xdd, 0x11, + 0xdd, 0x3f, 0xdd, 0x50, 0xdd, 0x11, 0xdd, 0x11, 0xdd, 0x13, 0xdd, 0x61, + 0xdd, 0x11, 0xdd, 0x11, 0xdd, 0x11, 0xdd, 0x2d, 0xdd, 0x11, 0xdd, 0x11, + 0xdd, 0x11, 0xdd, 0x6c, 0xdd, 0x82, 0xdd, 0xb3, 0xdd, 0x11, 0x08, 0x0c, + 0x0d, 0xc5, 0x08, 0x0c, 0xee, 0x26, 0x1d, 0x20, 0x08, 0x0c, 0x33, 0x74, + 0x1d, 0x08, 0x70, 0x38, 0x60, 0x16, 0x60, 0x07, 0x00, 0x45, 0x60, 0x03, + 0x00, 0x01, 0x08, 0x0c, 0x95, 0x47, 0x00, 0x05, 0x08, 0x0c, 0x32, 0x50, + 0x08, 0x0c, 0xd7, 0xf8, 0x60, 0x07, 0x00, 0x01, 0x60, 0x03, 0x00, 0x01, + 0x08, 0x0c, 0x95, 0x47, 0x00, 0x05, 0x08, 0x0c, 0xee, 0x26, 0x19, 0x50, + 0x08, 0x0c, 0x33, 0x74, 0x19, 0x38, 0x08, 0x0c, 0xde, 0xcb, 0x1d, 0x60, + 0x70, 0x3c, 0x60, 0x16, 0x60, 0x07, 0x00, 0x4a, 0x60, 0x03, 0x00, 0x01, + 0x08, 0x0c, 0x95, 0x47, 0x00, 0x05, 0x08, 0x0c, 0x33, 0x74, 0x19, 0x04, + 0xdc, 0xfa, 0x20, 0x09, 0x00, 0x41, 0x08, 0x0c, 0xee, 0xd4, 0x60, 0x07, + 0x00, 0x47, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x95, 0x47, 0x08, 0x0c, + 0x9a, 0xb1, 0x00, 0x05, 0x08, 0x0c, 0x33, 0x74, 0x19, 0x04, 0xdc, 0xfa, + 0x20, 0x09, 0x00, 0x42, 0x08, 0x0c, 0xee, 0xd4, 0x60, 0x07, 0x00, 0x47, + 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x95, 0x47, 0x08, 0x0c, 0x9a, 0xb1, + 0x00, 0x05, 0x08, 0x0c, 0x33, 0x74, 0x19, 0x04, 0xdc, 0xfa, 0x20, 0x09, + 0x00, 0x46, 0x08, 0x0c, 0xee, 0xd4, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x05, + 0x20, 0x01, 0x18, 0x24, 0x20, 0x04, 0x90, 0x82, 0x00, 0xe1, 0x12, 0x68, + 0x08, 0x0c, 0xdd, 0xd5, 0x09, 0x04, 0xdc, 0xfa, 0x60, 0x07, 0x00, 0x4e, + 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x95, 0x47, 0x08, 0x0c, 0x9a, 0xb1, + 0x00, 0x05, 0x60, 0x07, 0x00, 0x12, 0x0c, 0xb0, 0x60, 0x07, 0x00, 0x4f, + 0x60, 0x17, 0x00, 0x00, 0x71, 0x34, 0x91, 0x8c, 0x00, 0xff, 0x81, 0xff, + 0x05, 0x08, 0x91, 0x86, 0x00, 0x01, 0x11, 0x60, 0x71, 0x40, 0x20, 0x01, + 0x19, 0xbe, 0x20, 0x04, 0x91, 0x06, 0x11, 0xb0, 0x71, 0x44, 0x20, 0x01, + 0x19, 0xbf, 0x20, 0x04, 0x91, 0x06, 0x01, 0x90, 0x91, 0x86, 0x00, 0x02, + 0x11, 0x68, 0x20, 0x11, 0x02, 0x76, 0x20, 0xa9, 0x00, 0x04, 0x60, 0x10, + 0x00, 0x96, 0x20, 0x48, 0x20, 0x19, 0x00, 0x0a, 0x08, 0x0c, 0xc3, 0x79, + 0x00, 0x9e, 0x01, 0x10, 0x60, 0x17, 0x00, 0x01, 0x60, 0x03, 0x00, 0x01, + 0x08, 0x0c, 0x95, 0x47, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x05, 0x60, 0x07, + 0x00, 0x50, 0x70, 0x3c, 0x60, 0x16, 0x0c, 0xa0, 0x00, 0x16, 0x00, 0xe6, + 0x20, 0x71, 0x02, 0x60, 0x00, 0xb6, 0x00, 0xc6, 0x22, 0x60, 0x60, 0x10, + 0x20, 0x58, 0xb8, 0xcc, 0xd0, 0x84, 0x01, 0x50, 0x71, 0x28, 0x60, 0x44, + 0x91, 0x06, 0x11, 0x20, 0x71, 0x2c, 0x60, 0x48, 0x91, 0x06, 0x01, 0x10, + 0x90, 0x06, 0x00, 0x10, 0x90, 0x85, 0x00, 0x01, 0x00, 0xce, 0x00, 0xbe, + 0x00, 0xee, 0x00, 0x1e, 0x00, 0x05, 0x00, 0x16, 0x00, 0x96, 0x00, 0x86, + 0x00, 0xe6, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x71, 0x18, 0x00, 0x20, 0xe1, 0x00, 0x00, 0x20, 0x01, 0x19, 0xa1, + 0x20, 0x03, 0x00, 0x00, 0x08, 0x0c, 0x10, 0x27, 0x05, 0xa0, 0x29, 0x00, + 0x60, 0x16, 0x70, 0x90, 0x80, 0x04, 0xa8, 0x16, 0x90, 0x8a, 0x00, 0x1e, + 0x02, 0xd0, 0xa8, 0x33, 0x00, 0x1e, 0x20, 0xa9, 0x00, 0x1e, 0xa8, 0x60, + 0x20, 0xe8, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x1b, 0x20, 0xa0, 0x20, 0x01, + 0x19, 0xa1, 0x00, 0x16, 0x20, 0x0c, 0x04, 0x71, 0x00, 0x1e, 0x81, 0xff, + 0x01, 0xb8, 0x29, 0x40, 0x08, 0x0c, 0x10, 0x27, 0x01, 0xb0, 0x29, 0x00, + 0xa0, 0x06, 0x21, 0x00, 0x0c, 0x18, 0xa8, 0x32, 0x20, 0xa8, 0xa8, 0x60, + 0x20, 0xe8, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x1b, 0x20, 0xa0, 0x20, 0x01, + 0x19, 0xa1, 0x00, 0x16, 0x20, 0x0c, 0x00, 0xb1, 0x00, 0x1e, 0x00, 0x00, + 0x90, 0x85, 0x00, 0x01, 0x00, 0x48, 0x20, 0x71, 0x18, 0x00, 0x70, 0x93, + 0x00, 0x00, 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0x0f, 0xc0, 0x90, 0x06, + 0x01, 0x2e, 0x01, 0xde, 0x01, 0xce, 0x00, 0xee, 0x00, 0x8e, 0x00, 0x9e, + 0x00, 0x1e, 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, + 0x00, 0xc6, 0x91, 0x8c, 0xff, 0xff, 0x11, 0xb0, 0x08, 0x0c, 0x23, 0xe2, + 0x20, 0x99, 0x02, 0x6c, 0x20, 0x01, 0x00, 0x14, 0x35, 0x18, 0x93, 0x12, + 0x01, 0x08, 0x12, 0x18, 0x23, 0xa8, 0x40, 0x03, 0x04, 0x00, 0x20, 0xa8, + 0x40, 0x03, 0x22, 0xa8, 0x81, 0x08, 0x08, 0x0c, 0x23, 0xe2, 0x20, 0x99, + 0x02, 0x60, 0x0c, 0xa8, 0x08, 0x0c, 0x23, 0xe2, 0x20, 0x61, 0x19, 0xa1, + 0x60, 0x04, 0x20, 0x98, 0x60, 0x08, 0x35, 0x18, 0x93, 0x12, 0x01, 0x08, + 0x12, 0x18, 0x23, 0xa8, 0x40, 0x03, 0x00, 0x48, 0x20, 0xa8, 0x40, 0x03, + 0x22, 0xa8, 0x81, 0x08, 0x08, 0x0c, 0x23, 0xe2, 0x20, 0x99, 0x02, 0x60, + 0x0c, 0xa8, 0x20, 0x61, 0x19, 0xa1, 0x20, 0x19, 0x02, 0x80, 0x33, 0x00, + 0x93, 0x1e, 0x01, 0x10, 0x60, 0x06, 0x00, 0x20, 0x20, 0x01, 0x02, 0x60, + 0x60, 0x06, 0x81, 0x08, 0x21, 0x62, 0x92, 0x92, 0x00, 0x21, 0x92, 0x96, + 0xff, 0xff, 0x62, 0x0a, 0x00, 0xce, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, + 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, + 0x00, 0xc6, 0x81, 0xff, 0x11, 0xb8, 0x08, 0x0c, 0x23, 0xfa, 0x20, 0xa1, + 0x02, 0x4c, 0x20, 0x01, 0x00, 0x14, 0x35, 0x18, 0x93, 0x12, 0x12, 0x18, + 0x23, 0xa8, 0x40, 0x03, 0x04, 0x18, 0x20, 0xa8, 0x40, 0x03, 0x82, 0xff, + 0x01, 0xf8, 0x22, 0xa8, 0x81, 0x08, 0x08, 0x0c, 0x23, 0xfa, 0x20, 0xa1, + 0x02, 0x40, 0x0c, 0x98, 0x08, 0x0c, 0x23, 0xfa, 0x20, 0x61, 0x19, 0xa4, + 0x60, 0x04, 0x20, 0xa0, 0x60, 0x08, 0x35, 0x18, 0x93, 0x12, 0x12, 0x18, + 0x23, 0xa8, 0x40, 0x03, 0x00, 0x58, 0x20, 0xa8, 0x40, 0x03, 0x82, 0xff, + 0x01, 0x38, 0x22, 0xa8, 0x81, 0x08, 0x08, 0x0c, 0x23, 0xfa, 0x20, 0xa1, + 0x02, 0x40, 0x0c, 0x98, 0x20, 0x61, 0x19, 0xa4, 0x20, 0x19, 0x02, 0x60, + 0x34, 0x00, 0x93, 0x1e, 0x01, 0x10, 0x60, 0x06, 0x00, 0x20, 0x20, 0x01, + 0x02, 0x40, 0x60, 0x06, 0x81, 0x08, 0x21, 0x62, 0x92, 0x92, 0x00, 0x21, + 0x92, 0x96, 0xff, 0xff, 0x62, 0x0a, 0x00, 0xce, 0x00, 0x3e, 0x00, 0x2e, + 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, 0x00, 0xb6, 0x00, 0x66, 0x66, 0x10, + 0x26, 0x58, 0xbe, 0x04, 0x96, 0xb4, 0xff, 0x00, 0x86, 0x37, 0x96, 0x86, + 0x00, 0x06, 0x01, 0x70, 0x96, 0x86, 0x00, 0x04, 0x01, 0x58, 0xbe, 0x04, + 0x96, 0xb4, 0x00, 0xff, 0x96, 0x86, 0x00, 0x06, 0x01, 0x28, 0x96, 0x86, + 0x00, 0x04, 0x01, 0x10, 0x90, 0x85, 0x00, 0x01, 0x00, 0x6e, 0x00, 0xbe, + 0x00, 0x05, 0x00, 0xd6, 0x08, 0x0c, 0xdf, 0x63, 0x00, 0xde, 0x00, 0x05, + 0x00, 0xd6, 0x08, 0x0c, 0xdf, 0x70, 0x15, 0x20, 0x68, 0x0c, 0x90, 0x8c, + 0xff, 0x00, 0x68, 0x20, 0x90, 0x84, 0x00, 0xff, 0x91, 0x15, 0x62, 0x16, + 0x68, 0x24, 0x60, 0x2e, 0xd1, 0xe4, 0x01, 0x30, 0x90, 0x06, 0x08, 0x0c, + 0xef, 0xf4, 0x20, 0x09, 0x00, 0x01, 0x00, 0x78, 0xd1, 0xec, 0x01, 0x80, + 0x69, 0x20, 0x91, 0x8c, 0x00, 0xff, 0x68, 0x24, 0x08, 0x0c, 0x28, 0x73, + 0x11, 0x48, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0xef, 0xf4, 0x21, 0x10, + 0x90, 0x0e, 0x08, 0x0c, 0x32, 0x99, 0x00, 0x18, 0x90, 0x85, 0x00, 0x01, + 0x00, 0x08, 0x90, 0x06, 0x00, 0xde, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xc6, + 0x08, 0x0c, 0xb3, 0x25, 0x05, 0xa8, 0x00, 0x16, 0x00, 0x26, 0x00, 0xc6, + 0x20, 0x11, 0x02, 0x63, 0x22, 0x04, 0x82, 0x11, 0x22, 0x0c, 0x08, 0x0c, + 0x28, 0x73, 0x15, 0x78, 0x08, 0x0c, 0x66, 0xb9, 0x15, 0x60, 0xbe, 0x12, + 0xbd, 0x16, 0x00, 0xce, 0x00, 0x2e, 0x00, 0x1e, 0x2b, 0x00, 0x60, 0x12, + 0x08, 0x0c, 0xee, 0x26, 0x11, 0xd8, 0x08, 0x0c, 0x33, 0x74, 0x11, 0xc0, + 0x08, 0x0c, 0xde, 0xcb, 0x05, 0x10, 0x20, 0x01, 0x00, 0x07, 0x08, 0x0c, + 0x66, 0x6a, 0x20, 0x01, 0x00, 0x07, 0x08, 0x0c, 0x66, 0x96, 0x60, 0x17, + 0x00, 0x00, 0x60, 0x23, 0x00, 0x01, 0x60, 0x07, 0x00, 0x01, 0x60, 0x03, + 0x00, 0x01, 0x08, 0x0c, 0x95, 0x47, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x10, + 0x08, 0x0c, 0xb2, 0xd3, 0x90, 0x85, 0x00, 0x01, 0x00, 0xce, 0x00, 0xbe, + 0x00, 0x05, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0xce, 0x00, 0x2e, 0x00, 0x1e, + 0x0c, 0xa8, 0x08, 0x0c, 0xb2, 0xd3, 0x90, 0x06, 0x0c, 0x98, 0x20, 0x69, + 0x02, 0x6d, 0x68, 0x00, 0x90, 0x82, 0x00, 0x10, 0x12, 0x28, 0x60, 0x17, + 0x00, 0x00, 0x90, 0x85, 0x00, 0x01, 0x00, 0x08, 0x90, 0x06, 0x00, 0x05, + 0x60, 0x17, 0x00, 0x00, 0x20, 0x69, 0x02, 0x6c, 0x68, 0x08, 0x90, 0x84, + 0xff, 0x00, 0x90, 0x86, 0x08, 0x00, 0x11, 0x90, 0x69, 0x04, 0x91, 0x86, + 0x00, 0x18, 0x01, 0x18, 0x91, 0x86, 0x00, 0x14, 0x11, 0x58, 0x81, 0x0f, + 0x68, 0x00, 0x90, 0x84, 0x00, 0xff, 0x91, 0x0d, 0x61, 0x5a, 0x90, 0x8e, + 0x00, 0x14, 0x01, 0x10, 0x90, 0x8e, 0x00, 0x10, 0x00, 0x05, 0x60, 0x04, + 0x90, 0xb2, 0x00, 0x53, 0x1a, 0x0c, 0x0d, 0xc5, 0x91, 0xb6, 0x00, 0x13, + 0x11, 0x30, 0x20, 0x08, 0x91, 0xb2, 0x00, 0x40, 0x1a, 0x04, 0xe0, 0xd2, + 0x04, 0x0a, 0x91, 0xb6, 0x00, 0x27, 0x01, 0x98, 0x91, 0x86, 0x00, 0x15, + 0x01, 0x18, 0x91, 0x86, 0x00, 0x16, 0x11, 0x48, 0x08, 0x0c, 0xd8, 0x09, + 0x01, 0x28, 0x60, 0x00, 0x90, 0x86, 0x00, 0x02, 0x09, 0x04, 0xbc, 0xfd, + 0x00, 0x05, 0x91, 0xb6, 0x00, 0x14, 0x19, 0x0c, 0x0d, 0xc5, 0x20, 0x01, + 0x00, 0x07, 0x08, 0x0c, 0x66, 0x96, 0x08, 0x0c, 0x99, 0xa5, 0x08, 0x0c, + 0xb3, 0x06, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x05, 0xdf, 0xfc, 0xdf, 0xfe, + 0xdf, 0xfc, 0xdf, 0xfc, 0xdf, 0xfc, 0xdf, 0xfe, 0xe0, 0x0d, 0xe0, 0xcb, + 0xe0, 0x51, 0xe0, 0xcb, 0xe0, 0x79, 0xe0, 0xcb, 0xe0, 0x0d, 0xe0, 0xcb, + 0xe0, 0xc3, 0xe0, 0xcb, 0xe0, 0xc3, 0xe0, 0xcb, 0xe0, 0xcb, 0xdf, 0xfc, + 0xdf, 0xfc, 0xdf, 0xfc, 0xdf, 0xfc, 0xdf, 0xfc, 0xdf, 0xfc, 0xdf, 0xfc, + 0xdf, 0xfc, 0xdf, 0xfc, 0xdf, 0xfc, 0xdf, 0xfc, 0xdf, 0xfe, 0xdf, 0xfc, + 0xe0, 0xcb, 0xdf, 0xfc, 0xdf, 0xfc, 0xe0, 0xcb, 0xdf, 0xfc, 0xe0, 0xc8, + 0xe0, 0xcb, 0xdf, 0xfc, 0xdf, 0xfc, 0xdf, 0xfc, 0xdf, 0xfc, 0xe0, 0xcb, + 0xe0, 0xcb, 0xdf, 0xfc, 0xe0, 0xcb, 0xe0, 0xcb, 0xdf, 0xfc, 0xe0, 0x08, + 0xdf, 0xfc, 0xdf, 0xfc, 0xdf, 0xfc, 0xdf, 0xfc, 0xe0, 0xc7, 0xe0, 0xcb, + 0xdf, 0xfc, 0xdf, 0xfc, 0xe0, 0xcb, 0xe0, 0xcb, 0xdf, 0xfc, 0xdf, 0xfc, + 0xdf, 0xfc, 0xdf, 0xfc, 0x08, 0x0c, 0x0d, 0xc5, 0x08, 0x0c, 0x99, 0xa5, + 0x08, 0x0c, 0xd7, 0xfb, 0x60, 0x03, 0x00, 0x02, 0x08, 0x0c, 0x9a, 0xb1, + 0x08, 0x04, 0xe0, 0xd1, 0x90, 0x06, 0x08, 0x0c, 0x66, 0x56, 0x08, 0x04, + 0xe0, 0xcb, 0x08, 0x0c, 0x6a, 0x9b, 0x19, 0x04, 0xe0, 0xcb, 0x90, 0x06, + 0x08, 0x0c, 0x66, 0x56, 0x60, 0x10, 0x20, 0x58, 0xb8, 0x10, 0x90, 0x86, + 0x00, 0xff, 0x11, 0x40, 0x00, 0xf6, 0x20, 0x79, 0x18, 0x00, 0x78, 0xa8, + 0x80, 0x00, 0x78, 0xaa, 0x00, 0xfe, 0x00, 0xb8, 0x60, 0x10, 0x20, 0x58, + 0xb8, 0xc0, 0x90, 0x05, 0x09, 0x04, 0xe0, 0xcb, 0x08, 0x0c, 0x33, 0xa5, + 0x19, 0x04, 0xe0, 0xcb, 0x20, 0x01, 0x18, 0x00, 0x20, 0x04, 0x90, 0x86, + 0x00, 0x02, 0x11, 0x38, 0x00, 0xf6, 0x20, 0x79, 0x18, 0x00, 0x78, 0xa8, + 0x80, 0x00, 0x78, 0xaa, 0x00, 0xfe, 0x20, 0x01, 0x00, 0x02, 0x08, 0x0c, + 0x66, 0x6a, 0x08, 0x0c, 0x99, 0xa5, 0x60, 0x23, 0x00, 0x01, 0x60, 0x03, + 0x00, 0x01, 0x60, 0x07, 0x00, 0x02, 0x08, 0x0c, 0x95, 0x47, 0x08, 0x0c, + 0x9a, 0xb1, 0x61, 0x10, 0x21, 0x58, 0x20, 0x09, 0x00, 0x01, 0x08, 0x0c, + 0x88, 0x4b, 0x08, 0x04, 0xe0, 0xd1, 0x66, 0x10, 0x26, 0x58, 0xbe, 0x04, + 0x96, 0xb4, 0xff, 0x00, 0x86, 0x37, 0x96, 0x86, 0x00, 0x06, 0x01, 0x48, + 0x96, 0x86, 0x00, 0x04, 0x01, 0x30, 0x08, 0x0c, 0x90, 0x31, 0x20, 0x01, + 0x00, 0x04, 0x08, 0x0c, 0x66, 0x96, 0x08, 0x0c, 0xf0, 0x43, 0x09, 0x04, + 0xe0, 0xcb, 0x08, 0x0c, 0x99, 0xa5, 0x20, 0x01, 0x00, 0x04, 0x08, 0x0c, + 0x66, 0x6a, 0x60, 0x23, 0x00, 0x01, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, + 0x00, 0x03, 0x08, 0x0c, 0x95, 0x47, 0x08, 0x0c, 0x9a, 0xb1, 0x08, 0x04, + 0xe0, 0xd1, 0x20, 0x01, 0x18, 0x00, 0x20, 0x04, 0x90, 0x86, 0x00, 0x03, + 0x11, 0x58, 0x00, 0x36, 0x00, 0x46, 0x60, 0x10, 0x20, 0x58, 0xbb, 0xa0, + 0x20, 0x21, 0x00, 0x06, 0x08, 0x0c, 0x4d, 0xfb, 0x00, 0x4e, 0x00, 0x3e, + 0x20, 0x01, 0x00, 0x06, 0x08, 0x0c, 0xe0, 0xef, 0x66, 0x10, 0x26, 0x58, + 0xbe, 0x04, 0x00, 0x66, 0x96, 0xb4, 0xff, 0x00, 0x86, 0x37, 0x96, 0x86, + 0x00, 0x06, 0x00, 0x6e, 0x01, 0x80, 0x20, 0x01, 0x00, 0x06, 0x08, 0x0c, + 0x66, 0x96, 0x92, 0x84, 0x00, 0xff, 0x90, 0x8e, 0x00, 0x07, 0x01, 0x18, + 0x90, 0x8e, 0x00, 0x04, 0x11, 0x20, 0x20, 0x01, 0x00, 0x06, 0x08, 0x0c, + 0x66, 0x6a, 0x08, 0x0c, 0x6a, 0x9b, 0x11, 0xf8, 0x20, 0x01, 0x18, 0x37, + 0x20, 0x04, 0xd0, 0xa4, 0x01, 0xd0, 0xbe, 0x04, 0x96, 0xb4, 0x00, 0xff, + 0x96, 0x86, 0x00, 0x06, 0x01, 0xa0, 0x00, 0xf6, 0x20, 0x79, 0x18, 0x00, + 0x78, 0xa8, 0x80, 0x00, 0x78, 0xaa, 0x00, 0xfe, 0x08, 0x04, 0xe0, 0x39, + 0x20, 0x01, 0x00, 0x04, 0x00, 0x30, 0x20, 0x01, 0x00, 0x06, 0x04, 0x49, + 0x00, 0x20, 0x00, 0x18, 0x00, 0x10, 0x08, 0x0c, 0x66, 0x96, 0x08, 0x0c, + 0x99, 0xa5, 0x08, 0x0c, 0xb2, 0xd3, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x05, + 0x26, 0x00, 0x00, 0x02, 0xe0, 0xe6, 0xe0, 0xe6, 0xe0, 0xe6, 0xe0, 0xe6, + 0xe0, 0xe6, 0xe0, 0xe8, 0xe0, 0xe6, 0xe0, 0xe8, 0xe0, 0xe6, 0xe0, 0xe6, + 0xe0, 0xe8, 0xe0, 0xe6, 0xe0, 0xe6, 0xe0, 0xe6, 0xe0, 0xe8, 0xe0, 0xe8, + 0xe0, 0xe8, 0xe0, 0xe8, 0x08, 0x0c, 0x0d, 0xc5, 0x08, 0x0c, 0x99, 0xa5, + 0x08, 0x0c, 0xb2, 0xd3, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x05, 0x00, 0x16, + 0x00, 0xb6, 0x00, 0xd6, 0x61, 0x10, 0x21, 0x58, 0xb9, 0x00, 0xd1, 0x84, + 0x01, 0x38, 0x08, 0x0c, 0x66, 0x6a, 0x90, 0x06, 0x08, 0x0c, 0x66, 0x56, + 0x08, 0x0c, 0x32, 0x79, 0x00, 0xde, 0x00, 0xbe, 0x00, 0x1e, 0x00, 0x05, + 0x66, 0x10, 0x26, 0x58, 0xb8, 0x04, 0x90, 0x84, 0xff, 0x00, 0x80, 0x07, + 0x90, 0xb2, 0x00, 0x0c, 0x1a, 0x0c, 0x0d, 0xc5, 0x91, 0xb6, 0x00, 0x15, + 0x11, 0x10, 0x00, 0x3b, 0x00, 0x28, 0x91, 0xb6, 0x00, 0x16, 0x19, 0x0c, + 0x0d, 0xc5, 0x00, 0x6b, 0x00, 0x05, 0xbd, 0x9f, 0xbd, 0x9f, 0xbd, 0x9f, + 0xbd, 0x9f, 0xe1, 0x84, 0xbd, 0x9f, 0xe1, 0x6e, 0xe1, 0x2f, 0xbd, 0x9f, + 0xbd, 0x9f, 0xbd, 0x9f, 0xbd, 0x9f, 0xbd, 0x9f, 0xbd, 0x9f, 0xbd, 0x9f, + 0xbd, 0x9f, 0xe1, 0x84, 0xbd, 0x9f, 0xe1, 0x6e, 0xe1, 0x75, 0xbd, 0x9f, + 0xbd, 0x9f, 0xbd, 0x9f, 0xbd, 0x9f, 0x00, 0xf6, 0x08, 0x0c, 0x6a, 0x9b, + 0x11, 0xd8, 0x08, 0x0c, 0xd7, 0xe3, 0x11, 0xc0, 0x60, 0x10, 0x90, 0x5d, + 0x01, 0xa8, 0xb8, 0xc0, 0x90, 0x05, 0x01, 0x90, 0x90, 0x06, 0x08, 0x0c, + 0x66, 0x56, 0x20, 0x01, 0x00, 0x02, 0x08, 0x0c, 0x66, 0x6a, 0x60, 0x23, + 0x00, 0x01, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x02, 0x08, 0x0c, + 0x95, 0x47, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0xf0, 0x20, 0x11, 0x02, 0x63, + 0x22, 0x04, 0x82, 0x11, 0x22, 0x0c, 0x08, 0x0c, 0x28, 0x73, 0x11, 0xb0, + 0x08, 0x0c, 0x67, 0x24, 0x01, 0x18, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x80, + 0xb8, 0x10, 0x00, 0x06, 0xb8, 0x14, 0x00, 0x06, 0xb8, 0xc0, 0x00, 0x06, + 0x08, 0x0c, 0x61, 0x48, 0x00, 0x0e, 0xb8, 0xc2, 0x00, 0x0e, 0xb8, 0x16, + 0x00, 0x0e, 0xb8, 0x12, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0xfe, 0x00, 0x05, + 0x66, 0x04, 0x96, 0xb6, 0x00, 0x1e, 0x11, 0x10, 0x08, 0x0c, 0xb2, 0xd3, + 0x00, 0x05, 0x08, 0x0c, 0xc1, 0xdc, 0x11, 0x48, 0x60, 0x03, 0x00, 0x01, + 0x60, 0x07, 0x00, 0x01, 0x08, 0x0c, 0x95, 0x47, 0x08, 0x0c, 0x9a, 0xb1, + 0x00, 0x10, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x05, 0x08, 0x04, 0xb2, 0xd3, + 0x60, 0x04, 0x90, 0x8a, 0x00, 0x53, 0x1a, 0x0c, 0x0d, 0xc5, 0x08, 0x0c, + 0x99, 0xa5, 0x08, 0x0c, 0xb3, 0x06, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x05, + 0x91, 0x82, 0x00, 0x40, 0x00, 0x02, 0xe1, 0xa9, 0xe1, 0xa9, 0xe1, 0xa9, + 0xe1, 0xa9, 0xe1, 0xab, 0xe1, 0xa9, 0xe1, 0xa9, 0xe1, 0xa9, 0xe1, 0xa9, + 0xe1, 0xa9, 0xe1, 0xa9, 0xe1, 0xa9, 0xe1, 0xa9, 0xe1, 0xa9, 0xe1, 0xa9, + 0xe1, 0xa9, 0xe1, 0xa9, 0xe1, 0xa9, 0xe1, 0xa9, 0xe1, 0xa9, 0x08, 0x0c, + 0x0d, 0xc5, 0x00, 0x96, 0x00, 0xb6, 0x00, 0xd6, 0x00, 0xe6, 0x00, 0xf6, + 0x00, 0x46, 0x00, 0x26, 0x62, 0x10, 0x22, 0x58, 0xb8, 0xbc, 0x90, 0x05, + 0x11, 0xa8, 0x61, 0x06, 0x20, 0x71, 0x02, 0x60, 0x74, 0x44, 0x94, 0xa4, + 0xff, 0x00, 0x09, 0x04, 0xe2, 0x11, 0x08, 0x0c, 0xef, 0xe8, 0x11, 0x70, + 0x94, 0x86, 0x20, 0x00, 0x11, 0x58, 0x20, 0x09, 0x00, 0x01, 0x20, 0x11, + 0x02, 0x00, 0x08, 0x0c, 0x8a, 0x50, 0x00, 0x20, 0x90, 0x26, 0x08, 0x0c, + 0xee, 0x6b, 0x0c, 0x38, 0x08, 0x0c, 0x10, 0x0e, 0x09, 0x0c, 0x0d, 0xc5, + 0x60, 0x03, 0x00, 0x07, 0xa8, 0x67, 0x01, 0x0d, 0x90, 0x06, 0xa8, 0x02, + 0xa8, 0x6a, 0xac, 0x8a, 0x2c, 0x00, 0xa8, 0x8e, 0x60, 0x08, 0xa8, 0xe2, + 0x60, 0x10, 0x20, 0x58, 0xb8, 0xa0, 0x71, 0x30, 0xa9, 0x7a, 0x00, 0x16, + 0xa8, 0x76, 0xa8, 0x7f, 0x00, 0x00, 0xa8, 0x83, 0x00, 0x00, 0xa8, 0x87, + 0x00, 0x36, 0x08, 0x0c, 0x6e, 0x9f, 0x00, 0x1e, 0x08, 0x0c, 0xef, 0xe8, + 0x19, 0x04, 0xe2, 0x71, 0x94, 0x86, 0x20, 0x00, 0x11, 0x30, 0x20, 0x19, + 0x00, 0x17, 0x08, 0x0c, 0xeb, 0xa1, 0x08, 0x04, 0xe2, 0x71, 0x94, 0x86, + 0x02, 0x00, 0x11, 0x20, 0x08, 0x0c, 0xeb, 0x38, 0x08, 0x04, 0xe2, 0x71, + 0x94, 0x86, 0x04, 0x00, 0x01, 0x20, 0x94, 0x86, 0x10, 0x00, 0x19, 0x04, + 0xe2, 0x71, 0x20, 0x19, 0x00, 0x02, 0x08, 0x0c, 0xeb, 0x53, 0x08, 0x04, + 0xe2, 0x71, 0x20, 0x69, 0x1a, 0x74, 0x6a, 0x00, 0xd2, 0x84, 0x09, 0x04, + 0xe2, 0xdb, 0x92, 0x84, 0x03, 0x00, 0x19, 0x04, 0xe2, 0xd4, 0x68, 0x04, + 0x90, 0x05, 0x09, 0x04, 0xe2, 0xbc, 0x2d, 0x78, 0x60, 0x03, 0x00, 0x07, + 0x08, 0x0c, 0x10, 0x27, 0x09, 0x04, 0xe2, 0x7d, 0x78, 0x00, 0xd0, 0x8c, + 0x11, 0x18, 0x78, 0x04, 0x80, 0x01, 0x78, 0x06, 0x60, 0x17, 0x00, 0x00, + 0x20, 0x01, 0x18, 0x0f, 0x20, 0x04, 0xd0, 0x84, 0x19, 0x04, 0xe2, 0xdf, + 0x90, 0x06, 0xa8, 0x02, 0xa8, 0x67, 0x01, 0x16, 0xa8, 0x6a, 0x60, 0x08, + 0xa8, 0xe2, 0x2c, 0x00, 0xa8, 0x7a, 0x60, 0x10, 0x20, 0x58, 0xb8, 0xa0, + 0x71, 0x30, 0xa9, 0xb6, 0xa8, 0x76, 0xb9, 0x28, 0xa9, 0xba, 0xb9, 0x2c, + 0xa9, 0xbe, 0xb9, 0x30, 0xa9, 0xc2, 0xb9, 0x34, 0xa9, 0xc6, 0xa8, 0x83, + 0x00, 0x3d, 0x70, 0x44, 0x90, 0x84, 0x00, 0x03, 0x90, 0x80, 0xe2, 0x79, + 0x20, 0x05, 0xa8, 0x7e, 0x20, 0xa9, 0x00, 0x0a, 0x20, 0x01, 0x02, 0x70, + 0xaa, 0x5c, 0x92, 0x90, 0x00, 0x21, 0x20, 0x09, 0x02, 0x05, 0x20, 0x0b, + 0x00, 0x80, 0x20, 0xe1, 0x00, 0x00, 0xab, 0x60, 0x23, 0xe8, 0x20, 0x98, + 0x22, 0xa0, 0x40, 0x03, 0x20, 0x0b, 0x00, 0x00, 0x20, 0x01, 0x02, 0x7a, + 0x20, 0x0c, 0xa9, 0xb2, 0x80, 0x00, 0x20, 0x0c, 0xa9, 0xae, 0x08, 0x0c, + 0x6e, 0x9f, 0x00, 0x2e, 0x00, 0x4e, 0x00, 0xfe, 0x00, 0xee, 0x00, 0xde, + 0x00, 0xbe, 0x00, 0x9e, 0x00, 0x05, 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, + 0x00, 0x00, 0x20, 0x01, 0x18, 0x10, 0x20, 0x04, 0xd0, 0x84, 0x01, 0x20, + 0x08, 0x0c, 0x10, 0x0e, 0x19, 0x04, 0xe2, 0x26, 0x60, 0x17, 0xf1, 0x00, + 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x41, 0x08, 0x0c, 0x94, 0xff, + 0x08, 0x0c, 0x9a, 0xb1, 0x0c, 0x00, 0x20, 0x69, 0x02, 0x60, 0x68, 0x48, + 0x90, 0x84, 0xff, 0x00, 0x90, 0x86, 0x12, 0x00, 0x11, 0x98, 0x68, 0x6c, + 0x90, 0x84, 0x00, 0xff, 0x00, 0x16, 0x61, 0x14, 0x91, 0x8c, 0xf7, 0x00, + 0x91, 0x0d, 0x61, 0x16, 0x00, 0x1e, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, + 0x00, 0x43, 0x08, 0x0c, 0x94, 0xff, 0x08, 0x0c, 0x9a, 0xb1, 0x08, 0x28, + 0x68, 0x68, 0x60, 0x2e, 0x68, 0x6c, 0x60, 0x32, 0x60, 0x17, 0xf2, 0x00, + 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x41, 0x08, 0x0c, 0x94, 0xff, + 0x08, 0x0c, 0x9a, 0xb1, 0x08, 0x04, 0xe2, 0x71, 0x20, 0x01, 0x18, 0x0e, + 0x20, 0x04, 0xd0, 0xec, 0x01, 0x20, 0x20, 0x11, 0x80, 0x49, 0x08, 0x0c, + 0x4c, 0x44, 0x60, 0x17, 0xf3, 0x00, 0x00, 0x10, 0x60, 0x17, 0xf1, 0x00, + 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x41, 0x08, 0x0c, 0x94, 0xff, + 0x08, 0x0c, 0x9a, 0xb1, 0x08, 0x04, 0xe2, 0x71, 0x60, 0x17, 0xf5, 0x00, + 0x0c, 0x98, 0x60, 0x17, 0xf6, 0x00, 0x08, 0x04, 0xe2, 0x91, 0x60, 0x17, + 0xf2, 0x00, 0x08, 0x04, 0xe2, 0x91, 0xa8, 0x67, 0x01, 0x46, 0xa8, 0x6b, + 0x00, 0x00, 0x60, 0x08, 0xa8, 0x86, 0x2c, 0x00, 0xa8, 0x7a, 0x70, 0x44, + 0x90, 0x84, 0x00, 0x03, 0x90, 0x80, 0xe2, 0x79, 0x20, 0x05, 0xa8, 0x7e, + 0x29, 0x28, 0x60, 0x10, 0x20, 0x58, 0xb8, 0xa0, 0xa8, 0x76, 0xb8, 0x28, + 0xa8, 0x8a, 0xb8, 0x2c, 0xa8, 0x8e, 0xb8, 0x30, 0xa8, 0x92, 0xb8, 0x34, + 0xa8, 0x96, 0xa8, 0x83, 0x00, 0x3d, 0x20, 0x09, 0x02, 0x05, 0x21, 0x04, + 0x90, 0x85, 0x00, 0x80, 0x20, 0x0a, 0x20, 0xe1, 0x00, 0x00, 0x20, 0x11, + 0x02, 0x10, 0x22, 0x14, 0x92, 0x94, 0x0f, 0xff, 0xaa, 0xa2, 0x92, 0x82, + 0x01, 0x11, 0x1a, 0x0c, 0x0d, 0xc5, 0x82, 0x10, 0x82, 0x1c, 0x20, 0x01, + 0x02, 0x6c, 0x20, 0x98, 0xa8, 0x60, 0x20, 0xe8, 0xa8, 0x5c, 0x90, 0x80, + 0x00, 0x29, 0x20, 0xa0, 0x20, 0x11, 0xe3, 0x5b, 0x20, 0x41, 0x00, 0x01, + 0x22, 0x3d, 0x97, 0x84, 0x00, 0xff, 0x93, 0x22, 0x12, 0x08, 0x23, 0x00, + 0x20, 0xa8, 0x40, 0x03, 0x93, 0x1a, 0x05, 0x30, 0x82, 0x10, 0xd7, 0xfc, + 0x11, 0x30, 0x8d, 0x68, 0x2d, 0x0a, 0x20, 0x01, 0x02, 0x60, 0x20, 0x98, + 0x0c, 0x68, 0x29, 0x50, 0x08, 0x0c, 0x10, 0x27, 0x01, 0x70, 0x29, 0x00, + 0xb0, 0x02, 0xa8, 0x67, 0x01, 0x47, 0xa8, 0x6b, 0x00, 0x00, 0xa8, 0x60, + 0x20, 0xe8, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x1b, 0x20, 0xa0, 0x88, 0x40, + 0x08, 0xd8, 0x25, 0x48, 0xa8, 0x00, 0x90, 0x2d, 0x01, 0x18, 0x08, 0x0c, + 0x10, 0x40, 0x0c, 0xc8, 0x08, 0x0c, 0x10, 0x40, 0x08, 0x04, 0xe2, 0x7d, + 0x25, 0x48, 0x88, 0x47, 0x98, 0x85, 0x00, 0x46, 0xa8, 0x66, 0x20, 0x09, + 0x02, 0x05, 0x20, 0x0b, 0x00, 0x00, 0x08, 0x0c, 0xeb, 0xd4, 0x08, 0x04, + 0xe2, 0x71, 0x80, 0x10, 0x00, 0x04, 0x80, 0x1a, 0x00, 0x06, 0x80, 0x18, + 0x00, 0x08, 0x80, 0x16, 0x00, 0x0a, 0x80, 0x14, 0x91, 0x86, 0x00, 0x13, + 0x11, 0x60, 0x60, 0x04, 0x90, 0x8a, 0x00, 0x54, 0x1a, 0x0c, 0x0d, 0xc5, + 0x90, 0x82, 0x00, 0x40, 0x0a, 0x0c, 0x0d, 0xc5, 0x20, 0x08, 0x08, 0x04, + 0xe3, 0xea, 0x91, 0x86, 0x00, 0x51, 0x01, 0x08, 0x00, 0x48, 0x08, 0x0c, + 0xd8, 0x09, 0x05, 0x00, 0x60, 0x00, 0x90, 0x86, 0x00, 0x02, 0x11, 0xe0, + 0x08, 0x04, 0xe4, 0x33, 0x91, 0x86, 0x00, 0x27, 0x01, 0x90, 0x91, 0x86, + 0x00, 0x48, 0x01, 0x28, 0x91, 0x86, 0x00, 0x14, 0x01, 0x60, 0x19, 0x0c, + 0x0d, 0xc5, 0x08, 0x0c, 0xd8, 0x09, 0x01, 0x60, 0x60, 0x00, 0x90, 0x86, + 0x00, 0x04, 0x19, 0x0c, 0x0d, 0xc5, 0x08, 0x04, 0xe5, 0x16, 0x60, 0x04, + 0x90, 0x82, 0x00, 0x40, 0x20, 0x08, 0x00, 0x1a, 0x08, 0x0c, 0xb3, 0x6d, + 0x00, 0x05, 0xe3, 0xb1, 0xe3, 0xb3, 0xe3, 0xb3, 0xe3, 0xda, 0xe3, 0xb1, + 0xe3, 0xb1, 0xe3, 0xb1, 0xe3, 0xb1, 0xe3, 0xb1, 0xe3, 0xb1, 0xe3, 0xb1, + 0xe3, 0xb1, 0xe3, 0xb1, 0xe3, 0xb1, 0xe3, 0xb1, 0xe3, 0xb1, 0xe3, 0xb1, + 0xe3, 0xb1, 0xe3, 0xb1, 0xe3, 0xb1, 0x08, 0x0c, 0x0d, 0xc5, 0x08, 0x0c, + 0x99, 0xa5, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x36, 0x00, 0x96, 0x60, 0x14, + 0x90, 0x4d, 0x01, 0xd8, 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0xc0, 0x60, 0x03, + 0x00, 0x02, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x00, 0x00, 0xbe, + 0xd0, 0xbc, 0x11, 0x78, 0x20, 0x19, 0x00, 0x04, 0x08, 0x0c, 0xeb, 0xd4, + 0x60, 0x17, 0x00, 0x00, 0x60, 0x18, 0x90, 0x05, 0x11, 0x20, 0x20, 0x01, + 0x19, 0x87, 0x20, 0x04, 0x60, 0x1a, 0x60, 0x03, 0x00, 0x07, 0x00, 0x9e, + 0x00, 0x3e, 0x00, 0x05, 0x00, 0x96, 0x08, 0x0c, 0x99, 0xa5, 0x08, 0x0c, + 0x9a, 0xb1, 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0x20, 0x60, 0x14, 0x20, 0x48, + 0x08, 0x0c, 0x10, 0x40, 0x08, 0x0c, 0xb3, 0x06, 0x00, 0x9e, 0x00, 0x05, + 0x00, 0x02, 0xe3, 0xff, 0xe4, 0x16, 0xe4, 0x01, 0xe4, 0x2d, 0xe3, 0xff, + 0xe3, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xe3, 0xff, + 0xe3, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xe3, 0xff, + 0xe3, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0x08, 0x0c, 0x0d, 0xc5, 0x00, 0x96, + 0x08, 0x0c, 0x99, 0xa5, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x7c, 0xd0, 0xb4, + 0x01, 0x38, 0x60, 0x03, 0x00, 0x07, 0x20, 0x09, 0x00, 0x43, 0x08, 0x0c, + 0xb3, 0x52, 0x00, 0x10, 0x60, 0x03, 0x00, 0x04, 0x08, 0x0c, 0x9a, 0xb1, + 0x00, 0x9e, 0x00, 0x05, 0x08, 0x0c, 0x99, 0xa5, 0x08, 0x0c, 0xd0, 0xd8, + 0x01, 0x38, 0x61, 0x14, 0x00, 0x96, 0x21, 0x48, 0xa9, 0x7c, 0x00, 0x9e, + 0xd1, 0xec, 0x11, 0x38, 0x08, 0x0c, 0x8a, 0x25, 0x08, 0x0c, 0xb2, 0xd3, + 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x05, 0x08, 0x0c, 0xee, 0x2f, 0x0d, 0xb0, + 0x0c, 0xc8, 0x08, 0x0c, 0x99, 0xa5, 0x20, 0x09, 0x00, 0x41, 0x08, 0x04, + 0xe5, 0x9e, 0x91, 0x82, 0x00, 0x40, 0x00, 0x02, 0xe4, 0x4a, 0xe4, 0x4c, + 0xe4, 0x4a, 0xe4, 0x4a, 0xe4, 0x4a, 0xe4, 0x4a, 0xe4, 0x4a, 0xe4, 0x4a, + 0xe4, 0x4a, 0xe4, 0x4a, 0xe4, 0x4a, 0xe4, 0x4a, 0xe4, 0x4a, 0xe4, 0x4a, + 0xe4, 0x4a, 0xe4, 0x4a, 0xe4, 0x4a, 0xe4, 0x4d, 0xe4, 0x4a, 0xe4, 0x4a, + 0x08, 0x0c, 0x0d, 0xc5, 0x00, 0x05, 0x00, 0xd6, 0x08, 0x0c, 0x8a, 0x25, + 0x00, 0xde, 0x08, 0x0c, 0xee, 0x87, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x05, + 0x91, 0x82, 0x00, 0x40, 0x00, 0x02, 0xe4, 0x6d, 0xe4, 0x6d, 0xe4, 0x6d, + 0xe4, 0x6d, 0xe4, 0x6d, 0xe4, 0x6d, 0xe4, 0x6d, 0xe4, 0x6d, 0xe4, 0x6d, + 0xe4, 0x6f, 0xe4, 0xde, 0xe4, 0x6d, 0xe4, 0x6d, 0xe4, 0x6d, 0xe4, 0x6d, + 0xe4, 0xde, 0xe4, 0x6d, 0xe4, 0x6d, 0xe4, 0x6d, 0xe4, 0x6d, 0x08, 0x0c, + 0x0d, 0xc5, 0x20, 0x01, 0x01, 0x05, 0x20, 0x04, 0x90, 0x84, 0x18, 0x00, + 0x01, 0xc8, 0x20, 0x01, 0x01, 0x32, 0x20, 0x0c, 0x20, 0x01, 0x01, 0x31, + 0x20, 0x04, 0x91, 0x05, 0x19, 0x04, 0xe4, 0xde, 0x20, 0x09, 0x18, 0x0c, + 0x21, 0x04, 0xd0, 0xd4, 0x09, 0x04, 0xe4, 0xde, 0xc0, 0xd4, 0x20, 0x0a, + 0x20, 0x09, 0x01, 0x05, 0x21, 0x04, 0x90, 0x84, 0xe7, 0xfd, 0x90, 0x85, + 0x00, 0x10, 0x20, 0x0a, 0x20, 0x01, 0x18, 0x67, 0x20, 0x04, 0xd0, 0xe4, + 0x15, 0x28, 0x60, 0x3b, 0x00, 0x00, 0x08, 0x0c, 0x9a, 0x61, 0x60, 0x14, + 0x00, 0x96, 0x20, 0x48, 0xa8, 0x7c, 0xd0, 0xfc, 0x01, 0x88, 0x90, 0x8c, + 0x00, 0x03, 0x91, 0x8e, 0x00, 0x02, 0x05, 0x08, 0x20, 0x01, 0x18, 0x0c, + 0x20, 0x04, 0xd0, 0xd4, 0x11, 0xe0, 0x08, 0x0c, 0x9b, 0xd3, 0x20, 0x09, + 0x00, 0x41, 0x00, 0x9e, 0x08, 0x04, 0xe5, 0x9e, 0x08, 0x0c, 0x9b, 0xd3, + 0x60, 0x03, 0x00, 0x07, 0x60, 0x1b, 0x00, 0x00, 0x08, 0x0c, 0x8a, 0x25, + 0x00, 0x9e, 0x00, 0x05, 0x20, 0x01, 0x01, 0x00, 0x20, 0x04, 0x90, 0x82, + 0x00, 0x05, 0x0a, 0xa8, 0x20, 0x01, 0x01, 0x1f, 0x20, 0x04, 0x60, 0x3a, + 0x08, 0x90, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x0c, 0xc1, 0xd4, 0x21, 0x02, + 0xd1, 0xcc, 0x01, 0x10, 0x08, 0x0c, 0x2c, 0x7b, 0x08, 0x0c, 0x9b, 0xd3, + 0x60, 0x14, 0x20, 0x48, 0xa9, 0x7c, 0xd1, 0xec, 0x11, 0x30, 0x08, 0x0c, + 0x8a, 0x25, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x9e, 0x00, 0x05, 0x08, 0x0c, + 0xee, 0x2f, 0x0d, 0xb8, 0x00, 0x9e, 0x00, 0x05, 0x20, 0x01, 0x18, 0x0c, + 0x20, 0x0c, 0xc1, 0xd4, 0x21, 0x02, 0x00, 0x36, 0x08, 0x0c, 0x9a, 0x61, + 0x08, 0x0c, 0x9b, 0xd3, 0x60, 0x14, 0x00, 0x96, 0x20, 0x48, 0x60, 0x10, + 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x00, 0x00, 0xbe, 0xd0, 0xbc, 0x01, 0x88, + 0xa8, 0x7c, 0x90, 0x84, 0x00, 0x03, 0x90, 0x86, 0x00, 0x02, 0x01, 0x40, + 0xa8, 0xac, 0x63, 0x30, 0x93, 0x1a, 0x63, 0x32, 0xa8, 0xb0, 0x63, 0x2c, + 0x93, 0x1b, 0x63, 0x2e, 0x60, 0x03, 0x00, 0x02, 0x00, 0x80, 0x20, 0x19, + 0x00, 0x04, 0x08, 0x0c, 0xeb, 0xd4, 0x60, 0x18, 0x90, 0x05, 0x11, 0x28, + 0x20, 0x01, 0x19, 0x87, 0x20, 0x04, 0x80, 0x03, 0x60, 0x1a, 0x60, 0x17, + 0x00, 0x00, 0x60, 0x03, 0x00, 0x07, 0x00, 0x9e, 0x00, 0x3e, 0x00, 0x05, + 0x91, 0x82, 0x00, 0x40, 0x00, 0x02, 0xe5, 0x2d, 0xe5, 0x2d, 0xe5, 0x2d, + 0xe5, 0x2d, 0xe5, 0x2d, 0xe5, 0x2d, 0xe5, 0x2d, 0xe5, 0x2d, 0xe5, 0x2f, + 0xe5, 0x2d, 0xe5, 0x2d, 0xe5, 0x2d, 0xe5, 0x2d, 0xe5, 0x2d, 0xe5, 0x2d, + 0xe5, 0x2d, 0xe5, 0x2d, 0xe5, 0x2d, 0xe5, 0x2d, 0xe5, 0x7a, 0x08, 0x0c, + 0x0d, 0xc5, 0x60, 0x14, 0x00, 0x96, 0x20, 0x48, 0xa8, 0x34, 0xaa, 0x38, + 0x61, 0x10, 0x00, 0xb6, 0x21, 0x58, 0xb9, 0x00, 0x00, 0xbe, 0xd1, 0xbc, + 0x11, 0x90, 0x92, 0x0d, 0x15, 0x18, 0xa8, 0x7c, 0xd0, 0xfc, 0x01, 0x28, + 0x20, 0x09, 0x00, 0x41, 0x00, 0x9e, 0x08, 0x04, 0xe5, 0x9e, 0x60, 0x03, + 0x00, 0x07, 0x60, 0x1b, 0x00, 0x00, 0x08, 0x0c, 0x8a, 0x25, 0x00, 0x9e, + 0x00, 0x05, 0x61, 0x24, 0xd1, 0xf4, 0x1d, 0x58, 0x00, 0x06, 0x00, 0x46, + 0xac, 0xac, 0x94, 0x22, 0xa9, 0xb0, 0x22, 0x00, 0x91, 0x0b, 0x60, 0x30, + 0x94, 0x20, 0x64, 0x32, 0x60, 0x2c, 0x91, 0x09, 0x61, 0x2e, 0x00, 0x4e, + 0x00, 0x0e, 0x08, 0xd8, 0x61, 0x10, 0x00, 0xb6, 0x21, 0x58, 0xb9, 0x00, + 0x00, 0xbe, 0xd1, 0xbc, 0x11, 0x78, 0x20, 0x09, 0x18, 0x0e, 0x21, 0x0c, + 0xd1, 0x9c, 0x01, 0x18, 0x60, 0x03, 0x00, 0x07, 0x00, 0x10, 0x60, 0x03, + 0x00, 0x06, 0x00, 0xe9, 0x08, 0x0c, 0x8a, 0x27, 0x00, 0x9e, 0x00, 0x05, + 0x60, 0x03, 0x00, 0x02, 0x00, 0x9e, 0x00, 0x05, 0x60, 0x24, 0xd0, 0xf4, + 0x01, 0x28, 0x08, 0x0c, 0x16, 0x08, 0x19, 0x04, 0xe5, 0x2f, 0x00, 0x05, + 0x60, 0x14, 0x00, 0x96, 0x20, 0x48, 0xa8, 0x34, 0xa9, 0x38, 0x00, 0x9e, + 0x91, 0x05, 0x11, 0x20, 0x08, 0x0c, 0x16, 0x08, 0x19, 0x04, 0xe5, 0x2f, + 0x00, 0x05, 0xd2, 0xfc, 0x01, 0x40, 0x80, 0x02, 0x80, 0x00, 0x82, 0x12, + 0x92, 0x91, 0x00, 0x00, 0x20, 0x09, 0x00, 0x09, 0x00, 0x10, 0x20, 0x09, + 0x00, 0x15, 0xaa, 0x9a, 0xa8, 0x96, 0x00, 0x05, 0x91, 0x82, 0x00, 0x40, + 0x02, 0x08, 0x00, 0x62, 0x91, 0x86, 0x00, 0x13, 0x01, 0x20, 0x91, 0x86, + 0x00, 0x14, 0x19, 0x0c, 0x0d, 0xc5, 0x60, 0x24, 0xd0, 0xdc, 0x09, 0x0c, + 0x0d, 0xc5, 0x00, 0x05, 0xe5, 0xc2, 0xe5, 0xce, 0xe5, 0xda, 0xe5, 0xe6, + 0xe5, 0xc2, 0xe5, 0xc2, 0xe5, 0xc2, 0xe5, 0xc2, 0xe5, 0xc9, 0xe5, 0xc4, + 0xe5, 0xc4, 0xe5, 0xc2, 0xe5, 0xc2, 0xe5, 0xc2, 0xe5, 0xc2, 0xe5, 0xc4, + 0xe5, 0xc2, 0xe5, 0xc4, 0xe5, 0xc2, 0xe5, 0xc9, 0x08, 0x0c, 0x0d, 0xc5, + 0x60, 0x24, 0xd0, 0xdc, 0x09, 0x0c, 0x0d, 0xc5, 0x00, 0x05, 0x60, 0x14, + 0x90, 0x05, 0x19, 0x0c, 0x0d, 0xc5, 0x00, 0x05, 0x60, 0x03, 0x00, 0x01, + 0x61, 0x06, 0x08, 0x0c, 0x94, 0xff, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x08, 0x0c, 0x9a, 0xb1, 0x01, 0x2e, 0x00, 0x05, 0x60, 0x03, 0x00, 0x01, + 0x61, 0x06, 0x08, 0x0c, 0x94, 0xff, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x08, 0x0c, 0x9a, 0xb1, 0x01, 0x2e, 0x00, 0x05, 0x60, 0x03, 0x00, 0x03, + 0x61, 0x06, 0x2c, 0x10, 0x08, 0x0c, 0x1b, 0xe0, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0x95, 0x64, 0x08, 0x0c, 0x9b, 0xd3, 0x01, 0x2e, + 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0x36, 0x00, 0x96, + 0x91, 0x82, 0x00, 0x40, 0x00, 0x23, 0x00, 0x9e, 0x00, 0x3e, 0x01, 0x2e, + 0x00, 0x05, 0xe6, 0x15, 0xe6, 0x17, 0xe6, 0x29, 0xe6, 0x43, 0xe6, 0x15, + 0xe6, 0x15, 0xe6, 0x15, 0xe6, 0x15, 0xe6, 0x15, 0xe6, 0x15, 0xe6, 0x15, + 0xe6, 0x15, 0xe6, 0x15, 0xe6, 0x15, 0xe6, 0x15, 0xe6, 0x15, 0xe6, 0x15, + 0xe6, 0x15, 0xe6, 0x15, 0xe6, 0x15, 0x08, 0x0c, 0x0d, 0xc5, 0x60, 0x14, + 0x20, 0x48, 0xa8, 0x7c, 0xd0, 0xfc, 0x01, 0xf8, 0x90, 0x9c, 0x00, 0x03, + 0x93, 0x9e, 0x00, 0x03, 0x01, 0xd0, 0x60, 0x03, 0x00, 0x01, 0x61, 0x06, + 0x08, 0x0c, 0x94, 0xff, 0x08, 0x0c, 0x9a, 0xb1, 0x04, 0x70, 0x60, 0x14, + 0x20, 0x48, 0xa8, 0x7c, 0xd0, 0xfc, 0x01, 0x68, 0x90, 0x9c, 0x00, 0x03, + 0x93, 0x9e, 0x00, 0x03, 0x01, 0x40, 0x60, 0x03, 0x00, 0x01, 0x61, 0x06, + 0x08, 0x0c, 0x94, 0xff, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0xe0, 0x90, 0x1e, + 0x63, 0x16, 0x63, 0x1a, 0x20, 0x19, 0x00, 0x04, 0x08, 0x0c, 0xeb, 0xd4, + 0x00, 0xa0, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x7c, 0xd0, 0xfc, 0x0d, 0x98, + 0x90, 0x9c, 0x00, 0x03, 0x93, 0x9e, 0x00, 0x03, 0x0d, 0x70, 0x60, 0x03, + 0x00, 0x03, 0x61, 0x06, 0x2c, 0x10, 0x08, 0x0c, 0x1b, 0xe0, 0x08, 0x0c, + 0x95, 0x64, 0x08, 0x0c, 0x9b, 0xd3, 0x00, 0x05, 0x08, 0x0c, 0x99, 0xa5, + 0x61, 0x14, 0x81, 0xff, 0x01, 0x58, 0x00, 0x96, 0x21, 0x48, 0x08, 0x0c, + 0xef, 0x85, 0x00, 0x36, 0x20, 0x19, 0x00, 0x29, 0x08, 0x0c, 0xeb, 0xd4, + 0x00, 0x3e, 0x00, 0x9e, 0x08, 0x0c, 0xb3, 0x06, 0x08, 0x0c, 0x9a, 0xb1, + 0x00, 0x05, 0x08, 0x0c, 0x9a, 0x61, 0x61, 0x14, 0x81, 0xff, 0x01, 0x58, + 0x00, 0x96, 0x21, 0x48, 0x08, 0x0c, 0xef, 0x85, 0x00, 0x36, 0x20, 0x19, + 0x00, 0x29, 0x08, 0x0c, 0xeb, 0xd4, 0x00, 0x3e, 0x00, 0x9e, 0x08, 0x0c, + 0xb3, 0x06, 0x08, 0x0c, 0x9b, 0xd3, 0x00, 0x05, 0x91, 0x82, 0x00, 0x85, + 0x00, 0x02, 0xe6, 0x94, 0xe6, 0x92, 0xe6, 0x92, 0xe6, 0xa0, 0xe6, 0x92, + 0xe6, 0x92, 0xe6, 0x92, 0xe6, 0x92, 0xe6, 0x92, 0xe6, 0x92, 0xe6, 0x92, + 0xe6, 0x92, 0xe6, 0x92, 0x08, 0x0c, 0x0d, 0xc5, 0x60, 0x03, 0x00, 0x0b, + 0x61, 0x06, 0x08, 0x0c, 0x94, 0xff, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x08, 0x0c, 0x9a, 0xb1, 0x01, 0x2e, 0x00, 0x05, 0x00, 0x26, 0x00, 0xe6, + 0x08, 0x0c, 0xee, 0x26, 0x01, 0x18, 0x08, 0x0c, 0xb2, 0xd3, 0x04, 0x50, + 0x20, 0x71, 0x02, 0x60, 0x72, 0x24, 0x62, 0x16, 0x20, 0x01, 0x18, 0x0e, + 0x20, 0x04, 0xd0, 0xe4, 0x01, 0x50, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, + 0xbc, 0xa0, 0x00, 0xbe, 0x2c, 0x00, 0x20, 0x11, 0x01, 0x4e, 0x08, 0x0c, + 0xb5, 0xf5, 0x72, 0x20, 0x08, 0x0c, 0xea, 0x29, 0x01, 0x18, 0x60, 0x07, + 0x00, 0x86, 0x00, 0x40, 0x60, 0x07, 0x00, 0x87, 0x72, 0x24, 0x92, 0x96, + 0xff, 0xff, 0x11, 0x10, 0x60, 0x07, 0x00, 0x86, 0x60, 0x03, 0x00, 0x01, + 0x08, 0x0c, 0x94, 0xff, 0x08, 0x0c, 0x9a, 0xb1, 0x08, 0x0c, 0x9b, 0xd3, + 0x00, 0xee, 0x00, 0x2e, 0x00, 0x05, 0x91, 0x86, 0x00, 0x13, 0x11, 0x60, + 0x60, 0x04, 0x90, 0x8a, 0x00, 0x85, 0x0a, 0x0c, 0x0d, 0xc5, 0x90, 0x8a, + 0x00, 0x92, 0x1a, 0x0c, 0x0d, 0xc5, 0x90, 0x82, 0x00, 0x85, 0x00, 0xa2, + 0x91, 0x86, 0x00, 0x27, 0x01, 0x30, 0x91, 0x86, 0x00, 0x14, 0x01, 0x18, + 0x08, 0x0c, 0xb3, 0x6d, 0x00, 0x50, 0x20, 0x01, 0x00, 0x07, 0x08, 0x0c, + 0x66, 0x96, 0x08, 0x0c, 0x99, 0xa5, 0x08, 0x0c, 0xb3, 0x06, 0x08, 0x0c, + 0x9a, 0xb1, 0x00, 0x05, 0xe7, 0x05, 0xe7, 0x07, 0xe7, 0x07, 0xe7, 0x05, + 0xe7, 0x05, 0xe7, 0x05, 0xe7, 0x05, 0xe7, 0x05, 0xe7, 0x05, 0xe7, 0x05, + 0xe7, 0x05, 0xe7, 0x05, 0xe7, 0x05, 0x08, 0x0c, 0x0d, 0xc5, 0x08, 0x0c, + 0x99, 0xa5, 0x08, 0x0c, 0xb3, 0x06, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x05, + 0x91, 0x82, 0x00, 0x85, 0x0a, 0x0c, 0x0d, 0xc5, 0x91, 0x82, 0x00, 0x92, + 0x1a, 0x0c, 0x0d, 0xc5, 0x91, 0x82, 0x00, 0x85, 0x00, 0x02, 0xe7, 0x26, + 0xe7, 0x26, 0xe7, 0x26, 0xe7, 0x28, 0xe7, 0x26, 0xe7, 0x26, 0xe7, 0x26, + 0xe7, 0x26, 0xe7, 0x26, 0xe7, 0x26, 0xe7, 0x26, 0xe7, 0x26, 0xe7, 0x26, + 0x08, 0x0c, 0x0d, 0xc5, 0x00, 0x05, 0x91, 0x86, 0x00, 0x13, 0x01, 0x48, + 0x91, 0x86, 0x00, 0x14, 0x01, 0x30, 0x91, 0x86, 0x00, 0x27, 0x01, 0x18, + 0x08, 0x0c, 0xb3, 0x6d, 0x00, 0x30, 0x08, 0x0c, 0x99, 0xa5, 0x08, 0x0c, + 0xb3, 0x06, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x05, 0x00, 0x36, 0x08, 0x0c, + 0xee, 0x87, 0x60, 0x43, 0x00, 0x00, 0x20, 0x19, 0x00, 0x0b, 0x00, 0x11, + 0x00, 0x3e, 0x00, 0x05, 0x60, 0x10, 0x00, 0x06, 0x00, 0x59, 0x00, 0x0e, + 0x60, 0x12, 0x60, 0x23, 0x00, 0x06, 0x60, 0x03, 0x00, 0x07, 0x60, 0x1b, + 0x00, 0x00, 0x60, 0x43, 0x00, 0x00, 0x00, 0x05, 0x01, 0x26, 0x00, 0x36, + 0x20, 0x91, 0x80, 0x00, 0x00, 0x86, 0x2c, 0x40, 0x00, 0x96, 0x90, 0x4e, + 0x08, 0x0c, 0xaa, 0xfb, 0x00, 0x9e, 0x00, 0x8e, 0x15, 0x50, 0x00, 0x76, + 0x2c, 0x38, 0x08, 0x0c, 0xab, 0xa6, 0x00, 0x7e, 0x15, 0x20, 0x60, 0x00, + 0x90, 0x86, 0x00, 0x00, 0x05, 0x00, 0x60, 0x20, 0x90, 0x86, 0x00, 0x07, + 0x01, 0xe0, 0x00, 0x96, 0x60, 0x1c, 0xd0, 0x84, 0x01, 0x40, 0x08, 0x0c, + 0xee, 0x87, 0x08, 0x0c, 0xd7, 0xfb, 0x08, 0x0c, 0x1a, 0x8e, 0x60, 0x23, + 0x00, 0x07, 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0x10, + 0x08, 0x0c, 0xeb, 0xd4, 0x00, 0x9e, 0x60, 0x17, 0x00, 0x00, 0x08, 0x0c, + 0xee, 0x87, 0x60, 0x23, 0x00, 0x07, 0x08, 0x0c, 0xd7, 0xfb, 0x00, 0x3e, + 0x01, 0x2e, 0x00, 0x05, 0x00, 0xf6, 0x00, 0xc6, 0x00, 0xb6, 0x00, 0x36, + 0x01, 0x56, 0x20, 0x79, 0x02, 0x60, 0x79, 0x38, 0x78, 0x3c, 0x08, 0x0c, + 0x28, 0x73, 0x19, 0x04, 0xe7, 0xe4, 0x00, 0x16, 0x00, 0xc6, 0x08, 0x0c, + 0x67, 0x24, 0x19, 0x04, 0xe7, 0xe2, 0x00, 0x1e, 0x00, 0xc6, 0x08, 0x0c, + 0xd7, 0xe3, 0x11, 0x30, 0xb8, 0xc0, 0x90, 0x05, 0x01, 0x18, 0x08, 0x0c, + 0x33, 0xa5, 0x01, 0x48, 0x2b, 0x10, 0x21, 0x60, 0x60, 0x10, 0x00, 0x06, + 0x62, 0x12, 0x08, 0x0c, 0xd7, 0xea, 0x00, 0x0e, 0x60, 0x12, 0x00, 0xce, + 0x00, 0x2e, 0x00, 0x26, 0x00, 0x16, 0x20, 0x19, 0x00, 0x29, 0x08, 0x0c, + 0xac, 0x6c, 0x08, 0x0c, 0x96, 0xa4, 0x00, 0x76, 0x90, 0x3e, 0x08, 0x0c, + 0x95, 0x77, 0x00, 0x7e, 0x00, 0x1e, 0x00, 0x76, 0x90, 0x3e, 0x08, 0x0c, + 0xe9, 0x1c, 0x00, 0x7e, 0x00, 0x26, 0xba, 0x04, 0x92, 0x94, 0xff, 0x00, + 0x82, 0x17, 0x92, 0x86, 0x00, 0x06, 0x01, 0x18, 0x92, 0x86, 0x00, 0x04, + 0x11, 0x18, 0xba, 0xa0, 0x08, 0x0c, 0x33, 0x0e, 0x00, 0x2e, 0xbc, 0xc0, + 0x00, 0x1e, 0x08, 0x0c, 0x61, 0x48, 0xbe, 0x12, 0xbd, 0x16, 0xbc, 0xc2, + 0x90, 0x06, 0x00, 0x10, 0x00, 0xce, 0x00, 0x1e, 0x01, 0x5e, 0x00, 0x3e, + 0x00, 0xbe, 0x00, 0xce, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xc6, 0x00, 0xd6, + 0x00, 0xb6, 0x00, 0x16, 0x20, 0x09, 0x18, 0x24, 0x21, 0x04, 0x90, 0x86, + 0x00, 0x74, 0x19, 0x04, 0xe8, 0x43, 0x20, 0x69, 0x02, 0x60, 0x69, 0x44, + 0x91, 0x82, 0x01, 0x00, 0x06, 0xe0, 0x69, 0x40, 0x91, 0x84, 0x80, 0x00, + 0x09, 0x04, 0xe8, 0x40, 0x20, 0x01, 0x19, 0x7c, 0x20, 0x04, 0x90, 0x05, + 0x11, 0x40, 0x60, 0x10, 0x20, 0x58, 0xb8, 0xc0, 0x90, 0x05, 0x01, 0x18, + 0x91, 0x84, 0x08, 0x00, 0x05, 0x98, 0x69, 0x48, 0x91, 0x8a, 0x00, 0x01, + 0x06, 0x48, 0x08, 0x0c, 0xef, 0xed, 0x01, 0x18, 0x69, 0x78, 0xd1, 0xfc, + 0x11, 0xb8, 0x20, 0x09, 0x02, 0x05, 0x20, 0x0b, 0x00, 0x01, 0x69, 0x3c, + 0x81, 0xff, 0x11, 0x98, 0x69, 0x44, 0x91, 0x82, 0x01, 0x00, 0x02, 0xa8, + 0x69, 0x40, 0x81, 0xff, 0x11, 0x78, 0x69, 0x48, 0x91, 0x8a, 0x00, 0x01, + 0x02, 0x88, 0x69, 0x50, 0x91, 0x8a, 0x00, 0x01, 0x02, 0x98, 0x00, 0xd0, + 0x60, 0x17, 0x01, 0x00, 0x00, 0xa0, 0x60, 0x17, 0x03, 0x00, 0x00, 0x88, + 0x60, 0x17, 0x05, 0x00, 0x00, 0x70, 0x60, 0x17, 0x07, 0x00, 0x00, 0x58, + 0x60, 0x17, 0x09, 0x00, 0x00, 0x40, 0x60, 0x17, 0x0b, 0x00, 0x00, 0x28, + 0x60, 0x17, 0x0f, 0x00, 0x00, 0x10, 0x60, 0x17, 0x2d, 0x00, 0x90, 0x85, + 0x00, 0x01, 0x00, 0x08, 0x90, 0x06, 0x00, 0x1e, 0x00, 0xbe, 0x00, 0xde, + 0x00, 0xce, 0x00, 0x05, 0x00, 0xc6, 0x00, 0xb6, 0x00, 0x26, 0x00, 0x36, + 0x01, 0x56, 0x62, 0x10, 0x22, 0x58, 0xbb, 0x04, 0x93, 0x94, 0x00, 0xff, + 0x92, 0x86, 0x00, 0x06, 0x01, 0x80, 0x92, 0x86, 0x00, 0x04, 0x01, 0x68, + 0x93, 0x94, 0xff, 0x00, 0x82, 0x17, 0x92, 0x86, 0x00, 0x06, 0x01, 0x38, + 0x92, 0x86, 0x00, 0x04, 0x01, 0x20, 0x08, 0x0c, 0x67, 0x33, 0x08, 0x04, + 0xe8, 0xab, 0x20, 0x11, 0x02, 0x76, 0x20, 0xa9, 0x00, 0x04, 0x00, 0x96, + 0x2b, 0x48, 0x20, 0x19, 0x00, 0x0a, 0x08, 0x0c, 0xc3, 0x79, 0x00, 0x9e, + 0x15, 0xa8, 0x20, 0x11, 0x02, 0x7a, 0x20, 0xa9, 0x00, 0x04, 0x00, 0x96, + 0x2b, 0x48, 0x20, 0x19, 0x00, 0x06, 0x08, 0x0c, 0xc3, 0x79, 0x00, 0x9e, + 0x15, 0x48, 0x00, 0x46, 0x00, 0x16, 0xba, 0xa0, 0x22, 0x20, 0x90, 0x06, + 0x20, 0x09, 0x18, 0x48, 0x21, 0x0c, 0xd1, 0xa4, 0x01, 0x38, 0x20, 0x09, + 0x00, 0x29, 0x08, 0x0c, 0xec, 0x31, 0xb8, 0x00, 0xc0, 0xe5, 0xb8, 0x02, + 0x20, 0x19, 0x00, 0x29, 0x08, 0x0c, 0x96, 0xa4, 0x00, 0x76, 0x20, 0x39, + 0x00, 0x00, 0x08, 0x0c, 0x95, 0x77, 0x2c, 0x08, 0x08, 0x0c, 0xe9, 0x1c, + 0x00, 0x7e, 0x20, 0x01, 0x00, 0x07, 0x08, 0x0c, 0x66, 0x96, 0x20, 0x01, + 0x00, 0x07, 0x08, 0x0c, 0x66, 0x6a, 0x00, 0x1e, 0x00, 0x4e, 0x90, 0x06, + 0x01, 0x5e, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0xbe, 0x00, 0xce, 0x00, 0x05, + 0x00, 0xd6, 0x20, 0x69, 0x02, 0x6e, 0x68, 0x00, 0x90, 0x86, 0x08, 0x00, + 0x01, 0x18, 0x60, 0x17, 0x00, 0x00, 0x00, 0x08, 0x90, 0x06, 0x00, 0xde, + 0x00, 0x05, 0x00, 0xb6, 0x00, 0xf6, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, + 0x01, 0x56, 0x20, 0x79, 0x02, 0x6c, 0x79, 0x30, 0x78, 0x34, 0x08, 0x0c, + 0x28, 0x73, 0x11, 0xd0, 0x08, 0x0c, 0x67, 0x24, 0x11, 0xb8, 0x20, 0x11, + 0x02, 0x70, 0x20, 0xa9, 0x00, 0x04, 0x00, 0x96, 0x2b, 0x48, 0x20, 0x19, + 0x00, 0x0a, 0x08, 0x0c, 0xc3, 0x79, 0x00, 0x9e, 0x11, 0x58, 0x20, 0x11, + 0x02, 0x74, 0x20, 0xa9, 0x00, 0x04, 0x00, 0x96, 0x2b, 0x48, 0x20, 0x19, + 0x00, 0x06, 0x08, 0x0c, 0xc3, 0x79, 0x00, 0x9e, 0x01, 0x5e, 0x00, 0x3e, + 0x00, 0x2e, 0x00, 0x1e, 0x00, 0xfe, 0x00, 0xbe, 0x00, 0x05, 0x00, 0xb6, + 0x00, 0x06, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x01, 0x56, 0x20, 0x11, + 0x02, 0x63, 0x22, 0x04, 0x82, 0x11, 0x22, 0x0c, 0x08, 0x0c, 0x28, 0x73, + 0x11, 0xd0, 0x08, 0x0c, 0x67, 0x24, 0x11, 0xb8, 0x20, 0x11, 0x02, 0x76, + 0x20, 0xa9, 0x00, 0x04, 0x00, 0x96, 0x2b, 0x48, 0x20, 0x19, 0x00, 0x0a, + 0x08, 0x0c, 0xc3, 0x79, 0x00, 0x9e, 0x11, 0x58, 0x20, 0x11, 0x02, 0x7a, + 0x20, 0xa9, 0x00, 0x04, 0x00, 0x96, 0x2b, 0x48, 0x20, 0x19, 0x00, 0x06, + 0x08, 0x0c, 0xc3, 0x79, 0x00, 0x9e, 0x01, 0x5e, 0x00, 0x3e, 0x00, 0x2e, + 0x00, 0x1e, 0x00, 0x0e, 0x00, 0xbe, 0x00, 0x05, 0x00, 0xe6, 0x00, 0xc6, + 0x00, 0x86, 0x00, 0x76, 0x00, 0x66, 0x00, 0x56, 0x00, 0x46, 0x00, 0x26, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x27, 0x40, 0x20, 0x29, 0x19, 0xf1, + 0x25, 0x2c, 0x20, 0x21, 0x19, 0xf7, 0x24, 0x24, 0x20, 0x61, 0x1c, 0xd0, + 0x20, 0x71, 0x18, 0x00, 0x76, 0x54, 0x70, 0x74, 0x81, 0xff, 0x01, 0x50, + 0x00, 0x06, 0x91, 0x86, 0x1a, 0xb7, 0x00, 0x0e, 0x01, 0x28, 0x80, 0x01, + 0x96, 0x02, 0x1a, 0x04, 0xe9, 0xba, 0x00, 0x18, 0x96, 0x06, 0x09, 0x04, + 0xe9, 0xba, 0x08, 0x0c, 0x8c, 0xf7, 0x09, 0x04, 0xe9, 0xb1, 0x21, 0x00, + 0x9c, 0x06, 0x09, 0x04, 0xe9, 0xb1, 0x67, 0x20, 0x97, 0x86, 0x00, 0x07, + 0x09, 0x04, 0xe9, 0xb1, 0x08, 0x0c, 0xec, 0x72, 0x19, 0x04, 0xe9, 0xb1, + 0x08, 0x0c, 0xf0, 0x0b, 0x09, 0x04, 0xe9, 0xb1, 0x08, 0x0c, 0xec, 0x62, + 0x09, 0x04, 0xe9, 0xb1, 0x67, 0x20, 0x97, 0x86, 0x00, 0x01, 0x11, 0x48, + 0x08, 0x0c, 0x33, 0xa5, 0x09, 0x04, 0xe9, 0xf9, 0x60, 0x04, 0x90, 0x86, + 0x00, 0x00, 0x19, 0x04, 0xe9, 0xf9, 0x97, 0x86, 0x00, 0x04, 0x09, 0x04, + 0xe9, 0xf9, 0x25, 0x00, 0x9c, 0x06, 0x09, 0x04, 0xe9, 0xb1, 0x24, 0x00, + 0x9c, 0x06, 0x05, 0xe8, 0x88, 0xff, 0x01, 0x18, 0x60, 0x54, 0x99, 0x06, + 0x15, 0xc0, 0x00, 0x96, 0x60, 0x00, 0x90, 0x86, 0x00, 0x04, 0x11, 0x20, + 0x00, 0x16, 0x08, 0x0c, 0x1a, 0x8e, 0x00, 0x1e, 0x97, 0x86, 0x00, 0x0a, + 0x01, 0x48, 0x08, 0x0c, 0xd2, 0xe0, 0x11, 0x30, 0x08, 0x0c, 0xbc, 0xb6, + 0x00, 0x9e, 0x08, 0x0c, 0xb3, 0x06, 0x04, 0x18, 0x60, 0x14, 0x20, 0x48, + 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0xd8, 0x97, 0x86, 0x00, 0x03, 0x15, 0x70, + 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x7c, 0xd0, 0xcc, 0x01, 0x30, 0x00, 0x96, + 0xa8, 0x78, 0x20, 0x48, 0x08, 0x0c, 0x0f, 0xc0, 0x00, 0x9e, 0xab, 0x7a, + 0xa8, 0x77, 0x00, 0x00, 0x08, 0x0c, 0xef, 0x85, 0x00, 0x16, 0x08, 0x0c, + 0xd3, 0xce, 0x08, 0x0c, 0x6e, 0x92, 0x00, 0x1e, 0x08, 0x0c, 0xd2, 0xc3, + 0x00, 0x9e, 0x08, 0x0c, 0xb3, 0x06, 0x9c, 0xe0, 0x00, 0x18, 0x20, 0x01, + 0x18, 0x1a, 0x20, 0x04, 0x9c, 0x02, 0x12, 0x10, 0x08, 0x04, 0xe9, 0x30, + 0x01, 0x2e, 0x00, 0x2e, 0x00, 0x4e, 0x00, 0x5e, 0x00, 0x6e, 0x00, 0x7e, + 0x00, 0x8e, 0x00, 0xce, 0x00, 0xee, 0x00, 0x05, 0x97, 0x86, 0x00, 0x06, + 0x11, 0x50, 0x93, 0x86, 0x00, 0x05, 0x01, 0x28, 0x08, 0x0c, 0xef, 0x85, + 0x08, 0x0c, 0xeb, 0xd4, 0x08, 0xf8, 0x00, 0x9e, 0x0c, 0x00, 0x97, 0x86, + 0x00, 0x09, 0x11, 0xf8, 0x60, 0x00, 0x90, 0x86, 0x00, 0x04, 0x01, 0xc0, + 0x60, 0x00, 0x90, 0x86, 0x00, 0x03, 0x11, 0xa0, 0x08, 0x0c, 0x9a, 0x61, + 0x00, 0x96, 0x61, 0x14, 0x21, 0x48, 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0x18, + 0x60, 0x10, 0x08, 0x0c, 0x6e, 0x9f, 0x00, 0x9e, 0x00, 0xc6, 0x08, 0x0c, + 0xb2, 0xd3, 0x00, 0xce, 0x00, 0x36, 0x08, 0x0c, 0x9b, 0xd3, 0x00, 0x3e, + 0x00, 0x9e, 0x08, 0x04, 0xe9, 0xb1, 0x97, 0x86, 0x00, 0x0a, 0x09, 0x04, + 0xe9, 0xa1, 0x08, 0x04, 0xe9, 0x96, 0x81, 0xff, 0x09, 0x04, 0xe9, 0xb1, + 0x91, 0x80, 0x00, 0x01, 0x20, 0x04, 0x90, 0x86, 0x00, 0x18, 0x01, 0x38, + 0x91, 0x80, 0x00, 0x01, 0x20, 0x04, 0x90, 0x86, 0x00, 0x2d, 0x19, 0x04, + 0xe9, 0xb1, 0x60, 0x00, 0x90, 0x86, 0x00, 0x02, 0x19, 0x04, 0xe9, 0xb1, + 0x08, 0x0c, 0xd2, 0xcf, 0x01, 0x38, 0x08, 0x0c, 0xd2, 0xe0, 0x19, 0x04, + 0xe9, 0xb1, 0x08, 0x0c, 0xbc, 0xb6, 0x00, 0x38, 0x08, 0x0c, 0x32, 0x79, + 0x08, 0x0c, 0xd2, 0xe0, 0x11, 0x10, 0x08, 0x0c, 0xbc, 0xb6, 0x08, 0x0c, + 0xb3, 0x06, 0x08, 0x04, 0xe9, 0xb1, 0xa8, 0x64, 0x90, 0x84, 0x00, 0xff, + 0x90, 0x86, 0x00, 0x39, 0x00, 0x05, 0x00, 0xc6, 0x00, 0xe6, 0x00, 0x16, + 0x2c, 0x08, 0x21, 0x70, 0x90, 0x06, 0x08, 0x0c, 0xeb, 0xfb, 0x00, 0x1e, + 0x01, 0x20, 0x60, 0x20, 0x90, 0x84, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0xee, + 0x00, 0xce, 0x00, 0x05, 0xea, 0x48, 0xea, 0x48, 0xea, 0x48, 0xea, 0x48, + 0xea, 0x48, 0xea, 0x48, 0xea, 0x4a, 0xea, 0x48, 0xea, 0x48, 0xea, 0x48, + 0xea, 0x73, 0xb3, 0x06, 0xb3, 0x06, 0xea, 0x48, 0x90, 0x06, 0x00, 0x05, + 0x00, 0x36, 0x00, 0x46, 0x00, 0x16, 0x70, 0x10, 0x00, 0xb6, 0x20, 0x58, + 0xbc, 0xa0, 0x00, 0xbe, 0x2c, 0x00, 0x20, 0x09, 0x00, 0x20, 0x08, 0x0c, + 0xec, 0x31, 0x00, 0x1e, 0x00, 0x4e, 0x20, 0x19, 0x00, 0x02, 0x08, 0x0c, + 0xe7, 0x54, 0x00, 0x3e, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x00, 0x96, + 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0x40, 0x60, 0x14, 0x90, 0x4d, 0x08, 0x0c, + 0xcc, 0xf3, 0x68, 0x7b, 0x00, 0x05, 0x08, 0x0c, 0x6e, 0x9f, 0x00, 0x9e, + 0x08, 0x0c, 0xb3, 0x06, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x00, 0x19, + 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x60, 0x00, 0x90, 0x8a, 0x00, 0x10, + 0x1a, 0x0c, 0x0d, 0xc5, 0x00, 0x0b, 0x00, 0x05, 0xea, 0x8e, 0xea, 0x8e, + 0xea, 0xa5, 0xea, 0x95, 0xea, 0xb4, 0xea, 0x8e, 0xea, 0x8e, 0xea, 0x90, + 0xea, 0x8e, 0xea, 0x8e, 0xea, 0x8e, 0xea, 0x8e, 0xea, 0x8e, 0xea, 0x8e, + 0xea, 0x8e, 0xea, 0x8e, 0x08, 0x0c, 0x0d, 0xc5, 0x08, 0x0c, 0xb3, 0x06, + 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x00, 0x36, 0x00, 0xe6, 0x20, 0x71, + 0x19, 0xe8, 0x70, 0x3c, 0x9c, 0x06, 0x11, 0x28, 0x20, 0x19, 0x00, 0x01, + 0x08, 0x0c, 0xaa, 0x49, 0x00, 0x10, 0x08, 0x0c, 0xac, 0x2b, 0x00, 0xee, + 0x00, 0x3e, 0x00, 0x96, 0x00, 0xd6, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x7b, + 0x00, 0x05, 0x08, 0x0c, 0x6e, 0x9f, 0x08, 0x0c, 0xb3, 0x06, 0x00, 0xde, + 0x00, 0x9e, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x60, 0x1c, 0xd0, 0x84, + 0x19, 0x0c, 0x1a, 0x8e, 0x0c, 0x60, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, + 0x66, 0x56, 0x01, 0x56, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x20, 0xa9, + 0x00, 0x04, 0x20, 0x19, 0x18, 0x05, 0x20, 0x11, 0x02, 0x76, 0x08, 0x0c, + 0xc3, 0x65, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, 0x01, 0x5e, 0x90, 0x05, + 0x00, 0x05, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xc6, 0x00, 0x86, 0x00, 0x76, + 0x00, 0x66, 0x00, 0xb6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x27, 0x40, + 0x20, 0x61, 0x1c, 0xd0, 0x20, 0x79, 0x00, 0x01, 0x8f, 0xff, 0x09, 0x04, + 0xeb, 0x2b, 0x20, 0x71, 0x18, 0x00, 0x76, 0x54, 0x70, 0x74, 0x80, 0x01, + 0x96, 0x02, 0x1a, 0x04, 0xeb, 0x2b, 0x88, 0xff, 0x01, 0x20, 0x28, 0x00, + 0x9c, 0x06, 0x15, 0xa0, 0x20, 0x78, 0x08, 0x0c, 0xec, 0x62, 0x05, 0x80, + 0x24, 0x00, 0x9c, 0x06, 0x05, 0x68, 0x67, 0x20, 0x97, 0x86, 0x00, 0x06, + 0x15, 0x48, 0x97, 0x86, 0x00, 0x07, 0x05, 0x30, 0x88, 0xff, 0x11, 0x50, + 0xd5, 0x8c, 0x11, 0x18, 0x60, 0x10, 0x9b, 0x06, 0x11, 0xf8, 0xd5, 0x84, + 0x01, 0x18, 0x60, 0x54, 0x91, 0x06, 0x11, 0xd0, 0x00, 0x96, 0x60, 0x1c, + 0xd0, 0x84, 0x01, 0x40, 0x08, 0x0c, 0xee, 0x87, 0x08, 0x0c, 0xd7, 0xfb, + 0x08, 0x0c, 0x1a, 0x8e, 0x60, 0x23, 0x00, 0x07, 0x60, 0x14, 0x20, 0x48, + 0x08, 0x0c, 0xd0, 0xd8, 0x01, 0x20, 0x00, 0x46, 0x08, 0x0c, 0xeb, 0xd4, + 0x00, 0x4e, 0x00, 0x9e, 0x08, 0x0c, 0xb3, 0x06, 0x88, 0xff, 0x11, 0x98, + 0x9c, 0xe0, 0x00, 0x18, 0x20, 0x01, 0x18, 0x1a, 0x20, 0x04, 0x9c, 0x02, + 0x12, 0x10, 0x08, 0x04, 0xea, 0xde, 0x90, 0x06, 0x01, 0x2e, 0x00, 0xbe, + 0x00, 0x6e, 0x00, 0x7e, 0x00, 0x8e, 0x00, 0xce, 0x00, 0xee, 0x00, 0xfe, + 0x00, 0x05, 0x98, 0xc5, 0x00, 0x01, 0x0c, 0xa0, 0x00, 0xb6, 0x00, 0x76, + 0x00, 0x56, 0x00, 0x86, 0x90, 0x46, 0x20, 0x29, 0x00, 0x01, 0x2c, 0x20, + 0x20, 0x19, 0x00, 0x02, 0x62, 0x10, 0x22, 0x58, 0x00, 0x96, 0x90, 0x4e, + 0x08, 0x0c, 0xaa, 0xfb, 0x00, 0x9e, 0x00, 0x8e, 0x90, 0x3e, 0x08, 0x0c, + 0xab, 0xa6, 0x08, 0x0c, 0xea, 0xcf, 0x00, 0x5e, 0x00, 0x7e, 0x00, 0xbe, + 0x00, 0x05, 0x00, 0xb6, 0x00, 0x46, 0x00, 0x56, 0x00, 0x76, 0x00, 0xc6, + 0x01, 0x56, 0x2c, 0x20, 0x21, 0x28, 0x20, 0xa9, 0x00, 0x7f, 0x90, 0x0e, + 0x00, 0x16, 0x00, 0x36, 0x08, 0x0c, 0x67, 0x24, 0x11, 0x80, 0x00, 0x56, + 0x00, 0x86, 0x90, 0x46, 0x25, 0x08, 0x20, 0x29, 0x00, 0x01, 0x00, 0x96, + 0x90, 0x4e, 0x08, 0x0c, 0xaa, 0xfb, 0x00, 0x9e, 0x00, 0x8e, 0x90, 0x3e, + 0x08, 0x0c, 0xab, 0xa6, 0x00, 0x5e, 0x00, 0x3e, 0x00, 0x1e, 0x81, 0x08, + 0x1f, 0x04, 0xeb, 0x5e, 0x00, 0x36, 0x25, 0x08, 0x20, 0x29, 0x00, 0x03, + 0x08, 0x0c, 0xea, 0xcf, 0x00, 0x3e, 0x01, 0x5e, 0x00, 0xce, 0x00, 0x7e, + 0x00, 0x5e, 0x00, 0x4e, 0x00, 0xbe, 0x00, 0x05, 0x00, 0xb6, 0x00, 0x76, + 0x00, 0x56, 0x62, 0x10, 0x22, 0x58, 0x00, 0x86, 0x90, 0x46, 0x20, 0x29, + 0x00, 0x01, 0x20, 0x19, 0x00, 0x48, 0x00, 0x96, 0x90, 0x4e, 0x08, 0x0c, + 0xaa, 0xfb, 0x00, 0x9e, 0x00, 0x8e, 0x90, 0x3e, 0x08, 0x0c, 0xab, 0xa6, + 0x2c, 0x20, 0x08, 0x0c, 0xea, 0xcf, 0x00, 0x5e, 0x00, 0x7e, 0x00, 0xbe, + 0x00, 0x05, 0x00, 0xb6, 0x00, 0x46, 0x00, 0x56, 0x00, 0x76, 0x00, 0xc6, + 0x01, 0x56, 0x2c, 0x20, 0x20, 0xa9, 0x08, 0x00, 0x90, 0x0e, 0x00, 0x16, + 0x00, 0x36, 0x08, 0x0c, 0x67, 0x24, 0x11, 0x90, 0x00, 0x86, 0x90, 0x46, + 0x28, 0x28, 0x00, 0x46, 0x20, 0x21, 0x00, 0x01, 0x08, 0x0c, 0xee, 0x6b, + 0x00, 0x4e, 0x00, 0x96, 0x90, 0x4e, 0x08, 0x0c, 0xaa, 0xfb, 0x00, 0x9e, + 0x00, 0x8e, 0x90, 0x3e, 0x08, 0x0c, 0xab, 0xa6, 0x00, 0x3e, 0x00, 0x1e, + 0x81, 0x08, 0x1f, 0x04, 0xeb, 0xab, 0x00, 0x36, 0x20, 0x29, 0x00, 0x02, + 0x08, 0x0c, 0xea, 0xcf, 0x00, 0x3e, 0x01, 0x5e, 0x00, 0xce, 0x00, 0x7e, + 0x00, 0x5e, 0x00, 0x4e, 0x00, 0xbe, 0x00, 0x05, 0x00, 0x16, 0x00, 0xf6, + 0x08, 0x0c, 0xd0, 0xd6, 0x01, 0x98, 0xa8, 0x64, 0x90, 0x84, 0x00, 0xff, + 0x90, 0x86, 0x00, 0x46, 0x01, 0x80, 0xa8, 0x00, 0x90, 0x7d, 0x01, 0x38, + 0xa8, 0x03, 0x00, 0x00, 0xab, 0x82, 0x08, 0x0c, 0x6e, 0x9f, 0x2f, 0x48, + 0x0c, 0xb0, 0xab, 0x82, 0x08, 0x0c, 0x6e, 0x9f, 0x00, 0xfe, 0x00, 0x1e, + 0x00, 0x05, 0xa8, 0x00, 0x90, 0x7d, 0x01, 0x30, 0xa8, 0x03, 0x00, 0x00, + 0x08, 0x0c, 0x6e, 0x9f, 0x2f, 0x48, 0x0c, 0xb8, 0x08, 0x0c, 0x6e, 0x9f, + 0x0c, 0x88, 0x00, 0xe6, 0x00, 0x46, 0x00, 0x36, 0x20, 0x61, 0x1c, 0xd0, + 0x90, 0x05, 0x11, 0x38, 0x20, 0x71, 0x18, 0x00, 0x74, 0x54, 0x70, 0x74, + 0x80, 0x01, 0x94, 0x02, 0x12, 0xf8, 0x21, 0x00, 0x9c, 0x06, 0x01, 0x88, + 0x60, 0x00, 0x90, 0x86, 0x00, 0x00, 0x01, 0x68, 0x60, 0x08, 0x92, 0x06, + 0x11, 0x50, 0x63, 0x20, 0x93, 0x86, 0x00, 0x09, 0x01, 0xb0, 0x60, 0x10, + 0x91, 0xa0, 0x00, 0x04, 0x24, 0x24, 0x94, 0x06, 0x01, 0x40, 0x9c, 0xe0, + 0x00, 0x18, 0x20, 0x01, 0x18, 0x1a, 0x20, 0x04, 0x9c, 0x02, 0x12, 0x20, + 0x0c, 0x20, 0x90, 0x85, 0x00, 0x01, 0x00, 0x08, 0x90, 0x06, 0x00, 0x3e, + 0x00, 0x4e, 0x00, 0xee, 0x00, 0x05, 0x63, 0x1c, 0xd3, 0xc4, 0x1d, 0x68, + 0x0c, 0x30, 0x00, 0x96, 0x00, 0x06, 0x08, 0x0c, 0x10, 0x0e, 0x00, 0x0e, + 0x09, 0x0c, 0x0d, 0xc5, 0xaa, 0xe2, 0xa8, 0x67, 0x01, 0x0d, 0xa8, 0x8e, + 0x00, 0x26, 0x20, 0x10, 0x08, 0x0c, 0xd0, 0xc6, 0x20, 0x01, 0x00, 0x00, + 0x01, 0x20, 0x22, 0x00, 0x90, 0x80, 0x00, 0x15, 0x20, 0x04, 0x00, 0x2e, + 0xa8, 0x7a, 0x91, 0x86, 0x00, 0x20, 0x01, 0x10, 0xa8, 0xe3, 0xff, 0xff, + 0xa9, 0x86, 0xac, 0x76, 0xa8, 0x7f, 0x00, 0x00, 0x20, 0x01, 0x19, 0x8e, + 0x20, 0x04, 0xa8, 0x82, 0x90, 0x06, 0xa8, 0x02, 0xa8, 0x6a, 0xa8, 0x8a, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x6e, 0x9f, 0x01, 0x2e, + 0x00, 0x9e, 0x00, 0x05, 0x67, 0x00, 0x97, 0x86, 0x00, 0x00, 0x01, 0x58, + 0x97, 0x86, 0x00, 0x01, 0x01, 0x40, 0x97, 0x86, 0x00, 0x0a, 0x01, 0x28, + 0x97, 0x86, 0x00, 0x09, 0x01, 0x10, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, + 0x00, 0xe6, 0x60, 0x10, 0x90, 0x75, 0x01, 0x38, 0x00, 0xb6, 0x20, 0x58, + 0xb8, 0xa0, 0x00, 0xbe, 0x92, 0x06, 0x00, 0xee, 0x00, 0x05, 0x90, 0x85, + 0x00, 0x01, 0x0c, 0xd8, 0x00, 0x16, 0x60, 0x04, 0x90, 0x8e, 0x00, 0x1e, + 0x11, 0xa0, 0x80, 0x07, 0x61, 0x34, 0x91, 0x8c, 0x00, 0xff, 0x91, 0x05, + 0x60, 0x36, 0x60, 0x07, 0x00, 0x85, 0x60, 0x03, 0x00, 0x0b, 0x60, 0x23, + 0x00, 0x05, 0x20, 0x01, 0x19, 0x87, 0x20, 0x04, 0x60, 0x1a, 0x08, 0x0c, + 0x94, 0xff, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x1e, 0x00, 0x05, 0xa0, 0x01, + 0xa0, 0x01, 0x00, 0x05, 0x60, 0x24, 0xd0, 0xe4, 0x01, 0x58, 0xd0, 0xcc, + 0x01, 0x18, 0x08, 0x0c, 0xd4, 0x12, 0x00, 0x30, 0x08, 0x0c, 0xee, 0x87, + 0x08, 0x0c, 0x8a, 0x25, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x05, 0x92, 0x80, + 0x00, 0x08, 0x20, 0x04, 0x90, 0x84, 0x00, 0x0f, 0x00, 0x02, 0xec, 0xc1, + 0xec, 0xc1, 0xec, 0xc1, 0xec, 0xc3, 0xec, 0xc1, 0xec, 0xc3, 0xec, 0xc3, + 0xec, 0xc1, 0xec, 0xc3, 0xec, 0xc1, 0xec, 0xc1, 0xec, 0xc1, 0xec, 0xc1, + 0xec, 0xc1, 0x90, 0x06, 0x00, 0x05, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, + 0x92, 0x80, 0x00, 0x08, 0x20, 0x04, 0x90, 0x84, 0x00, 0x0f, 0x00, 0x02, + 0xec, 0xda, 0xec, 0xda, 0xec, 0xda, 0xec, 0xda, 0xec, 0xda, 0xec, 0xda, + 0xec, 0xe7, 0xec, 0xda, 0xec, 0xda, 0xec, 0xda, 0xec, 0xda, 0xec, 0xda, + 0xec, 0xda, 0xec, 0xda, 0x60, 0x07, 0x00, 0x3b, 0x60, 0x2f, 0x00, 0x09, + 0x60, 0x17, 0x2a, 0x00, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x94, 0xff, + 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x05, 0x00, 0x96, 0x00, 0xc6, 0x22, 0x60, + 0x08, 0x0c, 0xee, 0x87, 0x60, 0x43, 0x00, 0x00, 0x60, 0x24, 0xc0, 0xf4, + 0xc0, 0xe4, 0x60, 0x26, 0x60, 0x3b, 0x00, 0x00, 0x00, 0xce, 0x00, 0xd6, + 0x22, 0x68, 0x91, 0x86, 0x00, 0x07, 0x19, 0x04, 0xed, 0x40, 0x68, 0x14, + 0x90, 0x05, 0x01, 0x38, 0x20, 0x48, 0xa8, 0x7c, 0xd0, 0xfc, 0x11, 0x18, + 0x00, 0xde, 0x00, 0x9e, 0x08, 0xa8, 0x60, 0x07, 0x00, 0x3a, 0x60, 0x03, + 0x00, 0x01, 0x08, 0x0c, 0x94, 0xff, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0xc6, + 0x2d, 0x60, 0x61, 0x00, 0x91, 0x86, 0x00, 0x02, 0x19, 0x04, 0xed, 0xb0, + 0x60, 0x14, 0x90, 0x05, 0x11, 0x38, 0x60, 0x00, 0x90, 0x86, 0x00, 0x07, + 0x19, 0x0c, 0x0d, 0xc5, 0x08, 0x04, 0xed, 0xb0, 0x20, 0x48, 0x08, 0x0c, + 0xd0, 0xd8, 0x11, 0x30, 0x00, 0x28, 0x20, 0x48, 0xa8, 0x00, 0x90, 0x05, + 0x1d, 0xe0, 0x29, 0x00, 0x20, 0x48, 0xa8, 0x7c, 0x90, 0x84, 0x00, 0x03, + 0x90, 0x86, 0x00, 0x02, 0x11, 0x68, 0xa8, 0x7c, 0xc0, 0xdc, 0xc0, 0xf4, + 0xa8, 0x7e, 0xa8, 0x80, 0xc0, 0xfc, 0xa8, 0x82, 0x20, 0x09, 0x00, 0x43, + 0x08, 0x0c, 0xe5, 0x9e, 0x08, 0x04, 0xed, 0xb0, 0x20, 0x09, 0x00, 0x41, + 0x08, 0x04, 0xed, 0xaa, 0x91, 0x86, 0x00, 0x05, 0x15, 0xa0, 0x68, 0x14, + 0x20, 0x48, 0xa8, 0x7c, 0xd0, 0xbc, 0x11, 0x20, 0x00, 0xde, 0x00, 0x9e, + 0x08, 0x04, 0xec, 0xda, 0xd0, 0xb4, 0x01, 0x28, 0xd0, 0xfc, 0x09, 0x0c, + 0x0d, 0xc5, 0x08, 0x04, 0xec, 0xfb, 0x60, 0x07, 0x00, 0x3a, 0x60, 0x03, + 0x00, 0x01, 0x08, 0x0c, 0x94, 0xff, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0xc6, + 0x2d, 0x60, 0x61, 0x00, 0x91, 0x86, 0x00, 0x02, 0x01, 0x20, 0x91, 0x86, + 0x00, 0x04, 0x19, 0x04, 0xed, 0xb0, 0x68, 0x14, 0x20, 0x48, 0xa9, 0x7c, + 0xc1, 0xf4, 0xc1, 0xdc, 0xa9, 0x7e, 0xa9, 0x80, 0xc1, 0xfc, 0xc1, 0xbc, + 0xa9, 0x82, 0x00, 0xf6, 0x2c, 0x78, 0x08, 0x0c, 0x17, 0x68, 0x00, 0xfe, + 0x20, 0x09, 0x00, 0x42, 0x04, 0x98, 0x00, 0x36, 0x08, 0x0c, 0x10, 0x0e, + 0x09, 0x0c, 0x0d, 0xc5, 0xa8, 0x67, 0x01, 0x0d, 0x90, 0x06, 0xa8, 0x02, + 0xa8, 0x6a, 0xa8, 0x8a, 0x2d, 0x18, 0xab, 0x8e, 0xa8, 0x87, 0x00, 0x45, + 0x2c, 0x00, 0xa8, 0x92, 0x60, 0x38, 0xa8, 0xa2, 0x23, 0x60, 0x60, 0x24, + 0xc0, 0xdd, 0x60, 0x26, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0xa0, + 0x00, 0xbe, 0x20, 0x04, 0x63, 0x54, 0xab, 0x7a, 0xa8, 0x76, 0x90, 0x06, + 0xa8, 0x7e, 0xa8, 0x82, 0xad, 0x9a, 0xae, 0x96, 0xa8, 0x9f, 0x00, 0x01, + 0x08, 0x0c, 0x6e, 0x9f, 0x20, 0x19, 0x00, 0x45, 0x60, 0x08, 0x20, 0x68, + 0x08, 0x0c, 0xe7, 0x46, 0x2d, 0x00, 0x60, 0x0a, 0x00, 0x3e, 0x00, 0x38, + 0x60, 0x43, 0x00, 0x00, 0x60, 0x03, 0x00, 0x07, 0x08, 0x0c, 0xe5, 0x9e, + 0x00, 0xce, 0x00, 0xde, 0x00, 0x9e, 0x00, 0x05, 0x91, 0x86, 0x00, 0x13, + 0x11, 0x28, 0x60, 0x04, 0x90, 0x82, 0x00, 0x85, 0x20, 0x08, 0x00, 0xc2, + 0x91, 0x86, 0x00, 0x27, 0x11, 0x78, 0x08, 0x0c, 0x99, 0xa5, 0x00, 0x36, + 0x00, 0x96, 0x60, 0x14, 0x20, 0x48, 0x20, 0x19, 0x00, 0x04, 0x08, 0x0c, + 0xeb, 0xd4, 0x00, 0x9e, 0x00, 0x3e, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x05, + 0x91, 0x86, 0x00, 0x14, 0x0d, 0x70, 0x08, 0x0c, 0xb3, 0x6d, 0x00, 0x05, + 0xed, 0xe3, 0xed, 0xe1, 0xed, 0xe1, 0xed, 0xe1, 0xed, 0xe1, 0xed, 0xe1, + 0xed, 0xe3, 0xed, 0xe1, 0xed, 0xe1, 0xed, 0xe1, 0xed, 0xe1, 0xed, 0xe1, + 0xed, 0xe1, 0x08, 0x0c, 0x0d, 0xc5, 0x08, 0x0c, 0x99, 0xa5, 0x60, 0x03, + 0x00, 0x0c, 0x08, 0x0c, 0x9a, 0xb1, 0x00, 0x05, 0x91, 0x82, 0x00, 0x92, + 0x12, 0x20, 0x91, 0x82, 0x00, 0x85, 0x02, 0x08, 0x00, 0x1a, 0x08, 0x0c, + 0xb3, 0x6d, 0x00, 0x05, 0xee, 0x01, 0xee, 0x01, 0xee, 0x01, 0xee, 0x01, + 0xee, 0x03, 0xee, 0x23, 0xee, 0x01, 0xee, 0x01, 0xee, 0x01, 0xee, 0x01, + 0xee, 0x01, 0xee, 0x01, 0xee, 0x01, 0x08, 0x0c, 0x0d, 0xc5, 0x00, 0xd6, + 0x2c, 0x68, 0x08, 0x0c, 0xb2, 0x7d, 0x01, 0xb0, 0x60, 0x03, 0x00, 0x01, + 0x60, 0x07, 0x00, 0x1e, 0x20, 0x09, 0x02, 0x6e, 0x21, 0x0c, 0x61, 0x3a, + 0x20, 0x09, 0x02, 0x6f, 0x21, 0x0c, 0x61, 0x3e, 0x60, 0x0b, 0xff, 0xff, + 0x69, 0x10, 0x61, 0x12, 0x60, 0x23, 0x00, 0x04, 0x08, 0x0c, 0x94, 0xff, + 0x08, 0x0c, 0x9a, 0xb1, 0x2d, 0x60, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0xde, + 0x00, 0x05, 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x05, 0x00, 0xe6, 0x60, 0x10, + 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x00, 0x00, 0xbe, 0xd0, 0xec, 0x00, 0xee, + 0x00, 0x05, 0x20, 0x09, 0x18, 0x67, 0x21, 0x0c, 0xd1, 0xec, 0x05, 0xb0, + 0x60, 0x03, 0x00, 0x02, 0x60, 0x24, 0xc0, 0xe5, 0x60, 0x26, 0xd0, 0xcc, + 0x01, 0x50, 0x20, 0x01, 0x19, 0x88, 0x20, 0x04, 0x60, 0x42, 0x20, 0x09, + 0x18, 0x67, 0x21, 0x0c, 0xd1, 0xf4, 0x15, 0x20, 0x00, 0xa0, 0x20, 0x09, + 0x18, 0x67, 0x21, 0x0c, 0xd1, 0xf4, 0x01, 0x28, 0x60, 0x24, 0xc0, 0xe4, + 0x60, 0x26, 0x90, 0x06, 0x00, 0xd8, 0x20, 0x01, 0x19, 0x88, 0x20, 0x0c, + 0x20, 0x01, 0x19, 0x86, 0x20, 0x04, 0x91, 0x00, 0x90, 0x80, 0x00, 0x0a, + 0x60, 0x42, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0xbc, 0x00, 0xbe, + 0x00, 0x08, 0x21, 0x04, 0x90, 0x05, 0x01, 0x18, 0x90, 0x88, 0x00, 0x03, + 0x0c, 0xd0, 0x2c, 0x0a, 0x60, 0x0f, 0x00, 0x00, 0x90, 0x85, 0x00, 0x01, + 0x00, 0x05, 0x00, 0x16, 0x00, 0xc6, 0x00, 0xe6, 0x61, 0x54, 0xb8, 0xbc, + 0x20, 0x60, 0x8c, 0xff, 0x01, 0x80, 0x84, 0xff, 0x11, 0x18, 0x60, 0x54, + 0x91, 0x06, 0x11, 0x38, 0x60, 0x0c, 0x20, 0x72, 0x08, 0x0c, 0x8a, 0x25, + 0x08, 0x0c, 0xb2, 0xd3, 0x00, 0x10, 0x9c, 0xf0, 0x00, 0x03, 0x2e, 0x64, + 0x0c, 0x70, 0x00, 0xee, 0x00, 0xce, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xd6, + 0x00, 0xb6, 0x60, 0x10, 0x20, 0x58, 0xb8, 0xbc, 0x90, 0x6d, 0x01, 0x30, + 0x9c, 0x06, 0x01, 0x10, 0x68, 0x0c, 0x0c, 0xd0, 0x60, 0x0c, 0x68, 0x0e, + 0x00, 0xbe, 0x00, 0xde, 0x00, 0x05, 0x00, 0x26, 0x00, 0x36, 0x01, 0x56, + 0x20, 0x11, 0x18, 0x2c, 0x22, 0x04, 0x90, 0x84, 0x00, 0xff, 0x20, 0x19, + 0x02, 0x6e, 0x23, 0x34, 0x96, 0xb4, 0x00, 0xff, 0x96, 0x36, 0x15, 0x08, + 0x83, 0x18, 0x23, 0x34, 0x22, 0x04, 0x90, 0x84, 0xff, 0x00, 0x96, 0x36, + 0x11, 0xd0, 0x20, 0x11, 0x02, 0x70, 0x20, 0xa9, 0x00, 0x04, 0x60, 0x10, + 0x00, 0x96, 0x20, 0x48, 0x20, 0x19, 0x00, 0x0a, 0x08, 0x0c, 0xc3, 0x79, + 0x00, 0x9e, 0x11, 0x68, 0x20, 0x11, 0x02, 0x74, 0x20, 0xa9, 0x00, 0x04, + 0x60, 0x10, 0x00, 0x96, 0x20, 0x48, 0x20, 0x19, 0x00, 0x06, 0x08, 0x0c, + 0xc3, 0x79, 0x00, 0x9e, 0x11, 0x00, 0x01, 0x5e, 0x00, 0x3e, 0x00, 0x2e, + 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0x18, 0x00, 0x08, 0x0c, 0x60, 0xc1, + 0x08, 0x0c, 0x30, 0x00, 0x00, 0xee, 0x00, 0x05, 0x00, 0x96, 0x00, 0x26, + 0x08, 0x0c, 0x10, 0x0e, 0x09, 0x0c, 0x0d, 0xc5, 0xa8, 0x5c, 0x90, 0x80, + 0x00, 0x1a, 0x20, 0xa0, 0x20, 0xa9, 0x00, 0x0c, 0xa8, 0x60, 0x20, 0xe8, + 0x90, 0x06, 0x40, 0x04, 0x91, 0x86, 0x00, 0x46, 0x11, 0x18, 0xa8, 0x67, + 0x01, 0x36, 0x00, 0x38, 0xa8, 0x67, 0x01, 0x38, 0x91, 0x86, 0x00, 0x41, + 0x01, 0x10, 0xa8, 0x7b, 0x00, 0x01, 0x70, 0x38, 0x90, 0x84, 0xff, 0x00, + 0x72, 0x40, 0x92, 0x94, 0xff, 0x00, 0x80, 0x07, 0x92, 0x15, 0xaa, 0x9a, + 0x91, 0x86, 0x00, 0x46, 0x11, 0x68, 0x70, 0x38, 0x90, 0x84, 0x00, 0xff, + 0x72, 0x3c, 0x92, 0x94, 0xff, 0x00, 0x92, 0x15, 0xaa, 0x9e, 0x72, 0x3c, + 0x92, 0x94, 0x00, 0xff, 0xaa, 0xa2, 0x00, 0x60, 0x70, 0x40, 0x90, 0x84, + 0x00, 0xff, 0x72, 0x44, 0x92, 0x94, 0xff, 0x00, 0x92, 0x15, 0xaa, 0x9e, + 0x72, 0x44, 0x92, 0x94, 0x00, 0xff, 0xaa, 0xa2, 0x91, 0x86, 0x00, 0x46, + 0x11, 0x18, 0x9e, 0x90, 0x00, 0x12, 0x00, 0x10, 0x9e, 0x90, 0x00, 0x1a, + 0x22, 0x04, 0x80, 0x07, 0xa8, 0xa6, 0x82, 0x10, 0x22, 0x04, 0x80, 0x07, + 0xa8, 0xaa, 0x82, 0x10, 0x22, 0x04, 0x80, 0x07, 0xa8, 0xae, 0x82, 0x10, + 0x22, 0x04, 0x80, 0x07, 0xa8, 0xb2, 0x82, 0x10, 0x91, 0x86, 0x00, 0x46, + 0x11, 0xb8, 0x9e, 0x90, 0x00, 0x16, 0x22, 0x04, 0x80, 0x07, 0xa8, 0xb6, + 0x82, 0x10, 0x22, 0x04, 0x80, 0x07, 0xa8, 0xba, 0x82, 0x10, 0x22, 0x04, + 0x80, 0x07, 0xa8, 0xbe, 0x82, 0x10, 0x22, 0x04, 0x80, 0x07, 0xa8, 0xc2, + 0x82, 0x10, 0x20, 0x11, 0x02, 0x05, 0x20, 0x13, 0x00, 0x01, 0x00, 0xb0, + 0x9e, 0x90, 0x00, 0x1e, 0x22, 0x04, 0x80, 0x07, 0xa8, 0xb6, 0x82, 0x10, + 0x22, 0x04, 0x80, 0x07, 0xa8, 0xba, 0x20, 0x11, 0x02, 0x05, 0x20, 0x13, + 0x00, 0x01, 0x20, 0x11, 0x02, 0x60, 0x22, 0x04, 0x80, 0x07, 0xa8, 0xbe, + 0x82, 0x10, 0x22, 0x04, 0x80, 0x07, 0xa8, 0xc2, 0x91, 0x86, 0x00, 0x46, + 0x11, 0x18, 0x20, 0x11, 0x02, 0x62, 0x00, 0x10, 0x20, 0x11, 0x02, 0x6a, + 0x01, 0x46, 0x01, 0xd6, 0x00, 0x36, 0x20, 0xa9, 0x00, 0x01, 0x20, 0x19, + 0x00, 0x08, 0xa8, 0x60, 0x20, 0xe8, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x31, + 0x20, 0xa0, 0x22, 0x04, 0x80, 0x07, 0x40, 0x04, 0x82, 0x10, 0x83, 0x19, + 0x1d, 0xd0, 0x00, 0x3e, 0x01, 0xce, 0x01, 0x3e, 0x20, 0x11, 0x02, 0x05, + 0x20, 0x13, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x0c, 0x6e, 0x9f, 0x00, 0x9e, + 0x00, 0x05, 0x00, 0xe6, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x00, + 0x00, 0xbe, 0xd0, 0xfc, 0x01, 0x08, 0x00, 0x11, 0x00, 0xee, 0x00, 0x05, + 0xa8, 0x80, 0xc0, 0xe5, 0xa8, 0x82, 0x00, 0x05, 0x00, 0xe6, 0x00, 0xd6, + 0x00, 0xc6, 0x00, 0x76, 0x00, 0x66, 0x00, 0x56, 0x00, 0x46, 0x00, 0x26, + 0x00, 0x16, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x29, 0x19, 0xf1, + 0x25, 0x2c, 0x20, 0x21, 0x19, 0xf7, 0x24, 0x24, 0x20, 0x61, 0x1c, 0xd0, + 0x20, 0x71, 0x18, 0x00, 0x76, 0x54, 0x70, 0x74, 0x96, 0x06, 0x05, 0x78, + 0x67, 0x20, 0x97, 0x86, 0x00, 0x01, 0x01, 0x18, 0x97, 0x86, 0x00, 0x08, + 0x15, 0x00, 0x25, 0x00, 0x9c, 0x06, 0x01, 0xe8, 0x24, 0x00, 0x9c, 0x06, + 0x01, 0xd0, 0x08, 0x0c, 0xec, 0x62, 0x01, 0xb8, 0x08, 0x0c, 0xec, 0x72, + 0x11, 0xa0, 0x60, 0x00, 0x90, 0x86, 0x00, 0x04, 0x11, 0x20, 0x00, 0x16, + 0x08, 0x0c, 0x1a, 0x8e, 0x00, 0x1e, 0x08, 0x0c, 0xd2, 0xcf, 0x11, 0x10, + 0x08, 0x0c, 0x32, 0x79, 0x08, 0x0c, 0xd2, 0xe0, 0x11, 0x10, 0x08, 0x0c, + 0xbc, 0xb6, 0x08, 0x0c, 0xb3, 0x06, 0x9c, 0xe0, 0x00, 0x18, 0x20, 0x01, + 0x18, 0x1a, 0x20, 0x04, 0x9c, 0x02, 0x12, 0x08, 0x08, 0x58, 0x01, 0x2e, + 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x4e, 0x00, 0x5e, 0x00, 0x6e, 0x00, 0x7e, + 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, 0x00, 0x05, 0x20, 0x01, 0x18, 0x10, + 0x20, 0x04, 0xd0, 0xdc, 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0x18, 0x37, + 0x20, 0x04, 0xd0, 0x9c, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, 0x00, 0x36, + 0x00, 0x46, 0x08, 0x0c, 0xd7, 0xe3, 0x01, 0x68, 0x20, 0x19, 0xff, 0xff, + 0x90, 0x05, 0x01, 0x28, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xbb, 0xa0, + 0x00, 0xbe, 0x20, 0x21, 0x00, 0x04, 0x08, 0x0c, 0x4d, 0xfb, 0x00, 0x4e, + 0x00, 0x3e, 0x00, 0x0e, 0x00, 0x05, 0x60, 0x04, 0x90, 0x86, 0x00, 0x01, + 0x11, 0x28, 0x08, 0x0c, 0xac, 0x6c, 0x08, 0x0c, 0xb3, 0x06, 0x90, 0x06, + 0x00, 0x05, 0x00, 0xe6, 0x00, 0xc6, 0x00, 0xb6, 0x00, 0x46, 0x20, 0x61, + 0x1c, 0xd0, 0x20, 0x71, 0x18, 0x00, 0x74, 0x54, 0x70, 0x74, 0x80, 0x01, + 0x94, 0x02, 0x12, 0xd8, 0x21, 0x00, 0x9c, 0x06, 0x01, 0x68, 0x60, 0x00, + 0x90, 0x86, 0x00, 0x00, 0x01, 0x48, 0x60, 0x10, 0x20, 0x58, 0xb8, 0xa0, + 0x92, 0x06, 0x11, 0x20, 0x60, 0x04, 0x90, 0x86, 0x00, 0x02, 0x01, 0x40, + 0x9c, 0xe0, 0x00, 0x18, 0x20, 0x01, 0x18, 0x1a, 0x20, 0x04, 0x9c, 0x02, + 0x12, 0x20, 0x0c, 0x40, 0x90, 0x85, 0x00, 0x01, 0x00, 0x08, 0x90, 0x06, + 0x00, 0x4e, 0x00, 0xbe, 0x00, 0xce, 0x00, 0xee, 0x00, 0x05, 0x20, 0x01, + 0x18, 0x10, 0x20, 0x04, 0xd0, 0xa4, 0x01, 0x60, 0x20, 0x01, 0x18, 0x37, + 0x20, 0x04, 0xd0, 0xa4, 0x01, 0x38, 0x20, 0x01, 0x18, 0x48, 0x20, 0x04, + 0xd0, 0xa4, 0x11, 0x18, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x90, 0x06, + 0x0c, 0xe8, 0x01, 0x26, 0x00, 0x06, 0x00, 0xe6, 0x00, 0x16, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x71, 0x18, 0x40, 0xd5, 0xa4, 0x01, 0x18, 0x70, 0x04, + 0x80, 0x00, 0x70, 0x06, 0xd5, 0xb4, 0x01, 0x18, 0x70, 0x00, 0x80, 0x00, + 0x70, 0x02, 0xd5, 0xac, 0x01, 0x78, 0x25, 0x00, 0x90, 0x84, 0x00, 0x07, + 0x90, 0x8e, 0x00, 0x03, 0x01, 0x48, 0x90, 0x8e, 0x00, 0x04, 0x01, 0x30, + 0x90, 0x8e, 0x00, 0x05, 0x01, 0x18, 0x20, 0x71, 0xff, 0xf6, 0x00, 0x89, + 0x00, 0x1e, 0x00, 0xee, 0x00, 0x0e, 0x01, 0x2e, 0x00, 0x05, 0x01, 0x26, + 0x00, 0x06, 0x00, 0xe6, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0xff, 0xee, + 0x00, 0x21, 0x00, 0xee, 0x00, 0x0e, 0x01, 0x2e, 0x00, 0x05, 0x2e, 0x05, + 0x80, 0x00, 0x20, 0x77, 0x12, 0x20, 0x8e, 0x70, 0x2e, 0x05, 0x80, 0x00, + 0x20, 0x77, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0xff, 0xec, 0x0c, 0x99, + 0x00, 0xee, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0xff, 0xf0, 0x0c, 0x69, + 0x00, 0xee, 0x00, 0x05, 0x01, 0x26, 0x00, 0x06, 0x00, 0xe6, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x71, 0x18, 0x40, 0x70, 0x14, 0x80, 0x00, 0x70, 0x16, + 0x00, 0xee, 0x00, 0x0e, 0x01, 0x2e, 0x00, 0x05, 0x00, 0x03, 0x00, 0x0b, + 0x07, 0xd2, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x01, 0x80, 0x64, 0x00, 0x08, + 0x00, 0x10, 0x00, 0x00, 0x80, 0x66, 0x00, 0x00, 0x01, 0x01, 0x00, 0x08, + 0x44, 0x07, 0x00, 0x03, 0x80, 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x58, 0x0d, 0x00, 0x0b, 0x79, 0xc0, 0x00, 0x03, 0x51, 0x06, 0x00, 0x03, + 0x4c, 0x0a, 0x00, 0x03, 0xba, 0xc0, 0x00, 0x09, 0x00, 0x8a, 0x00, 0x00, + 0x0c, 0x0a, 0x00, 0x0b, 0x15, 0xfe, 0x00, 0x08, 0x34, 0x0a, 0x00, 0x03, + 0xc4, 0xc0, 0x00, 0x09, 0x70, 0x00, 0x00, 0x00, 0xff, 0xa0, 0x00, 0x01, + 0x20, 0x00, 0x00, 0x00, 0x16, 0x80, 0x00, 0x0b, 0x80, 0x8c, 0x00, 0x08, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x40, 0x28, 0x00, 0x00, + 0x40, 0x47, 0x00, 0x0a, 0x80, 0x8c, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, + 0x08, 0x22, 0x00, 0x03, 0x40, 0x22, 0x00, 0x00, 0x00, 0x28, 0x00, 0x0b, + 0x41, 0x22, 0x00, 0x08, 0x94, 0xc0, 0x00, 0x09, 0xff, 0x00, 0x00, 0x08, + 0xff, 0xe0, 0x00, 0x09, 0x05, 0x00, 0x00, 0x08, 0x0a, 0xab, 0x00, 0x03, + 0x44, 0x47, 0x00, 0x02, 0x0e, 0xa8, 0x00, 0x0b, 0x0b, 0xfe, 0x00, 0x08, + 0x11, 0xa0, 0x00, 0x01, 0x12, 0x86, 0x00, 0x03, 0x0c, 0xa0, 0x00, 0x01, + 0x12, 0x86, 0x00, 0x03, 0x91, 0x80, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, + 0x80, 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x7f, 0x62, 0x00, 0x08, + 0x80, 0x66, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x44, 0x36, 0x00, 0x0b, + 0x80, 0x8c, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x60, 0x00, 0x08, + 0x80, 0x62, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x80, 0x66, 0x00, 0x00, + 0x04, 0x11, 0x00, 0x00, 0x44, 0x3e, 0x00, 0x03, 0x03, 0xfe, 0x00, 0x00, + 0x43, 0xe0, 0x00, 0x01, 0x0e, 0x83, 0x00, 0x0b, 0xc2, 0xc0, 0x00, 0x09, + 0x00, 0xff, 0x00, 0x08, 0x02, 0xe0, 0x00, 0x01, 0x0e, 0x83, 0x00, 0x0b, + 0x91, 0x80, 0x00, 0x01, 0x00, 0x05, 0x00, 0x08, 0x80, 0x60, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x7f, 0x62, 0x00, 0x08, 0x80, 0x66, 0x00, 0x00, + 0x00, 0x19, 0x00, 0x00, 0x44, 0x4d, 0x00, 0x0b, 0x02, 0x40, 0x00, 0x02, + 0x0a, 0x80, 0x00, 0x03, 0x00, 0xfe, 0x00, 0x00, 0x32, 0x83, 0x00, 0x0b, + 0x02, 0x48, 0x00, 0x0a, 0x08, 0x5c, 0x00, 0x03, 0x91, 0x80, 0x00, 0x01, + 0x00, 0x06, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x08, 0x80, 0x02, 0x00, 0x08, + 0x00, 0x03, 0x00, 0x08, 0x80, 0x66, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, + 0x44, 0x5b, 0x00, 0x03, 0x11, 0x2a, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x08, + 0x02, 0x2c, 0x00, 0x08, 0x3a, 0x44, 0x00, 0x02, 0x0c, 0x0a, 0x00, 0x0b, + 0x80, 0x8c, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x17, 0x60, 0x00, 0x08, + 0x80, 0x62, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x08, 0x80, 0x66, 0x00, 0x00, + 0x00, 0x11, 0x00, 0x08, 0x44, 0x68, 0x00, 0x03, 0x01, 0xfe, 0x00, 0x08, + 0x42, 0xe0, 0x00, 0x09, 0x0e, 0x74, 0x00, 0x03, 0x00, 0xfe, 0x00, 0x00, + 0x43, 0xe0, 0x00, 0x01, 0x0e, 0x74, 0x00, 0x03, 0x17, 0x34, 0x00, 0x00, + 0x15, 0x30, 0x00, 0x00, 0x16, 0x32, 0x00, 0x08, 0x0d, 0x2a, 0x00, 0x08, + 0x98, 0x80, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x7f, 0x62, 0x00, 0x08, 0x80, 0x66, 0x00, 0x00, + 0x1e, 0x0a, 0x00, 0x08, 0x44, 0x7a, 0x00, 0x03, 0x80, 0x8a, 0x00, 0x08, + 0x00, 0x03, 0x00, 0x08, 0x1a, 0x60, 0x00, 0x00, 0x80, 0x62, 0x00, 0x08, + 0x00, 0x02, 0x00, 0x00, 0x58, 0x80, 0x00, 0x0b, 0x80, 0x66, 0x00, 0x00, + 0x36, 0x79, 0x00, 0x00, 0x44, 0x83, 0x00, 0x03, 0x58, 0x84, 0x00, 0x03, + 0x3e, 0xfe, 0x00, 0x08, 0x7f, 0x4f, 0x00, 0x02, 0x08, 0x8a, 0x00, 0x0b, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x92, 0x00, 0x0c, 0x80, 0x54, 0x00, 0x08, + 0x00, 0x11, 0x00, 0x08, 0x80, 0x74, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, + 0x1e, 0xfe, 0x00, 0x00, 0x30, 0x0a, 0x00, 0x0b, 0x00, 0xe0, 0x00, 0x0c, + 0x00, 0x0a, 0x00, 0x0b, 0x00, 0xfe, 0x00, 0x00, 0x34, 0x9a, 0x00, 0x03, + 0x1a, 0x60, 0x00, 0x00, 0x80, 0x62, 0x00, 0x08, 0x00, 0x07, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x00, 0x02, 0x31, 0x00, 0x08, 0x44, 0x99, 0x00, 0x0b, + 0x03, 0xfe, 0x00, 0x00, 0x04, 0xd0, 0x00, 0x01, 0x0c, 0xd4, 0x00, 0x0b, + 0x82, 0xc0, 0x00, 0x01, 0x1f, 0x00, 0x00, 0x00, 0xff, 0xa0, 0x00, 0x01, + 0x04, 0x00, 0x00, 0x00, 0x08, 0xb2, 0x00, 0x03, 0x14, 0xdc, 0x00, 0x03, + 0x01, 0xfe, 0x00, 0x08, 0x05, 0x80, 0x00, 0x09, 0x7f, 0x06, 0x00, 0x00, + 0x86, 0x90, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x7f, 0x0c, 0x00, 0x00, + 0x02, 0xfe, 0x00, 0x08, 0xff, 0xc0, 0x00, 0x01, 0x00, 0xff, 0x00, 0x08, + 0x06, 0x80, 0x00, 0x09, 0x10, 0xb2, 0x00, 0x03, 0x7f, 0x08, 0x00, 0x08, + 0x84, 0xc0, 0x00, 0x01, 0xff, 0x00, 0x00, 0x08, 0x08, 0xd4, 0x00, 0x03, + 0xb9, 0xc0, 0x00, 0x09, 0x00, 0x30, 0x00, 0x08, 0x0c, 0xc3, 0x00, 0x0b, + 0x80, 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0xfe, 0x00, 0x08, + 0x1a, 0x0a, 0x00, 0x09, 0x7f, 0x62, 0x00, 0x08, 0x80, 0x66, 0x00, 0x00, + 0x04, 0x09, 0x00, 0x00, 0x44, 0xbc, 0x00, 0x03, 0x80, 0xfe, 0x00, 0x08, + 0x1a, 0x09, 0x00, 0x09, 0x7f, 0x62, 0x00, 0x08, 0x80, 0x66, 0x00, 0x00, + 0x04, 0x0a, 0x00, 0x00, 0x44, 0xc2, 0x00, 0x03, 0x00, 0xfe, 0x00, 0x00, + 0x34, 0xca, 0x00, 0x03, 0x80, 0x72, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, + 0x39, 0x44, 0x00, 0x02, 0x08, 0xc5, 0x00, 0x03, 0x00, 0xce, 0x00, 0x03, + 0x80, 0x72, 0x00, 0x00, 0x20, 0x20, 0x00, 0x08, 0x39, 0x45, 0x00, 0x0a, + 0x08, 0xca, 0x00, 0x03, 0x39, 0x46, 0x00, 0x0a, 0x0c, 0xdb, 0x00, 0x0b, + 0x00, 0x00, 0x00, 0x07, 0x39, 0x43, 0x00, 0x0a, 0x08, 0xdb, 0x00, 0x03, + 0x00, 0xce, 0x00, 0x03, 0x00, 0xfe, 0x00, 0x00, 0x34, 0xd9, 0x00, 0x0b, + 0x80, 0x72, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x0b, + 0x80, 0x72, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x0f, + 0x86, 0xc0, 0x00, 0x09, 0xfc, 0x00, 0x00, 0x08, 0x08, 0xd4, 0x00, 0x03, + 0x00, 0xb2, 0x00, 0x0b, 0x1c, 0x60, 0x00, 0x00, 0x1b, 0x62, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x00, 0x02, 0x31, 0x00, 0x08, 0x44, 0xe4, 0x00, 0x0b, + 0x58, 0xe5, 0x00, 0x0b, 0x01, 0x40, 0x00, 0x08, 0x02, 0x42, 0x00, 0x00, + 0x1f, 0x43, 0x00, 0x02, 0x0c, 0xf3, 0x00, 0x0b, 0x0d, 0x44, 0x00, 0x00, + 0x0d, 0x46, 0x00, 0x08, 0x03, 0x48, 0x00, 0x08, 0x04, 0x4a, 0x00, 0x08, + 0x03, 0x0a, 0x00, 0x08, 0x04, 0x0c, 0x00, 0x00, 0x0d, 0x06, 0x00, 0x00, + 0x0d, 0x08, 0x00, 0x08, 0x00, 0xf7, 0x00, 0x03, 0x03, 0x44, 0x00, 0x08, + 0x04, 0x46, 0x00, 0x08, 0x05, 0x48, 0x00, 0x08, 0x06, 0x4a, 0x00, 0x00, + 0x19, 0x48, 0x00, 0x0a, 0x08, 0xfa, 0x00, 0x03, 0x0d, 0x4a, 0x00, 0x08, + 0x58, 0xfa, 0x00, 0x03, 0x3e, 0xfe, 0x00, 0x08, 0x7f, 0x4f, 0x00, 0x02, + 0x09, 0x01, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x92, 0x00, 0x0c, 0x80, 0x54, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, + 0x80, 0x74, 0x00, 0x00, 0x20, 0x20, 0x00, 0x08, 0x40, 0x00, 0x00, 0x0f, + 0x3a, 0x40, 0x00, 0x0a, 0x0c, 0x0d, 0x00, 0x03, 0x2b, 0x24, 0x00, 0x08, + 0x2b, 0x24, 0x00, 0x08, 0x59, 0x0a, 0x00, 0x0b, 0x80, 0x54, 0x00, 0x08, + 0x00, 0x02, 0x00, 0x00, 0x12, 0x42, 0x00, 0x02, 0x09, 0x58, 0x00, 0x03, + 0x3a, 0x45, 0x00, 0x0a, 0x09, 0x47, 0x00, 0x0b, 0x80, 0x72, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x39, 0x45, 0x00, 0x0a, 0x09, 0x17, 0x00, 0x0b, + 0x80, 0x72, 0x00, 0x00, 0x30, 0x10, 0x00, 0x00, 0x1e, 0x10, 0x00, 0x0a, + 0x7f, 0x3c, 0x00, 0x00, 0x09, 0x42, 0x00, 0x0b, 0x1d, 0x00, 0x00, 0x02, + 0x7f, 0x3a, 0x00, 0x00, 0x0d, 0x60, 0x00, 0x00, 0x7f, 0x62, 0x00, 0x08, + 0x80, 0x66, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x45, 0x20, 0x00, 0x0b, + 0x00, 0xfe, 0x00, 0x00, 0x35, 0x3f, 0x00, 0x0b, 0x1c, 0x60, 0x00, 0x00, + 0x80, 0x62, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x80, 0x66, 0x00, 0x00, + 0x00, 0x09, 0x00, 0x08, 0x45, 0x28, 0x00, 0x03, 0x00, 0xfe, 0x00, 0x00, + 0x32, 0x5b, 0x00, 0x0b, 0x00, 0x38, 0x00, 0x00, 0x00, 0x60, 0x00, 0x08, + 0x80, 0x62, 0x00, 0x08, 0x00, 0x19, 0x00, 0x00, 0x80, 0x66, 0x00, 0x00, + 0x00, 0x09, 0x00, 0x08, 0x45, 0x31, 0x00, 0x0b, 0x80, 0xc0, 0x00, 0x09, + 0x00, 0xff, 0x00, 0x08, 0x7f, 0x3e, 0x00, 0x08, 0x0d, 0x60, 0x00, 0x00, + 0x0e, 0xfe, 0x00, 0x08, 0x1f, 0x80, 0x00, 0x01, 0x7f, 0x62, 0x00, 0x08, + 0x80, 0x66, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x45, 0x3b, 0x00, 0x0b, + 0x00, 0x3a, 0x00, 0x08, 0x1d, 0xfe, 0x00, 0x00, 0x01, 0x1c, 0x00, 0x0b, + 0x00, 0x36, 0x00, 0x08, 0x00, 0xe0, 0x00, 0x0c, 0x01, 0x58, 0x00, 0x0b, + 0x80, 0x74, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x80, 0x72, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x01, 0x58, 0x00, 0x0b, 0x3a, 0x44, 0x00, 0x02, + 0x0a, 0x89, 0x00, 0x03, 0x80, 0x74, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x80, 0x72, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x2d, 0x0e, 0x00, 0x00, + 0x2d, 0x0e, 0x00, 0x00, 0x36, 0x58, 0x00, 0x03, 0x26, 0xfe, 0x00, 0x08, + 0x26, 0xfe, 0x00, 0x08, 0x27, 0x00, 0x00, 0x08, 0x27, 0x00, 0x00, 0x08, + 0x00, 0xd0, 0x00, 0x09, 0x0d, 0x6a, 0x00, 0x03, 0x80, 0x74, 0x00, 0x00, + 0x40, 0x40, 0x00, 0x08, 0x59, 0x58, 0x00, 0x03, 0x51, 0x06, 0x00, 0x03, + 0x3a, 0x46, 0x00, 0x0a, 0x0d, 0x6a, 0x00, 0x03, 0x3a, 0x47, 0x00, 0x02, + 0x09, 0x65, 0x00, 0x0b, 0x80, 0x54, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x80, 0x74, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x72, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x08, 0x01, 0xb4, 0x00, 0x03, 0x92, 0xc0, 0x00, 0x09, + 0x0f, 0xc8, 0x00, 0x00, 0x08, 0x0a, 0x00, 0x03, 0x12, 0x46, 0x00, 0x0a, + 0x0e, 0x52, 0x00, 0x0b, 0x1a, 0x60, 0x00, 0x00, 0x80, 0x62, 0x00, 0x08, + 0x00, 0x02, 0x00, 0x00, 0x80, 0x66, 0x00, 0x00, 0x36, 0x2a, 0x00, 0x00, + 0x45, 0x6f, 0x00, 0x03, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x21, 0x02, 0x00, 0x00, 0x21, 0x02, 0x00, 0x00, 0x22, 0x04, 0x00, 0x00, + 0x22, 0x04, 0x00, 0x00, 0x23, 0x06, 0x00, 0x00, 0x23, 0x06, 0x00, 0x00, + 0x24, 0x08, 0x00, 0x00, 0x24, 0x08, 0x00, 0x00, 0x25, 0x0a, 0x00, 0x00, + 0x25, 0x0a, 0x00, 0x00, 0x26, 0x0c, 0x00, 0x00, 0x26, 0x0c, 0x00, 0x00, + 0x27, 0x0e, 0x00, 0x00, 0x27, 0x0e, 0x00, 0x00, 0x28, 0x10, 0x00, 0x00, + 0x28, 0x10, 0x00, 0x00, 0x29, 0x12, 0x00, 0x00, 0x29, 0x12, 0x00, 0x00, + 0x1a, 0x60, 0x00, 0x00, 0x80, 0x62, 0x00, 0x08, 0x00, 0x07, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x45, 0x89, 0x00, 0x0b, + 0x92, 0xc0, 0x00, 0x09, 0x07, 0x80, 0x00, 0x08, 0x0e, 0x6e, 0x00, 0x0b, + 0x12, 0x4b, 0x00, 0x02, 0x09, 0x92, 0x00, 0x03, 0x2e, 0x4d, 0x00, 0x02, + 0x2e, 0x4d, 0x00, 0x02, 0x0a, 0x58, 0x00, 0x03, 0x3a, 0x46, 0x00, 0x0a, + 0x0d, 0xa2, 0x00, 0x0b, 0x59, 0x94, 0x00, 0x03, 0x80, 0x54, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x12, 0x43, 0x00, 0x0a, 0x09, 0xb0, 0x00, 0x03, + 0x80, 0x10, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x00, 0x02, 0x33, 0x00, 0x0c, + 0x19, 0x48, 0x00, 0x0a, 0x09, 0x9f, 0x00, 0x0b, 0x02, 0x28, 0x00, 0x0c, + 0x18, 0x10, 0x00, 0x00, 0x02, 0x33, 0x00, 0x0c, 0x01, 0xb0, 0x00, 0x0b, + 0x19, 0x48, 0x00, 0x0a, 0x09, 0xa6, 0x00, 0x0b, 0x12, 0x43, 0x00, 0x0a, + 0x0a, 0x5b, 0x00, 0x03, 0x19, 0x4d, 0x00, 0x0a, 0x09, 0xaa, 0x00, 0x0b, + 0x12, 0x43, 0x00, 0x0a, 0x0a, 0x62, 0x00, 0x03, 0x59, 0xaa, 0x00, 0x0b, + 0x80, 0x54, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x02, 0x28, 0x00, 0x0c, + 0x18, 0x10, 0x00, 0x00, 0x02, 0x33, 0x00, 0x0c, 0x80, 0x74, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x08, 0x80, 0x72, 0x00, 0x00, 0x30, 0x00, 0x00, 0x08, + 0x0d, 0x30, 0x00, 0x00, 0x3a, 0x42, 0x00, 0x02, 0x0d, 0xba, 0x00, 0x0b, + 0x15, 0xfe, 0x00, 0x08, 0x34, 0x61, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0b, + 0x80, 0x74, 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, 0x80, 0x10, 0x00, 0x08, + 0x00, 0x0c, 0x00, 0x08, 0x02, 0x33, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x0b, + 0xbb, 0xe0, 0x00, 0x09, 0x00, 0x30, 0x00, 0x08, 0x0d, 0xd0, 0x00, 0x0b, + 0x18, 0xfe, 0x00, 0x00, 0x3c, 0xe0, 0x00, 0x09, 0x09, 0xcd, 0x00, 0x03, + 0x15, 0xfe, 0x00, 0x08, 0x3c, 0xe0, 0x00, 0x09, 0x09, 0xcd, 0x00, 0x03, + 0x02, 0x23, 0x00, 0x04, 0x80, 0x76, 0x00, 0x08, 0x00, 0x40, 0x00, 0x00, + 0x02, 0x20, 0x00, 0x0b, 0x80, 0x76, 0x00, 0x08, 0x00, 0x41, 0x00, 0x08, + 0x02, 0x20, 0x00, 0x0b, 0xbb, 0xe0, 0x00, 0x09, 0x00, 0x32, 0x00, 0x00, + 0x0d, 0xd5, 0x00, 0x0b, 0x3c, 0x1e, 0x00, 0x08, 0x02, 0x20, 0x00, 0x0b, + 0xbb, 0xe0, 0x00, 0x09, 0x00, 0x3b, 0x00, 0x00, 0x0d, 0xda, 0x00, 0x0b, + 0x3c, 0x20, 0x00, 0x00, 0x02, 0x20, 0x00, 0x0b, 0xbb, 0xe0, 0x00, 0x09, + 0x00, 0x35, 0x00, 0x08, 0x0d, 0xe0, 0x00, 0x0b, 0x80, 0x72, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x03, 0x9e, 0x00, 0x03, 0xbb, 0xe0, 0x00, 0x09, + 0x00, 0x36, 0x00, 0x08, 0x0a, 0xbd, 0x00, 0x0b, 0xbb, 0xe0, 0x00, 0x09, + 0x00, 0x37, 0x00, 0x00, 0x0e, 0x01, 0x00, 0x0b, 0x18, 0xfe, 0x00, 0x00, + 0x3c, 0xe0, 0x00, 0x09, 0x0d, 0xcd, 0x00, 0x0b, 0x80, 0x76, 0x00, 0x08, + 0x00, 0x40, 0x00, 0x00, 0x1a, 0x60, 0x00, 0x00, 0x80, 0x62, 0x00, 0x08, + 0x00, 0x0d, 0x00, 0x00, 0x26, 0x04, 0x00, 0x08, 0x26, 0x04, 0x00, 0x08, + 0x27, 0x06, 0x00, 0x08, 0x27, 0x06, 0x00, 0x08, 0x28, 0x08, 0x00, 0x00, + 0x28, 0x08, 0x00, 0x00, 0x29, 0x0a, 0x00, 0x00, 0x29, 0x0a, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x00, 0x04, 0x22, 0x00, 0x00, 0x45, 0xf8, 0x00, 0x0b, + 0x02, 0x28, 0x00, 0x0c, 0x80, 0x54, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x80, 0x74, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x08, 0x80, 0x72, 0x00, 0x00, + 0xb0, 0x00, 0x00, 0x00, 0x01, 0xb4, 0x00, 0x03, 0xbb, 0xe0, 0x00, 0x09, + 0x00, 0x38, 0x00, 0x00, 0x0e, 0x13, 0x00, 0x0b, 0x18, 0xfe, 0x00, 0x00, + 0x3c, 0xe0, 0x00, 0x09, 0x0a, 0x10, 0x00, 0x03, 0x15, 0xfe, 0x00, 0x08, + 0x3c, 0xe0, 0x00, 0x09, 0x0d, 0xc9, 0x00, 0x03, 0x02, 0x23, 0x00, 0x04, + 0x80, 0x76, 0x00, 0x08, 0x00, 0x40, 0x00, 0x00, 0x80, 0x72, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x0b, 0x80, 0x76, 0x00, 0x08, + 0x00, 0x42, 0x00, 0x08, 0x02, 0x20, 0x00, 0x0b, 0xbb, 0xe0, 0x00, 0x09, + 0x00, 0x16, 0x00, 0x00, 0x0e, 0x20, 0x00, 0x0b, 0x80, 0x74, 0x00, 0x00, + 0x08, 0x08, 0x00, 0x08, 0x3a, 0x44, 0x00, 0x02, 0x0c, 0x0c, 0x00, 0x0b, + 0x80, 0x74, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x80, 0x72, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x00, 0x0a, 0x00, 0x0b, + 0x80, 0x72, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x0b, + 0x3d, 0x30, 0x00, 0x0a, 0x7f, 0x00, 0x00, 0x00, 0xbc, 0x80, 0x00, 0x01, + 0x00, 0x07, 0x00, 0x00, 0x02, 0x2c, 0x00, 0x0b, 0x19, 0x30, 0x00, 0x0a, + 0x7f, 0x00, 0x00, 0x00, 0x98, 0x80, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, + 0x80, 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x7f, 0x62, 0x00, 0x08, + 0x80, 0x66, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x08, 0x46, 0x31, 0x00, 0x0b, + 0x40, 0x00, 0x00, 0x0f, 0x22, 0x36, 0x00, 0x0b, 0x08, 0x70, 0x00, 0x08, + 0x40, 0x00, 0x00, 0x0f, 0x7e, 0x33, 0x00, 0x0b, 0xbb, 0xe0, 0x00, 0x09, + 0x00, 0x30, 0x00, 0x08, 0x0e, 0x33, 0x00, 0x03, 0x18, 0xfe, 0x00, 0x00, + 0x3c, 0xe0, 0x00, 0x09, 0x0a, 0x44, 0x00, 0x0b, 0x15, 0xfe, 0x00, 0x08, + 0x3c, 0xe0, 0x00, 0x09, 0x0a, 0x44, 0x00, 0x0b, 0x02, 0x23, 0x00, 0x04, + 0x80, 0x76, 0x00, 0x08, 0x00, 0x40, 0x00, 0x00, 0x02, 0x46, 0x00, 0x0b, + 0x80, 0x76, 0x00, 0x08, 0x00, 0x41, 0x00, 0x08, 0x80, 0x72, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x02, 0x33, 0x00, 0x03, 0xba, 0xc0, 0x00, 0x09, + 0x00, 0x90, 0x00, 0x08, 0x0a, 0x4f, 0x00, 0x03, 0x80, 0x74, 0x00, 0x00, + 0x07, 0x06, 0x00, 0x00, 0x02, 0x51, 0x00, 0x0b, 0x80, 0x74, 0x00, 0x00, + 0x07, 0x03, 0x00, 0x00, 0x40, 0x00, 0x00, 0x0f, 0x80, 0x10, 0x00, 0x08, + 0x00, 0x23, 0x00, 0x00, 0x02, 0x8e, 0x00, 0x03, 0x80, 0x10, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x00, 0x02, 0x8e, 0x00, 0x03, 0x80, 0x10, 0x00, 0x08, + 0x00, 0x22, 0x00, 0x08, 0x02, 0x8e, 0x00, 0x03, 0x02, 0x28, 0x00, 0x0c, + 0x80, 0x10, 0x00, 0x08, 0x00, 0x07, 0x00, 0x00, 0x02, 0x33, 0x00, 0x0c, + 0x18, 0x10, 0x00, 0x00, 0x02, 0x33, 0x00, 0x0c, 0x02, 0x9a, 0x00, 0x03, + 0x02, 0x28, 0x00, 0x0c, 0x80, 0x10, 0x00, 0x08, 0x00, 0x1b, 0x00, 0x08, + 0x02, 0x33, 0x00, 0x0c, 0x18, 0x10, 0x00, 0x00, 0x02, 0x33, 0x00, 0x0c, + 0x80, 0x74, 0x00, 0x00, 0xf0, 0x80, 0x00, 0x00, 0x80, 0x72, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x08, 0x0d, 0x30, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x0b, + 0x80, 0x10, 0x00, 0x08, 0x00, 0x09, 0x00, 0x08, 0x02, 0x8e, 0x00, 0x03, + 0x80, 0x10, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x02, 0x8e, 0x00, 0x03, + 0x16, 0x48, 0x00, 0x0a, 0x0c, 0x6f, 0x00, 0x0b, 0x80, 0x8c, 0x00, 0x08, + 0x00, 0x01, 0x00, 0x00, 0x80, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x41, 0x43, 0x00, 0x0a, 0x08, 0x6f, 0x00, 0x03, 0x3a, 0x44, 0x00, 0x02, + 0x0c, 0x0a, 0x00, 0x0b, 0x0d, 0x2a, 0x00, 0x08, 0x02, 0x8e, 0x00, 0x03, + 0x80, 0x10, 0x00, 0x08, 0x00, 0x03, 0x00, 0x08, 0x02, 0x92, 0x00, 0x0b, + 0x80, 0x10, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x00, 0x02, 0x92, 0x00, 0x0b, + 0x80, 0x10, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x02, 0x92, 0x00, 0x0b, + 0x3a, 0x47, 0x00, 0x02, 0x0d, 0x58, 0x00, 0x0b, 0x80, 0x10, 0x00, 0x08, + 0x00, 0x06, 0x00, 0x08, 0x02, 0x92, 0x00, 0x0b, 0x80, 0x74, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x08, 0x80, 0x72, 0x00, 0x00, 0x30, 0x00, 0x00, 0x08, + 0x02, 0x33, 0x00, 0x0c, 0x02, 0x49, 0x00, 0x04, 0x3a, 0x40, 0x00, 0x0a, + 0x08, 0x0a, 0x00, 0x03, 0x80, 0x10, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x08, + 0x02, 0x33, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x0b, 0x80, 0x74, 0x00, 0x00, + 0xf0, 0x80, 0x00, 0x00, 0x80, 0x72, 0x00, 0x00, 0x30, 0x00, 0x00, 0x08, + 0x0d, 0x30, 0x00, 0x00, 0x2e, 0x4d, 0x00, 0x02, 0x2e, 0x4d, 0x00, 0x02, + 0x0a, 0xa5, 0x00, 0x0b, 0x80, 0x54, 0x00, 0x08, 0x00, 0x19, 0x00, 0x00, + 0x00, 0x0a, 0x00, 0x0b, 0x80, 0x54, 0x00, 0x08, 0x00, 0x09, 0x00, 0x08, + 0x00, 0x0a, 0x00, 0x0b, 0x3a, 0x44, 0x00, 0x02, 0x0c, 0x0a, 0x00, 0x0b, + 0x02, 0x83, 0x00, 0x0b, 0x80, 0x8c, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, + 0x44, 0x47, 0x00, 0x02, 0x0a, 0xd1, 0x00, 0x0b, 0xc0, 0xc0, 0x00, 0x01, + 0x00, 0xff, 0x00, 0x08, 0xff, 0xe0, 0x00, 0x09, 0x00, 0xff, 0x00, 0x08, + 0x0e, 0xa8, 0x00, 0x0b, 0xc1, 0xe0, 0x00, 0x01, 0xff, 0xff, 0x00, 0x08, + 0x0e, 0xa8, 0x00, 0x0b, 0x80, 0x10, 0x00, 0x08, 0x00, 0x13, 0x00, 0x00, + 0x02, 0x33, 0x00, 0x0c, 0x80, 0x74, 0x00, 0x00, 0x02, 0x02, 0x00, 0x08, + 0x00, 0x0a, 0x00, 0x0b, 0x3a, 0x40, 0x00, 0x0a, 0x0e, 0xce, 0x00, 0x0b, + 0x80, 0x74, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, + 0x3c, 0xfe, 0x00, 0x00, 0x80, 0x72, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x43, 0xe0, 0x00, 0x01, 0x0e, 0xcc, 0x00, 0x03, 0x42, 0xfe, 0x00, 0x00, + 0xff, 0xc0, 0x00, 0x01, 0x00, 0xff, 0x00, 0x08, 0x00, 0xe0, 0x00, 0x09, + 0x0a, 0xa8, 0x00, 0x03, 0x0d, 0x08, 0x00, 0x08, 0x03, 0x21, 0x00, 0x0b, + 0x80, 0x72, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x0b, + 0x03, 0xa7, 0x00, 0x0c, 0x80, 0x8c, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, + 0x04, 0xfe, 0x00, 0x08, 0x33, 0x8a, 0x00, 0x03, 0x04, 0x60, 0x00, 0x00, + 0x80, 0x62, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x80, 0x66, 0x00, 0x00, + 0x00, 0x09, 0x00, 0x08, 0x46, 0xdb, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, + 0x80, 0xc0, 0x00, 0x09, 0x00, 0xff, 0x00, 0x08, 0x7f, 0x00, 0x00, 0x00, + 0x80, 0xe0, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x0a, 0xf5, 0x00, 0x0b, + 0x80, 0xe0, 0x00, 0x01, 0x00, 0x05, 0x00, 0x08, 0x0a, 0xf5, 0x00, 0x0b, + 0x80, 0xe0, 0x00, 0x01, 0x00, 0x06, 0x00, 0x08, 0x0a, 0xf5, 0x00, 0x0b, + 0x82, 0xc0, 0x00, 0x01, 0xff, 0x00, 0x00, 0x08, 0x7f, 0x04, 0x00, 0x08, + 0x82, 0xe0, 0x00, 0x09, 0x06, 0x00, 0x00, 0x08, 0x0a, 0xf5, 0x00, 0x0b, + 0x82, 0xe0, 0x00, 0x09, 0x05, 0x00, 0x00, 0x08, 0x0a, 0xf5, 0x00, 0x0b, + 0x82, 0xe0, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0x0f, 0x8a, 0x00, 0x03, + 0xc4, 0xc0, 0x00, 0x09, 0x70, 0x00, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x09, + 0x10, 0x00, 0x00, 0x00, 0x0b, 0x21, 0x00, 0x03, 0x03, 0x98, 0x00, 0x0c, + 0x39, 0x41, 0x00, 0x02, 0x0b, 0x00, 0x00, 0x03, 0x80, 0x72, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x0b, 0x04, 0x60, 0x00, 0x00, + 0x80, 0xfe, 0x00, 0x08, 0x00, 0x2b, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x08, + 0x80, 0x66, 0x00, 0x00, 0x22, 0x09, 0x00, 0x08, 0x47, 0x06, 0x00, 0x0b, + 0x11, 0xfe, 0x00, 0x00, 0x33, 0x1c, 0x00, 0x03, 0x91, 0x80, 0x00, 0x01, + 0x00, 0x02, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x7f, 0x62, 0x00, 0x08, 0x80, 0x66, 0x00, 0x00, 0x06, 0x09, 0x00, 0x08, + 0x47, 0x10, 0x00, 0x03, 0x42, 0xfe, 0x00, 0x00, 0xff, 0xc0, 0x00, 0x01, + 0xff, 0x00, 0x00, 0x08, 0x03, 0xe0, 0x00, 0x09, 0x0f, 0x19, 0x00, 0x03, + 0x80, 0x72, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x03, + 0x91, 0x80, 0x00, 0x01, 0x00, 0x03, 0x00, 0x08, 0x03, 0x03, 0x00, 0x0b, + 0x80, 0x72, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x10, 0x00, 0x08, + 0x00, 0x10, 0x00, 0x00, 0x03, 0x7b, 0x00, 0x0b, 0x03, 0x98, 0x00, 0x0c, + 0x39, 0x41, 0x00, 0x02, 0x0b, 0x27, 0x00, 0x03, 0x80, 0x72, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x0b, 0x10, 0x42, 0x00, 0x0a, + 0x0b, 0x2c, 0x00, 0x0b, 0x03, 0x60, 0x00, 0x04, 0x11, 0xfe, 0x00, 0x00, + 0x37, 0x31, 0x00, 0x0b, 0x80, 0x72, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x80, 0x10, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x00, 0x03, 0x7b, 0x00, 0x0b, + 0x80, 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0xfe, 0x00, 0x08, + 0x37, 0x46, 0x00, 0x0b, 0x80, 0x8c, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, + 0x91, 0x80, 0x00, 0x01, 0x00, 0x05, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x08, + 0x80, 0x66, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x47, 0x3c, 0x00, 0x0b, + 0x00, 0x60, 0x00, 0x08, 0x80, 0x62, 0x00, 0x08, 0x00, 0x1b, 0x00, 0x08, + 0x43, 0x04, 0x00, 0x08, 0x42, 0x06, 0x00, 0x08, 0x80, 0x66, 0x00, 0x00, + 0x04, 0x12, 0x00, 0x00, 0x47, 0x44, 0x00, 0x0b, 0x03, 0x5d, 0x00, 0x03, + 0x80, 0x8c, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x04, 0x60, 0x00, 0x00, + 0x80, 0x62, 0x00, 0x08, 0x00, 0x2b, 0x00, 0x08, 0x80, 0x66, 0x00, 0x00, + 0x06, 0x09, 0x00, 0x08, 0x47, 0x4d, 0x00, 0x0b, 0x80, 0x66, 0x00, 0x00, + 0x22, 0x0a, 0x00, 0x08, 0x47, 0x50, 0x00, 0x0b, 0x42, 0xfe, 0x00, 0x00, + 0xff, 0xc0, 0x00, 0x01, 0xff, 0x00, 0x00, 0x08, 0x7f, 0x04, 0x00, 0x08, + 0x80, 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x91, 0x80, 0x00, 0x01, + 0x00, 0x02, 0x00, 0x00, 0x7f, 0x62, 0x00, 0x08, 0x80, 0x66, 0x00, 0x00, + 0x04, 0x1a, 0x00, 0x08, 0x47, 0x5c, 0x00, 0x0b, 0x80, 0x72, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x03, 0x80, 0x60, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x13, 0x62, 0x00, 0x08, 0x80, 0x66, 0x00, 0x00, + 0x04, 0x11, 0x00, 0x00, 0x47, 0x65, 0x00, 0x0b, 0x02, 0xfe, 0x00, 0x08, + 0x03, 0xe0, 0x00, 0x09, 0x0f, 0x6b, 0x00, 0x03, 0x0d, 0x22, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x0f, 0x82, 0x80, 0x00, 0x09, 0x00, 0x02, 0x00, 0x00, + 0x13, 0x80, 0x00, 0x01, 0x7f, 0x62, 0x00, 0x08, 0x80, 0x66, 0x00, 0x00, + 0x22, 0x09, 0x00, 0x08, 0x47, 0x71, 0x00, 0x0b, 0x02, 0x00, 0x00, 0x0a, + 0xff, 0xc0, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x7f, 0x06, 0x00, 0x00, + 0x13, 0x62, 0x00, 0x08, 0x80, 0x66, 0x00, 0x00, 0x06, 0x0a, 0x00, 0x08, + 0x47, 0x79, 0x00, 0x03, 0x40, 0x00, 0x00, 0x0f, 0x3a, 0x44, 0x00, 0x02, + 0x0c, 0x0a, 0x00, 0x0b, 0x2f, 0x44, 0x00, 0x0a, 0x2f, 0x44, 0x00, 0x0a, + 0x0e, 0x83, 0x00, 0x0b, 0x80, 0x8a, 0x00, 0x08, 0x00, 0x03, 0x00, 0x08, + 0x80, 0x74, 0x00, 0x00, 0xf0, 0x80, 0x00, 0x00, 0x80, 0x72, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x08, 0x5b, 0x86, 0x00, 0x0b, 0x80, 0x54, 0x00, 0x08, + 0x00, 0x19, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x0b, 0x3a, 0x44, 0x00, 0x02, + 0x0c, 0x0a, 0x00, 0x0b, 0x80, 0x8c, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, + 0x80, 0x10, 0x00, 0x08, 0x00, 0x11, 0x00, 0x08, 0x02, 0x33, 0x00, 0x0c, + 0x42, 0xfe, 0x00, 0x00, 0xff, 0xc0, 0x00, 0x01, 0x00, 0xff, 0x00, 0x08, + 0x7f, 0x10, 0x00, 0x08, 0x02, 0x33, 0x00, 0x0c, 0x43, 0x10, 0x00, 0x08, + 0x02, 0x92, 0x00, 0x0b, 0x39, 0x41, 0x00, 0x02, 0x0b, 0x9b, 0x00, 0x0b, + 0x40, 0x00, 0x00, 0x0f, 0x80, 0x72, 0x00, 0x00, 0x04, 0x04, 0x00, 0x08, + 0x40, 0x00, 0x00, 0x0f, 0x80, 0x10, 0x00, 0x08, 0x00, 0x12, 0x00, 0x08, + 0x02, 0x33, 0x00, 0x0c, 0x03, 0x60, 0x00, 0x04, 0x11, 0x10, 0x00, 0x00, + 0x02, 0x33, 0x00, 0x0c, 0x11, 0xfe, 0x00, 0x00, 0x37, 0xa1, 0x00, 0x0b, + 0x00, 0x0a, 0x00, 0x0b, 0xc2, 0xc0, 0x00, 0x09, 0x00, 0xff, 0x00, 0x08, + 0x7f, 0x00, 0x00, 0x00, 0xc3, 0xc0, 0x00, 0x01, 0xff, 0x00, 0x00, 0x08, + 0x00, 0xd0, 0x00, 0x09, 0x0b, 0xcc, 0x00, 0x03, 0x0d, 0x0a, 0x00, 0x00, + 0x85, 0x80, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x7f, 0x62, 0x00, 0x08, + 0x80, 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x66, 0x00, 0x00, + 0x08, 0x09, 0x00, 0x00, 0x47, 0xb6, 0x00, 0x03, 0x04, 0xfe, 0x00, 0x08, + 0x33, 0xc5, 0x00, 0x0b, 0x04, 0x60, 0x00, 0x00, 0x80, 0x62, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x80, 0x66, 0x00, 0x00, 0x02, 0x11, 0x00, 0x00, + 0x47, 0xbe, 0x00, 0x0b, 0x01, 0xfe, 0x00, 0x08, 0x00, 0xe0, 0x00, 0x09, + 0x0f, 0xc5, 0x00, 0x0b, 0x02, 0xfe, 0x00, 0x08, 0x43, 0xe0, 0x00, 0x01, + 0x0b, 0xcb, 0x00, 0x0b, 0x05, 0x00, 0x00, 0x02, 0x7f, 0x0a, 0x00, 0x00, + 0xff, 0xe0, 0x00, 0x09, 0x08, 0x00, 0x00, 0x00, 0x0f, 0xaf, 0x00, 0x0b, + 0x0d, 0x08, 0x00, 0x08, 0x40, 0x00, 0x00, 0x0f, 0x43, 0xfe, 0x00, 0x08, + 0x3e, 0x80, 0x00, 0x01, 0xff, 0xc0, 0x00, 0x01, 0x7f, 0xff, 0x00, 0x00, + 0x0d, 0x60, 0x00, 0x00, 0x7f, 0x62, 0x00, 0x08, 0x80, 0x66, 0x00, 0x00, + 0x08, 0x09, 0x00, 0x00, 0x47, 0xd4, 0x00, 0x0b, 0x80, 0x60, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x84, 0xc0, 0x00, 0x01, 0xff, 0x00, 0x00, 0x08, + 0x7f, 0x60, 0x00, 0x0a, 0x7f, 0x60, 0x00, 0x0a, 0x7f, 0x60, 0x00, 0x0a, + 0x7f, 0x60, 0x00, 0x0a, 0x7f, 0x60, 0x00, 0x0a, 0x7f, 0x60, 0x00, 0x0a, + 0x7f, 0x60, 0x00, 0x0a, 0x7f, 0x60, 0x00, 0x0a, 0xff, 0x80, 0x00, 0x09, + 0x10, 0x00, 0x00, 0x00, 0x7f, 0x62, 0x00, 0x08, 0x80, 0x66, 0x00, 0x00, + 0x08, 0x09, 0x00, 0x00, 0x47, 0xe6, 0x00, 0x03, 0x40, 0x00, 0x00, 0x0f, + 0x8d, 0x5b, 0xea, 0xc4, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, + 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, + 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00, + 0x12, 0xb0 }; -#ifdef UNIQUE_FW_NAME -unsigned short fw2300ipx_length01 = 0xf091; -#else -unsigned short risc_code_length01 = 0xf091; -#endif +struct firmware ql2300_fw = { + .size = sizeof(ql2300_fw_bin), + .data = ql2300_fw_bin +}; diff --git a/drivers/scsi/qla2xxx/ql2322.c b/drivers/scsi/qla2xxx/ql2322.c deleted file mode 100644 index 3c8cafc12..000000000 --- a/drivers/scsi/qla2xxx/ql2322.c +++ /dev/null @@ -1,119 +0,0 @@ -/* - * QLogic Fibre Channel HBA Driver - * Copyright (c) 2003-2005 QLogic Corporation - * - * See LICENSE.qla2xxx for copyright and licensing details. - */ -#include -#include -#include - -#include "qla_def.h" - -static char qla_driver_name[] = "qla2322"; - -extern unsigned char fw2322ipx_version[]; -extern unsigned char fw2322ipx_version_str[]; -extern unsigned short fw2322ipx_addr01; -extern unsigned short fw2322ipx_code01[]; -extern unsigned short fw2322ipx_length01; -extern unsigned long rseqipx_code_addr01; -extern unsigned short rseqipx_code01[]; -extern unsigned short rseqipx_code_length01; -extern unsigned long xseqipx_code_addr01; -extern unsigned short xseqipx_code01[]; -extern unsigned short xseqipx_code_length01; - -static struct qla_fw_info qla_fw_tbl[] = { - { - .addressing = FW_INFO_ADDR_NORMAL, - .fwcode = &fw2322ipx_code01[0], - .fwlen = &fw2322ipx_length01, - .fwstart = &fw2322ipx_addr01, - }, - { - .addressing = FW_INFO_ADDR_EXTENDED, - .fwcode = &rseqipx_code01[0], - .fwlen = &rseqipx_code_length01, - .lfwstart = &rseqipx_code_addr01, - }, - { - .addressing = FW_INFO_ADDR_EXTENDED, - .fwcode = &xseqipx_code01[0], - .fwlen = &xseqipx_code_length01, - .lfwstart = &xseqipx_code_addr01, - }, - { FW_INFO_ADDR_NOMORE, }, -}; - -static struct qla_board_info qla_board_tbl[] = { - { - .drv_name = qla_driver_name, - .isp_name = "ISP2322", - .fw_info = qla_fw_tbl, - }, - { - .drv_name = qla_driver_name, - .isp_name = "ISP6322", - .fw_info = qla_fw_tbl, - }, -}; - -static struct pci_device_id qla2322_pci_tbl[] = { - { - .vendor = PCI_VENDOR_ID_QLOGIC, - .device = PCI_DEVICE_ID_QLOGIC_ISP2322, - .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_ISP6322, - .subvendor = PCI_ANY_ID, - .subdevice = PCI_ANY_ID, - .driver_data = (unsigned long)&qla_board_tbl[1], - }, - {0, 0}, -}; -MODULE_DEVICE_TABLE(pci, qla2322_pci_tbl); - -static int __devinit -qla2322_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 -qla2322_remove_one(struct pci_dev *pdev) -{ - qla2x00_remove_one(pdev); -} - -static struct pci_driver qla2322_pci_driver = { - .name = "qla2322", - .id_table = qla2322_pci_tbl, - .probe = qla2322_probe_one, - .remove = __devexit_p(qla2322_remove_one), -}; - -static int __init -qla2322_init(void) -{ - return pci_module_init(&qla2322_pci_driver); -} - -static void __exit -qla2322_exit(void) -{ - pci_unregister_driver(&qla2322_pci_driver); -} - -module_init(qla2322_init); -module_exit(qla2322_exit); - -MODULE_AUTHOR("QLogic Corporation"); -MODULE_DESCRIPTION("QLogic ISP2322 FC-SCSI Host Bus Adapter driver"); -MODULE_LICENSE("GPL"); -MODULE_VERSION(QLA2XXX_VERSION); diff --git a/drivers/scsi/qla2xxx/ql2322_fw.c b/drivers/scsi/qla2xxx/ql2322_fw.c index 53599a8e2..3033c0a6d 100644 --- a/drivers/scsi/qla2xxx/ql2322_fw.c +++ b/drivers/scsi/qla2xxx/ql2322_fw.c @@ -1,8376 +1,11100 @@ /* - * QLogic Fibre Channel HBA Driver - * Copyright (c) 2003-2005 QLogic Corporation + * Firmware version 3.03.20 IPX from * - * See LICENSE.qla2xxx for copyright and licensing details. - */ - -/* - * Firmware Version 3.03.20 (15:42 Feb 01, 2006) - */ - -#ifdef UNIQUE_FW_NAME -unsigned short fw2322ipx_version = 3*1024+3; -#else -unsigned short risc_code_version = 3*1024+3; -#endif - -#ifdef UNIQUE_FW_NAME -unsigned char fw2322ipx_version_str[] = {3, 3,20}; -#else -unsigned char firmware_version[] = {3, 3,20}; -#endif - -#ifdef UNIQUE_FW_NAME -#define fw2322ipx_VERSION_STRING "3.03.20" -#else -#define FW_VERSION_STRING "3.03.20" -#endif - -#ifdef UNIQUE_FW_NAME -unsigned short fw2322ipx_addr01 = 0x0800 ; -#else -unsigned short risc_code_addr01 = 0x0800 ; -#endif - -#ifdef UNIQUE_FW_NAME -unsigned short fw2322ipx_code01[] = { -#else -unsigned short risc_code01[] = { -#endif - 0x0470, 0x0000, 0x0000, 0xe719, 0x0000, 0x0003, 0x0003, 0x0014, - 0x0137, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2032, 0x3030, - 0x3120, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241, - 0x5449, 0x4f4e, 0x2049, 0x5350, 0x3233, 0x3030, 0x2046, 0x6972, - 0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, - 0x332e, 0x3033, 0x2e32, 0x3020, 0x2020, 0x2020, 0x2400, 0x20a9, - 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2200, 0x20a9, 0x000f, - 0x2001, 0x0000, 0x400f, 0x2091, 0x2400, 0x20a9, 0x000f, 0x2001, - 0x0000, 0x400f, 0x2091, 0x2600, 0x20a9, 0x000f, 0x2001, 0x0000, - 0x400f, 0x2091, 0x2800, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, - 0x2091, 0x2a00, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, - 0x2c00, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2e00, - 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2000, 0x2001, - 0x0000, 0x20c1, 0x0004, 0x20c9, 0x1cff, 0x2059, 0x0000, 0x2b78, - 0x7883, 0x0004, 0x2089, 0x2bc2, 0x2051, 0x1800, 0x2a70, 0x20e1, - 0x0001, 0x20e9, 0x0001, 0x2009, 0x0000, 0x080c, 0x0e74, 0x00f6, - 0x7888, 0x9005, 0x11f8, 0x2061, 0xc000, 0x080c, 0x20c6, 0x1170, - 0x2079, 0x0300, 0x080c, 0x20dc, 0x2061, 0xe000, 0x080c, 0x20c6, - 0x1128, 0x2079, 0x0380, 0x080c, 0x20dc, 0x0060, 0x00fe, 0x7883, - 0x4010, 0x7837, 0x4010, 0x7833, 0x0011, 0x2091, 0x5000, 0x2091, - 0x4080, 0x0cf8, 0x00fe, 0x2029, 0x5600, 0x2031, 0xffff, 0x2039, - 0x55dc, 0x2021, 0x0200, 0x20e9, 0x0001, 0x20a1, 0x0000, 0x20a9, - 0x0800, 0x900e, 0x4104, 0x20e9, 0x0001, 0x20a1, 0x1000, 0x900e, - 0x2001, 0x0dc1, 0x9084, 0x0fff, 0x20a8, 0x4104, 0x2001, 0x0000, - 0x9086, 0x0000, 0x0120, 0x21a8, 0x4104, 0x8001, 0x1de0, 0x756e, - 0x7672, 0x776a, 0x7476, 0x747a, 0x00e6, 0x2071, 0x1b73, 0x2472, - 0x00ee, 0x20a1, 0x1ddc, 0x7170, 0x810d, 0x810d, 0x810d, 0x810d, - 0x918c, 0x000f, 0x2001, 0x0001, 0x9112, 0x900e, 0x21a8, 0x4104, - 0x8211, 0x1de0, 0x7170, 0x3400, 0x8001, 0x9102, 0x0120, 0x0218, - 0x20a8, 0x900e, 0x4104, 0x2009, 0x1800, 0x810d, 0x810d, 0x810d, - 0x810d, 0x810d, 0x918c, 0x001f, 0x2001, 0x0001, 0x9112, 0x20e9, - 0x0001, 0x20a1, 0x0800, 0x900e, 0x20a9, 0x0800, 0x4104, 0x8211, - 0x1dd8, 0x080c, 0x0f71, 0x080c, 0x61ab, 0x080c, 0xb102, 0x080c, - 0x1128, 0x080c, 0x1352, 0x080c, 0x1c1c, 0x080c, 0x9582, 0x080c, - 0x0d17, 0x080c, 0x10ad, 0x080c, 0x358e, 0x080c, 0x7aca, 0x080c, - 0x6cea, 0x080c, 0x8c5d, 0x080c, 0x88be, 0x080c, 0x22bf, 0x080c, - 0x81f5, 0x080c, 0x20f5, 0x080c, 0x2233, 0x080c, 0x22b4, 0x2091, - 0x3009, 0x7883, 0x0000, 0x1004, 0x0943, 0x7880, 0x9086, 0x0002, - 0x1190, 0x7883, 0x4000, 0x7837, 0x4000, 0x7833, 0x0010, 0x0e04, - 0x0937, 0x2091, 0x5000, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, - 0xd084, 0x190c, 0x1200, 0x2071, 0x1800, 0x7003, 0x0000, 0x780c, - 0x9084, 0x0030, 0x9086, 0x0020, 0x1168, 0x7034, 0xc08d, 0x7036, - 0x2001, 0x0050, 0x7076, 0x707a, 0x7056, 0x606b, 0x269c, 0x2071, - 0x1b73, 0x2072, 0x2071, 0x1800, 0x7000, 0x908e, 0x0003, 0x1168, - 0x080c, 0x4d66, 0x080c, 0x35b5, 0x080c, 0x7b32, 0x080c, 0x7275, - 0x080c, 0x8d44, 0x080c, 0x88e7, 0x0c68, 0x000b, 0x0c88, 0x0979, - 0x097a, 0x0b15, 0x0977, 0x0bcf, 0x0d16, 0x0d16, 0x0d16, 0x080c, - 0x0d85, 0x0005, 0x0126, 0x00f6, 0x2091, 0x8000, 0x7000, 0x9086, - 0x0001, 0x1904, 0x0ae8, 0x080c, 0x0ec4, 0x080c, 0x779e, 0x0150, - 0x080c, 0x77c1, 0x15b0, 0x2079, 0x0100, 0x7828, 0x9085, 0x1800, - 0x782a, 0x0478, 0x080c, 0x76cd, 0x7000, 0x9086, 0x0001, 0x1904, - 0x0ae8, 0x7098, 0x9086, 0x0029, 0x1904, 0x0ae8, 0x080c, 0x88a7, - 0x080c, 0x8899, 0x2001, 0x0161, 0x2003, 0x0001, 0x2079, 0x0100, - 0x2011, 0xffff, 0x080c, 0x2ad3, 0x7a28, 0x9295, 0x5e2c, 0x7a2a, - 0x2011, 0x7612, 0x080c, 0x8993, 0x2011, 0x7605, 0x080c, 0x8a9f, - 0x2011, 0x6002, 0x080c, 0x8993, 0x2011, 0x8030, 0x901e, 0x7396, - 0x04d0, 0x080c, 0x58aa, 0x2079, 0x0100, 0x7844, 0x9005, 0x1904, - 0x0ae8, 0x2011, 0x6002, 0x080c, 0x8993, 0x2011, 0x7612, 0x080c, - 0x8993, 0x2011, 0x7605, 0x080c, 0x8a9f, 0x2001, 0x0265, 0x2001, - 0x0205, 0x2003, 0x0000, 0x7840, 0x9084, 0xfffb, 0x7842, 0x2001, - 0x19a7, 0x2004, 0x9005, 0x1140, 0x00c6, 0x2061, 0x0100, 0x080c, - 0x6153, 0x00ce, 0x0804, 0x0ae8, 0x780f, 0x006b, 0x7a28, 0x080c, - 0x77a6, 0x0118, 0x9295, 0x5e2c, 0x0010, 0x9295, 0x402c, 0x7a2a, - 0x2011, 0x8010, 0x73d8, 0x2001, 0x19a8, 0x2003, 0x0001, 0x080c, - 0x299b, 0x080c, 0x4ca1, 0x7248, 0xc284, 0x724a, 0x2001, 0x180c, - 0x200c, 0xc1ac, 0xc1cc, 0x2102, 0x2001, 0x0390, 0x2003, 0x0400, - 0x080c, 0xacfc, 0x080c, 0xa4f1, 0x2011, 0x0004, 0x080c, 0xcf2b, - 0x080c, 0xad18, 0x080c, 0x6ab1, 0x080c, 0x779e, 0x1120, 0x080c, - 0x29fc, 0x0600, 0x0420, 0x080c, 0x615a, 0x0140, 0x7097, 0x0001, - 0x70d3, 0x0000, 0x080c, 0x5a7c, 0x0804, 0x0ae8, 0x2001, 0x0390, - 0x2003, 0x0404, 0x080c, 0x5840, 0xd094, 0x0188, 0x2011, 0x180c, - 0x2204, 0xc0cd, 0x2012, 0x080c, 0x5844, 0xd0d4, 0x1118, 0x080c, - 0x29fc, 0x1270, 0x2011, 0x180c, 0x2204, 0xc0bc, 0x00a8, 0x080c, - 0x5844, 0xd0d4, 0x1db8, 0x2011, 0x180c, 0x2204, 0xc0bd, 0x0060, - 0x2011, 0x180c, 0x2204, 0xc0bd, 0x2012, 0x080c, 0x6c09, 0x1128, - 0xd0a4, 0x0118, 0x2204, 0xc0fd, 0x2012, 0x080c, 0x6bcf, 0x0120, - 0x7a0c, 0xc2b4, 0x7a0e, 0x00a8, 0x707f, 0x0000, 0x080c, 0x779e, - 0x1130, 0x70b0, 0x9005, 0x1168, 0x080c, 0xd389, 0x0050, 0x080c, - 0xd389, 0x70dc, 0xd09c, 0x1128, 0x70b0, 0x9005, 0x0110, 0x080c, - 0x6130, 0x70e7, 0x0000, 0x70e3, 0x0000, 0x70a7, 0x0000, 0x080c, - 0x2a04, 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c4, 0x2012, 0x72dc, - 0x080c, 0x779e, 0x1178, 0x9016, 0x0016, 0x080c, 0x27a4, 0x2019, - 0x196d, 0x211a, 0x001e, 0x705f, 0xffff, 0x7063, 0x00ef, 0x7083, - 0x0000, 0x0020, 0x2019, 0x196d, 0x201b, 0x0000, 0x2079, 0x1847, - 0x7804, 0xd0ac, 0x0108, 0xc295, 0x72de, 0x080c, 0x779e, 0x0118, - 0x9296, 0x0004, 0x0518, 0x2011, 0x0001, 0x080c, 0xcf2b, 0x70ab, - 0x0000, 0x70af, 0xffff, 0x7003, 0x0002, 0x00fe, 0x080c, 0x30bf, - 0x080c, 0xacfc, 0x2011, 0x0005, 0x080c, 0xa62b, 0x080c, 0xad18, - 0x080c, 0x779e, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, 0x080c, - 0x27a4, 0x61e2, 0x001e, 0x00ce, 0x012e, 0x00e0, 0x70ab, 0x0000, - 0x70af, 0xffff, 0x7003, 0x0002, 0x080c, 0xacfc, 0x2011, 0x0005, - 0x080c, 0xa62b, 0x080c, 0xad18, 0x080c, 0x779e, 0x0148, 0x00c6, - 0x2061, 0x0100, 0x0016, 0x080c, 0x27a4, 0x61e2, 0x001e, 0x00ce, - 0x00fe, 0x012e, 0x0005, 0x00c6, 0x00b6, 0x080c, 0x779e, 0x1118, - 0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782, 0x080c, 0x779e, 0x1110, - 0x900e, 0x0010, 0x2009, 0x007e, 0x86ff, 0x0138, 0x9180, 0x1000, - 0x2004, 0x905d, 0x0110, 0xb800, 0xd0bc, 0x090c, 0x341e, 0x8108, - 0x1f04, 0x0afc, 0x707f, 0x0000, 0x7080, 0x9084, 0x00ff, 0x7082, - 0x70b3, 0x0000, 0x00be, 0x00ce, 0x0005, 0x00b6, 0x0126, 0x2091, - 0x8000, 0x7000, 0x9086, 0x0002, 0x1904, 0x0bcc, 0x70ac, 0x9086, - 0xffff, 0x0120, 0x080c, 0x30bf, 0x0804, 0x0bcc, 0x70dc, 0xd0ac, - 0x1110, 0xd09c, 0x0538, 0xd084, 0x0528, 0x0006, 0x2001, 0x0103, - 0x2003, 0x002b, 0x000e, 0xd08c, 0x01e8, 0x080c, 0x3487, 0x11b0, - 0x70e0, 0x9086, 0xffff, 0x0190, 0x080c, 0x327b, 0x70dc, 0xd094, - 0x1904, 0x0bcc, 0x2011, 0x0001, 0x080c, 0xd645, 0x0110, 0x2011, - 0x0003, 0x901e, 0x080c, 0x32b5, 0x0804, 0x0bcc, 0x70e4, 0x9005, - 0x1904, 0x0bcc, 0x70a8, 0x9005, 0x1904, 0x0bcc, 0x70dc, 0xd0a4, - 0x0118, 0xd0b4, 0x0904, 0x0bcc, 0x080c, 0x6bcf, 0x1904, 0x0bcc, - 0x080c, 0x6c22, 0x1904, 0x0bcc, 0x080c, 0x6c09, 0x01c0, 0x0156, - 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x67b4, 0x1118, - 0xb800, 0xd0ec, 0x1138, 0x001e, 0x8108, 0x1f04, 0x0b6c, 0x00ce, - 0x015e, 0x0028, 0x001e, 0x00ce, 0x015e, 0x0804, 0x0bcc, 0x0006, - 0x2001, 0x0103, 0x2003, 0x002b, 0x000e, 0x2011, 0x19b4, 0x080c, - 0x0fe1, 0x2011, 0x19ce, 0x080c, 0x0fe1, 0x7030, 0xc08c, 0x7032, - 0x7003, 0x0003, 0x70af, 0xffff, 0x080c, 0x0e98, 0x9006, 0x080c, - 0x2631, 0x080c, 0x3487, 0x0118, 0x080c, 0x4e3e, 0x0050, 0x0036, - 0x0046, 0x2019, 0xffff, 0x2021, 0x0006, 0x080c, 0x4e58, 0x004e, - 0x003e, 0x00f6, 0x2079, 0x0100, 0x080c, 0x77c1, 0x0150, 0x080c, - 0x779e, 0x7828, 0x0118, 0x9084, 0xe1ff, 0x0010, 0x9084, 0xffdf, - 0x782a, 0x00fe, 0x080c, 0xacfc, 0x2001, 0x19e9, 0x2004, 0x9086, - 0x0005, 0x1120, 0x2011, 0x0000, 0x080c, 0xa62b, 0x2011, 0x0000, - 0x080c, 0xa635, 0x080c, 0xad18, 0x012e, 0x00be, 0x0005, 0x0016, - 0x0026, 0x0046, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100, - 0x7904, 0x918c, 0xfffd, 0x7906, 0x2009, 0x00f7, 0x080c, 0x6119, - 0x7940, 0x918c, 0x0010, 0x7942, 0x7924, 0xd1b4, 0x0120, 0x2011, - 0x0040, 0x080c, 0x2ad3, 0xd19c, 0x0120, 0x2011, 0x0008, 0x080c, - 0x2ad3, 0x0006, 0x0036, 0x0156, 0x0000, 0x2001, 0x19a8, 0x2004, - 0x9005, 0x1518, 0x080c, 0x2a67, 0x1148, 0x2001, 0x0001, 0x080c, - 0x29ca, 0x2001, 0x0001, 0x080c, 0x29ad, 0x00b8, 0x080c, 0x2a6f, - 0x1138, 0x9006, 0x080c, 0x29ca, 0x9006, 0x080c, 0x29ad, 0x0068, - 0x080c, 0x2a77, 0x1d50, 0x2001, 0x1998, 0x2004, 0xd0fc, 0x0108, - 0x0020, 0x080c, 0x27d8, 0x0804, 0x0cc9, 0x20a9, 0x003a, 0x1d04, - 0x0c1f, 0x080c, 0x8a7f, 0x1f04, 0x0c1f, 0x080c, 0x77af, 0x0148, - 0x080c, 0x77c1, 0x1118, 0x080c, 0x7ac5, 0x0050, 0x080c, 0x77a6, - 0x0dd0, 0x080c, 0x7ac0, 0x080c, 0x7ab6, 0x080c, 0x76cd, 0x0020, - 0x2009, 0x00f8, 0x080c, 0x6119, 0x7850, 0xc0e5, 0x7852, 0x080c, - 0x779e, 0x0120, 0x7843, 0x0090, 0x7843, 0x0010, 0x2021, 0xe678, - 0x2019, 0xea60, 0x0d0c, 0x8a7f, 0x7820, 0xd09c, 0x15a0, 0x080c, - 0x779e, 0x0904, 0x0cab, 0x7824, 0xd0ac, 0x1904, 0x0cce, 0x080c, - 0x77c1, 0x1548, 0x0046, 0x2021, 0x0320, 0x8421, 0x1df0, 0x004e, - 0x2011, 0x1800, 0x080c, 0x2ad3, 0x080c, 0x2a7f, 0x7824, 0x9084, - 0x1800, 0x1168, 0x9484, 0x0fff, 0x1140, 0x2001, 0x1810, 0x2004, - 0x9084, 0x9000, 0x0110, 0x080c, 0x0cf1, 0x8421, 0x1160, 0x1d04, - 0x0c7b, 0x080c, 0x8a7f, 0x080c, 0x7ac0, 0x080c, 0x7ab6, 0x7003, - 0x0001, 0x0804, 0x0cce, 0x8319, 0x1928, 0x2001, 0x1810, 0x2004, - 0x9084, 0x9000, 0x0110, 0x080c, 0x0cf1, 0x1d04, 0x0c91, 0x080c, - 0x8a7f, 0x2009, 0x199b, 0x2104, 0x9005, 0x0118, 0x8001, 0x200a, - 0x1188, 0x200b, 0x000a, 0x2011, 0x0048, 0x080c, 0x2ad3, 0x20a9, - 0x0002, 0x080c, 0x2a60, 0x7924, 0x080c, 0x2a7f, 0xd19c, 0x0110, - 0x080c, 0x299b, 0x00f0, 0x080c, 0x77af, 0x1140, 0x94a2, 0x03e8, - 0x1128, 0x080c, 0x7772, 0x7003, 0x0001, 0x00c0, 0x2011, 0x1800, - 0x080c, 0x2ad3, 0x080c, 0x2a7f, 0x7824, 0x080c, 0x77b8, 0x0110, - 0xd0ac, 0x1160, 0x9084, 0x1800, 0x0904, 0x0c83, 0x7003, 0x0001, - 0x0028, 0x2001, 0x0001, 0x080c, 0x2631, 0x00a0, 0x7850, 0xc0e4, - 0x7852, 0x2009, 0x180c, 0x210c, 0xd19c, 0x1120, 0x7904, 0x918d, - 0x0002, 0x7906, 0x2011, 0x0048, 0x080c, 0x2ad3, 0x7828, 0x9085, - 0x0028, 0x782a, 0x2001, 0x19a8, 0x2003, 0x0000, 0x9006, 0x78f2, - 0x015e, 0x003e, 0x000e, 0x012e, 0x00fe, 0x004e, 0x002e, 0x001e, - 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x0046, 0x00b6, 0x00c6, - 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x0071, 0x0d0c, 0x8a7f, 0x015e, - 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x004e, 0x003e, 0x002e, - 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0x189e, 0x7004, 0x9086, - 0x0001, 0x1110, 0x080c, 0x35b5, 0x00ee, 0x0005, 0x0005, 0x2a70, - 0x2061, 0x19ac, 0x2063, 0x0003, 0x6007, 0x0003, 0x600b, 0x0014, - 0x600f, 0x0137, 0x2001, 0x197c, 0x900e, 0x2102, 0x7196, 0x2001, - 0x0100, 0x2004, 0x9082, 0x0002, 0x0218, 0x705f, 0xffff, 0x0008, - 0x715e, 0x7067, 0xffff, 0x717e, 0x7182, 0x080c, 0xd389, 0x70ef, - 0x00c0, 0x2061, 0x196c, 0x6003, 0x0909, 0x6106, 0x600b, 0x8800, - 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x001f, 0x611a, 0x601f, - 0x07d0, 0x2061, 0x1974, 0x6003, 0x8000, 0x6106, 0x610a, 0x600f, - 0x0200, 0x6013, 0x00ff, 0x6116, 0x601b, 0x0001, 0x611e, 0x2061, - 0x1989, 0x6003, 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f, - 0x2020, 0x2001, 0x182c, 0x2102, 0x0005, 0x9016, 0x080c, 0x67b4, - 0x1178, 0xb804, 0x90c4, 0x00ff, 0x98c6, 0x0006, 0x0128, 0x90c4, - 0xff00, 0x98c6, 0x0600, 0x1120, 0x9186, 0x0080, 0x0108, 0x8210, - 0x8108, 0x9186, 0x0800, 0x1d50, 0x2208, 0x0005, 0x2091, 0x8000, - 0x2079, 0x0000, 0x000e, 0x00f6, 0x0010, 0x2091, 0x8000, 0x0e04, - 0x0d87, 0x0006, 0x0016, 0x2001, 0x8002, 0x0006, 0x2079, 0x0000, - 0x000e, 0x7882, 0x7836, 0x001e, 0x798e, 0x000e, 0x788a, 0x000e, - 0x7886, 0x3900, 0x789a, 0x00d6, 0x2069, 0x0300, 0x6818, 0x78ae, - 0x681c, 0x78b2, 0x6808, 0x78be, 0x00de, 0x7833, 0x0012, 0x2091, - 0x5000, 0x0156, 0x00d6, 0x0036, 0x0026, 0x2079, 0x0300, 0x2069, - 0x1b2b, 0x7a08, 0x226a, 0x2069, 0x1b2c, 0x7a18, 0x226a, 0x8d68, - 0x7a1c, 0x226a, 0x782c, 0x2019, 0x1b39, 0x201a, 0x2019, 0x1b3c, - 0x9016, 0x7808, 0xd09c, 0x0168, 0x7820, 0x201a, 0x8210, 0x8318, - 0x9386, 0x1b55, 0x0108, 0x0ca8, 0x7808, 0xd09c, 0x0110, 0x2011, - 0xdead, 0x2019, 0x1b3a, 0x782c, 0x201a, 0x8318, 0x221a, 0x7803, - 0x0000, 0x2069, 0x1a81, 0x901e, 0x20a9, 0x0020, 0x7b26, 0x7a28, - 0x226a, 0x8d68, 0x8318, 0x1f04, 0x0dde, 0x2069, 0x1aa1, 0x2019, - 0x0050, 0x20a9, 0x0020, 0x7b26, 0x7a28, 0x226a, 0x8d68, 0x8318, - 0x1f04, 0x0deb, 0x0491, 0x002e, 0x003e, 0x00de, 0x015e, 0x2079, - 0x1800, 0x7803, 0x0005, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, - 0xd084, 0x0180, 0x2001, 0x1a25, 0x2004, 0x9005, 0x0128, 0x2001, - 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003, 0x0002, - 0x2003, 0x1001, 0x080c, 0x584f, 0x1170, 0x080c, 0x0f32, 0x0110, - 0x080c, 0x0e85, 0x080c, 0x584f, 0x1130, 0x2071, 0x1800, 0x2011, - 0x8000, 0x080c, 0x0f46, 0x0c70, 0x0005, 0x2001, 0x0382, 0x2004, - 0x9084, 0x0007, 0x9086, 0x0001, 0x1120, 0x2001, 0x0015, 0x080c, - 0xaced, 0x2079, 0x0380, 0x2069, 0x1b0b, 0x7818, 0x6802, 0x781c, - 0x6806, 0x7840, 0x680a, 0x7844, 0x680e, 0x782c, 0x6812, 0x2019, - 0x1b16, 0x9016, 0x7808, 0xd09c, 0x0150, 0x7820, 0x201a, 0x8210, - 0x8318, 0x8210, 0x9282, 0x0011, 0x0ea8, 0x2011, 0xdead, 0x6a2a, - 0x7830, 0x681a, 0x7834, 0x681e, 0x7838, 0x6822, 0x783c, 0x6826, - 0x7803, 0x0000, 0x2069, 0x1acb, 0x901e, 0x20a9, 0x0020, 0x7b26, - 0x7828, 0x206a, 0x8d68, 0x8318, 0x1f04, 0x0e5f, 0x2069, 0x1aeb, - 0x2019, 0x00b0, 0x20a9, 0x0020, 0x7b26, 0x7828, 0x206a, 0x8d68, - 0x8318, 0x1f04, 0x0e6c, 0x0005, 0x918c, 0x03ff, 0x2001, 0x0003, - 0x2004, 0x9084, 0x0600, 0x1118, 0x918d, 0x6c00, 0x0010, 0x918d, - 0x6400, 0x2001, 0x017f, 0x2102, 0x0005, 0x0026, 0x0126, 0x2011, - 0x0080, 0x080c, 0x0f24, 0x20a9, 0x0900, 0x080c, 0x0f5a, 0x2011, - 0x0040, 0x080c, 0x0f24, 0x20a9, 0x0900, 0x080c, 0x0f5a, 0x0c78, - 0x0026, 0x080c, 0x0f32, 0x1188, 0x2011, 0x010e, 0x2214, 0x9294, - 0x0007, 0x9296, 0x0007, 0x0118, 0x2011, 0x0947, 0x0010, 0x2011, - 0x1b47, 0x080c, 0x0f46, 0x002e, 0x0005, 0x2011, 0x010e, 0x2214, - 0x9294, 0x0007, 0x9296, 0x0007, 0x0118, 0x2011, 0xa880, 0x0010, - 0x2011, 0x6840, 0xd0e4, 0x70f3, 0x0000, 0x1120, 0x70f3, 0x0fa0, - 0x080c, 0x0f37, 0x002e, 0x0005, 0x0026, 0x080c, 0x0f32, 0x0148, - 0xd0a4, 0x1138, 0x2011, 0xcdd5, 0x0010, 0x2011, 0x0080, 0x080c, - 0x0f37, 0x002e, 0x0005, 0x0026, 0x70f3, 0x0000, 0x080c, 0x0f32, - 0x1130, 0x2011, 0x8040, 0x080c, 0x0f46, 0x002e, 0x0005, 0x080c, - 0x2a77, 0x1118, 0x2011, 0xcdc5, 0x0010, 0x2011, 0xcac2, 0x080c, - 0x0f37, 0x002e, 0x0005, 0x00e6, 0x0016, 0x0006, 0x2071, 0x1800, - 0xd0b4, 0x70ec, 0x71e8, 0x1118, 0xc0e4, 0xc1f4, 0x0050, 0x0006, - 0x3b00, 0x9084, 0xff3e, 0x20d8, 0x000e, 0x70f3, 0x0000, 0xc0e5, - 0xc1f5, 0x0099, 0x000e, 0x001e, 0x00ee, 0x0005, 0x00e6, 0x2071, - 0x1800, 0xd0e4, 0x70ec, 0x1110, 0xc0dc, 0x0008, 0xc0dd, 0x0016, - 0x71e8, 0x0019, 0x001e, 0x00ee, 0x0005, 0x70ee, 0x71ea, 0x7000, - 0x9084, 0x0007, 0x000b, 0x0005, 0x0eea, 0x0ec4, 0x0ec4, 0x0e98, - 0x0ed3, 0x0ec4, 0x0ec4, 0x0ed3, 0xc284, 0x0016, 0x3b08, 0x3a00, - 0x9104, 0x918d, 0x00c1, 0x21d8, 0x9084, 0xff3e, 0x9205, 0x20d0, - 0x001e, 0x0005, 0x2001, 0x183b, 0x2004, 0xd0dc, 0x0005, 0x9e86, - 0x1800, 0x190c, 0x0d85, 0x70ec, 0xd0e4, 0x0108, 0xc2e5, 0x72ee, - 0xd0e4, 0x1118, 0x9294, 0x00c1, 0x08f9, 0x0005, 0x9e86, 0x1800, - 0x190c, 0x0d85, 0x70e8, 0xd0f4, 0x0108, 0xc2f5, 0x72ea, 0xd0f4, - 0x1140, 0x9284, 0x8000, 0x8005, 0xc284, 0x9215, 0x9294, 0x00c1, - 0x0861, 0x0005, 0x1d04, 0x0f5a, 0x2091, 0x6000, 0x1f04, 0x0f5a, - 0x0005, 0x890e, 0x810e, 0x810f, 0x9194, 0x003f, 0x918c, 0xffc0, - 0x0005, 0x0006, 0x2200, 0x914d, 0x894f, 0x894d, 0x894d, 0x000e, - 0x0005, 0x01d6, 0x0146, 0x0036, 0x0096, 0x2061, 0x188d, 0x600b, - 0x0000, 0x600f, 0x0000, 0x6003, 0x0000, 0x6007, 0x0000, 0x2009, - 0xffc0, 0x2105, 0x0006, 0x2001, 0xaaaa, 0x200f, 0x2019, 0x5555, - 0x9016, 0x2049, 0x0bff, 0xab02, 0xa001, 0xa001, 0xa800, 0x9306, - 0x1138, 0x2105, 0x9306, 0x0120, 0x8210, 0x99c8, 0x0400, 0x0c98, - 0x000e, 0x200f, 0x2001, 0x189d, 0x928a, 0x000e, 0x1638, 0x928a, - 0x0006, 0x2011, 0x0006, 0x1210, 0x2011, 0x0000, 0x2202, 0x9006, - 0x2008, 0x82ff, 0x01b0, 0x8200, 0x600a, 0x600f, 0xffff, 0x6003, - 0x0002, 0x6007, 0x0000, 0x0026, 0x2019, 0x0010, 0x9280, 0x0001, - 0x20e8, 0x21a0, 0x21a8, 0x4104, 0x8319, 0x1de0, 0x8211, 0x1da0, - 0x002e, 0x009e, 0x003e, 0x014e, 0x01de, 0x0005, 0x2011, 0x000e, - 0x08e8, 0x0016, 0x0026, 0x0096, 0x3348, 0x080c, 0x0f61, 0x2100, - 0x9300, 0x2098, 0x22e0, 0x009e, 0x002e, 0x001e, 0x0036, 0x3518, - 0x20a9, 0x0001, 0x4002, 0x8007, 0x4004, 0x8319, 0x1dd8, 0x003e, - 0x0005, 0x20e9, 0x0001, 0x71b8, 0x81ff, 0x11c0, 0x9006, 0x2009, - 0x0200, 0x20a9, 0x0002, 0x9298, 0x0018, 0x23a0, 0x4001, 0x2009, - 0x0700, 0x20a9, 0x0002, 0x9298, 0x0008, 0x23a0, 0x4001, 0x707c, - 0x8007, 0x7180, 0x810f, 0x20a9, 0x0002, 0x4001, 0x9298, 0x000c, - 0x23a0, 0x900e, 0x080c, 0x0d65, 0x2001, 0x0000, 0x810f, 0x20a9, - 0x0002, 0x4001, 0x0005, 0x89ff, 0x0140, 0xa804, 0xa807, 0x0000, - 0x0006, 0x080c, 0x108b, 0x009e, 0x0cb0, 0x0005, 0x00e6, 0x2071, - 0x1800, 0x080c, 0x1104, 0x090c, 0x0d85, 0x00ee, 0x0005, 0x0086, - 0x00e6, 0x0006, 0x0026, 0x0036, 0x0126, 0x2091, 0x8000, 0x00c9, - 0x2071, 0x1800, 0x73c0, 0x702c, 0x9016, 0x9045, 0x0158, 0x8210, - 0x9906, 0x090c, 0x0d85, 0x2300, 0x9202, 0x0120, 0x1a0c, 0x0d85, - 0xa000, 0x0c98, 0x012e, 0x003e, 0x002e, 0x000e, 0x00ee, 0x008e, - 0x0005, 0x0086, 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, - 0x1910, 0x7010, 0x9005, 0x0140, 0x7018, 0x9045, 0x0128, 0x9906, - 0x090c, 0x0d85, 0xa000, 0x0cc8, 0x012e, 0x000e, 0x00ee, 0x008e, - 0x0005, 0x00e6, 0x2071, 0x1800, 0x0126, 0x2091, 0x8000, 0x70c0, - 0x8001, 0x0270, 0x70c2, 0x702c, 0x2048, 0x9085, 0x0001, 0xa800, - 0x702e, 0xa803, 0x0000, 0xa807, 0x0000, 0x012e, 0x00ee, 0x0005, - 0x904e, 0x0cd8, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, - 0x70c0, 0x90ca, 0x0020, 0x0268, 0x8001, 0x70c2, 0x702c, 0x2048, - 0xa800, 0x702e, 0xa803, 0x0000, 0xa807, 0x0000, 0x012e, 0x00ee, - 0x0005, 0x904e, 0x0cd8, 0x00e6, 0x0126, 0x2091, 0x8000, 0x0016, - 0x890e, 0x810e, 0x810f, 0x9184, 0x003f, 0xa862, 0x9184, 0xffc0, - 0xa85e, 0x001e, 0x0020, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, - 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, - 0x080c, 0x8899, 0x012e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9026, - 0x2009, 0x0000, 0x2049, 0x0400, 0x2900, 0x702e, 0x8940, 0x2800, - 0xa802, 0xa95e, 0xa863, 0x0001, 0x8420, 0x9886, 0x0440, 0x0120, - 0x2848, 0x9188, 0x0040, 0x0c90, 0x2071, 0x188d, 0x7000, 0x9005, - 0x11a0, 0x2001, 0x0558, 0xa802, 0x2048, 0x2009, 0x5600, 0x8940, - 0x2800, 0xa802, 0xa95e, 0xa863, 0x0001, 0x8420, 0x9886, 0x0800, - 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, 0x2071, 0x188d, 0x7104, - 0x7200, 0x82ff, 0x01d0, 0x7308, 0x8318, 0x831f, 0x831b, 0x831b, - 0x7312, 0x8319, 0x2001, 0x0800, 0xa802, 0x2048, 0x8900, 0xa802, - 0x2040, 0xa95e, 0xaa62, 0x8420, 0x2300, 0x9906, 0x0130, 0x2848, - 0x9188, 0x0040, 0x9291, 0x0000, 0x0c88, 0xa803, 0x0000, 0x2071, - 0x1800, 0x74be, 0x74c2, 0x0005, 0x00e6, 0x0016, 0x9984, 0xfc00, - 0x01e8, 0x908c, 0xf800, 0x1168, 0x9982, 0x0400, 0x02b8, 0x9982, - 0x0440, 0x0278, 0x9982, 0x0558, 0x0288, 0x9982, 0x0800, 0x1270, - 0x0040, 0x9982, 0x0800, 0x0250, 0x2071, 0x188d, 0x7010, 0x9902, - 0x1228, 0x9085, 0x0001, 0x001e, 0x00ee, 0x0005, 0x9006, 0x0cd8, - 0x00e6, 0x2071, 0x1a24, 0x7007, 0x0000, 0x9006, 0x701e, 0x7022, - 0x7002, 0x2071, 0x0000, 0x7010, 0x9085, 0x8044, 0x7012, 0x2071, - 0x0080, 0x9006, 0x702b, 0x0060, 0x20a9, 0x0040, 0x7022, 0x1f04, - 0x113e, 0x702b, 0x0060, 0x702b, 0x0020, 0x20a9, 0x0040, 0x7022, - 0x1f04, 0x1147, 0x702b, 0x0020, 0x00ee, 0x0005, 0x0126, 0x2091, - 0x8000, 0x00e6, 0xa06f, 0x0000, 0x2071, 0x1a24, 0x701c, 0x9088, - 0x1a2e, 0x280a, 0x8000, 0x9084, 0x003f, 0x701e, 0x7120, 0x9106, - 0x090c, 0x0d85, 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, - 0x00a9, 0x00fe, 0x00ee, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, - 0x00e6, 0x2071, 0x1a24, 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, - 0x0080, 0x0021, 0x00fe, 0x00ee, 0x012e, 0x0005, 0x7004, 0x9086, - 0x0000, 0x1110, 0x7007, 0x0006, 0x7000, 0x0002, 0x1190, 0x1313, - 0x118e, 0x118e, 0x1307, 0x1307, 0x1307, 0x1307, 0x080c, 0x0d85, - 0x701c, 0x7120, 0x9106, 0x1148, 0x792c, 0x9184, 0x0001, 0x1120, - 0xd1fc, 0x1110, 0x7007, 0x0000, 0x0005, 0x0096, 0x9180, 0x1a2e, - 0x2004, 0x700a, 0x2048, 0x8108, 0x918c, 0x003f, 0x7122, 0x782b, - 0x0026, 0xa88c, 0x7802, 0xa890, 0x7806, 0xa894, 0x780a, 0xa898, - 0x780e, 0xa878, 0x700e, 0xa870, 0x7016, 0xa874, 0x701a, 0xa868, - 0x009e, 0xd084, 0x0120, 0x7007, 0x0001, 0x0029, 0x0005, 0x7007, - 0x0002, 0x00b1, 0x0005, 0x0016, 0x0026, 0x710c, 0x2011, 0x0040, - 0x9182, 0x0040, 0x1210, 0x2110, 0x9006, 0x700e, 0x7212, 0x8203, - 0x7812, 0x782b, 0x0020, 0x782b, 0x0041, 0x002e, 0x001e, 0x0005, - 0x0016, 0x0026, 0x0136, 0x0146, 0x0156, 0x7014, 0x20e0, 0x7018, - 0x2098, 0x20e9, 0x0000, 0x20a1, 0x0088, 0x782b, 0x0026, 0x710c, - 0x2011, 0x0040, 0x9182, 0x0040, 0x1210, 0x2110, 0x9006, 0x700e, - 0x22a8, 0x4006, 0x8203, 0x7812, 0x782b, 0x0020, 0x3300, 0x701a, - 0x782b, 0x0001, 0x015e, 0x014e, 0x013e, 0x002e, 0x001e, 0x0005, - 0x2009, 0x1a24, 0x2104, 0xc095, 0x200a, 0x080c, 0x116d, 0x0005, - 0x0016, 0x00e6, 0x2071, 0x1a24, 0x00f6, 0x2079, 0x0080, 0x792c, - 0xd1bc, 0x190c, 0x0d7e, 0x782b, 0x0002, 0xd1fc, 0x0120, 0x918c, - 0x0700, 0x7004, 0x0023, 0x00fe, 0x00ee, 0x001e, 0x0005, 0x117e, - 0x1226, 0x125a, 0x1332, 0x0d85, 0x134d, 0x0d85, 0x918c, 0x0700, - 0x1550, 0x0136, 0x0146, 0x0156, 0x7014, 0x20e8, 0x7018, 0x20a0, - 0x20e1, 0x0000, 0x2099, 0x0088, 0x782b, 0x0040, 0x7010, 0x20a8, - 0x4005, 0x3400, 0x701a, 0x015e, 0x014e, 0x013e, 0x700c, 0x9005, - 0x0578, 0x7800, 0x7802, 0x7804, 0x7806, 0x080c, 0x11c3, 0x0005, - 0x7008, 0x0096, 0x2048, 0xa86f, 0x0100, 0x009e, 0x7007, 0x0000, - 0x080c, 0x117e, 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0200, - 0x009e, 0x0ca0, 0x918c, 0x0700, 0x1150, 0x700c, 0x9005, 0x0180, - 0x7800, 0x7802, 0x7804, 0x7806, 0x080c, 0x11d8, 0x0005, 0x7008, - 0x0096, 0x2048, 0xa86f, 0x0200, 0x009e, 0x7007, 0x0000, 0x0080, - 0x0096, 0x7008, 0x2048, 0x7800, 0xa88e, 0x7804, 0xa892, 0x7808, - 0xa896, 0x780c, 0xa89a, 0xa86f, 0x0100, 0x009e, 0x7007, 0x0000, - 0x0096, 0x00d6, 0x7008, 0x2048, 0x2001, 0x18b9, 0x2004, 0x9906, - 0x1128, 0xa89c, 0x080f, 0x00de, 0x009e, 0x00a0, 0x00de, 0x009e, - 0x0096, 0x00d6, 0x7008, 0x2048, 0x0081, 0x0150, 0xa89c, 0x0086, - 0x2940, 0x080f, 0x008e, 0x00de, 0x009e, 0x080c, 0x116d, 0x0005, - 0x00de, 0x009e, 0x080c, 0x116d, 0x0005, 0xa8a8, 0xd08c, 0x0005, - 0x0096, 0xa0a0, 0x904d, 0x090c, 0x0d85, 0xa06c, 0x908e, 0x0100, - 0x0130, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4002, 0x080c, - 0x7006, 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x2848, 0x080c, 0x108b, - 0x009e, 0x0005, 0x00a6, 0xa0a0, 0x904d, 0x090c, 0x0d85, 0xa06c, - 0x908e, 0x0100, 0x0128, 0xa87b, 0x0001, 0xa883, 0x0000, 0x00c0, - 0xa80c, 0x2050, 0xb004, 0x9005, 0x0198, 0xa80e, 0x2050, 0x8006, - 0x8006, 0x8007, 0x908c, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, - 0xa076, 0xa172, 0xb000, 0xa07a, 0x2810, 0x080c, 0x114e, 0x00e8, - 0xa97c, 0xa894, 0x0016, 0x0006, 0x080c, 0x7006, 0x000e, 0x001e, - 0xd1fc, 0x1138, 0xd1f4, 0x0128, 0x00c6, 0x2060, 0x080c, 0xb16c, - 0x00ce, 0x7008, 0x2048, 0xa89f, 0x0000, 0xa8a3, 0x0000, 0x080c, - 0x108b, 0x7007, 0x0000, 0x080c, 0x116d, 0x00ae, 0x0005, 0x0126, - 0x2091, 0x8000, 0x782b, 0x1001, 0x7007, 0x0005, 0x7000, 0xc094, - 0x7002, 0x012e, 0x0005, 0x0096, 0x2001, 0x192f, 0x204c, 0xa87c, - 0x7812, 0xa88c, 0x7802, 0xa890, 0x7806, 0xa894, 0x780a, 0xa898, - 0x780e, 0x782b, 0x0020, 0x0126, 0x2091, 0x8000, 0x782b, 0x0041, - 0x7007, 0x0003, 0x7000, 0xc084, 0x7002, 0x2900, 0x700a, 0x012e, - 0x009e, 0x0005, 0x20e1, 0x0000, 0x2099, 0x0088, 0x782b, 0x0040, - 0x0096, 0x2001, 0x192f, 0x204c, 0xaa7c, 0x009e, 0x080c, 0x8f88, - 0x2009, 0x188c, 0x2104, 0x9084, 0xfffc, 0x200a, 0x080c, 0x8de7, - 0x7007, 0x0000, 0x080c, 0x117e, 0x0005, 0x7007, 0x0000, 0x080c, - 0x117e, 0x0005, 0x0126, 0x2091, 0x2200, 0x2079, 0x0300, 0x2071, - 0x1a6e, 0x7003, 0x0000, 0x78bf, 0x00f6, 0x0041, 0x7807, 0x0007, - 0x7803, 0x0000, 0x7803, 0x0001, 0x012e, 0x0005, 0x00c6, 0x7803, - 0x0000, 0x2001, 0x0165, 0x2003, 0x4198, 0x7808, 0xd09c, 0x0120, - 0x7820, 0x080c, 0x13b6, 0x0cc8, 0x2001, 0x1a6f, 0x2003, 0x0000, - 0x78ab, 0x0004, 0x78ac, 0xd0ac, 0x1de8, 0x78ab, 0x0002, 0x7807, - 0x0007, 0x7827, 0x0030, 0x782b, 0x0400, 0x7827, 0x0031, 0x782b, - 0x1a81, 0x78e3, 0xff00, 0x781f, 0xff00, 0x781b, 0xff00, 0x2001, - 0x1a70, 0x2003, 0x0000, 0x2001, 0x0200, 0x2004, 0xd0dc, 0x0110, - 0x781f, 0x0303, 0x2061, 0x1a81, 0x602f, 0x1ddc, 0x2001, 0x181a, - 0x2004, 0x9082, 0x1ddc, 0x6032, 0x603b, 0x1ec1, 0x602b, 0x1ac1, - 0x6007, 0x1aa1, 0x2061, 0x1aa1, 0x606f, 0x193d, 0x2001, 0x1928, - 0x2004, 0x607a, 0x783f, 0x348e, 0x00ce, 0x0005, 0x9086, 0x000d, - 0x11d0, 0x7808, 0xd09c, 0x01b8, 0x7820, 0x0026, 0x2010, 0x080c, - 0xcf09, 0x0180, 0x2260, 0x6000, 0x9086, 0x0004, 0x1158, 0x0016, - 0x6120, 0x9186, 0x0009, 0x0108, 0x0020, 0x2009, 0x004c, 0x080c, - 0xb20a, 0x001e, 0x002e, 0x0005, 0x0126, 0x2091, 0x2200, 0x7908, - 0x9184, 0x0070, 0x190c, 0x0d7e, 0xd19c, 0x05a0, 0x7820, 0x908c, - 0xf000, 0x0540, 0x2060, 0x6020, 0x9086, 0x0003, 0x1550, 0x6000, - 0x9086, 0x0004, 0x1530, 0x6114, 0x2148, 0xa876, 0xa87a, 0xa867, - 0x0103, 0x080c, 0x6e27, 0x00b6, 0x6010, 0x2058, 0xba3c, 0x8211, - 0x0208, 0xba3e, 0xb8d0, 0x9005, 0x190c, 0x68df, 0x00be, 0x6044, - 0xd0fc, 0x190c, 0xad25, 0x080c, 0xb195, 0x7808, 0xd09c, 0x19b0, - 0x012e, 0x0005, 0x908a, 0x0024, 0x1a0c, 0x0d85, 0x002b, 0x012e, - 0x0005, 0x04b0, 0x012e, 0x0005, 0x1438, 0x145e, 0x148e, 0x1493, - 0x1497, 0x149c, 0x14c4, 0x14c8, 0x14d6, 0x14da, 0x1438, 0x15a7, - 0x15ab, 0x161d, 0x1624, 0x1438, 0x1625, 0x1626, 0x1631, 0x1638, - 0x1438, 0x1438, 0x1438, 0x1438, 0x1438, 0x1438, 0x1438, 0x149e, - 0x1438, 0x1466, 0x148b, 0x1452, 0x1438, 0x1472, 0x143c, 0x143a, - 0x080c, 0x0d85, 0x080c, 0x0d7e, 0x080c, 0x1643, 0x2009, 0x1a7d, - 0x2104, 0x8000, 0x200a, 0x080c, 0x82b8, 0x080c, 0x1b1e, 0x0005, - 0x6044, 0xd0fc, 0x190c, 0xad25, 0x2009, 0x0055, 0x080c, 0xb20a, - 0x012e, 0x0005, 0x080c, 0x1643, 0x2060, 0x6044, 0xd0fc, 0x190c, - 0xad25, 0x2009, 0x0055, 0x080c, 0xb20a, 0x0005, 0x2009, 0x0048, - 0x080c, 0x1643, 0x2060, 0x080c, 0xb20a, 0x0005, 0x2009, 0x0054, - 0x080c, 0x1643, 0x2060, 0x6044, 0xd0fc, 0x190c, 0xad25, 0x080c, - 0xb20a, 0x0005, 0x080c, 0x1643, 0x2060, 0x0056, 0x0066, 0x080c, - 0x1643, 0x2028, 0x080c, 0x1643, 0x2030, 0x0036, 0x0046, 0x2021, - 0x0000, 0x2418, 0x2009, 0x0056, 0x080c, 0xb20a, 0x004e, 0x003e, - 0x006e, 0x005e, 0x0005, 0x080c, 0x1643, 0x0005, 0x7004, 0xc085, - 0xc0b5, 0x7006, 0x0005, 0x7004, 0xc085, 0x7006, 0x0005, 0x080c, - 0x1643, 0x080c, 0x1740, 0x0005, 0x080c, 0x0d85, 0x080c, 0x1643, - 0x2060, 0x6014, 0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009, - 0x0048, 0x080c, 0xb20a, 0x2001, 0x015d, 0x2003, 0x0000, 0x2009, - 0x03e8, 0x8109, 0x0160, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, - 0x2001, 0x0218, 0x2004, 0xd0ec, 0x1110, 0x080c, 0x1648, 0x2001, - 0x0307, 0x2003, 0x8000, 0x0005, 0x7004, 0xc095, 0x7006, 0x0005, - 0x080c, 0x1643, 0x2060, 0x6014, 0x0096, 0x2048, 0xa83b, 0xffff, - 0x009e, 0x2009, 0x0048, 0x080c, 0xb20a, 0x0005, 0x080c, 0x1643, - 0x080c, 0x0d85, 0x080c, 0x1643, 0x080c, 0x1592, 0x7827, 0x0018, - 0x79ac, 0xd1dc, 0x0904, 0x1543, 0x7827, 0x0015, 0x7828, 0x782b, - 0x0000, 0x9065, 0x0140, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, - 0x0020, 0x0804, 0x1549, 0x7004, 0x9005, 0x01c8, 0x1188, 0x78ab, - 0x0004, 0x7827, 0x0018, 0x782b, 0x0000, 0xd1bc, 0x090c, 0x0d85, - 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0804, 0x1577, - 0x78ab, 0x0004, 0x7803, 0x0001, 0x080c, 0x15ab, 0x0005, 0x7827, - 0x0018, 0xa001, 0x7828, 0x7827, 0x0011, 0xa001, 0x7928, 0x9106, - 0x0110, 0x79ac, 0x08e0, 0x00e6, 0x2071, 0x0200, 0x702c, 0xd0c4, - 0x0140, 0x00ee, 0x080c, 0x1b1e, 0x080c, 0x1366, 0x7803, 0x0001, - 0x0005, 0x7037, 0x0001, 0xa001, 0x7150, 0x00ee, 0x918c, 0xff00, - 0x9186, 0x0500, 0x0110, 0x79ac, 0x0810, 0x7004, 0xc09d, 0x7006, - 0x78ab, 0x0004, 0x7803, 0x0001, 0x080c, 0x15ab, 0x2001, 0x020d, - 0x2003, 0x0020, 0x0005, 0x7828, 0x782b, 0x0000, 0x9065, 0x090c, - 0x0d85, 0x6014, 0x2048, 0x78ab, 0x0004, 0x918c, 0x0700, 0x01a8, - 0x080c, 0x82b8, 0x080c, 0x1b1e, 0x080c, 0xcf1b, 0x0158, 0xa9ac, - 0xa936, 0xa9b0, 0xa93a, 0xa83f, 0xffff, 0xa843, 0xffff, 0xa880, - 0xc0bd, 0xa882, 0x080c, 0xcae9, 0x0005, 0x6020, 0x9086, 0x0009, - 0x1128, 0x2009, 0x004c, 0x080c, 0xb20a, 0x0048, 0x6010, 0x00b6, - 0x2058, 0xb800, 0x00be, 0xd0bc, 0x6024, 0x190c, 0xd31e, 0x2029, - 0x00c8, 0x8529, 0x0128, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, - 0x7dbc, 0x080c, 0xeeb1, 0xd5a4, 0x1118, 0x080c, 0x1648, 0x0005, - 0x080c, 0x82b8, 0x080c, 0x1b1e, 0x0005, 0x781f, 0x0300, 0x7803, - 0x0001, 0x0005, 0x0016, 0x0066, 0x0076, 0x00f6, 0x2079, 0x0300, - 0x7908, 0x918c, 0x0007, 0x9186, 0x0003, 0x0120, 0x2001, 0x0016, - 0x080c, 0x16b9, 0x00fe, 0x007e, 0x006e, 0x001e, 0x0005, 0x7004, - 0xc09d, 0x7006, 0x0005, 0x7104, 0x9184, 0x0004, 0x190c, 0x0d85, - 0xd184, 0x11b1, 0xd19c, 0x0180, 0xc19c, 0x7106, 0x0016, 0x080c, - 0x1723, 0x001e, 0x0148, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, - 0x0020, 0x080c, 0x1648, 0x0005, 0x81ff, 0x190c, 0x0d85, 0x0005, - 0x2100, 0xc184, 0xc1b4, 0x7106, 0xd0b4, 0x0016, 0x00e6, 0x1904, - 0x1612, 0x2071, 0x0200, 0x080c, 0x1710, 0x05e0, 0x080c, 0x1723, - 0x05b0, 0x6014, 0x9005, 0x05b0, 0x0096, 0x2048, 0xa864, 0x009e, - 0x9084, 0x00ff, 0x908e, 0x0029, 0x0160, 0x908e, 0x0048, 0x1550, - 0x601c, 0xd084, 0x11e0, 0x00f6, 0x2c78, 0x080c, 0x17ad, 0x00fe, - 0x00b0, 0x00f6, 0x2c78, 0x080c, 0x1942, 0x00fe, 0x2009, 0x01f4, - 0x8109, 0x0168, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001, - 0x0218, 0x2004, 0xd0ec, 0x1118, 0x080c, 0x1648, 0x0040, 0x2001, - 0x020d, 0x2003, 0x0020, 0x080c, 0x1366, 0x7803, 0x0001, 0x00ee, - 0x001e, 0x0005, 0x080c, 0x1723, 0x0dd0, 0x2001, 0x020d, 0x2003, - 0x0050, 0x2003, 0x0020, 0x0461, 0x0c90, 0x0429, 0x2060, 0x2009, - 0x0053, 0x080c, 0xb20a, 0x0005, 0x0005, 0x0005, 0x00e1, 0x2008, - 0x00d1, 0x0006, 0x7004, 0xc09d, 0x7006, 0x000e, 0x080c, 0x92d5, - 0x0005, 0x0089, 0x9005, 0x0118, 0x080c, 0x8ed9, 0x0cd0, 0x0005, - 0x2001, 0x0036, 0x2009, 0x1820, 0x210c, 0x2011, 0x181f, 0x2214, - 0x080c, 0x16b9, 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, 0x0005, - 0x080c, 0x1592, 0x00d6, 0x2069, 0x0200, 0x2009, 0x01f4, 0x8109, - 0x0510, 0x6804, 0x9005, 0x0dd8, 0x2001, 0x015d, 0x2003, 0x0000, - 0x79bc, 0xd1a4, 0x1528, 0x79b8, 0x918c, 0x0fff, 0x0180, 0x9182, - 0x0841, 0x1268, 0x9188, 0x0007, 0x918c, 0x0ff8, 0x810c, 0x810c, - 0x810c, 0x080c, 0x16ab, 0x6827, 0x0001, 0x8109, 0x1dd0, 0x04d9, - 0x6827, 0x0002, 0x04c1, 0x6804, 0x9005, 0x1130, 0x682c, 0xd0e4, - 0x1500, 0x6804, 0x9005, 0x0de8, 0x79b8, 0xd1ec, 0x1130, 0x08c0, - 0x080c, 0x82b8, 0x080c, 0x1b1e, 0x0090, 0x7827, 0x0015, 0x782b, - 0x0000, 0x7827, 0x0018, 0x782b, 0x0000, 0x2001, 0x020d, 0x2003, - 0x0020, 0x2001, 0x0307, 0x2003, 0x0300, 0x7803, 0x0001, 0x00de, - 0x0005, 0x682c, 0x9084, 0x5400, 0x9086, 0x5400, 0x0d30, 0x7827, - 0x0015, 0x782b, 0x0000, 0x7803, 0x0001, 0x6800, 0x9085, 0x1800, - 0x6802, 0x00de, 0x0005, 0x6824, 0x9084, 0x0003, 0x1de0, 0x0005, - 0x2001, 0x0030, 0x2c08, 0x621c, 0x0021, 0x7830, 0x9086, 0x0041, - 0x0005, 0x00f6, 0x00e6, 0x2079, 0x0300, 0x0006, 0x2071, 0x1a6e, - 0x7008, 0x9005, 0x1110, 0x78e3, 0x0c0c, 0x8000, 0x700a, 0x0026, - 0x2011, 0x0006, 0x7808, 0xd09c, 0x0150, 0x0016, 0x0026, 0x00c6, - 0x080c, 0x13d4, 0x00ce, 0x002e, 0x001e, 0x8211, 0x1d98, 0x002e, - 0x000e, 0x0006, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, 0x00b9, - 0x1178, 0x2071, 0x1a6e, 0x7008, 0x9005, 0x0130, 0x8001, 0x0a0c, - 0x0d85, 0x700a, 0x78e3, 0x0c00, 0x000e, 0x00ee, 0x00fe, 0x0005, - 0x000e, 0x792c, 0x3900, 0x8000, 0x2004, 0x080c, 0x0d85, 0x2009, - 0xff00, 0x8109, 0x0120, 0x7818, 0xd0bc, 0x1dd8, 0x0005, 0x9085, - 0x0001, 0x0005, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, 0x0c79, - 0x1108, 0x0005, 0x792c, 0x3900, 0x8000, 0x2004, 0x080c, 0x0d85, - 0x7037, 0x0001, 0x7150, 0x7037, 0x0002, 0x7050, 0x2060, 0xd1bc, - 0x1110, 0x7054, 0x2060, 0x918c, 0xff00, 0x9186, 0x0500, 0x0110, - 0x9085, 0x0001, 0x0005, 0x0006, 0x0046, 0x00e6, 0x2071, 0x0200, - 0x7037, 0x0002, 0x7058, 0x9084, 0xff00, 0x8007, 0x9086, 0x00bc, - 0x1158, 0x2021, 0x1a7e, 0x2404, 0x8000, 0x0208, 0x2022, 0x080c, - 0x82b8, 0x080c, 0x1b1e, 0x9006, 0x00ee, 0x004e, 0x000e, 0x0005, - 0x0c11, 0x1108, 0x0005, 0x00e6, 0x0016, 0x2071, 0x0200, 0x0841, - 0x6124, 0xd1dc, 0x01f8, 0x701c, 0xd08c, 0x0904, 0x17a2, 0x7017, - 0x0000, 0x2001, 0x0264, 0x2004, 0xd0bc, 0x0904, 0x17a2, 0x2001, - 0x0268, 0x00c6, 0x2064, 0x6104, 0x6038, 0x00ce, 0x918e, 0x0039, - 0x1904, 0x17a2, 0x9c06, 0x15f0, 0x0126, 0x2091, 0x2600, 0x080c, - 0x8210, 0x012e, 0x7358, 0x745c, 0x6014, 0x905d, 0x0598, 0x2b48, - 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x190c, 0xd2f9, - 0xab42, 0xac3e, 0x2001, 0x1869, 0x2004, 0xd0b4, 0x1170, 0x601c, - 0xd0e4, 0x1158, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, - 0x1120, 0xa83b, 0x7fff, 0xa837, 0xffff, 0x080c, 0x1ee1, 0x1190, - 0x080c, 0x199f, 0x2a00, 0xa816, 0x0130, 0x2800, 0xa80e, 0x2c05, - 0xa80a, 0x2c00, 0xa812, 0x7037, 0x0020, 0x781f, 0x0300, 0x001e, - 0x00ee, 0x0005, 0x7037, 0x0050, 0x7037, 0x0020, 0x001e, 0x00ee, - 0x080c, 0x1648, 0x0005, 0x080c, 0x0d85, 0x2001, 0x180d, 0x2004, - 0xd08c, 0x190c, 0x6ccc, 0x2cf0, 0x0126, 0x2091, 0x2200, 0x0016, - 0x00c6, 0x3e60, 0x6014, 0x2048, 0x2940, 0x903e, 0x2730, 0xa864, - 0x2068, 0xa81a, 0x9d84, 0x000f, 0x9088, 0x1ec1, 0x2165, 0x0002, - 0x17df, 0x184d, 0x17df, 0x17df, 0x17e3, 0x182e, 0x17df, 0x1803, - 0x17d8, 0x1844, 0x17df, 0x17df, 0x17e8, 0x193a, 0x1817, 0x180d, - 0xa964, 0x918c, 0x00ff, 0x918e, 0x0048, 0x0904, 0x1844, 0x9085, - 0x0001, 0x0804, 0x1930, 0xa87c, 0xd0ac, 0x0dc8, 0x0804, 0x1854, - 0xa87c, 0xd0ac, 0x0da0, 0x0804, 0x18bf, 0xa898, 0x901d, 0x1108, - 0xab9c, 0x9016, 0xaab2, 0xaa3e, 0xaa42, 0x3e00, 0x9080, 0x0008, - 0x2004, 0x9080, 0x9536, 0x2005, 0x9005, 0x090c, 0x0d85, 0x2004, - 0xa8ae, 0x0804, 0x1918, 0xa87c, 0xd0bc, 0x09c8, 0xa890, 0xa842, - 0xa88c, 0xa83e, 0xa888, 0x0804, 0x1854, 0xa87c, 0xd0bc, 0x0978, - 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888, 0x0804, 0x18bf, 0xa87c, - 0xd0bc, 0x0928, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa804, 0x9045, - 0x090c, 0x0d85, 0xa164, 0xa91a, 0x91ec, 0x000f, 0x9d80, 0x1ec1, - 0x2065, 0xa888, 0xd19c, 0x1904, 0x18bf, 0x0430, 0xa87c, 0xd0ac, - 0x0904, 0x17df, 0xa804, 0x9045, 0x090c, 0x0d85, 0xa164, 0xa91a, - 0x91ec, 0x000f, 0x9d80, 0x1ec1, 0x2065, 0x9006, 0xa842, 0xa83e, - 0xd19c, 0x1904, 0x18bf, 0x0080, 0xa87c, 0xd0ac, 0x0904, 0x17df, - 0x9006, 0xa842, 0xa83e, 0x0804, 0x18bf, 0xa87c, 0xd0ac, 0x0904, - 0x17df, 0x9006, 0xa842, 0xa83e, 0x2c05, 0x908a, 0x0036, 0x1a0c, - 0x0d85, 0x9082, 0x001b, 0x0002, 0x1877, 0x1877, 0x1879, 0x1877, - 0x1877, 0x1877, 0x1883, 0x1877, 0x1877, 0x1877, 0x188d, 0x1877, - 0x1877, 0x1877, 0x1897, 0x1877, 0x1877, 0x1877, 0x18a1, 0x1877, - 0x1877, 0x1877, 0x18ab, 0x1877, 0x1877, 0x1877, 0x18b5, 0x080c, - 0x0d85, 0xa574, 0xa478, 0x9d86, 0x0024, 0x0904, 0x17ed, 0xa37c, - 0xa280, 0x0804, 0x1918, 0xa584, 0xa488, 0x9d86, 0x0024, 0x0904, - 0x17ed, 0xa38c, 0xa290, 0x0804, 0x1918, 0xa594, 0xa498, 0x9d86, - 0x0024, 0x0904, 0x17ed, 0xa39c, 0xa2a0, 0x0804, 0x1918, 0xa5a4, - 0xa4a8, 0x9d86, 0x0024, 0x0904, 0x17ed, 0xa3ac, 0xa2b0, 0x0804, - 0x1918, 0xa5b4, 0xa4b8, 0x9d86, 0x0024, 0x0904, 0x17ed, 0xa3bc, - 0xa2c0, 0x0804, 0x1918, 0xa5c4, 0xa4c8, 0x9d86, 0x0024, 0x0904, - 0x17ed, 0xa3cc, 0xa2d0, 0x0804, 0x1918, 0xa5d4, 0xa4d8, 0x9d86, - 0x0024, 0x0904, 0x17ed, 0xa3dc, 0xa2e0, 0x0804, 0x1918, 0x2c05, - 0x908a, 0x0034, 0x1a0c, 0x0d85, 0x9082, 0x001b, 0x0002, 0x18e2, - 0x18e0, 0x18e0, 0x18e0, 0x18e0, 0x18e0, 0x18ed, 0x18e0, 0x18e0, - 0x18e0, 0x18e0, 0x18e0, 0x18f8, 0x18e0, 0x18e0, 0x18e0, 0x18e0, - 0x18e0, 0x1903, 0x18e0, 0x18e0, 0x18e0, 0x18e0, 0x18e0, 0x190e, - 0x080c, 0x0d85, 0xa56c, 0xa470, 0xa774, 0xa678, 0x9d86, 0x002c, - 0x0904, 0x17ed, 0xa37c, 0xa280, 0x0458, 0xa584, 0xa488, 0xa78c, - 0xa690, 0x9d86, 0x002c, 0x0904, 0x17ed, 0xa394, 0xa298, 0x0400, - 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0x9d86, 0x002c, 0x0904, 0x17ed, - 0xa3ac, 0xa2b0, 0x00a8, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0x9d86, - 0x002c, 0x0904, 0x17ed, 0xa3c4, 0xa2c8, 0x0050, 0xa5cc, 0xa4d0, - 0xa7d4, 0xa6d8, 0x9d86, 0x002c, 0x0904, 0x17ed, 0xa3dc, 0xa2e0, - 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa988, 0x8c60, - 0x2c1d, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0x8109, 0xa916, 0x1160, - 0x3e60, 0x601c, 0xc085, 0x601e, 0xa87c, 0xc0dd, 0xa87e, 0x9006, - 0x00ce, 0x001e, 0x012e, 0x0005, 0x2800, 0xa80e, 0xab0a, 0x2c00, - 0xa812, 0x0c70, 0x0804, 0x17df, 0x2001, 0x180d, 0x2004, 0xd08c, - 0x190c, 0x6ccc, 0x2ff0, 0x0126, 0x2091, 0x2200, 0x0016, 0x00c6, - 0x3e60, 0x6014, 0x2048, 0x2940, 0xa80e, 0x2061, 0x1ebc, 0xa813, - 0x1ebc, 0x2c05, 0xa80a, 0xa964, 0xa91a, 0xa87c, 0xd0ac, 0x090c, - 0x0d85, 0x9006, 0xa842, 0xa83e, 0x2c05, 0x908a, 0x0034, 0x1a0c, - 0x0d85, 0xadcc, 0xacd0, 0xafd4, 0xaed8, 0xabdc, 0xaae0, 0xab2e, - 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa8ac, 0xaab0, 0xa836, - 0xaa3a, 0xa988, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0008, 0x1120, - 0x8109, 0xa916, 0x0128, 0x0080, 0x918a, 0x0002, 0xa916, 0x1160, - 0x3e60, 0x601c, 0xc085, 0x601e, 0xa87c, 0xc0dd, 0xa87e, 0x9006, - 0x00ce, 0x001e, 0x012e, 0x0005, 0xa804, 0x9045, 0x090c, 0x0d85, - 0xa80e, 0xa064, 0xa81a, 0x9084, 0x000f, 0x9080, 0x1ec1, 0x2015, - 0x82ff, 0x090c, 0x0d85, 0xaa12, 0x2205, 0xa80a, 0x0c08, 0x903e, - 0x2730, 0xa880, 0xd0fc, 0x1190, 0x2d00, 0x0002, 0x1a94, 0x19f6, - 0x19f6, 0x1a94, 0x1a94, 0x1a8e, 0x1a94, 0x19f6, 0x1a45, 0x1a45, - 0x1a45, 0x1a94, 0x1a94, 0x1a94, 0x1a8b, 0x1a45, 0xc0fc, 0xa882, - 0xab2c, 0xaa30, 0xad1c, 0xac20, 0xdd9c, 0x0904, 0x1a96, 0x2c05, - 0x908a, 0x0034, 0x1a0c, 0x0d85, 0x9082, 0x001b, 0x0002, 0x19e2, - 0x19e0, 0x19e0, 0x19e0, 0x19e0, 0x19e0, 0x19e6, 0x19e0, 0x19e0, - 0x19e0, 0x19e0, 0x19e0, 0x19ea, 0x19e0, 0x19e0, 0x19e0, 0x19e0, - 0x19e0, 0x19ee, 0x19e0, 0x19e0, 0x19e0, 0x19e0, 0x19e0, 0x19f2, - 0x080c, 0x0d85, 0xa774, 0xa678, 0x0804, 0x1a96, 0xa78c, 0xa690, - 0x0804, 0x1a96, 0xa7a4, 0xa6a8, 0x0804, 0x1a96, 0xa7bc, 0xa6c0, - 0x0804, 0x1a96, 0xa7d4, 0xa6d8, 0x0804, 0x1a96, 0x2c05, 0x908a, - 0x0036, 0x1a0c, 0x0d85, 0x9082, 0x001b, 0x0002, 0x1a19, 0x1a19, - 0x1a1b, 0x1a19, 0x1a19, 0x1a19, 0x1a21, 0x1a19, 0x1a19, 0x1a19, - 0x1a27, 0x1a19, 0x1a19, 0x1a19, 0x1a2d, 0x1a19, 0x1a19, 0x1a19, - 0x1a33, 0x1a19, 0x1a19, 0x1a19, 0x1a39, 0x1a19, 0x1a19, 0x1a19, - 0x1a3f, 0x080c, 0x0d85, 0xa574, 0xa478, 0xa37c, 0xa280, 0x0804, - 0x1a96, 0xa584, 0xa488, 0xa38c, 0xa290, 0x0804, 0x1a96, 0xa594, - 0xa498, 0xa39c, 0xa2a0, 0x0804, 0x1a96, 0xa5a4, 0xa4a8, 0xa3ac, - 0xa2b0, 0x0804, 0x1a96, 0xa5b4, 0xa4b8, 0xa3bc, 0xa2c0, 0x0804, - 0x1a96, 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, 0x0804, 0x1a96, 0xa5d4, - 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, 0x1a96, 0x2c05, 0x908a, 0x0034, - 0x1a0c, 0x0d85, 0x9082, 0x001b, 0x0002, 0x1a68, 0x1a66, 0x1a66, - 0x1a66, 0x1a66, 0x1a66, 0x1a6f, 0x1a66, 0x1a66, 0x1a66, 0x1a66, - 0x1a66, 0x1a76, 0x1a66, 0x1a66, 0x1a66, 0x1a66, 0x1a66, 0x1a7d, - 0x1a66, 0x1a66, 0x1a66, 0x1a66, 0x1a66, 0x1a84, 0x080c, 0x0d85, - 0xa56c, 0xa470, 0xa774, 0xa678, 0xa37c, 0xa280, 0x0438, 0xa584, - 0xa488, 0xa78c, 0xa690, 0xa394, 0xa298, 0x0400, 0xa59c, 0xa4a0, - 0xa7a4, 0xa6a8, 0xa3ac, 0xa2b0, 0x00c8, 0xa5b4, 0xa4b8, 0xa7bc, - 0xa6c0, 0xa3c4, 0xa2c8, 0x0090, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, - 0xa3dc, 0xa2e0, 0x0058, 0x9d86, 0x000e, 0x1130, 0x080c, 0x1e97, - 0x1904, 0x199f, 0x900e, 0x0050, 0x080c, 0x0d85, 0xab2e, 0xaa32, - 0xad1e, 0xac22, 0xaf26, 0xae2a, 0x080c, 0x1e97, 0x0005, 0x6014, - 0x2048, 0x6118, 0x81ff, 0x0148, 0x810c, 0x810c, 0x810c, 0x81ff, - 0x1118, 0xa887, 0x0001, 0x0008, 0xa986, 0x601b, 0x0002, 0xa874, - 0x9084, 0x00ff, 0x9084, 0x0008, 0x0150, 0x00e9, 0x6000, 0x9086, - 0x0004, 0x1120, 0x2009, 0x0048, 0x080c, 0xb20a, 0x0005, 0xa974, - 0xd1dc, 0x1108, 0x0005, 0xa934, 0xa88c, 0x9106, 0x1158, 0xa938, - 0xa890, 0x9106, 0x1138, 0x601c, 0xc084, 0x601e, 0x2009, 0x0048, - 0x0804, 0xb20a, 0x0005, 0x0126, 0x00c6, 0x2091, 0x2200, 0x00ce, - 0x7908, 0x918c, 0x0007, 0x9186, 0x0000, 0x05b0, 0x9186, 0x0003, - 0x0598, 0x6020, 0x6023, 0x0000, 0x0006, 0x2031, 0x0008, 0x00c6, - 0x781f, 0x0808, 0x7808, 0xd09c, 0x0120, 0x080c, 0x13d4, 0x8631, - 0x1db8, 0x00ce, 0x781f, 0x0800, 0x2031, 0x0168, 0x00c6, 0x7808, - 0xd09c, 0x190c, 0x13d4, 0x00ce, 0x2001, 0x0038, 0x080c, 0x1bae, - 0x7930, 0x9186, 0x0040, 0x0160, 0x9186, 0x0042, 0x190c, 0x0d85, - 0x2001, 0x001e, 0x8001, 0x1df0, 0x8631, 0x1d40, 0x080c, 0x1bbd, - 0x000e, 0x6022, 0x012e, 0x0005, 0x080c, 0x1baa, 0x7827, 0x0015, - 0x7828, 0x9c06, 0x1db8, 0x782b, 0x0000, 0x0ca0, 0x00f6, 0x2079, - 0x0300, 0x7803, 0x0000, 0x78ab, 0x0004, 0x2001, 0xf000, 0x8001, - 0x090c, 0x0d85, 0x7aac, 0xd2ac, 0x1dd0, 0x00fe, 0x080c, 0x779e, - 0x1188, 0x2001, 0x0138, 0x2003, 0x0000, 0x2001, 0x0160, 0x2003, - 0x0000, 0x2011, 0x012c, 0xa001, 0xa001, 0x8211, 0x1de0, 0x0059, - 0x0804, 0x7840, 0x0479, 0x0039, 0x2001, 0x0160, 0x2502, 0x2001, - 0x0138, 0x2202, 0x0005, 0x00e6, 0x2071, 0x0200, 0x080c, 0x2a8b, - 0x2009, 0x003c, 0x080c, 0x2220, 0x2001, 0x015d, 0x2003, 0x0000, - 0x7000, 0x9084, 0x003c, 0x1de0, 0x080c, 0x8899, 0x70a0, 0x70a2, - 0x7098, 0x709a, 0x709c, 0x709e, 0x2001, 0x020d, 0x2003, 0x0020, - 0x00f6, 0x2079, 0x0300, 0x080c, 0x1366, 0x7803, 0x0001, 0x00fe, - 0x00ee, 0x0005, 0x2001, 0x0138, 0x2014, 0x2003, 0x0000, 0x2001, - 0x0160, 0x202c, 0x2003, 0x0000, 0x080c, 0x779e, 0x1108, 0x0005, - 0x2021, 0x0260, 0x2001, 0x0141, 0x201c, 0xd3dc, 0x1168, 0x2001, - 0x0109, 0x201c, 0x939c, 0x0048, 0x1160, 0x2001, 0x0111, 0x201c, - 0x83ff, 0x1110, 0x8421, 0x1d70, 0x2001, 0x015d, 0x2003, 0x0000, - 0x0005, 0x0046, 0x2021, 0x0019, 0x2003, 0x0048, 0xa001, 0xa001, - 0x201c, 0x939c, 0x0048, 0x0120, 0x8421, 0x1db0, 0x004e, 0x0c60, - 0x004e, 0x0c40, 0x601c, 0xc084, 0x601e, 0x0005, 0x2c08, 0x621c, - 0x080c, 0x16b9, 0x7930, 0x0005, 0x2c08, 0x621c, 0x080c, 0x1702, - 0x7930, 0x0005, 0x8001, 0x1df0, 0x0005, 0x2031, 0x0064, 0x781c, - 0x9084, 0x0007, 0x0170, 0x2001, 0x0038, 0x0c41, 0x9186, 0x0040, - 0x0904, 0x1c1b, 0x2001, 0x001e, 0x0c69, 0x8631, 0x1d80, 0x080c, - 0x0d85, 0x781f, 0x0202, 0x2001, 0x015d, 0x2003, 0x0000, 0x2001, - 0x0dac, 0x0c01, 0x781c, 0xd084, 0x0110, 0x0861, 0x04e0, 0x2001, - 0x0030, 0x0891, 0x9186, 0x0040, 0x0568, 0x781c, 0xd084, 0x1da8, - 0x781f, 0x0101, 0x2001, 0x0014, 0x0869, 0x2001, 0x0037, 0x0821, - 0x9186, 0x0040, 0x0140, 0x2001, 0x0030, 0x080c, 0x1bb4, 0x9186, - 0x0040, 0x190c, 0x0d85, 0x00d6, 0x2069, 0x0200, 0x692c, 0xd1f4, - 0x1170, 0xd1c4, 0x0160, 0xd19c, 0x0130, 0x6800, 0x9085, 0x1800, - 0x6802, 0x00de, 0x0080, 0x6908, 0x9184, 0x0007, 0x1db0, 0x00de, - 0x781f, 0x0100, 0x791c, 0x9184, 0x0007, 0x090c, 0x0d85, 0xa001, - 0xa001, 0x781f, 0x0200, 0x0005, 0x0126, 0x2091, 0x2400, 0x2079, - 0x0380, 0x2001, 0x19e8, 0x2070, 0x012e, 0x0005, 0x2cf0, 0x0126, - 0x2091, 0x2400, 0x3e60, 0x6014, 0x2048, 0xa964, 0xa91a, 0x918c, - 0x00ff, 0x9184, 0x000f, 0x0002, 0x1c50, 0x1c50, 0x1c50, 0x1c52, - 0x1c50, 0x1c50, 0x1c50, 0x1c50, 0x1c44, 0x1c5a, 0x1c50, 0x1c56, - 0x1c50, 0x1c50, 0x1c50, 0x1c50, 0x9086, 0x0008, 0x1148, 0xa87c, - 0xd0b4, 0x0904, 0x1dca, 0x2011, 0x1ebc, 0x2205, 0xab88, 0x00a8, - 0x080c, 0x0d85, 0x9186, 0x0013, 0x0128, 0x0cd0, 0x9186, 0x001b, - 0x0108, 0x0cb0, 0xa87c, 0xd0b4, 0x0904, 0x1dca, 0x9184, 0x000f, - 0x9080, 0x1ec1, 0x2015, 0x2205, 0xab88, 0x2908, 0xa80a, 0xa90e, - 0xaa12, 0xab16, 0x9006, 0xa842, 0xa83e, 0x012e, 0x0005, 0x2cf0, - 0x0126, 0x2091, 0x2400, 0x3e60, 0x6014, 0x2048, 0xa88c, 0xa990, - 0xaaac, 0xabb0, 0xaa36, 0xab3a, 0xa83e, 0xa942, 0xa846, 0xa94a, - 0xa964, 0x918c, 0x00ff, 0x9186, 0x001e, 0x0198, 0x2940, 0xa064, - 0xa81a, 0x90ec, 0x000f, 0x9d80, 0x1ec1, 0x2065, 0x2c05, 0x2808, - 0x2c10, 0xab88, 0xa80a, 0xa90e, 0xaa12, 0xab16, 0x012e, 0x3e60, - 0x0005, 0xa804, 0x2040, 0x0c58, 0x2cf0, 0x0126, 0x2091, 0x2400, - 0x3e60, 0x6014, 0x2048, 0xa97c, 0x2950, 0xd1dc, 0x1904, 0x1d94, - 0xc1dd, 0xa97e, 0x9006, 0xa842, 0xa83e, 0xa988, 0x8109, 0xa916, - 0xa964, 0xa91a, 0x9184, 0x000f, 0x9088, 0x1ec1, 0x2145, 0x0002, - 0x1cc8, 0x1cd6, 0x1cc8, 0x1cc8, 0x1cc8, 0x1cca, 0x1cc8, 0x1cc8, - 0x1d2b, 0x1d2b, 0x1cc8, 0x1cc8, 0x1cc8, 0x1d29, 0x1cc8, 0x1cc8, - 0x080c, 0x0d85, 0xa804, 0x2050, 0xb164, 0xa91a, 0x9184, 0x000f, - 0x9080, 0x1ec1, 0x2045, 0xd19c, 0x1904, 0x1d2b, 0x9036, 0x2638, - 0x2805, 0x908a, 0x0036, 0x1a0c, 0x0d85, 0x9082, 0x001b, 0x0002, - 0x1cfb, 0x1cfb, 0x1cfd, 0x1cfb, 0x1cfb, 0x1cfb, 0x1d03, 0x1cfb, - 0x1cfb, 0x1cfb, 0x1d09, 0x1cfb, 0x1cfb, 0x1cfb, 0x1d0f, 0x1cfb, - 0x1cfb, 0x1cfb, 0x1d15, 0x1cfb, 0x1cfb, 0x1cfb, 0x1d1b, 0x1cfb, - 0x1cfb, 0x1cfb, 0x1d21, 0x080c, 0x0d85, 0xb574, 0xb478, 0xb37c, - 0xb280, 0x0804, 0x1d70, 0xb584, 0xb488, 0xb38c, 0xb290, 0x0804, - 0x1d70, 0xb594, 0xb498, 0xb39c, 0xb2a0, 0x0804, 0x1d70, 0xb5a4, - 0xb4a8, 0xb3ac, 0xb2b0, 0x0804, 0x1d70, 0xb5b4, 0xb4b8, 0xb3bc, - 0xb2c0, 0x0804, 0x1d70, 0xb5c4, 0xb4c8, 0xb3cc, 0xb2d0, 0x0804, - 0x1d70, 0xb5d4, 0xb4d8, 0xb3dc, 0xb2e0, 0x0804, 0x1d70, 0x0804, - 0x1d70, 0x080c, 0x0d85, 0x2805, 0x908a, 0x0034, 0x1a0c, 0x0d85, - 0x9082, 0x001b, 0x0002, 0x1d4e, 0x1d4c, 0x1d4c, 0x1d4c, 0x1d4c, - 0x1d4c, 0x1d55, 0x1d4c, 0x1d4c, 0x1d4c, 0x1d4c, 0x1d4c, 0x1d5c, - 0x1d4c, 0x1d4c, 0x1d4c, 0x1d4c, 0x1d4c, 0x1d63, 0x1d4c, 0x1d4c, - 0x1d4c, 0x1d4c, 0x1d4c, 0x1d6a, 0x080c, 0x0d85, 0xb56c, 0xb470, - 0xb774, 0xb678, 0xb37c, 0xb280, 0x00d8, 0xb584, 0xb488, 0xb78c, - 0xb690, 0xb394, 0xb298, 0x00a0, 0xb59c, 0xb4a0, 0xb7a4, 0xb6a8, - 0xb3ac, 0xb2b0, 0x0068, 0xb5b4, 0xb4b8, 0xb7bc, 0xb6c0, 0xb3c4, - 0xb2c8, 0x0030, 0xb5cc, 0xb4d0, 0xb7d4, 0xb6d8, 0xb3dc, 0xb2e0, - 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa988, 0x8109, - 0xa916, 0x1118, 0x9006, 0x012e, 0x0005, 0x8840, 0x2805, 0x9005, - 0x1168, 0xb004, 0x9005, 0x090c, 0x0d85, 0x2050, 0xb164, 0xa91a, - 0x9184, 0x000f, 0x9080, 0x1ec1, 0x2045, 0x2805, 0x2810, 0x2a08, - 0xa80a, 0xa90e, 0xaa12, 0x0c30, 0x3e60, 0x6344, 0xd3fc, 0x190c, - 0x0d85, 0xa93c, 0xaa40, 0xa844, 0x9106, 0x1118, 0xa848, 0x9206, - 0x0508, 0x2958, 0xab48, 0xac44, 0x2940, 0x080c, 0x1ee1, 0x1998, - 0x2850, 0x2c40, 0xab14, 0xa880, 0xd0fc, 0x1140, 0xa810, 0x2005, - 0xa80a, 0x2a00, 0xa80e, 0x2009, 0x8015, 0x0070, 0x00c6, 0x3e60, - 0x6044, 0xc0a4, 0x9085, 0x8005, 0x6046, 0x00ce, 0x8319, 0xab16, - 0x1904, 0x1d7d, 0x2009, 0x8005, 0x3e60, 0x6044, 0x9105, 0x6046, - 0x0804, 0x1d7a, 0x080c, 0x0d85, 0x00f6, 0x00e6, 0x0096, 0x00c6, - 0x0026, 0x704c, 0x9c06, 0x190c, 0x0d85, 0x2079, 0x0090, 0x2001, - 0x0105, 0x2003, 0x0010, 0x782b, 0x0004, 0x7057, 0x0000, 0x6014, - 0x2048, 0x080c, 0xcf1b, 0x0118, 0xa880, 0xc0bd, 0xa882, 0x6020, - 0x9086, 0x0006, 0x1170, 0x2061, 0x0100, 0x62c8, 0x2001, 0x00fa, - 0x8001, 0x1df0, 0x60c8, 0x9206, 0x1dc0, 0x60c4, 0xa89a, 0x60c8, - 0xa896, 0x704c, 0x2060, 0x00c6, 0x080c, 0xcae9, 0x080c, 0xacfc, - 0x00ce, 0x704c, 0x9c06, 0x1150, 0x2009, 0x0040, 0x080c, 0x2220, - 0x080c, 0xa7a1, 0x2011, 0x0000, 0x080c, 0xa635, 0x002e, 0x00ce, - 0x009e, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0090, 0x781c, - 0x0006, 0x7818, 0x0006, 0x2079, 0x0100, 0x7a14, 0x9284, 0x1984, - 0x9085, 0x0012, 0x7816, 0x2019, 0x1000, 0x8319, 0x090c, 0x0d85, - 0x7820, 0xd0bc, 0x1dd0, 0x79c8, 0x000e, 0x9102, 0x001e, 0x0006, - 0x0016, 0x79c4, 0x000e, 0x9103, 0x78c6, 0x000e, 0x78ca, 0x9284, - 0x1984, 0x9085, 0x0012, 0x7816, 0x2079, 0x0090, 0x782b, 0x0008, - 0x7057, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x19e8, - 0x7054, 0x9086, 0x0000, 0x0904, 0x1e92, 0x2079, 0x0090, 0x2009, - 0x0207, 0x210c, 0xd194, 0x01b8, 0x2009, 0x020c, 0x210c, 0x9184, - 0x0003, 0x0188, 0x080c, 0xeefa, 0x2001, 0x0133, 0x2004, 0x9005, - 0x090c, 0x0d85, 0x0016, 0x2009, 0x0040, 0x080c, 0x2220, 0x001e, - 0x2001, 0x020c, 0x2102, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, - 0x210c, 0x9106, 0x1120, 0x2009, 0x0040, 0x080c, 0x2220, 0x782c, - 0xd0fc, 0x09a8, 0x080c, 0xad18, 0x782c, 0xd0fc, 0x1de8, 0x080c, - 0xacfc, 0x7054, 0x9086, 0x0000, 0x1950, 0x782b, 0x0004, 0x782c, - 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, 0x2220, 0x782b, 0x0002, - 0x7057, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x080c, 0x0d85, 0x8c60, - 0x2c05, 0x9005, 0x0110, 0x8a51, 0x0005, 0xa004, 0x9005, 0x0168, - 0xa85a, 0x2040, 0xa064, 0x9084, 0x000f, 0x9080, 0x1ec1, 0x2065, - 0x8cff, 0x090c, 0x0d85, 0x8a51, 0x0005, 0x2050, 0x0005, 0x0000, - 0x001d, 0x0021, 0x0025, 0x0029, 0x002d, 0x0031, 0x0035, 0x0000, - 0x001b, 0x0021, 0x0027, 0x002d, 0x0033, 0x0000, 0x0000, 0x0023, - 0x0000, 0x0000, 0x1eb4, 0x1eb0, 0x1eb4, 0x1eb4, 0x1ebe, 0x0000, - 0x1eb4, 0x1ebb, 0x1ebb, 0x1eb8, 0x1ebb, 0x1ebb, 0x0000, 0x1ebe, - 0x1ebb, 0x0000, 0x1eb6, 0x1eb6, 0x0000, 0x1eb6, 0x1ebe, 0x0000, - 0x1eb6, 0x1ebc, 0x1ebc, 0x1ebc, 0x0000, 0x1ebc, 0x0000, 0x1ebe, - 0x1ebc, 0x00c6, 0x00d6, 0x0086, 0xab42, 0xac3e, 0xa888, 0x9055, - 0x0904, 0x20c0, 0x2940, 0xa064, 0x90ec, 0x000f, 0x9084, 0x00ff, - 0x9086, 0x0008, 0x1118, 0x2061, 0x1ebc, 0x00d0, 0x9de0, 0x1ec1, - 0x9d86, 0x0007, 0x0130, 0x9d86, 0x000e, 0x0118, 0x9d86, 0x000f, - 0x1120, 0xa08c, 0x9422, 0xa090, 0x931b, 0x2c05, 0x9065, 0x1140, - 0x0310, 0x0804, 0x20c0, 0xa004, 0x9045, 0x0904, 0x20c0, 0x08d8, - 0x2c05, 0x9005, 0x0904, 0x1fa8, 0xdd9c, 0x1904, 0x1f64, 0x908a, - 0x0036, 0x1a0c, 0x0d85, 0x9082, 0x001b, 0x0002, 0x1f39, 0x1f39, - 0x1f3b, 0x1f39, 0x1f39, 0x1f39, 0x1f41, 0x1f39, 0x1f39, 0x1f39, - 0x1f47, 0x1f39, 0x1f39, 0x1f39, 0x1f4d, 0x1f39, 0x1f39, 0x1f39, - 0x1f53, 0x1f39, 0x1f39, 0x1f39, 0x1f59, 0x1f39, 0x1f39, 0x1f39, - 0x1f5f, 0x080c, 0x0d85, 0xa07c, 0x9422, 0xa080, 0x931b, 0x0804, - 0x1f9e, 0xa08c, 0x9422, 0xa090, 0x931b, 0x0804, 0x1f9e, 0xa09c, - 0x9422, 0xa0a0, 0x931b, 0x0804, 0x1f9e, 0xa0ac, 0x9422, 0xa0b0, - 0x931b, 0x0804, 0x1f9e, 0xa0bc, 0x9422, 0xa0c0, 0x931b, 0x0804, - 0x1f9e, 0xa0cc, 0x9422, 0xa0d0, 0x931b, 0x0804, 0x1f9e, 0xa0dc, - 0x9422, 0xa0e0, 0x931b, 0x04d0, 0x908a, 0x0034, 0x1a0c, 0x0d85, - 0x9082, 0x001b, 0x0002, 0x1f86, 0x1f84, 0x1f84, 0x1f84, 0x1f84, - 0x1f84, 0x1f8b, 0x1f84, 0x1f84, 0x1f84, 0x1f84, 0x1f84, 0x1f90, - 0x1f84, 0x1f84, 0x1f84, 0x1f84, 0x1f84, 0x1f95, 0x1f84, 0x1f84, - 0x1f84, 0x1f84, 0x1f84, 0x1f9a, 0x080c, 0x0d85, 0xa07c, 0x9422, - 0xa080, 0x931b, 0x0098, 0xa094, 0x9422, 0xa098, 0x931b, 0x0070, - 0xa0ac, 0x9422, 0xa0b0, 0x931b, 0x0048, 0xa0c4, 0x9422, 0xa0c8, - 0x931b, 0x0020, 0xa0dc, 0x9422, 0xa0e0, 0x931b, 0x0630, 0x2300, - 0x9405, 0x0160, 0x8a51, 0x0904, 0x20c0, 0x8c60, 0x0804, 0x1f10, - 0xa004, 0x9045, 0x0904, 0x20c0, 0x0804, 0x1eeb, 0x8a51, 0x0904, - 0x20c0, 0x8c60, 0x2c05, 0x9005, 0x1158, 0xa004, 0x9045, 0x0904, - 0x20c0, 0xa064, 0x90ec, 0x000f, 0x9de0, 0x1ec1, 0x2c05, 0x2060, - 0xa880, 0xc0fc, 0xa882, 0x0804, 0x20b5, 0x2c05, 0x8422, 0x8420, - 0x831a, 0x9399, 0x0000, 0xac2e, 0xab32, 0xdd9c, 0x1904, 0x2052, - 0x9082, 0x001b, 0x0002, 0x1fee, 0x1fee, 0x1ff0, 0x1fee, 0x1fee, - 0x1fee, 0x1ffe, 0x1fee, 0x1fee, 0x1fee, 0x200c, 0x1fee, 0x1fee, - 0x1fee, 0x201a, 0x1fee, 0x1fee, 0x1fee, 0x2028, 0x1fee, 0x1fee, - 0x1fee, 0x2036, 0x1fee, 0x1fee, 0x1fee, 0x2044, 0x080c, 0x0d85, - 0xa17c, 0x2400, 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0d85, - 0xa074, 0x9420, 0xa078, 0x9319, 0x0804, 0x20b0, 0xa18c, 0x2400, - 0x9122, 0xa190, 0x2300, 0x911b, 0x0a0c, 0x0d85, 0xa084, 0x9420, - 0xa088, 0x9319, 0x0804, 0x20b0, 0xa19c, 0x2400, 0x9122, 0xa1a0, - 0x2300, 0x911b, 0x0a0c, 0x0d85, 0xa094, 0x9420, 0xa098, 0x9319, - 0x0804, 0x20b0, 0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b, - 0x0a0c, 0x0d85, 0xa0a4, 0x9420, 0xa0a8, 0x9319, 0x0804, 0x20b0, - 0xa1bc, 0x2400, 0x9122, 0xa1c0, 0x2300, 0x911b, 0x0a0c, 0x0d85, - 0xa0b4, 0x9420, 0xa0b8, 0x9319, 0x0804, 0x20b0, 0xa1cc, 0x2400, - 0x9122, 0xa1d0, 0x2300, 0x911b, 0x0a0c, 0x0d85, 0xa0c4, 0x9420, - 0xa0c8, 0x9319, 0x0804, 0x20b0, 0xa1dc, 0x2400, 0x9122, 0xa1e0, - 0x2300, 0x911b, 0x0a0c, 0x0d85, 0xa0d4, 0x9420, 0xa0d8, 0x9319, - 0x0804, 0x20b0, 0x9082, 0x001b, 0x0002, 0x2070, 0x206e, 0x206e, - 0x206e, 0x206e, 0x206e, 0x207d, 0x206e, 0x206e, 0x206e, 0x206e, - 0x206e, 0x208a, 0x206e, 0x206e, 0x206e, 0x206e, 0x206e, 0x2097, - 0x206e, 0x206e, 0x206e, 0x206e, 0x206e, 0x20a4, 0x080c, 0x0d85, - 0xa17c, 0x2400, 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0d85, - 0xa06c, 0x9420, 0xa070, 0x9319, 0x0498, 0xa194, 0x2400, 0x9122, - 0xa198, 0x2300, 0x911b, 0x0a0c, 0x0d85, 0xa084, 0x9420, 0xa088, - 0x9319, 0x0430, 0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b, - 0x0a0c, 0x0d85, 0xa09c, 0x9420, 0xa0a0, 0x9319, 0x00c8, 0xa1c4, - 0x2400, 0x9122, 0xa1c8, 0x2300, 0x911b, 0x0a0c, 0x0d85, 0xa0b4, - 0x9420, 0xa0b8, 0x9319, 0x0060, 0xa1dc, 0x2400, 0x9122, 0xa1e0, - 0x2300, 0x911b, 0x0a0c, 0x0d85, 0xa0cc, 0x9420, 0xa0d0, 0x9319, - 0xac1e, 0xab22, 0xa880, 0xc0fd, 0xa882, 0x2800, 0xa85a, 0x2c00, - 0xa812, 0x2a00, 0xa816, 0x000e, 0x000e, 0x000e, 0x9006, 0x0028, - 0x008e, 0x00de, 0x00ce, 0x9085, 0x0001, 0x0005, 0x00c6, 0x610c, - 0x0016, 0x9026, 0x2410, 0x6004, 0x9420, 0x9291, 0x0000, 0x2c04, - 0x9210, 0x9ce0, 0x0002, 0x918a, 0x0002, 0x1da8, 0x9284, 0x000f, - 0x9405, 0x001e, 0x00ce, 0x0005, 0x7803, 0x0003, 0x780f, 0x0000, - 0x6004, 0x7812, 0x2c04, 0x7816, 0x9ce0, 0x0002, 0x918a, 0x0002, - 0x1db8, 0x0005, 0x2001, 0x0005, 0x2004, 0xd0bc, 0x190c, 0x0d7e, - 0xd094, 0x0110, 0x080c, 0x1208, 0x0005, 0x0126, 0x2091, 0x2600, - 0x2079, 0x0200, 0x2071, 0x0260, 0x2069, 0x1800, 0x7817, 0x0000, - 0x789b, 0x0814, 0x78a3, 0x0406, 0x789f, 0x0410, 0x2009, 0x013b, - 0x200b, 0x0400, 0x781b, 0x0002, 0x783b, 0x001f, 0x7837, 0x0020, - 0x7803, 0x1600, 0x012e, 0x0005, 0x2091, 0x2600, 0x781c, 0xd0a4, - 0x190c, 0x221d, 0x7900, 0xd1dc, 0x1118, 0x9084, 0x0006, 0x001a, - 0x9084, 0x000e, 0x0002, 0x213b, 0x2133, 0x8210, 0x2133, 0x2135, - 0x2135, 0x2135, 0x2135, 0x81f6, 0x2133, 0x2137, 0x2133, 0x2135, - 0x2133, 0x2135, 0x2133, 0x080c, 0x0d85, 0x0031, 0x0020, 0x080c, - 0x81f6, 0x080c, 0x8210, 0x0005, 0x0006, 0x0016, 0x0026, 0x080c, - 0xeefa, 0x7930, 0x9184, 0x0003, 0x0510, 0x080c, 0xacfc, 0x2001, - 0x19fb, 0x2004, 0x9005, 0x01a0, 0x2001, 0x0133, 0x2004, 0x9005, - 0x090c, 0x0d85, 0x00c6, 0x2001, 0x19fb, 0x2064, 0x080c, 0xad18, - 0x080c, 0xcae9, 0x2009, 0x0040, 0x080c, 0x2220, 0x00ce, 0x0408, - 0x2009, 0x0040, 0x080c, 0x2220, 0x080c, 0xad18, 0x00d0, 0x9184, - 0x0014, 0x01a0, 0x6a00, 0x9286, 0x0003, 0x0160, 0x080c, 0x779e, - 0x1138, 0x080c, 0x7ab6, 0x080c, 0x619d, 0x080c, 0x76cd, 0x0010, - 0x080c, 0x6058, 0x080c, 0x82ae, 0x0041, 0x0018, 0x9184, 0x9540, - 0x1dc8, 0x002e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x0036, 0x0046, - 0x0056, 0x2071, 0x1a6e, 0x080c, 0x1b1e, 0x005e, 0x004e, 0x003e, - 0x00ee, 0x0005, 0x0126, 0x2091, 0x2e00, 0x2071, 0x1800, 0x7128, - 0x2001, 0x196f, 0x2102, 0x2001, 0x1977, 0x2102, 0x2001, 0x013b, - 0x2102, 0x2079, 0x0200, 0x2001, 0x0201, 0x789e, 0x78a3, 0x0200, - 0x9198, 0x0007, 0x831c, 0x831c, 0x831c, 0x9398, 0x0005, 0x2320, - 0x9182, 0x0204, 0x1230, 0x2011, 0x0008, 0x8423, 0x8423, 0x8423, - 0x0488, 0x9182, 0x024c, 0x1240, 0x2011, 0x0007, 0x8403, 0x8003, - 0x9400, 0x9400, 0x9420, 0x0430, 0x9182, 0x02bc, 0x1238, 0x2011, - 0x0006, 0x8403, 0x8003, 0x9400, 0x9420, 0x00e0, 0x9182, 0x034c, - 0x1230, 0x2011, 0x0005, 0x8403, 0x8003, 0x9420, 0x0098, 0x9182, - 0x042c, 0x1228, 0x2011, 0x0004, 0x8423, 0x8423, 0x0058, 0x9182, - 0x059c, 0x1228, 0x2011, 0x0003, 0x8403, 0x9420, 0x0018, 0x2011, - 0x0002, 0x8423, 0x9482, 0x0228, 0x8002, 0x8020, 0x8301, 0x9402, - 0x0110, 0x0208, 0x8321, 0x8217, 0x8203, 0x9405, 0x789a, 0x012e, - 0x0005, 0x0006, 0x00d6, 0x2069, 0x0200, 0x6814, 0x9084, 0xffc0, - 0x910d, 0x6916, 0x00de, 0x000e, 0x0005, 0x00d6, 0x2069, 0x0200, - 0x9005, 0x6810, 0x0110, 0xc0a5, 0x0008, 0xc0a4, 0x6812, 0x00de, - 0x0005, 0x0006, 0x00d6, 0x2069, 0x0200, 0x6810, 0x9084, 0xfff8, - 0x910d, 0x6912, 0x00de, 0x000e, 0x0005, 0x7938, 0x080c, 0x0d7e, - 0x00f6, 0x2079, 0x0200, 0x7902, 0xa001, 0xa001, 0xa001, 0xa001, - 0xa001, 0xa001, 0x7902, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, - 0xa001, 0x00fe, 0x0005, 0x0126, 0x2091, 0x2800, 0x2061, 0x0100, - 0x2071, 0x1800, 0x2009, 0x0000, 0x080c, 0x2a85, 0x080c, 0x299b, - 0x2001, 0x199d, 0x2003, 0x0700, 0x2001, 0x199e, 0x2003, 0x0700, - 0x080c, 0x2af6, 0x9006, 0x080c, 0x29ca, 0x9006, 0x080c, 0x29ad, - 0x20a9, 0x0012, 0x1d04, 0x2252, 0x2091, 0x6000, 0x1f04, 0x2252, - 0x602f, 0x0100, 0x602f, 0x0000, 0x6050, 0x9085, 0x0400, 0x9084, - 0xdfff, 0x6052, 0x6224, 0x080c, 0x2ad3, 0x080c, 0x26c5, 0x2009, - 0x00ef, 0x6132, 0x6136, 0x080c, 0x26d5, 0x60e7, 0x0000, 0x61ea, - 0x2001, 0x180d, 0x2004, 0xd08c, 0x2001, 0x0002, 0x1110, 0x2001, - 0x0008, 0x60e2, 0x604b, 0xf7f7, 0x6043, 0x0000, 0x602f, 0x0080, - 0x602f, 0x0000, 0x6007, 0x349f, 0x00c6, 0x2061, 0x0140, 0x608b, - 0x000b, 0x608f, 0x10b8, 0x6093, 0x0000, 0x6097, 0x0198, 0x00ce, - 0x6004, 0x9085, 0x8000, 0x6006, 0x60bb, 0x0000, 0x20a9, 0x0018, - 0x60bf, 0x0000, 0x1f04, 0x2298, 0x60bb, 0x0000, 0x60bf, 0x0108, - 0x60bf, 0x0012, 0x60bf, 0x0405, 0x60bf, 0x0014, 0x60bf, 0x0320, - 0x60bf, 0x0018, 0x601b, 0x00f0, 0x601f, 0x001e, 0x600f, 0x006b, - 0x602b, 0x402c, 0x012e, 0x0005, 0x00f6, 0x2079, 0x0140, 0x78c3, - 0x0080, 0x78c3, 0x0083, 0x78c3, 0x0000, 0x00fe, 0x0005, 0x2001, - 0x1835, 0x2003, 0x0000, 0x2001, 0x1834, 0x2003, 0x0001, 0x0005, - 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x6124, 0x6028, - 0x910c, 0x0066, 0x2031, 0x1837, 0x2634, 0x96b4, 0x0028, 0x006e, - 0x1138, 0x6020, 0xd1bc, 0x0120, 0xd0bc, 0x1168, 0xd0b4, 0x1198, - 0x9184, 0x5e2c, 0x1118, 0x9184, 0x0007, 0x00aa, 0x9195, 0x0004, - 0x9284, 0x0007, 0x0082, 0x0016, 0x2001, 0x0387, 0x200c, 0xd1a4, - 0x001e, 0x0d70, 0x0c98, 0x0016, 0x2001, 0x0387, 0x200c, 0xd1b4, - 0x001e, 0x0d30, 0x0c58, 0x2306, 0x2303, 0x2303, 0x2303, 0x2305, - 0x2303, 0x2303, 0x2303, 0x080c, 0x0d85, 0x0029, 0x002e, 0x001e, - 0x000e, 0x012e, 0x0005, 0x00a6, 0x6124, 0x6028, 0xd09c, 0x0118, - 0xd19c, 0x1904, 0x258b, 0xd1f4, 0x190c, 0x0d7e, 0x080c, 0x779e, - 0x0904, 0x2363, 0x080c, 0xd645, 0x1120, 0x7000, 0x9086, 0x0003, - 0x0580, 0x6024, 0x9084, 0x1800, 0x0560, 0x080c, 0x77c1, 0x0118, - 0x080c, 0x77af, 0x1530, 0x2011, 0x0020, 0x080c, 0x2ad3, 0x6043, - 0x0000, 0x080c, 0xd645, 0x0168, 0x080c, 0x77c1, 0x1150, 0x2001, - 0x19a8, 0x2003, 0x0001, 0x6027, 0x1800, 0x080c, 0x7612, 0x0804, - 0x258e, 0x70a4, 0x9005, 0x1150, 0x70a7, 0x0001, 0x00d6, 0x2069, - 0x0140, 0x080c, 0x77f2, 0x00de, 0x1904, 0x258e, 0x080c, 0x7ac0, - 0x0428, 0x080c, 0x77c1, 0x1590, 0x6024, 0x9084, 0x1800, 0x1108, - 0x0468, 0x080c, 0x7ac0, 0x080c, 0x7ab6, 0x080c, 0x619d, 0x080c, - 0x76cd, 0x0804, 0x258b, 0xd1ac, 0x1508, 0x6024, 0xd0dc, 0x1170, - 0xd0e4, 0x1178, 0xd0d4, 0x1190, 0xd0cc, 0x0130, 0x7098, 0x9086, - 0x0029, 0x1110, 0x080c, 0x7990, 0x0804, 0x258b, 0x080c, 0x7abb, - 0x0048, 0x2001, 0x197d, 0x2003, 0x0002, 0x0020, 0x080c, 0x78e4, - 0x0804, 0x258b, 0x080c, 0x7a3a, 0x0804, 0x258b, 0x6220, 0xd1bc, - 0x0138, 0xd2bc, 0x1904, 0x25f6, 0xd2b4, 0x1904, 0x2608, 0x0000, - 0xd1ac, 0x0904, 0x2498, 0x0036, 0x6328, 0xc3bc, 0x632a, 0x003e, - 0x080c, 0x779e, 0x11d0, 0x2011, 0x0020, 0x080c, 0x2ad3, 0x0006, - 0x0026, 0x0036, 0x080c, 0x77b8, 0x1158, 0x080c, 0x7ab6, 0x080c, - 0x619d, 0x080c, 0x76cd, 0x003e, 0x002e, 0x000e, 0x00ae, 0x0005, - 0x003e, 0x002e, 0x000e, 0x080c, 0x7772, 0x0016, 0x0046, 0x00c6, - 0x644c, 0x9486, 0xf0f0, 0x1138, 0x2061, 0x0100, 0x644a, 0x6043, - 0x0090, 0x6043, 0x0010, 0x74da, 0x948c, 0xff00, 0x7038, 0xd084, - 0x0190, 0x080c, 0xd645, 0x1118, 0x9186, 0xf800, 0x1160, 0x7048, - 0xd084, 0x1148, 0xc085, 0x704a, 0x0036, 0x2418, 0x2011, 0x8016, - 0x080c, 0x4ca1, 0x003e, 0x080c, 0xd63e, 0x1904, 0x246d, 0x9196, - 0xff00, 0x05a8, 0x7060, 0x9084, 0x00ff, 0x810f, 0x81ff, 0x0110, - 0x9116, 0x0568, 0x7130, 0xd184, 0x1550, 0x080c, 0x3482, 0x0128, - 0xc18d, 0x7132, 0x080c, 0x6c09, 0x1510, 0x6240, 0x9294, 0x0010, - 0x0130, 0x6248, 0x9294, 0xff00, 0x9296, 0xff00, 0x01c0, 0x7030, - 0xd08c, 0x0904, 0x246d, 0x7038, 0xd08c, 0x1140, 0x2001, 0x180c, - 0x200c, 0xd1ac, 0x1904, 0x246d, 0xc1ad, 0x2102, 0x0036, 0x73d8, - 0x2011, 0x8013, 0x080c, 0x4ca1, 0x003e, 0x0804, 0x246d, 0x7038, - 0xd08c, 0x1140, 0x2001, 0x180c, 0x200c, 0xd1ac, 0x1904, 0x246d, - 0xc1ad, 0x2102, 0x0036, 0x73d8, 0x2011, 0x8013, 0x080c, 0x4ca1, - 0x003e, 0x7130, 0xc185, 0x7132, 0x2011, 0x1848, 0x220c, 0xd1a4, - 0x01f0, 0x0016, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, 0x8c44, - 0x2019, 0x000e, 0x00c6, 0x2061, 0x0000, 0x080c, 0xe9f9, 0x00ce, - 0x9484, 0x00ff, 0x9080, 0x348e, 0x200d, 0x918c, 0xff00, 0x810f, - 0x2120, 0x9006, 0x2009, 0x000e, 0x080c, 0xea8d, 0x001e, 0x0016, - 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x32da, 0x001e, 0x00a8, - 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x67b4, 0x1140, - 0x7030, 0xd084, 0x1118, 0xb800, 0xd0bc, 0x1110, 0x080c, 0x61b7, - 0x8108, 0x1f04, 0x245d, 0x00be, 0x015e, 0x00ce, 0x004e, 0x080c, - 0xacfc, 0x080c, 0xafd2, 0x080c, 0xb09b, 0x080c, 0xad18, 0x60e3, - 0x0000, 0x001e, 0x2001, 0x1800, 0x2014, 0x9296, 0x0004, 0x1170, - 0xd19c, 0x11b0, 0x2011, 0x180c, 0x2214, 0xd29c, 0x1120, 0x6204, - 0x9295, 0x0002, 0x6206, 0x6228, 0xc29d, 0x622a, 0x2003, 0x0001, - 0x2001, 0x1826, 0x2003, 0x0000, 0x2011, 0x0020, 0x080c, 0x2ad3, - 0xd194, 0x0904, 0x258b, 0x0016, 0x080c, 0xacfc, 0x6220, 0xd2b4, - 0x0904, 0x2526, 0x080c, 0x8a4b, 0x080c, 0xa2a0, 0x2011, 0x0004, - 0x080c, 0x2ad3, 0x00f6, 0x2019, 0x19f4, 0x2304, 0x907d, 0x0904, - 0x24f3, 0x7804, 0x9086, 0x0032, 0x15f0, 0x00d6, 0x00c6, 0x00e6, - 0x0096, 0x2069, 0x0140, 0x782c, 0x685e, 0x7808, 0x685a, 0x6043, - 0x0002, 0x2001, 0x0003, 0x8001, 0x1df0, 0x6043, 0x0000, 0x2001, - 0x003c, 0x8001, 0x1df0, 0x080c, 0x2aa9, 0x2001, 0x001e, 0x8001, - 0x0240, 0x20a9, 0x0009, 0x080c, 0x2a60, 0x6904, 0xd1dc, 0x1140, - 0x0cb0, 0x2001, 0x0100, 0x080c, 0x2a99, 0x9006, 0x080c, 0x2a99, - 0x080c, 0x99ed, 0x080c, 0xad18, 0x7814, 0x2048, 0xa867, 0x0103, - 0x2f60, 0x080c, 0xb16c, 0x009e, 0x00ee, 0x00ce, 0x00de, 0x00fe, - 0x001e, 0x00ae, 0x0005, 0x00fe, 0x00d6, 0x2069, 0x0140, 0x6804, - 0x9084, 0x4000, 0x0110, 0x080c, 0x2aa9, 0x00de, 0x00c6, 0x2061, - 0x19e8, 0x6034, 0x080c, 0xd645, 0x0120, 0x909a, 0x0003, 0x1258, - 0x0018, 0x909a, 0x00c8, 0x1238, 0x8000, 0x6036, 0x00ce, 0x080c, - 0xa278, 0x0804, 0x2588, 0x2061, 0x0100, 0x62c0, 0x080c, 0xac2d, - 0x2019, 0x19f4, 0x2304, 0x9065, 0x0130, 0x6003, 0x0001, 0x2009, - 0x0027, 0x080c, 0xb20a, 0x00ce, 0x0804, 0x2588, 0xd2bc, 0x0904, - 0x256b, 0x080c, 0x8a58, 0x2011, 0x0004, 0x080c, 0x2ad3, 0x00d6, - 0x2069, 0x0140, 0x6804, 0x9084, 0x4000, 0x0110, 0x080c, 0x2aa9, - 0x00de, 0x00c6, 0x2061, 0x19e8, 0x6050, 0x080c, 0xd645, 0x0120, - 0x909a, 0x0003, 0x1668, 0x0018, 0x909a, 0x00c8, 0x1648, 0x8000, - 0x6052, 0x604c, 0x00ce, 0x9005, 0x05d8, 0x2009, 0x07d0, 0x080c, - 0x8a50, 0x9080, 0x0008, 0x2004, 0x9086, 0x0006, 0x1138, 0x2009, - 0x1984, 0x2011, 0x0012, 0x080c, 0x2ae2, 0x0450, 0x9080, 0x0008, - 0x2004, 0x9086, 0x0009, 0x0d98, 0x2009, 0x1984, 0x2011, 0x0016, - 0x080c, 0x2ae2, 0x00e8, 0x2011, 0x0004, 0x080c, 0x2ad3, 0x00c0, - 0x0036, 0x2019, 0x0001, 0x080c, 0xa596, 0x003e, 0x2019, 0x19fb, - 0x2304, 0x9065, 0x0160, 0x2009, 0x004f, 0x6020, 0x9086, 0x0009, - 0x1110, 0x2009, 0x004f, 0x6003, 0x0003, 0x080c, 0xb20a, 0x00ce, - 0x080c, 0xad18, 0x001e, 0xd19c, 0x0904, 0x25ef, 0x7038, 0xd0ac, - 0x1558, 0x0016, 0x0156, 0x2011, 0x0008, 0x080c, 0x2ad3, 0x080c, - 0x2af6, 0x080c, 0x2b29, 0x6050, 0xc0e5, 0x6052, 0x20a9, 0x0367, - 0x0f04, 0x25ba, 0x1d04, 0x25a2, 0x080c, 0x8a7f, 0x6020, 0xd09c, - 0x1db8, 0x00f6, 0x2079, 0x0100, 0x080c, 0x2a0c, 0x00fe, 0x1d80, - 0x6050, 0xc0e4, 0x6052, 0x2011, 0x0008, 0x080c, 0x2ad3, 0x015e, - 0x001e, 0x04a8, 0x015e, 0x001e, 0x0016, 0x6028, 0xc09c, 0x602a, - 0x080c, 0xacfc, 0x080c, 0xafd2, 0x080c, 0xb09b, 0x080c, 0xad18, - 0x60e3, 0x0000, 0x080c, 0xeed9, 0x080c, 0xeef4, 0x080c, 0x5844, - 0xd0fc, 0x1138, 0x080c, 0xd63e, 0x1120, 0x9085, 0x0001, 0x080c, - 0x77e2, 0x9006, 0x080c, 0x2a99, 0x2009, 0x0002, 0x080c, 0x2a85, - 0x00e6, 0x2071, 0x1800, 0x7003, 0x0004, 0x080c, 0x0ed3, 0x00ee, - 0x2011, 0x0008, 0x080c, 0x2ad3, 0x080c, 0x0bcf, 0x001e, 0x918c, - 0xffd0, 0x2110, 0x080c, 0x2ad3, 0x00ae, 0x0005, 0x0016, 0x2001, - 0x0387, 0x200c, 0xd1a4, 0x001e, 0x0904, 0x2390, 0x0016, 0x2009, - 0x2602, 0x00c0, 0x2001, 0x0387, 0x2003, 0x1000, 0x001e, 0x0c38, - 0x0016, 0x2001, 0x0387, 0x200c, 0xd1b4, 0x001e, 0x0904, 0x2390, - 0x0016, 0x2009, 0x2614, 0x0030, 0x2001, 0x0387, 0x2003, 0x4000, - 0x001e, 0x08a8, 0x6028, 0xc0bc, 0x602a, 0x2001, 0x0156, 0x2003, - 0xbc91, 0x8000, 0x2003, 0xffff, 0x6043, 0x0001, 0x080c, 0x2a7f, - 0x2011, 0x0080, 0x080c, 0x2ad3, 0x6017, 0x0000, 0x6043, 0x0000, - 0x0817, 0x0006, 0x0016, 0x0026, 0x0036, 0x00e6, 0x00f6, 0x0126, - 0x2091, 0x8000, 0x2071, 0x1800, 0x71d0, 0x70d2, 0x9116, 0x0904, - 0x2684, 0x81ff, 0x01a0, 0x2009, 0x0000, 0x080c, 0x2a85, 0x2011, - 0x8011, 0x2019, 0x010e, 0x231c, 0x939e, 0x0007, 0x1118, 0x2019, - 0x0001, 0x0010, 0x2019, 0x0000, 0x080c, 0x4ca1, 0x0468, 0x2001, - 0x19a9, 0x200c, 0x81ff, 0x1140, 0x2001, 0x0109, 0x2004, 0xd0b4, - 0x0118, 0x2019, 0x0003, 0x0008, 0x2118, 0x2011, 0x8012, 0x080c, - 0x4ca1, 0x080c, 0x0ed3, 0x080c, 0x5844, 0xd0fc, 0x11a8, 0x080c, - 0xd63e, 0x1190, 0x00c6, 0x080c, 0x2720, 0x080c, 0xacfc, 0x080c, - 0xa4f1, 0x080c, 0xad18, 0x2061, 0x0100, 0x2019, 0x0028, 0x2009, - 0x0002, 0x080c, 0x32da, 0x00ce, 0x012e, 0x00fe, 0x00ee, 0x003e, - 0x002e, 0x001e, 0x000e, 0x0005, 0x2028, 0x918c, 0x00ff, 0x2130, - 0x9094, 0xff00, 0x11f0, 0x2011, 0x1837, 0x2214, 0xd2ac, 0x11c8, - 0x81ff, 0x01e8, 0x2011, 0x181f, 0x2204, 0x9106, 0x1190, 0x2011, - 0x1820, 0x2214, 0x9294, 0xff00, 0x9584, 0xff00, 0x9206, 0x1148, - 0x2011, 0x1820, 0x2214, 0x9294, 0x00ff, 0x9584, 0x00ff, 0x9206, - 0x1120, 0x2500, 0x080c, 0x8521, 0x0048, 0x9584, 0x00ff, 0x9080, - 0x348e, 0x200d, 0x918c, 0xff00, 0x810f, 0x9006, 0x0005, 0x9080, - 0x348e, 0x200d, 0x918c, 0x00ff, 0x0005, 0x00d6, 0x2069, 0x0140, - 0x2001, 0x1818, 0x2003, 0x00ef, 0x20a9, 0x0010, 0x9006, 0x6852, - 0x6856, 0x1f04, 0x26d0, 0x00de, 0x0005, 0x0006, 0x00d6, 0x0026, - 0x2069, 0x0140, 0x2001, 0x1818, 0x2102, 0x8114, 0x8214, 0x8214, - 0x8214, 0x20a9, 0x0010, 0x6853, 0x0000, 0x9006, 0x82ff, 0x1128, - 0x9184, 0x000f, 0x9080, 0xef08, 0x2005, 0x6856, 0x8211, 0x1f04, - 0x26e5, 0x002e, 0x00de, 0x000e, 0x0005, 0x00c6, 0x2061, 0x1800, - 0x6030, 0x0110, 0xc09d, 0x0008, 0xc09c, 0x6032, 0x00ce, 0x0005, - 0x0156, 0x00d6, 0x0026, 0x0016, 0x0006, 0x2069, 0x0140, 0x6980, - 0x9116, 0x0180, 0x9112, 0x1230, 0x8212, 0x8210, 0x22a8, 0x2001, - 0x0402, 0x0018, 0x22a8, 0x2001, 0x0404, 0x680e, 0x1f04, 0x2715, - 0x680f, 0x0000, 0x000e, 0x001e, 0x002e, 0x00de, 0x015e, 0x0005, - 0x080c, 0x5840, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0x9006, 0x0046, - 0x2020, 0x2009, 0x002e, 0x080c, 0xea8d, 0x004e, 0x0005, 0x00f6, - 0x0016, 0x0026, 0x2079, 0x0140, 0x78c4, 0xd0dc, 0x0904, 0x278c, - 0x080c, 0x29fc, 0x0660, 0x9084, 0x0700, 0x908e, 0x0600, 0x1120, - 0x2011, 0x4000, 0x900e, 0x0458, 0x908e, 0x0500, 0x1120, 0x2011, - 0x8000, 0x900e, 0x0420, 0x908e, 0x0400, 0x1120, 0x9016, 0x2009, - 0x0001, 0x00e8, 0x908e, 0x0300, 0x1120, 0x9016, 0x2009, 0x0002, - 0x00b0, 0x908e, 0x0200, 0x1120, 0x9016, 0x2009, 0x0004, 0x0078, - 0x908e, 0x0100, 0x1548, 0x9016, 0x2009, 0x0008, 0x0040, 0x9084, - 0x0700, 0x908e, 0x0300, 0x1500, 0x2011, 0x0030, 0x0058, 0x2300, - 0x9080, 0x0020, 0x2018, 0x080c, 0x955b, 0x928c, 0xff00, 0x0110, - 0x2011, 0x00ff, 0x2200, 0x8007, 0x9085, 0x004c, 0x78c2, 0x2009, - 0x0138, 0x220a, 0x080c, 0x779e, 0x1118, 0x2009, 0x196d, 0x220a, - 0x002e, 0x001e, 0x00fe, 0x0005, 0x78c3, 0x0000, 0x0cc8, 0x0126, - 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x2001, 0x0170, 0x200c, - 0x8000, 0x2014, 0x9184, 0x0003, 0x0110, 0x080c, 0x0d7e, 0x002e, - 0x001e, 0x000e, 0x012e, 0x0005, 0x2001, 0x180d, 0x2004, 0xd08c, - 0x0118, 0x2009, 0x0002, 0x0005, 0x2001, 0x0171, 0x2004, 0xd0dc, - 0x0168, 0x2001, 0x0170, 0x200c, 0x918c, 0x00ff, 0x918e, 0x004c, - 0x1128, 0x200c, 0x918c, 0xff00, 0x810f, 0x0005, 0x900e, 0x2001, - 0x0227, 0x2004, 0x8007, 0x9084, 0x00ff, 0x8004, 0x9108, 0x2001, - 0x0226, 0x2004, 0x8007, 0x9084, 0x00ff, 0x8004, 0x9108, 0x0005, - 0x0018, 0x000c, 0x0018, 0x0020, 0x1000, 0x0800, 0x1000, 0x1800, - 0x0156, 0x0006, 0x0016, 0x0026, 0x00e6, 0x2001, 0x1990, 0x2004, - 0x908a, 0x0007, 0x1a0c, 0x0d85, 0x0033, 0x00ee, 0x002e, 0x001e, - 0x000e, 0x015e, 0x0005, 0x27f2, 0x2810, 0x2834, 0x2836, 0x285f, - 0x2861, 0x2863, 0x2001, 0x0001, 0x080c, 0x2631, 0x080c, 0x2a4a, - 0x2001, 0x1992, 0x2003, 0x0000, 0x7828, 0x9084, 0xe1d7, 0x782a, - 0x9006, 0x20a9, 0x0009, 0x080c, 0x2a18, 0x2001, 0x1990, 0x2003, - 0x0006, 0x2009, 0x001e, 0x2011, 0x2864, 0x080c, 0x8a5d, 0x0005, - 0x2009, 0x1995, 0x200b, 0x0000, 0x2001, 0x199a, 0x2003, 0x0036, - 0x2001, 0x1999, 0x2003, 0x002a, 0x2001, 0x1992, 0x2003, 0x0001, - 0x9006, 0x080c, 0x29ad, 0x2001, 0xffff, 0x20a9, 0x0009, 0x080c, - 0x2a18, 0x2001, 0x1990, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, - 0x2864, 0x080c, 0x8a5d, 0x0005, 0x080c, 0x0d85, 0x2001, 0x199a, - 0x2003, 0x0036, 0x2001, 0x1992, 0x2003, 0x0003, 0x7a38, 0x9294, - 0x0005, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, - 0x080c, 0x29ad, 0x2001, 0x1996, 0x2003, 0x0000, 0x2001, 0xffff, - 0x20a9, 0x0009, 0x080c, 0x2a18, 0x2001, 0x1990, 0x2003, 0x0006, - 0x2009, 0x001e, 0x2011, 0x2864, 0x080c, 0x8a5d, 0x0005, 0x080c, - 0x0d85, 0x080c, 0x0d85, 0x0005, 0x0006, 0x0016, 0x0026, 0x00e6, - 0x00f6, 0x0156, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100, 0x2001, - 0x1992, 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0d85, 0x0043, 0x012e, - 0x015e, 0x00fe, 0x00ee, 0x002e, 0x001e, 0x000e, 0x0005, 0x2886, - 0x28a2, 0x28de, 0x290a, 0x292a, 0x2936, 0x2938, 0x080c, 0x2a0c, - 0x1190, 0x2009, 0x1998, 0x2104, 0x7a38, 0x9294, 0x0005, 0x9296, - 0x0004, 0x0110, 0xc08d, 0x0008, 0xc085, 0x200a, 0x2001, 0x1990, - 0x2003, 0x0001, 0x0030, 0x080c, 0x295c, 0x2001, 0xffff, 0x080c, - 0x2801, 0x0005, 0x080c, 0x293a, 0x05c0, 0x2009, 0x1999, 0x2104, - 0x8001, 0x200a, 0x080c, 0x2a0c, 0x1158, 0x7a38, 0x9294, 0x0005, - 0x9296, 0x0005, 0x0518, 0x2009, 0x1998, 0x2104, 0xc085, 0x200a, - 0x2009, 0x1995, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005, 0x0118, - 0x080c, 0x2942, 0x00c0, 0x200b, 0x0000, 0x7a38, 0x9294, 0x0006, - 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, - 0x29ca, 0x2001, 0x1992, 0x2003, 0x0002, 0x0028, 0x2001, 0x1990, - 0x2003, 0x0003, 0x0010, 0x080c, 0x2823, 0x0005, 0x080c, 0x293a, - 0x0540, 0x2009, 0x1999, 0x2104, 0x8001, 0x200a, 0x080c, 0x2a0c, - 0x1148, 0x2001, 0x1990, 0x2003, 0x0003, 0x2001, 0x1991, 0x2003, - 0x0000, 0x00b8, 0x2009, 0x1999, 0x2104, 0x9005, 0x1118, 0x080c, - 0x297f, 0x0010, 0x080c, 0x294f, 0x080c, 0x2942, 0x2009, 0x1995, - 0x200b, 0x0000, 0x2001, 0x1992, 0x2003, 0x0001, 0x080c, 0x2823, - 0x0000, 0x0005, 0x0479, 0x01e8, 0x080c, 0x2a0c, 0x1198, 0x2009, - 0x1996, 0x2104, 0x8000, 0x200a, 0x9086, 0x0007, 0x0108, 0x0078, - 0x2001, 0x199b, 0x2003, 0x000a, 0x2009, 0x1998, 0x2104, 0xc0fd, - 0x200a, 0x0038, 0x00f9, 0x2001, 0x1992, 0x2003, 0x0004, 0x080c, - 0x284e, 0x0005, 0x0079, 0x0148, 0x080c, 0x2a0c, 0x1118, 0x080c, - 0x283a, 0x0018, 0x0079, 0x080c, 0x284e, 0x0005, 0x080c, 0x0d85, - 0x080c, 0x0d85, 0x2009, 0x199a, 0x2104, 0x8001, 0x200a, 0x090c, - 0x299b, 0x0005, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, - 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x29ca, 0x0005, 0x7a38, - 0x9294, 0x0006, 0x9296, 0x0006, 0x0110, 0x9006, 0x0010, 0x2001, - 0x0001, 0x080c, 0x29ad, 0x0005, 0x2009, 0x1995, 0x2104, 0x8000, - 0x200a, 0x9086, 0x0005, 0x0108, 0x0068, 0x200b, 0x0000, 0x7a38, - 0x9294, 0x0006, 0x9296, 0x0006, 0x0110, 0x9006, 0x0010, 0x2001, - 0x0001, 0x04d9, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, - 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x29ca, 0x0005, 0x0086, - 0x2001, 0x1998, 0x2004, 0x9084, 0x7fff, 0x090c, 0x0d85, 0x2009, - 0x1997, 0x2144, 0x8846, 0x280a, 0x9844, 0x0dd8, 0xd08c, 0x1120, - 0xd084, 0x1120, 0x080c, 0x0d85, 0x9006, 0x0010, 0x2001, 0x0001, - 0x00a1, 0x008e, 0x0005, 0x0006, 0x0156, 0x2001, 0x1990, 0x20a9, - 0x0009, 0x2003, 0x0000, 0x8000, 0x1f04, 0x29a1, 0x2001, 0x1997, - 0x2003, 0x8000, 0x015e, 0x000e, 0x0005, 0x00f6, 0x2079, 0x0100, - 0x9085, 0x0000, 0x0158, 0x7838, 0x9084, 0xfff9, 0x9085, 0x0004, - 0x783a, 0x2009, 0x199d, 0x210c, 0x795a, 0x0050, 0x7838, 0x9084, - 0xfffb, 0x9085, 0x0006, 0x783a, 0x2009, 0x199e, 0x210c, 0x795a, - 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, 0x0158, - 0x7838, 0x9084, 0xfffa, 0x9085, 0x0004, 0x783a, 0x7850, 0x9084, - 0xfff0, 0x7852, 0x00f8, 0x7838, 0x9084, 0xfffb, 0x9085, 0x0005, - 0x783a, 0x7850, 0x9084, 0xfff0, 0x0016, 0x2009, 0x017f, 0x210c, - 0x918e, 0x0005, 0x0140, 0x2009, 0x0003, 0x210c, 0x918c, 0x0600, - 0x918e, 0x0400, 0x0118, 0x9085, 0x000a, 0x0010, 0x9085, 0x0000, - 0x001e, 0x7852, 0x00fe, 0x0005, 0x0006, 0x2001, 0x0100, 0x2004, - 0x9082, 0x0007, 0x000e, 0x0005, 0x0006, 0x2001, 0x0100, 0x2004, - 0x9082, 0x0009, 0x000e, 0x0005, 0x0156, 0x20a9, 0x0064, 0x7820, - 0x080c, 0x2a7f, 0xd09c, 0x1110, 0x1f04, 0x2a0f, 0x015e, 0x0005, - 0x0126, 0x0016, 0x0006, 0x2091, 0x8000, 0x000e, 0x2008, 0x9186, - 0x0000, 0x1118, 0x783b, 0x0007, 0x0090, 0x9186, 0x0001, 0x1118, - 0x783b, 0x0006, 0x0060, 0x9186, 0x0002, 0x1118, 0x783b, 0x0005, - 0x0030, 0x9186, 0x0003, 0x1118, 0x783b, 0x0004, 0x0000, 0x0006, - 0x1d04, 0x2a38, 0x080c, 0x8a7f, 0x1f04, 0x2a38, 0x080c, 0x2af6, - 0x080c, 0x2b29, 0x7850, 0x9085, 0x1000, 0x7852, 0x000e, 0x001e, - 0x012e, 0x0005, 0x080c, 0x2b29, 0x0005, 0x0006, 0x0156, 0x00f6, - 0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, 0xd0ac, 0x1100, 0x7854, - 0xd08c, 0x1110, 0x1f04, 0x2a57, 0x00fe, 0x015e, 0x000e, 0x0005, - 0x1d04, 0x2a60, 0x080c, 0x8a7f, 0x1f04, 0x2a60, 0x0005, 0x0006, - 0x2001, 0x199c, 0x2004, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, - 0x2001, 0x199c, 0x2004, 0x9086, 0x0001, 0x000e, 0x0005, 0x0006, - 0x2001, 0x199c, 0x2004, 0x9086, 0x0002, 0x000e, 0x0005, 0xa001, - 0xa001, 0xa001, 0xa001, 0xa001, 0x0005, 0x0006, 0x2001, 0x19a9, - 0x2102, 0x000e, 0x0005, 0x2009, 0x0171, 0x2104, 0xd0dc, 0x0140, - 0x2009, 0x0170, 0x2104, 0x200b, 0x0080, 0xa001, 0xa001, 0x200a, - 0x0005, 0x0016, 0x0026, 0x080c, 0x77b8, 0x0108, 0xc0bc, 0x2009, - 0x0140, 0x2114, 0x9294, 0x0001, 0x9215, 0x220a, 0x002e, 0x001e, - 0x0005, 0x0016, 0x0026, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001, - 0x9285, 0x1000, 0x200a, 0x220a, 0x002e, 0x001e, 0x0005, 0x0016, - 0x0026, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001, 0x9215, 0x220a, - 0x002e, 0x001e, 0x0005, 0x0006, 0x0016, 0x2009, 0x0140, 0x2104, - 0x1128, 0x080c, 0x77b8, 0x0110, 0xc0bc, 0x0008, 0xc0bd, 0x200a, - 0x001e, 0x000e, 0x0005, 0x00f6, 0x2079, 0x0380, 0x7843, 0x0101, - 0x7844, 0xd084, 0x1de8, 0x2001, 0x0109, 0x2202, 0x7843, 0x0100, - 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0380, 0x7843, 0x0202, 0x7844, - 0xd08c, 0x1de8, 0x2079, 0x0100, 0x7814, 0x9104, 0x9205, 0x7a16, - 0x2079, 0x0380, 0x7843, 0x0200, 0x00fe, 0x0005, 0x0016, 0x0026, - 0x0036, 0x00c6, 0x2061, 0x0100, 0x6050, 0x9084, 0xfbff, 0x9085, - 0x0040, 0x6052, 0x20a9, 0x0002, 0x080c, 0x2a60, 0x6050, 0x9085, - 0x0400, 0x9084, 0xff9f, 0x6052, 0x20a9, 0x0005, 0x080c, 0x2a60, - 0x6054, 0xd0bc, 0x090c, 0x0d85, 0x20a9, 0x0005, 0x080c, 0x2a60, - 0x6054, 0xd0ac, 0x090c, 0x0d85, 0x2009, 0x19b0, 0x9084, 0x7e00, - 0x8007, 0x8004, 0x8004, 0x200a, 0x00ce, 0x003e, 0x002e, 0x001e, - 0x0005, 0x0006, 0x00c6, 0x2061, 0x0100, 0x6050, 0xc0cd, 0x6052, - 0x00ce, 0x000e, 0x0005, 0x0016, 0x00c6, 0x00d6, 0x0006, 0x2061, - 0x0100, 0x2069, 0x0140, 0x6030, 0x0006, 0x6048, 0x0006, 0x60e4, - 0x0006, 0x60e8, 0x0006, 0x6050, 0x0006, 0x60ec, 0x0006, 0x600c, - 0x0006, 0x6004, 0x0006, 0xc0fc, 0x6006, 0x2009, 0x0800, 0x2001, - 0x0338, 0x2003, 0x0301, 0x8109, 0x090c, 0x0d85, 0x2001, 0x0338, - 0x2004, 0xd084, 0x1dc0, 0x6028, 0x0006, 0x60e0, 0x0006, 0x6888, - 0x0006, 0x688c, 0x0006, 0x6890, 0x0006, 0x080c, 0x779e, 0x1110, - 0x6884, 0x0006, 0x602f, 0x0100, 0x602f, 0x0000, 0xa001, 0xa001, - 0xa001, 0xa001, 0x602f, 0x0040, 0x602f, 0x0000, 0x080c, 0x779e, - 0x1120, 0x6803, 0x0080, 0x000e, 0x6886, 0x6897, 0x4198, 0x000e, - 0x6892, 0x000e, 0x688e, 0x000e, 0x688a, 0x000e, 0x60e2, 0x000e, - 0x602a, 0x000e, 0x6006, 0x000e, 0x600e, 0x000e, 0x60ee, 0x000e, - 0x6052, 0x000e, 0x60ea, 0x000e, 0x60e6, 0x000e, 0x604a, 0x000e, - 0x6032, 0x6036, 0x2008, 0x080c, 0x26d5, 0x000e, 0x00de, 0x00ce, - 0x001e, 0x0005, 0x0006, 0x0156, 0x6050, 0x9085, 0x0040, 0x6052, - 0x6050, 0x9084, 0xfbcf, 0x6052, 0x080c, 0x2a7f, 0x9085, 0x2000, - 0x6052, 0x20a9, 0x0012, 0x1d04, 0x2bb3, 0x080c, 0x8a7f, 0x1f04, - 0x2bb3, 0x6050, 0x9085, 0x0400, 0x9084, 0xdfbf, 0x6052, 0x015e, - 0x000e, 0x0005, 0x30be, 0x30be, 0x2cc2, 0x2cc2, 0x2cce, 0x2cce, - 0x2cda, 0x2cda, 0x2ce8, 0x2ce8, 0x2cf4, 0x2cf4, 0x2d02, 0x2d02, - 0x2d10, 0x2d10, 0x2d22, 0x2d22, 0x2d2e, 0x2d2e, 0x2d3c, 0x2d3c, - 0x2d5a, 0x2d5a, 0x2d7a, 0x2d7a, 0x2d4a, 0x2d4a, 0x2d6a, 0x2d6a, - 0x2d88, 0x2d88, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, - 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, - 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, - 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, - 0x2d20, 0x2d20, 0x2d9a, 0x2d9a, 0x2da6, 0x2da6, 0x2db4, 0x2db4, - 0x2dc2, 0x2dc2, 0x2dd2, 0x2dd2, 0x2de0, 0x2de0, 0x2df0, 0x2df0, - 0x2e00, 0x2e00, 0x2e12, 0x2e12, 0x2e20, 0x2e20, 0x2e30, 0x2e30, - 0x2e52, 0x2e52, 0x2e76, 0x2e76, 0x2e40, 0x2e40, 0x2e64, 0x2e64, - 0x2e86, 0x2e86, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, - 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, - 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, - 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, - 0x2d20, 0x2d20, 0x2e9a, 0x2e9a, 0x2ea6, 0x2ea6, 0x2eb4, 0x2eb4, - 0x2ec2, 0x2ec2, 0x2ed2, 0x2ed2, 0x2ee0, 0x2ee0, 0x2ef0, 0x2ef0, - 0x2f00, 0x2f00, 0x2f12, 0x2f12, 0x2f20, 0x2f20, 0x2f30, 0x2f30, - 0x2f40, 0x2f40, 0x2f52, 0x2f52, 0x2f62, 0x2f62, 0x2f74, 0x2f74, - 0x2f86, 0x2f86, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, - 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, - 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, - 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, - 0x2d20, 0x2d20, 0x2f9a, 0x2f9a, 0x2fa8, 0x2fa8, 0x2fb8, 0x2fb8, - 0x2fc8, 0x2fc8, 0x2fda, 0x2fda, 0x2fea, 0x2fea, 0x2ffc, 0x2ffc, - 0x300e, 0x300e, 0x3022, 0x3022, 0x3032, 0x3032, 0x3044, 0x3044, - 0x3056, 0x3056, 0x306a, 0x306a, 0x307b, 0x307b, 0x308e, 0x308e, - 0x30a1, 0x30a1, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, - 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, - 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, - 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, 0x2d20, - 0x2d20, 0x2d20, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0x22c8, 0x0804, 0x30b6, 0x0106, 0x0006, - 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x20ea, - 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0x20ea, 0x080c, 0x22c8, 0x0804, 0x30b6, - 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, - 0x080c, 0x2114, 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, - 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x22c8, 0x080c, 0x2114, - 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0x20ea, 0x080c, 0x2114, 0x0804, 0x30b6, - 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, - 0x080c, 0x20ea, 0x080c, 0x22c8, 0x080c, 0x2114, 0x0804, 0x30b6, - 0xa001, 0x0cf0, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0x13d4, 0x0804, 0x30b6, 0x0106, 0x0006, - 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x22c8, - 0x080c, 0x13d4, 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, - 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x20ea, 0x080c, 0x13d4, - 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0x22c8, 0x080c, 0x13d4, 0x080c, 0x2114, - 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0x20ea, 0x080c, 0x22c8, 0x080c, 0x13d4, - 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0x20ea, 0x080c, 0x13d4, 0x080c, 0x2114, - 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0x13d4, 0x080c, 0x2114, 0x0804, 0x30b6, - 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, - 0x080c, 0x20ea, 0x080c, 0x22c8, 0x080c, 0x13d4, 0x080c, 0x2114, - 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0x278f, 0x0804, 0x30b6, 0x0106, 0x0006, - 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x278f, - 0x080c, 0x22c8, 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, - 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x278f, 0x080c, 0x20ea, - 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0x278f, 0x080c, 0x20ea, 0x080c, 0x22c8, - 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0x278f, 0x080c, 0x2114, 0x0804, 0x30b6, - 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, - 0x080c, 0x278f, 0x080c, 0x22c8, 0x080c, 0x2114, 0x0804, 0x30b6, - 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, - 0x080c, 0x278f, 0x080c, 0x20ea, 0x080c, 0x2114, 0x0804, 0x30b6, - 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, - 0x080c, 0x278f, 0x080c, 0x20ea, 0x080c, 0x22c8, 0x080c, 0x2114, - 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0x278f, 0x080c, 0x13d4, 0x0804, 0x30b6, - 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, - 0x080c, 0x278f, 0x080c, 0x22c8, 0x080c, 0x13d4, 0x0804, 0x30b6, - 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, - 0x080c, 0x278f, 0x080c, 0x20ea, 0x080c, 0x13d4, 0x0804, 0x30b6, - 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, - 0x080c, 0x278f, 0x080c, 0x22c8, 0x080c, 0x13d4, 0x080c, 0x2114, - 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0x278f, 0x080c, 0x20ea, 0x080c, 0x22c8, - 0x080c, 0x13d4, 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, - 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x278f, 0x080c, 0x20ea, - 0x080c, 0x13d4, 0x080c, 0x2114, 0x0804, 0x30b6, 0x0106, 0x0006, - 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x278f, - 0x080c, 0x13d4, 0x080c, 0x2114, 0x0804, 0x30b6, 0x0106, 0x0006, - 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x278f, - 0x080c, 0x20ea, 0x080c, 0x22c8, 0x080c, 0x13d4, 0x080c, 0x2114, - 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0xad62, 0x0804, 0x30b6, 0x0106, 0x0006, - 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0xad62, - 0x080c, 0x22c8, 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, - 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x20ea, 0x080c, 0xad62, - 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0x20ea, 0x080c, 0xad62, 0x080c, 0x22c8, - 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0xad62, 0x080c, 0x2114, 0x0804, 0x30b6, - 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, - 0x080c, 0xad62, 0x080c, 0x22c8, 0x080c, 0x2114, 0x0804, 0x30b6, - 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, - 0x080c, 0x20ea, 0x080c, 0xad62, 0x080c, 0x2114, 0x0804, 0x30b6, - 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, - 0x080c, 0x20ea, 0x080c, 0xad62, 0x080c, 0x22c8, 0x080c, 0x2114, - 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0xad62, 0x080c, 0x13d4, 0x0804, 0x30b6, - 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, - 0x080c, 0xad62, 0x080c, 0x22c8, 0x080c, 0x13d4, 0x0804, 0x30b6, - 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, - 0x080c, 0x20ea, 0x080c, 0xad62, 0x080c, 0x13d4, 0x0804, 0x30b6, - 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, - 0x080c, 0x20ea, 0x080c, 0xad62, 0x080c, 0x22c8, 0x080c, 0x13d4, - 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0xad62, 0x080c, 0x13d4, 0x080c, 0x2114, - 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0xad62, 0x080c, 0x22c8, 0x080c, 0x13d4, - 0x080c, 0x2114, 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, - 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x20ea, 0x080c, 0xad62, - 0x080c, 0x13d4, 0x080c, 0x2114, 0x0804, 0x30b6, 0x0106, 0x0006, - 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x20ea, - 0x080c, 0xad62, 0x080c, 0x22c8, 0x080c, 0x13d4, 0x080c, 0x2114, - 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0x278f, 0x080c, 0xad62, 0x0804, 0x30b6, - 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, - 0x080c, 0x278f, 0x080c, 0xad62, 0x080c, 0x22c8, 0x0804, 0x30b6, - 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, - 0x080c, 0x278f, 0x080c, 0x20ea, 0x080c, 0xad62, 0x0804, 0x30b6, - 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, - 0x080c, 0x278f, 0x080c, 0x20ea, 0x080c, 0xad62, 0x080c, 0x22c8, - 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0x278f, 0x080c, 0xad62, 0x080c, 0x2114, - 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0x278f, 0x080c, 0xad62, 0x080c, 0x22c8, - 0x080c, 0x2114, 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, - 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x278f, 0x080c, 0x20ea, - 0x080c, 0xad62, 0x080c, 0x2114, 0x0804, 0x30b6, 0x0106, 0x0006, - 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x278f, - 0x080c, 0x20ea, 0x080c, 0xad62, 0x080c, 0x22c8, 0x080c, 0x2114, - 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0x278f, 0x080c, 0xad62, 0x080c, 0x13d4, - 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0x278f, 0x080c, 0xad62, 0x080c, 0x22c8, - 0x080c, 0x13d4, 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, - 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x278f, 0x080c, 0x20ea, - 0x080c, 0xad62, 0x080c, 0x13d4, 0x0804, 0x30b6, 0x0106, 0x0006, - 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x278f, - 0x080c, 0x20ea, 0x080c, 0xad62, 0x080c, 0x22c8, 0x080c, 0x13d4, - 0x0804, 0x30b6, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, - 0x0146, 0x0156, 0x080c, 0x278f, 0x080c, 0xad62, 0x080c, 0x13d4, - 0x080c, 0x2114, 0x04d8, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, - 0x0136, 0x0146, 0x0156, 0x080c, 0x278f, 0x080c, 0xad62, 0x080c, - 0x22c8, 0x080c, 0x13d4, 0x080c, 0x2114, 0x0440, 0x0106, 0x0006, - 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x278f, - 0x080c, 0x20ea, 0x080c, 0x13d4, 0x080c, 0xad62, 0x080c, 0x2114, - 0x00a8, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, - 0x0156, 0x080c, 0x278f, 0x080c, 0x20ea, 0x080c, 0xad62, 0x080c, - 0x22c8, 0x080c, 0x13d4, 0x080c, 0x2114, 0x0000, 0x015e, 0x014e, - 0x013e, 0x01de, 0x01ce, 0x012e, 0x000e, 0x010e, 0x000d, 0x00b6, - 0x00c6, 0x0026, 0x0046, 0x9026, 0x080c, 0x6bcf, 0x1904, 0x31f6, - 0x72dc, 0x2001, 0x197c, 0x2004, 0x9005, 0x1110, 0xd29c, 0x0148, - 0xd284, 0x1138, 0xd2bc, 0x1904, 0x31f6, 0x080c, 0x31fb, 0x0804, - 0x31f6, 0xd2cc, 0x1904, 0x31f6, 0x080c, 0x779e, 0x1120, 0x70af, - 0xffff, 0x0804, 0x31f6, 0xd294, 0x0120, 0x70af, 0xffff, 0x0804, - 0x31f6, 0x080c, 0x347d, 0x0160, 0x080c, 0xd645, 0x0128, 0x2001, - 0x1818, 0x203c, 0x0804, 0x316f, 0x70af, 0xffff, 0x0804, 0x31f6, - 0x2001, 0x1818, 0x203c, 0x7294, 0xd284, 0x0904, 0x316f, 0xd28c, - 0x1904, 0x316f, 0x0036, 0x73ac, 0x938e, 0xffff, 0x1110, 0x2019, - 0x0001, 0x8314, 0x92e0, 0x1d80, 0x2c04, 0x938c, 0x0001, 0x0120, - 0x9084, 0xff00, 0x8007, 0x0010, 0x9084, 0x00ff, 0x970e, 0x0904, - 0x3165, 0x908e, 0x0000, 0x0904, 0x3165, 0x908e, 0x00ff, 0x1160, - 0x7230, 0xd284, 0x1904, 0x316a, 0x7294, 0xc28d, 0x7296, 0x70af, - 0xffff, 0x003e, 0x0804, 0x316f, 0x2009, 0x180d, 0x210c, 0xd18c, - 0x0150, 0x0026, 0x2011, 0x0010, 0x080c, 0x6c35, 0x002e, 0x0118, - 0x70af, 0xffff, 0x0488, 0x900e, 0x080c, 0x268c, 0x080c, 0x6749, - 0x1538, 0x9006, 0xb8bb, 0x0520, 0xb8ac, 0x9005, 0x0148, 0x00c6, - 0x2060, 0x080c, 0x8eee, 0x00ce, 0x090c, 0x928d, 0xb8af, 0x0000, - 0x080c, 0x6c11, 0x1168, 0x7030, 0xd08c, 0x0130, 0xb800, 0xd0bc, - 0x0138, 0x080c, 0x6aae, 0x0120, 0x080c, 0x3214, 0x0148, 0x0028, - 0x080c, 0x3360, 0x080c, 0x3240, 0x0118, 0x8318, 0x0804, 0x3109, - 0x73ae, 0x0010, 0x70af, 0xffff, 0x003e, 0x0804, 0x31f6, 0x9780, - 0x348e, 0x203d, 0x97bc, 0xff00, 0x873f, 0x2041, 0x007e, 0x70ac, - 0x9096, 0xffff, 0x1118, 0x900e, 0x28a8, 0x0050, 0x9812, 0x0220, - 0x2008, 0x9802, 0x20a8, 0x0020, 0x70af, 0xffff, 0x0804, 0x31f6, - 0x2700, 0x0156, 0x0016, 0x9106, 0x0904, 0x31eb, 0x2001, 0x180d, - 0x2004, 0xd08c, 0x0158, 0x0026, 0x2011, 0x0010, 0x080c, 0x6c35, - 0x002e, 0x0120, 0x2009, 0xffff, 0x0804, 0x31f3, 0xc484, 0x080c, - 0x67b4, 0x0168, 0x080c, 0xd645, 0x1904, 0x31eb, 0x080c, 0x347d, - 0x1904, 0x31eb, 0x080c, 0x6749, 0x1904, 0x31f3, 0x0008, 0xc485, - 0xb8bb, 0x0520, 0xb8ac, 0x9005, 0x0148, 0x00c6, 0x2060, 0x080c, - 0x8eee, 0x00ce, 0x090c, 0x928d, 0xb8af, 0x0000, 0x080c, 0x6c11, - 0x1130, 0x7030, 0xd08c, 0x01f8, 0xb800, 0xd0bc, 0x11e0, 0x7294, - 0xd28c, 0x0180, 0x080c, 0x6c11, 0x9082, 0x0006, 0x02e0, 0xd484, - 0x1118, 0x080c, 0x676e, 0x0028, 0x080c, 0x33f3, 0x01a0, 0x080c, - 0x341e, 0x0088, 0x080c, 0x3360, 0x080c, 0xd645, 0x1160, 0x080c, - 0x3240, 0x0188, 0x0040, 0x080c, 0xd645, 0x1118, 0x080c, 0x33f3, - 0x0110, 0x0451, 0x0140, 0x001e, 0x8108, 0x015e, 0x1f04, 0x3188, - 0x70af, 0xffff, 0x0018, 0x001e, 0x015e, 0x71ae, 0x004e, 0x002e, - 0x00ce, 0x00be, 0x0005, 0x00c6, 0x0016, 0x70af, 0x0001, 0x2009, - 0x007e, 0x080c, 0x6749, 0x1168, 0xb813, 0x00ff, 0xb817, 0xfffe, - 0x080c, 0x3360, 0x04a9, 0x0128, 0x70dc, 0xc0bd, 0x70de, 0x080c, - 0xd389, 0x001e, 0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, - 0x2001, 0x184c, 0x2004, 0x9084, 0x00ff, 0xb842, 0x080c, 0xb1dd, - 0x01d0, 0x2b00, 0x6012, 0x080c, 0xd3b6, 0x6023, 0x0001, 0x9006, - 0x080c, 0x66e6, 0x2001, 0x0000, 0x080c, 0x66fa, 0x0126, 0x2091, - 0x8000, 0x70a8, 0x8000, 0x70aa, 0x012e, 0x2009, 0x0004, 0x080c, - 0xb20a, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, - 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2001, 0x184c, 0x2004, 0x9084, - 0x00ff, 0xb842, 0x080c, 0xb1dd, 0x0548, 0x2b00, 0x6012, 0xb800, - 0xc0c4, 0xb802, 0xb8a0, 0x9086, 0x007e, 0x0140, 0xb804, 0x9084, - 0x00ff, 0x9086, 0x0006, 0x1110, 0x080c, 0x3315, 0x080c, 0xd3b6, - 0x6023, 0x0001, 0x9006, 0x080c, 0x66e6, 0x2001, 0x0002, 0x080c, - 0x66fa, 0x0126, 0x2091, 0x8000, 0x70a8, 0x8000, 0x70aa, 0x012e, - 0x2009, 0x0002, 0x080c, 0xb20a, 0x9085, 0x0001, 0x00ce, 0x00de, - 0x007e, 0x001e, 0x0005, 0x00b6, 0x00c6, 0x0026, 0x2009, 0x0080, - 0x080c, 0x6749, 0x1140, 0xb813, 0x00ff, 0xb817, 0xfffc, 0x0039, - 0x0110, 0x70e3, 0xffff, 0x002e, 0x00ce, 0x00be, 0x0005, 0x0016, - 0x0076, 0x00d6, 0x00c6, 0x080c, 0xb116, 0x01d0, 0x2b00, 0x6012, - 0x080c, 0xd3b6, 0x6023, 0x0001, 0x9006, 0x080c, 0x66e6, 0x2001, - 0x0002, 0x080c, 0x66fa, 0x0126, 0x2091, 0x8000, 0x70e4, 0x8000, - 0x70e6, 0x012e, 0x2009, 0x0002, 0x080c, 0xb20a, 0x9085, 0x0001, - 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0126, - 0x2091, 0x8000, 0x2009, 0x007f, 0x080c, 0x6749, 0x11b8, 0xb813, - 0x00ff, 0xb817, 0xfffd, 0xb8d7, 0x0004, 0x080c, 0xb116, 0x0170, - 0x2b00, 0x6012, 0x6316, 0x6023, 0x0001, 0x620a, 0x080c, 0xd3b6, - 0x2009, 0x0022, 0x080c, 0xb20a, 0x9085, 0x0001, 0x012e, 0x00de, - 0x00ce, 0x0005, 0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026, 0x00b6, - 0x21f0, 0x080c, 0xacfc, 0x0106, 0x080c, 0x97bb, 0x080c, 0x9727, - 0x080c, 0xac4d, 0x080c, 0xc179, 0x010e, 0x090c, 0xad18, 0x3e08, - 0x2130, 0x81ff, 0x0120, 0x20a9, 0x007e, 0x900e, 0x0018, 0x20a9, - 0x007f, 0x900e, 0x0016, 0x080c, 0x67b4, 0x1140, 0x9686, 0x0002, - 0x1118, 0xb800, 0xd0bc, 0x1110, 0x080c, 0x61b7, 0x001e, 0x8108, - 0x1f04, 0x32fa, 0x9686, 0x0001, 0x190c, 0x3451, 0x00be, 0x002e, - 0x003e, 0x006e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0046, - 0x0036, 0x0026, 0x0016, 0x00b6, 0x080c, 0xacfc, 0x0106, 0x6210, - 0x2258, 0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c, 0x97b0, 0x0076, - 0x2039, 0x0000, 0x080c, 0x966d, 0x2c08, 0x080c, 0xe75d, 0x007e, - 0x001e, 0x010e, 0x090c, 0xad18, 0xba10, 0xbb14, 0xbc84, 0x080c, - 0x61b7, 0xba12, 0xbb16, 0xbc86, 0x00be, 0x001e, 0x002e, 0x003e, - 0x004e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x00b6, 0x6010, - 0x2058, 0xb8a0, 0x00be, 0x9086, 0x0080, 0x0150, 0x2071, 0x1800, - 0x70a8, 0x9005, 0x0110, 0x8001, 0x70aa, 0x000e, 0x00ee, 0x0005, - 0x2071, 0x1800, 0x70e4, 0x9005, 0x0dc0, 0x8001, 0x70e6, 0x0ca8, - 0xb800, 0xc08c, 0xb802, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x00b6, - 0x0046, 0x0036, 0x0026, 0x0016, 0x0156, 0x2178, 0x080c, 0xacfc, - 0x0106, 0x81ff, 0x1118, 0x20a9, 0x0001, 0x0078, 0x080c, 0x5840, - 0xd0c4, 0x0140, 0xd0a4, 0x0130, 0x9006, 0x2020, 0x2009, 0x002d, - 0x080c, 0xea8d, 0x20a9, 0x0800, 0x9016, 0x0026, 0x928e, 0x007e, - 0x0904, 0x33cf, 0x928e, 0x007f, 0x0904, 0x33cf, 0x928e, 0x0080, - 0x05f0, 0x9288, 0x1000, 0x210c, 0x81ff, 0x05c8, 0x8fff, 0x1150, - 0x2001, 0x198e, 0x0006, 0x2003, 0x0001, 0x080c, 0x33e0, 0x000e, - 0x2003, 0x0000, 0x00b6, 0x00c6, 0x2158, 0x2001, 0x0001, 0x080c, - 0x6bdb, 0x00ce, 0x00be, 0x2019, 0x0029, 0x080c, 0x97b0, 0x0076, - 0x2039, 0x0000, 0x080c, 0x966d, 0x00b6, 0x00c6, 0x0026, 0x2158, - 0xba04, 0x9294, 0x00ff, 0x9286, 0x0006, 0x1118, 0xb807, 0x0404, - 0x0028, 0x2001, 0x0004, 0x8007, 0x9215, 0xba06, 0x002e, 0x00ce, - 0x00be, 0x0016, 0x2c08, 0x080c, 0xe75d, 0x001e, 0x007e, 0x002e, - 0x8210, 0x1f04, 0x3385, 0x010e, 0x090c, 0xad18, 0x015e, 0x001e, - 0x002e, 0x003e, 0x004e, 0x00be, 0x00ce, 0x00ee, 0x00fe, 0x0005, - 0x0046, 0x0026, 0x0016, 0x080c, 0x5840, 0xd0c4, 0x0140, 0xd0a4, - 0x0130, 0x9006, 0x2220, 0x2009, 0x0029, 0x080c, 0xea8d, 0x001e, - 0x002e, 0x004e, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x7294, - 0x82ff, 0x01e8, 0x080c, 0x6c09, 0x11d0, 0x2100, 0x080c, 0x26bf, - 0x81ff, 0x01b8, 0x2019, 0x0001, 0x8314, 0x92e0, 0x1d80, 0x2c04, - 0xd384, 0x0120, 0x9084, 0xff00, 0x8007, 0x0010, 0x9084, 0x00ff, - 0x9116, 0x0138, 0x9096, 0x00ff, 0x0110, 0x8318, 0x0c68, 0x9085, - 0x0001, 0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, 0x0016, 0x00c6, - 0x0126, 0x2091, 0x8000, 0x080c, 0xacfc, 0x0106, 0x0036, 0x2019, - 0x0029, 0x00c1, 0x003e, 0x010e, 0x090c, 0xad18, 0x9180, 0x1000, - 0x2004, 0x9065, 0x0158, 0x0016, 0x00c6, 0x2061, 0x1b39, 0x001e, - 0x6112, 0x080c, 0x3315, 0x001e, 0x080c, 0x676e, 0x012e, 0x00ce, - 0x001e, 0x0005, 0x0016, 0x0026, 0x2110, 0x080c, 0xa7e2, 0x080c, - 0xedee, 0x002e, 0x001e, 0x0005, 0x2001, 0x1837, 0x2004, 0xd0cc, - 0x0005, 0x00c6, 0x00b6, 0x080c, 0x779e, 0x1118, 0x20a9, 0x0800, - 0x0010, 0x20a9, 0x0782, 0x080c, 0x779e, 0x1110, 0x900e, 0x0010, - 0x2009, 0x007e, 0x9180, 0x1000, 0x2004, 0x905d, 0x0130, 0x86ff, - 0x0110, 0xb800, 0xd0bc, 0x090c, 0x676e, 0x8108, 0x1f04, 0x3462, - 0x2061, 0x1800, 0x607f, 0x0000, 0x6080, 0x9084, 0x00ff, 0x6082, - 0x60b3, 0x0000, 0x00be, 0x00ce, 0x0005, 0x2001, 0x1869, 0x2004, - 0xd0bc, 0x0005, 0x2011, 0x1848, 0x2214, 0xd2ec, 0x0005, 0x0026, - 0x2011, 0x1867, 0x2214, 0xd2dc, 0x002e, 0x0005, 0x7eef, 0x7de8, - 0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc, 0x80da, 0x7ad9, 0x80d6, - 0x80d5, 0x80d4, 0x80d3, 0x80d2, 0x80d1, 0x79ce, 0x78cd, 0x80cc, - 0x80cb, 0x80ca, 0x80c9, 0x80c7, 0x80c6, 0x77c5, 0x76c3, 0x80bc, - 0x80ba, 0x75b9, 0x80b6, 0x74b5, 0x73b4, 0x72b3, 0x80b2, 0x80b1, - 0x80ae, 0x71ad, 0x80ac, 0x70ab, 0x6faa, 0x6ea9, 0x80a7, 0x6da6, - 0x6ca5, 0x6ba3, 0x6a9f, 0x699e, 0x689d, 0x809b, 0x8098, 0x6797, - 0x6690, 0x658f, 0x6488, 0x6384, 0x6282, 0x8081, 0x8080, 0x617c, - 0x607a, 0x8079, 0x5f76, 0x8075, 0x8074, 0x8073, 0x8072, 0x8071, - 0x806e, 0x5e6d, 0x806c, 0x5d6b, 0x5c6a, 0x5b69, 0x8067, 0x5a66, - 0x5965, 0x5863, 0x575c, 0x565a, 0x5559, 0x8056, 0x8055, 0x5454, - 0x5353, 0x5252, 0x5151, 0x504e, 0x4f4d, 0x804c, 0x804b, 0x4e4a, - 0x4d49, 0x8047, 0x4c46, 0x8045, 0x8043, 0x803c, 0x803a, 0x8039, - 0x8036, 0x4b35, 0x8034, 0x4a33, 0x4932, 0x4831, 0x802e, 0x472d, - 0x462c, 0x452b, 0x442a, 0x4329, 0x4227, 0x8026, 0x8025, 0x4123, - 0x401f, 0x3f1e, 0x3e1d, 0x3d1b, 0x3c18, 0x8017, 0x8010, 0x3b0f, - 0x3a08, 0x8004, 0x3902, 0x8001, 0x8000, 0x8000, 0x3800, 0x3700, - 0x3600, 0x8000, 0x3500, 0x8000, 0x8000, 0x8000, 0x3400, 0x8000, - 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3300, 0x3200, 0x8000, - 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3100, 0x3000, 0x8000, - 0x8000, 0x2f00, 0x8000, 0x2e00, 0x2d00, 0x2c00, 0x8000, 0x8000, - 0x8000, 0x2b00, 0x8000, 0x2a00, 0x2900, 0x2800, 0x8000, 0x2700, - 0x2600, 0x2500, 0x2400, 0x2300, 0x2200, 0x8000, 0x8000, 0x2100, - 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x8000, 0x8000, 0x1b00, - 0x1a00, 0x8000, 0x1900, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, - 0x8000, 0x1800, 0x8000, 0x1700, 0x1600, 0x1500, 0x8000, 0x1400, - 0x1300, 0x1200, 0x1100, 0x1000, 0x0f00, 0x8000, 0x8000, 0x0e00, - 0x0d00, 0x0c00, 0x0b00, 0x0a00, 0x0900, 0x8000, 0x8000, 0x0800, - 0x0700, 0x8000, 0x0600, 0x8000, 0x8000, 0x8000, 0x0500, 0x0400, - 0x0300, 0x8000, 0x0200, 0x8000, 0x8000, 0x8000, 0x0100, 0x8000, - 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x8000, 0x8000, - 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, - 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x2071, 0x189e, - 0x7003, 0x0002, 0x9006, 0x7016, 0x701a, 0x704a, 0x704e, 0x700e, - 0x7042, 0x7046, 0x703b, 0x18ba, 0x703f, 0x18ba, 0x7007, 0x0001, - 0x080c, 0x1072, 0x090c, 0x0d85, 0x2900, 0x706a, 0xa867, 0x0002, - 0xa8ab, 0xdcb0, 0x080c, 0x1072, 0x090c, 0x0d85, 0x2900, 0x706e, - 0xa867, 0x0002, 0xa8ab, 0xdcb0, 0x0005, 0x2071, 0x189e, 0x7004, - 0x0002, 0x35bd, 0x35be, 0x35d1, 0x35e5, 0x0005, 0x1004, 0x35ce, - 0x0e04, 0x35ce, 0x2079, 0x0000, 0x0126, 0x2091, 0x8000, 0x700c, - 0x9005, 0x1128, 0x700f, 0x0001, 0x012e, 0x0468, 0x0005, 0x012e, - 0x0ce8, 0x2079, 0x0000, 0x2061, 0x18b8, 0x2c4c, 0xa86c, 0x908e, - 0x0100, 0x0128, 0x9086, 0x0200, 0x0904, 0x36b9, 0x0005, 0x7018, - 0x2048, 0x2061, 0x1800, 0x701c, 0x0807, 0x7014, 0x2048, 0xa864, - 0x9094, 0x00ff, 0x9296, 0x0029, 0x1120, 0xaa78, 0xd2fc, 0x0128, - 0x0005, 0x9086, 0x0103, 0x0108, 0x0005, 0x2079, 0x0000, 0x2061, - 0x1800, 0x701c, 0x0807, 0x2061, 0x1800, 0x7880, 0x908a, 0x0040, - 0x1210, 0x61d0, 0x0042, 0x2100, 0x908a, 0x003f, 0x1a04, 0x36b6, - 0x61d0, 0x0804, 0x364b, 0x368d, 0x36c5, 0x36b6, 0x36d1, 0x36db, - 0x36e1, 0x36e5, 0x36f5, 0x36f9, 0x370f, 0x3715, 0x371b, 0x3726, - 0x3731, 0x3740, 0x374f, 0x375d, 0x3774, 0x378f, 0x36b6, 0x383a, - 0x3878, 0x391d, 0x392e, 0x3951, 0x36b6, 0x36b6, 0x36b6, 0x3989, - 0x39a9, 0x39b2, 0x39de, 0x39e4, 0x36b6, 0x3a2a, 0x36b6, 0x36b6, - 0x36b6, 0x36b6, 0x36b6, 0x3a35, 0x3a3e, 0x3a46, 0x3a48, 0x36b6, - 0x36b6, 0x36b6, 0x36b6, 0x36b6, 0x36b6, 0x3a78, 0x36b6, 0x36b6, - 0x36b6, 0x36b6, 0x36b6, 0x3a95, 0x3b19, 0x36b6, 0x36b6, 0x36b6, - 0x36b6, 0x36b6, 0x36b6, 0x0002, 0x3b43, 0x3b46, 0x3ba5, 0x3bbe, - 0x3bee, 0x3e94, 0x36b6, 0x53f5, 0x36b6, 0x36b6, 0x36b6, 0x36b6, - 0x36b6, 0x36b6, 0x36b6, 0x36b6, 0x370f, 0x3715, 0x4397, 0x5864, - 0x43b5, 0x5484, 0x54d6, 0x55e1, 0x36b6, 0x5643, 0x567f, 0x56b0, - 0x57c0, 0x56dd, 0x5740, 0x36b6, 0x43b9, 0x457f, 0x4595, 0x45ba, - 0x461f, 0x4693, 0x46b3, 0x472a, 0x4786, 0x47e2, 0x47e5, 0x480a, - 0x487c, 0x48e6, 0x48ee, 0x4a23, 0x4bcb, 0x4bff, 0x4e63, 0x36b6, - 0x4e81, 0x4f48, 0x5031, 0x508b, 0x36b6, 0x511e, 0x36b6, 0x5134, - 0x514f, 0x48ee, 0x5395, 0x714c, 0x0000, 0x2021, 0x4000, 0x080c, - 0x4c7d, 0x0126, 0x2091, 0x8000, 0x0e04, 0x3697, 0x0010, 0x012e, - 0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118, 0x7833, 0x0011, 0x0010, - 0x7833, 0x0010, 0x7c82, 0x7986, 0x7a8a, 0x7b8e, 0x2091, 0x4080, - 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1200, 0x7007, 0x0001, - 0x2091, 0x5000, 0x700f, 0x0000, 0x012e, 0x0005, 0x2021, 0x4001, - 0x08b0, 0x2021, 0x4002, 0x0898, 0x2021, 0x4003, 0x0880, 0x2021, - 0x4005, 0x0868, 0x2021, 0x4006, 0x0850, 0x2039, 0x0001, 0x902e, - 0x2520, 0x7b88, 0x7a8c, 0x7884, 0x7990, 0x81ff, 0x0d98, 0x0804, - 0x4c8a, 0x2039, 0x0001, 0x902e, 0x2520, 0x7b88, 0x7a8c, 0x7884, - 0x7990, 0x0804, 0x4c8d, 0x7984, 0x7888, 0x2114, 0x200a, 0x0804, - 0x368d, 0x7984, 0x2114, 0x0804, 0x368d, 0x20e1, 0x0000, 0x2099, - 0x0021, 0x20e9, 0x0000, 0x20a1, 0x0021, 0x20a9, 0x001f, 0x4003, - 0x7984, 0x7a88, 0x7b8c, 0x0804, 0x368d, 0x7884, 0x2060, 0x0804, - 0x3742, 0x2009, 0x0003, 0x2011, 0x0003, 0x2019, 0x0014, 0x789b, - 0x0137, 0x7893, 0xffff, 0x2001, 0x188f, 0x2004, 0x9005, 0x0118, - 0x7896, 0x0804, 0x368d, 0x7897, 0x0001, 0x0804, 0x368d, 0x2039, - 0x0001, 0x7d98, 0x7c9c, 0x0804, 0x36c9, 0x2039, 0x0001, 0x7d98, - 0x7c9c, 0x0804, 0x36d5, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, - 0x36c2, 0x2138, 0x7d98, 0x7c9c, 0x0804, 0x36c9, 0x79a0, 0x9182, - 0x0040, 0x0210, 0x0804, 0x36c2, 0x2138, 0x7d98, 0x7c9c, 0x0804, - 0x36d5, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x36c2, 0x21e8, - 0x7984, 0x7888, 0x20a9, 0x0001, 0x21a0, 0x4004, 0x0804, 0x368d, - 0x2061, 0x0800, 0xe10c, 0x9006, 0x2c15, 0x9200, 0x8c60, 0x8109, - 0x1dd8, 0x2010, 0x9005, 0x0904, 0x368d, 0x0804, 0x36bc, 0x79a0, - 0x9182, 0x0040, 0x0210, 0x0804, 0x36c2, 0x21e0, 0x20a9, 0x0001, - 0x7984, 0x2198, 0x4012, 0x0804, 0x368d, 0x2069, 0x1847, 0x7884, - 0x7990, 0x911a, 0x1a04, 0x36c2, 0x8019, 0x0904, 0x36c2, 0x684a, - 0x6942, 0x788c, 0x6852, 0x7888, 0x6856, 0x9006, 0x685a, 0x685e, - 0x080c, 0x7ae7, 0x0804, 0x368d, 0x2069, 0x1847, 0x7884, 0x7994, - 0x911a, 0x1a04, 0x36c2, 0x8019, 0x0904, 0x36c2, 0x684e, 0x6946, - 0x788c, 0x6862, 0x7888, 0x6866, 0x9006, 0x686a, 0x686e, 0x0126, - 0x2091, 0x8000, 0x080c, 0x6d66, 0x012e, 0x0804, 0x368d, 0x902e, - 0x2520, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x36bf, 0x7984, - 0x7b88, 0x7a8c, 0x20a9, 0x0005, 0x20e9, 0x0001, 0x20a1, 0x18a6, - 0x4101, 0x080c, 0x4c41, 0x1120, 0x2009, 0x0002, 0x0804, 0x36bf, - 0x2009, 0x0020, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4c8a, - 0x701f, 0x37b3, 0x0005, 0xa864, 0x2008, 0x9084, 0x00ff, 0x9096, - 0x0011, 0x0168, 0x9096, 0x0019, 0x0150, 0x9096, 0x0015, 0x0138, - 0x9096, 0x0048, 0x0120, 0x9096, 0x0029, 0x1904, 0x36bf, 0x810f, - 0x918c, 0x00ff, 0x0904, 0x36bf, 0x7112, 0x7010, 0x8001, 0x0560, - 0x7012, 0x080c, 0x4c41, 0x1120, 0x2009, 0x0002, 0x0804, 0x36bf, - 0x2009, 0x0020, 0x7068, 0x2040, 0xa28c, 0xa390, 0xa494, 0xa598, - 0x9290, 0x0040, 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000, - 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4c8a, 0x701f, 0x37f1, - 0x0005, 0xa864, 0x9084, 0x00ff, 0x9096, 0x0002, 0x0120, 0x9096, - 0x000a, 0x1904, 0x36bf, 0x0888, 0x0126, 0x2091, 0x8000, 0x7014, - 0x2048, 0xa868, 0xc0fd, 0xa86a, 0xa864, 0x9084, 0x00ff, 0x9096, - 0x0029, 0x1148, 0xc2fd, 0xaa7a, 0x080c, 0x630a, 0x0138, 0xa87a, - 0xa982, 0x012e, 0x0060, 0x080c, 0x663a, 0x1130, 0x7007, 0x0003, - 0x701f, 0x381f, 0x012e, 0x0005, 0x080c, 0x725e, 0x012e, 0x0126, - 0x2091, 0x8000, 0x20a9, 0x0005, 0x20e1, 0x0001, 0x2099, 0x18a6, - 0x400a, 0x2100, 0x9210, 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, - 0x0000, 0xa85c, 0x9080, 0x0019, 0x2009, 0x0020, 0x012e, 0xaf60, - 0x0804, 0x4c8d, 0x2091, 0x8000, 0x7837, 0x4000, 0x7833, 0x0010, - 0x7883, 0x4000, 0x7887, 0x4953, 0x788b, 0x5020, 0x788f, 0x2020, - 0x2009, 0x017f, 0x2104, 0x7892, 0x3f00, 0x7896, 0x2061, 0x0100, - 0x6200, 0x2061, 0x0200, 0x603c, 0x8007, 0x9205, 0x789a, 0x2009, - 0x04fd, 0x2104, 0x789e, 0x2091, 0x5000, 0x2091, 0x4080, 0x2001, - 0x0089, 0x2004, 0xd084, 0x0180, 0x2001, 0x1a25, 0x2004, 0x9005, - 0x0128, 0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, - 0x2003, 0x0002, 0x2003, 0x1001, 0x2071, 0x0080, 0x0804, 0x0427, - 0x81ff, 0x1904, 0x36bf, 0x7984, 0x080c, 0x67b4, 0x1904, 0x36c2, - 0x7e98, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1a04, 0x36c2, 0x7c88, - 0x7d8c, 0x080c, 0x69f1, 0x080c, 0x697e, 0x1518, 0x2061, 0x1ddc, - 0x0126, 0x2091, 0x8000, 0x6000, 0x9086, 0x0000, 0x0148, 0x6014, - 0x904d, 0x0130, 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, 0x0150, - 0x012e, 0x9ce0, 0x001c, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1a04, - 0x36bf, 0x0c30, 0x080c, 0xcae9, 0x012e, 0x0904, 0x36bf, 0x0804, - 0x368d, 0x900e, 0x2001, 0x0005, 0x080c, 0x725e, 0x0126, 0x2091, - 0x8000, 0x080c, 0xd226, 0x080c, 0x7012, 0x012e, 0x0804, 0x368d, - 0x00a6, 0x2950, 0xb198, 0x080c, 0x67b4, 0x1904, 0x390a, 0xb6a4, - 0x9684, 0x3fff, 0x9082, 0x4000, 0x16e8, 0xb49c, 0xb5a0, 0x080c, - 0x69f1, 0x080c, 0x697e, 0x1520, 0x2061, 0x1ddc, 0x0126, 0x2091, - 0x8000, 0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x904d, 0x0130, - 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, 0x0158, 0x012e, 0x9ce0, - 0x001c, 0x2001, 0x181a, 0x2004, 0x9c02, 0x2009, 0x000d, 0x12b0, - 0x0c28, 0x080c, 0xcae9, 0x012e, 0x2009, 0x0003, 0x0178, 0x00e0, - 0x900e, 0x2001, 0x0005, 0x080c, 0x725e, 0x0126, 0x2091, 0x8000, - 0x080c, 0xd226, 0x080c, 0x7006, 0x012e, 0x0070, 0xb097, 0x4005, - 0xb19a, 0x0010, 0xb097, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, - 0x0030, 0x2a48, 0x00ae, 0x0005, 0xb097, 0x4000, 0x9006, 0x918d, - 0x0001, 0x2008, 0x2a48, 0x00ae, 0x0005, 0x81ff, 0x1904, 0x36bf, - 0x080c, 0x4c58, 0x0904, 0x36c2, 0x080c, 0x687b, 0x0904, 0x36bf, - 0x080c, 0x69f7, 0x0904, 0x36bf, 0x0804, 0x46aa, 0x81ff, 0x1904, - 0x36bf, 0x080c, 0x4c74, 0x0904, 0x36c2, 0x080c, 0x6a85, 0x0904, - 0x36bf, 0x2019, 0x0005, 0x79a8, 0x080c, 0x6a12, 0x0904, 0x36bf, - 0x7888, 0x908a, 0x1000, 0x1a04, 0x36c2, 0x8003, 0x800b, 0x810b, - 0x9108, 0x080c, 0x89a1, 0x79a8, 0xd184, 0x1904, 0x368d, 0x0804, - 0x46aa, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0118, 0x2009, 0x0001, - 0x0450, 0x2029, 0x07ff, 0x645c, 0x2400, 0x9506, 0x01f8, 0x2508, - 0x080c, 0x67b4, 0x11d8, 0x080c, 0x6a85, 0x1128, 0x2009, 0x0002, - 0x62c0, 0x2518, 0x00c0, 0x2019, 0x0004, 0x900e, 0x080c, 0x6a12, - 0x1118, 0x2009, 0x0006, 0x0078, 0x7884, 0x908a, 0x1000, 0x1270, - 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x89a1, 0x8529, 0x1ae0, - 0x012e, 0x0804, 0x368d, 0x012e, 0x0804, 0x36bf, 0x012e, 0x0804, - 0x36c2, 0x080c, 0x4c58, 0x0904, 0x36c2, 0x080c, 0x687b, 0x0904, - 0x36bf, 0x080c, 0xacfc, 0xbaa0, 0x2019, 0x0005, 0x00c6, 0x9066, - 0x080c, 0x97b0, 0x0076, 0x903e, 0x080c, 0x966d, 0x900e, 0x080c, - 0xe75d, 0x007e, 0x00ce, 0x080c, 0xad18, 0x080c, 0x69f1, 0x0804, - 0x368d, 0x080c, 0x4c58, 0x0904, 0x36c2, 0x080c, 0x69f1, 0x2208, - 0x0804, 0x368d, 0x0156, 0x00d6, 0x00e6, 0x00c6, 0x2069, 0x1910, - 0x6810, 0x6914, 0x910a, 0x1208, 0x900e, 0x6816, 0x9016, 0x901e, - 0x2071, 0x19e8, 0x7028, 0x9065, 0x0118, 0x8210, 0x600c, 0x0cd8, - 0x2300, 0x9218, 0x00ce, 0x00ee, 0x00de, 0x015e, 0x0804, 0x368d, - 0x00f6, 0x0016, 0x907d, 0x0138, 0x9006, 0x8000, 0x2f0c, 0x81ff, - 0x0110, 0x2178, 0x0cd0, 0x001e, 0x00fe, 0x0005, 0x2069, 0x1910, - 0x6910, 0x62bc, 0x0804, 0x368d, 0x81ff, 0x0120, 0x2009, 0x0001, - 0x0804, 0x36bf, 0x0126, 0x2091, 0x8000, 0x080c, 0x5854, 0x0128, - 0x2009, 0x0007, 0x012e, 0x0804, 0x36bf, 0x012e, 0x615c, 0x9190, - 0x348e, 0x2215, 0x9294, 0x00ff, 0x637c, 0x83ff, 0x0108, 0x6280, - 0x67dc, 0x97c4, 0x000a, 0x98c6, 0x000a, 0x1118, 0x2031, 0x0001, - 0x00e8, 0x97c4, 0x0022, 0x98c6, 0x0022, 0x1118, 0x2031, 0x0003, - 0x00a8, 0x97c4, 0x0012, 0x98c6, 0x0012, 0x1118, 0x2031, 0x0002, - 0x0068, 0x080c, 0x779e, 0x1118, 0x2031, 0x0004, 0x0038, 0xd79c, - 0x0120, 0x2009, 0x0005, 0x0804, 0x36bf, 0x9036, 0x7e9a, 0x7f9e, - 0x0804, 0x368d, 0x614c, 0x6250, 0x2019, 0x1986, 0x231c, 0x2001, - 0x1987, 0x2004, 0x789a, 0x0804, 0x368d, 0x0126, 0x2091, 0x8000, - 0x6138, 0x623c, 0x6340, 0x012e, 0x0804, 0x368d, 0x080c, 0x4c74, - 0x0904, 0x36c2, 0xba44, 0xbb38, 0x0804, 0x368d, 0x080c, 0x0d85, - 0x080c, 0x4c74, 0x2110, 0x0904, 0x36c2, 0xb804, 0x908c, 0x00ff, - 0x918e, 0x0006, 0x0140, 0x9084, 0xff00, 0x9086, 0x0600, 0x2009, - 0x0009, 0x1904, 0x36bf, 0x0126, 0x2091, 0x8000, 0x2019, 0x0005, - 0x00c6, 0x9066, 0x080c, 0xacfc, 0x080c, 0xa7e2, 0x080c, 0x97b0, - 0x0076, 0x903e, 0x080c, 0x966d, 0x900e, 0x080c, 0xe75d, 0x007e, - 0x00ce, 0x080c, 0xad18, 0xb807, 0x0407, 0x012e, 0x0804, 0x368d, - 0x614c, 0x6250, 0x7884, 0x604e, 0x7b88, 0x6352, 0x2069, 0x1847, - 0x831f, 0x9305, 0x6816, 0x788c, 0x2069, 0x1986, 0x2d1c, 0x206a, - 0x7e98, 0x9682, 0x0014, 0x1210, 0x2031, 0x07d0, 0x2069, 0x1987, - 0x2d04, 0x266a, 0x789a, 0x0804, 0x368d, 0x0126, 0x2091, 0x8000, - 0x6138, 0x7884, 0x603a, 0x910e, 0xd1b4, 0x190c, 0x0eeb, 0xd0c4, - 0x01a8, 0x00d6, 0x78a8, 0x2009, 0x199d, 0x200a, 0x78ac, 0x2011, - 0x199e, 0x2012, 0x2069, 0x0100, 0x6838, 0x9086, 0x0007, 0x1118, - 0x2214, 0x6a5a, 0x0010, 0x210c, 0x695a, 0x00de, 0x7888, 0xd0ec, - 0x0178, 0x6034, 0xc08d, 0x6036, 0x2001, 0x0050, 0x6076, 0x607a, - 0x6056, 0x606b, 0x269c, 0x00c6, 0x2061, 0x1b73, 0x2062, 0x00ce, - 0x2011, 0x0116, 0x220c, 0x7888, 0xd08c, 0x0118, 0x918d, 0x0040, - 0x0010, 0x918c, 0xff7f, 0x2112, 0x6134, 0xd18c, 0x2001, 0x0000, - 0x0108, 0x603c, 0x7988, 0x613e, 0x6140, 0x910d, 0x788c, 0x6042, - 0x6234, 0xd28c, 0x0120, 0x7a88, 0x9294, 0x1000, 0x9205, 0x910e, - 0xd1e4, 0x190c, 0x0f06, 0x9084, 0x0020, 0x0130, 0x78b4, 0x6046, - 0x9084, 0x0001, 0x090c, 0x4397, 0x6040, 0xd0cc, 0x0120, 0x78b0, - 0x2011, 0x0114, 0x2012, 0x012e, 0x0804, 0x368d, 0x00f6, 0x2079, - 0x1800, 0x7a38, 0xa898, 0x9084, 0xfebf, 0x9215, 0xa89c, 0x9084, - 0xfebf, 0x8002, 0x9214, 0x7838, 0x9084, 0x0140, 0x9215, 0x7a3a, - 0xa897, 0x4000, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x00fe, - 0x0005, 0x7898, 0x9005, 0x01a8, 0x7888, 0x9025, 0x0904, 0x36c2, - 0x788c, 0x902d, 0x0904, 0x36c2, 0x900e, 0x080c, 0x67b4, 0x1120, - 0xba44, 0xbb38, 0xbc46, 0xbd3a, 0x9186, 0x07ff, 0x0190, 0x8108, - 0x0ca0, 0x080c, 0x4c74, 0x0904, 0x36c2, 0x7888, 0x900d, 0x0904, - 0x36c2, 0x788c, 0x9005, 0x0904, 0x36c2, 0xba44, 0xb946, 0xbb38, - 0xb83a, 0x0804, 0x368d, 0x2011, 0xbc09, 0x0010, 0x2011, 0xbc05, - 0x080c, 0x5854, 0x1904, 0x36bf, 0x00c6, 0x2061, 0x0100, 0x7984, - 0x9186, 0x00ff, 0x1130, 0x2001, 0x1818, 0x2004, 0x9085, 0xff00, - 0x0088, 0x9182, 0x007f, 0x16e0, 0x9188, 0x348e, 0x210d, 0x918c, - 0x00ff, 0x2001, 0x1818, 0x2004, 0x0026, 0x9116, 0x002e, 0x0580, - 0x810f, 0x9105, 0x0126, 0x2091, 0x8000, 0x0006, 0x080c, 0xb116, - 0x000e, 0x0510, 0x602e, 0x620a, 0x7984, 0x00b6, 0x080c, 0x674f, - 0x2b08, 0x00be, 0x1500, 0x6112, 0x6023, 0x0001, 0x080c, 0x4c41, - 0x01d0, 0x9006, 0xa866, 0x7007, 0x0003, 0xa832, 0xa868, 0xc0fd, - 0xa86a, 0x701f, 0x3b9e, 0x2900, 0x6016, 0x2009, 0x0032, 0x080c, - 0xb20a, 0x012e, 0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, 0x36bf, - 0x00ce, 0x0804, 0x36c2, 0x080c, 0xb16c, 0x0cb0, 0xa830, 0x9086, - 0x0100, 0x0904, 0x36bf, 0x0804, 0x368d, 0x2061, 0x1a73, 0x0126, - 0x2091, 0x8000, 0x6000, 0xd084, 0x0170, 0x6104, 0x6208, 0x2061, - 0x1800, 0x6354, 0x6074, 0x789a, 0x60c0, 0x789e, 0x60bc, 0x78aa, - 0x012e, 0x0804, 0x368d, 0x900e, 0x2110, 0x0c88, 0x81ff, 0x1904, - 0x36bf, 0x080c, 0x779e, 0x0904, 0x36bf, 0x0126, 0x2091, 0x8000, - 0x6254, 0x6074, 0x9202, 0x0248, 0x9085, 0x0001, 0x080c, 0x26f5, - 0x080c, 0x5a7c, 0x012e, 0x0804, 0x368d, 0x012e, 0x0804, 0x36c2, - 0x0006, 0x0016, 0x00c6, 0x00e6, 0x2001, 0x19aa, 0x2070, 0x2061, - 0x1847, 0x6008, 0x2072, 0x900e, 0x2011, 0x1400, 0x080c, 0x955b, - 0x7206, 0x00ee, 0x00ce, 0x001e, 0x000e, 0x0005, 0x0126, 0x2091, - 0x8000, 0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, 0x0804, 0x368f, - 0x7884, 0xd0fc, 0x0158, 0x2001, 0x002a, 0x2004, 0x9005, 0x0180, - 0x9082, 0x00e1, 0x0298, 0x012e, 0x0804, 0x36c2, 0x2001, 0x002a, - 0x2004, 0x9005, 0x0128, 0x2069, 0x1847, 0x6908, 0x9102, 0x1230, - 0x012e, 0x0804, 0x36c2, 0x012e, 0x0804, 0x36bf, 0x080c, 0xb094, - 0x0dd0, 0x7884, 0xd0fc, 0x0904, 0x3c6d, 0x00c6, 0x080c, 0x4c41, - 0x00ce, 0x0d88, 0xa867, 0x0000, 0x7884, 0xa80a, 0x7898, 0xa80e, - 0x789c, 0xa812, 0x2001, 0x002e, 0x2004, 0xa81a, 0x2001, 0x002f, - 0x2004, 0xa81e, 0x2001, 0x0030, 0x2004, 0xa822, 0x2001, 0x0031, - 0x2004, 0xa826, 0x2001, 0x0034, 0x2004, 0xa82a, 0x2001, 0x0035, - 0x2004, 0xa82e, 0x2001, 0x002a, 0x2004, 0x9080, 0x0003, 0x9084, - 0x00fc, 0x8004, 0xa816, 0x080c, 0x3df7, 0x0928, 0x7014, 0x2048, - 0xad2c, 0xac28, 0xab1c, 0xaa18, 0xa930, 0xa808, 0xd0b4, 0x1120, - 0x2029, 0x0000, 0x2021, 0x0000, 0x8906, 0x8006, 0x8007, 0x90bc, - 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x080c, 0x4c8a, 0x701f, - 0x3d34, 0x7023, 0x0001, 0x012e, 0x0005, 0x080c, 0xacfc, 0x0046, - 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, - 0x080c, 0x3bd8, 0x2001, 0x19a0, 0x2003, 0x0000, 0x2021, 0x000a, - 0x2061, 0x0100, 0x6104, 0x0016, 0x60bb, 0x0000, 0x60bf, 0x32e1, - 0x60bf, 0x0012, 0x080c, 0x3e66, 0x080c, 0x3e25, 0x00f6, 0x00e6, - 0x0086, 0x2940, 0x2071, 0x19e8, 0x2079, 0x0090, 0x00d6, 0x2069, - 0x0000, 0x6884, 0xd0b4, 0x0140, 0x2001, 0x0035, 0x2004, 0x780e, - 0x2001, 0x0034, 0x2004, 0x780a, 0x00de, 0x2011, 0x0001, 0x080c, - 0x41db, 0x008e, 0x00ee, 0x00fe, 0x080c, 0x40fd, 0x080c, 0x402a, - 0x05b8, 0x2001, 0x020b, 0x2004, 0x9084, 0x0140, 0x1db8, 0x080c, - 0x424f, 0x00f6, 0x2079, 0x0300, 0x78bc, 0x00fe, 0x908c, 0x0070, - 0x1560, 0x2071, 0x0200, 0x7037, 0x0000, 0x7050, 0x9084, 0xff00, - 0x9086, 0x3200, 0x1510, 0x7037, 0x0001, 0x7050, 0x9084, 0xff00, - 0x9086, 0xe100, 0x11d0, 0x7037, 0x0000, 0x7054, 0x7037, 0x0000, - 0x715c, 0x9106, 0x1190, 0x2001, 0x1820, 0x2004, 0x9106, 0x1168, - 0x00c6, 0x2061, 0x0100, 0x6024, 0x9084, 0x1e00, 0x00ce, 0x0138, - 0x080c, 0x4034, 0x080c, 0x3e20, 0x0058, 0x080c, 0x3e20, 0x080c, - 0x4173, 0x080c, 0x40f3, 0x2001, 0x020b, 0x2004, 0xd0e4, 0x0dd8, - 0x2001, 0x032a, 0x2003, 0x0004, 0x2061, 0x0100, 0x6027, 0x0002, - 0x001e, 0x6106, 0x2011, 0x020d, 0x2013, 0x0020, 0x60bb, 0x0000, - 0x60bf, 0x0108, 0x60bf, 0x0012, 0x2001, 0x0004, 0x200c, 0x918c, - 0xfffd, 0x2102, 0x080c, 0x1352, 0x2009, 0x0028, 0x080c, 0x2220, - 0x2001, 0x0227, 0x200c, 0x2102, 0x080c, 0xad18, 0x00fe, 0x00ee, - 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x004e, 0x2001, - 0x19a0, 0x2004, 0x9005, 0x1118, 0x012e, 0x0804, 0x368d, 0x012e, - 0x2021, 0x400c, 0x0804, 0x368f, 0x0016, 0x0026, 0x0036, 0x0046, - 0x0056, 0x0076, 0x0086, 0x0096, 0x00d6, 0x0156, 0x7014, 0x2048, - 0x7020, 0x20a8, 0x8000, 0x7022, 0xa804, 0x9005, 0x0904, 0x3d90, - 0x2048, 0x1f04, 0x3d44, 0x7068, 0x2040, 0xa28c, 0xa390, 0xa494, - 0xa598, 0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021, - 0x0000, 0x0096, 0x7014, 0x2048, 0xa864, 0x009e, 0x9086, 0x0103, - 0x0170, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, - 0x9080, 0x001b, 0x080c, 0x4c8a, 0x701f, 0x3d34, 0x00b0, 0x8906, - 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, - 0x21a8, 0x27e0, 0x2098, 0x27e8, 0x20a0, 0x0006, 0x080c, 0x0fd6, - 0x000e, 0x080c, 0x4c8d, 0x701f, 0x3d34, 0x015e, 0x00de, 0x009e, - 0x008e, 0x007e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, - 0x7014, 0x2048, 0xa864, 0x9086, 0x0103, 0x1118, 0x701f, 0x3df5, - 0x0450, 0x7014, 0x2048, 0xa868, 0xc0fd, 0xa86a, 0x2009, 0x007f, - 0x080c, 0x6749, 0x0110, 0x9006, 0x0030, 0xb813, 0x00ff, 0xb817, - 0xfffd, 0x080c, 0xd409, 0x015e, 0x00de, 0x009e, 0x008e, 0x007e, - 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0904, 0x36bf, 0x0016, - 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, 0x0086, 0x0096, 0x00d6, - 0x0156, 0x701f, 0x3dc7, 0x7007, 0x0003, 0x0804, 0x3d85, 0xa830, - 0x9086, 0x0100, 0x2021, 0x400c, 0x0904, 0x368f, 0x0076, 0xad10, - 0xac0c, 0xab24, 0xaa20, 0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029, - 0x0000, 0x2021, 0x0000, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, - 0x9084, 0xffc0, 0x9080, 0x001b, 0x21a8, 0x27e0, 0x2098, 0x27e8, - 0x20a0, 0x0006, 0x080c, 0x0fd6, 0x000e, 0x080c, 0x4c8d, 0x007e, - 0x701f, 0x3d34, 0x7023, 0x0001, 0x0005, 0x0804, 0x368d, 0x0156, - 0x00c6, 0xa814, 0x908a, 0x001e, 0x0218, 0xa833, 0x001e, 0x0010, - 0xa832, 0x0078, 0x81ff, 0x0168, 0x0016, 0x080c, 0x4c41, 0x001e, - 0x0130, 0xa800, 0x2040, 0xa008, 0xa80a, 0x2100, 0x0c58, 0x9006, - 0x0010, 0x9085, 0x0001, 0x00ce, 0x015e, 0x0005, 0x0006, 0x00f6, - 0x2079, 0x0000, 0x7880, 0x9086, 0x0044, 0x00fe, 0x000e, 0x0005, - 0x2001, 0x19a0, 0x2003, 0x0001, 0x0005, 0x00f6, 0x00e6, 0x00c6, - 0x2061, 0x0200, 0x2001, 0x19ab, 0x2004, 0x601a, 0x2061, 0x0100, - 0x2001, 0x19aa, 0x2004, 0x60ce, 0x6104, 0xc1ac, 0x6106, 0x080c, - 0x4c41, 0xa813, 0x0019, 0xa817, 0x0001, 0x2900, 0xa85a, 0x2001, - 0x002e, 0x2004, 0xa866, 0x2001, 0x002f, 0x2004, 0xa86a, 0x2061, - 0x0090, 0x2079, 0x0100, 0x2001, 0x19aa, 0x2004, 0x6036, 0x2009, - 0x0040, 0x080c, 0x2220, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, - 0xa86e, 0x601a, 0xa873, 0x0000, 0x601f, 0x0000, 0x78ca, 0x9006, - 0x600a, 0x600e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00e6, 0x080c, - 0x4c41, 0x2940, 0xa013, 0x0019, 0xa017, 0x0001, 0x2800, 0xa05a, - 0x2001, 0x0030, 0x2004, 0xa866, 0x2001, 0x0031, 0x2004, 0xa86a, - 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e, 0xa873, 0x0000, - 0x2001, 0x032a, 0x2003, 0x0004, 0x2001, 0x0300, 0x2003, 0x0000, - 0x2001, 0x020d, 0x2003, 0x0000, 0x2001, 0x0004, 0x200c, 0x918d, - 0x0002, 0x2102, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x81ff, - 0x0148, 0x080c, 0x2a77, 0x1130, 0x9006, 0x080c, 0x29ca, 0x9006, - 0x080c, 0x29ad, 0x2001, 0x199f, 0x2003, 0x0000, 0x7884, 0x9084, - 0x0007, 0x0002, 0x3eb5, 0x3eb6, 0x3eb7, 0x3eb2, 0x3eb2, 0x3eb2, - 0x3eb2, 0x3eb2, 0x012e, 0x0804, 0x36c2, 0x0ce0, 0x0cd8, 0x080c, - 0x779e, 0x1128, 0x012e, 0x2009, 0x0016, 0x0804, 0x36bf, 0x81ff, - 0x0128, 0x012e, 0x2021, 0x400b, 0x0804, 0x368f, 0x2001, 0x0141, - 0x2004, 0xd0dc, 0x0db0, 0x080c, 0xacfc, 0x0086, 0x0096, 0x00a6, - 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x3bd8, 0x2009, - 0x0101, 0x210c, 0x0016, 0x7ec8, 0x7dcc, 0x9006, 0x2068, 0x2060, - 0x2058, 0x080c, 0x432a, 0x080c, 0x427a, 0x903e, 0x2720, 0x00f6, - 0x00e6, 0x0086, 0x2940, 0x2071, 0x19e8, 0x2079, 0x0090, 0x00d6, - 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0120, 0x68d4, 0x780e, 0x68d0, - 0x780a, 0x00de, 0x2011, 0x0001, 0x080c, 0x41db, 0x080c, 0x2a7f, - 0x080c, 0x2a7f, 0x080c, 0x2a7f, 0x080c, 0x2a7f, 0x080c, 0x41db, - 0x008e, 0x00ee, 0x00fe, 0x080c, 0x40fd, 0x2009, 0x9c40, 0x8109, - 0x11b0, 0x080c, 0x4034, 0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, - 0x2102, 0x001e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, - 0x009e, 0x008e, 0x2009, 0x0017, 0x080c, 0x36bf, 0x0cf8, 0x2001, - 0x020b, 0x2004, 0x9084, 0x0140, 0x1d10, 0x00f6, 0x2079, 0x0000, - 0x7884, 0x00fe, 0xd0bc, 0x0178, 0x2001, 0x0201, 0x200c, 0x81ff, - 0x0150, 0x080c, 0x40db, 0x2d00, 0x9c05, 0x9b05, 0x0120, 0x080c, - 0x4034, 0x0804, 0x3fdd, 0x080c, 0x424f, 0x080c, 0x4173, 0x080c, - 0x40be, 0x080c, 0x40f3, 0x00f6, 0x2079, 0x0100, 0x7824, 0xd0ac, - 0x0130, 0x8b58, 0x080c, 0x4034, 0x00fe, 0x0804, 0x3fdd, 0x00fe, - 0x080c, 0x402a, 0x1150, 0x8d68, 0x2001, 0x0032, 0x2602, 0x2001, - 0x0033, 0x2502, 0x080c, 0x4034, 0x0080, 0x87ff, 0x0138, 0x2001, - 0x0201, 0x2004, 0x9005, 0x1908, 0x8739, 0x0038, 0x2001, 0x1a6e, - 0x2004, 0x9086, 0x0000, 0x1904, 0x3f2d, 0x2001, 0x032f, 0x2003, - 0x00f6, 0x8631, 0x1208, 0x8529, 0x2500, 0x9605, 0x0904, 0x3fdd, - 0x7884, 0xd0bc, 0x0128, 0x2d00, 0x9c05, 0x9b05, 0x1904, 0x3fdd, - 0xa013, 0x0019, 0x2001, 0x032a, 0x2003, 0x0004, 0x7884, 0xd0ac, - 0x1148, 0x2001, 0x1a6e, 0x2003, 0x0003, 0x2001, 0x032a, 0x2003, - 0x0009, 0x0030, 0xa017, 0x0001, 0x78b4, 0x9005, 0x0108, 0xa016, - 0x2800, 0xa05a, 0x2009, 0x0040, 0x080c, 0x2220, 0x2900, 0xa85a, - 0xa813, 0x0019, 0x7884, 0xd0a4, 0x1180, 0xa817, 0x0000, 0x00c6, - 0x20a9, 0x0004, 0x2061, 0x0090, 0x602b, 0x0008, 0x2001, 0x0203, - 0x2004, 0x1f04, 0x3fb4, 0x00ce, 0x0030, 0xa817, 0x0001, 0x78b0, - 0x9005, 0x0108, 0xa816, 0x00f6, 0x00c6, 0x2079, 0x0100, 0x2061, - 0x0090, 0x7827, 0x0002, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, - 0x601a, 0x0006, 0x2001, 0x002b, 0x2004, 0x601e, 0x78c6, 0x000e, - 0x78ca, 0x00ce, 0x00fe, 0x0804, 0x3ee7, 0x001e, 0x00c6, 0x2001, - 0x032a, 0x2003, 0x0004, 0x2061, 0x0100, 0x6027, 0x0002, 0x6106, - 0x2011, 0x020d, 0x2013, 0x0020, 0x2001, 0x0004, 0x200c, 0x918c, - 0xfffd, 0x2102, 0x080c, 0x1352, 0x7884, 0x9084, 0x0003, 0x9086, - 0x0002, 0x01b0, 0x2009, 0x0028, 0x080c, 0x2220, 0x2001, 0x0227, - 0x200c, 0x2102, 0x6050, 0x9084, 0xb7ff, 0x080c, 0x2b29, 0x6052, - 0x602f, 0x0000, 0x604b, 0xf7f7, 0x6043, 0x0090, 0x6043, 0x0010, - 0x080c, 0xad18, 0x00ce, 0x2d08, 0x2c10, 0x2b18, 0x2b00, 0x9c05, - 0x9d05, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, - 0x008e, 0x1118, 0x012e, 0x0804, 0x368d, 0x012e, 0x2021, 0x400c, - 0x0804, 0x368f, 0x9085, 0x0001, 0x1d04, 0x4033, 0x2091, 0x6000, - 0x8420, 0x9486, 0x0064, 0x0005, 0x2001, 0x0105, 0x2003, 0x0010, - 0x2001, 0x032a, 0x2003, 0x0004, 0x2001, 0x1a6e, 0x2003, 0x0000, - 0x0071, 0x2009, 0x0048, 0x080c, 0x2220, 0x2001, 0x0227, 0x2024, - 0x2402, 0x2001, 0x0109, 0x2003, 0x4000, 0x9026, 0x0005, 0x00f6, - 0x00e6, 0x2071, 0x19e8, 0x7054, 0x9086, 0x0000, 0x0520, 0x2079, - 0x0090, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, - 0x1120, 0x2009, 0x0040, 0x080c, 0x2220, 0x782c, 0xd0fc, 0x0d88, - 0x080c, 0x424f, 0x7054, 0x9086, 0x0000, 0x1d58, 0x782b, 0x0004, - 0x782c, 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, 0x2220, 0x782b, - 0x0002, 0x7057, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079, - 0x0100, 0x2001, 0x1818, 0x200c, 0x7932, 0x7936, 0x080c, 0x26d5, - 0x080c, 0x2af6, 0x080c, 0x2b29, 0x784b, 0xf7f7, 0x7843, 0x0090, - 0x7843, 0x0010, 0x7850, 0xc0e5, 0x7852, 0x2019, 0x61a8, 0x7820, - 0xd09c, 0x0110, 0x8319, 0x1dd8, 0x7850, 0xc0e4, 0x7852, 0x2011, - 0x0048, 0x080c, 0x2ad3, 0x7843, 0x0040, 0x2019, 0x01f4, 0xa001, - 0xa001, 0x8319, 0x1de0, 0x2001, 0x0100, 0x080c, 0x2a99, 0x2011, - 0x0020, 0x080c, 0x2ad3, 0x7843, 0x0000, 0x9006, 0x080c, 0x2a99, - 0x2011, 0x0048, 0x080c, 0x2ad3, 0x00fe, 0x0005, 0x7884, 0xd0ac, - 0x11c8, 0x00f6, 0x00e6, 0x2071, 0x1a6e, 0x2079, 0x0320, 0x2001, - 0x0201, 0x2004, 0x9005, 0x0160, 0x7000, 0x9086, 0x0000, 0x1140, - 0x0051, 0xd0bc, 0x0108, 0x8738, 0x7003, 0x0003, 0x782b, 0x0019, - 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0300, 0x78bc, 0x00fe, - 0x908c, 0x0070, 0x0178, 0x2009, 0x0032, 0x260a, 0x2009, 0x0033, - 0x250a, 0xd0b4, 0x0108, 0x8c60, 0xd0ac, 0x0108, 0x8d68, 0xd0a4, - 0x0108, 0x8b58, 0x0005, 0x00f6, 0x2079, 0x0200, 0x781c, 0xd084, - 0x0110, 0x7837, 0x0050, 0x00fe, 0x0005, 0x00e6, 0x2071, 0x0100, - 0x2001, 0x19ab, 0x2004, 0x70e2, 0x080c, 0x3e16, 0x1188, 0x2001, - 0x1820, 0x2004, 0x2009, 0x181f, 0x210c, 0x918c, 0x00ff, 0x706e, - 0x716a, 0x7066, 0x918d, 0x3200, 0x7162, 0x7073, 0xe109, 0x0080, - 0x702c, 0x9085, 0x0002, 0x702e, 0x2009, 0x1818, 0x210c, 0x716e, - 0x7063, 0x0100, 0x7166, 0x719e, 0x706b, 0x0000, 0x7073, 0x0809, - 0x7077, 0x0008, 0x7078, 0x9080, 0x0100, 0x707a, 0x7080, 0x8000, - 0x7082, 0x7087, 0xaaaa, 0x9006, 0x708a, 0x708e, 0x707e, 0x70d6, - 0x70ab, 0x0036, 0x70af, 0x95d5, 0x7014, 0x9084, 0x1984, 0x9085, - 0x0092, 0x7016, 0x080c, 0x424f, 0x00f6, 0x2071, 0x1a6e, 0x2079, - 0x0320, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0120, 0x689c, - 0x780e, 0x6898, 0x780a, 0x00de, 0x080c, 0x3e16, 0x0140, 0x2001, - 0x199f, 0x200c, 0x2003, 0x0001, 0x918e, 0x0001, 0x0120, 0x2009, - 0x03e8, 0x8109, 0x1df0, 0x792c, 0xd1fc, 0x0110, 0x782b, 0x0004, - 0x2011, 0x0011, 0x080c, 0x41db, 0x2011, 0x0001, 0x080c, 0x41db, - 0x00fe, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a6e, 0x2079, - 0x0320, 0x792c, 0xd1fc, 0x0904, 0x41d8, 0x782b, 0x0002, 0x9026, - 0xd19c, 0x1904, 0x41d4, 0x7000, 0x0002, 0x41d8, 0x4189, 0x41b9, - 0x41d4, 0xd1bc, 0x1170, 0xd1dc, 0x1190, 0x8001, 0x7002, 0x2011, - 0x0001, 0x080c, 0x41db, 0x0904, 0x41d8, 0x080c, 0x41db, 0x0804, - 0x41d8, 0x00f6, 0x2079, 0x0300, 0x78bf, 0x0000, 0x00fe, 0x7810, - 0x7914, 0x782b, 0x0004, 0x7812, 0x7916, 0x2001, 0x0201, 0x200c, - 0x81ff, 0x0de8, 0x080c, 0x40db, 0x2009, 0x0001, 0x00f6, 0x2079, - 0x0300, 0x78b8, 0x00fe, 0xd0ec, 0x0110, 0x2009, 0x0011, 0x792a, - 0x00f8, 0x8001, 0x7002, 0x9184, 0x0880, 0x1140, 0x782c, 0xd0fc, - 0x1904, 0x417d, 0x2011, 0x0001, 0x00b1, 0x0090, 0xa010, 0x9092, - 0x0004, 0x9086, 0x0015, 0x1120, 0xa000, 0xa05a, 0x2011, 0x0031, - 0xa212, 0xd1dc, 0x1960, 0x0828, 0x782b, 0x0004, 0x7003, 0x0000, - 0x00ee, 0x00fe, 0x0005, 0xa014, 0x9005, 0x0550, 0x8001, 0x0036, - 0x0096, 0xa016, 0xa058, 0x2048, 0xa010, 0x2009, 0x0031, 0x911a, - 0x831c, 0x831c, 0x938a, 0x0007, 0x1a0c, 0x0d85, 0x9398, 0x4209, - 0x231d, 0x083f, 0x9080, 0x0004, 0x7a2a, 0x7100, 0x8108, 0x7102, - 0x009e, 0x003e, 0x908a, 0x0035, 0x1140, 0x0096, 0xa058, 0x2048, - 0xa804, 0xa05a, 0x2001, 0x0019, 0x009e, 0xa012, 0x9085, 0x0001, - 0x0005, 0x4246, 0x423d, 0x4234, 0x422b, 0x4222, 0x4219, 0x4210, - 0xa964, 0x7902, 0xa968, 0x7906, 0xa96c, 0x7912, 0xa970, 0x7916, - 0x0005, 0xa974, 0x7902, 0xa978, 0x7906, 0xa97c, 0x7912, 0xa980, - 0x7916, 0x0005, 0xa984, 0x7902, 0xa988, 0x7906, 0xa98c, 0x7912, - 0xa990, 0x7916, 0x0005, 0xa994, 0x7902, 0xa998, 0x7906, 0xa99c, - 0x7912, 0xa9a0, 0x7916, 0x0005, 0xa9a4, 0x7902, 0xa9a8, 0x7906, - 0xa9ac, 0x7912, 0xa9b0, 0x7916, 0x0005, 0xa9b4, 0x7902, 0xa9b8, - 0x7906, 0xa9bc, 0x7912, 0xa9c0, 0x7916, 0x0005, 0xa9c4, 0x7902, - 0xa9c8, 0x7906, 0xa9cc, 0x7912, 0xa9d0, 0x7916, 0x0005, 0x00f6, - 0x00e6, 0x0086, 0x2071, 0x19e8, 0x2079, 0x0090, 0x792c, 0xd1fc, - 0x01e8, 0x782b, 0x0002, 0x2940, 0x9026, 0x7054, 0x0002, 0x4276, - 0x4262, 0x426d, 0x8001, 0x7056, 0xd19c, 0x1180, 0x2011, 0x0001, - 0x080c, 0x41db, 0x190c, 0x41db, 0x0048, 0x8001, 0x7056, 0x782c, - 0xd0fc, 0x1d38, 0x2011, 0x0001, 0x080c, 0x41db, 0x008e, 0x00ee, - 0x00fe, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x2061, 0x0200, - 0x2001, 0x19ab, 0x2004, 0x601a, 0x2061, 0x0100, 0x2001, 0x19aa, - 0x2004, 0x60ce, 0x6104, 0xc1ac, 0x6106, 0x2001, 0x002c, 0x2004, - 0x9005, 0x0520, 0x2038, 0x2001, 0x002e, 0x2024, 0x2001, 0x002f, - 0x201c, 0x080c, 0x4c41, 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, - 0x978a, 0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, - 0x903e, 0x0096, 0xa858, 0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, - 0x080c, 0x42f2, 0x1d68, 0x2900, 0xa85a, 0x00d0, 0x080c, 0x4c41, - 0xa813, 0x0019, 0xa817, 0x0001, 0x2900, 0xa85a, 0x2001, 0x002e, - 0x2004, 0xa866, 0x2001, 0x002f, 0x2004, 0xa86a, 0x2001, 0x002a, - 0x2004, 0x9084, 0xfff8, 0xa86e, 0x2001, 0x002b, 0x2004, 0xa872, - 0x2061, 0x0090, 0x2079, 0x0100, 0x2001, 0x19aa, 0x2004, 0x6036, - 0x2009, 0x0040, 0x080c, 0x2220, 0x2001, 0x002a, 0x2004, 0x9084, - 0xfff8, 0x601a, 0x0006, 0x2001, 0x002b, 0x2004, 0x601e, 0x78c6, - 0x000e, 0x78ca, 0x9006, 0x600a, 0x600e, 0x008e, 0x00ce, 0x00ee, - 0x00fe, 0x0005, 0x00e6, 0x2071, 0x0080, 0xaa60, 0x22e8, 0x20a0, - 0x20e1, 0x0000, 0x2099, 0x0088, 0x702b, 0x0026, 0x7402, 0x7306, - 0x9006, 0x700a, 0x700e, 0x810b, 0x810b, 0x21a8, 0x810b, 0x7112, - 0x702b, 0x0041, 0x702c, 0xd0fc, 0x0de8, 0x702b, 0x0002, 0x702b, - 0x0040, 0x4005, 0x7400, 0x7304, 0x87ff, 0x0190, 0x0086, 0x0096, - 0x2940, 0x0086, 0x080c, 0x4c41, 0x008e, 0xa058, 0x00a6, 0x2050, - 0x2900, 0xb006, 0xa05a, 0x00ae, 0x009e, 0x008e, 0x9085, 0x0001, - 0x00ee, 0x0005, 0x00e6, 0x2001, 0x002d, 0x2004, 0x9005, 0x0528, - 0x2038, 0x2001, 0x0030, 0x2024, 0x2001, 0x0031, 0x201c, 0x080c, - 0x4c41, 0x2940, 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, - 0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, - 0x0096, 0xa858, 0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, - 0x42f2, 0x1d68, 0x2900, 0xa85a, 0x00d8, 0x080c, 0x4c41, 0x2940, - 0xa013, 0x0019, 0xa017, 0x0001, 0x2800, 0xa05a, 0x2001, 0x0030, - 0x2004, 0xa066, 0x2001, 0x0031, 0x2004, 0xa06a, 0x2001, 0x002a, - 0x2004, 0x9084, 0xfff8, 0xa06e, 0x2001, 0x002b, 0x2004, 0xa072, - 0x2001, 0x032a, 0x2003, 0x0004, 0x7884, 0xd0ac, 0x1180, 0x2001, - 0x0101, 0x200c, 0x918d, 0x0200, 0x2102, 0xa017, 0x0000, 0x2001, - 0x1a6e, 0x2003, 0x0003, 0x2001, 0x032a, 0x2003, 0x0009, 0x2001, - 0x0300, 0x2003, 0x0000, 0x2001, 0x020d, 0x2003, 0x0000, 0x2001, - 0x0004, 0x200c, 0x918d, 0x0002, 0x2102, 0x00ee, 0x0005, 0x0126, - 0x2091, 0x8000, 0x20a9, 0x0007, 0x20a1, 0x1840, 0x20e9, 0x0001, - 0x9006, 0x4004, 0x20a9, 0x0014, 0x20a1, 0xffec, 0x20e9, 0x0000, - 0x9006, 0x4004, 0x2009, 0x013c, 0x200a, 0x012e, 0x7880, 0x9086, - 0x0052, 0x0108, 0x0005, 0x0804, 0x368d, 0x7d98, 0x7c9c, 0x0804, - 0x3791, 0x080c, 0x779e, 0x190c, 0x6162, 0x6040, 0x9084, 0x0020, - 0x09b1, 0x2069, 0x1847, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, - 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x080c, 0x4c8a, 0x701f, 0x43d1, - 0x0005, 0x080c, 0x584f, 0x1130, 0x3b00, 0x3a08, 0xc194, 0xc095, - 0x20d8, 0x21d0, 0x2069, 0x1847, 0x6800, 0x9005, 0x0904, 0x36c2, - 0x2001, 0x180d, 0x2004, 0xd08c, 0x6804, 0x0118, 0xc0a4, 0xc0ac, - 0x6806, 0xd0ac, 0x0118, 0xd0a4, 0x0904, 0x36c2, 0xd094, 0x00c6, - 0x2061, 0x0100, 0x6104, 0x0138, 0x6200, 0x9292, 0x0005, 0x0218, - 0x918c, 0xffdf, 0x0010, 0x918d, 0x0020, 0x6106, 0x00ce, 0xd08c, - 0x00c6, 0x2061, 0x0100, 0x6104, 0x0118, 0x918d, 0x0010, 0x0010, - 0x918c, 0xffef, 0x6106, 0x00ce, 0xd084, 0x0158, 0x6a28, 0x928a, - 0x007f, 0x1a04, 0x36c2, 0x9288, 0x348e, 0x210d, 0x918c, 0x00ff, - 0x6166, 0xd0dc, 0x0130, 0x6828, 0x908a, 0x007f, 0x1a04, 0x36c2, - 0x605e, 0x6888, 0x9084, 0x0030, 0x8004, 0x8004, 0x8004, 0x8004, - 0x0006, 0x2009, 0x19b2, 0x9080, 0x27d0, 0x2005, 0x200a, 0x2008, - 0x2001, 0x0018, 0x080c, 0xaced, 0x2009, 0x0390, 0x200b, 0x0400, - 0x000e, 0x2009, 0x19b3, 0x9080, 0x27d4, 0x2005, 0x200a, 0x6808, - 0x908a, 0x0100, 0x0a04, 0x36c2, 0x908a, 0x0841, 0x1a04, 0x36c2, - 0x9084, 0x0007, 0x1904, 0x36c2, 0x680c, 0x9005, 0x0904, 0x36c2, - 0x6810, 0x9005, 0x0904, 0x36c2, 0x6848, 0x6940, 0x910a, 0x1a04, - 0x36c2, 0x8001, 0x0904, 0x36c2, 0x684c, 0x6944, 0x910a, 0x1a04, - 0x36c2, 0x8001, 0x0904, 0x36c2, 0x6814, 0x908c, 0x00ff, 0x614e, - 0x8007, 0x9084, 0x00ff, 0x6052, 0x080c, 0x7ae7, 0x080c, 0x6cfc, - 0x080c, 0x6d66, 0x6808, 0x602a, 0x080c, 0x2192, 0x2009, 0x0170, - 0x200b, 0x0080, 0xa001, 0xa001, 0x200b, 0x0000, 0x0036, 0x6b08, - 0x080c, 0x272f, 0x003e, 0x6000, 0x9086, 0x0000, 0x1904, 0x456d, - 0x6818, 0x691c, 0x6a20, 0x6b24, 0x8007, 0x810f, 0x8217, 0x831f, - 0x6016, 0x611a, 0x621e, 0x6322, 0x6c04, 0xd4f4, 0x0148, 0x6830, - 0x6934, 0x6a38, 0x6b3c, 0x8007, 0x810f, 0x8217, 0x831f, 0x0010, - 0x9084, 0xf0ff, 0x6006, 0x610a, 0x620e, 0x6312, 0x8007, 0x810f, - 0x8217, 0x831f, 0x20a9, 0x0004, 0x20a1, 0x19b4, 0x20e9, 0x0001, - 0x4001, 0x20a9, 0x0004, 0x20a1, 0x19ce, 0x20e9, 0x0001, 0x4001, - 0x080c, 0x8b26, 0x00c6, 0x900e, 0x20a9, 0x0001, 0x6b70, 0xd384, - 0x01c8, 0x0020, 0x839d, 0x12b0, 0x3508, 0x8109, 0x080c, 0x80fe, - 0x6878, 0x6016, 0x6874, 0x2008, 0x9084, 0xff00, 0x8007, 0x600a, - 0x9184, 0x00ff, 0x6006, 0x8108, 0x1118, 0x6003, 0x0003, 0x0010, - 0x6003, 0x0001, 0x1f04, 0x44c2, 0x00ce, 0x00c6, 0x2061, 0x199c, - 0x2001, 0x180d, 0x2004, 0xd08c, 0x11a8, 0x6a88, 0x9284, 0xc000, - 0x2010, 0x9286, 0x0000, 0x1158, 0x2063, 0x0000, 0x2001, 0x0001, - 0x080c, 0x29ca, 0x2001, 0x0001, 0x080c, 0x29ad, 0x0088, 0x9286, - 0x4000, 0x1148, 0x2063, 0x0001, 0x9006, 0x080c, 0x29ca, 0x9006, - 0x080c, 0x29ad, 0x0028, 0x9286, 0x8000, 0x1d30, 0x2063, 0x0002, - 0x00ce, 0x00e6, 0x2c70, 0x080c, 0x0ed3, 0x00ee, 0x080c, 0x2af6, - 0x080c, 0x2b29, 0x6888, 0xd0ec, 0x0130, 0x2011, 0x0114, 0x2204, - 0x9085, 0x0180, 0x2012, 0x6a80, 0x9284, 0x0030, 0x9086, 0x0030, - 0x1128, 0x9294, 0xffcf, 0x9295, 0x0020, 0x6a82, 0x2001, 0x197c, - 0x6a80, 0x9294, 0x0030, 0x928e, 0x0000, 0x0170, 0x928e, 0x0010, - 0x0118, 0x928e, 0x0020, 0x0140, 0x2003, 0xaaaa, 0x080c, 0x27a4, - 0x2001, 0x196d, 0x2102, 0x0008, 0x2102, 0x00c6, 0x2061, 0x0100, - 0x602f, 0x0040, 0x602f, 0x0000, 0x00ce, 0x080c, 0x779e, 0x0128, - 0x080c, 0x5128, 0x0110, 0x080c, 0x26f5, 0x60d4, 0x9005, 0x01c0, - 0x6003, 0x0001, 0x2009, 0x4555, 0x00e0, 0x080c, 0x779e, 0x1168, - 0x2011, 0x7612, 0x080c, 0x8993, 0x2011, 0x7605, 0x080c, 0x8a9f, - 0x080c, 0x7abb, 0x080c, 0x76cd, 0x0040, 0x080c, 0x6058, 0x0028, - 0x6003, 0x0004, 0x2009, 0x456d, 0x0020, 0x080c, 0x6b73, 0x0804, - 0x368d, 0x2001, 0x0170, 0x2004, 0x9084, 0x00ff, 0x9086, 0x004c, - 0x1118, 0x2091, 0x31bd, 0x0817, 0x2091, 0x313d, 0x0817, 0x6000, - 0x9086, 0x0000, 0x0904, 0x36bf, 0x2069, 0x1847, 0x7890, 0x6842, - 0x7894, 0x6846, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, - 0x7d98, 0x2039, 0x0001, 0x0804, 0x4c8d, 0x9006, 0x080c, 0x26f5, - 0x81ff, 0x1904, 0x36bf, 0x080c, 0x779e, 0x11b0, 0x080c, 0x7ab6, - 0x080c, 0x619d, 0x080c, 0x3482, 0x0118, 0x6130, 0xc18d, 0x6132, - 0x080c, 0xd645, 0x0130, 0x080c, 0x77c1, 0x1118, 0x080c, 0x7772, - 0x0038, 0x080c, 0x76cd, 0x0020, 0x080c, 0x6162, 0x080c, 0x6058, - 0x0804, 0x368d, 0x81ff, 0x1904, 0x36bf, 0x080c, 0x779e, 0x1110, - 0x0804, 0x36bf, 0x0126, 0x2091, 0x8000, 0x6194, 0x81ff, 0x0190, - 0x704f, 0x0000, 0x2001, 0x1d80, 0x2009, 0x0040, 0x7a8c, 0x7b88, - 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x080c, 0x4c8d, 0x701f, 0x368b, - 0x012e, 0x0005, 0x704f, 0x0001, 0x00d6, 0x2069, 0x1d80, 0x20a9, - 0x0040, 0x20e9, 0x0001, 0x20a1, 0x1d80, 0x2019, 0xffff, 0x4304, - 0x655c, 0x9588, 0x348e, 0x210d, 0x918c, 0x00ff, 0x216a, 0x900e, - 0x2011, 0x0002, 0x2100, 0x9506, 0x01a8, 0x080c, 0x67b4, 0x1190, - 0xb814, 0x821c, 0x0238, 0x9398, 0x1d80, 0x9085, 0xff00, 0x8007, - 0x201a, 0x0038, 0x9398, 0x1d80, 0x2324, 0x94a4, 0xff00, 0x9405, - 0x201a, 0x8210, 0x8108, 0x9182, 0x0080, 0x1208, 0x0c18, 0x8201, - 0x8007, 0x2d0c, 0x9105, 0x206a, 0x00de, 0x20a9, 0x0040, 0x20a1, - 0x1d80, 0x2099, 0x1d80, 0x080c, 0x60ed, 0x0804, 0x45ca, 0x080c, - 0x4c74, 0x0904, 0x36c2, 0x080c, 0x4c41, 0x1120, 0x2009, 0x0002, - 0x0804, 0x36bf, 0x080c, 0x5840, 0xd0b4, 0x0558, 0x7884, 0x908e, - 0x007e, 0x0538, 0x908e, 0x007f, 0x0520, 0x908e, 0x0080, 0x0508, - 0x080c, 0x347d, 0x1148, 0xb800, 0xd08c, 0x11d8, 0xb804, 0x9084, - 0x00ff, 0x9086, 0x0006, 0x11a8, 0xa867, 0x0000, 0xa868, 0xc0fd, - 0xa86a, 0x080c, 0xd0ec, 0x1120, 0x2009, 0x0003, 0x0804, 0x36bf, - 0x7007, 0x0003, 0x701f, 0x4655, 0x0005, 0x080c, 0x4c74, 0x0904, - 0x36c2, 0x20a9, 0x002b, 0xb8c4, 0x20e0, 0xb8c8, 0x2098, 0xa860, - 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008, - 0x9080, 0x0006, 0x20a0, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x0006, - 0x2098, 0x080c, 0x0fd6, 0x0070, 0x20a9, 0x0004, 0xa85c, 0x9080, - 0x000a, 0x20a0, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x000a, 0x2098, - 0x080c, 0x0fd6, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, - 0xffc0, 0x9080, 0x0002, 0x2009, 0x002b, 0x7a8c, 0x7b88, 0x7c9c, - 0x7d98, 0x0804, 0x4c8d, 0x81ff, 0x1904, 0x36bf, 0x080c, 0x4c58, - 0x0904, 0x36c2, 0x080c, 0x6a00, 0x0904, 0x36bf, 0x0058, 0xa878, - 0x9005, 0x0120, 0x2009, 0x0004, 0x0804, 0x36bf, 0xa974, 0xaa94, - 0x0804, 0x368d, 0x080c, 0x5848, 0x0904, 0x368d, 0x701f, 0x469f, - 0x7007, 0x0003, 0x0005, 0x81ff, 0x1904, 0x36bf, 0x7888, 0x908a, - 0x1000, 0x1a04, 0x36c2, 0x080c, 0x4c74, 0x0904, 0x36c2, 0x080c, - 0x6c11, 0x0120, 0x080c, 0x6c19, 0x1904, 0x36c2, 0x080c, 0x6a85, - 0x0904, 0x36bf, 0x2019, 0x0004, 0x900e, 0x080c, 0x6a12, 0x0904, - 0x36bf, 0x7984, 0x7a88, 0x04c9, 0x08a8, 0xa89c, 0x908a, 0x1000, - 0x12f8, 0x080c, 0x4c72, 0x01e0, 0x080c, 0x6c11, 0x0118, 0x080c, - 0x6c19, 0x11b0, 0x080c, 0x6a85, 0x2009, 0x0002, 0x0168, 0x2009, - 0x0002, 0x2019, 0x0004, 0x080c, 0x6a12, 0x2009, 0x0003, 0x0120, - 0xa998, 0xaa9c, 0x00d1, 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010, - 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, - 0xa897, 0x4000, 0x080c, 0x5848, 0x0110, 0x9006, 0x0018, 0x900e, - 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x9186, 0x00ff, 0x0110, - 0x0071, 0x0060, 0x2029, 0x007e, 0x2061, 0x1800, 0x645c, 0x2400, - 0x9506, 0x0110, 0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005, 0x080c, - 0x67b4, 0x1138, 0x2200, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, - 0x89a1, 0x0005, 0x81ff, 0x1904, 0x36bf, 0x798c, 0x2001, 0x1980, - 0x918c, 0x8000, 0x2102, 0x080c, 0x4c58, 0x0904, 0x36c2, 0x080c, - 0x6c11, 0x0120, 0x080c, 0x6c19, 0x1904, 0x36c2, 0x080c, 0x687b, - 0x0904, 0x36bf, 0x080c, 0x6a09, 0x0904, 0x36bf, 0x2001, 0x1980, - 0x2004, 0xd0fc, 0x1904, 0x368d, 0x0804, 0x46aa, 0xa9a0, 0x2001, - 0x1980, 0x918c, 0x8000, 0xc18d, 0x2102, 0x080c, 0x4c65, 0x01a0, - 0x080c, 0x6c11, 0x0118, 0x080c, 0x6c19, 0x1170, 0x080c, 0x687b, - 0x2009, 0x0002, 0x0128, 0x080c, 0x6a09, 0x1170, 0x2009, 0x0003, - 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, - 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x2001, 0x1980, - 0x2004, 0xd0fc, 0x1128, 0x080c, 0x5848, 0x0110, 0x9006, 0x0018, - 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x81ff, 0x1904, - 0x36bf, 0x798c, 0x2001, 0x197f, 0x918c, 0x8000, 0x2102, 0x080c, - 0x4c58, 0x0904, 0x36c2, 0x080c, 0x6c11, 0x0120, 0x080c, 0x6c19, - 0x1904, 0x36c2, 0x080c, 0x687b, 0x0904, 0x36bf, 0x080c, 0x69f7, - 0x0904, 0x36bf, 0x2001, 0x197f, 0x2004, 0xd0fc, 0x1904, 0x368d, - 0x0804, 0x46aa, 0xa9a0, 0x2001, 0x197f, 0x918c, 0x8000, 0xc18d, - 0x2102, 0x080c, 0x4c65, 0x01a0, 0x080c, 0x6c11, 0x0118, 0x080c, - 0x6c19, 0x1170, 0x080c, 0x687b, 0x2009, 0x0002, 0x0128, 0x080c, - 0x69f7, 0x1170, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, - 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, - 0xa897, 0x4000, 0x2001, 0x197f, 0x2004, 0xd0fc, 0x1128, 0x080c, - 0x5848, 0x0110, 0x9006, 0x0018, 0x900e, 0x9085, 0x0001, 0x2001, - 0x0000, 0x0005, 0x6100, 0x0804, 0x368d, 0x080c, 0x4c74, 0x0904, - 0x36c2, 0x080c, 0x5854, 0x1904, 0x36bf, 0x79a8, 0xd184, 0x1158, - 0xb834, 0x8007, 0x789e, 0xb830, 0x8007, 0x789a, 0xbb2c, 0x831f, - 0xba28, 0x8217, 0x0050, 0xb824, 0x8007, 0x789e, 0xb820, 0x8007, - 0x789a, 0xbb1c, 0x831f, 0xba18, 0x8217, 0xb900, 0x918c, 0x0202, - 0x0804, 0x368d, 0x78a8, 0x909c, 0x0003, 0xd0ac, 0x1150, 0xd0b4, - 0x1140, 0x939a, 0x0003, 0x1a04, 0x36bf, 0x625c, 0x7884, 0x9206, - 0x1548, 0x080c, 0x8b10, 0x2001, 0xffec, 0x2009, 0x000c, 0x7a8c, - 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0000, 0x0006, 0x78a8, 0x9084, - 0x0080, 0x1118, 0x000e, 0x0804, 0x4c8d, 0x000e, 0x2031, 0x0000, - 0x2061, 0x18b8, 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, - 0xa392, 0xa496, 0xa59a, 0x080c, 0x114e, 0x7007, 0x0002, 0x701f, - 0x4862, 0x0005, 0x81ff, 0x1904, 0x36bf, 0x080c, 0x4c74, 0x0904, - 0x36c2, 0x080c, 0x6c11, 0x1904, 0x36bf, 0x00c6, 0x080c, 0x4c41, - 0x00ce, 0x0904, 0x36bf, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, - 0x7ea8, 0x080c, 0xd092, 0x0904, 0x36bf, 0x7007, 0x0003, 0x701f, - 0x4866, 0x0005, 0x080c, 0x4397, 0x0804, 0x368d, 0xa830, 0x9086, - 0x0100, 0x0904, 0x36bf, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, - 0x9084, 0xffc0, 0x9080, 0x001b, 0x2009, 0x000c, 0x7a8c, 0x7b88, - 0x7c9c, 0x7d98, 0x0804, 0x4c8d, 0x9006, 0x080c, 0x26f5, 0x78a8, - 0x9084, 0x00ff, 0x9086, 0x00ff, 0x0118, 0x81ff, 0x1904, 0x36bf, - 0x080c, 0x779e, 0x0110, 0x080c, 0x6162, 0x7888, 0x908a, 0x1000, - 0x1a04, 0x36c2, 0x7984, 0x9186, 0x00ff, 0x0138, 0x9182, 0x007f, - 0x1a04, 0x36c2, 0x2100, 0x080c, 0x26bf, 0x0026, 0x00c6, 0x0126, - 0x2091, 0x8000, 0x2061, 0x1a04, 0x601b, 0x0000, 0x601f, 0x0000, - 0x607b, 0x0000, 0x607f, 0x0000, 0x080c, 0x779e, 0x1158, 0x080c, - 0x7ab6, 0x080c, 0x619d, 0x9085, 0x0001, 0x080c, 0x77e2, 0x080c, - 0x76cd, 0x00f0, 0x080c, 0xacfc, 0x080c, 0xb09b, 0x080c, 0xad18, - 0x2061, 0x0100, 0x2001, 0x1818, 0x2004, 0x9084, 0x00ff, 0x810f, - 0x9105, 0x604a, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x1999, - 0x200b, 0x0000, 0x2009, 0x002d, 0x2011, 0x6088, 0x080c, 0x8a5d, - 0x7984, 0x080c, 0x779e, 0x1110, 0x2009, 0x00ff, 0x7a88, 0x080c, - 0x470d, 0x012e, 0x00ce, 0x002e, 0x0804, 0x368d, 0x7984, 0x080c, - 0x6749, 0x2b08, 0x1904, 0x36c2, 0x0804, 0x368d, 0x81ff, 0x0120, - 0x2009, 0x0001, 0x0804, 0x36bf, 0x60dc, 0xd0ac, 0x1130, 0xd09c, - 0x1120, 0x2009, 0x0005, 0x0804, 0x36bf, 0x080c, 0x4c41, 0x1120, - 0x2009, 0x0002, 0x0804, 0x36bf, 0x7984, 0x81ff, 0x0904, 0x36c2, - 0x9192, 0x0021, 0x1a04, 0x36c2, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, - 0xa85c, 0x9080, 0x0019, 0x702a, 0xaf60, 0x7736, 0x080c, 0x4c8a, - 0x701f, 0x4921, 0x7880, 0x9086, 0x006e, 0x0110, 0x701f, 0x52da, - 0x0005, 0x2009, 0x0080, 0x080c, 0x67b4, 0x1118, 0x080c, 0x6c11, - 0x0120, 0x2021, 0x400a, 0x0804, 0x368f, 0x00d6, 0x0096, 0xa964, - 0xaa6c, 0xab70, 0xac74, 0xad78, 0xae7c, 0xa884, 0x90be, 0x0100, - 0x0904, 0x49ba, 0x90be, 0x0112, 0x0904, 0x49ba, 0x90be, 0x0113, - 0x0904, 0x49ba, 0x90be, 0x0114, 0x0904, 0x49ba, 0x90be, 0x0117, - 0x0904, 0x49ba, 0x90be, 0x011a, 0x0904, 0x49ba, 0x90be, 0x011c, - 0x0904, 0x49ba, 0x90be, 0x0121, 0x0904, 0x49a1, 0x90be, 0x0131, - 0x0904, 0x49a1, 0x90be, 0x0171, 0x0904, 0x49ba, 0x90be, 0x0173, - 0x0904, 0x49ba, 0x90be, 0x01a1, 0x1128, 0xa894, 0x8007, 0xa896, - 0x0804, 0x49c5, 0x90be, 0x0212, 0x0904, 0x49ae, 0x90be, 0x0213, - 0x05e8, 0x90be, 0x0214, 0x0500, 0x90be, 0x0217, 0x0188, 0x90be, - 0x021a, 0x1120, 0xa89c, 0x8007, 0xa89e, 0x04e0, 0x90be, 0x021f, - 0x05c8, 0x90be, 0x0300, 0x05b0, 0x009e, 0x00de, 0x0804, 0x36c2, - 0x7028, 0x9080, 0x0010, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, - 0x20a9, 0x0007, 0x080c, 0x4a03, 0x7028, 0x9080, 0x000e, 0x2098, - 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x4a03, - 0x00c8, 0x7028, 0x9080, 0x000c, 0x2098, 0x20a0, 0x7034, 0x20e0, - 0x20e8, 0x20a9, 0x0001, 0x080c, 0x4a10, 0x00b8, 0x7028, 0x9080, - 0x000e, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, - 0x080c, 0x4a10, 0x7028, 0x9080, 0x000c, 0x2098, 0x20a0, 0x7034, - 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x04f1, 0x00c6, 0x080c, 0x4c41, - 0x0550, 0xa868, 0xc0fd, 0xa86a, 0xa867, 0x0119, 0x9006, 0xa882, - 0xa87f, 0x0020, 0xa88b, 0x0001, 0x810b, 0xa9ae, 0xa8b2, 0xaab6, - 0xabba, 0xacbe, 0xadc2, 0xa9c6, 0xa8ca, 0x00ce, 0x009e, 0x00de, - 0xa866, 0xa822, 0xa868, 0xc0fd, 0xa86a, 0xa804, 0x2048, 0x080c, - 0xd0ad, 0x1120, 0x2009, 0x0003, 0x0804, 0x36bf, 0x7007, 0x0003, - 0x701f, 0x49fa, 0x0005, 0x00ce, 0x009e, 0x00de, 0x2009, 0x0002, - 0x0804, 0x36bf, 0xa820, 0x9086, 0x8001, 0x1904, 0x368d, 0x2009, - 0x0004, 0x0804, 0x36bf, 0x0016, 0x0026, 0x3510, 0x20a9, 0x0002, - 0x4002, 0x4104, 0x4004, 0x8211, 0x1dc8, 0x002e, 0x001e, 0x0005, - 0x0016, 0x0026, 0x0036, 0x0046, 0x3520, 0x20a9, 0x0004, 0x4002, - 0x4304, 0x4204, 0x4104, 0x4004, 0x8421, 0x1db8, 0x004e, 0x003e, - 0x002e, 0x001e, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, - 0x36bf, 0x60dc, 0xd0ac, 0x1188, 0x2009, 0x180d, 0x210c, 0xd18c, - 0x0130, 0xd09c, 0x0120, 0x2009, 0x0016, 0x0804, 0x36bf, 0xd09c, - 0x1120, 0x2009, 0x0005, 0x0804, 0x36bf, 0x7984, 0x78a8, 0x2040, - 0x080c, 0xb094, 0x1120, 0x9182, 0x007f, 0x0a04, 0x36c2, 0x9186, - 0x00ff, 0x0904, 0x36c2, 0x9182, 0x0800, 0x1a04, 0x36c2, 0x7a8c, - 0x7b88, 0x607c, 0x9306, 0x1158, 0x6080, 0x924e, 0x0904, 0x36c2, - 0x080c, 0xb094, 0x1120, 0x99cc, 0xff00, 0x0904, 0x36c2, 0x0126, - 0x2091, 0x8000, 0x2001, 0x180d, 0x2004, 0xd08c, 0x0198, 0x9386, - 0x00ff, 0x0180, 0x0026, 0x2011, 0x8008, 0x080c, 0x6c35, 0x002e, - 0x0148, 0x918d, 0x8000, 0x080c, 0x6c7f, 0x1120, 0x2001, 0x4009, - 0x0804, 0x4ac1, 0x080c, 0x4b54, 0x0904, 0x4ac7, 0x0086, 0x90c6, - 0x4000, 0x008e, 0x1538, 0x00c6, 0x0006, 0x0036, 0xb818, 0xbb1c, - 0x9305, 0xbb20, 0x9305, 0xbb24, 0x9305, 0xbb28, 0x9305, 0xbb2c, - 0x9305, 0xbb30, 0x9305, 0xbb34, 0x9305, 0x003e, 0x0570, 0xd88c, - 0x1128, 0x080c, 0x6c11, 0x0110, 0xc89d, 0x0438, 0x900e, 0x080c, - 0x6aae, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x000e, - 0x00ce, 0x00b8, 0x90c6, 0x4007, 0x1110, 0x2408, 0x0090, 0x90c6, - 0x4008, 0x1118, 0x2708, 0x2610, 0x0060, 0x90c6, 0x4009, 0x1108, - 0x0040, 0x90c6, 0x4006, 0x1108, 0x0020, 0x2001, 0x4005, 0x2009, - 0x000a, 0x2020, 0x012e, 0x0804, 0x368f, 0x000e, 0x00ce, 0x2b00, - 0x7026, 0x0016, 0x00b6, 0x00c6, 0x00e6, 0x2c70, 0x080c, 0xb1dd, - 0x0904, 0x4b1c, 0x2b00, 0x6012, 0x080c, 0xd3b6, 0x2e58, 0x00ee, - 0x00e6, 0x00c6, 0x080c, 0x4c41, 0x00ce, 0x2b70, 0x1158, 0x080c, - 0xb16c, 0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, 0x2009, 0x0002, - 0x0804, 0x36bf, 0x900e, 0xa966, 0xa96a, 0x2900, 0x6016, 0xa932, - 0xa868, 0xc0fd, 0xd88c, 0x0108, 0xc0f5, 0xa86a, 0xd89c, 0x1110, - 0x080c, 0x3315, 0x6023, 0x0001, 0x9006, 0x080c, 0x66e6, 0xd89c, - 0x0138, 0x2001, 0x0004, 0x080c, 0x66fa, 0x2009, 0x0003, 0x0030, - 0x2001, 0x0002, 0x080c, 0x66fa, 0x2009, 0x0002, 0x080c, 0xb20a, - 0x78a8, 0xd094, 0x0138, 0x00ee, 0x7024, 0x00e6, 0x2058, 0xb8d4, - 0xc08d, 0xb8d6, 0x9085, 0x0001, 0x00ee, 0x00ce, 0x00be, 0x001e, - 0x012e, 0x1120, 0x2009, 0x0003, 0x0804, 0x36bf, 0x7007, 0x0003, - 0x701f, 0x4b2b, 0x0005, 0xa830, 0x2009, 0x180d, 0x210c, 0xd18c, - 0x0140, 0x2008, 0x918e, 0xdead, 0x1120, 0x2021, 0x4009, 0x0804, - 0x368f, 0x9086, 0x0100, 0x7024, 0x2058, 0x1138, 0x2009, 0x0004, - 0xba04, 0x9294, 0x00ff, 0x0804, 0x578e, 0x900e, 0xa868, 0xd0f4, - 0x1904, 0x368d, 0x080c, 0x6aae, 0x1108, 0xc185, 0xb800, 0xd0bc, - 0x0108, 0xc18d, 0x0804, 0x368d, 0x00e6, 0x00d6, 0x0096, 0x83ff, - 0x0904, 0x4ba3, 0x902e, 0x080c, 0xb094, 0x0130, 0x9026, 0x20a9, - 0x0800, 0x2071, 0x1000, 0x0030, 0x2021, 0x007f, 0x20a9, 0x0781, - 0x2071, 0x107f, 0x2e04, 0x9005, 0x11b8, 0x2100, 0x9406, 0x1904, - 0x4bb4, 0x2428, 0x94ce, 0x007f, 0x1120, 0x92ce, 0xfffd, 0x1558, - 0x0030, 0x94ce, 0x0080, 0x1130, 0x92ce, 0xfffc, 0x1520, 0x93ce, - 0x00ff, 0x1508, 0xc5fd, 0x0480, 0x2058, 0xbf10, 0x2700, 0x9306, - 0x11e8, 0xbe14, 0x2600, 0x9206, 0x11c8, 0x2400, 0x9106, 0x1180, - 0xd884, 0x0598, 0xd894, 0x1588, 0x080c, 0x6bb1, 0x1570, 0x2001, - 0x4000, 0x0460, 0x080c, 0x6c11, 0x1540, 0x2001, 0x4000, 0x0430, - 0x2001, 0x4007, 0x0418, 0x2001, 0x4006, 0x0400, 0x2400, 0x9106, - 0x1158, 0xbe14, 0x87ff, 0x1128, 0x86ff, 0x0918, 0x080c, 0xb094, - 0x1900, 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, 0x1f04, 0x4b6a, - 0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, 0x2001, 0x0001, 0x0030, - 0x080c, 0x6749, 0x1dd0, 0xbb12, 0xba16, 0x9006, 0x9005, 0x009e, - 0x00de, 0x00ee, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, - 0x36bf, 0x080c, 0x4c41, 0x1120, 0x2009, 0x0002, 0x0804, 0x36bf, - 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7884, 0x9005, 0x0904, - 0x36c2, 0x9096, 0x00ff, 0x0120, 0x9092, 0x0004, 0x1a04, 0x36c2, - 0x2010, 0x2918, 0x080c, 0x32b5, 0x1120, 0x2009, 0x0003, 0x0804, - 0x36bf, 0x7007, 0x0003, 0x701f, 0x4bf6, 0x0005, 0xa830, 0x9086, - 0x0100, 0x1904, 0x368d, 0x2009, 0x0004, 0x0804, 0x36bf, 0x7984, - 0x080c, 0xb094, 0x1120, 0x9182, 0x007f, 0x0a04, 0x36c2, 0x9186, - 0x00ff, 0x0904, 0x36c2, 0x9182, 0x0800, 0x1a04, 0x36c2, 0x2001, - 0x9400, 0x080c, 0x57e9, 0x1904, 0x36bf, 0x0804, 0x368d, 0xa998, - 0x080c, 0xb094, 0x1118, 0x9182, 0x007f, 0x0280, 0x9186, 0x00ff, - 0x0168, 0x9182, 0x0800, 0x1250, 0x2001, 0x9400, 0x080c, 0x57e9, - 0x11a8, 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, - 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, - 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x2009, 0x000a, - 0x0c48, 0x080c, 0x1059, 0x0198, 0x9006, 0xa802, 0x7014, 0x9005, - 0x1120, 0x2900, 0x7016, 0x701a, 0x0040, 0x7018, 0xa802, 0x0086, - 0x2040, 0x2900, 0xa006, 0x701a, 0x008e, 0x9085, 0x0001, 0x0005, - 0x7984, 0x080c, 0x67b4, 0x1130, 0x7e88, 0x9684, 0x3fff, 0x9082, - 0x4000, 0x0208, 0x905e, 0x8bff, 0x0005, 0xa998, 0x080c, 0x67b4, - 0x1130, 0xae9c, 0x9684, 0x3fff, 0x9082, 0x4000, 0x0208, 0x905e, - 0x8bff, 0x0005, 0xae98, 0x0008, 0x7e84, 0x2608, 0x080c, 0x67b4, - 0x1108, 0x0008, 0x905e, 0x8bff, 0x0005, 0x0016, 0x7114, 0x81ff, - 0x0128, 0x2148, 0xa904, 0x080c, 0x108b, 0x0cc8, 0x7116, 0x711a, - 0x001e, 0x0005, 0x2031, 0x0001, 0x0010, 0x2031, 0x0000, 0x2061, - 0x18b8, 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, 0xa392, - 0xa496, 0xa59a, 0x080c, 0x114e, 0x7007, 0x0002, 0x701f, 0x368d, - 0x0005, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0000, 0x2001, - 0x18b0, 0x2004, 0x9005, 0x1190, 0x0e04, 0x4cbe, 0x7a36, 0x7833, - 0x0012, 0x7a82, 0x7b86, 0x7c8a, 0x2091, 0x4080, 0x2001, 0x0089, - 0x2004, 0xd084, 0x190c, 0x1200, 0x0804, 0x4d24, 0x0016, 0x0086, - 0x0096, 0x00c6, 0x00e6, 0x2071, 0x189e, 0x7044, 0x9005, 0x1540, - 0x7148, 0x9182, 0x0010, 0x0288, 0x7038, 0x2060, 0x080c, 0x1059, - 0x0904, 0x4d1c, 0xa84b, 0x0000, 0x2900, 0x7046, 0x2001, 0x0002, - 0x9080, 0x1ec1, 0x2005, 0xa846, 0x0098, 0x7038, 0x90e0, 0x0004, - 0x2001, 0x18ba, 0x9c82, 0x18fa, 0x0210, 0x2061, 0x18ba, 0x2c00, - 0x703a, 0x7148, 0x81ff, 0x1108, 0x703e, 0x8108, 0x714a, 0x0460, - 0x7148, 0x8108, 0x714a, 0x7044, 0x2040, 0xa144, 0x2105, 0x0016, - 0x908a, 0x0036, 0x1a0c, 0x0d85, 0x2060, 0x001e, 0x8108, 0x2105, - 0x9005, 0xa146, 0x1520, 0x080c, 0x1059, 0x1130, 0x8109, 0xa946, - 0x7148, 0x8109, 0x714a, 0x00d8, 0x9006, 0xa806, 0xa84a, 0xa046, - 0x2800, 0xa802, 0x2900, 0xa006, 0x7046, 0x2001, 0x0002, 0x9080, - 0x1ec1, 0x2005, 0xa846, 0x0058, 0x2262, 0x6306, 0x640a, 0x00ee, - 0x00ce, 0x009e, 0x008e, 0x001e, 0x012e, 0x00fe, 0x0005, 0x2c00, - 0x9082, 0x001b, 0x0002, 0x4d46, 0x4d46, 0x4d48, 0x4d46, 0x4d46, - 0x4d46, 0x4d4c, 0x4d46, 0x4d46, 0x4d46, 0x4d50, 0x4d46, 0x4d46, - 0x4d46, 0x4d54, 0x4d46, 0x4d46, 0x4d46, 0x4d58, 0x4d46, 0x4d46, - 0x4d46, 0x4d5c, 0x4d46, 0x4d46, 0x4d46, 0x4d61, 0x080c, 0x0d85, - 0xa276, 0xa37a, 0xa47e, 0x0898, 0xa286, 0xa38a, 0xa48e, 0x0878, - 0xa296, 0xa39a, 0xa49e, 0x0858, 0xa2a6, 0xa3aa, 0xa4ae, 0x0838, - 0xa2b6, 0xa3ba, 0xa4be, 0x0818, 0xa2c6, 0xa3ca, 0xa4ce, 0x0804, - 0x4d1f, 0xa2d6, 0xa3da, 0xa4de, 0x0804, 0x4d1f, 0x00e6, 0x2071, - 0x189e, 0x7048, 0x9005, 0x0904, 0x4df8, 0x0126, 0x2091, 0x8000, - 0x0e04, 0x4df7, 0x00f6, 0x2079, 0x0000, 0x00c6, 0x0096, 0x0086, - 0x0076, 0x9006, 0x2038, 0x7040, 0x2048, 0x9005, 0x0500, 0xa948, - 0x2105, 0x0016, 0x908a, 0x0036, 0x1a0c, 0x0d85, 0x2060, 0x001e, - 0x8108, 0x2105, 0x9005, 0xa94a, 0x1904, 0x4dfa, 0xa804, 0x9005, - 0x090c, 0x0d85, 0x7042, 0x2938, 0x2040, 0xa003, 0x0000, 0x2001, - 0x0002, 0x9080, 0x1ec1, 0x2005, 0xa04a, 0x0804, 0x4dfa, 0x703c, - 0x2060, 0x2c14, 0x6304, 0x6408, 0x650c, 0x2200, 0x7836, 0x7833, - 0x0012, 0x7882, 0x2300, 0x7886, 0x2400, 0x788a, 0x2091, 0x4080, - 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1200, 0x87ff, 0x0118, - 0x2748, 0x080c, 0x108b, 0x7048, 0x8001, 0x704a, 0x9005, 0x1170, - 0x7040, 0x2048, 0x9005, 0x0128, 0x080c, 0x108b, 0x9006, 0x7042, - 0x7046, 0x703b, 0x18ba, 0x703f, 0x18ba, 0x0420, 0x7040, 0x9005, - 0x1508, 0x7238, 0x2c00, 0x9206, 0x0148, 0x9c80, 0x0004, 0x90fa, - 0x18fa, 0x0210, 0x2001, 0x18ba, 0x703e, 0x00a0, 0x9006, 0x703e, - 0x703a, 0x7044, 0x9005, 0x090c, 0x0d85, 0x2048, 0xa800, 0x9005, - 0x1de0, 0x2900, 0x7042, 0x2001, 0x0002, 0x9080, 0x1ec1, 0x2005, - 0xa84a, 0x0000, 0x007e, 0x008e, 0x009e, 0x00ce, 0x00fe, 0x012e, - 0x00ee, 0x0005, 0x2c00, 0x9082, 0x001b, 0x0002, 0x4e19, 0x4e19, - 0x4e1b, 0x4e19, 0x4e19, 0x4e19, 0x4e20, 0x4e19, 0x4e19, 0x4e19, - 0x4e25, 0x4e19, 0x4e19, 0x4e19, 0x4e2a, 0x4e19, 0x4e19, 0x4e19, - 0x4e2f, 0x4e19, 0x4e19, 0x4e19, 0x4e34, 0x4e19, 0x4e19, 0x4e19, - 0x4e39, 0x080c, 0x0d85, 0xaa74, 0xab78, 0xac7c, 0x0804, 0x4da5, - 0xaa84, 0xab88, 0xac8c, 0x0804, 0x4da5, 0xaa94, 0xab98, 0xac9c, - 0x0804, 0x4da5, 0xaaa4, 0xaba8, 0xacac, 0x0804, 0x4da5, 0xaab4, - 0xabb8, 0xacbc, 0x0804, 0x4da5, 0xaac4, 0xabc8, 0xaccc, 0x0804, - 0x4da5, 0xaad4, 0xabd8, 0xacdc, 0x0804, 0x4da5, 0x0016, 0x0026, - 0x0036, 0x00b6, 0x00c6, 0x2009, 0x007e, 0x080c, 0x67b4, 0x2019, - 0x0001, 0xb85c, 0xd0ac, 0x0110, 0x2019, 0x0000, 0x2011, 0x801b, - 0x080c, 0x4ca1, 0x00ce, 0x00be, 0x003e, 0x002e, 0x001e, 0x0005, - 0x0026, 0x080c, 0x5840, 0xd0c4, 0x0120, 0x2011, 0x8014, 0x080c, - 0x4ca1, 0x002e, 0x0005, 0x81ff, 0x1904, 0x36bf, 0x0126, 0x2091, - 0x8000, 0x6030, 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, 0x779e, - 0x1158, 0x080c, 0x7ab6, 0x080c, 0x619d, 0x9085, 0x0001, 0x080c, - 0x77e2, 0x080c, 0x76cd, 0x0010, 0x080c, 0x6058, 0x012e, 0x0804, - 0x368d, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x36bf, 0x080c, - 0x5854, 0x0120, 0x2009, 0x0007, 0x0804, 0x36bf, 0x080c, 0x6c09, - 0x0120, 0x2009, 0x0008, 0x0804, 0x36bf, 0x2001, 0x180d, 0x2004, - 0xd08c, 0x0178, 0x0026, 0x2011, 0x0010, 0x080c, 0x6c35, 0x002e, - 0x0140, 0x7984, 0x080c, 0x6c7f, 0x1120, 0x2009, 0x4009, 0x0804, - 0x36bf, 0x7984, 0x080c, 0x6749, 0x1904, 0x36c2, 0x080c, 0x4c74, - 0x0904, 0x36c2, 0x2b00, 0x7026, 0x080c, 0x6c11, 0x7888, 0x1170, - 0x9084, 0x0005, 0x1158, 0x900e, 0x080c, 0x6aae, 0x1108, 0xc185, - 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x368d, 0x080c, 0x4c41, - 0x0904, 0x36bf, 0x9006, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, - 0x080c, 0xd154, 0x0904, 0x36bf, 0x7888, 0xd094, 0x0118, 0xb8d4, - 0xc08d, 0xb8d6, 0x7007, 0x0003, 0x701f, 0x4f28, 0x0005, 0x2061, - 0x1800, 0x080c, 0x5854, 0x2009, 0x0007, 0x1560, 0x080c, 0x6c09, - 0x0118, 0x2009, 0x0008, 0x0430, 0xa998, 0x080c, 0x6749, 0x1530, - 0x080c, 0x4c72, 0x0518, 0x080c, 0x6c11, 0xa89c, 0x1168, 0x9084, - 0x0005, 0x1150, 0x900e, 0x080c, 0x6aae, 0x1108, 0xc185, 0xb800, - 0xd0bc, 0x0108, 0xc18d, 0x00d0, 0xa868, 0xc0fc, 0xa86a, 0x080c, - 0xd154, 0x11e0, 0xa89c, 0xd094, 0x0118, 0xb8d4, 0xc08d, 0xb8d6, - 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, - 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, - 0xa99a, 0x9006, 0x918d, 0x0001, 0x2008, 0x0005, 0x9006, 0x0005, - 0xa830, 0x2009, 0x180d, 0x210c, 0xd18c, 0x0140, 0x2008, 0x918e, - 0xdead, 0x1120, 0x2021, 0x4009, 0x0804, 0x368f, 0x9086, 0x0100, - 0x7024, 0x2058, 0x1110, 0x0804, 0x578e, 0x900e, 0x080c, 0x6aae, - 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x368d, - 0x080c, 0x5854, 0x0120, 0x2009, 0x0007, 0x0804, 0x36bf, 0x7f84, - 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x080c, 0x4c41, 0x1120, 0x2009, - 0x0002, 0x0804, 0x36bf, 0x900e, 0x2130, 0x7126, 0x7132, 0xa860, - 0x20e8, 0x7036, 0xa85c, 0x9080, 0x0005, 0x702a, 0x20a0, 0x080c, - 0x67b4, 0x1904, 0x4fde, 0x080c, 0x6c11, 0x0138, 0x080c, 0x6c19, - 0x0120, 0x080c, 0x6bb1, 0x1904, 0x4fde, 0xd794, 0x1110, 0xd784, - 0x01a8, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x0006, 0x2098, 0x3400, - 0xd794, 0x0198, 0x20a9, 0x0008, 0x4003, 0x2098, 0x20a0, 0x3d00, - 0x20e0, 0x20a9, 0x0002, 0x080c, 0x4a10, 0x0080, 0xb8c4, 0x20e0, - 0xb8c8, 0x9080, 0x000a, 0x2098, 0x3400, 0x20a9, 0x0004, 0x4003, - 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x080c, 0x4a10, 0x9186, 0x007e, - 0x0170, 0x9186, 0x0080, 0x0158, 0x080c, 0x6c11, 0x90c2, 0x0006, - 0x1210, 0xc1fd, 0x0020, 0x080c, 0x6aae, 0x1108, 0xc1fd, 0x4104, - 0xc1fc, 0xd794, 0x0528, 0xb8c4, 0x20e0, 0xb8c8, 0x2060, 0x9c80, - 0x0000, 0x2098, 0x20a9, 0x0002, 0x4003, 0x9c80, 0x0003, 0x2098, - 0x20a9, 0x0001, 0x4005, 0x9c80, 0x0004, 0x2098, 0x3400, 0x20a9, - 0x0002, 0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x080c, 0x4a03, - 0x9c80, 0x0026, 0x2098, 0xb8c4, 0x20e0, 0x20a9, 0x0002, 0x4003, - 0xd794, 0x0110, 0x96b0, 0x000b, 0x96b0, 0x0005, 0x8108, 0x080c, - 0xb094, 0x0118, 0x9186, 0x0800, 0x0040, 0xd78c, 0x0120, 0x9186, - 0x0800, 0x0170, 0x0018, 0x9186, 0x007e, 0x0150, 0xd794, 0x0118, - 0x9686, 0x0020, 0x0010, 0x9686, 0x0028, 0x0150, 0x0804, 0x4f67, - 0x86ff, 0x1120, 0x7124, 0x810b, 0x0804, 0x368d, 0x7033, 0x0001, - 0x7122, 0x7024, 0x9600, 0x7026, 0x772e, 0x2061, 0x18b8, 0x2c44, - 0xa06b, 0x0000, 0xa67a, 0x7034, 0xa072, 0x7028, 0xa076, 0xa28e, - 0xa392, 0xa496, 0xa59a, 0x080c, 0x114e, 0x7007, 0x0002, 0x701f, - 0x501a, 0x0005, 0x7030, 0x9005, 0x1180, 0x7120, 0x7028, 0x20a0, - 0x772c, 0x9036, 0x7034, 0x20e8, 0x2061, 0x18b8, 0x2c44, 0xa28c, - 0xa390, 0xa494, 0xa598, 0x0804, 0x4f67, 0x7124, 0x810b, 0x0804, - 0x368d, 0x2029, 0x007e, 0x7984, 0x7a88, 0x7b8c, 0x7c98, 0x9184, - 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x36c2, 0x9502, 0x0a04, - 0x36c2, 0x9184, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x36c2, 0x9502, - 0x0a04, 0x36c2, 0x9284, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, - 0x36c2, 0x9502, 0x0a04, 0x36c2, 0x9284, 0x00ff, 0x90e2, 0x0020, - 0x0a04, 0x36c2, 0x9502, 0x0a04, 0x36c2, 0x9384, 0xff00, 0x8007, - 0x90e2, 0x0020, 0x0a04, 0x36c2, 0x9502, 0x0a04, 0x36c2, 0x9384, - 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x36c2, 0x9502, 0x0a04, 0x36c2, - 0x9484, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x36c2, 0x9502, - 0x0a04, 0x36c2, 0x9484, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x36c2, - 0x9502, 0x0a04, 0x36c2, 0x2061, 0x1989, 0x6102, 0x6206, 0x630a, - 0x640e, 0x0804, 0x368d, 0x080c, 0x4c41, 0x0904, 0x36bf, 0x2009, - 0x0016, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, - 0xaf60, 0x080c, 0x4c8a, 0x701f, 0x509e, 0x0005, 0x20a9, 0x0016, - 0x896e, 0x8d6e, 0x8d6f, 0x9d84, 0xffc0, 0x9080, 0x0019, 0x2098, - 0x9d84, 0x003f, 0x20e0, 0x2069, 0x1877, 0x20e9, 0x0001, 0x2da0, - 0x4003, 0x6800, 0x9005, 0x0904, 0x5105, 0x6804, 0x2008, 0x918c, - 0xfff8, 0x1904, 0x5105, 0x680c, 0x9005, 0x0904, 0x5105, 0x9082, - 0xff01, 0x1a04, 0x5105, 0x6810, 0x9082, 0x005c, 0x06f0, 0x6824, - 0x2008, 0x9082, 0x0008, 0x06c8, 0x9182, 0x0400, 0x16b0, 0x0056, - 0x2029, 0x0000, 0x080c, 0x9077, 0x005e, 0x6944, 0x6820, 0x9102, - 0x0660, 0x6820, 0x9082, 0x0019, 0x1640, 0x6828, 0x6944, 0x810c, - 0x9102, 0x0618, 0x6840, 0x9082, 0x000f, 0x12f8, 0x080c, 0x1072, - 0x2900, 0x0590, 0x684e, 0x00e6, 0x2071, 0x1931, 0x00b6, 0x2059, - 0x0000, 0x080c, 0x8f33, 0x00be, 0x00ee, 0x01e8, 0x080c, 0x8c78, - 0x080c, 0x8cc7, 0x1160, 0x6857, 0x0000, 0x00c6, 0x6b10, 0x2061, - 0x1a6e, 0x630e, 0x00ce, 0x0804, 0x368d, 0x0804, 0x36c2, 0x080c, - 0x8cc0, 0x00e6, 0x2071, 0x1931, 0x080c, 0x90f7, 0x080c, 0x9106, - 0x080c, 0x8f18, 0x00ee, 0x2001, 0x188a, 0x204c, 0x080c, 0x108b, - 0x2001, 0x188a, 0x2003, 0x0000, 0x0804, 0x36bf, 0x0126, 0x2091, - 0x8000, 0x080c, 0x94b8, 0x080c, 0x8cc0, 0x012e, 0x0804, 0x368d, - 0x0006, 0x080c, 0x5840, 0xd0cc, 0x000e, 0x0005, 0x0006, 0x080c, - 0x5844, 0xd0bc, 0x000e, 0x0005, 0x6174, 0x7a84, 0x6300, 0x82ff, - 0x1118, 0x7986, 0x0804, 0x368d, 0x83ff, 0x1904, 0x36c2, 0x2001, - 0xfff0, 0x9200, 0x1a04, 0x36c2, 0x2019, 0xffff, 0x6078, 0x9302, - 0x9200, 0x0a04, 0x36c2, 0x7986, 0x6276, 0x0804, 0x368d, 0x080c, - 0x5854, 0x1904, 0x36bf, 0x7c88, 0x7d84, 0x7e98, 0x7f8c, 0x080c, - 0x4c41, 0x0904, 0x36bf, 0x900e, 0x901e, 0x7326, 0x7332, 0xa860, - 0x20e8, 0x7036, 0xa85c, 0x9080, 0x0003, 0x702a, 0x20a0, 0x91d8, - 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x6c11, 0x0118, 0x080c, - 0x6c19, 0x1148, 0x20a9, 0x0001, 0xb814, 0x4004, 0xb810, 0x4004, - 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, - 0x003c, 0x0170, 0x0c20, 0x83ff, 0x1148, 0x7224, 0x900e, 0x2001, - 0x0003, 0x080c, 0x955b, 0x2208, 0x0804, 0x368d, 0x7033, 0x0001, - 0x7122, 0x7024, 0x9300, 0x7026, 0x2061, 0x18b8, 0x2c44, 0xa06b, - 0x0000, 0xa37a, 0x7028, 0xa076, 0x7034, 0xa072, 0xa48e, 0xa592, - 0xa696, 0xa79a, 0x080c, 0x114e, 0x7007, 0x0002, 0x701f, 0x51a9, - 0x0005, 0x7030, 0x9005, 0x1178, 0x7120, 0x7028, 0x20a0, 0x901e, - 0x7034, 0x20e8, 0x2061, 0x18b8, 0x2c44, 0xa48c, 0xa590, 0xa694, - 0xa798, 0x0804, 0x5167, 0x7224, 0x900e, 0x2001, 0x0003, 0x080c, - 0x955b, 0x2208, 0x0804, 0x368d, 0x00f6, 0x00e6, 0x080c, 0x5854, - 0x2009, 0x0007, 0x1904, 0x523c, 0x2071, 0x189e, 0x745c, 0x84ff, - 0x2009, 0x000e, 0x1904, 0x523c, 0xac9c, 0xad98, 0xaea4, 0xafa0, - 0x0096, 0x080c, 0x1072, 0x2009, 0x0002, 0x0904, 0x523c, 0x2900, - 0x705e, 0x900e, 0x901e, 0x7356, 0x7362, 0xa860, 0x7066, 0xa85c, - 0x9080, 0x0003, 0x705a, 0x20a0, 0x91d8, 0x1000, 0x2b5c, 0x8bff, - 0x0178, 0x080c, 0x6c11, 0x0118, 0x080c, 0x6c19, 0x1148, 0xb814, - 0x20a9, 0x0001, 0x4004, 0xb810, 0x4004, 0x4104, 0x9398, 0x0003, - 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, 0x003c, 0x01e8, 0x0c20, - 0x83ff, 0x11c0, 0x7254, 0x900e, 0x2001, 0x0003, 0x080c, 0x955b, - 0x2208, 0x009e, 0xa897, 0x4000, 0xa99a, 0x715c, 0x81ff, 0x090c, - 0x0d85, 0x2148, 0x080c, 0x108b, 0x9006, 0x705e, 0x918d, 0x0001, - 0x2008, 0x0418, 0x7063, 0x0001, 0x7152, 0x7054, 0x9300, 0x7056, - 0x2061, 0x18b9, 0x2c44, 0xa37a, 0x7058, 0xa076, 0x7064, 0xa072, - 0xa48e, 0xa592, 0xa696, 0xa79a, 0xa09f, 0x5248, 0x000e, 0xa0a2, - 0x080c, 0x114e, 0x9006, 0x0048, 0x009e, 0xa897, 0x4005, 0xa99a, - 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x00ee, 0x00fe, 0x0005, - 0x00f6, 0xa0a0, 0x904d, 0x090c, 0x0d85, 0x00e6, 0x2071, 0x189e, - 0xa06c, 0x908e, 0x0100, 0x0138, 0xa87b, 0x0030, 0xa883, 0x0000, - 0xa897, 0x4002, 0x00d8, 0x7060, 0x9005, 0x1158, 0x7150, 0x7058, - 0x20a0, 0x901e, 0x7064, 0x20e8, 0xa48c, 0xa590, 0xa694, 0xa798, - 0x0428, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x7254, - 0x900e, 0x2001, 0x0003, 0x080c, 0x955b, 0xaa9a, 0x715c, 0x81ff, - 0x090c, 0x0d85, 0x2148, 0x080c, 0x108b, 0x705f, 0x0000, 0xa0a0, - 0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x7012, 0x012e, 0xa09f, - 0x0000, 0xa0a3, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x91d8, 0x1000, - 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x6c11, 0x0118, 0x080c, 0x6c19, - 0x1148, 0xb814, 0x20a9, 0x0001, 0x4004, 0xb810, 0x4004, 0x4104, - 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, 0x003c, - 0x0518, 0x0c20, 0x83ff, 0x11f0, 0x7154, 0x810c, 0xa99a, 0xa897, - 0x4000, 0x715c, 0x81ff, 0x090c, 0x0d85, 0x2148, 0x080c, 0x108b, - 0x9006, 0x705e, 0x918d, 0x0001, 0x2008, 0xa0a0, 0x2048, 0x0126, - 0x2091, 0x8000, 0x080c, 0x7012, 0x012e, 0xa09f, 0x0000, 0xa0a3, - 0x0000, 0x0070, 0x7063, 0x0001, 0x7152, 0x7054, 0x9300, 0x7056, - 0xa37a, 0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c, 0x114e, 0x9006, - 0x00ee, 0x0005, 0x0096, 0xa88c, 0x90be, 0x7000, 0x0148, 0x90be, - 0x7100, 0x0130, 0x90be, 0x7200, 0x0118, 0x009e, 0x0804, 0x36c2, - 0xa884, 0xa988, 0x080c, 0x268c, 0x1518, 0x080c, 0x6749, 0x1500, - 0x7126, 0xbe12, 0xbd16, 0xae7c, 0x080c, 0x4c41, 0x01c8, 0x080c, - 0x4c41, 0x01b0, 0x009e, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, - 0xa823, 0x0000, 0xa804, 0x2048, 0x080c, 0xd0cd, 0x1120, 0x2009, - 0x0003, 0x0804, 0x36bf, 0x7007, 0x0003, 0x701f, 0x5315, 0x0005, - 0x009e, 0x2009, 0x0002, 0x0804, 0x36bf, 0x7124, 0x080c, 0x341e, - 0xa820, 0x9086, 0x8001, 0x1120, 0x2009, 0x0004, 0x0804, 0x36bf, - 0x2900, 0x7022, 0xa804, 0x0096, 0x2048, 0x8906, 0x8006, 0x8007, - 0x90bc, 0x003f, 0x9084, 0xffc0, 0x009e, 0x9080, 0x0002, 0x0076, - 0x0006, 0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a, 0x080c, - 0x0fd6, 0xaa6c, 0xab70, 0xac74, 0xad78, 0x2061, 0x18b8, 0x2c44, - 0xa06b, 0x0000, 0xae64, 0xaf8c, 0x97c6, 0x7000, 0x0118, 0x97c6, - 0x7100, 0x1148, 0x96c2, 0x0004, 0x0600, 0x2009, 0x0004, 0x000e, - 0x007e, 0x0804, 0x4c8d, 0x97c6, 0x7200, 0x11b8, 0x96c2, 0x0054, - 0x02a0, 0x000e, 0x007e, 0x2061, 0x18b8, 0x2c44, 0xa076, 0xa772, - 0xa07b, 0x002a, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x114e, - 0x7007, 0x0002, 0x701f, 0x5371, 0x0005, 0x000e, 0x007e, 0x0804, - 0x36c2, 0x7020, 0x2048, 0xa804, 0x2048, 0xa804, 0x2048, 0x8906, - 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, - 0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a, 0x080c, 0x0fd6, - 0x2100, 0x2238, 0x2061, 0x18b8, 0x2c44, 0xa28c, 0xa390, 0xa494, - 0xa598, 0x2009, 0x002a, 0x0804, 0x4c8d, 0x81ff, 0x1904, 0x36bf, - 0x798c, 0x2001, 0x197e, 0x918c, 0x8000, 0x2102, 0x080c, 0x4c58, - 0x0904, 0x36c2, 0x080c, 0x6c11, 0x0120, 0x080c, 0x6c19, 0x1904, - 0x36c2, 0x080c, 0x687b, 0x0904, 0x36bf, 0x0126, 0x2091, 0x8000, - 0x080c, 0x6a1b, 0x012e, 0x0904, 0x36bf, 0x2001, 0x197e, 0x2004, - 0xd0fc, 0x1904, 0x368d, 0x0804, 0x46aa, 0xa9a0, 0x2001, 0x197e, - 0x918c, 0x8000, 0xc18d, 0x2102, 0x080c, 0x4c65, 0x01a0, 0x080c, - 0x6c11, 0x0118, 0x080c, 0x6c19, 0x1170, 0x080c, 0x687b, 0x2009, - 0x0002, 0x0128, 0x080c, 0x6a1b, 0x1170, 0x2009, 0x0003, 0xa897, - 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, - 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x2001, 0x197e, 0x2004, - 0xd0fc, 0x1128, 0x080c, 0x5848, 0x0110, 0x9006, 0x0018, 0x900e, - 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x78a8, 0xd08c, 0x1118, - 0xd084, 0x0904, 0x461f, 0x080c, 0x4c74, 0x0904, 0x36c2, 0x080c, - 0x4c41, 0x1120, 0x2009, 0x0002, 0x0804, 0x36bf, 0x080c, 0x6c11, - 0x0130, 0x908e, 0x0004, 0x0118, 0x908e, 0x0005, 0x15a0, 0x78a8, - 0xd08c, 0x0120, 0xb800, 0xc08c, 0xb802, 0x0028, 0x080c, 0x5840, - 0xd0b4, 0x0904, 0x4659, 0x7884, 0x908e, 0x007e, 0x0904, 0x4659, - 0x908e, 0x007f, 0x0904, 0x4659, 0x908e, 0x0080, 0x0904, 0x4659, - 0xb800, 0xd08c, 0x1904, 0x4659, 0xa867, 0x0000, 0xa868, 0xc0fd, - 0xa86a, 0x080c, 0xd0ec, 0x1120, 0x2009, 0x0003, 0x0804, 0x36bf, - 0x7007, 0x0003, 0x701f, 0x543d, 0x0005, 0x080c, 0x4c74, 0x0904, - 0x36c2, 0x0804, 0x4659, 0x080c, 0x347d, 0x0108, 0x0005, 0x2009, - 0x1834, 0x210c, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x36bf, - 0x080c, 0x5854, 0x0120, 0x2009, 0x0007, 0x0804, 0x36bf, 0x080c, - 0x6c09, 0x0120, 0x2009, 0x0008, 0x0804, 0x36bf, 0xb89c, 0xd0a4, - 0x1118, 0xd0ac, 0x1904, 0x4659, 0x9006, 0xa866, 0xa832, 0xa868, - 0xc0fd, 0xa86a, 0x080c, 0xd154, 0x1120, 0x2009, 0x0003, 0x0804, - 0x36bf, 0x7007, 0x0003, 0x701f, 0x5476, 0x0005, 0xa830, 0x9086, - 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x578e, 0x080c, 0x4c74, - 0x0904, 0x36c2, 0x0804, 0x540f, 0x81ff, 0x2009, 0x0001, 0x1904, - 0x36bf, 0x080c, 0x5854, 0x2009, 0x0007, 0x1904, 0x36bf, 0x080c, - 0x6c09, 0x0120, 0x2009, 0x0008, 0x0804, 0x36bf, 0x080c, 0x4c74, - 0x0904, 0x36c2, 0x080c, 0x6c11, 0x2009, 0x0009, 0x1904, 0x36bf, - 0x080c, 0x4c41, 0x2009, 0x0002, 0x0904, 0x36bf, 0x9006, 0xa866, - 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x7988, 0xa95a, 0x9194, 0xfd00, - 0x918c, 0x00ff, 0x9006, 0x82ff, 0x1128, 0xc0ed, 0xa952, 0x798c, - 0xa956, 0x0038, 0x928e, 0x0100, 0x1904, 0x36c2, 0xc0e5, 0xa952, - 0xa956, 0xa83e, 0x080c, 0xd3b7, 0x2009, 0x0003, 0x0904, 0x36bf, - 0x7007, 0x0003, 0x701f, 0x54cd, 0x0005, 0xa830, 0x9086, 0x0100, - 0x2009, 0x0004, 0x0904, 0x36bf, 0x0804, 0x368d, 0x7aa8, 0x9284, - 0xc000, 0x0148, 0xd2ec, 0x01a0, 0x080c, 0x5854, 0x1188, 0x2009, - 0x0014, 0x0804, 0x36bf, 0xd2dc, 0x1578, 0x81ff, 0x2009, 0x0001, - 0x1904, 0x36bf, 0x080c, 0x5854, 0x2009, 0x0007, 0x1904, 0x36bf, - 0xd2f4, 0x0138, 0x9284, 0x5000, 0xc0d5, 0x080c, 0x581a, 0x0804, - 0x368d, 0xd2fc, 0x0160, 0x080c, 0x4c74, 0x0904, 0x36c2, 0x7984, - 0x9284, 0x9000, 0xc0d5, 0x080c, 0x57e9, 0x0804, 0x368d, 0x080c, - 0x4c74, 0x0904, 0x36c2, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, - 0x2009, 0x0009, 0x1904, 0x55bc, 0x080c, 0x4c41, 0x2009, 0x0002, - 0x0904, 0x55bc, 0xa85c, 0x9080, 0x001b, 0xaf60, 0x2009, 0x0008, - 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x080c, 0x4c8a, 0x701f, 0x5529, - 0x0005, 0xa86c, 0x9086, 0x0500, 0x1138, 0xa870, 0x9005, 0x1120, - 0xa874, 0x9084, 0xff00, 0x0110, 0x1904, 0x36c2, 0xa866, 0xa832, - 0xa868, 0xc0fd, 0xa86a, 0x080c, 0x4c74, 0x1110, 0x0804, 0x36c2, - 0x2009, 0x0043, 0x080c, 0xd423, 0x2009, 0x0003, 0x0904, 0x55bc, - 0x7007, 0x0003, 0x701f, 0x554d, 0x0005, 0xa830, 0x9086, 0x0100, - 0x2009, 0x0004, 0x0904, 0x55bc, 0x7984, 0x7aa8, 0x9284, 0x1000, - 0xc0d5, 0x080c, 0x57e9, 0x0804, 0x368d, 0x00c6, 0xaab0, 0x9284, - 0xc000, 0x0148, 0xd2ec, 0x0170, 0x080c, 0x5854, 0x1158, 0x2009, - 0x0014, 0x0804, 0x55ab, 0x2061, 0x1800, 0x080c, 0x5854, 0x2009, - 0x0007, 0x15c8, 0xd2f4, 0x0130, 0x9284, 0x5000, 0xc0d5, 0x080c, - 0x581a, 0x0058, 0xd2fc, 0x0180, 0x080c, 0x4c72, 0x0590, 0xa998, - 0x9284, 0x9000, 0xc0d5, 0x080c, 0x57e9, 0xa87b, 0x0000, 0xa883, - 0x0000, 0xa897, 0x4000, 0x0438, 0x080c, 0x4c72, 0x0510, 0x080c, - 0x6c11, 0x2009, 0x0009, 0x11b8, 0xa8c4, 0x9086, 0x0500, 0x11c8, - 0xa8c8, 0x9005, 0x11b0, 0xa8cc, 0x9084, 0xff00, 0x1190, 0x080c, - 0x4c72, 0x1108, 0x0070, 0x2009, 0x004b, 0x080c, 0xd423, 0x2009, - 0x0003, 0x0108, 0x0078, 0x0431, 0x19c0, 0xa897, 0x4005, 0xa99a, - 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, - 0x00ce, 0x0005, 0x9006, 0x0ce0, 0x7aa8, 0xd2dc, 0x0904, 0x36bf, - 0x0016, 0x7984, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x57e9, 0x001e, - 0x1904, 0x36bf, 0x0804, 0x368d, 0x00f6, 0x2d78, 0xaab0, 0x0021, - 0x00fe, 0x0005, 0xaab0, 0xc2d5, 0xd2dc, 0x0150, 0x0016, 0xa998, - 0x9284, 0x1400, 0xc0fd, 0x080c, 0x57e9, 0x001e, 0x9085, 0x0001, - 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x36bf, 0x080c, - 0x5854, 0x0120, 0x2009, 0x0007, 0x0804, 0x36bf, 0x7984, 0x7ea8, - 0x96b4, 0x00ff, 0x080c, 0x67b4, 0x1904, 0x36c2, 0x9186, 0x007f, - 0x0138, 0x080c, 0x6c11, 0x0120, 0x2009, 0x0009, 0x0804, 0x36bf, - 0x080c, 0x4c41, 0x1120, 0x2009, 0x0002, 0x0804, 0x36bf, 0xa867, - 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x2001, 0x0100, 0x8007, 0xa80a, - 0x080c, 0xd106, 0x1120, 0x2009, 0x0003, 0x0804, 0x36bf, 0x7007, - 0x0003, 0x701f, 0x561c, 0x0005, 0xa808, 0x8007, 0x9086, 0x0100, - 0x1120, 0x2009, 0x0004, 0x0804, 0x36bf, 0xa8e0, 0xa866, 0xa810, - 0x8007, 0x9084, 0x00ff, 0x800c, 0xa814, 0x8007, 0x9084, 0x00ff, - 0x8004, 0x9080, 0x0002, 0x9108, 0x8906, 0x8006, 0x8007, 0x90bc, - 0x003f, 0x9084, 0xffc0, 0x9080, 0x0004, 0x7a8c, 0x7b88, 0x7c9c, - 0x7d98, 0x0804, 0x4c8d, 0x080c, 0x4c41, 0x1120, 0x2009, 0x0002, - 0x0804, 0x36bf, 0x7984, 0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, - 0x82ff, 0x1118, 0x7023, 0x19b4, 0x0040, 0x92c6, 0x0001, 0x1118, - 0x7023, 0x19ce, 0x0010, 0x0804, 0x36c2, 0x2009, 0x001a, 0x7a8c, - 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, - 0x4c8a, 0x701f, 0x566c, 0x0005, 0x2001, 0x182e, 0x2003, 0x0001, - 0xa85c, 0x9080, 0x0019, 0x2098, 0xa860, 0x20e0, 0x20a9, 0x001a, - 0x7020, 0x20a0, 0x20e9, 0x0001, 0x4003, 0x0804, 0x368d, 0x080c, - 0x4c41, 0x1120, 0x2009, 0x0002, 0x0804, 0x36bf, 0x7984, 0x9194, - 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff, 0x1118, 0x2099, 0x19b4, - 0x0040, 0x92c6, 0x0001, 0x1118, 0x2099, 0x19ce, 0x0010, 0x0804, - 0x36c2, 0xa85c, 0x9080, 0x0019, 0x20a0, 0xa860, 0x20e8, 0x20a9, - 0x001a, 0x20e1, 0x0001, 0x4003, 0x2009, 0x001a, 0x7a8c, 0x7b88, - 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x0804, 0x4c8d, - 0x7884, 0x908a, 0x1000, 0x1a04, 0x36c2, 0x0126, 0x2091, 0x8000, - 0x8003, 0x800b, 0x810b, 0x9108, 0x00c6, 0x2061, 0x1a04, 0x614a, - 0x00ce, 0x012e, 0x0804, 0x368d, 0x00c6, 0x080c, 0x779e, 0x1160, - 0x080c, 0x7ab6, 0x080c, 0x619d, 0x9085, 0x0001, 0x080c, 0x77e2, - 0x080c, 0x76cd, 0x080c, 0x0d85, 0x2061, 0x1800, 0x6030, 0xc09d, - 0x6032, 0x080c, 0x6058, 0x00ce, 0x0005, 0x00c6, 0x2001, 0x1800, - 0x2004, 0x908e, 0x0000, 0x0904, 0x36bf, 0x7884, 0x9005, 0x0188, - 0x7888, 0x2061, 0x199c, 0x2c0c, 0x2062, 0x080c, 0x2a67, 0x01a0, - 0x080c, 0x2a6f, 0x0188, 0x080c, 0x2a77, 0x0170, 0x2162, 0x0804, - 0x36c2, 0x2061, 0x0100, 0x6038, 0x9086, 0x0007, 0x1118, 0x2009, - 0x0001, 0x0010, 0x2009, 0x0000, 0x7884, 0x9086, 0x0002, 0x15a8, - 0x2061, 0x0100, 0x6028, 0xc09c, 0x602a, 0x080c, 0xacfc, 0x0026, - 0x2011, 0x0003, 0x080c, 0xa62b, 0x2011, 0x0002, 0x080c, 0xa635, - 0x002e, 0x080c, 0xa516, 0x0036, 0x901e, 0x080c, 0xa596, 0x003e, - 0x080c, 0xad18, 0x60e3, 0x0000, 0x080c, 0xeed9, 0x080c, 0xeef4, - 0x9085, 0x0001, 0x080c, 0x77e2, 0x9006, 0x080c, 0x2a99, 0x2001, - 0x1800, 0x2003, 0x0004, 0x2001, 0x19a8, 0x2003, 0x0000, 0x0026, - 0x2011, 0x0008, 0x080c, 0x2ad3, 0x002e, 0x00ce, 0x0804, 0x368d, - 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x36bf, 0x080c, 0x5854, - 0x0120, 0x2009, 0x0007, 0x0804, 0x36bf, 0x7984, 0x7ea8, 0x96b4, - 0x00ff, 0x080c, 0x67b4, 0x1904, 0x36c2, 0x9186, 0x007f, 0x0138, - 0x080c, 0x6c11, 0x0120, 0x2009, 0x0009, 0x0804, 0x36bf, 0x080c, - 0x4c41, 0x1120, 0x2009, 0x0002, 0x0804, 0x36bf, 0xa867, 0x0000, - 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xd109, 0x1120, 0x2009, 0x0003, - 0x0804, 0x36bf, 0x7007, 0x0003, 0x701f, 0x5777, 0x0005, 0xa830, - 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x36bf, 0xa8e0, - 0xa866, 0xa834, 0x8007, 0x800c, 0xa85c, 0x9080, 0x000c, 0x7a8c, - 0x7b88, 0x7c9c, 0x7d98, 0xaf60, 0x0804, 0x4c8d, 0xa898, 0x9086, - 0x000d, 0x1904, 0x36bf, 0x2021, 0x4005, 0x0126, 0x2091, 0x8000, - 0x0e04, 0x579b, 0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000, - 0x0118, 0x7833, 0x0011, 0x0010, 0x7833, 0x0010, 0x7883, 0x4005, - 0xa998, 0x7986, 0xa9a4, 0x799a, 0xa9a8, 0x799e, 0x080c, 0x4c7d, - 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1200, - 0x7007, 0x0001, 0x2091, 0x5000, 0x700f, 0x0000, 0x012e, 0x0005, - 0x0126, 0x2091, 0x8000, 0x00c6, 0x2061, 0x1a04, 0x7984, 0x615a, - 0x6156, 0x605f, 0x0000, 0x6053, 0x0009, 0x7898, 0x6072, 0x789c, - 0x606e, 0x7888, 0x606a, 0x788c, 0x6066, 0x2001, 0x1a14, 0x2044, - 0x2001, 0x1a1b, 0xa076, 0xa060, 0xa072, 0xa07b, 0x0001, 0xa07f, - 0x0002, 0xa06b, 0x0000, 0xa09f, 0x0000, 0x00ce, 0x012e, 0x0804, - 0x368d, 0x0126, 0x2091, 0x8000, 0x00b6, 0x00c6, 0x90e4, 0xc000, - 0x0198, 0x0006, 0xd0d4, 0x0160, 0x0036, 0x2019, 0x0029, 0x080c, - 0xacfc, 0x0106, 0x080c, 0x3442, 0x010e, 0x090c, 0xad18, 0x003e, - 0x080c, 0xcf68, 0x000e, 0x1198, 0xd0e4, 0x0160, 0x9180, 0x1000, - 0x2004, 0x905d, 0x0160, 0x080c, 0x61b7, 0x080c, 0xb094, 0x0110, - 0xb817, 0x0000, 0x9006, 0x00ce, 0x00be, 0x012e, 0x0005, 0x9085, - 0x0001, 0x0cc8, 0x0126, 0x2091, 0x8000, 0x0156, 0x2010, 0x900e, - 0x20a9, 0x0800, 0x0016, 0x9180, 0x1000, 0x2004, 0x9005, 0x0188, - 0x9186, 0x007e, 0x0170, 0x9186, 0x007f, 0x0158, 0x9186, 0x0080, - 0x0140, 0x9186, 0x00ff, 0x0128, 0x0026, 0x2200, 0x080c, 0x57e9, - 0x002e, 0x001e, 0x8108, 0x1f04, 0x5822, 0x015e, 0x012e, 0x0005, - 0x2001, 0x1848, 0x2004, 0x0005, 0x2001, 0x1867, 0x2004, 0x0005, - 0x0006, 0x2001, 0x1810, 0x2004, 0xd0d4, 0x000e, 0x0005, 0x2001, - 0x180e, 0x2004, 0xd0b4, 0x0005, 0x2001, 0x1800, 0x2004, 0x9086, - 0x0003, 0x0005, 0x0016, 0x00e6, 0x2071, 0x189e, 0x7108, 0x910d, - 0x710a, 0x00ee, 0x001e, 0x0005, 0x79a4, 0x81ff, 0x0904, 0x36c2, - 0x9182, 0x0081, 0x1a04, 0x36c2, 0x810c, 0x0016, 0x080c, 0x4c41, - 0x0170, 0x080c, 0x0f61, 0x2100, 0x2238, 0x7d84, 0x7c88, 0x7b8c, - 0x7a90, 0x001e, 0x080c, 0x4c8a, 0x701f, 0x5884, 0x0005, 0x001e, - 0x2009, 0x0002, 0x0804, 0x36bf, 0x2079, 0x0000, 0x7d94, 0x7c98, - 0x7ba8, 0x7aac, 0x79a4, 0x810c, 0x2061, 0x18b8, 0x2c44, 0xa770, - 0xa074, 0x2071, 0x189e, 0x080c, 0x4c8d, 0x701f, 0x5898, 0x0005, - 0x2061, 0x18b8, 0x2c44, 0x0016, 0x0026, 0xa270, 0xa174, 0x080c, - 0x0f69, 0x002e, 0x001e, 0x080c, 0x1016, 0x9006, 0xa802, 0xa806, - 0x0804, 0x368d, 0x0126, 0x0156, 0x0136, 0x0146, 0x01c6, 0x01d6, - 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2061, 0x0100, 0x2069, 0x0200, - 0x2071, 0x1800, 0x6044, 0xd0a4, 0x11e8, 0xd084, 0x0118, 0x080c, - 0x5a58, 0x0068, 0xd08c, 0x0118, 0x080c, 0x5961, 0x0040, 0xd094, - 0x0118, 0x080c, 0x5931, 0x0018, 0xd09c, 0x0108, 0x0099, 0x00fe, - 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, - 0x012e, 0x0005, 0x0016, 0x6128, 0xd19c, 0x1110, 0xc19d, 0x612a, - 0x001e, 0x0c68, 0x7030, 0xd09c, 0x1120, 0x6004, 0x9085, 0x0002, - 0x6006, 0x7098, 0x9005, 0x0120, 0x709b, 0x0000, 0x7093, 0x0000, - 0x624c, 0x9286, 0xf0f0, 0x1150, 0x6048, 0x9086, 0xf0f0, 0x0130, - 0x624a, 0x6043, 0x0090, 0x6043, 0x0010, 0x0490, 0x9294, 0xff00, - 0x9296, 0xf700, 0x0178, 0x7138, 0xd1a4, 0x1160, 0x6240, 0x9295, - 0x0100, 0x6242, 0x9294, 0x0010, 0x0128, 0x2009, 0x00f7, 0x080c, - 0x6119, 0x00f0, 0x6040, 0x9084, 0x0010, 0x9085, 0x0140, 0x6042, - 0x6043, 0x0000, 0x7087, 0x0000, 0x70a3, 0x0001, 0x70c7, 0x0000, - 0x70df, 0x0000, 0x2009, 0x1d80, 0x200b, 0x0000, 0x7097, 0x0000, - 0x708b, 0x000f, 0x2009, 0x000f, 0x2011, 0x5ffb, 0x080c, 0x8a5d, - 0x0005, 0x2001, 0x1869, 0x2004, 0xd08c, 0x0110, 0x705f, 0xffff, - 0x7088, 0x9005, 0x1528, 0x2011, 0x5ffb, 0x080c, 0x8993, 0x6040, - 0x9094, 0x0010, 0x9285, 0x0020, 0x6042, 0x20a9, 0x00c8, 0x6044, - 0xd08c, 0x1168, 0x1f04, 0x5947, 0x6242, 0x709b, 0x0000, 0x6040, - 0x9094, 0x0010, 0x9285, 0x0080, 0x6042, 0x6242, 0x0048, 0x6242, - 0x709b, 0x0000, 0x708f, 0x0000, 0x9006, 0x080c, 0x61a2, 0x0000, - 0x0005, 0x708c, 0x908a, 0x0003, 0x1a0c, 0x0d85, 0x000b, 0x0005, - 0x596b, 0x59bc, 0x5a57, 0x00f6, 0x0016, 0x6900, 0x918c, 0x0800, - 0x708f, 0x0001, 0x2001, 0x015d, 0x2003, 0x0000, 0x6803, 0x00fc, - 0x20a9, 0x0004, 0x6800, 0x9084, 0x00fc, 0x0120, 0x1f04, 0x597a, - 0x080c, 0x0d85, 0x68a0, 0x68a2, 0x689c, 0x689e, 0x6898, 0x689a, - 0xa001, 0x918d, 0x1600, 0x6902, 0x001e, 0x6837, 0x0020, 0x080c, - 0x617e, 0x2079, 0x1d00, 0x7833, 0x1101, 0x7837, 0x0000, 0x20e1, - 0x0001, 0x2099, 0x1805, 0x20e9, 0x0001, 0x20a1, 0x1d0e, 0x20a9, - 0x0004, 0x4003, 0x080c, 0xaaf1, 0x20e1, 0x0001, 0x2099, 0x1d00, - 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3, - 0x000c, 0x600f, 0x0000, 0x080c, 0x602c, 0x00fe, 0x9006, 0x7092, - 0x6043, 0x0008, 0x6042, 0x0005, 0x00f6, 0x7090, 0x7093, 0x0000, - 0x9025, 0x0904, 0x5a34, 0x6020, 0xd0b4, 0x1904, 0x5a32, 0x71a0, - 0x81ff, 0x0904, 0x5a20, 0x9486, 0x000c, 0x1904, 0x5a2d, 0x9480, - 0x0018, 0x8004, 0x20a8, 0x080c, 0x6177, 0x2011, 0x0260, 0x2019, - 0x1d00, 0x220c, 0x2304, 0x9106, 0x11e8, 0x8210, 0x8318, 0x1f04, - 0x59d9, 0x6043, 0x0004, 0x2061, 0x0140, 0x605b, 0xbc94, 0x605f, - 0xf0f0, 0x2061, 0x0100, 0x6043, 0x0006, 0x708f, 0x0002, 0x709b, - 0x0002, 0x2009, 0x07d0, 0x2011, 0x6002, 0x080c, 0x8a5d, 0x080c, - 0x617e, 0x04c0, 0x080c, 0x6177, 0x2079, 0x0260, 0x7930, 0x918e, - 0x1101, 0x1558, 0x7834, 0x9005, 0x1540, 0x7900, 0x918c, 0x00ff, - 0x1118, 0x7804, 0x9005, 0x0190, 0x080c, 0x6177, 0x2011, 0x026e, - 0x2019, 0x1805, 0x20a9, 0x0004, 0x220c, 0x2304, 0x9102, 0x0230, - 0x11a0, 0x8210, 0x8318, 0x1f04, 0x5a14, 0x0078, 0x70a3, 0x0000, - 0x080c, 0x6177, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0001, - 0x20a1, 0x1d00, 0x20a9, 0x0014, 0x4003, 0x6043, 0x0008, 0x6043, - 0x0000, 0x0010, 0x00fe, 0x0005, 0x6040, 0x9085, 0x0100, 0x6042, - 0x6020, 0xd0b4, 0x1db8, 0x080c, 0xaaf1, 0x20e1, 0x0001, 0x2099, - 0x1d00, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003, - 0x60c3, 0x000c, 0x2011, 0x19f5, 0x2013, 0x0000, 0x7093, 0x0000, - 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0xa293, 0x08d8, 0x0005, - 0x7098, 0x908a, 0x001d, 0x1a0c, 0x0d85, 0x000b, 0x0005, 0x5a89, - 0x5a9c, 0x5ac5, 0x5ae5, 0x5b0b, 0x5b3a, 0x5b60, 0x5b98, 0x5bbe, - 0x5bec, 0x5c27, 0x5c5f, 0x5c7d, 0x5ca8, 0x5cca, 0x5ce5, 0x5cef, - 0x5d23, 0x5d49, 0x5d78, 0x5d9e, 0x5dd6, 0x5e1a, 0x5e57, 0x5e78, - 0x5ed1, 0x5ef3, 0x5f21, 0x5f21, 0x00c6, 0x2061, 0x1800, 0x6003, - 0x0007, 0x2061, 0x0100, 0x6004, 0x9084, 0xfff9, 0x6006, 0x00ce, - 0x0005, 0x2061, 0x0140, 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, - 0x0100, 0x6043, 0x0002, 0x709b, 0x0001, 0x2009, 0x07d0, 0x2011, - 0x6002, 0x080c, 0x8a5d, 0x0005, 0x00f6, 0x7090, 0x9086, 0x0014, - 0x1510, 0x6042, 0x6020, 0xd0b4, 0x11f0, 0x080c, 0x6177, 0x2079, - 0x0260, 0x7a30, 0x9296, 0x1102, 0x11a0, 0x7834, 0x9005, 0x1188, - 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, - 0x2011, 0x6002, 0x080c, 0x8993, 0x709b, 0x0010, 0x080c, 0x5cef, - 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0003, - 0x6043, 0x0004, 0x2011, 0x6002, 0x080c, 0x8993, 0x080c, 0x60fb, - 0x2079, 0x0240, 0x7833, 0x1102, 0x7837, 0x0000, 0x20a9, 0x0008, - 0x9f88, 0x000e, 0x200b, 0x0000, 0x8108, 0x1f04, 0x5ada, 0x60c3, - 0x0014, 0x080c, 0x602c, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, - 0x0500, 0x2011, 0x6002, 0x080c, 0x8993, 0x9086, 0x0014, 0x11b8, - 0x080c, 0x6177, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1102, 0x1178, - 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, - 0x1110, 0x70c7, 0x0001, 0x709b, 0x0004, 0x0029, 0x0010, 0x080c, - 0x6153, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0005, 0x080c, 0x60fb, - 0x2079, 0x0240, 0x7833, 0x1103, 0x7837, 0x0000, 0x080c, 0x6177, - 0x080c, 0x615a, 0x1170, 0x7084, 0x9005, 0x1158, 0x715c, 0x9186, - 0xffff, 0x0138, 0x2011, 0x0008, 0x080c, 0x5faf, 0x0168, 0x080c, - 0x6130, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, - 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x602c, - 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500, 0x2011, 0x6002, - 0x080c, 0x8993, 0x9086, 0x0014, 0x11b8, 0x080c, 0x6177, 0x2079, - 0x0260, 0x7a30, 0x9296, 0x1103, 0x1178, 0x7834, 0x9005, 0x1160, - 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, - 0x709b, 0x0006, 0x0029, 0x0010, 0x080c, 0x6153, 0x00fe, 0x0005, - 0x00f6, 0x709b, 0x0007, 0x080c, 0x60fb, 0x2079, 0x0240, 0x7833, - 0x1104, 0x7837, 0x0000, 0x080c, 0x6177, 0x080c, 0x615a, 0x11b8, - 0x7084, 0x9005, 0x11a0, 0x7164, 0x9186, 0xffff, 0x0180, 0x9180, - 0x348e, 0x200d, 0x918c, 0xff00, 0x810f, 0x2011, 0x0008, 0x080c, - 0x5faf, 0x0180, 0x080c, 0x512e, 0x0110, 0x080c, 0x26f5, 0x20a9, - 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, - 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x602c, 0x00fe, 0x0005, - 0x00f6, 0x7090, 0x9005, 0x0500, 0x2011, 0x6002, 0x080c, 0x8993, - 0x9086, 0x0014, 0x11b8, 0x080c, 0x6177, 0x2079, 0x0260, 0x7a30, - 0x9296, 0x1104, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, - 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, 0x0008, - 0x0029, 0x0010, 0x080c, 0x6153, 0x00fe, 0x0005, 0x00f6, 0x709b, - 0x0009, 0x080c, 0x60fb, 0x2079, 0x0240, 0x7833, 0x1105, 0x7837, - 0x0100, 0x080c, 0x615a, 0x1150, 0x7084, 0x9005, 0x1138, 0x080c, - 0x5f22, 0x1188, 0x9085, 0x0001, 0x080c, 0x26f5, 0x20a9, 0x0008, - 0x080c, 0x6177, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, - 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x602c, 0x0010, - 0x080c, 0x5a7c, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x05a8, - 0x2011, 0x6002, 0x080c, 0x8993, 0x9086, 0x0014, 0x1560, 0x080c, - 0x6177, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1105, 0x1520, 0x7834, - 0x9084, 0x0100, 0x2011, 0x0100, 0x921e, 0x1160, 0x7a38, 0xd2fc, - 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, 0x000a, - 0x00b1, 0x0098, 0x9005, 0x1178, 0x7a38, 0xd2fc, 0x0128, 0x70c4, - 0x9005, 0x1110, 0x70c7, 0x0001, 0x7097, 0x0000, 0x709b, 0x000e, - 0x080c, 0x5cca, 0x0010, 0x080c, 0x6153, 0x00fe, 0x0005, 0x00f6, - 0x709b, 0x000b, 0x2011, 0x1d0e, 0x20e9, 0x0001, 0x22a0, 0x20a9, - 0x0040, 0x2019, 0xffff, 0x4304, 0x080c, 0x60fb, 0x2079, 0x0240, - 0x7833, 0x1106, 0x7837, 0x0000, 0x080c, 0x615a, 0x0118, 0x2013, - 0x0000, 0x0020, 0x7060, 0x9085, 0x0100, 0x2012, 0x20a9, 0x0040, - 0x2009, 0x024e, 0x2011, 0x1d0e, 0x220e, 0x8210, 0x8108, 0x9186, - 0x0260, 0x1128, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x1f04, - 0x5c4c, 0x60c3, 0x0084, 0x080c, 0x602c, 0x00fe, 0x0005, 0x00f6, - 0x7090, 0x9005, 0x01c0, 0x2011, 0x6002, 0x080c, 0x8993, 0x9086, - 0x0084, 0x1178, 0x080c, 0x6177, 0x2079, 0x0260, 0x7a30, 0x9296, - 0x1106, 0x1138, 0x7834, 0x9005, 0x1120, 0x709b, 0x000c, 0x0029, - 0x0010, 0x080c, 0x6153, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x000d, - 0x080c, 0x60fb, 0x2079, 0x0240, 0x7833, 0x1107, 0x7837, 0x0000, - 0x080c, 0x6177, 0x20a9, 0x0040, 0x2011, 0x026e, 0x2009, 0x024e, - 0x220e, 0x8210, 0x8108, 0x9186, 0x0260, 0x1150, 0x6810, 0x8000, - 0x6812, 0x2009, 0x0240, 0x6814, 0x8000, 0x6816, 0x2011, 0x0260, - 0x1f04, 0x5c90, 0x60c3, 0x0084, 0x080c, 0x602c, 0x00fe, 0x0005, - 0x00f6, 0x7090, 0x9005, 0x01e0, 0x2011, 0x6002, 0x080c, 0x8993, - 0x9086, 0x0084, 0x1198, 0x080c, 0x6177, 0x2079, 0x0260, 0x7a30, - 0x9296, 0x1107, 0x1158, 0x7834, 0x9005, 0x1140, 0x7097, 0x0001, - 0x080c, 0x60cd, 0x709b, 0x000e, 0x0029, 0x0010, 0x080c, 0x6153, - 0x00fe, 0x0005, 0x918d, 0x0001, 0x080c, 0x61a2, 0x709b, 0x000f, - 0x7093, 0x0000, 0x2061, 0x0140, 0x605b, 0xbc85, 0x605f, 0xb5b5, - 0x2061, 0x0100, 0x6043, 0x0005, 0x6043, 0x0004, 0x2009, 0x07d0, - 0x2011, 0x6002, 0x080c, 0x8987, 0x0005, 0x7090, 0x9005, 0x0130, - 0x2011, 0x6002, 0x080c, 0x8993, 0x709b, 0x0000, 0x0005, 0x709b, - 0x0011, 0x080c, 0xaaf1, 0x080c, 0x6177, 0x20e1, 0x0000, 0x2099, - 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x7490, 0x9480, 0x0018, - 0x9080, 0x0007, 0x9084, 0x03f8, 0x8004, 0x20a8, 0x4003, 0x080c, - 0x615a, 0x11a0, 0x717c, 0x81ff, 0x0188, 0x900e, 0x7080, 0x9084, - 0x00ff, 0x0160, 0x080c, 0x268c, 0x9186, 0x007e, 0x0138, 0x9186, - 0x0080, 0x0120, 0x2011, 0x0008, 0x080c, 0x5faf, 0x60c3, 0x0014, - 0x080c, 0x602c, 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500, 0x2011, - 0x6002, 0x080c, 0x8993, 0x9086, 0x0014, 0x11b8, 0x080c, 0x6177, - 0x2079, 0x0260, 0x7a30, 0x9296, 0x1103, 0x1178, 0x7834, 0x9005, - 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, - 0x0001, 0x709b, 0x0012, 0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, - 0x0005, 0x00f6, 0x709b, 0x0013, 0x080c, 0x6109, 0x2079, 0x0240, - 0x7833, 0x1103, 0x7837, 0x0000, 0x080c, 0x6177, 0x080c, 0x615a, - 0x1170, 0x7084, 0x9005, 0x1158, 0x715c, 0x9186, 0xffff, 0x0138, - 0x2011, 0x0008, 0x080c, 0x5faf, 0x0168, 0x080c, 0x6130, 0x20a9, - 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, - 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x602c, 0x00fe, 0x0005, - 0x00f6, 0x7090, 0x9005, 0x0500, 0x2011, 0x6002, 0x080c, 0x8993, - 0x9086, 0x0014, 0x11b8, 0x080c, 0x6177, 0x2079, 0x0260, 0x7a30, - 0x9296, 0x1104, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, - 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, 0x0014, - 0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x709b, - 0x0015, 0x080c, 0x6109, 0x2079, 0x0240, 0x7833, 0x1104, 0x7837, - 0x0000, 0x080c, 0x6177, 0x080c, 0x615a, 0x11b8, 0x7084, 0x9005, - 0x11a0, 0x7164, 0x9186, 0xffff, 0x0180, 0x9180, 0x348e, 0x200d, - 0x918c, 0xff00, 0x810f, 0x2011, 0x0008, 0x080c, 0x5faf, 0x0180, - 0x080c, 0x512e, 0x0110, 0x080c, 0x26f5, 0x20a9, 0x0008, 0x20e1, - 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, - 0x60c3, 0x0014, 0x080c, 0x602c, 0x00fe, 0x0005, 0x00f6, 0x7090, - 0x9005, 0x05f0, 0x2011, 0x6002, 0x080c, 0x8993, 0x9086, 0x0014, - 0x15a8, 0x080c, 0x6177, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1105, - 0x1568, 0x7834, 0x9084, 0x0100, 0x2011, 0x0100, 0x921e, 0x1168, - 0x9085, 0x0001, 0x080c, 0x61a2, 0x7a38, 0xd2fc, 0x0128, 0x70c4, - 0x9005, 0x1110, 0x70c7, 0x0001, 0x0080, 0x9005, 0x11b8, 0x7a38, - 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x9085, - 0x0001, 0x080c, 0x61a2, 0x7097, 0x0000, 0x7a38, 0xd2f4, 0x0110, - 0x70df, 0x0008, 0x709b, 0x0016, 0x0029, 0x0010, 0x7093, 0x0000, - 0x00fe, 0x0005, 0x080c, 0xaaf1, 0x080c, 0x6177, 0x20e1, 0x0000, - 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000e, - 0x4003, 0x2011, 0x026d, 0x2204, 0x9084, 0x0100, 0x2011, 0x024d, - 0x2012, 0x2011, 0x026e, 0x709b, 0x0017, 0x080c, 0x615a, 0x1150, - 0x7084, 0x9005, 0x1138, 0x080c, 0x5f22, 0x1188, 0x9085, 0x0001, - 0x080c, 0x26f5, 0x20a9, 0x0008, 0x080c, 0x6177, 0x20e1, 0x0000, - 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, - 0x0014, 0x080c, 0x602c, 0x0010, 0x080c, 0x5a7c, 0x0005, 0x00f6, - 0x7090, 0x9005, 0x01d8, 0x2011, 0x6002, 0x080c, 0x8993, 0x9086, - 0x0084, 0x1190, 0x080c, 0x6177, 0x2079, 0x0260, 0x7a30, 0x9296, - 0x1106, 0x1150, 0x7834, 0x9005, 0x1138, 0x9006, 0x080c, 0x61a2, - 0x709b, 0x0018, 0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, - 0x00f6, 0x709b, 0x0019, 0x080c, 0x6109, 0x2079, 0x0240, 0x7833, - 0x1106, 0x7837, 0x0000, 0x080c, 0x6177, 0x2009, 0x026e, 0x2039, - 0x1d0e, 0x20a9, 0x0040, 0x213e, 0x8738, 0x8108, 0x9186, 0x0280, - 0x1128, 0x6814, 0x8000, 0x6816, 0x2009, 0x0260, 0x1f04, 0x5e8b, - 0x2039, 0x1d0e, 0x080c, 0x615a, 0x11e8, 0x2728, 0x2514, 0x8207, - 0x9084, 0x00ff, 0x8000, 0x2018, 0x9294, 0x00ff, 0x8007, 0x9205, - 0x202a, 0x7060, 0x2310, 0x8214, 0x92a0, 0x1d0e, 0x2414, 0x938c, - 0x0001, 0x0118, 0x9294, 0xff00, 0x0018, 0x9294, 0x00ff, 0x8007, - 0x9215, 0x2222, 0x20a9, 0x0040, 0x2009, 0x024e, 0x270e, 0x8738, - 0x8108, 0x9186, 0x0260, 0x1128, 0x6810, 0x8000, 0x6812, 0x2009, - 0x0240, 0x1f04, 0x5ebe, 0x60c3, 0x0084, 0x080c, 0x602c, 0x00fe, - 0x0005, 0x00f6, 0x7090, 0x9005, 0x01e0, 0x2011, 0x6002, 0x080c, - 0x8993, 0x9086, 0x0084, 0x1198, 0x080c, 0x6177, 0x2079, 0x0260, - 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834, 0x9005, 0x1140, 0x7097, - 0x0001, 0x080c, 0x60cd, 0x709b, 0x001a, 0x0029, 0x0010, 0x7093, - 0x0000, 0x00fe, 0x0005, 0x9085, 0x0001, 0x080c, 0x61a2, 0x709b, - 0x001b, 0x080c, 0xaaf1, 0x080c, 0x6177, 0x2011, 0x0260, 0x2009, - 0x0240, 0x7490, 0x9480, 0x0018, 0x9080, 0x0007, 0x9084, 0x03f8, - 0x8004, 0x20a8, 0x220e, 0x8210, 0x8108, 0x9186, 0x0260, 0x1150, - 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x6814, 0x8000, 0x6816, - 0x2011, 0x0260, 0x1f04, 0x5f0a, 0x60c3, 0x0084, 0x080c, 0x602c, - 0x0005, 0x0005, 0x0086, 0x0096, 0x2029, 0x1848, 0x252c, 0x20a9, - 0x0008, 0x2041, 0x1d0e, 0x20e9, 0x0001, 0x28a0, 0x080c, 0x6177, - 0x20e1, 0x0000, 0x2099, 0x026e, 0x4003, 0x20a9, 0x0008, 0x2011, - 0x0007, 0xd5d4, 0x0108, 0x9016, 0x2800, 0x9200, 0x200c, 0x91a6, - 0xffff, 0x1148, 0xd5d4, 0x0110, 0x8210, 0x0008, 0x8211, 0x1f04, - 0x5f3c, 0x0804, 0x5fab, 0x82ff, 0x1160, 0xd5d4, 0x0120, 0x91a6, - 0x3fff, 0x0d90, 0x0020, 0x91a6, 0x3fff, 0x0904, 0x5fab, 0x918d, - 0xc000, 0x20a9, 0x0010, 0x2019, 0x0001, 0xd5d4, 0x0110, 0x2019, - 0x0010, 0x2120, 0xd5d4, 0x0110, 0x8423, 0x0008, 0x8424, 0x1240, - 0xd5d4, 0x0110, 0x8319, 0x0008, 0x8318, 0x1f04, 0x5f62, 0x04d8, - 0x23a8, 0x2021, 0x0001, 0x8426, 0x8425, 0x1f04, 0x5f74, 0x2328, - 0x8529, 0x92be, 0x0007, 0x0158, 0x0006, 0x2039, 0x0007, 0x2200, - 0x973a, 0x000e, 0x27a8, 0x95a8, 0x0010, 0x1f04, 0x5f83, 0x755e, - 0x95c8, 0x348e, 0x292d, 0x95ac, 0x00ff, 0x7582, 0x6532, 0x6536, - 0x0016, 0x2508, 0x080c, 0x26d5, 0x001e, 0x60e7, 0x0000, 0x65ea, - 0x2018, 0x2304, 0x9405, 0x201a, 0x7087, 0x0001, 0x20e9, 0x0000, - 0x20a1, 0x024e, 0x20e1, 0x0001, 0x2898, 0x20a9, 0x0008, 0x4003, - 0x9085, 0x0001, 0x0008, 0x9006, 0x009e, 0x008e, 0x0005, 0x0156, - 0x01c6, 0x01d6, 0x0136, 0x0146, 0x22a8, 0x20e1, 0x0000, 0x2099, - 0x026e, 0x20e9, 0x0000, 0x2011, 0x024e, 0x22a0, 0x4003, 0x014e, - 0x013e, 0x01de, 0x01ce, 0x015e, 0x2118, 0x9026, 0x2001, 0x0007, - 0x939a, 0x0010, 0x0218, 0x8420, 0x8001, 0x0cd0, 0x2118, 0x84ff, - 0x0120, 0x939a, 0x0010, 0x8421, 0x1de0, 0x2021, 0x0001, 0x83ff, - 0x0118, 0x8423, 0x8319, 0x1de8, 0x9238, 0x2029, 0x026e, 0x9528, - 0x2504, 0x942c, 0x11b8, 0x9405, 0x203a, 0x715e, 0x91a0, 0x348e, - 0x242d, 0x95ac, 0x00ff, 0x7582, 0x6532, 0x6536, 0x0016, 0x2508, - 0x080c, 0x26d5, 0x001e, 0x60e7, 0x0000, 0x65ea, 0x7087, 0x0001, - 0x9084, 0x0000, 0x0005, 0x00e6, 0x2071, 0x1800, 0x708b, 0x0000, - 0x00ee, 0x0005, 0x00e6, 0x00f6, 0x2079, 0x0100, 0x2071, 0x0140, - 0x080c, 0x60bc, 0x080c, 0xa2a0, 0x7004, 0x9084, 0x4000, 0x0110, - 0x080c, 0x2aa9, 0x0126, 0x2091, 0x8000, 0x2071, 0x1826, 0x2073, - 0x0000, 0x7840, 0x0026, 0x0016, 0x2009, 0x00f7, 0x080c, 0x6119, - 0x001e, 0x9094, 0x0010, 0x9285, 0x0080, 0x7842, 0x7a42, 0x002e, - 0x012e, 0x00fe, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, - 0x2a04, 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x2011, - 0x19f5, 0x2013, 0x0000, 0x7093, 0x0000, 0x012e, 0x60a3, 0x0056, - 0x60a7, 0x9575, 0x080c, 0xa293, 0x6144, 0xd184, 0x0120, 0x7198, - 0x918d, 0x2000, 0x0018, 0x718c, 0x918d, 0x1000, 0x2011, 0x1999, - 0x2112, 0x2009, 0x07d0, 0x2011, 0x6002, 0x080c, 0x8a5d, 0x0005, - 0x0016, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xacfc, - 0x080c, 0xb09b, 0x080c, 0xad18, 0x2009, 0x00f7, 0x080c, 0x6119, - 0x2061, 0x1a04, 0x900e, 0x611a, 0x611e, 0x617a, 0x617e, 0x2061, - 0x1800, 0x6003, 0x0001, 0x2061, 0x0100, 0x6043, 0x0090, 0x6043, - 0x0010, 0x2009, 0x1999, 0x200b, 0x0000, 0x2009, 0x002d, 0x2011, - 0x6088, 0x080c, 0x8987, 0x012e, 0x00ce, 0x002e, 0x001e, 0x0005, - 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, 0x0471, 0x2071, 0x0100, - 0x080c, 0xa2a0, 0x2071, 0x0140, 0x7004, 0x9084, 0x4000, 0x0110, - 0x080c, 0x2aa9, 0x080c, 0x77a6, 0x0188, 0x080c, 0x77c1, 0x1170, - 0x080c, 0x7ac0, 0x0016, 0x080c, 0x27a4, 0x2001, 0x196d, 0x2102, - 0x001e, 0x080c, 0x7abb, 0x080c, 0x76cd, 0x0050, 0x2009, 0x0001, - 0x080c, 0x2a85, 0x2001, 0x0001, 0x080c, 0x2631, 0x080c, 0x6058, - 0x012e, 0x000e, 0x00ee, 0x0005, 0x2001, 0x180e, 0x2004, 0xd0bc, - 0x0158, 0x0026, 0x0036, 0x2011, 0x8017, 0x2001, 0x1999, 0x201c, - 0x080c, 0x4ca1, 0x003e, 0x002e, 0x0005, 0x20a9, 0x0012, 0x20e9, - 0x0001, 0x20a1, 0x1d80, 0x080c, 0x6177, 0x20e9, 0x0000, 0x2099, - 0x026e, 0x0099, 0x20a9, 0x0020, 0x080c, 0x6171, 0x2099, 0x0260, - 0x20a1, 0x1d92, 0x0051, 0x20a9, 0x000e, 0x080c, 0x6174, 0x2099, - 0x0260, 0x20a1, 0x1db2, 0x0009, 0x0005, 0x0016, 0x0026, 0x3410, - 0x3308, 0x2104, 0x8007, 0x2012, 0x8108, 0x8210, 0x1f04, 0x60f1, - 0x002e, 0x001e, 0x0005, 0x080c, 0xaaf1, 0x20e1, 0x0001, 0x2099, - 0x1d00, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, - 0x0005, 0x080c, 0xaaf1, 0x080c, 0x6177, 0x20e1, 0x0000, 0x2099, - 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, - 0x0005, 0x00c6, 0x0006, 0x2061, 0x0100, 0x810f, 0x2001, 0x1834, - 0x2004, 0x9005, 0x1138, 0x2001, 0x1818, 0x2004, 0x9084, 0x00ff, - 0x9105, 0x0010, 0x9185, 0x00f7, 0x604a, 0x000e, 0x00ce, 0x0005, - 0x0016, 0x0046, 0x080c, 0x6c0d, 0x0158, 0x9006, 0x2020, 0x2009, - 0x002a, 0x080c, 0xea8d, 0x2001, 0x180c, 0x200c, 0xc195, 0x2102, - 0x2019, 0x002a, 0x900e, 0x080c, 0x32da, 0x080c, 0xd645, 0x0140, - 0x0036, 0x2019, 0xffff, 0x2021, 0x0007, 0x080c, 0x4e58, 0x003e, - 0x004e, 0x001e, 0x0005, 0x080c, 0x6058, 0x709b, 0x0000, 0x7093, - 0x0000, 0x0005, 0x0006, 0x2001, 0x180c, 0x2004, 0xd09c, 0x0100, - 0x000e, 0x0005, 0x0006, 0x0016, 0x0126, 0x2091, 0x8000, 0x2001, - 0x0101, 0x200c, 0x918d, 0x0006, 0x2102, 0x012e, 0x001e, 0x000e, - 0x0005, 0x2009, 0x0001, 0x0020, 0x2009, 0x0002, 0x0008, 0x900e, - 0x6814, 0x9084, 0xffc0, 0x910d, 0x6916, 0x0005, 0x00f6, 0x0156, - 0x0146, 0x01d6, 0x9006, 0x20a9, 0x0080, 0x20e9, 0x0001, 0x20a1, - 0x1d00, 0x4004, 0x2079, 0x1d00, 0x7803, 0x2200, 0x7807, 0x00ef, - 0x780f, 0x00ef, 0x7813, 0x0138, 0x7823, 0xffff, 0x7827, 0xffff, - 0x01de, 0x014e, 0x015e, 0x00fe, 0x0005, 0x2001, 0x1800, 0x2003, - 0x0001, 0x0005, 0x2001, 0x19a7, 0x0118, 0x2003, 0x0001, 0x0010, - 0x2003, 0x0000, 0x0005, 0x0156, 0x20a9, 0x0800, 0x2009, 0x1000, - 0x9006, 0x200a, 0x8108, 0x1f04, 0x61b1, 0x015e, 0x0005, 0x00d6, - 0x0036, 0x0156, 0x0136, 0x0146, 0x2069, 0x1847, 0x9006, 0xb802, - 0xb8d6, 0xb807, 0x0707, 0xb80a, 0xb80e, 0xb812, 0x9198, 0x348e, - 0x231d, 0x939c, 0x00ff, 0xbb16, 0x0016, 0x0026, 0xb886, 0x080c, - 0xb094, 0x1120, 0x9192, 0x007e, 0x1208, 0xbb86, 0x20a9, 0x0004, - 0xb8c4, 0x20e8, 0xb9c8, 0x9198, 0x0006, 0x9006, 0x23a0, 0x4004, - 0x20a9, 0x0004, 0x9198, 0x000a, 0x23a0, 0x4004, 0x002e, 0x001e, - 0xb83e, 0xb842, 0xb8ce, 0xb8d2, 0xb85e, 0xb862, 0xb866, 0xb86a, - 0xb86f, 0x0100, 0xb872, 0xb876, 0xb87a, 0xb88a, 0xb88e, 0xb893, - 0x0008, 0xb896, 0xb89a, 0xb89e, 0xb8be, 0xb9a2, 0x0096, 0xb8a4, - 0x904d, 0x0110, 0x080c, 0x108b, 0xb8a7, 0x0000, 0x009e, 0x9006, - 0xb84a, 0x6810, 0xb83a, 0x680c, 0xb846, 0xb8bb, 0x0520, 0xb8ac, - 0x9005, 0x0198, 0x00c6, 0x2060, 0x9c82, 0x1ddc, 0x0a0c, 0x0d85, - 0x2001, 0x181a, 0x2004, 0x9c02, 0x1a0c, 0x0d85, 0x080c, 0x8eee, - 0x00ce, 0x090c, 0x928d, 0xb8af, 0x0000, 0x6814, 0x9084, 0x00ff, - 0xb842, 0x014e, 0x013e, 0x015e, 0x003e, 0x00de, 0x0005, 0x0126, - 0x2091, 0x8000, 0xa974, 0xae78, 0x9684, 0x3fff, 0x9082, 0x4000, - 0x1a04, 0x628d, 0x9182, 0x0800, 0x1a04, 0x6291, 0x2001, 0x180c, - 0x2004, 0x9084, 0x0003, 0x1904, 0x6297, 0x9188, 0x1000, 0x2104, - 0x905d, 0x0198, 0xb804, 0x9084, 0x00ff, 0x908e, 0x0006, 0x1188, - 0xb8a4, 0x900d, 0x1904, 0x62a9, 0x080c, 0x6669, 0x9006, 0x012e, - 0x0005, 0x2001, 0x0005, 0x900e, 0x04b8, 0x2001, 0x0028, 0x900e, - 0x0498, 0x9082, 0x0006, 0x1290, 0x080c, 0xb094, 0x1160, 0xb8a0, - 0x9084, 0xff80, 0x1140, 0xb900, 0xd1fc, 0x0d10, 0x2001, 0x0029, - 0x2009, 0x1000, 0x0408, 0x2001, 0x0028, 0x00a8, 0x2009, 0x180c, - 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0068, 0xd184, 0x0118, - 0x2001, 0x0004, 0x0040, 0x2001, 0x0029, 0xb900, 0xd1fc, 0x0118, - 0x2009, 0x1000, 0x0048, 0x900e, 0x0038, 0x2001, 0x0029, 0x900e, - 0x0018, 0x2001, 0x0029, 0x900e, 0x9005, 0x012e, 0x0005, 0x2001, - 0x180c, 0x2004, 0xd084, 0x19d0, 0x9188, 0x1000, 0x2104, 0x9065, - 0x09a8, 0x080c, 0x6c11, 0x1990, 0xb800, 0xd0bc, 0x0978, 0x0804, - 0x6250, 0x080c, 0x6a2a, 0x0904, 0x6259, 0x0804, 0x6254, 0x00e6, - 0x2071, 0x19e8, 0x7004, 0x9086, 0x0002, 0x1128, 0x7030, 0x9080, - 0x0004, 0x2004, 0x9b06, 0x00ee, 0x0005, 0x00b6, 0x00e6, 0x0126, - 0x2091, 0x8000, 0xa874, 0x908e, 0x00ff, 0x1120, 0x2001, 0x196b, - 0x205c, 0x0060, 0xa974, 0x9182, 0x0800, 0x1690, 0x9188, 0x1000, - 0x2104, 0x905d, 0x01d0, 0x080c, 0x6bb1, 0x11d0, 0x080c, 0xb116, - 0x0570, 0x2b00, 0x6012, 0x2900, 0x6016, 0x6023, 0x0009, 0x602b, - 0x0000, 0xa874, 0x908e, 0x00ff, 0x1110, 0x602b, 0x8000, 0x2009, - 0x0043, 0x080c, 0xb20a, 0x9006, 0x00b0, 0x2001, 0x0028, 0x0090, - 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, - 0xd184, 0x0118, 0x2001, 0x0004, 0x0010, 0x2001, 0x0029, 0x0010, - 0x2001, 0x0029, 0x9005, 0x012e, 0x00ee, 0x00be, 0x0005, 0x2001, - 0x002c, 0x0cc0, 0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, 0xa974, - 0x9182, 0x0800, 0x1a04, 0x6388, 0x9188, 0x1000, 0x2104, 0x905d, - 0x0904, 0x6360, 0xb8a0, 0x9086, 0x007f, 0x0190, 0xa87c, 0xd0fc, - 0x1178, 0x080c, 0x6c19, 0x0160, 0xa994, 0x81ff, 0x0130, 0x908e, - 0x0004, 0x0130, 0x908e, 0x0005, 0x0118, 0x080c, 0x6c11, 0x1598, - 0xa87c, 0xd0fc, 0x01e0, 0xa894, 0x9005, 0x01c8, 0x2060, 0x0026, - 0x2010, 0x080c, 0xcf09, 0x002e, 0x1120, 0x2001, 0x0008, 0x0804, - 0x638a, 0x6020, 0x9086, 0x000a, 0x0120, 0x2001, 0x0008, 0x0804, - 0x638a, 0x601a, 0x6003, 0x0008, 0x2900, 0x6016, 0x0058, 0x080c, - 0xb116, 0x05e8, 0x2b00, 0x6012, 0x2900, 0x6016, 0x600b, 0xffff, - 0x6023, 0x000a, 0x2009, 0x0003, 0x080c, 0xb20a, 0x9006, 0x0458, - 0x2001, 0x0028, 0x0438, 0x9082, 0x0006, 0x1290, 0x080c, 0xb094, - 0x1160, 0xb8a0, 0x9084, 0xff80, 0x1140, 0xb900, 0xd1fc, 0x0900, - 0x2001, 0x0029, 0x2009, 0x1000, 0x00a8, 0x2001, 0x0028, 0x0090, - 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0050, - 0xd184, 0x0118, 0x2001, 0x0004, 0x0028, 0x2001, 0x0029, 0x0010, - 0x2001, 0x0029, 0x9005, 0x012e, 0x00ee, 0x00be, 0x0005, 0x2001, - 0x002c, 0x0cc0, 0x00f6, 0x00b6, 0x0126, 0x2091, 0x8000, 0xa8e0, - 0x9005, 0x1550, 0xa8dc, 0x9082, 0x0101, 0x1630, 0xa8c8, 0x9005, - 0x1518, 0xa8c4, 0x9082, 0x0101, 0x12f8, 0xa974, 0x2079, 0x1800, - 0x9182, 0x0800, 0x12e8, 0x7830, 0x9084, 0x0003, 0x1130, 0xaa98, - 0xab94, 0xa878, 0x9084, 0x0007, 0x00ea, 0x7930, 0xd18c, 0x0118, - 0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, 0x0004, 0x0010, - 0x2001, 0x0029, 0x900e, 0x0038, 0x2001, 0x002c, 0x900e, 0x0018, - 0x2001, 0x0029, 0x900e, 0x9006, 0x0008, 0x9005, 0x012e, 0x00be, - 0x00fe, 0x0005, 0x641f, 0x63da, 0x63f1, 0x641f, 0x641f, 0x641f, - 0x641f, 0x641f, 0x2100, 0x9082, 0x007e, 0x1278, 0x080c, 0x6749, - 0x0148, 0x9046, 0xb810, 0x9306, 0x1904, 0x6427, 0xb814, 0x9206, - 0x15f0, 0x0028, 0xbb12, 0xba16, 0x0010, 0x080c, 0x4b54, 0x0150, - 0x04b0, 0x080c, 0x67b4, 0x1598, 0xb810, 0x9306, 0x1580, 0xb814, - 0x9206, 0x1568, 0x080c, 0xb116, 0x0530, 0x2b00, 0x6012, 0x080c, - 0xd3b6, 0x2900, 0x6016, 0x600b, 0xffff, 0x6023, 0x000a, 0xa878, - 0x9086, 0x0001, 0x1170, 0x080c, 0x3315, 0x9006, 0x080c, 0x66e6, - 0x2001, 0x0002, 0x080c, 0x66fa, 0x2001, 0x0200, 0xb86e, 0xb893, - 0x0002, 0x2009, 0x0003, 0x080c, 0xb20a, 0x9006, 0x0068, 0x2001, - 0x0001, 0x900e, 0x0038, 0x2001, 0x002c, 0x900e, 0x0018, 0x2001, - 0x0028, 0x900e, 0x9005, 0x0000, 0x012e, 0x00be, 0x00fe, 0x0005, - 0x00b6, 0x00f6, 0x00e6, 0x0126, 0x2091, 0x8000, 0xa894, 0x90c6, - 0x0015, 0x0904, 0x6612, 0x90c6, 0x0056, 0x0904, 0x6616, 0x90c6, - 0x0066, 0x0904, 0x661a, 0x90c6, 0x0067, 0x0904, 0x661e, 0x90c6, - 0x0068, 0x0904, 0x6622, 0x90c6, 0x0071, 0x0904, 0x6626, 0x90c6, - 0x0074, 0x0904, 0x662a, 0x90c6, 0x007c, 0x0904, 0x662e, 0x90c6, - 0x007e, 0x0904, 0x6632, 0x90c6, 0x0037, 0x0904, 0x6636, 0x9016, - 0x2079, 0x1800, 0xa974, 0x9186, 0x00ff, 0x0904, 0x660d, 0x9182, - 0x0800, 0x1a04, 0x660d, 0x080c, 0x67b4, 0x1198, 0xb804, 0x9084, - 0x00ff, 0x9082, 0x0006, 0x1268, 0xa894, 0x90c6, 0x006f, 0x0148, - 0x080c, 0xb094, 0x1904, 0x65f6, 0xb8a0, 0x9084, 0xff80, 0x1904, - 0x65f6, 0xa894, 0x90c6, 0x006f, 0x0158, 0x90c6, 0x005e, 0x0904, - 0x6556, 0x90c6, 0x0064, 0x0904, 0x657f, 0x2008, 0x0804, 0x6518, - 0xa998, 0xa8b0, 0x2040, 0x080c, 0xb094, 0x1120, 0x9182, 0x007f, - 0x0a04, 0x6518, 0x9186, 0x00ff, 0x0904, 0x6518, 0x9182, 0x0800, - 0x1a04, 0x6518, 0xaaa0, 0xab9c, 0x787c, 0x9306, 0x11a8, 0x7880, - 0x0096, 0x924e, 0x1128, 0x2208, 0x2310, 0x009e, 0x0804, 0x6518, - 0x080c, 0xb094, 0x1140, 0x99cc, 0xff00, 0x009e, 0x1128, 0x2208, - 0x2310, 0x0804, 0x6518, 0x009e, 0x080c, 0x4b54, 0x0904, 0x6522, - 0x900e, 0x9016, 0x90c6, 0x4000, 0x15e0, 0x0006, 0x080c, 0x6aae, - 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x20a9, 0x0004, - 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, 0xb8c4, 0x20e0, - 0xb8c8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0fd6, 0x20a9, 0x0004, - 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8c4, 0x20e0, - 0xb8c8, 0x9080, 0x000a, 0x2098, 0x080c, 0x0fd6, 0xa8c4, 0xabc8, - 0x9305, 0xabcc, 0x9305, 0xabd0, 0x9305, 0xabd4, 0x9305, 0xabd8, - 0x9305, 0xabdc, 0x9305, 0xabe0, 0x9305, 0x9005, 0x0510, 0x000e, - 0x00c8, 0x90c6, 0x4007, 0x1110, 0x2408, 0x00a0, 0x90c6, 0x4008, - 0x1118, 0x2708, 0x2610, 0x0070, 0x90c6, 0x4009, 0x1108, 0x0050, - 0x90c6, 0x4006, 0x0138, 0x2001, 0x4005, 0x2009, 0x000a, 0x0010, - 0x2001, 0x4006, 0xa896, 0xa99a, 0xaa9e, 0x2001, 0x0030, 0x900e, - 0x0478, 0x000e, 0x080c, 0xb116, 0x1130, 0x2001, 0x4005, 0x2009, - 0x0003, 0x9016, 0x0c78, 0x2b00, 0x6012, 0x080c, 0xd3b6, 0x2900, - 0x6016, 0x6023, 0x0001, 0xa868, 0xd88c, 0x0108, 0xc0f5, 0xa86a, - 0x0126, 0x2091, 0x8000, 0x080c, 0x3315, 0x012e, 0x9006, 0x080c, - 0x66e6, 0x2001, 0x0002, 0x080c, 0x66fa, 0x2009, 0x0002, 0x080c, - 0xb20a, 0xa8b0, 0xd094, 0x0118, 0xb8d4, 0xc08d, 0xb8d6, 0x9006, - 0x9005, 0x012e, 0x00ee, 0x00fe, 0x00be, 0x0005, 0x080c, 0x5854, - 0x0118, 0x2009, 0x0007, 0x00f8, 0xa998, 0xaeb0, 0x080c, 0x67b4, - 0x1904, 0x6513, 0x9186, 0x007f, 0x0130, 0x080c, 0x6c11, 0x0118, - 0x2009, 0x0009, 0x0080, 0x0096, 0x080c, 0x1059, 0x1120, 0x009e, - 0x2009, 0x0002, 0x0040, 0x2900, 0x009e, 0xa806, 0x080c, 0xd109, - 0x19b0, 0x2009, 0x0003, 0x2001, 0x4005, 0x0804, 0x651a, 0xa998, - 0xaeb0, 0x080c, 0x67b4, 0x1904, 0x6513, 0x0096, 0x080c, 0x1059, - 0x1128, 0x009e, 0x2009, 0x0002, 0x0804, 0x65d3, 0x2900, 0x009e, - 0xa806, 0x0096, 0x2048, 0x20a9, 0x002b, 0xb8c4, 0x20e0, 0xb8c8, - 0x2098, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, - 0x20a9, 0x0008, 0x9080, 0x0006, 0x20a0, 0xbbc8, 0x9398, 0x0006, - 0x2398, 0x080c, 0x0fd6, 0x009e, 0xa87b, 0x0000, 0xa883, 0x0000, - 0xa897, 0x4000, 0xd684, 0x1168, 0x080c, 0x5840, 0xd0b4, 0x1118, - 0xa89b, 0x000b, 0x00e0, 0xb800, 0xd08c, 0x0118, 0xa89b, 0x000c, - 0x00b0, 0x080c, 0x6c11, 0x0118, 0xa89b, 0x0009, 0x0080, 0x080c, - 0x5854, 0x0118, 0xa89b, 0x0007, 0x0050, 0x080c, 0xd0ec, 0x1904, - 0x654f, 0x2009, 0x0003, 0x2001, 0x4005, 0x0804, 0x651a, 0xa87b, - 0x0030, 0xa897, 0x4005, 0xa804, 0x8006, 0x8006, 0x8007, 0x90bc, - 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0, - 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, 0x12a8, 0x080c, - 0xb691, 0x1904, 0x654f, 0x2009, 0x0002, 0x08e8, 0x2001, 0x0028, - 0x900e, 0x0804, 0x6550, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, - 0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, 0x0004, 0x0010, - 0x2001, 0x0029, 0x900e, 0x0804, 0x6550, 0x2001, 0x0029, 0x900e, - 0x0804, 0x6550, 0x080c, 0x38c0, 0x0804, 0x6551, 0x080c, 0x555d, - 0x0804, 0x6551, 0x080c, 0x46d5, 0x0804, 0x6551, 0x080c, 0x474e, - 0x0804, 0x6551, 0x080c, 0x47aa, 0x0804, 0x6551, 0x080c, 0x4c17, - 0x0804, 0x6551, 0x080c, 0x4edf, 0x0804, 0x6551, 0x080c, 0x51c4, - 0x0804, 0x6551, 0x080c, 0x53bd, 0x0804, 0x6551, 0x080c, 0x3afe, - 0x0804, 0x6551, 0x00b6, 0xa974, 0xae78, 0x9684, 0x3fff, 0x9082, - 0x4000, 0x1608, 0x9182, 0x0800, 0x1258, 0x9188, 0x1000, 0x2104, - 0x905d, 0x0130, 0x080c, 0x6c11, 0x1138, 0x00d9, 0x9006, 0x00b0, - 0x2001, 0x0028, 0x900e, 0x0090, 0x9082, 0x0006, 0x1240, 0xb900, - 0xd1fc, 0x0d98, 0x2001, 0x0029, 0x2009, 0x1000, 0x0038, 0x2001, - 0x0029, 0x900e, 0x0018, 0x2001, 0x0029, 0x900e, 0x9005, 0x00be, - 0x0005, 0xa877, 0x0000, 0xb8d0, 0x9005, 0x1904, 0x66da, 0xb888, - 0x9005, 0x1904, 0x66da, 0xb838, 0xb93c, 0x9102, 0x1a04, 0x66da, - 0x2b10, 0x080c, 0xb143, 0x0904, 0x66d6, 0x8108, 0xb93e, 0x6212, - 0x2900, 0x6016, 0x6023, 0x0003, 0x600b, 0xffff, 0x6007, 0x0040, - 0xa878, 0x605e, 0xa880, 0x6066, 0xa883, 0x0000, 0xa87c, 0xd0ac, - 0x05b8, 0xc0dd, 0xa87e, 0xa888, 0x8001, 0x1560, 0x2011, 0x180d, - 0x2214, 0xd28c, 0x190c, 0x6cd6, 0xa816, 0xa864, 0x9094, 0x00f7, - 0x9296, 0x0011, 0x11f8, 0x9084, 0x00ff, 0xc0bd, 0x601e, 0xa8ac, - 0xaab0, 0xa836, 0xaa3a, 0x2001, 0x000f, 0x8001, 0x1df0, 0x2001, - 0x8004, 0x6003, 0x0004, 0x6046, 0x00f6, 0x2079, 0x0380, 0x7818, - 0xd0bc, 0x1de8, 0x7833, 0x0010, 0x2c00, 0x7836, 0x781b, 0x8080, - 0x00fe, 0x0005, 0x080c, 0x17ad, 0x601c, 0xc0bd, 0x601e, 0x0c38, - 0x2009, 0x180d, 0x210c, 0xd18c, 0x190c, 0x6ce0, 0xd0b4, 0x190c, - 0x1c9c, 0x2001, 0x8004, 0x6003, 0x0002, 0x08e8, 0x81ff, 0x1110, - 0xb88b, 0x0001, 0x2908, 0xb8cc, 0xb9ce, 0x9005, 0x1110, 0xb9d2, - 0x0020, 0x0096, 0x2048, 0xa902, 0x009e, 0x0005, 0x00b6, 0x0126, - 0x00c6, 0x0026, 0x2091, 0x8000, 0x6210, 0x2258, 0xba00, 0x9005, - 0x0110, 0xc285, 0x0008, 0xc284, 0xba02, 0x002e, 0x00ce, 0x012e, - 0x00be, 0x0005, 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, 0x6210, - 0x2258, 0xba04, 0x0006, 0x9086, 0x0006, 0x1170, 0xb89c, 0xd0ac, - 0x0158, 0x080c, 0x6c0d, 0x0140, 0x9284, 0xff00, 0x8007, 0x9086, - 0x0007, 0x1110, 0x2011, 0x0600, 0x000e, 0x9294, 0xff00, 0x9215, - 0xba06, 0x0006, 0x9086, 0x0006, 0x1120, 0xba90, 0x82ff, 0x090c, - 0x0d85, 0x000e, 0x00ce, 0x012e, 0x00be, 0x0005, 0x00b6, 0x0126, - 0x00c6, 0x2091, 0x8000, 0x6210, 0x2258, 0xba04, 0x0006, 0x9086, - 0x0006, 0x1168, 0xb89c, 0xd0a4, 0x0150, 0x080c, 0x6c09, 0x1138, - 0x9284, 0x00ff, 0x9086, 0x0007, 0x1110, 0x2011, 0x0006, 0x000e, - 0x9294, 0x00ff, 0x8007, 0x9215, 0xba06, 0x00ce, 0x012e, 0x00be, - 0x0005, 0x9182, 0x0800, 0x0218, 0x9085, 0x0001, 0x0005, 0x00d6, - 0x0026, 0x9190, 0x1000, 0x2204, 0x905d, 0x1188, 0x0096, 0x080c, - 0x1059, 0x2958, 0x009e, 0x0168, 0x2b00, 0x2012, 0xb85c, 0xb8ca, - 0xb860, 0xb8c6, 0x9006, 0xb8a6, 0xb8ae, 0x080c, 0x61b7, 0x9006, - 0x0010, 0x9085, 0x0001, 0x002e, 0x00de, 0x0005, 0x00b6, 0x0096, - 0x0126, 0x2091, 0x8000, 0x0026, 0x9182, 0x0800, 0x0218, 0x9085, - 0x0001, 0x04a8, 0x00d6, 0x9190, 0x1000, 0x2204, 0x905d, 0x0568, - 0x2013, 0x0000, 0xb8a4, 0x904d, 0x0110, 0x080c, 0x108b, 0x00d6, - 0x00c6, 0xb8bc, 0x2060, 0x8cff, 0x0168, 0x600c, 0x0006, 0x6014, - 0x2048, 0x080c, 0xcf1b, 0x0110, 0x080c, 0x100b, 0x080c, 0xb16c, - 0x00ce, 0x0c88, 0x00ce, 0x00de, 0x00c6, 0xb8ac, 0x9065, 0x0128, - 0x621c, 0xd2c4, 0x0110, 0x080c, 0x928d, 0x00ce, 0x2b48, 0xb8c8, - 0xb85e, 0xb8c4, 0xb862, 0x080c, 0x109b, 0x00de, 0x9006, 0x002e, - 0x012e, 0x009e, 0x00be, 0x0005, 0x0016, 0x9182, 0x0800, 0x0218, - 0x9085, 0x0001, 0x0030, 0x9188, 0x1000, 0x2104, 0x905d, 0x0dc0, - 0x9006, 0x001e, 0x0005, 0x00d6, 0x0156, 0x0136, 0x0146, 0x9006, - 0xb80a, 0xb80e, 0xb800, 0xc08c, 0xb802, 0x080c, 0x779e, 0x1510, - 0xb8a0, 0x9086, 0x007e, 0x0120, 0x080c, 0xb094, 0x11d8, 0x0078, - 0x7040, 0xd0e4, 0x01b8, 0x00c6, 0x2061, 0x1982, 0x7048, 0x2062, - 0x704c, 0x6006, 0x7050, 0x600a, 0x7054, 0x600e, 0x00ce, 0x703c, - 0x2069, 0x0140, 0x9005, 0x1110, 0x2001, 0x0001, 0x6886, 0x2069, - 0x1800, 0x68b6, 0x7040, 0xb85e, 0x7048, 0xb862, 0x704c, 0xb866, - 0x20e1, 0x0000, 0x2099, 0x0276, 0xb8c4, 0x20e8, 0xb8c8, 0x9088, - 0x000a, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2099, 0x027a, 0x9088, - 0x0006, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2069, 0x0200, 0x6817, - 0x0001, 0x7040, 0xb86a, 0x7144, 0xb96e, 0x7048, 0xb872, 0x7050, - 0xb876, 0x2069, 0x0200, 0x6817, 0x0000, 0xb8a0, 0x9086, 0x007e, - 0x1110, 0x7144, 0xb96e, 0x9182, 0x0211, 0x1218, 0x2009, 0x0008, - 0x0400, 0x9182, 0x0259, 0x1218, 0x2009, 0x0007, 0x00d0, 0x9182, - 0x02c1, 0x1218, 0x2009, 0x0006, 0x00a0, 0x9182, 0x0349, 0x1218, - 0x2009, 0x0005, 0x0070, 0x9182, 0x0421, 0x1218, 0x2009, 0x0004, - 0x0040, 0x9182, 0x0581, 0x1218, 0x2009, 0x0003, 0x0010, 0x2009, - 0x0002, 0xb992, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005, 0x0016, - 0x0026, 0x00e6, 0x2071, 0x0260, 0x7034, 0xb896, 0x703c, 0xb89a, - 0x7054, 0xb89e, 0x0036, 0xbbd4, 0xc384, 0xba00, 0x2009, 0x1867, - 0x210c, 0xd0bc, 0x0120, 0xd1ec, 0x0110, 0xc2ad, 0x0008, 0xc2ac, - 0xd0c4, 0x0148, 0xd1e4, 0x0138, 0xc2bd, 0xd0cc, 0x0128, 0xd38c, - 0x1108, 0xc385, 0x0008, 0xc2bc, 0xba02, 0xbbd6, 0x003e, 0x00ee, - 0x002e, 0x001e, 0x0005, 0x0096, 0x0126, 0x2091, 0x8000, 0xb8a4, - 0x904d, 0x0578, 0xa900, 0x81ff, 0x15c0, 0xaa04, 0x9282, 0x0010, - 0x16c8, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x8906, 0x8006, 0x8007, - 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0, 0x9080, 0x0004, 0x2098, - 0x2009, 0x0010, 0x20a9, 0x0001, 0x4002, 0x9086, 0xffff, 0x0120, - 0x8109, 0x1dd0, 0x080c, 0x0d85, 0x3c00, 0x20e8, 0x3300, 0x8001, - 0x20a0, 0x4604, 0x8210, 0xaa06, 0x01de, 0x01ce, 0x014e, 0x013e, - 0x0060, 0x080c, 0x1059, 0x0170, 0x2900, 0xb8a6, 0xa803, 0x0000, - 0x080c, 0x6a4a, 0xa807, 0x0001, 0xae12, 0x9085, 0x0001, 0x012e, - 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0126, 0x2091, 0x8000, 0x0096, - 0xb8a4, 0x904d, 0x0188, 0xa800, 0x9005, 0x1150, 0x080c, 0x6a59, - 0x1158, 0xa804, 0x908a, 0x0002, 0x0218, 0x8001, 0xa806, 0x0020, - 0x080c, 0x108b, 0xb8a7, 0x0000, 0x009e, 0x012e, 0x0005, 0x0096, - 0x00c6, 0xb888, 0x9005, 0x1904, 0x693f, 0xb8d0, 0x904d, 0x0904, - 0x693f, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, 0x0001, - 0x1904, 0x693d, 0x080c, 0xb143, 0x0904, 0x693d, 0x8210, 0xba3e, - 0xa800, 0xb8d2, 0x9005, 0x1108, 0xb8ce, 0x2b00, 0x6012, 0x2900, - 0x6016, 0x6023, 0x0003, 0x600b, 0xffff, 0x6007, 0x0040, 0xa878, - 0x605e, 0xa880, 0x9084, 0x00ff, 0x6066, 0xa883, 0x0000, 0xa87c, - 0xd0ac, 0x01c8, 0xc0dd, 0xa87e, 0xa888, 0x8001, 0x1558, 0xa816, - 0xa864, 0x9094, 0x00f7, 0x9296, 0x0011, 0x1520, 0x9084, 0x00ff, - 0xc0bd, 0x601e, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0x2001, 0x8004, - 0x6003, 0x0004, 0x0030, 0x080c, 0x1c9c, 0x2001, 0x8004, 0x6003, - 0x0002, 0x6046, 0x2001, 0x0010, 0x2c08, 0x080c, 0xaced, 0xb838, - 0xba3c, 0x9202, 0x0a04, 0x68e5, 0x0010, 0xb88b, 0x0001, 0x00ce, - 0x009e, 0x0005, 0x080c, 0x17ad, 0x601c, 0xc0bd, 0x601e, 0x08f0, - 0x00b6, 0x0096, 0x0016, 0x20a9, 0x0800, 0x900e, 0x0016, 0x080c, - 0x67b4, 0x1158, 0xb8d0, 0x904d, 0x0140, 0x3e00, 0x9086, 0x0002, - 0x1118, 0xb800, 0xd0bc, 0x1108, 0x0041, 0x001e, 0x8108, 0x1f04, - 0x694e, 0x001e, 0x00be, 0x009e, 0x0005, 0x0096, 0x0016, 0xb8d0, - 0x904d, 0x0188, 0xa800, 0xb8d2, 0x9005, 0x1108, 0xb8ce, 0x9006, - 0xa802, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xd220, - 0x080c, 0x7012, 0x0c60, 0x001e, 0x009e, 0x0005, 0x0086, 0x9046, - 0xb8d0, 0x904d, 0x01b0, 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, - 0x0128, 0x2940, 0xa800, 0x904d, 0x0160, 0x0ca8, 0xa800, 0x88ff, - 0x1128, 0xb8d2, 0x9005, 0x1118, 0xb8ce, 0x0008, 0xa002, 0xa803, - 0x0000, 0x008e, 0x0005, 0x901e, 0x0010, 0x2019, 0x0001, 0x0126, - 0x2091, 0x8000, 0x00e6, 0x0096, 0x00c6, 0x0086, 0x0026, 0x2071, - 0x19e8, 0x9046, 0x7028, 0x9065, 0x01e8, 0x6014, 0x2068, 0x83ff, - 0x0120, 0x605c, 0x9606, 0x0158, 0x0030, 0xa86c, 0x9406, 0x1118, - 0xa870, 0x9506, 0x0120, 0x2c40, 0x600c, 0x2060, 0x0c60, 0x600c, - 0x0006, 0x0066, 0x2830, 0x080c, 0xa420, 0x006e, 0x000e, 0x83ff, - 0x0508, 0x0c08, 0x9046, 0xb8d0, 0x904d, 0x01e0, 0x83ff, 0x0120, - 0xa878, 0x9606, 0x0158, 0x0030, 0xa86c, 0x9406, 0x1118, 0xa870, - 0x9506, 0x0120, 0x2940, 0xa800, 0x2048, 0x0c70, 0xb8d0, 0xaa00, - 0x0026, 0x9906, 0x1110, 0xbad2, 0x0008, 0xa202, 0x000e, 0x83ff, - 0x0108, 0x0c10, 0x002e, 0x008e, 0x00ce, 0x009e, 0x00ee, 0x012e, - 0x0005, 0x9016, 0x0489, 0x1110, 0x2011, 0x0001, 0x0005, 0x080c, - 0x6aae, 0x0128, 0x080c, 0xcfdc, 0x0010, 0x9085, 0x0001, 0x0005, - 0x080c, 0x6aae, 0x0128, 0x080c, 0xcf7d, 0x0010, 0x9085, 0x0001, - 0x0005, 0x080c, 0x6aae, 0x0128, 0x080c, 0xcfd9, 0x0010, 0x9085, - 0x0001, 0x0005, 0x080c, 0x6aae, 0x0128, 0x080c, 0xcf9c, 0x0010, - 0x9085, 0x0001, 0x0005, 0x080c, 0x6aae, 0x0128, 0x080c, 0xd01f, - 0x0010, 0x9085, 0x0001, 0x0005, 0xb8a4, 0x900d, 0x1118, 0x9085, - 0x0001, 0x0005, 0x0136, 0x01c6, 0xa800, 0x9005, 0x11b8, 0x890e, - 0x810e, 0x810f, 0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, - 0x0004, 0x2098, 0x20a9, 0x0001, 0x2009, 0x0010, 0x4002, 0x9606, - 0x0128, 0x8109, 0x1dd8, 0x9085, 0x0001, 0x0008, 0x9006, 0x01ce, - 0x013e, 0x0005, 0x0146, 0x01d6, 0xa860, 0x20e8, 0xa85c, 0x9080, - 0x0004, 0x20a0, 0x20a9, 0x0010, 0x2009, 0xffff, 0x4104, 0x01de, - 0x014e, 0x0136, 0x01c6, 0xa800, 0x9005, 0x11b8, 0x890e, 0x810e, - 0x810f, 0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0004, - 0x2098, 0x20a9, 0x0001, 0x2009, 0x0010, 0x4002, 0x9606, 0x0128, - 0x8109, 0x1dd8, 0x9085, 0x0001, 0x0068, 0x0146, 0x01d6, 0x3300, - 0x8001, 0x20a0, 0x3c00, 0x20e8, 0x2001, 0xffff, 0x4004, 0x01de, - 0x014e, 0x9006, 0x01ce, 0x013e, 0x0005, 0x0096, 0x0126, 0x2091, - 0x8000, 0xb8a4, 0x904d, 0x1128, 0x080c, 0x1059, 0x0168, 0x2900, - 0xb8a6, 0x080c, 0x6a4a, 0xa803, 0x0001, 0xa807, 0x0000, 0x9085, - 0x0001, 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x0126, - 0x2091, 0x8000, 0xb8a4, 0x904d, 0x0130, 0xb8a7, 0x0000, 0x080c, - 0x108b, 0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0xb89c, 0xd0a4, - 0x0005, 0x00b6, 0x00f6, 0x080c, 0x779e, 0x01b0, 0x71c4, 0x81ff, - 0x1198, 0x71dc, 0xd19c, 0x0180, 0x2001, 0x007e, 0x9080, 0x1000, - 0x2004, 0x905d, 0x0148, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, - 0x1118, 0xb800, 0xc0ed, 0xb802, 0x2079, 0x1847, 0x7804, 0xd0a4, - 0x01d0, 0x0156, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x67b4, - 0x1168, 0xb804, 0x9084, 0xff00, 0x8007, 0x9096, 0x0004, 0x0118, - 0x9086, 0x0006, 0x1118, 0xb800, 0xc0ed, 0xb802, 0x001e, 0x8108, - 0x1f04, 0x6ad5, 0x015e, 0x080c, 0x6bcf, 0x0120, 0x2001, 0x1985, - 0x200c, 0x0098, 0x2079, 0x1847, 0x7804, 0xd0a4, 0x0190, 0x2009, - 0x07d0, 0x2001, 0x182c, 0x2004, 0x9005, 0x0138, 0x2001, 0x1867, - 0x2004, 0xd0e4, 0x0110, 0x2009, 0x5dc0, 0x2011, 0x6b0c, 0x080c, - 0x8a5d, 0x00fe, 0x00be, 0x0005, 0x00b6, 0x2011, 0x6b0c, 0x080c, - 0x8993, 0x080c, 0x6bcf, 0x01d8, 0x2001, 0x107e, 0x2004, 0x2058, - 0xb900, 0xc1ec, 0xb902, 0x080c, 0x6c0d, 0x0130, 0x2009, 0x07d0, - 0x2011, 0x6b0c, 0x080c, 0x8a5d, 0x00e6, 0x2071, 0x1800, 0x9006, - 0x707e, 0x7060, 0x7082, 0x080c, 0x30bf, 0x00ee, 0x04d0, 0x0156, - 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x67b4, 0x1558, - 0xb800, 0xd0ec, 0x0540, 0x0046, 0xbaa0, 0x2220, 0x9006, 0x2009, - 0x0029, 0x080c, 0xea8d, 0xb800, 0xc0e5, 0xc0ec, 0xb802, 0x080c, - 0x6c09, 0x2001, 0x0707, 0x1128, 0xb804, 0x9084, 0x00ff, 0x9085, - 0x0700, 0xb806, 0x080c, 0xacfc, 0x2019, 0x0029, 0x080c, 0x97b0, - 0x0076, 0x903e, 0x080c, 0x966d, 0x900e, 0x080c, 0xe75d, 0x007e, - 0x004e, 0x080c, 0xad18, 0x001e, 0x8108, 0x1f04, 0x6b34, 0x00ce, - 0x015e, 0x00be, 0x0005, 0x00b6, 0x6010, 0x2058, 0xb800, 0xc0ec, - 0xb802, 0x00be, 0x0005, 0x00b6, 0x00c6, 0x0096, 0x080c, 0x1072, - 0x090c, 0x0d85, 0x2958, 0x009e, 0x2001, 0x196b, 0x2b02, 0x8b07, - 0x8006, 0x8006, 0x908c, 0x003f, 0xb9c6, 0x908c, 0xffc0, 0xb9ca, - 0xb8af, 0x0000, 0x2009, 0x00ff, 0x080c, 0x61b7, 0xb807, 0x0006, - 0xb813, 0x00ff, 0xb817, 0xffff, 0xb86f, 0x0200, 0xb86c, 0xb893, - 0x0002, 0xb8bb, 0x0520, 0xb8a3, 0x00ff, 0xb8af, 0x0000, 0x00ce, - 0x00be, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0ac, - 0x0005, 0x6010, 0x00b6, 0x905d, 0x0108, 0xb800, 0x00be, 0xd0bc, - 0x0005, 0x0006, 0x0016, 0x0026, 0xb804, 0x908c, 0x00ff, 0x9196, - 0x0006, 0x0188, 0x9196, 0x0004, 0x0170, 0x9196, 0x0005, 0x0158, - 0x908c, 0xff00, 0x810f, 0x9196, 0x0006, 0x0128, 0x9196, 0x0004, - 0x0110, 0x9196, 0x0005, 0x002e, 0x001e, 0x000e, 0x0005, 0x00b6, - 0x00f6, 0x2001, 0x107e, 0x2004, 0x905d, 0x0110, 0xb800, 0xd0ec, - 0x00fe, 0x00be, 0x0005, 0x0126, 0x0026, 0x2091, 0x8000, 0x0006, - 0xbaa0, 0x9290, 0x1000, 0x2204, 0x9b06, 0x190c, 0x0d85, 0x000e, - 0xba00, 0x9005, 0x0110, 0xc2fd, 0x0008, 0xc2fc, 0xba02, 0x002e, - 0x012e, 0x0005, 0x2011, 0x1837, 0x2204, 0xd0cc, 0x0138, 0x2001, - 0x1983, 0x200c, 0x2011, 0x6bff, 0x080c, 0x8a5d, 0x0005, 0x2011, - 0x6bff, 0x080c, 0x8993, 0x2011, 0x1837, 0x2204, 0xc0cc, 0x2012, - 0x0005, 0x080c, 0x5840, 0xd0ac, 0x0005, 0x080c, 0x5840, 0xd0a4, - 0x0005, 0x0016, 0xb904, 0x9184, 0x00ff, 0x908e, 0x0006, 0x001e, - 0x0005, 0x0016, 0xb904, 0x9184, 0xff00, 0x8007, 0x908e, 0x0006, - 0x001e, 0x0005, 0x00b6, 0x00f6, 0x080c, 0xd645, 0x0158, 0x70dc, - 0x9084, 0x0028, 0x0138, 0x2001, 0x107f, 0x2004, 0x905d, 0x0110, - 0xb8d4, 0xd094, 0x00fe, 0x00be, 0x0005, 0x0006, 0x0016, 0x0036, - 0x0046, 0x0076, 0x00b6, 0x2001, 0x1818, 0x203c, 0x9780, 0x348e, - 0x203d, 0x97bc, 0xff00, 0x873f, 0x9006, 0x2018, 0x2008, 0x9284, - 0x8000, 0x0110, 0x2019, 0x0001, 0x9294, 0x7fff, 0x2100, 0x9706, - 0x0190, 0x91a0, 0x1000, 0x2404, 0x905d, 0x0168, 0xb804, 0x9084, - 0x00ff, 0x9086, 0x0006, 0x1138, 0x83ff, 0x0118, 0xb89c, 0xd0a4, - 0x0110, 0x8211, 0x0158, 0x8108, 0x83ff, 0x0120, 0x9182, 0x0800, - 0x0e28, 0x0068, 0x9182, 0x007e, 0x0e08, 0x0048, 0x00be, 0x007e, - 0x004e, 0x003e, 0x001e, 0x9085, 0x0001, 0x000e, 0x0005, 0x00be, - 0x007e, 0x004e, 0x003e, 0x001e, 0x9006, 0x000e, 0x0005, 0x0046, - 0x0056, 0x0076, 0x00b6, 0x2100, 0x9084, 0x7fff, 0x9080, 0x1000, - 0x2004, 0x905d, 0x0130, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, - 0x0550, 0x9184, 0x8000, 0x0580, 0x2001, 0x1818, 0x203c, 0x9780, - 0x348e, 0x203d, 0x97bc, 0xff00, 0x873f, 0x9006, 0x2020, 0x2400, - 0x9706, 0x01a0, 0x94a8, 0x1000, 0x2504, 0x905d, 0x0178, 0xb804, - 0x9084, 0x00ff, 0x9086, 0x0006, 0x1148, 0xb89c, 0xd0a4, 0x0130, - 0xb814, 0x9206, 0x1118, 0xb810, 0x9306, 0x0128, 0x8420, 0x9482, - 0x0800, 0x0e28, 0x0048, 0x918c, 0x7fff, 0x00be, 0x007e, 0x005e, - 0x004e, 0x9085, 0x0001, 0x0005, 0x918c, 0x7fff, 0x00be, 0x007e, - 0x005e, 0x004e, 0x9006, 0x0005, 0x0006, 0x2001, 0x00a0, 0x8001, - 0xa001, 0xa001, 0xa001, 0x1dd8, 0x000e, 0x0005, 0x0006, 0x2001, - 0x00f8, 0x8001, 0xa001, 0xa001, 0xa001, 0x1dd8, 0x000e, 0x0005, - 0x0006, 0x2001, 0x00e8, 0x8001, 0xa001, 0xa001, 0xa001, 0x1dd8, - 0x000e, 0x0005, 0x2071, 0x1910, 0x7003, 0x0001, 0x7007, 0x0000, - 0x9006, 0x7012, 0x7016, 0x701a, 0x701e, 0x700a, 0x7046, 0x2001, - 0x1922, 0x2003, 0x0000, 0x0005, 0x0016, 0x00e6, 0x2071, 0x1948, - 0x900e, 0x710a, 0x080c, 0x5840, 0xd0fc, 0x1140, 0x080c, 0x5840, - 0x900e, 0xd09c, 0x0108, 0x8108, 0x7102, 0x0470, 0x2001, 0x1867, - 0x200c, 0x9184, 0x0007, 0x0006, 0x2001, 0x180d, 0x2004, 0xd08c, - 0x000e, 0x0108, 0x9006, 0x0002, 0x6d06, 0x6d06, 0x6d06, 0x6d06, - 0x6d06, 0x6d24, 0x6d39, 0x6d47, 0x7003, 0x0003, 0x2009, 0x1868, - 0x210c, 0x9184, 0xff00, 0x908e, 0xff00, 0x0140, 0x8007, 0x9005, - 0x1110, 0x2001, 0x0002, 0x8003, 0x7006, 0x0030, 0x7007, 0x0001, - 0x0018, 0x7003, 0x0005, 0x0c50, 0x2071, 0x1910, 0x704f, 0x0000, - 0x2071, 0x1800, 0x70f7, 0x0001, 0x00ee, 0x001e, 0x0005, 0x7003, - 0x0000, 0x2071, 0x1910, 0x2009, 0x1868, 0x210c, 0x9184, 0x7f00, - 0x8007, 0x908c, 0x000f, 0x0160, 0x714e, 0x8004, 0x8004, 0x8004, - 0x8004, 0x2071, 0x1800, 0x908c, 0x0007, 0x0128, 0x70f6, 0x0c20, - 0x704f, 0x000f, 0x0c90, 0x70f7, 0x0005, 0x08f0, 0x00e6, 0x2071, - 0x0050, 0x684c, 0x9005, 0x1150, 0x00e6, 0x2071, 0x1910, 0x7028, - 0xc085, 0x702a, 0x00ee, 0x9085, 0x0001, 0x0488, 0x6844, 0x9005, - 0x0158, 0x080c, 0x7b28, 0x6a60, 0x9200, 0x7002, 0x6864, 0x9101, - 0x7006, 0x9006, 0x7012, 0x7016, 0x6860, 0x7002, 0x6864, 0x7006, - 0x6868, 0x700a, 0x686c, 0x700e, 0x6844, 0x9005, 0x1110, 0x7012, - 0x7016, 0x684c, 0x701a, 0x701c, 0x9085, 0x0040, 0x701e, 0x7037, - 0x0019, 0x702b, 0x0001, 0x00e6, 0x2071, 0x1910, 0x7028, 0xc084, - 0x702a, 0x7007, 0x0001, 0x700b, 0x0000, 0x00ee, 0x9006, 0x00ee, - 0x0005, 0x00e6, 0x0026, 0x2071, 0x1948, 0x7000, 0x9015, 0x0904, - 0x7017, 0x9286, 0x0003, 0x0904, 0x6eac, 0x9286, 0x0005, 0x0904, - 0x6eac, 0x2071, 0x1877, 0xa87c, 0x9005, 0x0904, 0x6e07, 0x7140, - 0xa868, 0x9102, 0x0a04, 0x7017, 0xa878, 0xd084, 0x15d8, 0xa853, - 0x0019, 0x2001, 0x8023, 0xa84e, 0x2071, 0x1910, 0x701c, 0x9005, - 0x1904, 0x71c6, 0x0e04, 0x7234, 0x2071, 0x0000, 0xa850, 0x7032, - 0xa84c, 0x7082, 0xa870, 0x7086, 0xa86c, 0x708a, 0xa880, 0x708e, - 0x7036, 0x0146, 0x01d6, 0x0136, 0x01c6, 0x0156, 0x20e9, 0x0000, - 0x20a1, 0x002a, 0xa868, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, - 0x0021, 0x2098, 0x4003, 0x015e, 0x01ce, 0x013e, 0x01de, 0x014e, - 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1200, - 0x0804, 0x6e8f, 0xa853, 0x001b, 0x2001, 0x8027, 0x0820, 0x7004, - 0xd08c, 0x1904, 0x7017, 0xa853, 0x001a, 0x2001, 0x8024, 0x0804, - 0x6dcb, 0x00e6, 0x0026, 0x2071, 0x1948, 0x7000, 0x9015, 0x0904, - 0x7017, 0x9286, 0x0003, 0x0904, 0x6eac, 0x9286, 0x0005, 0x0904, - 0x6eac, 0xa84f, 0x8022, 0xa853, 0x0018, 0x0804, 0x6e74, 0xa868, - 0xd0fc, 0x1508, 0x00e6, 0x0026, 0x2001, 0x1948, 0x2004, 0x9015, - 0x0904, 0x7017, 0xa978, 0xa874, 0x9105, 0x1904, 0x7017, 0x9286, - 0x0003, 0x0904, 0x6eac, 0x9286, 0x0005, 0x0904, 0x6eac, 0xa87c, - 0xd0bc, 0x1904, 0x7017, 0x2200, 0x0002, 0x7017, 0x6e70, 0x6eac, - 0x6eac, 0x7017, 0x6eac, 0x0005, 0xa868, 0xd0fc, 0x1500, 0x00e6, - 0x0026, 0x2009, 0x1948, 0x210c, 0x81ff, 0x0904, 0x7017, 0xa880, - 0x9084, 0x00ff, 0x9086, 0x0001, 0x1904, 0x7017, 0x9186, 0x0003, - 0x0904, 0x6eac, 0x9186, 0x0005, 0x0904, 0x6eac, 0xa87c, 0xd0cc, - 0x0904, 0x7017, 0xa84f, 0x8021, 0xa853, 0x0017, 0x0028, 0x0005, - 0xa84f, 0x8020, 0xa853, 0x0016, 0x2071, 0x1910, 0x701c, 0x9005, - 0x1904, 0x71c6, 0x0e04, 0x7234, 0x2071, 0x0000, 0xa84c, 0x7082, - 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0x2091, - 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1200, 0x2071, - 0x1800, 0x2011, 0x0001, 0xa804, 0x900d, 0x702c, 0x1158, 0xa802, - 0x2900, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8899, 0x002e, - 0x00ee, 0x0005, 0x0096, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, - 0x81ff, 0x1dc8, 0x009e, 0x0c58, 0xa84f, 0x0000, 0x00f6, 0x2079, - 0x0050, 0x2071, 0x1910, 0xa803, 0x0000, 0x7010, 0x9005, 0x1904, - 0x6f9d, 0x782c, 0x908c, 0x0780, 0x190c, 0x7382, 0x8004, 0x8004, - 0x8004, 0x9084, 0x0003, 0x0002, 0x6eca, 0x6f9d, 0x6eee, 0x6f3a, - 0x080c, 0x0d85, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, - 0x1168, 0x2071, 0x1a04, 0x7044, 0x9005, 0x1320, 0x2001, 0x1949, - 0x2004, 0x7046, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, - 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, - 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8899, 0x0c18, 0x2071, 0x1800, - 0x2900, 0x7822, 0xa804, 0x900d, 0x15a0, 0x7824, 0x00e6, 0x2071, - 0x0040, 0x712c, 0xd19c, 0x1170, 0x2009, 0x1830, 0x210c, 0x918a, - 0x0020, 0x0240, 0x7022, 0x2001, 0x1dc0, 0x200c, 0x8108, 0x2102, - 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, - 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8899, 0x782c, 0x9094, 0x0780, - 0x190c, 0x7382, 0xd0a4, 0x19c8, 0x2071, 0x1a04, 0x7044, 0x9005, - 0x1320, 0x2001, 0x1949, 0x2004, 0x7046, 0x00fe, 0x002e, 0x00ee, - 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, - 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8899, - 0x0804, 0x6ef5, 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, - 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, - 0x8899, 0x782c, 0x9094, 0x0780, 0x190c, 0x7382, 0xd0a4, 0x1d60, - 0x00ee, 0x782c, 0x9094, 0x0780, 0x190c, 0x7382, 0xd09c, 0x1198, - 0x009e, 0x2900, 0x7822, 0xa804, 0x900d, 0x1550, 0x2071, 0x1a04, - 0x7044, 0x9005, 0x1320, 0x2001, 0x1949, 0x2004, 0x7046, 0x00fe, - 0x002e, 0x00ee, 0x0005, 0x009e, 0x2908, 0x7010, 0x8000, 0x7012, - 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, - 0xa804, 0x900d, 0x1168, 0x2071, 0x1a04, 0x7044, 0x9005, 0x1320, - 0x2001, 0x1949, 0x2004, 0x7046, 0x00fe, 0x002e, 0x00ee, 0x0005, - 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, - 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, - 0x8899, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2908, 0x7010, 0x8000, - 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, - 0x2148, 0xa804, 0x900d, 0x1904, 0x6ff1, 0x782c, 0x9094, 0x0780, - 0x190c, 0x7382, 0xd09c, 0x1198, 0x701c, 0x904d, 0x0180, 0x7010, - 0x8001, 0x7012, 0x1108, 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, - 0x782c, 0x9094, 0x0780, 0x190c, 0x7382, 0xd09c, 0x0d68, 0x782c, - 0x9094, 0x0780, 0x190c, 0x7382, 0xd0a4, 0x01b0, 0x00e6, 0x7824, - 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, - 0x8000, 0x70c2, 0x080c, 0x8899, 0x782c, 0x9094, 0x0780, 0x190c, - 0x7382, 0xd0a4, 0x1d60, 0x00ee, 0x2071, 0x1a04, 0x7044, 0x9005, - 0x1320, 0x2001, 0x1949, 0x2004, 0x7046, 0x00fe, 0x002e, 0x00ee, - 0x0005, 0x00e6, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, - 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, - 0x70c2, 0x080c, 0x8899, 0x00ee, 0x0804, 0x6fad, 0xa868, 0xd0fc, - 0x15e0, 0x0096, 0xa804, 0xa807, 0x0000, 0x904d, 0x190c, 0x100b, - 0x009e, 0x0018, 0xa868, 0xd0fc, 0x1580, 0x00e6, 0x0026, 0xa84f, - 0x0000, 0x00f6, 0x2079, 0x0050, 0x2071, 0x1910, 0xa803, 0x0000, - 0xa864, 0x9084, 0x00ff, 0x908e, 0x0016, 0x01a8, 0x7010, 0x9005, - 0x1904, 0x7142, 0x782c, 0x908c, 0x0780, 0x190c, 0x7382, 0x8004, - 0x8004, 0x8004, 0x9084, 0x0003, 0x0002, 0x7046, 0x7142, 0x7061, - 0x70d3, 0x080c, 0x0d85, 0x2009, 0x1948, 0x2104, 0x0002, 0x7026, - 0x7026, 0x7026, 0x6eb5, 0x7026, 0x6eb5, 0x0005, 0x2071, 0x1800, - 0x2900, 0x7822, 0xa804, 0x900d, 0x1120, 0x00fe, 0x002e, 0x00ee, - 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, - 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8899, - 0x0c60, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1904, - 0x70c2, 0x7830, 0xd0dc, 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, - 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1170, 0x2009, - 0x1830, 0x210c, 0x918a, 0x0020, 0x0240, 0x7022, 0x2001, 0x1dc0, - 0x200c, 0x8108, 0x2102, 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, - 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8899, - 0x782c, 0x9094, 0x0780, 0x190c, 0x7382, 0xd0a4, 0x19c8, 0x0e04, - 0x70b9, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, - 0x6836, 0x6833, 0x0013, 0x00de, 0x2001, 0x1921, 0x200c, 0xc184, - 0x2102, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, - 0x1200, 0x2001, 0x1922, 0x2003, 0x0000, 0x00fe, 0x002e, 0x00ee, - 0x0005, 0x2001, 0x1921, 0x200c, 0xc185, 0x2102, 0x00fe, 0x002e, - 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, - 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, - 0x8899, 0x0804, 0x7070, 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, - 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, - 0x080c, 0x8899, 0x782c, 0x9094, 0x0780, 0x190c, 0x7382, 0xd0a4, - 0x1d60, 0x00ee, 0x0e04, 0x7115, 0x7838, 0x7938, 0x910e, 0x1de0, - 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x7044, - 0xc084, 0x7046, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, - 0x190c, 0x1200, 0x704b, 0x0000, 0x782c, 0x9094, 0x0780, 0x190c, - 0x7382, 0xd09c, 0x1170, 0x009e, 0x2900, 0x7822, 0xa804, 0x900d, - 0x11e0, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7044, 0xc085, 0x7046, - 0x0c58, 0x009e, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, - 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, - 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, - 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, - 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8899, 0x00fe, 0x002e, - 0x00ee, 0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, - 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, - 0x1904, 0x71b1, 0x782c, 0x9094, 0x0780, 0x190c, 0x7382, 0xd09c, - 0x11b0, 0x701c, 0x904d, 0x0198, 0xa84c, 0x9005, 0x1180, 0x7010, - 0x8001, 0x7012, 0x1108, 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, - 0x782c, 0x9094, 0x0780, 0x190c, 0x7382, 0xd09c, 0x0d50, 0x782c, - 0x9094, 0x0780, 0x190c, 0x7382, 0xd0a4, 0x05b8, 0x00e6, 0x7824, - 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, - 0x8000, 0x70c2, 0x080c, 0x8899, 0x782c, 0x9094, 0x0780, 0x190c, - 0x7382, 0xd0a4, 0x1d60, 0x00ee, 0x0e04, 0x71aa, 0x7838, 0x7938, - 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, - 0x00de, 0x7044, 0xc084, 0x7046, 0x2091, 0x4080, 0x2001, 0x0089, - 0x2004, 0xd084, 0x190c, 0x1200, 0x704b, 0x0000, 0x00fe, 0x002e, - 0x00ee, 0x0005, 0x7044, 0xc085, 0x7046, 0x00fe, 0x002e, 0x00ee, - 0x0005, 0x00e6, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, - 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, - 0x70c2, 0x080c, 0x8899, 0x00ee, 0x0804, 0x7152, 0x2071, 0x1910, - 0xa803, 0x0000, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, - 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, - 0x1128, 0x1e04, 0x71f1, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, - 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, - 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8899, 0x0e04, - 0x71db, 0x2071, 0x1910, 0x701c, 0x2048, 0xa84c, 0x900d, 0x0d18, - 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, - 0xa870, 0x708a, 0xa850, 0x9082, 0x0019, 0x1278, 0x2091, 0x4080, - 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1200, 0x2071, 0x1910, - 0x080c, 0x736e, 0x002e, 0x00ee, 0x0005, 0xa850, 0x9082, 0x001c, - 0x1e68, 0xa880, 0x708e, 0x7036, 0x0146, 0x01d6, 0x0136, 0x01c6, - 0x0156, 0x20e9, 0x0000, 0x20a1, 0x002a, 0xa868, 0x20a8, 0xa860, - 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098, 0x4003, 0x015e, 0x01ce, - 0x013e, 0x01de, 0x014e, 0x0890, 0x2071, 0x1910, 0xa803, 0x0000, - 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, - 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1118, 0x002e, - 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, - 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, - 0x70c2, 0x080c, 0x8899, 0x002e, 0x00ee, 0x0005, 0x0006, 0xa87c, - 0x0006, 0xa867, 0x0103, 0x20a9, 0x001c, 0xa860, 0x20e8, 0xa85c, - 0x9080, 0x001d, 0x20a0, 0x9006, 0x4004, 0x000e, 0x9084, 0x00ff, - 0xa87e, 0x000e, 0xa87a, 0xa982, 0x0005, 0x2071, 0x1910, 0x7004, - 0x0002, 0x7281, 0x7282, 0x736d, 0x7282, 0x727f, 0x736d, 0x080c, - 0x0d85, 0x0005, 0x2001, 0x1948, 0x2004, 0x0002, 0x728c, 0x728c, - 0x7306, 0x7307, 0x728c, 0x7307, 0x0126, 0x2091, 0x8000, 0x1e0c, - 0x738d, 0x701c, 0x904d, 0x0508, 0xa84c, 0x9005, 0x0904, 0x72d7, - 0x0e04, 0x72b5, 0xa94c, 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, - 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0xa850, 0x9082, 0x0019, - 0x1278, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, - 0x1200, 0x2071, 0x1910, 0x080c, 0x736e, 0x012e, 0x0804, 0x7305, - 0xa850, 0x9082, 0x001c, 0x1e68, 0xa880, 0x708e, 0x7036, 0x0146, - 0x01d6, 0x0136, 0x01c6, 0x0156, 0x20e9, 0x0000, 0x20a1, 0x002a, - 0xa868, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098, - 0x4003, 0x015e, 0x01ce, 0x013e, 0x01de, 0x014e, 0x0890, 0x2001, - 0x005b, 0x2004, 0x9094, 0x0780, 0x190c, 0x7382, 0xd09c, 0x2071, - 0x1910, 0x1510, 0x2071, 0x1910, 0x700f, 0x0001, 0xa964, 0x9184, - 0x00ff, 0x9086, 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101, - 0x0108, 0x710e, 0x2900, 0x00d6, 0x2069, 0x0050, 0x6822, 0x00de, - 0x2071, 0x1910, 0x701c, 0x2048, 0x7010, 0x8001, 0x7012, 0xa800, - 0x701e, 0x9005, 0x1108, 0x701a, 0x012e, 0x0005, 0x0005, 0x00d6, - 0x2008, 0x2069, 0x1a04, 0x6844, 0x9005, 0x0760, 0x0158, 0x9186, - 0x0003, 0x0540, 0x2001, 0x1815, 0x2004, 0x2009, 0x1b73, 0x210c, - 0x9102, 0x1500, 0x0126, 0x2091, 0x8000, 0x2069, 0x0050, 0x693c, - 0x6838, 0x9106, 0x0190, 0x0e04, 0x7339, 0x2069, 0x0000, 0x6837, - 0x8040, 0x6833, 0x0012, 0x6883, 0x8040, 0x2091, 0x4080, 0x2001, - 0x0089, 0x2004, 0xd084, 0x190c, 0x1200, 0x2069, 0x1a04, 0x6847, - 0xffff, 0x012e, 0x00de, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x73fd, - 0x701c, 0x904d, 0x0540, 0x2001, 0x005b, 0x2004, 0x9094, 0x0780, - 0x15c9, 0xd09c, 0x1500, 0x2071, 0x1910, 0x700f, 0x0001, 0xa964, - 0x9184, 0x00ff, 0x9086, 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff, - 0x8101, 0x0108, 0x710e, 0x2900, 0x00d6, 0x2069, 0x0050, 0x6822, - 0x00de, 0x701c, 0x2048, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, - 0x9005, 0x1108, 0x701a, 0x012e, 0x0005, 0x0005, 0x0126, 0x2091, - 0x8000, 0x701c, 0x904d, 0x0160, 0x7010, 0x8001, 0x7012, 0xa800, - 0x701e, 0x9005, 0x1108, 0x701a, 0x012e, 0x080c, 0x108b, 0x0005, - 0x012e, 0x0005, 0x2091, 0x8000, 0x0e04, 0x7384, 0x0006, 0x0016, - 0x2001, 0x8004, 0x0006, 0x0804, 0x0d8e, 0x0096, 0x00f6, 0x2079, - 0x0050, 0x7044, 0xd084, 0x01d0, 0xc084, 0x7046, 0x7838, 0x7938, - 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, - 0x00de, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, - 0x1200, 0x704b, 0x0000, 0x00fe, 0x009e, 0x0005, 0x782c, 0x9094, - 0x0780, 0x1981, 0xd0a4, 0x0db8, 0x7148, 0x704c, 0x8108, 0x714a, - 0x9102, 0x0e88, 0x00e6, 0x2071, 0x1800, 0x7824, 0x00e6, 0x2071, - 0x0040, 0x712c, 0xd19c, 0x1170, 0x2009, 0x1830, 0x210c, 0x918a, - 0x0020, 0x0240, 0x7022, 0x2001, 0x1dc0, 0x200c, 0x8108, 0x2102, - 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, - 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8899, 0x782c, 0x9094, 0x0780, - 0x190c, 0x7382, 0xd0a4, 0x19c8, 0x7838, 0x7938, 0x910e, 0x1de0, - 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, - 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1200, 0x00ee, - 0x704b, 0x0000, 0x00fe, 0x009e, 0x0005, 0x00f6, 0x2079, 0x0050, - 0x7044, 0xd084, 0x01b8, 0xc084, 0x7046, 0x7838, 0x7938, 0x910e, - 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, - 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1200, - 0x00fe, 0x0005, 0x782c, 0x9094, 0x0780, 0x190c, 0x7382, 0xd0a4, - 0x0db8, 0x00e6, 0x2071, 0x1800, 0x7824, 0x2048, 0x702c, 0xa802, - 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8899, 0x782c, - 0x9094, 0x0780, 0x190c, 0x7382, 0xd0a4, 0x1d70, 0x00d6, 0x2069, - 0x0050, 0x693c, 0x2069, 0x1948, 0x6808, 0x690a, 0x2069, 0x1a04, - 0x9102, 0x1118, 0x6844, 0x9005, 0x1320, 0x2001, 0x1949, 0x200c, - 0x6946, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x7098, 0x908a, 0x002a, - 0x1a0c, 0x0d85, 0x9082, 0x001d, 0x003b, 0x0026, 0x2011, 0x1e00, - 0x080c, 0x2ad3, 0x002e, 0x0005, 0x7542, 0x74af, 0x74cb, 0x74f5, - 0x7531, 0x7571, 0x7583, 0x74cb, 0x7559, 0x746a, 0x7498, 0x751b, - 0x7469, 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804, 0x9005, 0x1180, - 0x6808, 0x9005, 0x1518, 0x709b, 0x0029, 0x2069, 0x198f, 0x2d04, - 0x7002, 0x080c, 0x78e4, 0x6028, 0x9085, 0x0600, 0x602a, 0x00b0, - 0x709b, 0x0029, 0x2069, 0x198f, 0x2d04, 0x7002, 0x6028, 0x9085, - 0x0600, 0x602a, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0x1a6e, - 0x080c, 0x1b1e, 0x005e, 0x004e, 0x003e, 0x00ee, 0x00de, 0x0005, - 0x00d6, 0x2069, 0x0200, 0x6804, 0x9005, 0x1178, 0x6808, 0x9005, - 0x1160, 0x709b, 0x0029, 0x2069, 0x198f, 0x2d04, 0x7002, 0x080c, - 0x7990, 0x6028, 0x9085, 0x0600, 0x602a, 0x00de, 0x0005, 0x0006, - 0x2001, 0x0090, 0x080c, 0x2a99, 0x000e, 0x6124, 0xd1e4, 0x1190, - 0x080c, 0x75f4, 0xd1d4, 0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, - 0x709b, 0x0020, 0x080c, 0x75f4, 0x0028, 0x709b, 0x001d, 0x0010, - 0x709b, 0x001f, 0x0005, 0x2001, 0x0088, 0x080c, 0x2a99, 0x6124, - 0xd1cc, 0x11e8, 0xd1dc, 0x11c0, 0xd1e4, 0x1198, 0x9184, 0x1e00, - 0x11d8, 0x080c, 0x1b4b, 0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, - 0x080c, 0x77ca, 0x2001, 0x0080, 0x080c, 0x2a99, 0x709b, 0x0029, - 0x0058, 0x709b, 0x001e, 0x0040, 0x709b, 0x001d, 0x0028, 0x709b, - 0x0020, 0x0010, 0x709b, 0x001f, 0x0005, 0x080c, 0x1b4b, 0x60e3, - 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x77ca, 0x2001, 0x0080, - 0x080c, 0x2a99, 0x6124, 0xd1d4, 0x1198, 0xd1dc, 0x1170, 0xd1e4, - 0x1148, 0x9184, 0x1e00, 0x1118, 0x709b, 0x0029, 0x0058, 0x709b, - 0x0028, 0x0040, 0x709b, 0x001e, 0x0028, 0x709b, 0x001d, 0x0010, - 0x709b, 0x001f, 0x0005, 0x6124, 0xd1d4, 0x1180, 0xd1dc, 0x1158, - 0xd1e4, 0x1130, 0x9184, 0x1e00, 0x1158, 0x709b, 0x0029, 0x0040, - 0x709b, 0x001e, 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, 0x001f, - 0x0005, 0x2001, 0x00a0, 0x080c, 0x2a99, 0x6124, 0xd1dc, 0x1138, - 0xd1e4, 0x0138, 0x080c, 0x1b4b, 0x709b, 0x001e, 0x0010, 0x709b, - 0x001d, 0x0005, 0x080c, 0x767d, 0x6124, 0xd1dc, 0x1188, 0x080c, - 0x75f4, 0x0016, 0x080c, 0x1b4b, 0x001e, 0xd1d4, 0x1128, 0xd1e4, - 0x0138, 0x709b, 0x001e, 0x0020, 0x709b, 0x001f, 0x080c, 0x75f4, - 0x0005, 0x0006, 0x2001, 0x00a0, 0x080c, 0x2a99, 0x000e, 0x6124, - 0xd1d4, 0x1160, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, - 0x709b, 0x001e, 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, 0x0021, - 0x0005, 0x080c, 0x767d, 0x6124, 0xd1d4, 0x1150, 0xd1dc, 0x1128, - 0xd1e4, 0x0140, 0x709b, 0x001e, 0x0028, 0x709b, 0x001d, 0x0010, - 0x709b, 0x001f, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c, 0x2a99, - 0x000e, 0x6124, 0xd1d4, 0x1178, 0xd1cc, 0x1150, 0xd1dc, 0x1128, - 0xd1e4, 0x0158, 0x709b, 0x001e, 0x0040, 0x709b, 0x001d, 0x0028, - 0x709b, 0x0020, 0x0010, 0x709b, 0x001f, 0x0005, 0x0016, 0x00c6, - 0x00d6, 0x00e6, 0x0126, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, - 0x1800, 0x2091, 0x8000, 0x080c, 0x779e, 0x11f8, 0x2001, 0x180c, - 0x200c, 0xd1b4, 0x01d0, 0xc1b4, 0x2102, 0x0026, 0x2011, 0x0200, - 0x080c, 0x2ad3, 0x002e, 0x080c, 0x2a7f, 0x6024, 0xd0cc, 0x0148, - 0x2001, 0x00a0, 0x080c, 0x2a99, 0x080c, 0x7ab6, 0x080c, 0x619d, - 0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408, 0x080c, 0x77b8, 0x0150, - 0x080c, 0x77af, 0x1138, 0x2001, 0x0001, 0x080c, 0x2631, 0x080c, - 0x7772, 0x00a0, 0x080c, 0x767a, 0x0178, 0x2001, 0x0001, 0x080c, - 0x2631, 0x7098, 0x9086, 0x001e, 0x0120, 0x7098, 0x9086, 0x0022, - 0x1118, 0x709b, 0x0025, 0x0010, 0x709b, 0x0021, 0x012e, 0x00ee, - 0x00de, 0x00ce, 0x001e, 0x0005, 0x0026, 0x2011, 0x7605, 0x080c, - 0x8a9f, 0x002e, 0x0016, 0x0026, 0x2009, 0x0064, 0x2011, 0x7605, - 0x080c, 0x8a96, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00f6, 0x0016, - 0x080c, 0xa2a0, 0x2071, 0x1800, 0x080c, 0x759e, 0x001e, 0x00fe, - 0x00ee, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, - 0x00f6, 0x0126, 0x2071, 0x1800, 0x080c, 0xa2a0, 0x2061, 0x0100, - 0x2069, 0x0140, 0x2091, 0x8000, 0x6028, 0xc09c, 0x602a, 0x080c, - 0xacfc, 0x2011, 0x0003, 0x080c, 0xa62b, 0x2011, 0x0002, 0x080c, - 0xa635, 0x080c, 0xa516, 0x080c, 0x8a4b, 0x0036, 0x901e, 0x080c, - 0xa596, 0x003e, 0x080c, 0xad18, 0x60e3, 0x0000, 0x080c, 0xeed9, - 0x080c, 0xeef4, 0x2009, 0x0004, 0x080c, 0x2a85, 0x080c, 0x299b, - 0x2001, 0x1800, 0x2003, 0x0004, 0x2011, 0x0008, 0x080c, 0x2ad3, - 0x2011, 0x7605, 0x080c, 0x8a9f, 0x080c, 0x77b8, 0x0118, 0x9006, - 0x080c, 0x2a99, 0x080c, 0x0bcf, 0x2001, 0x0001, 0x080c, 0x2631, - 0x012e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, - 0x0005, 0x0026, 0x00e6, 0x2011, 0x7612, 0x2071, 0x1a04, 0x701c, - 0x9206, 0x1118, 0x7018, 0x9005, 0x0110, 0x9085, 0x0001, 0x00ee, - 0x002e, 0x0005, 0x6020, 0xd09c, 0x0005, 0x6800, 0x9084, 0xfffe, - 0x9086, 0x00c0, 0x01b8, 0x2001, 0x00c0, 0x080c, 0x2a99, 0x0156, - 0x20a9, 0x002d, 0x1d04, 0x768a, 0x2091, 0x6000, 0x1f04, 0x768a, - 0x015e, 0x00d6, 0x2069, 0x1800, 0x689c, 0x8001, 0x0220, 0x0118, - 0x689e, 0x00de, 0x0005, 0x689f, 0x0014, 0x68ec, 0xd0dc, 0x0dc8, - 0x6800, 0x9086, 0x0001, 0x1da8, 0x080c, 0x8aab, 0x0c90, 0x00c6, - 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, - 0x080c, 0x7ac5, 0x2001, 0x196d, 0x2003, 0x0000, 0x9006, 0x709a, - 0x60e2, 0x6886, 0x080c, 0x2700, 0x9006, 0x080c, 0x2a99, 0x080c, - 0x6058, 0x0026, 0x2011, 0xffff, 0x080c, 0x2ad3, 0x002e, 0x602b, - 0x182c, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6, - 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2001, 0x197d, - 0x200c, 0x9186, 0x0000, 0x0158, 0x9186, 0x0001, 0x0158, 0x9186, - 0x0002, 0x0158, 0x9186, 0x0003, 0x0158, 0x0804, 0x7762, 0x709b, - 0x0022, 0x0040, 0x709b, 0x0021, 0x0028, 0x709b, 0x0023, 0x0010, - 0x709b, 0x0024, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, - 0x080c, 0x2700, 0x080c, 0xacfc, 0x0026, 0x080c, 0xafd2, 0x080c, - 0xb09b, 0x002e, 0x080c, 0xad18, 0x7000, 0x908e, 0x0004, 0x0118, - 0x602b, 0x0028, 0x0010, 0x602b, 0x0020, 0x0156, 0x0126, 0x2091, - 0x8000, 0x20a9, 0x0005, 0x6024, 0xd0ac, 0x0150, 0x012e, 0x015e, - 0x080c, 0xd645, 0x0118, 0x9006, 0x080c, 0x2ac3, 0x0804, 0x776e, - 0x6800, 0x9084, 0x00a1, 0xc0bd, 0x6802, 0x080c, 0x2a7f, 0x6904, - 0xd1d4, 0x1140, 0x2001, 0x0100, 0x080c, 0x2a99, 0x1f04, 0x7713, - 0x080c, 0x77f2, 0x012e, 0x015e, 0x080c, 0x77af, 0x0170, 0x6044, - 0x9005, 0x0130, 0x080c, 0x77f2, 0x9006, 0x8001, 0x1df0, 0x0028, - 0x6804, 0xd0d4, 0x1110, 0x080c, 0x77f2, 0x080c, 0xd645, 0x0118, - 0x9006, 0x080c, 0x2ac3, 0x0016, 0x0026, 0x7000, 0x908e, 0x0004, - 0x0130, 0x2009, 0x00c8, 0x2011, 0x7612, 0x080c, 0x8a5d, 0x002e, - 0x001e, 0x080c, 0x8890, 0x7034, 0xc085, 0x7036, 0x2001, 0x197d, - 0x2003, 0x0004, 0x080c, 0x744d, 0x080c, 0x77af, 0x0138, 0x6804, - 0xd0d4, 0x1120, 0xd0dc, 0x1100, 0x080c, 0x7abb, 0x00ee, 0x00de, - 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, - 0x0140, 0x2071, 0x1800, 0x080c, 0x88a7, 0x080c, 0x8899, 0x080c, - 0x7ac5, 0x2001, 0x196d, 0x2003, 0x0000, 0x9006, 0x709a, 0x60e2, - 0x6886, 0x080c, 0x2700, 0x9006, 0x080c, 0x2a99, 0x6043, 0x0090, - 0x6043, 0x0010, 0x0026, 0x2011, 0xffff, 0x080c, 0x2ad3, 0x002e, - 0x602b, 0x182c, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0006, 0x2001, - 0x197c, 0x2004, 0x9086, 0xaaaa, 0x000e, 0x0005, 0x0006, 0x080c, - 0x5844, 0x9084, 0x0030, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, - 0x080c, 0x5844, 0x9084, 0x0030, 0x9086, 0x0030, 0x000e, 0x0005, - 0x0006, 0x080c, 0x5844, 0x9084, 0x0030, 0x9086, 0x0010, 0x000e, - 0x0005, 0x0006, 0x080c, 0x5844, 0x9084, 0x0030, 0x9086, 0x0020, - 0x000e, 0x0005, 0x0036, 0x0016, 0x2001, 0x180c, 0x2004, 0x908c, - 0x0013, 0x0168, 0x0020, 0x080c, 0x2720, 0x900e, 0x0010, 0x2009, - 0x0002, 0x2019, 0x0028, 0x080c, 0x32da, 0x9006, 0x0019, 0x001e, - 0x003e, 0x0005, 0x00e6, 0x2071, 0x180c, 0x2e04, 0x0130, 0x080c, - 0xd63e, 0x1128, 0x9085, 0x0010, 0x0010, 0x9084, 0xffef, 0x2072, - 0x00ee, 0x0005, 0x6050, 0x0006, 0x60ec, 0x0006, 0x600c, 0x0006, - 0x6004, 0x0006, 0x6028, 0x0006, 0x080c, 0x2af6, 0x080c, 0x2b29, - 0x602f, 0x0100, 0x602f, 0x0000, 0x602f, 0x0040, 0x602f, 0x0000, - 0x20a9, 0x0002, 0x080c, 0x2a60, 0x0026, 0x2011, 0x0040, 0x080c, - 0x2ad3, 0x002e, 0x000e, 0x602a, 0x000e, 0x6006, 0x000e, 0x600e, - 0x000e, 0x60ee, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, - 0x080c, 0x2700, 0x2001, 0x00a0, 0x0006, 0x080c, 0xd645, 0x000e, - 0x0130, 0x080c, 0x2ab7, 0x9006, 0x080c, 0x2ac3, 0x0010, 0x080c, - 0x2a99, 0x000e, 0x6052, 0x6050, 0x0006, 0xc0e5, 0x6052, 0x00f6, - 0x2079, 0x0100, 0x080c, 0x2a0c, 0x00fe, 0x000e, 0x6052, 0x0005, - 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, - 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x080c, 0xad5a, 0x0158, - 0x2001, 0x0386, 0x2004, 0xd0b4, 0x1130, 0x2001, 0x0016, 0x080c, - 0xaced, 0x0804, 0x78d6, 0x2001, 0x180c, 0x200c, 0xc1c4, 0x2102, - 0x6028, 0x9084, 0xe1ff, 0x602a, 0x2011, 0x0200, 0x080c, 0x2ad3, - 0x2001, 0x0090, 0x080c, 0x2a99, 0x20a9, 0x0366, 0x6024, 0xd0cc, - 0x1560, 0x1d04, 0x786e, 0x2091, 0x6000, 0x1f04, 0x786e, 0x080c, - 0xacfc, 0x2011, 0x0003, 0x080c, 0xa62b, 0x2011, 0x0002, 0x080c, - 0xa635, 0x080c, 0xa516, 0x901e, 0x080c, 0xa596, 0x2001, 0x0386, - 0x2003, 0x7000, 0x080c, 0xad18, 0x2001, 0x00a0, 0x080c, 0x2a99, - 0x080c, 0x7ab6, 0x080c, 0x619d, 0x080c, 0xd645, 0x0110, 0x080c, - 0x0cf1, 0x9085, 0x0001, 0x0804, 0x78dc, 0x080c, 0x1b4b, 0x60e3, - 0x0000, 0x2001, 0x180d, 0x2004, 0xd08c, 0x2001, 0x0002, 0x1118, - 0x2001, 0x196d, 0x2004, 0x080c, 0x2700, 0x60e2, 0x2001, 0x0080, - 0x080c, 0x2a99, 0x20a9, 0x0366, 0x2011, 0x1e00, 0x080c, 0x2ad3, - 0x2009, 0x1e00, 0x080c, 0x2a7f, 0x6024, 0x910c, 0x0140, 0x1d04, - 0x78b4, 0x2091, 0x6000, 0x1f04, 0x78b4, 0x0804, 0x7877, 0x2001, - 0x0386, 0x2003, 0x7000, 0x6028, 0x9085, 0x1e00, 0x602a, 0x70b4, - 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x080c, 0xd645, - 0x0110, 0x080c, 0x0cf1, 0x9006, 0x00ee, 0x00de, 0x00ce, 0x003e, - 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, - 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800, 0x7000, - 0x9086, 0x0003, 0x1168, 0x2001, 0x020b, 0x2004, 0x9084, 0x5540, - 0x9086, 0x5540, 0x1128, 0x2069, 0x1a7b, 0x2d04, 0x8000, 0x206a, - 0x2069, 0x0140, 0x6020, 0x9084, 0x00c0, 0x0120, 0x6884, 0x9005, - 0x1904, 0x794d, 0x2001, 0x0088, 0x080c, 0x2a99, 0x9006, 0x60e2, - 0x6886, 0x080c, 0x2700, 0x2069, 0x0200, 0x6804, 0x9005, 0x1118, - 0x6808, 0x9005, 0x01d0, 0x6028, 0x9084, 0xfbff, 0x602a, 0x2011, - 0x0400, 0x080c, 0x2ad3, 0x2069, 0x198f, 0x7000, 0x206a, 0x709b, - 0x0026, 0x7003, 0x0001, 0x20a9, 0x0002, 0x1d04, 0x792d, 0x2091, - 0x6000, 0x1f04, 0x792d, 0x0804, 0x7988, 0x2069, 0x0140, 0x20a9, - 0x0384, 0x2011, 0x1e00, 0x080c, 0x2ad3, 0x2009, 0x1e00, 0x080c, - 0x2a7f, 0x6024, 0x910c, 0x0528, 0x9084, 0x1a00, 0x1510, 0x1d04, - 0x7939, 0x2091, 0x6000, 0x1f04, 0x7939, 0x080c, 0xacfc, 0x2011, - 0x0003, 0x080c, 0xa62b, 0x2011, 0x0002, 0x080c, 0xa635, 0x080c, - 0xa516, 0x901e, 0x080c, 0xa596, 0x080c, 0xad18, 0x2001, 0x00a0, - 0x080c, 0x2a99, 0x080c, 0x7ab6, 0x080c, 0x619d, 0x9085, 0x0001, - 0x00f8, 0x080c, 0x1b4b, 0x2001, 0x0080, 0x080c, 0x2a99, 0x2069, - 0x0140, 0x60e3, 0x0000, 0x70b4, 0x9005, 0x1118, 0x6887, 0x0001, - 0x0008, 0x6886, 0x2001, 0x180d, 0x2004, 0xd08c, 0x2001, 0x0002, - 0x1118, 0x2001, 0x196d, 0x2004, 0x080c, 0x2700, 0x60e2, 0x9006, - 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, - 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, - 0x0100, 0x2071, 0x1800, 0x6020, 0x9084, 0x00c0, 0x01e8, 0x080c, - 0xacfc, 0x2011, 0x0003, 0x080c, 0xa62b, 0x2011, 0x0002, 0x080c, - 0xa635, 0x080c, 0xa516, 0x901e, 0x080c, 0xa596, 0x080c, 0xad18, - 0x2069, 0x0140, 0x2001, 0x00a0, 0x080c, 0x2a99, 0x080c, 0x7ab6, - 0x080c, 0x619d, 0x0804, 0x7a32, 0x2001, 0x180c, 0x200c, 0xd1b4, - 0x1160, 0xc1b5, 0x2102, 0x080c, 0x75fa, 0x2069, 0x0140, 0x2001, - 0x0080, 0x080c, 0x2a99, 0x60e3, 0x0000, 0x2069, 0x0200, 0x6804, - 0x9005, 0x1118, 0x6808, 0x9005, 0x0190, 0x6028, 0x9084, 0xfdff, - 0x602a, 0x2011, 0x0200, 0x080c, 0x2ad3, 0x2069, 0x198f, 0x7000, - 0x206a, 0x709b, 0x0027, 0x7003, 0x0001, 0x0804, 0x7a32, 0x2011, - 0x1e00, 0x080c, 0x2ad3, 0x2009, 0x1e00, 0x080c, 0x2a7f, 0x6024, - 0x910c, 0x01c8, 0x9084, 0x1c00, 0x11b0, 0x1d04, 0x79e7, 0x0006, - 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x080c, 0x88e7, 0x00ee, 0x00de, - 0x00ce, 0x001e, 0x000e, 0x00e6, 0x2071, 0x1a04, 0x7078, 0x00ee, - 0x9005, 0x19e8, 0x0438, 0x0026, 0x2011, 0x7612, 0x080c, 0x8993, - 0x2011, 0x7605, 0x080c, 0x8a9f, 0x002e, 0x2069, 0x0140, 0x60e3, - 0x0000, 0x70b4, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, - 0x2001, 0x180d, 0x2004, 0xd08c, 0x2001, 0x0002, 0x1118, 0x2001, - 0x196d, 0x2004, 0x080c, 0x2700, 0x60e2, 0x2001, 0x180c, 0x200c, - 0xc1b4, 0x2102, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, - 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x0046, 0x00c6, - 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800, 0x080c, 0xd63e, 0x1904, - 0x7aa0, 0x7130, 0xd184, 0x1170, 0x080c, 0x3482, 0x0138, 0xc18d, - 0x7132, 0x2011, 0x1848, 0x2214, 0xd2ac, 0x1120, 0x7030, 0xd08c, - 0x0904, 0x7aa0, 0x2011, 0x1848, 0x220c, 0xd1a4, 0x0538, 0x0016, - 0x2019, 0x000e, 0x080c, 0xe9f9, 0x0156, 0x00b6, 0x20a9, 0x007f, - 0x900e, 0x9186, 0x007e, 0x01a0, 0x9186, 0x0080, 0x0188, 0x080c, - 0x67b4, 0x1170, 0x2120, 0x9006, 0x0016, 0x2009, 0x000e, 0x080c, - 0xea8d, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, 0x8c44, 0x001e, - 0x8108, 0x1f04, 0x7a69, 0x00be, 0x015e, 0x001e, 0xd1ac, 0x1148, - 0x0016, 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x32da, 0x001e, - 0x0078, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x67b4, - 0x1110, 0x080c, 0x61b7, 0x8108, 0x1f04, 0x7a96, 0x00be, 0x015e, - 0x080c, 0x1b4b, 0x080c, 0xacfc, 0x080c, 0xb09b, 0x080c, 0xad18, - 0x60e3, 0x0000, 0x080c, 0x619d, 0x080c, 0x76cd, 0x00ee, 0x00ce, - 0x004e, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x2001, 0x197d, - 0x2003, 0x0001, 0x0005, 0x2001, 0x197d, 0x2003, 0x0000, 0x0005, - 0x2001, 0x197c, 0x2003, 0xaaaa, 0x0005, 0x2001, 0x197c, 0x2003, - 0x0000, 0x0005, 0x2071, 0x18fa, 0x7003, 0x0000, 0x7007, 0x0000, - 0x080c, 0x1072, 0x090c, 0x0d85, 0xa8ab, 0xdcb0, 0x2900, 0x704e, - 0x080c, 0x1072, 0x090c, 0x0d85, 0xa8ab, 0xdcb0, 0x2900, 0x7052, - 0xa867, 0x0000, 0xa86b, 0x0001, 0xa89f, 0x0000, 0x0005, 0x00e6, - 0x2071, 0x0040, 0x6848, 0x9005, 0x1118, 0x9085, 0x0001, 0x04b0, - 0x6840, 0x9005, 0x0150, 0x04a1, 0x6a50, 0x9200, 0x7002, 0x6854, - 0x9101, 0x7006, 0x9006, 0x7012, 0x7016, 0x6850, 0x7002, 0x6854, - 0x7006, 0x6858, 0x700a, 0x685c, 0x700e, 0x6840, 0x9005, 0x1110, - 0x7012, 0x7016, 0x6848, 0x701a, 0x701c, 0x9085, 0x0040, 0x701e, - 0x2001, 0x0019, 0x7036, 0x702b, 0x0001, 0x2001, 0x0004, 0x200c, - 0x918c, 0xfff7, 0x918d, 0x8000, 0x2102, 0x00d6, 0x2069, 0x18fa, - 0x6807, 0x0001, 0x00de, 0x080c, 0x8103, 0x9006, 0x00ee, 0x0005, - 0x900e, 0x0156, 0x20a9, 0x0006, 0x8003, 0x818d, 0x1f04, 0x7b2c, - 0x015e, 0x0005, 0x2079, 0x0040, 0x2071, 0x18fa, 0x7004, 0x0002, - 0x7b42, 0x7b43, 0x7b8f, 0x7bea, 0x7d4a, 0x7b40, 0x7b40, 0x7d74, - 0x080c, 0x0d85, 0x0005, 0x2079, 0x0040, 0x2001, 0x1dc0, 0x2003, - 0x0000, 0x782c, 0x908c, 0x0780, 0x190c, 0x81e5, 0xd0a4, 0x0578, - 0x2001, 0x1dc0, 0x2004, 0x9082, 0x0080, 0x1648, 0x1d04, 0x7b60, - 0x2001, 0x1a07, 0x200c, 0x8109, 0x0510, 0x2091, 0x6000, 0x2102, - 0x7824, 0x2048, 0x9006, 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff, - 0x908a, 0x0040, 0x0610, 0x00c0, 0x2001, 0x1800, 0x200c, 0x9186, - 0x0003, 0x1168, 0x7004, 0x0002, 0x7b7f, 0x7b49, 0x7b7f, 0x7b7d, - 0x7b7f, 0x7b7f, 0x7b7f, 0x7b7f, 0x7b7f, 0x080c, 0x7bea, 0x782c, - 0xd09c, 0x090c, 0x8103, 0x0005, 0x9082, 0x005a, 0x1218, 0x2100, - 0x003b, 0x0c10, 0x080c, 0x7c20, 0x0c90, 0x00e3, 0x08e8, 0x0005, - 0x7c20, 0x7c20, 0x7c20, 0x7c20, 0x7c20, 0x7c20, 0x7c20, 0x7c20, - 0x7c42, 0x7c20, 0x7c20, 0x7c20, 0x7c20, 0x7c20, 0x7c20, 0x7c20, - 0x7c20, 0x7c20, 0x7c20, 0x7c20, 0x7c20, 0x7c20, 0x7c20, 0x7c20, - 0x7c20, 0x7c20, 0x7c20, 0x7c20, 0x7c2c, 0x7c20, 0x7e6a, 0x7c20, - 0x7c20, 0x7c20, 0x7c42, 0x7c20, 0x7c2c, 0x7eab, 0x7eec, 0x7f33, - 0x7f47, 0x7c20, 0x7c20, 0x7c42, 0x7c2c, 0x7c56, 0x7c20, 0x7d1e, - 0x7ff2, 0x800d, 0x7c20, 0x7c42, 0x7c20, 0x7c56, 0x7c20, 0x7c20, - 0x7d14, 0x800d, 0x7c20, 0x7c20, 0x7c20, 0x7c20, 0x7c20, 0x7c20, - 0x7c20, 0x7c20, 0x7c20, 0x7c6a, 0x7c20, 0x7c20, 0x7c20, 0x7c20, - 0x7c20, 0x7c20, 0x7c20, 0x7c20, 0x7c20, 0x8189, 0x7c20, 0x8133, - 0x7c20, 0x8133, 0x7c20, 0x7c7f, 0x7c20, 0x7c20, 0x7c20, 0x7c20, - 0x7c20, 0x7c20, 0x2079, 0x0040, 0x7004, 0x9086, 0x0003, 0x1198, - 0x782c, 0x080c, 0x812c, 0xd0a4, 0x0170, 0x7824, 0x2048, 0x9006, - 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff, 0x908a, 0x001a, 0x1210, - 0x002b, 0x0c50, 0x00e9, 0x080c, 0x8103, 0x0005, 0x7c20, 0x7c2c, - 0x7e56, 0x7c20, 0x7c2c, 0x7c20, 0x7c2c, 0x7c2c, 0x7c20, 0x7c2c, - 0x7e56, 0x7c2c, 0x7c2c, 0x7c2c, 0x7c2c, 0x7c2c, 0x7c20, 0x7c2c, - 0x7e56, 0x7c20, 0x7c20, 0x7c2c, 0x7c20, 0x7c20, 0x7c20, 0x7c2c, - 0x00e6, 0x2071, 0x18fa, 0x2009, 0x0400, 0x0071, 0x00ee, 0x0005, - 0x2009, 0x1000, 0x0049, 0x0005, 0x2009, 0x2000, 0x0029, 0x0005, - 0x2009, 0x0800, 0x0009, 0x0005, 0x7007, 0x0001, 0xa868, 0x9084, - 0x00ff, 0x9105, 0xa86a, 0x0126, 0x2091, 0x8000, 0x080c, 0x7012, - 0x012e, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0d08, 0x8001, - 0x1120, 0x7007, 0x0001, 0x0804, 0x7df3, 0x7007, 0x0003, 0x7012, - 0x2900, 0x7016, 0x701a, 0x704b, 0x7df3, 0x0005, 0xa864, 0x8007, - 0x9084, 0x00ff, 0x0968, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, - 0x7e0e, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, - 0x7e0e, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0904, 0x7c28, - 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x7e2a, 0x7007, 0x0003, - 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x7e2a, 0x0005, 0xa864, - 0x8007, 0x9084, 0x00ff, 0x9086, 0x0001, 0x1904, 0x7c28, 0x7007, - 0x0001, 0x2009, 0x1834, 0x210c, 0x81ff, 0x1904, 0x7ceb, 0x2001, - 0x180d, 0x2004, 0xd08c, 0x0904, 0x7cd6, 0xa99c, 0x9186, 0x00ff, - 0x05e8, 0xa994, 0x9186, 0x006f, 0x0188, 0x9186, 0x0074, 0x15b0, - 0x0026, 0x2011, 0x0010, 0x080c, 0x6c35, 0x002e, 0x0578, 0x0016, - 0xa998, 0x080c, 0x6c7f, 0x001e, 0x1548, 0x0400, 0x080c, 0x779e, - 0x0140, 0xa897, 0x4005, 0xa89b, 0x0016, 0x2001, 0x0030, 0x900e, - 0x0438, 0x0026, 0x2011, 0x8008, 0x080c, 0x6c35, 0x002e, 0x01b0, - 0x0016, 0x0026, 0x0036, 0xa998, 0xaaa0, 0xab9c, 0x918d, 0x8000, - 0x080c, 0x6c7f, 0x003e, 0x002e, 0x001e, 0x1140, 0xa897, 0x4005, - 0xa89b, 0x4009, 0x2001, 0x0030, 0x900e, 0x0050, 0xa868, 0x9084, - 0x00ff, 0xa86a, 0xa883, 0x0000, 0x080c, 0x6430, 0x1108, 0x0005, - 0x0126, 0x2091, 0x8000, 0xa867, 0x0139, 0xa87a, 0xa982, 0x080c, - 0x7012, 0x012e, 0x0ca0, 0xa994, 0x9186, 0x0071, 0x0904, 0x7c8f, - 0x9186, 0x0064, 0x0904, 0x7c8f, 0x9186, 0x007c, 0x0904, 0x7c8f, - 0x9186, 0x0028, 0x0904, 0x7c8f, 0x9186, 0x0038, 0x0904, 0x7c8f, - 0x9186, 0x0078, 0x0904, 0x7c8f, 0x9186, 0x005f, 0x0904, 0x7c8f, - 0x9186, 0x0056, 0x0904, 0x7c8f, 0xa897, 0x4005, 0xa89b, 0x0001, - 0x2001, 0x0030, 0x900e, 0x0860, 0xa87c, 0x9084, 0x00c0, 0x9086, - 0x00c0, 0x1120, 0x7007, 0x0001, 0x0804, 0x8024, 0x2900, 0x7016, - 0x701a, 0x20a9, 0x0004, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0030, - 0x2098, 0x7050, 0x2040, 0xa060, 0x20e8, 0xa05c, 0x9080, 0x0023, - 0x20a0, 0x4003, 0xa888, 0x7012, 0x9082, 0x0401, 0x1a04, 0x7c30, - 0xaab4, 0x928a, 0x0002, 0x1a04, 0x7c30, 0x82ff, 0x1138, 0xa8b8, - 0xa9bc, 0x9105, 0x0118, 0x2001, 0x7db1, 0x0018, 0x9280, 0x7da7, - 0x2005, 0x7056, 0x7010, 0x9015, 0x0904, 0x7d92, 0x080c, 0x1072, - 0x1118, 0x7007, 0x0004, 0x0005, 0x2900, 0x7022, 0x7054, 0x2060, - 0xe000, 0xa866, 0x7050, 0x2040, 0xa95c, 0xe004, 0x9100, 0xa076, - 0xa860, 0xa072, 0xe008, 0x920a, 0x1210, 0x900e, 0x2200, 0x7112, - 0xe20c, 0x8003, 0x800b, 0x9296, 0x0004, 0x0108, 0x9108, 0xa17a, - 0x810b, 0xa17e, 0x080c, 0x114e, 0xa06c, 0x908e, 0x0100, 0x0170, - 0x9086, 0x0200, 0x0118, 0x7007, 0x0007, 0x0005, 0x7020, 0x2048, - 0x080c, 0x108b, 0x7014, 0x2048, 0x0804, 0x7c30, 0x7020, 0x2048, - 0x7018, 0xa802, 0xa807, 0x0000, 0x2908, 0x2048, 0xa906, 0x711a, - 0x0804, 0x7d4a, 0x7014, 0x2048, 0x7007, 0x0001, 0xa8b4, 0x9005, - 0x1128, 0xa8b8, 0xa9bc, 0x9105, 0x0108, 0x00b9, 0xa864, 0x9084, - 0x00ff, 0x9086, 0x001e, 0x0904, 0x8024, 0x0804, 0x7df3, 0x7da9, - 0x7dad, 0x0002, 0x001d, 0x0007, 0x0004, 0x000a, 0x001b, 0x0005, - 0x0006, 0x000a, 0x001d, 0x0005, 0x0004, 0x0076, 0x0066, 0xafb8, - 0xaebc, 0xa804, 0x2050, 0xb0c0, 0xb0e2, 0xb0bc, 0xb0de, 0xb0b8, - 0xb0d2, 0xb0b4, 0xb0ce, 0xb6da, 0xb7d6, 0xb0b0, 0xb0ca, 0xb0ac, - 0xb0c6, 0xb0a8, 0xb0ba, 0xb0a4, 0xb0b6, 0xb6c2, 0xb7be, 0xb0a0, - 0xb0b2, 0xb09c, 0xb0ae, 0xb098, 0xb0a2, 0xb094, 0xb09e, 0xb6aa, - 0xb7a6, 0xb090, 0xb09a, 0xb08c, 0xb096, 0xb088, 0xb08a, 0xb084, - 0xb086, 0xb692, 0xb78e, 0xb080, 0xb082, 0xb07c, 0xb07e, 0xb078, - 0xb072, 0xb074, 0xb06e, 0xb67a, 0xb776, 0xb004, 0x9055, 0x1958, - 0x006e, 0x007e, 0x0005, 0x2009, 0x1834, 0x210c, 0x81ff, 0x1178, - 0x080c, 0x622f, 0x1108, 0x0005, 0x080c, 0x725e, 0x0126, 0x2091, - 0x8000, 0x080c, 0xd220, 0x080c, 0x7012, 0x012e, 0x0ca0, 0x080c, - 0xd63e, 0x1d70, 0x2001, 0x0028, 0x900e, 0x0c70, 0x2009, 0x1834, - 0x210c, 0x81ff, 0x1188, 0xa888, 0x9005, 0x0188, 0xa883, 0x0000, - 0x080c, 0x62bd, 0x1108, 0x0005, 0xa87a, 0x0126, 0x2091, 0x8000, - 0x080c, 0x7012, 0x012e, 0x0cb8, 0x2001, 0x0028, 0x0ca8, 0x2001, - 0x0000, 0x0c90, 0x0419, 0x11d8, 0xa888, 0x9005, 0x01e0, 0xa883, - 0x0000, 0xa87c, 0xd0f4, 0x0120, 0x080c, 0x6392, 0x1138, 0x0005, - 0x9006, 0xa87a, 0x080c, 0x630a, 0x1108, 0x0005, 0x0126, 0x2091, - 0x8000, 0xa87a, 0xa982, 0x080c, 0x7012, 0x012e, 0x0cb0, 0x2001, - 0x0028, 0x900e, 0x0c98, 0x2001, 0x0000, 0x0c80, 0x00c6, 0x2061, - 0x1800, 0x60d0, 0x9005, 0x0100, 0x00ce, 0x0005, 0x7018, 0xa802, - 0x2908, 0x2048, 0xa906, 0x711a, 0x7010, 0x8001, 0x7012, 0x0118, - 0x7007, 0x0003, 0x0030, 0x7014, 0x2048, 0x7007, 0x0001, 0x7048, - 0x080f, 0x0005, 0x00b6, 0x7007, 0x0001, 0xa974, 0xa878, 0x9084, - 0x00ff, 0x9096, 0x0004, 0x0540, 0x20a9, 0x0001, 0x9096, 0x0001, - 0x0190, 0x900e, 0x20a9, 0x0800, 0x9096, 0x0002, 0x0160, 0x9005, - 0x11d8, 0xa974, 0x080c, 0x67b4, 0x11b8, 0x0066, 0xae80, 0x080c, - 0x68c4, 0x006e, 0x0088, 0x0046, 0x2011, 0x180c, 0x2224, 0xc484, - 0x2412, 0x004e, 0x00c6, 0x080c, 0x67b4, 0x1110, 0x080c, 0x6a9e, - 0x8108, 0x1f04, 0x7e93, 0x00ce, 0xa87c, 0xd084, 0x1120, 0x080c, - 0x108b, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x7012, - 0x012e, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, - 0x080c, 0x6c0d, 0x0580, 0x2061, 0x1a73, 0x6100, 0xd184, 0x0178, - 0xa888, 0x9084, 0x00ff, 0x1550, 0x6000, 0xd084, 0x0520, 0x6004, - 0x9005, 0x1538, 0x6003, 0x0000, 0x600b, 0x0000, 0x00c8, 0x2011, - 0x0001, 0xa890, 0x9005, 0x1110, 0x2001, 0x001e, 0x8000, 0x6016, - 0xa888, 0x9084, 0x00ff, 0x0178, 0x6006, 0xa888, 0x8007, 0x9084, - 0x00ff, 0x0148, 0x600a, 0xa888, 0x8000, 0x1108, 0xc28d, 0x6202, - 0x012e, 0x0804, 0x80ed, 0x012e, 0x0804, 0x80e7, 0x012e, 0x0804, - 0x80e1, 0x012e, 0x0804, 0x80e4, 0x0126, 0x2091, 0x8000, 0x7007, - 0x0001, 0x080c, 0x6c0d, 0x05e0, 0x2061, 0x1a73, 0x6000, 0xd084, - 0x05b8, 0x6204, 0x6308, 0xd08c, 0x1530, 0xac78, 0x9484, 0x0003, - 0x0170, 0xa988, 0x918c, 0x00ff, 0x8001, 0x1120, 0x2100, 0x9210, - 0x0620, 0x0028, 0x8001, 0x1508, 0x2100, 0x9212, 0x02f0, 0x9484, - 0x000c, 0x0188, 0xa988, 0x810f, 0x918c, 0x00ff, 0x9082, 0x0004, - 0x1120, 0x2100, 0x9318, 0x0288, 0x0030, 0x9082, 0x0004, 0x1168, - 0x2100, 0x931a, 0x0250, 0xa890, 0x9005, 0x0110, 0x8000, 0x6016, - 0x6206, 0x630a, 0x012e, 0x0804, 0x80ed, 0x012e, 0x0804, 0x80ea, - 0x012e, 0x0804, 0x80e7, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, - 0x2061, 0x1a73, 0x6300, 0xd38c, 0x1120, 0x6308, 0x8318, 0x0220, - 0x630a, 0x012e, 0x0804, 0x80fb, 0x012e, 0x0804, 0x80ea, 0x00b6, - 0x0126, 0x00c6, 0x2091, 0x8000, 0x7007, 0x0001, 0xa87c, 0xd0ac, - 0x0148, 0x00c6, 0x2061, 0x1a73, 0x6000, 0x9084, 0xfcff, 0x6002, - 0x00ce, 0x0440, 0xa888, 0x9005, 0x05d8, 0xa88c, 0x9065, 0x0598, - 0x2001, 0x1834, 0x2004, 0x9005, 0x0118, 0x080c, 0xb1a7, 0x0068, - 0x6017, 0xf400, 0x6063, 0x0000, 0xa97c, 0xd1a4, 0x0110, 0xa980, - 0x6162, 0x2009, 0x0041, 0x080c, 0xb20a, 0xa988, 0x918c, 0xff00, - 0x9186, 0x2000, 0x1138, 0x0026, 0x900e, 0x2011, 0xfdff, 0x080c, - 0x8c44, 0x002e, 0xa87c, 0xd0c4, 0x0148, 0x2061, 0x1a73, 0x6000, - 0xd08c, 0x1120, 0x6008, 0x8000, 0x0208, 0x600a, 0x00ce, 0x012e, - 0x00be, 0x0804, 0x80ed, 0x00ce, 0x012e, 0x00be, 0x0804, 0x80e7, - 0xa984, 0x9186, 0x002e, 0x0d30, 0x9186, 0x002d, 0x0d18, 0x9186, - 0x0045, 0x0510, 0x9186, 0x002a, 0x1130, 0x2001, 0x180c, 0x200c, - 0xc194, 0x2102, 0x08b8, 0x9186, 0x0020, 0x0158, 0x9186, 0x0029, - 0x1d10, 0xa974, 0x080c, 0x67b4, 0x1968, 0xb800, 0xc0e4, 0xb802, - 0x0848, 0xa88c, 0x9065, 0x09b8, 0x6007, 0x0024, 0x2001, 0x1986, - 0x2004, 0x601a, 0x0804, 0x7f82, 0xa88c, 0x9065, 0x0960, 0x00e6, - 0xa890, 0x9075, 0x2001, 0x1834, 0x2004, 0x9005, 0x0150, 0x080c, - 0xb1a7, 0x8eff, 0x0118, 0x2e60, 0x080c, 0xb1a7, 0x00ee, 0x0804, - 0x7f82, 0x6024, 0xc0dc, 0xc0d5, 0x6026, 0x2e60, 0x6007, 0x003a, - 0xa8a0, 0x9005, 0x0130, 0x6007, 0x003b, 0xa8a4, 0x602e, 0xa8a8, - 0x6016, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x9617, 0x00ee, - 0x0804, 0x7f82, 0x2061, 0x1a73, 0x6000, 0xd084, 0x0190, 0xd08c, - 0x1904, 0x80fb, 0x0126, 0x2091, 0x8000, 0x6204, 0x8210, 0x0220, - 0x6206, 0x012e, 0x0804, 0x80fb, 0x012e, 0xa883, 0x0016, 0x0804, - 0x80f4, 0xa883, 0x0007, 0x0804, 0x80f4, 0xa864, 0x8007, 0x9084, - 0x00ff, 0x0130, 0x8001, 0x1138, 0x7007, 0x0001, 0x0069, 0x0005, - 0x080c, 0x7c28, 0x0040, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, - 0x701a, 0x704b, 0x8024, 0x0005, 0x00b6, 0x00e6, 0x0126, 0x2091, - 0x8000, 0x903e, 0x2061, 0x1800, 0x61d0, 0x81ff, 0x1904, 0x80a6, - 0x6130, 0xd194, 0x1904, 0x80d0, 0xa878, 0x2070, 0x9e82, 0x1ddc, - 0x0a04, 0x809a, 0x6068, 0x9e02, 0x1a04, 0x809a, 0x7120, 0x9186, - 0x0006, 0x1904, 0x808c, 0x7010, 0x905d, 0x0904, 0x80a6, 0xb800, - 0xd0e4, 0x1904, 0x80ca, 0x2061, 0x1a73, 0x6100, 0x9184, 0x0301, - 0x9086, 0x0001, 0x15a0, 0x7024, 0xd0dc, 0x1904, 0x80d3, 0xa883, - 0x0000, 0xa803, 0x0000, 0x2908, 0x7014, 0x9005, 0x1198, 0x7116, - 0xa87c, 0xd0f4, 0x1904, 0x80d6, 0x080c, 0x5840, 0xd09c, 0x1118, - 0xa87c, 0xc0cc, 0xa87e, 0x2e60, 0x080c, 0x8b34, 0x012e, 0x00ee, - 0x00be, 0x0005, 0x2048, 0xa800, 0x9005, 0x1de0, 0xa902, 0x2148, - 0xa87c, 0xd0f4, 0x1904, 0x80d6, 0x012e, 0x00ee, 0x00be, 0x0005, - 0x012e, 0x00ee, 0xa883, 0x0006, 0x00be, 0x0804, 0x80f4, 0xd184, - 0x0db8, 0xd1c4, 0x1190, 0x00a0, 0xa974, 0x080c, 0x67b4, 0x15d0, - 0xb800, 0xd0e4, 0x15b8, 0x7120, 0x9186, 0x0007, 0x1118, 0xa883, - 0x0002, 0x0490, 0xa883, 0x0008, 0x0478, 0xa883, 0x000e, 0x0460, - 0xa883, 0x0017, 0x0448, 0xa883, 0x0035, 0x0430, 0x080c, 0x5844, - 0xd0fc, 0x01e8, 0xa878, 0x2070, 0x9e82, 0x1ddc, 0x02c0, 0x6068, - 0x9e02, 0x12a8, 0x7120, 0x9186, 0x0006, 0x1188, 0x7010, 0x905d, - 0x0170, 0xb800, 0xd0bc, 0x0158, 0x2039, 0x0001, 0x7000, 0x9086, - 0x0007, 0x1904, 0x8030, 0x7003, 0x0002, 0x0804, 0x8030, 0xa883, - 0x0028, 0x0010, 0xa883, 0x0029, 0x012e, 0x00ee, 0x00be, 0x0420, - 0xa883, 0x002a, 0x0cc8, 0xa883, 0x0045, 0x0cb0, 0x2e60, 0x2019, - 0x0002, 0x601b, 0x0014, 0x080c, 0xe586, 0x012e, 0x00ee, 0x00be, - 0x0005, 0x2009, 0x003e, 0x0058, 0x2009, 0x0004, 0x0040, 0x2009, - 0x0006, 0x0028, 0x2009, 0x0016, 0x0010, 0x2009, 0x0001, 0xa884, - 0x9084, 0xff00, 0x9105, 0xa886, 0x0126, 0x2091, 0x8000, 0x080c, - 0x7012, 0x012e, 0x0005, 0x080c, 0x108b, 0x0005, 0x00d6, 0x080c, - 0x8b2b, 0x00de, 0x0005, 0x00d6, 0x00e6, 0x0126, 0x2091, 0x8000, - 0x2071, 0x0040, 0x702c, 0xd084, 0x01d8, 0x908c, 0x0780, 0x190c, - 0x81e5, 0xd09c, 0x11a8, 0x2071, 0x1800, 0x70c0, 0x90ea, 0x0020, - 0x0278, 0x8001, 0x70c2, 0x702c, 0x2048, 0xa800, 0x702e, 0x9006, - 0xa802, 0xa806, 0x2071, 0x0040, 0x2900, 0x7022, 0x702c, 0x0c28, - 0x012e, 0x00ee, 0x00de, 0x0005, 0x0006, 0x9084, 0x0780, 0x190c, - 0x81e5, 0x000e, 0x0005, 0xa898, 0x9084, 0x0003, 0x05a8, 0x080c, - 0xb116, 0x05d8, 0x2900, 0x6016, 0xa864, 0x9084, 0x00ff, 0x9086, - 0x0035, 0x1138, 0x6028, 0xc0fd, 0x602a, 0x2001, 0x196b, 0x2004, - 0x0098, 0xa8a0, 0x9084, 0x00ff, 0xa99c, 0x918c, 0xff00, 0x9105, - 0xa99c, 0x918c, 0x00ff, 0x080c, 0x268c, 0x1540, 0x00b6, 0x080c, - 0x67b4, 0x2b00, 0x00be, 0x1510, 0x6012, 0x6023, 0x0001, 0x2009, - 0x0040, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0035, 0x0110, 0x2009, - 0x0041, 0x080c, 0xb20a, 0x0005, 0xa87b, 0x0101, 0x0126, 0x2091, - 0x8000, 0x080c, 0x7012, 0x012e, 0x0005, 0xa87b, 0x002c, 0x0126, - 0x2091, 0x8000, 0x080c, 0x7012, 0x012e, 0x0005, 0xa87b, 0x0028, - 0x0126, 0x2091, 0x8000, 0x080c, 0x7012, 0x012e, 0x080c, 0xb16c, - 0x0005, 0x00d6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x00b6, 0x7007, - 0x0001, 0xaa74, 0x9282, 0x0004, 0x1a04, 0x81d6, 0xa97c, 0x9188, - 0x1000, 0x2104, 0x905d, 0xb804, 0xd284, 0x0140, 0x05e8, 0x8007, - 0x9084, 0x00ff, 0x9084, 0x0006, 0x1108, 0x04b0, 0x2b10, 0x080c, - 0xb116, 0x1118, 0x080c, 0xb1dd, 0x05a8, 0x6212, 0xa874, 0x0002, - 0x81b4, 0x81b9, 0x81bc, 0x81c2, 0x2019, 0x0002, 0x080c, 0xe9f9, - 0x0060, 0x080c, 0xe984, 0x0048, 0x2019, 0x0002, 0xa980, 0x080c, - 0xe9a3, 0x0018, 0xa980, 0x080c, 0xe984, 0x080c, 0xb16c, 0xa887, - 0x0000, 0x0126, 0x2091, 0x8000, 0x080c, 0x7012, 0x012e, 0x00be, - 0x001e, 0x002e, 0x003e, 0x00ce, 0x00de, 0x0005, 0xa887, 0x0006, - 0x0c80, 0xa887, 0x0002, 0x0c68, 0xa887, 0x0005, 0x0c50, 0xa887, - 0x0004, 0x0c38, 0xa887, 0x0007, 0x0c20, 0x2091, 0x8000, 0x0e04, - 0x81e7, 0x0006, 0x0016, 0x2001, 0x8003, 0x0006, 0x0804, 0x0d8e, - 0x2001, 0x1834, 0x2004, 0x9005, 0x0005, 0x0005, 0x00f6, 0x2079, - 0x0300, 0x2001, 0x0200, 0x200c, 0xc1e5, 0xc1dc, 0x2102, 0x2009, - 0x0218, 0x210c, 0xd1ec, 0x1120, 0x080c, 0x1648, 0x00fe, 0x0005, - 0x2001, 0x020d, 0x2003, 0x0020, 0x781f, 0x0300, 0x00fe, 0x0005, - 0x781c, 0xd08c, 0x0904, 0x8268, 0x68c0, 0x90aa, 0x0005, 0x0a04, - 0x8890, 0x7d44, 0x7c40, 0xd59c, 0x190c, 0x0d85, 0x9584, 0x00f6, - 0x1508, 0x9484, 0x7000, 0x0138, 0x908a, 0x2000, 0x1258, 0x9584, - 0x0700, 0x8007, 0x04f0, 0x7000, 0x9084, 0xff00, 0x9086, 0x8100, - 0x0db0, 0x00b0, 0x9484, 0x0fff, 0x1130, 0x7000, 0x9084, 0xff00, - 0x9086, 0x8100, 0x11c0, 0x080c, 0xeeb1, 0x080c, 0x8777, 0x7817, - 0x0140, 0x00a8, 0x9584, 0x0076, 0x1118, 0x080c, 0x87d3, 0x19c8, - 0xd5a4, 0x0148, 0x0046, 0x0056, 0x080c, 0x82b8, 0x080c, 0x2185, - 0x005e, 0x004e, 0x0020, 0x080c, 0xeeb1, 0x7817, 0x0140, 0x080c, - 0x779e, 0x0168, 0x2001, 0x0111, 0x2004, 0xd08c, 0x0140, 0x6893, - 0x0000, 0x2001, 0x0110, 0x2003, 0x0008, 0x2003, 0x0000, 0x0489, - 0x0005, 0x0002, 0x8275, 0x8585, 0x8272, 0x8272, 0x8272, 0x8272, - 0x8272, 0x8272, 0x7817, 0x0140, 0x0005, 0x7000, 0x908c, 0xff00, - 0x9194, 0xf000, 0x810f, 0x9484, 0x0fff, 0x6892, 0x9286, 0x2000, - 0x1150, 0x6800, 0x9086, 0x0001, 0x1118, 0x080c, 0x58aa, 0x0070, - 0x080c, 0x82d8, 0x0058, 0x9286, 0x3000, 0x1118, 0x080c, 0x84bf, - 0x0028, 0x9286, 0x8000, 0x1110, 0x080c, 0x86a4, 0x7817, 0x0140, - 0x0005, 0x2001, 0x1810, 0x2004, 0xd08c, 0x0178, 0x2001, 0x1800, - 0x2004, 0x9086, 0x0003, 0x1148, 0x0026, 0x0036, 0x2011, 0x8048, - 0x2518, 0x080c, 0x4ca1, 0x003e, 0x002e, 0x0005, 0x0036, 0x0046, - 0x0056, 0x00f6, 0x2079, 0x0200, 0x2019, 0xfffe, 0x7c30, 0x0050, - 0x0036, 0x0046, 0x0056, 0x00f6, 0x2079, 0x0200, 0x7d44, 0x7c40, - 0x2019, 0xffff, 0x2001, 0x1810, 0x2004, 0xd08c, 0x0160, 0x2001, - 0x1800, 0x2004, 0x9086, 0x0003, 0x1130, 0x0026, 0x2011, 0x8048, - 0x080c, 0x4ca1, 0x002e, 0x00fe, 0x005e, 0x004e, 0x003e, 0x0005, - 0x00b6, 0x00c6, 0x7010, 0x9084, 0xff00, 0x8007, 0x9096, 0x0001, - 0x0120, 0x9096, 0x0023, 0x1904, 0x8490, 0x9186, 0x0023, 0x15c0, - 0x080c, 0x8742, 0x0904, 0x8490, 0x6120, 0x9186, 0x0001, 0x0150, - 0x9186, 0x0004, 0x0138, 0x9186, 0x0008, 0x0120, 0x9186, 0x000a, - 0x1904, 0x8490, 0x7124, 0x610a, 0x7030, 0x908e, 0x0200, 0x1130, - 0x2009, 0x0015, 0x080c, 0xb20a, 0x0804, 0x8490, 0x908e, 0x0214, - 0x0118, 0x908e, 0x0210, 0x1130, 0x2009, 0x0015, 0x080c, 0xb20a, - 0x0804, 0x8490, 0x908e, 0x0100, 0x1904, 0x8490, 0x7034, 0x9005, - 0x1904, 0x8490, 0x2009, 0x0016, 0x080c, 0xb20a, 0x0804, 0x8490, - 0x9186, 0x0022, 0x1904, 0x8490, 0x7030, 0x908e, 0x0300, 0x1580, - 0x68dc, 0xd0a4, 0x0528, 0xc0b5, 0x68de, 0x7100, 0x918c, 0x00ff, - 0x697e, 0x7004, 0x6882, 0x00f6, 0x2079, 0x0100, 0x79e6, 0x78ea, - 0x0006, 0x9084, 0x00ff, 0x0016, 0x2008, 0x080c, 0x26d5, 0x7932, - 0x7936, 0x001e, 0x000e, 0x00fe, 0x080c, 0x268c, 0x695e, 0x703c, - 0x00e6, 0x2071, 0x0140, 0x7086, 0x2071, 0x1800, 0x70b6, 0x00ee, - 0x7034, 0x9005, 0x1904, 0x8490, 0x2009, 0x0017, 0x0804, 0x8440, - 0x908e, 0x0400, 0x1190, 0x7034, 0x9005, 0x1904, 0x8490, 0x080c, - 0x779e, 0x0120, 0x2009, 0x001d, 0x0804, 0x8440, 0x68dc, 0xc0a5, - 0x68de, 0x2009, 0x0030, 0x0804, 0x8440, 0x908e, 0x0500, 0x1140, - 0x7034, 0x9005, 0x1904, 0x8490, 0x2009, 0x0018, 0x0804, 0x8440, - 0x908e, 0x2010, 0x1120, 0x2009, 0x0019, 0x0804, 0x8440, 0x908e, - 0x2110, 0x1120, 0x2009, 0x001a, 0x0804, 0x8440, 0x908e, 0x5200, - 0x1140, 0x7034, 0x9005, 0x1904, 0x8490, 0x2009, 0x001b, 0x0804, - 0x8440, 0x908e, 0x5000, 0x1140, 0x7034, 0x9005, 0x1904, 0x8490, - 0x2009, 0x001c, 0x0804, 0x8440, 0x908e, 0x1300, 0x1120, 0x2009, - 0x0034, 0x0804, 0x8440, 0x908e, 0x1200, 0x1140, 0x7034, 0x9005, - 0x1904, 0x8490, 0x2009, 0x0024, 0x0804, 0x8440, 0x908c, 0xff00, - 0x918e, 0x2400, 0x1170, 0x2009, 0x002d, 0x2001, 0x1810, 0x2004, - 0xd09c, 0x0904, 0x8440, 0x080c, 0xdd8d, 0x1904, 0x8490, 0x0804, - 0x843e, 0x908c, 0xff00, 0x918e, 0x5300, 0x1120, 0x2009, 0x002a, - 0x0804, 0x8440, 0x908e, 0x0f00, 0x1120, 0x2009, 0x0020, 0x0804, - 0x8440, 0x908e, 0x6104, 0x1530, 0x2029, 0x0205, 0x2011, 0x026d, - 0x8208, 0x2204, 0x9082, 0x0004, 0x8004, 0x8004, 0x20a8, 0x2011, - 0x8015, 0x211c, 0x8108, 0x0046, 0x2124, 0x080c, 0x4ca1, 0x004e, - 0x8108, 0x0f04, 0x83f4, 0x9186, 0x0280, 0x1d88, 0x2504, 0x8000, - 0x202a, 0x2009, 0x0260, 0x0c58, 0x202b, 0x0000, 0x2009, 0x0023, - 0x0804, 0x8440, 0x908e, 0x6000, 0x1120, 0x2009, 0x003f, 0x0804, - 0x8440, 0x908e, 0x5400, 0x1138, 0x080c, 0x8840, 0x1904, 0x8490, - 0x2009, 0x0046, 0x04a8, 0x908e, 0x5500, 0x1148, 0x080c, 0x8868, - 0x1118, 0x2009, 0x0041, 0x0460, 0x2009, 0x0042, 0x0448, 0x908e, - 0x7800, 0x1118, 0x2009, 0x0045, 0x0418, 0x908e, 0x1000, 0x1118, - 0x2009, 0x004e, 0x00e8, 0x908e, 0x6300, 0x1118, 0x2009, 0x004a, - 0x00b8, 0x908c, 0xff00, 0x918e, 0x5600, 0x1118, 0x2009, 0x004f, - 0x0078, 0x908c, 0xff00, 0x918e, 0x5700, 0x1118, 0x2009, 0x0050, - 0x0038, 0x2009, 0x001d, 0x6838, 0xd0d4, 0x0110, 0x2009, 0x004c, - 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x268c, - 0x1904, 0x8493, 0x080c, 0x6749, 0x1904, 0x8493, 0xbe12, 0xbd16, - 0x001e, 0x0016, 0x080c, 0x779e, 0x01c0, 0x68dc, 0xd08c, 0x1148, - 0x7000, 0x9084, 0x00ff, 0x1188, 0x7004, 0x9084, 0xff00, 0x1168, - 0x0040, 0x687c, 0x9606, 0x1148, 0x6880, 0x9506, 0x9084, 0xff00, - 0x1120, 0x9584, 0x00ff, 0xb886, 0x0080, 0xb884, 0x9005, 0x1168, - 0x9186, 0x0046, 0x1150, 0x687c, 0x9606, 0x1138, 0x6880, 0x9506, - 0x9084, 0xff00, 0x1110, 0x001e, 0x0098, 0x080c, 0xb116, 0x01a8, - 0x2b08, 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x9186, - 0x004c, 0x1110, 0x6023, 0x000a, 0x0016, 0x001e, 0x080c, 0xb20a, - 0x00ce, 0x00be, 0x0005, 0x001e, 0x0cd8, 0x2001, 0x180e, 0x2004, - 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x4ca1, 0x080c, 0xb1dd, - 0x0d90, 0x2b08, 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, - 0x0016, 0x9186, 0x0017, 0x0118, 0x9186, 0x0030, 0x1128, 0x6007, - 0x0009, 0x6017, 0x2900, 0x0020, 0x6007, 0x0051, 0x6017, 0x0000, - 0x602f, 0x0009, 0x6003, 0x0001, 0x080c, 0x961e, 0x08a0, 0x080c, - 0x88af, 0x1158, 0x080c, 0x344c, 0x1140, 0x7010, 0x9084, 0xff00, - 0x8007, 0x908e, 0x0008, 0x1108, 0x0009, 0x0005, 0x00b6, 0x00c6, - 0x0046, 0x7000, 0x908c, 0xff00, 0x810f, 0x9186, 0x0033, 0x11e8, - 0x080c, 0x8742, 0x0904, 0x851d, 0x7124, 0x610a, 0x7030, 0x908e, - 0x0200, 0x1140, 0x7034, 0x9005, 0x15c0, 0x2009, 0x0015, 0x080c, - 0xb20a, 0x0498, 0x908e, 0x0100, 0x1580, 0x7034, 0x9005, 0x1568, - 0x2009, 0x0016, 0x080c, 0xb20a, 0x0440, 0x9186, 0x0032, 0x1528, - 0x7030, 0x908e, 0x1400, 0x1508, 0x2009, 0x0038, 0x0016, 0x2011, - 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x268c, 0x11a8, 0x080c, - 0x6749, 0x1190, 0xbe12, 0xbd16, 0x080c, 0xb116, 0x0168, 0x2b08, - 0x6112, 0x080c, 0xd3b6, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, - 0x080c, 0xb20a, 0x0010, 0x00ce, 0x001e, 0x004e, 0x00ce, 0x00be, - 0x0005, 0x00b6, 0x0046, 0x00e6, 0x00d6, 0x2028, 0x2130, 0x9696, - 0x00ff, 0x11b8, 0x9592, 0xfffc, 0x02a0, 0x9596, 0xfffd, 0x1120, - 0x2009, 0x007f, 0x0804, 0x857f, 0x9596, 0xfffe, 0x1120, 0x2009, - 0x007e, 0x0804, 0x857f, 0x9596, 0xfffc, 0x1118, 0x2009, 0x0080, - 0x04f0, 0x2011, 0x0000, 0x2019, 0x1837, 0x231c, 0xd3ac, 0x0130, - 0x9026, 0x20a9, 0x0800, 0x2071, 0x1000, 0x0030, 0x2021, 0x0081, - 0x20a9, 0x077f, 0x2071, 0x1081, 0x2e1c, 0x93dd, 0x0000, 0x1140, - 0x82ff, 0x11d0, 0x9496, 0x00ff, 0x01b8, 0x2410, 0xc2fd, 0x00a0, - 0xbf10, 0x2600, 0x9706, 0xb814, 0x1120, 0x9546, 0x1110, 0x2408, - 0x00b0, 0x9745, 0x1148, 0x94c6, 0x007e, 0x0130, 0x94c6, 0x007f, - 0x0118, 0x94c6, 0x0080, 0x1d20, 0x8420, 0x8e70, 0x1f04, 0x8554, - 0x82ff, 0x1118, 0x9085, 0x0001, 0x0018, 0xc2fc, 0x2208, 0x9006, - 0x00de, 0x00ee, 0x004e, 0x00be, 0x0005, 0x2001, 0x1837, 0x200c, - 0x9184, 0x0080, 0x0110, 0xd18c, 0x0138, 0x7000, 0x908c, 0xff00, - 0x810f, 0x9184, 0x000f, 0x001a, 0x7817, 0x0140, 0x0005, 0x85a7, - 0x85a7, 0x85a7, 0x8754, 0x85a7, 0x85aa, 0x85cf, 0x8658, 0x85a7, - 0x85a7, 0x85a7, 0x85a7, 0x85a7, 0x85a7, 0x85a7, 0x85a7, 0x7817, - 0x0140, 0x0005, 0x00b6, 0x7110, 0xd1bc, 0x01e8, 0x7120, 0x2160, - 0x9c8c, 0x0003, 0x11c0, 0x9c8a, 0x1ddc, 0x02a8, 0x6868, 0x9c02, - 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, - 0x1150, 0x700c, 0xb914, 0x9106, 0x1130, 0x7124, 0x610a, 0x2009, - 0x0046, 0x080c, 0xb20a, 0x7817, 0x0140, 0x00be, 0x0005, 0x00b6, - 0x00c6, 0x9484, 0x0fff, 0x0904, 0x8634, 0x7110, 0xd1bc, 0x1904, - 0x8634, 0x7108, 0x700c, 0x2028, 0x918c, 0x00ff, 0x2130, 0x9094, - 0xff00, 0x15c8, 0x81ff, 0x15b8, 0x9080, 0x348e, 0x200d, 0x918c, - 0xff00, 0x810f, 0x2001, 0x0080, 0x9106, 0x0904, 0x8634, 0x9182, - 0x0801, 0x1a04, 0x8634, 0x9190, 0x1000, 0x2204, 0x905d, 0x05e0, - 0xbe12, 0xbd16, 0xb800, 0xd0ec, 0x15b8, 0xba04, 0x9294, 0xff00, - 0x9286, 0x0600, 0x1190, 0x080c, 0xb116, 0x0598, 0x2b08, 0x7028, - 0x604e, 0x702c, 0x6052, 0x6112, 0x6023, 0x0006, 0x7120, 0x610a, - 0x7130, 0x615e, 0x080c, 0xe009, 0x00f8, 0x080c, 0x6c11, 0x1138, - 0xb807, 0x0606, 0x0c40, 0x190c, 0x8521, 0x11b0, 0x0880, 0x080c, - 0xb116, 0x2b08, 0x0188, 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, - 0x9286, 0x0400, 0x1118, 0x6007, 0x0005, 0x0010, 0x6007, 0x0001, - 0x6003, 0x0001, 0x080c, 0x961e, 0x7817, 0x0140, 0x00ce, 0x00be, - 0x0005, 0x2001, 0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, - 0x080c, 0x4ca1, 0x080c, 0xb1dd, 0x0d78, 0x2b08, 0x6112, 0x6023, - 0x0006, 0x7120, 0x610a, 0x7130, 0x615e, 0x6017, 0xf300, 0x6003, - 0x0001, 0x6007, 0x0041, 0x2009, 0xa022, 0x080c, 0x9617, 0x08e0, - 0x00b6, 0x7110, 0xd1bc, 0x05d0, 0x7020, 0x2060, 0x9c84, 0x0003, - 0x15a8, 0x9c82, 0x1ddc, 0x0690, 0x6868, 0x9c02, 0x1678, 0x9484, - 0x0fff, 0x9082, 0x000c, 0x0650, 0x7008, 0x9084, 0x00ff, 0x6110, - 0x2158, 0xb910, 0x9106, 0x1510, 0x700c, 0xb914, 0x9106, 0x11f0, - 0x7124, 0x610a, 0x601c, 0xd0fc, 0x11c8, 0x2001, 0x0271, 0x2004, - 0x9005, 0x1180, 0x9484, 0x0fff, 0x9082, 0x000c, 0x0158, 0x0066, - 0x2031, 0x0100, 0xa001, 0xa001, 0x8631, 0x1de0, 0x006e, 0x601c, - 0xd0fc, 0x1120, 0x2009, 0x0045, 0x080c, 0xb20a, 0x7817, 0x0140, - 0x00be, 0x0005, 0x6120, 0x9186, 0x0002, 0x0128, 0x9186, 0x0005, - 0x0110, 0x9085, 0x0001, 0x0005, 0x080c, 0x88af, 0x1180, 0x080c, - 0x344c, 0x1168, 0x7010, 0x9084, 0xff00, 0x8007, 0x9086, 0x0000, - 0x1130, 0x9184, 0x000f, 0x908a, 0x0006, 0x1208, 0x000b, 0x0005, - 0x86be, 0x86bf, 0x86be, 0x86be, 0x8724, 0x8733, 0x0005, 0x00b6, - 0x700c, 0x7108, 0x080c, 0x268c, 0x1904, 0x8722, 0x080c, 0x6749, - 0x1904, 0x8722, 0xbe12, 0xbd16, 0x7110, 0xd1bc, 0x0540, 0x702c, - 0xd084, 0x1120, 0xb800, 0xd0bc, 0x1904, 0x8722, 0x080c, 0x6c11, - 0x0148, 0x9086, 0x0004, 0x0130, 0x080c, 0x6c19, 0x0118, 0x9086, - 0x0004, 0x1588, 0x00c6, 0x080c, 0x8742, 0x00ce, 0x05d8, 0x080c, - 0xb116, 0x2b08, 0x05b8, 0x6112, 0x080c, 0xd3b6, 0x6023, 0x0002, - 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, 0xb20a, 0x0458, 0x080c, - 0x6c11, 0x0148, 0x9086, 0x0004, 0x0130, 0x080c, 0x6c19, 0x0118, - 0x9086, 0x0004, 0x1180, 0x080c, 0xb116, 0x2b08, 0x01d8, 0x6112, - 0x080c, 0xd3b6, 0x6023, 0x0005, 0x7120, 0x610a, 0x2009, 0x0088, - 0x080c, 0xb20a, 0x0078, 0x080c, 0xb116, 0x2b08, 0x0158, 0x6112, - 0x080c, 0xd3b6, 0x6023, 0x0004, 0x7120, 0x610a, 0x2009, 0x0001, - 0x080c, 0xb20a, 0x00be, 0x0005, 0x7110, 0xd1bc, 0x0158, 0x00d1, - 0x0148, 0x080c, 0x869a, 0x1130, 0x7124, 0x610a, 0x2009, 0x0089, - 0x080c, 0xb20a, 0x0005, 0x7110, 0xd1bc, 0x0158, 0x0059, 0x0148, - 0x080c, 0x869a, 0x1130, 0x7124, 0x610a, 0x2009, 0x008a, 0x080c, - 0xb20a, 0x0005, 0x7020, 0x2060, 0x9c84, 0x0003, 0x1158, 0x9c82, - 0x1ddc, 0x0240, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1218, 0x9085, - 0x0001, 0x0005, 0x9006, 0x0ce8, 0x00b6, 0x7110, 0xd1bc, 0x11d8, - 0x7024, 0x2060, 0x9c84, 0x0003, 0x11b0, 0x9c82, 0x1ddc, 0x0298, - 0x6868, 0x9c02, 0x1280, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, - 0xb910, 0x9106, 0x1140, 0x700c, 0xb914, 0x9106, 0x1120, 0x2009, - 0x0051, 0x080c, 0xb20a, 0x7817, 0x0140, 0x00be, 0x0005, 0x2031, - 0x0105, 0x0069, 0x0005, 0x2031, 0x0206, 0x0049, 0x0005, 0x2031, - 0x0207, 0x0029, 0x0005, 0x2031, 0x0213, 0x0009, 0x0005, 0x00c6, - 0x0096, 0x00f6, 0x7000, 0x9084, 0xf000, 0x9086, 0xc000, 0x05c0, - 0x080c, 0xb116, 0x05a8, 0x0066, 0x00c6, 0x0046, 0x2011, 0x0263, - 0x2204, 0x8211, 0x220c, 0x080c, 0x268c, 0x1590, 0x080c, 0x6749, - 0x1578, 0xbe12, 0xbd16, 0x2b00, 0x004e, 0x00ce, 0x6012, 0x080c, - 0xd3b6, 0x080c, 0x1059, 0x0500, 0x2900, 0x6062, 0x9006, 0xa802, - 0xa866, 0xac6a, 0xa85c, 0x90f8, 0x001b, 0x20a9, 0x000e, 0xa860, - 0x20e8, 0x20e1, 0x0000, 0x2fa0, 0x2e98, 0x4003, 0x006e, 0x6616, - 0x6007, 0x003e, 0x6023, 0x0001, 0x6003, 0x0001, 0x080c, 0x961e, - 0x00fe, 0x009e, 0x00ce, 0x0005, 0x080c, 0xb16c, 0x006e, 0x0cc0, - 0x004e, 0x00ce, 0x0cc8, 0x00c6, 0x7000, 0x908c, 0xff00, 0x9184, - 0xf000, 0x810f, 0x9086, 0x2000, 0x1904, 0x882a, 0x9186, 0x0022, - 0x15f0, 0x2001, 0x0111, 0x2004, 0x9005, 0x1904, 0x882c, 0x7030, - 0x908e, 0x0400, 0x0904, 0x882c, 0x908e, 0x6000, 0x05e8, 0x908e, - 0x5400, 0x05d0, 0x908e, 0x0300, 0x11d8, 0x2009, 0x1837, 0x210c, - 0xd18c, 0x1590, 0xd1a4, 0x1580, 0x080c, 0x6bcf, 0x0588, 0x68b0, - 0x9084, 0x00ff, 0x7100, 0x918c, 0x00ff, 0x9106, 0x1518, 0x6880, - 0x69b0, 0x918c, 0xff00, 0x9105, 0x7104, 0x9106, 0x11d8, 0x00e0, - 0x2009, 0x0103, 0x210c, 0xd1b4, 0x11a8, 0x908e, 0x5200, 0x09e8, - 0x908e, 0x0500, 0x09d0, 0x908e, 0x5000, 0x09b8, 0x0058, 0x9186, - 0x0023, 0x1140, 0x080c, 0x8742, 0x0128, 0x6004, 0x9086, 0x0002, - 0x0118, 0x0000, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ce, 0x0005, - 0x7030, 0x908e, 0x0300, 0x0118, 0x908e, 0x5200, 0x1d98, 0x2001, - 0x1837, 0x2004, 0x9084, 0x0009, 0x9086, 0x0008, 0x0d68, 0x0c50, - 0x0156, 0x0046, 0x0016, 0x0036, 0x7038, 0x2020, 0x8427, 0x94a4, - 0x0007, 0xd484, 0x0148, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, - 0x027a, 0x080c, 0xc20e, 0x1178, 0xd48c, 0x0148, 0x20a9, 0x0004, - 0x2019, 0x1801, 0x2011, 0x027e, 0x080c, 0xc20e, 0x1120, 0xd494, - 0x0110, 0x9085, 0x0001, 0x003e, 0x001e, 0x004e, 0x015e, 0x0005, - 0x0156, 0x0046, 0x0016, 0x0036, 0x7038, 0x2020, 0x8427, 0x94a4, - 0x0007, 0xd484, 0x0148, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, - 0x0272, 0x080c, 0xc20e, 0x1178, 0xd48c, 0x0148, 0x20a9, 0x0004, - 0x2019, 0x1801, 0x2011, 0x0276, 0x080c, 0xc20e, 0x1120, 0xd494, - 0x0110, 0x9085, 0x0001, 0x003e, 0x001e, 0x004e, 0x015e, 0x0005, - 0x00f6, 0x2079, 0x0200, 0x7800, 0xc0e5, 0xc0cc, 0x7802, 0x00fe, - 0x0005, 0x00f6, 0x2079, 0x1800, 0x7834, 0xd084, 0x1130, 0x2079, - 0x0200, 0x7800, 0x9085, 0x1200, 0x7802, 0x00fe, 0x0005, 0x00e6, - 0x2071, 0x1800, 0x7034, 0xc084, 0x7036, 0x00ee, 0x0005, 0x0016, - 0x2001, 0x1837, 0x200c, 0x9184, 0x0080, 0x0118, 0xd18c, 0x0118, - 0x9006, 0x001e, 0x0005, 0x9085, 0x0001, 0x0cd8, 0x2071, 0x1a04, - 0x7003, 0x0003, 0x700f, 0x0361, 0x9006, 0x701a, 0x707a, 0x7012, - 0x7017, 0x1ddc, 0x7007, 0x0000, 0x7026, 0x702b, 0xa2c0, 0x7032, - 0x7037, 0xa33d, 0x7047, 0xffff, 0x704a, 0x704f, 0x56c4, 0x7052, - 0x7063, 0x8a66, 0x080c, 0x1072, 0x090c, 0x0d85, 0x2900, 0x7042, - 0xa867, 0x0003, 0xa86f, 0x0100, 0xa8ab, 0xdcb0, 0x0005, 0x2071, - 0x1a04, 0x1d04, 0x8982, 0x2091, 0x6000, 0x700c, 0x8001, 0x700e, - 0x1590, 0x2001, 0x013c, 0x2004, 0x9005, 0x190c, 0x8b10, 0x2001, - 0x1869, 0x2004, 0xd0c4, 0x0158, 0x3a00, 0xd08c, 0x1140, 0x20d1, - 0x0000, 0x20d1, 0x0001, 0x20d1, 0x0000, 0x080c, 0x0d85, 0x700f, - 0x0361, 0x7007, 0x0001, 0x0126, 0x2091, 0x8000, 0x2069, 0x1800, - 0x69ec, 0xd1e4, 0x1138, 0xd1dc, 0x1118, 0x080c, 0x8ad4, 0x0010, - 0x080c, 0x8aab, 0x7048, 0x900d, 0x0148, 0x8109, 0x714a, 0x1130, - 0x704c, 0x080f, 0x0018, 0x0126, 0x2091, 0x8000, 0x7024, 0x900d, - 0x0188, 0x7020, 0x8001, 0x7022, 0x1168, 0x7023, 0x0009, 0x8109, - 0x7126, 0x9186, 0x03e8, 0x1110, 0x7028, 0x080f, 0x81ff, 0x1110, - 0x7028, 0x080f, 0x7030, 0x900d, 0x0180, 0x702c, 0x8001, 0x702e, - 0x1160, 0x702f, 0x0009, 0x8109, 0x7132, 0x0128, 0x9184, 0x007f, - 0x090c, 0xa3eb, 0x0010, 0x7034, 0x080f, 0x7044, 0x9005, 0x0118, - 0x0310, 0x8001, 0x7046, 0x7054, 0x900d, 0x0168, 0x7050, 0x8001, - 0x7052, 0x1148, 0x7053, 0x0009, 0x8109, 0x7156, 0x1120, 0x7158, - 0x7156, 0x7060, 0x080f, 0x7018, 0x900d, 0x01d8, 0x0016, 0x7078, - 0x900d, 0x0158, 0x7074, 0x8001, 0x7076, 0x1138, 0x7077, 0x0009, - 0x8109, 0x717a, 0x1110, 0x707c, 0x080f, 0x001e, 0x7008, 0x8001, - 0x700a, 0x1138, 0x700b, 0x0009, 0x8109, 0x711a, 0x1110, 0x701c, - 0x080f, 0x012e, 0x7004, 0x0002, 0x89aa, 0x89ab, 0x89d5, 0x00e6, - 0x2071, 0x1a04, 0x7018, 0x9005, 0x1120, 0x711a, 0x721e, 0x700b, - 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x1a04, 0x701c, - 0x9206, 0x1120, 0x701a, 0x701e, 0x707a, 0x707e, 0x000e, 0x00ee, - 0x0005, 0x00e6, 0x2071, 0x1a04, 0xb888, 0x9102, 0x0208, 0xb98a, - 0x00ee, 0x0005, 0x0005, 0x00b6, 0x2031, 0x0010, 0x7110, 0x080c, - 0x67b4, 0x11a8, 0xb888, 0x8001, 0x0290, 0xb88a, 0x1180, 0x0126, - 0x2091, 0x8000, 0x0066, 0xb8d0, 0x9005, 0x0138, 0x0026, 0xba3c, - 0x0016, 0x080c, 0x68df, 0x001e, 0x002e, 0x006e, 0x012e, 0x8108, - 0x9182, 0x0800, 0x1220, 0x8631, 0x0128, 0x7112, 0x0c00, 0x900e, - 0x7007, 0x0002, 0x7112, 0x00be, 0x0005, 0x2031, 0x0010, 0x7014, - 0x2060, 0x0126, 0x2091, 0x8000, 0x6048, 0x9005, 0x0128, 0x8001, - 0x604a, 0x1110, 0x080c, 0xd237, 0x6018, 0x9005, 0x0904, 0x8a2d, - 0x00f6, 0x2079, 0x0300, 0x7918, 0xd1b4, 0x1904, 0x8a40, 0x781b, - 0x2020, 0xa001, 0x7918, 0xd1b4, 0x0120, 0x781b, 0x2000, 0x0804, - 0x8a40, 0x8001, 0x601a, 0x0106, 0x781b, 0x2000, 0xa001, 0x7918, - 0xd1ac, 0x1dd0, 0x010e, 0x00fe, 0x1540, 0x6120, 0x9186, 0x0003, - 0x0148, 0x9186, 0x0006, 0x0130, 0x9186, 0x0009, 0x11e0, 0x611c, - 0xd1c4, 0x1100, 0x080c, 0xcf1b, 0x01b0, 0x6014, 0x2048, 0xa884, - 0x908a, 0x199a, 0x0280, 0x9082, 0x1999, 0xa886, 0x908a, 0x199a, - 0x0210, 0x2001, 0x1999, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, - 0x080c, 0xd671, 0x0110, 0x080c, 0xcbd9, 0x012e, 0x9c88, 0x001c, - 0x7116, 0x2001, 0x181a, 0x2004, 0x9102, 0x1228, 0x8631, 0x0138, - 0x2160, 0x0804, 0x89d9, 0x7017, 0x1ddc, 0x7007, 0x0000, 0x0005, - 0x00fe, 0x0c58, 0x00e6, 0x2071, 0x1a04, 0x7027, 0x07d0, 0x7023, - 0x0009, 0x00ee, 0x0005, 0x2001, 0x1a0d, 0x2003, 0x0000, 0x0005, - 0x00e6, 0x2071, 0x1a04, 0x7132, 0x702f, 0x0009, 0x00ee, 0x0005, - 0x2011, 0x1a10, 0x2013, 0x0000, 0x0005, 0x00e6, 0x2071, 0x1a04, - 0x711a, 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x0086, 0x0026, - 0x705c, 0x8000, 0x705e, 0x2001, 0x1a14, 0x2044, 0xa06c, 0x9086, - 0x0000, 0x0150, 0x7070, 0xa09a, 0x706c, 0xa096, 0x7068, 0xa092, - 0x7064, 0xa08e, 0x080c, 0x114e, 0x002e, 0x008e, 0x0005, 0x0006, - 0x0016, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, - 0x0156, 0x080c, 0x88e7, 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, - 0x00be, 0x00ae, 0x009e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, - 0x1a04, 0x717a, 0x727e, 0x7077, 0x0009, 0x00ee, 0x0005, 0x00e6, - 0x0006, 0x2071, 0x1a04, 0x707c, 0x9206, 0x1110, 0x707a, 0x707e, - 0x000e, 0x00ee, 0x0005, 0x2069, 0x1800, 0x69ec, 0xd1e4, 0x1518, - 0x0026, 0xd1ec, 0x0140, 0x6a54, 0x6874, 0x9202, 0x0288, 0x8117, - 0x9294, 0x00c1, 0x0088, 0x9184, 0x0007, 0x01a0, 0x8109, 0x9184, - 0x0007, 0x0110, 0x69ee, 0x0070, 0x8107, 0x9084, 0x0007, 0x910d, - 0x8107, 0x9106, 0x9094, 0x00c1, 0x9184, 0xff3e, 0x9205, 0x68ee, - 0x080c, 0x0f24, 0x002e, 0x0005, 0x69e8, 0x9184, 0x003f, 0x05b8, - 0x8109, 0x9184, 0x003f, 0x01a8, 0x6a54, 0x6874, 0x9202, 0x0220, - 0xd1bc, 0x0168, 0xc1bc, 0x0018, 0xd1bc, 0x1148, 0xc1bd, 0x2110, - 0x00e6, 0x2071, 0x1800, 0x080c, 0x0f46, 0x00ee, 0x0400, 0x69ea, - 0x00f0, 0x0026, 0x8107, 0x9094, 0x0007, 0x0128, 0x8001, 0x8007, - 0x9085, 0x0007, 0x0050, 0x2010, 0x8004, 0x8004, 0x8004, 0x9084, - 0x0007, 0x9205, 0x8007, 0x9085, 0x0028, 0x9086, 0x0040, 0x2010, - 0x00e6, 0x2071, 0x1800, 0x080c, 0x0f46, 0x00ee, 0x002e, 0x0005, - 0x0016, 0x00c6, 0x2009, 0xfff4, 0x210d, 0x2061, 0x0100, 0x60f0, - 0x9100, 0x60f3, 0x0000, 0x2009, 0xfff4, 0x200f, 0x1220, 0x8108, - 0x2105, 0x8000, 0x200f, 0x00ce, 0x001e, 0x0005, 0x00c6, 0x2061, - 0x1a73, 0x00ce, 0x0005, 0x9184, 0x000f, 0x8003, 0x8003, 0x8003, - 0x9080, 0x1a73, 0x2060, 0x0005, 0xa884, 0x908a, 0x199a, 0x1638, - 0x9005, 0x1150, 0x00c6, 0x2061, 0x1a73, 0x6014, 0x00ce, 0x9005, - 0x1130, 0x2001, 0x001e, 0x0018, 0x908e, 0xffff, 0x01b0, 0x8003, - 0x800b, 0x810b, 0x9108, 0x611a, 0xa87c, 0x908c, 0x00c0, 0x918e, - 0x00c0, 0x0904, 0x8bee, 0xd0b4, 0x1168, 0xd0bc, 0x1904, 0x8bc7, - 0x2009, 0x0006, 0x080c, 0x8c1b, 0x0005, 0x900e, 0x0c60, 0x2001, - 0x1999, 0x08b0, 0xd0fc, 0x05e0, 0x908c, 0x2023, 0x1568, 0x87ff, - 0x1558, 0xa9a8, 0x81ff, 0x1540, 0x6124, 0x918c, 0x0500, 0x1520, - 0x6100, 0x918e, 0x0007, 0x1500, 0x2009, 0x1869, 0x210c, 0xd184, - 0x11d8, 0x6003, 0x0003, 0x6007, 0x0043, 0x6047, 0xb035, 0x080c, - 0x1c6f, 0xa87c, 0xc0dd, 0xa87e, 0x600f, 0x0000, 0x00f6, 0x2079, - 0x0380, 0x7818, 0xd0bc, 0x1de8, 0x7833, 0x0013, 0x2c00, 0x7836, - 0x781b, 0x8080, 0x00fe, 0x0005, 0x908c, 0x0003, 0x0120, 0x918e, - 0x0003, 0x1904, 0x8c15, 0x908c, 0x2020, 0x918e, 0x2020, 0x01a8, - 0x6024, 0xd0d4, 0x11e8, 0x2009, 0x1869, 0x2104, 0xd084, 0x1138, - 0x87ff, 0x1120, 0x2009, 0x0043, 0x0804, 0xb20a, 0x0005, 0x87ff, - 0x1de8, 0x2009, 0x0042, 0x0804, 0xb20a, 0x6110, 0x00b6, 0x2158, - 0xb900, 0x00be, 0xd1ac, 0x0d20, 0x6024, 0xc0cd, 0x6026, 0x0c00, - 0xc0d4, 0x6026, 0xa890, 0x602e, 0xa88c, 0x6032, 0x08e0, 0xd0fc, - 0x0160, 0x908c, 0x0003, 0x0120, 0x918e, 0x0003, 0x1904, 0x8c15, - 0x908c, 0x2020, 0x918e, 0x2020, 0x0170, 0x0076, 0x00f6, 0x2c78, - 0x080c, 0x17ad, 0x00fe, 0x007e, 0x87ff, 0x1120, 0x2009, 0x0042, - 0x080c, 0xb20a, 0x0005, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, - 0xd1ac, 0x0d58, 0x6124, 0xc1cd, 0x6126, 0x0c38, 0xd0fc, 0x0188, - 0x908c, 0x2020, 0x918e, 0x2020, 0x01a8, 0x9084, 0x0003, 0x908e, - 0x0002, 0x0148, 0x87ff, 0x1120, 0x2009, 0x0041, 0x080c, 0xb20a, - 0x0005, 0x00b9, 0x0ce8, 0x87ff, 0x1dd8, 0x2009, 0x0043, 0x080c, - 0xb20a, 0x0cb0, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, - 0x0d20, 0x6124, 0xc1cd, 0x6126, 0x0c00, 0x2009, 0x0004, 0x0019, - 0x0005, 0x2009, 0x0001, 0x0096, 0x080c, 0xcf1b, 0x0518, 0x6014, - 0x2048, 0xa982, 0xa800, 0x6016, 0x9186, 0x0001, 0x1188, 0xa97c, - 0x918c, 0x8100, 0x918e, 0x8100, 0x1158, 0x00c6, 0x2061, 0x1a73, - 0x6200, 0xd28c, 0x1120, 0x6204, 0x8210, 0x0208, 0x6206, 0x00ce, - 0x080c, 0x6e4c, 0x6014, 0x904d, 0x0076, 0x2039, 0x0000, 0x190c, - 0x8b34, 0x007e, 0x009e, 0x0005, 0x0156, 0x00c6, 0x2061, 0x1a73, - 0x6000, 0x81ff, 0x0110, 0x9205, 0x0008, 0x9204, 0x6002, 0x00ce, - 0x015e, 0x0005, 0x6800, 0xd08c, 0x1138, 0x6808, 0x9005, 0x0120, - 0x8001, 0x680a, 0x9085, 0x0001, 0x0005, 0x2071, 0x1924, 0x7003, - 0x0006, 0x7007, 0x0000, 0x700f, 0x0000, 0x7013, 0x0001, 0x080c, - 0x1072, 0x090c, 0x0d85, 0xa867, 0x0006, 0xa86b, 0x0001, 0xa8ab, - 0xdcb0, 0xa89f, 0x0000, 0x2900, 0x702e, 0x7033, 0x0000, 0x0005, - 0x0126, 0x2091, 0x8000, 0x0096, 0x00e6, 0x2071, 0x1924, 0x702c, - 0x2048, 0x6a2c, 0x721e, 0x6b30, 0x7322, 0x6834, 0x7026, 0xa896, - 0x6838, 0x702a, 0xa89a, 0x6824, 0x7016, 0x683c, 0x701a, 0x2009, - 0x0028, 0x200a, 0x9005, 0x0148, 0x900e, 0x9188, 0x000c, 0x8001, - 0x1de0, 0x2100, 0x9210, 0x1208, 0x8318, 0xaa8e, 0xab92, 0x7010, - 0xd084, 0x0168, 0xc084, 0x7007, 0x0001, 0x700f, 0x0000, 0x0006, - 0x2009, 0x1b73, 0x2104, 0x9082, 0x0007, 0x200a, 0x000e, 0xc095, - 0x7012, 0x2008, 0x2001, 0x003b, 0x080c, 0x16b9, 0x9006, 0x2071, - 0x193d, 0x7002, 0x7006, 0x702a, 0x00ee, 0x009e, 0x012e, 0x0005, - 0x2009, 0x1b73, 0x2104, 0x9080, 0x0007, 0x200a, 0x0005, 0x00e6, - 0x0126, 0x0156, 0x2091, 0x8000, 0x2071, 0x1800, 0x7154, 0x2001, - 0x0008, 0x910a, 0x0638, 0x2001, 0x187d, 0x20ac, 0x9006, 0x9080, - 0x0008, 0x1f04, 0x8cd7, 0x71c0, 0x9102, 0x02e0, 0x2071, 0x1877, - 0x20a9, 0x0007, 0x00c6, 0x080c, 0xb116, 0x6023, 0x0009, 0x6003, - 0x0004, 0x601f, 0x0101, 0x0089, 0x0126, 0x2091, 0x8000, 0x080c, - 0x8e58, 0x012e, 0x1f04, 0x8ce3, 0x9006, 0x00ce, 0x015e, 0x012e, - 0x00ee, 0x0005, 0x9085, 0x0001, 0x0cc8, 0x00e6, 0x00b6, 0x0096, - 0x0086, 0x0056, 0x0046, 0x0026, 0x7118, 0x720c, 0x7620, 0x7004, - 0xd084, 0x1128, 0x2021, 0x0024, 0x2029, 0x0002, 0x0020, 0x2021, - 0x002c, 0x2029, 0x000a, 0x080c, 0x1059, 0x090c, 0x0d85, 0x2900, - 0x6016, 0x2058, 0xac66, 0x9006, 0xa802, 0xa806, 0xa86a, 0xa87a, - 0xa8aa, 0xa887, 0x0005, 0xa87f, 0x0020, 0x7008, 0xa89a, 0x7010, - 0xa89e, 0xae8a, 0xa8af, 0xffff, 0xa8b3, 0x0000, 0x8109, 0x0160, - 0x080c, 0x1059, 0x090c, 0x0d85, 0xad66, 0x2b00, 0xa802, 0x2900, - 0xb806, 0x2058, 0x8109, 0x1da0, 0x002e, 0x004e, 0x005e, 0x008e, - 0x009e, 0x00be, 0x00ee, 0x0005, 0x2079, 0x0000, 0x2071, 0x1924, - 0x7004, 0x004b, 0x700c, 0x0002, 0x8d4f, 0x8d48, 0x8d48, 0x0005, - 0x8d59, 0x8daf, 0x8daf, 0x8daf, 0x8db0, 0x8dc1, 0x8dc1, 0x700c, - 0x0cba, 0x0126, 0x2091, 0x8000, 0x78a0, 0x79a0, 0x9106, 0x1904, - 0x8da1, 0x7814, 0xd0bc, 0x1904, 0x8daa, 0x012e, 0x7018, 0x910a, - 0x1128, 0x7030, 0x9005, 0x1904, 0x8df3, 0x0005, 0x1210, 0x7114, - 0x910a, 0x9192, 0x000a, 0x0210, 0x2009, 0x000a, 0x2001, 0x1888, - 0x2014, 0x2001, 0x1936, 0x2004, 0x9100, 0x9202, 0x0e50, 0x080c, - 0x8f53, 0x2200, 0x9102, 0x0208, 0x2208, 0x0096, 0x702c, 0x2048, - 0xa873, 0x0001, 0xa976, 0x080c, 0x905c, 0x2100, 0xa87e, 0xa86f, - 0x0000, 0x009e, 0x0126, 0x2091, 0x8000, 0x2009, 0x1a24, 0x2104, - 0xc085, 0x200a, 0x700f, 0x0002, 0x012e, 0x080c, 0x116d, 0x1de8, - 0x0005, 0x78a0, 0x79a0, 0x9106, 0x0904, 0x8d61, 0x080c, 0x8f2b, - 0x012e, 0x0005, 0x7810, 0xc0c5, 0x7812, 0x0804, 0x8d61, 0x0005, - 0x700c, 0x0002, 0x8db5, 0x8db8, 0x8db7, 0x080c, 0x8d57, 0x0005, - 0x8001, 0x700e, 0x0096, 0x702c, 0x2048, 0xa974, 0x009e, 0x0011, - 0x0ca0, 0x0005, 0x0096, 0x702c, 0x2048, 0x7018, 0x9100, 0x7214, - 0x921a, 0x1130, 0x701c, 0xa88e, 0x7020, 0xa892, 0x9006, 0x0068, - 0x0006, 0x080c, 0x905c, 0x2100, 0xaa8c, 0x9210, 0xaa8e, 0x1220, - 0xa890, 0x9081, 0x0000, 0xa892, 0x000e, 0x009e, 0x0126, 0x2091, - 0x8000, 0x78a2, 0x701a, 0x080c, 0x8f2b, 0x012e, 0x0005, 0x00e6, - 0x2071, 0x1924, 0x700c, 0x0002, 0x8df1, 0x8df1, 0x8def, 0x700f, - 0x0001, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x7030, 0x9005, - 0x0508, 0x2078, 0x7814, 0x2048, 0xae88, 0x00b6, 0x2059, 0x0000, - 0x080c, 0x8e61, 0x00be, 0x01b0, 0x00e6, 0x2071, 0x193d, 0x080c, - 0x8ea8, 0x00ee, 0x0178, 0x0096, 0x080c, 0x1072, 0x2900, 0x009e, - 0x0148, 0xa8aa, 0x04d1, 0x0041, 0x2001, 0x1947, 0x2003, 0x0000, - 0x012e, 0x08c8, 0x012e, 0x0005, 0x00d6, 0x00c6, 0x0086, 0x00a6, - 0x2940, 0x2650, 0x2600, 0x9005, 0x0180, 0xa864, 0x9084, 0x000f, - 0x2068, 0x9d88, 0x1ec1, 0x2165, 0x0056, 0x2029, 0x0000, 0x080c, - 0x8fe1, 0x080c, 0x1e97, 0x1dd8, 0x005e, 0x00ae, 0x2001, 0x187f, - 0x2004, 0xa88a, 0x00c6, 0x2f60, 0x080c, 0x17ad, 0x00ce, 0x781f, - 0x0101, 0x7813, 0x0000, 0x0126, 0x2091, 0x8000, 0x080c, 0x8eb7, - 0x012e, 0x008e, 0x00ce, 0x00de, 0x0005, 0x7030, 0x9005, 0x0138, - 0x2078, 0x780c, 0x7032, 0x2001, 0x1947, 0x2003, 0x0001, 0x0005, - 0x00e6, 0x2071, 0x1924, 0x7030, 0x600e, 0x2c00, 0x7032, 0x00ee, - 0x0005, 0x00d6, 0x00c6, 0x0026, 0x9b80, 0x912a, 0x2005, 0x906d, - 0x090c, 0x0d85, 0x9b80, 0x9122, 0x2005, 0x9065, 0x090c, 0x0d85, - 0x6114, 0x2600, 0x9102, 0x0248, 0x6828, 0x9102, 0x02f0, 0x9085, - 0x0001, 0x002e, 0x00ce, 0x00de, 0x0005, 0x6804, 0xd094, 0x0148, - 0x6854, 0xd084, 0x1178, 0xc085, 0x6856, 0x2011, 0x8026, 0x080c, - 0x4ca1, 0x684c, 0x0096, 0x904d, 0x090c, 0x0d85, 0xa804, 0x8000, - 0xa806, 0x009e, 0x9006, 0x2030, 0x0c20, 0x6854, 0xd08c, 0x1d08, - 0xc08d, 0x6856, 0x2011, 0x8025, 0x080c, 0x4ca1, 0x684c, 0x0096, - 0x904d, 0x090c, 0x0d85, 0xa800, 0x8000, 0xa802, 0x009e, 0x0888, - 0x7000, 0x2019, 0x0008, 0x8319, 0x7104, 0x9102, 0x1118, 0x2300, - 0x9005, 0x0020, 0x0210, 0x9302, 0x0008, 0x8002, 0x0005, 0x00d6, - 0x7814, 0x9005, 0x090c, 0x0d85, 0x781c, 0x9084, 0x0101, 0x9086, - 0x0101, 0x190c, 0x0d85, 0x7827, 0x0000, 0x2069, 0x193d, 0x6804, - 0x9080, 0x193f, 0x2f08, 0x2102, 0x6904, 0x8108, 0x9182, 0x0008, - 0x0208, 0x900e, 0x6906, 0x9180, 0x193f, 0x2003, 0x0000, 0x00de, - 0x0005, 0x0096, 0x00c6, 0x2060, 0x6014, 0x2048, 0xa8a8, 0x0096, - 0x2048, 0x9005, 0x190c, 0x108b, 0x009e, 0xa8ab, 0x0000, 0x080c, - 0x100b, 0x080c, 0xb16c, 0x00ce, 0x009e, 0x0005, 0x6020, 0x9086, - 0x0009, 0x1128, 0x601c, 0xd0c4, 0x0110, 0x9006, 0x0005, 0x9085, - 0x0001, 0x0005, 0x6000, 0x9086, 0x0000, 0x0178, 0x6010, 0x9005, - 0x0150, 0x00b6, 0x2058, 0x080c, 0x925e, 0x00be, 0x6013, 0x0000, - 0x601b, 0x0000, 0x0010, 0x2c00, 0x0861, 0x0005, 0x2009, 0x1928, - 0x210c, 0xd194, 0x0005, 0x2009, 0x1928, 0x210c, 0xd1c4, 0x0005, - 0x0126, 0x2091, 0x8000, 0x00e6, 0x2071, 0x1924, 0x7110, 0xc194, - 0xc185, 0x7007, 0x0000, 0x7112, 0x2001, 0x003b, 0x080c, 0x16b9, - 0x00ee, 0x012e, 0x0005, 0x7814, 0xd0bc, 0x1108, 0x0005, 0x7810, - 0xc0c5, 0x7812, 0x0cc0, 0x0096, 0x00d6, 0x9006, 0x7006, 0x700e, - 0x701a, 0x701e, 0x7022, 0x7016, 0x702a, 0x7026, 0x702f, 0x0000, - 0x080c, 0x90aa, 0x0170, 0x080c, 0x90df, 0x0158, 0x2900, 0x7002, - 0x700a, 0x701a, 0x7013, 0x0001, 0x701f, 0x000a, 0x00de, 0x009e, - 0x0005, 0x900e, 0x0cd8, 0x00e6, 0x0096, 0x0086, 0x00d6, 0x00c6, - 0x2071, 0x1931, 0x721c, 0x2100, 0x9202, 0x1618, 0x080c, 0x90df, - 0x090c, 0x0d85, 0x7018, 0x9005, 0x1160, 0x2900, 0x7002, 0x700a, - 0x701a, 0x9006, 0x7006, 0x700e, 0xa806, 0xa802, 0x7012, 0x701e, - 0x0038, 0x2040, 0xa806, 0x2900, 0xa002, 0x701a, 0xa803, 0x0000, - 0x7010, 0x8000, 0x7012, 0x701c, 0x9080, 0x000a, 0x701e, 0x721c, - 0x08d0, 0x721c, 0x00ce, 0x00de, 0x008e, 0x009e, 0x00ee, 0x0005, - 0x0096, 0x0156, 0x0136, 0x0146, 0x00e6, 0x0126, 0x2091, 0x8000, - 0x2071, 0x1931, 0x7300, 0x831f, 0x831e, 0x831e, 0x9384, 0x003f, - 0x20e8, 0x939c, 0xffc0, 0x9398, 0x0003, 0x7104, 0x080c, 0x905c, - 0x810c, 0x2100, 0x9318, 0x8003, 0x2228, 0x2021, 0x0078, 0x9402, - 0x9532, 0x0208, 0x2028, 0x2500, 0x8004, 0x20a8, 0x23a0, 0xa001, - 0xa001, 0x4005, 0x2508, 0x080c, 0x9065, 0x2130, 0x7014, 0x9600, - 0x7016, 0x2600, 0x711c, 0x9102, 0x701e, 0x7004, 0x9600, 0x2008, - 0x9082, 0x000a, 0x1190, 0x7000, 0x2048, 0xa800, 0x9005, 0x1148, - 0x2009, 0x0001, 0x0026, 0x080c, 0x8f53, 0x002e, 0x7000, 0x2048, - 0xa800, 0x7002, 0x7007, 0x0000, 0x0008, 0x7106, 0x2500, 0x9212, - 0x1904, 0x8f92, 0x012e, 0x00ee, 0x014e, 0x013e, 0x015e, 0x009e, - 0x0005, 0x0016, 0x0026, 0x00e6, 0x0126, 0x2091, 0x8000, 0x9580, - 0x9122, 0x2005, 0x9075, 0x090c, 0x0d85, 0x080c, 0x9037, 0x012e, - 0x9580, 0x911e, 0x2005, 0x9075, 0x090c, 0x0d85, 0x0156, 0x0136, - 0x01c6, 0x0146, 0x01d6, 0x831f, 0x831e, 0x831e, 0x9384, 0x003f, - 0x20e0, 0x9384, 0xffc0, 0x9100, 0x2098, 0xa860, 0x20e8, 0xa95c, - 0x2c05, 0x9100, 0x20a0, 0x20a9, 0x0002, 0x4003, 0x2e0c, 0x2d00, - 0x0002, 0x9021, 0x9021, 0x9023, 0x9021, 0x9023, 0x9021, 0x9021, - 0x9021, 0x9021, 0x9021, 0x9029, 0x9021, 0x9029, 0x9021, 0x9021, - 0x9021, 0x080c, 0x0d85, 0x4104, 0x20a9, 0x0002, 0x4002, 0x4003, - 0x0028, 0x20a9, 0x0002, 0x4003, 0x4104, 0x4003, 0x01de, 0x014e, - 0x01ce, 0x013e, 0x015e, 0x00ee, 0x002e, 0x001e, 0x0005, 0x0096, - 0x7014, 0x8001, 0x7016, 0x710c, 0x2110, 0x00f1, 0x810c, 0x9188, - 0x0003, 0x7308, 0x8210, 0x9282, 0x000a, 0x1198, 0x7008, 0x2048, - 0xa800, 0x9005, 0x0158, 0x0006, 0x080c, 0x90ee, 0x009e, 0xa807, - 0x0000, 0x2900, 0x700a, 0x7010, 0x8001, 0x7012, 0x700f, 0x0000, - 0x0008, 0x720e, 0x009e, 0x0005, 0x0006, 0x810b, 0x810b, 0x2100, - 0x810b, 0x9100, 0x2008, 0x000e, 0x0005, 0x0006, 0x0026, 0x2100, - 0x9005, 0x0158, 0x9092, 0x000c, 0x0240, 0x900e, 0x8108, 0x9082, - 0x000c, 0x1de0, 0x002e, 0x000e, 0x0005, 0x900e, 0x0cd8, 0x2d00, - 0x90b8, 0x0008, 0x2031, 0x90a8, 0x901e, 0x6808, 0x9005, 0x0108, - 0x8318, 0x690c, 0x910a, 0x0248, 0x0140, 0x8318, 0x6810, 0x9112, - 0x0220, 0x0118, 0x8318, 0x2208, 0x0cd0, 0x233a, 0x6804, 0xd084, - 0x2300, 0x2021, 0x0001, 0x1150, 0x9082, 0x0003, 0x0967, 0x0a67, - 0x8420, 0x9082, 0x0007, 0x0967, 0x0a67, 0x0cd0, 0x9082, 0x0002, - 0x0967, 0x0a67, 0x8420, 0x9082, 0x0005, 0x0967, 0x0a67, 0x0cd0, - 0x6c1a, 0x0005, 0x0096, 0x0046, 0x0126, 0x2091, 0x8000, 0x2b00, - 0x9080, 0x9126, 0x2005, 0x9005, 0x090c, 0x0d85, 0x2004, 0x90a0, - 0x000a, 0x080c, 0x1072, 0x01d0, 0x2900, 0x7026, 0xa803, 0x0000, - 0xa807, 0x0000, 0x080c, 0x1072, 0x0188, 0x7024, 0xa802, 0xa807, - 0x0000, 0x2900, 0x7026, 0x94a2, 0x000a, 0x0110, 0x0208, 0x0c90, - 0x9085, 0x0001, 0x012e, 0x004e, 0x009e, 0x0005, 0x7024, 0x9005, - 0x0dc8, 0x2048, 0xac00, 0x080c, 0x108b, 0x2400, 0x0cc0, 0x0126, - 0x2091, 0x8000, 0x7024, 0x2048, 0x9005, 0x0130, 0xa800, 0x7026, - 0xa803, 0x0000, 0xa807, 0x0000, 0x012e, 0x0005, 0x0126, 0x2091, - 0x8000, 0x7024, 0xa802, 0x2900, 0x7026, 0x012e, 0x0005, 0x0096, - 0x9e80, 0x0009, 0x2004, 0x9005, 0x0138, 0x2048, 0xa800, 0x0006, - 0x080c, 0x108b, 0x000e, 0x0cb8, 0x009e, 0x0005, 0x0096, 0x7008, - 0x9005, 0x0138, 0x2048, 0xa800, 0x0006, 0x080c, 0x108b, 0x000e, - 0x0cb8, 0x9006, 0x7002, 0x700a, 0x7006, 0x700e, 0x701a, 0x701e, - 0x7022, 0x702a, 0x7026, 0x702e, 0x009e, 0x0005, 0x1a71, 0x0000, - 0x0000, 0x0000, 0x1931, 0x0000, 0x0000, 0x0000, 0x1888, 0x0000, - 0x0000, 0x0000, 0x1877, 0x0000, 0x0000, 0x0000, 0x00e6, 0x00c6, - 0x00b6, 0x00a6, 0xa8a8, 0x2040, 0x2071, 0x1877, 0x080c, 0x924a, - 0xa067, 0x0023, 0x6010, 0x905d, 0x0904, 0x921f, 0xb814, 0xa06e, - 0xb910, 0xa172, 0xb9a0, 0xa176, 0x2001, 0x0003, 0xa07e, 0xa834, - 0xa082, 0xa07b, 0x0000, 0xa898, 0x9005, 0x0118, 0xa078, 0xc085, - 0xa07a, 0x2858, 0x2031, 0x0018, 0xa068, 0x908a, 0x0019, 0x1a0c, - 0x0d85, 0x2020, 0x2050, 0x2940, 0xa864, 0x90bc, 0x00ff, 0x908c, - 0x000f, 0x91e0, 0x1ec1, 0x2c65, 0x9786, 0x0024, 0x2c05, 0x1590, - 0x908a, 0x0036, 0x1a0c, 0x0d85, 0x9082, 0x001b, 0x0002, 0x918a, - 0x918a, 0x918c, 0x918a, 0x918a, 0x918a, 0x918e, 0x918a, 0x918a, - 0x918a, 0x9190, 0x918a, 0x918a, 0x918a, 0x9192, 0x918a, 0x918a, - 0x918a, 0x9194, 0x918a, 0x918a, 0x918a, 0x9196, 0x918a, 0x918a, - 0x918a, 0x9198, 0x080c, 0x0d85, 0xa180, 0x04b8, 0xa190, 0x04a8, - 0xa1a0, 0x0498, 0xa1b0, 0x0488, 0xa1c0, 0x0478, 0xa1d0, 0x0468, - 0xa1e0, 0x0458, 0x908a, 0x0034, 0x1a0c, 0x0d85, 0x9082, 0x001b, - 0x0002, 0x91bc, 0x91ba, 0x91ba, 0x91ba, 0x91ba, 0x91ba, 0x91be, - 0x91ba, 0x91ba, 0x91ba, 0x91ba, 0x91ba, 0x91c0, 0x91ba, 0x91ba, - 0x91ba, 0x91ba, 0x91ba, 0x91c2, 0x91ba, 0x91ba, 0x91ba, 0x91ba, - 0x91ba, 0x91c4, 0x080c, 0x0d85, 0xa180, 0x0038, 0xa198, 0x0028, - 0xa1b0, 0x0018, 0xa1c8, 0x0008, 0xa1e0, 0x2600, 0x0002, 0x91e0, - 0x91e2, 0x91e4, 0x91e6, 0x91e8, 0x91ea, 0x91ec, 0x91ee, 0x91f0, - 0x91f2, 0x91f4, 0x91f6, 0x91f8, 0x91fa, 0x91fc, 0x91fe, 0x9200, - 0x9202, 0x9204, 0x9206, 0x9208, 0x920a, 0x920c, 0x920e, 0x9210, - 0x080c, 0x0d85, 0xb9e2, 0x0468, 0xb9de, 0x0458, 0xb9da, 0x0448, - 0xb9d6, 0x0438, 0xb9d2, 0x0428, 0xb9ce, 0x0418, 0xb9ca, 0x0408, - 0xb9c6, 0x00f8, 0xb9c2, 0x00e8, 0xb9be, 0x00d8, 0xb9ba, 0x00c8, - 0xb9b6, 0x00b8, 0xb9b2, 0x00a8, 0xb9ae, 0x0098, 0xb9aa, 0x0088, - 0xb9a6, 0x0078, 0xb9a2, 0x0068, 0xb99e, 0x0058, 0xb99a, 0x0048, - 0xb996, 0x0038, 0xb992, 0x0028, 0xb98e, 0x0018, 0xb98a, 0x0008, - 0xb986, 0x8631, 0x8421, 0x0130, 0x080c, 0x1e97, 0x090c, 0x0d85, - 0x0804, 0x9164, 0x00ae, 0x00be, 0x00ce, 0x00ee, 0x0005, 0xa86c, - 0xa06e, 0xa870, 0xa072, 0xa077, 0x00ff, 0x9006, 0x0804, 0x9146, - 0x0006, 0x0016, 0x00b6, 0x6010, 0x2058, 0xb810, 0x9005, 0x01b0, - 0x2001, 0x1925, 0x2004, 0x9005, 0x0188, 0x2001, 0x1800, 0x2004, - 0x9086, 0x0003, 0x1158, 0x0036, 0x0046, 0xbba0, 0x2021, 0x0004, - 0x2011, 0x8014, 0x080c, 0x4ca1, 0x004e, 0x003e, 0x00be, 0x001e, - 0x000e, 0x0005, 0x9016, 0x710c, 0xa834, 0x910a, 0xa936, 0x7008, - 0x9005, 0x0120, 0x8210, 0x910a, 0x0230, 0x0128, 0x7010, 0x8210, - 0x910a, 0x0208, 0x1de0, 0xaa8a, 0xa26a, 0x0005, 0x00f6, 0x00d6, - 0x0036, 0x2079, 0x0300, 0x781b, 0x0200, 0x7818, 0xd094, 0x1dd8, - 0x781b, 0x0202, 0xa001, 0xa001, 0x7818, 0xd094, 0x1da0, 0xb8ac, - 0x906d, 0x0198, 0x2079, 0x0000, 0x9c1e, 0x1118, 0x680c, 0xb8ae, - 0x0050, 0x9c06, 0x0130, 0x2d78, 0x680c, 0x906d, 0x1dd0, 0x080c, - 0x0d85, 0x6b0c, 0x7b0e, 0x600f, 0x0000, 0x2079, 0x0300, 0x781b, - 0x0200, 0x003e, 0x00de, 0x00fe, 0x0005, 0x00e6, 0x00d6, 0x0096, - 0x00c6, 0x0036, 0x0126, 0x2091, 0x8000, 0x0156, 0x20a9, 0x01ff, - 0x2071, 0x0300, 0x701b, 0x0200, 0x7018, 0xd094, 0x0110, 0x1f04, - 0x929a, 0x701b, 0x0202, 0xa001, 0xa001, 0x7018, 0xd094, 0x1d90, - 0xb8ac, 0x9065, 0x01f0, 0x600c, 0xb8ae, 0x6024, 0xc08d, 0x6026, - 0x6003, 0x0004, 0x601b, 0x0000, 0x6013, 0x0000, 0x601f, 0x0101, - 0x6014, 0x904d, 0x090c, 0x0d85, 0xa88b, 0x0000, 0xa8a8, 0xa8ab, - 0x0000, 0x904d, 0x090c, 0x0d85, 0x080c, 0x108b, 0x080c, 0x8e58, - 0x08f8, 0x2071, 0x0300, 0x701b, 0x0200, 0x015e, 0x012e, 0x003e, - 0x00ce, 0x009e, 0x00de, 0x00ee, 0x0005, 0x00c6, 0x00b6, 0x0016, - 0x0006, 0x0156, 0x080c, 0x268c, 0x015e, 0x11b0, 0x080c, 0x6749, - 0x190c, 0x0d85, 0x000e, 0x001e, 0xb912, 0xb816, 0x080c, 0xb116, - 0x0140, 0x2b00, 0x6012, 0x6023, 0x0001, 0x2009, 0x0001, 0x080c, - 0xb20a, 0x00be, 0x00ce, 0x0005, 0x000e, 0x001e, 0x0cd0, 0x0066, - 0x6000, 0x90b2, 0x0010, 0x1a0c, 0x0d85, 0x0013, 0x006e, 0x0005, - 0x9310, 0x9310, 0x9310, 0x9312, 0x935b, 0x9310, 0x9310, 0x9310, - 0x93d5, 0x9310, 0x940d, 0x9310, 0x9310, 0x9310, 0x9310, 0x9310, - 0x080c, 0x0d85, 0x9182, 0x0040, 0x0002, 0x9325, 0x9325, 0x9325, - 0x9325, 0x9325, 0x9325, 0x9325, 0x9325, 0x9325, 0x9327, 0x9338, - 0x9325, 0x9325, 0x9325, 0x9325, 0x9349, 0x080c, 0x0d85, 0x0096, - 0x6114, 0x2148, 0xa87b, 0x0000, 0x6010, 0x00b6, 0x2058, 0xb8bb, - 0x0500, 0x00be, 0x080c, 0x6e11, 0x080c, 0xb16c, 0x009e, 0x0005, - 0x080c, 0x9a48, 0x00d6, 0x6114, 0x080c, 0xcf1b, 0x0130, 0x0096, - 0x6114, 0x2148, 0x080c, 0x7012, 0x009e, 0x00de, 0x080c, 0xb16c, - 0x0005, 0x080c, 0x9a48, 0x080c, 0x3315, 0x6114, 0x0096, 0x2148, - 0x080c, 0xcf1b, 0x0120, 0xa87b, 0x0029, 0x080c, 0x7012, 0x009e, - 0x080c, 0xb16c, 0x0005, 0x601b, 0x0000, 0x9182, 0x0040, 0x0096, - 0x0002, 0x9376, 0x9376, 0x9376, 0x9376, 0x9376, 0x9376, 0x9376, - 0x9376, 0x9378, 0x9376, 0x9376, 0x9376, 0x93d1, 0x9376, 0x9376, - 0x9376, 0x9376, 0x9376, 0x9376, 0x937f, 0x9376, 0x080c, 0x0d85, - 0x6114, 0x2148, 0xa938, 0x918e, 0xffff, 0x0904, 0x93d1, 0x6024, - 0xd08c, 0x15d8, 0x080c, 0x8f0e, 0x05e0, 0x00e6, 0x6114, 0x2148, - 0x080c, 0x912e, 0x0096, 0xa8a8, 0x2048, 0x080c, 0x6da9, 0x009e, - 0xa8ab, 0x0000, 0x6010, 0x9005, 0x0128, 0x00b6, 0x2058, 0x080c, - 0x925e, 0x00be, 0xae88, 0x00b6, 0x2059, 0x0000, 0x080c, 0x8e61, - 0x00be, 0x01e0, 0x2071, 0x193d, 0x080c, 0x8ea8, 0x01b8, 0x9086, - 0x0001, 0x1128, 0x2001, 0x1947, 0x2004, 0x9005, 0x1178, 0x0096, - 0x080c, 0x1059, 0x2900, 0x009e, 0x0148, 0xa8aa, 0x00f6, 0x2c78, - 0x080c, 0x8e1c, 0x00fe, 0x00ee, 0x009e, 0x0005, 0x080c, 0x8e58, - 0x0cd0, 0x080c, 0x8f13, 0x1160, 0x6010, 0x9005, 0x0130, 0x2058, - 0xb8ac, 0x9005, 0x190c, 0x0d85, 0x6012, 0x2c00, 0x080c, 0x8ed9, - 0x0005, 0x080c, 0x9489, 0x009e, 0x0005, 0x9182, 0x0040, 0x0096, - 0x0002, 0x93e9, 0x93e9, 0x93e9, 0x93eb, 0x93e9, 0x93e9, 0x93e9, - 0x940b, 0x93e9, 0x93e9, 0x93e9, 0x93e9, 0x93e9, 0x93e9, 0x93e9, - 0x93e9, 0x080c, 0x0d85, 0x6003, 0x0003, 0x6106, 0x6014, 0x2048, - 0xa8ac, 0xa836, 0xa8b0, 0xa83a, 0xa847, 0x0000, 0xa84b, 0x0000, - 0xa884, 0x9092, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x8013, - 0x8213, 0x9210, 0x621a, 0x080c, 0x1c26, 0x2009, 0x8030, 0x080c, - 0x965e, 0x009e, 0x0005, 0x080c, 0x0d85, 0x080c, 0x9a48, 0x6114, - 0x2148, 0xa87b, 0x0000, 0x6010, 0x00b6, 0x2058, 0xb8bb, 0x0500, - 0x00be, 0x080c, 0x7012, 0x080c, 0xb16c, 0x009e, 0x0005, 0x080c, - 0xacfc, 0x6144, 0xd1fc, 0x0120, 0xd1ac, 0x1110, 0x6003, 0x0003, - 0x6000, 0x908a, 0x0010, 0x1a0c, 0x0d85, 0x0096, 0x0023, 0x009e, - 0x080c, 0xad18, 0x0005, 0x9443, 0x9443, 0x9443, 0x9445, 0x9456, - 0x9443, 0x9443, 0x9443, 0x9443, 0x9443, 0x9443, 0x9443, 0x9443, - 0x9443, 0x9443, 0x9443, 0x080c, 0x0d85, 0x080c, 0xaee3, 0x6114, - 0x2148, 0xa87b, 0x0006, 0x6010, 0x00b6, 0x2058, 0xb8bb, 0x0500, - 0x00be, 0x080c, 0x7012, 0x080c, 0xb16c, 0x0005, 0x0491, 0x0005, - 0x080c, 0xacfc, 0x6000, 0x6144, 0xd1fc, 0x0130, 0xd1ac, 0x1120, - 0x6003, 0x0003, 0x2009, 0x0003, 0x908a, 0x0010, 0x1a0c, 0x0d85, - 0x0096, 0x0033, 0x009e, 0x0106, 0x080c, 0xad18, 0x010e, 0x0005, - 0x9480, 0x9480, 0x9480, 0x9482, 0x9489, 0x9480, 0x9480, 0x9480, - 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, - 0x080c, 0x0d85, 0x0036, 0x00e6, 0x080c, 0xaee3, 0x00ee, 0x003e, - 0x0005, 0x6024, 0xd08c, 0x11f0, 0x00f6, 0x00e6, 0x601b, 0x0000, - 0x6014, 0x2048, 0x6010, 0x9005, 0x0128, 0x00b6, 0x2058, 0x080c, - 0x925e, 0x00be, 0x2071, 0x193d, 0x080c, 0x8ea8, 0x0160, 0x2001, - 0x187f, 0x2004, 0xa88a, 0x2031, 0x0000, 0x2c78, 0x080c, 0x8e1c, - 0x00ee, 0x00fe, 0x0005, 0x0096, 0xa88b, 0x0000, 0xa8a8, 0x2048, - 0x080c, 0x108b, 0x009e, 0xa8ab, 0x0000, 0x080c, 0x8e58, 0x0c80, - 0x2001, 0x1925, 0x200c, 0x918e, 0x0000, 0x190c, 0x8f0e, 0x05c8, - 0x00e6, 0x2071, 0x1924, 0x7110, 0xc1c5, 0x7112, 0x080c, 0x8f18, - 0x00f6, 0x00c6, 0x2071, 0x1000, 0x00b6, 0x2e04, 0x905d, 0x0138, - 0xb8ac, 0x9065, 0x0120, 0x080c, 0x8eee, 0x090c, 0x928d, 0x8e70, - 0x9e86, 0x1800, 0x1d90, 0x00be, 0x00d6, 0x0096, 0x0046, 0x2061, - 0x1ddc, 0x2001, 0x181a, 0x2024, 0x6020, 0x9086, 0x0000, 0x1191, - 0x9ce0, 0x001c, 0x2400, 0x9c06, 0x1db8, 0x004e, 0x009e, 0x00de, - 0x00d1, 0x00ce, 0x00fe, 0x2071, 0x1924, 0x7110, 0xc1c4, 0x7112, - 0x00ee, 0x0005, 0x6020, 0x9086, 0x0009, 0x1160, 0x6100, 0x9186, - 0x0004, 0x1138, 0x6110, 0x81ff, 0x190c, 0x0d85, 0x2c00, 0x080c, - 0x8ed9, 0x9006, 0x0005, 0x2071, 0x193f, 0x2073, 0x0000, 0x8e70, - 0x9e86, 0x1947, 0x1dd0, 0x2071, 0x193d, 0x7006, 0x7002, 0x2001, - 0x1930, 0x2064, 0x8cff, 0x0130, 0x6120, 0x918e, 0x0000, 0x190c, - 0x0d85, 0x2102, 0x2001, 0x188a, 0x200c, 0x81ff, 0x0148, 0x0096, - 0x2148, 0x080c, 0x108b, 0x009e, 0x2001, 0x188a, 0x2003, 0x0000, - 0x2071, 0x1931, 0x080c, 0x90f7, 0x0804, 0x9106, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x187a, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0126, 0x2091, - 0x8000, 0x0036, 0x0046, 0x20a9, 0x0010, 0x9006, 0x8004, 0x8086, - 0x818e, 0x1208, 0x9200, 0x1f04, 0x954f, 0x8086, 0x818e, 0x004e, - 0x003e, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x0076, 0x0156, - 0x20a9, 0x0010, 0x9005, 0x01c8, 0x911a, 0x12b8, 0x8213, 0x818d, - 0x0228, 0x911a, 0x1220, 0x1f04, 0x9566, 0x0028, 0x911a, 0x2308, - 0x8210, 0x1f04, 0x9566, 0x0006, 0x3200, 0x9084, 0xefff, 0x2080, - 0x000e, 0x015e, 0x007e, 0x012e, 0x0005, 0x0006, 0x3200, 0x9085, - 0x1000, 0x0ca8, 0x0126, 0x2091, 0x2800, 0x2079, 0x19e8, 0x012e, - 0x00d6, 0x2069, 0x19e8, 0x6803, 0x0005, 0x0156, 0x0146, 0x01d6, - 0x20e9, 0x0000, 0x2069, 0x0200, 0x080c, 0xaaf1, 0x04c9, 0x080c, - 0xaadc, 0x04b1, 0x080c, 0xaadf, 0x0499, 0x080c, 0xaae2, 0x0481, - 0x080c, 0xaae5, 0x0469, 0x080c, 0xaae8, 0x0451, 0x080c, 0xaaeb, - 0x0439, 0x080c, 0xaaee, 0x0421, 0x01de, 0x014e, 0x015e, 0x6857, - 0x0000, 0x00f6, 0x2079, 0x0380, 0x0419, 0x7807, 0x0003, 0x7803, - 0x0000, 0x7803, 0x0001, 0x2069, 0x0004, 0x2d04, 0x9084, 0xfffe, - 0x9085, 0x8000, 0x206a, 0x2069, 0x0100, 0x6828, 0x9084, 0xfffc, - 0x682a, 0x00fe, 0x2001, 0x1b5d, 0x2003, 0x0000, 0x00de, 0x0005, - 0x20a9, 0x0020, 0x20a1, 0x0240, 0x2001, 0x0000, 0x4004, 0x0005, - 0x00c6, 0x7803, 0x0000, 0x9006, 0x7827, 0x0030, 0x782b, 0x0400, - 0x7827, 0x0031, 0x782b, 0x1af6, 0x781f, 0xff00, 0x781b, 0xff00, - 0x2061, 0x1aeb, 0x602f, 0x19e8, 0x6033, 0x1800, 0x6037, 0x1a04, - 0x603b, 0x1ec1, 0x603f, 0x1ed1, 0x6042, 0x6047, 0x1ac1, 0x00ce, - 0x0005, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, 0x0001, - 0x01b0, 0x00c6, 0x6146, 0x600f, 0x0000, 0x2c08, 0x2061, 0x19e8, - 0x602c, 0x8000, 0x602e, 0x601c, 0x9005, 0x0130, 0x9080, 0x0003, - 0x2102, 0x611e, 0x00ce, 0x0005, 0x6122, 0x611e, 0x0cd8, 0x6146, - 0x2c08, 0x2001, 0x0012, 0x080c, 0xaced, 0x0005, 0x0016, 0x2009, - 0x8020, 0x6146, 0x2c08, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, - 0x9086, 0x0001, 0x1128, 0x2001, 0x0019, 0x080c, 0xaced, 0x0088, - 0x00c6, 0x2061, 0x19e8, 0x602c, 0x8000, 0x602e, 0x600c, 0x9005, - 0x0128, 0x9080, 0x0003, 0x2102, 0x610e, 0x0010, 0x6112, 0x610e, - 0x00ce, 0x001e, 0x0005, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, - 0x9086, 0x0001, 0x0198, 0x00c6, 0x6146, 0x600f, 0x0000, 0x2c08, - 0x2061, 0x19e8, 0x6044, 0x9005, 0x0130, 0x9080, 0x0003, 0x2102, - 0x6146, 0x00ce, 0x0005, 0x614a, 0x6146, 0x0cd8, 0x6146, 0x600f, - 0x0000, 0x2c08, 0x2001, 0x0013, 0x080c, 0xaced, 0x0005, 0x6044, - 0xd0dc, 0x0110, 0x080c, 0xa78a, 0x0005, 0x00f6, 0x00e6, 0x00d6, - 0x00c6, 0x00b6, 0x0096, 0x0076, 0x0066, 0x0056, 0x0036, 0x0026, - 0x0016, 0x0006, 0x0126, 0x902e, 0x2071, 0x19e8, 0x7648, 0x2660, - 0x2678, 0x2091, 0x8000, 0x8cff, 0x0904, 0x96f1, 0x9c86, 0x1b55, - 0x0904, 0x96ec, 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, 0x96ec, - 0x87ff, 0x0120, 0x605c, 0x9106, 0x1904, 0x96ec, 0x704c, 0x9c06, - 0x1188, 0x0036, 0x2019, 0x0001, 0x080c, 0xa596, 0x703f, 0x0000, - 0x9006, 0x704e, 0x706a, 0x7052, 0x706e, 0x080c, 0xaff4, 0x003e, - 0x2029, 0x0001, 0x080c, 0x9667, 0x7048, 0x9c36, 0x1110, 0x660c, - 0x764a, 0x7044, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, - 0x7046, 0x0010, 0x7047, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, - 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0xcf1b, - 0x01f0, 0x6014, 0x2048, 0x6020, 0x9086, 0x0003, 0x1588, 0x6004, - 0x9086, 0x0040, 0x090c, 0xa78a, 0xa867, 0x0103, 0xab7a, 0xa877, - 0x0000, 0x0016, 0x0036, 0x0076, 0x080c, 0xd220, 0x080c, 0xeddf, - 0x080c, 0x7012, 0x007e, 0x003e, 0x001e, 0x080c, 0xd10c, 0x080c, - 0xb1a7, 0x00ce, 0x0804, 0x9683, 0x2c78, 0x600c, 0x2060, 0x0804, - 0x9683, 0x012e, 0x000e, 0x001e, 0x002e, 0x003e, 0x005e, 0x006e, - 0x007e, 0x009e, 0x00be, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, - 0x6020, 0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0076, 0x080c, - 0xeddf, 0x080c, 0xea30, 0x007e, 0x003e, 0x001e, 0x08c0, 0x6020, - 0x9086, 0x0009, 0x1168, 0xa87b, 0x0006, 0x0016, 0x0036, 0x0076, - 0x080c, 0x7012, 0x080c, 0xb16c, 0x007e, 0x003e, 0x001e, 0x0848, - 0x6020, 0x9086, 0x000a, 0x0904, 0x96d6, 0x0804, 0x96cf, 0x0006, - 0x0066, 0x0096, 0x00c6, 0x00d6, 0x00f6, 0x9036, 0x0126, 0x2091, - 0x8000, 0x2079, 0x19e8, 0x7848, 0x9065, 0x0904, 0x9790, 0x600c, - 0x0006, 0x600f, 0x0000, 0x784c, 0x9c06, 0x11b0, 0x0036, 0x2019, - 0x0001, 0x080c, 0xa596, 0x783f, 0x0000, 0x901e, 0x7b4e, 0x7b6a, - 0x7b52, 0x7b6e, 0x080c, 0xaff4, 0x003e, 0x000e, 0x9005, 0x1118, - 0x600c, 0x600f, 0x0000, 0x0006, 0x9c86, 0x1b55, 0x05b0, 0x00e6, - 0x2f70, 0x080c, 0x9667, 0x00ee, 0x080c, 0xcf1b, 0x0548, 0x6014, - 0x2048, 0x6020, 0x9086, 0x0003, 0x15a8, 0x3e08, 0x918e, 0x0002, - 0x1188, 0x6010, 0x9005, 0x0170, 0x00b6, 0x2058, 0xb800, 0x00be, - 0xd0bc, 0x0140, 0x6048, 0x9005, 0x11c0, 0x2001, 0x1988, 0x2004, - 0x604a, 0x0098, 0x6004, 0x9086, 0x0040, 0x090c, 0xa78a, 0xa867, - 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x7006, 0x080c, 0xd10c, - 0x6044, 0xc0fc, 0x6046, 0x080c, 0xb1a7, 0x000e, 0x0804, 0x9734, - 0x7e4a, 0x7e46, 0x012e, 0x00fe, 0x00de, 0x00ce, 0x009e, 0x006e, - 0x000e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1118, 0x080c, 0xea30, - 0x0c38, 0x6020, 0x9086, 0x0009, 0x1130, 0xab7a, 0x080c, 0x7012, - 0x080c, 0xb16c, 0x0c10, 0x6020, 0x9086, 0x000a, 0x0990, 0x0850, - 0x0016, 0x0026, 0x0086, 0x9046, 0x00a9, 0x080c, 0x98a3, 0x008e, - 0x002e, 0x001e, 0x0005, 0x00f6, 0x0126, 0x2079, 0x19e8, 0x2091, - 0x8000, 0x080c, 0x98ec, 0x080c, 0x9982, 0x080c, 0x6948, 0x012e, - 0x00fe, 0x0005, 0x00b6, 0x0096, 0x00f6, 0x00e6, 0x00d6, 0x00c6, - 0x0066, 0x0016, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e8, - 0x7620, 0x2660, 0x2678, 0x8cff, 0x0904, 0x9868, 0x6010, 0x2058, - 0xb8a0, 0x9206, 0x1904, 0x9863, 0x88ff, 0x0120, 0x605c, 0x9106, - 0x1904, 0x9863, 0x7030, 0x9c06, 0x1580, 0x2069, 0x0100, 0x6820, - 0xd0a4, 0x0110, 0xd0cc, 0x1508, 0x080c, 0x8a4b, 0x080c, 0xa2a0, - 0x68c3, 0x0000, 0x080c, 0xa78a, 0x7033, 0x0000, 0x0036, 0x2069, - 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, - 0x2a99, 0x9006, 0x080c, 0x2a99, 0x2069, 0x0100, 0x6824, 0xd084, - 0x0110, 0x6827, 0x0001, 0x003e, 0x0040, 0x7008, 0xc0ad, 0x700a, - 0x6003, 0x0009, 0x630a, 0x0804, 0x9863, 0x7020, 0x9c36, 0x1110, - 0x660c, 0x7622, 0x701c, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, - 0x2f00, 0x701e, 0x0010, 0x701f, 0x0000, 0x660c, 0x0066, 0x2c00, - 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x6044, - 0xc0fc, 0x6046, 0x6014, 0x2048, 0x080c, 0xcf1b, 0x01e8, 0x6020, - 0x9086, 0x0003, 0x1580, 0x080c, 0xd132, 0x1118, 0x080c, 0xbb5c, - 0x0098, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, 0x0036, - 0x0086, 0x080c, 0xd220, 0x080c, 0xeddf, 0x080c, 0x7012, 0x008e, - 0x003e, 0x001e, 0x080c, 0xd10c, 0x080c, 0xb1a7, 0x080c, 0xa65d, - 0x00ce, 0x0804, 0x97db, 0x2c78, 0x600c, 0x2060, 0x0804, 0x97db, - 0x012e, 0x000e, 0x001e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, - 0x009e, 0x00be, 0x0005, 0x6020, 0x9086, 0x0006, 0x1158, 0x0016, - 0x0036, 0x0086, 0x080c, 0xeddf, 0x080c, 0xea30, 0x008e, 0x003e, - 0x001e, 0x08d0, 0x080c, 0xbb5c, 0x6020, 0x9086, 0x0002, 0x1160, - 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0904, 0x9849, 0x9086, - 0x008b, 0x0904, 0x9849, 0x0840, 0x6020, 0x9086, 0x0005, 0x1920, - 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x09c8, 0x9086, 0x008b, - 0x09b0, 0x0804, 0x985c, 0x0006, 0x00f6, 0x00e6, 0x0096, 0x00b6, - 0x00c6, 0x0066, 0x0016, 0x0126, 0x2091, 0x8000, 0x9280, 0x1000, - 0x2004, 0x905d, 0x2079, 0x19e8, 0x9036, 0x7828, 0x2060, 0x8cff, - 0x0538, 0x6010, 0x9b06, 0x1500, 0x6043, 0xffff, 0x080c, 0xaf2e, - 0x01d8, 0x610c, 0x0016, 0x080c, 0xa420, 0x6014, 0x2048, 0xa867, - 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, 0x0036, 0x0086, 0x080c, - 0xd220, 0x080c, 0xeddf, 0x080c, 0x7012, 0x008e, 0x003e, 0x001e, - 0x080c, 0xb1a7, 0x00ce, 0x08d8, 0x2c30, 0x600c, 0x2060, 0x08b8, - 0x080c, 0x6965, 0x012e, 0x001e, 0x006e, 0x00ce, 0x00be, 0x009e, - 0x00ee, 0x00fe, 0x000e, 0x0005, 0x0096, 0x0006, 0x0066, 0x00c6, - 0x00d6, 0x9036, 0x7820, 0x9065, 0x0904, 0x9955, 0x600c, 0x0006, - 0x6044, 0xc0fc, 0x6046, 0x600f, 0x0000, 0x7830, 0x9c06, 0x1598, - 0x2069, 0x0100, 0x6820, 0xd0a4, 0x0110, 0xd0cc, 0x1508, 0x080c, - 0x8a4b, 0x080c, 0xa2a0, 0x68c3, 0x0000, 0x080c, 0xa78a, 0x7833, - 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, - 0x2001, 0x0100, 0x080c, 0x2a99, 0x9006, 0x080c, 0x2a99, 0x2069, - 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0058, - 0x080c, 0x6ba9, 0x1538, 0x6003, 0x0009, 0x630a, 0x7808, 0xc0ad, - 0x780a, 0x2c30, 0x00f8, 0x6014, 0x2048, 0x080c, 0xcf19, 0x01b0, - 0x6020, 0x9086, 0x0003, 0x1508, 0x080c, 0xd132, 0x1118, 0x080c, - 0xbb5c, 0x0060, 0x080c, 0x6ba9, 0x1168, 0xa867, 0x0103, 0xab7a, - 0xa877, 0x0000, 0x080c, 0x7012, 0x080c, 0xd10c, 0x080c, 0xb1a7, - 0x080c, 0xa65d, 0x000e, 0x0804, 0x98f3, 0x7e22, 0x7e1e, 0x00de, - 0x00ce, 0x006e, 0x000e, 0x009e, 0x0005, 0x6020, 0x9086, 0x0006, - 0x1118, 0x080c, 0xea30, 0x0c50, 0x080c, 0xbb5c, 0x6020, 0x9086, - 0x0002, 0x1150, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0990, - 0x9086, 0x008b, 0x0978, 0x08d0, 0x6020, 0x9086, 0x0005, 0x19b0, - 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0d18, 0x9086, 0x008b, - 0x0d00, 0x0860, 0x0006, 0x0096, 0x00b6, 0x00c6, 0x0066, 0x9036, - 0x7828, 0x9065, 0x0510, 0x6010, 0x2058, 0x600c, 0x0006, 0x3e08, - 0x918e, 0x0002, 0x1118, 0xb800, 0xd0bc, 0x11a8, 0x6043, 0xffff, - 0x080c, 0xaf2e, 0x0180, 0x610c, 0x080c, 0xa420, 0x6014, 0x2048, - 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x7012, 0x080c, - 0xb1a7, 0x000e, 0x08f0, 0x2c30, 0x0ce0, 0x006e, 0x00ce, 0x00be, - 0x009e, 0x000e, 0x0005, 0x00e6, 0x00d6, 0x0096, 0x0066, 0x080c, - 0x62af, 0x11b0, 0x2071, 0x19e8, 0x7030, 0x9080, 0x0005, 0x2004, - 0x904d, 0x0170, 0xa878, 0x9606, 0x1158, 0x2071, 0x19e8, 0x7030, - 0x9035, 0x0130, 0x9080, 0x0005, 0x2004, 0x9906, 0x1108, 0x0029, - 0x006e, 0x009e, 0x00de, 0x00ee, 0x0005, 0x00c6, 0x2660, 0x6043, - 0xffff, 0x080c, 0xaf2e, 0x0178, 0x080c, 0xa420, 0x6014, 0x2048, - 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xd220, 0x080c, - 0x7012, 0x080c, 0xb1a7, 0x00ce, 0x0005, 0x00b6, 0x00e6, 0x00c6, - 0x080c, 0xacfc, 0x0106, 0x2071, 0x0101, 0x2e04, 0xc0c4, 0x2072, - 0x6044, 0xd0fc, 0x1138, 0x010e, 0x090c, 0xad18, 0x00ce, 0x00ee, - 0x00be, 0x0005, 0x2071, 0x19e8, 0x7030, 0x9005, 0x0da0, 0x9c06, - 0x190c, 0x0d85, 0x7036, 0x080c, 0x8a4b, 0x7004, 0x9084, 0x0007, - 0x0002, 0x9a1b, 0x9a1d, 0x9a24, 0x9a2e, 0x9a3c, 0x9a1b, 0x9a29, - 0x9a19, 0x080c, 0x0d85, 0x0428, 0x0005, 0x080c, 0xaf19, 0x7007, - 0x0000, 0x7033, 0x0000, 0x00e8, 0x0066, 0x9036, 0x080c, 0xa420, - 0x006e, 0x7007, 0x0000, 0x7033, 0x0000, 0x0098, 0x080c, 0xaf04, - 0x0140, 0x080c, 0xaf19, 0x0128, 0x0066, 0x9036, 0x080c, 0xa420, - 0x006e, 0x7033, 0x0000, 0x0028, 0x080c, 0xaf04, 0x080c, 0xa78a, - 0x0000, 0x010e, 0x090c, 0xad18, 0x00ce, 0x00ee, 0x00be, 0x0005, - 0x00d6, 0x00c6, 0x080c, 0xacfc, 0x0106, 0x6044, 0xd0fc, 0x1130, - 0x010e, 0x090c, 0xad18, 0x00ce, 0x00de, 0x0005, 0x2069, 0x19e8, - 0x684c, 0x9005, 0x0da8, 0x9c06, 0x190c, 0x0d85, 0x6852, 0x00e6, - 0x2d70, 0x080c, 0x9667, 0x00ee, 0x080c, 0x8a58, 0x0016, 0x2009, - 0x0040, 0x080c, 0x2220, 0x001e, 0x683c, 0x9084, 0x0003, 0x0002, - 0x9a76, 0x9a77, 0x9a96, 0x9a74, 0x080c, 0x0d85, 0x0490, 0x6868, - 0x9086, 0x0001, 0x0198, 0x600c, 0x9015, 0x0168, 0x6a4a, 0x600f, - 0x0000, 0x6044, 0x9084, 0x7f7f, 0x6046, 0x9006, 0x6842, 0x684e, - 0x683f, 0x0000, 0x00f0, 0x684a, 0x6846, 0x0c98, 0x686b, 0x0000, - 0x6848, 0x9065, 0x0d70, 0x6003, 0x0002, 0x0c58, 0x6044, 0x9084, - 0x7f7f, 0x6046, 0x9006, 0x6842, 0x684e, 0x686a, 0x6852, 0x686e, - 0x600c, 0x9015, 0x0120, 0x6a4a, 0x600f, 0x0000, 0x0010, 0x684a, - 0x6846, 0x080c, 0xaff4, 0x684f, 0x0000, 0x010e, 0x090c, 0xad18, - 0x00ce, 0x00de, 0x0005, 0x0005, 0x6020, 0x9084, 0x000f, 0x000b, - 0x0005, 0x9ac9, 0x9acc, 0x9f80, 0xa019, 0x9acc, 0x9f80, 0xa019, - 0x9ac9, 0x9acc, 0x9ac9, 0x9ac9, 0x9ac9, 0x9ac9, 0x9ac9, 0x9ac9, - 0x9ac9, 0x080c, 0x99ed, 0x0005, 0x00b6, 0x0156, 0x0136, 0x0146, - 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, - 0x2071, 0x0240, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0d85, 0x6110, - 0x2158, 0xb984, 0x2c78, 0x2061, 0x0100, 0x619a, 0x908a, 0x0040, - 0x1a04, 0x9b38, 0x005b, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, - 0x01ce, 0x014e, 0x013e, 0x015e, 0x00be, 0x0005, 0x9ce1, 0x9d1c, - 0x9d45, 0x9e0f, 0x9e31, 0x9e37, 0x9e44, 0x9e4c, 0x9e58, 0x9e5e, - 0x9e6f, 0x9e5e, 0x9ec7, 0x9e4c, 0x9ed3, 0x9ed9, 0x9e58, 0x9ed9, - 0x9ee5, 0x9b36, 0x9b36, 0x9b36, 0x9b36, 0x9b36, 0x9b36, 0x9b36, - 0x9b36, 0x9b36, 0x9b36, 0x9b36, 0xa441, 0xa464, 0xa475, 0xa495, - 0xa4c7, 0x9e44, 0x9b36, 0x9e44, 0x9e5e, 0x9b36, 0x9d45, 0x9e0f, - 0x9b36, 0xa888, 0x9e5e, 0x9b36, 0xa8a4, 0x9e5e, 0x9b36, 0x9e58, - 0x9cdb, 0x9b59, 0x9b36, 0xa8c0, 0xa92d, 0xaa11, 0x9b36, 0xaa1e, - 0x9e41, 0xaa49, 0x9b36, 0xa4d1, 0xaa55, 0x9b36, 0x080c, 0x0d85, - 0x2100, 0x005b, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, - 0x014e, 0x013e, 0x015e, 0x00be, 0x0005, 0xaaf5, 0xaba7, 0x9b57, - 0x9b91, 0x9c3d, 0x9c48, 0x9b57, 0x9e44, 0x9b57, 0x9ca2, 0x9cae, - 0x9bac, 0x9b57, 0x9bc7, 0x9bfb, 0xb008, 0xb04d, 0x9e5e, 0x080c, - 0x0d85, 0x00d6, 0x0096, 0x080c, 0x9ef8, 0x0026, 0x0036, 0x7814, - 0x2048, 0xa958, 0xd1cc, 0x1138, 0x2009, 0x2414, 0x2011, 0x0018, - 0x2019, 0x0018, 0x0030, 0x2009, 0x2410, 0x2011, 0x0014, 0x2019, - 0x0014, 0x7102, 0x7206, 0x700b, 0x0800, 0xa83c, 0x700e, 0xa850, - 0x7022, 0xa854, 0x7026, 0x63c2, 0x080c, 0xa270, 0x003e, 0x002e, - 0x009e, 0x00de, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb8a0, 0x00be, - 0x080c, 0xb094, 0x1118, 0x9084, 0xff80, 0x0110, 0x9085, 0x0001, - 0x0005, 0x00d6, 0x0096, 0x080c, 0x9ef8, 0x7003, 0x0500, 0x7814, - 0x2048, 0xa874, 0x700a, 0xa878, 0x700e, 0xa87c, 0x7012, 0xa880, - 0x7016, 0xa884, 0x701a, 0xa888, 0x701e, 0x60c3, 0x0010, 0x080c, - 0xa270, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x080c, 0x9ef8, - 0x7003, 0x0500, 0x7814, 0x2048, 0xa8cc, 0x700a, 0xa8d0, 0x700e, - 0xa8d4, 0x7012, 0xa8d8, 0x7016, 0xa8dc, 0x701a, 0xa8e0, 0x701e, - 0x60c3, 0x0010, 0x080c, 0xa270, 0x009e, 0x00de, 0x0005, 0x00d6, - 0x0096, 0x0126, 0x2091, 0x8000, 0x080c, 0x9ef8, 0x20e9, 0x0000, - 0x2001, 0x19a4, 0x2003, 0x0000, 0x7814, 0x2048, 0xa814, 0x8003, - 0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, - 0x2098, 0x2001, 0x19a4, 0x0016, 0x200c, 0x2001, 0x0001, 0x080c, - 0x2205, 0x080c, 0xdcef, 0x9006, 0x080c, 0x2205, 0x001e, 0xa804, - 0x9005, 0x0110, 0x2048, 0x0c28, 0x04d9, 0x080c, 0xa270, 0x012e, - 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x0126, 0x2091, 0x8000, - 0x080c, 0x9f43, 0x20e9, 0x0000, 0x2001, 0x19a4, 0x2003, 0x0000, - 0x7814, 0x2048, 0xa86f, 0x0200, 0xa873, 0x0000, 0xa814, 0x8003, - 0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, - 0x2098, 0x2001, 0x19a4, 0x0016, 0x200c, 0x080c, 0xdcef, 0x001e, - 0xa804, 0x9005, 0x0110, 0x2048, 0x0c60, 0x0051, 0x7814, 0x2048, - 0x080c, 0x100b, 0x080c, 0xa270, 0x012e, 0x009e, 0x00de, 0x0005, - 0x60c0, 0x8004, 0x9084, 0x0003, 0x9005, 0x0130, 0x9082, 0x0004, - 0x20a3, 0x0000, 0x8000, 0x1de0, 0x0005, 0x080c, 0x9ef8, 0x7003, - 0x7800, 0x7808, 0x8007, 0x700a, 0x60c3, 0x0008, 0x0804, 0xa270, - 0x00d6, 0x00e6, 0x080c, 0x9f43, 0x7814, 0x9084, 0xff00, 0x2073, - 0x0200, 0x8e70, 0x8e70, 0x9096, 0xdf00, 0x0138, 0x9096, 0xe000, - 0x0120, 0x2073, 0x0010, 0x8e70, 0x0030, 0x9095, 0x0010, 0x2272, - 0x8e70, 0x2073, 0x0034, 0x8e70, 0x2069, 0x1805, 0x20a9, 0x0004, - 0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x9c68, 0x2069, 0x1801, 0x20a9, - 0x0004, 0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x9c71, 0x9096, 0xdf00, - 0x0130, 0x9096, 0xe000, 0x0118, 0x60c3, 0x0018, 0x00f0, 0x2069, - 0x19b4, 0x9086, 0xdf00, 0x0110, 0x2069, 0x19ce, 0x20a9, 0x001a, - 0x9e86, 0x0260, 0x1148, 0x00c6, 0x2061, 0x0200, 0x6010, 0x8000, - 0x6012, 0x00ce, 0x2071, 0x0240, 0x2d04, 0x8007, 0x2072, 0x8d68, - 0x8e70, 0x1f04, 0x9c88, 0x60c3, 0x004c, 0x080c, 0xa270, 0x00ee, - 0x00de, 0x0005, 0x080c, 0x9ef8, 0x7003, 0x6300, 0x7007, 0x0028, - 0x7808, 0x700e, 0x60c3, 0x0008, 0x0804, 0xa270, 0x00d6, 0x0026, - 0x0016, 0x080c, 0x9f43, 0x7003, 0x0200, 0x7814, 0x700e, 0x00e6, - 0x9ef0, 0x0004, 0x2009, 0x0001, 0x2011, 0x000c, 0x2069, 0x1924, - 0x6810, 0xd084, 0x1148, 0x2073, 0x0500, 0x8e70, 0x2073, 0x0000, - 0x8e70, 0x8108, 0x9290, 0x0004, 0x2073, 0x0800, 0x8e70, 0x2073, - 0x0000, 0x00ee, 0x7206, 0x710a, 0x62c2, 0x080c, 0xa270, 0x001e, - 0x002e, 0x00de, 0x0005, 0x2001, 0x1818, 0x2004, 0x609a, 0x0804, - 0xa270, 0x080c, 0x9ef8, 0x7003, 0x5200, 0x2069, 0x1847, 0x6804, - 0xd084, 0x0130, 0x6828, 0x0016, 0x080c, 0x26bf, 0x710e, 0x001e, - 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, - 0x20a1, 0x0250, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1, - 0x0254, 0x4003, 0x080c, 0xb094, 0x1120, 0xb8a0, 0x9082, 0x007f, - 0x0248, 0x2001, 0x181f, 0x2004, 0x7032, 0x2001, 0x1820, 0x2004, - 0x7036, 0x0030, 0x2001, 0x1818, 0x2004, 0x9084, 0x00ff, 0x7036, - 0x60c3, 0x001c, 0x0804, 0xa270, 0x080c, 0x9ef8, 0x7003, 0x0500, - 0x080c, 0xb094, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, - 0x181f, 0x2004, 0x700a, 0x2001, 0x1820, 0x2004, 0x700e, 0x0030, - 0x2001, 0x1818, 0x2004, 0x9084, 0x00ff, 0x700e, 0x20a9, 0x0004, - 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0250, - 0x4003, 0x60c3, 0x0010, 0x0804, 0xa270, 0x080c, 0x9ef8, 0x9006, - 0x080c, 0x6bdb, 0xb8a0, 0x9086, 0x007e, 0x1170, 0x2011, 0x0240, - 0x2013, 0x22ff, 0x2011, 0x0241, 0x2013, 0xfffe, 0x7003, 0x0400, - 0x620c, 0xc2b4, 0x620e, 0x0058, 0x7814, 0x0096, 0x904d, 0x0120, - 0x9006, 0xa89a, 0xa8a6, 0xa8aa, 0x009e, 0x7003, 0x0300, 0xb8a0, - 0x9086, 0x007e, 0x1904, 0x9dcf, 0x00d6, 0x2069, 0x196c, 0x2001, - 0x1837, 0x2004, 0xd0a4, 0x0188, 0x6800, 0x700a, 0x6808, 0x9084, - 0x2000, 0x7012, 0x080c, 0xb0ab, 0x680c, 0x7016, 0x701f, 0x2710, - 0x6818, 0x7022, 0x681c, 0x7026, 0x0428, 0x6800, 0x700a, 0x6804, - 0x700e, 0x2009, 0x180d, 0x210c, 0xd18c, 0x0110, 0x2001, 0x0002, - 0x00f6, 0x2079, 0x0100, 0x080c, 0x779e, 0x1128, 0x78e3, 0x0000, - 0x080c, 0x2700, 0x78e2, 0x00fe, 0x6808, 0x080c, 0x779e, 0x1118, - 0x9084, 0x37ff, 0x0010, 0x9084, 0x3fff, 0x7012, 0x080c, 0xb0ab, - 0x680c, 0x7016, 0x00de, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, - 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, - 0x2099, 0x1801, 0x20a1, 0x025a, 0x4003, 0x00d6, 0x080c, 0xaadc, - 0x2069, 0x1974, 0x2071, 0x024e, 0x6800, 0xc0dd, 0x7002, 0x080c, - 0x5844, 0xd0e4, 0x0110, 0x680c, 0x700e, 0x00de, 0x04e0, 0x2001, - 0x1837, 0x2004, 0xd0a4, 0x01a8, 0x0016, 0x2001, 0x180d, 0x2004, - 0xd08c, 0x2009, 0x0002, 0x1118, 0x2001, 0x196d, 0x200c, 0x60e0, - 0x9106, 0x0130, 0x2100, 0x60e3, 0x0000, 0x080c, 0x2700, 0x61e2, - 0x001e, 0x20e1, 0x0001, 0x2099, 0x196c, 0x20e9, 0x0000, 0x20a1, - 0x024e, 0x20a9, 0x0008, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1805, - 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1, - 0x025a, 0x4003, 0x080c, 0xaadc, 0x20a1, 0x024e, 0x20a9, 0x0008, - 0x2099, 0x1974, 0x4003, 0x60c3, 0x0074, 0x0804, 0xa270, 0x080c, - 0x9ef8, 0x7003, 0x2010, 0x7007, 0x0014, 0x700b, 0x0800, 0x700f, - 0x2000, 0x9006, 0x00f6, 0x2079, 0x1847, 0x7904, 0x00fe, 0xd1ac, - 0x1110, 0x9085, 0x0020, 0xd1a4, 0x0110, 0x9085, 0x0010, 0x9085, - 0x0002, 0x00d6, 0x0804, 0x9ea8, 0x7026, 0x60c3, 0x0014, 0x0804, - 0xa270, 0x080c, 0x9ef8, 0x7003, 0x5000, 0x0804, 0x9d67, 0x080c, - 0x9ef8, 0x7003, 0x2110, 0x7007, 0x0014, 0x60c3, 0x0014, 0x0804, - 0xa270, 0x080c, 0x9f3a, 0x0010, 0x080c, 0x9f43, 0x7003, 0x0200, - 0x60c3, 0x0004, 0x0804, 0xa270, 0x080c, 0x9f43, 0x7003, 0x0100, - 0x700b, 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, 0xa270, - 0x080c, 0x9f43, 0x7003, 0x0200, 0x0804, 0x9d67, 0x080c, 0x9f43, - 0x7003, 0x0100, 0x782c, 0x9005, 0x0110, 0x700a, 0x0010, 0x700b, - 0x0003, 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, 0xa270, 0x00d6, - 0x080c, 0x9f43, 0x7003, 0x0210, 0x7007, 0x0014, 0x700b, 0x0800, - 0xb894, 0x9086, 0x0014, 0x1198, 0xb99c, 0x9184, 0x0030, 0x0190, - 0xb998, 0x9184, 0xc000, 0x1140, 0xd1ec, 0x0118, 0x700f, 0x2100, - 0x0058, 0x700f, 0x0100, 0x0040, 0x700f, 0x0400, 0x0028, 0x700f, - 0x0700, 0x0010, 0x700f, 0x0800, 0x00f6, 0x2079, 0x1847, 0x7904, - 0x00fe, 0xd1ac, 0x1110, 0x9085, 0x0020, 0xd1a4, 0x0110, 0x9085, - 0x0010, 0x2009, 0x1869, 0x210c, 0xd184, 0x1110, 0x9085, 0x0002, - 0x0026, 0x2009, 0x1867, 0x210c, 0xd1e4, 0x0150, 0xc0c5, 0xbad4, - 0xd28c, 0x1108, 0xc0cd, 0x9094, 0x0030, 0x9296, 0x0010, 0x0140, - 0xd1ec, 0x0130, 0x9094, 0x0030, 0x9296, 0x0010, 0x0108, 0xc0bd, - 0x002e, 0x7026, 0x60c3, 0x0014, 0x00de, 0x0804, 0xa270, 0x080c, - 0x9f43, 0x7003, 0x0210, 0x7007, 0x0014, 0x700f, 0x0100, 0x60c3, - 0x0014, 0x0804, 0xa270, 0x080c, 0x9f43, 0x7003, 0x0200, 0x0804, - 0x9ce5, 0x080c, 0x9f43, 0x7003, 0x0100, 0x700b, 0x0003, 0x700f, - 0x2a00, 0x60c3, 0x0008, 0x0804, 0xa270, 0x080c, 0x9f43, 0x7003, - 0x0100, 0x700b, 0x000b, 0x60c3, 0x0008, 0x0804, 0xa270, 0x0026, - 0x00d6, 0x0036, 0x0046, 0x2019, 0x3200, 0x2021, 0x0800, 0x0040, - 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x2200, 0x2021, 0x0100, - 0x080c, 0xaaf1, 0xb810, 0x9305, 0x7002, 0xb814, 0x7006, 0x2069, - 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x9485, 0x0029, 0x7012, - 0x004e, 0x003e, 0x00de, 0x080c, 0xa264, 0x721a, 0x9f95, 0x0000, - 0x7222, 0x7027, 0xffff, 0x2071, 0x024c, 0x002e, 0x0005, 0x0026, - 0x080c, 0xaaf1, 0x7003, 0x02ff, 0x7007, 0xfffc, 0x00d6, 0x2069, - 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x00de, 0x7013, 0x2029, - 0x0c10, 0x7003, 0x0100, 0x7007, 0x0000, 0x700b, 0xfc02, 0x700f, - 0x0000, 0x0005, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x3300, - 0x2021, 0x0800, 0x0040, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, - 0x2300, 0x2021, 0x0100, 0x080c, 0xaaf1, 0xb810, 0x9305, 0x7002, - 0xb814, 0x7006, 0x2069, 0x1800, 0xb810, 0x9005, 0x1140, 0xb814, - 0x9005, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe, 0x0020, 0x687c, - 0x700a, 0x6880, 0x700e, 0x0000, 0x9485, 0x0098, 0x7012, 0x004e, - 0x003e, 0x00de, 0x080c, 0xa264, 0x721a, 0x7a08, 0x7222, 0x2f10, - 0x7226, 0x2071, 0x024c, 0x002e, 0x0005, 0x080c, 0xa264, 0x721a, - 0x7a08, 0x7222, 0x7814, 0x7026, 0x2071, 0x024c, 0x002e, 0x0005, - 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, 0x2071, - 0x0240, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0d85, 0x908a, 0x0092, - 0x1a0c, 0x0d85, 0x6110, 0x2158, 0xb984, 0x2c78, 0x2061, 0x0100, - 0x619a, 0x9082, 0x0085, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, - 0x00be, 0x0005, 0x9fb1, 0x9fc0, 0x9fcb, 0x9faf, 0x9faf, 0x9faf, - 0x9fb1, 0x9faf, 0x9faf, 0x9faf, 0x9faf, 0x9faf, 0x9faf, 0x080c, - 0x0d85, 0x0411, 0x60c3, 0x0000, 0x0026, 0x080c, 0x2a04, 0x0228, - 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, 0x0804, 0xa270, - 0x0431, 0x7808, 0x700a, 0x7814, 0x700e, 0x7017, 0xffff, 0x60c3, - 0x000c, 0x0804, 0xa270, 0x04a1, 0x7003, 0x0003, 0x7007, 0x0300, - 0x60c3, 0x0004, 0x0804, 0xa270, 0x0026, 0x080c, 0xaaf1, 0xb810, - 0x9085, 0x8100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x687c, - 0x700a, 0x6880, 0x700e, 0x7013, 0x0009, 0x0804, 0x9f13, 0x0026, - 0x080c, 0xaaf1, 0xb810, 0x9085, 0x8400, 0x7002, 0xb814, 0x7006, - 0x2069, 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x2001, 0x0099, - 0x7a20, 0x9296, 0x0005, 0x0108, 0xc0bc, 0x7012, 0x0804, 0x9f75, - 0x0026, 0x080c, 0xaaf1, 0xb810, 0x9085, 0x8500, 0x7002, 0xb814, - 0x7006, 0x2069, 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x2001, - 0x0099, 0x7a20, 0x9296, 0x0005, 0x0108, 0xc0bc, 0x7012, 0x0804, - 0x9f75, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2c78, 0x2069, - 0x0200, 0x2071, 0x0240, 0x7804, 0x908a, 0x0040, 0x0a0c, 0x0d85, - 0x908a, 0x0057, 0x1a0c, 0x0d85, 0x7910, 0x2158, 0xb984, 0x2061, - 0x0100, 0x619a, 0x9082, 0x0040, 0x0033, 0x00fe, 0x00ee, 0x00de, - 0x00ce, 0x00be, 0x0005, 0xa04e, 0xa04e, 0xa04e, 0xa07f, 0xa04e, - 0xa04e, 0xa04e, 0xa04e, 0xa04e, 0xa04e, 0xa04e, 0xa644, 0xa649, - 0xa64e, 0xa653, 0xa04e, 0xa04e, 0xa04e, 0xa63f, 0x080c, 0x0d85, - 0x6813, 0x0008, 0xba8c, 0x8210, 0xb8d4, 0xd084, 0x0180, 0x2001, - 0x1b72, 0x200c, 0x8108, 0x2102, 0x2001, 0x1b71, 0x201c, 0x1218, - 0x8318, 0x2302, 0x0ea0, 0x7952, 0x712e, 0x7b4e, 0x732a, 0x9294, - 0x00ff, 0xba8e, 0x8217, 0x721a, 0xba10, 0x9295, 0x0600, 0x7202, - 0xba14, 0x7206, 0x2069, 0x1800, 0x6a7c, 0x720a, 0x6a80, 0x720e, - 0x7013, 0x0829, 0x2f10, 0x7222, 0x7027, 0xffff, 0x0005, 0x0016, - 0x7814, 0x9084, 0x0700, 0x8007, 0x0013, 0x001e, 0x0005, 0xa08f, - 0xa08f, 0xa091, 0xa08f, 0xa08f, 0xa08f, 0xa0ab, 0xa08f, 0x080c, - 0x0d85, 0x7914, 0x918c, 0x08ff, 0x918d, 0xf600, 0x7916, 0x2009, - 0x0003, 0x00b9, 0x2069, 0x1847, 0x6804, 0xd0bc, 0x0130, 0x682c, - 0x9084, 0x00ff, 0x8007, 0x7032, 0x0010, 0x7033, 0x3f00, 0x60c3, - 0x0001, 0x0804, 0xa270, 0x2009, 0x0003, 0x0019, 0x7033, 0x7f00, - 0x0cb0, 0x0016, 0x080c, 0xaaf1, 0x001e, 0xb810, 0x9085, 0x0100, - 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6a7c, 0x720a, 0x6a80, - 0x720e, 0x7013, 0x0888, 0x918d, 0x0008, 0x7116, 0x080c, 0xa264, - 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x0005, 0x00b6, 0x00e6, - 0x00d6, 0x00c6, 0x0066, 0x0056, 0x0046, 0x0036, 0x2061, 0x0100, - 0x2071, 0x1800, 0x7160, 0x7810, 0x2058, 0x76dc, 0x96b4, 0x0028, - 0x0110, 0x737c, 0x7480, 0x2500, 0x76dc, 0x96b4, 0x0028, 0x0140, - 0x2001, 0x04ff, 0x6062, 0x6067, 0xffff, 0x636a, 0x646e, 0x0050, - 0x2001, 0x00ff, 0x9085, 0x0400, 0x6062, 0x6067, 0xffff, 0x606b, - 0x0000, 0x616e, 0xb8b8, 0x6073, 0x0530, 0x6077, 0x0008, 0xb88c, - 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x9085, 0x0020, 0x607a, - 0x607f, 0x0000, 0x2b00, 0x6082, 0x6087, 0xffff, 0x7814, 0x0096, - 0x2048, 0xa848, 0x608a, 0xa844, 0x608e, 0xa838, 0x60c6, 0xa834, - 0x60ca, 0x009e, 0xb86c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, - 0x60d7, 0x0000, 0x2001, 0x1837, 0x2004, 0x9084, 0x0028, 0x0128, - 0x609f, 0x0000, 0x2001, 0x0092, 0x0058, 0x6028, 0xc0bd, 0x602a, - 0x609f, 0x00ff, 0x2011, 0xffff, 0x080c, 0x2ad3, 0x2001, 0x00b2, - 0x2010, 0x900e, 0x080c, 0x2ae2, 0x2009, 0x07d0, 0x080c, 0x8a50, - 0x003e, 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00be, - 0x0005, 0x00b6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056, 0x0046, - 0x0036, 0x2061, 0x0100, 0x2071, 0x1800, 0x7160, 0x7810, 0x2058, - 0xb8a0, 0x2028, 0x76dc, 0xd6ac, 0x1168, 0x9582, 0x007e, 0x1250, - 0x2500, 0x9094, 0xff80, 0x1130, 0x9080, 0x348e, 0x2015, 0x9294, - 0x00ff, 0x0020, 0xb910, 0xba14, 0x737c, 0x7480, 0x70dc, 0xd0ac, - 0x1130, 0x9582, 0x007e, 0x1218, 0x9584, 0xff80, 0x0138, 0x9185, - 0x0400, 0x6062, 0x6266, 0x636a, 0x646e, 0x0030, 0x6063, 0x0400, - 0x6266, 0x606b, 0x0000, 0x616e, 0xb8b8, 0x6072, 0x6077, 0x0000, - 0xb864, 0xd0a4, 0x0110, 0x6077, 0x0008, 0xb88c, 0x8000, 0x9084, - 0x00ff, 0xb88e, 0x8007, 0x9085, 0x0020, 0x607a, 0x607f, 0x0000, - 0x2b00, 0x6082, 0x6087, 0xffff, 0x7814, 0x0096, 0x2048, 0xa848, - 0x608a, 0xa844, 0x608e, 0xa838, 0x60c6, 0xa834, 0x60ca, 0x009e, - 0xb86c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000, - 0xba84, 0x629e, 0x00f6, 0x2079, 0x0140, 0x7803, 0x0000, 0x00fe, - 0x900e, 0x2011, 0x0092, 0x080c, 0x2ae2, 0x2009, 0x07d0, 0x080c, - 0x8a50, 0x003e, 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de, 0x00ee, - 0x00be, 0x0005, 0x00b6, 0x0096, 0x00e6, 0x00d6, 0x00c6, 0x0056, - 0x0046, 0x0036, 0x2061, 0x0100, 0x2071, 0x1800, 0x7810, 0x2058, - 0xb8a0, 0x2028, 0xb910, 0xba14, 0x737c, 0x7480, 0x7820, 0x0002, - 0xa1ef, 0xa1ef, 0xa1ef, 0xa1ef, 0xa1ef, 0xa1ef, 0xa1ef, 0xa1ef, - 0xa1ef, 0xa1ef, 0xa1f1, 0xa1ef, 0xa1ef, 0xa1ef, 0xa1ef, 0x080c, - 0x0d85, 0xb884, 0x609e, 0x7814, 0x2048, 0xa87c, 0xd0fc, 0x0558, - 0xaf90, 0x9784, 0xff00, 0x9105, 0x6062, 0x873f, 0x9784, 0xff00, - 0x0006, 0x7814, 0x2048, 0xa878, 0xc0fc, 0x9005, 0x000e, 0x1160, - 0xaf94, 0x87ff, 0x0198, 0x2039, 0x0098, 0x9705, 0x6072, 0x7808, - 0x6082, 0x2f00, 0x6086, 0x0038, 0x9185, 0x2200, 0x6062, 0x6073, - 0x0129, 0x6077, 0x0000, 0xb884, 0x609e, 0x0050, 0x2039, 0x0029, - 0x9705, 0x6072, 0x0cc0, 0x9185, 0x0200, 0x6062, 0x6073, 0x2029, - 0xa87c, 0xd0fc, 0x0118, 0xaf94, 0x87ff, 0x1120, 0x2f00, 0x6082, - 0x7808, 0x6086, 0x6266, 0x636a, 0x646e, 0x6077, 0x0000, 0xb88c, - 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x607a, 0x607f, 0x0000, - 0xa848, 0x608a, 0xa844, 0x608e, 0xa838, 0x60c6, 0xa834, 0x60ca, - 0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, 0x080c, 0xaad1, - 0x2009, 0x07d0, 0x60c4, 0x9084, 0xfff0, 0x9005, 0x0110, 0x2009, - 0x1b58, 0x080c, 0x8a50, 0x003e, 0x004e, 0x005e, 0x00ce, 0x00de, - 0x00ee, 0x009e, 0x00be, 0x0005, 0x7a40, 0x9294, 0x00ff, 0x8217, - 0x0005, 0x00d6, 0x2069, 0x19e8, 0x686b, 0x0001, 0x00de, 0x0005, - 0x60a3, 0x0056, 0x60a7, 0x9575, 0x00f1, 0x080c, 0x8a42, 0x0005, - 0x0016, 0x2001, 0x180c, 0x200c, 0x9184, 0x0600, 0x9086, 0x0600, - 0x0128, 0x0089, 0x080c, 0x8a42, 0x001e, 0x0005, 0xc1e5, 0x2001, - 0x180c, 0x2102, 0x2001, 0x19e9, 0x2003, 0x0000, 0x2001, 0x19f4, - 0x2003, 0x0000, 0x0c88, 0x0006, 0x0016, 0x0026, 0x2009, 0x1804, - 0x2011, 0x0009, 0x080c, 0x2ae2, 0x002e, 0x001e, 0x000e, 0x0005, - 0x0016, 0x00c6, 0x0006, 0x080c, 0xacfc, 0x0106, 0x2061, 0x0100, - 0x61a4, 0x60a7, 0x95f5, 0x0016, 0x0026, 0x2009, 0x1804, 0x2011, - 0x0008, 0x080c, 0x2ae2, 0x002e, 0x001e, 0x010e, 0x090c, 0xad18, - 0x000e, 0xa001, 0xa001, 0xa001, 0x61a6, 0x00ce, 0x001e, 0x0005, - 0x00c6, 0x00d6, 0x0016, 0x0026, 0x2061, 0x0100, 0x2069, 0x0140, - 0x080c, 0x779e, 0x1510, 0x2001, 0x1a0d, 0x2004, 0x9005, 0x1904, - 0xa31f, 0x080c, 0x7840, 0x11a8, 0x2069, 0x0380, 0x6843, 0x0101, - 0x6844, 0xd084, 0x1de8, 0x2061, 0x0100, 0x6020, 0xd0b4, 0x1120, - 0x6024, 0xd084, 0x090c, 0x0d85, 0x6843, 0x0100, 0x080c, 0x8a42, - 0x04b0, 0x00c6, 0x2061, 0x19e8, 0x00f0, 0x6904, 0x9194, 0x4000, - 0x0598, 0x080c, 0xa2a0, 0x080c, 0x2aa9, 0x00c6, 0x2061, 0x19e8, - 0x6134, 0x9192, 0x0008, 0x1278, 0x8108, 0x6136, 0x080c, 0xacfc, - 0x6130, 0x080c, 0xad18, 0x00ce, 0x81ff, 0x01c8, 0x080c, 0x8a42, - 0x080c, 0xa293, 0x00a0, 0x080c, 0xacfc, 0x6130, 0x91e5, 0x0000, - 0x0150, 0x080c, 0xeeee, 0x080c, 0x8a4b, 0x6003, 0x0001, 0x2009, - 0x0014, 0x080c, 0xb20a, 0x080c, 0xad18, 0x00ce, 0x0000, 0x002e, - 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001, 0x1a0d, 0x2004, 0x9005, - 0x1db0, 0x00c6, 0x2061, 0x19e8, 0x6134, 0x9192, 0x0003, 0x1ad8, - 0x8108, 0x6136, 0x00ce, 0x080c, 0x8a42, 0x080c, 0x6058, 0x2009, - 0x1846, 0x2114, 0x8210, 0x220a, 0x0c10, 0x0096, 0x00c6, 0x00d6, - 0x00e6, 0x0016, 0x0026, 0x080c, 0x8a58, 0x080c, 0xacfc, 0x2001, - 0x0387, 0x2003, 0x0202, 0x2071, 0x19e8, 0x714c, 0x81ff, 0x0904, - 0xa3d9, 0x2061, 0x0100, 0x2069, 0x0140, 0x080c, 0x779e, 0x1518, - 0x0036, 0x2019, 0x0002, 0x080c, 0xa596, 0x003e, 0x080c, 0xeeee, - 0x704c, 0x9065, 0x0180, 0x2009, 0x004a, 0x6220, 0x9296, 0x0009, - 0x1130, 0x6114, 0x2148, 0xa87b, 0x0006, 0x2009, 0x004a, 0x6003, - 0x0003, 0x080c, 0xb20a, 0x2001, 0x0386, 0x2003, 0x5040, 0x080c, - 0x7840, 0x0804, 0xa3d9, 0x6904, 0xd1f4, 0x0904, 0xa3e6, 0x080c, - 0x2aa9, 0x00c6, 0x704c, 0x9065, 0x090c, 0x0d85, 0x6020, 0x00ce, - 0x9086, 0x0006, 0x1520, 0x61c8, 0x60c4, 0x9105, 0x1500, 0x714c, - 0x9188, 0x0011, 0x2104, 0xd0e4, 0x01d0, 0x6214, 0x9294, 0x1800, - 0x1128, 0x6224, 0x9294, 0x0002, 0x15e0, 0x0010, 0xc0e4, 0x200a, - 0x6014, 0x9084, 0xe7fd, 0x9085, 0x0010, 0x6016, 0x704c, 0x2060, - 0x080c, 0x9a48, 0x2009, 0x0049, 0x080c, 0xb20a, 0x0450, 0x080c, - 0xeeee, 0x704c, 0x9065, 0x9086, 0x1b55, 0x1158, 0x080c, 0xafd2, - 0x1500, 0x2061, 0x1b55, 0x6064, 0x8000, 0x6066, 0x080c, 0x6058, - 0x00c0, 0x0036, 0x2019, 0x0001, 0x080c, 0xa596, 0x003e, 0x714c, - 0x2160, 0x2009, 0x004a, 0x6220, 0x9296, 0x0009, 0x1130, 0x6114, - 0x2148, 0xa87b, 0x0006, 0x2009, 0x004a, 0x6003, 0x0003, 0x080c, - 0xb20a, 0x2001, 0x0387, 0x2003, 0x0200, 0x080c, 0xad18, 0x002e, - 0x001e, 0x00ee, 0x00de, 0x00ce, 0x009e, 0x0005, 0xd1ec, 0x1904, - 0xa37f, 0x0804, 0xa381, 0x0026, 0x00e6, 0x2071, 0x19e8, 0x706c, - 0xd084, 0x01e8, 0xc084, 0x706e, 0x714c, 0x81ff, 0x01c0, 0x2071, - 0x0100, 0x9188, 0x0008, 0x2114, 0x928e, 0x0006, 0x1138, 0x2009, - 0x1984, 0x2011, 0x0012, 0x080c, 0x2ae2, 0x0048, 0x928e, 0x0009, - 0x0db0, 0x2009, 0x1984, 0x2011, 0x0016, 0x080c, 0x2ae2, 0x00ee, - 0x002e, 0x0005, 0x9036, 0x2001, 0x19f2, 0x2004, 0x9005, 0x0128, - 0x9c06, 0x0128, 0x2c30, 0x600c, 0x0cc8, 0x9085, 0x0001, 0x0005, - 0x00f6, 0x2079, 0x19e8, 0x610c, 0x9006, 0x600e, 0x6044, 0xc0fc, - 0x6046, 0x86ff, 0x1140, 0x7824, 0x9c06, 0x1118, 0x7826, 0x782a, - 0x0050, 0x792a, 0x0040, 0x00c6, 0x2660, 0x610e, 0x00ce, 0x7824, - 0x9c06, 0x1108, 0x7e26, 0x080c, 0xa65d, 0x080c, 0xd10c, 0x00fe, - 0x0005, 0x080c, 0x9ef8, 0x7003, 0x1200, 0x7838, 0x7012, 0x783c, - 0x7016, 0x00c6, 0x7820, 0x9086, 0x0004, 0x1148, 0x7810, 0x9005, - 0x0130, 0x00b6, 0x2058, 0xb810, 0xb914, 0x00be, 0x0020, 0x2061, - 0x1800, 0x607c, 0x6180, 0x9084, 0x00ff, 0x700a, 0x710e, 0x00ce, - 0x60c3, 0x002c, 0x0804, 0xa270, 0x080c, 0x9ef8, 0x7003, 0x0f00, - 0x7808, 0xd09c, 0x0128, 0xb810, 0x9084, 0x00ff, 0x700a, 0xb814, - 0x700e, 0x60c3, 0x0008, 0x0804, 0xa270, 0x0156, 0x080c, 0x9f43, - 0x7003, 0x0200, 0x080c, 0x8b10, 0x20a9, 0x0006, 0x2011, 0xffec, - 0x2019, 0xffed, 0x9ef0, 0x0002, 0x2305, 0x2072, 0x8e70, 0x2205, - 0x2072, 0x8e70, 0x9398, 0x0002, 0x9290, 0x0002, 0x1f04, 0xa484, - 0x60c3, 0x001c, 0x015e, 0x0804, 0xa270, 0x0016, 0x0026, 0x080c, - 0x9f1f, 0x080c, 0x9f31, 0x9e80, 0x0004, 0x20e9, 0x0000, 0x20a0, - 0x7814, 0x0096, 0x2048, 0xa800, 0x2048, 0xa860, 0x20e0, 0xa85c, - 0x9080, 0x0021, 0x2098, 0x009e, 0x7808, 0x9088, 0x0002, 0x21a8, - 0x9192, 0x0010, 0x1250, 0x4003, 0x9080, 0x0004, 0x8003, 0x60c2, - 0x080c, 0xa270, 0x002e, 0x001e, 0x0005, 0x20a9, 0x0010, 0x4003, - 0x080c, 0xaadc, 0x20a1, 0x0240, 0x22a8, 0x4003, 0x0c68, 0x080c, - 0x9ef8, 0x7003, 0x6200, 0x7808, 0x700e, 0x60c3, 0x0008, 0x0804, - 0xa270, 0x0016, 0x0026, 0x080c, 0x9ef8, 0x20e9, 0x0000, 0x20a1, - 0x024c, 0x7814, 0x0096, 0x2048, 0xa800, 0x2048, 0xa860, 0x20e0, - 0xa85c, 0x9080, 0x0023, 0x2098, 0x009e, 0x7808, 0x9088, 0x0002, - 0x21a8, 0x4003, 0x8003, 0x60c2, 0x080c, 0xa270, 0x002e, 0x001e, - 0x0005, 0x00e6, 0x00c6, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, - 0x19e8, 0x7010, 0x2060, 0x8cff, 0x0188, 0x080c, 0xd132, 0x1110, - 0x080c, 0xbb5c, 0x600c, 0x0006, 0x080c, 0xd3ae, 0x600f, 0x0000, - 0x080c, 0xb16c, 0x080c, 0xa65d, 0x00ce, 0x0c68, 0x2c00, 0x7012, - 0x700e, 0x012e, 0x000e, 0x00ce, 0x00ee, 0x0005, 0x0126, 0x0156, - 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, 0x0016, 0x0006, - 0x2091, 0x8000, 0x2001, 0x180c, 0x200c, 0x918c, 0xe7ff, 0x2102, - 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x19e8, 0x7030, 0x2060, - 0x8cff, 0x0548, 0x080c, 0xa2a0, 0x6ac0, 0x68c3, 0x0000, 0x080c, - 0x8a4b, 0x00c6, 0x2061, 0x0100, 0x080c, 0xac2d, 0x00ce, 0x20a9, - 0x01f4, 0x04b1, 0x080c, 0x99ed, 0x6044, 0xd0ac, 0x1128, 0x2001, - 0x1988, 0x2004, 0x604a, 0x0020, 0x2009, 0x0013, 0x080c, 0xb20a, - 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, - 0x015e, 0x012e, 0x0005, 0x2001, 0x1800, 0x2004, 0x9096, 0x0001, - 0x0d78, 0x9096, 0x0004, 0x0d60, 0x080c, 0x8a4b, 0x6814, 0x9084, - 0x0001, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, - 0x2011, 0x6002, 0x080c, 0x8993, 0x20a9, 0x01f4, 0x0009, 0x08c0, - 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, 0x7804, 0x9084, 0x4000, - 0x190c, 0x2aa9, 0x0090, 0xd084, 0x0118, 0x6827, 0x4001, 0x0010, - 0x1f04, 0xa578, 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100, - 0x080c, 0x2a99, 0x9006, 0x080c, 0x2a99, 0x0005, 0x0126, 0x0156, - 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, 0x0016, 0x0006, - 0x2091, 0x8000, 0x2001, 0x180c, 0x200c, 0x918c, 0xdbff, 0x2102, - 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x0380, 0x701c, 0x0006, - 0x701f, 0x0202, 0x2071, 0x19e8, 0x704c, 0x2060, 0x8cff, 0x0904, - 0xa619, 0x080c, 0xaf84, 0x0904, 0xa619, 0x9386, 0x0002, 0x1128, - 0x6814, 0x9084, 0x0002, 0x0904, 0xa619, 0x68af, 0x95f5, 0x6817, - 0x0010, 0x2009, 0x00fa, 0x8109, 0x1df0, 0x69c6, 0x68cb, 0x0008, - 0x080c, 0x8a58, 0x080c, 0x1e44, 0x2001, 0x0032, 0x6920, 0xd1bc, - 0x0130, 0x8001, 0x1dd8, 0x692c, 0x918d, 0x0008, 0x692e, 0x0016, - 0x2009, 0x0040, 0x080c, 0x2220, 0x001e, 0x20a9, 0x03e8, 0x6824, - 0xd094, 0x0140, 0x6827, 0x0004, 0x7804, 0x9084, 0x4000, 0x190c, - 0x2aa9, 0x0090, 0xd08c, 0x0118, 0x6827, 0x0002, 0x0010, 0x1f04, - 0xa5e7, 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, - 0x2a99, 0x9006, 0x080c, 0x2a99, 0x6827, 0x4000, 0x6824, 0x83ff, - 0x1180, 0x2009, 0x0049, 0x6020, 0x9086, 0x0009, 0x0150, 0x080c, - 0x9a48, 0x6044, 0xd0ac, 0x1118, 0x6003, 0x0002, 0x0010, 0x080c, - 0xb20a, 0x000e, 0x2071, 0x0380, 0xd08c, 0x1110, 0x701f, 0x0200, - 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, - 0x015e, 0x012e, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, - 0x19e8, 0x6a06, 0x012e, 0x00de, 0x0005, 0x00d6, 0x0126, 0x2091, - 0x8000, 0x2069, 0x19e8, 0x6a3e, 0x012e, 0x00de, 0x0005, 0x080c, - 0xa050, 0x7047, 0x1000, 0x0098, 0x080c, 0xa050, 0x7047, 0x4000, - 0x0070, 0x080c, 0xa050, 0x7047, 0x2000, 0x0048, 0x080c, 0xa050, - 0x7047, 0x0400, 0x0020, 0x080c, 0xa050, 0x7047, 0x0200, 0x785c, - 0x7032, 0x60c3, 0x0020, 0x0804, 0xa270, 0x00e6, 0x2071, 0x19e8, - 0x702c, 0x9005, 0x0110, 0x8001, 0x702e, 0x00ee, 0x0005, 0x00f6, - 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0006, 0x0126, 0x2091, - 0x8000, 0x2071, 0x19e8, 0x7620, 0x2660, 0x2678, 0x2039, 0x0001, - 0x87ff, 0x0904, 0xa702, 0x8cff, 0x0904, 0xa702, 0x6020, 0x9086, - 0x0006, 0x1904, 0xa6fd, 0x88ff, 0x0138, 0x2800, 0x9c06, 0x1904, - 0xa6fd, 0x2039, 0x0000, 0x0050, 0x6010, 0x9b06, 0x1904, 0xa6fd, - 0x85ff, 0x0120, 0x605c, 0x9106, 0x1904, 0xa6fd, 0x7030, 0x9c06, - 0x15b0, 0x2069, 0x0100, 0x68c0, 0x9005, 0x1160, 0x6824, 0xd084, - 0x0148, 0x6827, 0x0001, 0x080c, 0x8a4b, 0x080c, 0xa78a, 0x7033, - 0x0000, 0x0428, 0x080c, 0x8a4b, 0x6820, 0xd0b4, 0x0110, 0x68a7, - 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x080c, 0xa78a, 0x7033, - 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, - 0x2001, 0x0100, 0x080c, 0x2a99, 0x9006, 0x080c, 0x2a99, 0x2069, - 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x7020, - 0x9c36, 0x1110, 0x660c, 0x7622, 0x701c, 0x9c36, 0x1140, 0x2c00, - 0x9f36, 0x0118, 0x2f00, 0x701e, 0x0010, 0x701f, 0x0000, 0x660c, - 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x89ff, - 0x1168, 0x600f, 0x0000, 0x6014, 0x0096, 0x2048, 0x080c, 0xcf19, - 0x0110, 0x080c, 0xea30, 0x009e, 0x080c, 0xb1a7, 0x080c, 0xa65d, - 0x88ff, 0x1190, 0x00ce, 0x0804, 0xa678, 0x2c78, 0x600c, 0x2060, - 0x0804, 0xa678, 0x9006, 0x012e, 0x000e, 0x006e, 0x007e, 0x00ce, - 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce, 0x98c5, - 0x0001, 0x0c88, 0x00f6, 0x00e6, 0x00d6, 0x0096, 0x00c6, 0x0066, - 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e8, 0x7648, - 0x2660, 0x2678, 0x8cff, 0x0904, 0xa779, 0x6020, 0x9086, 0x0006, - 0x1904, 0xa774, 0x87ff, 0x0128, 0x2700, 0x9c06, 0x1904, 0xa774, - 0x0048, 0x6010, 0x9b06, 0x1904, 0xa774, 0x85ff, 0x0118, 0x605c, - 0x9106, 0x15d0, 0x704c, 0x9c06, 0x1178, 0x0036, 0x2019, 0x0001, - 0x080c, 0xa596, 0x703f, 0x0000, 0x9006, 0x704e, 0x706a, 0x7052, - 0x706e, 0x080c, 0xaff4, 0x003e, 0x7048, 0x9c36, 0x1110, 0x660c, - 0x764a, 0x7044, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, - 0x7046, 0x0010, 0x7047, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, - 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x6014, 0x2048, - 0x080c, 0xcf19, 0x0110, 0x080c, 0xea30, 0x080c, 0xb1a7, 0x87ff, - 0x1198, 0x00ce, 0x0804, 0xa722, 0x2c78, 0x600c, 0x2060, 0x0804, - 0xa722, 0x9006, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x009e, - 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce, 0x97bd, - 0x0001, 0x0c80, 0x00e6, 0x2071, 0x19e8, 0x9006, 0x7032, 0x700a, - 0x7004, 0x9086, 0x0003, 0x0158, 0x2001, 0x1800, 0x2004, 0x9086, - 0x0002, 0x1118, 0x7007, 0x0005, 0x0010, 0x7007, 0x0000, 0x00ee, - 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, - 0x2091, 0x8000, 0x2071, 0x19e8, 0x2c10, 0x7648, 0x2660, 0x2678, - 0x8cff, 0x0540, 0x2200, 0x9c06, 0x1508, 0x7048, 0x9c36, 0x1110, - 0x660c, 0x764a, 0x7044, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, - 0x2f00, 0x7046, 0x0010, 0x7047, 0x0000, 0x660c, 0x2c00, 0x9f06, - 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x6004, 0x9086, - 0x0040, 0x090c, 0x99ed, 0x9085, 0x0001, 0x0020, 0x2c78, 0x600c, - 0x2060, 0x08b0, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x00ee, - 0x00fe, 0x0005, 0x0096, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, - 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e8, 0x7610, - 0x2660, 0x2678, 0x8cff, 0x0904, 0xa877, 0x6010, 0x00b6, 0x2058, - 0xb8a0, 0x00be, 0x9206, 0x1904, 0xa872, 0x7030, 0x9c06, 0x1520, - 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0xa849, 0x080c, 0xa2a0, - 0x68c3, 0x0000, 0x080c, 0xa78a, 0x7033, 0x0000, 0x0036, 0x2069, - 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, - 0x2a99, 0x9006, 0x080c, 0x2a99, 0x2069, 0x0100, 0x6824, 0xd084, - 0x0110, 0x6827, 0x0001, 0x003e, 0x7010, 0x9c36, 0x1110, 0x660c, - 0x7612, 0x700c, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, - 0x700e, 0x0010, 0x700f, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, - 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0xd121, - 0x1180, 0x080c, 0x3344, 0x080c, 0xd132, 0x1518, 0x080c, 0xbb5c, - 0x0400, 0x080c, 0xa78a, 0x6824, 0xd084, 0x09b0, 0x6827, 0x0001, - 0x0898, 0x080c, 0xd132, 0x1118, 0x080c, 0xbb5c, 0x0090, 0x6014, - 0x2048, 0x080c, 0xcf19, 0x0168, 0x6020, 0x9086, 0x0003, 0x1508, - 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x7006, 0x080c, - 0xd10c, 0x080c, 0xd3ae, 0x080c, 0xb1a7, 0x080c, 0xa65d, 0x00ce, - 0x0804, 0xa7f2, 0x2c78, 0x600c, 0x2060, 0x0804, 0xa7f2, 0x012e, - 0x000e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x009e, - 0x0005, 0x6020, 0x9086, 0x0006, 0x1d20, 0x080c, 0xea30, 0x0c08, - 0x00d6, 0x080c, 0x9f43, 0x7003, 0x0200, 0x7007, 0x0014, 0x60c3, - 0x0014, 0x20e1, 0x0001, 0x2099, 0x1989, 0x20e9, 0x0000, 0x20a1, - 0x0250, 0x20a9, 0x0004, 0x4003, 0x7023, 0x0004, 0x7027, 0x7878, - 0x080c, 0xa270, 0x00de, 0x0005, 0x080c, 0x9f43, 0x700b, 0x0800, - 0x7814, 0x9084, 0xff00, 0x700e, 0x7814, 0x9084, 0x00ff, 0x7022, - 0x782c, 0x7026, 0x7860, 0x9084, 0x00ff, 0x9085, 0x0200, 0x7002, - 0x7860, 0x9084, 0xff00, 0x8007, 0x7006, 0x60c2, 0x0804, 0xa270, - 0x00b6, 0x00d6, 0x0016, 0x00d6, 0x2f68, 0x2009, 0x0035, 0x080c, - 0xd5bb, 0x00de, 0x1904, 0xa925, 0x080c, 0x9ef8, 0x7003, 0x1300, - 0x782c, 0x080c, 0xaa34, 0x2068, 0x6820, 0x9086, 0x0003, 0x0560, - 0x7810, 0x2058, 0xbaa0, 0x080c, 0xb094, 0x11d8, 0x9286, 0x007e, - 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe, 0x0498, 0x9286, 0x007f, - 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffd, 0x0458, 0x9284, 0xff80, - 0x0180, 0x9286, 0x0080, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffc, - 0x0400, 0x92d8, 0x1000, 0x2b5c, 0xb810, 0x700a, 0xb814, 0x700e, - 0x00c0, 0xb884, 0x700e, 0x00a8, 0x080c, 0xb094, 0x1130, 0x7810, - 0x2058, 0xb8a0, 0x9082, 0x007e, 0x0250, 0x00d6, 0x2069, 0x181f, - 0x2d04, 0x700a, 0x8d68, 0x2d04, 0x700e, 0x00de, 0x0010, 0x6034, - 0x700e, 0x7838, 0x7012, 0x783c, 0x7016, 0x60c3, 0x000c, 0x001e, - 0x00de, 0x080c, 0xa270, 0x00be, 0x0005, 0x781b, 0x0001, 0x7803, - 0x0006, 0x001e, 0x00de, 0x00be, 0x0005, 0x792c, 0x9180, 0x0008, - 0x200c, 0x9186, 0x0006, 0x01c0, 0x9186, 0x0003, 0x0904, 0xa9a4, - 0x9186, 0x0005, 0x0904, 0xa98c, 0x9186, 0x0004, 0x05f0, 0x9186, - 0x0008, 0x0904, 0xa995, 0x7807, 0x0037, 0x782f, 0x0003, 0x7817, - 0x1700, 0x080c, 0xaa11, 0x0005, 0x080c, 0xa9d2, 0x00d6, 0x0026, - 0x792c, 0x2168, 0x2009, 0x4000, 0x6800, 0x6a44, 0xd2fc, 0x11f8, - 0x0002, 0xa96c, 0xa977, 0xa96e, 0xa977, 0xa973, 0xa96c, 0xa96c, - 0xa977, 0xa977, 0xa977, 0xa977, 0xa96c, 0xa96c, 0xa96c, 0xa96c, - 0xa96c, 0xa977, 0xa96c, 0xa977, 0x080c, 0x0d85, 0x6824, 0xd0e4, - 0x0110, 0xd0cc, 0x0110, 0x900e, 0x0010, 0x2009, 0x2000, 0x682c, - 0x7022, 0x6830, 0x7026, 0x0804, 0xa9cb, 0x080c, 0xa9d2, 0x00d6, - 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x6a00, 0x9286, 0x0002, - 0x1108, 0x900e, 0x0804, 0xa9cb, 0x080c, 0xa9d2, 0x00d6, 0x0026, - 0x792c, 0x2168, 0x2009, 0x4000, 0x04b0, 0x04e1, 0x00d6, 0x0026, - 0x792c, 0x2168, 0x2009, 0x4000, 0x9286, 0x0005, 0x0118, 0x9286, - 0x0002, 0x1108, 0x900e, 0x0438, 0x0469, 0x00d6, 0x0026, 0x792c, - 0x2168, 0x6814, 0x6924, 0xc185, 0x6926, 0x0096, 0x2048, 0xa9ac, - 0xa834, 0x9112, 0xa9b0, 0xa838, 0x009e, 0x9103, 0x7022, 0x7226, - 0x792c, 0x9180, 0x0011, 0x2004, 0xd0fc, 0x1148, 0x9180, 0x0000, - 0x2004, 0x908e, 0x0002, 0x0130, 0x908e, 0x0004, 0x0118, 0x2009, - 0x4000, 0x0008, 0x900e, 0x712a, 0x60c3, 0x0018, 0x002e, 0x00de, - 0x0804, 0xa270, 0x00b6, 0x0036, 0x0046, 0x0056, 0x0066, 0x080c, - 0x9f43, 0x9006, 0x7003, 0x0200, 0x7938, 0x710a, 0x793c, 0x710e, - 0x7810, 0x2058, 0xb8a0, 0x080c, 0xb094, 0x1118, 0x9092, 0x007e, - 0x0268, 0x00d6, 0x2069, 0x181f, 0x2d2c, 0x8d68, 0x2d34, 0x90d8, - 0x1000, 0x2b5c, 0xbb10, 0xbc14, 0x00de, 0x0028, 0x901e, 0xbc84, - 0x2029, 0x0000, 0x6634, 0x782c, 0x9080, 0x0008, 0x2004, 0x9086, - 0x0003, 0x1128, 0x7512, 0x7616, 0x731a, 0x741e, 0x0020, 0x7312, - 0x7416, 0x751a, 0x761e, 0x006e, 0x005e, 0x004e, 0x003e, 0x00be, - 0x0005, 0x080c, 0x9f43, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814, - 0x700e, 0x700e, 0x60c3, 0x0008, 0x0804, 0xa270, 0x080c, 0x9eef, - 0x7003, 0x1400, 0x7838, 0x700a, 0x0079, 0x783c, 0x700e, 0x782c, - 0x7012, 0x7830, 0x7016, 0x7834, 0x9084, 0x00ff, 0x8007, 0x701a, - 0x60c3, 0x0010, 0x0804, 0xa270, 0x00e6, 0x2071, 0x0240, 0x0006, - 0x00f6, 0x2078, 0x7810, 0x00b6, 0x2058, 0xb8d4, 0xd084, 0x0120, - 0x784c, 0x702a, 0x7850, 0x702e, 0x00be, 0x00fe, 0x000e, 0x00ee, - 0x0005, 0x080c, 0x9f3a, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814, - 0x700e, 0x60c3, 0x0008, 0x0804, 0xa270, 0x00a9, 0x7914, 0x712a, - 0x60c3, 0x0000, 0x60a7, 0x9575, 0x0026, 0x080c, 0x2a04, 0x0228, - 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, 0x080c, 0xa293, - 0x080c, 0x8a42, 0x0005, 0x0036, 0x0096, 0x00d6, 0x00e6, 0x7860, - 0x2048, 0xaa7c, 0x9296, 0x00c0, 0x9294, 0x00fd, 0xaa7e, 0xaa80, - 0x9294, 0x0300, 0xaa82, 0xa96c, 0x9194, 0x00ff, 0xab74, 0x9384, - 0x00ff, 0x908d, 0xc200, 0xa96e, 0x9384, 0xff00, 0x9215, 0xaa76, - 0xa870, 0xaa78, 0xa87a, 0xaa72, 0x00d6, 0x2069, 0x0200, 0x080c, - 0xaaf1, 0x00de, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000a, - 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, 0x4003, 0x60a3, - 0x0035, 0xaa68, 0x9294, 0x7000, 0x9286, 0x3000, 0x0110, 0x60a3, - 0x0037, 0x00ee, 0x00de, 0x009e, 0x003e, 0x0005, 0x900e, 0x7814, - 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x01c0, 0x9084, 0x0003, 0x11a8, - 0x2001, 0x180c, 0x2004, 0xd0bc, 0x0180, 0x7824, 0xd0cc, 0x1168, - 0xd0c4, 0x1158, 0xa8a8, 0x9005, 0x1140, 0x2001, 0x180c, 0x200c, - 0xc1d5, 0x2102, 0x2009, 0x19b3, 0x210c, 0x009e, 0x918d, 0x0092, - 0x0010, 0x2009, 0x0096, 0x60ab, 0x0036, 0x0026, 0x2110, 0x900e, - 0x080c, 0x2ae2, 0x002e, 0x0005, 0x2009, 0x0009, 0x00a0, 0x2009, - 0x000a, 0x0088, 0x2009, 0x000b, 0x0070, 0x2009, 0x000c, 0x0058, - 0x2009, 0x000d, 0x0040, 0x2009, 0x000e, 0x0028, 0x2009, 0x000f, - 0x0010, 0x2009, 0x0008, 0x6912, 0x0005, 0x080c, 0x9ef8, 0x0016, - 0x0026, 0x0096, 0x00d6, 0x7814, 0x2048, 0x7013, 0x0138, 0x2001, - 0x1837, 0x2004, 0x9084, 0x0028, 0x1138, 0x2001, 0x197c, 0x2004, - 0x9086, 0xaaaa, 0x1904, 0xab96, 0x7003, 0x5400, 0x00c6, 0x2061, - 0x1800, 0x607c, 0x9084, 0x00ff, 0xa998, 0x810f, 0x918c, 0xff00, - 0x9105, 0x700a, 0x6080, 0x700e, 0xa998, 0x918c, 0xff00, 0x7112, - 0x20a9, 0x0004, 0x2009, 0x1805, 0x2e10, 0x9290, 0x0006, 0x2104, - 0x2012, 0x8108, 0x8210, 0x1f04, 0xab27, 0x20a9, 0x0004, 0x2009, - 0x1801, 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, 0xab31, 0xa860, - 0x20e0, 0xa85c, 0x9080, 0x0029, 0x2098, 0x2009, 0x0006, 0x20a9, - 0x0001, 0x4002, 0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, 0x00d6, - 0x2069, 0x0200, 0x080c, 0xaadc, 0x00de, 0x2071, 0x0240, 0x2011, - 0x0240, 0x2009, 0x0002, 0x20a9, 0x0001, 0x4002, 0x8007, 0x2012, - 0x8210, 0x8109, 0x1dc0, 0x2009, 0x0008, 0x20a9, 0x0001, 0x4002, - 0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, 0xa85c, 0x9080, 0x0031, - 0x2098, 0x2009, 0x0008, 0x20a9, 0x0001, 0x4002, 0x8007, 0x2012, - 0x8210, 0x8109, 0x1dc0, 0x00ce, 0x60c3, 0x004c, 0x60a3, 0x0056, - 0x60a7, 0x9575, 0x2001, 0x1837, 0x2004, 0x9084, 0x0028, 0x1168, - 0x080c, 0x779e, 0x0150, 0x6028, 0xc0bd, 0x602a, 0x2009, 0x1804, - 0x2011, 0x0029, 0x080c, 0x2ae2, 0x0010, 0x080c, 0xa270, 0x080c, - 0x8a42, 0x00de, 0x009e, 0x002e, 0x001e, 0x0005, 0x00e6, 0x2071, - 0x0240, 0x2001, 0x2200, 0x9085, 0x00ff, 0x7002, 0x7007, 0xffff, - 0x2071, 0x0100, 0x709b, 0x00ff, 0x00ee, 0x0804, 0xab0c, 0x080c, - 0x9ef8, 0x0016, 0x0026, 0x0096, 0x00d6, 0x7814, 0x2048, 0x7013, - 0x0138, 0x7003, 0x5500, 0x00c6, 0xa89c, 0x9084, 0x00ff, 0xa998, - 0x810f, 0x918c, 0xff00, 0x9105, 0x700a, 0xa99c, 0x918c, 0xff00, - 0xa8a0, 0x9084, 0x00ff, 0x9105, 0x700e, 0xa998, 0x918c, 0xff00, - 0x2061, 0x1800, 0x607c, 0x9084, 0x00ff, 0x910d, 0x7112, 0x6180, - 0x7116, 0x2009, 0x0008, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0029, - 0x2098, 0x2e10, 0x9290, 0x0006, 0x20a9, 0x0001, 0x4002, 0x8007, - 0x2012, 0x8210, 0x8109, 0x1dc0, 0x20a9, 0x0004, 0x2009, 0x1805, - 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, 0xabe8, 0x20a9, 0x0002, - 0x2009, 0x1801, 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, 0xabf2, - 0x00d6, 0x0016, 0x2069, 0x0200, 0x080c, 0xaadc, 0x001e, 0x00de, - 0x2071, 0x0240, 0x20a9, 0x0002, 0x2009, 0x1803, 0x2011, 0x0240, - 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, 0xac08, 0x2009, 0x0008, - 0x4002, 0x8007, 0x2012, 0x8210, 0x8109, 0x1dd0, 0x9006, 0x20a9, - 0x0008, 0x2012, 0x8210, 0x1f04, 0xac19, 0x00ce, 0x60c3, 0x004c, - 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0xa270, 0x080c, 0x8a42, - 0x00de, 0x009e, 0x002e, 0x001e, 0x0005, 0x00d6, 0x9290, 0x0018, - 0x8214, 0x20e9, 0x0000, 0x2069, 0x0200, 0x6813, 0x0000, 0x22a8, - 0x9284, 0x00e0, 0x0128, 0x20a9, 0x0020, 0x9292, 0x0020, 0x0008, - 0x9016, 0x20a1, 0x0240, 0x9006, 0x4004, 0x82ff, 0x0120, 0x6810, - 0x8000, 0x6812, 0x0c60, 0x00de, 0x0005, 0x00f6, 0x00e6, 0x00d6, - 0x00c6, 0x00a6, 0x0096, 0x0066, 0x0126, 0x2091, 0x8000, 0x2071, - 0x19e8, 0x7610, 0x2660, 0x2678, 0x8cff, 0x0904, 0xacd9, 0x7030, - 0x9c06, 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0xacab, - 0x080c, 0xa2a0, 0x68c3, 0x0000, 0x080c, 0xa78a, 0x7033, 0x0000, - 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, - 0x0100, 0x080c, 0x2a99, 0x9006, 0x080c, 0x2a99, 0x2069, 0x0100, - 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x7010, 0x9c36, - 0x1110, 0x660c, 0x7612, 0x700c, 0x9c36, 0x1140, 0x2c00, 0x9f36, - 0x0118, 0x2f00, 0x700e, 0x0010, 0x700f, 0x0000, 0x660c, 0x0066, - 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, - 0x080c, 0xd121, 0x1180, 0x080c, 0x3344, 0x080c, 0xd132, 0x1518, - 0x080c, 0xbb5c, 0x0400, 0x080c, 0xa78a, 0x6824, 0xd084, 0x09b0, - 0x6827, 0x0001, 0x0898, 0x080c, 0xd132, 0x1118, 0x080c, 0xbb5c, - 0x0090, 0x6014, 0x2048, 0x080c, 0xcf19, 0x0168, 0x6020, 0x9086, - 0x0003, 0x1520, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, - 0x7012, 0x080c, 0xd10c, 0x080c, 0xd3ae, 0x080c, 0xb1a7, 0x080c, - 0xa65d, 0x00ce, 0x0804, 0xac5c, 0x2c78, 0x600c, 0x2060, 0x0804, - 0xac5c, 0x7013, 0x0000, 0x700f, 0x0000, 0x012e, 0x006e, 0x009e, - 0x00ae, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6020, 0x9086, - 0x0006, 0x1d08, 0x080c, 0xea30, 0x08f0, 0x00f6, 0x0036, 0x2079, - 0x0380, 0x7b18, 0xd3bc, 0x1de8, 0x7832, 0x7936, 0x7a3a, 0x781b, - 0x8080, 0x003e, 0x00fe, 0x0005, 0x0016, 0x2001, 0x0382, 0x2004, - 0x9084, 0x0007, 0x9086, 0x0001, 0x1188, 0x2001, 0x0015, 0x0c29, - 0x2009, 0x1000, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, - 0x0003, 0x0120, 0x8109, 0x1db0, 0x080c, 0x0d85, 0x001e, 0x0005, - 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, 0x0003, 0x1120, - 0x2001, 0x0380, 0x2003, 0x0001, 0x0005, 0x0156, 0x0016, 0x0026, - 0x00e6, 0x900e, 0x2071, 0x19e8, 0x0469, 0x0106, 0x0190, 0x7004, - 0x9086, 0x0003, 0x0148, 0x20a9, 0x1000, 0x6044, 0xd0fc, 0x01d8, - 0x1f04, 0xad35, 0x080c, 0x0d85, 0x080c, 0xacfc, 0x6044, 0xd0fc, - 0x0190, 0x7030, 0x9c06, 0x1148, 0x080c, 0x99ed, 0x6044, 0xd0dc, - 0x0150, 0xc0dc, 0x6046, 0x700a, 0x7042, 0x704c, 0x9c06, 0x190c, - 0x0d85, 0x080c, 0x9a48, 0x010e, 0x1919, 0x00ee, 0x002e, 0x001e, - 0x015e, 0x0005, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, - 0x0003, 0x0005, 0x0126, 0x2091, 0x2400, 0x7808, 0xd0a4, 0x190c, - 0x0d7e, 0xd09c, 0x0128, 0x7820, 0x908c, 0xf000, 0x11b8, 0x0012, - 0x012e, 0x0005, 0xad82, 0xadc0, 0xadef, 0xae37, 0xae47, 0xae58, - 0xae67, 0xae75, 0xaea2, 0xaea6, 0xad82, 0xad82, 0xaea9, 0xaec5, - 0xad82, 0xad82, 0x080c, 0x0d85, 0x012e, 0x0005, 0x2060, 0x6044, - 0xd0bc, 0x0140, 0xc0bc, 0x6046, 0x6000, 0x908a, 0x0010, 0x1a0c, - 0x0d85, 0x0012, 0x012e, 0x0005, 0xada7, 0xada9, 0xada7, 0xadaf, - 0xada7, 0xada7, 0xada7, 0xada7, 0xada7, 0xada9, 0xada7, 0xada9, - 0xada7, 0xada9, 0xada7, 0xada7, 0xada7, 0xada9, 0xada7, 0x080c, - 0x0d85, 0x2009, 0x0013, 0x080c, 0xb20a, 0x012e, 0x0005, 0x6014, - 0x2048, 0xa87c, 0xd0dc, 0x0130, 0x080c, 0x8c19, 0x080c, 0xb16c, - 0x012e, 0x0005, 0x2009, 0x0049, 0x080c, 0xb20a, 0x012e, 0x0005, - 0x080c, 0xacfc, 0x2001, 0x1a0d, 0x2003, 0x0000, 0x7030, 0x9065, - 0x1130, 0x7004, 0x9086, 0x0003, 0x01e0, 0x080c, 0x0d85, 0x7034, - 0x9092, 0xc350, 0x1258, 0x8000, 0x7036, 0x7004, 0x9086, 0x0003, - 0x0110, 0x7007, 0x0000, 0x781f, 0x0808, 0x0058, 0x080c, 0xb0c0, - 0x0140, 0x080c, 0xeeee, 0x6003, 0x0001, 0x2009, 0x0014, 0x080c, - 0xb20a, 0x781f, 0x0100, 0x080c, 0xad18, 0x012e, 0x0005, 0x080c, - 0xacfc, 0x714c, 0x81ff, 0x1128, 0x2011, 0x1a10, 0x2013, 0x0000, - 0x04c0, 0x2061, 0x0100, 0x7150, 0x9192, 0x7530, 0x1678, 0x8108, - 0x7152, 0x714c, 0x9186, 0x1b55, 0x0120, 0x2001, 0x0391, 0x2003, - 0x0400, 0x9188, 0x0008, 0x210c, 0x918e, 0x0006, 0x1160, 0x6014, - 0x9084, 0x1984, 0x9085, 0x0012, 0x714c, 0x918e, 0x1b55, 0x1108, - 0xc0fd, 0x6016, 0x00b0, 0x714c, 0x9188, 0x0008, 0x210c, 0x918e, - 0x0009, 0x0d68, 0x6014, 0x9084, 0x1984, 0x9085, 0x0016, 0x714c, - 0x918e, 0x1b55, 0x1108, 0xc0fd, 0x6016, 0x0018, 0x706c, 0xc085, - 0x706e, 0x781f, 0x0200, 0x080c, 0xad18, 0x012e, 0x0005, 0x080c, - 0xacfc, 0x714c, 0x2160, 0x6003, 0x0003, 0x2009, 0x004a, 0x080c, - 0xb20a, 0x781f, 0x0200, 0x080c, 0xad18, 0x012e, 0x0005, 0x7808, - 0xd09c, 0x0de8, 0x7820, 0x2060, 0x6003, 0x0003, 0x080c, 0xacfc, - 0x080c, 0x1dcc, 0x781f, 0x0400, 0x080c, 0xad18, 0x012e, 0x0005, - 0x7808, 0xd09c, 0x0de8, 0x7820, 0x2060, 0x080c, 0xacfc, 0x080c, - 0x1e14, 0x781f, 0x0400, 0x080c, 0xad18, 0x012e, 0x0005, 0x7030, - 0x9065, 0x0148, 0x6044, 0xc0bc, 0x6046, 0x7104, 0x9186, 0x0003, - 0x0110, 0x080c, 0x9ab4, 0x012e, 0x0005, 0x00f6, 0x703c, 0x9086, - 0x0002, 0x0528, 0x704c, 0x907d, 0x0510, 0x7844, 0xc0bc, 0x7846, - 0x7820, 0x9086, 0x0009, 0x0118, 0x080c, 0xa1ca, 0x00c0, 0x7828, - 0xd0fc, 0x1118, 0x080c, 0xa149, 0x0090, 0x2001, 0x1837, 0x2004, - 0x9084, 0x0028, 0x1130, 0x2001, 0x197c, 0x2004, 0x9086, 0xaaaa, - 0x1120, 0x2001, 0x0387, 0x2003, 0x1000, 0x080c, 0xa0ce, 0x00fe, - 0x012e, 0x0005, 0x080c, 0x7840, 0x012e, 0x0005, 0x080c, 0x0d85, - 0x0005, 0x2009, 0x1b66, 0x2104, 0xd0bc, 0x01a8, 0xc0bc, 0x200a, - 0x2009, 0x010b, 0x2104, 0x9085, 0x0002, 0x200a, 0x2009, 0x0101, - 0x2104, 0xc0ac, 0x200a, 0x2009, 0x0105, 0x2104, 0x9084, 0x1984, - 0x9085, 0x8092, 0x200a, 0x012e, 0x0005, 0x080c, 0x8a58, 0x2009, - 0x010b, 0x2104, 0xd08c, 0x01a8, 0xc08c, 0x200a, 0x2001, 0x1848, - 0x2004, 0xd094, 0x1130, 0x2009, 0x0101, 0x2104, 0x9085, 0x0020, - 0x200a, 0x2009, 0x1b66, 0x200b, 0x0000, 0x2001, 0x001b, 0x080c, - 0xaced, 0x012e, 0x0005, 0x00e6, 0x2071, 0x19e8, 0x6044, 0xc0bc, - 0x6046, 0xd0fc, 0x01b8, 0x704c, 0x9c06, 0x1190, 0x2019, 0x0001, - 0x080c, 0xa596, 0x704f, 0x0000, 0x2001, 0x0109, 0x2004, 0xd08c, - 0x1138, 0x2001, 0x0108, 0x2004, 0xd0bc, 0x1110, 0x703f, 0x0000, - 0x080c, 0xa7a1, 0x00ee, 0x0005, 0x0026, 0x7010, 0x9c06, 0x1178, - 0x080c, 0xa65d, 0x6044, 0xc0fc, 0x6046, 0x600c, 0x9015, 0x0120, - 0x7212, 0x600f, 0x0000, 0x0010, 0x7212, 0x720e, 0x9006, 0x002e, - 0x0005, 0x0026, 0x7020, 0x9c06, 0x1178, 0x080c, 0xa65d, 0x6044, - 0xc0fc, 0x6046, 0x600c, 0x9015, 0x0120, 0x7222, 0x600f, 0x0000, - 0x0010, 0x7222, 0x721e, 0x9006, 0x002e, 0x0005, 0x00d6, 0x0036, - 0x7830, 0x9c06, 0x1558, 0x2069, 0x0100, 0x68c0, 0x9005, 0x01f8, - 0x080c, 0x8a4b, 0x080c, 0xa2a0, 0x68c3, 0x0000, 0x080c, 0xa78a, - 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, - 0x080c, 0x2a99, 0x9006, 0x080c, 0x2a99, 0x2069, 0x0100, 0x6824, - 0xd084, 0x0110, 0x6827, 0x0001, 0x9085, 0x0001, 0x0038, 0x7808, - 0xc0ad, 0x780a, 0x6003, 0x0009, 0x630a, 0x9006, 0x003e, 0x00de, - 0x0005, 0x0016, 0x0026, 0x0036, 0x6100, 0x2019, 0x0100, 0x2001, - 0x0382, 0x2004, 0xd09c, 0x0190, 0x00c6, 0x0126, 0x2091, 0x2800, - 0x0016, 0x0036, 0x080c, 0xad62, 0x003e, 0x001e, 0x012e, 0x00ce, - 0x6200, 0x2200, 0x9106, 0x0d58, 0x2200, 0x0010, 0x8319, 0x1d38, - 0x003e, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00d6, 0x00c6, 0x080c, - 0xacfc, 0x0106, 0x2071, 0x19e8, 0x2069, 0x0100, 0x704c, 0x2060, - 0x9086, 0x1b55, 0x15b8, 0x6814, 0xd08c, 0x0188, 0x6817, 0x0010, - 0x2009, 0x0019, 0x8109, 0x1df0, 0x2001, 0x0032, 0x6920, 0xd1bc, - 0x0130, 0x8001, 0x1dd8, 0x692c, 0x918d, 0x0008, 0x692e, 0x6824, - 0xd08c, 0x0110, 0x6827, 0x0002, 0x68d0, 0x9005, 0x0118, 0x9082, - 0x0005, 0x0238, 0x6060, 0x8000, 0x6062, 0x2001, 0x0391, 0x2003, - 0x0400, 0x080c, 0x9a48, 0x682c, 0x9084, 0xfffd, 0x682e, 0x2001, - 0x1848, 0x2004, 0xd094, 0x1120, 0x6804, 0x9085, 0x0020, 0x6806, - 0x2069, 0x0000, 0x010e, 0x090c, 0xad18, 0x8dff, 0x00ce, 0x00de, - 0x00ee, 0x0005, 0x00e6, 0x00d6, 0x00c6, 0x080c, 0xacfc, 0x0106, - 0x2071, 0x19e8, 0x2069, 0x0100, 0x080c, 0xaf84, 0x68d0, 0x9005, - 0x0158, 0x9082, 0x0005, 0x1240, 0x080c, 0x2b33, 0x2001, 0x0391, - 0x2003, 0x0400, 0x2069, 0x0000, 0x010e, 0x090c, 0xad18, 0x8dff, - 0x00ce, 0x00de, 0x00ee, 0x0005, 0x0016, 0x2001, 0x0134, 0x2004, - 0x9005, 0x0140, 0x9082, 0x0005, 0x1228, 0x2001, 0x0391, 0x2003, - 0x0404, 0x0020, 0x2001, 0x0391, 0x2003, 0x0400, 0x001e, 0x0005, - 0x00d6, 0x0156, 0x080c, 0x9f43, 0x7a14, 0x82ff, 0x0138, 0x7003, - 0x0100, 0x700b, 0x0003, 0x60c3, 0x0008, 0x0490, 0x7003, 0x0200, - 0x7007, 0x0000, 0x2069, 0x1800, 0x901e, 0x6800, 0x9086, 0x0004, - 0x1110, 0xc38d, 0x0060, 0x080c, 0x779e, 0x1110, 0xc3ad, 0x0008, - 0xc3a5, 0x6adc, 0xd29c, 0x1110, 0xd2ac, 0x0108, 0xc39d, 0x730e, - 0x080c, 0x8b10, 0x20a9, 0x0006, 0x2011, 0xffec, 0x2019, 0xffed, - 0x2071, 0x0250, 0x2305, 0x2072, 0x8e70, 0x2205, 0x2072, 0x8e70, - 0x9398, 0x0002, 0x9290, 0x0002, 0x1f04, 0xb03a, 0x60c3, 0x0020, - 0x080c, 0xa270, 0x015e, 0x00de, 0x0005, 0x0156, 0x080c, 0x9f43, - 0x7a14, 0x82ff, 0x0168, 0x9286, 0xffff, 0x0118, 0x9282, 0x000e, - 0x1238, 0x7003, 0x0100, 0x700b, 0x0003, 0x60c3, 0x0008, 0x0488, - 0x7003, 0x0200, 0x7007, 0x001c, 0x700f, 0x0001, 0x2011, 0x19be, - 0x2204, 0x8007, 0x701a, 0x8210, 0x2204, 0x8007, 0x701e, 0x0421, - 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, 0x181f, 0x2004, - 0x7022, 0x2001, 0x1820, 0x2004, 0x7026, 0x0030, 0x2001, 0x1818, - 0x2004, 0x9084, 0x00ff, 0x7026, 0x20a9, 0x0004, 0x20e1, 0x0001, - 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, 0x60c3, - 0x001c, 0x015e, 0x0804, 0xa270, 0x0006, 0x2001, 0x1837, 0x2004, - 0xd0ac, 0x000e, 0x0005, 0x2011, 0x0003, 0x080c, 0xa62b, 0x2011, - 0x0002, 0x080c, 0xa635, 0x080c, 0xa516, 0x0036, 0x901e, 0x080c, - 0xa596, 0x003e, 0x0005, 0x080c, 0x3487, 0x0188, 0x0016, 0x00b6, - 0x00c6, 0x7010, 0x9085, 0x0020, 0x7012, 0x2009, 0x007e, 0x080c, - 0x67b4, 0xb85c, 0xc0ac, 0xb85e, 0x00ce, 0x00be, 0x001e, 0x0005, - 0x00d6, 0x00f6, 0x7104, 0x9186, 0x0004, 0x1130, 0x7410, 0x9e90, - 0x0004, 0x9e98, 0x0003, 0x0088, 0x9186, 0x0001, 0x1130, 0x7420, - 0x9e90, 0x0008, 0x9e98, 0x0007, 0x0040, 0x9186, 0x0002, 0x1538, - 0x7428, 0x9e90, 0x000a, 0x9e98, 0x0009, 0x6110, 0x2468, 0x680c, - 0x907d, 0x01e8, 0x7810, 0x9106, 0x1128, 0x2f68, 0x780c, 0x907d, - 0x1dc8, 0x00a8, 0x780c, 0x680e, 0x7c0e, 0x2f12, 0x2304, 0x9f06, - 0x1108, 0x2d1a, 0x9006, 0x7032, 0x7036, 0x7004, 0x9086, 0x0003, - 0x0110, 0x7007, 0x0000, 0x9006, 0x00fe, 0x00de, 0x0005, 0x9085, - 0x0001, 0x0cd0, 0x2071, 0x188d, 0x7000, 0x9005, 0x0140, 0x2001, - 0x0812, 0x2071, 0x1800, 0x7076, 0x707a, 0x706b, 0xffd4, 0x2071, - 0x1800, 0x7074, 0x7056, 0x705b, 0x1ddc, 0x0005, 0x00e6, 0x0126, - 0x2071, 0x1800, 0x2091, 0x8000, 0x7554, 0x9582, 0x0010, 0x0608, - 0x7058, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x001c, - 0x7068, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1ddc, 0x0c98, 0x6003, - 0x0008, 0x8529, 0x7556, 0x9ca8, 0x001c, 0x7068, 0x9502, 0x1230, - 0x755a, 0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x705b, 0x1ddc, - 0x0cc0, 0x9006, 0x0cc0, 0x00e6, 0x2071, 0x1800, 0x7554, 0x9582, - 0x0010, 0x0600, 0x7058, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, - 0x9ce0, 0x001c, 0x7068, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1ddc, - 0x0c98, 0x6003, 0x0008, 0x8529, 0x7556, 0x9ca8, 0x001c, 0x7068, - 0x9502, 0x1228, 0x755a, 0x9085, 0x0001, 0x00ee, 0x0005, 0x705b, - 0x1ddc, 0x0cc8, 0x9006, 0x0cc8, 0x9c82, 0x1ddc, 0x0a0c, 0x0d85, - 0x2001, 0x181a, 0x2004, 0x9c02, 0x1a0c, 0x0d85, 0x9006, 0x6006, - 0x600a, 0x600e, 0x6016, 0x601a, 0x6012, 0x6023, 0x0000, 0x6003, - 0x0000, 0x601e, 0x605e, 0x6062, 0x6026, 0x602a, 0x602e, 0x6032, - 0x6036, 0x603a, 0x603e, 0x604a, 0x602a, 0x6046, 0x6042, 0x2061, - 0x1800, 0x6054, 0x8000, 0x6056, 0x0005, 0x9006, 0x600e, 0x6016, - 0x601a, 0x6012, 0x6022, 0x6002, 0x601e, 0x605e, 0x6062, 0x604a, - 0x6046, 0x2061, 0x1800, 0x6054, 0x8000, 0x6056, 0x0005, 0x0006, - 0x6000, 0x9086, 0x0000, 0x01d8, 0x601c, 0xd084, 0x190c, 0x1ad3, - 0x6023, 0x0007, 0x2001, 0x1986, 0x2004, 0x0006, 0x9082, 0x0051, - 0x000e, 0x0208, 0x8004, 0x601a, 0x080c, 0xece1, 0x604b, 0x0000, - 0x6044, 0xd0fc, 0x1131, 0x9006, 0x6046, 0x6016, 0x6012, 0x000e, - 0x0005, 0x080c, 0xacfc, 0x0106, 0x2001, 0x19fb, 0x2004, 0x9c06, - 0x1130, 0x0036, 0x2019, 0x0001, 0x080c, 0xa596, 0x003e, 0x080c, - 0xa7a1, 0x010e, 0x090c, 0xad18, 0x0005, 0x00e6, 0x0126, 0x2071, - 0x1800, 0x2091, 0x8000, 0x7554, 0x9582, 0x0001, 0x0608, 0x7058, - 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x001c, 0x7068, - 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1ddc, 0x0c98, 0x6003, 0x0008, - 0x8529, 0x7556, 0x9ca8, 0x001c, 0x7068, 0x9502, 0x1230, 0x755a, - 0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x705b, 0x1ddc, 0x0cc0, - 0x9006, 0x0cc0, 0x6020, 0x9084, 0x000f, 0x0002, 0xb21e, 0xb228, - 0xb243, 0xb25e, 0xd69a, 0xd6b7, 0xd6d2, 0xb21e, 0xb228, 0x92f7, - 0xb277, 0xb21e, 0xb21e, 0xb21e, 0xb21e, 0xb21e, 0x9186, 0x0013, - 0x1130, 0x6044, 0xd0fc, 0x0110, 0x080c, 0x99ed, 0x0005, 0x0005, - 0x0066, 0x6000, 0x90b2, 0x0010, 0x1a0c, 0x0d85, 0x0013, 0x006e, - 0x0005, 0xb241, 0xb9bc, 0xbba3, 0xb241, 0xbc39, 0xb540, 0xb241, - 0xb241, 0xb93e, 0xc25a, 0xb241, 0xb241, 0xb241, 0xb241, 0xb241, - 0xb241, 0x080c, 0x0d85, 0x0066, 0x6000, 0x90b2, 0x0010, 0x1a0c, - 0x0d85, 0x0013, 0x006e, 0x0005, 0xb25c, 0xc875, 0xb25c, 0xb25c, - 0xb25c, 0xb25c, 0xb25c, 0xb25c, 0xc80c, 0xc9f8, 0xb25c, 0xc8b2, - 0xc936, 0xc8b2, 0xc936, 0xb25c, 0x080c, 0x0d85, 0x6000, 0x9082, - 0x0010, 0x1a0c, 0x0d85, 0x6000, 0x0002, 0xb275, 0xc2a4, 0xc33e, - 0xc4c1, 0xc530, 0xb275, 0xb275, 0xb275, 0xc273, 0xc78d, 0xc790, - 0xb275, 0xb275, 0xb275, 0xb275, 0xc7c0, 0x080c, 0x0d85, 0x0066, - 0x6000, 0x90b2, 0x0010, 0x1a0c, 0x0d85, 0x0013, 0x006e, 0x0005, - 0xb290, 0xb290, 0xb2ce, 0xb36d, 0xb3ed, 0xb290, 0xb290, 0xb290, - 0xb292, 0xb290, 0xb290, 0xb290, 0xb290, 0xb290, 0xb290, 0xb290, - 0x080c, 0x0d85, 0x9186, 0x004c, 0x0560, 0x9186, 0x0003, 0x190c, - 0x0d85, 0x0096, 0x601c, 0xc0ed, 0x601e, 0x6003, 0x0003, 0x6106, - 0x6014, 0x2048, 0xa87c, 0x9084, 0xa000, 0xc0b5, 0xa87e, 0xa8ac, - 0xa836, 0xa8b0, 0xa83a, 0x9006, 0xa846, 0xa84a, 0xa884, 0x9092, - 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x8013, 0x8213, 0x9210, - 0x621a, 0x009e, 0x080c, 0x1c26, 0x2009, 0x8030, 0x080c, 0x965e, - 0x0005, 0x6010, 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x080c, - 0xb40f, 0x080c, 0xd65d, 0x6003, 0x0007, 0x0005, 0x00d6, 0x0096, - 0x00f6, 0x2079, 0x1800, 0x7a90, 0x6014, 0x2048, 0xa87c, 0xd0ec, - 0x1110, 0x9290, 0x0018, 0xac78, 0xc4fc, 0x0046, 0xa8e0, 0x9005, - 0x1140, 0xa8dc, 0x921a, 0x0140, 0x0220, 0xa87b, 0x0007, 0x2010, - 0x0028, 0xa87b, 0x0015, 0x0010, 0xa87b, 0x0000, 0x8214, 0xa883, - 0x0000, 0xaa02, 0x0006, 0x0016, 0x0026, 0x00c6, 0x00d6, 0x00e6, - 0x00f6, 0x2400, 0x9005, 0x1108, 0x009a, 0x2100, 0x9086, 0x0015, - 0x1118, 0x2001, 0x0001, 0x0038, 0x2100, 0x9086, 0x0016, 0x0118, - 0x2001, 0x0001, 0x002a, 0x94a4, 0x0007, 0x8423, 0x9405, 0x0002, - 0xb335, 0xb335, 0xb330, 0xb333, 0xb335, 0xb32d, 0xb320, 0xb320, - 0xb320, 0xb320, 0xb320, 0xb320, 0xb320, 0xb320, 0xb320, 0xb320, - 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, 0x000e, 0x004e, - 0x00fe, 0x009e, 0x00de, 0x080c, 0x0d85, 0x080c, 0xbe51, 0x0028, - 0x080c, 0xbf8f, 0x0010, 0x080c, 0xc085, 0x00fe, 0x00ee, 0x00de, - 0x00ce, 0x002e, 0x001e, 0x2c00, 0xa896, 0x000e, 0x080c, 0xb4cd, - 0x0530, 0xa804, 0xa80e, 0x00a6, 0x2050, 0xb100, 0x00ae, 0x8006, - 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, - 0xaacc, 0xabd0, 0xacd4, 0xadd8, 0x2031, 0x0000, 0x2041, 0x12c2, - 0x080c, 0xb691, 0x0160, 0x000e, 0x9005, 0x0120, 0x00fe, 0x009e, - 0x00de, 0x0005, 0x00fe, 0x009e, 0x00de, 0x0804, 0xb16c, 0x2001, - 0x002c, 0x900e, 0x080c, 0xb533, 0x0c70, 0x91b6, 0x0015, 0x0170, - 0x91b6, 0x0016, 0x0158, 0x91b2, 0x0047, 0x0a0c, 0x0d85, 0x91b2, - 0x0050, 0x1a0c, 0x0d85, 0x9182, 0x0047, 0x0042, 0x080c, 0xaf61, - 0x0120, 0x9086, 0x0002, 0x0904, 0xb2ce, 0x0005, 0xb38f, 0xb38f, - 0xb391, 0xb3c3, 0xb38f, 0xb38f, 0xb38f, 0xb38f, 0xb3d6, 0x080c, - 0x0d85, 0x00d6, 0x0016, 0x0096, 0x6003, 0x0004, 0x6114, 0x2148, - 0xa87c, 0xd0fc, 0x01c0, 0xa878, 0xc0fc, 0x9005, 0x1158, 0xa894, - 0x9005, 0x0140, 0x2001, 0x0000, 0x900e, 0x080c, 0xb533, 0x080c, - 0xb16c, 0x00a8, 0x6003, 0x0002, 0xa8a4, 0xa9a8, 0x9105, 0x1178, - 0xa8ae, 0xa8b2, 0x0c78, 0xa87f, 0x0020, 0xa88c, 0xa88a, 0xa8a4, - 0xa8ae, 0xa8a8, 0xa8b2, 0xa8c7, 0x0000, 0xa8cb, 0x0000, 0x009e, - 0x001e, 0x00de, 0x0005, 0x080c, 0x9a48, 0x00d6, 0x0096, 0x6114, - 0x2148, 0x080c, 0xcf1b, 0x0120, 0xa87b, 0x0006, 0x080c, 0x7012, - 0x009e, 0x00de, 0x080c, 0xb16c, 0x0804, 0x9ab3, 0x080c, 0x9a48, - 0x080c, 0x3315, 0x080c, 0xd65a, 0x00d6, 0x0096, 0x6114, 0x2148, - 0x080c, 0xcf1b, 0x0120, 0xa87b, 0x0029, 0x080c, 0x7012, 0x009e, - 0x00de, 0x080c, 0xb16c, 0x0804, 0x9ab3, 0x9182, 0x0047, 0x0002, - 0xb3fd, 0xb3ff, 0xb3fd, 0xb3fd, 0xb3fd, 0xb3fd, 0xb3fd, 0xb3fd, - 0xb3fd, 0xb3fd, 0xb3fd, 0xb3fd, 0xb3ff, 0x080c, 0x0d85, 0x00d6, - 0x0096, 0x601f, 0x0000, 0x6114, 0x2148, 0xa87b, 0x0000, 0xa883, - 0x0000, 0x080c, 0x7012, 0x009e, 0x00de, 0x0804, 0xb16c, 0x0026, - 0x0036, 0x0056, 0x0066, 0x0096, 0x00a6, 0x00f6, 0x0006, 0x080c, - 0x1059, 0x000e, 0x090c, 0x0d85, 0xa960, 0x21e8, 0xa95c, 0x9188, - 0x0019, 0x21a0, 0x900e, 0x20a9, 0x0020, 0x4104, 0xa87a, 0x2079, - 0x1800, 0x7990, 0x9188, 0x0018, 0x918c, 0x0fff, 0xa972, 0xac76, - 0x2950, 0x00a6, 0x2001, 0x0205, 0x2003, 0x0000, 0x901e, 0x2029, - 0x0001, 0x9182, 0x0035, 0x1228, 0x2011, 0x001f, 0x080c, 0xca7b, - 0x04c0, 0x2130, 0x2009, 0x0034, 0x2011, 0x001f, 0x080c, 0xca7b, - 0x96b2, 0x0034, 0xb004, 0x904d, 0x0110, 0x080c, 0x100b, 0x080c, - 0x1059, 0x01d0, 0x8528, 0xa867, 0x0110, 0xa86b, 0x0000, 0x2920, - 0xb406, 0x968a, 0x003d, 0x1230, 0x2608, 0x2011, 0x001b, 0x080c, - 0xca7b, 0x00b8, 0x96b2, 0x003c, 0x2009, 0x003c, 0x2950, 0x2011, - 0x001b, 0x080c, 0xca7b, 0x0c18, 0x2001, 0x0205, 0x2003, 0x0000, - 0x00ae, 0x852f, 0x95ad, 0x0050, 0xb566, 0xb070, 0xc0fd, 0xb072, - 0x0048, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, - 0x0050, 0xb566, 0x2a48, 0xa804, 0xa807, 0x0000, 0x0006, 0x080c, - 0x7012, 0x000e, 0x2048, 0x9005, 0x1db0, 0x00fe, 0x00ae, 0x009e, - 0x006e, 0x005e, 0x003e, 0x002e, 0x0005, 0x00d6, 0x00f6, 0x0096, - 0x0006, 0x080c, 0x1059, 0x000e, 0x090c, 0x0d85, 0xa960, 0x21e8, - 0xa95c, 0x9188, 0x0019, 0x21a0, 0x900e, 0x20a9, 0x0020, 0x4104, - 0xaa66, 0xa87a, 0x2079, 0x1800, 0x7990, 0x810c, 0x9188, 0x000c, - 0x9182, 0x001a, 0x0210, 0x2009, 0x001a, 0x21a8, 0x810b, 0xa972, - 0xac76, 0x2e98, 0xa85c, 0x9080, 0x001f, 0x20a0, 0x2001, 0x0205, - 0x200c, 0x918d, 0x0080, 0x2102, 0x4003, 0x2003, 0x0000, 0x080c, - 0x7012, 0x009e, 0x00fe, 0x00de, 0x0005, 0x0016, 0x00d6, 0x00f6, - 0x0096, 0x0016, 0x2001, 0x0205, 0x200c, 0x918d, 0x0080, 0x2102, - 0x001e, 0x2079, 0x0200, 0x2e98, 0xa87c, 0xd0ec, 0x0118, 0x9e80, - 0x000c, 0x2098, 0x2021, 0x003e, 0x901e, 0x9282, 0x0020, 0x0218, - 0x2011, 0x0020, 0x2018, 0x9486, 0x003e, 0x1170, 0x0096, 0x080c, - 0x1059, 0x2900, 0x009e, 0x05c0, 0xa806, 0x2048, 0xa860, 0x20e8, - 0xa85c, 0x9080, 0x0002, 0x20a0, 0x3300, 0x908e, 0x0260, 0x0140, - 0x2009, 0x0280, 0x9102, 0x920a, 0x0218, 0x2010, 0x2100, 0x9318, - 0x2200, 0x9402, 0x1228, 0x2400, 0x9202, 0x2410, 0x9318, 0x9006, - 0x2020, 0x22a8, 0xa800, 0x9200, 0xa802, 0x20e1, 0x0000, 0x4003, - 0x83ff, 0x0180, 0x3300, 0x9086, 0x0280, 0x1130, 0x7814, 0x8000, - 0x9085, 0x0080, 0x7816, 0x2e98, 0x2310, 0x84ff, 0x0904, 0xb4e2, - 0x0804, 0xb4e4, 0x9085, 0x0001, 0x7817, 0x0000, 0x009e, 0x00fe, - 0x00de, 0x001e, 0x0005, 0x00d6, 0x0036, 0x0096, 0x6314, 0x2348, - 0xa87a, 0xa982, 0x080c, 0x7006, 0x009e, 0x003e, 0x00de, 0x0005, - 0x91b6, 0x0015, 0x1118, 0x080c, 0xb16c, 0x0030, 0x91b6, 0x0016, - 0x190c, 0x0d85, 0x080c, 0xb16c, 0x0005, 0x20a9, 0x000e, 0x20e1, - 0x0000, 0x2e98, 0x6014, 0x0096, 0x2048, 0xa860, 0x20e8, 0xa85c, - 0x20a0, 0x009e, 0x4003, 0x9196, 0x0016, 0x01f0, 0x0136, 0x9080, - 0x001b, 0x20a0, 0x2011, 0x0006, 0x20a9, 0x0001, 0x3418, 0x8318, - 0x23a0, 0x4003, 0x3318, 0x8318, 0x2398, 0x8211, 0x1db8, 0x2011, - 0x0006, 0x013e, 0x20a0, 0x3318, 0x8318, 0x2398, 0x4003, 0x3418, - 0x8318, 0x23a0, 0x8211, 0x1db8, 0x0096, 0x080c, 0xcf1b, 0x0130, - 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0x009e, 0x0804, - 0xb16c, 0x0096, 0x00d6, 0x0036, 0x7330, 0x9386, 0x0200, 0x11a8, - 0x6010, 0x00b6, 0x2058, 0xb8d7, 0x0000, 0x00be, 0x6014, 0x9005, - 0x0130, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xab32, 0x080c, - 0xb16c, 0x003e, 0x00de, 0x009e, 0x0005, 0x0011, 0x1d48, 0x0cc8, - 0x0006, 0x0016, 0x080c, 0xd645, 0x0188, 0x6014, 0x9005, 0x1170, - 0x600b, 0x0003, 0x601b, 0x0000, 0x604b, 0x0000, 0x2009, 0x0022, - 0x080c, 0xb994, 0x9006, 0x001e, 0x000e, 0x0005, 0x9085, 0x0001, - 0x0cd0, 0x0096, 0x0016, 0x20a9, 0x0014, 0x9e80, 0x000c, 0x20e1, - 0x0000, 0x2098, 0x6014, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080, - 0x0002, 0x20a0, 0x4003, 0x2001, 0x0205, 0x2003, 0x0001, 0x2099, - 0x0260, 0x20a9, 0x0016, 0x4003, 0x20a9, 0x000a, 0xa804, 0x2048, - 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x2001, - 0x0205, 0x2003, 0x0002, 0x2099, 0x0260, 0x20a9, 0x0020, 0x4003, - 0x2003, 0x0000, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, 0x0103, - 0x080c, 0xb16c, 0x001e, 0x009e, 0x0005, 0x0096, 0x0016, 0x900e, - 0x7030, 0x9086, 0x0100, 0x0140, 0x7038, 0x9084, 0x00ff, 0x800c, - 0x703c, 0x9084, 0x00ff, 0x8004, 0x9080, 0x0004, 0x9108, 0x810b, - 0x2011, 0x0002, 0x2019, 0x000c, 0x6014, 0x2048, 0x080c, 0xca7b, - 0x080c, 0xcf1b, 0x0140, 0x6014, 0x2048, 0xa807, 0x0000, 0xa864, - 0xa8e2, 0xa867, 0x0103, 0x080c, 0xb16c, 0x001e, 0x009e, 0x0005, - 0x0016, 0x2009, 0x0000, 0x7030, 0x9086, 0x0200, 0x0110, 0x2009, - 0x0001, 0x0096, 0x6014, 0x904d, 0x090c, 0x0d85, 0xa97a, 0x080c, - 0x7012, 0x009e, 0x080c, 0xb16c, 0x001e, 0x0005, 0x0016, 0x0096, - 0x7030, 0x9086, 0x0100, 0x1118, 0x2009, 0x0004, 0x0010, 0x7034, - 0x800c, 0x810b, 0x2011, 0x000c, 0x2019, 0x000c, 0x6014, 0x2048, - 0xa804, 0x0096, 0x9005, 0x0108, 0x2048, 0x080c, 0xca7b, 0x009e, - 0x080c, 0xcf1b, 0x0148, 0xa804, 0x9005, 0x1158, 0xa807, 0x0000, - 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c, 0xb16c, 0x009e, 0x001e, - 0x0005, 0x0086, 0x2040, 0xa030, 0x8007, 0x9086, 0x0100, 0x1118, - 0x080c, 0xbb5c, 0x00e0, 0xa034, 0x8007, 0x800c, 0x8806, 0x8006, - 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x000c, 0xa87b, - 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0xaaa0, 0xab9c, 0xaca8, - 0xada4, 0x2031, 0x0000, 0x2041, 0x12a8, 0x0019, 0x0d08, 0x008e, - 0x0898, 0x0096, 0x0006, 0x080c, 0x1059, 0x000e, 0x01b0, 0xa8ab, - 0x0dcb, 0xa876, 0x000e, 0xa8a2, 0x0006, 0xae6a, 0x2800, 0xa89e, - 0xa97a, 0xaf72, 0xaa8e, 0xab92, 0xac96, 0xad9a, 0x0086, 0x2940, - 0x080c, 0x114e, 0x008e, 0x9085, 0x0001, 0x009e, 0x0005, 0x00e6, - 0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210, 0x00b6, 0x2258, - 0xba10, 0x00be, 0x9206, 0x1520, 0x700c, 0x6210, 0x00b6, 0x2258, - 0xba14, 0x00be, 0x9206, 0x11e0, 0x604b, 0x0000, 0x2c68, 0x0016, - 0x2009, 0x0035, 0x080c, 0xd5bb, 0x001e, 0x1158, 0x622c, 0x2268, - 0x2071, 0x026c, 0x6b20, 0x9386, 0x0003, 0x0130, 0x9386, 0x0006, - 0x0128, 0x080c, 0xb16c, 0x0020, 0x0039, 0x0010, 0x080c, 0xb7c7, - 0x002e, 0x00de, 0x00ee, 0x0005, 0x0096, 0x6814, 0x2048, 0x9186, - 0x0015, 0x0904, 0xb7a6, 0x918e, 0x0016, 0x1904, 0xb7c5, 0x700c, - 0x908c, 0xff00, 0x9186, 0x1700, 0x0120, 0x9186, 0x0300, 0x1904, - 0xb780, 0x89ff, 0x1138, 0x6800, 0x9086, 0x000f, 0x0904, 0xb762, - 0x0804, 0xb7c3, 0x6808, 0x9086, 0xffff, 0x1904, 0xb7a8, 0xa87c, - 0x9084, 0x0060, 0x9086, 0x0020, 0x1150, 0xa8ac, 0xa934, 0x9106, - 0x1904, 0xb7a8, 0xa8b0, 0xa938, 0x9106, 0x1904, 0xb7a8, 0x6824, - 0xd084, 0x1904, 0xb7a8, 0xd0b4, 0x0158, 0x0016, 0x2001, 0x1986, - 0x200c, 0x6018, 0x9102, 0x9082, 0x0005, 0x001e, 0x1a04, 0xb7a8, - 0x080c, 0xd10c, 0x6810, 0x0096, 0x2048, 0xa9a0, 0x009e, 0x685c, - 0xa87a, 0xa976, 0x6864, 0xa882, 0xa87c, 0xc0dc, 0xc0f4, 0xc0d4, - 0xa87e, 0x0026, 0x900e, 0x6a18, 0x2001, 0x000a, 0x080c, 0x955b, - 0xa884, 0x920a, 0x0208, 0x8011, 0xaa86, 0x82ff, 0x002e, 0x1138, - 0x00c6, 0x2d60, 0x080c, 0xcc01, 0x00ce, 0x0804, 0xb7c3, 0x00c6, - 0xa868, 0xd0fc, 0x1118, 0x080c, 0x622f, 0x0010, 0x080c, 0x663a, - 0x00ce, 0x1904, 0xb7a8, 0x00c6, 0x2d60, 0x080c, 0xb16c, 0x00ce, - 0x0804, 0xb7c3, 0x00c6, 0x080c, 0xb1dd, 0x0198, 0x6017, 0x0000, - 0x6810, 0x6012, 0x080c, 0xd3b6, 0x6023, 0x0003, 0x6904, 0x00c6, - 0x2d60, 0x080c, 0xb16c, 0x00ce, 0x080c, 0xb20a, 0x00ce, 0x0804, - 0xb7c3, 0x2001, 0x1988, 0x2004, 0x684a, 0x00ce, 0x0804, 0xb7c3, - 0x7008, 0x9086, 0x000b, 0x11c8, 0x6010, 0x00b6, 0x2058, 0xb900, - 0xc1bc, 0xb902, 0x00be, 0x00c6, 0x2d60, 0xa87b, 0x0003, 0x080c, - 0xd5ff, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x2009, - 0x8020, 0x080c, 0x9617, 0x00ce, 0x0430, 0x700c, 0x9086, 0x2a00, - 0x1138, 0x2001, 0x1988, 0x2004, 0x684a, 0x00e8, 0x04c1, 0x00e8, - 0x89ff, 0x090c, 0x0d85, 0x00c6, 0x00d6, 0x2d60, 0xa867, 0x0103, - 0xa87b, 0x0003, 0x080c, 0x6e27, 0x080c, 0xd10c, 0x080c, 0xb1a7, - 0x0026, 0x6010, 0x00b6, 0x2058, 0xba3c, 0x080c, 0x68df, 0x00be, - 0x002e, 0x00de, 0x00ce, 0x080c, 0xb16c, 0x009e, 0x0005, 0x9186, - 0x0015, 0x1128, 0x2001, 0x1988, 0x2004, 0x684a, 0x0068, 0x918e, - 0x0016, 0x1160, 0x00c6, 0x2d00, 0x2060, 0x080c, 0xece1, 0x080c, - 0x8c19, 0x080c, 0xb16c, 0x00ce, 0x080c, 0xb16c, 0x0005, 0x0026, - 0x0036, 0x0046, 0x7228, 0xacb0, 0xabac, 0xd2f4, 0x0130, 0x2001, - 0x1988, 0x2004, 0x684a, 0x0804, 0xb841, 0x00c6, 0x2d60, 0x080c, - 0xcadc, 0x00ce, 0x6804, 0x9086, 0x0050, 0x1168, 0x00c6, 0x2d00, - 0x2060, 0x6003, 0x0001, 0x6007, 0x0050, 0x2009, 0x8023, 0x080c, - 0x9617, 0x00ce, 0x04f0, 0x6800, 0x9086, 0x000f, 0x01a8, 0x89ff, - 0x090c, 0x0d85, 0x6800, 0x9086, 0x0004, 0x1190, 0xa87c, 0xd0ac, - 0x0178, 0xa843, 0x0fff, 0xa83f, 0x0fff, 0xa880, 0xc0fc, 0xa882, - 0x2001, 0x0001, 0x6832, 0x0400, 0x2001, 0x0007, 0x6832, 0x00e0, - 0xa87c, 0xd0b4, 0x1150, 0xd0ac, 0x0db8, 0x6824, 0xd0f4, 0x1d48, - 0xa838, 0xa934, 0x9105, 0x0d80, 0x0c20, 0xd2ec, 0x1d68, 0x7024, - 0x9306, 0x1118, 0x7020, 0x9406, 0x0d38, 0x7020, 0x683e, 0x7024, - 0x683a, 0x2001, 0x0005, 0x6832, 0x080c, 0xd2a0, 0x080c, 0x9ab3, - 0x0010, 0x080c, 0xb16c, 0x004e, 0x003e, 0x002e, 0x0005, 0x00e6, - 0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210, 0x00b6, 0x2258, - 0xba10, 0x00be, 0x9206, 0x1904, 0xb8ac, 0x700c, 0x6210, 0x00b6, - 0x2258, 0xba14, 0x00be, 0x9206, 0x1904, 0xb8ac, 0x6038, 0x2068, - 0x6824, 0xc0dc, 0x6826, 0x6a20, 0x9286, 0x0007, 0x0904, 0xb8ac, - 0x9286, 0x0002, 0x0904, 0xb8ac, 0x9286, 0x0000, 0x05e8, 0x6808, - 0x633c, 0x9306, 0x15c8, 0x2071, 0x026c, 0x9186, 0x0015, 0x0570, - 0x918e, 0x0016, 0x1100, 0x00c6, 0x6038, 0x2060, 0x6104, 0x9186, - 0x004b, 0x01c0, 0x9186, 0x004c, 0x01a8, 0x9186, 0x004d, 0x0190, - 0x9186, 0x004e, 0x0178, 0x9186, 0x0052, 0x0160, 0x6014, 0x0096, - 0x2048, 0x080c, 0xcf1b, 0x090c, 0x0d85, 0xa87b, 0x0003, 0x009e, - 0x080c, 0xd5ff, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, - 0x2009, 0x8020, 0x080c, 0x9617, 0x00ce, 0x0030, 0x6038, 0x2070, - 0x2001, 0x1988, 0x2004, 0x704a, 0x080c, 0xb16c, 0x002e, 0x00de, - 0x00ee, 0x0005, 0x00b6, 0x0096, 0x00f6, 0x6014, 0x2048, 0x6010, - 0x2058, 0x91b6, 0x0015, 0x0130, 0xba08, 0xbb0c, 0xbc00, 0xc48c, - 0xbc02, 0x0470, 0x0096, 0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90, - 0x0010, 0x2019, 0x000a, 0x20a9, 0x0004, 0x080c, 0xc222, 0x002e, - 0x003e, 0x015e, 0x009e, 0x1904, 0xb91d, 0x0096, 0x0156, 0x0036, - 0x0026, 0x2b48, 0x9e90, 0x0014, 0x2019, 0x0006, 0x20a9, 0x0004, - 0x080c, 0xc222, 0x002e, 0x003e, 0x015e, 0x009e, 0x15b0, 0x7238, - 0xba0a, 0x733c, 0xbb0e, 0x83ff, 0x0118, 0xbc00, 0xc48d, 0xbc02, - 0xa804, 0x9005, 0x1128, 0x00fe, 0x009e, 0x00be, 0x0804, 0xb57c, - 0x0096, 0x2048, 0xaa12, 0xab16, 0xac0a, 0x009e, 0x8006, 0x8006, - 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2009, - 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, - 0x12a8, 0x080c, 0xb691, 0x0130, 0x00fe, 0x009e, 0x080c, 0xb16c, - 0x00be, 0x0005, 0x080c, 0xbb5c, 0x0cb8, 0x2b78, 0x00f6, 0x080c, - 0x3315, 0x080c, 0xd65a, 0x00fe, 0x00c6, 0x080c, 0xb116, 0x2f00, - 0x6012, 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, - 0x0001, 0x2001, 0x0007, 0x080c, 0x66fa, 0x080c, 0x6726, 0x080c, - 0x961e, 0x080c, 0x9ab3, 0x00ce, 0x0804, 0xb8f0, 0x2100, 0x91b2, - 0x0053, 0x1a0c, 0x0d85, 0x91b2, 0x0040, 0x1a04, 0xb9a6, 0x0002, - 0xb994, 0xb994, 0xb98a, 0xb994, 0xb994, 0xb994, 0xb988, 0xb988, - 0xb988, 0xb988, 0xb988, 0xb988, 0xb988, 0xb988, 0xb988, 0xb988, - 0xb988, 0xb988, 0xb988, 0xb988, 0xb988, 0xb988, 0xb988, 0xb988, - 0xb988, 0xb988, 0xb988, 0xb988, 0xb988, 0xb988, 0xb988, 0xb994, - 0xb988, 0xb994, 0xb994, 0xb988, 0xb988, 0xb988, 0xb988, 0xb988, - 0xb98a, 0xb988, 0xb988, 0xb988, 0xb988, 0xb988, 0xb988, 0xb988, - 0xb988, 0xb988, 0xb994, 0xb994, 0xb988, 0xb988, 0xb988, 0xb988, - 0xb988, 0xb988, 0xb988, 0xb988, 0xb988, 0xb994, 0xb988, 0xb988, - 0x080c, 0x0d85, 0x0066, 0x00b6, 0x6610, 0x2658, 0xb8d4, 0xc08c, - 0xb8d6, 0x00be, 0x006e, 0x0000, 0x6003, 0x0001, 0x6106, 0x9186, - 0x0032, 0x0118, 0x080c, 0x961e, 0x0010, 0x080c, 0x9617, 0x0126, - 0x2091, 0x8000, 0x080c, 0x9ab3, 0x012e, 0x0005, 0x2600, 0x0002, - 0xb994, 0xb994, 0xb9ba, 0xb994, 0xb994, 0xb9ba, 0xb9ba, 0xb9ba, - 0xb9ba, 0xb994, 0xb9ba, 0xb994, 0xb9ba, 0xb994, 0xb9ba, 0xb9ba, - 0xb9ba, 0xb9ba, 0x080c, 0x0d85, 0x6004, 0x90b2, 0x0053, 0x1a0c, - 0x0d85, 0x91b6, 0x0013, 0x0904, 0xba91, 0x91b6, 0x0027, 0x1904, - 0xba3d, 0x080c, 0x99ed, 0x6004, 0x080c, 0xd121, 0x01b0, 0x080c, - 0xd132, 0x01a8, 0x908e, 0x0021, 0x0904, 0xba3a, 0x908e, 0x0022, - 0x1130, 0x080c, 0xb5a8, 0x0904, 0xba36, 0x0804, 0xba37, 0x908e, - 0x003d, 0x0904, 0xba3a, 0x0804, 0xba30, 0x080c, 0x3344, 0x2001, - 0x0007, 0x080c, 0x66fa, 0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, - 0x080c, 0xbb5c, 0x9186, 0x007e, 0x1148, 0x2001, 0x1837, 0x2014, - 0xc285, 0x080c, 0x779e, 0x1108, 0xc2ad, 0x2202, 0x080c, 0xacfc, - 0x0036, 0x0026, 0x2019, 0x0028, 0x2110, 0x080c, 0xedee, 0x002e, - 0x003e, 0x0016, 0x0026, 0x0036, 0x2110, 0x2019, 0x0028, 0x080c, - 0x97b0, 0x0076, 0x903e, 0x080c, 0x966d, 0x6010, 0x00b6, 0x905d, - 0x0100, 0x00be, 0x2c08, 0x080c, 0xe75d, 0x007e, 0x003e, 0x002e, - 0x001e, 0x080c, 0xad18, 0x080c, 0xd65a, 0x0016, 0x080c, 0xd3ae, - 0x080c, 0xb16c, 0x001e, 0x080c, 0x341e, 0x080c, 0x9ab3, 0x0030, - 0x080c, 0xd3ae, 0x080c, 0xb16c, 0x080c, 0x9ab3, 0x0005, 0x080c, - 0xbb5c, 0x0cb0, 0x080c, 0xbb98, 0x0c98, 0x9186, 0x0015, 0x0118, - 0x9186, 0x0016, 0x1140, 0x080c, 0xaf61, 0x0d80, 0x9086, 0x0002, - 0x0904, 0xbba3, 0x0c58, 0x9186, 0x0014, 0x1d40, 0x080c, 0x99ed, - 0x6004, 0x908e, 0x0022, 0x1118, 0x080c, 0xb5a8, 0x09f8, 0x080c, - 0x3315, 0x080c, 0xd65a, 0x080c, 0xd121, 0x1190, 0x080c, 0x3344, - 0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, 0x080c, 0xbb5c, 0x9186, - 0x007e, 0x1128, 0x2001, 0x1837, 0x200c, 0xc185, 0x2102, 0x0800, - 0x080c, 0xd132, 0x1120, 0x080c, 0xbb5c, 0x0804, 0xba30, 0x6004, - 0x908e, 0x0032, 0x1160, 0x00e6, 0x00f6, 0x2071, 0x189e, 0x2079, - 0x0000, 0x080c, 0x36bf, 0x00fe, 0x00ee, 0x0804, 0xba30, 0x6004, - 0x908e, 0x0021, 0x0d40, 0x908e, 0x0022, 0x090c, 0xbb5c, 0x0804, - 0xba30, 0x90b2, 0x0040, 0x1a04, 0xbb3c, 0x2008, 0x0002, 0xbad9, - 0xbada, 0xbadd, 0xbae0, 0xbae3, 0xbaf0, 0xbad7, 0xbad7, 0xbad7, - 0xbad7, 0xbad7, 0xbad7, 0xbad7, 0xbad7, 0xbad7, 0xbad7, 0xbad7, - 0xbad7, 0xbad7, 0xbad7, 0xbad7, 0xbad7, 0xbad7, 0xbad7, 0xbad7, - 0xbad7, 0xbad7, 0xbad7, 0xbad7, 0xbad7, 0xbaf3, 0xbafe, 0xbad7, - 0xbaff, 0xbafe, 0xbad7, 0xbad7, 0xbad7, 0xbad7, 0xbad7, 0xbafe, - 0xbafe, 0xbad7, 0xbad7, 0xbad7, 0xbad7, 0xbad7, 0xbad7, 0xbad7, - 0xbad7, 0xbb27, 0xbafe, 0xbad7, 0xbafa, 0xbad7, 0xbad7, 0xbad7, - 0xbafb, 0xbad7, 0xbad7, 0xbad7, 0xbafe, 0xbb22, 0xbad7, 0x080c, - 0x0d85, 0x0420, 0x2001, 0x000b, 0x0448, 0x2001, 0x0003, 0x0430, - 0x2001, 0x0005, 0x0418, 0x6010, 0x00b6, 0x2058, 0xb804, 0x00be, - 0x9084, 0x00ff, 0x9086, 0x0000, 0x11d8, 0x2001, 0x0001, 0x00b0, - 0x2001, 0x0009, 0x0098, 0x6003, 0x0005, 0x080c, 0xd65d, 0x080c, - 0x9ab3, 0x0058, 0x0018, 0x0010, 0x080c, 0x66fa, 0x04b8, 0x080c, - 0xd65d, 0x6003, 0x0004, 0x080c, 0x9ab3, 0x0005, 0x080c, 0x66fa, - 0x6003, 0x0002, 0x0036, 0x2019, 0x1852, 0x2304, 0x9084, 0xff00, - 0x1120, 0x2001, 0x1986, 0x201c, 0x0040, 0x8007, 0x909a, 0x0004, - 0x0ec0, 0x8003, 0x801b, 0x831b, 0x9318, 0x631a, 0x003e, 0x080c, - 0x9ab3, 0x0c18, 0x080c, 0xd3ae, 0x080c, 0xb16c, 0x08f0, 0x00e6, - 0x00f6, 0x2071, 0x189e, 0x2079, 0x0000, 0x080c, 0x36bf, 0x00fe, - 0x00ee, 0x080c, 0x99ed, 0x080c, 0xb16c, 0x0878, 0x6003, 0x0002, - 0x080c, 0xd65d, 0x0804, 0x9ab3, 0x2600, 0x2008, 0x0002, 0xbb53, - 0xbb36, 0xbb51, 0xbb36, 0xbb36, 0xbb51, 0xbb51, 0xbb51, 0xbb51, - 0xbb36, 0xbb51, 0xbb36, 0xbb51, 0xbb36, 0xbb51, 0xbb51, 0xbb51, - 0xbb51, 0x080c, 0x0d85, 0x0096, 0x6014, 0x2048, 0x080c, 0x7012, - 0x009e, 0x080c, 0xb16c, 0x0005, 0x00e6, 0x0096, 0x0026, 0x0016, - 0x080c, 0xcf1b, 0x0568, 0x6014, 0x2048, 0xa864, 0x9086, 0x0139, - 0x11a8, 0xa894, 0x9086, 0x0056, 0x1148, 0x080c, 0x55cc, 0x0130, - 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x0028, 0x2001, 0x0030, - 0x900e, 0x2011, 0x4005, 0x080c, 0xd51f, 0x0090, 0xa868, 0xd0fc, - 0x0178, 0xa807, 0x0000, 0x0016, 0x6004, 0x908e, 0x0021, 0x0168, - 0x908e, 0x003d, 0x0150, 0x001e, 0xa867, 0x0103, 0xa833, 0x0100, - 0x001e, 0x002e, 0x009e, 0x00ee, 0x0005, 0x001e, 0x0009, 0x0cc0, - 0x0096, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, 0x0103, 0xa823, - 0x8001, 0x009e, 0x0005, 0x00b6, 0x6610, 0x2658, 0xb804, 0x9084, - 0x00ff, 0x90b2, 0x000c, 0x1a0c, 0x0d85, 0x6604, 0x96b6, 0x004d, - 0x1120, 0x080c, 0xd43e, 0x0804, 0xbc28, 0x6604, 0x96b6, 0x0043, - 0x1120, 0x080c, 0xd487, 0x0804, 0xbc28, 0x6604, 0x96b6, 0x004b, - 0x1120, 0x080c, 0xd4b3, 0x0804, 0xbc28, 0x6604, 0x96b6, 0x0033, - 0x1120, 0x080c, 0xd3d0, 0x0804, 0xbc28, 0x6604, 0x96b6, 0x0028, - 0x1120, 0x080c, 0xd170, 0x0804, 0xbc28, 0x6604, 0x96b6, 0x0029, - 0x1120, 0x080c, 0xd1b1, 0x0804, 0xbc28, 0x6604, 0x96b6, 0x001f, - 0x1120, 0x080c, 0xb54d, 0x0804, 0xbc28, 0x6604, 0x96b6, 0x0000, - 0x1118, 0x080c, 0xb8b2, 0x04e0, 0x6604, 0x96b6, 0x0022, 0x1118, - 0x080c, 0xb589, 0x04a8, 0x6604, 0x96b6, 0x0035, 0x1118, 0x080c, - 0xb6af, 0x0470, 0x6604, 0x96b6, 0x0039, 0x1118, 0x080c, 0xb847, - 0x0438, 0x6604, 0x96b6, 0x003d, 0x1118, 0x080c, 0xb5c1, 0x0400, - 0x6604, 0x96b6, 0x0044, 0x1118, 0x080c, 0xb5fd, 0x00c8, 0x6604, - 0x96b6, 0x0049, 0x1118, 0x080c, 0xb63e, 0x0090, 0x6604, 0x96b6, - 0x0041, 0x1118, 0x080c, 0xb628, 0x0058, 0x91b6, 0x0015, 0x1110, - 0x0063, 0x0030, 0x91b6, 0x0016, 0x1128, 0x00be, 0x0804, 0xbf34, - 0x00be, 0x0005, 0x080c, 0xb227, 0x0cd8, 0xbc45, 0xbc53, 0xbc45, - 0xbc9a, 0xbc45, 0xbe51, 0xbf41, 0xbc45, 0xbc45, 0xbf0a, 0xbc45, - 0xbf20, 0x0096, 0x601f, 0x0000, 0x6014, 0x2048, 0xa800, 0x2048, - 0xa867, 0x0103, 0x009e, 0x0804, 0xb16c, 0xa001, 0xa001, 0x0005, - 0x6604, 0x96b6, 0x0004, 0x1130, 0x2001, 0x0001, 0x080c, 0x66e6, - 0x0804, 0xb16c, 0x0005, 0x00e6, 0x2071, 0x1800, 0x7090, 0x9086, - 0x0074, 0x1540, 0x080c, 0xe72e, 0x11b0, 0x6010, 0x00b6, 0x2058, - 0x7030, 0xd08c, 0x0128, 0xb800, 0xd0bc, 0x0110, 0xc0c5, 0xb802, - 0x00f9, 0x00be, 0x2001, 0x0006, 0x080c, 0x66fa, 0x080c, 0x3344, - 0x080c, 0xb16c, 0x0098, 0x2001, 0x000a, 0x080c, 0x66fa, 0x080c, - 0x3344, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x961e, 0x080c, - 0x9ab3, 0x0020, 0x2001, 0x0001, 0x080c, 0xbe21, 0x00ee, 0x0005, - 0x00d6, 0xb800, 0xd084, 0x0160, 0x9006, 0x080c, 0x66e6, 0x2069, - 0x1847, 0x6804, 0xd0a4, 0x0120, 0x2001, 0x0006, 0x080c, 0x6726, - 0x00de, 0x0005, 0x00b6, 0x0096, 0x00d6, 0x2011, 0x1824, 0x2204, - 0x9086, 0x0074, 0x1904, 0xbdf6, 0x6010, 0x2058, 0xbaa0, 0x9286, - 0x007e, 0x1120, 0x080c, 0xc090, 0x0804, 0xbd63, 0x2001, 0x180d, - 0x2004, 0xd08c, 0x0904, 0xbd05, 0x00d6, 0x080c, 0x779e, 0x01a0, - 0x0026, 0x2011, 0x0010, 0x080c, 0x6c35, 0x002e, 0x0904, 0xbd04, - 0x080c, 0x5854, 0x1598, 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, - 0x0103, 0xa833, 0xdead, 0x0450, 0x6010, 0x00b6, 0x2058, 0xb910, - 0x00be, 0x9186, 0x00ff, 0x0580, 0x0026, 0x2011, 0x8008, 0x080c, - 0x6c35, 0x002e, 0x0548, 0x6014, 0x9005, 0x090c, 0x0d85, 0x2048, - 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0030, - 0x900e, 0x2011, 0x4009, 0x080c, 0xd51f, 0x0040, 0x6014, 0x2048, - 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0xdead, 0x6010, 0x2058, - 0xb9a0, 0x0016, 0x080c, 0x3344, 0x080c, 0xb16c, 0x001e, 0x080c, - 0x341e, 0x00de, 0x0804, 0xbdfb, 0x00de, 0x080c, 0xc085, 0x6010, - 0x2058, 0xbaa0, 0x9286, 0x0080, 0x1510, 0x6014, 0x9005, 0x01a8, - 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, - 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xd51f, 0x0030, 0xa807, - 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x2001, 0x0006, 0x080c, - 0x66fa, 0x080c, 0x3344, 0x080c, 0xb16c, 0x0804, 0xbdfb, 0x080c, - 0xbe09, 0x6014, 0x9005, 0x0190, 0x2048, 0xa868, 0xd0f4, 0x01e8, - 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1d08, 0x2001, 0x0000, - 0x900e, 0x2011, 0x4000, 0x080c, 0xd51f, 0x08f8, 0x080c, 0xbdff, - 0x0160, 0x9006, 0x080c, 0x66e6, 0x2001, 0x0004, 0x080c, 0x6726, - 0x2001, 0x0007, 0x080c, 0x66fa, 0x08a0, 0x2001, 0x0004, 0x080c, - 0x66fa, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, 0x961e, 0x080c, - 0x9ab3, 0x0804, 0xbdfb, 0xb85c, 0xd0e4, 0x0178, 0x080c, 0xd348, - 0x080c, 0x779e, 0x0118, 0xd0dc, 0x1904, 0xbd25, 0x2011, 0x1837, - 0x2204, 0xc0ad, 0x2012, 0x0804, 0xbd25, 0x080c, 0xd389, 0x2011, - 0x1837, 0x2204, 0xc0a5, 0x2012, 0x0006, 0x080c, 0xe905, 0x000e, - 0x1904, 0xbd25, 0xc0b5, 0x2012, 0x2001, 0x0006, 0x080c, 0x66fa, - 0x9006, 0x080c, 0x66e6, 0x00c6, 0x2001, 0x180f, 0x2004, 0xd09c, - 0x0520, 0x00f6, 0x2079, 0x0100, 0x00e6, 0x2071, 0x1800, 0x700c, - 0x9084, 0x00ff, 0x78e6, 0x707e, 0x7010, 0x78ea, 0x7082, 0x908c, - 0x00ff, 0x00ee, 0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x26d5, - 0x00f6, 0x2100, 0x900e, 0x080c, 0x268c, 0x795e, 0x00fe, 0x9186, - 0x0081, 0x01f0, 0x2009, 0x0081, 0x00e0, 0x2009, 0x00ef, 0x00f6, - 0x2079, 0x0100, 0x79ea, 0x78e7, 0x0000, 0x7932, 0x7936, 0x780c, - 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x26d5, 0x00f6, 0x2079, 0x1800, - 0x7982, 0x2100, 0x900e, 0x797e, 0x080c, 0x268c, 0x795e, 0x00fe, - 0x8108, 0x080c, 0x6749, 0x2b00, 0x00ce, 0x1904, 0xbd25, 0x6012, - 0x2009, 0x180f, 0x210c, 0xd19c, 0x0150, 0x2009, 0x027c, 0x210c, - 0x918c, 0x00ff, 0xb912, 0x2009, 0x027d, 0x210c, 0xb916, 0x2001, - 0x0002, 0x080c, 0x66fa, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, - 0x0002, 0x080c, 0x961e, 0x080c, 0x9ab3, 0x0028, 0x080c, 0xbb5c, - 0x2001, 0x0001, 0x0431, 0x00de, 0x009e, 0x00be, 0x0005, 0x2001, - 0x1810, 0x2004, 0xd0a4, 0x0120, 0x2001, 0x1848, 0x2004, 0xd0ac, - 0x0005, 0x00e6, 0x080c, 0xee47, 0x0190, 0x2071, 0x0260, 0x7108, - 0x720c, 0x918c, 0x00ff, 0x1118, 0x9284, 0xff00, 0x0140, 0x6010, - 0x2058, 0xb8a0, 0x9084, 0xff80, 0x1110, 0xb912, 0xba16, 0x00ee, - 0x0005, 0x2030, 0x9005, 0x0158, 0x2001, 0x0007, 0x080c, 0x66fa, - 0x080c, 0x5854, 0x1120, 0x2001, 0x0007, 0x080c, 0x6726, 0x2600, - 0x9005, 0x11b0, 0x6014, 0x0096, 0x2048, 0xa868, 0x009e, 0xd0fc, - 0x1178, 0x0036, 0x0046, 0x6010, 0x00b6, 0x2058, 0xbba0, 0x00be, - 0x2021, 0x0004, 0x2011, 0x8014, 0x080c, 0x4ca1, 0x004e, 0x003e, - 0x080c, 0x3344, 0x6020, 0x9086, 0x000a, 0x1108, 0x0005, 0x0804, - 0xb16c, 0x00b6, 0x00e6, 0x0026, 0x0016, 0x2071, 0x1800, 0x7090, - 0x9086, 0x0014, 0x1904, 0xbf00, 0x2001, 0x180d, 0x2004, 0xd08c, - 0x0904, 0xbeb3, 0x00d6, 0x080c, 0x779e, 0x01a0, 0x0026, 0x2011, - 0x0010, 0x080c, 0x6c35, 0x002e, 0x0904, 0xbeb2, 0x080c, 0x5854, - 0x1598, 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, - 0xdead, 0x0450, 0x6010, 0x00b6, 0x2058, 0xb910, 0x00be, 0x9186, - 0x00ff, 0x0580, 0x0026, 0x2011, 0x8008, 0x080c, 0x6c35, 0x002e, - 0x0548, 0x6014, 0x9005, 0x090c, 0x0d85, 0x2048, 0xa864, 0x9084, - 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0030, 0x900e, 0x2011, - 0x4009, 0x080c, 0xd51f, 0x0040, 0x6014, 0x2048, 0xa807, 0x0000, - 0xa867, 0x0103, 0xa833, 0xdead, 0x6010, 0x2058, 0xb9a0, 0x0016, - 0x080c, 0x3344, 0x080c, 0xb16c, 0x001e, 0x080c, 0x341e, 0x00de, - 0x0804, 0xbf05, 0x00de, 0x080c, 0x5854, 0x1170, 0x6014, 0x9005, - 0x1158, 0x0036, 0x0046, 0x6010, 0x2058, 0xbba0, 0x2021, 0x0006, - 0x080c, 0x4e58, 0x004e, 0x003e, 0x00d6, 0x6010, 0x2058, 0x080c, - 0x684f, 0x080c, 0xbc88, 0x00de, 0x080c, 0xc15b, 0x1588, 0x6010, - 0x2058, 0xb890, 0x9005, 0x0560, 0x2001, 0x0006, 0x080c, 0x66fa, - 0x0096, 0x6014, 0x904d, 0x01d0, 0xa864, 0x9084, 0x00ff, 0x9086, - 0x0039, 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, - 0xd51f, 0x0060, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0029, 0x0130, - 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x009e, 0x080c, - 0x3344, 0x6020, 0x9086, 0x000a, 0x0140, 0x080c, 0xb16c, 0x0028, - 0x080c, 0xbb5c, 0x9006, 0x080c, 0xbe21, 0x001e, 0x002e, 0x00ee, - 0x00be, 0x0005, 0x2011, 0x1824, 0x2204, 0x9086, 0x0014, 0x1160, - 0x2001, 0x0002, 0x080c, 0x66fa, 0x6003, 0x0001, 0x6007, 0x0001, - 0x080c, 0x961e, 0x0804, 0x9ab3, 0x2001, 0x0001, 0x0804, 0xbe21, - 0x2030, 0x2011, 0x1824, 0x2204, 0x9086, 0x0004, 0x1148, 0x96b6, - 0x000b, 0x1120, 0x2001, 0x0007, 0x080c, 0x66fa, 0x0804, 0xb16c, - 0x2001, 0x0001, 0x0804, 0xbe21, 0x0002, 0xbc45, 0xbf4c, 0xbc45, - 0xbf8f, 0xbc45, 0xc03c, 0xbf41, 0xbc48, 0xbc45, 0xc050, 0xbc45, - 0xc062, 0x6604, 0x9686, 0x0003, 0x0904, 0xbe51, 0x96b6, 0x001e, - 0x1110, 0x080c, 0xb16c, 0x0005, 0x00b6, 0x00d6, 0x00c6, 0x080c, - 0xc074, 0x11a0, 0x9006, 0x080c, 0x66e6, 0x080c, 0x3315, 0x080c, - 0xd65a, 0x2001, 0x0002, 0x080c, 0x66fa, 0x6003, 0x0001, 0x6007, - 0x0002, 0x080c, 0x961e, 0x080c, 0x9ab3, 0x0428, 0x2009, 0x026e, - 0x2104, 0x9086, 0x0009, 0x1160, 0x6010, 0x2058, 0xb840, 0x9084, - 0x00ff, 0x9005, 0x0180, 0x8001, 0xb842, 0x601b, 0x000a, 0x0098, - 0x2009, 0x026f, 0x2104, 0x9084, 0xff00, 0x908e, 0x1900, 0x0158, - 0x908e, 0x1e00, 0x0990, 0x080c, 0x3315, 0x080c, 0xd65a, 0x2001, - 0x0001, 0x080c, 0xbe21, 0x00ce, 0x00de, 0x00be, 0x0005, 0x0096, - 0x00b6, 0x0026, 0x9016, 0x080c, 0xc082, 0x00d6, 0x2069, 0x197c, - 0x2d04, 0x9005, 0x0168, 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, - 0x1138, 0x2069, 0x1820, 0x2d04, 0x8000, 0x206a, 0x00de, 0x0010, - 0x00de, 0x0088, 0x9006, 0x080c, 0x66e6, 0x2001, 0x0002, 0x080c, - 0x66fa, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x961e, 0x080c, - 0x9ab3, 0x0804, 0xc00c, 0x080c, 0xcf1b, 0x01b0, 0x6014, 0x2048, - 0xa864, 0x2010, 0x9086, 0x0139, 0x1138, 0x6007, 0x0016, 0x2001, - 0x0002, 0x080c, 0xd57c, 0x00b0, 0x6014, 0x2048, 0xa864, 0xd0fc, - 0x0118, 0x2001, 0x0001, 0x0ca8, 0x2001, 0x180e, 0x2004, 0xd0dc, - 0x0148, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x1110, - 0x9006, 0x0c38, 0x080c, 0xbb5c, 0x2009, 0x026e, 0x2134, 0x96b4, - 0x00ff, 0x9686, 0x0005, 0x0520, 0x9686, 0x000b, 0x01c8, 0x2009, - 0x026f, 0x2104, 0x9084, 0xff00, 0x1118, 0x9686, 0x0009, 0x01c0, - 0x9086, 0x1900, 0x1168, 0x9686, 0x0009, 0x0190, 0x2001, 0x0004, - 0x080c, 0x66fa, 0x2001, 0x0028, 0x601a, 0x6007, 0x0052, 0x0020, - 0x2001, 0x0001, 0x080c, 0xbe21, 0x002e, 0x00be, 0x009e, 0x0005, - 0x9286, 0x0139, 0x0160, 0x6014, 0x2048, 0x080c, 0xcf1b, 0x0140, - 0xa864, 0x9086, 0x0139, 0x0118, 0xa868, 0xd0fc, 0x0108, 0x0c40, - 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0138, 0x8001, - 0xb842, 0x601b, 0x000a, 0x6007, 0x0016, 0x08f0, 0xb8a0, 0x9086, - 0x007e, 0x1138, 0x00e6, 0x2071, 0x1800, 0x080c, 0x6130, 0x00ee, - 0x0010, 0x080c, 0x3315, 0x0860, 0x2001, 0x0004, 0x080c, 0x66fa, - 0x080c, 0xc082, 0x1140, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, - 0x961e, 0x0804, 0x9ab3, 0x080c, 0xbb5c, 0x9006, 0x0804, 0xbe21, - 0x0489, 0x1160, 0x2001, 0x0008, 0x080c, 0x66fa, 0x6003, 0x0001, - 0x6007, 0x0005, 0x080c, 0x961e, 0x0804, 0x9ab3, 0x2001, 0x0001, - 0x0804, 0xbe21, 0x00f9, 0x1160, 0x2001, 0x000a, 0x080c, 0x66fa, - 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x961e, 0x0804, 0x9ab3, - 0x2001, 0x0001, 0x0804, 0xbe21, 0x2009, 0x026e, 0x2104, 0x9086, - 0x0003, 0x1138, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00, 0x9086, - 0x2a00, 0x0005, 0x9085, 0x0001, 0x0005, 0x00b6, 0x00c6, 0x0016, - 0x6110, 0x2158, 0x080c, 0x67c3, 0x001e, 0x00ce, 0x00be, 0x0005, - 0x00b6, 0x00f6, 0x00e6, 0x00d6, 0x0036, 0x0016, 0x6010, 0x2058, - 0x2009, 0x1837, 0x2104, 0x9085, 0x0003, 0x200a, 0x080c, 0xc12d, - 0x0560, 0x2009, 0x1837, 0x2104, 0xc0cd, 0x200a, 0x080c, 0x6c0d, - 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xea8d, 0x2001, - 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0001, - 0x080c, 0x32da, 0x00e6, 0x2071, 0x1800, 0x080c, 0x30bf, 0x00ee, - 0x00c6, 0x0156, 0x20a9, 0x0781, 0x2009, 0x007f, 0x080c, 0x341e, - 0x8108, 0x1f04, 0xc0c6, 0x015e, 0x00ce, 0x080c, 0xc085, 0x2071, - 0x0260, 0x2079, 0x0200, 0x7817, 0x0001, 0x2001, 0x1837, 0x200c, - 0xc1c5, 0x7018, 0xd0fc, 0x0110, 0xd0dc, 0x0118, 0x7038, 0xd0dc, - 0x1108, 0xc1c4, 0x7817, 0x0000, 0x2001, 0x1837, 0x2102, 0x9184, - 0x0050, 0x9086, 0x0050, 0x05d0, 0x2079, 0x0100, 0x2e04, 0x9084, - 0x00ff, 0x2069, 0x181f, 0x206a, 0x78e6, 0x0006, 0x8e70, 0x2e04, - 0x2069, 0x1820, 0x206a, 0x78ea, 0x7832, 0x7836, 0x2010, 0x9084, - 0xff00, 0x001e, 0x9105, 0x2009, 0x182c, 0x200a, 0x2200, 0x9084, - 0x00ff, 0x2008, 0x080c, 0x26d5, 0x080c, 0x779e, 0x0170, 0x2071, - 0x0260, 0x2069, 0x1982, 0x7048, 0x206a, 0x704c, 0x6806, 0x7050, - 0x680a, 0x7054, 0x680e, 0x080c, 0xd348, 0x0040, 0x2001, 0x0006, - 0x080c, 0x66fa, 0x080c, 0x3344, 0x080c, 0xb16c, 0x001e, 0x003e, - 0x00de, 0x00ee, 0x00fe, 0x00be, 0x0005, 0x0096, 0x0026, 0x0036, - 0x00e6, 0x0156, 0x2019, 0x182c, 0x231c, 0x83ff, 0x01f0, 0x2071, - 0x0260, 0x7200, 0x9294, 0x00ff, 0x7004, 0x9084, 0xff00, 0x9205, - 0x9306, 0x1198, 0x2011, 0x0276, 0x20a9, 0x0004, 0x2b48, 0x2019, - 0x000a, 0x080c, 0xc222, 0x1148, 0x2011, 0x027a, 0x20a9, 0x0004, - 0x2019, 0x0006, 0x080c, 0xc222, 0x1100, 0x015e, 0x00ee, 0x003e, - 0x002e, 0x009e, 0x0005, 0x00e6, 0x2071, 0x0260, 0x7034, 0x9086, - 0x0014, 0x11a8, 0x7038, 0x9086, 0x0800, 0x1188, 0x703c, 0xd0ec, - 0x0160, 0x9084, 0x0f00, 0x9086, 0x0100, 0x1138, 0x7054, 0xd0a4, - 0x1110, 0xd0ac, 0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ee, - 0x0005, 0x00e6, 0x0096, 0x00c6, 0x0076, 0x0056, 0x0046, 0x0026, - 0x0006, 0x0126, 0x2091, 0x8000, 0x2029, 0x19f4, 0x252c, 0x2021, - 0x19fb, 0x2424, 0x2061, 0x1ddc, 0x2071, 0x1800, 0x7254, 0x7074, - 0x9202, 0x1a04, 0xc1ee, 0x080c, 0x8eee, 0x0904, 0xc1e7, 0x080c, - 0xeabe, 0x0904, 0xc1e7, 0x6720, 0x9786, 0x0007, 0x0904, 0xc1e7, - 0x2500, 0x9c06, 0x0904, 0xc1e7, 0x2400, 0x9c06, 0x0904, 0xc1e7, - 0x3e08, 0x9186, 0x0002, 0x1148, 0x6010, 0x9005, 0x0130, 0x00b6, - 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1590, 0x00c6, 0x6043, 0xffff, - 0x6000, 0x9086, 0x0004, 0x1110, 0x080c, 0x1ad3, 0x9786, 0x000a, - 0x0148, 0x080c, 0xd132, 0x1130, 0x00ce, 0x080c, 0xbb5c, 0x080c, - 0xb1a7, 0x00e8, 0x6014, 0x2048, 0x080c, 0xcf1b, 0x01a8, 0x9786, - 0x0003, 0x1530, 0xa867, 0x0103, 0xa87c, 0xd0cc, 0x0130, 0x0096, - 0xa878, 0x2048, 0x080c, 0x100b, 0x009e, 0xab7a, 0xa877, 0x0000, - 0x080c, 0x7006, 0x080c, 0xd10c, 0x080c, 0xb1a7, 0x00ce, 0x9ce0, - 0x001c, 0x7068, 0x9c02, 0x1210, 0x0804, 0xc18e, 0x012e, 0x000e, - 0x002e, 0x004e, 0x005e, 0x007e, 0x00ce, 0x009e, 0x00ee, 0x0005, - 0x9786, 0x0006, 0x1118, 0x080c, 0xea30, 0x0c30, 0x9786, 0x0009, - 0x1148, 0x6000, 0x9086, 0x0004, 0x0d08, 0x2009, 0x004c, 0x080c, - 0xb20a, 0x08e0, 0x9786, 0x000a, 0x0980, 0x0820, 0x220c, 0x2304, - 0x9106, 0x1130, 0x8210, 0x8318, 0x1f04, 0xc20e, 0x9006, 0x0005, - 0x2304, 0x9102, 0x0218, 0x2001, 0x0001, 0x0008, 0x9006, 0x918d, - 0x0001, 0x0005, 0x0136, 0x01c6, 0x0016, 0x8906, 0x8006, 0x8007, - 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0, 0x9300, 0x2098, 0x3518, - 0x20a9, 0x0001, 0x220c, 0x4002, 0x910e, 0x1140, 0x8210, 0x8319, - 0x1dc8, 0x9006, 0x001e, 0x01ce, 0x013e, 0x0005, 0x220c, 0x9102, - 0x0218, 0x2001, 0x0001, 0x0010, 0x2001, 0x0000, 0x918d, 0x0001, - 0x001e, 0x01ce, 0x013e, 0x0005, 0x220c, 0x810f, 0x2304, 0x9106, - 0x1130, 0x8210, 0x8318, 0x1f04, 0xc24c, 0x9006, 0x0005, 0x918d, - 0x0001, 0x0005, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0d85, 0x080c, - 0xd121, 0x0120, 0x080c, 0xd132, 0x0158, 0x0028, 0x080c, 0x3344, - 0x080c, 0xd132, 0x0128, 0x080c, 0x99ed, 0x080c, 0xb16c, 0x0005, - 0x080c, 0xbb5c, 0x0cc0, 0x9182, 0x0057, 0x1220, 0x9182, 0x0040, - 0x0208, 0x000a, 0x0005, 0xc292, 0xc292, 0xc292, 0xc292, 0xc292, - 0xc292, 0xc292, 0xc292, 0xc292, 0xc292, 0xc292, 0xc294, 0xc294, - 0xc294, 0xc294, 0xc292, 0xc292, 0xc292, 0xc294, 0xc292, 0xc292, - 0xc292, 0xc292, 0x080c, 0x0d85, 0x600b, 0xffff, 0x6003, 0x000f, - 0x6106, 0x0126, 0x2091, 0x8000, 0x080c, 0xd65d, 0x2009, 0x8000, - 0x080c, 0x9617, 0x012e, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, - 0x9082, 0x0040, 0x0804, 0xc31c, 0x9186, 0x0027, 0x1520, 0x080c, - 0x99ed, 0x080c, 0x3315, 0x080c, 0xd65a, 0x0096, 0x6114, 0x2148, - 0x080c, 0xcf1b, 0x0198, 0x080c, 0xd132, 0x1118, 0x080c, 0xbb5c, - 0x0068, 0xa867, 0x0103, 0xa87b, 0x0029, 0xa877, 0x0000, 0xa97c, - 0xc1c5, 0xa97e, 0x080c, 0x7012, 0x080c, 0xd10c, 0x009e, 0x080c, - 0xb16c, 0x0804, 0x9ab3, 0x9186, 0x0014, 0x1120, 0x6004, 0x9082, - 0x0040, 0x0030, 0x9186, 0x0053, 0x0110, 0x080c, 0x0d85, 0x0005, - 0x0002, 0xc2fa, 0xc2f8, 0xc2f8, 0xc2f8, 0xc2f8, 0xc2f8, 0xc2f8, - 0xc2f8, 0xc2f8, 0xc2f8, 0xc2f8, 0xc313, 0xc313, 0xc313, 0xc313, - 0xc2f8, 0xc313, 0xc2f8, 0xc313, 0xc2f8, 0xc2f8, 0xc2f8, 0xc2f8, - 0x080c, 0x0d85, 0x080c, 0x99ed, 0x0096, 0x6114, 0x2148, 0x080c, - 0xcf1b, 0x0168, 0xa867, 0x0103, 0xa87b, 0x0006, 0xa877, 0x0000, - 0xa880, 0xc0ec, 0xa882, 0x080c, 0x7012, 0x080c, 0xd10c, 0x009e, - 0x080c, 0xb16c, 0x0005, 0x080c, 0x99ed, 0x080c, 0xd132, 0x090c, - 0xbb5c, 0x080c, 0xb16c, 0x0005, 0x0002, 0xc336, 0xc334, 0xc334, - 0xc334, 0xc334, 0xc334, 0xc334, 0xc334, 0xc334, 0xc334, 0xc334, - 0xc338, 0xc338, 0xc338, 0xc338, 0xc334, 0xc33a, 0xc334, 0xc338, - 0xc334, 0xc334, 0xc334, 0xc334, 0x080c, 0x0d85, 0x080c, 0x0d85, - 0x080c, 0x0d85, 0x080c, 0xb16c, 0x0804, 0x9ab3, 0x9182, 0x0057, - 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xc35d, 0xc35d, - 0xc35d, 0xc35d, 0xc35d, 0xc396, 0xc488, 0xc35d, 0xc494, 0xc35d, - 0xc35d, 0xc35d, 0xc35d, 0xc35d, 0xc35d, 0xc35d, 0xc35d, 0xc35d, - 0xc35d, 0xc494, 0xc35f, 0xc35d, 0xc492, 0x080c, 0x0d85, 0x00b6, - 0x0096, 0x6114, 0x2148, 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1508, - 0xa87b, 0x0000, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87c, 0xd0ac, - 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xc519, 0x080c, 0x6e27, - 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0xb8d0, - 0x9005, 0x0110, 0x080c, 0x68df, 0x080c, 0xb16c, 0x009e, 0x00be, - 0x0005, 0xa87c, 0xd0ac, 0x09e0, 0xa838, 0xa934, 0x9105, 0x09c0, - 0xa880, 0xd0bc, 0x19a8, 0x080c, 0xd267, 0x0c80, 0x00b6, 0x0096, - 0x6114, 0x2148, 0x601c, 0xd0fc, 0x1110, 0x7644, 0x0008, 0x9036, - 0x96b4, 0x0fff, 0x86ff, 0x1590, 0x6010, 0x2058, 0xb800, 0xd0bc, - 0x1904, 0xc477, 0xa87b, 0x0000, 0xa867, 0x0103, 0xae76, 0xa87c, - 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xc519, 0x080c, - 0x6e27, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, - 0xb8d0, 0x9005, 0x0110, 0x080c, 0x68df, 0x601c, 0xd0fc, 0x1148, - 0x7044, 0xd0e4, 0x1904, 0xc458, 0x080c, 0xb16c, 0x009e, 0x00be, - 0x0005, 0x2009, 0x0211, 0x210c, 0x080c, 0x0d85, 0x968c, 0x0c00, - 0x0150, 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1904, 0xc45c, 0x7348, - 0xab92, 0x734c, 0xab8e, 0x968c, 0x00ff, 0x9186, 0x0002, 0x0508, - 0x9186, 0x0028, 0x1118, 0xa87b, 0x001c, 0x00e8, 0xd6dc, 0x01a0, - 0xa87b, 0x0015, 0xa87c, 0xd0ac, 0x0170, 0xa938, 0xaa34, 0x2100, - 0x9205, 0x0148, 0x7048, 0x9106, 0x1118, 0x704c, 0x9206, 0x0118, - 0xa992, 0xaa8e, 0xc6dc, 0x0038, 0xd6d4, 0x0118, 0xa87b, 0x0007, - 0x0010, 0xa87b, 0x0000, 0xa867, 0x0103, 0xae76, 0x901e, 0xd6c4, - 0x01d8, 0x9686, 0x0100, 0x1130, 0x7064, 0x9005, 0x1118, 0xc6c4, - 0x0804, 0xc3a2, 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, - 0x0210, 0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0x0018, 0x2011, - 0x0025, 0x080c, 0xca7b, 0x003e, 0xd6cc, 0x0904, 0xc3b7, 0x7154, - 0xa98a, 0x81ff, 0x0904, 0xc3b7, 0x9192, 0x0021, 0x1278, 0x8304, - 0x9098, 0x0018, 0x2011, 0x0029, 0x080c, 0xca7b, 0x2011, 0x0205, - 0x2013, 0x0000, 0x080c, 0xd5e8, 0x0804, 0xc3b7, 0xa868, 0xd0fc, - 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c50, 0x00a6, 0x2950, 0x080c, - 0xca1a, 0x00ae, 0x080c, 0xd5e8, 0x080c, 0xca6b, 0x0804, 0xc3b9, - 0x080c, 0xd22a, 0x0804, 0xc3ce, 0xa87c, 0xd0ac, 0x0904, 0xc3df, - 0xa880, 0xd0bc, 0x1904, 0xc3df, 0x9684, 0x0400, 0x0130, 0xa838, - 0xab34, 0x9305, 0x0904, 0xc3df, 0x00b8, 0x7348, 0xa838, 0x9306, - 0x1198, 0x734c, 0xa834, 0x931e, 0x0904, 0xc3df, 0x0068, 0xa87c, - 0xd0ac, 0x0904, 0xc3aa, 0xa838, 0xa934, 0x9105, 0x0904, 0xc3aa, - 0xa880, 0xd0bc, 0x1904, 0xc3aa, 0x080c, 0xd267, 0x0804, 0xc3ce, - 0x00f6, 0x2079, 0x026c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x00fe, - 0x0021, 0x0005, 0x0011, 0x0005, 0x0005, 0x0096, 0x6003, 0x0002, - 0x6007, 0x0043, 0x6014, 0x2048, 0xa87c, 0xd0ac, 0x0128, 0x009e, - 0x0005, 0x2130, 0x2228, 0x0058, 0x2400, 0xa9ac, 0x910a, 0x2300, - 0xaab0, 0x9213, 0x2600, 0x9102, 0x2500, 0x9203, 0x0e90, 0xac46, - 0xab4a, 0xae36, 0xad3a, 0x6044, 0xd0fc, 0x190c, 0xad25, 0x604b, - 0x0000, 0x080c, 0x1c9c, 0x1118, 0x6144, 0x080c, 0x9643, 0x009e, - 0x0005, 0x9182, 0x0057, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, - 0x0005, 0xc4e0, 0xc4e0, 0xc4e0, 0xc4e0, 0xc4e0, 0xc4e0, 0xc4e0, - 0xc4e0, 0xc4e0, 0xc4e0, 0xc4e2, 0xc4e0, 0xc4e0, 0xc4e0, 0xc4e0, - 0xc4f3, 0xc4e0, 0xc4e0, 0xc4e0, 0xc4e0, 0xc517, 0xc4e0, 0xc4e0, - 0x080c, 0x0d85, 0x6004, 0x9086, 0x0040, 0x1110, 0x080c, 0x99ed, - 0x2019, 0x0001, 0x080c, 0xa596, 0x6003, 0x0002, 0x080c, 0xd662, - 0x080c, 0x9a48, 0x0005, 0x6004, 0x9086, 0x0040, 0x1110, 0x080c, - 0x99ed, 0x2019, 0x0001, 0x080c, 0xa596, 0x080c, 0x9a48, 0x080c, - 0x3315, 0x080c, 0xd65a, 0x0096, 0x6114, 0x2148, 0x080c, 0xcf1b, - 0x0150, 0xa867, 0x0103, 0xa87b, 0x0029, 0xa877, 0x0000, 0x080c, - 0x7012, 0x080c, 0xd10c, 0x009e, 0x080c, 0xb16c, 0x0005, 0x080c, - 0x0d85, 0xa87b, 0x0015, 0xd1fc, 0x0180, 0xa87b, 0x0007, 0x8002, - 0x8000, 0x810a, 0x9189, 0x0000, 0x0006, 0x0016, 0x2009, 0x1a7c, - 0x2104, 0x8000, 0x200a, 0x001e, 0x000e, 0xa992, 0xa88e, 0x0005, - 0x9182, 0x0057, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, - 0xc54f, 0xc54f, 0xc54f, 0xc54f, 0xc54f, 0xc551, 0xc54f, 0xc54f, - 0xc60e, 0xc54f, 0xc54f, 0xc54f, 0xc54f, 0xc54f, 0xc54f, 0xc54f, - 0xc54f, 0xc54f, 0xc54f, 0xc74e, 0xc54f, 0xc758, 0xc54f, 0x080c, - 0x0d85, 0x601c, 0xd0bc, 0x0178, 0xd084, 0x0168, 0xd0f4, 0x0120, - 0xc084, 0x601e, 0x0804, 0xc33e, 0x6114, 0x0096, 0x2148, 0xa87c, - 0xc0e5, 0xa87e, 0x009e, 0x0076, 0x00a6, 0x00e6, 0x0096, 0x2071, - 0x0260, 0x6114, 0x2150, 0x601c, 0xd0fc, 0x1110, 0x7644, 0x0008, - 0x9036, 0xb676, 0x96b4, 0x0fff, 0xb77c, 0xc7e5, 0xb77e, 0x6210, - 0x00b6, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0x00be, - 0x86ff, 0x0904, 0xc607, 0x9694, 0xff00, 0x9284, 0x0c00, 0x0120, - 0x7048, 0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, 0x0904, 0xc607, - 0x9686, 0x0100, 0x1130, 0x7064, 0x9005, 0x1118, 0xc6c4, 0xb676, - 0x0c38, 0x080c, 0x1059, 0x090c, 0x0d85, 0x2900, 0xb07a, 0xb77c, - 0x97bd, 0x0200, 0xb77e, 0xa867, 0x0103, 0xb068, 0xa86a, 0xb06c, - 0xa86e, 0xb070, 0xa872, 0x7044, 0x9084, 0xf000, 0x9635, 0xae76, - 0x968c, 0x0c00, 0x0120, 0x7348, 0xab92, 0x734c, 0xab8e, 0x968c, - 0x00ff, 0x9186, 0x0002, 0x0180, 0x9186, 0x0028, 0x1118, 0xa87b, - 0x001c, 0x0060, 0xd6dc, 0x0118, 0xa87b, 0x0015, 0x0038, 0xd6d4, - 0x0118, 0xa87b, 0x0007, 0x0010, 0xa87b, 0x0000, 0xaf7e, 0xb080, - 0xa882, 0xb084, 0xa886, 0x901e, 0xd6c4, 0x0190, 0x735c, 0xab86, - 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, - 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, 0x080c, 0xca7b, 0x003e, - 0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff, 0x01c8, 0x9192, 0x0021, - 0x1260, 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, 0x080c, 0xca7b, - 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, 0xb068, 0xd0fc, 0x0120, - 0x2009, 0x0020, 0xa98a, 0x0c68, 0x2950, 0x080c, 0xca1a, 0x080c, - 0x1a9f, 0x009e, 0x00ee, 0x00ae, 0x007e, 0x0005, 0x2001, 0x1988, - 0x2004, 0x604a, 0x0096, 0x6114, 0x2148, 0xa83c, 0xa940, 0x9105, - 0x1118, 0xa87c, 0xc0dc, 0xa87e, 0x6003, 0x0002, 0x080c, 0xd66b, - 0x0904, 0xc749, 0x604b, 0x0000, 0x6010, 0x00b6, 0x2058, 0xb800, - 0x00be, 0xd0bc, 0x1500, 0xd1cc, 0x0904, 0xc70d, 0xa978, 0xa868, - 0xd0fc, 0x0904, 0xc6ce, 0x0016, 0xa87c, 0x0006, 0xa880, 0x0006, - 0x00a6, 0x2150, 0xb174, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x0904, - 0xc69b, 0x9086, 0x0028, 0x1904, 0xc687, 0xa87b, 0x001c, 0xb07b, - 0x001c, 0x0804, 0xc6a3, 0x6024, 0xd0f4, 0x11d0, 0xa838, 0xaa34, - 0x9205, 0x09c8, 0xa838, 0xaa90, 0x9206, 0x1120, 0xa88c, 0xaa34, - 0x9206, 0x0988, 0x6024, 0xd0d4, 0x1148, 0xa9ac, 0xa834, 0x9102, - 0x603a, 0xa9b0, 0xa838, 0x9103, 0x603e, 0x6024, 0xc0f5, 0x6026, - 0x6010, 0x00b6, 0x2058, 0xb83c, 0x8000, 0xb83e, 0x00be, 0x601c, - 0xc0fc, 0x601e, 0x9006, 0xa876, 0xa892, 0xa88e, 0xa87c, 0xc0e4, - 0xa87e, 0xd0cc, 0x0140, 0xc0cc, 0xa87e, 0x0096, 0xa878, 0x2048, - 0x080c, 0x100b, 0x009e, 0x080c, 0xd267, 0x0804, 0xc749, 0xd1dc, - 0x0158, 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xd508, 0x0118, - 0xb174, 0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, - 0xb07b, 0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, - 0x9115, 0x190c, 0xc519, 0xa87c, 0xb07e, 0xa890, 0xb092, 0xa88c, - 0xb08e, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0019, 0x20a0, 0x20a9, - 0x0020, 0x8a06, 0x8006, 0x8007, 0x9094, 0x003f, 0x22e0, 0x9084, - 0xffc0, 0x9080, 0x0019, 0x2098, 0x4003, 0x00ae, 0x000e, 0xa882, - 0x000e, 0xc0cc, 0xa87e, 0x080c, 0xd5e8, 0x001e, 0xa874, 0x0006, - 0x2148, 0x080c, 0x100b, 0x001e, 0x0804, 0xc73a, 0x0016, 0x00a6, - 0x2150, 0xb174, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x01e0, 0x9086, - 0x0028, 0x1128, 0xa87b, 0x001c, 0xb07b, 0x001c, 0x00e0, 0xd1dc, - 0x0158, 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xd508, 0x0118, - 0xb174, 0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, - 0xb07b, 0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, - 0x9115, 0x190c, 0xc519, 0xa890, 0xb092, 0xa88c, 0xb08e, 0xa87c, - 0xb07e, 0x00ae, 0x080c, 0x100b, 0x009e, 0x080c, 0xd5e8, 0xa974, - 0x0016, 0x080c, 0xca6b, 0x001e, 0x0468, 0xa867, 0x0103, 0xa974, - 0x9184, 0x00ff, 0x90b6, 0x0002, 0x01b0, 0x9086, 0x0028, 0x1118, - 0xa87b, 0x001c, 0x00d0, 0xd1dc, 0x0148, 0xa87b, 0x0015, 0x080c, - 0xd508, 0x0118, 0xa974, 0xc1dc, 0xa976, 0x0078, 0xd1d4, 0x0118, - 0xa87b, 0x0007, 0x0050, 0xa87b, 0x0000, 0xa87c, 0xd0ac, 0x0128, - 0xa834, 0xa938, 0x9115, 0x190c, 0xc519, 0xa974, 0x0016, 0x080c, - 0x6e27, 0x001e, 0x6010, 0x00b6, 0x2058, 0xba3c, 0xb8d0, 0x0016, - 0x9005, 0x190c, 0x68df, 0x001e, 0x00be, 0xd1e4, 0x1120, 0x080c, - 0xb16c, 0x009e, 0x0005, 0x080c, 0xd22a, 0x0cd8, 0x6114, 0x0096, - 0x2148, 0xa97c, 0x080c, 0xd66b, 0x190c, 0x1abf, 0x009e, 0x0005, - 0x0096, 0x6114, 0x2148, 0xa83c, 0xa940, 0x9105, 0x01e8, 0xa877, - 0x0000, 0xa87b, 0x0000, 0xa867, 0x0103, 0x00b6, 0x6010, 0x2058, - 0xa834, 0xa938, 0x9115, 0x11a0, 0x080c, 0x6e27, 0xba3c, 0x8211, - 0x0208, 0xba3e, 0xb8d0, 0x9005, 0x0110, 0x080c, 0x68df, 0x080c, - 0xb16c, 0x00be, 0x009e, 0x0005, 0xa87c, 0xc0dc, 0xa87e, 0x08f8, - 0xb800, 0xd0bc, 0x1120, 0xa834, 0x080c, 0xc519, 0x0c28, 0xa880, - 0xd0bc, 0x1dc8, 0x080c, 0xd267, 0x0c60, 0x080c, 0x99ed, 0x0010, - 0x080c, 0x9a48, 0x601c, 0xd084, 0x0110, 0x080c, 0x1ad3, 0x080c, - 0xcf1b, 0x01f0, 0x0096, 0x6114, 0x2148, 0x080c, 0xd132, 0x1118, - 0x080c, 0xbb5c, 0x00a0, 0xa867, 0x0103, 0x2009, 0x180c, 0x210c, - 0xd18c, 0x1198, 0xd184, 0x1170, 0x6108, 0xa97a, 0x918e, 0x0029, - 0x1110, 0x080c, 0xeddf, 0xa877, 0x0000, 0x080c, 0x7012, 0x009e, - 0x0804, 0xb1a7, 0xa87b, 0x0004, 0x0cb0, 0xa87b, 0x0004, 0x0c98, - 0x9182, 0x0057, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, - 0xc7df, 0xc7df, 0xc7df, 0xc7df, 0xc7df, 0xc7e1, 0xc7df, 0xc7df, - 0xc7df, 0xc7df, 0xc7df, 0xc7df, 0xc7df, 0xc7df, 0xc7df, 0xc7df, - 0xc7df, 0xc7df, 0xc7df, 0xc7df, 0xc805, 0xc7df, 0xc7df, 0x080c, - 0x0d85, 0x080c, 0x5848, 0x01f8, 0x6014, 0x7144, 0x918c, 0x0fff, - 0x9016, 0xd1c4, 0x0118, 0x7264, 0x9294, 0x00ff, 0x0096, 0x904d, - 0x0188, 0xa87b, 0x0000, 0xa864, 0x9086, 0x0139, 0x0128, 0xa867, - 0x0103, 0xa976, 0xaa96, 0x0030, 0xa897, 0x4000, 0xa99a, 0xaa9e, - 0x080c, 0x7012, 0x009e, 0x0804, 0xb16c, 0x080c, 0x5848, 0x0dd8, - 0x6014, 0x900e, 0x9016, 0x0c10, 0x9182, 0x0085, 0x0002, 0xc81e, - 0xc81c, 0xc81c, 0xc82a, 0xc81c, 0xc81c, 0xc81c, 0xc81c, 0xc81c, - 0xc81c, 0xc81c, 0xc81c, 0xc81c, 0x080c, 0x0d85, 0x6003, 0x0001, - 0x6106, 0x0126, 0x2091, 0x8000, 0x2009, 0x8020, 0x080c, 0x9617, - 0x012e, 0x0005, 0x0026, 0x0056, 0x00d6, 0x00e6, 0x2071, 0x0260, - 0x7224, 0x6216, 0x7220, 0x080c, 0xcf09, 0x01f8, 0x2268, 0x6800, - 0x9086, 0x0000, 0x01d0, 0x6010, 0x6d10, 0x952e, 0x11b0, 0x00c6, - 0x2d60, 0x00d6, 0x080c, 0xcadc, 0x00de, 0x00ce, 0x0158, 0x702c, - 0xd084, 0x1118, 0x080c, 0xcaa6, 0x0010, 0x6803, 0x0002, 0x6007, - 0x0086, 0x0028, 0x080c, 0xcac8, 0x0d90, 0x6007, 0x0087, 0x6003, - 0x0001, 0x2009, 0x8020, 0x080c, 0x9617, 0x7220, 0x080c, 0xcf09, - 0x0178, 0x6810, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0140, - 0x6824, 0xd0ec, 0x0128, 0x00c6, 0x2d60, 0x080c, 0xd267, 0x00ce, - 0x00ee, 0x00de, 0x005e, 0x002e, 0x0005, 0x9186, 0x0013, 0x1160, - 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0d85, 0x908a, 0x0092, 0x1a0c, - 0x0d85, 0x9082, 0x0085, 0x00e2, 0x9186, 0x0027, 0x0120, 0x9186, - 0x0014, 0x190c, 0x0d85, 0x080c, 0x99ed, 0x0096, 0x6014, 0x2048, - 0x080c, 0xcf1b, 0x0140, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, - 0x0029, 0x080c, 0x7012, 0x009e, 0x080c, 0xb1a7, 0x0804, 0x9ab3, - 0xc8ad, 0xc8af, 0xc8af, 0xc8ad, 0xc8ad, 0xc8ad, 0xc8ad, 0xc8ad, - 0xc8ad, 0xc8ad, 0xc8ad, 0xc8ad, 0xc8ad, 0x080c, 0x0d85, 0x080c, - 0xb1a7, 0x0005, 0x9186, 0x0013, 0x1130, 0x6004, 0x9082, 0x0085, - 0x2008, 0x0804, 0xc8fe, 0x9186, 0x0027, 0x1558, 0x080c, 0x99ed, - 0x080c, 0x3315, 0x080c, 0xd65a, 0x0096, 0x6014, 0x2048, 0x080c, - 0xcf1b, 0x0150, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, - 0x080c, 0x7012, 0x080c, 0xd10c, 0x009e, 0x080c, 0xb16c, 0x0005, - 0x9186, 0x0089, 0x0118, 0x9186, 0x008a, 0x1140, 0x080c, 0xaf61, - 0x0128, 0x9086, 0x000c, 0x0904, 0xc936, 0x0000, 0x080c, 0xb227, - 0x0c70, 0x9186, 0x0014, 0x1d60, 0x080c, 0x99ed, 0x0096, 0x6014, - 0x2048, 0x080c, 0xcf1b, 0x0d00, 0xa867, 0x0103, 0xa877, 0x0000, - 0xa87b, 0x0006, 0xa880, 0xc0ec, 0xa882, 0x0890, 0x0002, 0xc90e, - 0xc90c, 0xc90c, 0xc90c, 0xc90c, 0xc90c, 0xc922, 0xc90c, 0xc90c, - 0xc90c, 0xc90c, 0xc90c, 0xc90c, 0x080c, 0x0d85, 0x6034, 0x908c, - 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, - 0x2001, 0x1986, 0x0010, 0x2001, 0x1987, 0x2004, 0x601a, 0x6003, - 0x000c, 0x0005, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, - 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x1986, 0x0010, 0x2001, - 0x1987, 0x2004, 0x601a, 0x6003, 0x000e, 0x0005, 0x9182, 0x0092, - 0x1220, 0x9182, 0x0085, 0x0208, 0x0012, 0x0804, 0xb227, 0xc94c, - 0xc94c, 0xc94c, 0xc94c, 0xc94e, 0xc99b, 0xc94c, 0xc94c, 0xc94c, - 0xc94c, 0xc94c, 0xc94c, 0xc94c, 0x080c, 0x0d85, 0x0096, 0x6010, - 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0168, 0x6034, 0x908c, - 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, - 0x009e, 0x0804, 0xc9af, 0x080c, 0xcf1b, 0x1118, 0x080c, 0xd10c, - 0x0068, 0x6014, 0x2048, 0x080c, 0xd671, 0x1110, 0x080c, 0xd10c, - 0xa867, 0x0103, 0x080c, 0xd625, 0x080c, 0x7012, 0x00d6, 0x2c68, - 0x080c, 0xb116, 0x01d0, 0x6003, 0x0001, 0x6007, 0x001e, 0x600b, - 0xffff, 0x2009, 0x026e, 0x210c, 0x613a, 0x2009, 0x026f, 0x210c, - 0x613e, 0x6910, 0x6112, 0x080c, 0xd3b6, 0x695c, 0x615e, 0x6023, - 0x0001, 0x2009, 0x8020, 0x080c, 0x9617, 0x2d60, 0x00de, 0x080c, - 0xb16c, 0x009e, 0x0005, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, - 0xd0bc, 0x05a0, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0035, - 0x0130, 0x9186, 0x001e, 0x0118, 0x9186, 0x0039, 0x1538, 0x00d6, - 0x2c68, 0x080c, 0xd5bb, 0x11f0, 0x080c, 0xb116, 0x01d8, 0x6106, - 0x6003, 0x0001, 0x6023, 0x0001, 0x6910, 0x6112, 0x692c, 0x612e, - 0x6930, 0x6132, 0x6934, 0x918c, 0x00ff, 0x6136, 0x6938, 0x613a, - 0x693c, 0x613e, 0x695c, 0x615e, 0x080c, 0xd3b6, 0x2009, 0x8020, - 0x080c, 0x9617, 0x2d60, 0x00de, 0x0804, 0xb16c, 0x0096, 0x6014, - 0x2048, 0x080c, 0xcf1b, 0x01c8, 0xa867, 0x0103, 0xa880, 0xd0b4, - 0x0128, 0xc0ec, 0xa882, 0xa87b, 0x0006, 0x0048, 0xd0bc, 0x0118, - 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, 0x080c, 0xd226, 0xa877, - 0x0000, 0x080c, 0x7012, 0x080c, 0xd10c, 0x009e, 0x0804, 0xb16c, - 0x0016, 0x0096, 0x6014, 0x2048, 0x080c, 0xcf1b, 0x0140, 0xa867, - 0x0103, 0xa87b, 0x0028, 0xa877, 0x0000, 0x080c, 0x7012, 0x009e, - 0x001e, 0x9186, 0x0013, 0x0158, 0x9186, 0x0014, 0x0130, 0x9186, - 0x0027, 0x0118, 0x080c, 0xb227, 0x0020, 0x080c, 0x99ed, 0x080c, - 0xb1a7, 0x0005, 0x0056, 0x0066, 0x0096, 0x00a6, 0x2029, 0x0001, - 0x9182, 0x0101, 0x1208, 0x0010, 0x2009, 0x0100, 0x2130, 0x8304, - 0x9098, 0x0018, 0x2009, 0x0020, 0x2011, 0x0029, 0x080c, 0xca7b, - 0x96b2, 0x0020, 0xb004, 0x904d, 0x0110, 0x080c, 0x100b, 0x080c, - 0x1059, 0x0520, 0x8528, 0xa867, 0x0110, 0xa86b, 0x0000, 0x2920, - 0xb406, 0x968a, 0x003d, 0x1228, 0x2608, 0x2011, 0x001b, 0x0499, - 0x00a8, 0x96b2, 0x003c, 0x2009, 0x003c, 0x2950, 0x2011, 0x001b, - 0x0451, 0x0c28, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, - 0x95ad, 0x0003, 0xb566, 0x95ac, 0x0000, 0x0048, 0x2001, 0x0205, - 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0003, 0xb566, 0x009e, - 0x006e, 0x005e, 0x0005, 0x00a6, 0x89ff, 0x0158, 0xa804, 0x9055, - 0x0130, 0xa807, 0x0000, 0x080c, 0x7012, 0x2a48, 0x0cb8, 0x080c, - 0x7012, 0x00ae, 0x0005, 0x00f6, 0x2079, 0x0200, 0x7814, 0x9085, - 0x0080, 0x7816, 0xd184, 0x0108, 0x8108, 0x810c, 0x20a9, 0x0001, - 0xa860, 0x20e8, 0xa85c, 0x9200, 0x20a0, 0x20e1, 0x0000, 0x2300, - 0x9e00, 0x2098, 0x4003, 0x8318, 0x9386, 0x0020, 0x1148, 0x2018, - 0x2300, 0x9e00, 0x2098, 0x7814, 0x8000, 0x9085, 0x0080, 0x7816, - 0x8109, 0x1d80, 0x7817, 0x0000, 0x00fe, 0x0005, 0x6920, 0x9186, - 0x0003, 0x0118, 0x9186, 0x0002, 0x11d0, 0x00c6, 0x00d6, 0x00e6, - 0x2d60, 0x0096, 0x6014, 0x2048, 0x080c, 0xcf1b, 0x0150, 0x2001, - 0x0006, 0xa980, 0xc1d5, 0x080c, 0x725e, 0x080c, 0x7006, 0x080c, - 0xd10c, 0x009e, 0x080c, 0xb1a7, 0x00ee, 0x00de, 0x00ce, 0x0005, - 0x00c6, 0x702c, 0xd084, 0x1170, 0x6008, 0x2060, 0x6020, 0x9086, - 0x0002, 0x1140, 0x6104, 0x9186, 0x0085, 0x0118, 0x9186, 0x008b, - 0x1108, 0x9006, 0x00ce, 0x0005, 0x0066, 0x0126, 0x2091, 0x8000, - 0x2031, 0x0001, 0x6020, 0x9084, 0x000f, 0x0083, 0x012e, 0x006e, - 0x0005, 0x0126, 0x2091, 0x8000, 0x0066, 0x2031, 0x0000, 0x6020, - 0x9084, 0x000f, 0x001b, 0x006e, 0x012e, 0x0005, 0xcb2a, 0xcb2a, - 0xcb25, 0xcb4e, 0xcb06, 0xcb25, 0xcb08, 0xcb25, 0xcb25, 0x9458, - 0xcb25, 0xcb25, 0xcb25, 0xcb06, 0xcb06, 0xcb06, 0x080c, 0x0d85, - 0x6010, 0x9080, 0x0000, 0x2004, 0xd0bc, 0x190c, 0xcb4e, 0x0036, - 0x6014, 0x0096, 0x2048, 0xa880, 0x009e, 0xd0cc, 0x0118, 0x2019, - 0x000c, 0x0038, 0xd094, 0x0118, 0x2019, 0x000d, 0x0010, 0x2019, - 0x0010, 0x080c, 0xe578, 0x003e, 0x0005, 0x9006, 0x0005, 0x9085, - 0x0001, 0x0005, 0x0096, 0x86ff, 0x11e8, 0x6014, 0x2048, 0x080c, - 0xcf1b, 0x01d0, 0x6043, 0xffff, 0xa864, 0x9086, 0x0139, 0x1128, - 0xa87b, 0x0005, 0xa883, 0x0000, 0x0028, 0x900e, 0x2001, 0x0005, - 0x080c, 0x725e, 0x080c, 0xd226, 0x080c, 0x7006, 0x080c, 0xb1a7, - 0x9085, 0x0001, 0x009e, 0x0005, 0x9006, 0x0ce0, 0x080c, 0xacfc, - 0x080c, 0xd67f, 0x908a, 0x0010, 0x1a0c, 0x0d85, 0x002b, 0x0106, - 0x080c, 0xad18, 0x010e, 0x0005, 0xcb6c, 0xcb9c, 0xcb6e, 0xcbc3, - 0xcb97, 0xcb6c, 0xcb25, 0xcb2a, 0xcb2a, 0xcb25, 0xcb25, 0xcb25, - 0xcb25, 0xcb25, 0xcb25, 0xcb25, 0x080c, 0x0d85, 0x86ff, 0x1520, - 0x6020, 0x9086, 0x0006, 0x0500, 0x0096, 0x6014, 0x2048, 0x080c, - 0xcf1b, 0x0168, 0xa87c, 0xd0cc, 0x0140, 0x0096, 0xc0cc, 0xa87e, - 0xa878, 0x2048, 0x080c, 0x100b, 0x009e, 0x080c, 0xd226, 0x009e, - 0x080c, 0xd5ff, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, - 0x2009, 0x8020, 0x080c, 0x95f9, 0x9085, 0x0001, 0x0005, 0x0066, - 0x080c, 0x1ad3, 0x006e, 0x0890, 0x00e6, 0x2071, 0x19e8, 0x7030, - 0x9c06, 0x1120, 0x080c, 0xa516, 0x00ee, 0x0840, 0x6020, 0x9084, - 0x000f, 0x9086, 0x0006, 0x1150, 0x0086, 0x0096, 0x2049, 0x0001, - 0x2c40, 0x080c, 0xa667, 0x009e, 0x008e, 0x0040, 0x0066, 0x080c, - 0xa412, 0x190c, 0x0d85, 0x080c, 0xa420, 0x006e, 0x00ee, 0x1904, - 0xcb6e, 0x0804, 0xcb25, 0x0036, 0x00e6, 0x2071, 0x19e8, 0x704c, - 0x9c06, 0x1138, 0x901e, 0x080c, 0xa596, 0x00ee, 0x003e, 0x0804, - 0xcb6e, 0x080c, 0xa7a1, 0x00ee, 0x003e, 0x1904, 0xcb6e, 0x0804, - 0xcb25, 0x00c6, 0x0066, 0x6020, 0x9084, 0x000f, 0x001b, 0x006e, - 0x00ce, 0x0005, 0xcbf9, 0xcce2, 0xce50, 0xcc01, 0xb1a7, 0xcbf9, - 0xe56e, 0xd667, 0xcce2, 0x941f, 0xcedc, 0xcbf2, 0xcbf2, 0xcbf2, - 0xcbf2, 0xcbf2, 0x080c, 0x0d85, 0x080c, 0xd132, 0x1110, 0x080c, - 0xbb5c, 0x0005, 0x080c, 0x99ed, 0x0804, 0xb16c, 0x601b, 0x0001, - 0x0005, 0x080c, 0xcf1b, 0x0130, 0x6014, 0x0096, 0x2048, 0x2c00, - 0xa896, 0x009e, 0x080c, 0xacfc, 0x080c, 0xd67f, 0x908a, 0x0010, - 0x1a0c, 0x0d85, 0x0013, 0x0804, 0xad18, 0xcc25, 0xcc27, 0xcc51, - 0xcc65, 0xcc92, 0xcc25, 0xcbf9, 0xcbf9, 0xcbf9, 0xcc6c, 0xcc6c, - 0xcc25, 0xcc25, 0xcc25, 0xcc25, 0xcc76, 0x080c, 0x0d85, 0x00e6, - 0x6014, 0x0096, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x2071, - 0x19e8, 0x7030, 0x9c06, 0x01d0, 0x0066, 0x080c, 0xa412, 0x190c, - 0x0d85, 0x080c, 0xa420, 0x006e, 0x080c, 0xd5ff, 0x6007, 0x0085, - 0x6003, 0x000b, 0x6023, 0x0002, 0x2001, 0x1987, 0x2004, 0x601a, - 0x2009, 0x8020, 0x080c, 0x95f9, 0x00ee, 0x0005, 0x601b, 0x0001, - 0x0cd8, 0x0096, 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, - 0x080c, 0xd5ff, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, - 0x2009, 0x8020, 0x080c, 0x95f9, 0x0005, 0x080c, 0xacfc, 0x080c, - 0xaee3, 0x080c, 0xad18, 0x0c28, 0x0096, 0x601b, 0x0001, 0x6014, - 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x0005, 0x080c, 0x5848, - 0x01b8, 0x6014, 0x0096, 0x904d, 0x0190, 0xa864, 0xa867, 0x0103, - 0xa87b, 0x0006, 0x9086, 0x0139, 0x1150, 0xa867, 0x0139, 0xa87b, - 0x0030, 0xa897, 0x4005, 0xa89b, 0x0004, 0x080c, 0x7012, 0x009e, - 0x0804, 0xb16c, 0x6014, 0x0096, 0x904d, 0x0904, 0xccdd, 0xa97c, - 0xd1e4, 0x1160, 0x611c, 0xd1fc, 0x0904, 0xccdd, 0x6110, 0x00b6, - 0x2158, 0xb93c, 0x8109, 0x0208, 0xb93e, 0x00be, 0x080c, 0xad18, - 0x2001, 0x180f, 0x2004, 0xd0c4, 0x0110, 0x009e, 0x0005, 0xa884, - 0x009e, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0x2001, 0x0030, - 0x2c08, 0x080c, 0x16b9, 0x2001, 0x030c, 0x2004, 0x9086, 0x0041, - 0x1198, 0x6014, 0x0096, 0x904d, 0x090c, 0x0d85, 0xa880, 0xd0f4, - 0x1130, 0xc0f5, 0xa882, 0x009e, 0x601b, 0x0002, 0x0068, 0x009e, - 0x00c6, 0x080c, 0x2185, 0x00ce, 0x6000, 0x9086, 0x0004, 0x1120, - 0x2009, 0x0048, 0x080c, 0xb20a, 0x0005, 0x009e, 0x080c, 0x1ad3, - 0x0804, 0xcc51, 0x6000, 0x908a, 0x0010, 0x1a0c, 0x0d85, 0x000b, - 0x0005, 0xccf9, 0xcbfe, 0xccfb, 0xccf9, 0xccfb, 0xccfb, 0xcbfa, - 0xccf9, 0xcbf4, 0xcbf4, 0xccf9, 0xccf9, 0xccf9, 0xccf9, 0xccf9, - 0xccf9, 0x080c, 0x0d85, 0x6010, 0x00b6, 0x2058, 0xb804, 0x9084, - 0x00ff, 0x00be, 0x908a, 0x000c, 0x1a0c, 0x0d85, 0x00b6, 0x0013, - 0x00be, 0x0005, 0xcd16, 0xcde7, 0xcd18, 0xcd58, 0xcd18, 0xcd58, - 0xcd18, 0xcd26, 0xcd16, 0xcd58, 0xcd16, 0xcd47, 0x080c, 0x0d85, - 0x6004, 0x908e, 0x0016, 0x05c0, 0x908e, 0x0004, 0x05a8, 0x908e, - 0x0002, 0x0590, 0x908e, 0x0052, 0x0904, 0xcde3, 0x6004, 0x080c, - 0xd132, 0x0904, 0xce00, 0x908e, 0x0004, 0x1110, 0x080c, 0x3344, - 0x908e, 0x0021, 0x0904, 0xce04, 0x908e, 0x0022, 0x0904, 0xce4b, - 0x908e, 0x003d, 0x0904, 0xce04, 0x908e, 0x0039, 0x0904, 0xce08, - 0x908e, 0x0035, 0x0904, 0xce08, 0x908e, 0x001e, 0x0178, 0x908e, - 0x0001, 0x1140, 0x6010, 0x2058, 0xb804, 0x9084, 0x00ff, 0x9086, - 0x0006, 0x0110, 0x080c, 0x3315, 0x080c, 0xbb5c, 0x0804, 0xb1a7, - 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, 0x0904, 0xcdd4, 0x9186, - 0x0002, 0x1904, 0xcda9, 0x2001, 0x1837, 0x2004, 0xd08c, 0x11c8, - 0x080c, 0x779e, 0x11b0, 0x080c, 0xd645, 0x0138, 0x080c, 0x77c1, - 0x1120, 0x080c, 0x76a7, 0x0804, 0xce34, 0x2001, 0x197d, 0x2003, - 0x0001, 0x2001, 0x1800, 0x2003, 0x0001, 0x080c, 0x76cd, 0x0804, - 0xce34, 0x6010, 0x2058, 0xb8a0, 0x9086, 0x0080, 0x0130, 0x2001, - 0x1837, 0x2004, 0xd0ac, 0x1904, 0xce34, 0xb8a0, 0x9082, 0x0081, - 0x1a04, 0xce34, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0190, 0x8001, - 0xb842, 0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, 0x604b, - 0x0000, 0x080c, 0xb116, 0x0128, 0x2b00, 0x6012, 0x6023, 0x0001, - 0x0458, 0x00de, 0x00ce, 0x6004, 0x908e, 0x0002, 0x11a0, 0x6010, - 0x2058, 0xb8a0, 0x9086, 0x007e, 0x1170, 0x2009, 0x1837, 0x2104, - 0xc085, 0x200a, 0x00e6, 0x2071, 0x1800, 0x080c, 0x6130, 0x00ee, - 0x080c, 0xbb5c, 0x0030, 0x080c, 0xbb5c, 0x080c, 0x3315, 0x080c, - 0xd65a, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x3344, 0x012e, - 0x00ee, 0x080c, 0xb1a7, 0x0005, 0x2001, 0x0002, 0x080c, 0x66fa, - 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x961e, 0x080c, 0x9ab3, - 0x00de, 0x00ce, 0x0c80, 0x080c, 0x3344, 0x0804, 0xcd54, 0x00c6, - 0x00d6, 0x6104, 0x9186, 0x0016, 0x0d38, 0x6010, 0x2058, 0xb840, - 0x9084, 0x00ff, 0x9005, 0x0904, 0xcda9, 0x8001, 0xb842, 0x6003, - 0x0001, 0x080c, 0x961e, 0x080c, 0x9ab3, 0x00de, 0x00ce, 0x0898, - 0x080c, 0xbb5c, 0x0804, 0xcd56, 0x080c, 0xbb98, 0x0804, 0xcd56, - 0x00d6, 0x2c68, 0x6104, 0x080c, 0xd5bb, 0x00de, 0x0118, 0x080c, - 0xb16c, 0x0408, 0x6004, 0x8007, 0x6134, 0x918c, 0x00ff, 0x9105, - 0x6036, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x603c, - 0x600a, 0x2001, 0x1987, 0x2004, 0x601a, 0x602c, 0x2c08, 0x2060, - 0x6024, 0xd0b4, 0x0108, 0xc085, 0xc0b5, 0x6026, 0x2160, 0x2009, - 0x8020, 0x080c, 0x9617, 0x0005, 0x00de, 0x00ce, 0x080c, 0xbb5c, - 0x080c, 0x3315, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x3344, - 0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, 0x604b, 0x0000, - 0x012e, 0x00ee, 0x0005, 0x080c, 0xb5a8, 0x1904, 0xce00, 0x0005, - 0x6000, 0x908a, 0x0010, 0x1a0c, 0x0d85, 0x0096, 0x00d6, 0x001b, - 0x00de, 0x009e, 0x0005, 0xce6b, 0xce6b, 0xce6b, 0xce6b, 0xce6b, - 0xce6b, 0xce6b, 0xce6b, 0xce6b, 0xcbf9, 0xce6b, 0xcbfe, 0xce6d, - 0xcbfe, 0xce87, 0xce6b, 0x080c, 0x0d85, 0x6004, 0x9086, 0x008b, - 0x01b0, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0035, 0x1130, - 0x602c, 0x9080, 0x0009, 0x200c, 0xc185, 0x2102, 0x6007, 0x008b, - 0x6003, 0x000d, 0x2009, 0x8020, 0x080c, 0x9617, 0x0005, 0x080c, - 0xd639, 0x0118, 0x080c, 0xd64c, 0x0010, 0x080c, 0xd65a, 0x080c, - 0xd10c, 0x080c, 0xcf1b, 0x0570, 0x080c, 0x3315, 0x080c, 0xcf1b, - 0x0168, 0x6014, 0x2048, 0xa867, 0x0103, 0xa87b, 0x0006, 0xa877, - 0x0000, 0xa880, 0xc0ed, 0xa882, 0x080c, 0x7012, 0x2c68, 0x080c, - 0xb116, 0x0150, 0x6810, 0x6012, 0x080c, 0xd3b6, 0x00c6, 0x2d60, - 0x080c, 0xb1a7, 0x00ce, 0x0008, 0x2d60, 0x6017, 0x0000, 0x6023, - 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x961e, 0x080c, - 0x9ab3, 0x00c8, 0x080c, 0xd639, 0x0138, 0x6034, 0x9086, 0x4000, - 0x1118, 0x080c, 0x3315, 0x08d0, 0x6034, 0x908c, 0xff00, 0x810f, - 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x080c, 0x3315, - 0x0868, 0x080c, 0xb1a7, 0x0005, 0x6000, 0x908a, 0x0010, 0x1a0c, - 0x0d85, 0x0002, 0xcef2, 0xcef2, 0xcefa, 0xcef4, 0xcf04, 0xcef2, - 0xcef2, 0xb1a7, 0xcef2, 0xcef2, 0xcef2, 0xcef2, 0xcef2, 0xcef2, - 0xcef2, 0xcef2, 0x080c, 0x0d85, 0x080c, 0xacfc, 0x080c, 0xaee3, - 0x080c, 0xad18, 0x6114, 0x0096, 0x2148, 0xa87b, 0x0006, 0x080c, - 0x7012, 0x009e, 0x0804, 0xb16c, 0x601c, 0xd084, 0x190c, 0x1ad3, - 0x0c88, 0x9284, 0x0003, 0x1158, 0x9282, 0x1ddc, 0x0240, 0x2001, - 0x181a, 0x2004, 0x9202, 0x1218, 0x9085, 0x0001, 0x0005, 0x9006, - 0x0ce8, 0x0096, 0x0028, 0x0096, 0x0006, 0x6014, 0x2048, 0x000e, - 0x0006, 0x9984, 0xf000, 0x9086, 0xf000, 0x0110, 0x080c, 0x1104, - 0x000e, 0x009e, 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0006, 0x0126, - 0x2091, 0x8000, 0x2061, 0x1ddc, 0x2071, 0x1800, 0x7354, 0x7074, - 0x9302, 0x1640, 0x6020, 0x9206, 0x11f8, 0x080c, 0xd645, 0x0180, - 0x9286, 0x0001, 0x1168, 0x6004, 0x9086, 0x0004, 0x1148, 0x080c, - 0x3315, 0x080c, 0xd65a, 0x00c6, 0x080c, 0xb1a7, 0x00ce, 0x0060, - 0x080c, 0xd328, 0x0148, 0x080c, 0xd132, 0x1110, 0x080c, 0xbb5c, - 0x00c6, 0x080c, 0xb16c, 0x00ce, 0x9ce0, 0x001c, 0x7068, 0x9c02, - 0x1208, 0x08a0, 0x012e, 0x000e, 0x003e, 0x00ce, 0x00ee, 0x0005, - 0x00e6, 0x00c6, 0x0016, 0x9188, 0x1000, 0x210c, 0x81ff, 0x0128, - 0x2061, 0x1b39, 0x6112, 0x080c, 0x3315, 0x9006, 0x0010, 0x9085, - 0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x00c6, 0x0126, 0x2091, - 0x8000, 0x080c, 0xb116, 0x01b0, 0x665e, 0x2b00, 0x6012, 0x080c, - 0x5848, 0x0118, 0x080c, 0xd04e, 0x0168, 0x080c, 0xd3b6, 0x6023, - 0x0003, 0x2009, 0x004b, 0x080c, 0xb20a, 0x9085, 0x0001, 0x012e, - 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, - 0xbaa0, 0x080c, 0xb1dd, 0x0580, 0x605f, 0x0000, 0x2b00, 0x6012, - 0x080c, 0xd3b6, 0x6023, 0x0003, 0x0016, 0x080c, 0xacfc, 0x080c, - 0x97b0, 0x0076, 0x903e, 0x080c, 0x966d, 0x2c08, 0x080c, 0xe75d, - 0x007e, 0x080c, 0xad18, 0x001e, 0xd184, 0x0128, 0x080c, 0xb16c, - 0x9085, 0x0001, 0x0070, 0x080c, 0x5848, 0x0128, 0xd18c, 0x1170, - 0x080c, 0xd04e, 0x0148, 0x2009, 0x004c, 0x080c, 0xb20a, 0x9085, - 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2900, 0x6016, - 0x0c90, 0x2009, 0x004d, 0x0010, 0x2009, 0x004e, 0x00f6, 0x00c6, - 0x0046, 0x0016, 0x080c, 0xb116, 0x2c78, 0x05a0, 0x7e5e, 0x2b00, - 0x7812, 0x7823, 0x0003, 0x0016, 0x2021, 0x0005, 0x080c, 0xd060, - 0x001e, 0x9186, 0x004d, 0x0118, 0x9186, 0x004e, 0x0148, 0x2001, - 0x1980, 0x200c, 0xd1fc, 0x0168, 0x2f60, 0x080c, 0xb16c, 0x00d0, - 0x2001, 0x197f, 0x200c, 0xd1fc, 0x0120, 0x2f60, 0x080c, 0xb16c, - 0x0088, 0x2f60, 0x080c, 0x5848, 0x0138, 0xd18c, 0x1118, 0x04f1, - 0x0148, 0x0010, 0x2900, 0x7816, 0x001e, 0x0016, 0x080c, 0xb20a, - 0x9085, 0x0001, 0x001e, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6, - 0x00c6, 0x0046, 0x080c, 0xb116, 0x2c78, 0x0508, 0x7e5e, 0x2b00, - 0x7812, 0x7823, 0x0003, 0x0096, 0x2021, 0x0004, 0x0489, 0x009e, - 0x2001, 0x197e, 0x200c, 0xd1fc, 0x0120, 0x2f60, 0x080c, 0xb16c, - 0x0060, 0x2f60, 0x080c, 0x5848, 0x0120, 0xd18c, 0x1160, 0x0071, - 0x0130, 0x2009, 0x0052, 0x080c, 0xb20a, 0x9085, 0x0001, 0x004e, - 0x00ce, 0x00fe, 0x0005, 0x2900, 0x7816, 0x0c98, 0x00c6, 0x080c, - 0x4c41, 0x00ce, 0x1120, 0x080c, 0xb16c, 0x9006, 0x0005, 0xa867, - 0x0000, 0xa86b, 0x8000, 0x2900, 0x6016, 0x9085, 0x0001, 0x0005, - 0x0096, 0x0076, 0x0126, 0x2091, 0x8000, 0x080c, 0xacfc, 0x080c, - 0x699d, 0x0158, 0x2001, 0xd067, 0x0006, 0x900e, 0x2400, 0x080c, - 0x725e, 0x080c, 0x7012, 0x000e, 0x0807, 0x2418, 0x080c, 0x99b3, - 0xbaa0, 0x0086, 0x2041, 0x0001, 0x2039, 0x0001, 0x2608, 0x080c, - 0x97ca, 0x008e, 0x080c, 0x966d, 0x2f08, 0x2648, 0x080c, 0xe75d, - 0xb93c, 0x81ff, 0x090c, 0x98a3, 0x080c, 0xad18, 0x012e, 0x007e, - 0x009e, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xb116, - 0x0190, 0x660a, 0x2b08, 0x6112, 0x080c, 0xd3b6, 0x6023, 0x0001, - 0x2900, 0x6016, 0x2009, 0x001f, 0x080c, 0xb20a, 0x9085, 0x0001, - 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, - 0x8000, 0x080c, 0xb1dd, 0x01b8, 0x660a, 0x2b08, 0x6112, 0x080c, - 0xd3b6, 0x6023, 0x0008, 0x2900, 0x6016, 0x00f6, 0x2c78, 0x080c, - 0x17ad, 0x00fe, 0x2009, 0x0021, 0x080c, 0xb20a, 0x9085, 0x0001, - 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2009, 0x003d, 0x00c6, - 0x0126, 0x0016, 0x2091, 0x8000, 0x080c, 0xb116, 0x0198, 0x660a, - 0x2b08, 0x6112, 0x080c, 0xd3b6, 0x6023, 0x0001, 0x2900, 0x6016, - 0x001e, 0x0016, 0x080c, 0xb20a, 0x9085, 0x0001, 0x001e, 0x012e, - 0x00ce, 0x0005, 0x9006, 0x0cd0, 0x00c6, 0x0126, 0x2091, 0x8000, - 0x080c, 0xb1dd, 0x0188, 0x2b08, 0x6112, 0x080c, 0xd3b6, 0x6023, - 0x0001, 0x2900, 0x6016, 0x2009, 0x0000, 0x080c, 0xb20a, 0x9085, - 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2009, 0x0044, - 0x0830, 0x2009, 0x0049, 0x0818, 0x0026, 0x00b6, 0x6210, 0x2258, - 0xba3c, 0x82ff, 0x0118, 0x8211, 0xba3e, 0x1140, 0xb8d0, 0x9005, - 0x0128, 0xb888, 0x9005, 0x1110, 0xb88b, 0x0001, 0x00be, 0x002e, - 0x0005, 0x0006, 0x0016, 0x6004, 0x908e, 0x0002, 0x0140, 0x908e, - 0x0003, 0x0128, 0x908e, 0x0004, 0x0110, 0x9085, 0x0001, 0x001e, - 0x000e, 0x0005, 0x0006, 0x0086, 0x0096, 0x6020, 0x9086, 0x0004, - 0x01a8, 0x6014, 0x904d, 0x080c, 0xcf1b, 0x0180, 0xa864, 0x9086, - 0x0139, 0x0170, 0x6020, 0x90c6, 0x0003, 0x0140, 0x90c6, 0x0002, - 0x0128, 0xa868, 0xd0fc, 0x0110, 0x9006, 0x0010, 0x9085, 0x0001, - 0x009e, 0x008e, 0x000e, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, - 0x080c, 0xb1dd, 0x0198, 0x2b08, 0x6112, 0x080c, 0xd3b6, 0x6023, - 0x0001, 0x2900, 0x6016, 0x080c, 0x3315, 0x2009, 0x0028, 0x080c, - 0xb20a, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, - 0x9186, 0x0015, 0x11a8, 0x2011, 0x1824, 0x2204, 0x9086, 0x0074, - 0x1178, 0x00b6, 0x080c, 0xbe09, 0x00be, 0x080c, 0xc085, 0x6003, - 0x0001, 0x6007, 0x0029, 0x080c, 0x961e, 0x080c, 0x9ab3, 0x0078, - 0x6014, 0x0096, 0x2048, 0xa868, 0x009e, 0xd0fc, 0x0148, 0x2001, - 0x0001, 0x080c, 0xd57c, 0x080c, 0xbb5c, 0x080c, 0xb16c, 0x0005, - 0x0096, 0x6014, 0x904d, 0x090c, 0x0d85, 0xa87b, 0x0030, 0xa883, - 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004, 0xa867, 0x0139, 0x0126, - 0x2091, 0x8000, 0x080c, 0x7012, 0x012e, 0x009e, 0x080c, 0xb16c, - 0x0c30, 0x0096, 0x9186, 0x0016, 0x1128, 0x2001, 0x0004, 0x080c, - 0x66fa, 0x00e8, 0x9186, 0x0015, 0x1510, 0x2011, 0x1824, 0x2204, - 0x9086, 0x0014, 0x11e0, 0x6010, 0x00b6, 0x2058, 0x080c, 0x684f, - 0x00be, 0x080c, 0xc15b, 0x1198, 0x6010, 0x00b6, 0x2058, 0xb890, - 0x00be, 0x9005, 0x0160, 0x2001, 0x0006, 0x080c, 0x66fa, 0x6014, - 0x2048, 0xa868, 0xd0fc, 0x0170, 0x080c, 0xb57c, 0x0048, 0x6014, - 0x2048, 0xa868, 0xd0fc, 0x0528, 0x080c, 0xbb5c, 0x080c, 0xb16c, - 0x009e, 0x0005, 0x6014, 0x6310, 0x2358, 0x904d, 0x090c, 0x0d85, - 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x900e, 0x080c, - 0x6aae, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0xa99a, - 0x0126, 0x2091, 0x8000, 0x080c, 0x7012, 0x012e, 0x080c, 0xb16c, - 0x08f8, 0x6014, 0x904d, 0x090c, 0x0d85, 0xa87b, 0x0030, 0xa883, - 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004, 0xa867, 0x0139, 0x0126, - 0x2091, 0x8000, 0x080c, 0x7012, 0x012e, 0x080c, 0xb16c, 0x0840, - 0xa878, 0x9086, 0x0005, 0x1108, 0x0009, 0x0005, 0xa880, 0xc0ad, - 0xa882, 0x0005, 0x604b, 0x0000, 0x6017, 0x0000, 0x6003, 0x0001, - 0x6007, 0x0050, 0x2009, 0x8023, 0x080c, 0x9617, 0x0005, 0x00c6, - 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0130, 0x0066, - 0x6020, 0x9084, 0x000f, 0x001b, 0x006e, 0x00ce, 0x0005, 0xcbf9, - 0xd259, 0xd259, 0xd25c, 0xeadc, 0xeaf7, 0xeafa, 0xcbf9, 0xcbf9, - 0xcbf9, 0xcbf9, 0xcbf9, 0xcbf9, 0xcbf9, 0xcbf9, 0xcbf9, 0x080c, - 0x0d85, 0xa001, 0xa001, 0x0005, 0x0096, 0x6014, 0x904d, 0x0118, - 0xa87c, 0xd0e4, 0x1110, 0x009e, 0x0010, 0x009e, 0x0005, 0x6010, - 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0550, 0x2001, 0x1834, - 0x2004, 0x9005, 0x1540, 0x00f6, 0x2c78, 0x080c, 0xb116, 0x0508, - 0x7810, 0x6012, 0x080c, 0xd3b6, 0x7820, 0x9086, 0x0003, 0x0128, - 0x7808, 0x603a, 0x2f00, 0x603e, 0x0020, 0x7808, 0x603e, 0x2f00, - 0x603a, 0x602e, 0x6023, 0x0001, 0x6007, 0x0035, 0x6003, 0x0001, - 0x795c, 0x615e, 0x2009, 0x8020, 0x080c, 0x9617, 0x2f60, 0x00fe, - 0x0005, 0x2f60, 0x00fe, 0x2001, 0x1988, 0x2004, 0x604a, 0x0005, - 0x0016, 0x0096, 0x6814, 0x2048, 0x681c, 0xd0fc, 0xc0fc, 0x681e, - 0xa87c, 0x1108, 0xd0e4, 0x0180, 0xc0e4, 0xa87e, 0xa877, 0x0000, - 0xa893, 0x0000, 0xa88f, 0x0000, 0xd0cc, 0x0130, 0xc0cc, 0xa87e, - 0xa878, 0x2048, 0x080c, 0x100b, 0x6830, 0x6036, 0x908e, 0x0001, - 0x0148, 0x6803, 0x0002, 0x9086, 0x0005, 0x0170, 0x9006, 0x602e, - 0x6032, 0x00d0, 0x681c, 0xc085, 0x681e, 0x6803, 0x0004, 0x6824, - 0xc0f4, 0x9085, 0x0c00, 0x6826, 0x6814, 0x2048, 0xa8ac, 0x6938, - 0x9102, 0xa8b0, 0x693c, 0x9103, 0x1e48, 0x683c, 0x602e, 0x6838, - 0x9084, 0xfffc, 0x683a, 0x6032, 0x2d00, 0x603a, 0x6808, 0x603e, - 0x6910, 0x6112, 0x695c, 0x615e, 0x6023, 0x0001, 0x6007, 0x0039, - 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x9617, 0x009e, 0x001e, - 0x0005, 0x6024, 0xd0d4, 0x0510, 0xd0f4, 0x11f8, 0x6038, 0x940a, - 0x603c, 0x9303, 0x0230, 0x9105, 0x0120, 0x6024, 0xc0d4, 0xc0f5, - 0x0098, 0x643a, 0x633e, 0xac3e, 0xab42, 0x0046, 0x0036, 0x2400, - 0xacac, 0x9402, 0xa836, 0x2300, 0xabb0, 0x9303, 0xa83a, 0x003e, - 0x004e, 0x6024, 0xc0d4, 0x0000, 0x6026, 0x0005, 0xd0f4, 0x1138, - 0xa83c, 0x603a, 0xa840, 0x603e, 0x6024, 0xc0f5, 0x6026, 0x0005, - 0x0006, 0x0016, 0x6004, 0x908e, 0x0034, 0x01b8, 0x908e, 0x0035, - 0x01a0, 0x908e, 0x0036, 0x0188, 0x908e, 0x0037, 0x0170, 0x908e, - 0x0038, 0x0158, 0x908e, 0x0039, 0x0140, 0x908e, 0x003a, 0x0128, - 0x908e, 0x003b, 0x0110, 0x9085, 0x0001, 0x001e, 0x000e, 0x0005, - 0x0006, 0x0016, 0x0026, 0x0036, 0x00e6, 0x2001, 0x1982, 0x200c, - 0x8000, 0x2014, 0x2001, 0x0032, 0x080c, 0x955b, 0x2001, 0x1986, - 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001, 0x1984, 0x200c, - 0x8000, 0x2014, 0x2071, 0x196c, 0x711a, 0x721e, 0x2001, 0x0064, - 0x080c, 0x955b, 0x2001, 0x1987, 0x82ff, 0x1110, 0x2011, 0x0014, - 0x2202, 0x2001, 0x1988, 0x9288, 0x000a, 0x2102, 0x2001, 0x0017, - 0x080c, 0xaced, 0x2001, 0x1a90, 0x2102, 0x2001, 0x0032, 0x080c, - 0x16b9, 0x080c, 0x6bf2, 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, - 0x0005, 0x0006, 0x0016, 0x00e6, 0x2001, 0x1986, 0x2003, 0x0028, - 0x2001, 0x1987, 0x2003, 0x0014, 0x2071, 0x196c, 0x701b, 0x0000, - 0x701f, 0x07d0, 0x2001, 0x1988, 0x2009, 0x001e, 0x2102, 0x2001, - 0x0017, 0x080c, 0xaced, 0x2001, 0x1a90, 0x2102, 0x2001, 0x0032, - 0x080c, 0x16b9, 0x00ee, 0x001e, 0x000e, 0x0005, 0x0096, 0x6060, - 0x904d, 0x0110, 0x080c, 0x108b, 0x009e, 0x0005, 0x0005, 0x00c6, - 0x0126, 0x2091, 0x8000, 0x080c, 0xb116, 0x0180, 0x2b08, 0x6112, - 0x0ca9, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x0033, 0x080c, - 0xb20a, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, - 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x1520, - 0x7090, 0x9086, 0x0018, 0x0120, 0x7090, 0x9086, 0x0014, 0x11e0, - 0x6014, 0x2048, 0xaa3c, 0xd2e4, 0x1160, 0x2c78, 0x080c, 0x9b83, - 0x01d8, 0x707c, 0xaa50, 0x9206, 0x1160, 0x7080, 0xaa54, 0x9206, - 0x1140, 0x6210, 0x00b6, 0x2258, 0xbaa0, 0x00be, 0x900e, 0x080c, - 0x3364, 0x080c, 0xb57c, 0x0020, 0x080c, 0xbb5c, 0x080c, 0xb16c, - 0x00fe, 0x00ee, 0x009e, 0x0005, 0x7060, 0xaa54, 0x9206, 0x0d48, - 0x0c80, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xb116, 0x0188, - 0x2b08, 0x6112, 0x080c, 0xd3b6, 0x6023, 0x0001, 0x2900, 0x6016, - 0x2009, 0x004d, 0x080c, 0xb20a, 0x9085, 0x0001, 0x012e, 0x00ce, - 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x0016, - 0x080c, 0xb116, 0x0180, 0x2b08, 0x6112, 0x080c, 0xd3b6, 0x6023, - 0x0001, 0x2900, 0x6016, 0x001e, 0x080c, 0xb20a, 0x9085, 0x0001, - 0x012e, 0x00ce, 0x0005, 0x001e, 0x9006, 0x0cd0, 0x0016, 0x0026, - 0x0036, 0x0046, 0x0056, 0x0066, 0x0096, 0x00e6, 0x00f6, 0x2071, - 0x1800, 0x9186, 0x0015, 0x1568, 0x7190, 0x6014, 0x2048, 0xa814, - 0x8003, 0x9106, 0x1530, 0x20e1, 0x0000, 0x2001, 0x19a1, 0x2003, - 0x0000, 0x6014, 0x2048, 0xa830, 0x20a8, 0x8906, 0x8006, 0x8007, - 0x9094, 0x003f, 0x22e8, 0x9084, 0xffc0, 0x9080, 0x001b, 0x20a0, - 0x2001, 0x19a1, 0x0016, 0x200c, 0x080c, 0xdca1, 0x001e, 0xa804, - 0x9005, 0x0110, 0x2048, 0x0c38, 0x6014, 0x2048, 0xa867, 0x0103, - 0x0010, 0x080c, 0xbb5c, 0x080c, 0xb16c, 0x00fe, 0x00ee, 0x009e, - 0x006e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, 0x0096, - 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x11b8, 0x7090, - 0x9086, 0x0004, 0x1198, 0x6014, 0x2048, 0x2c78, 0x080c, 0x9b83, - 0x01a8, 0x707c, 0xaa74, 0x9206, 0x1130, 0x7080, 0xaa78, 0x9206, - 0x1110, 0x080c, 0x3315, 0x080c, 0xb57c, 0x0020, 0x080c, 0xbb5c, - 0x080c, 0xb16c, 0x00fe, 0x00ee, 0x009e, 0x0005, 0x7060, 0xaa78, - 0x9206, 0x0d78, 0x0c80, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, - 0x9186, 0x0015, 0x1550, 0x7090, 0x9086, 0x0004, 0x1530, 0x6014, - 0x2048, 0x2c78, 0x080c, 0x9b83, 0x05f0, 0x707c, 0xaacc, 0x9206, - 0x1180, 0x7080, 0xaad0, 0x9206, 0x1160, 0x080c, 0x3315, 0x0016, - 0xa998, 0xaab0, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x57e9, 0x001e, - 0x0010, 0x080c, 0x55cc, 0x080c, 0xcf1b, 0x0508, 0xa87b, 0x0000, - 0xa883, 0x0000, 0xa897, 0x4000, 0x0080, 0x080c, 0xcf1b, 0x01b8, - 0x6014, 0x2048, 0x080c, 0x55cc, 0x1d70, 0xa87b, 0x0030, 0xa883, - 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004, 0x0126, 0x2091, 0x8000, - 0xa867, 0x0139, 0x080c, 0x7012, 0x012e, 0x080c, 0xb16c, 0x00fe, - 0x00ee, 0x009e, 0x0005, 0x7060, 0xaad0, 0x9206, 0x0930, 0x0888, - 0x0016, 0x0026, 0xa87c, 0xd0ac, 0x0178, 0xa938, 0xaa34, 0x2100, - 0x9205, 0x0150, 0xa890, 0x9106, 0x1118, 0xa88c, 0x9206, 0x0120, - 0xa992, 0xaa8e, 0x9085, 0x0001, 0x002e, 0x001e, 0x0005, 0x00b6, - 0x00d6, 0x0036, 0x080c, 0xcf1b, 0x0904, 0xd578, 0x0096, 0x6314, - 0x2348, 0xa87a, 0xa982, 0x929e, 0x4000, 0x1580, 0x6310, 0x00c6, - 0x2358, 0x2009, 0x0000, 0xa868, 0xd0f4, 0x1140, 0x080c, 0x6aae, - 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0xaa96, 0xa99a, - 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, - 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0fd6, - 0x20a9, 0x0004, 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8c8, 0x9080, - 0x000a, 0x2098, 0x080c, 0x0fd6, 0x00ce, 0x0090, 0xaa96, 0x3918, - 0x9398, 0x0007, 0x231c, 0x6004, 0x9086, 0x0016, 0x0110, 0xa89b, - 0x0004, 0xaba2, 0x6310, 0x2358, 0xb804, 0x9084, 0x00ff, 0xa89e, - 0xa868, 0xc0f4, 0xa86a, 0x080c, 0x7006, 0x6017, 0x0000, 0x009e, - 0x003e, 0x00de, 0x00be, 0x0005, 0x0026, 0x0036, 0x0046, 0x00b6, - 0x0096, 0x00f6, 0x6214, 0x2248, 0x6210, 0x2258, 0x2079, 0x0260, - 0x9096, 0x0000, 0x11a0, 0xb814, 0x9084, 0x00ff, 0x900e, 0x080c, - 0x268c, 0x2118, 0x831f, 0x939c, 0xff00, 0x7838, 0x9084, 0x00ff, - 0x931d, 0x7c3c, 0x2011, 0x8018, 0x080c, 0x4ca1, 0x00a8, 0x9096, - 0x0001, 0x1148, 0x89ff, 0x0180, 0xa89b, 0x000d, 0x7838, 0xa8a6, - 0x783c, 0xa8aa, 0x0048, 0x9096, 0x0002, 0x1130, 0xa89b, 0x000d, - 0x7838, 0xa8a6, 0x783c, 0xa8aa, 0x00fe, 0x009e, 0x00be, 0x004e, - 0x003e, 0x002e, 0x0005, 0x00c6, 0x0026, 0x0016, 0x9186, 0x0035, - 0x0110, 0x6a38, 0x0008, 0x6a2c, 0x080c, 0xcf09, 0x01f0, 0x2260, - 0x6120, 0x9186, 0x0003, 0x0118, 0x9186, 0x0006, 0x1190, 0x6838, - 0x9206, 0x0140, 0x683c, 0x9206, 0x1160, 0x6108, 0x6838, 0x9106, - 0x1140, 0x0020, 0x6008, 0x693c, 0x9106, 0x1118, 0x6010, 0x6910, - 0x9106, 0x001e, 0x002e, 0x00ce, 0x0005, 0x9085, 0x0001, 0x0cc8, - 0xa974, 0xd1cc, 0x0198, 0x918c, 0x00ff, 0x918e, 0x0002, 0x1170, - 0xa9a8, 0x918c, 0x000f, 0x918e, 0x0001, 0x1140, 0xa87c, 0xd0ac, - 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xc519, 0x0005, 0x0036, - 0x2019, 0x0001, 0x0010, 0x0036, 0x901e, 0x0499, 0x01e0, 0x080c, - 0xcf1b, 0x01c8, 0x080c, 0xd10c, 0x6037, 0x4000, 0x6014, 0x6017, - 0x0000, 0x0096, 0x2048, 0xa87c, 0x080c, 0xd132, 0x1118, 0x080c, - 0xbb5c, 0x0040, 0xa867, 0x0103, 0xa877, 0x0000, 0x83ff, 0x1129, - 0x080c, 0x7012, 0x009e, 0x003e, 0x0005, 0xa880, 0xd0b4, 0x0128, - 0xa87b, 0x0006, 0xc0ec, 0xa882, 0x0048, 0xd0bc, 0x0118, 0xa87b, - 0x0002, 0x0020, 0xa87b, 0x0005, 0x080c, 0xd226, 0xa877, 0x0000, - 0x0005, 0x2001, 0x1810, 0x2004, 0xd0ec, 0x0005, 0x0006, 0x2001, - 0x1810, 0x2004, 0xd0f4, 0x000e, 0x0005, 0x0006, 0x2001, 0x1810, - 0x2004, 0xd0e4, 0x000e, 0x0005, 0x0036, 0x0046, 0x6010, 0x00b6, - 0x2058, 0xbba0, 0x00be, 0x2021, 0x0007, 0x080c, 0x4e58, 0x004e, - 0x003e, 0x0005, 0x0c51, 0x1d81, 0x0005, 0x2001, 0x1986, 0x2004, - 0x601a, 0x0005, 0x2001, 0x1988, 0x2004, 0x604a, 0x0005, 0x080c, - 0xb16c, 0x0804, 0x9ab3, 0x611c, 0xd1fc, 0xa97c, 0x1108, 0xd1e4, - 0x0005, 0x601c, 0xd0fc, 0xa87c, 0x1108, 0xd0e4, 0x0005, 0x601c, - 0xd0fc, 0xc0fc, 0x601e, 0xa87c, 0x1108, 0xd0e4, 0x0005, 0x6044, - 0xd0fc, 0x1138, 0xd0bc, 0x01a0, 0xc0bc, 0x6046, 0x2001, 0x0002, - 0x0080, 0xd0ac, 0x1168, 0xd0dc, 0x1128, 0x908c, 0x000f, 0x9186, - 0x0005, 0x1118, 0x2001, 0x0003, 0x0020, 0x2001, 0x0001, 0x0008, - 0x6000, 0x0005, 0x00b6, 0x0066, 0x6000, 0x90b2, 0x0010, 0x1a0c, - 0x0d85, 0x001b, 0x006e, 0x00be, 0x0005, 0xd6b5, 0xddfe, 0xdf62, - 0xd6b5, 0xd6b5, 0xd6b5, 0xd6b5, 0xd6b5, 0xd6ec, 0xdfe6, 0xd6b5, - 0xd6b5, 0xd6b5, 0xd6b5, 0xd6b5, 0xd6b5, 0x080c, 0x0d85, 0x0066, - 0x6000, 0x90b2, 0x0010, 0x1a0c, 0x0d85, 0x0013, 0x006e, 0x0005, - 0xd6d0, 0xe50b, 0xd6d0, 0xd6d0, 0xd6d0, 0xd6d0, 0xd6d0, 0xd6d0, - 0xe4ba, 0xe55d, 0xd6d0, 0xec10, 0xec44, 0xec10, 0xec44, 0xd6d0, - 0x080c, 0x0d85, 0x6000, 0x9082, 0x0010, 0x1a0c, 0x0d85, 0x6000, - 0x000a, 0x0005, 0xd6ea, 0xe1c3, 0xe28e, 0xe2b1, 0xe32d, 0xd6ea, - 0xe42a, 0xe3b5, 0xdff0, 0xe492, 0xe4a7, 0xd6ea, 0xd6ea, 0xd6ea, - 0xd6ea, 0xd6ea, 0x080c, 0x0d85, 0x91b2, 0x0053, 0x1a0c, 0x0d85, - 0x2100, 0x91b2, 0x0040, 0x1a04, 0xdb70, 0x0002, 0xd736, 0xd93e, - 0xd736, 0xd736, 0xd736, 0xd947, 0xd736, 0xd736, 0xd736, 0xd736, - 0xd736, 0xd736, 0xd736, 0xd736, 0xd736, 0xd736, 0xd736, 0xd736, - 0xd736, 0xd736, 0xd736, 0xd736, 0xd736, 0xd738, 0xd79f, 0xd7ae, - 0xd812, 0xd83d, 0xd8b6, 0xd929, 0xd736, 0xd736, 0xd94a, 0xd736, - 0xd736, 0xd95f, 0xd96c, 0xd736, 0xd736, 0xd736, 0xd736, 0xd736, - 0xda12, 0xd736, 0xd736, 0xda26, 0xd736, 0xd736, 0xd9e1, 0xd736, - 0xd736, 0xd736, 0xda3e, 0xd736, 0xd736, 0xd736, 0xdabb, 0xd736, - 0xd736, 0xd736, 0xd736, 0xd736, 0xd736, 0xdb38, 0x080c, 0x0d85, - 0x080c, 0x6bcf, 0x1150, 0x2001, 0x1837, 0x2004, 0xd0cc, 0x1128, - 0x9084, 0x0009, 0x9086, 0x0008, 0x1140, 0x6007, 0x0009, 0x602f, - 0x0009, 0x6017, 0x0000, 0x0804, 0xd937, 0x080c, 0x6b6b, 0x00e6, - 0x00c6, 0x0036, 0x0026, 0x0016, 0x6210, 0x2258, 0xbaa0, 0x0026, - 0x2019, 0x0029, 0x080c, 0xacfc, 0x080c, 0x97b0, 0x0076, 0x903e, - 0x080c, 0x966d, 0x2c08, 0x080c, 0xe75d, 0x007e, 0x001e, 0x080c, - 0xad18, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x6610, 0x2658, - 0x080c, 0x67c3, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x1268, - 0x0016, 0x0026, 0x6210, 0x00b6, 0x2258, 0xbaa0, 0x00be, 0x2c08, - 0x080c, 0xee6f, 0x002e, 0x001e, 0x1178, 0x080c, 0xe68b, 0x1904, - 0xd80a, 0x080c, 0xe627, 0x1120, 0x6007, 0x0008, 0x0804, 0xd937, - 0x6007, 0x0009, 0x0804, 0xd937, 0x080c, 0xe905, 0x0128, 0x080c, - 0xe68b, 0x0d78, 0x0804, 0xd80a, 0x6017, 0x1900, 0x0c88, 0x080c, - 0x344c, 0x1904, 0xdb6d, 0x6106, 0x080c, 0xe5c7, 0x6007, 0x0006, - 0x0804, 0xd937, 0x6007, 0x0007, 0x0804, 0xd937, 0x080c, 0xec80, - 0x1904, 0xdb6d, 0x080c, 0x344c, 0x1904, 0xdb6d, 0x00d6, 0x6610, - 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x1220, 0x2001, - 0x0001, 0x080c, 0x66e6, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, - 0x0188, 0x9686, 0x0004, 0x0170, 0xbe04, 0x96b4, 0x00ff, 0x9686, - 0x0006, 0x0140, 0x9686, 0x0004, 0x0128, 0x9686, 0x0005, 0x0110, - 0x00de, 0x0480, 0x00e6, 0x2071, 0x0260, 0x7034, 0x9084, 0x0003, - 0x1140, 0x7034, 0x9082, 0x0014, 0x0220, 0x7030, 0x9084, 0x0003, - 0x0130, 0x00ee, 0x6017, 0x0000, 0x602f, 0x0007, 0x00b0, 0x00ee, - 0x080c, 0xe6f3, 0x1190, 0x9686, 0x0006, 0x1140, 0x0026, 0x6210, - 0x2258, 0xbaa0, 0x900e, 0x080c, 0x3364, 0x002e, 0x080c, 0x684f, - 0x6007, 0x000a, 0x00de, 0x0804, 0xd937, 0x6007, 0x000b, 0x00de, - 0x0804, 0xd937, 0x080c, 0x3315, 0x080c, 0xd65a, 0x6007, 0x0001, - 0x0804, 0xd937, 0x080c, 0xec80, 0x1904, 0xdb6d, 0x080c, 0x344c, - 0x1904, 0xdb6d, 0x2071, 0x0260, 0x7034, 0x90b4, 0x0003, 0x1948, - 0x90b2, 0x0014, 0x0a30, 0x7030, 0x9084, 0x0003, 0x1910, 0x6610, - 0x2658, 0xbe04, 0x9686, 0x0707, 0x09e8, 0x0026, 0x6210, 0x2258, - 0xbaa0, 0x900e, 0x080c, 0x3364, 0x002e, 0x6007, 0x000c, 0x2001, - 0x0001, 0x080c, 0xee4e, 0x0804, 0xd937, 0x080c, 0x6bcf, 0x1140, - 0x2001, 0x1837, 0x2004, 0x9084, 0x0009, 0x9086, 0x0008, 0x1110, - 0x0804, 0xd745, 0x080c, 0x6b6b, 0x6610, 0x2658, 0xbe04, 0x9684, - 0x00ff, 0x9082, 0x0006, 0x06c8, 0x1138, 0x0026, 0x2001, 0x0006, - 0x080c, 0x6726, 0x002e, 0x0050, 0x96b4, 0xff00, 0x8637, 0x9686, - 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xd80a, 0x080c, 0xe700, - 0x1120, 0x6007, 0x000e, 0x0804, 0xd937, 0x0046, 0x6410, 0x2458, - 0xbca0, 0x0046, 0x080c, 0x3315, 0x080c, 0xd65a, 0x004e, 0x0016, - 0x9006, 0x2009, 0x1848, 0x210c, 0xd1a4, 0x0148, 0x2009, 0x0029, - 0x080c, 0xea8d, 0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802, 0x001e, - 0x004e, 0x6007, 0x0001, 0x0804, 0xd937, 0x2001, 0x0001, 0x080c, - 0x66e6, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, - 0x1805, 0x2011, 0x0270, 0x080c, 0xc20e, 0x003e, 0x002e, 0x001e, - 0x015e, 0x9005, 0x0168, 0x96b4, 0xff00, 0x8637, 0x9682, 0x0004, - 0x0a04, 0xd80a, 0x9682, 0x0007, 0x0a04, 0xd866, 0x0804, 0xd80a, - 0x6017, 0x1900, 0x6007, 0x0009, 0x0804, 0xd937, 0x080c, 0x6bcf, - 0x1140, 0x2001, 0x1837, 0x2004, 0x9084, 0x0009, 0x9086, 0x0008, - 0x1110, 0x0804, 0xd745, 0x080c, 0x6b6b, 0x6610, 0x2658, 0xbe04, - 0x9684, 0x00ff, 0x0006, 0x0016, 0x908e, 0x0001, 0x0118, 0x908e, - 0x0000, 0x1118, 0x001e, 0x000e, 0x0080, 0x001e, 0x000e, 0x9082, - 0x0006, 0x06a0, 0x0150, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0004, - 0x0120, 0x9686, 0x0006, 0x1904, 0xd80a, 0x080c, 0xe72e, 0x1138, - 0x080c, 0xe627, 0x1120, 0x6007, 0x0010, 0x0804, 0xd937, 0x0046, - 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, 0x3315, 0x080c, 0xd65a, - 0x004e, 0x0016, 0x9006, 0x2009, 0x1848, 0x210c, 0xd1a4, 0x0148, - 0x2009, 0x0029, 0x080c, 0xea8d, 0x6010, 0x2058, 0xb800, 0xc0e5, - 0xb802, 0x001e, 0x004e, 0x6007, 0x0001, 0x0448, 0x080c, 0xe905, - 0x0198, 0x0016, 0x968c, 0x00ff, 0x9186, 0x0002, 0x0160, 0x9186, - 0x0003, 0x0148, 0x001e, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, - 0x0920, 0x0804, 0xd80a, 0x001e, 0x6017, 0x1900, 0x6007, 0x0009, - 0x0070, 0x080c, 0x344c, 0x1904, 0xdb6d, 0x080c, 0xec80, 0x1904, - 0xdb6d, 0x080c, 0xdd3e, 0x1904, 0xd80a, 0x6007, 0x0012, 0x6003, - 0x0001, 0x080c, 0x961e, 0x080c, 0x9ab3, 0x0005, 0x6007, 0x0001, - 0x6003, 0x0001, 0x080c, 0x961e, 0x080c, 0x9ab3, 0x0cb0, 0x6007, - 0x0005, 0x0c68, 0x080c, 0xec80, 0x1904, 0xdb6d, 0x080c, 0x344c, - 0x1904, 0xdb6d, 0x080c, 0xdd3e, 0x1904, 0xd80a, 0x6007, 0x0020, - 0x6003, 0x0001, 0x080c, 0x961e, 0x080c, 0x9ab3, 0x0005, 0x080c, - 0x344c, 0x1904, 0xdb6d, 0x6007, 0x0023, 0x6003, 0x0001, 0x080c, - 0x961e, 0x080c, 0x9ab3, 0x0005, 0x080c, 0xec80, 0x1904, 0xdb6d, - 0x080c, 0x344c, 0x1904, 0xdb6d, 0x080c, 0xdd3e, 0x1904, 0xd80a, - 0x0016, 0x0026, 0x00e6, 0x2071, 0x0260, 0x2c08, 0x2011, 0x1820, - 0x2214, 0x703c, 0x9206, 0x11e0, 0x2011, 0x181f, 0x2214, 0x7038, - 0x9084, 0x00ff, 0x9206, 0x11a0, 0x7240, 0x080c, 0xcf09, 0x0570, - 0x2260, 0x6008, 0x9086, 0xffff, 0x0120, 0x7244, 0x6008, 0x9206, - 0x1528, 0x6020, 0x9086, 0x0007, 0x1508, 0x080c, 0xb16c, 0x04a0, - 0x7244, 0x9286, 0xffff, 0x0180, 0x2c08, 0x080c, 0xcf09, 0x01b0, - 0x2260, 0x7240, 0x6008, 0x9206, 0x1188, 0x6010, 0x9190, 0x0004, - 0x2214, 0x9206, 0x01b8, 0x0050, 0x7240, 0x2c08, 0x9006, 0x080c, - 0xea57, 0x1180, 0x7244, 0x9286, 0xffff, 0x01b0, 0x2160, 0x6007, - 0x0026, 0x6017, 0x1700, 0x7214, 0x9296, 0xffff, 0x1180, 0x6007, - 0x0025, 0x0068, 0x6020, 0x9086, 0x0007, 0x1d80, 0x6004, 0x9086, - 0x0024, 0x1110, 0x080c, 0xb16c, 0x2160, 0x6007, 0x0025, 0x6003, - 0x0001, 0x080c, 0x961e, 0x080c, 0x9ab3, 0x00ee, 0x002e, 0x001e, - 0x0005, 0x2001, 0x0001, 0x080c, 0x66e6, 0x0156, 0x0016, 0x0026, - 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x0276, 0x080c, - 0xc20e, 0x003e, 0x002e, 0x001e, 0x015e, 0x0120, 0x6007, 0x0031, - 0x0804, 0xd937, 0x080c, 0xbe21, 0x080c, 0x779e, 0x1190, 0x0006, - 0x0026, 0x0036, 0x080c, 0x77b8, 0x1138, 0x080c, 0x7ab6, 0x080c, - 0x619d, 0x080c, 0x76cd, 0x0010, 0x080c, 0x7772, 0x003e, 0x002e, - 0x000e, 0x0005, 0x080c, 0x344c, 0x1904, 0xdb6d, 0x080c, 0xdd3e, - 0x1904, 0xd80a, 0x6106, 0x080c, 0xdd5a, 0x1120, 0x6007, 0x002b, - 0x0804, 0xd937, 0x6007, 0x002c, 0x0804, 0xd937, 0x080c, 0xec80, - 0x1904, 0xdb6d, 0x080c, 0x344c, 0x1904, 0xdb6d, 0x080c, 0xdd3e, - 0x1904, 0xd80a, 0x6106, 0x080c, 0xdd5f, 0x1120, 0x6007, 0x002e, - 0x0804, 0xd937, 0x6007, 0x002f, 0x0804, 0xd937, 0x080c, 0x344c, - 0x1904, 0xdb6d, 0x00e6, 0x00d6, 0x00c6, 0x6010, 0x2058, 0xb904, - 0x9184, 0x00ff, 0x9086, 0x0006, 0x0158, 0x9184, 0xff00, 0x8007, - 0x9086, 0x0006, 0x0128, 0x00ce, 0x00de, 0x00ee, 0x0804, 0xd93e, - 0x080c, 0x5844, 0xd0e4, 0x0904, 0xdab8, 0x2071, 0x026c, 0x7010, - 0x603a, 0x7014, 0x603e, 0x7108, 0x720c, 0x080c, 0x6c0d, 0x0140, - 0x6010, 0x2058, 0xb810, 0x9106, 0x1118, 0xb814, 0x9206, 0x0510, - 0x080c, 0x6c09, 0x15b8, 0x2069, 0x1800, 0x6880, 0x9206, 0x1590, - 0x687c, 0x9106, 0x1578, 0x7210, 0x080c, 0xcf09, 0x0590, 0x080c, - 0xdc2b, 0x0578, 0x080c, 0xeb09, 0x0560, 0x622e, 0x6007, 0x0036, - 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x9617, 0x00ce, 0x00de, - 0x00ee, 0x0005, 0x7214, 0x9286, 0xffff, 0x0150, 0x080c, 0xcf09, - 0x01c0, 0x9280, 0x0002, 0x2004, 0x7110, 0x9106, 0x1190, 0x08e0, - 0x7210, 0x2c08, 0x9085, 0x0001, 0x080c, 0xea57, 0x2c10, 0x2160, - 0x0140, 0x0890, 0x6007, 0x0037, 0x602f, 0x0009, 0x6017, 0x1500, - 0x08b8, 0x6007, 0x0037, 0x602f, 0x0003, 0x6017, 0x1700, 0x0880, - 0x6007, 0x0012, 0x0868, 0x080c, 0x344c, 0x1904, 0xdb6d, 0x6010, - 0x2058, 0xb804, 0x9084, 0xff00, 0x8007, 0x9086, 0x0006, 0x1904, - 0xd93e, 0x00e6, 0x00d6, 0x00c6, 0x080c, 0x5844, 0xd0e4, 0x0904, - 0xdb30, 0x2069, 0x1800, 0x2071, 0x026c, 0x7008, 0x603a, 0x720c, - 0x623e, 0x9286, 0xffff, 0x1150, 0x7208, 0x00c6, 0x2c08, 0x9085, - 0x0001, 0x080c, 0xea57, 0x2c10, 0x00ce, 0x05e8, 0x080c, 0xcf09, - 0x05d0, 0x7108, 0x9280, 0x0002, 0x2004, 0x9106, 0x15a0, 0x00c6, - 0x0026, 0x2260, 0x080c, 0xcadc, 0x002e, 0x00ce, 0x7118, 0x918c, - 0xff00, 0x810f, 0x9186, 0x0001, 0x0178, 0x9186, 0x0005, 0x0118, - 0x9186, 0x0007, 0x1198, 0x9280, 0x0005, 0x2004, 0x9005, 0x0170, - 0x080c, 0xdc2b, 0x0904, 0xdab1, 0x0056, 0x7510, 0x7614, 0x080c, - 0xeb22, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x6007, 0x003b, - 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003, 0x0001, 0x2009, 0x8020, - 0x080c, 0x9617, 0x0c78, 0x6007, 0x003b, 0x602f, 0x0003, 0x6017, - 0x0300, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x9617, 0x0c10, - 0x6007, 0x003b, 0x602f, 0x000b, 0x6017, 0x0000, 0x0804, 0xda88, - 0x00e6, 0x0026, 0x080c, 0x6bcf, 0x0550, 0x080c, 0x6b6b, 0x080c, - 0xecf1, 0x1518, 0x2071, 0x1800, 0x70dc, 0x9085, 0x0003, 0x70de, - 0x00f6, 0x2079, 0x0100, 0x72b0, 0x9284, 0x00ff, 0x707e, 0x78e6, - 0x9284, 0xff00, 0x7280, 0x9205, 0x7082, 0x78ea, 0x00fe, 0x70e7, - 0x0000, 0x080c, 0x6c0d, 0x0120, 0x2011, 0x1a0a, 0x2013, 0x07d0, - 0xd0ac, 0x1128, 0x080c, 0x30bf, 0x0010, 0x080c, 0xed25, 0x002e, - 0x00ee, 0x080c, 0xb16c, 0x0804, 0xd93d, 0x080c, 0xb16c, 0x0005, - 0x2600, 0x0002, 0xdb84, 0xdbb2, 0xdbc3, 0xdb84, 0xdb84, 0xdb86, - 0xdbd4, 0xdb84, 0xdb84, 0xdb84, 0xdba0, 0xdb84, 0xdb84, 0xdb84, - 0xdbdf, 0xdbf5, 0xdc26, 0xdb84, 0x080c, 0x0d85, 0x080c, 0xec80, - 0x1d20, 0x080c, 0x344c, 0x1d08, 0x7038, 0x6016, 0x6007, 0x0045, - 0x6003, 0x0001, 0x080c, 0x961e, 0x0005, 0x080c, 0x3315, 0x080c, - 0xd65a, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x961e, 0x0005, - 0x080c, 0xec80, 0x1950, 0x080c, 0x344c, 0x1938, 0x080c, 0xdd3e, - 0x1d60, 0x703c, 0x6016, 0x6007, 0x004a, 0x6003, 0x0001, 0x080c, - 0x961e, 0x0005, 0x080c, 0x344c, 0x1904, 0xdb6d, 0x2009, 0x0041, - 0x080c, 0xed2e, 0x6007, 0x0047, 0x6003, 0x0001, 0x080c, 0x961e, - 0x080c, 0x9ab3, 0x0005, 0x080c, 0x344c, 0x1904, 0xdb6d, 0x2009, - 0x0042, 0x080c, 0xed2e, 0x6007, 0x0047, 0x6003, 0x0001, 0x080c, - 0x961e, 0x080c, 0x9ab3, 0x0005, 0x080c, 0x344c, 0x1904, 0xdb6d, - 0x2009, 0x0046, 0x080c, 0xed2e, 0x080c, 0xb16c, 0x0005, 0x2001, - 0x1824, 0x2004, 0x9082, 0x00e1, 0x1268, 0x080c, 0xdc48, 0x0904, - 0xdb6d, 0x6007, 0x004e, 0x6003, 0x0001, 0x080c, 0x961e, 0x080c, - 0x9ab3, 0x0005, 0x6007, 0x0012, 0x0cb0, 0x6007, 0x004f, 0x6017, - 0x0000, 0x7134, 0x918c, 0x00ff, 0x81ff, 0x0508, 0x9186, 0x0001, - 0x1160, 0x7140, 0x2001, 0x19be, 0x2004, 0x9106, 0x11b0, 0x7144, - 0x2001, 0x19bf, 0x2004, 0x9106, 0x0190, 0x9186, 0x0002, 0x1168, - 0x2011, 0x0276, 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, - 0x000a, 0x080c, 0xc222, 0x009e, 0x0110, 0x6017, 0x0001, 0x6003, - 0x0001, 0x080c, 0x961e, 0x080c, 0x9ab3, 0x0005, 0x6007, 0x0050, - 0x703c, 0x6016, 0x0ca0, 0x0016, 0x00e6, 0x2071, 0x0260, 0x00b6, - 0x00c6, 0x2260, 0x6010, 0x2058, 0xb8d4, 0xd084, 0x0150, 0x7128, - 0x604c, 0x9106, 0x1120, 0x712c, 0x6050, 0x9106, 0x0110, 0x9006, - 0x0010, 0x9085, 0x0001, 0x00ce, 0x00be, 0x00ee, 0x001e, 0x0005, - 0x0016, 0x0096, 0x0086, 0x00e6, 0x01c6, 0x01d6, 0x0126, 0x2091, - 0x8000, 0x2071, 0x1800, 0x20e1, 0x0000, 0x2001, 0x19a1, 0x2003, - 0x0000, 0x080c, 0x1072, 0x05a0, 0x2900, 0x6016, 0x7090, 0x8004, - 0xa816, 0x908a, 0x001e, 0x02d0, 0xa833, 0x001e, 0x20a9, 0x001e, - 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x2001, 0x19a1, - 0x0016, 0x200c, 0x0471, 0x001e, 0x81ff, 0x01b8, 0x2940, 0x080c, - 0x1072, 0x01b0, 0x2900, 0xa006, 0x2100, 0x0c18, 0xa832, 0x20a8, - 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x2001, 0x19a1, - 0x0016, 0x200c, 0x00b1, 0x001e, 0x0000, 0x9085, 0x0001, 0x0048, - 0x2071, 0x1800, 0x7093, 0x0000, 0x6014, 0x2048, 0x080c, 0x100b, - 0x9006, 0x012e, 0x01de, 0x01ce, 0x00ee, 0x008e, 0x009e, 0x001e, - 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00c6, 0x918c, 0xffff, - 0x11b0, 0x080c, 0x21f9, 0x2099, 0x026c, 0x2001, 0x0014, 0x3518, - 0x9312, 0x0108, 0x1218, 0x23a8, 0x4003, 0x0400, 0x20a8, 0x4003, - 0x22a8, 0x8108, 0x080c, 0x21f9, 0x2099, 0x0260, 0x0ca8, 0x080c, - 0x21f9, 0x2061, 0x19a1, 0x6004, 0x2098, 0x6008, 0x3518, 0x9312, - 0x0108, 0x1218, 0x23a8, 0x4003, 0x0048, 0x20a8, 0x4003, 0x22a8, - 0x8108, 0x080c, 0x21f9, 0x2099, 0x0260, 0x0ca8, 0x2061, 0x19a1, - 0x2019, 0x0280, 0x3300, 0x931e, 0x0110, 0x6006, 0x0020, 0x2001, - 0x0260, 0x6006, 0x8108, 0x2162, 0x9292, 0x0021, 0x9296, 0xffff, - 0x620a, 0x00ce, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x0006, - 0x0016, 0x0026, 0x0036, 0x00c6, 0x81ff, 0x11b8, 0x080c, 0x2211, - 0x20a1, 0x024c, 0x2001, 0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, - 0x4003, 0x0418, 0x20a8, 0x4003, 0x82ff, 0x01f8, 0x22a8, 0x8108, - 0x080c, 0x2211, 0x20a1, 0x0240, 0x0c98, 0x080c, 0x2211, 0x2061, - 0x19a4, 0x6004, 0x20a0, 0x6008, 0x3518, 0x9312, 0x1218, 0x23a8, - 0x4003, 0x0058, 0x20a8, 0x4003, 0x82ff, 0x0138, 0x22a8, 0x8108, - 0x080c, 0x2211, 0x20a1, 0x0240, 0x0c98, 0x2061, 0x19a4, 0x2019, - 0x0260, 0x3400, 0x931e, 0x0110, 0x6006, 0x0020, 0x2001, 0x0240, - 0x6006, 0x8108, 0x2162, 0x9292, 0x0021, 0x9296, 0xffff, 0x620a, - 0x00ce, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x00b6, 0x0066, - 0x6610, 0x2658, 0xbe04, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, - 0x0170, 0x9686, 0x0004, 0x0158, 0xbe04, 0x96b4, 0x00ff, 0x9686, - 0x0006, 0x0128, 0x9686, 0x0004, 0x0110, 0x9085, 0x0001, 0x006e, - 0x00be, 0x0005, 0x00d6, 0x080c, 0xddd4, 0x00de, 0x0005, 0x00d6, - 0x080c, 0xdde1, 0x1520, 0x680c, 0x908c, 0xff00, 0x6820, 0x9084, - 0x00ff, 0x9115, 0x6216, 0x6824, 0x602e, 0xd1e4, 0x0130, 0x9006, - 0x080c, 0xee4e, 0x2009, 0x0001, 0x0078, 0xd1ec, 0x0180, 0x6920, - 0x918c, 0x00ff, 0x6824, 0x080c, 0x268c, 0x1148, 0x2001, 0x0001, - 0x080c, 0xee4e, 0x2110, 0x900e, 0x080c, 0x3364, 0x0018, 0x9085, - 0x0001, 0x0008, 0x9006, 0x00de, 0x0005, 0x00b6, 0x00c6, 0x080c, - 0xb1dd, 0x0598, 0x0016, 0x0026, 0x00c6, 0x2011, 0x0263, 0x2204, - 0x8211, 0x220c, 0x080c, 0x268c, 0x1568, 0x080c, 0x6749, 0x1550, - 0xbe12, 0xbd16, 0x00ce, 0x002e, 0x001e, 0x2b00, 0x6012, 0x080c, - 0xec80, 0x11c8, 0x080c, 0x344c, 0x11b0, 0x080c, 0xdd3e, 0x0500, - 0x2001, 0x0007, 0x080c, 0x66fa, 0x2001, 0x0007, 0x080c, 0x6726, - 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, - 0x080c, 0x961e, 0x0010, 0x080c, 0xb16c, 0x9085, 0x0001, 0x00ce, - 0x00be, 0x0005, 0x080c, 0xb16c, 0x00ce, 0x002e, 0x001e, 0x0ca8, - 0x080c, 0xb16c, 0x9006, 0x0c98, 0x2069, 0x026d, 0x6800, 0x9082, - 0x0010, 0x1228, 0x6017, 0x0000, 0x9085, 0x0001, 0x0008, 0x9006, - 0x0005, 0x6017, 0x0000, 0x2069, 0x026c, 0x6808, 0x9084, 0xff00, - 0x9086, 0x0800, 0x1190, 0x6904, 0x9186, 0x0018, 0x0118, 0x9186, - 0x0014, 0x1158, 0x810f, 0x6800, 0x9084, 0x00ff, 0x910d, 0x6162, - 0x908e, 0x0014, 0x0110, 0x908e, 0x0010, 0x0005, 0x6004, 0x90b2, - 0x0053, 0x1a0c, 0x0d85, 0x91b6, 0x0013, 0x1130, 0x2008, 0x91b2, - 0x0040, 0x1a04, 0xdf36, 0x0402, 0x91b6, 0x0027, 0x0190, 0x9186, - 0x0015, 0x0118, 0x9186, 0x0016, 0x1140, 0x080c, 0xaf61, 0x0120, - 0x9086, 0x0002, 0x0904, 0xbba3, 0x0005, 0x91b6, 0x0014, 0x190c, - 0x0d85, 0x2001, 0x0007, 0x080c, 0x6726, 0x080c, 0x99ed, 0x080c, - 0xb1a7, 0x080c, 0x9ab3, 0x0005, 0xde6c, 0xde6e, 0xde6c, 0xde6c, - 0xde6c, 0xde6e, 0xde7b, 0xdf33, 0xdebd, 0xdf33, 0xdee1, 0xdf33, - 0xde7b, 0xdf33, 0xdf2b, 0xdf33, 0xdf2b, 0xdf33, 0xdf33, 0xde6c, - 0xde6c, 0xde6c, 0xde6c, 0xde6c, 0xde6c, 0xde6c, 0xde6c, 0xde6c, - 0xde6c, 0xde6c, 0xde6e, 0xde6c, 0xdf33, 0xde6c, 0xde6c, 0xdf33, - 0xde6c, 0xdf30, 0xdf33, 0xde6c, 0xde6c, 0xde6c, 0xde6c, 0xdf33, - 0xdf33, 0xde6c, 0xdf33, 0xdf33, 0xde6c, 0xde76, 0xde6c, 0xde6c, - 0xde6c, 0xde6c, 0xdf2f, 0xdf33, 0xde6c, 0xde6c, 0xdf33, 0xdf33, - 0xde6c, 0xde6c, 0xde6c, 0xde6c, 0x080c, 0x0d85, 0x080c, 0xd65d, - 0x6003, 0x0002, 0x080c, 0x9ab3, 0x0804, 0xdf35, 0x9006, 0x080c, - 0x66e6, 0x0804, 0xdf33, 0x080c, 0x6c09, 0x1904, 0xdf33, 0x9006, - 0x080c, 0x66e6, 0x6010, 0x2058, 0xb810, 0x9086, 0x00ff, 0x1140, - 0x00f6, 0x2079, 0x1800, 0x78a8, 0x8000, 0x78aa, 0x00fe, 0x00b8, - 0x6010, 0x2058, 0xb884, 0x9005, 0x0904, 0xdf33, 0x080c, 0x347d, - 0x1904, 0xdf33, 0x2001, 0x1800, 0x2004, 0x9086, 0x0002, 0x1138, - 0x00f6, 0x2079, 0x1800, 0x78a8, 0x8000, 0x78aa, 0x00fe, 0x2001, - 0x0002, 0x080c, 0x66fa, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, - 0x0002, 0x080c, 0x961e, 0x080c, 0x9ab3, 0x6110, 0x2158, 0x2009, - 0x0001, 0x080c, 0x89a1, 0x0804, 0xdf35, 0x6610, 0x2658, 0xbe04, - 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0148, 0x9686, 0x0004, - 0x0130, 0x080c, 0x9228, 0x2001, 0x0004, 0x080c, 0x6726, 0x080c, - 0xee9d, 0x0904, 0xdf33, 0x2001, 0x0004, 0x080c, 0x66fa, 0x6023, - 0x0001, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, 0x961e, 0x0804, - 0xdf35, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x1158, 0x0036, - 0x0046, 0x6010, 0x2058, 0xbba0, 0x2021, 0x0006, 0x080c, 0x4e58, - 0x004e, 0x003e, 0x2001, 0x0006, 0x080c, 0xdf4f, 0x6610, 0x2658, - 0xbe04, 0x0066, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x006e, - 0x0180, 0x2001, 0x0006, 0x080c, 0x6726, 0x9284, 0x00ff, 0x908e, - 0x0007, 0x0118, 0x908e, 0x0004, 0x1120, 0x2001, 0x0006, 0x080c, - 0x66fa, 0x080c, 0x6c09, 0x11f8, 0x2001, 0x1837, 0x2004, 0xd0a4, - 0x01d0, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006, 0x01a0, 0x00f6, - 0x2079, 0x1800, 0x78a8, 0x8000, 0x78aa, 0x00fe, 0x0804, 0xdea7, - 0x2001, 0x0004, 0x0030, 0x2001, 0x0006, 0x0409, 0x0020, 0x0018, - 0x0010, 0x080c, 0x6726, 0x080c, 0xb16c, 0x0005, 0x2600, 0x0002, - 0xdf4a, 0xdf4a, 0xdf4a, 0xdf4a, 0xdf4a, 0xdf4c, 0xdf4a, 0xdf4c, - 0xdf4a, 0xdf4a, 0xdf4c, 0xdf4a, 0xdf4a, 0xdf4a, 0xdf4c, 0xdf4c, - 0xdf4c, 0xdf4c, 0x080c, 0x0d85, 0x080c, 0xb16c, 0x0005, 0x0016, - 0x00b6, 0x00d6, 0x6110, 0x2158, 0xb900, 0xd184, 0x0138, 0x080c, - 0x66fa, 0x9006, 0x080c, 0x66e6, 0x080c, 0x3344, 0x00de, 0x00be, - 0x001e, 0x0005, 0x6610, 0x2658, 0xb804, 0x9084, 0xff00, 0x8007, - 0x90b2, 0x000c, 0x1a0c, 0x0d85, 0x91b6, 0x0015, 0x1110, 0x003b, - 0x0028, 0x91b6, 0x0016, 0x190c, 0x0d85, 0x006b, 0x0005, 0xbc45, - 0xbc45, 0xbc45, 0xbc45, 0xdfe4, 0xbc45, 0xdfce, 0xdf8f, 0xbc45, - 0xbc45, 0xbc45, 0xbc45, 0xbc45, 0xbc45, 0xbc45, 0xbc45, 0xdfe4, - 0xbc45, 0xdfce, 0xdfd5, 0xbc45, 0xbc45, 0xbc45, 0xbc45, 0x00f6, - 0x080c, 0x6c09, 0x11d8, 0x080c, 0xd645, 0x11c0, 0x6010, 0x905d, - 0x01a8, 0xb884, 0x9005, 0x0190, 0x9006, 0x080c, 0x66e6, 0x2001, - 0x0002, 0x080c, 0x66fa, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, - 0x0002, 0x080c, 0x961e, 0x080c, 0x9ab3, 0x00f0, 0x2011, 0x0263, - 0x2204, 0x8211, 0x220c, 0x080c, 0x268c, 0x11b0, 0x080c, 0x67b4, - 0x0118, 0x080c, 0xb16c, 0x0080, 0xb810, 0x0006, 0xb814, 0x0006, - 0xb884, 0x0006, 0x080c, 0x61b7, 0x000e, 0xb886, 0x000e, 0xb816, - 0x000e, 0xb812, 0x080c, 0xb16c, 0x00fe, 0x0005, 0x6604, 0x96b6, - 0x001e, 0x1110, 0x080c, 0xb16c, 0x0005, 0x080c, 0xc082, 0x1148, - 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x961e, 0x080c, 0x9ab3, - 0x0010, 0x080c, 0xb16c, 0x0005, 0x0804, 0xb16c, 0x6004, 0x908a, - 0x0053, 0x1a0c, 0x0d85, 0x080c, 0x99ed, 0x080c, 0xb1a7, 0x0005, - 0x9182, 0x0040, 0x0002, 0xe007, 0xe007, 0xe007, 0xe007, 0xe009, - 0xe007, 0xe007, 0xe007, 0xe007, 0xe007, 0xe007, 0xe007, 0xe007, - 0xe007, 0xe007, 0xe007, 0xe007, 0xe007, 0xe007, 0xe007, 0x080c, - 0x0d85, 0x0096, 0x00b6, 0x00d6, 0x00e6, 0x00f6, 0x0046, 0x0026, - 0x6210, 0x2258, 0xb8bc, 0x9005, 0x11b0, 0x6007, 0x0044, 0x2071, - 0x0260, 0x7444, 0x94a4, 0xff00, 0x0904, 0xe070, 0x080c, 0xee42, - 0x1170, 0x9486, 0x2000, 0x1158, 0x2009, 0x0001, 0x2011, 0x0200, - 0x080c, 0x8c44, 0x0020, 0x9026, 0x080c, 0xecc5, 0x0c30, 0x080c, - 0x1059, 0x090c, 0x0d85, 0x6003, 0x0007, 0xa867, 0x010d, 0x9006, - 0xa802, 0xa86a, 0xac8a, 0x2c00, 0xa88e, 0x6008, 0xa8e2, 0x6010, - 0x2058, 0xb8a0, 0x7130, 0xa97a, 0x0016, 0xa876, 0xa87f, 0x0000, - 0xa883, 0x0000, 0xa887, 0x0036, 0x080c, 0x7012, 0x001e, 0x080c, - 0xee42, 0x1904, 0xe0d0, 0x9486, 0x2000, 0x1130, 0x2019, 0x0017, - 0x080c, 0xe9f9, 0x0804, 0xe0d0, 0x9486, 0x0200, 0x1120, 0x080c, - 0xe984, 0x0804, 0xe0d0, 0x9486, 0x0400, 0x0120, 0x9486, 0x1000, - 0x1904, 0xe0d0, 0x2019, 0x0002, 0x080c, 0xe9a3, 0x0804, 0xe0d0, - 0x2069, 0x1a73, 0x6a00, 0xd284, 0x0904, 0xe13a, 0x9284, 0x0300, - 0x1904, 0xe133, 0x6804, 0x9005, 0x0904, 0xe11b, 0x2d78, 0x6003, - 0x0007, 0x080c, 0x1072, 0x0904, 0xe0dc, 0x7800, 0xd08c, 0x1118, - 0x7804, 0x8001, 0x7806, 0x6017, 0x0000, 0x2001, 0x180f, 0x2004, - 0xd084, 0x1904, 0xe13e, 0x9006, 0xa802, 0xa867, 0x0116, 0xa86a, - 0x6008, 0xa8e2, 0x2c00, 0xa87a, 0x6010, 0x2058, 0xb8a0, 0x7130, - 0xa9b6, 0xa876, 0xb928, 0xa9ba, 0xb92c, 0xa9be, 0xb930, 0xa9c2, - 0xb934, 0xa9c6, 0xa883, 0x003d, 0x7044, 0x9084, 0x0003, 0x9080, - 0xe0d8, 0x2005, 0xa87e, 0x20a9, 0x000a, 0x2001, 0x0270, 0xaa5c, - 0x9290, 0x0021, 0x2009, 0x0205, 0x200b, 0x0080, 0x20e1, 0x0000, - 0xab60, 0x23e8, 0x2098, 0x22a0, 0x4003, 0x200b, 0x0000, 0x2001, - 0x027a, 0x200c, 0xa9b2, 0x8000, 0x200c, 0xa9ae, 0x080c, 0x7015, - 0x002e, 0x004e, 0x00fe, 0x00ee, 0x00de, 0x00be, 0x009e, 0x0005, - 0x0000, 0x0080, 0x0040, 0x0000, 0x2001, 0x1810, 0x2004, 0xd084, - 0x0120, 0x080c, 0x1059, 0x1904, 0xe085, 0x6017, 0xf100, 0x6003, - 0x0001, 0x6007, 0x0041, 0x2009, 0xa022, 0x080c, 0x9617, 0x0c00, - 0x2069, 0x0260, 0x6848, 0x9084, 0xff00, 0x9086, 0x1200, 0x1198, - 0x686c, 0x9084, 0x00ff, 0x0016, 0x6114, 0x918c, 0xf700, 0x910d, - 0x6116, 0x001e, 0x6003, 0x0001, 0x6007, 0x0043, 0x2009, 0xa025, - 0x080c, 0x9617, 0x0828, 0x6868, 0x602e, 0x686c, 0x6032, 0x6017, - 0xf200, 0x6003, 0x0001, 0x6007, 0x0041, 0x2009, 0xa022, 0x080c, - 0x9617, 0x0804, 0xe0d0, 0x2001, 0x180e, 0x2004, 0xd0ec, 0x0120, - 0x2011, 0x8049, 0x080c, 0x4ca1, 0x6017, 0xf300, 0x0010, 0x6017, - 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x2009, 0xa022, 0x080c, - 0x9617, 0x0804, 0xe0d0, 0x6017, 0xf500, 0x0c98, 0x6017, 0xf600, - 0x0804, 0xe0f0, 0x6017, 0xf200, 0x0804, 0xe0f0, 0xa867, 0x0146, - 0xa86b, 0x0000, 0x6008, 0xa886, 0x2c00, 0xa87a, 0x7044, 0x9084, - 0x0003, 0x9080, 0xe0d8, 0x2005, 0xa87e, 0x2928, 0x6010, 0x2058, - 0xb8a0, 0xa876, 0xb828, 0xa88a, 0xb82c, 0xa88e, 0xb830, 0xa892, - 0xb834, 0xa896, 0xa883, 0x003d, 0x2009, 0x0205, 0x2104, 0x9085, - 0x0080, 0x200a, 0x20e1, 0x0000, 0x2011, 0x0210, 0x2214, 0x9294, - 0x0fff, 0xaaa2, 0x9282, 0x0111, 0x1a0c, 0x0d85, 0x8210, 0x821c, - 0x2001, 0x026c, 0x2098, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0029, - 0x20a0, 0x2011, 0xe1ba, 0x2041, 0x0001, 0x223d, 0x9784, 0x00ff, - 0x9322, 0x1208, 0x2300, 0x20a8, 0x4003, 0x931a, 0x0530, 0x8210, - 0xd7fc, 0x1130, 0x8d68, 0x2d0a, 0x2001, 0x0260, 0x2098, 0x0c68, - 0x2950, 0x080c, 0x1072, 0x0170, 0x2900, 0xb002, 0xa867, 0x0147, - 0xa86b, 0x0000, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, - 0x8840, 0x08d8, 0x2548, 0xa800, 0x902d, 0x0118, 0x080c, 0x108b, - 0x0cc8, 0x080c, 0x108b, 0x0804, 0xe0dc, 0x2548, 0x8847, 0x9885, - 0x0046, 0xa866, 0x2009, 0x0205, 0x200b, 0x0000, 0x080c, 0xea30, - 0x0804, 0xe0d0, 0x8010, 0x0004, 0x801a, 0x0006, 0x8018, 0x0008, - 0x8016, 0x000a, 0x8014, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, - 0x0057, 0x1a0c, 0x0d85, 0x9082, 0x0040, 0x0a0c, 0x0d85, 0x2008, - 0x0804, 0xe246, 0x9186, 0x0051, 0x0108, 0x0040, 0x080c, 0xaf61, - 0x01e8, 0x9086, 0x0002, 0x0904, 0xe28e, 0x00c0, 0x9186, 0x0027, - 0x0180, 0x9186, 0x0048, 0x0128, 0x9186, 0x0014, 0x0150, 0x190c, - 0x0d85, 0x080c, 0xaf61, 0x0150, 0x9086, 0x0004, 0x0904, 0xe32d, - 0x0028, 0x6004, 0x9082, 0x0040, 0x2008, 0x001a, 0x080c, 0xb227, - 0x0005, 0xe20d, 0xe20f, 0xe20f, 0xe236, 0xe20d, 0xe20d, 0xe20d, - 0xe20d, 0xe20d, 0xe20d, 0xe20d, 0xe20d, 0xe20d, 0xe20d, 0xe20d, - 0xe20d, 0xe20d, 0xe20d, 0xe20d, 0xe20d, 0x080c, 0x0d85, 0x080c, - 0x99ed, 0x080c, 0x9ab3, 0x0036, 0x0096, 0x6014, 0x904d, 0x01d8, - 0x080c, 0xcf1b, 0x01c0, 0x6003, 0x0002, 0x6010, 0x00b6, 0x2058, - 0xb800, 0x00be, 0xd0bc, 0x1178, 0x2019, 0x0004, 0x080c, 0xea30, - 0x6017, 0x0000, 0x6018, 0x9005, 0x1120, 0x2001, 0x1987, 0x2004, - 0x601a, 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x0096, 0x080c, - 0x99ed, 0x080c, 0x9ab3, 0x080c, 0xcf1b, 0x0120, 0x6014, 0x2048, - 0x080c, 0x108b, 0x080c, 0xb1a7, 0x009e, 0x0005, 0x0002, 0xe25b, - 0xe270, 0xe25d, 0xe285, 0xe25b, 0xe25b, 0xe25b, 0xe25b, 0xe25b, - 0xe25b, 0xe25b, 0xe25b, 0xe25b, 0xe25b, 0xe25b, 0xe25b, 0xe25b, - 0xe25b, 0xe25b, 0xe25b, 0x080c, 0x0d85, 0x0096, 0x6014, 0x2048, - 0xa87c, 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009, 0x0043, 0x080c, - 0xb20a, 0x0010, 0x6003, 0x0004, 0x080c, 0x9ab3, 0x009e, 0x0005, - 0x080c, 0xcf1b, 0x0138, 0x6114, 0x0096, 0x2148, 0xa97c, 0x009e, - 0xd1ec, 0x1138, 0x080c, 0x8c19, 0x080c, 0xb16c, 0x080c, 0x9ab3, - 0x0005, 0x080c, 0xec89, 0x0db0, 0x0cc8, 0x6003, 0x0001, 0x6007, - 0x0041, 0x2009, 0xa022, 0x080c, 0x9617, 0x0005, 0x9182, 0x0040, - 0x0002, 0xe2a5, 0xe2a7, 0xe2a5, 0xe2a5, 0xe2a5, 0xe2a5, 0xe2a5, - 0xe2a5, 0xe2a5, 0xe2a5, 0xe2a5, 0xe2a5, 0xe2a5, 0xe2a5, 0xe2a5, - 0xe2a5, 0xe2a5, 0xe2a8, 0xe2a5, 0xe2a5, 0x080c, 0x0d85, 0x0005, - 0x00d6, 0x080c, 0x8c19, 0x00de, 0x080c, 0xece1, 0x080c, 0xb16c, - 0x0005, 0x9182, 0x0040, 0x0002, 0xe2c8, 0xe2c8, 0xe2c8, 0xe2c8, - 0xe2c8, 0xe2c8, 0xe2c8, 0xe2c8, 0xe2c8, 0xe2ca, 0xe2f5, 0xe2c8, - 0xe2c8, 0xe2c8, 0xe2c8, 0xe2f5, 0xe2c8, 0xe2c8, 0xe2c8, 0xe2c8, - 0x080c, 0x0d85, 0x6014, 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x0168, - 0x908c, 0x0003, 0x918e, 0x0002, 0x0180, 0x6144, 0xd1e4, 0x1168, - 0x2009, 0x0041, 0x009e, 0x0804, 0xe3b5, 0x6003, 0x0007, 0x601b, - 0x0000, 0x080c, 0x8c19, 0x009e, 0x0005, 0x6014, 0x2048, 0xa97c, - 0xd1ec, 0x1130, 0x080c, 0x8c19, 0x080c, 0xb16c, 0x009e, 0x0005, - 0x080c, 0xec89, 0x0db8, 0x009e, 0x0005, 0x2001, 0x180c, 0x200c, - 0xc1d4, 0x2102, 0x0036, 0x080c, 0x9a48, 0x080c, 0x9ab3, 0x6014, - 0x0096, 0x2048, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, - 0x0188, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, 0x0140, 0xa8ac, - 0x6330, 0x931a, 0x6332, 0xa8b0, 0x632c, 0x931b, 0x632e, 0x6003, - 0x0002, 0x0080, 0x2019, 0x0004, 0x080c, 0xea30, 0x6018, 0x9005, - 0x1128, 0x2001, 0x1987, 0x2004, 0x8003, 0x601a, 0x6017, 0x0000, - 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x9182, 0x0040, 0x0002, - 0xe344, 0xe344, 0xe344, 0xe344, 0xe344, 0xe344, 0xe344, 0xe344, - 0xe346, 0xe344, 0xe344, 0xe344, 0xe344, 0xe344, 0xe344, 0xe344, - 0xe344, 0xe344, 0xe344, 0xe391, 0x080c, 0x0d85, 0x6014, 0x0096, - 0x2048, 0xa834, 0xaa38, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, - 0xd1bc, 0x1190, 0x920d, 0x1518, 0xa87c, 0xd0fc, 0x0128, 0x2009, - 0x0041, 0x009e, 0x0804, 0xe3b5, 0x6003, 0x0007, 0x601b, 0x0000, - 0x080c, 0x8c19, 0x009e, 0x0005, 0x6124, 0xd1f4, 0x1d58, 0x0006, - 0x0046, 0xacac, 0x9422, 0xa9b0, 0x2200, 0x910b, 0x6030, 0x9420, - 0x6432, 0x602c, 0x9109, 0x612e, 0x004e, 0x000e, 0x08d8, 0x6110, - 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1bc, 0x1178, 0x2009, 0x180e, - 0x210c, 0xd19c, 0x0118, 0x6003, 0x0007, 0x0010, 0x6003, 0x0006, - 0x00e9, 0x080c, 0x8c1b, 0x009e, 0x0005, 0x6003, 0x0002, 0x009e, - 0x0005, 0x6024, 0xd0f4, 0x0128, 0x080c, 0x16b0, 0x1904, 0xe346, - 0x0005, 0x6014, 0x0096, 0x2048, 0xa834, 0xa938, 0x009e, 0x9105, - 0x1120, 0x080c, 0x16b0, 0x1904, 0xe346, 0x0005, 0xd2fc, 0x0140, - 0x8002, 0x8000, 0x8212, 0x9291, 0x0000, 0x2009, 0x0009, 0x0010, - 0x2009, 0x0015, 0xaa9a, 0xa896, 0x0005, 0x9182, 0x0040, 0x0208, - 0x0062, 0x9186, 0x0013, 0x0120, 0x9186, 0x0014, 0x190c, 0x0d85, - 0x6024, 0xd0dc, 0x090c, 0x0d85, 0x0005, 0xe3d9, 0xe3e5, 0xe3f1, - 0xe3fd, 0xe3d9, 0xe3d9, 0xe3d9, 0xe3d9, 0xe3e0, 0xe3db, 0xe3db, - 0xe3d9, 0xe3d9, 0xe3d9, 0xe3d9, 0xe3db, 0xe3d9, 0xe3db, 0xe3d9, - 0xe3e0, 0x080c, 0x0d85, 0x6024, 0xd0dc, 0x090c, 0x0d85, 0x0005, - 0x6014, 0x9005, 0x190c, 0x0d85, 0x0005, 0x6003, 0x0001, 0x6106, - 0x0126, 0x2091, 0x8000, 0x2009, 0xa022, 0x080c, 0x95f9, 0x012e, - 0x0005, 0x6003, 0x0004, 0x6106, 0x0126, 0x2091, 0x8000, 0x2009, - 0xa001, 0x080c, 0x9617, 0x012e, 0x0005, 0x6003, 0x0003, 0x6106, - 0x6047, 0x0000, 0x080c, 0x1c6f, 0x0126, 0x2091, 0x8000, 0x6014, - 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x0188, 0x9084, 0x0003, 0x9086, - 0x0002, 0x01a0, 0x6024, 0xd0cc, 0x1148, 0xd0c4, 0x1138, 0xa8a8, - 0x9005, 0x1120, 0x6144, 0x918d, 0xb035, 0x0018, 0x6144, 0x918d, - 0xa035, 0x009e, 0x080c, 0x965e, 0x012e, 0x0005, 0x6144, 0x918d, - 0xa032, 0x0cb8, 0x0126, 0x2091, 0x8000, 0x0036, 0x0096, 0x9182, - 0x0040, 0x0023, 0x009e, 0x003e, 0x012e, 0x0005, 0xe44a, 0xe44c, - 0xe461, 0xe47b, 0xe44a, 0xe44a, 0xe44a, 0xe44a, 0xe44a, 0xe44a, - 0xe44a, 0xe44a, 0xe44a, 0xe44a, 0xe44a, 0xe44a, 0xe44a, 0xe44a, - 0xe44a, 0xe44a, 0x080c, 0x0d85, 0x6014, 0x2048, 0xa87c, 0xd0fc, - 0x0510, 0x909c, 0x0003, 0x939e, 0x0003, 0x01e8, 0x6003, 0x0001, - 0x6106, 0x0126, 0x2091, 0x8000, 0x2009, 0xa022, 0x080c, 0x9617, - 0x0480, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0168, 0x909c, 0x0003, - 0x939e, 0x0003, 0x0140, 0x6003, 0x0001, 0x6106, 0x2009, 0xa001, - 0x080c, 0x9617, 0x00f0, 0x901e, 0x6316, 0x631a, 0x2019, 0x0004, - 0x080c, 0xea30, 0x00b0, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0d98, - 0x909c, 0x0003, 0x939e, 0x0003, 0x0d70, 0x6003, 0x0003, 0x6106, - 0x6047, 0x0000, 0x080c, 0x1c6f, 0x6144, 0x918d, 0xa035, 0x080c, - 0x965e, 0x0005, 0x080c, 0x99ed, 0x6114, 0x81ff, 0x0158, 0x0096, - 0x2148, 0x080c, 0xeddf, 0x0036, 0x2019, 0x0029, 0x080c, 0xea30, - 0x003e, 0x009e, 0x080c, 0xb1a7, 0x080c, 0x9ab3, 0x0005, 0x080c, - 0x9a48, 0x6114, 0x81ff, 0x0158, 0x0096, 0x2148, 0x080c, 0xeddf, - 0x0036, 0x2019, 0x0029, 0x080c, 0xea30, 0x003e, 0x009e, 0x080c, - 0xb1a7, 0x0005, 0x9182, 0x0085, 0x0002, 0xe4cc, 0xe4ca, 0xe4ca, - 0xe4d8, 0xe4ca, 0xe4ca, 0xe4ca, 0xe4ca, 0xe4ca, 0xe4ca, 0xe4ca, - 0xe4ca, 0xe4ca, 0x080c, 0x0d85, 0x6003, 0x000b, 0x6106, 0x0126, - 0x2091, 0x8000, 0x2009, 0x8020, 0x080c, 0x9617, 0x012e, 0x0005, - 0x0026, 0x00e6, 0x080c, 0xec80, 0x0118, 0x080c, 0xb16c, 0x0440, - 0x2071, 0x0260, 0x7224, 0x6216, 0x2001, 0x180e, 0x2004, 0xd0e4, - 0x0150, 0x6010, 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x2011, - 0x014e, 0x080c, 0xb495, 0x7220, 0x080c, 0xe875, 0x0118, 0x6007, - 0x0086, 0x0040, 0x6007, 0x0087, 0x7224, 0x9296, 0xffff, 0x1110, - 0x6007, 0x0086, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x9617, - 0x00ee, 0x002e, 0x0005, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, - 0x0085, 0x0a0c, 0x0d85, 0x908a, 0x0092, 0x1a0c, 0x0d85, 0x9082, - 0x0085, 0x00a2, 0x9186, 0x0027, 0x0130, 0x9186, 0x0014, 0x0118, - 0x080c, 0xb227, 0x0050, 0x2001, 0x0007, 0x080c, 0x6726, 0x080c, - 0x99ed, 0x080c, 0xb1a7, 0x080c, 0x9ab3, 0x0005, 0xe53b, 0xe53d, - 0xe53d, 0xe53b, 0xe53b, 0xe53b, 0xe53b, 0xe53b, 0xe53b, 0xe53b, - 0xe53b, 0xe53b, 0xe53b, 0x080c, 0x0d85, 0x080c, 0xb1a7, 0x080c, - 0x9ab3, 0x0005, 0x9182, 0x0085, 0x0a0c, 0x0d85, 0x9182, 0x0092, - 0x1a0c, 0x0d85, 0x9182, 0x0085, 0x0002, 0xe55a, 0xe55a, 0xe55a, - 0xe55c, 0xe55a, 0xe55a, 0xe55a, 0xe55a, 0xe55a, 0xe55a, 0xe55a, - 0xe55a, 0xe55a, 0x080c, 0x0d85, 0x0005, 0x9186, 0x0013, 0x0148, - 0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, 0xb227, - 0x0020, 0x080c, 0x99ed, 0x080c, 0xb1a7, 0x0005, 0x0036, 0x080c, - 0xece1, 0x604b, 0x0000, 0x2019, 0x000b, 0x0011, 0x003e, 0x0005, - 0x6010, 0x0006, 0x0059, 0x000e, 0x6012, 0x6023, 0x0006, 0x6003, - 0x0007, 0x601b, 0x0000, 0x604b, 0x0000, 0x0005, 0x0126, 0x0036, - 0x2091, 0x8000, 0x080c, 0xacfc, 0x0106, 0x0086, 0x2c40, 0x0096, - 0x904e, 0x080c, 0xa667, 0x009e, 0x008e, 0x1558, 0x0076, 0x2c38, - 0x080c, 0xa712, 0x007e, 0x1528, 0x6000, 0x9086, 0x0000, 0x0508, - 0x6020, 0x9086, 0x0007, 0x01e8, 0x0096, 0x601c, 0xd084, 0x0140, - 0x080c, 0xece1, 0x080c, 0xd65d, 0x080c, 0x1ad3, 0x6023, 0x0007, - 0x6014, 0x2048, 0x080c, 0xcf1b, 0x0110, 0x080c, 0xea30, 0x009e, - 0x9006, 0x6046, 0x6016, 0x080c, 0xece1, 0x6023, 0x0007, 0x080c, - 0xd65d, 0x010e, 0x090c, 0xad18, 0x003e, 0x012e, 0x0005, 0x00f6, - 0x00c6, 0x00b6, 0x0036, 0x0156, 0x2079, 0x0260, 0x7938, 0x783c, - 0x080c, 0x268c, 0x1904, 0xe621, 0x0016, 0x00c6, 0x080c, 0x67b4, - 0x1904, 0xe61f, 0x001e, 0x00c6, 0x080c, 0xd645, 0x1130, 0xb884, - 0x9005, 0x0118, 0x080c, 0x347d, 0x0148, 0x2b10, 0x2160, 0x6010, - 0x0006, 0x6212, 0x080c, 0xd64c, 0x000e, 0x6012, 0x00ce, 0x002e, - 0x0026, 0x0016, 0x080c, 0xacfc, 0x2019, 0x0029, 0x080c, 0xa7e2, - 0x080c, 0x97b0, 0x0076, 0x903e, 0x080c, 0x966d, 0x007e, 0x001e, - 0x0076, 0x903e, 0x080c, 0xe75d, 0x007e, 0x080c, 0xad18, 0x0026, - 0xba04, 0x9294, 0xff00, 0x8217, 0x9286, 0x0006, 0x0118, 0x9286, - 0x0004, 0x1118, 0xbaa0, 0x080c, 0x33e0, 0x002e, 0xbc84, 0x001e, - 0x080c, 0x61b7, 0xbe12, 0xbd16, 0xbc86, 0x9006, 0x0010, 0x00ce, - 0x001e, 0x015e, 0x003e, 0x00be, 0x00ce, 0x00fe, 0x0005, 0x00c6, - 0x00d6, 0x00b6, 0x0016, 0x2009, 0x1824, 0x2104, 0x9086, 0x0074, - 0x1904, 0xe680, 0x2069, 0x0260, 0x6944, 0x9182, 0x0100, 0x06e0, - 0x6940, 0x9184, 0x8000, 0x0904, 0xe67d, 0x2001, 0x197c, 0x2004, - 0x9005, 0x1140, 0x6010, 0x2058, 0xb884, 0x9005, 0x0118, 0x9184, - 0x0800, 0x0598, 0x6948, 0x918a, 0x0001, 0x0648, 0x080c, 0xee47, - 0x0118, 0x6978, 0xd1fc, 0x11b8, 0x2009, 0x0205, 0x200b, 0x0001, - 0x693c, 0x81ff, 0x1198, 0x6944, 0x9182, 0x0100, 0x02a8, 0x6940, - 0x81ff, 0x1178, 0x6948, 0x918a, 0x0001, 0x0288, 0x6950, 0x918a, - 0x0001, 0x0298, 0x00d0, 0x6017, 0x0100, 0x00a0, 0x6017, 0x0300, - 0x0088, 0x6017, 0x0500, 0x0070, 0x6017, 0x0700, 0x0058, 0x6017, - 0x0900, 0x0040, 0x6017, 0x0b00, 0x0028, 0x6017, 0x0f00, 0x0010, - 0x6017, 0x2d00, 0x9085, 0x0001, 0x0008, 0x9006, 0x001e, 0x00be, - 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00b6, 0x0026, 0x0036, 0x0156, - 0x6210, 0x2258, 0xbb04, 0x9394, 0x00ff, 0x9286, 0x0006, 0x0180, - 0x9286, 0x0004, 0x0168, 0x9394, 0xff00, 0x8217, 0x9286, 0x0006, - 0x0138, 0x9286, 0x0004, 0x0120, 0x080c, 0x67c3, 0x0804, 0xe6ec, - 0x2011, 0x0276, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, - 0x080c, 0xc222, 0x009e, 0x15c8, 0x2011, 0x027a, 0x20a9, 0x0004, - 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xc222, 0x009e, 0x1568, - 0x0046, 0x0016, 0xbaa0, 0x2220, 0x9006, 0x2009, 0x1848, 0x210c, - 0xd1a4, 0x0138, 0x2009, 0x0029, 0x080c, 0xea8d, 0xb800, 0xc0e5, - 0xb802, 0x080c, 0xacfc, 0x2019, 0x0029, 0x080c, 0x97b0, 0x0076, - 0x2039, 0x0000, 0x080c, 0x966d, 0x2c08, 0x080c, 0xe75d, 0x007e, - 0x080c, 0xad18, 0x2001, 0x0007, 0x080c, 0x6726, 0x2001, 0x0007, - 0x080c, 0x66fa, 0x001e, 0x004e, 0x9006, 0x015e, 0x003e, 0x002e, - 0x00be, 0x00ce, 0x0005, 0x00d6, 0x2069, 0x026e, 0x6800, 0x9086, - 0x0800, 0x0118, 0x6017, 0x0000, 0x0008, 0x9006, 0x00de, 0x0005, - 0x00b6, 0x00f6, 0x0016, 0x0026, 0x0036, 0x0156, 0x2079, 0x026c, - 0x7930, 0x7834, 0x080c, 0x268c, 0x11d0, 0x080c, 0x67b4, 0x11b8, - 0x2011, 0x0270, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, - 0x080c, 0xc222, 0x009e, 0x1158, 0x2011, 0x0274, 0x20a9, 0x0004, - 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xc222, 0x009e, 0x015e, - 0x003e, 0x002e, 0x001e, 0x00fe, 0x00be, 0x0005, 0x00b6, 0x0006, - 0x0016, 0x0026, 0x0036, 0x0156, 0x2011, 0x0263, 0x2204, 0x8211, - 0x220c, 0x080c, 0x268c, 0x11d0, 0x080c, 0x67b4, 0x11b8, 0x2011, - 0x0276, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, - 0xc222, 0x009e, 0x1158, 0x2011, 0x027a, 0x20a9, 0x0004, 0x0096, - 0x2b48, 0x2019, 0x0006, 0x080c, 0xc222, 0x009e, 0x015e, 0x003e, - 0x002e, 0x001e, 0x000e, 0x00be, 0x0005, 0x00e6, 0x00c6, 0x0086, - 0x0076, 0x0066, 0x0056, 0x0046, 0x0026, 0x0126, 0x2091, 0x8000, - 0x080c, 0xad5a, 0x0106, 0x190c, 0xacfc, 0x2740, 0x2029, 0x19f4, - 0x252c, 0x2021, 0x19fb, 0x2424, 0x2061, 0x1ddc, 0x2071, 0x1800, - 0x7654, 0x7074, 0x81ff, 0x0150, 0x0006, 0x9186, 0x1b39, 0x000e, - 0x0128, 0x8001, 0x9602, 0x1a04, 0xe803, 0x0018, 0x9606, 0x0904, - 0xe803, 0x080c, 0x8eee, 0x0904, 0xe7fa, 0x2100, 0x9c06, 0x0904, - 0xe7fa, 0x6720, 0x9786, 0x0007, 0x0904, 0xe7fa, 0x080c, 0xeace, - 0x1904, 0xe7fa, 0x080c, 0xee65, 0x0904, 0xe7fa, 0x080c, 0xeabe, - 0x0904, 0xe7fa, 0x6720, 0x9786, 0x0001, 0x1148, 0x080c, 0x347d, - 0x0904, 0xe845, 0x6004, 0x9086, 0x0000, 0x1904, 0xe845, 0x9786, - 0x0004, 0x0904, 0xe845, 0x2500, 0x9c06, 0x0904, 0xe7fa, 0x2400, - 0x9c06, 0x0904, 0xe7fa, 0x88ff, 0x0118, 0x605c, 0x9906, 0x15d0, - 0x0096, 0x6043, 0xffff, 0x6000, 0x9086, 0x0004, 0x1120, 0x0016, - 0x080c, 0x1ad3, 0x001e, 0x9786, 0x000a, 0x0148, 0x080c, 0xd132, - 0x1130, 0x080c, 0xbb5c, 0x009e, 0x080c, 0xb1a7, 0x0418, 0x6014, - 0x2048, 0x080c, 0xcf1b, 0x01d8, 0x9786, 0x0003, 0x1588, 0xa867, - 0x0103, 0xa87c, 0xd0cc, 0x0130, 0x0096, 0xa878, 0x2048, 0x080c, - 0x100b, 0x009e, 0xab7a, 0xa877, 0x0000, 0x080c, 0xeddf, 0x0016, - 0x080c, 0xd220, 0x080c, 0x7006, 0x001e, 0x080c, 0xd10c, 0x009e, - 0x080c, 0xb1a7, 0x9ce0, 0x001c, 0x2001, 0x181a, 0x2004, 0x9c02, - 0x1210, 0x0804, 0xe776, 0x010e, 0x190c, 0xad18, 0x012e, 0x002e, - 0x004e, 0x005e, 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee, 0x0005, - 0x9786, 0x0006, 0x1150, 0x9386, 0x0005, 0x0128, 0x080c, 0xeddf, - 0x080c, 0xea30, 0x08e0, 0x009e, 0x08e8, 0x9786, 0x0009, 0x11f8, - 0x6000, 0x9086, 0x0004, 0x01c0, 0x6000, 0x9086, 0x0003, 0x11a0, - 0x080c, 0x9a48, 0x0096, 0x6114, 0x2148, 0x080c, 0xcf1b, 0x0118, - 0x6010, 0x080c, 0x7012, 0x009e, 0x00c6, 0x080c, 0xb16c, 0x00ce, - 0x0036, 0x080c, 0x9ab3, 0x003e, 0x009e, 0x0804, 0xe7fa, 0x9786, - 0x000a, 0x0904, 0xe7ea, 0x0804, 0xe7df, 0x81ff, 0x0904, 0xe7fa, - 0x9180, 0x0001, 0x2004, 0x9086, 0x0018, 0x0138, 0x9180, 0x0001, - 0x2004, 0x9086, 0x002d, 0x1904, 0xe7fa, 0x6000, 0x9086, 0x0002, - 0x1904, 0xe7fa, 0x080c, 0xd121, 0x0138, 0x080c, 0xd132, 0x1904, - 0xe7fa, 0x080c, 0xbb5c, 0x0038, 0x080c, 0x3344, 0x080c, 0xd132, - 0x1110, 0x080c, 0xbb5c, 0x080c, 0xb1a7, 0x0804, 0xe7fa, 0xa864, - 0x9084, 0x00ff, 0x9086, 0x0039, 0x0005, 0x00c6, 0x00e6, 0x0016, - 0x2c08, 0x2170, 0x9006, 0x080c, 0xea57, 0x001e, 0x0120, 0x6020, - 0x9084, 0x000f, 0x001b, 0x00ee, 0x00ce, 0x0005, 0xe894, 0xe894, - 0xe894, 0xe894, 0xe894, 0xe894, 0xe896, 0xe894, 0xe894, 0xe894, - 0xe8bf, 0xb1a7, 0xb1a7, 0xe894, 0x9006, 0x0005, 0x0036, 0x0046, - 0x0016, 0x7010, 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x2009, - 0x0020, 0x080c, 0xea8d, 0x001e, 0x004e, 0x2019, 0x0002, 0x080c, - 0xe586, 0x003e, 0x9085, 0x0001, 0x0005, 0x0096, 0x080c, 0xcf1b, - 0x0140, 0x6014, 0x904d, 0x080c, 0xcae9, 0x687b, 0x0005, 0x080c, - 0x7012, 0x009e, 0x080c, 0xb1a7, 0x9085, 0x0001, 0x0005, 0x0019, - 0x9085, 0x0001, 0x0005, 0x6000, 0x908a, 0x0010, 0x1a0c, 0x0d85, - 0x000b, 0x0005, 0xe8da, 0xe8da, 0xe8f1, 0xe8e1, 0xe900, 0xe8da, - 0xe8da, 0xe8dc, 0xe8da, 0xe8da, 0xe8da, 0xe8da, 0xe8da, 0xe8da, - 0xe8da, 0xe8da, 0x080c, 0x0d85, 0x080c, 0xb1a7, 0x9085, 0x0001, - 0x0005, 0x0036, 0x00e6, 0x2071, 0x19e8, 0x704c, 0x9c06, 0x1128, - 0x2019, 0x0001, 0x080c, 0xa596, 0x0010, 0x080c, 0xa7a1, 0x00ee, - 0x003e, 0x0096, 0x00d6, 0x6014, 0x2048, 0xa87b, 0x0005, 0x080c, - 0x7012, 0x080c, 0xb1a7, 0x00de, 0x009e, 0x9085, 0x0001, 0x0005, - 0x601c, 0xd084, 0x190c, 0x1ad3, 0x0c60, 0x2001, 0x0001, 0x080c, - 0x66e6, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, - 0x1805, 0x2011, 0x0276, 0x080c, 0xc20e, 0x003e, 0x002e, 0x001e, - 0x015e, 0x9005, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x0076, - 0x0066, 0x00b6, 0x0126, 0x2091, 0x8000, 0x2740, 0x2061, 0x1ddc, - 0x2079, 0x0001, 0x8fff, 0x0904, 0xe977, 0x2071, 0x1800, 0x7654, - 0x7074, 0x8001, 0x9602, 0x1a04, 0xe977, 0x88ff, 0x0120, 0x2800, - 0x9c06, 0x15a0, 0x2078, 0x080c, 0xeabe, 0x0580, 0x2400, 0x9c06, - 0x0568, 0x6720, 0x9786, 0x0006, 0x1548, 0x9786, 0x0007, 0x0530, - 0x88ff, 0x1150, 0xd58c, 0x1118, 0x6010, 0x9b06, 0x11f8, 0xd584, - 0x0118, 0x605c, 0x9106, 0x11d0, 0x0096, 0x601c, 0xd084, 0x0140, - 0x080c, 0xece1, 0x080c, 0xd65d, 0x080c, 0x1ad3, 0x6023, 0x0007, - 0x6014, 0x2048, 0x080c, 0xcf1b, 0x0120, 0x0046, 0x080c, 0xea30, - 0x004e, 0x009e, 0x080c, 0xb1a7, 0x88ff, 0x1198, 0x9ce0, 0x001c, - 0x2001, 0x181a, 0x2004, 0x9c02, 0x1210, 0x0804, 0xe92a, 0x9006, - 0x012e, 0x00be, 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee, 0x00fe, - 0x0005, 0x98c5, 0x0001, 0x0ca0, 0x080c, 0xacfc, 0x00b6, 0x0076, - 0x0056, 0x0086, 0x9046, 0x2029, 0x0001, 0x2c20, 0x2019, 0x0002, - 0x6210, 0x2258, 0x0096, 0x904e, 0x080c, 0xa667, 0x009e, 0x008e, - 0x903e, 0x080c, 0xa712, 0x080c, 0xe91b, 0x005e, 0x007e, 0x00be, - 0x080c, 0xad18, 0x0005, 0x080c, 0xacfc, 0x00b6, 0x0046, 0x0056, - 0x0076, 0x00c6, 0x0156, 0x2c20, 0x2128, 0x20a9, 0x007f, 0x900e, - 0x0016, 0x0036, 0x080c, 0x67b4, 0x1180, 0x0056, 0x0086, 0x9046, - 0x2508, 0x2029, 0x0001, 0x0096, 0x904e, 0x080c, 0xa667, 0x009e, - 0x008e, 0x903e, 0x080c, 0xa712, 0x005e, 0x003e, 0x001e, 0x8108, - 0x1f04, 0xe9b0, 0x0036, 0x2508, 0x2029, 0x0003, 0x080c, 0xe91b, - 0x003e, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, 0x080c, - 0xad18, 0x0005, 0x080c, 0xacfc, 0x00b6, 0x0076, 0x0056, 0x6210, - 0x2258, 0x0086, 0x9046, 0x2029, 0x0001, 0x2019, 0x0048, 0x0096, - 0x904e, 0x080c, 0xa667, 0x009e, 0x008e, 0x903e, 0x080c, 0xa712, - 0x2c20, 0x080c, 0xe91b, 0x005e, 0x007e, 0x00be, 0x080c, 0xad18, - 0x0005, 0x080c, 0xacfc, 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, - 0x0156, 0x2c20, 0x20a9, 0x0800, 0x900e, 0x0016, 0x0036, 0x080c, - 0x67b4, 0x1190, 0x0086, 0x9046, 0x2828, 0x0046, 0x2021, 0x0001, - 0x080c, 0xecc5, 0x004e, 0x0096, 0x904e, 0x080c, 0xa667, 0x009e, - 0x008e, 0x903e, 0x080c, 0xa712, 0x003e, 0x001e, 0x8108, 0x1f04, - 0xea05, 0x0036, 0x2029, 0x0002, 0x080c, 0xe91b, 0x003e, 0x015e, - 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, 0x080c, 0xad18, 0x0005, - 0x0016, 0x00f6, 0x080c, 0xcf19, 0x0198, 0xa864, 0x9084, 0x00ff, - 0x9086, 0x0046, 0x0180, 0xa800, 0x907d, 0x0138, 0xa803, 0x0000, - 0xab82, 0x080c, 0x7012, 0x2f48, 0x0cb0, 0xab82, 0x080c, 0x7012, - 0x00fe, 0x001e, 0x0005, 0xa800, 0x907d, 0x0130, 0xa803, 0x0000, - 0x080c, 0x7012, 0x2f48, 0x0cb8, 0x080c, 0x7012, 0x0c88, 0x00e6, - 0x0046, 0x0036, 0x2061, 0x1ddc, 0x9005, 0x1138, 0x2071, 0x1800, - 0x7454, 0x7074, 0x8001, 0x9402, 0x12f8, 0x2100, 0x9c06, 0x0188, - 0x6000, 0x9086, 0x0000, 0x0168, 0x6008, 0x9206, 0x1150, 0x6320, - 0x9386, 0x0009, 0x01b0, 0x6010, 0x91a0, 0x0004, 0x2424, 0x9406, - 0x0140, 0x9ce0, 0x001c, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1220, - 0x0c20, 0x9085, 0x0001, 0x0008, 0x9006, 0x003e, 0x004e, 0x00ee, - 0x0005, 0x631c, 0xd3c4, 0x1d68, 0x0c30, 0x0096, 0x0006, 0x080c, - 0x1059, 0x000e, 0x090c, 0x0d85, 0xaae2, 0xa867, 0x010d, 0xa88e, - 0x0026, 0x2010, 0x080c, 0xcf09, 0x2001, 0x0000, 0x0120, 0x2200, - 0x9080, 0x0017, 0x2004, 0x002e, 0xa87a, 0x9186, 0x0020, 0x0110, - 0xa8e3, 0xffff, 0xa986, 0xac76, 0xa87f, 0x0000, 0x2001, 0x198e, - 0x2004, 0xa882, 0x9006, 0xa802, 0xa86a, 0xa88a, 0x0126, 0x2091, - 0x8000, 0x080c, 0x7012, 0x012e, 0x009e, 0x0005, 0x6700, 0x9786, - 0x0000, 0x0158, 0x9786, 0x0001, 0x0140, 0x9786, 0x000a, 0x0128, - 0x9786, 0x0009, 0x0110, 0x9085, 0x0001, 0x0005, 0x00e6, 0x6010, - 0x9075, 0x0138, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x9206, 0x00ee, - 0x0005, 0x9085, 0x0001, 0x0cd8, 0x0016, 0x6004, 0x908e, 0x001e, - 0x11a0, 0x8007, 0x6134, 0x918c, 0x00ff, 0x9105, 0x6036, 0x6007, - 0x0085, 0x6003, 0x000b, 0x6023, 0x0005, 0x2001, 0x1987, 0x2004, - 0x601a, 0x2009, 0x8020, 0x080c, 0x9617, 0x001e, 0x0005, 0xa001, - 0xa001, 0x0005, 0x6024, 0xd0e4, 0x0158, 0xd0cc, 0x0118, 0x080c, - 0xd267, 0x0030, 0x080c, 0xece1, 0x080c, 0x8c19, 0x080c, 0xb16c, - 0x0005, 0x9280, 0x0008, 0x2004, 0x9084, 0x000f, 0x0002, 0xeb1d, - 0xeb1d, 0xeb1d, 0xeb1f, 0xeb1d, 0xeb1f, 0xeb1f, 0xeb1d, 0xeb1f, - 0xeb1d, 0xeb1d, 0xeb1d, 0xeb1d, 0xeb1d, 0x9006, 0x0005, 0x9085, - 0x0001, 0x0005, 0x9280, 0x0008, 0x2004, 0x9084, 0x000f, 0x0002, - 0xeb36, 0xeb36, 0xeb36, 0xeb36, 0xeb36, 0xeb36, 0xeb43, 0xeb36, - 0xeb36, 0xeb36, 0xeb36, 0xeb36, 0xeb36, 0xeb36, 0x6007, 0x003b, - 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003, 0x0001, 0x2009, 0x8020, - 0x080c, 0x9617, 0x0005, 0x0096, 0x00c6, 0x2260, 0x080c, 0xece1, - 0x604b, 0x0000, 0x6024, 0xc0f4, 0xc0e4, 0x6026, 0x603b, 0x0000, - 0x00ce, 0x00d6, 0x2268, 0x9186, 0x0007, 0x1904, 0xeb9c, 0x6814, - 0x9005, 0x0138, 0x2048, 0xa87c, 0xd0fc, 0x1118, 0x00de, 0x009e, - 0x08a8, 0x6007, 0x003a, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, - 0x9617, 0x00c6, 0x2d60, 0x6100, 0x9186, 0x0002, 0x1904, 0xec0c, - 0x6014, 0x9005, 0x1138, 0x6000, 0x9086, 0x0007, 0x190c, 0x0d85, - 0x0804, 0xec0c, 0x2048, 0x080c, 0xcf1b, 0x1130, 0x0028, 0x2048, - 0xa800, 0x9005, 0x1de0, 0x2900, 0x2048, 0xa87c, 0x9084, 0x0003, - 0x9086, 0x0002, 0x1168, 0xa87c, 0xc0dc, 0xc0f4, 0xa87e, 0xa880, - 0xc0fc, 0xa882, 0x2009, 0x0043, 0x080c, 0xe3b5, 0x0804, 0xec0c, - 0x2009, 0x0041, 0x0804, 0xec06, 0x9186, 0x0005, 0x15a0, 0x6814, - 0x2048, 0xa87c, 0xd0bc, 0x1120, 0x00de, 0x009e, 0x0804, 0xeb36, - 0xd0b4, 0x0128, 0xd0fc, 0x090c, 0x0d85, 0x0804, 0xeb57, 0x6007, - 0x003a, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x9617, 0x00c6, - 0x2d60, 0x6100, 0x9186, 0x0002, 0x0120, 0x9186, 0x0004, 0x1904, - 0xec0c, 0x6814, 0x2048, 0xa97c, 0xc1f4, 0xc1dc, 0xa97e, 0xa980, - 0xc1fc, 0xc1bc, 0xa982, 0x00f6, 0x2c78, 0x080c, 0x17ad, 0x00fe, - 0x2009, 0x0042, 0x0498, 0x0036, 0x080c, 0x1059, 0x090c, 0x0d85, - 0xa867, 0x010d, 0x9006, 0xa802, 0xa86a, 0xa88a, 0x2d18, 0xab8e, - 0xa887, 0x0045, 0x2c00, 0xa892, 0x6038, 0xa8a2, 0x2360, 0x6024, - 0xc0dd, 0x6026, 0x6010, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x2004, - 0x635c, 0xab7a, 0xa876, 0x9006, 0xa87e, 0xa882, 0xad9a, 0xae96, - 0xa89f, 0x0001, 0x080c, 0x7012, 0x2019, 0x0045, 0x6008, 0x2068, - 0x080c, 0xe578, 0x2d00, 0x600a, 0x003e, 0x0038, 0x604b, 0x0000, - 0x6003, 0x0007, 0x080c, 0xe3b5, 0x00ce, 0x00de, 0x009e, 0x0005, - 0x9186, 0x0013, 0x1128, 0x6004, 0x9082, 0x0085, 0x2008, 0x00c2, - 0x9186, 0x0027, 0x1178, 0x080c, 0x99ed, 0x0036, 0x0096, 0x6014, - 0x2048, 0x2019, 0x0004, 0x080c, 0xea30, 0x009e, 0x003e, 0x080c, - 0x9ab3, 0x0005, 0x9186, 0x0014, 0x0d70, 0x080c, 0xb227, 0x0005, - 0xec3f, 0xec3d, 0xec3d, 0xec3d, 0xec3d, 0xec3d, 0xec3f, 0xec3d, - 0xec3d, 0xec3d, 0xec3d, 0xec3d, 0xec3d, 0x080c, 0x0d85, 0x6003, - 0x000c, 0x080c, 0x9ab3, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, - 0x0085, 0x0208, 0x001a, 0x080c, 0xb227, 0x0005, 0xec5b, 0xec5b, - 0xec5b, 0xec5b, 0xec5d, 0xec7d, 0xec5b, 0xec5b, 0xec5b, 0xec5b, - 0xec5b, 0xec5b, 0xec5b, 0x080c, 0x0d85, 0x00d6, 0x2c68, 0x080c, - 0xb116, 0x01b0, 0x6003, 0x0001, 0x6007, 0x001e, 0x2009, 0x026e, - 0x210c, 0x613a, 0x2009, 0x026f, 0x210c, 0x613e, 0x600b, 0xffff, - 0x6910, 0x6112, 0x6023, 0x0004, 0x2009, 0x8020, 0x080c, 0x9617, - 0x2d60, 0x080c, 0xb16c, 0x00de, 0x0005, 0x080c, 0xb16c, 0x0005, - 0x00e6, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0ec, 0x00ee, - 0x0005, 0x2009, 0x1867, 0x210c, 0xd1ec, 0x05b0, 0x6003, 0x0002, - 0x6024, 0xc0e5, 0x6026, 0xd0cc, 0x0150, 0x2001, 0x1988, 0x2004, - 0x604a, 0x2009, 0x1867, 0x210c, 0xd1f4, 0x1520, 0x00a0, 0x2009, - 0x1867, 0x210c, 0xd1f4, 0x0128, 0x6024, 0xc0e4, 0x6026, 0x9006, - 0x00d8, 0x2001, 0x1988, 0x200c, 0x2001, 0x1986, 0x2004, 0x9100, - 0x9080, 0x000a, 0x604a, 0x6010, 0x00b6, 0x2058, 0xb8bc, 0x00be, - 0x0008, 0x2104, 0x9005, 0x0118, 0x9088, 0x0003, 0x0cd0, 0x2c0a, - 0x600f, 0x0000, 0x9085, 0x0001, 0x0005, 0x0016, 0x00c6, 0x00e6, - 0x615c, 0xb8bc, 0x2060, 0x8cff, 0x0180, 0x84ff, 0x1118, 0x605c, - 0x9106, 0x1138, 0x600c, 0x2072, 0x080c, 0x8c19, 0x080c, 0xb16c, - 0x0010, 0x9cf0, 0x0003, 0x2e64, 0x0c70, 0x00ee, 0x00ce, 0x001e, - 0x0005, 0x00d6, 0x00b6, 0x6010, 0x2058, 0xb8bc, 0x906d, 0x0130, - 0x9c06, 0x0110, 0x680c, 0x0cd0, 0x600c, 0x680e, 0x00be, 0x00de, - 0x0005, 0x0026, 0x0036, 0x0156, 0x2011, 0x182c, 0x2204, 0x9084, - 0x00ff, 0x2019, 0x026e, 0x2334, 0x96b4, 0x00ff, 0x9636, 0x1508, - 0x8318, 0x2334, 0x2204, 0x9084, 0xff00, 0x9636, 0x11d0, 0x2011, - 0x0270, 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x000a, - 0x080c, 0xc222, 0x009e, 0x1168, 0x2011, 0x0274, 0x20a9, 0x0004, - 0x6010, 0x0096, 0x2048, 0x2019, 0x0006, 0x080c, 0xc222, 0x009e, - 0x1100, 0x015e, 0x003e, 0x002e, 0x0005, 0x00e6, 0x2071, 0x1800, - 0x080c, 0x6130, 0x080c, 0x30bf, 0x00ee, 0x0005, 0x0096, 0x0026, - 0x080c, 0x1059, 0x090c, 0x0d85, 0xa85c, 0x9080, 0x001a, 0x20a0, - 0x20a9, 0x000c, 0xa860, 0x20e8, 0x9006, 0x4004, 0x9186, 0x0046, - 0x1118, 0xa867, 0x0136, 0x0038, 0xa867, 0x0138, 0x9186, 0x0041, - 0x0110, 0xa87b, 0x0001, 0x7038, 0x9084, 0xff00, 0x7240, 0x9294, - 0xff00, 0x8007, 0x9215, 0xaa9a, 0x9186, 0x0046, 0x1168, 0x7038, - 0x9084, 0x00ff, 0x723c, 0x9294, 0xff00, 0x9215, 0xaa9e, 0x723c, - 0x9294, 0x00ff, 0xaaa2, 0x0060, 0x7040, 0x9084, 0x00ff, 0x7244, - 0x9294, 0xff00, 0x9215, 0xaa9e, 0x7244, 0x9294, 0x00ff, 0xaaa2, - 0x9186, 0x0046, 0x1118, 0x9e90, 0x0012, 0x0010, 0x9e90, 0x001a, - 0x2204, 0x8007, 0xa8a6, 0x8210, 0x2204, 0x8007, 0xa8aa, 0x8210, - 0x2204, 0x8007, 0xa8ae, 0x8210, 0x2204, 0x8007, 0xa8b2, 0x8210, - 0x9186, 0x0046, 0x11b8, 0x9e90, 0x0016, 0x2204, 0x8007, 0xa8b6, - 0x8210, 0x2204, 0x8007, 0xa8ba, 0x8210, 0x2204, 0x8007, 0xa8be, - 0x8210, 0x2204, 0x8007, 0xa8c2, 0x8210, 0x2011, 0x0205, 0x2013, - 0x0001, 0x00b0, 0x9e90, 0x001e, 0x2204, 0x8007, 0xa8b6, 0x8210, - 0x2204, 0x8007, 0xa8ba, 0x2011, 0x0205, 0x2013, 0x0001, 0x2011, - 0x0260, 0x2204, 0x8007, 0xa8be, 0x8210, 0x2204, 0x8007, 0xa8c2, - 0x9186, 0x0046, 0x1118, 0x2011, 0x0262, 0x0010, 0x2011, 0x026a, - 0x0146, 0x01d6, 0x0036, 0x20a9, 0x0001, 0x2019, 0x0008, 0xa860, - 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, 0x2204, 0x8007, 0x4004, - 0x8210, 0x8319, 0x1dd0, 0x003e, 0x01ce, 0x013e, 0x2011, 0x0205, - 0x2013, 0x0000, 0x002e, 0x080c, 0x7012, 0x009e, 0x0005, 0x00e6, - 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0fc, 0x0108, 0x0011, - 0x00ee, 0x0005, 0xa880, 0xc0e5, 0xa882, 0x0005, 0x00e6, 0x00d6, - 0x00c6, 0x0076, 0x0066, 0x0056, 0x0046, 0x0026, 0x0016, 0x0126, - 0x2091, 0x8000, 0x2029, 0x19f4, 0x252c, 0x2021, 0x19fb, 0x2424, - 0x2061, 0x1ddc, 0x2071, 0x1800, 0x7654, 0x7074, 0x9606, 0x0578, - 0x6720, 0x9786, 0x0001, 0x0118, 0x9786, 0x0008, 0x1500, 0x2500, - 0x9c06, 0x01e8, 0x2400, 0x9c06, 0x01d0, 0x080c, 0xeabe, 0x01b8, - 0x080c, 0xeace, 0x11a0, 0x6000, 0x9086, 0x0004, 0x1120, 0x0016, - 0x080c, 0x1ad3, 0x001e, 0x080c, 0xd121, 0x1110, 0x080c, 0x3344, - 0x080c, 0xd132, 0x1110, 0x080c, 0xbb5c, 0x080c, 0xb1a7, 0x9ce0, - 0x001c, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1208, 0x0858, 0x012e, - 0x001e, 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x00ce, 0x00de, - 0x00ee, 0x0005, 0x2001, 0x1810, 0x2004, 0xd0dc, 0x0005, 0x0006, - 0x2001, 0x1837, 0x2004, 0xd09c, 0x000e, 0x0005, 0x0006, 0x0036, - 0x0046, 0x080c, 0xd645, 0x0168, 0x2019, 0xffff, 0x9005, 0x0128, - 0x6010, 0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, 0x0004, 0x080c, - 0x4e58, 0x004e, 0x003e, 0x000e, 0x0005, 0x6004, 0x9086, 0x0001, - 0x1128, 0x080c, 0xa7e2, 0x080c, 0xb1a7, 0x9006, 0x0005, 0x00e6, - 0x00c6, 0x00b6, 0x0046, 0x2061, 0x1ddc, 0x2071, 0x1800, 0x7454, - 0x7074, 0x8001, 0x9402, 0x12d8, 0x2100, 0x9c06, 0x0168, 0x6000, - 0x9086, 0x0000, 0x0148, 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1120, - 0x6004, 0x9086, 0x0002, 0x0140, 0x9ce0, 0x001c, 0x2001, 0x181a, - 0x2004, 0x9c02, 0x1220, 0x0c40, 0x9085, 0x0001, 0x0008, 0x9006, - 0x004e, 0x00be, 0x00ce, 0x00ee, 0x0005, 0x2001, 0x1810, 0x2004, - 0xd0a4, 0x0160, 0x2001, 0x1837, 0x2004, 0xd0a4, 0x0138, 0x2001, - 0x1848, 0x2004, 0xd0a4, 0x1118, 0x9085, 0x0001, 0x0005, 0x9006, - 0x0ce8, 0x0126, 0x0006, 0x00e6, 0x0016, 0x2091, 0x8000, 0x2071, - 0x1840, 0xd5a4, 0x0118, 0x7004, 0x8000, 0x7006, 0xd5b4, 0x0118, - 0x7000, 0x8000, 0x7002, 0xd5ac, 0x0178, 0x2500, 0x9084, 0x0007, - 0x908e, 0x0003, 0x0148, 0x908e, 0x0004, 0x0130, 0x908e, 0x0005, - 0x0118, 0x2071, 0xfff6, 0x0089, 0x001e, 0x00ee, 0x000e, 0x012e, - 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, 0xffee, - 0x0021, 0x00ee, 0x000e, 0x012e, 0x0005, 0x2e05, 0x8000, 0x2077, - 0x1220, 0x8e70, 0x2e05, 0x8000, 0x2077, 0x0005, 0x00e6, 0x2071, - 0xffec, 0x0c99, 0x00ee, 0x0005, 0x00e6, 0x2071, 0xfff0, 0x0c69, - 0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, - 0x1840, 0x7014, 0x8000, 0x7016, 0x00ee, 0x000e, 0x012e, 0x0005, - 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, - 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000, - 0xaa6e -}; -#ifdef UNIQUE_FW_NAME -unsigned short fw2322ipx_length01 = 0xe719; -#else -unsigned short risc_code_length01 = 0xe719; -#endif - -/* + * ftp://ftp.qlogic.com/outgoing/linux/firmware/ql2322_fw.bin + * + * xxd -g 1 -i ql2322_fw.bin | indent -l80 -i8 -o ql2322_fw.c * */ -unsigned long rseqipx_code_addr01 = 0x0001c000 ; -unsigned short rseqipx_code01[] = { -0x000b, 0x0003, 0x0000, 0x0a4e, 0x0001, 0xc000, 0x0008, 0x8064, - 0x0000, 0x0010, 0x0000, 0x8066, 0x0008, 0x0101, 0x0003, 0xc007, - 0x0008, 0x80e0, 0x0008, 0xff00, 0x0000, 0x80e2, 0x0008, 0xff00, - 0x0008, 0x0162, 0x0000, 0x8066, 0x0008, 0xa101, 0x000b, 0xc00f, - 0x0008, 0x0d02, 0x0000, 0x8060, 0x0000, 0x0400, 0x000b, 0x60c6, - 0x0008, 0x80e0, 0x0000, 0x0100, 0x000b, 0x5819, 0x0003, 0x7b08, - 0x0003, 0x5241, 0x000b, 0xc813, 0x0009, 0xbac0, 0x0000, 0x008a, - 0x0003, 0x8813, 0x000a, 0x7042, 0x0003, 0x8813, 0x0000, 0x15fc, - 0x000b, 0xb013, 0x0009, 0xc4c0, 0x0000, 0x7000, 0x0001, 0xffa0, - 0x0000, 0x2000, 0x0003, 0x93cd, 0x0008, 0x808c, 0x0000, 0x0001, - 0x0007, 0x0000, 0x0007, 0x0000, 0x0000, 0x40d4, 0x000a, 0x4047, - 0x0008, 0x808c, 0x0000, 0x0002, 0x0007, 0x0000, 0x000b, 0x0832, - 0x0000, 0x4022, 0x0003, 0x0038, 0x0008, 0x4122, 0x0009, 0xeac0, - 0x0008, 0xff00, 0x0009, 0xffe0, 0x0008, 0x0500, 0x000b, 0x0bf4, - 0x0002, 0x4447, 0x0003, 0x8bf1, 0x0008, 0x0bfe, 0x0001, 0x11a0, - 0x000b, 0x13d3, 0x0001, 0x0ca0, 0x000b, 0x13d3, 0x0001, 0x9180, - 0x0000, 0x0004, 0x0000, 0x8060, 0x0000, 0x0400, 0x0008, 0x7f62, - 0x0000, 0x8066, 0x0008, 0x0009, 0x0003, 0xc046, 0x0008, 0x808c, - 0x0008, 0x0000, 0x0008, 0x0060, 0x0008, 0x8062, 0x0000, 0x0004, - 0x0000, 0x8066, 0x0000, 0x0411, 0x000b, 0xc04e, 0x0000, 0x03fe, - 0x0001, 0x43e0, 0x0003, 0x8bd0, 0x0009, 0xc2c0, 0x0008, 0x00ff, - 0x0001, 0x02e0, 0x0003, 0x8bd0, 0x0001, 0x9180, 0x0008, 0x0005, - 0x0000, 0x8060, 0x0000, 0x0400, 0x0008, 0x7f62, 0x0000, 0x8066, - 0x0000, 0x0019, 0x0003, 0xc05d, 0x0002, 0x0240, 0x000b, 0x0bcd, - 0x0008, 0x00fc, 0x0003, 0x33d0, 0x000a, 0x0244, 0x0003, 0x086f, - 0x0004, 0x021a, 0x0001, 0x9180, 0x0000, 0x0007, 0x0008, 0x7f62, - 0x0000, 0x8060, 0x0000, 0x0400, 0x0002, 0x0234, 0x0008, 0x7f04, - 0x0000, 0x8066, 0x0000, 0x040a, 0x0003, 0xc06e, 0x000a, 0x0248, - 0x000b, 0x0879, 0x0001, 0x9180, 0x0008, 0x0006, 0x0008, 0x7f62, - 0x0008, 0x8002, 0x0008, 0x0003, 0x0000, 0x8066, 0x0000, 0x020a, - 0x000b, 0xc078, 0x0000, 0x112a, 0x0008, 0x002e, 0x0008, 0x022c, - 0x0002, 0x3a44, 0x0003, 0x8813, 0x0008, 0x808c, 0x0000, 0x0002, - 0x0008, 0x1760, 0x0008, 0x8062, 0x0008, 0x000f, 0x0000, 0x8066, - 0x0008, 0x0011, 0x0003, 0xc085, 0x0008, 0x01fe, 0x0009, 0x42e0, - 0x000b, 0x8bc0, 0x0000, 0x00fe, 0x0001, 0x43e0, 0x000b, 0x8bc0, - 0x0000, 0x1734, 0x0000, 0x1530, 0x0008, 0x1632, 0x0008, 0x0d2a, - 0x0001, 0x9880, 0x0008, 0x0012, 0x0000, 0x8060, 0x0000, 0x0400, - 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x1e0a, 0x0003, 0xc097, - 0x0008, 0x808a, 0x0008, 0x0003, 0x0000, 0x1a60, 0x0008, 0x8062, - 0x0000, 0x0002, 0x000b, 0x589d, 0x0000, 0x8066, 0x0000, 0x3679, - 0x000b, 0xc0a0, 0x000b, 0x58a1, 0x0008, 0x8054, 0x0008, 0x0011, - 0x0000, 0x8074, 0x0008, 0x1010, 0x0008, 0x1efc, 0x0003, 0x3013, - 0x0004, 0x00aa, 0x0003, 0x0013, 0x0000, 0x1c60, 0x0000, 0x1b62, - 0x0000, 0x8066, 0x0008, 0x0231, 0x0003, 0xc0ae, 0x0003, 0x58af, - 0x0008, 0x0140, 0x0000, 0x0242, 0x0002, 0x1f43, 0x0003, 0x88b9, - 0x0000, 0x0d44, 0x0008, 0x0d46, 0x0008, 0x0348, 0x0008, 0x044a, - 0x000b, 0x00bd, 0x0008, 0x0344, 0x0008, 0x0446, 0x0008, 0x0548, - 0x0000, 0x064a, 0x000a, 0x1948, 0x0003, 0x08c0, 0x0008, 0x0d4a, - 0x0003, 0x58c0, 0x0008, 0x8054, 0x0000, 0x0001, 0x0000, 0x8074, - 0x0008, 0x2020, 0x000f, 0x4000, 0x0002, 0x7043, 0x0003, 0x8816, - 0x0002, 0x7040, 0x000b, 0x8949, 0x0000, 0x4820, 0x0008, 0x0bfe, - 0x0009, 0x10a0, 0x0003, 0x1140, 0x0001, 0x0ca0, 0x0003, 0x1140, - 0x0000, 0x8060, 0x0000, 0x0400, 0x0009, 0x9080, 0x0000, 0x0008, - 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0009, 0x000b, 0xc0d7, - 0x0001, 0x80e0, 0x0008, 0x0003, 0x000b, 0x8940, 0x0000, 0x8060, - 0x0000, 0x0400, 0x0009, 0x9080, 0x0000, 0x0004, 0x0008, 0x7f62, - 0x0000, 0x8066, 0x0008, 0x0009, 0x000b, 0xc0e2, 0x0008, 0x0060, - 0x0008, 0x8062, 0x0000, 0x0004, 0x0000, 0x8066, 0x0000, 0x0411, - 0x000b, 0xc0e8, 0x0008, 0x4afe, 0x0009, 0x03e0, 0x000b, 0x8940, - 0x0009, 0xcbc0, 0x0008, 0x00ff, 0x0001, 0x02e0, 0x000b, 0x8940, - 0x0000, 0x49b4, 0x0002, 0x4b4e, 0x000b, 0x8951, 0x0008, 0x808a, - 0x0000, 0x0004, 0x0000, 0x18fe, 0x0001, 0x10e0, 0x000b, 0x88fa, - 0x0002, 0x192f, 0x0008, 0x7f32, 0x0008, 0x15fe, 0x0001, 0x10e0, - 0x000b, 0x88ff, 0x0002, 0x162f, 0x0008, 0x7f2c, 0x0000, 0x8060, - 0x0000, 0x0400, 0x0009, 0x9080, 0x0000, 0x0007, 0x0008, 0x7f62, - 0x0000, 0x8066, 0x0008, 0x0009, 0x0003, 0xc106, 0x000a, 0x004f, - 0x000b, 0x8937, 0x000a, 0x0040, 0x000b, 0x0921, 0x0002, 0x004e, - 0x000b, 0x0921, 0x0002, 0x0030, 0x0002, 0x7f2f, 0x0000, 0x7f00, - 0x0000, 0x8066, 0x0008, 0x000a, 0x0003, 0xc112, 0x0008, 0x1010, - 0x0004, 0x0201, 0x0003, 0xb11a, 0x0004, 0x0387, 0x000c, 0x01eb, - 0x0003, 0x7816, 0x0003, 0x0013, 0x0000, 0x0806, 0x0008, 0x8010, - 0x0000, 0x001f, 0x0004, 0x0387, 0x0000, 0x0310, 0x0004, 0x0387, - 0x0003, 0x0118, 0x000a, 0x002f, 0x0000, 0x7f00, 0x0000, 0x8066, - 0x0008, 0x000a, 0x000b, 0xc125, 0x0004, 0x01c4, 0x000a, 0x0040, - 0x000b, 0x093a, 0x0004, 0x0231, 0x0000, 0x8000, 0x0000, 0x0002, - 0x0000, 0x8060, 0x0000, 0x0400, 0x0009, 0x9080, 0x0008, 0x0006, - 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x000a, 0x0003, 0xc133, - 0x0000, 0x8072, 0x0000, 0x4000, 0x0003, 0x0118, 0x0008, 0x8010, - 0x0008, 0x001e, 0x0003, 0x013c, 0x0008, 0x8010, 0x0008, 0x001d, - 0x0004, 0x0387, 0x0008, 0x1010, 0x0004, 0x0387, 0x0003, 0x0016, - 0x0002, 0x4b4e, 0x0003, 0x0946, 0x0008, 0x808a, 0x0000, 0x0004, - 0x000b, 0x6146, 0x000f, 0x8000, 0x0008, 0x808a, 0x0000, 0x0004, - 0x0003, 0x0016, 0x0008, 0x808a, 0x0000, 0x0004, 0x0007, 0x0000, - 0x0007, 0x0000, 0x0008, 0x80e0, 0x0008, 0x0202, 0x000b, 0x6149, - 0x000b, 0x0014, 0x0000, 0x8060, 0x0000, 0x0400, 0x0009, 0x9080, - 0x0008, 0x0011, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0009, - 0x000b, 0xc158, 0x000a, 0x004f, 0x000b, 0x89b5, 0x0000, 0x8060, - 0x0000, 0x0400, 0x0009, 0x9080, 0x0008, 0x0005, 0x0008, 0x7f62, - 0x0000, 0x8066, 0x0008, 0x0009, 0x000b, 0xc162, 0x0008, 0x0060, - 0x0008, 0x8062, 0x0000, 0x001f, 0x0000, 0x8066, 0x0000, 0x0209, - 0x000b, 0xc168, 0x000a, 0x014b, 0x0003, 0x09b5, 0x0008, 0x8062, - 0x0008, 0x000f, 0x0000, 0x8066, 0x0000, 0x0211, 0x0003, 0xc16f, - 0x0008, 0x01fe, 0x0001, 0x02d0, 0x000b, 0x89b5, 0x0004, 0x01cd, - 0x0003, 0x09b5, 0x0008, 0x03a0, 0x0008, 0x8004, 0x0000, 0x0002, - 0x0000, 0x8006, 0x0000, 0x0043, 0x0008, 0x4908, 0x0008, 0x808a, - 0x0000, 0x0004, 0x0000, 0x8060, 0x0000, 0x0400, 0x0009, 0x9080, - 0x0008, 0x0000, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x041a, - 0x0003, 0xc184, 0x0003, 0xe185, 0x0008, 0x4908, 0x0008, 0x480a, - 0x0008, 0x808a, 0x0000, 0x0004, 0x0008, 0x0060, 0x0008, 0x8062, - 0x0008, 0x002b, 0x0000, 0x8066, 0x0000, 0x0411, 0x000b, 0xc18f, - 0x0008, 0x04fe, 0x0009, 0x02a0, 0x0003, 0x9196, 0x0002, 0x0500, - 0x000b, 0x09b2, 0x000b, 0x0197, 0x0000, 0x05fe, 0x0001, 0x03a0, - 0x000b, 0x11b2, 0x0000, 0x0d0c, 0x0008, 0x0d0e, 0x0008, 0x0d10, - 0x0000, 0x0d12, 0x0008, 0x0060, 0x0008, 0x8062, 0x0000, 0x000d, - 0x0000, 0x8066, 0x0008, 0x0832, 0x000b, 0xc1a2, 0x0000, 0x800a, - 0x0000, 0x8005, 0x0000, 0x8060, 0x0000, 0x0400, 0x0009, 0x9080, - 0x0008, 0x0011, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0a12, - 0x0003, 0xc1ac, 0x0008, 0x5006, 0x0008, 0x100e, 0x000c, 0x01d8, - 0x0003, 0x7816, 0x0003, 0x0013, 0x0008, 0x0208, 0x0008, 0x030a, - 0x0003, 0x0199, 0x0004, 0x01c4, 0x0008, 0x808a, 0x0000, 0x0004, - 0x0008, 0x8010, 0x0008, 0x0021, 0x0004, 0x0387, 0x0008, 0x1010, - 0x0004, 0x0387, 0x0000, 0x4810, 0x0004, 0x0387, 0x0008, 0x4910, - 0x0004, 0x0387, 0x0008, 0x808a, 0x0000, 0x0004, 0x0003, 0x0016, - 0x0000, 0x8060, 0x0000, 0x0400, 0x0009, 0x9080, 0x0000, 0x0002, - 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0xb40a, 0x000b, 0xc1cb, - 0x000f, 0x4000, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x0a62, - 0x0000, 0x8066, 0x0000, 0x0411, 0x0003, 0xc1d2, 0x0002, 0x0210, - 0x0001, 0xffc0, 0x0000, 0x0007, 0x0009, 0x03e0, 0x000f, 0x4000, - 0x0000, 0x8060, 0x0000, 0x0400, 0x0001, 0x8380, 0x0000, 0x0002, - 0x0009, 0x0a80, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0000, 0x0e0a, - 0x000b, 0xc1e0, 0x0002, 0x0300, 0x0001, 0xffc0, 0x0000, 0x0007, - 0x0000, 0x7f06, 0x0002, 0x0a00, 0x0008, 0x7f62, 0x0000, 0x8066, - 0x0008, 0x060a, 0x000b, 0xc1e9, 0x000f, 0x4000, 0x0000, 0x0da0, - 0x0008, 0x0da2, 0x0008, 0x0da4, 0x0009, 0x8880, 0x0000, 0x0001, - 0x0008, 0x7f62, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x8066, - 0x0008, 0xa012, 0x0000, 0x0da6, 0x0008, 0x0da8, 0x0000, 0x0daa, - 0x0000, 0x0dac, 0x0003, 0xc1f9, 0x0009, 0x8880, 0x0008, 0x0009, - 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0xa03a, 0x0003, 0xc1ff, - 0x000f, 0x4000, 0x0009, 0x8880, 0x0008, 0x0005, 0x0000, 0x8060, - 0x0000, 0x0400, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0009, - 0x000b, 0xc208, 0x0008, 0x0060, 0x0008, 0x8062, 0x0000, 0x000d, - 0x0000, 0x8066, 0x0008, 0x0021, 0x000b, 0xc20e, 0x0000, 0x00fe, - 0x0001, 0x01d0, 0x0003, 0x8a17, 0x0008, 0x02fe, 0x0009, 0x03d0, - 0x000b, 0x0a17, 0x0000, 0x0d06, 0x000f, 0x4000, 0x0000, 0x8006, - 0x0000, 0x0001, 0x000f, 0x4000, 0x0008, 0x0060, 0x0008, 0x8062, - 0x0008, 0x002b, 0x0000, 0x8066, 0x0008, 0xa041, 0x000b, 0xc21f, - 0x0002, 0x0243, 0x000b, 0x8a26, 0x0000, 0x54ac, 0x0000, 0x55ae, - 0x0008, 0x0da8, 0x0000, 0x0daa, 0x0000, 0x50b0, 0x0000, 0x51b2, - 0x0000, 0x0db4, 0x0008, 0x0db6, 0x0008, 0x0060, 0x0008, 0x8062, - 0x0000, 0x0007, 0x0000, 0x8066, 0x0008, 0xa452, 0x000b, 0xc22f, - 0x000f, 0x4000, 0x000a, 0x3945, 0x000b, 0x8a3b, 0x0000, 0x8072, - 0x0008, 0x4040, 0x0007, 0x0000, 0x000a, 0x3945, 0x0003, 0x8a39, - 0x000f, 0x4000, 0x0000, 0x8072, 0x0000, 0x4000, 0x0007, 0x0000, - 0x0007, 0x0000, 0x0007, 0x0000, 0x000a, 0x3945, 0x000b, 0x0a33, - 0x000b, 0x023b, 0x000a, 0x3a40, 0x0003, 0x8819, 0x0001, 0xabd0, - 0x0008, 0x0000, 0x0000, 0x7f24, 0x0003, 0x5a46, 0x0008, 0x8054, - 0x0000, 0x0002, 0x0002, 0x1242, 0x0003, 0x0a8c, 0x000a, 0x3a45, - 0x000b, 0x0a7b, 0x000a, 0x1e10, 0x0000, 0x7f3c, 0x000b, 0x0a78, - 0x0002, 0x1d00, 0x0000, 0x7f3a, 0x0000, 0x0d60, 0x0008, 0x7f62, - 0x0000, 0x8066, 0x0008, 0x0009, 0x0003, 0xc256, 0x0008, 0x00fc, - 0x0003, 0xb275, 0x0000, 0x1c60, 0x0008, 0x8062, 0x0000, 0x0001, - 0x0000, 0x8066, 0x0008, 0x0009, 0x000b, 0xc25e, 0x0008, 0x00fc, - 0x000b, 0x33a9, 0x0000, 0x0038, 0x0008, 0x0060, 0x0008, 0x8062, - 0x0000, 0x0019, 0x0000, 0x8066, 0x0008, 0x0009, 0x000b, 0xc267, - 0x0009, 0x80c0, 0x0008, 0x00ff, 0x0008, 0x7f3e, 0x0000, 0x0d60, - 0x0008, 0x0efe, 0x0001, 0x1f80, 0x0008, 0x7f62, 0x0000, 0x8066, - 0x0008, 0x0009, 0x0003, 0xc271, 0x0008, 0x003a, 0x0000, 0x1dfe, - 0x000b, 0x0252, 0x0008, 0x0036, 0x0004, 0x00aa, 0x000b, 0x028c, - 0x0000, 0x8074, 0x0000, 0x2000, 0x000b, 0x028c, 0x0002, 0x3a44, - 0x000b, 0x0bd6, 0x0000, 0x8074, 0x0000, 0x1000, 0x0001, 0xadd0, - 0x0008, 0x0000, 0x0008, 0x7f0e, 0x0003, 0xb3a6, 0x0001, 0xa7d0, - 0x0008, 0x0000, 0x0000, 0x7f00, 0x0009, 0xa6d0, 0x0008, 0x0000, - 0x0009, 0x00d0, 0x0003, 0x8a9c, 0x0000, 0x8074, 0x0008, 0x4040, - 0x0003, 0x5a8c, 0x0003, 0x5241, 0x000a, 0x3a46, 0x0003, 0x8a9c, - 0x0002, 0x3a47, 0x0003, 0x0a97, 0x0008, 0x8054, 0x0000, 0x0004, - 0x0000, 0x8074, 0x0000, 0x8000, 0x0003, 0x02fc, 0x0009, 0x92c0, - 0x0000, 0x0fc8, 0x000b, 0x0813, 0x000a, 0x1246, 0x000b, 0x8ba0, - 0x0000, 0x1a60, 0x0008, 0x8062, 0x0000, 0x0002, 0x0000, 0x8066, - 0x0000, 0x367a, 0x000b, 0xc2a1, 0x0009, 0x92c0, 0x0008, 0x0780, - 0x0003, 0x8bba, 0x0002, 0x124b, 0x000b, 0x0aaa, 0x0002, 0x2e4d, - 0x0002, 0x2e4d, 0x0003, 0x0ba6, 0x000a, 0x3a46, 0x000b, 0x8aba, - 0x000b, 0x5aac, 0x0008, 0x8054, 0x0000, 0x0004, 0x000a, 0x1243, - 0x000b, 0x0afa, 0x0008, 0x8010, 0x0000, 0x000d, 0x0004, 0x0387, - 0x000a, 0x1948, 0x000b, 0x0ab7, 0x000c, 0x037c, 0x0000, 0x1810, - 0x0004, 0x0387, 0x0003, 0x02fa, 0x000a, 0x1948, 0x000b, 0x0abe, - 0x000a, 0x1243, 0x0003, 0x0ba9, 0x000a, 0x194d, 0x0003, 0x0ac2, - 0x000a, 0x1243, 0x000b, 0x0bb0, 0x0003, 0x5ac2, 0x0008, 0x8054, - 0x0000, 0x0004, 0x000a, 0x192e, 0x0008, 0x7f32, 0x000a, 0x1947, - 0x0003, 0x0af4, 0x0002, 0x194f, 0x000b, 0x0ad2, 0x000c, 0x037c, - 0x0000, 0x1810, 0x0004, 0x0201, 0x000b, 0xb2ed, 0x0004, 0x0387, - 0x000c, 0x01eb, 0x0003, 0x02fa, 0x0000, 0x1a60, 0x0008, 0x8062, - 0x0000, 0x001f, 0x0000, 0x8066, 0x0008, 0x0009, 0x0003, 0xc2d7, - 0x000a, 0x004c, 0x000b, 0x8af4, 0x0000, 0x8060, 0x0000, 0x0400, - 0x0001, 0x9880, 0x0000, 0x0007, 0x0008, 0x7f62, 0x0000, 0x8066, - 0x0000, 0x320a, 0x0003, 0xc2e1, 0x0000, 0x8060, 0x0000, 0x0400, - 0x0001, 0x9880, 0x0008, 0x0012, 0x0008, 0x7f62, 0x0000, 0x8066, - 0x0008, 0x1e0a, 0x000b, 0xc2e9, 0x0000, 0x1826, 0x0000, 0x1928, - 0x0003, 0x02fa, 0x0000, 0x0806, 0x0008, 0x8010, 0x0000, 0x001f, - 0x0004, 0x0387, 0x0000, 0x0310, 0x0004, 0x0387, 0x0003, 0x02fa, - 0x000c, 0x037c, 0x0008, 0x8010, 0x0000, 0x0001, 0x0004, 0x0387, - 0x0000, 0x1810, 0x0004, 0x0387, 0x0000, 0x8074, 0x0008, 0xf000, - 0x0000, 0x0d30, 0x0002, 0x3a42, 0x0003, 0x8b02, 0x0000, 0x15fc, - 0x0003, 0xb07e, 0x0003, 0x0013, 0x0000, 0x8074, 0x0000, 0x0501, - 0x0008, 0x8010, 0x0008, 0x000c, 0x0004, 0x0387, 0x0003, 0x0013, - 0x0009, 0xbbe0, 0x0008, 0x0030, 0x000b, 0x8b1e, 0x0000, 0x18fe, - 0x0009, 0x3ce0, 0x0003, 0x0b1b, 0x0008, 0x15fe, 0x0009, 0x3ce0, - 0x0003, 0x0b1b, 0x0008, 0x13fe, 0x0009, 0x3ce0, 0x000b, 0x8b17, - 0x000c, 0x0375, 0x0008, 0x0d26, 0x000b, 0x0318, 0x0004, 0x0377, - 0x0008, 0x8076, 0x0000, 0x0040, 0x000b, 0x0372, 0x0008, 0x8076, - 0x0008, 0x0041, 0x000b, 0x0372, 0x0009, 0xbbe0, 0x0000, 0x0032, - 0x0003, 0x8b23, 0x0008, 0x3c1e, 0x000b, 0x0372, 0x0009, 0xbbe0, - 0x0000, 0x003b, 0x000b, 0x8b28, 0x0000, 0x3cdc, 0x000b, 0x0372, - 0x0009, 0xbbe0, 0x0008, 0x0035, 0x000b, 0x8b2e, 0x0000, 0x8072, - 0x0000, 0x8000, 0x000b, 0x04e5, 0x0009, 0xbbe0, 0x0008, 0x0036, - 0x000b, 0x0c06, 0x0009, 0xbbe0, 0x0000, 0x0037, 0x000b, 0x8b53, - 0x0000, 0x18fe, 0x0009, 0x3ce0, 0x000b, 0x8b1b, 0x0008, 0x8076, - 0x0000, 0x0040, 0x0000, 0x1a60, 0x0008, 0x8062, 0x0000, 0x000d, - 0x0009, 0xa6d0, 0x0008, 0x0000, 0x0008, 0x7f04, 0x0001, 0xa7d0, - 0x0008, 0x0000, 0x0000, 0x7f06, 0x0001, 0xa8d0, 0x0008, 0x0000, - 0x0008, 0x7f08, 0x0009, 0xa9d0, 0x0008, 0x0000, 0x0000, 0x7f0a, - 0x0000, 0x8066, 0x0000, 0x0422, 0x0003, 0xc34a, 0x000c, 0x037c, - 0x0008, 0x8054, 0x0000, 0x0004, 0x0000, 0x8074, 0x0008, 0xf000, - 0x0000, 0x8072, 0x0000, 0x8000, 0x0003, 0x02fc, 0x0009, 0xbbe0, - 0x0000, 0x0038, 0x000b, 0x8b65, 0x0000, 0x18fe, 0x0009, 0x3ce0, - 0x000b, 0x0b62, 0x0008, 0x15fe, 0x0009, 0x3ce0, 0x000b, 0x8b11, - 0x0004, 0x0377, 0x0008, 0x8076, 0x0000, 0x0040, 0x0000, 0x8072, - 0x0000, 0x8000, 0x0003, 0x03cd, 0x0008, 0x8076, 0x0008, 0x0042, - 0x000b, 0x0372, 0x0009, 0xbbe0, 0x0000, 0x0016, 0x000b, 0x8b72, - 0x0000, 0x8074, 0x0008, 0x0808, 0x0002, 0x3a44, 0x000b, 0x8818, - 0x0000, 0x8074, 0x0000, 0x0800, 0x0000, 0x8072, 0x0000, 0x8000, - 0x000f, 0x8000, 0x0003, 0x0013, 0x0000, 0x8072, 0x0000, 0x8000, - 0x0003, 0x0013, 0x0002, 0x1430, 0x000b, 0x0378, 0x000a, 0x3d30, - 0x0000, 0x7f00, 0x0001, 0xbc80, 0x0000, 0x0007, 0x0003, 0x0380, - 0x000a, 0x1930, 0x0000, 0x7f00, 0x0001, 0x9880, 0x0000, 0x0007, - 0x0000, 0x8060, 0x0000, 0x0400, 0x0008, 0x7f62, 0x0000, 0x8066, - 0x0008, 0x000a, 0x0003, 0xc385, 0x000f, 0x4000, 0x000b, 0x238a, - 0x0008, 0x0870, 0x000f, 0x4000, 0x0002, 0x7040, 0x0003, 0x0b87, - 0x000b, 0xe394, 0x0008, 0x808a, 0x0000, 0x0004, 0x0007, 0x0000, - 0x0007, 0x0000, 0x0008, 0x80e0, 0x0008, 0x0202, 0x000b, 0x638d, - 0x0008, 0x80e0, 0x0000, 0x0100, 0x000b, 0x0387, 0x0009, 0xbac0, - 0x0008, 0x0090, 0x000b, 0x0b9d, 0x0000, 0x8074, 0x0000, 0x0706, - 0x000b, 0x039f, 0x0000, 0x8074, 0x0000, 0x0703, 0x000f, 0x4000, - 0x0008, 0x8010, 0x0000, 0x0023, 0x000b, 0x03db, 0x0008, 0x8010, - 0x0000, 0x0008, 0x000b, 0x03db, 0x0008, 0x8010, 0x0008, 0x0022, - 0x000b, 0x03db, 0x000c, 0x037c, 0x0008, 0x8010, 0x0000, 0x0007, - 0x0004, 0x0387, 0x0000, 0x1810, 0x0004, 0x0387, 0x0003, 0x03e5, - 0x000c, 0x037c, 0x0008, 0x8010, 0x0008, 0x001b, 0x0004, 0x0387, - 0x0000, 0x1810, 0x0004, 0x0387, 0x0000, 0x8074, 0x0000, 0xf080, - 0x0000, 0x0d30, 0x0003, 0x0013, 0x0008, 0x8010, 0x0008, 0x0009, - 0x000b, 0x03db, 0x0008, 0x8010, 0x0008, 0x0005, 0x000b, 0x03db, - 0x000a, 0x1648, 0x0003, 0x888c, 0x0008, 0x808c, 0x0000, 0x0001, - 0x0007, 0x0000, 0x0008, 0x8010, 0x0000, 0x0004, 0x000a, 0x4143, - 0x000b, 0x088c, 0x0002, 0x3a44, 0x0003, 0x8813, 0x0008, 0x0d2a, - 0x000b, 0x03db, 0x0008, 0x8010, 0x0008, 0x0003, 0x000b, 0x03dd, - 0x0008, 0x8010, 0x0000, 0x000b, 0x000b, 0x03dd, 0x0008, 0x8010, - 0x0000, 0x0002, 0x000b, 0x03dd, 0x0002, 0x3a47, 0x000b, 0x8a8c, - 0x0008, 0x8010, 0x0008, 0x0006, 0x000b, 0x03dd, 0x0000, 0x8074, - 0x0008, 0xf000, 0x0004, 0x0387, 0x000c, 0x0397, 0x000a, 0x3a40, - 0x000b, 0x0813, 0x0008, 0x8010, 0x0008, 0x000c, 0x0004, 0x0387, - 0x0003, 0x0013, 0x0000, 0x8074, 0x0000, 0xf080, 0x0000, 0x0d30, - 0x0002, 0x2e4d, 0x0002, 0x2e4d, 0x0003, 0x0bee, 0x0008, 0x8054, - 0x0000, 0x0019, 0x0003, 0x0013, 0x0008, 0x8054, 0x0008, 0x0009, - 0x0003, 0x0013, 0x0002, 0x3a44, 0x0003, 0x8813, 0x0003, 0x03d0, - 0x0008, 0x808c, 0x0008, 0x0000, 0x0002, 0x4447, 0x0003, 0x0c1a, - 0x0001, 0xc0c0, 0x0008, 0x00ff, 0x0009, 0xffe0, 0x0008, 0x00ff, - 0x0003, 0x8bf1, 0x0001, 0xc1e0, 0x0008, 0xffff, 0x0003, 0x8bf1, - 0x0008, 0x8010, 0x0000, 0x0013, 0x0004, 0x0387, 0x0000, 0x8074, - 0x0008, 0x0202, 0x0003, 0x0013, 0x000a, 0x3a40, 0x0003, 0x8c17, - 0x0000, 0x8074, 0x0000, 0x0200, 0x0000, 0x3d00, 0x0000, 0x3cfe, - 0x0000, 0x8072, 0x0000, 0x8000, 0x0001, 0x43e0, 0x000b, 0x8c15, - 0x0000, 0x42fe, 0x0001, 0xffc0, 0x0008, 0x00ff, 0x0009, 0x00e0, - 0x000b, 0x0bf1, 0x0008, 0x0d08, 0x0003, 0x046a, 0x0000, 0x8072, - 0x0000, 0x8000, 0x0003, 0x0013, 0x000c, 0x04ee, 0x0008, 0x808c, - 0x0000, 0x0001, 0x0000, 0x04fc, 0x0003, 0x34d1, 0x0000, 0x0460, - 0x0008, 0x8062, 0x0000, 0x0001, 0x0000, 0x8066, 0x0008, 0x0009, - 0x0003, 0xc424, 0x0000, 0x0004, 0x0009, 0x80c0, 0x0008, 0x00ff, - 0x0000, 0x7f00, 0x0001, 0x80e0, 0x0000, 0x0004, 0x0003, 0x0c3e, - 0x0001, 0x80e0, 0x0008, 0x0005, 0x0003, 0x0c3e, 0x0001, 0x80e0, - 0x0008, 0x0006, 0x0003, 0x0c3e, 0x0001, 0x82c0, 0x0008, 0xff00, - 0x0008, 0x7f04, 0x0009, 0x82e0, 0x0008, 0x0600, 0x0003, 0x0c3e, - 0x0009, 0x82e0, 0x0008, 0x0500, 0x0003, 0x0c3e, 0x0009, 0x82e0, - 0x0000, 0x0400, 0x0003, 0x8cd1, 0x0009, 0xc4c0, 0x0000, 0x7000, - 0x0009, 0xffe0, 0x0000, 0x1000, 0x000b, 0x0c6a, 0x0004, 0x04df, - 0x0002, 0x3941, 0x0003, 0x0c49, 0x0000, 0x8072, 0x0000, 0x0400, - 0x0003, 0x0013, 0x0000, 0x0460, 0x0008, 0x80fe, 0x0008, 0x002b, - 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x2209, 0x000b, 0xc44f, - 0x0008, 0x11fc, 0x0003, 0x3465, 0x0001, 0x9180, 0x0000, 0x0002, - 0x0000, 0x8060, 0x0000, 0x0400, 0x0008, 0x7f62, 0x0000, 0x8066, - 0x0008, 0x0609, 0x0003, 0xc459, 0x0000, 0x42fe, 0x0001, 0xffc0, - 0x0008, 0xff00, 0x0009, 0x03e0, 0x000b, 0x8c62, 0x0000, 0x8072, - 0x0000, 0x0400, 0x000b, 0x0056, 0x0001, 0x9180, 0x0008, 0x0003, - 0x000b, 0x044c, 0x0000, 0x8072, 0x0000, 0x0400, 0x0008, 0x8010, - 0x0000, 0x0010, 0x000b, 0x04c4, 0x0004, 0x04df, 0x0002, 0x3941, - 0x0003, 0x0c70, 0x0000, 0x8072, 0x0000, 0x0400, 0x0003, 0x0013, - 0x000a, 0x6e42, 0x0003, 0x0c75, 0x000c, 0x04a9, 0x0008, 0x11fc, - 0x0003, 0xb47a, 0x0000, 0x8072, 0x0000, 0x0400, 0x0008, 0x8010, - 0x0000, 0x000e, 0x000b, 0x04c4, 0x0000, 0x8060, 0x0000, 0x0400, - 0x0000, 0x04fc, 0x0003, 0xb48f, 0x0008, 0x808c, 0x0008, 0x0000, - 0x0001, 0x9180, 0x0008, 0x0005, 0x0008, 0x7f62, 0x0000, 0x8066, - 0x0008, 0x0009, 0x000b, 0xc485, 0x0008, 0x0060, 0x0008, 0x8062, - 0x0008, 0x001b, 0x0008, 0x4304, 0x0008, 0x4206, 0x0000, 0x8066, - 0x0000, 0x0412, 0x0003, 0xc48d, 0x0003, 0x04a6, 0x0008, 0x808c, - 0x0000, 0x0001, 0x0000, 0x0460, 0x0008, 0x8062, 0x0008, 0x002b, - 0x0000, 0x8066, 0x0008, 0x0609, 0x0003, 0xc496, 0x0000, 0x8066, - 0x0008, 0x220a, 0x0003, 0xc499, 0x0000, 0x42fe, 0x0001, 0xffc0, - 0x0008, 0xff00, 0x0008, 0x7f04, 0x0000, 0x8060, 0x0000, 0x0400, - 0x0001, 0x9180, 0x0000, 0x0002, 0x0008, 0x7f62, 0x0000, 0x8066, - 0x0008, 0x041a, 0x0003, 0xc4a5, 0x0000, 0x8072, 0x0000, 0x0400, - 0x000b, 0x0056, 0x0000, 0x8060, 0x0000, 0x0400, 0x0008, 0x6b62, - 0x0000, 0x8066, 0x0000, 0x0411, 0x000b, 0xc4ae, 0x0008, 0x02fe, - 0x0009, 0x03e0, 0x0003, 0x8cb4, 0x0000, 0x0d22, 0x000f, 0x4000, - 0x0009, 0x8280, 0x0000, 0x0002, 0x0001, 0x6b80, 0x0008, 0x7f62, - 0x0000, 0x8066, 0x0008, 0x2209, 0x000b, 0xc4ba, 0x000a, 0x0200, - 0x0001, 0xffc0, 0x0000, 0x0007, 0x0000, 0x7f06, 0x0008, 0x6b62, - 0x0000, 0x8066, 0x0008, 0x060a, 0x000b, 0xc4c2, 0x000f, 0x4000, - 0x0002, 0x3a44, 0x0003, 0x8813, 0x000a, 0x2f44, 0x000a, 0x2f44, - 0x0003, 0x8bd0, 0x0008, 0x808a, 0x0008, 0x0003, 0x0000, 0x8074, - 0x0000, 0xf080, 0x0003, 0x5ccd, 0x0008, 0x8054, 0x0000, 0x0019, - 0x0003, 0x0013, 0x0002, 0x3a44, 0x0003, 0x8813, 0x0008, 0x808c, - 0x0008, 0x0000, 0x0008, 0x8010, 0x0008, 0x0011, 0x0004, 0x0387, - 0x0000, 0x42fe, 0x0001, 0xffc0, 0x0008, 0x00ff, 0x0008, 0x7f10, - 0x0004, 0x0387, 0x0008, 0x4310, 0x000b, 0x03dd, 0x0002, 0x3941, - 0x000b, 0x0ce2, 0x000f, 0x4000, 0x0000, 0x8072, 0x0008, 0x0404, - 0x000f, 0x4000, 0x0008, 0x8010, 0x0008, 0x0012, 0x0004, 0x0387, - 0x000c, 0x04a9, 0x0000, 0x1110, 0x0004, 0x0387, 0x0008, 0x11fc, - 0x000b, 0xb4e8, 0x0003, 0x0013, 0x0009, 0xc2c0, 0x0008, 0x00ff, - 0x0000, 0x7f00, 0x0001, 0xc3c0, 0x0008, 0xff00, 0x0009, 0x00d0, - 0x000b, 0x0d13, 0x0000, 0x0d0a, 0x0001, 0x8580, 0x0000, 0x1000, - 0x0008, 0x7f62, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x8066, - 0x0000, 0x0809, 0x000b, 0xc4fd, 0x0000, 0x04fc, 0x000b, 0x350c, - 0x0000, 0x0460, 0x0008, 0x8062, 0x0000, 0x0004, 0x0000, 0x8066, - 0x0000, 0x0211, 0x000b, 0xc505, 0x0008, 0x01fe, 0x0009, 0x00e0, - 0x000b, 0x8d0c, 0x0008, 0x02fe, 0x0001, 0x43e0, 0x0003, 0x0d12, - 0x0002, 0x0500, 0x0000, 0x7f0a, 0x0009, 0xffe0, 0x0000, 0x0800, - 0x0003, 0x8cf6, 0x0008, 0x0d08, 0x000f, 0x4000, 0x0008, 0x43fe, - 0x0001, 0x3e80, 0x0000, 0x0d60, 0x0008, 0x7f62, 0x0000, 0x8066, - 0x0000, 0x0809, 0x0003, 0xc519, 0x0000, 0x8060, 0x0000, 0x0400, - 0x0001, 0x84c0, 0x0008, 0xff00, 0x0002, 0x7f70, 0x0009, 0xff80, - 0x0000, 0x1000, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0000, 0x0809, - 0x000b, 0xc524, 0x000f, 0x4000, 0xe4a8, 0xa3b9 +#include + +static u8 ql2322_fw_bin[] = { + 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x19, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x03, 0x00, 0x14, 0x01, 0x37, 0x20, 0x43, 0x4f, 0x50, 0x59, 0x52, + 0x49, 0x47, 0x48, 0x54, 0x20, 0x32, 0x30, 0x30, 0x31, 0x20, 0x51, 0x4c, + 0x4f, 0x47, 0x49, 0x43, 0x20, 0x43, 0x4f, 0x52, 0x50, 0x4f, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x20, 0x49, 0x53, 0x50, 0x32, 0x33, 0x30, 0x30, + 0x20, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x20, 0x20, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x30, 0x33, 0x2e, 0x30, 0x33, + 0x2e, 0x32, 0x30, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x00, 0x20, 0xa9, + 0x00, 0x0f, 0x20, 0x01, 0x00, 0x00, 0x40, 0x0f, 0x20, 0x91, 0x22, 0x00, + 0x20, 0xa9, 0x00, 0x0f, 0x20, 0x01, 0x00, 0x00, 0x40, 0x0f, 0x20, 0x91, + 0x24, 0x00, 0x20, 0xa9, 0x00, 0x0f, 0x20, 0x01, 0x00, 0x00, 0x40, 0x0f, + 0x20, 0x91, 0x26, 0x00, 0x20, 0xa9, 0x00, 0x0f, 0x20, 0x01, 0x00, 0x00, + 0x40, 0x0f, 0x20, 0x91, 0x28, 0x00, 0x20, 0xa9, 0x00, 0x0f, 0x20, 0x01, + 0x00, 0x00, 0x40, 0x0f, 0x20, 0x91, 0x2a, 0x00, 0x20, 0xa9, 0x00, 0x0f, + 0x20, 0x01, 0x00, 0x00, 0x40, 0x0f, 0x20, 0x91, 0x2c, 0x00, 0x20, 0xa9, + 0x00, 0x0f, 0x20, 0x01, 0x00, 0x00, 0x40, 0x0f, 0x20, 0x91, 0x2e, 0x00, + 0x20, 0xa9, 0x00, 0x0f, 0x20, 0x01, 0x00, 0x00, 0x40, 0x0f, 0x20, 0x91, + 0x20, 0x00, 0x20, 0x01, 0x00, 0x00, 0x20, 0xc1, 0x00, 0x04, 0x20, 0xc9, + 0x1c, 0xff, 0x20, 0x59, 0x00, 0x00, 0x2b, 0x78, 0x78, 0x83, 0x00, 0x04, + 0x20, 0x89, 0x2b, 0xc2, 0x20, 0x51, 0x18, 0x00, 0x2a, 0x70, 0x20, 0xe1, + 0x00, 0x01, 0x20, 0xe9, 0x00, 0x01, 0x20, 0x09, 0x00, 0x00, 0x08, 0x0c, + 0x0e, 0x74, 0x00, 0xf6, 0x78, 0x88, 0x90, 0x05, 0x11, 0xf8, 0x20, 0x61, + 0xc0, 0x00, 0x08, 0x0c, 0x20, 0xc6, 0x11, 0x70, 0x20, 0x79, 0x03, 0x00, + 0x08, 0x0c, 0x20, 0xdc, 0x20, 0x61, 0xe0, 0x00, 0x08, 0x0c, 0x20, 0xc6, + 0x11, 0x28, 0x20, 0x79, 0x03, 0x80, 0x08, 0x0c, 0x20, 0xdc, 0x00, 0x60, + 0x00, 0xfe, 0x78, 0x83, 0x40, 0x10, 0x78, 0x37, 0x40, 0x10, 0x78, 0x33, + 0x00, 0x11, 0x20, 0x91, 0x50, 0x00, 0x20, 0x91, 0x40, 0x80, 0x0c, 0xf8, + 0x00, 0xfe, 0x20, 0x29, 0x56, 0x00, 0x20, 0x31, 0xff, 0xff, 0x20, 0x39, + 0x55, 0xdc, 0x20, 0x21, 0x02, 0x00, 0x20, 0xe9, 0x00, 0x01, 0x20, 0xa1, + 0x00, 0x00, 0x20, 0xa9, 0x08, 0x00, 0x90, 0x0e, 0x41, 0x04, 0x20, 0xe9, + 0x00, 0x01, 0x20, 0xa1, 0x10, 0x00, 0x90, 0x0e, 0x20, 0x01, 0x0d, 0xc1, + 0x90, 0x84, 0x0f, 0xff, 0x20, 0xa8, 0x41, 0x04, 0x20, 0x01, 0x00, 0x00, + 0x90, 0x86, 0x00, 0x00, 0x01, 0x20, 0x21, 0xa8, 0x41, 0x04, 0x80, 0x01, + 0x1d, 0xe0, 0x75, 0x6e, 0x76, 0x72, 0x77, 0x6a, 0x74, 0x76, 0x74, 0x7a, + 0x00, 0xe6, 0x20, 0x71, 0x1b, 0x73, 0x24, 0x72, 0x00, 0xee, 0x20, 0xa1, + 0x1d, 0xdc, 0x71, 0x70, 0x81, 0x0d, 0x81, 0x0d, 0x81, 0x0d, 0x81, 0x0d, + 0x91, 0x8c, 0x00, 0x0f, 0x20, 0x01, 0x00, 0x01, 0x91, 0x12, 0x90, 0x0e, + 0x21, 0xa8, 0x41, 0x04, 0x82, 0x11, 0x1d, 0xe0, 0x71, 0x70, 0x34, 0x00, + 0x80, 0x01, 0x91, 0x02, 0x01, 0x20, 0x02, 0x18, 0x20, 0xa8, 0x90, 0x0e, + 0x41, 0x04, 0x20, 0x09, 0x18, 0x00, 0x81, 0x0d, 0x81, 0x0d, 0x81, 0x0d, + 0x81, 0x0d, 0x81, 0x0d, 0x91, 0x8c, 0x00, 0x1f, 0x20, 0x01, 0x00, 0x01, + 0x91, 0x12, 0x20, 0xe9, 0x00, 0x01, 0x20, 0xa1, 0x08, 0x00, 0x90, 0x0e, + 0x20, 0xa9, 0x08, 0x00, 0x41, 0x04, 0x82, 0x11, 0x1d, 0xd8, 0x08, 0x0c, + 0x0f, 0x71, 0x08, 0x0c, 0x61, 0xab, 0x08, 0x0c, 0xb1, 0x02, 0x08, 0x0c, + 0x11, 0x28, 0x08, 0x0c, 0x13, 0x52, 0x08, 0x0c, 0x1c, 0x1c, 0x08, 0x0c, + 0x95, 0x82, 0x08, 0x0c, 0x0d, 0x17, 0x08, 0x0c, 0x10, 0xad, 0x08, 0x0c, + 0x35, 0x8e, 0x08, 0x0c, 0x7a, 0xca, 0x08, 0x0c, 0x6c, 0xea, 0x08, 0x0c, + 0x8c, 0x5d, 0x08, 0x0c, 0x88, 0xbe, 0x08, 0x0c, 0x22, 0xbf, 0x08, 0x0c, + 0x81, 0xf5, 0x08, 0x0c, 0x20, 0xf5, 0x08, 0x0c, 0x22, 0x33, 0x08, 0x0c, + 0x22, 0xb4, 0x20, 0x91, 0x30, 0x09, 0x78, 0x83, 0x00, 0x00, 0x10, 0x04, + 0x09, 0x43, 0x78, 0x80, 0x90, 0x86, 0x00, 0x02, 0x11, 0x90, 0x78, 0x83, + 0x40, 0x00, 0x78, 0x37, 0x40, 0x00, 0x78, 0x33, 0x00, 0x10, 0x0e, 0x04, + 0x09, 0x37, 0x20, 0x91, 0x50, 0x00, 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, + 0x00, 0x89, 0x20, 0x04, 0xd0, 0x84, 0x19, 0x0c, 0x12, 0x00, 0x20, 0x71, + 0x18, 0x00, 0x70, 0x03, 0x00, 0x00, 0x78, 0x0c, 0x90, 0x84, 0x00, 0x30, + 0x90, 0x86, 0x00, 0x20, 0x11, 0x68, 0x70, 0x34, 0xc0, 0x8d, 0x70, 0x36, + 0x20, 0x01, 0x00, 0x50, 0x70, 0x76, 0x70, 0x7a, 0x70, 0x56, 0x60, 0x6b, + 0x26, 0x9c, 0x20, 0x71, 0x1b, 0x73, 0x20, 0x72, 0x20, 0x71, 0x18, 0x00, + 0x70, 0x00, 0x90, 0x8e, 0x00, 0x03, 0x11, 0x68, 0x08, 0x0c, 0x4d, 0x66, + 0x08, 0x0c, 0x35, 0xb5, 0x08, 0x0c, 0x7b, 0x32, 0x08, 0x0c, 0x72, 0x75, + 0x08, 0x0c, 0x8d, 0x44, 0x08, 0x0c, 0x88, 0xe7, 0x0c, 0x68, 0x00, 0x0b, + 0x0c, 0x88, 0x09, 0x79, 0x09, 0x7a, 0x0b, 0x15, 0x09, 0x77, 0x0b, 0xcf, + 0x0d, 0x16, 0x0d, 0x16, 0x0d, 0x16, 0x08, 0x0c, 0x0d, 0x85, 0x00, 0x05, + 0x01, 0x26, 0x00, 0xf6, 0x20, 0x91, 0x80, 0x00, 0x70, 0x00, 0x90, 0x86, + 0x00, 0x01, 0x19, 0x04, 0x0a, 0xe8, 0x08, 0x0c, 0x0e, 0xc4, 0x08, 0x0c, + 0x77, 0x9e, 0x01, 0x50, 0x08, 0x0c, 0x77, 0xc1, 0x15, 0xb0, 0x20, 0x79, + 0x01, 0x00, 0x78, 0x28, 0x90, 0x85, 0x18, 0x00, 0x78, 0x2a, 0x04, 0x78, + 0x08, 0x0c, 0x76, 0xcd, 0x70, 0x00, 0x90, 0x86, 0x00, 0x01, 0x19, 0x04, + 0x0a, 0xe8, 0x70, 0x98, 0x90, 0x86, 0x00, 0x29, 0x19, 0x04, 0x0a, 0xe8, + 0x08, 0x0c, 0x88, 0xa7, 0x08, 0x0c, 0x88, 0x99, 0x20, 0x01, 0x01, 0x61, + 0x20, 0x03, 0x00, 0x01, 0x20, 0x79, 0x01, 0x00, 0x20, 0x11, 0xff, 0xff, + 0x08, 0x0c, 0x2a, 0xd3, 0x7a, 0x28, 0x92, 0x95, 0x5e, 0x2c, 0x7a, 0x2a, + 0x20, 0x11, 0x76, 0x12, 0x08, 0x0c, 0x89, 0x93, 0x20, 0x11, 0x76, 0x05, + 0x08, 0x0c, 0x8a, 0x9f, 0x20, 0x11, 0x60, 0x02, 0x08, 0x0c, 0x89, 0x93, + 0x20, 0x11, 0x80, 0x30, 0x90, 0x1e, 0x73, 0x96, 0x04, 0xd0, 0x08, 0x0c, + 0x58, 0xaa, 0x20, 0x79, 0x01, 0x00, 0x78, 0x44, 0x90, 0x05, 0x19, 0x04, + 0x0a, 0xe8, 0x20, 0x11, 0x60, 0x02, 0x08, 0x0c, 0x89, 0x93, 0x20, 0x11, + 0x76, 0x12, 0x08, 0x0c, 0x89, 0x93, 0x20, 0x11, 0x76, 0x05, 0x08, 0x0c, + 0x8a, 0x9f, 0x20, 0x01, 0x02, 0x65, 0x20, 0x01, 0x02, 0x05, 0x20, 0x03, + 0x00, 0x00, 0x78, 0x40, 0x90, 0x84, 0xff, 0xfb, 0x78, 0x42, 0x20, 0x01, + 0x19, 0xa7, 0x20, 0x04, 0x90, 0x05, 0x11, 0x40, 0x00, 0xc6, 0x20, 0x61, + 0x01, 0x00, 0x08, 0x0c, 0x61, 0x53, 0x00, 0xce, 0x08, 0x04, 0x0a, 0xe8, + 0x78, 0x0f, 0x00, 0x6b, 0x7a, 0x28, 0x08, 0x0c, 0x77, 0xa6, 0x01, 0x18, + 0x92, 0x95, 0x5e, 0x2c, 0x00, 0x10, 0x92, 0x95, 0x40, 0x2c, 0x7a, 0x2a, + 0x20, 0x11, 0x80, 0x10, 0x73, 0xd8, 0x20, 0x01, 0x19, 0xa8, 0x20, 0x03, + 0x00, 0x01, 0x08, 0x0c, 0x29, 0x9b, 0x08, 0x0c, 0x4c, 0xa1, 0x72, 0x48, + 0xc2, 0x84, 0x72, 0x4a, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x0c, 0xc1, 0xac, + 0xc1, 0xcc, 0x21, 0x02, 0x20, 0x01, 0x03, 0x90, 0x20, 0x03, 0x04, 0x00, + 0x08, 0x0c, 0xac, 0xfc, 0x08, 0x0c, 0xa4, 0xf1, 0x20, 0x11, 0x00, 0x04, + 0x08, 0x0c, 0xcf, 0x2b, 0x08, 0x0c, 0xad, 0x18, 0x08, 0x0c, 0x6a, 0xb1, + 0x08, 0x0c, 0x77, 0x9e, 0x11, 0x20, 0x08, 0x0c, 0x29, 0xfc, 0x06, 0x00, + 0x04, 0x20, 0x08, 0x0c, 0x61, 0x5a, 0x01, 0x40, 0x70, 0x97, 0x00, 0x01, + 0x70, 0xd3, 0x00, 0x00, 0x08, 0x0c, 0x5a, 0x7c, 0x08, 0x04, 0x0a, 0xe8, + 0x20, 0x01, 0x03, 0x90, 0x20, 0x03, 0x04, 0x04, 0x08, 0x0c, 0x58, 0x40, + 0xd0, 0x94, 0x01, 0x88, 0x20, 0x11, 0x18, 0x0c, 0x22, 0x04, 0xc0, 0xcd, + 0x20, 0x12, 0x08, 0x0c, 0x58, 0x44, 0xd0, 0xd4, 0x11, 0x18, 0x08, 0x0c, + 0x29, 0xfc, 0x12, 0x70, 0x20, 0x11, 0x18, 0x0c, 0x22, 0x04, 0xc0, 0xbc, + 0x00, 0xa8, 0x08, 0x0c, 0x58, 0x44, 0xd0, 0xd4, 0x1d, 0xb8, 0x20, 0x11, + 0x18, 0x0c, 0x22, 0x04, 0xc0, 0xbd, 0x00, 0x60, 0x20, 0x11, 0x18, 0x0c, + 0x22, 0x04, 0xc0, 0xbd, 0x20, 0x12, 0x08, 0x0c, 0x6c, 0x09, 0x11, 0x28, + 0xd0, 0xa4, 0x01, 0x18, 0x22, 0x04, 0xc0, 0xfd, 0x20, 0x12, 0x08, 0x0c, + 0x6b, 0xcf, 0x01, 0x20, 0x7a, 0x0c, 0xc2, 0xb4, 0x7a, 0x0e, 0x00, 0xa8, + 0x70, 0x7f, 0x00, 0x00, 0x08, 0x0c, 0x77, 0x9e, 0x11, 0x30, 0x70, 0xb0, + 0x90, 0x05, 0x11, 0x68, 0x08, 0x0c, 0xd3, 0x89, 0x00, 0x50, 0x08, 0x0c, + 0xd3, 0x89, 0x70, 0xdc, 0xd0, 0x9c, 0x11, 0x28, 0x70, 0xb0, 0x90, 0x05, + 0x01, 0x10, 0x08, 0x0c, 0x61, 0x30, 0x70, 0xe7, 0x00, 0x00, 0x70, 0xe3, + 0x00, 0x00, 0x70, 0xa7, 0x00, 0x00, 0x08, 0x0c, 0x2a, 0x04, 0x02, 0x28, + 0x20, 0x11, 0x01, 0x01, 0x22, 0x04, 0xc0, 0xc4, 0x20, 0x12, 0x72, 0xdc, + 0x08, 0x0c, 0x77, 0x9e, 0x11, 0x78, 0x90, 0x16, 0x00, 0x16, 0x08, 0x0c, + 0x27, 0xa4, 0x20, 0x19, 0x19, 0x6d, 0x21, 0x1a, 0x00, 0x1e, 0x70, 0x5f, + 0xff, 0xff, 0x70, 0x63, 0x00, 0xef, 0x70, 0x83, 0x00, 0x00, 0x00, 0x20, + 0x20, 0x19, 0x19, 0x6d, 0x20, 0x1b, 0x00, 0x00, 0x20, 0x79, 0x18, 0x47, + 0x78, 0x04, 0xd0, 0xac, 0x01, 0x08, 0xc2, 0x95, 0x72, 0xde, 0x08, 0x0c, + 0x77, 0x9e, 0x01, 0x18, 0x92, 0x96, 0x00, 0x04, 0x05, 0x18, 0x20, 0x11, + 0x00, 0x01, 0x08, 0x0c, 0xcf, 0x2b, 0x70, 0xab, 0x00, 0x00, 0x70, 0xaf, + 0xff, 0xff, 0x70, 0x03, 0x00, 0x02, 0x00, 0xfe, 0x08, 0x0c, 0x30, 0xbf, + 0x08, 0x0c, 0xac, 0xfc, 0x20, 0x11, 0x00, 0x05, 0x08, 0x0c, 0xa6, 0x2b, + 0x08, 0x0c, 0xad, 0x18, 0x08, 0x0c, 0x77, 0x9e, 0x01, 0x48, 0x00, 0xc6, + 0x20, 0x61, 0x01, 0x00, 0x00, 0x16, 0x08, 0x0c, 0x27, 0xa4, 0x61, 0xe2, + 0x00, 0x1e, 0x00, 0xce, 0x01, 0x2e, 0x00, 0xe0, 0x70, 0xab, 0x00, 0x00, + 0x70, 0xaf, 0xff, 0xff, 0x70, 0x03, 0x00, 0x02, 0x08, 0x0c, 0xac, 0xfc, + 0x20, 0x11, 0x00, 0x05, 0x08, 0x0c, 0xa6, 0x2b, 0x08, 0x0c, 0xad, 0x18, + 0x08, 0x0c, 0x77, 0x9e, 0x01, 0x48, 0x00, 0xc6, 0x20, 0x61, 0x01, 0x00, + 0x00, 0x16, 0x08, 0x0c, 0x27, 0xa4, 0x61, 0xe2, 0x00, 0x1e, 0x00, 0xce, + 0x00, 0xfe, 0x01, 0x2e, 0x00, 0x05, 0x00, 0xc6, 0x00, 0xb6, 0x08, 0x0c, + 0x77, 0x9e, 0x11, 0x18, 0x20, 0xa9, 0x08, 0x00, 0x00, 0x10, 0x20, 0xa9, + 0x07, 0x82, 0x08, 0x0c, 0x77, 0x9e, 0x11, 0x10, 0x90, 0x0e, 0x00, 0x10, + 0x20, 0x09, 0x00, 0x7e, 0x86, 0xff, 0x01, 0x38, 0x91, 0x80, 0x10, 0x00, + 0x20, 0x04, 0x90, 0x5d, 0x01, 0x10, 0xb8, 0x00, 0xd0, 0xbc, 0x09, 0x0c, + 0x34, 0x1e, 0x81, 0x08, 0x1f, 0x04, 0x0a, 0xfc, 0x70, 0x7f, 0x00, 0x00, + 0x70, 0x80, 0x90, 0x84, 0x00, 0xff, 0x70, 0x82, 0x70, 0xb3, 0x00, 0x00, + 0x00, 0xbe, 0x00, 0xce, 0x00, 0x05, 0x00, 0xb6, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x70, 0x00, 0x90, 0x86, 0x00, 0x02, 0x19, 0x04, 0x0b, 0xcc, + 0x70, 0xac, 0x90, 0x86, 0xff, 0xff, 0x01, 0x20, 0x08, 0x0c, 0x30, 0xbf, + 0x08, 0x04, 0x0b, 0xcc, 0x70, 0xdc, 0xd0, 0xac, 0x11, 0x10, 0xd0, 0x9c, + 0x05, 0x38, 0xd0, 0x84, 0x05, 0x28, 0x00, 0x06, 0x20, 0x01, 0x01, 0x03, + 0x20, 0x03, 0x00, 0x2b, 0x00, 0x0e, 0xd0, 0x8c, 0x01, 0xe8, 0x08, 0x0c, + 0x34, 0x87, 0x11, 0xb0, 0x70, 0xe0, 0x90, 0x86, 0xff, 0xff, 0x01, 0x90, + 0x08, 0x0c, 0x32, 0x7b, 0x70, 0xdc, 0xd0, 0x94, 0x19, 0x04, 0x0b, 0xcc, + 0x20, 0x11, 0x00, 0x01, 0x08, 0x0c, 0xd6, 0x45, 0x01, 0x10, 0x20, 0x11, + 0x00, 0x03, 0x90, 0x1e, 0x08, 0x0c, 0x32, 0xb5, 0x08, 0x04, 0x0b, 0xcc, + 0x70, 0xe4, 0x90, 0x05, 0x19, 0x04, 0x0b, 0xcc, 0x70, 0xa8, 0x90, 0x05, + 0x19, 0x04, 0x0b, 0xcc, 0x70, 0xdc, 0xd0, 0xa4, 0x01, 0x18, 0xd0, 0xb4, + 0x09, 0x04, 0x0b, 0xcc, 0x08, 0x0c, 0x6b, 0xcf, 0x19, 0x04, 0x0b, 0xcc, + 0x08, 0x0c, 0x6c, 0x22, 0x19, 0x04, 0x0b, 0xcc, 0x08, 0x0c, 0x6c, 0x09, + 0x01, 0xc0, 0x01, 0x56, 0x00, 0xc6, 0x20, 0xa9, 0x00, 0x7f, 0x90, 0x0e, + 0x00, 0x16, 0x08, 0x0c, 0x67, 0xb4, 0x11, 0x18, 0xb8, 0x00, 0xd0, 0xec, + 0x11, 0x38, 0x00, 0x1e, 0x81, 0x08, 0x1f, 0x04, 0x0b, 0x6c, 0x00, 0xce, + 0x01, 0x5e, 0x00, 0x28, 0x00, 0x1e, 0x00, 0xce, 0x01, 0x5e, 0x08, 0x04, + 0x0b, 0xcc, 0x00, 0x06, 0x20, 0x01, 0x01, 0x03, 0x20, 0x03, 0x00, 0x2b, + 0x00, 0x0e, 0x20, 0x11, 0x19, 0xb4, 0x08, 0x0c, 0x0f, 0xe1, 0x20, 0x11, + 0x19, 0xce, 0x08, 0x0c, 0x0f, 0xe1, 0x70, 0x30, 0xc0, 0x8c, 0x70, 0x32, + 0x70, 0x03, 0x00, 0x03, 0x70, 0xaf, 0xff, 0xff, 0x08, 0x0c, 0x0e, 0x98, + 0x90, 0x06, 0x08, 0x0c, 0x26, 0x31, 0x08, 0x0c, 0x34, 0x87, 0x01, 0x18, + 0x08, 0x0c, 0x4e, 0x3e, 0x00, 0x50, 0x00, 0x36, 0x00, 0x46, 0x20, 0x19, + 0xff, 0xff, 0x20, 0x21, 0x00, 0x06, 0x08, 0x0c, 0x4e, 0x58, 0x00, 0x4e, + 0x00, 0x3e, 0x00, 0xf6, 0x20, 0x79, 0x01, 0x00, 0x08, 0x0c, 0x77, 0xc1, + 0x01, 0x50, 0x08, 0x0c, 0x77, 0x9e, 0x78, 0x28, 0x01, 0x18, 0x90, 0x84, + 0xe1, 0xff, 0x00, 0x10, 0x90, 0x84, 0xff, 0xdf, 0x78, 0x2a, 0x00, 0xfe, + 0x08, 0x0c, 0xac, 0xfc, 0x20, 0x01, 0x19, 0xe9, 0x20, 0x04, 0x90, 0x86, + 0x00, 0x05, 0x11, 0x20, 0x20, 0x11, 0x00, 0x00, 0x08, 0x0c, 0xa6, 0x2b, + 0x20, 0x11, 0x00, 0x00, 0x08, 0x0c, 0xa6, 0x35, 0x08, 0x0c, 0xad, 0x18, + 0x01, 0x2e, 0x00, 0xbe, 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, 0x00, 0x46, + 0x00, 0xf6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x79, 0x01, 0x00, + 0x79, 0x04, 0x91, 0x8c, 0xff, 0xfd, 0x79, 0x06, 0x20, 0x09, 0x00, 0xf7, + 0x08, 0x0c, 0x61, 0x19, 0x79, 0x40, 0x91, 0x8c, 0x00, 0x10, 0x79, 0x42, + 0x79, 0x24, 0xd1, 0xb4, 0x01, 0x20, 0x20, 0x11, 0x00, 0x40, 0x08, 0x0c, + 0x2a, 0xd3, 0xd1, 0x9c, 0x01, 0x20, 0x20, 0x11, 0x00, 0x08, 0x08, 0x0c, + 0x2a, 0xd3, 0x00, 0x06, 0x00, 0x36, 0x01, 0x56, 0x00, 0x00, 0x20, 0x01, + 0x19, 0xa8, 0x20, 0x04, 0x90, 0x05, 0x15, 0x18, 0x08, 0x0c, 0x2a, 0x67, + 0x11, 0x48, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x29, 0xca, 0x20, 0x01, + 0x00, 0x01, 0x08, 0x0c, 0x29, 0xad, 0x00, 0xb8, 0x08, 0x0c, 0x2a, 0x6f, + 0x11, 0x38, 0x90, 0x06, 0x08, 0x0c, 0x29, 0xca, 0x90, 0x06, 0x08, 0x0c, + 0x29, 0xad, 0x00, 0x68, 0x08, 0x0c, 0x2a, 0x77, 0x1d, 0x50, 0x20, 0x01, + 0x19, 0x98, 0x20, 0x04, 0xd0, 0xfc, 0x01, 0x08, 0x00, 0x20, 0x08, 0x0c, + 0x27, 0xd8, 0x08, 0x04, 0x0c, 0xc9, 0x20, 0xa9, 0x00, 0x3a, 0x1d, 0x04, + 0x0c, 0x1f, 0x08, 0x0c, 0x8a, 0x7f, 0x1f, 0x04, 0x0c, 0x1f, 0x08, 0x0c, + 0x77, 0xaf, 0x01, 0x48, 0x08, 0x0c, 0x77, 0xc1, 0x11, 0x18, 0x08, 0x0c, + 0x7a, 0xc5, 0x00, 0x50, 0x08, 0x0c, 0x77, 0xa6, 0x0d, 0xd0, 0x08, 0x0c, + 0x7a, 0xc0, 0x08, 0x0c, 0x7a, 0xb6, 0x08, 0x0c, 0x76, 0xcd, 0x00, 0x20, + 0x20, 0x09, 0x00, 0xf8, 0x08, 0x0c, 0x61, 0x19, 0x78, 0x50, 0xc0, 0xe5, + 0x78, 0x52, 0x08, 0x0c, 0x77, 0x9e, 0x01, 0x20, 0x78, 0x43, 0x00, 0x90, + 0x78, 0x43, 0x00, 0x10, 0x20, 0x21, 0xe6, 0x78, 0x20, 0x19, 0xea, 0x60, + 0x0d, 0x0c, 0x8a, 0x7f, 0x78, 0x20, 0xd0, 0x9c, 0x15, 0xa0, 0x08, 0x0c, + 0x77, 0x9e, 0x09, 0x04, 0x0c, 0xab, 0x78, 0x24, 0xd0, 0xac, 0x19, 0x04, + 0x0c, 0xce, 0x08, 0x0c, 0x77, 0xc1, 0x15, 0x48, 0x00, 0x46, 0x20, 0x21, + 0x03, 0x20, 0x84, 0x21, 0x1d, 0xf0, 0x00, 0x4e, 0x20, 0x11, 0x18, 0x00, + 0x08, 0x0c, 0x2a, 0xd3, 0x08, 0x0c, 0x2a, 0x7f, 0x78, 0x24, 0x90, 0x84, + 0x18, 0x00, 0x11, 0x68, 0x94, 0x84, 0x0f, 0xff, 0x11, 0x40, 0x20, 0x01, + 0x18, 0x10, 0x20, 0x04, 0x90, 0x84, 0x90, 0x00, 0x01, 0x10, 0x08, 0x0c, + 0x0c, 0xf1, 0x84, 0x21, 0x11, 0x60, 0x1d, 0x04, 0x0c, 0x7b, 0x08, 0x0c, + 0x8a, 0x7f, 0x08, 0x0c, 0x7a, 0xc0, 0x08, 0x0c, 0x7a, 0xb6, 0x70, 0x03, + 0x00, 0x01, 0x08, 0x04, 0x0c, 0xce, 0x83, 0x19, 0x19, 0x28, 0x20, 0x01, + 0x18, 0x10, 0x20, 0x04, 0x90, 0x84, 0x90, 0x00, 0x01, 0x10, 0x08, 0x0c, + 0x0c, 0xf1, 0x1d, 0x04, 0x0c, 0x91, 0x08, 0x0c, 0x8a, 0x7f, 0x20, 0x09, + 0x19, 0x9b, 0x21, 0x04, 0x90, 0x05, 0x01, 0x18, 0x80, 0x01, 0x20, 0x0a, + 0x11, 0x88, 0x20, 0x0b, 0x00, 0x0a, 0x20, 0x11, 0x00, 0x48, 0x08, 0x0c, + 0x2a, 0xd3, 0x20, 0xa9, 0x00, 0x02, 0x08, 0x0c, 0x2a, 0x60, 0x79, 0x24, + 0x08, 0x0c, 0x2a, 0x7f, 0xd1, 0x9c, 0x01, 0x10, 0x08, 0x0c, 0x29, 0x9b, + 0x00, 0xf0, 0x08, 0x0c, 0x77, 0xaf, 0x11, 0x40, 0x94, 0xa2, 0x03, 0xe8, + 0x11, 0x28, 0x08, 0x0c, 0x77, 0x72, 0x70, 0x03, 0x00, 0x01, 0x00, 0xc0, + 0x20, 0x11, 0x18, 0x00, 0x08, 0x0c, 0x2a, 0xd3, 0x08, 0x0c, 0x2a, 0x7f, + 0x78, 0x24, 0x08, 0x0c, 0x77, 0xb8, 0x01, 0x10, 0xd0, 0xac, 0x11, 0x60, + 0x90, 0x84, 0x18, 0x00, 0x09, 0x04, 0x0c, 0x83, 0x70, 0x03, 0x00, 0x01, + 0x00, 0x28, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x26, 0x31, 0x00, 0xa0, + 0x78, 0x50, 0xc0, 0xe4, 0x78, 0x52, 0x20, 0x09, 0x18, 0x0c, 0x21, 0x0c, + 0xd1, 0x9c, 0x11, 0x20, 0x79, 0x04, 0x91, 0x8d, 0x00, 0x02, 0x79, 0x06, + 0x20, 0x11, 0x00, 0x48, 0x08, 0x0c, 0x2a, 0xd3, 0x78, 0x28, 0x90, 0x85, + 0x00, 0x28, 0x78, 0x2a, 0x20, 0x01, 0x19, 0xa8, 0x20, 0x03, 0x00, 0x00, + 0x90, 0x06, 0x78, 0xf2, 0x01, 0x5e, 0x00, 0x3e, 0x00, 0x0e, 0x01, 0x2e, + 0x00, 0xfe, 0x00, 0x4e, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0x06, + 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x00, 0x46, 0x00, 0xb6, 0x00, 0xc6, + 0x00, 0xd6, 0x00, 0xe6, 0x00, 0xf6, 0x01, 0x56, 0x00, 0x71, 0x0d, 0x0c, + 0x8a, 0x7f, 0x01, 0x5e, 0x00, 0xfe, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, + 0x00, 0xbe, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x0e, + 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0x18, 0x9e, 0x70, 0x04, 0x90, 0x86, + 0x00, 0x01, 0x11, 0x10, 0x08, 0x0c, 0x35, 0xb5, 0x00, 0xee, 0x00, 0x05, + 0x00, 0x05, 0x2a, 0x70, 0x20, 0x61, 0x19, 0xac, 0x20, 0x63, 0x00, 0x03, + 0x60, 0x07, 0x00, 0x03, 0x60, 0x0b, 0x00, 0x14, 0x60, 0x0f, 0x01, 0x37, + 0x20, 0x01, 0x19, 0x7c, 0x90, 0x0e, 0x21, 0x02, 0x71, 0x96, 0x20, 0x01, + 0x01, 0x00, 0x20, 0x04, 0x90, 0x82, 0x00, 0x02, 0x02, 0x18, 0x70, 0x5f, + 0xff, 0xff, 0x00, 0x08, 0x71, 0x5e, 0x70, 0x67, 0xff, 0xff, 0x71, 0x7e, + 0x71, 0x82, 0x08, 0x0c, 0xd3, 0x89, 0x70, 0xef, 0x00, 0xc0, 0x20, 0x61, + 0x19, 0x6c, 0x60, 0x03, 0x09, 0x09, 0x61, 0x06, 0x60, 0x0b, 0x88, 0x00, + 0x60, 0x0f, 0x02, 0x00, 0x60, 0x13, 0x00, 0xff, 0x60, 0x17, 0x00, 0x1f, + 0x61, 0x1a, 0x60, 0x1f, 0x07, 0xd0, 0x20, 0x61, 0x19, 0x74, 0x60, 0x03, + 0x80, 0x00, 0x61, 0x06, 0x61, 0x0a, 0x60, 0x0f, 0x02, 0x00, 0x60, 0x13, + 0x00, 0xff, 0x61, 0x16, 0x60, 0x1b, 0x00, 0x01, 0x61, 0x1e, 0x20, 0x61, + 0x19, 0x89, 0x60, 0x03, 0x51, 0x4c, 0x60, 0x07, 0x4f, 0x47, 0x60, 0x0b, + 0x49, 0x43, 0x60, 0x0f, 0x20, 0x20, 0x20, 0x01, 0x18, 0x2c, 0x21, 0x02, + 0x00, 0x05, 0x90, 0x16, 0x08, 0x0c, 0x67, 0xb4, 0x11, 0x78, 0xb8, 0x04, + 0x90, 0xc4, 0x00, 0xff, 0x98, 0xc6, 0x00, 0x06, 0x01, 0x28, 0x90, 0xc4, + 0xff, 0x00, 0x98, 0xc6, 0x06, 0x00, 0x11, 0x20, 0x91, 0x86, 0x00, 0x80, + 0x01, 0x08, 0x82, 0x10, 0x81, 0x08, 0x91, 0x86, 0x08, 0x00, 0x1d, 0x50, + 0x22, 0x08, 0x00, 0x05, 0x20, 0x91, 0x80, 0x00, 0x20, 0x79, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0xf6, 0x00, 0x10, 0x20, 0x91, 0x80, 0x00, 0x0e, 0x04, + 0x0d, 0x87, 0x00, 0x06, 0x00, 0x16, 0x20, 0x01, 0x80, 0x02, 0x00, 0x06, + 0x20, 0x79, 0x00, 0x00, 0x00, 0x0e, 0x78, 0x82, 0x78, 0x36, 0x00, 0x1e, + 0x79, 0x8e, 0x00, 0x0e, 0x78, 0x8a, 0x00, 0x0e, 0x78, 0x86, 0x39, 0x00, + 0x78, 0x9a, 0x00, 0xd6, 0x20, 0x69, 0x03, 0x00, 0x68, 0x18, 0x78, 0xae, + 0x68, 0x1c, 0x78, 0xb2, 0x68, 0x08, 0x78, 0xbe, 0x00, 0xde, 0x78, 0x33, + 0x00, 0x12, 0x20, 0x91, 0x50, 0x00, 0x01, 0x56, 0x00, 0xd6, 0x00, 0x36, + 0x00, 0x26, 0x20, 0x79, 0x03, 0x00, 0x20, 0x69, 0x1b, 0x2b, 0x7a, 0x08, + 0x22, 0x6a, 0x20, 0x69, 0x1b, 0x2c, 0x7a, 0x18, 0x22, 0x6a, 0x8d, 0x68, + 0x7a, 0x1c, 0x22, 0x6a, 0x78, 0x2c, 0x20, 0x19, 0x1b, 0x39, 0x20, 0x1a, + 0x20, 0x19, 0x1b, 0x3c, 0x90, 0x16, 0x78, 0x08, 0xd0, 0x9c, 0x01, 0x68, + 0x78, 0x20, 0x20, 0x1a, 0x82, 0x10, 0x83, 0x18, 0x93, 0x86, 0x1b, 0x55, + 0x01, 0x08, 0x0c, 0xa8, 0x78, 0x08, 0xd0, 0x9c, 0x01, 0x10, 0x20, 0x11, + 0xde, 0xad, 0x20, 0x19, 0x1b, 0x3a, 0x78, 0x2c, 0x20, 0x1a, 0x83, 0x18, + 0x22, 0x1a, 0x78, 0x03, 0x00, 0x00, 0x20, 0x69, 0x1a, 0x81, 0x90, 0x1e, + 0x20, 0xa9, 0x00, 0x20, 0x7b, 0x26, 0x7a, 0x28, 0x22, 0x6a, 0x8d, 0x68, + 0x83, 0x18, 0x1f, 0x04, 0x0d, 0xde, 0x20, 0x69, 0x1a, 0xa1, 0x20, 0x19, + 0x00, 0x50, 0x20, 0xa9, 0x00, 0x20, 0x7b, 0x26, 0x7a, 0x28, 0x22, 0x6a, + 0x8d, 0x68, 0x83, 0x18, 0x1f, 0x04, 0x0d, 0xeb, 0x04, 0x91, 0x00, 0x2e, + 0x00, 0x3e, 0x00, 0xde, 0x01, 0x5e, 0x20, 0x79, 0x18, 0x00, 0x78, 0x03, + 0x00, 0x05, 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, 0x00, 0x89, 0x20, 0x04, + 0xd0, 0x84, 0x01, 0x80, 0x20, 0x01, 0x1a, 0x25, 0x20, 0x04, 0x90, 0x05, + 0x01, 0x28, 0x20, 0x01, 0x00, 0x8b, 0x20, 0x04, 0xd0, 0xfc, 0x0d, 0xd8, + 0x20, 0x01, 0x00, 0x8a, 0x20, 0x03, 0x00, 0x02, 0x20, 0x03, 0x10, 0x01, + 0x08, 0x0c, 0x58, 0x4f, 0x11, 0x70, 0x08, 0x0c, 0x0f, 0x32, 0x01, 0x10, + 0x08, 0x0c, 0x0e, 0x85, 0x08, 0x0c, 0x58, 0x4f, 0x11, 0x30, 0x20, 0x71, + 0x18, 0x00, 0x20, 0x11, 0x80, 0x00, 0x08, 0x0c, 0x0f, 0x46, 0x0c, 0x70, + 0x00, 0x05, 0x20, 0x01, 0x03, 0x82, 0x20, 0x04, 0x90, 0x84, 0x00, 0x07, + 0x90, 0x86, 0x00, 0x01, 0x11, 0x20, 0x20, 0x01, 0x00, 0x15, 0x08, 0x0c, + 0xac, 0xed, 0x20, 0x79, 0x03, 0x80, 0x20, 0x69, 0x1b, 0x0b, 0x78, 0x18, + 0x68, 0x02, 0x78, 0x1c, 0x68, 0x06, 0x78, 0x40, 0x68, 0x0a, 0x78, 0x44, + 0x68, 0x0e, 0x78, 0x2c, 0x68, 0x12, 0x20, 0x19, 0x1b, 0x16, 0x90, 0x16, + 0x78, 0x08, 0xd0, 0x9c, 0x01, 0x50, 0x78, 0x20, 0x20, 0x1a, 0x82, 0x10, + 0x83, 0x18, 0x82, 0x10, 0x92, 0x82, 0x00, 0x11, 0x0e, 0xa8, 0x20, 0x11, + 0xde, 0xad, 0x6a, 0x2a, 0x78, 0x30, 0x68, 0x1a, 0x78, 0x34, 0x68, 0x1e, + 0x78, 0x38, 0x68, 0x22, 0x78, 0x3c, 0x68, 0x26, 0x78, 0x03, 0x00, 0x00, + 0x20, 0x69, 0x1a, 0xcb, 0x90, 0x1e, 0x20, 0xa9, 0x00, 0x20, 0x7b, 0x26, + 0x78, 0x28, 0x20, 0x6a, 0x8d, 0x68, 0x83, 0x18, 0x1f, 0x04, 0x0e, 0x5f, + 0x20, 0x69, 0x1a, 0xeb, 0x20, 0x19, 0x00, 0xb0, 0x20, 0xa9, 0x00, 0x20, + 0x7b, 0x26, 0x78, 0x28, 0x20, 0x6a, 0x8d, 0x68, 0x83, 0x18, 0x1f, 0x04, + 0x0e, 0x6c, 0x00, 0x05, 0x91, 0x8c, 0x03, 0xff, 0x20, 0x01, 0x00, 0x03, + 0x20, 0x04, 0x90, 0x84, 0x06, 0x00, 0x11, 0x18, 0x91, 0x8d, 0x6c, 0x00, + 0x00, 0x10, 0x91, 0x8d, 0x64, 0x00, 0x20, 0x01, 0x01, 0x7f, 0x21, 0x02, + 0x00, 0x05, 0x00, 0x26, 0x01, 0x26, 0x20, 0x11, 0x00, 0x80, 0x08, 0x0c, + 0x0f, 0x24, 0x20, 0xa9, 0x09, 0x00, 0x08, 0x0c, 0x0f, 0x5a, 0x20, 0x11, + 0x00, 0x40, 0x08, 0x0c, 0x0f, 0x24, 0x20, 0xa9, 0x09, 0x00, 0x08, 0x0c, + 0x0f, 0x5a, 0x0c, 0x78, 0x00, 0x26, 0x08, 0x0c, 0x0f, 0x32, 0x11, 0x88, + 0x20, 0x11, 0x01, 0x0e, 0x22, 0x14, 0x92, 0x94, 0x00, 0x07, 0x92, 0x96, + 0x00, 0x07, 0x01, 0x18, 0x20, 0x11, 0x09, 0x47, 0x00, 0x10, 0x20, 0x11, + 0x1b, 0x47, 0x08, 0x0c, 0x0f, 0x46, 0x00, 0x2e, 0x00, 0x05, 0x20, 0x11, + 0x01, 0x0e, 0x22, 0x14, 0x92, 0x94, 0x00, 0x07, 0x92, 0x96, 0x00, 0x07, + 0x01, 0x18, 0x20, 0x11, 0xa8, 0x80, 0x00, 0x10, 0x20, 0x11, 0x68, 0x40, + 0xd0, 0xe4, 0x70, 0xf3, 0x00, 0x00, 0x11, 0x20, 0x70, 0xf3, 0x0f, 0xa0, + 0x08, 0x0c, 0x0f, 0x37, 0x00, 0x2e, 0x00, 0x05, 0x00, 0x26, 0x08, 0x0c, + 0x0f, 0x32, 0x01, 0x48, 0xd0, 0xa4, 0x11, 0x38, 0x20, 0x11, 0xcd, 0xd5, + 0x00, 0x10, 0x20, 0x11, 0x00, 0x80, 0x08, 0x0c, 0x0f, 0x37, 0x00, 0x2e, + 0x00, 0x05, 0x00, 0x26, 0x70, 0xf3, 0x00, 0x00, 0x08, 0x0c, 0x0f, 0x32, + 0x11, 0x30, 0x20, 0x11, 0x80, 0x40, 0x08, 0x0c, 0x0f, 0x46, 0x00, 0x2e, + 0x00, 0x05, 0x08, 0x0c, 0x2a, 0x77, 0x11, 0x18, 0x20, 0x11, 0xcd, 0xc5, + 0x00, 0x10, 0x20, 0x11, 0xca, 0xc2, 0x08, 0x0c, 0x0f, 0x37, 0x00, 0x2e, + 0x00, 0x05, 0x00, 0xe6, 0x00, 0x16, 0x00, 0x06, 0x20, 0x71, 0x18, 0x00, + 0xd0, 0xb4, 0x70, 0xec, 0x71, 0xe8, 0x11, 0x18, 0xc0, 0xe4, 0xc1, 0xf4, + 0x00, 0x50, 0x00, 0x06, 0x3b, 0x00, 0x90, 0x84, 0xff, 0x3e, 0x20, 0xd8, + 0x00, 0x0e, 0x70, 0xf3, 0x00, 0x00, 0xc0, 0xe5, 0xc1, 0xf5, 0x00, 0x99, + 0x00, 0x0e, 0x00, 0x1e, 0x00, 0xee, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, + 0x18, 0x00, 0xd0, 0xe4, 0x70, 0xec, 0x11, 0x10, 0xc0, 0xdc, 0x00, 0x08, + 0xc0, 0xdd, 0x00, 0x16, 0x71, 0xe8, 0x00, 0x19, 0x00, 0x1e, 0x00, 0xee, + 0x00, 0x05, 0x70, 0xee, 0x71, 0xea, 0x70, 0x00, 0x90, 0x84, 0x00, 0x07, + 0x00, 0x0b, 0x00, 0x05, 0x0e, 0xea, 0x0e, 0xc4, 0x0e, 0xc4, 0x0e, 0x98, + 0x0e, 0xd3, 0x0e, 0xc4, 0x0e, 0xc4, 0x0e, 0xd3, 0xc2, 0x84, 0x00, 0x16, + 0x3b, 0x08, 0x3a, 0x00, 0x91, 0x04, 0x91, 0x8d, 0x00, 0xc1, 0x21, 0xd8, + 0x90, 0x84, 0xff, 0x3e, 0x92, 0x05, 0x20, 0xd0, 0x00, 0x1e, 0x00, 0x05, + 0x20, 0x01, 0x18, 0x3b, 0x20, 0x04, 0xd0, 0xdc, 0x00, 0x05, 0x9e, 0x86, + 0x18, 0x00, 0x19, 0x0c, 0x0d, 0x85, 0x70, 0xec, 0xd0, 0xe4, 0x01, 0x08, + 0xc2, 0xe5, 0x72, 0xee, 0xd0, 0xe4, 0x11, 0x18, 0x92, 0x94, 0x00, 0xc1, + 0x08, 0xf9, 0x00, 0x05, 0x9e, 0x86, 0x18, 0x00, 0x19, 0x0c, 0x0d, 0x85, + 0x70, 0xe8, 0xd0, 0xf4, 0x01, 0x08, 0xc2, 0xf5, 0x72, 0xea, 0xd0, 0xf4, + 0x11, 0x40, 0x92, 0x84, 0x80, 0x00, 0x80, 0x05, 0xc2, 0x84, 0x92, 0x15, + 0x92, 0x94, 0x00, 0xc1, 0x08, 0x61, 0x00, 0x05, 0x1d, 0x04, 0x0f, 0x5a, + 0x20, 0x91, 0x60, 0x00, 0x1f, 0x04, 0x0f, 0x5a, 0x00, 0x05, 0x89, 0x0e, + 0x81, 0x0e, 0x81, 0x0f, 0x91, 0x94, 0x00, 0x3f, 0x91, 0x8c, 0xff, 0xc0, + 0x00, 0x05, 0x00, 0x06, 0x22, 0x00, 0x91, 0x4d, 0x89, 0x4f, 0x89, 0x4d, + 0x89, 0x4d, 0x00, 0x0e, 0x00, 0x05, 0x01, 0xd6, 0x01, 0x46, 0x00, 0x36, + 0x00, 0x96, 0x20, 0x61, 0x18, 0x8d, 0x60, 0x0b, 0x00, 0x00, 0x60, 0x0f, + 0x00, 0x00, 0x60, 0x03, 0x00, 0x00, 0x60, 0x07, 0x00, 0x00, 0x20, 0x09, + 0xff, 0xc0, 0x21, 0x05, 0x00, 0x06, 0x20, 0x01, 0xaa, 0xaa, 0x20, 0x0f, + 0x20, 0x19, 0x55, 0x55, 0x90, 0x16, 0x20, 0x49, 0x0b, 0xff, 0xab, 0x02, + 0xa0, 0x01, 0xa0, 0x01, 0xa8, 0x00, 0x93, 0x06, 0x11, 0x38, 0x21, 0x05, + 0x93, 0x06, 0x01, 0x20, 0x82, 0x10, 0x99, 0xc8, 0x04, 0x00, 0x0c, 0x98, + 0x00, 0x0e, 0x20, 0x0f, 0x20, 0x01, 0x18, 0x9d, 0x92, 0x8a, 0x00, 0x0e, + 0x16, 0x38, 0x92, 0x8a, 0x00, 0x06, 0x20, 0x11, 0x00, 0x06, 0x12, 0x10, + 0x20, 0x11, 0x00, 0x00, 0x22, 0x02, 0x90, 0x06, 0x20, 0x08, 0x82, 0xff, + 0x01, 0xb0, 0x82, 0x00, 0x60, 0x0a, 0x60, 0x0f, 0xff, 0xff, 0x60, 0x03, + 0x00, 0x02, 0x60, 0x07, 0x00, 0x00, 0x00, 0x26, 0x20, 0x19, 0x00, 0x10, + 0x92, 0x80, 0x00, 0x01, 0x20, 0xe8, 0x21, 0xa0, 0x21, 0xa8, 0x41, 0x04, + 0x83, 0x19, 0x1d, 0xe0, 0x82, 0x11, 0x1d, 0xa0, 0x00, 0x2e, 0x00, 0x9e, + 0x00, 0x3e, 0x01, 0x4e, 0x01, 0xde, 0x00, 0x05, 0x20, 0x11, 0x00, 0x0e, + 0x08, 0xe8, 0x00, 0x16, 0x00, 0x26, 0x00, 0x96, 0x33, 0x48, 0x08, 0x0c, + 0x0f, 0x61, 0x21, 0x00, 0x93, 0x00, 0x20, 0x98, 0x22, 0xe0, 0x00, 0x9e, + 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x36, 0x35, 0x18, 0x20, 0xa9, 0x00, 0x01, + 0x40, 0x02, 0x80, 0x07, 0x40, 0x04, 0x83, 0x19, 0x1d, 0xd8, 0x00, 0x3e, + 0x00, 0x05, 0x20, 0xe9, 0x00, 0x01, 0x71, 0xb8, 0x81, 0xff, 0x11, 0xc0, + 0x90, 0x06, 0x20, 0x09, 0x02, 0x00, 0x20, 0xa9, 0x00, 0x02, 0x92, 0x98, + 0x00, 0x18, 0x23, 0xa0, 0x40, 0x01, 0x20, 0x09, 0x07, 0x00, 0x20, 0xa9, + 0x00, 0x02, 0x92, 0x98, 0x00, 0x08, 0x23, 0xa0, 0x40, 0x01, 0x70, 0x7c, + 0x80, 0x07, 0x71, 0x80, 0x81, 0x0f, 0x20, 0xa9, 0x00, 0x02, 0x40, 0x01, + 0x92, 0x98, 0x00, 0x0c, 0x23, 0xa0, 0x90, 0x0e, 0x08, 0x0c, 0x0d, 0x65, + 0x20, 0x01, 0x00, 0x00, 0x81, 0x0f, 0x20, 0xa9, 0x00, 0x02, 0x40, 0x01, + 0x00, 0x05, 0x89, 0xff, 0x01, 0x40, 0xa8, 0x04, 0xa8, 0x07, 0x00, 0x00, + 0x00, 0x06, 0x08, 0x0c, 0x10, 0x8b, 0x00, 0x9e, 0x0c, 0xb0, 0x00, 0x05, + 0x00, 0xe6, 0x20, 0x71, 0x18, 0x00, 0x08, 0x0c, 0x11, 0x04, 0x09, 0x0c, + 0x0d, 0x85, 0x00, 0xee, 0x00, 0x05, 0x00, 0x86, 0x00, 0xe6, 0x00, 0x06, + 0x00, 0x26, 0x00, 0x36, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0xc9, + 0x20, 0x71, 0x18, 0x00, 0x73, 0xc0, 0x70, 0x2c, 0x90, 0x16, 0x90, 0x45, + 0x01, 0x58, 0x82, 0x10, 0x99, 0x06, 0x09, 0x0c, 0x0d, 0x85, 0x23, 0x00, + 0x92, 0x02, 0x01, 0x20, 0x1a, 0x0c, 0x0d, 0x85, 0xa0, 0x00, 0x0c, 0x98, + 0x01, 0x2e, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x0e, 0x00, 0xee, 0x00, 0x8e, + 0x00, 0x05, 0x00, 0x86, 0x00, 0xe6, 0x00, 0x06, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x71, 0x19, 0x10, 0x70, 0x10, 0x90, 0x05, 0x01, 0x40, + 0x70, 0x18, 0x90, 0x45, 0x01, 0x28, 0x99, 0x06, 0x09, 0x0c, 0x0d, 0x85, + 0xa0, 0x00, 0x0c, 0xc8, 0x01, 0x2e, 0x00, 0x0e, 0x00, 0xee, 0x00, 0x8e, + 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0x18, 0x00, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x70, 0xc0, 0x80, 0x01, 0x02, 0x70, 0x70, 0xc2, 0x70, 0x2c, + 0x20, 0x48, 0x90, 0x85, 0x00, 0x01, 0xa8, 0x00, 0x70, 0x2e, 0xa8, 0x03, + 0x00, 0x00, 0xa8, 0x07, 0x00, 0x00, 0x01, 0x2e, 0x00, 0xee, 0x00, 0x05, + 0x90, 0x4e, 0x0c, 0xd8, 0x00, 0xe6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x71, 0x18, 0x00, 0x70, 0xc0, 0x90, 0xca, 0x00, 0x20, 0x02, 0x68, + 0x80, 0x01, 0x70, 0xc2, 0x70, 0x2c, 0x20, 0x48, 0xa8, 0x00, 0x70, 0x2e, + 0xa8, 0x03, 0x00, 0x00, 0xa8, 0x07, 0x00, 0x00, 0x01, 0x2e, 0x00, 0xee, + 0x00, 0x05, 0x90, 0x4e, 0x0c, 0xd8, 0x00, 0xe6, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x00, 0x16, 0x89, 0x0e, 0x81, 0x0e, 0x81, 0x0f, 0x91, 0x84, + 0x00, 0x3f, 0xa8, 0x62, 0x91, 0x84, 0xff, 0xc0, 0xa8, 0x5e, 0x00, 0x1e, + 0x00, 0x20, 0x00, 0xe6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, + 0x18, 0x00, 0x70, 0x2c, 0xa8, 0x02, 0x29, 0x00, 0x70, 0x2e, 0x70, 0xc0, + 0x80, 0x00, 0x70, 0xc2, 0x08, 0x0c, 0x88, 0x99, 0x01, 0x2e, 0x00, 0xee, + 0x00, 0x05, 0x20, 0x71, 0x18, 0x00, 0x90, 0x26, 0x20, 0x09, 0x00, 0x00, + 0x20, 0x49, 0x04, 0x00, 0x29, 0x00, 0x70, 0x2e, 0x89, 0x40, 0x28, 0x00, + 0xa8, 0x02, 0xa9, 0x5e, 0xa8, 0x63, 0x00, 0x01, 0x84, 0x20, 0x98, 0x86, + 0x04, 0x40, 0x01, 0x20, 0x28, 0x48, 0x91, 0x88, 0x00, 0x40, 0x0c, 0x90, + 0x20, 0x71, 0x18, 0x8d, 0x70, 0x00, 0x90, 0x05, 0x11, 0xa0, 0x20, 0x01, + 0x05, 0x58, 0xa8, 0x02, 0x20, 0x48, 0x20, 0x09, 0x56, 0x00, 0x89, 0x40, + 0x28, 0x00, 0xa8, 0x02, 0xa9, 0x5e, 0xa8, 0x63, 0x00, 0x01, 0x84, 0x20, + 0x98, 0x86, 0x08, 0x00, 0x01, 0x20, 0x28, 0x48, 0x91, 0x88, 0x00, 0x40, + 0x0c, 0x90, 0x20, 0x71, 0x18, 0x8d, 0x71, 0x04, 0x72, 0x00, 0x82, 0xff, + 0x01, 0xd0, 0x73, 0x08, 0x83, 0x18, 0x83, 0x1f, 0x83, 0x1b, 0x83, 0x1b, + 0x73, 0x12, 0x83, 0x19, 0x20, 0x01, 0x08, 0x00, 0xa8, 0x02, 0x20, 0x48, + 0x89, 0x00, 0xa8, 0x02, 0x20, 0x40, 0xa9, 0x5e, 0xaa, 0x62, 0x84, 0x20, + 0x23, 0x00, 0x99, 0x06, 0x01, 0x30, 0x28, 0x48, 0x91, 0x88, 0x00, 0x40, + 0x92, 0x91, 0x00, 0x00, 0x0c, 0x88, 0xa8, 0x03, 0x00, 0x00, 0x20, 0x71, + 0x18, 0x00, 0x74, 0xbe, 0x74, 0xc2, 0x00, 0x05, 0x00, 0xe6, 0x00, 0x16, + 0x99, 0x84, 0xfc, 0x00, 0x01, 0xe8, 0x90, 0x8c, 0xf8, 0x00, 0x11, 0x68, + 0x99, 0x82, 0x04, 0x00, 0x02, 0xb8, 0x99, 0x82, 0x04, 0x40, 0x02, 0x78, + 0x99, 0x82, 0x05, 0x58, 0x02, 0x88, 0x99, 0x82, 0x08, 0x00, 0x12, 0x70, + 0x00, 0x40, 0x99, 0x82, 0x08, 0x00, 0x02, 0x50, 0x20, 0x71, 0x18, 0x8d, + 0x70, 0x10, 0x99, 0x02, 0x12, 0x28, 0x90, 0x85, 0x00, 0x01, 0x00, 0x1e, + 0x00, 0xee, 0x00, 0x05, 0x90, 0x06, 0x0c, 0xd8, 0x00, 0xe6, 0x20, 0x71, + 0x1a, 0x24, 0x70, 0x07, 0x00, 0x00, 0x90, 0x06, 0x70, 0x1e, 0x70, 0x22, + 0x70, 0x02, 0x20, 0x71, 0x00, 0x00, 0x70, 0x10, 0x90, 0x85, 0x80, 0x44, + 0x70, 0x12, 0x20, 0x71, 0x00, 0x80, 0x90, 0x06, 0x70, 0x2b, 0x00, 0x60, + 0x20, 0xa9, 0x00, 0x40, 0x70, 0x22, 0x1f, 0x04, 0x11, 0x3e, 0x70, 0x2b, + 0x00, 0x60, 0x70, 0x2b, 0x00, 0x20, 0x20, 0xa9, 0x00, 0x40, 0x70, 0x22, + 0x1f, 0x04, 0x11, 0x47, 0x70, 0x2b, 0x00, 0x20, 0x00, 0xee, 0x00, 0x05, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0xe6, 0xa0, 0x6f, 0x00, 0x00, + 0x20, 0x71, 0x1a, 0x24, 0x70, 0x1c, 0x90, 0x88, 0x1a, 0x2e, 0x28, 0x0a, + 0x80, 0x00, 0x90, 0x84, 0x00, 0x3f, 0x70, 0x1e, 0x71, 0x20, 0x91, 0x06, + 0x09, 0x0c, 0x0d, 0x85, 0x70, 0x04, 0x90, 0x05, 0x11, 0x28, 0x00, 0xf6, + 0x20, 0x79, 0x00, 0x80, 0x00, 0xa9, 0x00, 0xfe, 0x00, 0xee, 0x01, 0x2e, + 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0xe6, 0x20, 0x71, + 0x1a, 0x24, 0x70, 0x04, 0x90, 0x05, 0x11, 0x28, 0x00, 0xf6, 0x20, 0x79, + 0x00, 0x80, 0x00, 0x21, 0x00, 0xfe, 0x00, 0xee, 0x01, 0x2e, 0x00, 0x05, + 0x70, 0x04, 0x90, 0x86, 0x00, 0x00, 0x11, 0x10, 0x70, 0x07, 0x00, 0x06, + 0x70, 0x00, 0x00, 0x02, 0x11, 0x90, 0x13, 0x13, 0x11, 0x8e, 0x11, 0x8e, + 0x13, 0x07, 0x13, 0x07, 0x13, 0x07, 0x13, 0x07, 0x08, 0x0c, 0x0d, 0x85, + 0x70, 0x1c, 0x71, 0x20, 0x91, 0x06, 0x11, 0x48, 0x79, 0x2c, 0x91, 0x84, + 0x00, 0x01, 0x11, 0x20, 0xd1, 0xfc, 0x11, 0x10, 0x70, 0x07, 0x00, 0x00, + 0x00, 0x05, 0x00, 0x96, 0x91, 0x80, 0x1a, 0x2e, 0x20, 0x04, 0x70, 0x0a, + 0x20, 0x48, 0x81, 0x08, 0x91, 0x8c, 0x00, 0x3f, 0x71, 0x22, 0x78, 0x2b, + 0x00, 0x26, 0xa8, 0x8c, 0x78, 0x02, 0xa8, 0x90, 0x78, 0x06, 0xa8, 0x94, + 0x78, 0x0a, 0xa8, 0x98, 0x78, 0x0e, 0xa8, 0x78, 0x70, 0x0e, 0xa8, 0x70, + 0x70, 0x16, 0xa8, 0x74, 0x70, 0x1a, 0xa8, 0x68, 0x00, 0x9e, 0xd0, 0x84, + 0x01, 0x20, 0x70, 0x07, 0x00, 0x01, 0x00, 0x29, 0x00, 0x05, 0x70, 0x07, + 0x00, 0x02, 0x00, 0xb1, 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, 0x71, 0x0c, + 0x20, 0x11, 0x00, 0x40, 0x91, 0x82, 0x00, 0x40, 0x12, 0x10, 0x21, 0x10, + 0x90, 0x06, 0x70, 0x0e, 0x72, 0x12, 0x82, 0x03, 0x78, 0x12, 0x78, 0x2b, + 0x00, 0x20, 0x78, 0x2b, 0x00, 0x41, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, + 0x00, 0x16, 0x00, 0x26, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x70, 0x14, + 0x20, 0xe0, 0x70, 0x18, 0x20, 0x98, 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, + 0x00, 0x88, 0x78, 0x2b, 0x00, 0x26, 0x71, 0x0c, 0x20, 0x11, 0x00, 0x40, + 0x91, 0x82, 0x00, 0x40, 0x12, 0x10, 0x21, 0x10, 0x90, 0x06, 0x70, 0x0e, + 0x22, 0xa8, 0x40, 0x06, 0x82, 0x03, 0x78, 0x12, 0x78, 0x2b, 0x00, 0x20, + 0x33, 0x00, 0x70, 0x1a, 0x78, 0x2b, 0x00, 0x01, 0x01, 0x5e, 0x01, 0x4e, + 0x01, 0x3e, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x20, 0x09, 0x1a, 0x24, + 0x21, 0x04, 0xc0, 0x95, 0x20, 0x0a, 0x08, 0x0c, 0x11, 0x6d, 0x00, 0x05, + 0x00, 0x16, 0x00, 0xe6, 0x20, 0x71, 0x1a, 0x24, 0x00, 0xf6, 0x20, 0x79, + 0x00, 0x80, 0x79, 0x2c, 0xd1, 0xbc, 0x19, 0x0c, 0x0d, 0x7e, 0x78, 0x2b, + 0x00, 0x02, 0xd1, 0xfc, 0x01, 0x20, 0x91, 0x8c, 0x07, 0x00, 0x70, 0x04, + 0x00, 0x23, 0x00, 0xfe, 0x00, 0xee, 0x00, 0x1e, 0x00, 0x05, 0x11, 0x7e, + 0x12, 0x26, 0x12, 0x5a, 0x13, 0x32, 0x0d, 0x85, 0x13, 0x4d, 0x0d, 0x85, + 0x91, 0x8c, 0x07, 0x00, 0x15, 0x50, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, + 0x70, 0x14, 0x20, 0xe8, 0x70, 0x18, 0x20, 0xa0, 0x20, 0xe1, 0x00, 0x00, + 0x20, 0x99, 0x00, 0x88, 0x78, 0x2b, 0x00, 0x40, 0x70, 0x10, 0x20, 0xa8, + 0x40, 0x05, 0x34, 0x00, 0x70, 0x1a, 0x01, 0x5e, 0x01, 0x4e, 0x01, 0x3e, + 0x70, 0x0c, 0x90, 0x05, 0x05, 0x78, 0x78, 0x00, 0x78, 0x02, 0x78, 0x04, + 0x78, 0x06, 0x08, 0x0c, 0x11, 0xc3, 0x00, 0x05, 0x70, 0x08, 0x00, 0x96, + 0x20, 0x48, 0xa8, 0x6f, 0x01, 0x00, 0x00, 0x9e, 0x70, 0x07, 0x00, 0x00, + 0x08, 0x0c, 0x11, 0x7e, 0x00, 0x05, 0x70, 0x08, 0x00, 0x96, 0x20, 0x48, + 0xa8, 0x6f, 0x02, 0x00, 0x00, 0x9e, 0x0c, 0xa0, 0x91, 0x8c, 0x07, 0x00, + 0x11, 0x50, 0x70, 0x0c, 0x90, 0x05, 0x01, 0x80, 0x78, 0x00, 0x78, 0x02, + 0x78, 0x04, 0x78, 0x06, 0x08, 0x0c, 0x11, 0xd8, 0x00, 0x05, 0x70, 0x08, + 0x00, 0x96, 0x20, 0x48, 0xa8, 0x6f, 0x02, 0x00, 0x00, 0x9e, 0x70, 0x07, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x96, 0x70, 0x08, 0x20, 0x48, 0x78, 0x00, + 0xa8, 0x8e, 0x78, 0x04, 0xa8, 0x92, 0x78, 0x08, 0xa8, 0x96, 0x78, 0x0c, + 0xa8, 0x9a, 0xa8, 0x6f, 0x01, 0x00, 0x00, 0x9e, 0x70, 0x07, 0x00, 0x00, + 0x00, 0x96, 0x00, 0xd6, 0x70, 0x08, 0x20, 0x48, 0x20, 0x01, 0x18, 0xb9, + 0x20, 0x04, 0x99, 0x06, 0x11, 0x28, 0xa8, 0x9c, 0x08, 0x0f, 0x00, 0xde, + 0x00, 0x9e, 0x00, 0xa0, 0x00, 0xde, 0x00, 0x9e, 0x00, 0x96, 0x00, 0xd6, + 0x70, 0x08, 0x20, 0x48, 0x00, 0x81, 0x01, 0x50, 0xa8, 0x9c, 0x00, 0x86, + 0x29, 0x40, 0x08, 0x0f, 0x00, 0x8e, 0x00, 0xde, 0x00, 0x9e, 0x08, 0x0c, + 0x11, 0x6d, 0x00, 0x05, 0x00, 0xde, 0x00, 0x9e, 0x08, 0x0c, 0x11, 0x6d, + 0x00, 0x05, 0xa8, 0xa8, 0xd0, 0x8c, 0x00, 0x05, 0x00, 0x96, 0xa0, 0xa0, + 0x90, 0x4d, 0x09, 0x0c, 0x0d, 0x85, 0xa0, 0x6c, 0x90, 0x8e, 0x01, 0x00, + 0x01, 0x30, 0xa8, 0x7b, 0x00, 0x30, 0xa8, 0x83, 0x00, 0x00, 0xa8, 0x97, + 0x40, 0x02, 0x08, 0x0c, 0x70, 0x06, 0xa0, 0x9f, 0x00, 0x00, 0xa0, 0xa3, + 0x00, 0x00, 0x28, 0x48, 0x08, 0x0c, 0x10, 0x8b, 0x00, 0x9e, 0x00, 0x05, + 0x00, 0xa6, 0xa0, 0xa0, 0x90, 0x4d, 0x09, 0x0c, 0x0d, 0x85, 0xa0, 0x6c, + 0x90, 0x8e, 0x01, 0x00, 0x01, 0x28, 0xa8, 0x7b, 0x00, 0x01, 0xa8, 0x83, + 0x00, 0x00, 0x00, 0xc0, 0xa8, 0x0c, 0x20, 0x50, 0xb0, 0x04, 0x90, 0x05, + 0x01, 0x98, 0xa8, 0x0e, 0x20, 0x50, 0x80, 0x06, 0x80, 0x06, 0x80, 0x07, + 0x90, 0x8c, 0x00, 0x3f, 0x90, 0x84, 0xff, 0xc0, 0x90, 0x80, 0x00, 0x02, + 0xa0, 0x76, 0xa1, 0x72, 0xb0, 0x00, 0xa0, 0x7a, 0x28, 0x10, 0x08, 0x0c, + 0x11, 0x4e, 0x00, 0xe8, 0xa9, 0x7c, 0xa8, 0x94, 0x00, 0x16, 0x00, 0x06, + 0x08, 0x0c, 0x70, 0x06, 0x00, 0x0e, 0x00, 0x1e, 0xd1, 0xfc, 0x11, 0x38, + 0xd1, 0xf4, 0x01, 0x28, 0x00, 0xc6, 0x20, 0x60, 0x08, 0x0c, 0xb1, 0x6c, + 0x00, 0xce, 0x70, 0x08, 0x20, 0x48, 0xa8, 0x9f, 0x00, 0x00, 0xa8, 0xa3, + 0x00, 0x00, 0x08, 0x0c, 0x10, 0x8b, 0x70, 0x07, 0x00, 0x00, 0x08, 0x0c, + 0x11, 0x6d, 0x00, 0xae, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x78, 0x2b, 0x10, 0x01, 0x70, 0x07, 0x00, 0x05, 0x70, 0x00, 0xc0, 0x94, + 0x70, 0x02, 0x01, 0x2e, 0x00, 0x05, 0x00, 0x96, 0x20, 0x01, 0x19, 0x2f, + 0x20, 0x4c, 0xa8, 0x7c, 0x78, 0x12, 0xa8, 0x8c, 0x78, 0x02, 0xa8, 0x90, + 0x78, 0x06, 0xa8, 0x94, 0x78, 0x0a, 0xa8, 0x98, 0x78, 0x0e, 0x78, 0x2b, + 0x00, 0x20, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x78, 0x2b, 0x00, 0x41, + 0x70, 0x07, 0x00, 0x03, 0x70, 0x00, 0xc0, 0x84, 0x70, 0x02, 0x29, 0x00, + 0x70, 0x0a, 0x01, 0x2e, 0x00, 0x9e, 0x00, 0x05, 0x20, 0xe1, 0x00, 0x00, + 0x20, 0x99, 0x00, 0x88, 0x78, 0x2b, 0x00, 0x40, 0x00, 0x96, 0x20, 0x01, + 0x19, 0x2f, 0x20, 0x4c, 0xaa, 0x7c, 0x00, 0x9e, 0x08, 0x0c, 0x8f, 0x88, + 0x20, 0x09, 0x18, 0x8c, 0x21, 0x04, 0x90, 0x84, 0xff, 0xfc, 0x20, 0x0a, + 0x08, 0x0c, 0x8d, 0xe7, 0x70, 0x07, 0x00, 0x00, 0x08, 0x0c, 0x11, 0x7e, + 0x00, 0x05, 0x70, 0x07, 0x00, 0x00, 0x08, 0x0c, 0x11, 0x7e, 0x00, 0x05, + 0x01, 0x26, 0x20, 0x91, 0x22, 0x00, 0x20, 0x79, 0x03, 0x00, 0x20, 0x71, + 0x1a, 0x6e, 0x70, 0x03, 0x00, 0x00, 0x78, 0xbf, 0x00, 0xf6, 0x00, 0x41, + 0x78, 0x07, 0x00, 0x07, 0x78, 0x03, 0x00, 0x00, 0x78, 0x03, 0x00, 0x01, + 0x01, 0x2e, 0x00, 0x05, 0x00, 0xc6, 0x78, 0x03, 0x00, 0x00, 0x20, 0x01, + 0x01, 0x65, 0x20, 0x03, 0x41, 0x98, 0x78, 0x08, 0xd0, 0x9c, 0x01, 0x20, + 0x78, 0x20, 0x08, 0x0c, 0x13, 0xb6, 0x0c, 0xc8, 0x20, 0x01, 0x1a, 0x6f, + 0x20, 0x03, 0x00, 0x00, 0x78, 0xab, 0x00, 0x04, 0x78, 0xac, 0xd0, 0xac, + 0x1d, 0xe8, 0x78, 0xab, 0x00, 0x02, 0x78, 0x07, 0x00, 0x07, 0x78, 0x27, + 0x00, 0x30, 0x78, 0x2b, 0x04, 0x00, 0x78, 0x27, 0x00, 0x31, 0x78, 0x2b, + 0x1a, 0x81, 0x78, 0xe3, 0xff, 0x00, 0x78, 0x1f, 0xff, 0x00, 0x78, 0x1b, + 0xff, 0x00, 0x20, 0x01, 0x1a, 0x70, 0x20, 0x03, 0x00, 0x00, 0x20, 0x01, + 0x02, 0x00, 0x20, 0x04, 0xd0, 0xdc, 0x01, 0x10, 0x78, 0x1f, 0x03, 0x03, + 0x20, 0x61, 0x1a, 0x81, 0x60, 0x2f, 0x1d, 0xdc, 0x20, 0x01, 0x18, 0x1a, + 0x20, 0x04, 0x90, 0x82, 0x1d, 0xdc, 0x60, 0x32, 0x60, 0x3b, 0x1e, 0xc1, + 0x60, 0x2b, 0x1a, 0xc1, 0x60, 0x07, 0x1a, 0xa1, 0x20, 0x61, 0x1a, 0xa1, + 0x60, 0x6f, 0x19, 0x3d, 0x20, 0x01, 0x19, 0x28, 0x20, 0x04, 0x60, 0x7a, + 0x78, 0x3f, 0x34, 0x8e, 0x00, 0xce, 0x00, 0x05, 0x90, 0x86, 0x00, 0x0d, + 0x11, 0xd0, 0x78, 0x08, 0xd0, 0x9c, 0x01, 0xb8, 0x78, 0x20, 0x00, 0x26, + 0x20, 0x10, 0x08, 0x0c, 0xcf, 0x09, 0x01, 0x80, 0x22, 0x60, 0x60, 0x00, + 0x90, 0x86, 0x00, 0x04, 0x11, 0x58, 0x00, 0x16, 0x61, 0x20, 0x91, 0x86, + 0x00, 0x09, 0x01, 0x08, 0x00, 0x20, 0x20, 0x09, 0x00, 0x4c, 0x08, 0x0c, + 0xb2, 0x0a, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, + 0x22, 0x00, 0x79, 0x08, 0x91, 0x84, 0x00, 0x70, 0x19, 0x0c, 0x0d, 0x7e, + 0xd1, 0x9c, 0x05, 0xa0, 0x78, 0x20, 0x90, 0x8c, 0xf0, 0x00, 0x05, 0x40, + 0x20, 0x60, 0x60, 0x20, 0x90, 0x86, 0x00, 0x03, 0x15, 0x50, 0x60, 0x00, + 0x90, 0x86, 0x00, 0x04, 0x15, 0x30, 0x61, 0x14, 0x21, 0x48, 0xa8, 0x76, + 0xa8, 0x7a, 0xa8, 0x67, 0x01, 0x03, 0x08, 0x0c, 0x6e, 0x27, 0x00, 0xb6, + 0x60, 0x10, 0x20, 0x58, 0xba, 0x3c, 0x82, 0x11, 0x02, 0x08, 0xba, 0x3e, + 0xb8, 0xd0, 0x90, 0x05, 0x19, 0x0c, 0x68, 0xdf, 0x00, 0xbe, 0x60, 0x44, + 0xd0, 0xfc, 0x19, 0x0c, 0xad, 0x25, 0x08, 0x0c, 0xb1, 0x95, 0x78, 0x08, + 0xd0, 0x9c, 0x19, 0xb0, 0x01, 0x2e, 0x00, 0x05, 0x90, 0x8a, 0x00, 0x24, + 0x1a, 0x0c, 0x0d, 0x85, 0x00, 0x2b, 0x01, 0x2e, 0x00, 0x05, 0x04, 0xb0, + 0x01, 0x2e, 0x00, 0x05, 0x14, 0x38, 0x14, 0x5e, 0x14, 0x8e, 0x14, 0x93, + 0x14, 0x97, 0x14, 0x9c, 0x14, 0xc4, 0x14, 0xc8, 0x14, 0xd6, 0x14, 0xda, + 0x14, 0x38, 0x15, 0xa7, 0x15, 0xab, 0x16, 0x1d, 0x16, 0x24, 0x14, 0x38, + 0x16, 0x25, 0x16, 0x26, 0x16, 0x31, 0x16, 0x38, 0x14, 0x38, 0x14, 0x38, + 0x14, 0x38, 0x14, 0x38, 0x14, 0x38, 0x14, 0x38, 0x14, 0x38, 0x14, 0x9e, + 0x14, 0x38, 0x14, 0x66, 0x14, 0x8b, 0x14, 0x52, 0x14, 0x38, 0x14, 0x72, + 0x14, 0x3c, 0x14, 0x3a, 0x08, 0x0c, 0x0d, 0x85, 0x08, 0x0c, 0x0d, 0x7e, + 0x08, 0x0c, 0x16, 0x43, 0x20, 0x09, 0x1a, 0x7d, 0x21, 0x04, 0x80, 0x00, + 0x20, 0x0a, 0x08, 0x0c, 0x82, 0xb8, 0x08, 0x0c, 0x1b, 0x1e, 0x00, 0x05, + 0x60, 0x44, 0xd0, 0xfc, 0x19, 0x0c, 0xad, 0x25, 0x20, 0x09, 0x00, 0x55, + 0x08, 0x0c, 0xb2, 0x0a, 0x01, 0x2e, 0x00, 0x05, 0x08, 0x0c, 0x16, 0x43, + 0x20, 0x60, 0x60, 0x44, 0xd0, 0xfc, 0x19, 0x0c, 0xad, 0x25, 0x20, 0x09, + 0x00, 0x55, 0x08, 0x0c, 0xb2, 0x0a, 0x00, 0x05, 0x20, 0x09, 0x00, 0x48, + 0x08, 0x0c, 0x16, 0x43, 0x20, 0x60, 0x08, 0x0c, 0xb2, 0x0a, 0x00, 0x05, + 0x20, 0x09, 0x00, 0x54, 0x08, 0x0c, 0x16, 0x43, 0x20, 0x60, 0x60, 0x44, + 0xd0, 0xfc, 0x19, 0x0c, 0xad, 0x25, 0x08, 0x0c, 0xb2, 0x0a, 0x00, 0x05, + 0x08, 0x0c, 0x16, 0x43, 0x20, 0x60, 0x00, 0x56, 0x00, 0x66, 0x08, 0x0c, + 0x16, 0x43, 0x20, 0x28, 0x08, 0x0c, 0x16, 0x43, 0x20, 0x30, 0x00, 0x36, + 0x00, 0x46, 0x20, 0x21, 0x00, 0x00, 0x24, 0x18, 0x20, 0x09, 0x00, 0x56, + 0x08, 0x0c, 0xb2, 0x0a, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0x6e, 0x00, 0x5e, + 0x00, 0x05, 0x08, 0x0c, 0x16, 0x43, 0x00, 0x05, 0x70, 0x04, 0xc0, 0x85, + 0xc0, 0xb5, 0x70, 0x06, 0x00, 0x05, 0x70, 0x04, 0xc0, 0x85, 0x70, 0x06, + 0x00, 0x05, 0x08, 0x0c, 0x16, 0x43, 0x08, 0x0c, 0x17, 0x40, 0x00, 0x05, + 0x08, 0x0c, 0x0d, 0x85, 0x08, 0x0c, 0x16, 0x43, 0x20, 0x60, 0x60, 0x14, + 0x00, 0x96, 0x20, 0x48, 0xa8, 0x3b, 0xff, 0xff, 0x00, 0x9e, 0x20, 0x09, + 0x00, 0x48, 0x08, 0x0c, 0xb2, 0x0a, 0x20, 0x01, 0x01, 0x5d, 0x20, 0x03, + 0x00, 0x00, 0x20, 0x09, 0x03, 0xe8, 0x81, 0x09, 0x01, 0x60, 0x20, 0x01, + 0x02, 0x01, 0x20, 0x04, 0x90, 0x05, 0x0d, 0xc8, 0x20, 0x01, 0x02, 0x18, + 0x20, 0x04, 0xd0, 0xec, 0x11, 0x10, 0x08, 0x0c, 0x16, 0x48, 0x20, 0x01, + 0x03, 0x07, 0x20, 0x03, 0x80, 0x00, 0x00, 0x05, 0x70, 0x04, 0xc0, 0x95, + 0x70, 0x06, 0x00, 0x05, 0x08, 0x0c, 0x16, 0x43, 0x20, 0x60, 0x60, 0x14, + 0x00, 0x96, 0x20, 0x48, 0xa8, 0x3b, 0xff, 0xff, 0x00, 0x9e, 0x20, 0x09, + 0x00, 0x48, 0x08, 0x0c, 0xb2, 0x0a, 0x00, 0x05, 0x08, 0x0c, 0x16, 0x43, + 0x08, 0x0c, 0x0d, 0x85, 0x08, 0x0c, 0x16, 0x43, 0x08, 0x0c, 0x15, 0x92, + 0x78, 0x27, 0x00, 0x18, 0x79, 0xac, 0xd1, 0xdc, 0x09, 0x04, 0x15, 0x43, + 0x78, 0x27, 0x00, 0x15, 0x78, 0x28, 0x78, 0x2b, 0x00, 0x00, 0x90, 0x65, + 0x01, 0x40, 0x20, 0x01, 0x02, 0x0d, 0x20, 0x03, 0x00, 0x50, 0x20, 0x03, + 0x00, 0x20, 0x08, 0x04, 0x15, 0x49, 0x70, 0x04, 0x90, 0x05, 0x01, 0xc8, + 0x11, 0x88, 0x78, 0xab, 0x00, 0x04, 0x78, 0x27, 0x00, 0x18, 0x78, 0x2b, + 0x00, 0x00, 0xd1, 0xbc, 0x09, 0x0c, 0x0d, 0x85, 0x20, 0x01, 0x02, 0x0d, + 0x20, 0x03, 0x00, 0x50, 0x20, 0x03, 0x00, 0x20, 0x08, 0x04, 0x15, 0x77, + 0x78, 0xab, 0x00, 0x04, 0x78, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x15, 0xab, + 0x00, 0x05, 0x78, 0x27, 0x00, 0x18, 0xa0, 0x01, 0x78, 0x28, 0x78, 0x27, + 0x00, 0x11, 0xa0, 0x01, 0x79, 0x28, 0x91, 0x06, 0x01, 0x10, 0x79, 0xac, + 0x08, 0xe0, 0x00, 0xe6, 0x20, 0x71, 0x02, 0x00, 0x70, 0x2c, 0xd0, 0xc4, + 0x01, 0x40, 0x00, 0xee, 0x08, 0x0c, 0x1b, 0x1e, 0x08, 0x0c, 0x13, 0x66, + 0x78, 0x03, 0x00, 0x01, 0x00, 0x05, 0x70, 0x37, 0x00, 0x01, 0xa0, 0x01, + 0x71, 0x50, 0x00, 0xee, 0x91, 0x8c, 0xff, 0x00, 0x91, 0x86, 0x05, 0x00, + 0x01, 0x10, 0x79, 0xac, 0x08, 0x10, 0x70, 0x04, 0xc0, 0x9d, 0x70, 0x06, + 0x78, 0xab, 0x00, 0x04, 0x78, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x15, 0xab, + 0x20, 0x01, 0x02, 0x0d, 0x20, 0x03, 0x00, 0x20, 0x00, 0x05, 0x78, 0x28, + 0x78, 0x2b, 0x00, 0x00, 0x90, 0x65, 0x09, 0x0c, 0x0d, 0x85, 0x60, 0x14, + 0x20, 0x48, 0x78, 0xab, 0x00, 0x04, 0x91, 0x8c, 0x07, 0x00, 0x01, 0xa8, + 0x08, 0x0c, 0x82, 0xb8, 0x08, 0x0c, 0x1b, 0x1e, 0x08, 0x0c, 0xcf, 0x1b, + 0x01, 0x58, 0xa9, 0xac, 0xa9, 0x36, 0xa9, 0xb0, 0xa9, 0x3a, 0xa8, 0x3f, + 0xff, 0xff, 0xa8, 0x43, 0xff, 0xff, 0xa8, 0x80, 0xc0, 0xbd, 0xa8, 0x82, + 0x08, 0x0c, 0xca, 0xe9, 0x00, 0x05, 0x60, 0x20, 0x90, 0x86, 0x00, 0x09, + 0x11, 0x28, 0x20, 0x09, 0x00, 0x4c, 0x08, 0x0c, 0xb2, 0x0a, 0x00, 0x48, + 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x00, 0x00, 0xbe, 0xd0, 0xbc, + 0x60, 0x24, 0x19, 0x0c, 0xd3, 0x1e, 0x20, 0x29, 0x00, 0xc8, 0x85, 0x29, + 0x01, 0x28, 0x20, 0x01, 0x02, 0x01, 0x20, 0x04, 0x90, 0x05, 0x0d, 0xc8, + 0x7d, 0xbc, 0x08, 0x0c, 0xee, 0xb1, 0xd5, 0xa4, 0x11, 0x18, 0x08, 0x0c, + 0x16, 0x48, 0x00, 0x05, 0x08, 0x0c, 0x82, 0xb8, 0x08, 0x0c, 0x1b, 0x1e, + 0x00, 0x05, 0x78, 0x1f, 0x03, 0x00, 0x78, 0x03, 0x00, 0x01, 0x00, 0x05, + 0x00, 0x16, 0x00, 0x66, 0x00, 0x76, 0x00, 0xf6, 0x20, 0x79, 0x03, 0x00, + 0x79, 0x08, 0x91, 0x8c, 0x00, 0x07, 0x91, 0x86, 0x00, 0x03, 0x01, 0x20, + 0x20, 0x01, 0x00, 0x16, 0x08, 0x0c, 0x16, 0xb9, 0x00, 0xfe, 0x00, 0x7e, + 0x00, 0x6e, 0x00, 0x1e, 0x00, 0x05, 0x70, 0x04, 0xc0, 0x9d, 0x70, 0x06, + 0x00, 0x05, 0x71, 0x04, 0x91, 0x84, 0x00, 0x04, 0x19, 0x0c, 0x0d, 0x85, + 0xd1, 0x84, 0x11, 0xb1, 0xd1, 0x9c, 0x01, 0x80, 0xc1, 0x9c, 0x71, 0x06, + 0x00, 0x16, 0x08, 0x0c, 0x17, 0x23, 0x00, 0x1e, 0x01, 0x48, 0x20, 0x01, + 0x02, 0x0d, 0x20, 0x03, 0x00, 0x50, 0x20, 0x03, 0x00, 0x20, 0x08, 0x0c, + 0x16, 0x48, 0x00, 0x05, 0x81, 0xff, 0x19, 0x0c, 0x0d, 0x85, 0x00, 0x05, + 0x21, 0x00, 0xc1, 0x84, 0xc1, 0xb4, 0x71, 0x06, 0xd0, 0xb4, 0x00, 0x16, + 0x00, 0xe6, 0x19, 0x04, 0x16, 0x12, 0x20, 0x71, 0x02, 0x00, 0x08, 0x0c, + 0x17, 0x10, 0x05, 0xe0, 0x08, 0x0c, 0x17, 0x23, 0x05, 0xb0, 0x60, 0x14, + 0x90, 0x05, 0x05, 0xb0, 0x00, 0x96, 0x20, 0x48, 0xa8, 0x64, 0x00, 0x9e, + 0x90, 0x84, 0x00, 0xff, 0x90, 0x8e, 0x00, 0x29, 0x01, 0x60, 0x90, 0x8e, + 0x00, 0x48, 0x15, 0x50, 0x60, 0x1c, 0xd0, 0x84, 0x11, 0xe0, 0x00, 0xf6, + 0x2c, 0x78, 0x08, 0x0c, 0x17, 0xad, 0x00, 0xfe, 0x00, 0xb0, 0x00, 0xf6, + 0x2c, 0x78, 0x08, 0x0c, 0x19, 0x42, 0x00, 0xfe, 0x20, 0x09, 0x01, 0xf4, + 0x81, 0x09, 0x01, 0x68, 0x20, 0x01, 0x02, 0x01, 0x20, 0x04, 0x90, 0x05, + 0x0d, 0xc8, 0x20, 0x01, 0x02, 0x18, 0x20, 0x04, 0xd0, 0xec, 0x11, 0x18, + 0x08, 0x0c, 0x16, 0x48, 0x00, 0x40, 0x20, 0x01, 0x02, 0x0d, 0x20, 0x03, + 0x00, 0x20, 0x08, 0x0c, 0x13, 0x66, 0x78, 0x03, 0x00, 0x01, 0x00, 0xee, + 0x00, 0x1e, 0x00, 0x05, 0x08, 0x0c, 0x17, 0x23, 0x0d, 0xd0, 0x20, 0x01, + 0x02, 0x0d, 0x20, 0x03, 0x00, 0x50, 0x20, 0x03, 0x00, 0x20, 0x04, 0x61, + 0x0c, 0x90, 0x04, 0x29, 0x20, 0x60, 0x20, 0x09, 0x00, 0x53, 0x08, 0x0c, + 0xb2, 0x0a, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0xe1, 0x20, 0x08, + 0x00, 0xd1, 0x00, 0x06, 0x70, 0x04, 0xc0, 0x9d, 0x70, 0x06, 0x00, 0x0e, + 0x08, 0x0c, 0x92, 0xd5, 0x00, 0x05, 0x00, 0x89, 0x90, 0x05, 0x01, 0x18, + 0x08, 0x0c, 0x8e, 0xd9, 0x0c, 0xd0, 0x00, 0x05, 0x20, 0x01, 0x00, 0x36, + 0x20, 0x09, 0x18, 0x20, 0x21, 0x0c, 0x20, 0x11, 0x18, 0x1f, 0x22, 0x14, + 0x08, 0x0c, 0x16, 0xb9, 0x00, 0x05, 0x78, 0x08, 0xd0, 0x9c, 0x0d, 0xe8, + 0x78, 0x20, 0x00, 0x05, 0x08, 0x0c, 0x15, 0x92, 0x00, 0xd6, 0x20, 0x69, + 0x02, 0x00, 0x20, 0x09, 0x01, 0xf4, 0x81, 0x09, 0x05, 0x10, 0x68, 0x04, + 0x90, 0x05, 0x0d, 0xd8, 0x20, 0x01, 0x01, 0x5d, 0x20, 0x03, 0x00, 0x00, + 0x79, 0xbc, 0xd1, 0xa4, 0x15, 0x28, 0x79, 0xb8, 0x91, 0x8c, 0x0f, 0xff, + 0x01, 0x80, 0x91, 0x82, 0x08, 0x41, 0x12, 0x68, 0x91, 0x88, 0x00, 0x07, + 0x91, 0x8c, 0x0f, 0xf8, 0x81, 0x0c, 0x81, 0x0c, 0x81, 0x0c, 0x08, 0x0c, + 0x16, 0xab, 0x68, 0x27, 0x00, 0x01, 0x81, 0x09, 0x1d, 0xd0, 0x04, 0xd9, + 0x68, 0x27, 0x00, 0x02, 0x04, 0xc1, 0x68, 0x04, 0x90, 0x05, 0x11, 0x30, + 0x68, 0x2c, 0xd0, 0xe4, 0x15, 0x00, 0x68, 0x04, 0x90, 0x05, 0x0d, 0xe8, + 0x79, 0xb8, 0xd1, 0xec, 0x11, 0x30, 0x08, 0xc0, 0x08, 0x0c, 0x82, 0xb8, + 0x08, 0x0c, 0x1b, 0x1e, 0x00, 0x90, 0x78, 0x27, 0x00, 0x15, 0x78, 0x2b, + 0x00, 0x00, 0x78, 0x27, 0x00, 0x18, 0x78, 0x2b, 0x00, 0x00, 0x20, 0x01, + 0x02, 0x0d, 0x20, 0x03, 0x00, 0x20, 0x20, 0x01, 0x03, 0x07, 0x20, 0x03, + 0x03, 0x00, 0x78, 0x03, 0x00, 0x01, 0x00, 0xde, 0x00, 0x05, 0x68, 0x2c, + 0x90, 0x84, 0x54, 0x00, 0x90, 0x86, 0x54, 0x00, 0x0d, 0x30, 0x78, 0x27, + 0x00, 0x15, 0x78, 0x2b, 0x00, 0x00, 0x78, 0x03, 0x00, 0x01, 0x68, 0x00, + 0x90, 0x85, 0x18, 0x00, 0x68, 0x02, 0x00, 0xde, 0x00, 0x05, 0x68, 0x24, + 0x90, 0x84, 0x00, 0x03, 0x1d, 0xe0, 0x00, 0x05, 0x20, 0x01, 0x00, 0x30, + 0x2c, 0x08, 0x62, 0x1c, 0x00, 0x21, 0x78, 0x30, 0x90, 0x86, 0x00, 0x41, + 0x00, 0x05, 0x00, 0xf6, 0x00, 0xe6, 0x20, 0x79, 0x03, 0x00, 0x00, 0x06, + 0x20, 0x71, 0x1a, 0x6e, 0x70, 0x08, 0x90, 0x05, 0x11, 0x10, 0x78, 0xe3, + 0x0c, 0x0c, 0x80, 0x00, 0x70, 0x0a, 0x00, 0x26, 0x20, 0x11, 0x00, 0x06, + 0x78, 0x08, 0xd0, 0x9c, 0x01, 0x50, 0x00, 0x16, 0x00, 0x26, 0x00, 0xc6, + 0x08, 0x0c, 0x13, 0xd4, 0x00, 0xce, 0x00, 0x2e, 0x00, 0x1e, 0x82, 0x11, + 0x1d, 0x98, 0x00, 0x2e, 0x00, 0x0e, 0x00, 0x06, 0x78, 0x32, 0x79, 0x36, + 0x7a, 0x3a, 0x78, 0x1b, 0x80, 0x80, 0x00, 0xb9, 0x11, 0x78, 0x20, 0x71, + 0x1a, 0x6e, 0x70, 0x08, 0x90, 0x05, 0x01, 0x30, 0x80, 0x01, 0x0a, 0x0c, + 0x0d, 0x85, 0x70, 0x0a, 0x78, 0xe3, 0x0c, 0x00, 0x00, 0x0e, 0x00, 0xee, + 0x00, 0xfe, 0x00, 0x05, 0x00, 0x0e, 0x79, 0x2c, 0x39, 0x00, 0x80, 0x00, + 0x20, 0x04, 0x08, 0x0c, 0x0d, 0x85, 0x20, 0x09, 0xff, 0x00, 0x81, 0x09, + 0x01, 0x20, 0x78, 0x18, 0xd0, 0xbc, 0x1d, 0xd8, 0x00, 0x05, 0x90, 0x85, + 0x00, 0x01, 0x00, 0x05, 0x78, 0x32, 0x79, 0x36, 0x7a, 0x3a, 0x78, 0x1b, + 0x80, 0x80, 0x0c, 0x79, 0x11, 0x08, 0x00, 0x05, 0x79, 0x2c, 0x39, 0x00, + 0x80, 0x00, 0x20, 0x04, 0x08, 0x0c, 0x0d, 0x85, 0x70, 0x37, 0x00, 0x01, + 0x71, 0x50, 0x70, 0x37, 0x00, 0x02, 0x70, 0x50, 0x20, 0x60, 0xd1, 0xbc, + 0x11, 0x10, 0x70, 0x54, 0x20, 0x60, 0x91, 0x8c, 0xff, 0x00, 0x91, 0x86, + 0x05, 0x00, 0x01, 0x10, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x00, 0x06, + 0x00, 0x46, 0x00, 0xe6, 0x20, 0x71, 0x02, 0x00, 0x70, 0x37, 0x00, 0x02, + 0x70, 0x58, 0x90, 0x84, 0xff, 0x00, 0x80, 0x07, 0x90, 0x86, 0x00, 0xbc, + 0x11, 0x58, 0x20, 0x21, 0x1a, 0x7e, 0x24, 0x04, 0x80, 0x00, 0x02, 0x08, + 0x20, 0x22, 0x08, 0x0c, 0x82, 0xb8, 0x08, 0x0c, 0x1b, 0x1e, 0x90, 0x06, + 0x00, 0xee, 0x00, 0x4e, 0x00, 0x0e, 0x00, 0x05, 0x0c, 0x11, 0x11, 0x08, + 0x00, 0x05, 0x00, 0xe6, 0x00, 0x16, 0x20, 0x71, 0x02, 0x00, 0x08, 0x41, + 0x61, 0x24, 0xd1, 0xdc, 0x01, 0xf8, 0x70, 0x1c, 0xd0, 0x8c, 0x09, 0x04, + 0x17, 0xa2, 0x70, 0x17, 0x00, 0x00, 0x20, 0x01, 0x02, 0x64, 0x20, 0x04, + 0xd0, 0xbc, 0x09, 0x04, 0x17, 0xa2, 0x20, 0x01, 0x02, 0x68, 0x00, 0xc6, + 0x20, 0x64, 0x61, 0x04, 0x60, 0x38, 0x00, 0xce, 0x91, 0x8e, 0x00, 0x39, + 0x19, 0x04, 0x17, 0xa2, 0x9c, 0x06, 0x15, 0xf0, 0x01, 0x26, 0x20, 0x91, + 0x26, 0x00, 0x08, 0x0c, 0x82, 0x10, 0x01, 0x2e, 0x73, 0x58, 0x74, 0x5c, + 0x60, 0x14, 0x90, 0x5d, 0x05, 0x98, 0x2b, 0x48, 0x60, 0x10, 0x00, 0xb6, + 0x20, 0x58, 0xb8, 0x00, 0x00, 0xbe, 0xd0, 0xbc, 0x19, 0x0c, 0xd2, 0xf9, + 0xab, 0x42, 0xac, 0x3e, 0x20, 0x01, 0x18, 0x69, 0x20, 0x04, 0xd0, 0xb4, + 0x11, 0x70, 0x60, 0x1c, 0xd0, 0xe4, 0x11, 0x58, 0x60, 0x10, 0x00, 0xb6, + 0x20, 0x58, 0xb8, 0x00, 0x00, 0xbe, 0xd0, 0xbc, 0x11, 0x20, 0xa8, 0x3b, + 0x7f, 0xff, 0xa8, 0x37, 0xff, 0xff, 0x08, 0x0c, 0x1e, 0xe1, 0x11, 0x90, + 0x08, 0x0c, 0x19, 0x9f, 0x2a, 0x00, 0xa8, 0x16, 0x01, 0x30, 0x28, 0x00, + 0xa8, 0x0e, 0x2c, 0x05, 0xa8, 0x0a, 0x2c, 0x00, 0xa8, 0x12, 0x70, 0x37, + 0x00, 0x20, 0x78, 0x1f, 0x03, 0x00, 0x00, 0x1e, 0x00, 0xee, 0x00, 0x05, + 0x70, 0x37, 0x00, 0x50, 0x70, 0x37, 0x00, 0x20, 0x00, 0x1e, 0x00, 0xee, + 0x08, 0x0c, 0x16, 0x48, 0x00, 0x05, 0x08, 0x0c, 0x0d, 0x85, 0x20, 0x01, + 0x18, 0x0d, 0x20, 0x04, 0xd0, 0x8c, 0x19, 0x0c, 0x6c, 0xcc, 0x2c, 0xf0, + 0x01, 0x26, 0x20, 0x91, 0x22, 0x00, 0x00, 0x16, 0x00, 0xc6, 0x3e, 0x60, + 0x60, 0x14, 0x20, 0x48, 0x29, 0x40, 0x90, 0x3e, 0x27, 0x30, 0xa8, 0x64, + 0x20, 0x68, 0xa8, 0x1a, 0x9d, 0x84, 0x00, 0x0f, 0x90, 0x88, 0x1e, 0xc1, + 0x21, 0x65, 0x00, 0x02, 0x17, 0xdf, 0x18, 0x4d, 0x17, 0xdf, 0x17, 0xdf, + 0x17, 0xe3, 0x18, 0x2e, 0x17, 0xdf, 0x18, 0x03, 0x17, 0xd8, 0x18, 0x44, + 0x17, 0xdf, 0x17, 0xdf, 0x17, 0xe8, 0x19, 0x3a, 0x18, 0x17, 0x18, 0x0d, + 0xa9, 0x64, 0x91, 0x8c, 0x00, 0xff, 0x91, 0x8e, 0x00, 0x48, 0x09, 0x04, + 0x18, 0x44, 0x90, 0x85, 0x00, 0x01, 0x08, 0x04, 0x19, 0x30, 0xa8, 0x7c, + 0xd0, 0xac, 0x0d, 0xc8, 0x08, 0x04, 0x18, 0x54, 0xa8, 0x7c, 0xd0, 0xac, + 0x0d, 0xa0, 0x08, 0x04, 0x18, 0xbf, 0xa8, 0x98, 0x90, 0x1d, 0x11, 0x08, + 0xab, 0x9c, 0x90, 0x16, 0xaa, 0xb2, 0xaa, 0x3e, 0xaa, 0x42, 0x3e, 0x00, + 0x90, 0x80, 0x00, 0x08, 0x20, 0x04, 0x90, 0x80, 0x95, 0x36, 0x20, 0x05, + 0x90, 0x05, 0x09, 0x0c, 0x0d, 0x85, 0x20, 0x04, 0xa8, 0xae, 0x08, 0x04, + 0x19, 0x18, 0xa8, 0x7c, 0xd0, 0xbc, 0x09, 0xc8, 0xa8, 0x90, 0xa8, 0x42, + 0xa8, 0x8c, 0xa8, 0x3e, 0xa8, 0x88, 0x08, 0x04, 0x18, 0x54, 0xa8, 0x7c, + 0xd0, 0xbc, 0x09, 0x78, 0xa8, 0x90, 0xa8, 0x42, 0xa8, 0x8c, 0xa8, 0x3e, + 0xa8, 0x88, 0x08, 0x04, 0x18, 0xbf, 0xa8, 0x7c, 0xd0, 0xbc, 0x09, 0x28, + 0xa8, 0x90, 0xa8, 0x42, 0xa8, 0x8c, 0xa8, 0x3e, 0xa8, 0x04, 0x90, 0x45, + 0x09, 0x0c, 0x0d, 0x85, 0xa1, 0x64, 0xa9, 0x1a, 0x91, 0xec, 0x00, 0x0f, + 0x9d, 0x80, 0x1e, 0xc1, 0x20, 0x65, 0xa8, 0x88, 0xd1, 0x9c, 0x19, 0x04, + 0x18, 0xbf, 0x04, 0x30, 0xa8, 0x7c, 0xd0, 0xac, 0x09, 0x04, 0x17, 0xdf, + 0xa8, 0x04, 0x90, 0x45, 0x09, 0x0c, 0x0d, 0x85, 0xa1, 0x64, 0xa9, 0x1a, + 0x91, 0xec, 0x00, 0x0f, 0x9d, 0x80, 0x1e, 0xc1, 0x20, 0x65, 0x90, 0x06, + 0xa8, 0x42, 0xa8, 0x3e, 0xd1, 0x9c, 0x19, 0x04, 0x18, 0xbf, 0x00, 0x80, + 0xa8, 0x7c, 0xd0, 0xac, 0x09, 0x04, 0x17, 0xdf, 0x90, 0x06, 0xa8, 0x42, + 0xa8, 0x3e, 0x08, 0x04, 0x18, 0xbf, 0xa8, 0x7c, 0xd0, 0xac, 0x09, 0x04, + 0x17, 0xdf, 0x90, 0x06, 0xa8, 0x42, 0xa8, 0x3e, 0x2c, 0x05, 0x90, 0x8a, + 0x00, 0x36, 0x1a, 0x0c, 0x0d, 0x85, 0x90, 0x82, 0x00, 0x1b, 0x00, 0x02, + 0x18, 0x77, 0x18, 0x77, 0x18, 0x79, 0x18, 0x77, 0x18, 0x77, 0x18, 0x77, + 0x18, 0x83, 0x18, 0x77, 0x18, 0x77, 0x18, 0x77, 0x18, 0x8d, 0x18, 0x77, + 0x18, 0x77, 0x18, 0x77, 0x18, 0x97, 0x18, 0x77, 0x18, 0x77, 0x18, 0x77, + 0x18, 0xa1, 0x18, 0x77, 0x18, 0x77, 0x18, 0x77, 0x18, 0xab, 0x18, 0x77, + 0x18, 0x77, 0x18, 0x77, 0x18, 0xb5, 0x08, 0x0c, 0x0d, 0x85, 0xa5, 0x74, + 0xa4, 0x78, 0x9d, 0x86, 0x00, 0x24, 0x09, 0x04, 0x17, 0xed, 0xa3, 0x7c, + 0xa2, 0x80, 0x08, 0x04, 0x19, 0x18, 0xa5, 0x84, 0xa4, 0x88, 0x9d, 0x86, + 0x00, 0x24, 0x09, 0x04, 0x17, 0xed, 0xa3, 0x8c, 0xa2, 0x90, 0x08, 0x04, + 0x19, 0x18, 0xa5, 0x94, 0xa4, 0x98, 0x9d, 0x86, 0x00, 0x24, 0x09, 0x04, + 0x17, 0xed, 0xa3, 0x9c, 0xa2, 0xa0, 0x08, 0x04, 0x19, 0x18, 0xa5, 0xa4, + 0xa4, 0xa8, 0x9d, 0x86, 0x00, 0x24, 0x09, 0x04, 0x17, 0xed, 0xa3, 0xac, + 0xa2, 0xb0, 0x08, 0x04, 0x19, 0x18, 0xa5, 0xb4, 0xa4, 0xb8, 0x9d, 0x86, + 0x00, 0x24, 0x09, 0x04, 0x17, 0xed, 0xa3, 0xbc, 0xa2, 0xc0, 0x08, 0x04, + 0x19, 0x18, 0xa5, 0xc4, 0xa4, 0xc8, 0x9d, 0x86, 0x00, 0x24, 0x09, 0x04, + 0x17, 0xed, 0xa3, 0xcc, 0xa2, 0xd0, 0x08, 0x04, 0x19, 0x18, 0xa5, 0xd4, + 0xa4, 0xd8, 0x9d, 0x86, 0x00, 0x24, 0x09, 0x04, 0x17, 0xed, 0xa3, 0xdc, + 0xa2, 0xe0, 0x08, 0x04, 0x19, 0x18, 0x2c, 0x05, 0x90, 0x8a, 0x00, 0x34, + 0x1a, 0x0c, 0x0d, 0x85, 0x90, 0x82, 0x00, 0x1b, 0x00, 0x02, 0x18, 0xe2, + 0x18, 0xe0, 0x18, 0xe0, 0x18, 0xe0, 0x18, 0xe0, 0x18, 0xe0, 0x18, 0xed, + 0x18, 0xe0, 0x18, 0xe0, 0x18, 0xe0, 0x18, 0xe0, 0x18, 0xe0, 0x18, 0xf8, + 0x18, 0xe0, 0x18, 0xe0, 0x18, 0xe0, 0x18, 0xe0, 0x18, 0xe0, 0x19, 0x03, + 0x18, 0xe0, 0x18, 0xe0, 0x18, 0xe0, 0x18, 0xe0, 0x18, 0xe0, 0x19, 0x0e, + 0x08, 0x0c, 0x0d, 0x85, 0xa5, 0x6c, 0xa4, 0x70, 0xa7, 0x74, 0xa6, 0x78, + 0x9d, 0x86, 0x00, 0x2c, 0x09, 0x04, 0x17, 0xed, 0xa3, 0x7c, 0xa2, 0x80, + 0x04, 0x58, 0xa5, 0x84, 0xa4, 0x88, 0xa7, 0x8c, 0xa6, 0x90, 0x9d, 0x86, + 0x00, 0x2c, 0x09, 0x04, 0x17, 0xed, 0xa3, 0x94, 0xa2, 0x98, 0x04, 0x00, + 0xa5, 0x9c, 0xa4, 0xa0, 0xa7, 0xa4, 0xa6, 0xa8, 0x9d, 0x86, 0x00, 0x2c, + 0x09, 0x04, 0x17, 0xed, 0xa3, 0xac, 0xa2, 0xb0, 0x00, 0xa8, 0xa5, 0xb4, + 0xa4, 0xb8, 0xa7, 0xbc, 0xa6, 0xc0, 0x9d, 0x86, 0x00, 0x2c, 0x09, 0x04, + 0x17, 0xed, 0xa3, 0xc4, 0xa2, 0xc8, 0x00, 0x50, 0xa5, 0xcc, 0xa4, 0xd0, + 0xa7, 0xd4, 0xa6, 0xd8, 0x9d, 0x86, 0x00, 0x2c, 0x09, 0x04, 0x17, 0xed, + 0xa3, 0xdc, 0xa2, 0xe0, 0xab, 0x2e, 0xaa, 0x32, 0xad, 0x1e, 0xac, 0x22, + 0xaf, 0x26, 0xae, 0x2a, 0xa9, 0x88, 0x8c, 0x60, 0x2c, 0x1d, 0xa8, 0xac, + 0xaa, 0xb0, 0xa8, 0x36, 0xaa, 0x3a, 0x81, 0x09, 0xa9, 0x16, 0x11, 0x60, + 0x3e, 0x60, 0x60, 0x1c, 0xc0, 0x85, 0x60, 0x1e, 0xa8, 0x7c, 0xc0, 0xdd, + 0xa8, 0x7e, 0x90, 0x06, 0x00, 0xce, 0x00, 0x1e, 0x01, 0x2e, 0x00, 0x05, + 0x28, 0x00, 0xa8, 0x0e, 0xab, 0x0a, 0x2c, 0x00, 0xa8, 0x12, 0x0c, 0x70, + 0x08, 0x04, 0x17, 0xdf, 0x20, 0x01, 0x18, 0x0d, 0x20, 0x04, 0xd0, 0x8c, + 0x19, 0x0c, 0x6c, 0xcc, 0x2f, 0xf0, 0x01, 0x26, 0x20, 0x91, 0x22, 0x00, + 0x00, 0x16, 0x00, 0xc6, 0x3e, 0x60, 0x60, 0x14, 0x20, 0x48, 0x29, 0x40, + 0xa8, 0x0e, 0x20, 0x61, 0x1e, 0xbc, 0xa8, 0x13, 0x1e, 0xbc, 0x2c, 0x05, + 0xa8, 0x0a, 0xa9, 0x64, 0xa9, 0x1a, 0xa8, 0x7c, 0xd0, 0xac, 0x09, 0x0c, + 0x0d, 0x85, 0x90, 0x06, 0xa8, 0x42, 0xa8, 0x3e, 0x2c, 0x05, 0x90, 0x8a, + 0x00, 0x34, 0x1a, 0x0c, 0x0d, 0x85, 0xad, 0xcc, 0xac, 0xd0, 0xaf, 0xd4, + 0xae, 0xd8, 0xab, 0xdc, 0xaa, 0xe0, 0xab, 0x2e, 0xaa, 0x32, 0xad, 0x1e, + 0xac, 0x22, 0xaf, 0x26, 0xae, 0x2a, 0xa8, 0xac, 0xaa, 0xb0, 0xa8, 0x36, + 0xaa, 0x3a, 0xa9, 0x88, 0xa8, 0x64, 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, + 0x00, 0x08, 0x11, 0x20, 0x81, 0x09, 0xa9, 0x16, 0x01, 0x28, 0x00, 0x80, + 0x91, 0x8a, 0x00, 0x02, 0xa9, 0x16, 0x11, 0x60, 0x3e, 0x60, 0x60, 0x1c, + 0xc0, 0x85, 0x60, 0x1e, 0xa8, 0x7c, 0xc0, 0xdd, 0xa8, 0x7e, 0x90, 0x06, + 0x00, 0xce, 0x00, 0x1e, 0x01, 0x2e, 0x00, 0x05, 0xa8, 0x04, 0x90, 0x45, + 0x09, 0x0c, 0x0d, 0x85, 0xa8, 0x0e, 0xa0, 0x64, 0xa8, 0x1a, 0x90, 0x84, + 0x00, 0x0f, 0x90, 0x80, 0x1e, 0xc1, 0x20, 0x15, 0x82, 0xff, 0x09, 0x0c, + 0x0d, 0x85, 0xaa, 0x12, 0x22, 0x05, 0xa8, 0x0a, 0x0c, 0x08, 0x90, 0x3e, + 0x27, 0x30, 0xa8, 0x80, 0xd0, 0xfc, 0x11, 0x90, 0x2d, 0x00, 0x00, 0x02, + 0x1a, 0x94, 0x19, 0xf6, 0x19, 0xf6, 0x1a, 0x94, 0x1a, 0x94, 0x1a, 0x8e, + 0x1a, 0x94, 0x19, 0xf6, 0x1a, 0x45, 0x1a, 0x45, 0x1a, 0x45, 0x1a, 0x94, + 0x1a, 0x94, 0x1a, 0x94, 0x1a, 0x8b, 0x1a, 0x45, 0xc0, 0xfc, 0xa8, 0x82, + 0xab, 0x2c, 0xaa, 0x30, 0xad, 0x1c, 0xac, 0x20, 0xdd, 0x9c, 0x09, 0x04, + 0x1a, 0x96, 0x2c, 0x05, 0x90, 0x8a, 0x00, 0x34, 0x1a, 0x0c, 0x0d, 0x85, + 0x90, 0x82, 0x00, 0x1b, 0x00, 0x02, 0x19, 0xe2, 0x19, 0xe0, 0x19, 0xe0, + 0x19, 0xe0, 0x19, 0xe0, 0x19, 0xe0, 0x19, 0xe6, 0x19, 0xe0, 0x19, 0xe0, + 0x19, 0xe0, 0x19, 0xe0, 0x19, 0xe0, 0x19, 0xea, 0x19, 0xe0, 0x19, 0xe0, + 0x19, 0xe0, 0x19, 0xe0, 0x19, 0xe0, 0x19, 0xee, 0x19, 0xe0, 0x19, 0xe0, + 0x19, 0xe0, 0x19, 0xe0, 0x19, 0xe0, 0x19, 0xf2, 0x08, 0x0c, 0x0d, 0x85, + 0xa7, 0x74, 0xa6, 0x78, 0x08, 0x04, 0x1a, 0x96, 0xa7, 0x8c, 0xa6, 0x90, + 0x08, 0x04, 0x1a, 0x96, 0xa7, 0xa4, 0xa6, 0xa8, 0x08, 0x04, 0x1a, 0x96, + 0xa7, 0xbc, 0xa6, 0xc0, 0x08, 0x04, 0x1a, 0x96, 0xa7, 0xd4, 0xa6, 0xd8, + 0x08, 0x04, 0x1a, 0x96, 0x2c, 0x05, 0x90, 0x8a, 0x00, 0x36, 0x1a, 0x0c, + 0x0d, 0x85, 0x90, 0x82, 0x00, 0x1b, 0x00, 0x02, 0x1a, 0x19, 0x1a, 0x19, + 0x1a, 0x1b, 0x1a, 0x19, 0x1a, 0x19, 0x1a, 0x19, 0x1a, 0x21, 0x1a, 0x19, + 0x1a, 0x19, 0x1a, 0x19, 0x1a, 0x27, 0x1a, 0x19, 0x1a, 0x19, 0x1a, 0x19, + 0x1a, 0x2d, 0x1a, 0x19, 0x1a, 0x19, 0x1a, 0x19, 0x1a, 0x33, 0x1a, 0x19, + 0x1a, 0x19, 0x1a, 0x19, 0x1a, 0x39, 0x1a, 0x19, 0x1a, 0x19, 0x1a, 0x19, + 0x1a, 0x3f, 0x08, 0x0c, 0x0d, 0x85, 0xa5, 0x74, 0xa4, 0x78, 0xa3, 0x7c, + 0xa2, 0x80, 0x08, 0x04, 0x1a, 0x96, 0xa5, 0x84, 0xa4, 0x88, 0xa3, 0x8c, + 0xa2, 0x90, 0x08, 0x04, 0x1a, 0x96, 0xa5, 0x94, 0xa4, 0x98, 0xa3, 0x9c, + 0xa2, 0xa0, 0x08, 0x04, 0x1a, 0x96, 0xa5, 0xa4, 0xa4, 0xa8, 0xa3, 0xac, + 0xa2, 0xb0, 0x08, 0x04, 0x1a, 0x96, 0xa5, 0xb4, 0xa4, 0xb8, 0xa3, 0xbc, + 0xa2, 0xc0, 0x08, 0x04, 0x1a, 0x96, 0xa5, 0xc4, 0xa4, 0xc8, 0xa3, 0xcc, + 0xa2, 0xd0, 0x08, 0x04, 0x1a, 0x96, 0xa5, 0xd4, 0xa4, 0xd8, 0xa3, 0xdc, + 0xa2, 0xe0, 0x08, 0x04, 0x1a, 0x96, 0x2c, 0x05, 0x90, 0x8a, 0x00, 0x34, + 0x1a, 0x0c, 0x0d, 0x85, 0x90, 0x82, 0x00, 0x1b, 0x00, 0x02, 0x1a, 0x68, + 0x1a, 0x66, 0x1a, 0x66, 0x1a, 0x66, 0x1a, 0x66, 0x1a, 0x66, 0x1a, 0x6f, + 0x1a, 0x66, 0x1a, 0x66, 0x1a, 0x66, 0x1a, 0x66, 0x1a, 0x66, 0x1a, 0x76, + 0x1a, 0x66, 0x1a, 0x66, 0x1a, 0x66, 0x1a, 0x66, 0x1a, 0x66, 0x1a, 0x7d, + 0x1a, 0x66, 0x1a, 0x66, 0x1a, 0x66, 0x1a, 0x66, 0x1a, 0x66, 0x1a, 0x84, + 0x08, 0x0c, 0x0d, 0x85, 0xa5, 0x6c, 0xa4, 0x70, 0xa7, 0x74, 0xa6, 0x78, + 0xa3, 0x7c, 0xa2, 0x80, 0x04, 0x38, 0xa5, 0x84, 0xa4, 0x88, 0xa7, 0x8c, + 0xa6, 0x90, 0xa3, 0x94, 0xa2, 0x98, 0x04, 0x00, 0xa5, 0x9c, 0xa4, 0xa0, + 0xa7, 0xa4, 0xa6, 0xa8, 0xa3, 0xac, 0xa2, 0xb0, 0x00, 0xc8, 0xa5, 0xb4, + 0xa4, 0xb8, 0xa7, 0xbc, 0xa6, 0xc0, 0xa3, 0xc4, 0xa2, 0xc8, 0x00, 0x90, + 0xa5, 0xcc, 0xa4, 0xd0, 0xa7, 0xd4, 0xa6, 0xd8, 0xa3, 0xdc, 0xa2, 0xe0, + 0x00, 0x58, 0x9d, 0x86, 0x00, 0x0e, 0x11, 0x30, 0x08, 0x0c, 0x1e, 0x97, + 0x19, 0x04, 0x19, 0x9f, 0x90, 0x0e, 0x00, 0x50, 0x08, 0x0c, 0x0d, 0x85, + 0xab, 0x2e, 0xaa, 0x32, 0xad, 0x1e, 0xac, 0x22, 0xaf, 0x26, 0xae, 0x2a, + 0x08, 0x0c, 0x1e, 0x97, 0x00, 0x05, 0x60, 0x14, 0x20, 0x48, 0x61, 0x18, + 0x81, 0xff, 0x01, 0x48, 0x81, 0x0c, 0x81, 0x0c, 0x81, 0x0c, 0x81, 0xff, + 0x11, 0x18, 0xa8, 0x87, 0x00, 0x01, 0x00, 0x08, 0xa9, 0x86, 0x60, 0x1b, + 0x00, 0x02, 0xa8, 0x74, 0x90, 0x84, 0x00, 0xff, 0x90, 0x84, 0x00, 0x08, + 0x01, 0x50, 0x00, 0xe9, 0x60, 0x00, 0x90, 0x86, 0x00, 0x04, 0x11, 0x20, + 0x20, 0x09, 0x00, 0x48, 0x08, 0x0c, 0xb2, 0x0a, 0x00, 0x05, 0xa9, 0x74, + 0xd1, 0xdc, 0x11, 0x08, 0x00, 0x05, 0xa9, 0x34, 0xa8, 0x8c, 0x91, 0x06, + 0x11, 0x58, 0xa9, 0x38, 0xa8, 0x90, 0x91, 0x06, 0x11, 0x38, 0x60, 0x1c, + 0xc0, 0x84, 0x60, 0x1e, 0x20, 0x09, 0x00, 0x48, 0x08, 0x04, 0xb2, 0x0a, + 0x00, 0x05, 0x01, 0x26, 0x00, 0xc6, 0x20, 0x91, 0x22, 0x00, 0x00, 0xce, + 0x79, 0x08, 0x91, 0x8c, 0x00, 0x07, 0x91, 0x86, 0x00, 0x00, 0x05, 0xb0, + 0x91, 0x86, 0x00, 0x03, 0x05, 0x98, 0x60, 0x20, 0x60, 0x23, 0x00, 0x00, + 0x00, 0x06, 0x20, 0x31, 0x00, 0x08, 0x00, 0xc6, 0x78, 0x1f, 0x08, 0x08, + 0x78, 0x08, 0xd0, 0x9c, 0x01, 0x20, 0x08, 0x0c, 0x13, 0xd4, 0x86, 0x31, + 0x1d, 0xb8, 0x00, 0xce, 0x78, 0x1f, 0x08, 0x00, 0x20, 0x31, 0x01, 0x68, + 0x00, 0xc6, 0x78, 0x08, 0xd0, 0x9c, 0x19, 0x0c, 0x13, 0xd4, 0x00, 0xce, + 0x20, 0x01, 0x00, 0x38, 0x08, 0x0c, 0x1b, 0xae, 0x79, 0x30, 0x91, 0x86, + 0x00, 0x40, 0x01, 0x60, 0x91, 0x86, 0x00, 0x42, 0x19, 0x0c, 0x0d, 0x85, + 0x20, 0x01, 0x00, 0x1e, 0x80, 0x01, 0x1d, 0xf0, 0x86, 0x31, 0x1d, 0x40, + 0x08, 0x0c, 0x1b, 0xbd, 0x00, 0x0e, 0x60, 0x22, 0x01, 0x2e, 0x00, 0x05, + 0x08, 0x0c, 0x1b, 0xaa, 0x78, 0x27, 0x00, 0x15, 0x78, 0x28, 0x9c, 0x06, + 0x1d, 0xb8, 0x78, 0x2b, 0x00, 0x00, 0x0c, 0xa0, 0x00, 0xf6, 0x20, 0x79, + 0x03, 0x00, 0x78, 0x03, 0x00, 0x00, 0x78, 0xab, 0x00, 0x04, 0x20, 0x01, + 0xf0, 0x00, 0x80, 0x01, 0x09, 0x0c, 0x0d, 0x85, 0x7a, 0xac, 0xd2, 0xac, + 0x1d, 0xd0, 0x00, 0xfe, 0x08, 0x0c, 0x77, 0x9e, 0x11, 0x88, 0x20, 0x01, + 0x01, 0x38, 0x20, 0x03, 0x00, 0x00, 0x20, 0x01, 0x01, 0x60, 0x20, 0x03, + 0x00, 0x00, 0x20, 0x11, 0x01, 0x2c, 0xa0, 0x01, 0xa0, 0x01, 0x82, 0x11, + 0x1d, 0xe0, 0x00, 0x59, 0x08, 0x04, 0x78, 0x40, 0x04, 0x79, 0x00, 0x39, + 0x20, 0x01, 0x01, 0x60, 0x25, 0x02, 0x20, 0x01, 0x01, 0x38, 0x22, 0x02, + 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0x02, 0x00, 0x08, 0x0c, 0x2a, 0x8b, + 0x20, 0x09, 0x00, 0x3c, 0x08, 0x0c, 0x22, 0x20, 0x20, 0x01, 0x01, 0x5d, + 0x20, 0x03, 0x00, 0x00, 0x70, 0x00, 0x90, 0x84, 0x00, 0x3c, 0x1d, 0xe0, + 0x08, 0x0c, 0x88, 0x99, 0x70, 0xa0, 0x70, 0xa2, 0x70, 0x98, 0x70, 0x9a, + 0x70, 0x9c, 0x70, 0x9e, 0x20, 0x01, 0x02, 0x0d, 0x20, 0x03, 0x00, 0x20, + 0x00, 0xf6, 0x20, 0x79, 0x03, 0x00, 0x08, 0x0c, 0x13, 0x66, 0x78, 0x03, + 0x00, 0x01, 0x00, 0xfe, 0x00, 0xee, 0x00, 0x05, 0x20, 0x01, 0x01, 0x38, + 0x20, 0x14, 0x20, 0x03, 0x00, 0x00, 0x20, 0x01, 0x01, 0x60, 0x20, 0x2c, + 0x20, 0x03, 0x00, 0x00, 0x08, 0x0c, 0x77, 0x9e, 0x11, 0x08, 0x00, 0x05, + 0x20, 0x21, 0x02, 0x60, 0x20, 0x01, 0x01, 0x41, 0x20, 0x1c, 0xd3, 0xdc, + 0x11, 0x68, 0x20, 0x01, 0x01, 0x09, 0x20, 0x1c, 0x93, 0x9c, 0x00, 0x48, + 0x11, 0x60, 0x20, 0x01, 0x01, 0x11, 0x20, 0x1c, 0x83, 0xff, 0x11, 0x10, + 0x84, 0x21, 0x1d, 0x70, 0x20, 0x01, 0x01, 0x5d, 0x20, 0x03, 0x00, 0x00, + 0x00, 0x05, 0x00, 0x46, 0x20, 0x21, 0x00, 0x19, 0x20, 0x03, 0x00, 0x48, + 0xa0, 0x01, 0xa0, 0x01, 0x20, 0x1c, 0x93, 0x9c, 0x00, 0x48, 0x01, 0x20, + 0x84, 0x21, 0x1d, 0xb0, 0x00, 0x4e, 0x0c, 0x60, 0x00, 0x4e, 0x0c, 0x40, + 0x60, 0x1c, 0xc0, 0x84, 0x60, 0x1e, 0x00, 0x05, 0x2c, 0x08, 0x62, 0x1c, + 0x08, 0x0c, 0x16, 0xb9, 0x79, 0x30, 0x00, 0x05, 0x2c, 0x08, 0x62, 0x1c, + 0x08, 0x0c, 0x17, 0x02, 0x79, 0x30, 0x00, 0x05, 0x80, 0x01, 0x1d, 0xf0, + 0x00, 0x05, 0x20, 0x31, 0x00, 0x64, 0x78, 0x1c, 0x90, 0x84, 0x00, 0x07, + 0x01, 0x70, 0x20, 0x01, 0x00, 0x38, 0x0c, 0x41, 0x91, 0x86, 0x00, 0x40, + 0x09, 0x04, 0x1c, 0x1b, 0x20, 0x01, 0x00, 0x1e, 0x0c, 0x69, 0x86, 0x31, + 0x1d, 0x80, 0x08, 0x0c, 0x0d, 0x85, 0x78, 0x1f, 0x02, 0x02, 0x20, 0x01, + 0x01, 0x5d, 0x20, 0x03, 0x00, 0x00, 0x20, 0x01, 0x0d, 0xac, 0x0c, 0x01, + 0x78, 0x1c, 0xd0, 0x84, 0x01, 0x10, 0x08, 0x61, 0x04, 0xe0, 0x20, 0x01, + 0x00, 0x30, 0x08, 0x91, 0x91, 0x86, 0x00, 0x40, 0x05, 0x68, 0x78, 0x1c, + 0xd0, 0x84, 0x1d, 0xa8, 0x78, 0x1f, 0x01, 0x01, 0x20, 0x01, 0x00, 0x14, + 0x08, 0x69, 0x20, 0x01, 0x00, 0x37, 0x08, 0x21, 0x91, 0x86, 0x00, 0x40, + 0x01, 0x40, 0x20, 0x01, 0x00, 0x30, 0x08, 0x0c, 0x1b, 0xb4, 0x91, 0x86, + 0x00, 0x40, 0x19, 0x0c, 0x0d, 0x85, 0x00, 0xd6, 0x20, 0x69, 0x02, 0x00, + 0x69, 0x2c, 0xd1, 0xf4, 0x11, 0x70, 0xd1, 0xc4, 0x01, 0x60, 0xd1, 0x9c, + 0x01, 0x30, 0x68, 0x00, 0x90, 0x85, 0x18, 0x00, 0x68, 0x02, 0x00, 0xde, + 0x00, 0x80, 0x69, 0x08, 0x91, 0x84, 0x00, 0x07, 0x1d, 0xb0, 0x00, 0xde, + 0x78, 0x1f, 0x01, 0x00, 0x79, 0x1c, 0x91, 0x84, 0x00, 0x07, 0x09, 0x0c, + 0x0d, 0x85, 0xa0, 0x01, 0xa0, 0x01, 0x78, 0x1f, 0x02, 0x00, 0x00, 0x05, + 0x01, 0x26, 0x20, 0x91, 0x24, 0x00, 0x20, 0x79, 0x03, 0x80, 0x20, 0x01, + 0x19, 0xe8, 0x20, 0x70, 0x01, 0x2e, 0x00, 0x05, 0x2c, 0xf0, 0x01, 0x26, + 0x20, 0x91, 0x24, 0x00, 0x3e, 0x60, 0x60, 0x14, 0x20, 0x48, 0xa9, 0x64, + 0xa9, 0x1a, 0x91, 0x8c, 0x00, 0xff, 0x91, 0x84, 0x00, 0x0f, 0x00, 0x02, + 0x1c, 0x50, 0x1c, 0x50, 0x1c, 0x50, 0x1c, 0x52, 0x1c, 0x50, 0x1c, 0x50, + 0x1c, 0x50, 0x1c, 0x50, 0x1c, 0x44, 0x1c, 0x5a, 0x1c, 0x50, 0x1c, 0x56, + 0x1c, 0x50, 0x1c, 0x50, 0x1c, 0x50, 0x1c, 0x50, 0x90, 0x86, 0x00, 0x08, + 0x11, 0x48, 0xa8, 0x7c, 0xd0, 0xb4, 0x09, 0x04, 0x1d, 0xca, 0x20, 0x11, + 0x1e, 0xbc, 0x22, 0x05, 0xab, 0x88, 0x00, 0xa8, 0x08, 0x0c, 0x0d, 0x85, + 0x91, 0x86, 0x00, 0x13, 0x01, 0x28, 0x0c, 0xd0, 0x91, 0x86, 0x00, 0x1b, + 0x01, 0x08, 0x0c, 0xb0, 0xa8, 0x7c, 0xd0, 0xb4, 0x09, 0x04, 0x1d, 0xca, + 0x91, 0x84, 0x00, 0x0f, 0x90, 0x80, 0x1e, 0xc1, 0x20, 0x15, 0x22, 0x05, + 0xab, 0x88, 0x29, 0x08, 0xa8, 0x0a, 0xa9, 0x0e, 0xaa, 0x12, 0xab, 0x16, + 0x90, 0x06, 0xa8, 0x42, 0xa8, 0x3e, 0x01, 0x2e, 0x00, 0x05, 0x2c, 0xf0, + 0x01, 0x26, 0x20, 0x91, 0x24, 0x00, 0x3e, 0x60, 0x60, 0x14, 0x20, 0x48, + 0xa8, 0x8c, 0xa9, 0x90, 0xaa, 0xac, 0xab, 0xb0, 0xaa, 0x36, 0xab, 0x3a, + 0xa8, 0x3e, 0xa9, 0x42, 0xa8, 0x46, 0xa9, 0x4a, 0xa9, 0x64, 0x91, 0x8c, + 0x00, 0xff, 0x91, 0x86, 0x00, 0x1e, 0x01, 0x98, 0x29, 0x40, 0xa0, 0x64, + 0xa8, 0x1a, 0x90, 0xec, 0x00, 0x0f, 0x9d, 0x80, 0x1e, 0xc1, 0x20, 0x65, + 0x2c, 0x05, 0x28, 0x08, 0x2c, 0x10, 0xab, 0x88, 0xa8, 0x0a, 0xa9, 0x0e, + 0xaa, 0x12, 0xab, 0x16, 0x01, 0x2e, 0x3e, 0x60, 0x00, 0x05, 0xa8, 0x04, + 0x20, 0x40, 0x0c, 0x58, 0x2c, 0xf0, 0x01, 0x26, 0x20, 0x91, 0x24, 0x00, + 0x3e, 0x60, 0x60, 0x14, 0x20, 0x48, 0xa9, 0x7c, 0x29, 0x50, 0xd1, 0xdc, + 0x19, 0x04, 0x1d, 0x94, 0xc1, 0xdd, 0xa9, 0x7e, 0x90, 0x06, 0xa8, 0x42, + 0xa8, 0x3e, 0xa9, 0x88, 0x81, 0x09, 0xa9, 0x16, 0xa9, 0x64, 0xa9, 0x1a, + 0x91, 0x84, 0x00, 0x0f, 0x90, 0x88, 0x1e, 0xc1, 0x21, 0x45, 0x00, 0x02, + 0x1c, 0xc8, 0x1c, 0xd6, 0x1c, 0xc8, 0x1c, 0xc8, 0x1c, 0xc8, 0x1c, 0xca, + 0x1c, 0xc8, 0x1c, 0xc8, 0x1d, 0x2b, 0x1d, 0x2b, 0x1c, 0xc8, 0x1c, 0xc8, + 0x1c, 0xc8, 0x1d, 0x29, 0x1c, 0xc8, 0x1c, 0xc8, 0x08, 0x0c, 0x0d, 0x85, + 0xa8, 0x04, 0x20, 0x50, 0xb1, 0x64, 0xa9, 0x1a, 0x91, 0x84, 0x00, 0x0f, + 0x90, 0x80, 0x1e, 0xc1, 0x20, 0x45, 0xd1, 0x9c, 0x19, 0x04, 0x1d, 0x2b, + 0x90, 0x36, 0x26, 0x38, 0x28, 0x05, 0x90, 0x8a, 0x00, 0x36, 0x1a, 0x0c, + 0x0d, 0x85, 0x90, 0x82, 0x00, 0x1b, 0x00, 0x02, 0x1c, 0xfb, 0x1c, 0xfb, + 0x1c, 0xfd, 0x1c, 0xfb, 0x1c, 0xfb, 0x1c, 0xfb, 0x1d, 0x03, 0x1c, 0xfb, + 0x1c, 0xfb, 0x1c, 0xfb, 0x1d, 0x09, 0x1c, 0xfb, 0x1c, 0xfb, 0x1c, 0xfb, + 0x1d, 0x0f, 0x1c, 0xfb, 0x1c, 0xfb, 0x1c, 0xfb, 0x1d, 0x15, 0x1c, 0xfb, + 0x1c, 0xfb, 0x1c, 0xfb, 0x1d, 0x1b, 0x1c, 0xfb, 0x1c, 0xfb, 0x1c, 0xfb, + 0x1d, 0x21, 0x08, 0x0c, 0x0d, 0x85, 0xb5, 0x74, 0xb4, 0x78, 0xb3, 0x7c, + 0xb2, 0x80, 0x08, 0x04, 0x1d, 0x70, 0xb5, 0x84, 0xb4, 0x88, 0xb3, 0x8c, + 0xb2, 0x90, 0x08, 0x04, 0x1d, 0x70, 0xb5, 0x94, 0xb4, 0x98, 0xb3, 0x9c, + 0xb2, 0xa0, 0x08, 0x04, 0x1d, 0x70, 0xb5, 0xa4, 0xb4, 0xa8, 0xb3, 0xac, + 0xb2, 0xb0, 0x08, 0x04, 0x1d, 0x70, 0xb5, 0xb4, 0xb4, 0xb8, 0xb3, 0xbc, + 0xb2, 0xc0, 0x08, 0x04, 0x1d, 0x70, 0xb5, 0xc4, 0xb4, 0xc8, 0xb3, 0xcc, + 0xb2, 0xd0, 0x08, 0x04, 0x1d, 0x70, 0xb5, 0xd4, 0xb4, 0xd8, 0xb3, 0xdc, + 0xb2, 0xe0, 0x08, 0x04, 0x1d, 0x70, 0x08, 0x04, 0x1d, 0x70, 0x08, 0x0c, + 0x0d, 0x85, 0x28, 0x05, 0x90, 0x8a, 0x00, 0x34, 0x1a, 0x0c, 0x0d, 0x85, + 0x90, 0x82, 0x00, 0x1b, 0x00, 0x02, 0x1d, 0x4e, 0x1d, 0x4c, 0x1d, 0x4c, + 0x1d, 0x4c, 0x1d, 0x4c, 0x1d, 0x4c, 0x1d, 0x55, 0x1d, 0x4c, 0x1d, 0x4c, + 0x1d, 0x4c, 0x1d, 0x4c, 0x1d, 0x4c, 0x1d, 0x5c, 0x1d, 0x4c, 0x1d, 0x4c, + 0x1d, 0x4c, 0x1d, 0x4c, 0x1d, 0x4c, 0x1d, 0x63, 0x1d, 0x4c, 0x1d, 0x4c, + 0x1d, 0x4c, 0x1d, 0x4c, 0x1d, 0x4c, 0x1d, 0x6a, 0x08, 0x0c, 0x0d, 0x85, + 0xb5, 0x6c, 0xb4, 0x70, 0xb7, 0x74, 0xb6, 0x78, 0xb3, 0x7c, 0xb2, 0x80, + 0x00, 0xd8, 0xb5, 0x84, 0xb4, 0x88, 0xb7, 0x8c, 0xb6, 0x90, 0xb3, 0x94, + 0xb2, 0x98, 0x00, 0xa0, 0xb5, 0x9c, 0xb4, 0xa0, 0xb7, 0xa4, 0xb6, 0xa8, + 0xb3, 0xac, 0xb2, 0xb0, 0x00, 0x68, 0xb5, 0xb4, 0xb4, 0xb8, 0xb7, 0xbc, + 0xb6, 0xc0, 0xb3, 0xc4, 0xb2, 0xc8, 0x00, 0x30, 0xb5, 0xcc, 0xb4, 0xd0, + 0xb7, 0xd4, 0xb6, 0xd8, 0xb3, 0xdc, 0xb2, 0xe0, 0xab, 0x2e, 0xaa, 0x32, + 0xad, 0x1e, 0xac, 0x22, 0xaf, 0x26, 0xae, 0x2a, 0xa9, 0x88, 0x81, 0x09, + 0xa9, 0x16, 0x11, 0x18, 0x90, 0x06, 0x01, 0x2e, 0x00, 0x05, 0x88, 0x40, + 0x28, 0x05, 0x90, 0x05, 0x11, 0x68, 0xb0, 0x04, 0x90, 0x05, 0x09, 0x0c, + 0x0d, 0x85, 0x20, 0x50, 0xb1, 0x64, 0xa9, 0x1a, 0x91, 0x84, 0x00, 0x0f, + 0x90, 0x80, 0x1e, 0xc1, 0x20, 0x45, 0x28, 0x05, 0x28, 0x10, 0x2a, 0x08, + 0xa8, 0x0a, 0xa9, 0x0e, 0xaa, 0x12, 0x0c, 0x30, 0x3e, 0x60, 0x63, 0x44, + 0xd3, 0xfc, 0x19, 0x0c, 0x0d, 0x85, 0xa9, 0x3c, 0xaa, 0x40, 0xa8, 0x44, + 0x91, 0x06, 0x11, 0x18, 0xa8, 0x48, 0x92, 0x06, 0x05, 0x08, 0x29, 0x58, + 0xab, 0x48, 0xac, 0x44, 0x29, 0x40, 0x08, 0x0c, 0x1e, 0xe1, 0x19, 0x98, + 0x28, 0x50, 0x2c, 0x40, 0xab, 0x14, 0xa8, 0x80, 0xd0, 0xfc, 0x11, 0x40, + 0xa8, 0x10, 0x20, 0x05, 0xa8, 0x0a, 0x2a, 0x00, 0xa8, 0x0e, 0x20, 0x09, + 0x80, 0x15, 0x00, 0x70, 0x00, 0xc6, 0x3e, 0x60, 0x60, 0x44, 0xc0, 0xa4, + 0x90, 0x85, 0x80, 0x05, 0x60, 0x46, 0x00, 0xce, 0x83, 0x19, 0xab, 0x16, + 0x19, 0x04, 0x1d, 0x7d, 0x20, 0x09, 0x80, 0x05, 0x3e, 0x60, 0x60, 0x44, + 0x91, 0x05, 0x60, 0x46, 0x08, 0x04, 0x1d, 0x7a, 0x08, 0x0c, 0x0d, 0x85, + 0x00, 0xf6, 0x00, 0xe6, 0x00, 0x96, 0x00, 0xc6, 0x00, 0x26, 0x70, 0x4c, + 0x9c, 0x06, 0x19, 0x0c, 0x0d, 0x85, 0x20, 0x79, 0x00, 0x90, 0x20, 0x01, + 0x01, 0x05, 0x20, 0x03, 0x00, 0x10, 0x78, 0x2b, 0x00, 0x04, 0x70, 0x57, + 0x00, 0x00, 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0xcf, 0x1b, 0x01, 0x18, + 0xa8, 0x80, 0xc0, 0xbd, 0xa8, 0x82, 0x60, 0x20, 0x90, 0x86, 0x00, 0x06, + 0x11, 0x70, 0x20, 0x61, 0x01, 0x00, 0x62, 0xc8, 0x20, 0x01, 0x00, 0xfa, + 0x80, 0x01, 0x1d, 0xf0, 0x60, 0xc8, 0x92, 0x06, 0x1d, 0xc0, 0x60, 0xc4, + 0xa8, 0x9a, 0x60, 0xc8, 0xa8, 0x96, 0x70, 0x4c, 0x20, 0x60, 0x00, 0xc6, + 0x08, 0x0c, 0xca, 0xe9, 0x08, 0x0c, 0xac, 0xfc, 0x00, 0xce, 0x70, 0x4c, + 0x9c, 0x06, 0x11, 0x50, 0x20, 0x09, 0x00, 0x40, 0x08, 0x0c, 0x22, 0x20, + 0x08, 0x0c, 0xa7, 0xa1, 0x20, 0x11, 0x00, 0x00, 0x08, 0x0c, 0xa6, 0x35, + 0x00, 0x2e, 0x00, 0xce, 0x00, 0x9e, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, + 0x00, 0xf6, 0x20, 0x79, 0x00, 0x90, 0x78, 0x1c, 0x00, 0x06, 0x78, 0x18, + 0x00, 0x06, 0x20, 0x79, 0x01, 0x00, 0x7a, 0x14, 0x92, 0x84, 0x19, 0x84, + 0x90, 0x85, 0x00, 0x12, 0x78, 0x16, 0x20, 0x19, 0x10, 0x00, 0x83, 0x19, + 0x09, 0x0c, 0x0d, 0x85, 0x78, 0x20, 0xd0, 0xbc, 0x1d, 0xd0, 0x79, 0xc8, + 0x00, 0x0e, 0x91, 0x02, 0x00, 0x1e, 0x00, 0x06, 0x00, 0x16, 0x79, 0xc4, + 0x00, 0x0e, 0x91, 0x03, 0x78, 0xc6, 0x00, 0x0e, 0x78, 0xca, 0x92, 0x84, + 0x19, 0x84, 0x90, 0x85, 0x00, 0x12, 0x78, 0x16, 0x20, 0x79, 0x00, 0x90, + 0x78, 0x2b, 0x00, 0x08, 0x70, 0x57, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x05, + 0x00, 0xf6, 0x00, 0xe6, 0x20, 0x71, 0x19, 0xe8, 0x70, 0x54, 0x90, 0x86, + 0x00, 0x00, 0x09, 0x04, 0x1e, 0x92, 0x20, 0x79, 0x00, 0x90, 0x20, 0x09, + 0x02, 0x07, 0x21, 0x0c, 0xd1, 0x94, 0x01, 0xb8, 0x20, 0x09, 0x02, 0x0c, + 0x21, 0x0c, 0x91, 0x84, 0x00, 0x03, 0x01, 0x88, 0x08, 0x0c, 0xee, 0xfa, + 0x20, 0x01, 0x01, 0x33, 0x20, 0x04, 0x90, 0x05, 0x09, 0x0c, 0x0d, 0x85, + 0x00, 0x16, 0x20, 0x09, 0x00, 0x40, 0x08, 0x0c, 0x22, 0x20, 0x00, 0x1e, + 0x20, 0x01, 0x02, 0x0c, 0x21, 0x02, 0x20, 0x09, 0x02, 0x06, 0x21, 0x04, + 0x20, 0x09, 0x02, 0x03, 0x21, 0x0c, 0x91, 0x06, 0x11, 0x20, 0x20, 0x09, + 0x00, 0x40, 0x08, 0x0c, 0x22, 0x20, 0x78, 0x2c, 0xd0, 0xfc, 0x09, 0xa8, + 0x08, 0x0c, 0xad, 0x18, 0x78, 0x2c, 0xd0, 0xfc, 0x1d, 0xe8, 0x08, 0x0c, + 0xac, 0xfc, 0x70, 0x54, 0x90, 0x86, 0x00, 0x00, 0x19, 0x50, 0x78, 0x2b, + 0x00, 0x04, 0x78, 0x2c, 0xd0, 0xac, 0x1d, 0xe8, 0x20, 0x09, 0x00, 0x40, + 0x08, 0x0c, 0x22, 0x20, 0x78, 0x2b, 0x00, 0x02, 0x70, 0x57, 0x00, 0x00, + 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, 0x08, 0x0c, 0x0d, 0x85, 0x8c, 0x60, + 0x2c, 0x05, 0x90, 0x05, 0x01, 0x10, 0x8a, 0x51, 0x00, 0x05, 0xa0, 0x04, + 0x90, 0x05, 0x01, 0x68, 0xa8, 0x5a, 0x20, 0x40, 0xa0, 0x64, 0x90, 0x84, + 0x00, 0x0f, 0x90, 0x80, 0x1e, 0xc1, 0x20, 0x65, 0x8c, 0xff, 0x09, 0x0c, + 0x0d, 0x85, 0x8a, 0x51, 0x00, 0x05, 0x20, 0x50, 0x00, 0x05, 0x00, 0x00, + 0x00, 0x1d, 0x00, 0x21, 0x00, 0x25, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x31, + 0x00, 0x35, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x21, 0x00, 0x27, 0x00, 0x2d, + 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0xb4, 0x1e, 0xb0, 0x1e, 0xb4, 0x1e, 0xb4, 0x1e, 0xbe, 0x00, 0x00, + 0x1e, 0xb4, 0x1e, 0xbb, 0x1e, 0xbb, 0x1e, 0xb8, 0x1e, 0xbb, 0x1e, 0xbb, + 0x00, 0x00, 0x1e, 0xbe, 0x1e, 0xbb, 0x00, 0x00, 0x1e, 0xb6, 0x1e, 0xb6, + 0x00, 0x00, 0x1e, 0xb6, 0x1e, 0xbe, 0x00, 0x00, 0x1e, 0xb6, 0x1e, 0xbc, + 0x1e, 0xbc, 0x1e, 0xbc, 0x00, 0x00, 0x1e, 0xbc, 0x00, 0x00, 0x1e, 0xbe, + 0x1e, 0xbc, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0x86, 0xab, 0x42, 0xac, 0x3e, + 0xa8, 0x88, 0x90, 0x55, 0x09, 0x04, 0x20, 0xc0, 0x29, 0x40, 0xa0, 0x64, + 0x90, 0xec, 0x00, 0x0f, 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x08, + 0x11, 0x18, 0x20, 0x61, 0x1e, 0xbc, 0x00, 0xd0, 0x9d, 0xe0, 0x1e, 0xc1, + 0x9d, 0x86, 0x00, 0x07, 0x01, 0x30, 0x9d, 0x86, 0x00, 0x0e, 0x01, 0x18, + 0x9d, 0x86, 0x00, 0x0f, 0x11, 0x20, 0xa0, 0x8c, 0x94, 0x22, 0xa0, 0x90, + 0x93, 0x1b, 0x2c, 0x05, 0x90, 0x65, 0x11, 0x40, 0x03, 0x10, 0x08, 0x04, + 0x20, 0xc0, 0xa0, 0x04, 0x90, 0x45, 0x09, 0x04, 0x20, 0xc0, 0x08, 0xd8, + 0x2c, 0x05, 0x90, 0x05, 0x09, 0x04, 0x1f, 0xa8, 0xdd, 0x9c, 0x19, 0x04, + 0x1f, 0x64, 0x90, 0x8a, 0x00, 0x36, 0x1a, 0x0c, 0x0d, 0x85, 0x90, 0x82, + 0x00, 0x1b, 0x00, 0x02, 0x1f, 0x39, 0x1f, 0x39, 0x1f, 0x3b, 0x1f, 0x39, + 0x1f, 0x39, 0x1f, 0x39, 0x1f, 0x41, 0x1f, 0x39, 0x1f, 0x39, 0x1f, 0x39, + 0x1f, 0x47, 0x1f, 0x39, 0x1f, 0x39, 0x1f, 0x39, 0x1f, 0x4d, 0x1f, 0x39, + 0x1f, 0x39, 0x1f, 0x39, 0x1f, 0x53, 0x1f, 0x39, 0x1f, 0x39, 0x1f, 0x39, + 0x1f, 0x59, 0x1f, 0x39, 0x1f, 0x39, 0x1f, 0x39, 0x1f, 0x5f, 0x08, 0x0c, + 0x0d, 0x85, 0xa0, 0x7c, 0x94, 0x22, 0xa0, 0x80, 0x93, 0x1b, 0x08, 0x04, + 0x1f, 0x9e, 0xa0, 0x8c, 0x94, 0x22, 0xa0, 0x90, 0x93, 0x1b, 0x08, 0x04, + 0x1f, 0x9e, 0xa0, 0x9c, 0x94, 0x22, 0xa0, 0xa0, 0x93, 0x1b, 0x08, 0x04, + 0x1f, 0x9e, 0xa0, 0xac, 0x94, 0x22, 0xa0, 0xb0, 0x93, 0x1b, 0x08, 0x04, + 0x1f, 0x9e, 0xa0, 0xbc, 0x94, 0x22, 0xa0, 0xc0, 0x93, 0x1b, 0x08, 0x04, + 0x1f, 0x9e, 0xa0, 0xcc, 0x94, 0x22, 0xa0, 0xd0, 0x93, 0x1b, 0x08, 0x04, + 0x1f, 0x9e, 0xa0, 0xdc, 0x94, 0x22, 0xa0, 0xe0, 0x93, 0x1b, 0x04, 0xd0, + 0x90, 0x8a, 0x00, 0x34, 0x1a, 0x0c, 0x0d, 0x85, 0x90, 0x82, 0x00, 0x1b, + 0x00, 0x02, 0x1f, 0x86, 0x1f, 0x84, 0x1f, 0x84, 0x1f, 0x84, 0x1f, 0x84, + 0x1f, 0x84, 0x1f, 0x8b, 0x1f, 0x84, 0x1f, 0x84, 0x1f, 0x84, 0x1f, 0x84, + 0x1f, 0x84, 0x1f, 0x90, 0x1f, 0x84, 0x1f, 0x84, 0x1f, 0x84, 0x1f, 0x84, + 0x1f, 0x84, 0x1f, 0x95, 0x1f, 0x84, 0x1f, 0x84, 0x1f, 0x84, 0x1f, 0x84, + 0x1f, 0x84, 0x1f, 0x9a, 0x08, 0x0c, 0x0d, 0x85, 0xa0, 0x7c, 0x94, 0x22, + 0xa0, 0x80, 0x93, 0x1b, 0x00, 0x98, 0xa0, 0x94, 0x94, 0x22, 0xa0, 0x98, + 0x93, 0x1b, 0x00, 0x70, 0xa0, 0xac, 0x94, 0x22, 0xa0, 0xb0, 0x93, 0x1b, + 0x00, 0x48, 0xa0, 0xc4, 0x94, 0x22, 0xa0, 0xc8, 0x93, 0x1b, 0x00, 0x20, + 0xa0, 0xdc, 0x94, 0x22, 0xa0, 0xe0, 0x93, 0x1b, 0x06, 0x30, 0x23, 0x00, + 0x94, 0x05, 0x01, 0x60, 0x8a, 0x51, 0x09, 0x04, 0x20, 0xc0, 0x8c, 0x60, + 0x08, 0x04, 0x1f, 0x10, 0xa0, 0x04, 0x90, 0x45, 0x09, 0x04, 0x20, 0xc0, + 0x08, 0x04, 0x1e, 0xeb, 0x8a, 0x51, 0x09, 0x04, 0x20, 0xc0, 0x8c, 0x60, + 0x2c, 0x05, 0x90, 0x05, 0x11, 0x58, 0xa0, 0x04, 0x90, 0x45, 0x09, 0x04, + 0x20, 0xc0, 0xa0, 0x64, 0x90, 0xec, 0x00, 0x0f, 0x9d, 0xe0, 0x1e, 0xc1, + 0x2c, 0x05, 0x20, 0x60, 0xa8, 0x80, 0xc0, 0xfc, 0xa8, 0x82, 0x08, 0x04, + 0x20, 0xb5, 0x2c, 0x05, 0x84, 0x22, 0x84, 0x20, 0x83, 0x1a, 0x93, 0x99, + 0x00, 0x00, 0xac, 0x2e, 0xab, 0x32, 0xdd, 0x9c, 0x19, 0x04, 0x20, 0x52, + 0x90, 0x82, 0x00, 0x1b, 0x00, 0x02, 0x1f, 0xee, 0x1f, 0xee, 0x1f, 0xf0, + 0x1f, 0xee, 0x1f, 0xee, 0x1f, 0xee, 0x1f, 0xfe, 0x1f, 0xee, 0x1f, 0xee, + 0x1f, 0xee, 0x20, 0x0c, 0x1f, 0xee, 0x1f, 0xee, 0x1f, 0xee, 0x20, 0x1a, + 0x1f, 0xee, 0x1f, 0xee, 0x1f, 0xee, 0x20, 0x28, 0x1f, 0xee, 0x1f, 0xee, + 0x1f, 0xee, 0x20, 0x36, 0x1f, 0xee, 0x1f, 0xee, 0x1f, 0xee, 0x20, 0x44, + 0x08, 0x0c, 0x0d, 0x85, 0xa1, 0x7c, 0x24, 0x00, 0x91, 0x22, 0xa1, 0x80, + 0x23, 0x00, 0x91, 0x1b, 0x0a, 0x0c, 0x0d, 0x85, 0xa0, 0x74, 0x94, 0x20, + 0xa0, 0x78, 0x93, 0x19, 0x08, 0x04, 0x20, 0xb0, 0xa1, 0x8c, 0x24, 0x00, + 0x91, 0x22, 0xa1, 0x90, 0x23, 0x00, 0x91, 0x1b, 0x0a, 0x0c, 0x0d, 0x85, + 0xa0, 0x84, 0x94, 0x20, 0xa0, 0x88, 0x93, 0x19, 0x08, 0x04, 0x20, 0xb0, + 0xa1, 0x9c, 0x24, 0x00, 0x91, 0x22, 0xa1, 0xa0, 0x23, 0x00, 0x91, 0x1b, + 0x0a, 0x0c, 0x0d, 0x85, 0xa0, 0x94, 0x94, 0x20, 0xa0, 0x98, 0x93, 0x19, + 0x08, 0x04, 0x20, 0xb0, 0xa1, 0xac, 0x24, 0x00, 0x91, 0x22, 0xa1, 0xb0, + 0x23, 0x00, 0x91, 0x1b, 0x0a, 0x0c, 0x0d, 0x85, 0xa0, 0xa4, 0x94, 0x20, + 0xa0, 0xa8, 0x93, 0x19, 0x08, 0x04, 0x20, 0xb0, 0xa1, 0xbc, 0x24, 0x00, + 0x91, 0x22, 0xa1, 0xc0, 0x23, 0x00, 0x91, 0x1b, 0x0a, 0x0c, 0x0d, 0x85, + 0xa0, 0xb4, 0x94, 0x20, 0xa0, 0xb8, 0x93, 0x19, 0x08, 0x04, 0x20, 0xb0, + 0xa1, 0xcc, 0x24, 0x00, 0x91, 0x22, 0xa1, 0xd0, 0x23, 0x00, 0x91, 0x1b, + 0x0a, 0x0c, 0x0d, 0x85, 0xa0, 0xc4, 0x94, 0x20, 0xa0, 0xc8, 0x93, 0x19, + 0x08, 0x04, 0x20, 0xb0, 0xa1, 0xdc, 0x24, 0x00, 0x91, 0x22, 0xa1, 0xe0, + 0x23, 0x00, 0x91, 0x1b, 0x0a, 0x0c, 0x0d, 0x85, 0xa0, 0xd4, 0x94, 0x20, + 0xa0, 0xd8, 0x93, 0x19, 0x08, 0x04, 0x20, 0xb0, 0x90, 0x82, 0x00, 0x1b, + 0x00, 0x02, 0x20, 0x70, 0x20, 0x6e, 0x20, 0x6e, 0x20, 0x6e, 0x20, 0x6e, + 0x20, 0x6e, 0x20, 0x7d, 0x20, 0x6e, 0x20, 0x6e, 0x20, 0x6e, 0x20, 0x6e, + 0x20, 0x6e, 0x20, 0x8a, 0x20, 0x6e, 0x20, 0x6e, 0x20, 0x6e, 0x20, 0x6e, + 0x20, 0x6e, 0x20, 0x97, 0x20, 0x6e, 0x20, 0x6e, 0x20, 0x6e, 0x20, 0x6e, + 0x20, 0x6e, 0x20, 0xa4, 0x08, 0x0c, 0x0d, 0x85, 0xa1, 0x7c, 0x24, 0x00, + 0x91, 0x22, 0xa1, 0x80, 0x23, 0x00, 0x91, 0x1b, 0x0a, 0x0c, 0x0d, 0x85, + 0xa0, 0x6c, 0x94, 0x20, 0xa0, 0x70, 0x93, 0x19, 0x04, 0x98, 0xa1, 0x94, + 0x24, 0x00, 0x91, 0x22, 0xa1, 0x98, 0x23, 0x00, 0x91, 0x1b, 0x0a, 0x0c, + 0x0d, 0x85, 0xa0, 0x84, 0x94, 0x20, 0xa0, 0x88, 0x93, 0x19, 0x04, 0x30, + 0xa1, 0xac, 0x24, 0x00, 0x91, 0x22, 0xa1, 0xb0, 0x23, 0x00, 0x91, 0x1b, + 0x0a, 0x0c, 0x0d, 0x85, 0xa0, 0x9c, 0x94, 0x20, 0xa0, 0xa0, 0x93, 0x19, + 0x00, 0xc8, 0xa1, 0xc4, 0x24, 0x00, 0x91, 0x22, 0xa1, 0xc8, 0x23, 0x00, + 0x91, 0x1b, 0x0a, 0x0c, 0x0d, 0x85, 0xa0, 0xb4, 0x94, 0x20, 0xa0, 0xb8, + 0x93, 0x19, 0x00, 0x60, 0xa1, 0xdc, 0x24, 0x00, 0x91, 0x22, 0xa1, 0xe0, + 0x23, 0x00, 0x91, 0x1b, 0x0a, 0x0c, 0x0d, 0x85, 0xa0, 0xcc, 0x94, 0x20, + 0xa0, 0xd0, 0x93, 0x19, 0xac, 0x1e, 0xab, 0x22, 0xa8, 0x80, 0xc0, 0xfd, + 0xa8, 0x82, 0x28, 0x00, 0xa8, 0x5a, 0x2c, 0x00, 0xa8, 0x12, 0x2a, 0x00, + 0xa8, 0x16, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x90, 0x06, 0x00, 0x28, + 0x00, 0x8e, 0x00, 0xde, 0x00, 0xce, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, + 0x00, 0xc6, 0x61, 0x0c, 0x00, 0x16, 0x90, 0x26, 0x24, 0x10, 0x60, 0x04, + 0x94, 0x20, 0x92, 0x91, 0x00, 0x00, 0x2c, 0x04, 0x92, 0x10, 0x9c, 0xe0, + 0x00, 0x02, 0x91, 0x8a, 0x00, 0x02, 0x1d, 0xa8, 0x92, 0x84, 0x00, 0x0f, + 0x94, 0x05, 0x00, 0x1e, 0x00, 0xce, 0x00, 0x05, 0x78, 0x03, 0x00, 0x03, + 0x78, 0x0f, 0x00, 0x00, 0x60, 0x04, 0x78, 0x12, 0x2c, 0x04, 0x78, 0x16, + 0x9c, 0xe0, 0x00, 0x02, 0x91, 0x8a, 0x00, 0x02, 0x1d, 0xb8, 0x00, 0x05, + 0x20, 0x01, 0x00, 0x05, 0x20, 0x04, 0xd0, 0xbc, 0x19, 0x0c, 0x0d, 0x7e, + 0xd0, 0x94, 0x01, 0x10, 0x08, 0x0c, 0x12, 0x08, 0x00, 0x05, 0x01, 0x26, + 0x20, 0x91, 0x26, 0x00, 0x20, 0x79, 0x02, 0x00, 0x20, 0x71, 0x02, 0x60, + 0x20, 0x69, 0x18, 0x00, 0x78, 0x17, 0x00, 0x00, 0x78, 0x9b, 0x08, 0x14, + 0x78, 0xa3, 0x04, 0x06, 0x78, 0x9f, 0x04, 0x10, 0x20, 0x09, 0x01, 0x3b, + 0x20, 0x0b, 0x04, 0x00, 0x78, 0x1b, 0x00, 0x02, 0x78, 0x3b, 0x00, 0x1f, + 0x78, 0x37, 0x00, 0x20, 0x78, 0x03, 0x16, 0x00, 0x01, 0x2e, 0x00, 0x05, + 0x20, 0x91, 0x26, 0x00, 0x78, 0x1c, 0xd0, 0xa4, 0x19, 0x0c, 0x22, 0x1d, + 0x79, 0x00, 0xd1, 0xdc, 0x11, 0x18, 0x90, 0x84, 0x00, 0x06, 0x00, 0x1a, + 0x90, 0x84, 0x00, 0x0e, 0x00, 0x02, 0x21, 0x3b, 0x21, 0x33, 0x82, 0x10, + 0x21, 0x33, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x81, 0xf6, + 0x21, 0x33, 0x21, 0x37, 0x21, 0x33, 0x21, 0x35, 0x21, 0x33, 0x21, 0x35, + 0x21, 0x33, 0x08, 0x0c, 0x0d, 0x85, 0x00, 0x31, 0x00, 0x20, 0x08, 0x0c, + 0x81, 0xf6, 0x08, 0x0c, 0x82, 0x10, 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, + 0x00, 0x26, 0x08, 0x0c, 0xee, 0xfa, 0x79, 0x30, 0x91, 0x84, 0x00, 0x03, + 0x05, 0x10, 0x08, 0x0c, 0xac, 0xfc, 0x20, 0x01, 0x19, 0xfb, 0x20, 0x04, + 0x90, 0x05, 0x01, 0xa0, 0x20, 0x01, 0x01, 0x33, 0x20, 0x04, 0x90, 0x05, + 0x09, 0x0c, 0x0d, 0x85, 0x00, 0xc6, 0x20, 0x01, 0x19, 0xfb, 0x20, 0x64, + 0x08, 0x0c, 0xad, 0x18, 0x08, 0x0c, 0xca, 0xe9, 0x20, 0x09, 0x00, 0x40, + 0x08, 0x0c, 0x22, 0x20, 0x00, 0xce, 0x04, 0x08, 0x20, 0x09, 0x00, 0x40, + 0x08, 0x0c, 0x22, 0x20, 0x08, 0x0c, 0xad, 0x18, 0x00, 0xd0, 0x91, 0x84, + 0x00, 0x14, 0x01, 0xa0, 0x6a, 0x00, 0x92, 0x86, 0x00, 0x03, 0x01, 0x60, + 0x08, 0x0c, 0x77, 0x9e, 0x11, 0x38, 0x08, 0x0c, 0x7a, 0xb6, 0x08, 0x0c, + 0x61, 0x9d, 0x08, 0x0c, 0x76, 0xcd, 0x00, 0x10, 0x08, 0x0c, 0x60, 0x58, + 0x08, 0x0c, 0x82, 0xae, 0x00, 0x41, 0x00, 0x18, 0x91, 0x84, 0x95, 0x40, + 0x1d, 0xc8, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, 0x00, 0xe6, + 0x00, 0x36, 0x00, 0x46, 0x00, 0x56, 0x20, 0x71, 0x1a, 0x6e, 0x08, 0x0c, + 0x1b, 0x1e, 0x00, 0x5e, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0xee, 0x00, 0x05, + 0x01, 0x26, 0x20, 0x91, 0x2e, 0x00, 0x20, 0x71, 0x18, 0x00, 0x71, 0x28, + 0x20, 0x01, 0x19, 0x6f, 0x21, 0x02, 0x20, 0x01, 0x19, 0x77, 0x21, 0x02, + 0x20, 0x01, 0x01, 0x3b, 0x21, 0x02, 0x20, 0x79, 0x02, 0x00, 0x20, 0x01, + 0x02, 0x01, 0x78, 0x9e, 0x78, 0xa3, 0x02, 0x00, 0x91, 0x98, 0x00, 0x07, + 0x83, 0x1c, 0x83, 0x1c, 0x83, 0x1c, 0x93, 0x98, 0x00, 0x05, 0x23, 0x20, + 0x91, 0x82, 0x02, 0x04, 0x12, 0x30, 0x20, 0x11, 0x00, 0x08, 0x84, 0x23, + 0x84, 0x23, 0x84, 0x23, 0x04, 0x88, 0x91, 0x82, 0x02, 0x4c, 0x12, 0x40, + 0x20, 0x11, 0x00, 0x07, 0x84, 0x03, 0x80, 0x03, 0x94, 0x00, 0x94, 0x00, + 0x94, 0x20, 0x04, 0x30, 0x91, 0x82, 0x02, 0xbc, 0x12, 0x38, 0x20, 0x11, + 0x00, 0x06, 0x84, 0x03, 0x80, 0x03, 0x94, 0x00, 0x94, 0x20, 0x00, 0xe0, + 0x91, 0x82, 0x03, 0x4c, 0x12, 0x30, 0x20, 0x11, 0x00, 0x05, 0x84, 0x03, + 0x80, 0x03, 0x94, 0x20, 0x00, 0x98, 0x91, 0x82, 0x04, 0x2c, 0x12, 0x28, + 0x20, 0x11, 0x00, 0x04, 0x84, 0x23, 0x84, 0x23, 0x00, 0x58, 0x91, 0x82, + 0x05, 0x9c, 0x12, 0x28, 0x20, 0x11, 0x00, 0x03, 0x84, 0x03, 0x94, 0x20, + 0x00, 0x18, 0x20, 0x11, 0x00, 0x02, 0x84, 0x23, 0x94, 0x82, 0x02, 0x28, + 0x80, 0x02, 0x80, 0x20, 0x83, 0x01, 0x94, 0x02, 0x01, 0x10, 0x02, 0x08, + 0x83, 0x21, 0x82, 0x17, 0x82, 0x03, 0x94, 0x05, 0x78, 0x9a, 0x01, 0x2e, + 0x00, 0x05, 0x00, 0x06, 0x00, 0xd6, 0x20, 0x69, 0x02, 0x00, 0x68, 0x14, + 0x90, 0x84, 0xff, 0xc0, 0x91, 0x0d, 0x69, 0x16, 0x00, 0xde, 0x00, 0x0e, + 0x00, 0x05, 0x00, 0xd6, 0x20, 0x69, 0x02, 0x00, 0x90, 0x05, 0x68, 0x10, + 0x01, 0x10, 0xc0, 0xa5, 0x00, 0x08, 0xc0, 0xa4, 0x68, 0x12, 0x00, 0xde, + 0x00, 0x05, 0x00, 0x06, 0x00, 0xd6, 0x20, 0x69, 0x02, 0x00, 0x68, 0x10, + 0x90, 0x84, 0xff, 0xf8, 0x91, 0x0d, 0x69, 0x12, 0x00, 0xde, 0x00, 0x0e, + 0x00, 0x05, 0x79, 0x38, 0x08, 0x0c, 0x0d, 0x7e, 0x00, 0xf6, 0x20, 0x79, + 0x02, 0x00, 0x79, 0x02, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, + 0xa0, 0x01, 0xa0, 0x01, 0x79, 0x02, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, + 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0x00, 0xfe, 0x00, 0x05, 0x01, 0x26, + 0x20, 0x91, 0x28, 0x00, 0x20, 0x61, 0x01, 0x00, 0x20, 0x71, 0x18, 0x00, + 0x20, 0x09, 0x00, 0x00, 0x08, 0x0c, 0x2a, 0x85, 0x08, 0x0c, 0x29, 0x9b, + 0x20, 0x01, 0x19, 0x9d, 0x20, 0x03, 0x07, 0x00, 0x20, 0x01, 0x19, 0x9e, + 0x20, 0x03, 0x07, 0x00, 0x08, 0x0c, 0x2a, 0xf6, 0x90, 0x06, 0x08, 0x0c, + 0x29, 0xca, 0x90, 0x06, 0x08, 0x0c, 0x29, 0xad, 0x20, 0xa9, 0x00, 0x12, + 0x1d, 0x04, 0x22, 0x52, 0x20, 0x91, 0x60, 0x00, 0x1f, 0x04, 0x22, 0x52, + 0x60, 0x2f, 0x01, 0x00, 0x60, 0x2f, 0x00, 0x00, 0x60, 0x50, 0x90, 0x85, + 0x04, 0x00, 0x90, 0x84, 0xdf, 0xff, 0x60, 0x52, 0x62, 0x24, 0x08, 0x0c, + 0x2a, 0xd3, 0x08, 0x0c, 0x26, 0xc5, 0x20, 0x09, 0x00, 0xef, 0x61, 0x32, + 0x61, 0x36, 0x08, 0x0c, 0x26, 0xd5, 0x60, 0xe7, 0x00, 0x00, 0x61, 0xea, + 0x20, 0x01, 0x18, 0x0d, 0x20, 0x04, 0xd0, 0x8c, 0x20, 0x01, 0x00, 0x02, + 0x11, 0x10, 0x20, 0x01, 0x00, 0x08, 0x60, 0xe2, 0x60, 0x4b, 0xf7, 0xf7, + 0x60, 0x43, 0x00, 0x00, 0x60, 0x2f, 0x00, 0x80, 0x60, 0x2f, 0x00, 0x00, + 0x60, 0x07, 0x34, 0x9f, 0x00, 0xc6, 0x20, 0x61, 0x01, 0x40, 0x60, 0x8b, + 0x00, 0x0b, 0x60, 0x8f, 0x10, 0xb8, 0x60, 0x93, 0x00, 0x00, 0x60, 0x97, + 0x01, 0x98, 0x00, 0xce, 0x60, 0x04, 0x90, 0x85, 0x80, 0x00, 0x60, 0x06, + 0x60, 0xbb, 0x00, 0x00, 0x20, 0xa9, 0x00, 0x18, 0x60, 0xbf, 0x00, 0x00, + 0x1f, 0x04, 0x22, 0x98, 0x60, 0xbb, 0x00, 0x00, 0x60, 0xbf, 0x01, 0x08, + 0x60, 0xbf, 0x00, 0x12, 0x60, 0xbf, 0x04, 0x05, 0x60, 0xbf, 0x00, 0x14, + 0x60, 0xbf, 0x03, 0x20, 0x60, 0xbf, 0x00, 0x18, 0x60, 0x1b, 0x00, 0xf0, + 0x60, 0x1f, 0x00, 0x1e, 0x60, 0x0f, 0x00, 0x6b, 0x60, 0x2b, 0x40, 0x2c, + 0x01, 0x2e, 0x00, 0x05, 0x00, 0xf6, 0x20, 0x79, 0x01, 0x40, 0x78, 0xc3, + 0x00, 0x80, 0x78, 0xc3, 0x00, 0x83, 0x78, 0xc3, 0x00, 0x00, 0x00, 0xfe, + 0x00, 0x05, 0x20, 0x01, 0x18, 0x35, 0x20, 0x03, 0x00, 0x00, 0x20, 0x01, + 0x18, 0x34, 0x20, 0x03, 0x00, 0x01, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, + 0x28, 0x00, 0x00, 0x06, 0x00, 0x16, 0x00, 0x26, 0x61, 0x24, 0x60, 0x28, + 0x91, 0x0c, 0x00, 0x66, 0x20, 0x31, 0x18, 0x37, 0x26, 0x34, 0x96, 0xb4, + 0x00, 0x28, 0x00, 0x6e, 0x11, 0x38, 0x60, 0x20, 0xd1, 0xbc, 0x01, 0x20, + 0xd0, 0xbc, 0x11, 0x68, 0xd0, 0xb4, 0x11, 0x98, 0x91, 0x84, 0x5e, 0x2c, + 0x11, 0x18, 0x91, 0x84, 0x00, 0x07, 0x00, 0xaa, 0x91, 0x95, 0x00, 0x04, + 0x92, 0x84, 0x00, 0x07, 0x00, 0x82, 0x00, 0x16, 0x20, 0x01, 0x03, 0x87, + 0x20, 0x0c, 0xd1, 0xa4, 0x00, 0x1e, 0x0d, 0x70, 0x0c, 0x98, 0x00, 0x16, + 0x20, 0x01, 0x03, 0x87, 0x20, 0x0c, 0xd1, 0xb4, 0x00, 0x1e, 0x0d, 0x30, + 0x0c, 0x58, 0x23, 0x06, 0x23, 0x03, 0x23, 0x03, 0x23, 0x03, 0x23, 0x05, + 0x23, 0x03, 0x23, 0x03, 0x23, 0x03, 0x08, 0x0c, 0x0d, 0x85, 0x00, 0x29, + 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x0e, 0x01, 0x2e, 0x00, 0x05, 0x00, 0xa6, + 0x61, 0x24, 0x60, 0x28, 0xd0, 0x9c, 0x01, 0x18, 0xd1, 0x9c, 0x19, 0x04, + 0x25, 0x8b, 0xd1, 0xf4, 0x19, 0x0c, 0x0d, 0x7e, 0x08, 0x0c, 0x77, 0x9e, + 0x09, 0x04, 0x23, 0x63, 0x08, 0x0c, 0xd6, 0x45, 0x11, 0x20, 0x70, 0x00, + 0x90, 0x86, 0x00, 0x03, 0x05, 0x80, 0x60, 0x24, 0x90, 0x84, 0x18, 0x00, + 0x05, 0x60, 0x08, 0x0c, 0x77, 0xc1, 0x01, 0x18, 0x08, 0x0c, 0x77, 0xaf, + 0x15, 0x30, 0x20, 0x11, 0x00, 0x20, 0x08, 0x0c, 0x2a, 0xd3, 0x60, 0x43, + 0x00, 0x00, 0x08, 0x0c, 0xd6, 0x45, 0x01, 0x68, 0x08, 0x0c, 0x77, 0xc1, + 0x11, 0x50, 0x20, 0x01, 0x19, 0xa8, 0x20, 0x03, 0x00, 0x01, 0x60, 0x27, + 0x18, 0x00, 0x08, 0x0c, 0x76, 0x12, 0x08, 0x04, 0x25, 0x8e, 0x70, 0xa4, + 0x90, 0x05, 0x11, 0x50, 0x70, 0xa7, 0x00, 0x01, 0x00, 0xd6, 0x20, 0x69, + 0x01, 0x40, 0x08, 0x0c, 0x77, 0xf2, 0x00, 0xde, 0x19, 0x04, 0x25, 0x8e, + 0x08, 0x0c, 0x7a, 0xc0, 0x04, 0x28, 0x08, 0x0c, 0x77, 0xc1, 0x15, 0x90, + 0x60, 0x24, 0x90, 0x84, 0x18, 0x00, 0x11, 0x08, 0x04, 0x68, 0x08, 0x0c, + 0x7a, 0xc0, 0x08, 0x0c, 0x7a, 0xb6, 0x08, 0x0c, 0x61, 0x9d, 0x08, 0x0c, + 0x76, 0xcd, 0x08, 0x04, 0x25, 0x8b, 0xd1, 0xac, 0x15, 0x08, 0x60, 0x24, + 0xd0, 0xdc, 0x11, 0x70, 0xd0, 0xe4, 0x11, 0x78, 0xd0, 0xd4, 0x11, 0x90, + 0xd0, 0xcc, 0x01, 0x30, 0x70, 0x98, 0x90, 0x86, 0x00, 0x29, 0x11, 0x10, + 0x08, 0x0c, 0x79, 0x90, 0x08, 0x04, 0x25, 0x8b, 0x08, 0x0c, 0x7a, 0xbb, + 0x00, 0x48, 0x20, 0x01, 0x19, 0x7d, 0x20, 0x03, 0x00, 0x02, 0x00, 0x20, + 0x08, 0x0c, 0x78, 0xe4, 0x08, 0x04, 0x25, 0x8b, 0x08, 0x0c, 0x7a, 0x3a, + 0x08, 0x04, 0x25, 0x8b, 0x62, 0x20, 0xd1, 0xbc, 0x01, 0x38, 0xd2, 0xbc, + 0x19, 0x04, 0x25, 0xf6, 0xd2, 0xb4, 0x19, 0x04, 0x26, 0x08, 0x00, 0x00, + 0xd1, 0xac, 0x09, 0x04, 0x24, 0x98, 0x00, 0x36, 0x63, 0x28, 0xc3, 0xbc, + 0x63, 0x2a, 0x00, 0x3e, 0x08, 0x0c, 0x77, 0x9e, 0x11, 0xd0, 0x20, 0x11, + 0x00, 0x20, 0x08, 0x0c, 0x2a, 0xd3, 0x00, 0x06, 0x00, 0x26, 0x00, 0x36, + 0x08, 0x0c, 0x77, 0xb8, 0x11, 0x58, 0x08, 0x0c, 0x7a, 0xb6, 0x08, 0x0c, + 0x61, 0x9d, 0x08, 0x0c, 0x76, 0xcd, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x0e, + 0x00, 0xae, 0x00, 0x05, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x0e, 0x08, 0x0c, + 0x77, 0x72, 0x00, 0x16, 0x00, 0x46, 0x00, 0xc6, 0x64, 0x4c, 0x94, 0x86, + 0xf0, 0xf0, 0x11, 0x38, 0x20, 0x61, 0x01, 0x00, 0x64, 0x4a, 0x60, 0x43, + 0x00, 0x90, 0x60, 0x43, 0x00, 0x10, 0x74, 0xda, 0x94, 0x8c, 0xff, 0x00, + 0x70, 0x38, 0xd0, 0x84, 0x01, 0x90, 0x08, 0x0c, 0xd6, 0x45, 0x11, 0x18, + 0x91, 0x86, 0xf8, 0x00, 0x11, 0x60, 0x70, 0x48, 0xd0, 0x84, 0x11, 0x48, + 0xc0, 0x85, 0x70, 0x4a, 0x00, 0x36, 0x24, 0x18, 0x20, 0x11, 0x80, 0x16, + 0x08, 0x0c, 0x4c, 0xa1, 0x00, 0x3e, 0x08, 0x0c, 0xd6, 0x3e, 0x19, 0x04, + 0x24, 0x6d, 0x91, 0x96, 0xff, 0x00, 0x05, 0xa8, 0x70, 0x60, 0x90, 0x84, + 0x00, 0xff, 0x81, 0x0f, 0x81, 0xff, 0x01, 0x10, 0x91, 0x16, 0x05, 0x68, + 0x71, 0x30, 0xd1, 0x84, 0x15, 0x50, 0x08, 0x0c, 0x34, 0x82, 0x01, 0x28, + 0xc1, 0x8d, 0x71, 0x32, 0x08, 0x0c, 0x6c, 0x09, 0x15, 0x10, 0x62, 0x40, + 0x92, 0x94, 0x00, 0x10, 0x01, 0x30, 0x62, 0x48, 0x92, 0x94, 0xff, 0x00, + 0x92, 0x96, 0xff, 0x00, 0x01, 0xc0, 0x70, 0x30, 0xd0, 0x8c, 0x09, 0x04, + 0x24, 0x6d, 0x70, 0x38, 0xd0, 0x8c, 0x11, 0x40, 0x20, 0x01, 0x18, 0x0c, + 0x20, 0x0c, 0xd1, 0xac, 0x19, 0x04, 0x24, 0x6d, 0xc1, 0xad, 0x21, 0x02, + 0x00, 0x36, 0x73, 0xd8, 0x20, 0x11, 0x80, 0x13, 0x08, 0x0c, 0x4c, 0xa1, + 0x00, 0x3e, 0x08, 0x04, 0x24, 0x6d, 0x70, 0x38, 0xd0, 0x8c, 0x11, 0x40, + 0x20, 0x01, 0x18, 0x0c, 0x20, 0x0c, 0xd1, 0xac, 0x19, 0x04, 0x24, 0x6d, + 0xc1, 0xad, 0x21, 0x02, 0x00, 0x36, 0x73, 0xd8, 0x20, 0x11, 0x80, 0x13, + 0x08, 0x0c, 0x4c, 0xa1, 0x00, 0x3e, 0x71, 0x30, 0xc1, 0x85, 0x71, 0x32, + 0x20, 0x11, 0x18, 0x48, 0x22, 0x0c, 0xd1, 0xa4, 0x01, 0xf0, 0x00, 0x16, + 0x20, 0x09, 0x00, 0x01, 0x20, 0x11, 0x01, 0x00, 0x08, 0x0c, 0x8c, 0x44, + 0x20, 0x19, 0x00, 0x0e, 0x00, 0xc6, 0x20, 0x61, 0x00, 0x00, 0x08, 0x0c, + 0xe9, 0xf9, 0x00, 0xce, 0x94, 0x84, 0x00, 0xff, 0x90, 0x80, 0x34, 0x8e, + 0x20, 0x0d, 0x91, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0x21, 0x20, 0x90, 0x06, + 0x20, 0x09, 0x00, 0x0e, 0x08, 0x0c, 0xea, 0x8d, 0x00, 0x1e, 0x00, 0x16, + 0x20, 0x09, 0x00, 0x02, 0x20, 0x19, 0x00, 0x04, 0x08, 0x0c, 0x32, 0xda, + 0x00, 0x1e, 0x00, 0xa8, 0x01, 0x56, 0x00, 0xb6, 0x20, 0xa9, 0x00, 0x7f, + 0x90, 0x0e, 0x08, 0x0c, 0x67, 0xb4, 0x11, 0x40, 0x70, 0x30, 0xd0, 0x84, + 0x11, 0x18, 0xb8, 0x00, 0xd0, 0xbc, 0x11, 0x10, 0x08, 0x0c, 0x61, 0xb7, + 0x81, 0x08, 0x1f, 0x04, 0x24, 0x5d, 0x00, 0xbe, 0x01, 0x5e, 0x00, 0xce, + 0x00, 0x4e, 0x08, 0x0c, 0xac, 0xfc, 0x08, 0x0c, 0xaf, 0xd2, 0x08, 0x0c, + 0xb0, 0x9b, 0x08, 0x0c, 0xad, 0x18, 0x60, 0xe3, 0x00, 0x00, 0x00, 0x1e, + 0x20, 0x01, 0x18, 0x00, 0x20, 0x14, 0x92, 0x96, 0x00, 0x04, 0x11, 0x70, + 0xd1, 0x9c, 0x11, 0xb0, 0x20, 0x11, 0x18, 0x0c, 0x22, 0x14, 0xd2, 0x9c, + 0x11, 0x20, 0x62, 0x04, 0x92, 0x95, 0x00, 0x02, 0x62, 0x06, 0x62, 0x28, + 0xc2, 0x9d, 0x62, 0x2a, 0x20, 0x03, 0x00, 0x01, 0x20, 0x01, 0x18, 0x26, + 0x20, 0x03, 0x00, 0x00, 0x20, 0x11, 0x00, 0x20, 0x08, 0x0c, 0x2a, 0xd3, + 0xd1, 0x94, 0x09, 0x04, 0x25, 0x8b, 0x00, 0x16, 0x08, 0x0c, 0xac, 0xfc, + 0x62, 0x20, 0xd2, 0xb4, 0x09, 0x04, 0x25, 0x26, 0x08, 0x0c, 0x8a, 0x4b, + 0x08, 0x0c, 0xa2, 0xa0, 0x20, 0x11, 0x00, 0x04, 0x08, 0x0c, 0x2a, 0xd3, + 0x00, 0xf6, 0x20, 0x19, 0x19, 0xf4, 0x23, 0x04, 0x90, 0x7d, 0x09, 0x04, + 0x24, 0xf3, 0x78, 0x04, 0x90, 0x86, 0x00, 0x32, 0x15, 0xf0, 0x00, 0xd6, + 0x00, 0xc6, 0x00, 0xe6, 0x00, 0x96, 0x20, 0x69, 0x01, 0x40, 0x78, 0x2c, + 0x68, 0x5e, 0x78, 0x08, 0x68, 0x5a, 0x60, 0x43, 0x00, 0x02, 0x20, 0x01, + 0x00, 0x03, 0x80, 0x01, 0x1d, 0xf0, 0x60, 0x43, 0x00, 0x00, 0x20, 0x01, + 0x00, 0x3c, 0x80, 0x01, 0x1d, 0xf0, 0x08, 0x0c, 0x2a, 0xa9, 0x20, 0x01, + 0x00, 0x1e, 0x80, 0x01, 0x02, 0x40, 0x20, 0xa9, 0x00, 0x09, 0x08, 0x0c, + 0x2a, 0x60, 0x69, 0x04, 0xd1, 0xdc, 0x11, 0x40, 0x0c, 0xb0, 0x20, 0x01, + 0x01, 0x00, 0x08, 0x0c, 0x2a, 0x99, 0x90, 0x06, 0x08, 0x0c, 0x2a, 0x99, + 0x08, 0x0c, 0x99, 0xed, 0x08, 0x0c, 0xad, 0x18, 0x78, 0x14, 0x20, 0x48, + 0xa8, 0x67, 0x01, 0x03, 0x2f, 0x60, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x9e, + 0x00, 0xee, 0x00, 0xce, 0x00, 0xde, 0x00, 0xfe, 0x00, 0x1e, 0x00, 0xae, + 0x00, 0x05, 0x00, 0xfe, 0x00, 0xd6, 0x20, 0x69, 0x01, 0x40, 0x68, 0x04, + 0x90, 0x84, 0x40, 0x00, 0x01, 0x10, 0x08, 0x0c, 0x2a, 0xa9, 0x00, 0xde, + 0x00, 0xc6, 0x20, 0x61, 0x19, 0xe8, 0x60, 0x34, 0x08, 0x0c, 0xd6, 0x45, + 0x01, 0x20, 0x90, 0x9a, 0x00, 0x03, 0x12, 0x58, 0x00, 0x18, 0x90, 0x9a, + 0x00, 0xc8, 0x12, 0x38, 0x80, 0x00, 0x60, 0x36, 0x00, 0xce, 0x08, 0x0c, + 0xa2, 0x78, 0x08, 0x04, 0x25, 0x88, 0x20, 0x61, 0x01, 0x00, 0x62, 0xc0, + 0x08, 0x0c, 0xac, 0x2d, 0x20, 0x19, 0x19, 0xf4, 0x23, 0x04, 0x90, 0x65, + 0x01, 0x30, 0x60, 0x03, 0x00, 0x01, 0x20, 0x09, 0x00, 0x27, 0x08, 0x0c, + 0xb2, 0x0a, 0x00, 0xce, 0x08, 0x04, 0x25, 0x88, 0xd2, 0xbc, 0x09, 0x04, + 0x25, 0x6b, 0x08, 0x0c, 0x8a, 0x58, 0x20, 0x11, 0x00, 0x04, 0x08, 0x0c, + 0x2a, 0xd3, 0x00, 0xd6, 0x20, 0x69, 0x01, 0x40, 0x68, 0x04, 0x90, 0x84, + 0x40, 0x00, 0x01, 0x10, 0x08, 0x0c, 0x2a, 0xa9, 0x00, 0xde, 0x00, 0xc6, + 0x20, 0x61, 0x19, 0xe8, 0x60, 0x50, 0x08, 0x0c, 0xd6, 0x45, 0x01, 0x20, + 0x90, 0x9a, 0x00, 0x03, 0x16, 0x68, 0x00, 0x18, 0x90, 0x9a, 0x00, 0xc8, + 0x16, 0x48, 0x80, 0x00, 0x60, 0x52, 0x60, 0x4c, 0x00, 0xce, 0x90, 0x05, + 0x05, 0xd8, 0x20, 0x09, 0x07, 0xd0, 0x08, 0x0c, 0x8a, 0x50, 0x90, 0x80, + 0x00, 0x08, 0x20, 0x04, 0x90, 0x86, 0x00, 0x06, 0x11, 0x38, 0x20, 0x09, + 0x19, 0x84, 0x20, 0x11, 0x00, 0x12, 0x08, 0x0c, 0x2a, 0xe2, 0x04, 0x50, + 0x90, 0x80, 0x00, 0x08, 0x20, 0x04, 0x90, 0x86, 0x00, 0x09, 0x0d, 0x98, + 0x20, 0x09, 0x19, 0x84, 0x20, 0x11, 0x00, 0x16, 0x08, 0x0c, 0x2a, 0xe2, + 0x00, 0xe8, 0x20, 0x11, 0x00, 0x04, 0x08, 0x0c, 0x2a, 0xd3, 0x00, 0xc0, + 0x00, 0x36, 0x20, 0x19, 0x00, 0x01, 0x08, 0x0c, 0xa5, 0x96, 0x00, 0x3e, + 0x20, 0x19, 0x19, 0xfb, 0x23, 0x04, 0x90, 0x65, 0x01, 0x60, 0x20, 0x09, + 0x00, 0x4f, 0x60, 0x20, 0x90, 0x86, 0x00, 0x09, 0x11, 0x10, 0x20, 0x09, + 0x00, 0x4f, 0x60, 0x03, 0x00, 0x03, 0x08, 0x0c, 0xb2, 0x0a, 0x00, 0xce, + 0x08, 0x0c, 0xad, 0x18, 0x00, 0x1e, 0xd1, 0x9c, 0x09, 0x04, 0x25, 0xef, + 0x70, 0x38, 0xd0, 0xac, 0x15, 0x58, 0x00, 0x16, 0x01, 0x56, 0x20, 0x11, + 0x00, 0x08, 0x08, 0x0c, 0x2a, 0xd3, 0x08, 0x0c, 0x2a, 0xf6, 0x08, 0x0c, + 0x2b, 0x29, 0x60, 0x50, 0xc0, 0xe5, 0x60, 0x52, 0x20, 0xa9, 0x03, 0x67, + 0x0f, 0x04, 0x25, 0xba, 0x1d, 0x04, 0x25, 0xa2, 0x08, 0x0c, 0x8a, 0x7f, + 0x60, 0x20, 0xd0, 0x9c, 0x1d, 0xb8, 0x00, 0xf6, 0x20, 0x79, 0x01, 0x00, + 0x08, 0x0c, 0x2a, 0x0c, 0x00, 0xfe, 0x1d, 0x80, 0x60, 0x50, 0xc0, 0xe4, + 0x60, 0x52, 0x20, 0x11, 0x00, 0x08, 0x08, 0x0c, 0x2a, 0xd3, 0x01, 0x5e, + 0x00, 0x1e, 0x04, 0xa8, 0x01, 0x5e, 0x00, 0x1e, 0x00, 0x16, 0x60, 0x28, + 0xc0, 0x9c, 0x60, 0x2a, 0x08, 0x0c, 0xac, 0xfc, 0x08, 0x0c, 0xaf, 0xd2, + 0x08, 0x0c, 0xb0, 0x9b, 0x08, 0x0c, 0xad, 0x18, 0x60, 0xe3, 0x00, 0x00, + 0x08, 0x0c, 0xee, 0xd9, 0x08, 0x0c, 0xee, 0xf4, 0x08, 0x0c, 0x58, 0x44, + 0xd0, 0xfc, 0x11, 0x38, 0x08, 0x0c, 0xd6, 0x3e, 0x11, 0x20, 0x90, 0x85, + 0x00, 0x01, 0x08, 0x0c, 0x77, 0xe2, 0x90, 0x06, 0x08, 0x0c, 0x2a, 0x99, + 0x20, 0x09, 0x00, 0x02, 0x08, 0x0c, 0x2a, 0x85, 0x00, 0xe6, 0x20, 0x71, + 0x18, 0x00, 0x70, 0x03, 0x00, 0x04, 0x08, 0x0c, 0x0e, 0xd3, 0x00, 0xee, + 0x20, 0x11, 0x00, 0x08, 0x08, 0x0c, 0x2a, 0xd3, 0x08, 0x0c, 0x0b, 0xcf, + 0x00, 0x1e, 0x91, 0x8c, 0xff, 0xd0, 0x21, 0x10, 0x08, 0x0c, 0x2a, 0xd3, + 0x00, 0xae, 0x00, 0x05, 0x00, 0x16, 0x20, 0x01, 0x03, 0x87, 0x20, 0x0c, + 0xd1, 0xa4, 0x00, 0x1e, 0x09, 0x04, 0x23, 0x90, 0x00, 0x16, 0x20, 0x09, + 0x26, 0x02, 0x00, 0xc0, 0x20, 0x01, 0x03, 0x87, 0x20, 0x03, 0x10, 0x00, + 0x00, 0x1e, 0x0c, 0x38, 0x00, 0x16, 0x20, 0x01, 0x03, 0x87, 0x20, 0x0c, + 0xd1, 0xb4, 0x00, 0x1e, 0x09, 0x04, 0x23, 0x90, 0x00, 0x16, 0x20, 0x09, + 0x26, 0x14, 0x00, 0x30, 0x20, 0x01, 0x03, 0x87, 0x20, 0x03, 0x40, 0x00, + 0x00, 0x1e, 0x08, 0xa8, 0x60, 0x28, 0xc0, 0xbc, 0x60, 0x2a, 0x20, 0x01, + 0x01, 0x56, 0x20, 0x03, 0xbc, 0x91, 0x80, 0x00, 0x20, 0x03, 0xff, 0xff, + 0x60, 0x43, 0x00, 0x01, 0x08, 0x0c, 0x2a, 0x7f, 0x20, 0x11, 0x00, 0x80, + 0x08, 0x0c, 0x2a, 0xd3, 0x60, 0x17, 0x00, 0x00, 0x60, 0x43, 0x00, 0x00, + 0x08, 0x17, 0x00, 0x06, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x00, 0xe6, + 0x00, 0xf6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0x18, 0x00, + 0x71, 0xd0, 0x70, 0xd2, 0x91, 0x16, 0x09, 0x04, 0x26, 0x84, 0x81, 0xff, + 0x01, 0xa0, 0x20, 0x09, 0x00, 0x00, 0x08, 0x0c, 0x2a, 0x85, 0x20, 0x11, + 0x80, 0x11, 0x20, 0x19, 0x01, 0x0e, 0x23, 0x1c, 0x93, 0x9e, 0x00, 0x07, + 0x11, 0x18, 0x20, 0x19, 0x00, 0x01, 0x00, 0x10, 0x20, 0x19, 0x00, 0x00, + 0x08, 0x0c, 0x4c, 0xa1, 0x04, 0x68, 0x20, 0x01, 0x19, 0xa9, 0x20, 0x0c, + 0x81, 0xff, 0x11, 0x40, 0x20, 0x01, 0x01, 0x09, 0x20, 0x04, 0xd0, 0xb4, + 0x01, 0x18, 0x20, 0x19, 0x00, 0x03, 0x00, 0x08, 0x21, 0x18, 0x20, 0x11, + 0x80, 0x12, 0x08, 0x0c, 0x4c, 0xa1, 0x08, 0x0c, 0x0e, 0xd3, 0x08, 0x0c, + 0x58, 0x44, 0xd0, 0xfc, 0x11, 0xa8, 0x08, 0x0c, 0xd6, 0x3e, 0x11, 0x90, + 0x00, 0xc6, 0x08, 0x0c, 0x27, 0x20, 0x08, 0x0c, 0xac, 0xfc, 0x08, 0x0c, + 0xa4, 0xf1, 0x08, 0x0c, 0xad, 0x18, 0x20, 0x61, 0x01, 0x00, 0x20, 0x19, + 0x00, 0x28, 0x20, 0x09, 0x00, 0x02, 0x08, 0x0c, 0x32, 0xda, 0x00, 0xce, + 0x01, 0x2e, 0x00, 0xfe, 0x00, 0xee, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, + 0x00, 0x0e, 0x00, 0x05, 0x20, 0x28, 0x91, 0x8c, 0x00, 0xff, 0x21, 0x30, + 0x90, 0x94, 0xff, 0x00, 0x11, 0xf0, 0x20, 0x11, 0x18, 0x37, 0x22, 0x14, + 0xd2, 0xac, 0x11, 0xc8, 0x81, 0xff, 0x01, 0xe8, 0x20, 0x11, 0x18, 0x1f, + 0x22, 0x04, 0x91, 0x06, 0x11, 0x90, 0x20, 0x11, 0x18, 0x20, 0x22, 0x14, + 0x92, 0x94, 0xff, 0x00, 0x95, 0x84, 0xff, 0x00, 0x92, 0x06, 0x11, 0x48, + 0x20, 0x11, 0x18, 0x20, 0x22, 0x14, 0x92, 0x94, 0x00, 0xff, 0x95, 0x84, + 0x00, 0xff, 0x92, 0x06, 0x11, 0x20, 0x25, 0x00, 0x08, 0x0c, 0x85, 0x21, + 0x00, 0x48, 0x95, 0x84, 0x00, 0xff, 0x90, 0x80, 0x34, 0x8e, 0x20, 0x0d, + 0x91, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0x90, 0x06, 0x00, 0x05, 0x90, 0x80, + 0x34, 0x8e, 0x20, 0x0d, 0x91, 0x8c, 0x00, 0xff, 0x00, 0x05, 0x00, 0xd6, + 0x20, 0x69, 0x01, 0x40, 0x20, 0x01, 0x18, 0x18, 0x20, 0x03, 0x00, 0xef, + 0x20, 0xa9, 0x00, 0x10, 0x90, 0x06, 0x68, 0x52, 0x68, 0x56, 0x1f, 0x04, + 0x26, 0xd0, 0x00, 0xde, 0x00, 0x05, 0x00, 0x06, 0x00, 0xd6, 0x00, 0x26, + 0x20, 0x69, 0x01, 0x40, 0x20, 0x01, 0x18, 0x18, 0x21, 0x02, 0x81, 0x14, + 0x82, 0x14, 0x82, 0x14, 0x82, 0x14, 0x20, 0xa9, 0x00, 0x10, 0x68, 0x53, + 0x00, 0x00, 0x90, 0x06, 0x82, 0xff, 0x11, 0x28, 0x91, 0x84, 0x00, 0x0f, + 0x90, 0x80, 0xef, 0x08, 0x20, 0x05, 0x68, 0x56, 0x82, 0x11, 0x1f, 0x04, + 0x26, 0xe5, 0x00, 0x2e, 0x00, 0xde, 0x00, 0x0e, 0x00, 0x05, 0x00, 0xc6, + 0x20, 0x61, 0x18, 0x00, 0x60, 0x30, 0x01, 0x10, 0xc0, 0x9d, 0x00, 0x08, + 0xc0, 0x9c, 0x60, 0x32, 0x00, 0xce, 0x00, 0x05, 0x01, 0x56, 0x00, 0xd6, + 0x00, 0x26, 0x00, 0x16, 0x00, 0x06, 0x20, 0x69, 0x01, 0x40, 0x69, 0x80, + 0x91, 0x16, 0x01, 0x80, 0x91, 0x12, 0x12, 0x30, 0x82, 0x12, 0x82, 0x10, + 0x22, 0xa8, 0x20, 0x01, 0x04, 0x02, 0x00, 0x18, 0x22, 0xa8, 0x20, 0x01, + 0x04, 0x04, 0x68, 0x0e, 0x1f, 0x04, 0x27, 0x15, 0x68, 0x0f, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0xde, 0x01, 0x5e, 0x00, 0x05, + 0x08, 0x0c, 0x58, 0x40, 0xd0, 0xc4, 0x01, 0x50, 0xd0, 0xa4, 0x01, 0x40, + 0x90, 0x06, 0x00, 0x46, 0x20, 0x20, 0x20, 0x09, 0x00, 0x2e, 0x08, 0x0c, + 0xea, 0x8d, 0x00, 0x4e, 0x00, 0x05, 0x00, 0xf6, 0x00, 0x16, 0x00, 0x26, + 0x20, 0x79, 0x01, 0x40, 0x78, 0xc4, 0xd0, 0xdc, 0x09, 0x04, 0x27, 0x8c, + 0x08, 0x0c, 0x29, 0xfc, 0x06, 0x60, 0x90, 0x84, 0x07, 0x00, 0x90, 0x8e, + 0x06, 0x00, 0x11, 0x20, 0x20, 0x11, 0x40, 0x00, 0x90, 0x0e, 0x04, 0x58, + 0x90, 0x8e, 0x05, 0x00, 0x11, 0x20, 0x20, 0x11, 0x80, 0x00, 0x90, 0x0e, + 0x04, 0x20, 0x90, 0x8e, 0x04, 0x00, 0x11, 0x20, 0x90, 0x16, 0x20, 0x09, + 0x00, 0x01, 0x00, 0xe8, 0x90, 0x8e, 0x03, 0x00, 0x11, 0x20, 0x90, 0x16, + 0x20, 0x09, 0x00, 0x02, 0x00, 0xb0, 0x90, 0x8e, 0x02, 0x00, 0x11, 0x20, + 0x90, 0x16, 0x20, 0x09, 0x00, 0x04, 0x00, 0x78, 0x90, 0x8e, 0x01, 0x00, + 0x15, 0x48, 0x90, 0x16, 0x20, 0x09, 0x00, 0x08, 0x00, 0x40, 0x90, 0x84, + 0x07, 0x00, 0x90, 0x8e, 0x03, 0x00, 0x15, 0x00, 0x20, 0x11, 0x00, 0x30, + 0x00, 0x58, 0x23, 0x00, 0x90, 0x80, 0x00, 0x20, 0x20, 0x18, 0x08, 0x0c, + 0x95, 0x5b, 0x92, 0x8c, 0xff, 0x00, 0x01, 0x10, 0x20, 0x11, 0x00, 0xff, + 0x22, 0x00, 0x80, 0x07, 0x90, 0x85, 0x00, 0x4c, 0x78, 0xc2, 0x20, 0x09, + 0x01, 0x38, 0x22, 0x0a, 0x08, 0x0c, 0x77, 0x9e, 0x11, 0x18, 0x20, 0x09, + 0x19, 0x6d, 0x22, 0x0a, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0xfe, 0x00, 0x05, + 0x78, 0xc3, 0x00, 0x00, 0x0c, 0xc8, 0x01, 0x26, 0x20, 0x91, 0x28, 0x00, + 0x00, 0x06, 0x00, 0x16, 0x00, 0x26, 0x20, 0x01, 0x01, 0x70, 0x20, 0x0c, + 0x80, 0x00, 0x20, 0x14, 0x91, 0x84, 0x00, 0x03, 0x01, 0x10, 0x08, 0x0c, + 0x0d, 0x7e, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x0e, 0x01, 0x2e, 0x00, 0x05, + 0x20, 0x01, 0x18, 0x0d, 0x20, 0x04, 0xd0, 0x8c, 0x01, 0x18, 0x20, 0x09, + 0x00, 0x02, 0x00, 0x05, 0x20, 0x01, 0x01, 0x71, 0x20, 0x04, 0xd0, 0xdc, + 0x01, 0x68, 0x20, 0x01, 0x01, 0x70, 0x20, 0x0c, 0x91, 0x8c, 0x00, 0xff, + 0x91, 0x8e, 0x00, 0x4c, 0x11, 0x28, 0x20, 0x0c, 0x91, 0x8c, 0xff, 0x00, + 0x81, 0x0f, 0x00, 0x05, 0x90, 0x0e, 0x20, 0x01, 0x02, 0x27, 0x20, 0x04, + 0x80, 0x07, 0x90, 0x84, 0x00, 0xff, 0x80, 0x04, 0x91, 0x08, 0x20, 0x01, + 0x02, 0x26, 0x20, 0x04, 0x80, 0x07, 0x90, 0x84, 0x00, 0xff, 0x80, 0x04, + 0x91, 0x08, 0x00, 0x05, 0x00, 0x18, 0x00, 0x0c, 0x00, 0x18, 0x00, 0x20, + 0x10, 0x00, 0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x01, 0x56, 0x00, 0x06, + 0x00, 0x16, 0x00, 0x26, 0x00, 0xe6, 0x20, 0x01, 0x19, 0x90, 0x20, 0x04, + 0x90, 0x8a, 0x00, 0x07, 0x1a, 0x0c, 0x0d, 0x85, 0x00, 0x33, 0x00, 0xee, + 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x0e, 0x01, 0x5e, 0x00, 0x05, 0x27, 0xf2, + 0x28, 0x10, 0x28, 0x34, 0x28, 0x36, 0x28, 0x5f, 0x28, 0x61, 0x28, 0x63, + 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x26, 0x31, 0x08, 0x0c, 0x2a, 0x4a, + 0x20, 0x01, 0x19, 0x92, 0x20, 0x03, 0x00, 0x00, 0x78, 0x28, 0x90, 0x84, + 0xe1, 0xd7, 0x78, 0x2a, 0x90, 0x06, 0x20, 0xa9, 0x00, 0x09, 0x08, 0x0c, + 0x2a, 0x18, 0x20, 0x01, 0x19, 0x90, 0x20, 0x03, 0x00, 0x06, 0x20, 0x09, + 0x00, 0x1e, 0x20, 0x11, 0x28, 0x64, 0x08, 0x0c, 0x8a, 0x5d, 0x00, 0x05, + 0x20, 0x09, 0x19, 0x95, 0x20, 0x0b, 0x00, 0x00, 0x20, 0x01, 0x19, 0x9a, + 0x20, 0x03, 0x00, 0x36, 0x20, 0x01, 0x19, 0x99, 0x20, 0x03, 0x00, 0x2a, + 0x20, 0x01, 0x19, 0x92, 0x20, 0x03, 0x00, 0x01, 0x90, 0x06, 0x08, 0x0c, + 0x29, 0xad, 0x20, 0x01, 0xff, 0xff, 0x20, 0xa9, 0x00, 0x09, 0x08, 0x0c, + 0x2a, 0x18, 0x20, 0x01, 0x19, 0x90, 0x20, 0x03, 0x00, 0x06, 0x20, 0x09, + 0x00, 0x1e, 0x20, 0x11, 0x28, 0x64, 0x08, 0x0c, 0x8a, 0x5d, 0x00, 0x05, + 0x08, 0x0c, 0x0d, 0x85, 0x20, 0x01, 0x19, 0x9a, 0x20, 0x03, 0x00, 0x36, + 0x20, 0x01, 0x19, 0x92, 0x20, 0x03, 0x00, 0x03, 0x7a, 0x38, 0x92, 0x94, + 0x00, 0x05, 0x92, 0x96, 0x00, 0x04, 0x01, 0x10, 0x90, 0x06, 0x00, 0x10, + 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x29, 0xad, 0x20, 0x01, 0x19, 0x96, + 0x20, 0x03, 0x00, 0x00, 0x20, 0x01, 0xff, 0xff, 0x20, 0xa9, 0x00, 0x09, + 0x08, 0x0c, 0x2a, 0x18, 0x20, 0x01, 0x19, 0x90, 0x20, 0x03, 0x00, 0x06, + 0x20, 0x09, 0x00, 0x1e, 0x20, 0x11, 0x28, 0x64, 0x08, 0x0c, 0x8a, 0x5d, + 0x00, 0x05, 0x08, 0x0c, 0x0d, 0x85, 0x08, 0x0c, 0x0d, 0x85, 0x00, 0x05, + 0x00, 0x06, 0x00, 0x16, 0x00, 0x26, 0x00, 0xe6, 0x00, 0xf6, 0x01, 0x56, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x79, 0x01, 0x00, 0x20, 0x01, + 0x19, 0x92, 0x20, 0x04, 0x90, 0x8a, 0x00, 0x07, 0x1a, 0x0c, 0x0d, 0x85, + 0x00, 0x43, 0x01, 0x2e, 0x01, 0x5e, 0x00, 0xfe, 0x00, 0xee, 0x00, 0x2e, + 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, 0x28, 0x86, 0x28, 0xa2, 0x28, 0xde, + 0x29, 0x0a, 0x29, 0x2a, 0x29, 0x36, 0x29, 0x38, 0x08, 0x0c, 0x2a, 0x0c, + 0x11, 0x90, 0x20, 0x09, 0x19, 0x98, 0x21, 0x04, 0x7a, 0x38, 0x92, 0x94, + 0x00, 0x05, 0x92, 0x96, 0x00, 0x04, 0x01, 0x10, 0xc0, 0x8d, 0x00, 0x08, + 0xc0, 0x85, 0x20, 0x0a, 0x20, 0x01, 0x19, 0x90, 0x20, 0x03, 0x00, 0x01, + 0x00, 0x30, 0x08, 0x0c, 0x29, 0x5c, 0x20, 0x01, 0xff, 0xff, 0x08, 0x0c, + 0x28, 0x01, 0x00, 0x05, 0x08, 0x0c, 0x29, 0x3a, 0x05, 0xc0, 0x20, 0x09, + 0x19, 0x99, 0x21, 0x04, 0x80, 0x01, 0x20, 0x0a, 0x08, 0x0c, 0x2a, 0x0c, + 0x11, 0x58, 0x7a, 0x38, 0x92, 0x94, 0x00, 0x05, 0x92, 0x96, 0x00, 0x05, + 0x05, 0x18, 0x20, 0x09, 0x19, 0x98, 0x21, 0x04, 0xc0, 0x85, 0x20, 0x0a, + 0x20, 0x09, 0x19, 0x95, 0x21, 0x04, 0x80, 0x00, 0x20, 0x0a, 0x90, 0x86, + 0x00, 0x05, 0x01, 0x18, 0x08, 0x0c, 0x29, 0x42, 0x00, 0xc0, 0x20, 0x0b, + 0x00, 0x00, 0x7a, 0x38, 0x92, 0x94, 0x00, 0x06, 0x92, 0x96, 0x00, 0x04, + 0x01, 0x10, 0x90, 0x06, 0x00, 0x10, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, + 0x29, 0xca, 0x20, 0x01, 0x19, 0x92, 0x20, 0x03, 0x00, 0x02, 0x00, 0x28, + 0x20, 0x01, 0x19, 0x90, 0x20, 0x03, 0x00, 0x03, 0x00, 0x10, 0x08, 0x0c, + 0x28, 0x23, 0x00, 0x05, 0x08, 0x0c, 0x29, 0x3a, 0x05, 0x40, 0x20, 0x09, + 0x19, 0x99, 0x21, 0x04, 0x80, 0x01, 0x20, 0x0a, 0x08, 0x0c, 0x2a, 0x0c, + 0x11, 0x48, 0x20, 0x01, 0x19, 0x90, 0x20, 0x03, 0x00, 0x03, 0x20, 0x01, + 0x19, 0x91, 0x20, 0x03, 0x00, 0x00, 0x00, 0xb8, 0x20, 0x09, 0x19, 0x99, + 0x21, 0x04, 0x90, 0x05, 0x11, 0x18, 0x08, 0x0c, 0x29, 0x7f, 0x00, 0x10, + 0x08, 0x0c, 0x29, 0x4f, 0x08, 0x0c, 0x29, 0x42, 0x20, 0x09, 0x19, 0x95, + 0x20, 0x0b, 0x00, 0x00, 0x20, 0x01, 0x19, 0x92, 0x20, 0x03, 0x00, 0x01, + 0x08, 0x0c, 0x28, 0x23, 0x00, 0x00, 0x00, 0x05, 0x04, 0x79, 0x01, 0xe8, + 0x08, 0x0c, 0x2a, 0x0c, 0x11, 0x98, 0x20, 0x09, 0x19, 0x96, 0x21, 0x04, + 0x80, 0x00, 0x20, 0x0a, 0x90, 0x86, 0x00, 0x07, 0x01, 0x08, 0x00, 0x78, + 0x20, 0x01, 0x19, 0x9b, 0x20, 0x03, 0x00, 0x0a, 0x20, 0x09, 0x19, 0x98, + 0x21, 0x04, 0xc0, 0xfd, 0x20, 0x0a, 0x00, 0x38, 0x00, 0xf9, 0x20, 0x01, + 0x19, 0x92, 0x20, 0x03, 0x00, 0x04, 0x08, 0x0c, 0x28, 0x4e, 0x00, 0x05, + 0x00, 0x79, 0x01, 0x48, 0x08, 0x0c, 0x2a, 0x0c, 0x11, 0x18, 0x08, 0x0c, + 0x28, 0x3a, 0x00, 0x18, 0x00, 0x79, 0x08, 0x0c, 0x28, 0x4e, 0x00, 0x05, + 0x08, 0x0c, 0x0d, 0x85, 0x08, 0x0c, 0x0d, 0x85, 0x20, 0x09, 0x19, 0x9a, + 0x21, 0x04, 0x80, 0x01, 0x20, 0x0a, 0x09, 0x0c, 0x29, 0x9b, 0x00, 0x05, + 0x7a, 0x38, 0x92, 0x94, 0x00, 0x05, 0x92, 0x96, 0x00, 0x05, 0x01, 0x10, + 0x90, 0x06, 0x00, 0x10, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x29, 0xca, + 0x00, 0x05, 0x7a, 0x38, 0x92, 0x94, 0x00, 0x06, 0x92, 0x96, 0x00, 0x06, + 0x01, 0x10, 0x90, 0x06, 0x00, 0x10, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, + 0x29, 0xad, 0x00, 0x05, 0x20, 0x09, 0x19, 0x95, 0x21, 0x04, 0x80, 0x00, + 0x20, 0x0a, 0x90, 0x86, 0x00, 0x05, 0x01, 0x08, 0x00, 0x68, 0x20, 0x0b, + 0x00, 0x00, 0x7a, 0x38, 0x92, 0x94, 0x00, 0x06, 0x92, 0x96, 0x00, 0x06, + 0x01, 0x10, 0x90, 0x06, 0x00, 0x10, 0x20, 0x01, 0x00, 0x01, 0x04, 0xd9, + 0x7a, 0x38, 0x92, 0x94, 0x00, 0x05, 0x92, 0x96, 0x00, 0x05, 0x01, 0x10, + 0x90, 0x06, 0x00, 0x10, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x29, 0xca, + 0x00, 0x05, 0x00, 0x86, 0x20, 0x01, 0x19, 0x98, 0x20, 0x04, 0x90, 0x84, + 0x7f, 0xff, 0x09, 0x0c, 0x0d, 0x85, 0x20, 0x09, 0x19, 0x97, 0x21, 0x44, + 0x88, 0x46, 0x28, 0x0a, 0x98, 0x44, 0x0d, 0xd8, 0xd0, 0x8c, 0x11, 0x20, + 0xd0, 0x84, 0x11, 0x20, 0x08, 0x0c, 0x0d, 0x85, 0x90, 0x06, 0x00, 0x10, + 0x20, 0x01, 0x00, 0x01, 0x00, 0xa1, 0x00, 0x8e, 0x00, 0x05, 0x00, 0x06, + 0x01, 0x56, 0x20, 0x01, 0x19, 0x90, 0x20, 0xa9, 0x00, 0x09, 0x20, 0x03, + 0x00, 0x00, 0x80, 0x00, 0x1f, 0x04, 0x29, 0xa1, 0x20, 0x01, 0x19, 0x97, + 0x20, 0x03, 0x80, 0x00, 0x01, 0x5e, 0x00, 0x0e, 0x00, 0x05, 0x00, 0xf6, + 0x20, 0x79, 0x01, 0x00, 0x90, 0x85, 0x00, 0x00, 0x01, 0x58, 0x78, 0x38, + 0x90, 0x84, 0xff, 0xf9, 0x90, 0x85, 0x00, 0x04, 0x78, 0x3a, 0x20, 0x09, + 0x19, 0x9d, 0x21, 0x0c, 0x79, 0x5a, 0x00, 0x50, 0x78, 0x38, 0x90, 0x84, + 0xff, 0xfb, 0x90, 0x85, 0x00, 0x06, 0x78, 0x3a, 0x20, 0x09, 0x19, 0x9e, + 0x21, 0x0c, 0x79, 0x5a, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, 0x20, 0x79, + 0x01, 0x00, 0x90, 0x85, 0x00, 0x00, 0x01, 0x58, 0x78, 0x38, 0x90, 0x84, + 0xff, 0xfa, 0x90, 0x85, 0x00, 0x04, 0x78, 0x3a, 0x78, 0x50, 0x90, 0x84, + 0xff, 0xf0, 0x78, 0x52, 0x00, 0xf8, 0x78, 0x38, 0x90, 0x84, 0xff, 0xfb, + 0x90, 0x85, 0x00, 0x05, 0x78, 0x3a, 0x78, 0x50, 0x90, 0x84, 0xff, 0xf0, + 0x00, 0x16, 0x20, 0x09, 0x01, 0x7f, 0x21, 0x0c, 0x91, 0x8e, 0x00, 0x05, + 0x01, 0x40, 0x20, 0x09, 0x00, 0x03, 0x21, 0x0c, 0x91, 0x8c, 0x06, 0x00, + 0x91, 0x8e, 0x04, 0x00, 0x01, 0x18, 0x90, 0x85, 0x00, 0x0a, 0x00, 0x10, + 0x90, 0x85, 0x00, 0x00, 0x00, 0x1e, 0x78, 0x52, 0x00, 0xfe, 0x00, 0x05, + 0x00, 0x06, 0x20, 0x01, 0x01, 0x00, 0x20, 0x04, 0x90, 0x82, 0x00, 0x07, + 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0x01, 0x00, 0x20, 0x04, + 0x90, 0x82, 0x00, 0x09, 0x00, 0x0e, 0x00, 0x05, 0x01, 0x56, 0x20, 0xa9, + 0x00, 0x64, 0x78, 0x20, 0x08, 0x0c, 0x2a, 0x7f, 0xd0, 0x9c, 0x11, 0x10, + 0x1f, 0x04, 0x2a, 0x0f, 0x01, 0x5e, 0x00, 0x05, 0x01, 0x26, 0x00, 0x16, + 0x00, 0x06, 0x20, 0x91, 0x80, 0x00, 0x00, 0x0e, 0x20, 0x08, 0x91, 0x86, + 0x00, 0x00, 0x11, 0x18, 0x78, 0x3b, 0x00, 0x07, 0x00, 0x90, 0x91, 0x86, + 0x00, 0x01, 0x11, 0x18, 0x78, 0x3b, 0x00, 0x06, 0x00, 0x60, 0x91, 0x86, + 0x00, 0x02, 0x11, 0x18, 0x78, 0x3b, 0x00, 0x05, 0x00, 0x30, 0x91, 0x86, + 0x00, 0x03, 0x11, 0x18, 0x78, 0x3b, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, + 0x1d, 0x04, 0x2a, 0x38, 0x08, 0x0c, 0x8a, 0x7f, 0x1f, 0x04, 0x2a, 0x38, + 0x08, 0x0c, 0x2a, 0xf6, 0x08, 0x0c, 0x2b, 0x29, 0x78, 0x50, 0x90, 0x85, + 0x10, 0x00, 0x78, 0x52, 0x00, 0x0e, 0x00, 0x1e, 0x01, 0x2e, 0x00, 0x05, + 0x08, 0x0c, 0x2b, 0x29, 0x00, 0x05, 0x00, 0x06, 0x01, 0x56, 0x00, 0xf6, + 0x20, 0x79, 0x01, 0x00, 0x20, 0xa9, 0x00, 0x0a, 0x78, 0x54, 0xd0, 0xac, + 0x11, 0x00, 0x78, 0x54, 0xd0, 0x8c, 0x11, 0x10, 0x1f, 0x04, 0x2a, 0x57, + 0x00, 0xfe, 0x01, 0x5e, 0x00, 0x0e, 0x00, 0x05, 0x1d, 0x04, 0x2a, 0x60, + 0x08, 0x0c, 0x8a, 0x7f, 0x1f, 0x04, 0x2a, 0x60, 0x00, 0x05, 0x00, 0x06, + 0x20, 0x01, 0x19, 0x9c, 0x20, 0x04, 0x90, 0x86, 0x00, 0x00, 0x00, 0x0e, + 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0x19, 0x9c, 0x20, 0x04, 0x90, 0x86, + 0x00, 0x01, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0x19, 0x9c, + 0x20, 0x04, 0x90, 0x86, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x05, 0xa0, 0x01, + 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0x00, 0x05, 0x00, 0x06, + 0x20, 0x01, 0x19, 0xa9, 0x21, 0x02, 0x00, 0x0e, 0x00, 0x05, 0x20, 0x09, + 0x01, 0x71, 0x21, 0x04, 0xd0, 0xdc, 0x01, 0x40, 0x20, 0x09, 0x01, 0x70, + 0x21, 0x04, 0x20, 0x0b, 0x00, 0x80, 0xa0, 0x01, 0xa0, 0x01, 0x20, 0x0a, + 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, 0x08, 0x0c, 0x77, 0xb8, 0x01, 0x08, + 0xc0, 0xbc, 0x20, 0x09, 0x01, 0x40, 0x21, 0x14, 0x92, 0x94, 0x00, 0x01, + 0x92, 0x15, 0x22, 0x0a, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0x16, + 0x00, 0x26, 0x20, 0x09, 0x01, 0x40, 0x21, 0x14, 0x92, 0x94, 0x00, 0x01, + 0x92, 0x85, 0x10, 0x00, 0x20, 0x0a, 0x22, 0x0a, 0x00, 0x2e, 0x00, 0x1e, + 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, 0x20, 0x09, 0x01, 0x40, 0x21, 0x14, + 0x92, 0x94, 0x00, 0x01, 0x92, 0x15, 0x22, 0x0a, 0x00, 0x2e, 0x00, 0x1e, + 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, 0x20, 0x09, 0x01, 0x40, 0x21, 0x04, + 0x11, 0x28, 0x08, 0x0c, 0x77, 0xb8, 0x01, 0x10, 0xc0, 0xbc, 0x00, 0x08, + 0xc0, 0xbd, 0x20, 0x0a, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, 0x00, 0xf6, + 0x20, 0x79, 0x03, 0x80, 0x78, 0x43, 0x01, 0x01, 0x78, 0x44, 0xd0, 0x84, + 0x1d, 0xe8, 0x20, 0x01, 0x01, 0x09, 0x22, 0x02, 0x78, 0x43, 0x01, 0x00, + 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, 0x20, 0x79, 0x03, 0x80, 0x78, 0x43, + 0x02, 0x02, 0x78, 0x44, 0xd0, 0x8c, 0x1d, 0xe8, 0x20, 0x79, 0x01, 0x00, + 0x78, 0x14, 0x91, 0x04, 0x92, 0x05, 0x7a, 0x16, 0x20, 0x79, 0x03, 0x80, + 0x78, 0x43, 0x02, 0x00, 0x00, 0xfe, 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, + 0x00, 0x36, 0x00, 0xc6, 0x20, 0x61, 0x01, 0x00, 0x60, 0x50, 0x90, 0x84, + 0xfb, 0xff, 0x90, 0x85, 0x00, 0x40, 0x60, 0x52, 0x20, 0xa9, 0x00, 0x02, + 0x08, 0x0c, 0x2a, 0x60, 0x60, 0x50, 0x90, 0x85, 0x04, 0x00, 0x90, 0x84, + 0xff, 0x9f, 0x60, 0x52, 0x20, 0xa9, 0x00, 0x05, 0x08, 0x0c, 0x2a, 0x60, + 0x60, 0x54, 0xd0, 0xbc, 0x09, 0x0c, 0x0d, 0x85, 0x20, 0xa9, 0x00, 0x05, + 0x08, 0x0c, 0x2a, 0x60, 0x60, 0x54, 0xd0, 0xac, 0x09, 0x0c, 0x0d, 0x85, + 0x20, 0x09, 0x19, 0xb0, 0x90, 0x84, 0x7e, 0x00, 0x80, 0x07, 0x80, 0x04, + 0x80, 0x04, 0x20, 0x0a, 0x00, 0xce, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, + 0x00, 0x05, 0x00, 0x06, 0x00, 0xc6, 0x20, 0x61, 0x01, 0x00, 0x60, 0x50, + 0xc0, 0xcd, 0x60, 0x52, 0x00, 0xce, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x16, + 0x00, 0xc6, 0x00, 0xd6, 0x00, 0x06, 0x20, 0x61, 0x01, 0x00, 0x20, 0x69, + 0x01, 0x40, 0x60, 0x30, 0x00, 0x06, 0x60, 0x48, 0x00, 0x06, 0x60, 0xe4, + 0x00, 0x06, 0x60, 0xe8, 0x00, 0x06, 0x60, 0x50, 0x00, 0x06, 0x60, 0xec, + 0x00, 0x06, 0x60, 0x0c, 0x00, 0x06, 0x60, 0x04, 0x00, 0x06, 0xc0, 0xfc, + 0x60, 0x06, 0x20, 0x09, 0x08, 0x00, 0x20, 0x01, 0x03, 0x38, 0x20, 0x03, + 0x03, 0x01, 0x81, 0x09, 0x09, 0x0c, 0x0d, 0x85, 0x20, 0x01, 0x03, 0x38, + 0x20, 0x04, 0xd0, 0x84, 0x1d, 0xc0, 0x60, 0x28, 0x00, 0x06, 0x60, 0xe0, + 0x00, 0x06, 0x68, 0x88, 0x00, 0x06, 0x68, 0x8c, 0x00, 0x06, 0x68, 0x90, + 0x00, 0x06, 0x08, 0x0c, 0x77, 0x9e, 0x11, 0x10, 0x68, 0x84, 0x00, 0x06, + 0x60, 0x2f, 0x01, 0x00, 0x60, 0x2f, 0x00, 0x00, 0xa0, 0x01, 0xa0, 0x01, + 0xa0, 0x01, 0xa0, 0x01, 0x60, 0x2f, 0x00, 0x40, 0x60, 0x2f, 0x00, 0x00, + 0x08, 0x0c, 0x77, 0x9e, 0x11, 0x20, 0x68, 0x03, 0x00, 0x80, 0x00, 0x0e, + 0x68, 0x86, 0x68, 0x97, 0x41, 0x98, 0x00, 0x0e, 0x68, 0x92, 0x00, 0x0e, + 0x68, 0x8e, 0x00, 0x0e, 0x68, 0x8a, 0x00, 0x0e, 0x60, 0xe2, 0x00, 0x0e, + 0x60, 0x2a, 0x00, 0x0e, 0x60, 0x06, 0x00, 0x0e, 0x60, 0x0e, 0x00, 0x0e, + 0x60, 0xee, 0x00, 0x0e, 0x60, 0x52, 0x00, 0x0e, 0x60, 0xea, 0x00, 0x0e, + 0x60, 0xe6, 0x00, 0x0e, 0x60, 0x4a, 0x00, 0x0e, 0x60, 0x32, 0x60, 0x36, + 0x20, 0x08, 0x08, 0x0c, 0x26, 0xd5, 0x00, 0x0e, 0x00, 0xde, 0x00, 0xce, + 0x00, 0x1e, 0x00, 0x05, 0x00, 0x06, 0x01, 0x56, 0x60, 0x50, 0x90, 0x85, + 0x00, 0x40, 0x60, 0x52, 0x60, 0x50, 0x90, 0x84, 0xfb, 0xcf, 0x60, 0x52, + 0x08, 0x0c, 0x2a, 0x7f, 0x90, 0x85, 0x20, 0x00, 0x60, 0x52, 0x20, 0xa9, + 0x00, 0x12, 0x1d, 0x04, 0x2b, 0xb3, 0x08, 0x0c, 0x8a, 0x7f, 0x1f, 0x04, + 0x2b, 0xb3, 0x60, 0x50, 0x90, 0x85, 0x04, 0x00, 0x90, 0x84, 0xdf, 0xbf, + 0x60, 0x52, 0x01, 0x5e, 0x00, 0x0e, 0x00, 0x05, 0x30, 0xbe, 0x30, 0xbe, + 0x2c, 0xc2, 0x2c, 0xc2, 0x2c, 0xce, 0x2c, 0xce, 0x2c, 0xda, 0x2c, 0xda, + 0x2c, 0xe8, 0x2c, 0xe8, 0x2c, 0xf4, 0x2c, 0xf4, 0x2d, 0x02, 0x2d, 0x02, + 0x2d, 0x10, 0x2d, 0x10, 0x2d, 0x22, 0x2d, 0x22, 0x2d, 0x2e, 0x2d, 0x2e, + 0x2d, 0x3c, 0x2d, 0x3c, 0x2d, 0x5a, 0x2d, 0x5a, 0x2d, 0x7a, 0x2d, 0x7a, + 0x2d, 0x4a, 0x2d, 0x4a, 0x2d, 0x6a, 0x2d, 0x6a, 0x2d, 0x88, 0x2d, 0x88, + 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, + 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, + 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, + 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, + 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, + 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x9a, 0x2d, 0x9a, 0x2d, 0xa6, 0x2d, 0xa6, + 0x2d, 0xb4, 0x2d, 0xb4, 0x2d, 0xc2, 0x2d, 0xc2, 0x2d, 0xd2, 0x2d, 0xd2, + 0x2d, 0xe0, 0x2d, 0xe0, 0x2d, 0xf0, 0x2d, 0xf0, 0x2e, 0x00, 0x2e, 0x00, + 0x2e, 0x12, 0x2e, 0x12, 0x2e, 0x20, 0x2e, 0x20, 0x2e, 0x30, 0x2e, 0x30, + 0x2e, 0x52, 0x2e, 0x52, 0x2e, 0x76, 0x2e, 0x76, 0x2e, 0x40, 0x2e, 0x40, + 0x2e, 0x64, 0x2e, 0x64, 0x2e, 0x86, 0x2e, 0x86, 0x2d, 0x20, 0x2d, 0x20, + 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, + 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, + 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, + 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, + 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, + 0x2e, 0x9a, 0x2e, 0x9a, 0x2e, 0xa6, 0x2e, 0xa6, 0x2e, 0xb4, 0x2e, 0xb4, + 0x2e, 0xc2, 0x2e, 0xc2, 0x2e, 0xd2, 0x2e, 0xd2, 0x2e, 0xe0, 0x2e, 0xe0, + 0x2e, 0xf0, 0x2e, 0xf0, 0x2f, 0x00, 0x2f, 0x00, 0x2f, 0x12, 0x2f, 0x12, + 0x2f, 0x20, 0x2f, 0x20, 0x2f, 0x30, 0x2f, 0x30, 0x2f, 0x40, 0x2f, 0x40, + 0x2f, 0x52, 0x2f, 0x52, 0x2f, 0x62, 0x2f, 0x62, 0x2f, 0x74, 0x2f, 0x74, + 0x2f, 0x86, 0x2f, 0x86, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, + 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, + 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, + 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, + 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, + 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2f, 0x9a, 0x2f, 0x9a, + 0x2f, 0xa8, 0x2f, 0xa8, 0x2f, 0xb8, 0x2f, 0xb8, 0x2f, 0xc8, 0x2f, 0xc8, + 0x2f, 0xda, 0x2f, 0xda, 0x2f, 0xea, 0x2f, 0xea, 0x2f, 0xfc, 0x2f, 0xfc, + 0x30, 0x0e, 0x30, 0x0e, 0x30, 0x22, 0x30, 0x22, 0x30, 0x32, 0x30, 0x32, + 0x30, 0x44, 0x30, 0x44, 0x30, 0x56, 0x30, 0x56, 0x30, 0x6a, 0x30, 0x6a, + 0x30, 0x7b, 0x30, 0x7b, 0x30, 0x8e, 0x30, 0x8e, 0x30, 0xa1, 0x30, 0xa1, + 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, + 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, + 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, + 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, + 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, 0x2d, 0x20, + 0x2d, 0x20, 0x2d, 0x20, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x22, 0xc8, + 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x20, 0xea, + 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x20, 0xea, + 0x08, 0x0c, 0x22, 0xc8, 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, + 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, + 0x08, 0x0c, 0x21, 0x14, 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, + 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, + 0x08, 0x0c, 0x22, 0xc8, 0x08, 0x0c, 0x21, 0x14, 0x08, 0x04, 0x30, 0xb6, + 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, + 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x20, 0xea, 0x08, 0x0c, 0x21, 0x14, + 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x20, 0xea, + 0x08, 0x0c, 0x22, 0xc8, 0x08, 0x0c, 0x21, 0x14, 0x08, 0x04, 0x30, 0xb6, + 0xa0, 0x01, 0x0c, 0xf0, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x13, 0xd4, + 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x22, 0xc8, + 0x08, 0x0c, 0x13, 0xd4, 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, + 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, + 0x08, 0x0c, 0x20, 0xea, 0x08, 0x0c, 0x13, 0xd4, 0x08, 0x04, 0x30, 0xb6, + 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, + 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x22, 0xc8, 0x08, 0x0c, 0x13, 0xd4, + 0x08, 0x0c, 0x21, 0x14, 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, + 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, + 0x08, 0x0c, 0x20, 0xea, 0x08, 0x0c, 0x22, 0xc8, 0x08, 0x0c, 0x13, 0xd4, + 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x20, 0xea, + 0x08, 0x0c, 0x13, 0xd4, 0x08, 0x0c, 0x21, 0x14, 0x08, 0x04, 0x30, 0xb6, + 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, + 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x13, 0xd4, 0x08, 0x0c, 0x21, 0x14, + 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x20, 0xea, + 0x08, 0x0c, 0x22, 0xc8, 0x08, 0x0c, 0x13, 0xd4, 0x08, 0x0c, 0x21, 0x14, + 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x27, 0x8f, + 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x27, 0x8f, + 0x08, 0x0c, 0x22, 0xc8, 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, + 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, + 0x08, 0x0c, 0x27, 0x8f, 0x08, 0x0c, 0x20, 0xea, 0x08, 0x04, 0x30, 0xb6, + 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, + 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x27, 0x8f, 0x08, 0x0c, 0x20, 0xea, + 0x08, 0x0c, 0x22, 0xc8, 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, + 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, + 0x08, 0x0c, 0x27, 0x8f, 0x08, 0x0c, 0x21, 0x14, 0x08, 0x04, 0x30, 0xb6, + 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, + 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x27, 0x8f, 0x08, 0x0c, 0x22, 0xc8, + 0x08, 0x0c, 0x21, 0x14, 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, + 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, + 0x08, 0x0c, 0x27, 0x8f, 0x08, 0x0c, 0x20, 0xea, 0x08, 0x0c, 0x21, 0x14, + 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x27, 0x8f, + 0x08, 0x0c, 0x20, 0xea, 0x08, 0x0c, 0x22, 0xc8, 0x08, 0x0c, 0x21, 0x14, + 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x27, 0x8f, + 0x08, 0x0c, 0x13, 0xd4, 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, + 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, + 0x08, 0x0c, 0x27, 0x8f, 0x08, 0x0c, 0x22, 0xc8, 0x08, 0x0c, 0x13, 0xd4, + 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x27, 0x8f, + 0x08, 0x0c, 0x20, 0xea, 0x08, 0x0c, 0x13, 0xd4, 0x08, 0x04, 0x30, 0xb6, + 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, + 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x27, 0x8f, 0x08, 0x0c, 0x22, 0xc8, + 0x08, 0x0c, 0x13, 0xd4, 0x08, 0x0c, 0x21, 0x14, 0x08, 0x04, 0x30, 0xb6, + 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, + 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x27, 0x8f, 0x08, 0x0c, 0x20, 0xea, + 0x08, 0x0c, 0x22, 0xc8, 0x08, 0x0c, 0x13, 0xd4, 0x08, 0x04, 0x30, 0xb6, + 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, + 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x27, 0x8f, 0x08, 0x0c, 0x20, 0xea, + 0x08, 0x0c, 0x13, 0xd4, 0x08, 0x0c, 0x21, 0x14, 0x08, 0x04, 0x30, 0xb6, + 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, + 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x27, 0x8f, 0x08, 0x0c, 0x13, 0xd4, + 0x08, 0x0c, 0x21, 0x14, 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, + 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, + 0x08, 0x0c, 0x27, 0x8f, 0x08, 0x0c, 0x20, 0xea, 0x08, 0x0c, 0x22, 0xc8, + 0x08, 0x0c, 0x13, 0xd4, 0x08, 0x0c, 0x21, 0x14, 0x08, 0x04, 0x30, 0xb6, + 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, + 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0xad, 0x62, 0x08, 0x04, 0x30, 0xb6, + 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, + 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0xad, 0x62, 0x08, 0x0c, 0x22, 0xc8, + 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x20, 0xea, + 0x08, 0x0c, 0xad, 0x62, 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, + 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, + 0x08, 0x0c, 0x20, 0xea, 0x08, 0x0c, 0xad, 0x62, 0x08, 0x0c, 0x22, 0xc8, + 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0xad, 0x62, + 0x08, 0x0c, 0x21, 0x14, 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, + 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, + 0x08, 0x0c, 0xad, 0x62, 0x08, 0x0c, 0x22, 0xc8, 0x08, 0x0c, 0x21, 0x14, + 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x20, 0xea, + 0x08, 0x0c, 0xad, 0x62, 0x08, 0x0c, 0x21, 0x14, 0x08, 0x04, 0x30, 0xb6, + 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, + 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x20, 0xea, 0x08, 0x0c, 0xad, 0x62, + 0x08, 0x0c, 0x22, 0xc8, 0x08, 0x0c, 0x21, 0x14, 0x08, 0x04, 0x30, 0xb6, + 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, + 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0xad, 0x62, 0x08, 0x0c, 0x13, 0xd4, + 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0xad, 0x62, + 0x08, 0x0c, 0x22, 0xc8, 0x08, 0x0c, 0x13, 0xd4, 0x08, 0x04, 0x30, 0xb6, + 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, + 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x20, 0xea, 0x08, 0x0c, 0xad, 0x62, + 0x08, 0x0c, 0x13, 0xd4, 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, + 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, + 0x08, 0x0c, 0x20, 0xea, 0x08, 0x0c, 0xad, 0x62, 0x08, 0x0c, 0x22, 0xc8, + 0x08, 0x0c, 0x13, 0xd4, 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, + 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, + 0x08, 0x0c, 0xad, 0x62, 0x08, 0x0c, 0x13, 0xd4, 0x08, 0x0c, 0x21, 0x14, + 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0xad, 0x62, + 0x08, 0x0c, 0x22, 0xc8, 0x08, 0x0c, 0x13, 0xd4, 0x08, 0x0c, 0x21, 0x14, + 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x20, 0xea, + 0x08, 0x0c, 0xad, 0x62, 0x08, 0x0c, 0x13, 0xd4, 0x08, 0x0c, 0x21, 0x14, + 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x20, 0xea, + 0x08, 0x0c, 0xad, 0x62, 0x08, 0x0c, 0x22, 0xc8, 0x08, 0x0c, 0x13, 0xd4, + 0x08, 0x0c, 0x21, 0x14, 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, + 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, + 0x08, 0x0c, 0x27, 0x8f, 0x08, 0x0c, 0xad, 0x62, 0x08, 0x04, 0x30, 0xb6, + 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, + 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x27, 0x8f, 0x08, 0x0c, 0xad, 0x62, + 0x08, 0x0c, 0x22, 0xc8, 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, + 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, + 0x08, 0x0c, 0x27, 0x8f, 0x08, 0x0c, 0x20, 0xea, 0x08, 0x0c, 0xad, 0x62, + 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x27, 0x8f, + 0x08, 0x0c, 0x20, 0xea, 0x08, 0x0c, 0xad, 0x62, 0x08, 0x0c, 0x22, 0xc8, + 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x27, 0x8f, + 0x08, 0x0c, 0xad, 0x62, 0x08, 0x0c, 0x21, 0x14, 0x08, 0x04, 0x30, 0xb6, + 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, + 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x27, 0x8f, 0x08, 0x0c, 0xad, 0x62, + 0x08, 0x0c, 0x22, 0xc8, 0x08, 0x0c, 0x21, 0x14, 0x08, 0x04, 0x30, 0xb6, + 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, + 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x27, 0x8f, 0x08, 0x0c, 0x20, 0xea, + 0x08, 0x0c, 0xad, 0x62, 0x08, 0x0c, 0x21, 0x14, 0x08, 0x04, 0x30, 0xb6, + 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, + 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x27, 0x8f, 0x08, 0x0c, 0x20, 0xea, + 0x08, 0x0c, 0xad, 0x62, 0x08, 0x0c, 0x22, 0xc8, 0x08, 0x0c, 0x21, 0x14, + 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x27, 0x8f, + 0x08, 0x0c, 0xad, 0x62, 0x08, 0x0c, 0x13, 0xd4, 0x08, 0x04, 0x30, 0xb6, + 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, + 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x27, 0x8f, 0x08, 0x0c, 0xad, 0x62, + 0x08, 0x0c, 0x22, 0xc8, 0x08, 0x0c, 0x13, 0xd4, 0x08, 0x04, 0x30, 0xb6, + 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, + 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x27, 0x8f, 0x08, 0x0c, 0x20, 0xea, + 0x08, 0x0c, 0xad, 0x62, 0x08, 0x0c, 0x13, 0xd4, 0x08, 0x04, 0x30, 0xb6, + 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, + 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x27, 0x8f, 0x08, 0x0c, 0x20, 0xea, + 0x08, 0x0c, 0xad, 0x62, 0x08, 0x0c, 0x22, 0xc8, 0x08, 0x0c, 0x13, 0xd4, + 0x08, 0x04, 0x30, 0xb6, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x27, 0x8f, + 0x08, 0x0c, 0xad, 0x62, 0x08, 0x0c, 0x13, 0xd4, 0x08, 0x0c, 0x21, 0x14, + 0x04, 0xd8, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, 0x01, 0xd6, + 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x27, 0x8f, 0x08, 0x0c, + 0xad, 0x62, 0x08, 0x0c, 0x22, 0xc8, 0x08, 0x0c, 0x13, 0xd4, 0x08, 0x0c, + 0x21, 0x14, 0x04, 0x40, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, 0x01, 0xc6, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, 0x27, 0x8f, + 0x08, 0x0c, 0x20, 0xea, 0x08, 0x0c, 0x13, 0xd4, 0x08, 0x0c, 0xad, 0x62, + 0x08, 0x0c, 0x21, 0x14, 0x00, 0xa8, 0x01, 0x06, 0x00, 0x06, 0x01, 0x26, + 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, 0x01, 0x56, 0x08, 0x0c, + 0x27, 0x8f, 0x08, 0x0c, 0x20, 0xea, 0x08, 0x0c, 0xad, 0x62, 0x08, 0x0c, + 0x22, 0xc8, 0x08, 0x0c, 0x13, 0xd4, 0x08, 0x0c, 0x21, 0x14, 0x00, 0x00, + 0x01, 0x5e, 0x01, 0x4e, 0x01, 0x3e, 0x01, 0xde, 0x01, 0xce, 0x01, 0x2e, + 0x00, 0x0e, 0x01, 0x0e, 0x00, 0x0d, 0x00, 0xb6, 0x00, 0xc6, 0x00, 0x26, + 0x00, 0x46, 0x90, 0x26, 0x08, 0x0c, 0x6b, 0xcf, 0x19, 0x04, 0x31, 0xf6, + 0x72, 0xdc, 0x20, 0x01, 0x19, 0x7c, 0x20, 0x04, 0x90, 0x05, 0x11, 0x10, + 0xd2, 0x9c, 0x01, 0x48, 0xd2, 0x84, 0x11, 0x38, 0xd2, 0xbc, 0x19, 0x04, + 0x31, 0xf6, 0x08, 0x0c, 0x31, 0xfb, 0x08, 0x04, 0x31, 0xf6, 0xd2, 0xcc, + 0x19, 0x04, 0x31, 0xf6, 0x08, 0x0c, 0x77, 0x9e, 0x11, 0x20, 0x70, 0xaf, + 0xff, 0xff, 0x08, 0x04, 0x31, 0xf6, 0xd2, 0x94, 0x01, 0x20, 0x70, 0xaf, + 0xff, 0xff, 0x08, 0x04, 0x31, 0xf6, 0x08, 0x0c, 0x34, 0x7d, 0x01, 0x60, + 0x08, 0x0c, 0xd6, 0x45, 0x01, 0x28, 0x20, 0x01, 0x18, 0x18, 0x20, 0x3c, + 0x08, 0x04, 0x31, 0x6f, 0x70, 0xaf, 0xff, 0xff, 0x08, 0x04, 0x31, 0xf6, + 0x20, 0x01, 0x18, 0x18, 0x20, 0x3c, 0x72, 0x94, 0xd2, 0x84, 0x09, 0x04, + 0x31, 0x6f, 0xd2, 0x8c, 0x19, 0x04, 0x31, 0x6f, 0x00, 0x36, 0x73, 0xac, + 0x93, 0x8e, 0xff, 0xff, 0x11, 0x10, 0x20, 0x19, 0x00, 0x01, 0x83, 0x14, + 0x92, 0xe0, 0x1d, 0x80, 0x2c, 0x04, 0x93, 0x8c, 0x00, 0x01, 0x01, 0x20, + 0x90, 0x84, 0xff, 0x00, 0x80, 0x07, 0x00, 0x10, 0x90, 0x84, 0x00, 0xff, + 0x97, 0x0e, 0x09, 0x04, 0x31, 0x65, 0x90, 0x8e, 0x00, 0x00, 0x09, 0x04, + 0x31, 0x65, 0x90, 0x8e, 0x00, 0xff, 0x11, 0x60, 0x72, 0x30, 0xd2, 0x84, + 0x19, 0x04, 0x31, 0x6a, 0x72, 0x94, 0xc2, 0x8d, 0x72, 0x96, 0x70, 0xaf, + 0xff, 0xff, 0x00, 0x3e, 0x08, 0x04, 0x31, 0x6f, 0x20, 0x09, 0x18, 0x0d, + 0x21, 0x0c, 0xd1, 0x8c, 0x01, 0x50, 0x00, 0x26, 0x20, 0x11, 0x00, 0x10, + 0x08, 0x0c, 0x6c, 0x35, 0x00, 0x2e, 0x01, 0x18, 0x70, 0xaf, 0xff, 0xff, + 0x04, 0x88, 0x90, 0x0e, 0x08, 0x0c, 0x26, 0x8c, 0x08, 0x0c, 0x67, 0x49, + 0x15, 0x38, 0x90, 0x06, 0xb8, 0xbb, 0x05, 0x20, 0xb8, 0xac, 0x90, 0x05, + 0x01, 0x48, 0x00, 0xc6, 0x20, 0x60, 0x08, 0x0c, 0x8e, 0xee, 0x00, 0xce, + 0x09, 0x0c, 0x92, 0x8d, 0xb8, 0xaf, 0x00, 0x00, 0x08, 0x0c, 0x6c, 0x11, + 0x11, 0x68, 0x70, 0x30, 0xd0, 0x8c, 0x01, 0x30, 0xb8, 0x00, 0xd0, 0xbc, + 0x01, 0x38, 0x08, 0x0c, 0x6a, 0xae, 0x01, 0x20, 0x08, 0x0c, 0x32, 0x14, + 0x01, 0x48, 0x00, 0x28, 0x08, 0x0c, 0x33, 0x60, 0x08, 0x0c, 0x32, 0x40, + 0x01, 0x18, 0x83, 0x18, 0x08, 0x04, 0x31, 0x09, 0x73, 0xae, 0x00, 0x10, + 0x70, 0xaf, 0xff, 0xff, 0x00, 0x3e, 0x08, 0x04, 0x31, 0xf6, 0x97, 0x80, + 0x34, 0x8e, 0x20, 0x3d, 0x97, 0xbc, 0xff, 0x00, 0x87, 0x3f, 0x20, 0x41, + 0x00, 0x7e, 0x70, 0xac, 0x90, 0x96, 0xff, 0xff, 0x11, 0x18, 0x90, 0x0e, + 0x28, 0xa8, 0x00, 0x50, 0x98, 0x12, 0x02, 0x20, 0x20, 0x08, 0x98, 0x02, + 0x20, 0xa8, 0x00, 0x20, 0x70, 0xaf, 0xff, 0xff, 0x08, 0x04, 0x31, 0xf6, + 0x27, 0x00, 0x01, 0x56, 0x00, 0x16, 0x91, 0x06, 0x09, 0x04, 0x31, 0xeb, + 0x20, 0x01, 0x18, 0x0d, 0x20, 0x04, 0xd0, 0x8c, 0x01, 0x58, 0x00, 0x26, + 0x20, 0x11, 0x00, 0x10, 0x08, 0x0c, 0x6c, 0x35, 0x00, 0x2e, 0x01, 0x20, + 0x20, 0x09, 0xff, 0xff, 0x08, 0x04, 0x31, 0xf3, 0xc4, 0x84, 0x08, 0x0c, + 0x67, 0xb4, 0x01, 0x68, 0x08, 0x0c, 0xd6, 0x45, 0x19, 0x04, 0x31, 0xeb, + 0x08, 0x0c, 0x34, 0x7d, 0x19, 0x04, 0x31, 0xeb, 0x08, 0x0c, 0x67, 0x49, + 0x19, 0x04, 0x31, 0xf3, 0x00, 0x08, 0xc4, 0x85, 0xb8, 0xbb, 0x05, 0x20, + 0xb8, 0xac, 0x90, 0x05, 0x01, 0x48, 0x00, 0xc6, 0x20, 0x60, 0x08, 0x0c, + 0x8e, 0xee, 0x00, 0xce, 0x09, 0x0c, 0x92, 0x8d, 0xb8, 0xaf, 0x00, 0x00, + 0x08, 0x0c, 0x6c, 0x11, 0x11, 0x30, 0x70, 0x30, 0xd0, 0x8c, 0x01, 0xf8, + 0xb8, 0x00, 0xd0, 0xbc, 0x11, 0xe0, 0x72, 0x94, 0xd2, 0x8c, 0x01, 0x80, + 0x08, 0x0c, 0x6c, 0x11, 0x90, 0x82, 0x00, 0x06, 0x02, 0xe0, 0xd4, 0x84, + 0x11, 0x18, 0x08, 0x0c, 0x67, 0x6e, 0x00, 0x28, 0x08, 0x0c, 0x33, 0xf3, + 0x01, 0xa0, 0x08, 0x0c, 0x34, 0x1e, 0x00, 0x88, 0x08, 0x0c, 0x33, 0x60, + 0x08, 0x0c, 0xd6, 0x45, 0x11, 0x60, 0x08, 0x0c, 0x32, 0x40, 0x01, 0x88, + 0x00, 0x40, 0x08, 0x0c, 0xd6, 0x45, 0x11, 0x18, 0x08, 0x0c, 0x33, 0xf3, + 0x01, 0x10, 0x04, 0x51, 0x01, 0x40, 0x00, 0x1e, 0x81, 0x08, 0x01, 0x5e, + 0x1f, 0x04, 0x31, 0x88, 0x70, 0xaf, 0xff, 0xff, 0x00, 0x18, 0x00, 0x1e, + 0x01, 0x5e, 0x71, 0xae, 0x00, 0x4e, 0x00, 0x2e, 0x00, 0xce, 0x00, 0xbe, + 0x00, 0x05, 0x00, 0xc6, 0x00, 0x16, 0x70, 0xaf, 0x00, 0x01, 0x20, 0x09, + 0x00, 0x7e, 0x08, 0x0c, 0x67, 0x49, 0x11, 0x68, 0xb8, 0x13, 0x00, 0xff, + 0xb8, 0x17, 0xff, 0xfe, 0x08, 0x0c, 0x33, 0x60, 0x04, 0xa9, 0x01, 0x28, + 0x70, 0xdc, 0xc0, 0xbd, 0x70, 0xde, 0x08, 0x0c, 0xd3, 0x89, 0x00, 0x1e, + 0x00, 0xce, 0x00, 0x05, 0x00, 0x16, 0x00, 0x76, 0x00, 0xd6, 0x00, 0xc6, + 0x20, 0x01, 0x18, 0x4c, 0x20, 0x04, 0x90, 0x84, 0x00, 0xff, 0xb8, 0x42, + 0x08, 0x0c, 0xb1, 0xdd, 0x01, 0xd0, 0x2b, 0x00, 0x60, 0x12, 0x08, 0x0c, + 0xd3, 0xb6, 0x60, 0x23, 0x00, 0x01, 0x90, 0x06, 0x08, 0x0c, 0x66, 0xe6, + 0x20, 0x01, 0x00, 0x00, 0x08, 0x0c, 0x66, 0xfa, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x70, 0xa8, 0x80, 0x00, 0x70, 0xaa, 0x01, 0x2e, 0x20, 0x09, + 0x00, 0x04, 0x08, 0x0c, 0xb2, 0x0a, 0x90, 0x85, 0x00, 0x01, 0x00, 0xce, + 0x00, 0xde, 0x00, 0x7e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0x16, 0x00, 0x76, + 0x00, 0xd6, 0x00, 0xc6, 0x20, 0x01, 0x18, 0x4c, 0x20, 0x04, 0x90, 0x84, + 0x00, 0xff, 0xb8, 0x42, 0x08, 0x0c, 0xb1, 0xdd, 0x05, 0x48, 0x2b, 0x00, + 0x60, 0x12, 0xb8, 0x00, 0xc0, 0xc4, 0xb8, 0x02, 0xb8, 0xa0, 0x90, 0x86, + 0x00, 0x7e, 0x01, 0x40, 0xb8, 0x04, 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, + 0x00, 0x06, 0x11, 0x10, 0x08, 0x0c, 0x33, 0x15, 0x08, 0x0c, 0xd3, 0xb6, + 0x60, 0x23, 0x00, 0x01, 0x90, 0x06, 0x08, 0x0c, 0x66, 0xe6, 0x20, 0x01, + 0x00, 0x02, 0x08, 0x0c, 0x66, 0xfa, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x70, 0xa8, 0x80, 0x00, 0x70, 0xaa, 0x01, 0x2e, 0x20, 0x09, 0x00, 0x02, + 0x08, 0x0c, 0xb2, 0x0a, 0x90, 0x85, 0x00, 0x01, 0x00, 0xce, 0x00, 0xde, + 0x00, 0x7e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xc6, 0x00, 0x26, + 0x20, 0x09, 0x00, 0x80, 0x08, 0x0c, 0x67, 0x49, 0x11, 0x40, 0xb8, 0x13, + 0x00, 0xff, 0xb8, 0x17, 0xff, 0xfc, 0x00, 0x39, 0x01, 0x10, 0x70, 0xe3, + 0xff, 0xff, 0x00, 0x2e, 0x00, 0xce, 0x00, 0xbe, 0x00, 0x05, 0x00, 0x16, + 0x00, 0x76, 0x00, 0xd6, 0x00, 0xc6, 0x08, 0x0c, 0xb1, 0x16, 0x01, 0xd0, + 0x2b, 0x00, 0x60, 0x12, 0x08, 0x0c, 0xd3, 0xb6, 0x60, 0x23, 0x00, 0x01, + 0x90, 0x06, 0x08, 0x0c, 0x66, 0xe6, 0x20, 0x01, 0x00, 0x02, 0x08, 0x0c, + 0x66, 0xfa, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x70, 0xe4, 0x80, 0x00, + 0x70, 0xe6, 0x01, 0x2e, 0x20, 0x09, 0x00, 0x02, 0x08, 0x0c, 0xb2, 0x0a, + 0x90, 0x85, 0x00, 0x01, 0x00, 0xce, 0x00, 0xde, 0x00, 0x7e, 0x00, 0x1e, + 0x00, 0x05, 0x00, 0xc6, 0x00, 0xd6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x09, 0x00, 0x7f, 0x08, 0x0c, 0x67, 0x49, 0x11, 0xb8, 0xb8, 0x13, + 0x00, 0xff, 0xb8, 0x17, 0xff, 0xfd, 0xb8, 0xd7, 0x00, 0x04, 0x08, 0x0c, + 0xb1, 0x16, 0x01, 0x70, 0x2b, 0x00, 0x60, 0x12, 0x63, 0x16, 0x60, 0x23, + 0x00, 0x01, 0x62, 0x0a, 0x08, 0x0c, 0xd3, 0xb6, 0x20, 0x09, 0x00, 0x22, + 0x08, 0x0c, 0xb2, 0x0a, 0x90, 0x85, 0x00, 0x01, 0x01, 0x2e, 0x00, 0xde, + 0x00, 0xce, 0x00, 0x05, 0x00, 0xe6, 0x00, 0xc6, 0x00, 0x66, 0x00, 0x36, + 0x00, 0x26, 0x00, 0xb6, 0x21, 0xf0, 0x08, 0x0c, 0xac, 0xfc, 0x01, 0x06, + 0x08, 0x0c, 0x97, 0xbb, 0x08, 0x0c, 0x97, 0x27, 0x08, 0x0c, 0xac, 0x4d, + 0x08, 0x0c, 0xc1, 0x79, 0x01, 0x0e, 0x09, 0x0c, 0xad, 0x18, 0x3e, 0x08, + 0x21, 0x30, 0x81, 0xff, 0x01, 0x20, 0x20, 0xa9, 0x00, 0x7e, 0x90, 0x0e, + 0x00, 0x18, 0x20, 0xa9, 0x00, 0x7f, 0x90, 0x0e, 0x00, 0x16, 0x08, 0x0c, + 0x67, 0xb4, 0x11, 0x40, 0x96, 0x86, 0x00, 0x02, 0x11, 0x18, 0xb8, 0x00, + 0xd0, 0xbc, 0x11, 0x10, 0x08, 0x0c, 0x61, 0xb7, 0x00, 0x1e, 0x81, 0x08, + 0x1f, 0x04, 0x32, 0xfa, 0x96, 0x86, 0x00, 0x01, 0x19, 0x0c, 0x34, 0x51, + 0x00, 0xbe, 0x00, 0x2e, 0x00, 0x3e, 0x00, 0x6e, 0x00, 0xce, 0x00, 0xee, + 0x00, 0x05, 0x00, 0xe6, 0x00, 0xc6, 0x00, 0x46, 0x00, 0x36, 0x00, 0x26, + 0x00, 0x16, 0x00, 0xb6, 0x08, 0x0c, 0xac, 0xfc, 0x01, 0x06, 0x62, 0x10, + 0x22, 0x58, 0xba, 0xa0, 0x00, 0x26, 0x20, 0x19, 0x00, 0x29, 0x08, 0x0c, + 0x97, 0xb0, 0x00, 0x76, 0x20, 0x39, 0x00, 0x00, 0x08, 0x0c, 0x96, 0x6d, + 0x2c, 0x08, 0x08, 0x0c, 0xe7, 0x5d, 0x00, 0x7e, 0x00, 0x1e, 0x01, 0x0e, + 0x09, 0x0c, 0xad, 0x18, 0xba, 0x10, 0xbb, 0x14, 0xbc, 0x84, 0x08, 0x0c, + 0x61, 0xb7, 0xba, 0x12, 0xbb, 0x16, 0xbc, 0x86, 0x00, 0xbe, 0x00, 0x1e, + 0x00, 0x2e, 0x00, 0x3e, 0x00, 0x4e, 0x00, 0xce, 0x00, 0xee, 0x00, 0x05, + 0x00, 0xe6, 0x00, 0x06, 0x00, 0xb6, 0x60, 0x10, 0x20, 0x58, 0xb8, 0xa0, + 0x00, 0xbe, 0x90, 0x86, 0x00, 0x80, 0x01, 0x50, 0x20, 0x71, 0x18, 0x00, + 0x70, 0xa8, 0x90, 0x05, 0x01, 0x10, 0x80, 0x01, 0x70, 0xaa, 0x00, 0x0e, + 0x00, 0xee, 0x00, 0x05, 0x20, 0x71, 0x18, 0x00, 0x70, 0xe4, 0x90, 0x05, + 0x0d, 0xc0, 0x80, 0x01, 0x70, 0xe6, 0x0c, 0xa8, 0xb8, 0x00, 0xc0, 0x8c, + 0xb8, 0x02, 0x00, 0x05, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xc6, 0x00, 0xb6, + 0x00, 0x46, 0x00, 0x36, 0x00, 0x26, 0x00, 0x16, 0x01, 0x56, 0x21, 0x78, + 0x08, 0x0c, 0xac, 0xfc, 0x01, 0x06, 0x81, 0xff, 0x11, 0x18, 0x20, 0xa9, + 0x00, 0x01, 0x00, 0x78, 0x08, 0x0c, 0x58, 0x40, 0xd0, 0xc4, 0x01, 0x40, + 0xd0, 0xa4, 0x01, 0x30, 0x90, 0x06, 0x20, 0x20, 0x20, 0x09, 0x00, 0x2d, + 0x08, 0x0c, 0xea, 0x8d, 0x20, 0xa9, 0x08, 0x00, 0x90, 0x16, 0x00, 0x26, + 0x92, 0x8e, 0x00, 0x7e, 0x09, 0x04, 0x33, 0xcf, 0x92, 0x8e, 0x00, 0x7f, + 0x09, 0x04, 0x33, 0xcf, 0x92, 0x8e, 0x00, 0x80, 0x05, 0xf0, 0x92, 0x88, + 0x10, 0x00, 0x21, 0x0c, 0x81, 0xff, 0x05, 0xc8, 0x8f, 0xff, 0x11, 0x50, + 0x20, 0x01, 0x19, 0x8e, 0x00, 0x06, 0x20, 0x03, 0x00, 0x01, 0x08, 0x0c, + 0x33, 0xe0, 0x00, 0x0e, 0x20, 0x03, 0x00, 0x00, 0x00, 0xb6, 0x00, 0xc6, + 0x21, 0x58, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x6b, 0xdb, 0x00, 0xce, + 0x00, 0xbe, 0x20, 0x19, 0x00, 0x29, 0x08, 0x0c, 0x97, 0xb0, 0x00, 0x76, + 0x20, 0x39, 0x00, 0x00, 0x08, 0x0c, 0x96, 0x6d, 0x00, 0xb6, 0x00, 0xc6, + 0x00, 0x26, 0x21, 0x58, 0xba, 0x04, 0x92, 0x94, 0x00, 0xff, 0x92, 0x86, + 0x00, 0x06, 0x11, 0x18, 0xb8, 0x07, 0x04, 0x04, 0x00, 0x28, 0x20, 0x01, + 0x00, 0x04, 0x80, 0x07, 0x92, 0x15, 0xba, 0x06, 0x00, 0x2e, 0x00, 0xce, + 0x00, 0xbe, 0x00, 0x16, 0x2c, 0x08, 0x08, 0x0c, 0xe7, 0x5d, 0x00, 0x1e, + 0x00, 0x7e, 0x00, 0x2e, 0x82, 0x10, 0x1f, 0x04, 0x33, 0x85, 0x01, 0x0e, + 0x09, 0x0c, 0xad, 0x18, 0x01, 0x5e, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x3e, + 0x00, 0x4e, 0x00, 0xbe, 0x00, 0xce, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, + 0x00, 0x46, 0x00, 0x26, 0x00, 0x16, 0x08, 0x0c, 0x58, 0x40, 0xd0, 0xc4, + 0x01, 0x40, 0xd0, 0xa4, 0x01, 0x30, 0x90, 0x06, 0x22, 0x20, 0x20, 0x09, + 0x00, 0x29, 0x08, 0x0c, 0xea, 0x8d, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x4e, + 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x00, 0xc6, 0x72, 0x94, + 0x82, 0xff, 0x01, 0xe8, 0x08, 0x0c, 0x6c, 0x09, 0x11, 0xd0, 0x21, 0x00, + 0x08, 0x0c, 0x26, 0xbf, 0x81, 0xff, 0x01, 0xb8, 0x20, 0x19, 0x00, 0x01, + 0x83, 0x14, 0x92, 0xe0, 0x1d, 0x80, 0x2c, 0x04, 0xd3, 0x84, 0x01, 0x20, + 0x90, 0x84, 0xff, 0x00, 0x80, 0x07, 0x00, 0x10, 0x90, 0x84, 0x00, 0xff, + 0x91, 0x16, 0x01, 0x38, 0x90, 0x96, 0x00, 0xff, 0x01, 0x10, 0x83, 0x18, + 0x0c, 0x68, 0x90, 0x85, 0x00, 0x01, 0x00, 0xce, 0x00, 0x3e, 0x00, 0x2e, + 0x00, 0x1e, 0x00, 0x05, 0x00, 0x16, 0x00, 0xc6, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0xac, 0xfc, 0x01, 0x06, 0x00, 0x36, 0x20, 0x19, + 0x00, 0x29, 0x00, 0xc1, 0x00, 0x3e, 0x01, 0x0e, 0x09, 0x0c, 0xad, 0x18, + 0x91, 0x80, 0x10, 0x00, 0x20, 0x04, 0x90, 0x65, 0x01, 0x58, 0x00, 0x16, + 0x00, 0xc6, 0x20, 0x61, 0x1b, 0x39, 0x00, 0x1e, 0x61, 0x12, 0x08, 0x0c, + 0x33, 0x15, 0x00, 0x1e, 0x08, 0x0c, 0x67, 0x6e, 0x01, 0x2e, 0x00, 0xce, + 0x00, 0x1e, 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, 0x21, 0x10, 0x08, 0x0c, + 0xa7, 0xe2, 0x08, 0x0c, 0xed, 0xee, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, + 0x20, 0x01, 0x18, 0x37, 0x20, 0x04, 0xd0, 0xcc, 0x00, 0x05, 0x00, 0xc6, + 0x00, 0xb6, 0x08, 0x0c, 0x77, 0x9e, 0x11, 0x18, 0x20, 0xa9, 0x08, 0x00, + 0x00, 0x10, 0x20, 0xa9, 0x07, 0x82, 0x08, 0x0c, 0x77, 0x9e, 0x11, 0x10, + 0x90, 0x0e, 0x00, 0x10, 0x20, 0x09, 0x00, 0x7e, 0x91, 0x80, 0x10, 0x00, + 0x20, 0x04, 0x90, 0x5d, 0x01, 0x30, 0x86, 0xff, 0x01, 0x10, 0xb8, 0x00, + 0xd0, 0xbc, 0x09, 0x0c, 0x67, 0x6e, 0x81, 0x08, 0x1f, 0x04, 0x34, 0x62, + 0x20, 0x61, 0x18, 0x00, 0x60, 0x7f, 0x00, 0x00, 0x60, 0x80, 0x90, 0x84, + 0x00, 0xff, 0x60, 0x82, 0x60, 0xb3, 0x00, 0x00, 0x00, 0xbe, 0x00, 0xce, + 0x00, 0x05, 0x20, 0x01, 0x18, 0x69, 0x20, 0x04, 0xd0, 0xbc, 0x00, 0x05, + 0x20, 0x11, 0x18, 0x48, 0x22, 0x14, 0xd2, 0xec, 0x00, 0x05, 0x00, 0x26, + 0x20, 0x11, 0x18, 0x67, 0x22, 0x14, 0xd2, 0xdc, 0x00, 0x2e, 0x00, 0x05, + 0x7e, 0xef, 0x7d, 0xe8, 0x7c, 0xe4, 0x80, 0xe2, 0x7b, 0xe1, 0x80, 0xe0, + 0x80, 0xdc, 0x80, 0xda, 0x7a, 0xd9, 0x80, 0xd6, 0x80, 0xd5, 0x80, 0xd4, + 0x80, 0xd3, 0x80, 0xd2, 0x80, 0xd1, 0x79, 0xce, 0x78, 0xcd, 0x80, 0xcc, + 0x80, 0xcb, 0x80, 0xca, 0x80, 0xc9, 0x80, 0xc7, 0x80, 0xc6, 0x77, 0xc5, + 0x76, 0xc3, 0x80, 0xbc, 0x80, 0xba, 0x75, 0xb9, 0x80, 0xb6, 0x74, 0xb5, + 0x73, 0xb4, 0x72, 0xb3, 0x80, 0xb2, 0x80, 0xb1, 0x80, 0xae, 0x71, 0xad, + 0x80, 0xac, 0x70, 0xab, 0x6f, 0xaa, 0x6e, 0xa9, 0x80, 0xa7, 0x6d, 0xa6, + 0x6c, 0xa5, 0x6b, 0xa3, 0x6a, 0x9f, 0x69, 0x9e, 0x68, 0x9d, 0x80, 0x9b, + 0x80, 0x98, 0x67, 0x97, 0x66, 0x90, 0x65, 0x8f, 0x64, 0x88, 0x63, 0x84, + 0x62, 0x82, 0x80, 0x81, 0x80, 0x80, 0x61, 0x7c, 0x60, 0x7a, 0x80, 0x79, + 0x5f, 0x76, 0x80, 0x75, 0x80, 0x74, 0x80, 0x73, 0x80, 0x72, 0x80, 0x71, + 0x80, 0x6e, 0x5e, 0x6d, 0x80, 0x6c, 0x5d, 0x6b, 0x5c, 0x6a, 0x5b, 0x69, + 0x80, 0x67, 0x5a, 0x66, 0x59, 0x65, 0x58, 0x63, 0x57, 0x5c, 0x56, 0x5a, + 0x55, 0x59, 0x80, 0x56, 0x80, 0x55, 0x54, 0x54, 0x53, 0x53, 0x52, 0x52, + 0x51, 0x51, 0x50, 0x4e, 0x4f, 0x4d, 0x80, 0x4c, 0x80, 0x4b, 0x4e, 0x4a, + 0x4d, 0x49, 0x80, 0x47, 0x4c, 0x46, 0x80, 0x45, 0x80, 0x43, 0x80, 0x3c, + 0x80, 0x3a, 0x80, 0x39, 0x80, 0x36, 0x4b, 0x35, 0x80, 0x34, 0x4a, 0x33, + 0x49, 0x32, 0x48, 0x31, 0x80, 0x2e, 0x47, 0x2d, 0x46, 0x2c, 0x45, 0x2b, + 0x44, 0x2a, 0x43, 0x29, 0x42, 0x27, 0x80, 0x26, 0x80, 0x25, 0x41, 0x23, + 0x40, 0x1f, 0x3f, 0x1e, 0x3e, 0x1d, 0x3d, 0x1b, 0x3c, 0x18, 0x80, 0x17, + 0x80, 0x10, 0x3b, 0x0f, 0x3a, 0x08, 0x80, 0x04, 0x39, 0x02, 0x80, 0x01, + 0x80, 0x00, 0x80, 0x00, 0x38, 0x00, 0x37, 0x00, 0x36, 0x00, 0x80, 0x00, + 0x35, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x34, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x33, 0x00, + 0x32, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x31, 0x00, 0x30, 0x00, 0x80, 0x00, 0x80, 0x00, 0x2f, 0x00, + 0x80, 0x00, 0x2e, 0x00, 0x2d, 0x00, 0x2c, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x2b, 0x00, 0x80, 0x00, 0x2a, 0x00, 0x29, 0x00, 0x28, 0x00, + 0x80, 0x00, 0x27, 0x00, 0x26, 0x00, 0x25, 0x00, 0x24, 0x00, 0x23, 0x00, + 0x22, 0x00, 0x80, 0x00, 0x80, 0x00, 0x21, 0x00, 0x20, 0x00, 0x1f, 0x00, + 0x1e, 0x00, 0x1d, 0x00, 0x1c, 0x00, 0x80, 0x00, 0x80, 0x00, 0x1b, 0x00, + 0x1a, 0x00, 0x80, 0x00, 0x19, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x18, 0x00, 0x80, 0x00, 0x17, 0x00, + 0x16, 0x00, 0x15, 0x00, 0x80, 0x00, 0x14, 0x00, 0x13, 0x00, 0x12, 0x00, + 0x11, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x80, 0x00, 0x80, 0x00, 0x0e, 0x00, + 0x0d, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x09, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x08, 0x00, 0x07, 0x00, 0x80, 0x00, 0x06, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x05, 0x00, 0x04, 0x00, 0x03, 0x00, 0x80, 0x00, + 0x02, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x01, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x20, 0x71, 0x18, 0x9e, + 0x70, 0x03, 0x00, 0x02, 0x90, 0x06, 0x70, 0x16, 0x70, 0x1a, 0x70, 0x4a, + 0x70, 0x4e, 0x70, 0x0e, 0x70, 0x42, 0x70, 0x46, 0x70, 0x3b, 0x18, 0xba, + 0x70, 0x3f, 0x18, 0xba, 0x70, 0x07, 0x00, 0x01, 0x08, 0x0c, 0x10, 0x72, + 0x09, 0x0c, 0x0d, 0x85, 0x29, 0x00, 0x70, 0x6a, 0xa8, 0x67, 0x00, 0x02, + 0xa8, 0xab, 0xdc, 0xb0, 0x08, 0x0c, 0x10, 0x72, 0x09, 0x0c, 0x0d, 0x85, + 0x29, 0x00, 0x70, 0x6e, 0xa8, 0x67, 0x00, 0x02, 0xa8, 0xab, 0xdc, 0xb0, + 0x00, 0x05, 0x20, 0x71, 0x18, 0x9e, 0x70, 0x04, 0x00, 0x02, 0x35, 0xbd, + 0x35, 0xbe, 0x35, 0xd1, 0x35, 0xe5, 0x00, 0x05, 0x10, 0x04, 0x35, 0xce, + 0x0e, 0x04, 0x35, 0xce, 0x20, 0x79, 0x00, 0x00, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x70, 0x0c, 0x90, 0x05, 0x11, 0x28, 0x70, 0x0f, 0x00, 0x01, + 0x01, 0x2e, 0x04, 0x68, 0x00, 0x05, 0x01, 0x2e, 0x0c, 0xe8, 0x20, 0x79, + 0x00, 0x00, 0x20, 0x61, 0x18, 0xb8, 0x2c, 0x4c, 0xa8, 0x6c, 0x90, 0x8e, + 0x01, 0x00, 0x01, 0x28, 0x90, 0x86, 0x02, 0x00, 0x09, 0x04, 0x36, 0xb9, + 0x00, 0x05, 0x70, 0x18, 0x20, 0x48, 0x20, 0x61, 0x18, 0x00, 0x70, 0x1c, + 0x08, 0x07, 0x70, 0x14, 0x20, 0x48, 0xa8, 0x64, 0x90, 0x94, 0x00, 0xff, + 0x92, 0x96, 0x00, 0x29, 0x11, 0x20, 0xaa, 0x78, 0xd2, 0xfc, 0x01, 0x28, + 0x00, 0x05, 0x90, 0x86, 0x01, 0x03, 0x01, 0x08, 0x00, 0x05, 0x20, 0x79, + 0x00, 0x00, 0x20, 0x61, 0x18, 0x00, 0x70, 0x1c, 0x08, 0x07, 0x20, 0x61, + 0x18, 0x00, 0x78, 0x80, 0x90, 0x8a, 0x00, 0x40, 0x12, 0x10, 0x61, 0xd0, + 0x00, 0x42, 0x21, 0x00, 0x90, 0x8a, 0x00, 0x3f, 0x1a, 0x04, 0x36, 0xb6, + 0x61, 0xd0, 0x08, 0x04, 0x36, 0x4b, 0x36, 0x8d, 0x36, 0xc5, 0x36, 0xb6, + 0x36, 0xd1, 0x36, 0xdb, 0x36, 0xe1, 0x36, 0xe5, 0x36, 0xf5, 0x36, 0xf9, + 0x37, 0x0f, 0x37, 0x15, 0x37, 0x1b, 0x37, 0x26, 0x37, 0x31, 0x37, 0x40, + 0x37, 0x4f, 0x37, 0x5d, 0x37, 0x74, 0x37, 0x8f, 0x36, 0xb6, 0x38, 0x3a, + 0x38, 0x78, 0x39, 0x1d, 0x39, 0x2e, 0x39, 0x51, 0x36, 0xb6, 0x36, 0xb6, + 0x36, 0xb6, 0x39, 0x89, 0x39, 0xa9, 0x39, 0xb2, 0x39, 0xde, 0x39, 0xe4, + 0x36, 0xb6, 0x3a, 0x2a, 0x36, 0xb6, 0x36, 0xb6, 0x36, 0xb6, 0x36, 0xb6, + 0x36, 0xb6, 0x3a, 0x35, 0x3a, 0x3e, 0x3a, 0x46, 0x3a, 0x48, 0x36, 0xb6, + 0x36, 0xb6, 0x36, 0xb6, 0x36, 0xb6, 0x36, 0xb6, 0x36, 0xb6, 0x3a, 0x78, + 0x36, 0xb6, 0x36, 0xb6, 0x36, 0xb6, 0x36, 0xb6, 0x36, 0xb6, 0x3a, 0x95, + 0x3b, 0x19, 0x36, 0xb6, 0x36, 0xb6, 0x36, 0xb6, 0x36, 0xb6, 0x36, 0xb6, + 0x36, 0xb6, 0x00, 0x02, 0x3b, 0x43, 0x3b, 0x46, 0x3b, 0xa5, 0x3b, 0xbe, + 0x3b, 0xee, 0x3e, 0x94, 0x36, 0xb6, 0x53, 0xf5, 0x36, 0xb6, 0x36, 0xb6, + 0x36, 0xb6, 0x36, 0xb6, 0x36, 0xb6, 0x36, 0xb6, 0x36, 0xb6, 0x36, 0xb6, + 0x37, 0x0f, 0x37, 0x15, 0x43, 0x97, 0x58, 0x64, 0x43, 0xb5, 0x54, 0x84, + 0x54, 0xd6, 0x55, 0xe1, 0x36, 0xb6, 0x56, 0x43, 0x56, 0x7f, 0x56, 0xb0, + 0x57, 0xc0, 0x56, 0xdd, 0x57, 0x40, 0x36, 0xb6, 0x43, 0xb9, 0x45, 0x7f, + 0x45, 0x95, 0x45, 0xba, 0x46, 0x1f, 0x46, 0x93, 0x46, 0xb3, 0x47, 0x2a, + 0x47, 0x86, 0x47, 0xe2, 0x47, 0xe5, 0x48, 0x0a, 0x48, 0x7c, 0x48, 0xe6, + 0x48, 0xee, 0x4a, 0x23, 0x4b, 0xcb, 0x4b, 0xff, 0x4e, 0x63, 0x36, 0xb6, + 0x4e, 0x81, 0x4f, 0x48, 0x50, 0x31, 0x50, 0x8b, 0x36, 0xb6, 0x51, 0x1e, + 0x36, 0xb6, 0x51, 0x34, 0x51, 0x4f, 0x48, 0xee, 0x53, 0x95, 0x71, 0x4c, + 0x00, 0x00, 0x20, 0x21, 0x40, 0x00, 0x08, 0x0c, 0x4c, 0x7d, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x0e, 0x04, 0x36, 0x97, 0x00, 0x10, 0x01, 0x2e, + 0x0c, 0xc0, 0x7c, 0x36, 0x94, 0x86, 0x40, 0x00, 0x01, 0x18, 0x78, 0x33, + 0x00, 0x11, 0x00, 0x10, 0x78, 0x33, 0x00, 0x10, 0x7c, 0x82, 0x79, 0x86, + 0x7a, 0x8a, 0x7b, 0x8e, 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, 0x00, 0x89, + 0x20, 0x04, 0xd0, 0x84, 0x19, 0x0c, 0x12, 0x00, 0x70, 0x07, 0x00, 0x01, + 0x20, 0x91, 0x50, 0x00, 0x70, 0x0f, 0x00, 0x00, 0x01, 0x2e, 0x00, 0x05, + 0x20, 0x21, 0x40, 0x01, 0x08, 0xb0, 0x20, 0x21, 0x40, 0x02, 0x08, 0x98, + 0x20, 0x21, 0x40, 0x03, 0x08, 0x80, 0x20, 0x21, 0x40, 0x05, 0x08, 0x68, + 0x20, 0x21, 0x40, 0x06, 0x08, 0x50, 0x20, 0x39, 0x00, 0x01, 0x90, 0x2e, + 0x25, 0x20, 0x7b, 0x88, 0x7a, 0x8c, 0x78, 0x84, 0x79, 0x90, 0x81, 0xff, + 0x0d, 0x98, 0x08, 0x04, 0x4c, 0x8a, 0x20, 0x39, 0x00, 0x01, 0x90, 0x2e, + 0x25, 0x20, 0x7b, 0x88, 0x7a, 0x8c, 0x78, 0x84, 0x79, 0x90, 0x08, 0x04, + 0x4c, 0x8d, 0x79, 0x84, 0x78, 0x88, 0x21, 0x14, 0x20, 0x0a, 0x08, 0x04, + 0x36, 0x8d, 0x79, 0x84, 0x21, 0x14, 0x08, 0x04, 0x36, 0x8d, 0x20, 0xe1, + 0x00, 0x00, 0x20, 0x99, 0x00, 0x21, 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, + 0x00, 0x21, 0x20, 0xa9, 0x00, 0x1f, 0x40, 0x03, 0x79, 0x84, 0x7a, 0x88, + 0x7b, 0x8c, 0x08, 0x04, 0x36, 0x8d, 0x78, 0x84, 0x20, 0x60, 0x08, 0x04, + 0x37, 0x42, 0x20, 0x09, 0x00, 0x03, 0x20, 0x11, 0x00, 0x03, 0x20, 0x19, + 0x00, 0x14, 0x78, 0x9b, 0x01, 0x37, 0x78, 0x93, 0xff, 0xff, 0x20, 0x01, + 0x18, 0x8f, 0x20, 0x04, 0x90, 0x05, 0x01, 0x18, 0x78, 0x96, 0x08, 0x04, + 0x36, 0x8d, 0x78, 0x97, 0x00, 0x01, 0x08, 0x04, 0x36, 0x8d, 0x20, 0x39, + 0x00, 0x01, 0x7d, 0x98, 0x7c, 0x9c, 0x08, 0x04, 0x36, 0xc9, 0x20, 0x39, + 0x00, 0x01, 0x7d, 0x98, 0x7c, 0x9c, 0x08, 0x04, 0x36, 0xd5, 0x79, 0xa0, + 0x91, 0x82, 0x00, 0x40, 0x02, 0x10, 0x08, 0x04, 0x36, 0xc2, 0x21, 0x38, + 0x7d, 0x98, 0x7c, 0x9c, 0x08, 0x04, 0x36, 0xc9, 0x79, 0xa0, 0x91, 0x82, + 0x00, 0x40, 0x02, 0x10, 0x08, 0x04, 0x36, 0xc2, 0x21, 0x38, 0x7d, 0x98, + 0x7c, 0x9c, 0x08, 0x04, 0x36, 0xd5, 0x79, 0xa0, 0x91, 0x82, 0x00, 0x40, + 0x02, 0x10, 0x08, 0x04, 0x36, 0xc2, 0x21, 0xe8, 0x79, 0x84, 0x78, 0x88, + 0x20, 0xa9, 0x00, 0x01, 0x21, 0xa0, 0x40, 0x04, 0x08, 0x04, 0x36, 0x8d, + 0x20, 0x61, 0x08, 0x00, 0xe1, 0x0c, 0x90, 0x06, 0x2c, 0x15, 0x92, 0x00, + 0x8c, 0x60, 0x81, 0x09, 0x1d, 0xd8, 0x20, 0x10, 0x90, 0x05, 0x09, 0x04, + 0x36, 0x8d, 0x08, 0x04, 0x36, 0xbc, 0x79, 0xa0, 0x91, 0x82, 0x00, 0x40, + 0x02, 0x10, 0x08, 0x04, 0x36, 0xc2, 0x21, 0xe0, 0x20, 0xa9, 0x00, 0x01, + 0x79, 0x84, 0x21, 0x98, 0x40, 0x12, 0x08, 0x04, 0x36, 0x8d, 0x20, 0x69, + 0x18, 0x47, 0x78, 0x84, 0x79, 0x90, 0x91, 0x1a, 0x1a, 0x04, 0x36, 0xc2, + 0x80, 0x19, 0x09, 0x04, 0x36, 0xc2, 0x68, 0x4a, 0x69, 0x42, 0x78, 0x8c, + 0x68, 0x52, 0x78, 0x88, 0x68, 0x56, 0x90, 0x06, 0x68, 0x5a, 0x68, 0x5e, + 0x08, 0x0c, 0x7a, 0xe7, 0x08, 0x04, 0x36, 0x8d, 0x20, 0x69, 0x18, 0x47, + 0x78, 0x84, 0x79, 0x94, 0x91, 0x1a, 0x1a, 0x04, 0x36, 0xc2, 0x80, 0x19, + 0x09, 0x04, 0x36, 0xc2, 0x68, 0x4e, 0x69, 0x46, 0x78, 0x8c, 0x68, 0x62, + 0x78, 0x88, 0x68, 0x66, 0x90, 0x06, 0x68, 0x6a, 0x68, 0x6e, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x6d, 0x66, 0x01, 0x2e, 0x08, 0x04, + 0x36, 0x8d, 0x90, 0x2e, 0x25, 0x20, 0x81, 0xff, 0x01, 0x20, 0x20, 0x09, + 0x00, 0x01, 0x08, 0x04, 0x36, 0xbf, 0x79, 0x84, 0x7b, 0x88, 0x7a, 0x8c, + 0x20, 0xa9, 0x00, 0x05, 0x20, 0xe9, 0x00, 0x01, 0x20, 0xa1, 0x18, 0xa6, + 0x41, 0x01, 0x08, 0x0c, 0x4c, 0x41, 0x11, 0x20, 0x20, 0x09, 0x00, 0x02, + 0x08, 0x04, 0x36, 0xbf, 0x20, 0x09, 0x00, 0x20, 0xa8, 0x5c, 0x90, 0x80, + 0x00, 0x19, 0xaf, 0x60, 0x08, 0x0c, 0x4c, 0x8a, 0x70, 0x1f, 0x37, 0xb3, + 0x00, 0x05, 0xa8, 0x64, 0x20, 0x08, 0x90, 0x84, 0x00, 0xff, 0x90, 0x96, + 0x00, 0x11, 0x01, 0x68, 0x90, 0x96, 0x00, 0x19, 0x01, 0x50, 0x90, 0x96, + 0x00, 0x15, 0x01, 0x38, 0x90, 0x96, 0x00, 0x48, 0x01, 0x20, 0x90, 0x96, + 0x00, 0x29, 0x19, 0x04, 0x36, 0xbf, 0x81, 0x0f, 0x91, 0x8c, 0x00, 0xff, + 0x09, 0x04, 0x36, 0xbf, 0x71, 0x12, 0x70, 0x10, 0x80, 0x01, 0x05, 0x60, + 0x70, 0x12, 0x08, 0x0c, 0x4c, 0x41, 0x11, 0x20, 0x20, 0x09, 0x00, 0x02, + 0x08, 0x04, 0x36, 0xbf, 0x20, 0x09, 0x00, 0x20, 0x70, 0x68, 0x20, 0x40, + 0xa2, 0x8c, 0xa3, 0x90, 0xa4, 0x94, 0xa5, 0x98, 0x92, 0x90, 0x00, 0x40, + 0x93, 0x99, 0x00, 0x00, 0x94, 0xa1, 0x00, 0x00, 0x95, 0xa9, 0x00, 0x00, + 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x19, 0xaf, 0x60, 0x08, 0x0c, 0x4c, 0x8a, + 0x70, 0x1f, 0x37, 0xf1, 0x00, 0x05, 0xa8, 0x64, 0x90, 0x84, 0x00, 0xff, + 0x90, 0x96, 0x00, 0x02, 0x01, 0x20, 0x90, 0x96, 0x00, 0x0a, 0x19, 0x04, + 0x36, 0xbf, 0x08, 0x88, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x70, 0x14, + 0x20, 0x48, 0xa8, 0x68, 0xc0, 0xfd, 0xa8, 0x6a, 0xa8, 0x64, 0x90, 0x84, + 0x00, 0xff, 0x90, 0x96, 0x00, 0x29, 0x11, 0x48, 0xc2, 0xfd, 0xaa, 0x7a, + 0x08, 0x0c, 0x63, 0x0a, 0x01, 0x38, 0xa8, 0x7a, 0xa9, 0x82, 0x01, 0x2e, + 0x00, 0x60, 0x08, 0x0c, 0x66, 0x3a, 0x11, 0x30, 0x70, 0x07, 0x00, 0x03, + 0x70, 0x1f, 0x38, 0x1f, 0x01, 0x2e, 0x00, 0x05, 0x08, 0x0c, 0x72, 0x5e, + 0x01, 0x2e, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0xa9, 0x00, 0x05, + 0x20, 0xe1, 0x00, 0x01, 0x20, 0x99, 0x18, 0xa6, 0x40, 0x0a, 0x21, 0x00, + 0x92, 0x10, 0x93, 0x99, 0x00, 0x00, 0x94, 0xa1, 0x00, 0x00, 0x95, 0xa9, + 0x00, 0x00, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x19, 0x20, 0x09, 0x00, 0x20, + 0x01, 0x2e, 0xaf, 0x60, 0x08, 0x04, 0x4c, 0x8d, 0x20, 0x91, 0x80, 0x00, + 0x78, 0x37, 0x40, 0x00, 0x78, 0x33, 0x00, 0x10, 0x78, 0x83, 0x40, 0x00, + 0x78, 0x87, 0x49, 0x53, 0x78, 0x8b, 0x50, 0x20, 0x78, 0x8f, 0x20, 0x20, + 0x20, 0x09, 0x01, 0x7f, 0x21, 0x04, 0x78, 0x92, 0x3f, 0x00, 0x78, 0x96, + 0x20, 0x61, 0x01, 0x00, 0x62, 0x00, 0x20, 0x61, 0x02, 0x00, 0x60, 0x3c, + 0x80, 0x07, 0x92, 0x05, 0x78, 0x9a, 0x20, 0x09, 0x04, 0xfd, 0x21, 0x04, + 0x78, 0x9e, 0x20, 0x91, 0x50, 0x00, 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, + 0x00, 0x89, 0x20, 0x04, 0xd0, 0x84, 0x01, 0x80, 0x20, 0x01, 0x1a, 0x25, + 0x20, 0x04, 0x90, 0x05, 0x01, 0x28, 0x20, 0x01, 0x00, 0x8b, 0x20, 0x04, + 0xd0, 0xfc, 0x0d, 0xd8, 0x20, 0x01, 0x00, 0x8a, 0x20, 0x03, 0x00, 0x02, + 0x20, 0x03, 0x10, 0x01, 0x20, 0x71, 0x00, 0x80, 0x08, 0x04, 0x04, 0x27, + 0x81, 0xff, 0x19, 0x04, 0x36, 0xbf, 0x79, 0x84, 0x08, 0x0c, 0x67, 0xb4, + 0x19, 0x04, 0x36, 0xc2, 0x7e, 0x98, 0x96, 0x84, 0x3f, 0xff, 0x90, 0x82, + 0x40, 0x00, 0x1a, 0x04, 0x36, 0xc2, 0x7c, 0x88, 0x7d, 0x8c, 0x08, 0x0c, + 0x69, 0xf1, 0x08, 0x0c, 0x69, 0x7e, 0x15, 0x18, 0x20, 0x61, 0x1d, 0xdc, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x60, 0x00, 0x90, 0x86, 0x00, 0x00, + 0x01, 0x48, 0x60, 0x14, 0x90, 0x4d, 0x01, 0x30, 0xa8, 0x6c, 0x94, 0x06, + 0x11, 0x18, 0xa8, 0x70, 0x95, 0x06, 0x01, 0x50, 0x01, 0x2e, 0x9c, 0xe0, + 0x00, 0x1c, 0x20, 0x01, 0x18, 0x1a, 0x20, 0x04, 0x9c, 0x02, 0x1a, 0x04, + 0x36, 0xbf, 0x0c, 0x30, 0x08, 0x0c, 0xca, 0xe9, 0x01, 0x2e, 0x09, 0x04, + 0x36, 0xbf, 0x08, 0x04, 0x36, 0x8d, 0x90, 0x0e, 0x20, 0x01, 0x00, 0x05, + 0x08, 0x0c, 0x72, 0x5e, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, + 0xd2, 0x26, 0x08, 0x0c, 0x70, 0x12, 0x01, 0x2e, 0x08, 0x04, 0x36, 0x8d, + 0x00, 0xa6, 0x29, 0x50, 0xb1, 0x98, 0x08, 0x0c, 0x67, 0xb4, 0x19, 0x04, + 0x39, 0x0a, 0xb6, 0xa4, 0x96, 0x84, 0x3f, 0xff, 0x90, 0x82, 0x40, 0x00, + 0x16, 0xe8, 0xb4, 0x9c, 0xb5, 0xa0, 0x08, 0x0c, 0x69, 0xf1, 0x08, 0x0c, + 0x69, 0x7e, 0x15, 0x20, 0x20, 0x61, 0x1d, 0xdc, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x60, 0x00, 0x90, 0x86, 0x00, 0x00, 0x01, 0x48, 0x60, 0x14, + 0x90, 0x4d, 0x01, 0x30, 0xa8, 0x6c, 0x94, 0x06, 0x11, 0x18, 0xa8, 0x70, + 0x95, 0x06, 0x01, 0x58, 0x01, 0x2e, 0x9c, 0xe0, 0x00, 0x1c, 0x20, 0x01, + 0x18, 0x1a, 0x20, 0x04, 0x9c, 0x02, 0x20, 0x09, 0x00, 0x0d, 0x12, 0xb0, + 0x0c, 0x28, 0x08, 0x0c, 0xca, 0xe9, 0x01, 0x2e, 0x20, 0x09, 0x00, 0x03, + 0x01, 0x78, 0x00, 0xe0, 0x90, 0x0e, 0x20, 0x01, 0x00, 0x05, 0x08, 0x0c, + 0x72, 0x5e, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0xd2, 0x26, + 0x08, 0x0c, 0x70, 0x06, 0x01, 0x2e, 0x00, 0x70, 0xb0, 0x97, 0x40, 0x05, + 0xb1, 0x9a, 0x00, 0x10, 0xb0, 0x97, 0x40, 0x06, 0x90, 0x0e, 0x90, 0x85, + 0x00, 0x01, 0x20, 0x01, 0x00, 0x30, 0x2a, 0x48, 0x00, 0xae, 0x00, 0x05, + 0xb0, 0x97, 0x40, 0x00, 0x90, 0x06, 0x91, 0x8d, 0x00, 0x01, 0x20, 0x08, + 0x2a, 0x48, 0x00, 0xae, 0x00, 0x05, 0x81, 0xff, 0x19, 0x04, 0x36, 0xbf, + 0x08, 0x0c, 0x4c, 0x58, 0x09, 0x04, 0x36, 0xc2, 0x08, 0x0c, 0x68, 0x7b, + 0x09, 0x04, 0x36, 0xbf, 0x08, 0x0c, 0x69, 0xf7, 0x09, 0x04, 0x36, 0xbf, + 0x08, 0x04, 0x46, 0xaa, 0x81, 0xff, 0x19, 0x04, 0x36, 0xbf, 0x08, 0x0c, + 0x4c, 0x74, 0x09, 0x04, 0x36, 0xc2, 0x08, 0x0c, 0x6a, 0x85, 0x09, 0x04, + 0x36, 0xbf, 0x20, 0x19, 0x00, 0x05, 0x79, 0xa8, 0x08, 0x0c, 0x6a, 0x12, + 0x09, 0x04, 0x36, 0xbf, 0x78, 0x88, 0x90, 0x8a, 0x10, 0x00, 0x1a, 0x04, + 0x36, 0xc2, 0x80, 0x03, 0x80, 0x0b, 0x81, 0x0b, 0x91, 0x08, 0x08, 0x0c, + 0x89, 0xa1, 0x79, 0xa8, 0xd1, 0x84, 0x19, 0x04, 0x36, 0x8d, 0x08, 0x04, + 0x46, 0xaa, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x81, 0xff, 0x01, 0x18, + 0x20, 0x09, 0x00, 0x01, 0x04, 0x50, 0x20, 0x29, 0x07, 0xff, 0x64, 0x5c, + 0x24, 0x00, 0x95, 0x06, 0x01, 0xf8, 0x25, 0x08, 0x08, 0x0c, 0x67, 0xb4, + 0x11, 0xd8, 0x08, 0x0c, 0x6a, 0x85, 0x11, 0x28, 0x20, 0x09, 0x00, 0x02, + 0x62, 0xc0, 0x25, 0x18, 0x00, 0xc0, 0x20, 0x19, 0x00, 0x04, 0x90, 0x0e, + 0x08, 0x0c, 0x6a, 0x12, 0x11, 0x18, 0x20, 0x09, 0x00, 0x06, 0x00, 0x78, + 0x78, 0x84, 0x90, 0x8a, 0x10, 0x00, 0x12, 0x70, 0x80, 0x03, 0x80, 0x0b, + 0x81, 0x0b, 0x91, 0x08, 0x08, 0x0c, 0x89, 0xa1, 0x85, 0x29, 0x1a, 0xe0, + 0x01, 0x2e, 0x08, 0x04, 0x36, 0x8d, 0x01, 0x2e, 0x08, 0x04, 0x36, 0xbf, + 0x01, 0x2e, 0x08, 0x04, 0x36, 0xc2, 0x08, 0x0c, 0x4c, 0x58, 0x09, 0x04, + 0x36, 0xc2, 0x08, 0x0c, 0x68, 0x7b, 0x09, 0x04, 0x36, 0xbf, 0x08, 0x0c, + 0xac, 0xfc, 0xba, 0xa0, 0x20, 0x19, 0x00, 0x05, 0x00, 0xc6, 0x90, 0x66, + 0x08, 0x0c, 0x97, 0xb0, 0x00, 0x76, 0x90, 0x3e, 0x08, 0x0c, 0x96, 0x6d, + 0x90, 0x0e, 0x08, 0x0c, 0xe7, 0x5d, 0x00, 0x7e, 0x00, 0xce, 0x08, 0x0c, + 0xad, 0x18, 0x08, 0x0c, 0x69, 0xf1, 0x08, 0x04, 0x36, 0x8d, 0x08, 0x0c, + 0x4c, 0x58, 0x09, 0x04, 0x36, 0xc2, 0x08, 0x0c, 0x69, 0xf1, 0x22, 0x08, + 0x08, 0x04, 0x36, 0x8d, 0x01, 0x56, 0x00, 0xd6, 0x00, 0xe6, 0x00, 0xc6, + 0x20, 0x69, 0x19, 0x10, 0x68, 0x10, 0x69, 0x14, 0x91, 0x0a, 0x12, 0x08, + 0x90, 0x0e, 0x68, 0x16, 0x90, 0x16, 0x90, 0x1e, 0x20, 0x71, 0x19, 0xe8, + 0x70, 0x28, 0x90, 0x65, 0x01, 0x18, 0x82, 0x10, 0x60, 0x0c, 0x0c, 0xd8, + 0x23, 0x00, 0x92, 0x18, 0x00, 0xce, 0x00, 0xee, 0x00, 0xde, 0x01, 0x5e, + 0x08, 0x04, 0x36, 0x8d, 0x00, 0xf6, 0x00, 0x16, 0x90, 0x7d, 0x01, 0x38, + 0x90, 0x06, 0x80, 0x00, 0x2f, 0x0c, 0x81, 0xff, 0x01, 0x10, 0x21, 0x78, + 0x0c, 0xd0, 0x00, 0x1e, 0x00, 0xfe, 0x00, 0x05, 0x20, 0x69, 0x19, 0x10, + 0x69, 0x10, 0x62, 0xbc, 0x08, 0x04, 0x36, 0x8d, 0x81, 0xff, 0x01, 0x20, + 0x20, 0x09, 0x00, 0x01, 0x08, 0x04, 0x36, 0xbf, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0x58, 0x54, 0x01, 0x28, 0x20, 0x09, 0x00, 0x07, + 0x01, 0x2e, 0x08, 0x04, 0x36, 0xbf, 0x01, 0x2e, 0x61, 0x5c, 0x91, 0x90, + 0x34, 0x8e, 0x22, 0x15, 0x92, 0x94, 0x00, 0xff, 0x63, 0x7c, 0x83, 0xff, + 0x01, 0x08, 0x62, 0x80, 0x67, 0xdc, 0x97, 0xc4, 0x00, 0x0a, 0x98, 0xc6, + 0x00, 0x0a, 0x11, 0x18, 0x20, 0x31, 0x00, 0x01, 0x00, 0xe8, 0x97, 0xc4, + 0x00, 0x22, 0x98, 0xc6, 0x00, 0x22, 0x11, 0x18, 0x20, 0x31, 0x00, 0x03, + 0x00, 0xa8, 0x97, 0xc4, 0x00, 0x12, 0x98, 0xc6, 0x00, 0x12, 0x11, 0x18, + 0x20, 0x31, 0x00, 0x02, 0x00, 0x68, 0x08, 0x0c, 0x77, 0x9e, 0x11, 0x18, + 0x20, 0x31, 0x00, 0x04, 0x00, 0x38, 0xd7, 0x9c, 0x01, 0x20, 0x20, 0x09, + 0x00, 0x05, 0x08, 0x04, 0x36, 0xbf, 0x90, 0x36, 0x7e, 0x9a, 0x7f, 0x9e, + 0x08, 0x04, 0x36, 0x8d, 0x61, 0x4c, 0x62, 0x50, 0x20, 0x19, 0x19, 0x86, + 0x23, 0x1c, 0x20, 0x01, 0x19, 0x87, 0x20, 0x04, 0x78, 0x9a, 0x08, 0x04, + 0x36, 0x8d, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x61, 0x38, 0x62, 0x3c, + 0x63, 0x40, 0x01, 0x2e, 0x08, 0x04, 0x36, 0x8d, 0x08, 0x0c, 0x4c, 0x74, + 0x09, 0x04, 0x36, 0xc2, 0xba, 0x44, 0xbb, 0x38, 0x08, 0x04, 0x36, 0x8d, + 0x08, 0x0c, 0x0d, 0x85, 0x08, 0x0c, 0x4c, 0x74, 0x21, 0x10, 0x09, 0x04, + 0x36, 0xc2, 0xb8, 0x04, 0x90, 0x8c, 0x00, 0xff, 0x91, 0x8e, 0x00, 0x06, + 0x01, 0x40, 0x90, 0x84, 0xff, 0x00, 0x90, 0x86, 0x06, 0x00, 0x20, 0x09, + 0x00, 0x09, 0x19, 0x04, 0x36, 0xbf, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x19, 0x00, 0x05, 0x00, 0xc6, 0x90, 0x66, 0x08, 0x0c, 0xac, 0xfc, + 0x08, 0x0c, 0xa7, 0xe2, 0x08, 0x0c, 0x97, 0xb0, 0x00, 0x76, 0x90, 0x3e, + 0x08, 0x0c, 0x96, 0x6d, 0x90, 0x0e, 0x08, 0x0c, 0xe7, 0x5d, 0x00, 0x7e, + 0x00, 0xce, 0x08, 0x0c, 0xad, 0x18, 0xb8, 0x07, 0x04, 0x07, 0x01, 0x2e, + 0x08, 0x04, 0x36, 0x8d, 0x61, 0x4c, 0x62, 0x50, 0x78, 0x84, 0x60, 0x4e, + 0x7b, 0x88, 0x63, 0x52, 0x20, 0x69, 0x18, 0x47, 0x83, 0x1f, 0x93, 0x05, + 0x68, 0x16, 0x78, 0x8c, 0x20, 0x69, 0x19, 0x86, 0x2d, 0x1c, 0x20, 0x6a, + 0x7e, 0x98, 0x96, 0x82, 0x00, 0x14, 0x12, 0x10, 0x20, 0x31, 0x07, 0xd0, + 0x20, 0x69, 0x19, 0x87, 0x2d, 0x04, 0x26, 0x6a, 0x78, 0x9a, 0x08, 0x04, + 0x36, 0x8d, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x61, 0x38, 0x78, 0x84, + 0x60, 0x3a, 0x91, 0x0e, 0xd1, 0xb4, 0x19, 0x0c, 0x0e, 0xeb, 0xd0, 0xc4, + 0x01, 0xa8, 0x00, 0xd6, 0x78, 0xa8, 0x20, 0x09, 0x19, 0x9d, 0x20, 0x0a, + 0x78, 0xac, 0x20, 0x11, 0x19, 0x9e, 0x20, 0x12, 0x20, 0x69, 0x01, 0x00, + 0x68, 0x38, 0x90, 0x86, 0x00, 0x07, 0x11, 0x18, 0x22, 0x14, 0x6a, 0x5a, + 0x00, 0x10, 0x21, 0x0c, 0x69, 0x5a, 0x00, 0xde, 0x78, 0x88, 0xd0, 0xec, + 0x01, 0x78, 0x60, 0x34, 0xc0, 0x8d, 0x60, 0x36, 0x20, 0x01, 0x00, 0x50, + 0x60, 0x76, 0x60, 0x7a, 0x60, 0x56, 0x60, 0x6b, 0x26, 0x9c, 0x00, 0xc6, + 0x20, 0x61, 0x1b, 0x73, 0x20, 0x62, 0x00, 0xce, 0x20, 0x11, 0x01, 0x16, + 0x22, 0x0c, 0x78, 0x88, 0xd0, 0x8c, 0x01, 0x18, 0x91, 0x8d, 0x00, 0x40, + 0x00, 0x10, 0x91, 0x8c, 0xff, 0x7f, 0x21, 0x12, 0x61, 0x34, 0xd1, 0x8c, + 0x20, 0x01, 0x00, 0x00, 0x01, 0x08, 0x60, 0x3c, 0x79, 0x88, 0x61, 0x3e, + 0x61, 0x40, 0x91, 0x0d, 0x78, 0x8c, 0x60, 0x42, 0x62, 0x34, 0xd2, 0x8c, + 0x01, 0x20, 0x7a, 0x88, 0x92, 0x94, 0x10, 0x00, 0x92, 0x05, 0x91, 0x0e, + 0xd1, 0xe4, 0x19, 0x0c, 0x0f, 0x06, 0x90, 0x84, 0x00, 0x20, 0x01, 0x30, + 0x78, 0xb4, 0x60, 0x46, 0x90, 0x84, 0x00, 0x01, 0x09, 0x0c, 0x43, 0x97, + 0x60, 0x40, 0xd0, 0xcc, 0x01, 0x20, 0x78, 0xb0, 0x20, 0x11, 0x01, 0x14, + 0x20, 0x12, 0x01, 0x2e, 0x08, 0x04, 0x36, 0x8d, 0x00, 0xf6, 0x20, 0x79, + 0x18, 0x00, 0x7a, 0x38, 0xa8, 0x98, 0x90, 0x84, 0xfe, 0xbf, 0x92, 0x15, + 0xa8, 0x9c, 0x90, 0x84, 0xfe, 0xbf, 0x80, 0x02, 0x92, 0x14, 0x78, 0x38, + 0x90, 0x84, 0x01, 0x40, 0x92, 0x15, 0x7a, 0x3a, 0xa8, 0x97, 0x40, 0x00, + 0x90, 0x0e, 0x90, 0x85, 0x00, 0x01, 0x20, 0x01, 0x00, 0x00, 0x00, 0xfe, + 0x00, 0x05, 0x78, 0x98, 0x90, 0x05, 0x01, 0xa8, 0x78, 0x88, 0x90, 0x25, + 0x09, 0x04, 0x36, 0xc2, 0x78, 0x8c, 0x90, 0x2d, 0x09, 0x04, 0x36, 0xc2, + 0x90, 0x0e, 0x08, 0x0c, 0x67, 0xb4, 0x11, 0x20, 0xba, 0x44, 0xbb, 0x38, + 0xbc, 0x46, 0xbd, 0x3a, 0x91, 0x86, 0x07, 0xff, 0x01, 0x90, 0x81, 0x08, + 0x0c, 0xa0, 0x08, 0x0c, 0x4c, 0x74, 0x09, 0x04, 0x36, 0xc2, 0x78, 0x88, + 0x90, 0x0d, 0x09, 0x04, 0x36, 0xc2, 0x78, 0x8c, 0x90, 0x05, 0x09, 0x04, + 0x36, 0xc2, 0xba, 0x44, 0xb9, 0x46, 0xbb, 0x38, 0xb8, 0x3a, 0x08, 0x04, + 0x36, 0x8d, 0x20, 0x11, 0xbc, 0x09, 0x00, 0x10, 0x20, 0x11, 0xbc, 0x05, + 0x08, 0x0c, 0x58, 0x54, 0x19, 0x04, 0x36, 0xbf, 0x00, 0xc6, 0x20, 0x61, + 0x01, 0x00, 0x79, 0x84, 0x91, 0x86, 0x00, 0xff, 0x11, 0x30, 0x20, 0x01, + 0x18, 0x18, 0x20, 0x04, 0x90, 0x85, 0xff, 0x00, 0x00, 0x88, 0x91, 0x82, + 0x00, 0x7f, 0x16, 0xe0, 0x91, 0x88, 0x34, 0x8e, 0x21, 0x0d, 0x91, 0x8c, + 0x00, 0xff, 0x20, 0x01, 0x18, 0x18, 0x20, 0x04, 0x00, 0x26, 0x91, 0x16, + 0x00, 0x2e, 0x05, 0x80, 0x81, 0x0f, 0x91, 0x05, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x00, 0x06, 0x08, 0x0c, 0xb1, 0x16, 0x00, 0x0e, 0x05, 0x10, + 0x60, 0x2e, 0x62, 0x0a, 0x79, 0x84, 0x00, 0xb6, 0x08, 0x0c, 0x67, 0x4f, + 0x2b, 0x08, 0x00, 0xbe, 0x15, 0x00, 0x61, 0x12, 0x60, 0x23, 0x00, 0x01, + 0x08, 0x0c, 0x4c, 0x41, 0x01, 0xd0, 0x90, 0x06, 0xa8, 0x66, 0x70, 0x07, + 0x00, 0x03, 0xa8, 0x32, 0xa8, 0x68, 0xc0, 0xfd, 0xa8, 0x6a, 0x70, 0x1f, + 0x3b, 0x9e, 0x29, 0x00, 0x60, 0x16, 0x20, 0x09, 0x00, 0x32, 0x08, 0x0c, + 0xb2, 0x0a, 0x01, 0x2e, 0x00, 0xce, 0x00, 0x05, 0x01, 0x2e, 0x00, 0xce, + 0x08, 0x04, 0x36, 0xbf, 0x00, 0xce, 0x08, 0x04, 0x36, 0xc2, 0x08, 0x0c, + 0xb1, 0x6c, 0x0c, 0xb0, 0xa8, 0x30, 0x90, 0x86, 0x01, 0x00, 0x09, 0x04, + 0x36, 0xbf, 0x08, 0x04, 0x36, 0x8d, 0x20, 0x61, 0x1a, 0x73, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x60, 0x00, 0xd0, 0x84, 0x01, 0x70, 0x61, 0x04, + 0x62, 0x08, 0x20, 0x61, 0x18, 0x00, 0x63, 0x54, 0x60, 0x74, 0x78, 0x9a, + 0x60, 0xc0, 0x78, 0x9e, 0x60, 0xbc, 0x78, 0xaa, 0x01, 0x2e, 0x08, 0x04, + 0x36, 0x8d, 0x90, 0x0e, 0x21, 0x10, 0x0c, 0x88, 0x81, 0xff, 0x19, 0x04, + 0x36, 0xbf, 0x08, 0x0c, 0x77, 0x9e, 0x09, 0x04, 0x36, 0xbf, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x62, 0x54, 0x60, 0x74, 0x92, 0x02, 0x02, 0x48, + 0x90, 0x85, 0x00, 0x01, 0x08, 0x0c, 0x26, 0xf5, 0x08, 0x0c, 0x5a, 0x7c, + 0x01, 0x2e, 0x08, 0x04, 0x36, 0x8d, 0x01, 0x2e, 0x08, 0x04, 0x36, 0xc2, + 0x00, 0x06, 0x00, 0x16, 0x00, 0xc6, 0x00, 0xe6, 0x20, 0x01, 0x19, 0xaa, + 0x20, 0x70, 0x20, 0x61, 0x18, 0x47, 0x60, 0x08, 0x20, 0x72, 0x90, 0x0e, + 0x20, 0x11, 0x14, 0x00, 0x08, 0x0c, 0x95, 0x5b, 0x72, 0x06, 0x00, 0xee, + 0x00, 0xce, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x81, 0xff, 0x01, 0x28, 0x01, 0x2e, 0x20, 0x21, 0x40, 0x0b, + 0x08, 0x04, 0x36, 0x8f, 0x78, 0x84, 0xd0, 0xfc, 0x01, 0x58, 0x20, 0x01, + 0x00, 0x2a, 0x20, 0x04, 0x90, 0x05, 0x01, 0x80, 0x90, 0x82, 0x00, 0xe1, + 0x02, 0x98, 0x01, 0x2e, 0x08, 0x04, 0x36, 0xc2, 0x20, 0x01, 0x00, 0x2a, + 0x20, 0x04, 0x90, 0x05, 0x01, 0x28, 0x20, 0x69, 0x18, 0x47, 0x69, 0x08, + 0x91, 0x02, 0x12, 0x30, 0x01, 0x2e, 0x08, 0x04, 0x36, 0xc2, 0x01, 0x2e, + 0x08, 0x04, 0x36, 0xbf, 0x08, 0x0c, 0xb0, 0x94, 0x0d, 0xd0, 0x78, 0x84, + 0xd0, 0xfc, 0x09, 0x04, 0x3c, 0x6d, 0x00, 0xc6, 0x08, 0x0c, 0x4c, 0x41, + 0x00, 0xce, 0x0d, 0x88, 0xa8, 0x67, 0x00, 0x00, 0x78, 0x84, 0xa8, 0x0a, + 0x78, 0x98, 0xa8, 0x0e, 0x78, 0x9c, 0xa8, 0x12, 0x20, 0x01, 0x00, 0x2e, + 0x20, 0x04, 0xa8, 0x1a, 0x20, 0x01, 0x00, 0x2f, 0x20, 0x04, 0xa8, 0x1e, + 0x20, 0x01, 0x00, 0x30, 0x20, 0x04, 0xa8, 0x22, 0x20, 0x01, 0x00, 0x31, + 0x20, 0x04, 0xa8, 0x26, 0x20, 0x01, 0x00, 0x34, 0x20, 0x04, 0xa8, 0x2a, + 0x20, 0x01, 0x00, 0x35, 0x20, 0x04, 0xa8, 0x2e, 0x20, 0x01, 0x00, 0x2a, + 0x20, 0x04, 0x90, 0x80, 0x00, 0x03, 0x90, 0x84, 0x00, 0xfc, 0x80, 0x04, + 0xa8, 0x16, 0x08, 0x0c, 0x3d, 0xf7, 0x09, 0x28, 0x70, 0x14, 0x20, 0x48, + 0xad, 0x2c, 0xac, 0x28, 0xab, 0x1c, 0xaa, 0x18, 0xa9, 0x30, 0xa8, 0x08, + 0xd0, 0xb4, 0x11, 0x20, 0x20, 0x29, 0x00, 0x00, 0x20, 0x21, 0x00, 0x00, + 0x89, 0x06, 0x80, 0x06, 0x80, 0x07, 0x90, 0xbc, 0x00, 0x3f, 0x90, 0x84, + 0xff, 0xc0, 0x90, 0x80, 0x00, 0x1b, 0x08, 0x0c, 0x4c, 0x8a, 0x70, 0x1f, + 0x3d, 0x34, 0x70, 0x23, 0x00, 0x01, 0x01, 0x2e, 0x00, 0x05, 0x08, 0x0c, + 0xac, 0xfc, 0x00, 0x46, 0x00, 0x86, 0x00, 0x96, 0x00, 0xa6, 0x00, 0xb6, + 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x00, 0xf6, 0x08, 0x0c, 0x3b, 0xd8, + 0x20, 0x01, 0x19, 0xa0, 0x20, 0x03, 0x00, 0x00, 0x20, 0x21, 0x00, 0x0a, + 0x20, 0x61, 0x01, 0x00, 0x61, 0x04, 0x00, 0x16, 0x60, 0xbb, 0x00, 0x00, + 0x60, 0xbf, 0x32, 0xe1, 0x60, 0xbf, 0x00, 0x12, 0x08, 0x0c, 0x3e, 0x66, + 0x08, 0x0c, 0x3e, 0x25, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0x86, 0x29, 0x40, + 0x20, 0x71, 0x19, 0xe8, 0x20, 0x79, 0x00, 0x90, 0x00, 0xd6, 0x20, 0x69, + 0x00, 0x00, 0x68, 0x84, 0xd0, 0xb4, 0x01, 0x40, 0x20, 0x01, 0x00, 0x35, + 0x20, 0x04, 0x78, 0x0e, 0x20, 0x01, 0x00, 0x34, 0x20, 0x04, 0x78, 0x0a, + 0x00, 0xde, 0x20, 0x11, 0x00, 0x01, 0x08, 0x0c, 0x41, 0xdb, 0x00, 0x8e, + 0x00, 0xee, 0x00, 0xfe, 0x08, 0x0c, 0x40, 0xfd, 0x08, 0x0c, 0x40, 0x2a, + 0x05, 0xb8, 0x20, 0x01, 0x02, 0x0b, 0x20, 0x04, 0x90, 0x84, 0x01, 0x40, + 0x1d, 0xb8, 0x08, 0x0c, 0x42, 0x4f, 0x00, 0xf6, 0x20, 0x79, 0x03, 0x00, + 0x78, 0xbc, 0x00, 0xfe, 0x90, 0x8c, 0x00, 0x70, 0x15, 0x60, 0x20, 0x71, + 0x02, 0x00, 0x70, 0x37, 0x00, 0x00, 0x70, 0x50, 0x90, 0x84, 0xff, 0x00, + 0x90, 0x86, 0x32, 0x00, 0x15, 0x10, 0x70, 0x37, 0x00, 0x01, 0x70, 0x50, + 0x90, 0x84, 0xff, 0x00, 0x90, 0x86, 0xe1, 0x00, 0x11, 0xd0, 0x70, 0x37, + 0x00, 0x00, 0x70, 0x54, 0x70, 0x37, 0x00, 0x00, 0x71, 0x5c, 0x91, 0x06, + 0x11, 0x90, 0x20, 0x01, 0x18, 0x20, 0x20, 0x04, 0x91, 0x06, 0x11, 0x68, + 0x00, 0xc6, 0x20, 0x61, 0x01, 0x00, 0x60, 0x24, 0x90, 0x84, 0x1e, 0x00, + 0x00, 0xce, 0x01, 0x38, 0x08, 0x0c, 0x40, 0x34, 0x08, 0x0c, 0x3e, 0x20, + 0x00, 0x58, 0x08, 0x0c, 0x3e, 0x20, 0x08, 0x0c, 0x41, 0x73, 0x08, 0x0c, + 0x40, 0xf3, 0x20, 0x01, 0x02, 0x0b, 0x20, 0x04, 0xd0, 0xe4, 0x0d, 0xd8, + 0x20, 0x01, 0x03, 0x2a, 0x20, 0x03, 0x00, 0x04, 0x20, 0x61, 0x01, 0x00, + 0x60, 0x27, 0x00, 0x02, 0x00, 0x1e, 0x61, 0x06, 0x20, 0x11, 0x02, 0x0d, + 0x20, 0x13, 0x00, 0x20, 0x60, 0xbb, 0x00, 0x00, 0x60, 0xbf, 0x01, 0x08, + 0x60, 0xbf, 0x00, 0x12, 0x20, 0x01, 0x00, 0x04, 0x20, 0x0c, 0x91, 0x8c, + 0xff, 0xfd, 0x21, 0x02, 0x08, 0x0c, 0x13, 0x52, 0x20, 0x09, 0x00, 0x28, + 0x08, 0x0c, 0x22, 0x20, 0x20, 0x01, 0x02, 0x27, 0x20, 0x0c, 0x21, 0x02, + 0x08, 0x0c, 0xad, 0x18, 0x00, 0xfe, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, + 0x00, 0xbe, 0x00, 0xae, 0x00, 0x9e, 0x00, 0x8e, 0x00, 0x4e, 0x20, 0x01, + 0x19, 0xa0, 0x20, 0x04, 0x90, 0x05, 0x11, 0x18, 0x01, 0x2e, 0x08, 0x04, + 0x36, 0x8d, 0x01, 0x2e, 0x20, 0x21, 0x40, 0x0c, 0x08, 0x04, 0x36, 0x8f, + 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x00, 0x46, 0x00, 0x56, 0x00, 0x76, + 0x00, 0x86, 0x00, 0x96, 0x00, 0xd6, 0x01, 0x56, 0x70, 0x14, 0x20, 0x48, + 0x70, 0x20, 0x20, 0xa8, 0x80, 0x00, 0x70, 0x22, 0xa8, 0x04, 0x90, 0x05, + 0x09, 0x04, 0x3d, 0x90, 0x20, 0x48, 0x1f, 0x04, 0x3d, 0x44, 0x70, 0x68, + 0x20, 0x40, 0xa2, 0x8c, 0xa3, 0x90, 0xa4, 0x94, 0xa5, 0x98, 0xa9, 0x30, + 0xa8, 0x08, 0xd0, 0xb4, 0x11, 0x20, 0x20, 0x29, 0x00, 0x00, 0x20, 0x21, + 0x00, 0x00, 0x00, 0x96, 0x70, 0x14, 0x20, 0x48, 0xa8, 0x64, 0x00, 0x9e, + 0x90, 0x86, 0x01, 0x03, 0x01, 0x70, 0x89, 0x06, 0x80, 0x06, 0x80, 0x07, + 0x90, 0xbc, 0x00, 0x3f, 0x90, 0x84, 0xff, 0xc0, 0x90, 0x80, 0x00, 0x1b, + 0x08, 0x0c, 0x4c, 0x8a, 0x70, 0x1f, 0x3d, 0x34, 0x00, 0xb0, 0x89, 0x06, + 0x80, 0x06, 0x80, 0x07, 0x90, 0xbc, 0x00, 0x3f, 0x90, 0x84, 0xff, 0xc0, + 0x90, 0x80, 0x00, 0x1b, 0x21, 0xa8, 0x27, 0xe0, 0x20, 0x98, 0x27, 0xe8, + 0x20, 0xa0, 0x00, 0x06, 0x08, 0x0c, 0x0f, 0xd6, 0x00, 0x0e, 0x08, 0x0c, + 0x4c, 0x8d, 0x70, 0x1f, 0x3d, 0x34, 0x01, 0x5e, 0x00, 0xde, 0x00, 0x9e, + 0x00, 0x8e, 0x00, 0x7e, 0x00, 0x5e, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0x2e, + 0x00, 0x1e, 0x00, 0x05, 0x70, 0x14, 0x20, 0x48, 0xa8, 0x64, 0x90, 0x86, + 0x01, 0x03, 0x11, 0x18, 0x70, 0x1f, 0x3d, 0xf5, 0x04, 0x50, 0x70, 0x14, + 0x20, 0x48, 0xa8, 0x68, 0xc0, 0xfd, 0xa8, 0x6a, 0x20, 0x09, 0x00, 0x7f, + 0x08, 0x0c, 0x67, 0x49, 0x01, 0x10, 0x90, 0x06, 0x00, 0x30, 0xb8, 0x13, + 0x00, 0xff, 0xb8, 0x17, 0xff, 0xfd, 0x08, 0x0c, 0xd4, 0x09, 0x01, 0x5e, + 0x00, 0xde, 0x00, 0x9e, 0x00, 0x8e, 0x00, 0x7e, 0x00, 0x5e, 0x00, 0x4e, + 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, 0x09, 0x04, 0x36, 0xbf, 0x00, 0x16, + 0x00, 0x26, 0x00, 0x36, 0x00, 0x46, 0x00, 0x56, 0x00, 0x76, 0x00, 0x86, + 0x00, 0x96, 0x00, 0xd6, 0x01, 0x56, 0x70, 0x1f, 0x3d, 0xc7, 0x70, 0x07, + 0x00, 0x03, 0x08, 0x04, 0x3d, 0x85, 0xa8, 0x30, 0x90, 0x86, 0x01, 0x00, + 0x20, 0x21, 0x40, 0x0c, 0x09, 0x04, 0x36, 0x8f, 0x00, 0x76, 0xad, 0x10, + 0xac, 0x0c, 0xab, 0x24, 0xaa, 0x20, 0xa9, 0x30, 0xa8, 0x08, 0xd0, 0xb4, + 0x11, 0x20, 0x20, 0x29, 0x00, 0x00, 0x20, 0x21, 0x00, 0x00, 0x89, 0x06, + 0x80, 0x06, 0x80, 0x07, 0x90, 0xbc, 0x00, 0x3f, 0x90, 0x84, 0xff, 0xc0, + 0x90, 0x80, 0x00, 0x1b, 0x21, 0xa8, 0x27, 0xe0, 0x20, 0x98, 0x27, 0xe8, + 0x20, 0xa0, 0x00, 0x06, 0x08, 0x0c, 0x0f, 0xd6, 0x00, 0x0e, 0x08, 0x0c, + 0x4c, 0x8d, 0x00, 0x7e, 0x70, 0x1f, 0x3d, 0x34, 0x70, 0x23, 0x00, 0x01, + 0x00, 0x05, 0x08, 0x04, 0x36, 0x8d, 0x01, 0x56, 0x00, 0xc6, 0xa8, 0x14, + 0x90, 0x8a, 0x00, 0x1e, 0x02, 0x18, 0xa8, 0x33, 0x00, 0x1e, 0x00, 0x10, + 0xa8, 0x32, 0x00, 0x78, 0x81, 0xff, 0x01, 0x68, 0x00, 0x16, 0x08, 0x0c, + 0x4c, 0x41, 0x00, 0x1e, 0x01, 0x30, 0xa8, 0x00, 0x20, 0x40, 0xa0, 0x08, + 0xa8, 0x0a, 0x21, 0x00, 0x0c, 0x58, 0x90, 0x06, 0x00, 0x10, 0x90, 0x85, + 0x00, 0x01, 0x00, 0xce, 0x01, 0x5e, 0x00, 0x05, 0x00, 0x06, 0x00, 0xf6, + 0x20, 0x79, 0x00, 0x00, 0x78, 0x80, 0x90, 0x86, 0x00, 0x44, 0x00, 0xfe, + 0x00, 0x0e, 0x00, 0x05, 0x20, 0x01, 0x19, 0xa0, 0x20, 0x03, 0x00, 0x01, + 0x00, 0x05, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xc6, 0x20, 0x61, 0x02, 0x00, + 0x20, 0x01, 0x19, 0xab, 0x20, 0x04, 0x60, 0x1a, 0x20, 0x61, 0x01, 0x00, + 0x20, 0x01, 0x19, 0xaa, 0x20, 0x04, 0x60, 0xce, 0x61, 0x04, 0xc1, 0xac, + 0x61, 0x06, 0x08, 0x0c, 0x4c, 0x41, 0xa8, 0x13, 0x00, 0x19, 0xa8, 0x17, + 0x00, 0x01, 0x29, 0x00, 0xa8, 0x5a, 0x20, 0x01, 0x00, 0x2e, 0x20, 0x04, + 0xa8, 0x66, 0x20, 0x01, 0x00, 0x2f, 0x20, 0x04, 0xa8, 0x6a, 0x20, 0x61, + 0x00, 0x90, 0x20, 0x79, 0x01, 0x00, 0x20, 0x01, 0x19, 0xaa, 0x20, 0x04, + 0x60, 0x36, 0x20, 0x09, 0x00, 0x40, 0x08, 0x0c, 0x22, 0x20, 0x20, 0x01, + 0x00, 0x2a, 0x20, 0x04, 0x90, 0x84, 0xff, 0xf8, 0xa8, 0x6e, 0x60, 0x1a, + 0xa8, 0x73, 0x00, 0x00, 0x60, 0x1f, 0x00, 0x00, 0x78, 0xca, 0x90, 0x06, + 0x60, 0x0a, 0x60, 0x0e, 0x00, 0xce, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, + 0x00, 0xe6, 0x08, 0x0c, 0x4c, 0x41, 0x29, 0x40, 0xa0, 0x13, 0x00, 0x19, + 0xa0, 0x17, 0x00, 0x01, 0x28, 0x00, 0xa0, 0x5a, 0x20, 0x01, 0x00, 0x30, + 0x20, 0x04, 0xa8, 0x66, 0x20, 0x01, 0x00, 0x31, 0x20, 0x04, 0xa8, 0x6a, + 0x20, 0x01, 0x00, 0x2a, 0x20, 0x04, 0x90, 0x84, 0xff, 0xf8, 0xa8, 0x6e, + 0xa8, 0x73, 0x00, 0x00, 0x20, 0x01, 0x03, 0x2a, 0x20, 0x03, 0x00, 0x04, + 0x20, 0x01, 0x03, 0x00, 0x20, 0x03, 0x00, 0x00, 0x20, 0x01, 0x02, 0x0d, + 0x20, 0x03, 0x00, 0x00, 0x20, 0x01, 0x00, 0x04, 0x20, 0x0c, 0x91, 0x8d, + 0x00, 0x02, 0x21, 0x02, 0x00, 0xee, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x81, 0xff, 0x01, 0x48, 0x08, 0x0c, 0x2a, 0x77, 0x11, 0x30, + 0x90, 0x06, 0x08, 0x0c, 0x29, 0xca, 0x90, 0x06, 0x08, 0x0c, 0x29, 0xad, + 0x20, 0x01, 0x19, 0x9f, 0x20, 0x03, 0x00, 0x00, 0x78, 0x84, 0x90, 0x84, + 0x00, 0x07, 0x00, 0x02, 0x3e, 0xb5, 0x3e, 0xb6, 0x3e, 0xb7, 0x3e, 0xb2, + 0x3e, 0xb2, 0x3e, 0xb2, 0x3e, 0xb2, 0x3e, 0xb2, 0x01, 0x2e, 0x08, 0x04, + 0x36, 0xc2, 0x0c, 0xe0, 0x0c, 0xd8, 0x08, 0x0c, 0x77, 0x9e, 0x11, 0x28, + 0x01, 0x2e, 0x20, 0x09, 0x00, 0x16, 0x08, 0x04, 0x36, 0xbf, 0x81, 0xff, + 0x01, 0x28, 0x01, 0x2e, 0x20, 0x21, 0x40, 0x0b, 0x08, 0x04, 0x36, 0x8f, + 0x20, 0x01, 0x01, 0x41, 0x20, 0x04, 0xd0, 0xdc, 0x0d, 0xb0, 0x08, 0x0c, + 0xac, 0xfc, 0x00, 0x86, 0x00, 0x96, 0x00, 0xa6, 0x00, 0xb6, 0x00, 0xc6, + 0x00, 0xd6, 0x00, 0xe6, 0x00, 0xf6, 0x08, 0x0c, 0x3b, 0xd8, 0x20, 0x09, + 0x01, 0x01, 0x21, 0x0c, 0x00, 0x16, 0x7e, 0xc8, 0x7d, 0xcc, 0x90, 0x06, + 0x20, 0x68, 0x20, 0x60, 0x20, 0x58, 0x08, 0x0c, 0x43, 0x2a, 0x08, 0x0c, + 0x42, 0x7a, 0x90, 0x3e, 0x27, 0x20, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0x86, + 0x29, 0x40, 0x20, 0x71, 0x19, 0xe8, 0x20, 0x79, 0x00, 0x90, 0x00, 0xd6, + 0x20, 0x69, 0x00, 0x00, 0x68, 0x84, 0xd0, 0xb4, 0x01, 0x20, 0x68, 0xd4, + 0x78, 0x0e, 0x68, 0xd0, 0x78, 0x0a, 0x00, 0xde, 0x20, 0x11, 0x00, 0x01, + 0x08, 0x0c, 0x41, 0xdb, 0x08, 0x0c, 0x2a, 0x7f, 0x08, 0x0c, 0x2a, 0x7f, + 0x08, 0x0c, 0x2a, 0x7f, 0x08, 0x0c, 0x2a, 0x7f, 0x08, 0x0c, 0x41, 0xdb, + 0x00, 0x8e, 0x00, 0xee, 0x00, 0xfe, 0x08, 0x0c, 0x40, 0xfd, 0x20, 0x09, + 0x9c, 0x40, 0x81, 0x09, 0x11, 0xb0, 0x08, 0x0c, 0x40, 0x34, 0x20, 0x01, + 0x00, 0x04, 0x20, 0x0c, 0x91, 0x8c, 0xff, 0xfd, 0x21, 0x02, 0x00, 0x1e, + 0x00, 0xfe, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x00, 0xbe, 0x00, 0xae, + 0x00, 0x9e, 0x00, 0x8e, 0x20, 0x09, 0x00, 0x17, 0x08, 0x0c, 0x36, 0xbf, + 0x0c, 0xf8, 0x20, 0x01, 0x02, 0x0b, 0x20, 0x04, 0x90, 0x84, 0x01, 0x40, + 0x1d, 0x10, 0x00, 0xf6, 0x20, 0x79, 0x00, 0x00, 0x78, 0x84, 0x00, 0xfe, + 0xd0, 0xbc, 0x01, 0x78, 0x20, 0x01, 0x02, 0x01, 0x20, 0x0c, 0x81, 0xff, + 0x01, 0x50, 0x08, 0x0c, 0x40, 0xdb, 0x2d, 0x00, 0x9c, 0x05, 0x9b, 0x05, + 0x01, 0x20, 0x08, 0x0c, 0x40, 0x34, 0x08, 0x04, 0x3f, 0xdd, 0x08, 0x0c, + 0x42, 0x4f, 0x08, 0x0c, 0x41, 0x73, 0x08, 0x0c, 0x40, 0xbe, 0x08, 0x0c, + 0x40, 0xf3, 0x00, 0xf6, 0x20, 0x79, 0x01, 0x00, 0x78, 0x24, 0xd0, 0xac, + 0x01, 0x30, 0x8b, 0x58, 0x08, 0x0c, 0x40, 0x34, 0x00, 0xfe, 0x08, 0x04, + 0x3f, 0xdd, 0x00, 0xfe, 0x08, 0x0c, 0x40, 0x2a, 0x11, 0x50, 0x8d, 0x68, + 0x20, 0x01, 0x00, 0x32, 0x26, 0x02, 0x20, 0x01, 0x00, 0x33, 0x25, 0x02, + 0x08, 0x0c, 0x40, 0x34, 0x00, 0x80, 0x87, 0xff, 0x01, 0x38, 0x20, 0x01, + 0x02, 0x01, 0x20, 0x04, 0x90, 0x05, 0x19, 0x08, 0x87, 0x39, 0x00, 0x38, + 0x20, 0x01, 0x1a, 0x6e, 0x20, 0x04, 0x90, 0x86, 0x00, 0x00, 0x19, 0x04, + 0x3f, 0x2d, 0x20, 0x01, 0x03, 0x2f, 0x20, 0x03, 0x00, 0xf6, 0x86, 0x31, + 0x12, 0x08, 0x85, 0x29, 0x25, 0x00, 0x96, 0x05, 0x09, 0x04, 0x3f, 0xdd, + 0x78, 0x84, 0xd0, 0xbc, 0x01, 0x28, 0x2d, 0x00, 0x9c, 0x05, 0x9b, 0x05, + 0x19, 0x04, 0x3f, 0xdd, 0xa0, 0x13, 0x00, 0x19, 0x20, 0x01, 0x03, 0x2a, + 0x20, 0x03, 0x00, 0x04, 0x78, 0x84, 0xd0, 0xac, 0x11, 0x48, 0x20, 0x01, + 0x1a, 0x6e, 0x20, 0x03, 0x00, 0x03, 0x20, 0x01, 0x03, 0x2a, 0x20, 0x03, + 0x00, 0x09, 0x00, 0x30, 0xa0, 0x17, 0x00, 0x01, 0x78, 0xb4, 0x90, 0x05, + 0x01, 0x08, 0xa0, 0x16, 0x28, 0x00, 0xa0, 0x5a, 0x20, 0x09, 0x00, 0x40, + 0x08, 0x0c, 0x22, 0x20, 0x29, 0x00, 0xa8, 0x5a, 0xa8, 0x13, 0x00, 0x19, + 0x78, 0x84, 0xd0, 0xa4, 0x11, 0x80, 0xa8, 0x17, 0x00, 0x00, 0x00, 0xc6, + 0x20, 0xa9, 0x00, 0x04, 0x20, 0x61, 0x00, 0x90, 0x60, 0x2b, 0x00, 0x08, + 0x20, 0x01, 0x02, 0x03, 0x20, 0x04, 0x1f, 0x04, 0x3f, 0xb4, 0x00, 0xce, + 0x00, 0x30, 0xa8, 0x17, 0x00, 0x01, 0x78, 0xb0, 0x90, 0x05, 0x01, 0x08, + 0xa8, 0x16, 0x00, 0xf6, 0x00, 0xc6, 0x20, 0x79, 0x01, 0x00, 0x20, 0x61, + 0x00, 0x90, 0x78, 0x27, 0x00, 0x02, 0x20, 0x01, 0x00, 0x2a, 0x20, 0x04, + 0x90, 0x84, 0xff, 0xf8, 0x60, 0x1a, 0x00, 0x06, 0x20, 0x01, 0x00, 0x2b, + 0x20, 0x04, 0x60, 0x1e, 0x78, 0xc6, 0x00, 0x0e, 0x78, 0xca, 0x00, 0xce, + 0x00, 0xfe, 0x08, 0x04, 0x3e, 0xe7, 0x00, 0x1e, 0x00, 0xc6, 0x20, 0x01, + 0x03, 0x2a, 0x20, 0x03, 0x00, 0x04, 0x20, 0x61, 0x01, 0x00, 0x60, 0x27, + 0x00, 0x02, 0x61, 0x06, 0x20, 0x11, 0x02, 0x0d, 0x20, 0x13, 0x00, 0x20, + 0x20, 0x01, 0x00, 0x04, 0x20, 0x0c, 0x91, 0x8c, 0xff, 0xfd, 0x21, 0x02, + 0x08, 0x0c, 0x13, 0x52, 0x78, 0x84, 0x90, 0x84, 0x00, 0x03, 0x90, 0x86, + 0x00, 0x02, 0x01, 0xb0, 0x20, 0x09, 0x00, 0x28, 0x08, 0x0c, 0x22, 0x20, + 0x20, 0x01, 0x02, 0x27, 0x20, 0x0c, 0x21, 0x02, 0x60, 0x50, 0x90, 0x84, + 0xb7, 0xff, 0x08, 0x0c, 0x2b, 0x29, 0x60, 0x52, 0x60, 0x2f, 0x00, 0x00, + 0x60, 0x4b, 0xf7, 0xf7, 0x60, 0x43, 0x00, 0x90, 0x60, 0x43, 0x00, 0x10, + 0x08, 0x0c, 0xad, 0x18, 0x00, 0xce, 0x2d, 0x08, 0x2c, 0x10, 0x2b, 0x18, + 0x2b, 0x00, 0x9c, 0x05, 0x9d, 0x05, 0x00, 0xfe, 0x00, 0xee, 0x00, 0xde, + 0x00, 0xce, 0x00, 0xbe, 0x00, 0xae, 0x00, 0x9e, 0x00, 0x8e, 0x11, 0x18, + 0x01, 0x2e, 0x08, 0x04, 0x36, 0x8d, 0x01, 0x2e, 0x20, 0x21, 0x40, 0x0c, + 0x08, 0x04, 0x36, 0x8f, 0x90, 0x85, 0x00, 0x01, 0x1d, 0x04, 0x40, 0x33, + 0x20, 0x91, 0x60, 0x00, 0x84, 0x20, 0x94, 0x86, 0x00, 0x64, 0x00, 0x05, + 0x20, 0x01, 0x01, 0x05, 0x20, 0x03, 0x00, 0x10, 0x20, 0x01, 0x03, 0x2a, + 0x20, 0x03, 0x00, 0x04, 0x20, 0x01, 0x1a, 0x6e, 0x20, 0x03, 0x00, 0x00, + 0x00, 0x71, 0x20, 0x09, 0x00, 0x48, 0x08, 0x0c, 0x22, 0x20, 0x20, 0x01, + 0x02, 0x27, 0x20, 0x24, 0x24, 0x02, 0x20, 0x01, 0x01, 0x09, 0x20, 0x03, + 0x40, 0x00, 0x90, 0x26, 0x00, 0x05, 0x00, 0xf6, 0x00, 0xe6, 0x20, 0x71, + 0x19, 0xe8, 0x70, 0x54, 0x90, 0x86, 0x00, 0x00, 0x05, 0x20, 0x20, 0x79, + 0x00, 0x90, 0x20, 0x09, 0x02, 0x06, 0x21, 0x04, 0x20, 0x09, 0x02, 0x03, + 0x21, 0x0c, 0x91, 0x06, 0x11, 0x20, 0x20, 0x09, 0x00, 0x40, 0x08, 0x0c, + 0x22, 0x20, 0x78, 0x2c, 0xd0, 0xfc, 0x0d, 0x88, 0x08, 0x0c, 0x42, 0x4f, + 0x70, 0x54, 0x90, 0x86, 0x00, 0x00, 0x1d, 0x58, 0x78, 0x2b, 0x00, 0x04, + 0x78, 0x2c, 0xd0, 0xac, 0x1d, 0xe8, 0x20, 0x09, 0x00, 0x40, 0x08, 0x0c, + 0x22, 0x20, 0x78, 0x2b, 0x00, 0x02, 0x70, 0x57, 0x00, 0x00, 0x00, 0xee, + 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, 0x20, 0x79, 0x01, 0x00, 0x20, 0x01, + 0x18, 0x18, 0x20, 0x0c, 0x79, 0x32, 0x79, 0x36, 0x08, 0x0c, 0x26, 0xd5, + 0x08, 0x0c, 0x2a, 0xf6, 0x08, 0x0c, 0x2b, 0x29, 0x78, 0x4b, 0xf7, 0xf7, + 0x78, 0x43, 0x00, 0x90, 0x78, 0x43, 0x00, 0x10, 0x78, 0x50, 0xc0, 0xe5, + 0x78, 0x52, 0x20, 0x19, 0x61, 0xa8, 0x78, 0x20, 0xd0, 0x9c, 0x01, 0x10, + 0x83, 0x19, 0x1d, 0xd8, 0x78, 0x50, 0xc0, 0xe4, 0x78, 0x52, 0x20, 0x11, + 0x00, 0x48, 0x08, 0x0c, 0x2a, 0xd3, 0x78, 0x43, 0x00, 0x40, 0x20, 0x19, + 0x01, 0xf4, 0xa0, 0x01, 0xa0, 0x01, 0x83, 0x19, 0x1d, 0xe0, 0x20, 0x01, + 0x01, 0x00, 0x08, 0x0c, 0x2a, 0x99, 0x20, 0x11, 0x00, 0x20, 0x08, 0x0c, + 0x2a, 0xd3, 0x78, 0x43, 0x00, 0x00, 0x90, 0x06, 0x08, 0x0c, 0x2a, 0x99, + 0x20, 0x11, 0x00, 0x48, 0x08, 0x0c, 0x2a, 0xd3, 0x00, 0xfe, 0x00, 0x05, + 0x78, 0x84, 0xd0, 0xac, 0x11, 0xc8, 0x00, 0xf6, 0x00, 0xe6, 0x20, 0x71, + 0x1a, 0x6e, 0x20, 0x79, 0x03, 0x20, 0x20, 0x01, 0x02, 0x01, 0x20, 0x04, + 0x90, 0x05, 0x01, 0x60, 0x70, 0x00, 0x90, 0x86, 0x00, 0x00, 0x11, 0x40, + 0x00, 0x51, 0xd0, 0xbc, 0x01, 0x08, 0x87, 0x38, 0x70, 0x03, 0x00, 0x03, + 0x78, 0x2b, 0x00, 0x19, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, + 0x20, 0x79, 0x03, 0x00, 0x78, 0xbc, 0x00, 0xfe, 0x90, 0x8c, 0x00, 0x70, + 0x01, 0x78, 0x20, 0x09, 0x00, 0x32, 0x26, 0x0a, 0x20, 0x09, 0x00, 0x33, + 0x25, 0x0a, 0xd0, 0xb4, 0x01, 0x08, 0x8c, 0x60, 0xd0, 0xac, 0x01, 0x08, + 0x8d, 0x68, 0xd0, 0xa4, 0x01, 0x08, 0x8b, 0x58, 0x00, 0x05, 0x00, 0xf6, + 0x20, 0x79, 0x02, 0x00, 0x78, 0x1c, 0xd0, 0x84, 0x01, 0x10, 0x78, 0x37, + 0x00, 0x50, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0x01, 0x00, + 0x20, 0x01, 0x19, 0xab, 0x20, 0x04, 0x70, 0xe2, 0x08, 0x0c, 0x3e, 0x16, + 0x11, 0x88, 0x20, 0x01, 0x18, 0x20, 0x20, 0x04, 0x20, 0x09, 0x18, 0x1f, + 0x21, 0x0c, 0x91, 0x8c, 0x00, 0xff, 0x70, 0x6e, 0x71, 0x6a, 0x70, 0x66, + 0x91, 0x8d, 0x32, 0x00, 0x71, 0x62, 0x70, 0x73, 0xe1, 0x09, 0x00, 0x80, + 0x70, 0x2c, 0x90, 0x85, 0x00, 0x02, 0x70, 0x2e, 0x20, 0x09, 0x18, 0x18, + 0x21, 0x0c, 0x71, 0x6e, 0x70, 0x63, 0x01, 0x00, 0x71, 0x66, 0x71, 0x9e, + 0x70, 0x6b, 0x00, 0x00, 0x70, 0x73, 0x08, 0x09, 0x70, 0x77, 0x00, 0x08, + 0x70, 0x78, 0x90, 0x80, 0x01, 0x00, 0x70, 0x7a, 0x70, 0x80, 0x80, 0x00, + 0x70, 0x82, 0x70, 0x87, 0xaa, 0xaa, 0x90, 0x06, 0x70, 0x8a, 0x70, 0x8e, + 0x70, 0x7e, 0x70, 0xd6, 0x70, 0xab, 0x00, 0x36, 0x70, 0xaf, 0x95, 0xd5, + 0x70, 0x14, 0x90, 0x84, 0x19, 0x84, 0x90, 0x85, 0x00, 0x92, 0x70, 0x16, + 0x08, 0x0c, 0x42, 0x4f, 0x00, 0xf6, 0x20, 0x71, 0x1a, 0x6e, 0x20, 0x79, + 0x03, 0x20, 0x00, 0xd6, 0x20, 0x69, 0x00, 0x00, 0x68, 0x84, 0xd0, 0xb4, + 0x01, 0x20, 0x68, 0x9c, 0x78, 0x0e, 0x68, 0x98, 0x78, 0x0a, 0x00, 0xde, + 0x08, 0x0c, 0x3e, 0x16, 0x01, 0x40, 0x20, 0x01, 0x19, 0x9f, 0x20, 0x0c, + 0x20, 0x03, 0x00, 0x01, 0x91, 0x8e, 0x00, 0x01, 0x01, 0x20, 0x20, 0x09, + 0x03, 0xe8, 0x81, 0x09, 0x1d, 0xf0, 0x79, 0x2c, 0xd1, 0xfc, 0x01, 0x10, + 0x78, 0x2b, 0x00, 0x04, 0x20, 0x11, 0x00, 0x11, 0x08, 0x0c, 0x41, 0xdb, + 0x20, 0x11, 0x00, 0x01, 0x08, 0x0c, 0x41, 0xdb, 0x00, 0xfe, 0x00, 0xee, + 0x00, 0x05, 0x00, 0xf6, 0x00, 0xe6, 0x20, 0x71, 0x1a, 0x6e, 0x20, 0x79, + 0x03, 0x20, 0x79, 0x2c, 0xd1, 0xfc, 0x09, 0x04, 0x41, 0xd8, 0x78, 0x2b, + 0x00, 0x02, 0x90, 0x26, 0xd1, 0x9c, 0x19, 0x04, 0x41, 0xd4, 0x70, 0x00, + 0x00, 0x02, 0x41, 0xd8, 0x41, 0x89, 0x41, 0xb9, 0x41, 0xd4, 0xd1, 0xbc, + 0x11, 0x70, 0xd1, 0xdc, 0x11, 0x90, 0x80, 0x01, 0x70, 0x02, 0x20, 0x11, + 0x00, 0x01, 0x08, 0x0c, 0x41, 0xdb, 0x09, 0x04, 0x41, 0xd8, 0x08, 0x0c, + 0x41, 0xdb, 0x08, 0x04, 0x41, 0xd8, 0x00, 0xf6, 0x20, 0x79, 0x03, 0x00, + 0x78, 0xbf, 0x00, 0x00, 0x00, 0xfe, 0x78, 0x10, 0x79, 0x14, 0x78, 0x2b, + 0x00, 0x04, 0x78, 0x12, 0x79, 0x16, 0x20, 0x01, 0x02, 0x01, 0x20, 0x0c, + 0x81, 0xff, 0x0d, 0xe8, 0x08, 0x0c, 0x40, 0xdb, 0x20, 0x09, 0x00, 0x01, + 0x00, 0xf6, 0x20, 0x79, 0x03, 0x00, 0x78, 0xb8, 0x00, 0xfe, 0xd0, 0xec, + 0x01, 0x10, 0x20, 0x09, 0x00, 0x11, 0x79, 0x2a, 0x00, 0xf8, 0x80, 0x01, + 0x70, 0x02, 0x91, 0x84, 0x08, 0x80, 0x11, 0x40, 0x78, 0x2c, 0xd0, 0xfc, + 0x19, 0x04, 0x41, 0x7d, 0x20, 0x11, 0x00, 0x01, 0x00, 0xb1, 0x00, 0x90, + 0xa0, 0x10, 0x90, 0x92, 0x00, 0x04, 0x90, 0x86, 0x00, 0x15, 0x11, 0x20, + 0xa0, 0x00, 0xa0, 0x5a, 0x20, 0x11, 0x00, 0x31, 0xa2, 0x12, 0xd1, 0xdc, + 0x19, 0x60, 0x08, 0x28, 0x78, 0x2b, 0x00, 0x04, 0x70, 0x03, 0x00, 0x00, + 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, 0xa0, 0x14, 0x90, 0x05, 0x05, 0x50, + 0x80, 0x01, 0x00, 0x36, 0x00, 0x96, 0xa0, 0x16, 0xa0, 0x58, 0x20, 0x48, + 0xa0, 0x10, 0x20, 0x09, 0x00, 0x31, 0x91, 0x1a, 0x83, 0x1c, 0x83, 0x1c, + 0x93, 0x8a, 0x00, 0x07, 0x1a, 0x0c, 0x0d, 0x85, 0x93, 0x98, 0x42, 0x09, + 0x23, 0x1d, 0x08, 0x3f, 0x90, 0x80, 0x00, 0x04, 0x7a, 0x2a, 0x71, 0x00, + 0x81, 0x08, 0x71, 0x02, 0x00, 0x9e, 0x00, 0x3e, 0x90, 0x8a, 0x00, 0x35, + 0x11, 0x40, 0x00, 0x96, 0xa0, 0x58, 0x20, 0x48, 0xa8, 0x04, 0xa0, 0x5a, + 0x20, 0x01, 0x00, 0x19, 0x00, 0x9e, 0xa0, 0x12, 0x90, 0x85, 0x00, 0x01, + 0x00, 0x05, 0x42, 0x46, 0x42, 0x3d, 0x42, 0x34, 0x42, 0x2b, 0x42, 0x22, + 0x42, 0x19, 0x42, 0x10, 0xa9, 0x64, 0x79, 0x02, 0xa9, 0x68, 0x79, 0x06, + 0xa9, 0x6c, 0x79, 0x12, 0xa9, 0x70, 0x79, 0x16, 0x00, 0x05, 0xa9, 0x74, + 0x79, 0x02, 0xa9, 0x78, 0x79, 0x06, 0xa9, 0x7c, 0x79, 0x12, 0xa9, 0x80, + 0x79, 0x16, 0x00, 0x05, 0xa9, 0x84, 0x79, 0x02, 0xa9, 0x88, 0x79, 0x06, + 0xa9, 0x8c, 0x79, 0x12, 0xa9, 0x90, 0x79, 0x16, 0x00, 0x05, 0xa9, 0x94, + 0x79, 0x02, 0xa9, 0x98, 0x79, 0x06, 0xa9, 0x9c, 0x79, 0x12, 0xa9, 0xa0, + 0x79, 0x16, 0x00, 0x05, 0xa9, 0xa4, 0x79, 0x02, 0xa9, 0xa8, 0x79, 0x06, + 0xa9, 0xac, 0x79, 0x12, 0xa9, 0xb0, 0x79, 0x16, 0x00, 0x05, 0xa9, 0xb4, + 0x79, 0x02, 0xa9, 0xb8, 0x79, 0x06, 0xa9, 0xbc, 0x79, 0x12, 0xa9, 0xc0, + 0x79, 0x16, 0x00, 0x05, 0xa9, 0xc4, 0x79, 0x02, 0xa9, 0xc8, 0x79, 0x06, + 0xa9, 0xcc, 0x79, 0x12, 0xa9, 0xd0, 0x79, 0x16, 0x00, 0x05, 0x00, 0xf6, + 0x00, 0xe6, 0x00, 0x86, 0x20, 0x71, 0x19, 0xe8, 0x20, 0x79, 0x00, 0x90, + 0x79, 0x2c, 0xd1, 0xfc, 0x01, 0xe8, 0x78, 0x2b, 0x00, 0x02, 0x29, 0x40, + 0x90, 0x26, 0x70, 0x54, 0x00, 0x02, 0x42, 0x76, 0x42, 0x62, 0x42, 0x6d, + 0x80, 0x01, 0x70, 0x56, 0xd1, 0x9c, 0x11, 0x80, 0x20, 0x11, 0x00, 0x01, + 0x08, 0x0c, 0x41, 0xdb, 0x19, 0x0c, 0x41, 0xdb, 0x00, 0x48, 0x80, 0x01, + 0x70, 0x56, 0x78, 0x2c, 0xd0, 0xfc, 0x1d, 0x38, 0x20, 0x11, 0x00, 0x01, + 0x08, 0x0c, 0x41, 0xdb, 0x00, 0x8e, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, + 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xc6, 0x00, 0x86, 0x20, 0x61, 0x02, 0x00, + 0x20, 0x01, 0x19, 0xab, 0x20, 0x04, 0x60, 0x1a, 0x20, 0x61, 0x01, 0x00, + 0x20, 0x01, 0x19, 0xaa, 0x20, 0x04, 0x60, 0xce, 0x61, 0x04, 0xc1, 0xac, + 0x61, 0x06, 0x20, 0x01, 0x00, 0x2c, 0x20, 0x04, 0x90, 0x05, 0x05, 0x20, + 0x20, 0x38, 0x20, 0x01, 0x00, 0x2e, 0x20, 0x24, 0x20, 0x01, 0x00, 0x2f, + 0x20, 0x1c, 0x08, 0x0c, 0x4c, 0x41, 0xa8, 0x13, 0x00, 0x19, 0xaf, 0x16, + 0x29, 0x00, 0xa8, 0x5a, 0x97, 0x8a, 0x00, 0x07, 0x02, 0x20, 0x21, 0x38, + 0x20, 0x09, 0x00, 0x07, 0x00, 0x10, 0x27, 0x08, 0x90, 0x3e, 0x00, 0x96, + 0xa8, 0x58, 0x20, 0x48, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x19, 0x00, 0x9e, + 0x08, 0x0c, 0x42, 0xf2, 0x1d, 0x68, 0x29, 0x00, 0xa8, 0x5a, 0x00, 0xd0, + 0x08, 0x0c, 0x4c, 0x41, 0xa8, 0x13, 0x00, 0x19, 0xa8, 0x17, 0x00, 0x01, + 0x29, 0x00, 0xa8, 0x5a, 0x20, 0x01, 0x00, 0x2e, 0x20, 0x04, 0xa8, 0x66, + 0x20, 0x01, 0x00, 0x2f, 0x20, 0x04, 0xa8, 0x6a, 0x20, 0x01, 0x00, 0x2a, + 0x20, 0x04, 0x90, 0x84, 0xff, 0xf8, 0xa8, 0x6e, 0x20, 0x01, 0x00, 0x2b, + 0x20, 0x04, 0xa8, 0x72, 0x20, 0x61, 0x00, 0x90, 0x20, 0x79, 0x01, 0x00, + 0x20, 0x01, 0x19, 0xaa, 0x20, 0x04, 0x60, 0x36, 0x20, 0x09, 0x00, 0x40, + 0x08, 0x0c, 0x22, 0x20, 0x20, 0x01, 0x00, 0x2a, 0x20, 0x04, 0x90, 0x84, + 0xff, 0xf8, 0x60, 0x1a, 0x00, 0x06, 0x20, 0x01, 0x00, 0x2b, 0x20, 0x04, + 0x60, 0x1e, 0x78, 0xc6, 0x00, 0x0e, 0x78, 0xca, 0x90, 0x06, 0x60, 0x0a, + 0x60, 0x0e, 0x00, 0x8e, 0x00, 0xce, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, + 0x00, 0xe6, 0x20, 0x71, 0x00, 0x80, 0xaa, 0x60, 0x22, 0xe8, 0x20, 0xa0, + 0x20, 0xe1, 0x00, 0x00, 0x20, 0x99, 0x00, 0x88, 0x70, 0x2b, 0x00, 0x26, + 0x74, 0x02, 0x73, 0x06, 0x90, 0x06, 0x70, 0x0a, 0x70, 0x0e, 0x81, 0x0b, + 0x81, 0x0b, 0x21, 0xa8, 0x81, 0x0b, 0x71, 0x12, 0x70, 0x2b, 0x00, 0x41, + 0x70, 0x2c, 0xd0, 0xfc, 0x0d, 0xe8, 0x70, 0x2b, 0x00, 0x02, 0x70, 0x2b, + 0x00, 0x40, 0x40, 0x05, 0x74, 0x00, 0x73, 0x04, 0x87, 0xff, 0x01, 0x90, + 0x00, 0x86, 0x00, 0x96, 0x29, 0x40, 0x00, 0x86, 0x08, 0x0c, 0x4c, 0x41, + 0x00, 0x8e, 0xa0, 0x58, 0x00, 0xa6, 0x20, 0x50, 0x29, 0x00, 0xb0, 0x06, + 0xa0, 0x5a, 0x00, 0xae, 0x00, 0x9e, 0x00, 0x8e, 0x90, 0x85, 0x00, 0x01, + 0x00, 0xee, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x01, 0x00, 0x2d, 0x20, 0x04, + 0x90, 0x05, 0x05, 0x28, 0x20, 0x38, 0x20, 0x01, 0x00, 0x30, 0x20, 0x24, + 0x20, 0x01, 0x00, 0x31, 0x20, 0x1c, 0x08, 0x0c, 0x4c, 0x41, 0x29, 0x40, + 0xa8, 0x13, 0x00, 0x19, 0xaf, 0x16, 0x29, 0x00, 0xa8, 0x5a, 0x97, 0x8a, + 0x00, 0x07, 0x02, 0x20, 0x21, 0x38, 0x20, 0x09, 0x00, 0x07, 0x00, 0x10, + 0x27, 0x08, 0x90, 0x3e, 0x00, 0x96, 0xa8, 0x58, 0x20, 0x48, 0xa8, 0x5c, + 0x90, 0x80, 0x00, 0x19, 0x00, 0x9e, 0x08, 0x0c, 0x42, 0xf2, 0x1d, 0x68, + 0x29, 0x00, 0xa8, 0x5a, 0x00, 0xd8, 0x08, 0x0c, 0x4c, 0x41, 0x29, 0x40, + 0xa0, 0x13, 0x00, 0x19, 0xa0, 0x17, 0x00, 0x01, 0x28, 0x00, 0xa0, 0x5a, + 0x20, 0x01, 0x00, 0x30, 0x20, 0x04, 0xa0, 0x66, 0x20, 0x01, 0x00, 0x31, + 0x20, 0x04, 0xa0, 0x6a, 0x20, 0x01, 0x00, 0x2a, 0x20, 0x04, 0x90, 0x84, + 0xff, 0xf8, 0xa0, 0x6e, 0x20, 0x01, 0x00, 0x2b, 0x20, 0x04, 0xa0, 0x72, + 0x20, 0x01, 0x03, 0x2a, 0x20, 0x03, 0x00, 0x04, 0x78, 0x84, 0xd0, 0xac, + 0x11, 0x80, 0x20, 0x01, 0x01, 0x01, 0x20, 0x0c, 0x91, 0x8d, 0x02, 0x00, + 0x21, 0x02, 0xa0, 0x17, 0x00, 0x00, 0x20, 0x01, 0x1a, 0x6e, 0x20, 0x03, + 0x00, 0x03, 0x20, 0x01, 0x03, 0x2a, 0x20, 0x03, 0x00, 0x09, 0x20, 0x01, + 0x03, 0x00, 0x20, 0x03, 0x00, 0x00, 0x20, 0x01, 0x02, 0x0d, 0x20, 0x03, + 0x00, 0x00, 0x20, 0x01, 0x00, 0x04, 0x20, 0x0c, 0x91, 0x8d, 0x00, 0x02, + 0x21, 0x02, 0x00, 0xee, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0xa9, 0x00, 0x07, 0x20, 0xa1, 0x18, 0x40, 0x20, 0xe9, 0x00, 0x01, + 0x90, 0x06, 0x40, 0x04, 0x20, 0xa9, 0x00, 0x14, 0x20, 0xa1, 0xff, 0xec, + 0x20, 0xe9, 0x00, 0x00, 0x90, 0x06, 0x40, 0x04, 0x20, 0x09, 0x01, 0x3c, + 0x20, 0x0a, 0x01, 0x2e, 0x78, 0x80, 0x90, 0x86, 0x00, 0x52, 0x01, 0x08, + 0x00, 0x05, 0x08, 0x04, 0x36, 0x8d, 0x7d, 0x98, 0x7c, 0x9c, 0x08, 0x04, + 0x37, 0x91, 0x08, 0x0c, 0x77, 0x9e, 0x19, 0x0c, 0x61, 0x62, 0x60, 0x40, + 0x90, 0x84, 0x00, 0x20, 0x09, 0xb1, 0x20, 0x69, 0x18, 0x47, 0x2d, 0x00, + 0x20, 0x09, 0x00, 0x30, 0x7a, 0x8c, 0x7b, 0x88, 0x7c, 0x9c, 0x7d, 0x98, + 0x20, 0x39, 0x00, 0x01, 0x08, 0x0c, 0x4c, 0x8a, 0x70, 0x1f, 0x43, 0xd1, + 0x00, 0x05, 0x08, 0x0c, 0x58, 0x4f, 0x11, 0x30, 0x3b, 0x00, 0x3a, 0x08, + 0xc1, 0x94, 0xc0, 0x95, 0x20, 0xd8, 0x21, 0xd0, 0x20, 0x69, 0x18, 0x47, + 0x68, 0x00, 0x90, 0x05, 0x09, 0x04, 0x36, 0xc2, 0x20, 0x01, 0x18, 0x0d, + 0x20, 0x04, 0xd0, 0x8c, 0x68, 0x04, 0x01, 0x18, 0xc0, 0xa4, 0xc0, 0xac, + 0x68, 0x06, 0xd0, 0xac, 0x01, 0x18, 0xd0, 0xa4, 0x09, 0x04, 0x36, 0xc2, + 0xd0, 0x94, 0x00, 0xc6, 0x20, 0x61, 0x01, 0x00, 0x61, 0x04, 0x01, 0x38, + 0x62, 0x00, 0x92, 0x92, 0x00, 0x05, 0x02, 0x18, 0x91, 0x8c, 0xff, 0xdf, + 0x00, 0x10, 0x91, 0x8d, 0x00, 0x20, 0x61, 0x06, 0x00, 0xce, 0xd0, 0x8c, + 0x00, 0xc6, 0x20, 0x61, 0x01, 0x00, 0x61, 0x04, 0x01, 0x18, 0x91, 0x8d, + 0x00, 0x10, 0x00, 0x10, 0x91, 0x8c, 0xff, 0xef, 0x61, 0x06, 0x00, 0xce, + 0xd0, 0x84, 0x01, 0x58, 0x6a, 0x28, 0x92, 0x8a, 0x00, 0x7f, 0x1a, 0x04, + 0x36, 0xc2, 0x92, 0x88, 0x34, 0x8e, 0x21, 0x0d, 0x91, 0x8c, 0x00, 0xff, + 0x61, 0x66, 0xd0, 0xdc, 0x01, 0x30, 0x68, 0x28, 0x90, 0x8a, 0x00, 0x7f, + 0x1a, 0x04, 0x36, 0xc2, 0x60, 0x5e, 0x68, 0x88, 0x90, 0x84, 0x00, 0x30, + 0x80, 0x04, 0x80, 0x04, 0x80, 0x04, 0x80, 0x04, 0x00, 0x06, 0x20, 0x09, + 0x19, 0xb2, 0x90, 0x80, 0x27, 0xd0, 0x20, 0x05, 0x20, 0x0a, 0x20, 0x08, + 0x20, 0x01, 0x00, 0x18, 0x08, 0x0c, 0xac, 0xed, 0x20, 0x09, 0x03, 0x90, + 0x20, 0x0b, 0x04, 0x00, 0x00, 0x0e, 0x20, 0x09, 0x19, 0xb3, 0x90, 0x80, + 0x27, 0xd4, 0x20, 0x05, 0x20, 0x0a, 0x68, 0x08, 0x90, 0x8a, 0x01, 0x00, + 0x0a, 0x04, 0x36, 0xc2, 0x90, 0x8a, 0x08, 0x41, 0x1a, 0x04, 0x36, 0xc2, + 0x90, 0x84, 0x00, 0x07, 0x19, 0x04, 0x36, 0xc2, 0x68, 0x0c, 0x90, 0x05, + 0x09, 0x04, 0x36, 0xc2, 0x68, 0x10, 0x90, 0x05, 0x09, 0x04, 0x36, 0xc2, + 0x68, 0x48, 0x69, 0x40, 0x91, 0x0a, 0x1a, 0x04, 0x36, 0xc2, 0x80, 0x01, + 0x09, 0x04, 0x36, 0xc2, 0x68, 0x4c, 0x69, 0x44, 0x91, 0x0a, 0x1a, 0x04, + 0x36, 0xc2, 0x80, 0x01, 0x09, 0x04, 0x36, 0xc2, 0x68, 0x14, 0x90, 0x8c, + 0x00, 0xff, 0x61, 0x4e, 0x80, 0x07, 0x90, 0x84, 0x00, 0xff, 0x60, 0x52, + 0x08, 0x0c, 0x7a, 0xe7, 0x08, 0x0c, 0x6c, 0xfc, 0x08, 0x0c, 0x6d, 0x66, + 0x68, 0x08, 0x60, 0x2a, 0x08, 0x0c, 0x21, 0x92, 0x20, 0x09, 0x01, 0x70, + 0x20, 0x0b, 0x00, 0x80, 0xa0, 0x01, 0xa0, 0x01, 0x20, 0x0b, 0x00, 0x00, + 0x00, 0x36, 0x6b, 0x08, 0x08, 0x0c, 0x27, 0x2f, 0x00, 0x3e, 0x60, 0x00, + 0x90, 0x86, 0x00, 0x00, 0x19, 0x04, 0x45, 0x6d, 0x68, 0x18, 0x69, 0x1c, + 0x6a, 0x20, 0x6b, 0x24, 0x80, 0x07, 0x81, 0x0f, 0x82, 0x17, 0x83, 0x1f, + 0x60, 0x16, 0x61, 0x1a, 0x62, 0x1e, 0x63, 0x22, 0x6c, 0x04, 0xd4, 0xf4, + 0x01, 0x48, 0x68, 0x30, 0x69, 0x34, 0x6a, 0x38, 0x6b, 0x3c, 0x80, 0x07, + 0x81, 0x0f, 0x82, 0x17, 0x83, 0x1f, 0x00, 0x10, 0x90, 0x84, 0xf0, 0xff, + 0x60, 0x06, 0x61, 0x0a, 0x62, 0x0e, 0x63, 0x12, 0x80, 0x07, 0x81, 0x0f, + 0x82, 0x17, 0x83, 0x1f, 0x20, 0xa9, 0x00, 0x04, 0x20, 0xa1, 0x19, 0xb4, + 0x20, 0xe9, 0x00, 0x01, 0x40, 0x01, 0x20, 0xa9, 0x00, 0x04, 0x20, 0xa1, + 0x19, 0xce, 0x20, 0xe9, 0x00, 0x01, 0x40, 0x01, 0x08, 0x0c, 0x8b, 0x26, + 0x00, 0xc6, 0x90, 0x0e, 0x20, 0xa9, 0x00, 0x01, 0x6b, 0x70, 0xd3, 0x84, + 0x01, 0xc8, 0x00, 0x20, 0x83, 0x9d, 0x12, 0xb0, 0x35, 0x08, 0x81, 0x09, + 0x08, 0x0c, 0x80, 0xfe, 0x68, 0x78, 0x60, 0x16, 0x68, 0x74, 0x20, 0x08, + 0x90, 0x84, 0xff, 0x00, 0x80, 0x07, 0x60, 0x0a, 0x91, 0x84, 0x00, 0xff, + 0x60, 0x06, 0x81, 0x08, 0x11, 0x18, 0x60, 0x03, 0x00, 0x03, 0x00, 0x10, + 0x60, 0x03, 0x00, 0x01, 0x1f, 0x04, 0x44, 0xc2, 0x00, 0xce, 0x00, 0xc6, + 0x20, 0x61, 0x19, 0x9c, 0x20, 0x01, 0x18, 0x0d, 0x20, 0x04, 0xd0, 0x8c, + 0x11, 0xa8, 0x6a, 0x88, 0x92, 0x84, 0xc0, 0x00, 0x20, 0x10, 0x92, 0x86, + 0x00, 0x00, 0x11, 0x58, 0x20, 0x63, 0x00, 0x00, 0x20, 0x01, 0x00, 0x01, + 0x08, 0x0c, 0x29, 0xca, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x29, 0xad, + 0x00, 0x88, 0x92, 0x86, 0x40, 0x00, 0x11, 0x48, 0x20, 0x63, 0x00, 0x01, + 0x90, 0x06, 0x08, 0x0c, 0x29, 0xca, 0x90, 0x06, 0x08, 0x0c, 0x29, 0xad, + 0x00, 0x28, 0x92, 0x86, 0x80, 0x00, 0x1d, 0x30, 0x20, 0x63, 0x00, 0x02, + 0x00, 0xce, 0x00, 0xe6, 0x2c, 0x70, 0x08, 0x0c, 0x0e, 0xd3, 0x00, 0xee, + 0x08, 0x0c, 0x2a, 0xf6, 0x08, 0x0c, 0x2b, 0x29, 0x68, 0x88, 0xd0, 0xec, + 0x01, 0x30, 0x20, 0x11, 0x01, 0x14, 0x22, 0x04, 0x90, 0x85, 0x01, 0x80, + 0x20, 0x12, 0x6a, 0x80, 0x92, 0x84, 0x00, 0x30, 0x90, 0x86, 0x00, 0x30, + 0x11, 0x28, 0x92, 0x94, 0xff, 0xcf, 0x92, 0x95, 0x00, 0x20, 0x6a, 0x82, + 0x20, 0x01, 0x19, 0x7c, 0x6a, 0x80, 0x92, 0x94, 0x00, 0x30, 0x92, 0x8e, + 0x00, 0x00, 0x01, 0x70, 0x92, 0x8e, 0x00, 0x10, 0x01, 0x18, 0x92, 0x8e, + 0x00, 0x20, 0x01, 0x40, 0x20, 0x03, 0xaa, 0xaa, 0x08, 0x0c, 0x27, 0xa4, + 0x20, 0x01, 0x19, 0x6d, 0x21, 0x02, 0x00, 0x08, 0x21, 0x02, 0x00, 0xc6, + 0x20, 0x61, 0x01, 0x00, 0x60, 0x2f, 0x00, 0x40, 0x60, 0x2f, 0x00, 0x00, + 0x00, 0xce, 0x08, 0x0c, 0x77, 0x9e, 0x01, 0x28, 0x08, 0x0c, 0x51, 0x28, + 0x01, 0x10, 0x08, 0x0c, 0x26, 0xf5, 0x60, 0xd4, 0x90, 0x05, 0x01, 0xc0, + 0x60, 0x03, 0x00, 0x01, 0x20, 0x09, 0x45, 0x55, 0x00, 0xe0, 0x08, 0x0c, + 0x77, 0x9e, 0x11, 0x68, 0x20, 0x11, 0x76, 0x12, 0x08, 0x0c, 0x89, 0x93, + 0x20, 0x11, 0x76, 0x05, 0x08, 0x0c, 0x8a, 0x9f, 0x08, 0x0c, 0x7a, 0xbb, + 0x08, 0x0c, 0x76, 0xcd, 0x00, 0x40, 0x08, 0x0c, 0x60, 0x58, 0x00, 0x28, + 0x60, 0x03, 0x00, 0x04, 0x20, 0x09, 0x45, 0x6d, 0x00, 0x20, 0x08, 0x0c, + 0x6b, 0x73, 0x08, 0x04, 0x36, 0x8d, 0x20, 0x01, 0x01, 0x70, 0x20, 0x04, + 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x4c, 0x11, 0x18, 0x20, 0x91, + 0x31, 0xbd, 0x08, 0x17, 0x20, 0x91, 0x31, 0x3d, 0x08, 0x17, 0x60, 0x00, + 0x90, 0x86, 0x00, 0x00, 0x09, 0x04, 0x36, 0xbf, 0x20, 0x69, 0x18, 0x47, + 0x78, 0x90, 0x68, 0x42, 0x78, 0x94, 0x68, 0x46, 0x2d, 0x00, 0x20, 0x09, + 0x00, 0x30, 0x7a, 0x8c, 0x7b, 0x88, 0x7c, 0x9c, 0x7d, 0x98, 0x20, 0x39, + 0x00, 0x01, 0x08, 0x04, 0x4c, 0x8d, 0x90, 0x06, 0x08, 0x0c, 0x26, 0xf5, + 0x81, 0xff, 0x19, 0x04, 0x36, 0xbf, 0x08, 0x0c, 0x77, 0x9e, 0x11, 0xb0, + 0x08, 0x0c, 0x7a, 0xb6, 0x08, 0x0c, 0x61, 0x9d, 0x08, 0x0c, 0x34, 0x82, + 0x01, 0x18, 0x61, 0x30, 0xc1, 0x8d, 0x61, 0x32, 0x08, 0x0c, 0xd6, 0x45, + 0x01, 0x30, 0x08, 0x0c, 0x77, 0xc1, 0x11, 0x18, 0x08, 0x0c, 0x77, 0x72, + 0x00, 0x38, 0x08, 0x0c, 0x76, 0xcd, 0x00, 0x20, 0x08, 0x0c, 0x61, 0x62, + 0x08, 0x0c, 0x60, 0x58, 0x08, 0x04, 0x36, 0x8d, 0x81, 0xff, 0x19, 0x04, + 0x36, 0xbf, 0x08, 0x0c, 0x77, 0x9e, 0x11, 0x10, 0x08, 0x04, 0x36, 0xbf, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x61, 0x94, 0x81, 0xff, 0x01, 0x90, + 0x70, 0x4f, 0x00, 0x00, 0x20, 0x01, 0x1d, 0x80, 0x20, 0x09, 0x00, 0x40, + 0x7a, 0x8c, 0x7b, 0x88, 0x7c, 0x9c, 0x7d, 0x98, 0x20, 0x39, 0x00, 0x01, + 0x08, 0x0c, 0x4c, 0x8d, 0x70, 0x1f, 0x36, 0x8b, 0x01, 0x2e, 0x00, 0x05, + 0x70, 0x4f, 0x00, 0x01, 0x00, 0xd6, 0x20, 0x69, 0x1d, 0x80, 0x20, 0xa9, + 0x00, 0x40, 0x20, 0xe9, 0x00, 0x01, 0x20, 0xa1, 0x1d, 0x80, 0x20, 0x19, + 0xff, 0xff, 0x43, 0x04, 0x65, 0x5c, 0x95, 0x88, 0x34, 0x8e, 0x21, 0x0d, + 0x91, 0x8c, 0x00, 0xff, 0x21, 0x6a, 0x90, 0x0e, 0x20, 0x11, 0x00, 0x02, + 0x21, 0x00, 0x95, 0x06, 0x01, 0xa8, 0x08, 0x0c, 0x67, 0xb4, 0x11, 0x90, + 0xb8, 0x14, 0x82, 0x1c, 0x02, 0x38, 0x93, 0x98, 0x1d, 0x80, 0x90, 0x85, + 0xff, 0x00, 0x80, 0x07, 0x20, 0x1a, 0x00, 0x38, 0x93, 0x98, 0x1d, 0x80, + 0x23, 0x24, 0x94, 0xa4, 0xff, 0x00, 0x94, 0x05, 0x20, 0x1a, 0x82, 0x10, + 0x81, 0x08, 0x91, 0x82, 0x00, 0x80, 0x12, 0x08, 0x0c, 0x18, 0x82, 0x01, + 0x80, 0x07, 0x2d, 0x0c, 0x91, 0x05, 0x20, 0x6a, 0x00, 0xde, 0x20, 0xa9, + 0x00, 0x40, 0x20, 0xa1, 0x1d, 0x80, 0x20, 0x99, 0x1d, 0x80, 0x08, 0x0c, + 0x60, 0xed, 0x08, 0x04, 0x45, 0xca, 0x08, 0x0c, 0x4c, 0x74, 0x09, 0x04, + 0x36, 0xc2, 0x08, 0x0c, 0x4c, 0x41, 0x11, 0x20, 0x20, 0x09, 0x00, 0x02, + 0x08, 0x04, 0x36, 0xbf, 0x08, 0x0c, 0x58, 0x40, 0xd0, 0xb4, 0x05, 0x58, + 0x78, 0x84, 0x90, 0x8e, 0x00, 0x7e, 0x05, 0x38, 0x90, 0x8e, 0x00, 0x7f, + 0x05, 0x20, 0x90, 0x8e, 0x00, 0x80, 0x05, 0x08, 0x08, 0x0c, 0x34, 0x7d, + 0x11, 0x48, 0xb8, 0x00, 0xd0, 0x8c, 0x11, 0xd8, 0xb8, 0x04, 0x90, 0x84, + 0x00, 0xff, 0x90, 0x86, 0x00, 0x06, 0x11, 0xa8, 0xa8, 0x67, 0x00, 0x00, + 0xa8, 0x68, 0xc0, 0xfd, 0xa8, 0x6a, 0x08, 0x0c, 0xd0, 0xec, 0x11, 0x20, + 0x20, 0x09, 0x00, 0x03, 0x08, 0x04, 0x36, 0xbf, 0x70, 0x07, 0x00, 0x03, + 0x70, 0x1f, 0x46, 0x55, 0x00, 0x05, 0x08, 0x0c, 0x4c, 0x74, 0x09, 0x04, + 0x36, 0xc2, 0x20, 0xa9, 0x00, 0x2b, 0xb8, 0xc4, 0x20, 0xe0, 0xb8, 0xc8, + 0x20, 0x98, 0xa8, 0x60, 0x20, 0xe8, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x02, + 0x20, 0xa0, 0x40, 0x03, 0x20, 0xa9, 0x00, 0x08, 0x90, 0x80, 0x00, 0x06, + 0x20, 0xa0, 0xb8, 0xc4, 0x20, 0xe0, 0xb8, 0xc8, 0x90, 0x80, 0x00, 0x06, + 0x20, 0x98, 0x08, 0x0c, 0x0f, 0xd6, 0x00, 0x70, 0x20, 0xa9, 0x00, 0x04, + 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x0a, 0x20, 0xa0, 0xb8, 0xc4, 0x20, 0xe0, + 0xb8, 0xc8, 0x90, 0x80, 0x00, 0x0a, 0x20, 0x98, 0x08, 0x0c, 0x0f, 0xd6, + 0x89, 0x06, 0x80, 0x06, 0x80, 0x07, 0x90, 0xbc, 0x00, 0x3f, 0x90, 0x84, + 0xff, 0xc0, 0x90, 0x80, 0x00, 0x02, 0x20, 0x09, 0x00, 0x2b, 0x7a, 0x8c, + 0x7b, 0x88, 0x7c, 0x9c, 0x7d, 0x98, 0x08, 0x04, 0x4c, 0x8d, 0x81, 0xff, + 0x19, 0x04, 0x36, 0xbf, 0x08, 0x0c, 0x4c, 0x58, 0x09, 0x04, 0x36, 0xc2, + 0x08, 0x0c, 0x6a, 0x00, 0x09, 0x04, 0x36, 0xbf, 0x00, 0x58, 0xa8, 0x78, + 0x90, 0x05, 0x01, 0x20, 0x20, 0x09, 0x00, 0x04, 0x08, 0x04, 0x36, 0xbf, + 0xa9, 0x74, 0xaa, 0x94, 0x08, 0x04, 0x36, 0x8d, 0x08, 0x0c, 0x58, 0x48, + 0x09, 0x04, 0x36, 0x8d, 0x70, 0x1f, 0x46, 0x9f, 0x70, 0x07, 0x00, 0x03, + 0x00, 0x05, 0x81, 0xff, 0x19, 0x04, 0x36, 0xbf, 0x78, 0x88, 0x90, 0x8a, + 0x10, 0x00, 0x1a, 0x04, 0x36, 0xc2, 0x08, 0x0c, 0x4c, 0x74, 0x09, 0x04, + 0x36, 0xc2, 0x08, 0x0c, 0x6c, 0x11, 0x01, 0x20, 0x08, 0x0c, 0x6c, 0x19, + 0x19, 0x04, 0x36, 0xc2, 0x08, 0x0c, 0x6a, 0x85, 0x09, 0x04, 0x36, 0xbf, + 0x20, 0x19, 0x00, 0x04, 0x90, 0x0e, 0x08, 0x0c, 0x6a, 0x12, 0x09, 0x04, + 0x36, 0xbf, 0x79, 0x84, 0x7a, 0x88, 0x04, 0xc9, 0x08, 0xa8, 0xa8, 0x9c, + 0x90, 0x8a, 0x10, 0x00, 0x12, 0xf8, 0x08, 0x0c, 0x4c, 0x72, 0x01, 0xe0, + 0x08, 0x0c, 0x6c, 0x11, 0x01, 0x18, 0x08, 0x0c, 0x6c, 0x19, 0x11, 0xb0, + 0x08, 0x0c, 0x6a, 0x85, 0x20, 0x09, 0x00, 0x02, 0x01, 0x68, 0x20, 0x09, + 0x00, 0x02, 0x20, 0x19, 0x00, 0x04, 0x08, 0x0c, 0x6a, 0x12, 0x20, 0x09, + 0x00, 0x03, 0x01, 0x20, 0xa9, 0x98, 0xaa, 0x9c, 0x00, 0xd1, 0x00, 0x60, + 0xa8, 0x97, 0x40, 0x05, 0xa9, 0x9a, 0x00, 0x10, 0xa8, 0x97, 0x40, 0x06, + 0x90, 0x0e, 0x90, 0x85, 0x00, 0x01, 0x20, 0x01, 0x00, 0x30, 0x00, 0x05, + 0xa8, 0x97, 0x40, 0x00, 0x08, 0x0c, 0x58, 0x48, 0x01, 0x10, 0x90, 0x06, + 0x00, 0x18, 0x90, 0x0e, 0x90, 0x85, 0x00, 0x01, 0x20, 0x01, 0x00, 0x00, + 0x00, 0x05, 0x91, 0x86, 0x00, 0xff, 0x01, 0x10, 0x00, 0x71, 0x00, 0x60, + 0x20, 0x29, 0x00, 0x7e, 0x20, 0x61, 0x18, 0x00, 0x64, 0x5c, 0x24, 0x00, + 0x95, 0x06, 0x01, 0x10, 0x25, 0x08, 0x00, 0x19, 0x85, 0x29, 0x1e, 0xc8, + 0x00, 0x05, 0x08, 0x0c, 0x67, 0xb4, 0x11, 0x38, 0x22, 0x00, 0x80, 0x03, + 0x80, 0x0b, 0x81, 0x0b, 0x91, 0x08, 0x08, 0x0c, 0x89, 0xa1, 0x00, 0x05, + 0x81, 0xff, 0x19, 0x04, 0x36, 0xbf, 0x79, 0x8c, 0x20, 0x01, 0x19, 0x80, + 0x91, 0x8c, 0x80, 0x00, 0x21, 0x02, 0x08, 0x0c, 0x4c, 0x58, 0x09, 0x04, + 0x36, 0xc2, 0x08, 0x0c, 0x6c, 0x11, 0x01, 0x20, 0x08, 0x0c, 0x6c, 0x19, + 0x19, 0x04, 0x36, 0xc2, 0x08, 0x0c, 0x68, 0x7b, 0x09, 0x04, 0x36, 0xbf, + 0x08, 0x0c, 0x6a, 0x09, 0x09, 0x04, 0x36, 0xbf, 0x20, 0x01, 0x19, 0x80, + 0x20, 0x04, 0xd0, 0xfc, 0x19, 0x04, 0x36, 0x8d, 0x08, 0x04, 0x46, 0xaa, + 0xa9, 0xa0, 0x20, 0x01, 0x19, 0x80, 0x91, 0x8c, 0x80, 0x00, 0xc1, 0x8d, + 0x21, 0x02, 0x08, 0x0c, 0x4c, 0x65, 0x01, 0xa0, 0x08, 0x0c, 0x6c, 0x11, + 0x01, 0x18, 0x08, 0x0c, 0x6c, 0x19, 0x11, 0x70, 0x08, 0x0c, 0x68, 0x7b, + 0x20, 0x09, 0x00, 0x02, 0x01, 0x28, 0x08, 0x0c, 0x6a, 0x09, 0x11, 0x70, + 0x20, 0x09, 0x00, 0x03, 0xa8, 0x97, 0x40, 0x05, 0xa9, 0x9a, 0x00, 0x10, + 0xa8, 0x97, 0x40, 0x06, 0x90, 0x0e, 0x90, 0x85, 0x00, 0x01, 0x20, 0x01, + 0x00, 0x30, 0x00, 0x05, 0xa8, 0x97, 0x40, 0x00, 0x20, 0x01, 0x19, 0x80, + 0x20, 0x04, 0xd0, 0xfc, 0x11, 0x28, 0x08, 0x0c, 0x58, 0x48, 0x01, 0x10, + 0x90, 0x06, 0x00, 0x18, 0x90, 0x0e, 0x90, 0x85, 0x00, 0x01, 0x20, 0x01, + 0x00, 0x00, 0x00, 0x05, 0x81, 0xff, 0x19, 0x04, 0x36, 0xbf, 0x79, 0x8c, + 0x20, 0x01, 0x19, 0x7f, 0x91, 0x8c, 0x80, 0x00, 0x21, 0x02, 0x08, 0x0c, + 0x4c, 0x58, 0x09, 0x04, 0x36, 0xc2, 0x08, 0x0c, 0x6c, 0x11, 0x01, 0x20, + 0x08, 0x0c, 0x6c, 0x19, 0x19, 0x04, 0x36, 0xc2, 0x08, 0x0c, 0x68, 0x7b, + 0x09, 0x04, 0x36, 0xbf, 0x08, 0x0c, 0x69, 0xf7, 0x09, 0x04, 0x36, 0xbf, + 0x20, 0x01, 0x19, 0x7f, 0x20, 0x04, 0xd0, 0xfc, 0x19, 0x04, 0x36, 0x8d, + 0x08, 0x04, 0x46, 0xaa, 0xa9, 0xa0, 0x20, 0x01, 0x19, 0x7f, 0x91, 0x8c, + 0x80, 0x00, 0xc1, 0x8d, 0x21, 0x02, 0x08, 0x0c, 0x4c, 0x65, 0x01, 0xa0, + 0x08, 0x0c, 0x6c, 0x11, 0x01, 0x18, 0x08, 0x0c, 0x6c, 0x19, 0x11, 0x70, + 0x08, 0x0c, 0x68, 0x7b, 0x20, 0x09, 0x00, 0x02, 0x01, 0x28, 0x08, 0x0c, + 0x69, 0xf7, 0x11, 0x70, 0x20, 0x09, 0x00, 0x03, 0xa8, 0x97, 0x40, 0x05, + 0xa9, 0x9a, 0x00, 0x10, 0xa8, 0x97, 0x40, 0x06, 0x90, 0x0e, 0x90, 0x85, + 0x00, 0x01, 0x20, 0x01, 0x00, 0x30, 0x00, 0x05, 0xa8, 0x97, 0x40, 0x00, + 0x20, 0x01, 0x19, 0x7f, 0x20, 0x04, 0xd0, 0xfc, 0x11, 0x28, 0x08, 0x0c, + 0x58, 0x48, 0x01, 0x10, 0x90, 0x06, 0x00, 0x18, 0x90, 0x0e, 0x90, 0x85, + 0x00, 0x01, 0x20, 0x01, 0x00, 0x00, 0x00, 0x05, 0x61, 0x00, 0x08, 0x04, + 0x36, 0x8d, 0x08, 0x0c, 0x4c, 0x74, 0x09, 0x04, 0x36, 0xc2, 0x08, 0x0c, + 0x58, 0x54, 0x19, 0x04, 0x36, 0xbf, 0x79, 0xa8, 0xd1, 0x84, 0x11, 0x58, + 0xb8, 0x34, 0x80, 0x07, 0x78, 0x9e, 0xb8, 0x30, 0x80, 0x07, 0x78, 0x9a, + 0xbb, 0x2c, 0x83, 0x1f, 0xba, 0x28, 0x82, 0x17, 0x00, 0x50, 0xb8, 0x24, + 0x80, 0x07, 0x78, 0x9e, 0xb8, 0x20, 0x80, 0x07, 0x78, 0x9a, 0xbb, 0x1c, + 0x83, 0x1f, 0xba, 0x18, 0x82, 0x17, 0xb9, 0x00, 0x91, 0x8c, 0x02, 0x02, + 0x08, 0x04, 0x36, 0x8d, 0x78, 0xa8, 0x90, 0x9c, 0x00, 0x03, 0xd0, 0xac, + 0x11, 0x50, 0xd0, 0xb4, 0x11, 0x40, 0x93, 0x9a, 0x00, 0x03, 0x1a, 0x04, + 0x36, 0xbf, 0x62, 0x5c, 0x78, 0x84, 0x92, 0x06, 0x15, 0x48, 0x08, 0x0c, + 0x8b, 0x10, 0x20, 0x01, 0xff, 0xec, 0x20, 0x09, 0x00, 0x0c, 0x7a, 0x8c, + 0x7b, 0x88, 0x7c, 0x9c, 0x7d, 0x98, 0x20, 0x39, 0x00, 0x00, 0x00, 0x06, + 0x78, 0xa8, 0x90, 0x84, 0x00, 0x80, 0x11, 0x18, 0x00, 0x0e, 0x08, 0x04, + 0x4c, 0x8d, 0x00, 0x0e, 0x20, 0x31, 0x00, 0x00, 0x20, 0x61, 0x18, 0xb8, + 0x2c, 0x44, 0xa6, 0x6a, 0xa1, 0x7a, 0xa7, 0x72, 0xa0, 0x76, 0xa2, 0x8e, + 0xa3, 0x92, 0xa4, 0x96, 0xa5, 0x9a, 0x08, 0x0c, 0x11, 0x4e, 0x70, 0x07, + 0x00, 0x02, 0x70, 0x1f, 0x48, 0x62, 0x00, 0x05, 0x81, 0xff, 0x19, 0x04, + 0x36, 0xbf, 0x08, 0x0c, 0x4c, 0x74, 0x09, 0x04, 0x36, 0xc2, 0x08, 0x0c, + 0x6c, 0x11, 0x19, 0x04, 0x36, 0xbf, 0x00, 0xc6, 0x08, 0x0c, 0x4c, 0x41, + 0x00, 0xce, 0x09, 0x04, 0x36, 0xbf, 0xa8, 0x67, 0x00, 0x00, 0xa8, 0x68, + 0xc0, 0xfd, 0xa8, 0x6a, 0x7e, 0xa8, 0x08, 0x0c, 0xd0, 0x92, 0x09, 0x04, + 0x36, 0xbf, 0x70, 0x07, 0x00, 0x03, 0x70, 0x1f, 0x48, 0x66, 0x00, 0x05, + 0x08, 0x0c, 0x43, 0x97, 0x08, 0x04, 0x36, 0x8d, 0xa8, 0x30, 0x90, 0x86, + 0x01, 0x00, 0x09, 0x04, 0x36, 0xbf, 0x89, 0x06, 0x80, 0x06, 0x80, 0x07, + 0x90, 0xbc, 0x00, 0x3f, 0x90, 0x84, 0xff, 0xc0, 0x90, 0x80, 0x00, 0x1b, + 0x20, 0x09, 0x00, 0x0c, 0x7a, 0x8c, 0x7b, 0x88, 0x7c, 0x9c, 0x7d, 0x98, + 0x08, 0x04, 0x4c, 0x8d, 0x90, 0x06, 0x08, 0x0c, 0x26, 0xf5, 0x78, 0xa8, + 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0xff, 0x01, 0x18, 0x81, 0xff, + 0x19, 0x04, 0x36, 0xbf, 0x08, 0x0c, 0x77, 0x9e, 0x01, 0x10, 0x08, 0x0c, + 0x61, 0x62, 0x78, 0x88, 0x90, 0x8a, 0x10, 0x00, 0x1a, 0x04, 0x36, 0xc2, + 0x79, 0x84, 0x91, 0x86, 0x00, 0xff, 0x01, 0x38, 0x91, 0x82, 0x00, 0x7f, + 0x1a, 0x04, 0x36, 0xc2, 0x21, 0x00, 0x08, 0x0c, 0x26, 0xbf, 0x00, 0x26, + 0x00, 0xc6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x61, 0x1a, 0x04, + 0x60, 0x1b, 0x00, 0x00, 0x60, 0x1f, 0x00, 0x00, 0x60, 0x7b, 0x00, 0x00, + 0x60, 0x7f, 0x00, 0x00, 0x08, 0x0c, 0x77, 0x9e, 0x11, 0x58, 0x08, 0x0c, + 0x7a, 0xb6, 0x08, 0x0c, 0x61, 0x9d, 0x90, 0x85, 0x00, 0x01, 0x08, 0x0c, + 0x77, 0xe2, 0x08, 0x0c, 0x76, 0xcd, 0x00, 0xf0, 0x08, 0x0c, 0xac, 0xfc, + 0x08, 0x0c, 0xb0, 0x9b, 0x08, 0x0c, 0xad, 0x18, 0x20, 0x61, 0x01, 0x00, + 0x20, 0x01, 0x18, 0x18, 0x20, 0x04, 0x90, 0x84, 0x00, 0xff, 0x81, 0x0f, + 0x91, 0x05, 0x60, 0x4a, 0x60, 0x43, 0x00, 0x90, 0x60, 0x43, 0x00, 0x10, + 0x20, 0x09, 0x19, 0x99, 0x20, 0x0b, 0x00, 0x00, 0x20, 0x09, 0x00, 0x2d, + 0x20, 0x11, 0x60, 0x88, 0x08, 0x0c, 0x8a, 0x5d, 0x79, 0x84, 0x08, 0x0c, + 0x77, 0x9e, 0x11, 0x10, 0x20, 0x09, 0x00, 0xff, 0x7a, 0x88, 0x08, 0x0c, + 0x47, 0x0d, 0x01, 0x2e, 0x00, 0xce, 0x00, 0x2e, 0x08, 0x04, 0x36, 0x8d, + 0x79, 0x84, 0x08, 0x0c, 0x67, 0x49, 0x2b, 0x08, 0x19, 0x04, 0x36, 0xc2, + 0x08, 0x04, 0x36, 0x8d, 0x81, 0xff, 0x01, 0x20, 0x20, 0x09, 0x00, 0x01, + 0x08, 0x04, 0x36, 0xbf, 0x60, 0xdc, 0xd0, 0xac, 0x11, 0x30, 0xd0, 0x9c, + 0x11, 0x20, 0x20, 0x09, 0x00, 0x05, 0x08, 0x04, 0x36, 0xbf, 0x08, 0x0c, + 0x4c, 0x41, 0x11, 0x20, 0x20, 0x09, 0x00, 0x02, 0x08, 0x04, 0x36, 0xbf, + 0x79, 0x84, 0x81, 0xff, 0x09, 0x04, 0x36, 0xc2, 0x91, 0x92, 0x00, 0x21, + 0x1a, 0x04, 0x36, 0xc2, 0x7a, 0x8c, 0x7b, 0x88, 0x7c, 0x9c, 0x7d, 0x98, + 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x19, 0x70, 0x2a, 0xaf, 0x60, 0x77, 0x36, + 0x08, 0x0c, 0x4c, 0x8a, 0x70, 0x1f, 0x49, 0x21, 0x78, 0x80, 0x90, 0x86, + 0x00, 0x6e, 0x01, 0x10, 0x70, 0x1f, 0x52, 0xda, 0x00, 0x05, 0x20, 0x09, + 0x00, 0x80, 0x08, 0x0c, 0x67, 0xb4, 0x11, 0x18, 0x08, 0x0c, 0x6c, 0x11, + 0x01, 0x20, 0x20, 0x21, 0x40, 0x0a, 0x08, 0x04, 0x36, 0x8f, 0x00, 0xd6, + 0x00, 0x96, 0xa9, 0x64, 0xaa, 0x6c, 0xab, 0x70, 0xac, 0x74, 0xad, 0x78, + 0xae, 0x7c, 0xa8, 0x84, 0x90, 0xbe, 0x01, 0x00, 0x09, 0x04, 0x49, 0xba, + 0x90, 0xbe, 0x01, 0x12, 0x09, 0x04, 0x49, 0xba, 0x90, 0xbe, 0x01, 0x13, + 0x09, 0x04, 0x49, 0xba, 0x90, 0xbe, 0x01, 0x14, 0x09, 0x04, 0x49, 0xba, + 0x90, 0xbe, 0x01, 0x17, 0x09, 0x04, 0x49, 0xba, 0x90, 0xbe, 0x01, 0x1a, + 0x09, 0x04, 0x49, 0xba, 0x90, 0xbe, 0x01, 0x1c, 0x09, 0x04, 0x49, 0xba, + 0x90, 0xbe, 0x01, 0x21, 0x09, 0x04, 0x49, 0xa1, 0x90, 0xbe, 0x01, 0x31, + 0x09, 0x04, 0x49, 0xa1, 0x90, 0xbe, 0x01, 0x71, 0x09, 0x04, 0x49, 0xba, + 0x90, 0xbe, 0x01, 0x73, 0x09, 0x04, 0x49, 0xba, 0x90, 0xbe, 0x01, 0xa1, + 0x11, 0x28, 0xa8, 0x94, 0x80, 0x07, 0xa8, 0x96, 0x08, 0x04, 0x49, 0xc5, + 0x90, 0xbe, 0x02, 0x12, 0x09, 0x04, 0x49, 0xae, 0x90, 0xbe, 0x02, 0x13, + 0x05, 0xe8, 0x90, 0xbe, 0x02, 0x14, 0x05, 0x00, 0x90, 0xbe, 0x02, 0x17, + 0x01, 0x88, 0x90, 0xbe, 0x02, 0x1a, 0x11, 0x20, 0xa8, 0x9c, 0x80, 0x07, + 0xa8, 0x9e, 0x04, 0xe0, 0x90, 0xbe, 0x02, 0x1f, 0x05, 0xc8, 0x90, 0xbe, + 0x03, 0x00, 0x05, 0xb0, 0x00, 0x9e, 0x00, 0xde, 0x08, 0x04, 0x36, 0xc2, + 0x70, 0x28, 0x90, 0x80, 0x00, 0x10, 0x20, 0x98, 0x20, 0xa0, 0x70, 0x34, + 0x20, 0xe0, 0x20, 0xe8, 0x20, 0xa9, 0x00, 0x07, 0x08, 0x0c, 0x4a, 0x03, + 0x70, 0x28, 0x90, 0x80, 0x00, 0x0e, 0x20, 0x98, 0x20, 0xa0, 0x70, 0x34, + 0x20, 0xe0, 0x20, 0xe8, 0x20, 0xa9, 0x00, 0x01, 0x08, 0x0c, 0x4a, 0x03, + 0x00, 0xc8, 0x70, 0x28, 0x90, 0x80, 0x00, 0x0c, 0x20, 0x98, 0x20, 0xa0, + 0x70, 0x34, 0x20, 0xe0, 0x20, 0xe8, 0x20, 0xa9, 0x00, 0x01, 0x08, 0x0c, + 0x4a, 0x10, 0x00, 0xb8, 0x70, 0x28, 0x90, 0x80, 0x00, 0x0e, 0x20, 0x98, + 0x20, 0xa0, 0x70, 0x34, 0x20, 0xe0, 0x20, 0xe8, 0x20, 0xa9, 0x00, 0x01, + 0x08, 0x0c, 0x4a, 0x10, 0x70, 0x28, 0x90, 0x80, 0x00, 0x0c, 0x20, 0x98, + 0x20, 0xa0, 0x70, 0x34, 0x20, 0xe0, 0x20, 0xe8, 0x20, 0xa9, 0x00, 0x01, + 0x04, 0xf1, 0x00, 0xc6, 0x08, 0x0c, 0x4c, 0x41, 0x05, 0x50, 0xa8, 0x68, + 0xc0, 0xfd, 0xa8, 0x6a, 0xa8, 0x67, 0x01, 0x19, 0x90, 0x06, 0xa8, 0x82, + 0xa8, 0x7f, 0x00, 0x20, 0xa8, 0x8b, 0x00, 0x01, 0x81, 0x0b, 0xa9, 0xae, + 0xa8, 0xb2, 0xaa, 0xb6, 0xab, 0xba, 0xac, 0xbe, 0xad, 0xc2, 0xa9, 0xc6, + 0xa8, 0xca, 0x00, 0xce, 0x00, 0x9e, 0x00, 0xde, 0xa8, 0x66, 0xa8, 0x22, + 0xa8, 0x68, 0xc0, 0xfd, 0xa8, 0x6a, 0xa8, 0x04, 0x20, 0x48, 0x08, 0x0c, + 0xd0, 0xad, 0x11, 0x20, 0x20, 0x09, 0x00, 0x03, 0x08, 0x04, 0x36, 0xbf, + 0x70, 0x07, 0x00, 0x03, 0x70, 0x1f, 0x49, 0xfa, 0x00, 0x05, 0x00, 0xce, + 0x00, 0x9e, 0x00, 0xde, 0x20, 0x09, 0x00, 0x02, 0x08, 0x04, 0x36, 0xbf, + 0xa8, 0x20, 0x90, 0x86, 0x80, 0x01, 0x19, 0x04, 0x36, 0x8d, 0x20, 0x09, + 0x00, 0x04, 0x08, 0x04, 0x36, 0xbf, 0x00, 0x16, 0x00, 0x26, 0x35, 0x10, + 0x20, 0xa9, 0x00, 0x02, 0x40, 0x02, 0x41, 0x04, 0x40, 0x04, 0x82, 0x11, + 0x1d, 0xc8, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, + 0x00, 0x36, 0x00, 0x46, 0x35, 0x20, 0x20, 0xa9, 0x00, 0x04, 0x40, 0x02, + 0x43, 0x04, 0x42, 0x04, 0x41, 0x04, 0x40, 0x04, 0x84, 0x21, 0x1d, 0xb8, + 0x00, 0x4e, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x81, 0xff, + 0x01, 0x20, 0x20, 0x09, 0x00, 0x01, 0x08, 0x04, 0x36, 0xbf, 0x60, 0xdc, + 0xd0, 0xac, 0x11, 0x88, 0x20, 0x09, 0x18, 0x0d, 0x21, 0x0c, 0xd1, 0x8c, + 0x01, 0x30, 0xd0, 0x9c, 0x01, 0x20, 0x20, 0x09, 0x00, 0x16, 0x08, 0x04, + 0x36, 0xbf, 0xd0, 0x9c, 0x11, 0x20, 0x20, 0x09, 0x00, 0x05, 0x08, 0x04, + 0x36, 0xbf, 0x79, 0x84, 0x78, 0xa8, 0x20, 0x40, 0x08, 0x0c, 0xb0, 0x94, + 0x11, 0x20, 0x91, 0x82, 0x00, 0x7f, 0x0a, 0x04, 0x36, 0xc2, 0x91, 0x86, + 0x00, 0xff, 0x09, 0x04, 0x36, 0xc2, 0x91, 0x82, 0x08, 0x00, 0x1a, 0x04, + 0x36, 0xc2, 0x7a, 0x8c, 0x7b, 0x88, 0x60, 0x7c, 0x93, 0x06, 0x11, 0x58, + 0x60, 0x80, 0x92, 0x4e, 0x09, 0x04, 0x36, 0xc2, 0x08, 0x0c, 0xb0, 0x94, + 0x11, 0x20, 0x99, 0xcc, 0xff, 0x00, 0x09, 0x04, 0x36, 0xc2, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x20, 0x01, 0x18, 0x0d, 0x20, 0x04, 0xd0, 0x8c, + 0x01, 0x98, 0x93, 0x86, 0x00, 0xff, 0x01, 0x80, 0x00, 0x26, 0x20, 0x11, + 0x80, 0x08, 0x08, 0x0c, 0x6c, 0x35, 0x00, 0x2e, 0x01, 0x48, 0x91, 0x8d, + 0x80, 0x00, 0x08, 0x0c, 0x6c, 0x7f, 0x11, 0x20, 0x20, 0x01, 0x40, 0x09, + 0x08, 0x04, 0x4a, 0xc1, 0x08, 0x0c, 0x4b, 0x54, 0x09, 0x04, 0x4a, 0xc7, + 0x00, 0x86, 0x90, 0xc6, 0x40, 0x00, 0x00, 0x8e, 0x15, 0x38, 0x00, 0xc6, + 0x00, 0x06, 0x00, 0x36, 0xb8, 0x18, 0xbb, 0x1c, 0x93, 0x05, 0xbb, 0x20, + 0x93, 0x05, 0xbb, 0x24, 0x93, 0x05, 0xbb, 0x28, 0x93, 0x05, 0xbb, 0x2c, + 0x93, 0x05, 0xbb, 0x30, 0x93, 0x05, 0xbb, 0x34, 0x93, 0x05, 0x00, 0x3e, + 0x05, 0x70, 0xd8, 0x8c, 0x11, 0x28, 0x08, 0x0c, 0x6c, 0x11, 0x01, 0x10, + 0xc8, 0x9d, 0x04, 0x38, 0x90, 0x0e, 0x08, 0x0c, 0x6a, 0xae, 0x11, 0x08, + 0xc1, 0x85, 0xb8, 0x00, 0xd0, 0xbc, 0x01, 0x08, 0xc1, 0x8d, 0x00, 0x0e, + 0x00, 0xce, 0x00, 0xb8, 0x90, 0xc6, 0x40, 0x07, 0x11, 0x10, 0x24, 0x08, + 0x00, 0x90, 0x90, 0xc6, 0x40, 0x08, 0x11, 0x18, 0x27, 0x08, 0x26, 0x10, + 0x00, 0x60, 0x90, 0xc6, 0x40, 0x09, 0x11, 0x08, 0x00, 0x40, 0x90, 0xc6, + 0x40, 0x06, 0x11, 0x08, 0x00, 0x20, 0x20, 0x01, 0x40, 0x05, 0x20, 0x09, + 0x00, 0x0a, 0x20, 0x20, 0x01, 0x2e, 0x08, 0x04, 0x36, 0x8f, 0x00, 0x0e, + 0x00, 0xce, 0x2b, 0x00, 0x70, 0x26, 0x00, 0x16, 0x00, 0xb6, 0x00, 0xc6, + 0x00, 0xe6, 0x2c, 0x70, 0x08, 0x0c, 0xb1, 0xdd, 0x09, 0x04, 0x4b, 0x1c, + 0x2b, 0x00, 0x60, 0x12, 0x08, 0x0c, 0xd3, 0xb6, 0x2e, 0x58, 0x00, 0xee, + 0x00, 0xe6, 0x00, 0xc6, 0x08, 0x0c, 0x4c, 0x41, 0x00, 0xce, 0x2b, 0x70, + 0x11, 0x58, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0xee, 0x00, 0xce, 0x00, 0xbe, + 0x00, 0x1e, 0x01, 0x2e, 0x20, 0x09, 0x00, 0x02, 0x08, 0x04, 0x36, 0xbf, + 0x90, 0x0e, 0xa9, 0x66, 0xa9, 0x6a, 0x29, 0x00, 0x60, 0x16, 0xa9, 0x32, + 0xa8, 0x68, 0xc0, 0xfd, 0xd8, 0x8c, 0x01, 0x08, 0xc0, 0xf5, 0xa8, 0x6a, + 0xd8, 0x9c, 0x11, 0x10, 0x08, 0x0c, 0x33, 0x15, 0x60, 0x23, 0x00, 0x01, + 0x90, 0x06, 0x08, 0x0c, 0x66, 0xe6, 0xd8, 0x9c, 0x01, 0x38, 0x20, 0x01, + 0x00, 0x04, 0x08, 0x0c, 0x66, 0xfa, 0x20, 0x09, 0x00, 0x03, 0x00, 0x30, + 0x20, 0x01, 0x00, 0x02, 0x08, 0x0c, 0x66, 0xfa, 0x20, 0x09, 0x00, 0x02, + 0x08, 0x0c, 0xb2, 0x0a, 0x78, 0xa8, 0xd0, 0x94, 0x01, 0x38, 0x00, 0xee, + 0x70, 0x24, 0x00, 0xe6, 0x20, 0x58, 0xb8, 0xd4, 0xc0, 0x8d, 0xb8, 0xd6, + 0x90, 0x85, 0x00, 0x01, 0x00, 0xee, 0x00, 0xce, 0x00, 0xbe, 0x00, 0x1e, + 0x01, 0x2e, 0x11, 0x20, 0x20, 0x09, 0x00, 0x03, 0x08, 0x04, 0x36, 0xbf, + 0x70, 0x07, 0x00, 0x03, 0x70, 0x1f, 0x4b, 0x2b, 0x00, 0x05, 0xa8, 0x30, + 0x20, 0x09, 0x18, 0x0d, 0x21, 0x0c, 0xd1, 0x8c, 0x01, 0x40, 0x20, 0x08, + 0x91, 0x8e, 0xde, 0xad, 0x11, 0x20, 0x20, 0x21, 0x40, 0x09, 0x08, 0x04, + 0x36, 0x8f, 0x90, 0x86, 0x01, 0x00, 0x70, 0x24, 0x20, 0x58, 0x11, 0x38, + 0x20, 0x09, 0x00, 0x04, 0xba, 0x04, 0x92, 0x94, 0x00, 0xff, 0x08, 0x04, + 0x57, 0x8e, 0x90, 0x0e, 0xa8, 0x68, 0xd0, 0xf4, 0x19, 0x04, 0x36, 0x8d, + 0x08, 0x0c, 0x6a, 0xae, 0x11, 0x08, 0xc1, 0x85, 0xb8, 0x00, 0xd0, 0xbc, + 0x01, 0x08, 0xc1, 0x8d, 0x08, 0x04, 0x36, 0x8d, 0x00, 0xe6, 0x00, 0xd6, + 0x00, 0x96, 0x83, 0xff, 0x09, 0x04, 0x4b, 0xa3, 0x90, 0x2e, 0x08, 0x0c, + 0xb0, 0x94, 0x01, 0x30, 0x90, 0x26, 0x20, 0xa9, 0x08, 0x00, 0x20, 0x71, + 0x10, 0x00, 0x00, 0x30, 0x20, 0x21, 0x00, 0x7f, 0x20, 0xa9, 0x07, 0x81, + 0x20, 0x71, 0x10, 0x7f, 0x2e, 0x04, 0x90, 0x05, 0x11, 0xb8, 0x21, 0x00, + 0x94, 0x06, 0x19, 0x04, 0x4b, 0xb4, 0x24, 0x28, 0x94, 0xce, 0x00, 0x7f, + 0x11, 0x20, 0x92, 0xce, 0xff, 0xfd, 0x15, 0x58, 0x00, 0x30, 0x94, 0xce, + 0x00, 0x80, 0x11, 0x30, 0x92, 0xce, 0xff, 0xfc, 0x15, 0x20, 0x93, 0xce, + 0x00, 0xff, 0x15, 0x08, 0xc5, 0xfd, 0x04, 0x80, 0x20, 0x58, 0xbf, 0x10, + 0x27, 0x00, 0x93, 0x06, 0x11, 0xe8, 0xbe, 0x14, 0x26, 0x00, 0x92, 0x06, + 0x11, 0xc8, 0x24, 0x00, 0x91, 0x06, 0x11, 0x80, 0xd8, 0x84, 0x05, 0x98, + 0xd8, 0x94, 0x15, 0x88, 0x08, 0x0c, 0x6b, 0xb1, 0x15, 0x70, 0x20, 0x01, + 0x40, 0x00, 0x04, 0x60, 0x08, 0x0c, 0x6c, 0x11, 0x15, 0x40, 0x20, 0x01, + 0x40, 0x00, 0x04, 0x30, 0x20, 0x01, 0x40, 0x07, 0x04, 0x18, 0x20, 0x01, + 0x40, 0x06, 0x04, 0x00, 0x24, 0x00, 0x91, 0x06, 0x11, 0x58, 0xbe, 0x14, + 0x87, 0xff, 0x11, 0x28, 0x86, 0xff, 0x09, 0x18, 0x08, 0x0c, 0xb0, 0x94, + 0x19, 0x00, 0x20, 0x01, 0x40, 0x08, 0x00, 0x90, 0x84, 0x20, 0x8e, 0x70, + 0x1f, 0x04, 0x4b, 0x6a, 0x85, 0xff, 0x11, 0x30, 0x20, 0x01, 0x40, 0x09, + 0x00, 0x48, 0x20, 0x01, 0x00, 0x01, 0x00, 0x30, 0x08, 0x0c, 0x67, 0x49, + 0x1d, 0xd0, 0xbb, 0x12, 0xba, 0x16, 0x90, 0x06, 0x90, 0x05, 0x00, 0x9e, + 0x00, 0xde, 0x00, 0xee, 0x00, 0x05, 0x81, 0xff, 0x01, 0x20, 0x20, 0x09, + 0x00, 0x01, 0x08, 0x04, 0x36, 0xbf, 0x08, 0x0c, 0x4c, 0x41, 0x11, 0x20, + 0x20, 0x09, 0x00, 0x02, 0x08, 0x04, 0x36, 0xbf, 0xa8, 0x67, 0x00, 0x00, + 0xa8, 0x68, 0xc0, 0xfd, 0xa8, 0x6a, 0x78, 0x84, 0x90, 0x05, 0x09, 0x04, + 0x36, 0xc2, 0x90, 0x96, 0x00, 0xff, 0x01, 0x20, 0x90, 0x92, 0x00, 0x04, + 0x1a, 0x04, 0x36, 0xc2, 0x20, 0x10, 0x29, 0x18, 0x08, 0x0c, 0x32, 0xb5, + 0x11, 0x20, 0x20, 0x09, 0x00, 0x03, 0x08, 0x04, 0x36, 0xbf, 0x70, 0x07, + 0x00, 0x03, 0x70, 0x1f, 0x4b, 0xf6, 0x00, 0x05, 0xa8, 0x30, 0x90, 0x86, + 0x01, 0x00, 0x19, 0x04, 0x36, 0x8d, 0x20, 0x09, 0x00, 0x04, 0x08, 0x04, + 0x36, 0xbf, 0x79, 0x84, 0x08, 0x0c, 0xb0, 0x94, 0x11, 0x20, 0x91, 0x82, + 0x00, 0x7f, 0x0a, 0x04, 0x36, 0xc2, 0x91, 0x86, 0x00, 0xff, 0x09, 0x04, + 0x36, 0xc2, 0x91, 0x82, 0x08, 0x00, 0x1a, 0x04, 0x36, 0xc2, 0x20, 0x01, + 0x94, 0x00, 0x08, 0x0c, 0x57, 0xe9, 0x19, 0x04, 0x36, 0xbf, 0x08, 0x04, + 0x36, 0x8d, 0xa9, 0x98, 0x08, 0x0c, 0xb0, 0x94, 0x11, 0x18, 0x91, 0x82, + 0x00, 0x7f, 0x02, 0x80, 0x91, 0x86, 0x00, 0xff, 0x01, 0x68, 0x91, 0x82, + 0x08, 0x00, 0x12, 0x50, 0x20, 0x01, 0x94, 0x00, 0x08, 0x0c, 0x57, 0xe9, + 0x11, 0xa8, 0x00, 0x60, 0xa8, 0x97, 0x40, 0x05, 0xa9, 0x9a, 0x00, 0x10, + 0xa8, 0x97, 0x40, 0x06, 0x90, 0x0e, 0x90, 0x85, 0x00, 0x01, 0x20, 0x01, + 0x00, 0x30, 0x00, 0x05, 0xa8, 0x97, 0x40, 0x00, 0x90, 0x0e, 0x90, 0x85, + 0x00, 0x01, 0x20, 0x01, 0x00, 0x00, 0x00, 0x05, 0x20, 0x09, 0x00, 0x0a, + 0x0c, 0x48, 0x08, 0x0c, 0x10, 0x59, 0x01, 0x98, 0x90, 0x06, 0xa8, 0x02, + 0x70, 0x14, 0x90, 0x05, 0x11, 0x20, 0x29, 0x00, 0x70, 0x16, 0x70, 0x1a, + 0x00, 0x40, 0x70, 0x18, 0xa8, 0x02, 0x00, 0x86, 0x20, 0x40, 0x29, 0x00, + 0xa0, 0x06, 0x70, 0x1a, 0x00, 0x8e, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, + 0x79, 0x84, 0x08, 0x0c, 0x67, 0xb4, 0x11, 0x30, 0x7e, 0x88, 0x96, 0x84, + 0x3f, 0xff, 0x90, 0x82, 0x40, 0x00, 0x02, 0x08, 0x90, 0x5e, 0x8b, 0xff, + 0x00, 0x05, 0xa9, 0x98, 0x08, 0x0c, 0x67, 0xb4, 0x11, 0x30, 0xae, 0x9c, + 0x96, 0x84, 0x3f, 0xff, 0x90, 0x82, 0x40, 0x00, 0x02, 0x08, 0x90, 0x5e, + 0x8b, 0xff, 0x00, 0x05, 0xae, 0x98, 0x00, 0x08, 0x7e, 0x84, 0x26, 0x08, + 0x08, 0x0c, 0x67, 0xb4, 0x11, 0x08, 0x00, 0x08, 0x90, 0x5e, 0x8b, 0xff, + 0x00, 0x05, 0x00, 0x16, 0x71, 0x14, 0x81, 0xff, 0x01, 0x28, 0x21, 0x48, + 0xa9, 0x04, 0x08, 0x0c, 0x10, 0x8b, 0x0c, 0xc8, 0x71, 0x16, 0x71, 0x1a, + 0x00, 0x1e, 0x00, 0x05, 0x20, 0x31, 0x00, 0x01, 0x00, 0x10, 0x20, 0x31, + 0x00, 0x00, 0x20, 0x61, 0x18, 0xb8, 0x2c, 0x44, 0xa6, 0x6a, 0xa1, 0x7a, + 0xa7, 0x72, 0xa0, 0x76, 0xa2, 0x8e, 0xa3, 0x92, 0xa4, 0x96, 0xa5, 0x9a, + 0x08, 0x0c, 0x11, 0x4e, 0x70, 0x07, 0x00, 0x02, 0x70, 0x1f, 0x36, 0x8d, + 0x00, 0x05, 0x00, 0xf6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x79, + 0x00, 0x00, 0x20, 0x01, 0x18, 0xb0, 0x20, 0x04, 0x90, 0x05, 0x11, 0x90, + 0x0e, 0x04, 0x4c, 0xbe, 0x7a, 0x36, 0x78, 0x33, 0x00, 0x12, 0x7a, 0x82, + 0x7b, 0x86, 0x7c, 0x8a, 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, 0x00, 0x89, + 0x20, 0x04, 0xd0, 0x84, 0x19, 0x0c, 0x12, 0x00, 0x08, 0x04, 0x4d, 0x24, + 0x00, 0x16, 0x00, 0x86, 0x00, 0x96, 0x00, 0xc6, 0x00, 0xe6, 0x20, 0x71, + 0x18, 0x9e, 0x70, 0x44, 0x90, 0x05, 0x15, 0x40, 0x71, 0x48, 0x91, 0x82, + 0x00, 0x10, 0x02, 0x88, 0x70, 0x38, 0x20, 0x60, 0x08, 0x0c, 0x10, 0x59, + 0x09, 0x04, 0x4d, 0x1c, 0xa8, 0x4b, 0x00, 0x00, 0x29, 0x00, 0x70, 0x46, + 0x20, 0x01, 0x00, 0x02, 0x90, 0x80, 0x1e, 0xc1, 0x20, 0x05, 0xa8, 0x46, + 0x00, 0x98, 0x70, 0x38, 0x90, 0xe0, 0x00, 0x04, 0x20, 0x01, 0x18, 0xba, + 0x9c, 0x82, 0x18, 0xfa, 0x02, 0x10, 0x20, 0x61, 0x18, 0xba, 0x2c, 0x00, + 0x70, 0x3a, 0x71, 0x48, 0x81, 0xff, 0x11, 0x08, 0x70, 0x3e, 0x81, 0x08, + 0x71, 0x4a, 0x04, 0x60, 0x71, 0x48, 0x81, 0x08, 0x71, 0x4a, 0x70, 0x44, + 0x20, 0x40, 0xa1, 0x44, 0x21, 0x05, 0x00, 0x16, 0x90, 0x8a, 0x00, 0x36, + 0x1a, 0x0c, 0x0d, 0x85, 0x20, 0x60, 0x00, 0x1e, 0x81, 0x08, 0x21, 0x05, + 0x90, 0x05, 0xa1, 0x46, 0x15, 0x20, 0x08, 0x0c, 0x10, 0x59, 0x11, 0x30, + 0x81, 0x09, 0xa9, 0x46, 0x71, 0x48, 0x81, 0x09, 0x71, 0x4a, 0x00, 0xd8, + 0x90, 0x06, 0xa8, 0x06, 0xa8, 0x4a, 0xa0, 0x46, 0x28, 0x00, 0xa8, 0x02, + 0x29, 0x00, 0xa0, 0x06, 0x70, 0x46, 0x20, 0x01, 0x00, 0x02, 0x90, 0x80, + 0x1e, 0xc1, 0x20, 0x05, 0xa8, 0x46, 0x00, 0x58, 0x22, 0x62, 0x63, 0x06, + 0x64, 0x0a, 0x00, 0xee, 0x00, 0xce, 0x00, 0x9e, 0x00, 0x8e, 0x00, 0x1e, + 0x01, 0x2e, 0x00, 0xfe, 0x00, 0x05, 0x2c, 0x00, 0x90, 0x82, 0x00, 0x1b, + 0x00, 0x02, 0x4d, 0x46, 0x4d, 0x46, 0x4d, 0x48, 0x4d, 0x46, 0x4d, 0x46, + 0x4d, 0x46, 0x4d, 0x4c, 0x4d, 0x46, 0x4d, 0x46, 0x4d, 0x46, 0x4d, 0x50, + 0x4d, 0x46, 0x4d, 0x46, 0x4d, 0x46, 0x4d, 0x54, 0x4d, 0x46, 0x4d, 0x46, + 0x4d, 0x46, 0x4d, 0x58, 0x4d, 0x46, 0x4d, 0x46, 0x4d, 0x46, 0x4d, 0x5c, + 0x4d, 0x46, 0x4d, 0x46, 0x4d, 0x46, 0x4d, 0x61, 0x08, 0x0c, 0x0d, 0x85, + 0xa2, 0x76, 0xa3, 0x7a, 0xa4, 0x7e, 0x08, 0x98, 0xa2, 0x86, 0xa3, 0x8a, + 0xa4, 0x8e, 0x08, 0x78, 0xa2, 0x96, 0xa3, 0x9a, 0xa4, 0x9e, 0x08, 0x58, + 0xa2, 0xa6, 0xa3, 0xaa, 0xa4, 0xae, 0x08, 0x38, 0xa2, 0xb6, 0xa3, 0xba, + 0xa4, 0xbe, 0x08, 0x18, 0xa2, 0xc6, 0xa3, 0xca, 0xa4, 0xce, 0x08, 0x04, + 0x4d, 0x1f, 0xa2, 0xd6, 0xa3, 0xda, 0xa4, 0xde, 0x08, 0x04, 0x4d, 0x1f, + 0x00, 0xe6, 0x20, 0x71, 0x18, 0x9e, 0x70, 0x48, 0x90, 0x05, 0x09, 0x04, + 0x4d, 0xf8, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x0e, 0x04, 0x4d, 0xf7, + 0x00, 0xf6, 0x20, 0x79, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x96, 0x00, 0x86, + 0x00, 0x76, 0x90, 0x06, 0x20, 0x38, 0x70, 0x40, 0x20, 0x48, 0x90, 0x05, + 0x05, 0x00, 0xa9, 0x48, 0x21, 0x05, 0x00, 0x16, 0x90, 0x8a, 0x00, 0x36, + 0x1a, 0x0c, 0x0d, 0x85, 0x20, 0x60, 0x00, 0x1e, 0x81, 0x08, 0x21, 0x05, + 0x90, 0x05, 0xa9, 0x4a, 0x19, 0x04, 0x4d, 0xfa, 0xa8, 0x04, 0x90, 0x05, + 0x09, 0x0c, 0x0d, 0x85, 0x70, 0x42, 0x29, 0x38, 0x20, 0x40, 0xa0, 0x03, + 0x00, 0x00, 0x20, 0x01, 0x00, 0x02, 0x90, 0x80, 0x1e, 0xc1, 0x20, 0x05, + 0xa0, 0x4a, 0x08, 0x04, 0x4d, 0xfa, 0x70, 0x3c, 0x20, 0x60, 0x2c, 0x14, + 0x63, 0x04, 0x64, 0x08, 0x65, 0x0c, 0x22, 0x00, 0x78, 0x36, 0x78, 0x33, + 0x00, 0x12, 0x78, 0x82, 0x23, 0x00, 0x78, 0x86, 0x24, 0x00, 0x78, 0x8a, + 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, 0x00, 0x89, 0x20, 0x04, 0xd0, 0x84, + 0x19, 0x0c, 0x12, 0x00, 0x87, 0xff, 0x01, 0x18, 0x27, 0x48, 0x08, 0x0c, + 0x10, 0x8b, 0x70, 0x48, 0x80, 0x01, 0x70, 0x4a, 0x90, 0x05, 0x11, 0x70, + 0x70, 0x40, 0x20, 0x48, 0x90, 0x05, 0x01, 0x28, 0x08, 0x0c, 0x10, 0x8b, + 0x90, 0x06, 0x70, 0x42, 0x70, 0x46, 0x70, 0x3b, 0x18, 0xba, 0x70, 0x3f, + 0x18, 0xba, 0x04, 0x20, 0x70, 0x40, 0x90, 0x05, 0x15, 0x08, 0x72, 0x38, + 0x2c, 0x00, 0x92, 0x06, 0x01, 0x48, 0x9c, 0x80, 0x00, 0x04, 0x90, 0xfa, + 0x18, 0xfa, 0x02, 0x10, 0x20, 0x01, 0x18, 0xba, 0x70, 0x3e, 0x00, 0xa0, + 0x90, 0x06, 0x70, 0x3e, 0x70, 0x3a, 0x70, 0x44, 0x90, 0x05, 0x09, 0x0c, + 0x0d, 0x85, 0x20, 0x48, 0xa8, 0x00, 0x90, 0x05, 0x1d, 0xe0, 0x29, 0x00, + 0x70, 0x42, 0x20, 0x01, 0x00, 0x02, 0x90, 0x80, 0x1e, 0xc1, 0x20, 0x05, + 0xa8, 0x4a, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x8e, 0x00, 0x9e, 0x00, 0xce, + 0x00, 0xfe, 0x01, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x2c, 0x00, 0x90, 0x82, + 0x00, 0x1b, 0x00, 0x02, 0x4e, 0x19, 0x4e, 0x19, 0x4e, 0x1b, 0x4e, 0x19, + 0x4e, 0x19, 0x4e, 0x19, 0x4e, 0x20, 0x4e, 0x19, 0x4e, 0x19, 0x4e, 0x19, + 0x4e, 0x25, 0x4e, 0x19, 0x4e, 0x19, 0x4e, 0x19, 0x4e, 0x2a, 0x4e, 0x19, + 0x4e, 0x19, 0x4e, 0x19, 0x4e, 0x2f, 0x4e, 0x19, 0x4e, 0x19, 0x4e, 0x19, + 0x4e, 0x34, 0x4e, 0x19, 0x4e, 0x19, 0x4e, 0x19, 0x4e, 0x39, 0x08, 0x0c, + 0x0d, 0x85, 0xaa, 0x74, 0xab, 0x78, 0xac, 0x7c, 0x08, 0x04, 0x4d, 0xa5, + 0xaa, 0x84, 0xab, 0x88, 0xac, 0x8c, 0x08, 0x04, 0x4d, 0xa5, 0xaa, 0x94, + 0xab, 0x98, 0xac, 0x9c, 0x08, 0x04, 0x4d, 0xa5, 0xaa, 0xa4, 0xab, 0xa8, + 0xac, 0xac, 0x08, 0x04, 0x4d, 0xa5, 0xaa, 0xb4, 0xab, 0xb8, 0xac, 0xbc, + 0x08, 0x04, 0x4d, 0xa5, 0xaa, 0xc4, 0xab, 0xc8, 0xac, 0xcc, 0x08, 0x04, + 0x4d, 0xa5, 0xaa, 0xd4, 0xab, 0xd8, 0xac, 0xdc, 0x08, 0x04, 0x4d, 0xa5, + 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x00, 0xb6, 0x00, 0xc6, 0x20, 0x09, + 0x00, 0x7e, 0x08, 0x0c, 0x67, 0xb4, 0x20, 0x19, 0x00, 0x01, 0xb8, 0x5c, + 0xd0, 0xac, 0x01, 0x10, 0x20, 0x19, 0x00, 0x00, 0x20, 0x11, 0x80, 0x1b, + 0x08, 0x0c, 0x4c, 0xa1, 0x00, 0xce, 0x00, 0xbe, 0x00, 0x3e, 0x00, 0x2e, + 0x00, 0x1e, 0x00, 0x05, 0x00, 0x26, 0x08, 0x0c, 0x58, 0x40, 0xd0, 0xc4, + 0x01, 0x20, 0x20, 0x11, 0x80, 0x14, 0x08, 0x0c, 0x4c, 0xa1, 0x00, 0x2e, + 0x00, 0x05, 0x81, 0xff, 0x19, 0x04, 0x36, 0xbf, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x60, 0x30, 0xc0, 0x8d, 0xc0, 0x85, 0xc0, 0xac, 0x60, 0x32, + 0x08, 0x0c, 0x77, 0x9e, 0x11, 0x58, 0x08, 0x0c, 0x7a, 0xb6, 0x08, 0x0c, + 0x61, 0x9d, 0x90, 0x85, 0x00, 0x01, 0x08, 0x0c, 0x77, 0xe2, 0x08, 0x0c, + 0x76, 0xcd, 0x00, 0x10, 0x08, 0x0c, 0x60, 0x58, 0x01, 0x2e, 0x08, 0x04, + 0x36, 0x8d, 0x81, 0xff, 0x01, 0x20, 0x20, 0x09, 0x00, 0x01, 0x08, 0x04, + 0x36, 0xbf, 0x08, 0x0c, 0x58, 0x54, 0x01, 0x20, 0x20, 0x09, 0x00, 0x07, + 0x08, 0x04, 0x36, 0xbf, 0x08, 0x0c, 0x6c, 0x09, 0x01, 0x20, 0x20, 0x09, + 0x00, 0x08, 0x08, 0x04, 0x36, 0xbf, 0x20, 0x01, 0x18, 0x0d, 0x20, 0x04, + 0xd0, 0x8c, 0x01, 0x78, 0x00, 0x26, 0x20, 0x11, 0x00, 0x10, 0x08, 0x0c, + 0x6c, 0x35, 0x00, 0x2e, 0x01, 0x40, 0x79, 0x84, 0x08, 0x0c, 0x6c, 0x7f, + 0x11, 0x20, 0x20, 0x09, 0x40, 0x09, 0x08, 0x04, 0x36, 0xbf, 0x79, 0x84, + 0x08, 0x0c, 0x67, 0x49, 0x19, 0x04, 0x36, 0xc2, 0x08, 0x0c, 0x4c, 0x74, + 0x09, 0x04, 0x36, 0xc2, 0x2b, 0x00, 0x70, 0x26, 0x08, 0x0c, 0x6c, 0x11, + 0x78, 0x88, 0x11, 0x70, 0x90, 0x84, 0x00, 0x05, 0x11, 0x58, 0x90, 0x0e, + 0x08, 0x0c, 0x6a, 0xae, 0x11, 0x08, 0xc1, 0x85, 0xb8, 0x00, 0xd0, 0xbc, + 0x01, 0x08, 0xc1, 0x8d, 0x08, 0x04, 0x36, 0x8d, 0x08, 0x0c, 0x4c, 0x41, + 0x09, 0x04, 0x36, 0xbf, 0x90, 0x06, 0xa8, 0x66, 0xa8, 0x32, 0xa8, 0x68, + 0xc0, 0xfd, 0xa8, 0x6a, 0x08, 0x0c, 0xd1, 0x54, 0x09, 0x04, 0x36, 0xbf, + 0x78, 0x88, 0xd0, 0x94, 0x01, 0x18, 0xb8, 0xd4, 0xc0, 0x8d, 0xb8, 0xd6, + 0x70, 0x07, 0x00, 0x03, 0x70, 0x1f, 0x4f, 0x28, 0x00, 0x05, 0x20, 0x61, + 0x18, 0x00, 0x08, 0x0c, 0x58, 0x54, 0x20, 0x09, 0x00, 0x07, 0x15, 0x60, + 0x08, 0x0c, 0x6c, 0x09, 0x01, 0x18, 0x20, 0x09, 0x00, 0x08, 0x04, 0x30, + 0xa9, 0x98, 0x08, 0x0c, 0x67, 0x49, 0x15, 0x30, 0x08, 0x0c, 0x4c, 0x72, + 0x05, 0x18, 0x08, 0x0c, 0x6c, 0x11, 0xa8, 0x9c, 0x11, 0x68, 0x90, 0x84, + 0x00, 0x05, 0x11, 0x50, 0x90, 0x0e, 0x08, 0x0c, 0x6a, 0xae, 0x11, 0x08, + 0xc1, 0x85, 0xb8, 0x00, 0xd0, 0xbc, 0x01, 0x08, 0xc1, 0x8d, 0x00, 0xd0, + 0xa8, 0x68, 0xc0, 0xfc, 0xa8, 0x6a, 0x08, 0x0c, 0xd1, 0x54, 0x11, 0xe0, + 0xa8, 0x9c, 0xd0, 0x94, 0x01, 0x18, 0xb8, 0xd4, 0xc0, 0x8d, 0xb8, 0xd6, + 0x20, 0x09, 0x00, 0x03, 0xa8, 0x97, 0x40, 0x05, 0xa9, 0x9a, 0x00, 0x10, + 0xa8, 0x97, 0x40, 0x06, 0x90, 0x0e, 0x90, 0x85, 0x00, 0x01, 0x20, 0x01, + 0x00, 0x30, 0x00, 0x05, 0xa8, 0x97, 0x40, 0x00, 0xa9, 0x9a, 0x90, 0x06, + 0x91, 0x8d, 0x00, 0x01, 0x20, 0x08, 0x00, 0x05, 0x90, 0x06, 0x00, 0x05, + 0xa8, 0x30, 0x20, 0x09, 0x18, 0x0d, 0x21, 0x0c, 0xd1, 0x8c, 0x01, 0x40, + 0x20, 0x08, 0x91, 0x8e, 0xde, 0xad, 0x11, 0x20, 0x20, 0x21, 0x40, 0x09, + 0x08, 0x04, 0x36, 0x8f, 0x90, 0x86, 0x01, 0x00, 0x70, 0x24, 0x20, 0x58, + 0x11, 0x10, 0x08, 0x04, 0x57, 0x8e, 0x90, 0x0e, 0x08, 0x0c, 0x6a, 0xae, + 0x11, 0x08, 0xc1, 0x85, 0xb8, 0x00, 0xd0, 0xbc, 0x01, 0x08, 0xc1, 0x8d, + 0x08, 0x04, 0x36, 0x8d, 0x08, 0x0c, 0x58, 0x54, 0x01, 0x20, 0x20, 0x09, + 0x00, 0x07, 0x08, 0x04, 0x36, 0xbf, 0x7f, 0x84, 0x7a, 0x8c, 0x7b, 0x88, + 0x7c, 0x9c, 0x7d, 0x98, 0x08, 0x0c, 0x4c, 0x41, 0x11, 0x20, 0x20, 0x09, + 0x00, 0x02, 0x08, 0x04, 0x36, 0xbf, 0x90, 0x0e, 0x21, 0x30, 0x71, 0x26, + 0x71, 0x32, 0xa8, 0x60, 0x20, 0xe8, 0x70, 0x36, 0xa8, 0x5c, 0x90, 0x80, + 0x00, 0x05, 0x70, 0x2a, 0x20, 0xa0, 0x08, 0x0c, 0x67, 0xb4, 0x19, 0x04, + 0x4f, 0xde, 0x08, 0x0c, 0x6c, 0x11, 0x01, 0x38, 0x08, 0x0c, 0x6c, 0x19, + 0x01, 0x20, 0x08, 0x0c, 0x6b, 0xb1, 0x19, 0x04, 0x4f, 0xde, 0xd7, 0x94, + 0x11, 0x10, 0xd7, 0x84, 0x01, 0xa8, 0xb8, 0xc4, 0x20, 0xe0, 0xb8, 0xc8, + 0x90, 0x80, 0x00, 0x06, 0x20, 0x98, 0x34, 0x00, 0xd7, 0x94, 0x01, 0x98, + 0x20, 0xa9, 0x00, 0x08, 0x40, 0x03, 0x20, 0x98, 0x20, 0xa0, 0x3d, 0x00, + 0x20, 0xe0, 0x20, 0xa9, 0x00, 0x02, 0x08, 0x0c, 0x4a, 0x10, 0x00, 0x80, + 0xb8, 0xc4, 0x20, 0xe0, 0xb8, 0xc8, 0x90, 0x80, 0x00, 0x0a, 0x20, 0x98, + 0x34, 0x00, 0x20, 0xa9, 0x00, 0x04, 0x40, 0x03, 0x20, 0x98, 0x20, 0xa0, + 0x3d, 0x00, 0x20, 0xe0, 0x08, 0x0c, 0x4a, 0x10, 0x91, 0x86, 0x00, 0x7e, + 0x01, 0x70, 0x91, 0x86, 0x00, 0x80, 0x01, 0x58, 0x08, 0x0c, 0x6c, 0x11, + 0x90, 0xc2, 0x00, 0x06, 0x12, 0x10, 0xc1, 0xfd, 0x00, 0x20, 0x08, 0x0c, + 0x6a, 0xae, 0x11, 0x08, 0xc1, 0xfd, 0x41, 0x04, 0xc1, 0xfc, 0xd7, 0x94, + 0x05, 0x28, 0xb8, 0xc4, 0x20, 0xe0, 0xb8, 0xc8, 0x20, 0x60, 0x9c, 0x80, + 0x00, 0x00, 0x20, 0x98, 0x20, 0xa9, 0x00, 0x02, 0x40, 0x03, 0x9c, 0x80, + 0x00, 0x03, 0x20, 0x98, 0x20, 0xa9, 0x00, 0x01, 0x40, 0x05, 0x9c, 0x80, + 0x00, 0x04, 0x20, 0x98, 0x34, 0x00, 0x20, 0xa9, 0x00, 0x02, 0x40, 0x03, + 0x20, 0x98, 0x20, 0xa0, 0x3d, 0x00, 0x20, 0xe0, 0x08, 0x0c, 0x4a, 0x03, + 0x9c, 0x80, 0x00, 0x26, 0x20, 0x98, 0xb8, 0xc4, 0x20, 0xe0, 0x20, 0xa9, + 0x00, 0x02, 0x40, 0x03, 0xd7, 0x94, 0x01, 0x10, 0x96, 0xb0, 0x00, 0x0b, + 0x96, 0xb0, 0x00, 0x05, 0x81, 0x08, 0x08, 0x0c, 0xb0, 0x94, 0x01, 0x18, + 0x91, 0x86, 0x08, 0x00, 0x00, 0x40, 0xd7, 0x8c, 0x01, 0x20, 0x91, 0x86, + 0x08, 0x00, 0x01, 0x70, 0x00, 0x18, 0x91, 0x86, 0x00, 0x7e, 0x01, 0x50, + 0xd7, 0x94, 0x01, 0x18, 0x96, 0x86, 0x00, 0x20, 0x00, 0x10, 0x96, 0x86, + 0x00, 0x28, 0x01, 0x50, 0x08, 0x04, 0x4f, 0x67, 0x86, 0xff, 0x11, 0x20, + 0x71, 0x24, 0x81, 0x0b, 0x08, 0x04, 0x36, 0x8d, 0x70, 0x33, 0x00, 0x01, + 0x71, 0x22, 0x70, 0x24, 0x96, 0x00, 0x70, 0x26, 0x77, 0x2e, 0x20, 0x61, + 0x18, 0xb8, 0x2c, 0x44, 0xa0, 0x6b, 0x00, 0x00, 0xa6, 0x7a, 0x70, 0x34, + 0xa0, 0x72, 0x70, 0x28, 0xa0, 0x76, 0xa2, 0x8e, 0xa3, 0x92, 0xa4, 0x96, + 0xa5, 0x9a, 0x08, 0x0c, 0x11, 0x4e, 0x70, 0x07, 0x00, 0x02, 0x70, 0x1f, + 0x50, 0x1a, 0x00, 0x05, 0x70, 0x30, 0x90, 0x05, 0x11, 0x80, 0x71, 0x20, + 0x70, 0x28, 0x20, 0xa0, 0x77, 0x2c, 0x90, 0x36, 0x70, 0x34, 0x20, 0xe8, + 0x20, 0x61, 0x18, 0xb8, 0x2c, 0x44, 0xa2, 0x8c, 0xa3, 0x90, 0xa4, 0x94, + 0xa5, 0x98, 0x08, 0x04, 0x4f, 0x67, 0x71, 0x24, 0x81, 0x0b, 0x08, 0x04, + 0x36, 0x8d, 0x20, 0x29, 0x00, 0x7e, 0x79, 0x84, 0x7a, 0x88, 0x7b, 0x8c, + 0x7c, 0x98, 0x91, 0x84, 0xff, 0x00, 0x80, 0x07, 0x90, 0xe2, 0x00, 0x20, + 0x0a, 0x04, 0x36, 0xc2, 0x95, 0x02, 0x0a, 0x04, 0x36, 0xc2, 0x91, 0x84, + 0x00, 0xff, 0x90, 0xe2, 0x00, 0x20, 0x0a, 0x04, 0x36, 0xc2, 0x95, 0x02, + 0x0a, 0x04, 0x36, 0xc2, 0x92, 0x84, 0xff, 0x00, 0x80, 0x07, 0x90, 0xe2, + 0x00, 0x20, 0x0a, 0x04, 0x36, 0xc2, 0x95, 0x02, 0x0a, 0x04, 0x36, 0xc2, + 0x92, 0x84, 0x00, 0xff, 0x90, 0xe2, 0x00, 0x20, 0x0a, 0x04, 0x36, 0xc2, + 0x95, 0x02, 0x0a, 0x04, 0x36, 0xc2, 0x93, 0x84, 0xff, 0x00, 0x80, 0x07, + 0x90, 0xe2, 0x00, 0x20, 0x0a, 0x04, 0x36, 0xc2, 0x95, 0x02, 0x0a, 0x04, + 0x36, 0xc2, 0x93, 0x84, 0x00, 0xff, 0x90, 0xe2, 0x00, 0x20, 0x0a, 0x04, + 0x36, 0xc2, 0x95, 0x02, 0x0a, 0x04, 0x36, 0xc2, 0x94, 0x84, 0xff, 0x00, + 0x80, 0x07, 0x90, 0xe2, 0x00, 0x20, 0x0a, 0x04, 0x36, 0xc2, 0x95, 0x02, + 0x0a, 0x04, 0x36, 0xc2, 0x94, 0x84, 0x00, 0xff, 0x90, 0xe2, 0x00, 0x20, + 0x0a, 0x04, 0x36, 0xc2, 0x95, 0x02, 0x0a, 0x04, 0x36, 0xc2, 0x20, 0x61, + 0x19, 0x89, 0x61, 0x02, 0x62, 0x06, 0x63, 0x0a, 0x64, 0x0e, 0x08, 0x04, + 0x36, 0x8d, 0x08, 0x0c, 0x4c, 0x41, 0x09, 0x04, 0x36, 0xbf, 0x20, 0x09, + 0x00, 0x16, 0x7a, 0x8c, 0x7b, 0x88, 0x7c, 0x9c, 0x7d, 0x98, 0xa8, 0x5c, + 0x90, 0x80, 0x00, 0x19, 0xaf, 0x60, 0x08, 0x0c, 0x4c, 0x8a, 0x70, 0x1f, + 0x50, 0x9e, 0x00, 0x05, 0x20, 0xa9, 0x00, 0x16, 0x89, 0x6e, 0x8d, 0x6e, + 0x8d, 0x6f, 0x9d, 0x84, 0xff, 0xc0, 0x90, 0x80, 0x00, 0x19, 0x20, 0x98, + 0x9d, 0x84, 0x00, 0x3f, 0x20, 0xe0, 0x20, 0x69, 0x18, 0x77, 0x20, 0xe9, + 0x00, 0x01, 0x2d, 0xa0, 0x40, 0x03, 0x68, 0x00, 0x90, 0x05, 0x09, 0x04, + 0x51, 0x05, 0x68, 0x04, 0x20, 0x08, 0x91, 0x8c, 0xff, 0xf8, 0x19, 0x04, + 0x51, 0x05, 0x68, 0x0c, 0x90, 0x05, 0x09, 0x04, 0x51, 0x05, 0x90, 0x82, + 0xff, 0x01, 0x1a, 0x04, 0x51, 0x05, 0x68, 0x10, 0x90, 0x82, 0x00, 0x5c, + 0x06, 0xf0, 0x68, 0x24, 0x20, 0x08, 0x90, 0x82, 0x00, 0x08, 0x06, 0xc8, + 0x91, 0x82, 0x04, 0x00, 0x16, 0xb0, 0x00, 0x56, 0x20, 0x29, 0x00, 0x00, + 0x08, 0x0c, 0x90, 0x77, 0x00, 0x5e, 0x69, 0x44, 0x68, 0x20, 0x91, 0x02, + 0x06, 0x60, 0x68, 0x20, 0x90, 0x82, 0x00, 0x19, 0x16, 0x40, 0x68, 0x28, + 0x69, 0x44, 0x81, 0x0c, 0x91, 0x02, 0x06, 0x18, 0x68, 0x40, 0x90, 0x82, + 0x00, 0x0f, 0x12, 0xf8, 0x08, 0x0c, 0x10, 0x72, 0x29, 0x00, 0x05, 0x90, + 0x68, 0x4e, 0x00, 0xe6, 0x20, 0x71, 0x19, 0x31, 0x00, 0xb6, 0x20, 0x59, + 0x00, 0x00, 0x08, 0x0c, 0x8f, 0x33, 0x00, 0xbe, 0x00, 0xee, 0x01, 0xe8, + 0x08, 0x0c, 0x8c, 0x78, 0x08, 0x0c, 0x8c, 0xc7, 0x11, 0x60, 0x68, 0x57, + 0x00, 0x00, 0x00, 0xc6, 0x6b, 0x10, 0x20, 0x61, 0x1a, 0x6e, 0x63, 0x0e, + 0x00, 0xce, 0x08, 0x04, 0x36, 0x8d, 0x08, 0x04, 0x36, 0xc2, 0x08, 0x0c, + 0x8c, 0xc0, 0x00, 0xe6, 0x20, 0x71, 0x19, 0x31, 0x08, 0x0c, 0x90, 0xf7, + 0x08, 0x0c, 0x91, 0x06, 0x08, 0x0c, 0x8f, 0x18, 0x00, 0xee, 0x20, 0x01, + 0x18, 0x8a, 0x20, 0x4c, 0x08, 0x0c, 0x10, 0x8b, 0x20, 0x01, 0x18, 0x8a, + 0x20, 0x03, 0x00, 0x00, 0x08, 0x04, 0x36, 0xbf, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0x94, 0xb8, 0x08, 0x0c, 0x8c, 0xc0, 0x01, 0x2e, + 0x08, 0x04, 0x36, 0x8d, 0x00, 0x06, 0x08, 0x0c, 0x58, 0x40, 0xd0, 0xcc, + 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, 0x08, 0x0c, 0x58, 0x44, 0xd0, 0xbc, + 0x00, 0x0e, 0x00, 0x05, 0x61, 0x74, 0x7a, 0x84, 0x63, 0x00, 0x82, 0xff, + 0x11, 0x18, 0x79, 0x86, 0x08, 0x04, 0x36, 0x8d, 0x83, 0xff, 0x19, 0x04, + 0x36, 0xc2, 0x20, 0x01, 0xff, 0xf0, 0x92, 0x00, 0x1a, 0x04, 0x36, 0xc2, + 0x20, 0x19, 0xff, 0xff, 0x60, 0x78, 0x93, 0x02, 0x92, 0x00, 0x0a, 0x04, + 0x36, 0xc2, 0x79, 0x86, 0x62, 0x76, 0x08, 0x04, 0x36, 0x8d, 0x08, 0x0c, + 0x58, 0x54, 0x19, 0x04, 0x36, 0xbf, 0x7c, 0x88, 0x7d, 0x84, 0x7e, 0x98, + 0x7f, 0x8c, 0x08, 0x0c, 0x4c, 0x41, 0x09, 0x04, 0x36, 0xbf, 0x90, 0x0e, + 0x90, 0x1e, 0x73, 0x26, 0x73, 0x32, 0xa8, 0x60, 0x20, 0xe8, 0x70, 0x36, + 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x03, 0x70, 0x2a, 0x20, 0xa0, 0x91, 0xd8, + 0x10, 0x00, 0x2b, 0x5c, 0x8b, 0xff, 0x01, 0x78, 0x08, 0x0c, 0x6c, 0x11, + 0x01, 0x18, 0x08, 0x0c, 0x6c, 0x19, 0x11, 0x48, 0x20, 0xa9, 0x00, 0x01, + 0xb8, 0x14, 0x40, 0x04, 0xb8, 0x10, 0x40, 0x04, 0x41, 0x04, 0x93, 0x98, + 0x00, 0x03, 0x81, 0x08, 0x91, 0x82, 0x08, 0x00, 0x01, 0x20, 0x93, 0x86, + 0x00, 0x3c, 0x01, 0x70, 0x0c, 0x20, 0x83, 0xff, 0x11, 0x48, 0x72, 0x24, + 0x90, 0x0e, 0x20, 0x01, 0x00, 0x03, 0x08, 0x0c, 0x95, 0x5b, 0x22, 0x08, + 0x08, 0x04, 0x36, 0x8d, 0x70, 0x33, 0x00, 0x01, 0x71, 0x22, 0x70, 0x24, + 0x93, 0x00, 0x70, 0x26, 0x20, 0x61, 0x18, 0xb8, 0x2c, 0x44, 0xa0, 0x6b, + 0x00, 0x00, 0xa3, 0x7a, 0x70, 0x28, 0xa0, 0x76, 0x70, 0x34, 0xa0, 0x72, + 0xa4, 0x8e, 0xa5, 0x92, 0xa6, 0x96, 0xa7, 0x9a, 0x08, 0x0c, 0x11, 0x4e, + 0x70, 0x07, 0x00, 0x02, 0x70, 0x1f, 0x51, 0xa9, 0x00, 0x05, 0x70, 0x30, + 0x90, 0x05, 0x11, 0x78, 0x71, 0x20, 0x70, 0x28, 0x20, 0xa0, 0x90, 0x1e, + 0x70, 0x34, 0x20, 0xe8, 0x20, 0x61, 0x18, 0xb8, 0x2c, 0x44, 0xa4, 0x8c, + 0xa5, 0x90, 0xa6, 0x94, 0xa7, 0x98, 0x08, 0x04, 0x51, 0x67, 0x72, 0x24, + 0x90, 0x0e, 0x20, 0x01, 0x00, 0x03, 0x08, 0x0c, 0x95, 0x5b, 0x22, 0x08, + 0x08, 0x04, 0x36, 0x8d, 0x00, 0xf6, 0x00, 0xe6, 0x08, 0x0c, 0x58, 0x54, + 0x20, 0x09, 0x00, 0x07, 0x19, 0x04, 0x52, 0x3c, 0x20, 0x71, 0x18, 0x9e, + 0x74, 0x5c, 0x84, 0xff, 0x20, 0x09, 0x00, 0x0e, 0x19, 0x04, 0x52, 0x3c, + 0xac, 0x9c, 0xad, 0x98, 0xae, 0xa4, 0xaf, 0xa0, 0x00, 0x96, 0x08, 0x0c, + 0x10, 0x72, 0x20, 0x09, 0x00, 0x02, 0x09, 0x04, 0x52, 0x3c, 0x29, 0x00, + 0x70, 0x5e, 0x90, 0x0e, 0x90, 0x1e, 0x73, 0x56, 0x73, 0x62, 0xa8, 0x60, + 0x70, 0x66, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x03, 0x70, 0x5a, 0x20, 0xa0, + 0x91, 0xd8, 0x10, 0x00, 0x2b, 0x5c, 0x8b, 0xff, 0x01, 0x78, 0x08, 0x0c, + 0x6c, 0x11, 0x01, 0x18, 0x08, 0x0c, 0x6c, 0x19, 0x11, 0x48, 0xb8, 0x14, + 0x20, 0xa9, 0x00, 0x01, 0x40, 0x04, 0xb8, 0x10, 0x40, 0x04, 0x41, 0x04, + 0x93, 0x98, 0x00, 0x03, 0x81, 0x08, 0x91, 0x82, 0x08, 0x00, 0x01, 0x20, + 0x93, 0x86, 0x00, 0x3c, 0x01, 0xe8, 0x0c, 0x20, 0x83, 0xff, 0x11, 0xc0, + 0x72, 0x54, 0x90, 0x0e, 0x20, 0x01, 0x00, 0x03, 0x08, 0x0c, 0x95, 0x5b, + 0x22, 0x08, 0x00, 0x9e, 0xa8, 0x97, 0x40, 0x00, 0xa9, 0x9a, 0x71, 0x5c, + 0x81, 0xff, 0x09, 0x0c, 0x0d, 0x85, 0x21, 0x48, 0x08, 0x0c, 0x10, 0x8b, + 0x90, 0x06, 0x70, 0x5e, 0x91, 0x8d, 0x00, 0x01, 0x20, 0x08, 0x04, 0x18, + 0x70, 0x63, 0x00, 0x01, 0x71, 0x52, 0x70, 0x54, 0x93, 0x00, 0x70, 0x56, + 0x20, 0x61, 0x18, 0xb9, 0x2c, 0x44, 0xa3, 0x7a, 0x70, 0x58, 0xa0, 0x76, + 0x70, 0x64, 0xa0, 0x72, 0xa4, 0x8e, 0xa5, 0x92, 0xa6, 0x96, 0xa7, 0x9a, + 0xa0, 0x9f, 0x52, 0x48, 0x00, 0x0e, 0xa0, 0xa2, 0x08, 0x0c, 0x11, 0x4e, + 0x90, 0x06, 0x00, 0x48, 0x00, 0x9e, 0xa8, 0x97, 0x40, 0x05, 0xa9, 0x9a, + 0x90, 0x0e, 0x90, 0x85, 0x00, 0x01, 0x20, 0x01, 0x00, 0x30, 0x00, 0xee, + 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, 0xa0, 0xa0, 0x90, 0x4d, 0x09, 0x0c, + 0x0d, 0x85, 0x00, 0xe6, 0x20, 0x71, 0x18, 0x9e, 0xa0, 0x6c, 0x90, 0x8e, + 0x01, 0x00, 0x01, 0x38, 0xa8, 0x7b, 0x00, 0x30, 0xa8, 0x83, 0x00, 0x00, + 0xa8, 0x97, 0x40, 0x02, 0x00, 0xd8, 0x70, 0x60, 0x90, 0x05, 0x11, 0x58, + 0x71, 0x50, 0x70, 0x58, 0x20, 0xa0, 0x90, 0x1e, 0x70, 0x64, 0x20, 0xe8, + 0xa4, 0x8c, 0xa5, 0x90, 0xa6, 0x94, 0xa7, 0x98, 0x04, 0x28, 0xa8, 0x7b, + 0x00, 0x00, 0xa8, 0x83, 0x00, 0x00, 0xa8, 0x97, 0x40, 0x00, 0x72, 0x54, + 0x90, 0x0e, 0x20, 0x01, 0x00, 0x03, 0x08, 0x0c, 0x95, 0x5b, 0xaa, 0x9a, + 0x71, 0x5c, 0x81, 0xff, 0x09, 0x0c, 0x0d, 0x85, 0x21, 0x48, 0x08, 0x0c, + 0x10, 0x8b, 0x70, 0x5f, 0x00, 0x00, 0xa0, 0xa0, 0x20, 0x48, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x70, 0x12, 0x01, 0x2e, 0xa0, 0x9f, + 0x00, 0x00, 0xa0, 0xa3, 0x00, 0x00, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, + 0x91, 0xd8, 0x10, 0x00, 0x2b, 0x5c, 0x8b, 0xff, 0x01, 0x78, 0x08, 0x0c, + 0x6c, 0x11, 0x01, 0x18, 0x08, 0x0c, 0x6c, 0x19, 0x11, 0x48, 0xb8, 0x14, + 0x20, 0xa9, 0x00, 0x01, 0x40, 0x04, 0xb8, 0x10, 0x40, 0x04, 0x41, 0x04, + 0x93, 0x98, 0x00, 0x03, 0x81, 0x08, 0x91, 0x82, 0x08, 0x00, 0x01, 0x20, + 0x93, 0x86, 0x00, 0x3c, 0x05, 0x18, 0x0c, 0x20, 0x83, 0xff, 0x11, 0xf0, + 0x71, 0x54, 0x81, 0x0c, 0xa9, 0x9a, 0xa8, 0x97, 0x40, 0x00, 0x71, 0x5c, + 0x81, 0xff, 0x09, 0x0c, 0x0d, 0x85, 0x21, 0x48, 0x08, 0x0c, 0x10, 0x8b, + 0x90, 0x06, 0x70, 0x5e, 0x91, 0x8d, 0x00, 0x01, 0x20, 0x08, 0xa0, 0xa0, + 0x20, 0x48, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x70, 0x12, + 0x01, 0x2e, 0xa0, 0x9f, 0x00, 0x00, 0xa0, 0xa3, 0x00, 0x00, 0x00, 0x70, + 0x70, 0x63, 0x00, 0x01, 0x71, 0x52, 0x70, 0x54, 0x93, 0x00, 0x70, 0x56, + 0xa3, 0x7a, 0xa4, 0x8e, 0xa5, 0x92, 0xa6, 0x96, 0xa7, 0x9a, 0x08, 0x0c, + 0x11, 0x4e, 0x90, 0x06, 0x00, 0xee, 0x00, 0x05, 0x00, 0x96, 0xa8, 0x8c, + 0x90, 0xbe, 0x70, 0x00, 0x01, 0x48, 0x90, 0xbe, 0x71, 0x00, 0x01, 0x30, + 0x90, 0xbe, 0x72, 0x00, 0x01, 0x18, 0x00, 0x9e, 0x08, 0x04, 0x36, 0xc2, + 0xa8, 0x84, 0xa9, 0x88, 0x08, 0x0c, 0x26, 0x8c, 0x15, 0x18, 0x08, 0x0c, + 0x67, 0x49, 0x15, 0x00, 0x71, 0x26, 0xbe, 0x12, 0xbd, 0x16, 0xae, 0x7c, + 0x08, 0x0c, 0x4c, 0x41, 0x01, 0xc8, 0x08, 0x0c, 0x4c, 0x41, 0x01, 0xb0, + 0x00, 0x9e, 0xa8, 0x67, 0x00, 0x00, 0xa8, 0x68, 0xc0, 0xfd, 0xa8, 0x6a, + 0xa8, 0x23, 0x00, 0x00, 0xa8, 0x04, 0x20, 0x48, 0x08, 0x0c, 0xd0, 0xcd, + 0x11, 0x20, 0x20, 0x09, 0x00, 0x03, 0x08, 0x04, 0x36, 0xbf, 0x70, 0x07, + 0x00, 0x03, 0x70, 0x1f, 0x53, 0x15, 0x00, 0x05, 0x00, 0x9e, 0x20, 0x09, + 0x00, 0x02, 0x08, 0x04, 0x36, 0xbf, 0x71, 0x24, 0x08, 0x0c, 0x34, 0x1e, + 0xa8, 0x20, 0x90, 0x86, 0x80, 0x01, 0x11, 0x20, 0x20, 0x09, 0x00, 0x04, + 0x08, 0x04, 0x36, 0xbf, 0x29, 0x00, 0x70, 0x22, 0xa8, 0x04, 0x00, 0x96, + 0x20, 0x48, 0x89, 0x06, 0x80, 0x06, 0x80, 0x07, 0x90, 0xbc, 0x00, 0x3f, + 0x90, 0x84, 0xff, 0xc0, 0x00, 0x9e, 0x90, 0x80, 0x00, 0x02, 0x00, 0x76, + 0x00, 0x06, 0x20, 0x98, 0x20, 0xa0, 0x27, 0xe0, 0x27, 0xe8, 0x20, 0xa9, + 0x00, 0x2a, 0x08, 0x0c, 0x0f, 0xd6, 0xaa, 0x6c, 0xab, 0x70, 0xac, 0x74, + 0xad, 0x78, 0x20, 0x61, 0x18, 0xb8, 0x2c, 0x44, 0xa0, 0x6b, 0x00, 0x00, + 0xae, 0x64, 0xaf, 0x8c, 0x97, 0xc6, 0x70, 0x00, 0x01, 0x18, 0x97, 0xc6, + 0x71, 0x00, 0x11, 0x48, 0x96, 0xc2, 0x00, 0x04, 0x06, 0x00, 0x20, 0x09, + 0x00, 0x04, 0x00, 0x0e, 0x00, 0x7e, 0x08, 0x04, 0x4c, 0x8d, 0x97, 0xc6, + 0x72, 0x00, 0x11, 0xb8, 0x96, 0xc2, 0x00, 0x54, 0x02, 0xa0, 0x00, 0x0e, + 0x00, 0x7e, 0x20, 0x61, 0x18, 0xb8, 0x2c, 0x44, 0xa0, 0x76, 0xa7, 0x72, + 0xa0, 0x7b, 0x00, 0x2a, 0xa2, 0x8e, 0xa3, 0x92, 0xa4, 0x96, 0xa5, 0x9a, + 0x08, 0x0c, 0x11, 0x4e, 0x70, 0x07, 0x00, 0x02, 0x70, 0x1f, 0x53, 0x71, + 0x00, 0x05, 0x00, 0x0e, 0x00, 0x7e, 0x08, 0x04, 0x36, 0xc2, 0x70, 0x20, + 0x20, 0x48, 0xa8, 0x04, 0x20, 0x48, 0xa8, 0x04, 0x20, 0x48, 0x89, 0x06, + 0x80, 0x06, 0x80, 0x07, 0x90, 0xbc, 0x00, 0x3f, 0x90, 0x84, 0xff, 0xc0, + 0x90, 0x80, 0x00, 0x02, 0x20, 0x98, 0x20, 0xa0, 0x27, 0xe0, 0x27, 0xe8, + 0x20, 0xa9, 0x00, 0x2a, 0x08, 0x0c, 0x0f, 0xd6, 0x21, 0x00, 0x22, 0x38, + 0x20, 0x61, 0x18, 0xb8, 0x2c, 0x44, 0xa2, 0x8c, 0xa3, 0x90, 0xa4, 0x94, + 0xa5, 0x98, 0x20, 0x09, 0x00, 0x2a, 0x08, 0x04, 0x4c, 0x8d, 0x81, 0xff, + 0x19, 0x04, 0x36, 0xbf, 0x79, 0x8c, 0x20, 0x01, 0x19, 0x7e, 0x91, 0x8c, + 0x80, 0x00, 0x21, 0x02, 0x08, 0x0c, 0x4c, 0x58, 0x09, 0x04, 0x36, 0xc2, + 0x08, 0x0c, 0x6c, 0x11, 0x01, 0x20, 0x08, 0x0c, 0x6c, 0x19, 0x19, 0x04, + 0x36, 0xc2, 0x08, 0x0c, 0x68, 0x7b, 0x09, 0x04, 0x36, 0xbf, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x6a, 0x1b, 0x01, 0x2e, 0x09, 0x04, + 0x36, 0xbf, 0x20, 0x01, 0x19, 0x7e, 0x20, 0x04, 0xd0, 0xfc, 0x19, 0x04, + 0x36, 0x8d, 0x08, 0x04, 0x46, 0xaa, 0xa9, 0xa0, 0x20, 0x01, 0x19, 0x7e, + 0x91, 0x8c, 0x80, 0x00, 0xc1, 0x8d, 0x21, 0x02, 0x08, 0x0c, 0x4c, 0x65, + 0x01, 0xa0, 0x08, 0x0c, 0x6c, 0x11, 0x01, 0x18, 0x08, 0x0c, 0x6c, 0x19, + 0x11, 0x70, 0x08, 0x0c, 0x68, 0x7b, 0x20, 0x09, 0x00, 0x02, 0x01, 0x28, + 0x08, 0x0c, 0x6a, 0x1b, 0x11, 0x70, 0x20, 0x09, 0x00, 0x03, 0xa8, 0x97, + 0x40, 0x05, 0xa9, 0x9a, 0x00, 0x10, 0xa8, 0x97, 0x40, 0x06, 0x90, 0x0e, + 0x90, 0x85, 0x00, 0x01, 0x20, 0x01, 0x00, 0x30, 0x00, 0x05, 0xa8, 0x97, + 0x40, 0x00, 0x20, 0x01, 0x19, 0x7e, 0x20, 0x04, 0xd0, 0xfc, 0x11, 0x28, + 0x08, 0x0c, 0x58, 0x48, 0x01, 0x10, 0x90, 0x06, 0x00, 0x18, 0x90, 0x0e, + 0x90, 0x85, 0x00, 0x01, 0x20, 0x01, 0x00, 0x00, 0x00, 0x05, 0x78, 0xa8, + 0xd0, 0x8c, 0x11, 0x18, 0xd0, 0x84, 0x09, 0x04, 0x46, 0x1f, 0x08, 0x0c, + 0x4c, 0x74, 0x09, 0x04, 0x36, 0xc2, 0x08, 0x0c, 0x4c, 0x41, 0x11, 0x20, + 0x20, 0x09, 0x00, 0x02, 0x08, 0x04, 0x36, 0xbf, 0x08, 0x0c, 0x6c, 0x11, + 0x01, 0x30, 0x90, 0x8e, 0x00, 0x04, 0x01, 0x18, 0x90, 0x8e, 0x00, 0x05, + 0x15, 0xa0, 0x78, 0xa8, 0xd0, 0x8c, 0x01, 0x20, 0xb8, 0x00, 0xc0, 0x8c, + 0xb8, 0x02, 0x00, 0x28, 0x08, 0x0c, 0x58, 0x40, 0xd0, 0xb4, 0x09, 0x04, + 0x46, 0x59, 0x78, 0x84, 0x90, 0x8e, 0x00, 0x7e, 0x09, 0x04, 0x46, 0x59, + 0x90, 0x8e, 0x00, 0x7f, 0x09, 0x04, 0x46, 0x59, 0x90, 0x8e, 0x00, 0x80, + 0x09, 0x04, 0x46, 0x59, 0xb8, 0x00, 0xd0, 0x8c, 0x19, 0x04, 0x46, 0x59, + 0xa8, 0x67, 0x00, 0x00, 0xa8, 0x68, 0xc0, 0xfd, 0xa8, 0x6a, 0x08, 0x0c, + 0xd0, 0xec, 0x11, 0x20, 0x20, 0x09, 0x00, 0x03, 0x08, 0x04, 0x36, 0xbf, + 0x70, 0x07, 0x00, 0x03, 0x70, 0x1f, 0x54, 0x3d, 0x00, 0x05, 0x08, 0x0c, + 0x4c, 0x74, 0x09, 0x04, 0x36, 0xc2, 0x08, 0x04, 0x46, 0x59, 0x08, 0x0c, + 0x34, 0x7d, 0x01, 0x08, 0x00, 0x05, 0x20, 0x09, 0x18, 0x34, 0x21, 0x0c, + 0x81, 0xff, 0x01, 0x20, 0x20, 0x09, 0x00, 0x01, 0x08, 0x04, 0x36, 0xbf, + 0x08, 0x0c, 0x58, 0x54, 0x01, 0x20, 0x20, 0x09, 0x00, 0x07, 0x08, 0x04, + 0x36, 0xbf, 0x08, 0x0c, 0x6c, 0x09, 0x01, 0x20, 0x20, 0x09, 0x00, 0x08, + 0x08, 0x04, 0x36, 0xbf, 0xb8, 0x9c, 0xd0, 0xa4, 0x11, 0x18, 0xd0, 0xac, + 0x19, 0x04, 0x46, 0x59, 0x90, 0x06, 0xa8, 0x66, 0xa8, 0x32, 0xa8, 0x68, + 0xc0, 0xfd, 0xa8, 0x6a, 0x08, 0x0c, 0xd1, 0x54, 0x11, 0x20, 0x20, 0x09, + 0x00, 0x03, 0x08, 0x04, 0x36, 0xbf, 0x70, 0x07, 0x00, 0x03, 0x70, 0x1f, + 0x54, 0x76, 0x00, 0x05, 0xa8, 0x30, 0x90, 0x86, 0x01, 0x00, 0x11, 0x20, + 0x20, 0x09, 0x00, 0x04, 0x08, 0x04, 0x57, 0x8e, 0x08, 0x0c, 0x4c, 0x74, + 0x09, 0x04, 0x36, 0xc2, 0x08, 0x04, 0x54, 0x0f, 0x81, 0xff, 0x20, 0x09, + 0x00, 0x01, 0x19, 0x04, 0x36, 0xbf, 0x08, 0x0c, 0x58, 0x54, 0x20, 0x09, + 0x00, 0x07, 0x19, 0x04, 0x36, 0xbf, 0x08, 0x0c, 0x6c, 0x09, 0x01, 0x20, + 0x20, 0x09, 0x00, 0x08, 0x08, 0x04, 0x36, 0xbf, 0x08, 0x0c, 0x4c, 0x74, + 0x09, 0x04, 0x36, 0xc2, 0x08, 0x0c, 0x6c, 0x11, 0x20, 0x09, 0x00, 0x09, + 0x19, 0x04, 0x36, 0xbf, 0x08, 0x0c, 0x4c, 0x41, 0x20, 0x09, 0x00, 0x02, + 0x09, 0x04, 0x36, 0xbf, 0x90, 0x06, 0xa8, 0x66, 0xa8, 0x32, 0xa8, 0x68, + 0xc0, 0xfd, 0xa8, 0x6a, 0x79, 0x88, 0xa9, 0x5a, 0x91, 0x94, 0xfd, 0x00, + 0x91, 0x8c, 0x00, 0xff, 0x90, 0x06, 0x82, 0xff, 0x11, 0x28, 0xc0, 0xed, + 0xa9, 0x52, 0x79, 0x8c, 0xa9, 0x56, 0x00, 0x38, 0x92, 0x8e, 0x01, 0x00, + 0x19, 0x04, 0x36, 0xc2, 0xc0, 0xe5, 0xa9, 0x52, 0xa9, 0x56, 0xa8, 0x3e, + 0x08, 0x0c, 0xd3, 0xb7, 0x20, 0x09, 0x00, 0x03, 0x09, 0x04, 0x36, 0xbf, + 0x70, 0x07, 0x00, 0x03, 0x70, 0x1f, 0x54, 0xcd, 0x00, 0x05, 0xa8, 0x30, + 0x90, 0x86, 0x01, 0x00, 0x20, 0x09, 0x00, 0x04, 0x09, 0x04, 0x36, 0xbf, + 0x08, 0x04, 0x36, 0x8d, 0x7a, 0xa8, 0x92, 0x84, 0xc0, 0x00, 0x01, 0x48, + 0xd2, 0xec, 0x01, 0xa0, 0x08, 0x0c, 0x58, 0x54, 0x11, 0x88, 0x20, 0x09, + 0x00, 0x14, 0x08, 0x04, 0x36, 0xbf, 0xd2, 0xdc, 0x15, 0x78, 0x81, 0xff, + 0x20, 0x09, 0x00, 0x01, 0x19, 0x04, 0x36, 0xbf, 0x08, 0x0c, 0x58, 0x54, + 0x20, 0x09, 0x00, 0x07, 0x19, 0x04, 0x36, 0xbf, 0xd2, 0xf4, 0x01, 0x38, + 0x92, 0x84, 0x50, 0x00, 0xc0, 0xd5, 0x08, 0x0c, 0x58, 0x1a, 0x08, 0x04, + 0x36, 0x8d, 0xd2, 0xfc, 0x01, 0x60, 0x08, 0x0c, 0x4c, 0x74, 0x09, 0x04, + 0x36, 0xc2, 0x79, 0x84, 0x92, 0x84, 0x90, 0x00, 0xc0, 0xd5, 0x08, 0x0c, + 0x57, 0xe9, 0x08, 0x04, 0x36, 0x8d, 0x08, 0x0c, 0x4c, 0x74, 0x09, 0x04, + 0x36, 0xc2, 0xb8, 0x04, 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x06, + 0x20, 0x09, 0x00, 0x09, 0x19, 0x04, 0x55, 0xbc, 0x08, 0x0c, 0x4c, 0x41, + 0x20, 0x09, 0x00, 0x02, 0x09, 0x04, 0x55, 0xbc, 0xa8, 0x5c, 0x90, 0x80, + 0x00, 0x1b, 0xaf, 0x60, 0x20, 0x09, 0x00, 0x08, 0x7a, 0x8c, 0x7b, 0x88, + 0x7c, 0x9c, 0x7d, 0x98, 0x08, 0x0c, 0x4c, 0x8a, 0x70, 0x1f, 0x55, 0x29, + 0x00, 0x05, 0xa8, 0x6c, 0x90, 0x86, 0x05, 0x00, 0x11, 0x38, 0xa8, 0x70, + 0x90, 0x05, 0x11, 0x20, 0xa8, 0x74, 0x90, 0x84, 0xff, 0x00, 0x01, 0x10, + 0x19, 0x04, 0x36, 0xc2, 0xa8, 0x66, 0xa8, 0x32, 0xa8, 0x68, 0xc0, 0xfd, + 0xa8, 0x6a, 0x08, 0x0c, 0x4c, 0x74, 0x11, 0x10, 0x08, 0x04, 0x36, 0xc2, + 0x20, 0x09, 0x00, 0x43, 0x08, 0x0c, 0xd4, 0x23, 0x20, 0x09, 0x00, 0x03, + 0x09, 0x04, 0x55, 0xbc, 0x70, 0x07, 0x00, 0x03, 0x70, 0x1f, 0x55, 0x4d, + 0x00, 0x05, 0xa8, 0x30, 0x90, 0x86, 0x01, 0x00, 0x20, 0x09, 0x00, 0x04, + 0x09, 0x04, 0x55, 0xbc, 0x79, 0x84, 0x7a, 0xa8, 0x92, 0x84, 0x10, 0x00, + 0xc0, 0xd5, 0x08, 0x0c, 0x57, 0xe9, 0x08, 0x04, 0x36, 0x8d, 0x00, 0xc6, + 0xaa, 0xb0, 0x92, 0x84, 0xc0, 0x00, 0x01, 0x48, 0xd2, 0xec, 0x01, 0x70, + 0x08, 0x0c, 0x58, 0x54, 0x11, 0x58, 0x20, 0x09, 0x00, 0x14, 0x08, 0x04, + 0x55, 0xab, 0x20, 0x61, 0x18, 0x00, 0x08, 0x0c, 0x58, 0x54, 0x20, 0x09, + 0x00, 0x07, 0x15, 0xc8, 0xd2, 0xf4, 0x01, 0x30, 0x92, 0x84, 0x50, 0x00, + 0xc0, 0xd5, 0x08, 0x0c, 0x58, 0x1a, 0x00, 0x58, 0xd2, 0xfc, 0x01, 0x80, + 0x08, 0x0c, 0x4c, 0x72, 0x05, 0x90, 0xa9, 0x98, 0x92, 0x84, 0x90, 0x00, + 0xc0, 0xd5, 0x08, 0x0c, 0x57, 0xe9, 0xa8, 0x7b, 0x00, 0x00, 0xa8, 0x83, + 0x00, 0x00, 0xa8, 0x97, 0x40, 0x00, 0x04, 0x38, 0x08, 0x0c, 0x4c, 0x72, + 0x05, 0x10, 0x08, 0x0c, 0x6c, 0x11, 0x20, 0x09, 0x00, 0x09, 0x11, 0xb8, + 0xa8, 0xc4, 0x90, 0x86, 0x05, 0x00, 0x11, 0xc8, 0xa8, 0xc8, 0x90, 0x05, + 0x11, 0xb0, 0xa8, 0xcc, 0x90, 0x84, 0xff, 0x00, 0x11, 0x90, 0x08, 0x0c, + 0x4c, 0x72, 0x11, 0x08, 0x00, 0x70, 0x20, 0x09, 0x00, 0x4b, 0x08, 0x0c, + 0xd4, 0x23, 0x20, 0x09, 0x00, 0x03, 0x01, 0x08, 0x00, 0x78, 0x04, 0x31, + 0x19, 0xc0, 0xa8, 0x97, 0x40, 0x05, 0xa9, 0x9a, 0x00, 0x10, 0xa8, 0x97, + 0x40, 0x06, 0x90, 0x0e, 0x90, 0x85, 0x00, 0x01, 0x20, 0x01, 0x00, 0x30, + 0x00, 0xce, 0x00, 0x05, 0x90, 0x06, 0x0c, 0xe0, 0x7a, 0xa8, 0xd2, 0xdc, + 0x09, 0x04, 0x36, 0xbf, 0x00, 0x16, 0x79, 0x84, 0x92, 0x84, 0x10, 0x00, + 0xc0, 0xfd, 0x08, 0x0c, 0x57, 0xe9, 0x00, 0x1e, 0x19, 0x04, 0x36, 0xbf, + 0x08, 0x04, 0x36, 0x8d, 0x00, 0xf6, 0x2d, 0x78, 0xaa, 0xb0, 0x00, 0x21, + 0x00, 0xfe, 0x00, 0x05, 0xaa, 0xb0, 0xc2, 0xd5, 0xd2, 0xdc, 0x01, 0x50, + 0x00, 0x16, 0xa9, 0x98, 0x92, 0x84, 0x14, 0x00, 0xc0, 0xfd, 0x08, 0x0c, + 0x57, 0xe9, 0x00, 0x1e, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x81, 0xff, + 0x01, 0x20, 0x20, 0x09, 0x00, 0x01, 0x08, 0x04, 0x36, 0xbf, 0x08, 0x0c, + 0x58, 0x54, 0x01, 0x20, 0x20, 0x09, 0x00, 0x07, 0x08, 0x04, 0x36, 0xbf, + 0x79, 0x84, 0x7e, 0xa8, 0x96, 0xb4, 0x00, 0xff, 0x08, 0x0c, 0x67, 0xb4, + 0x19, 0x04, 0x36, 0xc2, 0x91, 0x86, 0x00, 0x7f, 0x01, 0x38, 0x08, 0x0c, + 0x6c, 0x11, 0x01, 0x20, 0x20, 0x09, 0x00, 0x09, 0x08, 0x04, 0x36, 0xbf, + 0x08, 0x0c, 0x4c, 0x41, 0x11, 0x20, 0x20, 0x09, 0x00, 0x02, 0x08, 0x04, + 0x36, 0xbf, 0xa8, 0x67, 0x00, 0x00, 0xa8, 0x68, 0xc0, 0xfd, 0xa8, 0x6a, + 0x20, 0x01, 0x01, 0x00, 0x80, 0x07, 0xa8, 0x0a, 0x08, 0x0c, 0xd1, 0x06, + 0x11, 0x20, 0x20, 0x09, 0x00, 0x03, 0x08, 0x04, 0x36, 0xbf, 0x70, 0x07, + 0x00, 0x03, 0x70, 0x1f, 0x56, 0x1c, 0x00, 0x05, 0xa8, 0x08, 0x80, 0x07, + 0x90, 0x86, 0x01, 0x00, 0x11, 0x20, 0x20, 0x09, 0x00, 0x04, 0x08, 0x04, + 0x36, 0xbf, 0xa8, 0xe0, 0xa8, 0x66, 0xa8, 0x10, 0x80, 0x07, 0x90, 0x84, + 0x00, 0xff, 0x80, 0x0c, 0xa8, 0x14, 0x80, 0x07, 0x90, 0x84, 0x00, 0xff, + 0x80, 0x04, 0x90, 0x80, 0x00, 0x02, 0x91, 0x08, 0x89, 0x06, 0x80, 0x06, + 0x80, 0x07, 0x90, 0xbc, 0x00, 0x3f, 0x90, 0x84, 0xff, 0xc0, 0x90, 0x80, + 0x00, 0x04, 0x7a, 0x8c, 0x7b, 0x88, 0x7c, 0x9c, 0x7d, 0x98, 0x08, 0x04, + 0x4c, 0x8d, 0x08, 0x0c, 0x4c, 0x41, 0x11, 0x20, 0x20, 0x09, 0x00, 0x02, + 0x08, 0x04, 0x36, 0xbf, 0x79, 0x84, 0x91, 0x94, 0xff, 0x00, 0x91, 0x8c, + 0x00, 0xff, 0x82, 0x17, 0x82, 0xff, 0x11, 0x18, 0x70, 0x23, 0x19, 0xb4, + 0x00, 0x40, 0x92, 0xc6, 0x00, 0x01, 0x11, 0x18, 0x70, 0x23, 0x19, 0xce, + 0x00, 0x10, 0x08, 0x04, 0x36, 0xc2, 0x20, 0x09, 0x00, 0x1a, 0x7a, 0x8c, + 0x7b, 0x88, 0x7c, 0x9c, 0x7d, 0x98, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x19, + 0xaf, 0x60, 0x08, 0x0c, 0x4c, 0x8a, 0x70, 0x1f, 0x56, 0x6c, 0x00, 0x05, + 0x20, 0x01, 0x18, 0x2e, 0x20, 0x03, 0x00, 0x01, 0xa8, 0x5c, 0x90, 0x80, + 0x00, 0x19, 0x20, 0x98, 0xa8, 0x60, 0x20, 0xe0, 0x20, 0xa9, 0x00, 0x1a, + 0x70, 0x20, 0x20, 0xa0, 0x20, 0xe9, 0x00, 0x01, 0x40, 0x03, 0x08, 0x04, + 0x36, 0x8d, 0x08, 0x0c, 0x4c, 0x41, 0x11, 0x20, 0x20, 0x09, 0x00, 0x02, + 0x08, 0x04, 0x36, 0xbf, 0x79, 0x84, 0x91, 0x94, 0xff, 0x00, 0x91, 0x8c, + 0x00, 0xff, 0x82, 0x17, 0x82, 0xff, 0x11, 0x18, 0x20, 0x99, 0x19, 0xb4, + 0x00, 0x40, 0x92, 0xc6, 0x00, 0x01, 0x11, 0x18, 0x20, 0x99, 0x19, 0xce, + 0x00, 0x10, 0x08, 0x04, 0x36, 0xc2, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x19, + 0x20, 0xa0, 0xa8, 0x60, 0x20, 0xe8, 0x20, 0xa9, 0x00, 0x1a, 0x20, 0xe1, + 0x00, 0x01, 0x40, 0x03, 0x20, 0x09, 0x00, 0x1a, 0x7a, 0x8c, 0x7b, 0x88, + 0x7c, 0x9c, 0x7d, 0x98, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x19, 0xaf, 0x60, + 0x08, 0x04, 0x4c, 0x8d, 0x78, 0x84, 0x90, 0x8a, 0x10, 0x00, 0x1a, 0x04, + 0x36, 0xc2, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x80, 0x03, 0x80, 0x0b, + 0x81, 0x0b, 0x91, 0x08, 0x00, 0xc6, 0x20, 0x61, 0x1a, 0x04, 0x61, 0x4a, + 0x00, 0xce, 0x01, 0x2e, 0x08, 0x04, 0x36, 0x8d, 0x00, 0xc6, 0x08, 0x0c, + 0x77, 0x9e, 0x11, 0x60, 0x08, 0x0c, 0x7a, 0xb6, 0x08, 0x0c, 0x61, 0x9d, + 0x90, 0x85, 0x00, 0x01, 0x08, 0x0c, 0x77, 0xe2, 0x08, 0x0c, 0x76, 0xcd, + 0x08, 0x0c, 0x0d, 0x85, 0x20, 0x61, 0x18, 0x00, 0x60, 0x30, 0xc0, 0x9d, + 0x60, 0x32, 0x08, 0x0c, 0x60, 0x58, 0x00, 0xce, 0x00, 0x05, 0x00, 0xc6, + 0x20, 0x01, 0x18, 0x00, 0x20, 0x04, 0x90, 0x8e, 0x00, 0x00, 0x09, 0x04, + 0x36, 0xbf, 0x78, 0x84, 0x90, 0x05, 0x01, 0x88, 0x78, 0x88, 0x20, 0x61, + 0x19, 0x9c, 0x2c, 0x0c, 0x20, 0x62, 0x08, 0x0c, 0x2a, 0x67, 0x01, 0xa0, + 0x08, 0x0c, 0x2a, 0x6f, 0x01, 0x88, 0x08, 0x0c, 0x2a, 0x77, 0x01, 0x70, + 0x21, 0x62, 0x08, 0x04, 0x36, 0xc2, 0x20, 0x61, 0x01, 0x00, 0x60, 0x38, + 0x90, 0x86, 0x00, 0x07, 0x11, 0x18, 0x20, 0x09, 0x00, 0x01, 0x00, 0x10, + 0x20, 0x09, 0x00, 0x00, 0x78, 0x84, 0x90, 0x86, 0x00, 0x02, 0x15, 0xa8, + 0x20, 0x61, 0x01, 0x00, 0x60, 0x28, 0xc0, 0x9c, 0x60, 0x2a, 0x08, 0x0c, + 0xac, 0xfc, 0x00, 0x26, 0x20, 0x11, 0x00, 0x03, 0x08, 0x0c, 0xa6, 0x2b, + 0x20, 0x11, 0x00, 0x02, 0x08, 0x0c, 0xa6, 0x35, 0x00, 0x2e, 0x08, 0x0c, + 0xa5, 0x16, 0x00, 0x36, 0x90, 0x1e, 0x08, 0x0c, 0xa5, 0x96, 0x00, 0x3e, + 0x08, 0x0c, 0xad, 0x18, 0x60, 0xe3, 0x00, 0x00, 0x08, 0x0c, 0xee, 0xd9, + 0x08, 0x0c, 0xee, 0xf4, 0x90, 0x85, 0x00, 0x01, 0x08, 0x0c, 0x77, 0xe2, + 0x90, 0x06, 0x08, 0x0c, 0x2a, 0x99, 0x20, 0x01, 0x18, 0x00, 0x20, 0x03, + 0x00, 0x04, 0x20, 0x01, 0x19, 0xa8, 0x20, 0x03, 0x00, 0x00, 0x00, 0x26, + 0x20, 0x11, 0x00, 0x08, 0x08, 0x0c, 0x2a, 0xd3, 0x00, 0x2e, 0x00, 0xce, + 0x08, 0x04, 0x36, 0x8d, 0x81, 0xff, 0x01, 0x20, 0x20, 0x09, 0x00, 0x01, + 0x08, 0x04, 0x36, 0xbf, 0x08, 0x0c, 0x58, 0x54, 0x01, 0x20, 0x20, 0x09, + 0x00, 0x07, 0x08, 0x04, 0x36, 0xbf, 0x79, 0x84, 0x7e, 0xa8, 0x96, 0xb4, + 0x00, 0xff, 0x08, 0x0c, 0x67, 0xb4, 0x19, 0x04, 0x36, 0xc2, 0x91, 0x86, + 0x00, 0x7f, 0x01, 0x38, 0x08, 0x0c, 0x6c, 0x11, 0x01, 0x20, 0x20, 0x09, + 0x00, 0x09, 0x08, 0x04, 0x36, 0xbf, 0x08, 0x0c, 0x4c, 0x41, 0x11, 0x20, + 0x20, 0x09, 0x00, 0x02, 0x08, 0x04, 0x36, 0xbf, 0xa8, 0x67, 0x00, 0x00, + 0xa8, 0x68, 0xc0, 0xfd, 0xa8, 0x6a, 0x08, 0x0c, 0xd1, 0x09, 0x11, 0x20, + 0x20, 0x09, 0x00, 0x03, 0x08, 0x04, 0x36, 0xbf, 0x70, 0x07, 0x00, 0x03, + 0x70, 0x1f, 0x57, 0x77, 0x00, 0x05, 0xa8, 0x30, 0x90, 0x86, 0x01, 0x00, + 0x11, 0x20, 0x20, 0x09, 0x00, 0x04, 0x08, 0x04, 0x36, 0xbf, 0xa8, 0xe0, + 0xa8, 0x66, 0xa8, 0x34, 0x80, 0x07, 0x80, 0x0c, 0xa8, 0x5c, 0x90, 0x80, + 0x00, 0x0c, 0x7a, 0x8c, 0x7b, 0x88, 0x7c, 0x9c, 0x7d, 0x98, 0xaf, 0x60, + 0x08, 0x04, 0x4c, 0x8d, 0xa8, 0x98, 0x90, 0x86, 0x00, 0x0d, 0x19, 0x04, + 0x36, 0xbf, 0x20, 0x21, 0x40, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x0e, 0x04, 0x57, 0x9b, 0x00, 0x10, 0x01, 0x2e, 0x0c, 0xc0, 0x7c, 0x36, + 0x94, 0x86, 0x40, 0x00, 0x01, 0x18, 0x78, 0x33, 0x00, 0x11, 0x00, 0x10, + 0x78, 0x33, 0x00, 0x10, 0x78, 0x83, 0x40, 0x05, 0xa9, 0x98, 0x79, 0x86, + 0xa9, 0xa4, 0x79, 0x9a, 0xa9, 0xa8, 0x79, 0x9e, 0x08, 0x0c, 0x4c, 0x7d, + 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, 0x00, 0x89, 0x20, 0x04, 0xd0, 0x84, + 0x19, 0x0c, 0x12, 0x00, 0x70, 0x07, 0x00, 0x01, 0x20, 0x91, 0x50, 0x00, + 0x70, 0x0f, 0x00, 0x00, 0x01, 0x2e, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x00, 0xc6, 0x20, 0x61, 0x1a, 0x04, 0x79, 0x84, 0x61, 0x5a, + 0x61, 0x56, 0x60, 0x5f, 0x00, 0x00, 0x60, 0x53, 0x00, 0x09, 0x78, 0x98, + 0x60, 0x72, 0x78, 0x9c, 0x60, 0x6e, 0x78, 0x88, 0x60, 0x6a, 0x78, 0x8c, + 0x60, 0x66, 0x20, 0x01, 0x1a, 0x14, 0x20, 0x44, 0x20, 0x01, 0x1a, 0x1b, + 0xa0, 0x76, 0xa0, 0x60, 0xa0, 0x72, 0xa0, 0x7b, 0x00, 0x01, 0xa0, 0x7f, + 0x00, 0x02, 0xa0, 0x6b, 0x00, 0x00, 0xa0, 0x9f, 0x00, 0x00, 0x00, 0xce, + 0x01, 0x2e, 0x08, 0x04, 0x36, 0x8d, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x00, 0xb6, 0x00, 0xc6, 0x90, 0xe4, 0xc0, 0x00, 0x01, 0x98, 0x00, 0x06, + 0xd0, 0xd4, 0x01, 0x60, 0x00, 0x36, 0x20, 0x19, 0x00, 0x29, 0x08, 0x0c, + 0xac, 0xfc, 0x01, 0x06, 0x08, 0x0c, 0x34, 0x42, 0x01, 0x0e, 0x09, 0x0c, + 0xad, 0x18, 0x00, 0x3e, 0x08, 0x0c, 0xcf, 0x68, 0x00, 0x0e, 0x11, 0x98, + 0xd0, 0xe4, 0x01, 0x60, 0x91, 0x80, 0x10, 0x00, 0x20, 0x04, 0x90, 0x5d, + 0x01, 0x60, 0x08, 0x0c, 0x61, 0xb7, 0x08, 0x0c, 0xb0, 0x94, 0x01, 0x10, + 0xb8, 0x17, 0x00, 0x00, 0x90, 0x06, 0x00, 0xce, 0x00, 0xbe, 0x01, 0x2e, + 0x00, 0x05, 0x90, 0x85, 0x00, 0x01, 0x0c, 0xc8, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x01, 0x56, 0x20, 0x10, 0x90, 0x0e, 0x20, 0xa9, 0x08, 0x00, + 0x00, 0x16, 0x91, 0x80, 0x10, 0x00, 0x20, 0x04, 0x90, 0x05, 0x01, 0x88, + 0x91, 0x86, 0x00, 0x7e, 0x01, 0x70, 0x91, 0x86, 0x00, 0x7f, 0x01, 0x58, + 0x91, 0x86, 0x00, 0x80, 0x01, 0x40, 0x91, 0x86, 0x00, 0xff, 0x01, 0x28, + 0x00, 0x26, 0x22, 0x00, 0x08, 0x0c, 0x57, 0xe9, 0x00, 0x2e, 0x00, 0x1e, + 0x81, 0x08, 0x1f, 0x04, 0x58, 0x22, 0x01, 0x5e, 0x01, 0x2e, 0x00, 0x05, + 0x20, 0x01, 0x18, 0x48, 0x20, 0x04, 0x00, 0x05, 0x20, 0x01, 0x18, 0x67, + 0x20, 0x04, 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0x18, 0x10, 0x20, 0x04, + 0xd0, 0xd4, 0x00, 0x0e, 0x00, 0x05, 0x20, 0x01, 0x18, 0x0e, 0x20, 0x04, + 0xd0, 0xb4, 0x00, 0x05, 0x20, 0x01, 0x18, 0x00, 0x20, 0x04, 0x90, 0x86, + 0x00, 0x03, 0x00, 0x05, 0x00, 0x16, 0x00, 0xe6, 0x20, 0x71, 0x18, 0x9e, + 0x71, 0x08, 0x91, 0x0d, 0x71, 0x0a, 0x00, 0xee, 0x00, 0x1e, 0x00, 0x05, + 0x79, 0xa4, 0x81, 0xff, 0x09, 0x04, 0x36, 0xc2, 0x91, 0x82, 0x00, 0x81, + 0x1a, 0x04, 0x36, 0xc2, 0x81, 0x0c, 0x00, 0x16, 0x08, 0x0c, 0x4c, 0x41, + 0x01, 0x70, 0x08, 0x0c, 0x0f, 0x61, 0x21, 0x00, 0x22, 0x38, 0x7d, 0x84, + 0x7c, 0x88, 0x7b, 0x8c, 0x7a, 0x90, 0x00, 0x1e, 0x08, 0x0c, 0x4c, 0x8a, + 0x70, 0x1f, 0x58, 0x84, 0x00, 0x05, 0x00, 0x1e, 0x20, 0x09, 0x00, 0x02, + 0x08, 0x04, 0x36, 0xbf, 0x20, 0x79, 0x00, 0x00, 0x7d, 0x94, 0x7c, 0x98, + 0x7b, 0xa8, 0x7a, 0xac, 0x79, 0xa4, 0x81, 0x0c, 0x20, 0x61, 0x18, 0xb8, + 0x2c, 0x44, 0xa7, 0x70, 0xa0, 0x74, 0x20, 0x71, 0x18, 0x9e, 0x08, 0x0c, + 0x4c, 0x8d, 0x70, 0x1f, 0x58, 0x98, 0x00, 0x05, 0x20, 0x61, 0x18, 0xb8, + 0x2c, 0x44, 0x00, 0x16, 0x00, 0x26, 0xa2, 0x70, 0xa1, 0x74, 0x08, 0x0c, + 0x0f, 0x69, 0x00, 0x2e, 0x00, 0x1e, 0x08, 0x0c, 0x10, 0x16, 0x90, 0x06, + 0xa8, 0x02, 0xa8, 0x06, 0x08, 0x04, 0x36, 0x8d, 0x01, 0x26, 0x01, 0x56, + 0x01, 0x36, 0x01, 0x46, 0x01, 0xc6, 0x01, 0xd6, 0x00, 0xc6, 0x00, 0xd6, + 0x00, 0xe6, 0x00, 0xf6, 0x20, 0x61, 0x01, 0x00, 0x20, 0x69, 0x02, 0x00, + 0x20, 0x71, 0x18, 0x00, 0x60, 0x44, 0xd0, 0xa4, 0x11, 0xe8, 0xd0, 0x84, + 0x01, 0x18, 0x08, 0x0c, 0x5a, 0x58, 0x00, 0x68, 0xd0, 0x8c, 0x01, 0x18, + 0x08, 0x0c, 0x59, 0x61, 0x00, 0x40, 0xd0, 0x94, 0x01, 0x18, 0x08, 0x0c, + 0x59, 0x31, 0x00, 0x18, 0xd0, 0x9c, 0x01, 0x08, 0x00, 0x99, 0x00, 0xfe, + 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x01, 0xde, 0x01, 0xce, 0x01, 0x4e, + 0x01, 0x3e, 0x01, 0x5e, 0x01, 0x2e, 0x00, 0x05, 0x00, 0x16, 0x61, 0x28, + 0xd1, 0x9c, 0x11, 0x10, 0xc1, 0x9d, 0x61, 0x2a, 0x00, 0x1e, 0x0c, 0x68, + 0x70, 0x30, 0xd0, 0x9c, 0x11, 0x20, 0x60, 0x04, 0x90, 0x85, 0x00, 0x02, + 0x60, 0x06, 0x70, 0x98, 0x90, 0x05, 0x01, 0x20, 0x70, 0x9b, 0x00, 0x00, + 0x70, 0x93, 0x00, 0x00, 0x62, 0x4c, 0x92, 0x86, 0xf0, 0xf0, 0x11, 0x50, + 0x60, 0x48, 0x90, 0x86, 0xf0, 0xf0, 0x01, 0x30, 0x62, 0x4a, 0x60, 0x43, + 0x00, 0x90, 0x60, 0x43, 0x00, 0x10, 0x04, 0x90, 0x92, 0x94, 0xff, 0x00, + 0x92, 0x96, 0xf7, 0x00, 0x01, 0x78, 0x71, 0x38, 0xd1, 0xa4, 0x11, 0x60, + 0x62, 0x40, 0x92, 0x95, 0x01, 0x00, 0x62, 0x42, 0x92, 0x94, 0x00, 0x10, + 0x01, 0x28, 0x20, 0x09, 0x00, 0xf7, 0x08, 0x0c, 0x61, 0x19, 0x00, 0xf0, + 0x60, 0x40, 0x90, 0x84, 0x00, 0x10, 0x90, 0x85, 0x01, 0x40, 0x60, 0x42, + 0x60, 0x43, 0x00, 0x00, 0x70, 0x87, 0x00, 0x00, 0x70, 0xa3, 0x00, 0x01, + 0x70, 0xc7, 0x00, 0x00, 0x70, 0xdf, 0x00, 0x00, 0x20, 0x09, 0x1d, 0x80, + 0x20, 0x0b, 0x00, 0x00, 0x70, 0x97, 0x00, 0x00, 0x70, 0x8b, 0x00, 0x0f, + 0x20, 0x09, 0x00, 0x0f, 0x20, 0x11, 0x5f, 0xfb, 0x08, 0x0c, 0x8a, 0x5d, + 0x00, 0x05, 0x20, 0x01, 0x18, 0x69, 0x20, 0x04, 0xd0, 0x8c, 0x01, 0x10, + 0x70, 0x5f, 0xff, 0xff, 0x70, 0x88, 0x90, 0x05, 0x15, 0x28, 0x20, 0x11, + 0x5f, 0xfb, 0x08, 0x0c, 0x89, 0x93, 0x60, 0x40, 0x90, 0x94, 0x00, 0x10, + 0x92, 0x85, 0x00, 0x20, 0x60, 0x42, 0x20, 0xa9, 0x00, 0xc8, 0x60, 0x44, + 0xd0, 0x8c, 0x11, 0x68, 0x1f, 0x04, 0x59, 0x47, 0x62, 0x42, 0x70, 0x9b, + 0x00, 0x00, 0x60, 0x40, 0x90, 0x94, 0x00, 0x10, 0x92, 0x85, 0x00, 0x80, + 0x60, 0x42, 0x62, 0x42, 0x00, 0x48, 0x62, 0x42, 0x70, 0x9b, 0x00, 0x00, + 0x70, 0x8f, 0x00, 0x00, 0x90, 0x06, 0x08, 0x0c, 0x61, 0xa2, 0x00, 0x00, + 0x00, 0x05, 0x70, 0x8c, 0x90, 0x8a, 0x00, 0x03, 0x1a, 0x0c, 0x0d, 0x85, + 0x00, 0x0b, 0x00, 0x05, 0x59, 0x6b, 0x59, 0xbc, 0x5a, 0x57, 0x00, 0xf6, + 0x00, 0x16, 0x69, 0x00, 0x91, 0x8c, 0x08, 0x00, 0x70, 0x8f, 0x00, 0x01, + 0x20, 0x01, 0x01, 0x5d, 0x20, 0x03, 0x00, 0x00, 0x68, 0x03, 0x00, 0xfc, + 0x20, 0xa9, 0x00, 0x04, 0x68, 0x00, 0x90, 0x84, 0x00, 0xfc, 0x01, 0x20, + 0x1f, 0x04, 0x59, 0x7a, 0x08, 0x0c, 0x0d, 0x85, 0x68, 0xa0, 0x68, 0xa2, + 0x68, 0x9c, 0x68, 0x9e, 0x68, 0x98, 0x68, 0x9a, 0xa0, 0x01, 0x91, 0x8d, + 0x16, 0x00, 0x69, 0x02, 0x00, 0x1e, 0x68, 0x37, 0x00, 0x20, 0x08, 0x0c, + 0x61, 0x7e, 0x20, 0x79, 0x1d, 0x00, 0x78, 0x33, 0x11, 0x01, 0x78, 0x37, + 0x00, 0x00, 0x20, 0xe1, 0x00, 0x01, 0x20, 0x99, 0x18, 0x05, 0x20, 0xe9, + 0x00, 0x01, 0x20, 0xa1, 0x1d, 0x0e, 0x20, 0xa9, 0x00, 0x04, 0x40, 0x03, + 0x08, 0x0c, 0xaa, 0xf1, 0x20, 0xe1, 0x00, 0x01, 0x20, 0x99, 0x1d, 0x00, + 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, 0x02, 0x40, 0x20, 0xa9, 0x00, 0x14, + 0x40, 0x03, 0x60, 0xc3, 0x00, 0x0c, 0x60, 0x0f, 0x00, 0x00, 0x08, 0x0c, + 0x60, 0x2c, 0x00, 0xfe, 0x90, 0x06, 0x70, 0x92, 0x60, 0x43, 0x00, 0x08, + 0x60, 0x42, 0x00, 0x05, 0x00, 0xf6, 0x70, 0x90, 0x70, 0x93, 0x00, 0x00, + 0x90, 0x25, 0x09, 0x04, 0x5a, 0x34, 0x60, 0x20, 0xd0, 0xb4, 0x19, 0x04, + 0x5a, 0x32, 0x71, 0xa0, 0x81, 0xff, 0x09, 0x04, 0x5a, 0x20, 0x94, 0x86, + 0x00, 0x0c, 0x19, 0x04, 0x5a, 0x2d, 0x94, 0x80, 0x00, 0x18, 0x80, 0x04, + 0x20, 0xa8, 0x08, 0x0c, 0x61, 0x77, 0x20, 0x11, 0x02, 0x60, 0x20, 0x19, + 0x1d, 0x00, 0x22, 0x0c, 0x23, 0x04, 0x91, 0x06, 0x11, 0xe8, 0x82, 0x10, + 0x83, 0x18, 0x1f, 0x04, 0x59, 0xd9, 0x60, 0x43, 0x00, 0x04, 0x20, 0x61, + 0x01, 0x40, 0x60, 0x5b, 0xbc, 0x94, 0x60, 0x5f, 0xf0, 0xf0, 0x20, 0x61, + 0x01, 0x00, 0x60, 0x43, 0x00, 0x06, 0x70, 0x8f, 0x00, 0x02, 0x70, 0x9b, + 0x00, 0x02, 0x20, 0x09, 0x07, 0xd0, 0x20, 0x11, 0x60, 0x02, 0x08, 0x0c, + 0x8a, 0x5d, 0x08, 0x0c, 0x61, 0x7e, 0x04, 0xc0, 0x08, 0x0c, 0x61, 0x77, + 0x20, 0x79, 0x02, 0x60, 0x79, 0x30, 0x91, 0x8e, 0x11, 0x01, 0x15, 0x58, + 0x78, 0x34, 0x90, 0x05, 0x15, 0x40, 0x79, 0x00, 0x91, 0x8c, 0x00, 0xff, + 0x11, 0x18, 0x78, 0x04, 0x90, 0x05, 0x01, 0x90, 0x08, 0x0c, 0x61, 0x77, + 0x20, 0x11, 0x02, 0x6e, 0x20, 0x19, 0x18, 0x05, 0x20, 0xa9, 0x00, 0x04, + 0x22, 0x0c, 0x23, 0x04, 0x91, 0x02, 0x02, 0x30, 0x11, 0xa0, 0x82, 0x10, + 0x83, 0x18, 0x1f, 0x04, 0x5a, 0x14, 0x00, 0x78, 0x70, 0xa3, 0x00, 0x00, + 0x08, 0x0c, 0x61, 0x77, 0x20, 0xe1, 0x00, 0x00, 0x20, 0x99, 0x02, 0x60, + 0x20, 0xe9, 0x00, 0x01, 0x20, 0xa1, 0x1d, 0x00, 0x20, 0xa9, 0x00, 0x14, + 0x40, 0x03, 0x60, 0x43, 0x00, 0x08, 0x60, 0x43, 0x00, 0x00, 0x00, 0x10, + 0x00, 0xfe, 0x00, 0x05, 0x60, 0x40, 0x90, 0x85, 0x01, 0x00, 0x60, 0x42, + 0x60, 0x20, 0xd0, 0xb4, 0x1d, 0xb8, 0x08, 0x0c, 0xaa, 0xf1, 0x20, 0xe1, + 0x00, 0x01, 0x20, 0x99, 0x1d, 0x00, 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, + 0x02, 0x40, 0x20, 0xa9, 0x00, 0x14, 0x40, 0x03, 0x60, 0xc3, 0x00, 0x0c, + 0x20, 0x11, 0x19, 0xf5, 0x20, 0x13, 0x00, 0x00, 0x70, 0x93, 0x00, 0x00, + 0x60, 0xa3, 0x00, 0x56, 0x60, 0xa7, 0x95, 0x75, 0x08, 0x0c, 0xa2, 0x93, + 0x08, 0xd8, 0x00, 0x05, 0x70, 0x98, 0x90, 0x8a, 0x00, 0x1d, 0x1a, 0x0c, + 0x0d, 0x85, 0x00, 0x0b, 0x00, 0x05, 0x5a, 0x89, 0x5a, 0x9c, 0x5a, 0xc5, + 0x5a, 0xe5, 0x5b, 0x0b, 0x5b, 0x3a, 0x5b, 0x60, 0x5b, 0x98, 0x5b, 0xbe, + 0x5b, 0xec, 0x5c, 0x27, 0x5c, 0x5f, 0x5c, 0x7d, 0x5c, 0xa8, 0x5c, 0xca, + 0x5c, 0xe5, 0x5c, 0xef, 0x5d, 0x23, 0x5d, 0x49, 0x5d, 0x78, 0x5d, 0x9e, + 0x5d, 0xd6, 0x5e, 0x1a, 0x5e, 0x57, 0x5e, 0x78, 0x5e, 0xd1, 0x5e, 0xf3, + 0x5f, 0x21, 0x5f, 0x21, 0x00, 0xc6, 0x20, 0x61, 0x18, 0x00, 0x60, 0x03, + 0x00, 0x07, 0x20, 0x61, 0x01, 0x00, 0x60, 0x04, 0x90, 0x84, 0xff, 0xf9, + 0x60, 0x06, 0x00, 0xce, 0x00, 0x05, 0x20, 0x61, 0x01, 0x40, 0x60, 0x5b, + 0xbc, 0x94, 0x60, 0x5f, 0xf0, 0xf0, 0x20, 0x61, 0x01, 0x00, 0x60, 0x43, + 0x00, 0x02, 0x70, 0x9b, 0x00, 0x01, 0x20, 0x09, 0x07, 0xd0, 0x20, 0x11, + 0x60, 0x02, 0x08, 0x0c, 0x8a, 0x5d, 0x00, 0x05, 0x00, 0xf6, 0x70, 0x90, + 0x90, 0x86, 0x00, 0x14, 0x15, 0x10, 0x60, 0x42, 0x60, 0x20, 0xd0, 0xb4, + 0x11, 0xf0, 0x08, 0x0c, 0x61, 0x77, 0x20, 0x79, 0x02, 0x60, 0x7a, 0x30, + 0x92, 0x96, 0x11, 0x02, 0x11, 0xa0, 0x78, 0x34, 0x90, 0x05, 0x11, 0x88, + 0x7a, 0x38, 0xd2, 0xfc, 0x01, 0x28, 0x70, 0xc4, 0x90, 0x05, 0x11, 0x10, + 0x70, 0xc7, 0x00, 0x01, 0x20, 0x11, 0x60, 0x02, 0x08, 0x0c, 0x89, 0x93, + 0x70, 0x9b, 0x00, 0x10, 0x08, 0x0c, 0x5c, 0xef, 0x00, 0x10, 0x70, 0x93, + 0x00, 0x00, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, 0x70, 0x9b, 0x00, 0x03, + 0x60, 0x43, 0x00, 0x04, 0x20, 0x11, 0x60, 0x02, 0x08, 0x0c, 0x89, 0x93, + 0x08, 0x0c, 0x60, 0xfb, 0x20, 0x79, 0x02, 0x40, 0x78, 0x33, 0x11, 0x02, + 0x78, 0x37, 0x00, 0x00, 0x20, 0xa9, 0x00, 0x08, 0x9f, 0x88, 0x00, 0x0e, + 0x20, 0x0b, 0x00, 0x00, 0x81, 0x08, 0x1f, 0x04, 0x5a, 0xda, 0x60, 0xc3, + 0x00, 0x14, 0x08, 0x0c, 0x60, 0x2c, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, + 0x70, 0x90, 0x90, 0x05, 0x05, 0x00, 0x20, 0x11, 0x60, 0x02, 0x08, 0x0c, + 0x89, 0x93, 0x90, 0x86, 0x00, 0x14, 0x11, 0xb8, 0x08, 0x0c, 0x61, 0x77, + 0x20, 0x79, 0x02, 0x60, 0x7a, 0x30, 0x92, 0x96, 0x11, 0x02, 0x11, 0x78, + 0x78, 0x34, 0x90, 0x05, 0x11, 0x60, 0x7a, 0x38, 0xd2, 0xfc, 0x01, 0x28, + 0x70, 0xc4, 0x90, 0x05, 0x11, 0x10, 0x70, 0xc7, 0x00, 0x01, 0x70, 0x9b, + 0x00, 0x04, 0x00, 0x29, 0x00, 0x10, 0x08, 0x0c, 0x61, 0x53, 0x00, 0xfe, + 0x00, 0x05, 0x00, 0xf6, 0x70, 0x9b, 0x00, 0x05, 0x08, 0x0c, 0x60, 0xfb, + 0x20, 0x79, 0x02, 0x40, 0x78, 0x33, 0x11, 0x03, 0x78, 0x37, 0x00, 0x00, + 0x08, 0x0c, 0x61, 0x77, 0x08, 0x0c, 0x61, 0x5a, 0x11, 0x70, 0x70, 0x84, + 0x90, 0x05, 0x11, 0x58, 0x71, 0x5c, 0x91, 0x86, 0xff, 0xff, 0x01, 0x38, + 0x20, 0x11, 0x00, 0x08, 0x08, 0x0c, 0x5f, 0xaf, 0x01, 0x68, 0x08, 0x0c, + 0x61, 0x30, 0x20, 0xa9, 0x00, 0x08, 0x20, 0xe1, 0x00, 0x00, 0x20, 0x99, + 0x02, 0x6e, 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, 0x02, 0x4e, 0x40, 0x03, + 0x60, 0xc3, 0x00, 0x14, 0x08, 0x0c, 0x60, 0x2c, 0x00, 0xfe, 0x00, 0x05, + 0x00, 0xf6, 0x70, 0x90, 0x90, 0x05, 0x05, 0x00, 0x20, 0x11, 0x60, 0x02, + 0x08, 0x0c, 0x89, 0x93, 0x90, 0x86, 0x00, 0x14, 0x11, 0xb8, 0x08, 0x0c, + 0x61, 0x77, 0x20, 0x79, 0x02, 0x60, 0x7a, 0x30, 0x92, 0x96, 0x11, 0x03, + 0x11, 0x78, 0x78, 0x34, 0x90, 0x05, 0x11, 0x60, 0x7a, 0x38, 0xd2, 0xfc, + 0x01, 0x28, 0x70, 0xc4, 0x90, 0x05, 0x11, 0x10, 0x70, 0xc7, 0x00, 0x01, + 0x70, 0x9b, 0x00, 0x06, 0x00, 0x29, 0x00, 0x10, 0x08, 0x0c, 0x61, 0x53, + 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, 0x70, 0x9b, 0x00, 0x07, 0x08, 0x0c, + 0x60, 0xfb, 0x20, 0x79, 0x02, 0x40, 0x78, 0x33, 0x11, 0x04, 0x78, 0x37, + 0x00, 0x00, 0x08, 0x0c, 0x61, 0x77, 0x08, 0x0c, 0x61, 0x5a, 0x11, 0xb8, + 0x70, 0x84, 0x90, 0x05, 0x11, 0xa0, 0x71, 0x64, 0x91, 0x86, 0xff, 0xff, + 0x01, 0x80, 0x91, 0x80, 0x34, 0x8e, 0x20, 0x0d, 0x91, 0x8c, 0xff, 0x00, + 0x81, 0x0f, 0x20, 0x11, 0x00, 0x08, 0x08, 0x0c, 0x5f, 0xaf, 0x01, 0x80, + 0x08, 0x0c, 0x51, 0x2e, 0x01, 0x10, 0x08, 0x0c, 0x26, 0xf5, 0x20, 0xa9, + 0x00, 0x08, 0x20, 0xe1, 0x00, 0x00, 0x20, 0x99, 0x02, 0x6e, 0x20, 0xe9, + 0x00, 0x00, 0x20, 0xa1, 0x02, 0x4e, 0x40, 0x03, 0x60, 0xc3, 0x00, 0x14, + 0x08, 0x0c, 0x60, 0x2c, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, 0x70, 0x90, + 0x90, 0x05, 0x05, 0x00, 0x20, 0x11, 0x60, 0x02, 0x08, 0x0c, 0x89, 0x93, + 0x90, 0x86, 0x00, 0x14, 0x11, 0xb8, 0x08, 0x0c, 0x61, 0x77, 0x20, 0x79, + 0x02, 0x60, 0x7a, 0x30, 0x92, 0x96, 0x11, 0x04, 0x11, 0x78, 0x78, 0x34, + 0x90, 0x05, 0x11, 0x60, 0x7a, 0x38, 0xd2, 0xfc, 0x01, 0x28, 0x70, 0xc4, + 0x90, 0x05, 0x11, 0x10, 0x70, 0xc7, 0x00, 0x01, 0x70, 0x9b, 0x00, 0x08, + 0x00, 0x29, 0x00, 0x10, 0x08, 0x0c, 0x61, 0x53, 0x00, 0xfe, 0x00, 0x05, + 0x00, 0xf6, 0x70, 0x9b, 0x00, 0x09, 0x08, 0x0c, 0x60, 0xfb, 0x20, 0x79, + 0x02, 0x40, 0x78, 0x33, 0x11, 0x05, 0x78, 0x37, 0x01, 0x00, 0x08, 0x0c, + 0x61, 0x5a, 0x11, 0x50, 0x70, 0x84, 0x90, 0x05, 0x11, 0x38, 0x08, 0x0c, + 0x5f, 0x22, 0x11, 0x88, 0x90, 0x85, 0x00, 0x01, 0x08, 0x0c, 0x26, 0xf5, + 0x20, 0xa9, 0x00, 0x08, 0x08, 0x0c, 0x61, 0x77, 0x20, 0xe1, 0x00, 0x00, + 0x20, 0x99, 0x02, 0x6e, 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, 0x02, 0x4e, + 0x40, 0x03, 0x60, 0xc3, 0x00, 0x14, 0x08, 0x0c, 0x60, 0x2c, 0x00, 0x10, + 0x08, 0x0c, 0x5a, 0x7c, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, 0x70, 0x90, + 0x90, 0x05, 0x05, 0xa8, 0x20, 0x11, 0x60, 0x02, 0x08, 0x0c, 0x89, 0x93, + 0x90, 0x86, 0x00, 0x14, 0x15, 0x60, 0x08, 0x0c, 0x61, 0x77, 0x20, 0x79, + 0x02, 0x60, 0x7a, 0x30, 0x92, 0x96, 0x11, 0x05, 0x15, 0x20, 0x78, 0x34, + 0x90, 0x84, 0x01, 0x00, 0x20, 0x11, 0x01, 0x00, 0x92, 0x1e, 0x11, 0x60, + 0x7a, 0x38, 0xd2, 0xfc, 0x01, 0x28, 0x70, 0xc4, 0x90, 0x05, 0x11, 0x10, + 0x70, 0xc7, 0x00, 0x01, 0x70, 0x9b, 0x00, 0x0a, 0x00, 0xb1, 0x00, 0x98, + 0x90, 0x05, 0x11, 0x78, 0x7a, 0x38, 0xd2, 0xfc, 0x01, 0x28, 0x70, 0xc4, + 0x90, 0x05, 0x11, 0x10, 0x70, 0xc7, 0x00, 0x01, 0x70, 0x97, 0x00, 0x00, + 0x70, 0x9b, 0x00, 0x0e, 0x08, 0x0c, 0x5c, 0xca, 0x00, 0x10, 0x08, 0x0c, + 0x61, 0x53, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, 0x70, 0x9b, 0x00, 0x0b, + 0x20, 0x11, 0x1d, 0x0e, 0x20, 0xe9, 0x00, 0x01, 0x22, 0xa0, 0x20, 0xa9, + 0x00, 0x40, 0x20, 0x19, 0xff, 0xff, 0x43, 0x04, 0x08, 0x0c, 0x60, 0xfb, + 0x20, 0x79, 0x02, 0x40, 0x78, 0x33, 0x11, 0x06, 0x78, 0x37, 0x00, 0x00, + 0x08, 0x0c, 0x61, 0x5a, 0x01, 0x18, 0x20, 0x13, 0x00, 0x00, 0x00, 0x20, + 0x70, 0x60, 0x90, 0x85, 0x01, 0x00, 0x20, 0x12, 0x20, 0xa9, 0x00, 0x40, + 0x20, 0x09, 0x02, 0x4e, 0x20, 0x11, 0x1d, 0x0e, 0x22, 0x0e, 0x82, 0x10, + 0x81, 0x08, 0x91, 0x86, 0x02, 0x60, 0x11, 0x28, 0x68, 0x10, 0x80, 0x00, + 0x68, 0x12, 0x20, 0x09, 0x02, 0x40, 0x1f, 0x04, 0x5c, 0x4c, 0x60, 0xc3, + 0x00, 0x84, 0x08, 0x0c, 0x60, 0x2c, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, + 0x70, 0x90, 0x90, 0x05, 0x01, 0xc0, 0x20, 0x11, 0x60, 0x02, 0x08, 0x0c, + 0x89, 0x93, 0x90, 0x86, 0x00, 0x84, 0x11, 0x78, 0x08, 0x0c, 0x61, 0x77, + 0x20, 0x79, 0x02, 0x60, 0x7a, 0x30, 0x92, 0x96, 0x11, 0x06, 0x11, 0x38, + 0x78, 0x34, 0x90, 0x05, 0x11, 0x20, 0x70, 0x9b, 0x00, 0x0c, 0x00, 0x29, + 0x00, 0x10, 0x08, 0x0c, 0x61, 0x53, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, + 0x70, 0x9b, 0x00, 0x0d, 0x08, 0x0c, 0x60, 0xfb, 0x20, 0x79, 0x02, 0x40, + 0x78, 0x33, 0x11, 0x07, 0x78, 0x37, 0x00, 0x00, 0x08, 0x0c, 0x61, 0x77, + 0x20, 0xa9, 0x00, 0x40, 0x20, 0x11, 0x02, 0x6e, 0x20, 0x09, 0x02, 0x4e, + 0x22, 0x0e, 0x82, 0x10, 0x81, 0x08, 0x91, 0x86, 0x02, 0x60, 0x11, 0x50, + 0x68, 0x10, 0x80, 0x00, 0x68, 0x12, 0x20, 0x09, 0x02, 0x40, 0x68, 0x14, + 0x80, 0x00, 0x68, 0x16, 0x20, 0x11, 0x02, 0x60, 0x1f, 0x04, 0x5c, 0x90, + 0x60, 0xc3, 0x00, 0x84, 0x08, 0x0c, 0x60, 0x2c, 0x00, 0xfe, 0x00, 0x05, + 0x00, 0xf6, 0x70, 0x90, 0x90, 0x05, 0x01, 0xe0, 0x20, 0x11, 0x60, 0x02, + 0x08, 0x0c, 0x89, 0x93, 0x90, 0x86, 0x00, 0x84, 0x11, 0x98, 0x08, 0x0c, + 0x61, 0x77, 0x20, 0x79, 0x02, 0x60, 0x7a, 0x30, 0x92, 0x96, 0x11, 0x07, + 0x11, 0x58, 0x78, 0x34, 0x90, 0x05, 0x11, 0x40, 0x70, 0x97, 0x00, 0x01, + 0x08, 0x0c, 0x60, 0xcd, 0x70, 0x9b, 0x00, 0x0e, 0x00, 0x29, 0x00, 0x10, + 0x08, 0x0c, 0x61, 0x53, 0x00, 0xfe, 0x00, 0x05, 0x91, 0x8d, 0x00, 0x01, + 0x08, 0x0c, 0x61, 0xa2, 0x70, 0x9b, 0x00, 0x0f, 0x70, 0x93, 0x00, 0x00, + 0x20, 0x61, 0x01, 0x40, 0x60, 0x5b, 0xbc, 0x85, 0x60, 0x5f, 0xb5, 0xb5, + 0x20, 0x61, 0x01, 0x00, 0x60, 0x43, 0x00, 0x05, 0x60, 0x43, 0x00, 0x04, + 0x20, 0x09, 0x07, 0xd0, 0x20, 0x11, 0x60, 0x02, 0x08, 0x0c, 0x89, 0x87, + 0x00, 0x05, 0x70, 0x90, 0x90, 0x05, 0x01, 0x30, 0x20, 0x11, 0x60, 0x02, + 0x08, 0x0c, 0x89, 0x93, 0x70, 0x9b, 0x00, 0x00, 0x00, 0x05, 0x70, 0x9b, + 0x00, 0x11, 0x08, 0x0c, 0xaa, 0xf1, 0x08, 0x0c, 0x61, 0x77, 0x20, 0xe1, + 0x00, 0x00, 0x20, 0x99, 0x02, 0x60, 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, + 0x02, 0x40, 0x74, 0x90, 0x94, 0x80, 0x00, 0x18, 0x90, 0x80, 0x00, 0x07, + 0x90, 0x84, 0x03, 0xf8, 0x80, 0x04, 0x20, 0xa8, 0x40, 0x03, 0x08, 0x0c, + 0x61, 0x5a, 0x11, 0xa0, 0x71, 0x7c, 0x81, 0xff, 0x01, 0x88, 0x90, 0x0e, + 0x70, 0x80, 0x90, 0x84, 0x00, 0xff, 0x01, 0x60, 0x08, 0x0c, 0x26, 0x8c, + 0x91, 0x86, 0x00, 0x7e, 0x01, 0x38, 0x91, 0x86, 0x00, 0x80, 0x01, 0x20, + 0x20, 0x11, 0x00, 0x08, 0x08, 0x0c, 0x5f, 0xaf, 0x60, 0xc3, 0x00, 0x14, + 0x08, 0x0c, 0x60, 0x2c, 0x00, 0x05, 0x00, 0xf6, 0x70, 0x90, 0x90, 0x05, + 0x05, 0x00, 0x20, 0x11, 0x60, 0x02, 0x08, 0x0c, 0x89, 0x93, 0x90, 0x86, + 0x00, 0x14, 0x11, 0xb8, 0x08, 0x0c, 0x61, 0x77, 0x20, 0x79, 0x02, 0x60, + 0x7a, 0x30, 0x92, 0x96, 0x11, 0x03, 0x11, 0x78, 0x78, 0x34, 0x90, 0x05, + 0x11, 0x60, 0x7a, 0x38, 0xd2, 0xfc, 0x01, 0x28, 0x70, 0xc4, 0x90, 0x05, + 0x11, 0x10, 0x70, 0xc7, 0x00, 0x01, 0x70, 0x9b, 0x00, 0x12, 0x00, 0x29, + 0x00, 0x10, 0x70, 0x93, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, + 0x70, 0x9b, 0x00, 0x13, 0x08, 0x0c, 0x61, 0x09, 0x20, 0x79, 0x02, 0x40, + 0x78, 0x33, 0x11, 0x03, 0x78, 0x37, 0x00, 0x00, 0x08, 0x0c, 0x61, 0x77, + 0x08, 0x0c, 0x61, 0x5a, 0x11, 0x70, 0x70, 0x84, 0x90, 0x05, 0x11, 0x58, + 0x71, 0x5c, 0x91, 0x86, 0xff, 0xff, 0x01, 0x38, 0x20, 0x11, 0x00, 0x08, + 0x08, 0x0c, 0x5f, 0xaf, 0x01, 0x68, 0x08, 0x0c, 0x61, 0x30, 0x20, 0xa9, + 0x00, 0x08, 0x20, 0xe1, 0x00, 0x00, 0x20, 0x99, 0x02, 0x6e, 0x20, 0xe9, + 0x00, 0x00, 0x20, 0xa1, 0x02, 0x4e, 0x40, 0x03, 0x60, 0xc3, 0x00, 0x14, + 0x08, 0x0c, 0x60, 0x2c, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, 0x70, 0x90, + 0x90, 0x05, 0x05, 0x00, 0x20, 0x11, 0x60, 0x02, 0x08, 0x0c, 0x89, 0x93, + 0x90, 0x86, 0x00, 0x14, 0x11, 0xb8, 0x08, 0x0c, 0x61, 0x77, 0x20, 0x79, + 0x02, 0x60, 0x7a, 0x30, 0x92, 0x96, 0x11, 0x04, 0x11, 0x78, 0x78, 0x34, + 0x90, 0x05, 0x11, 0x60, 0x7a, 0x38, 0xd2, 0xfc, 0x01, 0x28, 0x70, 0xc4, + 0x90, 0x05, 0x11, 0x10, 0x70, 0xc7, 0x00, 0x01, 0x70, 0x9b, 0x00, 0x14, + 0x00, 0x29, 0x00, 0x10, 0x70, 0x93, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x05, + 0x00, 0xf6, 0x70, 0x9b, 0x00, 0x15, 0x08, 0x0c, 0x61, 0x09, 0x20, 0x79, + 0x02, 0x40, 0x78, 0x33, 0x11, 0x04, 0x78, 0x37, 0x00, 0x00, 0x08, 0x0c, + 0x61, 0x77, 0x08, 0x0c, 0x61, 0x5a, 0x11, 0xb8, 0x70, 0x84, 0x90, 0x05, + 0x11, 0xa0, 0x71, 0x64, 0x91, 0x86, 0xff, 0xff, 0x01, 0x80, 0x91, 0x80, + 0x34, 0x8e, 0x20, 0x0d, 0x91, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0x20, 0x11, + 0x00, 0x08, 0x08, 0x0c, 0x5f, 0xaf, 0x01, 0x80, 0x08, 0x0c, 0x51, 0x2e, + 0x01, 0x10, 0x08, 0x0c, 0x26, 0xf5, 0x20, 0xa9, 0x00, 0x08, 0x20, 0xe1, + 0x00, 0x00, 0x20, 0x99, 0x02, 0x6e, 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, + 0x02, 0x4e, 0x40, 0x03, 0x60, 0xc3, 0x00, 0x14, 0x08, 0x0c, 0x60, 0x2c, + 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, 0x70, 0x90, 0x90, 0x05, 0x05, 0xf0, + 0x20, 0x11, 0x60, 0x02, 0x08, 0x0c, 0x89, 0x93, 0x90, 0x86, 0x00, 0x14, + 0x15, 0xa8, 0x08, 0x0c, 0x61, 0x77, 0x20, 0x79, 0x02, 0x60, 0x7a, 0x30, + 0x92, 0x96, 0x11, 0x05, 0x15, 0x68, 0x78, 0x34, 0x90, 0x84, 0x01, 0x00, + 0x20, 0x11, 0x01, 0x00, 0x92, 0x1e, 0x11, 0x68, 0x90, 0x85, 0x00, 0x01, + 0x08, 0x0c, 0x61, 0xa2, 0x7a, 0x38, 0xd2, 0xfc, 0x01, 0x28, 0x70, 0xc4, + 0x90, 0x05, 0x11, 0x10, 0x70, 0xc7, 0x00, 0x01, 0x00, 0x80, 0x90, 0x05, + 0x11, 0xb8, 0x7a, 0x38, 0xd2, 0xfc, 0x01, 0x28, 0x70, 0xc4, 0x90, 0x05, + 0x11, 0x10, 0x70, 0xc7, 0x00, 0x01, 0x90, 0x85, 0x00, 0x01, 0x08, 0x0c, + 0x61, 0xa2, 0x70, 0x97, 0x00, 0x00, 0x7a, 0x38, 0xd2, 0xf4, 0x01, 0x10, + 0x70, 0xdf, 0x00, 0x08, 0x70, 0x9b, 0x00, 0x16, 0x00, 0x29, 0x00, 0x10, + 0x70, 0x93, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x05, 0x08, 0x0c, 0xaa, 0xf1, + 0x08, 0x0c, 0x61, 0x77, 0x20, 0xe1, 0x00, 0x00, 0x20, 0x99, 0x02, 0x60, + 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, 0x02, 0x40, 0x20, 0xa9, 0x00, 0x0e, + 0x40, 0x03, 0x20, 0x11, 0x02, 0x6d, 0x22, 0x04, 0x90, 0x84, 0x01, 0x00, + 0x20, 0x11, 0x02, 0x4d, 0x20, 0x12, 0x20, 0x11, 0x02, 0x6e, 0x70, 0x9b, + 0x00, 0x17, 0x08, 0x0c, 0x61, 0x5a, 0x11, 0x50, 0x70, 0x84, 0x90, 0x05, + 0x11, 0x38, 0x08, 0x0c, 0x5f, 0x22, 0x11, 0x88, 0x90, 0x85, 0x00, 0x01, + 0x08, 0x0c, 0x26, 0xf5, 0x20, 0xa9, 0x00, 0x08, 0x08, 0x0c, 0x61, 0x77, + 0x20, 0xe1, 0x00, 0x00, 0x20, 0x99, 0x02, 0x6e, 0x20, 0xe9, 0x00, 0x00, + 0x20, 0xa1, 0x02, 0x4e, 0x40, 0x03, 0x60, 0xc3, 0x00, 0x14, 0x08, 0x0c, + 0x60, 0x2c, 0x00, 0x10, 0x08, 0x0c, 0x5a, 0x7c, 0x00, 0x05, 0x00, 0xf6, + 0x70, 0x90, 0x90, 0x05, 0x01, 0xd8, 0x20, 0x11, 0x60, 0x02, 0x08, 0x0c, + 0x89, 0x93, 0x90, 0x86, 0x00, 0x84, 0x11, 0x90, 0x08, 0x0c, 0x61, 0x77, + 0x20, 0x79, 0x02, 0x60, 0x7a, 0x30, 0x92, 0x96, 0x11, 0x06, 0x11, 0x50, + 0x78, 0x34, 0x90, 0x05, 0x11, 0x38, 0x90, 0x06, 0x08, 0x0c, 0x61, 0xa2, + 0x70, 0x9b, 0x00, 0x18, 0x00, 0x29, 0x00, 0x10, 0x70, 0x93, 0x00, 0x00, + 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, 0x70, 0x9b, 0x00, 0x19, 0x08, 0x0c, + 0x61, 0x09, 0x20, 0x79, 0x02, 0x40, 0x78, 0x33, 0x11, 0x06, 0x78, 0x37, + 0x00, 0x00, 0x08, 0x0c, 0x61, 0x77, 0x20, 0x09, 0x02, 0x6e, 0x20, 0x39, + 0x1d, 0x0e, 0x20, 0xa9, 0x00, 0x40, 0x21, 0x3e, 0x87, 0x38, 0x81, 0x08, + 0x91, 0x86, 0x02, 0x80, 0x11, 0x28, 0x68, 0x14, 0x80, 0x00, 0x68, 0x16, + 0x20, 0x09, 0x02, 0x60, 0x1f, 0x04, 0x5e, 0x8b, 0x20, 0x39, 0x1d, 0x0e, + 0x08, 0x0c, 0x61, 0x5a, 0x11, 0xe8, 0x27, 0x28, 0x25, 0x14, 0x82, 0x07, + 0x90, 0x84, 0x00, 0xff, 0x80, 0x00, 0x20, 0x18, 0x92, 0x94, 0x00, 0xff, + 0x80, 0x07, 0x92, 0x05, 0x20, 0x2a, 0x70, 0x60, 0x23, 0x10, 0x82, 0x14, + 0x92, 0xa0, 0x1d, 0x0e, 0x24, 0x14, 0x93, 0x8c, 0x00, 0x01, 0x01, 0x18, + 0x92, 0x94, 0xff, 0x00, 0x00, 0x18, 0x92, 0x94, 0x00, 0xff, 0x80, 0x07, + 0x92, 0x15, 0x22, 0x22, 0x20, 0xa9, 0x00, 0x40, 0x20, 0x09, 0x02, 0x4e, + 0x27, 0x0e, 0x87, 0x38, 0x81, 0x08, 0x91, 0x86, 0x02, 0x60, 0x11, 0x28, + 0x68, 0x10, 0x80, 0x00, 0x68, 0x12, 0x20, 0x09, 0x02, 0x40, 0x1f, 0x04, + 0x5e, 0xbe, 0x60, 0xc3, 0x00, 0x84, 0x08, 0x0c, 0x60, 0x2c, 0x00, 0xfe, + 0x00, 0x05, 0x00, 0xf6, 0x70, 0x90, 0x90, 0x05, 0x01, 0xe0, 0x20, 0x11, + 0x60, 0x02, 0x08, 0x0c, 0x89, 0x93, 0x90, 0x86, 0x00, 0x84, 0x11, 0x98, + 0x08, 0x0c, 0x61, 0x77, 0x20, 0x79, 0x02, 0x60, 0x7a, 0x30, 0x92, 0x96, + 0x11, 0x07, 0x11, 0x58, 0x78, 0x34, 0x90, 0x05, 0x11, 0x40, 0x70, 0x97, + 0x00, 0x01, 0x08, 0x0c, 0x60, 0xcd, 0x70, 0x9b, 0x00, 0x1a, 0x00, 0x29, + 0x00, 0x10, 0x70, 0x93, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x05, 0x90, 0x85, + 0x00, 0x01, 0x08, 0x0c, 0x61, 0xa2, 0x70, 0x9b, 0x00, 0x1b, 0x08, 0x0c, + 0xaa, 0xf1, 0x08, 0x0c, 0x61, 0x77, 0x20, 0x11, 0x02, 0x60, 0x20, 0x09, + 0x02, 0x40, 0x74, 0x90, 0x94, 0x80, 0x00, 0x18, 0x90, 0x80, 0x00, 0x07, + 0x90, 0x84, 0x03, 0xf8, 0x80, 0x04, 0x20, 0xa8, 0x22, 0x0e, 0x82, 0x10, + 0x81, 0x08, 0x91, 0x86, 0x02, 0x60, 0x11, 0x50, 0x68, 0x10, 0x80, 0x00, + 0x68, 0x12, 0x20, 0x09, 0x02, 0x40, 0x68, 0x14, 0x80, 0x00, 0x68, 0x16, + 0x20, 0x11, 0x02, 0x60, 0x1f, 0x04, 0x5f, 0x0a, 0x60, 0xc3, 0x00, 0x84, + 0x08, 0x0c, 0x60, 0x2c, 0x00, 0x05, 0x00, 0x05, 0x00, 0x86, 0x00, 0x96, + 0x20, 0x29, 0x18, 0x48, 0x25, 0x2c, 0x20, 0xa9, 0x00, 0x08, 0x20, 0x41, + 0x1d, 0x0e, 0x20, 0xe9, 0x00, 0x01, 0x28, 0xa0, 0x08, 0x0c, 0x61, 0x77, + 0x20, 0xe1, 0x00, 0x00, 0x20, 0x99, 0x02, 0x6e, 0x40, 0x03, 0x20, 0xa9, + 0x00, 0x08, 0x20, 0x11, 0x00, 0x07, 0xd5, 0xd4, 0x01, 0x08, 0x90, 0x16, + 0x28, 0x00, 0x92, 0x00, 0x20, 0x0c, 0x91, 0xa6, 0xff, 0xff, 0x11, 0x48, + 0xd5, 0xd4, 0x01, 0x10, 0x82, 0x10, 0x00, 0x08, 0x82, 0x11, 0x1f, 0x04, + 0x5f, 0x3c, 0x08, 0x04, 0x5f, 0xab, 0x82, 0xff, 0x11, 0x60, 0xd5, 0xd4, + 0x01, 0x20, 0x91, 0xa6, 0x3f, 0xff, 0x0d, 0x90, 0x00, 0x20, 0x91, 0xa6, + 0x3f, 0xff, 0x09, 0x04, 0x5f, 0xab, 0x91, 0x8d, 0xc0, 0x00, 0x20, 0xa9, + 0x00, 0x10, 0x20, 0x19, 0x00, 0x01, 0xd5, 0xd4, 0x01, 0x10, 0x20, 0x19, + 0x00, 0x10, 0x21, 0x20, 0xd5, 0xd4, 0x01, 0x10, 0x84, 0x23, 0x00, 0x08, + 0x84, 0x24, 0x12, 0x40, 0xd5, 0xd4, 0x01, 0x10, 0x83, 0x19, 0x00, 0x08, + 0x83, 0x18, 0x1f, 0x04, 0x5f, 0x62, 0x04, 0xd8, 0x23, 0xa8, 0x20, 0x21, + 0x00, 0x01, 0x84, 0x26, 0x84, 0x25, 0x1f, 0x04, 0x5f, 0x74, 0x23, 0x28, + 0x85, 0x29, 0x92, 0xbe, 0x00, 0x07, 0x01, 0x58, 0x00, 0x06, 0x20, 0x39, + 0x00, 0x07, 0x22, 0x00, 0x97, 0x3a, 0x00, 0x0e, 0x27, 0xa8, 0x95, 0xa8, + 0x00, 0x10, 0x1f, 0x04, 0x5f, 0x83, 0x75, 0x5e, 0x95, 0xc8, 0x34, 0x8e, + 0x29, 0x2d, 0x95, 0xac, 0x00, 0xff, 0x75, 0x82, 0x65, 0x32, 0x65, 0x36, + 0x00, 0x16, 0x25, 0x08, 0x08, 0x0c, 0x26, 0xd5, 0x00, 0x1e, 0x60, 0xe7, + 0x00, 0x00, 0x65, 0xea, 0x20, 0x18, 0x23, 0x04, 0x94, 0x05, 0x20, 0x1a, + 0x70, 0x87, 0x00, 0x01, 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, 0x02, 0x4e, + 0x20, 0xe1, 0x00, 0x01, 0x28, 0x98, 0x20, 0xa9, 0x00, 0x08, 0x40, 0x03, + 0x90, 0x85, 0x00, 0x01, 0x00, 0x08, 0x90, 0x06, 0x00, 0x9e, 0x00, 0x8e, + 0x00, 0x05, 0x01, 0x56, 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x36, 0x01, 0x46, + 0x22, 0xa8, 0x20, 0xe1, 0x00, 0x00, 0x20, 0x99, 0x02, 0x6e, 0x20, 0xe9, + 0x00, 0x00, 0x20, 0x11, 0x02, 0x4e, 0x22, 0xa0, 0x40, 0x03, 0x01, 0x4e, + 0x01, 0x3e, 0x01, 0xde, 0x01, 0xce, 0x01, 0x5e, 0x21, 0x18, 0x90, 0x26, + 0x20, 0x01, 0x00, 0x07, 0x93, 0x9a, 0x00, 0x10, 0x02, 0x18, 0x84, 0x20, + 0x80, 0x01, 0x0c, 0xd0, 0x21, 0x18, 0x84, 0xff, 0x01, 0x20, 0x93, 0x9a, + 0x00, 0x10, 0x84, 0x21, 0x1d, 0xe0, 0x20, 0x21, 0x00, 0x01, 0x83, 0xff, + 0x01, 0x18, 0x84, 0x23, 0x83, 0x19, 0x1d, 0xe8, 0x92, 0x38, 0x20, 0x29, + 0x02, 0x6e, 0x95, 0x28, 0x25, 0x04, 0x94, 0x2c, 0x11, 0xb8, 0x94, 0x05, + 0x20, 0x3a, 0x71, 0x5e, 0x91, 0xa0, 0x34, 0x8e, 0x24, 0x2d, 0x95, 0xac, + 0x00, 0xff, 0x75, 0x82, 0x65, 0x32, 0x65, 0x36, 0x00, 0x16, 0x25, 0x08, + 0x08, 0x0c, 0x26, 0xd5, 0x00, 0x1e, 0x60, 0xe7, 0x00, 0x00, 0x65, 0xea, + 0x70, 0x87, 0x00, 0x01, 0x90, 0x84, 0x00, 0x00, 0x00, 0x05, 0x00, 0xe6, + 0x20, 0x71, 0x18, 0x00, 0x70, 0x8b, 0x00, 0x00, 0x00, 0xee, 0x00, 0x05, + 0x00, 0xe6, 0x00, 0xf6, 0x20, 0x79, 0x01, 0x00, 0x20, 0x71, 0x01, 0x40, + 0x08, 0x0c, 0x60, 0xbc, 0x08, 0x0c, 0xa2, 0xa0, 0x70, 0x04, 0x90, 0x84, + 0x40, 0x00, 0x01, 0x10, 0x08, 0x0c, 0x2a, 0xa9, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x71, 0x18, 0x26, 0x20, 0x73, 0x00, 0x00, 0x78, 0x40, + 0x00, 0x26, 0x00, 0x16, 0x20, 0x09, 0x00, 0xf7, 0x08, 0x0c, 0x61, 0x19, + 0x00, 0x1e, 0x90, 0x94, 0x00, 0x10, 0x92, 0x85, 0x00, 0x80, 0x78, 0x42, + 0x7a, 0x42, 0x00, 0x2e, 0x01, 0x2e, 0x00, 0xfe, 0x00, 0xee, 0x00, 0x05, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x2a, 0x04, 0x02, 0x28, + 0x20, 0x11, 0x01, 0x01, 0x22, 0x04, 0xc0, 0xc5, 0x20, 0x12, 0x20, 0x11, + 0x19, 0xf5, 0x20, 0x13, 0x00, 0x00, 0x70, 0x93, 0x00, 0x00, 0x01, 0x2e, + 0x60, 0xa3, 0x00, 0x56, 0x60, 0xa7, 0x95, 0x75, 0x08, 0x0c, 0xa2, 0x93, + 0x61, 0x44, 0xd1, 0x84, 0x01, 0x20, 0x71, 0x98, 0x91, 0x8d, 0x20, 0x00, + 0x00, 0x18, 0x71, 0x8c, 0x91, 0x8d, 0x10, 0x00, 0x20, 0x11, 0x19, 0x99, + 0x21, 0x12, 0x20, 0x09, 0x07, 0xd0, 0x20, 0x11, 0x60, 0x02, 0x08, 0x0c, + 0x8a, 0x5d, 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, 0x00, 0xc6, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0xac, 0xfc, 0x08, 0x0c, 0xb0, 0x9b, + 0x08, 0x0c, 0xad, 0x18, 0x20, 0x09, 0x00, 0xf7, 0x08, 0x0c, 0x61, 0x19, + 0x20, 0x61, 0x1a, 0x04, 0x90, 0x0e, 0x61, 0x1a, 0x61, 0x1e, 0x61, 0x7a, + 0x61, 0x7e, 0x20, 0x61, 0x18, 0x00, 0x60, 0x03, 0x00, 0x01, 0x20, 0x61, + 0x01, 0x00, 0x60, 0x43, 0x00, 0x90, 0x60, 0x43, 0x00, 0x10, 0x20, 0x09, + 0x19, 0x99, 0x20, 0x0b, 0x00, 0x00, 0x20, 0x09, 0x00, 0x2d, 0x20, 0x11, + 0x60, 0x88, 0x08, 0x0c, 0x89, 0x87, 0x01, 0x2e, 0x00, 0xce, 0x00, 0x2e, + 0x00, 0x1e, 0x00, 0x05, 0x00, 0xe6, 0x00, 0x06, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x04, 0x71, 0x20, 0x71, 0x01, 0x00, 0x08, 0x0c, 0xa2, 0xa0, + 0x20, 0x71, 0x01, 0x40, 0x70, 0x04, 0x90, 0x84, 0x40, 0x00, 0x01, 0x10, + 0x08, 0x0c, 0x2a, 0xa9, 0x08, 0x0c, 0x77, 0xa6, 0x01, 0x88, 0x08, 0x0c, + 0x77, 0xc1, 0x11, 0x70, 0x08, 0x0c, 0x7a, 0xc0, 0x00, 0x16, 0x08, 0x0c, + 0x27, 0xa4, 0x20, 0x01, 0x19, 0x6d, 0x21, 0x02, 0x00, 0x1e, 0x08, 0x0c, + 0x7a, 0xbb, 0x08, 0x0c, 0x76, 0xcd, 0x00, 0x50, 0x20, 0x09, 0x00, 0x01, + 0x08, 0x0c, 0x2a, 0x85, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x26, 0x31, + 0x08, 0x0c, 0x60, 0x58, 0x01, 0x2e, 0x00, 0x0e, 0x00, 0xee, 0x00, 0x05, + 0x20, 0x01, 0x18, 0x0e, 0x20, 0x04, 0xd0, 0xbc, 0x01, 0x58, 0x00, 0x26, + 0x00, 0x36, 0x20, 0x11, 0x80, 0x17, 0x20, 0x01, 0x19, 0x99, 0x20, 0x1c, + 0x08, 0x0c, 0x4c, 0xa1, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x05, 0x20, 0xa9, + 0x00, 0x12, 0x20, 0xe9, 0x00, 0x01, 0x20, 0xa1, 0x1d, 0x80, 0x08, 0x0c, + 0x61, 0x77, 0x20, 0xe9, 0x00, 0x00, 0x20, 0x99, 0x02, 0x6e, 0x00, 0x99, + 0x20, 0xa9, 0x00, 0x20, 0x08, 0x0c, 0x61, 0x71, 0x20, 0x99, 0x02, 0x60, + 0x20, 0xa1, 0x1d, 0x92, 0x00, 0x51, 0x20, 0xa9, 0x00, 0x0e, 0x08, 0x0c, + 0x61, 0x74, 0x20, 0x99, 0x02, 0x60, 0x20, 0xa1, 0x1d, 0xb2, 0x00, 0x09, + 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, 0x34, 0x10, 0x33, 0x08, 0x21, 0x04, + 0x80, 0x07, 0x20, 0x12, 0x81, 0x08, 0x82, 0x10, 0x1f, 0x04, 0x60, 0xf1, + 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x08, 0x0c, 0xaa, 0xf1, 0x20, 0xe1, + 0x00, 0x01, 0x20, 0x99, 0x1d, 0x00, 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, + 0x02, 0x40, 0x20, 0xa9, 0x00, 0x0c, 0x40, 0x03, 0x00, 0x05, 0x08, 0x0c, + 0xaa, 0xf1, 0x08, 0x0c, 0x61, 0x77, 0x20, 0xe1, 0x00, 0x00, 0x20, 0x99, + 0x02, 0x60, 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, 0x02, 0x40, 0x20, 0xa9, + 0x00, 0x0c, 0x40, 0x03, 0x00, 0x05, 0x00, 0xc6, 0x00, 0x06, 0x20, 0x61, + 0x01, 0x00, 0x81, 0x0f, 0x20, 0x01, 0x18, 0x34, 0x20, 0x04, 0x90, 0x05, + 0x11, 0x38, 0x20, 0x01, 0x18, 0x18, 0x20, 0x04, 0x90, 0x84, 0x00, 0xff, + 0x91, 0x05, 0x00, 0x10, 0x91, 0x85, 0x00, 0xf7, 0x60, 0x4a, 0x00, 0x0e, + 0x00, 0xce, 0x00, 0x05, 0x00, 0x16, 0x00, 0x46, 0x08, 0x0c, 0x6c, 0x0d, + 0x01, 0x58, 0x90, 0x06, 0x20, 0x20, 0x20, 0x09, 0x00, 0x2a, 0x08, 0x0c, + 0xea, 0x8d, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x0c, 0xc1, 0x95, 0x21, 0x02, + 0x20, 0x19, 0x00, 0x2a, 0x90, 0x0e, 0x08, 0x0c, 0x32, 0xda, 0x08, 0x0c, + 0xd6, 0x45, 0x01, 0x40, 0x00, 0x36, 0x20, 0x19, 0xff, 0xff, 0x20, 0x21, + 0x00, 0x07, 0x08, 0x0c, 0x4e, 0x58, 0x00, 0x3e, 0x00, 0x4e, 0x00, 0x1e, + 0x00, 0x05, 0x08, 0x0c, 0x60, 0x58, 0x70, 0x9b, 0x00, 0x00, 0x70, 0x93, + 0x00, 0x00, 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x04, + 0xd0, 0x9c, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x01, 0x01, 0x01, 0x20, 0x0c, + 0x91, 0x8d, 0x00, 0x06, 0x21, 0x02, 0x01, 0x2e, 0x00, 0x1e, 0x00, 0x0e, + 0x00, 0x05, 0x20, 0x09, 0x00, 0x01, 0x00, 0x20, 0x20, 0x09, 0x00, 0x02, + 0x00, 0x08, 0x90, 0x0e, 0x68, 0x14, 0x90, 0x84, 0xff, 0xc0, 0x91, 0x0d, + 0x69, 0x16, 0x00, 0x05, 0x00, 0xf6, 0x01, 0x56, 0x01, 0x46, 0x01, 0xd6, + 0x90, 0x06, 0x20, 0xa9, 0x00, 0x80, 0x20, 0xe9, 0x00, 0x01, 0x20, 0xa1, + 0x1d, 0x00, 0x40, 0x04, 0x20, 0x79, 0x1d, 0x00, 0x78, 0x03, 0x22, 0x00, + 0x78, 0x07, 0x00, 0xef, 0x78, 0x0f, 0x00, 0xef, 0x78, 0x13, 0x01, 0x38, + 0x78, 0x23, 0xff, 0xff, 0x78, 0x27, 0xff, 0xff, 0x01, 0xde, 0x01, 0x4e, + 0x01, 0x5e, 0x00, 0xfe, 0x00, 0x05, 0x20, 0x01, 0x18, 0x00, 0x20, 0x03, + 0x00, 0x01, 0x00, 0x05, 0x20, 0x01, 0x19, 0xa7, 0x01, 0x18, 0x20, 0x03, + 0x00, 0x01, 0x00, 0x10, 0x20, 0x03, 0x00, 0x00, 0x00, 0x05, 0x01, 0x56, + 0x20, 0xa9, 0x08, 0x00, 0x20, 0x09, 0x10, 0x00, 0x90, 0x06, 0x20, 0x0a, + 0x81, 0x08, 0x1f, 0x04, 0x61, 0xb1, 0x01, 0x5e, 0x00, 0x05, 0x00, 0xd6, + 0x00, 0x36, 0x01, 0x56, 0x01, 0x36, 0x01, 0x46, 0x20, 0x69, 0x18, 0x47, + 0x90, 0x06, 0xb8, 0x02, 0xb8, 0xd6, 0xb8, 0x07, 0x07, 0x07, 0xb8, 0x0a, + 0xb8, 0x0e, 0xb8, 0x12, 0x91, 0x98, 0x34, 0x8e, 0x23, 0x1d, 0x93, 0x9c, + 0x00, 0xff, 0xbb, 0x16, 0x00, 0x16, 0x00, 0x26, 0xb8, 0x86, 0x08, 0x0c, + 0xb0, 0x94, 0x11, 0x20, 0x91, 0x92, 0x00, 0x7e, 0x12, 0x08, 0xbb, 0x86, + 0x20, 0xa9, 0x00, 0x04, 0xb8, 0xc4, 0x20, 0xe8, 0xb9, 0xc8, 0x91, 0x98, + 0x00, 0x06, 0x90, 0x06, 0x23, 0xa0, 0x40, 0x04, 0x20, 0xa9, 0x00, 0x04, + 0x91, 0x98, 0x00, 0x0a, 0x23, 0xa0, 0x40, 0x04, 0x00, 0x2e, 0x00, 0x1e, + 0xb8, 0x3e, 0xb8, 0x42, 0xb8, 0xce, 0xb8, 0xd2, 0xb8, 0x5e, 0xb8, 0x62, + 0xb8, 0x66, 0xb8, 0x6a, 0xb8, 0x6f, 0x01, 0x00, 0xb8, 0x72, 0xb8, 0x76, + 0xb8, 0x7a, 0xb8, 0x8a, 0xb8, 0x8e, 0xb8, 0x93, 0x00, 0x08, 0xb8, 0x96, + 0xb8, 0x9a, 0xb8, 0x9e, 0xb8, 0xbe, 0xb9, 0xa2, 0x00, 0x96, 0xb8, 0xa4, + 0x90, 0x4d, 0x01, 0x10, 0x08, 0x0c, 0x10, 0x8b, 0xb8, 0xa7, 0x00, 0x00, + 0x00, 0x9e, 0x90, 0x06, 0xb8, 0x4a, 0x68, 0x10, 0xb8, 0x3a, 0x68, 0x0c, + 0xb8, 0x46, 0xb8, 0xbb, 0x05, 0x20, 0xb8, 0xac, 0x90, 0x05, 0x01, 0x98, + 0x00, 0xc6, 0x20, 0x60, 0x9c, 0x82, 0x1d, 0xdc, 0x0a, 0x0c, 0x0d, 0x85, + 0x20, 0x01, 0x18, 0x1a, 0x20, 0x04, 0x9c, 0x02, 0x1a, 0x0c, 0x0d, 0x85, + 0x08, 0x0c, 0x8e, 0xee, 0x00, 0xce, 0x09, 0x0c, 0x92, 0x8d, 0xb8, 0xaf, + 0x00, 0x00, 0x68, 0x14, 0x90, 0x84, 0x00, 0xff, 0xb8, 0x42, 0x01, 0x4e, + 0x01, 0x3e, 0x01, 0x5e, 0x00, 0x3e, 0x00, 0xde, 0x00, 0x05, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0xa9, 0x74, 0xae, 0x78, 0x96, 0x84, 0x3f, 0xff, + 0x90, 0x82, 0x40, 0x00, 0x1a, 0x04, 0x62, 0x8d, 0x91, 0x82, 0x08, 0x00, + 0x1a, 0x04, 0x62, 0x91, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x04, 0x90, 0x84, + 0x00, 0x03, 0x19, 0x04, 0x62, 0x97, 0x91, 0x88, 0x10, 0x00, 0x21, 0x04, + 0x90, 0x5d, 0x01, 0x98, 0xb8, 0x04, 0x90, 0x84, 0x00, 0xff, 0x90, 0x8e, + 0x00, 0x06, 0x11, 0x88, 0xb8, 0xa4, 0x90, 0x0d, 0x19, 0x04, 0x62, 0xa9, + 0x08, 0x0c, 0x66, 0x69, 0x90, 0x06, 0x01, 0x2e, 0x00, 0x05, 0x20, 0x01, + 0x00, 0x05, 0x90, 0x0e, 0x04, 0xb8, 0x20, 0x01, 0x00, 0x28, 0x90, 0x0e, + 0x04, 0x98, 0x90, 0x82, 0x00, 0x06, 0x12, 0x90, 0x08, 0x0c, 0xb0, 0x94, + 0x11, 0x60, 0xb8, 0xa0, 0x90, 0x84, 0xff, 0x80, 0x11, 0x40, 0xb9, 0x00, + 0xd1, 0xfc, 0x0d, 0x10, 0x20, 0x01, 0x00, 0x29, 0x20, 0x09, 0x10, 0x00, + 0x04, 0x08, 0x20, 0x01, 0x00, 0x28, 0x00, 0xa8, 0x20, 0x09, 0x18, 0x0c, + 0x21, 0x0c, 0xd1, 0x8c, 0x01, 0x18, 0x20, 0x01, 0x00, 0x04, 0x00, 0x68, + 0xd1, 0x84, 0x01, 0x18, 0x20, 0x01, 0x00, 0x04, 0x00, 0x40, 0x20, 0x01, + 0x00, 0x29, 0xb9, 0x00, 0xd1, 0xfc, 0x01, 0x18, 0x20, 0x09, 0x10, 0x00, + 0x00, 0x48, 0x90, 0x0e, 0x00, 0x38, 0x20, 0x01, 0x00, 0x29, 0x90, 0x0e, + 0x00, 0x18, 0x20, 0x01, 0x00, 0x29, 0x90, 0x0e, 0x90, 0x05, 0x01, 0x2e, + 0x00, 0x05, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x04, 0xd0, 0x84, 0x19, 0xd0, + 0x91, 0x88, 0x10, 0x00, 0x21, 0x04, 0x90, 0x65, 0x09, 0xa8, 0x08, 0x0c, + 0x6c, 0x11, 0x19, 0x90, 0xb8, 0x00, 0xd0, 0xbc, 0x09, 0x78, 0x08, 0x04, + 0x62, 0x50, 0x08, 0x0c, 0x6a, 0x2a, 0x09, 0x04, 0x62, 0x59, 0x08, 0x04, + 0x62, 0x54, 0x00, 0xe6, 0x20, 0x71, 0x19, 0xe8, 0x70, 0x04, 0x90, 0x86, + 0x00, 0x02, 0x11, 0x28, 0x70, 0x30, 0x90, 0x80, 0x00, 0x04, 0x20, 0x04, + 0x9b, 0x06, 0x00, 0xee, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xe6, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0xa8, 0x74, 0x90, 0x8e, 0x00, 0xff, 0x11, 0x20, + 0x20, 0x01, 0x19, 0x6b, 0x20, 0x5c, 0x00, 0x60, 0xa9, 0x74, 0x91, 0x82, + 0x08, 0x00, 0x16, 0x90, 0x91, 0x88, 0x10, 0x00, 0x21, 0x04, 0x90, 0x5d, + 0x01, 0xd0, 0x08, 0x0c, 0x6b, 0xb1, 0x11, 0xd0, 0x08, 0x0c, 0xb1, 0x16, + 0x05, 0x70, 0x2b, 0x00, 0x60, 0x12, 0x29, 0x00, 0x60, 0x16, 0x60, 0x23, + 0x00, 0x09, 0x60, 0x2b, 0x00, 0x00, 0xa8, 0x74, 0x90, 0x8e, 0x00, 0xff, + 0x11, 0x10, 0x60, 0x2b, 0x80, 0x00, 0x20, 0x09, 0x00, 0x43, 0x08, 0x0c, + 0xb2, 0x0a, 0x90, 0x06, 0x00, 0xb0, 0x20, 0x01, 0x00, 0x28, 0x00, 0x90, + 0x20, 0x09, 0x18, 0x0c, 0x21, 0x0c, 0xd1, 0x8c, 0x01, 0x18, 0x20, 0x01, + 0x00, 0x04, 0x00, 0x38, 0xd1, 0x84, 0x01, 0x18, 0x20, 0x01, 0x00, 0x04, + 0x00, 0x10, 0x20, 0x01, 0x00, 0x29, 0x00, 0x10, 0x20, 0x01, 0x00, 0x29, + 0x90, 0x05, 0x01, 0x2e, 0x00, 0xee, 0x00, 0xbe, 0x00, 0x05, 0x20, 0x01, + 0x00, 0x2c, 0x0c, 0xc0, 0x00, 0xb6, 0x00, 0xe6, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0xa9, 0x74, 0x91, 0x82, 0x08, 0x00, 0x1a, 0x04, 0x63, 0x88, + 0x91, 0x88, 0x10, 0x00, 0x21, 0x04, 0x90, 0x5d, 0x09, 0x04, 0x63, 0x60, + 0xb8, 0xa0, 0x90, 0x86, 0x00, 0x7f, 0x01, 0x90, 0xa8, 0x7c, 0xd0, 0xfc, + 0x11, 0x78, 0x08, 0x0c, 0x6c, 0x19, 0x01, 0x60, 0xa9, 0x94, 0x81, 0xff, + 0x01, 0x30, 0x90, 0x8e, 0x00, 0x04, 0x01, 0x30, 0x90, 0x8e, 0x00, 0x05, + 0x01, 0x18, 0x08, 0x0c, 0x6c, 0x11, 0x15, 0x98, 0xa8, 0x7c, 0xd0, 0xfc, + 0x01, 0xe0, 0xa8, 0x94, 0x90, 0x05, 0x01, 0xc8, 0x20, 0x60, 0x00, 0x26, + 0x20, 0x10, 0x08, 0x0c, 0xcf, 0x09, 0x00, 0x2e, 0x11, 0x20, 0x20, 0x01, + 0x00, 0x08, 0x08, 0x04, 0x63, 0x8a, 0x60, 0x20, 0x90, 0x86, 0x00, 0x0a, + 0x01, 0x20, 0x20, 0x01, 0x00, 0x08, 0x08, 0x04, 0x63, 0x8a, 0x60, 0x1a, + 0x60, 0x03, 0x00, 0x08, 0x29, 0x00, 0x60, 0x16, 0x00, 0x58, 0x08, 0x0c, + 0xb1, 0x16, 0x05, 0xe8, 0x2b, 0x00, 0x60, 0x12, 0x29, 0x00, 0x60, 0x16, + 0x60, 0x0b, 0xff, 0xff, 0x60, 0x23, 0x00, 0x0a, 0x20, 0x09, 0x00, 0x03, + 0x08, 0x0c, 0xb2, 0x0a, 0x90, 0x06, 0x04, 0x58, 0x20, 0x01, 0x00, 0x28, + 0x04, 0x38, 0x90, 0x82, 0x00, 0x06, 0x12, 0x90, 0x08, 0x0c, 0xb0, 0x94, + 0x11, 0x60, 0xb8, 0xa0, 0x90, 0x84, 0xff, 0x80, 0x11, 0x40, 0xb9, 0x00, + 0xd1, 0xfc, 0x09, 0x00, 0x20, 0x01, 0x00, 0x29, 0x20, 0x09, 0x10, 0x00, + 0x00, 0xa8, 0x20, 0x01, 0x00, 0x28, 0x00, 0x90, 0x20, 0x09, 0x18, 0x0c, + 0x21, 0x0c, 0xd1, 0x8c, 0x01, 0x18, 0x20, 0x01, 0x00, 0x04, 0x00, 0x50, + 0xd1, 0x84, 0x01, 0x18, 0x20, 0x01, 0x00, 0x04, 0x00, 0x28, 0x20, 0x01, + 0x00, 0x29, 0x00, 0x10, 0x20, 0x01, 0x00, 0x29, 0x90, 0x05, 0x01, 0x2e, + 0x00, 0xee, 0x00, 0xbe, 0x00, 0x05, 0x20, 0x01, 0x00, 0x2c, 0x0c, 0xc0, + 0x00, 0xf6, 0x00, 0xb6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0xa8, 0xe0, + 0x90, 0x05, 0x15, 0x50, 0xa8, 0xdc, 0x90, 0x82, 0x01, 0x01, 0x16, 0x30, + 0xa8, 0xc8, 0x90, 0x05, 0x15, 0x18, 0xa8, 0xc4, 0x90, 0x82, 0x01, 0x01, + 0x12, 0xf8, 0xa9, 0x74, 0x20, 0x79, 0x18, 0x00, 0x91, 0x82, 0x08, 0x00, + 0x12, 0xe8, 0x78, 0x30, 0x90, 0x84, 0x00, 0x03, 0x11, 0x30, 0xaa, 0x98, + 0xab, 0x94, 0xa8, 0x78, 0x90, 0x84, 0x00, 0x07, 0x00, 0xea, 0x79, 0x30, + 0xd1, 0x8c, 0x01, 0x18, 0x20, 0x01, 0x00, 0x04, 0x00, 0x38, 0xd1, 0x84, + 0x01, 0x18, 0x20, 0x01, 0x00, 0x04, 0x00, 0x10, 0x20, 0x01, 0x00, 0x29, + 0x90, 0x0e, 0x00, 0x38, 0x20, 0x01, 0x00, 0x2c, 0x90, 0x0e, 0x00, 0x18, + 0x20, 0x01, 0x00, 0x29, 0x90, 0x0e, 0x90, 0x06, 0x00, 0x08, 0x90, 0x05, + 0x01, 0x2e, 0x00, 0xbe, 0x00, 0xfe, 0x00, 0x05, 0x64, 0x1f, 0x63, 0xda, + 0x63, 0xf1, 0x64, 0x1f, 0x64, 0x1f, 0x64, 0x1f, 0x64, 0x1f, 0x64, 0x1f, + 0x21, 0x00, 0x90, 0x82, 0x00, 0x7e, 0x12, 0x78, 0x08, 0x0c, 0x67, 0x49, + 0x01, 0x48, 0x90, 0x46, 0xb8, 0x10, 0x93, 0x06, 0x19, 0x04, 0x64, 0x27, + 0xb8, 0x14, 0x92, 0x06, 0x15, 0xf0, 0x00, 0x28, 0xbb, 0x12, 0xba, 0x16, + 0x00, 0x10, 0x08, 0x0c, 0x4b, 0x54, 0x01, 0x50, 0x04, 0xb0, 0x08, 0x0c, + 0x67, 0xb4, 0x15, 0x98, 0xb8, 0x10, 0x93, 0x06, 0x15, 0x80, 0xb8, 0x14, + 0x92, 0x06, 0x15, 0x68, 0x08, 0x0c, 0xb1, 0x16, 0x05, 0x30, 0x2b, 0x00, + 0x60, 0x12, 0x08, 0x0c, 0xd3, 0xb6, 0x29, 0x00, 0x60, 0x16, 0x60, 0x0b, + 0xff, 0xff, 0x60, 0x23, 0x00, 0x0a, 0xa8, 0x78, 0x90, 0x86, 0x00, 0x01, + 0x11, 0x70, 0x08, 0x0c, 0x33, 0x15, 0x90, 0x06, 0x08, 0x0c, 0x66, 0xe6, + 0x20, 0x01, 0x00, 0x02, 0x08, 0x0c, 0x66, 0xfa, 0x20, 0x01, 0x02, 0x00, + 0xb8, 0x6e, 0xb8, 0x93, 0x00, 0x02, 0x20, 0x09, 0x00, 0x03, 0x08, 0x0c, + 0xb2, 0x0a, 0x90, 0x06, 0x00, 0x68, 0x20, 0x01, 0x00, 0x01, 0x90, 0x0e, + 0x00, 0x38, 0x20, 0x01, 0x00, 0x2c, 0x90, 0x0e, 0x00, 0x18, 0x20, 0x01, + 0x00, 0x28, 0x90, 0x0e, 0x90, 0x05, 0x00, 0x00, 0x01, 0x2e, 0x00, 0xbe, + 0x00, 0xfe, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xf6, 0x00, 0xe6, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0xa8, 0x94, 0x90, 0xc6, 0x00, 0x15, 0x09, 0x04, + 0x66, 0x12, 0x90, 0xc6, 0x00, 0x56, 0x09, 0x04, 0x66, 0x16, 0x90, 0xc6, + 0x00, 0x66, 0x09, 0x04, 0x66, 0x1a, 0x90, 0xc6, 0x00, 0x67, 0x09, 0x04, + 0x66, 0x1e, 0x90, 0xc6, 0x00, 0x68, 0x09, 0x04, 0x66, 0x22, 0x90, 0xc6, + 0x00, 0x71, 0x09, 0x04, 0x66, 0x26, 0x90, 0xc6, 0x00, 0x74, 0x09, 0x04, + 0x66, 0x2a, 0x90, 0xc6, 0x00, 0x7c, 0x09, 0x04, 0x66, 0x2e, 0x90, 0xc6, + 0x00, 0x7e, 0x09, 0x04, 0x66, 0x32, 0x90, 0xc6, 0x00, 0x37, 0x09, 0x04, + 0x66, 0x36, 0x90, 0x16, 0x20, 0x79, 0x18, 0x00, 0xa9, 0x74, 0x91, 0x86, + 0x00, 0xff, 0x09, 0x04, 0x66, 0x0d, 0x91, 0x82, 0x08, 0x00, 0x1a, 0x04, + 0x66, 0x0d, 0x08, 0x0c, 0x67, 0xb4, 0x11, 0x98, 0xb8, 0x04, 0x90, 0x84, + 0x00, 0xff, 0x90, 0x82, 0x00, 0x06, 0x12, 0x68, 0xa8, 0x94, 0x90, 0xc6, + 0x00, 0x6f, 0x01, 0x48, 0x08, 0x0c, 0xb0, 0x94, 0x19, 0x04, 0x65, 0xf6, + 0xb8, 0xa0, 0x90, 0x84, 0xff, 0x80, 0x19, 0x04, 0x65, 0xf6, 0xa8, 0x94, + 0x90, 0xc6, 0x00, 0x6f, 0x01, 0x58, 0x90, 0xc6, 0x00, 0x5e, 0x09, 0x04, + 0x65, 0x56, 0x90, 0xc6, 0x00, 0x64, 0x09, 0x04, 0x65, 0x7f, 0x20, 0x08, + 0x08, 0x04, 0x65, 0x18, 0xa9, 0x98, 0xa8, 0xb0, 0x20, 0x40, 0x08, 0x0c, + 0xb0, 0x94, 0x11, 0x20, 0x91, 0x82, 0x00, 0x7f, 0x0a, 0x04, 0x65, 0x18, + 0x91, 0x86, 0x00, 0xff, 0x09, 0x04, 0x65, 0x18, 0x91, 0x82, 0x08, 0x00, + 0x1a, 0x04, 0x65, 0x18, 0xaa, 0xa0, 0xab, 0x9c, 0x78, 0x7c, 0x93, 0x06, + 0x11, 0xa8, 0x78, 0x80, 0x00, 0x96, 0x92, 0x4e, 0x11, 0x28, 0x22, 0x08, + 0x23, 0x10, 0x00, 0x9e, 0x08, 0x04, 0x65, 0x18, 0x08, 0x0c, 0xb0, 0x94, + 0x11, 0x40, 0x99, 0xcc, 0xff, 0x00, 0x00, 0x9e, 0x11, 0x28, 0x22, 0x08, + 0x23, 0x10, 0x08, 0x04, 0x65, 0x18, 0x00, 0x9e, 0x08, 0x0c, 0x4b, 0x54, + 0x09, 0x04, 0x65, 0x22, 0x90, 0x0e, 0x90, 0x16, 0x90, 0xc6, 0x40, 0x00, + 0x15, 0xe0, 0x00, 0x06, 0x08, 0x0c, 0x6a, 0xae, 0x11, 0x08, 0xc1, 0x85, + 0xb8, 0x00, 0xd0, 0xbc, 0x01, 0x08, 0xc1, 0x8d, 0x20, 0xa9, 0x00, 0x04, + 0xa8, 0x60, 0x20, 0xe8, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x31, 0x20, 0xa0, + 0xb8, 0xc4, 0x20, 0xe0, 0xb8, 0xc8, 0x90, 0x80, 0x00, 0x06, 0x20, 0x98, + 0x08, 0x0c, 0x0f, 0xd6, 0x20, 0xa9, 0x00, 0x04, 0xa8, 0x60, 0x20, 0xe8, + 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x35, 0x20, 0xa0, 0xb8, 0xc4, 0x20, 0xe0, + 0xb8, 0xc8, 0x90, 0x80, 0x00, 0x0a, 0x20, 0x98, 0x08, 0x0c, 0x0f, 0xd6, + 0xa8, 0xc4, 0xab, 0xc8, 0x93, 0x05, 0xab, 0xcc, 0x93, 0x05, 0xab, 0xd0, + 0x93, 0x05, 0xab, 0xd4, 0x93, 0x05, 0xab, 0xd8, 0x93, 0x05, 0xab, 0xdc, + 0x93, 0x05, 0xab, 0xe0, 0x93, 0x05, 0x90, 0x05, 0x05, 0x10, 0x00, 0x0e, + 0x00, 0xc8, 0x90, 0xc6, 0x40, 0x07, 0x11, 0x10, 0x24, 0x08, 0x00, 0xa0, + 0x90, 0xc6, 0x40, 0x08, 0x11, 0x18, 0x27, 0x08, 0x26, 0x10, 0x00, 0x70, + 0x90, 0xc6, 0x40, 0x09, 0x11, 0x08, 0x00, 0x50, 0x90, 0xc6, 0x40, 0x06, + 0x01, 0x38, 0x20, 0x01, 0x40, 0x05, 0x20, 0x09, 0x00, 0x0a, 0x00, 0x10, + 0x20, 0x01, 0x40, 0x06, 0xa8, 0x96, 0xa9, 0x9a, 0xaa, 0x9e, 0x20, 0x01, + 0x00, 0x30, 0x90, 0x0e, 0x04, 0x78, 0x00, 0x0e, 0x08, 0x0c, 0xb1, 0x16, + 0x11, 0x30, 0x20, 0x01, 0x40, 0x05, 0x20, 0x09, 0x00, 0x03, 0x90, 0x16, + 0x0c, 0x78, 0x2b, 0x00, 0x60, 0x12, 0x08, 0x0c, 0xd3, 0xb6, 0x29, 0x00, + 0x60, 0x16, 0x60, 0x23, 0x00, 0x01, 0xa8, 0x68, 0xd8, 0x8c, 0x01, 0x08, + 0xc0, 0xf5, 0xa8, 0x6a, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, + 0x33, 0x15, 0x01, 0x2e, 0x90, 0x06, 0x08, 0x0c, 0x66, 0xe6, 0x20, 0x01, + 0x00, 0x02, 0x08, 0x0c, 0x66, 0xfa, 0x20, 0x09, 0x00, 0x02, 0x08, 0x0c, + 0xb2, 0x0a, 0xa8, 0xb0, 0xd0, 0x94, 0x01, 0x18, 0xb8, 0xd4, 0xc0, 0x8d, + 0xb8, 0xd6, 0x90, 0x06, 0x90, 0x05, 0x01, 0x2e, 0x00, 0xee, 0x00, 0xfe, + 0x00, 0xbe, 0x00, 0x05, 0x08, 0x0c, 0x58, 0x54, 0x01, 0x18, 0x20, 0x09, + 0x00, 0x07, 0x00, 0xf8, 0xa9, 0x98, 0xae, 0xb0, 0x08, 0x0c, 0x67, 0xb4, + 0x19, 0x04, 0x65, 0x13, 0x91, 0x86, 0x00, 0x7f, 0x01, 0x30, 0x08, 0x0c, + 0x6c, 0x11, 0x01, 0x18, 0x20, 0x09, 0x00, 0x09, 0x00, 0x80, 0x00, 0x96, + 0x08, 0x0c, 0x10, 0x59, 0x11, 0x20, 0x00, 0x9e, 0x20, 0x09, 0x00, 0x02, + 0x00, 0x40, 0x29, 0x00, 0x00, 0x9e, 0xa8, 0x06, 0x08, 0x0c, 0xd1, 0x09, + 0x19, 0xb0, 0x20, 0x09, 0x00, 0x03, 0x20, 0x01, 0x40, 0x05, 0x08, 0x04, + 0x65, 0x1a, 0xa9, 0x98, 0xae, 0xb0, 0x08, 0x0c, 0x67, 0xb4, 0x19, 0x04, + 0x65, 0x13, 0x00, 0x96, 0x08, 0x0c, 0x10, 0x59, 0x11, 0x28, 0x00, 0x9e, + 0x20, 0x09, 0x00, 0x02, 0x08, 0x04, 0x65, 0xd3, 0x29, 0x00, 0x00, 0x9e, + 0xa8, 0x06, 0x00, 0x96, 0x20, 0x48, 0x20, 0xa9, 0x00, 0x2b, 0xb8, 0xc4, + 0x20, 0xe0, 0xb8, 0xc8, 0x20, 0x98, 0xa8, 0x60, 0x20, 0xe8, 0xa8, 0x5c, + 0x90, 0x80, 0x00, 0x02, 0x20, 0xa0, 0x40, 0x03, 0x20, 0xa9, 0x00, 0x08, + 0x90, 0x80, 0x00, 0x06, 0x20, 0xa0, 0xbb, 0xc8, 0x93, 0x98, 0x00, 0x06, + 0x23, 0x98, 0x08, 0x0c, 0x0f, 0xd6, 0x00, 0x9e, 0xa8, 0x7b, 0x00, 0x00, + 0xa8, 0x83, 0x00, 0x00, 0xa8, 0x97, 0x40, 0x00, 0xd6, 0x84, 0x11, 0x68, + 0x08, 0x0c, 0x58, 0x40, 0xd0, 0xb4, 0x11, 0x18, 0xa8, 0x9b, 0x00, 0x0b, + 0x00, 0xe0, 0xb8, 0x00, 0xd0, 0x8c, 0x01, 0x18, 0xa8, 0x9b, 0x00, 0x0c, + 0x00, 0xb0, 0x08, 0x0c, 0x6c, 0x11, 0x01, 0x18, 0xa8, 0x9b, 0x00, 0x09, + 0x00, 0x80, 0x08, 0x0c, 0x58, 0x54, 0x01, 0x18, 0xa8, 0x9b, 0x00, 0x07, + 0x00, 0x50, 0x08, 0x0c, 0xd0, 0xec, 0x19, 0x04, 0x65, 0x4f, 0x20, 0x09, + 0x00, 0x03, 0x20, 0x01, 0x40, 0x05, 0x08, 0x04, 0x65, 0x1a, 0xa8, 0x7b, + 0x00, 0x30, 0xa8, 0x97, 0x40, 0x05, 0xa8, 0x04, 0x80, 0x06, 0x80, 0x06, + 0x80, 0x07, 0x90, 0xbc, 0x00, 0x3f, 0x90, 0x84, 0xff, 0xc0, 0x90, 0x80, + 0x00, 0x02, 0x20, 0x09, 0x00, 0x2b, 0xaa, 0xa0, 0xab, 0x9c, 0xac, 0xa8, + 0xad, 0xa4, 0x20, 0x31, 0x00, 0x00, 0x20, 0x41, 0x12, 0xa8, 0x08, 0x0c, + 0xb6, 0x91, 0x19, 0x04, 0x65, 0x4f, 0x20, 0x09, 0x00, 0x02, 0x08, 0xe8, + 0x20, 0x01, 0x00, 0x28, 0x90, 0x0e, 0x08, 0x04, 0x65, 0x50, 0x20, 0x09, + 0x18, 0x0c, 0x21, 0x0c, 0xd1, 0x8c, 0x01, 0x18, 0x20, 0x01, 0x00, 0x04, + 0x00, 0x38, 0xd1, 0x84, 0x01, 0x18, 0x20, 0x01, 0x00, 0x04, 0x00, 0x10, + 0x20, 0x01, 0x00, 0x29, 0x90, 0x0e, 0x08, 0x04, 0x65, 0x50, 0x20, 0x01, + 0x00, 0x29, 0x90, 0x0e, 0x08, 0x04, 0x65, 0x50, 0x08, 0x0c, 0x38, 0xc0, + 0x08, 0x04, 0x65, 0x51, 0x08, 0x0c, 0x55, 0x5d, 0x08, 0x04, 0x65, 0x51, + 0x08, 0x0c, 0x46, 0xd5, 0x08, 0x04, 0x65, 0x51, 0x08, 0x0c, 0x47, 0x4e, + 0x08, 0x04, 0x65, 0x51, 0x08, 0x0c, 0x47, 0xaa, 0x08, 0x04, 0x65, 0x51, + 0x08, 0x0c, 0x4c, 0x17, 0x08, 0x04, 0x65, 0x51, 0x08, 0x0c, 0x4e, 0xdf, + 0x08, 0x04, 0x65, 0x51, 0x08, 0x0c, 0x51, 0xc4, 0x08, 0x04, 0x65, 0x51, + 0x08, 0x0c, 0x53, 0xbd, 0x08, 0x04, 0x65, 0x51, 0x08, 0x0c, 0x3a, 0xfe, + 0x08, 0x04, 0x65, 0x51, 0x00, 0xb6, 0xa9, 0x74, 0xae, 0x78, 0x96, 0x84, + 0x3f, 0xff, 0x90, 0x82, 0x40, 0x00, 0x16, 0x08, 0x91, 0x82, 0x08, 0x00, + 0x12, 0x58, 0x91, 0x88, 0x10, 0x00, 0x21, 0x04, 0x90, 0x5d, 0x01, 0x30, + 0x08, 0x0c, 0x6c, 0x11, 0x11, 0x38, 0x00, 0xd9, 0x90, 0x06, 0x00, 0xb0, + 0x20, 0x01, 0x00, 0x28, 0x90, 0x0e, 0x00, 0x90, 0x90, 0x82, 0x00, 0x06, + 0x12, 0x40, 0xb9, 0x00, 0xd1, 0xfc, 0x0d, 0x98, 0x20, 0x01, 0x00, 0x29, + 0x20, 0x09, 0x10, 0x00, 0x00, 0x38, 0x20, 0x01, 0x00, 0x29, 0x90, 0x0e, + 0x00, 0x18, 0x20, 0x01, 0x00, 0x29, 0x90, 0x0e, 0x90, 0x05, 0x00, 0xbe, + 0x00, 0x05, 0xa8, 0x77, 0x00, 0x00, 0xb8, 0xd0, 0x90, 0x05, 0x19, 0x04, + 0x66, 0xda, 0xb8, 0x88, 0x90, 0x05, 0x19, 0x04, 0x66, 0xda, 0xb8, 0x38, + 0xb9, 0x3c, 0x91, 0x02, 0x1a, 0x04, 0x66, 0xda, 0x2b, 0x10, 0x08, 0x0c, + 0xb1, 0x43, 0x09, 0x04, 0x66, 0xd6, 0x81, 0x08, 0xb9, 0x3e, 0x62, 0x12, + 0x29, 0x00, 0x60, 0x16, 0x60, 0x23, 0x00, 0x03, 0x60, 0x0b, 0xff, 0xff, + 0x60, 0x07, 0x00, 0x40, 0xa8, 0x78, 0x60, 0x5e, 0xa8, 0x80, 0x60, 0x66, + 0xa8, 0x83, 0x00, 0x00, 0xa8, 0x7c, 0xd0, 0xac, 0x05, 0xb8, 0xc0, 0xdd, + 0xa8, 0x7e, 0xa8, 0x88, 0x80, 0x01, 0x15, 0x60, 0x20, 0x11, 0x18, 0x0d, + 0x22, 0x14, 0xd2, 0x8c, 0x19, 0x0c, 0x6c, 0xd6, 0xa8, 0x16, 0xa8, 0x64, + 0x90, 0x94, 0x00, 0xf7, 0x92, 0x96, 0x00, 0x11, 0x11, 0xf8, 0x90, 0x84, + 0x00, 0xff, 0xc0, 0xbd, 0x60, 0x1e, 0xa8, 0xac, 0xaa, 0xb0, 0xa8, 0x36, + 0xaa, 0x3a, 0x20, 0x01, 0x00, 0x0f, 0x80, 0x01, 0x1d, 0xf0, 0x20, 0x01, + 0x80, 0x04, 0x60, 0x03, 0x00, 0x04, 0x60, 0x46, 0x00, 0xf6, 0x20, 0x79, + 0x03, 0x80, 0x78, 0x18, 0xd0, 0xbc, 0x1d, 0xe8, 0x78, 0x33, 0x00, 0x10, + 0x2c, 0x00, 0x78, 0x36, 0x78, 0x1b, 0x80, 0x80, 0x00, 0xfe, 0x00, 0x05, + 0x08, 0x0c, 0x17, 0xad, 0x60, 0x1c, 0xc0, 0xbd, 0x60, 0x1e, 0x0c, 0x38, + 0x20, 0x09, 0x18, 0x0d, 0x21, 0x0c, 0xd1, 0x8c, 0x19, 0x0c, 0x6c, 0xe0, + 0xd0, 0xb4, 0x19, 0x0c, 0x1c, 0x9c, 0x20, 0x01, 0x80, 0x04, 0x60, 0x03, + 0x00, 0x02, 0x08, 0xe8, 0x81, 0xff, 0x11, 0x10, 0xb8, 0x8b, 0x00, 0x01, + 0x29, 0x08, 0xb8, 0xcc, 0xb9, 0xce, 0x90, 0x05, 0x11, 0x10, 0xb9, 0xd2, + 0x00, 0x20, 0x00, 0x96, 0x20, 0x48, 0xa9, 0x02, 0x00, 0x9e, 0x00, 0x05, + 0x00, 0xb6, 0x01, 0x26, 0x00, 0xc6, 0x00, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x62, 0x10, 0x22, 0x58, 0xba, 0x00, 0x90, 0x05, 0x01, 0x10, 0xc2, 0x85, + 0x00, 0x08, 0xc2, 0x84, 0xba, 0x02, 0x00, 0x2e, 0x00, 0xce, 0x01, 0x2e, + 0x00, 0xbe, 0x00, 0x05, 0x00, 0xb6, 0x01, 0x26, 0x00, 0xc6, 0x20, 0x91, + 0x80, 0x00, 0x62, 0x10, 0x22, 0x58, 0xba, 0x04, 0x00, 0x06, 0x90, 0x86, + 0x00, 0x06, 0x11, 0x70, 0xb8, 0x9c, 0xd0, 0xac, 0x01, 0x58, 0x08, 0x0c, + 0x6c, 0x0d, 0x01, 0x40, 0x92, 0x84, 0xff, 0x00, 0x80, 0x07, 0x90, 0x86, + 0x00, 0x07, 0x11, 0x10, 0x20, 0x11, 0x06, 0x00, 0x00, 0x0e, 0x92, 0x94, + 0xff, 0x00, 0x92, 0x15, 0xba, 0x06, 0x00, 0x06, 0x90, 0x86, 0x00, 0x06, + 0x11, 0x20, 0xba, 0x90, 0x82, 0xff, 0x09, 0x0c, 0x0d, 0x85, 0x00, 0x0e, + 0x00, 0xce, 0x01, 0x2e, 0x00, 0xbe, 0x00, 0x05, 0x00, 0xb6, 0x01, 0x26, + 0x00, 0xc6, 0x20, 0x91, 0x80, 0x00, 0x62, 0x10, 0x22, 0x58, 0xba, 0x04, + 0x00, 0x06, 0x90, 0x86, 0x00, 0x06, 0x11, 0x68, 0xb8, 0x9c, 0xd0, 0xa4, + 0x01, 0x50, 0x08, 0x0c, 0x6c, 0x09, 0x11, 0x38, 0x92, 0x84, 0x00, 0xff, + 0x90, 0x86, 0x00, 0x07, 0x11, 0x10, 0x20, 0x11, 0x00, 0x06, 0x00, 0x0e, + 0x92, 0x94, 0x00, 0xff, 0x80, 0x07, 0x92, 0x15, 0xba, 0x06, 0x00, 0xce, + 0x01, 0x2e, 0x00, 0xbe, 0x00, 0x05, 0x91, 0x82, 0x08, 0x00, 0x02, 0x18, + 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x00, 0xd6, 0x00, 0x26, 0x91, 0x90, + 0x10, 0x00, 0x22, 0x04, 0x90, 0x5d, 0x11, 0x88, 0x00, 0x96, 0x08, 0x0c, + 0x10, 0x59, 0x29, 0x58, 0x00, 0x9e, 0x01, 0x68, 0x2b, 0x00, 0x20, 0x12, + 0xb8, 0x5c, 0xb8, 0xca, 0xb8, 0x60, 0xb8, 0xc6, 0x90, 0x06, 0xb8, 0xa6, + 0xb8, 0xae, 0x08, 0x0c, 0x61, 0xb7, 0x90, 0x06, 0x00, 0x10, 0x90, 0x85, + 0x00, 0x01, 0x00, 0x2e, 0x00, 0xde, 0x00, 0x05, 0x00, 0xb6, 0x00, 0x96, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0x26, 0x91, 0x82, 0x08, 0x00, + 0x02, 0x18, 0x90, 0x85, 0x00, 0x01, 0x04, 0xa8, 0x00, 0xd6, 0x91, 0x90, + 0x10, 0x00, 0x22, 0x04, 0x90, 0x5d, 0x05, 0x68, 0x20, 0x13, 0x00, 0x00, + 0xb8, 0xa4, 0x90, 0x4d, 0x01, 0x10, 0x08, 0x0c, 0x10, 0x8b, 0x00, 0xd6, + 0x00, 0xc6, 0xb8, 0xbc, 0x20, 0x60, 0x8c, 0xff, 0x01, 0x68, 0x60, 0x0c, + 0x00, 0x06, 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0xcf, 0x1b, 0x01, 0x10, + 0x08, 0x0c, 0x10, 0x0b, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0xce, 0x0c, 0x88, + 0x00, 0xce, 0x00, 0xde, 0x00, 0xc6, 0xb8, 0xac, 0x90, 0x65, 0x01, 0x28, + 0x62, 0x1c, 0xd2, 0xc4, 0x01, 0x10, 0x08, 0x0c, 0x92, 0x8d, 0x00, 0xce, + 0x2b, 0x48, 0xb8, 0xc8, 0xb8, 0x5e, 0xb8, 0xc4, 0xb8, 0x62, 0x08, 0x0c, + 0x10, 0x9b, 0x00, 0xde, 0x90, 0x06, 0x00, 0x2e, 0x01, 0x2e, 0x00, 0x9e, + 0x00, 0xbe, 0x00, 0x05, 0x00, 0x16, 0x91, 0x82, 0x08, 0x00, 0x02, 0x18, + 0x90, 0x85, 0x00, 0x01, 0x00, 0x30, 0x91, 0x88, 0x10, 0x00, 0x21, 0x04, + 0x90, 0x5d, 0x0d, 0xc0, 0x90, 0x06, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xd6, + 0x01, 0x56, 0x01, 0x36, 0x01, 0x46, 0x90, 0x06, 0xb8, 0x0a, 0xb8, 0x0e, + 0xb8, 0x00, 0xc0, 0x8c, 0xb8, 0x02, 0x08, 0x0c, 0x77, 0x9e, 0x15, 0x10, + 0xb8, 0xa0, 0x90, 0x86, 0x00, 0x7e, 0x01, 0x20, 0x08, 0x0c, 0xb0, 0x94, + 0x11, 0xd8, 0x00, 0x78, 0x70, 0x40, 0xd0, 0xe4, 0x01, 0xb8, 0x00, 0xc6, + 0x20, 0x61, 0x19, 0x82, 0x70, 0x48, 0x20, 0x62, 0x70, 0x4c, 0x60, 0x06, + 0x70, 0x50, 0x60, 0x0a, 0x70, 0x54, 0x60, 0x0e, 0x00, 0xce, 0x70, 0x3c, + 0x20, 0x69, 0x01, 0x40, 0x90, 0x05, 0x11, 0x10, 0x20, 0x01, 0x00, 0x01, + 0x68, 0x86, 0x20, 0x69, 0x18, 0x00, 0x68, 0xb6, 0x70, 0x40, 0xb8, 0x5e, + 0x70, 0x48, 0xb8, 0x62, 0x70, 0x4c, 0xb8, 0x66, 0x20, 0xe1, 0x00, 0x00, + 0x20, 0x99, 0x02, 0x76, 0xb8, 0xc4, 0x20, 0xe8, 0xb8, 0xc8, 0x90, 0x88, + 0x00, 0x0a, 0x21, 0xa0, 0x20, 0xa9, 0x00, 0x04, 0x40, 0x03, 0x20, 0x99, + 0x02, 0x7a, 0x90, 0x88, 0x00, 0x06, 0x21, 0xa0, 0x20, 0xa9, 0x00, 0x04, + 0x40, 0x03, 0x20, 0x69, 0x02, 0x00, 0x68, 0x17, 0x00, 0x01, 0x70, 0x40, + 0xb8, 0x6a, 0x71, 0x44, 0xb9, 0x6e, 0x70, 0x48, 0xb8, 0x72, 0x70, 0x50, + 0xb8, 0x76, 0x20, 0x69, 0x02, 0x00, 0x68, 0x17, 0x00, 0x00, 0xb8, 0xa0, + 0x90, 0x86, 0x00, 0x7e, 0x11, 0x10, 0x71, 0x44, 0xb9, 0x6e, 0x91, 0x82, + 0x02, 0x11, 0x12, 0x18, 0x20, 0x09, 0x00, 0x08, 0x04, 0x00, 0x91, 0x82, + 0x02, 0x59, 0x12, 0x18, 0x20, 0x09, 0x00, 0x07, 0x00, 0xd0, 0x91, 0x82, + 0x02, 0xc1, 0x12, 0x18, 0x20, 0x09, 0x00, 0x06, 0x00, 0xa0, 0x91, 0x82, + 0x03, 0x49, 0x12, 0x18, 0x20, 0x09, 0x00, 0x05, 0x00, 0x70, 0x91, 0x82, + 0x04, 0x21, 0x12, 0x18, 0x20, 0x09, 0x00, 0x04, 0x00, 0x40, 0x91, 0x82, + 0x05, 0x81, 0x12, 0x18, 0x20, 0x09, 0x00, 0x03, 0x00, 0x10, 0x20, 0x09, + 0x00, 0x02, 0xb9, 0x92, 0x01, 0x4e, 0x01, 0x3e, 0x01, 0x5e, 0x00, 0xde, + 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, 0x00, 0xe6, 0x20, 0x71, 0x02, 0x60, + 0x70, 0x34, 0xb8, 0x96, 0x70, 0x3c, 0xb8, 0x9a, 0x70, 0x54, 0xb8, 0x9e, + 0x00, 0x36, 0xbb, 0xd4, 0xc3, 0x84, 0xba, 0x00, 0x20, 0x09, 0x18, 0x67, + 0x21, 0x0c, 0xd0, 0xbc, 0x01, 0x20, 0xd1, 0xec, 0x01, 0x10, 0xc2, 0xad, + 0x00, 0x08, 0xc2, 0xac, 0xd0, 0xc4, 0x01, 0x48, 0xd1, 0xe4, 0x01, 0x38, + 0xc2, 0xbd, 0xd0, 0xcc, 0x01, 0x28, 0xd3, 0x8c, 0x11, 0x08, 0xc3, 0x85, + 0x00, 0x08, 0xc2, 0xbc, 0xba, 0x02, 0xbb, 0xd6, 0x00, 0x3e, 0x00, 0xee, + 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0x96, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0xb8, 0xa4, 0x90, 0x4d, 0x05, 0x78, 0xa9, 0x00, 0x81, 0xff, + 0x15, 0xc0, 0xaa, 0x04, 0x92, 0x82, 0x00, 0x10, 0x16, 0xc8, 0x01, 0x36, + 0x01, 0x46, 0x01, 0xc6, 0x01, 0xd6, 0x89, 0x06, 0x80, 0x06, 0x80, 0x07, + 0x90, 0x8c, 0x00, 0x3f, 0x21, 0xe0, 0x90, 0x84, 0xff, 0xc0, 0x90, 0x80, + 0x00, 0x04, 0x20, 0x98, 0x20, 0x09, 0x00, 0x10, 0x20, 0xa9, 0x00, 0x01, + 0x40, 0x02, 0x90, 0x86, 0xff, 0xff, 0x01, 0x20, 0x81, 0x09, 0x1d, 0xd0, + 0x08, 0x0c, 0x0d, 0x85, 0x3c, 0x00, 0x20, 0xe8, 0x33, 0x00, 0x80, 0x01, + 0x20, 0xa0, 0x46, 0x04, 0x82, 0x10, 0xaa, 0x06, 0x01, 0xde, 0x01, 0xce, + 0x01, 0x4e, 0x01, 0x3e, 0x00, 0x60, 0x08, 0x0c, 0x10, 0x59, 0x01, 0x70, + 0x29, 0x00, 0xb8, 0xa6, 0xa8, 0x03, 0x00, 0x00, 0x08, 0x0c, 0x6a, 0x4a, + 0xa8, 0x07, 0x00, 0x01, 0xae, 0x12, 0x90, 0x85, 0x00, 0x01, 0x01, 0x2e, + 0x00, 0x9e, 0x00, 0x05, 0x90, 0x06, 0x0c, 0xd8, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x00, 0x96, 0xb8, 0xa4, 0x90, 0x4d, 0x01, 0x88, 0xa8, 0x00, + 0x90, 0x05, 0x11, 0x50, 0x08, 0x0c, 0x6a, 0x59, 0x11, 0x58, 0xa8, 0x04, + 0x90, 0x8a, 0x00, 0x02, 0x02, 0x18, 0x80, 0x01, 0xa8, 0x06, 0x00, 0x20, + 0x08, 0x0c, 0x10, 0x8b, 0xb8, 0xa7, 0x00, 0x00, 0x00, 0x9e, 0x01, 0x2e, + 0x00, 0x05, 0x00, 0x96, 0x00, 0xc6, 0xb8, 0x88, 0x90, 0x05, 0x19, 0x04, + 0x69, 0x3f, 0xb8, 0xd0, 0x90, 0x4d, 0x09, 0x04, 0x69, 0x3f, 0x20, 0x01, + 0x03, 0x82, 0x20, 0x04, 0x90, 0x84, 0x00, 0x07, 0x90, 0x86, 0x00, 0x01, + 0x19, 0x04, 0x69, 0x3d, 0x08, 0x0c, 0xb1, 0x43, 0x09, 0x04, 0x69, 0x3d, + 0x82, 0x10, 0xba, 0x3e, 0xa8, 0x00, 0xb8, 0xd2, 0x90, 0x05, 0x11, 0x08, + 0xb8, 0xce, 0x2b, 0x00, 0x60, 0x12, 0x29, 0x00, 0x60, 0x16, 0x60, 0x23, + 0x00, 0x03, 0x60, 0x0b, 0xff, 0xff, 0x60, 0x07, 0x00, 0x40, 0xa8, 0x78, + 0x60, 0x5e, 0xa8, 0x80, 0x90, 0x84, 0x00, 0xff, 0x60, 0x66, 0xa8, 0x83, + 0x00, 0x00, 0xa8, 0x7c, 0xd0, 0xac, 0x01, 0xc8, 0xc0, 0xdd, 0xa8, 0x7e, + 0xa8, 0x88, 0x80, 0x01, 0x15, 0x58, 0xa8, 0x16, 0xa8, 0x64, 0x90, 0x94, + 0x00, 0xf7, 0x92, 0x96, 0x00, 0x11, 0x15, 0x20, 0x90, 0x84, 0x00, 0xff, + 0xc0, 0xbd, 0x60, 0x1e, 0xa8, 0xac, 0xaa, 0xb0, 0xa8, 0x36, 0xaa, 0x3a, + 0x20, 0x01, 0x80, 0x04, 0x60, 0x03, 0x00, 0x04, 0x00, 0x30, 0x08, 0x0c, + 0x1c, 0x9c, 0x20, 0x01, 0x80, 0x04, 0x60, 0x03, 0x00, 0x02, 0x60, 0x46, + 0x20, 0x01, 0x00, 0x10, 0x2c, 0x08, 0x08, 0x0c, 0xac, 0xed, 0xb8, 0x38, + 0xba, 0x3c, 0x92, 0x02, 0x0a, 0x04, 0x68, 0xe5, 0x00, 0x10, 0xb8, 0x8b, + 0x00, 0x01, 0x00, 0xce, 0x00, 0x9e, 0x00, 0x05, 0x08, 0x0c, 0x17, 0xad, + 0x60, 0x1c, 0xc0, 0xbd, 0x60, 0x1e, 0x08, 0xf0, 0x00, 0xb6, 0x00, 0x96, + 0x00, 0x16, 0x20, 0xa9, 0x08, 0x00, 0x90, 0x0e, 0x00, 0x16, 0x08, 0x0c, + 0x67, 0xb4, 0x11, 0x58, 0xb8, 0xd0, 0x90, 0x4d, 0x01, 0x40, 0x3e, 0x00, + 0x90, 0x86, 0x00, 0x02, 0x11, 0x18, 0xb8, 0x00, 0xd0, 0xbc, 0x11, 0x08, + 0x00, 0x41, 0x00, 0x1e, 0x81, 0x08, 0x1f, 0x04, 0x69, 0x4e, 0x00, 0x1e, + 0x00, 0xbe, 0x00, 0x9e, 0x00, 0x05, 0x00, 0x96, 0x00, 0x16, 0xb8, 0xd0, + 0x90, 0x4d, 0x01, 0x88, 0xa8, 0x00, 0xb8, 0xd2, 0x90, 0x05, 0x11, 0x08, + 0xb8, 0xce, 0x90, 0x06, 0xa8, 0x02, 0xa8, 0x67, 0x01, 0x03, 0xab, 0x7a, + 0xa8, 0x77, 0x00, 0x00, 0x08, 0x0c, 0xd2, 0x20, 0x08, 0x0c, 0x70, 0x12, + 0x0c, 0x60, 0x00, 0x1e, 0x00, 0x9e, 0x00, 0x05, 0x00, 0x86, 0x90, 0x46, + 0xb8, 0xd0, 0x90, 0x4d, 0x01, 0xb0, 0xa8, 0x6c, 0x94, 0x06, 0x11, 0x18, + 0xa8, 0x70, 0x95, 0x06, 0x01, 0x28, 0x29, 0x40, 0xa8, 0x00, 0x90, 0x4d, + 0x01, 0x60, 0x0c, 0xa8, 0xa8, 0x00, 0x88, 0xff, 0x11, 0x28, 0xb8, 0xd2, + 0x90, 0x05, 0x11, 0x18, 0xb8, 0xce, 0x00, 0x08, 0xa0, 0x02, 0xa8, 0x03, + 0x00, 0x00, 0x00, 0x8e, 0x00, 0x05, 0x90, 0x1e, 0x00, 0x10, 0x20, 0x19, + 0x00, 0x01, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0xe6, 0x00, 0x96, + 0x00, 0xc6, 0x00, 0x86, 0x00, 0x26, 0x20, 0x71, 0x19, 0xe8, 0x90, 0x46, + 0x70, 0x28, 0x90, 0x65, 0x01, 0xe8, 0x60, 0x14, 0x20, 0x68, 0x83, 0xff, + 0x01, 0x20, 0x60, 0x5c, 0x96, 0x06, 0x01, 0x58, 0x00, 0x30, 0xa8, 0x6c, + 0x94, 0x06, 0x11, 0x18, 0xa8, 0x70, 0x95, 0x06, 0x01, 0x20, 0x2c, 0x40, + 0x60, 0x0c, 0x20, 0x60, 0x0c, 0x60, 0x60, 0x0c, 0x00, 0x06, 0x00, 0x66, + 0x28, 0x30, 0x08, 0x0c, 0xa4, 0x20, 0x00, 0x6e, 0x00, 0x0e, 0x83, 0xff, + 0x05, 0x08, 0x0c, 0x08, 0x90, 0x46, 0xb8, 0xd0, 0x90, 0x4d, 0x01, 0xe0, + 0x83, 0xff, 0x01, 0x20, 0xa8, 0x78, 0x96, 0x06, 0x01, 0x58, 0x00, 0x30, + 0xa8, 0x6c, 0x94, 0x06, 0x11, 0x18, 0xa8, 0x70, 0x95, 0x06, 0x01, 0x20, + 0x29, 0x40, 0xa8, 0x00, 0x20, 0x48, 0x0c, 0x70, 0xb8, 0xd0, 0xaa, 0x00, + 0x00, 0x26, 0x99, 0x06, 0x11, 0x10, 0xba, 0xd2, 0x00, 0x08, 0xa2, 0x02, + 0x00, 0x0e, 0x83, 0xff, 0x01, 0x08, 0x0c, 0x10, 0x00, 0x2e, 0x00, 0x8e, + 0x00, 0xce, 0x00, 0x9e, 0x00, 0xee, 0x01, 0x2e, 0x00, 0x05, 0x90, 0x16, + 0x04, 0x89, 0x11, 0x10, 0x20, 0x11, 0x00, 0x01, 0x00, 0x05, 0x08, 0x0c, + 0x6a, 0xae, 0x01, 0x28, 0x08, 0x0c, 0xcf, 0xdc, 0x00, 0x10, 0x90, 0x85, + 0x00, 0x01, 0x00, 0x05, 0x08, 0x0c, 0x6a, 0xae, 0x01, 0x28, 0x08, 0x0c, + 0xcf, 0x7d, 0x00, 0x10, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x08, 0x0c, + 0x6a, 0xae, 0x01, 0x28, 0x08, 0x0c, 0xcf, 0xd9, 0x00, 0x10, 0x90, 0x85, + 0x00, 0x01, 0x00, 0x05, 0x08, 0x0c, 0x6a, 0xae, 0x01, 0x28, 0x08, 0x0c, + 0xcf, 0x9c, 0x00, 0x10, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x08, 0x0c, + 0x6a, 0xae, 0x01, 0x28, 0x08, 0x0c, 0xd0, 0x1f, 0x00, 0x10, 0x90, 0x85, + 0x00, 0x01, 0x00, 0x05, 0xb8, 0xa4, 0x90, 0x0d, 0x11, 0x18, 0x90, 0x85, + 0x00, 0x01, 0x00, 0x05, 0x01, 0x36, 0x01, 0xc6, 0xa8, 0x00, 0x90, 0x05, + 0x11, 0xb8, 0x89, 0x0e, 0x81, 0x0e, 0x81, 0x0f, 0x91, 0x84, 0x00, 0x3f, + 0x20, 0xe0, 0x91, 0x84, 0xff, 0xc0, 0x90, 0x80, 0x00, 0x04, 0x20, 0x98, + 0x20, 0xa9, 0x00, 0x01, 0x20, 0x09, 0x00, 0x10, 0x40, 0x02, 0x96, 0x06, + 0x01, 0x28, 0x81, 0x09, 0x1d, 0xd8, 0x90, 0x85, 0x00, 0x01, 0x00, 0x08, + 0x90, 0x06, 0x01, 0xce, 0x01, 0x3e, 0x00, 0x05, 0x01, 0x46, 0x01, 0xd6, + 0xa8, 0x60, 0x20, 0xe8, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x04, 0x20, 0xa0, + 0x20, 0xa9, 0x00, 0x10, 0x20, 0x09, 0xff, 0xff, 0x41, 0x04, 0x01, 0xde, + 0x01, 0x4e, 0x01, 0x36, 0x01, 0xc6, 0xa8, 0x00, 0x90, 0x05, 0x11, 0xb8, + 0x89, 0x0e, 0x81, 0x0e, 0x81, 0x0f, 0x91, 0x84, 0x00, 0x3f, 0x20, 0xe0, + 0x91, 0x84, 0xff, 0xc0, 0x90, 0x80, 0x00, 0x04, 0x20, 0x98, 0x20, 0xa9, + 0x00, 0x01, 0x20, 0x09, 0x00, 0x10, 0x40, 0x02, 0x96, 0x06, 0x01, 0x28, + 0x81, 0x09, 0x1d, 0xd8, 0x90, 0x85, 0x00, 0x01, 0x00, 0x68, 0x01, 0x46, + 0x01, 0xd6, 0x33, 0x00, 0x80, 0x01, 0x20, 0xa0, 0x3c, 0x00, 0x20, 0xe8, + 0x20, 0x01, 0xff, 0xff, 0x40, 0x04, 0x01, 0xde, 0x01, 0x4e, 0x90, 0x06, + 0x01, 0xce, 0x01, 0x3e, 0x00, 0x05, 0x00, 0x96, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0xb8, 0xa4, 0x90, 0x4d, 0x11, 0x28, 0x08, 0x0c, 0x10, 0x59, + 0x01, 0x68, 0x29, 0x00, 0xb8, 0xa6, 0x08, 0x0c, 0x6a, 0x4a, 0xa8, 0x03, + 0x00, 0x01, 0xa8, 0x07, 0x00, 0x00, 0x90, 0x85, 0x00, 0x01, 0x01, 0x2e, + 0x00, 0x9e, 0x00, 0x05, 0x90, 0x06, 0x0c, 0xd8, 0x00, 0x96, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0xb8, 0xa4, 0x90, 0x4d, 0x01, 0x30, 0xb8, 0xa7, + 0x00, 0x00, 0x08, 0x0c, 0x10, 0x8b, 0x90, 0x85, 0x00, 0x01, 0x01, 0x2e, + 0x00, 0x9e, 0x00, 0x05, 0xb8, 0x9c, 0xd0, 0xa4, 0x00, 0x05, 0x00, 0xb6, + 0x00, 0xf6, 0x08, 0x0c, 0x77, 0x9e, 0x01, 0xb0, 0x71, 0xc4, 0x81, 0xff, + 0x11, 0x98, 0x71, 0xdc, 0xd1, 0x9c, 0x01, 0x80, 0x20, 0x01, 0x00, 0x7e, + 0x90, 0x80, 0x10, 0x00, 0x20, 0x04, 0x90, 0x5d, 0x01, 0x48, 0xb8, 0x04, + 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x06, 0x11, 0x18, 0xb8, 0x00, + 0xc0, 0xed, 0xb8, 0x02, 0x20, 0x79, 0x18, 0x47, 0x78, 0x04, 0xd0, 0xa4, + 0x01, 0xd0, 0x01, 0x56, 0x20, 0xa9, 0x00, 0x7f, 0x90, 0x0e, 0x00, 0x16, + 0x08, 0x0c, 0x67, 0xb4, 0x11, 0x68, 0xb8, 0x04, 0x90, 0x84, 0xff, 0x00, + 0x80, 0x07, 0x90, 0x96, 0x00, 0x04, 0x01, 0x18, 0x90, 0x86, 0x00, 0x06, + 0x11, 0x18, 0xb8, 0x00, 0xc0, 0xed, 0xb8, 0x02, 0x00, 0x1e, 0x81, 0x08, + 0x1f, 0x04, 0x6a, 0xd5, 0x01, 0x5e, 0x08, 0x0c, 0x6b, 0xcf, 0x01, 0x20, + 0x20, 0x01, 0x19, 0x85, 0x20, 0x0c, 0x00, 0x98, 0x20, 0x79, 0x18, 0x47, + 0x78, 0x04, 0xd0, 0xa4, 0x01, 0x90, 0x20, 0x09, 0x07, 0xd0, 0x20, 0x01, + 0x18, 0x2c, 0x20, 0x04, 0x90, 0x05, 0x01, 0x38, 0x20, 0x01, 0x18, 0x67, + 0x20, 0x04, 0xd0, 0xe4, 0x01, 0x10, 0x20, 0x09, 0x5d, 0xc0, 0x20, 0x11, + 0x6b, 0x0c, 0x08, 0x0c, 0x8a, 0x5d, 0x00, 0xfe, 0x00, 0xbe, 0x00, 0x05, + 0x00, 0xb6, 0x20, 0x11, 0x6b, 0x0c, 0x08, 0x0c, 0x89, 0x93, 0x08, 0x0c, + 0x6b, 0xcf, 0x01, 0xd8, 0x20, 0x01, 0x10, 0x7e, 0x20, 0x04, 0x20, 0x58, + 0xb9, 0x00, 0xc1, 0xec, 0xb9, 0x02, 0x08, 0x0c, 0x6c, 0x0d, 0x01, 0x30, + 0x20, 0x09, 0x07, 0xd0, 0x20, 0x11, 0x6b, 0x0c, 0x08, 0x0c, 0x8a, 0x5d, + 0x00, 0xe6, 0x20, 0x71, 0x18, 0x00, 0x90, 0x06, 0x70, 0x7e, 0x70, 0x60, + 0x70, 0x82, 0x08, 0x0c, 0x30, 0xbf, 0x00, 0xee, 0x04, 0xd0, 0x01, 0x56, + 0x00, 0xc6, 0x20, 0xa9, 0x00, 0x7f, 0x90, 0x0e, 0x00, 0x16, 0x08, 0x0c, + 0x67, 0xb4, 0x15, 0x58, 0xb8, 0x00, 0xd0, 0xec, 0x05, 0x40, 0x00, 0x46, + 0xba, 0xa0, 0x22, 0x20, 0x90, 0x06, 0x20, 0x09, 0x00, 0x29, 0x08, 0x0c, + 0xea, 0x8d, 0xb8, 0x00, 0xc0, 0xe5, 0xc0, 0xec, 0xb8, 0x02, 0x08, 0x0c, + 0x6c, 0x09, 0x20, 0x01, 0x07, 0x07, 0x11, 0x28, 0xb8, 0x04, 0x90, 0x84, + 0x00, 0xff, 0x90, 0x85, 0x07, 0x00, 0xb8, 0x06, 0x08, 0x0c, 0xac, 0xfc, + 0x20, 0x19, 0x00, 0x29, 0x08, 0x0c, 0x97, 0xb0, 0x00, 0x76, 0x90, 0x3e, + 0x08, 0x0c, 0x96, 0x6d, 0x90, 0x0e, 0x08, 0x0c, 0xe7, 0x5d, 0x00, 0x7e, + 0x00, 0x4e, 0x08, 0x0c, 0xad, 0x18, 0x00, 0x1e, 0x81, 0x08, 0x1f, 0x04, + 0x6b, 0x34, 0x00, 0xce, 0x01, 0x5e, 0x00, 0xbe, 0x00, 0x05, 0x00, 0xb6, + 0x60, 0x10, 0x20, 0x58, 0xb8, 0x00, 0xc0, 0xec, 0xb8, 0x02, 0x00, 0xbe, + 0x00, 0x05, 0x00, 0xb6, 0x00, 0xc6, 0x00, 0x96, 0x08, 0x0c, 0x10, 0x72, + 0x09, 0x0c, 0x0d, 0x85, 0x29, 0x58, 0x00, 0x9e, 0x20, 0x01, 0x19, 0x6b, + 0x2b, 0x02, 0x8b, 0x07, 0x80, 0x06, 0x80, 0x06, 0x90, 0x8c, 0x00, 0x3f, + 0xb9, 0xc6, 0x90, 0x8c, 0xff, 0xc0, 0xb9, 0xca, 0xb8, 0xaf, 0x00, 0x00, + 0x20, 0x09, 0x00, 0xff, 0x08, 0x0c, 0x61, 0xb7, 0xb8, 0x07, 0x00, 0x06, + 0xb8, 0x13, 0x00, 0xff, 0xb8, 0x17, 0xff, 0xff, 0xb8, 0x6f, 0x02, 0x00, + 0xb8, 0x6c, 0xb8, 0x93, 0x00, 0x02, 0xb8, 0xbb, 0x05, 0x20, 0xb8, 0xa3, + 0x00, 0xff, 0xb8, 0xaf, 0x00, 0x00, 0x00, 0xce, 0x00, 0xbe, 0x00, 0x05, + 0x78, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x00, 0x00, 0xbe, 0xd0, 0xac, + 0x00, 0x05, 0x60, 0x10, 0x00, 0xb6, 0x90, 0x5d, 0x01, 0x08, 0xb8, 0x00, + 0x00, 0xbe, 0xd0, 0xbc, 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, 0x00, 0x26, + 0xb8, 0x04, 0x90, 0x8c, 0x00, 0xff, 0x91, 0x96, 0x00, 0x06, 0x01, 0x88, + 0x91, 0x96, 0x00, 0x04, 0x01, 0x70, 0x91, 0x96, 0x00, 0x05, 0x01, 0x58, + 0x90, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0x91, 0x96, 0x00, 0x06, 0x01, 0x28, + 0x91, 0x96, 0x00, 0x04, 0x01, 0x10, 0x91, 0x96, 0x00, 0x05, 0x00, 0x2e, + 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xf6, 0x20, 0x01, + 0x10, 0x7e, 0x20, 0x04, 0x90, 0x5d, 0x01, 0x10, 0xb8, 0x00, 0xd0, 0xec, + 0x00, 0xfe, 0x00, 0xbe, 0x00, 0x05, 0x01, 0x26, 0x00, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x00, 0x06, 0xba, 0xa0, 0x92, 0x90, 0x10, 0x00, 0x22, 0x04, + 0x9b, 0x06, 0x19, 0x0c, 0x0d, 0x85, 0x00, 0x0e, 0xba, 0x00, 0x90, 0x05, + 0x01, 0x10, 0xc2, 0xfd, 0x00, 0x08, 0xc2, 0xfc, 0xba, 0x02, 0x00, 0x2e, + 0x01, 0x2e, 0x00, 0x05, 0x20, 0x11, 0x18, 0x37, 0x22, 0x04, 0xd0, 0xcc, + 0x01, 0x38, 0x20, 0x01, 0x19, 0x83, 0x20, 0x0c, 0x20, 0x11, 0x6b, 0xff, + 0x08, 0x0c, 0x8a, 0x5d, 0x00, 0x05, 0x20, 0x11, 0x6b, 0xff, 0x08, 0x0c, + 0x89, 0x93, 0x20, 0x11, 0x18, 0x37, 0x22, 0x04, 0xc0, 0xcc, 0x20, 0x12, + 0x00, 0x05, 0x08, 0x0c, 0x58, 0x40, 0xd0, 0xac, 0x00, 0x05, 0x08, 0x0c, + 0x58, 0x40, 0xd0, 0xa4, 0x00, 0x05, 0x00, 0x16, 0xb9, 0x04, 0x91, 0x84, + 0x00, 0xff, 0x90, 0x8e, 0x00, 0x06, 0x00, 0x1e, 0x00, 0x05, 0x00, 0x16, + 0xb9, 0x04, 0x91, 0x84, 0xff, 0x00, 0x80, 0x07, 0x90, 0x8e, 0x00, 0x06, + 0x00, 0x1e, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xf6, 0x08, 0x0c, 0xd6, 0x45, + 0x01, 0x58, 0x70, 0xdc, 0x90, 0x84, 0x00, 0x28, 0x01, 0x38, 0x20, 0x01, + 0x10, 0x7f, 0x20, 0x04, 0x90, 0x5d, 0x01, 0x10, 0xb8, 0xd4, 0xd0, 0x94, + 0x00, 0xfe, 0x00, 0xbe, 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, 0x00, 0x36, + 0x00, 0x46, 0x00, 0x76, 0x00, 0xb6, 0x20, 0x01, 0x18, 0x18, 0x20, 0x3c, + 0x97, 0x80, 0x34, 0x8e, 0x20, 0x3d, 0x97, 0xbc, 0xff, 0x00, 0x87, 0x3f, + 0x90, 0x06, 0x20, 0x18, 0x20, 0x08, 0x92, 0x84, 0x80, 0x00, 0x01, 0x10, + 0x20, 0x19, 0x00, 0x01, 0x92, 0x94, 0x7f, 0xff, 0x21, 0x00, 0x97, 0x06, + 0x01, 0x90, 0x91, 0xa0, 0x10, 0x00, 0x24, 0x04, 0x90, 0x5d, 0x01, 0x68, + 0xb8, 0x04, 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x06, 0x11, 0x38, + 0x83, 0xff, 0x01, 0x18, 0xb8, 0x9c, 0xd0, 0xa4, 0x01, 0x10, 0x82, 0x11, + 0x01, 0x58, 0x81, 0x08, 0x83, 0xff, 0x01, 0x20, 0x91, 0x82, 0x08, 0x00, + 0x0e, 0x28, 0x00, 0x68, 0x91, 0x82, 0x00, 0x7e, 0x0e, 0x08, 0x00, 0x48, + 0x00, 0xbe, 0x00, 0x7e, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0x1e, 0x90, 0x85, + 0x00, 0x01, 0x00, 0x0e, 0x00, 0x05, 0x00, 0xbe, 0x00, 0x7e, 0x00, 0x4e, + 0x00, 0x3e, 0x00, 0x1e, 0x90, 0x06, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x46, + 0x00, 0x56, 0x00, 0x76, 0x00, 0xb6, 0x21, 0x00, 0x90, 0x84, 0x7f, 0xff, + 0x90, 0x80, 0x10, 0x00, 0x20, 0x04, 0x90, 0x5d, 0x01, 0x30, 0xb8, 0x04, + 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x06, 0x05, 0x50, 0x91, 0x84, + 0x80, 0x00, 0x05, 0x80, 0x20, 0x01, 0x18, 0x18, 0x20, 0x3c, 0x97, 0x80, + 0x34, 0x8e, 0x20, 0x3d, 0x97, 0xbc, 0xff, 0x00, 0x87, 0x3f, 0x90, 0x06, + 0x20, 0x20, 0x24, 0x00, 0x97, 0x06, 0x01, 0xa0, 0x94, 0xa8, 0x10, 0x00, + 0x25, 0x04, 0x90, 0x5d, 0x01, 0x78, 0xb8, 0x04, 0x90, 0x84, 0x00, 0xff, + 0x90, 0x86, 0x00, 0x06, 0x11, 0x48, 0xb8, 0x9c, 0xd0, 0xa4, 0x01, 0x30, + 0xb8, 0x14, 0x92, 0x06, 0x11, 0x18, 0xb8, 0x10, 0x93, 0x06, 0x01, 0x28, + 0x84, 0x20, 0x94, 0x82, 0x08, 0x00, 0x0e, 0x28, 0x00, 0x48, 0x91, 0x8c, + 0x7f, 0xff, 0x00, 0xbe, 0x00, 0x7e, 0x00, 0x5e, 0x00, 0x4e, 0x90, 0x85, + 0x00, 0x01, 0x00, 0x05, 0x91, 0x8c, 0x7f, 0xff, 0x00, 0xbe, 0x00, 0x7e, + 0x00, 0x5e, 0x00, 0x4e, 0x90, 0x06, 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, + 0x00, 0xa0, 0x80, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0x1d, 0xd8, + 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0x00, 0xf8, 0x80, 0x01, + 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0x1d, 0xd8, 0x00, 0x0e, 0x00, 0x05, + 0x00, 0x06, 0x20, 0x01, 0x00, 0xe8, 0x80, 0x01, 0xa0, 0x01, 0xa0, 0x01, + 0xa0, 0x01, 0x1d, 0xd8, 0x00, 0x0e, 0x00, 0x05, 0x20, 0x71, 0x19, 0x10, + 0x70, 0x03, 0x00, 0x01, 0x70, 0x07, 0x00, 0x00, 0x90, 0x06, 0x70, 0x12, + 0x70, 0x16, 0x70, 0x1a, 0x70, 0x1e, 0x70, 0x0a, 0x70, 0x46, 0x20, 0x01, + 0x19, 0x22, 0x20, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x16, 0x00, 0xe6, + 0x20, 0x71, 0x19, 0x48, 0x90, 0x0e, 0x71, 0x0a, 0x08, 0x0c, 0x58, 0x40, + 0xd0, 0xfc, 0x11, 0x40, 0x08, 0x0c, 0x58, 0x40, 0x90, 0x0e, 0xd0, 0x9c, + 0x01, 0x08, 0x81, 0x08, 0x71, 0x02, 0x04, 0x70, 0x20, 0x01, 0x18, 0x67, + 0x20, 0x0c, 0x91, 0x84, 0x00, 0x07, 0x00, 0x06, 0x20, 0x01, 0x18, 0x0d, + 0x20, 0x04, 0xd0, 0x8c, 0x00, 0x0e, 0x01, 0x08, 0x90, 0x06, 0x00, 0x02, + 0x6d, 0x06, 0x6d, 0x06, 0x6d, 0x06, 0x6d, 0x06, 0x6d, 0x06, 0x6d, 0x24, + 0x6d, 0x39, 0x6d, 0x47, 0x70, 0x03, 0x00, 0x03, 0x20, 0x09, 0x18, 0x68, + 0x21, 0x0c, 0x91, 0x84, 0xff, 0x00, 0x90, 0x8e, 0xff, 0x00, 0x01, 0x40, + 0x80, 0x07, 0x90, 0x05, 0x11, 0x10, 0x20, 0x01, 0x00, 0x02, 0x80, 0x03, + 0x70, 0x06, 0x00, 0x30, 0x70, 0x07, 0x00, 0x01, 0x00, 0x18, 0x70, 0x03, + 0x00, 0x05, 0x0c, 0x50, 0x20, 0x71, 0x19, 0x10, 0x70, 0x4f, 0x00, 0x00, + 0x20, 0x71, 0x18, 0x00, 0x70, 0xf7, 0x00, 0x01, 0x00, 0xee, 0x00, 0x1e, + 0x00, 0x05, 0x70, 0x03, 0x00, 0x00, 0x20, 0x71, 0x19, 0x10, 0x20, 0x09, + 0x18, 0x68, 0x21, 0x0c, 0x91, 0x84, 0x7f, 0x00, 0x80, 0x07, 0x90, 0x8c, + 0x00, 0x0f, 0x01, 0x60, 0x71, 0x4e, 0x80, 0x04, 0x80, 0x04, 0x80, 0x04, + 0x80, 0x04, 0x20, 0x71, 0x18, 0x00, 0x90, 0x8c, 0x00, 0x07, 0x01, 0x28, + 0x70, 0xf6, 0x0c, 0x20, 0x70, 0x4f, 0x00, 0x0f, 0x0c, 0x90, 0x70, 0xf7, + 0x00, 0x05, 0x08, 0xf0, 0x00, 0xe6, 0x20, 0x71, 0x00, 0x50, 0x68, 0x4c, + 0x90, 0x05, 0x11, 0x50, 0x00, 0xe6, 0x20, 0x71, 0x19, 0x10, 0x70, 0x28, + 0xc0, 0x85, 0x70, 0x2a, 0x00, 0xee, 0x90, 0x85, 0x00, 0x01, 0x04, 0x88, + 0x68, 0x44, 0x90, 0x05, 0x01, 0x58, 0x08, 0x0c, 0x7b, 0x28, 0x6a, 0x60, + 0x92, 0x00, 0x70, 0x02, 0x68, 0x64, 0x91, 0x01, 0x70, 0x06, 0x90, 0x06, + 0x70, 0x12, 0x70, 0x16, 0x68, 0x60, 0x70, 0x02, 0x68, 0x64, 0x70, 0x06, + 0x68, 0x68, 0x70, 0x0a, 0x68, 0x6c, 0x70, 0x0e, 0x68, 0x44, 0x90, 0x05, + 0x11, 0x10, 0x70, 0x12, 0x70, 0x16, 0x68, 0x4c, 0x70, 0x1a, 0x70, 0x1c, + 0x90, 0x85, 0x00, 0x40, 0x70, 0x1e, 0x70, 0x37, 0x00, 0x19, 0x70, 0x2b, + 0x00, 0x01, 0x00, 0xe6, 0x20, 0x71, 0x19, 0x10, 0x70, 0x28, 0xc0, 0x84, + 0x70, 0x2a, 0x70, 0x07, 0x00, 0x01, 0x70, 0x0b, 0x00, 0x00, 0x00, 0xee, + 0x90, 0x06, 0x00, 0xee, 0x00, 0x05, 0x00, 0xe6, 0x00, 0x26, 0x20, 0x71, + 0x19, 0x48, 0x70, 0x00, 0x90, 0x15, 0x09, 0x04, 0x70, 0x17, 0x92, 0x86, + 0x00, 0x03, 0x09, 0x04, 0x6e, 0xac, 0x92, 0x86, 0x00, 0x05, 0x09, 0x04, + 0x6e, 0xac, 0x20, 0x71, 0x18, 0x77, 0xa8, 0x7c, 0x90, 0x05, 0x09, 0x04, + 0x6e, 0x07, 0x71, 0x40, 0xa8, 0x68, 0x91, 0x02, 0x0a, 0x04, 0x70, 0x17, + 0xa8, 0x78, 0xd0, 0x84, 0x15, 0xd8, 0xa8, 0x53, 0x00, 0x19, 0x20, 0x01, + 0x80, 0x23, 0xa8, 0x4e, 0x20, 0x71, 0x19, 0x10, 0x70, 0x1c, 0x90, 0x05, + 0x19, 0x04, 0x71, 0xc6, 0x0e, 0x04, 0x72, 0x34, 0x20, 0x71, 0x00, 0x00, + 0xa8, 0x50, 0x70, 0x32, 0xa8, 0x4c, 0x70, 0x82, 0xa8, 0x70, 0x70, 0x86, + 0xa8, 0x6c, 0x70, 0x8a, 0xa8, 0x80, 0x70, 0x8e, 0x70, 0x36, 0x01, 0x46, + 0x01, 0xd6, 0x01, 0x36, 0x01, 0xc6, 0x01, 0x56, 0x20, 0xe9, 0x00, 0x00, + 0x20, 0xa1, 0x00, 0x2a, 0xa8, 0x68, 0x20, 0xa8, 0xa8, 0x60, 0x20, 0xe0, + 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x21, 0x20, 0x98, 0x40, 0x03, 0x01, 0x5e, + 0x01, 0xce, 0x01, 0x3e, 0x01, 0xde, 0x01, 0x4e, 0x20, 0x91, 0x40, 0x80, + 0x20, 0x01, 0x00, 0x89, 0x20, 0x04, 0xd0, 0x84, 0x19, 0x0c, 0x12, 0x00, + 0x08, 0x04, 0x6e, 0x8f, 0xa8, 0x53, 0x00, 0x1b, 0x20, 0x01, 0x80, 0x27, + 0x08, 0x20, 0x70, 0x04, 0xd0, 0x8c, 0x19, 0x04, 0x70, 0x17, 0xa8, 0x53, + 0x00, 0x1a, 0x20, 0x01, 0x80, 0x24, 0x08, 0x04, 0x6d, 0xcb, 0x00, 0xe6, + 0x00, 0x26, 0x20, 0x71, 0x19, 0x48, 0x70, 0x00, 0x90, 0x15, 0x09, 0x04, + 0x70, 0x17, 0x92, 0x86, 0x00, 0x03, 0x09, 0x04, 0x6e, 0xac, 0x92, 0x86, + 0x00, 0x05, 0x09, 0x04, 0x6e, 0xac, 0xa8, 0x4f, 0x80, 0x22, 0xa8, 0x53, + 0x00, 0x18, 0x08, 0x04, 0x6e, 0x74, 0xa8, 0x68, 0xd0, 0xfc, 0x15, 0x08, + 0x00, 0xe6, 0x00, 0x26, 0x20, 0x01, 0x19, 0x48, 0x20, 0x04, 0x90, 0x15, + 0x09, 0x04, 0x70, 0x17, 0xa9, 0x78, 0xa8, 0x74, 0x91, 0x05, 0x19, 0x04, + 0x70, 0x17, 0x92, 0x86, 0x00, 0x03, 0x09, 0x04, 0x6e, 0xac, 0x92, 0x86, + 0x00, 0x05, 0x09, 0x04, 0x6e, 0xac, 0xa8, 0x7c, 0xd0, 0xbc, 0x19, 0x04, + 0x70, 0x17, 0x22, 0x00, 0x00, 0x02, 0x70, 0x17, 0x6e, 0x70, 0x6e, 0xac, + 0x6e, 0xac, 0x70, 0x17, 0x6e, 0xac, 0x00, 0x05, 0xa8, 0x68, 0xd0, 0xfc, + 0x15, 0x00, 0x00, 0xe6, 0x00, 0x26, 0x20, 0x09, 0x19, 0x48, 0x21, 0x0c, + 0x81, 0xff, 0x09, 0x04, 0x70, 0x17, 0xa8, 0x80, 0x90, 0x84, 0x00, 0xff, + 0x90, 0x86, 0x00, 0x01, 0x19, 0x04, 0x70, 0x17, 0x91, 0x86, 0x00, 0x03, + 0x09, 0x04, 0x6e, 0xac, 0x91, 0x86, 0x00, 0x05, 0x09, 0x04, 0x6e, 0xac, + 0xa8, 0x7c, 0xd0, 0xcc, 0x09, 0x04, 0x70, 0x17, 0xa8, 0x4f, 0x80, 0x21, + 0xa8, 0x53, 0x00, 0x17, 0x00, 0x28, 0x00, 0x05, 0xa8, 0x4f, 0x80, 0x20, + 0xa8, 0x53, 0x00, 0x16, 0x20, 0x71, 0x19, 0x10, 0x70, 0x1c, 0x90, 0x05, + 0x19, 0x04, 0x71, 0xc6, 0x0e, 0x04, 0x72, 0x34, 0x20, 0x71, 0x00, 0x00, + 0xa8, 0x4c, 0x70, 0x82, 0xa8, 0x50, 0x70, 0x32, 0xa8, 0x6c, 0x70, 0x86, + 0x70, 0x36, 0xa8, 0x70, 0x70, 0x8a, 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, + 0x00, 0x89, 0x20, 0x04, 0xd0, 0x84, 0x19, 0x0c, 0x12, 0x00, 0x20, 0x71, + 0x18, 0x00, 0x20, 0x11, 0x00, 0x01, 0xa8, 0x04, 0x90, 0x0d, 0x70, 0x2c, + 0x11, 0x58, 0xa8, 0x02, 0x29, 0x00, 0x70, 0x2e, 0x70, 0xc0, 0x92, 0x00, + 0x70, 0xc2, 0x08, 0x0c, 0x88, 0x99, 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, + 0x00, 0x96, 0x21, 0x48, 0xa9, 0x04, 0xa8, 0x02, 0x82, 0x10, 0x29, 0x00, + 0x81, 0xff, 0x1d, 0xc8, 0x00, 0x9e, 0x0c, 0x58, 0xa8, 0x4f, 0x00, 0x00, + 0x00, 0xf6, 0x20, 0x79, 0x00, 0x50, 0x20, 0x71, 0x19, 0x10, 0xa8, 0x03, + 0x00, 0x00, 0x70, 0x10, 0x90, 0x05, 0x19, 0x04, 0x6f, 0x9d, 0x78, 0x2c, + 0x90, 0x8c, 0x07, 0x80, 0x19, 0x0c, 0x73, 0x82, 0x80, 0x04, 0x80, 0x04, + 0x80, 0x04, 0x90, 0x84, 0x00, 0x03, 0x00, 0x02, 0x6e, 0xca, 0x6f, 0x9d, + 0x6e, 0xee, 0x6f, 0x3a, 0x08, 0x0c, 0x0d, 0x85, 0x20, 0x71, 0x18, 0x00, + 0x29, 0x00, 0x78, 0x22, 0xa8, 0x04, 0x90, 0x0d, 0x11, 0x68, 0x20, 0x71, + 0x1a, 0x04, 0x70, 0x44, 0x90, 0x05, 0x13, 0x20, 0x20, 0x01, 0x19, 0x49, + 0x20, 0x04, 0x70, 0x46, 0x00, 0xfe, 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, + 0x90, 0x16, 0x70, 0x2c, 0x21, 0x48, 0xa9, 0x04, 0xa8, 0x02, 0x82, 0x10, + 0x29, 0x00, 0x81, 0xff, 0x1d, 0xc8, 0x70, 0x2e, 0x70, 0xc0, 0x92, 0x00, + 0x70, 0xc2, 0x08, 0x0c, 0x88, 0x99, 0x0c, 0x18, 0x20, 0x71, 0x18, 0x00, + 0x29, 0x00, 0x78, 0x22, 0xa8, 0x04, 0x90, 0x0d, 0x15, 0xa0, 0x78, 0x24, + 0x00, 0xe6, 0x20, 0x71, 0x00, 0x40, 0x71, 0x2c, 0xd1, 0x9c, 0x11, 0x70, + 0x20, 0x09, 0x18, 0x30, 0x21, 0x0c, 0x91, 0x8a, 0x00, 0x20, 0x02, 0x40, + 0x70, 0x22, 0x20, 0x01, 0x1d, 0xc0, 0x20, 0x0c, 0x81, 0x08, 0x21, 0x02, + 0x00, 0xee, 0x00, 0x58, 0x00, 0xee, 0x20, 0x48, 0x70, 0x2c, 0xa8, 0x02, + 0x29, 0x00, 0x70, 0x2e, 0x70, 0xc0, 0x80, 0x00, 0x70, 0xc2, 0x08, 0x0c, + 0x88, 0x99, 0x78, 0x2c, 0x90, 0x94, 0x07, 0x80, 0x19, 0x0c, 0x73, 0x82, + 0xd0, 0xa4, 0x19, 0xc8, 0x20, 0x71, 0x1a, 0x04, 0x70, 0x44, 0x90, 0x05, + 0x13, 0x20, 0x20, 0x01, 0x19, 0x49, 0x20, 0x04, 0x70, 0x46, 0x00, 0xfe, + 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x90, 0x16, 0x70, 0x2c, 0x21, 0x48, + 0xa9, 0x04, 0xa8, 0x02, 0x82, 0x10, 0x29, 0x00, 0x81, 0xff, 0x1d, 0xc8, + 0x70, 0x2e, 0x70, 0xc0, 0x92, 0x00, 0x70, 0xc2, 0x08, 0x0c, 0x88, 0x99, + 0x08, 0x04, 0x6e, 0xf5, 0x00, 0x96, 0x00, 0xe6, 0x78, 0x24, 0x20, 0x48, + 0x20, 0x71, 0x18, 0x00, 0x70, 0x2c, 0xa8, 0x02, 0x29, 0x00, 0x70, 0x2e, + 0x70, 0xc0, 0x80, 0x00, 0x70, 0xc2, 0x08, 0x0c, 0x88, 0x99, 0x78, 0x2c, + 0x90, 0x94, 0x07, 0x80, 0x19, 0x0c, 0x73, 0x82, 0xd0, 0xa4, 0x1d, 0x60, + 0x00, 0xee, 0x78, 0x2c, 0x90, 0x94, 0x07, 0x80, 0x19, 0x0c, 0x73, 0x82, + 0xd0, 0x9c, 0x11, 0x98, 0x00, 0x9e, 0x29, 0x00, 0x78, 0x22, 0xa8, 0x04, + 0x90, 0x0d, 0x15, 0x50, 0x20, 0x71, 0x1a, 0x04, 0x70, 0x44, 0x90, 0x05, + 0x13, 0x20, 0x20, 0x01, 0x19, 0x49, 0x20, 0x04, 0x70, 0x46, 0x00, 0xfe, + 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x00, 0x9e, 0x29, 0x08, 0x70, 0x10, + 0x80, 0x00, 0x70, 0x12, 0x70, 0x18, 0x90, 0x4d, 0x71, 0x1a, 0x01, 0x10, + 0xa9, 0x02, 0x00, 0x08, 0x71, 0x1e, 0x21, 0x48, 0xa8, 0x04, 0x90, 0x0d, + 0x11, 0x68, 0x20, 0x71, 0x1a, 0x04, 0x70, 0x44, 0x90, 0x05, 0x13, 0x20, + 0x20, 0x01, 0x19, 0x49, 0x20, 0x04, 0x70, 0x46, 0x00, 0xfe, 0x00, 0x2e, + 0x00, 0xee, 0x00, 0x05, 0x20, 0x71, 0x18, 0x00, 0x90, 0x16, 0x70, 0x2c, + 0x21, 0x48, 0xa9, 0x04, 0xa8, 0x02, 0x82, 0x10, 0x29, 0x00, 0x81, 0xff, + 0x1d, 0xc8, 0x70, 0x2e, 0x70, 0xc0, 0x92, 0x00, 0x70, 0xc2, 0x08, 0x0c, + 0x88, 0x99, 0x00, 0xfe, 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x29, 0x08, + 0x70, 0x10, 0x80, 0x00, 0x70, 0x12, 0x70, 0x18, 0x90, 0x4d, 0x71, 0x1a, + 0x01, 0x10, 0xa9, 0x02, 0x00, 0x08, 0x71, 0x1e, 0x21, 0x48, 0xa8, 0x04, + 0x90, 0x0d, 0x19, 0x04, 0x6f, 0xf1, 0x78, 0x2c, 0x90, 0x94, 0x07, 0x80, + 0x19, 0x0c, 0x73, 0x82, 0xd0, 0x9c, 0x11, 0x98, 0x70, 0x1c, 0x90, 0x4d, + 0x01, 0x80, 0x70, 0x10, 0x80, 0x01, 0x70, 0x12, 0x11, 0x08, 0x70, 0x1a, + 0xa8, 0x00, 0x70, 0x1e, 0x29, 0x00, 0x78, 0x22, 0x78, 0x2c, 0x90, 0x94, + 0x07, 0x80, 0x19, 0x0c, 0x73, 0x82, 0xd0, 0x9c, 0x0d, 0x68, 0x78, 0x2c, + 0x90, 0x94, 0x07, 0x80, 0x19, 0x0c, 0x73, 0x82, 0xd0, 0xa4, 0x01, 0xb0, + 0x00, 0xe6, 0x78, 0x24, 0x20, 0x48, 0x20, 0x71, 0x18, 0x00, 0x70, 0x2c, + 0xa8, 0x02, 0x29, 0x00, 0x70, 0x2e, 0x70, 0xc0, 0x80, 0x00, 0x70, 0xc2, + 0x08, 0x0c, 0x88, 0x99, 0x78, 0x2c, 0x90, 0x94, 0x07, 0x80, 0x19, 0x0c, + 0x73, 0x82, 0xd0, 0xa4, 0x1d, 0x60, 0x00, 0xee, 0x20, 0x71, 0x1a, 0x04, + 0x70, 0x44, 0x90, 0x05, 0x13, 0x20, 0x20, 0x01, 0x19, 0x49, 0x20, 0x04, + 0x70, 0x46, 0x00, 0xfe, 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x00, 0xe6, + 0x20, 0x71, 0x18, 0x00, 0x90, 0x16, 0x70, 0x2c, 0x21, 0x48, 0xa9, 0x04, + 0xa8, 0x02, 0x82, 0x10, 0x29, 0x00, 0x81, 0xff, 0x1d, 0xc8, 0x70, 0x2e, + 0x70, 0xc0, 0x92, 0x00, 0x70, 0xc2, 0x08, 0x0c, 0x88, 0x99, 0x00, 0xee, + 0x08, 0x04, 0x6f, 0xad, 0xa8, 0x68, 0xd0, 0xfc, 0x15, 0xe0, 0x00, 0x96, + 0xa8, 0x04, 0xa8, 0x07, 0x00, 0x00, 0x90, 0x4d, 0x19, 0x0c, 0x10, 0x0b, + 0x00, 0x9e, 0x00, 0x18, 0xa8, 0x68, 0xd0, 0xfc, 0x15, 0x80, 0x00, 0xe6, + 0x00, 0x26, 0xa8, 0x4f, 0x00, 0x00, 0x00, 0xf6, 0x20, 0x79, 0x00, 0x50, + 0x20, 0x71, 0x19, 0x10, 0xa8, 0x03, 0x00, 0x00, 0xa8, 0x64, 0x90, 0x84, + 0x00, 0xff, 0x90, 0x8e, 0x00, 0x16, 0x01, 0xa8, 0x70, 0x10, 0x90, 0x05, + 0x19, 0x04, 0x71, 0x42, 0x78, 0x2c, 0x90, 0x8c, 0x07, 0x80, 0x19, 0x0c, + 0x73, 0x82, 0x80, 0x04, 0x80, 0x04, 0x80, 0x04, 0x90, 0x84, 0x00, 0x03, + 0x00, 0x02, 0x70, 0x46, 0x71, 0x42, 0x70, 0x61, 0x70, 0xd3, 0x08, 0x0c, + 0x0d, 0x85, 0x20, 0x09, 0x19, 0x48, 0x21, 0x04, 0x00, 0x02, 0x70, 0x26, + 0x70, 0x26, 0x70, 0x26, 0x6e, 0xb5, 0x70, 0x26, 0x6e, 0xb5, 0x00, 0x05, + 0x20, 0x71, 0x18, 0x00, 0x29, 0x00, 0x78, 0x22, 0xa8, 0x04, 0x90, 0x0d, + 0x11, 0x20, 0x00, 0xfe, 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x90, 0x16, + 0x70, 0x2c, 0x21, 0x48, 0xa9, 0x04, 0xa8, 0x02, 0x82, 0x10, 0x29, 0x00, + 0x81, 0xff, 0x1d, 0xc8, 0x70, 0x2e, 0x70, 0xc0, 0x92, 0x00, 0x70, 0xc2, + 0x08, 0x0c, 0x88, 0x99, 0x0c, 0x60, 0x20, 0x71, 0x18, 0x00, 0x29, 0x00, + 0x78, 0x22, 0xa8, 0x04, 0x90, 0x0d, 0x19, 0x04, 0x70, 0xc2, 0x78, 0x30, + 0xd0, 0xdc, 0x11, 0x20, 0x00, 0xfe, 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, + 0x78, 0x24, 0x00, 0xe6, 0x20, 0x71, 0x00, 0x40, 0x71, 0x2c, 0xd1, 0x9c, + 0x11, 0x70, 0x20, 0x09, 0x18, 0x30, 0x21, 0x0c, 0x91, 0x8a, 0x00, 0x20, + 0x02, 0x40, 0x70, 0x22, 0x20, 0x01, 0x1d, 0xc0, 0x20, 0x0c, 0x81, 0x08, + 0x21, 0x02, 0x00, 0xee, 0x00, 0x58, 0x00, 0xee, 0x20, 0x48, 0x70, 0x2c, + 0xa8, 0x02, 0x29, 0x00, 0x70, 0x2e, 0x70, 0xc0, 0x80, 0x00, 0x70, 0xc2, + 0x08, 0x0c, 0x88, 0x99, 0x78, 0x2c, 0x90, 0x94, 0x07, 0x80, 0x19, 0x0c, + 0x73, 0x82, 0xd0, 0xa4, 0x19, 0xc8, 0x0e, 0x04, 0x70, 0xb9, 0x78, 0x38, + 0x79, 0x38, 0x91, 0x0e, 0x1d, 0xe0, 0x00, 0xd6, 0x20, 0x69, 0x00, 0x00, + 0x68, 0x36, 0x68, 0x33, 0x00, 0x13, 0x00, 0xde, 0x20, 0x01, 0x19, 0x21, + 0x20, 0x0c, 0xc1, 0x84, 0x21, 0x02, 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, + 0x00, 0x89, 0x20, 0x04, 0xd0, 0x84, 0x19, 0x0c, 0x12, 0x00, 0x20, 0x01, + 0x19, 0x22, 0x20, 0x03, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x2e, 0x00, 0xee, + 0x00, 0x05, 0x20, 0x01, 0x19, 0x21, 0x20, 0x0c, 0xc1, 0x85, 0x21, 0x02, + 0x00, 0xfe, 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x90, 0x16, 0x70, 0x2c, + 0x21, 0x48, 0xa9, 0x04, 0xa8, 0x02, 0x82, 0x10, 0x29, 0x00, 0x81, 0xff, + 0x1d, 0xc8, 0x70, 0x2e, 0x70, 0xc0, 0x92, 0x00, 0x70, 0xc2, 0x08, 0x0c, + 0x88, 0x99, 0x08, 0x04, 0x70, 0x70, 0x00, 0x96, 0x00, 0xe6, 0x78, 0x24, + 0x20, 0x48, 0x20, 0x71, 0x18, 0x00, 0x70, 0x2c, 0xa8, 0x02, 0x29, 0x00, + 0x70, 0x2e, 0x70, 0xc0, 0x80, 0x00, 0x70, 0xc2, 0x08, 0x0c, 0x88, 0x99, + 0x78, 0x2c, 0x90, 0x94, 0x07, 0x80, 0x19, 0x0c, 0x73, 0x82, 0xd0, 0xa4, + 0x1d, 0x60, 0x00, 0xee, 0x0e, 0x04, 0x71, 0x15, 0x78, 0x38, 0x79, 0x38, + 0x91, 0x0e, 0x1d, 0xe0, 0x00, 0xd6, 0x20, 0x69, 0x00, 0x00, 0x68, 0x36, + 0x68, 0x33, 0x00, 0x13, 0x00, 0xde, 0x70, 0x44, 0xc0, 0x84, 0x70, 0x46, + 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, 0x00, 0x89, 0x20, 0x04, 0xd0, 0x84, + 0x19, 0x0c, 0x12, 0x00, 0x70, 0x4b, 0x00, 0x00, 0x78, 0x2c, 0x90, 0x94, + 0x07, 0x80, 0x19, 0x0c, 0x73, 0x82, 0xd0, 0x9c, 0x11, 0x70, 0x00, 0x9e, + 0x29, 0x00, 0x78, 0x22, 0xa8, 0x04, 0x90, 0x0d, 0x11, 0xe0, 0x00, 0xfe, + 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x70, 0x44, 0xc0, 0x85, 0x70, 0x46, + 0x0c, 0x58, 0x00, 0x9e, 0x29, 0x08, 0x70, 0x10, 0x80, 0x00, 0x70, 0x12, + 0x70, 0x18, 0x90, 0x4d, 0x71, 0x1a, 0x01, 0x10, 0xa9, 0x02, 0x00, 0x08, + 0x71, 0x1e, 0x21, 0x48, 0xa8, 0x04, 0x90, 0x0d, 0x11, 0x20, 0x00, 0xfe, + 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x20, 0x71, 0x18, 0x00, 0x90, 0x16, + 0x70, 0x2c, 0x21, 0x48, 0xa9, 0x04, 0xa8, 0x02, 0x82, 0x10, 0x29, 0x00, + 0x81, 0xff, 0x1d, 0xc8, 0x70, 0x2e, 0x70, 0xc0, 0x92, 0x00, 0x70, 0xc2, + 0x08, 0x0c, 0x88, 0x99, 0x00, 0xfe, 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, + 0x29, 0x08, 0x70, 0x10, 0x80, 0x00, 0x70, 0x12, 0x70, 0x18, 0x90, 0x4d, + 0x71, 0x1a, 0x01, 0x10, 0xa9, 0x02, 0x00, 0x08, 0x71, 0x1e, 0x21, 0x48, + 0xa8, 0x04, 0x90, 0x0d, 0x19, 0x04, 0x71, 0xb1, 0x78, 0x2c, 0x90, 0x94, + 0x07, 0x80, 0x19, 0x0c, 0x73, 0x82, 0xd0, 0x9c, 0x11, 0xb0, 0x70, 0x1c, + 0x90, 0x4d, 0x01, 0x98, 0xa8, 0x4c, 0x90, 0x05, 0x11, 0x80, 0x70, 0x10, + 0x80, 0x01, 0x70, 0x12, 0x11, 0x08, 0x70, 0x1a, 0xa8, 0x00, 0x70, 0x1e, + 0x29, 0x00, 0x78, 0x22, 0x78, 0x2c, 0x90, 0x94, 0x07, 0x80, 0x19, 0x0c, + 0x73, 0x82, 0xd0, 0x9c, 0x0d, 0x50, 0x78, 0x2c, 0x90, 0x94, 0x07, 0x80, + 0x19, 0x0c, 0x73, 0x82, 0xd0, 0xa4, 0x05, 0xb8, 0x00, 0xe6, 0x78, 0x24, + 0x20, 0x48, 0x20, 0x71, 0x18, 0x00, 0x70, 0x2c, 0xa8, 0x02, 0x29, 0x00, + 0x70, 0x2e, 0x70, 0xc0, 0x80, 0x00, 0x70, 0xc2, 0x08, 0x0c, 0x88, 0x99, + 0x78, 0x2c, 0x90, 0x94, 0x07, 0x80, 0x19, 0x0c, 0x73, 0x82, 0xd0, 0xa4, + 0x1d, 0x60, 0x00, 0xee, 0x0e, 0x04, 0x71, 0xaa, 0x78, 0x38, 0x79, 0x38, + 0x91, 0x0e, 0x1d, 0xe0, 0x00, 0xd6, 0x20, 0x69, 0x00, 0x00, 0x68, 0x36, + 0x68, 0x33, 0x00, 0x13, 0x00, 0xde, 0x70, 0x44, 0xc0, 0x84, 0x70, 0x46, + 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, 0x00, 0x89, 0x20, 0x04, 0xd0, 0x84, + 0x19, 0x0c, 0x12, 0x00, 0x70, 0x4b, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x2e, + 0x00, 0xee, 0x00, 0x05, 0x70, 0x44, 0xc0, 0x85, 0x70, 0x46, 0x00, 0xfe, + 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0x18, 0x00, + 0x90, 0x16, 0x70, 0x2c, 0x21, 0x48, 0xa9, 0x04, 0xa8, 0x02, 0x82, 0x10, + 0x29, 0x00, 0x81, 0xff, 0x1d, 0xc8, 0x70, 0x2e, 0x70, 0xc0, 0x92, 0x00, + 0x70, 0xc2, 0x08, 0x0c, 0x88, 0x99, 0x00, 0xee, 0x08, 0x04, 0x71, 0x52, + 0x20, 0x71, 0x19, 0x10, 0xa8, 0x03, 0x00, 0x00, 0x29, 0x08, 0x70, 0x10, + 0x80, 0x00, 0x70, 0x12, 0x70, 0x18, 0x90, 0x4d, 0x71, 0x1a, 0x01, 0x10, + 0xa9, 0x02, 0x00, 0x08, 0x71, 0x1e, 0x21, 0x48, 0xa8, 0x04, 0x90, 0x0d, + 0x11, 0x28, 0x1e, 0x04, 0x71, 0xf1, 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, + 0x20, 0x71, 0x18, 0x00, 0x90, 0x16, 0x70, 0x2c, 0x21, 0x48, 0xa9, 0x04, + 0xa8, 0x02, 0x82, 0x10, 0x29, 0x00, 0x81, 0xff, 0x1d, 0xc8, 0x70, 0x2e, + 0x70, 0xc0, 0x92, 0x00, 0x70, 0xc2, 0x08, 0x0c, 0x88, 0x99, 0x0e, 0x04, + 0x71, 0xdb, 0x20, 0x71, 0x19, 0x10, 0x70, 0x1c, 0x20, 0x48, 0xa8, 0x4c, + 0x90, 0x0d, 0x0d, 0x18, 0x20, 0x71, 0x00, 0x00, 0x71, 0x82, 0xa8, 0x50, + 0x70, 0x32, 0xa8, 0x6c, 0x70, 0x86, 0x70, 0x36, 0xa8, 0x70, 0x70, 0x8a, + 0xa8, 0x50, 0x90, 0x82, 0x00, 0x19, 0x12, 0x78, 0x20, 0x91, 0x40, 0x80, + 0x20, 0x01, 0x00, 0x89, 0x20, 0x04, 0xd0, 0x84, 0x19, 0x0c, 0x12, 0x00, + 0x20, 0x71, 0x19, 0x10, 0x08, 0x0c, 0x73, 0x6e, 0x00, 0x2e, 0x00, 0xee, + 0x00, 0x05, 0xa8, 0x50, 0x90, 0x82, 0x00, 0x1c, 0x1e, 0x68, 0xa8, 0x80, + 0x70, 0x8e, 0x70, 0x36, 0x01, 0x46, 0x01, 0xd6, 0x01, 0x36, 0x01, 0xc6, + 0x01, 0x56, 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, 0x00, 0x2a, 0xa8, 0x68, + 0x20, 0xa8, 0xa8, 0x60, 0x20, 0xe0, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x21, + 0x20, 0x98, 0x40, 0x03, 0x01, 0x5e, 0x01, 0xce, 0x01, 0x3e, 0x01, 0xde, + 0x01, 0x4e, 0x08, 0x90, 0x20, 0x71, 0x19, 0x10, 0xa8, 0x03, 0x00, 0x00, + 0x29, 0x08, 0x70, 0x10, 0x80, 0x00, 0x70, 0x12, 0x70, 0x18, 0x90, 0x4d, + 0x71, 0x1a, 0x01, 0x10, 0xa9, 0x02, 0x00, 0x08, 0x71, 0x1e, 0x21, 0x48, + 0xa8, 0x04, 0x90, 0x0d, 0x11, 0x18, 0x00, 0x2e, 0x00, 0xee, 0x00, 0x05, + 0x20, 0x71, 0x18, 0x00, 0x90, 0x16, 0x70, 0x2c, 0x21, 0x48, 0xa9, 0x04, + 0xa8, 0x02, 0x82, 0x10, 0x29, 0x00, 0x81, 0xff, 0x1d, 0xc8, 0x70, 0x2e, + 0x70, 0xc0, 0x92, 0x00, 0x70, 0xc2, 0x08, 0x0c, 0x88, 0x99, 0x00, 0x2e, + 0x00, 0xee, 0x00, 0x05, 0x00, 0x06, 0xa8, 0x7c, 0x00, 0x06, 0xa8, 0x67, + 0x01, 0x03, 0x20, 0xa9, 0x00, 0x1c, 0xa8, 0x60, 0x20, 0xe8, 0xa8, 0x5c, + 0x90, 0x80, 0x00, 0x1d, 0x20, 0xa0, 0x90, 0x06, 0x40, 0x04, 0x00, 0x0e, + 0x90, 0x84, 0x00, 0xff, 0xa8, 0x7e, 0x00, 0x0e, 0xa8, 0x7a, 0xa9, 0x82, + 0x00, 0x05, 0x20, 0x71, 0x19, 0x10, 0x70, 0x04, 0x00, 0x02, 0x72, 0x81, + 0x72, 0x82, 0x73, 0x6d, 0x72, 0x82, 0x72, 0x7f, 0x73, 0x6d, 0x08, 0x0c, + 0x0d, 0x85, 0x00, 0x05, 0x20, 0x01, 0x19, 0x48, 0x20, 0x04, 0x00, 0x02, + 0x72, 0x8c, 0x72, 0x8c, 0x73, 0x06, 0x73, 0x07, 0x72, 0x8c, 0x73, 0x07, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x1e, 0x0c, 0x73, 0x8d, 0x70, 0x1c, + 0x90, 0x4d, 0x05, 0x08, 0xa8, 0x4c, 0x90, 0x05, 0x09, 0x04, 0x72, 0xd7, + 0x0e, 0x04, 0x72, 0xb5, 0xa9, 0x4c, 0x20, 0x71, 0x00, 0x00, 0x71, 0x82, + 0xa8, 0x50, 0x70, 0x32, 0xa8, 0x6c, 0x70, 0x86, 0x70, 0x36, 0xa8, 0x70, + 0x70, 0x8a, 0xa8, 0x50, 0x90, 0x82, 0x00, 0x19, 0x12, 0x78, 0x20, 0x91, + 0x40, 0x80, 0x20, 0x01, 0x00, 0x89, 0x20, 0x04, 0xd0, 0x84, 0x19, 0x0c, + 0x12, 0x00, 0x20, 0x71, 0x19, 0x10, 0x08, 0x0c, 0x73, 0x6e, 0x01, 0x2e, + 0x08, 0x04, 0x73, 0x05, 0xa8, 0x50, 0x90, 0x82, 0x00, 0x1c, 0x1e, 0x68, + 0xa8, 0x80, 0x70, 0x8e, 0x70, 0x36, 0x01, 0x46, 0x01, 0xd6, 0x01, 0x36, + 0x01, 0xc6, 0x01, 0x56, 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, 0x00, 0x2a, + 0xa8, 0x68, 0x20, 0xa8, 0xa8, 0x60, 0x20, 0xe0, 0xa8, 0x5c, 0x90, 0x80, + 0x00, 0x21, 0x20, 0x98, 0x40, 0x03, 0x01, 0x5e, 0x01, 0xce, 0x01, 0x3e, + 0x01, 0xde, 0x01, 0x4e, 0x08, 0x90, 0x20, 0x01, 0x00, 0x5b, 0x20, 0x04, + 0x90, 0x94, 0x07, 0x80, 0x19, 0x0c, 0x73, 0x82, 0xd0, 0x9c, 0x20, 0x71, + 0x19, 0x10, 0x15, 0x10, 0x20, 0x71, 0x19, 0x10, 0x70, 0x0f, 0x00, 0x01, + 0xa9, 0x64, 0x91, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x03, 0x11, 0x30, + 0x81, 0x0f, 0x91, 0x8c, 0x00, 0xff, 0x81, 0x01, 0x01, 0x08, 0x71, 0x0e, + 0x29, 0x00, 0x00, 0xd6, 0x20, 0x69, 0x00, 0x50, 0x68, 0x22, 0x00, 0xde, + 0x20, 0x71, 0x19, 0x10, 0x70, 0x1c, 0x20, 0x48, 0x70, 0x10, 0x80, 0x01, + 0x70, 0x12, 0xa8, 0x00, 0x70, 0x1e, 0x90, 0x05, 0x11, 0x08, 0x70, 0x1a, + 0x01, 0x2e, 0x00, 0x05, 0x00, 0x05, 0x00, 0xd6, 0x20, 0x08, 0x20, 0x69, + 0x1a, 0x04, 0x68, 0x44, 0x90, 0x05, 0x07, 0x60, 0x01, 0x58, 0x91, 0x86, + 0x00, 0x03, 0x05, 0x40, 0x20, 0x01, 0x18, 0x15, 0x20, 0x04, 0x20, 0x09, + 0x1b, 0x73, 0x21, 0x0c, 0x91, 0x02, 0x15, 0x00, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x69, 0x00, 0x50, 0x69, 0x3c, 0x68, 0x38, 0x91, 0x06, + 0x01, 0x90, 0x0e, 0x04, 0x73, 0x39, 0x20, 0x69, 0x00, 0x00, 0x68, 0x37, + 0x80, 0x40, 0x68, 0x33, 0x00, 0x12, 0x68, 0x83, 0x80, 0x40, 0x20, 0x91, + 0x40, 0x80, 0x20, 0x01, 0x00, 0x89, 0x20, 0x04, 0xd0, 0x84, 0x19, 0x0c, + 0x12, 0x00, 0x20, 0x69, 0x1a, 0x04, 0x68, 0x47, 0xff, 0xff, 0x01, 0x2e, + 0x00, 0xde, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x1e, 0x0c, 0x73, 0xfd, + 0x70, 0x1c, 0x90, 0x4d, 0x05, 0x40, 0x20, 0x01, 0x00, 0x5b, 0x20, 0x04, + 0x90, 0x94, 0x07, 0x80, 0x15, 0xc9, 0xd0, 0x9c, 0x15, 0x00, 0x20, 0x71, + 0x19, 0x10, 0x70, 0x0f, 0x00, 0x01, 0xa9, 0x64, 0x91, 0x84, 0x00, 0xff, + 0x90, 0x86, 0x00, 0x03, 0x11, 0x30, 0x81, 0x0f, 0x91, 0x8c, 0x00, 0xff, + 0x81, 0x01, 0x01, 0x08, 0x71, 0x0e, 0x29, 0x00, 0x00, 0xd6, 0x20, 0x69, + 0x00, 0x50, 0x68, 0x22, 0x00, 0xde, 0x70, 0x1c, 0x20, 0x48, 0x70, 0x10, + 0x80, 0x01, 0x70, 0x12, 0xa8, 0x00, 0x70, 0x1e, 0x90, 0x05, 0x11, 0x08, + 0x70, 0x1a, 0x01, 0x2e, 0x00, 0x05, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x70, 0x1c, 0x90, 0x4d, 0x01, 0x60, 0x70, 0x10, 0x80, 0x01, + 0x70, 0x12, 0xa8, 0x00, 0x70, 0x1e, 0x90, 0x05, 0x11, 0x08, 0x70, 0x1a, + 0x01, 0x2e, 0x08, 0x0c, 0x10, 0x8b, 0x00, 0x05, 0x01, 0x2e, 0x00, 0x05, + 0x20, 0x91, 0x80, 0x00, 0x0e, 0x04, 0x73, 0x84, 0x00, 0x06, 0x00, 0x16, + 0x20, 0x01, 0x80, 0x04, 0x00, 0x06, 0x08, 0x04, 0x0d, 0x8e, 0x00, 0x96, + 0x00, 0xf6, 0x20, 0x79, 0x00, 0x50, 0x70, 0x44, 0xd0, 0x84, 0x01, 0xd0, + 0xc0, 0x84, 0x70, 0x46, 0x78, 0x38, 0x79, 0x38, 0x91, 0x0e, 0x1d, 0xe0, + 0x00, 0xd6, 0x20, 0x69, 0x00, 0x00, 0x68, 0x36, 0x68, 0x33, 0x00, 0x13, + 0x00, 0xde, 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, 0x00, 0x89, 0x20, 0x04, + 0xd0, 0x84, 0x19, 0x0c, 0x12, 0x00, 0x70, 0x4b, 0x00, 0x00, 0x00, 0xfe, + 0x00, 0x9e, 0x00, 0x05, 0x78, 0x2c, 0x90, 0x94, 0x07, 0x80, 0x19, 0x81, + 0xd0, 0xa4, 0x0d, 0xb8, 0x71, 0x48, 0x70, 0x4c, 0x81, 0x08, 0x71, 0x4a, + 0x91, 0x02, 0x0e, 0x88, 0x00, 0xe6, 0x20, 0x71, 0x18, 0x00, 0x78, 0x24, + 0x00, 0xe6, 0x20, 0x71, 0x00, 0x40, 0x71, 0x2c, 0xd1, 0x9c, 0x11, 0x70, + 0x20, 0x09, 0x18, 0x30, 0x21, 0x0c, 0x91, 0x8a, 0x00, 0x20, 0x02, 0x40, + 0x70, 0x22, 0x20, 0x01, 0x1d, 0xc0, 0x20, 0x0c, 0x81, 0x08, 0x21, 0x02, + 0x00, 0xee, 0x00, 0x58, 0x00, 0xee, 0x20, 0x48, 0x70, 0x2c, 0xa8, 0x02, + 0x29, 0x00, 0x70, 0x2e, 0x70, 0xc0, 0x80, 0x00, 0x70, 0xc2, 0x08, 0x0c, + 0x88, 0x99, 0x78, 0x2c, 0x90, 0x94, 0x07, 0x80, 0x19, 0x0c, 0x73, 0x82, + 0xd0, 0xa4, 0x19, 0xc8, 0x78, 0x38, 0x79, 0x38, 0x91, 0x0e, 0x1d, 0xe0, + 0x00, 0xd6, 0x20, 0x69, 0x00, 0x00, 0x68, 0x36, 0x68, 0x33, 0x00, 0x13, + 0x00, 0xde, 0x20, 0x91, 0x40, 0x80, 0x20, 0x01, 0x00, 0x89, 0x20, 0x04, + 0xd0, 0x84, 0x19, 0x0c, 0x12, 0x00, 0x00, 0xee, 0x70, 0x4b, 0x00, 0x00, + 0x00, 0xfe, 0x00, 0x9e, 0x00, 0x05, 0x00, 0xf6, 0x20, 0x79, 0x00, 0x50, + 0x70, 0x44, 0xd0, 0x84, 0x01, 0xb8, 0xc0, 0x84, 0x70, 0x46, 0x78, 0x38, + 0x79, 0x38, 0x91, 0x0e, 0x1d, 0xe0, 0x00, 0xd6, 0x20, 0x69, 0x00, 0x00, + 0x68, 0x36, 0x68, 0x33, 0x00, 0x13, 0x00, 0xde, 0x20, 0x91, 0x40, 0x80, + 0x20, 0x01, 0x00, 0x89, 0x20, 0x04, 0xd0, 0x84, 0x19, 0x0c, 0x12, 0x00, + 0x00, 0xfe, 0x00, 0x05, 0x78, 0x2c, 0x90, 0x94, 0x07, 0x80, 0x19, 0x0c, + 0x73, 0x82, 0xd0, 0xa4, 0x0d, 0xb8, 0x00, 0xe6, 0x20, 0x71, 0x18, 0x00, + 0x78, 0x24, 0x20, 0x48, 0x70, 0x2c, 0xa8, 0x02, 0x29, 0x00, 0x70, 0x2e, + 0x70, 0xc0, 0x80, 0x00, 0x70, 0xc2, 0x08, 0x0c, 0x88, 0x99, 0x78, 0x2c, + 0x90, 0x94, 0x07, 0x80, 0x19, 0x0c, 0x73, 0x82, 0xd0, 0xa4, 0x1d, 0x70, + 0x00, 0xd6, 0x20, 0x69, 0x00, 0x50, 0x69, 0x3c, 0x20, 0x69, 0x19, 0x48, + 0x68, 0x08, 0x69, 0x0a, 0x20, 0x69, 0x1a, 0x04, 0x91, 0x02, 0x11, 0x18, + 0x68, 0x44, 0x90, 0x05, 0x13, 0x20, 0x20, 0x01, 0x19, 0x49, 0x20, 0x0c, + 0x69, 0x46, 0x00, 0xde, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, 0x70, 0x98, + 0x90, 0x8a, 0x00, 0x2a, 0x1a, 0x0c, 0x0d, 0x85, 0x90, 0x82, 0x00, 0x1d, + 0x00, 0x3b, 0x00, 0x26, 0x20, 0x11, 0x1e, 0x00, 0x08, 0x0c, 0x2a, 0xd3, + 0x00, 0x2e, 0x00, 0x05, 0x75, 0x42, 0x74, 0xaf, 0x74, 0xcb, 0x74, 0xf5, + 0x75, 0x31, 0x75, 0x71, 0x75, 0x83, 0x74, 0xcb, 0x75, 0x59, 0x74, 0x6a, + 0x74, 0x98, 0x75, 0x1b, 0x74, 0x69, 0x00, 0x05, 0x00, 0xd6, 0x20, 0x69, + 0x02, 0x00, 0x68, 0x04, 0x90, 0x05, 0x11, 0x80, 0x68, 0x08, 0x90, 0x05, + 0x15, 0x18, 0x70, 0x9b, 0x00, 0x29, 0x20, 0x69, 0x19, 0x8f, 0x2d, 0x04, + 0x70, 0x02, 0x08, 0x0c, 0x78, 0xe4, 0x60, 0x28, 0x90, 0x85, 0x06, 0x00, + 0x60, 0x2a, 0x00, 0xb0, 0x70, 0x9b, 0x00, 0x29, 0x20, 0x69, 0x19, 0x8f, + 0x2d, 0x04, 0x70, 0x02, 0x60, 0x28, 0x90, 0x85, 0x06, 0x00, 0x60, 0x2a, + 0x00, 0xe6, 0x00, 0x36, 0x00, 0x46, 0x00, 0x56, 0x20, 0x71, 0x1a, 0x6e, + 0x08, 0x0c, 0x1b, 0x1e, 0x00, 0x5e, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0xee, + 0x00, 0xde, 0x00, 0x05, 0x00, 0xd6, 0x20, 0x69, 0x02, 0x00, 0x68, 0x04, + 0x90, 0x05, 0x11, 0x78, 0x68, 0x08, 0x90, 0x05, 0x11, 0x60, 0x70, 0x9b, + 0x00, 0x29, 0x20, 0x69, 0x19, 0x8f, 0x2d, 0x04, 0x70, 0x02, 0x08, 0x0c, + 0x79, 0x90, 0x60, 0x28, 0x90, 0x85, 0x06, 0x00, 0x60, 0x2a, 0x00, 0xde, + 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0x00, 0x90, 0x08, 0x0c, 0x2a, 0x99, + 0x00, 0x0e, 0x61, 0x24, 0xd1, 0xe4, 0x11, 0x90, 0x08, 0x0c, 0x75, 0xf4, + 0xd1, 0xd4, 0x11, 0x60, 0xd1, 0xdc, 0x11, 0x38, 0xd1, 0xcc, 0x01, 0x50, + 0x70, 0x9b, 0x00, 0x20, 0x08, 0x0c, 0x75, 0xf4, 0x00, 0x28, 0x70, 0x9b, + 0x00, 0x1d, 0x00, 0x10, 0x70, 0x9b, 0x00, 0x1f, 0x00, 0x05, 0x20, 0x01, + 0x00, 0x88, 0x08, 0x0c, 0x2a, 0x99, 0x61, 0x24, 0xd1, 0xcc, 0x11, 0xe8, + 0xd1, 0xdc, 0x11, 0xc0, 0xd1, 0xe4, 0x11, 0x98, 0x91, 0x84, 0x1e, 0x00, + 0x11, 0xd8, 0x08, 0x0c, 0x1b, 0x4b, 0x60, 0xe3, 0x00, 0x01, 0x60, 0x0c, + 0xc0, 0xb4, 0x60, 0x0e, 0x08, 0x0c, 0x77, 0xca, 0x20, 0x01, 0x00, 0x80, + 0x08, 0x0c, 0x2a, 0x99, 0x70, 0x9b, 0x00, 0x29, 0x00, 0x58, 0x70, 0x9b, + 0x00, 0x1e, 0x00, 0x40, 0x70, 0x9b, 0x00, 0x1d, 0x00, 0x28, 0x70, 0x9b, + 0x00, 0x20, 0x00, 0x10, 0x70, 0x9b, 0x00, 0x1f, 0x00, 0x05, 0x08, 0x0c, + 0x1b, 0x4b, 0x60, 0xe3, 0x00, 0x01, 0x60, 0x0c, 0xc0, 0xb4, 0x60, 0x0e, + 0x08, 0x0c, 0x77, 0xca, 0x20, 0x01, 0x00, 0x80, 0x08, 0x0c, 0x2a, 0x99, + 0x61, 0x24, 0xd1, 0xd4, 0x11, 0x98, 0xd1, 0xdc, 0x11, 0x70, 0xd1, 0xe4, + 0x11, 0x48, 0x91, 0x84, 0x1e, 0x00, 0x11, 0x18, 0x70, 0x9b, 0x00, 0x29, + 0x00, 0x58, 0x70, 0x9b, 0x00, 0x28, 0x00, 0x40, 0x70, 0x9b, 0x00, 0x1e, + 0x00, 0x28, 0x70, 0x9b, 0x00, 0x1d, 0x00, 0x10, 0x70, 0x9b, 0x00, 0x1f, + 0x00, 0x05, 0x61, 0x24, 0xd1, 0xd4, 0x11, 0x80, 0xd1, 0xdc, 0x11, 0x58, + 0xd1, 0xe4, 0x11, 0x30, 0x91, 0x84, 0x1e, 0x00, 0x11, 0x58, 0x70, 0x9b, + 0x00, 0x29, 0x00, 0x40, 0x70, 0x9b, 0x00, 0x1e, 0x00, 0x28, 0x70, 0x9b, + 0x00, 0x1d, 0x00, 0x10, 0x70, 0x9b, 0x00, 0x1f, 0x00, 0x05, 0x20, 0x01, + 0x00, 0xa0, 0x08, 0x0c, 0x2a, 0x99, 0x61, 0x24, 0xd1, 0xdc, 0x11, 0x38, + 0xd1, 0xe4, 0x01, 0x38, 0x08, 0x0c, 0x1b, 0x4b, 0x70, 0x9b, 0x00, 0x1e, + 0x00, 0x10, 0x70, 0x9b, 0x00, 0x1d, 0x00, 0x05, 0x08, 0x0c, 0x76, 0x7d, + 0x61, 0x24, 0xd1, 0xdc, 0x11, 0x88, 0x08, 0x0c, 0x75, 0xf4, 0x00, 0x16, + 0x08, 0x0c, 0x1b, 0x4b, 0x00, 0x1e, 0xd1, 0xd4, 0x11, 0x28, 0xd1, 0xe4, + 0x01, 0x38, 0x70, 0x9b, 0x00, 0x1e, 0x00, 0x20, 0x70, 0x9b, 0x00, 0x1f, + 0x08, 0x0c, 0x75, 0xf4, 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0x00, 0xa0, + 0x08, 0x0c, 0x2a, 0x99, 0x00, 0x0e, 0x61, 0x24, 0xd1, 0xd4, 0x11, 0x60, + 0xd1, 0xcc, 0x11, 0x50, 0xd1, 0xdc, 0x11, 0x28, 0xd1, 0xe4, 0x01, 0x40, + 0x70, 0x9b, 0x00, 0x1e, 0x00, 0x28, 0x70, 0x9b, 0x00, 0x1d, 0x00, 0x10, + 0x70, 0x9b, 0x00, 0x21, 0x00, 0x05, 0x08, 0x0c, 0x76, 0x7d, 0x61, 0x24, + 0xd1, 0xd4, 0x11, 0x50, 0xd1, 0xdc, 0x11, 0x28, 0xd1, 0xe4, 0x01, 0x40, + 0x70, 0x9b, 0x00, 0x1e, 0x00, 0x28, 0x70, 0x9b, 0x00, 0x1d, 0x00, 0x10, + 0x70, 0x9b, 0x00, 0x1f, 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0x00, 0x90, + 0x08, 0x0c, 0x2a, 0x99, 0x00, 0x0e, 0x61, 0x24, 0xd1, 0xd4, 0x11, 0x78, + 0xd1, 0xcc, 0x11, 0x50, 0xd1, 0xdc, 0x11, 0x28, 0xd1, 0xe4, 0x01, 0x58, + 0x70, 0x9b, 0x00, 0x1e, 0x00, 0x40, 0x70, 0x9b, 0x00, 0x1d, 0x00, 0x28, + 0x70, 0x9b, 0x00, 0x20, 0x00, 0x10, 0x70, 0x9b, 0x00, 0x1f, 0x00, 0x05, + 0x00, 0x16, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x01, 0x26, 0x20, 0x61, + 0x01, 0x00, 0x20, 0x69, 0x01, 0x40, 0x20, 0x71, 0x18, 0x00, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0x77, 0x9e, 0x11, 0xf8, 0x20, 0x01, 0x18, 0x0c, + 0x20, 0x0c, 0xd1, 0xb4, 0x01, 0xd0, 0xc1, 0xb4, 0x21, 0x02, 0x00, 0x26, + 0x20, 0x11, 0x02, 0x00, 0x08, 0x0c, 0x2a, 0xd3, 0x00, 0x2e, 0x08, 0x0c, + 0x2a, 0x7f, 0x60, 0x24, 0xd0, 0xcc, 0x01, 0x48, 0x20, 0x01, 0x00, 0xa0, + 0x08, 0x0c, 0x2a, 0x99, 0x08, 0x0c, 0x7a, 0xb6, 0x08, 0x0c, 0x61, 0x9d, + 0x04, 0x28, 0x60, 0x28, 0xc0, 0xcd, 0x60, 0x2a, 0x04, 0x08, 0x08, 0x0c, + 0x77, 0xb8, 0x01, 0x50, 0x08, 0x0c, 0x77, 0xaf, 0x11, 0x38, 0x20, 0x01, + 0x00, 0x01, 0x08, 0x0c, 0x26, 0x31, 0x08, 0x0c, 0x77, 0x72, 0x00, 0xa0, + 0x08, 0x0c, 0x76, 0x7a, 0x01, 0x78, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, + 0x26, 0x31, 0x70, 0x98, 0x90, 0x86, 0x00, 0x1e, 0x01, 0x20, 0x70, 0x98, + 0x90, 0x86, 0x00, 0x22, 0x11, 0x18, 0x70, 0x9b, 0x00, 0x25, 0x00, 0x10, + 0x70, 0x9b, 0x00, 0x21, 0x01, 0x2e, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, + 0x00, 0x1e, 0x00, 0x05, 0x00, 0x26, 0x20, 0x11, 0x76, 0x05, 0x08, 0x0c, + 0x8a, 0x9f, 0x00, 0x2e, 0x00, 0x16, 0x00, 0x26, 0x20, 0x09, 0x00, 0x64, + 0x20, 0x11, 0x76, 0x05, 0x08, 0x0c, 0x8a, 0x96, 0x00, 0x2e, 0x00, 0x1e, + 0x00, 0x05, 0x00, 0xe6, 0x00, 0xf6, 0x00, 0x16, 0x08, 0x0c, 0xa2, 0xa0, + 0x20, 0x71, 0x18, 0x00, 0x08, 0x0c, 0x75, 0x9e, 0x00, 0x1e, 0x00, 0xfe, + 0x00, 0xee, 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x00, 0xc6, + 0x00, 0xd6, 0x00, 0xe6, 0x00, 0xf6, 0x01, 0x26, 0x20, 0x71, 0x18, 0x00, + 0x08, 0x0c, 0xa2, 0xa0, 0x20, 0x61, 0x01, 0x00, 0x20, 0x69, 0x01, 0x40, + 0x20, 0x91, 0x80, 0x00, 0x60, 0x28, 0xc0, 0x9c, 0x60, 0x2a, 0x08, 0x0c, + 0xac, 0xfc, 0x20, 0x11, 0x00, 0x03, 0x08, 0x0c, 0xa6, 0x2b, 0x20, 0x11, + 0x00, 0x02, 0x08, 0x0c, 0xa6, 0x35, 0x08, 0x0c, 0xa5, 0x16, 0x08, 0x0c, + 0x8a, 0x4b, 0x00, 0x36, 0x90, 0x1e, 0x08, 0x0c, 0xa5, 0x96, 0x00, 0x3e, + 0x08, 0x0c, 0xad, 0x18, 0x60, 0xe3, 0x00, 0x00, 0x08, 0x0c, 0xee, 0xd9, + 0x08, 0x0c, 0xee, 0xf4, 0x20, 0x09, 0x00, 0x04, 0x08, 0x0c, 0x2a, 0x85, + 0x08, 0x0c, 0x29, 0x9b, 0x20, 0x01, 0x18, 0x00, 0x20, 0x03, 0x00, 0x04, + 0x20, 0x11, 0x00, 0x08, 0x08, 0x0c, 0x2a, 0xd3, 0x20, 0x11, 0x76, 0x05, + 0x08, 0x0c, 0x8a, 0x9f, 0x08, 0x0c, 0x77, 0xb8, 0x01, 0x18, 0x90, 0x06, + 0x08, 0x0c, 0x2a, 0x99, 0x08, 0x0c, 0x0b, 0xcf, 0x20, 0x01, 0x00, 0x01, + 0x08, 0x0c, 0x26, 0x31, 0x01, 0x2e, 0x00, 0xfe, 0x00, 0xee, 0x00, 0xde, + 0x00, 0xce, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0x26, + 0x00, 0xe6, 0x20, 0x11, 0x76, 0x12, 0x20, 0x71, 0x1a, 0x04, 0x70, 0x1c, + 0x92, 0x06, 0x11, 0x18, 0x70, 0x18, 0x90, 0x05, 0x01, 0x10, 0x90, 0x85, + 0x00, 0x01, 0x00, 0xee, 0x00, 0x2e, 0x00, 0x05, 0x60, 0x20, 0xd0, 0x9c, + 0x00, 0x05, 0x68, 0x00, 0x90, 0x84, 0xff, 0xfe, 0x90, 0x86, 0x00, 0xc0, + 0x01, 0xb8, 0x20, 0x01, 0x00, 0xc0, 0x08, 0x0c, 0x2a, 0x99, 0x01, 0x56, + 0x20, 0xa9, 0x00, 0x2d, 0x1d, 0x04, 0x76, 0x8a, 0x20, 0x91, 0x60, 0x00, + 0x1f, 0x04, 0x76, 0x8a, 0x01, 0x5e, 0x00, 0xd6, 0x20, 0x69, 0x18, 0x00, + 0x68, 0x9c, 0x80, 0x01, 0x02, 0x20, 0x01, 0x18, 0x68, 0x9e, 0x00, 0xde, + 0x00, 0x05, 0x68, 0x9f, 0x00, 0x14, 0x68, 0xec, 0xd0, 0xdc, 0x0d, 0xc8, + 0x68, 0x00, 0x90, 0x86, 0x00, 0x01, 0x1d, 0xa8, 0x08, 0x0c, 0x8a, 0xab, + 0x0c, 0x90, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x20, 0x61, 0x01, 0x00, + 0x20, 0x69, 0x01, 0x40, 0x20, 0x71, 0x18, 0x00, 0x08, 0x0c, 0x7a, 0xc5, + 0x20, 0x01, 0x19, 0x6d, 0x20, 0x03, 0x00, 0x00, 0x90, 0x06, 0x70, 0x9a, + 0x60, 0xe2, 0x68, 0x86, 0x08, 0x0c, 0x27, 0x00, 0x90, 0x06, 0x08, 0x0c, + 0x2a, 0x99, 0x08, 0x0c, 0x60, 0x58, 0x00, 0x26, 0x20, 0x11, 0xff, 0xff, + 0x08, 0x0c, 0x2a, 0xd3, 0x00, 0x2e, 0x60, 0x2b, 0x18, 0x2c, 0x00, 0xee, + 0x00, 0xde, 0x00, 0xce, 0x00, 0x05, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, + 0x20, 0x61, 0x01, 0x00, 0x20, 0x69, 0x01, 0x40, 0x20, 0x71, 0x18, 0x00, + 0x20, 0x01, 0x19, 0x7d, 0x20, 0x0c, 0x91, 0x86, 0x00, 0x00, 0x01, 0x58, + 0x91, 0x86, 0x00, 0x01, 0x01, 0x58, 0x91, 0x86, 0x00, 0x02, 0x01, 0x58, + 0x91, 0x86, 0x00, 0x03, 0x01, 0x58, 0x08, 0x04, 0x77, 0x62, 0x70, 0x9b, + 0x00, 0x22, 0x00, 0x40, 0x70, 0x9b, 0x00, 0x21, 0x00, 0x28, 0x70, 0x9b, + 0x00, 0x23, 0x00, 0x10, 0x70, 0x9b, 0x00, 0x24, 0x60, 0xe3, 0x00, 0x00, + 0x68, 0x87, 0x00, 0x01, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x27, 0x00, + 0x08, 0x0c, 0xac, 0xfc, 0x00, 0x26, 0x08, 0x0c, 0xaf, 0xd2, 0x08, 0x0c, + 0xb0, 0x9b, 0x00, 0x2e, 0x08, 0x0c, 0xad, 0x18, 0x70, 0x00, 0x90, 0x8e, + 0x00, 0x04, 0x01, 0x18, 0x60, 0x2b, 0x00, 0x28, 0x00, 0x10, 0x60, 0x2b, + 0x00, 0x20, 0x01, 0x56, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0xa9, + 0x00, 0x05, 0x60, 0x24, 0xd0, 0xac, 0x01, 0x50, 0x01, 0x2e, 0x01, 0x5e, + 0x08, 0x0c, 0xd6, 0x45, 0x01, 0x18, 0x90, 0x06, 0x08, 0x0c, 0x2a, 0xc3, + 0x08, 0x04, 0x77, 0x6e, 0x68, 0x00, 0x90, 0x84, 0x00, 0xa1, 0xc0, 0xbd, + 0x68, 0x02, 0x08, 0x0c, 0x2a, 0x7f, 0x69, 0x04, 0xd1, 0xd4, 0x11, 0x40, + 0x20, 0x01, 0x01, 0x00, 0x08, 0x0c, 0x2a, 0x99, 0x1f, 0x04, 0x77, 0x13, + 0x08, 0x0c, 0x77, 0xf2, 0x01, 0x2e, 0x01, 0x5e, 0x08, 0x0c, 0x77, 0xaf, + 0x01, 0x70, 0x60, 0x44, 0x90, 0x05, 0x01, 0x30, 0x08, 0x0c, 0x77, 0xf2, + 0x90, 0x06, 0x80, 0x01, 0x1d, 0xf0, 0x00, 0x28, 0x68, 0x04, 0xd0, 0xd4, + 0x11, 0x10, 0x08, 0x0c, 0x77, 0xf2, 0x08, 0x0c, 0xd6, 0x45, 0x01, 0x18, + 0x90, 0x06, 0x08, 0x0c, 0x2a, 0xc3, 0x00, 0x16, 0x00, 0x26, 0x70, 0x00, + 0x90, 0x8e, 0x00, 0x04, 0x01, 0x30, 0x20, 0x09, 0x00, 0xc8, 0x20, 0x11, + 0x76, 0x12, 0x08, 0x0c, 0x8a, 0x5d, 0x00, 0x2e, 0x00, 0x1e, 0x08, 0x0c, + 0x88, 0x90, 0x70, 0x34, 0xc0, 0x85, 0x70, 0x36, 0x20, 0x01, 0x19, 0x7d, + 0x20, 0x03, 0x00, 0x04, 0x08, 0x0c, 0x74, 0x4d, 0x08, 0x0c, 0x77, 0xaf, + 0x01, 0x38, 0x68, 0x04, 0xd0, 0xd4, 0x11, 0x20, 0xd0, 0xdc, 0x11, 0x00, + 0x08, 0x0c, 0x7a, 0xbb, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x00, 0x05, + 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x20, 0x61, 0x01, 0x00, 0x20, 0x69, + 0x01, 0x40, 0x20, 0x71, 0x18, 0x00, 0x08, 0x0c, 0x88, 0xa7, 0x08, 0x0c, + 0x88, 0x99, 0x08, 0x0c, 0x7a, 0xc5, 0x20, 0x01, 0x19, 0x6d, 0x20, 0x03, + 0x00, 0x00, 0x90, 0x06, 0x70, 0x9a, 0x60, 0xe2, 0x68, 0x86, 0x08, 0x0c, + 0x27, 0x00, 0x90, 0x06, 0x08, 0x0c, 0x2a, 0x99, 0x60, 0x43, 0x00, 0x90, + 0x60, 0x43, 0x00, 0x10, 0x00, 0x26, 0x20, 0x11, 0xff, 0xff, 0x08, 0x0c, + 0x2a, 0xd3, 0x00, 0x2e, 0x60, 0x2b, 0x18, 0x2c, 0x00, 0xee, 0x00, 0xde, + 0x00, 0xce, 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0x19, 0x7c, 0x20, 0x04, + 0x90, 0x86, 0xaa, 0xaa, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, 0x08, 0x0c, + 0x58, 0x44, 0x90, 0x84, 0x00, 0x30, 0x90, 0x86, 0x00, 0x00, 0x00, 0x0e, + 0x00, 0x05, 0x00, 0x06, 0x08, 0x0c, 0x58, 0x44, 0x90, 0x84, 0x00, 0x30, + 0x90, 0x86, 0x00, 0x30, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, 0x08, 0x0c, + 0x58, 0x44, 0x90, 0x84, 0x00, 0x30, 0x90, 0x86, 0x00, 0x10, 0x00, 0x0e, + 0x00, 0x05, 0x00, 0x06, 0x08, 0x0c, 0x58, 0x44, 0x90, 0x84, 0x00, 0x30, + 0x90, 0x86, 0x00, 0x20, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x36, 0x00, 0x16, + 0x20, 0x01, 0x18, 0x0c, 0x20, 0x04, 0x90, 0x8c, 0x00, 0x13, 0x01, 0x68, + 0x00, 0x20, 0x08, 0x0c, 0x27, 0x20, 0x90, 0x0e, 0x00, 0x10, 0x20, 0x09, + 0x00, 0x02, 0x20, 0x19, 0x00, 0x28, 0x08, 0x0c, 0x32, 0xda, 0x90, 0x06, + 0x00, 0x19, 0x00, 0x1e, 0x00, 0x3e, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, + 0x18, 0x0c, 0x2e, 0x04, 0x01, 0x30, 0x08, 0x0c, 0xd6, 0x3e, 0x11, 0x28, + 0x90, 0x85, 0x00, 0x10, 0x00, 0x10, 0x90, 0x84, 0xff, 0xef, 0x20, 0x72, + 0x00, 0xee, 0x00, 0x05, 0x60, 0x50, 0x00, 0x06, 0x60, 0xec, 0x00, 0x06, + 0x60, 0x0c, 0x00, 0x06, 0x60, 0x04, 0x00, 0x06, 0x60, 0x28, 0x00, 0x06, + 0x08, 0x0c, 0x2a, 0xf6, 0x08, 0x0c, 0x2b, 0x29, 0x60, 0x2f, 0x01, 0x00, + 0x60, 0x2f, 0x00, 0x00, 0x60, 0x2f, 0x00, 0x40, 0x60, 0x2f, 0x00, 0x00, + 0x20, 0xa9, 0x00, 0x02, 0x08, 0x0c, 0x2a, 0x60, 0x00, 0x26, 0x20, 0x11, + 0x00, 0x40, 0x08, 0x0c, 0x2a, 0xd3, 0x00, 0x2e, 0x00, 0x0e, 0x60, 0x2a, + 0x00, 0x0e, 0x60, 0x06, 0x00, 0x0e, 0x60, 0x0e, 0x00, 0x0e, 0x60, 0xee, + 0x60, 0xe3, 0x00, 0x00, 0x68, 0x87, 0x00, 0x01, 0x20, 0x01, 0x00, 0x01, + 0x08, 0x0c, 0x27, 0x00, 0x20, 0x01, 0x00, 0xa0, 0x00, 0x06, 0x08, 0x0c, + 0xd6, 0x45, 0x00, 0x0e, 0x01, 0x30, 0x08, 0x0c, 0x2a, 0xb7, 0x90, 0x06, + 0x08, 0x0c, 0x2a, 0xc3, 0x00, 0x10, 0x08, 0x0c, 0x2a, 0x99, 0x00, 0x0e, + 0x60, 0x52, 0x60, 0x50, 0x00, 0x06, 0xc0, 0xe5, 0x60, 0x52, 0x00, 0xf6, + 0x20, 0x79, 0x01, 0x00, 0x08, 0x0c, 0x2a, 0x0c, 0x00, 0xfe, 0x00, 0x0e, + 0x60, 0x52, 0x00, 0x05, 0x01, 0x56, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, + 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x20, 0x61, 0x01, 0x00, 0x20, 0x69, + 0x01, 0x40, 0x20, 0x71, 0x18, 0x00, 0x08, 0x0c, 0xad, 0x5a, 0x01, 0x58, + 0x20, 0x01, 0x03, 0x86, 0x20, 0x04, 0xd0, 0xb4, 0x11, 0x30, 0x20, 0x01, + 0x00, 0x16, 0x08, 0x0c, 0xac, 0xed, 0x08, 0x04, 0x78, 0xd6, 0x20, 0x01, + 0x18, 0x0c, 0x20, 0x0c, 0xc1, 0xc4, 0x21, 0x02, 0x60, 0x28, 0x90, 0x84, + 0xe1, 0xff, 0x60, 0x2a, 0x20, 0x11, 0x02, 0x00, 0x08, 0x0c, 0x2a, 0xd3, + 0x20, 0x01, 0x00, 0x90, 0x08, 0x0c, 0x2a, 0x99, 0x20, 0xa9, 0x03, 0x66, + 0x60, 0x24, 0xd0, 0xcc, 0x15, 0x60, 0x1d, 0x04, 0x78, 0x6e, 0x20, 0x91, + 0x60, 0x00, 0x1f, 0x04, 0x78, 0x6e, 0x08, 0x0c, 0xac, 0xfc, 0x20, 0x11, + 0x00, 0x03, 0x08, 0x0c, 0xa6, 0x2b, 0x20, 0x11, 0x00, 0x02, 0x08, 0x0c, + 0xa6, 0x35, 0x08, 0x0c, 0xa5, 0x16, 0x90, 0x1e, 0x08, 0x0c, 0xa5, 0x96, + 0x20, 0x01, 0x03, 0x86, 0x20, 0x03, 0x70, 0x00, 0x08, 0x0c, 0xad, 0x18, + 0x20, 0x01, 0x00, 0xa0, 0x08, 0x0c, 0x2a, 0x99, 0x08, 0x0c, 0x7a, 0xb6, + 0x08, 0x0c, 0x61, 0x9d, 0x08, 0x0c, 0xd6, 0x45, 0x01, 0x10, 0x08, 0x0c, + 0x0c, 0xf1, 0x90, 0x85, 0x00, 0x01, 0x08, 0x04, 0x78, 0xdc, 0x08, 0x0c, + 0x1b, 0x4b, 0x60, 0xe3, 0x00, 0x00, 0x20, 0x01, 0x18, 0x0d, 0x20, 0x04, + 0xd0, 0x8c, 0x20, 0x01, 0x00, 0x02, 0x11, 0x18, 0x20, 0x01, 0x19, 0x6d, + 0x20, 0x04, 0x08, 0x0c, 0x27, 0x00, 0x60, 0xe2, 0x20, 0x01, 0x00, 0x80, + 0x08, 0x0c, 0x2a, 0x99, 0x20, 0xa9, 0x03, 0x66, 0x20, 0x11, 0x1e, 0x00, + 0x08, 0x0c, 0x2a, 0xd3, 0x20, 0x09, 0x1e, 0x00, 0x08, 0x0c, 0x2a, 0x7f, + 0x60, 0x24, 0x91, 0x0c, 0x01, 0x40, 0x1d, 0x04, 0x78, 0xb4, 0x20, 0x91, + 0x60, 0x00, 0x1f, 0x04, 0x78, 0xb4, 0x08, 0x04, 0x78, 0x77, 0x20, 0x01, + 0x03, 0x86, 0x20, 0x03, 0x70, 0x00, 0x60, 0x28, 0x90, 0x85, 0x1e, 0x00, + 0x60, 0x2a, 0x70, 0xb4, 0x90, 0x05, 0x11, 0x18, 0x68, 0x87, 0x00, 0x01, + 0x00, 0x08, 0x68, 0x86, 0x08, 0x0c, 0xd6, 0x45, 0x01, 0x10, 0x08, 0x0c, + 0x0c, 0xf1, 0x90, 0x06, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x00, 0x3e, + 0x00, 0x2e, 0x00, 0x1e, 0x01, 0x5e, 0x00, 0x05, 0x01, 0x56, 0x00, 0x16, + 0x00, 0x26, 0x00, 0x36, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x20, 0x61, + 0x01, 0x00, 0x20, 0x71, 0x18, 0x00, 0x70, 0x00, 0x90, 0x86, 0x00, 0x03, + 0x11, 0x68, 0x20, 0x01, 0x02, 0x0b, 0x20, 0x04, 0x90, 0x84, 0x55, 0x40, + 0x90, 0x86, 0x55, 0x40, 0x11, 0x28, 0x20, 0x69, 0x1a, 0x7b, 0x2d, 0x04, + 0x80, 0x00, 0x20, 0x6a, 0x20, 0x69, 0x01, 0x40, 0x60, 0x20, 0x90, 0x84, + 0x00, 0xc0, 0x01, 0x20, 0x68, 0x84, 0x90, 0x05, 0x19, 0x04, 0x79, 0x4d, + 0x20, 0x01, 0x00, 0x88, 0x08, 0x0c, 0x2a, 0x99, 0x90, 0x06, 0x60, 0xe2, + 0x68, 0x86, 0x08, 0x0c, 0x27, 0x00, 0x20, 0x69, 0x02, 0x00, 0x68, 0x04, + 0x90, 0x05, 0x11, 0x18, 0x68, 0x08, 0x90, 0x05, 0x01, 0xd0, 0x60, 0x28, + 0x90, 0x84, 0xfb, 0xff, 0x60, 0x2a, 0x20, 0x11, 0x04, 0x00, 0x08, 0x0c, + 0x2a, 0xd3, 0x20, 0x69, 0x19, 0x8f, 0x70, 0x00, 0x20, 0x6a, 0x70, 0x9b, + 0x00, 0x26, 0x70, 0x03, 0x00, 0x01, 0x20, 0xa9, 0x00, 0x02, 0x1d, 0x04, + 0x79, 0x2d, 0x20, 0x91, 0x60, 0x00, 0x1f, 0x04, 0x79, 0x2d, 0x08, 0x04, + 0x79, 0x88, 0x20, 0x69, 0x01, 0x40, 0x20, 0xa9, 0x03, 0x84, 0x20, 0x11, + 0x1e, 0x00, 0x08, 0x0c, 0x2a, 0xd3, 0x20, 0x09, 0x1e, 0x00, 0x08, 0x0c, + 0x2a, 0x7f, 0x60, 0x24, 0x91, 0x0c, 0x05, 0x28, 0x90, 0x84, 0x1a, 0x00, + 0x15, 0x10, 0x1d, 0x04, 0x79, 0x39, 0x20, 0x91, 0x60, 0x00, 0x1f, 0x04, + 0x79, 0x39, 0x08, 0x0c, 0xac, 0xfc, 0x20, 0x11, 0x00, 0x03, 0x08, 0x0c, + 0xa6, 0x2b, 0x20, 0x11, 0x00, 0x02, 0x08, 0x0c, 0xa6, 0x35, 0x08, 0x0c, + 0xa5, 0x16, 0x90, 0x1e, 0x08, 0x0c, 0xa5, 0x96, 0x08, 0x0c, 0xad, 0x18, + 0x20, 0x01, 0x00, 0xa0, 0x08, 0x0c, 0x2a, 0x99, 0x08, 0x0c, 0x7a, 0xb6, + 0x08, 0x0c, 0x61, 0x9d, 0x90, 0x85, 0x00, 0x01, 0x00, 0xf8, 0x08, 0x0c, + 0x1b, 0x4b, 0x20, 0x01, 0x00, 0x80, 0x08, 0x0c, 0x2a, 0x99, 0x20, 0x69, + 0x01, 0x40, 0x60, 0xe3, 0x00, 0x00, 0x70, 0xb4, 0x90, 0x05, 0x11, 0x18, + 0x68, 0x87, 0x00, 0x01, 0x00, 0x08, 0x68, 0x86, 0x20, 0x01, 0x18, 0x0d, + 0x20, 0x04, 0xd0, 0x8c, 0x20, 0x01, 0x00, 0x02, 0x11, 0x18, 0x20, 0x01, + 0x19, 0x6d, 0x20, 0x04, 0x08, 0x0c, 0x27, 0x00, 0x60, 0xe2, 0x90, 0x06, + 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, + 0x01, 0x5e, 0x00, 0x05, 0x01, 0x56, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, + 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x20, 0x61, 0x01, 0x00, 0x20, 0x71, + 0x18, 0x00, 0x60, 0x20, 0x90, 0x84, 0x00, 0xc0, 0x01, 0xe8, 0x08, 0x0c, + 0xac, 0xfc, 0x20, 0x11, 0x00, 0x03, 0x08, 0x0c, 0xa6, 0x2b, 0x20, 0x11, + 0x00, 0x02, 0x08, 0x0c, 0xa6, 0x35, 0x08, 0x0c, 0xa5, 0x16, 0x90, 0x1e, + 0x08, 0x0c, 0xa5, 0x96, 0x08, 0x0c, 0xad, 0x18, 0x20, 0x69, 0x01, 0x40, + 0x20, 0x01, 0x00, 0xa0, 0x08, 0x0c, 0x2a, 0x99, 0x08, 0x0c, 0x7a, 0xb6, + 0x08, 0x0c, 0x61, 0x9d, 0x08, 0x04, 0x7a, 0x32, 0x20, 0x01, 0x18, 0x0c, + 0x20, 0x0c, 0xd1, 0xb4, 0x11, 0x60, 0xc1, 0xb5, 0x21, 0x02, 0x08, 0x0c, + 0x75, 0xfa, 0x20, 0x69, 0x01, 0x40, 0x20, 0x01, 0x00, 0x80, 0x08, 0x0c, + 0x2a, 0x99, 0x60, 0xe3, 0x00, 0x00, 0x20, 0x69, 0x02, 0x00, 0x68, 0x04, + 0x90, 0x05, 0x11, 0x18, 0x68, 0x08, 0x90, 0x05, 0x01, 0x90, 0x60, 0x28, + 0x90, 0x84, 0xfd, 0xff, 0x60, 0x2a, 0x20, 0x11, 0x02, 0x00, 0x08, 0x0c, + 0x2a, 0xd3, 0x20, 0x69, 0x19, 0x8f, 0x70, 0x00, 0x20, 0x6a, 0x70, 0x9b, + 0x00, 0x27, 0x70, 0x03, 0x00, 0x01, 0x08, 0x04, 0x7a, 0x32, 0x20, 0x11, + 0x1e, 0x00, 0x08, 0x0c, 0x2a, 0xd3, 0x20, 0x09, 0x1e, 0x00, 0x08, 0x0c, + 0x2a, 0x7f, 0x60, 0x24, 0x91, 0x0c, 0x01, 0xc8, 0x90, 0x84, 0x1c, 0x00, + 0x11, 0xb0, 0x1d, 0x04, 0x79, 0xe7, 0x00, 0x06, 0x00, 0x16, 0x00, 0xc6, + 0x00, 0xd6, 0x00, 0xe6, 0x08, 0x0c, 0x88, 0xe7, 0x00, 0xee, 0x00, 0xde, + 0x00, 0xce, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0xe6, 0x20, 0x71, 0x1a, 0x04, + 0x70, 0x78, 0x00, 0xee, 0x90, 0x05, 0x19, 0xe8, 0x04, 0x38, 0x00, 0x26, + 0x20, 0x11, 0x76, 0x12, 0x08, 0x0c, 0x89, 0x93, 0x20, 0x11, 0x76, 0x05, + 0x08, 0x0c, 0x8a, 0x9f, 0x00, 0x2e, 0x20, 0x69, 0x01, 0x40, 0x60, 0xe3, + 0x00, 0x00, 0x70, 0xb4, 0x90, 0x05, 0x11, 0x18, 0x68, 0x87, 0x00, 0x01, + 0x00, 0x08, 0x68, 0x86, 0x20, 0x01, 0x18, 0x0d, 0x20, 0x04, 0xd0, 0x8c, + 0x20, 0x01, 0x00, 0x02, 0x11, 0x18, 0x20, 0x01, 0x19, 0x6d, 0x20, 0x04, + 0x08, 0x0c, 0x27, 0x00, 0x60, 0xe2, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x0c, + 0xc1, 0xb4, 0x21, 0x02, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x00, 0x3e, + 0x00, 0x2e, 0x00, 0x1e, 0x01, 0x5e, 0x00, 0x05, 0x01, 0x56, 0x00, 0x16, + 0x00, 0x26, 0x00, 0x36, 0x00, 0x46, 0x00, 0xc6, 0x00, 0xe6, 0x20, 0x61, + 0x01, 0x00, 0x20, 0x71, 0x18, 0x00, 0x08, 0x0c, 0xd6, 0x3e, 0x19, 0x04, + 0x7a, 0xa0, 0x71, 0x30, 0xd1, 0x84, 0x11, 0x70, 0x08, 0x0c, 0x34, 0x82, + 0x01, 0x38, 0xc1, 0x8d, 0x71, 0x32, 0x20, 0x11, 0x18, 0x48, 0x22, 0x14, + 0xd2, 0xac, 0x11, 0x20, 0x70, 0x30, 0xd0, 0x8c, 0x09, 0x04, 0x7a, 0xa0, + 0x20, 0x11, 0x18, 0x48, 0x22, 0x0c, 0xd1, 0xa4, 0x05, 0x38, 0x00, 0x16, + 0x20, 0x19, 0x00, 0x0e, 0x08, 0x0c, 0xe9, 0xf9, 0x01, 0x56, 0x00, 0xb6, + 0x20, 0xa9, 0x00, 0x7f, 0x90, 0x0e, 0x91, 0x86, 0x00, 0x7e, 0x01, 0xa0, + 0x91, 0x86, 0x00, 0x80, 0x01, 0x88, 0x08, 0x0c, 0x67, 0xb4, 0x11, 0x70, + 0x21, 0x20, 0x90, 0x06, 0x00, 0x16, 0x20, 0x09, 0x00, 0x0e, 0x08, 0x0c, + 0xea, 0x8d, 0x20, 0x09, 0x00, 0x01, 0x20, 0x11, 0x01, 0x00, 0x08, 0x0c, + 0x8c, 0x44, 0x00, 0x1e, 0x81, 0x08, 0x1f, 0x04, 0x7a, 0x69, 0x00, 0xbe, + 0x01, 0x5e, 0x00, 0x1e, 0xd1, 0xac, 0x11, 0x48, 0x00, 0x16, 0x20, 0x09, + 0x00, 0x02, 0x20, 0x19, 0x00, 0x04, 0x08, 0x0c, 0x32, 0xda, 0x00, 0x1e, + 0x00, 0x78, 0x01, 0x56, 0x00, 0xb6, 0x20, 0xa9, 0x00, 0x7f, 0x90, 0x0e, + 0x08, 0x0c, 0x67, 0xb4, 0x11, 0x10, 0x08, 0x0c, 0x61, 0xb7, 0x81, 0x08, + 0x1f, 0x04, 0x7a, 0x96, 0x00, 0xbe, 0x01, 0x5e, 0x08, 0x0c, 0x1b, 0x4b, + 0x08, 0x0c, 0xac, 0xfc, 0x08, 0x0c, 0xb0, 0x9b, 0x08, 0x0c, 0xad, 0x18, + 0x60, 0xe3, 0x00, 0x00, 0x08, 0x0c, 0x61, 0x9d, 0x08, 0x0c, 0x76, 0xcd, + 0x00, 0xee, 0x00, 0xce, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, + 0x01, 0x5e, 0x00, 0x05, 0x20, 0x01, 0x19, 0x7d, 0x20, 0x03, 0x00, 0x01, + 0x00, 0x05, 0x20, 0x01, 0x19, 0x7d, 0x20, 0x03, 0x00, 0x00, 0x00, 0x05, + 0x20, 0x01, 0x19, 0x7c, 0x20, 0x03, 0xaa, 0xaa, 0x00, 0x05, 0x20, 0x01, + 0x19, 0x7c, 0x20, 0x03, 0x00, 0x00, 0x00, 0x05, 0x20, 0x71, 0x18, 0xfa, + 0x70, 0x03, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x08, 0x0c, 0x10, 0x72, + 0x09, 0x0c, 0x0d, 0x85, 0xa8, 0xab, 0xdc, 0xb0, 0x29, 0x00, 0x70, 0x4e, + 0x08, 0x0c, 0x10, 0x72, 0x09, 0x0c, 0x0d, 0x85, 0xa8, 0xab, 0xdc, 0xb0, + 0x29, 0x00, 0x70, 0x52, 0xa8, 0x67, 0x00, 0x00, 0xa8, 0x6b, 0x00, 0x01, + 0xa8, 0x9f, 0x00, 0x00, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0x00, 0x40, + 0x68, 0x48, 0x90, 0x05, 0x11, 0x18, 0x90, 0x85, 0x00, 0x01, 0x04, 0xb0, + 0x68, 0x40, 0x90, 0x05, 0x01, 0x50, 0x04, 0xa1, 0x6a, 0x50, 0x92, 0x00, + 0x70, 0x02, 0x68, 0x54, 0x91, 0x01, 0x70, 0x06, 0x90, 0x06, 0x70, 0x12, + 0x70, 0x16, 0x68, 0x50, 0x70, 0x02, 0x68, 0x54, 0x70, 0x06, 0x68, 0x58, + 0x70, 0x0a, 0x68, 0x5c, 0x70, 0x0e, 0x68, 0x40, 0x90, 0x05, 0x11, 0x10, + 0x70, 0x12, 0x70, 0x16, 0x68, 0x48, 0x70, 0x1a, 0x70, 0x1c, 0x90, 0x85, + 0x00, 0x40, 0x70, 0x1e, 0x20, 0x01, 0x00, 0x19, 0x70, 0x36, 0x70, 0x2b, + 0x00, 0x01, 0x20, 0x01, 0x00, 0x04, 0x20, 0x0c, 0x91, 0x8c, 0xff, 0xf7, + 0x91, 0x8d, 0x80, 0x00, 0x21, 0x02, 0x00, 0xd6, 0x20, 0x69, 0x18, 0xfa, + 0x68, 0x07, 0x00, 0x01, 0x00, 0xde, 0x08, 0x0c, 0x81, 0x03, 0x90, 0x06, + 0x00, 0xee, 0x00, 0x05, 0x90, 0x0e, 0x01, 0x56, 0x20, 0xa9, 0x00, 0x06, + 0x80, 0x03, 0x81, 0x8d, 0x1f, 0x04, 0x7b, 0x2c, 0x01, 0x5e, 0x00, 0x05, + 0x20, 0x79, 0x00, 0x40, 0x20, 0x71, 0x18, 0xfa, 0x70, 0x04, 0x00, 0x02, + 0x7b, 0x42, 0x7b, 0x43, 0x7b, 0x8f, 0x7b, 0xea, 0x7d, 0x4a, 0x7b, 0x40, + 0x7b, 0x40, 0x7d, 0x74, 0x08, 0x0c, 0x0d, 0x85, 0x00, 0x05, 0x20, 0x79, + 0x00, 0x40, 0x20, 0x01, 0x1d, 0xc0, 0x20, 0x03, 0x00, 0x00, 0x78, 0x2c, + 0x90, 0x8c, 0x07, 0x80, 0x19, 0x0c, 0x81, 0xe5, 0xd0, 0xa4, 0x05, 0x78, + 0x20, 0x01, 0x1d, 0xc0, 0x20, 0x04, 0x90, 0x82, 0x00, 0x80, 0x16, 0x48, + 0x1d, 0x04, 0x7b, 0x60, 0x20, 0x01, 0x1a, 0x07, 0x20, 0x0c, 0x81, 0x09, + 0x05, 0x10, 0x20, 0x91, 0x60, 0x00, 0x21, 0x02, 0x78, 0x24, 0x20, 0x48, + 0x90, 0x06, 0xa8, 0x02, 0xa8, 0x06, 0xa8, 0x64, 0x90, 0x84, 0x00, 0xff, + 0x90, 0x8a, 0x00, 0x40, 0x06, 0x10, 0x00, 0xc0, 0x20, 0x01, 0x18, 0x00, + 0x20, 0x0c, 0x91, 0x86, 0x00, 0x03, 0x11, 0x68, 0x70, 0x04, 0x00, 0x02, + 0x7b, 0x7f, 0x7b, 0x49, 0x7b, 0x7f, 0x7b, 0x7d, 0x7b, 0x7f, 0x7b, 0x7f, + 0x7b, 0x7f, 0x7b, 0x7f, 0x7b, 0x7f, 0x08, 0x0c, 0x7b, 0xea, 0x78, 0x2c, + 0xd0, 0x9c, 0x09, 0x0c, 0x81, 0x03, 0x00, 0x05, 0x90, 0x82, 0x00, 0x5a, + 0x12, 0x18, 0x21, 0x00, 0x00, 0x3b, 0x0c, 0x10, 0x08, 0x0c, 0x7c, 0x20, + 0x0c, 0x90, 0x00, 0xe3, 0x08, 0xe8, 0x00, 0x05, 0x7c, 0x20, 0x7c, 0x20, + 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, + 0x7c, 0x42, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, + 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, + 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, + 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x2c, 0x7c, 0x20, 0x7e, 0x6a, 0x7c, 0x20, + 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x42, 0x7c, 0x20, 0x7c, 0x2c, 0x7e, 0xab, + 0x7e, 0xec, 0x7f, 0x33, 0x7f, 0x47, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x42, + 0x7c, 0x2c, 0x7c, 0x56, 0x7c, 0x20, 0x7d, 0x1e, 0x7f, 0xf2, 0x80, 0x0d, + 0x7c, 0x20, 0x7c, 0x42, 0x7c, 0x20, 0x7c, 0x56, 0x7c, 0x20, 0x7c, 0x20, + 0x7d, 0x14, 0x80, 0x0d, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, + 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x6a, + 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, + 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x81, 0x89, 0x7c, 0x20, 0x81, 0x33, + 0x7c, 0x20, 0x81, 0x33, 0x7c, 0x20, 0x7c, 0x7f, 0x7c, 0x20, 0x7c, 0x20, + 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x20, 0x79, 0x00, 0x40, + 0x70, 0x04, 0x90, 0x86, 0x00, 0x03, 0x11, 0x98, 0x78, 0x2c, 0x08, 0x0c, + 0x81, 0x2c, 0xd0, 0xa4, 0x01, 0x70, 0x78, 0x24, 0x20, 0x48, 0x90, 0x06, + 0xa8, 0x02, 0xa8, 0x06, 0xa8, 0x64, 0x90, 0x84, 0x00, 0xff, 0x90, 0x8a, + 0x00, 0x1a, 0x12, 0x10, 0x00, 0x2b, 0x0c, 0x50, 0x00, 0xe9, 0x08, 0x0c, + 0x81, 0x03, 0x00, 0x05, 0x7c, 0x20, 0x7c, 0x2c, 0x7e, 0x56, 0x7c, 0x20, + 0x7c, 0x2c, 0x7c, 0x20, 0x7c, 0x2c, 0x7c, 0x2c, 0x7c, 0x20, 0x7c, 0x2c, + 0x7e, 0x56, 0x7c, 0x2c, 0x7c, 0x2c, 0x7c, 0x2c, 0x7c, 0x2c, 0x7c, 0x2c, + 0x7c, 0x20, 0x7c, 0x2c, 0x7e, 0x56, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x2c, + 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x2c, 0x00, 0xe6, 0x20, 0x71, + 0x18, 0xfa, 0x20, 0x09, 0x04, 0x00, 0x00, 0x71, 0x00, 0xee, 0x00, 0x05, + 0x20, 0x09, 0x10, 0x00, 0x00, 0x49, 0x00, 0x05, 0x20, 0x09, 0x20, 0x00, + 0x00, 0x29, 0x00, 0x05, 0x20, 0x09, 0x08, 0x00, 0x00, 0x09, 0x00, 0x05, + 0x70, 0x07, 0x00, 0x01, 0xa8, 0x68, 0x90, 0x84, 0x00, 0xff, 0x91, 0x05, + 0xa8, 0x6a, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x70, 0x12, + 0x01, 0x2e, 0x00, 0x05, 0xa8, 0x64, 0x80, 0x07, 0x90, 0x84, 0x00, 0xff, + 0x0d, 0x08, 0x80, 0x01, 0x11, 0x20, 0x70, 0x07, 0x00, 0x01, 0x08, 0x04, + 0x7d, 0xf3, 0x70, 0x07, 0x00, 0x03, 0x70, 0x12, 0x29, 0x00, 0x70, 0x16, + 0x70, 0x1a, 0x70, 0x4b, 0x7d, 0xf3, 0x00, 0x05, 0xa8, 0x64, 0x80, 0x07, + 0x90, 0x84, 0x00, 0xff, 0x09, 0x68, 0x80, 0x01, 0x11, 0x20, 0x70, 0x07, + 0x00, 0x01, 0x08, 0x04, 0x7e, 0x0e, 0x70, 0x07, 0x00, 0x03, 0x70, 0x12, + 0x29, 0x00, 0x70, 0x16, 0x70, 0x1a, 0x70, 0x4b, 0x7e, 0x0e, 0x00, 0x05, + 0xa8, 0x64, 0x80, 0x07, 0x90, 0x84, 0x00, 0xff, 0x09, 0x04, 0x7c, 0x28, + 0x80, 0x01, 0x11, 0x20, 0x70, 0x07, 0x00, 0x01, 0x08, 0x04, 0x7e, 0x2a, + 0x70, 0x07, 0x00, 0x03, 0x70, 0x12, 0x29, 0x00, 0x70, 0x16, 0x70, 0x1a, + 0x70, 0x4b, 0x7e, 0x2a, 0x00, 0x05, 0xa8, 0x64, 0x80, 0x07, 0x90, 0x84, + 0x00, 0xff, 0x90, 0x86, 0x00, 0x01, 0x19, 0x04, 0x7c, 0x28, 0x70, 0x07, + 0x00, 0x01, 0x20, 0x09, 0x18, 0x34, 0x21, 0x0c, 0x81, 0xff, 0x19, 0x04, + 0x7c, 0xeb, 0x20, 0x01, 0x18, 0x0d, 0x20, 0x04, 0xd0, 0x8c, 0x09, 0x04, + 0x7c, 0xd6, 0xa9, 0x9c, 0x91, 0x86, 0x00, 0xff, 0x05, 0xe8, 0xa9, 0x94, + 0x91, 0x86, 0x00, 0x6f, 0x01, 0x88, 0x91, 0x86, 0x00, 0x74, 0x15, 0xb0, + 0x00, 0x26, 0x20, 0x11, 0x00, 0x10, 0x08, 0x0c, 0x6c, 0x35, 0x00, 0x2e, + 0x05, 0x78, 0x00, 0x16, 0xa9, 0x98, 0x08, 0x0c, 0x6c, 0x7f, 0x00, 0x1e, + 0x15, 0x48, 0x04, 0x00, 0x08, 0x0c, 0x77, 0x9e, 0x01, 0x40, 0xa8, 0x97, + 0x40, 0x05, 0xa8, 0x9b, 0x00, 0x16, 0x20, 0x01, 0x00, 0x30, 0x90, 0x0e, + 0x04, 0x38, 0x00, 0x26, 0x20, 0x11, 0x80, 0x08, 0x08, 0x0c, 0x6c, 0x35, + 0x00, 0x2e, 0x01, 0xb0, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0xa9, 0x98, + 0xaa, 0xa0, 0xab, 0x9c, 0x91, 0x8d, 0x80, 0x00, 0x08, 0x0c, 0x6c, 0x7f, + 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, 0x11, 0x40, 0xa8, 0x97, 0x40, 0x05, + 0xa8, 0x9b, 0x40, 0x09, 0x20, 0x01, 0x00, 0x30, 0x90, 0x0e, 0x00, 0x50, + 0xa8, 0x68, 0x90, 0x84, 0x00, 0xff, 0xa8, 0x6a, 0xa8, 0x83, 0x00, 0x00, + 0x08, 0x0c, 0x64, 0x30, 0x11, 0x08, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0xa8, 0x67, 0x01, 0x39, 0xa8, 0x7a, 0xa9, 0x82, 0x08, 0x0c, + 0x70, 0x12, 0x01, 0x2e, 0x0c, 0xa0, 0xa9, 0x94, 0x91, 0x86, 0x00, 0x71, + 0x09, 0x04, 0x7c, 0x8f, 0x91, 0x86, 0x00, 0x64, 0x09, 0x04, 0x7c, 0x8f, + 0x91, 0x86, 0x00, 0x7c, 0x09, 0x04, 0x7c, 0x8f, 0x91, 0x86, 0x00, 0x28, + 0x09, 0x04, 0x7c, 0x8f, 0x91, 0x86, 0x00, 0x38, 0x09, 0x04, 0x7c, 0x8f, + 0x91, 0x86, 0x00, 0x78, 0x09, 0x04, 0x7c, 0x8f, 0x91, 0x86, 0x00, 0x5f, + 0x09, 0x04, 0x7c, 0x8f, 0x91, 0x86, 0x00, 0x56, 0x09, 0x04, 0x7c, 0x8f, + 0xa8, 0x97, 0x40, 0x05, 0xa8, 0x9b, 0x00, 0x01, 0x20, 0x01, 0x00, 0x30, + 0x90, 0x0e, 0x08, 0x60, 0xa8, 0x7c, 0x90, 0x84, 0x00, 0xc0, 0x90, 0x86, + 0x00, 0xc0, 0x11, 0x20, 0x70, 0x07, 0x00, 0x01, 0x08, 0x04, 0x80, 0x24, + 0x29, 0x00, 0x70, 0x16, 0x70, 0x1a, 0x20, 0xa9, 0x00, 0x04, 0xa8, 0x60, + 0x20, 0xe0, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x30, 0x20, 0x98, 0x70, 0x50, + 0x20, 0x40, 0xa0, 0x60, 0x20, 0xe8, 0xa0, 0x5c, 0x90, 0x80, 0x00, 0x23, + 0x20, 0xa0, 0x40, 0x03, 0xa8, 0x88, 0x70, 0x12, 0x90, 0x82, 0x04, 0x01, + 0x1a, 0x04, 0x7c, 0x30, 0xaa, 0xb4, 0x92, 0x8a, 0x00, 0x02, 0x1a, 0x04, + 0x7c, 0x30, 0x82, 0xff, 0x11, 0x38, 0xa8, 0xb8, 0xa9, 0xbc, 0x91, 0x05, + 0x01, 0x18, 0x20, 0x01, 0x7d, 0xb1, 0x00, 0x18, 0x92, 0x80, 0x7d, 0xa7, + 0x20, 0x05, 0x70, 0x56, 0x70, 0x10, 0x90, 0x15, 0x09, 0x04, 0x7d, 0x92, + 0x08, 0x0c, 0x10, 0x72, 0x11, 0x18, 0x70, 0x07, 0x00, 0x04, 0x00, 0x05, + 0x29, 0x00, 0x70, 0x22, 0x70, 0x54, 0x20, 0x60, 0xe0, 0x00, 0xa8, 0x66, + 0x70, 0x50, 0x20, 0x40, 0xa9, 0x5c, 0xe0, 0x04, 0x91, 0x00, 0xa0, 0x76, + 0xa8, 0x60, 0xa0, 0x72, 0xe0, 0x08, 0x92, 0x0a, 0x12, 0x10, 0x90, 0x0e, + 0x22, 0x00, 0x71, 0x12, 0xe2, 0x0c, 0x80, 0x03, 0x80, 0x0b, 0x92, 0x96, + 0x00, 0x04, 0x01, 0x08, 0x91, 0x08, 0xa1, 0x7a, 0x81, 0x0b, 0xa1, 0x7e, + 0x08, 0x0c, 0x11, 0x4e, 0xa0, 0x6c, 0x90, 0x8e, 0x01, 0x00, 0x01, 0x70, + 0x90, 0x86, 0x02, 0x00, 0x01, 0x18, 0x70, 0x07, 0x00, 0x07, 0x00, 0x05, + 0x70, 0x20, 0x20, 0x48, 0x08, 0x0c, 0x10, 0x8b, 0x70, 0x14, 0x20, 0x48, + 0x08, 0x04, 0x7c, 0x30, 0x70, 0x20, 0x20, 0x48, 0x70, 0x18, 0xa8, 0x02, + 0xa8, 0x07, 0x00, 0x00, 0x29, 0x08, 0x20, 0x48, 0xa9, 0x06, 0x71, 0x1a, + 0x08, 0x04, 0x7d, 0x4a, 0x70, 0x14, 0x20, 0x48, 0x70, 0x07, 0x00, 0x01, + 0xa8, 0xb4, 0x90, 0x05, 0x11, 0x28, 0xa8, 0xb8, 0xa9, 0xbc, 0x91, 0x05, + 0x01, 0x08, 0x00, 0xb9, 0xa8, 0x64, 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, + 0x00, 0x1e, 0x09, 0x04, 0x80, 0x24, 0x08, 0x04, 0x7d, 0xf3, 0x7d, 0xa9, + 0x7d, 0xad, 0x00, 0x02, 0x00, 0x1d, 0x00, 0x07, 0x00, 0x04, 0x00, 0x0a, + 0x00, 0x1b, 0x00, 0x05, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x1d, 0x00, 0x05, + 0x00, 0x04, 0x00, 0x76, 0x00, 0x66, 0xaf, 0xb8, 0xae, 0xbc, 0xa8, 0x04, + 0x20, 0x50, 0xb0, 0xc0, 0xb0, 0xe2, 0xb0, 0xbc, 0xb0, 0xde, 0xb0, 0xb8, + 0xb0, 0xd2, 0xb0, 0xb4, 0xb0, 0xce, 0xb6, 0xda, 0xb7, 0xd6, 0xb0, 0xb0, + 0xb0, 0xca, 0xb0, 0xac, 0xb0, 0xc6, 0xb0, 0xa8, 0xb0, 0xba, 0xb0, 0xa4, + 0xb0, 0xb6, 0xb6, 0xc2, 0xb7, 0xbe, 0xb0, 0xa0, 0xb0, 0xb2, 0xb0, 0x9c, + 0xb0, 0xae, 0xb0, 0x98, 0xb0, 0xa2, 0xb0, 0x94, 0xb0, 0x9e, 0xb6, 0xaa, + 0xb7, 0xa6, 0xb0, 0x90, 0xb0, 0x9a, 0xb0, 0x8c, 0xb0, 0x96, 0xb0, 0x88, + 0xb0, 0x8a, 0xb0, 0x84, 0xb0, 0x86, 0xb6, 0x92, 0xb7, 0x8e, 0xb0, 0x80, + 0xb0, 0x82, 0xb0, 0x7c, 0xb0, 0x7e, 0xb0, 0x78, 0xb0, 0x72, 0xb0, 0x74, + 0xb0, 0x6e, 0xb6, 0x7a, 0xb7, 0x76, 0xb0, 0x04, 0x90, 0x55, 0x19, 0x58, + 0x00, 0x6e, 0x00, 0x7e, 0x00, 0x05, 0x20, 0x09, 0x18, 0x34, 0x21, 0x0c, + 0x81, 0xff, 0x11, 0x78, 0x08, 0x0c, 0x62, 0x2f, 0x11, 0x08, 0x00, 0x05, + 0x08, 0x0c, 0x72, 0x5e, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, + 0xd2, 0x20, 0x08, 0x0c, 0x70, 0x12, 0x01, 0x2e, 0x0c, 0xa0, 0x08, 0x0c, + 0xd6, 0x3e, 0x1d, 0x70, 0x20, 0x01, 0x00, 0x28, 0x90, 0x0e, 0x0c, 0x70, + 0x20, 0x09, 0x18, 0x34, 0x21, 0x0c, 0x81, 0xff, 0x11, 0x88, 0xa8, 0x88, + 0x90, 0x05, 0x01, 0x88, 0xa8, 0x83, 0x00, 0x00, 0x08, 0x0c, 0x62, 0xbd, + 0x11, 0x08, 0x00, 0x05, 0xa8, 0x7a, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x08, 0x0c, 0x70, 0x12, 0x01, 0x2e, 0x0c, 0xb8, 0x20, 0x01, 0x00, 0x28, + 0x0c, 0xa8, 0x20, 0x01, 0x00, 0x00, 0x0c, 0x90, 0x04, 0x19, 0x11, 0xd8, + 0xa8, 0x88, 0x90, 0x05, 0x01, 0xe0, 0xa8, 0x83, 0x00, 0x00, 0xa8, 0x7c, + 0xd0, 0xf4, 0x01, 0x20, 0x08, 0x0c, 0x63, 0x92, 0x11, 0x38, 0x00, 0x05, + 0x90, 0x06, 0xa8, 0x7a, 0x08, 0x0c, 0x63, 0x0a, 0x11, 0x08, 0x00, 0x05, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0xa8, 0x7a, 0xa9, 0x82, 0x08, 0x0c, + 0x70, 0x12, 0x01, 0x2e, 0x0c, 0xb0, 0x20, 0x01, 0x00, 0x28, 0x90, 0x0e, + 0x0c, 0x98, 0x20, 0x01, 0x00, 0x00, 0x0c, 0x80, 0x00, 0xc6, 0x20, 0x61, + 0x18, 0x00, 0x60, 0xd0, 0x90, 0x05, 0x01, 0x00, 0x00, 0xce, 0x00, 0x05, + 0x70, 0x18, 0xa8, 0x02, 0x29, 0x08, 0x20, 0x48, 0xa9, 0x06, 0x71, 0x1a, + 0x70, 0x10, 0x80, 0x01, 0x70, 0x12, 0x01, 0x18, 0x70, 0x07, 0x00, 0x03, + 0x00, 0x30, 0x70, 0x14, 0x20, 0x48, 0x70, 0x07, 0x00, 0x01, 0x70, 0x48, + 0x08, 0x0f, 0x00, 0x05, 0x00, 0xb6, 0x70, 0x07, 0x00, 0x01, 0xa9, 0x74, + 0xa8, 0x78, 0x90, 0x84, 0x00, 0xff, 0x90, 0x96, 0x00, 0x04, 0x05, 0x40, + 0x20, 0xa9, 0x00, 0x01, 0x90, 0x96, 0x00, 0x01, 0x01, 0x90, 0x90, 0x0e, + 0x20, 0xa9, 0x08, 0x00, 0x90, 0x96, 0x00, 0x02, 0x01, 0x60, 0x90, 0x05, + 0x11, 0xd8, 0xa9, 0x74, 0x08, 0x0c, 0x67, 0xb4, 0x11, 0xb8, 0x00, 0x66, + 0xae, 0x80, 0x08, 0x0c, 0x68, 0xc4, 0x00, 0x6e, 0x00, 0x88, 0x00, 0x46, + 0x20, 0x11, 0x18, 0x0c, 0x22, 0x24, 0xc4, 0x84, 0x24, 0x12, 0x00, 0x4e, + 0x00, 0xc6, 0x08, 0x0c, 0x67, 0xb4, 0x11, 0x10, 0x08, 0x0c, 0x6a, 0x9e, + 0x81, 0x08, 0x1f, 0x04, 0x7e, 0x93, 0x00, 0xce, 0xa8, 0x7c, 0xd0, 0x84, + 0x11, 0x20, 0x08, 0x0c, 0x10, 0x8b, 0x00, 0xbe, 0x00, 0x05, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x70, 0x12, 0x01, 0x2e, 0x00, 0xbe, + 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x70, 0x07, 0x00, 0x01, + 0x08, 0x0c, 0x6c, 0x0d, 0x05, 0x80, 0x20, 0x61, 0x1a, 0x73, 0x61, 0x00, + 0xd1, 0x84, 0x01, 0x78, 0xa8, 0x88, 0x90, 0x84, 0x00, 0xff, 0x15, 0x50, + 0x60, 0x00, 0xd0, 0x84, 0x05, 0x20, 0x60, 0x04, 0x90, 0x05, 0x15, 0x38, + 0x60, 0x03, 0x00, 0x00, 0x60, 0x0b, 0x00, 0x00, 0x00, 0xc8, 0x20, 0x11, + 0x00, 0x01, 0xa8, 0x90, 0x90, 0x05, 0x11, 0x10, 0x20, 0x01, 0x00, 0x1e, + 0x80, 0x00, 0x60, 0x16, 0xa8, 0x88, 0x90, 0x84, 0x00, 0xff, 0x01, 0x78, + 0x60, 0x06, 0xa8, 0x88, 0x80, 0x07, 0x90, 0x84, 0x00, 0xff, 0x01, 0x48, + 0x60, 0x0a, 0xa8, 0x88, 0x80, 0x00, 0x11, 0x08, 0xc2, 0x8d, 0x62, 0x02, + 0x01, 0x2e, 0x08, 0x04, 0x80, 0xed, 0x01, 0x2e, 0x08, 0x04, 0x80, 0xe7, + 0x01, 0x2e, 0x08, 0x04, 0x80, 0xe1, 0x01, 0x2e, 0x08, 0x04, 0x80, 0xe4, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x70, 0x07, 0x00, 0x01, 0x08, 0x0c, + 0x6c, 0x0d, 0x05, 0xe0, 0x20, 0x61, 0x1a, 0x73, 0x60, 0x00, 0xd0, 0x84, + 0x05, 0xb8, 0x62, 0x04, 0x63, 0x08, 0xd0, 0x8c, 0x15, 0x30, 0xac, 0x78, + 0x94, 0x84, 0x00, 0x03, 0x01, 0x70, 0xa9, 0x88, 0x91, 0x8c, 0x00, 0xff, + 0x80, 0x01, 0x11, 0x20, 0x21, 0x00, 0x92, 0x10, 0x06, 0x20, 0x00, 0x28, + 0x80, 0x01, 0x15, 0x08, 0x21, 0x00, 0x92, 0x12, 0x02, 0xf0, 0x94, 0x84, + 0x00, 0x0c, 0x01, 0x88, 0xa9, 0x88, 0x81, 0x0f, 0x91, 0x8c, 0x00, 0xff, + 0x90, 0x82, 0x00, 0x04, 0x11, 0x20, 0x21, 0x00, 0x93, 0x18, 0x02, 0x88, + 0x00, 0x30, 0x90, 0x82, 0x00, 0x04, 0x11, 0x68, 0x21, 0x00, 0x93, 0x1a, + 0x02, 0x50, 0xa8, 0x90, 0x90, 0x05, 0x01, 0x10, 0x80, 0x00, 0x60, 0x16, + 0x62, 0x06, 0x63, 0x0a, 0x01, 0x2e, 0x08, 0x04, 0x80, 0xed, 0x01, 0x2e, + 0x08, 0x04, 0x80, 0xea, 0x01, 0x2e, 0x08, 0x04, 0x80, 0xe7, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x70, 0x07, 0x00, 0x01, 0x20, 0x61, 0x1a, 0x73, + 0x63, 0x00, 0xd3, 0x8c, 0x11, 0x20, 0x63, 0x08, 0x83, 0x18, 0x02, 0x20, + 0x63, 0x0a, 0x01, 0x2e, 0x08, 0x04, 0x80, 0xfb, 0x01, 0x2e, 0x08, 0x04, + 0x80, 0xea, 0x00, 0xb6, 0x01, 0x26, 0x00, 0xc6, 0x20, 0x91, 0x80, 0x00, + 0x70, 0x07, 0x00, 0x01, 0xa8, 0x7c, 0xd0, 0xac, 0x01, 0x48, 0x00, 0xc6, + 0x20, 0x61, 0x1a, 0x73, 0x60, 0x00, 0x90, 0x84, 0xfc, 0xff, 0x60, 0x02, + 0x00, 0xce, 0x04, 0x40, 0xa8, 0x88, 0x90, 0x05, 0x05, 0xd8, 0xa8, 0x8c, + 0x90, 0x65, 0x05, 0x98, 0x20, 0x01, 0x18, 0x34, 0x20, 0x04, 0x90, 0x05, + 0x01, 0x18, 0x08, 0x0c, 0xb1, 0xa7, 0x00, 0x68, 0x60, 0x17, 0xf4, 0x00, + 0x60, 0x63, 0x00, 0x00, 0xa9, 0x7c, 0xd1, 0xa4, 0x01, 0x10, 0xa9, 0x80, + 0x61, 0x62, 0x20, 0x09, 0x00, 0x41, 0x08, 0x0c, 0xb2, 0x0a, 0xa9, 0x88, + 0x91, 0x8c, 0xff, 0x00, 0x91, 0x86, 0x20, 0x00, 0x11, 0x38, 0x00, 0x26, + 0x90, 0x0e, 0x20, 0x11, 0xfd, 0xff, 0x08, 0x0c, 0x8c, 0x44, 0x00, 0x2e, + 0xa8, 0x7c, 0xd0, 0xc4, 0x01, 0x48, 0x20, 0x61, 0x1a, 0x73, 0x60, 0x00, + 0xd0, 0x8c, 0x11, 0x20, 0x60, 0x08, 0x80, 0x00, 0x02, 0x08, 0x60, 0x0a, + 0x00, 0xce, 0x01, 0x2e, 0x00, 0xbe, 0x08, 0x04, 0x80, 0xed, 0x00, 0xce, + 0x01, 0x2e, 0x00, 0xbe, 0x08, 0x04, 0x80, 0xe7, 0xa9, 0x84, 0x91, 0x86, + 0x00, 0x2e, 0x0d, 0x30, 0x91, 0x86, 0x00, 0x2d, 0x0d, 0x18, 0x91, 0x86, + 0x00, 0x45, 0x05, 0x10, 0x91, 0x86, 0x00, 0x2a, 0x11, 0x30, 0x20, 0x01, + 0x18, 0x0c, 0x20, 0x0c, 0xc1, 0x94, 0x21, 0x02, 0x08, 0xb8, 0x91, 0x86, + 0x00, 0x20, 0x01, 0x58, 0x91, 0x86, 0x00, 0x29, 0x1d, 0x10, 0xa9, 0x74, + 0x08, 0x0c, 0x67, 0xb4, 0x19, 0x68, 0xb8, 0x00, 0xc0, 0xe4, 0xb8, 0x02, + 0x08, 0x48, 0xa8, 0x8c, 0x90, 0x65, 0x09, 0xb8, 0x60, 0x07, 0x00, 0x24, + 0x20, 0x01, 0x19, 0x86, 0x20, 0x04, 0x60, 0x1a, 0x08, 0x04, 0x7f, 0x82, + 0xa8, 0x8c, 0x90, 0x65, 0x09, 0x60, 0x00, 0xe6, 0xa8, 0x90, 0x90, 0x75, + 0x20, 0x01, 0x18, 0x34, 0x20, 0x04, 0x90, 0x05, 0x01, 0x50, 0x08, 0x0c, + 0xb1, 0xa7, 0x8e, 0xff, 0x01, 0x18, 0x2e, 0x60, 0x08, 0x0c, 0xb1, 0xa7, + 0x00, 0xee, 0x08, 0x04, 0x7f, 0x82, 0x60, 0x24, 0xc0, 0xdc, 0xc0, 0xd5, + 0x60, 0x26, 0x2e, 0x60, 0x60, 0x07, 0x00, 0x3a, 0xa8, 0xa0, 0x90, 0x05, + 0x01, 0x30, 0x60, 0x07, 0x00, 0x3b, 0xa8, 0xa4, 0x60, 0x2e, 0xa8, 0xa8, + 0x60, 0x16, 0x60, 0x03, 0x00, 0x01, 0x20, 0x09, 0x80, 0x20, 0x08, 0x0c, + 0x96, 0x17, 0x00, 0xee, 0x08, 0x04, 0x7f, 0x82, 0x20, 0x61, 0x1a, 0x73, + 0x60, 0x00, 0xd0, 0x84, 0x01, 0x90, 0xd0, 0x8c, 0x19, 0x04, 0x80, 0xfb, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x62, 0x04, 0x82, 0x10, 0x02, 0x20, + 0x62, 0x06, 0x01, 0x2e, 0x08, 0x04, 0x80, 0xfb, 0x01, 0x2e, 0xa8, 0x83, + 0x00, 0x16, 0x08, 0x04, 0x80, 0xf4, 0xa8, 0x83, 0x00, 0x07, 0x08, 0x04, + 0x80, 0xf4, 0xa8, 0x64, 0x80, 0x07, 0x90, 0x84, 0x00, 0xff, 0x01, 0x30, + 0x80, 0x01, 0x11, 0x38, 0x70, 0x07, 0x00, 0x01, 0x00, 0x69, 0x00, 0x05, + 0x08, 0x0c, 0x7c, 0x28, 0x00, 0x40, 0x70, 0x07, 0x00, 0x03, 0x70, 0x12, + 0x29, 0x00, 0x70, 0x16, 0x70, 0x1a, 0x70, 0x4b, 0x80, 0x24, 0x00, 0x05, + 0x00, 0xb6, 0x00, 0xe6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x90, 0x3e, + 0x20, 0x61, 0x18, 0x00, 0x61, 0xd0, 0x81, 0xff, 0x19, 0x04, 0x80, 0xa6, + 0x61, 0x30, 0xd1, 0x94, 0x19, 0x04, 0x80, 0xd0, 0xa8, 0x78, 0x20, 0x70, + 0x9e, 0x82, 0x1d, 0xdc, 0x0a, 0x04, 0x80, 0x9a, 0x60, 0x68, 0x9e, 0x02, + 0x1a, 0x04, 0x80, 0x9a, 0x71, 0x20, 0x91, 0x86, 0x00, 0x06, 0x19, 0x04, + 0x80, 0x8c, 0x70, 0x10, 0x90, 0x5d, 0x09, 0x04, 0x80, 0xa6, 0xb8, 0x00, + 0xd0, 0xe4, 0x19, 0x04, 0x80, 0xca, 0x20, 0x61, 0x1a, 0x73, 0x61, 0x00, + 0x91, 0x84, 0x03, 0x01, 0x90, 0x86, 0x00, 0x01, 0x15, 0xa0, 0x70, 0x24, + 0xd0, 0xdc, 0x19, 0x04, 0x80, 0xd3, 0xa8, 0x83, 0x00, 0x00, 0xa8, 0x03, + 0x00, 0x00, 0x29, 0x08, 0x70, 0x14, 0x90, 0x05, 0x11, 0x98, 0x71, 0x16, + 0xa8, 0x7c, 0xd0, 0xf4, 0x19, 0x04, 0x80, 0xd6, 0x08, 0x0c, 0x58, 0x40, + 0xd0, 0x9c, 0x11, 0x18, 0xa8, 0x7c, 0xc0, 0xcc, 0xa8, 0x7e, 0x2e, 0x60, + 0x08, 0x0c, 0x8b, 0x34, 0x01, 0x2e, 0x00, 0xee, 0x00, 0xbe, 0x00, 0x05, + 0x20, 0x48, 0xa8, 0x00, 0x90, 0x05, 0x1d, 0xe0, 0xa9, 0x02, 0x21, 0x48, + 0xa8, 0x7c, 0xd0, 0xf4, 0x19, 0x04, 0x80, 0xd6, 0x01, 0x2e, 0x00, 0xee, + 0x00, 0xbe, 0x00, 0x05, 0x01, 0x2e, 0x00, 0xee, 0xa8, 0x83, 0x00, 0x06, + 0x00, 0xbe, 0x08, 0x04, 0x80, 0xf4, 0xd1, 0x84, 0x0d, 0xb8, 0xd1, 0xc4, + 0x11, 0x90, 0x00, 0xa0, 0xa9, 0x74, 0x08, 0x0c, 0x67, 0xb4, 0x15, 0xd0, + 0xb8, 0x00, 0xd0, 0xe4, 0x15, 0xb8, 0x71, 0x20, 0x91, 0x86, 0x00, 0x07, + 0x11, 0x18, 0xa8, 0x83, 0x00, 0x02, 0x04, 0x90, 0xa8, 0x83, 0x00, 0x08, + 0x04, 0x78, 0xa8, 0x83, 0x00, 0x0e, 0x04, 0x60, 0xa8, 0x83, 0x00, 0x17, + 0x04, 0x48, 0xa8, 0x83, 0x00, 0x35, 0x04, 0x30, 0x08, 0x0c, 0x58, 0x44, + 0xd0, 0xfc, 0x01, 0xe8, 0xa8, 0x78, 0x20, 0x70, 0x9e, 0x82, 0x1d, 0xdc, + 0x02, 0xc0, 0x60, 0x68, 0x9e, 0x02, 0x12, 0xa8, 0x71, 0x20, 0x91, 0x86, + 0x00, 0x06, 0x11, 0x88, 0x70, 0x10, 0x90, 0x5d, 0x01, 0x70, 0xb8, 0x00, + 0xd0, 0xbc, 0x01, 0x58, 0x20, 0x39, 0x00, 0x01, 0x70, 0x00, 0x90, 0x86, + 0x00, 0x07, 0x19, 0x04, 0x80, 0x30, 0x70, 0x03, 0x00, 0x02, 0x08, 0x04, + 0x80, 0x30, 0xa8, 0x83, 0x00, 0x28, 0x00, 0x10, 0xa8, 0x83, 0x00, 0x29, + 0x01, 0x2e, 0x00, 0xee, 0x00, 0xbe, 0x04, 0x20, 0xa8, 0x83, 0x00, 0x2a, + 0x0c, 0xc8, 0xa8, 0x83, 0x00, 0x45, 0x0c, 0xb0, 0x2e, 0x60, 0x20, 0x19, + 0x00, 0x02, 0x60, 0x1b, 0x00, 0x14, 0x08, 0x0c, 0xe5, 0x86, 0x01, 0x2e, + 0x00, 0xee, 0x00, 0xbe, 0x00, 0x05, 0x20, 0x09, 0x00, 0x3e, 0x00, 0x58, + 0x20, 0x09, 0x00, 0x04, 0x00, 0x40, 0x20, 0x09, 0x00, 0x06, 0x00, 0x28, + 0x20, 0x09, 0x00, 0x16, 0x00, 0x10, 0x20, 0x09, 0x00, 0x01, 0xa8, 0x84, + 0x90, 0x84, 0xff, 0x00, 0x91, 0x05, 0xa8, 0x86, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0x70, 0x12, 0x01, 0x2e, 0x00, 0x05, 0x08, 0x0c, + 0x10, 0x8b, 0x00, 0x05, 0x00, 0xd6, 0x08, 0x0c, 0x8b, 0x2b, 0x00, 0xde, + 0x00, 0x05, 0x00, 0xd6, 0x00, 0xe6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x71, 0x00, 0x40, 0x70, 0x2c, 0xd0, 0x84, 0x01, 0xd8, 0x90, 0x8c, + 0x07, 0x80, 0x19, 0x0c, 0x81, 0xe5, 0xd0, 0x9c, 0x11, 0xa8, 0x20, 0x71, + 0x18, 0x00, 0x70, 0xc0, 0x90, 0xea, 0x00, 0x20, 0x02, 0x78, 0x80, 0x01, + 0x70, 0xc2, 0x70, 0x2c, 0x20, 0x48, 0xa8, 0x00, 0x70, 0x2e, 0x90, 0x06, + 0xa8, 0x02, 0xa8, 0x06, 0x20, 0x71, 0x00, 0x40, 0x29, 0x00, 0x70, 0x22, + 0x70, 0x2c, 0x0c, 0x28, 0x01, 0x2e, 0x00, 0xee, 0x00, 0xde, 0x00, 0x05, + 0x00, 0x06, 0x90, 0x84, 0x07, 0x80, 0x19, 0x0c, 0x81, 0xe5, 0x00, 0x0e, + 0x00, 0x05, 0xa8, 0x98, 0x90, 0x84, 0x00, 0x03, 0x05, 0xa8, 0x08, 0x0c, + 0xb1, 0x16, 0x05, 0xd8, 0x29, 0x00, 0x60, 0x16, 0xa8, 0x64, 0x90, 0x84, + 0x00, 0xff, 0x90, 0x86, 0x00, 0x35, 0x11, 0x38, 0x60, 0x28, 0xc0, 0xfd, + 0x60, 0x2a, 0x20, 0x01, 0x19, 0x6b, 0x20, 0x04, 0x00, 0x98, 0xa8, 0xa0, + 0x90, 0x84, 0x00, 0xff, 0xa9, 0x9c, 0x91, 0x8c, 0xff, 0x00, 0x91, 0x05, + 0xa9, 0x9c, 0x91, 0x8c, 0x00, 0xff, 0x08, 0x0c, 0x26, 0x8c, 0x15, 0x40, + 0x00, 0xb6, 0x08, 0x0c, 0x67, 0xb4, 0x2b, 0x00, 0x00, 0xbe, 0x15, 0x10, + 0x60, 0x12, 0x60, 0x23, 0x00, 0x01, 0x20, 0x09, 0x00, 0x40, 0xa8, 0x64, + 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x35, 0x01, 0x10, 0x20, 0x09, + 0x00, 0x41, 0x08, 0x0c, 0xb2, 0x0a, 0x00, 0x05, 0xa8, 0x7b, 0x01, 0x01, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x70, 0x12, 0x01, 0x2e, + 0x00, 0x05, 0xa8, 0x7b, 0x00, 0x2c, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x08, 0x0c, 0x70, 0x12, 0x01, 0x2e, 0x00, 0x05, 0xa8, 0x7b, 0x00, 0x28, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x70, 0x12, 0x01, 0x2e, + 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x05, 0x00, 0xd6, 0x00, 0xc6, 0x00, 0x36, + 0x00, 0x26, 0x00, 0x16, 0x00, 0xb6, 0x70, 0x07, 0x00, 0x01, 0xaa, 0x74, + 0x92, 0x82, 0x00, 0x04, 0x1a, 0x04, 0x81, 0xd6, 0xa9, 0x7c, 0x91, 0x88, + 0x10, 0x00, 0x21, 0x04, 0x90, 0x5d, 0xb8, 0x04, 0xd2, 0x84, 0x01, 0x40, + 0x05, 0xe8, 0x80, 0x07, 0x90, 0x84, 0x00, 0xff, 0x90, 0x84, 0x00, 0x06, + 0x11, 0x08, 0x04, 0xb0, 0x2b, 0x10, 0x08, 0x0c, 0xb1, 0x16, 0x11, 0x18, + 0x08, 0x0c, 0xb1, 0xdd, 0x05, 0xa8, 0x62, 0x12, 0xa8, 0x74, 0x00, 0x02, + 0x81, 0xb4, 0x81, 0xb9, 0x81, 0xbc, 0x81, 0xc2, 0x20, 0x19, 0x00, 0x02, + 0x08, 0x0c, 0xe9, 0xf9, 0x00, 0x60, 0x08, 0x0c, 0xe9, 0x84, 0x00, 0x48, + 0x20, 0x19, 0x00, 0x02, 0xa9, 0x80, 0x08, 0x0c, 0xe9, 0xa3, 0x00, 0x18, + 0xa9, 0x80, 0x08, 0x0c, 0xe9, 0x84, 0x08, 0x0c, 0xb1, 0x6c, 0xa8, 0x87, + 0x00, 0x00, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x70, 0x12, + 0x01, 0x2e, 0x00, 0xbe, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x3e, 0x00, 0xce, + 0x00, 0xde, 0x00, 0x05, 0xa8, 0x87, 0x00, 0x06, 0x0c, 0x80, 0xa8, 0x87, + 0x00, 0x02, 0x0c, 0x68, 0xa8, 0x87, 0x00, 0x05, 0x0c, 0x50, 0xa8, 0x87, + 0x00, 0x04, 0x0c, 0x38, 0xa8, 0x87, 0x00, 0x07, 0x0c, 0x20, 0x20, 0x91, + 0x80, 0x00, 0x0e, 0x04, 0x81, 0xe7, 0x00, 0x06, 0x00, 0x16, 0x20, 0x01, + 0x80, 0x03, 0x00, 0x06, 0x08, 0x04, 0x0d, 0x8e, 0x20, 0x01, 0x18, 0x34, + 0x20, 0x04, 0x90, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0xf6, 0x20, 0x79, + 0x03, 0x00, 0x20, 0x01, 0x02, 0x00, 0x20, 0x0c, 0xc1, 0xe5, 0xc1, 0xdc, + 0x21, 0x02, 0x20, 0x09, 0x02, 0x18, 0x21, 0x0c, 0xd1, 0xec, 0x11, 0x20, + 0x08, 0x0c, 0x16, 0x48, 0x00, 0xfe, 0x00, 0x05, 0x20, 0x01, 0x02, 0x0d, + 0x20, 0x03, 0x00, 0x20, 0x78, 0x1f, 0x03, 0x00, 0x00, 0xfe, 0x00, 0x05, + 0x78, 0x1c, 0xd0, 0x8c, 0x09, 0x04, 0x82, 0x68, 0x68, 0xc0, 0x90, 0xaa, + 0x00, 0x05, 0x0a, 0x04, 0x88, 0x90, 0x7d, 0x44, 0x7c, 0x40, 0xd5, 0x9c, + 0x19, 0x0c, 0x0d, 0x85, 0x95, 0x84, 0x00, 0xf6, 0x15, 0x08, 0x94, 0x84, + 0x70, 0x00, 0x01, 0x38, 0x90, 0x8a, 0x20, 0x00, 0x12, 0x58, 0x95, 0x84, + 0x07, 0x00, 0x80, 0x07, 0x04, 0xf0, 0x70, 0x00, 0x90, 0x84, 0xff, 0x00, + 0x90, 0x86, 0x81, 0x00, 0x0d, 0xb0, 0x00, 0xb0, 0x94, 0x84, 0x0f, 0xff, + 0x11, 0x30, 0x70, 0x00, 0x90, 0x84, 0xff, 0x00, 0x90, 0x86, 0x81, 0x00, + 0x11, 0xc0, 0x08, 0x0c, 0xee, 0xb1, 0x08, 0x0c, 0x87, 0x77, 0x78, 0x17, + 0x01, 0x40, 0x00, 0xa8, 0x95, 0x84, 0x00, 0x76, 0x11, 0x18, 0x08, 0x0c, + 0x87, 0xd3, 0x19, 0xc8, 0xd5, 0xa4, 0x01, 0x48, 0x00, 0x46, 0x00, 0x56, + 0x08, 0x0c, 0x82, 0xb8, 0x08, 0x0c, 0x21, 0x85, 0x00, 0x5e, 0x00, 0x4e, + 0x00, 0x20, 0x08, 0x0c, 0xee, 0xb1, 0x78, 0x17, 0x01, 0x40, 0x08, 0x0c, + 0x77, 0x9e, 0x01, 0x68, 0x20, 0x01, 0x01, 0x11, 0x20, 0x04, 0xd0, 0x8c, + 0x01, 0x40, 0x68, 0x93, 0x00, 0x00, 0x20, 0x01, 0x01, 0x10, 0x20, 0x03, + 0x00, 0x08, 0x20, 0x03, 0x00, 0x00, 0x04, 0x89, 0x00, 0x05, 0x00, 0x02, + 0x82, 0x75, 0x85, 0x85, 0x82, 0x72, 0x82, 0x72, 0x82, 0x72, 0x82, 0x72, + 0x82, 0x72, 0x82, 0x72, 0x78, 0x17, 0x01, 0x40, 0x00, 0x05, 0x70, 0x00, + 0x90, 0x8c, 0xff, 0x00, 0x91, 0x94, 0xf0, 0x00, 0x81, 0x0f, 0x94, 0x84, + 0x0f, 0xff, 0x68, 0x92, 0x92, 0x86, 0x20, 0x00, 0x11, 0x50, 0x68, 0x00, + 0x90, 0x86, 0x00, 0x01, 0x11, 0x18, 0x08, 0x0c, 0x58, 0xaa, 0x00, 0x70, + 0x08, 0x0c, 0x82, 0xd8, 0x00, 0x58, 0x92, 0x86, 0x30, 0x00, 0x11, 0x18, + 0x08, 0x0c, 0x84, 0xbf, 0x00, 0x28, 0x92, 0x86, 0x80, 0x00, 0x11, 0x10, + 0x08, 0x0c, 0x86, 0xa4, 0x78, 0x17, 0x01, 0x40, 0x00, 0x05, 0x20, 0x01, + 0x18, 0x10, 0x20, 0x04, 0xd0, 0x8c, 0x01, 0x78, 0x20, 0x01, 0x18, 0x00, + 0x20, 0x04, 0x90, 0x86, 0x00, 0x03, 0x11, 0x48, 0x00, 0x26, 0x00, 0x36, + 0x20, 0x11, 0x80, 0x48, 0x25, 0x18, 0x08, 0x0c, 0x4c, 0xa1, 0x00, 0x3e, + 0x00, 0x2e, 0x00, 0x05, 0x00, 0x36, 0x00, 0x46, 0x00, 0x56, 0x00, 0xf6, + 0x20, 0x79, 0x02, 0x00, 0x20, 0x19, 0xff, 0xfe, 0x7c, 0x30, 0x00, 0x50, + 0x00, 0x36, 0x00, 0x46, 0x00, 0x56, 0x00, 0xf6, 0x20, 0x79, 0x02, 0x00, + 0x7d, 0x44, 0x7c, 0x40, 0x20, 0x19, 0xff, 0xff, 0x20, 0x01, 0x18, 0x10, + 0x20, 0x04, 0xd0, 0x8c, 0x01, 0x60, 0x20, 0x01, 0x18, 0x00, 0x20, 0x04, + 0x90, 0x86, 0x00, 0x03, 0x11, 0x30, 0x00, 0x26, 0x20, 0x11, 0x80, 0x48, + 0x08, 0x0c, 0x4c, 0xa1, 0x00, 0x2e, 0x00, 0xfe, 0x00, 0x5e, 0x00, 0x4e, + 0x00, 0x3e, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xc6, 0x70, 0x10, 0x90, 0x84, + 0xff, 0x00, 0x80, 0x07, 0x90, 0x96, 0x00, 0x01, 0x01, 0x20, 0x90, 0x96, + 0x00, 0x23, 0x19, 0x04, 0x84, 0x90, 0x91, 0x86, 0x00, 0x23, 0x15, 0xc0, + 0x08, 0x0c, 0x87, 0x42, 0x09, 0x04, 0x84, 0x90, 0x61, 0x20, 0x91, 0x86, + 0x00, 0x01, 0x01, 0x50, 0x91, 0x86, 0x00, 0x04, 0x01, 0x38, 0x91, 0x86, + 0x00, 0x08, 0x01, 0x20, 0x91, 0x86, 0x00, 0x0a, 0x19, 0x04, 0x84, 0x90, + 0x71, 0x24, 0x61, 0x0a, 0x70, 0x30, 0x90, 0x8e, 0x02, 0x00, 0x11, 0x30, + 0x20, 0x09, 0x00, 0x15, 0x08, 0x0c, 0xb2, 0x0a, 0x08, 0x04, 0x84, 0x90, + 0x90, 0x8e, 0x02, 0x14, 0x01, 0x18, 0x90, 0x8e, 0x02, 0x10, 0x11, 0x30, + 0x20, 0x09, 0x00, 0x15, 0x08, 0x0c, 0xb2, 0x0a, 0x08, 0x04, 0x84, 0x90, + 0x90, 0x8e, 0x01, 0x00, 0x19, 0x04, 0x84, 0x90, 0x70, 0x34, 0x90, 0x05, + 0x19, 0x04, 0x84, 0x90, 0x20, 0x09, 0x00, 0x16, 0x08, 0x0c, 0xb2, 0x0a, + 0x08, 0x04, 0x84, 0x90, 0x91, 0x86, 0x00, 0x22, 0x19, 0x04, 0x84, 0x90, + 0x70, 0x30, 0x90, 0x8e, 0x03, 0x00, 0x15, 0x80, 0x68, 0xdc, 0xd0, 0xa4, + 0x05, 0x28, 0xc0, 0xb5, 0x68, 0xde, 0x71, 0x00, 0x91, 0x8c, 0x00, 0xff, + 0x69, 0x7e, 0x70, 0x04, 0x68, 0x82, 0x00, 0xf6, 0x20, 0x79, 0x01, 0x00, + 0x79, 0xe6, 0x78, 0xea, 0x00, 0x06, 0x90, 0x84, 0x00, 0xff, 0x00, 0x16, + 0x20, 0x08, 0x08, 0x0c, 0x26, 0xd5, 0x79, 0x32, 0x79, 0x36, 0x00, 0x1e, + 0x00, 0x0e, 0x00, 0xfe, 0x08, 0x0c, 0x26, 0x8c, 0x69, 0x5e, 0x70, 0x3c, + 0x00, 0xe6, 0x20, 0x71, 0x01, 0x40, 0x70, 0x86, 0x20, 0x71, 0x18, 0x00, + 0x70, 0xb6, 0x00, 0xee, 0x70, 0x34, 0x90, 0x05, 0x19, 0x04, 0x84, 0x90, + 0x20, 0x09, 0x00, 0x17, 0x08, 0x04, 0x84, 0x40, 0x90, 0x8e, 0x04, 0x00, + 0x11, 0x90, 0x70, 0x34, 0x90, 0x05, 0x19, 0x04, 0x84, 0x90, 0x08, 0x0c, + 0x77, 0x9e, 0x01, 0x20, 0x20, 0x09, 0x00, 0x1d, 0x08, 0x04, 0x84, 0x40, + 0x68, 0xdc, 0xc0, 0xa5, 0x68, 0xde, 0x20, 0x09, 0x00, 0x30, 0x08, 0x04, + 0x84, 0x40, 0x90, 0x8e, 0x05, 0x00, 0x11, 0x40, 0x70, 0x34, 0x90, 0x05, + 0x19, 0x04, 0x84, 0x90, 0x20, 0x09, 0x00, 0x18, 0x08, 0x04, 0x84, 0x40, + 0x90, 0x8e, 0x20, 0x10, 0x11, 0x20, 0x20, 0x09, 0x00, 0x19, 0x08, 0x04, + 0x84, 0x40, 0x90, 0x8e, 0x21, 0x10, 0x11, 0x20, 0x20, 0x09, 0x00, 0x1a, + 0x08, 0x04, 0x84, 0x40, 0x90, 0x8e, 0x52, 0x00, 0x11, 0x40, 0x70, 0x34, + 0x90, 0x05, 0x19, 0x04, 0x84, 0x90, 0x20, 0x09, 0x00, 0x1b, 0x08, 0x04, + 0x84, 0x40, 0x90, 0x8e, 0x50, 0x00, 0x11, 0x40, 0x70, 0x34, 0x90, 0x05, + 0x19, 0x04, 0x84, 0x90, 0x20, 0x09, 0x00, 0x1c, 0x08, 0x04, 0x84, 0x40, + 0x90, 0x8e, 0x13, 0x00, 0x11, 0x20, 0x20, 0x09, 0x00, 0x34, 0x08, 0x04, + 0x84, 0x40, 0x90, 0x8e, 0x12, 0x00, 0x11, 0x40, 0x70, 0x34, 0x90, 0x05, + 0x19, 0x04, 0x84, 0x90, 0x20, 0x09, 0x00, 0x24, 0x08, 0x04, 0x84, 0x40, + 0x90, 0x8c, 0xff, 0x00, 0x91, 0x8e, 0x24, 0x00, 0x11, 0x70, 0x20, 0x09, + 0x00, 0x2d, 0x20, 0x01, 0x18, 0x10, 0x20, 0x04, 0xd0, 0x9c, 0x09, 0x04, + 0x84, 0x40, 0x08, 0x0c, 0xdd, 0x8d, 0x19, 0x04, 0x84, 0x90, 0x08, 0x04, + 0x84, 0x3e, 0x90, 0x8c, 0xff, 0x00, 0x91, 0x8e, 0x53, 0x00, 0x11, 0x20, + 0x20, 0x09, 0x00, 0x2a, 0x08, 0x04, 0x84, 0x40, 0x90, 0x8e, 0x0f, 0x00, + 0x11, 0x20, 0x20, 0x09, 0x00, 0x20, 0x08, 0x04, 0x84, 0x40, 0x90, 0x8e, + 0x61, 0x04, 0x15, 0x30, 0x20, 0x29, 0x02, 0x05, 0x20, 0x11, 0x02, 0x6d, + 0x82, 0x08, 0x22, 0x04, 0x90, 0x82, 0x00, 0x04, 0x80, 0x04, 0x80, 0x04, + 0x20, 0xa8, 0x20, 0x11, 0x80, 0x15, 0x21, 0x1c, 0x81, 0x08, 0x00, 0x46, + 0x21, 0x24, 0x08, 0x0c, 0x4c, 0xa1, 0x00, 0x4e, 0x81, 0x08, 0x0f, 0x04, + 0x83, 0xf4, 0x91, 0x86, 0x02, 0x80, 0x1d, 0x88, 0x25, 0x04, 0x80, 0x00, + 0x20, 0x2a, 0x20, 0x09, 0x02, 0x60, 0x0c, 0x58, 0x20, 0x2b, 0x00, 0x00, + 0x20, 0x09, 0x00, 0x23, 0x08, 0x04, 0x84, 0x40, 0x90, 0x8e, 0x60, 0x00, + 0x11, 0x20, 0x20, 0x09, 0x00, 0x3f, 0x08, 0x04, 0x84, 0x40, 0x90, 0x8e, + 0x54, 0x00, 0x11, 0x38, 0x08, 0x0c, 0x88, 0x40, 0x19, 0x04, 0x84, 0x90, + 0x20, 0x09, 0x00, 0x46, 0x04, 0xa8, 0x90, 0x8e, 0x55, 0x00, 0x11, 0x48, + 0x08, 0x0c, 0x88, 0x68, 0x11, 0x18, 0x20, 0x09, 0x00, 0x41, 0x04, 0x60, + 0x20, 0x09, 0x00, 0x42, 0x04, 0x48, 0x90, 0x8e, 0x78, 0x00, 0x11, 0x18, + 0x20, 0x09, 0x00, 0x45, 0x04, 0x18, 0x90, 0x8e, 0x10, 0x00, 0x11, 0x18, + 0x20, 0x09, 0x00, 0x4e, 0x00, 0xe8, 0x90, 0x8e, 0x63, 0x00, 0x11, 0x18, + 0x20, 0x09, 0x00, 0x4a, 0x00, 0xb8, 0x90, 0x8c, 0xff, 0x00, 0x91, 0x8e, + 0x56, 0x00, 0x11, 0x18, 0x20, 0x09, 0x00, 0x4f, 0x00, 0x78, 0x90, 0x8c, + 0xff, 0x00, 0x91, 0x8e, 0x57, 0x00, 0x11, 0x18, 0x20, 0x09, 0x00, 0x50, + 0x00, 0x38, 0x20, 0x09, 0x00, 0x1d, 0x68, 0x38, 0xd0, 0xd4, 0x01, 0x10, + 0x20, 0x09, 0x00, 0x4c, 0x00, 0x16, 0x20, 0x11, 0x02, 0x63, 0x22, 0x04, + 0x82, 0x11, 0x22, 0x0c, 0x08, 0x0c, 0x26, 0x8c, 0x19, 0x04, 0x84, 0x93, + 0x08, 0x0c, 0x67, 0x49, 0x19, 0x04, 0x84, 0x93, 0xbe, 0x12, 0xbd, 0x16, + 0x00, 0x1e, 0x00, 0x16, 0x08, 0x0c, 0x77, 0x9e, 0x01, 0xc0, 0x68, 0xdc, + 0xd0, 0x8c, 0x11, 0x48, 0x70, 0x00, 0x90, 0x84, 0x00, 0xff, 0x11, 0x88, + 0x70, 0x04, 0x90, 0x84, 0xff, 0x00, 0x11, 0x68, 0x00, 0x40, 0x68, 0x7c, + 0x96, 0x06, 0x11, 0x48, 0x68, 0x80, 0x95, 0x06, 0x90, 0x84, 0xff, 0x00, + 0x11, 0x20, 0x95, 0x84, 0x00, 0xff, 0xb8, 0x86, 0x00, 0x80, 0xb8, 0x84, + 0x90, 0x05, 0x11, 0x68, 0x91, 0x86, 0x00, 0x46, 0x11, 0x50, 0x68, 0x7c, + 0x96, 0x06, 0x11, 0x38, 0x68, 0x80, 0x95, 0x06, 0x90, 0x84, 0xff, 0x00, + 0x11, 0x10, 0x00, 0x1e, 0x00, 0x98, 0x08, 0x0c, 0xb1, 0x16, 0x01, 0xa8, + 0x2b, 0x08, 0x61, 0x12, 0x60, 0x23, 0x00, 0x04, 0x71, 0x20, 0x61, 0x0a, + 0x00, 0x1e, 0x91, 0x86, 0x00, 0x4c, 0x11, 0x10, 0x60, 0x23, 0x00, 0x0a, + 0x00, 0x16, 0x00, 0x1e, 0x08, 0x0c, 0xb2, 0x0a, 0x00, 0xce, 0x00, 0xbe, + 0x00, 0x05, 0x00, 0x1e, 0x0c, 0xd8, 0x20, 0x01, 0x18, 0x0e, 0x20, 0x04, + 0xd0, 0xec, 0x01, 0x20, 0x20, 0x11, 0x80, 0x49, 0x08, 0x0c, 0x4c, 0xa1, + 0x08, 0x0c, 0xb1, 0xdd, 0x0d, 0x90, 0x2b, 0x08, 0x61, 0x12, 0x60, 0x23, + 0x00, 0x04, 0x71, 0x20, 0x61, 0x0a, 0x00, 0x1e, 0x00, 0x16, 0x91, 0x86, + 0x00, 0x17, 0x01, 0x18, 0x91, 0x86, 0x00, 0x30, 0x11, 0x28, 0x60, 0x07, + 0x00, 0x09, 0x60, 0x17, 0x29, 0x00, 0x00, 0x20, 0x60, 0x07, 0x00, 0x51, + 0x60, 0x17, 0x00, 0x00, 0x60, 0x2f, 0x00, 0x09, 0x60, 0x03, 0x00, 0x01, + 0x08, 0x0c, 0x96, 0x1e, 0x08, 0xa0, 0x08, 0x0c, 0x88, 0xaf, 0x11, 0x58, + 0x08, 0x0c, 0x34, 0x4c, 0x11, 0x40, 0x70, 0x10, 0x90, 0x84, 0xff, 0x00, + 0x80, 0x07, 0x90, 0x8e, 0x00, 0x08, 0x11, 0x08, 0x00, 0x09, 0x00, 0x05, + 0x00, 0xb6, 0x00, 0xc6, 0x00, 0x46, 0x70, 0x00, 0x90, 0x8c, 0xff, 0x00, + 0x81, 0x0f, 0x91, 0x86, 0x00, 0x33, 0x11, 0xe8, 0x08, 0x0c, 0x87, 0x42, + 0x09, 0x04, 0x85, 0x1d, 0x71, 0x24, 0x61, 0x0a, 0x70, 0x30, 0x90, 0x8e, + 0x02, 0x00, 0x11, 0x40, 0x70, 0x34, 0x90, 0x05, 0x15, 0xc0, 0x20, 0x09, + 0x00, 0x15, 0x08, 0x0c, 0xb2, 0x0a, 0x04, 0x98, 0x90, 0x8e, 0x01, 0x00, + 0x15, 0x80, 0x70, 0x34, 0x90, 0x05, 0x15, 0x68, 0x20, 0x09, 0x00, 0x16, + 0x08, 0x0c, 0xb2, 0x0a, 0x04, 0x40, 0x91, 0x86, 0x00, 0x32, 0x15, 0x28, + 0x70, 0x30, 0x90, 0x8e, 0x14, 0x00, 0x15, 0x08, 0x20, 0x09, 0x00, 0x38, + 0x00, 0x16, 0x20, 0x11, 0x02, 0x63, 0x22, 0x04, 0x82, 0x11, 0x22, 0x0c, + 0x08, 0x0c, 0x26, 0x8c, 0x11, 0xa8, 0x08, 0x0c, 0x67, 0x49, 0x11, 0x90, + 0xbe, 0x12, 0xbd, 0x16, 0x08, 0x0c, 0xb1, 0x16, 0x01, 0x68, 0x2b, 0x08, + 0x61, 0x12, 0x08, 0x0c, 0xd3, 0xb6, 0x60, 0x23, 0x00, 0x04, 0x71, 0x20, + 0x61, 0x0a, 0x00, 0x1e, 0x08, 0x0c, 0xb2, 0x0a, 0x00, 0x10, 0x00, 0xce, + 0x00, 0x1e, 0x00, 0x4e, 0x00, 0xce, 0x00, 0xbe, 0x00, 0x05, 0x00, 0xb6, + 0x00, 0x46, 0x00, 0xe6, 0x00, 0xd6, 0x20, 0x28, 0x21, 0x30, 0x96, 0x96, + 0x00, 0xff, 0x11, 0xb8, 0x95, 0x92, 0xff, 0xfc, 0x02, 0xa0, 0x95, 0x96, + 0xff, 0xfd, 0x11, 0x20, 0x20, 0x09, 0x00, 0x7f, 0x08, 0x04, 0x85, 0x7f, + 0x95, 0x96, 0xff, 0xfe, 0x11, 0x20, 0x20, 0x09, 0x00, 0x7e, 0x08, 0x04, + 0x85, 0x7f, 0x95, 0x96, 0xff, 0xfc, 0x11, 0x18, 0x20, 0x09, 0x00, 0x80, + 0x04, 0xf0, 0x20, 0x11, 0x00, 0x00, 0x20, 0x19, 0x18, 0x37, 0x23, 0x1c, + 0xd3, 0xac, 0x01, 0x30, 0x90, 0x26, 0x20, 0xa9, 0x08, 0x00, 0x20, 0x71, + 0x10, 0x00, 0x00, 0x30, 0x20, 0x21, 0x00, 0x81, 0x20, 0xa9, 0x07, 0x7f, + 0x20, 0x71, 0x10, 0x81, 0x2e, 0x1c, 0x93, 0xdd, 0x00, 0x00, 0x11, 0x40, + 0x82, 0xff, 0x11, 0xd0, 0x94, 0x96, 0x00, 0xff, 0x01, 0xb8, 0x24, 0x10, + 0xc2, 0xfd, 0x00, 0xa0, 0xbf, 0x10, 0x26, 0x00, 0x97, 0x06, 0xb8, 0x14, + 0x11, 0x20, 0x95, 0x46, 0x11, 0x10, 0x24, 0x08, 0x00, 0xb0, 0x97, 0x45, + 0x11, 0x48, 0x94, 0xc6, 0x00, 0x7e, 0x01, 0x30, 0x94, 0xc6, 0x00, 0x7f, + 0x01, 0x18, 0x94, 0xc6, 0x00, 0x80, 0x1d, 0x20, 0x84, 0x20, 0x8e, 0x70, + 0x1f, 0x04, 0x85, 0x54, 0x82, 0xff, 0x11, 0x18, 0x90, 0x85, 0x00, 0x01, + 0x00, 0x18, 0xc2, 0xfc, 0x22, 0x08, 0x90, 0x06, 0x00, 0xde, 0x00, 0xee, + 0x00, 0x4e, 0x00, 0xbe, 0x00, 0x05, 0x20, 0x01, 0x18, 0x37, 0x20, 0x0c, + 0x91, 0x84, 0x00, 0x80, 0x01, 0x10, 0xd1, 0x8c, 0x01, 0x38, 0x70, 0x00, + 0x90, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0x91, 0x84, 0x00, 0x0f, 0x00, 0x1a, + 0x78, 0x17, 0x01, 0x40, 0x00, 0x05, 0x85, 0xa7, 0x85, 0xa7, 0x85, 0xa7, + 0x87, 0x54, 0x85, 0xa7, 0x85, 0xaa, 0x85, 0xcf, 0x86, 0x58, 0x85, 0xa7, + 0x85, 0xa7, 0x85, 0xa7, 0x85, 0xa7, 0x85, 0xa7, 0x85, 0xa7, 0x85, 0xa7, + 0x85, 0xa7, 0x78, 0x17, 0x01, 0x40, 0x00, 0x05, 0x00, 0xb6, 0x71, 0x10, + 0xd1, 0xbc, 0x01, 0xe8, 0x71, 0x20, 0x21, 0x60, 0x9c, 0x8c, 0x00, 0x03, + 0x11, 0xc0, 0x9c, 0x8a, 0x1d, 0xdc, 0x02, 0xa8, 0x68, 0x68, 0x9c, 0x02, + 0x12, 0x90, 0x70, 0x08, 0x90, 0x84, 0x00, 0xff, 0x61, 0x10, 0x21, 0x58, + 0xb9, 0x10, 0x91, 0x06, 0x11, 0x50, 0x70, 0x0c, 0xb9, 0x14, 0x91, 0x06, + 0x11, 0x30, 0x71, 0x24, 0x61, 0x0a, 0x20, 0x09, 0x00, 0x46, 0x08, 0x0c, + 0xb2, 0x0a, 0x78, 0x17, 0x01, 0x40, 0x00, 0xbe, 0x00, 0x05, 0x00, 0xb6, + 0x00, 0xc6, 0x94, 0x84, 0x0f, 0xff, 0x09, 0x04, 0x86, 0x34, 0x71, 0x10, + 0xd1, 0xbc, 0x19, 0x04, 0x86, 0x34, 0x71, 0x08, 0x70, 0x0c, 0x20, 0x28, + 0x91, 0x8c, 0x00, 0xff, 0x21, 0x30, 0x90, 0x94, 0xff, 0x00, 0x15, 0xc8, + 0x81, 0xff, 0x15, 0xb8, 0x90, 0x80, 0x34, 0x8e, 0x20, 0x0d, 0x91, 0x8c, + 0xff, 0x00, 0x81, 0x0f, 0x20, 0x01, 0x00, 0x80, 0x91, 0x06, 0x09, 0x04, + 0x86, 0x34, 0x91, 0x82, 0x08, 0x01, 0x1a, 0x04, 0x86, 0x34, 0x91, 0x90, + 0x10, 0x00, 0x22, 0x04, 0x90, 0x5d, 0x05, 0xe0, 0xbe, 0x12, 0xbd, 0x16, + 0xb8, 0x00, 0xd0, 0xec, 0x15, 0xb8, 0xba, 0x04, 0x92, 0x94, 0xff, 0x00, + 0x92, 0x86, 0x06, 0x00, 0x11, 0x90, 0x08, 0x0c, 0xb1, 0x16, 0x05, 0x98, + 0x2b, 0x08, 0x70, 0x28, 0x60, 0x4e, 0x70, 0x2c, 0x60, 0x52, 0x61, 0x12, + 0x60, 0x23, 0x00, 0x06, 0x71, 0x20, 0x61, 0x0a, 0x71, 0x30, 0x61, 0x5e, + 0x08, 0x0c, 0xe0, 0x09, 0x00, 0xf8, 0x08, 0x0c, 0x6c, 0x11, 0x11, 0x38, + 0xb8, 0x07, 0x06, 0x06, 0x0c, 0x40, 0x19, 0x0c, 0x85, 0x21, 0x11, 0xb0, + 0x08, 0x80, 0x08, 0x0c, 0xb1, 0x16, 0x2b, 0x08, 0x01, 0x88, 0x61, 0x12, + 0x60, 0x23, 0x00, 0x04, 0x71, 0x20, 0x61, 0x0a, 0x92, 0x86, 0x04, 0x00, + 0x11, 0x18, 0x60, 0x07, 0x00, 0x05, 0x00, 0x10, 0x60, 0x07, 0x00, 0x01, + 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x96, 0x1e, 0x78, 0x17, 0x01, 0x40, + 0x00, 0xce, 0x00, 0xbe, 0x00, 0x05, 0x20, 0x01, 0x18, 0x0e, 0x20, 0x04, + 0xd0, 0xec, 0x01, 0x20, 0x20, 0x11, 0x80, 0x49, 0x08, 0x0c, 0x4c, 0xa1, + 0x08, 0x0c, 0xb1, 0xdd, 0x0d, 0x78, 0x2b, 0x08, 0x61, 0x12, 0x60, 0x23, + 0x00, 0x06, 0x71, 0x20, 0x61, 0x0a, 0x71, 0x30, 0x61, 0x5e, 0x60, 0x17, + 0xf3, 0x00, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x41, 0x20, 0x09, + 0xa0, 0x22, 0x08, 0x0c, 0x96, 0x17, 0x08, 0xe0, 0x00, 0xb6, 0x71, 0x10, + 0xd1, 0xbc, 0x05, 0xd0, 0x70, 0x20, 0x20, 0x60, 0x9c, 0x84, 0x00, 0x03, + 0x15, 0xa8, 0x9c, 0x82, 0x1d, 0xdc, 0x06, 0x90, 0x68, 0x68, 0x9c, 0x02, + 0x16, 0x78, 0x94, 0x84, 0x0f, 0xff, 0x90, 0x82, 0x00, 0x0c, 0x06, 0x50, + 0x70, 0x08, 0x90, 0x84, 0x00, 0xff, 0x61, 0x10, 0x21, 0x58, 0xb9, 0x10, + 0x91, 0x06, 0x15, 0x10, 0x70, 0x0c, 0xb9, 0x14, 0x91, 0x06, 0x11, 0xf0, + 0x71, 0x24, 0x61, 0x0a, 0x60, 0x1c, 0xd0, 0xfc, 0x11, 0xc8, 0x20, 0x01, + 0x02, 0x71, 0x20, 0x04, 0x90, 0x05, 0x11, 0x80, 0x94, 0x84, 0x0f, 0xff, + 0x90, 0x82, 0x00, 0x0c, 0x01, 0x58, 0x00, 0x66, 0x20, 0x31, 0x01, 0x00, + 0xa0, 0x01, 0xa0, 0x01, 0x86, 0x31, 0x1d, 0xe0, 0x00, 0x6e, 0x60, 0x1c, + 0xd0, 0xfc, 0x11, 0x20, 0x20, 0x09, 0x00, 0x45, 0x08, 0x0c, 0xb2, 0x0a, + 0x78, 0x17, 0x01, 0x40, 0x00, 0xbe, 0x00, 0x05, 0x61, 0x20, 0x91, 0x86, + 0x00, 0x02, 0x01, 0x28, 0x91, 0x86, 0x00, 0x05, 0x01, 0x10, 0x90, 0x85, + 0x00, 0x01, 0x00, 0x05, 0x08, 0x0c, 0x88, 0xaf, 0x11, 0x80, 0x08, 0x0c, + 0x34, 0x4c, 0x11, 0x68, 0x70, 0x10, 0x90, 0x84, 0xff, 0x00, 0x80, 0x07, + 0x90, 0x86, 0x00, 0x00, 0x11, 0x30, 0x91, 0x84, 0x00, 0x0f, 0x90, 0x8a, + 0x00, 0x06, 0x12, 0x08, 0x00, 0x0b, 0x00, 0x05, 0x86, 0xbe, 0x86, 0xbf, + 0x86, 0xbe, 0x86, 0xbe, 0x87, 0x24, 0x87, 0x33, 0x00, 0x05, 0x00, 0xb6, + 0x70, 0x0c, 0x71, 0x08, 0x08, 0x0c, 0x26, 0x8c, 0x19, 0x04, 0x87, 0x22, + 0x08, 0x0c, 0x67, 0x49, 0x19, 0x04, 0x87, 0x22, 0xbe, 0x12, 0xbd, 0x16, + 0x71, 0x10, 0xd1, 0xbc, 0x05, 0x40, 0x70, 0x2c, 0xd0, 0x84, 0x11, 0x20, + 0xb8, 0x00, 0xd0, 0xbc, 0x19, 0x04, 0x87, 0x22, 0x08, 0x0c, 0x6c, 0x11, + 0x01, 0x48, 0x90, 0x86, 0x00, 0x04, 0x01, 0x30, 0x08, 0x0c, 0x6c, 0x19, + 0x01, 0x18, 0x90, 0x86, 0x00, 0x04, 0x15, 0x88, 0x00, 0xc6, 0x08, 0x0c, + 0x87, 0x42, 0x00, 0xce, 0x05, 0xd8, 0x08, 0x0c, 0xb1, 0x16, 0x2b, 0x08, + 0x05, 0xb8, 0x61, 0x12, 0x08, 0x0c, 0xd3, 0xb6, 0x60, 0x23, 0x00, 0x02, + 0x71, 0x20, 0x61, 0x0a, 0x20, 0x09, 0x00, 0x88, 0x08, 0x0c, 0xb2, 0x0a, + 0x04, 0x58, 0x08, 0x0c, 0x6c, 0x11, 0x01, 0x48, 0x90, 0x86, 0x00, 0x04, + 0x01, 0x30, 0x08, 0x0c, 0x6c, 0x19, 0x01, 0x18, 0x90, 0x86, 0x00, 0x04, + 0x11, 0x80, 0x08, 0x0c, 0xb1, 0x16, 0x2b, 0x08, 0x01, 0xd8, 0x61, 0x12, + 0x08, 0x0c, 0xd3, 0xb6, 0x60, 0x23, 0x00, 0x05, 0x71, 0x20, 0x61, 0x0a, + 0x20, 0x09, 0x00, 0x88, 0x08, 0x0c, 0xb2, 0x0a, 0x00, 0x78, 0x08, 0x0c, + 0xb1, 0x16, 0x2b, 0x08, 0x01, 0x58, 0x61, 0x12, 0x08, 0x0c, 0xd3, 0xb6, + 0x60, 0x23, 0x00, 0x04, 0x71, 0x20, 0x61, 0x0a, 0x20, 0x09, 0x00, 0x01, + 0x08, 0x0c, 0xb2, 0x0a, 0x00, 0xbe, 0x00, 0x05, 0x71, 0x10, 0xd1, 0xbc, + 0x01, 0x58, 0x00, 0xd1, 0x01, 0x48, 0x08, 0x0c, 0x86, 0x9a, 0x11, 0x30, + 0x71, 0x24, 0x61, 0x0a, 0x20, 0x09, 0x00, 0x89, 0x08, 0x0c, 0xb2, 0x0a, + 0x00, 0x05, 0x71, 0x10, 0xd1, 0xbc, 0x01, 0x58, 0x00, 0x59, 0x01, 0x48, + 0x08, 0x0c, 0x86, 0x9a, 0x11, 0x30, 0x71, 0x24, 0x61, 0x0a, 0x20, 0x09, + 0x00, 0x8a, 0x08, 0x0c, 0xb2, 0x0a, 0x00, 0x05, 0x70, 0x20, 0x20, 0x60, + 0x9c, 0x84, 0x00, 0x03, 0x11, 0x58, 0x9c, 0x82, 0x1d, 0xdc, 0x02, 0x40, + 0x20, 0x01, 0x18, 0x1a, 0x20, 0x04, 0x9c, 0x02, 0x12, 0x18, 0x90, 0x85, + 0x00, 0x01, 0x00, 0x05, 0x90, 0x06, 0x0c, 0xe8, 0x00, 0xb6, 0x71, 0x10, + 0xd1, 0xbc, 0x11, 0xd8, 0x70, 0x24, 0x20, 0x60, 0x9c, 0x84, 0x00, 0x03, + 0x11, 0xb0, 0x9c, 0x82, 0x1d, 0xdc, 0x02, 0x98, 0x68, 0x68, 0x9c, 0x02, + 0x12, 0x80, 0x70, 0x08, 0x90, 0x84, 0x00, 0xff, 0x61, 0x10, 0x21, 0x58, + 0xb9, 0x10, 0x91, 0x06, 0x11, 0x40, 0x70, 0x0c, 0xb9, 0x14, 0x91, 0x06, + 0x11, 0x20, 0x20, 0x09, 0x00, 0x51, 0x08, 0x0c, 0xb2, 0x0a, 0x78, 0x17, + 0x01, 0x40, 0x00, 0xbe, 0x00, 0x05, 0x20, 0x31, 0x01, 0x05, 0x00, 0x69, + 0x00, 0x05, 0x20, 0x31, 0x02, 0x06, 0x00, 0x49, 0x00, 0x05, 0x20, 0x31, + 0x02, 0x07, 0x00, 0x29, 0x00, 0x05, 0x20, 0x31, 0x02, 0x13, 0x00, 0x09, + 0x00, 0x05, 0x00, 0xc6, 0x00, 0x96, 0x00, 0xf6, 0x70, 0x00, 0x90, 0x84, + 0xf0, 0x00, 0x90, 0x86, 0xc0, 0x00, 0x05, 0xc0, 0x08, 0x0c, 0xb1, 0x16, + 0x05, 0xa8, 0x00, 0x66, 0x00, 0xc6, 0x00, 0x46, 0x20, 0x11, 0x02, 0x63, + 0x22, 0x04, 0x82, 0x11, 0x22, 0x0c, 0x08, 0x0c, 0x26, 0x8c, 0x15, 0x90, + 0x08, 0x0c, 0x67, 0x49, 0x15, 0x78, 0xbe, 0x12, 0xbd, 0x16, 0x2b, 0x00, + 0x00, 0x4e, 0x00, 0xce, 0x60, 0x12, 0x08, 0x0c, 0xd3, 0xb6, 0x08, 0x0c, + 0x10, 0x59, 0x05, 0x00, 0x29, 0x00, 0x60, 0x62, 0x90, 0x06, 0xa8, 0x02, + 0xa8, 0x66, 0xac, 0x6a, 0xa8, 0x5c, 0x90, 0xf8, 0x00, 0x1b, 0x20, 0xa9, + 0x00, 0x0e, 0xa8, 0x60, 0x20, 0xe8, 0x20, 0xe1, 0x00, 0x00, 0x2f, 0xa0, + 0x2e, 0x98, 0x40, 0x03, 0x00, 0x6e, 0x66, 0x16, 0x60, 0x07, 0x00, 0x3e, + 0x60, 0x23, 0x00, 0x01, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x96, 0x1e, + 0x00, 0xfe, 0x00, 0x9e, 0x00, 0xce, 0x00, 0x05, 0x08, 0x0c, 0xb1, 0x6c, + 0x00, 0x6e, 0x0c, 0xc0, 0x00, 0x4e, 0x00, 0xce, 0x0c, 0xc8, 0x00, 0xc6, + 0x70, 0x00, 0x90, 0x8c, 0xff, 0x00, 0x91, 0x84, 0xf0, 0x00, 0x81, 0x0f, + 0x90, 0x86, 0x20, 0x00, 0x19, 0x04, 0x88, 0x2a, 0x91, 0x86, 0x00, 0x22, + 0x15, 0xf0, 0x20, 0x01, 0x01, 0x11, 0x20, 0x04, 0x90, 0x05, 0x19, 0x04, + 0x88, 0x2c, 0x70, 0x30, 0x90, 0x8e, 0x04, 0x00, 0x09, 0x04, 0x88, 0x2c, + 0x90, 0x8e, 0x60, 0x00, 0x05, 0xe8, 0x90, 0x8e, 0x54, 0x00, 0x05, 0xd0, + 0x90, 0x8e, 0x03, 0x00, 0x11, 0xd8, 0x20, 0x09, 0x18, 0x37, 0x21, 0x0c, + 0xd1, 0x8c, 0x15, 0x90, 0xd1, 0xa4, 0x15, 0x80, 0x08, 0x0c, 0x6b, 0xcf, + 0x05, 0x88, 0x68, 0xb0, 0x90, 0x84, 0x00, 0xff, 0x71, 0x00, 0x91, 0x8c, + 0x00, 0xff, 0x91, 0x06, 0x15, 0x18, 0x68, 0x80, 0x69, 0xb0, 0x91, 0x8c, + 0xff, 0x00, 0x91, 0x05, 0x71, 0x04, 0x91, 0x06, 0x11, 0xd8, 0x00, 0xe0, + 0x20, 0x09, 0x01, 0x03, 0x21, 0x0c, 0xd1, 0xb4, 0x11, 0xa8, 0x90, 0x8e, + 0x52, 0x00, 0x09, 0xe8, 0x90, 0x8e, 0x05, 0x00, 0x09, 0xd0, 0x90, 0x8e, + 0x50, 0x00, 0x09, 0xb8, 0x00, 0x58, 0x91, 0x86, 0x00, 0x23, 0x11, 0x40, + 0x08, 0x0c, 0x87, 0x42, 0x01, 0x28, 0x60, 0x04, 0x90, 0x86, 0x00, 0x02, + 0x01, 0x18, 0x00, 0x00, 0x90, 0x06, 0x00, 0x10, 0x90, 0x85, 0x00, 0x01, + 0x00, 0xce, 0x00, 0x05, 0x70, 0x30, 0x90, 0x8e, 0x03, 0x00, 0x01, 0x18, + 0x90, 0x8e, 0x52, 0x00, 0x1d, 0x98, 0x20, 0x01, 0x18, 0x37, 0x20, 0x04, + 0x90, 0x84, 0x00, 0x09, 0x90, 0x86, 0x00, 0x08, 0x0d, 0x68, 0x0c, 0x50, + 0x01, 0x56, 0x00, 0x46, 0x00, 0x16, 0x00, 0x36, 0x70, 0x38, 0x20, 0x20, + 0x84, 0x27, 0x94, 0xa4, 0x00, 0x07, 0xd4, 0x84, 0x01, 0x48, 0x20, 0xa9, + 0x00, 0x04, 0x20, 0x19, 0x18, 0x05, 0x20, 0x11, 0x02, 0x7a, 0x08, 0x0c, + 0xc2, 0x0e, 0x11, 0x78, 0xd4, 0x8c, 0x01, 0x48, 0x20, 0xa9, 0x00, 0x04, + 0x20, 0x19, 0x18, 0x01, 0x20, 0x11, 0x02, 0x7e, 0x08, 0x0c, 0xc2, 0x0e, + 0x11, 0x20, 0xd4, 0x94, 0x01, 0x10, 0x90, 0x85, 0x00, 0x01, 0x00, 0x3e, + 0x00, 0x1e, 0x00, 0x4e, 0x01, 0x5e, 0x00, 0x05, 0x01, 0x56, 0x00, 0x46, + 0x00, 0x16, 0x00, 0x36, 0x70, 0x38, 0x20, 0x20, 0x84, 0x27, 0x94, 0xa4, + 0x00, 0x07, 0xd4, 0x84, 0x01, 0x48, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x19, + 0x18, 0x05, 0x20, 0x11, 0x02, 0x72, 0x08, 0x0c, 0xc2, 0x0e, 0x11, 0x78, + 0xd4, 0x8c, 0x01, 0x48, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x19, 0x18, 0x01, + 0x20, 0x11, 0x02, 0x76, 0x08, 0x0c, 0xc2, 0x0e, 0x11, 0x20, 0xd4, 0x94, + 0x01, 0x10, 0x90, 0x85, 0x00, 0x01, 0x00, 0x3e, 0x00, 0x1e, 0x00, 0x4e, + 0x01, 0x5e, 0x00, 0x05, 0x00, 0xf6, 0x20, 0x79, 0x02, 0x00, 0x78, 0x00, + 0xc0, 0xe5, 0xc0, 0xcc, 0x78, 0x02, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, + 0x20, 0x79, 0x18, 0x00, 0x78, 0x34, 0xd0, 0x84, 0x11, 0x30, 0x20, 0x79, + 0x02, 0x00, 0x78, 0x00, 0x90, 0x85, 0x12, 0x00, 0x78, 0x02, 0x00, 0xfe, + 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0x18, 0x00, 0x70, 0x34, 0xc0, 0x84, + 0x70, 0x36, 0x00, 0xee, 0x00, 0x05, 0x00, 0x16, 0x20, 0x01, 0x18, 0x37, + 0x20, 0x0c, 0x91, 0x84, 0x00, 0x80, 0x01, 0x18, 0xd1, 0x8c, 0x01, 0x18, + 0x90, 0x06, 0x00, 0x1e, 0x00, 0x05, 0x90, 0x85, 0x00, 0x01, 0x0c, 0xd8, + 0x20, 0x71, 0x1a, 0x04, 0x70, 0x03, 0x00, 0x03, 0x70, 0x0f, 0x03, 0x61, + 0x90, 0x06, 0x70, 0x1a, 0x70, 0x7a, 0x70, 0x12, 0x70, 0x17, 0x1d, 0xdc, + 0x70, 0x07, 0x00, 0x00, 0x70, 0x26, 0x70, 0x2b, 0xa2, 0xc0, 0x70, 0x32, + 0x70, 0x37, 0xa3, 0x3d, 0x70, 0x47, 0xff, 0xff, 0x70, 0x4a, 0x70, 0x4f, + 0x56, 0xc4, 0x70, 0x52, 0x70, 0x63, 0x8a, 0x66, 0x08, 0x0c, 0x10, 0x72, + 0x09, 0x0c, 0x0d, 0x85, 0x29, 0x00, 0x70, 0x42, 0xa8, 0x67, 0x00, 0x03, + 0xa8, 0x6f, 0x01, 0x00, 0xa8, 0xab, 0xdc, 0xb0, 0x00, 0x05, 0x20, 0x71, + 0x1a, 0x04, 0x1d, 0x04, 0x89, 0x82, 0x20, 0x91, 0x60, 0x00, 0x70, 0x0c, + 0x80, 0x01, 0x70, 0x0e, 0x15, 0x90, 0x20, 0x01, 0x01, 0x3c, 0x20, 0x04, + 0x90, 0x05, 0x19, 0x0c, 0x8b, 0x10, 0x20, 0x01, 0x18, 0x69, 0x20, 0x04, + 0xd0, 0xc4, 0x01, 0x58, 0x3a, 0x00, 0xd0, 0x8c, 0x11, 0x40, 0x20, 0xd1, + 0x00, 0x00, 0x20, 0xd1, 0x00, 0x01, 0x20, 0xd1, 0x00, 0x00, 0x08, 0x0c, + 0x0d, 0x85, 0x70, 0x0f, 0x03, 0x61, 0x70, 0x07, 0x00, 0x01, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x20, 0x69, 0x18, 0x00, 0x69, 0xec, 0xd1, 0xe4, + 0x11, 0x38, 0xd1, 0xdc, 0x11, 0x18, 0x08, 0x0c, 0x8a, 0xd4, 0x00, 0x10, + 0x08, 0x0c, 0x8a, 0xab, 0x70, 0x48, 0x90, 0x0d, 0x01, 0x48, 0x81, 0x09, + 0x71, 0x4a, 0x11, 0x30, 0x70, 0x4c, 0x08, 0x0f, 0x00, 0x18, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x70, 0x24, 0x90, 0x0d, 0x01, 0x88, 0x70, 0x20, + 0x80, 0x01, 0x70, 0x22, 0x11, 0x68, 0x70, 0x23, 0x00, 0x09, 0x81, 0x09, + 0x71, 0x26, 0x91, 0x86, 0x03, 0xe8, 0x11, 0x10, 0x70, 0x28, 0x08, 0x0f, + 0x81, 0xff, 0x11, 0x10, 0x70, 0x28, 0x08, 0x0f, 0x70, 0x30, 0x90, 0x0d, + 0x01, 0x80, 0x70, 0x2c, 0x80, 0x01, 0x70, 0x2e, 0x11, 0x60, 0x70, 0x2f, + 0x00, 0x09, 0x81, 0x09, 0x71, 0x32, 0x01, 0x28, 0x91, 0x84, 0x00, 0x7f, + 0x09, 0x0c, 0xa3, 0xeb, 0x00, 0x10, 0x70, 0x34, 0x08, 0x0f, 0x70, 0x44, + 0x90, 0x05, 0x01, 0x18, 0x03, 0x10, 0x80, 0x01, 0x70, 0x46, 0x70, 0x54, + 0x90, 0x0d, 0x01, 0x68, 0x70, 0x50, 0x80, 0x01, 0x70, 0x52, 0x11, 0x48, + 0x70, 0x53, 0x00, 0x09, 0x81, 0x09, 0x71, 0x56, 0x11, 0x20, 0x71, 0x58, + 0x71, 0x56, 0x70, 0x60, 0x08, 0x0f, 0x70, 0x18, 0x90, 0x0d, 0x01, 0xd8, + 0x00, 0x16, 0x70, 0x78, 0x90, 0x0d, 0x01, 0x58, 0x70, 0x74, 0x80, 0x01, + 0x70, 0x76, 0x11, 0x38, 0x70, 0x77, 0x00, 0x09, 0x81, 0x09, 0x71, 0x7a, + 0x11, 0x10, 0x70, 0x7c, 0x08, 0x0f, 0x00, 0x1e, 0x70, 0x08, 0x80, 0x01, + 0x70, 0x0a, 0x11, 0x38, 0x70, 0x0b, 0x00, 0x09, 0x81, 0x09, 0x71, 0x1a, + 0x11, 0x10, 0x70, 0x1c, 0x08, 0x0f, 0x01, 0x2e, 0x70, 0x04, 0x00, 0x02, + 0x89, 0xaa, 0x89, 0xab, 0x89, 0xd5, 0x00, 0xe6, 0x20, 0x71, 0x1a, 0x04, + 0x70, 0x18, 0x90, 0x05, 0x11, 0x20, 0x71, 0x1a, 0x72, 0x1e, 0x70, 0x0b, + 0x00, 0x09, 0x00, 0xee, 0x00, 0x05, 0x00, 0xe6, 0x00, 0x06, 0x20, 0x71, + 0x1a, 0x04, 0x70, 0x1c, 0x92, 0x06, 0x11, 0x20, 0x70, 0x1a, 0x70, 0x1e, + 0x70, 0x7a, 0x70, 0x7e, 0x00, 0x0e, 0x00, 0xee, 0x00, 0x05, 0x00, 0xe6, + 0x20, 0x71, 0x1a, 0x04, 0xb8, 0x88, 0x91, 0x02, 0x02, 0x08, 0xb9, 0x8a, + 0x00, 0xee, 0x00, 0x05, 0x00, 0x05, 0x00, 0xb6, 0x20, 0x31, 0x00, 0x10, + 0x71, 0x10, 0x08, 0x0c, 0x67, 0xb4, 0x11, 0xa8, 0xb8, 0x88, 0x80, 0x01, + 0x02, 0x90, 0xb8, 0x8a, 0x11, 0x80, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x00, 0x66, 0xb8, 0xd0, 0x90, 0x05, 0x01, 0x38, 0x00, 0x26, 0xba, 0x3c, + 0x00, 0x16, 0x08, 0x0c, 0x68, 0xdf, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x6e, + 0x01, 0x2e, 0x81, 0x08, 0x91, 0x82, 0x08, 0x00, 0x12, 0x20, 0x86, 0x31, + 0x01, 0x28, 0x71, 0x12, 0x0c, 0x00, 0x90, 0x0e, 0x70, 0x07, 0x00, 0x02, + 0x71, 0x12, 0x00, 0xbe, 0x00, 0x05, 0x20, 0x31, 0x00, 0x10, 0x70, 0x14, + 0x20, 0x60, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x60, 0x48, 0x90, 0x05, + 0x01, 0x28, 0x80, 0x01, 0x60, 0x4a, 0x11, 0x10, 0x08, 0x0c, 0xd2, 0x37, + 0x60, 0x18, 0x90, 0x05, 0x09, 0x04, 0x8a, 0x2d, 0x00, 0xf6, 0x20, 0x79, + 0x03, 0x00, 0x79, 0x18, 0xd1, 0xb4, 0x19, 0x04, 0x8a, 0x40, 0x78, 0x1b, + 0x20, 0x20, 0xa0, 0x01, 0x79, 0x18, 0xd1, 0xb4, 0x01, 0x20, 0x78, 0x1b, + 0x20, 0x00, 0x08, 0x04, 0x8a, 0x40, 0x80, 0x01, 0x60, 0x1a, 0x01, 0x06, + 0x78, 0x1b, 0x20, 0x00, 0xa0, 0x01, 0x79, 0x18, 0xd1, 0xac, 0x1d, 0xd0, + 0x01, 0x0e, 0x00, 0xfe, 0x15, 0x40, 0x61, 0x20, 0x91, 0x86, 0x00, 0x03, + 0x01, 0x48, 0x91, 0x86, 0x00, 0x06, 0x01, 0x30, 0x91, 0x86, 0x00, 0x09, + 0x11, 0xe0, 0x61, 0x1c, 0xd1, 0xc4, 0x11, 0x00, 0x08, 0x0c, 0xcf, 0x1b, + 0x01, 0xb0, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x84, 0x90, 0x8a, 0x19, 0x9a, + 0x02, 0x80, 0x90, 0x82, 0x19, 0x99, 0xa8, 0x86, 0x90, 0x8a, 0x19, 0x9a, + 0x02, 0x10, 0x20, 0x01, 0x19, 0x99, 0x80, 0x03, 0x80, 0x0b, 0x81, 0x0b, + 0x91, 0x08, 0x61, 0x1a, 0x08, 0x0c, 0xd6, 0x71, 0x01, 0x10, 0x08, 0x0c, + 0xcb, 0xd9, 0x01, 0x2e, 0x9c, 0x88, 0x00, 0x1c, 0x71, 0x16, 0x20, 0x01, + 0x18, 0x1a, 0x20, 0x04, 0x91, 0x02, 0x12, 0x28, 0x86, 0x31, 0x01, 0x38, + 0x21, 0x60, 0x08, 0x04, 0x89, 0xd9, 0x70, 0x17, 0x1d, 0xdc, 0x70, 0x07, + 0x00, 0x00, 0x00, 0x05, 0x00, 0xfe, 0x0c, 0x58, 0x00, 0xe6, 0x20, 0x71, + 0x1a, 0x04, 0x70, 0x27, 0x07, 0xd0, 0x70, 0x23, 0x00, 0x09, 0x00, 0xee, + 0x00, 0x05, 0x20, 0x01, 0x1a, 0x0d, 0x20, 0x03, 0x00, 0x00, 0x00, 0x05, + 0x00, 0xe6, 0x20, 0x71, 0x1a, 0x04, 0x71, 0x32, 0x70, 0x2f, 0x00, 0x09, + 0x00, 0xee, 0x00, 0x05, 0x20, 0x11, 0x1a, 0x10, 0x20, 0x13, 0x00, 0x00, + 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0x1a, 0x04, 0x71, 0x1a, 0x72, 0x1e, + 0x70, 0x0b, 0x00, 0x09, 0x00, 0xee, 0x00, 0x05, 0x00, 0x86, 0x00, 0x26, + 0x70, 0x5c, 0x80, 0x00, 0x70, 0x5e, 0x20, 0x01, 0x1a, 0x14, 0x20, 0x44, + 0xa0, 0x6c, 0x90, 0x86, 0x00, 0x00, 0x01, 0x50, 0x70, 0x70, 0xa0, 0x9a, + 0x70, 0x6c, 0xa0, 0x96, 0x70, 0x68, 0xa0, 0x92, 0x70, 0x64, 0xa0, 0x8e, + 0x08, 0x0c, 0x11, 0x4e, 0x00, 0x2e, 0x00, 0x8e, 0x00, 0x05, 0x00, 0x06, + 0x00, 0x16, 0x00, 0x96, 0x00, 0xa6, 0x00, 0xb6, 0x00, 0xc6, 0x00, 0xd6, + 0x00, 0xe6, 0x00, 0xf6, 0x01, 0x56, 0x08, 0x0c, 0x88, 0xe7, 0x01, 0x5e, + 0x00, 0xfe, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x00, 0xbe, 0x00, 0xae, + 0x00, 0x9e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, + 0x1a, 0x04, 0x71, 0x7a, 0x72, 0x7e, 0x70, 0x77, 0x00, 0x09, 0x00, 0xee, + 0x00, 0x05, 0x00, 0xe6, 0x00, 0x06, 0x20, 0x71, 0x1a, 0x04, 0x70, 0x7c, + 0x92, 0x06, 0x11, 0x10, 0x70, 0x7a, 0x70, 0x7e, 0x00, 0x0e, 0x00, 0xee, + 0x00, 0x05, 0x20, 0x69, 0x18, 0x00, 0x69, 0xec, 0xd1, 0xe4, 0x15, 0x18, + 0x00, 0x26, 0xd1, 0xec, 0x01, 0x40, 0x6a, 0x54, 0x68, 0x74, 0x92, 0x02, + 0x02, 0x88, 0x81, 0x17, 0x92, 0x94, 0x00, 0xc1, 0x00, 0x88, 0x91, 0x84, + 0x00, 0x07, 0x01, 0xa0, 0x81, 0x09, 0x91, 0x84, 0x00, 0x07, 0x01, 0x10, + 0x69, 0xee, 0x00, 0x70, 0x81, 0x07, 0x90, 0x84, 0x00, 0x07, 0x91, 0x0d, + 0x81, 0x07, 0x91, 0x06, 0x90, 0x94, 0x00, 0xc1, 0x91, 0x84, 0xff, 0x3e, + 0x92, 0x05, 0x68, 0xee, 0x08, 0x0c, 0x0f, 0x24, 0x00, 0x2e, 0x00, 0x05, + 0x69, 0xe8, 0x91, 0x84, 0x00, 0x3f, 0x05, 0xb8, 0x81, 0x09, 0x91, 0x84, + 0x00, 0x3f, 0x01, 0xa8, 0x6a, 0x54, 0x68, 0x74, 0x92, 0x02, 0x02, 0x20, + 0xd1, 0xbc, 0x01, 0x68, 0xc1, 0xbc, 0x00, 0x18, 0xd1, 0xbc, 0x11, 0x48, + 0xc1, 0xbd, 0x21, 0x10, 0x00, 0xe6, 0x20, 0x71, 0x18, 0x00, 0x08, 0x0c, + 0x0f, 0x46, 0x00, 0xee, 0x04, 0x00, 0x69, 0xea, 0x00, 0xf0, 0x00, 0x26, + 0x81, 0x07, 0x90, 0x94, 0x00, 0x07, 0x01, 0x28, 0x80, 0x01, 0x80, 0x07, + 0x90, 0x85, 0x00, 0x07, 0x00, 0x50, 0x20, 0x10, 0x80, 0x04, 0x80, 0x04, + 0x80, 0x04, 0x90, 0x84, 0x00, 0x07, 0x92, 0x05, 0x80, 0x07, 0x90, 0x85, + 0x00, 0x28, 0x90, 0x86, 0x00, 0x40, 0x20, 0x10, 0x00, 0xe6, 0x20, 0x71, + 0x18, 0x00, 0x08, 0x0c, 0x0f, 0x46, 0x00, 0xee, 0x00, 0x2e, 0x00, 0x05, + 0x00, 0x16, 0x00, 0xc6, 0x20, 0x09, 0xff, 0xf4, 0x21, 0x0d, 0x20, 0x61, + 0x01, 0x00, 0x60, 0xf0, 0x91, 0x00, 0x60, 0xf3, 0x00, 0x00, 0x20, 0x09, + 0xff, 0xf4, 0x20, 0x0f, 0x12, 0x20, 0x81, 0x08, 0x21, 0x05, 0x80, 0x00, + 0x20, 0x0f, 0x00, 0xce, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xc6, 0x20, 0x61, + 0x1a, 0x73, 0x00, 0xce, 0x00, 0x05, 0x91, 0x84, 0x00, 0x0f, 0x80, 0x03, + 0x80, 0x03, 0x80, 0x03, 0x90, 0x80, 0x1a, 0x73, 0x20, 0x60, 0x00, 0x05, + 0xa8, 0x84, 0x90, 0x8a, 0x19, 0x9a, 0x16, 0x38, 0x90, 0x05, 0x11, 0x50, + 0x00, 0xc6, 0x20, 0x61, 0x1a, 0x73, 0x60, 0x14, 0x00, 0xce, 0x90, 0x05, + 0x11, 0x30, 0x20, 0x01, 0x00, 0x1e, 0x00, 0x18, 0x90, 0x8e, 0xff, 0xff, + 0x01, 0xb0, 0x80, 0x03, 0x80, 0x0b, 0x81, 0x0b, 0x91, 0x08, 0x61, 0x1a, + 0xa8, 0x7c, 0x90, 0x8c, 0x00, 0xc0, 0x91, 0x8e, 0x00, 0xc0, 0x09, 0x04, + 0x8b, 0xee, 0xd0, 0xb4, 0x11, 0x68, 0xd0, 0xbc, 0x19, 0x04, 0x8b, 0xc7, + 0x20, 0x09, 0x00, 0x06, 0x08, 0x0c, 0x8c, 0x1b, 0x00, 0x05, 0x90, 0x0e, + 0x0c, 0x60, 0x20, 0x01, 0x19, 0x99, 0x08, 0xb0, 0xd0, 0xfc, 0x05, 0xe0, + 0x90, 0x8c, 0x20, 0x23, 0x15, 0x68, 0x87, 0xff, 0x15, 0x58, 0xa9, 0xa8, + 0x81, 0xff, 0x15, 0x40, 0x61, 0x24, 0x91, 0x8c, 0x05, 0x00, 0x15, 0x20, + 0x61, 0x00, 0x91, 0x8e, 0x00, 0x07, 0x15, 0x00, 0x20, 0x09, 0x18, 0x69, + 0x21, 0x0c, 0xd1, 0x84, 0x11, 0xd8, 0x60, 0x03, 0x00, 0x03, 0x60, 0x07, + 0x00, 0x43, 0x60, 0x47, 0xb0, 0x35, 0x08, 0x0c, 0x1c, 0x6f, 0xa8, 0x7c, + 0xc0, 0xdd, 0xa8, 0x7e, 0x60, 0x0f, 0x00, 0x00, 0x00, 0xf6, 0x20, 0x79, + 0x03, 0x80, 0x78, 0x18, 0xd0, 0xbc, 0x1d, 0xe8, 0x78, 0x33, 0x00, 0x13, + 0x2c, 0x00, 0x78, 0x36, 0x78, 0x1b, 0x80, 0x80, 0x00, 0xfe, 0x00, 0x05, + 0x90, 0x8c, 0x00, 0x03, 0x01, 0x20, 0x91, 0x8e, 0x00, 0x03, 0x19, 0x04, + 0x8c, 0x15, 0x90, 0x8c, 0x20, 0x20, 0x91, 0x8e, 0x20, 0x20, 0x01, 0xa8, + 0x60, 0x24, 0xd0, 0xd4, 0x11, 0xe8, 0x20, 0x09, 0x18, 0x69, 0x21, 0x04, + 0xd0, 0x84, 0x11, 0x38, 0x87, 0xff, 0x11, 0x20, 0x20, 0x09, 0x00, 0x43, + 0x08, 0x04, 0xb2, 0x0a, 0x00, 0x05, 0x87, 0xff, 0x1d, 0xe8, 0x20, 0x09, + 0x00, 0x42, 0x08, 0x04, 0xb2, 0x0a, 0x61, 0x10, 0x00, 0xb6, 0x21, 0x58, + 0xb9, 0x00, 0x00, 0xbe, 0xd1, 0xac, 0x0d, 0x20, 0x60, 0x24, 0xc0, 0xcd, + 0x60, 0x26, 0x0c, 0x00, 0xc0, 0xd4, 0x60, 0x26, 0xa8, 0x90, 0x60, 0x2e, + 0xa8, 0x8c, 0x60, 0x32, 0x08, 0xe0, 0xd0, 0xfc, 0x01, 0x60, 0x90, 0x8c, + 0x00, 0x03, 0x01, 0x20, 0x91, 0x8e, 0x00, 0x03, 0x19, 0x04, 0x8c, 0x15, + 0x90, 0x8c, 0x20, 0x20, 0x91, 0x8e, 0x20, 0x20, 0x01, 0x70, 0x00, 0x76, + 0x00, 0xf6, 0x2c, 0x78, 0x08, 0x0c, 0x17, 0xad, 0x00, 0xfe, 0x00, 0x7e, + 0x87, 0xff, 0x11, 0x20, 0x20, 0x09, 0x00, 0x42, 0x08, 0x0c, 0xb2, 0x0a, + 0x00, 0x05, 0x61, 0x10, 0x00, 0xb6, 0x21, 0x58, 0xb9, 0x00, 0x00, 0xbe, + 0xd1, 0xac, 0x0d, 0x58, 0x61, 0x24, 0xc1, 0xcd, 0x61, 0x26, 0x0c, 0x38, + 0xd0, 0xfc, 0x01, 0x88, 0x90, 0x8c, 0x20, 0x20, 0x91, 0x8e, 0x20, 0x20, + 0x01, 0xa8, 0x90, 0x84, 0x00, 0x03, 0x90, 0x8e, 0x00, 0x02, 0x01, 0x48, + 0x87, 0xff, 0x11, 0x20, 0x20, 0x09, 0x00, 0x41, 0x08, 0x0c, 0xb2, 0x0a, + 0x00, 0x05, 0x00, 0xb9, 0x0c, 0xe8, 0x87, 0xff, 0x1d, 0xd8, 0x20, 0x09, + 0x00, 0x43, 0x08, 0x0c, 0xb2, 0x0a, 0x0c, 0xb0, 0x61, 0x10, 0x00, 0xb6, + 0x21, 0x58, 0xb9, 0x00, 0x00, 0xbe, 0xd1, 0xac, 0x0d, 0x20, 0x61, 0x24, + 0xc1, 0xcd, 0x61, 0x26, 0x0c, 0x00, 0x20, 0x09, 0x00, 0x04, 0x00, 0x19, + 0x00, 0x05, 0x20, 0x09, 0x00, 0x01, 0x00, 0x96, 0x08, 0x0c, 0xcf, 0x1b, + 0x05, 0x18, 0x60, 0x14, 0x20, 0x48, 0xa9, 0x82, 0xa8, 0x00, 0x60, 0x16, + 0x91, 0x86, 0x00, 0x01, 0x11, 0x88, 0xa9, 0x7c, 0x91, 0x8c, 0x81, 0x00, + 0x91, 0x8e, 0x81, 0x00, 0x11, 0x58, 0x00, 0xc6, 0x20, 0x61, 0x1a, 0x73, + 0x62, 0x00, 0xd2, 0x8c, 0x11, 0x20, 0x62, 0x04, 0x82, 0x10, 0x02, 0x08, + 0x62, 0x06, 0x00, 0xce, 0x08, 0x0c, 0x6e, 0x4c, 0x60, 0x14, 0x90, 0x4d, + 0x00, 0x76, 0x20, 0x39, 0x00, 0x00, 0x19, 0x0c, 0x8b, 0x34, 0x00, 0x7e, + 0x00, 0x9e, 0x00, 0x05, 0x01, 0x56, 0x00, 0xc6, 0x20, 0x61, 0x1a, 0x73, + 0x60, 0x00, 0x81, 0xff, 0x01, 0x10, 0x92, 0x05, 0x00, 0x08, 0x92, 0x04, + 0x60, 0x02, 0x00, 0xce, 0x01, 0x5e, 0x00, 0x05, 0x68, 0x00, 0xd0, 0x8c, + 0x11, 0x38, 0x68, 0x08, 0x90, 0x05, 0x01, 0x20, 0x80, 0x01, 0x68, 0x0a, + 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x20, 0x71, 0x19, 0x24, 0x70, 0x03, + 0x00, 0x06, 0x70, 0x07, 0x00, 0x00, 0x70, 0x0f, 0x00, 0x00, 0x70, 0x13, + 0x00, 0x01, 0x08, 0x0c, 0x10, 0x72, 0x09, 0x0c, 0x0d, 0x85, 0xa8, 0x67, + 0x00, 0x06, 0xa8, 0x6b, 0x00, 0x01, 0xa8, 0xab, 0xdc, 0xb0, 0xa8, 0x9f, + 0x00, 0x00, 0x29, 0x00, 0x70, 0x2e, 0x70, 0x33, 0x00, 0x00, 0x00, 0x05, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0x96, 0x00, 0xe6, 0x20, 0x71, + 0x19, 0x24, 0x70, 0x2c, 0x20, 0x48, 0x6a, 0x2c, 0x72, 0x1e, 0x6b, 0x30, + 0x73, 0x22, 0x68, 0x34, 0x70, 0x26, 0xa8, 0x96, 0x68, 0x38, 0x70, 0x2a, + 0xa8, 0x9a, 0x68, 0x24, 0x70, 0x16, 0x68, 0x3c, 0x70, 0x1a, 0x20, 0x09, + 0x00, 0x28, 0x20, 0x0a, 0x90, 0x05, 0x01, 0x48, 0x90, 0x0e, 0x91, 0x88, + 0x00, 0x0c, 0x80, 0x01, 0x1d, 0xe0, 0x21, 0x00, 0x92, 0x10, 0x12, 0x08, + 0x83, 0x18, 0xaa, 0x8e, 0xab, 0x92, 0x70, 0x10, 0xd0, 0x84, 0x01, 0x68, + 0xc0, 0x84, 0x70, 0x07, 0x00, 0x01, 0x70, 0x0f, 0x00, 0x00, 0x00, 0x06, + 0x20, 0x09, 0x1b, 0x73, 0x21, 0x04, 0x90, 0x82, 0x00, 0x07, 0x20, 0x0a, + 0x00, 0x0e, 0xc0, 0x95, 0x70, 0x12, 0x20, 0x08, 0x20, 0x01, 0x00, 0x3b, + 0x08, 0x0c, 0x16, 0xb9, 0x90, 0x06, 0x20, 0x71, 0x19, 0x3d, 0x70, 0x02, + 0x70, 0x06, 0x70, 0x2a, 0x00, 0xee, 0x00, 0x9e, 0x01, 0x2e, 0x00, 0x05, + 0x20, 0x09, 0x1b, 0x73, 0x21, 0x04, 0x90, 0x80, 0x00, 0x07, 0x20, 0x0a, + 0x00, 0x05, 0x00, 0xe6, 0x01, 0x26, 0x01, 0x56, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x71, 0x18, 0x00, 0x71, 0x54, 0x20, 0x01, 0x00, 0x08, 0x91, 0x0a, + 0x06, 0x38, 0x20, 0x01, 0x18, 0x7d, 0x20, 0xac, 0x90, 0x06, 0x90, 0x80, + 0x00, 0x08, 0x1f, 0x04, 0x8c, 0xd7, 0x71, 0xc0, 0x91, 0x02, 0x02, 0xe0, + 0x20, 0x71, 0x18, 0x77, 0x20, 0xa9, 0x00, 0x07, 0x00, 0xc6, 0x08, 0x0c, + 0xb1, 0x16, 0x60, 0x23, 0x00, 0x09, 0x60, 0x03, 0x00, 0x04, 0x60, 0x1f, + 0x01, 0x01, 0x00, 0x89, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, + 0x8e, 0x58, 0x01, 0x2e, 0x1f, 0x04, 0x8c, 0xe3, 0x90, 0x06, 0x00, 0xce, + 0x01, 0x5e, 0x01, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x90, 0x85, 0x00, 0x01, + 0x0c, 0xc8, 0x00, 0xe6, 0x00, 0xb6, 0x00, 0x96, 0x00, 0x86, 0x00, 0x56, + 0x00, 0x46, 0x00, 0x26, 0x71, 0x18, 0x72, 0x0c, 0x76, 0x20, 0x70, 0x04, + 0xd0, 0x84, 0x11, 0x28, 0x20, 0x21, 0x00, 0x24, 0x20, 0x29, 0x00, 0x02, + 0x00, 0x20, 0x20, 0x21, 0x00, 0x2c, 0x20, 0x29, 0x00, 0x0a, 0x08, 0x0c, + 0x10, 0x59, 0x09, 0x0c, 0x0d, 0x85, 0x29, 0x00, 0x60, 0x16, 0x20, 0x58, + 0xac, 0x66, 0x90, 0x06, 0xa8, 0x02, 0xa8, 0x06, 0xa8, 0x6a, 0xa8, 0x7a, + 0xa8, 0xaa, 0xa8, 0x87, 0x00, 0x05, 0xa8, 0x7f, 0x00, 0x20, 0x70, 0x08, + 0xa8, 0x9a, 0x70, 0x10, 0xa8, 0x9e, 0xae, 0x8a, 0xa8, 0xaf, 0xff, 0xff, + 0xa8, 0xb3, 0x00, 0x00, 0x81, 0x09, 0x01, 0x60, 0x08, 0x0c, 0x10, 0x59, + 0x09, 0x0c, 0x0d, 0x85, 0xad, 0x66, 0x2b, 0x00, 0xa8, 0x02, 0x29, 0x00, + 0xb8, 0x06, 0x20, 0x58, 0x81, 0x09, 0x1d, 0xa0, 0x00, 0x2e, 0x00, 0x4e, + 0x00, 0x5e, 0x00, 0x8e, 0x00, 0x9e, 0x00, 0xbe, 0x00, 0xee, 0x00, 0x05, + 0x20, 0x79, 0x00, 0x00, 0x20, 0x71, 0x19, 0x24, 0x70, 0x04, 0x00, 0x4b, + 0x70, 0x0c, 0x00, 0x02, 0x8d, 0x4f, 0x8d, 0x48, 0x8d, 0x48, 0x00, 0x05, + 0x8d, 0x59, 0x8d, 0xaf, 0x8d, 0xaf, 0x8d, 0xaf, 0x8d, 0xb0, 0x8d, 0xc1, + 0x8d, 0xc1, 0x70, 0x0c, 0x0c, 0xba, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x78, 0xa0, 0x79, 0xa0, 0x91, 0x06, 0x19, 0x04, 0x8d, 0xa1, 0x78, 0x14, + 0xd0, 0xbc, 0x19, 0x04, 0x8d, 0xaa, 0x01, 0x2e, 0x70, 0x18, 0x91, 0x0a, + 0x11, 0x28, 0x70, 0x30, 0x90, 0x05, 0x19, 0x04, 0x8d, 0xf3, 0x00, 0x05, + 0x12, 0x10, 0x71, 0x14, 0x91, 0x0a, 0x91, 0x92, 0x00, 0x0a, 0x02, 0x10, + 0x20, 0x09, 0x00, 0x0a, 0x20, 0x01, 0x18, 0x88, 0x20, 0x14, 0x20, 0x01, + 0x19, 0x36, 0x20, 0x04, 0x91, 0x00, 0x92, 0x02, 0x0e, 0x50, 0x08, 0x0c, + 0x8f, 0x53, 0x22, 0x00, 0x91, 0x02, 0x02, 0x08, 0x22, 0x08, 0x00, 0x96, + 0x70, 0x2c, 0x20, 0x48, 0xa8, 0x73, 0x00, 0x01, 0xa9, 0x76, 0x08, 0x0c, + 0x90, 0x5c, 0x21, 0x00, 0xa8, 0x7e, 0xa8, 0x6f, 0x00, 0x00, 0x00, 0x9e, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x09, 0x1a, 0x24, 0x21, 0x04, + 0xc0, 0x85, 0x20, 0x0a, 0x70, 0x0f, 0x00, 0x02, 0x01, 0x2e, 0x08, 0x0c, + 0x11, 0x6d, 0x1d, 0xe8, 0x00, 0x05, 0x78, 0xa0, 0x79, 0xa0, 0x91, 0x06, + 0x09, 0x04, 0x8d, 0x61, 0x08, 0x0c, 0x8f, 0x2b, 0x01, 0x2e, 0x00, 0x05, + 0x78, 0x10, 0xc0, 0xc5, 0x78, 0x12, 0x08, 0x04, 0x8d, 0x61, 0x00, 0x05, + 0x70, 0x0c, 0x00, 0x02, 0x8d, 0xb5, 0x8d, 0xb8, 0x8d, 0xb7, 0x08, 0x0c, + 0x8d, 0x57, 0x00, 0x05, 0x80, 0x01, 0x70, 0x0e, 0x00, 0x96, 0x70, 0x2c, + 0x20, 0x48, 0xa9, 0x74, 0x00, 0x9e, 0x00, 0x11, 0x0c, 0xa0, 0x00, 0x05, + 0x00, 0x96, 0x70, 0x2c, 0x20, 0x48, 0x70, 0x18, 0x91, 0x00, 0x72, 0x14, + 0x92, 0x1a, 0x11, 0x30, 0x70, 0x1c, 0xa8, 0x8e, 0x70, 0x20, 0xa8, 0x92, + 0x90, 0x06, 0x00, 0x68, 0x00, 0x06, 0x08, 0x0c, 0x90, 0x5c, 0x21, 0x00, + 0xaa, 0x8c, 0x92, 0x10, 0xaa, 0x8e, 0x12, 0x20, 0xa8, 0x90, 0x90, 0x81, + 0x00, 0x00, 0xa8, 0x92, 0x00, 0x0e, 0x00, 0x9e, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x78, 0xa2, 0x70, 0x1a, 0x08, 0x0c, 0x8f, 0x2b, 0x01, 0x2e, + 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0x19, 0x24, 0x70, 0x0c, 0x00, 0x02, + 0x8d, 0xf1, 0x8d, 0xf1, 0x8d, 0xef, 0x70, 0x0f, 0x00, 0x01, 0x00, 0xee, + 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x70, 0x30, 0x90, 0x05, + 0x05, 0x08, 0x20, 0x78, 0x78, 0x14, 0x20, 0x48, 0xae, 0x88, 0x00, 0xb6, + 0x20, 0x59, 0x00, 0x00, 0x08, 0x0c, 0x8e, 0x61, 0x00, 0xbe, 0x01, 0xb0, + 0x00, 0xe6, 0x20, 0x71, 0x19, 0x3d, 0x08, 0x0c, 0x8e, 0xa8, 0x00, 0xee, + 0x01, 0x78, 0x00, 0x96, 0x08, 0x0c, 0x10, 0x72, 0x29, 0x00, 0x00, 0x9e, + 0x01, 0x48, 0xa8, 0xaa, 0x04, 0xd1, 0x00, 0x41, 0x20, 0x01, 0x19, 0x47, + 0x20, 0x03, 0x00, 0x00, 0x01, 0x2e, 0x08, 0xc8, 0x01, 0x2e, 0x00, 0x05, + 0x00, 0xd6, 0x00, 0xc6, 0x00, 0x86, 0x00, 0xa6, 0x29, 0x40, 0x26, 0x50, + 0x26, 0x00, 0x90, 0x05, 0x01, 0x80, 0xa8, 0x64, 0x90, 0x84, 0x00, 0x0f, + 0x20, 0x68, 0x9d, 0x88, 0x1e, 0xc1, 0x21, 0x65, 0x00, 0x56, 0x20, 0x29, + 0x00, 0x00, 0x08, 0x0c, 0x8f, 0xe1, 0x08, 0x0c, 0x1e, 0x97, 0x1d, 0xd8, + 0x00, 0x5e, 0x00, 0xae, 0x20, 0x01, 0x18, 0x7f, 0x20, 0x04, 0xa8, 0x8a, + 0x00, 0xc6, 0x2f, 0x60, 0x08, 0x0c, 0x17, 0xad, 0x00, 0xce, 0x78, 0x1f, + 0x01, 0x01, 0x78, 0x13, 0x00, 0x00, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x08, 0x0c, 0x8e, 0xb7, 0x01, 0x2e, 0x00, 0x8e, 0x00, 0xce, 0x00, 0xde, + 0x00, 0x05, 0x70, 0x30, 0x90, 0x05, 0x01, 0x38, 0x20, 0x78, 0x78, 0x0c, + 0x70, 0x32, 0x20, 0x01, 0x19, 0x47, 0x20, 0x03, 0x00, 0x01, 0x00, 0x05, + 0x00, 0xe6, 0x20, 0x71, 0x19, 0x24, 0x70, 0x30, 0x60, 0x0e, 0x2c, 0x00, + 0x70, 0x32, 0x00, 0xee, 0x00, 0x05, 0x00, 0xd6, 0x00, 0xc6, 0x00, 0x26, + 0x9b, 0x80, 0x91, 0x2a, 0x20, 0x05, 0x90, 0x6d, 0x09, 0x0c, 0x0d, 0x85, + 0x9b, 0x80, 0x91, 0x22, 0x20, 0x05, 0x90, 0x65, 0x09, 0x0c, 0x0d, 0x85, + 0x61, 0x14, 0x26, 0x00, 0x91, 0x02, 0x02, 0x48, 0x68, 0x28, 0x91, 0x02, + 0x02, 0xf0, 0x90, 0x85, 0x00, 0x01, 0x00, 0x2e, 0x00, 0xce, 0x00, 0xde, + 0x00, 0x05, 0x68, 0x04, 0xd0, 0x94, 0x01, 0x48, 0x68, 0x54, 0xd0, 0x84, + 0x11, 0x78, 0xc0, 0x85, 0x68, 0x56, 0x20, 0x11, 0x80, 0x26, 0x08, 0x0c, + 0x4c, 0xa1, 0x68, 0x4c, 0x00, 0x96, 0x90, 0x4d, 0x09, 0x0c, 0x0d, 0x85, + 0xa8, 0x04, 0x80, 0x00, 0xa8, 0x06, 0x00, 0x9e, 0x90, 0x06, 0x20, 0x30, + 0x0c, 0x20, 0x68, 0x54, 0xd0, 0x8c, 0x1d, 0x08, 0xc0, 0x8d, 0x68, 0x56, + 0x20, 0x11, 0x80, 0x25, 0x08, 0x0c, 0x4c, 0xa1, 0x68, 0x4c, 0x00, 0x96, + 0x90, 0x4d, 0x09, 0x0c, 0x0d, 0x85, 0xa8, 0x00, 0x80, 0x00, 0xa8, 0x02, + 0x00, 0x9e, 0x08, 0x88, 0x70, 0x00, 0x20, 0x19, 0x00, 0x08, 0x83, 0x19, + 0x71, 0x04, 0x91, 0x02, 0x11, 0x18, 0x23, 0x00, 0x90, 0x05, 0x00, 0x20, + 0x02, 0x10, 0x93, 0x02, 0x00, 0x08, 0x80, 0x02, 0x00, 0x05, 0x00, 0xd6, + 0x78, 0x14, 0x90, 0x05, 0x09, 0x0c, 0x0d, 0x85, 0x78, 0x1c, 0x90, 0x84, + 0x01, 0x01, 0x90, 0x86, 0x01, 0x01, 0x19, 0x0c, 0x0d, 0x85, 0x78, 0x27, + 0x00, 0x00, 0x20, 0x69, 0x19, 0x3d, 0x68, 0x04, 0x90, 0x80, 0x19, 0x3f, + 0x2f, 0x08, 0x21, 0x02, 0x69, 0x04, 0x81, 0x08, 0x91, 0x82, 0x00, 0x08, + 0x02, 0x08, 0x90, 0x0e, 0x69, 0x06, 0x91, 0x80, 0x19, 0x3f, 0x20, 0x03, + 0x00, 0x00, 0x00, 0xde, 0x00, 0x05, 0x00, 0x96, 0x00, 0xc6, 0x20, 0x60, + 0x60, 0x14, 0x20, 0x48, 0xa8, 0xa8, 0x00, 0x96, 0x20, 0x48, 0x90, 0x05, + 0x19, 0x0c, 0x10, 0x8b, 0x00, 0x9e, 0xa8, 0xab, 0x00, 0x00, 0x08, 0x0c, + 0x10, 0x0b, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0xce, 0x00, 0x9e, 0x00, 0x05, + 0x60, 0x20, 0x90, 0x86, 0x00, 0x09, 0x11, 0x28, 0x60, 0x1c, 0xd0, 0xc4, + 0x01, 0x10, 0x90, 0x06, 0x00, 0x05, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, + 0x60, 0x00, 0x90, 0x86, 0x00, 0x00, 0x01, 0x78, 0x60, 0x10, 0x90, 0x05, + 0x01, 0x50, 0x00, 0xb6, 0x20, 0x58, 0x08, 0x0c, 0x92, 0x5e, 0x00, 0xbe, + 0x60, 0x13, 0x00, 0x00, 0x60, 0x1b, 0x00, 0x00, 0x00, 0x10, 0x2c, 0x00, + 0x08, 0x61, 0x00, 0x05, 0x20, 0x09, 0x19, 0x28, 0x21, 0x0c, 0xd1, 0x94, + 0x00, 0x05, 0x20, 0x09, 0x19, 0x28, 0x21, 0x0c, 0xd1, 0xc4, 0x00, 0x05, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0xe6, 0x20, 0x71, 0x19, 0x24, + 0x71, 0x10, 0xc1, 0x94, 0xc1, 0x85, 0x70, 0x07, 0x00, 0x00, 0x71, 0x12, + 0x20, 0x01, 0x00, 0x3b, 0x08, 0x0c, 0x16, 0xb9, 0x00, 0xee, 0x01, 0x2e, + 0x00, 0x05, 0x78, 0x14, 0xd0, 0xbc, 0x11, 0x08, 0x00, 0x05, 0x78, 0x10, + 0xc0, 0xc5, 0x78, 0x12, 0x0c, 0xc0, 0x00, 0x96, 0x00, 0xd6, 0x90, 0x06, + 0x70, 0x06, 0x70, 0x0e, 0x70, 0x1a, 0x70, 0x1e, 0x70, 0x22, 0x70, 0x16, + 0x70, 0x2a, 0x70, 0x26, 0x70, 0x2f, 0x00, 0x00, 0x08, 0x0c, 0x90, 0xaa, + 0x01, 0x70, 0x08, 0x0c, 0x90, 0xdf, 0x01, 0x58, 0x29, 0x00, 0x70, 0x02, + 0x70, 0x0a, 0x70, 0x1a, 0x70, 0x13, 0x00, 0x01, 0x70, 0x1f, 0x00, 0x0a, + 0x00, 0xde, 0x00, 0x9e, 0x00, 0x05, 0x90, 0x0e, 0x0c, 0xd8, 0x00, 0xe6, + 0x00, 0x96, 0x00, 0x86, 0x00, 0xd6, 0x00, 0xc6, 0x20, 0x71, 0x19, 0x31, + 0x72, 0x1c, 0x21, 0x00, 0x92, 0x02, 0x16, 0x18, 0x08, 0x0c, 0x90, 0xdf, + 0x09, 0x0c, 0x0d, 0x85, 0x70, 0x18, 0x90, 0x05, 0x11, 0x60, 0x29, 0x00, + 0x70, 0x02, 0x70, 0x0a, 0x70, 0x1a, 0x90, 0x06, 0x70, 0x06, 0x70, 0x0e, + 0xa8, 0x06, 0xa8, 0x02, 0x70, 0x12, 0x70, 0x1e, 0x00, 0x38, 0x20, 0x40, + 0xa8, 0x06, 0x29, 0x00, 0xa0, 0x02, 0x70, 0x1a, 0xa8, 0x03, 0x00, 0x00, + 0x70, 0x10, 0x80, 0x00, 0x70, 0x12, 0x70, 0x1c, 0x90, 0x80, 0x00, 0x0a, + 0x70, 0x1e, 0x72, 0x1c, 0x08, 0xd0, 0x72, 0x1c, 0x00, 0xce, 0x00, 0xde, + 0x00, 0x8e, 0x00, 0x9e, 0x00, 0xee, 0x00, 0x05, 0x00, 0x96, 0x01, 0x56, + 0x01, 0x36, 0x01, 0x46, 0x00, 0xe6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x71, 0x19, 0x31, 0x73, 0x00, 0x83, 0x1f, 0x83, 0x1e, 0x83, 0x1e, + 0x93, 0x84, 0x00, 0x3f, 0x20, 0xe8, 0x93, 0x9c, 0xff, 0xc0, 0x93, 0x98, + 0x00, 0x03, 0x71, 0x04, 0x08, 0x0c, 0x90, 0x5c, 0x81, 0x0c, 0x21, 0x00, + 0x93, 0x18, 0x80, 0x03, 0x22, 0x28, 0x20, 0x21, 0x00, 0x78, 0x94, 0x02, + 0x95, 0x32, 0x02, 0x08, 0x20, 0x28, 0x25, 0x00, 0x80, 0x04, 0x20, 0xa8, + 0x23, 0xa0, 0xa0, 0x01, 0xa0, 0x01, 0x40, 0x05, 0x25, 0x08, 0x08, 0x0c, + 0x90, 0x65, 0x21, 0x30, 0x70, 0x14, 0x96, 0x00, 0x70, 0x16, 0x26, 0x00, + 0x71, 0x1c, 0x91, 0x02, 0x70, 0x1e, 0x70, 0x04, 0x96, 0x00, 0x20, 0x08, + 0x90, 0x82, 0x00, 0x0a, 0x11, 0x90, 0x70, 0x00, 0x20, 0x48, 0xa8, 0x00, + 0x90, 0x05, 0x11, 0x48, 0x20, 0x09, 0x00, 0x01, 0x00, 0x26, 0x08, 0x0c, + 0x8f, 0x53, 0x00, 0x2e, 0x70, 0x00, 0x20, 0x48, 0xa8, 0x00, 0x70, 0x02, + 0x70, 0x07, 0x00, 0x00, 0x00, 0x08, 0x71, 0x06, 0x25, 0x00, 0x92, 0x12, + 0x19, 0x04, 0x8f, 0x92, 0x01, 0x2e, 0x00, 0xee, 0x01, 0x4e, 0x01, 0x3e, + 0x01, 0x5e, 0x00, 0x9e, 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, 0x00, 0xe6, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x95, 0x80, 0x91, 0x22, 0x20, 0x05, + 0x90, 0x75, 0x09, 0x0c, 0x0d, 0x85, 0x08, 0x0c, 0x90, 0x37, 0x01, 0x2e, + 0x95, 0x80, 0x91, 0x1e, 0x20, 0x05, 0x90, 0x75, 0x09, 0x0c, 0x0d, 0x85, + 0x01, 0x56, 0x01, 0x36, 0x01, 0xc6, 0x01, 0x46, 0x01, 0xd6, 0x83, 0x1f, + 0x83, 0x1e, 0x83, 0x1e, 0x93, 0x84, 0x00, 0x3f, 0x20, 0xe0, 0x93, 0x84, + 0xff, 0xc0, 0x91, 0x00, 0x20, 0x98, 0xa8, 0x60, 0x20, 0xe8, 0xa9, 0x5c, + 0x2c, 0x05, 0x91, 0x00, 0x20, 0xa0, 0x20, 0xa9, 0x00, 0x02, 0x40, 0x03, + 0x2e, 0x0c, 0x2d, 0x00, 0x00, 0x02, 0x90, 0x21, 0x90, 0x21, 0x90, 0x23, + 0x90, 0x21, 0x90, 0x23, 0x90, 0x21, 0x90, 0x21, 0x90, 0x21, 0x90, 0x21, + 0x90, 0x21, 0x90, 0x29, 0x90, 0x21, 0x90, 0x29, 0x90, 0x21, 0x90, 0x21, + 0x90, 0x21, 0x08, 0x0c, 0x0d, 0x85, 0x41, 0x04, 0x20, 0xa9, 0x00, 0x02, + 0x40, 0x02, 0x40, 0x03, 0x00, 0x28, 0x20, 0xa9, 0x00, 0x02, 0x40, 0x03, + 0x41, 0x04, 0x40, 0x03, 0x01, 0xde, 0x01, 0x4e, 0x01, 0xce, 0x01, 0x3e, + 0x01, 0x5e, 0x00, 0xee, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0x96, + 0x70, 0x14, 0x80, 0x01, 0x70, 0x16, 0x71, 0x0c, 0x21, 0x10, 0x00, 0xf1, + 0x81, 0x0c, 0x91, 0x88, 0x00, 0x03, 0x73, 0x08, 0x82, 0x10, 0x92, 0x82, + 0x00, 0x0a, 0x11, 0x98, 0x70, 0x08, 0x20, 0x48, 0xa8, 0x00, 0x90, 0x05, + 0x01, 0x58, 0x00, 0x06, 0x08, 0x0c, 0x90, 0xee, 0x00, 0x9e, 0xa8, 0x07, + 0x00, 0x00, 0x29, 0x00, 0x70, 0x0a, 0x70, 0x10, 0x80, 0x01, 0x70, 0x12, + 0x70, 0x0f, 0x00, 0x00, 0x00, 0x08, 0x72, 0x0e, 0x00, 0x9e, 0x00, 0x05, + 0x00, 0x06, 0x81, 0x0b, 0x81, 0x0b, 0x21, 0x00, 0x81, 0x0b, 0x91, 0x00, + 0x20, 0x08, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, 0x00, 0x26, 0x21, 0x00, + 0x90, 0x05, 0x01, 0x58, 0x90, 0x92, 0x00, 0x0c, 0x02, 0x40, 0x90, 0x0e, + 0x81, 0x08, 0x90, 0x82, 0x00, 0x0c, 0x1d, 0xe0, 0x00, 0x2e, 0x00, 0x0e, + 0x00, 0x05, 0x90, 0x0e, 0x0c, 0xd8, 0x2d, 0x00, 0x90, 0xb8, 0x00, 0x08, + 0x20, 0x31, 0x90, 0xa8, 0x90, 0x1e, 0x68, 0x08, 0x90, 0x05, 0x01, 0x08, + 0x83, 0x18, 0x69, 0x0c, 0x91, 0x0a, 0x02, 0x48, 0x01, 0x40, 0x83, 0x18, + 0x68, 0x10, 0x91, 0x12, 0x02, 0x20, 0x01, 0x18, 0x83, 0x18, 0x22, 0x08, + 0x0c, 0xd0, 0x23, 0x3a, 0x68, 0x04, 0xd0, 0x84, 0x23, 0x00, 0x20, 0x21, + 0x00, 0x01, 0x11, 0x50, 0x90, 0x82, 0x00, 0x03, 0x09, 0x67, 0x0a, 0x67, + 0x84, 0x20, 0x90, 0x82, 0x00, 0x07, 0x09, 0x67, 0x0a, 0x67, 0x0c, 0xd0, + 0x90, 0x82, 0x00, 0x02, 0x09, 0x67, 0x0a, 0x67, 0x84, 0x20, 0x90, 0x82, + 0x00, 0x05, 0x09, 0x67, 0x0a, 0x67, 0x0c, 0xd0, 0x6c, 0x1a, 0x00, 0x05, + 0x00, 0x96, 0x00, 0x46, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x2b, 0x00, + 0x90, 0x80, 0x91, 0x26, 0x20, 0x05, 0x90, 0x05, 0x09, 0x0c, 0x0d, 0x85, + 0x20, 0x04, 0x90, 0xa0, 0x00, 0x0a, 0x08, 0x0c, 0x10, 0x72, 0x01, 0xd0, + 0x29, 0x00, 0x70, 0x26, 0xa8, 0x03, 0x00, 0x00, 0xa8, 0x07, 0x00, 0x00, + 0x08, 0x0c, 0x10, 0x72, 0x01, 0x88, 0x70, 0x24, 0xa8, 0x02, 0xa8, 0x07, + 0x00, 0x00, 0x29, 0x00, 0x70, 0x26, 0x94, 0xa2, 0x00, 0x0a, 0x01, 0x10, + 0x02, 0x08, 0x0c, 0x90, 0x90, 0x85, 0x00, 0x01, 0x01, 0x2e, 0x00, 0x4e, + 0x00, 0x9e, 0x00, 0x05, 0x70, 0x24, 0x90, 0x05, 0x0d, 0xc8, 0x20, 0x48, + 0xac, 0x00, 0x08, 0x0c, 0x10, 0x8b, 0x24, 0x00, 0x0c, 0xc0, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x70, 0x24, 0x20, 0x48, 0x90, 0x05, 0x01, 0x30, + 0xa8, 0x00, 0x70, 0x26, 0xa8, 0x03, 0x00, 0x00, 0xa8, 0x07, 0x00, 0x00, + 0x01, 0x2e, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x70, 0x24, + 0xa8, 0x02, 0x29, 0x00, 0x70, 0x26, 0x01, 0x2e, 0x00, 0x05, 0x00, 0x96, + 0x9e, 0x80, 0x00, 0x09, 0x20, 0x04, 0x90, 0x05, 0x01, 0x38, 0x20, 0x48, + 0xa8, 0x00, 0x00, 0x06, 0x08, 0x0c, 0x10, 0x8b, 0x00, 0x0e, 0x0c, 0xb8, + 0x00, 0x9e, 0x00, 0x05, 0x00, 0x96, 0x70, 0x08, 0x90, 0x05, 0x01, 0x38, + 0x20, 0x48, 0xa8, 0x00, 0x00, 0x06, 0x08, 0x0c, 0x10, 0x8b, 0x00, 0x0e, + 0x0c, 0xb8, 0x90, 0x06, 0x70, 0x02, 0x70, 0x0a, 0x70, 0x06, 0x70, 0x0e, + 0x70, 0x1a, 0x70, 0x1e, 0x70, 0x22, 0x70, 0x2a, 0x70, 0x26, 0x70, 0x2e, + 0x00, 0x9e, 0x00, 0x05, 0x1a, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x19, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x88, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe6, 0x00, 0xc6, 0x00, 0xb6, 0x00, 0xa6, 0xa8, 0xa8, 0x20, 0x40, + 0x20, 0x71, 0x18, 0x77, 0x08, 0x0c, 0x92, 0x4a, 0xa0, 0x67, 0x00, 0x23, + 0x60, 0x10, 0x90, 0x5d, 0x09, 0x04, 0x92, 0x1f, 0xb8, 0x14, 0xa0, 0x6e, + 0xb9, 0x10, 0xa1, 0x72, 0xb9, 0xa0, 0xa1, 0x76, 0x20, 0x01, 0x00, 0x03, + 0xa0, 0x7e, 0xa8, 0x34, 0xa0, 0x82, 0xa0, 0x7b, 0x00, 0x00, 0xa8, 0x98, + 0x90, 0x05, 0x01, 0x18, 0xa0, 0x78, 0xc0, 0x85, 0xa0, 0x7a, 0x28, 0x58, + 0x20, 0x31, 0x00, 0x18, 0xa0, 0x68, 0x90, 0x8a, 0x00, 0x19, 0x1a, 0x0c, + 0x0d, 0x85, 0x20, 0x20, 0x20, 0x50, 0x29, 0x40, 0xa8, 0x64, 0x90, 0xbc, + 0x00, 0xff, 0x90, 0x8c, 0x00, 0x0f, 0x91, 0xe0, 0x1e, 0xc1, 0x2c, 0x65, + 0x97, 0x86, 0x00, 0x24, 0x2c, 0x05, 0x15, 0x90, 0x90, 0x8a, 0x00, 0x36, + 0x1a, 0x0c, 0x0d, 0x85, 0x90, 0x82, 0x00, 0x1b, 0x00, 0x02, 0x91, 0x8a, + 0x91, 0x8a, 0x91, 0x8c, 0x91, 0x8a, 0x91, 0x8a, 0x91, 0x8a, 0x91, 0x8e, + 0x91, 0x8a, 0x91, 0x8a, 0x91, 0x8a, 0x91, 0x90, 0x91, 0x8a, 0x91, 0x8a, + 0x91, 0x8a, 0x91, 0x92, 0x91, 0x8a, 0x91, 0x8a, 0x91, 0x8a, 0x91, 0x94, + 0x91, 0x8a, 0x91, 0x8a, 0x91, 0x8a, 0x91, 0x96, 0x91, 0x8a, 0x91, 0x8a, + 0x91, 0x8a, 0x91, 0x98, 0x08, 0x0c, 0x0d, 0x85, 0xa1, 0x80, 0x04, 0xb8, + 0xa1, 0x90, 0x04, 0xa8, 0xa1, 0xa0, 0x04, 0x98, 0xa1, 0xb0, 0x04, 0x88, + 0xa1, 0xc0, 0x04, 0x78, 0xa1, 0xd0, 0x04, 0x68, 0xa1, 0xe0, 0x04, 0x58, + 0x90, 0x8a, 0x00, 0x34, 0x1a, 0x0c, 0x0d, 0x85, 0x90, 0x82, 0x00, 0x1b, + 0x00, 0x02, 0x91, 0xbc, 0x91, 0xba, 0x91, 0xba, 0x91, 0xba, 0x91, 0xba, + 0x91, 0xba, 0x91, 0xbe, 0x91, 0xba, 0x91, 0xba, 0x91, 0xba, 0x91, 0xba, + 0x91, 0xba, 0x91, 0xc0, 0x91, 0xba, 0x91, 0xba, 0x91, 0xba, 0x91, 0xba, + 0x91, 0xba, 0x91, 0xc2, 0x91, 0xba, 0x91, 0xba, 0x91, 0xba, 0x91, 0xba, + 0x91, 0xba, 0x91, 0xc4, 0x08, 0x0c, 0x0d, 0x85, 0xa1, 0x80, 0x00, 0x38, + 0xa1, 0x98, 0x00, 0x28, 0xa1, 0xb0, 0x00, 0x18, 0xa1, 0xc8, 0x00, 0x08, + 0xa1, 0xe0, 0x26, 0x00, 0x00, 0x02, 0x91, 0xe0, 0x91, 0xe2, 0x91, 0xe4, + 0x91, 0xe6, 0x91, 0xe8, 0x91, 0xea, 0x91, 0xec, 0x91, 0xee, 0x91, 0xf0, + 0x91, 0xf2, 0x91, 0xf4, 0x91, 0xf6, 0x91, 0xf8, 0x91, 0xfa, 0x91, 0xfc, + 0x91, 0xfe, 0x92, 0x00, 0x92, 0x02, 0x92, 0x04, 0x92, 0x06, 0x92, 0x08, + 0x92, 0x0a, 0x92, 0x0c, 0x92, 0x0e, 0x92, 0x10, 0x08, 0x0c, 0x0d, 0x85, + 0xb9, 0xe2, 0x04, 0x68, 0xb9, 0xde, 0x04, 0x58, 0xb9, 0xda, 0x04, 0x48, + 0xb9, 0xd6, 0x04, 0x38, 0xb9, 0xd2, 0x04, 0x28, 0xb9, 0xce, 0x04, 0x18, + 0xb9, 0xca, 0x04, 0x08, 0xb9, 0xc6, 0x00, 0xf8, 0xb9, 0xc2, 0x00, 0xe8, + 0xb9, 0xbe, 0x00, 0xd8, 0xb9, 0xba, 0x00, 0xc8, 0xb9, 0xb6, 0x00, 0xb8, + 0xb9, 0xb2, 0x00, 0xa8, 0xb9, 0xae, 0x00, 0x98, 0xb9, 0xaa, 0x00, 0x88, + 0xb9, 0xa6, 0x00, 0x78, 0xb9, 0xa2, 0x00, 0x68, 0xb9, 0x9e, 0x00, 0x58, + 0xb9, 0x9a, 0x00, 0x48, 0xb9, 0x96, 0x00, 0x38, 0xb9, 0x92, 0x00, 0x28, + 0xb9, 0x8e, 0x00, 0x18, 0xb9, 0x8a, 0x00, 0x08, 0xb9, 0x86, 0x86, 0x31, + 0x84, 0x21, 0x01, 0x30, 0x08, 0x0c, 0x1e, 0x97, 0x09, 0x0c, 0x0d, 0x85, + 0x08, 0x04, 0x91, 0x64, 0x00, 0xae, 0x00, 0xbe, 0x00, 0xce, 0x00, 0xee, + 0x00, 0x05, 0xa8, 0x6c, 0xa0, 0x6e, 0xa8, 0x70, 0xa0, 0x72, 0xa0, 0x77, + 0x00, 0xff, 0x90, 0x06, 0x08, 0x04, 0x91, 0x46, 0x00, 0x06, 0x00, 0x16, + 0x00, 0xb6, 0x60, 0x10, 0x20, 0x58, 0xb8, 0x10, 0x90, 0x05, 0x01, 0xb0, + 0x20, 0x01, 0x19, 0x25, 0x20, 0x04, 0x90, 0x05, 0x01, 0x88, 0x20, 0x01, + 0x18, 0x00, 0x20, 0x04, 0x90, 0x86, 0x00, 0x03, 0x11, 0x58, 0x00, 0x36, + 0x00, 0x46, 0xbb, 0xa0, 0x20, 0x21, 0x00, 0x04, 0x20, 0x11, 0x80, 0x14, + 0x08, 0x0c, 0x4c, 0xa1, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0xbe, 0x00, 0x1e, + 0x00, 0x0e, 0x00, 0x05, 0x90, 0x16, 0x71, 0x0c, 0xa8, 0x34, 0x91, 0x0a, + 0xa9, 0x36, 0x70, 0x08, 0x90, 0x05, 0x01, 0x20, 0x82, 0x10, 0x91, 0x0a, + 0x02, 0x30, 0x01, 0x28, 0x70, 0x10, 0x82, 0x10, 0x91, 0x0a, 0x02, 0x08, + 0x1d, 0xe0, 0xaa, 0x8a, 0xa2, 0x6a, 0x00, 0x05, 0x00, 0xf6, 0x00, 0xd6, + 0x00, 0x36, 0x20, 0x79, 0x03, 0x00, 0x78, 0x1b, 0x02, 0x00, 0x78, 0x18, + 0xd0, 0x94, 0x1d, 0xd8, 0x78, 0x1b, 0x02, 0x02, 0xa0, 0x01, 0xa0, 0x01, + 0x78, 0x18, 0xd0, 0x94, 0x1d, 0xa0, 0xb8, 0xac, 0x90, 0x6d, 0x01, 0x98, + 0x20, 0x79, 0x00, 0x00, 0x9c, 0x1e, 0x11, 0x18, 0x68, 0x0c, 0xb8, 0xae, + 0x00, 0x50, 0x9c, 0x06, 0x01, 0x30, 0x2d, 0x78, 0x68, 0x0c, 0x90, 0x6d, + 0x1d, 0xd0, 0x08, 0x0c, 0x0d, 0x85, 0x6b, 0x0c, 0x7b, 0x0e, 0x60, 0x0f, + 0x00, 0x00, 0x20, 0x79, 0x03, 0x00, 0x78, 0x1b, 0x02, 0x00, 0x00, 0x3e, + 0x00, 0xde, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0x96, + 0x00, 0xc6, 0x00, 0x36, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x01, 0x56, + 0x20, 0xa9, 0x01, 0xff, 0x20, 0x71, 0x03, 0x00, 0x70, 0x1b, 0x02, 0x00, + 0x70, 0x18, 0xd0, 0x94, 0x01, 0x10, 0x1f, 0x04, 0x92, 0x9a, 0x70, 0x1b, + 0x02, 0x02, 0xa0, 0x01, 0xa0, 0x01, 0x70, 0x18, 0xd0, 0x94, 0x1d, 0x90, + 0xb8, 0xac, 0x90, 0x65, 0x01, 0xf0, 0x60, 0x0c, 0xb8, 0xae, 0x60, 0x24, + 0xc0, 0x8d, 0x60, 0x26, 0x60, 0x03, 0x00, 0x04, 0x60, 0x1b, 0x00, 0x00, + 0x60, 0x13, 0x00, 0x00, 0x60, 0x1f, 0x01, 0x01, 0x60, 0x14, 0x90, 0x4d, + 0x09, 0x0c, 0x0d, 0x85, 0xa8, 0x8b, 0x00, 0x00, 0xa8, 0xa8, 0xa8, 0xab, + 0x00, 0x00, 0x90, 0x4d, 0x09, 0x0c, 0x0d, 0x85, 0x08, 0x0c, 0x10, 0x8b, + 0x08, 0x0c, 0x8e, 0x58, 0x08, 0xf8, 0x20, 0x71, 0x03, 0x00, 0x70, 0x1b, + 0x02, 0x00, 0x01, 0x5e, 0x01, 0x2e, 0x00, 0x3e, 0x00, 0xce, 0x00, 0x9e, + 0x00, 0xde, 0x00, 0xee, 0x00, 0x05, 0x00, 0xc6, 0x00, 0xb6, 0x00, 0x16, + 0x00, 0x06, 0x01, 0x56, 0x08, 0x0c, 0x26, 0x8c, 0x01, 0x5e, 0x11, 0xb0, + 0x08, 0x0c, 0x67, 0x49, 0x19, 0x0c, 0x0d, 0x85, 0x00, 0x0e, 0x00, 0x1e, + 0xb9, 0x12, 0xb8, 0x16, 0x08, 0x0c, 0xb1, 0x16, 0x01, 0x40, 0x2b, 0x00, + 0x60, 0x12, 0x60, 0x23, 0x00, 0x01, 0x20, 0x09, 0x00, 0x01, 0x08, 0x0c, + 0xb2, 0x0a, 0x00, 0xbe, 0x00, 0xce, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x1e, + 0x0c, 0xd0, 0x00, 0x66, 0x60, 0x00, 0x90, 0xb2, 0x00, 0x10, 0x1a, 0x0c, + 0x0d, 0x85, 0x00, 0x13, 0x00, 0x6e, 0x00, 0x05, 0x93, 0x10, 0x93, 0x10, + 0x93, 0x10, 0x93, 0x12, 0x93, 0x5b, 0x93, 0x10, 0x93, 0x10, 0x93, 0x10, + 0x93, 0xd5, 0x93, 0x10, 0x94, 0x0d, 0x93, 0x10, 0x93, 0x10, 0x93, 0x10, + 0x93, 0x10, 0x93, 0x10, 0x08, 0x0c, 0x0d, 0x85, 0x91, 0x82, 0x00, 0x40, + 0x00, 0x02, 0x93, 0x25, 0x93, 0x25, 0x93, 0x25, 0x93, 0x25, 0x93, 0x25, + 0x93, 0x25, 0x93, 0x25, 0x93, 0x25, 0x93, 0x25, 0x93, 0x27, 0x93, 0x38, + 0x93, 0x25, 0x93, 0x25, 0x93, 0x25, 0x93, 0x25, 0x93, 0x49, 0x08, 0x0c, + 0x0d, 0x85, 0x00, 0x96, 0x61, 0x14, 0x21, 0x48, 0xa8, 0x7b, 0x00, 0x00, + 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0xbb, 0x05, 0x00, 0x00, 0xbe, + 0x08, 0x0c, 0x6e, 0x11, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x9e, 0x00, 0x05, + 0x08, 0x0c, 0x9a, 0x48, 0x00, 0xd6, 0x61, 0x14, 0x08, 0x0c, 0xcf, 0x1b, + 0x01, 0x30, 0x00, 0x96, 0x61, 0x14, 0x21, 0x48, 0x08, 0x0c, 0x70, 0x12, + 0x00, 0x9e, 0x00, 0xde, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x05, 0x08, 0x0c, + 0x9a, 0x48, 0x08, 0x0c, 0x33, 0x15, 0x61, 0x14, 0x00, 0x96, 0x21, 0x48, + 0x08, 0x0c, 0xcf, 0x1b, 0x01, 0x20, 0xa8, 0x7b, 0x00, 0x29, 0x08, 0x0c, + 0x70, 0x12, 0x00, 0x9e, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x05, 0x60, 0x1b, + 0x00, 0x00, 0x91, 0x82, 0x00, 0x40, 0x00, 0x96, 0x00, 0x02, 0x93, 0x76, + 0x93, 0x76, 0x93, 0x76, 0x93, 0x76, 0x93, 0x76, 0x93, 0x76, 0x93, 0x76, + 0x93, 0x76, 0x93, 0x78, 0x93, 0x76, 0x93, 0x76, 0x93, 0x76, 0x93, 0xd1, + 0x93, 0x76, 0x93, 0x76, 0x93, 0x76, 0x93, 0x76, 0x93, 0x76, 0x93, 0x76, + 0x93, 0x7f, 0x93, 0x76, 0x08, 0x0c, 0x0d, 0x85, 0x61, 0x14, 0x21, 0x48, + 0xa9, 0x38, 0x91, 0x8e, 0xff, 0xff, 0x09, 0x04, 0x93, 0xd1, 0x60, 0x24, + 0xd0, 0x8c, 0x15, 0xd8, 0x08, 0x0c, 0x8f, 0x0e, 0x05, 0xe0, 0x00, 0xe6, + 0x61, 0x14, 0x21, 0x48, 0x08, 0x0c, 0x91, 0x2e, 0x00, 0x96, 0xa8, 0xa8, + 0x20, 0x48, 0x08, 0x0c, 0x6d, 0xa9, 0x00, 0x9e, 0xa8, 0xab, 0x00, 0x00, + 0x60, 0x10, 0x90, 0x05, 0x01, 0x28, 0x00, 0xb6, 0x20, 0x58, 0x08, 0x0c, + 0x92, 0x5e, 0x00, 0xbe, 0xae, 0x88, 0x00, 0xb6, 0x20, 0x59, 0x00, 0x00, + 0x08, 0x0c, 0x8e, 0x61, 0x00, 0xbe, 0x01, 0xe0, 0x20, 0x71, 0x19, 0x3d, + 0x08, 0x0c, 0x8e, 0xa8, 0x01, 0xb8, 0x90, 0x86, 0x00, 0x01, 0x11, 0x28, + 0x20, 0x01, 0x19, 0x47, 0x20, 0x04, 0x90, 0x05, 0x11, 0x78, 0x00, 0x96, + 0x08, 0x0c, 0x10, 0x59, 0x29, 0x00, 0x00, 0x9e, 0x01, 0x48, 0xa8, 0xaa, + 0x00, 0xf6, 0x2c, 0x78, 0x08, 0x0c, 0x8e, 0x1c, 0x00, 0xfe, 0x00, 0xee, + 0x00, 0x9e, 0x00, 0x05, 0x08, 0x0c, 0x8e, 0x58, 0x0c, 0xd0, 0x08, 0x0c, + 0x8f, 0x13, 0x11, 0x60, 0x60, 0x10, 0x90, 0x05, 0x01, 0x30, 0x20, 0x58, + 0xb8, 0xac, 0x90, 0x05, 0x19, 0x0c, 0x0d, 0x85, 0x60, 0x12, 0x2c, 0x00, + 0x08, 0x0c, 0x8e, 0xd9, 0x00, 0x05, 0x08, 0x0c, 0x94, 0x89, 0x00, 0x9e, + 0x00, 0x05, 0x91, 0x82, 0x00, 0x40, 0x00, 0x96, 0x00, 0x02, 0x93, 0xe9, + 0x93, 0xe9, 0x93, 0xe9, 0x93, 0xeb, 0x93, 0xe9, 0x93, 0xe9, 0x93, 0xe9, + 0x94, 0x0b, 0x93, 0xe9, 0x93, 0xe9, 0x93, 0xe9, 0x93, 0xe9, 0x93, 0xe9, + 0x93, 0xe9, 0x93, 0xe9, 0x93, 0xe9, 0x08, 0x0c, 0x0d, 0x85, 0x60, 0x03, + 0x00, 0x03, 0x61, 0x06, 0x60, 0x14, 0x20, 0x48, 0xa8, 0xac, 0xa8, 0x36, + 0xa8, 0xb0, 0xa8, 0x3a, 0xa8, 0x47, 0x00, 0x00, 0xa8, 0x4b, 0x00, 0x00, + 0xa8, 0x84, 0x90, 0x92, 0x19, 0x9a, 0x02, 0x10, 0x20, 0x01, 0x19, 0x99, + 0x80, 0x03, 0x80, 0x13, 0x82, 0x13, 0x92, 0x10, 0x62, 0x1a, 0x08, 0x0c, + 0x1c, 0x26, 0x20, 0x09, 0x80, 0x30, 0x08, 0x0c, 0x96, 0x5e, 0x00, 0x9e, + 0x00, 0x05, 0x08, 0x0c, 0x0d, 0x85, 0x08, 0x0c, 0x9a, 0x48, 0x61, 0x14, + 0x21, 0x48, 0xa8, 0x7b, 0x00, 0x00, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, + 0xb8, 0xbb, 0x05, 0x00, 0x00, 0xbe, 0x08, 0x0c, 0x70, 0x12, 0x08, 0x0c, + 0xb1, 0x6c, 0x00, 0x9e, 0x00, 0x05, 0x08, 0x0c, 0xac, 0xfc, 0x61, 0x44, + 0xd1, 0xfc, 0x01, 0x20, 0xd1, 0xac, 0x11, 0x10, 0x60, 0x03, 0x00, 0x03, + 0x60, 0x00, 0x90, 0x8a, 0x00, 0x10, 0x1a, 0x0c, 0x0d, 0x85, 0x00, 0x96, + 0x00, 0x23, 0x00, 0x9e, 0x08, 0x0c, 0xad, 0x18, 0x00, 0x05, 0x94, 0x43, + 0x94, 0x43, 0x94, 0x43, 0x94, 0x45, 0x94, 0x56, 0x94, 0x43, 0x94, 0x43, + 0x94, 0x43, 0x94, 0x43, 0x94, 0x43, 0x94, 0x43, 0x94, 0x43, 0x94, 0x43, + 0x94, 0x43, 0x94, 0x43, 0x94, 0x43, 0x08, 0x0c, 0x0d, 0x85, 0x08, 0x0c, + 0xae, 0xe3, 0x61, 0x14, 0x21, 0x48, 0xa8, 0x7b, 0x00, 0x06, 0x60, 0x10, + 0x00, 0xb6, 0x20, 0x58, 0xb8, 0xbb, 0x05, 0x00, 0x00, 0xbe, 0x08, 0x0c, + 0x70, 0x12, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x05, 0x04, 0x91, 0x00, 0x05, + 0x08, 0x0c, 0xac, 0xfc, 0x60, 0x00, 0x61, 0x44, 0xd1, 0xfc, 0x01, 0x30, + 0xd1, 0xac, 0x11, 0x20, 0x60, 0x03, 0x00, 0x03, 0x20, 0x09, 0x00, 0x03, + 0x90, 0x8a, 0x00, 0x10, 0x1a, 0x0c, 0x0d, 0x85, 0x00, 0x96, 0x00, 0x33, + 0x00, 0x9e, 0x01, 0x06, 0x08, 0x0c, 0xad, 0x18, 0x01, 0x0e, 0x00, 0x05, + 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x94, 0x82, 0x94, 0x89, 0x94, 0x80, + 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, + 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x08, 0x0c, 0x0d, 0x85, + 0x00, 0x36, 0x00, 0xe6, 0x08, 0x0c, 0xae, 0xe3, 0x00, 0xee, 0x00, 0x3e, + 0x00, 0x05, 0x60, 0x24, 0xd0, 0x8c, 0x11, 0xf0, 0x00, 0xf6, 0x00, 0xe6, + 0x60, 0x1b, 0x00, 0x00, 0x60, 0x14, 0x20, 0x48, 0x60, 0x10, 0x90, 0x05, + 0x01, 0x28, 0x00, 0xb6, 0x20, 0x58, 0x08, 0x0c, 0x92, 0x5e, 0x00, 0xbe, + 0x20, 0x71, 0x19, 0x3d, 0x08, 0x0c, 0x8e, 0xa8, 0x01, 0x60, 0x20, 0x01, + 0x18, 0x7f, 0x20, 0x04, 0xa8, 0x8a, 0x20, 0x31, 0x00, 0x00, 0x2c, 0x78, + 0x08, 0x0c, 0x8e, 0x1c, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, 0x00, 0x96, + 0xa8, 0x8b, 0x00, 0x00, 0xa8, 0xa8, 0x20, 0x48, 0x08, 0x0c, 0x10, 0x8b, + 0x00, 0x9e, 0xa8, 0xab, 0x00, 0x00, 0x08, 0x0c, 0x8e, 0x58, 0x0c, 0x80, + 0x20, 0x01, 0x19, 0x25, 0x20, 0x0c, 0x91, 0x8e, 0x00, 0x00, 0x19, 0x0c, + 0x8f, 0x0e, 0x05, 0xc8, 0x00, 0xe6, 0x20, 0x71, 0x19, 0x24, 0x71, 0x10, + 0xc1, 0xc5, 0x71, 0x12, 0x08, 0x0c, 0x8f, 0x18, 0x00, 0xf6, 0x00, 0xc6, + 0x20, 0x71, 0x10, 0x00, 0x00, 0xb6, 0x2e, 0x04, 0x90, 0x5d, 0x01, 0x38, + 0xb8, 0xac, 0x90, 0x65, 0x01, 0x20, 0x08, 0x0c, 0x8e, 0xee, 0x09, 0x0c, + 0x92, 0x8d, 0x8e, 0x70, 0x9e, 0x86, 0x18, 0x00, 0x1d, 0x90, 0x00, 0xbe, + 0x00, 0xd6, 0x00, 0x96, 0x00, 0x46, 0x20, 0x61, 0x1d, 0xdc, 0x20, 0x01, + 0x18, 0x1a, 0x20, 0x24, 0x60, 0x20, 0x90, 0x86, 0x00, 0x00, 0x11, 0x91, + 0x9c, 0xe0, 0x00, 0x1c, 0x24, 0x00, 0x9c, 0x06, 0x1d, 0xb8, 0x00, 0x4e, + 0x00, 0x9e, 0x00, 0xde, 0x00, 0xd1, 0x00, 0xce, 0x00, 0xfe, 0x20, 0x71, + 0x19, 0x24, 0x71, 0x10, 0xc1, 0xc4, 0x71, 0x12, 0x00, 0xee, 0x00, 0x05, + 0x60, 0x20, 0x90, 0x86, 0x00, 0x09, 0x11, 0x60, 0x61, 0x00, 0x91, 0x86, + 0x00, 0x04, 0x11, 0x38, 0x61, 0x10, 0x81, 0xff, 0x19, 0x0c, 0x0d, 0x85, + 0x2c, 0x00, 0x08, 0x0c, 0x8e, 0xd9, 0x90, 0x06, 0x00, 0x05, 0x20, 0x71, + 0x19, 0x3f, 0x20, 0x73, 0x00, 0x00, 0x8e, 0x70, 0x9e, 0x86, 0x19, 0x47, + 0x1d, 0xd0, 0x20, 0x71, 0x19, 0x3d, 0x70, 0x06, 0x70, 0x02, 0x20, 0x01, + 0x19, 0x30, 0x20, 0x64, 0x8c, 0xff, 0x01, 0x30, 0x61, 0x20, 0x91, 0x8e, + 0x00, 0x00, 0x19, 0x0c, 0x0d, 0x85, 0x21, 0x02, 0x20, 0x01, 0x18, 0x8a, + 0x20, 0x0c, 0x81, 0xff, 0x01, 0x48, 0x00, 0x96, 0x21, 0x48, 0x08, 0x0c, + 0x10, 0x8b, 0x00, 0x9e, 0x20, 0x01, 0x18, 0x8a, 0x20, 0x03, 0x00, 0x00, + 0x20, 0x71, 0x19, 0x31, 0x08, 0x0c, 0x90, 0xf7, 0x08, 0x04, 0x91, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x7a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x00, 0x36, 0x00, 0x46, 0x20, 0xa9, 0x00, 0x10, 0x90, 0x06, + 0x80, 0x04, 0x80, 0x86, 0x81, 0x8e, 0x12, 0x08, 0x92, 0x00, 0x1f, 0x04, + 0x95, 0x4f, 0x80, 0x86, 0x81, 0x8e, 0x00, 0x4e, 0x00, 0x3e, 0x01, 0x2e, + 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0x76, 0x01, 0x56, + 0x20, 0xa9, 0x00, 0x10, 0x90, 0x05, 0x01, 0xc8, 0x91, 0x1a, 0x12, 0xb8, + 0x82, 0x13, 0x81, 0x8d, 0x02, 0x28, 0x91, 0x1a, 0x12, 0x20, 0x1f, 0x04, + 0x95, 0x66, 0x00, 0x28, 0x91, 0x1a, 0x23, 0x08, 0x82, 0x10, 0x1f, 0x04, + 0x95, 0x66, 0x00, 0x06, 0x32, 0x00, 0x90, 0x84, 0xef, 0xff, 0x20, 0x80, + 0x00, 0x0e, 0x01, 0x5e, 0x00, 0x7e, 0x01, 0x2e, 0x00, 0x05, 0x00, 0x06, + 0x32, 0x00, 0x90, 0x85, 0x10, 0x00, 0x0c, 0xa8, 0x01, 0x26, 0x20, 0x91, + 0x28, 0x00, 0x20, 0x79, 0x19, 0xe8, 0x01, 0x2e, 0x00, 0xd6, 0x20, 0x69, + 0x19, 0xe8, 0x68, 0x03, 0x00, 0x05, 0x01, 0x56, 0x01, 0x46, 0x01, 0xd6, + 0x20, 0xe9, 0x00, 0x00, 0x20, 0x69, 0x02, 0x00, 0x08, 0x0c, 0xaa, 0xf1, + 0x04, 0xc9, 0x08, 0x0c, 0xaa, 0xdc, 0x04, 0xb1, 0x08, 0x0c, 0xaa, 0xdf, + 0x04, 0x99, 0x08, 0x0c, 0xaa, 0xe2, 0x04, 0x81, 0x08, 0x0c, 0xaa, 0xe5, + 0x04, 0x69, 0x08, 0x0c, 0xaa, 0xe8, 0x04, 0x51, 0x08, 0x0c, 0xaa, 0xeb, + 0x04, 0x39, 0x08, 0x0c, 0xaa, 0xee, 0x04, 0x21, 0x01, 0xde, 0x01, 0x4e, + 0x01, 0x5e, 0x68, 0x57, 0x00, 0x00, 0x00, 0xf6, 0x20, 0x79, 0x03, 0x80, + 0x04, 0x19, 0x78, 0x07, 0x00, 0x03, 0x78, 0x03, 0x00, 0x00, 0x78, 0x03, + 0x00, 0x01, 0x20, 0x69, 0x00, 0x04, 0x2d, 0x04, 0x90, 0x84, 0xff, 0xfe, + 0x90, 0x85, 0x80, 0x00, 0x20, 0x6a, 0x20, 0x69, 0x01, 0x00, 0x68, 0x28, + 0x90, 0x84, 0xff, 0xfc, 0x68, 0x2a, 0x00, 0xfe, 0x20, 0x01, 0x1b, 0x5d, + 0x20, 0x03, 0x00, 0x00, 0x00, 0xde, 0x00, 0x05, 0x20, 0xa9, 0x00, 0x20, + 0x20, 0xa1, 0x02, 0x40, 0x20, 0x01, 0x00, 0x00, 0x40, 0x04, 0x00, 0x05, + 0x00, 0xc6, 0x78, 0x03, 0x00, 0x00, 0x90, 0x06, 0x78, 0x27, 0x00, 0x30, + 0x78, 0x2b, 0x04, 0x00, 0x78, 0x27, 0x00, 0x31, 0x78, 0x2b, 0x1a, 0xf6, + 0x78, 0x1f, 0xff, 0x00, 0x78, 0x1b, 0xff, 0x00, 0x20, 0x61, 0x1a, 0xeb, + 0x60, 0x2f, 0x19, 0xe8, 0x60, 0x33, 0x18, 0x00, 0x60, 0x37, 0x1a, 0x04, + 0x60, 0x3b, 0x1e, 0xc1, 0x60, 0x3f, 0x1e, 0xd1, 0x60, 0x42, 0x60, 0x47, + 0x1a, 0xc1, 0x00, 0xce, 0x00, 0x05, 0x20, 0x01, 0x03, 0x82, 0x20, 0x04, + 0x90, 0x84, 0x00, 0x07, 0x90, 0x86, 0x00, 0x01, 0x01, 0xb0, 0x00, 0xc6, + 0x61, 0x46, 0x60, 0x0f, 0x00, 0x00, 0x2c, 0x08, 0x20, 0x61, 0x19, 0xe8, + 0x60, 0x2c, 0x80, 0x00, 0x60, 0x2e, 0x60, 0x1c, 0x90, 0x05, 0x01, 0x30, + 0x90, 0x80, 0x00, 0x03, 0x21, 0x02, 0x61, 0x1e, 0x00, 0xce, 0x00, 0x05, + 0x61, 0x22, 0x61, 0x1e, 0x0c, 0xd8, 0x61, 0x46, 0x2c, 0x08, 0x20, 0x01, + 0x00, 0x12, 0x08, 0x0c, 0xac, 0xed, 0x00, 0x05, 0x00, 0x16, 0x20, 0x09, + 0x80, 0x20, 0x61, 0x46, 0x2c, 0x08, 0x20, 0x01, 0x03, 0x82, 0x20, 0x04, + 0x90, 0x84, 0x00, 0x07, 0x90, 0x86, 0x00, 0x01, 0x11, 0x28, 0x20, 0x01, + 0x00, 0x19, 0x08, 0x0c, 0xac, 0xed, 0x00, 0x88, 0x00, 0xc6, 0x20, 0x61, + 0x19, 0xe8, 0x60, 0x2c, 0x80, 0x00, 0x60, 0x2e, 0x60, 0x0c, 0x90, 0x05, + 0x01, 0x28, 0x90, 0x80, 0x00, 0x03, 0x21, 0x02, 0x61, 0x0e, 0x00, 0x10, + 0x61, 0x12, 0x61, 0x0e, 0x00, 0xce, 0x00, 0x1e, 0x00, 0x05, 0x20, 0x01, + 0x03, 0x82, 0x20, 0x04, 0x90, 0x84, 0x00, 0x07, 0x90, 0x86, 0x00, 0x01, + 0x01, 0x98, 0x00, 0xc6, 0x61, 0x46, 0x60, 0x0f, 0x00, 0x00, 0x2c, 0x08, + 0x20, 0x61, 0x19, 0xe8, 0x60, 0x44, 0x90, 0x05, 0x01, 0x30, 0x90, 0x80, + 0x00, 0x03, 0x21, 0x02, 0x61, 0x46, 0x00, 0xce, 0x00, 0x05, 0x61, 0x4a, + 0x61, 0x46, 0x0c, 0xd8, 0x61, 0x46, 0x60, 0x0f, 0x00, 0x00, 0x2c, 0x08, + 0x20, 0x01, 0x00, 0x13, 0x08, 0x0c, 0xac, 0xed, 0x00, 0x05, 0x60, 0x44, + 0xd0, 0xdc, 0x01, 0x10, 0x08, 0x0c, 0xa7, 0x8a, 0x00, 0x05, 0x00, 0xf6, + 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, 0x00, 0xb6, 0x00, 0x96, 0x00, 0x76, + 0x00, 0x66, 0x00, 0x56, 0x00, 0x36, 0x00, 0x26, 0x00, 0x16, 0x00, 0x06, + 0x01, 0x26, 0x90, 0x2e, 0x20, 0x71, 0x19, 0xe8, 0x76, 0x48, 0x26, 0x60, + 0x26, 0x78, 0x20, 0x91, 0x80, 0x00, 0x8c, 0xff, 0x09, 0x04, 0x96, 0xf1, + 0x9c, 0x86, 0x1b, 0x55, 0x09, 0x04, 0x96, 0xec, 0x60, 0x10, 0x20, 0x58, + 0xb8, 0xa0, 0x92, 0x06, 0x19, 0x04, 0x96, 0xec, 0x87, 0xff, 0x01, 0x20, + 0x60, 0x5c, 0x91, 0x06, 0x19, 0x04, 0x96, 0xec, 0x70, 0x4c, 0x9c, 0x06, + 0x11, 0x88, 0x00, 0x36, 0x20, 0x19, 0x00, 0x01, 0x08, 0x0c, 0xa5, 0x96, + 0x70, 0x3f, 0x00, 0x00, 0x90, 0x06, 0x70, 0x4e, 0x70, 0x6a, 0x70, 0x52, + 0x70, 0x6e, 0x08, 0x0c, 0xaf, 0xf4, 0x00, 0x3e, 0x20, 0x29, 0x00, 0x01, + 0x08, 0x0c, 0x96, 0x67, 0x70, 0x48, 0x9c, 0x36, 0x11, 0x10, 0x66, 0x0c, + 0x76, 0x4a, 0x70, 0x44, 0x9c, 0x36, 0x11, 0x40, 0x2c, 0x00, 0x9f, 0x36, + 0x01, 0x18, 0x2f, 0x00, 0x70, 0x46, 0x00, 0x10, 0x70, 0x47, 0x00, 0x00, + 0x66, 0x0c, 0x00, 0x66, 0x2c, 0x00, 0x9f, 0x06, 0x01, 0x10, 0x7e, 0x0e, + 0x00, 0x08, 0x26, 0x78, 0x60, 0x0f, 0x00, 0x00, 0x08, 0x0c, 0xcf, 0x1b, + 0x01, 0xf0, 0x60, 0x14, 0x20, 0x48, 0x60, 0x20, 0x90, 0x86, 0x00, 0x03, + 0x15, 0x88, 0x60, 0x04, 0x90, 0x86, 0x00, 0x40, 0x09, 0x0c, 0xa7, 0x8a, + 0xa8, 0x67, 0x01, 0x03, 0xab, 0x7a, 0xa8, 0x77, 0x00, 0x00, 0x00, 0x16, + 0x00, 0x36, 0x00, 0x76, 0x08, 0x0c, 0xd2, 0x20, 0x08, 0x0c, 0xed, 0xdf, + 0x08, 0x0c, 0x70, 0x12, 0x00, 0x7e, 0x00, 0x3e, 0x00, 0x1e, 0x08, 0x0c, + 0xd1, 0x0c, 0x08, 0x0c, 0xb1, 0xa7, 0x00, 0xce, 0x08, 0x04, 0x96, 0x83, + 0x2c, 0x78, 0x60, 0x0c, 0x20, 0x60, 0x08, 0x04, 0x96, 0x83, 0x01, 0x2e, + 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x3e, 0x00, 0x5e, 0x00, 0x6e, + 0x00, 0x7e, 0x00, 0x9e, 0x00, 0xbe, 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, + 0x00, 0xfe, 0x00, 0x05, 0x60, 0x20, 0x90, 0x86, 0x00, 0x06, 0x11, 0x58, + 0x00, 0x16, 0x00, 0x36, 0x00, 0x76, 0x08, 0x0c, 0xed, 0xdf, 0x08, 0x0c, + 0xea, 0x30, 0x00, 0x7e, 0x00, 0x3e, 0x00, 0x1e, 0x08, 0xc0, 0x60, 0x20, + 0x90, 0x86, 0x00, 0x09, 0x11, 0x68, 0xa8, 0x7b, 0x00, 0x06, 0x00, 0x16, + 0x00, 0x36, 0x00, 0x76, 0x08, 0x0c, 0x70, 0x12, 0x08, 0x0c, 0xb1, 0x6c, + 0x00, 0x7e, 0x00, 0x3e, 0x00, 0x1e, 0x08, 0x48, 0x60, 0x20, 0x90, 0x86, + 0x00, 0x0a, 0x09, 0x04, 0x96, 0xd6, 0x08, 0x04, 0x96, 0xcf, 0x00, 0x06, + 0x00, 0x66, 0x00, 0x96, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xf6, 0x90, 0x36, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x79, 0x19, 0xe8, 0x78, 0x48, + 0x90, 0x65, 0x09, 0x04, 0x97, 0x90, 0x60, 0x0c, 0x00, 0x06, 0x60, 0x0f, + 0x00, 0x00, 0x78, 0x4c, 0x9c, 0x06, 0x11, 0xb0, 0x00, 0x36, 0x20, 0x19, + 0x00, 0x01, 0x08, 0x0c, 0xa5, 0x96, 0x78, 0x3f, 0x00, 0x00, 0x90, 0x1e, + 0x7b, 0x4e, 0x7b, 0x6a, 0x7b, 0x52, 0x7b, 0x6e, 0x08, 0x0c, 0xaf, 0xf4, + 0x00, 0x3e, 0x00, 0x0e, 0x90, 0x05, 0x11, 0x18, 0x60, 0x0c, 0x60, 0x0f, + 0x00, 0x00, 0x00, 0x06, 0x9c, 0x86, 0x1b, 0x55, 0x05, 0xb0, 0x00, 0xe6, + 0x2f, 0x70, 0x08, 0x0c, 0x96, 0x67, 0x00, 0xee, 0x08, 0x0c, 0xcf, 0x1b, + 0x05, 0x48, 0x60, 0x14, 0x20, 0x48, 0x60, 0x20, 0x90, 0x86, 0x00, 0x03, + 0x15, 0xa8, 0x3e, 0x08, 0x91, 0x8e, 0x00, 0x02, 0x11, 0x88, 0x60, 0x10, + 0x90, 0x05, 0x01, 0x70, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x00, 0x00, 0xbe, + 0xd0, 0xbc, 0x01, 0x40, 0x60, 0x48, 0x90, 0x05, 0x11, 0xc0, 0x20, 0x01, + 0x19, 0x88, 0x20, 0x04, 0x60, 0x4a, 0x00, 0x98, 0x60, 0x04, 0x90, 0x86, + 0x00, 0x40, 0x09, 0x0c, 0xa7, 0x8a, 0xa8, 0x67, 0x01, 0x03, 0xab, 0x7a, + 0xa8, 0x77, 0x00, 0x00, 0x08, 0x0c, 0x70, 0x06, 0x08, 0x0c, 0xd1, 0x0c, + 0x60, 0x44, 0xc0, 0xfc, 0x60, 0x46, 0x08, 0x0c, 0xb1, 0xa7, 0x00, 0x0e, + 0x08, 0x04, 0x97, 0x34, 0x7e, 0x4a, 0x7e, 0x46, 0x01, 0x2e, 0x00, 0xfe, + 0x00, 0xde, 0x00, 0xce, 0x00, 0x9e, 0x00, 0x6e, 0x00, 0x0e, 0x00, 0x05, + 0x60, 0x20, 0x90, 0x86, 0x00, 0x06, 0x11, 0x18, 0x08, 0x0c, 0xea, 0x30, + 0x0c, 0x38, 0x60, 0x20, 0x90, 0x86, 0x00, 0x09, 0x11, 0x30, 0xab, 0x7a, + 0x08, 0x0c, 0x70, 0x12, 0x08, 0x0c, 0xb1, 0x6c, 0x0c, 0x10, 0x60, 0x20, + 0x90, 0x86, 0x00, 0x0a, 0x09, 0x90, 0x08, 0x50, 0x00, 0x16, 0x00, 0x26, + 0x00, 0x86, 0x90, 0x46, 0x00, 0xa9, 0x08, 0x0c, 0x98, 0xa3, 0x00, 0x8e, + 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xf6, 0x01, 0x26, 0x20, 0x79, + 0x19, 0xe8, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x98, 0xec, 0x08, 0x0c, + 0x99, 0x82, 0x08, 0x0c, 0x69, 0x48, 0x01, 0x2e, 0x00, 0xfe, 0x00, 0x05, + 0x00, 0xb6, 0x00, 0x96, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, + 0x00, 0x66, 0x00, 0x16, 0x00, 0x06, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x71, 0x19, 0xe8, 0x76, 0x20, 0x26, 0x60, 0x26, 0x78, 0x8c, 0xff, + 0x09, 0x04, 0x98, 0x68, 0x60, 0x10, 0x20, 0x58, 0xb8, 0xa0, 0x92, 0x06, + 0x19, 0x04, 0x98, 0x63, 0x88, 0xff, 0x01, 0x20, 0x60, 0x5c, 0x91, 0x06, + 0x19, 0x04, 0x98, 0x63, 0x70, 0x30, 0x9c, 0x06, 0x15, 0x80, 0x20, 0x69, + 0x01, 0x00, 0x68, 0x20, 0xd0, 0xa4, 0x01, 0x10, 0xd0, 0xcc, 0x15, 0x08, + 0x08, 0x0c, 0x8a, 0x4b, 0x08, 0x0c, 0xa2, 0xa0, 0x68, 0xc3, 0x00, 0x00, + 0x08, 0x0c, 0xa7, 0x8a, 0x70, 0x33, 0x00, 0x00, 0x00, 0x36, 0x20, 0x69, + 0x01, 0x40, 0x6b, 0x04, 0x93, 0x84, 0x10, 0x00, 0x01, 0x38, 0x20, 0x01, + 0x01, 0x00, 0x08, 0x0c, 0x2a, 0x99, 0x90, 0x06, 0x08, 0x0c, 0x2a, 0x99, + 0x20, 0x69, 0x01, 0x00, 0x68, 0x24, 0xd0, 0x84, 0x01, 0x10, 0x68, 0x27, + 0x00, 0x01, 0x00, 0x3e, 0x00, 0x40, 0x70, 0x08, 0xc0, 0xad, 0x70, 0x0a, + 0x60, 0x03, 0x00, 0x09, 0x63, 0x0a, 0x08, 0x04, 0x98, 0x63, 0x70, 0x20, + 0x9c, 0x36, 0x11, 0x10, 0x66, 0x0c, 0x76, 0x22, 0x70, 0x1c, 0x9c, 0x36, + 0x11, 0x40, 0x2c, 0x00, 0x9f, 0x36, 0x01, 0x18, 0x2f, 0x00, 0x70, 0x1e, + 0x00, 0x10, 0x70, 0x1f, 0x00, 0x00, 0x66, 0x0c, 0x00, 0x66, 0x2c, 0x00, + 0x9f, 0x06, 0x01, 0x10, 0x7e, 0x0e, 0x00, 0x08, 0x26, 0x78, 0x60, 0x0f, + 0x00, 0x00, 0x60, 0x44, 0xc0, 0xfc, 0x60, 0x46, 0x60, 0x14, 0x20, 0x48, + 0x08, 0x0c, 0xcf, 0x1b, 0x01, 0xe8, 0x60, 0x20, 0x90, 0x86, 0x00, 0x03, + 0x15, 0x80, 0x08, 0x0c, 0xd1, 0x32, 0x11, 0x18, 0x08, 0x0c, 0xbb, 0x5c, + 0x00, 0x98, 0xa8, 0x67, 0x01, 0x03, 0xab, 0x7a, 0xa8, 0x77, 0x00, 0x00, + 0x00, 0x16, 0x00, 0x36, 0x00, 0x86, 0x08, 0x0c, 0xd2, 0x20, 0x08, 0x0c, + 0xed, 0xdf, 0x08, 0x0c, 0x70, 0x12, 0x00, 0x8e, 0x00, 0x3e, 0x00, 0x1e, + 0x08, 0x0c, 0xd1, 0x0c, 0x08, 0x0c, 0xb1, 0xa7, 0x08, 0x0c, 0xa6, 0x5d, + 0x00, 0xce, 0x08, 0x04, 0x97, 0xdb, 0x2c, 0x78, 0x60, 0x0c, 0x20, 0x60, + 0x08, 0x04, 0x97, 0xdb, 0x01, 0x2e, 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x6e, + 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x9e, 0x00, 0xbe, + 0x00, 0x05, 0x60, 0x20, 0x90, 0x86, 0x00, 0x06, 0x11, 0x58, 0x00, 0x16, + 0x00, 0x36, 0x00, 0x86, 0x08, 0x0c, 0xed, 0xdf, 0x08, 0x0c, 0xea, 0x30, + 0x00, 0x8e, 0x00, 0x3e, 0x00, 0x1e, 0x08, 0xd0, 0x08, 0x0c, 0xbb, 0x5c, + 0x60, 0x20, 0x90, 0x86, 0x00, 0x02, 0x11, 0x60, 0x60, 0x04, 0x00, 0x06, + 0x90, 0x86, 0x00, 0x85, 0x00, 0x0e, 0x09, 0x04, 0x98, 0x49, 0x90, 0x86, + 0x00, 0x8b, 0x09, 0x04, 0x98, 0x49, 0x08, 0x40, 0x60, 0x20, 0x90, 0x86, + 0x00, 0x05, 0x19, 0x20, 0x60, 0x04, 0x00, 0x06, 0x90, 0x86, 0x00, 0x85, + 0x00, 0x0e, 0x09, 0xc8, 0x90, 0x86, 0x00, 0x8b, 0x09, 0xb0, 0x08, 0x04, + 0x98, 0x5c, 0x00, 0x06, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0x96, 0x00, 0xb6, + 0x00, 0xc6, 0x00, 0x66, 0x00, 0x16, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x92, 0x80, 0x10, 0x00, 0x20, 0x04, 0x90, 0x5d, 0x20, 0x79, 0x19, 0xe8, + 0x90, 0x36, 0x78, 0x28, 0x20, 0x60, 0x8c, 0xff, 0x05, 0x38, 0x60, 0x10, + 0x9b, 0x06, 0x15, 0x00, 0x60, 0x43, 0xff, 0xff, 0x08, 0x0c, 0xaf, 0x2e, + 0x01, 0xd8, 0x61, 0x0c, 0x00, 0x16, 0x08, 0x0c, 0xa4, 0x20, 0x60, 0x14, + 0x20, 0x48, 0xa8, 0x67, 0x01, 0x03, 0xab, 0x7a, 0xa8, 0x77, 0x00, 0x00, + 0x00, 0x16, 0x00, 0x36, 0x00, 0x86, 0x08, 0x0c, 0xd2, 0x20, 0x08, 0x0c, + 0xed, 0xdf, 0x08, 0x0c, 0x70, 0x12, 0x00, 0x8e, 0x00, 0x3e, 0x00, 0x1e, + 0x08, 0x0c, 0xb1, 0xa7, 0x00, 0xce, 0x08, 0xd8, 0x2c, 0x30, 0x60, 0x0c, + 0x20, 0x60, 0x08, 0xb8, 0x08, 0x0c, 0x69, 0x65, 0x01, 0x2e, 0x00, 0x1e, + 0x00, 0x6e, 0x00, 0xce, 0x00, 0xbe, 0x00, 0x9e, 0x00, 0xee, 0x00, 0xfe, + 0x00, 0x0e, 0x00, 0x05, 0x00, 0x96, 0x00, 0x06, 0x00, 0x66, 0x00, 0xc6, + 0x00, 0xd6, 0x90, 0x36, 0x78, 0x20, 0x90, 0x65, 0x09, 0x04, 0x99, 0x55, + 0x60, 0x0c, 0x00, 0x06, 0x60, 0x44, 0xc0, 0xfc, 0x60, 0x46, 0x60, 0x0f, + 0x00, 0x00, 0x78, 0x30, 0x9c, 0x06, 0x15, 0x98, 0x20, 0x69, 0x01, 0x00, + 0x68, 0x20, 0xd0, 0xa4, 0x01, 0x10, 0xd0, 0xcc, 0x15, 0x08, 0x08, 0x0c, + 0x8a, 0x4b, 0x08, 0x0c, 0xa2, 0xa0, 0x68, 0xc3, 0x00, 0x00, 0x08, 0x0c, + 0xa7, 0x8a, 0x78, 0x33, 0x00, 0x00, 0x00, 0x36, 0x20, 0x69, 0x01, 0x40, + 0x6b, 0x04, 0x93, 0x84, 0x10, 0x00, 0x01, 0x38, 0x20, 0x01, 0x01, 0x00, + 0x08, 0x0c, 0x2a, 0x99, 0x90, 0x06, 0x08, 0x0c, 0x2a, 0x99, 0x20, 0x69, + 0x01, 0x00, 0x68, 0x24, 0xd0, 0x84, 0x01, 0x10, 0x68, 0x27, 0x00, 0x01, + 0x00, 0x3e, 0x00, 0x58, 0x08, 0x0c, 0x6b, 0xa9, 0x15, 0x38, 0x60, 0x03, + 0x00, 0x09, 0x63, 0x0a, 0x78, 0x08, 0xc0, 0xad, 0x78, 0x0a, 0x2c, 0x30, + 0x00, 0xf8, 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0xcf, 0x19, 0x01, 0xb0, + 0x60, 0x20, 0x90, 0x86, 0x00, 0x03, 0x15, 0x08, 0x08, 0x0c, 0xd1, 0x32, + 0x11, 0x18, 0x08, 0x0c, 0xbb, 0x5c, 0x00, 0x60, 0x08, 0x0c, 0x6b, 0xa9, + 0x11, 0x68, 0xa8, 0x67, 0x01, 0x03, 0xab, 0x7a, 0xa8, 0x77, 0x00, 0x00, + 0x08, 0x0c, 0x70, 0x12, 0x08, 0x0c, 0xd1, 0x0c, 0x08, 0x0c, 0xb1, 0xa7, + 0x08, 0x0c, 0xa6, 0x5d, 0x00, 0x0e, 0x08, 0x04, 0x98, 0xf3, 0x7e, 0x22, + 0x7e, 0x1e, 0x00, 0xde, 0x00, 0xce, 0x00, 0x6e, 0x00, 0x0e, 0x00, 0x9e, + 0x00, 0x05, 0x60, 0x20, 0x90, 0x86, 0x00, 0x06, 0x11, 0x18, 0x08, 0x0c, + 0xea, 0x30, 0x0c, 0x50, 0x08, 0x0c, 0xbb, 0x5c, 0x60, 0x20, 0x90, 0x86, + 0x00, 0x02, 0x11, 0x50, 0x60, 0x04, 0x00, 0x06, 0x90, 0x86, 0x00, 0x85, + 0x00, 0x0e, 0x09, 0x90, 0x90, 0x86, 0x00, 0x8b, 0x09, 0x78, 0x08, 0xd0, + 0x60, 0x20, 0x90, 0x86, 0x00, 0x05, 0x19, 0xb0, 0x60, 0x04, 0x00, 0x06, + 0x90, 0x86, 0x00, 0x85, 0x00, 0x0e, 0x0d, 0x18, 0x90, 0x86, 0x00, 0x8b, + 0x0d, 0x00, 0x08, 0x60, 0x00, 0x06, 0x00, 0x96, 0x00, 0xb6, 0x00, 0xc6, + 0x00, 0x66, 0x90, 0x36, 0x78, 0x28, 0x90, 0x65, 0x05, 0x10, 0x60, 0x10, + 0x20, 0x58, 0x60, 0x0c, 0x00, 0x06, 0x3e, 0x08, 0x91, 0x8e, 0x00, 0x02, + 0x11, 0x18, 0xb8, 0x00, 0xd0, 0xbc, 0x11, 0xa8, 0x60, 0x43, 0xff, 0xff, + 0x08, 0x0c, 0xaf, 0x2e, 0x01, 0x80, 0x61, 0x0c, 0x08, 0x0c, 0xa4, 0x20, + 0x60, 0x14, 0x20, 0x48, 0xa8, 0x67, 0x01, 0x03, 0xab, 0x7a, 0xa8, 0x77, + 0x00, 0x00, 0x08, 0x0c, 0x70, 0x12, 0x08, 0x0c, 0xb1, 0xa7, 0x00, 0x0e, + 0x08, 0xf0, 0x2c, 0x30, 0x0c, 0xe0, 0x00, 0x6e, 0x00, 0xce, 0x00, 0xbe, + 0x00, 0x9e, 0x00, 0x0e, 0x00, 0x05, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0x96, + 0x00, 0x66, 0x08, 0x0c, 0x62, 0xaf, 0x11, 0xb0, 0x20, 0x71, 0x19, 0xe8, + 0x70, 0x30, 0x90, 0x80, 0x00, 0x05, 0x20, 0x04, 0x90, 0x4d, 0x01, 0x70, + 0xa8, 0x78, 0x96, 0x06, 0x11, 0x58, 0x20, 0x71, 0x19, 0xe8, 0x70, 0x30, + 0x90, 0x35, 0x01, 0x30, 0x90, 0x80, 0x00, 0x05, 0x20, 0x04, 0x99, 0x06, + 0x11, 0x08, 0x00, 0x29, 0x00, 0x6e, 0x00, 0x9e, 0x00, 0xde, 0x00, 0xee, + 0x00, 0x05, 0x00, 0xc6, 0x26, 0x60, 0x60, 0x43, 0xff, 0xff, 0x08, 0x0c, + 0xaf, 0x2e, 0x01, 0x78, 0x08, 0x0c, 0xa4, 0x20, 0x60, 0x14, 0x20, 0x48, + 0xa8, 0x67, 0x01, 0x03, 0xab, 0x7a, 0xa8, 0x77, 0x00, 0x00, 0x08, 0x0c, + 0xd2, 0x20, 0x08, 0x0c, 0x70, 0x12, 0x08, 0x0c, 0xb1, 0xa7, 0x00, 0xce, + 0x00, 0x05, 0x00, 0xb6, 0x00, 0xe6, 0x00, 0xc6, 0x08, 0x0c, 0xac, 0xfc, + 0x01, 0x06, 0x20, 0x71, 0x01, 0x01, 0x2e, 0x04, 0xc0, 0xc4, 0x20, 0x72, + 0x60, 0x44, 0xd0, 0xfc, 0x11, 0x38, 0x01, 0x0e, 0x09, 0x0c, 0xad, 0x18, + 0x00, 0xce, 0x00, 0xee, 0x00, 0xbe, 0x00, 0x05, 0x20, 0x71, 0x19, 0xe8, + 0x70, 0x30, 0x90, 0x05, 0x0d, 0xa0, 0x9c, 0x06, 0x19, 0x0c, 0x0d, 0x85, + 0x70, 0x36, 0x08, 0x0c, 0x8a, 0x4b, 0x70, 0x04, 0x90, 0x84, 0x00, 0x07, + 0x00, 0x02, 0x9a, 0x1b, 0x9a, 0x1d, 0x9a, 0x24, 0x9a, 0x2e, 0x9a, 0x3c, + 0x9a, 0x1b, 0x9a, 0x29, 0x9a, 0x19, 0x08, 0x0c, 0x0d, 0x85, 0x04, 0x28, + 0x00, 0x05, 0x08, 0x0c, 0xaf, 0x19, 0x70, 0x07, 0x00, 0x00, 0x70, 0x33, + 0x00, 0x00, 0x00, 0xe8, 0x00, 0x66, 0x90, 0x36, 0x08, 0x0c, 0xa4, 0x20, + 0x00, 0x6e, 0x70, 0x07, 0x00, 0x00, 0x70, 0x33, 0x00, 0x00, 0x00, 0x98, + 0x08, 0x0c, 0xaf, 0x04, 0x01, 0x40, 0x08, 0x0c, 0xaf, 0x19, 0x01, 0x28, + 0x00, 0x66, 0x90, 0x36, 0x08, 0x0c, 0xa4, 0x20, 0x00, 0x6e, 0x70, 0x33, + 0x00, 0x00, 0x00, 0x28, 0x08, 0x0c, 0xaf, 0x04, 0x08, 0x0c, 0xa7, 0x8a, + 0x00, 0x00, 0x01, 0x0e, 0x09, 0x0c, 0xad, 0x18, 0x00, 0xce, 0x00, 0xee, + 0x00, 0xbe, 0x00, 0x05, 0x00, 0xd6, 0x00, 0xc6, 0x08, 0x0c, 0xac, 0xfc, + 0x01, 0x06, 0x60, 0x44, 0xd0, 0xfc, 0x11, 0x30, 0x01, 0x0e, 0x09, 0x0c, + 0xad, 0x18, 0x00, 0xce, 0x00, 0xde, 0x00, 0x05, 0x20, 0x69, 0x19, 0xe8, + 0x68, 0x4c, 0x90, 0x05, 0x0d, 0xa8, 0x9c, 0x06, 0x19, 0x0c, 0x0d, 0x85, + 0x68, 0x52, 0x00, 0xe6, 0x2d, 0x70, 0x08, 0x0c, 0x96, 0x67, 0x00, 0xee, + 0x08, 0x0c, 0x8a, 0x58, 0x00, 0x16, 0x20, 0x09, 0x00, 0x40, 0x08, 0x0c, + 0x22, 0x20, 0x00, 0x1e, 0x68, 0x3c, 0x90, 0x84, 0x00, 0x03, 0x00, 0x02, + 0x9a, 0x76, 0x9a, 0x77, 0x9a, 0x96, 0x9a, 0x74, 0x08, 0x0c, 0x0d, 0x85, + 0x04, 0x90, 0x68, 0x68, 0x90, 0x86, 0x00, 0x01, 0x01, 0x98, 0x60, 0x0c, + 0x90, 0x15, 0x01, 0x68, 0x6a, 0x4a, 0x60, 0x0f, 0x00, 0x00, 0x60, 0x44, + 0x90, 0x84, 0x7f, 0x7f, 0x60, 0x46, 0x90, 0x06, 0x68, 0x42, 0x68, 0x4e, + 0x68, 0x3f, 0x00, 0x00, 0x00, 0xf0, 0x68, 0x4a, 0x68, 0x46, 0x0c, 0x98, + 0x68, 0x6b, 0x00, 0x00, 0x68, 0x48, 0x90, 0x65, 0x0d, 0x70, 0x60, 0x03, + 0x00, 0x02, 0x0c, 0x58, 0x60, 0x44, 0x90, 0x84, 0x7f, 0x7f, 0x60, 0x46, + 0x90, 0x06, 0x68, 0x42, 0x68, 0x4e, 0x68, 0x6a, 0x68, 0x52, 0x68, 0x6e, + 0x60, 0x0c, 0x90, 0x15, 0x01, 0x20, 0x6a, 0x4a, 0x60, 0x0f, 0x00, 0x00, + 0x00, 0x10, 0x68, 0x4a, 0x68, 0x46, 0x08, 0x0c, 0xaf, 0xf4, 0x68, 0x4f, + 0x00, 0x00, 0x01, 0x0e, 0x09, 0x0c, 0xad, 0x18, 0x00, 0xce, 0x00, 0xde, + 0x00, 0x05, 0x00, 0x05, 0x60, 0x20, 0x90, 0x84, 0x00, 0x0f, 0x00, 0x0b, + 0x00, 0x05, 0x9a, 0xc9, 0x9a, 0xcc, 0x9f, 0x80, 0xa0, 0x19, 0x9a, 0xcc, + 0x9f, 0x80, 0xa0, 0x19, 0x9a, 0xc9, 0x9a, 0xcc, 0x9a, 0xc9, 0x9a, 0xc9, + 0x9a, 0xc9, 0x9a, 0xc9, 0x9a, 0xc9, 0x9a, 0xc9, 0x9a, 0xc9, 0x08, 0x0c, + 0x99, 0xed, 0x00, 0x05, 0x00, 0xb6, 0x01, 0x56, 0x01, 0x36, 0x01, 0x46, + 0x01, 0xc6, 0x01, 0xd6, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x00, 0xf6, + 0x20, 0x69, 0x02, 0x00, 0x20, 0x71, 0x02, 0x40, 0x60, 0x04, 0x90, 0x8a, + 0x00, 0x53, 0x1a, 0x0c, 0x0d, 0x85, 0x61, 0x10, 0x21, 0x58, 0xb9, 0x84, + 0x2c, 0x78, 0x20, 0x61, 0x01, 0x00, 0x61, 0x9a, 0x90, 0x8a, 0x00, 0x40, + 0x1a, 0x04, 0x9b, 0x38, 0x00, 0x5b, 0x00, 0xfe, 0x00, 0xee, 0x00, 0xde, + 0x00, 0xce, 0x01, 0xde, 0x01, 0xce, 0x01, 0x4e, 0x01, 0x3e, 0x01, 0x5e, + 0x00, 0xbe, 0x00, 0x05, 0x9c, 0xe1, 0x9d, 0x1c, 0x9d, 0x45, 0x9e, 0x0f, + 0x9e, 0x31, 0x9e, 0x37, 0x9e, 0x44, 0x9e, 0x4c, 0x9e, 0x58, 0x9e, 0x5e, + 0x9e, 0x6f, 0x9e, 0x5e, 0x9e, 0xc7, 0x9e, 0x4c, 0x9e, 0xd3, 0x9e, 0xd9, + 0x9e, 0x58, 0x9e, 0xd9, 0x9e, 0xe5, 0x9b, 0x36, 0x9b, 0x36, 0x9b, 0x36, + 0x9b, 0x36, 0x9b, 0x36, 0x9b, 0x36, 0x9b, 0x36, 0x9b, 0x36, 0x9b, 0x36, + 0x9b, 0x36, 0x9b, 0x36, 0xa4, 0x41, 0xa4, 0x64, 0xa4, 0x75, 0xa4, 0x95, + 0xa4, 0xc7, 0x9e, 0x44, 0x9b, 0x36, 0x9e, 0x44, 0x9e, 0x5e, 0x9b, 0x36, + 0x9d, 0x45, 0x9e, 0x0f, 0x9b, 0x36, 0xa8, 0x88, 0x9e, 0x5e, 0x9b, 0x36, + 0xa8, 0xa4, 0x9e, 0x5e, 0x9b, 0x36, 0x9e, 0x58, 0x9c, 0xdb, 0x9b, 0x59, + 0x9b, 0x36, 0xa8, 0xc0, 0xa9, 0x2d, 0xaa, 0x11, 0x9b, 0x36, 0xaa, 0x1e, + 0x9e, 0x41, 0xaa, 0x49, 0x9b, 0x36, 0xa4, 0xd1, 0xaa, 0x55, 0x9b, 0x36, + 0x08, 0x0c, 0x0d, 0x85, 0x21, 0x00, 0x00, 0x5b, 0x00, 0xfe, 0x00, 0xee, + 0x00, 0xde, 0x00, 0xce, 0x01, 0xde, 0x01, 0xce, 0x01, 0x4e, 0x01, 0x3e, + 0x01, 0x5e, 0x00, 0xbe, 0x00, 0x05, 0xaa, 0xf5, 0xab, 0xa7, 0x9b, 0x57, + 0x9b, 0x91, 0x9c, 0x3d, 0x9c, 0x48, 0x9b, 0x57, 0x9e, 0x44, 0x9b, 0x57, + 0x9c, 0xa2, 0x9c, 0xae, 0x9b, 0xac, 0x9b, 0x57, 0x9b, 0xc7, 0x9b, 0xfb, + 0xb0, 0x08, 0xb0, 0x4d, 0x9e, 0x5e, 0x08, 0x0c, 0x0d, 0x85, 0x00, 0xd6, + 0x00, 0x96, 0x08, 0x0c, 0x9e, 0xf8, 0x00, 0x26, 0x00, 0x36, 0x78, 0x14, + 0x20, 0x48, 0xa9, 0x58, 0xd1, 0xcc, 0x11, 0x38, 0x20, 0x09, 0x24, 0x14, + 0x20, 0x11, 0x00, 0x18, 0x20, 0x19, 0x00, 0x18, 0x00, 0x30, 0x20, 0x09, + 0x24, 0x10, 0x20, 0x11, 0x00, 0x14, 0x20, 0x19, 0x00, 0x14, 0x71, 0x02, + 0x72, 0x06, 0x70, 0x0b, 0x08, 0x00, 0xa8, 0x3c, 0x70, 0x0e, 0xa8, 0x50, + 0x70, 0x22, 0xa8, 0x54, 0x70, 0x26, 0x63, 0xc2, 0x08, 0x0c, 0xa2, 0x70, + 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x9e, 0x00, 0xde, 0x00, 0x05, 0x78, 0x10, + 0x00, 0xb6, 0x20, 0x58, 0xb8, 0xa0, 0x00, 0xbe, 0x08, 0x0c, 0xb0, 0x94, + 0x11, 0x18, 0x90, 0x84, 0xff, 0x80, 0x01, 0x10, 0x90, 0x85, 0x00, 0x01, + 0x00, 0x05, 0x00, 0xd6, 0x00, 0x96, 0x08, 0x0c, 0x9e, 0xf8, 0x70, 0x03, + 0x05, 0x00, 0x78, 0x14, 0x20, 0x48, 0xa8, 0x74, 0x70, 0x0a, 0xa8, 0x78, + 0x70, 0x0e, 0xa8, 0x7c, 0x70, 0x12, 0xa8, 0x80, 0x70, 0x16, 0xa8, 0x84, + 0x70, 0x1a, 0xa8, 0x88, 0x70, 0x1e, 0x60, 0xc3, 0x00, 0x10, 0x08, 0x0c, + 0xa2, 0x70, 0x00, 0x9e, 0x00, 0xde, 0x00, 0x05, 0x00, 0xd6, 0x00, 0x96, + 0x08, 0x0c, 0x9e, 0xf8, 0x70, 0x03, 0x05, 0x00, 0x78, 0x14, 0x20, 0x48, + 0xa8, 0xcc, 0x70, 0x0a, 0xa8, 0xd0, 0x70, 0x0e, 0xa8, 0xd4, 0x70, 0x12, + 0xa8, 0xd8, 0x70, 0x16, 0xa8, 0xdc, 0x70, 0x1a, 0xa8, 0xe0, 0x70, 0x1e, + 0x60, 0xc3, 0x00, 0x10, 0x08, 0x0c, 0xa2, 0x70, 0x00, 0x9e, 0x00, 0xde, + 0x00, 0x05, 0x00, 0xd6, 0x00, 0x96, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x08, 0x0c, 0x9e, 0xf8, 0x20, 0xe9, 0x00, 0x00, 0x20, 0x01, 0x19, 0xa4, + 0x20, 0x03, 0x00, 0x00, 0x78, 0x14, 0x20, 0x48, 0xa8, 0x14, 0x80, 0x03, + 0x60, 0xc2, 0xa8, 0x30, 0x20, 0xa8, 0xa8, 0x60, 0x20, 0xe0, 0xa8, 0x5c, + 0x90, 0x80, 0x00, 0x1b, 0x20, 0x98, 0x20, 0x01, 0x19, 0xa4, 0x00, 0x16, + 0x20, 0x0c, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x22, 0x05, 0x08, 0x0c, + 0xdc, 0xef, 0x90, 0x06, 0x08, 0x0c, 0x22, 0x05, 0x00, 0x1e, 0xa8, 0x04, + 0x90, 0x05, 0x01, 0x10, 0x20, 0x48, 0x0c, 0x28, 0x04, 0xd9, 0x08, 0x0c, + 0xa2, 0x70, 0x01, 0x2e, 0x00, 0x9e, 0x00, 0xde, 0x00, 0x05, 0x00, 0xd6, + 0x00, 0x96, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x9f, 0x43, + 0x20, 0xe9, 0x00, 0x00, 0x20, 0x01, 0x19, 0xa4, 0x20, 0x03, 0x00, 0x00, + 0x78, 0x14, 0x20, 0x48, 0xa8, 0x6f, 0x02, 0x00, 0xa8, 0x73, 0x00, 0x00, + 0xa8, 0x14, 0x80, 0x03, 0x60, 0xc2, 0xa8, 0x30, 0x20, 0xa8, 0xa8, 0x60, + 0x20, 0xe0, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x1b, 0x20, 0x98, 0x20, 0x01, + 0x19, 0xa4, 0x00, 0x16, 0x20, 0x0c, 0x08, 0x0c, 0xdc, 0xef, 0x00, 0x1e, + 0xa8, 0x04, 0x90, 0x05, 0x01, 0x10, 0x20, 0x48, 0x0c, 0x60, 0x00, 0x51, + 0x78, 0x14, 0x20, 0x48, 0x08, 0x0c, 0x10, 0x0b, 0x08, 0x0c, 0xa2, 0x70, + 0x01, 0x2e, 0x00, 0x9e, 0x00, 0xde, 0x00, 0x05, 0x60, 0xc0, 0x80, 0x04, + 0x90, 0x84, 0x00, 0x03, 0x90, 0x05, 0x01, 0x30, 0x90, 0x82, 0x00, 0x04, + 0x20, 0xa3, 0x00, 0x00, 0x80, 0x00, 0x1d, 0xe0, 0x00, 0x05, 0x08, 0x0c, + 0x9e, 0xf8, 0x70, 0x03, 0x78, 0x00, 0x78, 0x08, 0x80, 0x07, 0x70, 0x0a, + 0x60, 0xc3, 0x00, 0x08, 0x08, 0x04, 0xa2, 0x70, 0x00, 0xd6, 0x00, 0xe6, + 0x08, 0x0c, 0x9f, 0x43, 0x78, 0x14, 0x90, 0x84, 0xff, 0x00, 0x20, 0x73, + 0x02, 0x00, 0x8e, 0x70, 0x8e, 0x70, 0x90, 0x96, 0xdf, 0x00, 0x01, 0x38, + 0x90, 0x96, 0xe0, 0x00, 0x01, 0x20, 0x20, 0x73, 0x00, 0x10, 0x8e, 0x70, + 0x00, 0x30, 0x90, 0x95, 0x00, 0x10, 0x22, 0x72, 0x8e, 0x70, 0x20, 0x73, + 0x00, 0x34, 0x8e, 0x70, 0x20, 0x69, 0x18, 0x05, 0x20, 0xa9, 0x00, 0x04, + 0x2d, 0x76, 0x8d, 0x68, 0x8e, 0x70, 0x1f, 0x04, 0x9c, 0x68, 0x20, 0x69, + 0x18, 0x01, 0x20, 0xa9, 0x00, 0x04, 0x2d, 0x76, 0x8d, 0x68, 0x8e, 0x70, + 0x1f, 0x04, 0x9c, 0x71, 0x90, 0x96, 0xdf, 0x00, 0x01, 0x30, 0x90, 0x96, + 0xe0, 0x00, 0x01, 0x18, 0x60, 0xc3, 0x00, 0x18, 0x00, 0xf0, 0x20, 0x69, + 0x19, 0xb4, 0x90, 0x86, 0xdf, 0x00, 0x01, 0x10, 0x20, 0x69, 0x19, 0xce, + 0x20, 0xa9, 0x00, 0x1a, 0x9e, 0x86, 0x02, 0x60, 0x11, 0x48, 0x00, 0xc6, + 0x20, 0x61, 0x02, 0x00, 0x60, 0x10, 0x80, 0x00, 0x60, 0x12, 0x00, 0xce, + 0x20, 0x71, 0x02, 0x40, 0x2d, 0x04, 0x80, 0x07, 0x20, 0x72, 0x8d, 0x68, + 0x8e, 0x70, 0x1f, 0x04, 0x9c, 0x88, 0x60, 0xc3, 0x00, 0x4c, 0x08, 0x0c, + 0xa2, 0x70, 0x00, 0xee, 0x00, 0xde, 0x00, 0x05, 0x08, 0x0c, 0x9e, 0xf8, + 0x70, 0x03, 0x63, 0x00, 0x70, 0x07, 0x00, 0x28, 0x78, 0x08, 0x70, 0x0e, + 0x60, 0xc3, 0x00, 0x08, 0x08, 0x04, 0xa2, 0x70, 0x00, 0xd6, 0x00, 0x26, + 0x00, 0x16, 0x08, 0x0c, 0x9f, 0x43, 0x70, 0x03, 0x02, 0x00, 0x78, 0x14, + 0x70, 0x0e, 0x00, 0xe6, 0x9e, 0xf0, 0x00, 0x04, 0x20, 0x09, 0x00, 0x01, + 0x20, 0x11, 0x00, 0x0c, 0x20, 0x69, 0x19, 0x24, 0x68, 0x10, 0xd0, 0x84, + 0x11, 0x48, 0x20, 0x73, 0x05, 0x00, 0x8e, 0x70, 0x20, 0x73, 0x00, 0x00, + 0x8e, 0x70, 0x81, 0x08, 0x92, 0x90, 0x00, 0x04, 0x20, 0x73, 0x08, 0x00, + 0x8e, 0x70, 0x20, 0x73, 0x00, 0x00, 0x00, 0xee, 0x72, 0x06, 0x71, 0x0a, + 0x62, 0xc2, 0x08, 0x0c, 0xa2, 0x70, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0xde, + 0x00, 0x05, 0x20, 0x01, 0x18, 0x18, 0x20, 0x04, 0x60, 0x9a, 0x08, 0x04, + 0xa2, 0x70, 0x08, 0x0c, 0x9e, 0xf8, 0x70, 0x03, 0x52, 0x00, 0x20, 0x69, + 0x18, 0x47, 0x68, 0x04, 0xd0, 0x84, 0x01, 0x30, 0x68, 0x28, 0x00, 0x16, + 0x08, 0x0c, 0x26, 0xbf, 0x71, 0x0e, 0x00, 0x1e, 0x20, 0xa9, 0x00, 0x04, + 0x20, 0xe1, 0x00, 0x01, 0x20, 0x99, 0x18, 0x05, 0x20, 0xe9, 0x00, 0x00, + 0x20, 0xa1, 0x02, 0x50, 0x40, 0x03, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x99, + 0x18, 0x01, 0x20, 0xa1, 0x02, 0x54, 0x40, 0x03, 0x08, 0x0c, 0xb0, 0x94, + 0x11, 0x20, 0xb8, 0xa0, 0x90, 0x82, 0x00, 0x7f, 0x02, 0x48, 0x20, 0x01, + 0x18, 0x1f, 0x20, 0x04, 0x70, 0x32, 0x20, 0x01, 0x18, 0x20, 0x20, 0x04, + 0x70, 0x36, 0x00, 0x30, 0x20, 0x01, 0x18, 0x18, 0x20, 0x04, 0x90, 0x84, + 0x00, 0xff, 0x70, 0x36, 0x60, 0xc3, 0x00, 0x1c, 0x08, 0x04, 0xa2, 0x70, + 0x08, 0x0c, 0x9e, 0xf8, 0x70, 0x03, 0x05, 0x00, 0x08, 0x0c, 0xb0, 0x94, + 0x11, 0x20, 0xb8, 0xa0, 0x90, 0x82, 0x00, 0x7f, 0x02, 0x48, 0x20, 0x01, + 0x18, 0x1f, 0x20, 0x04, 0x70, 0x0a, 0x20, 0x01, 0x18, 0x20, 0x20, 0x04, + 0x70, 0x0e, 0x00, 0x30, 0x20, 0x01, 0x18, 0x18, 0x20, 0x04, 0x90, 0x84, + 0x00, 0xff, 0x70, 0x0e, 0x20, 0xa9, 0x00, 0x04, 0x20, 0xe1, 0x00, 0x01, + 0x20, 0x99, 0x18, 0x05, 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, 0x02, 0x50, + 0x40, 0x03, 0x60, 0xc3, 0x00, 0x10, 0x08, 0x04, 0xa2, 0x70, 0x08, 0x0c, + 0x9e, 0xf8, 0x90, 0x06, 0x08, 0x0c, 0x6b, 0xdb, 0xb8, 0xa0, 0x90, 0x86, + 0x00, 0x7e, 0x11, 0x70, 0x20, 0x11, 0x02, 0x40, 0x20, 0x13, 0x22, 0xff, + 0x20, 0x11, 0x02, 0x41, 0x20, 0x13, 0xff, 0xfe, 0x70, 0x03, 0x04, 0x00, + 0x62, 0x0c, 0xc2, 0xb4, 0x62, 0x0e, 0x00, 0x58, 0x78, 0x14, 0x00, 0x96, + 0x90, 0x4d, 0x01, 0x20, 0x90, 0x06, 0xa8, 0x9a, 0xa8, 0xa6, 0xa8, 0xaa, + 0x00, 0x9e, 0x70, 0x03, 0x03, 0x00, 0xb8, 0xa0, 0x90, 0x86, 0x00, 0x7e, + 0x19, 0x04, 0x9d, 0xcf, 0x00, 0xd6, 0x20, 0x69, 0x19, 0x6c, 0x20, 0x01, + 0x18, 0x37, 0x20, 0x04, 0xd0, 0xa4, 0x01, 0x88, 0x68, 0x00, 0x70, 0x0a, + 0x68, 0x08, 0x90, 0x84, 0x20, 0x00, 0x70, 0x12, 0x08, 0x0c, 0xb0, 0xab, + 0x68, 0x0c, 0x70, 0x16, 0x70, 0x1f, 0x27, 0x10, 0x68, 0x18, 0x70, 0x22, + 0x68, 0x1c, 0x70, 0x26, 0x04, 0x28, 0x68, 0x00, 0x70, 0x0a, 0x68, 0x04, + 0x70, 0x0e, 0x20, 0x09, 0x18, 0x0d, 0x21, 0x0c, 0xd1, 0x8c, 0x01, 0x10, + 0x20, 0x01, 0x00, 0x02, 0x00, 0xf6, 0x20, 0x79, 0x01, 0x00, 0x08, 0x0c, + 0x77, 0x9e, 0x11, 0x28, 0x78, 0xe3, 0x00, 0x00, 0x08, 0x0c, 0x27, 0x00, + 0x78, 0xe2, 0x00, 0xfe, 0x68, 0x08, 0x08, 0x0c, 0x77, 0x9e, 0x11, 0x18, + 0x90, 0x84, 0x37, 0xff, 0x00, 0x10, 0x90, 0x84, 0x3f, 0xff, 0x70, 0x12, + 0x08, 0x0c, 0xb0, 0xab, 0x68, 0x0c, 0x70, 0x16, 0x00, 0xde, 0x20, 0xa9, + 0x00, 0x04, 0x20, 0xe1, 0x00, 0x01, 0x20, 0x99, 0x18, 0x05, 0x20, 0xe9, + 0x00, 0x00, 0x20, 0xa1, 0x02, 0x56, 0x40, 0x03, 0x20, 0xa9, 0x00, 0x04, + 0x20, 0x99, 0x18, 0x01, 0x20, 0xa1, 0x02, 0x5a, 0x40, 0x03, 0x00, 0xd6, + 0x08, 0x0c, 0xaa, 0xdc, 0x20, 0x69, 0x19, 0x74, 0x20, 0x71, 0x02, 0x4e, + 0x68, 0x00, 0xc0, 0xdd, 0x70, 0x02, 0x08, 0x0c, 0x58, 0x44, 0xd0, 0xe4, + 0x01, 0x10, 0x68, 0x0c, 0x70, 0x0e, 0x00, 0xde, 0x04, 0xe0, 0x20, 0x01, + 0x18, 0x37, 0x20, 0x04, 0xd0, 0xa4, 0x01, 0xa8, 0x00, 0x16, 0x20, 0x01, + 0x18, 0x0d, 0x20, 0x04, 0xd0, 0x8c, 0x20, 0x09, 0x00, 0x02, 0x11, 0x18, + 0x20, 0x01, 0x19, 0x6d, 0x20, 0x0c, 0x60, 0xe0, 0x91, 0x06, 0x01, 0x30, + 0x21, 0x00, 0x60, 0xe3, 0x00, 0x00, 0x08, 0x0c, 0x27, 0x00, 0x61, 0xe2, + 0x00, 0x1e, 0x20, 0xe1, 0x00, 0x01, 0x20, 0x99, 0x19, 0x6c, 0x20, 0xe9, + 0x00, 0x00, 0x20, 0xa1, 0x02, 0x4e, 0x20, 0xa9, 0x00, 0x08, 0x40, 0x03, + 0x20, 0xa9, 0x00, 0x04, 0x20, 0x99, 0x18, 0x05, 0x20, 0xa1, 0x02, 0x56, + 0x40, 0x03, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x99, 0x18, 0x01, 0x20, 0xa1, + 0x02, 0x5a, 0x40, 0x03, 0x08, 0x0c, 0xaa, 0xdc, 0x20, 0xa1, 0x02, 0x4e, + 0x20, 0xa9, 0x00, 0x08, 0x20, 0x99, 0x19, 0x74, 0x40, 0x03, 0x60, 0xc3, + 0x00, 0x74, 0x08, 0x04, 0xa2, 0x70, 0x08, 0x0c, 0x9e, 0xf8, 0x70, 0x03, + 0x20, 0x10, 0x70, 0x07, 0x00, 0x14, 0x70, 0x0b, 0x08, 0x00, 0x70, 0x0f, + 0x20, 0x00, 0x90, 0x06, 0x00, 0xf6, 0x20, 0x79, 0x18, 0x47, 0x79, 0x04, + 0x00, 0xfe, 0xd1, 0xac, 0x11, 0x10, 0x90, 0x85, 0x00, 0x20, 0xd1, 0xa4, + 0x01, 0x10, 0x90, 0x85, 0x00, 0x10, 0x90, 0x85, 0x00, 0x02, 0x00, 0xd6, + 0x08, 0x04, 0x9e, 0xa8, 0x70, 0x26, 0x60, 0xc3, 0x00, 0x14, 0x08, 0x04, + 0xa2, 0x70, 0x08, 0x0c, 0x9e, 0xf8, 0x70, 0x03, 0x50, 0x00, 0x08, 0x04, + 0x9d, 0x67, 0x08, 0x0c, 0x9e, 0xf8, 0x70, 0x03, 0x21, 0x10, 0x70, 0x07, + 0x00, 0x14, 0x60, 0xc3, 0x00, 0x14, 0x08, 0x04, 0xa2, 0x70, 0x08, 0x0c, + 0x9f, 0x3a, 0x00, 0x10, 0x08, 0x0c, 0x9f, 0x43, 0x70, 0x03, 0x02, 0x00, + 0x60, 0xc3, 0x00, 0x04, 0x08, 0x04, 0xa2, 0x70, 0x08, 0x0c, 0x9f, 0x43, + 0x70, 0x03, 0x01, 0x00, 0x70, 0x0b, 0x00, 0x03, 0x70, 0x0f, 0x2a, 0x00, + 0x60, 0xc3, 0x00, 0x08, 0x08, 0x04, 0xa2, 0x70, 0x08, 0x0c, 0x9f, 0x43, + 0x70, 0x03, 0x02, 0x00, 0x08, 0x04, 0x9d, 0x67, 0x08, 0x0c, 0x9f, 0x43, + 0x70, 0x03, 0x01, 0x00, 0x78, 0x2c, 0x90, 0x05, 0x01, 0x10, 0x70, 0x0a, + 0x00, 0x10, 0x70, 0x0b, 0x00, 0x03, 0x78, 0x14, 0x70, 0x0e, 0x60, 0xc3, + 0x00, 0x08, 0x08, 0x04, 0xa2, 0x70, 0x00, 0xd6, 0x08, 0x0c, 0x9f, 0x43, + 0x70, 0x03, 0x02, 0x10, 0x70, 0x07, 0x00, 0x14, 0x70, 0x0b, 0x08, 0x00, + 0xb8, 0x94, 0x90, 0x86, 0x00, 0x14, 0x11, 0x98, 0xb9, 0x9c, 0x91, 0x84, + 0x00, 0x30, 0x01, 0x90, 0xb9, 0x98, 0x91, 0x84, 0xc0, 0x00, 0x11, 0x40, + 0xd1, 0xec, 0x01, 0x18, 0x70, 0x0f, 0x21, 0x00, 0x00, 0x58, 0x70, 0x0f, + 0x01, 0x00, 0x00, 0x40, 0x70, 0x0f, 0x04, 0x00, 0x00, 0x28, 0x70, 0x0f, + 0x07, 0x00, 0x00, 0x10, 0x70, 0x0f, 0x08, 0x00, 0x00, 0xf6, 0x20, 0x79, + 0x18, 0x47, 0x79, 0x04, 0x00, 0xfe, 0xd1, 0xac, 0x11, 0x10, 0x90, 0x85, + 0x00, 0x20, 0xd1, 0xa4, 0x01, 0x10, 0x90, 0x85, 0x00, 0x10, 0x20, 0x09, + 0x18, 0x69, 0x21, 0x0c, 0xd1, 0x84, 0x11, 0x10, 0x90, 0x85, 0x00, 0x02, + 0x00, 0x26, 0x20, 0x09, 0x18, 0x67, 0x21, 0x0c, 0xd1, 0xe4, 0x01, 0x50, + 0xc0, 0xc5, 0xba, 0xd4, 0xd2, 0x8c, 0x11, 0x08, 0xc0, 0xcd, 0x90, 0x94, + 0x00, 0x30, 0x92, 0x96, 0x00, 0x10, 0x01, 0x40, 0xd1, 0xec, 0x01, 0x30, + 0x90, 0x94, 0x00, 0x30, 0x92, 0x96, 0x00, 0x10, 0x01, 0x08, 0xc0, 0xbd, + 0x00, 0x2e, 0x70, 0x26, 0x60, 0xc3, 0x00, 0x14, 0x00, 0xde, 0x08, 0x04, + 0xa2, 0x70, 0x08, 0x0c, 0x9f, 0x43, 0x70, 0x03, 0x02, 0x10, 0x70, 0x07, + 0x00, 0x14, 0x70, 0x0f, 0x01, 0x00, 0x60, 0xc3, 0x00, 0x14, 0x08, 0x04, + 0xa2, 0x70, 0x08, 0x0c, 0x9f, 0x43, 0x70, 0x03, 0x02, 0x00, 0x08, 0x04, + 0x9c, 0xe5, 0x08, 0x0c, 0x9f, 0x43, 0x70, 0x03, 0x01, 0x00, 0x70, 0x0b, + 0x00, 0x03, 0x70, 0x0f, 0x2a, 0x00, 0x60, 0xc3, 0x00, 0x08, 0x08, 0x04, + 0xa2, 0x70, 0x08, 0x0c, 0x9f, 0x43, 0x70, 0x03, 0x01, 0x00, 0x70, 0x0b, + 0x00, 0x0b, 0x60, 0xc3, 0x00, 0x08, 0x08, 0x04, 0xa2, 0x70, 0x00, 0x26, + 0x00, 0xd6, 0x00, 0x36, 0x00, 0x46, 0x20, 0x19, 0x32, 0x00, 0x20, 0x21, + 0x08, 0x00, 0x00, 0x40, 0x00, 0x26, 0x00, 0xd6, 0x00, 0x36, 0x00, 0x46, + 0x20, 0x19, 0x22, 0x00, 0x20, 0x21, 0x01, 0x00, 0x08, 0x0c, 0xaa, 0xf1, + 0xb8, 0x10, 0x93, 0x05, 0x70, 0x02, 0xb8, 0x14, 0x70, 0x06, 0x20, 0x69, + 0x18, 0x00, 0x68, 0x7c, 0x70, 0x0a, 0x68, 0x80, 0x70, 0x0e, 0x94, 0x85, + 0x00, 0x29, 0x70, 0x12, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0xde, 0x08, 0x0c, + 0xa2, 0x64, 0x72, 0x1a, 0x9f, 0x95, 0x00, 0x00, 0x72, 0x22, 0x70, 0x27, + 0xff, 0xff, 0x20, 0x71, 0x02, 0x4c, 0x00, 0x2e, 0x00, 0x05, 0x00, 0x26, + 0x08, 0x0c, 0xaa, 0xf1, 0x70, 0x03, 0x02, 0xff, 0x70, 0x07, 0xff, 0xfc, + 0x00, 0xd6, 0x20, 0x69, 0x18, 0x00, 0x68, 0x7c, 0x70, 0x0a, 0x68, 0x80, + 0x70, 0x0e, 0x00, 0xde, 0x70, 0x13, 0x20, 0x29, 0x0c, 0x10, 0x70, 0x03, + 0x01, 0x00, 0x70, 0x07, 0x00, 0x00, 0x70, 0x0b, 0xfc, 0x02, 0x70, 0x0f, + 0x00, 0x00, 0x00, 0x05, 0x00, 0x26, 0x00, 0xd6, 0x00, 0x36, 0x00, 0x46, + 0x20, 0x19, 0x33, 0x00, 0x20, 0x21, 0x08, 0x00, 0x00, 0x40, 0x00, 0x26, + 0x00, 0xd6, 0x00, 0x36, 0x00, 0x46, 0x20, 0x19, 0x23, 0x00, 0x20, 0x21, + 0x01, 0x00, 0x08, 0x0c, 0xaa, 0xf1, 0xb8, 0x10, 0x93, 0x05, 0x70, 0x02, + 0xb8, 0x14, 0x70, 0x06, 0x20, 0x69, 0x18, 0x00, 0xb8, 0x10, 0x90, 0x05, + 0x11, 0x40, 0xb8, 0x14, 0x90, 0x05, 0x11, 0x28, 0x70, 0x0b, 0x00, 0xff, + 0x70, 0x0f, 0xff, 0xfe, 0x00, 0x20, 0x68, 0x7c, 0x70, 0x0a, 0x68, 0x80, + 0x70, 0x0e, 0x00, 0x00, 0x94, 0x85, 0x00, 0x98, 0x70, 0x12, 0x00, 0x4e, + 0x00, 0x3e, 0x00, 0xde, 0x08, 0x0c, 0xa2, 0x64, 0x72, 0x1a, 0x7a, 0x08, + 0x72, 0x22, 0x2f, 0x10, 0x72, 0x26, 0x20, 0x71, 0x02, 0x4c, 0x00, 0x2e, + 0x00, 0x05, 0x08, 0x0c, 0xa2, 0x64, 0x72, 0x1a, 0x7a, 0x08, 0x72, 0x22, + 0x78, 0x14, 0x70, 0x26, 0x20, 0x71, 0x02, 0x4c, 0x00, 0x2e, 0x00, 0x05, + 0x00, 0xb6, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x00, 0xf6, 0x20, 0x69, + 0x02, 0x00, 0x20, 0x71, 0x02, 0x40, 0x60, 0x04, 0x90, 0x8a, 0x00, 0x85, + 0x0a, 0x0c, 0x0d, 0x85, 0x90, 0x8a, 0x00, 0x92, 0x1a, 0x0c, 0x0d, 0x85, + 0x61, 0x10, 0x21, 0x58, 0xb9, 0x84, 0x2c, 0x78, 0x20, 0x61, 0x01, 0x00, + 0x61, 0x9a, 0x90, 0x82, 0x00, 0x85, 0x00, 0x33, 0x00, 0xfe, 0x00, 0xee, + 0x00, 0xde, 0x00, 0xce, 0x00, 0xbe, 0x00, 0x05, 0x9f, 0xb1, 0x9f, 0xc0, + 0x9f, 0xcb, 0x9f, 0xaf, 0x9f, 0xaf, 0x9f, 0xaf, 0x9f, 0xb1, 0x9f, 0xaf, + 0x9f, 0xaf, 0x9f, 0xaf, 0x9f, 0xaf, 0x9f, 0xaf, 0x9f, 0xaf, 0x08, 0x0c, + 0x0d, 0x85, 0x04, 0x11, 0x60, 0xc3, 0x00, 0x00, 0x00, 0x26, 0x08, 0x0c, + 0x2a, 0x04, 0x02, 0x28, 0x20, 0x11, 0x01, 0x01, 0x22, 0x04, 0xc0, 0xc5, + 0x20, 0x12, 0x00, 0x2e, 0x08, 0x04, 0xa2, 0x70, 0x04, 0x31, 0x78, 0x08, + 0x70, 0x0a, 0x78, 0x14, 0x70, 0x0e, 0x70, 0x17, 0xff, 0xff, 0x60, 0xc3, + 0x00, 0x0c, 0x08, 0x04, 0xa2, 0x70, 0x04, 0xa1, 0x70, 0x03, 0x00, 0x03, + 0x70, 0x07, 0x03, 0x00, 0x60, 0xc3, 0x00, 0x04, 0x08, 0x04, 0xa2, 0x70, + 0x00, 0x26, 0x08, 0x0c, 0xaa, 0xf1, 0xb8, 0x10, 0x90, 0x85, 0x81, 0x00, + 0x70, 0x02, 0xb8, 0x14, 0x70, 0x06, 0x20, 0x69, 0x18, 0x00, 0x68, 0x7c, + 0x70, 0x0a, 0x68, 0x80, 0x70, 0x0e, 0x70, 0x13, 0x00, 0x09, 0x08, 0x04, + 0x9f, 0x13, 0x00, 0x26, 0x08, 0x0c, 0xaa, 0xf1, 0xb8, 0x10, 0x90, 0x85, + 0x84, 0x00, 0x70, 0x02, 0xb8, 0x14, 0x70, 0x06, 0x20, 0x69, 0x18, 0x00, + 0x68, 0x7c, 0x70, 0x0a, 0x68, 0x80, 0x70, 0x0e, 0x20, 0x01, 0x00, 0x99, + 0x7a, 0x20, 0x92, 0x96, 0x00, 0x05, 0x01, 0x08, 0xc0, 0xbc, 0x70, 0x12, + 0x08, 0x04, 0x9f, 0x75, 0x00, 0x26, 0x08, 0x0c, 0xaa, 0xf1, 0xb8, 0x10, + 0x90, 0x85, 0x85, 0x00, 0x70, 0x02, 0xb8, 0x14, 0x70, 0x06, 0x20, 0x69, + 0x18, 0x00, 0x68, 0x7c, 0x70, 0x0a, 0x68, 0x80, 0x70, 0x0e, 0x20, 0x01, + 0x00, 0x99, 0x7a, 0x20, 0x92, 0x96, 0x00, 0x05, 0x01, 0x08, 0xc0, 0xbc, + 0x70, 0x12, 0x08, 0x04, 0x9f, 0x75, 0x00, 0xb6, 0x00, 0xc6, 0x00, 0xd6, + 0x00, 0xe6, 0x00, 0xf6, 0x2c, 0x78, 0x20, 0x69, 0x02, 0x00, 0x20, 0x71, + 0x02, 0x40, 0x78, 0x04, 0x90, 0x8a, 0x00, 0x40, 0x0a, 0x0c, 0x0d, 0x85, + 0x90, 0x8a, 0x00, 0x57, 0x1a, 0x0c, 0x0d, 0x85, 0x79, 0x10, 0x21, 0x58, + 0xb9, 0x84, 0x20, 0x61, 0x01, 0x00, 0x61, 0x9a, 0x90, 0x82, 0x00, 0x40, + 0x00, 0x33, 0x00, 0xfe, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x00, 0xbe, + 0x00, 0x05, 0xa0, 0x4e, 0xa0, 0x4e, 0xa0, 0x4e, 0xa0, 0x7f, 0xa0, 0x4e, + 0xa0, 0x4e, 0xa0, 0x4e, 0xa0, 0x4e, 0xa0, 0x4e, 0xa0, 0x4e, 0xa0, 0x4e, + 0xa6, 0x44, 0xa6, 0x49, 0xa6, 0x4e, 0xa6, 0x53, 0xa0, 0x4e, 0xa0, 0x4e, + 0xa0, 0x4e, 0xa6, 0x3f, 0x08, 0x0c, 0x0d, 0x85, 0x68, 0x13, 0x00, 0x08, + 0xba, 0x8c, 0x82, 0x10, 0xb8, 0xd4, 0xd0, 0x84, 0x01, 0x80, 0x20, 0x01, + 0x1b, 0x72, 0x20, 0x0c, 0x81, 0x08, 0x21, 0x02, 0x20, 0x01, 0x1b, 0x71, + 0x20, 0x1c, 0x12, 0x18, 0x83, 0x18, 0x23, 0x02, 0x0e, 0xa0, 0x79, 0x52, + 0x71, 0x2e, 0x7b, 0x4e, 0x73, 0x2a, 0x92, 0x94, 0x00, 0xff, 0xba, 0x8e, + 0x82, 0x17, 0x72, 0x1a, 0xba, 0x10, 0x92, 0x95, 0x06, 0x00, 0x72, 0x02, + 0xba, 0x14, 0x72, 0x06, 0x20, 0x69, 0x18, 0x00, 0x6a, 0x7c, 0x72, 0x0a, + 0x6a, 0x80, 0x72, 0x0e, 0x70, 0x13, 0x08, 0x29, 0x2f, 0x10, 0x72, 0x22, + 0x70, 0x27, 0xff, 0xff, 0x00, 0x05, 0x00, 0x16, 0x78, 0x14, 0x90, 0x84, + 0x07, 0x00, 0x80, 0x07, 0x00, 0x13, 0x00, 0x1e, 0x00, 0x05, 0xa0, 0x8f, + 0xa0, 0x8f, 0xa0, 0x91, 0xa0, 0x8f, 0xa0, 0x8f, 0xa0, 0x8f, 0xa0, 0xab, + 0xa0, 0x8f, 0x08, 0x0c, 0x0d, 0x85, 0x79, 0x14, 0x91, 0x8c, 0x08, 0xff, + 0x91, 0x8d, 0xf6, 0x00, 0x79, 0x16, 0x20, 0x09, 0x00, 0x03, 0x00, 0xb9, + 0x20, 0x69, 0x18, 0x47, 0x68, 0x04, 0xd0, 0xbc, 0x01, 0x30, 0x68, 0x2c, + 0x90, 0x84, 0x00, 0xff, 0x80, 0x07, 0x70, 0x32, 0x00, 0x10, 0x70, 0x33, + 0x3f, 0x00, 0x60, 0xc3, 0x00, 0x01, 0x08, 0x04, 0xa2, 0x70, 0x20, 0x09, + 0x00, 0x03, 0x00, 0x19, 0x70, 0x33, 0x7f, 0x00, 0x0c, 0xb0, 0x00, 0x16, + 0x08, 0x0c, 0xaa, 0xf1, 0x00, 0x1e, 0xb8, 0x10, 0x90, 0x85, 0x01, 0x00, + 0x70, 0x02, 0xb8, 0x14, 0x70, 0x06, 0x20, 0x69, 0x18, 0x00, 0x6a, 0x7c, + 0x72, 0x0a, 0x6a, 0x80, 0x72, 0x0e, 0x70, 0x13, 0x08, 0x88, 0x91, 0x8d, + 0x00, 0x08, 0x71, 0x16, 0x08, 0x0c, 0xa2, 0x64, 0x72, 0x1a, 0x7a, 0x08, + 0x72, 0x22, 0x2f, 0x10, 0x72, 0x26, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xe6, + 0x00, 0xd6, 0x00, 0xc6, 0x00, 0x66, 0x00, 0x56, 0x00, 0x46, 0x00, 0x36, + 0x20, 0x61, 0x01, 0x00, 0x20, 0x71, 0x18, 0x00, 0x71, 0x60, 0x78, 0x10, + 0x20, 0x58, 0x76, 0xdc, 0x96, 0xb4, 0x00, 0x28, 0x01, 0x10, 0x73, 0x7c, + 0x74, 0x80, 0x25, 0x00, 0x76, 0xdc, 0x96, 0xb4, 0x00, 0x28, 0x01, 0x40, + 0x20, 0x01, 0x04, 0xff, 0x60, 0x62, 0x60, 0x67, 0xff, 0xff, 0x63, 0x6a, + 0x64, 0x6e, 0x00, 0x50, 0x20, 0x01, 0x00, 0xff, 0x90, 0x85, 0x04, 0x00, + 0x60, 0x62, 0x60, 0x67, 0xff, 0xff, 0x60, 0x6b, 0x00, 0x00, 0x61, 0x6e, + 0xb8, 0xb8, 0x60, 0x73, 0x05, 0x30, 0x60, 0x77, 0x00, 0x08, 0xb8, 0x8c, + 0x80, 0x00, 0x90, 0x84, 0x00, 0xff, 0xb8, 0x8e, 0x80, 0x07, 0x90, 0x85, + 0x00, 0x20, 0x60, 0x7a, 0x60, 0x7f, 0x00, 0x00, 0x2b, 0x00, 0x60, 0x82, + 0x60, 0x87, 0xff, 0xff, 0x78, 0x14, 0x00, 0x96, 0x20, 0x48, 0xa8, 0x48, + 0x60, 0x8a, 0xa8, 0x44, 0x60, 0x8e, 0xa8, 0x38, 0x60, 0xc6, 0xa8, 0x34, + 0x60, 0xca, 0x00, 0x9e, 0xb8, 0x6c, 0x60, 0xce, 0x60, 0xab, 0x00, 0x36, + 0x60, 0xaf, 0x95, 0xd5, 0x60, 0xd7, 0x00, 0x00, 0x20, 0x01, 0x18, 0x37, + 0x20, 0x04, 0x90, 0x84, 0x00, 0x28, 0x01, 0x28, 0x60, 0x9f, 0x00, 0x00, + 0x20, 0x01, 0x00, 0x92, 0x00, 0x58, 0x60, 0x28, 0xc0, 0xbd, 0x60, 0x2a, + 0x60, 0x9f, 0x00, 0xff, 0x20, 0x11, 0xff, 0xff, 0x08, 0x0c, 0x2a, 0xd3, + 0x20, 0x01, 0x00, 0xb2, 0x20, 0x10, 0x90, 0x0e, 0x08, 0x0c, 0x2a, 0xe2, + 0x20, 0x09, 0x07, 0xd0, 0x08, 0x0c, 0x8a, 0x50, 0x00, 0x3e, 0x00, 0x4e, + 0x00, 0x5e, 0x00, 0x6e, 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, 0x00, 0xbe, + 0x00, 0x05, 0x00, 0xb6, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, 0x00, 0x66, + 0x00, 0x56, 0x00, 0x46, 0x00, 0x36, 0x20, 0x61, 0x01, 0x00, 0x20, 0x71, + 0x18, 0x00, 0x71, 0x60, 0x78, 0x10, 0x20, 0x58, 0xb8, 0xa0, 0x20, 0x28, + 0x76, 0xdc, 0xd6, 0xac, 0x11, 0x68, 0x95, 0x82, 0x00, 0x7e, 0x12, 0x50, + 0x25, 0x00, 0x90, 0x94, 0xff, 0x80, 0x11, 0x30, 0x90, 0x80, 0x34, 0x8e, + 0x20, 0x15, 0x92, 0x94, 0x00, 0xff, 0x00, 0x20, 0xb9, 0x10, 0xba, 0x14, + 0x73, 0x7c, 0x74, 0x80, 0x70, 0xdc, 0xd0, 0xac, 0x11, 0x30, 0x95, 0x82, + 0x00, 0x7e, 0x12, 0x18, 0x95, 0x84, 0xff, 0x80, 0x01, 0x38, 0x91, 0x85, + 0x04, 0x00, 0x60, 0x62, 0x62, 0x66, 0x63, 0x6a, 0x64, 0x6e, 0x00, 0x30, + 0x60, 0x63, 0x04, 0x00, 0x62, 0x66, 0x60, 0x6b, 0x00, 0x00, 0x61, 0x6e, + 0xb8, 0xb8, 0x60, 0x72, 0x60, 0x77, 0x00, 0x00, 0xb8, 0x64, 0xd0, 0xa4, + 0x01, 0x10, 0x60, 0x77, 0x00, 0x08, 0xb8, 0x8c, 0x80, 0x00, 0x90, 0x84, + 0x00, 0xff, 0xb8, 0x8e, 0x80, 0x07, 0x90, 0x85, 0x00, 0x20, 0x60, 0x7a, + 0x60, 0x7f, 0x00, 0x00, 0x2b, 0x00, 0x60, 0x82, 0x60, 0x87, 0xff, 0xff, + 0x78, 0x14, 0x00, 0x96, 0x20, 0x48, 0xa8, 0x48, 0x60, 0x8a, 0xa8, 0x44, + 0x60, 0x8e, 0xa8, 0x38, 0x60, 0xc6, 0xa8, 0x34, 0x60, 0xca, 0x00, 0x9e, + 0xb8, 0x6c, 0x60, 0xce, 0x60, 0xab, 0x00, 0x36, 0x60, 0xaf, 0x95, 0xd5, + 0x60, 0xd7, 0x00, 0x00, 0xba, 0x84, 0x62, 0x9e, 0x00, 0xf6, 0x20, 0x79, + 0x01, 0x40, 0x78, 0x03, 0x00, 0x00, 0x00, 0xfe, 0x90, 0x0e, 0x20, 0x11, + 0x00, 0x92, 0x08, 0x0c, 0x2a, 0xe2, 0x20, 0x09, 0x07, 0xd0, 0x08, 0x0c, + 0x8a, 0x50, 0x00, 0x3e, 0x00, 0x4e, 0x00, 0x5e, 0x00, 0x6e, 0x00, 0xce, + 0x00, 0xde, 0x00, 0xee, 0x00, 0xbe, 0x00, 0x05, 0x00, 0xb6, 0x00, 0x96, + 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, 0x00, 0x56, 0x00, 0x46, 0x00, 0x36, + 0x20, 0x61, 0x01, 0x00, 0x20, 0x71, 0x18, 0x00, 0x78, 0x10, 0x20, 0x58, + 0xb8, 0xa0, 0x20, 0x28, 0xb9, 0x10, 0xba, 0x14, 0x73, 0x7c, 0x74, 0x80, + 0x78, 0x20, 0x00, 0x02, 0xa1, 0xef, 0xa1, 0xef, 0xa1, 0xef, 0xa1, 0xef, + 0xa1, 0xef, 0xa1, 0xef, 0xa1, 0xef, 0xa1, 0xef, 0xa1, 0xef, 0xa1, 0xef, + 0xa1, 0xf1, 0xa1, 0xef, 0xa1, 0xef, 0xa1, 0xef, 0xa1, 0xef, 0x08, 0x0c, + 0x0d, 0x85, 0xb8, 0x84, 0x60, 0x9e, 0x78, 0x14, 0x20, 0x48, 0xa8, 0x7c, + 0xd0, 0xfc, 0x05, 0x58, 0xaf, 0x90, 0x97, 0x84, 0xff, 0x00, 0x91, 0x05, + 0x60, 0x62, 0x87, 0x3f, 0x97, 0x84, 0xff, 0x00, 0x00, 0x06, 0x78, 0x14, + 0x20, 0x48, 0xa8, 0x78, 0xc0, 0xfc, 0x90, 0x05, 0x00, 0x0e, 0x11, 0x60, + 0xaf, 0x94, 0x87, 0xff, 0x01, 0x98, 0x20, 0x39, 0x00, 0x98, 0x97, 0x05, + 0x60, 0x72, 0x78, 0x08, 0x60, 0x82, 0x2f, 0x00, 0x60, 0x86, 0x00, 0x38, + 0x91, 0x85, 0x22, 0x00, 0x60, 0x62, 0x60, 0x73, 0x01, 0x29, 0x60, 0x77, + 0x00, 0x00, 0xb8, 0x84, 0x60, 0x9e, 0x00, 0x50, 0x20, 0x39, 0x00, 0x29, + 0x97, 0x05, 0x60, 0x72, 0x0c, 0xc0, 0x91, 0x85, 0x02, 0x00, 0x60, 0x62, + 0x60, 0x73, 0x20, 0x29, 0xa8, 0x7c, 0xd0, 0xfc, 0x01, 0x18, 0xaf, 0x94, + 0x87, 0xff, 0x11, 0x20, 0x2f, 0x00, 0x60, 0x82, 0x78, 0x08, 0x60, 0x86, + 0x62, 0x66, 0x63, 0x6a, 0x64, 0x6e, 0x60, 0x77, 0x00, 0x00, 0xb8, 0x8c, + 0x80, 0x00, 0x90, 0x84, 0x00, 0xff, 0xb8, 0x8e, 0x80, 0x07, 0x60, 0x7a, + 0x60, 0x7f, 0x00, 0x00, 0xa8, 0x48, 0x60, 0x8a, 0xa8, 0x44, 0x60, 0x8e, + 0xa8, 0x38, 0x60, 0xc6, 0xa8, 0x34, 0x60, 0xca, 0xb8, 0x6c, 0x60, 0xce, + 0x60, 0xaf, 0x95, 0xd5, 0x60, 0xd7, 0x00, 0x00, 0x08, 0x0c, 0xaa, 0xd1, + 0x20, 0x09, 0x07, 0xd0, 0x60, 0xc4, 0x90, 0x84, 0xff, 0xf0, 0x90, 0x05, + 0x01, 0x10, 0x20, 0x09, 0x1b, 0x58, 0x08, 0x0c, 0x8a, 0x50, 0x00, 0x3e, + 0x00, 0x4e, 0x00, 0x5e, 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, 0x00, 0x9e, + 0x00, 0xbe, 0x00, 0x05, 0x7a, 0x40, 0x92, 0x94, 0x00, 0xff, 0x82, 0x17, + 0x00, 0x05, 0x00, 0xd6, 0x20, 0x69, 0x19, 0xe8, 0x68, 0x6b, 0x00, 0x01, + 0x00, 0xde, 0x00, 0x05, 0x60, 0xa3, 0x00, 0x56, 0x60, 0xa7, 0x95, 0x75, + 0x00, 0xf1, 0x08, 0x0c, 0x8a, 0x42, 0x00, 0x05, 0x00, 0x16, 0x20, 0x01, + 0x18, 0x0c, 0x20, 0x0c, 0x91, 0x84, 0x06, 0x00, 0x90, 0x86, 0x06, 0x00, + 0x01, 0x28, 0x00, 0x89, 0x08, 0x0c, 0x8a, 0x42, 0x00, 0x1e, 0x00, 0x05, + 0xc1, 0xe5, 0x20, 0x01, 0x18, 0x0c, 0x21, 0x02, 0x20, 0x01, 0x19, 0xe9, + 0x20, 0x03, 0x00, 0x00, 0x20, 0x01, 0x19, 0xf4, 0x20, 0x03, 0x00, 0x00, + 0x0c, 0x88, 0x00, 0x06, 0x00, 0x16, 0x00, 0x26, 0x20, 0x09, 0x18, 0x04, + 0x20, 0x11, 0x00, 0x09, 0x08, 0x0c, 0x2a, 0xe2, 0x00, 0x2e, 0x00, 0x1e, + 0x00, 0x0e, 0x00, 0x05, 0x00, 0x16, 0x00, 0xc6, 0x00, 0x06, 0x08, 0x0c, + 0xac, 0xfc, 0x01, 0x06, 0x20, 0x61, 0x01, 0x00, 0x61, 0xa4, 0x60, 0xa7, + 0x95, 0xf5, 0x00, 0x16, 0x00, 0x26, 0x20, 0x09, 0x18, 0x04, 0x20, 0x11, + 0x00, 0x08, 0x08, 0x0c, 0x2a, 0xe2, 0x00, 0x2e, 0x00, 0x1e, 0x01, 0x0e, + 0x09, 0x0c, 0xad, 0x18, 0x00, 0x0e, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, + 0x61, 0xa6, 0x00, 0xce, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xc6, 0x00, 0xd6, + 0x00, 0x16, 0x00, 0x26, 0x20, 0x61, 0x01, 0x00, 0x20, 0x69, 0x01, 0x40, + 0x08, 0x0c, 0x77, 0x9e, 0x15, 0x10, 0x20, 0x01, 0x1a, 0x0d, 0x20, 0x04, + 0x90, 0x05, 0x19, 0x04, 0xa3, 0x1f, 0x08, 0x0c, 0x78, 0x40, 0x11, 0xa8, + 0x20, 0x69, 0x03, 0x80, 0x68, 0x43, 0x01, 0x01, 0x68, 0x44, 0xd0, 0x84, + 0x1d, 0xe8, 0x20, 0x61, 0x01, 0x00, 0x60, 0x20, 0xd0, 0xb4, 0x11, 0x20, + 0x60, 0x24, 0xd0, 0x84, 0x09, 0x0c, 0x0d, 0x85, 0x68, 0x43, 0x01, 0x00, + 0x08, 0x0c, 0x8a, 0x42, 0x04, 0xb0, 0x00, 0xc6, 0x20, 0x61, 0x19, 0xe8, + 0x00, 0xf0, 0x69, 0x04, 0x91, 0x94, 0x40, 0x00, 0x05, 0x98, 0x08, 0x0c, + 0xa2, 0xa0, 0x08, 0x0c, 0x2a, 0xa9, 0x00, 0xc6, 0x20, 0x61, 0x19, 0xe8, + 0x61, 0x34, 0x91, 0x92, 0x00, 0x08, 0x12, 0x78, 0x81, 0x08, 0x61, 0x36, + 0x08, 0x0c, 0xac, 0xfc, 0x61, 0x30, 0x08, 0x0c, 0xad, 0x18, 0x00, 0xce, + 0x81, 0xff, 0x01, 0xc8, 0x08, 0x0c, 0x8a, 0x42, 0x08, 0x0c, 0xa2, 0x93, + 0x00, 0xa0, 0x08, 0x0c, 0xac, 0xfc, 0x61, 0x30, 0x91, 0xe5, 0x00, 0x00, + 0x01, 0x50, 0x08, 0x0c, 0xee, 0xee, 0x08, 0x0c, 0x8a, 0x4b, 0x60, 0x03, + 0x00, 0x01, 0x20, 0x09, 0x00, 0x14, 0x08, 0x0c, 0xb2, 0x0a, 0x08, 0x0c, + 0xad, 0x18, 0x00, 0xce, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0xde, + 0x00, 0xce, 0x00, 0x05, 0x20, 0x01, 0x1a, 0x0d, 0x20, 0x04, 0x90, 0x05, + 0x1d, 0xb0, 0x00, 0xc6, 0x20, 0x61, 0x19, 0xe8, 0x61, 0x34, 0x91, 0x92, + 0x00, 0x03, 0x1a, 0xd8, 0x81, 0x08, 0x61, 0x36, 0x00, 0xce, 0x08, 0x0c, + 0x8a, 0x42, 0x08, 0x0c, 0x60, 0x58, 0x20, 0x09, 0x18, 0x46, 0x21, 0x14, + 0x82, 0x10, 0x22, 0x0a, 0x0c, 0x10, 0x00, 0x96, 0x00, 0xc6, 0x00, 0xd6, + 0x00, 0xe6, 0x00, 0x16, 0x00, 0x26, 0x08, 0x0c, 0x8a, 0x58, 0x08, 0x0c, + 0xac, 0xfc, 0x20, 0x01, 0x03, 0x87, 0x20, 0x03, 0x02, 0x02, 0x20, 0x71, + 0x19, 0xe8, 0x71, 0x4c, 0x81, 0xff, 0x09, 0x04, 0xa3, 0xd9, 0x20, 0x61, + 0x01, 0x00, 0x20, 0x69, 0x01, 0x40, 0x08, 0x0c, 0x77, 0x9e, 0x15, 0x18, + 0x00, 0x36, 0x20, 0x19, 0x00, 0x02, 0x08, 0x0c, 0xa5, 0x96, 0x00, 0x3e, + 0x08, 0x0c, 0xee, 0xee, 0x70, 0x4c, 0x90, 0x65, 0x01, 0x80, 0x20, 0x09, + 0x00, 0x4a, 0x62, 0x20, 0x92, 0x96, 0x00, 0x09, 0x11, 0x30, 0x61, 0x14, + 0x21, 0x48, 0xa8, 0x7b, 0x00, 0x06, 0x20, 0x09, 0x00, 0x4a, 0x60, 0x03, + 0x00, 0x03, 0x08, 0x0c, 0xb2, 0x0a, 0x20, 0x01, 0x03, 0x86, 0x20, 0x03, + 0x50, 0x40, 0x08, 0x0c, 0x78, 0x40, 0x08, 0x04, 0xa3, 0xd9, 0x69, 0x04, + 0xd1, 0xf4, 0x09, 0x04, 0xa3, 0xe6, 0x08, 0x0c, 0x2a, 0xa9, 0x00, 0xc6, + 0x70, 0x4c, 0x90, 0x65, 0x09, 0x0c, 0x0d, 0x85, 0x60, 0x20, 0x00, 0xce, + 0x90, 0x86, 0x00, 0x06, 0x15, 0x20, 0x61, 0xc8, 0x60, 0xc4, 0x91, 0x05, + 0x15, 0x00, 0x71, 0x4c, 0x91, 0x88, 0x00, 0x11, 0x21, 0x04, 0xd0, 0xe4, + 0x01, 0xd0, 0x62, 0x14, 0x92, 0x94, 0x18, 0x00, 0x11, 0x28, 0x62, 0x24, + 0x92, 0x94, 0x00, 0x02, 0x15, 0xe0, 0x00, 0x10, 0xc0, 0xe4, 0x20, 0x0a, + 0x60, 0x14, 0x90, 0x84, 0xe7, 0xfd, 0x90, 0x85, 0x00, 0x10, 0x60, 0x16, + 0x70, 0x4c, 0x20, 0x60, 0x08, 0x0c, 0x9a, 0x48, 0x20, 0x09, 0x00, 0x49, + 0x08, 0x0c, 0xb2, 0x0a, 0x04, 0x50, 0x08, 0x0c, 0xee, 0xee, 0x70, 0x4c, + 0x90, 0x65, 0x90, 0x86, 0x1b, 0x55, 0x11, 0x58, 0x08, 0x0c, 0xaf, 0xd2, + 0x15, 0x00, 0x20, 0x61, 0x1b, 0x55, 0x60, 0x64, 0x80, 0x00, 0x60, 0x66, + 0x08, 0x0c, 0x60, 0x58, 0x00, 0xc0, 0x00, 0x36, 0x20, 0x19, 0x00, 0x01, + 0x08, 0x0c, 0xa5, 0x96, 0x00, 0x3e, 0x71, 0x4c, 0x21, 0x60, 0x20, 0x09, + 0x00, 0x4a, 0x62, 0x20, 0x92, 0x96, 0x00, 0x09, 0x11, 0x30, 0x61, 0x14, + 0x21, 0x48, 0xa8, 0x7b, 0x00, 0x06, 0x20, 0x09, 0x00, 0x4a, 0x60, 0x03, + 0x00, 0x03, 0x08, 0x0c, 0xb2, 0x0a, 0x20, 0x01, 0x03, 0x87, 0x20, 0x03, + 0x02, 0x00, 0x08, 0x0c, 0xad, 0x18, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0xee, + 0x00, 0xde, 0x00, 0xce, 0x00, 0x9e, 0x00, 0x05, 0xd1, 0xec, 0x19, 0x04, + 0xa3, 0x7f, 0x08, 0x04, 0xa3, 0x81, 0x00, 0x26, 0x00, 0xe6, 0x20, 0x71, + 0x19, 0xe8, 0x70, 0x6c, 0xd0, 0x84, 0x01, 0xe8, 0xc0, 0x84, 0x70, 0x6e, + 0x71, 0x4c, 0x81, 0xff, 0x01, 0xc0, 0x20, 0x71, 0x01, 0x00, 0x91, 0x88, + 0x00, 0x08, 0x21, 0x14, 0x92, 0x8e, 0x00, 0x06, 0x11, 0x38, 0x20, 0x09, + 0x19, 0x84, 0x20, 0x11, 0x00, 0x12, 0x08, 0x0c, 0x2a, 0xe2, 0x00, 0x48, + 0x92, 0x8e, 0x00, 0x09, 0x0d, 0xb0, 0x20, 0x09, 0x19, 0x84, 0x20, 0x11, + 0x00, 0x16, 0x08, 0x0c, 0x2a, 0xe2, 0x00, 0xee, 0x00, 0x2e, 0x00, 0x05, + 0x90, 0x36, 0x20, 0x01, 0x19, 0xf2, 0x20, 0x04, 0x90, 0x05, 0x01, 0x28, + 0x9c, 0x06, 0x01, 0x28, 0x2c, 0x30, 0x60, 0x0c, 0x0c, 0xc8, 0x90, 0x85, + 0x00, 0x01, 0x00, 0x05, 0x00, 0xf6, 0x20, 0x79, 0x19, 0xe8, 0x61, 0x0c, + 0x90, 0x06, 0x60, 0x0e, 0x60, 0x44, 0xc0, 0xfc, 0x60, 0x46, 0x86, 0xff, + 0x11, 0x40, 0x78, 0x24, 0x9c, 0x06, 0x11, 0x18, 0x78, 0x26, 0x78, 0x2a, + 0x00, 0x50, 0x79, 0x2a, 0x00, 0x40, 0x00, 0xc6, 0x26, 0x60, 0x61, 0x0e, + 0x00, 0xce, 0x78, 0x24, 0x9c, 0x06, 0x11, 0x08, 0x7e, 0x26, 0x08, 0x0c, + 0xa6, 0x5d, 0x08, 0x0c, 0xd1, 0x0c, 0x00, 0xfe, 0x00, 0x05, 0x08, 0x0c, + 0x9e, 0xf8, 0x70, 0x03, 0x12, 0x00, 0x78, 0x38, 0x70, 0x12, 0x78, 0x3c, + 0x70, 0x16, 0x00, 0xc6, 0x78, 0x20, 0x90, 0x86, 0x00, 0x04, 0x11, 0x48, + 0x78, 0x10, 0x90, 0x05, 0x01, 0x30, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x10, + 0xb9, 0x14, 0x00, 0xbe, 0x00, 0x20, 0x20, 0x61, 0x18, 0x00, 0x60, 0x7c, + 0x61, 0x80, 0x90, 0x84, 0x00, 0xff, 0x70, 0x0a, 0x71, 0x0e, 0x00, 0xce, + 0x60, 0xc3, 0x00, 0x2c, 0x08, 0x04, 0xa2, 0x70, 0x08, 0x0c, 0x9e, 0xf8, + 0x70, 0x03, 0x0f, 0x00, 0x78, 0x08, 0xd0, 0x9c, 0x01, 0x28, 0xb8, 0x10, + 0x90, 0x84, 0x00, 0xff, 0x70, 0x0a, 0xb8, 0x14, 0x70, 0x0e, 0x60, 0xc3, + 0x00, 0x08, 0x08, 0x04, 0xa2, 0x70, 0x01, 0x56, 0x08, 0x0c, 0x9f, 0x43, + 0x70, 0x03, 0x02, 0x00, 0x08, 0x0c, 0x8b, 0x10, 0x20, 0xa9, 0x00, 0x06, + 0x20, 0x11, 0xff, 0xec, 0x20, 0x19, 0xff, 0xed, 0x9e, 0xf0, 0x00, 0x02, + 0x23, 0x05, 0x20, 0x72, 0x8e, 0x70, 0x22, 0x05, 0x20, 0x72, 0x8e, 0x70, + 0x93, 0x98, 0x00, 0x02, 0x92, 0x90, 0x00, 0x02, 0x1f, 0x04, 0xa4, 0x84, + 0x60, 0xc3, 0x00, 0x1c, 0x01, 0x5e, 0x08, 0x04, 0xa2, 0x70, 0x00, 0x16, + 0x00, 0x26, 0x08, 0x0c, 0x9f, 0x1f, 0x08, 0x0c, 0x9f, 0x31, 0x9e, 0x80, + 0x00, 0x04, 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa0, 0x78, 0x14, 0x00, 0x96, + 0x20, 0x48, 0xa8, 0x00, 0x20, 0x48, 0xa8, 0x60, 0x20, 0xe0, 0xa8, 0x5c, + 0x90, 0x80, 0x00, 0x21, 0x20, 0x98, 0x00, 0x9e, 0x78, 0x08, 0x90, 0x88, + 0x00, 0x02, 0x21, 0xa8, 0x91, 0x92, 0x00, 0x10, 0x12, 0x50, 0x40, 0x03, + 0x90, 0x80, 0x00, 0x04, 0x80, 0x03, 0x60, 0xc2, 0x08, 0x0c, 0xa2, 0x70, + 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x20, 0xa9, 0x00, 0x10, 0x40, 0x03, + 0x08, 0x0c, 0xaa, 0xdc, 0x20, 0xa1, 0x02, 0x40, 0x22, 0xa8, 0x40, 0x03, + 0x0c, 0x68, 0x08, 0x0c, 0x9e, 0xf8, 0x70, 0x03, 0x62, 0x00, 0x78, 0x08, + 0x70, 0x0e, 0x60, 0xc3, 0x00, 0x08, 0x08, 0x04, 0xa2, 0x70, 0x00, 0x16, + 0x00, 0x26, 0x08, 0x0c, 0x9e, 0xf8, 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, + 0x02, 0x4c, 0x78, 0x14, 0x00, 0x96, 0x20, 0x48, 0xa8, 0x00, 0x20, 0x48, + 0xa8, 0x60, 0x20, 0xe0, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x23, 0x20, 0x98, + 0x00, 0x9e, 0x78, 0x08, 0x90, 0x88, 0x00, 0x02, 0x21, 0xa8, 0x40, 0x03, + 0x80, 0x03, 0x60, 0xc2, 0x08, 0x0c, 0xa2, 0x70, 0x00, 0x2e, 0x00, 0x1e, + 0x00, 0x05, 0x00, 0xe6, 0x00, 0xc6, 0x00, 0x06, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x71, 0x19, 0xe8, 0x70, 0x10, 0x20, 0x60, 0x8c, 0xff, + 0x01, 0x88, 0x08, 0x0c, 0xd1, 0x32, 0x11, 0x10, 0x08, 0x0c, 0xbb, 0x5c, + 0x60, 0x0c, 0x00, 0x06, 0x08, 0x0c, 0xd3, 0xae, 0x60, 0x0f, 0x00, 0x00, + 0x08, 0x0c, 0xb1, 0x6c, 0x08, 0x0c, 0xa6, 0x5d, 0x00, 0xce, 0x0c, 0x68, + 0x2c, 0x00, 0x70, 0x12, 0x70, 0x0e, 0x01, 0x2e, 0x00, 0x0e, 0x00, 0xce, + 0x00, 0xee, 0x00, 0x05, 0x01, 0x26, 0x01, 0x56, 0x00, 0xf6, 0x00, 0xe6, + 0x00, 0xd6, 0x00, 0xc6, 0x00, 0x66, 0x00, 0x26, 0x00, 0x16, 0x00, 0x06, + 0x20, 0x91, 0x80, 0x00, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x0c, 0x91, 0x8c, + 0xe7, 0xff, 0x21, 0x02, 0x20, 0x69, 0x01, 0x00, 0x20, 0x79, 0x01, 0x40, + 0x20, 0x71, 0x19, 0xe8, 0x70, 0x30, 0x20, 0x60, 0x8c, 0xff, 0x05, 0x48, + 0x08, 0x0c, 0xa2, 0xa0, 0x6a, 0xc0, 0x68, 0xc3, 0x00, 0x00, 0x08, 0x0c, + 0x8a, 0x4b, 0x00, 0xc6, 0x20, 0x61, 0x01, 0x00, 0x08, 0x0c, 0xac, 0x2d, + 0x00, 0xce, 0x20, 0xa9, 0x01, 0xf4, 0x04, 0xb1, 0x08, 0x0c, 0x99, 0xed, + 0x60, 0x44, 0xd0, 0xac, 0x11, 0x28, 0x20, 0x01, 0x19, 0x88, 0x20, 0x04, + 0x60, 0x4a, 0x00, 0x20, 0x20, 0x09, 0x00, 0x13, 0x08, 0x0c, 0xb2, 0x0a, + 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x6e, 0x00, 0xce, 0x00, 0xde, + 0x00, 0xee, 0x00, 0xfe, 0x01, 0x5e, 0x01, 0x2e, 0x00, 0x05, 0x20, 0x01, + 0x18, 0x00, 0x20, 0x04, 0x90, 0x96, 0x00, 0x01, 0x0d, 0x78, 0x90, 0x96, + 0x00, 0x04, 0x0d, 0x60, 0x08, 0x0c, 0x8a, 0x4b, 0x68, 0x14, 0x90, 0x84, + 0x00, 0x01, 0x01, 0x10, 0x68, 0xa7, 0x95, 0xf5, 0x68, 0x17, 0x00, 0x08, + 0x68, 0xc3, 0x00, 0x00, 0x20, 0x11, 0x60, 0x02, 0x08, 0x0c, 0x89, 0x93, + 0x20, 0xa9, 0x01, 0xf4, 0x00, 0x09, 0x08, 0xc0, 0x68, 0x24, 0xd0, 0x94, + 0x01, 0x40, 0x68, 0x27, 0x00, 0x04, 0x78, 0x04, 0x90, 0x84, 0x40, 0x00, + 0x19, 0x0c, 0x2a, 0xa9, 0x00, 0x90, 0xd0, 0x84, 0x01, 0x18, 0x68, 0x27, + 0x40, 0x01, 0x00, 0x10, 0x1f, 0x04, 0xa5, 0x78, 0x78, 0x04, 0x90, 0x84, + 0x10, 0x00, 0x01, 0x38, 0x20, 0x01, 0x01, 0x00, 0x08, 0x0c, 0x2a, 0x99, + 0x90, 0x06, 0x08, 0x0c, 0x2a, 0x99, 0x00, 0x05, 0x01, 0x26, 0x01, 0x56, + 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, 0x00, 0x66, 0x00, 0x26, + 0x00, 0x16, 0x00, 0x06, 0x20, 0x91, 0x80, 0x00, 0x20, 0x01, 0x18, 0x0c, + 0x20, 0x0c, 0x91, 0x8c, 0xdb, 0xff, 0x21, 0x02, 0x20, 0x69, 0x01, 0x00, + 0x20, 0x79, 0x01, 0x40, 0x20, 0x71, 0x03, 0x80, 0x70, 0x1c, 0x00, 0x06, + 0x70, 0x1f, 0x02, 0x02, 0x20, 0x71, 0x19, 0xe8, 0x70, 0x4c, 0x20, 0x60, + 0x8c, 0xff, 0x09, 0x04, 0xa6, 0x19, 0x08, 0x0c, 0xaf, 0x84, 0x09, 0x04, + 0xa6, 0x19, 0x93, 0x86, 0x00, 0x02, 0x11, 0x28, 0x68, 0x14, 0x90, 0x84, + 0x00, 0x02, 0x09, 0x04, 0xa6, 0x19, 0x68, 0xaf, 0x95, 0xf5, 0x68, 0x17, + 0x00, 0x10, 0x20, 0x09, 0x00, 0xfa, 0x81, 0x09, 0x1d, 0xf0, 0x69, 0xc6, + 0x68, 0xcb, 0x00, 0x08, 0x08, 0x0c, 0x8a, 0x58, 0x08, 0x0c, 0x1e, 0x44, + 0x20, 0x01, 0x00, 0x32, 0x69, 0x20, 0xd1, 0xbc, 0x01, 0x30, 0x80, 0x01, + 0x1d, 0xd8, 0x69, 0x2c, 0x91, 0x8d, 0x00, 0x08, 0x69, 0x2e, 0x00, 0x16, + 0x20, 0x09, 0x00, 0x40, 0x08, 0x0c, 0x22, 0x20, 0x00, 0x1e, 0x20, 0xa9, + 0x03, 0xe8, 0x68, 0x24, 0xd0, 0x94, 0x01, 0x40, 0x68, 0x27, 0x00, 0x04, + 0x78, 0x04, 0x90, 0x84, 0x40, 0x00, 0x19, 0x0c, 0x2a, 0xa9, 0x00, 0x90, + 0xd0, 0x8c, 0x01, 0x18, 0x68, 0x27, 0x00, 0x02, 0x00, 0x10, 0x1f, 0x04, + 0xa5, 0xe7, 0x78, 0x04, 0x90, 0x84, 0x10, 0x00, 0x01, 0x38, 0x20, 0x01, + 0x01, 0x00, 0x08, 0x0c, 0x2a, 0x99, 0x90, 0x06, 0x08, 0x0c, 0x2a, 0x99, + 0x68, 0x27, 0x40, 0x00, 0x68, 0x24, 0x83, 0xff, 0x11, 0x80, 0x20, 0x09, + 0x00, 0x49, 0x60, 0x20, 0x90, 0x86, 0x00, 0x09, 0x01, 0x50, 0x08, 0x0c, + 0x9a, 0x48, 0x60, 0x44, 0xd0, 0xac, 0x11, 0x18, 0x60, 0x03, 0x00, 0x02, + 0x00, 0x10, 0x08, 0x0c, 0xb2, 0x0a, 0x00, 0x0e, 0x20, 0x71, 0x03, 0x80, + 0xd0, 0x8c, 0x11, 0x10, 0x70, 0x1f, 0x02, 0x00, 0x00, 0x0e, 0x00, 0x1e, + 0x00, 0x2e, 0x00, 0x6e, 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, 0x00, 0xfe, + 0x01, 0x5e, 0x01, 0x2e, 0x00, 0x05, 0x00, 0xd6, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x69, 0x19, 0xe8, 0x6a, 0x06, 0x01, 0x2e, 0x00, 0xde, + 0x00, 0x05, 0x00, 0xd6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x69, + 0x19, 0xe8, 0x6a, 0x3e, 0x01, 0x2e, 0x00, 0xde, 0x00, 0x05, 0x08, 0x0c, + 0xa0, 0x50, 0x70, 0x47, 0x10, 0x00, 0x00, 0x98, 0x08, 0x0c, 0xa0, 0x50, + 0x70, 0x47, 0x40, 0x00, 0x00, 0x70, 0x08, 0x0c, 0xa0, 0x50, 0x70, 0x47, + 0x20, 0x00, 0x00, 0x48, 0x08, 0x0c, 0xa0, 0x50, 0x70, 0x47, 0x04, 0x00, + 0x00, 0x20, 0x08, 0x0c, 0xa0, 0x50, 0x70, 0x47, 0x02, 0x00, 0x78, 0x5c, + 0x70, 0x32, 0x60, 0xc3, 0x00, 0x20, 0x08, 0x04, 0xa2, 0x70, 0x00, 0xe6, + 0x20, 0x71, 0x19, 0xe8, 0x70, 0x2c, 0x90, 0x05, 0x01, 0x10, 0x80, 0x01, + 0x70, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xd6, + 0x00, 0xc6, 0x00, 0x76, 0x00, 0x66, 0x00, 0x06, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x71, 0x19, 0xe8, 0x76, 0x20, 0x26, 0x60, 0x26, 0x78, + 0x20, 0x39, 0x00, 0x01, 0x87, 0xff, 0x09, 0x04, 0xa7, 0x02, 0x8c, 0xff, + 0x09, 0x04, 0xa7, 0x02, 0x60, 0x20, 0x90, 0x86, 0x00, 0x06, 0x19, 0x04, + 0xa6, 0xfd, 0x88, 0xff, 0x01, 0x38, 0x28, 0x00, 0x9c, 0x06, 0x19, 0x04, + 0xa6, 0xfd, 0x20, 0x39, 0x00, 0x00, 0x00, 0x50, 0x60, 0x10, 0x9b, 0x06, + 0x19, 0x04, 0xa6, 0xfd, 0x85, 0xff, 0x01, 0x20, 0x60, 0x5c, 0x91, 0x06, + 0x19, 0x04, 0xa6, 0xfd, 0x70, 0x30, 0x9c, 0x06, 0x15, 0xb0, 0x20, 0x69, + 0x01, 0x00, 0x68, 0xc0, 0x90, 0x05, 0x11, 0x60, 0x68, 0x24, 0xd0, 0x84, + 0x01, 0x48, 0x68, 0x27, 0x00, 0x01, 0x08, 0x0c, 0x8a, 0x4b, 0x08, 0x0c, + 0xa7, 0x8a, 0x70, 0x33, 0x00, 0x00, 0x04, 0x28, 0x08, 0x0c, 0x8a, 0x4b, + 0x68, 0x20, 0xd0, 0xb4, 0x01, 0x10, 0x68, 0xa7, 0x95, 0xf5, 0x68, 0x17, + 0x00, 0x08, 0x68, 0xc3, 0x00, 0x00, 0x08, 0x0c, 0xa7, 0x8a, 0x70, 0x33, + 0x00, 0x00, 0x00, 0x36, 0x20, 0x69, 0x01, 0x40, 0x6b, 0x04, 0x93, 0x84, + 0x10, 0x00, 0x01, 0x38, 0x20, 0x01, 0x01, 0x00, 0x08, 0x0c, 0x2a, 0x99, + 0x90, 0x06, 0x08, 0x0c, 0x2a, 0x99, 0x20, 0x69, 0x01, 0x00, 0x68, 0x24, + 0xd0, 0x84, 0x01, 0x10, 0x68, 0x27, 0x00, 0x01, 0x00, 0x3e, 0x70, 0x20, + 0x9c, 0x36, 0x11, 0x10, 0x66, 0x0c, 0x76, 0x22, 0x70, 0x1c, 0x9c, 0x36, + 0x11, 0x40, 0x2c, 0x00, 0x9f, 0x36, 0x01, 0x18, 0x2f, 0x00, 0x70, 0x1e, + 0x00, 0x10, 0x70, 0x1f, 0x00, 0x00, 0x66, 0x0c, 0x00, 0x66, 0x2c, 0x00, + 0x9f, 0x06, 0x01, 0x10, 0x7e, 0x0e, 0x00, 0x08, 0x26, 0x78, 0x89, 0xff, + 0x11, 0x68, 0x60, 0x0f, 0x00, 0x00, 0x60, 0x14, 0x00, 0x96, 0x20, 0x48, + 0x08, 0x0c, 0xcf, 0x19, 0x01, 0x10, 0x08, 0x0c, 0xea, 0x30, 0x00, 0x9e, + 0x08, 0x0c, 0xb1, 0xa7, 0x08, 0x0c, 0xa6, 0x5d, 0x88, 0xff, 0x11, 0x90, + 0x00, 0xce, 0x08, 0x04, 0xa6, 0x78, 0x2c, 0x78, 0x60, 0x0c, 0x20, 0x60, + 0x08, 0x04, 0xa6, 0x78, 0x90, 0x06, 0x01, 0x2e, 0x00, 0x0e, 0x00, 0x6e, + 0x00, 0x7e, 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, + 0x60, 0x1b, 0x00, 0x00, 0x00, 0xce, 0x98, 0xc5, 0x00, 0x01, 0x0c, 0x88, + 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0x96, 0x00, 0xc6, 0x00, 0x66, + 0x00, 0x26, 0x00, 0x06, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, + 0x19, 0xe8, 0x76, 0x48, 0x26, 0x60, 0x26, 0x78, 0x8c, 0xff, 0x09, 0x04, + 0xa7, 0x79, 0x60, 0x20, 0x90, 0x86, 0x00, 0x06, 0x19, 0x04, 0xa7, 0x74, + 0x87, 0xff, 0x01, 0x28, 0x27, 0x00, 0x9c, 0x06, 0x19, 0x04, 0xa7, 0x74, + 0x00, 0x48, 0x60, 0x10, 0x9b, 0x06, 0x19, 0x04, 0xa7, 0x74, 0x85, 0xff, + 0x01, 0x18, 0x60, 0x5c, 0x91, 0x06, 0x15, 0xd0, 0x70, 0x4c, 0x9c, 0x06, + 0x11, 0x78, 0x00, 0x36, 0x20, 0x19, 0x00, 0x01, 0x08, 0x0c, 0xa5, 0x96, + 0x70, 0x3f, 0x00, 0x00, 0x90, 0x06, 0x70, 0x4e, 0x70, 0x6a, 0x70, 0x52, + 0x70, 0x6e, 0x08, 0x0c, 0xaf, 0xf4, 0x00, 0x3e, 0x70, 0x48, 0x9c, 0x36, + 0x11, 0x10, 0x66, 0x0c, 0x76, 0x4a, 0x70, 0x44, 0x9c, 0x36, 0x11, 0x40, + 0x2c, 0x00, 0x9f, 0x36, 0x01, 0x18, 0x2f, 0x00, 0x70, 0x46, 0x00, 0x10, + 0x70, 0x47, 0x00, 0x00, 0x66, 0x0c, 0x00, 0x66, 0x2c, 0x00, 0x9f, 0x06, + 0x01, 0x10, 0x7e, 0x0e, 0x00, 0x08, 0x26, 0x78, 0x60, 0x0f, 0x00, 0x00, + 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0xcf, 0x19, 0x01, 0x10, 0x08, 0x0c, + 0xea, 0x30, 0x08, 0x0c, 0xb1, 0xa7, 0x87, 0xff, 0x11, 0x98, 0x00, 0xce, + 0x08, 0x04, 0xa7, 0x22, 0x2c, 0x78, 0x60, 0x0c, 0x20, 0x60, 0x08, 0x04, + 0xa7, 0x22, 0x90, 0x06, 0x01, 0x2e, 0x00, 0x0e, 0x00, 0x2e, 0x00, 0x6e, + 0x00, 0xce, 0x00, 0x9e, 0x00, 0xde, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, + 0x60, 0x1b, 0x00, 0x00, 0x00, 0xce, 0x97, 0xbd, 0x00, 0x01, 0x0c, 0x80, + 0x00, 0xe6, 0x20, 0x71, 0x19, 0xe8, 0x90, 0x06, 0x70, 0x32, 0x70, 0x0a, + 0x70, 0x04, 0x90, 0x86, 0x00, 0x03, 0x01, 0x58, 0x20, 0x01, 0x18, 0x00, + 0x20, 0x04, 0x90, 0x86, 0x00, 0x02, 0x11, 0x18, 0x70, 0x07, 0x00, 0x05, + 0x00, 0x10, 0x70, 0x07, 0x00, 0x00, 0x00, 0xee, 0x00, 0x05, 0x00, 0xf6, + 0x00, 0xe6, 0x00, 0xc6, 0x00, 0x66, 0x00, 0x26, 0x00, 0x06, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0x19, 0xe8, 0x2c, 0x10, 0x76, 0x48, + 0x26, 0x60, 0x26, 0x78, 0x8c, 0xff, 0x05, 0x40, 0x22, 0x00, 0x9c, 0x06, + 0x15, 0x08, 0x70, 0x48, 0x9c, 0x36, 0x11, 0x10, 0x66, 0x0c, 0x76, 0x4a, + 0x70, 0x44, 0x9c, 0x36, 0x11, 0x40, 0x2c, 0x00, 0x9f, 0x36, 0x01, 0x18, + 0x2f, 0x00, 0x70, 0x46, 0x00, 0x10, 0x70, 0x47, 0x00, 0x00, 0x66, 0x0c, + 0x2c, 0x00, 0x9f, 0x06, 0x01, 0x10, 0x7e, 0x0e, 0x00, 0x08, 0x26, 0x78, + 0x60, 0x0f, 0x00, 0x00, 0x60, 0x04, 0x90, 0x86, 0x00, 0x40, 0x09, 0x0c, + 0x99, 0xed, 0x90, 0x85, 0x00, 0x01, 0x00, 0x20, 0x2c, 0x78, 0x60, 0x0c, + 0x20, 0x60, 0x08, 0xb0, 0x01, 0x2e, 0x00, 0x0e, 0x00, 0x2e, 0x00, 0x6e, + 0x00, 0xce, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, 0x00, 0x96, 0x00, 0xf6, + 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, 0x00, 0x66, 0x00, 0x26, 0x00, 0x06, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0x19, 0xe8, 0x76, 0x10, + 0x26, 0x60, 0x26, 0x78, 0x8c, 0xff, 0x09, 0x04, 0xa8, 0x77, 0x60, 0x10, + 0x00, 0xb6, 0x20, 0x58, 0xb8, 0xa0, 0x00, 0xbe, 0x92, 0x06, 0x19, 0x04, + 0xa8, 0x72, 0x70, 0x30, 0x9c, 0x06, 0x15, 0x20, 0x20, 0x69, 0x01, 0x00, + 0x68, 0xc0, 0x90, 0x05, 0x09, 0x04, 0xa8, 0x49, 0x08, 0x0c, 0xa2, 0xa0, + 0x68, 0xc3, 0x00, 0x00, 0x08, 0x0c, 0xa7, 0x8a, 0x70, 0x33, 0x00, 0x00, + 0x00, 0x36, 0x20, 0x69, 0x01, 0x40, 0x6b, 0x04, 0x93, 0x84, 0x10, 0x00, + 0x01, 0x38, 0x20, 0x01, 0x01, 0x00, 0x08, 0x0c, 0x2a, 0x99, 0x90, 0x06, + 0x08, 0x0c, 0x2a, 0x99, 0x20, 0x69, 0x01, 0x00, 0x68, 0x24, 0xd0, 0x84, + 0x01, 0x10, 0x68, 0x27, 0x00, 0x01, 0x00, 0x3e, 0x70, 0x10, 0x9c, 0x36, + 0x11, 0x10, 0x66, 0x0c, 0x76, 0x12, 0x70, 0x0c, 0x9c, 0x36, 0x11, 0x40, + 0x2c, 0x00, 0x9f, 0x36, 0x01, 0x18, 0x2f, 0x00, 0x70, 0x0e, 0x00, 0x10, + 0x70, 0x0f, 0x00, 0x00, 0x66, 0x0c, 0x00, 0x66, 0x2c, 0x00, 0x9f, 0x06, + 0x01, 0x10, 0x7e, 0x0e, 0x00, 0x08, 0x26, 0x78, 0x60, 0x0f, 0x00, 0x00, + 0x08, 0x0c, 0xd1, 0x21, 0x11, 0x80, 0x08, 0x0c, 0x33, 0x44, 0x08, 0x0c, + 0xd1, 0x32, 0x15, 0x18, 0x08, 0x0c, 0xbb, 0x5c, 0x04, 0x00, 0x08, 0x0c, + 0xa7, 0x8a, 0x68, 0x24, 0xd0, 0x84, 0x09, 0xb0, 0x68, 0x27, 0x00, 0x01, + 0x08, 0x98, 0x08, 0x0c, 0xd1, 0x32, 0x11, 0x18, 0x08, 0x0c, 0xbb, 0x5c, + 0x00, 0x90, 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0xcf, 0x19, 0x01, 0x68, + 0x60, 0x20, 0x90, 0x86, 0x00, 0x03, 0x15, 0x08, 0xa8, 0x67, 0x01, 0x03, + 0xab, 0x7a, 0xa8, 0x77, 0x00, 0x00, 0x08, 0x0c, 0x70, 0x06, 0x08, 0x0c, + 0xd1, 0x0c, 0x08, 0x0c, 0xd3, 0xae, 0x08, 0x0c, 0xb1, 0xa7, 0x08, 0x0c, + 0xa6, 0x5d, 0x00, 0xce, 0x08, 0x04, 0xa7, 0xf2, 0x2c, 0x78, 0x60, 0x0c, + 0x20, 0x60, 0x08, 0x04, 0xa7, 0xf2, 0x01, 0x2e, 0x00, 0x0e, 0x00, 0x2e, + 0x00, 0x6e, 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x9e, + 0x00, 0x05, 0x60, 0x20, 0x90, 0x86, 0x00, 0x06, 0x1d, 0x20, 0x08, 0x0c, + 0xea, 0x30, 0x0c, 0x08, 0x00, 0xd6, 0x08, 0x0c, 0x9f, 0x43, 0x70, 0x03, + 0x02, 0x00, 0x70, 0x07, 0x00, 0x14, 0x60, 0xc3, 0x00, 0x14, 0x20, 0xe1, + 0x00, 0x01, 0x20, 0x99, 0x19, 0x89, 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, + 0x02, 0x50, 0x20, 0xa9, 0x00, 0x04, 0x40, 0x03, 0x70, 0x23, 0x00, 0x04, + 0x70, 0x27, 0x78, 0x78, 0x08, 0x0c, 0xa2, 0x70, 0x00, 0xde, 0x00, 0x05, + 0x08, 0x0c, 0x9f, 0x43, 0x70, 0x0b, 0x08, 0x00, 0x78, 0x14, 0x90, 0x84, + 0xff, 0x00, 0x70, 0x0e, 0x78, 0x14, 0x90, 0x84, 0x00, 0xff, 0x70, 0x22, + 0x78, 0x2c, 0x70, 0x26, 0x78, 0x60, 0x90, 0x84, 0x00, 0xff, 0x90, 0x85, + 0x02, 0x00, 0x70, 0x02, 0x78, 0x60, 0x90, 0x84, 0xff, 0x00, 0x80, 0x07, + 0x70, 0x06, 0x60, 0xc2, 0x08, 0x04, 0xa2, 0x70, 0x00, 0xb6, 0x00, 0xd6, + 0x00, 0x16, 0x00, 0xd6, 0x2f, 0x68, 0x20, 0x09, 0x00, 0x35, 0x08, 0x0c, + 0xd5, 0xbb, 0x00, 0xde, 0x19, 0x04, 0xa9, 0x25, 0x08, 0x0c, 0x9e, 0xf8, + 0x70, 0x03, 0x13, 0x00, 0x78, 0x2c, 0x08, 0x0c, 0xaa, 0x34, 0x20, 0x68, + 0x68, 0x20, 0x90, 0x86, 0x00, 0x03, 0x05, 0x60, 0x78, 0x10, 0x20, 0x58, + 0xba, 0xa0, 0x08, 0x0c, 0xb0, 0x94, 0x11, 0xd8, 0x92, 0x86, 0x00, 0x7e, + 0x11, 0x28, 0x70, 0x0b, 0x00, 0xff, 0x70, 0x0f, 0xff, 0xfe, 0x04, 0x98, + 0x92, 0x86, 0x00, 0x7f, 0x11, 0x28, 0x70, 0x0b, 0x00, 0xff, 0x70, 0x0f, + 0xff, 0xfd, 0x04, 0x58, 0x92, 0x84, 0xff, 0x80, 0x01, 0x80, 0x92, 0x86, + 0x00, 0x80, 0x11, 0x28, 0x70, 0x0b, 0x00, 0xff, 0x70, 0x0f, 0xff, 0xfc, + 0x04, 0x00, 0x92, 0xd8, 0x10, 0x00, 0x2b, 0x5c, 0xb8, 0x10, 0x70, 0x0a, + 0xb8, 0x14, 0x70, 0x0e, 0x00, 0xc0, 0xb8, 0x84, 0x70, 0x0e, 0x00, 0xa8, + 0x08, 0x0c, 0xb0, 0x94, 0x11, 0x30, 0x78, 0x10, 0x20, 0x58, 0xb8, 0xa0, + 0x90, 0x82, 0x00, 0x7e, 0x02, 0x50, 0x00, 0xd6, 0x20, 0x69, 0x18, 0x1f, + 0x2d, 0x04, 0x70, 0x0a, 0x8d, 0x68, 0x2d, 0x04, 0x70, 0x0e, 0x00, 0xde, + 0x00, 0x10, 0x60, 0x34, 0x70, 0x0e, 0x78, 0x38, 0x70, 0x12, 0x78, 0x3c, + 0x70, 0x16, 0x60, 0xc3, 0x00, 0x0c, 0x00, 0x1e, 0x00, 0xde, 0x08, 0x0c, + 0xa2, 0x70, 0x00, 0xbe, 0x00, 0x05, 0x78, 0x1b, 0x00, 0x01, 0x78, 0x03, + 0x00, 0x06, 0x00, 0x1e, 0x00, 0xde, 0x00, 0xbe, 0x00, 0x05, 0x79, 0x2c, + 0x91, 0x80, 0x00, 0x08, 0x20, 0x0c, 0x91, 0x86, 0x00, 0x06, 0x01, 0xc0, + 0x91, 0x86, 0x00, 0x03, 0x09, 0x04, 0xa9, 0xa4, 0x91, 0x86, 0x00, 0x05, + 0x09, 0x04, 0xa9, 0x8c, 0x91, 0x86, 0x00, 0x04, 0x05, 0xf0, 0x91, 0x86, + 0x00, 0x08, 0x09, 0x04, 0xa9, 0x95, 0x78, 0x07, 0x00, 0x37, 0x78, 0x2f, + 0x00, 0x03, 0x78, 0x17, 0x17, 0x00, 0x08, 0x0c, 0xaa, 0x11, 0x00, 0x05, + 0x08, 0x0c, 0xa9, 0xd2, 0x00, 0xd6, 0x00, 0x26, 0x79, 0x2c, 0x21, 0x68, + 0x20, 0x09, 0x40, 0x00, 0x68, 0x00, 0x6a, 0x44, 0xd2, 0xfc, 0x11, 0xf8, + 0x00, 0x02, 0xa9, 0x6c, 0xa9, 0x77, 0xa9, 0x6e, 0xa9, 0x77, 0xa9, 0x73, + 0xa9, 0x6c, 0xa9, 0x6c, 0xa9, 0x77, 0xa9, 0x77, 0xa9, 0x77, 0xa9, 0x77, + 0xa9, 0x6c, 0xa9, 0x6c, 0xa9, 0x6c, 0xa9, 0x6c, 0xa9, 0x6c, 0xa9, 0x77, + 0xa9, 0x6c, 0xa9, 0x77, 0x08, 0x0c, 0x0d, 0x85, 0x68, 0x24, 0xd0, 0xe4, + 0x01, 0x10, 0xd0, 0xcc, 0x01, 0x10, 0x90, 0x0e, 0x00, 0x10, 0x20, 0x09, + 0x20, 0x00, 0x68, 0x2c, 0x70, 0x22, 0x68, 0x30, 0x70, 0x26, 0x08, 0x04, + 0xa9, 0xcb, 0x08, 0x0c, 0xa9, 0xd2, 0x00, 0xd6, 0x00, 0x26, 0x79, 0x2c, + 0x21, 0x68, 0x20, 0x09, 0x40, 0x00, 0x6a, 0x00, 0x92, 0x86, 0x00, 0x02, + 0x11, 0x08, 0x90, 0x0e, 0x08, 0x04, 0xa9, 0xcb, 0x08, 0x0c, 0xa9, 0xd2, + 0x00, 0xd6, 0x00, 0x26, 0x79, 0x2c, 0x21, 0x68, 0x20, 0x09, 0x40, 0x00, + 0x04, 0xb0, 0x04, 0xe1, 0x00, 0xd6, 0x00, 0x26, 0x79, 0x2c, 0x21, 0x68, + 0x20, 0x09, 0x40, 0x00, 0x92, 0x86, 0x00, 0x05, 0x01, 0x18, 0x92, 0x86, + 0x00, 0x02, 0x11, 0x08, 0x90, 0x0e, 0x04, 0x38, 0x04, 0x69, 0x00, 0xd6, + 0x00, 0x26, 0x79, 0x2c, 0x21, 0x68, 0x68, 0x14, 0x69, 0x24, 0xc1, 0x85, + 0x69, 0x26, 0x00, 0x96, 0x20, 0x48, 0xa9, 0xac, 0xa8, 0x34, 0x91, 0x12, + 0xa9, 0xb0, 0xa8, 0x38, 0x00, 0x9e, 0x91, 0x03, 0x70, 0x22, 0x72, 0x26, + 0x79, 0x2c, 0x91, 0x80, 0x00, 0x11, 0x20, 0x04, 0xd0, 0xfc, 0x11, 0x48, + 0x91, 0x80, 0x00, 0x00, 0x20, 0x04, 0x90, 0x8e, 0x00, 0x02, 0x01, 0x30, + 0x90, 0x8e, 0x00, 0x04, 0x01, 0x18, 0x20, 0x09, 0x40, 0x00, 0x00, 0x08, + 0x90, 0x0e, 0x71, 0x2a, 0x60, 0xc3, 0x00, 0x18, 0x00, 0x2e, 0x00, 0xde, + 0x08, 0x04, 0xa2, 0x70, 0x00, 0xb6, 0x00, 0x36, 0x00, 0x46, 0x00, 0x56, + 0x00, 0x66, 0x08, 0x0c, 0x9f, 0x43, 0x90, 0x06, 0x70, 0x03, 0x02, 0x00, + 0x79, 0x38, 0x71, 0x0a, 0x79, 0x3c, 0x71, 0x0e, 0x78, 0x10, 0x20, 0x58, + 0xb8, 0xa0, 0x08, 0x0c, 0xb0, 0x94, 0x11, 0x18, 0x90, 0x92, 0x00, 0x7e, + 0x02, 0x68, 0x00, 0xd6, 0x20, 0x69, 0x18, 0x1f, 0x2d, 0x2c, 0x8d, 0x68, + 0x2d, 0x34, 0x90, 0xd8, 0x10, 0x00, 0x2b, 0x5c, 0xbb, 0x10, 0xbc, 0x14, + 0x00, 0xde, 0x00, 0x28, 0x90, 0x1e, 0xbc, 0x84, 0x20, 0x29, 0x00, 0x00, + 0x66, 0x34, 0x78, 0x2c, 0x90, 0x80, 0x00, 0x08, 0x20, 0x04, 0x90, 0x86, + 0x00, 0x03, 0x11, 0x28, 0x75, 0x12, 0x76, 0x16, 0x73, 0x1a, 0x74, 0x1e, + 0x00, 0x20, 0x73, 0x12, 0x74, 0x16, 0x75, 0x1a, 0x76, 0x1e, 0x00, 0x6e, + 0x00, 0x5e, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0xbe, 0x00, 0x05, 0x08, 0x0c, + 0x9f, 0x43, 0x70, 0x03, 0x01, 0x00, 0x78, 0x2c, 0x70, 0x0a, 0x78, 0x14, + 0x70, 0x0e, 0x70, 0x0e, 0x60, 0xc3, 0x00, 0x08, 0x08, 0x04, 0xa2, 0x70, + 0x08, 0x0c, 0x9e, 0xef, 0x70, 0x03, 0x14, 0x00, 0x78, 0x38, 0x70, 0x0a, + 0x00, 0x79, 0x78, 0x3c, 0x70, 0x0e, 0x78, 0x2c, 0x70, 0x12, 0x78, 0x30, + 0x70, 0x16, 0x78, 0x34, 0x90, 0x84, 0x00, 0xff, 0x80, 0x07, 0x70, 0x1a, + 0x60, 0xc3, 0x00, 0x10, 0x08, 0x04, 0xa2, 0x70, 0x00, 0xe6, 0x20, 0x71, + 0x02, 0x40, 0x00, 0x06, 0x00, 0xf6, 0x20, 0x78, 0x78, 0x10, 0x00, 0xb6, + 0x20, 0x58, 0xb8, 0xd4, 0xd0, 0x84, 0x01, 0x20, 0x78, 0x4c, 0x70, 0x2a, + 0x78, 0x50, 0x70, 0x2e, 0x00, 0xbe, 0x00, 0xfe, 0x00, 0x0e, 0x00, 0xee, + 0x00, 0x05, 0x08, 0x0c, 0x9f, 0x3a, 0x70, 0x03, 0x01, 0x00, 0x78, 0x2c, + 0x70, 0x0a, 0x78, 0x14, 0x70, 0x0e, 0x60, 0xc3, 0x00, 0x08, 0x08, 0x04, + 0xa2, 0x70, 0x00, 0xa9, 0x79, 0x14, 0x71, 0x2a, 0x60, 0xc3, 0x00, 0x00, + 0x60, 0xa7, 0x95, 0x75, 0x00, 0x26, 0x08, 0x0c, 0x2a, 0x04, 0x02, 0x28, + 0x20, 0x11, 0x01, 0x01, 0x22, 0x04, 0xc0, 0xc5, 0x20, 0x12, 0x00, 0x2e, + 0x08, 0x0c, 0xa2, 0x93, 0x08, 0x0c, 0x8a, 0x42, 0x00, 0x05, 0x00, 0x36, + 0x00, 0x96, 0x00, 0xd6, 0x00, 0xe6, 0x78, 0x60, 0x20, 0x48, 0xaa, 0x7c, + 0x92, 0x96, 0x00, 0xc0, 0x92, 0x94, 0x00, 0xfd, 0xaa, 0x7e, 0xaa, 0x80, + 0x92, 0x94, 0x03, 0x00, 0xaa, 0x82, 0xa9, 0x6c, 0x91, 0x94, 0x00, 0xff, + 0xab, 0x74, 0x93, 0x84, 0x00, 0xff, 0x90, 0x8d, 0xc2, 0x00, 0xa9, 0x6e, + 0x93, 0x84, 0xff, 0x00, 0x92, 0x15, 0xaa, 0x76, 0xa8, 0x70, 0xaa, 0x78, + 0xa8, 0x7a, 0xaa, 0x72, 0x00, 0xd6, 0x20, 0x69, 0x02, 0x00, 0x08, 0x0c, + 0xaa, 0xf1, 0x00, 0xde, 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, 0x02, 0x40, + 0x20, 0xa9, 0x00, 0x0a, 0xa8, 0x60, 0x20, 0xe0, 0xa8, 0x5c, 0x90, 0x80, + 0x00, 0x1b, 0x20, 0x98, 0x40, 0x03, 0x60, 0xa3, 0x00, 0x35, 0xaa, 0x68, + 0x92, 0x94, 0x70, 0x00, 0x92, 0x86, 0x30, 0x00, 0x01, 0x10, 0x60, 0xa3, + 0x00, 0x37, 0x00, 0xee, 0x00, 0xde, 0x00, 0x9e, 0x00, 0x3e, 0x00, 0x05, + 0x90, 0x0e, 0x78, 0x14, 0x00, 0x96, 0x20, 0x48, 0xa8, 0x7c, 0xd0, 0xfc, + 0x01, 0xc0, 0x90, 0x84, 0x00, 0x03, 0x11, 0xa8, 0x20, 0x01, 0x18, 0x0c, + 0x20, 0x04, 0xd0, 0xbc, 0x01, 0x80, 0x78, 0x24, 0xd0, 0xcc, 0x11, 0x68, + 0xd0, 0xc4, 0x11, 0x58, 0xa8, 0xa8, 0x90, 0x05, 0x11, 0x40, 0x20, 0x01, + 0x18, 0x0c, 0x20, 0x0c, 0xc1, 0xd5, 0x21, 0x02, 0x20, 0x09, 0x19, 0xb3, + 0x21, 0x0c, 0x00, 0x9e, 0x91, 0x8d, 0x00, 0x92, 0x00, 0x10, 0x20, 0x09, + 0x00, 0x96, 0x60, 0xab, 0x00, 0x36, 0x00, 0x26, 0x21, 0x10, 0x90, 0x0e, + 0x08, 0x0c, 0x2a, 0xe2, 0x00, 0x2e, 0x00, 0x05, 0x20, 0x09, 0x00, 0x09, + 0x00, 0xa0, 0x20, 0x09, 0x00, 0x0a, 0x00, 0x88, 0x20, 0x09, 0x00, 0x0b, + 0x00, 0x70, 0x20, 0x09, 0x00, 0x0c, 0x00, 0x58, 0x20, 0x09, 0x00, 0x0d, + 0x00, 0x40, 0x20, 0x09, 0x00, 0x0e, 0x00, 0x28, 0x20, 0x09, 0x00, 0x0f, + 0x00, 0x10, 0x20, 0x09, 0x00, 0x08, 0x69, 0x12, 0x00, 0x05, 0x08, 0x0c, + 0x9e, 0xf8, 0x00, 0x16, 0x00, 0x26, 0x00, 0x96, 0x00, 0xd6, 0x78, 0x14, + 0x20, 0x48, 0x70, 0x13, 0x01, 0x38, 0x20, 0x01, 0x18, 0x37, 0x20, 0x04, + 0x90, 0x84, 0x00, 0x28, 0x11, 0x38, 0x20, 0x01, 0x19, 0x7c, 0x20, 0x04, + 0x90, 0x86, 0xaa, 0xaa, 0x19, 0x04, 0xab, 0x96, 0x70, 0x03, 0x54, 0x00, + 0x00, 0xc6, 0x20, 0x61, 0x18, 0x00, 0x60, 0x7c, 0x90, 0x84, 0x00, 0xff, + 0xa9, 0x98, 0x81, 0x0f, 0x91, 0x8c, 0xff, 0x00, 0x91, 0x05, 0x70, 0x0a, + 0x60, 0x80, 0x70, 0x0e, 0xa9, 0x98, 0x91, 0x8c, 0xff, 0x00, 0x71, 0x12, + 0x20, 0xa9, 0x00, 0x04, 0x20, 0x09, 0x18, 0x05, 0x2e, 0x10, 0x92, 0x90, + 0x00, 0x06, 0x21, 0x04, 0x20, 0x12, 0x81, 0x08, 0x82, 0x10, 0x1f, 0x04, + 0xab, 0x27, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x09, 0x18, 0x01, 0x21, 0x04, + 0x20, 0x12, 0x81, 0x08, 0x82, 0x10, 0x1f, 0x04, 0xab, 0x31, 0xa8, 0x60, + 0x20, 0xe0, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x29, 0x20, 0x98, 0x20, 0x09, + 0x00, 0x06, 0x20, 0xa9, 0x00, 0x01, 0x40, 0x02, 0x80, 0x07, 0x20, 0x12, + 0x82, 0x10, 0x81, 0x09, 0x1d, 0xc0, 0x00, 0xd6, 0x20, 0x69, 0x02, 0x00, + 0x08, 0x0c, 0xaa, 0xdc, 0x00, 0xde, 0x20, 0x71, 0x02, 0x40, 0x20, 0x11, + 0x02, 0x40, 0x20, 0x09, 0x00, 0x02, 0x20, 0xa9, 0x00, 0x01, 0x40, 0x02, + 0x80, 0x07, 0x20, 0x12, 0x82, 0x10, 0x81, 0x09, 0x1d, 0xc0, 0x20, 0x09, + 0x00, 0x08, 0x20, 0xa9, 0x00, 0x01, 0x40, 0x02, 0x80, 0x07, 0x20, 0x12, + 0x82, 0x10, 0x81, 0x09, 0x1d, 0xc0, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x31, + 0x20, 0x98, 0x20, 0x09, 0x00, 0x08, 0x20, 0xa9, 0x00, 0x01, 0x40, 0x02, + 0x80, 0x07, 0x20, 0x12, 0x82, 0x10, 0x81, 0x09, 0x1d, 0xc0, 0x00, 0xce, + 0x60, 0xc3, 0x00, 0x4c, 0x60, 0xa3, 0x00, 0x56, 0x60, 0xa7, 0x95, 0x75, + 0x20, 0x01, 0x18, 0x37, 0x20, 0x04, 0x90, 0x84, 0x00, 0x28, 0x11, 0x68, + 0x08, 0x0c, 0x77, 0x9e, 0x01, 0x50, 0x60, 0x28, 0xc0, 0xbd, 0x60, 0x2a, + 0x20, 0x09, 0x18, 0x04, 0x20, 0x11, 0x00, 0x29, 0x08, 0x0c, 0x2a, 0xe2, + 0x00, 0x10, 0x08, 0x0c, 0xa2, 0x70, 0x08, 0x0c, 0x8a, 0x42, 0x00, 0xde, + 0x00, 0x9e, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, + 0x02, 0x40, 0x20, 0x01, 0x22, 0x00, 0x90, 0x85, 0x00, 0xff, 0x70, 0x02, + 0x70, 0x07, 0xff, 0xff, 0x20, 0x71, 0x01, 0x00, 0x70, 0x9b, 0x00, 0xff, + 0x00, 0xee, 0x08, 0x04, 0xab, 0x0c, 0x08, 0x0c, 0x9e, 0xf8, 0x00, 0x16, + 0x00, 0x26, 0x00, 0x96, 0x00, 0xd6, 0x78, 0x14, 0x20, 0x48, 0x70, 0x13, + 0x01, 0x38, 0x70, 0x03, 0x55, 0x00, 0x00, 0xc6, 0xa8, 0x9c, 0x90, 0x84, + 0x00, 0xff, 0xa9, 0x98, 0x81, 0x0f, 0x91, 0x8c, 0xff, 0x00, 0x91, 0x05, + 0x70, 0x0a, 0xa9, 0x9c, 0x91, 0x8c, 0xff, 0x00, 0xa8, 0xa0, 0x90, 0x84, + 0x00, 0xff, 0x91, 0x05, 0x70, 0x0e, 0xa9, 0x98, 0x91, 0x8c, 0xff, 0x00, + 0x20, 0x61, 0x18, 0x00, 0x60, 0x7c, 0x90, 0x84, 0x00, 0xff, 0x91, 0x0d, + 0x71, 0x12, 0x61, 0x80, 0x71, 0x16, 0x20, 0x09, 0x00, 0x08, 0xa8, 0x60, + 0x20, 0xe0, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x29, 0x20, 0x98, 0x2e, 0x10, + 0x92, 0x90, 0x00, 0x06, 0x20, 0xa9, 0x00, 0x01, 0x40, 0x02, 0x80, 0x07, + 0x20, 0x12, 0x82, 0x10, 0x81, 0x09, 0x1d, 0xc0, 0x20, 0xa9, 0x00, 0x04, + 0x20, 0x09, 0x18, 0x05, 0x21, 0x04, 0x20, 0x12, 0x81, 0x08, 0x82, 0x10, + 0x1f, 0x04, 0xab, 0xe8, 0x20, 0xa9, 0x00, 0x02, 0x20, 0x09, 0x18, 0x01, + 0x21, 0x04, 0x20, 0x12, 0x81, 0x08, 0x82, 0x10, 0x1f, 0x04, 0xab, 0xf2, + 0x00, 0xd6, 0x00, 0x16, 0x20, 0x69, 0x02, 0x00, 0x08, 0x0c, 0xaa, 0xdc, + 0x00, 0x1e, 0x00, 0xde, 0x20, 0x71, 0x02, 0x40, 0x20, 0xa9, 0x00, 0x02, + 0x20, 0x09, 0x18, 0x03, 0x20, 0x11, 0x02, 0x40, 0x21, 0x04, 0x20, 0x12, + 0x81, 0x08, 0x82, 0x10, 0x1f, 0x04, 0xac, 0x08, 0x20, 0x09, 0x00, 0x08, + 0x40, 0x02, 0x80, 0x07, 0x20, 0x12, 0x82, 0x10, 0x81, 0x09, 0x1d, 0xd0, + 0x90, 0x06, 0x20, 0xa9, 0x00, 0x08, 0x20, 0x12, 0x82, 0x10, 0x1f, 0x04, + 0xac, 0x19, 0x00, 0xce, 0x60, 0xc3, 0x00, 0x4c, 0x60, 0xa3, 0x00, 0x56, + 0x60, 0xa7, 0x95, 0x75, 0x08, 0x0c, 0xa2, 0x70, 0x08, 0x0c, 0x8a, 0x42, + 0x00, 0xde, 0x00, 0x9e, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xd6, + 0x92, 0x90, 0x00, 0x18, 0x82, 0x14, 0x20, 0xe9, 0x00, 0x00, 0x20, 0x69, + 0x02, 0x00, 0x68, 0x13, 0x00, 0x00, 0x22, 0xa8, 0x92, 0x84, 0x00, 0xe0, + 0x01, 0x28, 0x20, 0xa9, 0x00, 0x20, 0x92, 0x92, 0x00, 0x20, 0x00, 0x08, + 0x90, 0x16, 0x20, 0xa1, 0x02, 0x40, 0x90, 0x06, 0x40, 0x04, 0x82, 0xff, + 0x01, 0x20, 0x68, 0x10, 0x80, 0x00, 0x68, 0x12, 0x0c, 0x60, 0x00, 0xde, + 0x00, 0x05, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, 0x00, 0xa6, + 0x00, 0x96, 0x00, 0x66, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, + 0x19, 0xe8, 0x76, 0x10, 0x26, 0x60, 0x26, 0x78, 0x8c, 0xff, 0x09, 0x04, + 0xac, 0xd9, 0x70, 0x30, 0x9c, 0x06, 0x15, 0x20, 0x20, 0x69, 0x01, 0x00, + 0x68, 0xc0, 0x90, 0x05, 0x09, 0x04, 0xac, 0xab, 0x08, 0x0c, 0xa2, 0xa0, + 0x68, 0xc3, 0x00, 0x00, 0x08, 0x0c, 0xa7, 0x8a, 0x70, 0x33, 0x00, 0x00, + 0x00, 0x36, 0x20, 0x69, 0x01, 0x40, 0x6b, 0x04, 0x93, 0x84, 0x10, 0x00, + 0x01, 0x38, 0x20, 0x01, 0x01, 0x00, 0x08, 0x0c, 0x2a, 0x99, 0x90, 0x06, + 0x08, 0x0c, 0x2a, 0x99, 0x20, 0x69, 0x01, 0x00, 0x68, 0x24, 0xd0, 0x84, + 0x01, 0x10, 0x68, 0x27, 0x00, 0x01, 0x00, 0x3e, 0x70, 0x10, 0x9c, 0x36, + 0x11, 0x10, 0x66, 0x0c, 0x76, 0x12, 0x70, 0x0c, 0x9c, 0x36, 0x11, 0x40, + 0x2c, 0x00, 0x9f, 0x36, 0x01, 0x18, 0x2f, 0x00, 0x70, 0x0e, 0x00, 0x10, + 0x70, 0x0f, 0x00, 0x00, 0x66, 0x0c, 0x00, 0x66, 0x2c, 0x00, 0x9f, 0x06, + 0x01, 0x10, 0x7e, 0x0e, 0x00, 0x08, 0x26, 0x78, 0x60, 0x0f, 0x00, 0x00, + 0x08, 0x0c, 0xd1, 0x21, 0x11, 0x80, 0x08, 0x0c, 0x33, 0x44, 0x08, 0x0c, + 0xd1, 0x32, 0x15, 0x18, 0x08, 0x0c, 0xbb, 0x5c, 0x04, 0x00, 0x08, 0x0c, + 0xa7, 0x8a, 0x68, 0x24, 0xd0, 0x84, 0x09, 0xb0, 0x68, 0x27, 0x00, 0x01, + 0x08, 0x98, 0x08, 0x0c, 0xd1, 0x32, 0x11, 0x18, 0x08, 0x0c, 0xbb, 0x5c, + 0x00, 0x90, 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0xcf, 0x19, 0x01, 0x68, + 0x60, 0x20, 0x90, 0x86, 0x00, 0x03, 0x15, 0x20, 0xa8, 0x67, 0x01, 0x03, + 0xab, 0x7a, 0xa8, 0x77, 0x00, 0x00, 0x08, 0x0c, 0x70, 0x12, 0x08, 0x0c, + 0xd1, 0x0c, 0x08, 0x0c, 0xd3, 0xae, 0x08, 0x0c, 0xb1, 0xa7, 0x08, 0x0c, + 0xa6, 0x5d, 0x00, 0xce, 0x08, 0x04, 0xac, 0x5c, 0x2c, 0x78, 0x60, 0x0c, + 0x20, 0x60, 0x08, 0x04, 0xac, 0x5c, 0x70, 0x13, 0x00, 0x00, 0x70, 0x0f, + 0x00, 0x00, 0x01, 0x2e, 0x00, 0x6e, 0x00, 0x9e, 0x00, 0xae, 0x00, 0xce, + 0x00, 0xde, 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, 0x60, 0x20, 0x90, 0x86, + 0x00, 0x06, 0x1d, 0x08, 0x08, 0x0c, 0xea, 0x30, 0x08, 0xf0, 0x00, 0xf6, + 0x00, 0x36, 0x20, 0x79, 0x03, 0x80, 0x7b, 0x18, 0xd3, 0xbc, 0x1d, 0xe8, + 0x78, 0x32, 0x79, 0x36, 0x7a, 0x3a, 0x78, 0x1b, 0x80, 0x80, 0x00, 0x3e, + 0x00, 0xfe, 0x00, 0x05, 0x00, 0x16, 0x20, 0x01, 0x03, 0x82, 0x20, 0x04, + 0x90, 0x84, 0x00, 0x07, 0x90, 0x86, 0x00, 0x01, 0x11, 0x88, 0x20, 0x01, + 0x00, 0x15, 0x0c, 0x29, 0x20, 0x09, 0x10, 0x00, 0x20, 0x01, 0x03, 0x82, + 0x20, 0x04, 0x90, 0x84, 0x00, 0x07, 0x90, 0x86, 0x00, 0x03, 0x01, 0x20, + 0x81, 0x09, 0x1d, 0xb0, 0x08, 0x0c, 0x0d, 0x85, 0x00, 0x1e, 0x00, 0x05, + 0x20, 0x01, 0x03, 0x82, 0x20, 0x04, 0x90, 0x84, 0x00, 0x07, 0x90, 0x86, + 0x00, 0x03, 0x11, 0x20, 0x20, 0x01, 0x03, 0x80, 0x20, 0x03, 0x00, 0x01, + 0x00, 0x05, 0x01, 0x56, 0x00, 0x16, 0x00, 0x26, 0x00, 0xe6, 0x90, 0x0e, + 0x20, 0x71, 0x19, 0xe8, 0x04, 0x69, 0x01, 0x06, 0x01, 0x90, 0x70, 0x04, + 0x90, 0x86, 0x00, 0x03, 0x01, 0x48, 0x20, 0xa9, 0x10, 0x00, 0x60, 0x44, + 0xd0, 0xfc, 0x01, 0xd8, 0x1f, 0x04, 0xad, 0x35, 0x08, 0x0c, 0x0d, 0x85, + 0x08, 0x0c, 0xac, 0xfc, 0x60, 0x44, 0xd0, 0xfc, 0x01, 0x90, 0x70, 0x30, + 0x9c, 0x06, 0x11, 0x48, 0x08, 0x0c, 0x99, 0xed, 0x60, 0x44, 0xd0, 0xdc, + 0x01, 0x50, 0xc0, 0xdc, 0x60, 0x46, 0x70, 0x0a, 0x70, 0x42, 0x70, 0x4c, + 0x9c, 0x06, 0x19, 0x0c, 0x0d, 0x85, 0x08, 0x0c, 0x9a, 0x48, 0x01, 0x0e, + 0x19, 0x19, 0x00, 0xee, 0x00, 0x2e, 0x00, 0x1e, 0x01, 0x5e, 0x00, 0x05, + 0x20, 0x01, 0x03, 0x82, 0x20, 0x04, 0x90, 0x84, 0x00, 0x07, 0x90, 0x86, + 0x00, 0x03, 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x24, 0x00, 0x78, 0x08, + 0xd0, 0xa4, 0x19, 0x0c, 0x0d, 0x7e, 0xd0, 0x9c, 0x01, 0x28, 0x78, 0x20, + 0x90, 0x8c, 0xf0, 0x00, 0x11, 0xb8, 0x00, 0x12, 0x01, 0x2e, 0x00, 0x05, + 0xad, 0x82, 0xad, 0xc0, 0xad, 0xef, 0xae, 0x37, 0xae, 0x47, 0xae, 0x58, + 0xae, 0x67, 0xae, 0x75, 0xae, 0xa2, 0xae, 0xa6, 0xad, 0x82, 0xad, 0x82, + 0xae, 0xa9, 0xae, 0xc5, 0xad, 0x82, 0xad, 0x82, 0x08, 0x0c, 0x0d, 0x85, + 0x01, 0x2e, 0x00, 0x05, 0x20, 0x60, 0x60, 0x44, 0xd0, 0xbc, 0x01, 0x40, + 0xc0, 0xbc, 0x60, 0x46, 0x60, 0x00, 0x90, 0x8a, 0x00, 0x10, 0x1a, 0x0c, + 0x0d, 0x85, 0x00, 0x12, 0x01, 0x2e, 0x00, 0x05, 0xad, 0xa7, 0xad, 0xa9, + 0xad, 0xa7, 0xad, 0xaf, 0xad, 0xa7, 0xad, 0xa7, 0xad, 0xa7, 0xad, 0xa7, + 0xad, 0xa7, 0xad, 0xa9, 0xad, 0xa7, 0xad, 0xa9, 0xad, 0xa7, 0xad, 0xa9, + 0xad, 0xa7, 0xad, 0xa7, 0xad, 0xa7, 0xad, 0xa9, 0xad, 0xa7, 0x08, 0x0c, + 0x0d, 0x85, 0x20, 0x09, 0x00, 0x13, 0x08, 0x0c, 0xb2, 0x0a, 0x01, 0x2e, + 0x00, 0x05, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x7c, 0xd0, 0xdc, 0x01, 0x30, + 0x08, 0x0c, 0x8c, 0x19, 0x08, 0x0c, 0xb1, 0x6c, 0x01, 0x2e, 0x00, 0x05, + 0x20, 0x09, 0x00, 0x49, 0x08, 0x0c, 0xb2, 0x0a, 0x01, 0x2e, 0x00, 0x05, + 0x08, 0x0c, 0xac, 0xfc, 0x20, 0x01, 0x1a, 0x0d, 0x20, 0x03, 0x00, 0x00, + 0x70, 0x30, 0x90, 0x65, 0x11, 0x30, 0x70, 0x04, 0x90, 0x86, 0x00, 0x03, + 0x01, 0xe0, 0x08, 0x0c, 0x0d, 0x85, 0x70, 0x34, 0x90, 0x92, 0xc3, 0x50, + 0x12, 0x58, 0x80, 0x00, 0x70, 0x36, 0x70, 0x04, 0x90, 0x86, 0x00, 0x03, + 0x01, 0x10, 0x70, 0x07, 0x00, 0x00, 0x78, 0x1f, 0x08, 0x08, 0x00, 0x58, + 0x08, 0x0c, 0xb0, 0xc0, 0x01, 0x40, 0x08, 0x0c, 0xee, 0xee, 0x60, 0x03, + 0x00, 0x01, 0x20, 0x09, 0x00, 0x14, 0x08, 0x0c, 0xb2, 0x0a, 0x78, 0x1f, + 0x01, 0x00, 0x08, 0x0c, 0xad, 0x18, 0x01, 0x2e, 0x00, 0x05, 0x08, 0x0c, + 0xac, 0xfc, 0x71, 0x4c, 0x81, 0xff, 0x11, 0x28, 0x20, 0x11, 0x1a, 0x10, + 0x20, 0x13, 0x00, 0x00, 0x04, 0xc0, 0x20, 0x61, 0x01, 0x00, 0x71, 0x50, + 0x91, 0x92, 0x75, 0x30, 0x16, 0x78, 0x81, 0x08, 0x71, 0x52, 0x71, 0x4c, + 0x91, 0x86, 0x1b, 0x55, 0x01, 0x20, 0x20, 0x01, 0x03, 0x91, 0x20, 0x03, + 0x04, 0x00, 0x91, 0x88, 0x00, 0x08, 0x21, 0x0c, 0x91, 0x8e, 0x00, 0x06, + 0x11, 0x60, 0x60, 0x14, 0x90, 0x84, 0x19, 0x84, 0x90, 0x85, 0x00, 0x12, + 0x71, 0x4c, 0x91, 0x8e, 0x1b, 0x55, 0x11, 0x08, 0xc0, 0xfd, 0x60, 0x16, + 0x00, 0xb0, 0x71, 0x4c, 0x91, 0x88, 0x00, 0x08, 0x21, 0x0c, 0x91, 0x8e, + 0x00, 0x09, 0x0d, 0x68, 0x60, 0x14, 0x90, 0x84, 0x19, 0x84, 0x90, 0x85, + 0x00, 0x16, 0x71, 0x4c, 0x91, 0x8e, 0x1b, 0x55, 0x11, 0x08, 0xc0, 0xfd, + 0x60, 0x16, 0x00, 0x18, 0x70, 0x6c, 0xc0, 0x85, 0x70, 0x6e, 0x78, 0x1f, + 0x02, 0x00, 0x08, 0x0c, 0xad, 0x18, 0x01, 0x2e, 0x00, 0x05, 0x08, 0x0c, + 0xac, 0xfc, 0x71, 0x4c, 0x21, 0x60, 0x60, 0x03, 0x00, 0x03, 0x20, 0x09, + 0x00, 0x4a, 0x08, 0x0c, 0xb2, 0x0a, 0x78, 0x1f, 0x02, 0x00, 0x08, 0x0c, + 0xad, 0x18, 0x01, 0x2e, 0x00, 0x05, 0x78, 0x08, 0xd0, 0x9c, 0x0d, 0xe8, + 0x78, 0x20, 0x20, 0x60, 0x60, 0x03, 0x00, 0x03, 0x08, 0x0c, 0xac, 0xfc, + 0x08, 0x0c, 0x1d, 0xcc, 0x78, 0x1f, 0x04, 0x00, 0x08, 0x0c, 0xad, 0x18, + 0x01, 0x2e, 0x00, 0x05, 0x78, 0x08, 0xd0, 0x9c, 0x0d, 0xe8, 0x78, 0x20, + 0x20, 0x60, 0x08, 0x0c, 0xac, 0xfc, 0x08, 0x0c, 0x1e, 0x14, 0x78, 0x1f, + 0x04, 0x00, 0x08, 0x0c, 0xad, 0x18, 0x01, 0x2e, 0x00, 0x05, 0x70, 0x30, + 0x90, 0x65, 0x01, 0x48, 0x60, 0x44, 0xc0, 0xbc, 0x60, 0x46, 0x71, 0x04, + 0x91, 0x86, 0x00, 0x03, 0x01, 0x10, 0x08, 0x0c, 0x9a, 0xb4, 0x01, 0x2e, + 0x00, 0x05, 0x00, 0xf6, 0x70, 0x3c, 0x90, 0x86, 0x00, 0x02, 0x05, 0x28, + 0x70, 0x4c, 0x90, 0x7d, 0x05, 0x10, 0x78, 0x44, 0xc0, 0xbc, 0x78, 0x46, + 0x78, 0x20, 0x90, 0x86, 0x00, 0x09, 0x01, 0x18, 0x08, 0x0c, 0xa1, 0xca, + 0x00, 0xc0, 0x78, 0x28, 0xd0, 0xfc, 0x11, 0x18, 0x08, 0x0c, 0xa1, 0x49, + 0x00, 0x90, 0x20, 0x01, 0x18, 0x37, 0x20, 0x04, 0x90, 0x84, 0x00, 0x28, + 0x11, 0x30, 0x20, 0x01, 0x19, 0x7c, 0x20, 0x04, 0x90, 0x86, 0xaa, 0xaa, + 0x11, 0x20, 0x20, 0x01, 0x03, 0x87, 0x20, 0x03, 0x10, 0x00, 0x08, 0x0c, + 0xa0, 0xce, 0x00, 0xfe, 0x01, 0x2e, 0x00, 0x05, 0x08, 0x0c, 0x78, 0x40, + 0x01, 0x2e, 0x00, 0x05, 0x08, 0x0c, 0x0d, 0x85, 0x00, 0x05, 0x20, 0x09, + 0x1b, 0x66, 0x21, 0x04, 0xd0, 0xbc, 0x01, 0xa8, 0xc0, 0xbc, 0x20, 0x0a, + 0x20, 0x09, 0x01, 0x0b, 0x21, 0x04, 0x90, 0x85, 0x00, 0x02, 0x20, 0x0a, + 0x20, 0x09, 0x01, 0x01, 0x21, 0x04, 0xc0, 0xac, 0x20, 0x0a, 0x20, 0x09, + 0x01, 0x05, 0x21, 0x04, 0x90, 0x84, 0x19, 0x84, 0x90, 0x85, 0x80, 0x92, + 0x20, 0x0a, 0x01, 0x2e, 0x00, 0x05, 0x08, 0x0c, 0x8a, 0x58, 0x20, 0x09, + 0x01, 0x0b, 0x21, 0x04, 0xd0, 0x8c, 0x01, 0xa8, 0xc0, 0x8c, 0x20, 0x0a, + 0x20, 0x01, 0x18, 0x48, 0x20, 0x04, 0xd0, 0x94, 0x11, 0x30, 0x20, 0x09, + 0x01, 0x01, 0x21, 0x04, 0x90, 0x85, 0x00, 0x20, 0x20, 0x0a, 0x20, 0x09, + 0x1b, 0x66, 0x20, 0x0b, 0x00, 0x00, 0x20, 0x01, 0x00, 0x1b, 0x08, 0x0c, + 0xac, 0xed, 0x01, 0x2e, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0x19, 0xe8, + 0x60, 0x44, 0xc0, 0xbc, 0x60, 0x46, 0xd0, 0xfc, 0x01, 0xb8, 0x70, 0x4c, + 0x9c, 0x06, 0x11, 0x90, 0x20, 0x19, 0x00, 0x01, 0x08, 0x0c, 0xa5, 0x96, + 0x70, 0x4f, 0x00, 0x00, 0x20, 0x01, 0x01, 0x09, 0x20, 0x04, 0xd0, 0x8c, + 0x11, 0x38, 0x20, 0x01, 0x01, 0x08, 0x20, 0x04, 0xd0, 0xbc, 0x11, 0x10, + 0x70, 0x3f, 0x00, 0x00, 0x08, 0x0c, 0xa7, 0xa1, 0x00, 0xee, 0x00, 0x05, + 0x00, 0x26, 0x70, 0x10, 0x9c, 0x06, 0x11, 0x78, 0x08, 0x0c, 0xa6, 0x5d, + 0x60, 0x44, 0xc0, 0xfc, 0x60, 0x46, 0x60, 0x0c, 0x90, 0x15, 0x01, 0x20, + 0x72, 0x12, 0x60, 0x0f, 0x00, 0x00, 0x00, 0x10, 0x72, 0x12, 0x72, 0x0e, + 0x90, 0x06, 0x00, 0x2e, 0x00, 0x05, 0x00, 0x26, 0x70, 0x20, 0x9c, 0x06, + 0x11, 0x78, 0x08, 0x0c, 0xa6, 0x5d, 0x60, 0x44, 0xc0, 0xfc, 0x60, 0x46, + 0x60, 0x0c, 0x90, 0x15, 0x01, 0x20, 0x72, 0x22, 0x60, 0x0f, 0x00, 0x00, + 0x00, 0x10, 0x72, 0x22, 0x72, 0x1e, 0x90, 0x06, 0x00, 0x2e, 0x00, 0x05, + 0x00, 0xd6, 0x00, 0x36, 0x78, 0x30, 0x9c, 0x06, 0x15, 0x58, 0x20, 0x69, + 0x01, 0x00, 0x68, 0xc0, 0x90, 0x05, 0x01, 0xf8, 0x08, 0x0c, 0x8a, 0x4b, + 0x08, 0x0c, 0xa2, 0xa0, 0x68, 0xc3, 0x00, 0x00, 0x08, 0x0c, 0xa7, 0x8a, + 0x20, 0x69, 0x01, 0x40, 0x6b, 0x04, 0x93, 0x84, 0x10, 0x00, 0x01, 0x38, + 0x20, 0x01, 0x01, 0x00, 0x08, 0x0c, 0x2a, 0x99, 0x90, 0x06, 0x08, 0x0c, + 0x2a, 0x99, 0x20, 0x69, 0x01, 0x00, 0x68, 0x24, 0xd0, 0x84, 0x01, 0x10, + 0x68, 0x27, 0x00, 0x01, 0x90, 0x85, 0x00, 0x01, 0x00, 0x38, 0x78, 0x08, + 0xc0, 0xad, 0x78, 0x0a, 0x60, 0x03, 0x00, 0x09, 0x63, 0x0a, 0x90, 0x06, + 0x00, 0x3e, 0x00, 0xde, 0x00, 0x05, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, + 0x61, 0x00, 0x20, 0x19, 0x01, 0x00, 0x20, 0x01, 0x03, 0x82, 0x20, 0x04, + 0xd0, 0x9c, 0x01, 0x90, 0x00, 0xc6, 0x01, 0x26, 0x20, 0x91, 0x28, 0x00, + 0x00, 0x16, 0x00, 0x36, 0x08, 0x0c, 0xad, 0x62, 0x00, 0x3e, 0x00, 0x1e, + 0x01, 0x2e, 0x00, 0xce, 0x62, 0x00, 0x22, 0x00, 0x91, 0x06, 0x0d, 0x58, + 0x22, 0x00, 0x00, 0x10, 0x83, 0x19, 0x1d, 0x38, 0x00, 0x3e, 0x00, 0x2e, + 0x00, 0x1e, 0x00, 0x05, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, 0x08, 0x0c, + 0xac, 0xfc, 0x01, 0x06, 0x20, 0x71, 0x19, 0xe8, 0x20, 0x69, 0x01, 0x00, + 0x70, 0x4c, 0x20, 0x60, 0x90, 0x86, 0x1b, 0x55, 0x15, 0xb8, 0x68, 0x14, + 0xd0, 0x8c, 0x01, 0x88, 0x68, 0x17, 0x00, 0x10, 0x20, 0x09, 0x00, 0x19, + 0x81, 0x09, 0x1d, 0xf0, 0x20, 0x01, 0x00, 0x32, 0x69, 0x20, 0xd1, 0xbc, + 0x01, 0x30, 0x80, 0x01, 0x1d, 0xd8, 0x69, 0x2c, 0x91, 0x8d, 0x00, 0x08, + 0x69, 0x2e, 0x68, 0x24, 0xd0, 0x8c, 0x01, 0x10, 0x68, 0x27, 0x00, 0x02, + 0x68, 0xd0, 0x90, 0x05, 0x01, 0x18, 0x90, 0x82, 0x00, 0x05, 0x02, 0x38, + 0x60, 0x60, 0x80, 0x00, 0x60, 0x62, 0x20, 0x01, 0x03, 0x91, 0x20, 0x03, + 0x04, 0x00, 0x08, 0x0c, 0x9a, 0x48, 0x68, 0x2c, 0x90, 0x84, 0xff, 0xfd, + 0x68, 0x2e, 0x20, 0x01, 0x18, 0x48, 0x20, 0x04, 0xd0, 0x94, 0x11, 0x20, + 0x68, 0x04, 0x90, 0x85, 0x00, 0x20, 0x68, 0x06, 0x20, 0x69, 0x00, 0x00, + 0x01, 0x0e, 0x09, 0x0c, 0xad, 0x18, 0x8d, 0xff, 0x00, 0xce, 0x00, 0xde, + 0x00, 0xee, 0x00, 0x05, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, 0x08, 0x0c, + 0xac, 0xfc, 0x01, 0x06, 0x20, 0x71, 0x19, 0xe8, 0x20, 0x69, 0x01, 0x00, + 0x08, 0x0c, 0xaf, 0x84, 0x68, 0xd0, 0x90, 0x05, 0x01, 0x58, 0x90, 0x82, + 0x00, 0x05, 0x12, 0x40, 0x08, 0x0c, 0x2b, 0x33, 0x20, 0x01, 0x03, 0x91, + 0x20, 0x03, 0x04, 0x00, 0x20, 0x69, 0x00, 0x00, 0x01, 0x0e, 0x09, 0x0c, + 0xad, 0x18, 0x8d, 0xff, 0x00, 0xce, 0x00, 0xde, 0x00, 0xee, 0x00, 0x05, + 0x00, 0x16, 0x20, 0x01, 0x01, 0x34, 0x20, 0x04, 0x90, 0x05, 0x01, 0x40, + 0x90, 0x82, 0x00, 0x05, 0x12, 0x28, 0x20, 0x01, 0x03, 0x91, 0x20, 0x03, + 0x04, 0x04, 0x00, 0x20, 0x20, 0x01, 0x03, 0x91, 0x20, 0x03, 0x04, 0x00, + 0x00, 0x1e, 0x00, 0x05, 0x00, 0xd6, 0x01, 0x56, 0x08, 0x0c, 0x9f, 0x43, + 0x7a, 0x14, 0x82, 0xff, 0x01, 0x38, 0x70, 0x03, 0x01, 0x00, 0x70, 0x0b, + 0x00, 0x03, 0x60, 0xc3, 0x00, 0x08, 0x04, 0x90, 0x70, 0x03, 0x02, 0x00, + 0x70, 0x07, 0x00, 0x00, 0x20, 0x69, 0x18, 0x00, 0x90, 0x1e, 0x68, 0x00, + 0x90, 0x86, 0x00, 0x04, 0x11, 0x10, 0xc3, 0x8d, 0x00, 0x60, 0x08, 0x0c, + 0x77, 0x9e, 0x11, 0x10, 0xc3, 0xad, 0x00, 0x08, 0xc3, 0xa5, 0x6a, 0xdc, + 0xd2, 0x9c, 0x11, 0x10, 0xd2, 0xac, 0x01, 0x08, 0xc3, 0x9d, 0x73, 0x0e, + 0x08, 0x0c, 0x8b, 0x10, 0x20, 0xa9, 0x00, 0x06, 0x20, 0x11, 0xff, 0xec, + 0x20, 0x19, 0xff, 0xed, 0x20, 0x71, 0x02, 0x50, 0x23, 0x05, 0x20, 0x72, + 0x8e, 0x70, 0x22, 0x05, 0x20, 0x72, 0x8e, 0x70, 0x93, 0x98, 0x00, 0x02, + 0x92, 0x90, 0x00, 0x02, 0x1f, 0x04, 0xb0, 0x3a, 0x60, 0xc3, 0x00, 0x20, + 0x08, 0x0c, 0xa2, 0x70, 0x01, 0x5e, 0x00, 0xde, 0x00, 0x05, 0x01, 0x56, + 0x08, 0x0c, 0x9f, 0x43, 0x7a, 0x14, 0x82, 0xff, 0x01, 0x68, 0x92, 0x86, + 0xff, 0xff, 0x01, 0x18, 0x92, 0x82, 0x00, 0x0e, 0x12, 0x38, 0x70, 0x03, + 0x01, 0x00, 0x70, 0x0b, 0x00, 0x03, 0x60, 0xc3, 0x00, 0x08, 0x04, 0x88, + 0x70, 0x03, 0x02, 0x00, 0x70, 0x07, 0x00, 0x1c, 0x70, 0x0f, 0x00, 0x01, + 0x20, 0x11, 0x19, 0xbe, 0x22, 0x04, 0x80, 0x07, 0x70, 0x1a, 0x82, 0x10, + 0x22, 0x04, 0x80, 0x07, 0x70, 0x1e, 0x04, 0x21, 0x11, 0x20, 0xb8, 0xa0, + 0x90, 0x82, 0x00, 0x7f, 0x02, 0x48, 0x20, 0x01, 0x18, 0x1f, 0x20, 0x04, + 0x70, 0x22, 0x20, 0x01, 0x18, 0x20, 0x20, 0x04, 0x70, 0x26, 0x00, 0x30, + 0x20, 0x01, 0x18, 0x18, 0x20, 0x04, 0x90, 0x84, 0x00, 0xff, 0x70, 0x26, + 0x20, 0xa9, 0x00, 0x04, 0x20, 0xe1, 0x00, 0x01, 0x20, 0x99, 0x18, 0x05, + 0x20, 0xe9, 0x00, 0x00, 0x20, 0xa1, 0x02, 0x56, 0x40, 0x03, 0x60, 0xc3, + 0x00, 0x1c, 0x01, 0x5e, 0x08, 0x04, 0xa2, 0x70, 0x00, 0x06, 0x20, 0x01, + 0x18, 0x37, 0x20, 0x04, 0xd0, 0xac, 0x00, 0x0e, 0x00, 0x05, 0x20, 0x11, + 0x00, 0x03, 0x08, 0x0c, 0xa6, 0x2b, 0x20, 0x11, 0x00, 0x02, 0x08, 0x0c, + 0xa6, 0x35, 0x08, 0x0c, 0xa5, 0x16, 0x00, 0x36, 0x90, 0x1e, 0x08, 0x0c, + 0xa5, 0x96, 0x00, 0x3e, 0x00, 0x05, 0x08, 0x0c, 0x34, 0x87, 0x01, 0x88, + 0x00, 0x16, 0x00, 0xb6, 0x00, 0xc6, 0x70, 0x10, 0x90, 0x85, 0x00, 0x20, + 0x70, 0x12, 0x20, 0x09, 0x00, 0x7e, 0x08, 0x0c, 0x67, 0xb4, 0xb8, 0x5c, + 0xc0, 0xac, 0xb8, 0x5e, 0x00, 0xce, 0x00, 0xbe, 0x00, 0x1e, 0x00, 0x05, + 0x00, 0xd6, 0x00, 0xf6, 0x71, 0x04, 0x91, 0x86, 0x00, 0x04, 0x11, 0x30, + 0x74, 0x10, 0x9e, 0x90, 0x00, 0x04, 0x9e, 0x98, 0x00, 0x03, 0x00, 0x88, + 0x91, 0x86, 0x00, 0x01, 0x11, 0x30, 0x74, 0x20, 0x9e, 0x90, 0x00, 0x08, + 0x9e, 0x98, 0x00, 0x07, 0x00, 0x40, 0x91, 0x86, 0x00, 0x02, 0x15, 0x38, + 0x74, 0x28, 0x9e, 0x90, 0x00, 0x0a, 0x9e, 0x98, 0x00, 0x09, 0x61, 0x10, + 0x24, 0x68, 0x68, 0x0c, 0x90, 0x7d, 0x01, 0xe8, 0x78, 0x10, 0x91, 0x06, + 0x11, 0x28, 0x2f, 0x68, 0x78, 0x0c, 0x90, 0x7d, 0x1d, 0xc8, 0x00, 0xa8, + 0x78, 0x0c, 0x68, 0x0e, 0x7c, 0x0e, 0x2f, 0x12, 0x23, 0x04, 0x9f, 0x06, + 0x11, 0x08, 0x2d, 0x1a, 0x90, 0x06, 0x70, 0x32, 0x70, 0x36, 0x70, 0x04, + 0x90, 0x86, 0x00, 0x03, 0x01, 0x10, 0x70, 0x07, 0x00, 0x00, 0x90, 0x06, + 0x00, 0xfe, 0x00, 0xde, 0x00, 0x05, 0x90, 0x85, 0x00, 0x01, 0x0c, 0xd0, + 0x20, 0x71, 0x18, 0x8d, 0x70, 0x00, 0x90, 0x05, 0x01, 0x40, 0x20, 0x01, + 0x08, 0x12, 0x20, 0x71, 0x18, 0x00, 0x70, 0x76, 0x70, 0x7a, 0x70, 0x6b, + 0xff, 0xd4, 0x20, 0x71, 0x18, 0x00, 0x70, 0x74, 0x70, 0x56, 0x70, 0x5b, + 0x1d, 0xdc, 0x00, 0x05, 0x00, 0xe6, 0x01, 0x26, 0x20, 0x71, 0x18, 0x00, + 0x20, 0x91, 0x80, 0x00, 0x75, 0x54, 0x95, 0x82, 0x00, 0x10, 0x06, 0x08, + 0x70, 0x58, 0x20, 0x60, 0x60, 0x00, 0x90, 0x86, 0x00, 0x00, 0x01, 0x48, + 0x9c, 0xe0, 0x00, 0x1c, 0x70, 0x68, 0x9c, 0x02, 0x12, 0x08, 0x0c, 0xb0, + 0x20, 0x61, 0x1d, 0xdc, 0x0c, 0x98, 0x60, 0x03, 0x00, 0x08, 0x85, 0x29, + 0x75, 0x56, 0x9c, 0xa8, 0x00, 0x1c, 0x70, 0x68, 0x95, 0x02, 0x12, 0x30, + 0x75, 0x5a, 0x90, 0x85, 0x00, 0x01, 0x01, 0x2e, 0x00, 0xee, 0x00, 0x05, + 0x70, 0x5b, 0x1d, 0xdc, 0x0c, 0xc0, 0x90, 0x06, 0x0c, 0xc0, 0x00, 0xe6, + 0x20, 0x71, 0x18, 0x00, 0x75, 0x54, 0x95, 0x82, 0x00, 0x10, 0x06, 0x00, + 0x70, 0x58, 0x20, 0x60, 0x60, 0x00, 0x90, 0x86, 0x00, 0x00, 0x01, 0x48, + 0x9c, 0xe0, 0x00, 0x1c, 0x70, 0x68, 0x9c, 0x02, 0x12, 0x08, 0x0c, 0xb0, + 0x20, 0x61, 0x1d, 0xdc, 0x0c, 0x98, 0x60, 0x03, 0x00, 0x08, 0x85, 0x29, + 0x75, 0x56, 0x9c, 0xa8, 0x00, 0x1c, 0x70, 0x68, 0x95, 0x02, 0x12, 0x28, + 0x75, 0x5a, 0x90, 0x85, 0x00, 0x01, 0x00, 0xee, 0x00, 0x05, 0x70, 0x5b, + 0x1d, 0xdc, 0x0c, 0xc8, 0x90, 0x06, 0x0c, 0xc8, 0x9c, 0x82, 0x1d, 0xdc, + 0x0a, 0x0c, 0x0d, 0x85, 0x20, 0x01, 0x18, 0x1a, 0x20, 0x04, 0x9c, 0x02, + 0x1a, 0x0c, 0x0d, 0x85, 0x90, 0x06, 0x60, 0x06, 0x60, 0x0a, 0x60, 0x0e, + 0x60, 0x16, 0x60, 0x1a, 0x60, 0x12, 0x60, 0x23, 0x00, 0x00, 0x60, 0x03, + 0x00, 0x00, 0x60, 0x1e, 0x60, 0x5e, 0x60, 0x62, 0x60, 0x26, 0x60, 0x2a, + 0x60, 0x2e, 0x60, 0x32, 0x60, 0x36, 0x60, 0x3a, 0x60, 0x3e, 0x60, 0x4a, + 0x60, 0x2a, 0x60, 0x46, 0x60, 0x42, 0x20, 0x61, 0x18, 0x00, 0x60, 0x54, + 0x80, 0x00, 0x60, 0x56, 0x00, 0x05, 0x90, 0x06, 0x60, 0x0e, 0x60, 0x16, + 0x60, 0x1a, 0x60, 0x12, 0x60, 0x22, 0x60, 0x02, 0x60, 0x1e, 0x60, 0x5e, + 0x60, 0x62, 0x60, 0x4a, 0x60, 0x46, 0x20, 0x61, 0x18, 0x00, 0x60, 0x54, + 0x80, 0x00, 0x60, 0x56, 0x00, 0x05, 0x00, 0x06, 0x60, 0x00, 0x90, 0x86, + 0x00, 0x00, 0x01, 0xd8, 0x60, 0x1c, 0xd0, 0x84, 0x19, 0x0c, 0x1a, 0xd3, + 0x60, 0x23, 0x00, 0x07, 0x20, 0x01, 0x19, 0x86, 0x20, 0x04, 0x00, 0x06, + 0x90, 0x82, 0x00, 0x51, 0x00, 0x0e, 0x02, 0x08, 0x80, 0x04, 0x60, 0x1a, + 0x08, 0x0c, 0xec, 0xe1, 0x60, 0x4b, 0x00, 0x00, 0x60, 0x44, 0xd0, 0xfc, + 0x11, 0x31, 0x90, 0x06, 0x60, 0x46, 0x60, 0x16, 0x60, 0x12, 0x00, 0x0e, + 0x00, 0x05, 0x08, 0x0c, 0xac, 0xfc, 0x01, 0x06, 0x20, 0x01, 0x19, 0xfb, + 0x20, 0x04, 0x9c, 0x06, 0x11, 0x30, 0x00, 0x36, 0x20, 0x19, 0x00, 0x01, + 0x08, 0x0c, 0xa5, 0x96, 0x00, 0x3e, 0x08, 0x0c, 0xa7, 0xa1, 0x01, 0x0e, + 0x09, 0x0c, 0xad, 0x18, 0x00, 0x05, 0x00, 0xe6, 0x01, 0x26, 0x20, 0x71, + 0x18, 0x00, 0x20, 0x91, 0x80, 0x00, 0x75, 0x54, 0x95, 0x82, 0x00, 0x01, + 0x06, 0x08, 0x70, 0x58, 0x20, 0x60, 0x60, 0x00, 0x90, 0x86, 0x00, 0x00, + 0x01, 0x48, 0x9c, 0xe0, 0x00, 0x1c, 0x70, 0x68, 0x9c, 0x02, 0x12, 0x08, + 0x0c, 0xb0, 0x20, 0x61, 0x1d, 0xdc, 0x0c, 0x98, 0x60, 0x03, 0x00, 0x08, + 0x85, 0x29, 0x75, 0x56, 0x9c, 0xa8, 0x00, 0x1c, 0x70, 0x68, 0x95, 0x02, + 0x12, 0x30, 0x75, 0x5a, 0x90, 0x85, 0x00, 0x01, 0x01, 0x2e, 0x00, 0xee, + 0x00, 0x05, 0x70, 0x5b, 0x1d, 0xdc, 0x0c, 0xc0, 0x90, 0x06, 0x0c, 0xc0, + 0x60, 0x20, 0x90, 0x84, 0x00, 0x0f, 0x00, 0x02, 0xb2, 0x1e, 0xb2, 0x28, + 0xb2, 0x43, 0xb2, 0x5e, 0xd6, 0x9a, 0xd6, 0xb7, 0xd6, 0xd2, 0xb2, 0x1e, + 0xb2, 0x28, 0x92, 0xf7, 0xb2, 0x77, 0xb2, 0x1e, 0xb2, 0x1e, 0xb2, 0x1e, + 0xb2, 0x1e, 0xb2, 0x1e, 0x91, 0x86, 0x00, 0x13, 0x11, 0x30, 0x60, 0x44, + 0xd0, 0xfc, 0x01, 0x10, 0x08, 0x0c, 0x99, 0xed, 0x00, 0x05, 0x00, 0x05, + 0x00, 0x66, 0x60, 0x00, 0x90, 0xb2, 0x00, 0x10, 0x1a, 0x0c, 0x0d, 0x85, + 0x00, 0x13, 0x00, 0x6e, 0x00, 0x05, 0xb2, 0x41, 0xb9, 0xbc, 0xbb, 0xa3, + 0xb2, 0x41, 0xbc, 0x39, 0xb5, 0x40, 0xb2, 0x41, 0xb2, 0x41, 0xb9, 0x3e, + 0xc2, 0x5a, 0xb2, 0x41, 0xb2, 0x41, 0xb2, 0x41, 0xb2, 0x41, 0xb2, 0x41, + 0xb2, 0x41, 0x08, 0x0c, 0x0d, 0x85, 0x00, 0x66, 0x60, 0x00, 0x90, 0xb2, + 0x00, 0x10, 0x1a, 0x0c, 0x0d, 0x85, 0x00, 0x13, 0x00, 0x6e, 0x00, 0x05, + 0xb2, 0x5c, 0xc8, 0x75, 0xb2, 0x5c, 0xb2, 0x5c, 0xb2, 0x5c, 0xb2, 0x5c, + 0xb2, 0x5c, 0xb2, 0x5c, 0xc8, 0x0c, 0xc9, 0xf8, 0xb2, 0x5c, 0xc8, 0xb2, + 0xc9, 0x36, 0xc8, 0xb2, 0xc9, 0x36, 0xb2, 0x5c, 0x08, 0x0c, 0x0d, 0x85, + 0x60, 0x00, 0x90, 0x82, 0x00, 0x10, 0x1a, 0x0c, 0x0d, 0x85, 0x60, 0x00, + 0x00, 0x02, 0xb2, 0x75, 0xc2, 0xa4, 0xc3, 0x3e, 0xc4, 0xc1, 0xc5, 0x30, + 0xb2, 0x75, 0xb2, 0x75, 0xb2, 0x75, 0xc2, 0x73, 0xc7, 0x8d, 0xc7, 0x90, + 0xb2, 0x75, 0xb2, 0x75, 0xb2, 0x75, 0xb2, 0x75, 0xc7, 0xc0, 0x08, 0x0c, + 0x0d, 0x85, 0x00, 0x66, 0x60, 0x00, 0x90, 0xb2, 0x00, 0x10, 0x1a, 0x0c, + 0x0d, 0x85, 0x00, 0x13, 0x00, 0x6e, 0x00, 0x05, 0xb2, 0x90, 0xb2, 0x90, + 0xb2, 0xce, 0xb3, 0x6d, 0xb3, 0xed, 0xb2, 0x90, 0xb2, 0x90, 0xb2, 0x90, + 0xb2, 0x92, 0xb2, 0x90, 0xb2, 0x90, 0xb2, 0x90, 0xb2, 0x90, 0xb2, 0x90, + 0xb2, 0x90, 0xb2, 0x90, 0x08, 0x0c, 0x0d, 0x85, 0x91, 0x86, 0x00, 0x4c, + 0x05, 0x60, 0x91, 0x86, 0x00, 0x03, 0x19, 0x0c, 0x0d, 0x85, 0x00, 0x96, + 0x60, 0x1c, 0xc0, 0xed, 0x60, 0x1e, 0x60, 0x03, 0x00, 0x03, 0x61, 0x06, + 0x60, 0x14, 0x20, 0x48, 0xa8, 0x7c, 0x90, 0x84, 0xa0, 0x00, 0xc0, 0xb5, + 0xa8, 0x7e, 0xa8, 0xac, 0xa8, 0x36, 0xa8, 0xb0, 0xa8, 0x3a, 0x90, 0x06, + 0xa8, 0x46, 0xa8, 0x4a, 0xa8, 0x84, 0x90, 0x92, 0x19, 0x9a, 0x02, 0x10, + 0x20, 0x01, 0x19, 0x99, 0x80, 0x03, 0x80, 0x13, 0x82, 0x13, 0x92, 0x10, + 0x62, 0x1a, 0x00, 0x9e, 0x08, 0x0c, 0x1c, 0x26, 0x20, 0x09, 0x80, 0x30, + 0x08, 0x0c, 0x96, 0x5e, 0x00, 0x05, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, + 0xbc, 0xa0, 0x00, 0xbe, 0x2c, 0x00, 0x08, 0x0c, 0xb4, 0x0f, 0x08, 0x0c, + 0xd6, 0x5d, 0x60, 0x03, 0x00, 0x07, 0x00, 0x05, 0x00, 0xd6, 0x00, 0x96, + 0x00, 0xf6, 0x20, 0x79, 0x18, 0x00, 0x7a, 0x90, 0x60, 0x14, 0x20, 0x48, + 0xa8, 0x7c, 0xd0, 0xec, 0x11, 0x10, 0x92, 0x90, 0x00, 0x18, 0xac, 0x78, + 0xc4, 0xfc, 0x00, 0x46, 0xa8, 0xe0, 0x90, 0x05, 0x11, 0x40, 0xa8, 0xdc, + 0x92, 0x1a, 0x01, 0x40, 0x02, 0x20, 0xa8, 0x7b, 0x00, 0x07, 0x20, 0x10, + 0x00, 0x28, 0xa8, 0x7b, 0x00, 0x15, 0x00, 0x10, 0xa8, 0x7b, 0x00, 0x00, + 0x82, 0x14, 0xa8, 0x83, 0x00, 0x00, 0xaa, 0x02, 0x00, 0x06, 0x00, 0x16, + 0x00, 0x26, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x00, 0xf6, 0x24, 0x00, + 0x90, 0x05, 0x11, 0x08, 0x00, 0x9a, 0x21, 0x00, 0x90, 0x86, 0x00, 0x15, + 0x11, 0x18, 0x20, 0x01, 0x00, 0x01, 0x00, 0x38, 0x21, 0x00, 0x90, 0x86, + 0x00, 0x16, 0x01, 0x18, 0x20, 0x01, 0x00, 0x01, 0x00, 0x2a, 0x94, 0xa4, + 0x00, 0x07, 0x84, 0x23, 0x94, 0x05, 0x00, 0x02, 0xb3, 0x35, 0xb3, 0x35, + 0xb3, 0x30, 0xb3, 0x33, 0xb3, 0x35, 0xb3, 0x2d, 0xb3, 0x20, 0xb3, 0x20, + 0xb3, 0x20, 0xb3, 0x20, 0xb3, 0x20, 0xb3, 0x20, 0xb3, 0x20, 0xb3, 0x20, + 0xb3, 0x20, 0xb3, 0x20, 0x00, 0xfe, 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, + 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x4e, 0x00, 0xfe, 0x00, 0x9e, + 0x00, 0xde, 0x08, 0x0c, 0x0d, 0x85, 0x08, 0x0c, 0xbe, 0x51, 0x00, 0x28, + 0x08, 0x0c, 0xbf, 0x8f, 0x00, 0x10, 0x08, 0x0c, 0xc0, 0x85, 0x00, 0xfe, + 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x00, 0x2e, 0x00, 0x1e, 0x2c, 0x00, + 0xa8, 0x96, 0x00, 0x0e, 0x08, 0x0c, 0xb4, 0xcd, 0x05, 0x30, 0xa8, 0x04, + 0xa8, 0x0e, 0x00, 0xa6, 0x20, 0x50, 0xb1, 0x00, 0x00, 0xae, 0x80, 0x06, + 0x80, 0x06, 0x80, 0x07, 0x90, 0xbc, 0x00, 0x3f, 0x90, 0x84, 0xff, 0xc0, + 0x90, 0x80, 0x00, 0x02, 0xaa, 0xcc, 0xab, 0xd0, 0xac, 0xd4, 0xad, 0xd8, + 0x20, 0x31, 0x00, 0x00, 0x20, 0x41, 0x12, 0xc2, 0x08, 0x0c, 0xb6, 0x91, + 0x01, 0x60, 0x00, 0x0e, 0x90, 0x05, 0x01, 0x20, 0x00, 0xfe, 0x00, 0x9e, + 0x00, 0xde, 0x00, 0x05, 0x00, 0xfe, 0x00, 0x9e, 0x00, 0xde, 0x08, 0x04, + 0xb1, 0x6c, 0x20, 0x01, 0x00, 0x2c, 0x90, 0x0e, 0x08, 0x0c, 0xb5, 0x33, + 0x0c, 0x70, 0x91, 0xb6, 0x00, 0x15, 0x01, 0x70, 0x91, 0xb6, 0x00, 0x16, + 0x01, 0x58, 0x91, 0xb2, 0x00, 0x47, 0x0a, 0x0c, 0x0d, 0x85, 0x91, 0xb2, + 0x00, 0x50, 0x1a, 0x0c, 0x0d, 0x85, 0x91, 0x82, 0x00, 0x47, 0x00, 0x42, + 0x08, 0x0c, 0xaf, 0x61, 0x01, 0x20, 0x90, 0x86, 0x00, 0x02, 0x09, 0x04, + 0xb2, 0xce, 0x00, 0x05, 0xb3, 0x8f, 0xb3, 0x8f, 0xb3, 0x91, 0xb3, 0xc3, + 0xb3, 0x8f, 0xb3, 0x8f, 0xb3, 0x8f, 0xb3, 0x8f, 0xb3, 0xd6, 0x08, 0x0c, + 0x0d, 0x85, 0x00, 0xd6, 0x00, 0x16, 0x00, 0x96, 0x60, 0x03, 0x00, 0x04, + 0x61, 0x14, 0x21, 0x48, 0xa8, 0x7c, 0xd0, 0xfc, 0x01, 0xc0, 0xa8, 0x78, + 0xc0, 0xfc, 0x90, 0x05, 0x11, 0x58, 0xa8, 0x94, 0x90, 0x05, 0x01, 0x40, + 0x20, 0x01, 0x00, 0x00, 0x90, 0x0e, 0x08, 0x0c, 0xb5, 0x33, 0x08, 0x0c, + 0xb1, 0x6c, 0x00, 0xa8, 0x60, 0x03, 0x00, 0x02, 0xa8, 0xa4, 0xa9, 0xa8, + 0x91, 0x05, 0x11, 0x78, 0xa8, 0xae, 0xa8, 0xb2, 0x0c, 0x78, 0xa8, 0x7f, + 0x00, 0x20, 0xa8, 0x8c, 0xa8, 0x8a, 0xa8, 0xa4, 0xa8, 0xae, 0xa8, 0xa8, + 0xa8, 0xb2, 0xa8, 0xc7, 0x00, 0x00, 0xa8, 0xcb, 0x00, 0x00, 0x00, 0x9e, + 0x00, 0x1e, 0x00, 0xde, 0x00, 0x05, 0x08, 0x0c, 0x9a, 0x48, 0x00, 0xd6, + 0x00, 0x96, 0x61, 0x14, 0x21, 0x48, 0x08, 0x0c, 0xcf, 0x1b, 0x01, 0x20, + 0xa8, 0x7b, 0x00, 0x06, 0x08, 0x0c, 0x70, 0x12, 0x00, 0x9e, 0x00, 0xde, + 0x08, 0x0c, 0xb1, 0x6c, 0x08, 0x04, 0x9a, 0xb3, 0x08, 0x0c, 0x9a, 0x48, + 0x08, 0x0c, 0x33, 0x15, 0x08, 0x0c, 0xd6, 0x5a, 0x00, 0xd6, 0x00, 0x96, + 0x61, 0x14, 0x21, 0x48, 0x08, 0x0c, 0xcf, 0x1b, 0x01, 0x20, 0xa8, 0x7b, + 0x00, 0x29, 0x08, 0x0c, 0x70, 0x12, 0x00, 0x9e, 0x00, 0xde, 0x08, 0x0c, + 0xb1, 0x6c, 0x08, 0x04, 0x9a, 0xb3, 0x91, 0x82, 0x00, 0x47, 0x00, 0x02, + 0xb3, 0xfd, 0xb3, 0xff, 0xb3, 0xfd, 0xb3, 0xfd, 0xb3, 0xfd, 0xb3, 0xfd, + 0xb3, 0xfd, 0xb3, 0xfd, 0xb3, 0xfd, 0xb3, 0xfd, 0xb3, 0xfd, 0xb3, 0xfd, + 0xb3, 0xff, 0x08, 0x0c, 0x0d, 0x85, 0x00, 0xd6, 0x00, 0x96, 0x60, 0x1f, + 0x00, 0x00, 0x61, 0x14, 0x21, 0x48, 0xa8, 0x7b, 0x00, 0x00, 0xa8, 0x83, + 0x00, 0x00, 0x08, 0x0c, 0x70, 0x12, 0x00, 0x9e, 0x00, 0xde, 0x08, 0x04, + 0xb1, 0x6c, 0x00, 0x26, 0x00, 0x36, 0x00, 0x56, 0x00, 0x66, 0x00, 0x96, + 0x00, 0xa6, 0x00, 0xf6, 0x00, 0x06, 0x08, 0x0c, 0x10, 0x59, 0x00, 0x0e, + 0x09, 0x0c, 0x0d, 0x85, 0xa9, 0x60, 0x21, 0xe8, 0xa9, 0x5c, 0x91, 0x88, + 0x00, 0x19, 0x21, 0xa0, 0x90, 0x0e, 0x20, 0xa9, 0x00, 0x20, 0x41, 0x04, + 0xa8, 0x7a, 0x20, 0x79, 0x18, 0x00, 0x79, 0x90, 0x91, 0x88, 0x00, 0x18, + 0x91, 0x8c, 0x0f, 0xff, 0xa9, 0x72, 0xac, 0x76, 0x29, 0x50, 0x00, 0xa6, + 0x20, 0x01, 0x02, 0x05, 0x20, 0x03, 0x00, 0x00, 0x90, 0x1e, 0x20, 0x29, + 0x00, 0x01, 0x91, 0x82, 0x00, 0x35, 0x12, 0x28, 0x20, 0x11, 0x00, 0x1f, + 0x08, 0x0c, 0xca, 0x7b, 0x04, 0xc0, 0x21, 0x30, 0x20, 0x09, 0x00, 0x34, + 0x20, 0x11, 0x00, 0x1f, 0x08, 0x0c, 0xca, 0x7b, 0x96, 0xb2, 0x00, 0x34, + 0xb0, 0x04, 0x90, 0x4d, 0x01, 0x10, 0x08, 0x0c, 0x10, 0x0b, 0x08, 0x0c, + 0x10, 0x59, 0x01, 0xd0, 0x85, 0x28, 0xa8, 0x67, 0x01, 0x10, 0xa8, 0x6b, + 0x00, 0x00, 0x29, 0x20, 0xb4, 0x06, 0x96, 0x8a, 0x00, 0x3d, 0x12, 0x30, + 0x26, 0x08, 0x20, 0x11, 0x00, 0x1b, 0x08, 0x0c, 0xca, 0x7b, 0x00, 0xb8, + 0x96, 0xb2, 0x00, 0x3c, 0x20, 0x09, 0x00, 0x3c, 0x29, 0x50, 0x20, 0x11, + 0x00, 0x1b, 0x08, 0x0c, 0xca, 0x7b, 0x0c, 0x18, 0x20, 0x01, 0x02, 0x05, + 0x20, 0x03, 0x00, 0x00, 0x00, 0xae, 0x85, 0x2f, 0x95, 0xad, 0x00, 0x50, + 0xb5, 0x66, 0xb0, 0x70, 0xc0, 0xfd, 0xb0, 0x72, 0x00, 0x48, 0x20, 0x01, + 0x02, 0x05, 0x20, 0x03, 0x00, 0x00, 0x00, 0xae, 0x85, 0x2f, 0x95, 0xad, + 0x00, 0x50, 0xb5, 0x66, 0x2a, 0x48, 0xa8, 0x04, 0xa8, 0x07, 0x00, 0x00, + 0x00, 0x06, 0x08, 0x0c, 0x70, 0x12, 0x00, 0x0e, 0x20, 0x48, 0x90, 0x05, + 0x1d, 0xb0, 0x00, 0xfe, 0x00, 0xae, 0x00, 0x9e, 0x00, 0x6e, 0x00, 0x5e, + 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x05, 0x00, 0xd6, 0x00, 0xf6, 0x00, 0x96, + 0x00, 0x06, 0x08, 0x0c, 0x10, 0x59, 0x00, 0x0e, 0x09, 0x0c, 0x0d, 0x85, + 0xa9, 0x60, 0x21, 0xe8, 0xa9, 0x5c, 0x91, 0x88, 0x00, 0x19, 0x21, 0xa0, + 0x90, 0x0e, 0x20, 0xa9, 0x00, 0x20, 0x41, 0x04, 0xaa, 0x66, 0xa8, 0x7a, + 0x20, 0x79, 0x18, 0x00, 0x79, 0x90, 0x81, 0x0c, 0x91, 0x88, 0x00, 0x0c, + 0x91, 0x82, 0x00, 0x1a, 0x02, 0x10, 0x20, 0x09, 0x00, 0x1a, 0x21, 0xa8, + 0x81, 0x0b, 0xa9, 0x72, 0xac, 0x76, 0x2e, 0x98, 0xa8, 0x5c, 0x90, 0x80, + 0x00, 0x1f, 0x20, 0xa0, 0x20, 0x01, 0x02, 0x05, 0x20, 0x0c, 0x91, 0x8d, + 0x00, 0x80, 0x21, 0x02, 0x40, 0x03, 0x20, 0x03, 0x00, 0x00, 0x08, 0x0c, + 0x70, 0x12, 0x00, 0x9e, 0x00, 0xfe, 0x00, 0xde, 0x00, 0x05, 0x00, 0x16, + 0x00, 0xd6, 0x00, 0xf6, 0x00, 0x96, 0x00, 0x16, 0x20, 0x01, 0x02, 0x05, + 0x20, 0x0c, 0x91, 0x8d, 0x00, 0x80, 0x21, 0x02, 0x00, 0x1e, 0x20, 0x79, + 0x02, 0x00, 0x2e, 0x98, 0xa8, 0x7c, 0xd0, 0xec, 0x01, 0x18, 0x9e, 0x80, + 0x00, 0x0c, 0x20, 0x98, 0x20, 0x21, 0x00, 0x3e, 0x90, 0x1e, 0x92, 0x82, + 0x00, 0x20, 0x02, 0x18, 0x20, 0x11, 0x00, 0x20, 0x20, 0x18, 0x94, 0x86, + 0x00, 0x3e, 0x11, 0x70, 0x00, 0x96, 0x08, 0x0c, 0x10, 0x59, 0x29, 0x00, + 0x00, 0x9e, 0x05, 0xc0, 0xa8, 0x06, 0x20, 0x48, 0xa8, 0x60, 0x20, 0xe8, + 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x02, 0x20, 0xa0, 0x33, 0x00, 0x90, 0x8e, + 0x02, 0x60, 0x01, 0x40, 0x20, 0x09, 0x02, 0x80, 0x91, 0x02, 0x92, 0x0a, + 0x02, 0x18, 0x20, 0x10, 0x21, 0x00, 0x93, 0x18, 0x22, 0x00, 0x94, 0x02, + 0x12, 0x28, 0x24, 0x00, 0x92, 0x02, 0x24, 0x10, 0x93, 0x18, 0x90, 0x06, + 0x20, 0x20, 0x22, 0xa8, 0xa8, 0x00, 0x92, 0x00, 0xa8, 0x02, 0x20, 0xe1, + 0x00, 0x00, 0x40, 0x03, 0x83, 0xff, 0x01, 0x80, 0x33, 0x00, 0x90, 0x86, + 0x02, 0x80, 0x11, 0x30, 0x78, 0x14, 0x80, 0x00, 0x90, 0x85, 0x00, 0x80, + 0x78, 0x16, 0x2e, 0x98, 0x23, 0x10, 0x84, 0xff, 0x09, 0x04, 0xb4, 0xe2, + 0x08, 0x04, 0xb4, 0xe4, 0x90, 0x85, 0x00, 0x01, 0x78, 0x17, 0x00, 0x00, + 0x00, 0x9e, 0x00, 0xfe, 0x00, 0xde, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xd6, + 0x00, 0x36, 0x00, 0x96, 0x63, 0x14, 0x23, 0x48, 0xa8, 0x7a, 0xa9, 0x82, + 0x08, 0x0c, 0x70, 0x06, 0x00, 0x9e, 0x00, 0x3e, 0x00, 0xde, 0x00, 0x05, + 0x91, 0xb6, 0x00, 0x15, 0x11, 0x18, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x30, + 0x91, 0xb6, 0x00, 0x16, 0x19, 0x0c, 0x0d, 0x85, 0x08, 0x0c, 0xb1, 0x6c, + 0x00, 0x05, 0x20, 0xa9, 0x00, 0x0e, 0x20, 0xe1, 0x00, 0x00, 0x2e, 0x98, + 0x60, 0x14, 0x00, 0x96, 0x20, 0x48, 0xa8, 0x60, 0x20, 0xe8, 0xa8, 0x5c, + 0x20, 0xa0, 0x00, 0x9e, 0x40, 0x03, 0x91, 0x96, 0x00, 0x16, 0x01, 0xf0, + 0x01, 0x36, 0x90, 0x80, 0x00, 0x1b, 0x20, 0xa0, 0x20, 0x11, 0x00, 0x06, + 0x20, 0xa9, 0x00, 0x01, 0x34, 0x18, 0x83, 0x18, 0x23, 0xa0, 0x40, 0x03, + 0x33, 0x18, 0x83, 0x18, 0x23, 0x98, 0x82, 0x11, 0x1d, 0xb8, 0x20, 0x11, + 0x00, 0x06, 0x01, 0x3e, 0x20, 0xa0, 0x33, 0x18, 0x83, 0x18, 0x23, 0x98, + 0x40, 0x03, 0x34, 0x18, 0x83, 0x18, 0x23, 0xa0, 0x82, 0x11, 0x1d, 0xb8, + 0x00, 0x96, 0x08, 0x0c, 0xcf, 0x1b, 0x01, 0x30, 0x60, 0x14, 0x20, 0x48, + 0xa8, 0x07, 0x00, 0x00, 0xa8, 0x67, 0x01, 0x03, 0x00, 0x9e, 0x08, 0x04, + 0xb1, 0x6c, 0x00, 0x96, 0x00, 0xd6, 0x00, 0x36, 0x73, 0x30, 0x93, 0x86, + 0x02, 0x00, 0x11, 0xa8, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0xd7, + 0x00, 0x00, 0x00, 0xbe, 0x60, 0x14, 0x90, 0x05, 0x01, 0x30, 0x20, 0x48, + 0xa8, 0x07, 0x00, 0x00, 0xa8, 0x67, 0x01, 0x03, 0xab, 0x32, 0x08, 0x0c, + 0xb1, 0x6c, 0x00, 0x3e, 0x00, 0xde, 0x00, 0x9e, 0x00, 0x05, 0x00, 0x11, + 0x1d, 0x48, 0x0c, 0xc8, 0x00, 0x06, 0x00, 0x16, 0x08, 0x0c, 0xd6, 0x45, + 0x01, 0x88, 0x60, 0x14, 0x90, 0x05, 0x11, 0x70, 0x60, 0x0b, 0x00, 0x03, + 0x60, 0x1b, 0x00, 0x00, 0x60, 0x4b, 0x00, 0x00, 0x20, 0x09, 0x00, 0x22, + 0x08, 0x0c, 0xb9, 0x94, 0x90, 0x06, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x05, + 0x90, 0x85, 0x00, 0x01, 0x0c, 0xd0, 0x00, 0x96, 0x00, 0x16, 0x20, 0xa9, + 0x00, 0x14, 0x9e, 0x80, 0x00, 0x0c, 0x20, 0xe1, 0x00, 0x00, 0x20, 0x98, + 0x60, 0x14, 0x20, 0x48, 0xa8, 0x60, 0x20, 0xe8, 0xa8, 0x5c, 0x90, 0x80, + 0x00, 0x02, 0x20, 0xa0, 0x40, 0x03, 0x20, 0x01, 0x02, 0x05, 0x20, 0x03, + 0x00, 0x01, 0x20, 0x99, 0x02, 0x60, 0x20, 0xa9, 0x00, 0x16, 0x40, 0x03, + 0x20, 0xa9, 0x00, 0x0a, 0xa8, 0x04, 0x20, 0x48, 0xa8, 0x60, 0x20, 0xe8, + 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x02, 0x20, 0xa0, 0x40, 0x03, 0x20, 0x01, + 0x02, 0x05, 0x20, 0x03, 0x00, 0x02, 0x20, 0x99, 0x02, 0x60, 0x20, 0xa9, + 0x00, 0x20, 0x40, 0x03, 0x20, 0x03, 0x00, 0x00, 0x60, 0x14, 0x20, 0x48, + 0xa8, 0x00, 0x20, 0x48, 0xa8, 0x67, 0x01, 0x03, 0x08, 0x0c, 0xb1, 0x6c, + 0x00, 0x1e, 0x00, 0x9e, 0x00, 0x05, 0x00, 0x96, 0x00, 0x16, 0x90, 0x0e, + 0x70, 0x30, 0x90, 0x86, 0x01, 0x00, 0x01, 0x40, 0x70, 0x38, 0x90, 0x84, + 0x00, 0xff, 0x80, 0x0c, 0x70, 0x3c, 0x90, 0x84, 0x00, 0xff, 0x80, 0x04, + 0x90, 0x80, 0x00, 0x04, 0x91, 0x08, 0x81, 0x0b, 0x20, 0x11, 0x00, 0x02, + 0x20, 0x19, 0x00, 0x0c, 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0xca, 0x7b, + 0x08, 0x0c, 0xcf, 0x1b, 0x01, 0x40, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x07, + 0x00, 0x00, 0xa8, 0x64, 0xa8, 0xe2, 0xa8, 0x67, 0x01, 0x03, 0x08, 0x0c, + 0xb1, 0x6c, 0x00, 0x1e, 0x00, 0x9e, 0x00, 0x05, 0x00, 0x16, 0x20, 0x09, + 0x00, 0x00, 0x70, 0x30, 0x90, 0x86, 0x02, 0x00, 0x01, 0x10, 0x20, 0x09, + 0x00, 0x01, 0x00, 0x96, 0x60, 0x14, 0x90, 0x4d, 0x09, 0x0c, 0x0d, 0x85, + 0xa9, 0x7a, 0x08, 0x0c, 0x70, 0x12, 0x00, 0x9e, 0x08, 0x0c, 0xb1, 0x6c, + 0x00, 0x1e, 0x00, 0x05, 0x00, 0x16, 0x00, 0x96, 0x70, 0x30, 0x90, 0x86, + 0x01, 0x00, 0x11, 0x18, 0x20, 0x09, 0x00, 0x04, 0x00, 0x10, 0x70, 0x34, + 0x80, 0x0c, 0x81, 0x0b, 0x20, 0x11, 0x00, 0x0c, 0x20, 0x19, 0x00, 0x0c, + 0x60, 0x14, 0x20, 0x48, 0xa8, 0x04, 0x00, 0x96, 0x90, 0x05, 0x01, 0x08, + 0x20, 0x48, 0x08, 0x0c, 0xca, 0x7b, 0x00, 0x9e, 0x08, 0x0c, 0xcf, 0x1b, + 0x01, 0x48, 0xa8, 0x04, 0x90, 0x05, 0x11, 0x58, 0xa8, 0x07, 0x00, 0x00, + 0xa8, 0x64, 0xa8, 0xe2, 0xa8, 0x67, 0x01, 0x03, 0x08, 0x0c, 0xb1, 0x6c, + 0x00, 0x9e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0x86, 0x20, 0x40, 0xa0, 0x30, + 0x80, 0x07, 0x90, 0x86, 0x01, 0x00, 0x11, 0x18, 0x08, 0x0c, 0xbb, 0x5c, + 0x00, 0xe0, 0xa0, 0x34, 0x80, 0x07, 0x80, 0x0c, 0x88, 0x06, 0x80, 0x06, + 0x80, 0x07, 0x90, 0xbc, 0x00, 0x3f, 0x90, 0x84, 0xff, 0xc0, 0x90, 0x80, + 0x00, 0x0c, 0xa8, 0x7b, 0x00, 0x00, 0xa8, 0x83, 0x00, 0x00, 0xa8, 0x97, + 0x40, 0x00, 0xaa, 0xa0, 0xab, 0x9c, 0xac, 0xa8, 0xad, 0xa4, 0x20, 0x31, + 0x00, 0x00, 0x20, 0x41, 0x12, 0xa8, 0x00, 0x19, 0x0d, 0x08, 0x00, 0x8e, + 0x08, 0x98, 0x00, 0x96, 0x00, 0x06, 0x08, 0x0c, 0x10, 0x59, 0x00, 0x0e, + 0x01, 0xb0, 0xa8, 0xab, 0x0d, 0xcb, 0xa8, 0x76, 0x00, 0x0e, 0xa8, 0xa2, + 0x00, 0x06, 0xae, 0x6a, 0x28, 0x00, 0xa8, 0x9e, 0xa9, 0x7a, 0xaf, 0x72, + 0xaa, 0x8e, 0xab, 0x92, 0xac, 0x96, 0xad, 0x9a, 0x00, 0x86, 0x29, 0x40, + 0x08, 0x0c, 0x11, 0x4e, 0x00, 0x8e, 0x90, 0x85, 0x00, 0x01, 0x00, 0x9e, + 0x00, 0x05, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0x26, 0x70, 0x08, 0x90, 0x84, + 0x00, 0xff, 0x62, 0x10, 0x00, 0xb6, 0x22, 0x58, 0xba, 0x10, 0x00, 0xbe, + 0x92, 0x06, 0x15, 0x20, 0x70, 0x0c, 0x62, 0x10, 0x00, 0xb6, 0x22, 0x58, + 0xba, 0x14, 0x00, 0xbe, 0x92, 0x06, 0x11, 0xe0, 0x60, 0x4b, 0x00, 0x00, + 0x2c, 0x68, 0x00, 0x16, 0x20, 0x09, 0x00, 0x35, 0x08, 0x0c, 0xd5, 0xbb, + 0x00, 0x1e, 0x11, 0x58, 0x62, 0x2c, 0x22, 0x68, 0x20, 0x71, 0x02, 0x6c, + 0x6b, 0x20, 0x93, 0x86, 0x00, 0x03, 0x01, 0x30, 0x93, 0x86, 0x00, 0x06, + 0x01, 0x28, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x20, 0x00, 0x39, 0x00, 0x10, + 0x08, 0x0c, 0xb7, 0xc7, 0x00, 0x2e, 0x00, 0xde, 0x00, 0xee, 0x00, 0x05, + 0x00, 0x96, 0x68, 0x14, 0x20, 0x48, 0x91, 0x86, 0x00, 0x15, 0x09, 0x04, + 0xb7, 0xa6, 0x91, 0x8e, 0x00, 0x16, 0x19, 0x04, 0xb7, 0xc5, 0x70, 0x0c, + 0x90, 0x8c, 0xff, 0x00, 0x91, 0x86, 0x17, 0x00, 0x01, 0x20, 0x91, 0x86, + 0x03, 0x00, 0x19, 0x04, 0xb7, 0x80, 0x89, 0xff, 0x11, 0x38, 0x68, 0x00, + 0x90, 0x86, 0x00, 0x0f, 0x09, 0x04, 0xb7, 0x62, 0x08, 0x04, 0xb7, 0xc3, + 0x68, 0x08, 0x90, 0x86, 0xff, 0xff, 0x19, 0x04, 0xb7, 0xa8, 0xa8, 0x7c, + 0x90, 0x84, 0x00, 0x60, 0x90, 0x86, 0x00, 0x20, 0x11, 0x50, 0xa8, 0xac, + 0xa9, 0x34, 0x91, 0x06, 0x19, 0x04, 0xb7, 0xa8, 0xa8, 0xb0, 0xa9, 0x38, + 0x91, 0x06, 0x19, 0x04, 0xb7, 0xa8, 0x68, 0x24, 0xd0, 0x84, 0x19, 0x04, + 0xb7, 0xa8, 0xd0, 0xb4, 0x01, 0x58, 0x00, 0x16, 0x20, 0x01, 0x19, 0x86, + 0x20, 0x0c, 0x60, 0x18, 0x91, 0x02, 0x90, 0x82, 0x00, 0x05, 0x00, 0x1e, + 0x1a, 0x04, 0xb7, 0xa8, 0x08, 0x0c, 0xd1, 0x0c, 0x68, 0x10, 0x00, 0x96, + 0x20, 0x48, 0xa9, 0xa0, 0x00, 0x9e, 0x68, 0x5c, 0xa8, 0x7a, 0xa9, 0x76, + 0x68, 0x64, 0xa8, 0x82, 0xa8, 0x7c, 0xc0, 0xdc, 0xc0, 0xf4, 0xc0, 0xd4, + 0xa8, 0x7e, 0x00, 0x26, 0x90, 0x0e, 0x6a, 0x18, 0x20, 0x01, 0x00, 0x0a, + 0x08, 0x0c, 0x95, 0x5b, 0xa8, 0x84, 0x92, 0x0a, 0x02, 0x08, 0x80, 0x11, + 0xaa, 0x86, 0x82, 0xff, 0x00, 0x2e, 0x11, 0x38, 0x00, 0xc6, 0x2d, 0x60, + 0x08, 0x0c, 0xcc, 0x01, 0x00, 0xce, 0x08, 0x04, 0xb7, 0xc3, 0x00, 0xc6, + 0xa8, 0x68, 0xd0, 0xfc, 0x11, 0x18, 0x08, 0x0c, 0x62, 0x2f, 0x00, 0x10, + 0x08, 0x0c, 0x66, 0x3a, 0x00, 0xce, 0x19, 0x04, 0xb7, 0xa8, 0x00, 0xc6, + 0x2d, 0x60, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0xce, 0x08, 0x04, 0xb7, 0xc3, + 0x00, 0xc6, 0x08, 0x0c, 0xb1, 0xdd, 0x01, 0x98, 0x60, 0x17, 0x00, 0x00, + 0x68, 0x10, 0x60, 0x12, 0x08, 0x0c, 0xd3, 0xb6, 0x60, 0x23, 0x00, 0x03, + 0x69, 0x04, 0x00, 0xc6, 0x2d, 0x60, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0xce, + 0x08, 0x0c, 0xb2, 0x0a, 0x00, 0xce, 0x08, 0x04, 0xb7, 0xc3, 0x20, 0x01, + 0x19, 0x88, 0x20, 0x04, 0x68, 0x4a, 0x00, 0xce, 0x08, 0x04, 0xb7, 0xc3, + 0x70, 0x08, 0x90, 0x86, 0x00, 0x0b, 0x11, 0xc8, 0x60, 0x10, 0x00, 0xb6, + 0x20, 0x58, 0xb9, 0x00, 0xc1, 0xbc, 0xb9, 0x02, 0x00, 0xbe, 0x00, 0xc6, + 0x2d, 0x60, 0xa8, 0x7b, 0x00, 0x03, 0x08, 0x0c, 0xd5, 0xff, 0x60, 0x07, + 0x00, 0x85, 0x60, 0x03, 0x00, 0x0b, 0x60, 0x23, 0x00, 0x02, 0x20, 0x09, + 0x80, 0x20, 0x08, 0x0c, 0x96, 0x17, 0x00, 0xce, 0x04, 0x30, 0x70, 0x0c, + 0x90, 0x86, 0x2a, 0x00, 0x11, 0x38, 0x20, 0x01, 0x19, 0x88, 0x20, 0x04, + 0x68, 0x4a, 0x00, 0xe8, 0x04, 0xc1, 0x00, 0xe8, 0x89, 0xff, 0x09, 0x0c, + 0x0d, 0x85, 0x00, 0xc6, 0x00, 0xd6, 0x2d, 0x60, 0xa8, 0x67, 0x01, 0x03, + 0xa8, 0x7b, 0x00, 0x03, 0x08, 0x0c, 0x6e, 0x27, 0x08, 0x0c, 0xd1, 0x0c, + 0x08, 0x0c, 0xb1, 0xa7, 0x00, 0x26, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, + 0xba, 0x3c, 0x08, 0x0c, 0x68, 0xdf, 0x00, 0xbe, 0x00, 0x2e, 0x00, 0xde, + 0x00, 0xce, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x9e, 0x00, 0x05, 0x91, 0x86, + 0x00, 0x15, 0x11, 0x28, 0x20, 0x01, 0x19, 0x88, 0x20, 0x04, 0x68, 0x4a, + 0x00, 0x68, 0x91, 0x8e, 0x00, 0x16, 0x11, 0x60, 0x00, 0xc6, 0x2d, 0x00, + 0x20, 0x60, 0x08, 0x0c, 0xec, 0xe1, 0x08, 0x0c, 0x8c, 0x19, 0x08, 0x0c, + 0xb1, 0x6c, 0x00, 0xce, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x05, 0x00, 0x26, + 0x00, 0x36, 0x00, 0x46, 0x72, 0x28, 0xac, 0xb0, 0xab, 0xac, 0xd2, 0xf4, + 0x01, 0x30, 0x20, 0x01, 0x19, 0x88, 0x20, 0x04, 0x68, 0x4a, 0x08, 0x04, + 0xb8, 0x41, 0x00, 0xc6, 0x2d, 0x60, 0x08, 0x0c, 0xca, 0xdc, 0x00, 0xce, + 0x68, 0x04, 0x90, 0x86, 0x00, 0x50, 0x11, 0x68, 0x00, 0xc6, 0x2d, 0x00, + 0x20, 0x60, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x50, 0x20, 0x09, + 0x80, 0x23, 0x08, 0x0c, 0x96, 0x17, 0x00, 0xce, 0x04, 0xf0, 0x68, 0x00, + 0x90, 0x86, 0x00, 0x0f, 0x01, 0xa8, 0x89, 0xff, 0x09, 0x0c, 0x0d, 0x85, + 0x68, 0x00, 0x90, 0x86, 0x00, 0x04, 0x11, 0x90, 0xa8, 0x7c, 0xd0, 0xac, + 0x01, 0x78, 0xa8, 0x43, 0x0f, 0xff, 0xa8, 0x3f, 0x0f, 0xff, 0xa8, 0x80, + 0xc0, 0xfc, 0xa8, 0x82, 0x20, 0x01, 0x00, 0x01, 0x68, 0x32, 0x04, 0x00, + 0x20, 0x01, 0x00, 0x07, 0x68, 0x32, 0x00, 0xe0, 0xa8, 0x7c, 0xd0, 0xb4, + 0x11, 0x50, 0xd0, 0xac, 0x0d, 0xb8, 0x68, 0x24, 0xd0, 0xf4, 0x1d, 0x48, + 0xa8, 0x38, 0xa9, 0x34, 0x91, 0x05, 0x0d, 0x80, 0x0c, 0x20, 0xd2, 0xec, + 0x1d, 0x68, 0x70, 0x24, 0x93, 0x06, 0x11, 0x18, 0x70, 0x20, 0x94, 0x06, + 0x0d, 0x38, 0x70, 0x20, 0x68, 0x3e, 0x70, 0x24, 0x68, 0x3a, 0x20, 0x01, + 0x00, 0x05, 0x68, 0x32, 0x08, 0x0c, 0xd2, 0xa0, 0x08, 0x0c, 0x9a, 0xb3, + 0x00, 0x10, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0x2e, + 0x00, 0x05, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0x26, 0x70, 0x08, 0x90, 0x84, + 0x00, 0xff, 0x62, 0x10, 0x00, 0xb6, 0x22, 0x58, 0xba, 0x10, 0x00, 0xbe, + 0x92, 0x06, 0x19, 0x04, 0xb8, 0xac, 0x70, 0x0c, 0x62, 0x10, 0x00, 0xb6, + 0x22, 0x58, 0xba, 0x14, 0x00, 0xbe, 0x92, 0x06, 0x19, 0x04, 0xb8, 0xac, + 0x60, 0x38, 0x20, 0x68, 0x68, 0x24, 0xc0, 0xdc, 0x68, 0x26, 0x6a, 0x20, + 0x92, 0x86, 0x00, 0x07, 0x09, 0x04, 0xb8, 0xac, 0x92, 0x86, 0x00, 0x02, + 0x09, 0x04, 0xb8, 0xac, 0x92, 0x86, 0x00, 0x00, 0x05, 0xe8, 0x68, 0x08, + 0x63, 0x3c, 0x93, 0x06, 0x15, 0xc8, 0x20, 0x71, 0x02, 0x6c, 0x91, 0x86, + 0x00, 0x15, 0x05, 0x70, 0x91, 0x8e, 0x00, 0x16, 0x11, 0x00, 0x00, 0xc6, + 0x60, 0x38, 0x20, 0x60, 0x61, 0x04, 0x91, 0x86, 0x00, 0x4b, 0x01, 0xc0, + 0x91, 0x86, 0x00, 0x4c, 0x01, 0xa8, 0x91, 0x86, 0x00, 0x4d, 0x01, 0x90, + 0x91, 0x86, 0x00, 0x4e, 0x01, 0x78, 0x91, 0x86, 0x00, 0x52, 0x01, 0x60, + 0x60, 0x14, 0x00, 0x96, 0x20, 0x48, 0x08, 0x0c, 0xcf, 0x1b, 0x09, 0x0c, + 0x0d, 0x85, 0xa8, 0x7b, 0x00, 0x03, 0x00, 0x9e, 0x08, 0x0c, 0xd5, 0xff, + 0x60, 0x07, 0x00, 0x85, 0x60, 0x03, 0x00, 0x0b, 0x60, 0x23, 0x00, 0x02, + 0x20, 0x09, 0x80, 0x20, 0x08, 0x0c, 0x96, 0x17, 0x00, 0xce, 0x00, 0x30, + 0x60, 0x38, 0x20, 0x70, 0x20, 0x01, 0x19, 0x88, 0x20, 0x04, 0x70, 0x4a, + 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x2e, 0x00, 0xde, 0x00, 0xee, 0x00, 0x05, + 0x00, 0xb6, 0x00, 0x96, 0x00, 0xf6, 0x60, 0x14, 0x20, 0x48, 0x60, 0x10, + 0x20, 0x58, 0x91, 0xb6, 0x00, 0x15, 0x01, 0x30, 0xba, 0x08, 0xbb, 0x0c, + 0xbc, 0x00, 0xc4, 0x8c, 0xbc, 0x02, 0x04, 0x70, 0x00, 0x96, 0x01, 0x56, + 0x00, 0x36, 0x00, 0x26, 0x2b, 0x48, 0x9e, 0x90, 0x00, 0x10, 0x20, 0x19, + 0x00, 0x0a, 0x20, 0xa9, 0x00, 0x04, 0x08, 0x0c, 0xc2, 0x22, 0x00, 0x2e, + 0x00, 0x3e, 0x01, 0x5e, 0x00, 0x9e, 0x19, 0x04, 0xb9, 0x1d, 0x00, 0x96, + 0x01, 0x56, 0x00, 0x36, 0x00, 0x26, 0x2b, 0x48, 0x9e, 0x90, 0x00, 0x14, + 0x20, 0x19, 0x00, 0x06, 0x20, 0xa9, 0x00, 0x04, 0x08, 0x0c, 0xc2, 0x22, + 0x00, 0x2e, 0x00, 0x3e, 0x01, 0x5e, 0x00, 0x9e, 0x15, 0xb0, 0x72, 0x38, + 0xba, 0x0a, 0x73, 0x3c, 0xbb, 0x0e, 0x83, 0xff, 0x01, 0x18, 0xbc, 0x00, + 0xc4, 0x8d, 0xbc, 0x02, 0xa8, 0x04, 0x90, 0x05, 0x11, 0x28, 0x00, 0xfe, + 0x00, 0x9e, 0x00, 0xbe, 0x08, 0x04, 0xb5, 0x7c, 0x00, 0x96, 0x20, 0x48, + 0xaa, 0x12, 0xab, 0x16, 0xac, 0x0a, 0x00, 0x9e, 0x80, 0x06, 0x80, 0x06, + 0x80, 0x07, 0x90, 0xbc, 0x00, 0x3f, 0x90, 0x84, 0xff, 0xc0, 0x90, 0x80, + 0x00, 0x02, 0x20, 0x09, 0x00, 0x2b, 0xaa, 0xa0, 0xab, 0x9c, 0xac, 0xa8, + 0xad, 0xa4, 0x20, 0x31, 0x00, 0x00, 0x20, 0x41, 0x12, 0xa8, 0x08, 0x0c, + 0xb6, 0x91, 0x01, 0x30, 0x00, 0xfe, 0x00, 0x9e, 0x08, 0x0c, 0xb1, 0x6c, + 0x00, 0xbe, 0x00, 0x05, 0x08, 0x0c, 0xbb, 0x5c, 0x0c, 0xb8, 0x2b, 0x78, + 0x00, 0xf6, 0x08, 0x0c, 0x33, 0x15, 0x08, 0x0c, 0xd6, 0x5a, 0x00, 0xfe, + 0x00, 0xc6, 0x08, 0x0c, 0xb1, 0x16, 0x2f, 0x00, 0x60, 0x12, 0x60, 0x17, + 0x00, 0x00, 0x60, 0x23, 0x00, 0x01, 0x60, 0x07, 0x00, 0x01, 0x60, 0x03, + 0x00, 0x01, 0x20, 0x01, 0x00, 0x07, 0x08, 0x0c, 0x66, 0xfa, 0x08, 0x0c, + 0x67, 0x26, 0x08, 0x0c, 0x96, 0x1e, 0x08, 0x0c, 0x9a, 0xb3, 0x00, 0xce, + 0x08, 0x04, 0xb8, 0xf0, 0x21, 0x00, 0x91, 0xb2, 0x00, 0x53, 0x1a, 0x0c, + 0x0d, 0x85, 0x91, 0xb2, 0x00, 0x40, 0x1a, 0x04, 0xb9, 0xa6, 0x00, 0x02, + 0xb9, 0x94, 0xb9, 0x94, 0xb9, 0x8a, 0xb9, 0x94, 0xb9, 0x94, 0xb9, 0x94, + 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x88, + 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x88, + 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x88, + 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x88, + 0xb9, 0x88, 0xb9, 0x94, 0xb9, 0x88, 0xb9, 0x94, 0xb9, 0x94, 0xb9, 0x88, + 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x8a, 0xb9, 0x88, + 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x88, + 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x94, 0xb9, 0x94, 0xb9, 0x88, 0xb9, 0x88, + 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x88, 0xb9, 0x88, + 0xb9, 0x88, 0xb9, 0x94, 0xb9, 0x88, 0xb9, 0x88, 0x08, 0x0c, 0x0d, 0x85, + 0x00, 0x66, 0x00, 0xb6, 0x66, 0x10, 0x26, 0x58, 0xb8, 0xd4, 0xc0, 0x8c, + 0xb8, 0xd6, 0x00, 0xbe, 0x00, 0x6e, 0x00, 0x00, 0x60, 0x03, 0x00, 0x01, + 0x61, 0x06, 0x91, 0x86, 0x00, 0x32, 0x01, 0x18, 0x08, 0x0c, 0x96, 0x1e, + 0x00, 0x10, 0x08, 0x0c, 0x96, 0x17, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x08, 0x0c, 0x9a, 0xb3, 0x01, 0x2e, 0x00, 0x05, 0x26, 0x00, 0x00, 0x02, + 0xb9, 0x94, 0xb9, 0x94, 0xb9, 0xba, 0xb9, 0x94, 0xb9, 0x94, 0xb9, 0xba, + 0xb9, 0xba, 0xb9, 0xba, 0xb9, 0xba, 0xb9, 0x94, 0xb9, 0xba, 0xb9, 0x94, + 0xb9, 0xba, 0xb9, 0x94, 0xb9, 0xba, 0xb9, 0xba, 0xb9, 0xba, 0xb9, 0xba, + 0x08, 0x0c, 0x0d, 0x85, 0x60, 0x04, 0x90, 0xb2, 0x00, 0x53, 0x1a, 0x0c, + 0x0d, 0x85, 0x91, 0xb6, 0x00, 0x13, 0x09, 0x04, 0xba, 0x91, 0x91, 0xb6, + 0x00, 0x27, 0x19, 0x04, 0xba, 0x3d, 0x08, 0x0c, 0x99, 0xed, 0x60, 0x04, + 0x08, 0x0c, 0xd1, 0x21, 0x01, 0xb0, 0x08, 0x0c, 0xd1, 0x32, 0x01, 0xa8, + 0x90, 0x8e, 0x00, 0x21, 0x09, 0x04, 0xba, 0x3a, 0x90, 0x8e, 0x00, 0x22, + 0x11, 0x30, 0x08, 0x0c, 0xb5, 0xa8, 0x09, 0x04, 0xba, 0x36, 0x08, 0x04, + 0xba, 0x37, 0x90, 0x8e, 0x00, 0x3d, 0x09, 0x04, 0xba, 0x3a, 0x08, 0x04, + 0xba, 0x30, 0x08, 0x0c, 0x33, 0x44, 0x20, 0x01, 0x00, 0x07, 0x08, 0x0c, + 0x66, 0xfa, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb9, 0xa0, 0x00, 0xbe, + 0x08, 0x0c, 0xbb, 0x5c, 0x91, 0x86, 0x00, 0x7e, 0x11, 0x48, 0x20, 0x01, + 0x18, 0x37, 0x20, 0x14, 0xc2, 0x85, 0x08, 0x0c, 0x77, 0x9e, 0x11, 0x08, + 0xc2, 0xad, 0x22, 0x02, 0x08, 0x0c, 0xac, 0xfc, 0x00, 0x36, 0x00, 0x26, + 0x20, 0x19, 0x00, 0x28, 0x21, 0x10, 0x08, 0x0c, 0xed, 0xee, 0x00, 0x2e, + 0x00, 0x3e, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x21, 0x10, 0x20, 0x19, + 0x00, 0x28, 0x08, 0x0c, 0x97, 0xb0, 0x00, 0x76, 0x90, 0x3e, 0x08, 0x0c, + 0x96, 0x6d, 0x60, 0x10, 0x00, 0xb6, 0x90, 0x5d, 0x01, 0x00, 0x00, 0xbe, + 0x2c, 0x08, 0x08, 0x0c, 0xe7, 0x5d, 0x00, 0x7e, 0x00, 0x3e, 0x00, 0x2e, + 0x00, 0x1e, 0x08, 0x0c, 0xad, 0x18, 0x08, 0x0c, 0xd6, 0x5a, 0x00, 0x16, + 0x08, 0x0c, 0xd3, 0xae, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x1e, 0x08, 0x0c, + 0x34, 0x1e, 0x08, 0x0c, 0x9a, 0xb3, 0x00, 0x30, 0x08, 0x0c, 0xd3, 0xae, + 0x08, 0x0c, 0xb1, 0x6c, 0x08, 0x0c, 0x9a, 0xb3, 0x00, 0x05, 0x08, 0x0c, + 0xbb, 0x5c, 0x0c, 0xb0, 0x08, 0x0c, 0xbb, 0x98, 0x0c, 0x98, 0x91, 0x86, + 0x00, 0x15, 0x01, 0x18, 0x91, 0x86, 0x00, 0x16, 0x11, 0x40, 0x08, 0x0c, + 0xaf, 0x61, 0x0d, 0x80, 0x90, 0x86, 0x00, 0x02, 0x09, 0x04, 0xbb, 0xa3, + 0x0c, 0x58, 0x91, 0x86, 0x00, 0x14, 0x1d, 0x40, 0x08, 0x0c, 0x99, 0xed, + 0x60, 0x04, 0x90, 0x8e, 0x00, 0x22, 0x11, 0x18, 0x08, 0x0c, 0xb5, 0xa8, + 0x09, 0xf8, 0x08, 0x0c, 0x33, 0x15, 0x08, 0x0c, 0xd6, 0x5a, 0x08, 0x0c, + 0xd1, 0x21, 0x11, 0x90, 0x08, 0x0c, 0x33, 0x44, 0x60, 0x10, 0x00, 0xb6, + 0x20, 0x58, 0xb9, 0xa0, 0x00, 0xbe, 0x08, 0x0c, 0xbb, 0x5c, 0x91, 0x86, + 0x00, 0x7e, 0x11, 0x28, 0x20, 0x01, 0x18, 0x37, 0x20, 0x0c, 0xc1, 0x85, + 0x21, 0x02, 0x08, 0x00, 0x08, 0x0c, 0xd1, 0x32, 0x11, 0x20, 0x08, 0x0c, + 0xbb, 0x5c, 0x08, 0x04, 0xba, 0x30, 0x60, 0x04, 0x90, 0x8e, 0x00, 0x32, + 0x11, 0x60, 0x00, 0xe6, 0x00, 0xf6, 0x20, 0x71, 0x18, 0x9e, 0x20, 0x79, + 0x00, 0x00, 0x08, 0x0c, 0x36, 0xbf, 0x00, 0xfe, 0x00, 0xee, 0x08, 0x04, + 0xba, 0x30, 0x60, 0x04, 0x90, 0x8e, 0x00, 0x21, 0x0d, 0x40, 0x90, 0x8e, + 0x00, 0x22, 0x09, 0x0c, 0xbb, 0x5c, 0x08, 0x04, 0xba, 0x30, 0x90, 0xb2, + 0x00, 0x40, 0x1a, 0x04, 0xbb, 0x3c, 0x20, 0x08, 0x00, 0x02, 0xba, 0xd9, + 0xba, 0xda, 0xba, 0xdd, 0xba, 0xe0, 0xba, 0xe3, 0xba, 0xf0, 0xba, 0xd7, + 0xba, 0xd7, 0xba, 0xd7, 0xba, 0xd7, 0xba, 0xd7, 0xba, 0xd7, 0xba, 0xd7, + 0xba, 0xd7, 0xba, 0xd7, 0xba, 0xd7, 0xba, 0xd7, 0xba, 0xd7, 0xba, 0xd7, + 0xba, 0xd7, 0xba, 0xd7, 0xba, 0xd7, 0xba, 0xd7, 0xba, 0xd7, 0xba, 0xd7, + 0xba, 0xd7, 0xba, 0xd7, 0xba, 0xd7, 0xba, 0xd7, 0xba, 0xd7, 0xba, 0xf3, + 0xba, 0xfe, 0xba, 0xd7, 0xba, 0xff, 0xba, 0xfe, 0xba, 0xd7, 0xba, 0xd7, + 0xba, 0xd7, 0xba, 0xd7, 0xba, 0xd7, 0xba, 0xfe, 0xba, 0xfe, 0xba, 0xd7, + 0xba, 0xd7, 0xba, 0xd7, 0xba, 0xd7, 0xba, 0xd7, 0xba, 0xd7, 0xba, 0xd7, + 0xba, 0xd7, 0xbb, 0x27, 0xba, 0xfe, 0xba, 0xd7, 0xba, 0xfa, 0xba, 0xd7, + 0xba, 0xd7, 0xba, 0xd7, 0xba, 0xfb, 0xba, 0xd7, 0xba, 0xd7, 0xba, 0xd7, + 0xba, 0xfe, 0xbb, 0x22, 0xba, 0xd7, 0x08, 0x0c, 0x0d, 0x85, 0x04, 0x20, + 0x20, 0x01, 0x00, 0x0b, 0x04, 0x48, 0x20, 0x01, 0x00, 0x03, 0x04, 0x30, + 0x20, 0x01, 0x00, 0x05, 0x04, 0x18, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, + 0xb8, 0x04, 0x00, 0xbe, 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x00, + 0x11, 0xd8, 0x20, 0x01, 0x00, 0x01, 0x00, 0xb0, 0x20, 0x01, 0x00, 0x09, + 0x00, 0x98, 0x60, 0x03, 0x00, 0x05, 0x08, 0x0c, 0xd6, 0x5d, 0x08, 0x0c, + 0x9a, 0xb3, 0x00, 0x58, 0x00, 0x18, 0x00, 0x10, 0x08, 0x0c, 0x66, 0xfa, + 0x04, 0xb8, 0x08, 0x0c, 0xd6, 0x5d, 0x60, 0x03, 0x00, 0x04, 0x08, 0x0c, + 0x9a, 0xb3, 0x00, 0x05, 0x08, 0x0c, 0x66, 0xfa, 0x60, 0x03, 0x00, 0x02, + 0x00, 0x36, 0x20, 0x19, 0x18, 0x52, 0x23, 0x04, 0x90, 0x84, 0xff, 0x00, + 0x11, 0x20, 0x20, 0x01, 0x19, 0x86, 0x20, 0x1c, 0x00, 0x40, 0x80, 0x07, + 0x90, 0x9a, 0x00, 0x04, 0x0e, 0xc0, 0x80, 0x03, 0x80, 0x1b, 0x83, 0x1b, + 0x93, 0x18, 0x63, 0x1a, 0x00, 0x3e, 0x08, 0x0c, 0x9a, 0xb3, 0x0c, 0x18, + 0x08, 0x0c, 0xd3, 0xae, 0x08, 0x0c, 0xb1, 0x6c, 0x08, 0xf0, 0x00, 0xe6, + 0x00, 0xf6, 0x20, 0x71, 0x18, 0x9e, 0x20, 0x79, 0x00, 0x00, 0x08, 0x0c, + 0x36, 0xbf, 0x00, 0xfe, 0x00, 0xee, 0x08, 0x0c, 0x99, 0xed, 0x08, 0x0c, + 0xb1, 0x6c, 0x08, 0x78, 0x60, 0x03, 0x00, 0x02, 0x08, 0x0c, 0xd6, 0x5d, + 0x08, 0x04, 0x9a, 0xb3, 0x26, 0x00, 0x20, 0x08, 0x00, 0x02, 0xbb, 0x53, + 0xbb, 0x36, 0xbb, 0x51, 0xbb, 0x36, 0xbb, 0x36, 0xbb, 0x51, 0xbb, 0x51, + 0xbb, 0x51, 0xbb, 0x51, 0xbb, 0x36, 0xbb, 0x51, 0xbb, 0x36, 0xbb, 0x51, + 0xbb, 0x36, 0xbb, 0x51, 0xbb, 0x51, 0xbb, 0x51, 0xbb, 0x51, 0x08, 0x0c, + 0x0d, 0x85, 0x00, 0x96, 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0x70, 0x12, + 0x00, 0x9e, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x05, 0x00, 0xe6, 0x00, 0x96, + 0x00, 0x26, 0x00, 0x16, 0x08, 0x0c, 0xcf, 0x1b, 0x05, 0x68, 0x60, 0x14, + 0x20, 0x48, 0xa8, 0x64, 0x90, 0x86, 0x01, 0x39, 0x11, 0xa8, 0xa8, 0x94, + 0x90, 0x86, 0x00, 0x56, 0x11, 0x48, 0x08, 0x0c, 0x55, 0xcc, 0x01, 0x30, + 0x20, 0x01, 0x00, 0x00, 0x90, 0x0e, 0x20, 0x11, 0x40, 0x00, 0x00, 0x28, + 0x20, 0x01, 0x00, 0x30, 0x90, 0x0e, 0x20, 0x11, 0x40, 0x05, 0x08, 0x0c, + 0xd5, 0x1f, 0x00, 0x90, 0xa8, 0x68, 0xd0, 0xfc, 0x01, 0x78, 0xa8, 0x07, + 0x00, 0x00, 0x00, 0x16, 0x60, 0x04, 0x90, 0x8e, 0x00, 0x21, 0x01, 0x68, + 0x90, 0x8e, 0x00, 0x3d, 0x01, 0x50, 0x00, 0x1e, 0xa8, 0x67, 0x01, 0x03, + 0xa8, 0x33, 0x01, 0x00, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x9e, 0x00, 0xee, + 0x00, 0x05, 0x00, 0x1e, 0x00, 0x09, 0x0c, 0xc0, 0x00, 0x96, 0x60, 0x14, + 0x20, 0x48, 0xa8, 0x00, 0x20, 0x48, 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x23, + 0x80, 0x01, 0x00, 0x9e, 0x00, 0x05, 0x00, 0xb6, 0x66, 0x10, 0x26, 0x58, + 0xb8, 0x04, 0x90, 0x84, 0x00, 0xff, 0x90, 0xb2, 0x00, 0x0c, 0x1a, 0x0c, + 0x0d, 0x85, 0x66, 0x04, 0x96, 0xb6, 0x00, 0x4d, 0x11, 0x20, 0x08, 0x0c, + 0xd4, 0x3e, 0x08, 0x04, 0xbc, 0x28, 0x66, 0x04, 0x96, 0xb6, 0x00, 0x43, + 0x11, 0x20, 0x08, 0x0c, 0xd4, 0x87, 0x08, 0x04, 0xbc, 0x28, 0x66, 0x04, + 0x96, 0xb6, 0x00, 0x4b, 0x11, 0x20, 0x08, 0x0c, 0xd4, 0xb3, 0x08, 0x04, + 0xbc, 0x28, 0x66, 0x04, 0x96, 0xb6, 0x00, 0x33, 0x11, 0x20, 0x08, 0x0c, + 0xd3, 0xd0, 0x08, 0x04, 0xbc, 0x28, 0x66, 0x04, 0x96, 0xb6, 0x00, 0x28, + 0x11, 0x20, 0x08, 0x0c, 0xd1, 0x70, 0x08, 0x04, 0xbc, 0x28, 0x66, 0x04, + 0x96, 0xb6, 0x00, 0x29, 0x11, 0x20, 0x08, 0x0c, 0xd1, 0xb1, 0x08, 0x04, + 0xbc, 0x28, 0x66, 0x04, 0x96, 0xb6, 0x00, 0x1f, 0x11, 0x20, 0x08, 0x0c, + 0xb5, 0x4d, 0x08, 0x04, 0xbc, 0x28, 0x66, 0x04, 0x96, 0xb6, 0x00, 0x00, + 0x11, 0x18, 0x08, 0x0c, 0xb8, 0xb2, 0x04, 0xe0, 0x66, 0x04, 0x96, 0xb6, + 0x00, 0x22, 0x11, 0x18, 0x08, 0x0c, 0xb5, 0x89, 0x04, 0xa8, 0x66, 0x04, + 0x96, 0xb6, 0x00, 0x35, 0x11, 0x18, 0x08, 0x0c, 0xb6, 0xaf, 0x04, 0x70, + 0x66, 0x04, 0x96, 0xb6, 0x00, 0x39, 0x11, 0x18, 0x08, 0x0c, 0xb8, 0x47, + 0x04, 0x38, 0x66, 0x04, 0x96, 0xb6, 0x00, 0x3d, 0x11, 0x18, 0x08, 0x0c, + 0xb5, 0xc1, 0x04, 0x00, 0x66, 0x04, 0x96, 0xb6, 0x00, 0x44, 0x11, 0x18, + 0x08, 0x0c, 0xb5, 0xfd, 0x00, 0xc8, 0x66, 0x04, 0x96, 0xb6, 0x00, 0x49, + 0x11, 0x18, 0x08, 0x0c, 0xb6, 0x3e, 0x00, 0x90, 0x66, 0x04, 0x96, 0xb6, + 0x00, 0x41, 0x11, 0x18, 0x08, 0x0c, 0xb6, 0x28, 0x00, 0x58, 0x91, 0xb6, + 0x00, 0x15, 0x11, 0x10, 0x00, 0x63, 0x00, 0x30, 0x91, 0xb6, 0x00, 0x16, + 0x11, 0x28, 0x00, 0xbe, 0x08, 0x04, 0xbf, 0x34, 0x00, 0xbe, 0x00, 0x05, + 0x08, 0x0c, 0xb2, 0x27, 0x0c, 0xd8, 0xbc, 0x45, 0xbc, 0x53, 0xbc, 0x45, + 0xbc, 0x9a, 0xbc, 0x45, 0xbe, 0x51, 0xbf, 0x41, 0xbc, 0x45, 0xbc, 0x45, + 0xbf, 0x0a, 0xbc, 0x45, 0xbf, 0x20, 0x00, 0x96, 0x60, 0x1f, 0x00, 0x00, + 0x60, 0x14, 0x20, 0x48, 0xa8, 0x00, 0x20, 0x48, 0xa8, 0x67, 0x01, 0x03, + 0x00, 0x9e, 0x08, 0x04, 0xb1, 0x6c, 0xa0, 0x01, 0xa0, 0x01, 0x00, 0x05, + 0x66, 0x04, 0x96, 0xb6, 0x00, 0x04, 0x11, 0x30, 0x20, 0x01, 0x00, 0x01, + 0x08, 0x0c, 0x66, 0xe6, 0x08, 0x04, 0xb1, 0x6c, 0x00, 0x05, 0x00, 0xe6, + 0x20, 0x71, 0x18, 0x00, 0x70, 0x90, 0x90, 0x86, 0x00, 0x74, 0x15, 0x40, + 0x08, 0x0c, 0xe7, 0x2e, 0x11, 0xb0, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, + 0x70, 0x30, 0xd0, 0x8c, 0x01, 0x28, 0xb8, 0x00, 0xd0, 0xbc, 0x01, 0x10, + 0xc0, 0xc5, 0xb8, 0x02, 0x00, 0xf9, 0x00, 0xbe, 0x20, 0x01, 0x00, 0x06, + 0x08, 0x0c, 0x66, 0xfa, 0x08, 0x0c, 0x33, 0x44, 0x08, 0x0c, 0xb1, 0x6c, + 0x00, 0x98, 0x20, 0x01, 0x00, 0x0a, 0x08, 0x0c, 0x66, 0xfa, 0x08, 0x0c, + 0x33, 0x44, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x01, 0x08, 0x0c, + 0x96, 0x1e, 0x08, 0x0c, 0x9a, 0xb3, 0x00, 0x20, 0x20, 0x01, 0x00, 0x01, + 0x08, 0x0c, 0xbe, 0x21, 0x00, 0xee, 0x00, 0x05, 0x00, 0xd6, 0xb8, 0x00, + 0xd0, 0x84, 0x01, 0x60, 0x90, 0x06, 0x08, 0x0c, 0x66, 0xe6, 0x20, 0x69, + 0x18, 0x47, 0x68, 0x04, 0xd0, 0xa4, 0x01, 0x20, 0x20, 0x01, 0x00, 0x06, + 0x08, 0x0c, 0x67, 0x26, 0x00, 0xde, 0x00, 0x05, 0x00, 0xb6, 0x00, 0x96, + 0x00, 0xd6, 0x20, 0x11, 0x18, 0x24, 0x22, 0x04, 0x90, 0x86, 0x00, 0x74, + 0x19, 0x04, 0xbd, 0xf6, 0x60, 0x10, 0x20, 0x58, 0xba, 0xa0, 0x92, 0x86, + 0x00, 0x7e, 0x11, 0x20, 0x08, 0x0c, 0xc0, 0x90, 0x08, 0x04, 0xbd, 0x63, + 0x20, 0x01, 0x18, 0x0d, 0x20, 0x04, 0xd0, 0x8c, 0x09, 0x04, 0xbd, 0x05, + 0x00, 0xd6, 0x08, 0x0c, 0x77, 0x9e, 0x01, 0xa0, 0x00, 0x26, 0x20, 0x11, + 0x00, 0x10, 0x08, 0x0c, 0x6c, 0x35, 0x00, 0x2e, 0x09, 0x04, 0xbd, 0x04, + 0x08, 0x0c, 0x58, 0x54, 0x15, 0x98, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x07, + 0x00, 0x00, 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x33, 0xde, 0xad, 0x04, 0x50, + 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb9, 0x10, 0x00, 0xbe, 0x91, 0x86, + 0x00, 0xff, 0x05, 0x80, 0x00, 0x26, 0x20, 0x11, 0x80, 0x08, 0x08, 0x0c, + 0x6c, 0x35, 0x00, 0x2e, 0x05, 0x48, 0x60, 0x14, 0x90, 0x05, 0x09, 0x0c, + 0x0d, 0x85, 0x20, 0x48, 0xa8, 0x64, 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, + 0x00, 0x39, 0x11, 0x40, 0x20, 0x01, 0x00, 0x30, 0x90, 0x0e, 0x20, 0x11, + 0x40, 0x09, 0x08, 0x0c, 0xd5, 0x1f, 0x00, 0x40, 0x60, 0x14, 0x20, 0x48, + 0xa8, 0x07, 0x00, 0x00, 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x33, 0xde, 0xad, + 0x60, 0x10, 0x20, 0x58, 0xb9, 0xa0, 0x00, 0x16, 0x08, 0x0c, 0x33, 0x44, + 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x1e, 0x08, 0x0c, 0x34, 0x1e, 0x00, 0xde, + 0x08, 0x04, 0xbd, 0xfb, 0x00, 0xde, 0x08, 0x0c, 0xc0, 0x85, 0x60, 0x10, + 0x20, 0x58, 0xba, 0xa0, 0x92, 0x86, 0x00, 0x80, 0x15, 0x10, 0x60, 0x14, + 0x90, 0x05, 0x01, 0xa8, 0x20, 0x48, 0xa8, 0x64, 0x90, 0x84, 0x00, 0xff, + 0x90, 0x86, 0x00, 0x39, 0x11, 0x40, 0x20, 0x01, 0x00, 0x00, 0x90, 0x0e, + 0x20, 0x11, 0x40, 0x00, 0x08, 0x0c, 0xd5, 0x1f, 0x00, 0x30, 0xa8, 0x07, + 0x00, 0x00, 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x33, 0x02, 0x00, 0x20, 0x01, + 0x00, 0x06, 0x08, 0x0c, 0x66, 0xfa, 0x08, 0x0c, 0x33, 0x44, 0x08, 0x0c, + 0xb1, 0x6c, 0x08, 0x04, 0xbd, 0xfb, 0x08, 0x0c, 0xbe, 0x09, 0x60, 0x14, + 0x90, 0x05, 0x01, 0x90, 0x20, 0x48, 0xa8, 0x68, 0xd0, 0xf4, 0x01, 0xe8, + 0xa8, 0x64, 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x39, 0x1d, 0x08, + 0x20, 0x01, 0x00, 0x00, 0x90, 0x0e, 0x20, 0x11, 0x40, 0x00, 0x08, 0x0c, + 0xd5, 0x1f, 0x08, 0xf8, 0x08, 0x0c, 0xbd, 0xff, 0x01, 0x60, 0x90, 0x06, + 0x08, 0x0c, 0x66, 0xe6, 0x20, 0x01, 0x00, 0x04, 0x08, 0x0c, 0x67, 0x26, + 0x20, 0x01, 0x00, 0x07, 0x08, 0x0c, 0x66, 0xfa, 0x08, 0xa0, 0x20, 0x01, + 0x00, 0x04, 0x08, 0x0c, 0x66, 0xfa, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, + 0x00, 0x03, 0x08, 0x0c, 0x96, 0x1e, 0x08, 0x0c, 0x9a, 0xb3, 0x08, 0x04, + 0xbd, 0xfb, 0xb8, 0x5c, 0xd0, 0xe4, 0x01, 0x78, 0x08, 0x0c, 0xd3, 0x48, + 0x08, 0x0c, 0x77, 0x9e, 0x01, 0x18, 0xd0, 0xdc, 0x19, 0x04, 0xbd, 0x25, + 0x20, 0x11, 0x18, 0x37, 0x22, 0x04, 0xc0, 0xad, 0x20, 0x12, 0x08, 0x04, + 0xbd, 0x25, 0x08, 0x0c, 0xd3, 0x89, 0x20, 0x11, 0x18, 0x37, 0x22, 0x04, + 0xc0, 0xa5, 0x20, 0x12, 0x00, 0x06, 0x08, 0x0c, 0xe9, 0x05, 0x00, 0x0e, + 0x19, 0x04, 0xbd, 0x25, 0xc0, 0xb5, 0x20, 0x12, 0x20, 0x01, 0x00, 0x06, + 0x08, 0x0c, 0x66, 0xfa, 0x90, 0x06, 0x08, 0x0c, 0x66, 0xe6, 0x00, 0xc6, + 0x20, 0x01, 0x18, 0x0f, 0x20, 0x04, 0xd0, 0x9c, 0x05, 0x20, 0x00, 0xf6, + 0x20, 0x79, 0x01, 0x00, 0x00, 0xe6, 0x20, 0x71, 0x18, 0x00, 0x70, 0x0c, + 0x90, 0x84, 0x00, 0xff, 0x78, 0xe6, 0x70, 0x7e, 0x70, 0x10, 0x78, 0xea, + 0x70, 0x82, 0x90, 0x8c, 0x00, 0xff, 0x00, 0xee, 0x78, 0x0c, 0xc0, 0xb5, + 0x78, 0x0e, 0x00, 0xfe, 0x08, 0x0c, 0x26, 0xd5, 0x00, 0xf6, 0x21, 0x00, + 0x90, 0x0e, 0x08, 0x0c, 0x26, 0x8c, 0x79, 0x5e, 0x00, 0xfe, 0x91, 0x86, + 0x00, 0x81, 0x01, 0xf0, 0x20, 0x09, 0x00, 0x81, 0x00, 0xe0, 0x20, 0x09, + 0x00, 0xef, 0x00, 0xf6, 0x20, 0x79, 0x01, 0x00, 0x79, 0xea, 0x78, 0xe7, + 0x00, 0x00, 0x79, 0x32, 0x79, 0x36, 0x78, 0x0c, 0xc0, 0xb5, 0x78, 0x0e, + 0x00, 0xfe, 0x08, 0x0c, 0x26, 0xd5, 0x00, 0xf6, 0x20, 0x79, 0x18, 0x00, + 0x79, 0x82, 0x21, 0x00, 0x90, 0x0e, 0x79, 0x7e, 0x08, 0x0c, 0x26, 0x8c, + 0x79, 0x5e, 0x00, 0xfe, 0x81, 0x08, 0x08, 0x0c, 0x67, 0x49, 0x2b, 0x00, + 0x00, 0xce, 0x19, 0x04, 0xbd, 0x25, 0x60, 0x12, 0x20, 0x09, 0x18, 0x0f, + 0x21, 0x0c, 0xd1, 0x9c, 0x01, 0x50, 0x20, 0x09, 0x02, 0x7c, 0x21, 0x0c, + 0x91, 0x8c, 0x00, 0xff, 0xb9, 0x12, 0x20, 0x09, 0x02, 0x7d, 0x21, 0x0c, + 0xb9, 0x16, 0x20, 0x01, 0x00, 0x02, 0x08, 0x0c, 0x66, 0xfa, 0x60, 0x23, + 0x00, 0x01, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x02, 0x08, 0x0c, + 0x96, 0x1e, 0x08, 0x0c, 0x9a, 0xb3, 0x00, 0x28, 0x08, 0x0c, 0xbb, 0x5c, + 0x20, 0x01, 0x00, 0x01, 0x04, 0x31, 0x00, 0xde, 0x00, 0x9e, 0x00, 0xbe, + 0x00, 0x05, 0x20, 0x01, 0x18, 0x10, 0x20, 0x04, 0xd0, 0xa4, 0x01, 0x20, + 0x20, 0x01, 0x18, 0x48, 0x20, 0x04, 0xd0, 0xac, 0x00, 0x05, 0x00, 0xe6, + 0x08, 0x0c, 0xee, 0x47, 0x01, 0x90, 0x20, 0x71, 0x02, 0x60, 0x71, 0x08, + 0x72, 0x0c, 0x91, 0x8c, 0x00, 0xff, 0x11, 0x18, 0x92, 0x84, 0xff, 0x00, + 0x01, 0x40, 0x60, 0x10, 0x20, 0x58, 0xb8, 0xa0, 0x90, 0x84, 0xff, 0x80, + 0x11, 0x10, 0xb9, 0x12, 0xba, 0x16, 0x00, 0xee, 0x00, 0x05, 0x20, 0x30, + 0x90, 0x05, 0x01, 0x58, 0x20, 0x01, 0x00, 0x07, 0x08, 0x0c, 0x66, 0xfa, + 0x08, 0x0c, 0x58, 0x54, 0x11, 0x20, 0x20, 0x01, 0x00, 0x07, 0x08, 0x0c, + 0x67, 0x26, 0x26, 0x00, 0x90, 0x05, 0x11, 0xb0, 0x60, 0x14, 0x00, 0x96, + 0x20, 0x48, 0xa8, 0x68, 0x00, 0x9e, 0xd0, 0xfc, 0x11, 0x78, 0x00, 0x36, + 0x00, 0x46, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xbb, 0xa0, 0x00, 0xbe, + 0x20, 0x21, 0x00, 0x04, 0x20, 0x11, 0x80, 0x14, 0x08, 0x0c, 0x4c, 0xa1, + 0x00, 0x4e, 0x00, 0x3e, 0x08, 0x0c, 0x33, 0x44, 0x60, 0x20, 0x90, 0x86, + 0x00, 0x0a, 0x11, 0x08, 0x00, 0x05, 0x08, 0x04, 0xb1, 0x6c, 0x00, 0xb6, + 0x00, 0xe6, 0x00, 0x26, 0x00, 0x16, 0x20, 0x71, 0x18, 0x00, 0x70, 0x90, + 0x90, 0x86, 0x00, 0x14, 0x19, 0x04, 0xbf, 0x00, 0x20, 0x01, 0x18, 0x0d, + 0x20, 0x04, 0xd0, 0x8c, 0x09, 0x04, 0xbe, 0xb3, 0x00, 0xd6, 0x08, 0x0c, + 0x77, 0x9e, 0x01, 0xa0, 0x00, 0x26, 0x20, 0x11, 0x00, 0x10, 0x08, 0x0c, + 0x6c, 0x35, 0x00, 0x2e, 0x09, 0x04, 0xbe, 0xb2, 0x08, 0x0c, 0x58, 0x54, + 0x15, 0x98, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x07, 0x00, 0x00, 0xa8, 0x67, + 0x01, 0x03, 0xa8, 0x33, 0xde, 0xad, 0x04, 0x50, 0x60, 0x10, 0x00, 0xb6, + 0x20, 0x58, 0xb9, 0x10, 0x00, 0xbe, 0x91, 0x86, 0x00, 0xff, 0x05, 0x80, + 0x00, 0x26, 0x20, 0x11, 0x80, 0x08, 0x08, 0x0c, 0x6c, 0x35, 0x00, 0x2e, + 0x05, 0x48, 0x60, 0x14, 0x90, 0x05, 0x09, 0x0c, 0x0d, 0x85, 0x20, 0x48, + 0xa8, 0x64, 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x39, 0x11, 0x40, + 0x20, 0x01, 0x00, 0x30, 0x90, 0x0e, 0x20, 0x11, 0x40, 0x09, 0x08, 0x0c, + 0xd5, 0x1f, 0x00, 0x40, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x07, 0x00, 0x00, + 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x33, 0xde, 0xad, 0x60, 0x10, 0x20, 0x58, + 0xb9, 0xa0, 0x00, 0x16, 0x08, 0x0c, 0x33, 0x44, 0x08, 0x0c, 0xb1, 0x6c, + 0x00, 0x1e, 0x08, 0x0c, 0x34, 0x1e, 0x00, 0xde, 0x08, 0x04, 0xbf, 0x05, + 0x00, 0xde, 0x08, 0x0c, 0x58, 0x54, 0x11, 0x70, 0x60, 0x14, 0x90, 0x05, + 0x11, 0x58, 0x00, 0x36, 0x00, 0x46, 0x60, 0x10, 0x20, 0x58, 0xbb, 0xa0, + 0x20, 0x21, 0x00, 0x06, 0x08, 0x0c, 0x4e, 0x58, 0x00, 0x4e, 0x00, 0x3e, + 0x00, 0xd6, 0x60, 0x10, 0x20, 0x58, 0x08, 0x0c, 0x68, 0x4f, 0x08, 0x0c, + 0xbc, 0x88, 0x00, 0xde, 0x08, 0x0c, 0xc1, 0x5b, 0x15, 0x88, 0x60, 0x10, + 0x20, 0x58, 0xb8, 0x90, 0x90, 0x05, 0x05, 0x60, 0x20, 0x01, 0x00, 0x06, + 0x08, 0x0c, 0x66, 0xfa, 0x00, 0x96, 0x60, 0x14, 0x90, 0x4d, 0x01, 0xd0, + 0xa8, 0x64, 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x39, 0x11, 0x40, + 0x20, 0x01, 0x00, 0x00, 0x90, 0x0e, 0x20, 0x11, 0x40, 0x00, 0x08, 0x0c, + 0xd5, 0x1f, 0x00, 0x60, 0xa8, 0x64, 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, + 0x00, 0x29, 0x01, 0x30, 0xa8, 0x07, 0x00, 0x00, 0xa8, 0x67, 0x01, 0x03, + 0xa8, 0x33, 0x02, 0x00, 0x00, 0x9e, 0x08, 0x0c, 0x33, 0x44, 0x60, 0x20, + 0x90, 0x86, 0x00, 0x0a, 0x01, 0x40, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x28, + 0x08, 0x0c, 0xbb, 0x5c, 0x90, 0x06, 0x08, 0x0c, 0xbe, 0x21, 0x00, 0x1e, + 0x00, 0x2e, 0x00, 0xee, 0x00, 0xbe, 0x00, 0x05, 0x20, 0x11, 0x18, 0x24, + 0x22, 0x04, 0x90, 0x86, 0x00, 0x14, 0x11, 0x60, 0x20, 0x01, 0x00, 0x02, + 0x08, 0x0c, 0x66, 0xfa, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x01, + 0x08, 0x0c, 0x96, 0x1e, 0x08, 0x04, 0x9a, 0xb3, 0x20, 0x01, 0x00, 0x01, + 0x08, 0x04, 0xbe, 0x21, 0x20, 0x30, 0x20, 0x11, 0x18, 0x24, 0x22, 0x04, + 0x90, 0x86, 0x00, 0x04, 0x11, 0x48, 0x96, 0xb6, 0x00, 0x0b, 0x11, 0x20, + 0x20, 0x01, 0x00, 0x07, 0x08, 0x0c, 0x66, 0xfa, 0x08, 0x04, 0xb1, 0x6c, + 0x20, 0x01, 0x00, 0x01, 0x08, 0x04, 0xbe, 0x21, 0x00, 0x02, 0xbc, 0x45, + 0xbf, 0x4c, 0xbc, 0x45, 0xbf, 0x8f, 0xbc, 0x45, 0xc0, 0x3c, 0xbf, 0x41, + 0xbc, 0x48, 0xbc, 0x45, 0xc0, 0x50, 0xbc, 0x45, 0xc0, 0x62, 0x66, 0x04, + 0x96, 0x86, 0x00, 0x03, 0x09, 0x04, 0xbe, 0x51, 0x96, 0xb6, 0x00, 0x1e, + 0x11, 0x10, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xd6, + 0x00, 0xc6, 0x08, 0x0c, 0xc0, 0x74, 0x11, 0xa0, 0x90, 0x06, 0x08, 0x0c, + 0x66, 0xe6, 0x08, 0x0c, 0x33, 0x15, 0x08, 0x0c, 0xd6, 0x5a, 0x20, 0x01, + 0x00, 0x02, 0x08, 0x0c, 0x66, 0xfa, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, + 0x00, 0x02, 0x08, 0x0c, 0x96, 0x1e, 0x08, 0x0c, 0x9a, 0xb3, 0x04, 0x28, + 0x20, 0x09, 0x02, 0x6e, 0x21, 0x04, 0x90, 0x86, 0x00, 0x09, 0x11, 0x60, + 0x60, 0x10, 0x20, 0x58, 0xb8, 0x40, 0x90, 0x84, 0x00, 0xff, 0x90, 0x05, + 0x01, 0x80, 0x80, 0x01, 0xb8, 0x42, 0x60, 0x1b, 0x00, 0x0a, 0x00, 0x98, + 0x20, 0x09, 0x02, 0x6f, 0x21, 0x04, 0x90, 0x84, 0xff, 0x00, 0x90, 0x8e, + 0x19, 0x00, 0x01, 0x58, 0x90, 0x8e, 0x1e, 0x00, 0x09, 0x90, 0x08, 0x0c, + 0x33, 0x15, 0x08, 0x0c, 0xd6, 0x5a, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, + 0xbe, 0x21, 0x00, 0xce, 0x00, 0xde, 0x00, 0xbe, 0x00, 0x05, 0x00, 0x96, + 0x00, 0xb6, 0x00, 0x26, 0x90, 0x16, 0x08, 0x0c, 0xc0, 0x82, 0x00, 0xd6, + 0x20, 0x69, 0x19, 0x7c, 0x2d, 0x04, 0x90, 0x05, 0x01, 0x68, 0x60, 0x10, + 0x20, 0x58, 0xb8, 0xa0, 0x90, 0x86, 0x00, 0x7e, 0x11, 0x38, 0x20, 0x69, + 0x18, 0x20, 0x2d, 0x04, 0x80, 0x00, 0x20, 0x6a, 0x00, 0xde, 0x00, 0x10, + 0x00, 0xde, 0x00, 0x88, 0x90, 0x06, 0x08, 0x0c, 0x66, 0xe6, 0x20, 0x01, + 0x00, 0x02, 0x08, 0x0c, 0x66, 0xfa, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, + 0x00, 0x02, 0x08, 0x0c, 0x96, 0x1e, 0x08, 0x0c, 0x9a, 0xb3, 0x08, 0x04, + 0xc0, 0x0c, 0x08, 0x0c, 0xcf, 0x1b, 0x01, 0xb0, 0x60, 0x14, 0x20, 0x48, + 0xa8, 0x64, 0x20, 0x10, 0x90, 0x86, 0x01, 0x39, 0x11, 0x38, 0x60, 0x07, + 0x00, 0x16, 0x20, 0x01, 0x00, 0x02, 0x08, 0x0c, 0xd5, 0x7c, 0x00, 0xb0, + 0x60, 0x14, 0x20, 0x48, 0xa8, 0x64, 0xd0, 0xfc, 0x01, 0x18, 0x20, 0x01, + 0x00, 0x01, 0x0c, 0xa8, 0x20, 0x01, 0x18, 0x0e, 0x20, 0x04, 0xd0, 0xdc, + 0x01, 0x48, 0x60, 0x10, 0x20, 0x58, 0xb8, 0x40, 0x90, 0x84, 0x00, 0xff, + 0x90, 0x05, 0x11, 0x10, 0x90, 0x06, 0x0c, 0x38, 0x08, 0x0c, 0xbb, 0x5c, + 0x20, 0x09, 0x02, 0x6e, 0x21, 0x34, 0x96, 0xb4, 0x00, 0xff, 0x96, 0x86, + 0x00, 0x05, 0x05, 0x20, 0x96, 0x86, 0x00, 0x0b, 0x01, 0xc8, 0x20, 0x09, + 0x02, 0x6f, 0x21, 0x04, 0x90, 0x84, 0xff, 0x00, 0x11, 0x18, 0x96, 0x86, + 0x00, 0x09, 0x01, 0xc0, 0x90, 0x86, 0x19, 0x00, 0x11, 0x68, 0x96, 0x86, + 0x00, 0x09, 0x01, 0x90, 0x20, 0x01, 0x00, 0x04, 0x08, 0x0c, 0x66, 0xfa, + 0x20, 0x01, 0x00, 0x28, 0x60, 0x1a, 0x60, 0x07, 0x00, 0x52, 0x00, 0x20, + 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0xbe, 0x21, 0x00, 0x2e, 0x00, 0xbe, + 0x00, 0x9e, 0x00, 0x05, 0x92, 0x86, 0x01, 0x39, 0x01, 0x60, 0x60, 0x14, + 0x20, 0x48, 0x08, 0x0c, 0xcf, 0x1b, 0x01, 0x40, 0xa8, 0x64, 0x90, 0x86, + 0x01, 0x39, 0x01, 0x18, 0xa8, 0x68, 0xd0, 0xfc, 0x01, 0x08, 0x0c, 0x40, + 0x60, 0x10, 0x20, 0x58, 0xb8, 0x40, 0x90, 0x84, 0x00, 0xff, 0x90, 0x05, + 0x01, 0x38, 0x80, 0x01, 0xb8, 0x42, 0x60, 0x1b, 0x00, 0x0a, 0x60, 0x07, + 0x00, 0x16, 0x08, 0xf0, 0xb8, 0xa0, 0x90, 0x86, 0x00, 0x7e, 0x11, 0x38, + 0x00, 0xe6, 0x20, 0x71, 0x18, 0x00, 0x08, 0x0c, 0x61, 0x30, 0x00, 0xee, + 0x00, 0x10, 0x08, 0x0c, 0x33, 0x15, 0x08, 0x60, 0x20, 0x01, 0x00, 0x04, + 0x08, 0x0c, 0x66, 0xfa, 0x08, 0x0c, 0xc0, 0x82, 0x11, 0x40, 0x60, 0x03, + 0x00, 0x01, 0x60, 0x07, 0x00, 0x03, 0x08, 0x0c, 0x96, 0x1e, 0x08, 0x04, + 0x9a, 0xb3, 0x08, 0x0c, 0xbb, 0x5c, 0x90, 0x06, 0x08, 0x04, 0xbe, 0x21, + 0x04, 0x89, 0x11, 0x60, 0x20, 0x01, 0x00, 0x08, 0x08, 0x0c, 0x66, 0xfa, + 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x05, 0x08, 0x0c, 0x96, 0x1e, + 0x08, 0x04, 0x9a, 0xb3, 0x20, 0x01, 0x00, 0x01, 0x08, 0x04, 0xbe, 0x21, + 0x00, 0xf9, 0x11, 0x60, 0x20, 0x01, 0x00, 0x0a, 0x08, 0x0c, 0x66, 0xfa, + 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x01, 0x08, 0x0c, 0x96, 0x1e, + 0x08, 0x04, 0x9a, 0xb3, 0x20, 0x01, 0x00, 0x01, 0x08, 0x04, 0xbe, 0x21, + 0x20, 0x09, 0x02, 0x6e, 0x21, 0x04, 0x90, 0x86, 0x00, 0x03, 0x11, 0x38, + 0x20, 0x09, 0x02, 0x6f, 0x21, 0x04, 0x90, 0x84, 0xff, 0x00, 0x90, 0x86, + 0x2a, 0x00, 0x00, 0x05, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x00, 0xb6, + 0x00, 0xc6, 0x00, 0x16, 0x61, 0x10, 0x21, 0x58, 0x08, 0x0c, 0x67, 0xc3, + 0x00, 0x1e, 0x00, 0xce, 0x00, 0xbe, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xf6, + 0x00, 0xe6, 0x00, 0xd6, 0x00, 0x36, 0x00, 0x16, 0x60, 0x10, 0x20, 0x58, + 0x20, 0x09, 0x18, 0x37, 0x21, 0x04, 0x90, 0x85, 0x00, 0x03, 0x20, 0x0a, + 0x08, 0x0c, 0xc1, 0x2d, 0x05, 0x60, 0x20, 0x09, 0x18, 0x37, 0x21, 0x04, + 0xc0, 0xcd, 0x20, 0x0a, 0x08, 0x0c, 0x6c, 0x0d, 0x01, 0x58, 0x90, 0x06, + 0x20, 0x20, 0x20, 0x09, 0x00, 0x2a, 0x08, 0x0c, 0xea, 0x8d, 0x20, 0x01, + 0x18, 0x0c, 0x20, 0x0c, 0xc1, 0x95, 0x21, 0x02, 0x20, 0x19, 0x00, 0x2a, + 0x20, 0x09, 0x00, 0x01, 0x08, 0x0c, 0x32, 0xda, 0x00, 0xe6, 0x20, 0x71, + 0x18, 0x00, 0x08, 0x0c, 0x30, 0xbf, 0x00, 0xee, 0x00, 0xc6, 0x01, 0x56, + 0x20, 0xa9, 0x07, 0x81, 0x20, 0x09, 0x00, 0x7f, 0x08, 0x0c, 0x34, 0x1e, + 0x81, 0x08, 0x1f, 0x04, 0xc0, 0xc6, 0x01, 0x5e, 0x00, 0xce, 0x08, 0x0c, + 0xc0, 0x85, 0x20, 0x71, 0x02, 0x60, 0x20, 0x79, 0x02, 0x00, 0x78, 0x17, + 0x00, 0x01, 0x20, 0x01, 0x18, 0x37, 0x20, 0x0c, 0xc1, 0xc5, 0x70, 0x18, + 0xd0, 0xfc, 0x01, 0x10, 0xd0, 0xdc, 0x01, 0x18, 0x70, 0x38, 0xd0, 0xdc, + 0x11, 0x08, 0xc1, 0xc4, 0x78, 0x17, 0x00, 0x00, 0x20, 0x01, 0x18, 0x37, + 0x21, 0x02, 0x91, 0x84, 0x00, 0x50, 0x90, 0x86, 0x00, 0x50, 0x05, 0xd0, + 0x20, 0x79, 0x01, 0x00, 0x2e, 0x04, 0x90, 0x84, 0x00, 0xff, 0x20, 0x69, + 0x18, 0x1f, 0x20, 0x6a, 0x78, 0xe6, 0x00, 0x06, 0x8e, 0x70, 0x2e, 0x04, + 0x20, 0x69, 0x18, 0x20, 0x20, 0x6a, 0x78, 0xea, 0x78, 0x32, 0x78, 0x36, + 0x20, 0x10, 0x90, 0x84, 0xff, 0x00, 0x00, 0x1e, 0x91, 0x05, 0x20, 0x09, + 0x18, 0x2c, 0x20, 0x0a, 0x22, 0x00, 0x90, 0x84, 0x00, 0xff, 0x20, 0x08, + 0x08, 0x0c, 0x26, 0xd5, 0x08, 0x0c, 0x77, 0x9e, 0x01, 0x70, 0x20, 0x71, + 0x02, 0x60, 0x20, 0x69, 0x19, 0x82, 0x70, 0x48, 0x20, 0x6a, 0x70, 0x4c, + 0x68, 0x06, 0x70, 0x50, 0x68, 0x0a, 0x70, 0x54, 0x68, 0x0e, 0x08, 0x0c, + 0xd3, 0x48, 0x00, 0x40, 0x20, 0x01, 0x00, 0x06, 0x08, 0x0c, 0x66, 0xfa, + 0x08, 0x0c, 0x33, 0x44, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x1e, 0x00, 0x3e, + 0x00, 0xde, 0x00, 0xee, 0x00, 0xfe, 0x00, 0xbe, 0x00, 0x05, 0x00, 0x96, + 0x00, 0x26, 0x00, 0x36, 0x00, 0xe6, 0x01, 0x56, 0x20, 0x19, 0x18, 0x2c, + 0x23, 0x1c, 0x83, 0xff, 0x01, 0xf0, 0x20, 0x71, 0x02, 0x60, 0x72, 0x00, + 0x92, 0x94, 0x00, 0xff, 0x70, 0x04, 0x90, 0x84, 0xff, 0x00, 0x92, 0x05, + 0x93, 0x06, 0x11, 0x98, 0x20, 0x11, 0x02, 0x76, 0x20, 0xa9, 0x00, 0x04, + 0x2b, 0x48, 0x20, 0x19, 0x00, 0x0a, 0x08, 0x0c, 0xc2, 0x22, 0x11, 0x48, + 0x20, 0x11, 0x02, 0x7a, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x19, 0x00, 0x06, + 0x08, 0x0c, 0xc2, 0x22, 0x11, 0x00, 0x01, 0x5e, 0x00, 0xee, 0x00, 0x3e, + 0x00, 0x2e, 0x00, 0x9e, 0x00, 0x05, 0x00, 0xe6, 0x20, 0x71, 0x02, 0x60, + 0x70, 0x34, 0x90, 0x86, 0x00, 0x14, 0x11, 0xa8, 0x70, 0x38, 0x90, 0x86, + 0x08, 0x00, 0x11, 0x88, 0x70, 0x3c, 0xd0, 0xec, 0x01, 0x60, 0x90, 0x84, + 0x0f, 0x00, 0x90, 0x86, 0x01, 0x00, 0x11, 0x38, 0x70, 0x54, 0xd0, 0xa4, + 0x11, 0x10, 0xd0, 0xac, 0x01, 0x10, 0x90, 0x06, 0x00, 0x10, 0x90, 0x85, + 0x00, 0x01, 0x00, 0xee, 0x00, 0x05, 0x00, 0xe6, 0x00, 0x96, 0x00, 0xc6, + 0x00, 0x76, 0x00, 0x56, 0x00, 0x46, 0x00, 0x26, 0x00, 0x06, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x20, 0x29, 0x19, 0xf4, 0x25, 0x2c, 0x20, 0x21, + 0x19, 0xfb, 0x24, 0x24, 0x20, 0x61, 0x1d, 0xdc, 0x20, 0x71, 0x18, 0x00, + 0x72, 0x54, 0x70, 0x74, 0x92, 0x02, 0x1a, 0x04, 0xc1, 0xee, 0x08, 0x0c, + 0x8e, 0xee, 0x09, 0x04, 0xc1, 0xe7, 0x08, 0x0c, 0xea, 0xbe, 0x09, 0x04, + 0xc1, 0xe7, 0x67, 0x20, 0x97, 0x86, 0x00, 0x07, 0x09, 0x04, 0xc1, 0xe7, + 0x25, 0x00, 0x9c, 0x06, 0x09, 0x04, 0xc1, 0xe7, 0x24, 0x00, 0x9c, 0x06, + 0x09, 0x04, 0xc1, 0xe7, 0x3e, 0x08, 0x91, 0x86, 0x00, 0x02, 0x11, 0x48, + 0x60, 0x10, 0x90, 0x05, 0x01, 0x30, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x00, + 0x00, 0xbe, 0xd0, 0xbc, 0x15, 0x90, 0x00, 0xc6, 0x60, 0x43, 0xff, 0xff, + 0x60, 0x00, 0x90, 0x86, 0x00, 0x04, 0x11, 0x10, 0x08, 0x0c, 0x1a, 0xd3, + 0x97, 0x86, 0x00, 0x0a, 0x01, 0x48, 0x08, 0x0c, 0xd1, 0x32, 0x11, 0x30, + 0x00, 0xce, 0x08, 0x0c, 0xbb, 0x5c, 0x08, 0x0c, 0xb1, 0xa7, 0x00, 0xe8, + 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0xcf, 0x1b, 0x01, 0xa8, 0x97, 0x86, + 0x00, 0x03, 0x15, 0x30, 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x7c, 0xd0, 0xcc, + 0x01, 0x30, 0x00, 0x96, 0xa8, 0x78, 0x20, 0x48, 0x08, 0x0c, 0x10, 0x0b, + 0x00, 0x9e, 0xab, 0x7a, 0xa8, 0x77, 0x00, 0x00, 0x08, 0x0c, 0x70, 0x06, + 0x08, 0x0c, 0xd1, 0x0c, 0x08, 0x0c, 0xb1, 0xa7, 0x00, 0xce, 0x9c, 0xe0, + 0x00, 0x1c, 0x70, 0x68, 0x9c, 0x02, 0x12, 0x10, 0x08, 0x04, 0xc1, 0x8e, + 0x01, 0x2e, 0x00, 0x0e, 0x00, 0x2e, 0x00, 0x4e, 0x00, 0x5e, 0x00, 0x7e, + 0x00, 0xce, 0x00, 0x9e, 0x00, 0xee, 0x00, 0x05, 0x97, 0x86, 0x00, 0x06, + 0x11, 0x18, 0x08, 0x0c, 0xea, 0x30, 0x0c, 0x30, 0x97, 0x86, 0x00, 0x09, + 0x11, 0x48, 0x60, 0x00, 0x90, 0x86, 0x00, 0x04, 0x0d, 0x08, 0x20, 0x09, + 0x00, 0x4c, 0x08, 0x0c, 0xb2, 0x0a, 0x08, 0xe0, 0x97, 0x86, 0x00, 0x0a, + 0x09, 0x80, 0x08, 0x20, 0x22, 0x0c, 0x23, 0x04, 0x91, 0x06, 0x11, 0x30, + 0x82, 0x10, 0x83, 0x18, 0x1f, 0x04, 0xc2, 0x0e, 0x90, 0x06, 0x00, 0x05, + 0x23, 0x04, 0x91, 0x02, 0x02, 0x18, 0x20, 0x01, 0x00, 0x01, 0x00, 0x08, + 0x90, 0x06, 0x91, 0x8d, 0x00, 0x01, 0x00, 0x05, 0x01, 0x36, 0x01, 0xc6, + 0x00, 0x16, 0x89, 0x06, 0x80, 0x06, 0x80, 0x07, 0x90, 0x8c, 0x00, 0x3f, + 0x21, 0xe0, 0x90, 0x84, 0xff, 0xc0, 0x93, 0x00, 0x20, 0x98, 0x35, 0x18, + 0x20, 0xa9, 0x00, 0x01, 0x22, 0x0c, 0x40, 0x02, 0x91, 0x0e, 0x11, 0x40, + 0x82, 0x10, 0x83, 0x19, 0x1d, 0xc8, 0x90, 0x06, 0x00, 0x1e, 0x01, 0xce, + 0x01, 0x3e, 0x00, 0x05, 0x22, 0x0c, 0x91, 0x02, 0x02, 0x18, 0x20, 0x01, + 0x00, 0x01, 0x00, 0x10, 0x20, 0x01, 0x00, 0x00, 0x91, 0x8d, 0x00, 0x01, + 0x00, 0x1e, 0x01, 0xce, 0x01, 0x3e, 0x00, 0x05, 0x22, 0x0c, 0x81, 0x0f, + 0x23, 0x04, 0x91, 0x06, 0x11, 0x30, 0x82, 0x10, 0x83, 0x18, 0x1f, 0x04, + 0xc2, 0x4c, 0x90, 0x06, 0x00, 0x05, 0x91, 0x8d, 0x00, 0x01, 0x00, 0x05, + 0x60, 0x04, 0x90, 0x8a, 0x00, 0x53, 0x1a, 0x0c, 0x0d, 0x85, 0x08, 0x0c, + 0xd1, 0x21, 0x01, 0x20, 0x08, 0x0c, 0xd1, 0x32, 0x01, 0x58, 0x00, 0x28, + 0x08, 0x0c, 0x33, 0x44, 0x08, 0x0c, 0xd1, 0x32, 0x01, 0x28, 0x08, 0x0c, + 0x99, 0xed, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x05, 0x08, 0x0c, 0xbb, 0x5c, + 0x0c, 0xc0, 0x91, 0x82, 0x00, 0x57, 0x12, 0x20, 0x91, 0x82, 0x00, 0x40, + 0x02, 0x08, 0x00, 0x0a, 0x00, 0x05, 0xc2, 0x92, 0xc2, 0x92, 0xc2, 0x92, + 0xc2, 0x92, 0xc2, 0x92, 0xc2, 0x92, 0xc2, 0x92, 0xc2, 0x92, 0xc2, 0x92, + 0xc2, 0x92, 0xc2, 0x92, 0xc2, 0x94, 0xc2, 0x94, 0xc2, 0x94, 0xc2, 0x94, + 0xc2, 0x92, 0xc2, 0x92, 0xc2, 0x92, 0xc2, 0x94, 0xc2, 0x92, 0xc2, 0x92, + 0xc2, 0x92, 0xc2, 0x92, 0x08, 0x0c, 0x0d, 0x85, 0x60, 0x0b, 0xff, 0xff, + 0x60, 0x03, 0x00, 0x0f, 0x61, 0x06, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x08, 0x0c, 0xd6, 0x5d, 0x20, 0x09, 0x80, 0x00, 0x08, 0x0c, 0x96, 0x17, + 0x01, 0x2e, 0x00, 0x05, 0x91, 0x86, 0x00, 0x13, 0x11, 0x28, 0x60, 0x04, + 0x90, 0x82, 0x00, 0x40, 0x08, 0x04, 0xc3, 0x1c, 0x91, 0x86, 0x00, 0x27, + 0x15, 0x20, 0x08, 0x0c, 0x99, 0xed, 0x08, 0x0c, 0x33, 0x15, 0x08, 0x0c, + 0xd6, 0x5a, 0x00, 0x96, 0x61, 0x14, 0x21, 0x48, 0x08, 0x0c, 0xcf, 0x1b, + 0x01, 0x98, 0x08, 0x0c, 0xd1, 0x32, 0x11, 0x18, 0x08, 0x0c, 0xbb, 0x5c, + 0x00, 0x68, 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x7b, 0x00, 0x29, 0xa8, 0x77, + 0x00, 0x00, 0xa9, 0x7c, 0xc1, 0xc5, 0xa9, 0x7e, 0x08, 0x0c, 0x70, 0x12, + 0x08, 0x0c, 0xd1, 0x0c, 0x00, 0x9e, 0x08, 0x0c, 0xb1, 0x6c, 0x08, 0x04, + 0x9a, 0xb3, 0x91, 0x86, 0x00, 0x14, 0x11, 0x20, 0x60, 0x04, 0x90, 0x82, + 0x00, 0x40, 0x00, 0x30, 0x91, 0x86, 0x00, 0x53, 0x01, 0x10, 0x08, 0x0c, + 0x0d, 0x85, 0x00, 0x05, 0x00, 0x02, 0xc2, 0xfa, 0xc2, 0xf8, 0xc2, 0xf8, + 0xc2, 0xf8, 0xc2, 0xf8, 0xc2, 0xf8, 0xc2, 0xf8, 0xc2, 0xf8, 0xc2, 0xf8, + 0xc2, 0xf8, 0xc2, 0xf8, 0xc3, 0x13, 0xc3, 0x13, 0xc3, 0x13, 0xc3, 0x13, + 0xc2, 0xf8, 0xc3, 0x13, 0xc2, 0xf8, 0xc3, 0x13, 0xc2, 0xf8, 0xc2, 0xf8, + 0xc2, 0xf8, 0xc2, 0xf8, 0x08, 0x0c, 0x0d, 0x85, 0x08, 0x0c, 0x99, 0xed, + 0x00, 0x96, 0x61, 0x14, 0x21, 0x48, 0x08, 0x0c, 0xcf, 0x1b, 0x01, 0x68, + 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x7b, 0x00, 0x06, 0xa8, 0x77, 0x00, 0x00, + 0xa8, 0x80, 0xc0, 0xec, 0xa8, 0x82, 0x08, 0x0c, 0x70, 0x12, 0x08, 0x0c, + 0xd1, 0x0c, 0x00, 0x9e, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x05, 0x08, 0x0c, + 0x99, 0xed, 0x08, 0x0c, 0xd1, 0x32, 0x09, 0x0c, 0xbb, 0x5c, 0x08, 0x0c, + 0xb1, 0x6c, 0x00, 0x05, 0x00, 0x02, 0xc3, 0x36, 0xc3, 0x34, 0xc3, 0x34, + 0xc3, 0x34, 0xc3, 0x34, 0xc3, 0x34, 0xc3, 0x34, 0xc3, 0x34, 0xc3, 0x34, + 0xc3, 0x34, 0xc3, 0x34, 0xc3, 0x38, 0xc3, 0x38, 0xc3, 0x38, 0xc3, 0x38, + 0xc3, 0x34, 0xc3, 0x3a, 0xc3, 0x34, 0xc3, 0x38, 0xc3, 0x34, 0xc3, 0x34, + 0xc3, 0x34, 0xc3, 0x34, 0x08, 0x0c, 0x0d, 0x85, 0x08, 0x0c, 0x0d, 0x85, + 0x08, 0x0c, 0x0d, 0x85, 0x08, 0x0c, 0xb1, 0x6c, 0x08, 0x04, 0x9a, 0xb3, + 0x91, 0x82, 0x00, 0x57, 0x12, 0x20, 0x91, 0x82, 0x00, 0x40, 0x02, 0x08, + 0x00, 0x0a, 0x00, 0x05, 0xc3, 0x5d, 0xc3, 0x5d, 0xc3, 0x5d, 0xc3, 0x5d, + 0xc3, 0x5d, 0xc3, 0x96, 0xc4, 0x88, 0xc3, 0x5d, 0xc4, 0x94, 0xc3, 0x5d, + 0xc3, 0x5d, 0xc3, 0x5d, 0xc3, 0x5d, 0xc3, 0x5d, 0xc3, 0x5d, 0xc3, 0x5d, + 0xc3, 0x5d, 0xc3, 0x5d, 0xc3, 0x5d, 0xc4, 0x94, 0xc3, 0x5f, 0xc3, 0x5d, + 0xc4, 0x92, 0x08, 0x0c, 0x0d, 0x85, 0x00, 0xb6, 0x00, 0x96, 0x61, 0x14, + 0x21, 0x48, 0x60, 0x10, 0x20, 0x58, 0xb8, 0x00, 0xd0, 0xbc, 0x15, 0x08, + 0xa8, 0x7b, 0x00, 0x00, 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x77, 0x00, 0x00, + 0xa8, 0x7c, 0xd0, 0xac, 0x01, 0x28, 0xa8, 0x34, 0xa9, 0x38, 0x91, 0x15, + 0x19, 0x0c, 0xc5, 0x19, 0x08, 0x0c, 0x6e, 0x27, 0x62, 0x10, 0x22, 0x58, + 0xba, 0x3c, 0x82, 0xff, 0x01, 0x10, 0x82, 0x11, 0xba, 0x3e, 0xb8, 0xd0, + 0x90, 0x05, 0x01, 0x10, 0x08, 0x0c, 0x68, 0xdf, 0x08, 0x0c, 0xb1, 0x6c, + 0x00, 0x9e, 0x00, 0xbe, 0x00, 0x05, 0xa8, 0x7c, 0xd0, 0xac, 0x09, 0xe0, + 0xa8, 0x38, 0xa9, 0x34, 0x91, 0x05, 0x09, 0xc0, 0xa8, 0x80, 0xd0, 0xbc, + 0x19, 0xa8, 0x08, 0x0c, 0xd2, 0x67, 0x0c, 0x80, 0x00, 0xb6, 0x00, 0x96, + 0x61, 0x14, 0x21, 0x48, 0x60, 0x1c, 0xd0, 0xfc, 0x11, 0x10, 0x76, 0x44, + 0x00, 0x08, 0x90, 0x36, 0x96, 0xb4, 0x0f, 0xff, 0x86, 0xff, 0x15, 0x90, + 0x60, 0x10, 0x20, 0x58, 0xb8, 0x00, 0xd0, 0xbc, 0x19, 0x04, 0xc4, 0x77, + 0xa8, 0x7b, 0x00, 0x00, 0xa8, 0x67, 0x01, 0x03, 0xae, 0x76, 0xa8, 0x7c, + 0xd0, 0xac, 0x01, 0x28, 0xa8, 0x34, 0xa9, 0x38, 0x91, 0x15, 0x19, 0x0c, + 0xc5, 0x19, 0x08, 0x0c, 0x6e, 0x27, 0x62, 0x10, 0x22, 0x58, 0xba, 0x3c, + 0x82, 0xff, 0x01, 0x10, 0x82, 0x11, 0xba, 0x3e, 0xb8, 0xd0, 0x90, 0x05, + 0x01, 0x10, 0x08, 0x0c, 0x68, 0xdf, 0x60, 0x1c, 0xd0, 0xfc, 0x11, 0x48, + 0x70, 0x44, 0xd0, 0xe4, 0x19, 0x04, 0xc4, 0x58, 0x08, 0x0c, 0xb1, 0x6c, + 0x00, 0x9e, 0x00, 0xbe, 0x00, 0x05, 0x20, 0x09, 0x02, 0x11, 0x21, 0x0c, + 0x08, 0x0c, 0x0d, 0x85, 0x96, 0x8c, 0x0c, 0x00, 0x01, 0x50, 0x60, 0x10, + 0x20, 0x58, 0xb8, 0x00, 0xd0, 0xbc, 0x19, 0x04, 0xc4, 0x5c, 0x73, 0x48, + 0xab, 0x92, 0x73, 0x4c, 0xab, 0x8e, 0x96, 0x8c, 0x00, 0xff, 0x91, 0x86, + 0x00, 0x02, 0x05, 0x08, 0x91, 0x86, 0x00, 0x28, 0x11, 0x18, 0xa8, 0x7b, + 0x00, 0x1c, 0x00, 0xe8, 0xd6, 0xdc, 0x01, 0xa0, 0xa8, 0x7b, 0x00, 0x15, + 0xa8, 0x7c, 0xd0, 0xac, 0x01, 0x70, 0xa9, 0x38, 0xaa, 0x34, 0x21, 0x00, + 0x92, 0x05, 0x01, 0x48, 0x70, 0x48, 0x91, 0x06, 0x11, 0x18, 0x70, 0x4c, + 0x92, 0x06, 0x01, 0x18, 0xa9, 0x92, 0xaa, 0x8e, 0xc6, 0xdc, 0x00, 0x38, + 0xd6, 0xd4, 0x01, 0x18, 0xa8, 0x7b, 0x00, 0x07, 0x00, 0x10, 0xa8, 0x7b, + 0x00, 0x00, 0xa8, 0x67, 0x01, 0x03, 0xae, 0x76, 0x90, 0x1e, 0xd6, 0xc4, + 0x01, 0xd8, 0x96, 0x86, 0x01, 0x00, 0x11, 0x30, 0x70, 0x64, 0x90, 0x05, + 0x11, 0x18, 0xc6, 0xc4, 0x08, 0x04, 0xc3, 0xa2, 0x73, 0x5c, 0xab, 0x86, + 0x83, 0xff, 0x01, 0x70, 0x93, 0x8a, 0x00, 0x09, 0x02, 0x10, 0x20, 0x19, + 0x00, 0x08, 0x00, 0x36, 0x23, 0x08, 0x20, 0x19, 0x00, 0x18, 0x20, 0x11, + 0x00, 0x25, 0x08, 0x0c, 0xca, 0x7b, 0x00, 0x3e, 0xd6, 0xcc, 0x09, 0x04, + 0xc3, 0xb7, 0x71, 0x54, 0xa9, 0x8a, 0x81, 0xff, 0x09, 0x04, 0xc3, 0xb7, + 0x91, 0x92, 0x00, 0x21, 0x12, 0x78, 0x83, 0x04, 0x90, 0x98, 0x00, 0x18, + 0x20, 0x11, 0x00, 0x29, 0x08, 0x0c, 0xca, 0x7b, 0x20, 0x11, 0x02, 0x05, + 0x20, 0x13, 0x00, 0x00, 0x08, 0x0c, 0xd5, 0xe8, 0x08, 0x04, 0xc3, 0xb7, + 0xa8, 0x68, 0xd0, 0xfc, 0x01, 0x20, 0x20, 0x09, 0x00, 0x20, 0xa9, 0x8a, + 0x0c, 0x50, 0x00, 0xa6, 0x29, 0x50, 0x08, 0x0c, 0xca, 0x1a, 0x00, 0xae, + 0x08, 0x0c, 0xd5, 0xe8, 0x08, 0x0c, 0xca, 0x6b, 0x08, 0x04, 0xc3, 0xb9, + 0x08, 0x0c, 0xd2, 0x2a, 0x08, 0x04, 0xc3, 0xce, 0xa8, 0x7c, 0xd0, 0xac, + 0x09, 0x04, 0xc3, 0xdf, 0xa8, 0x80, 0xd0, 0xbc, 0x19, 0x04, 0xc3, 0xdf, + 0x96, 0x84, 0x04, 0x00, 0x01, 0x30, 0xa8, 0x38, 0xab, 0x34, 0x93, 0x05, + 0x09, 0x04, 0xc3, 0xdf, 0x00, 0xb8, 0x73, 0x48, 0xa8, 0x38, 0x93, 0x06, + 0x11, 0x98, 0x73, 0x4c, 0xa8, 0x34, 0x93, 0x1e, 0x09, 0x04, 0xc3, 0xdf, + 0x00, 0x68, 0xa8, 0x7c, 0xd0, 0xac, 0x09, 0x04, 0xc3, 0xaa, 0xa8, 0x38, + 0xa9, 0x34, 0x91, 0x05, 0x09, 0x04, 0xc3, 0xaa, 0xa8, 0x80, 0xd0, 0xbc, + 0x19, 0x04, 0xc3, 0xaa, 0x08, 0x0c, 0xd2, 0x67, 0x08, 0x04, 0xc3, 0xce, + 0x00, 0xf6, 0x20, 0x79, 0x02, 0x6c, 0x7c, 0x04, 0x7b, 0x00, 0x7e, 0x0c, + 0x7d, 0x08, 0x00, 0xfe, 0x00, 0x21, 0x00, 0x05, 0x00, 0x11, 0x00, 0x05, + 0x00, 0x05, 0x00, 0x96, 0x60, 0x03, 0x00, 0x02, 0x60, 0x07, 0x00, 0x43, + 0x60, 0x14, 0x20, 0x48, 0xa8, 0x7c, 0xd0, 0xac, 0x01, 0x28, 0x00, 0x9e, + 0x00, 0x05, 0x21, 0x30, 0x22, 0x28, 0x00, 0x58, 0x24, 0x00, 0xa9, 0xac, + 0x91, 0x0a, 0x23, 0x00, 0xaa, 0xb0, 0x92, 0x13, 0x26, 0x00, 0x91, 0x02, + 0x25, 0x00, 0x92, 0x03, 0x0e, 0x90, 0xac, 0x46, 0xab, 0x4a, 0xae, 0x36, + 0xad, 0x3a, 0x60, 0x44, 0xd0, 0xfc, 0x19, 0x0c, 0xad, 0x25, 0x60, 0x4b, + 0x00, 0x00, 0x08, 0x0c, 0x1c, 0x9c, 0x11, 0x18, 0x61, 0x44, 0x08, 0x0c, + 0x96, 0x43, 0x00, 0x9e, 0x00, 0x05, 0x91, 0x82, 0x00, 0x57, 0x12, 0x20, + 0x91, 0x82, 0x00, 0x40, 0x02, 0x08, 0x00, 0x0a, 0x00, 0x05, 0xc4, 0xe0, + 0xc4, 0xe0, 0xc4, 0xe0, 0xc4, 0xe0, 0xc4, 0xe0, 0xc4, 0xe0, 0xc4, 0xe0, + 0xc4, 0xe0, 0xc4, 0xe0, 0xc4, 0xe0, 0xc4, 0xe2, 0xc4, 0xe0, 0xc4, 0xe0, + 0xc4, 0xe0, 0xc4, 0xe0, 0xc4, 0xf3, 0xc4, 0xe0, 0xc4, 0xe0, 0xc4, 0xe0, + 0xc4, 0xe0, 0xc5, 0x17, 0xc4, 0xe0, 0xc4, 0xe0, 0x08, 0x0c, 0x0d, 0x85, + 0x60, 0x04, 0x90, 0x86, 0x00, 0x40, 0x11, 0x10, 0x08, 0x0c, 0x99, 0xed, + 0x20, 0x19, 0x00, 0x01, 0x08, 0x0c, 0xa5, 0x96, 0x60, 0x03, 0x00, 0x02, + 0x08, 0x0c, 0xd6, 0x62, 0x08, 0x0c, 0x9a, 0x48, 0x00, 0x05, 0x60, 0x04, + 0x90, 0x86, 0x00, 0x40, 0x11, 0x10, 0x08, 0x0c, 0x99, 0xed, 0x20, 0x19, + 0x00, 0x01, 0x08, 0x0c, 0xa5, 0x96, 0x08, 0x0c, 0x9a, 0x48, 0x08, 0x0c, + 0x33, 0x15, 0x08, 0x0c, 0xd6, 0x5a, 0x00, 0x96, 0x61, 0x14, 0x21, 0x48, + 0x08, 0x0c, 0xcf, 0x1b, 0x01, 0x50, 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x7b, + 0x00, 0x29, 0xa8, 0x77, 0x00, 0x00, 0x08, 0x0c, 0x70, 0x12, 0x08, 0x0c, + 0xd1, 0x0c, 0x00, 0x9e, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x05, 0x08, 0x0c, + 0x0d, 0x85, 0xa8, 0x7b, 0x00, 0x15, 0xd1, 0xfc, 0x01, 0x80, 0xa8, 0x7b, + 0x00, 0x07, 0x80, 0x02, 0x80, 0x00, 0x81, 0x0a, 0x91, 0x89, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x16, 0x20, 0x09, 0x1a, 0x7c, 0x21, 0x04, 0x80, 0x00, + 0x20, 0x0a, 0x00, 0x1e, 0x00, 0x0e, 0xa9, 0x92, 0xa8, 0x8e, 0x00, 0x05, + 0x91, 0x82, 0x00, 0x57, 0x12, 0x20, 0x91, 0x82, 0x00, 0x40, 0x02, 0x08, + 0x00, 0x0a, 0x00, 0x05, 0xc5, 0x4f, 0xc5, 0x4f, 0xc5, 0x4f, 0xc5, 0x4f, + 0xc5, 0x4f, 0xc5, 0x51, 0xc5, 0x4f, 0xc5, 0x4f, 0xc6, 0x0e, 0xc5, 0x4f, + 0xc5, 0x4f, 0xc5, 0x4f, 0xc5, 0x4f, 0xc5, 0x4f, 0xc5, 0x4f, 0xc5, 0x4f, + 0xc5, 0x4f, 0xc5, 0x4f, 0xc5, 0x4f, 0xc7, 0x4e, 0xc5, 0x4f, 0xc7, 0x58, + 0xc5, 0x4f, 0x08, 0x0c, 0x0d, 0x85, 0x60, 0x1c, 0xd0, 0xbc, 0x01, 0x78, + 0xd0, 0x84, 0x01, 0x68, 0xd0, 0xf4, 0x01, 0x20, 0xc0, 0x84, 0x60, 0x1e, + 0x08, 0x04, 0xc3, 0x3e, 0x61, 0x14, 0x00, 0x96, 0x21, 0x48, 0xa8, 0x7c, + 0xc0, 0xe5, 0xa8, 0x7e, 0x00, 0x9e, 0x00, 0x76, 0x00, 0xa6, 0x00, 0xe6, + 0x00, 0x96, 0x20, 0x71, 0x02, 0x60, 0x61, 0x14, 0x21, 0x50, 0x60, 0x1c, + 0xd0, 0xfc, 0x11, 0x10, 0x76, 0x44, 0x00, 0x08, 0x90, 0x36, 0xb6, 0x76, + 0x96, 0xb4, 0x0f, 0xff, 0xb7, 0x7c, 0xc7, 0xe5, 0xb7, 0x7e, 0x62, 0x10, + 0x00, 0xb6, 0x22, 0x58, 0xba, 0x3c, 0x82, 0xff, 0x01, 0x10, 0x82, 0x11, + 0xba, 0x3e, 0x00, 0xbe, 0x86, 0xff, 0x09, 0x04, 0xc6, 0x07, 0x96, 0x94, + 0xff, 0x00, 0x92, 0x84, 0x0c, 0x00, 0x01, 0x20, 0x70, 0x48, 0xb0, 0x92, + 0x70, 0x4c, 0xb0, 0x8e, 0x92, 0x84, 0x03, 0x00, 0x09, 0x04, 0xc6, 0x07, + 0x96, 0x86, 0x01, 0x00, 0x11, 0x30, 0x70, 0x64, 0x90, 0x05, 0x11, 0x18, + 0xc6, 0xc4, 0xb6, 0x76, 0x0c, 0x38, 0x08, 0x0c, 0x10, 0x59, 0x09, 0x0c, + 0x0d, 0x85, 0x29, 0x00, 0xb0, 0x7a, 0xb7, 0x7c, 0x97, 0xbd, 0x02, 0x00, + 0xb7, 0x7e, 0xa8, 0x67, 0x01, 0x03, 0xb0, 0x68, 0xa8, 0x6a, 0xb0, 0x6c, + 0xa8, 0x6e, 0xb0, 0x70, 0xa8, 0x72, 0x70, 0x44, 0x90, 0x84, 0xf0, 0x00, + 0x96, 0x35, 0xae, 0x76, 0x96, 0x8c, 0x0c, 0x00, 0x01, 0x20, 0x73, 0x48, + 0xab, 0x92, 0x73, 0x4c, 0xab, 0x8e, 0x96, 0x8c, 0x00, 0xff, 0x91, 0x86, + 0x00, 0x02, 0x01, 0x80, 0x91, 0x86, 0x00, 0x28, 0x11, 0x18, 0xa8, 0x7b, + 0x00, 0x1c, 0x00, 0x60, 0xd6, 0xdc, 0x01, 0x18, 0xa8, 0x7b, 0x00, 0x15, + 0x00, 0x38, 0xd6, 0xd4, 0x01, 0x18, 0xa8, 0x7b, 0x00, 0x07, 0x00, 0x10, + 0xa8, 0x7b, 0x00, 0x00, 0xaf, 0x7e, 0xb0, 0x80, 0xa8, 0x82, 0xb0, 0x84, + 0xa8, 0x86, 0x90, 0x1e, 0xd6, 0xc4, 0x01, 0x90, 0x73, 0x5c, 0xab, 0x86, + 0x83, 0xff, 0x01, 0x70, 0x93, 0x8a, 0x00, 0x09, 0x02, 0x10, 0x20, 0x19, + 0x00, 0x08, 0x00, 0x36, 0x23, 0x08, 0x20, 0x19, 0x00, 0x18, 0x20, 0x11, + 0x00, 0x25, 0x08, 0x0c, 0xca, 0x7b, 0x00, 0x3e, 0xd6, 0xcc, 0x01, 0xe8, + 0x71, 0x54, 0xa9, 0x8a, 0x81, 0xff, 0x01, 0xc8, 0x91, 0x92, 0x00, 0x21, + 0x12, 0x60, 0x83, 0x04, 0x90, 0x98, 0x00, 0x18, 0x20, 0x11, 0x00, 0x29, + 0x08, 0x0c, 0xca, 0x7b, 0x20, 0x11, 0x02, 0x05, 0x20, 0x13, 0x00, 0x00, + 0x00, 0x50, 0xb0, 0x68, 0xd0, 0xfc, 0x01, 0x20, 0x20, 0x09, 0x00, 0x20, + 0xa9, 0x8a, 0x0c, 0x68, 0x29, 0x50, 0x08, 0x0c, 0xca, 0x1a, 0x08, 0x0c, + 0x1a, 0x9f, 0x00, 0x9e, 0x00, 0xee, 0x00, 0xae, 0x00, 0x7e, 0x00, 0x05, + 0x20, 0x01, 0x19, 0x88, 0x20, 0x04, 0x60, 0x4a, 0x00, 0x96, 0x61, 0x14, + 0x21, 0x48, 0xa8, 0x3c, 0xa9, 0x40, 0x91, 0x05, 0x11, 0x18, 0xa8, 0x7c, + 0xc0, 0xdc, 0xa8, 0x7e, 0x60, 0x03, 0x00, 0x02, 0x08, 0x0c, 0xd6, 0x6b, + 0x09, 0x04, 0xc7, 0x49, 0x60, 0x4b, 0x00, 0x00, 0x60, 0x10, 0x00, 0xb6, + 0x20, 0x58, 0xb8, 0x00, 0x00, 0xbe, 0xd0, 0xbc, 0x15, 0x00, 0xd1, 0xcc, + 0x09, 0x04, 0xc7, 0x0d, 0xa9, 0x78, 0xa8, 0x68, 0xd0, 0xfc, 0x09, 0x04, + 0xc6, 0xce, 0x00, 0x16, 0xa8, 0x7c, 0x00, 0x06, 0xa8, 0x80, 0x00, 0x06, + 0x00, 0xa6, 0x21, 0x50, 0xb1, 0x74, 0x91, 0x84, 0x00, 0xff, 0x90, 0xb6, + 0x00, 0x02, 0x09, 0x04, 0xc6, 0x9b, 0x90, 0x86, 0x00, 0x28, 0x19, 0x04, + 0xc6, 0x87, 0xa8, 0x7b, 0x00, 0x1c, 0xb0, 0x7b, 0x00, 0x1c, 0x08, 0x04, + 0xc6, 0xa3, 0x60, 0x24, 0xd0, 0xf4, 0x11, 0xd0, 0xa8, 0x38, 0xaa, 0x34, + 0x92, 0x05, 0x09, 0xc8, 0xa8, 0x38, 0xaa, 0x90, 0x92, 0x06, 0x11, 0x20, + 0xa8, 0x8c, 0xaa, 0x34, 0x92, 0x06, 0x09, 0x88, 0x60, 0x24, 0xd0, 0xd4, + 0x11, 0x48, 0xa9, 0xac, 0xa8, 0x34, 0x91, 0x02, 0x60, 0x3a, 0xa9, 0xb0, + 0xa8, 0x38, 0x91, 0x03, 0x60, 0x3e, 0x60, 0x24, 0xc0, 0xf5, 0x60, 0x26, + 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x3c, 0x80, 0x00, 0xb8, 0x3e, + 0x00, 0xbe, 0x60, 0x1c, 0xc0, 0xfc, 0x60, 0x1e, 0x90, 0x06, 0xa8, 0x76, + 0xa8, 0x92, 0xa8, 0x8e, 0xa8, 0x7c, 0xc0, 0xe4, 0xa8, 0x7e, 0xd0, 0xcc, + 0x01, 0x40, 0xc0, 0xcc, 0xa8, 0x7e, 0x00, 0x96, 0xa8, 0x78, 0x20, 0x48, + 0x08, 0x0c, 0x10, 0x0b, 0x00, 0x9e, 0x08, 0x0c, 0xd2, 0x67, 0x08, 0x04, + 0xc7, 0x49, 0xd1, 0xdc, 0x01, 0x58, 0xa8, 0x7b, 0x00, 0x15, 0xb0, 0x7b, + 0x00, 0x15, 0x08, 0x0c, 0xd5, 0x08, 0x01, 0x18, 0xb1, 0x74, 0xc1, 0xdc, + 0xb1, 0x76, 0x00, 0x78, 0xd1, 0xd4, 0x01, 0x28, 0xa8, 0x7b, 0x00, 0x07, + 0xb0, 0x7b, 0x00, 0x07, 0x00, 0x40, 0xa8, 0x7c, 0xd0, 0xac, 0x01, 0x28, + 0xa8, 0x34, 0xa9, 0x38, 0x91, 0x15, 0x19, 0x0c, 0xc5, 0x19, 0xa8, 0x7c, + 0xb0, 0x7e, 0xa8, 0x90, 0xb0, 0x92, 0xa8, 0x8c, 0xb0, 0x8e, 0xa8, 0x60, + 0x20, 0xe8, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x19, 0x20, 0xa0, 0x20, 0xa9, + 0x00, 0x20, 0x8a, 0x06, 0x80, 0x06, 0x80, 0x07, 0x90, 0x94, 0x00, 0x3f, + 0x22, 0xe0, 0x90, 0x84, 0xff, 0xc0, 0x90, 0x80, 0x00, 0x19, 0x20, 0x98, + 0x40, 0x03, 0x00, 0xae, 0x00, 0x0e, 0xa8, 0x82, 0x00, 0x0e, 0xc0, 0xcc, + 0xa8, 0x7e, 0x08, 0x0c, 0xd5, 0xe8, 0x00, 0x1e, 0xa8, 0x74, 0x00, 0x06, + 0x21, 0x48, 0x08, 0x0c, 0x10, 0x0b, 0x00, 0x1e, 0x08, 0x04, 0xc7, 0x3a, + 0x00, 0x16, 0x00, 0xa6, 0x21, 0x50, 0xb1, 0x74, 0x91, 0x84, 0x00, 0xff, + 0x90, 0xb6, 0x00, 0x02, 0x01, 0xe0, 0x90, 0x86, 0x00, 0x28, 0x11, 0x28, + 0xa8, 0x7b, 0x00, 0x1c, 0xb0, 0x7b, 0x00, 0x1c, 0x00, 0xe0, 0xd1, 0xdc, + 0x01, 0x58, 0xa8, 0x7b, 0x00, 0x15, 0xb0, 0x7b, 0x00, 0x15, 0x08, 0x0c, + 0xd5, 0x08, 0x01, 0x18, 0xb1, 0x74, 0xc1, 0xdc, 0xb1, 0x76, 0x00, 0x78, + 0xd1, 0xd4, 0x01, 0x28, 0xa8, 0x7b, 0x00, 0x07, 0xb0, 0x7b, 0x00, 0x07, + 0x00, 0x40, 0xa8, 0x7c, 0xd0, 0xac, 0x01, 0x28, 0xa8, 0x34, 0xa9, 0x38, + 0x91, 0x15, 0x19, 0x0c, 0xc5, 0x19, 0xa8, 0x90, 0xb0, 0x92, 0xa8, 0x8c, + 0xb0, 0x8e, 0xa8, 0x7c, 0xb0, 0x7e, 0x00, 0xae, 0x08, 0x0c, 0x10, 0x0b, + 0x00, 0x9e, 0x08, 0x0c, 0xd5, 0xe8, 0xa9, 0x74, 0x00, 0x16, 0x08, 0x0c, + 0xca, 0x6b, 0x00, 0x1e, 0x04, 0x68, 0xa8, 0x67, 0x01, 0x03, 0xa9, 0x74, + 0x91, 0x84, 0x00, 0xff, 0x90, 0xb6, 0x00, 0x02, 0x01, 0xb0, 0x90, 0x86, + 0x00, 0x28, 0x11, 0x18, 0xa8, 0x7b, 0x00, 0x1c, 0x00, 0xd0, 0xd1, 0xdc, + 0x01, 0x48, 0xa8, 0x7b, 0x00, 0x15, 0x08, 0x0c, 0xd5, 0x08, 0x01, 0x18, + 0xa9, 0x74, 0xc1, 0xdc, 0xa9, 0x76, 0x00, 0x78, 0xd1, 0xd4, 0x01, 0x18, + 0xa8, 0x7b, 0x00, 0x07, 0x00, 0x50, 0xa8, 0x7b, 0x00, 0x00, 0xa8, 0x7c, + 0xd0, 0xac, 0x01, 0x28, 0xa8, 0x34, 0xa9, 0x38, 0x91, 0x15, 0x19, 0x0c, + 0xc5, 0x19, 0xa9, 0x74, 0x00, 0x16, 0x08, 0x0c, 0x6e, 0x27, 0x00, 0x1e, + 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xba, 0x3c, 0xb8, 0xd0, 0x00, 0x16, + 0x90, 0x05, 0x19, 0x0c, 0x68, 0xdf, 0x00, 0x1e, 0x00, 0xbe, 0xd1, 0xe4, + 0x11, 0x20, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x9e, 0x00, 0x05, 0x08, 0x0c, + 0xd2, 0x2a, 0x0c, 0xd8, 0x61, 0x14, 0x00, 0x96, 0x21, 0x48, 0xa9, 0x7c, + 0x08, 0x0c, 0xd6, 0x6b, 0x19, 0x0c, 0x1a, 0xbf, 0x00, 0x9e, 0x00, 0x05, + 0x00, 0x96, 0x61, 0x14, 0x21, 0x48, 0xa8, 0x3c, 0xa9, 0x40, 0x91, 0x05, + 0x01, 0xe8, 0xa8, 0x77, 0x00, 0x00, 0xa8, 0x7b, 0x00, 0x00, 0xa8, 0x67, + 0x01, 0x03, 0x00, 0xb6, 0x60, 0x10, 0x20, 0x58, 0xa8, 0x34, 0xa9, 0x38, + 0x91, 0x15, 0x11, 0xa0, 0x08, 0x0c, 0x6e, 0x27, 0xba, 0x3c, 0x82, 0x11, + 0x02, 0x08, 0xba, 0x3e, 0xb8, 0xd0, 0x90, 0x05, 0x01, 0x10, 0x08, 0x0c, + 0x68, 0xdf, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0xbe, 0x00, 0x9e, 0x00, 0x05, + 0xa8, 0x7c, 0xc0, 0xdc, 0xa8, 0x7e, 0x08, 0xf8, 0xb8, 0x00, 0xd0, 0xbc, + 0x11, 0x20, 0xa8, 0x34, 0x08, 0x0c, 0xc5, 0x19, 0x0c, 0x28, 0xa8, 0x80, + 0xd0, 0xbc, 0x1d, 0xc8, 0x08, 0x0c, 0xd2, 0x67, 0x0c, 0x60, 0x08, 0x0c, + 0x99, 0xed, 0x00, 0x10, 0x08, 0x0c, 0x9a, 0x48, 0x60, 0x1c, 0xd0, 0x84, + 0x01, 0x10, 0x08, 0x0c, 0x1a, 0xd3, 0x08, 0x0c, 0xcf, 0x1b, 0x01, 0xf0, + 0x00, 0x96, 0x61, 0x14, 0x21, 0x48, 0x08, 0x0c, 0xd1, 0x32, 0x11, 0x18, + 0x08, 0x0c, 0xbb, 0x5c, 0x00, 0xa0, 0xa8, 0x67, 0x01, 0x03, 0x20, 0x09, + 0x18, 0x0c, 0x21, 0x0c, 0xd1, 0x8c, 0x11, 0x98, 0xd1, 0x84, 0x11, 0x70, + 0x61, 0x08, 0xa9, 0x7a, 0x91, 0x8e, 0x00, 0x29, 0x11, 0x10, 0x08, 0x0c, + 0xed, 0xdf, 0xa8, 0x77, 0x00, 0x00, 0x08, 0x0c, 0x70, 0x12, 0x00, 0x9e, + 0x08, 0x04, 0xb1, 0xa7, 0xa8, 0x7b, 0x00, 0x04, 0x0c, 0xb0, 0xa8, 0x7b, + 0x00, 0x04, 0x0c, 0x98, 0x91, 0x82, 0x00, 0x57, 0x12, 0x20, 0x91, 0x82, + 0x00, 0x40, 0x02, 0x08, 0x00, 0x0a, 0x00, 0x05, 0xc7, 0xdf, 0xc7, 0xdf, + 0xc7, 0xdf, 0xc7, 0xdf, 0xc7, 0xdf, 0xc7, 0xe1, 0xc7, 0xdf, 0xc7, 0xdf, + 0xc7, 0xdf, 0xc7, 0xdf, 0xc7, 0xdf, 0xc7, 0xdf, 0xc7, 0xdf, 0xc7, 0xdf, + 0xc7, 0xdf, 0xc7, 0xdf, 0xc7, 0xdf, 0xc7, 0xdf, 0xc7, 0xdf, 0xc7, 0xdf, + 0xc8, 0x05, 0xc7, 0xdf, 0xc7, 0xdf, 0x08, 0x0c, 0x0d, 0x85, 0x08, 0x0c, + 0x58, 0x48, 0x01, 0xf8, 0x60, 0x14, 0x71, 0x44, 0x91, 0x8c, 0x0f, 0xff, + 0x90, 0x16, 0xd1, 0xc4, 0x01, 0x18, 0x72, 0x64, 0x92, 0x94, 0x00, 0xff, + 0x00, 0x96, 0x90, 0x4d, 0x01, 0x88, 0xa8, 0x7b, 0x00, 0x00, 0xa8, 0x64, + 0x90, 0x86, 0x01, 0x39, 0x01, 0x28, 0xa8, 0x67, 0x01, 0x03, 0xa9, 0x76, + 0xaa, 0x96, 0x00, 0x30, 0xa8, 0x97, 0x40, 0x00, 0xa9, 0x9a, 0xaa, 0x9e, + 0x08, 0x0c, 0x70, 0x12, 0x00, 0x9e, 0x08, 0x04, 0xb1, 0x6c, 0x08, 0x0c, + 0x58, 0x48, 0x0d, 0xd8, 0x60, 0x14, 0x90, 0x0e, 0x90, 0x16, 0x0c, 0x10, + 0x91, 0x82, 0x00, 0x85, 0x00, 0x02, 0xc8, 0x1e, 0xc8, 0x1c, 0xc8, 0x1c, + 0xc8, 0x2a, 0xc8, 0x1c, 0xc8, 0x1c, 0xc8, 0x1c, 0xc8, 0x1c, 0xc8, 0x1c, + 0xc8, 0x1c, 0xc8, 0x1c, 0xc8, 0x1c, 0xc8, 0x1c, 0x08, 0x0c, 0x0d, 0x85, + 0x60, 0x03, 0x00, 0x01, 0x61, 0x06, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x09, 0x80, 0x20, 0x08, 0x0c, 0x96, 0x17, 0x01, 0x2e, 0x00, 0x05, + 0x00, 0x26, 0x00, 0x56, 0x00, 0xd6, 0x00, 0xe6, 0x20, 0x71, 0x02, 0x60, + 0x72, 0x24, 0x62, 0x16, 0x72, 0x20, 0x08, 0x0c, 0xcf, 0x09, 0x01, 0xf8, + 0x22, 0x68, 0x68, 0x00, 0x90, 0x86, 0x00, 0x00, 0x01, 0xd0, 0x60, 0x10, + 0x6d, 0x10, 0x95, 0x2e, 0x11, 0xb0, 0x00, 0xc6, 0x2d, 0x60, 0x00, 0xd6, + 0x08, 0x0c, 0xca, 0xdc, 0x00, 0xde, 0x00, 0xce, 0x01, 0x58, 0x70, 0x2c, + 0xd0, 0x84, 0x11, 0x18, 0x08, 0x0c, 0xca, 0xa6, 0x00, 0x10, 0x68, 0x03, + 0x00, 0x02, 0x60, 0x07, 0x00, 0x86, 0x00, 0x28, 0x08, 0x0c, 0xca, 0xc8, + 0x0d, 0x90, 0x60, 0x07, 0x00, 0x87, 0x60, 0x03, 0x00, 0x01, 0x20, 0x09, + 0x80, 0x20, 0x08, 0x0c, 0x96, 0x17, 0x72, 0x20, 0x08, 0x0c, 0xcf, 0x09, + 0x01, 0x78, 0x68, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x00, 0x00, 0xbe, + 0xd0, 0xbc, 0x01, 0x40, 0x68, 0x24, 0xd0, 0xec, 0x01, 0x28, 0x00, 0xc6, + 0x2d, 0x60, 0x08, 0x0c, 0xd2, 0x67, 0x00, 0xce, 0x00, 0xee, 0x00, 0xde, + 0x00, 0x5e, 0x00, 0x2e, 0x00, 0x05, 0x91, 0x86, 0x00, 0x13, 0x11, 0x60, + 0x60, 0x04, 0x90, 0x8a, 0x00, 0x85, 0x0a, 0x0c, 0x0d, 0x85, 0x90, 0x8a, + 0x00, 0x92, 0x1a, 0x0c, 0x0d, 0x85, 0x90, 0x82, 0x00, 0x85, 0x00, 0xe2, + 0x91, 0x86, 0x00, 0x27, 0x01, 0x20, 0x91, 0x86, 0x00, 0x14, 0x19, 0x0c, + 0x0d, 0x85, 0x08, 0x0c, 0x99, 0xed, 0x00, 0x96, 0x60, 0x14, 0x20, 0x48, + 0x08, 0x0c, 0xcf, 0x1b, 0x01, 0x40, 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x77, + 0x00, 0x00, 0xa8, 0x7b, 0x00, 0x29, 0x08, 0x0c, 0x70, 0x12, 0x00, 0x9e, + 0x08, 0x0c, 0xb1, 0xa7, 0x08, 0x04, 0x9a, 0xb3, 0xc8, 0xad, 0xc8, 0xaf, + 0xc8, 0xaf, 0xc8, 0xad, 0xc8, 0xad, 0xc8, 0xad, 0xc8, 0xad, 0xc8, 0xad, + 0xc8, 0xad, 0xc8, 0xad, 0xc8, 0xad, 0xc8, 0xad, 0xc8, 0xad, 0x08, 0x0c, + 0x0d, 0x85, 0x08, 0x0c, 0xb1, 0xa7, 0x00, 0x05, 0x91, 0x86, 0x00, 0x13, + 0x11, 0x30, 0x60, 0x04, 0x90, 0x82, 0x00, 0x85, 0x20, 0x08, 0x08, 0x04, + 0xc8, 0xfe, 0x91, 0x86, 0x00, 0x27, 0x15, 0x58, 0x08, 0x0c, 0x99, 0xed, + 0x08, 0x0c, 0x33, 0x15, 0x08, 0x0c, 0xd6, 0x5a, 0x00, 0x96, 0x60, 0x14, + 0x20, 0x48, 0x08, 0x0c, 0xcf, 0x1b, 0x01, 0x50, 0xa8, 0x67, 0x01, 0x03, + 0xa8, 0x77, 0x00, 0x00, 0xa8, 0x7b, 0x00, 0x29, 0x08, 0x0c, 0x70, 0x12, + 0x08, 0x0c, 0xd1, 0x0c, 0x00, 0x9e, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x05, + 0x91, 0x86, 0x00, 0x89, 0x01, 0x18, 0x91, 0x86, 0x00, 0x8a, 0x11, 0x40, + 0x08, 0x0c, 0xaf, 0x61, 0x01, 0x28, 0x90, 0x86, 0x00, 0x0c, 0x09, 0x04, + 0xc9, 0x36, 0x00, 0x00, 0x08, 0x0c, 0xb2, 0x27, 0x0c, 0x70, 0x91, 0x86, + 0x00, 0x14, 0x1d, 0x60, 0x08, 0x0c, 0x99, 0xed, 0x00, 0x96, 0x60, 0x14, + 0x20, 0x48, 0x08, 0x0c, 0xcf, 0x1b, 0x0d, 0x00, 0xa8, 0x67, 0x01, 0x03, + 0xa8, 0x77, 0x00, 0x00, 0xa8, 0x7b, 0x00, 0x06, 0xa8, 0x80, 0xc0, 0xec, + 0xa8, 0x82, 0x08, 0x90, 0x00, 0x02, 0xc9, 0x0e, 0xc9, 0x0c, 0xc9, 0x0c, + 0xc9, 0x0c, 0xc9, 0x0c, 0xc9, 0x0c, 0xc9, 0x22, 0xc9, 0x0c, 0xc9, 0x0c, + 0xc9, 0x0c, 0xc9, 0x0c, 0xc9, 0x0c, 0xc9, 0x0c, 0x08, 0x0c, 0x0d, 0x85, + 0x60, 0x34, 0x90, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0x91, 0x86, 0x00, 0x39, + 0x01, 0x18, 0x91, 0x86, 0x00, 0x35, 0x11, 0x18, 0x20, 0x01, 0x19, 0x86, + 0x00, 0x10, 0x20, 0x01, 0x19, 0x87, 0x20, 0x04, 0x60, 0x1a, 0x60, 0x03, + 0x00, 0x0c, 0x00, 0x05, 0x60, 0x34, 0x90, 0x8c, 0xff, 0x00, 0x81, 0x0f, + 0x91, 0x86, 0x00, 0x39, 0x01, 0x18, 0x91, 0x86, 0x00, 0x35, 0x11, 0x18, + 0x20, 0x01, 0x19, 0x86, 0x00, 0x10, 0x20, 0x01, 0x19, 0x87, 0x20, 0x04, + 0x60, 0x1a, 0x60, 0x03, 0x00, 0x0e, 0x00, 0x05, 0x91, 0x82, 0x00, 0x92, + 0x12, 0x20, 0x91, 0x82, 0x00, 0x85, 0x02, 0x08, 0x00, 0x12, 0x08, 0x04, + 0xb2, 0x27, 0xc9, 0x4c, 0xc9, 0x4c, 0xc9, 0x4c, 0xc9, 0x4c, 0xc9, 0x4e, + 0xc9, 0x9b, 0xc9, 0x4c, 0xc9, 0x4c, 0xc9, 0x4c, 0xc9, 0x4c, 0xc9, 0x4c, + 0xc9, 0x4c, 0xc9, 0x4c, 0x08, 0x0c, 0x0d, 0x85, 0x00, 0x96, 0x60, 0x10, + 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x00, 0x00, 0xbe, 0xd0, 0xbc, 0x01, 0x68, + 0x60, 0x34, 0x90, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0x91, 0x86, 0x00, 0x39, + 0x01, 0x18, 0x91, 0x86, 0x00, 0x35, 0x11, 0x18, 0x00, 0x9e, 0x08, 0x04, + 0xc9, 0xaf, 0x08, 0x0c, 0xcf, 0x1b, 0x11, 0x18, 0x08, 0x0c, 0xd1, 0x0c, + 0x00, 0x68, 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0xd6, 0x71, 0x11, 0x10, + 0x08, 0x0c, 0xd1, 0x0c, 0xa8, 0x67, 0x01, 0x03, 0x08, 0x0c, 0xd6, 0x25, + 0x08, 0x0c, 0x70, 0x12, 0x00, 0xd6, 0x2c, 0x68, 0x08, 0x0c, 0xb1, 0x16, + 0x01, 0xd0, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x1e, 0x60, 0x0b, + 0xff, 0xff, 0x20, 0x09, 0x02, 0x6e, 0x21, 0x0c, 0x61, 0x3a, 0x20, 0x09, + 0x02, 0x6f, 0x21, 0x0c, 0x61, 0x3e, 0x69, 0x10, 0x61, 0x12, 0x08, 0x0c, + 0xd3, 0xb6, 0x69, 0x5c, 0x61, 0x5e, 0x60, 0x23, 0x00, 0x01, 0x20, 0x09, + 0x80, 0x20, 0x08, 0x0c, 0x96, 0x17, 0x2d, 0x60, 0x00, 0xde, 0x08, 0x0c, + 0xb1, 0x6c, 0x00, 0x9e, 0x00, 0x05, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, + 0xb8, 0x00, 0x00, 0xbe, 0xd0, 0xbc, 0x05, 0xa0, 0x60, 0x34, 0x90, 0x8c, + 0xff, 0x00, 0x81, 0x0f, 0x91, 0x86, 0x00, 0x35, 0x01, 0x30, 0x91, 0x86, + 0x00, 0x1e, 0x01, 0x18, 0x91, 0x86, 0x00, 0x39, 0x15, 0x38, 0x00, 0xd6, + 0x2c, 0x68, 0x08, 0x0c, 0xd5, 0xbb, 0x11, 0xf0, 0x08, 0x0c, 0xb1, 0x16, + 0x01, 0xd8, 0x61, 0x06, 0x60, 0x03, 0x00, 0x01, 0x60, 0x23, 0x00, 0x01, + 0x69, 0x10, 0x61, 0x12, 0x69, 0x2c, 0x61, 0x2e, 0x69, 0x30, 0x61, 0x32, + 0x69, 0x34, 0x91, 0x8c, 0x00, 0xff, 0x61, 0x36, 0x69, 0x38, 0x61, 0x3a, + 0x69, 0x3c, 0x61, 0x3e, 0x69, 0x5c, 0x61, 0x5e, 0x08, 0x0c, 0xd3, 0xb6, + 0x20, 0x09, 0x80, 0x20, 0x08, 0x0c, 0x96, 0x17, 0x2d, 0x60, 0x00, 0xde, + 0x08, 0x04, 0xb1, 0x6c, 0x00, 0x96, 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, + 0xcf, 0x1b, 0x01, 0xc8, 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x80, 0xd0, 0xb4, + 0x01, 0x28, 0xc0, 0xec, 0xa8, 0x82, 0xa8, 0x7b, 0x00, 0x06, 0x00, 0x48, + 0xd0, 0xbc, 0x01, 0x18, 0xa8, 0x7b, 0x00, 0x02, 0x00, 0x20, 0xa8, 0x7b, + 0x00, 0x05, 0x08, 0x0c, 0xd2, 0x26, 0xa8, 0x77, 0x00, 0x00, 0x08, 0x0c, + 0x70, 0x12, 0x08, 0x0c, 0xd1, 0x0c, 0x00, 0x9e, 0x08, 0x04, 0xb1, 0x6c, + 0x00, 0x16, 0x00, 0x96, 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0xcf, 0x1b, + 0x01, 0x40, 0xa8, 0x67, 0x01, 0x03, 0xa8, 0x7b, 0x00, 0x28, 0xa8, 0x77, + 0x00, 0x00, 0x08, 0x0c, 0x70, 0x12, 0x00, 0x9e, 0x00, 0x1e, 0x91, 0x86, + 0x00, 0x13, 0x01, 0x58, 0x91, 0x86, 0x00, 0x14, 0x01, 0x30, 0x91, 0x86, + 0x00, 0x27, 0x01, 0x18, 0x08, 0x0c, 0xb2, 0x27, 0x00, 0x20, 0x08, 0x0c, + 0x99, 0xed, 0x08, 0x0c, 0xb1, 0xa7, 0x00, 0x05, 0x00, 0x56, 0x00, 0x66, + 0x00, 0x96, 0x00, 0xa6, 0x20, 0x29, 0x00, 0x01, 0x91, 0x82, 0x01, 0x01, + 0x12, 0x08, 0x00, 0x10, 0x20, 0x09, 0x01, 0x00, 0x21, 0x30, 0x83, 0x04, + 0x90, 0x98, 0x00, 0x18, 0x20, 0x09, 0x00, 0x20, 0x20, 0x11, 0x00, 0x29, + 0x08, 0x0c, 0xca, 0x7b, 0x96, 0xb2, 0x00, 0x20, 0xb0, 0x04, 0x90, 0x4d, + 0x01, 0x10, 0x08, 0x0c, 0x10, 0x0b, 0x08, 0x0c, 0x10, 0x59, 0x05, 0x20, + 0x85, 0x28, 0xa8, 0x67, 0x01, 0x10, 0xa8, 0x6b, 0x00, 0x00, 0x29, 0x20, + 0xb4, 0x06, 0x96, 0x8a, 0x00, 0x3d, 0x12, 0x28, 0x26, 0x08, 0x20, 0x11, + 0x00, 0x1b, 0x04, 0x99, 0x00, 0xa8, 0x96, 0xb2, 0x00, 0x3c, 0x20, 0x09, + 0x00, 0x3c, 0x29, 0x50, 0x20, 0x11, 0x00, 0x1b, 0x04, 0x51, 0x0c, 0x28, + 0x20, 0x01, 0x02, 0x05, 0x20, 0x03, 0x00, 0x00, 0x00, 0xae, 0x85, 0x2f, + 0x95, 0xad, 0x00, 0x03, 0xb5, 0x66, 0x95, 0xac, 0x00, 0x00, 0x00, 0x48, + 0x20, 0x01, 0x02, 0x05, 0x20, 0x03, 0x00, 0x00, 0x00, 0xae, 0x85, 0x2f, + 0x95, 0xad, 0x00, 0x03, 0xb5, 0x66, 0x00, 0x9e, 0x00, 0x6e, 0x00, 0x5e, + 0x00, 0x05, 0x00, 0xa6, 0x89, 0xff, 0x01, 0x58, 0xa8, 0x04, 0x90, 0x55, + 0x01, 0x30, 0xa8, 0x07, 0x00, 0x00, 0x08, 0x0c, 0x70, 0x12, 0x2a, 0x48, + 0x0c, 0xb8, 0x08, 0x0c, 0x70, 0x12, 0x00, 0xae, 0x00, 0x05, 0x00, 0xf6, + 0x20, 0x79, 0x02, 0x00, 0x78, 0x14, 0x90, 0x85, 0x00, 0x80, 0x78, 0x16, + 0xd1, 0x84, 0x01, 0x08, 0x81, 0x08, 0x81, 0x0c, 0x20, 0xa9, 0x00, 0x01, + 0xa8, 0x60, 0x20, 0xe8, 0xa8, 0x5c, 0x92, 0x00, 0x20, 0xa0, 0x20, 0xe1, + 0x00, 0x00, 0x23, 0x00, 0x9e, 0x00, 0x20, 0x98, 0x40, 0x03, 0x83, 0x18, + 0x93, 0x86, 0x00, 0x20, 0x11, 0x48, 0x20, 0x18, 0x23, 0x00, 0x9e, 0x00, + 0x20, 0x98, 0x78, 0x14, 0x80, 0x00, 0x90, 0x85, 0x00, 0x80, 0x78, 0x16, + 0x81, 0x09, 0x1d, 0x80, 0x78, 0x17, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x05, + 0x69, 0x20, 0x91, 0x86, 0x00, 0x03, 0x01, 0x18, 0x91, 0x86, 0x00, 0x02, + 0x11, 0xd0, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xe6, 0x2d, 0x60, 0x00, 0x96, + 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0xcf, 0x1b, 0x01, 0x50, 0x20, 0x01, + 0x00, 0x06, 0xa9, 0x80, 0xc1, 0xd5, 0x08, 0x0c, 0x72, 0x5e, 0x08, 0x0c, + 0x70, 0x06, 0x08, 0x0c, 0xd1, 0x0c, 0x00, 0x9e, 0x08, 0x0c, 0xb1, 0xa7, + 0x00, 0xee, 0x00, 0xde, 0x00, 0xce, 0x00, 0x05, 0x00, 0xc6, 0x70, 0x2c, + 0xd0, 0x84, 0x11, 0x70, 0x60, 0x08, 0x20, 0x60, 0x60, 0x20, 0x90, 0x86, + 0x00, 0x02, 0x11, 0x40, 0x61, 0x04, 0x91, 0x86, 0x00, 0x85, 0x01, 0x18, + 0x91, 0x86, 0x00, 0x8b, 0x11, 0x08, 0x90, 0x06, 0x00, 0xce, 0x00, 0x05, + 0x00, 0x66, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x31, 0x00, 0x01, + 0x60, 0x20, 0x90, 0x84, 0x00, 0x0f, 0x00, 0x83, 0x01, 0x2e, 0x00, 0x6e, + 0x00, 0x05, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0x66, 0x20, 0x31, + 0x00, 0x00, 0x60, 0x20, 0x90, 0x84, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x6e, + 0x01, 0x2e, 0x00, 0x05, 0xcb, 0x2a, 0xcb, 0x2a, 0xcb, 0x25, 0xcb, 0x4e, + 0xcb, 0x06, 0xcb, 0x25, 0xcb, 0x08, 0xcb, 0x25, 0xcb, 0x25, 0x94, 0x58, + 0xcb, 0x25, 0xcb, 0x25, 0xcb, 0x25, 0xcb, 0x06, 0xcb, 0x06, 0xcb, 0x06, + 0x08, 0x0c, 0x0d, 0x85, 0x60, 0x10, 0x90, 0x80, 0x00, 0x00, 0x20, 0x04, + 0xd0, 0xbc, 0x19, 0x0c, 0xcb, 0x4e, 0x00, 0x36, 0x60, 0x14, 0x00, 0x96, + 0x20, 0x48, 0xa8, 0x80, 0x00, 0x9e, 0xd0, 0xcc, 0x01, 0x18, 0x20, 0x19, + 0x00, 0x0c, 0x00, 0x38, 0xd0, 0x94, 0x01, 0x18, 0x20, 0x19, 0x00, 0x0d, + 0x00, 0x10, 0x20, 0x19, 0x00, 0x10, 0x08, 0x0c, 0xe5, 0x78, 0x00, 0x3e, + 0x00, 0x05, 0x90, 0x06, 0x00, 0x05, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, + 0x00, 0x96, 0x86, 0xff, 0x11, 0xe8, 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, + 0xcf, 0x1b, 0x01, 0xd0, 0x60, 0x43, 0xff, 0xff, 0xa8, 0x64, 0x90, 0x86, + 0x01, 0x39, 0x11, 0x28, 0xa8, 0x7b, 0x00, 0x05, 0xa8, 0x83, 0x00, 0x00, + 0x00, 0x28, 0x90, 0x0e, 0x20, 0x01, 0x00, 0x05, 0x08, 0x0c, 0x72, 0x5e, + 0x08, 0x0c, 0xd2, 0x26, 0x08, 0x0c, 0x70, 0x06, 0x08, 0x0c, 0xb1, 0xa7, + 0x90, 0x85, 0x00, 0x01, 0x00, 0x9e, 0x00, 0x05, 0x90, 0x06, 0x0c, 0xe0, + 0x08, 0x0c, 0xac, 0xfc, 0x08, 0x0c, 0xd6, 0x7f, 0x90, 0x8a, 0x00, 0x10, + 0x1a, 0x0c, 0x0d, 0x85, 0x00, 0x2b, 0x01, 0x06, 0x08, 0x0c, 0xad, 0x18, + 0x01, 0x0e, 0x00, 0x05, 0xcb, 0x6c, 0xcb, 0x9c, 0xcb, 0x6e, 0xcb, 0xc3, + 0xcb, 0x97, 0xcb, 0x6c, 0xcb, 0x25, 0xcb, 0x2a, 0xcb, 0x2a, 0xcb, 0x25, + 0xcb, 0x25, 0xcb, 0x25, 0xcb, 0x25, 0xcb, 0x25, 0xcb, 0x25, 0xcb, 0x25, + 0x08, 0x0c, 0x0d, 0x85, 0x86, 0xff, 0x15, 0x20, 0x60, 0x20, 0x90, 0x86, + 0x00, 0x06, 0x05, 0x00, 0x00, 0x96, 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, + 0xcf, 0x1b, 0x01, 0x68, 0xa8, 0x7c, 0xd0, 0xcc, 0x01, 0x40, 0x00, 0x96, + 0xc0, 0xcc, 0xa8, 0x7e, 0xa8, 0x78, 0x20, 0x48, 0x08, 0x0c, 0x10, 0x0b, + 0x00, 0x9e, 0x08, 0x0c, 0xd2, 0x26, 0x00, 0x9e, 0x08, 0x0c, 0xd5, 0xff, + 0x60, 0x07, 0x00, 0x85, 0x60, 0x03, 0x00, 0x0b, 0x60, 0x23, 0x00, 0x02, + 0x20, 0x09, 0x80, 0x20, 0x08, 0x0c, 0x95, 0xf9, 0x90, 0x85, 0x00, 0x01, + 0x00, 0x05, 0x00, 0x66, 0x08, 0x0c, 0x1a, 0xd3, 0x00, 0x6e, 0x08, 0x90, + 0x00, 0xe6, 0x20, 0x71, 0x19, 0xe8, 0x70, 0x30, 0x9c, 0x06, 0x11, 0x20, + 0x08, 0x0c, 0xa5, 0x16, 0x00, 0xee, 0x08, 0x40, 0x60, 0x20, 0x90, 0x84, + 0x00, 0x0f, 0x90, 0x86, 0x00, 0x06, 0x11, 0x50, 0x00, 0x86, 0x00, 0x96, + 0x20, 0x49, 0x00, 0x01, 0x2c, 0x40, 0x08, 0x0c, 0xa6, 0x67, 0x00, 0x9e, + 0x00, 0x8e, 0x00, 0x40, 0x00, 0x66, 0x08, 0x0c, 0xa4, 0x12, 0x19, 0x0c, + 0x0d, 0x85, 0x08, 0x0c, 0xa4, 0x20, 0x00, 0x6e, 0x00, 0xee, 0x19, 0x04, + 0xcb, 0x6e, 0x08, 0x04, 0xcb, 0x25, 0x00, 0x36, 0x00, 0xe6, 0x20, 0x71, + 0x19, 0xe8, 0x70, 0x4c, 0x9c, 0x06, 0x11, 0x38, 0x90, 0x1e, 0x08, 0x0c, + 0xa5, 0x96, 0x00, 0xee, 0x00, 0x3e, 0x08, 0x04, 0xcb, 0x6e, 0x08, 0x0c, + 0xa7, 0xa1, 0x00, 0xee, 0x00, 0x3e, 0x19, 0x04, 0xcb, 0x6e, 0x08, 0x04, + 0xcb, 0x25, 0x00, 0xc6, 0x00, 0x66, 0x60, 0x20, 0x90, 0x84, 0x00, 0x0f, + 0x00, 0x1b, 0x00, 0x6e, 0x00, 0xce, 0x00, 0x05, 0xcb, 0xf9, 0xcc, 0xe2, + 0xce, 0x50, 0xcc, 0x01, 0xb1, 0xa7, 0xcb, 0xf9, 0xe5, 0x6e, 0xd6, 0x67, + 0xcc, 0xe2, 0x94, 0x1f, 0xce, 0xdc, 0xcb, 0xf2, 0xcb, 0xf2, 0xcb, 0xf2, + 0xcb, 0xf2, 0xcb, 0xf2, 0x08, 0x0c, 0x0d, 0x85, 0x08, 0x0c, 0xd1, 0x32, + 0x11, 0x10, 0x08, 0x0c, 0xbb, 0x5c, 0x00, 0x05, 0x08, 0x0c, 0x99, 0xed, + 0x08, 0x04, 0xb1, 0x6c, 0x60, 0x1b, 0x00, 0x01, 0x00, 0x05, 0x08, 0x0c, + 0xcf, 0x1b, 0x01, 0x30, 0x60, 0x14, 0x00, 0x96, 0x20, 0x48, 0x2c, 0x00, + 0xa8, 0x96, 0x00, 0x9e, 0x08, 0x0c, 0xac, 0xfc, 0x08, 0x0c, 0xd6, 0x7f, + 0x90, 0x8a, 0x00, 0x10, 0x1a, 0x0c, 0x0d, 0x85, 0x00, 0x13, 0x08, 0x04, + 0xad, 0x18, 0xcc, 0x25, 0xcc, 0x27, 0xcc, 0x51, 0xcc, 0x65, 0xcc, 0x92, + 0xcc, 0x25, 0xcb, 0xf9, 0xcb, 0xf9, 0xcb, 0xf9, 0xcc, 0x6c, 0xcc, 0x6c, + 0xcc, 0x25, 0xcc, 0x25, 0xcc, 0x25, 0xcc, 0x25, 0xcc, 0x76, 0x08, 0x0c, + 0x0d, 0x85, 0x00, 0xe6, 0x60, 0x14, 0x00, 0x96, 0x20, 0x48, 0xa8, 0x80, + 0xc0, 0xb5, 0xa8, 0x82, 0x00, 0x9e, 0x20, 0x71, 0x19, 0xe8, 0x70, 0x30, + 0x9c, 0x06, 0x01, 0xd0, 0x00, 0x66, 0x08, 0x0c, 0xa4, 0x12, 0x19, 0x0c, + 0x0d, 0x85, 0x08, 0x0c, 0xa4, 0x20, 0x00, 0x6e, 0x08, 0x0c, 0xd5, 0xff, + 0x60, 0x07, 0x00, 0x85, 0x60, 0x03, 0x00, 0x0b, 0x60, 0x23, 0x00, 0x02, + 0x20, 0x01, 0x19, 0x87, 0x20, 0x04, 0x60, 0x1a, 0x20, 0x09, 0x80, 0x20, + 0x08, 0x0c, 0x95, 0xf9, 0x00, 0xee, 0x00, 0x05, 0x60, 0x1b, 0x00, 0x01, + 0x0c, 0xd8, 0x00, 0x96, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x80, 0xc0, 0xb5, + 0xa8, 0x82, 0x00, 0x9e, 0x08, 0x0c, 0xd5, 0xff, 0x60, 0x07, 0x00, 0x85, + 0x60, 0x03, 0x00, 0x0b, 0x60, 0x23, 0x00, 0x02, 0x20, 0x09, 0x80, 0x20, + 0x08, 0x0c, 0x95, 0xf9, 0x00, 0x05, 0x08, 0x0c, 0xac, 0xfc, 0x08, 0x0c, + 0xae, 0xe3, 0x08, 0x0c, 0xad, 0x18, 0x0c, 0x28, 0x00, 0x96, 0x60, 0x1b, + 0x00, 0x01, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x80, 0xc0, 0xb5, 0xa8, 0x82, + 0x00, 0x9e, 0x00, 0x05, 0x08, 0x0c, 0x58, 0x48, 0x01, 0xb8, 0x60, 0x14, + 0x00, 0x96, 0x90, 0x4d, 0x01, 0x90, 0xa8, 0x64, 0xa8, 0x67, 0x01, 0x03, + 0xa8, 0x7b, 0x00, 0x06, 0x90, 0x86, 0x01, 0x39, 0x11, 0x50, 0xa8, 0x67, + 0x01, 0x39, 0xa8, 0x7b, 0x00, 0x30, 0xa8, 0x97, 0x40, 0x05, 0xa8, 0x9b, + 0x00, 0x04, 0x08, 0x0c, 0x70, 0x12, 0x00, 0x9e, 0x08, 0x04, 0xb1, 0x6c, + 0x60, 0x14, 0x00, 0x96, 0x90, 0x4d, 0x09, 0x04, 0xcc, 0xdd, 0xa9, 0x7c, + 0xd1, 0xe4, 0x11, 0x60, 0x61, 0x1c, 0xd1, 0xfc, 0x09, 0x04, 0xcc, 0xdd, + 0x61, 0x10, 0x00, 0xb6, 0x21, 0x58, 0xb9, 0x3c, 0x81, 0x09, 0x02, 0x08, + 0xb9, 0x3e, 0x00, 0xbe, 0x08, 0x0c, 0xad, 0x18, 0x20, 0x01, 0x18, 0x0f, + 0x20, 0x04, 0xd0, 0xc4, 0x01, 0x10, 0x00, 0x9e, 0x00, 0x05, 0xa8, 0x84, + 0x00, 0x9e, 0x80, 0x03, 0x80, 0x0b, 0x81, 0x0b, 0x91, 0x08, 0x61, 0x1a, + 0x20, 0x01, 0x00, 0x30, 0x2c, 0x08, 0x08, 0x0c, 0x16, 0xb9, 0x20, 0x01, + 0x03, 0x0c, 0x20, 0x04, 0x90, 0x86, 0x00, 0x41, 0x11, 0x98, 0x60, 0x14, + 0x00, 0x96, 0x90, 0x4d, 0x09, 0x0c, 0x0d, 0x85, 0xa8, 0x80, 0xd0, 0xf4, + 0x11, 0x30, 0xc0, 0xf5, 0xa8, 0x82, 0x00, 0x9e, 0x60, 0x1b, 0x00, 0x02, + 0x00, 0x68, 0x00, 0x9e, 0x00, 0xc6, 0x08, 0x0c, 0x21, 0x85, 0x00, 0xce, + 0x60, 0x00, 0x90, 0x86, 0x00, 0x04, 0x11, 0x20, 0x20, 0x09, 0x00, 0x48, + 0x08, 0x0c, 0xb2, 0x0a, 0x00, 0x05, 0x00, 0x9e, 0x08, 0x0c, 0x1a, 0xd3, + 0x08, 0x04, 0xcc, 0x51, 0x60, 0x00, 0x90, 0x8a, 0x00, 0x10, 0x1a, 0x0c, + 0x0d, 0x85, 0x00, 0x0b, 0x00, 0x05, 0xcc, 0xf9, 0xcb, 0xfe, 0xcc, 0xfb, + 0xcc, 0xf9, 0xcc, 0xfb, 0xcc, 0xfb, 0xcb, 0xfa, 0xcc, 0xf9, 0xcb, 0xf4, + 0xcb, 0xf4, 0xcc, 0xf9, 0xcc, 0xf9, 0xcc, 0xf9, 0xcc, 0xf9, 0xcc, 0xf9, + 0xcc, 0xf9, 0x08, 0x0c, 0x0d, 0x85, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, + 0xb8, 0x04, 0x90, 0x84, 0x00, 0xff, 0x00, 0xbe, 0x90, 0x8a, 0x00, 0x0c, + 0x1a, 0x0c, 0x0d, 0x85, 0x00, 0xb6, 0x00, 0x13, 0x00, 0xbe, 0x00, 0x05, + 0xcd, 0x16, 0xcd, 0xe7, 0xcd, 0x18, 0xcd, 0x58, 0xcd, 0x18, 0xcd, 0x58, + 0xcd, 0x18, 0xcd, 0x26, 0xcd, 0x16, 0xcd, 0x58, 0xcd, 0x16, 0xcd, 0x47, + 0x08, 0x0c, 0x0d, 0x85, 0x60, 0x04, 0x90, 0x8e, 0x00, 0x16, 0x05, 0xc0, + 0x90, 0x8e, 0x00, 0x04, 0x05, 0xa8, 0x90, 0x8e, 0x00, 0x02, 0x05, 0x90, + 0x90, 0x8e, 0x00, 0x52, 0x09, 0x04, 0xcd, 0xe3, 0x60, 0x04, 0x08, 0x0c, + 0xd1, 0x32, 0x09, 0x04, 0xce, 0x00, 0x90, 0x8e, 0x00, 0x04, 0x11, 0x10, + 0x08, 0x0c, 0x33, 0x44, 0x90, 0x8e, 0x00, 0x21, 0x09, 0x04, 0xce, 0x04, + 0x90, 0x8e, 0x00, 0x22, 0x09, 0x04, 0xce, 0x4b, 0x90, 0x8e, 0x00, 0x3d, + 0x09, 0x04, 0xce, 0x04, 0x90, 0x8e, 0x00, 0x39, 0x09, 0x04, 0xce, 0x08, + 0x90, 0x8e, 0x00, 0x35, 0x09, 0x04, 0xce, 0x08, 0x90, 0x8e, 0x00, 0x1e, + 0x01, 0x78, 0x90, 0x8e, 0x00, 0x01, 0x11, 0x40, 0x60, 0x10, 0x20, 0x58, + 0xb8, 0x04, 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x06, 0x01, 0x10, + 0x08, 0x0c, 0x33, 0x15, 0x08, 0x0c, 0xbb, 0x5c, 0x08, 0x04, 0xb1, 0xa7, + 0x00, 0xc6, 0x00, 0xd6, 0x61, 0x04, 0x91, 0x86, 0x00, 0x16, 0x09, 0x04, + 0xcd, 0xd4, 0x91, 0x86, 0x00, 0x02, 0x19, 0x04, 0xcd, 0xa9, 0x20, 0x01, + 0x18, 0x37, 0x20, 0x04, 0xd0, 0x8c, 0x11, 0xc8, 0x08, 0x0c, 0x77, 0x9e, + 0x11, 0xb0, 0x08, 0x0c, 0xd6, 0x45, 0x01, 0x38, 0x08, 0x0c, 0x77, 0xc1, + 0x11, 0x20, 0x08, 0x0c, 0x76, 0xa7, 0x08, 0x04, 0xce, 0x34, 0x20, 0x01, + 0x19, 0x7d, 0x20, 0x03, 0x00, 0x01, 0x20, 0x01, 0x18, 0x00, 0x20, 0x03, + 0x00, 0x01, 0x08, 0x0c, 0x76, 0xcd, 0x08, 0x04, 0xce, 0x34, 0x60, 0x10, + 0x20, 0x58, 0xb8, 0xa0, 0x90, 0x86, 0x00, 0x80, 0x01, 0x30, 0x20, 0x01, + 0x18, 0x37, 0x20, 0x04, 0xd0, 0xac, 0x19, 0x04, 0xce, 0x34, 0xb8, 0xa0, + 0x90, 0x82, 0x00, 0x81, 0x1a, 0x04, 0xce, 0x34, 0xb8, 0x40, 0x90, 0x84, + 0x00, 0xff, 0x90, 0x05, 0x01, 0x90, 0x80, 0x01, 0xb8, 0x42, 0x60, 0x17, + 0x00, 0x00, 0x60, 0x23, 0x00, 0x07, 0x60, 0x1b, 0x03, 0x98, 0x60, 0x4b, + 0x00, 0x00, 0x08, 0x0c, 0xb1, 0x16, 0x01, 0x28, 0x2b, 0x00, 0x60, 0x12, + 0x60, 0x23, 0x00, 0x01, 0x04, 0x58, 0x00, 0xde, 0x00, 0xce, 0x60, 0x04, + 0x90, 0x8e, 0x00, 0x02, 0x11, 0xa0, 0x60, 0x10, 0x20, 0x58, 0xb8, 0xa0, + 0x90, 0x86, 0x00, 0x7e, 0x11, 0x70, 0x20, 0x09, 0x18, 0x37, 0x21, 0x04, + 0xc0, 0x85, 0x20, 0x0a, 0x00, 0xe6, 0x20, 0x71, 0x18, 0x00, 0x08, 0x0c, + 0x61, 0x30, 0x00, 0xee, 0x08, 0x0c, 0xbb, 0x5c, 0x00, 0x30, 0x08, 0x0c, + 0xbb, 0x5c, 0x08, 0x0c, 0x33, 0x15, 0x08, 0x0c, 0xd6, 0x5a, 0x00, 0xe6, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x33, 0x44, 0x01, 0x2e, + 0x00, 0xee, 0x08, 0x0c, 0xb1, 0xa7, 0x00, 0x05, 0x20, 0x01, 0x00, 0x02, + 0x08, 0x0c, 0x66, 0xfa, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x02, + 0x08, 0x0c, 0x96, 0x1e, 0x08, 0x0c, 0x9a, 0xb3, 0x00, 0xde, 0x00, 0xce, + 0x0c, 0x80, 0x08, 0x0c, 0x33, 0x44, 0x08, 0x04, 0xcd, 0x54, 0x00, 0xc6, + 0x00, 0xd6, 0x61, 0x04, 0x91, 0x86, 0x00, 0x16, 0x0d, 0x38, 0x60, 0x10, + 0x20, 0x58, 0xb8, 0x40, 0x90, 0x84, 0x00, 0xff, 0x90, 0x05, 0x09, 0x04, + 0xcd, 0xa9, 0x80, 0x01, 0xb8, 0x42, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, + 0x96, 0x1e, 0x08, 0x0c, 0x9a, 0xb3, 0x00, 0xde, 0x00, 0xce, 0x08, 0x98, + 0x08, 0x0c, 0xbb, 0x5c, 0x08, 0x04, 0xcd, 0x56, 0x08, 0x0c, 0xbb, 0x98, + 0x08, 0x04, 0xcd, 0x56, 0x00, 0xd6, 0x2c, 0x68, 0x61, 0x04, 0x08, 0x0c, + 0xd5, 0xbb, 0x00, 0xde, 0x01, 0x18, 0x08, 0x0c, 0xb1, 0x6c, 0x04, 0x08, + 0x60, 0x04, 0x80, 0x07, 0x61, 0x34, 0x91, 0x8c, 0x00, 0xff, 0x91, 0x05, + 0x60, 0x36, 0x60, 0x07, 0x00, 0x85, 0x60, 0x03, 0x00, 0x0b, 0x60, 0x23, + 0x00, 0x02, 0x60, 0x3c, 0x60, 0x0a, 0x20, 0x01, 0x19, 0x87, 0x20, 0x04, + 0x60, 0x1a, 0x60, 0x2c, 0x2c, 0x08, 0x20, 0x60, 0x60, 0x24, 0xd0, 0xb4, + 0x01, 0x08, 0xc0, 0x85, 0xc0, 0xb5, 0x60, 0x26, 0x21, 0x60, 0x20, 0x09, + 0x80, 0x20, 0x08, 0x0c, 0x96, 0x17, 0x00, 0x05, 0x00, 0xde, 0x00, 0xce, + 0x08, 0x0c, 0xbb, 0x5c, 0x08, 0x0c, 0x33, 0x15, 0x00, 0xe6, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x33, 0x44, 0x60, 0x17, 0x00, 0x00, + 0x60, 0x23, 0x00, 0x07, 0x60, 0x1b, 0x03, 0x98, 0x60, 0x4b, 0x00, 0x00, + 0x01, 0x2e, 0x00, 0xee, 0x00, 0x05, 0x08, 0x0c, 0xb5, 0xa8, 0x19, 0x04, + 0xce, 0x00, 0x00, 0x05, 0x60, 0x00, 0x90, 0x8a, 0x00, 0x10, 0x1a, 0x0c, + 0x0d, 0x85, 0x00, 0x96, 0x00, 0xd6, 0x00, 0x1b, 0x00, 0xde, 0x00, 0x9e, + 0x00, 0x05, 0xce, 0x6b, 0xce, 0x6b, 0xce, 0x6b, 0xce, 0x6b, 0xce, 0x6b, + 0xce, 0x6b, 0xce, 0x6b, 0xce, 0x6b, 0xce, 0x6b, 0xcb, 0xf9, 0xce, 0x6b, + 0xcb, 0xfe, 0xce, 0x6d, 0xcb, 0xfe, 0xce, 0x87, 0xce, 0x6b, 0x08, 0x0c, + 0x0d, 0x85, 0x60, 0x04, 0x90, 0x86, 0x00, 0x8b, 0x01, 0xb0, 0x60, 0x34, + 0x90, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0x91, 0x86, 0x00, 0x35, 0x11, 0x30, + 0x60, 0x2c, 0x90, 0x80, 0x00, 0x09, 0x20, 0x0c, 0xc1, 0x85, 0x21, 0x02, + 0x60, 0x07, 0x00, 0x8b, 0x60, 0x03, 0x00, 0x0d, 0x20, 0x09, 0x80, 0x20, + 0x08, 0x0c, 0x96, 0x17, 0x00, 0x05, 0x08, 0x0c, 0xd6, 0x39, 0x01, 0x18, + 0x08, 0x0c, 0xd6, 0x4c, 0x00, 0x10, 0x08, 0x0c, 0xd6, 0x5a, 0x08, 0x0c, + 0xd1, 0x0c, 0x08, 0x0c, 0xcf, 0x1b, 0x05, 0x70, 0x08, 0x0c, 0x33, 0x15, + 0x08, 0x0c, 0xcf, 0x1b, 0x01, 0x68, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x67, + 0x01, 0x03, 0xa8, 0x7b, 0x00, 0x06, 0xa8, 0x77, 0x00, 0x00, 0xa8, 0x80, + 0xc0, 0xed, 0xa8, 0x82, 0x08, 0x0c, 0x70, 0x12, 0x2c, 0x68, 0x08, 0x0c, + 0xb1, 0x16, 0x01, 0x50, 0x68, 0x10, 0x60, 0x12, 0x08, 0x0c, 0xd3, 0xb6, + 0x00, 0xc6, 0x2d, 0x60, 0x08, 0x0c, 0xb1, 0xa7, 0x00, 0xce, 0x00, 0x08, + 0x2d, 0x60, 0x60, 0x17, 0x00, 0x00, 0x60, 0x23, 0x00, 0x01, 0x60, 0x07, + 0x00, 0x01, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x96, 0x1e, 0x08, 0x0c, + 0x9a, 0xb3, 0x00, 0xc8, 0x08, 0x0c, 0xd6, 0x39, 0x01, 0x38, 0x60, 0x34, + 0x90, 0x86, 0x40, 0x00, 0x11, 0x18, 0x08, 0x0c, 0x33, 0x15, 0x08, 0xd0, + 0x60, 0x34, 0x90, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0x91, 0x86, 0x00, 0x39, + 0x01, 0x18, 0x91, 0x86, 0x00, 0x35, 0x11, 0x18, 0x08, 0x0c, 0x33, 0x15, + 0x08, 0x68, 0x08, 0x0c, 0xb1, 0xa7, 0x00, 0x05, 0x60, 0x00, 0x90, 0x8a, + 0x00, 0x10, 0x1a, 0x0c, 0x0d, 0x85, 0x00, 0x02, 0xce, 0xf2, 0xce, 0xf2, + 0xce, 0xfa, 0xce, 0xf4, 0xcf, 0x04, 0xce, 0xf2, 0xce, 0xf2, 0xb1, 0xa7, + 0xce, 0xf2, 0xce, 0xf2, 0xce, 0xf2, 0xce, 0xf2, 0xce, 0xf2, 0xce, 0xf2, + 0xce, 0xf2, 0xce, 0xf2, 0x08, 0x0c, 0x0d, 0x85, 0x08, 0x0c, 0xac, 0xfc, + 0x08, 0x0c, 0xae, 0xe3, 0x08, 0x0c, 0xad, 0x18, 0x61, 0x14, 0x00, 0x96, + 0x21, 0x48, 0xa8, 0x7b, 0x00, 0x06, 0x08, 0x0c, 0x70, 0x12, 0x00, 0x9e, + 0x08, 0x04, 0xb1, 0x6c, 0x60, 0x1c, 0xd0, 0x84, 0x19, 0x0c, 0x1a, 0xd3, + 0x0c, 0x88, 0x92, 0x84, 0x00, 0x03, 0x11, 0x58, 0x92, 0x82, 0x1d, 0xdc, + 0x02, 0x40, 0x20, 0x01, 0x18, 0x1a, 0x20, 0x04, 0x92, 0x02, 0x12, 0x18, + 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x90, 0x06, 0x0c, 0xe8, 0x00, 0x96, + 0x00, 0x28, 0x00, 0x96, 0x00, 0x06, 0x60, 0x14, 0x20, 0x48, 0x00, 0x0e, + 0x00, 0x06, 0x99, 0x84, 0xf0, 0x00, 0x90, 0x86, 0xf0, 0x00, 0x01, 0x10, + 0x08, 0x0c, 0x11, 0x04, 0x00, 0x0e, 0x00, 0x9e, 0x00, 0x05, 0x00, 0xe6, + 0x00, 0xc6, 0x00, 0x36, 0x00, 0x06, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x61, 0x1d, 0xdc, 0x20, 0x71, 0x18, 0x00, 0x73, 0x54, 0x70, 0x74, + 0x93, 0x02, 0x16, 0x40, 0x60, 0x20, 0x92, 0x06, 0x11, 0xf8, 0x08, 0x0c, + 0xd6, 0x45, 0x01, 0x80, 0x92, 0x86, 0x00, 0x01, 0x11, 0x68, 0x60, 0x04, + 0x90, 0x86, 0x00, 0x04, 0x11, 0x48, 0x08, 0x0c, 0x33, 0x15, 0x08, 0x0c, + 0xd6, 0x5a, 0x00, 0xc6, 0x08, 0x0c, 0xb1, 0xa7, 0x00, 0xce, 0x00, 0x60, + 0x08, 0x0c, 0xd3, 0x28, 0x01, 0x48, 0x08, 0x0c, 0xd1, 0x32, 0x11, 0x10, + 0x08, 0x0c, 0xbb, 0x5c, 0x00, 0xc6, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0xce, + 0x9c, 0xe0, 0x00, 0x1c, 0x70, 0x68, 0x9c, 0x02, 0x12, 0x08, 0x08, 0xa0, + 0x01, 0x2e, 0x00, 0x0e, 0x00, 0x3e, 0x00, 0xce, 0x00, 0xee, 0x00, 0x05, + 0x00, 0xe6, 0x00, 0xc6, 0x00, 0x16, 0x91, 0x88, 0x10, 0x00, 0x21, 0x0c, + 0x81, 0xff, 0x01, 0x28, 0x20, 0x61, 0x1b, 0x39, 0x61, 0x12, 0x08, 0x0c, + 0x33, 0x15, 0x90, 0x06, 0x00, 0x10, 0x90, 0x85, 0x00, 0x01, 0x00, 0x1e, + 0x00, 0xce, 0x00, 0xee, 0x00, 0x05, 0x00, 0xc6, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0xb1, 0x16, 0x01, 0xb0, 0x66, 0x5e, 0x2b, 0x00, + 0x60, 0x12, 0x08, 0x0c, 0x58, 0x48, 0x01, 0x18, 0x08, 0x0c, 0xd0, 0x4e, + 0x01, 0x68, 0x08, 0x0c, 0xd3, 0xb6, 0x60, 0x23, 0x00, 0x03, 0x20, 0x09, + 0x00, 0x4b, 0x08, 0x0c, 0xb2, 0x0a, 0x90, 0x85, 0x00, 0x01, 0x01, 0x2e, + 0x00, 0xce, 0x00, 0x05, 0x90, 0x06, 0x0c, 0xd8, 0x00, 0xc6, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0xba, 0xa0, 0x08, 0x0c, 0xb1, 0xdd, 0x05, 0x80, + 0x60, 0x5f, 0x00, 0x00, 0x2b, 0x00, 0x60, 0x12, 0x08, 0x0c, 0xd3, 0xb6, + 0x60, 0x23, 0x00, 0x03, 0x00, 0x16, 0x08, 0x0c, 0xac, 0xfc, 0x08, 0x0c, + 0x97, 0xb0, 0x00, 0x76, 0x90, 0x3e, 0x08, 0x0c, 0x96, 0x6d, 0x2c, 0x08, + 0x08, 0x0c, 0xe7, 0x5d, 0x00, 0x7e, 0x08, 0x0c, 0xad, 0x18, 0x00, 0x1e, + 0xd1, 0x84, 0x01, 0x28, 0x08, 0x0c, 0xb1, 0x6c, 0x90, 0x85, 0x00, 0x01, + 0x00, 0x70, 0x08, 0x0c, 0x58, 0x48, 0x01, 0x28, 0xd1, 0x8c, 0x11, 0x70, + 0x08, 0x0c, 0xd0, 0x4e, 0x01, 0x48, 0x20, 0x09, 0x00, 0x4c, 0x08, 0x0c, + 0xb2, 0x0a, 0x90, 0x85, 0x00, 0x01, 0x01, 0x2e, 0x00, 0xce, 0x00, 0x05, + 0x90, 0x06, 0x0c, 0xd8, 0x29, 0x00, 0x60, 0x16, 0x0c, 0x90, 0x20, 0x09, + 0x00, 0x4d, 0x00, 0x10, 0x20, 0x09, 0x00, 0x4e, 0x00, 0xf6, 0x00, 0xc6, + 0x00, 0x46, 0x00, 0x16, 0x08, 0x0c, 0xb1, 0x16, 0x2c, 0x78, 0x05, 0xa0, + 0x7e, 0x5e, 0x2b, 0x00, 0x78, 0x12, 0x78, 0x23, 0x00, 0x03, 0x00, 0x16, + 0x20, 0x21, 0x00, 0x05, 0x08, 0x0c, 0xd0, 0x60, 0x00, 0x1e, 0x91, 0x86, + 0x00, 0x4d, 0x01, 0x18, 0x91, 0x86, 0x00, 0x4e, 0x01, 0x48, 0x20, 0x01, + 0x19, 0x80, 0x20, 0x0c, 0xd1, 0xfc, 0x01, 0x68, 0x2f, 0x60, 0x08, 0x0c, + 0xb1, 0x6c, 0x00, 0xd0, 0x20, 0x01, 0x19, 0x7f, 0x20, 0x0c, 0xd1, 0xfc, + 0x01, 0x20, 0x2f, 0x60, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x88, 0x2f, 0x60, + 0x08, 0x0c, 0x58, 0x48, 0x01, 0x38, 0xd1, 0x8c, 0x11, 0x18, 0x04, 0xf1, + 0x01, 0x48, 0x00, 0x10, 0x29, 0x00, 0x78, 0x16, 0x00, 0x1e, 0x00, 0x16, + 0x08, 0x0c, 0xb2, 0x0a, 0x90, 0x85, 0x00, 0x01, 0x00, 0x1e, 0x00, 0x4e, + 0x00, 0xce, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xf6, 0x00, 0xc6, 0x00, 0x46, + 0x08, 0x0c, 0xb1, 0x16, 0x2c, 0x78, 0x05, 0x08, 0x7e, 0x5e, 0x2b, 0x00, + 0x78, 0x12, 0x78, 0x23, 0x00, 0x03, 0x00, 0x96, 0x20, 0x21, 0x00, 0x04, + 0x04, 0x89, 0x00, 0x9e, 0x20, 0x01, 0x19, 0x7e, 0x20, 0x0c, 0xd1, 0xfc, + 0x01, 0x20, 0x2f, 0x60, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x60, 0x2f, 0x60, + 0x08, 0x0c, 0x58, 0x48, 0x01, 0x20, 0xd1, 0x8c, 0x11, 0x60, 0x00, 0x71, + 0x01, 0x30, 0x20, 0x09, 0x00, 0x52, 0x08, 0x0c, 0xb2, 0x0a, 0x90, 0x85, + 0x00, 0x01, 0x00, 0x4e, 0x00, 0xce, 0x00, 0xfe, 0x00, 0x05, 0x29, 0x00, + 0x78, 0x16, 0x0c, 0x98, 0x00, 0xc6, 0x08, 0x0c, 0x4c, 0x41, 0x00, 0xce, + 0x11, 0x20, 0x08, 0x0c, 0xb1, 0x6c, 0x90, 0x06, 0x00, 0x05, 0xa8, 0x67, + 0x00, 0x00, 0xa8, 0x6b, 0x80, 0x00, 0x29, 0x00, 0x60, 0x16, 0x90, 0x85, + 0x00, 0x01, 0x00, 0x05, 0x00, 0x96, 0x00, 0x76, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0xac, 0xfc, 0x08, 0x0c, 0x69, 0x9d, 0x01, 0x58, + 0x20, 0x01, 0xd0, 0x67, 0x00, 0x06, 0x90, 0x0e, 0x24, 0x00, 0x08, 0x0c, + 0x72, 0x5e, 0x08, 0x0c, 0x70, 0x12, 0x00, 0x0e, 0x08, 0x07, 0x24, 0x18, + 0x08, 0x0c, 0x99, 0xb3, 0xba, 0xa0, 0x00, 0x86, 0x20, 0x41, 0x00, 0x01, + 0x20, 0x39, 0x00, 0x01, 0x26, 0x08, 0x08, 0x0c, 0x97, 0xca, 0x00, 0x8e, + 0x08, 0x0c, 0x96, 0x6d, 0x2f, 0x08, 0x26, 0x48, 0x08, 0x0c, 0xe7, 0x5d, + 0xb9, 0x3c, 0x81, 0xff, 0x09, 0x0c, 0x98, 0xa3, 0x08, 0x0c, 0xad, 0x18, + 0x01, 0x2e, 0x00, 0x7e, 0x00, 0x9e, 0x00, 0x05, 0x00, 0xc6, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0xb1, 0x16, 0x01, 0x90, 0x66, 0x0a, + 0x2b, 0x08, 0x61, 0x12, 0x08, 0x0c, 0xd3, 0xb6, 0x60, 0x23, 0x00, 0x01, + 0x29, 0x00, 0x60, 0x16, 0x20, 0x09, 0x00, 0x1f, 0x08, 0x0c, 0xb2, 0x0a, + 0x90, 0x85, 0x00, 0x01, 0x01, 0x2e, 0x00, 0xce, 0x00, 0x05, 0x90, 0x06, + 0x0c, 0xd8, 0x00, 0xc6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, + 0xb1, 0xdd, 0x01, 0xb8, 0x66, 0x0a, 0x2b, 0x08, 0x61, 0x12, 0x08, 0x0c, + 0xd3, 0xb6, 0x60, 0x23, 0x00, 0x08, 0x29, 0x00, 0x60, 0x16, 0x00, 0xf6, + 0x2c, 0x78, 0x08, 0x0c, 0x17, 0xad, 0x00, 0xfe, 0x20, 0x09, 0x00, 0x21, + 0x08, 0x0c, 0xb2, 0x0a, 0x90, 0x85, 0x00, 0x01, 0x01, 0x2e, 0x00, 0xce, + 0x00, 0x05, 0x90, 0x06, 0x0c, 0xd8, 0x20, 0x09, 0x00, 0x3d, 0x00, 0xc6, + 0x01, 0x26, 0x00, 0x16, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0xb1, 0x16, + 0x01, 0x98, 0x66, 0x0a, 0x2b, 0x08, 0x61, 0x12, 0x08, 0x0c, 0xd3, 0xb6, + 0x60, 0x23, 0x00, 0x01, 0x29, 0x00, 0x60, 0x16, 0x00, 0x1e, 0x00, 0x16, + 0x08, 0x0c, 0xb2, 0x0a, 0x90, 0x85, 0x00, 0x01, 0x00, 0x1e, 0x01, 0x2e, + 0x00, 0xce, 0x00, 0x05, 0x90, 0x06, 0x0c, 0xd0, 0x00, 0xc6, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0xb1, 0xdd, 0x01, 0x88, 0x2b, 0x08, + 0x61, 0x12, 0x08, 0x0c, 0xd3, 0xb6, 0x60, 0x23, 0x00, 0x01, 0x29, 0x00, + 0x60, 0x16, 0x20, 0x09, 0x00, 0x00, 0x08, 0x0c, 0xb2, 0x0a, 0x90, 0x85, + 0x00, 0x01, 0x01, 0x2e, 0x00, 0xce, 0x00, 0x05, 0x90, 0x06, 0x0c, 0xd8, + 0x20, 0x09, 0x00, 0x44, 0x08, 0x30, 0x20, 0x09, 0x00, 0x49, 0x08, 0x18, + 0x00, 0x26, 0x00, 0xb6, 0x62, 0x10, 0x22, 0x58, 0xba, 0x3c, 0x82, 0xff, + 0x01, 0x18, 0x82, 0x11, 0xba, 0x3e, 0x11, 0x40, 0xb8, 0xd0, 0x90, 0x05, + 0x01, 0x28, 0xb8, 0x88, 0x90, 0x05, 0x11, 0x10, 0xb8, 0x8b, 0x00, 0x01, + 0x00, 0xbe, 0x00, 0x2e, 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, 0x60, 0x04, + 0x90, 0x8e, 0x00, 0x02, 0x01, 0x40, 0x90, 0x8e, 0x00, 0x03, 0x01, 0x28, + 0x90, 0x8e, 0x00, 0x04, 0x01, 0x10, 0x90, 0x85, 0x00, 0x01, 0x00, 0x1e, + 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, 0x00, 0x86, 0x00, 0x96, 0x60, 0x20, + 0x90, 0x86, 0x00, 0x04, 0x01, 0xa8, 0x60, 0x14, 0x90, 0x4d, 0x08, 0x0c, + 0xcf, 0x1b, 0x01, 0x80, 0xa8, 0x64, 0x90, 0x86, 0x01, 0x39, 0x01, 0x70, + 0x60, 0x20, 0x90, 0xc6, 0x00, 0x03, 0x01, 0x40, 0x90, 0xc6, 0x00, 0x02, + 0x01, 0x28, 0xa8, 0x68, 0xd0, 0xfc, 0x01, 0x10, 0x90, 0x06, 0x00, 0x10, + 0x90, 0x85, 0x00, 0x01, 0x00, 0x9e, 0x00, 0x8e, 0x00, 0x0e, 0x00, 0x05, + 0x00, 0xc6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0xb1, 0xdd, + 0x01, 0x98, 0x2b, 0x08, 0x61, 0x12, 0x08, 0x0c, 0xd3, 0xb6, 0x60, 0x23, + 0x00, 0x01, 0x29, 0x00, 0x60, 0x16, 0x08, 0x0c, 0x33, 0x15, 0x20, 0x09, + 0x00, 0x28, 0x08, 0x0c, 0xb2, 0x0a, 0x90, 0x85, 0x00, 0x01, 0x01, 0x2e, + 0x00, 0xce, 0x00, 0x05, 0x90, 0x06, 0x0c, 0xd8, 0x91, 0x86, 0x00, 0x15, + 0x11, 0xa8, 0x20, 0x11, 0x18, 0x24, 0x22, 0x04, 0x90, 0x86, 0x00, 0x74, + 0x11, 0x78, 0x00, 0xb6, 0x08, 0x0c, 0xbe, 0x09, 0x00, 0xbe, 0x08, 0x0c, + 0xc0, 0x85, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x29, 0x08, 0x0c, + 0x96, 0x1e, 0x08, 0x0c, 0x9a, 0xb3, 0x00, 0x78, 0x60, 0x14, 0x00, 0x96, + 0x20, 0x48, 0xa8, 0x68, 0x00, 0x9e, 0xd0, 0xfc, 0x01, 0x48, 0x20, 0x01, + 0x00, 0x01, 0x08, 0x0c, 0xd5, 0x7c, 0x08, 0x0c, 0xbb, 0x5c, 0x08, 0x0c, + 0xb1, 0x6c, 0x00, 0x05, 0x00, 0x96, 0x60, 0x14, 0x90, 0x4d, 0x09, 0x0c, + 0x0d, 0x85, 0xa8, 0x7b, 0x00, 0x30, 0xa8, 0x83, 0x00, 0x00, 0xa8, 0x97, + 0x40, 0x05, 0xa8, 0x9b, 0x00, 0x04, 0xa8, 0x67, 0x01, 0x39, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x70, 0x12, 0x01, 0x2e, 0x00, 0x9e, + 0x08, 0x0c, 0xb1, 0x6c, 0x0c, 0x30, 0x00, 0x96, 0x91, 0x86, 0x00, 0x16, + 0x11, 0x28, 0x20, 0x01, 0x00, 0x04, 0x08, 0x0c, 0x66, 0xfa, 0x00, 0xe8, + 0x91, 0x86, 0x00, 0x15, 0x15, 0x10, 0x20, 0x11, 0x18, 0x24, 0x22, 0x04, + 0x90, 0x86, 0x00, 0x14, 0x11, 0xe0, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, + 0x08, 0x0c, 0x68, 0x4f, 0x00, 0xbe, 0x08, 0x0c, 0xc1, 0x5b, 0x11, 0x98, + 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x90, 0x00, 0xbe, 0x90, 0x05, + 0x01, 0x60, 0x20, 0x01, 0x00, 0x06, 0x08, 0x0c, 0x66, 0xfa, 0x60, 0x14, + 0x20, 0x48, 0xa8, 0x68, 0xd0, 0xfc, 0x01, 0x70, 0x08, 0x0c, 0xb5, 0x7c, + 0x00, 0x48, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x68, 0xd0, 0xfc, 0x05, 0x28, + 0x08, 0x0c, 0xbb, 0x5c, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x9e, 0x00, 0x05, + 0x60, 0x14, 0x63, 0x10, 0x23, 0x58, 0x90, 0x4d, 0x09, 0x0c, 0x0d, 0x85, + 0xa8, 0x7b, 0x00, 0x00, 0xa8, 0x83, 0x00, 0x00, 0xa8, 0x97, 0x40, 0x00, + 0x90, 0x0e, 0x08, 0x0c, 0x6a, 0xae, 0x11, 0x08, 0xc1, 0x85, 0xb8, 0x00, + 0xd0, 0xbc, 0x01, 0x08, 0xc1, 0x8d, 0xa9, 0x9a, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0x70, 0x12, 0x01, 0x2e, 0x08, 0x0c, 0xb1, 0x6c, + 0x08, 0xf8, 0x60, 0x14, 0x90, 0x4d, 0x09, 0x0c, 0x0d, 0x85, 0xa8, 0x7b, + 0x00, 0x30, 0xa8, 0x83, 0x00, 0x00, 0xa8, 0x97, 0x40, 0x05, 0xa8, 0x9b, + 0x00, 0x04, 0xa8, 0x67, 0x01, 0x39, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x08, 0x0c, 0x70, 0x12, 0x01, 0x2e, 0x08, 0x0c, 0xb1, 0x6c, 0x08, 0x40, + 0xa8, 0x78, 0x90, 0x86, 0x00, 0x05, 0x11, 0x08, 0x00, 0x09, 0x00, 0x05, + 0xa8, 0x80, 0xc0, 0xad, 0xa8, 0x82, 0x00, 0x05, 0x60, 0x4b, 0x00, 0x00, + 0x60, 0x17, 0x00, 0x00, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x50, + 0x20, 0x09, 0x80, 0x23, 0x08, 0x0c, 0x96, 0x17, 0x00, 0x05, 0x00, 0xc6, + 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x00, 0x00, 0xbe, 0xd0, 0xbc, + 0x01, 0x30, 0x00, 0x66, 0x60, 0x20, 0x90, 0x84, 0x00, 0x0f, 0x00, 0x1b, + 0x00, 0x6e, 0x00, 0xce, 0x00, 0x05, 0xcb, 0xf9, 0xd2, 0x59, 0xd2, 0x59, + 0xd2, 0x5c, 0xea, 0xdc, 0xea, 0xf7, 0xea, 0xfa, 0xcb, 0xf9, 0xcb, 0xf9, + 0xcb, 0xf9, 0xcb, 0xf9, 0xcb, 0xf9, 0xcb, 0xf9, 0xcb, 0xf9, 0xcb, 0xf9, + 0xcb, 0xf9, 0x08, 0x0c, 0x0d, 0x85, 0xa0, 0x01, 0xa0, 0x01, 0x00, 0x05, + 0x00, 0x96, 0x60, 0x14, 0x90, 0x4d, 0x01, 0x18, 0xa8, 0x7c, 0xd0, 0xe4, + 0x11, 0x10, 0x00, 0x9e, 0x00, 0x10, 0x00, 0x9e, 0x00, 0x05, 0x60, 0x10, + 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x00, 0x00, 0xbe, 0xd0, 0xbc, 0x05, 0x50, + 0x20, 0x01, 0x18, 0x34, 0x20, 0x04, 0x90, 0x05, 0x15, 0x40, 0x00, 0xf6, + 0x2c, 0x78, 0x08, 0x0c, 0xb1, 0x16, 0x05, 0x08, 0x78, 0x10, 0x60, 0x12, + 0x08, 0x0c, 0xd3, 0xb6, 0x78, 0x20, 0x90, 0x86, 0x00, 0x03, 0x01, 0x28, + 0x78, 0x08, 0x60, 0x3a, 0x2f, 0x00, 0x60, 0x3e, 0x00, 0x20, 0x78, 0x08, + 0x60, 0x3e, 0x2f, 0x00, 0x60, 0x3a, 0x60, 0x2e, 0x60, 0x23, 0x00, 0x01, + 0x60, 0x07, 0x00, 0x35, 0x60, 0x03, 0x00, 0x01, 0x79, 0x5c, 0x61, 0x5e, + 0x20, 0x09, 0x80, 0x20, 0x08, 0x0c, 0x96, 0x17, 0x2f, 0x60, 0x00, 0xfe, + 0x00, 0x05, 0x2f, 0x60, 0x00, 0xfe, 0x20, 0x01, 0x19, 0x88, 0x20, 0x04, + 0x60, 0x4a, 0x00, 0x05, 0x00, 0x16, 0x00, 0x96, 0x68, 0x14, 0x20, 0x48, + 0x68, 0x1c, 0xd0, 0xfc, 0xc0, 0xfc, 0x68, 0x1e, 0xa8, 0x7c, 0x11, 0x08, + 0xd0, 0xe4, 0x01, 0x80, 0xc0, 0xe4, 0xa8, 0x7e, 0xa8, 0x77, 0x00, 0x00, + 0xa8, 0x93, 0x00, 0x00, 0xa8, 0x8f, 0x00, 0x00, 0xd0, 0xcc, 0x01, 0x30, + 0xc0, 0xcc, 0xa8, 0x7e, 0xa8, 0x78, 0x20, 0x48, 0x08, 0x0c, 0x10, 0x0b, + 0x68, 0x30, 0x60, 0x36, 0x90, 0x8e, 0x00, 0x01, 0x01, 0x48, 0x68, 0x03, + 0x00, 0x02, 0x90, 0x86, 0x00, 0x05, 0x01, 0x70, 0x90, 0x06, 0x60, 0x2e, + 0x60, 0x32, 0x00, 0xd0, 0x68, 0x1c, 0xc0, 0x85, 0x68, 0x1e, 0x68, 0x03, + 0x00, 0x04, 0x68, 0x24, 0xc0, 0xf4, 0x90, 0x85, 0x0c, 0x00, 0x68, 0x26, + 0x68, 0x14, 0x20, 0x48, 0xa8, 0xac, 0x69, 0x38, 0x91, 0x02, 0xa8, 0xb0, + 0x69, 0x3c, 0x91, 0x03, 0x1e, 0x48, 0x68, 0x3c, 0x60, 0x2e, 0x68, 0x38, + 0x90, 0x84, 0xff, 0xfc, 0x68, 0x3a, 0x60, 0x32, 0x2d, 0x00, 0x60, 0x3a, + 0x68, 0x08, 0x60, 0x3e, 0x69, 0x10, 0x61, 0x12, 0x69, 0x5c, 0x61, 0x5e, + 0x60, 0x23, 0x00, 0x01, 0x60, 0x07, 0x00, 0x39, 0x60, 0x03, 0x00, 0x01, + 0x20, 0x09, 0x80, 0x20, 0x08, 0x0c, 0x96, 0x17, 0x00, 0x9e, 0x00, 0x1e, + 0x00, 0x05, 0x60, 0x24, 0xd0, 0xd4, 0x05, 0x10, 0xd0, 0xf4, 0x11, 0xf8, + 0x60, 0x38, 0x94, 0x0a, 0x60, 0x3c, 0x93, 0x03, 0x02, 0x30, 0x91, 0x05, + 0x01, 0x20, 0x60, 0x24, 0xc0, 0xd4, 0xc0, 0xf5, 0x00, 0x98, 0x64, 0x3a, + 0x63, 0x3e, 0xac, 0x3e, 0xab, 0x42, 0x00, 0x46, 0x00, 0x36, 0x24, 0x00, + 0xac, 0xac, 0x94, 0x02, 0xa8, 0x36, 0x23, 0x00, 0xab, 0xb0, 0x93, 0x03, + 0xa8, 0x3a, 0x00, 0x3e, 0x00, 0x4e, 0x60, 0x24, 0xc0, 0xd4, 0x00, 0x00, + 0x60, 0x26, 0x00, 0x05, 0xd0, 0xf4, 0x11, 0x38, 0xa8, 0x3c, 0x60, 0x3a, + 0xa8, 0x40, 0x60, 0x3e, 0x60, 0x24, 0xc0, 0xf5, 0x60, 0x26, 0x00, 0x05, + 0x00, 0x06, 0x00, 0x16, 0x60, 0x04, 0x90, 0x8e, 0x00, 0x34, 0x01, 0xb8, + 0x90, 0x8e, 0x00, 0x35, 0x01, 0xa0, 0x90, 0x8e, 0x00, 0x36, 0x01, 0x88, + 0x90, 0x8e, 0x00, 0x37, 0x01, 0x70, 0x90, 0x8e, 0x00, 0x38, 0x01, 0x58, + 0x90, 0x8e, 0x00, 0x39, 0x01, 0x40, 0x90, 0x8e, 0x00, 0x3a, 0x01, 0x28, + 0x90, 0x8e, 0x00, 0x3b, 0x01, 0x10, 0x90, 0x85, 0x00, 0x01, 0x00, 0x1e, + 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, + 0x00, 0xe6, 0x20, 0x01, 0x19, 0x82, 0x20, 0x0c, 0x80, 0x00, 0x20, 0x14, + 0x20, 0x01, 0x00, 0x32, 0x08, 0x0c, 0x95, 0x5b, 0x20, 0x01, 0x19, 0x86, + 0x82, 0xff, 0x11, 0x10, 0x20, 0x11, 0x00, 0x14, 0x22, 0x02, 0x20, 0x01, + 0x19, 0x84, 0x20, 0x0c, 0x80, 0x00, 0x20, 0x14, 0x20, 0x71, 0x19, 0x6c, + 0x71, 0x1a, 0x72, 0x1e, 0x20, 0x01, 0x00, 0x64, 0x08, 0x0c, 0x95, 0x5b, + 0x20, 0x01, 0x19, 0x87, 0x82, 0xff, 0x11, 0x10, 0x20, 0x11, 0x00, 0x14, + 0x22, 0x02, 0x20, 0x01, 0x19, 0x88, 0x92, 0x88, 0x00, 0x0a, 0x21, 0x02, + 0x20, 0x01, 0x00, 0x17, 0x08, 0x0c, 0xac, 0xed, 0x20, 0x01, 0x1a, 0x90, + 0x21, 0x02, 0x20, 0x01, 0x00, 0x32, 0x08, 0x0c, 0x16, 0xb9, 0x08, 0x0c, + 0x6b, 0xf2, 0x00, 0xee, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x0e, + 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, 0x00, 0xe6, 0x20, 0x01, 0x19, 0x86, + 0x20, 0x03, 0x00, 0x28, 0x20, 0x01, 0x19, 0x87, 0x20, 0x03, 0x00, 0x14, + 0x20, 0x71, 0x19, 0x6c, 0x70, 0x1b, 0x00, 0x00, 0x70, 0x1f, 0x07, 0xd0, + 0x20, 0x01, 0x19, 0x88, 0x20, 0x09, 0x00, 0x1e, 0x21, 0x02, 0x20, 0x01, + 0x00, 0x17, 0x08, 0x0c, 0xac, 0xed, 0x20, 0x01, 0x1a, 0x90, 0x21, 0x02, + 0x20, 0x01, 0x00, 0x32, 0x08, 0x0c, 0x16, 0xb9, 0x00, 0xee, 0x00, 0x1e, + 0x00, 0x0e, 0x00, 0x05, 0x00, 0x96, 0x60, 0x60, 0x90, 0x4d, 0x01, 0x10, + 0x08, 0x0c, 0x10, 0x8b, 0x00, 0x9e, 0x00, 0x05, 0x00, 0x05, 0x00, 0xc6, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0xb1, 0x16, 0x01, 0x80, + 0x2b, 0x08, 0x61, 0x12, 0x0c, 0xa9, 0x60, 0x23, 0x00, 0x01, 0x29, 0x00, + 0x60, 0x16, 0x20, 0x09, 0x00, 0x33, 0x08, 0x0c, 0xb2, 0x0a, 0x90, 0x85, + 0x00, 0x01, 0x01, 0x2e, 0x00, 0xce, 0x00, 0x05, 0x90, 0x06, 0x0c, 0xd8, + 0x00, 0x96, 0x00, 0xe6, 0x00, 0xf6, 0x20, 0x71, 0x18, 0x00, 0x91, 0x86, + 0x00, 0x15, 0x15, 0x20, 0x70, 0x90, 0x90, 0x86, 0x00, 0x18, 0x01, 0x20, + 0x70, 0x90, 0x90, 0x86, 0x00, 0x14, 0x11, 0xe0, 0x60, 0x14, 0x20, 0x48, + 0xaa, 0x3c, 0xd2, 0xe4, 0x11, 0x60, 0x2c, 0x78, 0x08, 0x0c, 0x9b, 0x83, + 0x01, 0xd8, 0x70, 0x7c, 0xaa, 0x50, 0x92, 0x06, 0x11, 0x60, 0x70, 0x80, + 0xaa, 0x54, 0x92, 0x06, 0x11, 0x40, 0x62, 0x10, 0x00, 0xb6, 0x22, 0x58, + 0xba, 0xa0, 0x00, 0xbe, 0x90, 0x0e, 0x08, 0x0c, 0x33, 0x64, 0x08, 0x0c, + 0xb5, 0x7c, 0x00, 0x20, 0x08, 0x0c, 0xbb, 0x5c, 0x08, 0x0c, 0xb1, 0x6c, + 0x00, 0xfe, 0x00, 0xee, 0x00, 0x9e, 0x00, 0x05, 0x70, 0x60, 0xaa, 0x54, + 0x92, 0x06, 0x0d, 0x48, 0x0c, 0x80, 0x00, 0xc6, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x08, 0x0c, 0xb1, 0x16, 0x01, 0x88, 0x2b, 0x08, 0x61, 0x12, + 0x08, 0x0c, 0xd3, 0xb6, 0x60, 0x23, 0x00, 0x01, 0x29, 0x00, 0x60, 0x16, + 0x20, 0x09, 0x00, 0x4d, 0x08, 0x0c, 0xb2, 0x0a, 0x90, 0x85, 0x00, 0x01, + 0x01, 0x2e, 0x00, 0xce, 0x00, 0x05, 0x90, 0x06, 0x0c, 0xd8, 0x00, 0xc6, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x00, 0x16, 0x08, 0x0c, 0xb1, 0x16, + 0x01, 0x80, 0x2b, 0x08, 0x61, 0x12, 0x08, 0x0c, 0xd3, 0xb6, 0x60, 0x23, + 0x00, 0x01, 0x29, 0x00, 0x60, 0x16, 0x00, 0x1e, 0x08, 0x0c, 0xb2, 0x0a, + 0x90, 0x85, 0x00, 0x01, 0x01, 0x2e, 0x00, 0xce, 0x00, 0x05, 0x00, 0x1e, + 0x90, 0x06, 0x0c, 0xd0, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x00, 0x46, + 0x00, 0x56, 0x00, 0x66, 0x00, 0x96, 0x00, 0xe6, 0x00, 0xf6, 0x20, 0x71, + 0x18, 0x00, 0x91, 0x86, 0x00, 0x15, 0x15, 0x68, 0x71, 0x90, 0x60, 0x14, + 0x20, 0x48, 0xa8, 0x14, 0x80, 0x03, 0x91, 0x06, 0x15, 0x30, 0x20, 0xe1, + 0x00, 0x00, 0x20, 0x01, 0x19, 0xa1, 0x20, 0x03, 0x00, 0x00, 0x60, 0x14, + 0x20, 0x48, 0xa8, 0x30, 0x20, 0xa8, 0x89, 0x06, 0x80, 0x06, 0x80, 0x07, + 0x90, 0x94, 0x00, 0x3f, 0x22, 0xe8, 0x90, 0x84, 0xff, 0xc0, 0x90, 0x80, + 0x00, 0x1b, 0x20, 0xa0, 0x20, 0x01, 0x19, 0xa1, 0x00, 0x16, 0x20, 0x0c, + 0x08, 0x0c, 0xdc, 0xa1, 0x00, 0x1e, 0xa8, 0x04, 0x90, 0x05, 0x01, 0x10, + 0x20, 0x48, 0x0c, 0x38, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x67, 0x01, 0x03, + 0x00, 0x10, 0x08, 0x0c, 0xbb, 0x5c, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0xfe, + 0x00, 0xee, 0x00, 0x9e, 0x00, 0x6e, 0x00, 0x5e, 0x00, 0x4e, 0x00, 0x3e, + 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0x96, 0x00, 0xe6, 0x00, 0xf6, + 0x20, 0x71, 0x18, 0x00, 0x91, 0x86, 0x00, 0x15, 0x11, 0xb8, 0x70, 0x90, + 0x90, 0x86, 0x00, 0x04, 0x11, 0x98, 0x60, 0x14, 0x20, 0x48, 0x2c, 0x78, + 0x08, 0x0c, 0x9b, 0x83, 0x01, 0xa8, 0x70, 0x7c, 0xaa, 0x74, 0x92, 0x06, + 0x11, 0x30, 0x70, 0x80, 0xaa, 0x78, 0x92, 0x06, 0x11, 0x10, 0x08, 0x0c, + 0x33, 0x15, 0x08, 0x0c, 0xb5, 0x7c, 0x00, 0x20, 0x08, 0x0c, 0xbb, 0x5c, + 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0xfe, 0x00, 0xee, 0x00, 0x9e, 0x00, 0x05, + 0x70, 0x60, 0xaa, 0x78, 0x92, 0x06, 0x0d, 0x78, 0x0c, 0x80, 0x00, 0x96, + 0x00, 0xe6, 0x00, 0xf6, 0x20, 0x71, 0x18, 0x00, 0x91, 0x86, 0x00, 0x15, + 0x15, 0x50, 0x70, 0x90, 0x90, 0x86, 0x00, 0x04, 0x15, 0x30, 0x60, 0x14, + 0x20, 0x48, 0x2c, 0x78, 0x08, 0x0c, 0x9b, 0x83, 0x05, 0xf0, 0x70, 0x7c, + 0xaa, 0xcc, 0x92, 0x06, 0x11, 0x80, 0x70, 0x80, 0xaa, 0xd0, 0x92, 0x06, + 0x11, 0x60, 0x08, 0x0c, 0x33, 0x15, 0x00, 0x16, 0xa9, 0x98, 0xaa, 0xb0, + 0x92, 0x84, 0x10, 0x00, 0xc0, 0xfd, 0x08, 0x0c, 0x57, 0xe9, 0x00, 0x1e, + 0x00, 0x10, 0x08, 0x0c, 0x55, 0xcc, 0x08, 0x0c, 0xcf, 0x1b, 0x05, 0x08, + 0xa8, 0x7b, 0x00, 0x00, 0xa8, 0x83, 0x00, 0x00, 0xa8, 0x97, 0x40, 0x00, + 0x00, 0x80, 0x08, 0x0c, 0xcf, 0x1b, 0x01, 0xb8, 0x60, 0x14, 0x20, 0x48, + 0x08, 0x0c, 0x55, 0xcc, 0x1d, 0x70, 0xa8, 0x7b, 0x00, 0x30, 0xa8, 0x83, + 0x00, 0x00, 0xa8, 0x97, 0x40, 0x05, 0xa8, 0x9b, 0x00, 0x04, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0xa8, 0x67, 0x01, 0x39, 0x08, 0x0c, 0x70, 0x12, + 0x01, 0x2e, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0xfe, 0x00, 0xee, 0x00, 0x9e, + 0x00, 0x05, 0x70, 0x60, 0xaa, 0xd0, 0x92, 0x06, 0x09, 0x30, 0x08, 0x88, + 0x00, 0x16, 0x00, 0x26, 0xa8, 0x7c, 0xd0, 0xac, 0x01, 0x78, 0xa9, 0x38, + 0xaa, 0x34, 0x21, 0x00, 0x92, 0x05, 0x01, 0x50, 0xa8, 0x90, 0x91, 0x06, + 0x11, 0x18, 0xa8, 0x8c, 0x92, 0x06, 0x01, 0x20, 0xa9, 0x92, 0xaa, 0x8e, + 0x90, 0x85, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xb6, + 0x00, 0xd6, 0x00, 0x36, 0x08, 0x0c, 0xcf, 0x1b, 0x09, 0x04, 0xd5, 0x78, + 0x00, 0x96, 0x63, 0x14, 0x23, 0x48, 0xa8, 0x7a, 0xa9, 0x82, 0x92, 0x9e, + 0x40, 0x00, 0x15, 0x80, 0x63, 0x10, 0x00, 0xc6, 0x23, 0x58, 0x20, 0x09, + 0x00, 0x00, 0xa8, 0x68, 0xd0, 0xf4, 0x11, 0x40, 0x08, 0x0c, 0x6a, 0xae, + 0x11, 0x08, 0xc1, 0x85, 0xb8, 0x00, 0xd0, 0xbc, 0x01, 0x08, 0xc1, 0x8d, + 0xaa, 0x96, 0xa9, 0x9a, 0x20, 0xa9, 0x00, 0x04, 0xa8, 0x60, 0x20, 0xe8, + 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x31, 0x20, 0xa0, 0xb8, 0xc4, 0x20, 0xe0, + 0xb8, 0xc8, 0x90, 0x80, 0x00, 0x06, 0x20, 0x98, 0x08, 0x0c, 0x0f, 0xd6, + 0x20, 0xa9, 0x00, 0x04, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x35, 0x20, 0xa0, + 0xb8, 0xc8, 0x90, 0x80, 0x00, 0x0a, 0x20, 0x98, 0x08, 0x0c, 0x0f, 0xd6, + 0x00, 0xce, 0x00, 0x90, 0xaa, 0x96, 0x39, 0x18, 0x93, 0x98, 0x00, 0x07, + 0x23, 0x1c, 0x60, 0x04, 0x90, 0x86, 0x00, 0x16, 0x01, 0x10, 0xa8, 0x9b, + 0x00, 0x04, 0xab, 0xa2, 0x63, 0x10, 0x23, 0x58, 0xb8, 0x04, 0x90, 0x84, + 0x00, 0xff, 0xa8, 0x9e, 0xa8, 0x68, 0xc0, 0xf4, 0xa8, 0x6a, 0x08, 0x0c, + 0x70, 0x06, 0x60, 0x17, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x3e, 0x00, 0xde, + 0x00, 0xbe, 0x00, 0x05, 0x00, 0x26, 0x00, 0x36, 0x00, 0x46, 0x00, 0xb6, + 0x00, 0x96, 0x00, 0xf6, 0x62, 0x14, 0x22, 0x48, 0x62, 0x10, 0x22, 0x58, + 0x20, 0x79, 0x02, 0x60, 0x90, 0x96, 0x00, 0x00, 0x11, 0xa0, 0xb8, 0x14, + 0x90, 0x84, 0x00, 0xff, 0x90, 0x0e, 0x08, 0x0c, 0x26, 0x8c, 0x21, 0x18, + 0x83, 0x1f, 0x93, 0x9c, 0xff, 0x00, 0x78, 0x38, 0x90, 0x84, 0x00, 0xff, + 0x93, 0x1d, 0x7c, 0x3c, 0x20, 0x11, 0x80, 0x18, 0x08, 0x0c, 0x4c, 0xa1, + 0x00, 0xa8, 0x90, 0x96, 0x00, 0x01, 0x11, 0x48, 0x89, 0xff, 0x01, 0x80, + 0xa8, 0x9b, 0x00, 0x0d, 0x78, 0x38, 0xa8, 0xa6, 0x78, 0x3c, 0xa8, 0xaa, + 0x00, 0x48, 0x90, 0x96, 0x00, 0x02, 0x11, 0x30, 0xa8, 0x9b, 0x00, 0x0d, + 0x78, 0x38, 0xa8, 0xa6, 0x78, 0x3c, 0xa8, 0xaa, 0x00, 0xfe, 0x00, 0x9e, + 0x00, 0xbe, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x05, 0x00, 0xc6, + 0x00, 0x26, 0x00, 0x16, 0x91, 0x86, 0x00, 0x35, 0x01, 0x10, 0x6a, 0x38, + 0x00, 0x08, 0x6a, 0x2c, 0x08, 0x0c, 0xcf, 0x09, 0x01, 0xf0, 0x22, 0x60, + 0x61, 0x20, 0x91, 0x86, 0x00, 0x03, 0x01, 0x18, 0x91, 0x86, 0x00, 0x06, + 0x11, 0x90, 0x68, 0x38, 0x92, 0x06, 0x01, 0x40, 0x68, 0x3c, 0x92, 0x06, + 0x11, 0x60, 0x61, 0x08, 0x68, 0x38, 0x91, 0x06, 0x11, 0x40, 0x00, 0x20, + 0x60, 0x08, 0x69, 0x3c, 0x91, 0x06, 0x11, 0x18, 0x60, 0x10, 0x69, 0x10, + 0x91, 0x06, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0xce, 0x00, 0x05, 0x90, 0x85, + 0x00, 0x01, 0x0c, 0xc8, 0xa9, 0x74, 0xd1, 0xcc, 0x01, 0x98, 0x91, 0x8c, + 0x00, 0xff, 0x91, 0x8e, 0x00, 0x02, 0x11, 0x70, 0xa9, 0xa8, 0x91, 0x8c, + 0x00, 0x0f, 0x91, 0x8e, 0x00, 0x01, 0x11, 0x40, 0xa8, 0x7c, 0xd0, 0xac, + 0x01, 0x28, 0xa8, 0x34, 0xa9, 0x38, 0x91, 0x15, 0x19, 0x0c, 0xc5, 0x19, + 0x00, 0x05, 0x00, 0x36, 0x20, 0x19, 0x00, 0x01, 0x00, 0x10, 0x00, 0x36, + 0x90, 0x1e, 0x04, 0x99, 0x01, 0xe0, 0x08, 0x0c, 0xcf, 0x1b, 0x01, 0xc8, + 0x08, 0x0c, 0xd1, 0x0c, 0x60, 0x37, 0x40, 0x00, 0x60, 0x14, 0x60, 0x17, + 0x00, 0x00, 0x00, 0x96, 0x20, 0x48, 0xa8, 0x7c, 0x08, 0x0c, 0xd1, 0x32, + 0x11, 0x18, 0x08, 0x0c, 0xbb, 0x5c, 0x00, 0x40, 0xa8, 0x67, 0x01, 0x03, + 0xa8, 0x77, 0x00, 0x00, 0x83, 0xff, 0x11, 0x29, 0x08, 0x0c, 0x70, 0x12, + 0x00, 0x9e, 0x00, 0x3e, 0x00, 0x05, 0xa8, 0x80, 0xd0, 0xb4, 0x01, 0x28, + 0xa8, 0x7b, 0x00, 0x06, 0xc0, 0xec, 0xa8, 0x82, 0x00, 0x48, 0xd0, 0xbc, + 0x01, 0x18, 0xa8, 0x7b, 0x00, 0x02, 0x00, 0x20, 0xa8, 0x7b, 0x00, 0x05, + 0x08, 0x0c, 0xd2, 0x26, 0xa8, 0x77, 0x00, 0x00, 0x00, 0x05, 0x20, 0x01, + 0x18, 0x10, 0x20, 0x04, 0xd0, 0xec, 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, + 0x18, 0x10, 0x20, 0x04, 0xd0, 0xf4, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, + 0x20, 0x01, 0x18, 0x10, 0x20, 0x04, 0xd0, 0xe4, 0x00, 0x0e, 0x00, 0x05, + 0x00, 0x36, 0x00, 0x46, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xbb, 0xa0, + 0x00, 0xbe, 0x20, 0x21, 0x00, 0x07, 0x08, 0x0c, 0x4e, 0x58, 0x00, 0x4e, + 0x00, 0x3e, 0x00, 0x05, 0x0c, 0x51, 0x1d, 0x81, 0x00, 0x05, 0x20, 0x01, + 0x19, 0x86, 0x20, 0x04, 0x60, 0x1a, 0x00, 0x05, 0x20, 0x01, 0x19, 0x88, + 0x20, 0x04, 0x60, 0x4a, 0x00, 0x05, 0x08, 0x0c, 0xb1, 0x6c, 0x08, 0x04, + 0x9a, 0xb3, 0x61, 0x1c, 0xd1, 0xfc, 0xa9, 0x7c, 0x11, 0x08, 0xd1, 0xe4, + 0x00, 0x05, 0x60, 0x1c, 0xd0, 0xfc, 0xa8, 0x7c, 0x11, 0x08, 0xd0, 0xe4, + 0x00, 0x05, 0x60, 0x1c, 0xd0, 0xfc, 0xc0, 0xfc, 0x60, 0x1e, 0xa8, 0x7c, + 0x11, 0x08, 0xd0, 0xe4, 0x00, 0x05, 0x60, 0x44, 0xd0, 0xfc, 0x11, 0x38, + 0xd0, 0xbc, 0x01, 0xa0, 0xc0, 0xbc, 0x60, 0x46, 0x20, 0x01, 0x00, 0x02, + 0x00, 0x80, 0xd0, 0xac, 0x11, 0x68, 0xd0, 0xdc, 0x11, 0x28, 0x90, 0x8c, + 0x00, 0x0f, 0x91, 0x86, 0x00, 0x05, 0x11, 0x18, 0x20, 0x01, 0x00, 0x03, + 0x00, 0x20, 0x20, 0x01, 0x00, 0x01, 0x00, 0x08, 0x60, 0x00, 0x00, 0x05, + 0x00, 0xb6, 0x00, 0x66, 0x60, 0x00, 0x90, 0xb2, 0x00, 0x10, 0x1a, 0x0c, + 0x0d, 0x85, 0x00, 0x1b, 0x00, 0x6e, 0x00, 0xbe, 0x00, 0x05, 0xd6, 0xb5, + 0xdd, 0xfe, 0xdf, 0x62, 0xd6, 0xb5, 0xd6, 0xb5, 0xd6, 0xb5, 0xd6, 0xb5, + 0xd6, 0xb5, 0xd6, 0xec, 0xdf, 0xe6, 0xd6, 0xb5, 0xd6, 0xb5, 0xd6, 0xb5, + 0xd6, 0xb5, 0xd6, 0xb5, 0xd6, 0xb5, 0x08, 0x0c, 0x0d, 0x85, 0x00, 0x66, + 0x60, 0x00, 0x90, 0xb2, 0x00, 0x10, 0x1a, 0x0c, 0x0d, 0x85, 0x00, 0x13, + 0x00, 0x6e, 0x00, 0x05, 0xd6, 0xd0, 0xe5, 0x0b, 0xd6, 0xd0, 0xd6, 0xd0, + 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, 0xd0, 0xe4, 0xba, 0xe5, 0x5d, + 0xd6, 0xd0, 0xec, 0x10, 0xec, 0x44, 0xec, 0x10, 0xec, 0x44, 0xd6, 0xd0, + 0x08, 0x0c, 0x0d, 0x85, 0x60, 0x00, 0x90, 0x82, 0x00, 0x10, 0x1a, 0x0c, + 0x0d, 0x85, 0x60, 0x00, 0x00, 0x0a, 0x00, 0x05, 0xd6, 0xea, 0xe1, 0xc3, + 0xe2, 0x8e, 0xe2, 0xb1, 0xe3, 0x2d, 0xd6, 0xea, 0xe4, 0x2a, 0xe3, 0xb5, + 0xdf, 0xf0, 0xe4, 0x92, 0xe4, 0xa7, 0xd6, 0xea, 0xd6, 0xea, 0xd6, 0xea, + 0xd6, 0xea, 0xd6, 0xea, 0x08, 0x0c, 0x0d, 0x85, 0x91, 0xb2, 0x00, 0x53, + 0x1a, 0x0c, 0x0d, 0x85, 0x21, 0x00, 0x91, 0xb2, 0x00, 0x40, 0x1a, 0x04, + 0xdb, 0x70, 0x00, 0x02, 0xd7, 0x36, 0xd9, 0x3e, 0xd7, 0x36, 0xd7, 0x36, + 0xd7, 0x36, 0xd9, 0x47, 0xd7, 0x36, 0xd7, 0x36, 0xd7, 0x36, 0xd7, 0x36, + 0xd7, 0x36, 0xd7, 0x36, 0xd7, 0x36, 0xd7, 0x36, 0xd7, 0x36, 0xd7, 0x36, + 0xd7, 0x36, 0xd7, 0x36, 0xd7, 0x36, 0xd7, 0x36, 0xd7, 0x36, 0xd7, 0x36, + 0xd7, 0x36, 0xd7, 0x38, 0xd7, 0x9f, 0xd7, 0xae, 0xd8, 0x12, 0xd8, 0x3d, + 0xd8, 0xb6, 0xd9, 0x29, 0xd7, 0x36, 0xd7, 0x36, 0xd9, 0x4a, 0xd7, 0x36, + 0xd7, 0x36, 0xd9, 0x5f, 0xd9, 0x6c, 0xd7, 0x36, 0xd7, 0x36, 0xd7, 0x36, + 0xd7, 0x36, 0xd7, 0x36, 0xda, 0x12, 0xd7, 0x36, 0xd7, 0x36, 0xda, 0x26, + 0xd7, 0x36, 0xd7, 0x36, 0xd9, 0xe1, 0xd7, 0x36, 0xd7, 0x36, 0xd7, 0x36, + 0xda, 0x3e, 0xd7, 0x36, 0xd7, 0x36, 0xd7, 0x36, 0xda, 0xbb, 0xd7, 0x36, + 0xd7, 0x36, 0xd7, 0x36, 0xd7, 0x36, 0xd7, 0x36, 0xd7, 0x36, 0xdb, 0x38, + 0x08, 0x0c, 0x0d, 0x85, 0x08, 0x0c, 0x6b, 0xcf, 0x11, 0x50, 0x20, 0x01, + 0x18, 0x37, 0x20, 0x04, 0xd0, 0xcc, 0x11, 0x28, 0x90, 0x84, 0x00, 0x09, + 0x90, 0x86, 0x00, 0x08, 0x11, 0x40, 0x60, 0x07, 0x00, 0x09, 0x60, 0x2f, + 0x00, 0x09, 0x60, 0x17, 0x00, 0x00, 0x08, 0x04, 0xd9, 0x37, 0x08, 0x0c, + 0x6b, 0x6b, 0x00, 0xe6, 0x00, 0xc6, 0x00, 0x36, 0x00, 0x26, 0x00, 0x16, + 0x62, 0x10, 0x22, 0x58, 0xba, 0xa0, 0x00, 0x26, 0x20, 0x19, 0x00, 0x29, + 0x08, 0x0c, 0xac, 0xfc, 0x08, 0x0c, 0x97, 0xb0, 0x00, 0x76, 0x90, 0x3e, + 0x08, 0x0c, 0x96, 0x6d, 0x2c, 0x08, 0x08, 0x0c, 0xe7, 0x5d, 0x00, 0x7e, + 0x00, 0x1e, 0x08, 0x0c, 0xad, 0x18, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x3e, + 0x00, 0xce, 0x00, 0xee, 0x66, 0x10, 0x26, 0x58, 0x08, 0x0c, 0x67, 0xc3, + 0xbe, 0x04, 0x96, 0x84, 0x00, 0xff, 0x90, 0x82, 0x00, 0x06, 0x12, 0x68, + 0x00, 0x16, 0x00, 0x26, 0x62, 0x10, 0x00, 0xb6, 0x22, 0x58, 0xba, 0xa0, + 0x00, 0xbe, 0x2c, 0x08, 0x08, 0x0c, 0xee, 0x6f, 0x00, 0x2e, 0x00, 0x1e, + 0x11, 0x78, 0x08, 0x0c, 0xe6, 0x8b, 0x19, 0x04, 0xd8, 0x0a, 0x08, 0x0c, + 0xe6, 0x27, 0x11, 0x20, 0x60, 0x07, 0x00, 0x08, 0x08, 0x04, 0xd9, 0x37, + 0x60, 0x07, 0x00, 0x09, 0x08, 0x04, 0xd9, 0x37, 0x08, 0x0c, 0xe9, 0x05, + 0x01, 0x28, 0x08, 0x0c, 0xe6, 0x8b, 0x0d, 0x78, 0x08, 0x04, 0xd8, 0x0a, + 0x60, 0x17, 0x19, 0x00, 0x0c, 0x88, 0x08, 0x0c, 0x34, 0x4c, 0x19, 0x04, + 0xdb, 0x6d, 0x61, 0x06, 0x08, 0x0c, 0xe5, 0xc7, 0x60, 0x07, 0x00, 0x06, + 0x08, 0x04, 0xd9, 0x37, 0x60, 0x07, 0x00, 0x07, 0x08, 0x04, 0xd9, 0x37, + 0x08, 0x0c, 0xec, 0x80, 0x19, 0x04, 0xdb, 0x6d, 0x08, 0x0c, 0x34, 0x4c, + 0x19, 0x04, 0xdb, 0x6d, 0x00, 0xd6, 0x66, 0x10, 0x26, 0x58, 0xbe, 0x04, + 0x96, 0x84, 0x00, 0xff, 0x90, 0x82, 0x00, 0x06, 0x12, 0x20, 0x20, 0x01, + 0x00, 0x01, 0x08, 0x0c, 0x66, 0xe6, 0x96, 0xb4, 0xff, 0x00, 0x86, 0x37, + 0x96, 0x86, 0x00, 0x06, 0x01, 0x88, 0x96, 0x86, 0x00, 0x04, 0x01, 0x70, + 0xbe, 0x04, 0x96, 0xb4, 0x00, 0xff, 0x96, 0x86, 0x00, 0x06, 0x01, 0x40, + 0x96, 0x86, 0x00, 0x04, 0x01, 0x28, 0x96, 0x86, 0x00, 0x05, 0x01, 0x10, + 0x00, 0xde, 0x04, 0x80, 0x00, 0xe6, 0x20, 0x71, 0x02, 0x60, 0x70, 0x34, + 0x90, 0x84, 0x00, 0x03, 0x11, 0x40, 0x70, 0x34, 0x90, 0x82, 0x00, 0x14, + 0x02, 0x20, 0x70, 0x30, 0x90, 0x84, 0x00, 0x03, 0x01, 0x30, 0x00, 0xee, + 0x60, 0x17, 0x00, 0x00, 0x60, 0x2f, 0x00, 0x07, 0x00, 0xb0, 0x00, 0xee, + 0x08, 0x0c, 0xe6, 0xf3, 0x11, 0x90, 0x96, 0x86, 0x00, 0x06, 0x11, 0x40, + 0x00, 0x26, 0x62, 0x10, 0x22, 0x58, 0xba, 0xa0, 0x90, 0x0e, 0x08, 0x0c, + 0x33, 0x64, 0x00, 0x2e, 0x08, 0x0c, 0x68, 0x4f, 0x60, 0x07, 0x00, 0x0a, + 0x00, 0xde, 0x08, 0x04, 0xd9, 0x37, 0x60, 0x07, 0x00, 0x0b, 0x00, 0xde, + 0x08, 0x04, 0xd9, 0x37, 0x08, 0x0c, 0x33, 0x15, 0x08, 0x0c, 0xd6, 0x5a, + 0x60, 0x07, 0x00, 0x01, 0x08, 0x04, 0xd9, 0x37, 0x08, 0x0c, 0xec, 0x80, + 0x19, 0x04, 0xdb, 0x6d, 0x08, 0x0c, 0x34, 0x4c, 0x19, 0x04, 0xdb, 0x6d, + 0x20, 0x71, 0x02, 0x60, 0x70, 0x34, 0x90, 0xb4, 0x00, 0x03, 0x19, 0x48, + 0x90, 0xb2, 0x00, 0x14, 0x0a, 0x30, 0x70, 0x30, 0x90, 0x84, 0x00, 0x03, + 0x19, 0x10, 0x66, 0x10, 0x26, 0x58, 0xbe, 0x04, 0x96, 0x86, 0x07, 0x07, + 0x09, 0xe8, 0x00, 0x26, 0x62, 0x10, 0x22, 0x58, 0xba, 0xa0, 0x90, 0x0e, + 0x08, 0x0c, 0x33, 0x64, 0x00, 0x2e, 0x60, 0x07, 0x00, 0x0c, 0x20, 0x01, + 0x00, 0x01, 0x08, 0x0c, 0xee, 0x4e, 0x08, 0x04, 0xd9, 0x37, 0x08, 0x0c, + 0x6b, 0xcf, 0x11, 0x40, 0x20, 0x01, 0x18, 0x37, 0x20, 0x04, 0x90, 0x84, + 0x00, 0x09, 0x90, 0x86, 0x00, 0x08, 0x11, 0x10, 0x08, 0x04, 0xd7, 0x45, + 0x08, 0x0c, 0x6b, 0x6b, 0x66, 0x10, 0x26, 0x58, 0xbe, 0x04, 0x96, 0x84, + 0x00, 0xff, 0x90, 0x82, 0x00, 0x06, 0x06, 0xc8, 0x11, 0x38, 0x00, 0x26, + 0x20, 0x01, 0x00, 0x06, 0x08, 0x0c, 0x67, 0x26, 0x00, 0x2e, 0x00, 0x50, + 0x96, 0xb4, 0xff, 0x00, 0x86, 0x37, 0x96, 0x86, 0x00, 0x04, 0x01, 0x20, + 0x96, 0x86, 0x00, 0x06, 0x19, 0x04, 0xd8, 0x0a, 0x08, 0x0c, 0xe7, 0x00, + 0x11, 0x20, 0x60, 0x07, 0x00, 0x0e, 0x08, 0x04, 0xd9, 0x37, 0x00, 0x46, + 0x64, 0x10, 0x24, 0x58, 0xbc, 0xa0, 0x00, 0x46, 0x08, 0x0c, 0x33, 0x15, + 0x08, 0x0c, 0xd6, 0x5a, 0x00, 0x4e, 0x00, 0x16, 0x90, 0x06, 0x20, 0x09, + 0x18, 0x48, 0x21, 0x0c, 0xd1, 0xa4, 0x01, 0x48, 0x20, 0x09, 0x00, 0x29, + 0x08, 0x0c, 0xea, 0x8d, 0x60, 0x10, 0x20, 0x58, 0xb8, 0x00, 0xc0, 0xe5, + 0xb8, 0x02, 0x00, 0x1e, 0x00, 0x4e, 0x60, 0x07, 0x00, 0x01, 0x08, 0x04, + 0xd9, 0x37, 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0x66, 0xe6, 0x01, 0x56, + 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x19, + 0x18, 0x05, 0x20, 0x11, 0x02, 0x70, 0x08, 0x0c, 0xc2, 0x0e, 0x00, 0x3e, + 0x00, 0x2e, 0x00, 0x1e, 0x01, 0x5e, 0x90, 0x05, 0x01, 0x68, 0x96, 0xb4, + 0xff, 0x00, 0x86, 0x37, 0x96, 0x82, 0x00, 0x04, 0x0a, 0x04, 0xd8, 0x0a, + 0x96, 0x82, 0x00, 0x07, 0x0a, 0x04, 0xd8, 0x66, 0x08, 0x04, 0xd8, 0x0a, + 0x60, 0x17, 0x19, 0x00, 0x60, 0x07, 0x00, 0x09, 0x08, 0x04, 0xd9, 0x37, + 0x08, 0x0c, 0x6b, 0xcf, 0x11, 0x40, 0x20, 0x01, 0x18, 0x37, 0x20, 0x04, + 0x90, 0x84, 0x00, 0x09, 0x90, 0x86, 0x00, 0x08, 0x11, 0x10, 0x08, 0x04, + 0xd7, 0x45, 0x08, 0x0c, 0x6b, 0x6b, 0x66, 0x10, 0x26, 0x58, 0xbe, 0x04, + 0x96, 0x84, 0x00, 0xff, 0x00, 0x06, 0x00, 0x16, 0x90, 0x8e, 0x00, 0x01, + 0x01, 0x18, 0x90, 0x8e, 0x00, 0x00, 0x11, 0x18, 0x00, 0x1e, 0x00, 0x0e, + 0x00, 0x80, 0x00, 0x1e, 0x00, 0x0e, 0x90, 0x82, 0x00, 0x06, 0x06, 0xa0, + 0x01, 0x50, 0x96, 0xb4, 0xff, 0x00, 0x86, 0x37, 0x96, 0x86, 0x00, 0x04, + 0x01, 0x20, 0x96, 0x86, 0x00, 0x06, 0x19, 0x04, 0xd8, 0x0a, 0x08, 0x0c, + 0xe7, 0x2e, 0x11, 0x38, 0x08, 0x0c, 0xe6, 0x27, 0x11, 0x20, 0x60, 0x07, + 0x00, 0x10, 0x08, 0x04, 0xd9, 0x37, 0x00, 0x46, 0x64, 0x10, 0x24, 0x58, + 0xbc, 0xa0, 0x00, 0x46, 0x08, 0x0c, 0x33, 0x15, 0x08, 0x0c, 0xd6, 0x5a, + 0x00, 0x4e, 0x00, 0x16, 0x90, 0x06, 0x20, 0x09, 0x18, 0x48, 0x21, 0x0c, + 0xd1, 0xa4, 0x01, 0x48, 0x20, 0x09, 0x00, 0x29, 0x08, 0x0c, 0xea, 0x8d, + 0x60, 0x10, 0x20, 0x58, 0xb8, 0x00, 0xc0, 0xe5, 0xb8, 0x02, 0x00, 0x1e, + 0x00, 0x4e, 0x60, 0x07, 0x00, 0x01, 0x04, 0x48, 0x08, 0x0c, 0xe9, 0x05, + 0x01, 0x98, 0x00, 0x16, 0x96, 0x8c, 0x00, 0xff, 0x91, 0x86, 0x00, 0x02, + 0x01, 0x60, 0x91, 0x86, 0x00, 0x03, 0x01, 0x48, 0x00, 0x1e, 0x96, 0xb4, + 0xff, 0x00, 0x86, 0x37, 0x96, 0x86, 0x00, 0x06, 0x09, 0x20, 0x08, 0x04, + 0xd8, 0x0a, 0x00, 0x1e, 0x60, 0x17, 0x19, 0x00, 0x60, 0x07, 0x00, 0x09, + 0x00, 0x70, 0x08, 0x0c, 0x34, 0x4c, 0x19, 0x04, 0xdb, 0x6d, 0x08, 0x0c, + 0xec, 0x80, 0x19, 0x04, 0xdb, 0x6d, 0x08, 0x0c, 0xdd, 0x3e, 0x19, 0x04, + 0xd8, 0x0a, 0x60, 0x07, 0x00, 0x12, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, + 0x96, 0x1e, 0x08, 0x0c, 0x9a, 0xb3, 0x00, 0x05, 0x60, 0x07, 0x00, 0x01, + 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x96, 0x1e, 0x08, 0x0c, 0x9a, 0xb3, + 0x0c, 0xb0, 0x60, 0x07, 0x00, 0x05, 0x0c, 0x68, 0x08, 0x0c, 0xec, 0x80, + 0x19, 0x04, 0xdb, 0x6d, 0x08, 0x0c, 0x34, 0x4c, 0x19, 0x04, 0xdb, 0x6d, + 0x08, 0x0c, 0xdd, 0x3e, 0x19, 0x04, 0xd8, 0x0a, 0x60, 0x07, 0x00, 0x20, + 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x96, 0x1e, 0x08, 0x0c, 0x9a, 0xb3, + 0x00, 0x05, 0x08, 0x0c, 0x34, 0x4c, 0x19, 0x04, 0xdb, 0x6d, 0x60, 0x07, + 0x00, 0x23, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x96, 0x1e, 0x08, 0x0c, + 0x9a, 0xb3, 0x00, 0x05, 0x08, 0x0c, 0xec, 0x80, 0x19, 0x04, 0xdb, 0x6d, + 0x08, 0x0c, 0x34, 0x4c, 0x19, 0x04, 0xdb, 0x6d, 0x08, 0x0c, 0xdd, 0x3e, + 0x19, 0x04, 0xd8, 0x0a, 0x00, 0x16, 0x00, 0x26, 0x00, 0xe6, 0x20, 0x71, + 0x02, 0x60, 0x2c, 0x08, 0x20, 0x11, 0x18, 0x20, 0x22, 0x14, 0x70, 0x3c, + 0x92, 0x06, 0x11, 0xe0, 0x20, 0x11, 0x18, 0x1f, 0x22, 0x14, 0x70, 0x38, + 0x90, 0x84, 0x00, 0xff, 0x92, 0x06, 0x11, 0xa0, 0x72, 0x40, 0x08, 0x0c, + 0xcf, 0x09, 0x05, 0x70, 0x22, 0x60, 0x60, 0x08, 0x90, 0x86, 0xff, 0xff, + 0x01, 0x20, 0x72, 0x44, 0x60, 0x08, 0x92, 0x06, 0x15, 0x28, 0x60, 0x20, + 0x90, 0x86, 0x00, 0x07, 0x15, 0x08, 0x08, 0x0c, 0xb1, 0x6c, 0x04, 0xa0, + 0x72, 0x44, 0x92, 0x86, 0xff, 0xff, 0x01, 0x80, 0x2c, 0x08, 0x08, 0x0c, + 0xcf, 0x09, 0x01, 0xb0, 0x22, 0x60, 0x72, 0x40, 0x60, 0x08, 0x92, 0x06, + 0x11, 0x88, 0x60, 0x10, 0x91, 0x90, 0x00, 0x04, 0x22, 0x14, 0x92, 0x06, + 0x01, 0xb8, 0x00, 0x50, 0x72, 0x40, 0x2c, 0x08, 0x90, 0x06, 0x08, 0x0c, + 0xea, 0x57, 0x11, 0x80, 0x72, 0x44, 0x92, 0x86, 0xff, 0xff, 0x01, 0xb0, + 0x21, 0x60, 0x60, 0x07, 0x00, 0x26, 0x60, 0x17, 0x17, 0x00, 0x72, 0x14, + 0x92, 0x96, 0xff, 0xff, 0x11, 0x80, 0x60, 0x07, 0x00, 0x25, 0x00, 0x68, + 0x60, 0x20, 0x90, 0x86, 0x00, 0x07, 0x1d, 0x80, 0x60, 0x04, 0x90, 0x86, + 0x00, 0x24, 0x11, 0x10, 0x08, 0x0c, 0xb1, 0x6c, 0x21, 0x60, 0x60, 0x07, + 0x00, 0x25, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x96, 0x1e, 0x08, 0x0c, + 0x9a, 0xb3, 0x00, 0xee, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x05, 0x20, 0x01, + 0x00, 0x01, 0x08, 0x0c, 0x66, 0xe6, 0x01, 0x56, 0x00, 0x16, 0x00, 0x26, + 0x00, 0x36, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x19, 0x18, 0x05, 0x20, 0x11, + 0x02, 0x76, 0x08, 0x0c, 0xc2, 0x0e, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, + 0x01, 0x5e, 0x01, 0x20, 0x60, 0x07, 0x00, 0x31, 0x08, 0x04, 0xd9, 0x37, + 0x08, 0x0c, 0xbe, 0x21, 0x08, 0x0c, 0x77, 0x9e, 0x11, 0x90, 0x00, 0x06, + 0x00, 0x26, 0x00, 0x36, 0x08, 0x0c, 0x77, 0xb8, 0x11, 0x38, 0x08, 0x0c, + 0x7a, 0xb6, 0x08, 0x0c, 0x61, 0x9d, 0x08, 0x0c, 0x76, 0xcd, 0x00, 0x10, + 0x08, 0x0c, 0x77, 0x72, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x0e, 0x00, 0x05, + 0x08, 0x0c, 0x34, 0x4c, 0x19, 0x04, 0xdb, 0x6d, 0x08, 0x0c, 0xdd, 0x3e, + 0x19, 0x04, 0xd8, 0x0a, 0x61, 0x06, 0x08, 0x0c, 0xdd, 0x5a, 0x11, 0x20, + 0x60, 0x07, 0x00, 0x2b, 0x08, 0x04, 0xd9, 0x37, 0x60, 0x07, 0x00, 0x2c, + 0x08, 0x04, 0xd9, 0x37, 0x08, 0x0c, 0xec, 0x80, 0x19, 0x04, 0xdb, 0x6d, + 0x08, 0x0c, 0x34, 0x4c, 0x19, 0x04, 0xdb, 0x6d, 0x08, 0x0c, 0xdd, 0x3e, + 0x19, 0x04, 0xd8, 0x0a, 0x61, 0x06, 0x08, 0x0c, 0xdd, 0x5f, 0x11, 0x20, + 0x60, 0x07, 0x00, 0x2e, 0x08, 0x04, 0xd9, 0x37, 0x60, 0x07, 0x00, 0x2f, + 0x08, 0x04, 0xd9, 0x37, 0x08, 0x0c, 0x34, 0x4c, 0x19, 0x04, 0xdb, 0x6d, + 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, 0x60, 0x10, 0x20, 0x58, 0xb9, 0x04, + 0x91, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x06, 0x01, 0x58, 0x91, 0x84, + 0xff, 0x00, 0x80, 0x07, 0x90, 0x86, 0x00, 0x06, 0x01, 0x28, 0x00, 0xce, + 0x00, 0xde, 0x00, 0xee, 0x08, 0x04, 0xd9, 0x3e, 0x08, 0x0c, 0x58, 0x44, + 0xd0, 0xe4, 0x09, 0x04, 0xda, 0xb8, 0x20, 0x71, 0x02, 0x6c, 0x70, 0x10, + 0x60, 0x3a, 0x70, 0x14, 0x60, 0x3e, 0x71, 0x08, 0x72, 0x0c, 0x08, 0x0c, + 0x6c, 0x0d, 0x01, 0x40, 0x60, 0x10, 0x20, 0x58, 0xb8, 0x10, 0x91, 0x06, + 0x11, 0x18, 0xb8, 0x14, 0x92, 0x06, 0x05, 0x10, 0x08, 0x0c, 0x6c, 0x09, + 0x15, 0xb8, 0x20, 0x69, 0x18, 0x00, 0x68, 0x80, 0x92, 0x06, 0x15, 0x90, + 0x68, 0x7c, 0x91, 0x06, 0x15, 0x78, 0x72, 0x10, 0x08, 0x0c, 0xcf, 0x09, + 0x05, 0x90, 0x08, 0x0c, 0xdc, 0x2b, 0x05, 0x78, 0x08, 0x0c, 0xeb, 0x09, + 0x05, 0x60, 0x62, 0x2e, 0x60, 0x07, 0x00, 0x36, 0x60, 0x03, 0x00, 0x01, + 0x20, 0x09, 0x80, 0x20, 0x08, 0x0c, 0x96, 0x17, 0x00, 0xce, 0x00, 0xde, + 0x00, 0xee, 0x00, 0x05, 0x72, 0x14, 0x92, 0x86, 0xff, 0xff, 0x01, 0x50, + 0x08, 0x0c, 0xcf, 0x09, 0x01, 0xc0, 0x92, 0x80, 0x00, 0x02, 0x20, 0x04, + 0x71, 0x10, 0x91, 0x06, 0x11, 0x90, 0x08, 0xe0, 0x72, 0x10, 0x2c, 0x08, + 0x90, 0x85, 0x00, 0x01, 0x08, 0x0c, 0xea, 0x57, 0x2c, 0x10, 0x21, 0x60, + 0x01, 0x40, 0x08, 0x90, 0x60, 0x07, 0x00, 0x37, 0x60, 0x2f, 0x00, 0x09, + 0x60, 0x17, 0x15, 0x00, 0x08, 0xb8, 0x60, 0x07, 0x00, 0x37, 0x60, 0x2f, + 0x00, 0x03, 0x60, 0x17, 0x17, 0x00, 0x08, 0x80, 0x60, 0x07, 0x00, 0x12, + 0x08, 0x68, 0x08, 0x0c, 0x34, 0x4c, 0x19, 0x04, 0xdb, 0x6d, 0x60, 0x10, + 0x20, 0x58, 0xb8, 0x04, 0x90, 0x84, 0xff, 0x00, 0x80, 0x07, 0x90, 0x86, + 0x00, 0x06, 0x19, 0x04, 0xd9, 0x3e, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, + 0x08, 0x0c, 0x58, 0x44, 0xd0, 0xe4, 0x09, 0x04, 0xdb, 0x30, 0x20, 0x69, + 0x18, 0x00, 0x20, 0x71, 0x02, 0x6c, 0x70, 0x08, 0x60, 0x3a, 0x72, 0x0c, + 0x62, 0x3e, 0x92, 0x86, 0xff, 0xff, 0x11, 0x50, 0x72, 0x08, 0x00, 0xc6, + 0x2c, 0x08, 0x90, 0x85, 0x00, 0x01, 0x08, 0x0c, 0xea, 0x57, 0x2c, 0x10, + 0x00, 0xce, 0x05, 0xe8, 0x08, 0x0c, 0xcf, 0x09, 0x05, 0xd0, 0x71, 0x08, + 0x92, 0x80, 0x00, 0x02, 0x20, 0x04, 0x91, 0x06, 0x15, 0xa0, 0x00, 0xc6, + 0x00, 0x26, 0x22, 0x60, 0x08, 0x0c, 0xca, 0xdc, 0x00, 0x2e, 0x00, 0xce, + 0x71, 0x18, 0x91, 0x8c, 0xff, 0x00, 0x81, 0x0f, 0x91, 0x86, 0x00, 0x01, + 0x01, 0x78, 0x91, 0x86, 0x00, 0x05, 0x01, 0x18, 0x91, 0x86, 0x00, 0x07, + 0x11, 0x98, 0x92, 0x80, 0x00, 0x05, 0x20, 0x04, 0x90, 0x05, 0x01, 0x70, + 0x08, 0x0c, 0xdc, 0x2b, 0x09, 0x04, 0xda, 0xb1, 0x00, 0x56, 0x75, 0x10, + 0x76, 0x14, 0x08, 0x0c, 0xeb, 0x22, 0x00, 0x5e, 0x00, 0xce, 0x00, 0xde, + 0x00, 0xee, 0x00, 0x05, 0x60, 0x07, 0x00, 0x3b, 0x60, 0x2f, 0x00, 0x09, + 0x60, 0x17, 0x2a, 0x00, 0x60, 0x03, 0x00, 0x01, 0x20, 0x09, 0x80, 0x20, + 0x08, 0x0c, 0x96, 0x17, 0x0c, 0x78, 0x60, 0x07, 0x00, 0x3b, 0x60, 0x2f, + 0x00, 0x03, 0x60, 0x17, 0x03, 0x00, 0x60, 0x03, 0x00, 0x01, 0x20, 0x09, + 0x80, 0x20, 0x08, 0x0c, 0x96, 0x17, 0x0c, 0x10, 0x60, 0x07, 0x00, 0x3b, + 0x60, 0x2f, 0x00, 0x0b, 0x60, 0x17, 0x00, 0x00, 0x08, 0x04, 0xda, 0x88, + 0x00, 0xe6, 0x00, 0x26, 0x08, 0x0c, 0x6b, 0xcf, 0x05, 0x50, 0x08, 0x0c, + 0x6b, 0x6b, 0x08, 0x0c, 0xec, 0xf1, 0x15, 0x18, 0x20, 0x71, 0x18, 0x00, + 0x70, 0xdc, 0x90, 0x85, 0x00, 0x03, 0x70, 0xde, 0x00, 0xf6, 0x20, 0x79, + 0x01, 0x00, 0x72, 0xb0, 0x92, 0x84, 0x00, 0xff, 0x70, 0x7e, 0x78, 0xe6, + 0x92, 0x84, 0xff, 0x00, 0x72, 0x80, 0x92, 0x05, 0x70, 0x82, 0x78, 0xea, + 0x00, 0xfe, 0x70, 0xe7, 0x00, 0x00, 0x08, 0x0c, 0x6c, 0x0d, 0x01, 0x20, + 0x20, 0x11, 0x1a, 0x0a, 0x20, 0x13, 0x07, 0xd0, 0xd0, 0xac, 0x11, 0x28, + 0x08, 0x0c, 0x30, 0xbf, 0x00, 0x10, 0x08, 0x0c, 0xed, 0x25, 0x00, 0x2e, + 0x00, 0xee, 0x08, 0x0c, 0xb1, 0x6c, 0x08, 0x04, 0xd9, 0x3d, 0x08, 0x0c, + 0xb1, 0x6c, 0x00, 0x05, 0x26, 0x00, 0x00, 0x02, 0xdb, 0x84, 0xdb, 0xb2, + 0xdb, 0xc3, 0xdb, 0x84, 0xdb, 0x84, 0xdb, 0x86, 0xdb, 0xd4, 0xdb, 0x84, + 0xdb, 0x84, 0xdb, 0x84, 0xdb, 0xa0, 0xdb, 0x84, 0xdb, 0x84, 0xdb, 0x84, + 0xdb, 0xdf, 0xdb, 0xf5, 0xdc, 0x26, 0xdb, 0x84, 0x08, 0x0c, 0x0d, 0x85, + 0x08, 0x0c, 0xec, 0x80, 0x1d, 0x20, 0x08, 0x0c, 0x34, 0x4c, 0x1d, 0x08, + 0x70, 0x38, 0x60, 0x16, 0x60, 0x07, 0x00, 0x45, 0x60, 0x03, 0x00, 0x01, + 0x08, 0x0c, 0x96, 0x1e, 0x00, 0x05, 0x08, 0x0c, 0x33, 0x15, 0x08, 0x0c, + 0xd6, 0x5a, 0x60, 0x07, 0x00, 0x01, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, + 0x96, 0x1e, 0x00, 0x05, 0x08, 0x0c, 0xec, 0x80, 0x19, 0x50, 0x08, 0x0c, + 0x34, 0x4c, 0x19, 0x38, 0x08, 0x0c, 0xdd, 0x3e, 0x1d, 0x60, 0x70, 0x3c, + 0x60, 0x16, 0x60, 0x07, 0x00, 0x4a, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, + 0x96, 0x1e, 0x00, 0x05, 0x08, 0x0c, 0x34, 0x4c, 0x19, 0x04, 0xdb, 0x6d, + 0x20, 0x09, 0x00, 0x41, 0x08, 0x0c, 0xed, 0x2e, 0x60, 0x07, 0x00, 0x47, + 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, 0x96, 0x1e, 0x08, 0x0c, 0x9a, 0xb3, + 0x00, 0x05, 0x08, 0x0c, 0x34, 0x4c, 0x19, 0x04, 0xdb, 0x6d, 0x20, 0x09, + 0x00, 0x42, 0x08, 0x0c, 0xed, 0x2e, 0x60, 0x07, 0x00, 0x47, 0x60, 0x03, + 0x00, 0x01, 0x08, 0x0c, 0x96, 0x1e, 0x08, 0x0c, 0x9a, 0xb3, 0x00, 0x05, + 0x08, 0x0c, 0x34, 0x4c, 0x19, 0x04, 0xdb, 0x6d, 0x20, 0x09, 0x00, 0x46, + 0x08, 0x0c, 0xed, 0x2e, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x05, 0x20, 0x01, + 0x18, 0x24, 0x20, 0x04, 0x90, 0x82, 0x00, 0xe1, 0x12, 0x68, 0x08, 0x0c, + 0xdc, 0x48, 0x09, 0x04, 0xdb, 0x6d, 0x60, 0x07, 0x00, 0x4e, 0x60, 0x03, + 0x00, 0x01, 0x08, 0x0c, 0x96, 0x1e, 0x08, 0x0c, 0x9a, 0xb3, 0x00, 0x05, + 0x60, 0x07, 0x00, 0x12, 0x0c, 0xb0, 0x60, 0x07, 0x00, 0x4f, 0x60, 0x17, + 0x00, 0x00, 0x71, 0x34, 0x91, 0x8c, 0x00, 0xff, 0x81, 0xff, 0x05, 0x08, + 0x91, 0x86, 0x00, 0x01, 0x11, 0x60, 0x71, 0x40, 0x20, 0x01, 0x19, 0xbe, + 0x20, 0x04, 0x91, 0x06, 0x11, 0xb0, 0x71, 0x44, 0x20, 0x01, 0x19, 0xbf, + 0x20, 0x04, 0x91, 0x06, 0x01, 0x90, 0x91, 0x86, 0x00, 0x02, 0x11, 0x68, + 0x20, 0x11, 0x02, 0x76, 0x20, 0xa9, 0x00, 0x04, 0x60, 0x10, 0x00, 0x96, + 0x20, 0x48, 0x20, 0x19, 0x00, 0x0a, 0x08, 0x0c, 0xc2, 0x22, 0x00, 0x9e, + 0x01, 0x10, 0x60, 0x17, 0x00, 0x01, 0x60, 0x03, 0x00, 0x01, 0x08, 0x0c, + 0x96, 0x1e, 0x08, 0x0c, 0x9a, 0xb3, 0x00, 0x05, 0x60, 0x07, 0x00, 0x50, + 0x70, 0x3c, 0x60, 0x16, 0x0c, 0xa0, 0x00, 0x16, 0x00, 0xe6, 0x20, 0x71, + 0x02, 0x60, 0x00, 0xb6, 0x00, 0xc6, 0x22, 0x60, 0x60, 0x10, 0x20, 0x58, + 0xb8, 0xd4, 0xd0, 0x84, 0x01, 0x50, 0x71, 0x28, 0x60, 0x4c, 0x91, 0x06, + 0x11, 0x20, 0x71, 0x2c, 0x60, 0x50, 0x91, 0x06, 0x01, 0x10, 0x90, 0x06, + 0x00, 0x10, 0x90, 0x85, 0x00, 0x01, 0x00, 0xce, 0x00, 0xbe, 0x00, 0xee, + 0x00, 0x1e, 0x00, 0x05, 0x00, 0x16, 0x00, 0x96, 0x00, 0x86, 0x00, 0xe6, + 0x01, 0xc6, 0x01, 0xd6, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, + 0x18, 0x00, 0x20, 0xe1, 0x00, 0x00, 0x20, 0x01, 0x19, 0xa1, 0x20, 0x03, + 0x00, 0x00, 0x08, 0x0c, 0x10, 0x72, 0x05, 0xa0, 0x29, 0x00, 0x60, 0x16, + 0x70, 0x90, 0x80, 0x04, 0xa8, 0x16, 0x90, 0x8a, 0x00, 0x1e, 0x02, 0xd0, + 0xa8, 0x33, 0x00, 0x1e, 0x20, 0xa9, 0x00, 0x1e, 0xa8, 0x60, 0x20, 0xe8, + 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x1b, 0x20, 0xa0, 0x20, 0x01, 0x19, 0xa1, + 0x00, 0x16, 0x20, 0x0c, 0x04, 0x71, 0x00, 0x1e, 0x81, 0xff, 0x01, 0xb8, + 0x29, 0x40, 0x08, 0x0c, 0x10, 0x72, 0x01, 0xb0, 0x29, 0x00, 0xa0, 0x06, + 0x21, 0x00, 0x0c, 0x18, 0xa8, 0x32, 0x20, 0xa8, 0xa8, 0x60, 0x20, 0xe8, + 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x1b, 0x20, 0xa0, 0x20, 0x01, 0x19, 0xa1, + 0x00, 0x16, 0x20, 0x0c, 0x00, 0xb1, 0x00, 0x1e, 0x00, 0x00, 0x90, 0x85, + 0x00, 0x01, 0x00, 0x48, 0x20, 0x71, 0x18, 0x00, 0x70, 0x93, 0x00, 0x00, + 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0x10, 0x0b, 0x90, 0x06, 0x01, 0x2e, + 0x01, 0xde, 0x01, 0xce, 0x00, 0xee, 0x00, 0x8e, 0x00, 0x9e, 0x00, 0x1e, + 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x00, 0xc6, + 0x91, 0x8c, 0xff, 0xff, 0x11, 0xb0, 0x08, 0x0c, 0x21, 0xf9, 0x20, 0x99, + 0x02, 0x6c, 0x20, 0x01, 0x00, 0x14, 0x35, 0x18, 0x93, 0x12, 0x01, 0x08, + 0x12, 0x18, 0x23, 0xa8, 0x40, 0x03, 0x04, 0x00, 0x20, 0xa8, 0x40, 0x03, + 0x22, 0xa8, 0x81, 0x08, 0x08, 0x0c, 0x21, 0xf9, 0x20, 0x99, 0x02, 0x60, + 0x0c, 0xa8, 0x08, 0x0c, 0x21, 0xf9, 0x20, 0x61, 0x19, 0xa1, 0x60, 0x04, + 0x20, 0x98, 0x60, 0x08, 0x35, 0x18, 0x93, 0x12, 0x01, 0x08, 0x12, 0x18, + 0x23, 0xa8, 0x40, 0x03, 0x00, 0x48, 0x20, 0xa8, 0x40, 0x03, 0x22, 0xa8, + 0x81, 0x08, 0x08, 0x0c, 0x21, 0xf9, 0x20, 0x99, 0x02, 0x60, 0x0c, 0xa8, + 0x20, 0x61, 0x19, 0xa1, 0x20, 0x19, 0x02, 0x80, 0x33, 0x00, 0x93, 0x1e, + 0x01, 0x10, 0x60, 0x06, 0x00, 0x20, 0x20, 0x01, 0x02, 0x60, 0x60, 0x06, + 0x81, 0x08, 0x21, 0x62, 0x92, 0x92, 0x00, 0x21, 0x92, 0x96, 0xff, 0xff, + 0x62, 0x0a, 0x00, 0xce, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x0e, + 0x00, 0x05, 0x00, 0x06, 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x00, 0xc6, + 0x81, 0xff, 0x11, 0xb8, 0x08, 0x0c, 0x22, 0x11, 0x20, 0xa1, 0x02, 0x4c, + 0x20, 0x01, 0x00, 0x14, 0x35, 0x18, 0x93, 0x12, 0x12, 0x18, 0x23, 0xa8, + 0x40, 0x03, 0x04, 0x18, 0x20, 0xa8, 0x40, 0x03, 0x82, 0xff, 0x01, 0xf8, + 0x22, 0xa8, 0x81, 0x08, 0x08, 0x0c, 0x22, 0x11, 0x20, 0xa1, 0x02, 0x40, + 0x0c, 0x98, 0x08, 0x0c, 0x22, 0x11, 0x20, 0x61, 0x19, 0xa4, 0x60, 0x04, + 0x20, 0xa0, 0x60, 0x08, 0x35, 0x18, 0x93, 0x12, 0x12, 0x18, 0x23, 0xa8, + 0x40, 0x03, 0x00, 0x58, 0x20, 0xa8, 0x40, 0x03, 0x82, 0xff, 0x01, 0x38, + 0x22, 0xa8, 0x81, 0x08, 0x08, 0x0c, 0x22, 0x11, 0x20, 0xa1, 0x02, 0x40, + 0x0c, 0x98, 0x20, 0x61, 0x19, 0xa4, 0x20, 0x19, 0x02, 0x60, 0x34, 0x00, + 0x93, 0x1e, 0x01, 0x10, 0x60, 0x06, 0x00, 0x20, 0x20, 0x01, 0x02, 0x40, + 0x60, 0x06, 0x81, 0x08, 0x21, 0x62, 0x92, 0x92, 0x00, 0x21, 0x92, 0x96, + 0xff, 0xff, 0x62, 0x0a, 0x00, 0xce, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, + 0x00, 0x0e, 0x00, 0x05, 0x00, 0xb6, 0x00, 0x66, 0x66, 0x10, 0x26, 0x58, + 0xbe, 0x04, 0x96, 0xb4, 0xff, 0x00, 0x86, 0x37, 0x96, 0x86, 0x00, 0x06, + 0x01, 0x70, 0x96, 0x86, 0x00, 0x04, 0x01, 0x58, 0xbe, 0x04, 0x96, 0xb4, + 0x00, 0xff, 0x96, 0x86, 0x00, 0x06, 0x01, 0x28, 0x96, 0x86, 0x00, 0x04, + 0x01, 0x10, 0x90, 0x85, 0x00, 0x01, 0x00, 0x6e, 0x00, 0xbe, 0x00, 0x05, + 0x00, 0xd6, 0x08, 0x0c, 0xdd, 0xd4, 0x00, 0xde, 0x00, 0x05, 0x00, 0xd6, + 0x08, 0x0c, 0xdd, 0xe1, 0x15, 0x20, 0x68, 0x0c, 0x90, 0x8c, 0xff, 0x00, + 0x68, 0x20, 0x90, 0x84, 0x00, 0xff, 0x91, 0x15, 0x62, 0x16, 0x68, 0x24, + 0x60, 0x2e, 0xd1, 0xe4, 0x01, 0x30, 0x90, 0x06, 0x08, 0x0c, 0xee, 0x4e, + 0x20, 0x09, 0x00, 0x01, 0x00, 0x78, 0xd1, 0xec, 0x01, 0x80, 0x69, 0x20, + 0x91, 0x8c, 0x00, 0xff, 0x68, 0x24, 0x08, 0x0c, 0x26, 0x8c, 0x11, 0x48, + 0x20, 0x01, 0x00, 0x01, 0x08, 0x0c, 0xee, 0x4e, 0x21, 0x10, 0x90, 0x0e, + 0x08, 0x0c, 0x33, 0x64, 0x00, 0x18, 0x90, 0x85, 0x00, 0x01, 0x00, 0x08, + 0x90, 0x06, 0x00, 0xde, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xc6, 0x08, 0x0c, + 0xb1, 0xdd, 0x05, 0x98, 0x00, 0x16, 0x00, 0x26, 0x00, 0xc6, 0x20, 0x11, + 0x02, 0x63, 0x22, 0x04, 0x82, 0x11, 0x22, 0x0c, 0x08, 0x0c, 0x26, 0x8c, + 0x15, 0x68, 0x08, 0x0c, 0x67, 0x49, 0x15, 0x50, 0xbe, 0x12, 0xbd, 0x16, + 0x00, 0xce, 0x00, 0x2e, 0x00, 0x1e, 0x2b, 0x00, 0x60, 0x12, 0x08, 0x0c, + 0xec, 0x80, 0x11, 0xc8, 0x08, 0x0c, 0x34, 0x4c, 0x11, 0xb0, 0x08, 0x0c, + 0xdd, 0x3e, 0x05, 0x00, 0x20, 0x01, 0x00, 0x07, 0x08, 0x0c, 0x66, 0xfa, + 0x20, 0x01, 0x00, 0x07, 0x08, 0x0c, 0x67, 0x26, 0x60, 0x17, 0x00, 0x00, + 0x60, 0x23, 0x00, 0x01, 0x60, 0x07, 0x00, 0x01, 0x60, 0x03, 0x00, 0x01, + 0x08, 0x0c, 0x96, 0x1e, 0x00, 0x10, 0x08, 0x0c, 0xb1, 0x6c, 0x90, 0x85, + 0x00, 0x01, 0x00, 0xce, 0x00, 0xbe, 0x00, 0x05, 0x08, 0x0c, 0xb1, 0x6c, + 0x00, 0xce, 0x00, 0x2e, 0x00, 0x1e, 0x0c, 0xa8, 0x08, 0x0c, 0xb1, 0x6c, + 0x90, 0x06, 0x0c, 0x98, 0x20, 0x69, 0x02, 0x6d, 0x68, 0x00, 0x90, 0x82, + 0x00, 0x10, 0x12, 0x28, 0x60, 0x17, 0x00, 0x00, 0x90, 0x85, 0x00, 0x01, + 0x00, 0x08, 0x90, 0x06, 0x00, 0x05, 0x60, 0x17, 0x00, 0x00, 0x20, 0x69, + 0x02, 0x6c, 0x68, 0x08, 0x90, 0x84, 0xff, 0x00, 0x90, 0x86, 0x08, 0x00, + 0x11, 0x90, 0x69, 0x04, 0x91, 0x86, 0x00, 0x18, 0x01, 0x18, 0x91, 0x86, + 0x00, 0x14, 0x11, 0x58, 0x81, 0x0f, 0x68, 0x00, 0x90, 0x84, 0x00, 0xff, + 0x91, 0x0d, 0x61, 0x62, 0x90, 0x8e, 0x00, 0x14, 0x01, 0x10, 0x90, 0x8e, + 0x00, 0x10, 0x00, 0x05, 0x60, 0x04, 0x90, 0xb2, 0x00, 0x53, 0x1a, 0x0c, + 0x0d, 0x85, 0x91, 0xb6, 0x00, 0x13, 0x11, 0x30, 0x20, 0x08, 0x91, 0xb2, + 0x00, 0x40, 0x1a, 0x04, 0xdf, 0x36, 0x04, 0x02, 0x91, 0xb6, 0x00, 0x27, + 0x01, 0x90, 0x91, 0x86, 0x00, 0x15, 0x01, 0x18, 0x91, 0x86, 0x00, 0x16, + 0x11, 0x40, 0x08, 0x0c, 0xaf, 0x61, 0x01, 0x20, 0x90, 0x86, 0x00, 0x02, + 0x09, 0x04, 0xbb, 0xa3, 0x00, 0x05, 0x91, 0xb6, 0x00, 0x14, 0x19, 0x0c, + 0x0d, 0x85, 0x20, 0x01, 0x00, 0x07, 0x08, 0x0c, 0x67, 0x26, 0x08, 0x0c, + 0x99, 0xed, 0x08, 0x0c, 0xb1, 0xa7, 0x08, 0x0c, 0x9a, 0xb3, 0x00, 0x05, + 0xde, 0x6c, 0xde, 0x6e, 0xde, 0x6c, 0xde, 0x6c, 0xde, 0x6c, 0xde, 0x6e, + 0xde, 0x7b, 0xdf, 0x33, 0xde, 0xbd, 0xdf, 0x33, 0xde, 0xe1, 0xdf, 0x33, + 0xde, 0x7b, 0xdf, 0x33, 0xdf, 0x2b, 0xdf, 0x33, 0xdf, 0x2b, 0xdf, 0x33, + 0xdf, 0x33, 0xde, 0x6c, 0xde, 0x6c, 0xde, 0x6c, 0xde, 0x6c, 0xde, 0x6c, + 0xde, 0x6c, 0xde, 0x6c, 0xde, 0x6c, 0xde, 0x6c, 0xde, 0x6c, 0xde, 0x6c, + 0xde, 0x6e, 0xde, 0x6c, 0xdf, 0x33, 0xde, 0x6c, 0xde, 0x6c, 0xdf, 0x33, + 0xde, 0x6c, 0xdf, 0x30, 0xdf, 0x33, 0xde, 0x6c, 0xde, 0x6c, 0xde, 0x6c, + 0xde, 0x6c, 0xdf, 0x33, 0xdf, 0x33, 0xde, 0x6c, 0xdf, 0x33, 0xdf, 0x33, + 0xde, 0x6c, 0xde, 0x76, 0xde, 0x6c, 0xde, 0x6c, 0xde, 0x6c, 0xde, 0x6c, + 0xdf, 0x2f, 0xdf, 0x33, 0xde, 0x6c, 0xde, 0x6c, 0xdf, 0x33, 0xdf, 0x33, + 0xde, 0x6c, 0xde, 0x6c, 0xde, 0x6c, 0xde, 0x6c, 0x08, 0x0c, 0x0d, 0x85, + 0x08, 0x0c, 0xd6, 0x5d, 0x60, 0x03, 0x00, 0x02, 0x08, 0x0c, 0x9a, 0xb3, + 0x08, 0x04, 0xdf, 0x35, 0x90, 0x06, 0x08, 0x0c, 0x66, 0xe6, 0x08, 0x04, + 0xdf, 0x33, 0x08, 0x0c, 0x6c, 0x09, 0x19, 0x04, 0xdf, 0x33, 0x90, 0x06, + 0x08, 0x0c, 0x66, 0xe6, 0x60, 0x10, 0x20, 0x58, 0xb8, 0x10, 0x90, 0x86, + 0x00, 0xff, 0x11, 0x40, 0x00, 0xf6, 0x20, 0x79, 0x18, 0x00, 0x78, 0xa8, + 0x80, 0x00, 0x78, 0xaa, 0x00, 0xfe, 0x00, 0xb8, 0x60, 0x10, 0x20, 0x58, + 0xb8, 0x84, 0x90, 0x05, 0x09, 0x04, 0xdf, 0x33, 0x08, 0x0c, 0x34, 0x7d, + 0x19, 0x04, 0xdf, 0x33, 0x20, 0x01, 0x18, 0x00, 0x20, 0x04, 0x90, 0x86, + 0x00, 0x02, 0x11, 0x38, 0x00, 0xf6, 0x20, 0x79, 0x18, 0x00, 0x78, 0xa8, + 0x80, 0x00, 0x78, 0xaa, 0x00, 0xfe, 0x20, 0x01, 0x00, 0x02, 0x08, 0x0c, + 0x66, 0xfa, 0x60, 0x23, 0x00, 0x01, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, + 0x00, 0x02, 0x08, 0x0c, 0x96, 0x1e, 0x08, 0x0c, 0x9a, 0xb3, 0x61, 0x10, + 0x21, 0x58, 0x20, 0x09, 0x00, 0x01, 0x08, 0x0c, 0x89, 0xa1, 0x08, 0x04, + 0xdf, 0x35, 0x66, 0x10, 0x26, 0x58, 0xbe, 0x04, 0x96, 0xb4, 0xff, 0x00, + 0x86, 0x37, 0x96, 0x86, 0x00, 0x06, 0x01, 0x48, 0x96, 0x86, 0x00, 0x04, + 0x01, 0x30, 0x08, 0x0c, 0x92, 0x28, 0x20, 0x01, 0x00, 0x04, 0x08, 0x0c, + 0x67, 0x26, 0x08, 0x0c, 0xee, 0x9d, 0x09, 0x04, 0xdf, 0x33, 0x20, 0x01, + 0x00, 0x04, 0x08, 0x0c, 0x66, 0xfa, 0x60, 0x23, 0x00, 0x01, 0x60, 0x03, + 0x00, 0x01, 0x60, 0x07, 0x00, 0x03, 0x08, 0x0c, 0x96, 0x1e, 0x08, 0x04, + 0xdf, 0x35, 0x20, 0x01, 0x18, 0x00, 0x20, 0x04, 0x90, 0x86, 0x00, 0x03, + 0x11, 0x58, 0x00, 0x36, 0x00, 0x46, 0x60, 0x10, 0x20, 0x58, 0xbb, 0xa0, + 0x20, 0x21, 0x00, 0x06, 0x08, 0x0c, 0x4e, 0x58, 0x00, 0x4e, 0x00, 0x3e, + 0x20, 0x01, 0x00, 0x06, 0x08, 0x0c, 0xdf, 0x4f, 0x66, 0x10, 0x26, 0x58, + 0xbe, 0x04, 0x00, 0x66, 0x96, 0xb4, 0xff, 0x00, 0x86, 0x37, 0x96, 0x86, + 0x00, 0x06, 0x00, 0x6e, 0x01, 0x80, 0x20, 0x01, 0x00, 0x06, 0x08, 0x0c, + 0x67, 0x26, 0x92, 0x84, 0x00, 0xff, 0x90, 0x8e, 0x00, 0x07, 0x01, 0x18, + 0x90, 0x8e, 0x00, 0x04, 0x11, 0x20, 0x20, 0x01, 0x00, 0x06, 0x08, 0x0c, + 0x66, 0xfa, 0x08, 0x0c, 0x6c, 0x09, 0x11, 0xf8, 0x20, 0x01, 0x18, 0x37, + 0x20, 0x04, 0xd0, 0xa4, 0x01, 0xd0, 0xbe, 0x04, 0x96, 0xb4, 0x00, 0xff, + 0x96, 0x86, 0x00, 0x06, 0x01, 0xa0, 0x00, 0xf6, 0x20, 0x79, 0x18, 0x00, + 0x78, 0xa8, 0x80, 0x00, 0x78, 0xaa, 0x00, 0xfe, 0x08, 0x04, 0xde, 0xa7, + 0x20, 0x01, 0x00, 0x04, 0x00, 0x30, 0x20, 0x01, 0x00, 0x06, 0x04, 0x09, + 0x00, 0x20, 0x00, 0x18, 0x00, 0x10, 0x08, 0x0c, 0x67, 0x26, 0x08, 0x0c, + 0xb1, 0x6c, 0x00, 0x05, 0x26, 0x00, 0x00, 0x02, 0xdf, 0x4a, 0xdf, 0x4a, + 0xdf, 0x4a, 0xdf, 0x4a, 0xdf, 0x4a, 0xdf, 0x4c, 0xdf, 0x4a, 0xdf, 0x4c, + 0xdf, 0x4a, 0xdf, 0x4a, 0xdf, 0x4c, 0xdf, 0x4a, 0xdf, 0x4a, 0xdf, 0x4a, + 0xdf, 0x4c, 0xdf, 0x4c, 0xdf, 0x4c, 0xdf, 0x4c, 0x08, 0x0c, 0x0d, 0x85, + 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x05, 0x00, 0x16, 0x00, 0xb6, 0x00, 0xd6, + 0x61, 0x10, 0x21, 0x58, 0xb9, 0x00, 0xd1, 0x84, 0x01, 0x38, 0x08, 0x0c, + 0x66, 0xfa, 0x90, 0x06, 0x08, 0x0c, 0x66, 0xe6, 0x08, 0x0c, 0x33, 0x44, + 0x00, 0xde, 0x00, 0xbe, 0x00, 0x1e, 0x00, 0x05, 0x66, 0x10, 0x26, 0x58, + 0xb8, 0x04, 0x90, 0x84, 0xff, 0x00, 0x80, 0x07, 0x90, 0xb2, 0x00, 0x0c, + 0x1a, 0x0c, 0x0d, 0x85, 0x91, 0xb6, 0x00, 0x15, 0x11, 0x10, 0x00, 0x3b, + 0x00, 0x28, 0x91, 0xb6, 0x00, 0x16, 0x19, 0x0c, 0x0d, 0x85, 0x00, 0x6b, + 0x00, 0x05, 0xbc, 0x45, 0xbc, 0x45, 0xbc, 0x45, 0xbc, 0x45, 0xdf, 0xe4, + 0xbc, 0x45, 0xdf, 0xce, 0xdf, 0x8f, 0xbc, 0x45, 0xbc, 0x45, 0xbc, 0x45, + 0xbc, 0x45, 0xbc, 0x45, 0xbc, 0x45, 0xbc, 0x45, 0xbc, 0x45, 0xdf, 0xe4, + 0xbc, 0x45, 0xdf, 0xce, 0xdf, 0xd5, 0xbc, 0x45, 0xbc, 0x45, 0xbc, 0x45, + 0xbc, 0x45, 0x00, 0xf6, 0x08, 0x0c, 0x6c, 0x09, 0x11, 0xd8, 0x08, 0x0c, + 0xd6, 0x45, 0x11, 0xc0, 0x60, 0x10, 0x90, 0x5d, 0x01, 0xa8, 0xb8, 0x84, + 0x90, 0x05, 0x01, 0x90, 0x90, 0x06, 0x08, 0x0c, 0x66, 0xe6, 0x20, 0x01, + 0x00, 0x02, 0x08, 0x0c, 0x66, 0xfa, 0x60, 0x23, 0x00, 0x01, 0x60, 0x03, + 0x00, 0x01, 0x60, 0x07, 0x00, 0x02, 0x08, 0x0c, 0x96, 0x1e, 0x08, 0x0c, + 0x9a, 0xb3, 0x00, 0xf0, 0x20, 0x11, 0x02, 0x63, 0x22, 0x04, 0x82, 0x11, + 0x22, 0x0c, 0x08, 0x0c, 0x26, 0x8c, 0x11, 0xb0, 0x08, 0x0c, 0x67, 0xb4, + 0x01, 0x18, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x80, 0xb8, 0x10, 0x00, 0x06, + 0xb8, 0x14, 0x00, 0x06, 0xb8, 0x84, 0x00, 0x06, 0x08, 0x0c, 0x61, 0xb7, + 0x00, 0x0e, 0xb8, 0x86, 0x00, 0x0e, 0xb8, 0x16, 0x00, 0x0e, 0xb8, 0x12, + 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0xfe, 0x00, 0x05, 0x66, 0x04, 0x96, 0xb6, + 0x00, 0x1e, 0x11, 0x10, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x05, 0x08, 0x0c, + 0xc0, 0x82, 0x11, 0x48, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x01, + 0x08, 0x0c, 0x96, 0x1e, 0x08, 0x0c, 0x9a, 0xb3, 0x00, 0x10, 0x08, 0x0c, + 0xb1, 0x6c, 0x00, 0x05, 0x08, 0x04, 0xb1, 0x6c, 0x60, 0x04, 0x90, 0x8a, + 0x00, 0x53, 0x1a, 0x0c, 0x0d, 0x85, 0x08, 0x0c, 0x99, 0xed, 0x08, 0x0c, + 0xb1, 0xa7, 0x00, 0x05, 0x91, 0x82, 0x00, 0x40, 0x00, 0x02, 0xe0, 0x07, + 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x09, 0xe0, 0x07, 0xe0, 0x07, + 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, + 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, + 0xe0, 0x07, 0x08, 0x0c, 0x0d, 0x85, 0x00, 0x96, 0x00, 0xb6, 0x00, 0xd6, + 0x00, 0xe6, 0x00, 0xf6, 0x00, 0x46, 0x00, 0x26, 0x62, 0x10, 0x22, 0x58, + 0xb8, 0xbc, 0x90, 0x05, 0x11, 0xb0, 0x60, 0x07, 0x00, 0x44, 0x20, 0x71, + 0x02, 0x60, 0x74, 0x44, 0x94, 0xa4, 0xff, 0x00, 0x09, 0x04, 0xe0, 0x70, + 0x08, 0x0c, 0xee, 0x42, 0x11, 0x70, 0x94, 0x86, 0x20, 0x00, 0x11, 0x58, + 0x20, 0x09, 0x00, 0x01, 0x20, 0x11, 0x02, 0x00, 0x08, 0x0c, 0x8c, 0x44, + 0x00, 0x20, 0x90, 0x26, 0x08, 0x0c, 0xec, 0xc5, 0x0c, 0x30, 0x08, 0x0c, + 0x10, 0x59, 0x09, 0x0c, 0x0d, 0x85, 0x60, 0x03, 0x00, 0x07, 0xa8, 0x67, + 0x01, 0x0d, 0x90, 0x06, 0xa8, 0x02, 0xa8, 0x6a, 0xac, 0x8a, 0x2c, 0x00, + 0xa8, 0x8e, 0x60, 0x08, 0xa8, 0xe2, 0x60, 0x10, 0x20, 0x58, 0xb8, 0xa0, + 0x71, 0x30, 0xa9, 0x7a, 0x00, 0x16, 0xa8, 0x76, 0xa8, 0x7f, 0x00, 0x00, + 0xa8, 0x83, 0x00, 0x00, 0xa8, 0x87, 0x00, 0x36, 0x08, 0x0c, 0x70, 0x12, + 0x00, 0x1e, 0x08, 0x0c, 0xee, 0x42, 0x19, 0x04, 0xe0, 0xd0, 0x94, 0x86, + 0x20, 0x00, 0x11, 0x30, 0x20, 0x19, 0x00, 0x17, 0x08, 0x0c, 0xe9, 0xf9, + 0x08, 0x04, 0xe0, 0xd0, 0x94, 0x86, 0x02, 0x00, 0x11, 0x20, 0x08, 0x0c, + 0xe9, 0x84, 0x08, 0x04, 0xe0, 0xd0, 0x94, 0x86, 0x04, 0x00, 0x01, 0x20, + 0x94, 0x86, 0x10, 0x00, 0x19, 0x04, 0xe0, 0xd0, 0x20, 0x19, 0x00, 0x02, + 0x08, 0x0c, 0xe9, 0xa3, 0x08, 0x04, 0xe0, 0xd0, 0x20, 0x69, 0x1a, 0x73, + 0x6a, 0x00, 0xd2, 0x84, 0x09, 0x04, 0xe1, 0x3a, 0x92, 0x84, 0x03, 0x00, + 0x19, 0x04, 0xe1, 0x33, 0x68, 0x04, 0x90, 0x05, 0x09, 0x04, 0xe1, 0x1b, + 0x2d, 0x78, 0x60, 0x03, 0x00, 0x07, 0x08, 0x0c, 0x10, 0x72, 0x09, 0x04, + 0xe0, 0xdc, 0x78, 0x00, 0xd0, 0x8c, 0x11, 0x18, 0x78, 0x04, 0x80, 0x01, + 0x78, 0x06, 0x60, 0x17, 0x00, 0x00, 0x20, 0x01, 0x18, 0x0f, 0x20, 0x04, + 0xd0, 0x84, 0x19, 0x04, 0xe1, 0x3e, 0x90, 0x06, 0xa8, 0x02, 0xa8, 0x67, + 0x01, 0x16, 0xa8, 0x6a, 0x60, 0x08, 0xa8, 0xe2, 0x2c, 0x00, 0xa8, 0x7a, + 0x60, 0x10, 0x20, 0x58, 0xb8, 0xa0, 0x71, 0x30, 0xa9, 0xb6, 0xa8, 0x76, + 0xb9, 0x28, 0xa9, 0xba, 0xb9, 0x2c, 0xa9, 0xbe, 0xb9, 0x30, 0xa9, 0xc2, + 0xb9, 0x34, 0xa9, 0xc6, 0xa8, 0x83, 0x00, 0x3d, 0x70, 0x44, 0x90, 0x84, + 0x00, 0x03, 0x90, 0x80, 0xe0, 0xd8, 0x20, 0x05, 0xa8, 0x7e, 0x20, 0xa9, + 0x00, 0x0a, 0x20, 0x01, 0x02, 0x70, 0xaa, 0x5c, 0x92, 0x90, 0x00, 0x21, + 0x20, 0x09, 0x02, 0x05, 0x20, 0x0b, 0x00, 0x80, 0x20, 0xe1, 0x00, 0x00, + 0xab, 0x60, 0x23, 0xe8, 0x20, 0x98, 0x22, 0xa0, 0x40, 0x03, 0x20, 0x0b, + 0x00, 0x00, 0x20, 0x01, 0x02, 0x7a, 0x20, 0x0c, 0xa9, 0xb2, 0x80, 0x00, + 0x20, 0x0c, 0xa9, 0xae, 0x08, 0x0c, 0x70, 0x15, 0x00, 0x2e, 0x00, 0x4e, + 0x00, 0xfe, 0x00, 0xee, 0x00, 0xde, 0x00, 0xbe, 0x00, 0x9e, 0x00, 0x05, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x20, 0x01, 0x18, 0x10, + 0x20, 0x04, 0xd0, 0x84, 0x01, 0x20, 0x08, 0x0c, 0x10, 0x59, 0x19, 0x04, + 0xe0, 0x85, 0x60, 0x17, 0xf1, 0x00, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, + 0x00, 0x41, 0x20, 0x09, 0xa0, 0x22, 0x08, 0x0c, 0x96, 0x17, 0x0c, 0x00, + 0x20, 0x69, 0x02, 0x60, 0x68, 0x48, 0x90, 0x84, 0xff, 0x00, 0x90, 0x86, + 0x12, 0x00, 0x11, 0x98, 0x68, 0x6c, 0x90, 0x84, 0x00, 0xff, 0x00, 0x16, + 0x61, 0x14, 0x91, 0x8c, 0xf7, 0x00, 0x91, 0x0d, 0x61, 0x16, 0x00, 0x1e, + 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x43, 0x20, 0x09, 0xa0, 0x25, + 0x08, 0x0c, 0x96, 0x17, 0x08, 0x28, 0x68, 0x68, 0x60, 0x2e, 0x68, 0x6c, + 0x60, 0x32, 0x60, 0x17, 0xf2, 0x00, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, + 0x00, 0x41, 0x20, 0x09, 0xa0, 0x22, 0x08, 0x0c, 0x96, 0x17, 0x08, 0x04, + 0xe0, 0xd0, 0x20, 0x01, 0x18, 0x0e, 0x20, 0x04, 0xd0, 0xec, 0x01, 0x20, + 0x20, 0x11, 0x80, 0x49, 0x08, 0x0c, 0x4c, 0xa1, 0x60, 0x17, 0xf3, 0x00, + 0x00, 0x10, 0x60, 0x17, 0xf1, 0x00, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, + 0x00, 0x41, 0x20, 0x09, 0xa0, 0x22, 0x08, 0x0c, 0x96, 0x17, 0x08, 0x04, + 0xe0, 0xd0, 0x60, 0x17, 0xf5, 0x00, 0x0c, 0x98, 0x60, 0x17, 0xf6, 0x00, + 0x08, 0x04, 0xe0, 0xf0, 0x60, 0x17, 0xf2, 0x00, 0x08, 0x04, 0xe0, 0xf0, + 0xa8, 0x67, 0x01, 0x46, 0xa8, 0x6b, 0x00, 0x00, 0x60, 0x08, 0xa8, 0x86, + 0x2c, 0x00, 0xa8, 0x7a, 0x70, 0x44, 0x90, 0x84, 0x00, 0x03, 0x90, 0x80, + 0xe0, 0xd8, 0x20, 0x05, 0xa8, 0x7e, 0x29, 0x28, 0x60, 0x10, 0x20, 0x58, + 0xb8, 0xa0, 0xa8, 0x76, 0xb8, 0x28, 0xa8, 0x8a, 0xb8, 0x2c, 0xa8, 0x8e, + 0xb8, 0x30, 0xa8, 0x92, 0xb8, 0x34, 0xa8, 0x96, 0xa8, 0x83, 0x00, 0x3d, + 0x20, 0x09, 0x02, 0x05, 0x21, 0x04, 0x90, 0x85, 0x00, 0x80, 0x20, 0x0a, + 0x20, 0xe1, 0x00, 0x00, 0x20, 0x11, 0x02, 0x10, 0x22, 0x14, 0x92, 0x94, + 0x0f, 0xff, 0xaa, 0xa2, 0x92, 0x82, 0x01, 0x11, 0x1a, 0x0c, 0x0d, 0x85, + 0x82, 0x10, 0x82, 0x1c, 0x20, 0x01, 0x02, 0x6c, 0x20, 0x98, 0xa8, 0x60, + 0x20, 0xe8, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x29, 0x20, 0xa0, 0x20, 0x11, + 0xe1, 0xba, 0x20, 0x41, 0x00, 0x01, 0x22, 0x3d, 0x97, 0x84, 0x00, 0xff, + 0x93, 0x22, 0x12, 0x08, 0x23, 0x00, 0x20, 0xa8, 0x40, 0x03, 0x93, 0x1a, + 0x05, 0x30, 0x82, 0x10, 0xd7, 0xfc, 0x11, 0x30, 0x8d, 0x68, 0x2d, 0x0a, + 0x20, 0x01, 0x02, 0x60, 0x20, 0x98, 0x0c, 0x68, 0x29, 0x50, 0x08, 0x0c, + 0x10, 0x72, 0x01, 0x70, 0x29, 0x00, 0xb0, 0x02, 0xa8, 0x67, 0x01, 0x47, + 0xa8, 0x6b, 0x00, 0x00, 0xa8, 0x60, 0x20, 0xe8, 0xa8, 0x5c, 0x90, 0x80, + 0x00, 0x1b, 0x20, 0xa0, 0x88, 0x40, 0x08, 0xd8, 0x25, 0x48, 0xa8, 0x00, + 0x90, 0x2d, 0x01, 0x18, 0x08, 0x0c, 0x10, 0x8b, 0x0c, 0xc8, 0x08, 0x0c, + 0x10, 0x8b, 0x08, 0x04, 0xe0, 0xdc, 0x25, 0x48, 0x88, 0x47, 0x98, 0x85, + 0x00, 0x46, 0xa8, 0x66, 0x20, 0x09, 0x02, 0x05, 0x20, 0x0b, 0x00, 0x00, + 0x08, 0x0c, 0xea, 0x30, 0x08, 0x04, 0xe0, 0xd0, 0x80, 0x10, 0x00, 0x04, + 0x80, 0x1a, 0x00, 0x06, 0x80, 0x18, 0x00, 0x08, 0x80, 0x16, 0x00, 0x0a, + 0x80, 0x14, 0x91, 0x86, 0x00, 0x13, 0x11, 0x60, 0x60, 0x04, 0x90, 0x8a, + 0x00, 0x57, 0x1a, 0x0c, 0x0d, 0x85, 0x90, 0x82, 0x00, 0x40, 0x0a, 0x0c, + 0x0d, 0x85, 0x20, 0x08, 0x08, 0x04, 0xe2, 0x46, 0x91, 0x86, 0x00, 0x51, + 0x01, 0x08, 0x00, 0x40, 0x08, 0x0c, 0xaf, 0x61, 0x01, 0xe8, 0x90, 0x86, + 0x00, 0x02, 0x09, 0x04, 0xe2, 0x8e, 0x00, 0xc0, 0x91, 0x86, 0x00, 0x27, + 0x01, 0x80, 0x91, 0x86, 0x00, 0x48, 0x01, 0x28, 0x91, 0x86, 0x00, 0x14, + 0x01, 0x50, 0x19, 0x0c, 0x0d, 0x85, 0x08, 0x0c, 0xaf, 0x61, 0x01, 0x50, + 0x90, 0x86, 0x00, 0x04, 0x09, 0x04, 0xe3, 0x2d, 0x00, 0x28, 0x60, 0x04, + 0x90, 0x82, 0x00, 0x40, 0x20, 0x08, 0x00, 0x1a, 0x08, 0x0c, 0xb2, 0x27, + 0x00, 0x05, 0xe2, 0x0d, 0xe2, 0x0f, 0xe2, 0x0f, 0xe2, 0x36, 0xe2, 0x0d, + 0xe2, 0x0d, 0xe2, 0x0d, 0xe2, 0x0d, 0xe2, 0x0d, 0xe2, 0x0d, 0xe2, 0x0d, + 0xe2, 0x0d, 0xe2, 0x0d, 0xe2, 0x0d, 0xe2, 0x0d, 0xe2, 0x0d, 0xe2, 0x0d, + 0xe2, 0x0d, 0xe2, 0x0d, 0xe2, 0x0d, 0x08, 0x0c, 0x0d, 0x85, 0x08, 0x0c, + 0x99, 0xed, 0x08, 0x0c, 0x9a, 0xb3, 0x00, 0x36, 0x00, 0x96, 0x60, 0x14, + 0x90, 0x4d, 0x01, 0xd8, 0x08, 0x0c, 0xcf, 0x1b, 0x01, 0xc0, 0x60, 0x03, + 0x00, 0x02, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x00, 0x00, 0xbe, + 0xd0, 0xbc, 0x11, 0x78, 0x20, 0x19, 0x00, 0x04, 0x08, 0x0c, 0xea, 0x30, + 0x60, 0x17, 0x00, 0x00, 0x60, 0x18, 0x90, 0x05, 0x11, 0x20, 0x20, 0x01, + 0x19, 0x87, 0x20, 0x04, 0x60, 0x1a, 0x60, 0x03, 0x00, 0x07, 0x00, 0x9e, + 0x00, 0x3e, 0x00, 0x05, 0x00, 0x96, 0x08, 0x0c, 0x99, 0xed, 0x08, 0x0c, + 0x9a, 0xb3, 0x08, 0x0c, 0xcf, 0x1b, 0x01, 0x20, 0x60, 0x14, 0x20, 0x48, + 0x08, 0x0c, 0x10, 0x8b, 0x08, 0x0c, 0xb1, 0xa7, 0x00, 0x9e, 0x00, 0x05, + 0x00, 0x02, 0xe2, 0x5b, 0xe2, 0x70, 0xe2, 0x5d, 0xe2, 0x85, 0xe2, 0x5b, + 0xe2, 0x5b, 0xe2, 0x5b, 0xe2, 0x5b, 0xe2, 0x5b, 0xe2, 0x5b, 0xe2, 0x5b, + 0xe2, 0x5b, 0xe2, 0x5b, 0xe2, 0x5b, 0xe2, 0x5b, 0xe2, 0x5b, 0xe2, 0x5b, + 0xe2, 0x5b, 0xe2, 0x5b, 0xe2, 0x5b, 0x08, 0x0c, 0x0d, 0x85, 0x00, 0x96, + 0x60, 0x14, 0x20, 0x48, 0xa8, 0x7c, 0xd0, 0xb4, 0x01, 0x38, 0x60, 0x03, + 0x00, 0x07, 0x20, 0x09, 0x00, 0x43, 0x08, 0x0c, 0xb2, 0x0a, 0x00, 0x10, + 0x60, 0x03, 0x00, 0x04, 0x08, 0x0c, 0x9a, 0xb3, 0x00, 0x9e, 0x00, 0x05, + 0x08, 0x0c, 0xcf, 0x1b, 0x01, 0x38, 0x61, 0x14, 0x00, 0x96, 0x21, 0x48, + 0xa9, 0x7c, 0x00, 0x9e, 0xd1, 0xec, 0x11, 0x38, 0x08, 0x0c, 0x8c, 0x19, + 0x08, 0x0c, 0xb1, 0x6c, 0x08, 0x0c, 0x9a, 0xb3, 0x00, 0x05, 0x08, 0x0c, + 0xec, 0x89, 0x0d, 0xb0, 0x0c, 0xc8, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, + 0x00, 0x41, 0x20, 0x09, 0xa0, 0x22, 0x08, 0x0c, 0x96, 0x17, 0x00, 0x05, + 0x91, 0x82, 0x00, 0x40, 0x00, 0x02, 0xe2, 0xa5, 0xe2, 0xa7, 0xe2, 0xa5, + 0xe2, 0xa5, 0xe2, 0xa5, 0xe2, 0xa5, 0xe2, 0xa5, 0xe2, 0xa5, 0xe2, 0xa5, + 0xe2, 0xa5, 0xe2, 0xa5, 0xe2, 0xa5, 0xe2, 0xa5, 0xe2, 0xa5, 0xe2, 0xa5, + 0xe2, 0xa5, 0xe2, 0xa5, 0xe2, 0xa8, 0xe2, 0xa5, 0xe2, 0xa5, 0x08, 0x0c, + 0x0d, 0x85, 0x00, 0x05, 0x00, 0xd6, 0x08, 0x0c, 0x8c, 0x19, 0x00, 0xde, + 0x08, 0x0c, 0xec, 0xe1, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x05, 0x91, 0x82, + 0x00, 0x40, 0x00, 0x02, 0xe2, 0xc8, 0xe2, 0xc8, 0xe2, 0xc8, 0xe2, 0xc8, + 0xe2, 0xc8, 0xe2, 0xc8, 0xe2, 0xc8, 0xe2, 0xc8, 0xe2, 0xc8, 0xe2, 0xca, + 0xe2, 0xf5, 0xe2, 0xc8, 0xe2, 0xc8, 0xe2, 0xc8, 0xe2, 0xc8, 0xe2, 0xf5, + 0xe2, 0xc8, 0xe2, 0xc8, 0xe2, 0xc8, 0xe2, 0xc8, 0x08, 0x0c, 0x0d, 0x85, + 0x60, 0x14, 0x00, 0x96, 0x20, 0x48, 0xa8, 0x7c, 0xd0, 0xfc, 0x01, 0x68, + 0x90, 0x8c, 0x00, 0x03, 0x91, 0x8e, 0x00, 0x02, 0x01, 0x80, 0x61, 0x44, + 0xd1, 0xe4, 0x11, 0x68, 0x20, 0x09, 0x00, 0x41, 0x00, 0x9e, 0x08, 0x04, + 0xe3, 0xb5, 0x60, 0x03, 0x00, 0x07, 0x60, 0x1b, 0x00, 0x00, 0x08, 0x0c, + 0x8c, 0x19, 0x00, 0x9e, 0x00, 0x05, 0x60, 0x14, 0x20, 0x48, 0xa9, 0x7c, + 0xd1, 0xec, 0x11, 0x30, 0x08, 0x0c, 0x8c, 0x19, 0x08, 0x0c, 0xb1, 0x6c, + 0x00, 0x9e, 0x00, 0x05, 0x08, 0x0c, 0xec, 0x89, 0x0d, 0xb8, 0x00, 0x9e, + 0x00, 0x05, 0x20, 0x01, 0x18, 0x0c, 0x20, 0x0c, 0xc1, 0xd4, 0x21, 0x02, + 0x00, 0x36, 0x08, 0x0c, 0x9a, 0x48, 0x08, 0x0c, 0x9a, 0xb3, 0x60, 0x14, + 0x00, 0x96, 0x20, 0x48, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x00, + 0x00, 0xbe, 0xd0, 0xbc, 0x01, 0x88, 0xa8, 0x7c, 0x90, 0x84, 0x00, 0x03, + 0x90, 0x86, 0x00, 0x02, 0x01, 0x40, 0xa8, 0xac, 0x63, 0x30, 0x93, 0x1a, + 0x63, 0x32, 0xa8, 0xb0, 0x63, 0x2c, 0x93, 0x1b, 0x63, 0x2e, 0x60, 0x03, + 0x00, 0x02, 0x00, 0x80, 0x20, 0x19, 0x00, 0x04, 0x08, 0x0c, 0xea, 0x30, + 0x60, 0x18, 0x90, 0x05, 0x11, 0x28, 0x20, 0x01, 0x19, 0x87, 0x20, 0x04, + 0x80, 0x03, 0x60, 0x1a, 0x60, 0x17, 0x00, 0x00, 0x60, 0x03, 0x00, 0x07, + 0x00, 0x9e, 0x00, 0x3e, 0x00, 0x05, 0x91, 0x82, 0x00, 0x40, 0x00, 0x02, + 0xe3, 0x44, 0xe3, 0x44, 0xe3, 0x44, 0xe3, 0x44, 0xe3, 0x44, 0xe3, 0x44, + 0xe3, 0x44, 0xe3, 0x44, 0xe3, 0x46, 0xe3, 0x44, 0xe3, 0x44, 0xe3, 0x44, + 0xe3, 0x44, 0xe3, 0x44, 0xe3, 0x44, 0xe3, 0x44, 0xe3, 0x44, 0xe3, 0x44, + 0xe3, 0x44, 0xe3, 0x91, 0x08, 0x0c, 0x0d, 0x85, 0x60, 0x14, 0x00, 0x96, + 0x20, 0x48, 0xa8, 0x34, 0xaa, 0x38, 0x61, 0x10, 0x00, 0xb6, 0x21, 0x58, + 0xb9, 0x00, 0x00, 0xbe, 0xd1, 0xbc, 0x11, 0x90, 0x92, 0x0d, 0x15, 0x18, + 0xa8, 0x7c, 0xd0, 0xfc, 0x01, 0x28, 0x20, 0x09, 0x00, 0x41, 0x00, 0x9e, + 0x08, 0x04, 0xe3, 0xb5, 0x60, 0x03, 0x00, 0x07, 0x60, 0x1b, 0x00, 0x00, + 0x08, 0x0c, 0x8c, 0x19, 0x00, 0x9e, 0x00, 0x05, 0x61, 0x24, 0xd1, 0xf4, + 0x1d, 0x58, 0x00, 0x06, 0x00, 0x46, 0xac, 0xac, 0x94, 0x22, 0xa9, 0xb0, + 0x22, 0x00, 0x91, 0x0b, 0x60, 0x30, 0x94, 0x20, 0x64, 0x32, 0x60, 0x2c, + 0x91, 0x09, 0x61, 0x2e, 0x00, 0x4e, 0x00, 0x0e, 0x08, 0xd8, 0x61, 0x10, + 0x00, 0xb6, 0x21, 0x58, 0xb9, 0x00, 0x00, 0xbe, 0xd1, 0xbc, 0x11, 0x78, + 0x20, 0x09, 0x18, 0x0e, 0x21, 0x0c, 0xd1, 0x9c, 0x01, 0x18, 0x60, 0x03, + 0x00, 0x07, 0x00, 0x10, 0x60, 0x03, 0x00, 0x06, 0x00, 0xe9, 0x08, 0x0c, + 0x8c, 0x1b, 0x00, 0x9e, 0x00, 0x05, 0x60, 0x03, 0x00, 0x02, 0x00, 0x9e, + 0x00, 0x05, 0x60, 0x24, 0xd0, 0xf4, 0x01, 0x28, 0x08, 0x0c, 0x16, 0xb0, + 0x19, 0x04, 0xe3, 0x46, 0x00, 0x05, 0x60, 0x14, 0x00, 0x96, 0x20, 0x48, + 0xa8, 0x34, 0xa9, 0x38, 0x00, 0x9e, 0x91, 0x05, 0x11, 0x20, 0x08, 0x0c, + 0x16, 0xb0, 0x19, 0x04, 0xe3, 0x46, 0x00, 0x05, 0xd2, 0xfc, 0x01, 0x40, + 0x80, 0x02, 0x80, 0x00, 0x82, 0x12, 0x92, 0x91, 0x00, 0x00, 0x20, 0x09, + 0x00, 0x09, 0x00, 0x10, 0x20, 0x09, 0x00, 0x15, 0xaa, 0x9a, 0xa8, 0x96, + 0x00, 0x05, 0x91, 0x82, 0x00, 0x40, 0x02, 0x08, 0x00, 0x62, 0x91, 0x86, + 0x00, 0x13, 0x01, 0x20, 0x91, 0x86, 0x00, 0x14, 0x19, 0x0c, 0x0d, 0x85, + 0x60, 0x24, 0xd0, 0xdc, 0x09, 0x0c, 0x0d, 0x85, 0x00, 0x05, 0xe3, 0xd9, + 0xe3, 0xe5, 0xe3, 0xf1, 0xe3, 0xfd, 0xe3, 0xd9, 0xe3, 0xd9, 0xe3, 0xd9, + 0xe3, 0xd9, 0xe3, 0xe0, 0xe3, 0xdb, 0xe3, 0xdb, 0xe3, 0xd9, 0xe3, 0xd9, + 0xe3, 0xd9, 0xe3, 0xd9, 0xe3, 0xdb, 0xe3, 0xd9, 0xe3, 0xdb, 0xe3, 0xd9, + 0xe3, 0xe0, 0x08, 0x0c, 0x0d, 0x85, 0x60, 0x24, 0xd0, 0xdc, 0x09, 0x0c, + 0x0d, 0x85, 0x00, 0x05, 0x60, 0x14, 0x90, 0x05, 0x19, 0x0c, 0x0d, 0x85, + 0x00, 0x05, 0x60, 0x03, 0x00, 0x01, 0x61, 0x06, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x09, 0xa0, 0x22, 0x08, 0x0c, 0x95, 0xf9, 0x01, 0x2e, + 0x00, 0x05, 0x60, 0x03, 0x00, 0x04, 0x61, 0x06, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x20, 0x09, 0xa0, 0x01, 0x08, 0x0c, 0x96, 0x17, 0x01, 0x2e, + 0x00, 0x05, 0x60, 0x03, 0x00, 0x03, 0x61, 0x06, 0x60, 0x47, 0x00, 0x00, + 0x08, 0x0c, 0x1c, 0x6f, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x60, 0x14, + 0x00, 0x96, 0x20, 0x48, 0xa8, 0x7c, 0xd0, 0xfc, 0x01, 0x88, 0x90, 0x84, + 0x00, 0x03, 0x90, 0x86, 0x00, 0x02, 0x01, 0xa0, 0x60, 0x24, 0xd0, 0xcc, + 0x11, 0x48, 0xd0, 0xc4, 0x11, 0x38, 0xa8, 0xa8, 0x90, 0x05, 0x11, 0x20, + 0x61, 0x44, 0x91, 0x8d, 0xb0, 0x35, 0x00, 0x18, 0x61, 0x44, 0x91, 0x8d, + 0xa0, 0x35, 0x00, 0x9e, 0x08, 0x0c, 0x96, 0x5e, 0x01, 0x2e, 0x00, 0x05, + 0x61, 0x44, 0x91, 0x8d, 0xa0, 0x32, 0x0c, 0xb8, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x00, 0x36, 0x00, 0x96, 0x91, 0x82, 0x00, 0x40, 0x00, 0x23, + 0x00, 0x9e, 0x00, 0x3e, 0x01, 0x2e, 0x00, 0x05, 0xe4, 0x4a, 0xe4, 0x4c, + 0xe4, 0x61, 0xe4, 0x7b, 0xe4, 0x4a, 0xe4, 0x4a, 0xe4, 0x4a, 0xe4, 0x4a, + 0xe4, 0x4a, 0xe4, 0x4a, 0xe4, 0x4a, 0xe4, 0x4a, 0xe4, 0x4a, 0xe4, 0x4a, + 0xe4, 0x4a, 0xe4, 0x4a, 0xe4, 0x4a, 0xe4, 0x4a, 0xe4, 0x4a, 0xe4, 0x4a, + 0x08, 0x0c, 0x0d, 0x85, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x7c, 0xd0, 0xfc, + 0x05, 0x10, 0x90, 0x9c, 0x00, 0x03, 0x93, 0x9e, 0x00, 0x03, 0x01, 0xe8, + 0x60, 0x03, 0x00, 0x01, 0x61, 0x06, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x20, 0x09, 0xa0, 0x22, 0x08, 0x0c, 0x96, 0x17, 0x04, 0x80, 0x60, 0x14, + 0x20, 0x48, 0xa8, 0x7c, 0xd0, 0xfc, 0x01, 0x68, 0x90, 0x9c, 0x00, 0x03, + 0x93, 0x9e, 0x00, 0x03, 0x01, 0x40, 0x60, 0x03, 0x00, 0x01, 0x61, 0x06, + 0x20, 0x09, 0xa0, 0x01, 0x08, 0x0c, 0x96, 0x17, 0x00, 0xf0, 0x90, 0x1e, + 0x63, 0x16, 0x63, 0x1a, 0x20, 0x19, 0x00, 0x04, 0x08, 0x0c, 0xea, 0x30, + 0x00, 0xb0, 0x60, 0x14, 0x20, 0x48, 0xa8, 0x7c, 0xd0, 0xfc, 0x0d, 0x98, + 0x90, 0x9c, 0x00, 0x03, 0x93, 0x9e, 0x00, 0x03, 0x0d, 0x70, 0x60, 0x03, + 0x00, 0x03, 0x61, 0x06, 0x60, 0x47, 0x00, 0x00, 0x08, 0x0c, 0x1c, 0x6f, + 0x61, 0x44, 0x91, 0x8d, 0xa0, 0x35, 0x08, 0x0c, 0x96, 0x5e, 0x00, 0x05, + 0x08, 0x0c, 0x99, 0xed, 0x61, 0x14, 0x81, 0xff, 0x01, 0x58, 0x00, 0x96, + 0x21, 0x48, 0x08, 0x0c, 0xed, 0xdf, 0x00, 0x36, 0x20, 0x19, 0x00, 0x29, + 0x08, 0x0c, 0xea, 0x30, 0x00, 0x3e, 0x00, 0x9e, 0x08, 0x0c, 0xb1, 0xa7, + 0x08, 0x0c, 0x9a, 0xb3, 0x00, 0x05, 0x08, 0x0c, 0x9a, 0x48, 0x61, 0x14, + 0x81, 0xff, 0x01, 0x58, 0x00, 0x96, 0x21, 0x48, 0x08, 0x0c, 0xed, 0xdf, + 0x00, 0x36, 0x20, 0x19, 0x00, 0x29, 0x08, 0x0c, 0xea, 0x30, 0x00, 0x3e, + 0x00, 0x9e, 0x08, 0x0c, 0xb1, 0xa7, 0x00, 0x05, 0x91, 0x82, 0x00, 0x85, + 0x00, 0x02, 0xe4, 0xcc, 0xe4, 0xca, 0xe4, 0xca, 0xe4, 0xd8, 0xe4, 0xca, + 0xe4, 0xca, 0xe4, 0xca, 0xe4, 0xca, 0xe4, 0xca, 0xe4, 0xca, 0xe4, 0xca, + 0xe4, 0xca, 0xe4, 0xca, 0x08, 0x0c, 0x0d, 0x85, 0x60, 0x03, 0x00, 0x0b, + 0x61, 0x06, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x20, 0x09, 0x80, 0x20, + 0x08, 0x0c, 0x96, 0x17, 0x01, 0x2e, 0x00, 0x05, 0x00, 0x26, 0x00, 0xe6, + 0x08, 0x0c, 0xec, 0x80, 0x01, 0x18, 0x08, 0x0c, 0xb1, 0x6c, 0x04, 0x40, + 0x20, 0x71, 0x02, 0x60, 0x72, 0x24, 0x62, 0x16, 0x20, 0x01, 0x18, 0x0e, + 0x20, 0x04, 0xd0, 0xe4, 0x01, 0x50, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, + 0xbc, 0xa0, 0x00, 0xbe, 0x2c, 0x00, 0x20, 0x11, 0x01, 0x4e, 0x08, 0x0c, + 0xb4, 0x95, 0x72, 0x20, 0x08, 0x0c, 0xe8, 0x75, 0x01, 0x18, 0x60, 0x07, + 0x00, 0x86, 0x00, 0x40, 0x60, 0x07, 0x00, 0x87, 0x72, 0x24, 0x92, 0x96, + 0xff, 0xff, 0x11, 0x10, 0x60, 0x07, 0x00, 0x86, 0x60, 0x03, 0x00, 0x01, + 0x20, 0x09, 0x80, 0x20, 0x08, 0x0c, 0x96, 0x17, 0x00, 0xee, 0x00, 0x2e, + 0x00, 0x05, 0x91, 0x86, 0x00, 0x13, 0x11, 0x60, 0x60, 0x04, 0x90, 0x8a, + 0x00, 0x85, 0x0a, 0x0c, 0x0d, 0x85, 0x90, 0x8a, 0x00, 0x92, 0x1a, 0x0c, + 0x0d, 0x85, 0x90, 0x82, 0x00, 0x85, 0x00, 0xa2, 0x91, 0x86, 0x00, 0x27, + 0x01, 0x30, 0x91, 0x86, 0x00, 0x14, 0x01, 0x18, 0x08, 0x0c, 0xb2, 0x27, + 0x00, 0x50, 0x20, 0x01, 0x00, 0x07, 0x08, 0x0c, 0x67, 0x26, 0x08, 0x0c, + 0x99, 0xed, 0x08, 0x0c, 0xb1, 0xa7, 0x08, 0x0c, 0x9a, 0xb3, 0x00, 0x05, + 0xe5, 0x3b, 0xe5, 0x3d, 0xe5, 0x3d, 0xe5, 0x3b, 0xe5, 0x3b, 0xe5, 0x3b, + 0xe5, 0x3b, 0xe5, 0x3b, 0xe5, 0x3b, 0xe5, 0x3b, 0xe5, 0x3b, 0xe5, 0x3b, + 0xe5, 0x3b, 0x08, 0x0c, 0x0d, 0x85, 0x08, 0x0c, 0xb1, 0xa7, 0x08, 0x0c, + 0x9a, 0xb3, 0x00, 0x05, 0x91, 0x82, 0x00, 0x85, 0x0a, 0x0c, 0x0d, 0x85, + 0x91, 0x82, 0x00, 0x92, 0x1a, 0x0c, 0x0d, 0x85, 0x91, 0x82, 0x00, 0x85, + 0x00, 0x02, 0xe5, 0x5a, 0xe5, 0x5a, 0xe5, 0x5a, 0xe5, 0x5c, 0xe5, 0x5a, + 0xe5, 0x5a, 0xe5, 0x5a, 0xe5, 0x5a, 0xe5, 0x5a, 0xe5, 0x5a, 0xe5, 0x5a, + 0xe5, 0x5a, 0xe5, 0x5a, 0x08, 0x0c, 0x0d, 0x85, 0x00, 0x05, 0x91, 0x86, + 0x00, 0x13, 0x01, 0x48, 0x91, 0x86, 0x00, 0x14, 0x01, 0x30, 0x91, 0x86, + 0x00, 0x27, 0x01, 0x18, 0x08, 0x0c, 0xb2, 0x27, 0x00, 0x20, 0x08, 0x0c, + 0x99, 0xed, 0x08, 0x0c, 0xb1, 0xa7, 0x00, 0x05, 0x00, 0x36, 0x08, 0x0c, + 0xec, 0xe1, 0x60, 0x4b, 0x00, 0x00, 0x20, 0x19, 0x00, 0x0b, 0x00, 0x11, + 0x00, 0x3e, 0x00, 0x05, 0x60, 0x10, 0x00, 0x06, 0x00, 0x59, 0x00, 0x0e, + 0x60, 0x12, 0x60, 0x23, 0x00, 0x06, 0x60, 0x03, 0x00, 0x07, 0x60, 0x1b, + 0x00, 0x00, 0x60, 0x4b, 0x00, 0x00, 0x00, 0x05, 0x01, 0x26, 0x00, 0x36, + 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0xac, 0xfc, 0x01, 0x06, 0x00, 0x86, + 0x2c, 0x40, 0x00, 0x96, 0x90, 0x4e, 0x08, 0x0c, 0xa6, 0x67, 0x00, 0x9e, + 0x00, 0x8e, 0x15, 0x58, 0x00, 0x76, 0x2c, 0x38, 0x08, 0x0c, 0xa7, 0x12, + 0x00, 0x7e, 0x15, 0x28, 0x60, 0x00, 0x90, 0x86, 0x00, 0x00, 0x05, 0x08, + 0x60, 0x20, 0x90, 0x86, 0x00, 0x07, 0x01, 0xe8, 0x00, 0x96, 0x60, 0x1c, + 0xd0, 0x84, 0x01, 0x40, 0x08, 0x0c, 0xec, 0xe1, 0x08, 0x0c, 0xd6, 0x5d, + 0x08, 0x0c, 0x1a, 0xd3, 0x60, 0x23, 0x00, 0x07, 0x60, 0x14, 0x20, 0x48, + 0x08, 0x0c, 0xcf, 0x1b, 0x01, 0x10, 0x08, 0x0c, 0xea, 0x30, 0x00, 0x9e, + 0x90, 0x06, 0x60, 0x46, 0x60, 0x16, 0x08, 0x0c, 0xec, 0xe1, 0x60, 0x23, + 0x00, 0x07, 0x08, 0x0c, 0xd6, 0x5d, 0x01, 0x0e, 0x09, 0x0c, 0xad, 0x18, + 0x00, 0x3e, 0x01, 0x2e, 0x00, 0x05, 0x00, 0xf6, 0x00, 0xc6, 0x00, 0xb6, + 0x00, 0x36, 0x01, 0x56, 0x20, 0x79, 0x02, 0x60, 0x79, 0x38, 0x78, 0x3c, + 0x08, 0x0c, 0x26, 0x8c, 0x19, 0x04, 0xe6, 0x21, 0x00, 0x16, 0x00, 0xc6, + 0x08, 0x0c, 0x67, 0xb4, 0x19, 0x04, 0xe6, 0x1f, 0x00, 0x1e, 0x00, 0xc6, + 0x08, 0x0c, 0xd6, 0x45, 0x11, 0x30, 0xb8, 0x84, 0x90, 0x05, 0x01, 0x18, + 0x08, 0x0c, 0x34, 0x7d, 0x01, 0x48, 0x2b, 0x10, 0x21, 0x60, 0x60, 0x10, + 0x00, 0x06, 0x62, 0x12, 0x08, 0x0c, 0xd6, 0x4c, 0x00, 0x0e, 0x60, 0x12, + 0x00, 0xce, 0x00, 0x2e, 0x00, 0x26, 0x00, 0x16, 0x08, 0x0c, 0xac, 0xfc, + 0x20, 0x19, 0x00, 0x29, 0x08, 0x0c, 0xa7, 0xe2, 0x08, 0x0c, 0x97, 0xb0, + 0x00, 0x76, 0x90, 0x3e, 0x08, 0x0c, 0x96, 0x6d, 0x00, 0x7e, 0x00, 0x1e, + 0x00, 0x76, 0x90, 0x3e, 0x08, 0x0c, 0xe7, 0x5d, 0x00, 0x7e, 0x08, 0x0c, + 0xad, 0x18, 0x00, 0x26, 0xba, 0x04, 0x92, 0x94, 0xff, 0x00, 0x82, 0x17, + 0x92, 0x86, 0x00, 0x06, 0x01, 0x18, 0x92, 0x86, 0x00, 0x04, 0x11, 0x18, + 0xba, 0xa0, 0x08, 0x0c, 0x33, 0xe0, 0x00, 0x2e, 0xbc, 0x84, 0x00, 0x1e, + 0x08, 0x0c, 0x61, 0xb7, 0xbe, 0x12, 0xbd, 0x16, 0xbc, 0x86, 0x90, 0x06, + 0x00, 0x10, 0x00, 0xce, 0x00, 0x1e, 0x01, 0x5e, 0x00, 0x3e, 0x00, 0xbe, + 0x00, 0xce, 0x00, 0xfe, 0x00, 0x05, 0x00, 0xc6, 0x00, 0xd6, 0x00, 0xb6, + 0x00, 0x16, 0x20, 0x09, 0x18, 0x24, 0x21, 0x04, 0x90, 0x86, 0x00, 0x74, + 0x19, 0x04, 0xe6, 0x80, 0x20, 0x69, 0x02, 0x60, 0x69, 0x44, 0x91, 0x82, + 0x01, 0x00, 0x06, 0xe0, 0x69, 0x40, 0x91, 0x84, 0x80, 0x00, 0x09, 0x04, + 0xe6, 0x7d, 0x20, 0x01, 0x19, 0x7c, 0x20, 0x04, 0x90, 0x05, 0x11, 0x40, + 0x60, 0x10, 0x20, 0x58, 0xb8, 0x84, 0x90, 0x05, 0x01, 0x18, 0x91, 0x84, + 0x08, 0x00, 0x05, 0x98, 0x69, 0x48, 0x91, 0x8a, 0x00, 0x01, 0x06, 0x48, + 0x08, 0x0c, 0xee, 0x47, 0x01, 0x18, 0x69, 0x78, 0xd1, 0xfc, 0x11, 0xb8, + 0x20, 0x09, 0x02, 0x05, 0x20, 0x0b, 0x00, 0x01, 0x69, 0x3c, 0x81, 0xff, + 0x11, 0x98, 0x69, 0x44, 0x91, 0x82, 0x01, 0x00, 0x02, 0xa8, 0x69, 0x40, + 0x81, 0xff, 0x11, 0x78, 0x69, 0x48, 0x91, 0x8a, 0x00, 0x01, 0x02, 0x88, + 0x69, 0x50, 0x91, 0x8a, 0x00, 0x01, 0x02, 0x98, 0x00, 0xd0, 0x60, 0x17, + 0x01, 0x00, 0x00, 0xa0, 0x60, 0x17, 0x03, 0x00, 0x00, 0x88, 0x60, 0x17, + 0x05, 0x00, 0x00, 0x70, 0x60, 0x17, 0x07, 0x00, 0x00, 0x58, 0x60, 0x17, + 0x09, 0x00, 0x00, 0x40, 0x60, 0x17, 0x0b, 0x00, 0x00, 0x28, 0x60, 0x17, + 0x0f, 0x00, 0x00, 0x10, 0x60, 0x17, 0x2d, 0x00, 0x90, 0x85, 0x00, 0x01, + 0x00, 0x08, 0x90, 0x06, 0x00, 0x1e, 0x00, 0xbe, 0x00, 0xde, 0x00, 0xce, + 0x00, 0x05, 0x00, 0xc6, 0x00, 0xb6, 0x00, 0x26, 0x00, 0x36, 0x01, 0x56, + 0x62, 0x10, 0x22, 0x58, 0xbb, 0x04, 0x93, 0x94, 0x00, 0xff, 0x92, 0x86, + 0x00, 0x06, 0x01, 0x80, 0x92, 0x86, 0x00, 0x04, 0x01, 0x68, 0x93, 0x94, + 0xff, 0x00, 0x82, 0x17, 0x92, 0x86, 0x00, 0x06, 0x01, 0x38, 0x92, 0x86, + 0x00, 0x04, 0x01, 0x20, 0x08, 0x0c, 0x67, 0xc3, 0x08, 0x04, 0xe6, 0xec, + 0x20, 0x11, 0x02, 0x76, 0x20, 0xa9, 0x00, 0x04, 0x00, 0x96, 0x2b, 0x48, + 0x20, 0x19, 0x00, 0x0a, 0x08, 0x0c, 0xc2, 0x22, 0x00, 0x9e, 0x15, 0xc8, + 0x20, 0x11, 0x02, 0x7a, 0x20, 0xa9, 0x00, 0x04, 0x00, 0x96, 0x2b, 0x48, + 0x20, 0x19, 0x00, 0x06, 0x08, 0x0c, 0xc2, 0x22, 0x00, 0x9e, 0x15, 0x68, + 0x00, 0x46, 0x00, 0x16, 0xba, 0xa0, 0x22, 0x20, 0x90, 0x06, 0x20, 0x09, + 0x18, 0x48, 0x21, 0x0c, 0xd1, 0xa4, 0x01, 0x38, 0x20, 0x09, 0x00, 0x29, + 0x08, 0x0c, 0xea, 0x8d, 0xb8, 0x00, 0xc0, 0xe5, 0xb8, 0x02, 0x08, 0x0c, + 0xac, 0xfc, 0x20, 0x19, 0x00, 0x29, 0x08, 0x0c, 0x97, 0xb0, 0x00, 0x76, + 0x20, 0x39, 0x00, 0x00, 0x08, 0x0c, 0x96, 0x6d, 0x2c, 0x08, 0x08, 0x0c, + 0xe7, 0x5d, 0x00, 0x7e, 0x08, 0x0c, 0xad, 0x18, 0x20, 0x01, 0x00, 0x07, + 0x08, 0x0c, 0x67, 0x26, 0x20, 0x01, 0x00, 0x07, 0x08, 0x0c, 0x66, 0xfa, + 0x00, 0x1e, 0x00, 0x4e, 0x90, 0x06, 0x01, 0x5e, 0x00, 0x3e, 0x00, 0x2e, + 0x00, 0xbe, 0x00, 0xce, 0x00, 0x05, 0x00, 0xd6, 0x20, 0x69, 0x02, 0x6e, + 0x68, 0x00, 0x90, 0x86, 0x08, 0x00, 0x01, 0x18, 0x60, 0x17, 0x00, 0x00, + 0x00, 0x08, 0x90, 0x06, 0x00, 0xde, 0x00, 0x05, 0x00, 0xb6, 0x00, 0xf6, + 0x00, 0x16, 0x00, 0x26, 0x00, 0x36, 0x01, 0x56, 0x20, 0x79, 0x02, 0x6c, + 0x79, 0x30, 0x78, 0x34, 0x08, 0x0c, 0x26, 0x8c, 0x11, 0xd0, 0x08, 0x0c, + 0x67, 0xb4, 0x11, 0xb8, 0x20, 0x11, 0x02, 0x70, 0x20, 0xa9, 0x00, 0x04, + 0x00, 0x96, 0x2b, 0x48, 0x20, 0x19, 0x00, 0x0a, 0x08, 0x0c, 0xc2, 0x22, + 0x00, 0x9e, 0x11, 0x58, 0x20, 0x11, 0x02, 0x74, 0x20, 0xa9, 0x00, 0x04, + 0x00, 0x96, 0x2b, 0x48, 0x20, 0x19, 0x00, 0x06, 0x08, 0x0c, 0xc2, 0x22, + 0x00, 0x9e, 0x01, 0x5e, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0xfe, + 0x00, 0xbe, 0x00, 0x05, 0x00, 0xb6, 0x00, 0x06, 0x00, 0x16, 0x00, 0x26, + 0x00, 0x36, 0x01, 0x56, 0x20, 0x11, 0x02, 0x63, 0x22, 0x04, 0x82, 0x11, + 0x22, 0x0c, 0x08, 0x0c, 0x26, 0x8c, 0x11, 0xd0, 0x08, 0x0c, 0x67, 0xb4, + 0x11, 0xb8, 0x20, 0x11, 0x02, 0x76, 0x20, 0xa9, 0x00, 0x04, 0x00, 0x96, + 0x2b, 0x48, 0x20, 0x19, 0x00, 0x0a, 0x08, 0x0c, 0xc2, 0x22, 0x00, 0x9e, + 0x11, 0x58, 0x20, 0x11, 0x02, 0x7a, 0x20, 0xa9, 0x00, 0x04, 0x00, 0x96, + 0x2b, 0x48, 0x20, 0x19, 0x00, 0x06, 0x08, 0x0c, 0xc2, 0x22, 0x00, 0x9e, + 0x01, 0x5e, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0xbe, + 0x00, 0x05, 0x00, 0xe6, 0x00, 0xc6, 0x00, 0x86, 0x00, 0x76, 0x00, 0x66, + 0x00, 0x56, 0x00, 0x46, 0x00, 0x26, 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, + 0x08, 0x0c, 0xad, 0x5a, 0x01, 0x06, 0x19, 0x0c, 0xac, 0xfc, 0x27, 0x40, + 0x20, 0x29, 0x19, 0xf4, 0x25, 0x2c, 0x20, 0x21, 0x19, 0xfb, 0x24, 0x24, + 0x20, 0x61, 0x1d, 0xdc, 0x20, 0x71, 0x18, 0x00, 0x76, 0x54, 0x70, 0x74, + 0x81, 0xff, 0x01, 0x50, 0x00, 0x06, 0x91, 0x86, 0x1b, 0x39, 0x00, 0x0e, + 0x01, 0x28, 0x80, 0x01, 0x96, 0x02, 0x1a, 0x04, 0xe8, 0x03, 0x00, 0x18, + 0x96, 0x06, 0x09, 0x04, 0xe8, 0x03, 0x08, 0x0c, 0x8e, 0xee, 0x09, 0x04, + 0xe7, 0xfa, 0x21, 0x00, 0x9c, 0x06, 0x09, 0x04, 0xe7, 0xfa, 0x67, 0x20, + 0x97, 0x86, 0x00, 0x07, 0x09, 0x04, 0xe7, 0xfa, 0x08, 0x0c, 0xea, 0xce, + 0x19, 0x04, 0xe7, 0xfa, 0x08, 0x0c, 0xee, 0x65, 0x09, 0x04, 0xe7, 0xfa, + 0x08, 0x0c, 0xea, 0xbe, 0x09, 0x04, 0xe7, 0xfa, 0x67, 0x20, 0x97, 0x86, + 0x00, 0x01, 0x11, 0x48, 0x08, 0x0c, 0x34, 0x7d, 0x09, 0x04, 0xe8, 0x45, + 0x60, 0x04, 0x90, 0x86, 0x00, 0x00, 0x19, 0x04, 0xe8, 0x45, 0x97, 0x86, + 0x00, 0x04, 0x09, 0x04, 0xe8, 0x45, 0x25, 0x00, 0x9c, 0x06, 0x09, 0x04, + 0xe7, 0xfa, 0x24, 0x00, 0x9c, 0x06, 0x09, 0x04, 0xe7, 0xfa, 0x88, 0xff, + 0x01, 0x18, 0x60, 0x5c, 0x99, 0x06, 0x15, 0xd0, 0x00, 0x96, 0x60, 0x43, + 0xff, 0xff, 0x60, 0x00, 0x90, 0x86, 0x00, 0x04, 0x11, 0x20, 0x00, 0x16, + 0x08, 0x0c, 0x1a, 0xd3, 0x00, 0x1e, 0x97, 0x86, 0x00, 0x0a, 0x01, 0x48, + 0x08, 0x0c, 0xd1, 0x32, 0x11, 0x30, 0x08, 0x0c, 0xbb, 0x5c, 0x00, 0x9e, + 0x08, 0x0c, 0xb1, 0xa7, 0x04, 0x18, 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, + 0xcf, 0x1b, 0x01, 0xd8, 0x97, 0x86, 0x00, 0x03, 0x15, 0x88, 0xa8, 0x67, + 0x01, 0x03, 0xa8, 0x7c, 0xd0, 0xcc, 0x01, 0x30, 0x00, 0x96, 0xa8, 0x78, + 0x20, 0x48, 0x08, 0x0c, 0x10, 0x0b, 0x00, 0x9e, 0xab, 0x7a, 0xa8, 0x77, + 0x00, 0x00, 0x08, 0x0c, 0xed, 0xdf, 0x00, 0x16, 0x08, 0x0c, 0xd2, 0x20, + 0x08, 0x0c, 0x70, 0x06, 0x00, 0x1e, 0x08, 0x0c, 0xd1, 0x0c, 0x00, 0x9e, + 0x08, 0x0c, 0xb1, 0xa7, 0x9c, 0xe0, 0x00, 0x1c, 0x20, 0x01, 0x18, 0x1a, + 0x20, 0x04, 0x9c, 0x02, 0x12, 0x10, 0x08, 0x04, 0xe7, 0x76, 0x01, 0x0e, + 0x19, 0x0c, 0xad, 0x18, 0x01, 0x2e, 0x00, 0x2e, 0x00, 0x4e, 0x00, 0x5e, + 0x00, 0x6e, 0x00, 0x7e, 0x00, 0x8e, 0x00, 0xce, 0x00, 0xee, 0x00, 0x05, + 0x97, 0x86, 0x00, 0x06, 0x11, 0x50, 0x93, 0x86, 0x00, 0x05, 0x01, 0x28, + 0x08, 0x0c, 0xed, 0xdf, 0x08, 0x0c, 0xea, 0x30, 0x08, 0xe0, 0x00, 0x9e, + 0x08, 0xe8, 0x97, 0x86, 0x00, 0x09, 0x11, 0xf8, 0x60, 0x00, 0x90, 0x86, + 0x00, 0x04, 0x01, 0xc0, 0x60, 0x00, 0x90, 0x86, 0x00, 0x03, 0x11, 0xa0, + 0x08, 0x0c, 0x9a, 0x48, 0x00, 0x96, 0x61, 0x14, 0x21, 0x48, 0x08, 0x0c, + 0xcf, 0x1b, 0x01, 0x18, 0x60, 0x10, 0x08, 0x0c, 0x70, 0x12, 0x00, 0x9e, + 0x00, 0xc6, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0xce, 0x00, 0x36, 0x08, 0x0c, + 0x9a, 0xb3, 0x00, 0x3e, 0x00, 0x9e, 0x08, 0x04, 0xe7, 0xfa, 0x97, 0x86, + 0x00, 0x0a, 0x09, 0x04, 0xe7, 0xea, 0x08, 0x04, 0xe7, 0xdf, 0x81, 0xff, + 0x09, 0x04, 0xe7, 0xfa, 0x91, 0x80, 0x00, 0x01, 0x20, 0x04, 0x90, 0x86, + 0x00, 0x18, 0x01, 0x38, 0x91, 0x80, 0x00, 0x01, 0x20, 0x04, 0x90, 0x86, + 0x00, 0x2d, 0x19, 0x04, 0xe7, 0xfa, 0x60, 0x00, 0x90, 0x86, 0x00, 0x02, + 0x19, 0x04, 0xe7, 0xfa, 0x08, 0x0c, 0xd1, 0x21, 0x01, 0x38, 0x08, 0x0c, + 0xd1, 0x32, 0x19, 0x04, 0xe7, 0xfa, 0x08, 0x0c, 0xbb, 0x5c, 0x00, 0x38, + 0x08, 0x0c, 0x33, 0x44, 0x08, 0x0c, 0xd1, 0x32, 0x11, 0x10, 0x08, 0x0c, + 0xbb, 0x5c, 0x08, 0x0c, 0xb1, 0xa7, 0x08, 0x04, 0xe7, 0xfa, 0xa8, 0x64, + 0x90, 0x84, 0x00, 0xff, 0x90, 0x86, 0x00, 0x39, 0x00, 0x05, 0x00, 0xc6, + 0x00, 0xe6, 0x00, 0x16, 0x2c, 0x08, 0x21, 0x70, 0x90, 0x06, 0x08, 0x0c, + 0xea, 0x57, 0x00, 0x1e, 0x01, 0x20, 0x60, 0x20, 0x90, 0x84, 0x00, 0x0f, + 0x00, 0x1b, 0x00, 0xee, 0x00, 0xce, 0x00, 0x05, 0xe8, 0x94, 0xe8, 0x94, + 0xe8, 0x94, 0xe8, 0x94, 0xe8, 0x94, 0xe8, 0x94, 0xe8, 0x96, 0xe8, 0x94, + 0xe8, 0x94, 0xe8, 0x94, 0xe8, 0xbf, 0xb1, 0xa7, 0xb1, 0xa7, 0xe8, 0x94, + 0x90, 0x06, 0x00, 0x05, 0x00, 0x36, 0x00, 0x46, 0x00, 0x16, 0x70, 0x10, + 0x00, 0xb6, 0x20, 0x58, 0xbc, 0xa0, 0x00, 0xbe, 0x2c, 0x00, 0x20, 0x09, + 0x00, 0x20, 0x08, 0x0c, 0xea, 0x8d, 0x00, 0x1e, 0x00, 0x4e, 0x20, 0x19, + 0x00, 0x02, 0x08, 0x0c, 0xe5, 0x86, 0x00, 0x3e, 0x90, 0x85, 0x00, 0x01, + 0x00, 0x05, 0x00, 0x96, 0x08, 0x0c, 0xcf, 0x1b, 0x01, 0x40, 0x60, 0x14, + 0x90, 0x4d, 0x08, 0x0c, 0xca, 0xe9, 0x68, 0x7b, 0x00, 0x05, 0x08, 0x0c, + 0x70, 0x12, 0x00, 0x9e, 0x08, 0x0c, 0xb1, 0xa7, 0x90, 0x85, 0x00, 0x01, + 0x00, 0x05, 0x00, 0x19, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x60, 0x00, + 0x90, 0x8a, 0x00, 0x10, 0x1a, 0x0c, 0x0d, 0x85, 0x00, 0x0b, 0x00, 0x05, + 0xe8, 0xda, 0xe8, 0xda, 0xe8, 0xf1, 0xe8, 0xe1, 0xe9, 0x00, 0xe8, 0xda, + 0xe8, 0xda, 0xe8, 0xdc, 0xe8, 0xda, 0xe8, 0xda, 0xe8, 0xda, 0xe8, 0xda, + 0xe8, 0xda, 0xe8, 0xda, 0xe8, 0xda, 0xe8, 0xda, 0x08, 0x0c, 0x0d, 0x85, + 0x08, 0x0c, 0xb1, 0xa7, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x00, 0x36, + 0x00, 0xe6, 0x20, 0x71, 0x19, 0xe8, 0x70, 0x4c, 0x9c, 0x06, 0x11, 0x28, + 0x20, 0x19, 0x00, 0x01, 0x08, 0x0c, 0xa5, 0x96, 0x00, 0x10, 0x08, 0x0c, + 0xa7, 0xa1, 0x00, 0xee, 0x00, 0x3e, 0x00, 0x96, 0x00, 0xd6, 0x60, 0x14, + 0x20, 0x48, 0xa8, 0x7b, 0x00, 0x05, 0x08, 0x0c, 0x70, 0x12, 0x08, 0x0c, + 0xb1, 0xa7, 0x00, 0xde, 0x00, 0x9e, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, + 0x60, 0x1c, 0xd0, 0x84, 0x19, 0x0c, 0x1a, 0xd3, 0x0c, 0x60, 0x20, 0x01, + 0x00, 0x01, 0x08, 0x0c, 0x66, 0xe6, 0x01, 0x56, 0x00, 0x16, 0x00, 0x26, + 0x00, 0x36, 0x20, 0xa9, 0x00, 0x04, 0x20, 0x19, 0x18, 0x05, 0x20, 0x11, + 0x02, 0x76, 0x08, 0x0c, 0xc2, 0x0e, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x1e, + 0x01, 0x5e, 0x90, 0x05, 0x00, 0x05, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xc6, + 0x00, 0x86, 0x00, 0x76, 0x00, 0x66, 0x00, 0xb6, 0x01, 0x26, 0x20, 0x91, + 0x80, 0x00, 0x27, 0x40, 0x20, 0x61, 0x1d, 0xdc, 0x20, 0x79, 0x00, 0x01, + 0x8f, 0xff, 0x09, 0x04, 0xe9, 0x77, 0x20, 0x71, 0x18, 0x00, 0x76, 0x54, + 0x70, 0x74, 0x80, 0x01, 0x96, 0x02, 0x1a, 0x04, 0xe9, 0x77, 0x88, 0xff, + 0x01, 0x20, 0x28, 0x00, 0x9c, 0x06, 0x15, 0xa0, 0x20, 0x78, 0x08, 0x0c, + 0xea, 0xbe, 0x05, 0x80, 0x24, 0x00, 0x9c, 0x06, 0x05, 0x68, 0x67, 0x20, + 0x97, 0x86, 0x00, 0x06, 0x15, 0x48, 0x97, 0x86, 0x00, 0x07, 0x05, 0x30, + 0x88, 0xff, 0x11, 0x50, 0xd5, 0x8c, 0x11, 0x18, 0x60, 0x10, 0x9b, 0x06, + 0x11, 0xf8, 0xd5, 0x84, 0x01, 0x18, 0x60, 0x5c, 0x91, 0x06, 0x11, 0xd0, + 0x00, 0x96, 0x60, 0x1c, 0xd0, 0x84, 0x01, 0x40, 0x08, 0x0c, 0xec, 0xe1, + 0x08, 0x0c, 0xd6, 0x5d, 0x08, 0x0c, 0x1a, 0xd3, 0x60, 0x23, 0x00, 0x07, + 0x60, 0x14, 0x20, 0x48, 0x08, 0x0c, 0xcf, 0x1b, 0x01, 0x20, 0x00, 0x46, + 0x08, 0x0c, 0xea, 0x30, 0x00, 0x4e, 0x00, 0x9e, 0x08, 0x0c, 0xb1, 0xa7, + 0x88, 0xff, 0x11, 0x98, 0x9c, 0xe0, 0x00, 0x1c, 0x20, 0x01, 0x18, 0x1a, + 0x20, 0x04, 0x9c, 0x02, 0x12, 0x10, 0x08, 0x04, 0xe9, 0x2a, 0x90, 0x06, + 0x01, 0x2e, 0x00, 0xbe, 0x00, 0x6e, 0x00, 0x7e, 0x00, 0x8e, 0x00, 0xce, + 0x00, 0xee, 0x00, 0xfe, 0x00, 0x05, 0x98, 0xc5, 0x00, 0x01, 0x0c, 0xa0, + 0x08, 0x0c, 0xac, 0xfc, 0x00, 0xb6, 0x00, 0x76, 0x00, 0x56, 0x00, 0x86, + 0x90, 0x46, 0x20, 0x29, 0x00, 0x01, 0x2c, 0x20, 0x20, 0x19, 0x00, 0x02, + 0x62, 0x10, 0x22, 0x58, 0x00, 0x96, 0x90, 0x4e, 0x08, 0x0c, 0xa6, 0x67, + 0x00, 0x9e, 0x00, 0x8e, 0x90, 0x3e, 0x08, 0x0c, 0xa7, 0x12, 0x08, 0x0c, + 0xe9, 0x1b, 0x00, 0x5e, 0x00, 0x7e, 0x00, 0xbe, 0x08, 0x0c, 0xad, 0x18, + 0x00, 0x05, 0x08, 0x0c, 0xac, 0xfc, 0x00, 0xb6, 0x00, 0x46, 0x00, 0x56, + 0x00, 0x76, 0x00, 0xc6, 0x01, 0x56, 0x2c, 0x20, 0x21, 0x28, 0x20, 0xa9, + 0x00, 0x7f, 0x90, 0x0e, 0x00, 0x16, 0x00, 0x36, 0x08, 0x0c, 0x67, 0xb4, + 0x11, 0x80, 0x00, 0x56, 0x00, 0x86, 0x90, 0x46, 0x25, 0x08, 0x20, 0x29, + 0x00, 0x01, 0x00, 0x96, 0x90, 0x4e, 0x08, 0x0c, 0xa6, 0x67, 0x00, 0x9e, + 0x00, 0x8e, 0x90, 0x3e, 0x08, 0x0c, 0xa7, 0x12, 0x00, 0x5e, 0x00, 0x3e, + 0x00, 0x1e, 0x81, 0x08, 0x1f, 0x04, 0xe9, 0xb0, 0x00, 0x36, 0x25, 0x08, + 0x20, 0x29, 0x00, 0x03, 0x08, 0x0c, 0xe9, 0x1b, 0x00, 0x3e, 0x01, 0x5e, + 0x00, 0xce, 0x00, 0x7e, 0x00, 0x5e, 0x00, 0x4e, 0x00, 0xbe, 0x08, 0x0c, + 0xad, 0x18, 0x00, 0x05, 0x08, 0x0c, 0xac, 0xfc, 0x00, 0xb6, 0x00, 0x76, + 0x00, 0x56, 0x62, 0x10, 0x22, 0x58, 0x00, 0x86, 0x90, 0x46, 0x20, 0x29, + 0x00, 0x01, 0x20, 0x19, 0x00, 0x48, 0x00, 0x96, 0x90, 0x4e, 0x08, 0x0c, + 0xa6, 0x67, 0x00, 0x9e, 0x00, 0x8e, 0x90, 0x3e, 0x08, 0x0c, 0xa7, 0x12, + 0x2c, 0x20, 0x08, 0x0c, 0xe9, 0x1b, 0x00, 0x5e, 0x00, 0x7e, 0x00, 0xbe, + 0x08, 0x0c, 0xad, 0x18, 0x00, 0x05, 0x08, 0x0c, 0xac, 0xfc, 0x00, 0xb6, + 0x00, 0x46, 0x00, 0x56, 0x00, 0x76, 0x00, 0xc6, 0x01, 0x56, 0x2c, 0x20, + 0x20, 0xa9, 0x08, 0x00, 0x90, 0x0e, 0x00, 0x16, 0x00, 0x36, 0x08, 0x0c, + 0x67, 0xb4, 0x11, 0x90, 0x00, 0x86, 0x90, 0x46, 0x28, 0x28, 0x00, 0x46, + 0x20, 0x21, 0x00, 0x01, 0x08, 0x0c, 0xec, 0xc5, 0x00, 0x4e, 0x00, 0x96, + 0x90, 0x4e, 0x08, 0x0c, 0xa6, 0x67, 0x00, 0x9e, 0x00, 0x8e, 0x90, 0x3e, + 0x08, 0x0c, 0xa7, 0x12, 0x00, 0x3e, 0x00, 0x1e, 0x81, 0x08, 0x1f, 0x04, + 0xea, 0x05, 0x00, 0x36, 0x20, 0x29, 0x00, 0x02, 0x08, 0x0c, 0xe9, 0x1b, + 0x00, 0x3e, 0x01, 0x5e, 0x00, 0xce, 0x00, 0x7e, 0x00, 0x5e, 0x00, 0x4e, + 0x00, 0xbe, 0x08, 0x0c, 0xad, 0x18, 0x00, 0x05, 0x00, 0x16, 0x00, 0xf6, + 0x08, 0x0c, 0xcf, 0x19, 0x01, 0x98, 0xa8, 0x64, 0x90, 0x84, 0x00, 0xff, + 0x90, 0x86, 0x00, 0x46, 0x01, 0x80, 0xa8, 0x00, 0x90, 0x7d, 0x01, 0x38, + 0xa8, 0x03, 0x00, 0x00, 0xab, 0x82, 0x08, 0x0c, 0x70, 0x12, 0x2f, 0x48, + 0x0c, 0xb0, 0xab, 0x82, 0x08, 0x0c, 0x70, 0x12, 0x00, 0xfe, 0x00, 0x1e, + 0x00, 0x05, 0xa8, 0x00, 0x90, 0x7d, 0x01, 0x30, 0xa8, 0x03, 0x00, 0x00, + 0x08, 0x0c, 0x70, 0x12, 0x2f, 0x48, 0x0c, 0xb8, 0x08, 0x0c, 0x70, 0x12, + 0x0c, 0x88, 0x00, 0xe6, 0x00, 0x46, 0x00, 0x36, 0x20, 0x61, 0x1d, 0xdc, + 0x90, 0x05, 0x11, 0x38, 0x20, 0x71, 0x18, 0x00, 0x74, 0x54, 0x70, 0x74, + 0x80, 0x01, 0x94, 0x02, 0x12, 0xf8, 0x21, 0x00, 0x9c, 0x06, 0x01, 0x88, + 0x60, 0x00, 0x90, 0x86, 0x00, 0x00, 0x01, 0x68, 0x60, 0x08, 0x92, 0x06, + 0x11, 0x50, 0x63, 0x20, 0x93, 0x86, 0x00, 0x09, 0x01, 0xb0, 0x60, 0x10, + 0x91, 0xa0, 0x00, 0x04, 0x24, 0x24, 0x94, 0x06, 0x01, 0x40, 0x9c, 0xe0, + 0x00, 0x1c, 0x20, 0x01, 0x18, 0x1a, 0x20, 0x04, 0x9c, 0x02, 0x12, 0x20, + 0x0c, 0x20, 0x90, 0x85, 0x00, 0x01, 0x00, 0x08, 0x90, 0x06, 0x00, 0x3e, + 0x00, 0x4e, 0x00, 0xee, 0x00, 0x05, 0x63, 0x1c, 0xd3, 0xc4, 0x1d, 0x68, + 0x0c, 0x30, 0x00, 0x96, 0x00, 0x06, 0x08, 0x0c, 0x10, 0x59, 0x00, 0x0e, + 0x09, 0x0c, 0x0d, 0x85, 0xaa, 0xe2, 0xa8, 0x67, 0x01, 0x0d, 0xa8, 0x8e, + 0x00, 0x26, 0x20, 0x10, 0x08, 0x0c, 0xcf, 0x09, 0x20, 0x01, 0x00, 0x00, + 0x01, 0x20, 0x22, 0x00, 0x90, 0x80, 0x00, 0x17, 0x20, 0x04, 0x00, 0x2e, + 0xa8, 0x7a, 0x91, 0x86, 0x00, 0x20, 0x01, 0x10, 0xa8, 0xe3, 0xff, 0xff, + 0xa9, 0x86, 0xac, 0x76, 0xa8, 0x7f, 0x00, 0x00, 0x20, 0x01, 0x19, 0x8e, + 0x20, 0x04, 0xa8, 0x82, 0x90, 0x06, 0xa8, 0x02, 0xa8, 0x6a, 0xa8, 0x8a, + 0x01, 0x26, 0x20, 0x91, 0x80, 0x00, 0x08, 0x0c, 0x70, 0x12, 0x01, 0x2e, + 0x00, 0x9e, 0x00, 0x05, 0x67, 0x00, 0x97, 0x86, 0x00, 0x00, 0x01, 0x58, + 0x97, 0x86, 0x00, 0x01, 0x01, 0x40, 0x97, 0x86, 0x00, 0x0a, 0x01, 0x28, + 0x97, 0x86, 0x00, 0x09, 0x01, 0x10, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, + 0x00, 0xe6, 0x60, 0x10, 0x90, 0x75, 0x01, 0x38, 0x00, 0xb6, 0x20, 0x58, + 0xb8, 0xa0, 0x00, 0xbe, 0x92, 0x06, 0x00, 0xee, 0x00, 0x05, 0x90, 0x85, + 0x00, 0x01, 0x0c, 0xd8, 0x00, 0x16, 0x60, 0x04, 0x90, 0x8e, 0x00, 0x1e, + 0x11, 0xa0, 0x80, 0x07, 0x61, 0x34, 0x91, 0x8c, 0x00, 0xff, 0x91, 0x05, + 0x60, 0x36, 0x60, 0x07, 0x00, 0x85, 0x60, 0x03, 0x00, 0x0b, 0x60, 0x23, + 0x00, 0x05, 0x20, 0x01, 0x19, 0x87, 0x20, 0x04, 0x60, 0x1a, 0x20, 0x09, + 0x80, 0x20, 0x08, 0x0c, 0x96, 0x17, 0x00, 0x1e, 0x00, 0x05, 0xa0, 0x01, + 0xa0, 0x01, 0x00, 0x05, 0x60, 0x24, 0xd0, 0xe4, 0x01, 0x58, 0xd0, 0xcc, + 0x01, 0x18, 0x08, 0x0c, 0xd2, 0x67, 0x00, 0x30, 0x08, 0x0c, 0xec, 0xe1, + 0x08, 0x0c, 0x8c, 0x19, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0x05, 0x92, 0x80, + 0x00, 0x08, 0x20, 0x04, 0x90, 0x84, 0x00, 0x0f, 0x00, 0x02, 0xeb, 0x1d, + 0xeb, 0x1d, 0xeb, 0x1d, 0xeb, 0x1f, 0xeb, 0x1d, 0xeb, 0x1f, 0xeb, 0x1f, + 0xeb, 0x1d, 0xeb, 0x1f, 0xeb, 0x1d, 0xeb, 0x1d, 0xeb, 0x1d, 0xeb, 0x1d, + 0xeb, 0x1d, 0x90, 0x06, 0x00, 0x05, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, + 0x92, 0x80, 0x00, 0x08, 0x20, 0x04, 0x90, 0x84, 0x00, 0x0f, 0x00, 0x02, + 0xeb, 0x36, 0xeb, 0x36, 0xeb, 0x36, 0xeb, 0x36, 0xeb, 0x36, 0xeb, 0x36, + 0xeb, 0x43, 0xeb, 0x36, 0xeb, 0x36, 0xeb, 0x36, 0xeb, 0x36, 0xeb, 0x36, + 0xeb, 0x36, 0xeb, 0x36, 0x60, 0x07, 0x00, 0x3b, 0x60, 0x2f, 0x00, 0x09, + 0x60, 0x17, 0x2a, 0x00, 0x60, 0x03, 0x00, 0x01, 0x20, 0x09, 0x80, 0x20, + 0x08, 0x0c, 0x96, 0x17, 0x00, 0x05, 0x00, 0x96, 0x00, 0xc6, 0x22, 0x60, + 0x08, 0x0c, 0xec, 0xe1, 0x60, 0x4b, 0x00, 0x00, 0x60, 0x24, 0xc0, 0xf4, + 0xc0, 0xe4, 0x60, 0x26, 0x60, 0x3b, 0x00, 0x00, 0x00, 0xce, 0x00, 0xd6, + 0x22, 0x68, 0x91, 0x86, 0x00, 0x07, 0x19, 0x04, 0xeb, 0x9c, 0x68, 0x14, + 0x90, 0x05, 0x01, 0x38, 0x20, 0x48, 0xa8, 0x7c, 0xd0, 0xfc, 0x11, 0x18, + 0x00, 0xde, 0x00, 0x9e, 0x08, 0xa8, 0x60, 0x07, 0x00, 0x3a, 0x60, 0x03, + 0x00, 0x01, 0x20, 0x09, 0x80, 0x20, 0x08, 0x0c, 0x96, 0x17, 0x00, 0xc6, + 0x2d, 0x60, 0x61, 0x00, 0x91, 0x86, 0x00, 0x02, 0x19, 0x04, 0xec, 0x0c, + 0x60, 0x14, 0x90, 0x05, 0x11, 0x38, 0x60, 0x00, 0x90, 0x86, 0x00, 0x07, + 0x19, 0x0c, 0x0d, 0x85, 0x08, 0x04, 0xec, 0x0c, 0x20, 0x48, 0x08, 0x0c, + 0xcf, 0x1b, 0x11, 0x30, 0x00, 0x28, 0x20, 0x48, 0xa8, 0x00, 0x90, 0x05, + 0x1d, 0xe0, 0x29, 0x00, 0x20, 0x48, 0xa8, 0x7c, 0x90, 0x84, 0x00, 0x03, + 0x90, 0x86, 0x00, 0x02, 0x11, 0x68, 0xa8, 0x7c, 0xc0, 0xdc, 0xc0, 0xf4, + 0xa8, 0x7e, 0xa8, 0x80, 0xc0, 0xfc, 0xa8, 0x82, 0x20, 0x09, 0x00, 0x43, + 0x08, 0x0c, 0xe3, 0xb5, 0x08, 0x04, 0xec, 0x0c, 0x20, 0x09, 0x00, 0x41, + 0x08, 0x04, 0xec, 0x06, 0x91, 0x86, 0x00, 0x05, 0x15, 0xa0, 0x68, 0x14, + 0x20, 0x48, 0xa8, 0x7c, 0xd0, 0xbc, 0x11, 0x20, 0x00, 0xde, 0x00, 0x9e, + 0x08, 0x04, 0xeb, 0x36, 0xd0, 0xb4, 0x01, 0x28, 0xd0, 0xfc, 0x09, 0x0c, + 0x0d, 0x85, 0x08, 0x04, 0xeb, 0x57, 0x60, 0x07, 0x00, 0x3a, 0x60, 0x03, + 0x00, 0x01, 0x20, 0x09, 0x80, 0x20, 0x08, 0x0c, 0x96, 0x17, 0x00, 0xc6, + 0x2d, 0x60, 0x61, 0x00, 0x91, 0x86, 0x00, 0x02, 0x01, 0x20, 0x91, 0x86, + 0x00, 0x04, 0x19, 0x04, 0xec, 0x0c, 0x68, 0x14, 0x20, 0x48, 0xa9, 0x7c, + 0xc1, 0xf4, 0xc1, 0xdc, 0xa9, 0x7e, 0xa9, 0x80, 0xc1, 0xfc, 0xc1, 0xbc, + 0xa9, 0x82, 0x00, 0xf6, 0x2c, 0x78, 0x08, 0x0c, 0x17, 0xad, 0x00, 0xfe, + 0x20, 0x09, 0x00, 0x42, 0x04, 0x98, 0x00, 0x36, 0x08, 0x0c, 0x10, 0x59, + 0x09, 0x0c, 0x0d, 0x85, 0xa8, 0x67, 0x01, 0x0d, 0x90, 0x06, 0xa8, 0x02, + 0xa8, 0x6a, 0xa8, 0x8a, 0x2d, 0x18, 0xab, 0x8e, 0xa8, 0x87, 0x00, 0x45, + 0x2c, 0x00, 0xa8, 0x92, 0x60, 0x38, 0xa8, 0xa2, 0x23, 0x60, 0x60, 0x24, + 0xc0, 0xdd, 0x60, 0x26, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0xa0, + 0x00, 0xbe, 0x20, 0x04, 0x63, 0x5c, 0xab, 0x7a, 0xa8, 0x76, 0x90, 0x06, + 0xa8, 0x7e, 0xa8, 0x82, 0xad, 0x9a, 0xae, 0x96, 0xa8, 0x9f, 0x00, 0x01, + 0x08, 0x0c, 0x70, 0x12, 0x20, 0x19, 0x00, 0x45, 0x60, 0x08, 0x20, 0x68, + 0x08, 0x0c, 0xe5, 0x78, 0x2d, 0x00, 0x60, 0x0a, 0x00, 0x3e, 0x00, 0x38, + 0x60, 0x4b, 0x00, 0x00, 0x60, 0x03, 0x00, 0x07, 0x08, 0x0c, 0xe3, 0xb5, + 0x00, 0xce, 0x00, 0xde, 0x00, 0x9e, 0x00, 0x05, 0x91, 0x86, 0x00, 0x13, + 0x11, 0x28, 0x60, 0x04, 0x90, 0x82, 0x00, 0x85, 0x20, 0x08, 0x00, 0xc2, + 0x91, 0x86, 0x00, 0x27, 0x11, 0x78, 0x08, 0x0c, 0x99, 0xed, 0x00, 0x36, + 0x00, 0x96, 0x60, 0x14, 0x20, 0x48, 0x20, 0x19, 0x00, 0x04, 0x08, 0x0c, + 0xea, 0x30, 0x00, 0x9e, 0x00, 0x3e, 0x08, 0x0c, 0x9a, 0xb3, 0x00, 0x05, + 0x91, 0x86, 0x00, 0x14, 0x0d, 0x70, 0x08, 0x0c, 0xb2, 0x27, 0x00, 0x05, + 0xec, 0x3f, 0xec, 0x3d, 0xec, 0x3d, 0xec, 0x3d, 0xec, 0x3d, 0xec, 0x3d, + 0xec, 0x3f, 0xec, 0x3d, 0xec, 0x3d, 0xec, 0x3d, 0xec, 0x3d, 0xec, 0x3d, + 0xec, 0x3d, 0x08, 0x0c, 0x0d, 0x85, 0x60, 0x03, 0x00, 0x0c, 0x08, 0x0c, + 0x9a, 0xb3, 0x00, 0x05, 0x91, 0x82, 0x00, 0x92, 0x12, 0x20, 0x91, 0x82, + 0x00, 0x85, 0x02, 0x08, 0x00, 0x1a, 0x08, 0x0c, 0xb2, 0x27, 0x00, 0x05, + 0xec, 0x5b, 0xec, 0x5b, 0xec, 0x5b, 0xec, 0x5b, 0xec, 0x5d, 0xec, 0x7d, + 0xec, 0x5b, 0xec, 0x5b, 0xec, 0x5b, 0xec, 0x5b, 0xec, 0x5b, 0xec, 0x5b, + 0xec, 0x5b, 0x08, 0x0c, 0x0d, 0x85, 0x00, 0xd6, 0x2c, 0x68, 0x08, 0x0c, + 0xb1, 0x16, 0x01, 0xb0, 0x60, 0x03, 0x00, 0x01, 0x60, 0x07, 0x00, 0x1e, + 0x20, 0x09, 0x02, 0x6e, 0x21, 0x0c, 0x61, 0x3a, 0x20, 0x09, 0x02, 0x6f, + 0x21, 0x0c, 0x61, 0x3e, 0x60, 0x0b, 0xff, 0xff, 0x69, 0x10, 0x61, 0x12, + 0x60, 0x23, 0x00, 0x04, 0x20, 0x09, 0x80, 0x20, 0x08, 0x0c, 0x96, 0x17, + 0x2d, 0x60, 0x08, 0x0c, 0xb1, 0x6c, 0x00, 0xde, 0x00, 0x05, 0x08, 0x0c, + 0xb1, 0x6c, 0x00, 0x05, 0x00, 0xe6, 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, + 0xb8, 0x00, 0x00, 0xbe, 0xd0, 0xec, 0x00, 0xee, 0x00, 0x05, 0x20, 0x09, + 0x18, 0x67, 0x21, 0x0c, 0xd1, 0xec, 0x05, 0xb0, 0x60, 0x03, 0x00, 0x02, + 0x60, 0x24, 0xc0, 0xe5, 0x60, 0x26, 0xd0, 0xcc, 0x01, 0x50, 0x20, 0x01, + 0x19, 0x88, 0x20, 0x04, 0x60, 0x4a, 0x20, 0x09, 0x18, 0x67, 0x21, 0x0c, + 0xd1, 0xf4, 0x15, 0x20, 0x00, 0xa0, 0x20, 0x09, 0x18, 0x67, 0x21, 0x0c, + 0xd1, 0xf4, 0x01, 0x28, 0x60, 0x24, 0xc0, 0xe4, 0x60, 0x26, 0x90, 0x06, + 0x00, 0xd8, 0x20, 0x01, 0x19, 0x88, 0x20, 0x0c, 0x20, 0x01, 0x19, 0x86, + 0x20, 0x04, 0x91, 0x00, 0x90, 0x80, 0x00, 0x0a, 0x60, 0x4a, 0x60, 0x10, + 0x00, 0xb6, 0x20, 0x58, 0xb8, 0xbc, 0x00, 0xbe, 0x00, 0x08, 0x21, 0x04, + 0x90, 0x05, 0x01, 0x18, 0x90, 0x88, 0x00, 0x03, 0x0c, 0xd0, 0x2c, 0x0a, + 0x60, 0x0f, 0x00, 0x00, 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x00, 0x16, + 0x00, 0xc6, 0x00, 0xe6, 0x61, 0x5c, 0xb8, 0xbc, 0x20, 0x60, 0x8c, 0xff, + 0x01, 0x80, 0x84, 0xff, 0x11, 0x18, 0x60, 0x5c, 0x91, 0x06, 0x11, 0x38, + 0x60, 0x0c, 0x20, 0x72, 0x08, 0x0c, 0x8c, 0x19, 0x08, 0x0c, 0xb1, 0x6c, + 0x00, 0x10, 0x9c, 0xf0, 0x00, 0x03, 0x2e, 0x64, 0x0c, 0x70, 0x00, 0xee, + 0x00, 0xce, 0x00, 0x1e, 0x00, 0x05, 0x00, 0xd6, 0x00, 0xb6, 0x60, 0x10, + 0x20, 0x58, 0xb8, 0xbc, 0x90, 0x6d, 0x01, 0x30, 0x9c, 0x06, 0x01, 0x10, + 0x68, 0x0c, 0x0c, 0xd0, 0x60, 0x0c, 0x68, 0x0e, 0x00, 0xbe, 0x00, 0xde, + 0x00, 0x05, 0x00, 0x26, 0x00, 0x36, 0x01, 0x56, 0x20, 0x11, 0x18, 0x2c, + 0x22, 0x04, 0x90, 0x84, 0x00, 0xff, 0x20, 0x19, 0x02, 0x6e, 0x23, 0x34, + 0x96, 0xb4, 0x00, 0xff, 0x96, 0x36, 0x15, 0x08, 0x83, 0x18, 0x23, 0x34, + 0x22, 0x04, 0x90, 0x84, 0xff, 0x00, 0x96, 0x36, 0x11, 0xd0, 0x20, 0x11, + 0x02, 0x70, 0x20, 0xa9, 0x00, 0x04, 0x60, 0x10, 0x00, 0x96, 0x20, 0x48, + 0x20, 0x19, 0x00, 0x0a, 0x08, 0x0c, 0xc2, 0x22, 0x00, 0x9e, 0x11, 0x68, + 0x20, 0x11, 0x02, 0x74, 0x20, 0xa9, 0x00, 0x04, 0x60, 0x10, 0x00, 0x96, + 0x20, 0x48, 0x20, 0x19, 0x00, 0x06, 0x08, 0x0c, 0xc2, 0x22, 0x00, 0x9e, + 0x11, 0x00, 0x01, 0x5e, 0x00, 0x3e, 0x00, 0x2e, 0x00, 0x05, 0x00, 0xe6, + 0x20, 0x71, 0x18, 0x00, 0x08, 0x0c, 0x61, 0x30, 0x08, 0x0c, 0x30, 0xbf, + 0x00, 0xee, 0x00, 0x05, 0x00, 0x96, 0x00, 0x26, 0x08, 0x0c, 0x10, 0x59, + 0x09, 0x0c, 0x0d, 0x85, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x1a, 0x20, 0xa0, + 0x20, 0xa9, 0x00, 0x0c, 0xa8, 0x60, 0x20, 0xe8, 0x90, 0x06, 0x40, 0x04, + 0x91, 0x86, 0x00, 0x46, 0x11, 0x18, 0xa8, 0x67, 0x01, 0x36, 0x00, 0x38, + 0xa8, 0x67, 0x01, 0x38, 0x91, 0x86, 0x00, 0x41, 0x01, 0x10, 0xa8, 0x7b, + 0x00, 0x01, 0x70, 0x38, 0x90, 0x84, 0xff, 0x00, 0x72, 0x40, 0x92, 0x94, + 0xff, 0x00, 0x80, 0x07, 0x92, 0x15, 0xaa, 0x9a, 0x91, 0x86, 0x00, 0x46, + 0x11, 0x68, 0x70, 0x38, 0x90, 0x84, 0x00, 0xff, 0x72, 0x3c, 0x92, 0x94, + 0xff, 0x00, 0x92, 0x15, 0xaa, 0x9e, 0x72, 0x3c, 0x92, 0x94, 0x00, 0xff, + 0xaa, 0xa2, 0x00, 0x60, 0x70, 0x40, 0x90, 0x84, 0x00, 0xff, 0x72, 0x44, + 0x92, 0x94, 0xff, 0x00, 0x92, 0x15, 0xaa, 0x9e, 0x72, 0x44, 0x92, 0x94, + 0x00, 0xff, 0xaa, 0xa2, 0x91, 0x86, 0x00, 0x46, 0x11, 0x18, 0x9e, 0x90, + 0x00, 0x12, 0x00, 0x10, 0x9e, 0x90, 0x00, 0x1a, 0x22, 0x04, 0x80, 0x07, + 0xa8, 0xa6, 0x82, 0x10, 0x22, 0x04, 0x80, 0x07, 0xa8, 0xaa, 0x82, 0x10, + 0x22, 0x04, 0x80, 0x07, 0xa8, 0xae, 0x82, 0x10, 0x22, 0x04, 0x80, 0x07, + 0xa8, 0xb2, 0x82, 0x10, 0x91, 0x86, 0x00, 0x46, 0x11, 0xb8, 0x9e, 0x90, + 0x00, 0x16, 0x22, 0x04, 0x80, 0x07, 0xa8, 0xb6, 0x82, 0x10, 0x22, 0x04, + 0x80, 0x07, 0xa8, 0xba, 0x82, 0x10, 0x22, 0x04, 0x80, 0x07, 0xa8, 0xbe, + 0x82, 0x10, 0x22, 0x04, 0x80, 0x07, 0xa8, 0xc2, 0x82, 0x10, 0x20, 0x11, + 0x02, 0x05, 0x20, 0x13, 0x00, 0x01, 0x00, 0xb0, 0x9e, 0x90, 0x00, 0x1e, + 0x22, 0x04, 0x80, 0x07, 0xa8, 0xb6, 0x82, 0x10, 0x22, 0x04, 0x80, 0x07, + 0xa8, 0xba, 0x20, 0x11, 0x02, 0x05, 0x20, 0x13, 0x00, 0x01, 0x20, 0x11, + 0x02, 0x60, 0x22, 0x04, 0x80, 0x07, 0xa8, 0xbe, 0x82, 0x10, 0x22, 0x04, + 0x80, 0x07, 0xa8, 0xc2, 0x91, 0x86, 0x00, 0x46, 0x11, 0x18, 0x20, 0x11, + 0x02, 0x62, 0x00, 0x10, 0x20, 0x11, 0x02, 0x6a, 0x01, 0x46, 0x01, 0xd6, + 0x00, 0x36, 0x20, 0xa9, 0x00, 0x01, 0x20, 0x19, 0x00, 0x08, 0xa8, 0x60, + 0x20, 0xe8, 0xa8, 0x5c, 0x90, 0x80, 0x00, 0x31, 0x20, 0xa0, 0x22, 0x04, + 0x80, 0x07, 0x40, 0x04, 0x82, 0x10, 0x83, 0x19, 0x1d, 0xd0, 0x00, 0x3e, + 0x01, 0xce, 0x01, 0x3e, 0x20, 0x11, 0x02, 0x05, 0x20, 0x13, 0x00, 0x00, + 0x00, 0x2e, 0x08, 0x0c, 0x70, 0x12, 0x00, 0x9e, 0x00, 0x05, 0x00, 0xe6, + 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xb8, 0x00, 0x00, 0xbe, 0xd0, 0xfc, + 0x01, 0x08, 0x00, 0x11, 0x00, 0xee, 0x00, 0x05, 0xa8, 0x80, 0xc0, 0xe5, + 0xa8, 0x82, 0x00, 0x05, 0x00, 0xe6, 0x00, 0xd6, 0x00, 0xc6, 0x00, 0x76, + 0x00, 0x66, 0x00, 0x56, 0x00, 0x46, 0x00, 0x26, 0x00, 0x16, 0x01, 0x26, + 0x20, 0x91, 0x80, 0x00, 0x20, 0x29, 0x19, 0xf4, 0x25, 0x2c, 0x20, 0x21, + 0x19, 0xfb, 0x24, 0x24, 0x20, 0x61, 0x1d, 0xdc, 0x20, 0x71, 0x18, 0x00, + 0x76, 0x54, 0x70, 0x74, 0x96, 0x06, 0x05, 0x78, 0x67, 0x20, 0x97, 0x86, + 0x00, 0x01, 0x01, 0x18, 0x97, 0x86, 0x00, 0x08, 0x15, 0x00, 0x25, 0x00, + 0x9c, 0x06, 0x01, 0xe8, 0x24, 0x00, 0x9c, 0x06, 0x01, 0xd0, 0x08, 0x0c, + 0xea, 0xbe, 0x01, 0xb8, 0x08, 0x0c, 0xea, 0xce, 0x11, 0xa0, 0x60, 0x00, + 0x90, 0x86, 0x00, 0x04, 0x11, 0x20, 0x00, 0x16, 0x08, 0x0c, 0x1a, 0xd3, + 0x00, 0x1e, 0x08, 0x0c, 0xd1, 0x21, 0x11, 0x10, 0x08, 0x0c, 0x33, 0x44, + 0x08, 0x0c, 0xd1, 0x32, 0x11, 0x10, 0x08, 0x0c, 0xbb, 0x5c, 0x08, 0x0c, + 0xb1, 0xa7, 0x9c, 0xe0, 0x00, 0x1c, 0x20, 0x01, 0x18, 0x1a, 0x20, 0x04, + 0x9c, 0x02, 0x12, 0x08, 0x08, 0x58, 0x01, 0x2e, 0x00, 0x1e, 0x00, 0x2e, + 0x00, 0x4e, 0x00, 0x5e, 0x00, 0x6e, 0x00, 0x7e, 0x00, 0xce, 0x00, 0xde, + 0x00, 0xee, 0x00, 0x05, 0x20, 0x01, 0x18, 0x10, 0x20, 0x04, 0xd0, 0xdc, + 0x00, 0x05, 0x00, 0x06, 0x20, 0x01, 0x18, 0x37, 0x20, 0x04, 0xd0, 0x9c, + 0x00, 0x0e, 0x00, 0x05, 0x00, 0x06, 0x00, 0x36, 0x00, 0x46, 0x08, 0x0c, + 0xd6, 0x45, 0x01, 0x68, 0x20, 0x19, 0xff, 0xff, 0x90, 0x05, 0x01, 0x28, + 0x60, 0x10, 0x00, 0xb6, 0x20, 0x58, 0xbb, 0xa0, 0x00, 0xbe, 0x20, 0x21, + 0x00, 0x04, 0x08, 0x0c, 0x4e, 0x58, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0x0e, + 0x00, 0x05, 0x60, 0x04, 0x90, 0x86, 0x00, 0x01, 0x11, 0x28, 0x08, 0x0c, + 0xa7, 0xe2, 0x08, 0x0c, 0xb1, 0xa7, 0x90, 0x06, 0x00, 0x05, 0x00, 0xe6, + 0x00, 0xc6, 0x00, 0xb6, 0x00, 0x46, 0x20, 0x61, 0x1d, 0xdc, 0x20, 0x71, + 0x18, 0x00, 0x74, 0x54, 0x70, 0x74, 0x80, 0x01, 0x94, 0x02, 0x12, 0xd8, + 0x21, 0x00, 0x9c, 0x06, 0x01, 0x68, 0x60, 0x00, 0x90, 0x86, 0x00, 0x00, + 0x01, 0x48, 0x60, 0x10, 0x20, 0x58, 0xb8, 0xa0, 0x92, 0x06, 0x11, 0x20, + 0x60, 0x04, 0x90, 0x86, 0x00, 0x02, 0x01, 0x40, 0x9c, 0xe0, 0x00, 0x1c, + 0x20, 0x01, 0x18, 0x1a, 0x20, 0x04, 0x9c, 0x02, 0x12, 0x20, 0x0c, 0x40, + 0x90, 0x85, 0x00, 0x01, 0x00, 0x08, 0x90, 0x06, 0x00, 0x4e, 0x00, 0xbe, + 0x00, 0xce, 0x00, 0xee, 0x00, 0x05, 0x20, 0x01, 0x18, 0x10, 0x20, 0x04, + 0xd0, 0xa4, 0x01, 0x60, 0x20, 0x01, 0x18, 0x37, 0x20, 0x04, 0xd0, 0xa4, + 0x01, 0x38, 0x20, 0x01, 0x18, 0x48, 0x20, 0x04, 0xd0, 0xa4, 0x11, 0x18, + 0x90, 0x85, 0x00, 0x01, 0x00, 0x05, 0x90, 0x06, 0x0c, 0xe8, 0x01, 0x26, + 0x00, 0x06, 0x00, 0xe6, 0x00, 0x16, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, + 0x18, 0x40, 0xd5, 0xa4, 0x01, 0x18, 0x70, 0x04, 0x80, 0x00, 0x70, 0x06, + 0xd5, 0xb4, 0x01, 0x18, 0x70, 0x00, 0x80, 0x00, 0x70, 0x02, 0xd5, 0xac, + 0x01, 0x78, 0x25, 0x00, 0x90, 0x84, 0x00, 0x07, 0x90, 0x8e, 0x00, 0x03, + 0x01, 0x48, 0x90, 0x8e, 0x00, 0x04, 0x01, 0x30, 0x90, 0x8e, 0x00, 0x05, + 0x01, 0x18, 0x20, 0x71, 0xff, 0xf6, 0x00, 0x89, 0x00, 0x1e, 0x00, 0xee, + 0x00, 0x0e, 0x01, 0x2e, 0x00, 0x05, 0x01, 0x26, 0x00, 0x06, 0x00, 0xe6, + 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, 0xff, 0xee, 0x00, 0x21, 0x00, 0xee, + 0x00, 0x0e, 0x01, 0x2e, 0x00, 0x05, 0x2e, 0x05, 0x80, 0x00, 0x20, 0x77, + 0x12, 0x20, 0x8e, 0x70, 0x2e, 0x05, 0x80, 0x00, 0x20, 0x77, 0x00, 0x05, + 0x00, 0xe6, 0x20, 0x71, 0xff, 0xec, 0x0c, 0x99, 0x00, 0xee, 0x00, 0x05, + 0x00, 0xe6, 0x20, 0x71, 0xff, 0xf0, 0x0c, 0x69, 0x00, 0xee, 0x00, 0x05, + 0x01, 0x26, 0x00, 0x06, 0x00, 0xe6, 0x20, 0x91, 0x80, 0x00, 0x20, 0x71, + 0x18, 0x40, 0x70, 0x14, 0x80, 0x00, 0x70, 0x16, 0x00, 0xee, 0x00, 0x0e, + 0x01, 0x2e, 0x00, 0x05, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, + 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, + 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00, + 0xaa, 0x6e, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x00, 0x0a, 0x4e, 0x00, 0x01, + 0xc0, 0x00, 0x00, 0x08, 0x80, 0x64, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x08, 0x01, 0x01, 0x00, 0x03, 0xc0, 0x07, 0x00, 0x08, + 0x80, 0xe0, 0x00, 0x08, 0xff, 0x00, 0x00, 0x00, 0x80, 0xe2, 0x00, 0x08, + 0xff, 0x00, 0x00, 0x08, 0x01, 0x62, 0x00, 0x00, 0x80, 0x66, 0x00, 0x08, + 0xa1, 0x01, 0x00, 0x0b, 0xc0, 0x0f, 0x00, 0x08, 0x0d, 0x02, 0x00, 0x00, + 0x80, 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0b, 0x60, 0xc6, 0x00, 0x08, + 0x80, 0xe0, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0b, 0x58, 0x19, 0x00, 0x03, + 0x7b, 0x08, 0x00, 0x03, 0x52, 0x41, 0x00, 0x0b, 0xc8, 0x13, 0x00, 0x09, + 0xba, 0xc0, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x03, 0x88, 0x13, 0x00, 0x0a, + 0x70, 0x42, 0x00, 0x03, 0x88, 0x13, 0x00, 0x00, 0x15, 0xfc, 0x00, 0x0b, + 0xb0, 0x13, 0x00, 0x09, 0xc4, 0xc0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x01, + 0xff, 0xa0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x03, 0x93, 0xcd, 0x00, 0x08, + 0x80, 0x8c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xd4, 0x00, 0x0a, 0x40, 0x47, 0x00, 0x08, + 0x80, 0x8c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0b, + 0x08, 0x32, 0x00, 0x00, 0x40, 0x22, 0x00, 0x03, 0x00, 0x38, 0x00, 0x08, + 0x41, 0x22, 0x00, 0x09, 0xea, 0xc0, 0x00, 0x08, 0xff, 0x00, 0x00, 0x09, + 0xff, 0xe0, 0x00, 0x08, 0x05, 0x00, 0x00, 0x0b, 0x0b, 0xf4, 0x00, 0x02, + 0x44, 0x47, 0x00, 0x03, 0x8b, 0xf1, 0x00, 0x08, 0x0b, 0xfe, 0x00, 0x01, + 0x11, 0xa0, 0x00, 0x0b, 0x13, 0xd3, 0x00, 0x01, 0x0c, 0xa0, 0x00, 0x0b, + 0x13, 0xd3, 0x00, 0x01, 0x91, 0x80, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x80, 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x08, 0x00, 0x09, 0x00, 0x03, 0xc0, 0x46, 0x00, 0x08, + 0x80, 0x8c, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x60, 0x00, 0x08, + 0x80, 0x62, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x80, 0x66, 0x00, 0x00, + 0x04, 0x11, 0x00, 0x0b, 0xc0, 0x4e, 0x00, 0x00, 0x03, 0xfe, 0x00, 0x01, + 0x43, 0xe0, 0x00, 0x03, 0x8b, 0xd0, 0x00, 0x09, 0xc2, 0xc0, 0x00, 0x08, + 0x00, 0xff, 0x00, 0x01, 0x02, 0xe0, 0x00, 0x03, 0x8b, 0xd0, 0x00, 0x01, + 0x91, 0x80, 0x00, 0x08, 0x00, 0x05, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x00, 0x80, 0x66, 0x00, 0x00, + 0x00, 0x19, 0x00, 0x03, 0xc0, 0x5d, 0x00, 0x02, 0x02, 0x40, 0x00, 0x0b, + 0x0b, 0xcd, 0x00, 0x08, 0x00, 0xfc, 0x00, 0x03, 0x33, 0xd0, 0x00, 0x0a, + 0x02, 0x44, 0x00, 0x03, 0x08, 0x6f, 0x00, 0x04, 0x02, 0x1a, 0x00, 0x01, + 0x91, 0x80, 0x00, 0x00, 0x00, 0x07, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x00, + 0x80, 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x02, 0x34, 0x00, 0x08, + 0x7f, 0x04, 0x00, 0x00, 0x80, 0x66, 0x00, 0x00, 0x04, 0x0a, 0x00, 0x03, + 0xc0, 0x6e, 0x00, 0x0a, 0x02, 0x48, 0x00, 0x0b, 0x08, 0x79, 0x00, 0x01, + 0x91, 0x80, 0x00, 0x08, 0x00, 0x06, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x08, + 0x80, 0x02, 0x00, 0x08, 0x00, 0x03, 0x00, 0x00, 0x80, 0x66, 0x00, 0x00, + 0x02, 0x0a, 0x00, 0x0b, 0xc0, 0x78, 0x00, 0x00, 0x11, 0x2a, 0x00, 0x08, + 0x00, 0x2e, 0x00, 0x08, 0x02, 0x2c, 0x00, 0x02, 0x3a, 0x44, 0x00, 0x03, + 0x88, 0x13, 0x00, 0x08, 0x80, 0x8c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, + 0x17, 0x60, 0x00, 0x08, 0x80, 0x62, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x08, 0x00, 0x11, 0x00, 0x03, 0xc0, 0x85, 0x00, 0x08, + 0x01, 0xfe, 0x00, 0x09, 0x42, 0xe0, 0x00, 0x0b, 0x8b, 0xc0, 0x00, 0x00, + 0x00, 0xfe, 0x00, 0x01, 0x43, 0xe0, 0x00, 0x0b, 0x8b, 0xc0, 0x00, 0x00, + 0x17, 0x34, 0x00, 0x00, 0x15, 0x30, 0x00, 0x08, 0x16, 0x32, 0x00, 0x08, + 0x0d, 0x2a, 0x00, 0x01, 0x98, 0x80, 0x00, 0x08, 0x00, 0x12, 0x00, 0x00, + 0x80, 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x08, 0x1e, 0x0a, 0x00, 0x03, 0xc0, 0x97, 0x00, 0x08, + 0x80, 0x8a, 0x00, 0x08, 0x00, 0x03, 0x00, 0x00, 0x1a, 0x60, 0x00, 0x08, + 0x80, 0x62, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0b, 0x58, 0x9d, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x00, 0x36, 0x79, 0x00, 0x0b, 0xc0, 0xa0, 0x00, 0x0b, + 0x58, 0xa1, 0x00, 0x08, 0x80, 0x54, 0x00, 0x08, 0x00, 0x11, 0x00, 0x00, + 0x80, 0x74, 0x00, 0x08, 0x10, 0x10, 0x00, 0x08, 0x1e, 0xfc, 0x00, 0x03, + 0x30, 0x13, 0x00, 0x04, 0x00, 0xaa, 0x00, 0x03, 0x00, 0x13, 0x00, 0x00, + 0x1c, 0x60, 0x00, 0x00, 0x1b, 0x62, 0x00, 0x00, 0x80, 0x66, 0x00, 0x08, + 0x02, 0x31, 0x00, 0x03, 0xc0, 0xae, 0x00, 0x03, 0x58, 0xaf, 0x00, 0x08, + 0x01, 0x40, 0x00, 0x00, 0x02, 0x42, 0x00, 0x02, 0x1f, 0x43, 0x00, 0x03, + 0x88, 0xb9, 0x00, 0x00, 0x0d, 0x44, 0x00, 0x08, 0x0d, 0x46, 0x00, 0x08, + 0x03, 0x48, 0x00, 0x08, 0x04, 0x4a, 0x00, 0x0b, 0x00, 0xbd, 0x00, 0x08, + 0x03, 0x44, 0x00, 0x08, 0x04, 0x46, 0x00, 0x08, 0x05, 0x48, 0x00, 0x00, + 0x06, 0x4a, 0x00, 0x0a, 0x19, 0x48, 0x00, 0x03, 0x08, 0xc0, 0x00, 0x08, + 0x0d, 0x4a, 0x00, 0x03, 0x58, 0xc0, 0x00, 0x08, 0x80, 0x54, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x80, 0x74, 0x00, 0x08, 0x20, 0x20, 0x00, 0x0f, + 0x40, 0x00, 0x00, 0x02, 0x70, 0x43, 0x00, 0x03, 0x88, 0x16, 0x00, 0x02, + 0x70, 0x40, 0x00, 0x0b, 0x89, 0x49, 0x00, 0x00, 0x48, 0x20, 0x00, 0x08, + 0x0b, 0xfe, 0x00, 0x09, 0x10, 0xa0, 0x00, 0x03, 0x11, 0x40, 0x00, 0x01, + 0x0c, 0xa0, 0x00, 0x03, 0x11, 0x40, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x09, 0x90, 0x80, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, + 0x7f, 0x62, 0x00, 0x00, 0x80, 0x66, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0b, + 0xc0, 0xd7, 0x00, 0x01, 0x80, 0xe0, 0x00, 0x08, 0x00, 0x03, 0x00, 0x0b, + 0x89, 0x40, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, + 0x90, 0x80, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0b, 0xc0, 0xe2, 0x00, 0x08, + 0x00, 0x60, 0x00, 0x08, 0x80, 0x62, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x00, 0x04, 0x11, 0x00, 0x0b, 0xc0, 0xe8, 0x00, 0x08, + 0x4a, 0xfe, 0x00, 0x09, 0x03, 0xe0, 0x00, 0x0b, 0x89, 0x40, 0x00, 0x09, + 0xcb, 0xc0, 0x00, 0x08, 0x00, 0xff, 0x00, 0x01, 0x02, 0xe0, 0x00, 0x0b, + 0x89, 0x40, 0x00, 0x00, 0x49, 0xb4, 0x00, 0x02, 0x4b, 0x4e, 0x00, 0x0b, + 0x89, 0x51, 0x00, 0x08, 0x80, 0x8a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x18, 0xfe, 0x00, 0x01, 0x10, 0xe0, 0x00, 0x0b, 0x88, 0xfa, 0x00, 0x02, + 0x19, 0x2f, 0x00, 0x08, 0x7f, 0x32, 0x00, 0x08, 0x15, 0xfe, 0x00, 0x01, + 0x10, 0xe0, 0x00, 0x0b, 0x88, 0xff, 0x00, 0x02, 0x16, 0x2f, 0x00, 0x08, + 0x7f, 0x2c, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, + 0x90, 0x80, 0x00, 0x00, 0x00, 0x07, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x08, 0x00, 0x09, 0x00, 0x03, 0xc1, 0x06, 0x00, 0x0a, + 0x00, 0x4f, 0x00, 0x0b, 0x89, 0x37, 0x00, 0x0a, 0x00, 0x40, 0x00, 0x0b, + 0x09, 0x21, 0x00, 0x02, 0x00, 0x4e, 0x00, 0x0b, 0x09, 0x21, 0x00, 0x02, + 0x00, 0x30, 0x00, 0x02, 0x7f, 0x2f, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x03, 0xc1, 0x12, 0x00, 0x08, + 0x10, 0x10, 0x00, 0x04, 0x02, 0x01, 0x00, 0x03, 0xb1, 0x1a, 0x00, 0x04, + 0x03, 0x87, 0x00, 0x0c, 0x01, 0xeb, 0x00, 0x03, 0x78, 0x16, 0x00, 0x03, + 0x00, 0x13, 0x00, 0x00, 0x08, 0x06, 0x00, 0x08, 0x80, 0x10, 0x00, 0x00, + 0x00, 0x1f, 0x00, 0x04, 0x03, 0x87, 0x00, 0x00, 0x03, 0x10, 0x00, 0x04, + 0x03, 0x87, 0x00, 0x03, 0x01, 0x18, 0x00, 0x0a, 0x00, 0x2f, 0x00, 0x00, + 0x7f, 0x00, 0x00, 0x00, 0x80, 0x66, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x0b, + 0xc1, 0x25, 0x00, 0x04, 0x01, 0xc4, 0x00, 0x0a, 0x00, 0x40, 0x00, 0x0b, + 0x09, 0x3a, 0x00, 0x04, 0x02, 0x31, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, + 0x90, 0x80, 0x00, 0x08, 0x00, 0x06, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x03, 0xc1, 0x33, 0x00, 0x00, + 0x80, 0x72, 0x00, 0x00, 0x40, 0x00, 0x00, 0x03, 0x01, 0x18, 0x00, 0x08, + 0x80, 0x10, 0x00, 0x08, 0x00, 0x1e, 0x00, 0x03, 0x01, 0x3c, 0x00, 0x08, + 0x80, 0x10, 0x00, 0x08, 0x00, 0x1d, 0x00, 0x04, 0x03, 0x87, 0x00, 0x08, + 0x10, 0x10, 0x00, 0x04, 0x03, 0x87, 0x00, 0x03, 0x00, 0x16, 0x00, 0x02, + 0x4b, 0x4e, 0x00, 0x03, 0x09, 0x46, 0x00, 0x08, 0x80, 0x8a, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x0b, 0x61, 0x46, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x08, + 0x80, 0x8a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x16, 0x00, 0x08, + 0x80, 0x8a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x08, 0x80, 0xe0, 0x00, 0x08, 0x02, 0x02, 0x00, 0x0b, + 0x61, 0x49, 0x00, 0x0b, 0x00, 0x14, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x09, 0x90, 0x80, 0x00, 0x08, 0x00, 0x11, 0x00, 0x08, + 0x7f, 0x62, 0x00, 0x00, 0x80, 0x66, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0b, + 0xc1, 0x58, 0x00, 0x0a, 0x00, 0x4f, 0x00, 0x0b, 0x89, 0xb5, 0x00, 0x00, + 0x80, 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, 0x90, 0x80, 0x00, 0x08, + 0x00, 0x05, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x00, 0x80, 0x66, 0x00, 0x08, + 0x00, 0x09, 0x00, 0x0b, 0xc1, 0x62, 0x00, 0x08, 0x00, 0x60, 0x00, 0x08, + 0x80, 0x62, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x80, 0x66, 0x00, 0x00, + 0x02, 0x09, 0x00, 0x0b, 0xc1, 0x68, 0x00, 0x0a, 0x01, 0x4b, 0x00, 0x03, + 0x09, 0xb5, 0x00, 0x08, 0x80, 0x62, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x00, 0x02, 0x11, 0x00, 0x03, 0xc1, 0x6f, 0x00, 0x08, + 0x01, 0xfe, 0x00, 0x01, 0x02, 0xd0, 0x00, 0x0b, 0x89, 0xb5, 0x00, 0x04, + 0x01, 0xcd, 0x00, 0x03, 0x09, 0xb5, 0x00, 0x08, 0x03, 0xa0, 0x00, 0x08, + 0x80, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x06, 0x00, 0x00, + 0x00, 0x43, 0x00, 0x08, 0x49, 0x08, 0x00, 0x08, 0x80, 0x8a, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, + 0x90, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x08, 0x04, 0x1a, 0x00, 0x03, 0xc1, 0x84, 0x00, 0x03, + 0xe1, 0x85, 0x00, 0x08, 0x49, 0x08, 0x00, 0x08, 0x48, 0x0a, 0x00, 0x08, + 0x80, 0x8a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x60, 0x00, 0x08, + 0x80, 0x62, 0x00, 0x08, 0x00, 0x2b, 0x00, 0x00, 0x80, 0x66, 0x00, 0x00, + 0x04, 0x11, 0x00, 0x0b, 0xc1, 0x8f, 0x00, 0x08, 0x04, 0xfe, 0x00, 0x09, + 0x02, 0xa0, 0x00, 0x03, 0x91, 0x96, 0x00, 0x02, 0x05, 0x00, 0x00, 0x0b, + 0x09, 0xb2, 0x00, 0x0b, 0x01, 0x97, 0x00, 0x00, 0x05, 0xfe, 0x00, 0x01, + 0x03, 0xa0, 0x00, 0x0b, 0x11, 0xb2, 0x00, 0x00, 0x0d, 0x0c, 0x00, 0x08, + 0x0d, 0x0e, 0x00, 0x08, 0x0d, 0x10, 0x00, 0x00, 0x0d, 0x12, 0x00, 0x08, + 0x00, 0x60, 0x00, 0x08, 0x80, 0x62, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x08, 0x08, 0x32, 0x00, 0x0b, 0xc1, 0xa2, 0x00, 0x00, + 0x80, 0x0a, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x09, 0x90, 0x80, 0x00, 0x08, 0x00, 0x11, 0x00, 0x08, + 0x7f, 0x62, 0x00, 0x00, 0x80, 0x66, 0x00, 0x08, 0x0a, 0x12, 0x00, 0x03, + 0xc1, 0xac, 0x00, 0x08, 0x50, 0x06, 0x00, 0x08, 0x10, 0x0e, 0x00, 0x0c, + 0x01, 0xd8, 0x00, 0x03, 0x78, 0x16, 0x00, 0x03, 0x00, 0x13, 0x00, 0x08, + 0x02, 0x08, 0x00, 0x08, 0x03, 0x0a, 0x00, 0x03, 0x01, 0x99, 0x00, 0x04, + 0x01, 0xc4, 0x00, 0x08, 0x80, 0x8a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, + 0x80, 0x10, 0x00, 0x08, 0x00, 0x21, 0x00, 0x04, 0x03, 0x87, 0x00, 0x08, + 0x10, 0x10, 0x00, 0x04, 0x03, 0x87, 0x00, 0x00, 0x48, 0x10, 0x00, 0x04, + 0x03, 0x87, 0x00, 0x08, 0x49, 0x10, 0x00, 0x04, 0x03, 0x87, 0x00, 0x08, + 0x80, 0x8a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x16, 0x00, 0x00, + 0x80, 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, 0x90, 0x80, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x00, 0x80, 0x66, 0x00, 0x08, + 0xb4, 0x0a, 0x00, 0x0b, 0xc1, 0xcb, 0x00, 0x0f, 0x40, 0x00, 0x00, 0x00, + 0x80, 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0a, 0x62, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x00, 0x04, 0x11, 0x00, 0x03, 0xc1, 0xd2, 0x00, 0x02, + 0x02, 0x10, 0x00, 0x01, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x07, 0x00, 0x09, + 0x03, 0xe0, 0x00, 0x0f, 0x40, 0x00, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x01, 0x83, 0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, + 0x0a, 0x80, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x00, 0x80, 0x66, 0x00, 0x00, + 0x0e, 0x0a, 0x00, 0x0b, 0xc1, 0xe0, 0x00, 0x02, 0x03, 0x00, 0x00, 0x01, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x7f, 0x06, 0x00, 0x02, + 0x0a, 0x00, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x00, 0x80, 0x66, 0x00, 0x08, + 0x06, 0x0a, 0x00, 0x0b, 0xc1, 0xe9, 0x00, 0x0f, 0x40, 0x00, 0x00, 0x00, + 0x0d, 0xa0, 0x00, 0x08, 0x0d, 0xa2, 0x00, 0x08, 0x0d, 0xa4, 0x00, 0x09, + 0x88, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x00, + 0x80, 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x66, 0x00, 0x08, + 0xa0, 0x12, 0x00, 0x00, 0x0d, 0xa6, 0x00, 0x08, 0x0d, 0xa8, 0x00, 0x00, + 0x0d, 0xaa, 0x00, 0x00, 0x0d, 0xac, 0x00, 0x03, 0xc1, 0xf9, 0x00, 0x09, + 0x88, 0x80, 0x00, 0x08, 0x00, 0x09, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x08, 0xa0, 0x3a, 0x00, 0x03, 0xc1, 0xff, 0x00, 0x0f, + 0x40, 0x00, 0x00, 0x09, 0x88, 0x80, 0x00, 0x08, 0x00, 0x05, 0x00, 0x00, + 0x80, 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0b, 0xc2, 0x08, 0x00, 0x08, + 0x00, 0x60, 0x00, 0x08, 0x80, 0x62, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x08, 0x00, 0x21, 0x00, 0x0b, 0xc2, 0x0e, 0x00, 0x00, + 0x00, 0xfe, 0x00, 0x01, 0x01, 0xd0, 0x00, 0x03, 0x8a, 0x17, 0x00, 0x08, + 0x02, 0xfe, 0x00, 0x09, 0x03, 0xd0, 0x00, 0x0b, 0x0a, 0x17, 0x00, 0x00, + 0x0d, 0x06, 0x00, 0x0f, 0x40, 0x00, 0x00, 0x00, 0x80, 0x06, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x0f, 0x40, 0x00, 0x00, 0x08, 0x00, 0x60, 0x00, 0x08, + 0x80, 0x62, 0x00, 0x08, 0x00, 0x2b, 0x00, 0x00, 0x80, 0x66, 0x00, 0x08, + 0xa0, 0x41, 0x00, 0x0b, 0xc2, 0x1f, 0x00, 0x02, 0x02, 0x43, 0x00, 0x0b, + 0x8a, 0x26, 0x00, 0x00, 0x54, 0xac, 0x00, 0x00, 0x55, 0xae, 0x00, 0x08, + 0x0d, 0xa8, 0x00, 0x00, 0x0d, 0xaa, 0x00, 0x00, 0x50, 0xb0, 0x00, 0x00, + 0x51, 0xb2, 0x00, 0x00, 0x0d, 0xb4, 0x00, 0x08, 0x0d, 0xb6, 0x00, 0x08, + 0x00, 0x60, 0x00, 0x08, 0x80, 0x62, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x08, 0xa4, 0x52, 0x00, 0x0b, 0xc2, 0x2f, 0x00, 0x0f, + 0x40, 0x00, 0x00, 0x0a, 0x39, 0x45, 0x00, 0x0b, 0x8a, 0x3b, 0x00, 0x00, + 0x80, 0x72, 0x00, 0x08, 0x40, 0x40, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0a, + 0x39, 0x45, 0x00, 0x03, 0x8a, 0x39, 0x00, 0x0f, 0x40, 0x00, 0x00, 0x00, + 0x80, 0x72, 0x00, 0x00, 0x40, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0a, 0x39, 0x45, 0x00, 0x0b, + 0x0a, 0x33, 0x00, 0x0b, 0x02, 0x3b, 0x00, 0x0a, 0x3a, 0x40, 0x00, 0x03, + 0x88, 0x19, 0x00, 0x01, 0xab, 0xd0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0x24, 0x00, 0x03, 0x5a, 0x46, 0x00, 0x08, 0x80, 0x54, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x02, 0x12, 0x42, 0x00, 0x03, 0x0a, 0x8c, 0x00, 0x0a, + 0x3a, 0x45, 0x00, 0x0b, 0x0a, 0x7b, 0x00, 0x0a, 0x1e, 0x10, 0x00, 0x00, + 0x7f, 0x3c, 0x00, 0x0b, 0x0a, 0x78, 0x00, 0x02, 0x1d, 0x00, 0x00, 0x00, + 0x7f, 0x3a, 0x00, 0x00, 0x0d, 0x60, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x08, 0x00, 0x09, 0x00, 0x03, 0xc2, 0x56, 0x00, 0x08, + 0x00, 0xfc, 0x00, 0x03, 0xb2, 0x75, 0x00, 0x00, 0x1c, 0x60, 0x00, 0x08, + 0x80, 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x80, 0x66, 0x00, 0x08, + 0x00, 0x09, 0x00, 0x0b, 0xc2, 0x5e, 0x00, 0x08, 0x00, 0xfc, 0x00, 0x0b, + 0x33, 0xa9, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x60, 0x00, 0x08, + 0x80, 0x62, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x80, 0x66, 0x00, 0x08, + 0x00, 0x09, 0x00, 0x0b, 0xc2, 0x67, 0x00, 0x09, 0x80, 0xc0, 0x00, 0x08, + 0x00, 0xff, 0x00, 0x08, 0x7f, 0x3e, 0x00, 0x00, 0x0d, 0x60, 0x00, 0x08, + 0x0e, 0xfe, 0x00, 0x01, 0x1f, 0x80, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x08, 0x00, 0x09, 0x00, 0x03, 0xc2, 0x71, 0x00, 0x08, + 0x00, 0x3a, 0x00, 0x00, 0x1d, 0xfe, 0x00, 0x0b, 0x02, 0x52, 0x00, 0x08, + 0x00, 0x36, 0x00, 0x04, 0x00, 0xaa, 0x00, 0x0b, 0x02, 0x8c, 0x00, 0x00, + 0x80, 0x74, 0x00, 0x00, 0x20, 0x00, 0x00, 0x0b, 0x02, 0x8c, 0x00, 0x02, + 0x3a, 0x44, 0x00, 0x0b, 0x0b, 0xd6, 0x00, 0x00, 0x80, 0x74, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x01, 0xad, 0xd0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, + 0x7f, 0x0e, 0x00, 0x03, 0xb3, 0xa6, 0x00, 0x01, 0xa7, 0xd0, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x09, 0xa6, 0xd0, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x09, 0x00, 0xd0, 0x00, 0x03, 0x8a, 0x9c, 0x00, 0x00, + 0x80, 0x74, 0x00, 0x08, 0x40, 0x40, 0x00, 0x03, 0x5a, 0x8c, 0x00, 0x03, + 0x52, 0x41, 0x00, 0x0a, 0x3a, 0x46, 0x00, 0x03, 0x8a, 0x9c, 0x00, 0x02, + 0x3a, 0x47, 0x00, 0x03, 0x0a, 0x97, 0x00, 0x08, 0x80, 0x54, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x80, 0x74, 0x00, 0x00, 0x80, 0x00, 0x00, 0x03, + 0x02, 0xfc, 0x00, 0x09, 0x92, 0xc0, 0x00, 0x00, 0x0f, 0xc8, 0x00, 0x0b, + 0x08, 0x13, 0x00, 0x0a, 0x12, 0x46, 0x00, 0x0b, 0x8b, 0xa0, 0x00, 0x00, + 0x1a, 0x60, 0x00, 0x08, 0x80, 0x62, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x00, 0x36, 0x7a, 0x00, 0x0b, 0xc2, 0xa1, 0x00, 0x09, + 0x92, 0xc0, 0x00, 0x08, 0x07, 0x80, 0x00, 0x03, 0x8b, 0xba, 0x00, 0x02, + 0x12, 0x4b, 0x00, 0x0b, 0x0a, 0xaa, 0x00, 0x02, 0x2e, 0x4d, 0x00, 0x02, + 0x2e, 0x4d, 0x00, 0x03, 0x0b, 0xa6, 0x00, 0x0a, 0x3a, 0x46, 0x00, 0x0b, + 0x8a, 0xba, 0x00, 0x0b, 0x5a, 0xac, 0x00, 0x08, 0x80, 0x54, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x0a, 0x12, 0x43, 0x00, 0x0b, 0x0a, 0xfa, 0x00, 0x08, + 0x80, 0x10, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x04, 0x03, 0x87, 0x00, 0x0a, + 0x19, 0x48, 0x00, 0x0b, 0x0a, 0xb7, 0x00, 0x0c, 0x03, 0x7c, 0x00, 0x00, + 0x18, 0x10, 0x00, 0x04, 0x03, 0x87, 0x00, 0x03, 0x02, 0xfa, 0x00, 0x0a, + 0x19, 0x48, 0x00, 0x0b, 0x0a, 0xbe, 0x00, 0x0a, 0x12, 0x43, 0x00, 0x03, + 0x0b, 0xa9, 0x00, 0x0a, 0x19, 0x4d, 0x00, 0x03, 0x0a, 0xc2, 0x00, 0x0a, + 0x12, 0x43, 0x00, 0x0b, 0x0b, 0xb0, 0x00, 0x03, 0x5a, 0xc2, 0x00, 0x08, + 0x80, 0x54, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0a, 0x19, 0x2e, 0x00, 0x08, + 0x7f, 0x32, 0x00, 0x0a, 0x19, 0x47, 0x00, 0x03, 0x0a, 0xf4, 0x00, 0x02, + 0x19, 0x4f, 0x00, 0x0b, 0x0a, 0xd2, 0x00, 0x0c, 0x03, 0x7c, 0x00, 0x00, + 0x18, 0x10, 0x00, 0x04, 0x02, 0x01, 0x00, 0x0b, 0xb2, 0xed, 0x00, 0x04, + 0x03, 0x87, 0x00, 0x0c, 0x01, 0xeb, 0x00, 0x03, 0x02, 0xfa, 0x00, 0x00, + 0x1a, 0x60, 0x00, 0x08, 0x80, 0x62, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x08, 0x00, 0x09, 0x00, 0x03, 0xc2, 0xd7, 0x00, 0x0a, + 0x00, 0x4c, 0x00, 0x0b, 0x8a, 0xf4, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x01, 0x98, 0x80, 0x00, 0x00, 0x00, 0x07, 0x00, 0x08, + 0x7f, 0x62, 0x00, 0x00, 0x80, 0x66, 0x00, 0x00, 0x32, 0x0a, 0x00, 0x03, + 0xc2, 0xe1, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, + 0x98, 0x80, 0x00, 0x08, 0x00, 0x12, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x08, 0x1e, 0x0a, 0x00, 0x0b, 0xc2, 0xe9, 0x00, 0x00, + 0x18, 0x26, 0x00, 0x00, 0x19, 0x28, 0x00, 0x03, 0x02, 0xfa, 0x00, 0x00, + 0x08, 0x06, 0x00, 0x08, 0x80, 0x10, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x04, + 0x03, 0x87, 0x00, 0x00, 0x03, 0x10, 0x00, 0x04, 0x03, 0x87, 0x00, 0x03, + 0x02, 0xfa, 0x00, 0x0c, 0x03, 0x7c, 0x00, 0x08, 0x80, 0x10, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x04, 0x03, 0x87, 0x00, 0x00, 0x18, 0x10, 0x00, 0x04, + 0x03, 0x87, 0x00, 0x00, 0x80, 0x74, 0x00, 0x08, 0xf0, 0x00, 0x00, 0x00, + 0x0d, 0x30, 0x00, 0x02, 0x3a, 0x42, 0x00, 0x03, 0x8b, 0x02, 0x00, 0x00, + 0x15, 0xfc, 0x00, 0x03, 0xb0, 0x7e, 0x00, 0x03, 0x00, 0x13, 0x00, 0x00, + 0x80, 0x74, 0x00, 0x00, 0x05, 0x01, 0x00, 0x08, 0x80, 0x10, 0x00, 0x08, + 0x00, 0x0c, 0x00, 0x04, 0x03, 0x87, 0x00, 0x03, 0x00, 0x13, 0x00, 0x09, + 0xbb, 0xe0, 0x00, 0x08, 0x00, 0x30, 0x00, 0x0b, 0x8b, 0x1e, 0x00, 0x00, + 0x18, 0xfe, 0x00, 0x09, 0x3c, 0xe0, 0x00, 0x03, 0x0b, 0x1b, 0x00, 0x08, + 0x15, 0xfe, 0x00, 0x09, 0x3c, 0xe0, 0x00, 0x03, 0x0b, 0x1b, 0x00, 0x08, + 0x13, 0xfe, 0x00, 0x09, 0x3c, 0xe0, 0x00, 0x0b, 0x8b, 0x17, 0x00, 0x0c, + 0x03, 0x75, 0x00, 0x08, 0x0d, 0x26, 0x00, 0x0b, 0x03, 0x18, 0x00, 0x04, + 0x03, 0x77, 0x00, 0x08, 0x80, 0x76, 0x00, 0x00, 0x00, 0x40, 0x00, 0x0b, + 0x03, 0x72, 0x00, 0x08, 0x80, 0x76, 0x00, 0x08, 0x00, 0x41, 0x00, 0x0b, + 0x03, 0x72, 0x00, 0x09, 0xbb, 0xe0, 0x00, 0x00, 0x00, 0x32, 0x00, 0x03, + 0x8b, 0x23, 0x00, 0x08, 0x3c, 0x1e, 0x00, 0x0b, 0x03, 0x72, 0x00, 0x09, + 0xbb, 0xe0, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x0b, 0x8b, 0x28, 0x00, 0x00, + 0x3c, 0xdc, 0x00, 0x0b, 0x03, 0x72, 0x00, 0x09, 0xbb, 0xe0, 0x00, 0x08, + 0x00, 0x35, 0x00, 0x0b, 0x8b, 0x2e, 0x00, 0x00, 0x80, 0x72, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x0b, 0x04, 0xe5, 0x00, 0x09, 0xbb, 0xe0, 0x00, 0x08, + 0x00, 0x36, 0x00, 0x0b, 0x0c, 0x06, 0x00, 0x09, 0xbb, 0xe0, 0x00, 0x00, + 0x00, 0x37, 0x00, 0x0b, 0x8b, 0x53, 0x00, 0x00, 0x18, 0xfe, 0x00, 0x09, + 0x3c, 0xe0, 0x00, 0x0b, 0x8b, 0x1b, 0x00, 0x08, 0x80, 0x76, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x1a, 0x60, 0x00, 0x08, 0x80, 0x62, 0x00, 0x00, + 0x00, 0x0d, 0x00, 0x09, 0xa6, 0xd0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, + 0x7f, 0x04, 0x00, 0x01, 0xa7, 0xd0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0x06, 0x00, 0x01, 0xa8, 0xd0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, + 0x7f, 0x08, 0x00, 0x09, 0xa9, 0xd0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0x0a, 0x00, 0x00, 0x80, 0x66, 0x00, 0x00, 0x04, 0x22, 0x00, 0x03, + 0xc3, 0x4a, 0x00, 0x0c, 0x03, 0x7c, 0x00, 0x08, 0x80, 0x54, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x80, 0x74, 0x00, 0x08, 0xf0, 0x00, 0x00, 0x00, + 0x80, 0x72, 0x00, 0x00, 0x80, 0x00, 0x00, 0x03, 0x02, 0xfc, 0x00, 0x09, + 0xbb, 0xe0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x0b, 0x8b, 0x65, 0x00, 0x00, + 0x18, 0xfe, 0x00, 0x09, 0x3c, 0xe0, 0x00, 0x0b, 0x0b, 0x62, 0x00, 0x08, + 0x15, 0xfe, 0x00, 0x09, 0x3c, 0xe0, 0x00, 0x0b, 0x8b, 0x11, 0x00, 0x04, + 0x03, 0x77, 0x00, 0x08, 0x80, 0x76, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x80, 0x72, 0x00, 0x00, 0x80, 0x00, 0x00, 0x03, 0x03, 0xcd, 0x00, 0x08, + 0x80, 0x76, 0x00, 0x08, 0x00, 0x42, 0x00, 0x0b, 0x03, 0x72, 0x00, 0x09, + 0xbb, 0xe0, 0x00, 0x00, 0x00, 0x16, 0x00, 0x0b, 0x8b, 0x72, 0x00, 0x00, + 0x80, 0x74, 0x00, 0x08, 0x08, 0x08, 0x00, 0x02, 0x3a, 0x44, 0x00, 0x0b, + 0x88, 0x18, 0x00, 0x00, 0x80, 0x74, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x80, 0x72, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x03, + 0x00, 0x13, 0x00, 0x00, 0x80, 0x72, 0x00, 0x00, 0x80, 0x00, 0x00, 0x03, + 0x00, 0x13, 0x00, 0x02, 0x14, 0x30, 0x00, 0x0b, 0x03, 0x78, 0x00, 0x0a, + 0x3d, 0x30, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x01, 0xbc, 0x80, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x03, 0x03, 0x80, 0x00, 0x0a, 0x19, 0x30, 0x00, 0x00, + 0x7f, 0x00, 0x00, 0x01, 0x98, 0x80, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, + 0x80, 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x03, 0xc3, 0x85, 0x00, 0x0f, + 0x40, 0x00, 0x00, 0x0b, 0x23, 0x8a, 0x00, 0x08, 0x08, 0x70, 0x00, 0x0f, + 0x40, 0x00, 0x00, 0x02, 0x70, 0x40, 0x00, 0x03, 0x0b, 0x87, 0x00, 0x0b, + 0xe3, 0x94, 0x00, 0x08, 0x80, 0x8a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x80, 0xe0, 0x00, 0x08, + 0x02, 0x02, 0x00, 0x0b, 0x63, 0x8d, 0x00, 0x08, 0x80, 0xe0, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x0b, 0x03, 0x87, 0x00, 0x09, 0xba, 0xc0, 0x00, 0x08, + 0x00, 0x90, 0x00, 0x0b, 0x0b, 0x9d, 0x00, 0x00, 0x80, 0x74, 0x00, 0x00, + 0x07, 0x06, 0x00, 0x0b, 0x03, 0x9f, 0x00, 0x00, 0x80, 0x74, 0x00, 0x00, + 0x07, 0x03, 0x00, 0x0f, 0x40, 0x00, 0x00, 0x08, 0x80, 0x10, 0x00, 0x00, + 0x00, 0x23, 0x00, 0x0b, 0x03, 0xdb, 0x00, 0x08, 0x80, 0x10, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x0b, 0x03, 0xdb, 0x00, 0x08, 0x80, 0x10, 0x00, 0x08, + 0x00, 0x22, 0x00, 0x0b, 0x03, 0xdb, 0x00, 0x0c, 0x03, 0x7c, 0x00, 0x08, + 0x80, 0x10, 0x00, 0x00, 0x00, 0x07, 0x00, 0x04, 0x03, 0x87, 0x00, 0x00, + 0x18, 0x10, 0x00, 0x04, 0x03, 0x87, 0x00, 0x03, 0x03, 0xe5, 0x00, 0x0c, + 0x03, 0x7c, 0x00, 0x08, 0x80, 0x10, 0x00, 0x08, 0x00, 0x1b, 0x00, 0x04, + 0x03, 0x87, 0x00, 0x00, 0x18, 0x10, 0x00, 0x04, 0x03, 0x87, 0x00, 0x00, + 0x80, 0x74, 0x00, 0x00, 0xf0, 0x80, 0x00, 0x00, 0x0d, 0x30, 0x00, 0x03, + 0x00, 0x13, 0x00, 0x08, 0x80, 0x10, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0b, + 0x03, 0xdb, 0x00, 0x08, 0x80, 0x10, 0x00, 0x08, 0x00, 0x05, 0x00, 0x0b, + 0x03, 0xdb, 0x00, 0x0a, 0x16, 0x48, 0x00, 0x03, 0x88, 0x8c, 0x00, 0x08, + 0x80, 0x8c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, + 0x80, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0a, 0x41, 0x43, 0x00, 0x0b, + 0x08, 0x8c, 0x00, 0x02, 0x3a, 0x44, 0x00, 0x03, 0x88, 0x13, 0x00, 0x08, + 0x0d, 0x2a, 0x00, 0x0b, 0x03, 0xdb, 0x00, 0x08, 0x80, 0x10, 0x00, 0x08, + 0x00, 0x03, 0x00, 0x0b, 0x03, 0xdd, 0x00, 0x08, 0x80, 0x10, 0x00, 0x00, + 0x00, 0x0b, 0x00, 0x0b, 0x03, 0xdd, 0x00, 0x08, 0x80, 0x10, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x0b, 0x03, 0xdd, 0x00, 0x02, 0x3a, 0x47, 0x00, 0x0b, + 0x8a, 0x8c, 0x00, 0x08, 0x80, 0x10, 0x00, 0x08, 0x00, 0x06, 0x00, 0x0b, + 0x03, 0xdd, 0x00, 0x00, 0x80, 0x74, 0x00, 0x08, 0xf0, 0x00, 0x00, 0x04, + 0x03, 0x87, 0x00, 0x0c, 0x03, 0x97, 0x00, 0x0a, 0x3a, 0x40, 0x00, 0x0b, + 0x08, 0x13, 0x00, 0x08, 0x80, 0x10, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x04, + 0x03, 0x87, 0x00, 0x03, 0x00, 0x13, 0x00, 0x00, 0x80, 0x74, 0x00, 0x00, + 0xf0, 0x80, 0x00, 0x00, 0x0d, 0x30, 0x00, 0x02, 0x2e, 0x4d, 0x00, 0x02, + 0x2e, 0x4d, 0x00, 0x03, 0x0b, 0xee, 0x00, 0x08, 0x80, 0x54, 0x00, 0x00, + 0x00, 0x19, 0x00, 0x03, 0x00, 0x13, 0x00, 0x08, 0x80, 0x54, 0x00, 0x08, + 0x00, 0x09, 0x00, 0x03, 0x00, 0x13, 0x00, 0x02, 0x3a, 0x44, 0x00, 0x03, + 0x88, 0x13, 0x00, 0x03, 0x03, 0xd0, 0x00, 0x08, 0x80, 0x8c, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x02, 0x44, 0x47, 0x00, 0x03, 0x0c, 0x1a, 0x00, 0x01, + 0xc0, 0xc0, 0x00, 0x08, 0x00, 0xff, 0x00, 0x09, 0xff, 0xe0, 0x00, 0x08, + 0x00, 0xff, 0x00, 0x03, 0x8b, 0xf1, 0x00, 0x01, 0xc1, 0xe0, 0x00, 0x08, + 0xff, 0xff, 0x00, 0x03, 0x8b, 0xf1, 0x00, 0x08, 0x80, 0x10, 0x00, 0x00, + 0x00, 0x13, 0x00, 0x04, 0x03, 0x87, 0x00, 0x00, 0x80, 0x74, 0x00, 0x08, + 0x02, 0x02, 0x00, 0x03, 0x00, 0x13, 0x00, 0x0a, 0x3a, 0x40, 0x00, 0x03, + 0x8c, 0x17, 0x00, 0x00, 0x80, 0x74, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x00, 0x00, 0x3c, 0xfe, 0x00, 0x00, 0x80, 0x72, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x01, 0x43, 0xe0, 0x00, 0x0b, 0x8c, 0x15, 0x00, 0x00, + 0x42, 0xfe, 0x00, 0x01, 0xff, 0xc0, 0x00, 0x08, 0x00, 0xff, 0x00, 0x09, + 0x00, 0xe0, 0x00, 0x0b, 0x0b, 0xf1, 0x00, 0x08, 0x0d, 0x08, 0x00, 0x03, + 0x04, 0x6a, 0x00, 0x00, 0x80, 0x72, 0x00, 0x00, 0x80, 0x00, 0x00, 0x03, + 0x00, 0x13, 0x00, 0x0c, 0x04, 0xee, 0x00, 0x08, 0x80, 0x8c, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x04, 0xfc, 0x00, 0x03, 0x34, 0xd1, 0x00, 0x00, + 0x04, 0x60, 0x00, 0x08, 0x80, 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x08, 0x00, 0x09, 0x00, 0x03, 0xc4, 0x24, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x09, 0x80, 0xc0, 0x00, 0x08, 0x00, 0xff, 0x00, 0x00, + 0x7f, 0x00, 0x00, 0x01, 0x80, 0xe0, 0x00, 0x00, 0x00, 0x04, 0x00, 0x03, + 0x0c, 0x3e, 0x00, 0x01, 0x80, 0xe0, 0x00, 0x08, 0x00, 0x05, 0x00, 0x03, + 0x0c, 0x3e, 0x00, 0x01, 0x80, 0xe0, 0x00, 0x08, 0x00, 0x06, 0x00, 0x03, + 0x0c, 0x3e, 0x00, 0x01, 0x82, 0xc0, 0x00, 0x08, 0xff, 0x00, 0x00, 0x08, + 0x7f, 0x04, 0x00, 0x09, 0x82, 0xe0, 0x00, 0x08, 0x06, 0x00, 0x00, 0x03, + 0x0c, 0x3e, 0x00, 0x09, 0x82, 0xe0, 0x00, 0x08, 0x05, 0x00, 0x00, 0x03, + 0x0c, 0x3e, 0x00, 0x09, 0x82, 0xe0, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, + 0x8c, 0xd1, 0x00, 0x09, 0xc4, 0xc0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x09, + 0xff, 0xe0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0b, 0x0c, 0x6a, 0x00, 0x04, + 0x04, 0xdf, 0x00, 0x02, 0x39, 0x41, 0x00, 0x03, 0x0c, 0x49, 0x00, 0x00, + 0x80, 0x72, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x13, 0x00, 0x00, + 0x04, 0x60, 0x00, 0x08, 0x80, 0xfe, 0x00, 0x08, 0x00, 0x2b, 0x00, 0x08, + 0x7f, 0x62, 0x00, 0x00, 0x80, 0x66, 0x00, 0x08, 0x22, 0x09, 0x00, 0x0b, + 0xc4, 0x4f, 0x00, 0x08, 0x11, 0xfc, 0x00, 0x03, 0x34, 0x65, 0x00, 0x01, + 0x91, 0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x00, 0x80, 0x66, 0x00, 0x08, + 0x06, 0x09, 0x00, 0x03, 0xc4, 0x59, 0x00, 0x00, 0x42, 0xfe, 0x00, 0x01, + 0xff, 0xc0, 0x00, 0x08, 0xff, 0x00, 0x00, 0x09, 0x03, 0xe0, 0x00, 0x0b, + 0x8c, 0x62, 0x00, 0x00, 0x80, 0x72, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0b, + 0x00, 0x56, 0x00, 0x01, 0x91, 0x80, 0x00, 0x08, 0x00, 0x03, 0x00, 0x0b, + 0x04, 0x4c, 0x00, 0x00, 0x80, 0x72, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x80, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0b, 0x04, 0xc4, 0x00, 0x04, + 0x04, 0xdf, 0x00, 0x02, 0x39, 0x41, 0x00, 0x03, 0x0c, 0x70, 0x00, 0x00, + 0x80, 0x72, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x13, 0x00, 0x0a, + 0x6e, 0x42, 0x00, 0x03, 0x0c, 0x75, 0x00, 0x0c, 0x04, 0xa9, 0x00, 0x08, + 0x11, 0xfc, 0x00, 0x03, 0xb4, 0x7a, 0x00, 0x00, 0x80, 0x72, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x80, 0x10, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x0b, + 0x04, 0xc4, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0xfc, 0x00, 0x03, 0xb4, 0x8f, 0x00, 0x08, 0x80, 0x8c, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x01, 0x91, 0x80, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, + 0x7f, 0x62, 0x00, 0x00, 0x80, 0x66, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0b, + 0xc4, 0x85, 0x00, 0x08, 0x00, 0x60, 0x00, 0x08, 0x80, 0x62, 0x00, 0x08, + 0x00, 0x1b, 0x00, 0x08, 0x43, 0x04, 0x00, 0x08, 0x42, 0x06, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x00, 0x04, 0x12, 0x00, 0x03, 0xc4, 0x8d, 0x00, 0x03, + 0x04, 0xa6, 0x00, 0x08, 0x80, 0x8c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x04, 0x60, 0x00, 0x08, 0x80, 0x62, 0x00, 0x08, 0x00, 0x2b, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x08, 0x06, 0x09, 0x00, 0x03, 0xc4, 0x96, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x08, 0x22, 0x0a, 0x00, 0x03, 0xc4, 0x99, 0x00, 0x00, + 0x42, 0xfe, 0x00, 0x01, 0xff, 0xc0, 0x00, 0x08, 0xff, 0x00, 0x00, 0x08, + 0x7f, 0x04, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, + 0x91, 0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x08, 0x04, 0x1a, 0x00, 0x03, 0xc4, 0xa5, 0x00, 0x00, + 0x80, 0x72, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0b, 0x00, 0x56, 0x00, 0x00, + 0x80, 0x60, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x6b, 0x62, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x00, 0x04, 0x11, 0x00, 0x0b, 0xc4, 0xae, 0x00, 0x08, + 0x02, 0xfe, 0x00, 0x09, 0x03, 0xe0, 0x00, 0x03, 0x8c, 0xb4, 0x00, 0x00, + 0x0d, 0x22, 0x00, 0x0f, 0x40, 0x00, 0x00, 0x09, 0x82, 0x80, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x01, 0x6b, 0x80, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x08, 0x22, 0x09, 0x00, 0x0b, 0xc4, 0xba, 0x00, 0x0a, + 0x02, 0x00, 0x00, 0x01, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, + 0x7f, 0x06, 0x00, 0x08, 0x6b, 0x62, 0x00, 0x00, 0x80, 0x66, 0x00, 0x08, + 0x06, 0x0a, 0x00, 0x0b, 0xc4, 0xc2, 0x00, 0x0f, 0x40, 0x00, 0x00, 0x02, + 0x3a, 0x44, 0x00, 0x03, 0x88, 0x13, 0x00, 0x0a, 0x2f, 0x44, 0x00, 0x0a, + 0x2f, 0x44, 0x00, 0x03, 0x8b, 0xd0, 0x00, 0x08, 0x80, 0x8a, 0x00, 0x08, + 0x00, 0x03, 0x00, 0x00, 0x80, 0x74, 0x00, 0x00, 0xf0, 0x80, 0x00, 0x03, + 0x5c, 0xcd, 0x00, 0x08, 0x80, 0x54, 0x00, 0x00, 0x00, 0x19, 0x00, 0x03, + 0x00, 0x13, 0x00, 0x02, 0x3a, 0x44, 0x00, 0x03, 0x88, 0x13, 0x00, 0x08, + 0x80, 0x8c, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x80, 0x10, 0x00, 0x08, + 0x00, 0x11, 0x00, 0x04, 0x03, 0x87, 0x00, 0x00, 0x42, 0xfe, 0x00, 0x01, + 0xff, 0xc0, 0x00, 0x08, 0x00, 0xff, 0x00, 0x08, 0x7f, 0x10, 0x00, 0x04, + 0x03, 0x87, 0x00, 0x08, 0x43, 0x10, 0x00, 0x0b, 0x03, 0xdd, 0x00, 0x02, + 0x39, 0x41, 0x00, 0x0b, 0x0c, 0xe2, 0x00, 0x0f, 0x40, 0x00, 0x00, 0x00, + 0x80, 0x72, 0x00, 0x08, 0x04, 0x04, 0x00, 0x0f, 0x40, 0x00, 0x00, 0x08, + 0x80, 0x10, 0x00, 0x08, 0x00, 0x12, 0x00, 0x04, 0x03, 0x87, 0x00, 0x0c, + 0x04, 0xa9, 0x00, 0x00, 0x11, 0x10, 0x00, 0x04, 0x03, 0x87, 0x00, 0x08, + 0x11, 0xfc, 0x00, 0x0b, 0xb4, 0xe8, 0x00, 0x03, 0x00, 0x13, 0x00, 0x09, + 0xc2, 0xc0, 0x00, 0x08, 0x00, 0xff, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x01, + 0xc3, 0xc0, 0x00, 0x08, 0xff, 0x00, 0x00, 0x09, 0x00, 0xd0, 0x00, 0x0b, + 0x0d, 0x13, 0x00, 0x00, 0x0d, 0x0a, 0x00, 0x01, 0x85, 0x80, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x80, 0x66, 0x00, 0x00, 0x08, 0x09, 0x00, 0x0b, + 0xc4, 0xfd, 0x00, 0x00, 0x04, 0xfc, 0x00, 0x0b, 0x35, 0x0c, 0x00, 0x00, + 0x04, 0x60, 0x00, 0x08, 0x80, 0x62, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x80, 0x66, 0x00, 0x00, 0x02, 0x11, 0x00, 0x0b, 0xc5, 0x05, 0x00, 0x08, + 0x01, 0xfe, 0x00, 0x09, 0x00, 0xe0, 0x00, 0x0b, 0x8d, 0x0c, 0x00, 0x08, + 0x02, 0xfe, 0x00, 0x01, 0x43, 0xe0, 0x00, 0x03, 0x0d, 0x12, 0x00, 0x02, + 0x05, 0x00, 0x00, 0x00, 0x7f, 0x0a, 0x00, 0x09, 0xff, 0xe0, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x03, 0x8c, 0xf6, 0x00, 0x08, 0x0d, 0x08, 0x00, 0x0f, + 0x40, 0x00, 0x00, 0x08, 0x43, 0xfe, 0x00, 0x01, 0x3e, 0x80, 0x00, 0x00, + 0x0d, 0x60, 0x00, 0x08, 0x7f, 0x62, 0x00, 0x00, 0x80, 0x66, 0x00, 0x00, + 0x08, 0x09, 0x00, 0x03, 0xc5, 0x19, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x01, 0x84, 0xc0, 0x00, 0x08, 0xff, 0x00, 0x00, 0x02, + 0x7f, 0x70, 0x00, 0x09, 0xff, 0x80, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, + 0x7f, 0x62, 0x00, 0x00, 0x80, 0x66, 0x00, 0x00, 0x08, 0x09, 0x00, 0x0b, + 0xc5, 0x24, 0x00, 0x0f, 0x40, 0x00, 0xe4, 0xa8, 0xa3, 0xb9, 0x00, 0x13, + 0x00, 0x03, 0x00, 0x00, 0x12, 0x52, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x05, + 0x00, 0x32, 0x00, 0x00, 0x00, 0x10, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, + 0xbb, 0x39, 0x00, 0x0b, 0x80, 0x07, 0x00, 0x04, 0x01, 0x13, 0x00, 0x04, + 0x01, 0x25, 0x00, 0x10, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, + 0xc0, 0xb0, 0x00, 0x10, 0xc0, 0xb1, 0x00, 0x10, 0xc0, 0xb2, 0x00, 0x00, + 0xc0, 0xb3, 0x00, 0x10, 0xc0, 0xb4, 0x00, 0x00, 0xc0, 0xb5, 0x00, 0x00, + 0xc0, 0xb6, 0x00, 0x10, 0xc0, 0xb7, 0x00, 0x10, 0xc0, 0xb8, 0x00, 0x00, + 0xc0, 0xb9, 0x00, 0x00, 0xc0, 0xba, 0x00, 0x00, 0xc0, 0xc2, 0x00, 0x10, + 0xc0, 0xc3, 0x00, 0x00, 0xc0, 0xc4, 0x00, 0x10, 0xc0, 0xc5, 0x00, 0x10, + 0xc0, 0xc6, 0x00, 0x00, 0xc0, 0xc7, 0x00, 0x00, 0xc0, 0xc8, 0x00, 0x10, + 0xc0, 0xc9, 0x00, 0x10, 0xc0, 0xca, 0x00, 0x00, 0xc0, 0xcb, 0x00, 0x10, + 0xc0, 0xcc, 0x00, 0x00, 0xc0, 0xcd, 0x00, 0x00, 0xc0, 0xce, 0x00, 0x10, + 0xc0, 0xcf, 0x00, 0x15, 0x00, 0x39, 0x00, 0x10, 0xff, 0x00, 0x00, 0x15, + 0x00, 0x3a, 0x00, 0x10, 0xff, 0x00, 0x00, 0x05, 0x00, 0xd0, 0x00, 0x10, + 0xff, 0x00, 0x00, 0x15, 0x00, 0xd1, 0x00, 0x10, 0xff, 0x00, 0x00, 0x12, + 0x3a, 0x40, 0x00, 0x0b, 0x10, 0x31, 0x00, 0x02, 0x79, 0x40, 0x00, 0x1b, + 0x11, 0x37, 0x00, 0x02, 0x3a, 0x42, 0x00, 0x1b, 0x10, 0x35, 0x00, 0x03, + 0xb0, 0x35, 0x00, 0x03, 0xa1, 0xe2, 0x00, 0x02, 0x3a, 0x41, 0x00, 0x1b, + 0x10, 0x39, 0x00, 0x12, 0x79, 0x41, 0x00, 0x1b, 0x13, 0x17, 0x00, 0x13, + 0xe0, 0x54, 0x00, 0x01, 0x0f, 0xe8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x13, + 0x10, 0x54, 0x00, 0x00, 0x0c, 0xfe, 0x00, 0x13, 0x60, 0x47, 0x00, 0x02, + 0x3a, 0x44, 0x00, 0x1b, 0x10, 0x47, 0x00, 0x11, 0x02, 0xe8, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x13, 0x13, 0xcd, 0x00, 0x11, 0x02, 0xe8, 0x00, 0x10, + 0x00, 0x05, 0x00, 0x13, 0x14, 0x5f, 0x00, 0x12, 0x3a, 0x46, 0x00, 0x0b, + 0x10, 0x54, 0x00, 0x11, 0x02, 0xe8, 0x00, 0x10, 0x00, 0x00, 0x00, 0x13, + 0x10, 0x4f, 0x00, 0x11, 0x02, 0xe8, 0x00, 0x10, 0x00, 0x05, 0x00, 0x0b, + 0x10, 0x54, 0x00, 0x00, 0x12, 0xfe, 0x00, 0x03, 0x60, 0x54, 0x00, 0x01, + 0x0f, 0xe8, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x16, 0x95, 0x00, 0x15, + 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10, 0xc1, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x10, 0xb2, 0x11, 0x00, 0x1b, 0x80, 0x59, 0x00, 0x10, + 0xb2, 0xff, 0x00, 0x01, 0xb3, 0xe0, 0x00, 0x1c, 0x10, 0xd5, 0x00, 0x0b, + 0xf0, 0x2d, 0x00, 0x11, 0x3b, 0xe8, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1b, + 0x10, 0x71, 0x00, 0x00, 0x0a, 0xfe, 0x00, 0x0b, 0x60, 0x65, 0x00, 0x00, + 0x3c, 0x0b, 0x00, 0x03, 0x00, 0x6d, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x01, 0x0a, 0x88, 0x00, 0x10, 0x00, 0x03, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, 0x3c, 0x0a, 0x00, 0x1b, + 0x80, 0x6c, 0x00, 0x10, 0x3c, 0x0a, 0x00, 0x02, 0x0c, 0x00, 0x00, 0x10, + 0xff, 0x0c, 0x00, 0x13, 0x00, 0xd2, 0x00, 0x11, 0x3b, 0xe8, 0x00, 0x10, + 0x00, 0x12, 0x00, 0x1b, 0x10, 0x84, 0x00, 0x10, 0x08, 0xfe, 0x00, 0x0b, + 0x60, 0x78, 0x00, 0x10, 0x3c, 0x09, 0x00, 0x03, 0x00, 0x80, 0x00, 0x15, + 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, 0x08, 0x88, 0x00, 0x10, + 0x00, 0x03, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, + 0x3c, 0x0a, 0x00, 0x0b, 0x80, 0x7f, 0x00, 0x00, 0x3c, 0x08, 0x00, 0x02, + 0x0c, 0x00, 0x00, 0x10, 0xff, 0x0c, 0x00, 0x13, 0x00, 0xd2, 0x00, 0x11, + 0x3b, 0xe8, 0x00, 0x00, 0x00, 0x13, 0x00, 0x0b, 0x10, 0x8a, 0x00, 0x00, + 0x3c, 0xb0, 0x00, 0x14, 0x00, 0xe5, 0x00, 0x13, 0x00, 0xd2, 0x00, 0x11, + 0x3b, 0xe8, 0x00, 0x00, 0x00, 0x19, 0x00, 0x0b, 0x10, 0x9d, 0x00, 0x10, + 0x04, 0xfe, 0x00, 0x1b, 0x60, 0x91, 0x00, 0x10, 0x3c, 0x05, 0x00, 0x13, + 0x00, 0x99, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, + 0x04, 0x88, 0x00, 0x10, 0x00, 0x03, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x10, 0x3c, 0x0a, 0x00, 0x0b, 0x80, 0x98, 0x00, 0x00, + 0x3c, 0x04, 0x00, 0x02, 0x0c, 0x00, 0x00, 0x10, 0xff, 0x0c, 0x00, 0x13, + 0x00, 0xd2, 0x00, 0x11, 0x3b, 0xe8, 0x00, 0x10, 0x00, 0x1b, 0x00, 0x1b, + 0x10, 0xa6, 0x00, 0x10, 0xc0, 0x14, 0x00, 0x00, 0xc0, 0x13, 0x00, 0x00, + 0xc0, 0x10, 0x00, 0x15, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x13, + 0x00, 0xd2, 0x00, 0x11, 0x3b, 0xe8, 0x00, 0x00, 0x00, 0x15, 0x00, 0x1b, + 0x10, 0xb2, 0x00, 0x04, 0x01, 0x1c, 0x00, 0x14, 0x01, 0x2e, 0x00, 0x15, + 0x00, 0x39, 0x00, 0x00, 0x80, 0x00, 0x00, 0x17, 0x80, 0x00, 0x00, 0x04, + 0x01, 0x13, 0x00, 0x04, 0x01, 0x25, 0x00, 0x14, 0x00, 0xfe, 0x00, 0x13, + 0x00, 0x2d, 0x00, 0x11, 0x3b, 0xe8, 0x00, 0x00, 0x00, 0x16, 0x00, 0x0b, + 0x10, 0xc4, 0x00, 0x01, 0x0f, 0xe8, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, + 0x10, 0xbe, 0x00, 0x01, 0x0f, 0xe8, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, + 0x10, 0xbe, 0x00, 0x15, 0x00, 0x39, 0x00, 0x10, 0x10, 0x10, 0x00, 0x13, + 0x00, 0xd2, 0x00, 0x15, 0x00, 0x39, 0x00, 0x00, 0x50, 0x40, 0x00, 0x15, + 0x00, 0xb8, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x09, 0x25, 0x00, 0x13, + 0x00, 0xd2, 0x00, 0x11, 0x3b, 0xe8, 0x00, 0x10, 0x00, 0x17, 0x00, 0x1b, + 0x10, 0xc9, 0x00, 0x10, 0x3c, 0xc3, 0x00, 0x13, 0x00, 0xd2, 0x00, 0x11, + 0x3b, 0xe8, 0x00, 0x10, 0x00, 0x18, 0x00, 0x0b, 0x10, 0xce, 0x00, 0x00, + 0x3c, 0xc2, 0x00, 0x13, 0x00, 0xd2, 0x00, 0x05, 0x00, 0xce, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x3b, 0xcf, 0x00, 0x14, 0x08, 0xe7, 0x00, 0x15, + 0x00, 0x39, 0x00, 0x00, 0x80, 0x00, 0x00, 0x13, 0x00, 0x2d, 0x00, 0x01, + 0xb2, 0x88, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0xc1, 0x80, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x1b, + 0x80, 0xdb, 0x00, 0x02, 0xb2, 0x00, 0x00, 0x11, 0xff, 0xc8, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x10, 0xff, 0xb2, 0x00, 0x10, 0xc1, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x10, 0xb2, 0x0a, 0x00, 0x01, 0xb0, 0xd0, 0x00, 0x1b, + 0x80, 0xe4, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, + 0xb0, 0x88, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x10, 0xb1, 0x09, 0x00, 0x0b, 0x80, 0xec, 0x00, 0x01, + 0xb1, 0xe8, 0x00, 0x10, 0xff, 0xff, 0x00, 0x13, 0x10, 0xfd, 0x00, 0x00, + 0x11, 0xfe, 0x00, 0x1b, 0x60, 0xf4, 0x00, 0x00, 0xb0, 0x12, 0x00, 0x13, + 0x00, 0xfc, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, + 0x11, 0x88, 0x00, 0x10, 0x00, 0x03, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x00, 0xb0, 0x0a, 0x00, 0x0b, 0x80, 0xfb, 0x00, 0x00, + 0xb0, 0x11, 0x00, 0x17, 0x40, 0x00, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x11, 0xbc, 0x88, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xc4, 0x11, 0x00, 0x0b, + 0x81, 0x05, 0x00, 0x11, 0xbc, 0x88, 0x00, 0x10, 0x00, 0x18, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, 0xc6, 0x09, 0x00, 0x1b, + 0x81, 0x0b, 0x00, 0x11, 0xbc, 0x88, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xc7, 0x09, 0x00, 0x0b, + 0x81, 0x11, 0x00, 0x17, 0x40, 0x00, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x01, 0xbb, 0x88, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0x02, 0x69, 0x00, 0x1b, + 0x81, 0x1a, 0x00, 0x17, 0x40, 0x00, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x01, 0xbb, 0x88, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0x02, 0x6a, 0x00, 0x1b, + 0x81, 0x23, 0x00, 0x17, 0x40, 0x00, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x01, 0xbb, 0x88, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, 0x0f, 0x59, 0x00, 0x1b, + 0x81, 0x2c, 0x00, 0x17, 0x40, 0x00, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x01, 0xbb, 0x88, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, 0x0f, 0x5a, 0x00, 0x0b, + 0x81, 0x35, 0x00, 0x17, 0x40, 0x00, 0x00, 0x00, 0xd0, 0xff, 0x00, 0x12, + 0xff, 0x40, 0x00, 0x0b, 0x10, 0x31, 0x00, 0x15, 0x00, 0xd1, 0x00, 0x10, + 0x01, 0x01, 0x00, 0x03, 0x91, 0x3c, 0x00, 0x05, 0x00, 0x79, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x03, 0x91, 0x3f, 0x00, 0x15, 0x00, 0xd1, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x11, 0x02, 0xe8, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, + 0x11, 0x67, 0x00, 0x11, 0x02, 0xe8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, + 0x11, 0x7f, 0x00, 0x11, 0x02, 0xe8, 0x00, 0x00, 0x00, 0x04, 0x00, 0x03, + 0x11, 0x9d, 0x00, 0x11, 0x02, 0xe8, 0x00, 0x10, 0x00, 0x03, 0x00, 0x03, + 0x11, 0xce, 0x00, 0x05, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x0e, 0x00, 0x00, 0xc0, 0x0d, 0x00, 0x10, 0xc0, 0x03, 0x00, 0x15, + 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0xbd, 0x88, 0x00, 0x10, + 0x00, 0x09, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, + 0xc0, 0x0a, 0x00, 0x0b, 0x81, 0x5a, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x10, 0xc0, 0x0a, 0x00, 0x1b, 0x81, 0x5e, 0x00, 0x12, + 0x3a, 0x45, 0x00, 0x13, 0x11, 0x66, 0x00, 0x15, 0x00, 0x3a, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x15, 0x00, 0x3a, 0x00, 0x10, 0x10, 0x10, 0x00, 0x04, + 0x09, 0x11, 0x00, 0x03, 0x00, 0x4f, 0x00, 0x12, 0x78, 0x49, 0x00, 0x03, + 0x11, 0xdc, 0x00, 0x10, 0x0d, 0xfe, 0x00, 0x03, 0x61, 0x50, 0x00, 0x12, + 0x0c, 0x10, 0x00, 0x10, 0xff, 0x0c, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x11, 0x0d, 0x88, 0x00, 0x10, 0x00, 0x03, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb3, 0x09, 0x00, 0x0b, + 0x81, 0x74, 0x00, 0x10, 0xb3, 0xfe, 0x00, 0x13, 0x61, 0x7c, 0x00, 0x10, + 0xb3, 0x0b, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, 0xc0, 0x0a, 0x00, 0x1b, + 0x81, 0x7a, 0x00, 0x03, 0x01, 0xd1, 0x00, 0x00, 0xc0, 0x0b, 0x00, 0x10, + 0xc0, 0x0a, 0x00, 0x03, 0x01, 0xd1, 0x00, 0x00, 0x78, 0xb0, 0x00, 0x12, + 0xb0, 0x44, 0x00, 0x03, 0x11, 0xdc, 0x00, 0x02, 0xb0, 0x49, 0x00, 0x03, + 0x11, 0xdc, 0x00, 0x10, 0x71, 0xff, 0x00, 0x12, 0xff, 0x38, 0x00, 0x10, + 0xff, 0x71, 0x00, 0x10, 0x0d, 0xfe, 0x00, 0x03, 0x61, 0x4e, 0x00, 0x12, + 0x0c, 0x10, 0x00, 0x10, 0xff, 0x0c, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x11, 0x0d, 0x88, 0x00, 0x10, 0x00, 0x03, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb3, 0x09, 0x00, 0x1b, + 0x81, 0x92, 0x00, 0x10, 0xb3, 0xfe, 0x00, 0x03, 0x61, 0x9a, 0x00, 0x00, + 0xb3, 0x09, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, 0xc0, 0x0a, 0x00, 0x1b, + 0x81, 0x98, 0x00, 0x03, 0x01, 0xd1, 0x00, 0x10, 0xc0, 0x09, 0x00, 0x00, + 0xc0, 0x08, 0x00, 0x03, 0x01, 0xd1, 0x00, 0x00, 0x78, 0xb0, 0x00, 0x12, + 0xb0, 0x44, 0x00, 0x03, 0x11, 0xdc, 0x00, 0x02, 0xb0, 0x49, 0x00, 0x03, + 0x11, 0xdc, 0x00, 0x10, 0x71, 0xff, 0x00, 0x12, 0xff, 0x38, 0x00, 0x10, + 0xff, 0x71, 0x00, 0x10, 0x0d, 0xfe, 0x00, 0x03, 0x61, 0x4e, 0x00, 0x12, + 0x0c, 0x10, 0x00, 0x10, 0xff, 0x0c, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x11, 0x0d, 0x88, 0x00, 0x10, 0x00, 0x03, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb3, 0x09, 0x00, 0x1b, + 0x81, 0xb0, 0x00, 0x10, 0xb3, 0xfe, 0x00, 0x03, 0x61, 0xb8, 0x00, 0x00, + 0xb3, 0x05, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, 0xc0, 0x0a, 0x00, 0x1b, + 0x81, 0xb6, 0x00, 0x13, 0x01, 0xba, 0x00, 0x10, 0xc0, 0x05, 0x00, 0x00, + 0xc0, 0x04, 0x00, 0x02, 0x03, 0x3f, 0x00, 0x02, 0xff, 0x27, 0x00, 0x00, + 0x0d, 0xb8, 0x00, 0x14, 0x03, 0xc2, 0x00, 0x00, 0x0d, 0xb8, 0x00, 0x14, + 0x09, 0x25, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, + 0xbc, 0x88, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x00, 0xb3, 0x09, 0x00, 0x1b, 0x81, 0xc7, 0x00, 0x11, + 0xb3, 0xe8, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0b, 0x11, 0x4e, 0x00, 0x05, + 0x00, 0x02, 0x00, 0x10, 0x00, 0x05, 0x00, 0x03, 0x01, 0x50, 0x00, 0x12, + 0x78, 0x49, 0x00, 0x03, 0x11, 0xdc, 0x00, 0x03, 0x01, 0x50, 0x00, 0x00, + 0x0d, 0xb8, 0x00, 0x12, 0x03, 0x45, 0x00, 0x0b, 0x11, 0xd7, 0x00, 0x02, + 0x03, 0x3f, 0x00, 0x14, 0x03, 0xc2, 0x00, 0x03, 0x01, 0x4e, 0x00, 0x02, + 0x03, 0x3f, 0x00, 0x02, 0xff, 0x27, 0x00, 0x14, 0x03, 0xc2, 0x00, 0x14, + 0x09, 0x25, 0x00, 0x03, 0x01, 0x4e, 0x00, 0x15, 0x00, 0xb8, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x15, 0x00, 0x3a, 0x00, 0x10, 0x01, 0x01, 0x00, 0x14, + 0x09, 0x25, 0x00, 0x03, 0x01, 0x5f, 0x00, 0x01, 0x2b, 0xd8, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xba, 0x00, 0x03, 0xb1, 0xe5, 0x00, 0x05, + 0x00, 0x2a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0xba, 0xc8, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x0b, 0x12, 0xd2, 0x00, 0x11, 0x15, 0xe8, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x13, 0x12, 0x48, 0x00, 0x11, 0x15, 0xe8, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x03, 0x11, 0xf4, 0x00, 0x05, 0x00, 0x15, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x03, 0x02, 0x2b, 0x00, 0x05, 0x00, 0x15, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x02, 0xba, 0x43, 0x00, 0x03, 0x12, 0x2c, 0x00, 0x03, + 0xb1, 0xf8, 0x00, 0x05, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, + 0xba, 0x42, 0x00, 0x03, 0x12, 0x32, 0x00, 0x12, 0x10, 0x4b, 0x00, 0x0b, + 0x12, 0x2b, 0x00, 0x00, 0x1a, 0x30, 0x00, 0x05, 0x00, 0x31, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0x1b, 0x2a, 0x00, 0x1b, + 0x82, 0x04, 0x00, 0x11, 0x20, 0xd8, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xb0, 0x00, 0x01, 0x21, 0xd8, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, + 0xff, 0xb1, 0x00, 0x01, 0x22, 0xd8, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, + 0xff, 0xb2, 0x00, 0x11, 0x23, 0xd8, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xb3, 0x00, 0x01, 0x24, 0xd8, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, + 0xff, 0xb4, 0x00, 0x11, 0x25, 0xd8, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xb5, 0x00, 0x01, 0x28, 0xd8, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, + 0xff, 0xb8, 0x00, 0x11, 0x29, 0xd8, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xb9, 0x00, 0x00, 0x1a, 0x30, 0x00, 0x05, 0x00, 0x31, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, 0xb0, 0x32, 0x00, 0x0b, + 0x82, 0x22, 0x00, 0x00, 0x1a, 0x30, 0x00, 0x05, 0x00, 0x31, 0x00, 0x10, + 0x00, 0x0f, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, 0xb8, 0x12, 0x00, 0x0b, + 0x82, 0x28, 0x00, 0x05, 0x00, 0x15, 0x00, 0x10, 0x00, 0x00, 0x00, 0x13, + 0x00, 0x35, 0x00, 0x00, 0x1e, 0xfe, 0x00, 0x13, 0x62, 0x40, 0x00, 0x14, + 0x02, 0x77, 0x00, 0x00, 0x1e, 0xfe, 0x00, 0x0c, 0x62, 0x77, 0x00, 0x03, + 0x02, 0x2b, 0x00, 0x00, 0x1a, 0x30, 0x00, 0x05, 0x00, 0x31, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x1b, + 0x82, 0x37, 0x00, 0x02, 0xb0, 0x2f, 0x00, 0x00, 0xff, 0xb0, 0x00, 0x05, + 0x00, 0x31, 0x00, 0x00, 0x00, 0x20, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, + 0xb0, 0x0a, 0x00, 0x1b, 0x82, 0x3e, 0x00, 0x03, 0x01, 0xff, 0x00, 0x15, + 0x00, 0xb8, 0x00, 0x10, 0x00, 0x05, 0x00, 0x14, 0x09, 0x25, 0x00, 0x00, + 0x13, 0xb8, 0x00, 0x15, 0x00, 0x3a, 0x00, 0x10, 0x04, 0x04, 0x00, 0x14, + 0x09, 0x25, 0x00, 0x03, 0x02, 0x2b, 0x00, 0x05, 0x00, 0x15, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x12, 0xba, 0x42, 0x00, 0x13, 0x12, 0x56, 0x00, 0x03, + 0xb2, 0x4c, 0x00, 0x01, 0x2b, 0xd8, 0x00, 0x10, 0x00, 0x00, 0x00, 0x12, + 0xff, 0x4f, 0x00, 0x0b, 0x11, 0xe2, 0x00, 0x02, 0xba, 0x43, 0x00, 0x1b, + 0x12, 0x32, 0x00, 0x00, 0x1e, 0xfe, 0x00, 0x0c, 0x62, 0x77, 0x00, 0x03, + 0x02, 0x2b, 0x00, 0x01, 0x28, 0xd8, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, + 0xff, 0xb8, 0x00, 0x11, 0x29, 0xd8, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xb9, 0x00, 0x14, 0x02, 0xe8, 0x00, 0x02, 0x3a, 0x42, 0x00, 0x0b, + 0x12, 0x2b, 0x00, 0x00, 0x1c, 0x30, 0x00, 0x15, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x02, 0x1f, 0x43, 0x00, 0x1b, 0x12, 0x67, 0x00, 0x01, + 0xff, 0x88, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x02, 0x69, 0x00, 0x01, + 0xff, 0x88, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x00, 0xb0, 0x11, 0x00, 0x0b, 0x82, 0x6c, 0x00, 0x00, + 0xb0, 0xff, 0x00, 0x11, 0x16, 0xa0, 0x00, 0x00, 0xff, 0x16, 0x00, 0x1b, + 0x22, 0x73, 0x00, 0x02, 0xb1, 0x00, 0x00, 0x03, 0x02, 0x74, 0x00, 0x10, + 0xb1, 0xff, 0x00, 0x01, 0x17, 0xa0, 0x00, 0x10, 0xff, 0x17, 0x00, 0x13, + 0x02, 0x32, 0x00, 0x00, 0x16, 0xff, 0x00, 0x01, 0x18, 0xa0, 0x00, 0x10, + 0xff, 0x00, 0x00, 0x0b, 0x22, 0x7e, 0x00, 0x02, 0x17, 0x00, 0x00, 0x13, + 0x12, 0xd1, 0x00, 0x13, 0x02, 0x7f, 0x00, 0x10, 0x17, 0xff, 0x00, 0x11, + 0x19, 0xa0, 0x00, 0x13, 0x22, 0xd1, 0x00, 0x11, 0x00, 0xd0, 0x00, 0x13, + 0x12, 0xd1, 0x00, 0x00, 0x1c, 0x30, 0x00, 0x00, 0x1b, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x00, 0xb1, 0x31, 0x00, 0x0b, 0x82, 0x87, 0x00, 0x13, + 0xb2, 0x88, 0x00, 0x00, 0xb1, 0x20, 0x00, 0x10, 0xb2, 0x21, 0x00, 0x02, + 0x1f, 0x43, 0x00, 0x1b, 0x12, 0x94, 0x00, 0x10, 0xc0, 0x22, 0x00, 0x00, + 0xc0, 0x23, 0x00, 0x00, 0xb3, 0x24, 0x00, 0x00, 0xb4, 0x25, 0x00, 0x10, + 0xb3, 0xb5, 0x00, 0x00, 0xb4, 0xb6, 0x00, 0x13, 0x02, 0x98, 0x00, 0x00, + 0xb3, 0x22, 0x00, 0x00, 0xb4, 0x23, 0x00, 0x00, 0xb5, 0x24, 0x00, 0x10, + 0xb6, 0x25, 0x00, 0x03, 0xb2, 0x98, 0x00, 0x05, 0x00, 0x2a, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x12, 0x15, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, + 0x16, 0xff, 0x00, 0x01, 0xb5, 0x80, 0x00, 0x00, 0xff, 0x16, 0x00, 0x0b, + 0x22, 0xa3, 0x00, 0x02, 0x17, 0x00, 0x00, 0x13, 0x02, 0xa4, 0x00, 0x10, + 0x17, 0xff, 0x00, 0x01, 0xb6, 0x80, 0x00, 0x10, 0xff, 0x17, 0x00, 0x12, + 0x1e, 0x10, 0x00, 0x10, 0xff, 0x1e, 0x00, 0x03, 0x62, 0xd1, 0x00, 0x02, + 0x1d, 0x00, 0x00, 0x10, 0xff, 0x1d, 0x00, 0x10, 0xc0, 0x30, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x0b, + 0x82, 0xaf, 0x00, 0x10, 0xb0, 0xfe, 0x00, 0x0b, 0x62, 0xd0, 0x00, 0x00, + 0x1c, 0x30, 0x00, 0x05, 0x00, 0x31, 0x00, 0x00, 0x00, 0x01, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x0b, 0x82, 0xb7, 0x00, 0x10, + 0xb0, 0xfe, 0x00, 0x1b, 0x62, 0xbd, 0x00, 0x05, 0x00, 0xce, 0x00, 0x10, + 0x00, 0x05, 0x00, 0x03, 0x08, 0xe7, 0x00, 0x10, 0xb0, 0x1c, 0x00, 0x00, + 0x1c, 0x30, 0x00, 0x05, 0x00, 0x31, 0x00, 0x00, 0x00, 0x19, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x0b, 0x82, 0xc3, 0x00, 0x01, + 0xb0, 0xc8, 0x00, 0x10, 0x00, 0xff, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x10, + 0xc0, 0x30, 0x00, 0x11, 0xbe, 0x80, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x0b, 0x82, 0xcc, 0x00, 0x00, + 0xb0, 0x1d, 0x00, 0x10, 0x1d, 0xff, 0x00, 0x13, 0x02, 0xab, 0x00, 0x00, + 0xb0, 0x1b, 0x00, 0x17, 0x40, 0x00, 0x00, 0x02, 0x3a, 0x41, 0x00, 0x03, + 0x12, 0xda, 0x00, 0x13, 0xb2, 0xd4, 0x00, 0x05, 0x00, 0x2a, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x05, 0x00, 0x15, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, + 0x02, 0x2b, 0x00, 0x00, 0x1a, 0x30, 0x00, 0x05, 0x00, 0x31, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0x1b, 0x2a, 0x00, 0x1b, + 0x82, 0xdf, 0x00, 0x15, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x04, 0x00, 0x14, + 0x09, 0x25, 0x00, 0x00, 0x13, 0xb8, 0x00, 0x15, 0x00, 0x3a, 0x00, 0x10, + 0x04, 0x04, 0x00, 0x14, 0x09, 0x25, 0x00, 0x13, 0x00, 0x39, 0x00, 0x02, + 0x1e, 0x00, 0x00, 0x10, 0xff, 0x1e, 0x00, 0x12, 0x1d, 0x10, 0x00, 0x10, + 0xff, 0x1d, 0x00, 0x10, 0xc0, 0x30, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x0b, 0x82, 0xf0, 0x00, 0x10, + 0xb0, 0xfe, 0x00, 0x1b, 0x63, 0x15, 0x00, 0x00, 0x1c, 0xff, 0x00, 0x01, + 0x1a, 0xe0, 0x00, 0x13, 0x12, 0xff, 0x00, 0x00, 0x1c, 0x30, 0x00, 0x05, + 0x00, 0x31, 0x00, 0x10, 0x00, 0x00, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, + 0xb0, 0x09, 0x00, 0x1b, 0x82, 0xfb, 0x00, 0x10, 0xb0, 0xfe, 0x00, 0x1b, + 0x62, 0xff, 0x00, 0x00, 0x1a, 0xff, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, + 0x1c, 0x30, 0x00, 0x05, 0x00, 0x31, 0x00, 0x00, 0x00, 0x19, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x1b, 0x83, 0x05, 0x00, 0x01, + 0xb0, 0xc8, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x01, + 0xbf, 0x80, 0x00, 0x10, 0xff, 0x1d, 0x00, 0x10, 0xc0, 0x30, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x1b, + 0x83, 0x0f, 0x00, 0x10, 0xb0, 0xfe, 0x00, 0x1b, 0x63, 0x15, 0x00, 0x05, + 0x00, 0xce, 0x00, 0x10, 0x00, 0x06, 0x00, 0x03, 0x08, 0xe7, 0x00, 0x00, + 0xb0, 0x1b, 0x00, 0x17, 0x40, 0x00, 0x00, 0x10, 0x79, 0xb0, 0x00, 0x00, + 0xd0, 0xff, 0x00, 0x12, 0xff, 0x40, 0x00, 0x1b, 0x10, 0x39, 0x00, 0x15, + 0x00, 0xd1, 0x00, 0x10, 0x01, 0x01, 0x00, 0x13, 0x93, 0x1d, 0x00, 0x05, + 0x00, 0x79, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x93, 0x20, 0x00, 0x15, + 0x00, 0xd1, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x13, 0xfe, 0x00, 0x13, + 0x63, 0x71, 0x00, 0x12, 0xb0, 0x4e, 0x00, 0x1b, 0x13, 0x9a, 0x00, 0x00, + 0x78, 0xb0, 0x00, 0x02, 0xb0, 0x45, 0x00, 0x03, 0x13, 0xa0, 0x00, 0x12, + 0x78, 0x4a, 0x00, 0x03, 0x13, 0xa0, 0x00, 0x00, 0x75, 0xff, 0x00, 0x11, + 0xff, 0xc8, 0x00, 0x10, 0x18, 0x00, 0x00, 0x1b, 0x13, 0xa0, 0x00, 0x01, + 0x0f, 0xe8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1b, 0x13, 0x3c, 0x00, 0x15, + 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, 0x13, 0x88, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, + 0x8f, 0x0a, 0x00, 0x1b, 0x83, 0x3a, 0x00, 0x13, 0x03, 0xa6, 0x00, 0x01, + 0x0f, 0xe8, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1b, 0x13, 0x47, 0x00, 0x15, + 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0x00, 0x31, 0x00, 0x00, + 0x00, 0x1a, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, 0xc0, 0x0a, 0x00, 0x0b, + 0x83, 0x45, 0x00, 0x13, 0x03, 0xa6, 0x00, 0x01, 0x0f, 0xe8, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x03, 0x13, 0x4e, 0x00, 0x05, 0x00, 0xce, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x10, 0x0f, 0xcf, 0x00, 0x03, 0x08, 0xe1, 0x00, 0x02, + 0xd1, 0x42, 0x00, 0x13, 0x13, 0x67, 0x00, 0x15, 0x00, 0xd1, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x11, 0x13, 0xe8, 0x00, 0x01, 0x1b, 0x55, 0x00, 0x0b, + 0x13, 0x67, 0x00, 0x05, 0x00, 0x31, 0x00, 0x11, 0x1b, 0x6d, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x10, 0xb4, 0x09, 0x00, 0x1b, 0x83, 0x59, 0x00, 0x02, + 0xb4, 0x00, 0x00, 0x10, 0xff, 0xb4, 0x00, 0x05, 0x00, 0x31, 0x00, 0x11, + 0x1b, 0x6d, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, 0xb4, 0x0a, 0x00, 0x1b, + 0x83, 0x60, 0x00, 0x12, 0xd0, 0x42, 0x00, 0x03, 0x13, 0x71, 0x00, 0x15, + 0x00, 0xb8, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x14, 0x09, 0x25, 0x00, 0x03, + 0x00, 0x54, 0x00, 0x00, 0x13, 0xb8, 0x00, 0x02, 0x10, 0x45, 0x00, 0x03, + 0x13, 0x6f, 0x00, 0x12, 0x10, 0x3f, 0x00, 0x02, 0xff, 0x27, 0x00, 0x14, + 0x03, 0xc2, 0x00, 0x14, 0x09, 0x25, 0x00, 0x13, 0x03, 0x71, 0x00, 0x12, + 0x10, 0x3f, 0x00, 0x14, 0x03, 0xc2, 0x00, 0x15, 0x00, 0x0f, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x02, 0x39, 0x44, 0x00, 0x13, 0x13, 0x7a, 0x00, 0x15, + 0x00, 0x39, 0x00, 0x00, 0x50, 0x40, 0x00, 0x15, 0x00, 0xb8, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x14, 0x09, 0x25, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x01, 0xbd, 0x88, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, 0xc0, 0x0a, 0x00, 0x1b, + 0x83, 0x81, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, + 0xc0, 0x0a, 0x00, 0x0b, 0x83, 0x85, 0x00, 0x10, 0xc0, 0x14, 0x00, 0x00, + 0xc0, 0x13, 0x00, 0x00, 0xc0, 0x10, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x03, + 0x63, 0x92, 0x00, 0x11, 0xff, 0xa8, 0x00, 0x10, 0x00, 0x05, 0x00, 0x0b, + 0x23, 0x92, 0x00, 0x15, 0x00, 0xd1, 0x00, 0x10, 0x04, 0x04, 0x00, 0x15, + 0x00, 0x3a, 0x00, 0x00, 0x80, 0x00, 0x00, 0x02, 0x3a, 0x47, 0x00, 0x03, + 0x13, 0x99, 0x00, 0x15, 0x00, 0x3a, 0x00, 0x00, 0x80, 0x00, 0x00, 0x15, + 0x00, 0x3a, 0x00, 0x10, 0x40, 0x40, 0x00, 0x04, 0x08, 0xec, 0x00, 0x13, + 0x00, 0x39, 0x00, 0x15, 0x00, 0xb8, 0x00, 0x10, 0x00, 0x03, 0x00, 0x15, + 0x00, 0x3a, 0x00, 0x10, 0x02, 0x02, 0x00, 0x14, 0x09, 0x25, 0x00, 0x03, + 0x03, 0x89, 0x00, 0x15, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x02, 0x00, 0x15, + 0x00, 0x3a, 0x00, 0x10, 0x02, 0x02, 0x00, 0x14, 0x09, 0x25, 0x00, 0x03, + 0x03, 0x89, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, + 0x13, 0x88, 0x00, 0x10, 0x00, 0x03, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x0b, 0x83, 0xad, 0x00, 0x11, + 0x13, 0x88, 0x00, 0x10, 0x00, 0x03, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x10, 0xc0, 0x0a, 0x00, 0x0b, 0x83, 0xb3, 0x00, 0x10, + 0xb0, 0xfe, 0x00, 0x13, 0x63, 0xb8, 0x00, 0x00, 0xb0, 0x12, 0x00, 0x03, + 0x03, 0xba, 0x00, 0x10, 0xc0, 0x12, 0x00, 0x10, 0xc0, 0x11, 0x00, 0x12, + 0x10, 0x4b, 0x00, 0x03, 0x13, 0x4e, 0x00, 0x02, 0x10, 0x3b, 0x00, 0x10, + 0xff, 0x03, 0x00, 0x05, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x0d, 0x00, 0x13, 0x03, 0x4e, 0x00, 0x00, 0xff, 0xb0, 0x00, 0x10, + 0xc3, 0xb1, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, + 0xb8, 0x88, 0x00, 0x10, 0x00, 0x11, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x00, 0xb0, 0x12, 0x00, 0x0b, 0x83, 0xcb, 0x00, 0x17, + 0x40, 0x00, 0x00, 0x02, 0xd1, 0x42, 0x00, 0x1b, 0x14, 0x85, 0x00, 0x12, + 0x3a, 0x43, 0x00, 0x03, 0x13, 0xde, 0x00, 0x15, 0x00, 0x3a, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x10, 0x0d, 0xb0, 0x00, 0x13, 0x63, 0xde, 0x00, 0x00, + 0x0b, 0xff, 0x00, 0x01, 0xb0, 0xe0, 0x00, 0x03, 0x14, 0x07, 0x00, 0x10, + 0x09, 0xff, 0x00, 0x01, 0xb0, 0xe0, 0x00, 0x03, 0x13, 0xeb, 0x00, 0x10, + 0x05, 0xff, 0x00, 0x01, 0xb0, 0xe0, 0x00, 0x03, 0x13, 0xe2, 0x00, 0x00, + 0xc0, 0x0e, 0x00, 0x00, 0x05, 0xfe, 0x00, 0x13, 0x63, 0xe8, 0x00, 0x00, + 0x05, 0x0d, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x14, + 0x04, 0x6c, 0x00, 0x02, 0x3a, 0x47, 0x00, 0x1b, 0x14, 0x6b, 0x00, 0x13, + 0x04, 0x02, 0x00, 0x00, 0x09, 0xfe, 0x00, 0x13, 0x64, 0x04, 0x00, 0x00, + 0x09, 0x0d, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x14, + 0x04, 0x9a, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, + 0x0d, 0x88, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x00, 0xba, 0x09, 0x00, 0x1b, 0x83, 0xf5, 0x00, 0x11, + 0x03, 0xc8, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x00, 0xff, 0xb6, 0x00, 0x11, + 0xb6, 0xe8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x15, 0x3f, 0x00, 0x11, + 0xb6, 0xe8, 0x00, 0x00, 0x00, 0x02, 0x00, 0x13, 0x15, 0x61, 0x00, 0x11, + 0xb6, 0xe8, 0x00, 0x10, 0x00, 0x03, 0x00, 0x03, 0x16, 0x53, 0x00, 0x04, + 0x08, 0xec, 0x00, 0x13, 0x04, 0x6b, 0x00, 0x10, 0x0b, 0xfe, 0x00, 0x13, + 0x64, 0x6b, 0x00, 0x10, 0x0b, 0x0d, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x14, 0x04, 0x9a, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x11, 0x0d, 0x88, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xba, 0x09, 0x00, 0x0b, + 0x84, 0x11, 0x00, 0x00, 0xb9, 0x30, 0x00, 0x05, 0x00, 0x31, 0x00, 0x10, + 0x00, 0x21, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x0b, + 0x84, 0x17, 0x00, 0x01, 0xb0, 0xa8, 0x00, 0x00, 0x19, 0x9a, 0x00, 0x13, + 0x24, 0x1d, 0x00, 0x05, 0x00, 0xb0, 0x00, 0x00, 0x19, 0x99, 0x00, 0x12, + 0xb0, 0x50, 0x00, 0x00, 0xff, 0xb0, 0x00, 0x02, 0xff, 0x50, 0x00, 0x02, + 0xff, 0x50, 0x00, 0x01, 0xb0, 0x80, 0x00, 0x00, 0xff, 0xb0, 0x00, 0x15, + 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, 0x0d, 0x88, 0x00, 0x10, + 0x00, 0x06, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, + 0xb0, 0x0a, 0x00, 0x1b, 0x84, 0x2a, 0x00, 0x00, 0xb9, 0x30, 0x00, 0x05, + 0x00, 0x31, 0x00, 0x00, 0x00, 0x19, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, + 0xb0, 0x09, 0x00, 0x0b, 0x84, 0x30, 0x00, 0x01, 0xb0, 0xc8, 0x00, 0x10, + 0x00, 0xff, 0x00, 0x01, 0xff, 0xe8, 0x00, 0x10, 0x00, 0x48, 0x00, 0x0b, + 0x14, 0xa9, 0x00, 0x05, 0x00, 0x02, 0x00, 0x10, 0x00, 0x06, 0x00, 0x12, + 0x0c, 0x10, 0x00, 0x10, 0xff, 0x0c, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x11, 0x0d, 0x88, 0x00, 0x10, 0x00, 0x03, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, 0xb1, 0x09, 0x00, 0x0b, + 0x84, 0x41, 0x00, 0x00, 0xb1, 0x0b, 0x00, 0x0b, 0x64, 0x45, 0x00, 0x10, + 0xb1, 0x0a, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, 0xc0, 0x0a, 0x00, 0x0b, + 0x84, 0x47, 0x00, 0x02, 0x03, 0x2b, 0x00, 0x10, 0xff, 0x03, 0x00, 0x11, + 0x0d, 0x88, 0x00, 0x10, 0x00, 0x11, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x10, 0x03, 0x0a, 0x00, 0x1b, 0x84, 0x4f, 0x00, 0x00, + 0x11, 0xfe, 0x00, 0x0b, 0x64, 0x54, 0x00, 0x00, 0x0d, 0x12, 0x00, 0x13, + 0x04, 0x5d, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, + 0x11, 0x88, 0x00, 0x10, 0x00, 0x03, 0x00, 0x00, 0xff, 0x31, 0x00, 0x10, + 0x0d, 0xb0, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb0, 0x0a, 0x00, 0x0b, + 0x84, 0x5c, 0x00, 0x00, 0x0d, 0x11, 0x00, 0x13, 0x04, 0x6b, 0x00, 0x02, + 0xd1, 0x42, 0x00, 0x03, 0x14, 0x62, 0x00, 0x13, 0x04, 0x85, 0x00, 0x00, + 0x05, 0xfe, 0x00, 0x13, 0x64, 0x6b, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x05, 0x0d, 0x00, 0x14, 0x04, 0x6c, 0x00, 0x02, + 0x3a, 0x47, 0x00, 0x1b, 0x14, 0x6b, 0x00, 0x04, 0x08, 0xec, 0x00, 0x13, + 0x00, 0x47, 0x00, 0x01, 0xc7, 0xc8, 0x00, 0x10, 0x00, 0x28, 0x00, 0x0b, + 0x14, 0x84, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, + 0x0d, 0x88, 0x00, 0x10, 0x00, 0x0a, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x1b, 0x84, 0x76, 0x00, 0x02, + 0xb0, 0x4f, 0x00, 0x13, 0x14, 0x84, 0x00, 0x01, 0x0f, 0xe8, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x13, 0x14, 0x82, 0x00, 0x01, 0x0f, 0xe8, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x13, 0x14, 0x82, 0x00, 0x15, 0x00, 0x3a, 0x00, 0x10, + 0x80, 0x80, 0x00, 0x03, 0x04, 0x84, 0x00, 0x15, 0x00, 0x3a, 0x00, 0x10, + 0x40, 0x40, 0x00, 0x17, 0x40, 0x00, 0x00, 0x00, 0x12, 0xfe, 0x00, 0x1b, + 0x60, 0x4f, 0x00, 0x15, 0x00, 0x12, 0x00, 0x01, 0x1b, 0x55, 0x00, 0x15, + 0x00, 0x11, 0x00, 0x01, 0x1b, 0x55, 0x00, 0x01, 0x12, 0x88, 0x00, 0x10, + 0x00, 0x03, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, + 0xc0, 0x0a, 0x00, 0x0b, 0x84, 0x90, 0x00, 0x05, 0x00, 0xb0, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x01, 0x12, 0x88, 0x00, 0x10, 0x00, 0x11, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb0, 0x0a, 0x00, 0x1b, + 0x84, 0x98, 0x00, 0x03, 0x00, 0x4f, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x11, 0x0d, 0x88, 0x00, 0x10, 0x00, 0x11, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, 0x03, 0x09, 0x00, 0x1b, + 0x84, 0xa1, 0x00, 0x11, 0x0d, 0x88, 0x00, 0x10, 0x00, 0x05, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb9, 0x09, 0x00, 0x1b, + 0x84, 0xa7, 0x00, 0x17, 0x40, 0x00, 0x00, 0x05, 0x00, 0xb6, 0x00, 0x10, + 0x06, 0x00, 0x00, 0x14, 0x06, 0x83, 0x00, 0x04, 0x05, 0x1b, 0x00, 0x00, + 0xb0, 0x5a, 0x00, 0x00, 0xb1, 0x5b, 0x00, 0x05, 0x00, 0x54, 0x00, 0x10, + 0x08, 0x29, 0x00, 0x10, 0x0d, 0x58, 0x00, 0x15, 0x00, 0x59, 0x00, 0x10, + 0xff, 0xff, 0x00, 0x00, 0xb9, 0x30, 0x00, 0x05, 0x00, 0x31, 0x00, 0x10, + 0x00, 0x1e, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x1b, + 0x84, 0xb9, 0x00, 0x00, 0xb0, 0x5c, 0x00, 0x05, 0x00, 0x31, 0x00, 0x00, + 0x00, 0x1f, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x1b, + 0x84, 0xbf, 0x00, 0x01, 0xb0, 0xc8, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x0b, + 0x14, 0xc6, 0x00, 0x15, 0x00, 0xff, 0x00, 0x10, 0x00, 0x05, 0x00, 0x13, + 0x04, 0xce, 0x00, 0x02, 0xb0, 0x40, 0x00, 0x03, 0x14, 0xcb, 0x00, 0x15, + 0x00, 0xff, 0x00, 0x00, 0x00, 0x04, 0x00, 0x13, 0x04, 0xce, 0x00, 0x01, + 0xb0, 0xc8, 0x00, 0x10, 0x00, 0x06, 0x00, 0x02, 0xff, 0x60, 0x00, 0x10, + 0xff, 0xb2, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, + 0x0d, 0x88, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x10, 0xb1, 0x09, 0x00, 0x1b, 0x84, 0xd6, 0x00, 0x12, + 0xb1, 0x70, 0x00, 0x11, 0xff, 0xc8, 0x00, 0x10, 0xff, 0x00, 0x00, 0x11, + 0xb2, 0xd0, 0x00, 0x10, 0xff, 0x60, 0x00, 0x02, 0xb0, 0x45, 0x00, 0x13, + 0x14, 0xe1, 0x00, 0x15, 0x00, 0xb2, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, + 0x04, 0xeb, 0x00, 0x02, 0xb0, 0x46, 0x00, 0x03, 0x14, 0xe6, 0x00, 0x15, + 0x00, 0xb2, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x04, 0xeb, 0x00, 0x15, + 0x00, 0xb2, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xb0, 0x00, 0x10, + 0xc0, 0xb1, 0x00, 0x13, 0x04, 0xf1, 0x00, 0x00, 0xb9, 0x30, 0x00, 0x05, + 0x00, 0x31, 0x00, 0x10, 0x00, 0x2b, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, + 0xb0, 0x11, 0x00, 0x0b, 0x84, 0xf0, 0x00, 0x10, 0xb1, 0x6a, 0x00, 0x10, + 0xb0, 0x6b, 0x00, 0x00, 0xb2, 0x61, 0x00, 0x15, 0x00, 0x44, 0x00, 0x10, + 0x00, 0x18, 0x00, 0x00, 0xb9, 0x30, 0x00, 0x05, 0x00, 0x31, 0x00, 0x00, + 0x00, 0x23, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0x62, 0x41, 0x00, 0x1b, + 0x84, 0xfb, 0x00, 0x03, 0x94, 0xfc, 0x00, 0x15, 0x00, 0xa0, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x12, 0xd0, 0x41, 0x00, 0x0b, 0x14, 0xff, 0x00, 0x15, + 0x00, 0xd1, 0x00, 0x10, 0x02, 0x02, 0x00, 0x13, 0x95, 0x03, 0x00, 0x00, + 0x75, 0xff, 0x00, 0x11, 0xff, 0xc8, 0x00, 0x00, 0x18, 0x04, 0x00, 0x01, + 0xff, 0xd8, 0x00, 0x10, 0x00, 0x09, 0x00, 0x13, 0x95, 0x09, 0x00, 0x00, + 0xff, 0x75, 0x00, 0x03, 0x95, 0x0b, 0x00, 0x15, 0x00, 0xd1, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, + 0xbd, 0x88, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, + 0x00, 0xb1, 0x00, 0x10, 0x07, 0xd0, 0x00, 0x05, 0x00, 0xb0, 0x00, 0x10, + 0x00, 0x09, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb0, 0x12, 0x00, 0x0b, + 0x85, 0x19, 0x00, 0x13, 0x04, 0x6b, 0x00, 0x00, 0xba, 0x30, 0x00, 0x05, + 0x00, 0x31, 0x00, 0x10, 0x00, 0x35, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, + 0xb0, 0x09, 0x00, 0x0b, 0x85, 0x20, 0x00, 0x02, 0xb0, 0x40, 0x00, 0x03, + 0x15, 0x3c, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, + 0x00, 0x31, 0x00, 0x01, 0x1b, 0x71, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, + 0xb0, 0x11, 0x00, 0x0b, 0x85, 0x29, 0x00, 0x02, 0xb1, 0x00, 0x00, 0x10, + 0xff, 0xb1, 0x00, 0x1b, 0x25, 0x30, 0x00, 0x12, 0xb0, 0x00, 0x00, 0x00, + 0xff, 0xb0, 0x00, 0x13, 0x25, 0x2a, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, + 0xb0, 0x12, 0x00, 0x0b, 0x85, 0x32, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x11, 0x0d, 0x88, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb0, 0x12, 0x00, 0x1b, + 0x85, 0x3a, 0x00, 0x03, 0x05, 0x3e, 0x00, 0x10, 0xc0, 0xb1, 0x00, 0x00, + 0xc0, 0xb0, 0x00, 0x17, 0x40, 0x00, 0x00, 0x05, 0x00, 0xb6, 0x00, 0x10, + 0x05, 0x00, 0x00, 0x14, 0x06, 0x83, 0x00, 0x05, 0x00, 0x54, 0x00, 0x10, + 0x08, 0x89, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, + 0x0d, 0x88, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x1b, 0x85, 0x4b, 0x00, 0x10, + 0xb0, 0x58, 0x00, 0x00, 0x0d, 0x59, 0x00, 0x00, 0xb9, 0x30, 0x00, 0x05, + 0x00, 0x31, 0x00, 0x00, 0x00, 0x23, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, + 0xb0, 0x11, 0x00, 0x1b, 0x85, 0x53, 0x00, 0x10, 0xb1, 0x5c, 0x00, 0x10, + 0xb0, 0x5d, 0x00, 0x05, 0x00, 0x31, 0x00, 0x10, 0x00, 0x2b, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x00, 0xb0, 0x11, 0x00, 0x1b, 0x85, 0x5a, 0x00, 0x00, + 0xb1, 0x5e, 0x00, 0x00, 0xb0, 0x5f, 0x00, 0x03, 0x95, 0x5d, 0x00, 0x15, + 0x00, 0xa0, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x03, 0x06, 0x68, 0x00, 0x05, + 0x00, 0xb6, 0x00, 0x00, 0x07, 0x00, 0x00, 0x14, 0x06, 0x83, 0x00, 0x15, + 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, 0x0d, 0x88, 0x00, 0x10, + 0x00, 0x09, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, + 0xb7, 0x09, 0x00, 0x0b, 0x85, 0x6b, 0x00, 0x12, 0xb7, 0x49, 0x00, 0x03, + 0x15, 0x71, 0x00, 0x05, 0x00, 0x54, 0x00, 0x10, 0x08, 0x89, 0x00, 0x03, + 0x05, 0x73, 0x00, 0x05, 0x00, 0x54, 0x00, 0x10, 0x08, 0x98, 0x00, 0x15, + 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, 0x0d, 0x88, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, + 0xb0, 0x09, 0x00, 0x0b, 0x85, 0x7a, 0x00, 0x10, 0xb0, 0x58, 0x00, 0x00, + 0x0d, 0x59, 0x00, 0x01, 0xb9, 0xc8, 0x00, 0x10, 0xf0, 0x00, 0x00, 0x01, + 0xff, 0xe8, 0x00, 0x10, 0xf0, 0x00, 0x00, 0x1b, 0x15, 0xa3, 0x00, 0x15, + 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, 0x0d, 0x88, 0x00, 0x10, + 0x00, 0x05, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, + 0xb0, 0x09, 0x00, 0x0b, 0x85, 0x89, 0x00, 0x01, 0xb0, 0xc8, 0x00, 0x00, + 0xf7, 0x00, 0x00, 0x00, 0xff, 0xb0, 0x00, 0x11, 0xb0, 0xe8, 0x00, 0x00, + 0xf1, 0x00, 0x00, 0x13, 0x15, 0xea, 0x00, 0x11, 0xb0, 0xe8, 0x00, 0x00, + 0xf2, 0x00, 0x00, 0x13, 0x15, 0xef, 0x00, 0x11, 0xb0, 0xe8, 0x00, 0x10, + 0xf3, 0x00, 0x00, 0x03, 0x16, 0x14, 0x00, 0x11, 0xb0, 0xe8, 0x00, 0x00, + 0xf4, 0x00, 0x00, 0x13, 0x16, 0x19, 0x00, 0x11, 0xb0, 0xe8, 0x00, 0x10, + 0xf5, 0x00, 0x00, 0x13, 0x15, 0xea, 0x00, 0x11, 0xb0, 0xe8, 0x00, 0x10, + 0xf6, 0x00, 0x00, 0x03, 0x16, 0x2b, 0x00, 0x05, 0x00, 0xce, 0x00, 0x10, + 0x00, 0x09, 0x00, 0x00, 0xb0, 0xcf, 0x00, 0x03, 0x08, 0xe1, 0x00, 0x00, + 0xb9, 0x30, 0x00, 0x05, 0x00, 0x31, 0x00, 0x00, 0x00, 0x25, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x00, 0xb0, 0x39, 0x00, 0x0b, 0x85, 0xa8, 0x00, 0x12, + 0xb7, 0x49, 0x00, 0x13, 0x15, 0xad, 0x00, 0x02, 0xb5, 0x2c, 0x00, 0x00, + 0xff, 0xb5, 0x00, 0x00, 0xb1, 0x62, 0x00, 0x00, 0xb0, 0x63, 0x00, 0x05, + 0x00, 0x31, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, + 0xb3, 0x09, 0x00, 0x0b, 0x85, 0xb3, 0x00, 0x01, 0xb3, 0xc8, 0x00, 0x10, + 0x00, 0x03, 0x00, 0x03, 0x15, 0xbb, 0x00, 0x10, 0xff, 0xb2, 0x00, 0x01, + 0xff, 0xe8, 0x00, 0x10, 0x00, 0x03, 0x00, 0x1b, 0x15, 0xbd, 0x00, 0x00, + 0xc2, 0xb7, 0x00, 0x13, 0x06, 0x47, 0x00, 0x01, 0xb2, 0xe8, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x13, 0x15, 0xc4, 0x00, 0x05, 0x00, 0xce, 0x00, 0x10, + 0x00, 0x0a, 0x00, 0x10, 0xb2, 0xcf, 0x00, 0x03, 0x08, 0xe1, 0x00, 0x10, + 0xb4, 0x65, 0x00, 0x10, 0xb6, 0x67, 0x00, 0x15, 0x00, 0xb7, 0x00, 0x10, + 0x00, 0x18, 0x00, 0x01, 0xb5, 0xc8, 0x00, 0x10, 0x03, 0x00, 0x00, 0x13, + 0x15, 0xe9, 0x00, 0x12, 0xb5, 0x48, 0x00, 0x13, 0x15, 0xd0, 0x00, 0x00, + 0xb6, 0xff, 0x00, 0x11, 0xb7, 0x80, 0x00, 0x10, 0xff, 0xb7, 0x00, 0x02, + 0xb5, 0x49, 0x00, 0x13, 0x15, 0xd5, 0x00, 0x10, 0xb4, 0xff, 0x00, 0x11, + 0xb7, 0x80, 0x00, 0x10, 0xff, 0xb7, 0x00, 0x15, 0x00, 0x44, 0x00, 0x10, + 0x00, 0x18, 0x00, 0x05, 0x00, 0x31, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x00, 0x68, 0x41, 0x00, 0x1b, 0x85, 0xdb, 0x00, 0x15, + 0x00, 0x44, 0x00, 0x00, 0x00, 0x19, 0x00, 0x05, 0x00, 0x31, 0x00, 0x00, + 0x00, 0x34, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0x50, 0x29, 0x00, 0x1b, + 0x85, 0xe2, 0x00, 0x15, 0x00, 0x44, 0x00, 0x00, 0x00, 0x08, 0x00, 0x11, + 0xb7, 0xc8, 0x00, 0x10, 0x00, 0x03, 0x00, 0x13, 0x15, 0xe9, 0x00, 0x10, + 0xff, 0x55, 0x00, 0x13, 0x06, 0x47, 0x00, 0x05, 0x00, 0xb5, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x15, 0x00, 0xb7, 0x00, 0x10, 0x00, 0x18, 0x00, 0x13, + 0x06, 0x47, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, + 0x0d, 0x88, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x00, 0xb0, 0x11, 0x00, 0x1b, 0x85, 0xf6, 0x00, 0x10, + 0xb1, 0xff, 0x00, 0x01, 0xb0, 0xd0, 0x00, 0x03, 0x15, 0xff, 0x00, 0x05, + 0x00, 0xb5, 0x00, 0x10, 0x0b, 0x02, 0x00, 0x10, 0xb0, 0x62, 0x00, 0x10, + 0xb1, 0x63, 0x00, 0x03, 0x06, 0x01, 0x00, 0x05, 0x00, 0xb5, 0x00, 0x00, + 0x03, 0x02, 0x00, 0x15, 0x00, 0x65, 0x00, 0x10, 0x00, 0x12, 0x00, 0x05, + 0x00, 0x67, 0x00, 0x00, 0x00, 0x08, 0x00, 0x15, 0x00, 0x6c, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x05, 0x00, 0x6d, 0x00, 0x10, 0x05, 0x00, 0x00, 0x15, + 0x00, 0x6f, 0x00, 0x10, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x44, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x05, 0x00, 0x52, 0x00, 0x00, 0x25, 0x00, 0x00, 0x15, + 0x00, 0x44, 0x00, 0x00, 0x00, 0x08, 0x00, 0x15, 0x00, 0xb7, 0x00, 0x00, + 0x00, 0x32, 0x00, 0x13, 0x06, 0x47, 0x00, 0x05, 0x00, 0xb5, 0x00, 0x10, + 0x00, 0x28, 0x00, 0x15, 0x00, 0xb7, 0x00, 0x10, 0x00, 0x18, 0x00, 0x13, + 0x06, 0x47, 0x00, 0x05, 0x00, 0xb5, 0x00, 0x00, 0x01, 0x00, 0x00, 0x05, + 0x00, 0x67, 0x00, 0x00, 0x00, 0x08, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x11, 0x0d, 0x88, 0x00, 0x10, 0x00, 0x18, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x1b, + 0x86, 0x24, 0x00, 0x01, 0xb0, 0xc8, 0x00, 0x10, 0x00, 0xff, 0x00, 0x10, + 0xff, 0x69, 0x00, 0x15, 0x00, 0xb7, 0x00, 0x00, 0x00, 0x20, 0x00, 0x13, + 0x06, 0x47, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, + 0x0d, 0x88, 0x00, 0x10, 0x00, 0x05, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x00, 0xb6, 0x09, 0x00, 0x0b, 0x86, 0x32, 0x00, 0x01, + 0xb6, 0xc8, 0x00, 0x10, 0xff, 0x00, 0x00, 0x00, 0xff, 0xb0, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x00, 0xb0, 0x0a, 0x00, 0x0b, 0x86, 0x38, 0x00, 0x01, + 0xb6, 0xc8, 0x00, 0x10, 0x00, 0xff, 0x00, 0x12, 0xff, 0x10, 0x00, 0x1b, + 0x16, 0x41, 0x00, 0x00, 0xff, 0xb5, 0x00, 0x15, 0x00, 0xb7, 0x00, 0x10, + 0x00, 0x18, 0x00, 0x13, 0x06, 0x47, 0x00, 0x10, 0xff, 0x63, 0x00, 0x05, + 0x00, 0xb5, 0x00, 0x00, 0x08, 0x00, 0x00, 0x15, 0x00, 0xb7, 0x00, 0x10, + 0x00, 0x18, 0x00, 0x13, 0x06, 0x47, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x11, 0x0d, 0x88, 0x00, 0x10, 0x00, 0x09, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x1b, + 0x86, 0x4e, 0x00, 0x10, 0xb5, 0x61, 0x00, 0x13, 0x96, 0x50, 0x00, 0x10, + 0xb7, 0xa0, 0x00, 0x03, 0x06, 0x68, 0x00, 0x05, 0x00, 0xb6, 0x00, 0x10, + 0x03, 0x00, 0x00, 0x14, 0x06, 0x83, 0x00, 0x05, 0x00, 0x54, 0x00, 0x10, + 0x08, 0x19, 0x00, 0x10, 0x0d, 0x58, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x11, 0x0d, 0x88, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x1b, + 0x86, 0x60, 0x00, 0x00, 0xb0, 0x59, 0x00, 0x03, 0x96, 0x62, 0x00, 0x10, + 0xc0, 0xa0, 0x00, 0x10, 0x71, 0xff, 0x00, 0x02, 0xff, 0x28, 0x00, 0x10, + 0xff, 0x71, 0x00, 0x03, 0x06, 0x68, 0x00, 0x12, 0xd0, 0x41, 0x00, 0x0b, + 0x16, 0x68, 0x00, 0x15, 0x00, 0xd1, 0x00, 0x10, 0x02, 0x02, 0x00, 0x00, + 0x75, 0xff, 0x00, 0x11, 0xff, 0xc8, 0x00, 0x00, 0x18, 0x04, 0x00, 0x01, + 0xff, 0xd8, 0x00, 0x10, 0x00, 0x09, 0x00, 0x13, 0x96, 0x71, 0x00, 0x00, + 0xff, 0x75, 0x00, 0x03, 0x96, 0x73, 0x00, 0x15, 0x00, 0xd1, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, + 0xbd, 0x88, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0xff, 0x31, 0x00, 0x05, + 0x00, 0xb0, 0x00, 0x10, 0x00, 0x09, 0x00, 0x15, 0x00, 0xb1, 0x00, 0x10, + 0x07, 0xd0, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb0, 0x12, 0x00, 0x1b, + 0x86, 0x81, 0x00, 0x13, 0x04, 0x6b, 0x00, 0x15, 0x00, 0x44, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x05, 0x00, 0x98, 0x00, 0x10, 0x00, 0x56, 0x00, 0x15, + 0x00, 0x99, 0x00, 0x00, 0x95, 0x75, 0x00, 0x04, 0x08, 0xa8, 0x00, 0x00, + 0xb0, 0x96, 0x00, 0x12, 0xb2, 0x70, 0x00, 0x10, 0xff, 0x56, 0x00, 0x14, + 0x08, 0xca, 0x00, 0x10, 0xb0, 0x52, 0x00, 0x10, 0xb1, 0x53, 0x00, 0x00, + 0xb6, 0xff, 0x00, 0x11, 0xb2, 0xd0, 0x00, 0x10, 0xff, 0x50, 0x00, 0x10, + 0xb3, 0x51, 0x00, 0x17, 0x40, 0x00, 0x00, 0x01, 0x12, 0xe8, 0x00, 0x01, + 0x1b, 0x55, 0x00, 0x03, 0x18, 0x45, 0x00, 0x15, 0x00, 0xd1, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, + 0x12, 0x88, 0x00, 0x10, 0x00, 0x11, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x00, 0x10, 0x09, 0x00, 0x0b, 0x86, 0xa1, 0x00, 0x15, + 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0xc0, 0x14, 0x00, 0x00, + 0x12, 0x13, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, + 0x13, 0x88, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x00, 0xba, 0x09, 0x00, 0x0b, 0x86, 0xad, 0x00, 0x15, + 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, 0x13, 0x88, 0x00, 0x10, + 0x00, 0x05, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, + 0x1a, 0x09, 0x00, 0x0b, 0x86, 0xb5, 0x00, 0x12, 0x10, 0x4b, 0x00, 0x1b, + 0x16, 0xbe, 0x00, 0x00, 0x1a, 0x30, 0x00, 0x05, 0x00, 0x31, 0x00, 0x00, + 0x00, 0x0b, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0x16, 0x21, 0x00, 0x1b, + 0x86, 0xbd, 0x00, 0x10, 0x15, 0xfe, 0x00, 0x0b, 0x66, 0xdd, 0x00, 0x04, + 0x07, 0x04, 0x00, 0x02, 0x3a, 0x42, 0x00, 0x0b, 0x17, 0x03, 0x00, 0x01, + 0x10, 0xc8, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x0b, 0x17, 0x66, 0x00, 0x15, + 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, 0x13, 0x88, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, + 0xb0, 0x09, 0x00, 0x0b, 0x86, 0xcd, 0x00, 0x11, 0xb0, 0xe8, 0x00, 0x10, + 0x00, 0x09, 0x00, 0x03, 0x16, 0xd4, 0x00, 0x11, 0xb0, 0xe8, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x1b, 0x17, 0x02, 0x00, 0x11, 0x13, 0x88, 0x00, 0x10, + 0x00, 0x0a, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, + 0xb0, 0x09, 0x00, 0x0b, 0x86, 0xd9, 0x00, 0x02, 0xb0, 0x4f, 0x00, 0x1b, + 0x16, 0xf9, 0x00, 0x13, 0x07, 0x02, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x11, 0x13, 0x88, 0x00, 0x10, 0x00, 0x03, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x1b, + 0x86, 0xe4, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, 0xc0, 0x0a, 0x00, 0x1b, + 0x86, 0xe7, 0x00, 0x10, 0xb0, 0xfe, 0x00, 0x03, 0x66, 0xec, 0x00, 0x00, + 0xb0, 0x12, 0x00, 0x13, 0x06, 0xee, 0x00, 0x10, 0xc0, 0x12, 0x00, 0x10, + 0xc0, 0x11, 0x00, 0x15, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, + 0x39, 0x44, 0x00, 0x13, 0x16, 0xf7, 0x00, 0x15, 0x00, 0x39, 0x00, 0x00, + 0x50, 0x40, 0x00, 0x15, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, + 0x09, 0x25, 0x00, 0x00, 0xc0, 0x13, 0x00, 0x03, 0x07, 0x03, 0x00, 0x10, + 0x02, 0xfe, 0x00, 0x03, 0x66, 0xfe, 0x00, 0x15, 0x00, 0x3a, 0x00, 0x10, + 0x20, 0x20, 0x00, 0x03, 0x07, 0x03, 0x00, 0x15, 0x00, 0x3a, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x15, 0x00, 0x3a, 0x00, 0x10, 0x10, 0x10, 0x00, 0x04, + 0x09, 0x11, 0x00, 0x03, 0x00, 0x54, 0x00, 0x03, 0xb7, 0x04, 0x00, 0x05, + 0x00, 0x2a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0xba, 0x30, 0x00, 0x05, + 0x00, 0x31, 0x00, 0x10, 0x00, 0x1b, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, + 0xb0, 0x09, 0x00, 0x0b, 0x87, 0x0c, 0x00, 0x00, 0xc0, 0x2c, 0x00, 0x00, + 0xb0, 0x2d, 0x00, 0x12, 0x10, 0x4b, 0x00, 0x13, 0x17, 0x27, 0x00, 0x00, + 0x1a, 0x30, 0x00, 0x05, 0x00, 0x31, 0x00, 0x00, 0x00, 0x23, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x00, 0xb1, 0x29, 0x00, 0x1b, 0x87, 0x16, 0x00, 0x00, + 0xb1, 0x20, 0x00, 0x10, 0xb2, 0x21, 0x00, 0x00, 0xb3, 0x22, 0x00, 0x00, + 0xb4, 0x23, 0x00, 0x00, 0xb5, 0x24, 0x00, 0x00, 0xc0, 0x25, 0x00, 0x10, + 0xb5, 0x26, 0x00, 0x10, 0xc0, 0x27, 0x00, 0x10, 0xb5, 0x16, 0x00, 0x10, + 0xc0, 0x17, 0x00, 0x00, 0xb5, 0x18, 0x00, 0x00, 0xc0, 0x19, 0x00, 0x10, + 0xc0, 0x28, 0x00, 0x00, 0xc0, 0x29, 0x00, 0x10, 0xc0, 0x1e, 0x00, 0x13, + 0x07, 0x5d, 0x00, 0x12, 0x10, 0x44, 0x00, 0x03, 0x17, 0x57, 0x00, 0x02, + 0x10, 0x34, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0x1a, 0x30, 0x00, 0x05, + 0x00, 0x31, 0x00, 0x00, 0x00, 0x02, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, + 0x1b, 0x29, 0x00, 0x0b, 0x87, 0x30, 0x00, 0x00, 0x1c, 0x30, 0x00, 0x00, + 0x1b, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb1, 0x31, 0x00, 0x0b, + 0x87, 0x35, 0x00, 0x02, 0x1f, 0x43, 0x00, 0x0b, 0x17, 0x3c, 0x00, 0x10, + 0xb3, 0xb5, 0x00, 0x00, 0xb4, 0xb6, 0x00, 0x00, 0xc0, 0xb3, 0x00, 0x10, + 0xc0, 0xb4, 0x00, 0x00, 0xb1, 0x20, 0x00, 0x10, 0xb2, 0x21, 0x00, 0x00, + 0xb3, 0x22, 0x00, 0x00, 0xb4, 0x23, 0x00, 0x00, 0xb5, 0x24, 0x00, 0x10, + 0xb6, 0x25, 0x00, 0x10, 0xb5, 0x16, 0x00, 0x00, 0xb6, 0x17, 0x00, 0x00, + 0x18, 0x26, 0x00, 0x00, 0x19, 0x27, 0x00, 0x00, 0x1a, 0x30, 0x00, 0x05, + 0x00, 0x31, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, + 0xb0, 0x11, 0x00, 0x0b, 0x87, 0x4b, 0x00, 0x00, 0xb0, 0x28, 0x00, 0x00, + 0xb1, 0x29, 0x00, 0x12, 0x1e, 0x10, 0x00, 0x10, 0xff, 0x1e, 0x00, 0x13, + 0x67, 0x5d, 0x00, 0x02, 0x1d, 0x00, 0x00, 0x10, 0xff, 0x1d, 0x00, 0x04, + 0x02, 0xab, 0x00, 0x02, 0x3a, 0x42, 0x00, 0x03, 0x17, 0x5d, 0x00, 0x03, + 0x07, 0x65, 0x00, 0x00, 0x1a, 0x30, 0x00, 0x05, 0x00, 0x31, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0x1b, 0x79, 0x00, 0x0b, + 0x87, 0x5c, 0x00, 0x03, 0xb7, 0x5d, 0x00, 0x05, 0x00, 0x2a, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x05, 0x00, 0x15, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x1e, 0xfe, 0x00, 0x03, 0x67, 0x65, 0x00, 0x03, 0x02, 0x77, 0x00, 0x17, + 0x40, 0x00, 0x00, 0x00, 0xba, 0x30, 0x00, 0x05, 0x00, 0x31, 0x00, 0x10, + 0x00, 0x1b, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, 0xb0, 0x51, 0x00, 0x1b, + 0x87, 0x6b, 0x00, 0x00, 0xb0, 0xa3, 0x00, 0x10, 0xb6, 0x97, 0x00, 0x10, + 0xb9, 0x46, 0x00, 0x15, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x10, 0x00, 0x15, + 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, 0x13, 0x88, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, + 0xb5, 0x09, 0x00, 0x0b, 0x87, 0x78, 0x00, 0x14, 0x08, 0xca, 0x00, 0x04, + 0x08, 0xb9, 0x00, 0x12, 0xb4, 0x70, 0x00, 0x10, 0xff, 0xb4, 0x00, 0x10, + 0xb4, 0x8e, 0x00, 0x10, 0xb0, 0x8a, 0x00, 0x10, 0xb1, 0x8b, 0x00, 0x12, + 0x10, 0x4d, 0x00, 0x03, 0x17, 0x83, 0x00, 0x13, 0x07, 0xb0, 0x00, 0x12, + 0x10, 0x4b, 0x00, 0x13, 0x17, 0x96, 0x00, 0x05, 0x00, 0x8c, 0x00, 0x10, + 0x08, 0x29, 0x00, 0x10, 0xc0, 0x8d, 0x00, 0x01, 0xb2, 0xd8, 0x00, 0x10, + 0x06, 0x00, 0x00, 0x10, 0xff, 0x88, 0x00, 0x10, 0xb3, 0x89, 0x00, 0x00, + 0x13, 0x90, 0x00, 0x10, 0xb5, 0x91, 0x00, 0x00, 0xc0, 0x8f, 0x00, 0x10, + 0x1a, 0xb9, 0x00, 0x04, 0x05, 0x1b, 0x00, 0x13, 0x97, 0x91, 0x00, 0x10, + 0xb0, 0x92, 0x00, 0x10, 0xb1, 0x93, 0x00, 0x13, 0x97, 0x94, 0x00, 0x13, + 0x07, 0xab, 0x00, 0x05, 0x00, 0x8c, 0x00, 0x00, 0x08, 0x09, 0x00, 0x15, + 0x00, 0x8d, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0xb2, 0xd8, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x10, 0xff, 0x88, 0x00, 0x10, 0xb3, 0x89, 0x00, 0x00, + 0x13, 0x90, 0x00, 0x10, 0xb5, 0x91, 0x00, 0x00, 0xc0, 0x8f, 0x00, 0x00, + 0x1a, 0x30, 0x00, 0x05, 0x00, 0x31, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x00, 0xb0, 0x11, 0x00, 0x0b, 0x87, 0xa6, 0x00, 0x13, + 0x97, 0xa7, 0x00, 0x00, 0xb1, 0x92, 0x00, 0x00, 0xb0, 0x93, 0x00, 0x03, + 0x97, 0xaa, 0x00, 0x10, 0x19, 0xa1, 0x00, 0x00, 0x18, 0xa2, 0x00, 0x15, + 0x00, 0xb1, 0x00, 0x10, 0x00, 0x96, 0x00, 0x03, 0x08, 0x21, 0x00, 0x00, + 0xb5, 0x90, 0x00, 0x10, 0x13, 0x91, 0x00, 0x01, 0x10, 0xc8, 0x00, 0x10, + 0x00, 0x0f, 0x00, 0x01, 0xff, 0xe8, 0x00, 0x10, 0x00, 0x05, 0x00, 0x13, + 0x17, 0xd7, 0x00, 0x01, 0xb2, 0xd8, 0x00, 0x00, 0x07, 0x00, 0x00, 0x10, + 0xff, 0x88, 0x00, 0x10, 0xb3, 0x89, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x11, 0x13, 0x88, 0x00, 0x10, 0x00, 0x09, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x1b, + 0x87, 0xc2, 0x00, 0x02, 0xb0, 0x49, 0x00, 0x13, 0x17, 0xca, 0x00, 0x05, + 0x00, 0x8c, 0x00, 0x10, 0x08, 0x89, 0x00, 0x15, 0x00, 0xb1, 0x00, 0x10, + 0x00, 0x96, 0x00, 0x13, 0x07, 0xce, 0x00, 0x05, 0x00, 0x8c, 0x00, 0x10, + 0x08, 0x98, 0x00, 0x15, 0x00, 0xb1, 0x00, 0x00, 0x00, 0x92, 0x00, 0x10, + 0xc0, 0x8d, 0x00, 0x00, 0xc0, 0x8f, 0x00, 0x13, 0x97, 0xd0, 0x00, 0x00, + 0xc0, 0x92, 0x00, 0x10, 0xc0, 0x93, 0x00, 0x13, 0x97, 0xd3, 0x00, 0x10, + 0x19, 0xa1, 0x00, 0x00, 0x18, 0xa2, 0x00, 0x03, 0x08, 0x21, 0x00, 0x01, + 0xb2, 0xd8, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0xff, 0x88, 0x00, 0x10, + 0xb3, 0x89, 0x00, 0x05, 0x00, 0x8c, 0x00, 0x10, 0x08, 0x80, 0x00, 0x15, + 0x00, 0x8d, 0x00, 0x00, 0x00, 0x08, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x11, 0x13, 0x88, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x1b, + 0x87, 0xe6, 0x00, 0x10, 0xb0, 0x8f, 0x00, 0x00, 0xb5, 0x90, 0x00, 0x10, + 0x13, 0x91, 0x00, 0x00, 0x1a, 0x30, 0x00, 0x05, 0x00, 0x31, 0x00, 0x00, + 0x00, 0x0d, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb0, 0x21, 0x00, 0x1b, + 0x87, 0xef, 0x00, 0x03, 0x97, 0xf0, 0x00, 0x10, 0xb3, 0x92, 0x00, 0x10, + 0xb2, 0x93, 0x00, 0x03, 0x97, 0xf3, 0x00, 0x00, 0xb1, 0xa1, 0x00, 0x10, + 0xb0, 0xa2, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, + 0x13, 0x88, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x10, 0xb2, 0x11, 0x00, 0x1b, 0x87, 0xfd, 0x00, 0x00, + 0xb3, 0xff, 0x00, 0x01, 0xb0, 0x80, 0x00, 0x00, 0xff, 0xb3, 0x00, 0x1b, + 0x28, 0x04, 0x00, 0x02, 0xb2, 0x00, 0x00, 0x03, 0x08, 0x05, 0x00, 0x10, + 0xb2, 0xff, 0x00, 0x11, 0xb1, 0x80, 0x00, 0x10, 0xff, 0xb2, 0x00, 0x11, + 0x13, 0x88, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x10, 0xb2, 0x12, 0x00, 0x0b, 0x88, 0x0c, 0x00, 0x15, + 0x00, 0xb1, 0x00, 0x00, 0x00, 0x92, 0x00, 0x02, 0x10, 0x4c, 0x00, 0x03, + 0x18, 0x1f, 0x00, 0x11, 0xc2, 0xe8, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x0b, + 0x18, 0x17, 0x00, 0x15, 0x00, 0xff, 0x00, 0x00, 0x08, 0x00, 0x00, 0x13, + 0x08, 0x1f, 0x00, 0x11, 0xc2, 0xe8, 0x00, 0x00, 0x00, 0x20, 0x00, 0x0b, + 0x18, 0x1d, 0x00, 0x15, 0x00, 0xff, 0x00, 0x10, 0x18, 0x00, 0x00, 0x13, + 0x08, 0x1f, 0x00, 0x15, 0x00, 0xff, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, + 0xb1, 0xd0, 0x00, 0x10, 0xff, 0xb1, 0x00, 0x15, 0x00, 0x9a, 0x00, 0x10, + 0x00, 0x36, 0x00, 0x05, 0x00, 0x9b, 0x00, 0x00, 0x95, 0xd5, 0x00, 0x12, + 0xd0, 0x41, 0x00, 0x1b, 0x18, 0x25, 0x00, 0x15, 0x00, 0xd1, 0x00, 0x10, + 0x02, 0x02, 0x00, 0x13, 0x98, 0x29, 0x00, 0x12, 0x10, 0x4e, 0x00, 0x13, + 0x18, 0x2e, 0x00, 0x12, 0xb1, 0x2f, 0x00, 0x10, 0xff, 0xb1, 0x00, 0x00, + 0xb1, 0x75, 0x00, 0x13, 0x98, 0x2f, 0x00, 0x15, 0x00, 0xd1, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x01, 0x19, 0xc8, 0x00, 0x10, 0xff, 0xf0, 0x00, 0x1b, + 0x18, 0x38, 0x00, 0x15, 0x00, 0xb1, 0x00, 0x10, 0x07, 0xd0, 0x00, 0x03, + 0x08, 0x3a, 0x00, 0x15, 0x00, 0xb1, 0x00, 0x00, 0x1b, 0x58, 0x00, 0x05, + 0x00, 0xb0, 0x00, 0x10, 0x00, 0x09, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x01, 0xbd, 0x88, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb0, 0x12, 0x00, 0x1b, + 0x88, 0x43, 0x00, 0x03, 0x07, 0x03, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x03, 0x68, 0x93, 0x00, 0x11, + 0xff, 0xa8, 0x00, 0x10, 0x00, 0x05, 0x00, 0x0b, 0x28, 0x93, 0x00, 0x05, + 0x00, 0x31, 0x00, 0x01, 0x1b, 0x6c, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, + 0xb2, 0x11, 0x00, 0x0b, 0x88, 0x50, 0x00, 0x02, 0xb2, 0x00, 0x00, 0x10, + 0xff, 0xb2, 0x00, 0x05, 0x00, 0x31, 0x00, 0x01, 0x1b, 0x6c, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x10, 0xb2, 0x0a, 0x00, 0x1b, 0x88, 0x57, 0x00, 0x15, + 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x12, 0x13, 0x00, 0x05, + 0x00, 0x10, 0x00, 0x00, 0x80, 0x00, 0x00, 0x15, 0x00, 0xa3, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0xc6, 0x97, 0x00, 0x05, 0x00, 0x46, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x15, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x10, 0x00, 0x11, + 0xc4, 0xd8, 0x00, 0x00, 0x32, 0x00, 0x00, 0x10, 0xff, 0x88, 0x00, 0x00, + 0xc5, 0x89, 0x00, 0x10, 0xc4, 0x8a, 0x00, 0x10, 0xc5, 0x8b, 0x00, 0x10, + 0xc0, 0x8e, 0x00, 0x05, 0x00, 0x8c, 0x00, 0x10, 0xe1, 0x09, 0x00, 0x10, + 0xc0, 0x8d, 0x00, 0x15, 0x00, 0x90, 0x00, 0x01, 0x1b, 0x55, 0x00, 0x05, + 0x00, 0x91, 0x00, 0x10, 0xff, 0xff, 0x00, 0x00, 0xb2, 0x92, 0x00, 0x00, + 0xb3, 0x93, 0x00, 0x15, 0x00, 0x9a, 0x00, 0x10, 0x00, 0x56, 0x00, 0x05, + 0x00, 0x9b, 0x00, 0x10, 0x95, 0xf5, 0x00, 0x12, 0xd0, 0x42, 0x00, 0x03, + 0x18, 0x86, 0x00, 0x05, 0x00, 0xb0, 0x00, 0x10, 0x80, 0x80, 0x00, 0x11, + 0x13, 0x88, 0x00, 0x10, 0x00, 0x11, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x00, 0xb0, 0x0a, 0x00, 0x0b, 0x88, 0x81, 0x00, 0x15, + 0x00, 0xb8, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x14, 0x09, 0x25, 0x00, 0x03, + 0x08, 0x88, 0x00, 0x05, 0x00, 0x75, 0x00, 0x10, 0x80, 0x92, 0x00, 0x15, + 0x00, 0xb1, 0x00, 0x10, 0x07, 0xd0, 0x00, 0x05, 0x00, 0xb0, 0x00, 0x10, + 0x00, 0x09, 0x00, 0x01, 0xbd, 0x88, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb0, 0x12, 0x00, 0x1b, + 0x88, 0x91, 0x00, 0x03, 0x07, 0x03, 0x00, 0x15, 0x00, 0xd1, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x01, 0x12, 0x88, 0x00, 0x10, 0x00, 0x03, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x0b, + 0x88, 0x9a, 0x00, 0x01, 0x12, 0x88, 0x00, 0x10, 0x00, 0x03, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, 0xc0, 0x0a, 0x00, 0x0b, + 0x88, 0xa0, 0x00, 0x10, 0xb0, 0xfe, 0x00, 0x03, 0x68, 0xa5, 0x00, 0x00, + 0xb0, 0x12, 0x00, 0x03, 0x07, 0x03, 0x00, 0x10, 0xc0, 0x12, 0x00, 0x10, + 0xc0, 0x11, 0x00, 0x03, 0x07, 0x03, 0x00, 0x00, 0xba, 0x30, 0x00, 0x05, + 0x00, 0x31, 0x00, 0x10, 0x00, 0x21, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, + 0xb0, 0x19, 0x00, 0x1b, 0x88, 0xad, 0x00, 0x02, 0xb2, 0x00, 0x00, 0x11, + 0xff, 0xc8, 0x00, 0x10, 0x00, 0xff, 0x00, 0x10, 0xff, 0xb2, 0x00, 0x10, + 0xb2, 0xb7, 0x00, 0x05, 0x00, 0x31, 0x00, 0x00, 0x00, 0x23, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x10, 0xb2, 0x0a, 0x00, 0x0b, 0x88, 0xb7, 0x00, 0x17, + 0x40, 0x00, 0x00, 0x00, 0xba, 0x30, 0x00, 0x05, 0x00, 0x31, 0x00, 0x00, + 0x00, 0x23, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, 0xb4, 0x09, 0x00, 0x0b, + 0x88, 0xbe, 0x00, 0x02, 0xb4, 0x00, 0x00, 0x11, 0xff, 0xc8, 0x00, 0x10, + 0x00, 0xff, 0x00, 0x10, 0xff, 0xb4, 0x00, 0x10, 0xb4, 0xb7, 0x00, 0x05, + 0x00, 0x31, 0x00, 0x00, 0x00, 0x23, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, + 0xb4, 0x0a, 0x00, 0x1b, 0x88, 0xc8, 0x00, 0x17, 0x40, 0x00, 0x00, 0x00, + 0xba, 0x30, 0x00, 0x01, 0xc7, 0xc8, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1b, + 0x18, 0xd6, 0x00, 0x05, 0x00, 0x31, 0x00, 0x10, 0x00, 0x28, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x10, 0xb2, 0x09, 0x00, 0x0b, 0x88, 0xd2, 0x00, 0x11, + 0xb2, 0xc8, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0x18, 0xd9, 0x00, 0x10, + 0xc4, 0xb0, 0x00, 0x10, 0xc5, 0xb1, 0x00, 0x03, 0x08, 0xdb, 0x00, 0x10, + 0xc6, 0xb1, 0x00, 0x00, 0xc0, 0xb0, 0x00, 0x05, 0x00, 0x31, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, 0xb2, 0x11, 0x00, 0x1b, + 0x88, 0xdf, 0x00, 0x17, 0x40, 0x00, 0x00, 0x15, 0x00, 0xb8, 0x00, 0x10, + 0x00, 0x09, 0x00, 0x15, 0x00, 0x3a, 0x00, 0x10, 0x07, 0x07, 0x00, 0x14, + 0x09, 0x25, 0x00, 0x13, 0x00, 0x2d, 0x00, 0x15, 0x00, 0xb8, 0x00, 0x10, + 0x00, 0x09, 0x00, 0x15, 0x00, 0x3a, 0x00, 0x10, 0x07, 0x07, 0x00, 0x03, + 0x09, 0x25, 0x00, 0x04, 0x01, 0x1c, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x11, 0x0d, 0x88, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x00, 0xba, 0x09, 0x00, 0x1b, + 0x88, 0xf4, 0x00, 0x04, 0x08, 0xa8, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x11, 0x0d, 0x88, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, 0xb2, 0x0a, 0x00, 0x1b, + 0x88, 0xfd, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, + 0x0d, 0x88, 0x00, 0x10, 0x00, 0x11, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x10, 0x03, 0x09, 0x00, 0x1b, 0x89, 0x05, 0x00, 0x02, + 0x03, 0x27, 0x00, 0x10, 0xff, 0xb2, 0x00, 0x11, 0x0d, 0x88, 0x00, 0x10, + 0x00, 0x11, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, + 0xb2, 0x0a, 0x00, 0x0b, 0x89, 0x0d, 0x00, 0x15, 0x00, 0xb8, 0x00, 0x10, + 0x00, 0x06, 0x00, 0x03, 0x09, 0x25, 0x00, 0x14, 0x01, 0x2e, 0x00, 0x04, + 0x08, 0xa8, 0x00, 0x15, 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, + 0x13, 0x88, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, + 0x00, 0x33, 0x00, 0x10, 0xb2, 0x0a, 0x00, 0x0b, 0x89, 0x1a, 0x00, 0x12, + 0x10, 0x27, 0x00, 0x10, 0xff, 0xb2, 0x00, 0x11, 0x13, 0x88, 0x00, 0x10, + 0x00, 0x11, 0x00, 0x00, 0xff, 0x31, 0x00, 0x15, 0x00, 0x33, 0x00, 0x10, + 0xb2, 0x0a, 0x00, 0x1b, 0x89, 0x22, 0x00, 0x15, 0x00, 0xb8, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x13, 0x49, 0x25, 0x00, 0x00, 0xb8, 0x38, 0x00, 0x17, + 0x40, 0x00, 0x9a, 0x8c, 0xaf, 0x3d }; -unsigned short rseqipx_code_length01 = 0x0a4e; -/* - * - */ -unsigned long xseqipx_code_addr01 = 0x0001e000 ; -unsigned short xseqipx_code01[] = { -0x0013, 0x0003, 0x0000, 0x1252, 0x0001, 0xe000, 0x0005, 0x0032, - 0x0000, 0x0010, 0x0015, 0x0033, 0x0010, 0xbb39, 0x000b, 0x8007, - 0x0004, 0x0113, 0x0004, 0x0125, 0x0010, 0xc000, 0x0000, 0xc001, - 0x0000, 0xc0b0, 0x0010, 0xc0b1, 0x0010, 0xc0b2, 0x0000, 0xc0b3, - 0x0010, 0xc0b4, 0x0000, 0xc0b5, 0x0000, 0xc0b6, 0x0010, 0xc0b7, - 0x0010, 0xc0b8, 0x0000, 0xc0b9, 0x0000, 0xc0ba, 0x0000, 0xc0c2, - 0x0010, 0xc0c3, 0x0000, 0xc0c4, 0x0010, 0xc0c5, 0x0010, 0xc0c6, - 0x0000, 0xc0c7, 0x0000, 0xc0c8, 0x0010, 0xc0c9, 0x0010, 0xc0ca, - 0x0000, 0xc0cb, 0x0010, 0xc0cc, 0x0000, 0xc0cd, 0x0000, 0xc0ce, - 0x0010, 0xc0cf, 0x0015, 0x0039, 0x0010, 0xff00, 0x0015, 0x003a, - 0x0010, 0xff00, 0x0005, 0x00d0, 0x0010, 0xff00, 0x0015, 0x00d1, - 0x0010, 0xff00, 0x0012, 0x3a40, 0x000b, 0x1031, 0x0002, 0x7940, - 0x001b, 0x1137, 0x0002, 0x3a42, 0x001b, 0x1035, 0x0003, 0xb035, - 0x0003, 0xa1e2, 0x0002, 0x3a41, 0x001b, 0x1039, 0x0012, 0x7941, - 0x001b, 0x1317, 0x0013, 0xe054, 0x0001, 0x0fe8, 0x0000, 0x0001, - 0x0013, 0x1054, 0x0000, 0x0cfe, 0x0013, 0x6047, 0x0002, 0x3a44, - 0x001b, 0x1047, 0x0011, 0x02e8, 0x0010, 0x0000, 0x0013, 0x13cd, - 0x0011, 0x02e8, 0x0010, 0x0005, 0x0013, 0x145f, 0x0012, 0x3a46, - 0x000b, 0x1054, 0x0011, 0x02e8, 0x0010, 0x0000, 0x0013, 0x104f, - 0x0011, 0x02e8, 0x0010, 0x0005, 0x000b, 0x1054, 0x0000, 0x12fe, - 0x0003, 0x6054, 0x0001, 0x0fe8, 0x0010, 0x0000, 0x0003, 0x1695, - 0x0015, 0x0030, 0x0000, 0x0400, 0x0010, 0xc131, 0x0015, 0x0033, - 0x0010, 0xb211, 0x001b, 0x8059, 0x0010, 0xb2ff, 0x0001, 0xb3e0, - 0x001c, 0x10d5, 0x000b, 0xf02d, 0x0011, 0x3be8, 0x0000, 0x0010, - 0x001b, 0x1071, 0x0000, 0x0afe, 0x000b, 0x6065, 0x0000, 0x3c0b, - 0x0003, 0x006d, 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0x0a88, - 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0x3c0a, - 0x001b, 0x806c, 0x0010, 0x3c0a, 0x0002, 0x0c00, 0x0010, 0xff0c, - 0x0013, 0x00d2, 0x0011, 0x3be8, 0x0010, 0x0012, 0x001b, 0x1084, - 0x0010, 0x08fe, 0x000b, 0x6078, 0x0010, 0x3c09, 0x0003, 0x0080, - 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0888, 0x0010, 0x0003, - 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0x3c0a, 0x000b, 0x807f, - 0x0000, 0x3c08, 0x0002, 0x0c00, 0x0010, 0xff0c, 0x0013, 0x00d2, - 0x0011, 0x3be8, 0x0000, 0x0013, 0x000b, 0x108a, 0x0000, 0x3cb0, - 0x0014, 0x00e5, 0x0013, 0x00d2, 0x0011, 0x3be8, 0x0000, 0x0019, - 0x000b, 0x109d, 0x0010, 0x04fe, 0x001b, 0x6091, 0x0010, 0x3c05, - 0x0013, 0x0099, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0488, - 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0x3c0a, - 0x000b, 0x8098, 0x0000, 0x3c04, 0x0002, 0x0c00, 0x0010, 0xff0c, - 0x0013, 0x00d2, 0x0011, 0x3be8, 0x0010, 0x001b, 0x001b, 0x10a6, - 0x0010, 0xc014, 0x0000, 0xc013, 0x0000, 0xc010, 0x0015, 0x000f, - 0x0010, 0x0000, 0x0013, 0x00d2, 0x0011, 0x3be8, 0x0000, 0x0015, - 0x001b, 0x10b2, 0x0004, 0x011c, 0x0014, 0x012e, 0x0015, 0x0039, - 0x0000, 0x8000, 0x0017, 0x8000, 0x0004, 0x0113, 0x0004, 0x0125, - 0x0014, 0x00fe, 0x0013, 0x002d, 0x0011, 0x3be8, 0x0000, 0x0016, - 0x000b, 0x10c4, 0x0001, 0x0fe8, 0x0010, 0x0000, 0x0003, 0x10be, - 0x0001, 0x0fe8, 0x0000, 0x0002, 0x0003, 0x10be, 0x0015, 0x0039, - 0x0010, 0x1010, 0x0013, 0x00d2, 0x0015, 0x0039, 0x0000, 0x5040, - 0x0015, 0x00b8, 0x0000, 0x0008, 0x0014, 0x0925, 0x0013, 0x00d2, - 0x0011, 0x3be8, 0x0010, 0x0017, 0x001b, 0x10c9, 0x0010, 0x3cc3, - 0x0013, 0x00d2, 0x0011, 0x3be8, 0x0010, 0x0018, 0x000b, 0x10ce, - 0x0000, 0x3cc2, 0x0013, 0x00d2, 0x0005, 0x00ce, 0x0000, 0x0001, - 0x0000, 0x3bcf, 0x0014, 0x08e7, 0x0015, 0x0039, 0x0000, 0x8000, - 0x0013, 0x002d, 0x0001, 0xb288, 0x0000, 0x0002, 0x0001, 0xc180, - 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x80db, - 0x0002, 0xb200, 0x0011, 0xffc8, 0x0000, 0x0007, 0x0010, 0xffb2, - 0x0010, 0xc131, 0x0015, 0x0033, 0x0010, 0xb20a, 0x0001, 0xb0d0, - 0x001b, 0x80e4, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0xb088, - 0x0000, 0x0010, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xb109, - 0x000b, 0x80ec, 0x0001, 0xb1e8, 0x0010, 0xffff, 0x0013, 0x10fd, - 0x0000, 0x11fe, 0x001b, 0x60f4, 0x0000, 0xb012, 0x0013, 0x00fc, - 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0x1188, 0x0010, 0x0003, - 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb00a, 0x000b, 0x80fb, - 0x0000, 0xb011, 0x0017, 0x4000, 0x0015, 0x0030, 0x0000, 0x0400, - 0x0011, 0xbc88, 0x0000, 0x001f, 0x0000, 0xff31, 0x0015, 0x0033, - 0x0000, 0xc411, 0x000b, 0x8105, 0x0011, 0xbc88, 0x0010, 0x0018, - 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xc609, 0x001b, 0x810b, - 0x0011, 0xbc88, 0x0000, 0x0037, 0x0000, 0xff31, 0x0015, 0x0033, - 0x0000, 0xc709, 0x000b, 0x8111, 0x0017, 0x4000, 0x0015, 0x0030, - 0x0000, 0x0400, 0x0001, 0xbb88, 0x0000, 0x0001, 0x0000, 0xff31, - 0x0015, 0x0033, 0x0000, 0x0269, 0x001b, 0x811a, 0x0017, 0x4000, - 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0xbb88, 0x0000, 0x0001, - 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0x026a, 0x001b, 0x8123, - 0x0017, 0x4000, 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0xbb88, - 0x0010, 0x000f, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0x0f59, - 0x001b, 0x812c, 0x0017, 0x4000, 0x0015, 0x0030, 0x0000, 0x0400, - 0x0001, 0xbb88, 0x0010, 0x000f, 0x0000, 0xff31, 0x0015, 0x0033, - 0x0010, 0x0f5a, 0x000b, 0x8135, 0x0017, 0x4000, 0x0000, 0xd0ff, - 0x0012, 0xff40, 0x000b, 0x1031, 0x0015, 0x00d1, 0x0010, 0x0101, - 0x0003, 0x913c, 0x0005, 0x0079, 0x0000, 0x0001, 0x0003, 0x913f, - 0x0015, 0x00d1, 0x0000, 0x0100, 0x0011, 0x02e8, 0x0000, 0x0002, - 0x0003, 0x1167, 0x0011, 0x02e8, 0x0000, 0x0001, 0x0003, 0x117f, - 0x0011, 0x02e8, 0x0000, 0x0004, 0x0003, 0x119d, 0x0011, 0x02e8, - 0x0010, 0x0003, 0x0003, 0x11ce, 0x0005, 0x0002, 0x0010, 0x0000, - 0x0000, 0xc00e, 0x0000, 0xc00d, 0x0010, 0xc003, 0x0015, 0x0030, - 0x0000, 0x0400, 0x0001, 0xbd88, 0x0010, 0x0009, 0x0000, 0xff31, - 0x0015, 0x0033, 0x0010, 0xc00a, 0x000b, 0x815a, 0x0000, 0xff31, - 0x0015, 0x0033, 0x0010, 0xc00a, 0x001b, 0x815e, 0x0012, 0x3a45, - 0x0013, 0x1166, 0x0015, 0x003a, 0x0000, 0x2000, 0x0015, 0x003a, - 0x0010, 0x1010, 0x0004, 0x0911, 0x0003, 0x004f, 0x0012, 0x7849, - 0x0003, 0x11dc, 0x0010, 0x0dfe, 0x0003, 0x6150, 0x0012, 0x0c10, - 0x0010, 0xff0c, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, - 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb309, - 0x000b, 0x8174, 0x0010, 0xb3fe, 0x0013, 0x617c, 0x0010, 0xb30b, - 0x0015, 0x0033, 0x0010, 0xc00a, 0x001b, 0x817a, 0x0003, 0x01d1, - 0x0000, 0xc00b, 0x0010, 0xc00a, 0x0003, 0x01d1, 0x0000, 0x78b0, - 0x0012, 0xb044, 0x0003, 0x11dc, 0x0002, 0xb049, 0x0003, 0x11dc, - 0x0010, 0x71ff, 0x0012, 0xff38, 0x0010, 0xff71, 0x0010, 0x0dfe, - 0x0003, 0x614e, 0x0012, 0x0c10, 0x0010, 0xff0c, 0x0015, 0x0030, - 0x0000, 0x0400, 0x0011, 0x0d88, 0x0010, 0x0003, 0x0000, 0xff31, - 0x0015, 0x0033, 0x0000, 0xb309, 0x001b, 0x8192, 0x0010, 0xb3fe, - 0x0003, 0x619a, 0x0000, 0xb309, 0x0015, 0x0033, 0x0010, 0xc00a, - 0x001b, 0x8198, 0x0003, 0x01d1, 0x0010, 0xc009, 0x0000, 0xc008, - 0x0003, 0x01d1, 0x0000, 0x78b0, 0x0012, 0xb044, 0x0003, 0x11dc, - 0x0002, 0xb049, 0x0003, 0x11dc, 0x0010, 0x71ff, 0x0012, 0xff38, - 0x0010, 0xff71, 0x0010, 0x0dfe, 0x0003, 0x614e, 0x0012, 0x0c10, - 0x0010, 0xff0c, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, - 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb309, - 0x001b, 0x81b0, 0x0010, 0xb3fe, 0x0003, 0x61b8, 0x0000, 0xb305, - 0x0015, 0x0033, 0x0010, 0xc00a, 0x001b, 0x81b6, 0x0013, 0x01ba, - 0x0010, 0xc005, 0x0000, 0xc004, 0x0002, 0x033f, 0x0002, 0xff27, - 0x0000, 0x0db8, 0x0014, 0x03c2, 0x0000, 0x0db8, 0x0014, 0x0925, - 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0xbc88, 0x0010, 0x0000, - 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb309, 0x001b, 0x81c7, - 0x0011, 0xb3e8, 0x0000, 0x0002, 0x000b, 0x114e, 0x0005, 0x0002, - 0x0010, 0x0005, 0x0003, 0x0150, 0x0012, 0x7849, 0x0003, 0x11dc, - 0x0003, 0x0150, 0x0000, 0x0db8, 0x0012, 0x0345, 0x000b, 0x11d7, - 0x0002, 0x033f, 0x0014, 0x03c2, 0x0003, 0x014e, 0x0002, 0x033f, - 0x0002, 0xff27, 0x0014, 0x03c2, 0x0014, 0x0925, 0x0003, 0x014e, - 0x0015, 0x00b8, 0x0000, 0x0001, 0x0015, 0x003a, 0x0010, 0x0101, - 0x0014, 0x0925, 0x0003, 0x015f, 0x0001, 0x2bd8, 0x0010, 0x0000, - 0x0000, 0xffba, 0x0003, 0xb1e5, 0x0005, 0x002a, 0x0000, 0x0002, - 0x0001, 0xbac8, 0x0000, 0x0700, 0x000b, 0x12d2, 0x0011, 0x15e8, - 0x0000, 0x0002, 0x0013, 0x1248, 0x0011, 0x15e8, 0x0000, 0x0001, - 0x0003, 0x11f4, 0x0005, 0x0015, 0x0010, 0x0000, 0x0003, 0x022b, - 0x0005, 0x0015, 0x0010, 0x0000, 0x0002, 0xba43, 0x0003, 0x122c, - 0x0003, 0xb1f8, 0x0005, 0x002a, 0x0000, 0x0004, 0x0012, 0xba42, - 0x0003, 0x1232, 0x0012, 0x104b, 0x000b, 0x122b, 0x0000, 0x1a30, - 0x0005, 0x0031, 0x0000, 0x0002, 0x0015, 0x0033, 0x0000, 0x1b2a, - 0x001b, 0x8204, 0x0011, 0x20d8, 0x0010, 0x0000, 0x0000, 0xffb0, - 0x0001, 0x21d8, 0x0010, 0x0000, 0x0010, 0xffb1, 0x0001, 0x22d8, - 0x0010, 0x0000, 0x0010, 0xffb2, 0x0011, 0x23d8, 0x0010, 0x0000, - 0x0000, 0xffb3, 0x0001, 0x24d8, 0x0010, 0x0000, 0x0010, 0xffb4, - 0x0011, 0x25d8, 0x0010, 0x0000, 0x0000, 0xffb5, 0x0001, 0x28d8, - 0x0010, 0x0000, 0x0010, 0xffb8, 0x0011, 0x29d8, 0x0010, 0x0000, - 0x0000, 0xffb9, 0x0000, 0x1a30, 0x0005, 0x0031, 0x0000, 0x0007, - 0x0015, 0x0033, 0x0010, 0xb032, 0x000b, 0x8222, 0x0000, 0x1a30, - 0x0005, 0x0031, 0x0010, 0x000f, 0x0015, 0x0033, 0x0010, 0xb812, - 0x000b, 0x8228, 0x0005, 0x0015, 0x0010, 0x0000, 0x0013, 0x0035, - 0x0000, 0x1efe, 0x0013, 0x6240, 0x0014, 0x0277, 0x0000, 0x1efe, - 0x000c, 0x6277, 0x0003, 0x022b, 0x0000, 0x1a30, 0x0005, 0x0031, - 0x0000, 0x0020, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x8237, - 0x0002, 0xb02f, 0x0000, 0xffb0, 0x0005, 0x0031, 0x0000, 0x0020, - 0x0015, 0x0033, 0x0000, 0xb00a, 0x001b, 0x823e, 0x0003, 0x01ff, - 0x0015, 0x00b8, 0x0010, 0x0005, 0x0014, 0x0925, 0x0000, 0x13b8, - 0x0015, 0x003a, 0x0010, 0x0404, 0x0014, 0x0925, 0x0003, 0x022b, - 0x0005, 0x0015, 0x0000, 0x0001, 0x0012, 0xba42, 0x0013, 0x1256, - 0x0003, 0xb24c, 0x0001, 0x2bd8, 0x0010, 0x0000, 0x0012, 0xff4f, - 0x000b, 0x11e2, 0x0002, 0xba43, 0x001b, 0x1232, 0x0000, 0x1efe, - 0x000c, 0x6277, 0x0003, 0x022b, 0x0001, 0x28d8, 0x0010, 0x0000, - 0x0010, 0xffb8, 0x0011, 0x29d8, 0x0010, 0x0000, 0x0000, 0xffb9, - 0x0014, 0x02e8, 0x0002, 0x3a42, 0x000b, 0x122b, 0x0000, 0x1c30, - 0x0015, 0x00ff, 0x0000, 0x0002, 0x0002, 0x1f43, 0x001b, 0x1267, - 0x0001, 0xff88, 0x0000, 0x0002, 0x0003, 0x0269, 0x0001, 0xff88, - 0x0000, 0x0004, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb011, - 0x000b, 0x826c, 0x0000, 0xb0ff, 0x0011, 0x16a0, 0x0000, 0xff16, - 0x001b, 0x2273, 0x0002, 0xb100, 0x0003, 0x0274, 0x0010, 0xb1ff, - 0x0001, 0x17a0, 0x0010, 0xff17, 0x0013, 0x0232, 0x0000, 0x16ff, - 0x0001, 0x18a0, 0x0010, 0xff00, 0x000b, 0x227e, 0x0002, 0x1700, - 0x0013, 0x12d1, 0x0013, 0x027f, 0x0010, 0x17ff, 0x0011, 0x19a0, - 0x0013, 0x22d1, 0x0011, 0x00d0, 0x0013, 0x12d1, 0x0000, 0x1c30, - 0x0000, 0x1b31, 0x0015, 0x0033, 0x0000, 0xb131, 0x000b, 0x8287, - 0x0013, 0xb288, 0x0000, 0xb120, 0x0010, 0xb221, 0x0002, 0x1f43, - 0x001b, 0x1294, 0x0010, 0xc022, 0x0000, 0xc023, 0x0000, 0xb324, - 0x0000, 0xb425, 0x0010, 0xb3b5, 0x0000, 0xb4b6, 0x0013, 0x0298, - 0x0000, 0xb322, 0x0000, 0xb423, 0x0000, 0xb524, 0x0010, 0xb625, - 0x0003, 0xb298, 0x0005, 0x002a, 0x0000, 0x0001, 0x0012, 0x1500, - 0x0000, 0xff15, 0x0000, 0x16ff, 0x0001, 0xb580, 0x0000, 0xff16, - 0x000b, 0x22a3, 0x0002, 0x1700, 0x0013, 0x02a4, 0x0010, 0x17ff, - 0x0001, 0xb680, 0x0010, 0xff17, 0x0012, 0x1e10, 0x0010, 0xff1e, - 0x0003, 0x62d1, 0x0002, 0x1d00, 0x0010, 0xff1d, 0x0010, 0xc030, - 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x82af, - 0x0010, 0xb0fe, 0x000b, 0x62d0, 0x0000, 0x1c30, 0x0005, 0x0031, - 0x0000, 0x0001, 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x82b7, - 0x0010, 0xb0fe, 0x001b, 0x62bd, 0x0005, 0x00ce, 0x0010, 0x0005, - 0x0003, 0x08e7, 0x0010, 0xb01c, 0x0000, 0x1c30, 0x0005, 0x0031, - 0x0000, 0x0019, 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x82c3, - 0x0001, 0xb0c8, 0x0010, 0x00ff, 0x0000, 0xff1f, 0x0010, 0xc030, - 0x0011, 0xbe80, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, - 0x000b, 0x82cc, 0x0000, 0xb01d, 0x0010, 0x1dff, 0x0013, 0x02ab, - 0x0000, 0xb01b, 0x0017, 0x4000, 0x0002, 0x3a41, 0x0003, 0x12da, - 0x0013, 0xb2d4, 0x0005, 0x002a, 0x0000, 0x0004, 0x0005, 0x0015, - 0x0010, 0x0000, 0x0003, 0x022b, 0x0000, 0x1a30, 0x0005, 0x0031, - 0x0000, 0x0002, 0x0015, 0x0033, 0x0000, 0x1b2a, 0x001b, 0x82df, - 0x0015, 0x00b8, 0x0000, 0x0004, 0x0014, 0x0925, 0x0000, 0x13b8, - 0x0015, 0x003a, 0x0010, 0x0404, 0x0014, 0x0925, 0x0013, 0x0039, - 0x0002, 0x1e00, 0x0010, 0xff1e, 0x0012, 0x1d10, 0x0010, 0xff1d, - 0x0010, 0xc030, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, - 0x000b, 0x82f0, 0x0010, 0xb0fe, 0x001b, 0x6315, 0x0000, 0x1cff, - 0x0001, 0x1ae0, 0x0013, 0x12ff, 0x0000, 0x1c30, 0x0005, 0x0031, - 0x0010, 0x0000, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x82fb, - 0x0010, 0xb0fe, 0x001b, 0x62ff, 0x0000, 0x1aff, 0x0000, 0xff1c, - 0x0000, 0x1c30, 0x0005, 0x0031, 0x0000, 0x0019, 0x0015, 0x0033, - 0x0000, 0xb009, 0x001b, 0x8305, 0x0001, 0xb0c8, 0x0010, 0x000f, - 0x0000, 0xff1f, 0x0001, 0xbf80, 0x0010, 0xff1d, 0x0010, 0xc030, - 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x830f, - 0x0010, 0xb0fe, 0x001b, 0x6315, 0x0005, 0x00ce, 0x0010, 0x0006, - 0x0003, 0x08e7, 0x0000, 0xb01b, 0x0017, 0x4000, 0x0010, 0x79b0, - 0x0000, 0xd0ff, 0x0012, 0xff40, 0x001b, 0x1039, 0x0015, 0x00d1, - 0x0010, 0x0101, 0x0013, 0x931d, 0x0005, 0x0079, 0x0000, 0x0002, - 0x0003, 0x9320, 0x0015, 0x00d1, 0x0000, 0x0100, 0x0010, 0x13fe, - 0x0013, 0x6371, 0x0012, 0xb04e, 0x001b, 0x139a, 0x0000, 0x78b0, - 0x0002, 0xb045, 0x0003, 0x13a0, 0x0012, 0x784a, 0x0003, 0x13a0, - 0x0000, 0x75ff, 0x0011, 0xffc8, 0x0010, 0x1800, 0x001b, 0x13a0, - 0x0001, 0x0fe8, 0x0000, 0x0001, 0x001b, 0x133c, 0x0015, 0x0030, - 0x0000, 0x0400, 0x0011, 0x1388, 0x0000, 0x000e, 0x0000, 0xff31, - 0x0015, 0x0033, 0x0000, 0x8f0a, 0x001b, 0x833a, 0x0013, 0x03a6, - 0x0001, 0x0fe8, 0x0000, 0x0002, 0x001b, 0x1347, 0x0015, 0x0030, - 0x0000, 0x0400, 0x0005, 0x0031, 0x0000, 0x001a, 0x0015, 0x0033, - 0x0010, 0xc00a, 0x000b, 0x8345, 0x0013, 0x03a6, 0x0001, 0x0fe8, - 0x0010, 0x0000, 0x0003, 0x134e, 0x0005, 0x00ce, 0x0000, 0x0007, - 0x0010, 0x0fcf, 0x0003, 0x08e1, 0x0002, 0xd142, 0x0013, 0x1367, - 0x0015, 0x00d1, 0x0000, 0x0400, 0x0011, 0x13e8, 0x0001, 0x1b55, - 0x000b, 0x1367, 0x0005, 0x0031, 0x0011, 0x1b6d, 0x0015, 0x0033, - 0x0010, 0xb409, 0x001b, 0x8359, 0x0002, 0xb400, 0x0010, 0xffb4, - 0x0005, 0x0031, 0x0011, 0x1b6d, 0x0015, 0x0033, 0x0010, 0xb40a, - 0x001b, 0x8360, 0x0012, 0xd042, 0x0003, 0x1371, 0x0015, 0x00b8, - 0x0000, 0x000d, 0x0014, 0x0925, 0x0003, 0x0054, 0x0000, 0x13b8, - 0x0002, 0x1045, 0x0003, 0x136f, 0x0012, 0x103f, 0x0002, 0xff27, - 0x0014, 0x03c2, 0x0014, 0x0925, 0x0013, 0x0371, 0x0012, 0x103f, - 0x0014, 0x03c2, 0x0015, 0x000f, 0x0010, 0x0000, 0x0002, 0x3944, - 0x0013, 0x137a, 0x0015, 0x0039, 0x0000, 0x5040, 0x0015, 0x00b8, - 0x0000, 0x0008, 0x0014, 0x0925, 0x0015, 0x0030, 0x0000, 0x0400, - 0x0001, 0xbd88, 0x0010, 0x000c, 0x0000, 0xff31, 0x0015, 0x0033, - 0x0010, 0xc00a, 0x001b, 0x8381, 0x0000, 0xff31, 0x0015, 0x0033, - 0x0010, 0xc00a, 0x000b, 0x8385, 0x0010, 0xc014, 0x0000, 0xc013, - 0x0000, 0xc010, 0x0000, 0xa4ff, 0x0003, 0x6392, 0x0011, 0xffa8, - 0x0010, 0x0005, 0x000b, 0x2392, 0x0015, 0x00d1, 0x0010, 0x0404, - 0x0015, 0x003a, 0x0000, 0x8000, 0x0002, 0x3a47, 0x0003, 0x1399, - 0x0015, 0x003a, 0x0000, 0x8000, 0x0015, 0x003a, 0x0010, 0x4040, - 0x0004, 0x08ec, 0x0013, 0x0039, 0x0015, 0x00b8, 0x0010, 0x0003, - 0x0015, 0x003a, 0x0010, 0x0202, 0x0014, 0x0925, 0x0003, 0x0389, - 0x0015, 0x00b8, 0x0000, 0x0002, 0x0015, 0x003a, 0x0010, 0x0202, - 0x0014, 0x0925, 0x0003, 0x0389, 0x0015, 0x0030, 0x0000, 0x0400, - 0x0011, 0x1388, 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, - 0x0000, 0xb009, 0x000b, 0x83ad, 0x0011, 0x1388, 0x0010, 0x0003, - 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xc00a, 0x000b, 0x83b3, - 0x0010, 0xb0fe, 0x0013, 0x63b8, 0x0000, 0xb012, 0x0003, 0x03ba, - 0x0010, 0xc012, 0x0010, 0xc011, 0x0012, 0x104b, 0x0003, 0x134e, - 0x0002, 0x103b, 0x0010, 0xff03, 0x0005, 0x0002, 0x0010, 0x0000, - 0x0000, 0xc00d, 0x0013, 0x034e, 0x0000, 0xffb0, 0x0010, 0xc3b1, - 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0xb888, 0x0010, 0x0011, - 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb012, 0x000b, 0x83cb, - 0x0017, 0x4000, 0x0002, 0xd142, 0x001b, 0x1485, 0x0012, 0x3a43, - 0x0003, 0x13de, 0x0015, 0x003a, 0x0000, 0x0800, 0x0010, 0x0db0, - 0x0013, 0x63de, 0x0000, 0x0bff, 0x0001, 0xb0e0, 0x0003, 0x1407, - 0x0010, 0x09ff, 0x0001, 0xb0e0, 0x0003, 0x13eb, 0x0010, 0x05ff, - 0x0001, 0xb0e0, 0x0003, 0x13e2, 0x0000, 0xc00e, 0x0000, 0x05fe, - 0x0013, 0x63e8, 0x0000, 0x050d, 0x0005, 0x0002, 0x0000, 0x0004, - 0x0014, 0x046c, 0x0002, 0x3a47, 0x001b, 0x146b, 0x0013, 0x0402, - 0x0000, 0x09fe, 0x0013, 0x6404, 0x0000, 0x090d, 0x0005, 0x0002, - 0x0000, 0x0001, 0x0014, 0x049a, 0x0015, 0x0030, 0x0000, 0x0400, - 0x0011, 0x0d88, 0x0000, 0x0004, 0x0000, 0xff31, 0x0015, 0x0033, - 0x0000, 0xba09, 0x001b, 0x83f5, 0x0011, 0x03c8, 0x0010, 0x000f, - 0x0000, 0xffb6, 0x0011, 0xb6e8, 0x0000, 0x0001, 0x0003, 0x153f, - 0x0011, 0xb6e8, 0x0000, 0x0002, 0x0013, 0x1561, 0x0011, 0xb6e8, - 0x0010, 0x0003, 0x0003, 0x1653, 0x0004, 0x08ec, 0x0013, 0x046b, - 0x0010, 0x0bfe, 0x0013, 0x646b, 0x0010, 0x0b0d, 0x0005, 0x0002, - 0x0000, 0x0002, 0x0014, 0x049a, 0x0015, 0x0030, 0x0000, 0x0400, - 0x0011, 0x0d88, 0x0000, 0x0004, 0x0000, 0xff31, 0x0015, 0x0033, - 0x0000, 0xba09, 0x000b, 0x8411, 0x0000, 0xb930, 0x0005, 0x0031, - 0x0010, 0x0021, 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x8417, - 0x0001, 0xb0a8, 0x0000, 0x199a, 0x0013, 0x241d, 0x0005, 0x00b0, - 0x0000, 0x1999, 0x0012, 0xb050, 0x0000, 0xffb0, 0x0002, 0xff50, - 0x0002, 0xff50, 0x0001, 0xb080, 0x0000, 0xffb0, 0x0015, 0x0030, - 0x0000, 0x0400, 0x0011, 0x0d88, 0x0010, 0x0006, 0x0000, 0xff31, - 0x0015, 0x0033, 0x0000, 0xb00a, 0x001b, 0x842a, 0x0000, 0xb930, - 0x0005, 0x0031, 0x0000, 0x0019, 0x0015, 0x0033, 0x0000, 0xb009, - 0x000b, 0x8430, 0x0001, 0xb0c8, 0x0010, 0x00ff, 0x0001, 0xffe8, - 0x0010, 0x0048, 0x000b, 0x14a9, 0x0005, 0x0002, 0x0010, 0x0006, - 0x0012, 0x0c10, 0x0010, 0xff0c, 0x0015, 0x0030, 0x0000, 0x0400, - 0x0011, 0x0d88, 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, - 0x0010, 0xb109, 0x000b, 0x8441, 0x0000, 0xb10b, 0x000b, 0x6445, - 0x0010, 0xb10a, 0x0015, 0x0033, 0x0010, 0xc00a, 0x000b, 0x8447, - 0x0002, 0x032b, 0x0010, 0xff03, 0x0011, 0x0d88, 0x0010, 0x0011, - 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0x030a, 0x001b, 0x844f, - 0x0000, 0x11fe, 0x000b, 0x6454, 0x0000, 0x0d12, 0x0013, 0x045d, - 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0x1188, 0x0010, 0x0003, - 0x0000, 0xff31, 0x0010, 0x0db0, 0x0015, 0x0033, 0x0000, 0xb00a, - 0x000b, 0x845c, 0x0000, 0x0d11, 0x0013, 0x046b, 0x0002, 0xd142, - 0x0003, 0x1462, 0x0013, 0x0485, 0x0000, 0x05fe, 0x0013, 0x646b, - 0x0005, 0x0002, 0x0000, 0x0004, 0x0000, 0x050d, 0x0014, 0x046c, - 0x0002, 0x3a47, 0x001b, 0x146b, 0x0004, 0x08ec, 0x0013, 0x0047, - 0x0001, 0xc7c8, 0x0010, 0x0028, 0x000b, 0x1484, 0x0015, 0x0030, - 0x0000, 0x0400, 0x0011, 0x0d88, 0x0010, 0x000a, 0x0000, 0xff31, - 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x8476, 0x0002, 0xb04f, - 0x0013, 0x1484, 0x0001, 0x0fe8, 0x0010, 0x0000, 0x0013, 0x1482, - 0x0001, 0x0fe8, 0x0000, 0x0002, 0x0013, 0x1482, 0x0015, 0x003a, - 0x0010, 0x8080, 0x0003, 0x0484, 0x0015, 0x003a, 0x0010, 0x4040, - 0x0017, 0x4000, 0x0000, 0x12fe, 0x001b, 0x604f, 0x0015, 0x0012, - 0x0001, 0x1b55, 0x0015, 0x0011, 0x0001, 0x1b55, 0x0001, 0x1288, - 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xc00a, - 0x000b, 0x8490, 0x0005, 0x00b0, 0x0000, 0x8000, 0x0001, 0x1288, - 0x0010, 0x0011, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb00a, - 0x001b, 0x8498, 0x0003, 0x004f, 0x0015, 0x0030, 0x0000, 0x0400, - 0x0011, 0x0d88, 0x0010, 0x0011, 0x0000, 0xff31, 0x0015, 0x0033, - 0x0010, 0x0309, 0x001b, 0x84a1, 0x0011, 0x0d88, 0x0010, 0x0005, - 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb909, 0x001b, 0x84a7, - 0x0017, 0x4000, 0x0005, 0x00b6, 0x0010, 0x0600, 0x0014, 0x0683, - 0x0004, 0x051b, 0x0000, 0xb05a, 0x0000, 0xb15b, 0x0005, 0x0054, - 0x0010, 0x0829, 0x0010, 0x0d58, 0x0015, 0x0059, 0x0010, 0xffff, - 0x0000, 0xb930, 0x0005, 0x0031, 0x0010, 0x001e, 0x0015, 0x0033, - 0x0000, 0xb009, 0x001b, 0x84b9, 0x0000, 0xb05c, 0x0005, 0x0031, - 0x0000, 0x001f, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x84bf, - 0x0001, 0xb0c8, 0x0010, 0x000f, 0x000b, 0x14c6, 0x0015, 0x00ff, - 0x0010, 0x0005, 0x0013, 0x04ce, 0x0002, 0xb040, 0x0003, 0x14cb, - 0x0015, 0x00ff, 0x0000, 0x0004, 0x0013, 0x04ce, 0x0001, 0xb0c8, - 0x0010, 0x0006, 0x0002, 0xff60, 0x0010, 0xffb2, 0x0015, 0x0030, - 0x0000, 0x0400, 0x0011, 0x0d88, 0x0000, 0x0019, 0x0000, 0xff31, - 0x0015, 0x0033, 0x0010, 0xb109, 0x001b, 0x84d6, 0x0012, 0xb170, - 0x0011, 0xffc8, 0x0010, 0xff00, 0x0011, 0xb2d0, 0x0010, 0xff60, - 0x0002, 0xb045, 0x0013, 0x14e1, 0x0015, 0x00b2, 0x0000, 0x0002, - 0x0003, 0x04eb, 0x0002, 0xb046, 0x0003, 0x14e6, 0x0015, 0x00b2, - 0x0000, 0x0001, 0x0003, 0x04eb, 0x0015, 0x00b2, 0x0010, 0x0000, - 0x0000, 0xc0b0, 0x0010, 0xc0b1, 0x0013, 0x04f1, 0x0000, 0xb930, - 0x0005, 0x0031, 0x0010, 0x002b, 0x0015, 0x0033, 0x0000, 0xb011, - 0x000b, 0x84f0, 0x0010, 0xb16a, 0x0010, 0xb06b, 0x0000, 0xb261, - 0x0015, 0x0044, 0x0010, 0x0018, 0x0000, 0xb930, 0x0005, 0x0031, - 0x0000, 0x0023, 0x0015, 0x0033, 0x0000, 0x6241, 0x001b, 0x84fb, - 0x0003, 0x94fc, 0x0015, 0x00a0, 0x0000, 0x0020, 0x0012, 0xd041, - 0x000b, 0x14ff, 0x0015, 0x00d1, 0x0010, 0x0202, 0x0013, 0x9503, - 0x0000, 0x75ff, 0x0011, 0xffc8, 0x0000, 0x1804, 0x0001, 0xffd8, - 0x0010, 0x0009, 0x0013, 0x9509, 0x0000, 0xff75, 0x0003, 0x950b, - 0x0015, 0x00d1, 0x0000, 0x0200, 0x0015, 0x0030, 0x0000, 0x0400, - 0x0001, 0xbd88, 0x0000, 0x0008, 0x0000, 0xff31, 0x0015, 0x00b1, - 0x0010, 0x07d0, 0x0005, 0x00b0, 0x0010, 0x0009, 0x0015, 0x0033, - 0x0000, 0xb012, 0x000b, 0x8519, 0x0013, 0x046b, 0x0000, 0xba30, - 0x0005, 0x0031, 0x0010, 0x0035, 0x0015, 0x0033, 0x0000, 0xb009, - 0x000b, 0x8520, 0x0002, 0xb040, 0x0003, 0x153c, 0x0015, 0x0030, - 0x0000, 0x0400, 0x0005, 0x0031, 0x0001, 0x1b71, 0x0015, 0x0033, - 0x0000, 0xb011, 0x000b, 0x8529, 0x0002, 0xb100, 0x0010, 0xffb1, - 0x001b, 0x2530, 0x0012, 0xb000, 0x0000, 0xffb0, 0x0013, 0x252a, - 0x0015, 0x0033, 0x0000, 0xb012, 0x000b, 0x8532, 0x0015, 0x0030, - 0x0000, 0x0400, 0x0011, 0x0d88, 0x0000, 0x0013, 0x0000, 0xff31, - 0x0015, 0x0033, 0x0000, 0xb012, 0x001b, 0x853a, 0x0003, 0x053e, - 0x0010, 0xc0b1, 0x0000, 0xc0b0, 0x0017, 0x4000, 0x0005, 0x00b6, - 0x0010, 0x0500, 0x0014, 0x0683, 0x0005, 0x0054, 0x0010, 0x0889, - 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, 0x0000, 0x0002, - 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x854b, - 0x0010, 0xb058, 0x0000, 0x0d59, 0x0000, 0xb930, 0x0005, 0x0031, - 0x0000, 0x0023, 0x0015, 0x0033, 0x0000, 0xb011, 0x001b, 0x8553, - 0x0010, 0xb15c, 0x0010, 0xb05d, 0x0005, 0x0031, 0x0010, 0x002b, - 0x0015, 0x0033, 0x0000, 0xb011, 0x001b, 0x855a, 0x0000, 0xb15e, - 0x0000, 0xb05f, 0x0003, 0x955d, 0x0015, 0x00a0, 0x0010, 0x000c, - 0x0003, 0x0668, 0x0005, 0x00b6, 0x0000, 0x0700, 0x0014, 0x0683, - 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, 0x0010, 0x0009, - 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xb709, 0x000b, 0x856b, - 0x0012, 0xb749, 0x0003, 0x1571, 0x0005, 0x0054, 0x0010, 0x0889, - 0x0003, 0x0573, 0x0005, 0x0054, 0x0010, 0x0898, 0x0015, 0x0030, - 0x0000, 0x0400, 0x0011, 0x0d88, 0x0000, 0x0002, 0x0000, 0xff31, - 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x857a, 0x0010, 0xb058, - 0x0000, 0x0d59, 0x0001, 0xb9c8, 0x0010, 0xf000, 0x0001, 0xffe8, - 0x0010, 0xf000, 0x001b, 0x15a3, 0x0015, 0x0030, 0x0000, 0x0400, - 0x0011, 0x0d88, 0x0010, 0x0005, 0x0000, 0xff31, 0x0015, 0x0033, - 0x0000, 0xb009, 0x000b, 0x8589, 0x0001, 0xb0c8, 0x0000, 0xf700, - 0x0000, 0xffb0, 0x0011, 0xb0e8, 0x0000, 0xf100, 0x0013, 0x15ea, - 0x0011, 0xb0e8, 0x0000, 0xf200, 0x0013, 0x15ef, 0x0011, 0xb0e8, - 0x0010, 0xf300, 0x0003, 0x1614, 0x0011, 0xb0e8, 0x0000, 0xf400, - 0x0013, 0x1619, 0x0011, 0xb0e8, 0x0010, 0xf500, 0x0013, 0x15ea, - 0x0011, 0xb0e8, 0x0010, 0xf600, 0x0003, 0x162b, 0x0005, 0x00ce, - 0x0010, 0x0009, 0x0000, 0xb0cf, 0x0003, 0x08e1, 0x0000, 0xb930, - 0x0005, 0x0031, 0x0000, 0x0025, 0x0015, 0x0033, 0x0000, 0xb039, - 0x000b, 0x85a8, 0x0012, 0xb749, 0x0013, 0x15ad, 0x0002, 0xb52c, - 0x0000, 0xffb5, 0x0000, 0xb162, 0x0000, 0xb063, 0x0005, 0x0031, - 0x0000, 0x001f, 0x0015, 0x0033, 0x0000, 0xb309, 0x000b, 0x85b3, - 0x0001, 0xb3c8, 0x0010, 0x0003, 0x0003, 0x15bb, 0x0010, 0xffb2, - 0x0001, 0xffe8, 0x0010, 0x0003, 0x001b, 0x15bd, 0x0000, 0xc2b7, - 0x0013, 0x0647, 0x0001, 0xb2e8, 0x0000, 0x0001, 0x0013, 0x15c4, - 0x0005, 0x00ce, 0x0010, 0x000a, 0x0010, 0xb2cf, 0x0003, 0x08e1, - 0x0010, 0xb465, 0x0010, 0xb667, 0x0015, 0x00b7, 0x0010, 0x0018, - 0x0001, 0xb5c8, 0x0010, 0x0300, 0x0013, 0x15e9, 0x0012, 0xb548, - 0x0013, 0x15d0, 0x0000, 0xb6ff, 0x0011, 0xb780, 0x0010, 0xffb7, - 0x0002, 0xb549, 0x0013, 0x15d5, 0x0010, 0xb4ff, 0x0011, 0xb780, - 0x0010, 0xffb7, 0x0015, 0x0044, 0x0010, 0x0018, 0x0005, 0x0031, - 0x0000, 0x002c, 0x0015, 0x0033, 0x0000, 0x6841, 0x001b, 0x85db, - 0x0015, 0x0044, 0x0000, 0x0019, 0x0005, 0x0031, 0x0000, 0x0034, - 0x0015, 0x0033, 0x0000, 0x5029, 0x001b, 0x85e2, 0x0015, 0x0044, - 0x0000, 0x0008, 0x0011, 0xb7c8, 0x0010, 0x0003, 0x0013, 0x15e9, - 0x0010, 0xff55, 0x0013, 0x0647, 0x0005, 0x00b5, 0x0000, 0x0008, - 0x0015, 0x00b7, 0x0010, 0x0018, 0x0013, 0x0647, 0x0015, 0x0030, - 0x0000, 0x0400, 0x0011, 0x0d88, 0x0000, 0x000b, 0x0000, 0xff31, - 0x0015, 0x0033, 0x0000, 0xb011, 0x001b, 0x85f6, 0x0010, 0xb1ff, - 0x0001, 0xb0d0, 0x0003, 0x15ff, 0x0005, 0x00b5, 0x0010, 0x0b02, - 0x0010, 0xb062, 0x0010, 0xb163, 0x0003, 0x0601, 0x0005, 0x00b5, - 0x0000, 0x0302, 0x0015, 0x0065, 0x0010, 0x0012, 0x0005, 0x0067, - 0x0000, 0x0008, 0x0015, 0x006c, 0x0000, 0x7000, 0x0005, 0x006d, - 0x0010, 0x0500, 0x0015, 0x006f, 0x0010, 0x000a, 0x0015, 0x0044, - 0x0000, 0x0001, 0x0005, 0x0052, 0x0000, 0x2500, 0x0015, 0x0044, - 0x0000, 0x0008, 0x0015, 0x00b7, 0x0000, 0x0032, 0x0013, 0x0647, - 0x0005, 0x00b5, 0x0010, 0x0028, 0x0015, 0x00b7, 0x0010, 0x0018, - 0x0013, 0x0647, 0x0005, 0x00b5, 0x0000, 0x0100, 0x0005, 0x0067, - 0x0000, 0x0008, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, - 0x0010, 0x0018, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, - 0x001b, 0x8624, 0x0001, 0xb0c8, 0x0010, 0x00ff, 0x0010, 0xff69, - 0x0015, 0x00b7, 0x0000, 0x0020, 0x0013, 0x0647, 0x0015, 0x0030, - 0x0000, 0x0400, 0x0011, 0x0d88, 0x0010, 0x0005, 0x0000, 0xff31, - 0x0015, 0x0033, 0x0000, 0xb609, 0x000b, 0x8632, 0x0001, 0xb6c8, - 0x0010, 0xff00, 0x0000, 0xffb0, 0x0015, 0x0033, 0x0000, 0xb00a, - 0x000b, 0x8638, 0x0001, 0xb6c8, 0x0010, 0x00ff, 0x0012, 0xff10, - 0x001b, 0x1641, 0x0000, 0xffb5, 0x0015, 0x00b7, 0x0010, 0x0018, - 0x0013, 0x0647, 0x0010, 0xff63, 0x0005, 0x00b5, 0x0000, 0x0800, - 0x0015, 0x00b7, 0x0010, 0x0018, 0x0013, 0x0647, 0x0015, 0x0030, - 0x0000, 0x0400, 0x0011, 0x0d88, 0x0010, 0x0009, 0x0000, 0xff31, - 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x864e, 0x0010, 0xb561, - 0x0013, 0x9650, 0x0010, 0xb7a0, 0x0003, 0x0668, 0x0005, 0x00b6, - 0x0010, 0x0300, 0x0014, 0x0683, 0x0005, 0x0054, 0x0010, 0x0819, - 0x0010, 0x0d58, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, - 0x0000, 0x0002, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, - 0x001b, 0x8660, 0x0000, 0xb059, 0x0003, 0x9662, 0x0010, 0xc0a0, - 0x0010, 0x71ff, 0x0002, 0xff28, 0x0010, 0xff71, 0x0003, 0x0668, - 0x0012, 0xd041, 0x000b, 0x1668, 0x0015, 0x00d1, 0x0010, 0x0202, - 0x0000, 0x75ff, 0x0011, 0xffc8, 0x0000, 0x1804, 0x0001, 0xffd8, - 0x0010, 0x0009, 0x0013, 0x9671, 0x0000, 0xff75, 0x0003, 0x9673, - 0x0015, 0x00d1, 0x0000, 0x0200, 0x0015, 0x0030, 0x0000, 0x0400, - 0x0001, 0xbd88, 0x0000, 0x0008, 0x0000, 0xff31, 0x0005, 0x00b0, - 0x0010, 0x0009, 0x0015, 0x00b1, 0x0010, 0x07d0, 0x0015, 0x0033, - 0x0000, 0xb012, 0x001b, 0x8681, 0x0013, 0x046b, 0x0015, 0x0044, - 0x0000, 0x0008, 0x0005, 0x0098, 0x0010, 0x0056, 0x0015, 0x0099, - 0x0000, 0x9575, 0x0004, 0x08a8, 0x0000, 0xb096, 0x0012, 0xb270, - 0x0010, 0xff56, 0x0014, 0x08ca, 0x0010, 0xb052, 0x0010, 0xb153, - 0x0000, 0xb6ff, 0x0011, 0xb2d0, 0x0010, 0xff50, 0x0010, 0xb351, - 0x0017, 0x4000, 0x0001, 0x12e8, 0x0001, 0x1b55, 0x0003, 0x1845, - 0x0015, 0x00d1, 0x0000, 0x0400, 0x0015, 0x0030, 0x0000, 0x0400, - 0x0001, 0x1288, 0x0010, 0x0011, 0x0000, 0xff31, 0x0015, 0x0033, - 0x0000, 0x1009, 0x000b, 0x86a1, 0x0015, 0x000f, 0x0000, 0x0001, - 0x0010, 0xc014, 0x0000, 0x1213, 0x0015, 0x0030, 0x0000, 0x0400, - 0x0011, 0x1388, 0x0000, 0x0004, 0x0000, 0xff31, 0x0015, 0x0033, - 0x0000, 0xba09, 0x000b, 0x86ad, 0x0015, 0x0030, 0x0000, 0x0400, - 0x0011, 0x1388, 0x0010, 0x0005, 0x0000, 0xff31, 0x0015, 0x0033, - 0x0000, 0x1a09, 0x000b, 0x86b5, 0x0012, 0x104b, 0x001b, 0x16be, - 0x0000, 0x1a30, 0x0005, 0x0031, 0x0000, 0x000b, 0x0015, 0x0033, - 0x0000, 0x1621, 0x001b, 0x86bd, 0x0010, 0x15fe, 0x000b, 0x66dd, - 0x0004, 0x0704, 0x0002, 0x3a42, 0x000b, 0x1703, 0x0001, 0x10c8, - 0x0010, 0x000f, 0x000b, 0x1766, 0x0015, 0x0030, 0x0000, 0x0400, - 0x0011, 0x1388, 0x0000, 0x0008, 0x0000, 0xff31, 0x0015, 0x0033, - 0x0000, 0xb009, 0x000b, 0x86cd, 0x0011, 0xb0e8, 0x0010, 0x0009, - 0x0003, 0x16d4, 0x0011, 0xb0e8, 0x0000, 0x0001, 0x001b, 0x1702, - 0x0011, 0x1388, 0x0010, 0x000a, 0x0000, 0xff31, 0x0015, 0x0033, - 0x0000, 0xb009, 0x000b, 0x86d9, 0x0002, 0xb04f, 0x001b, 0x16f9, - 0x0013, 0x0702, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x1388, - 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, - 0x001b, 0x86e4, 0x0015, 0x0033, 0x0010, 0xc00a, 0x001b, 0x86e7, - 0x0010, 0xb0fe, 0x0003, 0x66ec, 0x0000, 0xb012, 0x0013, 0x06ee, - 0x0010, 0xc012, 0x0010, 0xc011, 0x0015, 0x000f, 0x0010, 0x0000, - 0x0002, 0x3944, 0x0013, 0x16f7, 0x0015, 0x0039, 0x0000, 0x5040, - 0x0015, 0x00b8, 0x0000, 0x0008, 0x0014, 0x0925, 0x0000, 0xc013, - 0x0003, 0x0703, 0x0010, 0x02fe, 0x0003, 0x66fe, 0x0015, 0x003a, - 0x0010, 0x2020, 0x0003, 0x0703, 0x0015, 0x003a, 0x0000, 0x2000, - 0x0015, 0x003a, 0x0010, 0x1010, 0x0004, 0x0911, 0x0003, 0x0054, - 0x0003, 0xb704, 0x0005, 0x002a, 0x0000, 0x0004, 0x0000, 0xba30, - 0x0005, 0x0031, 0x0010, 0x001b, 0x0015, 0x0033, 0x0000, 0xb009, - 0x000b, 0x870c, 0x0000, 0xc02c, 0x0000, 0xb02d, 0x0012, 0x104b, - 0x0013, 0x1727, 0x0000, 0x1a30, 0x0005, 0x0031, 0x0000, 0x0023, - 0x0015, 0x0033, 0x0000, 0xb129, 0x001b, 0x8716, 0x0000, 0xb120, - 0x0010, 0xb221, 0x0000, 0xb322, 0x0000, 0xb423, 0x0000, 0xb524, - 0x0000, 0xc025, 0x0010, 0xb526, 0x0010, 0xc027, 0x0010, 0xb516, - 0x0010, 0xc017, 0x0000, 0xb518, 0x0000, 0xc019, 0x0010, 0xc028, - 0x0000, 0xc029, 0x0010, 0xc01e, 0x0013, 0x075d, 0x0012, 0x1044, - 0x0003, 0x1757, 0x0002, 0x1034, 0x0000, 0xff10, 0x0000, 0x1a30, - 0x0005, 0x0031, 0x0000, 0x0002, 0x0015, 0x0033, 0x0000, 0x1b29, - 0x000b, 0x8730, 0x0000, 0x1c30, 0x0000, 0x1b31, 0x0015, 0x0033, - 0x0000, 0xb131, 0x000b, 0x8735, 0x0002, 0x1f43, 0x000b, 0x173c, - 0x0010, 0xb3b5, 0x0000, 0xb4b6, 0x0000, 0xc0b3, 0x0010, 0xc0b4, - 0x0000, 0xb120, 0x0010, 0xb221, 0x0000, 0xb322, 0x0000, 0xb423, - 0x0000, 0xb524, 0x0010, 0xb625, 0x0010, 0xb516, 0x0000, 0xb617, - 0x0000, 0x1826, 0x0000, 0x1927, 0x0000, 0x1a30, 0x0005, 0x0031, - 0x0010, 0x000f, 0x0015, 0x0033, 0x0000, 0xb011, 0x000b, 0x874b, - 0x0000, 0xb028, 0x0000, 0xb129, 0x0012, 0x1e10, 0x0010, 0xff1e, - 0x0013, 0x675d, 0x0002, 0x1d00, 0x0010, 0xff1d, 0x0004, 0x02ab, - 0x0002, 0x3a42, 0x0003, 0x175d, 0x0003, 0x0765, 0x0000, 0x1a30, - 0x0005, 0x0031, 0x0000, 0x0002, 0x0015, 0x0033, 0x0000, 0x1b79, - 0x000b, 0x875c, 0x0003, 0xb75d, 0x0005, 0x002a, 0x0000, 0x0001, - 0x0005, 0x0015, 0x0000, 0x0001, 0x0000, 0x1efe, 0x0003, 0x6765, - 0x0003, 0x0277, 0x0017, 0x4000, 0x0000, 0xba30, 0x0005, 0x0031, - 0x0010, 0x001b, 0x0015, 0x0033, 0x0010, 0xb051, 0x001b, 0x876b, - 0x0000, 0xb0a3, 0x0010, 0xb697, 0x0010, 0xb946, 0x0015, 0x00a5, - 0x0000, 0x0010, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x1388, - 0x0000, 0x0002, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb509, - 0x000b, 0x8778, 0x0014, 0x08ca, 0x0004, 0x08b9, 0x0012, 0xb470, - 0x0010, 0xffb4, 0x0010, 0xb48e, 0x0010, 0xb08a, 0x0010, 0xb18b, - 0x0012, 0x104d, 0x0003, 0x1783, 0x0013, 0x07b0, 0x0012, 0x104b, - 0x0013, 0x1796, 0x0005, 0x008c, 0x0010, 0x0829, 0x0010, 0xc08d, - 0x0001, 0xb2d8, 0x0010, 0x0600, 0x0010, 0xff88, 0x0010, 0xb389, - 0x0000, 0x1390, 0x0010, 0xb591, 0x0000, 0xc08f, 0x0010, 0x1ab9, - 0x0004, 0x051b, 0x0013, 0x9791, 0x0010, 0xb092, 0x0010, 0xb193, - 0x0013, 0x9794, 0x0013, 0x07ab, 0x0005, 0x008c, 0x0000, 0x0809, - 0x0015, 0x008d, 0x0000, 0x0008, 0x0001, 0xb2d8, 0x0000, 0x0100, - 0x0010, 0xff88, 0x0010, 0xb389, 0x0000, 0x1390, 0x0010, 0xb591, - 0x0000, 0xc08f, 0x0000, 0x1a30, 0x0005, 0x0031, 0x0010, 0x000f, - 0x0015, 0x0033, 0x0000, 0xb011, 0x000b, 0x87a6, 0x0013, 0x97a7, - 0x0000, 0xb192, 0x0000, 0xb093, 0x0003, 0x97aa, 0x0010, 0x19a1, - 0x0000, 0x18a2, 0x0015, 0x00b1, 0x0010, 0x0096, 0x0003, 0x0821, - 0x0000, 0xb590, 0x0010, 0x1391, 0x0001, 0x10c8, 0x0010, 0x000f, - 0x0001, 0xffe8, 0x0010, 0x0005, 0x0013, 0x17d7, 0x0001, 0xb2d8, - 0x0000, 0x0700, 0x0010, 0xff88, 0x0010, 0xb389, 0x0015, 0x0030, - 0x0000, 0x0400, 0x0011, 0x1388, 0x0010, 0x0009, 0x0000, 0xff31, - 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x87c2, 0x0002, 0xb049, - 0x0013, 0x17ca, 0x0005, 0x008c, 0x0010, 0x0889, 0x0015, 0x00b1, - 0x0010, 0x0096, 0x0013, 0x07ce, 0x0005, 0x008c, 0x0010, 0x0898, - 0x0015, 0x00b1, 0x0000, 0x0092, 0x0010, 0xc08d, 0x0000, 0xc08f, - 0x0013, 0x97d0, 0x0000, 0xc092, 0x0010, 0xc093, 0x0013, 0x97d3, - 0x0010, 0x19a1, 0x0000, 0x18a2, 0x0003, 0x0821, 0x0001, 0xb2d8, - 0x0000, 0x0100, 0x0010, 0xff88, 0x0010, 0xb389, 0x0005, 0x008c, - 0x0010, 0x0880, 0x0015, 0x008d, 0x0000, 0x0008, 0x0015, 0x0030, - 0x0000, 0x0400, 0x0011, 0x1388, 0x0000, 0x000e, 0x0000, 0xff31, - 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x87e6, 0x0010, 0xb08f, - 0x0000, 0xb590, 0x0010, 0x1391, 0x0000, 0x1a30, 0x0005, 0x0031, - 0x0000, 0x000d, 0x0015, 0x0033, 0x0000, 0xb021, 0x001b, 0x87ef, - 0x0003, 0x97f0, 0x0010, 0xb392, 0x0010, 0xb293, 0x0003, 0x97f3, - 0x0000, 0xb1a1, 0x0010, 0xb0a2, 0x0015, 0x0030, 0x0000, 0x0400, - 0x0011, 0x1388, 0x0000, 0x000b, 0x0000, 0xff31, 0x0015, 0x0033, - 0x0010, 0xb211, 0x001b, 0x87fd, 0x0000, 0xb3ff, 0x0001, 0xb080, - 0x0000, 0xffb3, 0x001b, 0x2804, 0x0002, 0xb200, 0x0003, 0x0805, - 0x0010, 0xb2ff, 0x0011, 0xb180, 0x0010, 0xffb2, 0x0011, 0x1388, - 0x0000, 0x000b, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xb212, - 0x000b, 0x880c, 0x0015, 0x00b1, 0x0000, 0x0092, 0x0002, 0x104c, - 0x0003, 0x181f, 0x0011, 0xc2e8, 0x0010, 0x000c, 0x000b, 0x1817, - 0x0015, 0x00ff, 0x0000, 0x0800, 0x0013, 0x081f, 0x0011, 0xc2e8, - 0x0000, 0x0020, 0x000b, 0x181d, 0x0015, 0x00ff, 0x0010, 0x1800, - 0x0013, 0x081f, 0x0015, 0x00ff, 0x0000, 0x1000, 0x0011, 0xb1d0, - 0x0010, 0xffb1, 0x0015, 0x009a, 0x0010, 0x0036, 0x0005, 0x009b, - 0x0000, 0x95d5, 0x0012, 0xd041, 0x001b, 0x1825, 0x0015, 0x00d1, - 0x0010, 0x0202, 0x0013, 0x9829, 0x0012, 0x104e, 0x0013, 0x182e, - 0x0012, 0xb12f, 0x0010, 0xffb1, 0x0000, 0xb175, 0x0013, 0x982f, - 0x0015, 0x00d1, 0x0000, 0x0200, 0x0001, 0x19c8, 0x0010, 0xfff0, - 0x001b, 0x1838, 0x0015, 0x00b1, 0x0010, 0x07d0, 0x0003, 0x083a, - 0x0015, 0x00b1, 0x0000, 0x1b58, 0x0005, 0x00b0, 0x0010, 0x0009, - 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0xbd88, 0x0000, 0x000b, - 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb012, 0x001b, 0x8843, - 0x0003, 0x0703, 0x0015, 0x0030, 0x0000, 0x0400, 0x0000, 0xa4ff, - 0x0003, 0x6893, 0x0011, 0xffa8, 0x0010, 0x0005, 0x000b, 0x2893, - 0x0005, 0x0031, 0x0001, 0x1b6c, 0x0015, 0x0033, 0x0010, 0xb211, - 0x000b, 0x8850, 0x0002, 0xb200, 0x0010, 0xffb2, 0x0005, 0x0031, - 0x0001, 0x1b6c, 0x0015, 0x0033, 0x0010, 0xb20a, 0x001b, 0x8857, - 0x0015, 0x000f, 0x0000, 0x0001, 0x0000, 0x1213, 0x0005, 0x0010, - 0x0000, 0x8000, 0x0015, 0x00a3, 0x0000, 0x0200, 0x0000, 0xc697, - 0x0005, 0x0046, 0x0000, 0x0002, 0x0015, 0x00a5, 0x0000, 0x0010, - 0x0011, 0xc4d8, 0x0000, 0x3200, 0x0010, 0xff88, 0x0000, 0xc589, - 0x0010, 0xc48a, 0x0010, 0xc58b, 0x0010, 0xc08e, 0x0005, 0x008c, - 0x0010, 0xe109, 0x0010, 0xc08d, 0x0015, 0x0090, 0x0001, 0x1b55, - 0x0005, 0x0091, 0x0010, 0xffff, 0x0000, 0xb292, 0x0000, 0xb393, - 0x0015, 0x009a, 0x0010, 0x0056, 0x0005, 0x009b, 0x0010, 0x95f5, - 0x0012, 0xd042, 0x0003, 0x1886, 0x0005, 0x00b0, 0x0010, 0x8080, - 0x0011, 0x1388, 0x0010, 0x0011, 0x0000, 0xff31, 0x0015, 0x0033, - 0x0000, 0xb00a, 0x000b, 0x8881, 0x0015, 0x00b8, 0x0010, 0x000c, - 0x0014, 0x0925, 0x0003, 0x0888, 0x0005, 0x0075, 0x0010, 0x8092, - 0x0015, 0x00b1, 0x0010, 0x07d0, 0x0005, 0x00b0, 0x0010, 0x0009, - 0x0001, 0xbd88, 0x0000, 0x000b, 0x0000, 0xff31, 0x0015, 0x0033, - 0x0000, 0xb012, 0x001b, 0x8891, 0x0003, 0x0703, 0x0015, 0x00d1, - 0x0000, 0x0400, 0x0001, 0x1288, 0x0010, 0x0003, 0x0000, 0xff31, - 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x889a, 0x0001, 0x1288, - 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xc00a, - 0x000b, 0x88a0, 0x0010, 0xb0fe, 0x0003, 0x68a5, 0x0000, 0xb012, - 0x0003, 0x0703, 0x0010, 0xc012, 0x0010, 0xc011, 0x0003, 0x0703, - 0x0000, 0xba30, 0x0005, 0x0031, 0x0010, 0x0021, 0x0015, 0x0033, - 0x0010, 0xb019, 0x001b, 0x88ad, 0x0002, 0xb200, 0x0011, 0xffc8, - 0x0010, 0x00ff, 0x0010, 0xffb2, 0x0010, 0xb2b7, 0x0005, 0x0031, - 0x0000, 0x0023, 0x0015, 0x0033, 0x0010, 0xb20a, 0x000b, 0x88b7, - 0x0017, 0x4000, 0x0000, 0xba30, 0x0005, 0x0031, 0x0000, 0x0023, - 0x0015, 0x0033, 0x0010, 0xb409, 0x000b, 0x88be, 0x0002, 0xb400, - 0x0011, 0xffc8, 0x0010, 0x00ff, 0x0010, 0xffb4, 0x0010, 0xb4b7, - 0x0005, 0x0031, 0x0000, 0x0023, 0x0015, 0x0033, 0x0010, 0xb40a, - 0x001b, 0x88c8, 0x0017, 0x4000, 0x0000, 0xba30, 0x0001, 0xc7c8, - 0x0000, 0x0020, 0x001b, 0x18d6, 0x0005, 0x0031, 0x0010, 0x0028, - 0x0015, 0x0033, 0x0010, 0xb209, 0x000b, 0x88d2, 0x0011, 0xb2c8, - 0x0000, 0xff80, 0x0003, 0x18d9, 0x0010, 0xc4b0, 0x0010, 0xc5b1, - 0x0003, 0x08db, 0x0010, 0xc6b1, 0x0000, 0xc0b0, 0x0005, 0x0031, - 0x0000, 0x0004, 0x0015, 0x0033, 0x0010, 0xb211, 0x001b, 0x88df, - 0x0017, 0x4000, 0x0015, 0x00b8, 0x0010, 0x0009, 0x0015, 0x003a, - 0x0010, 0x0707, 0x0014, 0x0925, 0x0013, 0x002d, 0x0015, 0x00b8, - 0x0010, 0x0009, 0x0015, 0x003a, 0x0010, 0x0707, 0x0003, 0x0925, - 0x0004, 0x011c, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, - 0x0000, 0x0004, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xba09, - 0x001b, 0x88f4, 0x0004, 0x08a8, 0x0015, 0x0030, 0x0000, 0x0400, - 0x0011, 0x0d88, 0x0000, 0x0010, 0x0000, 0xff31, 0x0015, 0x0033, - 0x0010, 0xb20a, 0x001b, 0x88fd, 0x0015, 0x0030, 0x0000, 0x0400, - 0x0011, 0x0d88, 0x0010, 0x0011, 0x0000, 0xff31, 0x0015, 0x0033, - 0x0010, 0x0309, 0x001b, 0x8905, 0x0002, 0x0327, 0x0010, 0xffb2, - 0x0011, 0x0d88, 0x0010, 0x0011, 0x0000, 0xff31, 0x0015, 0x0033, - 0x0010, 0xb20a, 0x000b, 0x890d, 0x0015, 0x00b8, 0x0010, 0x0006, - 0x0003, 0x0925, 0x0014, 0x012e, 0x0004, 0x08a8, 0x0015, 0x0030, - 0x0000, 0x0400, 0x0011, 0x1388, 0x0000, 0x0010, 0x0000, 0xff31, - 0x0015, 0x0033, 0x0010, 0xb20a, 0x000b, 0x891a, 0x0012, 0x1027, - 0x0010, 0xffb2, 0x0011, 0x1388, 0x0010, 0x0011, 0x0000, 0xff31, - 0x0015, 0x0033, 0x0010, 0xb20a, 0x001b, 0x8922, 0x0015, 0x00b8, - 0x0000, 0x0007, 0x0013, 0x4925, 0x0000, 0xb838, 0x0017, 0x4000, - 0x9a8c, 0xaf3d +struct firmware ql2322_fw = { + .size = sizeof(ql2322_fw_bin), + .data = ql2322_fw_bin }; -unsigned short xseqipx_code_length01 = 0x1252; diff --git a/drivers/scsi/qla2xxx/ql2400.c b/drivers/scsi/qla2xxx/ql2400.c deleted file mode 100644 index 77914fcfa..000000000 --- a/drivers/scsi/qla2xxx/ql2400.c +++ /dev/null @@ -1,138 +0,0 @@ -/* - * QLogic Fibre Channel HBA Driver - * Copyright (c) 2003-2005 QLogic Corporation - * - * See LICENSE.qla2xxx for copyright and licensing details. - */ -#include -#include -#include - -#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", - }, - { - .drv_name = qla_driver_name, - .isp_name = "ISP5422", - .fw_info = qla_fw_tbl, - .fw_fname = "ql2400_fw.bin", - }, - { - .drv_name = qla_driver_name, - .isp_name = "ISP5432", - .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], - }, - { - .vendor = PCI_VENDOR_ID_QLOGIC, - .device = PCI_DEVICE_ID_QLOGIC_ISP5422, - .subvendor = PCI_ANY_ID, - .subdevice = PCI_ANY_ID, - .driver_data = (unsigned long)&qla_board_tbl[2], - }, - { - .vendor = PCI_VENDOR_ID_QLOGIC, - .device = PCI_DEVICE_ID_QLOGIC_ISP5432, - .subvendor = PCI_ANY_ID, - .subdevice = PCI_ANY_ID, - .driver_data = (unsigned long)&qla_board_tbl[3], - }, - - {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 index 282b2d33e..de4e84092 100644 --- a/drivers/scsi/qla2xxx/ql2400_fw.c +++ b/drivers/scsi/qla2xxx/ql2400_fw.c @@ -1,12346 +1,16705 @@ /* - * QLogic Fibre Channel HBA Driver - * Copyright (c) 2003-2005 QLogic Corporation + * Firmware version 4.0.23 from + * + * ftp://ftp.qlogic.com/outgoing/linux/firmware/ql2400_fw.bin + * + * xxd -g 1 -i ql2400_fw.bin | indent -l80 -i8 -o ql2400_fw.c * - * See LICENSE.qla2xxx for copyright and licensing details. - */ -#include - -/* - * Firmware Version 4.00.18 (14:53 Jan 30, 2006) */ -#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,18}; -#else -uint32_t firmware_version[] = {4, 0,18}; -#endif - -#ifdef UNIQUE_FW_NAME -#define fw2400_VERSION_STRING "4.00.18" -#else -#define FW_VERSION_STRING "4.00.18" -#endif +#include -#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, 0x0010d000, 0x00100000, 0x0000a971, - 0x00000004, 0x00000000, 0x00000012, 0x00000002, - 0x00000003, 0x00000000, 0x20434f50, 0x59524947, - 0x48542032, 0x30303520, 0x514c4f47, 0x49432043, - 0x4f52504f, 0x52415449, 0x4f4e2020, 0x20495350, - 0x32347878, 0x20466972, 0x6d776172, 0x65202020, - 0x56657273, 0x696f6e20, 0x342e302e, 0x31382020, - 0x20202024, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x42001800, 0x0010014f, 0x42002000, 0x0010b6fd, - 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, 0x00100743, 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, - 0x0010073a, 0x0402004e, 0x58042003, 0x42001000, - 0xffffffff, 0x0201f800, 0x0010073a, 0x04020048, - 0x58042003, 0x42001000, 0x00ffffff, 0x0201f800, - 0x0010073a, 0x04020042, 0x58042003, 0x42001000, - 0x00ffffff, 0x0201f800, 0x0010073a, 0x0402003c, - 0x42000000, 0x00100001, 0x5000a000, 0x8250a400, - 0x00000004, 0x4200a800, 0x00020000, 0x5850b003, - 0x0201f800, 0x0010a93e, 0x8250a400, 0x00000005, - 0x4a0370e8, 0x00000003, 0x4200a800, 0x0000c000, - 0x5850b003, 0x0201f800, 0x0010a93e, 0x4a0378e8, - 0x00000003, 0x4200a800, 0x00008000, 0x5850b003, - 0x0201f800, 0x0010a93e, 0x0401f02b, 0x42000800, - 0x00020000, 0x58042003, 0x42001000, 0xffffffff, - 0x0201f800, 0x0010073a, 0x04020019, 0x4a0370e8, - 0x00000003, 0x42000800, 0x0000c000, 0x58042003, - 0x82102500, 0x00ffffff, 0x42001000, 0x00ffffff, - 0x0201f800, 0x0010073a, 0x0402000d, 0x4a0378e8, - 0x00000003, 0x42000800, 0x00008000, 0x58042003, - 0x82102500, 0x00ffffff, 0x42001000, 0x00ffffff, - 0x0201f800, 0x0010073a, 0x0400000b, 0x4a03c020, - 0x00004010, 0x4a03c011, 0x40100011, 0x04006000, - 0x4203e000, 0x40000000, 0x4203e000, 0x30000001, - 0x0401f000, 0x0201f800, 0x001007d7, 0x42001000, - 0x0010a971, 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, 0x59a8006f, - 0x84000540, 0x4803506f, 0x0401f00a, 0x59e00003, - 0x82000500, 0x00030000, 0x82000580, 0x00010000, - 0x04020004, 0x59a8006f, 0x84000542, 0x4803506f, - 0x42000800, 0x00000040, 0x59a8006f, 0x8c000502, - 0x0402000e, 0x42000800, 0x00001000, 0x82141480, - 0x0017ffff, 0x04021009, 0x80040902, 0x82141480, - 0x0013ffff, 0x04021005, 0x80040902, 0x82141480, - 0x0011ffff, 0x04001bc8, 0x4807500e, 0x42001000, - 0x00000024, 0x0201f800, 0x001063cf, 0x82040c00, - 0x0010cfc0, 0x4807500b, 0x4a03c810, 0x00100000, - 0x4a03c811, 0x0010a971, 0x4a03c829, 0x00000004, - 0x59e40001, 0x82000540, 0x0003001d, 0x4803c801, - 0x4a03c014, 0x001c001c, 0x42001000, 0x0000001c, - 0x0201f800, 0x00100728, 0x4202c000, 0x0010cfc0, - 0x59aab00b, 0x59aaa00b, 0x59aaa80b, 0x59aac80e, - 0x49675069, 0x59a8000b, 0x4803500c, 0x0201f800, - 0x001006a3, 0x0201f800, 0x0010768a, 0x0201f800, - 0x00100804, 0x0201f800, 0x0010084d, 0x0201f800, - 0x00101a60, 0x0201f800, 0x001013a4, 0x0201f800, - 0x001009b6, 0x0201f800, 0x001013a4, 0x0201f800, - 0x00100f9a, 0x0201f800, 0x0010640f, 0x0401fb54, - 0x0201f800, 0x00101fb5, 0x0201f800, 0x0010508b, - 0x0201f800, 0x00104b36, 0x0201f800, 0x00105ecd, - 0x0201f800, 0x00105c61, 0x0201f800, 0x0010143d, - 0x0201f800, 0x001012bf, 0x4203e000, 0xf0000001, - 0x4a035070, 0x00000014, 0x4a035071, 0x0000000b, - 0x4a035072, 0x00000001, 0x4a035073, 0x00000000, - 0x42000000, 0x00001000, 0x50000000, 0x82000480, - 0x24220001, 0x0400004a, 0x59e00002, 0x8c00051e, - 0x42000000, 0x7ffe00fe, 0x04000003, 0x42000000, - 0x7ffe01fe, 0x50000800, 0x48075058, 0x80040920, - 0x82040580, 0x0000013e, 0x0402000b, 0x59a8006f, - 0x84000548, 0x4803506f, 0x4a035070, 0x00000055, - 0x4a035071, 0x00000051, 0x4a035073, 0x0000000f, - 0x0401f033, 0x82040580, 0x0000013f, 0x0402000b, - 0x59a8006f, 0x8400054a, 0x4803506f, 0x4a035070, - 0x00000055, 0x4a035071, 0x00000051, 0x4a035073, - 0x0000000f, 0x0401f026, 0x59e00003, 0x82000500, - 0x00030000, 0x82000580, 0x00000000, 0x04020020, - 0x82040580, 0x00000147, 0x04000010, 0x82040580, - 0x00000145, 0x0402001a, 0x59a8006f, 0x84000546, - 0x4803506f, 0x4a035070, 0x00000033, 0x4a035071, - 0x00000030, 0x4a035072, 0x00000020, 0x4a035073, - 0x00000001, 0x0401f00c, 0x59a8006f, 0x84000544, - 0x4803506f, 0x4a035070, 0x00000033, 0x4a035071, - 0x00000030, 0x4a035072, 0x00000020, 0x4a035073, - 0x00000001, 0x4a0378e4, 0x000c0000, 0x59a8006f, - 0x8c000502, 0x04000004, 0x82000500, 0x00000030, - 0x04000b25, 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, - 0x59a80873, 0x4007f800, 0x0201f000, 0x00020004, - 0x4df00000, 0x4203e000, 0x50000000, 0x416c0000, - 0x82000c80, 0x00000008, 0x04021afb, 0x0c01f804, - 0x5c03e000, 0x0201f000, 0x00020008, 0x00100328, - 0x0010033b, 0x00100411, 0x00100327, 0x0010048c, - 0x00100327, 0x00100327, 0x001005d0, 0x0401faee, - 0x42000800, 0x0010b2a0, 0x5804001d, 0x4803c857, - 0x8c000500, 0x0400000d, 0x84000500, 0x4800081d, - 0x4202d800, 0x00000004, 0x0401fbe8, 0x49f3c857, - 0x5c000800, 0x5c000000, 0x82000540, 0x00003e00, - 0x4c000000, 0x4c040000, 0x1c01f000, 0x0401fbd2, - 0x0201f800, 0x00104e0d, 0x04000010, 0x0201f800, - 0x00104e23, 0x04020035, 0x59940023, 0x82000580, - 0x0010401b, 0x04020004, 0x59940022, 0x800001c0, - 0x0402002e, 0x59c40006, 0x82000540, 0x000000c0, - 0x48038806, 0x0401f029, 0x0201f800, 0x00104d76, - 0x836c0580, 0x00000001, 0x040200be, 0x59a80017, - 0x82000580, 0x00000009, 0x040200ba, 0x497b5010, - 0x4a038893, 0x00000001, 0x42001000, 0x000000f0, - 0x0201f800, 0x001019aa, 0x0201f800, 0x00104e1b, - 0x59c41006, 0x04020006, 0x82081540, 0x000000f1, - 0x82081500, 0xbbffffff, 0x0401f003, 0x82081540, - 0x440000f1, 0x480b8806, 0x0201f800, 0x00105de2, - 0x0201f800, 0x001069b8, 0x42000000, 0x0010b638, - 0x0201f800, 0x0010a86e, 0x42001000, 0x00008030, - 0x497b5013, 0x0401f037, 0x0201f800, 0x00103951, - 0x59c400a4, 0x82000500, 0x0000000f, 0x82000480, - 0x00000007, 0x04021093, 0x0201f800, 0x00105de2, - 0x59c400a3, 0x82000500, 0xffefffff, 0x480388a3, - 0x59a8004b, 0x800001c0, 0x04020004, 0x0201f800, - 0x00103f53, 0x0401f087, 0x59a80015, 0x84000546, - 0x48035015, 0x0201f800, 0x00104e13, 0x59c41006, - 0x04020006, 0x82081540, 0x44000001, 0x82081500, - 0xffffff0f, 0x0401f003, 0x82081540, 0x440000f1, - 0x480b8806, 0x497b9005, 0x4a038802, 0x0000ffff, - 0x4a0378e4, 0x00003000, 0x4a0378e4, 0x000c0000, - 0x42000000, 0x0010b60a, 0x0201f800, 0x0010a86e, - 0x59a81010, 0x42000800, 0x00000003, 0x0201f800, - 0x001069af, 0x42001000, 0x00008010, 0x59a8180a, - 0x0201f800, 0x00103857, 0x0201f800, 0x00101886, - 0x59a80805, 0x82040d00, 0xffffffdf, 0x48075005, - 0x0201f800, 0x0010468b, 0x0201f800, 0x00104e0d, - 0x0400000a, 0x0201f800, 0x00103f58, 0x04000007, - 0x4a035013, 0x00000001, 0x497b5021, 0x0201f800, - 0x00103a9f, 0x0401f04f, 0x0201f800, 0x0010473b, - 0x04000005, 0x59c41002, 0x8408150c, 0x480b8802, - 0x0401f012, 0x0201f800, 0x00104e0d, 0x04020006, - 0x59a8001d, 0x80000540, 0x02000800, 0x001090d5, - 0x0401f00a, 0x0201f800, 0x001090d5, 0x59a80026, - 0x8c000506, 0x04020005, 0x59a8001d, 0x80000540, - 0x02020800, 0x00104075, 0x497b5028, 0x497b5027, - 0x497b5018, 0x0201f800, 0x00104e0d, 0x59a81026, - 0x0402000a, 0x0201f800, 0x00101694, 0x80001580, - 0x59a8002a, 0x82000500, 0xffff0000, 0x80040d40, - 0x4807502a, 0x0401f005, 0x59a8002a, 0x82000500, - 0xffff0000, 0x4803502a, 0x599c0017, 0x8c00050a, - 0x04000002, 0x84081544, 0x480b5026, 0x0201f800, - 0x00104e0d, 0x04000004, 0x0201f800, 0x00101694, - 0x48078880, 0x42001000, 0x00000005, 0x0201f800, - 0x00106e07, 0x497b5028, 0x497b501b, 0x4a03501c, - 0x0000ffff, 0x4a0378e4, 0x000000c0, 0x4202d800, - 0x00000002, 0x0201f800, 0x00104e0d, 0x04000007, - 0x59a80026, 0x82000500, 0x0000000c, 0x82000580, - 0x00000004, 0x04000003, 0x0201f800, 0x00101bf0, - 0x1c01f000, 0x59a8001c, 0x82000580, 0x0000ffff, - 0x04000004, 0x0201f800, 0x00101bf0, 0x0401f074, - 0x59a80026, 0x8c00050a, 0x04020003, 0x8c000506, - 0x0400001c, 0x8c000500, 0x0400001a, 0x4a038802, - 0x0000ffbf, 0x8c000502, 0x04000016, 0x599c0018, - 0x8c000516, 0x04020010, 0x59a80027, 0x82000580, - 0x0000ffff, 0x0400000c, 0x0201f800, 0x00101d45, - 0x59a80026, 0x8c000504, 0x0402005d, 0x42001000, - 0x00000003, 0x417a5800, 0x0201f800, 0x00101d6a, - 0x0401f057, 0x59a80028, 0x80000540, 0x04020054, - 0x59a80026, 0x8c000508, 0x04020005, 0x59a8001b, - 0x80000540, 0x0402004e, 0x0401f003, 0x8c000516, - 0x0400004b, 0x0201f800, 0x0010473b, 0x04020048, - 0x599c0018, 0x8c000516, 0x04020004, 0x0201f800, - 0x00104abe, 0x04020042, 0x599c0017, 0x8c00050a, - 0x0400000d, 0x4200b000, 0x000007f0, 0x417a8800, - 0x0201f800, 0x00020267, 0x04020004, 0x59340200, - 0x8c00051a, 0x04020036, 0x81468800, 0x8058b040, - 0x040207f8, 0x4a038802, 0x0000ffff, 0x42001800, - 0x0010b2e7, 0x0401fb98, 0x42001800, 0x0010b2f4, - 0x0401fb95, 0x59a80005, 0x84000502, 0x48035005, - 0x4a0378e4, 0x00000080, 0x4202d800, 0x00000003, - 0x4a03501c, 0x0000ffff, 0x0401fa8b, 0x80000580, - 0x0201f800, 0x001015fa, 0x599c0018, 0x8c000516, - 0x04000004, 0x0201f800, 0x00103929, 0x0401f009, - 0x42001800, 0x0000ffff, 0x42002000, 0x00000006, - 0x42003000, 0x00000000, 0x0201f800, 0x001038c7, - 0x0201f800, 0x00104e23, 0x0400000b, 0x59c40006, - 0x0201f800, 0x00104e0d, 0x04000004, 0x82000500, - 0xffffff0f, 0x0401f003, 0x82000500, 0xfbffffff, - 0x48038806, 0x0201f800, 0x00106c8a, 0x1c01f000, - 0x4c040000, 0x4c080000, 0x4c100000, 0x59a8003e, - 0x82000c80, 0x00000004, 0x04021983, 0x0c01f805, - 0x5c002000, 0x5c001000, 0x5c000800, 0x1c01f000, - 0x0010049c, 0x00100527, 0x00100553, 0x001005b4, - 0x42000000, 0x00000001, 0x0201f800, 0x001015fa, - 0x0201f800, 0x00105de2, 0x59c408a3, 0x82040d00, - 0xfffffff7, 0x480788a3, 0x0201f800, 0x00104e13, - 0x0400000e, 0x0201f800, 0x00104e23, 0x0400000b, - 0x0201f800, 0x00104e1b, 0x04020967, 0x59c400a3, - 0x84000532, 0x84000570, 0x480388a3, 0x4a038808, - 0x00000008, 0x0401f013, 0x59c400a3, 0x84000530, - 0x82000500, 0xbf7fffff, 0x480388a3, 0x42000800, - 0x000000f8, 0x0201f800, 0x00104030, 0x59c400a3, - 0x82000540, 0x00018000, 0x8400051c, 0x480388a3, - 0x82000500, 0xfffeffff, 0x480388a3, 0x497b8808, - 0x59c40006, 0x82000500, 0xfbffff0e, 0x48038806, - 0x497b2822, 0x497b2823, 0x42000800, 0x000001f4, - 0x42001000, 0x001005ce, 0x0201f800, 0x00105cbc, - 0x59c40805, 0x42001000, 0x00000001, 0x0201f800, - 0x001019aa, 0x0201f800, 0x001016ac, 0x0402000a, - 0x42000000, 0x00000001, 0x0201f800, 0x001018fa, - 0x42000000, 0x00000001, 0x0201f800, 0x00101892, - 0x0401f022, 0x0201f800, 0x001016b3, 0x04020008, - 0x41780000, 0x0201f800, 0x001018fa, 0x41780000, - 0x0201f800, 0x00101892, 0x0401f018, 0x0201f800, - 0x001016ba, 0x0402000a, 0x42000000, 0x00000002, - 0x0201f800, 0x001018fa, 0x42000000, 0x00000002, - 0x0201f800, 0x00101892, 0x0401f00c, 0x0201f800, - 0x001016c1, 0x04020918, 0x59a80049, 0x800001c0, - 0x04000006, 0x0201f800, 0x001016c7, 0x4a03503e, - 0x00000001, 0x0401f021, 0x0201f800, 0x00101994, - 0x4a03503e, 0x00000001, 0x0201f800, 0x00104e13, - 0x0400000c, 0x0201f800, 0x00104e23, 0x04000009, - 0x0201f800, 0x00104e1b, 0x04020903, 0x4a035033, - 0x00000001, 0x0201f800, 0x00104d76, 0x0401f00f, - 0x59c400a4, 0x82000500, 0x0000000f, 0x82000580, - 0x00000008, 0x04000003, 0x4a038805, 0x04000000, - 0x59c400a3, 0x82000540, 0x0001c000, 0x480388a3, - 0x84000520, 0x480388a3, 0x1c01f000, 0x0401f8a3, - 0x04020004, 0x4a03503e, 0x00000003, 0x0401f027, - 0x0201f800, 0x001016c1, 0x04020011, 0x59a80049, - 0x800001c0, 0x0400000e, 0x0201f800, 0x001016c7, - 0x59a80048, 0x8c00051e, 0x0400001c, 0x0201f800, - 0x00104e1b, 0x04020009, 0x4a035033, 0x00000001, - 0x0201f800, 0x00104d76, 0x0401f004, 0x0201f800, - 0x00101941, 0x04020011, 0x0201f800, 0x00101886, - 0x4a03503e, 0x00000002, 0x497b5049, 0x59c400a3, - 0x84000520, 0x480388a3, 0x497b2822, 0x497b2823, - 0x42000800, 0x0000002d, 0x42001000, 0x001005ce, - 0x0201f800, 0x00105cbc, 0x1c01f000, 0x0401f877, - 0x04020004, 0x4a03503e, 0x00000003, 0x0401f05b, - 0x4a038805, 0x000000f0, 0x0201f800, 0x00101941, - 0x04020050, 0x0201f800, 0x00104e1b, 0x04000044, - 0x59c400a4, 0x82000500, 0x0000000f, 0x82000580, - 0x00000008, 0x04000020, 0x59c40005, 0x8c000534, - 0x0402001d, 0x59940022, 0x82000580, 0x00000001, - 0x04020046, 0x0201f800, 0x00104e23, 0x04020043, - 0x4a038805, 0x000000f0, 0x0201f800, 0x00104e67, - 0x4a035032, 0x0000aaaa, 0x4a035033, 0x00000000, - 0x59c408a3, 0x82040d40, 0x00000008, 0x480788a3, - 0x4202d800, 0x00000001, 0x4a03503e, 0x00000000, - 0x4a038805, 0x00000001, 0x497b2822, 0x497b2823, - 0x0401f01f, 0x0201f800, 0x00104e23, 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, 0x001016c1, 0x04020004, 0x59a80049, - 0x800001c0, 0x040207a4, 0x497b8885, 0x1c01f000, - 0x4803c856, 0x42000000, 0x00000001, 0x0201f800, - 0x001015fa, 0x4a03503e, 0x00000000, 0x0201f800, - 0x001016c1, 0x0402000b, 0x59a80052, 0x800001c0, - 0x04000004, 0x80000040, 0x48035052, 0x04020005, - 0x4a035052, 0x0000000a, 0x4a035049, 0x00000001, - 0x497b8885, 0x0401f0f6, 0x59940022, 0x59940823, - 0x80040540, 0x1c01f000, 0x497b2823, 0x1c01f000, - 0x4c080000, 0x42001000, 0x000000f0, 0x0201f800, - 0x001019aa, 0x5c001000, 0x1c01f000, 0x4a03505c, - 0x00000004, 0x4a03505d, 0x00000000, 0x4a03505e, - 0x00000012, 0x4a03505f, 0x00000002, 0x4a035010, - 0x00ffffff, 0x0201f800, 0x001090d5, 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, - 0x00020267, 0x04020005, 0x0201f800, 0x00104836, - 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, 0x001069a3, 0x5c000800, - 0x4807c025, 0x80040920, 0x4807c026, 0x5c000000, - 0x4803c023, 0x80000120, 0x4803c024, 0x5c000000, - 0x4803c857, 0x4803c021, 0x80000120, 0x4803c022, - 0x41f80000, 0x4803c027, 0x80000120, 0x4803c028, - 0x42000000, 0x00001000, 0x50000000, 0x82000480, - 0x24320001, 0x4803c857, 0x04001053, 0x42000800, - 0x00000064, 0x80040840, 0x04000007, 0x4a030000, - 0x00000001, 0x40000000, 0x59800000, 0x8c000500, - 0x040007f9, 0x04000046, 0x42000800, 0x0010bfa2, - 0x46000800, 0xfaceface, 0x80040800, 0x4c080000, - 0x4c0c0000, 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, 0x5c001800, 0x5c001000, 0x4a030000, - 0x00000000, 0x485fc020, 0x905cb9c0, 0x825cbd40, - 0x00000012, 0x485fc011, 0x4203e000, 0x40000000, - 0x4202d800, 0x00000005, 0x59e00017, 0x8c000508, - 0x04000003, 0x4a03c017, 0x00000002, 0x4203e000, - 0x30000001, 0x0401f81f, 0x0401f7ff, 0x4a03c850, - 0x0010bfbe, 0x4a03c851, 0x0010cfbd, 0x4a03c853, - 0x00000800, 0x4a03c855, 0x0001eb5a, 0x59e40001, - 0x82000540, 0x00003f00, 0x4803c801, 0x4a03b104, - 0x70000002, 0x4a03a804, 0x70000002, 0x4a03b004, - 0x70000002, 0x42000000, 0x0010b6eb, 0x49780001, - 0x49780002, 0x1c01f000, 0x5c036000, 0x4db00000, - 0x49b3c857, 0x4803c857, 0x1c01f000, 0x1c01f000, - 0x59a8006b, 0x8c000530, 0x040207fe, 0x4c080000, - 0x42001000, 0x00000004, 0x0401f862, 0x5c001000, - 0x4201d000, 0x00028b0a, 0x0201f800, 0x00105dd2, - 0x4c080000, 0x42001000, 0x00000008, 0x0401f859, - 0x5c001000, 0x4201d000, 0x00028b0a, 0x0201f800, - 0x00105dd2, 0x4c080000, 0x42001000, 0x00000010, - 0x0401f850, 0x5c001000, 0x4201d000, 0x00028b0a, - 0x0201f800, 0x00105dd2, 0x0401f7e2, 0x8c00050c, - 0x59a8086b, 0x04020003, 0x84040d30, 0x0401f006, - 0x84040d70, 0x4807506b, 0x42001000, 0x00000000, - 0x0401f040, 0x4807506b, 0x836c0500, 0x00000007, - 0x0c01f001, 0x00100727, 0x0010070d, 0x0010070d, - 0x001006f5, 0x0010071a, 0x0010070d, 0x0010070d, - 0x0010071a, 0x59a8006f, 0x8c000502, 0x04020013, - 0x59c40801, 0x82040d00, 0x00018000, 0x82040580, - 0x00010000, 0x0400000a, 0x82040580, 0x00008000, - 0x04000004, 0x42001000, 0x42004000, 0x0401f006, - 0x42001000, 0x22002000, 0x0401f003, 0x42001000, - 0x12001000, 0x0401f025, 0x42001000, 0x00001004, - 0x0401f022, 0x59a8006f, 0x8c000502, 0x04020008, - 0x59a8006b, 0x8c000534, 0x04020004, 0x42001000, - 0x74057005, 0x0401f819, 0x1c01f000, 0x42001000, - 0x00002008, 0x0401f7fc, 0x59a8006b, 0x8c000534, - 0x0402000a, 0x59a8006f, 0x8c000502, 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, - 0x0010b333, 0x42019800, 0x0010b30a, 0x4179a000, - 0x4179a800, 0x4179b000, 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, 0x0010b604, 0x42031800, 0x0000bf1d, - 0x42032000, 0x0000bf32, 0x42032800, 0x0010b5cc, - 0x42033000, 0x0010b274, 0x42034000, 0x0010b2a0, - 0x42033800, 0x0010b2bf, 0x42034800, 0x0010b342, - 0x42035000, 0x0010b200, 0x42035800, 0x0010aa00, - 0x42030800, 0x0010b301, 0x417b6000, 0x42036800, - 0x00006f00, 0x4203c800, 0x00003000, 0x42037000, - 0x0000ff00, 0x42037800, 0x0000bf00, 0x42038000, - 0x00007700, 0x42038800, 0x00004000, 0x42039000, - 0x00006000, 0x42039800, 0x0010bcda, 0x4203a000, - 0x00007600, 0x4203a800, 0x00007400, 0x4203b000, - 0x00007200, 0x4203b800, 0x00007100, 0x4203c000, - 0x00007000, 0x4203d000, 0x00000000, 0x4203e800, - 0x000200f9, 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, - 0x0401fdf8, 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, 0x0010b652, 0x0201f800, 0x0010a86e, - 0x417a5800, 0x0401f7f9, 0x815eb840, 0x04001008, - 0x416a5800, 0x492fc857, 0x592ed000, 0x497a5800, - 0x497a5801, 0x812e59c0, 0x1c01f000, 0x42000000, - 0x0010b652, 0x0201f800, 0x0010a86e, 0x417ab800, - 0x417a5800, 0x0401f7f8, 0x492fc857, 0x496a5800, - 0x412ed000, 0x815eb800, 0x59c80000, 0x82000540, - 0x00001200, 0x48039000, 0x1c01f000, 0x492fc857, - 0x812e59c0, 0x04000007, 0x592c0001, 0x497a5801, - 0x4c000000, 0x0401fff1, 0x5c025800, 0x0401f7f9, - 0x1c01f000, 0x4807c856, 0x42007000, 0x0010b5f6, - 0x4a007001, 0x00000000, 0x59e00003, 0x82000540, - 0x00008080, 0x4803c003, 0x4a03b805, 0x90000001, - 0x59dc0006, 0x4a03b805, 0x70000000, 0x59dc0006, - 0x4a03b805, 0x30000000, 0x59dc0006, 0x4a03b805, - 0x80000000, 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, 0x0401ff9e, - 0x04000d99, 0x42001000, 0x0010b5f4, 0x452c1000, - 0x4a025801, 0x00000001, 0x4a025802, 0x00000100, - 0x4a025809, 0x00106eac, 0x497a580a, 0x497a580b, - 0x497a580c, 0x0401ff90, 0x04000d8b, 0x42001000, - 0x0010b5f5, 0x452c1000, 0x4a025801, 0x00000000, - 0x4a025802, 0x00000100, 0x4a025809, 0x0010120c, - 0x497a5803, 0x497a5807, 0x497a5808, 0x497a580a, - 0x59a8006f, 0x8c000500, 0x04000006, 0x4a03b805, - 0xe0000001, 0x59dc0006, 0x8c000522, 0x040007fc, - 0x1c01f000, 0x4df00000, 0x4203e000, 0x50000000, - 0x4c380000, 0x40087000, 0x4a007002, 0x00000000, - 0x42007000, 0x0010b5f6, 0x82080400, 0x00000000, - 0x45780000, 0x58380005, 0x48087005, 0x80000540, - 0x04000006, 0x480bc857, 0x82000400, 0x00000000, - 0x44080000, 0x0401f003, 0x480bc857, 0x48087006, - 0x58380001, 0x80000540, 0x0400080c, 0x5c007000, - 0x5c03e000, 0x1c01f000, 0x4c380000, 0x42007000, - 0x0010b5f6, 0x58380001, 0x80000540, 0x04000803, - 0x5c007000, 0x1c01f000, 0x42007000, 0x0010b5f6, - 0x58380001, 0x82000580, 0x00000000, 0x04020012, - 0x58380000, 0x0c01f001, 0x001008d7, 0x001008d6, - 0x001008d6, 0x001008d6, 0x001008d6, 0x001008d6, - 0x001008d6, 0x001008d6, 0x0401fd3f, 0x58380808, - 0x800409c0, 0x04020027, 0x58380006, 0x80000540, - 0x04020002, 0x1c01f000, 0x4803c857, 0x48007002, - 0x40006800, 0x58340000, 0x80000540, 0x04020002, - 0x48007005, 0x48007006, 0x4a03b805, 0x20000000, - 0x59dc0006, 0x4a03b805, 0x30000000, 0x58340007, - 0x4803b800, 0x4803c857, 0x58340008, 0x4803b801, - 0x4803c857, 0x58340004, 0x48007003, 0x58340003, - 0x48007004, 0x4803b803, 0x4803c857, 0x58340001, - 0x8c000500, 0x04000004, 0x4a007001, 0x00000001, - 0x0401f028, 0x4a007001, 0x00000002, 0x0401f03e, - 0x0201f800, 0x001091b3, 0x0201f800, 0x0010a4b8, - 0x04000017, 0x4a03b805, 0x20000000, 0x59dc0006, - 0x4a03b805, 0x30000000, 0x4807b800, 0x480bb801, - 0x4a007003, 0x00000010, 0x480c7009, 0x42001000, - 0x001008be, 0x0201f800, 0x00105cd3, 0x58380008, - 0x82000400, 0x00000004, 0x48007004, 0x4803b803, - 0x4a007001, 0x00000007, 0x0401f023, 0x0201f800, - 0x001091cb, 0x42000800, 0x00000001, 0x42001000, - 0x001008be, 0x0201f800, 0x00105caf, 0x0401f7b7, - 0x4c040000, 0x4c080000, 0x58380803, 0x42001000, - 0x00003fff, 0x82040480, 0x00003fff, 0x04021003, - 0x40041000, 0x80000580, 0x48007003, 0x4803c857, - 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, 0x4803c857, - 0x4a03b805, 0x10000002, 0x5c001000, 0x5c000800, - 0x1c01f000, 0x4c040000, 0x4c380000, 0x42007000, - 0x0010b5f6, 0x59dc0806, 0x4807c857, 0x4a03b805, - 0x20000000, 0x8c040d3e, 0x04000007, 0x8c040d08, - 0x04020cb9, 0x58380001, 0x82000500, 0x00000007, - 0x0c01f804, 0x5c007000, 0x5c000800, 0x1c01f000, - 0x001008c6, 0x0010096c, 0x0010097c, 0x00100615, - 0x00100615, 0x00100615, 0x00100615, 0x0010123a, - 0x4807c856, 0x82040d00, 0x43000f80, 0x04020009, - 0x58380003, 0x80000540, 0x0400001c, 0x59dc0000, - 0x4803b800, 0x59dc0001, 0x4803b801, 0x0401f7ad, - 0x58380802, 0x4a000802, 0x00000200, 0x0401f01d, - 0x4807c856, 0x82040d00, 0x43000f80, 0x04020009, - 0x58380003, 0x80000540, 0x0400000c, 0x59dc0000, - 0x4803b800, 0x59dc0001, 0x4803b801, 0x0401f7b6, - 0x58380002, 0x82000400, 0x00000002, 0x46000000, - 0x00000200, 0x0401f00b, 0x4c340000, 0x58386802, - 0x59dc0000, 0x4803c857, 0x48006807, 0x59dc0001, - 0x48006808, 0x4a006802, 0x00000100, 0x5c006800, - 0x4a007001, 0x00000000, 0x4c300000, 0x58386002, - 0x4833c857, 0x0401f80c, 0x04000009, 0x58300009, - 0x82000c80, 0x0010a971, 0x04021c73, 0x82000c80, - 0x00020000, 0x04001c70, 0x0801f800, 0x5c006000, - 0x0401f71e, 0x803061c0, 0x04000009, 0x59a8000c, - 0x80300480, 0x04001007, 0x59a8000d, 0x80300480, - 0x04021004, 0x82000540, 0x00000001, 0x1c01f000, - 0x80000580, 0x1c01f000, 0x4803c856, 0x4dc00000, - 0x42007000, 0x0010b601, 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, 0x00100f0f, 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, - 0x0401fc01, 0x83c00580, 0x00007700, 0x04000004, - 0x42038000, 0x00007700, 0x0401f7f1, 0x805cb9c0, - 0x0402001d, 0x4200b000, 0x00000020, 0x83b8ac00, - 0x00000020, 0x0201f800, 0x0010a947, 0x4a0370fb, - 0x00000001, 0x4a037020, 0x0010110d, 0x59a80039, - 0x82000500, 0x0000ffff, 0x48037021, 0x4a037035, - 0x0010bbda, 0x4a037030, 0x0010b210, 0x4a037031, - 0x0010aa00, 0x4a037032, 0x0010b315, 0x4a037036, - 0x0010b320, 0x59840002, 0x48037034, 0x4a037038, - 0x00101104, 0x4a0370fb, 0x00000001, 0x4178a000, - 0x4200b000, 0x00000020, 0x83b8ac00, 0x00000000, - 0x0201f800, 0x0010a947, 0x4200b000, 0x00000040, - 0x83b8ac00, 0x00000040, 0x0201f800, 0x0010a947, - 0x805cb9c0, 0x04020004, 0x4a0370e4, 0xaaaaaaaa, - 0x0401f003, 0x4a0370e4, 0xa2aaaa82, 0x4a0370e5, - 0xaaaaaaaa, 0x4a0370e6, 0xaaaaaaaa, 0x4a0370fb, - 0x00000000, 0x4a0370e6, 0xaaaaaaaa, 0x42038000, - 0x00007720, 0x4a038006, 0x90000000, 0x59c00007, - 0x8c00051e, 0x02020800, 0x00100615, 0x42038000, - 0x00007700, 0x4a038006, 0x90000000, 0x59c00007, - 0x8c00051e, 0x02020800, 0x00100615, 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, 0x000208d8, 0x5c027000, 0x5c026000, - 0x1c01f000, 0x4d300000, 0x4d2c0000, 0x4d340000, - 0x4d400000, 0x4cfc0000, 0x4d380000, 0x4d3c0000, - 0x4d440000, 0x4d4c0000, 0x4d480000, 0x4c5c0000, - 0x4c600000, 0x4c640000, 0x4d040000, 0x4cc80000, - 0x4ccc0000, 0x4cf40000, 0x4cf80000, 0x4cfc0000, - 0x0201f800, 0x00020016, 0x5c01f800, 0x5c01f000, - 0x5c01e800, 0x5c019800, 0x5c019000, 0x5c020800, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x5c029000, - 0x5c029800, 0x5c028800, 0x5c027800, 0x5c027000, - 0x5c01f800, 0x5c028000, 0x5c026800, 0x5c025800, - 0x5c026000, 0x1c01f000, 0x493bc857, 0x0201f000, - 0x00020045, 0x83300500, 0x1f000000, 0x04000008, - 0x81326580, 0x80000130, 0x82000c80, 0x00000014, - 0x02021800, 0x00100615, 0x0c01f013, 0x83300500, - 0x000000ff, 0x82000c80, 0x00000007, 0x02021800, - 0x00100615, 0x0c01f025, 0x1c01f000, 0x82000d00, - 0xc0000038, 0x02020800, 0x0010060d, 0x0201f800, - 0x00100615, 0x00000000, 0x00000048, 0x00000054, - 0x00000053, 0x00100ae4, 0x00100b08, 0x00100b03, - 0x00100b28, 0x00100aef, 0x00100afb, 0x00100ae4, - 0x00100b23, 0x00100b64, 0x00100ae4, 0x00100ae4, - 0x00100ae4, 0x00100ae4, 0x00100b67, 0x00100b6d, - 0x00100b7e, 0x00100b8f, 0x00100ae4, 0x00100b98, - 0x00100ba4, 0x00100ae4, 0x00100ae4, 0x00100ae4, - 0x0201f800, 0x00100615, 0x00100aed, 0x00100c3f, - 0x00100b35, 0x00100b59, 0x00100aed, 0x00100aed, - 0x00100aed, 0x0201f800, 0x00100615, 0x4803c856, - 0x59300004, 0x8c00053e, 0x04020005, 0x42027000, - 0x00000055, 0x0201f000, 0x000208d8, 0x0201f800, - 0x00106cb4, 0x040007fa, 0x1c01f000, 0x4803c856, - 0x0401f8aa, 0x40002800, 0x41782000, 0x42027000, - 0x00000056, 0x0201f000, 0x000208d8, 0x4803c856, - 0x42027000, 0x00000057, 0x0201f000, 0x000208d8, - 0x4803c856, 0x59300007, 0x8c00051a, 0x04020010, - 0x59325808, 0x812e59c0, 0x04000014, 0x592c0408, - 0x8c00051c, 0x04020003, 0x4a026011, 0xffffffff, - 0x59300004, 0x8c00053e, 0x04020009, 0x42027000, - 0x00000048, 0x0201f000, 0x000208d8, 0x59325808, - 0x4a025a06, 0x00000007, 0x0401f7f4, 0x0201f800, - 0x00106cb4, 0x040007f6, 0x1c01f000, 0x4803c856, - 0x83300500, 0x00ffffff, 0x0201f000, 0x0010620f, - 0x1c01f000, 0x4c040000, 0x59b808ea, 0x82040d00, - 0x00000007, 0x82040580, 0x00000003, 0x04000004, - 0x42000000, 0x60000000, 0x0401f8ac, 0x5c000800, - 0x1c01f000, 0x0401f8fa, 0x0400001b, 0x59325808, - 0x812e59c0, 0x04000018, 0x592c0204, 0x82000500, - 0x000000ff, 0x82000d80, 0x00000029, 0x04020012, - 0x59300203, 0x82000580, 0x00000003, 0x0400000b, - 0x59300807, 0x84040d26, 0x48066007, 0x0201f800, - 0x00020087, 0x4a03900d, 0x00000040, 0x4a0370e5, - 0x00000008, 0x1c01f000, 0x0201f800, 0x00106cb4, - 0x040007f4, 0x59880053, 0x80000000, 0x48031053, - 0x4a03900d, 0x00000040, 0x42000000, 0xc0000000, - 0x0401f05a, 0x42007800, 0x0010bbe1, 0x42002000, - 0x00003000, 0x42003000, 0x00000105, 0x0201f800, - 0x00105b3d, 0x4a0370e4, 0x02000000, 0x1c01f000, - 0x4933c857, 0x0201f000, 0x000208b4, 0x41300800, - 0x800409c0, 0x02020800, 0x00100615, 0x0201f800, - 0x0010060d, 0x4933c857, 0x813261c0, 0x02000800, - 0x00100615, 0x0401f835, 0x40002800, 0x0201f800, - 0x0010a7c3, 0x0401f8ae, 0x04000007, 0x59326809, - 0x59340200, 0x8c00050e, 0x59300414, 0x02020800, - 0x00109094, 0x1c01f000, 0x4933c857, 0x813261c0, - 0x02000800, 0x00100615, 0x0401f8a1, 0x0400000b, - 0x59325808, 0x0201f800, 0x00108df4, 0x04000007, - 0x592c0208, 0x8400054e, 0x48025a08, 0x417a7800, - 0x0201f800, 0x00108997, 0x1c01f000, 0x485fc857, - 0x5c000000, 0x4d780000, 0x4203e000, 0x50000000, - 0x4200b800, 0x00008005, 0x0201f000, 0x0010061a, - 0x4933c857, 0x83300480, 0x00000020, 0x02021800, - 0x00100615, 0x83300c00, 0x0010b6cb, 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, 0x0401febf, 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, 0x0010b602, 0x50080000, 0x80000540, - 0x04020005, 0x4a0370e5, 0x00000003, 0x4a0370e4, - 0x00000300, 0x80000000, 0x44001000, 0x42001000, - 0x00000400, 0x59b800ea, 0x8c000510, 0x0400000c, - 0x0401ffd5, 0x82100480, 0x00000008, 0x04001007, - 0x4c040000, 0x4c080000, 0x0401fe8b, 0x5c001000, - 0x5c000800, 0x0401f020, 0x59b800ea, 0x8c000516, - 0x0402001d, 0x4a0370e4, 0x00300000, 0x480770e1, - 0x42001000, 0x0000ff00, 0x80081040, 0x04000012, - 0x59b808e4, 0x8c040d28, 0x040207fc, 0x42001000, - 0x0010b602, 0x50080000, 0x80000040, 0x04020005, - 0x4a0370e5, 0x00000002, 0x4a0370e4, 0x00000200, - 0x02001800, 0x00100615, 0x44001000, 0x8c040d2c, - 0x1c01f000, 0x41f80000, 0x50000000, 0x0201f800, - 0x00100615, 0x80081040, 0x040207d3, 0x41f80000, - 0x50000000, 0x0201f800, 0x00100615, 0x4d380000, - 0x59300c06, 0x82040580, 0x00000009, 0x04020006, - 0x42027000, 0x00000047, 0x0201f800, 0x000208d8, - 0x80000580, 0x5c027000, 0x1c01f000, 0x4c500000, - 0x4a03900d, 0x00000001, 0x59c8a020, 0x4a03900d, - 0x00000002, 0x59c80820, 0x8c50a52e, 0x04000002, - 0x900409c0, 0x82040d00, 0x0000ffff, 0x0201f800, - 0x00105b0f, 0x5c00a000, 0x1c01f000, 0x0401fff0, - 0x04000045, 0x4933c857, 0x59300406, 0x82000580, - 0x00000000, 0x04000040, 0x59c82021, 0x4a03900d, - 0x00000001, 0x59c82821, 0x82142d00, 0x0000ffff, - 0x59325808, 0x812e59c0, 0x04000037, 0x59326809, - 0x0201f800, 0x00104728, 0x02020800, 0x0010907c, - 0x599c0019, 0x8c00050c, 0x04020018, 0x0201f800, - 0x00104728, 0x04020015, 0x59300811, 0x4807c857, - 0x592c0408, 0x8c00051c, 0x0402000e, 0x8400055c, - 0x48025c08, 0x592c0a04, 0x82040d00, 0x000000ff, - 0x82040580, 0x00000048, 0x04000004, 0x82040580, - 0x00000018, 0x04020003, 0x59300811, 0x48065803, - 0x4a026011, 0x7fffffff, 0x48166013, 0x0201f800, - 0x0010112d, 0x04020014, 0x0401fa07, 0x40280000, - 0x4802600d, 0x04000005, 0x4832600b, 0x50200000, - 0x4802600a, 0x4822600c, 0x59300414, 0x8c00051c, - 0x04020004, 0x599c0019, 0x8c00050c, 0x0402086e, - 0x4a03900d, 0x00000040, 0x4a0370e5, 0x00000008, - 0x1c01f000, 0x59880053, 0x80000000, 0x48031053, - 0x4a03900d, 0x00000040, 0x42000000, 0xc0000000, - 0x0401f726, 0x4cf80000, 0x58f40000, 0x8001f540, - 0x0401f820, 0x41781800, 0x0401f8e7, 0x04020014, - 0x44140800, 0x0401f82a, 0x04000011, 0x40043800, - 0x42001800, 0x00000001, 0x40142000, 0x0401f8de, - 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, 0x00100615, 0x4801ec01, 0x0401f00b, - 0x58f80401, 0x82000480, 0x00000002, 0x02001800, - 0x00100615, 0x4801f401, 0x82000580, 0x00000002, - 0x04020002, 0x0401f809, 0x58f40202, 0x80000040, - 0x4801ea02, 0x02000800, 0x00100615, 0x82000580, - 0x00000001, 0x1c01f000, 0x4d2c0000, 0x40fa5800, - 0x0201f800, 0x0010083a, 0x4979e800, 0x4179f000, - 0x5c025800, 0x1c01f000, 0x80f5e9c0, 0x04000009, - 0x80f9f1c0, 0x04020ff5, 0x4d2c0000, 0x40f65800, - 0x0201f800, 0x0010083a, 0x4179e800, 0x5c025800, - 0x1c01f000, 0x4cf40000, 0x0201f800, 0x00104728, - 0x04020036, 0x59300807, 0x82040500, 0x00003100, - 0x04020032, 0x8c040d22, 0x04000032, 0x5930001f, - 0x8001ed40, 0x02000800, 0x00100615, 0x82000580, - 0xffffffff, 0x04000029, 0x58f40201, 0x82000580, - 0x0000dcb3, 0x02020800, 0x00100615, 0x58f40a02, - 0x82040500, 0x0000fffe, 0x04000003, 0x0401ff86, - 0x58f40a02, 0x82040480, 0x0000000f, 0x04021059, - 0x80040800, 0x4805ea02, 0x82040580, 0x00000008, - 0x0400005d, 0x82040480, 0x00000008, 0x0400100a, - 0x58f40000, 0x8001ed40, 0x02000800, 0x00100615, - 0x58f40201, 0x82000580, 0x0000ddb9, 0x02020800, - 0x00100615, 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, 0x00100819, 0x04000025, - 0x492e601f, 0x4a025a01, 0x0000dcb3, 0x59300008, - 0x80001d40, 0x02000800, 0x00100615, 0x580c080f, - 0x48065803, 0x59301811, 0x40040000, 0x800c0580, - 0x0402000d, 0x497a5a02, 0x4a025c01, 0x00000004, - 0x0401f011, 0x4a0370e4, 0x00020000, 0x40000000, - 0x40000000, 0x80081040, 0x02000800, 0x00100615, - 0x0401f7d6, 0x4a025a02, 0x00000001, 0x4a025c01, - 0x00000006, 0x497a5804, 0x400c0000, 0x80040480, - 0x48025805, 0x412de800, 0x5c025800, 0x0401f7a9, - 0x5c025800, 0x4a02601f, 0xffffffff, 0x0401f7c3, - 0x4d2c0000, 0x58f65800, 0x0201f800, 0x0010083a, - 0x40f65800, 0x0201f800, 0x0010083a, 0x5c025800, - 0x0401f7f5, 0x4d2c0000, 0x0201f800, 0x00100819, - 0x040007f8, 0x4a025a01, 0x0000ddb9, 0x4a025c01, - 0x00000002, 0x492de800, 0x412de800, 0x5c025800, - 0x0401f7a5, 0x0401ff30, 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, 0x04020021, - 0x82f40580, 0xffffffff, 0x0400001b, 0x58f40201, - 0x82000580, 0x0000dcb3, 0x02020800, 0x00100615, - 0x58f40000, 0x8001f540, 0x04000006, 0x58f80201, - 0x82000580, 0x0000ddb9, 0x02020800, 0x00100615, - 0x41783800, 0x58f44003, 0x0401f83d, 0x04020009, - 0x0401ff2e, 0x497a601f, 0x59300807, 0x84040d22, - 0x48066007, 0x5c01f000, 0x5c01e800, 0x1c01f000, - 0x0401ff26, 0x4a025a06, 0x00000011, 0x0401f7f6, - 0x82f40580, 0xffffffff, 0x04020f20, 0x0401f7f2, - 0x4cf40000, 0x4cf80000, 0x4001e800, 0x82040580, - 0x00000001, 0x04020020, 0x82f40580, 0xffffffff, - 0x0400001a, 0x58f40201, 0x82000580, 0x0000dcb3, - 0x02020800, 0x00100615, 0x58f40000, 0x8001f540, - 0x04000006, 0x58f80201, 0x82000580, 0x0000ddb9, - 0x02020800, 0x00100615, 0x41783800, 0x58f44003, - 0x0401f813, 0x04020008, 0x0401ff04, 0x42000800, - 0x00000001, 0x497a601f, 0x5c01f000, 0x5c01e800, - 0x1c01f000, 0x0401fefd, 0x42000800, 0x00000011, - 0x0401f7f9, 0x4c040000, 0x82f40580, 0xffffffff, - 0x04020ef6, 0x5c000800, 0x0401f7f3, 0x4803c856, - 0x401c2000, 0x41781800, 0x4c200000, 0x0401ff86, - 0x5c004000, 0x0402002c, 0x40202000, 0x42001800, - 0x00000001, 0x0401ff80, 0x04020027, 0x0401feae, - 0x40082800, 0x82f40400, 0x00000004, 0x40003000, - 0x50182000, 0x40100000, 0x801c0580, 0x04000005, - 0x42001800, 0x00000001, 0x0401ff73, 0x0402001a, - 0x82183400, 0x00000002, 0x80142840, 0x040207f5, - 0x80f9f1c0, 0x04000013, 0x58f42a02, 0x82142c80, - 0x00000007, 0x82f80400, 0x00000003, 0x40003000, - 0x50182000, 0x40100000, 0x801c0580, 0x04000005, - 0x42001800, 0x00000001, 0x0401ff5f, 0x04020006, - 0x82183400, 0x00000002, 0x80142840, 0x040207f5, - 0x1c01f000, 0x82000540, 0x00000001, 0x0401f7fd, - 0x0201f800, 0x00100615, 0x58380207, 0x8c000502, - 0x040007fc, 0x50200000, 0x80387c00, 0x583c2800, - 0x583c2001, 0x58380404, 0x80001540, 0x04020002, - 0x58381407, 0x58c83401, 0x58380c08, 0x59303807, - 0x497a6012, 0x497a6013, 0x0201f000, 0x000200bf, - 0x592c0408, 0x8c000502, 0x040007ea, 0x592c0409, - 0x80000540, 0x040007e7, 0x82000c80, 0x00000002, - 0x04001011, 0x58380001, 0x80007540, 0x02000800, - 0x00100615, 0x58380204, 0x82000500, 0x0000000f, - 0x82000400, 0x0010110d, 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, - 0x000200c7, 0x80204000, 0x50201800, 0x800c19c0, - 0x0402000c, 0x58380001, 0x80007540, 0x02000800, - 0x00100615, 0x58380204, 0x82000500, 0x0000000f, - 0x82000400, 0x0010110d, 0x50004000, 0x50201800, - 0x483a600b, 0x480e600a, 0x4822600c, 0x0201f000, - 0x000200c7, 0x4803c856, 0x592c0208, 0x8c00051e, - 0x04020017, 0x50200000, 0x80306c00, 0x40240000, - 0x0c01f001, 0x00100e91, 0x00100e91, 0x00100e9a, - 0x00100e91, 0x00100e91, 0x00100e91, 0x00100e91, - 0x00100e91, 0x00100e9a, 0x00100e91, 0x00100e9a, - 0x00100e91, 0x00100e91, 0x00100e9a, 0x00100e91, - 0x00100e91, 0x0201f800, 0x00100615, 0x8400051e, - 0x48025a08, 0x50200000, 0x80306c00, 0x58343801, - 0x481e600f, 0x0401f007, 0x58341802, 0x58342800, - 0x58343801, 0x480e6010, 0x4816600e, 0x481e600f, - 0x0401f24b, 0x4933c857, 0x5931f808, 0x59300a06, - 0x800409c0, 0x04000005, 0x80040906, 0x04020002, - 0x80040800, 0x4805fc06, 0x4a026206, 0x00000002, - 0x592c0409, 0x82000500, 0x00000008, 0x0400000b, - 0x0401f834, 0x59300203, 0x82000580, 0x00000004, - 0x04020005, 0x42027000, 0x00000048, 0x0201f800, - 0x000208d8, 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, 0x000208d8, - 0x5c01f800, 0x1c01f000, 0x58fdf809, 0x0401f7ec, - 0x5c000000, 0x4c000000, 0x4803c857, 0x4933c857, - 0x59b808ea, 0x82040d00, 0x00000007, 0x82040580, - 0x00000000, 0x0400001e, 0x82040580, 0x00000003, - 0x0400001b, 0x59300406, 0x4c000000, 0x4a026406, - 0x00000000, 0x42003000, 0x00000041, 0x42000000, - 0x50000000, 0x41300800, 0x4c180000, 0x0401fce3, - 0x5c003000, 0x0400000b, 0x42000000, 0x0000001e, - 0x80000040, 0x040207ff, 0x80183040, 0x040207f4, - 0x42000000, 0x40000000, 0x41300800, 0x0401fcd7, - 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, - 0x00104e0d, 0x04020013, 0x4a038891, 0x0000ffff, - 0x497b8880, 0x497b8892, 0x42001000, 0x00000190, - 0x40000000, 0x40000000, 0x80081040, 0x040207fd, - 0x42000000, 0x0010b6a5, 0x0201f800, 0x0010a86e, - 0x0401f80e, 0x5c038000, 0x0201f000, 0x00104f29, - 0x0401f82d, 0x42000000, 0x0010b6a6, 0x0201f800, - 0x0010a86e, 0x0401f805, 0x48178892, 0x480b8880, - 0x5c038000, 0x1c01f000, 0x496fc857, 0x836c0580, - 0x00000003, 0x0402000b, 0x4c080000, 0x4c0c0000, - 0x42001000, 0x00008048, 0x42001800, 0x0000ffff, - 0x0201f800, 0x00103857, 0x5c001800, 0x5c001000, - 0x42000800, 0x0000003c, 0x0201f800, 0x00101395, - 0x59a8006c, 0x80000540, 0x04000006, 0x59a8106d, - 0x800811c0, 0x04000003, 0x0201f800, 0x00101b0a, - 0x4a038891, 0x0000ffff, 0x4a03900d, 0x00000040, - 0x0201f800, 0x001009db, 0x4a0370e8, 0x00000001, - 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, - 0x59c41080, 0x497b8880, 0x59c42892, 0x497b8892, - 0x0201f800, 0x00104e0d, 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, 0x001019a4, - 0x50001800, 0x820c1d00, 0x00000001, 0x04000005, - 0x80102040, 0x040207f7, 0x5c002000, 0x0401f7f0, - 0x5c002000, 0x0401f7ec, 0x4803c856, 0x1c01f000, - 0x4d2c0000, 0x59325808, 0x592c0a04, 0x4807c857, - 0x82040d00, 0x000000ff, 0x82040500, 0x0000000f, - 0x0c01f001, 0x00100fb5, 0x00100fb5, 0x00100fb5, - 0x00100fcd, 0x00100fb5, 0x00100fb5, 0x00100fb5, - 0x00100fb5, 0x00100fb5, 0x00100fcd, 0x00100fb5, - 0x00100fb7, 0x00100fb5, 0x00100fb5, 0x00100fb5, - 0x00100fb5, 0x0201f800, 0x00100615, 0x82040580, - 0x0000003b, 0x02020800, 0x00100615, 0x592c020a, - 0x8c000500, 0x0400005f, 0x592c1a07, 0x82040500, - 0x0000000f, 0x82000400, 0x0010110d, 0x50001000, - 0x50080000, 0x59302013, 0x4802600a, 0x492e600b, - 0x480a600c, 0x480e600d, 0x48126012, 0x5c025800, - 0x1c01f000, 0x82040500, 0x0000000f, 0x82000400, - 0x0010110d, 0x50001000, 0x50080000, 0x592c1a07, - 0x4802600a, 0x492e600b, 0x480a600c, 0x480e600d, - 0x497a6012, 0x0401f7f2, 0x8c040d00, 0x04020041, - 0x82040d00, 0x00000080, 0x0400003e, 0x0201f000, - 0x000200d0, 0x59300013, 0x59301012, 0x80080580, - 0x0402000c, 0x42007800, 0x80000005, 0x592c1208, - 0x82080500, 0xffff7fff, 0x48025a08, 0x8c08151e, - 0x0402002d, 0x823c7d40, 0x00000020, 0x0401f02a, - 0x480bc857, 0x42000000, 0x0010b64f, 0x0201f800, - 0x0010a86e, 0x59300414, 0x4803c857, 0x8c000514, - 0x04020007, 0x599c1819, 0x8c0c1d12, 0x04020004, - 0x820c1d40, 0x00000001, 0x0401f01d, 0x59302013, - 0x0401f92d, 0x0402001a, 0x42007800, 0x80000005, - 0x5930500d, 0x592c0208, 0x4803c857, 0x8c00051e, - 0x04020005, 0x823c7d40, 0x00000020, 0x5930400c, - 0x0401f004, 0x8400051e, 0x48025a08, 0x0401f8dc, - 0x50201800, 0x480e600a, 0x4832600b, 0x4822600c, - 0x482a600d, 0x480fc857, 0x4833c857, 0x4823c857, - 0x482bc857, 0x80000580, 0x483e6004, 0x1c01f000, - 0x0201f800, 0x00100615, 0x4933c857, 0x4d2c0000, - 0x59900004, 0x81300580, 0x02020800, 0x00100615, - 0x0201f800, 0x00108df4, 0x02000800, 0x00100615, - 0x59325808, 0x4d3c0000, 0x4d400000, 0x59300004, - 0x4803c857, 0x4c000000, 0x0201f800, 0x00106b13, - 0x0201f800, 0x001068c1, 0x5c000000, 0x8c000516, - 0x04000010, 0x592c000f, 0x4803c857, 0x48025807, - 0x41780800, 0x42028000, 0x00000002, 0x0201f800, - 0x00104bee, 0x4a025c06, 0x0000ffff, 0x0201f800, - 0x00020381, 0x0201f800, 0x00107698, 0x0401f015, - 0x4a026203, 0x00000002, 0x592c0208, 0x8400054e, - 0x48025a08, 0x59300406, 0x82000580, 0x00000006, - 0x04020009, 0x811800ca, 0x81c80c00, 0x58040939, - 0x592c000d, 0x80040480, 0x592c080f, 0x80040480, - 0x4802580b, 0x417a7800, 0x0201f800, 0x00108997, - 0x5c028000, 0x5c027800, 0x5c025800, 0x1c01f000, - 0x4933c857, 0x4d2c0000, 0x59900004, 0x81300580, - 0x02020800, 0x00100615, 0x0201f800, 0x00108df4, - 0x02000800, 0x00100615, 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, 0x04000031, - 0x82080500, 0x40008000, 0x040007f8, 0x800409c0, - 0x0402002c, 0x811a31c0, 0x0400002a, 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, 0x0401f00f, 0x02004800, 0x000207c8, - 0x59d01006, 0x82080500, 0x00006000, 0x82000580, - 0x00006000, 0x04000007, 0x8c08151e, 0x040007f7, - 0x59d01006, 0x82080500, 0x00006000, 0x040207f3, - 0x83d3a400, 0x00000020, 0x80040800, 0x82040480, - 0x00000005, 0x040017bd, 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, 0x0010110d, - 0x50004000, 0x802041c0, 0x02000800, 0x00100615, - 0x80285040, 0x1c01f000, 0x40005000, 0x1c01f000, - 0x00000005, 0x00000008, 0x0000000b, 0x0000000e, - 0x00000011, 0x00000000, 0x00000000, 0x0000000b, - 0x00000000, 0x00000000, 0x00000000, 0x00101108, - 0x00101107, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00101108, 0x00101107, 0x00101104, - 0x00101108, 0x00101107, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00101108, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00101108, 0x00101108, 0x00101108, - 0x00000000, 0x00101108, 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, 0x0010110d, 0x50204000, 0x592c0208, - 0x8400051e, 0x48025a08, 0x0401f013, 0x80102080, - 0x80102000, 0x48126010, 0x4813c857, 0x58080802, - 0x40100000, 0x80042480, 0x02001800, 0x00100615, - 0x58080000, 0x58081801, 0x80102400, 0x4812600e, - 0x480e600f, 0x4813c857, 0x592c0208, 0x8400055e, - 0x48025a08, 0x4833c857, 0x4823c857, 0x482bc857, - 0x4832600b, 0x4822600c, 0x482a600d, 0x80000580, - 0x0401f003, 0x82000540, 0x00000001, 0x1c01f000, - 0x58300204, 0x82004d00, 0x0000000f, 0x82244400, - 0x0010110d, 0x82000500, 0x000000ff, 0x82000580, - 0x00000029, 0x0402001b, 0x50204000, 0x592c0409, - 0x80000540, 0x02000800, 0x00100615, 0x82000c80, - 0x00000002, 0x04001011, 0x58300001, 0x80006540, - 0x02000800, 0x00100615, 0x58300204, 0x82000500, - 0x0000000f, 0x82000400, 0x0010110d, 0x50004000, - 0x40040000, 0x800409c0, 0x04000006, 0x82040c80, - 0x00000005, 0x040217f1, 0x80204400, 0x80000580, - 0x1c01f000, 0x59e00004, 0x8c00050e, 0x02020000, - 0x00100951, 0x1c01f000, 0x4c5c0000, 0x59e4b800, - 0x485fc857, 0x825c0500, 0x0000001f, 0x04000004, - 0x59e40862, 0x0201f800, 0x00100615, 0x825c0500, - 0x000000e0, 0x02000800, 0x00100615, 0x8c5cbd0e, - 0x04020807, 0x8c5cbd0c, 0x04020809, 0x8c5cbd0a, - 0x04020878, 0x5c00b800, 0x1c01f000, 0x4803c856, - 0x4a03c800, 0x00000080, 0x1c01f000, 0x4d2c0000, - 0x42007800, 0x0010b6eb, 0x583c0001, 0x583c0802, - 0x80040540, 0x0400003f, 0x42000800, 0x0010b5f5, - 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, 0x0010120c, - 0x480a5807, 0x48065808, 0x59e40053, 0x48025804, - 0x412c1000, 0x492fc857, 0x0201f800, 0x001008a1, - 0x5c025800, 0x4a03c800, 0x00000040, 0x1c01f000, - 0x42007800, 0x0010b5f5, 0x503c7800, 0x4a007802, - 0x00000100, 0x42007800, 0x0010b6eb, 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, 0x00103857, 0x1c01f000, - 0x4a03c800, 0x00000020, 0x0201f800, 0x0010a867, - 0x59e40000, 0x1c01f000, 0x4d2c0000, 0x4a007001, - 0x00000000, 0x82040d00, 0x43000f80, 0x02020800, - 0x00100615, 0x58380009, 0x4803c00f, 0x0201f800, - 0x001091cb, 0x583a5808, 0x592c0000, 0x48007008, - 0x800001c0, 0x04020002, 0x49787007, 0x0201f800, - 0x0010083a, 0x5c025800, 0x0201f000, 0x001008c6, - 0x4803c856, 0x4c3c0000, 0x4d2c0000, 0x4d300000, - 0x5830000a, 0x80025d40, 0x02000800, 0x00100615, - 0x592e6008, 0x4c300000, 0x0201f800, 0x001091e3, - 0x5c006000, 0x02000800, 0x00100615, 0x58300002, - 0x82000580, 0x00000100, 0x04020010, 0x5930780b, - 0x583c0001, 0x80000540, 0x0400000e, 0x4802600b, - 0x40007800, 0x82000400, 0x00000002, 0x48006003, - 0x583c0000, 0x48006004, 0x40301000, 0x0201f800, - 0x001008a1, 0x0401f00c, 0x4a025a06, 0x00000002, - 0x4c300000, 0x0201f800, 0x00020381, 0x5c006000, - 0x40325800, 0x0201f800, 0x0010083a, 0x0201f800, - 0x000208b4, 0x5c026000, 0x5c025800, 0x5c007800, - 0x1c01f000, 0x4803c856, 0x4d2c0000, 0x4d300000, - 0x42007000, 0x0010b5f6, 0x58380801, 0x82040580, - 0x00000002, 0x04020011, 0x58386002, 0x5830000a, - 0x812c0580, 0x0402000d, 0x59e00004, 0x8c00050e, - 0x040007fe, 0x59dc0006, 0x4803c857, 0x4a03b805, - 0x20000000, 0x8c00053e, 0x040007f8, 0x4a007001, - 0x00000000, 0x0401f019, 0x58386006, 0x40305000, - 0x803061c0, 0x02000800, 0x00100615, 0x5830000a, - 0x812c0580, 0x04000004, 0x40305000, 0x58306000, - 0x0401f7f8, 0x40280000, 0x80300580, 0x58300000, - 0x04000006, 0x48005000, 0x800001c0, 0x04020007, - 0x48287005, 0x0401f005, 0x800001c0, 0x04020002, - 0x48007005, 0x48007006, 0x40325800, 0x0201f800, - 0x0010083a, 0x42007000, 0x0010b5f6, 0x58380001, - 0x82000580, 0x00000000, 0x02000800, 0x001008c6, - 0x5c026000, 0x5c025800, 0x1c01f000, 0x4803c856, - 0x42000800, 0x0000003c, 0x48079000, 0x59c80000, - 0x80040500, 0x040207fe, 0x497b9005, 0x4a039035, - 0x00880200, 0x59a8000e, 0x800000e0, 0x4803900e, - 0x4a039011, 0x00000024, 0x4a03900f, 0x0010cfc0, - 0x4a039010, 0x0010cfc0, 0x4a039015, 0x0000007f, - 0x4a03900d, 0x00000040, 0x4a039000, 0x00001600, - 0x1c01f000, 0x59c80007, 0x8c000508, 0x040208b7, - 0x59c80800, 0x8c040d16, 0x04020004, 0x82000500, - 0x00000006, 0x0c01f005, 0x4807c857, 0x82000500, - 0x0000000e, 0x0c01f001, 0x001012f8, 0x001012f6, - 0x0010567d, 0x001012f6, 0x001012fa, 0x001012f6, - 0x001012fa, 0x001012fa, 0x001012f6, 0x001012f6, - 0x001012f6, 0x001012f6, 0x001012fa, 0x001012f6, - 0x001012fa, 0x001012f6, 0x0201f800, 0x00100615, - 0x4803c857, 0x1c01f000, 0x59c8080c, 0x4807c857, - 0x82040500, 0x00006000, 0x04000004, 0x0201f800, - 0x0010a82a, 0x0401f006, 0x82040500, 0x007f0000, - 0x04000006, 0x0201f800, 0x0010a7fc, 0x0201f800, - 0x00106c07, 0x0401f02b, 0x82040500, 0x00000014, - 0x04000014, 0x0201f800, 0x0010a859, 0x836c0580, - 0x00000003, 0x0400000d, 0x0201f800, 0x00104e0d, - 0x04000004, 0x0201f800, 0x00103f37, 0x0401f007, - 0x4a035033, 0x00000001, 0x4202d800, 0x00000001, - 0x0201f800, 0x00104d76, 0x0401f817, 0x0401f015, - 0x82040500, 0x00001c00, 0x04000005, 0x0201f800, - 0x0010a838, 0x0401f810, 0x0401f00e, 0x82040500, - 0x00000140, 0x04000005, 0x0201f800, 0x0010a84b, - 0x0401f809, 0x0401f007, 0x82040500, 0x00008000, - 0x04000004, 0x0201f800, 0x0010a823, 0x0401f802, - 0x1c01f000, 0x4c0c0000, 0x4c100000, 0x4c140000, - 0x0201f800, 0x00100f17, 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, - 0x0010060d, 0x82040d00, 0x0000007c, 0x48079000, - 0x59c80000, 0x80040500, 0x040207fe, 0x8c040d04, - 0x04000003, 0x59c80035, 0x48039035, 0x59c80000, - 0x82000540, 0x00001200, 0x48039000, 0x1c01f000, - 0x4803c856, 0x497b88a9, 0x4a038807, 0x00000001, - 0x497b8807, 0x59c40005, 0x48038805, 0x0201f800, - 0x00101886, 0x4201d000, 0x000001f4, 0x0201f800, - 0x00105dd2, 0x497b880e, 0x4200b000, 0x000001f4, - 0x42000000, 0x00000001, 0x42000800, 0x00000014, - 0x0201f800, 0x001019b1, 0x42000800, 0x00000014, - 0x0201f800, 0x001019ac, 0x8c040d00, 0x04000005, - 0x8058b040, 0x040207f3, 0x0201f800, 0x00100615, - 0x4200b000, 0x00000032, 0x42000000, 0x00000001, - 0x42000800, 0x000000b4, 0x0201f800, 0x001019b1, - 0x42000800, 0x000000b4, 0x0201f800, 0x001019ac, - 0x8c040d00, 0x04000005, 0x8058b040, 0x040207f3, - 0x0201f800, 0x00100615, 0x59c40005, 0x48038805, - 0x42000000, 0x00000089, 0x800008d0, 0x48075054, - 0x48075055, 0x48075056, 0x42000800, 0x000000e0, - 0x0201f800, 0x001019b1, 0x42000800, 0x000000f4, - 0x0201f800, 0x001019ac, 0x82040500, 0xffffffd1, - 0x82000540, 0x00000002, 0x42000800, 0x000000f4, - 0x0201f800, 0x001019b1, 0x42000800, 0x000000a0, - 0x0201f800, 0x001019ac, 0x82040540, 0x00000001, - 0x42000800, 0x000000a0, 0x0201f800, 0x001019b1, - 0x42000800, 0x00000000, 0x0201f800, 0x001019ac, - 0x82040540, 0x00000001, 0x42000800, 0x00000000, - 0x0201f800, 0x001019b1, 0x4201d000, 0x0001d4c0, - 0x0201f800, 0x00105dd2, 0x0401fa45, 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, 0x001019ac, - 0x82040500, 0xffffffaf, 0x82000540, 0x00000000, - 0x42000800, 0x00000040, 0x0201f800, 0x001019b1, - 0x42000800, 0x000000f4, 0x0201f800, 0x001019ac, - 0x4c040000, 0x40040000, 0x84000548, 0x42000800, - 0x000000f4, 0x0201f800, 0x001019b1, 0x42000800, - 0x00000000, 0x0201f800, 0x001019ac, 0x82040500, - 0xffffffc1, 0x82000540, 0x00000038, 0x42000800, - 0x00000000, 0x0201f800, 0x001019b1, 0x5c000000, - 0x42000800, 0x000000f4, 0x0201f000, 0x001019b1, - 0x59c40805, 0x59c40006, 0x80040d00, 0x02000800, - 0x00100615, 0x82040500, 0x00e00800, 0x04020004, - 0x8c040d3e, 0x040208df, 0x0401f007, 0x82040500, - 0x00800800, 0x02020800, 0x0010060d, 0x0201f800, - 0x00100615, 0x4c5c0000, 0x4c600000, 0x59c4b805, - 0x59c40006, 0x8c000500, 0x04000003, 0x8c5cbd00, - 0x04020095, 0x485fc857, 0x0201f800, 0x00104e0d, - 0x0400001e, 0x59c40005, 0x82000500, 0x000000c0, - 0x0400004b, 0x0201f800, 0x00104e23, 0x04020048, - 0x59c40006, 0x82000500, 0x000000f0, 0x04020004, - 0x4a038805, 0x000000c0, 0x0401f041, 0x59a80015, - 0x84000506, 0x48035015, 0x42006000, 0xff203fff, - 0x42006800, 0x40000000, 0x0201f800, 0x001040ad, - 0x42000800, 0x00000010, 0x42001000, 0x00104020, - 0x0201f800, 0x00105dc7, 0x8c5cbd34, 0x04020030, - 0x4a035032, 0x0000aaaa, 0x59c40005, 0x8c00050c, - 0x04020012, 0x8c00050e, 0x0402001c, 0x8c00050a, - 0x0402001d, 0x8c000508, 0x0400000b, 0x59a80017, - 0x82000580, 0x00000009, 0x04020007, 0x42000000, - 0x0010b642, 0x0201f800, 0x0010a86e, 0x0201f800, - 0x00104fe9, 0x0401f05a, 0x0201f800, 0x00104e23, - 0x04020007, 0x42000800, 0x0000000f, 0x42001000, - 0x00103f37, 0x0201f800, 0x00105da7, 0x4a035033, - 0x00000000, 0x0401f00b, 0x4a035033, 0x00000002, - 0x0401f008, 0x42000000, 0x0010b644, 0x0201f800, - 0x0010a86e, 0x0201f800, 0x00104f93, 0x0401f044, - 0x0201f800, 0x00105049, 0x0401f041, 0x8c5cbd34, - 0x0400003d, 0x59c40005, 0x8c00053a, 0x04020005, - 0x42000000, 0x0010b616, 0x0201f800, 0x0010a86e, - 0x4a038805, 0x02000000, 0x0201f800, 0x00104e0d, - 0x04020010, 0x4a038805, 0x04000000, 0x0201f800, - 0x00104e1b, 0x04020008, 0x4a035033, 0x00000001, - 0x4202d800, 0x00000001, 0x0201f800, 0x00104d76, - 0x0401f061, 0x41780000, 0x0201f800, 0x00104de5, - 0x0201f800, 0x00101a59, 0x4000c000, 0x0201f800, - 0x001019d0, 0x836c1580, 0x00000004, 0x0402000d, - 0x8c5cbd00, 0x04020018, 0x59a81005, 0x8c081506, - 0x04020005, 0x59c410a3, 0x82081540, 0x00000008, - 0x480b88a3, 0x59c41006, 0x84081540, 0x480b8806, - 0x4a038805, 0x04000000, 0x4202d800, 0x00000001, - 0x497b5014, 0x59a80005, 0x8c000518, 0x04020004, - 0x0401f95c, 0x0201f800, 0x00103f5c, 0x0201f800, - 0x00103951, 0x8c5cbd3c, 0x04020858, 0x8c5cbd00, - 0x04000036, 0x42000000, 0x0010b6c9, 0x0201f800, - 0x0010a86e, 0x4a038805, 0x00000001, 0x4200b000, - 0x00000352, 0x4201d000, 0x00000064, 0x4c580000, - 0x0201f800, 0x00105dd2, 0x0201f800, 0x00101941, - 0x5c00b000, 0x04000004, 0x8058b040, 0x040207f6, - 0x0401f004, 0x4a038805, 0x00000001, 0x0401f01f, - 0x59c40006, 0x84000500, 0x48038806, 0x0201f800, - 0x00106c32, 0x497b8880, 0x0201f800, 0x0010a7e7, - 0x59c4000d, 0x8c000500, 0x02020800, 0x0010a7f5, - 0x59c400a3, 0x82000500, 0xfcf8ffff, 0x480388a3, - 0x4a03504c, 0x00000002, 0x4202d800, 0x00000004, - 0x4a038805, 0x00000001, 0x0201f800, 0x0010071a, - 0x0401fb42, 0x497b5052, 0x4a035049, 0x00000001, - 0x0201f800, 0x0010048c, 0x825cbd00, 0xbbfffffe, - 0x485f8805, 0x5c00c000, 0x5c00b800, 0x1c01f000, - 0x59c41004, 0x480bc857, 0x8c081500, 0x04000006, - 0x4803c856, 0x497b2807, 0x0201f800, 0x00106cf9, - 0x0401f00a, 0x82080500, 0x000001f0, 0x04000007, - 0x4803c856, 0x417a3000, 0x0201f800, 0x00105d9b, - 0x0201f800, 0x00106d1b, 0x4a038805, 0x80000000, - 0x1c01f000, 0x59c408a3, 0x4807c857, 0x84040d40, - 0x480788a3, 0x1c01f000, 0x4d900000, 0x4dd00000, - 0x4da40000, 0x4d140000, 0x4a038805, 0x40000000, - 0x42000000, 0x0010b6c5, 0x0201f800, 0x0010a86e, - 0x0201f800, 0x0010698c, 0x59c41004, 0x8c081500, - 0x04000054, 0x598e600d, 0x497b2807, 0x813261c0, - 0x04000032, 0x59300403, 0x82000580, 0x00000032, - 0x0402002e, 0x5930001c, 0x48038833, 0x4a038807, - 0x00018000, 0x4201d000, 0x00000002, 0x0201f800, - 0x00105dd2, 0x497b8807, 0x4201d000, 0x00000002, - 0x0201f800, 0x00105dd2, 0x0201f800, 0x00106b71, - 0x4201d000, 0x00007530, 0x0201f800, 0x00105dd2, - 0x59c408a4, 0x82040d00, 0x0000000f, 0x82040d80, - 0x00000000, 0x04000005, 0x42000000, 0x00200000, - 0x0201f800, 0x001019b6, 0x0201f800, 0x001068f6, - 0x59300008, 0x80000540, 0x02000800, 0x00100615, - 0x40025800, 0x4a025a04, 0x00000103, 0x5931d821, - 0x58ef400b, 0x58ec0009, 0x0801f800, 0x0201f800, - 0x000208b4, 0x0401f047, 0x598c000f, 0x82001c80, - 0x000000c8, 0x0402100f, 0x80000000, 0x4803180f, - 0x59c400a4, 0x82000500, 0x0000000f, 0x82000580, - 0x00000002, 0x04020004, 0x42000000, 0x00200000, - 0x0401fbfa, 0x0201f800, 0x00105d86, 0x0401f035, - 0x4933c857, 0x0201f800, 0x00106b71, 0x813261c0, - 0x04000030, 0x4a026203, 0x00000001, 0x42027000, - 0x00000027, 0x0201f800, 0x000208d8, 0x0401f029, - 0x8c081508, 0x04000027, 0x417a3000, 0x0201f800, - 0x00106e2f, 0x42032000, 0x0000bf32, 0x0201f800, - 0x00105d9b, 0x59926004, 0x813261c0, 0x04000012, - 0x42001800, 0x000000c8, 0x0201f800, 0x00106dfb, - 0x0402000d, 0x59c400a4, 0x82000500, 0x0000000f, - 0x82000580, 0x00000002, 0x04020004, 0x42000000, - 0x00200000, 0x0401fbd1, 0x0201f800, 0x00105d8b, - 0x0401f00c, 0x4933c857, 0x0201f800, 0x00106b13, - 0x813261c0, 0x04000007, 0x42027000, 0x0000004f, - 0x4a026203, 0x00000003, 0x0201f800, 0x000208d8, - 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, - 0x0201f000, 0x00106982, 0x4803c857, 0x59a80821, - 0x48035021, 0x80041580, 0x04000045, 0x800409c0, - 0x04000023, 0x497b504c, 0x42000000, 0x0010b60b, - 0x0201f800, 0x0010a86e, 0x0201f800, 0x0010a920, - 0x42001000, 0x00008011, 0x59c40001, 0x82000500, - 0x00018000, 0x82001d80, 0x00000000, 0x04000009, - 0x82001d80, 0x00008000, 0x04000009, 0x82001d80, - 0x00010000, 0x04000009, 0x0201f800, 0x00100615, - 0x42001800, 0x00000000, 0x0401f006, 0x42001800, - 0x00000001, 0x0401f003, 0x42001800, 0x00000003, - 0x0201f800, 0x00103857, 0x0401f021, 0x59a8084c, - 0x800409c0, 0x04020007, 0x59c4000d, 0x8c000520, - 0x04000004, 0x42001800, 0x00000003, 0x0401f002, - 0x40041800, 0x0201f800, 0x0010a904, 0x42001000, - 0x00008012, 0x0201f800, 0x00103857, 0x0201f800, - 0x0010071a, 0x0201f800, 0x0010a95a, 0x0402000c, - 0x0401f853, 0x4d400000, 0x4d3c0000, 0x42028000, - 0x00000028, 0x42027800, 0x00000008, 0x0201f800, - 0x00101d90, 0x5c027800, 0x5c028000, 0x1c01f000, - 0x4803c857, 0x82000400, 0x00101eb5, 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, 0x0010a95f, 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, 0x0010393e, 0x04000005, 0x42028000, - 0x0000002e, 0x0201f000, 0x0010a25b, 0x1c01f000, - 0x59a8086f, 0x82040500, 0x00000010, 0x04000004, - 0x42000800, 0x00000002, 0x0401f010, 0x82040500, - 0x00000020, 0x42000800, 0x00000002, 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, 0x00100615, - 0x0c01f806, 0x5c007000, 0x5c001000, 0x5c000800, - 0x5c000000, 0x1c01f000, 0x001016dd, 0x001016f0, - 0x00101704, 0x00101706, 0x0010172d, 0x0010172f, - 0x00101731, 0x4803c856, 0x4a035042, 0x00000000, - 0x42000000, 0x00000002, 0x0401fa18, 0x42000000, - 0x00000002, 0x0401f9ad, 0x0401faae, 0x4803c856, - 0x4a035040, 0x00000006, 0x42000800, 0x0000001e, - 0x42001000, 0x00101732, 0x0201f000, 0x00105da7, - 0x497b5045, 0x4a035050, 0x00000036, 0x4a03504f, - 0x0000002a, 0x4803c856, 0x4a035042, 0x00000001, - 0x42000000, 0x00000002, 0x0401f998, 0x4803c856, - 0x4a035040, 0x00000006, 0x42000800, 0x0000001e, - 0x42001000, 0x00101732, 0x0201f000, 0x00105da7, - 0x0201f800, 0x00100615, 0x4a035050, 0x00000036, - 0x4803c856, 0x4a035042, 0x00000003, 0x42000800, - 0x00000000, 0x0401fa9f, 0x82040d00, 0x00000090, - 0x82040580, 0x00000090, 0x04000009, 0x82040580, - 0x00000010, 0x04000009, 0x82040580, 0x00000000, - 0x04000008, 0x0201f800, 0x00100615, 0x42000000, - 0x00000001, 0x0401f005, 0x41780000, 0x0401f003, - 0x42000000, 0x00000002, 0x0401f970, 0x497b5046, - 0x4803c856, 0x4a035040, 0x00000006, 0x42000800, - 0x0000001e, 0x42001000, 0x00101732, 0x0201f000, - 0x00105da7, 0x0201f800, 0x00100615, 0x0201f800, - 0x00100615, 0x1c01f000, 0x4c000000, 0x4c040000, - 0x4c080000, 0x4c380000, 0x59a80042, 0x82000c80, - 0x00000007, 0x02021800, 0x00100615, 0x0c01f806, - 0x5c007000, 0x5c001000, 0x5c000800, 0x5c000000, - 0x1c01f000, 0x00101748, 0x00101767, 0x001017bb, - 0x001017d2, 0x001017e9, 0x001017f2, 0x001017f4, - 0x0401f9f9, 0x0402001b, 0x59a81048, 0x42000800, - 0x00000000, 0x0401fa5f, 0x82040d00, 0x00000090, - 0x82040580, 0x00000090, 0x04000009, 0x82040580, - 0x00000010, 0x04000008, 0x82040580, 0x00000000, - 0x04000007, 0x0201f800, 0x00100615, 0x84081540, - 0x0401f004, 0x84081542, 0x0401f002, 0x84081544, - 0x480b5048, 0x4a035040, 0x00000001, 0x0401f003, - 0x0401f8cb, 0x0401ff82, 0x1c01f000, 0x0401f88f, - 0x04000052, 0x0401f9d8, 0x0402002a, 0x42000800, - 0x00000000, 0x0401fa3f, 0x82040d00, 0x00000090, - 0x82040580, 0x00000000, 0x04000044, 0x82040580, - 0x00000010, 0x04000006, 0x82040580, 0x00000090, - 0x04000009, 0x0201f800, 0x00100615, 0x59c40801, - 0x82040d00, 0x00018000, 0x82040580, 0x00000000, - 0x04000036, 0x42000800, 0x00000000, 0x0401fa29, - 0x82040d00, 0x00000090, 0x82040580, 0x00000010, - 0x04000006, 0x82040580, 0x00000090, 0x04000006, - 0x02020800, 0x00100615, 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, 0x00100615, 0x42000000, - 0x00000001, 0x0401f005, 0x41780000, 0x0401f003, - 0x42000000, 0x00000002, 0x0401f948, 0x4a035042, - 0x00000002, 0x0401f004, 0x4a035040, 0x00000003, - 0x0401f002, 0x0401ff42, 0x1c01f000, 0x0401f83b, - 0x04000015, 0x59a8004f, 0x80000040, 0x4803504f, - 0x0401f981, 0x04020005, 0x4a035040, 0x00000003, - 0x497b5041, 0x0401f00c, 0x59a8004f, 0x80000540, - 0x04020003, 0x0401f89e, 0x0401f002, 0x0401f84b, - 0x0401f82f, 0x497b5045, 0x4a035042, 0x00000001, - 0x0401ff2b, 0x1c01f000, 0x0401f824, 0x04000015, - 0x0401f96d, 0x0402000f, 0x59a80046, 0x80000000, - 0x48035046, 0x82000580, 0x00000007, 0x0402000c, - 0x4a035052, 0x0000000a, 0x497b5049, 0x59a80048, - 0x8400055e, 0x48035048, 0x4803c857, 0x0401f005, - 0x0401f817, 0x4a035042, 0x00000004, 0x0401ff3d, - 0x1c01f000, 0x0401f80d, 0x04000007, 0x0401f956, - 0x04020003, 0x0401ff1b, 0x0401f003, 0x0401f80c, - 0x0401ff34, 0x1c01f000, 0x0201f800, 0x00100615, - 0x0201f800, 0x00100615, 0x59a80050, 0x80000040, - 0x48035050, 0x0400088d, 0x1c01f000, 0x4c040000, - 0x42000800, 0x00000000, 0x0401f9ae, 0x82040d00, - 0x00000090, 0x82040580, 0x00000090, 0x04000009, - 0x82040580, 0x00000010, 0x04000009, 0x82040580, - 0x00000000, 0x04000009, 0x0201f800, 0x00100615, - 0x42000000, 0x00000002, 0x0401f005, 0x42000000, - 0x00000001, 0x0401f002, 0x41780000, 0x0401f8e7, - 0x5c000800, 0x1c01f000, 0x4c040000, 0x59c40801, - 0x82040d00, 0x00018000, 0x82040580, 0x00000000, - 0x04000009, 0x82040580, 0x00008000, 0x04000009, - 0x82040580, 0x00010000, 0x04000009, 0x0201f800, - 0x00100615, 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, - 0x00100615, 0x42000000, 0x00000002, 0x0401f005, - 0x42000000, 0x00000001, 0x0401f002, 0x41780000, - 0x0401f846, 0x42000800, 0x00000000, 0x0401f95d, - 0x82040d00, 0x00000090, 0x82040580, 0x00000090, - 0x04000009, 0x82040580, 0x00000010, 0x04000009, - 0x82040580, 0x00000000, 0x04000009, 0x0201f800, - 0x00100615, 0x42000000, 0x00000002, 0x0401f005, - 0x42000000, 0x00000001, 0x0401f002, 0x41780000, - 0x0401f896, 0x5c000800, 0x1c01f000, 0x4c200000, - 0x59a80048, 0x82000500, 0x00007fff, 0x02000800, - 0x00100615, 0x59a84047, 0x80204102, 0x02001800, - 0x00100615, 0x48235047, 0x80204500, 0x040007fa, - 0x8c000504, 0x04020007, 0x8c000502, 0x04020008, - 0x8c000500, 0x04020008, 0x0201f800, 0x00100615, - 0x42000000, 0x00000002, 0x0401f005, 0x41780000, - 0x0401f003, 0x42000000, 0x00000001, 0x0401f80f, - 0x5c004000, 0x1c01f000, 0x04011000, 0x4a03c840, - 0x0010b240, 0x4a03c842, 0x00000009, 0x40000000, - 0x040117ff, 0x4a035047, 0x00000004, 0x4a03503e, - 0x00000000, 0x1c01f000, 0x59a80858, 0x82040d80, - 0x01391077, 0x04020008, 0x59e00813, 0x8c040d00, - 0x04000005, 0x82000d80, 0x00000002, 0x04020002, - 0x41780000, 0x800001c0, 0x04000040, 0x82000d80, - 0x00000001, 0x0402001d, 0x42000800, 0x000000a0, - 0x0401f908, 0x82040540, 0x00000004, 0x42000800, - 0x000000a0, 0x0401f908, 0x42000800, 0x000000c0, - 0x0401f900, 0x82040540, 0x00000020, 0x42000800, - 0x000000c0, 0x0401f900, 0x59c40001, 0x82000500, - 0xfffe7fff, 0x82000540, 0x00000000, 0x48038801, - 0x59a80054, 0x80000110, 0x42000800, 0x000000e0, - 0x0401f8f5, 0x0401f03c, 0x82000d80, 0x00000002, - 0x02020800, 0x00100615, 0x42000800, 0x000000a0, - 0x0401f8e8, 0x82040500, 0xfffffffb, 0x42000800, - 0x000000a0, 0x0401f8e8, 0x42000800, 0x000000c0, - 0x0401f8e0, 0x82040500, 0xffffffdf, 0x42000800, - 0x000000c0, 0x0401f8e0, 0x59c40001, 0x82000500, - 0xfffe7fff, 0x82000540, 0x00010000, 0x48038801, - 0x59a80056, 0x80000110, 0x42000800, 0x000000e0, - 0x0401f8d5, 0x0401f01c, 0x42000800, 0x000000a0, - 0x0401f8cc, 0x82040540, 0x00000004, 0x42000800, - 0x000000a0, 0x0401f8cc, 0x42000800, 0x000000c0, - 0x0401f8c4, 0x82040500, 0xffffffdf, 0x42000800, - 0x000000c0, 0x0401f8c4, 0x59c40001, 0x82000500, - 0xfffe7fff, 0x82000540, 0x00008000, 0x48038801, - 0x59a80055, 0x80000110, 0x42000800, 0x000000e0, - 0x0401f8b9, 0x1c01f000, 0x4803c857, 0x59a80858, - 0x82040d80, 0x01391077, 0x04020008, 0x59e00813, - 0x8c040d00, 0x04000005, 0x82000d80, 0x00000002, - 0x04020002, 0x41780000, 0x4c000000, 0x0401f942, - 0x5c000000, 0x800001c0, 0x04000026, 0x82000d80, - 0x00000001, 0x04020010, 0x59a8006c, 0x80000540, - 0x04000004, 0x42001000, 0x00000000, 0x0401f9f7, - 0x42000800, 0x00000000, 0x0401f896, 0x82040540, - 0x00000090, 0x42000800, 0x00000000, 0x0401f896, - 0x0401f024, 0x82000d80, 0x00000002, 0x02020800, - 0x00100615, 0x59a8006c, 0x80000540, 0x04000004, - 0x42001000, 0x00010000, 0x0401f9e4, 0x42000800, - 0x00000000, 0x0401f883, 0x82040500, 0xffffff6f, - 0x42000800, 0x00000000, 0x0401f883, 0x0401f011, - 0x59a8006c, 0x80000540, 0x04000004, 0x42001000, - 0x00008000, 0x0401f9d5, 0x42000800, 0x00000000, - 0x0401f874, 0x82040500, 0xffffff6f, 0x82000540, - 0x00000010, 0x42000800, 0x00000000, 0x0401f872, - 0x0401f111, 0x4c580000, 0x4200b000, 0x00000014, - 0x8058b040, 0x04000042, 0x59c4000d, 0x8c000520, - 0x040207fc, 0x0401f85b, 0x59c4000d, 0x8c000520, - 0x040207f8, 0x59c40808, 0x84040d50, 0x48078808, - 0x4200b000, 0x000000c8, 0x8058b040, 0x040207ff, - 0x4200b000, 0x00000014, 0x8058b040, 0x04000030, - 0x59c4000d, 0x8c000520, 0x0402002d, 0x42000800, - 0x00001000, 0x50040800, 0x82040c80, 0x24220001, - 0x04020003, 0x8c000504, 0x040007f4, 0x0401f841, - 0x59c4000d, 0x8c000520, 0x04020021, 0x42000800, - 0x00001000, 0x50040800, 0x82040c80, 0x24220001, - 0x04020003, 0x8c000504, 0x040007e8, 0x4200b000, - 0x0000000a, 0x8058b040, 0x04000003, 0x0401f831, - 0x0401f7fd, 0x4200b000, 0x00000064, 0x59c4000d, - 0x8c00051e, 0x0400000e, 0x8058b040, 0x040207fc, - 0x42000000, 0x00001000, 0x50000000, 0x82000480, - 0x24220001, 0x04020004, 0x59c40808, 0x84040d10, - 0x48078808, 0x80000580, 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, 0x00106c32, 0x4863500a, - 0x0201f800, 0x0010a95a, 0x0402006a, 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, 0x0400003c, 0x84000542, 0x48035005, - 0x4200c800, 0x00000002, 0x42028000, 0x00000004, - 0x42027800, 0x00000008, 0x0401f007, 0x59a80805, - 0x84040d40, 0x48075005, 0x42028000, 0x00000004, - 0x417a7800, 0x59a80006, 0x8c000502, 0x04020006, - 0x59a80805, 0x8c040d0a, 0x04020032, 0x84040d4a, - 0x48075005, 0x42000000, 0x0010b610, 0x0201f800, - 0x0010a86e, 0x59a8180a, 0x42001000, 0x00008013, - 0x0201f800, 0x00103857, 0x0201f800, 0x0010393e, - 0x04000015, 0x4d400000, 0x82600500, 0x000000ff, - 0x42028800, 0x0000ffff, 0x40643000, 0x42028000, - 0x0000000e, 0x0201f800, 0x0010a258, 0x42000800, - 0x00000001, 0x42001000, 0x00000100, 0x0201f800, - 0x00105ec4, 0x5c028000, 0x599c0817, 0x8c040d0a, - 0x04020010, 0x493fc857, 0x4943c857, 0x0401fb59, - 0x0401f00c, 0x0201f800, 0x0010393e, 0x04000009, - 0x42028000, 0x0000000f, 0x42028800, 0x0000ffff, - 0x42003000, 0x00000000, 0x0201f800, 0x0010a25b, - 0x497b8880, 0x5c028000, 0x5c027800, 0x5c00c800, - 0x1c01f000, 0x42000800, 0x00000000, 0x0401ff61, - 0x82040540, 0x00000002, 0x42000800, 0x00000000, - 0x0401f761, 0x42000800, 0x00000000, 0x0401ff59, - 0x82040500, 0xfffffffd, 0x42000800, 0x00000000, - 0x0401f759, 0x59c408a8, 0x0401ff4a, 0x0401ff49, - 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, 0x0010a95f, - 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, 0x0010a95f, 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, - 0x4c5c0000, 0x4c600000, 0x4178b800, 0x0201f800, - 0x0010473b, 0x040200fd, 0x59a8c026, 0x0201f800, - 0x00104e0d, 0x04000003, 0x8c60c506, 0x0400000e, - 0x8c60c500, 0x04020004, 0x8c60c50e, 0x040008f6, - 0x0401f0f2, 0x0401faaf, 0x040200f0, 0x0201f800, - 0x00104e0d, 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, 0x0010bc20, 0x50300800, - 0x825c0500, 0x00000003, 0x0c01f001, 0x00101c2c, - 0x00101c27, 0x00101c2b, 0x00101c29, 0x80040910, - 0x0401f004, 0x80040930, 0x0401f002, 0x80040920, - 0x82040500, 0x000000ff, 0x82000d80, 0x000000ff, - 0x0400000f, 0x4c000000, 0x82000400, 0x00101eb5, - 0x50000800, 0x80040910, 0x82040580, 0x00000080, - 0x5c000000, 0x04000030, 0x80600d80, 0x0400002e, - 0x80000540, 0x0400002c, 0x0401f00b, 0x59a81005, - 0x82081500, 0x00000003, 0x0402002b, 0x59a81013, - 0x84081542, 0x480b5013, 0x4a03501c, 0x0000ffff, - 0x0401f028, 0x4c000000, 0x59a8006f, 0x8c000502, - 0x42001000, 0x00000010, 0x02020800, 0x00104ada, - 0x5c000000, 0x0402001c, 0x417a8800, 0x0201f800, - 0x001059b9, 0x04020016, 0x0201f800, 0x0010443b, - 0x04000006, 0x0201f800, 0x00104acf, 0x0401f8b1, - 0x0400000f, 0x0401f00c, 0x599c0019, 0x8c00050e, - 0x04020009, 0x0201f800, 0x001043fc, 0x04020008, - 0x0201f800, 0x00104acf, 0x0401f9dd, 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, 0x00101eb5, 0x50000000, 0x82000500, - 0x000000ff, 0x80604580, 0x0400005c, 0x0201f800, - 0x001059ba, 0x04020061, 0x59a8006f, 0x8c000502, - 0x42001000, 0x00000010, 0x02020800, 0x00104ada, - 0x5c00b000, 0x5c000800, 0x040207d7, 0x4c040000, - 0x4c580000, 0x845cbd00, 0x0201f800, 0x00020267, - 0x04000008, 0x599c0019, 0x8c00050e, 0x04020047, - 0x0201f800, 0x00104401, 0x0402004c, 0x0401f002, - 0x845cbd40, 0x0201f800, 0x00104acf, 0x0201f800, - 0x00104836, 0x04020007, 0x59a80005, 0x8c000502, - 0x04000033, 0x59340200, 0x8c00050e, 0x04020030, - 0x59a81013, 0x8c081502, 0x04000025, 0x0201f800, - 0x00104858, 0x04000031, 0x8c5cbd00, 0x04020004, - 0x0201f800, 0x00104455, 0x0401f02c, 0x0401f9c8, - 0x0400002a, 0x42026000, 0x0010bbe8, 0x49366009, - 0x497a6008, 0x417a7800, 0x0401f920, 0x42000000, - 0x0010b663, 0x0201f800, 0x0010a86e, 0x0201f800, - 0x0010393e, 0x0400001d, 0x41782800, 0x42003000, - 0x00000008, 0x4d400000, 0x4d440000, 0x59368c03, - 0x42028000, 0x00000029, 0x0201f800, 0x0010a258, - 0x5c028800, 0x5c028000, 0x0401f010, 0x4937c857, - 0x599c0019, 0x8c00050e, 0x0402000c, 0x0401f968, - 0x0401f849, 0x04000011, 0x0401f008, 0x59a80013, - 0x8c000500, 0x04000003, 0x0401f9a1, 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, 0x001043fc, 0x0402000c, 0x0401f944, - 0x0401f825, 0x04000009, 0x59a80026, 0x8400054e, - 0x48035026, 0x0201f800, 0x001090d5, 0x82000540, - 0x00000001, 0x1c01f000, 0x80000580, 0x0401f7fe, - 0x4937c857, 0x0201f800, 0x001076c9, 0x04000015, - 0x49366009, 0x4a026406, 0x00000001, 0x417a7800, - 0x0201f800, 0x001043bd, 0x59a8001b, 0x80000000, - 0x4803501b, 0x42027000, 0x00000004, 0x599c0019, - 0x8c00050e, 0x04000003, 0x42027000, 0x00000000, - 0x0201f800, 0x000208d8, 0x82000540, 0x00000001, - 0x1c01f000, 0x4937c857, 0x0201f800, 0x001076c9, - 0x0400001c, 0x49366009, 0x59340403, 0x82000580, - 0x000007fe, 0x04000005, 0x4d3c0000, 0x417a7800, - 0x0401f8b2, 0x5c027800, 0x4a026406, 0x00000001, - 0x417a7800, 0x0201f800, 0x001043bd, 0x42000800, - 0x00000003, 0x0201f800, 0x001043c7, 0x59a8001b, - 0x80000000, 0x4803501b, 0x42027000, 0x00000002, - 0x0201f800, 0x000208d8, 0x82000540, 0x00000001, - 0x1c01f000, 0x4803c856, 0x42028800, 0x000007fc, - 0x42003000, 0x00fffffc, 0x0201f800, 0x001043fc, - 0x04020005, 0x0401f805, 0x04000003, 0x4a035027, - 0x0000ffff, 0x1c01f000, 0x4937c857, 0x0201f800, - 0x001076c9, 0x04000014, 0x49366009, 0x4a026406, - 0x00000001, 0x417a7800, 0x0201f800, 0x001043bd, - 0x42000800, 0x00000003, 0x0201f800, 0x001043c7, - 0x59a80028, 0x80000000, 0x48035028, 0x42027000, - 0x00000002, 0x0201f800, 0x000208d8, 0x82000540, - 0x00000001, 0x1c01f000, 0x480bc857, 0x492fc857, - 0x4c5c0000, 0x4008b800, 0x42028800, 0x000007fd, - 0x42003000, 0x00fffffd, 0x0201f800, 0x001043fc, - 0x0402001a, 0x0201f800, 0x00020892, 0x04000017, - 0x49366009, 0x5934000a, 0x84000544, 0x4802680a, - 0x812e59c0, 0x04000005, 0x592c0404, 0x8c00051e, - 0x04000002, 0x48ee6021, 0x492e6008, 0x4a026406, - 0x00000001, 0x485e601c, 0x42027000, 0x00000022, - 0x0201f800, 0x000208d8, 0x82000540, 0x00000001, - 0x5c00b800, 0x1c01f000, 0x80000580, 0x0401f7fd, - 0x5c000000, 0x4c000000, 0x4803c857, 0x4943c857, - 0x493fc857, 0x4d340000, 0x4d440000, 0x4c580000, - 0x4d2c0000, 0x4c5c0000, 0x0201f800, 0x0010698c, - 0x4df00000, 0x0201f800, 0x0010673a, 0x0201f800, - 0x001067ee, 0x0201f800, 0x0010647f, 0x0201f800, - 0x0010822b, 0x5c03e000, 0x02000800, 0x00106982, - 0x4200b000, 0x000007f0, 0x417a8800, 0x0201f800, - 0x00020267, 0x0402001a, 0x8d3e7d06, 0x04000004, - 0x59340200, 0x8c00050e, 0x04020015, 0x8d3e7d18, - 0x04000010, 0x5934b80f, 0x805cb9c0, 0x04000009, - 0x49425a06, 0x592cb800, 0x0201f800, 0x00020381, - 0x805cb9c0, 0x040207fb, 0x497a680f, 0x497a6810, - 0x4937c857, 0x4a026c00, 0x00000707, 0x0401f004, - 0x4937c857, 0x0201f800, 0x001040e4, 0x81468800, - 0x8058b040, 0x040207e2, 0x8d3e7d02, 0x04000011, - 0x497b501d, 0x42028800, 0x000007f0, 0x4200b000, - 0x00000010, 0x0201f800, 0x00020267, 0x04020006, - 0x4937c857, 0x4a026c00, 0x00000707, 0x0201f800, - 0x001040e4, 0x81468800, 0x8058b040, 0x040207f6, - 0x5c00b800, 0x5c025800, 0x5c00b000, 0x5c028800, - 0x5c026800, 0x1c01f000, 0x5c000000, 0x4c000000, - 0x4803c857, 0x4933c857, 0x493fc857, 0x4d340000, - 0x4d400000, 0x4d440000, 0x4d2c0000, 0x4c5c0000, - 0x0201f800, 0x0010698c, 0x4df00000, 0x59326809, - 0x813669c0, 0x04000021, 0x59368c03, 0x42028000, - 0x00000029, 0x0201f800, 0x0010679b, 0x0201f800, - 0x001067f6, 0x0201f800, 0x00106543, 0x0201f800, - 0x0010a0da, 0x4937c857, 0x8d3e7d18, 0x04000011, - 0x5934b80f, 0x805cb9c0, 0x0400000a, 0x405e5800, - 0x49425a06, 0x592cb800, 0x0201f800, 0x00020381, - 0x805cb9c0, 0x040207fa, 0x497a680f, 0x497a6810, - 0x4937c857, 0x4a026c00, 0x00000707, 0x0401f003, - 0x0201f800, 0x001040e4, 0x5c03e000, 0x02000800, - 0x00106982, 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, 0x00100615, 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, 0x4d400000, - 0x4d340000, 0x4d440000, 0x4c580000, 0x0201f800, - 0x0010698c, 0x4df00000, 0x8060c1c0, 0x04020004, - 0x4200b000, 0x00000001, 0x0401f004, 0x4200b000, - 0x000007f0, 0x417a8800, 0x41440000, 0x81ac0400, - 0x50000000, 0x80026d40, 0x0400001a, 0x4d3c0000, - 0x42027800, 0x00000001, 0x0201f800, 0x00104745, - 0x5c027800, 0x42028000, 0x00000029, 0x0201f800, - 0x0010679b, 0x0201f800, 0x001067f6, 0x0201f800, - 0x00106543, 0x0201f800, 0x00104836, 0x04020005, - 0x4937c857, 0x4a026c00, 0x00000404, 0x0401f003, - 0x0201f800, 0x00104863, 0x0201f800, 0x0010a0da, - 0x81468800, 0x8058b040, 0x040207e0, 0x5c03e000, - 0x02000800, 0x00106982, 0x5c00b000, 0x5c028800, - 0x5c026800, 0x5c028000, 0x1c01f000, 0x4937c857, - 0x4947c857, 0x4c5c0000, 0x4c600000, 0x4c640000, - 0x59a80013, 0x8c000500, 0x0400001f, 0x599c0017, - 0x8c00050a, 0x0402001c, 0x5934ba02, 0x825cbd00, - 0x000000ff, 0x485fc857, 0x4178c000, 0x4178c800, - 0x82600400, 0x0010bc20, 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, 0x8c000512, 0x02020800, 0x001006ba, - 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, 0x00100819, 0x02000800, - 0x00100615, 0x492f4016, 0x1c01f000, 0x83a0ac00, - 0x00000006, 0x83a00580, 0x0010b2a0, 0x0400000c, - 0x492fc857, 0x812e59c0, 0x02000800, 0x00100615, - 0x832ca400, 0x00000006, 0x4200b000, 0x0000000d, - 0x0201f800, 0x0010a93e, 0x0401f00f, 0x4200b000, - 0x00000010, 0x83e0a400, 0x00000020, 0x50500000, - 0x8050a000, 0x50500800, 0x900409c0, 0x80040540, - 0x4400a800, 0x8050a000, 0x8054a800, 0x8058b040, - 0x040207f7, 0x1c01f000, 0x59a00206, 0x82000c80, - 0x0000007f, 0x040210c9, 0x59a80821, 0x0c01f001, - 0x00102066, 0x001020a6, 0x001020a6, 0x001020f0, - 0x00102112, 0x001020a6, 0x00102066, 0x00102134, - 0x00102145, 0x001020a6, 0x001020a6, 0x00102152, - 0x0010216a, 0x00102182, 0x001020a6, 0x001021b1, - 0x001021e3, 0x001020a6, 0x0010220c, 0x001020a6, - 0x00102269, 0x001020a6, 0x001020a6, 0x001020a6, - 0x001020a6, 0x00102280, 0x001022b9, 0x001020a6, - 0x001020a6, 0x001020a6, 0x001020a6, 0x001020a6, - 0x001022ee, 0x001020a6, 0x00102340, 0x001020a6, - 0x001020a6, 0x001020a6, 0x001020a6, 0x00102345, - 0x001023be, 0x001020a6, 0x001023c5, 0x001020a6, - 0x001020a6, 0x001020a6, 0x001020a6, 0x001020a6, - 0x001023c7, 0x00102445, 0x00102585, 0x001020a6, - 0x001020a6, 0x001020a6, 0x001020a6, 0x001020a6, - 0x00102594, 0x001020a6, 0x001020a6, 0x001020a6, - 0x001020a6, 0x001020a6, 0x001020a6, 0x001020a6, - 0x001025b1, 0x00102604, 0x00102660, 0x00102674, - 0x00102696, 0x001028d1, 0x00102c60, 0x001020a6, - 0x001020a6, 0x001020a6, 0x001020a6, 0x001020a6, - 0x001020a6, 0x001020a6, 0x001020a6, 0x001020a6, - 0x001020a6, 0x001020a6, 0x001020a6, 0x00102d9f, - 0x00102e13, 0x001020a6, 0x001020a6, 0x00102e81, - 0x001020a6, 0x00102f1f, 0x00102fd1, 0x001020a6, - 0x001020a6, 0x00103008, 0x00103064, 0x001020a6, - 0x001030bc, 0x00103220, 0x001020a6, 0x00103234, - 0x001032bf, 0x001020a6, 0x001020a6, 0x001020a6, - 0x001020a6, 0x0010332f, 0x00103333, 0x00103352, - 0x001020a6, 0x001033f4, 0x001020a6, 0x001020a6, - 0x00103421, 0x001020a6, 0x0010344f, 0x001020a6, - 0x001020a6, 0x001034b6, 0x001035c3, 0x00103620, - 0x001020a6, 0x00103686, 0x001020a6, 0x001020a6, - 0x001036db, 0x0010373e, 0x001020a6, 0x48efc857, - 0x4031d800, 0x58ef400b, 0x58ec0002, 0x82000580, - 0x00000200, 0x04000045, 0x48efc857, 0x4a034206, - 0x00004000, 0x0201f800, 0x0010382f, 0x83a00580, - 0x0010b2a0, 0x0400000d, 0x58ee580a, 0x4d2c0000, - 0x0401f856, 0x41a25800, 0x0201f800, 0x0010083a, - 0x40ee5800, 0x0201f800, 0x0010083a, 0x5c025800, - 0x0201f000, 0x00020381, 0x04026007, 0x59a0001d, - 0x84000542, 0x4803401d, 0x4a01d809, 0x0010207a, - 0x1c01f000, 0x59a00206, 0x82000d80, 0x00004000, - 0x04000006, 0x900001c0, 0x82000540, 0x00000011, - 0x4803c011, 0x0401f005, 0x900001c0, 0x82000540, - 0x00000010, 0x4803c011, 0x0401f844, 0x59e00017, - 0x8c000508, 0x0402000c, 0x4203e000, 0x30000001, - 0x4203e000, 0x40000000, 0x40ee5800, 0x0201f800, - 0x0010083a, 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, 0x58eca80a, 0x8054a9c0, - 0x02000800, 0x00100615, 0x83a0a400, 0x00000006, - 0x8254ac00, 0x00000006, 0x4200b000, 0x0000000d, - 0x0201f000, 0x0010a93e, 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, 0x59a8086f, 0x8c040d00, 0x040207bb, - 0x42000800, 0x00000064, 0x80040840, 0x04000007, - 0x4a030000, 0x00000001, 0x40000000, 0x59801000, - 0x8c081500, 0x040007f9, 0x04000005, 0x48030004, - 0x4a030000, 0x00000000, 0x0401f75c, 0x4a030000, - 0x00000000, 0x4a034406, 0x00000004, 0x040007a3, - 0x4803880e, 0x0401f755, 0x59a00406, 0x800000c2, - 0x59a00c07, 0x8c040d00, 0x0400001a, 0x59a8086f, - 0x8c040d00, 0x0402079d, 0x42000800, 0x00000064, - 0x80040840, 0x04000007, 0x4a030000, 0x00000001, - 0x40000000, 0x59801000, 0x8c081500, 0x040007f9, - 0x04000007, 0x48030004, 0x59800805, 0x48074406, - 0x4a030000, 0x00000000, 0x0401f73c, 0x4a030000, - 0x00000000, 0x4a034406, 0x00000004, 0x04000783, - 0x4803880e, 0x59c4080f, 0x48074406, 0x0401f733, - 0x59a01c06, 0x59a00207, 0x900c19c0, 0x800c1d40, - 0x580c0803, 0x80000580, 0x500c1000, 0x80080400, - 0x800c1800, 0x80040840, 0x040207fc, 0x48034406, - 0x900001c0, 0x48034207, 0x800001c0, 0x04000723, - 0x0401f76a, 0x4a034406, 0x00000004, 0x4a034207, - 0x00000000, 0x4a034407, 0x00000012, 0x59a8000d, - 0x48034208, 0x900001c0, 0x48034408, 0x4a034209, - 0x00000002, 0x0401f715, 0x59a00407, 0x59a01207, - 0x900811c0, 0x80081540, 0x59a00409, 0x59a01a09, - 0x900c19c0, 0x800c1d40, 0x59a00a08, 0x59a00408, - 0x900409c0, 0x80040d40, 0x59a0020a, 0x82002480, - 0x00000010, 0x04001755, 0x59a02406, 0x900001c0, - 0x80100540, 0x59a8280d, 0x80142480, 0x0400174f, - 0x0201f000, 0x0010383e, 0x59a00407, 0x59a01207, - 0x900811c0, 0x80081540, 0x59a00409, 0x59a01a09, - 0x900c19c0, 0x800c1d40, 0x59a00a08, 0x59a00408, - 0x900409c0, 0x80040d40, 0x59a0020a, 0x82002480, - 0x00000010, 0x0400173d, 0x59a02406, 0x900001c0, - 0x80100540, 0x59a8280d, 0x80142480, 0x04001737, - 0x0201f000, 0x00103841, 0x59a02407, 0x59a00207, - 0x901021c0, 0x80102540, 0x59a01a0a, 0x59a00406, - 0x900c19c0, 0x800c1d40, 0x41781000, 0x42000000, - 0x00001000, 0x50000000, 0x82000480, 0x24320001, - 0x04001016, 0x820c0580, 0x00007c00, 0x04000013, - 0x820c0480, 0x00007a00, 0x04001010, 0x820c0480, - 0x00007cff, 0x0402100d, 0x42000800, 0x00000064, - 0x80040840, 0x04000007, 0x4a030000, 0x00000001, - 0x40000000, 0x59800000, 0x8c000500, 0x040007f9, - 0x04000008, 0x80081000, 0x44101800, 0x800811c0, - 0x040006be, 0x4a030000, 0x00000000, 0x0401f6bb, - 0x4a030000, 0x00000000, 0x4a034406, 0x00000004, - 0x0401f702, 0x59a01a0a, 0x59a00406, 0x900c19c0, - 0x800c1d40, 0x41781000, 0x42000000, 0x00001000, - 0x50000000, 0x82000480, 0x24320001, 0x04001016, - 0x820c0580, 0x00007c00, 0x04000013, 0x820c0480, - 0x00007a00, 0x04001010, 0x820c0480, 0x00007cff, - 0x0402100d, 0x42000800, 0x00000064, 0x80040840, - 0x04000007, 0x4a030000, 0x00000001, 0x40000000, - 0x59800000, 0x8c000500, 0x040007f9, 0x0400000f, - 0x80081000, 0x500c0000, 0x82000d00, 0x0000ffff, - 0x48074207, 0x82000d00, 0xffff0000, 0x900409c0, - 0x48074407, 0x800811c0, 0x0400068c, 0x4a030000, - 0x00000000, 0x0401f689, 0x4a030000, 0x00000000, - 0x4a034406, 0x00000004, 0x0401f6d0, 0x59a00406, - 0x8c000500, 0x04000020, 0x59a01207, 0x59a01c07, - 0x59a02208, 0x480b5054, 0x480f5055, 0x48135056, - 0x59c40801, 0x82040d00, 0x00018000, 0x82040580, - 0x00000000, 0x04000009, 0x82040580, 0x00008000, - 0x04000008, 0x82040580, 0x00010000, 0x04000007, - 0x0201f800, 0x00100615, 0x40080000, 0x0401f004, - 0x400c0000, 0x0401f002, 0x40100000, 0x80000110, - 0x42000800, 0x000000e0, 0x0201f800, 0x001019b1, - 0x0401f007, 0x59a81054, 0x59a81855, 0x59a82056, - 0x480b4207, 0x480f4407, 0x48134208, 0x0401f65b, - 0x4d2c0000, 0x4d340000, 0x4d300000, 0x4d440000, - 0x59a28c06, 0x0201f800, 0x00020267, 0x04000006, - 0x5c028800, 0x5c026000, 0x5c026800, 0x5c025800, - 0x0401f69e, 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, 0x0401f631, 0x5c028800, 0x5c026000, - 0x5c026800, 0x5c025800, 0x0401f678, 0x4937c856, - 0x4823c856, 0x4d2c0000, 0x5934000f, 0x80025d40, - 0x04000007, 0x592c0005, 0x80200580, 0x592c0000, - 0x040207fb, 0x82000540, 0x00000001, 0x5c025800, - 0x1c01f000, 0x4823c857, 0x4d2c0000, 0x4d300000, - 0x42026000, 0x0010cfc0, 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, 0x0010b2a0, 0x0402063b, - 0x59a8006f, 0x8c000500, 0x04020003, 0x4a030000, - 0x00000000, 0x4a034206, 0x00004000, 0x4a03c011, - 0x40000010, 0x0401fe5d, 0x59e00017, 0x8c000508, - 0x04000003, 0x4a03c017, 0x00000000, 0x4203e000, - 0x30000001, 0x4203e000, 0x40000000, 0x0401f000, - 0x59a00c06, 0x800409c0, 0x04000007, 0x836c0580, - 0x00000000, 0x04000004, 0x4a034406, 0x0000001a, - 0x0401f62a, 0x42007000, 0x0010b33f, 0x58381c01, - 0x58382202, 0x8c040d00, 0x0400000b, 0x59a01207, - 0x82080500, 0x0000f003, 0x04020624, 0x82080480, - 0x00000841, 0x04021621, 0x82080480, 0x00000100, - 0x0400161e, 0x8c040d06, 0x04000003, 0x4a0378e4, - 0x000c0000, 0x8c040d04, 0x0400000c, 0x42000000, - 0x00001000, 0x50000000, 0x82000480, 0x24220001, - 0x04020003, 0x84040d04, 0x0401f004, 0x59e00002, - 0x84000548, 0x4803c002, 0x8c040d02, 0x04000005, - 0x42002800, 0x00007600, 0x4a002805, 0xd0000000, - 0x40040000, 0x800c0540, 0x48007401, 0x8c040d00, - 0x04000002, 0x48087202, 0x480f4406, 0x48134207, - 0x0401f5ae, 0x4d440000, 0x4d340000, 0x59a28c06, - 0x0201f800, 0x00020267, 0x04020009, 0x0201f800, - 0x00104842, 0x04000009, 0x4a034406, 0x00000009, - 0x5c026800, 0x5c028800, 0x0401f5ec, 0x5c026800, - 0x5c028800, 0x0401f5ed, 0x59a01207, 0x59a01c07, - 0x5934400a, 0x82203d00, 0x0000e000, 0x801c391a, - 0x8c081500, 0x04000019, 0x820c0d00, 0x00000007, - 0x82040580, 0x00000000, 0x04000007, 0x82040580, - 0x00000001, 0x04000004, 0x82040580, 0x00000003, - 0x040207eb, 0x82204500, 0xffff1fff, 0x800400da, - 0x80200540, 0x4802680a, 0x4c1c0000, 0x0201f800, - 0x0010698c, 0x0201f800, 0x00104afd, 0x0201f800, - 0x00106982, 0x5c003800, 0x481f4407, 0x5c026800, - 0x5c028800, 0x0401f579, 0x800409c0, 0x04000004, - 0x4a034406, 0x00000001, 0x0401f5c0, 0x836c0580, - 0x00000003, 0x04020010, 0x59a80010, 0x497b4406, - 0x0201f800, 0x00104e0d, 0x0400000f, 0x82000d00, - 0x00ffff00, 0x0402000c, 0x82000c00, 0x00101eb5, - 0x50040800, 0x80040910, 0x82041580, 0x00000080, - 0x04020004, 0x4a034406, 0x00000007, 0x0401f5ab, - 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, 0x00104e0d, - 0x04020004, 0x4a034209, 0x00000004, 0x0401f52f, - 0x8c000506, 0x04000004, 0x4a034406, 0x00000005, - 0x0401f576, 0x4a034209, 0x00000000, 0x0401f527, - 0x59a80037, 0x48034407, 0x59a80038, 0x48034209, - 0x0401f522, 0x42007800, 0x0010b6eb, 0x59a00406, - 0x4803c857, 0x82000c80, 0x00000007, 0x0402156b, - 0x0c01f001, 0x00102354, 0x00102355, 0x00102363, - 0x00102376, 0x00102397, 0x00102354, 0x00102354, - 0x0401f562, 0x836c0580, 0x00000000, 0x0400055b, - 0x59a00a07, 0x59a00407, 0x900001c0, 0x80040d40, - 0x4807c857, 0x59a00a08, 0x59a00408, 0x900001c0, - 0x80040d40, 0x4807c857, 0x0401f056, 0x836c0580, - 0x00000000, 0x0400054d, 0x59a00407, 0x59a01207, - 0x900001c0, 0x80081540, 0x59a00408, 0x59a01a08, - 0x900001c0, 0x800c1d40, 0x42000000, 0x0010bfbe, - 0x480fc857, 0x480bc857, 0x42000800, 0x00001000, - 0x0201f000, 0x00103841, 0x59a00a07, 0x59a00407, - 0x900001c0, 0x80041d40, 0x820c0c80, 0x0010a971, - 0x0402153a, 0x820c0c80, 0x00100000, 0x04001537, - 0x480fc857, 0x823c7c00, 0x00000009, 0x503c0800, - 0x800409c0, 0x04000006, 0x823c0580, 0x0000000d, - 0x0400052e, 0x803c7800, 0x0401f7f9, 0x59e41001, - 0x82080d00, 0xfffeffcf, 0x4807c801, 0x440c7800, - 0x46001800, 0x0201f800, 0x800c1800, 0x46001800, - 0x00100608, 0x480bc801, 0x0401f022, 0x59a01a07, - 0x59a00407, 0x900001c0, 0x800c1d40, 0x480c7801, - 0x59a02208, 0x59a00408, 0x900001c0, 0x80102540, - 0x48107802, 0x59a00209, 0x80000040, 0x04001513, - 0x48007806, 0x80000000, 0x48007805, 0x42000800, - 0x00004000, 0x40001000, 0x0201f800, 0x001063cf, - 0x80000540, 0x04000003, 0x49787801, 0x0401f507, - 0x40040000, 0x800c1c00, 0x04001504, 0x480c7803, - 0x48107804, 0x49787808, 0x59a00409, 0x48007807, - 0x59e40001, 0x4803c857, 0x82000540, 0x00040000, - 0x4803c801, 0x0401f4a9, 0x59a80006, 0x48034406, - 0x59a80007, 0x48034207, 0x59a80008, 0x48034407, - 0x0401f4a2, 0x0201f800, 0x00100615, 0x4803c856, - 0x4a03c013, 0x03800300, 0x4a03c014, 0x03800380, - 0x59a00c06, 0x82040580, 0x000000a0, 0x04000004, - 0x82040580, 0x000000a2, 0x04020028, 0x59a0140a, - 0x82080480, 0x00000100, 0x04021024, 0x59a0020b, - 0x8c000500, 0x0402002b, 0x59a00a0a, 0x800409c0, - 0x0400001e, 0x82040480, 0x00000041, 0x0402101b, - 0x82040c00, 0x00000003, 0x82040d00, 0x000000fc, - 0x80040904, 0x59a00407, 0x59a01207, 0x900811c0, - 0x80081540, 0x59a00409, 0x59a01a09, 0x900c19c0, - 0x800c1d40, 0x0201f800, 0x0010381a, 0x04020006, - 0x4a034406, 0x00000002, 0x4a03c014, 0x03800000, - 0x0401f4be, 0x0201f800, 0x0010383e, 0x4a01d809, - 0x001023fd, 0x1c01f000, 0x4a03c014, 0x03800000, - 0x0401f4ba, 0x4031d800, 0x58ef400b, 0x58ee580d, - 0x58ec0002, 0x82000580, 0x00000200, 0x040004a7, - 0x59a00c06, 0x59a0140a, 0x59a0020b, 0x8c000500, - 0x04020031, 0x832e5c00, 0x00000004, 0x41783800, - 0x59a04a0a, 0x401c0000, 0x812c0400, 0x50004000, - 0x82201d00, 0x000000ff, 0x4c040000, 0x0401f8af, - 0x5c000800, 0x0400002d, 0x80244840, 0x04000028, - 0x80081000, 0x82201d00, 0x0000ff00, 0x800c1910, - 0x4c040000, 0x0401f8a5, 0x5c000800, 0x04000023, - 0x80244840, 0x0400001e, 0x80081000, 0x82201d00, - 0x00ff0000, 0x800c1920, 0x4c040000, 0x0401f89b, - 0x5c000800, 0x04000019, 0x80244840, 0x04000014, - 0x80081000, 0x82201d00, 0xff000000, 0x800c1930, - 0x4c040000, 0x0401f891, 0x5c000800, 0x0400000f, - 0x80244840, 0x0400000a, 0x80081000, 0x801c3800, - 0x0401f7d5, 0x59a0020a, 0x82000500, 0x000000ff, - 0x40001800, 0x0401f885, 0x04000004, 0x4a03c014, - 0x03800000, 0x0401f425, 0x4a03c014, 0x03800000, - 0x0401f46e, 0x4803c856, 0x4a03c013, 0x03800300, - 0x4a03c014, 0x03800380, 0x59a00c06, 0x82040580, - 0x000000a0, 0x04000004, 0x82040580, 0x000000a2, - 0x0402006e, 0x59a0140a, 0x82080480, 0x00000100, - 0x0402106a, 0x59a0020b, 0x8c000500, 0x0402005c, - 0x59a01a0a, 0x800c19c0, 0x04000064, 0x820c0480, - 0x00000041, 0x04021061, 0x0201f800, 0x0010381a, - 0x04020006, 0x4a034406, 0x00000002, 0x4a03c014, - 0x03800000, 0x0401f44d, 0x832e5c00, 0x00000004, - 0x41783800, 0x59a04a0a, 0x401c0000, 0x812c0400, - 0x40004000, 0x4c040000, 0x4c080000, 0x0401f877, - 0x5c001000, 0x5c000800, 0x04000048, 0x44144000, - 0x80244840, 0x0400002b, 0x80081000, 0x4c040000, - 0x4c080000, 0x0401f86d, 0x5c001000, 0x5c000800, - 0x0400003e, 0x50200000, 0x801428d0, 0x80140540, - 0x44004000, 0x80244840, 0x0400001e, 0x80081000, - 0x4c040000, 0x4c080000, 0x0401f860, 0x5c001000, - 0x5c000800, 0x04000031, 0x50200000, 0x801428e0, - 0x80140540, 0x44004000, 0x80244840, 0x04000011, - 0x80081000, 0x4c040000, 0x4c080000, 0x0401f853, - 0x5c001000, 0x5c000800, 0x04000024, 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, 0x00103841, 0x0401f833, - 0x04000006, 0x48174406, 0x4a03c014, 0x03800000, - 0x0201f000, 0x00102066, 0x4a03c014, 0x03800000, - 0x0201f000, 0x001020b2, 0x4a03c014, 0x03800000, - 0x0201f000, 0x001020b6, 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, 0x00102066, - 0x836c0580, 0x00000000, 0x0400000e, 0x59a80006, - 0x59a00c06, 0x80041580, 0x82081500, 0x00000040, - 0x02000000, 0x00102066, 0x80080580, 0x48035006, - 0x0201f800, 0x001006df, 0x0201f000, 0x00102066, - 0x59a00406, 0x59a80806, 0x48035006, 0x80040d80, - 0x8c040d0c, 0x02020800, 0x001006df, 0x59a00207, - 0x48035007, 0x59a00407, 0x48035008, 0x0201f000, - 0x00102066, 0x800409c0, 0x04000005, 0x4a034406, - 0x00000001, 0x0201f000, 0x001020b2, 0x0201f800, - 0x00104e0d, 0x04020005, 0x4a034406, 0x00000016, - 0x0201f000, 0x001020b2, 0x836c0580, 0x00000003, - 0x04000005, 0x4a034406, 0x00000007, 0x0201f000, - 0x001020b2, 0x59a00c06, 0x82040500, 0xffffff00, - 0x02020000, 0x001020b6, 0x82041580, 0x000000ff, - 0x04020007, 0x59a80010, 0x82000500, 0x000000ff, - 0x82001540, 0x0000ff00, 0x0401f011, 0x82040400, - 0x00101eb5, 0x50000000, 0x80000110, 0x82000580, - 0x00000080, 0x02000000, 0x001020b6, 0x59a80010, - 0x82000500, 0x000000ff, 0x80041580, 0x02000000, - 0x001020b6, 0x840409c0, 0x80041540, 0x0201f800, - 0x00020892, 0x04020005, 0x4a034406, 0x00000003, - 0x0201f000, 0x001020b2, 0x48ee6021, 0x480a621c, - 0x4a02641c, 0x0000bc09, 0x4a026406, 0x00000001, - 0x0201f800, 0x0010381a, 0x04020007, 0x0201f800, - 0x000208b4, 0x4a034406, 0x00000002, 0x0201f000, - 0x001020b2, 0x497a5a04, 0x497a5805, 0x4a025c04, - 0x00008000, 0x4a01d809, 0x00102657, 0x492e6008, - 0x42027000, 0x00000032, 0x0201f000, 0x000208d8, - 0x800409c0, 0x04000005, 0x4a034406, 0x00000001, - 0x0201f000, 0x001020b2, 0x0201f800, 0x00104e0d, - 0x04020005, 0x4a034406, 0x00000016, 0x0201f000, - 0x001020b2, 0x836c0580, 0x00000003, 0x04000005, - 0x4a034406, 0x00000007, 0x0201f000, 0x001020b2, - 0x59a00c06, 0x82040500, 0xffffff00, 0x02020000, - 0x001020b6, 0x82041580, 0x000000ff, 0x04020007, - 0x59a80010, 0x82000500, 0x000000ff, 0x82001540, - 0x0000ff00, 0x0401f011, 0x82040400, 0x00101eb5, - 0x50000000, 0x80000110, 0x82000580, 0x00000080, - 0x02000000, 0x001020b6, 0x59a80010, 0x82000500, - 0x000000ff, 0x80041580, 0x02000000, 0x001020b6, - 0x840409c0, 0x80041540, 0x0201f800, 0x00020892, - 0x04020005, 0x4a034406, 0x00000003, 0x0201f000, - 0x001020b2, 0x48ee6021, 0x480a621c, 0x4a02641c, - 0x0000bc05, 0x4a026406, 0x00000001, 0x0201f800, - 0x0010381a, 0x04020007, 0x0201f800, 0x000208b4, - 0x4a034406, 0x00000002, 0x0201f000, 0x001020b2, - 0x497a5a04, 0x497a5805, 0x4a025c04, 0x00008000, - 0x4a01d809, 0x00102657, 0x492e6008, 0x42027000, - 0x00000032, 0x0201f000, 0x000208d8, 0x592c0005, - 0x82000580, 0x01000000, 0x02020000, 0x00102066, - 0x4a034406, 0x00000004, 0x0201f000, 0x001020b2, - 0x497b4406, 0x497b4207, 0x0201f800, 0x0010393e, - 0x04000008, 0x59a80066, 0x59a8086a, 0x80040480, - 0x59a80867, 0x48074406, 0x80041480, 0x480b4207, - 0x49674407, 0x59a8000e, 0x48034209, 0x495f4409, - 0x59a80020, 0x4803420b, 0x0201f000, 0x00102066, - 0x800409c0, 0x04000005, 0x4a034406, 0x00000001, - 0x0201f000, 0x001020b2, 0x59a00406, 0x8c000500, - 0x0402000f, 0x59a80069, 0x81640480, 0x04001008, - 0x59a8000b, 0x81500580, 0x04000009, 0x59a8006a, - 0x59a81066, 0x80080580, 0x04000005, 0x4a034406, - 0x00000018, 0x0201f000, 0x001020b2, 0x59a80005, - 0x84000558, 0x48035005, 0x82000540, 0x00000001, - 0x0201f800, 0x00101668, 0x0201f800, 0x00103a9f, - 0x0201f000, 0x00102066, 0x4803c856, 0x800409c0, - 0x02020000, 0x001020ba, 0x59a00406, 0x8c00051e, - 0x04000008, 0x4803c856, 0x59a0020b, 0x82000480, - 0x00000800, 0x04001015, 0x0201f000, 0x001020b6, - 0x4803c856, 0x59a0020b, 0x599c0a01, 0x80040480, - 0x04021003, 0x0201f000, 0x001020b6, 0x59a8000e, - 0x81640580, 0x04000009, 0x4a034406, 0x00000018, - 0x0201f000, 0x001020b2, 0x4a034406, 0x00000005, - 0x0201f000, 0x001020b2, 0x59a80026, 0x8c00050a, - 0x040007fa, 0x59a00406, 0x8c00051e, 0x04000036, - 0x0201f800, 0x00020892, 0x040007f4, 0x0201f800, - 0x0010381a, 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, 0x0010383e, 0x4a01d809, - 0x00102846, 0x4a034000, 0x00000001, 0x49334001, - 0x1c01f000, 0x0201f800, 0x0010698c, 0x0201f800, - 0x00100b29, 0x0401f86d, 0x497b5057, 0x4201d000, - 0x00002710, 0x0201f800, 0x00105e06, 0x59c40880, - 0x4c040000, 0x59c408a3, 0x4c040000, 0x497b4002, - 0x0401f876, 0x0401f893, 0x4a03a005, 0x10000000, - 0x0401f8b4, 0x0401f901, 0x04000048, 0x59c80001, - 0x800001c0, 0x040007fc, 0x59c80018, 0x82000500, - 0xf0000000, 0x59c00808, 0x82040d00, 0x0fffffff, - 0x80040540, 0x48038008, 0x0201f800, 0x00100f0f, - 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, - 0x00100615, 0x59c00807, 0x82040d00, 0x0000000c, - 0x040007fa, 0x0401f003, 0x4a035057, 0x00000001, - 0x0401f8da, 0x0201f800, 0x00106c8a, 0x0401f818, - 0x4201d000, 0x000186a0, 0x0201f800, 0x00105e06, - 0x5c000800, 0x480788a3, 0x5c000800, 0x48078880, - 0x59a80057, 0x800001c0, 0x02000000, 0x00102066, - 0x0201f000, 0x001020be, 0x599c0201, 0x48035059, - 0x41780800, 0x42001000, 0x00003b10, 0x0201f800, - 0x001063ee, 0x480b505a, 0x1c01f000, 0x0201f800, - 0x00106982, 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, 0x00101395, - 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, - 0x001063ee, 0x59940024, 0x80080400, 0x48032824, - 0x80000580, 0x1c01f000, 0x4d900000, 0x4dd00000, - 0x4da40000, 0x4d140000, 0x417a3000, 0x0201f800, - 0x00106e2f, 0x0201f800, 0x00106b13, 0x5c022800, - 0x5c034800, 0x5c03a000, 0x5c032000, 0x1c01f000, - 0x59c80007, 0x8c000500, 0x04000003, 0x4a03900d, - 0x00000030, 0x1c01f000, 0x4a038805, 0x00020000, - 0x42000800, 0x0000003c, 0x0201f800, 0x00101395, - 0x4a038891, 0x0000ffff, 0x59c80035, 0x48039035, - 0x4a03900d, 0x00000040, 0x42038000, 0x00007700, - 0x0201f800, 0x00100f0f, 0x42038000, 0x00007720, - 0x0201f800, 0x00100f0f, 0x4a03a005, 0x20000000, - 0x4a03a005, 0x30000000, 0x59d00806, 0x8c040d0a, - 0x040207fe, 0x1c01f000, 0x4d300000, 0x4031d800, - 0x58ef400b, 0x58ee580d, 0x58ec0002, 0x82000580, - 0x00000200, 0x5c026000, 0x02000000, 0x001020aa, - 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, 0x0010383e, 0x4a01d809, - 0x00102846, 0x0401f007, 0x832c0400, 0x00000006, - 0x0201f800, 0x00103841, 0x4a01d809, 0x00102846, - 0x5c026000, 0x1c01f000, 0x58ec000d, 0x40025800, - 0x592c0204, 0x82000580, 0x00000103, 0x04020006, - 0x0201f800, 0x000208b4, 0x5c026000, 0x0201f000, - 0x00102066, 0x58ec000d, 0x40025800, 0x592c0404, - 0x8400055e, 0x48025c04, 0x42028800, 0x000007fd, - 0x42003000, 0x00fffffd, 0x0201f800, 0x001043fc, - 0x04000003, 0x80000580, 0x0401f004, 0x59a26001, - 0x0201f800, 0x00109146, 0x5c026000, 0x02000000, - 0x001020b2, 0x4d300000, 0x4a01d809, 0x00102899, - 0x0401f7dc, 0x592c0005, 0x82000580, 0x01000000, - 0x02000000, 0x001020be, 0x4d300000, 0x59a26001, - 0x5930020b, 0x59301c0a, 0x900001c0, 0x800c1d40, - 0x5930040d, 0x5930120d, 0x900001c0, 0x80081540, - 0x592c0a05, 0x832c0400, 0x00000006, 0x0201f800, - 0x00103841, 0x4a01d809, 0x00102846, 0x4a034000, - 0x00000001, 0x5c026000, 0x1c01f000, 0x4933c857, - 0x4c300000, 0x5930040b, 0x82000c80, 0x0000000e, - 0x04001004, 0x4a025a05, 0x0000000e, 0x0401f003, - 0x48025a05, 0x0401f00c, 0x800409c0, 0x0400000a, - 0x4c040000, 0x0201f800, 0x0010381a, 0x5c000800, - 0x04000003, 0x40040000, 0x0401f7f0, 0x80000580, - 0x0401f003, 0x82000540, 0x00000001, 0x5c006000, - 0x1c01f000, 0x59a00206, 0x82000580, 0x00000044, - 0x1c01f000, 0x4807c857, 0x800409c0, 0x0400000c, - 0x0201f800, 0x001016c1, 0x04020009, 0x42000000, - 0x00000002, 0x0201f800, 0x001018fa, 0x42000000, - 0x00000002, 0x0201f800, 0x00101892, 0x59a00406, - 0x82000500, 0x00000007, 0x0c01f001, 0x001028ed, - 0x00102902, 0x00102918, 0x001028eb, 0x001028eb, - 0x001028eb, 0x001028eb, 0x001028eb, 0x0201f000, - 0x001020b6, 0x42000800, 0x000000c0, 0x0201f800, - 0x001019ac, 0x82040540, 0x00000002, 0x42000800, - 0x000000c0, 0x0201f800, 0x001019b1, 0x42000800, - 0x00000000, 0x0201f800, 0x001019ac, 0x82040540, - 0x00000008, 0x42000800, 0x00000000, 0x0201f800, - 0x001019b1, 0x0401f00b, 0x42000800, 0x000000c0, - 0x0201f800, 0x001019ac, 0x82040540, 0x00000001, - 0x42000800, 0x000000c0, 0x0201f800, 0x001019b1, - 0x59c80040, 0x4c000000, 0x59a80010, 0x4c000000, - 0x59c400a3, 0x4c000000, 0x59c40008, 0x4c000000, - 0x0401f911, 0x04000021, 0x0201f800, 0x00100615, - 0x59a80821, 0x800409c0, 0x02020000, 0x001020ba, - 0x0201f800, 0x00104e0d, 0x04020005, 0x4a034406, - 0x00000016, 0x0201f000, 0x001020b2, 0x836c0580, - 0x00000003, 0x02020000, 0x001020ba, 0x59c408a4, - 0x82040d00, 0x0000000f, 0x82040580, 0x00000000, - 0x02020000, 0x001020ba, 0x59c80040, 0x4c000000, - 0x59a80010, 0x4c000000, 0x59c400a3, 0x4c000000, - 0x59c40008, 0x4c000000, 0x59c40080, 0x4c000000, - 0x59a0020f, 0x59a0bc0f, 0x905cb9c0, 0x805cbd40, - 0x41784800, 0x41785000, 0x41785800, 0x41789000, - 0x41789800, 0x0401fe21, 0x0201f800, 0x0010698c, - 0x0201f800, 0x00100b29, 0x4178c000, 0x497b4002, - 0x0401f95c, 0x0401f9aa, 0x59a0020c, 0x59a00c0c, - 0x80040d40, 0x04000002, 0x0401f9fb, 0x0401f9fa, - 0x0401fe68, 0x8060c1c0, 0x04020014, 0x0401fa98, - 0x0401feb2, 0x0402000e, 0x0201f800, 0x00101941, - 0x04020008, 0x4a034406, 0x00000017, 0x0201f800, - 0x001020b2, 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, 0x00101941, 0x04020008, - 0x4a034406, 0x00000017, 0x0201f800, 0x001020b2, - 0x4203e000, 0x50000000, 0x0401f000, 0x42005800, - 0x0000dddd, 0x0401f005, 0x59c00807, 0x82040d00, - 0x0000000c, 0x040007ea, 0x0401fe5c, 0x59a0040c, - 0x800001c0, 0x04000002, 0x0401f856, 0x0401fe6b, - 0x40240000, 0x80280540, 0x802c0540, 0x04020003, - 0x805cb9c0, 0x04020781, 0x0201f800, 0x00106c8a, - 0x0401fda3, 0x4201d000, 0x000186a0, 0x0201f800, - 0x00105e06, 0x5c000800, 0x48078880, 0x5c000800, - 0x48078808, 0x5c000800, 0x480788a3, 0x5c000800, - 0x48075010, 0x5c000800, 0x48079040, 0x0201f800, - 0x001009b6, 0x59a00406, 0x82000500, 0x00000003, - 0x82000580, 0x00000002, 0x0400002c, 0x42000800, - 0x000000c0, 0x0201f800, 0x001019ac, 0x82040500, - 0xfffffffc, 0x42000800, 0x000000c0, 0x0201f800, - 0x001019b1, 0x42000800, 0x00000000, 0x0201f800, - 0x001019ac, 0x82040500, 0xfffffff7, 0x42000800, - 0x00000000, 0x0201f800, 0x001019b1, 0x42000800, - 0x00000000, 0x0201f800, 0x001019ac, 0x82040500, - 0xfffffffb, 0x42000800, 0x00000000, 0x0201f800, - 0x001019b1, 0x4a0388a7, 0x0000f7f7, 0x42006000, - 0xbeffffff, 0x42006800, 0x80018000, 0x0201f800, - 0x001040ad, 0x42006000, 0xfffeffff, 0x41786800, - 0x0201f800, 0x001040ad, 0x402c0000, 0x80280540, - 0x80240540, 0x02000000, 0x00102066, 0x48274406, - 0x482b4207, 0x482f4407, 0x0201f000, 0x001020c2, - 0x59a26000, 0x813261c0, 0x0400000e, 0x59325808, - 0x812e59c0, 0x0400000b, 0x0201f800, 0x000208b4, - 0x0201f800, 0x00100843, 0x59a26001, 0x59325808, - 0x0201f800, 0x000208b4, 0x0201f800, 0x00100843, - 0x1c01f000, 0x42000800, 0x000000ef, 0x0201f800, - 0x00101655, 0x59c400a3, 0x8400055a, 0x8400053a, - 0x480388a3, 0x0201f800, 0x001016ac, 0x0402000a, - 0x42000000, 0x00000001, 0x0201f800, 0x001018fa, - 0x42000000, 0x00000001, 0x0201f800, 0x00101892, - 0x0401f013, 0x0201f800, 0x001016b3, 0x04020008, - 0x41780000, 0x0201f800, 0x001018fa, 0x41780000, - 0x0201f800, 0x00101892, 0x0401f009, 0x42000000, - 0x00000002, 0x0201f800, 0x001018fa, 0x42000000, - 0x00000002, 0x0201f800, 0x00101892, 0x42000800, - 0x00000000, 0x0201f800, 0x001019ac, 0x82040540, - 0x00000004, 0x42000800, 0x00000000, 0x0201f800, - 0x001019b1, 0x4201d000, 0x00000014, 0x0201f800, - 0x00105dd2, 0x59c40008, 0x8400054e, 0x82000500, - 0xffffffe1, 0x48038808, 0x4a0388a7, 0x0000f7f7, - 0x42001000, 0x04000001, 0x0201f800, 0x001019aa, - 0x42006000, 0xbe20bfff, 0x42006800, 0x80018000, - 0x0201f800, 0x001040ad, 0x42006000, 0xfffeffff, - 0x41786800, 0x0201f800, 0x001040ad, 0x4200b000, - 0x00001388, 0x4201d000, 0x00000014, 0x4c580000, - 0x0201f800, 0x00105dd2, 0x0201f800, 0x00101941, - 0x5c00b000, 0x04000004, 0x8058b040, 0x040207f6, - 0x0401f025, 0x59c40005, 0x8c000534, 0x04020007, - 0x59c400a4, 0x82000500, 0x0000000f, 0x82000580, - 0x00000008, 0x0402001c, 0x42006000, 0x00020000, - 0x0201f800, 0x001040b2, 0x4201d000, 0x00000064, - 0x0201f800, 0x00105dd2, 0x42006000, 0xfeffffff, - 0x42006800, 0x02000000, 0x0201f800, 0x001040ad, - 0x42006000, 0xfdffffff, 0x41786800, 0x0201f800, - 0x001040ad, 0x4a038805, 0x04000001, 0x59c400a4, - 0x82000500, 0x0000000f, 0x82000580, 0x00000000, - 0x04000003, 0x82000540, 0x00000001, 0x1c01f000, - 0x4803c856, 0x42038000, 0x00007700, 0x0201f800, - 0x00100f0f, 0x59c00006, 0x59a0040c, 0x800001c0, - 0x0400003f, 0x59a03c0c, 0x59a00209, 0x59a01c09, - 0x900c19c0, 0x800c1d40, 0x59a0020e, 0x59a0240e, - 0x901021c0, 0x80102540, 0x59a0020b, 0x82000500, - 0x0000fffc, 0x59a0140b, 0x900811c0, 0x80081540, - 0x480b8003, 0x0201f800, 0x00020892, 0x02000800, - 0x00100615, 0x49334000, 0x0201f800, 0x0010082a, - 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, 0x00101395, - 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, 0x00020892, - 0x02000800, 0x00100615, 0x49334001, 0x0201f800, - 0x0010082a, 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, 0x00105e06, 0x480ba002, - 0x59a80059, 0x4803a008, 0x4813a000, 0x480fa001, - 0x4a03a005, 0x10000000, 0x02005800, 0x00100615, - 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, - 0x00100615, 0x404c0000, 0x0c01f001, 0x00102c02, - 0x00102c04, 0x00102c0a, 0x0201f800, 0x00100615, - 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, 0x00100615, - 0x40480000, 0x0c01f001, 0x00102c25, 0x00102c27, - 0x00102c2f, 0x0201f800, 0x00100615, 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, - 0x0010082a, 0x5c000800, 0x02000800, 0x00100615, - 0x4a025a04, 0x0000000a, 0x492c0801, 0x1c01f000, - 0x42006000, 0x00102d9d, 0x42000800, 0x0000007c, - 0x0201f800, 0x00101395, 0x4a03902c, 0x00200000, - 0x4200b000, 0x000001f4, 0x59c8002c, 0x8c00052c, - 0x04000007, 0x8058b040, 0x040207fc, 0x42000000, - 0x00004003, 0x41781000, 0x0401f11e, 0x50301000, - 0x41784800, 0x4a03902d, 0x00008000, 0x4200b000, - 0x000001f4, 0x59c8002c, 0x8c000534, 0x04000007, - 0x8058b040, 0x040207fc, 0x42000000, 0x00004003, - 0x41781000, 0x0401f10f, 0x0401f895, 0x80244800, - 0x82240580, 0x000003b1, 0x040207fc, 0x0401f911, - 0x41784800, 0x0401f8bb, 0x80244800, 0x82240580, - 0x000003b1, 0x040207fc, 0x80306000, 0x82300580, - 0x00102d9f, 0x040207e2, 0x59a80863, 0x800409c0, - 0x04000007, 0x42000000, 0x00004004, 0x42001000, - 0x00000002, 0x59a81862, 0x0401f0f6, 0x42006000, - 0x00102d9d, 0x50301000, 0x41784800, 0x4a03902d, - 0x00000800, 0x0401f876, 0x80244800, 0x82240580, - 0x00000018, 0x040207fc, 0x0401f8f2, 0x41784800, - 0x0401f89c, 0x80244800, 0x82240580, 0x00000018, - 0x040207fc, 0x80306000, 0x82300580, 0x00102d9f, - 0x040207ed, 0x59a80863, 0x800409c0, 0x04000007, - 0x42000000, 0x00004004, 0x42001000, 0x00000010, - 0x59a81862, 0x0401f0d7, 0x42006000, 0x00102d9d, - 0x50301000, 0x41784800, 0x4a03902d, 0x00000400, - 0x0401f857, 0x80244800, 0x82240580, 0x00000088, - 0x040207fc, 0x0401f8d3, 0x41784800, 0x0401f87d, - 0x80244800, 0x82240580, 0x00000088, 0x040207fc, - 0x80306000, 0x82300580, 0x00102d9f, 0x040207ed, - 0x59a80863, 0x800409c0, 0x04000007, 0x42000000, - 0x00004004, 0x42001000, 0x00000008, 0x59a81862, - 0x0401f0b8, 0x42006000, 0x00102d9d, 0x50301000, - 0x41784800, 0x4a03902d, 0x00002000, 0x4200b000, - 0x000001f4, 0x59c8002c, 0x8c000530, 0x04000007, - 0x8058b040, 0x040207fc, 0x42000000, 0x00004003, - 0x41781000, 0x0401f0a7, 0x59c8002c, 0x82000500, - 0xffe0ffff, 0x82080d00, 0x001f0000, 0x80040540, - 0x4803902c, 0x0401f826, 0x80244800, 0x82240580, - 0x00000110, 0x040207fc, 0x0401f8a2, 0x41784800, - 0x0401f84c, 0x59c80034, 0x82080d00, 0x001f0000, - 0x82000500, 0x001f0000, 0x80040580, 0x04000006, - 0x59a80063, 0x80000000, 0x48035063, 0x40240000, - 0x48035062, 0x80244800, 0x82240580, 0x00000110, - 0x040207f0, 0x80306000, 0x82300580, 0x00102d9f, - 0x040207cf, 0x59a80863, 0x800409c0, 0x04000006, - 0x42000000, 0x00004004, 0x42001000, 0x00000020, - 0x59a81862, 0x0201f000, 0x00102066, 0x59c8002c, - 0x82000500, 0xffff0000, 0x82080d00, 0x0000ffff, - 0x80040540, 0x4803902c, 0x480b9028, 0x480b9029, - 0x59a80064, 0x82000580, 0x00000004, 0x04000003, - 0x480b902a, 0x480b902b, 0x59c8002d, 0x82000500, - 0xfffffc00, 0x80240540, 0x4803902d, 0x4200b000, - 0x000001f4, 0x59c8002c, 0x82000500, 0x18000000, - 0x04000007, 0x8058b040, 0x040207fb, 0x42000000, - 0x00004003, 0x41781000, 0x0401f05a, 0x4a03902e, - 0x00000001, 0x4200b000, 0x000001f4, 0x59c8002e, - 0x8c000500, 0x04000006, 0x8058b040, 0x040207fc, - 0x42000000, 0x00004003, 0x0401f04e, 0x1c01f000, - 0x41783800, 0x59c8002d, 0x82000500, 0xfffffc00, - 0x80240d40, 0x4807902d, 0x4200b000, 0x000001f4, - 0x59c8002c, 0x82000500, 0x18000000, 0x04000007, - 0x8058b040, 0x040207fb, 0x42000000, 0x00004003, - 0x41781000, 0x0401f03b, 0x59c81830, 0x59c80030, - 0x800c0d80, 0x040207fd, 0x80080d80, 0x04000002, - 0x801c3800, 0x59c82031, 0x59c80031, 0x80100d80, - 0x040207fd, 0x80080d80, 0x04000002, 0x801c3800, - 0x59a80064, 0x82000580, 0x00000004, 0x04000019, - 0x59c82832, 0x59c80032, 0x80140d80, 0x040207fd, - 0x80080d80, 0x04000002, 0x801c3800, 0x59c83033, - 0x59c80033, 0x80180d80, 0x040207fd, 0x80080d80, - 0x04000002, 0x801c3800, 0x59c80034, 0x59c80834, - 0x80040d80, 0x040207fd, 0x80080d80, 0x82040d00, - 0x0000ffff, 0x0400000c, 0x801c3800, 0x0401f00a, - 0x59c80034, 0x59c80834, 0x80040d80, 0x040207fd, - 0x80080d80, 0x82040d00, 0x000000ff, 0x04000002, - 0x801c3800, 0x801c39c0, 0x04000005, 0x59a80063, - 0x801c0400, 0x48035063, 0x48275062, 0x1c01f000, - 0x48034206, 0x48074406, 0x480b4207, 0x480f4407, - 0x48134208, 0x48174408, 0x0201f000, 0x00102069, - 0x42000000, 0x00600000, 0x80000040, 0x040207ff, - 0x1c01f000, 0x5a5a5a5a, 0xa5a5a5a5, 0x59a00c0a, - 0x800409c0, 0x02000000, 0x001020b6, 0x82040480, - 0x00000021, 0x02021000, 0x001020b6, 0x82040480, - 0x00000011, 0x04001003, 0x42000800, 0x00000010, - 0x59a00208, 0x59a01407, 0x900811c0, 0x80081540, - 0x59a00207, 0x59a01c06, 0x900c19c0, 0x800c1d40, - 0x0201f800, 0x0010381a, 0x04000006, 0x0201f800, - 0x0010383e, 0x4a01d809, 0x00102dc0, 0x1c01f000, - 0x4a034406, 0x00000002, 0x0201f000, 0x001020b2, - 0x4031d800, 0x58ef400b, 0x58ec0002, 0x82000580, - 0x00000200, 0x02000000, 0x001020aa, 0x59a00c0a, - 0x82040480, 0x00000011, 0x04001003, 0x42000800, - 0x00000010, 0x59a0040b, 0x59a0120b, 0x900811c0, - 0x80081540, 0x59a00209, 0x59a01c08, 0x900c19c0, - 0x800c1d40, 0x58ec0003, 0x0201f800, 0x00103841, - 0x4a01d809, 0x00102ddb, 0x1c01f000, 0x4031d800, - 0x58ef400b, 0x58ec0002, 0x82000580, 0x00000200, - 0x02000000, 0x001020aa, 0x59a00c0a, 0x82040480, - 0x00000011, 0x02001000, 0x00102066, 0x82040c80, - 0x00000010, 0x59a00208, 0x59a01407, 0x900811c0, - 0x80081540, 0x59a00207, 0x59a01c06, 0x900c19c0, - 0x800c1d40, 0x82081400, 0x00000040, 0x58ec0003, - 0x0201f800, 0x0010383e, 0x4a01d809, 0x00102df9, - 0x1c01f000, 0x4031d800, 0x58ef400b, 0x58ec0002, - 0x82000580, 0x00000200, 0x02000000, 0x001020aa, - 0x59a0040a, 0x82000c80, 0x00000010, 0x59a0040b, - 0x59a0120b, 0x900811c0, 0x80081540, 0x59a00209, - 0x59a01c08, 0x900c19c0, 0x800c1d40, 0x82081400, - 0x00000040, 0x58ec0003, 0x0201f800, 0x00103841, - 0x4a01d809, 0x0010205f, 0x1c01f000, 0x48efc857, - 0x59a00207, 0x59a01407, 0x900001c0, 0x80081540, - 0x59a00209, 0x59a01c09, 0x900001c0, 0x800c1d40, - 0x59a00406, 0x48034000, 0x480b4001, 0x480f4002, - 0x0201f800, 0x0010381a, 0x04020005, 0x4a034406, - 0x00000002, 0x0201f000, 0x001020b2, 0x42000800, - 0x00000010, 0x0201f800, 0x0010383e, 0x4a01d809, - 0x00102e2e, 0x1c01f000, 0x4031d800, 0x58ef400b, - 0x58ee580d, 0x58ec0002, 0x82000580, 0x00000200, - 0x02000000, 0x001020aa, 0x48efc857, 0x49a3c857, - 0x492fc857, 0x592c0a04, 0x80040910, 0x04020005, - 0x4a034406, 0x00000019, 0x0201f000, 0x001020b2, - 0x4805d80c, 0x0401f00a, 0x4031d800, 0x58ef400b, - 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, - 0x001020aa, 0x48efc857, 0x49a3c857, 0x48efc857, - 0x49a3c857, 0x58ec000c, 0x80000040, 0x04000012, - 0x4801d80c, 0x0201f800, 0x0010381a, 0x04020005, - 0x4a034406, 0x00000002, 0x0201f000, 0x001020b2, - 0x42000800, 0x00000010, 0x58ec1007, 0x58ec1808, - 0x0201f800, 0x0010383e, 0x4a01d809, 0x00102e42, - 0x1c01f000, 0x58ee580d, 0x48efc857, 0x49a3c857, - 0x492fc857, 0x492f3006, 0x592c0404, 0x8400055e, - 0x48025c04, 0x4a01d809, 0x00102e6c, 0x1c01f000, - 0x4d2c0000, 0x58ee580d, 0x48efc857, 0x49a3c857, - 0x492fc857, 0x592c0404, 0x8400051e, 0x48025c04, - 0x59a00000, 0x59a01001, 0x59a01802, 0x80081400, - 0x820c1c40, 0x00000000, 0x832c0400, 0x00000004, - 0x42000800, 0x00000010, 0x5c025800, 0x0201f000, - 0x00103841, 0x800409c0, 0x04000005, 0x4a034406, - 0x00000001, 0x0201f000, 0x001020b2, 0x836c0580, - 0x00000003, 0x04000005, 0x4a034406, 0x00000007, - 0x0201f000, 0x001020b2, 0x59a0320b, 0x82183500, - 0x000000ff, 0x59a28c06, 0x0201f800, 0x00020267, - 0x02020000, 0x001020b6, 0x83440580, 0x000007fd, - 0x04000008, 0x0201f800, 0x00104836, 0x04000005, - 0x4a034406, 0x00000009, 0x0201f000, 0x001020b2, - 0x0201f800, 0x0010381a, 0x04020005, 0x4a034406, - 0x00000002, 0x0201f000, 0x001020b2, 0x801831c0, - 0x0400000a, 0x412c0800, 0x0201f800, 0x0010381a, - 0x04020005, 0x4a034406, 0x00000002, 0x0201f000, - 0x001020b2, 0x40065800, 0x4a025c04, 0x00008000, - 0x497a5a04, 0x0201f800, 0x00108ebd, 0x04020005, - 0x4a034406, 0x00000003, 0x0201f000, 0x001020b2, - 0x4a01d809, 0x00102ebf, 0x1c01f000, 0x592c0005, - 0x82000580, 0x01000000, 0x04020005, 0x4a034406, - 0x00000004, 0x0201f000, 0x001020b2, 0x592c0406, - 0x82002d00, 0x0000ff00, 0x82000500, 0x000000ff, - 0x80000904, 0x80040800, 0x82040480, 0x00000006, - 0x04001003, 0x42000800, 0x00000005, 0x4c500000, - 0x4c540000, 0x4c580000, 0x832ca400, 0x00000006, - 0x4050a800, 0x4004b000, 0x0201f800, 0x0010a94f, - 0x59a00407, 0x59a01207, 0x900811c0, 0x80081540, - 0x59a00409, 0x59a01a09, 0x900c19c0, 0x800c1d40, - 0x832c0400, 0x00000006, 0x4c140000, 0x0201f800, - 0x00103841, 0x5c002800, 0x801429c0, 0x04000003, - 0x4a01d809, 0x00102ef2, 0x5c00b000, 0x5c00a800, - 0x5c00a000, 0x1c01f000, 0x4031d800, 0x58ef400b, - 0x58ee580d, 0x58ec0002, 0x82000580, 0x00000200, - 0x02000000, 0x001020aa, 0x812e59c0, 0x02000800, - 0x00100615, 0x592c0006, 0x82000500, 0xff000000, - 0x80000904, 0x800409c0, 0x02000000, 0x001020aa, - 0x82040480, 0x0000000e, 0x04001003, 0x42000800, - 0x0000000d, 0x592e5801, 0x812e59c0, 0x02000800, - 0x00100615, 0x4c500000, 0x4c540000, 0x4c580000, - 0x832ca400, 0x00000005, 0x4050a800, 0x4004b000, - 0x0201f800, 0x0010a94f, 0x5c00b000, 0x5c00a800, - 0x5c00a000, 0x58ec1007, 0x58ec1808, 0x832c0400, - 0x00000005, 0x0201f000, 0x00103841, 0x0201f800, - 0x0010381a, 0x04020005, 0x4a034406, 0x00000002, - 0x0201f000, 0x001020b2, 0x59a00c06, 0x82040500, - 0x0000ff00, 0x840001c0, 0x82001480, 0x00000007, - 0x02021000, 0x001020b6, 0x0c01f001, 0x00102f36, - 0x00102f3d, 0x00102f44, 0x00102f44, 0x00102f44, - 0x00102f46, 0x00102f4b, 0x42000800, 0x0000000d, - 0x42003800, 0x00102f5f, 0x4a034000, 0x0010b2e7, - 0x0401f013, 0x42000800, 0x0000000d, 0x42003800, - 0x00102f5f, 0x4a034000, 0x0010b2f4, 0x0401f00c, - 0x0201f000, 0x001020b6, 0x42000800, 0x00000008, - 0x42003800, 0x00102f72, 0x0401f005, 0x42000800, - 0x00000004, 0x42003800, 0x00102fbc, 0x59a00207, - 0x59a01407, 0x900001c0, 0x80081540, 0x59a00209, - 0x59a01c09, 0x900001c0, 0x800c1d40, 0x832c0400, - 0x00000005, 0x4c1c0000, 0x0201f800, 0x0010383e, - 0x5c003800, 0x481dd809, 0x1c01f000, 0x4031d800, - 0x58ef400b, 0x58ee580d, 0x58ec0002, 0x82000580, - 0x00000200, 0x02000000, 0x001020aa, 0x4a03501f, - 0x00000001, 0x4200b000, 0x0000000d, 0x59a0a800, - 0x832ca400, 0x00000005, 0x0201f800, 0x0010a93e, - 0x0201f000, 0x00102066, 0x4031d800, 0x58ef400b, - 0x58ee580d, 0x58ec0002, 0x82000580, 0x00000200, - 0x02000000, 0x001020aa, 0x832ca400, 0x00000005, - 0x50500000, 0x82001500, 0x000c0016, 0x02020000, - 0x001020b6, 0x82500c00, 0x00000003, 0x50040000, - 0x82001500, 0x00000001, 0x02020000, 0x001020b6, - 0x50500000, 0x82001500, 0x00000028, 0x0400001d, - 0x82081580, 0x00000028, 0x02020000, 0x001020b6, - 0x80500800, 0x50040000, 0x82001500, 0x00000013, - 0x82081580, 0x00000013, 0x02020000, 0x001020b6, - 0x80040800, 0x50040000, 0x82001500, 0x00010000, - 0x82081580, 0x00010000, 0x02020000, 0x001020b6, - 0x836c0580, 0x00000000, 0x04000012, 0x599c0019, - 0x8c00050e, 0x0402000f, 0x0201f000, 0x001020b6, - 0x80500800, 0x50040000, 0x82001500, 0x00000013, - 0x02020000, 0x001020b6, 0x80040800, 0x50040000, - 0x82001500, 0x00010000, 0x02020000, 0x001020b6, - 0x4200b000, 0x00000008, 0x4200a800, 0x0010b2df, - 0x0201f800, 0x0010a93e, 0x0201f000, 0x00102066, - 0x4031d800, 0x58ef400b, 0x58ee580d, 0x58ec0002, - 0x82000580, 0x00000200, 0x02000000, 0x001020aa, - 0x4200b000, 0x00000004, 0x4200a800, 0x0010b6f9, - 0x832ca400, 0x00000005, 0x0201f800, 0x0010a93e, - 0x59a80005, 0x84000550, 0x48035005, 0x0201f000, - 0x00102066, 0x0201f800, 0x0010381a, 0x04020005, - 0x4a034406, 0x00000002, 0x0201f000, 0x001020b2, - 0x59a00c06, 0x82040500, 0x0000ff00, 0x840001c0, - 0x82001480, 0x00000006, 0x02021000, 0x001020b6, - 0x0c01f001, 0x00102fe7, 0x00102fec, 0x00102ff1, - 0x00102ff1, 0x00102ff1, 0x00102ff3, 0x42000800, - 0x0000000d, 0x4200a000, 0x0010b2e7, 0x0401f00c, - 0x42000800, 0x0000000d, 0x4200a000, 0x0010b2f4, - 0x0401f007, 0x0201f000, 0x001020b6, 0x42000800, - 0x00000008, 0x4200a000, 0x0010b2df, 0x4004b000, - 0x832cac00, 0x00000005, 0x0201f800, 0x0010a93e, - 0x59a00207, 0x59a01407, 0x900001c0, 0x80081540, - 0x59a00209, 0x59a01c09, 0x900001c0, 0x800c1d40, - 0x832c0400, 0x00000005, 0x0201f000, 0x00103841, - 0x836c0580, 0x00000000, 0x04020005, 0x4a034406, - 0x00000007, 0x0201f000, 0x001020b2, 0x59a01406, - 0x800811c0, 0x04020017, 0x59c40801, 0x82040d00, - 0x00018000, 0x82040580, 0x00000000, 0x04020004, - 0x4a034406, 0x00000000, 0x0401f048, 0x82040580, - 0x00008000, 0x04020004, 0x4a034406, 0x00000001, - 0x0401f042, 0x82040580, 0x00010000, 0x02020800, - 0x00100615, 0x4a034406, 0x00000003, 0x0401f03b, - 0x59a8006f, 0x8c000508, 0x04000005, 0x42000000, - 0x00000001, 0x40000800, 0x0401f003, 0x59a00207, - 0x59a80853, 0x48035053, 0x0201f800, 0x001016ac, - 0x0400000d, 0x0201f800, 0x001016b3, 0x0400000a, - 0x0201f800, 0x001016ba, 0x04000007, 0x0201f800, - 0x001016c1, 0x04000004, 0x48075053, 0x0201f000, - 0x001020b6, 0x82080580, 0x00000002, 0x0402001f, - 0x59c40006, 0x84000500, 0x48038806, 0x0201f800, - 0x00106c32, 0x497b8880, 0x0201f800, 0x0010a7e7, - 0x0201f800, 0x0010a7f5, 0x42000000, 0x0010b6c9, - 0x0201f800, 0x0010a86e, 0x82000540, 0x00000001, - 0x0201f800, 0x00104e5d, 0x4a038808, 0x00000000, - 0x4202d800, 0x00000004, 0x42001000, 0x00000001, - 0x0201f800, 0x001019aa, 0x4a035049, 0x00000001, - 0x0201f800, 0x0010071a, 0x0201f000, 0x00102066, - 0x800409c0, 0x04000005, 0x4a034406, 0x00000001, - 0x0201f000, 0x001020b2, 0x836c0580, 0x00000003, - 0x04000005, 0x4a034406, 0x00000007, 0x0201f000, - 0x001020b2, 0x59a28c06, 0x59a0320b, 0x82183500, - 0x000000ff, 0x0201f800, 0x00020267, 0x02020000, - 0x001020b6, 0x83440580, 0x000007fd, 0x04000008, - 0x0201f800, 0x00104836, 0x04000005, 0x42000800, - 0x00000009, 0x0201f000, 0x001020b2, 0x0201f800, - 0x0010381a, 0x04020005, 0x4a034406, 0x00000002, - 0x0201f000, 0x001020b2, 0x497a5a04, 0x4a025c04, - 0x00008000, 0x0201f800, 0x00108ed2, 0x04020005, - 0x4a034406, 0x00000003, 0x0201f000, 0x001020b2, - 0x4a01d809, 0x00103097, 0x1c01f000, 0x592c0005, - 0x82000d00, 0x0000ffff, 0x82000500, 0xffff0000, - 0x82000580, 0x01000000, 0x04020005, 0x4a034406, - 0x00000004, 0x0201f000, 0x001020b2, 0x80040904, - 0x4c500000, 0x4c540000, 0x4c580000, 0x832ca400, - 0x00000005, 0x4050a800, 0x4004b000, 0x0201f800, - 0x0010a94f, 0x5c00b000, 0x5c00a800, 0x5c00a000, - 0x59a00207, 0x59a01407, 0x900001c0, 0x80081540, - 0x59a00209, 0x59a01c09, 0x900001c0, 0x800c1d40, - 0x832c0400, 0x00000005, 0x0201f000, 0x00103841, - 0x496fc857, 0x836c0580, 0x00000000, 0x04000005, - 0x4a034406, 0x0000001a, 0x0201f000, 0x001020b2, - 0x0201f800, 0x00104e0d, 0x02020800, 0x00103f5c, - 0x42000800, 0x00000020, 0x59a00407, 0x59a01207, - 0x900811c0, 0x80081540, 0x59a00409, 0x59a01a09, - 0x900c19c0, 0x800c1d40, 0x419c0000, 0x49a3c857, - 0x0201f800, 0x0010383e, 0x4a01d809, 0x001030d9, - 0x1c01f000, 0x4833c857, 0x4031d800, 0x58ef400b, - 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, - 0x001020aa, 0x599c0200, 0x800001c0, 0x02000000, - 0x001020b6, 0x59a8006f, 0x8c000504, 0x04020003, - 0x8c000506, 0x04000004, 0x599c0019, 0x8400050c, - 0x48033819, 0x0201f800, 0x001095a3, 0x59a8006f, - 0x8c000502, 0x04000004, 0x599c0017, 0x84000508, - 0x48033817, 0x0201f800, 0x0010393e, 0x04020004, - 0x8c00050a, 0x02020000, 0x001020b6, 0x4803c857, - 0x8c000504, 0x04020004, 0x59c408a3, 0x84040d7a, - 0x480788a3, 0x8c000502, 0x04020004, 0x59c408a3, - 0x84040d08, 0x480788a3, 0x599c0c02, 0x8c000500, - 0x04020004, 0x8c000516, 0x04000012, 0x0401f001, - 0x82041480, 0x0000007f, 0x02021000, 0x001020b6, - 0x82041400, 0x00101eb5, 0x50081000, 0x82081500, - 0x000000ff, 0x8c000500, 0x04020006, 0x480b5010, - 0x42000800, 0x00000003, 0x0201f800, 0x001069af, - 0x599c0019, 0x8c000506, 0x04000003, 0x4a03b805, - 0x90000000, 0x8c00050e, 0x0402000b, 0x59a80806, - 0x8c040d14, 0x04000008, 0x42000800, 0x0010b2df, - 0x50040800, 0x82040d00, 0x00000028, 0x02020000, - 0x001020b6, 0x82000500, 0x00000030, 0x04000003, - 0x80000108, 0x0401f003, 0x42000000, 0x00000002, - 0x48039040, 0x42000800, 0x00000002, 0x82000400, - 0x0010321c, 0x50001000, 0x0201f800, 0x001069af, - 0x599c0201, 0x82000c80, 0x00000100, 0x02001000, - 0x001020b6, 0x82000c80, 0x00000841, 0x02021000, - 0x001020b6, 0x82000500, 0x00000007, 0x02020000, - 0x001020b6, 0x599c0401, 0x80000540, 0x02000000, - 0x001020b6, 0x599c0409, 0x599c0c07, 0x80040c80, - 0x02021000, 0x001020b6, 0x80000040, 0x02000000, - 0x001020b6, 0x599c0209, 0x599c0a07, 0x80040c80, - 0x02021000, 0x001020b6, 0x80000040, 0x02000000, - 0x001020b6, 0x0201f800, 0x0010509d, 0x0201f800, - 0x00104b53, 0x599c0201, 0x48035004, 0x0201f800, - 0x0010133e, 0x599c020a, 0x800001c0, 0x04000003, - 0x4803504d, 0x0401f003, 0x4a03504d, 0x000000c8, - 0x0201f800, 0x0010393e, 0x04000004, 0x0201f800, - 0x00105e18, 0x417a5000, 0x836c0580, 0x00000000, - 0x0402009a, 0x599c0003, 0x599c0804, 0x9c0001c0, - 0x9c0409c0, 0x48035002, 0x48075003, 0x599c1017, - 0x8c08151c, 0x04000006, 0x599c0005, 0x599c0806, - 0x9c0001c0, 0x9c0409c0, 0x0401f003, 0x82000500, - 0xf0ffffff, 0x48035000, 0x48075001, 0x42001000, - 0x0010b2e7, 0x48001000, 0x48041001, 0x42001000, - 0x0010b2f4, 0x48001000, 0x48041001, 0x59a8006f, - 0x8c000508, 0x04020017, 0x8c00050a, 0x04020021, - 0x599c1019, 0x82081500, 0x0000e000, 0x82080580, - 0x00000000, 0x0402000c, 0x4a035053, 0x00000000, - 0x42000000, 0x00000001, 0x0201f800, 0x001018fa, - 0x42000000, 0x00000001, 0x0201f800, 0x00101892, - 0x0401f02b, 0x82080580, 0x00002000, 0x0402000a, - 0x4a035053, 0x00000001, 0x41780000, 0x0201f800, - 0x001018fa, 0x41780000, 0x0201f800, 0x00101892, - 0x0401f01f, 0x82080580, 0x00004000, 0x04020006, - 0x4a035053, 0x00000002, 0x4a035049, 0x00000001, - 0x0401f017, 0x82080580, 0x00006000, 0x02020000, - 0x001020b6, 0x59a80858, 0x82040d80, 0x01391077, - 0x04020005, 0x59e00813, 0x8c040d00, 0x02020000, - 0x001020b6, 0x4a035053, 0x00000003, 0x42000000, - 0x00000002, 0x0201f800, 0x001018fa, 0x42000000, - 0x00000002, 0x0201f800, 0x00101892, 0x599c0019, - 0x8c000520, 0x0400000d, 0x42000000, 0x00000004, - 0x42000800, 0x00000040, 0x0201f800, 0x001019b1, - 0x42000000, 0x00000010, 0x42000800, 0x000000c0, - 0x0201f800, 0x001019b1, 0x4a035032, 0x0000aaaa, - 0x599c1018, 0x82081500, 0x00000030, 0x59a8006c, - 0x80000540, 0x0400000c, 0x82080580, 0x00000000, - 0x02000000, 0x001020b6, 0x599c1018, 0x82081500, - 0xffffffcf, 0x82081540, 0x00000010, 0x480b3818, - 0x0401f010, 0x82080d80, 0x00000000, 0x04000007, - 0x82080d80, 0x00000010, 0x0400000a, 0x82080d80, - 0x00000020, 0x04020002, 0x48075032, 0x0201f800, - 0x001038d3, 0x04000008, 0x0201f800, 0x00101668, - 0x0201f800, 0x00101694, 0x59a8002a, 0x80040540, - 0x4803502a, 0x49f3c857, 0x42001000, 0x00104d39, - 0x0201f800, 0x00105cc9, 0x42001000, 0x00104d2c, - 0x0201f800, 0x00105dbd, 0x4a038805, 0xffffffff, - 0x4a03c014, 0x00400040, 0x4a03c013, 0x00400000, - 0x0201f800, 0x00104717, 0x59a0001d, 0x84000540, - 0x4803401d, 0x49f3c857, 0x0201f000, 0x00102066, - 0x00000018, 0x0000000c, 0x00000018, 0x00000020, - 0x836c0580, 0x00000000, 0x04020005, 0x42000800, - 0x00000007, 0x0201f000, 0x001020b2, 0x42000800, - 0x00000020, 0x59a00407, 0x59a01207, 0x900811c0, - 0x80081540, 0x59a00409, 0x59a01a09, 0x900c19c0, - 0x800c1d40, 0x419c0000, 0x0201f000, 0x00103841, - 0x800409c0, 0x04000005, 0x4a034406, 0x00000001, - 0x0201f000, 0x001020b2, 0x0201f800, 0x00104e0d, - 0x04020005, 0x4a034406, 0x00000016, 0x0201f000, - 0x001020b2, 0x59a80013, 0x8c000500, 0x04000011, - 0x4a034406, 0x00000000, 0x42000800, 0x00000020, - 0x59a00407, 0x59a01207, 0x900811c0, 0x80081540, - 0x59a00409, 0x59a01a09, 0x900c19c0, 0x800c1d40, - 0x42000000, 0x0010bc20, 0x0201f000, 0x00103841, - 0x4a034406, 0x00000001, 0x4200b000, 0x00000020, - 0x4200a800, 0x0010bc20, 0x4200a000, 0xffffffff, - 0x4450a800, 0x8054a800, 0x8058b040, 0x040207fd, - 0x4d440000, 0x4d340000, 0x42028800, 0xffffffff, - 0x42002000, 0xffffffff, 0x42003000, 0x00000001, - 0x42003800, 0x00000001, 0x42001800, 0x0010bc20, - 0x59a81010, 0x82081500, 0x000000ff, 0x40180000, - 0x0c01f001, 0x00103275, 0x00103278, 0x0010327c, - 0x00103280, 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, 0x00020267, 0x5c003800, - 0x5c003000, 0x5c001800, 0x5c001000, 0x040207f2, - 0x0201f800, 0x00104842, 0x040207ef, 0x80183000, - 0x801c3800, 0x59341202, 0x40180000, 0x0c01f7ce, - 0x82100580, 0xffffffff, 0x04000002, 0x44101800, - 0x42001800, 0x0010bc20, 0x500c0000, 0x82000500, - 0xffffff00, 0x801c0540, 0x44001800, 0x5c026800, - 0x5c028800, 0x42000800, 0x00000020, 0x59a00407, - 0x59a01207, 0x900811c0, 0x80081540, 0x59a00409, - 0x59a01a09, 0x900c19c0, 0x800c1d40, 0x42000000, - 0x0010bc20, 0x0201f000, 0x00103841, 0x59a28c06, - 0x59a0020b, 0x8c000500, 0x0400000e, 0x59a01208, - 0x59a00408, 0x82000500, 0x000000ff, 0x900001c0, - 0x80081540, 0x41784000, 0x0201f800, 0x00104768, - 0x04000008, 0x48034406, 0x0201f000, 0x001020b6, - 0x0201f800, 0x00020267, 0x02020000, 0x001020b6, - 0x0201f800, 0x0010381a, 0x04020005, 0x4a034406, - 0x00000002, 0x0201f000, 0x001020b2, 0x59a0020b, - 0x8c000500, 0x04000005, 0x0201f800, 0x00104842, - 0x02020000, 0x001038dd, 0x59a0020b, 0x8c000502, - 0x04000019, 0x83440480, 0x000007f0, 0x04021016, - 0x0201f800, 0x0010484b, 0x04020013, 0x497a5a04, - 0x4a025c04, 0x00008000, 0x0201f800, 0x00108ea3, - 0x04020005, 0x4a034406, 0x00000003, 0x0201f000, - 0x001020b2, 0x4a01d809, 0x001032f8, 0x1c01f000, - 0x59a28c06, 0x0201f800, 0x00020267, 0x02020000, - 0x001020b6, 0x4c580000, 0x4c500000, 0x4c540000, - 0x4200b000, 0x0000000a, 0x4134a000, 0x832e5c00, - 0x00000002, 0x412ca800, 0x0201f800, 0x0010a93e, - 0x832cac00, 0x00000006, 0x4054a000, 0x4200b000, - 0x00000004, 0x0201f800, 0x0010a94f, 0x5c00a800, - 0x5c00a000, 0x5c00b000, 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, 0x00103841, 0x496fc857, - 0x496f4406, 0x0201f000, 0x00102066, 0x59a28c06, - 0x0201f800, 0x00020267, 0x02020000, 0x001020b6, - 0x836c0580, 0x00000003, 0x04000005, 0x4a034406, - 0x00000007, 0x0201f000, 0x001020b2, 0x83340c00, - 0x00000006, 0x59a0020b, 0x8c000500, 0x04000003, - 0x83340c00, 0x00000008, 0x58040001, 0x48034409, - 0x900001c0, 0x48034209, 0x50040000, 0x48034407, - 0x900001c0, 0x48034207, 0x59340200, 0x48034406, - 0x0201f000, 0x00102066, 0x800409c0, 0x04000005, - 0x4a034406, 0x00000001, 0x0201f000, 0x001020b2, - 0x59a0220b, 0x8c102500, 0x0402002e, 0x8c102506, - 0x04020006, 0x59a03208, 0x82180480, 0x00000003, - 0x02021000, 0x001020b6, 0x59a28c06, 0x0201f800, - 0x00020267, 0x02020000, 0x001020b6, 0x0201f800, - 0x00104836, 0x04000005, 0x4a034406, 0x00000009, - 0x0201f000, 0x001020b2, 0x0201f800, 0x0010381a, - 0x04020005, 0x4a034406, 0x00000002, 0x0201f000, - 0x001020b2, 0x59a0220b, 0x8c102506, 0x04000004, - 0x59343002, 0x82183500, 0x00ffffff, 0x497a5a04, - 0x4a025c04, 0x00008000, 0x0201f800, 0x00108e65, - 0x04020005, 0x4a034406, 0x00000003, 0x0201f000, - 0x001020b2, 0x4a01d809, 0x001033de, 0x1c01f000, - 0x59a28c06, 0x0201f800, 0x00020267, 0x02020000, - 0x001020b6, 0x0201f800, 0x00104836, 0x04000005, - 0x4a034406, 0x00000009, 0x0201f000, 0x001020b2, - 0x0201f800, 0x0010381a, 0x04020005, 0x4a034406, - 0x00000002, 0x0201f000, 0x001020b2, 0x497a5a04, - 0x4a025c04, 0x00008000, 0x0201f800, 0x0010381a, - 0x04020005, 0x4a034406, 0x00000002, 0x0201f000, - 0x001020b2, 0x592e5800, 0x0201f800, 0x00108e7a, - 0x04020005, 0x4a034406, 0x00000003, 0x0201f000, - 0x001020b2, 0x4a01d809, 0x001033b0, 0x1c01f000, - 0x592c2805, 0x82140d80, 0x01000000, 0x04020005, - 0x4a034406, 0x00000004, 0x0201f000, 0x001020b2, - 0x42000800, 0x00000008, 0x59a00207, 0x59a01407, - 0x900001c0, 0x80081540, 0x59a00209, 0x59a01c09, - 0x900001c0, 0x800c1d40, 0x832c0400, 0x00000005, - 0x0201f800, 0x00103841, 0x8c142d00, 0x04000003, - 0x4a01d809, 0x001033cb, 0x1c01f000, 0x4031d800, - 0x58ef400b, 0x58ee580e, 0x58ec0002, 0x82000580, - 0x00000200, 0x02000000, 0x001020aa, 0x812e59c0, - 0x02000800, 0x00100615, 0x42000800, 0x00000008, - 0x832c0400, 0x00000005, 0x58ec1007, 0x58ec1808, - 0x0201f000, 0x00103841, 0x592c0005, 0x82000580, - 0x01000000, 0x04020005, 0x4a034406, 0x00000004, - 0x0201f000, 0x001020b2, 0x59a00207, 0x59a01407, - 0x900001c0, 0x80081540, 0x59a00209, 0x59a01c09, - 0x900001c0, 0x800c1d40, 0x42000800, 0x00000006, - 0x832c0400, 0x00000006, 0x0201f000, 0x00103841, - 0x59a00a0a, 0x800409c0, 0x02000000, 0x001020b6, - 0x82040480, 0x000000e8, 0x04001003, 0x42000800, - 0x000000e7, 0x59a00207, 0x59a01407, 0x900001c0, - 0x80081540, 0x59a00209, 0x59a01c09, 0x900001c0, - 0x800c1d40, 0x83880400, 0x00000000, 0x0201f800, - 0x00103841, 0x4a01d809, 0x0010340c, 0x1c01f000, - 0x4031d800, 0x58ef400b, 0x58ec0002, 0x82000580, - 0x00000200, 0x02000000, 0x001020aa, 0x59a0020b, - 0x8c000500, 0x04000008, 0x83880400, 0x00000000, - 0x4803c840, 0x4a03c842, 0x00000006, 0x04011000, - 0x497b8885, 0x4a034207, 0x000000e7, 0x0201f000, - 0x00102066, 0x800409c0, 0x04000005, 0x4a034406, - 0x00000001, 0x0201f000, 0x001020b2, 0x0401fbf3, - 0x04020005, 0x4a034406, 0x00000002, 0x0201f000, - 0x001020b2, 0x497a5a04, 0x4a025c04, 0x00008000, - 0x59a00406, 0x800001c0, 0x02000000, 0x001020b6, - 0x82001580, 0x000000ff, 0x04000005, 0x82001480, - 0x00000004, 0x02021000, 0x001020b6, 0x40001000, - 0x0201f800, 0x00101d6a, 0x04020005, 0x4a034406, - 0x00000003, 0x0201f000, 0x001020b2, 0x4a01d809, - 0x00103446, 0x1c01f000, 0x592c0005, 0x82000580, - 0x01000000, 0x02020000, 0x00102066, 0x4a034406, - 0x00000004, 0x0201f000, 0x001020b2, 0x59a01406, - 0x8c081508, 0x04020007, 0x800409c0, 0x04000005, - 0x4a034406, 0x00000001, 0x0201f000, 0x001020b2, - 0x59a01c07, 0x820c0480, 0x00001000, 0x02021000, - 0x001020b6, 0x497b2804, 0x497b2805, 0x497b281c, - 0x497b281d, 0x497b281f, 0x497b2820, 0x497b2822, - 0x497b2823, 0x80000580, 0x0201f800, 0x00101668, - 0x59a80805, 0x8c081500, 0x04000004, 0x82040d40, - 0x00000011, 0x0401f004, 0x8c081506, 0x04000002, - 0x84040d42, 0x84040d0a, 0x48075005, 0x4202d800, - 0x00000001, 0x82081500, 0x000000e0, 0x8008010a, - 0x0c020036, 0x0201f800, 0x00104e0d, 0x04020009, - 0x4a035033, 0x00000001, 0x0201f800, 0x00104d76, - 0x0401f01f, 0x4a035033, 0x00000000, 0x0401f7fb, - 0x497b5032, 0x0201f800, 0x00103f5c, 0x0201f800, - 0x0010698c, 0x0201f800, 0x00106c32, 0x0201f800, - 0x00106982, 0x59a00a07, 0x480788a7, 0x59c400a3, - 0x82000500, 0xfeffffff, 0x82000540, 0x80018000, - 0x40000800, 0x84040d20, 0x480388a3, 0x480788a3, - 0x497b504e, 0x42000800, 0x0000002d, 0x42001000, - 0x00103fe4, 0x0201f800, 0x00105ca2, 0x59a00407, - 0x800000c2, 0x800008c4, 0x8005d400, 0x42000000, - 0x0000ffff, 0x0201f800, 0x00104e0d, 0x04000003, - 0x59a00207, 0x80000110, 0x0201f800, 0x00103915, - 0x0201f000, 0x00102066, 0x00103479, 0x0010347c, - 0x00103484, 0x001020b6, 0x00103481, 0x001020b6, - 0x001020b6, 0x001020b6, 0x836c0580, 0x00000003, - 0x04000005, 0x4a034406, 0x00000007, 0x0201f000, - 0x001020b2, 0x59a03c06, 0x59a00407, 0x59a04a07, - 0x902449c0, 0x80244d40, 0x59a00409, 0x59a05209, - 0x902851c0, 0x80285540, 0x0401fb54, 0x04020005, - 0x4a034406, 0x00000002, 0x0201f000, 0x001020b2, - 0x417a8800, 0x41783000, 0x497b4001, 0x497b4004, - 0x832c4400, 0x00000005, 0x48234002, 0x8c1c3d04, - 0x04020078, 0x0201f800, 0x00020267, 0x0402002a, - 0x0201f800, 0x00104836, 0x04000004, 0x0201f800, - 0x00104732, 0x04020024, 0x8c1c3d00, 0x04000008, - 0x59340009, 0x44004000, 0x59340008, 0x80204000, - 0x44004000, 0x80204000, 0x0401f007, 0x59340007, - 0x44004000, 0x59340006, 0x80204000, 0x44004000, - 0x80204000, 0x83440580, 0x000007fe, 0x0400000d, - 0x83440580, 0x000007fc, 0x0400000a, 0x0201f800, - 0x00104842, 0x04000003, 0x85468d5e, 0x0401f005, - 0x0201f800, 0x00104686, 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, - 0x00102066, 0x4a034004, 0x00000001, 0x49474000, - 0x59a00001, 0x80180400, 0x48034001, 0x481f4003, - 0x4a01d801, 0x00000000, 0x4819d804, 0x59a00002, - 0x4801d803, 0x4825d807, 0x4829d808, 0x4000a800, - 0x4000a000, 0x4018b000, 0x0201f800, 0x0010a93e, - 0x40ec1000, 0x0201f800, 0x001008a1, 0x4a01d809, - 0x00103536, 0x1c01f000, 0x4031d800, 0x58ef400b, - 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, - 0x001020aa, 0x59a00004, 0x80000540, 0x04020008, - 0x59a28800, 0x59a04002, 0x59a03803, 0x41783000, - 0x58ec4807, 0x58ec5008, 0x0401f78f, 0x59a00801, - 0x800408c4, 0x48074406, 0x0201f000, 0x00102066, - 0x0201f800, 0x00020267, 0x0402002f, 0x0201f800, - 0x00104836, 0x04000004, 0x0201f800, 0x00104732, - 0x04020029, 0x83440580, 0x000007fe, 0x04000011, - 0x83440580, 0x000007fc, 0x0400000e, 0x0201f800, - 0x00104842, 0x04000005, 0x59340403, 0x8400055e, - 0x48026c03, 0x0401f007, 0x0201f800, 0x00104686, - 0x04020004, 0x59340403, 0x8400055e, 0x48026c03, - 0x4134a000, 0x4020a800, 0x4200b000, 0x00000006, - 0x0201f800, 0x0010a93e, 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, - 0x00102066, 0x4a034004, 0x00000001, 0x49474000, - 0x59a00001, 0x80180400, 0x48034001, 0x481f4003, - 0x4a01d801, 0x00000000, 0x4819d804, 0x59a00002, - 0x4801d803, 0x4825d807, 0x4829d808, 0x40ec1000, - 0x0201f800, 0x001008a1, 0x4a01d809, 0x001035ad, - 0x1c01f000, 0x4031d800, 0x58ef400b, 0x58ec0002, - 0x82000580, 0x00000200, 0x02000000, 0x001020aa, - 0x59a00004, 0x80000540, 0x04020008, 0x59a28800, - 0x59a04002, 0x59a03803, 0x41783000, 0x58ec4807, - 0x58ec5008, 0x0401f78f, 0x59a00801, 0x800408c4, - 0x48074406, 0x0201f000, 0x00102066, 0x42002800, - 0x0000007e, 0x59a00c06, 0x59a01207, 0x59a01c07, - 0x59a02209, 0x82040500, 0x0000ff00, 0x840001c0, - 0x82003480, 0x00000020, 0x02001000, 0x001020b6, - 0x80140480, 0x02001000, 0x001020b6, 0x82040500, - 0x000000ff, 0x82003480, 0x00000020, 0x02001000, - 0x001020b6, 0x80140480, 0x02001000, 0x001020b6, - 0x82080500, 0x0000ff00, 0x840001c0, 0x82003480, - 0x00000020, 0x02001000, 0x001020b6, 0x80140480, - 0x02001000, 0x001020b6, 0x82080500, 0x000000ff, - 0x82003480, 0x00000020, 0x02001000, 0x001020b6, - 0x80140480, 0x02001000, 0x001020b6, 0x820c0500, - 0x0000ff00, 0x840001c0, 0x82003480, 0x00000020, - 0x02001000, 0x001020b6, 0x80140480, 0x02001000, - 0x001020b6, 0x820c0500, 0x000000ff, 0x82003480, - 0x00000020, 0x02001000, 0x001020b6, 0x80140480, - 0x02001000, 0x001020b6, 0x82100500, 0x0000ff00, - 0x840001c0, 0x82003480, 0x00000020, 0x02001000, - 0x001020b6, 0x80140480, 0x02001000, 0x001020b6, - 0x82100500, 0x000000ff, 0x82003480, 0x00000020, - 0x02001000, 0x001020b6, 0x80140480, 0x02001000, - 0x001020b6, 0x900401c0, 0x80080d40, 0x900c01c0, - 0x80101d40, 0x83a83400, 0x0000003a, 0x44043000, - 0x80183000, 0x440c3000, 0x0201f000, 0x00102066, - 0x0401f9fa, 0x04020005, 0x4a034406, 0x00000002, - 0x0201f000, 0x001020b2, 0x42000800, 0x0000000c, - 0x0401f853, 0x4a01d809, 0x0010362c, 0x1c01f000, - 0x4031d800, 0x58ee580d, 0x58ef400b, 0x58ec0002, - 0x82000580, 0x00000200, 0x02000000, 0x001020aa, - 0x832ca400, 0x00000004, 0x4200b000, 0x0000000c, - 0x40c8a800, 0x0201f800, 0x0010a93e, 0x58c80200, - 0x80000540, 0x04000034, 0x58c80400, 0x82000500, - 0xfffffffb, 0x04020030, 0x58c80401, 0x80000540, - 0x0400002d, 0x82000480, 0x0000ff01, 0x0402102a, - 0x58c80202, 0x82000480, 0x0000005c, 0x04001026, - 0x0201f800, 0x001060db, 0x58c80c08, 0x58c80204, - 0x80040480, 0x04001020, 0x58c80204, 0x82000480, - 0x00000005, 0x0402101c, 0x58c80205, 0x58c80c08, - 0x80040902, 0x80040480, 0x04001017, 0x58c80c08, - 0x0201f800, 0x0010602a, 0x0400001b, 0x0201f800, - 0x00105ef2, 0x04020012, 0x4979940b, 0x59c408a3, - 0x82040d40, 0x00000002, 0x480788a3, 0x4a038830, - 0x00000001, 0x4a038832, 0x01ffffff, 0x58c80202, - 0x48030804, 0x0201f800, 0x00105ed4, 0x0201f000, - 0x00102066, 0x0201f000, 0x001020b6, 0x0201f800, - 0x0010612d, 0x0201f800, 0x0010613a, 0x0201f800, - 0x0010601d, 0x0201f000, 0x001020b2, 0x4c000000, - 0x59a01207, 0x59a00407, 0x900811c0, 0x80081540, - 0x59a01a09, 0x59a00409, 0x900c19c0, 0x800c1d40, - 0x5c000000, 0x0401f1b9, 0x59840000, 0x82000580, - 0x00000000, 0x04000050, 0x59840002, 0x8c000504, - 0x0400004d, 0x84000546, 0x48030802, 0x0201f800, - 0x0010601d, 0x59c408a3, 0x82040d00, 0xfffffffd, - 0x480788a3, 0x4c5c0000, 0x4200b800, 0x0010aa00, - 0x505e6800, 0x813669c0, 0x04000008, 0x5936600e, - 0x813261c0, 0x04000005, 0x0201f800, 0x0010600e, - 0x02000800, 0x001061e5, 0x805cb800, 0x825c0580, - 0x0010b1f0, 0x040207f3, 0x59866003, 0x813261c0, - 0x0400000b, 0x59300406, 0x82000580, 0x00000009, - 0x02020800, 0x00100615, 0x5930b800, 0x0201f800, - 0x00105ffa, 0x405e6000, 0x0401f7f5, 0x497b0803, - 0x4200b800, 0x0010b317, 0x505e6000, 0x813261c0, - 0x04000011, 0x59300406, 0x82000580, 0x00000009, - 0x0402000d, 0x59300203, 0x82000580, 0x00000004, - 0x04020009, 0x59326809, 0x813669c0, 0x02020800, - 0x00100615, 0x0201f800, 0x00100ee4, 0x0201f800, - 0x00105ffa, 0x4578b800, 0x805cb800, 0x825c0580, - 0x0010b31f, 0x040207e9, 0x42000800, 0x0010b315, - 0x49780801, 0x49780800, 0x0201f800, 0x0010612d, - 0x0201f800, 0x0010613a, 0x5c00b800, 0x0201f800, - 0x00105eed, 0x0201f000, 0x00102066, 0x836c0580, - 0x00000003, 0x04000005, 0x4a034406, 0x00000007, - 0x0201f000, 0x001020b2, 0x59a00407, 0x59a02207, - 0x901021c0, 0x80102540, 0x59a00409, 0x59a02a09, - 0x901429c0, 0x80142d40, 0x0401f930, 0x04020005, - 0x4a034406, 0x00000002, 0x0201f000, 0x001020b2, - 0x417a8800, 0x41781800, 0x497b4001, 0x497b4003, - 0x832c3400, 0x00000004, 0x481b4002, 0x41440000, - 0x81ac0400, 0x50026800, 0x813669c0, 0x0400000b, - 0x0201f800, 0x00104836, 0x04020008, 0x59340002, - 0x48003000, 0x49443001, 0x82183400, 0x00000002, - 0x820c1c00, 0x00000002, 0x81468800, 0x83440480, - 0x00000800, 0x04000005, 0x820c0480, 0x00000010, - 0x0402100b, 0x0401f7ea, 0x800c19c0, 0x04020006, - 0x59a00801, 0x80040902, 0x48074406, 0x0201f000, - 0x00102066, 0x4a034003, 0x00000001, 0x49474000, - 0x59a00001, 0x800c0400, 0x48034001, 0x40ec1000, - 0x4a001001, 0x00000000, 0x480c1004, 0x59a00002, - 0x48001003, 0x48101007, 0x48141008, 0x0201f800, - 0x001008a1, 0x4a01d809, 0x00103728, 0x1c01f000, - 0x4031d800, 0x58ef400b, 0x58ec0002, 0x82000580, - 0x00000200, 0x02000000, 0x001020aa, 0x59a00003, - 0x80000540, 0x04020008, 0x59a28800, 0x59a03002, - 0x41781800, 0x40ec1000, 0x58082007, 0x58082808, - 0x0401f7bf, 0x59a00801, 0x80040902, 0x48074406, - 0x0201f000, 0x00102066, 0x800409c0, 0x04000005, - 0x4a034406, 0x00000001, 0x0201f000, 0x001020b2, - 0x59a80026, 0x8c00050a, 0x04020007, 0x8c000506, - 0x04020005, 0x4a034406, 0x00000016, 0x0201f000, - 0x001020b2, 0x0401f8cd, 0x04020005, 0x4a034406, - 0x00000002, 0x0201f000, 0x001020b2, 0x59a00c06, - 0x80040902, 0x59a00407, 0x59a01207, 0x900811c0, - 0x80081540, 0x59a00409, 0x59a01a09, 0x900c19c0, - 0x800c1d40, 0x832c0400, 0x00000005, 0x0401f8df, - 0x4a01d809, 0x00103763, 0x1c01f000, 0x4031d800, - 0x58ef400b, 0x58ee580d, 0x58ec0002, 0x82000580, - 0x00000200, 0x02000000, 0x001020aa, 0x592c0009, - 0x0201f800, 0x001059b9, 0x02000800, 0x001043fc, - 0x02020000, 0x001020b6, 0x49474001, 0x481a6802, - 0x592c000a, 0x82001d80, 0x70000000, 0x04020007, - 0x0401f8a2, 0x04020011, 0x4a034406, 0x00000002, - 0x0201f000, 0x001020b2, 0x82001d80, 0x72000000, - 0x02020000, 0x001020b6, 0x0401f898, 0x04020897, - 0x04020896, 0x04020005, 0x4a034406, 0x00000002, - 0x0201f000, 0x001020b2, 0x58ee580d, 0x4a025c04, - 0x00008000, 0x497a5a04, 0x592c3208, 0x80183102, - 0x592c1801, 0x4a001805, 0x01000000, 0x0201f800, - 0x00108e8e, 0x04020005, 0x4a034406, 0x00000003, - 0x0201f000, 0x001020b2, 0x4a01d809, 0x0010379d, - 0x1c01f000, 0x592c4000, 0x592c0005, 0x82000580, - 0x01000000, 0x04020005, 0x4a034406, 0x00000004, - 0x0201f000, 0x001020b2, 0x4c580000, 0x4c500000, - 0x4c540000, 0x832c3c00, 0x00000005, 0x401ca000, - 0x401ca800, 0x5820280a, 0x4200b000, 0x00000002, - 0x82143580, 0x70000000, 0x04000003, 0x4200b000, - 0x0000000f, 0x0201f800, 0x0010a94f, 0x5c00a800, - 0x5c00a000, 0x5c00b000, 0x401c0000, 0x58201006, - 0x58201807, 0x58202205, 0x80102102, 0x82143580, - 0x70000000, 0x04020008, 0x82103480, 0x00000002, - 0x02001000, 0x001020b6, 0x42000800, 0x00000002, - 0x0401f079, 0x82143580, 0x72000000, 0x02020000, - 0x001020b6, 0x82103480, 0x0000002a, 0x02001000, - 0x001020b6, 0x42000800, 0x0000000f, 0x0401f86e, - 0x4a01d809, 0x001037d7, 0x1c01f000, 0x4031d800, - 0x58ef400b, 0x58ee580e, 0x58ec0002, 0x82000580, - 0x00000200, 0x02000000, 0x001020aa, 0x592e5800, - 0x832c0c00, 0x00000005, 0x4c580000, 0x4c500000, - 0x4c540000, 0x4004a000, 0x4004a800, 0x4200b000, - 0x0000000f, 0x0201f800, 0x0010a94f, 0x5c00a800, - 0x5c00a000, 0x5c00b000, 0x40ec1000, 0x4a001001, - 0x00000000, 0x4a001004, 0x0000000f, 0x48041003, - 0x0201f800, 0x001008a1, 0x4a01d809, 0x001037f9, - 0x1c01f000, 0x4031d800, 0x58ef400b, 0x58ee580e, - 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, - 0x001020aa, 0x832c0c00, 0x00000005, 0x4c580000, - 0x4c500000, 0x4c540000, 0x4004a000, 0x4004a800, - 0x4200b000, 0x0000000c, 0x0201f800, 0x0010a94f, - 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x40ec1000, - 0x4a001001, 0x00000000, 0x4a001004, 0x0000000c, - 0x48041003, 0x0201f800, 0x001008a1, 0x4a01d809, - 0x0010205f, 0x1c01f000, 0x0201f800, 0x0010082a, - 0x04000010, 0x497a5800, 0x58ec000d, 0x80000540, - 0x04020004, 0x492dd80d, 0x492dd80e, 0x0401f007, - 0x58ec000e, 0x48025800, 0x82000400, 0x00000001, - 0x452c0000, 0x492dd80e, 0x832c0400, 0x00000004, - 0x492fc857, 0x4803c857, 0x1c01f000, 0x4d2c0000, - 0x58ec400d, 0x802041c0, 0x04000008, 0x4823c857, - 0x40225800, 0x592c4001, 0x497a5801, 0x0201f800, - 0x0010083a, 0x0401f7f8, 0x4979d80d, 0x4979d80e, - 0x5c025800, 0x1c01f000, 0x42003000, 0x00000001, - 0x0401f003, 0x42003000, 0x00000000, 0x4803c857, - 0x4807c857, 0x480bc857, 0x480fc857, 0x481bc857, - 0x48efc857, 0x4819d801, 0x800409c0, 0x02000800, - 0x00100615, 0x4805d804, 0x4801d803, 0x4809d807, - 0x480dd808, 0x40ec1000, 0x0201f800, 0x001008a1, - 0x4a01d809, 0x0010205f, 0x1c01f000, 0x80002d80, - 0x480bc857, 0x480fc857, 0x4813c857, 0x4817c857, - 0x4d2c0000, 0x4da00000, 0x42034000, 0x0010b2a0, - 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, 0x0010082a, 0x04000007, 0x492f401a, - 0x492f401b, 0x412c3800, 0x497b421c, 0x497a5813, - 0x0401f026, 0x59880052, 0x80000000, 0x48031052, - 0x59a00017, 0x80000040, 0x48034017, 0x59a00219, - 0x59a03816, 0x801c3c00, 0x0401f01c, 0x59a0021c, - 0x82000400, 0x00000002, 0x82000c80, 0x00000012, - 0x04021004, 0x4803421c, 0x801c3c00, 0x0401f013, - 0x0201f800, 0x0010082a, 0x0402000b, 0x59880052, - 0x80000000, 0x48031052, 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, 0x0010b611, - 0x0201f800, 0x0010a86e, 0x801800d0, 0x40002800, - 0x42001000, 0x00008014, 0x0401f786, 0x4c000000, - 0x599c0017, 0x8c000512, 0x5c000000, 0x1c01f000, - 0x4c000000, 0x599c0018, 0x8c00050e, 0x5c000000, - 0x1c01f000, 0x59a80821, 0x800409c0, 0x04000005, - 0x4a034406, 0x00000001, 0x0201f000, 0x001020b2, - 0x836c0580, 0x00000003, 0x04000005, 0x4a034406, - 0x00000007, 0x0201f000, 0x001020b2, 0x599c0017, - 0x8c00050a, 0x04000005, 0x4a034406, 0x00000008, - 0x0201f000, 0x001020b2, 0x59340405, 0x8c000508, - 0x04020004, 0x8c00050a, 0x02020000, 0x001032e2, - 0x497a5a04, 0x497a5805, 0x4a025c04, 0x00008000, - 0x0201f800, 0x00108f2d, 0x04020005, 0x4a034406, - 0x00000003, 0x0201f000, 0x001020b2, 0x4a01d809, - 0x00103906, 0x1c01f000, 0x592c0005, 0x82000580, - 0x01000000, 0x04020005, 0x4a034406, 0x00000004, - 0x0201f000, 0x001020b2, 0x59a28c06, 0x0201f800, - 0x00020267, 0x02020000, 0x001020b6, 0x0201f000, - 0x001032e2, 0x82001580, 0x0000ffff, 0x04000009, - 0x0201f800, 0x001059b9, 0x02000800, 0x00020267, - 0x0402000c, 0x0201f800, 0x00105ce7, 0x0401f009, - 0x42028800, 0x000007ef, 0x0201f800, 0x00020267, - 0x02000800, 0x00105ce7, 0x81468840, 0x040217fb, - 0x1c01f000, 0x4803c856, 0x4c0c0000, 0x4d340000, - 0x4d440000, 0x42028800, 0x000007fe, 0x0201f800, - 0x00020267, 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, 0x00000007, - 0x02021800, 0x00100615, 0x0c01f807, 0x5c00a800, - 0x5c00a000, 0x5c00b000, 0x1c01f000, 0x0401f90c, - 0x0401f7fb, 0x0010396c, 0x00103972, 0x00103997, - 0x001039b9, 0x00103a78, 0x0010396b, 0x1c01f000, - 0x59c40806, 0x8c040d00, 0x04020003, 0x84040d40, - 0x48078806, 0x1c01f000, 0x59c40005, 0x8c000534, - 0x02020000, 0x001040ce, 0x4a038805, 0xffffffff, - 0x42006000, 0x00020000, 0x0201f800, 0x001040b2, - 0x59a80015, 0x82000500, 0xfffffffa, 0x84000542, - 0x48035015, 0x497b5026, 0x42000800, 0x0010bc20, - 0x45780800, 0x497b5013, 0x42006000, 0xffefffff, - 0x42006800, 0x40000000, 0x0201f800, 0x001040ad, - 0x59c40006, 0x82000500, 0xffffff0f, 0x48038806, - 0x42000800, 0x00000010, 0x42001000, 0x0010401b, - 0x0201f800, 0x00105cbc, 0x0401f001, 0x42006000, - 0xffffffff, 0x42006800, 0x00800000, 0x0201f800, - 0x001040ad, 0x4200b000, 0x000000c8, 0x59c400a4, - 0x82000500, 0x0000000f, 0x82000580, 0x0000000a, - 0x0400000f, 0x8058b040, 0x040207f9, 0x497b5014, - 0x42006000, 0xbf7fffff, 0x42006800, 0x00018000, - 0x0201f800, 0x001040ad, 0x42006000, 0xfffeffff, - 0x41786800, 0x0201f000, 0x001040ad, 0x497b5014, - 0x4a035012, 0x00000000, 0x80000580, 0x0201f000, - 0x001040b9, 0x4a038805, 0xffffffff, 0x59a80012, - 0x82000c80, 0x00000004, 0x02021800, 0x00100615, - 0x0c01f001, 0x001039c4, 0x001039f1, 0x00103a6e, - 0x4803c856, 0x59c400a3, 0x8400051e, 0x480388a3, - 0x4a035012, 0x00000001, 0x59c40008, 0x8400054e, - 0x48038808, 0x0201f800, 0x00104093, 0x42007800, - 0x0010b34a, 0x4a007806, 0x11010000, 0x4200a000, - 0x0010b202, 0x4200a800, 0x0010b351, 0x4200b000, - 0x00000002, 0x0201f800, 0x0010a93e, 0x497b8802, - 0x42000800, 0x00000003, 0x497b504a, 0x0201f800, - 0x00103f8e, 0x4a03504a, 0x00000001, 0x497b5016, - 0x0201f800, 0x001040c0, 0x42006000, 0xffffffff, - 0x42006800, 0x00080000, 0x0201f800, 0x001040ad, - 0x42006000, 0xfff7ffff, 0x41786800, 0x0201f000, - 0x001040ad, 0x59a80016, 0x497b5016, 0x80002540, - 0x0400006a, 0x59c40004, 0x82000500, 0x00000003, - 0x04020075, 0x59a80815, 0x8c040d02, 0x0400004f, - 0x82100580, 0x0000000c, 0x04020053, 0x82100400, - 0x00000018, 0x8000b104, 0x41cc1000, 0x42001800, - 0x0010b34a, 0x50080800, 0x500c0000, 0x80040580, - 0x0402001e, 0x80081000, 0x800c1800, 0x8058b040, - 0x040207f9, 0x0201f800, 0x001040c0, 0x42006000, - 0xffffffff, 0x42006800, 0x00500000, 0x0201f800, - 0x001040ad, 0x4a035012, 0x00000002, 0x4a035014, - 0x00000002, 0x0201f800, 0x0010164b, 0x42000800, - 0x000007d0, 0x42001000, 0x00103f62, 0x0201f800, - 0x00105da7, 0x59a80015, 0x84000506, 0x48035015, - 0x0201f000, 0x00104093, 0x59cc0806, 0x82040d80, - 0x11010000, 0x04020028, 0x59cc0800, 0x82040500, - 0x00ffffff, 0x0400001a, 0x82000580, 0x000000ef, - 0x04020017, 0x59cc0801, 0x82040500, 0x00ffffff, - 0x82000580, 0x000000ef, 0x04020011, 0x83cca400, - 0x00000007, 0x4200a800, 0x0010b202, 0x4200b000, - 0x00000002, 0x50500800, 0x50540000, 0x80040480, - 0x04001007, 0x04020010, 0x8050a000, 0x8054a800, - 0x8058b040, 0x040207f8, 0x0401f00b, 0x59a80015, - 0x84000502, 0x48035015, 0x41cca000, 0x4200a800, - 0x0010b34a, 0x4200b000, 0x00000009, 0x0201f800, - 0x0010a93e, 0x0201f800, 0x001040c0, 0x42006000, - 0xffffffff, 0x42006800, 0x00080000, 0x0201f800, - 0x001040ad, 0x42006000, 0xfff7ffff, 0x41786800, - 0x0201f800, 0x001040ad, 0x42006000, 0xffffffff, - 0x42006800, 0x00004000, 0x0201f800, 0x001040ad, - 0x59c40004, 0x82000500, 0x00000003, 0x04020006, - 0x497b5016, 0x42000800, 0x00000003, 0x0201f000, - 0x00103f8e, 0x1c01f000, 0x1c01f000, 0x59a80014, - 0x82006d80, 0x0000000f, 0x04000005, 0x82000580, - 0x0000001b, 0x02020800, 0x00103f53, 0x1c01f000, - 0x59a80015, 0x84000506, 0x48035015, 0x497b504a, - 0x59a80014, 0x82000c80, 0x0000001e, 0x02021800, - 0x00100615, 0x0c01f001, 0x00103ab6, 0x00103acd, - 0x00103af6, 0x00103b11, 0x00103b34, 0x00103b65, - 0x00103b87, 0x00103bba, 0x00103bdc, 0x00103c00, - 0x00103c3c, 0x00103c63, 0x00103c79, 0x00103c8b, - 0x00103ca3, 0x00103cba, 0x00103cbf, 0x00103ce7, - 0x00103d0a, 0x00103d30, 0x00103d53, 0x00103d86, - 0x00103dc8, 0x00103df2, 0x00103e0a, 0x00103e4a, - 0x00103e63, 0x00103e76, 0x00103e77, 0x4803c856, - 0x4202d800, 0x00000007, 0x0201f800, 0x00104e0d, - 0x04000007, 0x42006000, 0xffffffd7, 0x41786800, - 0x0201f800, 0x001040ad, 0x0401f00b, 0x59c40006, - 0x82000500, 0xffffff0f, 0x48038806, 0x42001000, - 0x000000f0, 0x0201f800, 0x001019aa, 0x0201f800, - 0x00104d6c, 0x1c01f000, 0x4803c856, 0x42006000, - 0xbf7fffff, 0x42006800, 0x00400000, 0x0201f800, - 0x001040ad, 0x0201f800, 0x0010164b, 0x4a035014, - 0x00000001, 0x42001000, 0x0010401b, 0x0201f800, - 0x00105cdd, 0x0201f800, 0x00104024, 0x42000800, - 0x000007d0, 0x42001000, 0x00103f62, 0x0201f000, - 0x00105da7, 0x59a80016, 0x82000580, 0x00000014, - 0x04020023, 0x4803c857, 0x42006000, 0xffbfffff, - 0x41786800, 0x0201f800, 0x001040ad, 0x59c40004, - 0x82000500, 0x00000003, 0x04020019, 0x42001000, - 0x00103f62, 0x0201f800, 0x00105cc9, 0x59cc1006, - 0x82081580, 0x11020000, 0x04020012, 0x59cc1007, - 0x8c08153e, 0x0400000b, 0x59a80015, 0x8c000504, - 0x04020008, 0x42000000, 0x0010b63d, 0x0201f800, - 0x0010a86e, 0x59a80015, 0x84000544, 0x48035015, - 0x4a035014, 0x00000010, 0x0401f1cd, 0x1c01f000, - 0x0201f000, 0x00103f53, 0x4803c856, 0x4a035014, - 0x00000003, 0x42006000, 0xbf3fffff, 0x42006800, - 0x00100000, 0x0201f800, 0x001040ad, 0x42001000, - 0x0010401b, 0x0201f800, 0x00105cdd, 0x0201f800, - 0x00104024, 0x42001000, 0x00103f62, 0x0201f800, - 0x00105cc9, 0x42007800, 0x0010b350, 0x46007800, - 0x11020000, 0x42000800, 0x00000005, 0x0201f000, - 0x00103f8e, 0x59a80016, 0x80000540, 0x0400001e, - 0x4803c857, 0x42001000, 0x00103f62, 0x0201f800, - 0x00105cc9, 0x59a80016, 0x82000580, 0x00000014, - 0x04020016, 0x59cc1006, 0x82081580, 0x11020000, - 0x04020012, 0x59cc1007, 0x8c08153e, 0x0400000b, - 0x59a80015, 0x8c000504, 0x04020008, 0x42000000, - 0x0010b63d, 0x0201f800, 0x0010a86e, 0x59a80015, - 0x84000544, 0x48035015, 0x4a035014, 0x00000004, - 0x0401f004, 0x1c01f000, 0x0201f000, 0x00103f53, - 0x4803c856, 0x4a035014, 0x00000005, 0x83cca400, - 0x00000006, 0x4200a800, 0x0010b350, 0x4200b000, - 0x00000005, 0x0201f800, 0x0010a93e, 0x42007800, - 0x0010b350, 0x46007800, 0x11030000, 0x0201f800, - 0x00103f58, 0x04020014, 0x59a80015, 0x8c000500, - 0x04020011, 0x59a80810, 0x82040580, 0x00ffffff, - 0x0400000d, 0x82040d00, 0x000000ff, 0x82040400, - 0x00101eb5, 0x50000800, 0x80040910, 0x42001000, - 0x00000004, 0x0401fb95, 0x0400000b, 0x0201f800, - 0x0010403d, 0x4200b000, 0x00000004, 0x83cca400, - 0x00000007, 0x4200a800, 0x0010b351, 0x0201f800, - 0x0010a93e, 0x42000800, 0x00000005, 0x0201f000, - 0x00103f8e, 0x59a80016, 0x80000540, 0x0400001e, - 0x4803c857, 0x42001000, 0x00103f62, 0x0201f800, - 0x00105cc9, 0x59a80016, 0x82000580, 0x00000014, - 0x04020016, 0x59cc1006, 0x82081580, 0x11030000, - 0x04020012, 0x59cc1007, 0x8c08153e, 0x0400000b, - 0x59a80015, 0x8c000504, 0x04020008, 0x42000000, - 0x0010b63d, 0x0201f800, 0x0010a86e, 0x59a80015, - 0x84000544, 0x48035015, 0x4a035014, 0x00000006, - 0x0401f003, 0x1c01f000, 0x0401f3cd, 0x4803c856, - 0x4a035014, 0x00000007, 0x83cca400, 0x00000006, - 0x4200a800, 0x0010b350, 0x4200b000, 0x00000005, - 0x0201f800, 0x0010a93e, 0x42007800, 0x0010b350, - 0x46007800, 0x11040000, 0x0401fbc2, 0x04020020, - 0x59a80015, 0x8c000500, 0x0402001d, 0x599c0017, - 0x8c000500, 0x0400001a, 0x599c1402, 0x82080480, - 0x0000007f, 0x02021800, 0x00100615, 0x4c080000, - 0x82081400, 0x00101eb5, 0x50081000, 0x82081500, - 0x000000ff, 0x480b5010, 0x42000800, 0x00000003, - 0x0201f800, 0x001069af, 0x5c000800, 0x42001000, - 0x00000004, 0x0401fb39, 0x04000005, 0x0401fd25, - 0x04000003, 0x0201f800, 0x00101668, 0x42000800, - 0x00000005, 0x0401f3d5, 0x59a80016, 0x80000540, - 0x0400001e, 0x4803c857, 0x42001000, 0x00103f62, - 0x0201f800, 0x00105cc9, 0x59a80016, 0x82000580, - 0x00000014, 0x04020016, 0x59cc1006, 0x82081580, - 0x11040000, 0x04020012, 0x59cc1007, 0x8c08153e, - 0x0400000b, 0x59a80015, 0x8c000504, 0x04020008, - 0x42000000, 0x0010b63d, 0x0201f800, 0x0010a86e, - 0x59a80015, 0x84000544, 0x48035015, 0x4a035014, - 0x00000008, 0x0401f003, 0x1c01f000, 0x0401f378, - 0x4803c856, 0x4a035014, 0x00000009, 0x83cca400, - 0x00000006, 0x4200a800, 0x0010b350, 0x4200b000, - 0x00000005, 0x0201f800, 0x0010a93e, 0x42007800, - 0x0010b350, 0x46007800, 0x11050100, 0x0401fb6d, - 0x0402000a, 0x59a80015, 0x8c000500, 0x04020007, - 0x0401fa88, 0x04020005, 0x82000540, 0x00000001, - 0x0201f800, 0x00101668, 0x42000800, 0x00000005, - 0x0401fb96, 0x4d3c0000, 0x42027800, 0x00000001, - 0x0201f800, 0x00109640, 0x5c027800, 0x1c01f000, - 0x59a80016, 0x80000540, 0x04000038, 0x4803c857, - 0x42001000, 0x00103f62, 0x0201f800, 0x00105cc9, - 0x59a80016, 0x82000580, 0x00000014, 0x04020030, - 0x59cc1006, 0x82080500, 0x11050000, 0x82000580, - 0x11050000, 0x0402002a, 0x8c081510, 0x04000014, - 0x59cc1007, 0x8c08153e, 0x0400000b, 0x59a80015, - 0x8c000504, 0x04020008, 0x42000000, 0x0010b63d, - 0x0201f800, 0x0010a86e, 0x59a80015, 0x84000544, - 0x48035015, 0x4a035013, 0x00000001, 0x4a035014, - 0x0000000a, 0x0401f817, 0x0401f014, 0x80000540, - 0x04020013, 0x59cc1007, 0x8c08153e, 0x0400000b, - 0x59a80015, 0x8c000504, 0x04020008, 0x42000000, - 0x0010b63d, 0x0201f800, 0x0010a86e, 0x59a80015, - 0x84000544, 0x48035015, 0x497b5013, 0x4a035014, - 0x0000000e, 0x0401f06a, 0x1c01f000, 0x0401f318, - 0x4803c856, 0x4a035014, 0x0000000b, 0x42001000, - 0x0010b351, 0x4008a800, 0x4200b000, 0x00000020, - 0x4600a800, 0xffffffff, 0x8054a800, 0x8058b040, - 0x040207fc, 0x42007800, 0x0010b350, 0x46007800, - 0x11060000, 0x42001000, 0x0010b351, 0x0401fb09, - 0x04000005, 0x50080000, 0x46001000, 0x00ffffff, - 0x0401f00c, 0x50080800, 0x82040d00, 0x0000ffff, - 0x59a80010, 0x82000500, 0x000000ff, 0x82000540, - 0x00000100, 0x800000e0, 0x80040d40, 0x44041000, - 0x42000800, 0x00000021, 0x0401f32c, 0x59a80016, - 0x80000540, 0x04000012, 0x4803c857, 0x59a80016, - 0x42001000, 0x00103f62, 0x0201f800, 0x00105cc9, - 0x59a80016, 0x82000580, 0x00000084, 0x04020009, - 0x59cc1006, 0x82081580, 0x11060000, 0x04020005, - 0x4a035014, 0x0000000c, 0x0401f003, 0x1c01f000, - 0x0401f2db, 0x4803c856, 0x4a035014, 0x0000000d, - 0x83cca400, 0x00000006, 0x4200a800, 0x0010b350, - 0x4200b000, 0x00000021, 0x0201f800, 0x0010a93e, - 0x42007800, 0x0010b350, 0x46007800, 0x11070000, - 0x42000800, 0x00000021, 0x0401f304, 0x59a80016, - 0x80000540, 0x04000014, 0x4803c857, 0x59a80016, - 0x42001000, 0x00103f62, 0x0201f800, 0x00105cc9, - 0x82000580, 0x00000084, 0x0402000c, 0x59cc1006, - 0x82081580, 0x11070000, 0x04020008, 0x4a035013, - 0x00000001, 0x0401fa91, 0x4a035014, 0x0000000e, - 0x0401f003, 0x1c01f000, 0x0401f2b1, 0x4803c856, - 0x82040d40, 0x00000001, 0x0201f800, 0x001040b9, - 0x4a035014, 0x0000000f, 0x497b5016, 0x42006000, - 0xffffffff, 0x42006800, 0x00300000, 0x0401fbfe, - 0x42006000, 0xffdfffff, 0x41786800, 0x0401fbfa, - 0x42000800, 0x000007d0, 0x42001000, 0x00103f62, - 0x0201f000, 0x00105ca2, 0x4803c856, 0x59a80016, - 0x80000540, 0x04020296, 0x1c01f000, 0x4803c856, - 0x4a035014, 0x00000011, 0x83cca400, 0x00000006, - 0x4200a800, 0x0010b350, 0x4200b000, 0x00000005, - 0x0201f800, 0x0010a93e, 0x4200a800, 0x0010b350, - 0x4600a800, 0x11020000, 0x0401fa8a, 0x04020015, - 0x59a80010, 0x82000d00, 0xffff0000, 0x04000011, - 0x82000500, 0x000000ff, 0x0400000e, 0x82000c00, - 0x00101eb5, 0x50040800, 0x80040910, 0x82040580, - 0x0000007e, 0x04000007, 0x82040580, 0x00000080, - 0x04000004, 0x42001000, 0x00000004, 0x0401fa07, - 0x42000800, 0x00000005, 0x0401f2a8, 0x59a80016, - 0x80000540, 0x04000020, 0x4803c857, 0x42001000, - 0x00103f62, 0x0201f800, 0x00105cc9, 0x59a80016, - 0x82000580, 0x00000014, 0x04020016, 0x59cc1006, - 0x82081580, 0x11030000, 0x04020012, 0x59cc1007, - 0x8c08153e, 0x0400000b, 0x59a80015, 0x8c000504, - 0x04020008, 0x42000000, 0x0010b63d, 0x0201f800, - 0x0010a86e, 0x59a80015, 0x84000544, 0x48035015, - 0x4a035014, 0x00000012, 0x0401f804, 0x0401f002, - 0x0401fa4b, 0x1c01f000, 0x4803c856, 0x4a035014, - 0x00000013, 0x83cca400, 0x00000006, 0x4200a800, - 0x0010b350, 0x4200b000, 0x00000005, 0x0201f800, - 0x0010a93e, 0x4200a800, 0x0010b350, 0x4600a800, - 0x11030000, 0x0401fa3f, 0x04020013, 0x59a80015, - 0x8c000500, 0x04020010, 0x59a80810, 0x82040580, - 0x00ffffff, 0x0400000c, 0x82040d00, 0x000000ff, - 0x82040400, 0x00101eb5, 0x50000800, 0x80040910, - 0x42001000, 0x00000004, 0x0401f9c0, 0x04000002, - 0x0401fb11, 0x42000800, 0x00000005, 0x0401f25f, - 0x59a80016, 0x80000540, 0x04000020, 0x4803c857, - 0x42001000, 0x00103f62, 0x0201f800, 0x00105cc9, - 0x59a80016, 0x82000580, 0x00000014, 0x04020016, - 0x59cc1006, 0x82081580, 0x11040000, 0x04020012, - 0x59cc1007, 0x8c08153e, 0x0400000b, 0x59a80015, - 0x8c000504, 0x04020008, 0x42000000, 0x0010b63d, - 0x0201f800, 0x0010a86e, 0x59a80015, 0x84000544, - 0x48035015, 0x4a035014, 0x00000014, 0x0401f804, - 0x0401f002, 0x0401fa02, 0x1c01f000, 0x4803c856, - 0x4a035014, 0x00000015, 0x83cca400, 0x00000006, - 0x4200a800, 0x0010b350, 0x4200b000, 0x00000005, - 0x0201f800, 0x0010a93e, 0x4200a800, 0x0010b350, - 0x4600a800, 0x11040000, 0x0401f9f6, 0x04020020, - 0x59a80015, 0x8c000500, 0x0402001d, 0x599c0017, - 0x8c000500, 0x0400001a, 0x599c1402, 0x82080480, - 0x0000007f, 0x02021800, 0x00100615, 0x4c080000, - 0x82081400, 0x00101eb5, 0x50081000, 0x82081500, - 0x000000ff, 0x480b5010, 0x42000800, 0x00000003, - 0x0201f800, 0x001069af, 0x5c000800, 0x42001000, - 0x00000004, 0x0401f96d, 0x04000005, 0x0201f800, - 0x001038d8, 0x02020800, 0x00101668, 0x42000800, - 0x00000005, 0x0401f209, 0x59a80016, 0x80000540, - 0x0400003f, 0x4803c857, 0x42001000, 0x00103f62, - 0x0201f800, 0x00105cc9, 0x59a80016, 0x82000580, - 0x00000014, 0x04020035, 0x59cc1006, 0x82080500, - 0x11050000, 0x82000580, 0x11050000, 0x0402002f, - 0x8c081510, 0x04000010, 0x0401fb1f, 0x59cc1007, - 0x8c08153e, 0x0400000b, 0x59a80015, 0x8c000504, - 0x04020008, 0x42000000, 0x0010b63d, 0x0201f800, - 0x0010a86e, 0x59a80015, 0x84000544, 0x48035015, - 0x0401f013, 0x59cc1007, 0x8c08153e, 0x0400000b, - 0x59a80015, 0x8c000504, 0x04020008, 0x42000000, - 0x0010b63d, 0x0201f800, 0x0010a86e, 0x59a80015, - 0x84000544, 0x48035015, 0x82000540, 0x00000001, - 0x0401fb01, 0x497b5013, 0x0401f003, 0x4a035013, - 0x00000001, 0x59cc1007, 0x8c08153c, 0x04000003, - 0x4a035026, 0x00000008, 0x4a035014, 0x00000016, - 0x0401f804, 0x0401f002, 0x0401f98d, 0x1c01f000, - 0x4803c856, 0x83cca400, 0x00000006, 0x4200a800, - 0x0010b350, 0x4200b000, 0x00000005, 0x0201f800, - 0x0010a93e, 0x4a035014, 0x00000017, 0x59a80013, - 0x8c000500, 0x04000006, 0x42001000, 0x0010b350, - 0x46001000, 0x11050100, 0x0401f003, 0x4a035014, - 0x0000001b, 0x0401f97b, 0x0402000a, 0x59a80015, - 0x8c000500, 0x04020007, 0x0401f896, 0x04020005, - 0x82000540, 0x00000001, 0x0201f800, 0x00101668, - 0x42000800, 0x00000005, 0x0401f9a4, 0x4d3c0000, - 0x42027800, 0x00000001, 0x0201f800, 0x00109640, - 0x5c027800, 0x1c01f000, 0x59a80016, 0x80000540, - 0x04000015, 0x4803c857, 0x42001000, 0x00103f62, - 0x0201f800, 0x00105cc9, 0x59a80016, 0x82000580, - 0x00000084, 0x0402000b, 0x59cc1006, 0x82081580, - 0x11060000, 0x04020007, 0x80000580, 0x0401fab6, - 0x4a035014, 0x00000018, 0x0401f804, 0x0401f002, - 0x0401f94b, 0x1c01f000, 0x4803c856, 0x4a035014, - 0x00000019, 0x83cca400, 0x00000006, 0x4200a800, - 0x0010b350, 0x4200b000, 0x00000021, 0x0201f800, - 0x0010a93e, 0x42003800, 0x0010b351, 0x0401f941, - 0x04020018, 0x401c2800, 0x50141000, 0x80080130, - 0x80000000, 0x40001800, 0x82081500, 0x00ffffff, - 0x800000f0, 0x80080540, 0x44002800, 0x59a80810, - 0x82040d00, 0x000000ff, 0x400c1000, 0x80081104, - 0x82082400, 0x0010b351, 0x50101000, 0x820c0500, - 0x00000003, 0x0c01f806, 0x80081540, 0x44082000, - 0x42000800, 0x00000021, 0x0401f15c, 0x00103e37, - 0x00103e3c, 0x00103e41, 0x00103e46, 0x800408f0, - 0x40040000, 0x82081500, 0x00ffffff, 0x1c01f000, - 0x800408e0, 0x40040000, 0x82081500, 0xff00ffff, - 0x1c01f000, 0x800408d0, 0x40040000, 0x82081500, - 0xffff00ff, 0x1c01f000, 0x40040000, 0x82081500, - 0xffffff00, 0x1c01f000, 0x59a80016, 0x80000540, - 0x04000016, 0x4803c857, 0x42001000, 0x00103f62, - 0x0201f800, 0x00105cc9, 0x59a80016, 0x82000580, - 0x00000084, 0x0402000c, 0x59cc1006, 0x82081580, - 0x11070000, 0x04020008, 0x4a035013, 0x00000001, - 0x0401f8d2, 0x4a035014, 0x0000001a, 0x0401f804, - 0x0401f002, 0x0401f8f2, 0x1c01f000, 0x82000540, - 0x00000001, 0x0401fa54, 0x4a035014, 0x0000001b, - 0x83cca400, 0x00000006, 0x4200a800, 0x0010b350, - 0x59a82016, 0x40100000, 0x8000b104, 0x40580800, - 0x5450a800, 0x8050a000, 0x8054a800, 0x8058b040, - 0x040207fc, 0x0401f119, 0x1c01f000, 0x1c01f000, - 0x4803c856, 0x42003000, 0x00000004, 0x42004000, - 0x0010b351, 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, 0x00101eb5, 0x50242800, 0x82142d00, - 0x000000ff, 0x48175010, 0x4c040000, 0x40140800, - 0x0201f800, 0x00101655, 0x5c000800, 0x40001800, - 0x500c0000, 0x80100540, 0x44001800, 0x59a80015, - 0x84000540, 0x48035015, 0x4200a800, 0x0010b351, - 0x4020a000, 0x4200b000, 0x00000004, 0x0201f800, - 0x0010a93e, 0x82000540, 0x00000001, 0x0401f002, - 0x80000580, 0x1c01f000, 0x4807c857, 0x480bc857, - 0x4008b000, 0x83cca400, 0x00000007, 0x4200a800, - 0x0010b351, 0x40541000, 0x0201f800, 0x0010a93e, - 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, 0x00101eb5, 0x50102800, - 0x82142d00, 0x000000ff, 0x48175010, 0x4c040000, - 0x40140800, 0x0201f800, 0x00101655, 0x5c000800, - 0x59a80015, 0x84000540, 0x48035015, 0x80000580, - 0x1c01f000, 0x4807c856, 0x42001000, 0x00008017, - 0x59a8184e, 0x0201f800, 0x0010a876, 0x0201f800, - 0x00103857, 0x1c01f000, 0x4807c856, 0x4200b000, - 0x00000020, 0x83cca400, 0x00000007, 0x4200a800, - 0x0010bc20, 0x0201f000, 0x0010a94f, 0x4807c856, - 0x0201f800, 0x00106c32, 0x42000800, 0x000000f7, - 0x0401f8f4, 0x497b2804, 0x497b2805, 0x497b281c, - 0x497b281d, 0x4202d800, 0x00000001, 0x42006000, - 0xbf7fffff, 0x42006800, 0x00018000, 0x0401f966, - 0x42006000, 0xfffeffff, 0x41786800, 0x0401f962, - 0x497b504e, 0x42000800, 0x0000002d, 0x42001000, - 0x00103fe4, 0x0201f000, 0x00105ca2, 0x4807c856, - 0x0401ffe3, 0x497b5014, 0x497b5016, 0x1c01f000, - 0x4807c856, 0x59a80005, 0x8c000506, 0x1c01f000, - 0x4807c856, 0x42006000, 0xffffffff, 0x42006800, - 0x00000028, 0x0401f14c, 0x4807c856, 0x0401ffc2, - 0x0201f800, 0x0010698c, 0x4df00000, 0x0201f800, - 0x00106b71, 0x5c03e000, 0x02000800, 0x00106982, - 0x59c400a4, 0x82000500, 0x0000000f, 0x82000580, - 0x00000002, 0x0402000a, 0x42006000, 0xffffffff, - 0x42006800, 0x00200000, 0x0401f937, 0x42006000, - 0xffdfffff, 0x41786800, 0x0401f933, 0x497b5014, - 0x42000800, 0x000000f7, 0x0401f8b2, 0x59c400a3, - 0x82000500, 0xbf20bfff, 0x82000540, 0x0001c000, - 0x480388a3, 0x84000520, 0x480388a3, 0x497b504e, - 0x42000800, 0x0000002d, 0x42001000, 0x00103fe4, - 0x0201f000, 0x00105ca2, 0x497b5016, 0x59b400f5, - 0x8c000500, 0x04020004, 0x82000540, 0x00000001, - 0x480368f5, 0x800400c4, 0x82000400, 0x00002000, - 0x4803910a, 0x59b400f6, 0x82000500, 0x00000018, - 0x040207fd, 0x4a0368f0, 0x0010b349, 0x42000000, - 0x0010b350, 0x4c040000, 0x50000800, 0x82040d80, - 0x11010000, 0x04000003, 0x50000800, 0x4807c857, - 0x5c000800, 0x480368f1, 0x82040400, 0x0000dc00, - 0x480368f3, 0x59c400a4, 0x82000500, 0x0000000f, - 0x82000580, 0x00000008, 0x04020017, 0x4c5c0000, - 0x4c600000, 0x59c4b805, 0x8c5cbd3a, 0x04020005, - 0x42000000, 0x0010b616, 0x0201f800, 0x0010a86e, - 0x4a038805, 0x02000000, 0x0201f800, 0x00101a59, - 0x4000c000, 0x0201f800, 0x001019d0, 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, - 0x00103f62, 0x0201f800, 0x00105da7, 0x1c01f000, - 0x4807c856, 0x0401ff40, 0x0201f800, 0x0010698c, - 0x4df00000, 0x0201f800, 0x00106b71, 0x5c03e000, - 0x02000800, 0x00106982, 0x59c400a4, 0x82000500, - 0x0000000f, 0x82000580, 0x00000002, 0x0402000a, - 0x42006000, 0xffffffff, 0x42006800, 0x00200000, - 0x0401f8b5, 0x42006000, 0xffdfffff, 0x41786800, - 0x0401f8b1, 0x0201f800, 0x00104e13, 0x04000014, - 0x0201f800, 0x00104e23, 0x04020011, 0x4a035032, - 0x0000aaaa, 0x4c040000, 0x0201f800, 0x00101694, - 0x59a8002a, 0x82000500, 0xffff0000, 0x80040540, - 0x4803502a, 0x5c000800, 0x4a035033, 0x00000000, - 0x0201f800, 0x00104d76, 0x0401f008, 0x4a03504c, - 0x00000005, 0x42000000, 0x00000001, 0x0201f800, - 0x001015fa, 0x0401ff1e, 0x1c01f000, 0x0401f809, - 0x42006000, 0xbf7f7fff, 0x41786800, 0x0401f08e, - 0x42006000, 0xbf7f7fff, 0x41786800, 0x0401f08a, - 0x0201f800, 0x00104e23, 0x04020009, 0x59c40006, - 0x82000540, 0x000000f0, 0x48038806, 0x42006000, - 0xbfffffff, 0x41786800, 0x0401f87f, 0x1c01f000, - 0x800408d0, 0x59a80015, 0x8c000506, 0x04000006, - 0x59a80010, 0x82000500, 0x000000ff, 0x80040540, - 0x0401f003, 0x82040540, 0x000000f7, 0x480388a7, - 0x1c01f000, 0x4807c856, 0x42000000, 0x0010b639, - 0x0201f800, 0x0010a86e, 0x42003000, 0x00000005, - 0x4d3c0000, 0x4c180000, 0x42003000, 0x0000000d, - 0x42027800, 0x00000002, 0x0401f038, 0x4807c856, - 0x42000000, 0x0010b66a, 0x0201f800, 0x0010a86e, - 0x42003000, 0x00000000, 0x4d3c0000, 0x4c180000, - 0x42003000, 0x0000000f, 0x42027800, 0x00000002, - 0x0401f02a, 0x4807c856, 0x42000000, 0x0010b669, - 0x0201f800, 0x0010a86e, 0x42003000, 0x00000003, - 0x4d3c0000, 0x4c180000, 0x42003000, 0x0000000e, - 0x42027800, 0x00000202, 0x0401f01c, 0x4807c856, - 0x42000000, 0x0010b668, 0x0201f800, 0x0010a86e, - 0x42003000, 0x00000004, 0x4d3c0000, 0x4c180000, - 0x42003000, 0x00000010, 0x42027800, 0x00000202, - 0x0401f00e, 0x4807c856, 0x42000000, 0x0010b63c, - 0x0201f800, 0x0010a86e, 0x42003000, 0x00000001, - 0x4d3c0000, 0x4c180000, 0x42003000, 0x0000000c, - 0x42027800, 0x00000202, 0x42001800, 0x0000ffff, - 0x42002000, 0x00000007, 0x0201f800, 0x001038c7, - 0x5c003000, 0x4d400000, 0x0201f800, 0x0010a784, - 0x42028000, 0x0000002a, 0x0201f800, 0x00101d90, - 0x5c028000, 0x5c027800, 0x1c01f000, 0x4807c856, - 0x04011000, 0x4a03c840, 0x0010b349, 0x4a03c842, - 0x00000040, 0x40000000, 0x040117ff, 0x42007800, - 0x0010b349, 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, 0x0010b616, 0x0201f800, 0x0010a86e, - 0x4a038805, 0x02000000, 0x0201f800, 0x00101a59, - 0x4000c000, 0x0201f800, 0x001019d0, 0x4a038805, - 0x04000000, 0x5c00c000, 0x5c00b800, 0x1c01f000, - 0x497a6a00, 0x4a026c00, 0x00000707, 0x497a6801, - 0x497a6808, 0x497a6809, 0x497a6806, 0x497a6807, - 0x497a6c0b, 0x497a680c, 0x0201f800, 0x0010393e, - 0x04020006, 0x5934080f, 0x59340010, 0x80040540, - 0x02020800, 0x00100615, 0x4a026a04, 0x00000100, - 0x497a6a03, 0x59340402, 0x82000500, 0x000000ff, - 0x48026c02, 0x497a6c04, 0x497a6a05, 0x497a6c05, - 0x497a6811, 0x4d2c0000, 0x5934000d, 0x49466c03, - 0x80025d40, 0x04000004, 0x0201f800, 0x00100843, - 0x497a680d, 0x5c025800, 0x599c0401, 0x48026a0b, - 0x599c0208, 0x48026c12, 0x4a02680a, 0x00006000, - 0x0201f000, 0x00104acf, 0x42000000, 0x00000005, - 0x80000d80, 0x0401f02d, 0x0201f800, 0x00104858, - 0x04020017, 0x59a80026, 0x8c00050a, 0x04020010, - 0x59340212, 0x82000500, 0x0000ff00, 0x4803c857, - 0x0400000b, 0x59340a00, 0x8c040d1e, 0x02000000, - 0x000201f8, 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, 0x00104836, 0x040207e4, - 0x59340200, 0x8c00050e, 0x040007e1, 0x0201f000, - 0x000201f8, 0x0201f800, 0x00104639, 0x040007bf, - 0x0201f000, 0x000201fc, 0x592c0206, 0x492fc857, - 0x82000d80, 0x000007ff, 0x04020006, 0x4a025c0a, - 0x00000030, 0x42026800, 0x0010b320, 0x0401f021, - 0x82000c80, 0x000007f0, 0x04021046, 0x81ac0400, - 0x50000000, 0x80026d40, 0x04000038, 0x0201f800, - 0x00104732, 0x04020038, 0x592c040a, 0x8c00050a, - 0x04020014, 0x592e6009, 0x83300480, 0x0010cfc0, - 0x0400103b, 0x41580000, 0x81300480, 0x04021038, - 0x59300c06, 0x82040580, 0x00000009, 0x04020037, - 0x4a025a06, 0x00000000, 0x497a5800, 0x59300008, - 0x80000540, 0x04020018, 0x492e6008, 0x0401f010, - 0x0201f800, 0x00020892, 0x04000019, 0x592c0206, - 0x49366009, 0x492e6008, 0x4a026406, 0x00000009, - 0x497a6015, 0x49325809, 0x82000d80, 0x000007ff, - 0x04020003, 0x4a026015, 0x00008000, 0x42027000, - 0x00000043, 0x0201f800, 0x000208d8, 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, 0x00020267, 0x04020011, - 0x0201f800, 0x00104842, 0x04020011, 0x0201f800, - 0x00020892, 0x0400001c, 0x49366009, 0x492e6008, - 0x4a026406, 0x0000000a, 0x42027000, 0x00000040, - 0x0201f800, 0x000208d8, 0x80000580, 0x0401f011, - 0x42000000, 0x00000028, 0x0401f00d, 0x0201f800, - 0x00104858, 0x040007fb, 0x59a80805, 0x82040d00, - 0x00000003, 0x04000004, 0x42000000, 0x00000004, - 0x0401f003, 0x42000000, 0x00000029, 0x80000540, - 0x1c01f000, 0x42000000, 0x0000002c, 0x0401f7fc, - 0x492fc857, 0x592e8c06, 0x4947c857, 0x83440c80, - 0x00000800, 0x42000000, 0x0000000a, 0x0402119c, - 0x592c4207, 0x4823c857, 0x82200500, 0x0000000f, - 0x0c01f001, 0x00104205, 0x0010428d, 0x001042dd, - 0x001042e8, 0x001042f3, 0x00104201, 0x00104201, - 0x00104201, 0x00104303, 0x00104361, 0x00104386, - 0x00104201, 0x00104201, 0x00104201, 0x00104201, - 0x00104201, 0x4803c857, 0x42000000, 0x0000000c, - 0x0401f183, 0x592c1008, 0x82081500, 0x00ffffff, - 0x59a80010, 0x80084d80, 0x42000000, 0x00000010, - 0x0400017b, 0x0201f800, 0x00104768, 0x04000036, - 0x4803c857, 0x82004d80, 0x0000001d, 0x0402001a, - 0x0201f800, 0x00105439, 0x59340405, 0x4c000000, - 0x0201f800, 0x00104836, 0x5c000000, 0x04000004, - 0x8c20450a, 0x04000028, 0x80000580, 0x44002800, - 0x59340008, 0x48002802, 0x59340009, 0x48002801, - 0x59340006, 0x48002804, 0x59340007, 0x48002803, - 0x4200b000, 0x00000005, 0x0201f800, 0x00109328, - 0x0401f18c, 0x4803c857, 0x82004d80, 0x0000001a, - 0x04020003, 0x40101000, 0x0401f15c, 0x4803c857, - 0x82004d80, 0x0000001b, 0x04020003, 0x40181000, - 0x0401f156, 0x4803c857, 0x82004d80, 0x0000001c, - 0x04000157, 0x82004d80, 0x00000019, 0x42000000, - 0x0000000a, 0x04000146, 0x42000000, 0x0000000a, - 0x0402015d, 0x59a8006f, 0x8c000502, 0x0400001b, - 0x0201f800, 0x00104836, 0x04000018, 0x59340212, - 0x82000500, 0x0000ff00, 0x42001000, 0x00000010, - 0x0402000c, 0x42001000, 0x00000008, 0x59a80026, - 0x8c000506, 0x04020009, 0x59340002, 0x82000500, - 0x00ff0000, 0x82000580, 0x00ff0000, 0x04000007, - 0x0201f800, 0x00104ada, 0x42000000, 0x0000001c, - 0x40181000, 0x0402012d, 0x0201f800, 0x00020892, - 0x04000137, 0x49366009, 0x492e6008, 0x4a026406, - 0x00000001, 0x8c20450a, 0x04000004, 0x592c0404, - 0x8400055c, 0x48025c04, 0x4c200000, 0x4d3c0000, - 0x42027800, 0x00001800, 0x0201f800, 0x00101de2, - 0x5c027800, 0x5c004000, 0x8c204512, 0x0400000b, - 0x599c0018, 0x8c000518, 0x04000008, 0x592c0009, - 0x82000500, 0x00000380, 0x5934080a, 0x80040d40, - 0x84040d54, 0x4806680a, 0x417a7800, 0x0401f93a, - 0x42000800, 0x00000003, 0x0401f941, 0x42027000, - 0x00000002, 0x0201f800, 0x000208d8, 0x80000580, - 0x0401f130, 0x0201f800, 0x00020267, 0x04020112, - 0x0201f800, 0x0010483c, 0x0400000c, 0x0201f800, - 0x00104836, 0x04020112, 0x4c600000, 0x4178c000, - 0x42027800, 0x00001800, 0x417a6000, 0x0201f800, - 0x00101e48, 0x5c00c000, 0x59a8006f, 0x8c000502, - 0x0400001b, 0x0201f800, 0x00104836, 0x04000018, - 0x59340212, 0x82000500, 0x0000ff00, 0x42001000, - 0x00000010, 0x0402000c, 0x42001000, 0x00000008, - 0x59a80026, 0x8c000506, 0x04020009, 0x59340002, - 0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000, - 0x04000007, 0x0201f800, 0x00104ada, 0x42000000, - 0x0000001c, 0x40181000, 0x040200d4, 0x0201f800, - 0x00020892, 0x040000de, 0x5934080a, 0x8c204512, - 0x0400000c, 0x599c0018, 0x8c000518, 0x04000009, - 0x592c0009, 0x82000500, 0x00000380, 0x82041500, - 0xfffffc7f, 0x80080d40, 0x84040d54, 0x0401f002, - 0x84040d14, 0x4806680a, 0x49366009, 0x492e6008, - 0x4a026406, 0x00000001, 0x417a7800, 0x0401f8ea, - 0x42000800, 0x00000005, 0x0401f8f1, 0x42027000, - 0x00000003, 0x0201f800, 0x000208d8, 0x80000580, - 0x0401f0e0, 0x0201f800, 0x00020267, 0x040200c2, - 0x0201f800, 0x0010484b, 0x040200c5, 0x0201f800, - 0x001092e0, 0x040000b6, 0x80000580, 0x0401f0d5, - 0x0201f800, 0x00020267, 0x040200b7, 0x0201f800, - 0x0010484b, 0x040200ba, 0x0201f800, 0x00108ea3, - 0x040000ab, 0x80000580, 0x0401f0ca, 0x0201f800, - 0x00020267, 0x040200ac, 0x83444d80, 0x000007fe, - 0x42000000, 0x0000000a, 0x0402008d, 0x0201f800, - 0x00104836, 0x040200aa, 0x0201f800, 0x001092f8, - 0x0400009b, 0x80000580, 0x0401f0ba, 0x82200500, - 0x00000070, 0x04020005, 0x8c20450e, 0x42000000, - 0x0000000c, 0x0402007e, 0x8c20450a, 0x0400000d, - 0x4d3c0000, 0x42027800, 0x00001000, 0x8c20450e, - 0x04020002, 0x853e7d56, 0x82200500, 0x000000a0, - 0x0201f800, 0x00104822, 0x5c027800, 0x0401f0a1, - 0x8c204508, 0x04020024, 0x592c1008, 0x82081500, - 0x00ffffff, 0x59a80010, 0x80084d80, 0x42000000, - 0x00000010, 0x04000066, 0x0201f800, 0x00104768, - 0x0400002b, 0x4803c857, 0x82004d80, 0x0000001a, - 0x04020003, 0x40101000, 0x0401f064, 0x4803c857, - 0x82004d80, 0x0000001b, 0x04020003, 0x40181000, - 0x0401f05e, 0x4803c857, 0x82004d80, 0x0000001c, - 0x0400005f, 0x82004d80, 0x00000019, 0x42000000, - 0x0000000a, 0x0400004e, 0x42000000, 0x0000000a, - 0x0401f065, 0x0201f800, 0x00020267, 0x04020062, - 0x4d3c0000, 0x42027800, 0x00001000, 0x8c20450e, - 0x04020002, 0x853e7d56, 0x82200500, 0x00000090, - 0x0201f800, 0x0010480a, 0x5c027800, 0x42000000, - 0x0000000a, 0x0402003a, 0x0401f06a, 0x836c0580, - 0x00000003, 0x42000800, 0x00000007, 0x04020006, - 0x0201f800, 0x0010928e, 0x04000007, 0x80000580, - 0x0401f064, 0x0201f800, 0x00104871, 0x04000059, - 0x0401f05c, 0x0201f800, 0x00104871, 0x0400003c, - 0x0401f058, 0x0201f800, 0x00020267, 0x0402003e, - 0x836c0580, 0x00000003, 0x04020048, 0x8c204508, - 0x0400000a, 0x4c600000, 0x4178c000, 0x42027800, - 0x00001800, 0x417a6000, 0x0201f800, 0x00101e48, - 0x5c00c000, 0x0401f047, 0x0201f800, 0x0010483c, - 0x0400000c, 0x0201f800, 0x00104836, 0x04020030, - 0x4c600000, 0x4178c000, 0x42027800, 0x00001800, - 0x417a6000, 0x0201f800, 0x00101e48, 0x5c00c000, - 0x480bc856, 0x0201f800, 0x001090f8, 0x04000018, - 0x80000580, 0x0401f037, 0x0401f7db, 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, 0x00100615, 0x4803c857, 0x48026c00, - 0x82040d80, 0x00000006, 0x04020005, 0x59341404, - 0x800811c0, 0x02000800, 0x00100615, 0x1c01f000, - 0x5c000000, 0x4c000000, 0x4803c857, 0x4947c857, - 0x481bc857, 0x83440480, 0x00000800, 0x04021034, - 0x83441400, 0x0010aa00, 0x50080000, 0x80026d40, - 0x04020011, 0x4c180000, 0x4d2c0000, 0x0201f800, - 0x00100819, 0x412e6800, 0x5c025800, 0x5c003000, - 0x04000027, 0x45341000, 0x497a680d, 0x497a6810, - 0x497a680f, 0x497a680e, 0x4c180000, 0x0401fccd, - 0x5c003000, 0x59340a12, 0x4c040000, 0x0201f800, - 0x00104e0d, 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, - 0x0010aa00, 0x50080000, 0x80026d40, 0x0400000b, - 0x0401fbf2, 0x0402000a, 0x59a80005, 0x8c000502, - 0x04000004, 0x59340200, 0x8c00050e, 0x04000004, - 0x82000540, 0x00000001, 0x1c01f000, 0x80000580, - 0x0401f7fe, 0x5c000000, 0x4c000000, 0x4803c857, - 0x4947c857, 0x4d2c0000, 0x4d300000, 0x83440480, - 0x00000800, 0x04021024, 0x83441400, 0x0010aa00, - 0x50080000, 0x80026d40, 0x0400001b, 0x45781000, - 0x5934000d, 0x80025d40, 0x02020800, 0x00100843, - 0x59366011, 0x813261c0, 0x0400000e, 0x4c640000, - 0x5930c800, 0x59325808, 0x0201f800, 0x00108df4, - 0x02020800, 0x00100843, 0x0201f800, 0x000208b4, - 0x82666540, 0x00000000, 0x040207f6, 0x5c00c800, - 0x0201f800, 0x00104acf, 0x41365800, 0x0201f800, - 0x0010083b, 0x80000580, 0x5c026000, 0x5c025800, - 0x1c01f000, 0x82000540, 0x00000001, 0x0401f7fb, - 0x4937c857, 0x4c580000, 0x59cc0001, 0x82000500, - 0x00ffffff, 0x48026802, 0x497a6c01, 0x497a6a01, - 0x59340200, 0x84000502, 0x48026a00, 0x0201f800, - 0x00104e0d, 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, - 0x0010a93e, 0x83cca400, 0x0000000d, 0x8334ac00, - 0x00000008, 0x4200b000, 0x00000002, 0x0201f800, - 0x0010a93e, 0x59cc0a18, 0x82040480, 0x00000800, - 0x0402100c, 0x82040480, 0x00000400, 0x04001004, - 0x42000800, 0x00000400, 0x0401f006, 0x82040480, - 0x00000200, 0x04001003, 0x42000800, 0x00000200, - 0x42001000, 0x0010b33f, 0x58080202, 0x80041480, - 0x04001002, 0x40000800, 0x48066a04, 0x59340403, - 0x82000580, 0x000007fe, 0x04020003, 0x59cc0a08, - 0x48066a04, 0x0201f800, 0x00104afd, 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, 0x0010082a, 0x04000037, 0x492fc857, - 0x492cb801, 0x0401f020, 0x832c0c00, 0x00000004, - 0x4200b000, 0x00000008, 0x50040000, 0x82000580, - 0xffffffff, 0x04020006, 0x80041000, 0x50080000, - 0x82000580, 0xffffffff, 0x04000007, 0x82040c00, - 0x00000002, 0x8058b040, 0x040207f4, 0x0201f800, - 0x00100615, 0x45480800, 0x454c1000, 0x592c1803, - 0x800c1800, 0x480e5803, 0x480fc857, 0x0401f014, - 0x0201f800, 0x0010082a, 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, 0x0401f8c8, 0x0402001c, 0x46000800, - 0xffffffff, 0x46001000, 0xffffffff, 0x4813c857, - 0x480fc857, 0x580c0003, 0x82000c80, 0x00000002, - 0x04021014, 0x480fc857, 0x400c0000, 0x812c0580, - 0x04020004, 0x580c0001, 0x4802680d, 0x0401f003, - 0x580c0001, 0x48002001, 0x400e5800, 0x0201f800, - 0x0010083a, 0x82000540, 0x00000001, 0x5c025800, - 0x5c027800, 0x1c01f000, 0x80000580, 0x0401f7fc, - 0x80000040, 0x48001803, 0x4803c857, 0x0401f7f6, - 0x0201f800, 0x00020087, 0x59300007, 0x8400054e, - 0x48026007, 0x592c1a04, 0x820c1d00, 0x000000ff, - 0x820c0580, 0x00000048, 0x04000013, 0x0201f000, - 0x000202b0, 0x8c000500, 0x02020800, 0x000200e6, - 0x4a026203, 0x00000002, 0x592c1a04, 0x820c1d00, - 0x000000ff, 0x820c0580, 0x00000018, 0x02000000, - 0x000202b0, 0x820c0580, 0x00000048, 0x02020000, - 0x000202b0, 0x42000800, 0x80000804, 0x0201f800, - 0x00106466, 0x0201f000, 0x000202b9, 0x4a025a06, - 0x00000008, 0x0201f000, 0x00020381, 0x4a025a06, - 0x00000029, 0x0201f000, 0x00020381, 0x4a025a06, - 0x0000002a, 0x0201f000, 0x00020381, 0x4a025a06, - 0x00000028, 0x0201f000, 0x00020381, 0x4943c857, - 0x4d440000, 0x4d340000, 0x4d2c0000, 0x4c580000, - 0x4200b000, 0x000007f0, 0x417a8800, 0x0201f800, - 0x00020267, 0x04020007, 0x8d3e7d06, 0x04000004, - 0x59340200, 0x8c00050e, 0x04020002, 0x0401f813, - 0x81468800, 0x8058b040, 0x040207f5, 0x83440480, - 0x00000800, 0x04021008, 0x8d3e7d02, 0x04000006, - 0x42028800, 0x000007f0, 0x4200b000, 0x00000010, - 0x0401f7eb, 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, 0x00108f7d, - 0x0201f800, 0x00020381, 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, - 0x0010082a, 0x04000010, 0x492e680d, 0x4a025802, - 0x00000001, 0x497a5803, 0x832c0c00, 0x00000004, - 0x4200b000, 0x00000010, 0x46000800, 0xffffffff, - 0x80040800, 0x8058b040, 0x040207fc, 0x82000540, - 0x00000001, 0x5c025800, 0x5c00b000, 0x1c01f000, - 0x4d2c0000, 0x592e5801, 0x0201f800, 0x00100843, - 0x5c025800, 0x0401f7ea, 0x4d2c0000, 0x5936580d, - 0x812e59c0, 0x04000007, 0x4937c857, 0x497a680d, - 0x0201f800, 0x00100843, 0x82000540, 0x00000001, - 0x5c025800, 0x1c01f000, 0x59340405, 0x4937c857, - 0x4803c857, 0x8c000508, 0x1c01f000, 0x4803c856, - 0x0201f800, 0x00104e0d, 0x04000011, 0x59a80815, - 0x8c040d04, 0x0402000e, 0x59a80826, 0x8c040d06, - 0x0400000b, 0x83ac0400, 0x000007fe, 0x50000000, - 0x80026d40, 0x04000006, 0x0401f9a8, 0x04020004, - 0x59340200, 0x8400055a, 0x48026a00, 0x599c0017, - 0x8c000508, 0x04000015, 0x4200b000, 0x000007f0, - 0x417a8800, 0x0201f800, 0x00020267, 0x0402000c, - 0x0401f99a, 0x0402000a, 0x59a80010, 0x59340802, - 0x80040580, 0x82000500, 0x00ffff00, 0x04020004, - 0x59340200, 0x8400055a, 0x48026a00, 0x81468800, - 0x8058b040, 0x040207f0, 0x0401f885, 0x04000003, - 0x59a80836, 0x0401f006, 0x599c0017, 0x8c000508, - 0x04000007, 0x42000800, 0x000007d0, 0x42001000, - 0x001046c4, 0x0201f800, 0x00105da7, 0x1c01f000, - 0x4803c856, 0x4d300000, 0x4d340000, 0x4d440000, - 0x4d3c0000, 0x4c580000, 0x42001000, 0x001046c4, - 0x0201f800, 0x00105cc9, 0x59a80826, 0x8c040d06, - 0x04000015, 0x0401f86a, 0x04000013, 0x83ae6c00, - 0x000007fe, 0x51366800, 0x59340200, 0x8400051a, - 0x48026a00, 0x599c0017, 0x8c000508, 0x04000007, - 0x42000800, 0x000007d0, 0x42001000, 0x001046c4, - 0x0201f800, 0x00105da7, 0x0201f800, 0x00101bf0, - 0x0401f027, 0x4200b000, 0x000007f0, 0x80028d80, - 0x0201f800, 0x00020267, 0x0402001e, 0x59340200, - 0x8c00051a, 0x0400001b, 0x59368c03, 0x417a7800, - 0x42028000, 0x00000029, 0x41783000, 0x0201f800, - 0x0010a258, 0x59340200, 0x84000558, 0x8400051a, - 0x48026a00, 0x4937c857, 0x4a026c00, 0x00000707, - 0x42028000, 0x00000029, 0x0201f800, 0x001067f6, - 0x417a7800, 0x0201f800, 0x00106543, 0x417a6000, - 0x0201f800, 0x0010a0da, 0x0201f800, 0x00106982, - 0x81468800, 0x8058b040, 0x040207de, 0x5c00b000, - 0x5c027800, 0x5c028800, 0x5c026800, 0x5c026000, - 0x1c01f000, 0x4933c857, 0x59303809, 0x581c0200, - 0x8400051a, 0x48003a00, 0x1c01f000, 0x42026800, - 0x0010b320, 0x497a680e, 0x42028800, 0x000007ff, - 0x0201f800, 0x001040e4, 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, - 0x00100615, 0x59341200, 0x813e79c0, 0x04000003, - 0x8408155e, 0x0401f002, 0x8408151e, 0x480a6a00, - 0x1c01f000, 0x4937c857, 0x0201f800, 0x00101eb0, - 0x04000006, 0x59a80835, 0x42001000, 0x0010475f, - 0x0201f800, 0x00105da7, 0x1c01f000, 0x4937c857, - 0x42001000, 0x0010475f, 0x0201f800, 0x00105cc9, - 0x59a81026, 0x84081512, 0x480b5026, 0x1c01f000, - 0x4c380000, 0x4c340000, 0x4c240000, 0x4c600000, - 0x4008c000, 0x83440480, 0x00000800, 0x04021045, - 0x80002d80, 0x41442000, 0x83447400, 0x0010aa00, - 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, 0x0010b1f0, 0x0401f007, - 0x82104d80, 0x000007f0, 0x04020004, 0x41782000, - 0x42007000, 0x0010aa00, 0x8058b040, 0x040207a4, - 0x801429c0, 0x04020007, 0x0201f800, 0x00100615, - 0x4947c857, 0x42000000, 0x0000000a, 0x0401f01c, - 0x4d2c0000, 0x4c180000, 0x40603000, 0x0401fc19, - 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, - 0x00020275, 0x1c01f000, 0x4803c857, 0x4947c857, - 0x4c300000, 0x82006500, 0x00000030, 0x04000006, - 0x4c000000, 0x0201f800, 0x001091f3, 0x5c000000, - 0x0402000b, 0x8c00050e, 0x04000006, 0x0201f800, - 0x00020267, 0x04020006, 0x4937c857, 0x0401fc36, - 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, 0x5c000000, - 0x4c000000, 0x4803c857, 0x4c5c0000, 0x59340400, - 0x82000500, 0x0000ff00, 0x8400b9c0, 0x805c0580, - 0x4937c857, 0x4803c857, 0x48026c00, 0x5c00b800, - 0x1c01f000, 0x4c040000, 0x4c080000, 0x592c0207, - 0x8c00050c, 0x0400000f, 0x592e8c06, 0x82000500, - 0x00000080, 0x84000548, 0x4d3c0000, 0x42027800, - 0x00001000, 0x0401ff8d, 0x5c027800, 0x82000540, - 0x00000001, 0x5c001000, 0x5c000800, 0x1c01f000, - 0x80000580, 0x0401f7fc, 0x592c040b, 0x82000500, - 0x0000e000, 0x82000580, 0x00006000, 0x04000019, - 0x836c0580, 0x00000003, 0x04000016, 0x836c0580, - 0x00000002, 0x04020106, 0x59a80026, 0x82000d00, - 0x00000038, 0x04020005, 0x59a80832, 0x800409c0, - 0x0400000c, 0x0401f0fe, 0x82000d00, 0x00000003, - 0x82040d80, 0x00000003, 0x040200f9, 0x82000d00, - 0x00000028, 0x04020003, 0x8c00050c, 0x040000f4, - 0x592c100a, 0x82080500, 0xff000000, 0x040200d2, - 0x59a80010, 0x80080580, 0x040000cc, 0x592c0c0b, - 0x82040d00, 0x0000e000, 0x82040480, 0x00008000, - 0x040210cc, 0x592e8c06, 0x83440480, 0x00000800, - 0x04001007, 0x83440580, 0x0000ffff, 0x040200b3, - 0x800409c0, 0x040200fe, 0x0401f0b0, 0x800409c0, - 0x040200fb, 0x41784000, 0x0401feaa, 0x040200e2, - 0x59342204, 0x592c000d, 0x80100480, 0x040010bc, - 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, 0x59a8006f, 0x8c000502, - 0x04000016, 0x0401ff45, 0x04000014, 0x59340212, - 0x82000500, 0x0000ff00, 0x42001000, 0x00000010, - 0x0402000c, 0x59a80026, 0x8c000506, 0x0402006f, - 0x42001000, 0x00000008, 0x59340002, 0x82000500, - 0x00ff0000, 0x82000580, 0x00ff0000, 0x04000003, - 0x0401f9d6, 0x04020065, 0x0201f800, 0x00020892, - 0x04000081, 0x4a026406, 0x00000010, 0x49366009, - 0x42000800, 0x00000003, 0x83380580, 0x00000002, - 0x04000003, 0x42000800, 0x0000000b, 0x0201f800, - 0x001043c7, 0x0401f044, 0x42027000, 0x00000000, - 0x0401f003, 0x42027000, 0x00000004, 0x0401ff30, - 0x04020074, 0x0401f036, 0x42027000, 0x00000033, - 0x0401f006, 0x42027000, 0x00000005, 0x0401f003, - 0x42027000, 0x00000003, 0x0401ff1c, 0x04020069, - 0x59a8006f, 0x8c000502, 0x04000016, 0x0401ff0b, - 0x04000014, 0x59340212, 0x82000500, 0x0000ff00, - 0x42001000, 0x00000010, 0x0402000c, 0x59a80026, - 0x8c000506, 0x04020035, 0x42001000, 0x00000008, - 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, - 0x00ff0000, 0x04000003, 0x0401f99c, 0x0402002b, - 0x0201f800, 0x00020892, 0x04000047, 0x4a026406, - 0x00000010, 0x49366009, 0x42000800, 0x00000005, - 0x83380580, 0x00000003, 0x04000003, 0x42000800, - 0x00000009, 0x0201f800, 0x001043c7, 0x0401f00a, - 0x82102580, 0x00000011, 0x04020030, 0x0201f800, - 0x00020892, 0x04000034, 0x4a026406, 0x00000010, - 0x49366009, 0x492e6008, 0x49325808, 0x813669c0, - 0x04000007, 0x592c0c0b, 0x8c040d18, 0x04000004, - 0x59340200, 0x84000514, 0x48026a00, 0x0201f800, - 0x000208d8, 0x80000580, 0x1c01f000, 0x82000540, - 0x00000001, 0x0401f7fd, 0x42001000, 0x0000000a, - 0x0401f018, 0x42001000, 0x00000010, 0x0401f015, - 0x42001000, 0x00000016, 0x0401f012, 0x42001000, - 0x00000017, 0x0401f00f, 0x42001000, 0x00000018, - 0x0401f00c, 0x42001000, 0x0000001b, 0x0401f009, - 0x42001000, 0x0000001e, 0x0401f006, 0x42001000, - 0x00000024, 0x0401f003, 0x42001000, 0x00000020, - 0x42000800, 0x00000019, 0x42028000, 0x00000031, - 0x0401f7df, 0x42000800, 0x00000003, 0x0401f003, - 0x42000800, 0x0000000a, 0x41781000, 0x0401f7f7, - 0x42000800, 0x00000009, 0x59341400, 0x0401f7f3, - 0x42028000, 0x00000008, 0x0401f005, 0x42000800, - 0x00000007, 0x416c1000, 0x0401f7ec, 0x41780800, - 0x41781000, 0x0401f7ca, 0x42028000, 0x00000000, - 0x0401f7fb, 0x82004d80, 0x0000001d, 0x02000800, - 0x00100615, 0x82004d80, 0x0000001a, 0x04020004, - 0x40101000, 0x40000800, 0x0401f7dc, 0x82004d80, - 0x0000001b, 0x04020003, 0x40181000, 0x0401f7fa, - 0x82004d80, 0x0000001c, 0x040007f7, 0x82004d80, - 0x00000019, 0x040007b5, 0x0401f7d6, 0x592e6008, - 0x0201f800, 0x001091e3, 0x040007b3, 0x59300c06, - 0x82040580, 0x00000011, 0x040207d6, 0x83440580, - 0x0000ffff, 0x04020005, 0x59326809, 0x813669c0, - 0x0400000e, 0x0401f7cf, 0x592c100a, 0x82081500, - 0x00ffffff, 0x41784000, 0x0401fd9e, 0x040207d6, - 0x59300009, 0x800001c0, 0x04000003, 0x81340580, - 0x040207c4, 0x49366009, 0x592c0c0b, 0x82041500, - 0x0000e000, 0x82080580, 0x00006000, 0x04000011, - 0x42000800, 0x00000100, 0x813669c0, 0x04000002, - 0x59340a04, 0x592c000d, 0x80040480, 0x040017a0, - 0x59300a03, 0x82040580, 0x00000007, 0x040207b1, - 0x492e6008, 0x42027000, 0x00000054, 0x0401f774, - 0x0201f800, 0x0010a6e6, 0x040007b4, 0x0401f7a9, - 0x492fc857, 0x592e6008, 0x4933c857, 0x0201f800, - 0x001091e3, 0x04000047, 0x59301406, 0x82080580, - 0x00000005, 0x04020061, 0x592c0207, 0x8c000500, - 0x04020085, 0x59a80021, 0x800001c0, 0x0402006a, - 0x59301203, 0x82080580, 0x00000007, 0x04020057, - 0x592e8c06, 0x83440480, 0x00000800, 0x04021032, - 0x41784000, 0x592c1009, 0x82081500, 0x00ffffff, - 0x0401fd60, 0x0402005f, 0x59300009, 0x800001c0, - 0x04000003, 0x81340580, 0x04020048, 0x4d300000, - 0x592e6013, 0x4933c857, 0x83300580, 0xffffffff, - 0x0400000d, 0x0201f800, 0x001091e3, 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, 0x000208d8, 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, 0x00100615, - 0x82004d80, 0x0000001a, 0x04020003, 0x40101000, - 0x0401f7dc, 0x82004d80, 0x0000001b, 0x04020003, - 0x40181000, 0x0401f7d7, 0x82004d80, 0x0000001c, - 0x040007d4, 0x82004d80, 0x00000019, 0x040007d1, - 0x0401f7d5, 0x0201f800, 0x0010a6e6, 0x040207d7, - 0x42028000, 0x00000000, 0x0401f7dd, 0x5c000000, - 0x4c000000, 0x4803c857, 0x59302009, 0x801021c0, - 0x04000035, 0x58101400, 0x4813c857, 0x480bc857, - 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, 0x04020017, 0x820c0580, - 0x00000009, 0x0400000d, 0x0401f013, 0x820c0580, - 0x00000005, 0x04000009, 0x0401f00f, 0x820c0580, - 0x0000000b, 0x04000005, 0x0401f00b, 0x820c0580, - 0x00000003, 0x04020008, 0x82081d00, 0xffffff00, - 0x840c01c0, 0x800c0540, 0x4807c857, 0x4803c857, - 0x48002400, 0x1c01f000, 0x599c0017, 0x8c00050a, - 0x04000003, 0x80000580, 0x1c01f000, 0x59a80026, - 0x82000500, 0x00000028, 0x04000008, 0x42028800, - 0x000007fd, 0x0201f800, 0x00020267, 0x04020003, - 0x5934000a, 0x8c000504, 0x1c01f000, 0x4d300000, - 0x5934000e, 0x80026540, 0x04000006, 0x0201f800, - 0x0010600e, 0x02000800, 0x001061e5, 0x497a680e, - 0x5c026000, 0x1c01f000, 0x4d440000, 0x4d340000, - 0x80000580, 0x40001800, 0x40028800, 0x82080580, - 0x00000008, 0x04020003, 0x42001800, 0x00000001, - 0x0201f800, 0x00020267, 0x0402000a, 0x0401fd4f, - 0x04020008, 0x800c19c0, 0x04000004, 0x59340405, - 0x8c000508, 0x04000003, 0x80081040, 0x04000009, - 0x81468800, 0x83440480, 0x00000800, 0x040017f1, - 0x80000580, 0x5c026800, 0x5c028800, 0x1c01f000, - 0x82000540, 0x00000001, 0x5c026800, 0x5c028800, - 0x1c01f000, 0x42000800, 0x00000001, 0x0401fb0e, - 0x04020034, 0x59a80026, 0x8c000508, 0x04020031, - 0x5934100a, 0x82081500, 0x0000e000, 0x42007000, - 0x0010b33f, 0x58380401, 0x8c000504, 0x0402001c, - 0x42000800, 0x00000001, 0x82080580, 0x00006000, - 0x04000024, 0x59341a04, 0x820c0480, 0x00000800, - 0x04001004, 0x42000800, 0x00000a00, 0x0401f009, - 0x820c0480, 0x00000400, 0x04001004, 0x42000800, - 0x00000500, 0x0401f003, 0x42000800, 0x00000200, - 0x82080580, 0x00002000, 0x04000002, 0x800408c2, - 0x82040d40, 0x00000001, 0x0401f00e, 0x42000800, - 0x00000008, 0x82080580, 0x00002000, 0x04020004, - 0x42000800, 0x00000004, 0x0401f006, 0x82080580, - 0x00000000, 0x04020003, 0x42000800, 0x00000002, - 0x48066c04, 0x1c01f000, 0x4a033020, 0x00000000, - 0x4a03b104, 0x80000000, 0x497b3026, 0x497b3027, - 0x497b3028, 0x497b3029, 0x497b302b, 0x497b3021, - 0x4a03b104, 0x60000001, 0x1c01f000, 0x599c0018, - 0x4803c856, 0x497b3024, 0x497b3025, 0x82000500, - 0x0000000f, 0x48033022, 0x04000008, 0x599c0216, - 0x82000500, 0x0000ffff, 0x04020003, 0x42000000, - 0x00000002, 0x48033023, 0x1c01f000, 0x0401fff0, - 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, 0x592c0204, - 0x492fc857, 0x80000540, 0x04000008, 0x42034000, - 0x0010b2a0, 0x59a1d81e, 0x80edd9c0, 0x02000800, - 0x00100615, 0x0401f003, 0x5931d821, 0x58ef400b, - 0x58ec0009, 0x800001c0, 0x08020000, 0x0201f800, - 0x00100615, 0x5998002b, 0x84000540, 0x4803302b, - 0x0201f000, 0x00020403, 0x42000000, 0x0010b654, - 0x0201f800, 0x0010a86e, 0x492fc857, 0x59980026, - 0x59980828, 0x80000000, 0x48033026, 0x800409c0, - 0x492f3028, 0x04000003, 0x492c0800, 0x0401f002, - 0x492f3029, 0x592c0001, 0x80000d40, 0x02020000, - 0x000202fb, 0x1c01f000, 0x59980026, 0x59980828, - 0x80000000, 0x48033026, 0x492fc857, 0x800409c0, - 0x492f3028, 0x04000003, 0x492c0800, 0x0401f002, - 0x492f3029, 0x592c0001, 0x80000d40, 0x02020800, - 0x000202fb, 0x0402d00e, 0x59980029, 0x80025d40, - 0x0400000f, 0x59980026, 0x80000040, 0x48033026, - 0x04020002, 0x48033028, 0x592c0000, 0x48033029, - 0x492fc857, 0x492fb107, 0x0400d7f4, 0x42000000, - 0x0010b654, 0x0201f800, 0x0010a86e, 0x0402e01d, - 0x59da5908, 0x496a5800, 0x412ed000, 0x815eb800, - 0x0400e7fc, 0x59c80000, 0x82000540, 0x00001200, - 0x48039000, 0x04006019, 0x59d8010a, 0x59d8090a, - 0x80040d80, 0x040207fd, 0x900001c0, 0x82000540, - 0x00000013, 0x4803c011, 0x5998002b, 0x84000500, - 0x4803302b, 0x59e00017, 0x8c000508, 0x04000003, - 0x4a03c017, 0x00000003, 0x4203e000, 0x30000001, - 0x59d80105, 0x82000500, 0x00018780, 0x02020000, - 0x00020482, 0x1c01f000, 0x5998002b, 0x84000540, - 0x4803302b, 0x0401f7f7, 0x5c000000, 0x4c000000, - 0x4803c857, 0x492fc857, 0x4943c857, 0x4807c857, - 0x4a025a04, 0x00000103, 0x49425a06, 0x48065a08, - 0x4a025c06, 0x0000ffff, 0x813261c0, 0x04000003, - 0x59300402, 0x48025c06, 0x832c0400, 0x00000009, - 0x04011000, 0x4803c840, 0x4a03c842, 0x0000000b, - 0x04011000, 0x1c01f000, 0x42000000, 0x0010b654, - 0x0201f800, 0x0010a86e, 0x0201f000, 0x00020464, - 0x59a80017, 0x82000c80, 0x0000000a, 0x02021800, - 0x00100615, 0x0c01f809, 0x4a038805, 0x000000f0, - 0x59c400a3, 0x82000500, 0x02870000, 0x02020800, - 0x00100615, 0x1c01f000, 0x00104c99, 0x00104c25, - 0x00104c40, 0x00104c69, 0x00104c8c, 0x00104cc6, - 0x00104cd8, 0x00104c40, 0x00104caa, 0x00104c24, - 0x1c01f000, 0x4a038808, 0x00000004, 0x0401f8f9, - 0x0201f800, 0x0010507b, 0x59c40805, 0x8c040d0e, - 0x04020013, 0x8c040d0a, 0x0402000b, 0x8c040d0c, - 0x04020006, 0x8c040d08, 0x0400000d, 0x4a035017, - 0x00000003, 0x0401f00a, 0x4a035017, 0x00000000, - 0x0401f007, 0x42000000, 0x0010b642, 0x0201f800, - 0x0010a86e, 0x4a035017, 0x00000002, 0x1c01f000, - 0x4a038808, 0x00000002, 0x0401f8de, 0x59c40805, - 0x8c040d08, 0x04020021, 0x8c040d0c, 0x0402001c, - 0x8c040d0e, 0x04020017, 0x82040500, 0x000000f0, - 0x0402001c, 0x0201f800, 0x0010507b, 0x4a038808, - 0x00000080, 0x59c40002, 0x8400050c, 0x48038802, - 0x0401f9d7, 0x4d3c0000, 0x42027800, 0x00000001, - 0x0201f800, 0x00109640, 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, 0x0401f9b2, 0x4d3c0000, 0x42027800, - 0x00000001, 0x0201f800, 0x00109640, 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, 0x00104d2c, 0x0201f800, 0x00105dbd, - 0x59c40805, 0x8c040d0a, 0x0402000d, 0x8c040d08, - 0x0402000b, 0x8c040d0c, 0x04020006, 0x8c040d0e, - 0x0400000d, 0x4a035017, 0x00000001, 0x0401f00a, - 0x4a035017, 0x00000000, 0x0401f007, 0x42000000, - 0x0010b642, 0x0201f800, 0x0010a86e, 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, - 0x0401f91d, 0x02020800, 0x00100615, 0x59a80805, - 0x8c040d0c, 0x04000015, 0x84040d0c, 0x48075005, - 0x4a038805, 0x00000010, 0x0201f800, 0x001019a4, - 0x59c40005, 0x8c000508, 0x04000008, 0x4a038808, - 0x00000008, 0x4a035033, 0x00000001, 0x4202d800, - 0x00000001, 0x0401f01a, 0x59c40006, 0x84000548, - 0x48038806, 0x0401f016, 0x59a80017, 0x82000580, - 0x00000001, 0x0400000c, 0x59a80017, 0x82000580, - 0x00000005, 0x0402000c, 0x42000000, 0x0010b642, - 0x0201f800, 0x0010a86e, 0x4a035017, 0x00000008, - 0x0401f007, 0x42000000, 0x0010b642, 0x0201f800, - 0x0010a86e, 0x4a035017, 0x00000004, 0x1c01f000, - 0x4803c856, 0x4c040000, 0x4c080000, 0x42000800, - 0x00000064, 0x42001000, 0x00104d2c, 0x0201f800, - 0x00105db2, 0x5c001000, 0x5c000800, 0x1c01f000, - 0x4803c856, 0x4c040000, 0x0201f800, 0x0010698c, - 0x4df00000, 0x0201f800, 0x00106b71, 0x5c03e000, - 0x02000800, 0x00106982, 0x0401ffba, 0x5c000800, - 0x1c01f000, 0x4803c856, 0x4c040000, 0x4c080000, - 0x0201f800, 0x0010698c, 0x4df00000, 0x0201f800, - 0x00106b71, 0x5c03e000, 0x02000800, 0x00106982, - 0x59c40006, 0x84000500, 0x48038806, 0x0201f800, - 0x00106c32, 0x497b8880, 0x0201f800, 0x0010a7e7, - 0x0201f800, 0x0010a7f5, 0x0201f800, 0x00101886, - 0x4a03504c, 0x00000004, 0x4202d800, 0x00000004, - 0x4a038805, 0x00000001, 0x42001000, 0x00104d2c, - 0x0201f800, 0x00105dbd, 0x0201f800, 0x0010071a, - 0x0401f8bf, 0x04000006, 0x42006000, 0xfeffffff, - 0x41786800, 0x0201f800, 0x001040ad, 0x0201f800, - 0x0010048c, 0x42000000, 0x00000001, 0x0201f800, - 0x001015fa, 0x5c001000, 0x5c000800, 0x1c01f000, - 0x59c40008, 0x8c000508, 0x04020007, 0x4a038808, - 0x00000010, 0x4201d000, 0x00001388, 0x0201f800, - 0x00105dd2, 0x1c01f000, 0x4c040000, 0x59a80833, - 0x82040580, 0x00000000, 0x0400000b, 0x82040580, - 0x00000001, 0x0400000b, 0x82040580, 0x00000002, - 0x0400000b, 0x82040580, 0x00000003, 0x0400000b, - 0x0401f055, 0x4a035017, 0x00000000, 0x0401f009, - 0x4a035017, 0x00000004, 0x0401f006, 0x4a035017, - 0x00000001, 0x0401f003, 0x4a035017, 0x00000007, - 0x497b8880, 0x4a038893, 0x00000001, 0x41780000, - 0x0201f800, 0x00101670, 0x0201f800, 0x00106c32, - 0x836c0d80, 0x00000004, 0x04000008, 0x59c40006, - 0x82000500, 0xffffff0f, 0x82000540, 0x04000001, - 0x48038806, 0x0401f007, 0x59c40006, 0x82000500, - 0xffffff0f, 0x82000540, 0x04000000, 0x48038806, - 0x0401f873, 0x04020005, 0x59c40806, 0x82040d00, - 0xfbffff0f, 0x48078806, 0x59c40005, 0x8c000534, - 0x04020033, 0x42006000, 0xfc18ffff, 0x42006800, - 0x01000000, 0x0201f800, 0x001040ad, 0x0201f800, - 0x001019a4, 0x59c408a4, 0x82040d00, 0x0000000f, - 0x82040d80, 0x0000000c, 0x040208a9, 0x0401f85c, - 0x04000006, 0x42006000, 0xfeffffff, 0x41786800, - 0x0201f800, 0x001040ad, 0x836c0d80, 0x00000004, - 0x0400000f, 0x0401f85a, 0x04020008, 0x59940005, - 0x82000580, 0x00103f37, 0x04020004, 0x59940004, - 0x800001c0, 0x04020006, 0x59a8084d, 0x42001000, - 0x00104d39, 0x0201f800, 0x00105da7, 0x4a035033, - 0x00000004, 0x0401fe33, 0x0401f841, 0x04020008, - 0x59c408a4, 0x82040d00, 0x0000000f, 0x82040580, - 0x0000000c, 0x02020800, 0x00100615, 0x5c000800, - 0x1c01f000, 0x4803c856, 0x4c000000, 0x0201f800, - 0x00105de2, 0x4a035010, 0x00ffffff, 0x497b5032, - 0x59a8002a, 0x82000500, 0xffff0000, 0x4803502a, - 0x497b8880, 0x497b8893, 0x41780000, 0x0201f800, - 0x00101670, 0x59c40001, 0x82000500, 0xfffffcff, - 0x48038801, 0x42006000, 0xfc18ffff, 0x41786800, - 0x0201f800, 0x001040ad, 0x4a038808, 0x00000000, - 0x5c000000, 0x800001c0, 0x02020800, 0x00103f37, - 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, 0x04000024, - 0x599c1017, 0x4d3c0000, 0x82000500, 0x00000011, - 0x04000006, 0x417a7800, 0x0201f800, 0x0010393e, - 0x0402000a, 0x0401f012, 0x42027800, 0x00000008, - 0x0201f800, 0x0010393e, 0x0400000d, 0x42003000, - 0x00000003, 0x0401f003, 0x42003000, 0x00000004, - 0x42028000, 0x0000000e, 0x0201f800, 0x0010a25b, - 0x599c1017, 0x8c08150a, 0x04020007, 0x42028000, - 0x00000004, 0x0201f800, 0x00101d90, 0x80000580, - 0x0401f80d, 0x5c027800, 0x0401f00a, 0x0201f800, - 0x0010393e, 0x04000007, 0x42028000, 0x0000000f, - 0x42003000, 0x00000001, 0x0201f800, 0x0010a25b, - 0x1c01f000, 0x59a80005, 0x04000004, 0x82000540, - 0x00000010, 0x0401f003, 0x82000500, 0xffffffef, - 0x48035005, 0x4803c857, 0x1c01f000, 0x4803c856, - 0x4c580000, 0x42000000, 0x0010b6ca, 0x0201f800, - 0x0010a86e, 0x42000800, 0x0010bef0, 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, 0x00100615, 0x59b800e5, 0x8c000538, - 0x040207fb, 0x4a0370e4, 0x00000200, 0x42006000, - 0xffffffff, 0x42006800, 0x80000000, 0x0201f800, - 0x001040ad, 0x4a038807, 0x00000001, 0x497b8807, - 0x4a038808, 0x00000010, 0x42006000, 0xfcf8ffff, - 0x42006800, 0x01000000, 0x0201f800, 0x001040ad, - 0x5c001000, 0x480b8801, 0x42000800, 0x0010bef0, - 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, 0x00101670, 0x59c408a4, 0x82040d00, - 0x0000000f, 0x82040580, 0x0000000c, 0x02020800, - 0x00100615, 0x4a038805, 0x04000000, 0x5c00b000, - 0x1c01f000, 0x4803c856, 0x4c580000, 0x4ce80000, - 0x42000000, 0x0010b643, 0x0201f800, 0x0010a86e, - 0x59c41008, 0x4c080000, 0x82080500, 0xffffff7f, - 0x48038808, 0x59c40004, 0x82000500, 0x00003e02, - 0x04000005, 0x4201d000, 0x00000014, 0x0201f800, - 0x00105dd2, 0x59c40006, 0x82000500, 0xffffff0f, - 0x48038806, 0x4a038805, 0x00000010, 0x4a038808, - 0x00000004, 0x4200b000, 0x00000065, 0x59c40005, - 0x8c000508, 0x04020012, 0x4201d000, 0x000003e8, - 0x0201f800, 0x00105dd2, 0x8058b040, 0x040207f8, - 0x0201f800, 0x00106c32, 0x4a038808, 0x00000008, - 0x4a035033, 0x00000001, 0x4202d800, 0x00000001, - 0x82000540, 0x00000001, 0x0401f030, 0x0201f800, - 0x00100b29, 0x42000000, 0x0010b6a7, 0x0201f800, - 0x0010a86e, 0x0201f800, 0x00100f42, 0x497b8880, - 0x59a8002a, 0x82000500, 0x0000ffff, 0x4c000000, - 0x0201f800, 0x00101670, 0x5c000000, 0x48038880, - 0x4a038808, 0x00000000, 0x4200b000, 0x00000065, - 0x4a038805, 0x000000f0, 0x0201f800, 0x001019a4, - 0x42000800, 0x000000f0, 0x59c40005, 0x80040d00, - 0x04000008, 0x4201d000, 0x000003e8, 0x0201f800, - 0x00105dd2, 0x8058b040, 0x040207f2, 0x0401f7d1, - 0x59c40006, 0x82000540, 0x000000f0, 0x48038806, - 0x59a8001e, 0x80000540, 0x04020002, 0x80000000, - 0x48038893, 0x80000580, 0x5c001000, 0x4df00000, - 0x0201f800, 0x001019ca, 0x5c03e000, 0x480b8808, - 0x5c01d000, 0x5c00b000, 0x1c01f000, 0x4803c856, - 0x4c580000, 0x4ce80000, 0x59c41008, 0x82080500, - 0xffffff7f, 0x48038808, 0x4c080000, 0x59c40004, - 0x82000500, 0x00003e02, 0x04000005, 0x4201d000, - 0x00000014, 0x0201f800, 0x00105dd2, 0x0201f800, - 0x00100b29, 0x42000000, 0x0010b6a8, 0x0201f800, - 0x0010a86e, 0x0201f800, 0x00100f42, 0x4a038808, - 0x00000002, 0x80000580, 0x48038880, 0x48038893, - 0x0201f800, 0x00101670, 0x4200b000, 0x00000384, - 0x4a038805, 0x000000f0, 0x0201f800, 0x001019a4, - 0x42000800, 0x000000f0, 0x59c40005, 0x80040d00, - 0x04000015, 0x82000500, 0x000000d0, 0x04020012, - 0x4201d000, 0x00000067, 0x0201f800, 0x00105dd2, - 0x8058b040, 0x040207ef, 0x0201f800, 0x00106c32, - 0x4a038808, 0x00000008, 0x4a035033, 0x00000001, - 0x4202d800, 0x00000001, 0x82000540, 0x00000001, - 0x0401f010, 0x497b8880, 0x59a8001e, 0x80000540, - 0x04020002, 0x80000000, 0x48038893, 0x59a8002a, - 0x82000500, 0x0000ffff, 0x4c000000, 0x0201f800, - 0x00101670, 0x5c000000, 0x48038880, 0x80000580, - 0x5c001000, 0x4df00000, 0x0201f800, 0x001019ca, - 0x5c03e000, 0x480b8808, 0x5c01d000, 0x5c00b000, - 0x1c01f000, 0x4803c856, 0x59c40004, 0x82000500, - 0x00003e02, 0x0400000a, 0x0201f800, 0x00106c32, - 0x4a038808, 0x00000008, 0x4a035033, 0x00000001, - 0x4202d800, 0x00000001, 0x0401f052, 0x0201f800, - 0x00100b29, 0x42000000, 0x0010b6a9, 0x0201f800, - 0x0010a86e, 0x0201f800, 0x00100f42, 0x59c40006, - 0x84000508, 0x48038806, 0x4a038805, 0x00000010, - 0x59a80805, 0x84040d4c, 0x48075005, 0x42000800, - 0x00000064, 0x42001000, 0x00104d2c, 0x0201f800, - 0x00105da7, 0x4a038808, 0x00000000, 0x497b8880, - 0x4a038805, 0x000000f0, 0x0201f800, 0x001019a4, - 0x42000800, 0x000000f0, 0x59c40005, 0x80040d00, - 0x0400000e, 0x82000500, 0x000000e0, 0x0402000b, - 0x4201d000, 0x000003e8, 0x0201f800, 0x00105dd2, - 0x0201f800, 0x00105c81, 0x59940004, 0x80000540, - 0x040207ec, 0x0401f023, 0x4c080000, 0x42001000, - 0x00104d39, 0x0201f800, 0x00105cc9, 0x42001000, - 0x00104d2c, 0x0201f800, 0x00105dbd, 0x5c001000, - 0x497b8880, 0x59a8001e, 0x80000540, 0x04020002, - 0x80000000, 0x48038893, 0x59a8002a, 0x82000500, - 0x0000ffff, 0x4c000000, 0x0201f800, 0x00101670, - 0x5c000000, 0x48038880, 0x59a80805, 0x84040d0c, - 0x48075005, 0x59c40006, 0x84000548, 0x48038806, - 0x0201f800, 0x001019ca, 0x4a038808, 0x00000080, - 0x1c01f000, 0x4803c856, 0x4d400000, 0x4d3c0000, - 0x0201f800, 0x00106c32, 0x0201f800, 0x0010a95a, - 0x04020024, 0x599c1017, 0x59a80805, 0x8c040d00, - 0x0402000c, 0x8c08151a, 0x0400001e, 0x84040d42, - 0x48075005, 0x42028000, 0x00000004, 0x42027800, - 0x00000008, 0x8c081508, 0x04020007, 0x0401f011, - 0x42028000, 0x00000004, 0x417a7800, 0x8c081508, - 0x0400000c, 0x4d400000, 0x42028000, 0x0000000e, - 0x42028800, 0x0000ffff, 0x0201f800, 0x0010a258, - 0x5c028000, 0x599c0817, 0x8c040d0a, 0x04020005, - 0x4943c857, 0x493fc857, 0x0201f800, 0x00101d90, - 0x497b8880, 0x4202d800, 0x00000001, 0x0401fcff, - 0x5c027800, 0x5c028000, 0x1c01f000, 0x0201f800, - 0x00100b29, 0x42000000, 0x0010b6aa, 0x0201f800, - 0x0010a86e, 0x0201f800, 0x00100f42, 0x42000000, - 0x00000001, 0x0201f800, 0x00101670, 0x4a038880, - 0x00000001, 0x0201f000, 0x001019ca, 0x4202e000, - 0x00000000, 0x4a033015, 0x00000001, 0x497b301d, - 0x497b3006, 0x4a03b004, 0x60000001, 0x59d80005, - 0x4a03b004, 0x90000001, 0x4a03a804, 0x60000001, - 0x59d40005, 0x4a03a804, 0x90000001, 0x0201f000, - 0x00105667, 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, 0x00020685, 0x0200f000, - 0x0002069a, 0x1c01f000, 0x0201f800, 0x00100615, - 0x1c01f000, 0x4df00000, 0x4203e000, 0x50000000, - 0x59981005, 0x800811c0, 0x0400001e, 0x58080005, - 0x82000d00, 0x43018780, 0x02020000, 0x0010552a, - 0x8c000508, 0x04000015, 0x580a5808, 0x592c0204, - 0x497a5800, 0x497a5801, 0x82000500, 0x000000ff, - 0x82000c80, 0x0000004b, 0x0402100b, 0x0c01f80f, - 0x5c03e000, 0x83700580, 0x00000003, 0x040007e6, - 0x0200f800, 0x0002069a, 0x0200b000, 0x00020685, - 0x1c01f000, 0x0401f850, 0x5c03e000, 0x0401f7f9, - 0x0401f8ee, 0x0401f7fd, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105171, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x001051f9, 0x00105161, 0x00105161, 0x00105171, - 0x00105171, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x492fc857, 0x42000000, 0x0010b65d, - 0x0201f800, 0x0010a86e, 0x42000000, 0x00000400, - 0x0401f019, 0x492fc857, 0x42000000, 0x0010b65c, - 0x0201f800, 0x0010a86e, 0x42000000, 0x00001000, - 0x0401f011, 0x492fc857, 0x42000000, 0x0010b65b, - 0x0201f800, 0x0010a86e, 0x42000000, 0x00002000, - 0x0401f009, 0x492fc857, 0x42000000, 0x0010b65e, - 0x0201f800, 0x0010a86e, 0x42000000, 0x00000800, - 0x0401f001, 0x4803c857, 0x4202e000, 0x00000001, - 0x592c0c04, 0x82040d00, 0xffff80ff, 0x80040540, - 0x48025c04, 0x0201f000, 0x00020381, 0x592c0204, - 0x492fc857, 0x80000110, 0x040007db, 0x80000040, - 0x04000035, 0x48033002, 0x492f3003, 0x492f3004, - 0x4a033008, 0x001051c5, 0x4202e000, 0x00000003, - 0x1c01f000, 0x592c0204, 0x492fc857, 0x80000110, - 0x040007cd, 0x80000040, 0x04000043, 0x48033002, - 0x492f3003, 0x492f3004, 0x4a033008, 0x001051e1, - 0x4202e000, 0x00000003, 0x1c01f000, 0x492fc857, - 0x0201f800, 0x0010a95a, 0x02020000, 0x0002060c, - 0x492fc857, 0x592e8a06, 0x83440c80, 0x000007f0, - 0x0402100b, 0x83440400, 0x0010aa00, 0x50000000, - 0x80026d40, 0x04000006, 0x4937c857, 0x59340200, - 0x8c00050e, 0x02020000, 0x0002060c, 0x42028000, - 0x00000028, 0x41780800, 0x417a6000, 0x0201f800, - 0x00104bee, 0x0201f800, 0x00108f7d, 0x0201f000, - 0x00020381, 0x592c0a0a, 0x8c040d02, 0x04020016, - 0x59a80021, 0x492fc857, 0x80000540, 0x0402000f, - 0x592c0207, 0x80000540, 0x04000005, 0x0201f800, - 0x00104156, 0x04020004, 0x1c01f000, 0x42000000, - 0x00000000, 0x592c0a06, 0x48065c06, 0x48025a06, - 0x0201f000, 0x00020381, 0x42000000, 0x00000028, - 0x0401f7f9, 0x42000800, 0x00000009, 0x0201f000, - 0x001063a9, 0x592c0208, 0x492fc857, 0x82000c80, - 0x0000199a, 0x04021794, 0x592c0408, 0x80000540, - 0x04020791, 0x59a80821, 0x800409c0, 0x04020009, - 0x592c0207, 0x80000540, 0x0400078b, 0x497a5a06, - 0x0201f800, 0x001041b5, 0x04020004, 0x1c01f000, - 0x42000000, 0x00000028, 0x48025a06, 0x0201f000, - 0x00020381, 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, 0x00020381, 0x592e8a06, 0x0201f800, - 0x00020267, 0x02020000, 0x00020381, 0x592e9008, - 0x592e9809, 0x0201f800, 0x00104567, 0x0201f000, - 0x00020381, 0x59a80805, 0x84040d00, 0x48075005, - 0x0201f800, 0x00020267, 0x02000800, 0x0010467a, - 0x81468800, 0x805cb840, 0x040207fa, 0x0201f000, - 0x00020381, 0x592c0a08, 0x4807c857, 0x82040580, - 0x0000000e, 0x04000045, 0x82040580, 0x00000046, - 0x04000046, 0x82040580, 0x00000045, 0x04000020, - 0x82040580, 0x00000029, 0x04000010, 0x82040580, - 0x0000002a, 0x04000009, 0x82040580, 0x0000000f, - 0x04000200, 0x82040580, 0x0000002e, 0x040001fd, - 0x4807c856, 0x0401f1f6, 0x59a80805, 0x84040d04, - 0x48075005, 0x0401f1f7, 0x592e8a06, 0x0201f800, - 0x00020267, 0x040201f3, 0x59340200, 0x84000518, - 0x48026a00, 0x592e6009, 0x4933c857, 0x83300580, - 0xffffffff, 0x0402002a, 0x0401f1ea, 0x592c1407, - 0x480bc857, 0x0201f800, 0x001091d9, 0x411e6000, - 0x04020003, 0x4803c856, 0x0401f1dd, 0x592e3809, - 0x591c1414, 0x84081516, 0x84081554, 0x480a3c14, - 0x4a026403, 0x0000003a, 0x592c040b, 0x80000540, - 0x04000007, 0x4a026403, 0x0000003b, 0x592c020c, - 0x4802641a, 0x592c040c, 0x4802621a, 0x4a026203, - 0x00000001, 0x42000800, 0x80000040, 0x0201f800, - 0x00020855, 0x0401f1cb, 0x59a80068, 0x84000510, - 0x48035068, 0x0401f1c7, 0x592c1207, 0x8c081500, - 0x040201c4, 0x592e8a06, 0x592e6009, 0x0201f800, - 0x001091e3, 0x04020003, 0x4803c856, 0x0401f1b8, - 0x59300c06, 0x82040580, 0x00000004, 0x04000003, - 0x4803c856, 0x0401f1b2, 0x59300a03, 0x82040580, - 0x00000007, 0x04000003, 0x4803c856, 0x0401f1ac, - 0x59300c03, 0x82040580, 0x00000001, 0x04000025, - 0x82040580, 0x00000003, 0x0400001a, 0x82040580, - 0x00000006, 0x04000024, 0x82040580, 0x00000008, - 0x04000019, 0x82040580, 0x0000000a, 0x0400000a, - 0x82040580, 0x0000000c, 0x04000004, 0x82040580, - 0x0000002e, 0x0402001c, 0x42000800, 0x00000009, - 0x0401f017, 0x59326809, 0x0201f800, 0x0010484b, - 0x04020015, 0x42000800, 0x00000005, 0x0401f010, - 0x417a7800, 0x0201f800, 0x00101de2, 0x4a026406, - 0x00000001, 0x42000800, 0x00000003, 0x0401f008, - 0x417a7800, 0x0201f800, 0x00101de2, 0x4a026406, - 0x00000001, 0x42000800, 0x0000000b, 0x0201f800, - 0x001043c7, 0x4a026203, 0x00000001, 0x0201f800, - 0x00106470, 0x0401f17b, 0x40000800, 0x58040000, - 0x80000540, 0x040207fd, 0x492c0800, 0x1c01f000, - 0x492fc857, 0x59300c06, 0x82040580, 0x00000006, - 0x04020094, 0x0201f800, 0x00104836, 0x04020005, - 0x59340200, 0x8c00051a, 0x02000000, 0x00020667, - 0x59340200, 0x8c00050e, 0x0400008a, 0x59300203, - 0x42027800, 0x00000001, 0x82000580, 0x00000007, - 0x02020000, 0x00020667, 0x4a026203, 0x00000002, - 0x0201f000, 0x00020667, 0x42028000, 0x00000002, - 0x4a026206, 0x00000014, 0x4d2c0000, 0x0201f800, - 0x00109fc0, 0x5c025800, 0x59300c06, 0x4807c857, - 0x82040580, 0x00000007, 0x04020063, 0x492fc857, - 0x4a025a06, 0x00000001, 0x0201f000, 0x00020381, - 0x592c240a, 0x492fc857, 0x4813c857, 0x8c10251c, - 0x04020016, 0x8c10251a, 0x04000003, 0x8c10250a, - 0x04000069, 0x59340a00, 0x8c040d0e, 0x04000003, - 0x8c10251e, 0x04000064, 0x0201f800, 0x00020892, - 0x0400006b, 0x592c240a, 0x49366009, 0x49325809, - 0x4a026406, 0x00000006, 0x4a026203, 0x00000007, - 0x0201f000, 0x00020663, 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, 0x00020381, 0x5c025800, 0x0401f7bc, - 0x592c040a, 0x8c00051c, 0x04000016, 0x592c0206, - 0x82000580, 0x0000ffff, 0x04020012, 0x592e6009, - 0x83300580, 0xffffffff, 0x040007b1, 0x83300480, - 0x0010cfc0, 0x04001010, 0x59a8000b, 0x81300480, - 0x0402100d, 0x59300008, 0x800001c0, 0x04020005, - 0x59300203, 0x82000580, 0x00000007, 0x04000797, - 0x492fc857, 0x4a025a06, 0x00000029, 0x0201f000, - 0x00020381, 0x492fc857, 0x4a025a06, 0x00000008, - 0x0201f000, 0x00020381, 0x492fc857, 0x4a025a06, - 0x00000045, 0x0201f000, 0x00020381, 0x492fc857, - 0x4a025a06, 0x0000002a, 0x0201f000, 0x00020381, - 0x492fc857, 0x4a025a06, 0x00000028, 0x0201f000, - 0x00020381, 0x492fc857, 0x4a025a06, 0x00000006, - 0x0201f000, 0x00020381, 0x492fc857, 0x4a025a06, - 0x0000000e, 0x0201f000, 0x00020381, 0x59340010, - 0x492e6810, 0x492fc857, 0x80000d40, 0x04000003, - 0x492c0800, 0x1c01f000, 0x5934040b, 0x492e680f, - 0x492fc857, 0x4803c857, 0x80000540, 0x04020003, - 0x4a026a03, 0x00000001, 0x1c01f000, 0x59a8000e, - 0x81640480, 0x0402176e, 0x42026000, 0x0010cfc0, - 0x59300009, 0x81340580, 0x04020004, 0x59300202, - 0x80040580, 0x04000759, 0x83326400, 0x00000024, - 0x41580000, 0x81300480, 0x040017f6, 0x0401f760, - 0x492fc857, 0x592c0407, 0x82000c80, 0x0000199a, - 0x040215dd, 0x592c0204, 0x80000112, 0x040205ca, - 0x592e8a06, 0x0201f800, 0x00020267, 0x04020059, - 0x0201f800, 0x00104836, 0x04020059, 0x592e780a, - 0x493fc857, 0x8d3e7d3e, 0x04020007, 0x59a80021, - 0x80000540, 0x0402004f, 0x0201f800, 0x00104686, - 0x040005c9, 0x833c1d00, 0x0000001f, 0x040005c6, - 0x592c0207, 0x82000c80, 0x00001000, 0x040215c2, - 0x800000c2, 0x800008c4, 0x8005d400, 0x592e9008, - 0x592e9809, 0x5934080d, 0x800409c0, 0x0402002e, - 0x833c1d00, 0x0000001f, 0x81780040, 0x80000000, - 0x800c1902, 0x040217fe, 0x040205b3, 0x0c01f001, - 0x001053cd, 0x001053d0, 0x001053dd, 0x001053e0, - 0x001053e3, 0x0201f800, 0x00108dfb, 0x0401f01a, - 0x0201f800, 0x00104659, 0x04000027, 0x80e9d1c0, - 0x02020800, 0x00105ce7, 0x42028000, 0x00000005, - 0x417a9000, 0x417a9800, 0x0201f800, 0x00108e0b, - 0x0401f00d, 0x42027000, 0x0000004d, 0x0401f006, - 0x42027000, 0x0000004e, 0x0401f003, 0x42027000, - 0x00000052, 0x0201f800, 0x0010451d, 0x02020800, - 0x00108e3b, 0x04000010, 0x8d3e7d3e, 0x04020017, - 0x1c01f000, 0x58040002, 0x80000540, 0x04020007, - 0x4d3c0000, 0x40067800, 0x0201f800, 0x00104639, - 0x5c027800, 0x040207cb, 0x4a025a06, 0x00000030, - 0x0401f00d, 0x4a025a06, 0x0000002c, 0x0401f00a, - 0x4a025a06, 0x00000028, 0x0401f007, 0x4a025a06, - 0x00000029, 0x0401f004, 0x497a5c09, 0x4a025a06, - 0x00000000, 0x4a025a04, 0x00000103, 0x0201f000, - 0x00020381, 0x492fc857, 0x592c0204, 0x80000110, - 0x80000040, 0x04000002, 0x0401f55b, 0x592c0207, - 0x82000500, 0x000003ff, 0x48025a07, 0x8c000506, - 0x04000004, 0x82000500, 0x00000070, 0x04020004, - 0x59a80821, 0x800409c0, 0x04020018, 0x4a025a06, - 0x0000dead, 0x592c0408, 0x82000500, 0x0000f0ff, - 0x48025c08, 0x0201f800, 0x001041e4, 0x04020002, - 0x1c01f000, 0x49425a06, 0x8058b1c0, 0x04000009, - 0x0201f800, 0x00109328, 0x0401f80f, 0x44042800, - 0x82580580, 0x00000002, 0x04020002, 0x48082801, - 0x0201f000, 0x00020381, 0x42028000, 0x00000031, - 0x42000800, 0x00000001, 0x4200b000, 0x00000001, - 0x0401f7ed, 0x592c0408, 0x80000118, 0x832c2c00, - 0x00000009, 0x80142c00, 0x1c01f000, 0x492fc857, - 0x4a025a08, 0x00000006, 0x0201f000, 0x00020381, - 0x492fc857, 0x4a025a08, 0x00000001, 0x0201f000, - 0x00020381, 0x492fc857, 0x592c040a, 0x82000500, - 0x00000003, 0x04000020, 0x0201f800, 0x00020892, - 0x04000021, 0x592c0204, 0x492e6008, 0x82000500, - 0x000000ff, 0x82000580, 0x00000045, 0x0400000e, - 0x592c000b, 0x0201f800, 0x001059b9, 0x02000800, - 0x00020267, 0x04020018, 0x42027000, 0x00000041, - 0x49366009, 0x4a026406, 0x00000001, 0x0201f000, - 0x000208d8, 0x59300015, 0x8400055e, 0x48026015, - 0x42026800, 0x0010b320, 0x42027000, 0x00000040, - 0x0401f7f4, 0x4a025a06, 0x00000101, 0x0201f000, - 0x00020381, 0x4a025a06, 0x0000002c, 0x0201f000, - 0x00020381, 0x4a025a06, 0x00000028, 0x0201f800, - 0x00020381, 0x0201f000, 0x000208b4, 0x492fc857, - 0x0201f800, 0x0010601a, 0x0400000b, 0x592c0204, - 0x80000110, 0x80000040, 0x040204e7, 0x592c0c06, - 0x800409c0, 0x04000009, 0x42000000, 0x00000102, - 0x0401f003, 0x42000000, 0x00000104, 0x48025a06, - 0x0201f000, 0x00020381, 0x592c0c07, 0x800409c0, - 0x04000024, 0x82040480, 0x00000005, 0x04021021, - 0x4c040000, 0x80040800, 0x0201f800, 0x0010603f, - 0x5c001000, 0x04020018, 0x832c0400, 0x00000008, - 0x4000a000, 0x0201f800, 0x00106068, 0x04020012, - 0x592c1207, 0x82cc0580, 0x0010b30a, 0x04020009, - 0x58c80c0b, 0x84040d00, 0x84040d02, 0x8c081500, - 0x04000002, 0x84040d5e, 0x4805940b, 0x0401f001, - 0x42000000, 0x00000000, 0x48025a06, 0x0201f000, - 0x00020381, 0x42000000, 0x00000103, 0x0401f7fb, - 0x42000000, 0x00000102, 0x0401f7f8, 0x492fc857, - 0x592e7c06, 0x833c0500, 0xfffffffe, 0x04020043, - 0x592c4007, 0x42026000, 0x0010cfc0, 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, 0x00108997, 0x5c025800, - 0x0400001e, 0x4a025a06, 0x00000000, 0x0201f000, - 0x00020381, 0x592e8a06, 0x83440480, 0x000007f0, - 0x04021016, 0x83440400, 0x0010aa00, 0x50000000, - 0x80026d40, 0x04000011, 0x4d2c0000, 0x0201f800, - 0x00104619, 0x0400000c, 0x42028000, 0x00000005, - 0x592c0a08, 0x0201f800, 0x00104bee, 0x0201f800, - 0x00108f83, 0x0201f800, 0x00020381, 0x5c025800, - 0x0401f7e5, 0x5c025800, 0x4a025a06, 0x00000031, - 0x0201f000, 0x00020381, 0x492fc857, 0x4d2c0000, - 0x0201f800, 0x0010082a, 0x04000016, 0x492fc857, - 0x412f4000, 0x0201f800, 0x0010082a, 0x0400000e, - 0x492fc857, 0x412dd800, 0x0201f800, 0x00103941, - 0x0201f800, 0x0010394b, 0x49a1d80b, 0x5c025800, - 0x492dd80a, 0x0201f800, 0x00101fbb, 0x0201f000, - 0x00101fda, 0x41a25800, 0x0201f800, 0x0010083a, - 0x5c025800, 0x4a025a06, 0x00004005, 0x4a025c06, - 0x00000002, 0x0201f000, 0x00020381, 0x4807c857, - 0x485fc857, 0x4200b800, 0x00000001, 0x5c000800, - 0x4c5c0000, 0x0401f005, 0x4807c857, 0x485fc857, - 0x5c000800, 0x4d780000, 0x4803c857, 0x492fc857, - 0x8c00050e, 0x02020800, 0x0010060d, 0x4203e000, - 0x50000000, 0x4200b800, 0x00008003, 0x0201f000, - 0x0010061a, 0x592c0204, 0x80000110, 0x80000040, - 0x0402042d, 0x0201f800, 0x00104886, 0x04020002, - 0x1c01f000, 0x49425a06, 0x4806580d, 0x480a580e, - 0x4943c857, 0x4807c857, 0x480bc857, 0x0201f000, - 0x00020381, 0x592c0204, 0x80000110, 0x80000040, - 0x0402041d, 0x0201f800, 0x001049ec, 0x04020002, - 0x1c01f000, 0x49425a06, 0x48065811, 0x480a5812, - 0x0201f000, 0x00020381, 0x592c0204, 0x80000110, - 0x04000411, 0x80000040, 0x0402000c, 0x4202e000, - 0x00000001, 0x592c020a, 0x8c000504, 0x02000000, - 0x00020603, 0x592c0207, 0x82000c80, 0x00001001, - 0x04021415, 0x0401f009, 0x4202e000, 0x00000003, - 0x48033002, 0x492f3003, 0x492f3004, 0x4a033008, - 0x00020603, 0x1c01f000, 0x4202e000, 0x00000002, - 0x42000000, 0x0010bcd9, 0x50007000, 0x492c700b, - 0x4978700e, 0x4978700c, 0x592c0011, 0x592c0812, - 0x48007007, 0x48047008, 0x592c1013, 0x82080500, - 0xffff0000, 0x04000003, 0x0201f800, 0x00100615, - 0x4978700d, 0x82080480, 0x00000180, 0x4803c857, - 0x04001007, 0x4800700f, 0x4a007005, 0x00000180, - 0x4a007004, 0x00000060, 0x0401f005, 0x4978700f, - 0x48087005, 0x80081104, 0x48087004, 0x5838000a, - 0x48007003, 0x40381000, 0x0201f000, 0x001008a1, - 0x0201f800, 0x00100819, 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, 0x00020381, 0x0401f005, 0x4a025a06, - 0x00000010, 0x0201f800, 0x00020381, 0x5c007000, - 0x4202e000, 0x00000001, 0x4a007002, 0x00000100, - 0x49787010, 0x1c01f000, 0x58380004, 0x82000480, - 0x00000003, 0x04000087, 0x58380010, 0x8c000500, - 0x04020019, 0x4200b000, 0x00000003, 0x832cac00, - 0x00000011, 0x5838000a, 0x5838100d, 0x8008a400, - 0x4c380000, 0x0201f800, 0x0010a93e, 0x5c007000, - 0x5838000d, 0x82000400, 0x00000003, 0x4800700d, - 0x4a007010, 0x00000001, 0x58380004, 0x82000480, - 0x00000003, 0x48007004, 0x82000580, 0x00000003, - 0x0400006c, 0x5838000e, 0x80001d40, 0x04020020, - 0x4c380000, 0x0201f800, 0x00100819, 0x5c007000, - 0x04000010, 0x4a025a04, 0x0000010a, 0x42001800, - 0x00000005, 0x480c700e, 0x5838000c, 0x80000540, - 0x04020002, 0x5838000b, 0x40000800, 0x492c0801, - 0x492c700c, 0x42000800, 0x0000000f, 0x0401f011, - 0x4202e000, 0x00000008, 0x4a033007, 0x001055f9, - 0x1c01f000, 0x4202e000, 0x00000002, 0x42000000, - 0x0010bcd9, 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, 0x0010a93e, 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, - 0x00105644, 0x00105648, 0x00105646, 0x00105644, - 0x001055e0, 0x00105648, 0x00105646, 0x00105644, - 0x0201f800, 0x00100615, 0x5838100f, 0x0401f739, - 0x5838080d, 0x82040400, 0x00000002, 0x5838100a, - 0x80080400, 0x50001000, 0x800811c0, 0x0402000f, - 0x4202e000, 0x00000001, 0x583a580b, 0x4978700b, - 0x49787010, 0x592c0204, 0x82000500, 0x000000ff, - 0x82000580, 0x00000012, 0x02000000, 0x0002063b, - 0x0201f000, 0x00020603, 0x5838000a, 0x80040c00, - 0x82381c00, 0x00000007, 0x54041800, 0x80040800, - 0x800c1800, 0x54041800, 0x0401f71a, 0x0201f800, - 0x00100819, 0x02000800, 0x00100615, 0x4a02580a, - 0x0010bc78, 0x42000800, 0x0010bcd9, 0x452c0800, - 0x497a580b, 0x497a580c, 0x497a580d, 0x497a580e, - 0x497a580f, 0x4a025809, 0x0010559a, 0x497a5810, - 0x4a025802, 0x00000100, 0x4a025801, 0x00000001, - 0x1c01f000, 0x59c80007, 0x8c000502, 0x04000071, - 0x835c2c80, 0x00000005, 0x02001000, 0x00105c5c, - 0x59c82817, 0x4817506e, 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, 0x4a039005, - 0x00000140, 0x82140500, 0x0e000000, 0x80000132, - 0x0c01f83e, 0x1c01f000, 0x59cc0400, 0x82000500, - 0x0000ff00, 0x82000580, 0x00008100, 0x040007f4, - 0x0401f01c, 0x4817c857, 0x82140500, 0x000003ff, - 0x04020007, 0x59cc0400, 0x82000500, 0x0000ff00, - 0x82000580, 0x00008100, 0x04020012, 0x42000000, - 0x0010b6bc, 0x0201f800, 0x0010a86e, 0x0201f800, - 0x00105b32, 0x4803c856, 0x4a039005, 0x00000140, - 0x0401f020, 0x4817c857, 0x82140500, 0x00f60000, - 0x04020004, 0x0201f800, 0x00105b6e, 0x040207d2, - 0x0201f800, 0x00104e0d, 0x04000010, 0x59c400a4, - 0x4803c857, 0x82000500, 0x0000000f, 0x82000580, - 0x0000000a, 0x04020009, 0x497b5016, 0x59c400a3, - 0x82000540, 0x00080000, 0x480388a3, 0x82000500, - 0xfff7ffff, 0x480388a3, 0x4817c856, 0x0201f800, - 0x0010a79f, 0x4a039005, 0x00000140, 0x0401f842, - 0x4803c856, 0x1c01f000, 0x00105702, 0x00105a13, - 0x001056fa, 0x001056fa, 0x001056fa, 0x001056fa, - 0x001056fa, 0x001056fa, 0x4803c857, 0x42000000, - 0x0010b659, 0x0201f800, 0x0010a86e, 0x4a039005, - 0x00000140, 0x1c01f000, 0x59cc0400, 0x82000d00, - 0x0000ff00, 0x82041500, 0x0000f000, 0x840409c0, - 0x82140500, 0x000003ff, 0x800018c4, 0x8c142d14, - 0x04000005, 0x59cc0002, 0x82000500, 0x00000003, - 0x800c1c80, 0x480f5016, 0x82080580, 0x00002000, - 0x04020013, 0x836c0580, 0x00000001, 0x0402000e, - 0x59cc0006, 0x82000500, 0xff000000, 0x82000580, - 0x11000000, 0x02020800, 0x001006ba, 0x04020011, - 0x0201f800, 0x00103951, 0x0201f800, 0x00105c81, - 0x0401f00c, 0x0401f81f, 0x0401f00a, 0x82080580, - 0x00003000, 0x04020003, 0x0401fa40, 0x0401f005, - 0x82080580, 0x00008000, 0x04020002, 0x0401fb36, - 0x1c01f000, 0x4817c857, 0x42000000, 0x0010b658, - 0x0201f800, 0x0010a86e, 0x836c0580, 0x00000003, - 0x0402000b, 0x4c080000, 0x4c0c0000, 0x42001000, - 0x00008048, 0x40141800, 0x80142120, 0x0201f800, - 0x00103857, 0x5c001800, 0x5c001000, 0x1c01f000, - 0x59cc0002, 0x82000500, 0xff000000, 0x82001580, - 0x01000000, 0x04000006, 0x82001580, 0x23000000, - 0x02020800, 0x001006ba, 0x040201c9, 0x82040580, - 0x00000023, 0x04020055, 0x59cc0004, 0x4803c857, - 0x59cc0006, 0x82000500, 0xff000000, 0x59cc0801, - 0x82040d00, 0x00ffffff, 0x80040540, 0x4803c857, - 0x0401fbb2, 0x02000800, 0x001006ba, 0x040001b8, - 0x59300c06, 0x82040580, 0x00000010, 0x04000012, - 0x82040580, 0x00000011, 0x0400000f, 0x82040580, - 0x00000001, 0x0400000c, 0x82040580, 0x00000004, - 0x04000009, 0x82040580, 0x00000008, 0x04000006, - 0x82040580, 0x0000000a, 0x02020800, 0x001006ba, - 0x040201a3, 0x59300004, 0x82000500, 0x80010000, - 0x04000006, 0x0201f800, 0x00106cb4, 0x02020800, - 0x001006ba, 0x0402019a, 0x59cc0a04, 0x48066202, - 0x59a80016, 0x800001c0, 0x02000800, 0x001006ba, - 0x04000193, 0x59cc0006, 0x82000500, 0xffff0000, - 0x82000d80, 0x02000000, 0x04020005, 0x42027000, - 0x00000015, 0x0201f000, 0x000208d8, 0x82000d80, - 0x02140000, 0x040007fa, 0x82000d80, 0x02100000, - 0x040007f7, 0x82000d80, 0x02100000, 0x040007f4, - 0x82000d80, 0x01000000, 0x02020800, 0x001006ba, - 0x0402017b, 0x59cc0006, 0x82000500, 0x0000ffff, - 0x02020800, 0x001006ba, 0x04020175, 0x42027000, - 0x00000016, 0x0401f7e8, 0x82040580, 0x00000022, - 0x02020800, 0x001006ba, 0x0402016d, 0x59cc0004, - 0x4803c857, 0x59cc0006, 0x4803c857, 0x59cc0001, - 0x4803c857, 0x59a80016, 0x800001c0, 0x02000800, - 0x001006ba, 0x04000162, 0x59a80806, 0x8c040d14, - 0x04000011, 0x0401f97d, 0x0402000f, 0x0401f993, - 0x0400000d, 0x42027000, 0x0000004c, 0x59cc0001, - 0x82000500, 0x00ffffff, 0x0201f800, 0x00105c25, - 0x0400013e, 0x42028800, 0x0000ffff, 0x417a6800, - 0x0401f13a, 0x59cc0006, 0x82000500, 0xffff0000, - 0x82000d80, 0x03000000, 0x04020023, 0x59a80026, - 0x8c000508, 0x04000017, 0x8400054c, 0x48035026, - 0x59cc0800, 0x82040d00, 0x00ffffff, 0x48075010, - 0x497b8830, 0x84040d70, 0x48078832, 0x59c40802, - 0x84040d4c, 0x48078802, 0x59cc0007, 0x82000500, - 0x0000ffff, 0x48038893, 0x4803501e, 0x42000800, - 0x00000003, 0x59a81010, 0x0201f800, 0x001069af, - 0x59cc0006, 0x82000500, 0x0000ffff, 0x02020800, - 0x001006ba, 0x0402012a, 0x42027000, 0x00000017, - 0x0401f0e5, 0x82000d80, 0x04000000, 0x04020013, - 0x59cc0006, 0x82000500, 0x0000ffff, 0x02020800, - 0x001006ba, 0x0402011e, 0x0201f800, 0x00104e0d, - 0x04000004, 0x42027000, 0x0000001d, 0x0401f0d6, - 0x59a80026, 0x84000548, 0x48035026, 0x42027000, - 0x00000030, 0x0401f0d0, 0x82000d80, 0x05000000, - 0x0402000a, 0x59cc0006, 0x82000500, 0x0000ffff, - 0x02020800, 0x001006ba, 0x04020109, 0x42027000, - 0x00000018, 0x0401f0c4, 0x82000d80, 0x20100000, - 0x04020004, 0x42027000, 0x00000019, 0x0401f0be, - 0x82000d80, 0x21100000, 0x04020004, 0x42027000, - 0x0000001a, 0x0401f0b8, 0x82000d80, 0x52000000, - 0x0402000a, 0x59cc0006, 0x82000500, 0x0000ffff, - 0x02020800, 0x001006ba, 0x040200f1, 0x42027000, - 0x0000001b, 0x0401f0ac, 0x82000d80, 0x50000000, - 0x0402000a, 0x59cc0006, 0x82000500, 0x0000ffff, - 0x02020800, 0x001006ba, 0x040200e5, 0x42027000, - 0x0000001c, 0x0401f0a0, 0x82000d80, 0x13000000, - 0x04020004, 0x42027000, 0x00000034, 0x0401f09a, - 0x82000d80, 0x12000000, 0x0402000a, 0x59cc0006, - 0x82000500, 0x0000ffff, 0x02020800, 0x001006ba, - 0x040200d3, 0x42027000, 0x00000024, 0x0401f08e, - 0x82000d00, 0xff000000, 0x82040d80, 0x24000000, - 0x04020004, 0x42027000, 0x0000002d, 0x0401f086, - 0x82000d00, 0xff000000, 0x82040d80, 0x53000000, - 0x04020004, 0x42027000, 0x0000002a, 0x0401f07e, - 0x82000d80, 0x0f000000, 0x04020004, 0x42027000, - 0x00000020, 0x0401f078, 0x82000d80, 0x61040000, - 0x04020036, 0x83cc1400, 0x00000006, 0x80080800, - 0x50080000, 0x82000500, 0x0000ffff, 0x82000480, - 0x00000004, 0x4c580000, 0x8000b104, 0x8058b1c0, - 0x04000026, 0x4c100000, 0x50041800, 0x820c1500, - 0x03000000, 0x80081130, 0x42000000, 0x0010b615, - 0x82082580, 0x00000000, 0x04020004, 0x42000000, - 0x0010b612, 0x0401f00c, 0x82082580, 0x00000001, - 0x04020004, 0x42000000, 0x0010b613, 0x0401f006, - 0x82082580, 0x00000002, 0x04020003, 0x42000000, - 0x0010b614, 0x0201f800, 0x0010a86e, 0x42001000, - 0x00008015, 0x820c2500, 0x0000ffff, 0x800c1920, - 0x0201f800, 0x00103857, 0x5c002000, 0x80040800, - 0x8058b040, 0x040207da, 0x5c00b000, 0x42027000, - 0x00000023, 0x0401f040, 0x82000d80, 0x60000000, - 0x04020004, 0x42027000, 0x0000003f, 0x0401f03a, - 0x82000d80, 0x54000000, 0x04020008, 0x0401fb36, - 0x02020800, 0x001006ba, 0x04020075, 0x42027000, - 0x00000046, 0x0401f030, 0x82000d80, 0x55000000, - 0x04020009, 0x0401fb54, 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, 0x0401f005, - 0x0401f8da, 0x02020800, 0x001006ba, 0x04020034, - 0x0201f800, 0x00104401, 0x02020800, 0x001006ba, - 0x0402002f, 0x83380580, 0x00000046, 0x04020006, - 0x59a80010, 0x80180580, 0x02000800, 0x001006ba, - 0x04000027, 0x59340200, 0x8c000514, 0x0400000f, - 0x83380580, 0x00000030, 0x0400000c, 0x83380580, - 0x0000003f, 0x04000009, 0x83380580, 0x00000034, - 0x04000006, 0x83380580, 0x00000024, 0x04000003, - 0x42027000, 0x0000004c, 0x0201f800, 0x00020892, - 0x04000018, 0x49366009, 0x4a026406, 0x00000004, - 0x59cc0c04, 0x48066202, 0x83380580, 0x0000004c, - 0x04020009, 0x4a026406, 0x00000011, 0x813669c0, - 0x04020005, 0x59cc0001, 0x82000500, 0x00ffffff, - 0x4802601e, 0x0201f000, 0x000208d8, 0x59880053, - 0x4803c857, 0x80000000, 0x48031053, 0x1c01f000, - 0x42001000, 0x00008049, 0x59cc1806, 0x800c1930, - 0x0201f800, 0x00103857, 0x0201f800, 0x001076c9, - 0x02000800, 0x001006ba, 0x040007f1, 0x49366009, - 0x4a026406, 0x00000004, 0x59cc0c04, 0x48066202, - 0x4a026403, 0x00000009, 0x4a02641a, 0x00000009, - 0x4a02621a, 0x00002900, 0x4a026203, 0x00000001, - 0x0201f000, 0x00106470, 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, - 0x0010b2df, 0x500c1800, 0x800c0500, 0x4803c857, - 0x1c01f000, 0x40100800, 0x41781800, 0x82040480, - 0x00000020, 0x04001004, 0x800c1800, 0x40000800, - 0x0401f7fb, 0x82040500, 0x0000000f, 0x82000400, - 0x0010a95f, 0x50000000, 0x8c040d08, 0x04000002, - 0x900001c0, 0x1c01f000, 0x4803c856, 0x0401fadd, - 0x0402000a, 0x0201f800, 0x00101eb0, 0x04020007, - 0x59cc0002, 0x82000500, 0xff000000, 0x82000d80, - 0x08000000, 0x04000802, 0x1c01f000, 0x4803c856, - 0x59cc0400, 0x82000d00, 0x0000ff00, 0x840409c0, - 0x82040580, 0x00000033, 0x0402001f, 0x0401f98f, - 0x04000038, 0x59cc0a04, 0x48066202, 0x59cc0006, - 0x4803c857, 0x82000500, 0xffff0000, 0x82000d80, - 0x02000000, 0x04020009, 0x59cc0006, 0x82000500, - 0x0000ffff, 0x0402002b, 0x42027000, 0x00000015, - 0x0201f000, 0x000208d8, 0x82000d80, 0x01000000, - 0x04020024, 0x59cc0006, 0x82000500, 0x0000ffff, - 0x04020020, 0x42027000, 0x00000016, 0x0201f000, - 0x000208d8, 0x82040580, 0x00000032, 0x04020019, - 0x59cc0006, 0x82000500, 0xffff0000, 0x82000d80, - 0x14000000, 0x04020013, 0x42027000, 0x00000038, - 0x59cc0001, 0x0401f810, 0x0402000e, 0x0201f800, - 0x001043fc, 0x0402000b, 0x0201f800, 0x00020892, - 0x04000008, 0x49366009, 0x4a026406, 0x00000004, - 0x59cc0c04, 0x48066202, 0x0201f000, 0x000208d8, - 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, 0x00105a2e, 0x00105a2e, - 0x00105a2e, 0x00105b1d, 0x00105a2e, 0x00105a30, - 0x00105a48, 0x00105a4b, 0x00105a2e, 0x00105a2e, - 0x00105a2e, 0x00105a2e, 0x00105a2e, 0x00105a2e, - 0x00105a2e, 0x00105a2e, 0x4803c856, 0x1c01f000, - 0x0401f8de, 0x04000014, 0x82140500, 0x000003ff, - 0x800000c4, 0x82000480, 0x00000008, 0x0400100e, - 0x59cc0001, 0x59326809, 0x59340802, 0x80040580, - 0x82000500, 0x00ffffff, 0x04020007, 0x59cc0a04, - 0x48066202, 0x42027000, 0x00000046, 0x0201f000, - 0x000208d8, 0x59cc0004, 0x4803c857, 0x1c01f000, - 0x59cc0004, 0x4803c857, 0x1c01f000, 0x0401f8c3, - 0x04000016, 0x82140500, 0x000003ff, 0x800000c4, - 0x82000480, 0x0000000c, 0x04001010, 0x59cc0001, - 0x82000500, 0x00ffffff, 0x59326809, 0x59340802, - 0x82040d00, 0x00ffffff, 0x80040580, 0x04020007, - 0x59cc0a04, 0x48066202, 0x42027000, 0x00000045, - 0x0201f000, 0x000208d8, 0x59cc0004, 0x4803c857, - 0x1c01f000, 0x59cc0004, 0x4803c857, 0x59cc0000, - 0x82000500, 0xff000000, 0x59cc1001, 0x82081500, - 0x00ffffff, 0x80080540, 0x4803c857, 0x4817c857, - 0x0401f9d8, 0x02020800, 0x001006ba, 0x04020016, - 0x0201f800, 0x00101eb0, 0x02020800, 0x001006ba, - 0x04020011, 0x59cc0002, 0x82000500, 0xff000000, - 0x82000580, 0x00000000, 0x02020800, 0x001006ba, - 0x04020009, 0x82040500, 0x0000000f, 0x82000c80, - 0x00000006, 0x02021800, 0x001006ba, 0x04021002, - 0x0c01f003, 0x4803c856, 0x1c01f000, 0x00105a91, - 0x00105a93, 0x00105a91, 0x00105a91, 0x00105aec, - 0x00105afb, 0x4803c856, 0x1c01f000, 0x59a80016, - 0x800001c0, 0x02020800, 0x001006ba, 0x040207fa, - 0x59cc0802, 0x4807c856, 0x8c040d2e, 0x0402001d, - 0x0201f800, 0x001076c9, 0x02000800, 0x00100615, - 0x59cc0001, 0x0401ff18, 0x0402000d, 0x0201f800, - 0x00020267, 0x0402000a, 0x4a026406, 0x00000005, - 0x49366009, 0x59cc0804, 0x4806601c, 0x42027000, - 0x00000088, 0x0201f000, 0x000208d8, 0x4803c857, - 0x42028800, 0x0000ffff, 0x417a6800, 0x59cc0001, - 0x82000500, 0x00ffffff, 0x4802601e, 0x0401f7ef, - 0x59cc0001, 0x4803c857, 0x0401feff, 0x02020800, - 0x001006ba, 0x040207d4, 0x0201f800, 0x001043fc, - 0x02020800, 0x001006ba, 0x040207cf, 0x59cc0005, - 0x8c000500, 0x04020006, 0x59340200, 0x8c00050e, - 0x02020800, 0x001006ba, 0x040207c7, 0x0201f800, - 0x00104842, 0x04020013, 0x0401f840, 0x02000800, - 0x001006ba, 0x040007c0, 0x0201f800, 0x00020892, - 0x02000800, 0x001006ba, 0x040007bb, 0x49366009, - 0x4a026406, 0x00000002, 0x59cc0804, 0x4806601c, - 0x42027000, 0x00000088, 0x0201f000, 0x000208d8, - 0x0201f800, 0x00020892, 0x040007af, 0x49366009, - 0x4a026406, 0x00000004, 0x59cc0c04, 0x48066202, - 0x42027000, 0x00000001, 0x0201f000, 0x000208d8, - 0x59cc0802, 0x8c040d2e, 0x0400000b, 0x0401f81f, - 0x04000009, 0x0401f961, 0x04020007, 0x59cc0a04, - 0x48066202, 0x42027000, 0x00000089, 0x0201f000, - 0x000208d8, 0x4933c857, 0x1c01f000, 0x59cc0004, - 0x4803c857, 0x59cc0802, 0x8c040d2e, 0x0400000b, - 0x0401f80e, 0x04000009, 0x0401f950, 0x04020007, - 0x59cc0a04, 0x48066202, 0x42027000, 0x0000008a, - 0x0201f000, 0x000208d8, 0x4933c857, 0x1c01f000, - 0x59cc0a04, 0x0401f002, 0x59cc0c04, 0x59a8000e, - 0x59a81067, 0x80080400, 0x80040480, 0x04021008, - 0x40040000, 0x800000c4, 0x800408ca, 0x80040c00, - 0x82066400, 0x0010cfc0, 0x1c01f000, 0x80000580, - 0x0401f7fe, 0x59cc0802, 0x8c040d2e, 0x04020010, - 0x0401ffec, 0x0400000e, 0x59cc0001, 0x82000500, - 0x00ffffff, 0x59326809, 0x59340802, 0x82040d00, - 0x00ffffff, 0x80040580, 0x04020005, 0x42027000, - 0x00000051, 0x0201f000, 0x000208d8, 0x59cc0004, - 0x4803c857, 0x1c01f000, 0x4803c856, 0x42003000, - 0x00000105, 0x0401f001, 0x4803c856, 0x4c3c0000, - 0x41cc7800, 0x40142000, 0x0401f803, 0x5c007800, - 0x1c01f000, 0x4803c856, 0x4c580000, 0x583c0400, - 0x82000500, 0x0000f000, 0x82000580, 0x0000c000, - 0x04000024, 0x0201f800, 0x00020892, 0x04000021, - 0x4c180000, 0x583c0001, 0x0401fe6f, 0x0402001f, - 0x0201f800, 0x001043fc, 0x0402001c, 0x49366009, - 0x0201f800, 0x0010082a, 0x04000018, 0x492e6017, - 0x497a5800, 0x497a5a04, 0x48125c04, 0x832cac00, - 0x00000005, 0x4200b000, 0x00000007, 0x403ca000, - 0x0201f800, 0x0010a93e, 0x5c003000, 0x481a641a, - 0x4a026403, 0x0000003e, 0x4a026406, 0x00000001, - 0x4a026203, 0x00000001, 0x0201f800, 0x00106470, - 0x5c00b000, 0x1c01f000, 0x0201f800, 0x000208b4, - 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, 0x0010473b, 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, 0x0401ff57, - 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, 0x001082ff, 0x04020010, 0x8c5cbd02, - 0x0400000a, 0x4200b000, 0x00000002, 0x83a81c00, - 0x00000000, 0x83cc1400, 0x0000000f, 0x0201f800, - 0x001082ff, 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, 0x001082ff, 0x04020010, 0x8c5cbd02, - 0x0400000a, 0x4200b000, 0x00000002, 0x83a81c00, - 0x00000000, 0x83cc1400, 0x0000000b, 0x0201f800, - 0x001082ff, 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, - 0x0010cfc0, 0x4a032800, 0x00000000, 0x4a032808, - 0x00106d9f, 0x42000000, 0x00000005, 0x83947c00, - 0x00000009, 0x49787801, 0x4a007802, 0x00106d54, - 0x823c7c00, 0x00000003, 0x80000040, 0x040207fa, - 0x4a032819, 0xffff0000, 0x4201d000, 0x00000064, - 0x0401f97c, 0x4201d000, 0x000186a0, 0x0401f18b, - 0x00000000, 0x00000003, 0x00000006, 0x00000009, - 0x0000000c, 0x4d300000, 0x4d2c0000, 0x4d340000, - 0x4d400000, 0x4cfc0000, 0x4d380000, 0x4d3c0000, - 0x4d440000, 0x4d4c0000, 0x4d480000, 0x4c5c0000, - 0x4c600000, 0x4c640000, 0x4cc80000, 0x4ccc0000, - 0x0201f800, 0x000206af, 0x5c019800, 0x5c019000, - 0x5c00c800, 0x5c00c000, 0x5c00b800, 0x5c029000, - 0x5c029800, 0x5c028800, 0x5c027800, 0x5c027000, - 0x5c01f800, 0x5c028000, 0x5c026800, 0x5c025800, - 0x5c026000, 0x1c01f000, 0x59940004, 0x80000540, - 0x0402000a, 0x59940025, 0x80040400, 0x02001800, - 0x00100615, 0x48032804, 0x480b2805, 0x4a032803, - 0x0000000a, 0x80000580, 0x1c01f000, 0x5994001f, - 0x80000540, 0x0402000a, 0x59940025, 0x80040400, - 0x02001800, 0x00100615, 0x4803281f, 0x480b2820, - 0x4a03281e, 0x00000001, 0x80000580, 0x1c01f000, - 0x59940022, 0x80000540, 0x0402000a, 0x59940025, - 0x80040400, 0x02001800, 0x00100615, 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, 0x00020267, 0x04020012, 0x59341a03, - 0x800c1840, 0x0400100f, 0x59940027, 0x800c0480, - 0x04000003, 0x48026a03, 0x0402100a, 0x5934000f, - 0x497a6a03, 0x80000540, 0x04000006, 0x4c3c0000, - 0x5934140b, 0x0201f800, 0x00020275, 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, - 0x0010cfc0, 0x497b2826, 0x80000540, 0x0400000f, - 0x4a032800, 0x00000001, 0x5c03e000, 0x1c01f000, - 0x4c3c0000, 0x0201f800, 0x00108f92, 0x5c007800, - 0x0401f7d1, 0x4c3c0000, 0x0201f800, 0x00108b11, - 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, - 0x00100728, 0x1c01f000, 0x4a032807, 0x000007d0, - 0x4a032806, 0x0000000a, 0x1c01f000, 0x42000800, - 0x000007d0, 0x83180480, 0x00000005, 0x02021800, - 0x00100615, 0x83947c00, 0x00000009, 0x83180400, - 0x00105c7c, 0x50000000, 0x803c7c00, 0x48047801, - 0x4a007800, 0x0000000a, 0x1c01f000, 0x83180480, - 0x00000005, 0x02021800, 0x00100615, 0x83947c00, - 0x00000009, 0x83180400, 0x00105c7c, 0x50000000, - 0x803c7c00, 0x49787801, 0x1c01f000, 0x4807c857, - 0x480bc857, 0x59940025, 0x80040400, 0x02001800, - 0x00100615, 0x48032804, 0x480b2805, 0x4a032803, - 0x0000000a, 0x1c01f000, 0x4807c857, 0x480bc857, - 0x59940025, 0x80040400, 0x02001800, 0x00100615, - 0x4803281c, 0x480b281d, 0x4a03281b, 0x0000000a, - 0x1c01f000, 0x4c000000, 0x5994001d, 0x4803c857, - 0x480bc857, 0x80080580, 0x04020003, 0x4803281c, - 0x4803281d, 0x5c000000, 0x1c01f000, 0x4807c857, - 0x480bc857, 0x59940025, 0x80040400, 0x02001800, - 0x00100615, 0x48032822, 0x480b2823, 0x4a032821, - 0x0000000a, 0x1c01f000, 0x80e9d1c0, 0x0400000e, - 0x0401f832, 0x04025000, 0x4203e000, 0x80000000, - 0x40e81000, 0x41780800, 0x42000000, 0x00000064, - 0x0201f800, 0x001063ee, 0x59940024, 0x80080400, - 0x48032824, 0x1c01f000, 0x42001000, 0x00104d39, - 0x0401fee5, 0x42001000, 0x00104d2c, 0x0401ffd6, - 0x42001000, 0x00103f62, 0x0401fedf, 0x42001000, - 0x00103fe4, 0x0401fedc, 0x42001000, 0x00103f37, - 0x0401fed9, 0x42001000, 0x0010401b, 0x0401f6ea, - 0x4203e000, 0x70000000, 0x4203e000, 0xb0300000, - 0x40ebf800, 0x42000000, 0x0000003c, 0x04004004, - 0x80000040, 0x040207fe, 0x0401f007, 0x4203e000, - 0x70000000, 0x42000000, 0x0010b67d, 0x0201f800, - 0x0010a86e, 0x1c01f000, 0x4203e000, 0x80000000, - 0x4203e000, 0xb0400000, 0x40ebf800, 0x42000000, - 0x0000003c, 0x04005004, 0x80000040, 0x040207fe, - 0x0401f007, 0x4203e000, 0x80000000, 0x42000000, - 0x0010b67e, 0x0201f800, 0x0010a86e, 0x1c01f000, - 0x59a8000e, 0x82000480, 0x00000100, 0x599c0a02, - 0x800409c0, 0x04020002, 0x80040800, 0x80041480, - 0x04001002, 0x40000800, 0x48075067, 0x59a8100e, - 0x40040000, 0x800acc80, 0x4967500e, 0x49675069, - 0x59aaa80b, 0x41640800, 0x42001000, 0x00000024, - 0x0201f800, 0x001063cf, 0x8206a400, 0x0010cfc0, - 0x49535065, 0x4152b000, 0x42006000, 0x0010bc64, - 0x4a006004, 0x0000012c, 0x4a006005, 0xda10da10, - 0x4a006008, 0x00000011, 0x4a006009, 0x0010bc64, - 0x4a00600a, 0x00101108, 0x599c0014, 0x48006011, - 0x599c0015, 0x48006012, 0x42006000, 0x0010bc40, - 0x4a006203, 0x00000008, 0x4a006406, 0x00000006, - 0x4a006002, 0xffff0000, 0x4a006008, 0x0010bc64, - 0x4a006014, 0x0010bc64, 0x599c0014, 0x48006015, - 0x599c0015, 0x48006016, 0x599c0413, 0x48006017, - 0x49506018, 0x49546019, 0x59a80067, 0x4800601a, - 0x4a00601b, 0x0010b265, 0x4a00601c, 0x0010b266, - 0x4a00601d, 0x0010b26a, 0x42000000, 0xb0000000, - 0x42000800, 0x0010bc40, 0x0201f800, 0x00100bb2, - 0x1c01f000, 0x82000d00, 0x000000c0, 0x04000004, - 0x82040d80, 0x000000c0, 0x04020055, 0x82000d00, - 0x00002020, 0x59300414, 0x84000512, 0x82040d80, - 0x00002020, 0x0400000b, 0x8c000514, 0x0402000f, - 0x48026414, 0x813e79c0, 0x02020000, 0x00020804, - 0x42027000, 0x00000043, 0x0201f000, 0x000208d8, - 0x59326809, 0x59340a00, 0x8c040d0a, 0x040007f3, - 0x84000552, 0x0401f7f1, 0x84000514, 0x592c080d, - 0x48066015, 0x0401f7ef, 0x59326809, 0x59340a00, - 0x8c040d0a, 0x02000000, 0x00020817, 0x59300c14, - 0x84040d52, 0x48066414, 0x0201f000, 0x00020817, - 0x0201f800, 0x00020087, 0x813e79c0, 0x02020000, - 0x00020804, 0x0201f000, 0x00020825, 0x8c00051e, - 0x02000000, 0x00020831, 0x82000d00, 0x00002020, - 0x82040d80, 0x00002020, 0x04000014, 0x82000500, - 0x000000c0, 0x82000d80, 0x00000080, 0x04000008, - 0x813e79c0, 0x02020000, 0x00020804, 0x42027000, - 0x00000041, 0x0201f000, 0x000208d8, 0x813e79c0, - 0x02020000, 0x00020804, 0x42027000, 0x00000043, - 0x0201f000, 0x000208d8, 0x59326809, 0x59340a00, - 0x8c040d0a, 0x040007ea, 0x59300c14, 0x84040d52, - 0x48066414, 0x0401f7e6, 0x492fc857, 0x42000800, - 0x00000006, 0x0201f000, 0x0002082c, 0x492fc857, - 0x42000800, 0x00000004, 0x0201f000, 0x0002082c, - 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, 0x00100bde, 0x59a80069, - 0x82000480, 0x00000007, 0x48035069, 0x80000580, - 0x42000800, 0x0010b315, 0x48000800, 0x48000801, - 0x1c01f000, 0x59a80069, 0x82000400, 0x00000007, - 0x48035069, 0x1c01f000, 0x83640480, 0x00000008, - 0x0400101b, 0x58c80a03, 0x80000580, 0x82000400, - 0x00000008, 0x80040840, 0x040207fd, 0x815c0480, - 0x04001013, 0x4200b000, 0x00000007, 0x0201f800, - 0x00020892, 0x4a026203, 0x00000004, 0x4a026406, - 0x00000009, 0x4a026203, 0x00000004, 0x4a026007, - 0x00000101, 0x0401f809, 0x0401f880, 0x8058b040, - 0x040207f3, 0x80000580, 0x1c01f000, 0x82000540, - 0x00000001, 0x0401f7fd, 0x0201f800, 0x0010082a, - 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, 0x0010082a, 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, - 0x0010b315, 0x0401f87f, 0x04000012, 0x0201f800, - 0x00100819, 0x0400000f, 0x492cb805, 0x585c0005, - 0x80000540, 0x02000800, 0x00100615, 0x0401f830, - 0x585c5408, 0x0401f80b, 0x5c00b800, 0x5c03e000, - 0x817ef840, 0x040207e1, 0x5c02f800, 0x1c01f000, - 0x5c00b800, 0x5c03e000, 0x5c02f800, 0x1c01f000, - 0x4803c856, 0x405c6000, 0x802851c0, 0x04000018, - 0x585c0204, 0x82000d00, 0x0000000f, 0x82040c00, - 0x0010110d, 0x50044000, 0x4c600000, 0x4c640000, - 0x4d040000, 0x4020c000, 0x40320800, 0x5984c804, - 0x4c280000, 0x0401f934, 0x5c005000, 0x40604000, - 0x41046000, 0x0201f800, 0x001010eb, 0x040207f6, - 0x5c020800, 0x5c00c800, 0x5c00c000, 0x58c80204, - 0x4800bc08, 0x0201f800, 0x00020087, 0x4a026007, - 0x00000101, 0x497a6009, 0x0401f055, 0x4803c856, - 0x59840003, 0x80026540, 0x04000003, 0x59300000, - 0x48030803, 0x1c01f000, 0x4803c856, 0x59840003, - 0x48026000, 0x49330803, 0x1c01f000, 0x58cc0805, - 0x40180000, 0x80040480, 0x0400100d, 0x82cc0580, - 0x0010b30a, 0x02020800, 0x00100615, 0x58c80205, - 0x80040480, 0x0400101d, 0x82000540, 0x00000001, - 0x1c01f000, 0x80003580, 0x0401f7fe, 0x82cc0580, - 0x0010b30a, 0x02020800, 0x00100615, 0x58c80400, - 0x8c000504, 0x040007f8, 0x58c8040b, 0x8c00051e, - 0x040007f5, 0x8c000500, 0x040207f3, 0x84000540, - 0x4801940b, 0x42000000, 0x0010b637, 0x0201f800, - 0x0010a86e, 0x42001000, 0x00008026, 0x0201f800, - 0x00103857, 0x0401f7e8, 0x58c8040b, 0x8c00051e, - 0x040007e2, 0x8c000502, 0x040207e0, 0x84000542, - 0x4801940b, 0x42000000, 0x0010b636, 0x0201f800, - 0x0010a86e, 0x42001000, 0x00008025, 0x42001800, - 0x00000000, 0x0201f800, 0x00103857, 0x0401f7d3, - 0x4803c856, 0x58080000, 0x42001800, 0x00000007, - 0x58080801, 0x80040480, 0x04020004, 0x400c0000, - 0x80000540, 0x0401f005, 0x04001003, 0x800c0480, - 0x0401f002, 0x80000080, 0x1c01f000, 0x4803c856, - 0x59300008, 0x80000d40, 0x02000800, 0x00100615, - 0x58040005, 0x80000540, 0x02000800, 0x00100615, - 0x59300007, 0x82000500, 0x00000101, 0x82000580, - 0x00000101, 0x02020800, 0x00100615, 0x42001000, - 0x0010b315, 0x58080801, 0x82040400, 0x0010b317, - 0x497a6414, 0x4a026015, 0x0000ffff, 0x45300000, - 0x80040800, 0x82040480, 0x00000008, 0x04001002, - 0x80000d80, 0x48041001, 0x82040400, 0x0010b317, - 0x45780000, 0x1c01f000, 0x4933c857, 0x59300808, - 0x800409c0, 0x02000800, 0x00100615, 0x4d2c0000, - 0x58065805, 0x812e59c0, 0x02020800, 0x0010083a, - 0x49780805, 0x40065800, 0x0201f800, 0x00100843, - 0x5c025800, 0x4d300000, 0x0201f800, 0x000208b4, - 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, 0x00100bde, 0x4807c857, 0x4805980a, - 0x49799801, 0x49799803, 0x49799806, 0x49799807, - 0x49799808, 0x49799805, 0x49799809, 0x0401f8c8, - 0x0400000a, 0x0401f8ea, 0x04000008, 0x48359800, - 0x48359802, 0x48359806, 0x4a019804, 0x00000001, - 0x4a019807, 0x00000005, 0x1c01f000, 0x4807c857, - 0x58cc1007, 0x40040000, 0x80080480, 0x04021020, - 0x4c040000, 0x4c080000, 0x0401f8d9, 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, 0x00100615, 0x82040400, 0x00106150, - 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, - 0x00100615, 0x58040800, 0x48059800, 0x41782000, - 0x0401f7ee, 0x0401f812, 0x50600000, 0x81041c00, - 0x585c0204, 0x4803c857, 0x82000580, 0x0000002c, - 0x02020800, 0x00100615, 0x58040202, 0x800000e0, - 0x80640540, 0x48001802, 0x58040000, 0x48001800, - 0x58040001, 0x48001801, 0x1c01f000, 0x4807c856, - 0x58cc0005, 0x80000040, 0x02001800, 0x00100615, - 0x48019805, 0x58cc1003, 0x82080480, 0x00000005, - 0x02021800, 0x00100615, 0x82080400, 0x00106150, - 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, - 0x00100615, 0x82002400, 0x00000005, 0x0201f800, - 0x00100819, 0x04000012, 0x492d9809, 0x497a5800, - 0x497a5801, 0x0201f800, 0x00100819, 0x0400000c, - 0x58cc0009, 0x48025800, 0x497a5801, 0x492d9809, - 0x82102480, 0x00000005, 0x040217f7, 0x82000540, - 0x00000001, 0x5c025800, 0x1c01f000, 0x58cc0009, - 0x80025d40, 0x040007fc, 0x592c2000, 0x0201f800, - 0x0010083a, 0x40100000, 0x0401f7fa, 0x58cc0009, - 0x48cfc857, 0x80006d40, 0x04000005, 0x50340000, - 0x48019809, 0x49786800, 0x49786801, 0x1c01f000, - 0x4813c857, 0x58cc0009, 0x48002000, 0x48119809, - 0x1c01f000, 0x4807c856, 0x4d2c0000, 0x58cc0009, - 0x80025d40, 0x04000007, 0x592c0000, 0x4c000000, - 0x0201f800, 0x0010083a, 0x5c000000, 0x0401f7f9, - 0x5c025800, 0x1c01f000, 0x4807c856, 0x4d2c0000, - 0x58cc0002, 0x80025d40, 0x04000007, 0x592c0000, - 0x4c000000, 0x0201f800, 0x0010083a, 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, - 0x0010b320, 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, 0x0010110d, 0x50044000, 0x80004d80, - 0x50200000, 0x80307400, 0x58380402, 0x8c244d00, - 0x04020003, 0x48003a00, 0x0401f003, 0x48003c00, - 0x801c3800, 0x80244800, 0x80102040, 0x04000006, - 0x0201f800, 0x001010eb, 0x02000800, 0x00100615, - 0x0401f7f0, 0x1c01f000, 0x4803c856, 0x4d340000, - 0x59300009, 0x80026d40, 0x02000800, 0x00100615, - 0x59340401, 0x80000540, 0x0400000e, 0x59840000, - 0x80000540, 0x0400000b, 0x836c0580, 0x00000003, - 0x04020008, 0x59341c03, 0x42002000, 0x00000004, - 0x42003000, 0x00000004, 0x0201f800, 0x001038c7, - 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, - 0x00100615, 0x81300580, 0x040207fa, 0x58340000, - 0x48007800, 0x497a6000, 0x4a0370e5, 0x00020000, - 0x1c01f000, 0x4803c856, 0x4d300000, 0x4d2c0000, - 0x42000800, 0x000003ff, 0x4a0370e5, 0x00020000, - 0x59b800e5, 0x8c000524, 0x04000005, 0x80040840, - 0x040207fa, 0x0201f800, 0x00100615, 0x4a0370e5, - 0x00030000, 0x40000000, 0x40000000, 0x59b800e5, - 0x8c000524, 0x040207f1, 0x5934000e, 0x80026540, - 0x0400000e, 0x4933c857, 0x59300000, 0x4802680e, - 0x4a026203, 0x00000004, 0x497a6206, 0x497a6009, - 0x4a026007, 0x00000101, 0x59325808, 0x497a5c08, - 0x0401fd82, 0x0401f7f1, 0x4a0370e5, 0x00020000, - 0x5c025800, 0x5c026000, 0x1c01f000, 0x4803c856, - 0x4c000000, 0x0201f800, 0x001059b9, 0x04020011, - 0x0201f800, 0x001043fc, 0x02020800, 0x00100615, - 0x5c000000, 0x48026802, 0x0201f800, 0x00020892, - 0x04000009, 0x49366009, 0x4a026406, 0x00000001, - 0x42027000, 0x00000001, 0x0201f000, 0x000208d8, - 0x5c000000, 0x1c01f000, 0x59300203, 0x82000c80, - 0x0000000e, 0x02021800, 0x00100615, 0x4803c857, - 0x0c01f001, 0x0010623b, 0x0010623b, 0x0010623b, - 0x0010623d, 0x0010629d, 0x0010623b, 0x0010623b, - 0x001062ef, 0x001062f0, 0x0010623b, 0x0010623b, - 0x0010623b, 0x0010623b, 0x0010623b, 0x0201f800, - 0x00100615, 0x493bc857, 0x83380480, 0x00000050, - 0x02021800, 0x00100615, 0x83380480, 0x00000049, - 0x02001800, 0x00100615, 0x0c01f001, 0x00106250, - 0x00106272, 0x0010624e, 0x0010624e, 0x0010624e, - 0x0010624e, 0x00106281, 0x0201f800, 0x00100615, - 0x4d2c0000, 0x59325808, 0x592c0206, 0x48025c06, - 0x4a025a06, 0x00000000, 0x4c5c0000, 0x592cbc0a, - 0x592c0000, 0x48026008, 0x0201f800, 0x00020385, - 0x59300008, 0x80000540, 0x04000008, 0x4a026203, - 0x00000007, 0x42027000, 0x00000043, 0x5c00b800, - 0x5c025800, 0x0401f08a, 0x8c5cbd08, 0x04020006, - 0x4a026203, 0x00000007, 0x497a6206, 0x497a6008, - 0x0401f003, 0x0201f800, 0x000208b4, 0x5c00b800, - 0x5c025800, 0x1c01f000, 0x0201f800, 0x001068c1, - 0x4d2c0000, 0x59325808, 0x0201f800, 0x00108df4, - 0x04000006, 0x4d400000, 0x42028000, 0x00000001, - 0x0401f90e, 0x5c028000, 0x5c025800, 0x0201f000, - 0x000208b4, 0x0201f800, 0x001068c1, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x00101de2, 0x5c027800, - 0x42003000, 0x00000014, 0x0201f800, 0x0010a766, - 0x42000000, 0x0010b663, 0x0201f800, 0x0010a86e, - 0x4d2c0000, 0x59325808, 0x0201f800, 0x00108df4, - 0x04000006, 0x4d400000, 0x42028000, 0x00000029, - 0x0401f8f2, 0x5c028000, 0x5c025800, 0x0201f000, - 0x000208b4, 0x493bc857, 0x497a6206, 0x83380480, - 0x00000054, 0x02021800, 0x00100615, 0x83380480, - 0x00000047, 0x02001800, 0x00100615, 0x0c01f001, - 0x001062ee, 0x001062b7, 0x001062b5, 0x001062b5, - 0x001062b5, 0x001062b5, 0x001062b5, 0x001062b5, - 0x001062b5, 0x001062b5, 0x001062b5, 0x001062b5, - 0x001062bb, 0x0201f800, 0x00100615, 0x59300011, - 0x82000500, 0xffff0000, 0x04020034, 0x59840802, - 0x8c040d04, 0x04000025, 0x59300009, 0x80026d40, - 0x0400001f, 0x4c5c0000, 0x4c600000, 0x497a6206, - 0x5930b808, 0x585c0005, 0x8000c540, 0x02000800, - 0x00100615, 0x0401fe8d, 0x40625800, 0x0201f800, - 0x00020385, 0x4978b805, 0x0401fef5, 0x497a6009, - 0x585c3408, 0x0401fcbe, 0x0400000e, 0x42001000, - 0x0010b315, 0x0401fcf3, 0x0400000a, 0x0201f800, - 0x0010082a, 0x04000007, 0x492cb805, 0x585c5408, - 0x0401fc84, 0x5c00c000, 0x5c00b800, 0x1c01f000, - 0x0401fcaa, 0x0401f7fc, 0x8c040d06, 0x040207fc, - 0x59300009, 0x80026d40, 0x04000006, 0x5934000e, - 0x80000540, 0x02020800, 0x00100615, 0x497a6009, - 0x0401fd0e, 0x0401f7f2, 0x0401f085, 0x4803c856, - 0x4803c856, 0x83380580, 0x00000043, 0x02020800, - 0x00100615, 0x4a026203, 0x00000003, 0x493a6403, - 0x59325808, 0x592c000f, 0x48026011, 0x497a6013, - 0x592c0406, 0x800000c2, 0x800010c4, 0x80081400, - 0x480a6206, 0x0201f800, 0x00100f9c, 0x42000800, - 0x80000060, 0x0401f161, 0x42000000, 0x0010b674, - 0x0201f800, 0x0010a86e, 0x59300203, 0x82000c80, - 0x0000000e, 0x02021800, 0x00100615, 0x4803c857, - 0x82000d80, 0x00000003, 0x04000006, 0x82000d80, - 0x00000004, 0x0400005b, 0x0201f800, 0x00100615, - 0x0201f800, 0x0010698c, 0x59300004, 0x8c00053e, - 0x04020007, 0x0201f800, 0x001068a3, 0x02020800, - 0x00100615, 0x0201f000, 0x00106982, 0x0401f9d3, - 0x0201f800, 0x00106982, 0x59325808, 0x42028000, - 0x00000006, 0x0401f861, 0x0201f000, 0x000208b4, - 0x4803c856, 0x59300203, 0x82000c80, 0x0000000e, - 0x02021800, 0x00100615, 0x82000d80, 0x00000002, - 0x04000009, 0x82000d80, 0x00000003, 0x04000019, - 0x82000d80, 0x00000004, 0x04000036, 0x0201f800, - 0x00100615, 0x4933c857, 0x4d2c0000, 0x59325808, - 0x812e59c0, 0x02000800, 0x00100615, 0x592c1a08, - 0x8c0c1d0e, 0x02000800, 0x00100615, 0x4d400000, - 0x42028000, 0x00000001, 0x0401f840, 0x0201f800, - 0x00107698, 0x5c028000, 0x5c025800, 0x1c01f000, - 0x4933c857, 0x0201f800, 0x0010698c, 0x4df00000, - 0x59300004, 0x8c00053e, 0x04020006, 0x0201f800, - 0x00106cb4, 0x02020800, 0x00100615, 0x0401f010, - 0x0201f800, 0x00108a8a, 0x04020004, 0x0201f800, - 0x00106bb2, 0x0402000a, 0x0401f994, 0x02020800, - 0x00100615, 0x5c03e000, 0x02000800, 0x00106982, - 0x82000540, 0x00000001, 0x1c01f000, 0x5c03e000, - 0x02000800, 0x00106982, 0x80000580, 0x1c01f000, - 0x4933c857, 0x0201f800, 0x00100ee4, 0x4933c857, - 0x4c5c0000, 0x4d340000, 0x497a6206, 0x5930b808, - 0x59300009, 0x80026d40, 0x04020e49, 0x42001000, - 0x0010b315, 0x0401fc4b, 0x04000009, 0x58c80204, - 0x4800bc08, 0x41785000, 0x0201f800, 0x00105f60, - 0x5c026800, 0x5c00b800, 0x1c01f000, 0x4978bc08, - 0x0401fc02, 0x0401f7fb, 0x4803c856, 0x0201f800, - 0x00108df4, 0x0400000f, 0x592c0000, 0x80000d40, - 0x04000009, 0x497a5800, 0x49425a06, 0x4c040000, - 0x0201f800, 0x00020381, 0x5c000800, 0x40065800, - 0x0401f7f6, 0x49425a06, 0x0201f800, 0x00020381, - 0x1c01f000, 0x4933c857, 0x59300c06, 0x82040580, - 0x0000000e, 0x04000004, 0x82040580, 0x00000009, - 0x04020004, 0x0401ffe5, 0x497a6008, 0x80000580, - 0x1c01f000, 0x592e6009, 0x83300480, 0x0010cfc0, - 0x04001016, 0x41580000, 0x81300480, 0x04021013, - 0x40040000, 0x59300c06, 0x80040580, 0x04020012, - 0x59300a03, 0x82040580, 0x00000007, 0x02020800, - 0x00100615, 0x59300008, 0x80000540, 0x02020800, - 0x00100615, 0x0201f800, 0x000208b4, 0x42000000, - 0x00000000, 0x0401f009, 0x42000000, 0x00000008, - 0x0401f006, 0x82040580, 0x00000007, 0x040207fb, - 0x42000000, 0x00000005, 0x592c0a06, 0x48065c06, - 0x48025a06, 0x0201f000, 0x00020381, 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, 0x42007000, - 0x0010b33f, 0x4a007000, 0x00000005, 0x4a007401, - 0x00000000, 0x4a007202, 0x00000840, 0x4a0378e8, - 0x00000000, 0x4a03c821, 0x00000010, 0x4a03c823, - 0x00000004, 0x0401f81d, 0x4a0378e9, 0x00003a0d, - 0x4a0378e8, 0x00000001, 0x42000800, 0x00000005, - 0x4203a000, 0x00007600, 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, - 0x4a03781a, 0x0010b5d2, 0x4a03781b, 0x0010110d, - 0x4a03781c, 0x0010111d, 0x4a031800, 0x00000000, - 0x4a031801, 0x0010b342, 0x4a031802, 0x0010b349, - 0x42000800, 0x0010b5d5, 0x417a3000, 0x811b20c8, - 0x83932400, 0x0000bf32, 0x48072000, 0x4a032001, - 0x00000000, 0x83180400, 0x00106e41, 0x50000000, - 0x48032002, 0x82040c00, 0x00000003, 0x811a3000, - 0x83180480, 0x00000005, 0x040017f1, 0x5c023000, - 0x5c032000, 0x1c01f000, 0x48066004, 0x497a6000, - 0x497a6001, 0x59bc00ea, 0x8c000516, 0x040207fe, - 0x83300400, 0xa0000000, 0x480378e1, 0x1c01f000, - 0x4933c857, 0x59300804, 0x82040d00, 0x00000100, - 0x82040d40, 0x80000040, 0x48066004, 0x497a6000, - 0x59bc00ea, 0x8c000516, 0x040207fe, 0x83300400, - 0x60000000, 0x480378e1, 0x1c01f000, 0x0201f800, - 0x0010698c, 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, 0x0401f92d, 0x4c0c0000, 0x4c140000, - 0x0401fb59, 0x5c002800, 0x5c001800, 0x0401f005, - 0x41301800, 0x8060c1c0, 0x04020002, 0x400cc000, - 0x805cb9c0, 0x04000003, 0x405e6000, 0x0401f7e3, - 0x5c026000, 0x813261c0, 0x04000006, 0x8060c1c0, - 0x04000002, 0x40602800, 0x4178c000, 0x0401f7d8, - 0x417a3000, 0x0201f800, 0x00106e2f, 0x59926004, - 0x813261c0, 0x04000023, 0x59326809, 0x4130c000, - 0x59300001, 0x8000bd40, 0x04000016, 0x40026000, - 0x40602800, 0x5930b801, 0x59300406, 0x82000d80, - 0x00000006, 0x0400000e, 0x8d3e7d06, 0x04000007, - 0x82000580, 0x00000003, 0x04020004, 0x59340200, - 0x8c00050e, 0x04020006, 0x0401f8da, 0x4c140000, - 0x0401fb29, 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, - 0x00106982, 0x1c01f000, 0x4933c857, 0x0201f800, - 0x0010698c, 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, 0x0401f8bb, - 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, 0x0401f87f, 0x5c032000, 0x5c023000, - 0x5c026800, 0x5c03e000, 0x02000800, 0x00106982, - 0x80000580, 0x1c01f000, 0x5c032000, 0x5c023000, - 0x5c026800, 0x5c03e000, 0x02000800, 0x00106982, - 0x82000540, 0x00000001, 0x1c01f000, 0x0201f800, - 0x0010698c, 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, 0x0401fb58, - 0x0402000e, 0x59300406, 0x82000580, 0x00000006, - 0x04020003, 0x8d3e7d18, 0x04000008, 0x0401f867, - 0x4c0c0000, 0x4c140000, 0x0401fa93, 0x5c002800, - 0x5c001800, 0x0401f002, 0x41301800, 0x405e6000, - 0x813261c0, 0x040207eb, 0x0401f02d, 0x417a3000, - 0x0201f800, 0x00106e2f, 0x59926004, 0x813261c0, - 0x04000005, 0x59326809, 0x59340403, 0x81440580, - 0x04000006, 0x811a3000, 0x83180480, 0x00000005, - 0x040017f4, 0x0401f01e, 0x4130c000, 0x59300001, - 0x8000bd40, 0x04000012, 0x40026000, 0x40602800, - 0x5930b801, 0x8d3e7d00, 0x04000003, 0x0401fb2c, - 0x0402000a, 0x59300406, 0x82000580, 0x00000006, - 0x04000006, 0x0401f81b, 0x4c140000, 0x0401fa6a, - 0x5c002800, 0x0401f002, 0x41302800, 0x405e6000, - 0x813261c0, 0x040207ef, 0x8060c1c0, 0x04000004, - 0x40626000, 0x4178c000, 0x0401f7eb, 0x5c022800, - 0x5c034800, 0x5c03a000, 0x5c032000, 0x5c00c000, - 0x5c00b800, 0x5c025800, 0x5c023000, 0x5c026800, - 0x5c026000, 0x5c03e000, 0x04000bd4, 0x1c01f000, - 0x0401fbb9, 0x59900004, 0x81300580, 0x04020018, - 0x4c140000, 0x0201f800, 0x00106b13, 0x0401fba9, - 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, 0x0401fb97, 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, 0x0401fb73, 0x4df00000, 0x0401f83a, - 0x040208c7, 0x0402094a, 0x04020005, 0x5c03e000, - 0x04000b62, 0x80000580, 0x1c01f000, 0x5c03e000, - 0x04000b5e, 0x82000540, 0x00000001, 0x1c01f000, - 0x4d2c0000, 0x4d340000, 0x4d300000, 0x41783000, - 0x598e6009, 0x813261c0, 0x04000023, 0x59300406, - 0x82000580, 0x00000006, 0x04020004, 0x8d3e7d18, - 0x0402000c, 0x0401f019, 0x82040580, 0x00000005, - 0x04020008, 0x8d3e7d18, 0x04000003, 0x8d3e7d16, - 0x04000004, 0x59300420, 0x8c000500, 0x0402000f, - 0x0401fa49, 0x59300000, 0x4c000000, 0x8d3e7d06, - 0x04000004, 0x0201f800, 0x0010909d, 0x04000005, - 0x0401f869, 0x4c180000, 0x0401f9b7, 0x5c003000, - 0x5c026000, 0x0401f7e0, 0x41303000, 0x59326000, - 0x0401f7dd, 0x5c026000, 0x5c026800, 0x5c025800, - 0x1c01f000, 0x4933c857, 0x4c5c0000, 0x813261c0, - 0x02000800, 0x00100615, 0x41300000, 0x598cb809, - 0x41783000, 0x805cb9c0, 0x04000013, 0x805c0d80, - 0x04000004, 0x405c3000, 0x5818b800, 0x0401f7fa, - 0x0401f84d, 0x598c000d, 0x81300580, 0x02000800, - 0x00106e10, 0x59300403, 0x82000580, 0x00000042, - 0x04020002, 0x497a6007, 0x80000580, 0x5c00b800, - 0x1c01f000, 0x82000540, 0x00000001, 0x5c00b800, - 0x1c01f000, 0x0401fb17, 0x4df00000, 0x4d2c0000, - 0x4d340000, 0x4d300000, 0x41783000, 0x598e6009, - 0x813261c0, 0x0400002e, 0x59300c06, 0x82040580, - 0x00000006, 0x04020004, 0x8d3e7d18, 0x0402000c, - 0x0401f024, 0x82040580, 0x00000005, 0x04020008, - 0x8d3e7d18, 0x04000003, 0x8d3e7d16, 0x04000004, - 0x59300420, 0x8c000500, 0x0402001a, 0x59326809, - 0x59340403, 0x81440580, 0x04020016, 0x8d3e7d00, - 0x04000006, 0x82040580, 0x00000003, 0x04020011, - 0x0401fa23, 0x0402000f, 0x0401f9ef, 0x59300000, - 0x4c000000, 0x8d3e7d06, 0x04000004, 0x0201f800, - 0x0010909d, 0x04000005, 0x0401f80f, 0x4c180000, - 0x0401f95d, 0x5c003000, 0x5c026000, 0x0401f7d5, - 0x41303000, 0x59326000, 0x0401f7d2, 0x5c026000, - 0x5c026800, 0x5c025800, 0x5c03e000, 0x04000ad3, - 0x1c01f000, 0x59300800, 0x497a6000, 0x0401fab6, - 0x801831c0, 0x04020009, 0x598c0008, 0x81300580, - 0x04020004, 0x48031808, 0x48031809, 0x0401f008, - 0x48071809, 0x0401f006, 0x48043000, 0x598c0008, - 0x81300580, 0x04020002, 0x481b1808, 0x0401f2b8, - 0x4d2c0000, 0x4d300000, 0x4d340000, 0x41783000, - 0x598e600b, 0x813261c0, 0x04000013, 0x8d3e7d06, - 0x04000005, 0x59326809, 0x59340200, 0x8c00050e, - 0x0402000a, 0x0401f9b8, 0x59300000, 0x4c000000, - 0x0401f853, 0x4c180000, 0x0401f92b, 0x5c003000, - 0x5c026000, 0x0401f7f0, 0x41303000, 0x59326000, - 0x0401f7ed, 0x0201f800, 0x001045c7, 0x5c026800, - 0x5c026000, 0x5c025800, 0x1c01f000, 0x4933c857, - 0x4c5c0000, 0x813261c0, 0x02000800, 0x00100615, - 0x41300000, 0x598cb80b, 0x41783000, 0x805cb9c0, - 0x0400000f, 0x805c0d80, 0x04000004, 0x405c3000, - 0x5818b800, 0x0401f7fa, 0x0401f835, 0x598c000d, - 0x81300580, 0x02000800, 0x00106e10, 0x497a6007, - 0x80000580, 0x5c00b800, 0x1c01f000, 0x82000540, - 0x00000001, 0x5c00b800, 0x1c01f000, 0x0401fa8d, - 0x4df00000, 0x4d340000, 0x4d300000, 0x4d2c0000, - 0x0201f800, 0x00020267, 0x02020800, 0x00100615, - 0x41783000, 0x598e600b, 0x813261c0, 0x04000014, - 0x59300009, 0x81340580, 0x0402000e, 0x8d3e7d00, - 0x04000003, 0x0401f9aa, 0x0402000a, 0x0401f976, - 0x59300000, 0x4c000000, 0x0401f811, 0x4c180000, - 0x0401f8e9, 0x5c003000, 0x5c026000, 0x0401f7ef, - 0x41303000, 0x59326000, 0x0401f7ec, 0x0201f800, - 0x001045ea, 0x5c025800, 0x5c026000, 0x5c026800, - 0x5c03e000, 0x04000a5d, 0x1c01f000, 0x59300800, - 0x497a6000, 0x0401fa40, 0x801831c0, 0x04020009, - 0x598c000a, 0x81300580, 0x04020004, 0x4803180a, - 0x4803180b, 0x0401f008, 0x4807180b, 0x0401f006, - 0x48043000, 0x598c000a, 0x81300580, 0x04020002, - 0x481b180a, 0x0401f242, 0x0401fa52, 0x4df00000, - 0x4d300000, 0x4c5c0000, 0x4178b800, 0x8d3e7d18, - 0x04000004, 0x8d3e7d16, 0x04020002, 0x805cb800, - 0x598e6005, 0x813261c0, 0x0400001a, 0x59300000, - 0x4c000000, 0x805cb9c0, 0x0402000b, 0x59300c06, - 0x82040580, 0x00000011, 0x04000010, 0x82040580, - 0x00000004, 0x04020004, 0x59300420, 0x8c000500, - 0x0402000a, 0x0201f800, 0x00108f05, 0x02000800, - 0x00107da6, 0x0201f800, 0x001090ec, 0x0201f800, - 0x000208b4, 0x0401fa1e, 0x5c026000, 0x0401f7e6, - 0x497b1805, 0x497b1804, 0x5c00b800, 0x5c026000, - 0x5c03e000, 0x04000a1d, 0x1c01f000, 0x4933c857, - 0x4c5c0000, 0x4c600000, 0x813261c0, 0x02000800, - 0x00100615, 0x41300000, 0x598cb805, 0x405cc000, - 0x805cb9c0, 0x04000025, 0x805c0d80, 0x04000004, - 0x405cc000, 0x5860b800, 0x0401f7fa, 0x598c000d, - 0x81300580, 0x02000800, 0x00106e10, 0x0401f9ee, - 0x598c0005, 0x805c0580, 0x04020009, 0x585c0000, - 0x48031805, 0x4978b800, 0x598c0004, 0x805c0580, - 0x0402000d, 0x497b1804, 0x0401f00b, 0x598c0004, - 0x805c0580, 0x04020005, 0x48631804, 0x4978b800, - 0x4978c000, 0x0401f004, 0x585c0000, 0x4800c000, - 0x4978b800, 0x0401f9ea, 0x80000580, 0x5c00c000, - 0x5c00b800, 0x1c01f000, 0x82000540, 0x00000001, - 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x4933c857, - 0x0401f9f0, 0x4df00000, 0x4d2c0000, 0x4d340000, - 0x4d300000, 0x4c5c0000, 0x4178b800, 0x8d3e7d18, - 0x04000004, 0x8d3e7d16, 0x04020002, 0x805cb800, - 0x41783000, 0x598e6005, 0x813261c0, 0x04000029, - 0x59326809, 0x813669c0, 0x04000023, 0x59340403, - 0x81440580, 0x04020020, 0x805cb9c0, 0x0402000b, - 0x59300c06, 0x82040580, 0x00000011, 0x0400001a, - 0x82040580, 0x00000004, 0x04020004, 0x59300420, - 0x8c000500, 0x04020014, 0x0201f800, 0x00108df4, - 0x04000008, 0x0201f800, 0x00109360, 0x04020005, - 0x59300403, 0x82000580, 0x00000043, 0x0400000a, - 0x0401f8c1, 0x59300000, 0x4c000000, 0x0401f810, - 0x4c180000, 0x0401f834, 0x5c003000, 0x5c026000, - 0x0401f7da, 0x41303000, 0x59326000, 0x0401f7d7, - 0x5c00b800, 0x5c026000, 0x5c026800, 0x5c025800, - 0x5c03e000, 0x040009a9, 0x1c01f000, 0x59300800, - 0x497a6000, 0x0401f98c, 0x801831c0, 0x04020009, - 0x598c0004, 0x81300580, 0x04020004, 0x48031804, - 0x48031805, 0x0401f008, 0x48071805, 0x0401f006, - 0x48043000, 0x598c0004, 0x81300580, 0x04020002, - 0x481b1804, 0x0401f18e, 0x4943c857, 0x0401f99d, - 0x4df00000, 0x0401fe37, 0x0401fed2, 0x5c03e000, - 0x0400098e, 0x1c01f000, 0x4947c857, 0x0401f995, - 0x4df00000, 0x4d3c0000, 0x853e7d00, 0x0401fe7a, - 0x0401ff03, 0x5c027800, 0x5c03e000, 0x04000983, - 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, - 0x4d340000, 0x4d2c0000, 0x59326809, 0x59325808, - 0x59300406, 0x82000c80, 0x00000012, 0x02021800, - 0x00100615, 0x4933c857, 0x4943c857, 0x493fc857, - 0x4803c857, 0x0c01f804, 0x5c025800, 0x5c026800, - 0x1c01f000, 0x00106827, 0x00106829, 0x00106833, - 0x0010684d, 0x00106829, 0x0010683d, 0x00106865, - 0x00106827, 0x00106827, 0x00106878, 0x0010686f, - 0x00106827, 0x00106827, 0x00106827, 0x00106827, - 0x00106827, 0x0010687e, 0x0010687e, 0x0201f800, - 0x00100615, 0x0201f800, 0x00108ef1, 0x02000800, - 0x00101e1b, 0x0201f800, 0x001090ec, 0x0201f800, - 0x00107da6, 0x0201f000, 0x00107698, 0x812e59c0, - 0x02020800, 0x00100615, 0x5930021d, 0x82000580, - 0x00000003, 0x02000800, 0x00108ee7, 0x0201f000, - 0x00107698, 0x0201f800, 0x00108df4, 0x02000000, - 0x00107698, 0x592c1204, 0x82081500, 0x000000ff, - 0x82080580, 0x00000055, 0x02020800, 0x00100615, - 0x49425a06, 0x0201f800, 0x00020381, 0x0201f000, - 0x00107698, 0x59300004, 0x8400055c, 0x48026004, - 0x59300007, 0x8c000500, 0x02020800, 0x00100ee4, - 0x0201f800, 0x00108df4, 0x0400000d, 0x4a025a04, - 0x00000103, 0x49425a06, 0x497a5c09, 0x0201f800, - 0x00108f7d, 0x0201f800, 0x0010a4ae, 0x0201f800, - 0x00020381, 0x0201f800, 0x00108ee7, 0x0201f000, - 0x00107698, 0x59300007, 0x8c000500, 0x02020800, - 0x00100ee4, 0x0201f800, 0x00108df4, 0x02020800, - 0x0010a201, 0x0201f000, 0x00107698, 0x0201f800, - 0x00108df4, 0x04000005, 0x49425a06, 0x497a5c09, - 0x0201f800, 0x00020381, 0x0201f000, 0x00107698, - 0x0201f800, 0x00108df4, 0x02020800, 0x0010639d, - 0x0201f000, 0x00107698, 0x0201f800, 0x00108df4, - 0x04000004, 0x49425a06, 0x0201f800, 0x00020381, - 0x59325817, 0x0201f800, 0x00100843, 0x0201f000, - 0x00107698, 0x598c000d, 0x81300580, 0x04000003, - 0x497a6007, 0x1c01f000, 0x59c40004, 0x82000500, - 0x0000000c, 0x04000005, 0x4a038804, 0x0000000c, - 0x497b2807, 0x0401f00a, 0x0401fadb, 0x59300403, - 0x82000d80, 0x00000040, 0x04000004, 0x82000580, - 0x00000042, 0x04020002, 0x497a6007, 0x0201f800, - 0x00106e10, 0x80000580, 0x1c01f000, 0x59300804, - 0x8c040d20, 0x04020004, 0x82000540, 0x00000001, - 0x1c01f000, 0x4933c857, 0x4d380000, 0x59300804, - 0x84040d20, 0x48066004, 0x42027000, 0x00000049, - 0x59300203, 0x82000580, 0x00000003, 0x04000003, - 0x42027000, 0x00000013, 0x0201f800, 0x000208d8, - 0x80000580, 0x5c027000, 0x1c01f000, 0x59300017, - 0x81480580, 0x04020003, 0x59300018, 0x814c0580, - 0x1c01f000, 0x4d2c0000, 0x4d300000, 0x0401f8c9, - 0x4df00000, 0x0201f800, 0x00105d9b, 0x59900001, - 0x82000500, 0x00000003, 0x0c01f001, 0x001068f1, - 0x001068d1, 0x001068cf, 0x001068cf, 0x0201f800, - 0x00100615, 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, 0x00100615, - 0x4978080c, 0x5c03e000, 0x04000890, 0x5c026000, - 0x5c025800, 0x1c01f000, 0x4d300000, 0x497b2807, - 0x0401f894, 0x4df00000, 0x598c0000, 0x82000500, - 0x00000007, 0x4803c857, 0x0c01f001, 0x00106926, - 0x00106909, 0x00106912, 0x00106916, 0x00106921, - 0x00106926, 0x00106907, 0x00106907, 0x0201f800, - 0x00100615, 0x598c000d, 0x80026540, 0x04000004, - 0x0401f81e, 0x02020800, 0x00100615, 0x0201f800, - 0x00106e10, 0x0401f015, 0x0401f827, 0x0201f800, - 0x00106e10, 0x0401f011, 0x598c000d, 0x80026540, - 0x0400000e, 0x0401f838, 0x04000004, 0x0401f80f, - 0x04000002, 0x0401f81c, 0x0201f800, 0x00106e10, - 0x0401f006, 0x0401f830, 0x02020800, 0x00100615, - 0x0201f800, 0x00106e10, 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, 0x00100615, 0x1c01f000, 0x59bc00ea, - 0x82000500, 0x00000007, 0x82000580, 0x00000001, - 0x02020800, 0x00100615, 0x59bc00ea, 0x8c000516, - 0x040207fe, 0x480778e1, 0x1c01f000, 0x59bc00ea, - 0x8c000516, 0x040207fe, 0x480778e1, 0x59bc00ea, - 0x8c000516, 0x040207fe, 0x480b78e1, 0x1c01f000, - 0x4a0378e4, 0x00002000, 0x59a8006f, 0x82000500, - 0x0000000c, 0x04020008, 0x42007000, 0x0010b33f, - 0x58380401, 0x8c000506, 0x04020003, 0x4a0378e4, - 0x00080000, 0x1c01f000, 0x82000d00, 0x80000018, - 0x02020800, 0x0010060d, 0x0201f800, 0x00100615, - 0x001069dc, 0x00106a81, 0x00106a9b, 0x001069dc, - 0x001069de, 0x001069ff, 0x00106a1e, 0x00106a53, - 0x001069dc, 0x00106a7f, 0x001069dc, 0x001069dc, - 0x001069dc, 0x001069dc, 0x001069dc, 0x001069dc, - 0x0201f800, 0x00100615, 0x4d300000, 0x4d900000, - 0x4dd00000, 0x4da40000, 0x4d140000, 0x0201f800, - 0x00106e2f, 0x59bc00ea, 0x8c000510, 0x040007fe, - 0x59be60e0, 0x59300004, 0x8c000520, 0x04000011, - 0x82000500, 0xfffefeff, 0x48026004, 0x4a026203, - 0x00000003, 0x0401ff9b, 0x0201f800, 0x0010101e, - 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, - 0x5c026000, 0x4a0378e4, 0x00000008, 0x0401f787, - 0x84000510, 0x48026004, 0x0401f7f6, 0x4d300000, - 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, - 0x0201f800, 0x00106e2f, 0x59bc00ea, 0x8c000510, - 0x040007fe, 0x59be60e0, 0x59300004, 0x8c000520, - 0x0400000f, 0x82000500, 0xfffefeff, 0x48026004, - 0x0401ff7c, 0x0201f800, 0x0010105c, 0x5c022800, - 0x5c034800, 0x5c03a000, 0x5c032000, 0x5c026000, - 0x4a0378e4, 0x00000008, 0x0401f768, 0x84000510, - 0x48026004, 0x0401f7f6, 0x4d300000, 0x4d2c0000, - 0x4d340000, 0x4da40000, 0x4cd00000, 0x59bc00ea, - 0x8c000510, 0x040007fe, 0x59be60e0, 0x813261c0, - 0x02000800, 0x00100615, 0x59300004, 0x8c000520, - 0x0400001e, 0x82000500, 0xfffefeff, 0x48026004, - 0x59326809, 0x42034800, 0x0010b342, 0x04011000, - 0x4a03c840, 0x0010b349, 0x4a03c842, 0x00000012, - 0x04011000, 0x4a03c840, 0x0010b35b, 0x4a03c842, - 0x000000ff, 0x04011000, 0x4a03c840, 0x0010b45a, - 0x4a03c842, 0x000000ff, 0x0201f800, 0x00106e46, - 0x5c01a000, 0x5c034800, 0x5c026800, 0x5c025800, - 0x5c026000, 0x1c01f000, 0x84000510, 0x48026004, - 0x5c01a000, 0x5c034800, 0x5c026800, 0x5c025800, - 0x5c026000, 0x1c01f000, 0x1c01f000, 0x4d300000, - 0x4d2c0000, 0x4d340000, 0x4cd00000, 0x4d900000, - 0x4dd00000, 0x4da40000, 0x4d140000, 0x0401fbd4, - 0x59bc00ea, 0x8c000510, 0x040007fe, 0x59be60e0, - 0x813261c0, 0x02000800, 0x00100615, 0x59300004, - 0x8c000520, 0x0400000f, 0x82000500, 0xfffefeff, - 0x48026004, 0x0201f800, 0x001075b9, 0x5c022800, - 0x5c034800, 0x5c03a000, 0x5c032000, 0x5c01a000, - 0x5c026800, 0x5c025800, 0x5c026000, 0x1c01f000, - 0x84000510, 0x48026004, 0x5c022800, 0x5c034800, - 0x5c03a000, 0x5c032000, 0x5c01a000, 0x5c026800, - 0x5c025800, 0x5c026000, 0x1c01f000, 0x0201f800, - 0x00100615, 0x4d300000, 0x4d380000, 0x42000000, - 0x0010b6c3, 0x0201f800, 0x0010a86e, 0x0401ff05, - 0x598e600d, 0x59c40004, 0x8c000506, 0x04000004, - 0x0401f8e5, 0x4a038804, 0x00000008, 0x813261c0, - 0x04000006, 0x0401fb98, 0x42027000, 0x00000014, - 0x0201f800, 0x000208d8, 0x4a0378e4, 0x00000002, - 0x5c027000, 0x5c026000, 0x0401f6e8, 0x4d180000, - 0x4d300000, 0x4d380000, 0x4d900000, 0x4dd00000, - 0x4da40000, 0x4d140000, 0x0401feea, 0x417a3000, - 0x59c40804, 0x83180400, 0x00106df6, 0x50000000, - 0x80040500, 0x0400001b, 0x42000000, 0x0010b6c4, - 0x0201f800, 0x0010a86e, 0x0401fb81, 0x59926004, - 0x0401f863, 0x83180400, 0x00106df6, 0x50000000, - 0x48038804, 0x813261c0, 0x0400000a, 0x59300004, - 0x8c00050c, 0x04020003, 0x4a026203, 0x00000003, - 0x42027000, 0x0000004a, 0x0201f800, 0x000208d8, - 0x59c40004, 0x82000500, 0x00f80000, 0x04000005, - 0x811a3000, 0x83180480, 0x00000005, 0x040017dd, - 0x4a0378e4, 0x00000008, 0x5c022800, 0x5c034800, - 0x5c03a000, 0x5c032000, 0x5c027000, 0x5c026000, - 0x5c023000, 0x0401f6b1, 0x4d2c0000, 0x4d340000, - 0x59326809, 0x598c0800, 0x82040580, 0x00000004, - 0x04020006, 0x838c1400, 0x00000005, 0x838c1c00, - 0x00000004, 0x0401f010, 0x82040580, 0x00000001, - 0x04020006, 0x838c1400, 0x00000009, 0x838c1c00, - 0x00000008, 0x0401f008, 0x82040580, 0x00000002, - 0x04020028, 0x838c1400, 0x0000000b, 0x838c1c00, - 0x0000000a, 0x41306800, 0x58340000, 0x80007d40, - 0x04000020, 0x583c0009, 0x81340580, 0x04020006, - 0x403c6800, 0x583c0000, 0x80007d40, 0x040207fa, - 0x0401f018, 0x4933c857, 0x483fc857, 0x583c0000, - 0x48006800, 0x49307800, 0x443c1000, 0x500c0000, - 0x803c0580, 0x04020002, 0x44341800, 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, 0x0401fac2, 0x04020007, - 0x0401fac6, 0x04000022, 0x48038804, 0x0201f800, - 0x001010ca, 0x0401f042, 0x4a038803, 0x00000008, - 0x59c40003, 0x82000500, 0x00000003, 0x040007fd, - 0x8c000502, 0x04020007, 0x0401fab8, 0x04000014, - 0x48038804, 0x0201f800, 0x001010ca, 0x0401f034, - 0x59c80040, 0x8400056a, 0x48039040, 0x59c80040, - 0x8c00052a, 0x040207fe, 0x59c40005, 0x82000500, - 0xc0000000, 0x04000006, 0x59c400a3, 0x84000540, - 0x480388a3, 0x4a038805, 0xc0000000, 0x0201f800, - 0x0010106b, 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, 0x001010b8, 0x83180400, - 0x00106df6, 0x50000000, 0x48038804, 0x80000580, - 0x4df00000, 0x0201f800, 0x00105d9b, 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, 0x5c000000, 0x4c000000, - 0x4803c857, 0x491bc857, 0x4933c857, 0x4d900000, - 0x4dd00000, 0x4da40000, 0x4d140000, 0x0401fdd1, - 0x4df00000, 0x0401fa72, 0x59900004, 0x800001c0, - 0x04000011, 0x81300580, 0x0402000f, 0x59300004, - 0x84000520, 0x48026004, 0x0401ff4d, 0x04020009, - 0x5c03e000, 0x04000db9, 0x80000580, 0x5c022800, - 0x5c034800, 0x5c03a000, 0x5c032000, 0x1c01f000, - 0x0401fcf1, 0x42027000, 0x00000049, 0x59300004, - 0x84000520, 0x48026004, 0x8c00050c, 0x02020800, - 0x000208d8, 0x5c03e000, 0x04000da8, 0x82000540, - 0x00000001, 0x5c022800, 0x5c034800, 0x5c03a000, - 0x5c032000, 0x1c01f000, 0x4933c857, 0x0401fda9, - 0x4df00000, 0x598c000d, 0x80026540, 0x04000012, - 0x59300004, 0x84000520, 0x48026004, 0x0401ff86, - 0x04000017, 0x0401fd09, 0x42027000, 0x00000013, - 0x59300004, 0x8c00050c, 0x02020800, 0x000208d8, - 0x5c03e000, 0x04000d8d, 0x82000540, 0x00000001, - 0x1c01f000, 0x836c1580, 0x00000001, 0x040007f9, - 0x836c1580, 0x00000004, 0x040007f6, 0x42001000, - 0x00103f62, 0x0201f800, 0x00105cc9, 0x5c03e000, - 0x04000d7e, 0x80000580, 0x1c01f000, 0x4d300000, - 0x4d180000, 0x4d3c0000, 0x0401fd82, 0x4df00000, - 0x4a0378e4, 0x0000000f, 0x0401fa02, 0x417a3000, - 0x59926004, 0x813261c0, 0x04000010, 0x417a7800, - 0x0201f800, 0x00104728, 0x0400000a, 0x59300c06, - 0x82040580, 0x00000003, 0x04000004, 0x82040580, - 0x00000006, 0x04020003, 0x42027800, 0x00000002, - 0x0201f800, 0x00108997, 0x811a3000, 0x83180480, - 0x00000005, 0x040017eb, 0x42000800, 0x00000040, - 0x0201f800, 0x00101395, 0x4a0378e4, 0x0000000a, - 0x5c03e000, 0x04000d55, 0x5c027800, 0x5c023000, - 0x5c026000, 0x1c01f000, 0x4803c856, 0x4d300000, - 0x0401fd58, 0x4df00000, 0x59c80840, 0x82040540, - 0x00000010, 0x48039040, 0x59c41008, 0x82080500, - 0xffffff7f, 0x48038808, 0x4c040000, 0x4c080000, - 0x42001000, 0x00000003, 0x0401f9c5, 0x598e600d, - 0x813261c0, 0x04020f9d, 0x040009ca, 0x497b2807, - 0x0401f80a, 0x5c001000, 0x5c000800, 0x480b8808, - 0x84040d74, 0x48079040, 0x5c03e000, 0x04000d33, - 0x5c026000, 0x1c01f000, 0x4d380000, 0x4d180000, - 0x4d300000, 0x4d900000, 0x4dd00000, 0x4da40000, - 0x4d140000, 0x59c41004, 0x480bc857, 0x82080500, - 0x00003ff0, 0x04000025, 0x417a3000, 0x4c080000, - 0x0201f800, 0x00105d9b, 0x5c001000, 0x82080500, - 0x00000210, 0x04020004, 0x811a3000, 0x80081102, - 0x0401f7f7, 0x0401f9c6, 0x59926004, 0x4933c857, - 0x813261c0, 0x04020005, 0x59c400a3, 0x8c00051a, - 0x02000800, 0x00100615, 0x0401fea1, 0x04000009, - 0x0401fc4d, 0x42027000, 0x00000049, 0x59300004, - 0x8c00050c, 0x02020800, 0x000208d8, 0x0401f007, - 0x42027000, 0x0000004a, 0x4a026203, 0x00000003, - 0x0201f800, 0x000208d8, 0x5c022800, 0x5c034800, - 0x5c03a000, 0x5c032000, 0x5c026000, 0x5c023000, - 0x5c027000, 0x1c01f000, 0x4d300000, 0x4d180000, - 0x4d900000, 0x0401fcff, 0x42001000, 0x00000000, - 0x598c0000, 0x82000580, 0x00000005, 0x04000974, - 0x417a3000, 0x811b20c8, 0x83932400, 0x0000bf32, - 0x59900001, 0x82000580, 0x00000001, 0x0402000d, - 0x42000800, 0x000007d0, 0x59926004, 0x59300011, - 0x82000500, 0xfff00000, 0x80000540, 0x04000003, - 0x42000800, 0x00001b58, 0x0201f800, 0x00105d8d, - 0x811a3000, 0x83180480, 0x00000005, 0x040017ea, - 0x59c81040, 0x84081534, 0x480b9040, 0x0401fcd3, - 0x5c032000, 0x5c023000, 0x5c026000, 0x1c01f000, - 0x4933c857, 0x4d900000, 0x4dd00000, 0x4da40000, - 0x4d140000, 0x4d380000, 0x0401fcd2, 0x4df00000, - 0x59300004, 0x8c00053e, 0x04020007, 0x8c000520, - 0x04000026, 0x0201f800, 0x001068a3, 0x04000023, - 0x0401f02b, 0x598c000d, 0x81300580, 0x04000012, - 0x0201f800, 0x00108a8a, 0x04020025, 0x0401f91b, - 0x04000023, 0x48038804, 0x0401f961, 0x0201f800, - 0x001010ca, 0x0201f800, 0x001068c1, 0x42027000, - 0x00000049, 0x59300004, 0x8c00050c, 0x0402000d, - 0x0401f00e, 0x59c40004, 0x8c000504, 0x04000014, - 0x4a038804, 0x00000004, 0x0401fc18, 0x42027000, - 0x00000013, 0x59300004, 0x8c00050c, 0x04000003, - 0x0201f800, 0x000208d8, 0x5c03e000, 0x04000c9b, - 0x5c027000, 0x5c022800, 0x5c034800, 0x5c03a000, - 0x5c032000, 0x80000580, 0x1c01f000, 0x5c03e000, - 0x04000c92, 0x5c027000, 0x5c022800, 0x5c034800, - 0x5c03a000, 0x5c032000, 0x82000540, 0x00000001, - 0x1c01f000, 0x497b2807, 0x0401fc92, 0x59c400af, - 0x800001c0, 0x04020004, 0x0401fc84, 0x0201f000, - 0x00101565, 0x598c000f, 0x82001480, 0x00000002, - 0x04021007, 0x80000000, 0x4803180f, 0x80000580, - 0x0201f800, 0x00105d86, 0x0400000e, 0x0401fed7, - 0x0402000c, 0x0401fdc5, 0x0400000a, 0x0201f800, - 0x0010a7ee, 0x0401f918, 0x4d380000, 0x42027000, - 0x00000014, 0x0201f800, 0x000208d8, 0x5c027000, - 0x0401fc6a, 0x0201f000, 0x00101565, 0x4d900000, - 0x4dd00000, 0x4da40000, 0x4d140000, 0x4d300000, - 0x0201f800, 0x00105d9b, 0x0401fc6a, 0x59c400af, - 0x800001c0, 0x04000027, 0x0401f909, 0x59926004, - 0x4933c857, 0x59300004, 0x8c000516, 0x0400000b, - 0x0401fe86, 0x0402001f, 0x0201f800, 0x001068c1, - 0x0401fc52, 0x42000800, 0x80000804, 0x0201f800, - 0x00106466, 0x0401f017, 0x42001800, 0x00007530, - 0x0401f8c3, 0x04020004, 0x0201f800, 0x00105d8b, - 0x0401f010, 0x0401fe75, 0x0402000e, 0x0201f800, - 0x0010a7ee, 0x59300004, 0x8c00050c, 0x04020003, - 0x4a026203, 0x00000003, 0x4d380000, 0x42027000, - 0x0000004a, 0x0201f800, 0x000208d8, 0x5c027000, - 0x0401fc36, 0x5c026000, 0x5c022800, 0x5c034800, - 0x5c03a000, 0x5c032000, 0x0201f000, 0x00101565, - 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, - 0x4d300000, 0x4d2c0000, 0x0401fc32, 0x0401f8d4, - 0x59926004, 0x4933c857, 0x0401f882, 0x04000016, - 0x0201f800, 0x00105d9b, 0x813261c0, 0x04000034, - 0x59325808, 0x812e59c0, 0x02000800, 0x00100615, - 0x0201f800, 0x00104e0d, 0x0402001d, 0x592c0208, - 0x84000550, 0x48025a08, 0x0201f800, 0x00104f29, - 0x04020027, 0x592c0208, 0x84000510, 0x48025a08, - 0x0401f023, 0x0201f800, 0x00105d8b, 0x0401f020, - 0x0201f800, 0x0010a7ee, 0x0401fd99, 0x592c0208, - 0x84000550, 0x48025a08, 0x4d380000, 0x42027000, - 0x0000004a, 0x4a026203, 0x00000003, 0x0201f800, - 0x000208d8, 0x5c027000, 0x0401f011, 0x59900006, - 0x82000500, 0xffff0000, 0x040207ee, 0x59c408af, - 0x82040480, 0x000003e8, 0x040217ea, 0x59900006, - 0x82000400, 0x00010000, 0x48032006, 0x0201f800, - 0x00105d8b, 0x0201f800, 0x00103f37, 0x5c025800, - 0x5c026000, 0x5c022800, 0x5c034800, 0x5c03a000, - 0x5c032000, 0x0201f000, 0x00106982, 0x4d300000, - 0x4d2c0000, 0x0201f800, 0x0010698c, 0x598e600d, - 0x4933c857, 0x59c41004, 0x8c081500, 0x04000007, - 0x0201f800, 0x00104e0d, 0x04020007, 0x0201f800, - 0x00104f29, 0x0402002f, 0x0201f800, 0x00105d86, - 0x0401f02c, 0x598c000f, 0x80000540, 0x04020011, - 0x59c408af, 0x82040480, 0x000003e8, 0x0402100d, - 0x598c080f, 0x80040800, 0x4807180f, 0x0201f800, - 0x00105d86, 0x42000000, 0x0010b650, 0x0201f800, - 0x0010a86e, 0x0201f800, 0x00103f37, 0x0401f019, - 0x0401fdad, 0x813261c0, 0x04020003, 0x0401f849, - 0x0401f014, 0x0201f800, 0x0010a7ee, 0x59300406, - 0x82000580, 0x00000003, 0x04020007, 0x59325808, - 0x812e59c0, 0x04000004, 0x592c0208, 0x84000550, - 0x48025a08, 0x0401f854, 0x4d380000, 0x42027000, - 0x00000014, 0x0201f800, 0x000208d8, 0x5c027000, - 0x5c025800, 0x5c026000, 0x0201f000, 0x00106982, - 0x59c40804, 0x83180400, 0x00106dec, 0x50000000, - 0x80040500, 0x1c01f000, 0x59c40804, 0x83180400, - 0x00106df1, 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, 0x0010698c, 0x4df00000, 0x480b1800, - 0x5c03e000, 0x02000800, 0x00106982, 0x1c01f000, - 0x4803c856, 0x0201f800, 0x0010698c, 0x4df00000, - 0x497b180d, 0x497b1803, 0x497b180e, 0x497b180f, - 0x497b1810, 0x598c0000, 0x82000580, 0x00000003, - 0x04000009, 0x836c0580, 0x00000002, 0x04020004, - 0x4a031800, 0x00000005, 0x0401f003, 0x4a031800, - 0x00000000, 0x5c03e000, 0x02000800, 0x00106982, - 0x1c01f000, 0x59300004, 0x8c00050c, 0x04020003, - 0x4a026203, 0x00000001, 0x1c01f000, 0x83180480, - 0x00000005, 0x02021800, 0x00100615, 0x491bc857, - 0x811b20c8, 0x83932400, 0x0000bf32, 0x811ba0ca, - 0x83d3a400, 0x00007600, 0x83180400, 0x00106e41, - 0x50034800, 0x811a28c2, 0x83162c00, 0x00006100, - 0x1c01f000, 0x0010b559, 0x0010b570, 0x0010b587, - 0x0010b59e, 0x0010b5b5, 0x4933c857, 0x59300406, - 0x82000c80, 0x00000012, 0x04021016, 0x4803c857, - 0x04011000, 0x0c01f001, 0x00106e60, 0x00106f03, - 0x00107249, 0x001072cf, 0x00106f03, 0x00107249, - 0x001072cf, 0x00106e60, 0x00106f03, 0x00106e60, - 0x00106e60, 0x00106e60, 0x00106e60, 0x00106e60, - 0x00106e60, 0x00106e60, 0x00106e66, 0x00106e66, - 0x0201f800, 0x0010698c, 0x0201f800, 0x001068f6, - 0x0201f000, 0x00106982, 0x42001000, 0x0010b5f4, - 0x50081000, 0x4930100c, 0x58080002, 0x82000580, - 0x00000100, 0x0402003e, 0x59325808, 0x812e59c0, - 0x02000800, 0x00100615, 0x59326809, 0x813669c0, - 0x04000025, 0x592c040b, 0x82000500, 0x0000e000, - 0x04000003, 0x0401fbc9, 0x0401f002, 0x0401fbb9, - 0x592c000d, 0x82000500, 0x00000003, 0x04000007, - 0x82000580, 0x00000003, 0x80000000, 0x58d00802, - 0x80040540, 0x4801a002, 0x42001000, 0x0010b5f4, - 0x50081000, 0x4930100b, 0x492c100a, 0x82d00400, - 0x00000006, 0x48001003, 0x592c000d, 0x82000400, - 0x00000003, 0x80000104, 0x48001004, 0x592c000e, - 0x48001007, 0x592c000f, 0x48001008, 0x0201f000, - 0x001008a1, 0x42026800, 0x0010bc0c, 0x592c080a, - 0x48066802, 0x82040500, 0x00ffff00, 0x04000007, - 0x497a6a12, 0x59a81010, 0x82081500, 0x00ffff00, - 0x80080580, 0x040207d0, 0x82040d00, 0x000000ff, - 0x800408d0, 0x48066a12, 0x0401f7cb, 0x1c01f000, - 0x4d2c0000, 0x4d300000, 0x4c580000, 0x4c540000, - 0x4c500000, 0x5832580a, 0x812e59c0, 0x02000800, - 0x00100615, 0x58300002, 0x4a006002, 0x00000100, - 0x82000580, 0x00000100, 0x04020020, 0x5830000b, - 0x5832600c, 0x81300580, 0x04020012, 0x0401f82f, - 0x04020014, 0x592c080d, 0x82040c00, 0x00000003, - 0x80040904, 0x4004b000, 0x4200a000, 0x0010b349, - 0x4050a800, 0x0201f800, 0x0010a94f, 0x42001000, - 0x0000dc00, 0x0201f800, 0x0010763b, 0x0401f005, - 0x4803c857, 0x4933c857, 0x0401f81c, 0x04000f93, - 0x5c00a000, 0x5c00a800, 0x5c00b000, 0x5c026000, - 0x5c025800, 0x1c01f000, 0x5830000b, 0x5832600c, - 0x4803c857, 0x4933c857, 0x81300580, 0x040207f1, - 0x0401f80e, 0x040207f3, 0x4803c857, 0x0201f800, - 0x00106619, 0x02020800, 0x00100615, 0x4a025a06, - 0x00000002, 0x0201f800, 0x00020381, 0x0201f800, - 0x00107698, 0x0401f7e7, 0x0201f800, 0x0010698c, - 0x4df00000, 0x598c000d, 0x81300580, 0x04020009, - 0x598c0005, 0x81300580, 0x04020006, 0x5c03e000, - 0x02000800, 0x00106982, 0x80000580, 0x1c01f000, - 0x4803c857, 0x5c03e000, 0x02000800, 0x00106982, - 0x82000540, 0x00000001, 0x1c01f000, 0x59300403, - 0x82000c80, 0x00000056, 0x02021800, 0x00100615, - 0x4803c857, 0x0c01f001, 0x0010707a, 0x00107095, - 0x001070a6, 0x001071a9, 0x00107169, 0x0010716d, - 0x0010717e, 0x00107192, 0x00107187, 0x00107192, - 0x001071cd, 0x00107192, 0x0010720f, 0x00107192, - 0x0010721d, 0x00107192, 0x00107187, 0x00107192, - 0x00107221, 0x00106f60, 0x00106f60, 0x00106f60, - 0x00106f60, 0x00106f60, 0x00106f60, 0x00106f60, - 0x00106f60, 0x00106f60, 0x00106f60, 0x00106f60, - 0x001072ed, 0x0010730c, 0x00107316, 0x00106f60, - 0x0010732c, 0x0010717e, 0x00106f60, 0x0010717e, - 0x00107192, 0x00106f60, 0x001070a6, 0x001071a9, - 0x00106f60, 0x0010737c, 0x00107192, 0x00106f60, - 0x0010738c, 0x00107192, 0x00106f60, 0x00107187, - 0x0010706b, 0x00106f62, 0x00106f60, 0x001073a3, - 0x001073dc, 0x00107456, 0x00106f60, 0x00107466, - 0x0010717c, 0x00107459, 0x00106f60, 0x00107338, - 0x0010747f, 0x00106f60, 0x001074b4, 0x00107507, - 0x00106f60, 0x00106f77, 0x00106fdd, 0x00106fea, - 0x00106f60, 0x0010717e, 0x00106f60, 0x00107031, - 0x0010703c, 0x00106f60, 0x00106f60, 0x00106f8b, - 0x00106fb0, 0x00107546, 0x00107587, 0x001075ad, - 0x00106f60, 0x00106f60, 0x00106f60, 0x0010757b, - 0x0201f800, 0x00100615, 0x0401fad2, 0x59325808, - 0x592c0009, 0x4801a006, 0x592c000a, 0x4801a007, - 0x592c000b, 0x4801a008, 0x592c000c, 0x4801a009, - 0x592c000d, 0x4801a00a, 0x4979a00b, 0x592c0809, - 0x82040d00, 0x00000fff, 0x80040904, 0x42001000, - 0x0000dc00, 0x0201f000, 0x0010763b, 0x4a026202, - 0x0000ffff, 0x0401fabb, 0x4d2c0000, 0x4a01a006, - 0x05000000, 0x59325808, 0x592c0009, 0x4801a007, - 0x592c000a, 0x4801a008, 0x592c000b, 0x4801a009, - 0x42000800, 0x00000004, 0x42001000, 0x0000dc00, - 0x5c025800, 0x0201f000, 0x0010763b, 0x4c580000, - 0x4c500000, 0x4c540000, 0x4d2c0000, 0x0401faa5, - 0x59325808, 0x5930040b, 0x800000c2, 0x4200a800, - 0x0010b349, 0x592cb205, 0x832ca400, 0x00000006, - 0x0201f800, 0x0010a93e, 0x40580000, 0x8054ac00, - 0x592c0001, 0x80000540, 0x04000003, 0x40025800, - 0x0401f7f5, 0x4200a000, 0x0010b349, 0x4050a800, - 0x5930b40b, 0x0201f800, 0x0010a94f, 0x59300c0b, - 0x42001000, 0x0000dc00, 0x5c025800, 0x5c00a800, - 0x5c00b000, 0x5c00a000, 0x0201f000, 0x0010763b, - 0x4c580000, 0x4c500000, 0x4c540000, 0x4d2c0000, - 0x42034800, 0x0010b342, 0x0401fa8c, 0x59325808, - 0x592c0802, 0x4807c857, 0x40041000, 0x80040904, - 0x82081500, 0x00000003, 0x04000008, 0x80040800, - 0x82081580, 0x00000003, 0x80081000, 0x58d00002, - 0x80080540, 0x4801a002, 0x4a025805, 0x02000000, - 0x82d0ac00, 0x00000006, 0x592cb011, 0x832ca400, - 0x00000005, 0x0201f800, 0x0010a93e, 0x40580000, - 0x8054ac00, 0x592e5801, 0x41780000, 0x812e5d40, - 0x040207f6, 0x42001000, 0x0000dc00, 0x5c025800, - 0x5c00a800, 0x5c00b000, 0x5c00a000, 0x0201f000, - 0x0010763b, 0x0401fa57, 0x4a01a006, 0x78000000, - 0x5930001c, 0x840001c0, 0x4801a407, 0x4979a207, - 0x42000800, 0x00000002, 0x42001000, 0x0000dc00, - 0x0201f000, 0x0010763b, 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, 0x0010b2e7, 0x4a03c842, 0x0000000d, - 0x42001800, 0x0010b2e7, 0x0201f800, 0x001007f5, - 0x42000000, 0x0000df00, 0x4200a000, 0x0010b2e7, - 0x0401f00d, 0x4a03c840, 0x0010b2f4, 0x4a03c842, - 0x0000000d, 0x42001800, 0x0010b2f4, 0x0201f800, - 0x001007f5, 0x42000000, 0x0000e000, 0x4200a000, - 0x0010b2f4, 0x82000540, 0x00000010, 0x4801a407, - 0x4a01a207, 0x00000034, 0x4200b000, 0x0000000d, - 0x82d0ac00, 0x0000000c, 0x0201f800, 0x0010a93e, - 0x42000800, 0x00000013, 0x42001000, 0x0000dc00, - 0x5c00a000, 0x5c00a800, 0x5c00b000, 0x0201f000, - 0x0010763b, 0x0401fa03, 0x4a01a006, 0x63000028, - 0x5930001c, 0x4801a007, 0x42000800, 0x00000002, - 0x42001000, 0x0000dc00, 0x0201f000, 0x0010763b, - 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, 0x0010763b, - 0x00107061, 0x00107063, 0x00107065, 0x00107067, - 0x00107069, 0x4811a008, 0x1c01f000, 0x4811a009, - 0x1c01f000, 0x4811a00a, 0x1c01f000, 0x4811a00b, - 0x1c01f000, 0x4811a00c, 0x1c01f000, 0x4a026009, - 0x0010bc0c, 0x59a80010, 0x82000500, 0x000000ff, - 0x800000d0, 0x42026800, 0x0010bc0c, 0x48026a12, - 0x0401fa3c, 0x41780800, 0x42001000, 0x00005c00, - 0x0201f000, 0x0010763b, 0x0401f9ba, 0x4a01a006, - 0x52000000, 0x4979a007, 0x599c0017, 0x8c000500, - 0x04000005, 0x599c0402, 0x0201f800, 0x00101644, - 0x4805a007, 0x59a80002, 0x4801a008, 0x59a80003, - 0x4801a009, 0x59a80000, 0x4801a00a, 0x59a80001, - 0x4801a00b, 0x59a80010, 0x4801a00c, 0x42000800, - 0x00000007, 0x42001000, 0x0000dc00, 0x0201f000, - 0x0010763b, 0x4a026202, 0x0000ffff, 0x0401f99d, - 0x4a01a006, 0x05000000, 0x59a80010, 0x4801a007, - 0x59a80002, 0x59a80803, 0x4801a008, 0x4805a009, - 0x42000800, 0x00000004, 0x42001000, 0x0000dc00, - 0x0201f000, 0x0010763b, 0x4a026202, 0x0000ffff, - 0x0401f98c, 0x4d3c0000, 0x417a7800, 0x0201f800, - 0x00104745, 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, - 0x00104e0d, 0x04020009, 0x497b8880, 0x82000500, - 0x0000ffff, 0x4c000000, 0x0201f800, 0x00101670, - 0x5c000000, 0x48038880, 0x59a8002b, 0x0201f800, - 0x00104e0d, 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, 0x0010b6f9, - 0x82d0ac00, 0x0000001f, 0x4c000000, 0x0201f800, - 0x0010a93e, 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, 0x00101670, 0x5c000000, 0x48038880, - 0x59a8002a, 0x4801a007, 0x4c640000, 0x4d2c0000, - 0x59a8c82b, 0x0201f800, 0x00108df4, 0x0400000d, - 0x0201f800, 0x00109360, 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, - 0x0010763b, 0x0401f8cb, 0x4a01a006, 0x50000000, - 0x0401f7b5, 0x0401f8c7, 0x4a01a406, 0x21000010, - 0x4a01a206, 0x00000014, 0x4979a007, 0x4979a008, - 0x4979a009, 0x4979a00a, 0x42000800, 0x00000005, - 0x42001000, 0x0000dc00, 0x0201f000, 0x0010763b, - 0x0401f8bf, 0x0401f002, 0x0401f8c4, 0x4a01a006, - 0x02000000, 0x42000800, 0x00000001, 0x42001000, - 0x0000dc00, 0x0201f000, 0x0010763b, 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, - 0x0010763b, 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, 0x0010763b, 0x0401f833, - 0x4a01a006, 0x02100014, 0x4a01a007, 0x01000000, - 0x4979a008, 0x4979a009, 0x4979a00a, 0x42000800, - 0x00000005, 0x42001000, 0x0000dc00, 0x0201f000, - 0x0010763b, 0x0401f825, 0x4a01a006, 0x02000000, - 0x0401f65d, 0x4933c857, 0x0401f820, 0x4a01a006, - 0x01000000, 0x4a01a407, 0x0000000b, 0x42000800, - 0x00000002, 0x42001000, 0x0000dc00, 0x0201f000, - 0x0010763b, 0x42005000, 0x32000000, 0x42006000, - 0x08290000, 0x41786800, 0x41787800, 0x0401f3e6, - 0x42005000, 0x22000000, 0x42006000, 0x01290000, - 0x41786800, 0x41787800, 0x0401f3df, 0x42005000, - 0x33000000, 0x42006000, 0x08980000, 0x41786800, - 0x41787800, 0x0401f3d8, 0x42005000, 0x23000000, - 0x42006000, 0x01980000, 0x41786800, 0x41787800, - 0x0401f3d1, 0x59300403, 0x82000c80, 0x00000085, - 0x02001800, 0x00100615, 0x82000c80, 0x00000093, - 0x02021800, 0x00100615, 0x82000480, 0x00000085, - 0x0c01f001, 0x00107263, 0x00107265, 0x00107272, - 0x00107263, 0x00107263, 0x00107263, 0x00107263, - 0x00107263, 0x00107263, 0x00107263, 0x00107263, - 0x00107263, 0x00107263, 0x0010727f, 0x0201f800, - 0x00100615, 0x4933c857, 0x0401f851, 0x5930001c, - 0x4801a004, 0x4801a007, 0x4979a408, 0x4a01a208, - 0x0000ffff, 0x42000800, 0x00000003, 0x42001000, - 0x0000dc00, 0x0401f3ca, 0x4933c857, 0x0401f850, - 0x5930001c, 0x4801a004, 0x4a01a406, 0x00000003, - 0x4a01a206, 0x00000300, 0x42000800, 0x00000001, - 0x42001000, 0x0000dc00, 0x0401f3bd, 0x4d2c0000, - 0x59325808, 0x4933c857, 0x492fc857, 0x812e59c0, - 0x02000800, 0x00100615, 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, 0x00100615, - 0x42001000, 0x00000007, 0x42000800, 0x00000001, - 0x832c1c00, 0x00000009, 0x500c0000, 0x4401a000, - 0x800c1800, 0x80d1a000, 0x80081040, 0x040207fb, - 0x42001000, 0x0000dc00, 0x5c025800, 0x0401f38c, - 0x42005000, 0x81000000, 0x42006000, 0x00090000, - 0x41786800, 0x41787800, 0x0401f363, 0x42005000, - 0x84000000, 0x42006000, 0x00990000, 0x59300406, - 0x82000580, 0x00000005, 0x04000002, 0x8430652e, - 0x41786800, 0x41787800, 0x0401f357, 0x42005000, - 0x85000000, 0x42006000, 0x00990000, 0x59300406, - 0x82000580, 0x00000005, 0x04000002, 0x8430652e, - 0x41786800, 0x41787800, 0x0401f34b, 0x59300403, - 0x82000c80, 0x00000053, 0x02021800, 0x00100615, - 0x82000480, 0x0000004b, 0x02001800, 0x00100615, - 0x59326809, 0x59368c03, 0x4803c857, 0x0c01f001, - 0x00107353, 0x0010735b, 0x00107363, 0x0010736b, - 0x001072e4, 0x001072e4, 0x001072e4, 0x0010734b, - 0x0201f800, 0x00100615, 0x42005000, 0x06000000, - 0x42006000, 0x08290000, 0x41786800, 0x41787800, - 0x0401f32d, 0x4933c857, 0x0401ff46, 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, 0x0401f330, - 0x0401ff28, 0x4a01a006, 0x0f000000, 0x5930001c, - 0x4801a007, 0x42000800, 0x00000002, 0x42001000, - 0x0000dc00, 0x0401f326, 0x0401ff2c, 0x4a01a006, - 0x02000000, 0x59c40085, 0x48031004, 0x59880000, - 0x4801a007, 0x59880001, 0x4801a008, 0x59880002, - 0x4801a009, 0x59880003, 0x4801a00a, 0x59880004, - 0x4801a00b, 0x59880005, 0x4801a00c, 0x42000800, - 0x00000007, 0x42001000, 0x0000dc00, 0x0401f310, - 0x4a026202, 0x0000ffff, 0x0401ff06, 0x4a01a006, - 0x62000000, 0x5930001c, 0x4801a007, 0x42000800, - 0x00000002, 0x42001000, 0x0000dc00, 0x0401f304, - 0x0401fefc, 0x59300808, 0x4c500000, 0x4c540000, - 0x4c580000, 0x8204a400, 0x0000000a, 0x5930b01c, - 0x82d0ac00, 0x00000006, 0x0201f800, 0x0010a93e, - 0x5930081c, 0x42001000, 0x0000dc00, 0x5c00b000, - 0x5c00a800, 0x5c00a000, 0x0401f2f1, 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, 0x0401f2c0, - 0x0401fec6, 0x4a01a006, 0x02000014, 0x4979a407, - 0x4979a207, 0x59a8003a, 0x4801a008, 0x59a8003b, - 0x4801a009, 0x4a01a00a, 0x00047878, 0x42000800, - 0x00000005, 0x42001000, 0x0000dc00, 0x0401f2b0, - 0x0401feb6, 0x4a01a006, 0x02140018, 0x4a01a407, - 0x00000800, 0x5930001c, 0x82000d00, 0xff000000, - 0x900409c0, 0x4805a207, 0x82000500, 0x00ffffff, - 0x4801a00a, 0x4979a408, 0x4979a208, 0x4979a409, - 0x4979a209, 0x4979a00b, 0x42000800, 0x00000006, - 0x42001000, 0x0000dc00, 0x0401f299, 0x4933c857, - 0x4937c857, 0x4d380000, 0x4d1c0000, 0x42027000, - 0x00000035, 0x0201f800, 0x00109183, 0x04020022, - 0x0401fe88, 0x4a01a006, 0x13000000, 0x5932381e, - 0x591c0414, 0x8c000502, 0x02000800, 0x00100615, - 0x591c0019, 0x4801a005, 0x591c0406, 0x82000580, - 0x00000003, 0x04000007, 0x59300809, 0x58040002, - 0x82000500, 0x00ffffff, 0x4801a007, 0x0401f003, - 0x59a80010, 0x4801a007, 0x59300419, 0x4801a408, - 0x59300219, 0x4801a208, 0x42000800, 0x00000003, - 0x42001000, 0x0000dc00, 0x5c023800, 0x5c027000, - 0x0401f26f, 0x4803c856, 0x0201f800, 0x0010698c, - 0x598c000d, 0x81300580, 0x02020800, 0x00100615, - 0x0201f800, 0x001068f6, 0x0201f800, 0x000208b4, - 0x5c023800, 0x5c027000, 0x0201f000, 0x00106982, - 0x4803c856, 0x4d2c0000, 0x4d1c0000, 0x5932381e, - 0x811e39c0, 0x02000800, 0x00100615, 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, 0x00100615, 0x00107410, - 0x0010741c, 0x00107412, 0x0010741c, 0x00107418, - 0x00107410, 0x00107410, 0x0010741c, 0x0010741c, - 0x00107410, 0x00107410, 0x00107410, 0x00107410, - 0x00107410, 0x0010741c, 0x00107410, 0x0010741c, - 0x0201f800, 0x00100615, 0x591c0414, 0x4803c857, - 0x8c000518, 0x04000003, 0x8c000512, 0x04000003, - 0x80001580, 0x0401f003, 0x42001000, 0x20000000, - 0x591c0015, 0x4801a00a, 0x0401f018, 0x0401f81f, - 0x591e5808, 0x812e59c0, 0x02000800, 0x00100615, - 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, 0x0401fe03, - 0x4a01a006, 0x02000000, 0x59300c19, 0x4805a407, - 0x59300a19, 0x4805a207, 0x59a81010, 0x59300809, - 0x58041802, 0x820c1d00, 0x00ffffff, 0x5930081e, - 0x58040406, 0x82000580, 0x00000003, 0x04020004, - 0x4809a008, 0x480da009, 0x0401f003, 0x480da008, - 0x4809a009, 0x1c01f000, 0x4803c856, 0x0401fdeb, - 0x0401f003, 0x4803c856, 0x0401fde1, 0x4a01a006, - 0x01000000, 0x5930041a, 0x4801a407, 0x5930021a, - 0x4801a207, 0x42000800, 0x00000002, 0x42001000, - 0x0000dc00, 0x0401f1d6, 0x4803c856, 0x4d1c0000, - 0x0401fdc5, 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, - 0x0401f9f4, 0x41780800, 0x42001000, 0x00005c00, - 0x0401f9b3, 0x0201f000, 0x00105d86, 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, 0x0401fcfc, 0x5930001c, - 0x800001c0, 0x04000008, 0x4a01a006, 0x01000000, - 0x4a01a407, 0x00000003, 0x42000800, 0x00000002, - 0x0401f028, 0x4a01a006, 0x02000000, 0x41780800, - 0x836c0580, 0x00000004, 0x04020003, 0x84040d42, - 0x0401f00d, 0x0201f800, 0x00104e0d, 0x04020003, - 0x84040d4a, 0x0401f002, 0x84040d48, 0x59a80026, - 0x8c000506, 0x04020003, 0x8c00050a, 0x04000002, - 0x84040d46, 0x4805a207, 0x59c40085, 0x48031004, - 0x4c580000, 0x4c500000, 0x4c540000, 0x4200b000, - 0x00000006, 0x8388a400, 0x00000000, 0x82d0ac00, - 0x00000008, 0x0201f800, 0x0010a93e, 0x5c00a800, - 0x5c00a000, 0x5c00b000, 0x42000800, 0x00000008, - 0x42001000, 0x0000dc00, 0x0401f0c1, 0x0401fcb9, - 0x4a01a006, 0x56000000, 0x59340006, 0x4801a007, - 0x59340007, 0x4801a008, 0x42000800, 0x00000003, - 0x42001000, 0x0000dc00, 0x0401f0b5, 0x4803c856, - 0x0401fcba, 0x5930081c, 0x800409c0, 0x0400000e, - 0x82040580, 0x0000ffff, 0x04000004, 0x82040480, - 0x00000007, 0x04021008, 0x4a01a006, 0x01000000, - 0x4a01a407, 0x00000003, 0x42000800, 0x00000002, - 0x0401f012, 0x4a01a006, 0x0200001c, 0x4a01a007, - 0x00000001, 0x42001000, 0x0010b2ec, 0x50080000, - 0x9c0001c0, 0x4801a009, 0x59a80010, 0x4801a00a, - 0x59a80002, 0x59a80803, 0x4801a00b, 0x4805a00c, - 0x42000800, 0x00000007, 0x42001000, 0x0000dc00, - 0x0401f08f, 0x4d2c0000, 0x0401fc86, 0x59325808, - 0x592c0008, 0x82000500, 0x00ffffff, 0x4801a001, - 0x4a01a006, 0x51000000, 0x5c025800, 0x0201f000, - 0x001070bc, 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, 0x00100615, 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, 0x0401f868, 0x0201f000, - 0x00105d8b, 0x59a80026, 0x82000500, 0x00000028, - 0x04000003, 0x497a6a12, 0x0401f7dc, 0x4a026a12, - 0x0000ff00, 0x0401f7d9, 0x42005000, 0x02000000, - 0x42006000, 0x20290000, 0x41786800, 0x41787800, - 0x0401f812, 0x83180d40, 0x00000038, 0x42001000, - 0x0000c9a0, 0x0401f851, 0x42000800, 0x000007d0, - 0x59300011, 0x82000500, 0xfff00000, 0x80000540, - 0x04000003, 0x42000800, 0x00001b58, 0x41781000, - 0x0201f000, 0x00105d8d, 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, 0x4807c857, - 0x4c040000, 0x0401f82a, 0x5c000800, 0x40040000, - 0x80081540, 0x800000c4, 0x82000540, 0x00002000, - 0x4803910a, 0x59b400f6, 0x82000500, 0x00000018, - 0x040207fd, 0x4a0368f0, 0x0010b342, 0x42001800, - 0x0010b343, 0x580c0000, 0x4803c857, 0x580c0002, - 0x4803c857, 0x580c0004, 0x4803c857, 0x4a0368f1, - 0x0010b349, 0x480b68f3, 0x4a0378e4, 0x00008000, - 0x0201f000, 0x00105d86, 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, 0x00100615, 0x0401f7fa, 0x1c01f000, - 0x82000500, 0xffff0000, 0x82000580, 0x01050000, - 0x0402000d, 0x599c0818, 0x8c040d10, 0x0400000a, - 0x59a80807, 0x8c040d0a, 0x04000007, 0x42001000, - 0x0000804f, 0x41781800, 0x41782000, 0x0201f800, - 0x00103857, 0x1c01f000, 0x41781000, 0x42026000, - 0x0010cfc0, 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, - 0x0010a3fa, 0x5930001c, 0x800001c0, 0x02020800, - 0x0010961a, 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, 0x0010cfc0, 0x0401f7f6, - 0x4933c857, 0x8166c840, 0x83300c00, 0x00000024, - 0x80040480, 0x04021006, 0x4006c000, 0x4a026203, - 0x00000008, 0x813261c0, 0x1c01f000, 0x4202c000, - 0x0010cfc0, 0x0401f7fa, 0x42000000, 0x0010b653, - 0x0201f800, 0x0010a86e, 0x4933c856, 0x417a6000, - 0x0401f7f5, 0x4933c857, 0x83380580, 0x00000013, - 0x0402000b, 0x59300004, 0x8c00053e, 0x04000007, - 0x0201f800, 0x0010698c, 0x0201f800, 0x001068f6, - 0x0201f800, 0x00106982, 0x1c01f000, 0x4933c857, - 0x59880053, 0x80000000, 0x48031053, 0x1c01f000, - 0x4933c857, 0x59300203, 0x82003480, 0x0000000e, - 0x02021800, 0x00100615, 0x4d2c0000, 0x0c01f803, - 0x5c025800, 0x1c01f000, 0x00107718, 0x00107c84, - 0x00107dd4, 0x00107718, 0x00107e3a, 0x0010787c, - 0x00107718, 0x00107718, 0x00107c1a, 0x00107718, - 0x00107718, 0x00107718, 0x00107718, 0x00107718, - 0x0201f800, 0x00100615, 0x4933c857, 0x59300203, - 0x82003480, 0x0000000e, 0x02021800, 0x00100615, - 0x0c01f001, 0x0010772f, 0x001087f0, 0x0010772f, - 0x0010772f, 0x0010772f, 0x0010772f, 0x0010772f, - 0x0010772f, 0x0010879a, 0x0010880c, 0x0010887a, - 0x0010880c, 0x0010887a, 0x0010772f, 0x0201f800, - 0x00100615, 0x0201f800, 0x00100615, 0x4933c857, - 0x4d2c0000, 0x59325808, 0x59300203, 0x82003480, - 0x0000000e, 0x02021800, 0x00100615, 0x0c01f803, - 0x5c025800, 0x1c01f000, 0x0010774c, 0x0010774c, - 0x0010774c, 0x00107768, 0x001077b4, 0x0010774c, - 0x0010774c, 0x0010774c, 0x0010774e, 0x0010774c, - 0x0010774c, 0x0010774c, 0x0010774c, 0x0010774c, - 0x0201f800, 0x00100615, 0x4933c857, 0x83380580, - 0x00000040, 0x02020800, 0x00100615, 0x4a026007, - 0x00082000, 0x4a026203, 0x00000003, 0x493a6403, - 0x4a025c08, 0x00000001, 0x592c000d, 0x48026011, - 0x497a6013, 0x592c0208, 0x800000c2, 0x800010c4, - 0x80081400, 0x480a6206, 0x0201f800, 0x00100f9c, - 0x42000800, 0x80000060, 0x0201f000, 0x00106466, - 0x4933c857, 0x83380480, 0x00000050, 0x02021800, - 0x00100615, 0x83380480, 0x00000049, 0x02001800, - 0x00100615, 0x0c01f001, 0x0010777b, 0x00107786, - 0x00107779, 0x00107779, 0x00107779, 0x00107779, - 0x00107791, 0x0201f800, 0x00100615, 0x4a026203, - 0x00000004, 0x4a025c08, 0x00000002, 0x592c0207, - 0x48025c09, 0x592c0209, 0x48025a07, 0x592c000c, - 0x4802580d, 0x1c01f000, 0x0201f800, 0x001068c1, - 0x0201f800, 0x00108df4, 0x04000005, 0x4a025a06, - 0x00000006, 0x0201f800, 0x00020381, 0x0201f000, - 0x000208b4, 0x0201f800, 0x001068c1, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x00101de2, 0x5c027800, - 0x42003000, 0x00000014, 0x41782800, 0x42002000, - 0x00000002, 0x4d400000, 0x4d440000, 0x59368c03, - 0x42028000, 0x00000029, 0x0201f800, 0x0010962a, - 0x5c028800, 0x5c028000, 0x42000000, 0x0010b663, - 0x0201f800, 0x0010a86e, 0x0201f800, 0x00108df4, - 0x02000000, 0x000208b4, 0x4a025a06, 0x00000029, - 0x0201f800, 0x00020381, 0x0201f000, 0x000208b4, - 0x4933c857, 0x83380580, 0x00000048, 0x04000005, - 0x83380580, 0x00000053, 0x02020800, 0x00100615, - 0x592c0206, 0x82000580, 0x00000007, 0x04000009, - 0x59300011, 0x80000540, 0x04000006, 0x592c080c, - 0x80040480, 0x4802580c, 0x4a025a06, 0x00000015, - 0x592c0206, 0x80000540, 0x04020003, 0x4a025a06, - 0x00000000, 0x0201f800, 0x00020381, 0x0201f000, - 0x000208b4, 0x4933c857, 0x4d2c0000, 0x4c500000, - 0x4c540000, 0x4c580000, 0x0201f800, 0x0010082a, - 0x02000800, 0x00100615, 0x497a5a06, 0x59a8006e, - 0x82000500, 0x0000f000, 0x48025c07, 0x59a80816, - 0x82040c00, 0x00000018, 0x48065a07, 0x412c7800, - 0x4d2c0000, 0x41cca000, 0x42002800, 0x00000001, - 0x42001000, 0x0000002c, 0x82040480, 0x0000002d, - 0x04021006, 0x832cac00, 0x00000009, 0x0201f800, - 0x0010894a, 0x0401f02e, 0x40043000, 0x42000800, - 0x0000002c, 0x832cac00, 0x00000009, 0x0201f800, - 0x0010894a, 0x82183480, 0x0000002c, 0x0201f800, - 0x0010082a, 0x0400001a, 0x80142800, 0x4a025804, - 0x00000110, 0x492c7801, 0x82180c80, 0x0000003d, - 0x04021007, 0x40180800, 0x832cac00, 0x00000005, - 0x0201f800, 0x0010894a, 0x0401f015, 0x82081400, - 0x0000003c, 0x82183480, 0x0000003c, 0x42000800, - 0x0000003c, 0x412c7800, 0x832cac00, 0x00000005, - 0x0201f800, 0x0010894a, 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, 0x00020381, - 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, 0x0010082a, 0x04000023, 0x5c001800, - 0x492c1801, 0x485a5800, 0x832cac00, 0x00000002, - 0x0201f800, 0x0010a94f, 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, 0x000208b4, 0x83380d80, 0x00000016, - 0x02020800, 0x00100615, 0x0201f000, 0x000208b4, - 0x4933c857, 0x4d2c0000, 0x4c500000, 0x4c540000, - 0x4c580000, 0x59325808, 0x83cca400, 0x00000006, - 0x59cc1806, 0x820c0580, 0x01000000, 0x04020004, - 0x4200b000, 0x00000002, 0x0401f00f, 0x4200b000, - 0x00000008, 0x832cac00, 0x00000005, 0x0201f800, - 0x0010a93e, 0x8c0c1d00, 0x0400000b, 0x4200b000, - 0x00000008, 0x592e5801, 0x812e59c0, 0x02000800, - 0x00100615, 0x832cac00, 0x00000005, 0x0201f800, - 0x0010a93e, 0x0401f816, 0x5c00b000, 0x5c00a800, - 0x5c00a000, 0x5c025800, 0x1c01f000, 0x4933c857, - 0x4c500000, 0x4c540000, 0x4c580000, 0x83cca400, - 0x00000006, 0x5930a808, 0x8254ac00, 0x00000005, - 0x4200b000, 0x00000007, 0x0201f800, 0x0010a93e, - 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x4933c857, - 0x0201f800, 0x00108df4, 0x02000000, 0x000208b4, - 0x4d2c0000, 0x0201f800, 0x00109360, 0x0402000b, - 0x41780800, 0x4d400000, 0x42028000, 0x00000000, - 0x0201f800, 0x00109204, 0x5c028000, 0x5c025800, - 0x0201f000, 0x000208b4, 0x5931d821, 0x58ef400b, - 0x58ee580d, 0x4a025a04, 0x00000103, 0x58ec0009, - 0x0801f800, 0x5c025800, 0x0201f000, 0x000208b4, - 0x4933c857, 0x59cc1806, 0x820c0580, 0x02000000, - 0x04020014, 0x4a026802, 0x00fffffd, 0x5934000a, - 0x84000504, 0x4802680a, 0x59300808, 0x800409c0, - 0x02000000, 0x000208b4, 0x4a000a04, 0x00000103, - 0x480c0805, 0x5931d821, 0x58ef400b, 0x58ee580d, - 0x58ec0009, 0x0801f800, 0x0201f000, 0x000208b4, - 0x42000000, 0x0010b66b, 0x0201f800, 0x0010a86e, - 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, 0x59a8086e, - 0x82040d00, 0x000003ff, 0x82041480, 0x0000000f, - 0x0400101b, 0x4200b000, 0x0000000f, 0x0201f800, - 0x0010a93e, 0x592e5801, 0x832cac00, 0x00000005, - 0x82080c80, 0x0000000f, 0x0400100d, 0x4200b000, - 0x0000000f, 0x0201f800, 0x0010a93e, 0x592e5801, - 0x832cac00, 0x00000005, 0x82041480, 0x0000000f, - 0x04001007, 0x42001000, 0x0000000f, 0x4008b000, - 0x0201f800, 0x0010a93e, 0x0401f004, 0x4004b000, - 0x0201f800, 0x0010a93e, 0x5931d821, 0x58ef400b, - 0x58ee580d, 0x4a025a04, 0x00000103, 0x592e5801, - 0x58ec0009, 0x0801f800, 0x0201f800, 0x000208b4, - 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, 0x00100615, - 0x8208ac00, 0x00000005, 0x0201f800, 0x0010a93e, - 0x82000d00, 0xff000000, 0x800409c0, 0x04000019, - 0x8200b500, 0x000000ff, 0x8058b104, 0x82580c80, - 0x0000000e, 0x04001003, 0x4200b000, 0x0000000d, - 0x58081001, 0x800811c0, 0x02000800, 0x00100615, - 0x8208ac00, 0x00000005, 0x0201f800, 0x0010a93e, - 0x0401f008, 0x59301008, 0x800811c0, 0x02000800, - 0x00100615, 0x48001005, 0x59cc0007, 0x48001006, - 0x0401ff3b, 0x5c00b000, 0x5c00a800, 0x5c00a000, - 0x5c025800, 0x1c01f000, 0x4933c857, 0x42000800, - 0x00000000, 0x59cc0006, 0x82000580, 0x02000000, - 0x04000003, 0x42000800, 0x00000001, 0x4d2c0000, - 0x59325808, 0x812e59c0, 0x02000800, 0x00100615, - 0x48065a06, 0x0201f800, 0x00020381, 0x5c025800, - 0x0201f000, 0x000208b4, 0x4933c857, 0x4d2c0000, - 0x4c500000, 0x4c540000, 0x4c580000, 0x4200b000, - 0x00000002, 0x59cc0806, 0x82040580, 0x01000000, - 0x04000004, 0x8204b500, 0x0000ffff, 0x8058b104, - 0x83cca400, 0x00000006, 0x59300008, 0x8200ac00, - 0x00000005, 0x0201f800, 0x0010a93e, 0x0401ff0c, - 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x5c025800, - 0x1c01f000, 0x4933c857, 0x4803c857, 0x4807c857, - 0x480bc857, 0x480fc857, 0x4813c857, 0x481bc857, - 0x492fc857, 0x4d2c0000, 0x4c000000, 0x0201f800, - 0x00100819, 0x5c000000, 0x0400000f, 0x48025803, - 0x5c000000, 0x4802580a, 0x4c000000, 0x481a5801, - 0x48125809, 0x48065804, 0x480a5807, 0x480e5808, - 0x412c1000, 0x0201f800, 0x001008a1, 0x82000540, - 0x00000001, 0x5c025800, 0x1c01f000, 0x4933c857, - 0x4d1c0000, 0x59cc0001, 0x82000500, 0x00ffffff, - 0x59341002, 0x82081500, 0x00ffffff, 0x80080580, - 0x0402001f, 0x497a6205, 0x4d380000, 0x42027000, - 0x00000035, 0x0201f800, 0x00109183, 0x5c027000, - 0x04020012, 0x591c001c, 0x800001c0, 0x0400000f, - 0x497a381c, 0x591c0414, 0x8c000502, 0x02000800, - 0x00100615, 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, 0x001063ee, - 0x592c0406, 0x4803c857, 0x800001c0, 0x0400000c, - 0x80080c80, 0x04001004, 0x02020800, 0x00100615, - 0x80001040, 0x480a5c06, 0x800811c0, 0x04020004, - 0x0201f800, 0x00108b3c, 0x0401f06b, 0x0201f800, - 0x00108ee7, 0x591c0817, 0x591c0018, 0x48065808, - 0x48025809, 0x59300007, 0x8c000500, 0x02020800, - 0x00100ee4, 0x497a3808, 0x0201f800, 0x000201ee, - 0x0402004a, 0x411e6000, 0x0401fc3e, 0x0401f05a, - 0x0401fc6d, 0x04000013, 0x49366009, 0x4a026406, - 0x00000003, 0x492e6008, 0x591c0817, 0x591c1018, - 0x48066017, 0x480a6018, 0x4d380000, 0x591e7403, - 0x4d300000, 0x411e6000, 0x0401fc2e, 0x5c026000, - 0x0201f800, 0x000208d8, 0x5c027000, 0x0401f046, - 0x59a80039, 0x48023a05, 0x0401f043, 0x59cc0407, - 0x82000580, 0x0000000b, 0x04020025, 0x59340a00, - 0x84040d0e, 0x48066a00, 0x592c0a04, 0x82040d00, - 0x000000ff, 0x82040d80, 0x00000014, 0x04000003, - 0x4a02621d, 0x00000003, 0x59300007, 0x8c000500, - 0x02020800, 0x00100ee4, 0x4d400000, 0x42028000, - 0x00000003, 0x592c0a08, 0x0201f800, 0x00104bee, - 0x0201f800, 0x00020381, 0x5c028000, 0x497a6008, - 0x4a026403, 0x00000085, 0x4a026203, 0x00000009, - 0x4a026406, 0x00000002, 0x42000800, 0x8000404b, - 0x0201f800, 0x00020855, 0x0401f01b, 0x59cc0207, - 0x82000580, 0x00002a00, 0x04020004, 0x59a80039, - 0x48023a05, 0x0401f014, 0x812e59c0, 0x02000800, - 0x00100615, 0x4a025a04, 0x00000103, 0x591c0007, - 0x8c000500, 0x02020800, 0x00100ee4, 0x591c0402, - 0x48025c06, 0x4a025a06, 0x00000003, 0x0201f800, - 0x00020381, 0x0201f800, 0x00107698, 0x0201f800, - 0x00104801, 0x5c026000, 0x0201f800, 0x000208b4, - 0x0401f002, 0x5c026000, 0x5c025800, 0x1c01f000, - 0x0401f819, 0x0401f7fd, 0x4933c857, 0x83380580, - 0x00000015, 0x04020004, 0x59a80039, 0x48023a05, - 0x0401f00d, 0x83380580, 0x00000016, 0x0402000d, - 0x4d300000, 0x411e6000, 0x0201f800, 0x0010a3fa, - 0x0201f800, 0x00020831, 0x0201f800, 0x000208b4, - 0x5c026000, 0x497a381c, 0x0201f800, 0x000208b4, - 0x1c01f000, 0x591c0414, 0x84000540, 0x48023c14, - 0x59cc100b, 0x4933c857, 0x491fc857, 0x492fc857, - 0x4803c857, 0x480bc857, 0x8c08153c, 0x04000006, - 0x59a80039, 0x48023a05, 0x497a381c, 0x0201f000, - 0x000208b4, 0x4d300000, 0x411e6000, 0x0201f800, - 0x0010898b, 0x5c026000, 0x591c0406, 0x82000580, - 0x00000000, 0x02000000, 0x000208b4, 0x591c0403, - 0x82000580, 0x00000050, 0x0402000d, 0x4d300000, - 0x411e6000, 0x4a026203, 0x00000001, 0x42000800, - 0x80000043, 0x0201f800, 0x00020855, 0x5c026000, - 0x497a381c, 0x0201f000, 0x000208b4, 0x591c0203, - 0x82000580, 0x0000000d, 0x04000014, 0x812e59c0, - 0x02000800, 0x00100615, 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, 0x0010901b, - 0x4933c857, 0x4d1c0000, 0x59cc0001, 0x59341002, - 0x80080580, 0x82000500, 0x00ffffff, 0x04020041, - 0x59301419, 0x0201f800, 0x001091d9, 0x02000800, - 0x00100615, 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, 0x00108df4, 0x02000800, - 0x00100615, 0x592c0204, 0x82000500, 0x000000ff, - 0x82000580, 0x00000014, 0x04000003, 0x4a02621d, - 0x00000003, 0x42028000, 0x00000003, 0x592c0a08, - 0x0201f800, 0x00104bee, 0x0201f800, 0x00020381, - 0x5c025800, 0x497a6008, 0x4a026403, 0x00000085, - 0x4a026203, 0x00000009, 0x4a026406, 0x00000002, - 0x42000800, 0x8000404b, 0x0201f800, 0x00020855, - 0x5c026000, 0x0401f003, 0x59a80039, 0x48023a05, - 0x497a381c, 0x0201f800, 0x000208b4, 0x5c023800, - 0x1c01f000, 0x4933c857, 0x4c580000, 0x4d2c0000, - 0x59325808, 0x83383580, 0x00000015, 0x04000010, - 0x59342200, 0x84102502, 0x48126a00, 0x0201f800, - 0x00108df4, 0x04000066, 0x0201f800, 0x00109360, - 0x04020005, 0x4200b000, 0x00000002, 0x0201f800, - 0x00109346, 0x0401fa0d, 0x0401f079, 0x83cc1400, - 0x00000008, 0x4200b000, 0x00000002, 0x83341c00, - 0x00000006, 0x0201f800, 0x001082ff, 0x04020015, - 0x83cc1400, 0x0000000a, 0x4200b000, 0x00000002, - 0x83341c00, 0x00000008, 0x0201f800, 0x001082ff, - 0x0402000c, 0x0201f800, 0x00101e1b, 0x59342200, - 0x59cc1007, 0x800811c0, 0x04000003, 0x480a6801, - 0x84102542, 0x8410251a, 0x48126a00, 0x0401f05f, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x00101de2, - 0x5c027800, 0x42000000, 0x0010b663, 0x0201f800, - 0x0010a86e, 0x59340200, 0x84000558, 0x48026a00, - 0x4d300000, 0x0201f800, 0x00020892, 0x02000800, - 0x00100615, 0x49366009, 0x497a6008, 0x4a026406, - 0x00000001, 0x4a026403, 0x00000001, 0x42003000, - 0x00000003, 0x0201f800, 0x0010a766, 0x0201f800, - 0x0010393e, 0x04000011, 0x41782800, 0x42003000, - 0x00000001, 0x4d400000, 0x42028000, 0x00000029, - 0x0201f800, 0x0010a250, 0x5c028000, 0x4a026406, - 0x00000004, 0x4a026203, 0x00000007, 0x4a026420, - 0x00000001, 0x0401f009, 0x4a026203, 0x00000001, - 0x42000800, 0x0000000b, 0x0201f800, 0x001043c7, - 0x0201f800, 0x00106470, 0x5c026000, 0x0201f800, - 0x00108df4, 0x04000022, 0x0201f800, 0x00109360, - 0x04020022, 0x0401f9b1, 0x0401f01d, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x00101de2, 0x42000000, - 0x0010b663, 0x0201f800, 0x0010a86e, 0x59340200, - 0x84000558, 0x48026a00, 0x42003000, 0x00000003, - 0x41782800, 0x42002000, 0x00000005, 0x4d400000, - 0x4d440000, 0x59368c03, 0x42028000, 0x00000029, - 0x0201f800, 0x0010962a, 0x5c028800, 0x5c028000, - 0x5c027800, 0x0201f800, 0x00101e1b, 0x0201f800, - 0x000208b4, 0x0401f002, 0x0401fca9, 0x5c025800, - 0x5c00b000, 0x1c01f000, 0x4933c857, 0x41380000, - 0x83383480, 0x00000056, 0x02021800, 0x00100615, - 0x0c01f001, 0x00107c7e, 0x00107c79, 0x00107c7e, - 0x00107c7e, 0x00107c7e, 0x00107c7e, 0x00107c77, - 0x00107c77, 0x00107c77, 0x00107c77, 0x00107c77, - 0x00107c77, 0x00107c77, 0x00107c77, 0x00107c77, - 0x00107c77, 0x00107c77, 0x00107c77, 0x00107c77, - 0x00107c77, 0x00107c77, 0x00107c77, 0x00107c77, - 0x00107c77, 0x00107c77, 0x00107c77, 0x00107c77, - 0x00107c77, 0x00107c77, 0x00107c77, 0x00107c77, - 0x00107c7e, 0x00107c77, 0x00107c7e, 0x00107c7e, - 0x00107c77, 0x00107c77, 0x00107c77, 0x00107c77, - 0x00107c77, 0x00107c7e, 0x00107c77, 0x00107c77, - 0x00107c77, 0x00107c77, 0x00107c77, 0x00107c77, - 0x00107c77, 0x00107c77, 0x00107c77, 0x00107c7e, - 0x00107c7e, 0x00107c77, 0x00107c77, 0x00107c77, - 0x00107c77, 0x00107c77, 0x00107c77, 0x00107c77, - 0x00107c77, 0x00107c77, 0x00107c7e, 0x00107c77, - 0x00107c77, 0x00107c7e, 0x00107c7e, 0x00107c77, - 0x00107c7e, 0x00107c7e, 0x00107c77, 0x00107c77, - 0x00107c77, 0x00107c77, 0x00107c7e, 0x00107c77, - 0x00107c77, 0x00107c77, 0x00107c7e, 0x00107c77, - 0x00107c77, 0x00107c77, 0x00107c7e, 0x00107c77, - 0x00107c77, 0x00107c77, 0x00107c7e, 0x0201f800, - 0x00100615, 0x4a026203, 0x00000001, 0x493a6403, - 0x0201f000, 0x00106470, 0x4933c857, 0x4a026203, - 0x00000001, 0x493a6403, 0x0201f000, 0x00106470, - 0x59300403, 0x82003480, 0x00000056, 0x02021800, - 0x00100615, 0x83383580, 0x00000013, 0x04000096, - 0x83383580, 0x00000027, 0x0402004c, 0x4933c857, - 0x0201f800, 0x001068f6, 0x0201f800, 0x00108ef1, - 0x0400000b, 0x0201f800, 0x00108f05, 0x04000041, - 0x59300403, 0x82000d80, 0x00000022, 0x04020038, - 0x0401fc61, 0x0400003a, 0x0401f03a, 0x0201f800, - 0x00101e1b, 0x42000800, 0x00000007, 0x0201f800, - 0x001043c7, 0x0401f901, 0x4d440000, 0x59368c03, - 0x83440580, 0x000007fe, 0x04020008, 0x59a81026, - 0x84081540, 0x0201f800, 0x00104e0d, 0x04020002, - 0x8408154a, 0x480b5026, 0x42028000, 0x00000029, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x00101de2, - 0x5c027800, 0x836c0580, 0x00000003, 0x0400000c, - 0x59326809, 0x59340008, 0x800001c0, 0x04020008, - 0x59368c03, 0x4933c857, 0x4937c857, 0x4947c857, - 0x0201f800, 0x00104451, 0x0401f00c, 0x42000000, - 0x0010b663, 0x0201f800, 0x0010a86e, 0x42003000, - 0x00000015, 0x41782800, 0x42002000, 0x00000003, - 0x0201f800, 0x0010962a, 0x5c028800, 0x0201f800, - 0x001090ec, 0x0201f000, 0x000208b4, 0x1c01f000, - 0x0401f8ce, 0x0401f7fa, 0x83380580, 0x00000014, - 0x0400000c, 0x4933c857, 0x0201f800, 0x00106cb4, - 0x02020000, 0x001076fb, 0x59300203, 0x82000580, - 0x00000002, 0x040000ef, 0x0201f800, 0x00100615, - 0x4933c857, 0x0201f800, 0x001068f6, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x00101de2, 0x5c027800, - 0x42003000, 0x00000016, 0x41782800, 0x4d400000, - 0x4d440000, 0x59368c03, 0x42002000, 0x00000009, - 0x42028000, 0x00000029, 0x0201f800, 0x0010962a, - 0x5c028800, 0x5c028000, 0x42000000, 0x0010b663, - 0x0201f800, 0x0010a86e, 0x0201f800, 0x00108ef1, - 0x0402000c, 0x0201f800, 0x00101e1b, 0x0401f89f, - 0x59340c03, 0x82040580, 0x000007fe, 0x040207c8, - 0x59a80826, 0x84040d40, 0x48075026, 0x0401f7c4, - 0x0201f800, 0x00108f05, 0x04020003, 0x0401f893, - 0x0401f7bf, 0x59300403, 0x82000d80, 0x00000032, - 0x04020004, 0x0201f800, 0x001020b2, 0x0401f7b8, - 0x59300403, 0x82000d80, 0x00000022, 0x04000887, - 0x0401f7b3, 0x4933c857, 0x4803c857, 0x0c01f001, - 0x00107da0, 0x00107da0, 0x00107da0, 0x00107da0, - 0x00107da0, 0x00107da0, 0x00107d7a, 0x00107d7a, - 0x00107d7a, 0x00107d7a, 0x00107d7a, 0x00107d7a, - 0x00107d7a, 0x00107d7a, 0x00107d7a, 0x00107d7a, - 0x00107d7a, 0x00107d7a, 0x00107d7a, 0x00107d7a, - 0x00107d7a, 0x00107d7a, 0x00107d7a, 0x00107d7a, - 0x00107d7a, 0x00107d7a, 0x00107d7a, 0x00107d7a, - 0x00107d7a, 0x00107d7a, 0x00107d83, 0x00107da0, - 0x00107d7a, 0x00107da0, 0x00107da0, 0x00107d7a, - 0x00107d7a, 0x00107d7a, 0x00107d7a, 0x00107d7a, - 0x00107da0, 0x00107da0, 0x00107d7a, 0x00107d7a, - 0x00107d7a, 0x00107d7a, 0x00107d7a, 0x00107d7a, - 0x00107d7a, 0x00107d7a, 0x00107d91, 0x00107da0, - 0x00107d7a, 0x00107d8a, 0x00107d7a, 0x00107d7a, - 0x00107d7a, 0x00107d8a, 0x00107d7a, 0x00107d7a, - 0x00107d7a, 0x00107da0, 0x00107d8d, 0x00107d7a, - 0x00107d7c, 0x00107da0, 0x00107d7a, 0x00107da0, - 0x00107da0, 0x00107d7a, 0x00107d7a, 0x00107d7a, - 0x00107d7a, 0x00107da0, 0x00107d7a, 0x00107d7a, - 0x00107d7a, 0x00107da0, 0x00107d7a, 0x00107d7a, - 0x00107d7a, 0x00107da0, 0x00107d7a, 0x00107d7a, - 0x00107d7a, 0x00107da0, 0x0201f800, 0x00100615, - 0x4d2c0000, 0x59325808, 0x0201f800, 0x00020381, - 0x5c025800, 0x0201f000, 0x000208b4, 0x4a026203, - 0x00000005, 0x59a80039, 0x48026205, 0x59a80037, - 0x48026206, 0x1c01f000, 0x5930081e, 0x49780a05, - 0x0401f014, 0x0201f800, 0x001090ec, 0x0201f000, - 0x000208b4, 0x0201f800, 0x001020b2, 0x0201f800, - 0x0010698c, 0x04000005, 0x0201f800, 0x001068f6, - 0x0201f000, 0x000208b4, 0x0201f800, 0x001068f6, - 0x0201f800, 0x000208b4, 0x0201f000, 0x00106982, - 0x4933c857, 0x4a026203, 0x00000002, 0x59a80037, - 0x48026206, 0x1c01f000, 0x4933c857, 0x0201f800, - 0x00108df4, 0x0400002a, 0x4d2c0000, 0x0201f800, - 0x00109360, 0x0402000a, 0x4d400000, 0x42028000, - 0x00000031, 0x42000800, 0x00000004, 0x0201f800, - 0x00109204, 0x5c028000, 0x0401f01c, 0x59300c06, - 0x82040580, 0x00000010, 0x04000004, 0x82040580, - 0x00000011, 0x0402000a, 0x4a025a06, 0x00000031, - 0x4a02580d, 0x00000004, 0x4a02580e, 0x000000ff, - 0x0201f800, 0x00020381, 0x0401f00c, 0x592c0404, - 0x8c00051e, 0x04000009, 0x4a025a04, 0x00000103, - 0x4a025805, 0x01000000, 0x5931d821, 0x58ef400b, - 0x58ec0009, 0x0801f800, 0x5c025800, 0x1c01f000, - 0x4933c857, 0x59340400, 0x82000500, 0x000000ff, - 0x82003480, 0x0000000c, 0x02021800, 0x00100615, - 0x59303403, 0x82180d80, 0x0000004d, 0x02000000, - 0x00109154, 0x82180d80, 0x00000033, 0x02000000, - 0x0010910f, 0x82180d80, 0x00000028, 0x02000000, - 0x00108f46, 0x82180d80, 0x00000029, 0x02000000, - 0x00108f5a, 0x82180d80, 0x0000001f, 0x02000000, - 0x001078af, 0x82180d80, 0x00000055, 0x02000000, - 0x00107888, 0x82180d80, 0x00000000, 0x0400058e, - 0x82180d80, 0x00000022, 0x02000000, 0x001078dc, - 0x82180d80, 0x00000035, 0x02000000, 0x001079d7, - 0x82180d80, 0x00000039, 0x04000536, 0x82180d80, - 0x0000003d, 0x02000000, 0x0010790c, 0x82180d80, - 0x00000044, 0x02000000, 0x00107949, 0x82180d80, - 0x00000049, 0x02000000, 0x0010799e, 0x82180d80, - 0x00000041, 0x02000000, 0x0010798a, 0x82180d80, - 0x00000043, 0x02000000, 0x001092a5, 0x82180d80, - 0x00000051, 0x02000000, 0x0010930b, 0x82180d80, - 0x00000004, 0x04020003, 0x42000000, 0x00000001, - 0x83380d80, 0x00000015, 0x04000006, 0x83380d80, - 0x00000016, 0x02020000, 0x001076fb, 0x0401f226, - 0x4d2c0000, 0x4d3c0000, 0x0c01f804, 0x5c027800, - 0x5c025800, 0x1c01f000, 0x00107e42, 0x00107e46, - 0x00107e42, 0x00107ebb, 0x00107e42, 0x00107fc7, - 0x00108060, 0x00107e42, 0x00107e42, 0x00108029, - 0x00107e42, 0x0010803b, 0x4933c857, 0x497a6007, - 0x59300808, 0x58040000, 0x4a000a04, 0x00000103, - 0x0201f000, 0x000208b4, 0x4933c857, 0x40000000, - 0x40000000, 0x1c01f000, 0x4933c857, 0x59a80016, - 0x82000580, 0x00000074, 0x0402005c, 0x0201f800, - 0x0010a0b1, 0x04020016, 0x0401f85c, 0x0201f800, - 0x00108df4, 0x0400000c, 0x0201f800, 0x00109360, - 0x04020009, 0x41780800, 0x4d400000, 0x42028000, - 0x00000000, 0x0201f800, 0x00109204, 0x5c028000, - 0x0401f003, 0x0201f800, 0x00101e1b, 0x0201f800, - 0x00104711, 0x0201f000, 0x000208b4, 0x0201f800, - 0x00108df4, 0x04000007, 0x0201f800, 0x00109360, - 0x04020004, 0x0401ff3d, 0x0201f000, 0x000208b4, - 0x417a7800, 0x0201f800, 0x00101de2, 0x42000000, - 0x0010b663, 0x0201f800, 0x0010a86e, 0x59340200, - 0x84000558, 0x48026a00, 0x42003000, 0x00000003, - 0x0201f800, 0x0010a766, 0x4d300000, 0x0201f800, - 0x00020892, 0x02000800, 0x00100615, 0x49366009, - 0x497a6008, 0x4a026406, 0x00000001, 0x4a026403, - 0x00000001, 0x0201f800, 0x0010393e, 0x04000011, - 0x4a026406, 0x00000004, 0x4a026203, 0x00000007, - 0x4a026420, 0x00000001, 0x42003000, 0x00000001, - 0x4d400000, 0x42028000, 0x00000029, 0x41782800, - 0x0201f800, 0x0010a250, 0x5c028000, 0x0401f009, - 0x42000800, 0x0000000b, 0x0201f800, 0x001043c7, - 0x4a026203, 0x00000001, 0x0201f800, 0x00106470, - 0x5c026000, 0x0401ff05, 0x0201f800, 0x00101e1b, - 0x0201f000, 0x000208b4, 0x0401ff00, 0x42000000, - 0x00000001, 0x0401f0de, 0x4933c857, 0x59340200, - 0x8c000500, 0x0400000d, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x001043bd, 0x5c027800, 0x0201f800, - 0x0010393e, 0x04000005, 0x42000800, 0x00000006, - 0x0201f800, 0x001043c7, 0x1c01f000, 0x4933c857, - 0x59a80816, 0x82040580, 0x00000074, 0x0400000e, - 0x4807c857, 0x82040580, 0x00000100, 0x040200b7, - 0x59cc0408, 0x4803c857, 0x8c000500, 0x040000b3, - 0x59341403, 0x82080580, 0x000007fe, 0x04000006, - 0x0401f0ae, 0x59341403, 0x82080580, 0x000007fe, - 0x0402001a, 0x59a80026, 0x8c000506, 0x04000015, - 0x59cc0000, 0x82000500, 0x000000ff, 0x59a80810, - 0x82040d00, 0x000000ff, 0x80040580, 0x0400000d, - 0x0201f800, 0x00101e1b, 0x0201f800, 0x000208b4, - 0x42000000, 0x0010b651, 0x0201f800, 0x0010a86e, - 0x4202d800, 0x00000001, 0x0201f000, 0x00103f37, - 0x0401fa9c, 0x0401f04c, 0x0201f800, 0x00104480, - 0x59341403, 0x82080580, 0x000007fc, 0x0402001f, - 0x4a026802, 0x00fffffc, 0x0201f800, 0x00108df4, - 0x04000012, 0x0201f800, 0x00109360, 0x0402000f, - 0x0401f8a9, 0x41780800, 0x4d400000, 0x42028000, - 0x00000000, 0x0201f800, 0x00109204, 0x5c028000, - 0x42000800, 0x00000004, 0x0201f800, 0x001043c7, - 0x0201f000, 0x000208b4, 0x42000800, 0x00000004, - 0x0201f800, 0x001043c7, 0x0201f800, 0x00101e1b, - 0x0201f000, 0x000208b4, 0x59a8006f, 0x8c000502, - 0x04000011, 0x0201f800, 0x00104e0d, 0x42001000, - 0x00000010, 0x04020009, 0x59340002, 0x82000500, - 0x00ff0000, 0x82000580, 0x00ff0000, 0x04000006, - 0x42001000, 0x00000008, 0x0201f800, 0x00104ada, - 0x0402005a, 0x0201f800, 0x00108df4, 0x0400005b, - 0x0201f800, 0x00109360, 0x04020005, 0x592c0404, - 0x8c00051c, 0x040207c9, 0x0401f877, 0x42000800, - 0x00000005, 0x0201f800, 0x001043c7, 0x4a026203, - 0x00000001, 0x4a026403, 0x00000003, 0x0201f000, - 0x00106470, 0x59cc0408, 0x8c000518, 0x04000010, - 0x0201f800, 0x001090ab, 0x0201f800, 0x00104e0d, - 0x04000004, 0x59cc0408, 0x8c000516, 0x040207b3, - 0x59a80026, 0x8400054a, 0x48035026, 0x59a80010, - 0x84000570, 0x48038832, 0x0401f7ac, 0x42001000, - 0x000000ef, 0x480b5010, 0x497b8830, 0x84081570, - 0x480b8832, 0x59c40802, 0x84040d4c, 0x48078802, - 0x0201f800, 0x001090d5, 0x59a80026, 0x84000548, - 0x48035026, 0x0201f800, 0x0010a1ec, 0x0402079b, - 0x59a80026, 0x8400054c, 0x48035026, 0x42000800, - 0x00000006, 0x0201f800, 0x001043c7, 0x417a7800, - 0x0201f800, 0x001043bd, 0x42000000, 0x000000e8, - 0x0201f800, 0x001059b9, 0x02000800, 0x001043fc, - 0x02020800, 0x00100615, 0x49366009, 0x59340200, - 0x8400051a, 0x48026a00, 0x42000800, 0x00000003, - 0x0201f800, 0x001043c7, 0x4a026406, 0x00000001, - 0x4a026203, 0x00000001, 0x4a026403, 0x00000002, - 0x0201f000, 0x00106470, 0x0401fe2c, 0x42000000, - 0x00000001, 0x0401f00a, 0x599c0017, 0x8c00050a, - 0x040007ab, 0x42000800, 0x00000004, 0x0201f800, - 0x001043c7, 0x0201f000, 0x000208b4, 0x4933c857, - 0x80003540, 0x04000005, 0x42000800, 0x00000007, - 0x0201f800, 0x001043c7, 0x801831c0, 0x0402000e, - 0x59302008, 0x801021c0, 0x04000004, 0x58100404, - 0x8c00051e, 0x04020008, 0x59341c03, 0x42002000, - 0x00000004, 0x42003000, 0x00000012, 0x0201f800, - 0x001038c7, 0x0201f800, 0x00101e1b, 0x0201f000, - 0x000208b4, 0x4c5c0000, 0x4d2c0000, 0x59325808, - 0x0201f800, 0x00105439, 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, - 0x59a8006f, 0x8c000502, 0x04000015, 0x0201f800, - 0x00104e0d, 0x42001000, 0x00000010, 0x04020009, - 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, - 0x00ff0000, 0x0400000a, 0x42001000, 0x00000008, - 0x0201f800, 0x00104ada, 0x04000005, 0x59a8006f, - 0x8400054c, 0x4803506f, 0x0401f031, 0x836c0580, - 0x00000003, 0x0402000b, 0x59300008, 0x80000540, - 0x04020008, 0x59341c03, 0x42002000, 0x00000006, - 0x42003000, 0x00000013, 0x0201f800, 0x001038c7, - 0x0201f800, 0x001044e1, 0x0401feb8, 0x0401fa1d, - 0x0402001f, 0x59340404, 0x80000540, 0x0400001c, - 0x42000800, 0x00000006, 0x0201f800, 0x001043c7, - 0x0201f800, 0x00108df4, 0x04000011, 0x0201f800, - 0x00109360, 0x0402000a, 0x41780800, 0x4d400000, - 0x42028000, 0x00000000, 0x0201f800, 0x00109204, - 0x5c028000, 0x0201f000, 0x000208b4, 0x4a025a04, - 0x00000103, 0x4a025805, 0x02000000, 0x0201f800, - 0x00101e1b, 0x0201f000, 0x000208b4, 0x0201f800, - 0x00104a83, 0x0201f800, 0x00108df4, 0x04000007, - 0x0201f800, 0x00109360, 0x04020004, 0x0401fd8b, - 0x0201f000, 0x000208b4, 0x0401fd88, 0x80000580, - 0x59a8006f, 0x8c00050c, 0x04000005, 0x8400050c, - 0x4803506f, 0x82000540, 0x00000001, 0x0401ff60, - 0x1c01f000, 0x4933c857, 0x59a80016, 0x82000580, - 0x00000014, 0x0402000b, 0x42000800, 0x0000000b, - 0x0201f800, 0x001043c7, 0x4a026203, 0x00000001, - 0x4a026403, 0x00000001, 0x0201f000, 0x00106470, - 0x42000000, 0x00000001, 0x0401f74d, 0x4933c857, - 0x40003000, 0x59a80016, 0x82000580, 0x00000004, - 0x0402000a, 0x82183580, 0x0000000b, 0x04020005, - 0x42000800, 0x00000007, 0x0201f800, 0x001043c7, - 0x0201f000, 0x000208b4, 0x42000000, 0x00000001, - 0x0401f73b, 0x4803c857, 0x4d2c0000, 0x4d3c0000, - 0x0c01f804, 0x5c027800, 0x5c025800, 0x1c01f000, - 0x00107e42, 0x0010806f, 0x00107e42, 0x001080c4, - 0x00107e42, 0x00108132, 0x00108060, 0x00107e42, - 0x00107e42, 0x00108152, 0x00107e42, 0x00108162, - 0x4933c857, 0x4d1c0000, 0x59301403, 0x82080580, - 0x00000003, 0x04000008, 0x82081580, 0x0000001e, - 0x04020003, 0x0201f800, 0x000208b4, 0x5c023800, - 0x1c01f000, 0x0401ff5a, 0x0401f7fd, 0x4933c857, - 0x0201f800, 0x00108df4, 0x0400000b, 0x0201f800, - 0x00109360, 0x04020008, 0x4200b000, 0x00000002, - 0x0201f800, 0x00109346, 0x0401fd2c, 0x0201f000, - 0x000208b4, 0x0401f8f5, 0x04020030, 0x417a7800, - 0x0201f800, 0x001043bd, 0x417a7800, 0x0201f800, - 0x00101de2, 0x42000000, 0x0010b663, 0x0201f800, - 0x0010a86e, 0x59340200, 0x84000558, 0x48026a00, - 0x4a026403, 0x00000002, 0x42003000, 0x00000003, - 0x0201f800, 0x0010a766, 0x0201f800, 0x0010393e, - 0x04000011, 0x4d400000, 0x41782800, 0x42003000, - 0x00000005, 0x42028000, 0x00000029, 0x0201f800, - 0x0010a250, 0x5c028000, 0x4a026203, 0x00000007, - 0x4a026406, 0x00000004, 0x4a026420, 0x00000001, - 0x1c01f000, 0x42000800, 0x00000003, 0x0201f800, - 0x001043c7, 0x4a026203, 0x00000001, 0x0201f800, - 0x00106470, 0x0401f7f7, 0x59cc0407, 0x82000580, - 0x00000009, 0x0402000a, 0x59340412, 0x82000500, - 0x000000ff, 0x0400000c, 0x80000040, 0x48026c12, - 0x4a026206, 0x0000000a, 0x0401f7ea, 0x59cc0207, - 0x82000500, 0x0000ff00, 0x82000580, 0x00001900, - 0x040007c2, 0x0401fce5, 0x80000580, 0x0401f6c4, - 0x4933c857, 0x59a80032, 0x80000540, 0x04000015, - 0x59340403, 0x82000580, 0x000007fe, 0x04020011, - 0x59a80010, 0x80000000, 0x48035010, 0x417a7800, - 0x0201f800, 0x001043bd, 0x42000800, 0x00000003, - 0x0201f800, 0x001043c7, 0x4a026203, 0x00000001, - 0x4a026403, 0x00000002, 0x0201f000, 0x00106470, - 0x0201f800, 0x00108df4, 0x04000011, 0x0201f800, - 0x00109360, 0x0402000e, 0x4c580000, 0x4200b000, - 0x00000002, 0x0201f800, 0x00109346, 0x5c00b000, - 0x0401fcbe, 0x42000800, 0x00000007, 0x0201f800, - 0x001043c7, 0x0201f000, 0x000208b4, 0x0401fcb7, - 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, 0x001043c7, 0x0201f800, 0x00101e1b, - 0x0201f000, 0x000208b4, 0x42000000, 0x00000001, - 0x0401f677, 0x0201f800, 0x00108df4, 0x59325808, - 0x04000008, 0x592c0204, 0x82000580, 0x00000139, - 0x040007f6, 0x592c0404, 0x8c00051e, 0x040207f3, - 0x59340403, 0x82000580, 0x000007fe, 0x04020007, - 0x59a80026, 0x84000540, 0x48035026, 0x0201f800, - 0x00104059, 0x0401f7e9, 0x417a7800, 0x0201f800, - 0x00101de2, 0x42003000, 0x00000005, 0x0201f800, - 0x0010a766, 0x42000000, 0x0010b663, 0x0201f800, - 0x0010a86e, 0x0401f7dd, 0x4933c857, 0x0401f84d, - 0x0402000b, 0x42000800, 0x00000005, 0x0201f800, - 0x001043c7, 0x4a026203, 0x00000001, 0x4a026403, - 0x00000003, 0x0201f000, 0x00106470, 0x42000800, - 0x00000004, 0x0201f800, 0x001043c7, 0x0201f800, - 0x00109360, 0x0402000a, 0x4c580000, 0x4200b000, - 0x00000002, 0x0201f800, 0x00109346, 0x5c00b000, - 0x0401fc5a, 0x0201f000, 0x000208b4, 0x0401fc57, - 0x80000580, 0x0401f636, 0x4933c857, 0x0401f82d, - 0x0402000b, 0x42000800, 0x00000009, 0x0201f800, - 0x001043c7, 0x4a026203, 0x00000001, 0x4a026403, - 0x00000005, 0x0201f000, 0x00106470, 0x42000000, - 0x00000001, 0x0401f626, 0x4933c857, 0x0401f81d, - 0x0402000b, 0x42000800, 0x0000000b, 0x0201f800, - 0x001043c7, 0x4a026203, 0x00000001, 0x4a026403, - 0x00000001, 0x0201f000, 0x00106470, 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, 0x0010393e, - 0x0400000c, 0x42028000, 0x0000002a, 0x42028800, - 0x0000ffff, 0x42003000, 0x00000002, 0x0201f800, - 0x0010a258, 0x59a80805, 0x84040d44, 0x48075005, - 0x42028000, 0x0000002a, 0x4d3c0000, 0x42027800, - 0x00000200, 0x0201f800, 0x00101d90, 0x5c027800, - 0x42000000, 0x0010b663, 0x0201f800, 0x0010a86e, - 0x0201f800, 0x00101bf0, 0x4200b000, 0x00000010, - 0x42028800, 0x000007f0, 0x4d2c0000, 0x83440580, - 0x000007fe, 0x04000003, 0x0201f800, 0x00104451, - 0x81468800, 0x8058b040, 0x040207f9, 0x5c025800, - 0x59cc0408, 0x8c00051e, 0x04000004, 0x59a80026, - 0x84000512, 0x48035026, 0x5c028800, 0x5c026800, - 0x0201f800, 0x00104480, 0x4a026802, 0x00fffffe, - 0x59a80826, 0x84040d50, 0x59cc0013, 0x8c00053e, - 0x04000003, 0x8c000536, 0x04000004, 0x59cc0017, - 0x8c000536, 0x04020002, 0x84040d10, 0x48075026, - 0x59cc0800, 0x82040d00, 0x00ffffff, 0x48075010, - 0x80040110, 0x4803501d, 0x48038881, 0x0201f800, - 0x00104e0d, 0x04000007, 0x59cc0009, 0x48035035, - 0x59cc000a, 0x48035036, 0x0201f800, 0x001090ab, - 0x5c00b000, 0x5c028000, 0x1c01f000, 0x4933c857, - 0x4c580000, 0x59a80010, 0x82000500, 0x00ffff00, - 0x04000022, 0x59cc1000, 0x82081500, 0x00ffff00, - 0x80080580, 0x04000004, 0x42000000, 0x0010b639, - 0x0401f016, 0x83cc1400, 0x0000000b, 0x4200b000, - 0x00000002, 0x83341c00, 0x00000006, 0x0401f904, - 0x04000004, 0x42000000, 0x0010b63a, 0x0401f00b, - 0x83cc1400, 0x0000000d, 0x4200b000, 0x00000002, - 0x83341c00, 0x00000008, 0x0401f8f9, 0x04000007, - 0x42000000, 0x0010b63b, 0x0201f800, 0x0010a86e, - 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, 0x0010cfc0, 0x59a8000e, 0x81640480, - 0x040210c1, 0x8d3e7d12, 0x04000004, 0x405c0000, - 0x81300580, 0x040000b7, 0x59300406, 0x82000c80, - 0x00000012, 0x04021015, 0x59326809, 0x0c01f001, - 0x001082f4, 0x0010825f, 0x00108278, 0x00108283, - 0x00108258, 0x00108271, 0x001082ac, 0x001082f4, - 0x00108256, 0x001082c0, 0x001082cf, 0x00108256, - 0x00108256, 0x00108256, 0x00108256, 0x001082f4, - 0x001082e5, 0x001082dd, 0x0201f800, 0x00100615, - 0x8d3e7d18, 0x04000003, 0x8d3e7d16, 0x04000004, - 0x59300420, 0x8c000500, 0x04020096, 0x59300403, - 0x82000580, 0x00000043, 0x04000092, 0x0201f800, - 0x00108ef1, 0x02000800, 0x00101e1b, 0x0201f800, - 0x00108f05, 0x02000800, 0x00107da6, 0x8d3e7d06, - 0x04000086, 0x0201f800, 0x0010909d, 0x04000085, - 0x0401f082, 0x8d3e7d18, 0x04000003, 0x8d3e7d16, - 0x04000004, 0x59300420, 0x8c000500, 0x0402007d, - 0x59325808, 0x0201f800, 0x00108df4, 0x04000077, - 0x49425a06, 0x497a5c09, 0x0201f800, 0x00020381, - 0x0201f800, 0x00108ee7, 0x0401f070, 0x813669c0, - 0x02000800, 0x00100615, 0x8d3e7d06, 0x04000004, - 0x59340200, 0x8c00050e, 0x0402006a, 0x59300004, - 0x8400055c, 0x48026004, 0x59300203, 0x82000580, - 0x00000004, 0x02000800, 0x00100ee4, 0x59325808, - 0x0201f800, 0x00108df4, 0x0400005c, 0x4a025a04, - 0x00000103, 0x59300402, 0x48025c06, 0x592c0408, - 0x8c000512, 0x04000006, 0x4d2c0000, 0x592e5809, - 0x0201f800, 0x00100843, 0x5c025800, 0x49425a06, - 0x497a5c09, 0x0201f800, 0x00109365, 0x0201f800, - 0x00020381, 0x0201f800, 0x00108ee7, 0x0401f047, - 0x8c000518, 0x04000047, 0x59300203, 0x82000580, - 0x00000004, 0x02000800, 0x00100ee4, 0x59325808, - 0x0201f800, 0x00108df4, 0x0400003c, 0x49425a06, - 0x497a5c09, 0x0201f800, 0x0010a4ae, 0x0201f800, - 0x00109365, 0x0201f800, 0x00020381, 0x0401f033, - 0x0201f800, 0x0010600e, 0x04000032, 0x59300203, - 0x82000580, 0x00000004, 0x04020004, 0x0201f800, - 0x00100ee4, 0x0401f02b, 0x42027000, 0x00000047, - 0x0201f800, 0x000208d8, 0x0401f026, 0x59300203, - 0x82000580, 0x00000004, 0x02000800, 0x00100ee4, - 0x59325808, 0x0201f800, 0x00108df4, 0x0400001b, - 0x49425a06, 0x497a5c09, 0x0201f800, 0x00020381, - 0x0401f016, 0x833c0500, 0x00001800, 0x04000015, - 0x8d3e7d16, 0x04020013, 0x59325817, 0x0201f800, - 0x00100843, 0x59300203, 0x82000580, 0x00000004, - 0x02000800, 0x00100ee4, 0x59325808, 0x0201f800, - 0x00108df4, 0x04000005, 0x49425a06, 0x497a5c09, - 0x0201f800, 0x00020381, 0x0201f800, 0x00107698, - 0x83326400, 0x00000024, 0x41580000, 0x81300480, - 0x0400173e, 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, 0x00100615, - 0x83380480, 0x0000004b, 0x02001800, 0x00100615, - 0x0c01f001, 0x0010832f, 0x0010832f, 0x0010832f, - 0x0010832f, 0x0010832d, 0x0010832d, 0x0010832d, - 0x0010832f, 0x0201f800, 0x00100615, 0x493bc857, - 0x4a026203, 0x0000000d, 0x493a6403, 0x42000800, - 0x80000000, 0x0201f000, 0x00020855, 0x83380580, - 0x00000013, 0x04020008, 0x59300403, 0x82000580, - 0x00000050, 0x02020800, 0x00100615, 0x0201f000, - 0x000208b4, 0x4933c857, 0x83380580, 0x00000027, - 0x04020030, 0x4933c857, 0x0201f800, 0x001068f6, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x00101de2, - 0x5c027800, 0x42000000, 0x0010b663, 0x0201f800, - 0x0010a86e, 0x4d2c0000, 0x59325808, 0x0201f800, - 0x00108df4, 0x492fc857, 0x0400000d, 0x4a025a04, - 0x00000103, 0x59300c02, 0x48065c06, 0x4a025a06, - 0x00000029, 0x497a5c09, 0x592c0c08, 0x84040d50, - 0x48065c08, 0x0201f800, 0x00020381, 0x5c025800, - 0x42003000, 0x00000015, 0x41782800, 0x42002000, - 0x00000003, 0x4d400000, 0x4d440000, 0x59368c03, - 0x42028000, 0x00000029, 0x0201f800, 0x0010962a, - 0x5c028800, 0x5c028000, 0x0201f000, 0x000208b4, - 0x83380580, 0x00000014, 0x0402000d, 0x59300403, - 0x82000c80, 0x00000053, 0x02021800, 0x00100615, - 0x82000480, 0x00000040, 0x02001800, 0x00100615, - 0x4933c857, 0x4803c857, 0x0c01f00e, 0x83380580, - 0x00000053, 0x0400000a, 0x83380580, 0x00000048, - 0x02020800, 0x00100615, 0x59300403, 0x82000580, - 0x00000050, 0x02020800, 0x00100615, 0x1c01f000, - 0x001083a5, 0x001083a3, 0x001083a3, 0x001083a3, - 0x001083a3, 0x001083a3, 0x001083a3, 0x001083a3, - 0x001083a3, 0x001083a3, 0x001083a3, 0x001083bc, - 0x001083bc, 0x001083bc, 0x001083bc, 0x001083a3, - 0x001083bc, 0x001083a3, 0x001083bc, 0x0201f800, - 0x00100615, 0x4933c857, 0x0201f800, 0x001068f6, - 0x0201f800, 0x00108df4, 0x02000000, 0x000208b4, - 0x4d2c0000, 0x59325808, 0x4a025a04, 0x00000103, - 0x59300402, 0x48025c06, 0x4a025a06, 0x00000006, - 0x497a5c09, 0x0201f800, 0x00020381, 0x5c025800, - 0x0201f800, 0x00108ee7, 0x0201f000, 0x000208b4, - 0x4933c857, 0x0201f800, 0x001068f6, 0x0201f000, - 0x000208b4, 0x0201f800, 0x00100615, 0x5930001c, - 0x800001c0, 0x02020800, 0x0010961a, 0x59300004, - 0x8c00053e, 0x04020029, 0x59325808, 0x592c0c08, - 0x59cc2a08, 0x82141d00, 0x00000c00, 0x04000002, - 0x59cc1809, 0x84040d58, 0x48065c08, 0x82143500, - 0x00000fff, 0x04020027, 0x59340200, 0x8c00050e, - 0x04020080, 0x0201f800, 0x00020962, 0x04020006, - 0x4a025a06, 0x00000000, 0x59300811, 0x800409c0, - 0x04020951, 0x4a025a04, 0x00000103, 0x48065807, - 0x480e580a, 0x48165c09, 0x59300c02, 0x48065c06, - 0x0201f800, 0x00020381, 0x0201f800, 0x00104801, - 0x59cc0208, 0x8c000518, 0x02020000, 0x00108f88, - 0x0201f000, 0x000208b4, 0x0201f800, 0x00106cb4, - 0x040007d6, 0x4d3c0000, 0x42027800, 0x00000002, - 0x0201f800, 0x00108997, 0x5c027800, 0x0401f7cf, - 0x4817c857, 0x480fc857, 0x82180500, 0x000000ff, - 0x0400000e, 0x592c0204, 0x82000500, 0x000000ff, - 0x82000580, 0x00000048, 0x04020008, 0x592c0407, - 0x800001c0, 0x04000005, 0x0201f800, 0x0010950b, - 0x0201f000, 0x00109553, 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, 0x00108953, 0x5c00a800, - 0x5c00a000, 0x0401f7a5, 0x59300011, 0x59301402, - 0x480a5c06, 0x48025807, 0x480e580a, 0x48165c09, - 0x0201f800, 0x001088fc, 0x0201f800, 0x00108938, - 0x0401f7a6, 0x592c020a, 0x8c000502, 0x040007cd, - 0x592c0208, 0x8c00050e, 0x040207ca, 0x59300011, - 0x800c0d80, 0x040007c7, 0x4803c857, 0x480fc857, - 0x8c183514, 0x02000000, 0x00108fc6, 0x80000540, - 0x040007c0, 0x4807c856, 0x0201f000, 0x00108fc6, - 0x592c020a, 0x8c000502, 0x04000782, 0x59300011, - 0x800001c0, 0x0400077f, 0x592c0208, 0x8c00050e, - 0x0402077c, 0x0201f000, 0x00108fc6, 0x59cc2006, - 0x59cc2807, 0x0401f037, 0x0401f036, 0x1c01f000, - 0x4933c857, 0x5930001c, 0x800001c0, 0x02020800, - 0x0010961a, 0x59325808, 0x592c0c08, 0x41782800, - 0x41781800, 0x84040d58, 0x48065c08, 0x41783000, - 0x59340200, 0x8c00050e, 0x0402001a, 0x0201f800, - 0x00020962, 0x04020007, 0x4a025a06, 0x00000000, - 0x59300811, 0x4807c857, 0x800409c0, 0x040208b2, - 0x4a025a04, 0x00000103, 0x48065807, 0x480e580a, - 0x48165c09, 0x4933c857, 0x59300c02, 0x48065c06, - 0x0201f800, 0x00109365, 0x0201f800, 0x00020381, - 0x0201f800, 0x00104801, 0x0201f000, 0x000208b4, - 0x592c020a, 0x8c000502, 0x040007e8, 0x59300011, - 0x4803c857, 0x800001c0, 0x040007e4, 0x592c0208, - 0x8c00050e, 0x040207e1, 0x0201f000, 0x00108fc6, - 0x5930001c, 0x800001c0, 0x4c100000, 0x4c140000, - 0x02020800, 0x0010961a, 0x5c002800, 0x5c002000, - 0x4a026203, 0x00000002, 0x4a026403, 0x00000043, - 0x59325808, 0x592c020a, 0x8c000502, 0x0402001c, - 0x40100000, 0x592c080f, 0x80040c80, 0x40140000, - 0x80040480, 0x04001018, 0x59300004, 0x8c00053e, - 0x0402000a, 0x48126013, 0x48166011, 0x497a6205, - 0x0201f800, 0x00100fe1, 0x0402000d, 0x59300804, - 0x0201f000, 0x00106466, 0x4c100000, 0x4c140000, - 0x0201f800, 0x00106cb4, 0x5c002800, 0x5c002000, - 0x040007f1, 0x0201f000, 0x001076fb, 0x4933c857, - 0x1c01f000, 0x4807c857, 0x40042800, 0x0401f7e7, - 0x83380480, 0x00000058, 0x04021005, 0x83380480, - 0x00000040, 0x04001002, 0x0c01f002, 0x1c01f000, - 0x001084ec, 0x001084ec, 0x001084ec, 0x001084ec, - 0x001084ec, 0x001084ec, 0x001084ec, 0x001084ec, - 0x001084ec, 0x001084ec, 0x001084ee, 0x001084ec, - 0x001084ec, 0x001084ec, 0x001084ec, 0x001084fb, - 0x001084ec, 0x001084ec, 0x001084ec, 0x001084ec, - 0x00108529, 0x001084ec, 0x001084ec, 0x001084ec, - 0x0201f800, 0x00100615, 0x4933c857, 0x0201f800, - 0x00106b13, 0x4a026203, 0x00000002, 0x59a80039, - 0x48026205, 0x59300011, 0x59300815, 0x80040c80, - 0x48066015, 0x0201f000, 0x001068c1, 0x4933c857, - 0x0201f800, 0x001068c1, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x00101de2, 0x5c027800, 0x42000000, - 0x0010b663, 0x0201f800, 0x0010a86e, 0x0201f800, - 0x00108df4, 0x04000010, 0x4d2c0000, 0x59325808, - 0x4a025a04, 0x00000103, 0x59300402, 0x48025c06, - 0x4a025a06, 0x00000029, 0x497a5c09, 0x592c0c08, - 0x84040d50, 0x48065c08, 0x0201f800, 0x00020381, - 0x5c025800, 0x42003000, 0x00000014, 0x41782800, - 0x4d400000, 0x4d440000, 0x59368c03, 0x42002000, - 0x00000002, 0x42028000, 0x00000029, 0x0201f800, - 0x0010962a, 0x5c028800, 0x5c028000, 0x0201f000, - 0x000208b4, 0x4933c857, 0x59300808, 0x49780c09, - 0x4978080a, 0x58041408, 0x84081558, 0x48080c08, - 0x1c01f000, 0x4807c857, 0x8c040d3e, 0x04020024, - 0x497a5a06, 0x5930001f, 0x80000540, 0x04000018, - 0x497a5a06, 0x4c040000, 0x4c080000, 0x4c0c0000, - 0x4c100000, 0x4c140000, 0x40002800, 0x58141003, - 0x40040000, 0x80081480, 0x48082803, 0x40140000, - 0x0201f800, 0x00100d9a, 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, 0x00100d9a, - 0x5c000800, 0x0401f7f5, 0x4807c856, 0x4a025a06, - 0x00000007, 0x1c01f000, 0x83380480, 0x00000058, - 0x04021007, 0x83380480, 0x00000040, 0x04001004, - 0x4d2c0000, 0x0c01f803, 0x5c025800, 0x1c01f000, - 0x00108588, 0x00108588, 0x00108588, 0x00108588, - 0x00108588, 0x0010858a, 0x00108588, 0x00108588, - 0x0010860d, 0x00108588, 0x00108588, 0x00108588, - 0x00108588, 0x00108588, 0x00108588, 0x00108588, - 0x00108588, 0x00108588, 0x00108588, 0x001086c5, - 0x001086ee, 0x001086cd, 0x00108588, 0x001086fa, - 0x0201f800, 0x00100615, 0x5930001c, 0x800001c0, - 0x02020800, 0x0010961a, 0x59300007, 0x8c00050e, - 0x0400007c, 0x8c000500, 0x0400006e, 0x8c00051c, - 0x04000009, 0x84000500, 0x48026007, 0x59325808, - 0x592c3c08, 0x841c3d58, 0x481e5c08, 0x0201f000, - 0x00020914, 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, 0x0010950b, - 0x0201f000, 0x00100ea1, 0x48065c09, 0x41782000, - 0x82040500, 0x00000c00, 0x04000002, 0x59cc2009, - 0x82043500, 0x00000fff, 0x04020027, 0x481e5c08, - 0x4a025a06, 0x00000000, 0x801831c0, 0x02000000, - 0x00100ea1, 0x41782000, 0x8c183510, 0x04000002, - 0x59cc200b, 0x4812580c, 0x41780000, 0x8c183512, - 0x04000002, 0x59cc000a, 0x4802580b, 0x80100c00, - 0x02001800, 0x00100615, 0x02000000, 0x00100ea1, - 0x82041480, 0x0000001d, 0x0402100c, 0x4c500000, - 0x4c540000, 0x83cca400, 0x0000000c, 0x832cac00, - 0x0000000d, 0x0401fb6e, 0x5c00a800, 0x5c00a000, - 0x0201f000, 0x00100ea1, 0x0401fb12, 0x0201f000, - 0x00100ea1, 0x412c7800, 0x0201f800, 0x0010082a, - 0x02000800, 0x00100615, 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, 0x00109553, 0x4a025a06, - 0x00000000, 0x8c040d1e, 0x04000027, 0x41780800, - 0x497a5c09, 0x592c1c09, 0x59300011, 0x59341200, - 0x497a6205, 0x8c08150e, 0x0402006e, 0x4807c857, - 0x4806580a, 0x80000d40, 0x04020f03, 0x59300402, - 0x48025c06, 0x48065807, 0x4a025a04, 0x00000103, - 0x4c040000, 0x4c0c0000, 0x4c100000, 0x0201f800, - 0x00109365, 0x5c002000, 0x5c001800, 0x5c000800, - 0x8c102512, 0x0402001a, 0x4c0c0000, 0x0201f800, - 0x00020381, 0x0201f800, 0x00104801, 0x5c001800, - 0x8c0c1d18, 0x02000000, 0x000208b4, 0x0201f000, - 0x00108f88, 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, 0x00100843, 0x403e5800, 0x0401fad1, - 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, 0x0401fad2, 0x5c007800, 0x5c002000, - 0x5c00a800, 0x5c00a000, 0x84102512, 0x48125c08, - 0x403e5800, 0x0201f800, 0x00100843, 0x42034000, - 0x0010b2a0, 0x59a1d81e, 0x80edd9c0, 0x02000800, - 0x00100615, 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, - 0x4c100000, 0x4c3c0000, 0x4d400000, 0x592e8206, - 0x4a025a06, 0x00000001, 0x0201f800, 0x00109365, - 0x49425a06, 0x5c028000, 0x5c007800, 0x5c002000, - 0x497a5c09, 0x8c102512, 0x04000006, 0x4d2c0000, - 0x403e5800, 0x0201f800, 0x00100843, 0x5c025800, - 0x82102500, 0xffffedff, 0x48125c08, 0x0201f000, - 0x00108fc6, 0x59325808, 0x592c0408, 0x8c000518, - 0x04000004, 0x412df800, 0x0201f000, 0x00100eba, - 0x1c01f000, 0x4933c857, 0x59325808, 0x497a5c09, - 0x4a025a06, 0x00000000, 0x4a025a04, 0x00000103, - 0x59300811, 0x4807c857, 0x800409c0, 0x0402000a, - 0x48065807, 0x59300c02, 0x48065c06, 0x0201f800, - 0x00020381, 0x0201f800, 0x00104801, 0x0201f000, - 0x000208b4, 0x59340200, 0x8c00050e, 0x04020005, - 0x59300811, 0x0401fe4c, 0x48065807, 0x0401f7f2, - 0x592c0208, 0x8c00050e, 0x040207fa, 0x4933c857, - 0x0201f000, 0x00108fc6, 0x4933c857, 0x59325808, - 0x812e59c0, 0x02000800, 0x00100615, 0x592c020a, - 0x8c000502, 0x02000800, 0x00100615, 0x4a026206, - 0x00000002, 0x1c01f000, 0x5930001c, 0x800001c0, - 0x02020800, 0x0010961a, 0x59300007, 0x4933c857, - 0x4803c857, 0x8c00050e, 0x04000037, 0x8c000500, - 0x04000029, 0x8c00051c, 0x0400000a, 0x84000500, - 0x48026007, 0x59325808, 0x592c3c08, 0x481fc857, - 0x841c3d58, 0x481e5c08, 0x0201f000, 0x00020914, - 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, - 0x00100ea1, 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, - 0x000208b4, 0x493bc857, 0x1c01f000, 0x00108763, - 0x00108763, 0x00108763, 0x00108763, 0x00108763, - 0x00108765, 0x00108763, 0x00108763, 0x00108763, - 0x00108763, 0x00108763, 0x00108763, 0x00108763, - 0x00108763, 0x00108763, 0x00108763, 0x00108763, - 0x00108763, 0x00108763, 0x00108763, 0x0010876a, - 0x00108763, 0x00108763, 0x00108763, 0x0201f800, - 0x00100615, 0x59cc0a08, 0x497a5807, 0x4807c857, - 0x82040d00, 0x00000fff, 0x59300402, 0x48025c06, - 0x4a025a04, 0x00000103, 0x48065c09, 0x4a025a06, - 0x00000000, 0x800409c0, 0x02000000, 0x00020381, - 0x59cc0009, 0x4802580a, 0x82042500, 0x00000100, - 0x04000002, 0x59cc200b, 0x4812580c, 0x82040500, - 0x00000200, 0x04000002, 0x59cc000a, 0x4802580b, - 0x80100c00, 0x02001800, 0x00100615, 0x02000000, - 0x00020381, 0x82041480, 0x0000001d, 0x04001006, - 0x592c0404, 0x8c00051e, 0x0400000e, 0x42000800, - 0x0000001c, 0x4c500000, 0x4c540000, 0x83cca400, - 0x0000000c, 0x832cac00, 0x0000000d, 0x0401f9c0, - 0x5c00a800, 0x5c00a000, 0x0201f000, 0x00020381, - 0x0401f964, 0x0401f19f, 0x83380480, 0x00000093, - 0x02021800, 0x00100615, 0x83380480, 0x00000085, - 0x02001800, 0x00100615, 0x0c01f001, 0x001087b2, - 0x001087b0, 0x001087b0, 0x001087b9, 0x001087b0, - 0x001087b0, 0x001087b0, 0x001087b0, 0x001087b0, - 0x001087b0, 0x001087b0, 0x001087b0, 0x001087b0, - 0x0201f800, 0x00100615, 0x4a026203, 0x00000001, - 0x493a6403, 0x42000800, 0x80000040, 0x0201f000, - 0x00020855, 0x4933c857, 0x59cc1404, 0x0201f800, - 0x001091d9, 0x0400001b, 0x591c0203, 0x82000580, - 0x00000000, 0x04000017, 0x591c0009, 0x81340580, - 0x04020014, 0x4d300000, 0x4d1c0000, 0x411e6000, - 0x0401f9c3, 0x5c023800, 0x5c026000, 0x0400000b, - 0x59cc0005, 0x8c000500, 0x04020003, 0x0401f98d, - 0x0401f003, 0x4a023a03, 0x00000002, 0x4a026403, - 0x00000086, 0x0401f005, 0x0401f9a7, 0x040007f5, - 0x4a026403, 0x00000087, 0x4a026203, 0x00000001, - 0x42000800, 0x80000040, 0x0201f800, 0x00020855, - 0x59340200, 0x8c00050e, 0x0400000d, 0x59cc1404, - 0x0201f800, 0x001091d9, 0x04000009, 0x591c0414, - 0x8c00051a, 0x04000006, 0x4d300000, 0x411e6000, - 0x0201f800, 0x00108fdb, 0x5c026000, 0x1c01f000, - 0x83380580, 0x00000013, 0x0402000b, 0x59300403, - 0x4803c857, 0x82000d80, 0x00000086, 0x04000012, - 0x82000d80, 0x00000087, 0x02020800, 0x00100615, - 0x0401f00d, 0x83380580, 0x00000027, 0x04000005, - 0x83380580, 0x00000014, 0x02020800, 0x00100615, - 0x493bc857, 0x0201f800, 0x001068f6, 0x0201f000, - 0x00107698, 0x4933c857, 0x0201f000, 0x00107698, - 0x83380580, 0x00000013, 0x04020005, 0x59300403, - 0x82000480, 0x00000085, 0x0c01f04d, 0x83380580, - 0x00000027, 0x04020041, 0x4933c857, 0x0201f800, - 0x001068f6, 0x4d3c0000, 0x417a7800, 0x0201f800, - 0x00101de2, 0x5c027800, 0x42003000, 0x00000015, - 0x41782800, 0x42002000, 0x00000003, 0x42028000, - 0x00000029, 0x4d400000, 0x4d440000, 0x59368c03, - 0x0201f800, 0x0010962a, 0x5c028800, 0x5c028000, - 0x42000000, 0x0010b663, 0x0201f800, 0x0010a86e, - 0x0201f800, 0x00108df4, 0x0400000c, 0x4d2c0000, - 0x59325808, 0x4a025a04, 0x00000103, 0x59300402, - 0x48025c06, 0x497a5c09, 0x49425a06, 0x0201f800, - 0x00020381, 0x5c025800, 0x0201f800, 0x00108ee7, - 0x0201f000, 0x000208b4, 0x83380580, 0x00000089, - 0x04000005, 0x83380580, 0x0000008a, 0x02020000, - 0x001076fb, 0x0201f800, 0x00106cb4, 0x02020000, - 0x001076fb, 0x59300a03, 0x82040580, 0x0000000a, - 0x0400002a, 0x82040580, 0x0000000c, 0x04000027, - 0x0201f800, 0x00100615, 0x83380580, 0x00000014, - 0x040207ea, 0x4933c857, 0x0201f800, 0x001068f6, - 0x42028000, 0x00000006, 0x0401f7d2, 0x0010886e, - 0x0010886c, 0x0010886c, 0x0010886c, 0x0010886c, - 0x0010886c, 0x00108874, 0x0010886c, 0x0010886c, - 0x0010886c, 0x0010886c, 0x0010886c, 0x0010886c, - 0x0201f800, 0x00100615, 0x4933c857, 0x59a80037, - 0x48026206, 0x4a026203, 0x0000000a, 0x1c01f000, - 0x4933c857, 0x59a80037, 0x48026206, 0x4a026203, - 0x0000000c, 0x1c01f000, 0x83380580, 0x00000089, - 0x04000008, 0x83380580, 0x0000008a, 0x04000032, - 0x4933c857, 0x493bc857, 0x0201f000, 0x001076fb, - 0x4933c857, 0x59325808, 0x59300a1d, 0x82040580, - 0x00000003, 0x04020004, 0x0201f800, 0x00104801, - 0x0401f00c, 0x5930021d, 0x82000580, 0x00000001, - 0x04020008, 0x59300c16, 0x82040580, 0x00000039, - 0x0400002c, 0x82040580, 0x00000035, 0x04000029, - 0x4c5c0000, 0x4130b800, 0x0201f800, 0x00020892, - 0x04000010, 0x4a026203, 0x00000001, 0x4a026403, - 0x0000001e, 0x59cc0c07, 0x48066419, 0x59cc0a07, - 0x48066219, 0x49366009, 0x4a026406, 0x00000001, - 0x42000800, 0x80000040, 0x0201f800, 0x00020855, - 0x405e6000, 0x0201f800, 0x000208b4, 0x5c00b800, - 0x1c01f000, 0x4933c857, 0x5930021d, 0x82000580, - 0x00000001, 0x04020040, 0x59300c16, 0x82040580, - 0x00000035, 0x04000007, 0x82040580, 0x0000001e, - 0x04000004, 0x82040580, 0x00000039, 0x04020036, - 0x4933c857, 0x4c500000, 0x4d1c0000, 0x4130a000, - 0x40067000, 0x0201f800, 0x00109183, 0x04020029, - 0x0201f800, 0x00020892, 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, 0x00020855, - 0x40526000, 0x5c023800, 0x5c00a000, 0x0201f000, - 0x000208b4, 0x5930021d, 0x82000580, 0x00000003, - 0x02000800, 0x00104801, 0x0201f000, 0x000208b4, - 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, 0x00100843, 0x0201f800, 0x0010082a, - 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, 0x00020381, 0x403e5800, - 0x0401f7f9, 0x5c007800, 0x0201f800, 0x00020381, - 0x5c025800, 0x1c01f000, 0x4803c856, 0x4c580000, - 0x82040c00, 0x00000003, 0x8004b104, 0x0201f800, - 0x0010a93e, 0x5c00b000, 0x1c01f000, 0x4803c856, - 0x4c580000, 0x82040c00, 0x00000003, 0x8004b104, - 0x0201f800, 0x0010a93e, 0x5c00b000, 0x1c01f000, - 0x591c0c06, 0x82040580, 0x00000003, 0x04000004, - 0x82040580, 0x00000002, 0x0402001a, 0x4d300000, - 0x4d2c0000, 0x411e6000, 0x59325808, 0x0201f800, - 0x00108df4, 0x0400000f, 0x4d400000, 0x42028000, - 0x00000013, 0x592c0a08, 0x84040d54, 0x0201f800, - 0x00104bee, 0x5c028000, 0x0201f800, 0x00109365, - 0x0201f800, 0x00020381, 0x0201f800, 0x00108ee7, - 0x0201f800, 0x00107698, 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, 0x00100615, - 0x0c01f80a, 0x5c027800, 0x1c01f000, 0x4933c857, - 0x59300406, 0x82000c80, 0x00000012, 0x02021800, - 0x00100615, 0x0c01f001, 0x001089b5, 0x001089b2, - 0x001089b2, 0x001089dd, 0x001089b0, 0x001089b2, - 0x001089ce, 0x001089b2, 0x001089b0, 0x0010632c, - 0x001089b2, 0x001089b2, 0x001089b2, 0x001089b0, - 0x001089b0, 0x001089b0, 0x00108aad, 0x001089b2, - 0x0201f800, 0x00100615, 0x4803c856, 0x80000580, - 0x1c01f000, 0x4803c856, 0x8d3e7d02, 0x04020016, - 0x0201f800, 0x00108df4, 0x0400000f, 0x59325808, - 0x41780800, 0x4d400000, 0x42028000, 0x00000005, - 0x0201f800, 0x00104bee, 0x5c028000, 0x0201f800, - 0x00109365, 0x0201f800, 0x00108f83, 0x0201f800, - 0x00020381, 0x0201f800, 0x00107698, 0x82000540, - 0x00000001, 0x1c01f000, 0x4933c857, 0x0201f800, - 0x00104728, 0x0402000c, 0x4d400000, 0x42028000, - 0x00000010, 0x0201f800, 0x00109fc0, 0x4a026406, - 0x00000006, 0x4a026203, 0x00000007, 0x5c028000, - 0x1c01f000, 0x4933c857, 0x0201f800, 0x0010698c, - 0x4df00000, 0x0401f8b8, 0x82000c80, 0x0000000e, - 0x02021800, 0x00100615, 0x0c01f001, 0x001089f7, - 0x00108a64, 0x00108a0e, 0x00108a77, 0x00108a5f, - 0x001089f5, 0x001089f7, 0x001089f7, 0x001089fb, - 0x001089f7, 0x001089f7, 0x001089f7, 0x001089f7, - 0x00108a0e, 0x0201f800, 0x00100615, 0x5c03e000, - 0x02000800, 0x00106982, 0x0401f7b8, 0x5c03e000, - 0x02000800, 0x00106982, 0x59300406, 0x82000580, - 0x00000003, 0x040207b4, 0x59300203, 0x82000580, - 0x0000000d, 0x040007b0, 0x8d3e7d02, 0x040207ae, - 0x4d340000, 0x59326809, 0x0201f800, 0x00104801, - 0x5c026800, 0x0401f7a8, 0x59300004, 0x8400055c, - 0x48026004, 0x0201f800, 0x00106982, 0x59300406, - 0x82000580, 0x00000006, 0x04000043, 0x8d3e7d02, - 0x04020041, 0x497a621d, 0x59300203, 0x82000580, - 0x0000000d, 0x04000003, 0x4a02621d, 0x00000003, - 0x0401fbd4, 0x04000024, 0x4d2c0000, 0x4d400000, - 0x59325808, 0x0201f800, 0x00108f83, 0x592c0408, - 0x8c000512, 0x04000009, 0x4d2c0000, 0x84000512, - 0x48025c08, 0x592c0809, 0x40065800, 0x0201f800, - 0x00100843, 0x5c025800, 0x4d400000, 0x42028000, - 0x00000005, 0x592c0a08, 0x8c040d0e, 0x04000004, - 0x42028000, 0x00000002, 0x0401f001, 0x0201f800, - 0x00104bee, 0x5c028000, 0x0201f800, 0x00109365, - 0x0201f800, 0x00020381, 0x497a6008, 0x5c028000, - 0x5c025800, 0x8d3e7d00, 0x04000009, 0x4d340000, - 0x59326809, 0x0201f800, 0x00104801, 0x5c026800, - 0x0201f800, 0x00107698, 0x0401f00b, 0x4a026403, - 0x00000085, 0x4a026203, 0x00000009, 0x4a026406, - 0x00000002, 0x42000800, 0x8000404b, 0x0201f800, - 0x00020855, 0x5c03e000, 0x02020800, 0x0010698c, - 0x82000540, 0x00000001, 0x1c01f000, 0x0201f800, - 0x00106982, 0x0201f800, 0x00100ee4, 0x0401f7ab, - 0x598c000d, 0x81300580, 0x04020004, 0x0201f800, - 0x00106be2, 0x0402001b, 0x0201f800, 0x00106619, - 0x04020006, 0x59300c03, 0x82040580, 0x00000040, - 0x0400078b, 0x0401f79d, 0x0201f800, 0x001068a3, - 0x04000010, 0x0201f800, 0x00100615, 0x0401f813, - 0x04020004, 0x0201f800, 0x00106bb2, 0x04020009, - 0x0201f800, 0x001064f6, 0x040207f4, 0x59300c03, - 0x82040580, 0x00000040, 0x04000779, 0x0401f78b, - 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, - 0x00100615, 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, 0x0010698c, - 0x4df00000, 0x59300203, 0x82000c80, 0x0000000e, - 0x02021800, 0x00100615, 0x0c01f001, 0x00108ac7, - 0x00108ae4, 0x00108acb, 0x00108ac5, 0x00108ac5, - 0x00108ac5, 0x00108ac5, 0x00108ac5, 0x00108ac5, - 0x00108ac5, 0x00108ac5, 0x00108ac5, 0x00108ac5, - 0x00108ac5, 0x0201f800, 0x00100615, 0x5c03e000, - 0x02000800, 0x00106982, 0x0401f6e8, 0x5c03e000, - 0x02000800, 0x00106982, 0x4d2c0000, 0x59325808, - 0x59300403, 0x82000580, 0x00000052, 0x02000800, - 0x00101281, 0x0401fb1f, 0x02000800, 0x00100615, - 0x4a025a06, 0x00000005, 0x0201f800, 0x00020381, - 0x0201f800, 0x00104a83, 0x0201f800, 0x00107698, - 0x5c025800, 0x82000540, 0x00000001, 0x1c01f000, - 0x598c000d, 0x81300580, 0x0402001a, 0x59300004, - 0x8c000520, 0x04000004, 0x84000520, 0x48026004, - 0x0401f01a, 0x42001000, 0x0010b5f4, 0x50081000, - 0x58080002, 0x82000580, 0x00000100, 0x0400000a, - 0x5808000c, 0x81300580, 0x02020800, 0x00100615, - 0x0201f800, 0x00106619, 0x02020800, 0x00100615, - 0x0401f7cf, 0x0201f800, 0x00106be2, 0x0402000c, - 0x59300004, 0x8c000520, 0x04000004, 0x84000520, - 0x48026004, 0x0401f7c6, 0x0201f800, 0x00106619, - 0x040007c3, 0x0201f800, 0x00100615, 0x59300203, - 0x82000c80, 0x0000000e, 0x02021800, 0x00100615, - 0x0c01f7a7, 0x59300406, 0x4933c857, 0x4803c857, - 0x82000c80, 0x00000012, 0x02021800, 0x00100615, - 0x0c01f001, 0x00108b30, 0x00108bfe, 0x00108d36, - 0x00108b3c, 0x00107698, 0x00108b30, 0x00109faf, - 0x000208b4, 0x00108bfe, 0x00106306, 0x00108d97, - 0x00108b2b, 0x00108b2b, 0x00108b2b, 0x00108b2b, - 0x00108b2b, 0x001094b7, 0x001094b7, 0x0201f800, - 0x00100615, 0x0401fbd8, 0x02000000, 0x00107da6, - 0x1c01f000, 0x0201f800, 0x0010698c, 0x0201f800, - 0x001068f6, 0x0201f800, 0x00106982, 0x0201f000, - 0x000208b4, 0x4a026206, 0x00000001, 0x1c01f000, - 0x42000000, 0x0010b671, 0x0201f800, 0x0010a86e, - 0x4d2c0000, 0x4d400000, 0x417a5800, 0x0401fab1, - 0x04000007, 0x59325808, 0x592c0208, 0x8400054c, - 0x48025a08, 0x42028000, 0x00000006, 0x0201f800, - 0x0010698c, 0x0401ff4c, 0x4803c857, 0x82000c80, - 0x0000000e, 0x02021800, 0x00100615, 0x0c01f806, - 0x0201f800, 0x00106982, 0x5c028000, 0x5c025800, - 0x1c01f000, 0x00108bfd, 0x00108b69, 0x00108b79, - 0x00108ba0, 0x00108bce, 0x00108b67, 0x00108b30, - 0x00108b30, 0x00108b30, 0x00108b67, 0x00108b67, - 0x00108b67, 0x00108b67, 0x00108b79, 0x0201f800, - 0x00100615, 0x598c000d, 0x4803c857, 0x81300580, - 0x04020004, 0x0201f800, 0x00106be2, 0x0402003f, - 0x0201f800, 0x00106619, 0x04000043, 0x4803c856, - 0x0201f800, 0x001068a3, 0x04000038, 0x0201f800, - 0x00100615, 0x497a621d, 0x812e59c0, 0x02000800, - 0x00100615, 0x592c0204, 0x4803c857, 0x82000500, - 0x000000ff, 0x82000580, 0x00000014, 0x04000003, - 0x4a02621d, 0x00000003, 0x592c0a08, 0x0201f800, - 0x00104bee, 0x0201f800, 0x00109365, 0x0201f800, - 0x00020381, 0x497a6008, 0x4a026403, 0x00000085, - 0x4a026203, 0x00000009, 0x4a026406, 0x00000002, - 0x59300804, 0x82040d00, 0x00000100, 0x82040d40, - 0x8000404b, 0x48066004, 0x0201f800, 0x00106982, - 0x42000800, 0x8000404b, 0x0201f000, 0x00020855, - 0x0401feea, 0x04020004, 0x0201f800, 0x00106bb2, - 0x0402000a, 0x0201f800, 0x001064f6, 0x040207cc, - 0x59300c03, 0x4807c857, 0x82040580, 0x00000040, - 0x04000009, 0x0401f7cc, 0x59300203, 0x4803c857, - 0x82000c80, 0x0000000e, 0x02021800, 0x00100615, - 0x0c01f7a5, 0x0201f800, 0x00106982, 0x812e59c0, - 0x04000013, 0x592c0a08, 0x0201f800, 0x00104bee, - 0x0201f800, 0x00109365, 0x0201f800, 0x00020381, - 0x59300203, 0x82000580, 0x0000000d, 0x04000008, - 0x0201f800, 0x00106982, 0x4d340000, 0x59326809, - 0x0201f800, 0x00104801, 0x5c026800, 0x0201f800, - 0x00107698, 0x0401f030, 0x812e59c0, 0x02000800, - 0x00100615, 0x0201f800, 0x001091d3, 0x04020004, - 0x0201f800, 0x00100ee4, 0x0401f7a3, 0x0201f800, - 0x00106982, 0x592c0208, 0x8400050c, 0x48025a08, - 0x592c0406, 0x800000c2, 0x800008c4, 0x80040c00, - 0x48066206, 0x42000000, 0x10000000, 0x41300800, - 0x0201f800, 0x00100bde, 0x0400000d, 0x592c0208, - 0x8c00051c, 0x04020006, 0x8400055c, 0x48025a08, - 0x4a026206, 0x00000002, 0x0401f00f, 0x4d300000, - 0x0201f800, 0x00101335, 0x5c026000, 0x59300203, - 0x82000580, 0x00000004, 0x04020007, 0x4d380000, - 0x42027000, 0x00000048, 0x0201f800, 0x000208d8, - 0x5c027000, 0x1c01f000, 0x42000000, 0x0010b66d, - 0x0201f800, 0x0010a86e, 0x59300203, 0x82000c80, - 0x0000000e, 0x02021800, 0x00100615, 0x4803c857, - 0x0c01f001, 0x00108c17, 0x00108b39, 0x00108c19, - 0x00108c17, 0x00108c19, 0x00108c19, 0x00108b31, - 0x00108c17, 0x00108b2d, 0x00108c17, 0x00108c17, - 0x00108c17, 0x00108c17, 0x00108c17, 0x0201f800, - 0x00100615, 0x4d340000, 0x4d2c0000, 0x59326809, - 0x59340400, 0x82000500, 0x000000ff, 0x82000c80, - 0x0000000c, 0x02021800, 0x00100615, 0x59303403, - 0x82180d80, 0x00000004, 0x04020004, 0x42000000, - 0x00000001, 0x0401f006, 0x82180d80, 0x00000000, - 0x04020003, 0x42000000, 0x00000001, 0x4803c857, - 0x0c01f804, 0x5c025800, 0x5c026800, 0x1c01f000, - 0x00108c40, 0x00108cdf, 0x00108c42, 0x00108c77, - 0x00108c42, 0x00108cfc, 0x00108c42, 0x00108c4c, - 0x00108c40, 0x00108cfc, 0x00108c40, 0x00108c5b, - 0x0201f800, 0x00100615, 0x59300403, 0x82000d80, - 0x00000016, 0x0400002e, 0x82000d80, 0x00000004, - 0x0400002b, 0x82000d80, 0x00000002, 0x04000028, - 0x0401fab9, 0x04000079, 0x59300403, 0x82000d80, - 0x00000022, 0x040000ae, 0x82000d80, 0x00000039, - 0x040000b3, 0x82000d80, 0x00000035, 0x040000b0, - 0x82000d80, 0x0000001e, 0x0400001b, 0x0401f999, - 0x04000007, 0x0201f800, 0x00109360, 0x04020004, - 0x0201f800, 0x00104863, 0x0401f011, 0x59300403, - 0x82000d80, 0x00000001, 0x04020004, 0x0201f800, - 0x00104836, 0x0400000a, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x00101de2, 0x5c027800, 0x42000000, - 0x0010b663, 0x0201f800, 0x0010a86e, 0x0201f800, - 0x00107da6, 0x0201f000, 0x00107698, 0x0401f97d, - 0x04000004, 0x0201f800, 0x00109360, 0x040000a9, - 0x59300c03, 0x82040580, 0x00000016, 0x04000056, - 0x82040580, 0x00000002, 0x04020034, 0x59a80026, - 0x8c000502, 0x04020013, 0x0201f800, 0x00104e0d, - 0x04020010, 0x0201f800, 0x00104e23, 0x04020006, - 0x42000000, 0x00000001, 0x0201f800, 0x00104de5, - 0x0401f094, 0x4a035033, 0x00000001, 0x4202d800, - 0x00000001, 0x0201f800, 0x00104d76, 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, - 0x00020892, 0x04000005, 0x49366009, 0x4a026406, - 0x00000001, 0x0401f020, 0x59300403, 0x82000d80, - 0x00000002, 0x0402000d, 0x59340403, 0x82000580, - 0x000007fe, 0x04020009, 0x59a80026, 0x84000540, - 0x48035026, 0x0201f800, 0x00104067, 0x0201f800, - 0x00107da6, 0x0401f00c, 0x0201f800, 0x00107da6, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x00101de2, - 0x5c027800, 0x42000000, 0x0010b663, 0x0201f800, - 0x0010a86e, 0x0201f800, 0x00101e1b, 0x0201f000, - 0x00107698, 0x42000800, 0x00000003, 0x0201f800, - 0x001043c7, 0x4a026203, 0x00000001, 0x4a026403, - 0x00000002, 0x0201f000, 0x00106470, 0x0401f915, - 0x04020793, 0x0201f800, 0x00101e1b, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x00101de2, 0x5c027800, - 0x42000000, 0x0010b663, 0x0201f800, 0x0010a86e, - 0x42003000, 0x00000018, 0x41782800, 0x42002000, - 0x00000000, 0x4d400000, 0x4d440000, 0x59368c03, - 0x42028000, 0x00000029, 0x0201f800, 0x0010962a, - 0x5c028800, 0x5c028000, 0x0201f000, 0x00107698, - 0x0201f800, 0x00104863, 0x0401f7c8, 0x42000000, - 0x0010b66c, 0x0201f800, 0x0010a86e, 0x0201f800, - 0x001078fd, 0x040207c1, 0x1c01f000, 0x4d380000, - 0x59327403, 0x0201f800, 0x00109183, 0x5c027000, - 0x02020000, 0x000208b4, 0x836c0580, 0x00000003, - 0x04000004, 0x4a026206, 0x00000002, 0x1c01f000, - 0x59300403, 0x48026416, 0x4a02621d, 0x00000001, - 0x4a026403, 0x00000085, 0x4a026203, 0x00000009, - 0x4a026406, 0x00000002, 0x42000800, 0x8000004b, - 0x0201f000, 0x00020855, 0x0201f800, 0x00101e1b, - 0x0201f800, 0x00107da6, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x00101de2, 0x5c027800, 0x42000000, - 0x0010b663, 0x0201f800, 0x0010a86e, 0x497a6008, - 0x4a026406, 0x00000007, 0x4a026206, 0x00000398, - 0x497a6205, 0x1c01f000, 0x42000000, 0x0010b66f, - 0x0201f800, 0x0010a86e, 0x4d340000, 0x59326809, - 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, - 0x00100615, 0x4803c857, 0x0c01f803, 0x5c026800, - 0x1c01f000, 0x00108d53, 0x00108b39, 0x00108d53, - 0x00108d53, 0x00108d53, 0x00108d53, 0x00108d53, - 0x00108d53, 0x00108d53, 0x00108b39, 0x00108d55, - 0x00108b39, 0x00108d5d, 0x00108d53, 0x0201f800, - 0x00100615, 0x4a026403, 0x0000008b, 0x4a026203, - 0x0000000b, 0x42000800, 0x8000404b, 0x0201f000, - 0x00020855, 0x59300a1d, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x00101de2, 0x5c027800, 0x42003000, - 0x00000011, 0x0201f800, 0x0010a766, 0x42000000, - 0x0010b663, 0x0201f800, 0x0010a86e, 0x41306800, - 0x0201f800, 0x00020892, 0x04000008, 0x49366009, - 0x4d300000, 0x40366000, 0x0201f800, 0x00107698, - 0x5c026000, 0x0401f002, 0x40366000, 0x497a6008, - 0x4a026406, 0x00000001, 0x4a026403, 0x00000001, - 0x0201f800, 0x0010393e, 0x04000011, 0x4a026406, - 0x00000004, 0x4a026203, 0x00000007, 0x4a026420, - 0x00000001, 0x42003000, 0x00000004, 0x4d400000, - 0x42028000, 0x00000029, 0x41782800, 0x0201f800, - 0x0010a250, 0x5c028000, 0x1c01f000, 0x42000800, - 0x0000000b, 0x0201f800, 0x001043c7, 0x4a026203, - 0x00000001, 0x0201f000, 0x00106470, 0x42000000, - 0x0010b675, 0x0201f800, 0x0010a86e, 0x59300203, - 0x82000c80, 0x0000000e, 0x02021800, 0x00100615, - 0x4803c857, 0x0c01f001, 0x00108dc8, 0x00108db0, - 0x00108db4, 0x00108dc9, 0x00108db2, 0x00108db0, - 0x00108db0, 0x00108db0, 0x00108db0, 0x00108db0, - 0x00108db0, 0x00108db0, 0x00108db0, 0x00108db0, - 0x0201f800, 0x00100615, 0x0201f800, 0x00100ee4, - 0x4d2c0000, 0x59325808, 0x4a025a06, 0x00000006, - 0x0201f800, 0x00020381, 0x5c025800, 0x497a6008, - 0x4a02621d, 0x0000000a, 0x4a026403, 0x00000085, - 0x4a026203, 0x00000009, 0x4a026406, 0x00000002, - 0x42000800, 0x8000404b, 0x0201f000, 0x00020855, - 0x1c01f000, 0x0201f800, 0x0010698c, 0x4df00000, - 0x0401fcbe, 0x04020004, 0x0201f800, 0x00106bb2, - 0x0402000c, 0x0201f800, 0x001064f6, 0x04020005, - 0x5c03e000, 0x0201f800, 0x00106982, 0x0401f7dd, - 0x0201f800, 0x001068a3, 0x02020800, 0x00100615, - 0x5c03e000, 0x0201f800, 0x00106982, 0x59300203, - 0x82000d80, 0x00000003, 0x02000800, 0x00100615, - 0x82000c80, 0x0000000e, 0x02021800, 0x00100615, - 0x0c01f7ba, 0x4803c856, 0x59a8000e, 0x59a80867, - 0x80040400, 0x80080480, 0x04021004, 0x82000540, - 0x00000001, 0x1c01f000, 0x80000580, 0x1c01f000, - 0x4803c856, 0x4c080000, 0x59301008, 0x82081500, - 0xfff00000, 0x5c001000, 0x1c01f000, 0x4803c856, - 0x4d300000, 0x0201f800, 0x00020892, 0x0400000a, - 0x0401f82f, 0x4d380000, 0x42027000, 0x0000004b, - 0x0201f800, 0x000208d8, 0x5c027000, 0x82000540, - 0x00000001, 0x5c026000, 0x1c01f000, 0x4803c856, - 0x4d300000, 0x0201f800, 0x001076c9, 0x0400001b, - 0x0401f81f, 0x4d300000, 0x0201f800, 0x0010698c, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x001067f6, - 0x0201f800, 0x00106543, 0x5c027800, 0x0201f800, - 0x0010a0da, 0x0201f800, 0x00106982, 0x5c026000, - 0x8d3e7d3e, 0x0402000b, 0x4d380000, 0x42027000, - 0x0000004c, 0x0201f800, 0x000208d8, 0x5c027000, - 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, - 0x0201f800, 0x000208b4, 0x0401f7fa, 0x592c0407, - 0x494a6017, 0x494e6018, 0x49366009, 0x492e6008, - 0x4a026406, 0x00000003, 0x800000c2, 0x800008c4, - 0x80040400, 0x48026206, 0x1c01f000, 0x493bc857, - 0x4d300000, 0x0201f800, 0x00020892, 0x0400000d, - 0x0401ffef, 0x4d400000, 0x42028000, 0x00000005, - 0x0401f80d, 0x5c028000, 0x8d3e7d3e, 0x04020007, - 0x0201f800, 0x000208d8, 0x82000540, 0x00000001, - 0x5c026000, 0x1c01f000, 0x0201f800, 0x000208b4, - 0x0401f7fa, 0x4803c856, 0x0201f800, 0x0010698c, - 0x4d3c0000, 0x4d440000, 0x59368c03, 0x42027800, - 0x00000001, 0x0201f800, 0x001066ff, 0x0201f800, - 0x00106675, 0x0201f800, 0x00106543, 0x0201f800, - 0x0010a0da, 0x5c028800, 0x5c027800, 0x0201f000, - 0x00106982, 0x4803c856, 0x4d300000, 0x0201f800, - 0x00020892, 0x0400000f, 0x481a601c, 0x48ee6021, - 0x49366009, 0x4a026406, 0x00000001, 0x492e6008, - 0x4d380000, 0x42027000, 0x0000001f, 0x0201f800, - 0x000208d8, 0x5c027000, 0x82000540, 0x00000001, - 0x5c026000, 0x1c01f000, 0x4803c856, 0x4d300000, - 0x0201f800, 0x00020892, 0x0400000e, 0x48ee6021, - 0x49366009, 0x4a026406, 0x00000001, 0x492e6008, - 0x4d380000, 0x42027000, 0x00000055, 0x0201f800, - 0x000208d8, 0x5c027000, 0x82000540, 0x00000001, - 0x5c026000, 0x1c01f000, 0x4803c856, 0x4d300000, - 0x0201f800, 0x00020892, 0x0400000f, 0x481a601c, - 0x48ee6021, 0x49366009, 0x4a026406, 0x00000001, - 0x492e6008, 0x4d380000, 0x42027000, 0x0000003d, - 0x0201f800, 0x000208d8, 0x5c027000, 0x82000540, - 0x00000001, 0x5c026000, 0x1c01f000, 0x4803c856, - 0x4d300000, 0x0201f800, 0x001076c9, 0x04000014, - 0x49366009, 0x492fc857, 0x4933c857, 0x592c0404, - 0x8c00051e, 0x04000003, 0x48efc857, 0x48ee6021, - 0x4a026406, 0x00000001, 0x492e6008, 0x4d380000, - 0x42027000, 0x00000000, 0x0201f800, 0x000208d8, - 0x5c027000, 0x82000540, 0x00000001, 0x5c026000, - 0x1c01f000, 0x4803c856, 0x4d300000, 0x0201f800, - 0x00020892, 0x0400000f, 0x48ee6021, 0x481a601c, - 0x49366009, 0x4a026406, 0x00000001, 0x492e6008, - 0x4d380000, 0x42027000, 0x00000044, 0x0201f800, - 0x000208d8, 0x5c027000, 0x82000540, 0x00000001, - 0x5c026000, 0x1c01f000, 0x4803c856, 0x4d300000, - 0x0201f800, 0x00020892, 0x0400000f, 0x481a601c, - 0x48ee6021, 0x49366009, 0x4a026406, 0x00000001, - 0x492e6008, 0x4d380000, 0x42027000, 0x00000049, - 0x0201f800, 0x000208d8, 0x5c027000, 0x82000540, - 0x00000001, 0x5c026000, 0x1c01f000, 0x59300009, - 0x80001540, 0x02000800, 0x00100615, 0x5808040b, - 0x4803c856, 0x80000040, 0x04001002, 0x4800140b, - 0x1c01f000, 0x4803c856, 0x59300403, 0x82000d80, - 0x00000002, 0x0400000f, 0x82000d80, 0x00000003, - 0x0400000c, 0x82000d80, 0x00000004, 0x04000009, - 0x599c0819, 0x8c040d0e, 0x04000004, 0x82000d80, - 0x00000000, 0x04000003, 0x82000540, 0x00000001, - 0x1c01f000, 0x4803c856, 0x4c000000, 0x4d2c0000, - 0x59300406, 0x82000580, 0x00000004, 0x0400001d, - 0x59300008, 0x80025d40, 0x800001c0, 0x04000019, - 0x0201f800, 0x00109360, 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, - 0x001076c9, 0x04000013, 0x49366009, 0x48ee6021, - 0x4a026406, 0x00000001, 0x492e6008, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x00101de2, 0x5c027800, - 0x4d380000, 0x42027000, 0x00000028, 0x0201f800, - 0x000208d8, 0x5c027000, 0x82000540, 0x00000001, - 0x5c026000, 0x1c01f000, 0x4803c856, 0x83380580, - 0x00000015, 0x0402000d, 0x59a80016, 0x82000580, - 0x00000074, 0x04020009, 0x0201f800, 0x00104480, - 0x4a026203, 0x00000001, 0x4a026403, 0x00000029, - 0x0201f000, 0x00106470, 0x0201f800, 0x00107da6, - 0x0201f000, 0x000208b4, 0x4803c856, 0x83380580, - 0x00000016, 0x04020007, 0x42000800, 0x00000004, - 0x0201f800, 0x001043c7, 0x0201f000, 0x001078bf, - 0x83380580, 0x00000015, 0x04020013, 0x59a80016, - 0x82000580, 0x00000014, 0x0402000f, 0x0201f800, - 0x001044e1, 0x0201f800, 0x00108210, 0x0402000a, - 0x59340404, 0x80000540, 0x04000007, 0x42000800, - 0x00000006, 0x0201f800, 0x001043c7, 0x0201f000, - 0x001078bf, 0x0201f800, 0x00107da6, 0x0201f000, - 0x000208b4, 0x4803c856, 0x592c0206, 0x82000580, - 0x00000005, 0x04000002, 0x1c01f000, 0x4803c856, - 0x592c0208, 0x8400054a, 0x48025a08, 0x1c01f000, - 0x497a6205, 0x497a6008, 0x4a026203, 0x00000001, - 0x4a026403, 0x00000050, 0x42000800, 0x80000043, - 0x0201f000, 0x00020855, 0x4933c857, 0x4d340000, - 0x59326809, 0x59340200, 0x8c00050e, 0x04000006, - 0x59300406, 0x82000c80, 0x00000012, 0x04021004, - 0x0c01f806, 0x5c026800, 0x1c01f000, 0x0201f800, - 0x00108b30, 0x0401f7fc, 0x00108b30, 0x00108fb4, - 0x00108fb8, 0x00108fbb, 0x0010a2b9, 0x0010a2d6, - 0x0010a2da, 0x00108b30, 0x00108b30, 0x00108b30, - 0x00108b30, 0x00108b30, 0x00108b30, 0x00108b30, - 0x00108b30, 0x00108b30, 0x00108b30, 0x00108b30, - 0x4803c856, 0x40000000, 0x40000000, 0x1c01f000, - 0x40000000, 0x40000000, 0x1c01f000, 0x5930001c, - 0x4803c857, 0x59300414, 0x4933c857, 0x4803c857, - 0x8c000502, 0x04000005, 0x4803c857, 0x84000540, - 0x48026414, 0x1c01f000, 0x42000000, 0xd0000000, - 0x41300800, 0x0201f800, 0x00100bde, 0x0401f810, - 0x0402000e, 0x59300c14, 0x59300403, 0x82000580, - 0x00000040, 0x04000003, 0x84040d40, 0x0401f005, - 0x59a80037, 0x82000400, 0x0000000a, 0x48026205, - 0x84040d42, 0x48066414, 0x1c01f000, 0x4933c857, - 0x4d340000, 0x59326809, 0x59340200, 0x8c00050e, - 0x02000800, 0x00100615, 0x5930001c, 0x80000540, - 0x04020034, 0x59300403, 0x4803c857, 0x82000580, - 0x00000040, 0x04000004, 0x59a80021, 0x80000540, - 0x0402002a, 0x4d1c0000, 0x41323800, 0x0201f800, - 0x00020892, 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, 0x00020855, 0x411e6000, - 0x5c023800, 0x80000580, 0x5c026800, 0x1c01f000, - 0x411e6000, 0x5c023800, 0x59a80039, 0x48026205, - 0x82000540, 0x00000001, 0x0401f7f8, 0x4933c857, - 0x4d2c0000, 0x4932381c, 0x4a026202, 0x0000ffff, - 0x591e5808, 0x591c0007, 0x8c00051e, 0x04000005, - 0x8400051e, 0x48023807, 0x497a5c09, 0x0401f018, - 0x592c0408, 0x8c000518, 0x04000015, 0x84000518, - 0x48025c08, 0x4d400000, 0x592e8206, 0x4a025a06, - 0x00000001, 0x0401fb34, 0x49425a06, 0x5c028000, - 0x497a5c09, 0x592c0408, 0x8c000512, 0x04000008, - 0x4d2c0000, 0x84000512, 0x48025c08, 0x592e5809, - 0x0201f800, 0x00100843, 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, 0x00020855, 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, - 0x001063ee, 0x800811c0, 0x04020003, 0x42001000, - 0x00000014, 0x480b5037, 0x59a81036, 0x480b502d, - 0x41780800, 0x42000000, 0x00000064, 0x0201f800, - 0x001063ee, 0x800811c0, 0x04020003, 0x42001000, - 0x00000014, 0x480b5038, 0x82081400, 0x0000000a, - 0x480b5039, 0x42000800, 0x00000001, 0x0201f800, - 0x001069af, 0x42000000, 0x30000000, 0x40080800, - 0x0201f800, 0x00100bb2, 0x42000800, 0x00000003, - 0x59a81010, 0x0201f800, 0x001069af, 0x0201f000, - 0x00104755, 0x4a035037, 0x00000028, 0x4a035038, - 0x00000014, 0x4a03502d, 0x000007d0, 0x42001000, - 0x0000001e, 0x480b5039, 0x42000800, 0x00000001, - 0x0201f800, 0x001069af, 0x42000000, 0x30000000, - 0x40080800, 0x0201f800, 0x00100bb2, 0x42000800, - 0x00000003, 0x59a81010, 0x0201f000, 0x001069af, - 0x4933c857, 0x4d2c0000, 0x59300403, 0x82000580, - 0x0000003e, 0x04020005, 0x59325817, 0x812e59c0, - 0x02020800, 0x0010083a, 0x5c025800, 0x1c01f000, - 0x4937c857, 0x4d300000, 0x0201f800, 0x00020892, - 0x04000011, 0x49366009, 0x4a026406, 0x00000001, - 0x492e6008, 0x42000800, 0x00000009, 0x0201f800, - 0x001043c7, 0x4d380000, 0x42027000, 0x00000033, - 0x0201f800, 0x000208d8, 0x5c027000, 0x82000540, - 0x00000001, 0x5c026000, 0x1c01f000, 0x4933c857, - 0x4d2c0000, 0x4c580000, 0x4d3c0000, 0x59325808, - 0x83380580, 0x00000015, 0x04020025, 0x59a8b016, - 0x82580c80, 0x00000019, 0x04001003, 0x4200b000, - 0x00000018, 0x8058b104, 0x0401fa0a, 0x80000580, - 0x0401fa1a, 0x832cac00, 0x00000009, 0x83cca400, - 0x00000006, 0x0201f800, 0x0010a93e, 0x4c600000, - 0x4200c000, 0x00000001, 0x592c100a, 0x8c081518, - 0x04020006, 0x59a80010, 0x592c100d, 0x80080580, - 0x04020007, 0x4178c000, 0x59301009, 0x58081403, - 0x417a7800, 0x0201f800, 0x00101e48, 0x5c00c000, - 0x0201f800, 0x001078bf, 0x0401f008, 0x4200b000, - 0x00000002, 0x0401fa09, 0x0201f800, 0x00107da6, - 0x0201f800, 0x000208b4, 0x5c027800, 0x5c00b000, - 0x5c025800, 0x1c01f000, 0x4933c856, 0x49366009, - 0x4a026406, 0x00000001, 0x492e6008, 0x4d380000, - 0x42027000, 0x0000004d, 0x0201f800, 0x000208d8, - 0x5c027000, 0x82000540, 0x00000001, 0x1c01f000, - 0x4803c856, 0x4d2c0000, 0x83380580, 0x00000015, - 0x04020027, 0x59a80816, 0x59325808, 0x5930040b, - 0x800000c4, 0x80040580, 0x04020021, 0x4c500000, - 0x4c540000, 0x4c580000, 0x83cca400, 0x00000006, - 0x4050a800, 0x5930b40b, 0x0201f800, 0x0010a94f, - 0x83cca400, 0x00000006, 0x592cb205, 0x832cac00, - 0x00000006, 0x0201f800, 0x0010a93e, 0x592e5801, - 0x812e59c0, 0x040207f9, 0x5931d821, 0x58ef400b, - 0x58ee580d, 0x4a025a04, 0x00000103, 0x58ec0009, - 0x0801f800, 0x59300402, 0x5c00b000, 0x5c00a800, - 0x5c00a000, 0x5c025800, 0x1c01f000, 0x0201f800, - 0x00107da6, 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, 0x00100615, - 0x42000800, 0x0000012c, 0x4a0370e4, 0x20000000, - 0x59b800e4, 0x80040840, 0x02000800, 0x00100615, - 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, 0x0401fc10, 0x04000008, 0x42000800, - 0x00000024, 0x0201f800, 0x001063cf, 0x82063c00, - 0x0010cfc0, 0x491fc857, 0x1c01f000, 0x83300480, - 0x0010cfc0, 0x0400100a, 0x59a8000b, 0x81300480, - 0x04021007, 0x59301402, 0x0401ffef, 0x04000007, - 0x411c0000, 0x81300580, 0x04000003, 0x81780500, - 0x0401f002, 0x81300540, 0x1c01f000, 0x4947c857, - 0x4d300000, 0x0201f800, 0x00020267, 0x0402000a, - 0x42026000, 0x0010bbe8, 0x49366009, 0x492e6008, - 0x0201f800, 0x00101de2, 0x80000580, 0x5c026000, - 0x1c01f000, 0x82000540, 0x00000001, 0x0401f7fc, - 0x4933c857, 0x0201f800, 0x00108df4, 0x02000800, - 0x00100615, 0x4d2c0000, 0x4d340000, 0x4d440000, - 0x4c580000, 0x59325808, 0x59326809, 0x49425a06, - 0x0201f800, 0x00105439, 0x592e8c06, 0x592c4207, - 0x82200500, 0x0000000f, 0x0c01f806, 0x5c00b000, - 0x5c028800, 0x5c026800, 0x5c025800, 0x1c01f000, - 0x0010922f, 0x00109251, 0x00109258, 0x0010925c, - 0x00109265, 0x0010922c, 0x0010922c, 0x0010922c, - 0x00109269, 0x00109275, 0x00109275, 0x0010922c, - 0x0010922c, 0x0010922c, 0x0010922c, 0x0010922c, - 0x4803c857, 0x0201f800, 0x00100615, 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, 0x00104871, 0x04000014, 0x8c20450e, - 0x04000002, 0x497a6009, 0x4178b000, 0x497a5a06, - 0x0401f004, 0x8340b540, 0x00000000, 0x0402000b, - 0x592c0404, 0x8400051c, 0x48025c04, 0x592c0207, - 0x8400051e, 0x48025a07, 0x0401f8aa, 0x497a6008, - 0x0201f000, 0x00020381, 0x592c0207, 0x8c00051e, - 0x4200b000, 0x00000002, 0x040207f2, 0x8204b540, - 0x00000000, 0x040007ef, 0x44042800, 0x4200b000, - 0x00000001, 0x0401f7eb, 0x4937c857, 0x4d300000, - 0x0201f800, 0x00020892, 0x04000011, 0x49366009, - 0x4a026406, 0x00000001, 0x492e6008, 0x42000800, - 0x0000000b, 0x0201f800, 0x001043c7, 0x4d380000, - 0x42027000, 0x00000043, 0x0201f800, 0x000208d8, - 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, 0x0010480a, 0x5c027800, - 0x5c028800, 0x0401f004, 0x4803c856, 0x0201f800, - 0x00104871, 0x0201f800, 0x00108df4, 0x04000017, - 0x4d400000, 0x42028000, 0x00000000, 0x41780800, - 0x0401ff38, 0x5c028000, 0x0401f00e, 0x0201f800, - 0x00104871, 0x040207f4, 0x0201f800, 0x00108df4, - 0x0400000a, 0x4c580000, 0x4200b000, 0x00000002, - 0x0401f86e, 0x5c00b000, 0x0201f800, 0x00107da6, - 0x0201f800, 0x000208b4, 0x5c025800, 0x1c01f000, - 0x4937c857, 0x4d300000, 0x0201f800, 0x00020892, - 0x04000012, 0x49366009, 0x4a026406, 0x00000001, - 0x4d3c0000, 0x4d380000, 0x417a7800, 0x0201f800, - 0x001043bd, 0x492e6008, 0x42027000, 0x00000004, - 0x0201f800, 0x000208d8, 0x5c027000, 0x5c027800, - 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, - 0x4937c857, 0x4d300000, 0x0201f800, 0x001076c9, - 0x0400000d, 0x49366009, 0x4a026406, 0x00000001, - 0x492e6008, 0x4d380000, 0x42027000, 0x00000051, - 0x0201f800, 0x000208d8, 0x5c027000, 0x82000540, - 0x00000001, 0x5c026000, 0x1c01f000, 0x4933c857, - 0x4c580000, 0x59325808, 0x83383580, 0x00000015, - 0x04020011, 0x592c0008, 0x82000500, 0x00ffffff, - 0x0402000a, 0x0201f800, 0x00105439, 0x59cc0000, - 0x82000500, 0x00ffffff, 0x44002800, 0x4200b000, - 0x00000001, 0x0401f80b, 0x0201f800, 0x001078bf, - 0x0401f006, 0x4200b000, 0x00000002, 0x0401f823, - 0x0201f800, 0x00107da6, 0x5c00b000, 0x1c01f000, - 0x492fc857, 0x4c580000, 0x4c000000, 0x8058b1c0, - 0x0400000b, 0x82580500, 0xfffffff0, 0x02020800, - 0x00100615, 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, 0x00105439, 0x46002800, 0x00000018, - 0x80142800, 0x8058b040, 0x83cca400, 0x00000007, - 0x4014a800, 0x0201f800, 0x0010a93e, 0x5c00b000, - 0x5c00a800, 0x5c00a000, 0x5c025800, 0x1c01f000, - 0x59325808, 0x592c0204, 0x82000580, 0x00000152, - 0x1c01f000, 0x5930001f, 0x80000540, 0x02020800, - 0x00100d9a, 0x1c01f000, 0x4d2c0000, 0x59325808, - 0x59300203, 0x4933c857, 0x492fc857, 0x493bc857, - 0x4803c857, 0x82003480, 0x0000000e, 0x02021800, - 0x00100615, 0x0c01f803, 0x5c025800, 0x1c01f000, - 0x00109386, 0x00109391, 0x001093cf, 0x00109386, - 0x00109386, 0x00109386, 0x00109386, 0x00109386, - 0x00109388, 0x00109386, 0x00109386, 0x00109386, - 0x00109386, 0x00109386, 0x0201f800, 0x00100615, - 0x83383480, 0x00000056, 0x02021800, 0x00100615, - 0x493a6403, 0x4a026203, 0x00000001, 0x0201f000, - 0x00106470, 0x83380580, 0x00000013, 0x04020010, - 0x4937c857, 0x592c000c, 0x800001c0, 0x04000006, - 0x4a026203, 0x00000002, 0x59a80037, 0x48026206, - 0x1c01f000, 0x4a025a06, 0x00000000, 0x0201f800, - 0x00020381, 0x0201f000, 0x000208b4, 0x83380580, - 0x00000027, 0x0400001b, 0x83380580, 0x00000014, - 0x04000012, 0x83380580, 0x00000015, 0x04000005, - 0x83380580, 0x00000016, 0x02020800, 0x00100615, - 0x0201f800, 0x00106cb4, 0x02020000, 0x001076fb, - 0x59300203, 0x82000580, 0x00000002, 0x02020800, - 0x00100615, 0x0401f016, 0x4937c857, 0x0201f800, - 0x001068f6, 0x4a02580e, 0x00000011, 0x0401f006, - 0x4937c857, 0x0201f800, 0x001068f6, 0x4a02580e, - 0x00000010, 0x4a025a06, 0x00000031, 0x4a02580d, - 0x00000004, 0x0201f800, 0x00020381, 0x0201f800, - 0x00104a83, 0x0201f000, 0x00107698, 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, 0x00100615, 0x0401f8a1, 0x0401f016, - 0x820c0580, 0x00000003, 0x0400084c, 0x0401f012, - 0x820c0580, 0x0000000b, 0x0402000f, 0x42000800, - 0x00000007, 0x0201f800, 0x001043c7, 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, 0x0010783c, 0x04000010, - 0x592c1001, 0x480a600b, 0x58080800, 0x82080400, - 0x00000002, 0x592c1011, 0x592c1812, 0x42003000, - 0x00000000, 0x42002000, 0x00101250, 0x0201f800, - 0x001079b9, 0x04000002, 0x1c01f000, 0x4a025a06, - 0x0000002c, 0x497a580c, 0x0201f800, 0x00020381, - 0x0201f000, 0x000208b4, 0x83380580, 0x00000015, - 0x0402000a, 0x59a8006f, 0x8c000502, 0x0402000b, - 0x0201f800, 0x00104480, 0x42000800, 0x00000004, - 0x0201f000, 0x001043c7, 0x42000800, 0x00000007, - 0x0201f000, 0x001043c7, 0x0201f800, 0x00104e0d, - 0x42001000, 0x00000010, 0x04020009, 0x59340002, - 0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000, - 0x040007ec, 0x42001000, 0x00000008, 0x0201f800, - 0x00104ada, 0x040007e7, 0x592c040b, 0x84000540, - 0x48025c0b, 0x0401f7e9, 0x83380580, 0x00000015, - 0x0402000f, 0x59a8006f, 0x8c000502, 0x04020010, - 0x0201f800, 0x001044e1, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x001043bd, 0x5c027800, 0x42000800, - 0x00000006, 0x0201f000, 0x001043c7, 0x42000800, - 0x00000004, 0x0201f000, 0x001043c7, 0x0201f800, - 0x00104e0d, 0x42001000, 0x00000010, 0x04020009, - 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, - 0x00ff0000, 0x040007e7, 0x42001000, 0x00000008, - 0x0201f800, 0x00104ada, 0x040007e2, 0x592c040b, - 0x84000540, 0x48025c0b, 0x0401f7e9, 0x42000800, - 0x00000004, 0x0201f000, 0x001043c7, 0x83380580, - 0x00000015, 0x04020005, 0x0201f800, 0x0010a0b1, - 0x02000800, 0x00104711, 0x1c01f000, 0x83380580, - 0x00000015, 0x0402001d, 0x4c580000, 0x83cc1400, - 0x00000008, 0x4200b000, 0x00000002, 0x83341c00, - 0x00000006, 0x0201f800, 0x001082ff, 0x04020012, - 0x83cc1400, 0x0000000a, 0x4200b000, 0x00000002, - 0x83341c00, 0x00000008, 0x0201f800, 0x001082ff, - 0x04020009, 0x59342200, 0x59cc1007, 0x800811c0, - 0x04000003, 0x480a6801, 0x84102542, 0x8410251a, - 0x48126a00, 0x5c00b000, 0x1c01f000, 0x42000000, - 0x0010b67a, 0x0201f800, 0x0010a86e, 0x0201f800, - 0x0010698c, 0x59300203, 0x4933c857, 0x4803c857, - 0x82000c80, 0x0000000e, 0x02021800, 0x00100615, - 0x0c01f803, 0x0201f000, 0x00106982, 0x001094d7, - 0x001094e6, 0x001094d8, 0x001094d5, 0x001094d5, - 0x001094d5, 0x001094d5, 0x001094d5, 0x001094d5, - 0x001094d5, 0x001094d5, 0x001094d5, 0x001094d5, - 0x001094d5, 0x0201f800, 0x00100615, 0x1c01f000, - 0x59300403, 0x82000580, 0x00000052, 0x02000000, - 0x00108b39, 0x0201f800, 0x00104a83, 0x59325808, - 0x4a025a06, 0x00000006, 0x0201f800, 0x00020381, - 0x0201f000, 0x00107698, 0x59301804, 0x840c0520, - 0x48026004, 0x598c000d, 0x81300580, 0x04020010, - 0x8c0c1d20, 0x04020010, 0x42001000, 0x0010b5f4, - 0x50081000, 0x58080002, 0x82000580, 0x00000100, - 0x0400000e, 0x5808000c, 0x81300580, 0x02020800, - 0x00100615, 0x4978100c, 0x0401f003, 0x8c0c1d20, - 0x040207dc, 0x0201f800, 0x00106619, 0x040007d9, - 0x0201f800, 0x00100615, 0x0201f800, 0x00106be2, - 0x040007f9, 0x59300203, 0x82000c80, 0x0000000e, - 0x02021800, 0x00100615, 0x0c01f7bd, 0x4933c857, - 0x4c500000, 0x4c540000, 0x4c580000, 0x592c0c07, - 0x4806580a, 0x59cc0809, 0x48065807, 0x59cc0a08, - 0x4806580b, 0x59a8086e, 0x82040500, 0x000003ff, - 0x800010c4, 0x8c040d14, 0x04000005, 0x59cc0002, - 0x82000500, 0x00000003, 0x80081480, 0x82080480, - 0x000000f1, 0x02021800, 0x00100615, 0x480a621a, - 0x412c0800, 0x0201f800, 0x00100819, 0x02000800, - 0x00100615, 0x492c0809, 0x58040408, 0x84000552, - 0x84000540, 0x48000c08, 0x82081400, 0x00000003, - 0x80081104, 0x83cca400, 0x00000006, 0x832cac00, - 0x00000004, 0x42000800, 0x00000010, 0x82080480, - 0x00000010, 0x04021003, 0x40080800, 0x80000580, - 0x4004b000, 0x4c000000, 0x0201f800, 0x0010a94f, - 0x5c000000, 0x800001c0, 0x0400000d, 0x412c1000, - 0x4c000000, 0x0201f800, 0x00100819, 0x02000800, - 0x00100615, 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, 0x0010bcd8, 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, 0x001008a1, 0x1c01f000, 0x4d2c0000, - 0x0201f800, 0x00100819, 0x02000800, 0x00100615, - 0x42000800, 0x0010bcd8, 0x452c0800, 0x497a580b, - 0x497a580c, 0x497a580d, 0x4a025809, 0x001095b6, - 0x4a025802, 0x00000100, 0x4a025801, 0x00000000, - 0x5c025800, 0x1c01f000, 0x4833c857, 0x4d300000, - 0x4d2c0000, 0x4c5c0000, 0x4030b800, 0x585c000a, - 0x80025d40, 0x04020004, 0x585c000c, 0x4c000000, - 0x0401f044, 0x585c0002, 0x82000580, 0x00000100, - 0x04020022, 0x592c0801, 0x4c040000, 0x0201f800, - 0x0010083a, 0x5c000800, 0x800409c0, 0x0400001c, - 0x4804b80a, 0x585c100d, 0x800811c0, 0x04020005, - 0x40065800, 0x0201f800, 0x00100843, 0x0401f014, - 0x82080480, 0x00000010, 0x04021003, 0x80000580, - 0x0401f003, 0x42001000, 0x00000010, 0x4800b80d, - 0x4808b804, 0x800810c4, 0x4808b805, 0x82040400, - 0x00000004, 0x4800b803, 0x405c1000, 0x0201f800, - 0x001008a1, 0x0401f025, 0x0401f828, 0x585c000c, - 0x80026540, 0x59300000, 0x80000d40, 0x04020002, - 0x4800b80b, 0x4800b80c, 0x497a6000, 0x4c000000, - 0x4978b80a, 0x59325808, 0x4a025a04, 0x00000103, - 0x59300402, 0x48025c06, 0x592c100b, 0x4c080000, - 0x0201f800, 0x00020381, 0x0201f800, 0x00108ee7, - 0x5c001000, 0x8c081518, 0x04000004, 0x0201f800, - 0x00108f88, 0x0401f003, 0x0201f800, 0x000208b4, - 0x405c7000, 0x5c000000, 0x80026540, 0x04000003, - 0x59325808, 0x0401ff78, 0x5c00b800, 0x5c025800, - 0x5c026000, 0x1c01f000, 0x483bc857, 0x5838000a, - 0x40025800, 0x0201f800, 0x00100843, 0x5838000c, - 0x80026540, 0x59300008, 0x80025d40, 0x4a025a06, - 0x00000002, 0x1c01f000, 0x4803c857, 0x4d1c0000, - 0x497a601c, 0x41323800, 0x40026000, 0x4d3c0000, - 0x42027800, 0x00000005, 0x0401f840, 0x5c027800, - 0x411e6000, 0x59300414, 0x84000502, 0x48026414, - 0x5c023800, 0x1c01f000, 0x481bc857, 0x4933c857, - 0x4c5c0000, 0x4c600000, 0x4010b800, 0x4014c000, - 0x0201f800, 0x0010a766, 0x0201f800, 0x0010393e, - 0x04000008, 0x40602800, 0x405c3000, 0x0201f800, - 0x0010a258, 0x82000540, 0x00000001, 0x0401f002, - 0x80000580, 0x5c00c000, 0x5c00b800, 0x1c01f000, - 0x4803c856, 0x4d300000, 0x42026000, 0x0010cfc0, - 0x59a8000e, 0x81640580, 0x0400001a, 0x59300c06, - 0x82040580, 0x00000001, 0x0400000d, 0x82040580, - 0x00000004, 0x04000006, 0x82040580, 0x00000010, - 0x02000800, 0x00108aad, 0x0401f009, 0x59300203, - 0x82000d80, 0x00000007, 0x04000005, 0x4807c857, - 0x0201f800, 0x0010909d, 0x04020808, 0x83326400, - 0x00000024, 0x41580000, 0x81300480, 0x040017e5, - 0x5c026000, 0x1c01f000, 0x4933c857, 0x59300403, - 0x4803c857, 0x0201f800, 0x0010698c, 0x4df00000, - 0x59300406, 0x4803c857, 0x82000d80, 0x00000002, - 0x04000018, 0x82000d80, 0x00000001, 0x04000009, - 0x82000d80, 0x00000004, 0x04000006, 0x4933c856, - 0x5c03e000, 0x02000800, 0x00106982, 0x0401f03c, - 0x59300203, 0x82000d80, 0x00000001, 0x04000018, - 0x82000d80, 0x00000002, 0x04000026, 0x82000d80, - 0x00000005, 0x04000023, 0x0201f800, 0x00100615, - 0x59300203, 0x82000d80, 0x00000009, 0x0400000c, - 0x82000d80, 0x0000000b, 0x04000009, 0x82000d80, - 0x0000000a, 0x04000017, 0x82000d80, 0x0000000c, - 0x04000014, 0x0201f800, 0x00100615, 0x598c000d, - 0x81300580, 0x04020004, 0x0201f800, 0x00106be2, - 0x0402000c, 0x59300004, 0x4803c857, 0x8c000520, - 0x04000004, 0x84000520, 0x48026004, 0x0401f005, - 0x0201f800, 0x00106619, 0x02020800, 0x00100615, - 0x5c03e000, 0x02000800, 0x00106982, 0x59300406, - 0x82000d80, 0x00000002, 0x04000009, 0x0201f800, - 0x00104a83, 0x0201f800, 0x00108f05, 0x02000800, - 0x00107da6, 0x8d3e7d00, 0x04000003, 0x0201f000, - 0x00107698, 0x4a02621d, 0x00000001, 0x4a026403, - 0x00000085, 0x4a026203, 0x00000009, 0x4a026406, - 0x00000002, 0x42000800, 0x8000004b, 0x0201f000, - 0x00020855, 0x4933c857, 0x59368c03, 0x4c180000, - 0x59300203, 0x82003480, 0x0000000e, 0x02021800, - 0x00100615, 0x0c01f803, 0x5c003000, 0x1c01f000, - 0x001096da, 0x00109bb9, 0x00109cbd, 0x001096da, - 0x001096da, 0x001096da, 0x001096da, 0x001096da, - 0x001096fd, 0x001096da, 0x001096da, 0x001096da, - 0x001096da, 0x001096da, 0x0201f800, 0x00100615, - 0x4933c857, 0x42028800, 0x0000ffff, 0x813669c0, - 0x04000002, 0x59368c03, 0x4c180000, 0x59300203, - 0x82003480, 0x0000000e, 0x02021800, 0x00100615, - 0x0c01f803, 0x5c003000, 0x1c01f000, 0x001096f9, - 0x00109f70, 0x001096f9, 0x001096f9, 0x001096f9, - 0x001096f9, 0x001096f9, 0x0010a779, 0x00109edd, - 0x0010a34a, 0x0010a380, 0x0010a34a, 0x0010a380, - 0x001096f9, 0x0201f800, 0x00100615, 0x0201f800, - 0x00100615, 0x83383480, 0x00000051, 0x02021800, - 0x00100615, 0x41380000, 0x493bc857, 0x4d1c0000, - 0x4d400000, 0x0c01f804, 0x5c028000, 0x5c023800, - 0x1c01f000, 0x0010975a, 0x0010993d, 0x0010975a, - 0x0010975a, 0x0010975a, 0x00109948, 0x0010975a, - 0x0010975a, 0x0010975a, 0x0010975a, 0x0010975a, - 0x0010975a, 0x0010975a, 0x0010975a, 0x0010975a, - 0x0010975a, 0x0010975a, 0x0010975a, 0x0010975a, - 0x0010975a, 0x0010975a, 0x0010975a, 0x0010975a, - 0x0010977c, 0x001097ba, 0x001097d1, 0x0010982d, - 0x00109894, 0x001098d2, 0x00109902, 0x0010975a, - 0x0010975a, 0x00109950, 0x0010975a, 0x0010975a, - 0x0010995e, 0x00109967, 0x0010975a, 0x0010975a, - 0x0010975a, 0x0010975a, 0x0010975a, 0x001099e9, - 0x0010975a, 0x0010975a, 0x00109868, 0x0010975a, - 0x0010975a, 0x001099c0, 0x0010975a, 0x0010975a, - 0x0010975a, 0x001099f7, 0x0010975a, 0x0010975a, - 0x0010975a, 0x00109a40, 0x0010975a, 0x0010975a, - 0x0010975a, 0x0010975a, 0x0010975a, 0x0010975a, - 0x00109a8d, 0x0010975a, 0x00109ab9, 0x00109ac4, - 0x0010975a, 0x0010975a, 0x0010975c, 0x00109acf, - 0x0010975a, 0x0010975a, 0x0010975a, 0x0010976b, - 0x0010975a, 0x0010975a, 0x0010975a, 0x00109ad6, - 0x00109ade, 0x00109afc, 0x0201f800, 0x00100615, - 0x4933c857, 0x0201f800, 0x0010a3b0, 0x040203a8, - 0x0201f800, 0x00101eb0, 0x040203a5, 0x59cc0407, - 0x4802601c, 0x4a026403, 0x00000045, 0x4a026203, - 0x00000001, 0x0201f000, 0x00106470, 0x4933c857, - 0x0201f800, 0x0010a3b0, 0x04020399, 0x0201f800, - 0x00101eb0, 0x04020396, 0x0401fbd6, 0x0402019e, - 0x59cc0007, 0x4802601c, 0x4a026403, 0x0000004a, - 0x4a026203, 0x00000001, 0x0201f000, 0x00106470, - 0x4933c857, 0x0201f800, 0x00101eb0, 0x04020009, - 0x0201f800, 0x0010473b, 0x04020006, 0x82000500, - 0x00000009, 0x82000580, 0x00000008, 0x04020008, - 0x4a026403, 0x00000009, 0x4a02641a, 0x00000009, - 0x4a02621a, 0x00000000, 0x0401f1b6, 0x0201f800, - 0x00104858, 0x04000018, 0x0201f800, 0x0010a041, - 0x0402001f, 0x42028000, 0x00000029, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x00101de2, 0x5c027800, - 0x0201f800, 0x00104480, 0x4a026403, 0x00000008, - 0x42003000, 0x00000003, 0x0201f800, 0x0010393e, - 0x040001a0, 0x4a026203, 0x00000007, 0x41782800, - 0x0401f18b, 0x0201f800, 0x0010a1ec, 0x040207e7, - 0x4a026403, 0x00000009, 0x4a02641a, 0x0000000e, - 0x4a02621a, 0x00001900, 0x0401f192, 0x4a026403, - 0x00000009, 0x4a02641a, 0x00000003, 0x4a02621a, - 0x00000f00, 0x0401f18b, 0x4933c857, 0x0201f800, - 0x00101eb0, 0x0402034a, 0x0201f800, 0x0010473b, - 0x04020347, 0x493a6403, 0x0201f800, 0x0010a01c, - 0x04020006, 0x42003000, 0x00000005, 0x4a026403, - 0x00000006, 0x0401f7d9, 0x4a026403, 0x00000007, - 0x4a02641a, 0x00000009, 0x4a02621a, 0x00000000, - 0x0401f174, 0x4933c857, 0x0201f800, 0x0010473b, - 0x04020333, 0x0201f800, 0x0010a3b0, 0x02000800, - 0x00101eb0, 0x0402032e, 0x0201f800, 0x00104858, - 0x04020005, 0x42027800, 0x00000001, 0x0201f800, - 0x001043bd, 0x0201f800, 0x0010484b, 0x04020031, - 0x59cc0206, 0x82003500, 0x00000003, 0x04020034, - 0x82003480, 0x00000014, 0x04001031, 0x5934300a, - 0x84183516, 0x82000580, 0x00000014, 0x04020002, - 0x84183556, 0x481a680a, 0x59cc0406, 0x82000500, - 0x00000003, 0x04020026, 0x0201f800, 0x0010a08e, - 0x0402002e, 0x0201f800, 0x00104836, 0x04020007, - 0x4c600000, 0x4178c000, 0x417a7800, 0x0201f800, - 0x00101e48, 0x5c00c000, 0x836c0580, 0x00000003, - 0x04020009, 0x42003000, 0x00000006, 0x0201f800, - 0x0010a75e, 0x42000000, 0x0010b664, 0x0201f800, - 0x0010a86e, 0x0201f800, 0x001044e1, 0x4a026403, - 0x0000000a, 0x42003000, 0x00000020, 0x0401f78f, - 0x4a026403, 0x0000000b, 0x4a02641a, 0x00000009, - 0x4a02621a, 0x00001e00, 0x0401f12a, 0x42000000, - 0x0010b65f, 0x0201f800, 0x0010a86e, 0x4a026403, - 0x0000000b, 0x4a02641a, 0x00000007, 0x4a02621a, - 0x00000000, 0x0401f11f, 0x4a026403, 0x0000000b, - 0x4a02641a, 0x00000003, 0x4a02621a, 0x00000000, - 0x0401f118, 0x4933c857, 0x0201f800, 0x0010473b, - 0x040202d7, 0x0201f800, 0x0010a3b0, 0x040202d4, - 0x0201f800, 0x00101eb0, 0x040202d1, 0x59cc0206, - 0x82003500, 0x00000003, 0x04020020, 0x82003480, - 0x00000014, 0x0400101d, 0x59cc0406, 0x82000500, - 0x00000003, 0x04020019, 0x59340400, 0x82000580, - 0x00000707, 0x0400001c, 0x417a7800, 0x4c600000, - 0x4178c000, 0x0201f800, 0x00101e48, 0x5c00c000, - 0x42003000, 0x0000000a, 0x0201f800, 0x0010a75e, - 0x42000000, 0x0010b661, 0x0201f800, 0x0010a86e, - 0x4a026403, 0x0000000c, 0x41782800, 0x42003000, - 0x00000021, 0x0401f749, 0x4a026403, 0x0000000d, - 0x4a02641a, 0x00000007, 0x4a02621a, 0x00000000, - 0x0401f0e4, 0x4a026403, 0x0000000d, 0x4a02641a, - 0x00000009, 0x4a02621a, 0x00001e00, 0x0401f0dd, - 0x4933c857, 0x0201f800, 0x0010473b, 0x0402029c, - 0x0201f800, 0x0010a3b0, 0x04020299, 0x0201f800, - 0x00101eb0, 0x04020296, 0x0401fad6, 0x0402001a, - 0x493a6403, 0x4c5c0000, 0x0401fadc, 0x0402000e, - 0x4a026403, 0x0000002e, 0x4014b800, 0x0201f800, - 0x0010393e, 0x0400000e, 0x4a026203, 0x00000007, - 0x405c2800, 0x42003000, 0x00000024, 0x5c00b800, - 0x0401f0af, 0x4a026403, 0x0000000d, 0x4a02641a, - 0x00000007, 0x4a02621a, 0x00000000, 0x5c00b800, - 0x0401f0b8, 0x4a026403, 0x0000000d, 0x4a02641a, - 0x00000009, 0x4a02621a, 0x00001e00, 0x0401f0b1, - 0x4933c857, 0x0201f800, 0x0010473b, 0x040206f1, - 0x59a80026, 0x82000500, 0x00000009, 0x82000580, - 0x00000008, 0x040006eb, 0x0201f800, 0x0010484b, - 0x0402002d, 0x0201f800, 0x0010a096, 0x04020007, - 0x4a026403, 0x0000000e, 0x41782800, 0x42003000, - 0x00000052, 0x0401f6f9, 0x4933c857, 0x42003000, - 0x00000003, 0x0201f800, 0x0010a766, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x00101de2, 0x5c027800, - 0x42000000, 0x0010b663, 0x0201f800, 0x0010a86e, - 0x59340200, 0x84000558, 0x48026a00, 0x42000800, - 0x0000000b, 0x0201f800, 0x001043c7, 0x0201f800, - 0x0010393e, 0x0400007c, 0x42003000, 0x00000007, - 0x0401f061, 0x4933c857, 0x4a026403, 0x0000000f, - 0x4a02641a, 0x00000003, 0x4a02621a, 0x00001e00, - 0x0401f078, 0x59340400, 0x82000580, 0x00000703, - 0x040007f5, 0x0401f040, 0x4933c857, 0x0201f800, - 0x0010473b, 0x04020232, 0x59a80026, 0x82000500, - 0x00000009, 0x82000580, 0x00000008, 0x0400022c, - 0x0201f800, 0x00104842, 0x0402002f, 0x0201f800, - 0x0010a0b1, 0x02000800, 0x0010a041, 0x04020007, - 0x4a026403, 0x00000010, 0x41782800, 0x42003000, - 0x00000050, 0x0401f6b9, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x00101de2, 0x5c027800, 0x42003000, - 0x00000003, 0x0201f800, 0x0010a766, 0x42000000, - 0x0010b663, 0x0201f800, 0x0010a86e, 0x59340200, - 0x84000558, 0x48026a00, 0x0401f7c5, 0x4a026403, - 0x00000011, 0x4a02641a, 0x00000003, 0x4a02621a, - 0x00001e00, 0x0401f043, 0x4933c857, 0x0201f800, - 0x00101eb0, 0x02000800, 0x0010a3b0, 0x04020200, - 0x0401fa40, 0x04020008, 0x4a026403, 0x00000012, - 0x0401f038, 0x59340400, 0x82000580, 0x00000703, - 0x040007eb, 0x4d3c0000, 0x417a7800, 0x42028000, - 0x00000029, 0x0201f800, 0x00101de2, 0x5c027800, - 0x42003000, 0x00000017, 0x0201f800, 0x0010a766, - 0x42000000, 0x0010b663, 0x0201f800, 0x0010a86e, - 0x0201f800, 0x0010393e, 0x0400001b, 0x42003000, - 0x00000006, 0x42028000, 0x00000029, 0x4933c857, - 0x4a026403, 0x00000001, 0x4a026203, 0x00000007, - 0x4c180000, 0x0201f800, 0x0010a79b, 0x5c003000, - 0x41782800, 0x0201f000, 0x0010a250, 0x42028000, - 0x00000046, 0x4c140000, 0x4c180000, 0x0201f800, - 0x0010a79b, 0x5c003000, 0x5c002800, 0x0201f000, - 0x0010a250, 0x4933c857, 0x4a026403, 0x00000001, - 0x42000800, 0x0000000b, 0x0201f800, 0x001043c7, - 0x4a026203, 0x00000001, 0x0201f000, 0x00106470, - 0x4933c857, 0x42000800, 0x00000009, 0x0201f800, - 0x001043c7, 0x4a026403, 0x00000005, 0x0401f7f5, - 0x0201f800, 0x0010a3b0, 0x040201b5, 0x0201f800, - 0x00101eb0, 0x040201b2, 0x0401f9f2, 0x040207ba, - 0x4a026403, 0x00000020, 0x4a026203, 0x00000001, - 0x0201f000, 0x00106470, 0x0201f800, 0x00101eb0, - 0x040201a7, 0x4a026403, 0x00000023, 0x4a026203, - 0x00000001, 0x0201f000, 0x00106470, 0x0201f800, - 0x0010a3b0, 0x02000800, 0x00101eb0, 0x0402019c, - 0x0401f9dc, 0x040207a4, 0x40300800, 0x59a81010, - 0x59cc0007, 0x82000500, 0x00ffffff, 0x80080580, - 0x04000019, 0x59cc1408, 0x0201f800, 0x00108de9, - 0x0400002d, 0x59cc0c08, 0x4d300000, 0x0201f800, - 0x00105b0f, 0x41323800, 0x5c026000, 0x04000026, - 0x591c0202, 0x82000580, 0x0000ffff, 0x04000005, - 0x59cc1208, 0x591c0202, 0x80080580, 0x0402001e, - 0x591c0406, 0x82000580, 0x00000007, 0x0402001a, - 0x0401f02c, 0x59cc1208, 0x82080580, 0x0000ffff, - 0x0400000c, 0x0201f800, 0x001091d9, 0x04000012, - 0x59cc1408, 0x591c0202, 0x80080580, 0x0402000e, - 0x591c0009, 0x81340580, 0x04000016, 0x0401f00a, - 0x59cc1408, 0x417a7800, 0x0201f800, 0x0010a217, - 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, 0x000208b4, - 0x5c026000, 0x4a026403, 0x00000025, 0x0401f785, - 0x4933c857, 0x4d3c0000, 0x42027800, 0x00000001, - 0x0201f800, 0x001043bd, 0x5c027800, 0x4c580000, - 0x4200b000, 0x00000002, 0x83a81c00, 0x00000002, - 0x83cc1400, 0x0000000b, 0x0201f800, 0x001082ff, - 0x5c00b000, 0x04000004, 0x4a026403, 0x00000031, - 0x0401f770, 0x0201f800, 0x00107698, 0x0201f800, - 0x00104e0d, 0x0402000f, 0x0201f800, 0x00104e1b, - 0x04020008, 0x4a035033, 0x00000001, 0x4202d800, - 0x00000001, 0x0201f800, 0x00104d76, 0x0401f005, - 0x42000000, 0x00000001, 0x0201f800, 0x00104de5, - 0x1c01f000, 0x0201f800, 0x00101eb0, 0x0402011c, - 0x0401f95c, 0x04020724, 0x493a6403, 0x0401f9ac, - 0x04020004, 0x4a026403, 0x0000002b, 0x0401f751, - 0x4a026403, 0x0000002c, 0x0401f74e, 0x4933c857, - 0x0201f800, 0x00101eb0, 0x0402010d, 0x0201f800, - 0x00104836, 0x04020740, 0x0201f800, 0x00104728, - 0x0400003c, 0x59cc0408, 0x48026419, 0x59cc0208, - 0x48026219, 0x59cc0807, 0x59340002, 0x82000500, - 0x00ffffff, 0x80040580, 0x04000012, 0x59a80010, - 0x80040580, 0x04020021, 0x59cc1408, 0x0201f800, - 0x001091d9, 0x04000023, 0x0201f800, 0x0010a2e8, - 0x04000020, 0x0201f800, 0x0010a745, 0x0400001d, - 0x491e601e, 0x4a026403, 0x00000036, 0x0401f0e6, - 0x59cc1208, 0x82080580, 0x0000ffff, 0x04000009, - 0x0201f800, 0x001091d9, 0x04000012, 0x591c0202, - 0x59cc0c08, 0x80040580, 0x0402000e, 0x0401f7eb, - 0x59cc1408, 0x41327800, 0x0201f800, 0x0010a217, - 0x04000008, 0x0401f7e5, 0x4803c856, 0x4a02641a, - 0x00000009, 0x4a02621a, 0x00001500, 0x0401f006, - 0x4803c856, 0x4a02641a, 0x00000003, 0x4a02621a, - 0x00001700, 0x4a026403, 0x00000037, 0x0401f0c6, - 0x4803c856, 0x4a026403, 0x00000012, 0x0401f0c2, - 0x4933c857, 0x0201f800, 0x00101eb0, 0x040200c4, - 0x0201f800, 0x00104836, 0x040206f7, 0x0201f800, - 0x00104728, 0x0400003e, 0x59cc0407, 0x48026419, - 0x59cc1207, 0x480a6219, 0x82080580, 0x0000ffff, - 0x04000005, 0x0201f800, 0x001091d9, 0x0400002c, - 0x0401f006, 0x59cc1407, 0x41327800, 0x0201f800, - 0x0010a217, 0x04000026, 0x59cc0c07, 0x591c0202, - 0x80040580, 0x04020022, 0x4d300000, 0x411e6000, - 0x0201f800, 0x0010898b, 0x5c026000, 0x59cc0c09, - 0x82040d00, 0x0000ff00, 0x840409c0, 0x0201f800, - 0x0010a745, 0x04000016, 0x82040580, 0x00000001, - 0x0400000a, 0x82040580, 0x00000005, 0x04000004, - 0x82040580, 0x00000007, 0x04020007, 0x591c0008, - 0x80000540, 0x04000004, 0x59cc2808, 0x0201f000, - 0x0010a2fc, 0x4803c856, 0x4a02641a, 0x00000009, - 0x4a02621a, 0x00002a00, 0x0401f006, 0x4803c856, - 0x4a02641a, 0x00000003, 0x4a02621a, 0x00000300, - 0x4a026403, 0x0000003b, 0x0401f07b, 0x4803c856, - 0x4a02641a, 0x0000000b, 0x4a02621a, 0x00000000, - 0x0401f7f8, 0x4c080000, 0x0201f800, 0x0010473b, - 0x04000026, 0x0201f800, 0x00104711, 0x0201f800, - 0x0010a41c, 0x0402001e, 0x59a80026, 0x82000540, - 0x00000003, 0x48035026, 0x59a8001d, 0x800000d0, - 0x59a80810, 0x82040d00, 0x000000ff, 0x80041540, - 0x480b5010, 0x42000800, 0x00000003, 0x0201f800, - 0x001069af, 0x497b5028, 0x0201f800, 0x0010393e, - 0x04000003, 0x4a032804, 0x000007d0, 0x8c00050a, - 0x0402000a, 0x0201f800, 0x000208b4, 0x0201f800, - 0x00101bf0, 0x5c001000, 0x1c01f000, 0x0201f800, - 0x0010a43e, 0x0401f7fc, 0x5c001000, 0x0201f000, - 0x000208b4, 0x0201f800, 0x00101eb0, 0x0402004c, - 0x0201f800, 0x0010a443, 0x4a026403, 0x00000047, - 0x4a026203, 0x00000001, 0x0201f000, 0x00106470, - 0x0201f800, 0x00101eb0, 0x04020041, 0x0201f800, - 0x0010a443, 0x4a026403, 0x00000047, 0x4a026203, - 0x00000001, 0x0201f000, 0x00106470, 0x0201f800, - 0x00101eb0, 0x04020036, 0x0201f800, 0x0010a443, - 0x0201f000, 0x000208b4, 0x0401f834, 0x04000030, - 0x4a026403, 0x0000004e, 0x4a026203, 0x00000001, - 0x0201f000, 0x00106470, 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, 0x001082ff, - 0x0400064c, 0x4a02601c, 0x00000001, 0x0401f649, - 0x4a026403, 0x00000050, 0x59cc0207, 0x4802601c, - 0x0401f644, 0x4a026203, 0x00000001, 0x42000800, - 0x80000040, 0x0201f000, 0x00020855, 0x4803c857, - 0x0201f000, 0x000208b4, 0x4d2c0000, 0x4c500000, - 0x4c580000, 0x4c540000, 0x59a80016, 0x82000c80, - 0x00000841, 0x0402102d, 0x0201f800, 0x00100819, - 0x0400002a, 0x492e6008, 0x59a80016, 0x48025802, - 0x82000400, 0x00000003, 0x80000104, 0x83cca400, - 0x00000006, 0x82000c80, 0x0000000b, 0x04001015, - 0x4a025811, 0x0000000b, 0x4200b000, 0x0000000b, - 0x832c0400, 0x00000005, 0x4000a800, 0x0201f800, - 0x0010a93e, 0x412c7000, 0x800409c0, 0x04020003, - 0x49787001, 0x0401f00e, 0x0201f800, 0x00100819, - 0x0400000e, 0x492c7001, 0x40040000, 0x0401f7ea, - 0x48025811, 0x4000b000, 0x832c0400, 0x00000005, - 0x4000a800, 0x0201f800, 0x0010a93e, 0x82000540, - 0x00000001, 0x0401f006, 0x497b5016, 0x59325808, - 0x0201f800, 0x00100843, 0x80000580, 0x5c00a800, - 0x5c00b000, 0x5c00a000, 0x5c025800, 0x1c01f000, - 0x4d340000, 0x59326809, 0x59343400, 0x4933c857, - 0x4937c857, 0x481bc857, 0x0201f800, 0x00104842, - 0x5c026800, 0x1c01f000, 0x4933c857, 0x4c600000, - 0x4c5c0000, 0x4d3c0000, 0x4d440000, 0x4d340000, - 0x0401f84f, 0x04020037, 0x59cc0207, 0x82000d00, - 0x0000ff00, 0x900411c0, 0x59cc000a, 0x82000500, - 0x00ffffff, 0x80081540, 0x480a601c, 0x8c040d18, - 0x04000011, 0x42003000, 0x00000008, 0x0201f800, - 0x0010a756, 0x42000000, 0x0010b662, 0x0201f800, - 0x0010a86e, 0x4200b800, 0x00000002, 0x4200c000, - 0x00000001, 0x417a7800, 0x0201f800, 0x00101e48, - 0x0401f01f, 0x4178b800, 0x8c040d1a, 0x04000019, - 0x59cc000a, 0x0201f800, 0x001059b9, 0x02000800, - 0x00020267, 0x04020013, 0x59300009, 0x4c000000, - 0x49366009, 0x42003000, 0x00000009, 0x0201f800, - 0x0010a75e, 0x42000000, 0x0010b662, 0x0201f800, - 0x0010a86e, 0x417a7800, 0x4178c000, 0x0201f800, - 0x00101e48, 0x5c000000, 0x48026009, 0x0401f004, - 0x82000540, 0x00000001, 0x0401f003, 0x405c2800, - 0x80000580, 0x5c026800, 0x5c028800, 0x5c027800, - 0x5c00b800, 0x5c00c000, 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, 0x59300403, 0x82003480, 0x00000051, - 0x02021800, 0x00100615, 0x83383580, 0x00000013, - 0x04020003, 0x4803c857, 0x0c01f016, 0x4933c857, - 0x493bc857, 0x83383580, 0x00000027, 0x04000005, - 0x83383580, 0x00000014, 0x02020800, 0x00100615, - 0x493bc857, 0x4937c857, 0x0201f800, 0x00104711, - 0x42000800, 0x00000007, 0x0201f800, 0x001043c7, - 0x0201f800, 0x001068f6, 0x0201f000, 0x00107698, - 0x00109c29, 0x00109c32, 0x00109c29, 0x00109c29, - 0x00109c29, 0x00109c32, 0x00109c3d, 0x00109cb0, - 0x00109c82, 0x00109cb0, 0x00109c9a, 0x00109cb0, - 0x00109ca1, 0x00109cb0, 0x00109ca9, 0x00109cb0, - 0x00109ca9, 0x00109cb0, 0x00109cb0, 0x00109c29, - 0x00109c29, 0x00109c29, 0x00109c29, 0x00109c29, - 0x00109c29, 0x00109c29, 0x00109c29, 0x00109c29, - 0x00109c29, 0x00109c29, 0x00109c32, 0x00109c29, - 0x00109cb0, 0x00109c29, 0x00109c29, 0x00109cb0, - 0x00109c29, 0x00109cad, 0x00109cb0, 0x00109c29, - 0x00109c29, 0x00109c29, 0x00109c29, 0x00109cb0, - 0x00109cb0, 0x00109c29, 0x00109ca6, 0x00109cb0, - 0x00109c29, 0x00109c37, 0x00109c29, 0x00109c29, - 0x00109c29, 0x00109c29, 0x00109cac, 0x00109cb0, - 0x00109c29, 0x00109c29, 0x00109cb0, 0x00109cb0, - 0x00109c29, 0x00109c29, 0x00109c29, 0x00109c29, - 0x00109c29, 0x00109c29, 0x00109c29, 0x00109c29, - 0x00109c29, 0x00109c2b, 0x00109c29, 0x00109c2b, - 0x00109c29, 0x00109c29, 0x00109c2b, 0x00109c29, - 0x00109c29, 0x00109c29, 0x00109c2b, 0x00109c2b, - 0x00109c2b, 0x0201f800, 0x00100615, 0x4d2c0000, - 0x59325808, 0x0201f800, 0x00100843, 0x5c025800, - 0x0201f000, 0x000208b4, 0x59a80037, 0x48026206, - 0x4a026203, 0x00000002, 0x1c01f000, 0x4d3c0000, - 0x417a7800, 0x0201f800, 0x001043bd, 0x5c027800, - 0x0401f074, 0x42000800, 0x00000007, 0x0201f800, - 0x001043c7, 0x59a80026, 0x8c000508, 0x04000012, - 0x59326809, 0x4c580000, 0x4200b000, 0x00000002, - 0x83a81c00, 0x00000002, 0x83341400, 0x00000006, - 0x0201f800, 0x001082ff, 0x80000540, 0x5c00b000, - 0x04020060, 0x59340200, 0x8400051a, 0x48026a00, - 0x0401f01b, 0x599c0017, 0x8c00050a, 0x04020059, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x001043bd, - 0x5c027800, 0x42000800, 0x00000007, 0x0201f800, - 0x001043c7, 0x59340212, 0x82000500, 0x0000ff00, - 0x0400004c, 0x599c0019, 0x8c00050e, 0x04020049, - 0x416c0000, 0x82000580, 0x00000002, 0x04020004, - 0x59a8001b, 0x80000000, 0x4803501b, 0x42000800, - 0x00000003, 0x0201f800, 0x001043c7, 0x4a026406, - 0x00000001, 0x4a026203, 0x00000001, 0x4a026403, - 0x00000002, 0x0201f800, 0x00106470, 0x4ce80000, - 0x4201d000, 0x00000001, 0x0201f800, 0x00105ce7, - 0x5c01d000, 0x1c01f000, 0x0201f800, 0x00104842, - 0x0400002c, 0x0201f800, 0x00106196, 0x42000800, - 0x00000004, 0x0201f800, 0x001043c7, 0x0201f800, - 0x0010a791, 0x04020023, 0x42000800, 0x00000005, - 0x0201f800, 0x001043c7, 0x4a026406, 0x00000001, - 0x4a026203, 0x00000001, 0x4a026403, 0x00000003, - 0x0201f000, 0x00106470, 0x0201f800, 0x0010484b, - 0x04020014, 0x42000800, 0x00000006, 0x0401f813, - 0x0401f010, 0x42000800, 0x00000004, 0x0201f800, - 0x001043c7, 0x0401f79c, 0x42000800, 0x00000004, - 0x0401f006, 0x0201f800, 0x00104711, 0x0401f005, - 0x0401f004, 0x0401f003, 0x0201f800, 0x001043c7, - 0x0201f000, 0x000208b4, 0x4933c857, 0x4807c857, - 0x0201f800, 0x001043c7, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x001043bd, 0x5c027800, 0x0201f000, - 0x00104711, 0x59340400, 0x4803c857, 0x80000110, - 0x82003480, 0x0000000c, 0x02021800, 0x00100615, - 0x83383580, 0x00000015, 0x04020002, 0x0c01f006, - 0x83383580, 0x00000016, 0x02020800, 0x00100615, - 0x0c01f00d, 0x00107e42, 0x00107e42, 0x00107e42, - 0x00107e42, 0x00107e42, 0x00107e42, 0x00109d11, - 0x00109ce5, 0x00107e42, 0x00107e42, 0x00107e42, - 0x00107e42, 0x00107e42, 0x00107e42, 0x00107e42, - 0x00107e42, 0x00107e42, 0x00107e42, 0x00109d11, - 0x00109d18, 0x00107e42, 0x00107e42, 0x00107e42, - 0x00107e42, 0x4933c857, 0x599c0017, 0x8c00050a, - 0x0402001b, 0x813669c0, 0x04000019, 0x59340212, - 0x82000500, 0x0000ff00, 0x04000015, 0x599c0019, - 0x8c00050e, 0x04020012, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x001043bd, 0x5c027800, 0x42000800, - 0x00000003, 0x0201f800, 0x001043c7, 0x4a026406, - 0x00000001, 0x4a026203, 0x00000001, 0x4a026403, - 0x00000002, 0x0201f000, 0x00106470, 0x59cc0001, - 0x59340802, 0x80040580, 0x82000500, 0x00ffffff, - 0x02020000, 0x000208b4, 0x59345002, 0x0201f800, - 0x001040e4, 0x482a6802, 0x0201f000, 0x000208b4, - 0x1c01f000, 0x4933c857, 0x59303403, 0x82183580, - 0x0000001e, 0x02000000, 0x000208b4, 0x1c01f000, - 0x4933c857, 0x0201f800, 0x00108180, 0x02020000, - 0x000208b4, 0x4a026203, 0x00000001, 0x4a026403, - 0x00000001, 0x0201f000, 0x00106470, 0x493bc857, - 0x83380580, 0x00000051, 0x0402000b, 0x0201f800, - 0x00106cb4, 0x02020000, 0x001076fb, 0x59300203, - 0x82000580, 0x00000002, 0x0400006e, 0x0201f800, - 0x00100615, 0x83380580, 0x00000027, 0x04000014, - 0x83380580, 0x00000048, 0x04000006, 0x83380580, - 0x00000014, 0x0400000e, 0x02020800, 0x00100615, - 0x0201f800, 0x00106cb4, 0x02020000, 0x001076fb, - 0x59300203, 0x82000580, 0x00000004, 0x02000000, - 0x000209a5, 0x0201f800, 0x00100615, 0x4933c857, - 0x59300403, 0x82000c80, 0x00000044, 0x02021800, - 0x00100615, 0x82000480, 0x00000040, 0x02001800, - 0x00100615, 0x40027000, 0x4803c857, 0x0c01f001, - 0x00109d58, 0x00109d5a, 0x00109d5a, 0x00109d75, - 0x0201f800, 0x00100615, 0x0201f800, 0x001068f6, - 0x59325808, 0x812e59c0, 0x04000016, 0x832c0500, - 0x00ff0000, 0x04000013, 0x4a026203, 0x00000002, - 0x59326809, 0x59340200, 0x8c00050e, 0x0402000d, - 0x42028000, 0x00000004, 0x0201f800, 0x0010a201, - 0x497a6008, 0x59300206, 0x80000540, 0x04020003, - 0x59a80038, 0x48026206, 0x4a026203, 0x00000007, - 0x1c01f000, 0x0201f800, 0x001068f6, 0x0201f800, - 0x00108df4, 0x02000000, 0x00107698, 0x59325808, - 0x0201f800, 0x0010083a, 0x0201f000, 0x00107698, - 0x0201f800, 0x00100615, 0x59325808, 0x592c040a, - 0x8c000502, 0x04000007, 0x4a026203, 0x00000007, - 0x42027000, 0x00000043, 0x0201f000, 0x000208d8, - 0x4a026203, 0x00000004, 0x1c01f000, 0x0201f800, - 0x0010a3b6, 0x02000000, 0x000209a3, 0x1c01f000, - 0x4a026203, 0x00000001, 0x4a026403, 0x00000041, - 0x42027800, 0x80002042, 0x0201f000, 0x00020855, - 0x83380580, 0x00000051, 0x04000006, 0x83380580, - 0x00000041, 0x02020800, 0x00100615, 0x1c01f000, - 0x0201f800, 0x00020831, 0x0201f800, 0x0010a3fa, - 0x0201f000, 0x000208b4, 0x83380480, 0x00000052, - 0x02021800, 0x00100615, 0x83380480, 0x00000049, - 0x02001800, 0x00100615, 0x0c01f001, 0x00109dbe, - 0x00109ddf, 0x00109dbc, 0x00109dbc, 0x00109dbc, - 0x00109dbc, 0x00109ddf, 0x00109dbc, 0x00109e01, - 0x0201f800, 0x00100615, 0x59325808, 0x592c040a, - 0x8c00051e, 0x0400000d, 0x82000d00, 0x000000c0, - 0x82040d80, 0x00000080, 0x0400000d, 0x59300804, - 0x8c040d18, 0x0402000a, 0x42027000, 0x00000041, - 0x0201f000, 0x000209c4, 0x4a026203, 0x00000007, - 0x497a6206, 0x0201f000, 0x00020831, 0x59325808, - 0x592c0c0a, 0x8c040d1a, 0x04020005, 0x0201f800, - 0x00020831, 0x0201f000, 0x000208b4, 0x0201f800, - 0x0010a3b6, 0x040007fa, 0x1c01f000, 0x0201f800, - 0x001068c1, 0x59325808, 0x59326809, 0x59340200, - 0x8c00050e, 0x0400000e, 0x592c040a, 0x82000500, - 0x000000c0, 0x82000580, 0x00000080, 0x04000005, - 0x592c000f, 0x59301815, 0x800c1c80, 0x480e6015, - 0x4a026203, 0x00000002, 0x0401f00e, 0x42028000, - 0x00000004, 0x0201f800, 0x0010a201, 0x59300206, - 0x80000540, 0x04020004, 0x59a80038, 0x800000c2, - 0x48026206, 0x497a6008, 0x4a026203, 0x00000007, - 0x1c01f000, 0x4933c857, 0x0201f800, 0x00106cb4, - 0x02020800, 0x00100615, 0x59300203, 0x82000580, - 0x00000002, 0x04000793, 0x0201f800, 0x00100615, - 0x4a026203, 0x00000007, 0x497a6206, 0x0201f000, - 0x00020831, 0x4a026203, 0x00000007, 0x497a6206, - 0x0201f000, 0x0002082c, 0x59300414, 0x8c00051c, - 0x02020000, 0x000209b5, 0x59325808, 0x592c200f, - 0x40080000, 0x80102480, 0x59300015, 0x80102400, - 0x48126015, 0x0201f000, 0x000209b5, 0x8c040d0e, - 0x0402000a, 0x4a026203, 0x00000006, 0x0401f823, - 0x5930001f, 0x80000540, 0x02020800, 0x00100dc4, - 0x0201f000, 0x0002082c, 0x4a026203, 0x00000002, - 0x1c01f000, 0x42000800, 0x00000001, 0x0201f800, - 0x00100dc4, 0x82040580, 0x00000001, 0x02000000, - 0x000209bc, 0x0401f7d8, 0x59300414, 0x8c00051c, - 0x04000006, 0x0201f800, 0x00100bad, 0x02000000, - 0x000209ae, 0x1c01f000, 0x59300011, 0x80000540, - 0x04020005, 0x0201f800, 0x00100bad, 0x02000000, - 0x000209ae, 0x1c01f000, 0x492fc857, 0x480bc857, - 0x8c08153e, 0x04000006, 0x80081080, 0x80081000, - 0x42000800, 0x00000009, 0x0401f003, 0x42000800, - 0x00000015, 0x480a580b, 0x1c01f000, 0x83380580, - 0x00000013, 0x04000005, 0x83380580, 0x00000014, - 0x02020800, 0x00100615, 0x59300414, 0x8c000516, - 0x02000800, 0x00100615, 0x1c01f000, 0x0201f800, - 0x00100615, 0x59300008, 0x80000540, 0x02020800, - 0x00100615, 0x1c01f000, 0x59300414, 0x8c000516, - 0x02000800, 0x00100615, 0x1c01f000, 0x4a026203, - 0x00000004, 0x493a6403, 0x42000800, 0x80002001, - 0x0201f000, 0x00020855, 0x4a026203, 0x00000003, - 0x493a6403, 0x0201f800, 0x000200ca, 0x59325808, - 0x592c040a, 0x8c00051e, 0x04000012, 0x82000500, - 0x000000c0, 0x82000580, 0x00000080, 0x04000011, - 0x59300414, 0x8c000512, 0x0402000a, 0x8c000510, - 0x04020008, 0x592c040c, 0x80000540, 0x04020005, - 0x82080d40, 0x80003065, 0x0201f000, 0x00106466, - 0x82080d40, 0x80002065, 0x0201f000, 0x00106466, - 0x82080d40, 0x80002042, 0x0201f000, 0x00106466, - 0x4933c857, 0x493bc857, 0x83380480, 0x00000044, - 0x02021800, 0x00100615, 0x83380480, 0x00000041, - 0x02001800, 0x00100615, 0x0c01f001, 0x00109ea6, - 0x00109eb6, 0x00109ecb, 0x59325808, 0x592c040a, - 0x8c00051e, 0x0400001d, 0x82001d00, 0x000000c0, - 0x820c1d80, 0x000000c0, 0x04000018, 0x4a026203, - 0x00000001, 0x493a6403, 0x42000800, 0x80002042, - 0x0201f000, 0x00020855, 0x59325808, 0x592c040a, - 0x8c00051e, 0x0400000d, 0x82001d00, 0x000000c0, - 0x820c1d80, 0x000000c0, 0x04000008, 0x4a026203, - 0x00000001, 0x493a6403, 0x42000800, 0x80002001, - 0x0201f000, 0x00020855, 0x497a6008, 0x497a6206, - 0x42028000, 0x00000004, 0x0401f337, 0x59325808, - 0x592c040a, 0x8c00051e, 0x040007f8, 0x82001d00, - 0x000000c0, 0x820c1d80, 0x000000c0, 0x040007f3, - 0x4a026203, 0x00000003, 0x493a6403, 0x0201f800, - 0x000200ca, 0x82080d40, 0x80002065, 0x0201f000, - 0x00106466, 0x4933c857, 0x493bc857, 0x83380580, - 0x00000085, 0x04000006, 0x83380580, 0x00000088, - 0x0400000a, 0x0201f800, 0x00100615, 0x4a026203, - 0x00000009, 0x493a6403, 0x42000800, 0x8000004b, - 0x0201f000, 0x00020855, 0x4d1c0000, 0x813669c0, - 0x04000004, 0x0201f800, 0x0010a3b0, 0x04020044, - 0x59cc1404, 0x0401f846, 0x04000018, 0x591c0406, - 0x82000500, 0x0000001f, 0x82002580, 0x00000006, - 0x04000007, 0x82002580, 0x00000004, 0x0400002e, - 0x82002580, 0x00000011, 0x0402000c, 0x497a3a05, - 0x42002000, 0x00000054, 0x0201f800, 0x001077d1, - 0x4a026203, 0x00000007, 0x493a6403, 0x0201f800, - 0x0010a79b, 0x0401f02c, 0x0201f800, 0x0010393e, - 0x04000004, 0x42023800, 0xffffffff, 0x0401f7f1, - 0x813669c0, 0x04020009, 0x59cc0001, 0x0201f800, - 0x001059b9, 0x0402001e, 0x0201f800, 0x001043fc, - 0x0402001b, 0x49366009, 0x4a026403, 0x00000087, - 0x59cc1204, 0x82081580, 0x0000ffff, 0x04020003, - 0x4a026403, 0x00000086, 0x4a026203, 0x00000001, - 0x42000800, 0x80000040, 0x0201f800, 0x00020855, - 0x0401f00d, 0x591c0203, 0x82000580, 0x00000007, - 0x040207de, 0x4d300000, 0x411e6000, 0x0201f800, - 0x00107698, 0x5c026000, 0x0401f7d8, 0x0201f800, - 0x00107698, 0x5c023800, 0x1c01f000, 0x4933c857, - 0x480bc857, 0x42002800, 0x0010cfc0, 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, - 0x83380580, 0x00000013, 0x0402000e, 0x59300403, - 0x4803c857, 0x82000c80, 0x00000085, 0x02001800, - 0x00100615, 0x82000c80, 0x00000093, 0x02021800, - 0x00100615, 0x82000480, 0x00000085, 0x0c01f019, - 0x83380580, 0x00000027, 0x04000005, 0x83380580, - 0x00000014, 0x02020000, 0x001076fb, 0x493bc857, - 0x0201f800, 0x001068f6, 0x59325808, 0x812e59c0, - 0x02000000, 0x00107698, 0x4a025a06, 0x00000031, - 0x4a025811, 0x00000004, 0x4a025812, 0x000000ff, - 0x0201f800, 0x00020381, 0x0201f000, 0x00107698, - 0x00109fa6, 0x00109fad, 0x00109fad, 0x00109fa6, - 0x00109fa6, 0x00109fa6, 0x00109fa6, 0x00109fa6, - 0x00109fa6, 0x00109fa6, 0x00109fa6, 0x00109fa6, - 0x00109fa6, 0x00109fa8, 0x0201f800, 0x00100615, - 0x59325808, 0x4a025a06, 0x00000000, 0x0201f800, - 0x00020381, 0x0201f000, 0x000208b4, 0x4933c857, - 0x42000000, 0x0010b672, 0x0201f800, 0x0010a86e, - 0x0201f800, 0x0010a3fa, 0x497a6205, 0x42028000, - 0x0000000b, 0x0401f807, 0x4a026406, 0x00000006, - 0x4a026203, 0x00000007, 0x497a6206, 0x1c01f000, - 0x4933c857, 0x4943c857, 0x59300406, 0x82000580, - 0x00000007, 0x04020002, 0x1c01f000, 0x0201f800, - 0x0010698c, 0x4df00000, 0x0201f800, 0x00108a99, - 0x82000c80, 0x0000000e, 0x02021800, 0x00100615, - 0x0c01f001, 0x00109ff4, 0x00109ff8, 0x00109fdf, - 0x0010a006, 0x0010a019, 0x00109fdf, 0x00109fdf, - 0x00109fdf, 0x00109fdf, 0x00109fdf, 0x00109fdf, - 0x00109fdf, 0x00109fdf, 0x00109fdf, 0x4d400000, - 0x5930001f, 0x80000540, 0x04000005, 0x41400800, - 0x0201f800, 0x00100dc4, 0x40068000, 0x4d2c0000, - 0x59325808, 0x0201f800, 0x00108df4, 0x04020a16, - 0x4c5c0000, 0x5930b809, 0x0201f800, 0x00107698, - 0x485e6009, 0x5c00b800, 0x5c025800, 0x5c028000, - 0x5c03e000, 0x02000000, 0x00106982, 0x1c01f000, - 0x598c000d, 0x81300580, 0x04020004, 0x0201f800, - 0x00106be2, 0x04020016, 0x0201f800, 0x00106619, - 0x040007df, 0x0201f800, 0x001068a3, 0x04000010, - 0x0201f800, 0x00100615, 0x0201f800, 0x00108a8a, - 0x04020004, 0x0201f800, 0x00106bb2, 0x04020008, - 0x0201f800, 0x001064f6, 0x040007d1, 0x0201f800, - 0x001068a3, 0x02020800, 0x00100615, 0x59300203, - 0x82000c80, 0x0000000e, 0x02021800, 0x00100615, - 0x0c01f7b9, 0x0201f800, 0x00100ee4, 0x0401f7c4, - 0x4933c857, 0x4d440000, 0x4d340000, 0x59cc0007, - 0x0201f800, 0x001059b9, 0x02000800, 0x00020267, - 0x0402001a, 0x59300009, 0x4c000000, 0x49366009, - 0x42003000, 0x0000000b, 0x0201f800, 0x0010a766, - 0x42000000, 0x0010b660, 0x0201f800, 0x0010a86e, - 0x4d3c0000, 0x4d400000, 0x42028000, 0x00000029, - 0x417a7800, 0x0201f800, 0x00101de2, 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, 0x4c580000, - 0x59cc000c, 0x59340802, 0x82040d00, 0x00ffffff, - 0x80040580, 0x04020012, 0x83cc1400, 0x00000008, - 0x4200b000, 0x00000002, 0x83341c00, 0x00000006, - 0x0201f800, 0x001082ff, 0x04020009, 0x83cc1400, - 0x0000000a, 0x4200b000, 0x00000002, 0x83341c00, - 0x00000008, 0x0201f800, 0x001082ff, 0x5c00b000, - 0x1c01f000, 0x4933c857, 0x4c580000, 0x83cc1400, - 0x0000000b, 0x4200b000, 0x00000002, 0x83341c00, - 0x00000006, 0x0201f800, 0x001082ff, 0x0402000c, - 0x83cc1400, 0x0000000d, 0x4200b000, 0x00000002, - 0x83341c00, 0x00000008, 0x0201f800, 0x001082ff, - 0x04000014, 0x4933c856, 0x4933c856, 0x4933c857, - 0x59340009, 0x4803c857, 0x5934000e, 0x4803c857, - 0x59340008, 0x4803c857, 0x5934000d, 0x4803c857, - 0x59340007, 0x4803c857, 0x5934000c, 0x4803c857, - 0x59340006, 0x4803c857, 0x5934000b, 0x4803c857, - 0x5c00b000, 0x1c01f000, 0x4933c857, 0x4947c857, - 0x4943c857, 0x4c600000, 0x0201f800, 0x0010698c, - 0x4df00000, 0x4d2c0000, 0x4d300000, 0x4d340000, - 0x0401f8d8, 0x4130c000, 0x42026000, 0x0010cfc0, - 0x59a8000e, 0x8060c1c0, 0x04000005, 0x82601580, - 0x0010bbe8, 0x04000002, 0x80000040, 0x81640480, - 0x040210c4, 0x40600000, 0x81300580, 0x040000bc, - 0x0401f9bc, 0x040200ba, 0x59326809, 0x59300406, - 0x82000c80, 0x00000012, 0x02021800, 0x00100615, - 0x0c01f001, 0x0010a1af, 0x0010a118, 0x0010a133, - 0x0010a13e, 0x0010a111, 0x0010a12c, 0x0010a169, - 0x0010a1af, 0x0010a10f, 0x0010a17c, 0x0010a190, - 0x0010a10f, 0x0010a10f, 0x0010a10f, 0x0010a10f, - 0x0010a1af, 0x0010a1a6, 0x0010a19e, 0x0201f800, - 0x00100615, 0x8d3e7d18, 0x04000003, 0x8d3e7d16, - 0x04000004, 0x59300420, 0x8c000500, 0x04020098, - 0x59300403, 0x82000580, 0x00000043, 0x04000094, - 0x0201f800, 0x00108ef1, 0x04000007, 0x0201f800, - 0x00108f05, 0x0402008c, 0x0201f800, 0x00107da6, - 0x0401f089, 0x0201f800, 0x00101e1b, 0x0201f800, - 0x00108f05, 0x02000800, 0x00107da6, 0x0401f082, - 0x8d3e7d18, 0x04000003, 0x8d3e7d16, 0x04000004, - 0x59300420, 0x8c000500, 0x0402007d, 0x59325808, - 0x0201f800, 0x00108df4, 0x04000077, 0x49425a06, - 0x497a5c09, 0x0201f800, 0x00020381, 0x0201f800, - 0x00108ee7, 0x0401f070, 0x8d3e7d00, 0x04000007, - 0x59300017, 0x81480580, 0x0402006d, 0x59300018, - 0x814c0580, 0x0402006a, 0x59300203, 0x82000580, - 0x00000004, 0x02000800, 0x00100ee4, 0x59325808, - 0x0201f800, 0x00108df4, 0x0400005f, 0x4a025a04, - 0x00000103, 0x59300004, 0x8400055c, 0x48026004, - 0x592c0408, 0x8c000512, 0x04000007, 0x4d2c0000, - 0x592c0009, 0x40025800, 0x0201f800, 0x00100843, - 0x5c025800, 0x49425a06, 0x497a5c09, 0x0401fb4f, - 0x0201f800, 0x00109365, 0x0201f800, 0x00108f7d, - 0x0201f800, 0x00020381, 0x0201f800, 0x00108ee7, - 0x0401f045, 0x8d3e7d18, 0x04000045, 0x59300203, - 0x82000580, 0x00000004, 0x02000800, 0x00100ee4, - 0x59325808, 0x0201f800, 0x00108df4, 0x0400003a, - 0x49425a06, 0x497a5c09, 0x0401fb38, 0x0201f800, - 0x00109365, 0x0201f800, 0x00020381, 0x0401f032, - 0x0201f800, 0x0010600e, 0x04000031, 0x59300203, - 0x82000580, 0x00000004, 0x0400002d, 0x59300203, - 0x82000580, 0x00000003, 0x04020029, 0x0201f800, - 0x001068c1, 0x59325808, 0x0201f800, 0x00108df4, - 0x04000021, 0x0201f800, 0x00020381, 0x0401f01e, - 0x59300203, 0x82000580, 0x00000004, 0x02000800, - 0x00100ee4, 0x59325808, 0x0201f800, 0x00108df4, - 0x04000015, 0x49425a06, 0x497a5c09, 0x0201f800, - 0x00020381, 0x0401f010, 0x833c0500, 0x00001800, - 0x0400000f, 0x8d3e7d16, 0x0402000d, 0x59325817, - 0x0201f800, 0x00100843, 0x59325808, 0x0201f800, - 0x00108df4, 0x04000004, 0x49425a06, 0x0201f800, - 0x00020381, 0x0201f800, 0x00107698, 0x83326400, - 0x00000024, 0x41580000, 0x81300480, 0x04001735, - 0x5c026800, 0x5c026000, 0x5c025800, 0x5c03e000, - 0x02000800, 0x00106982, 0x5c00c000, 0x1c01f000, - 0x4933c857, 0x813261c0, 0x0400002d, 0x83300d80, - 0x0010bbe8, 0x0400002a, 0x8d3e7d06, 0x04020028, - 0x59300c06, 0x82040580, 0x00000001, 0x0400000a, - 0x82040580, 0x00000002, 0x04020021, 0x5930021d, - 0x82000580, 0x00000001, 0x0402001d, 0x59300c16, - 0x0401f002, 0x59300c03, 0x82040580, 0x00000039, - 0x04000004, 0x82040580, 0x00000035, 0x04020014, - 0x4d300000, 0x4d1c0000, 0x5932601e, 0x4933c857, - 0x0201f800, 0x001091e3, 0x02000800, 0x00100615, - 0x591c001c, 0x497a381c, 0x591c0c14, 0x84040d02, - 0x48063c14, 0x5c023800, 0x5c026000, 0x81300580, - 0x02020800, 0x00100615, 0x497a601e, 0x1c01f000, - 0x5c000000, 0x4c000000, 0x4803c857, 0x4d3c0000, - 0x42027800, 0x00000001, 0x0201f800, 0x001043bd, - 0x5c027800, 0x4c580000, 0x4200b000, 0x00000002, - 0x83a81c00, 0x00000002, 0x83cc1400, 0x0000000b, - 0x0201f800, 0x001082ff, 0x5c00b000, 0x80000540, - 0x1c01f000, 0x492fc857, 0x4943c857, 0x59a8000c, - 0x812c0480, 0x04001011, 0x59a8000d, 0x812c0480, - 0x0402100e, 0x592c0000, 0x80005d40, 0x04000008, - 0x497a5800, 0x49425a06, 0x4c2c0000, 0x0201f800, - 0x00020381, 0x5c025800, 0x0401f7f7, 0x49425a06, - 0x0201f000, 0x00020381, 0x1c01f000, 0x493fc857, - 0x4933c857, 0x480bc857, 0x0201f800, 0x0010393e, - 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, 0x4c080000, 0x4c100000, - 0x4c140000, 0x4c180000, 0x0201f800, 0x0010082a, - 0x02000800, 0x00100615, 0x5c003000, 0x5c002800, - 0x5c002000, 0x5c001000, 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, - 0x04000012, 0x4c140000, 0x4c180000, 0x4d440000, - 0x4d340000, 0x40128800, 0x0201f800, 0x00020267, - 0x02020800, 0x00100615, 0x59340002, 0x82000500, - 0x00ffffff, 0x48025812, 0x5c026800, 0x5c028800, - 0x5c003000, 0x5c002800, 0x497a5800, 0x497a5c04, - 0x83400580, 0x00000046, 0x04020002, 0x48165a07, - 0x481a5c08, 0x0401fbe0, 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, 0x00020855, - 0x5c000800, 0x1c01f000, 0x4933c857, 0x40000000, - 0x40000000, 0x1c01f000, 0x59300414, 0x4933c857, - 0x4803c857, 0x8c000518, 0x04000009, 0x8c000512, - 0x02020000, 0x00108fdb, 0x0401f918, 0x0201f800, - 0x00020831, 0x0201f800, 0x000208b4, 0x1c01f000, - 0x591c0406, 0x4803c857, 0x82000c80, 0x00000009, - 0x0402100b, 0x0c01f001, 0x0010a2f7, 0x0010a2f7, - 0x0010a2f7, 0x0010a2f9, 0x0010a2f7, 0x0010a2f9, - 0x0010a2f9, 0x0010a2f7, 0x0010a2f9, 0x80000580, - 0x1c01f000, 0x82000540, 0x00000001, 0x1c01f000, - 0x591c0406, 0x82000500, 0x0000001f, 0x82000580, - 0x00000006, 0x0400000e, 0x4803c857, 0x4a026403, - 0x0000003b, 0x4a02641a, 0x00000009, 0x4a02621a, - 0x00002a00, 0x4a026203, 0x00000001, 0x42000800, - 0x80000040, 0x0201f000, 0x00020855, 0x4803c856, - 0x4c040000, 0x4c140000, 0x4d300000, 0x411e6000, - 0x0401f8e6, 0x497a6205, 0x59300414, 0x4803c857, - 0x82000500, 0xffffadff, 0x48026414, 0x497a6405, - 0x5c026000, 0x0201f800, 0x0010082a, 0x02000800, - 0x00100615, 0x5c002800, 0x5c000800, 0x4a025a04, - 0x0000010d, 0x497a5800, 0x497a5c04, 0x4a025a08, - 0x00000045, 0x491e5809, 0x59300402, 0x48025c07, - 0x59300419, 0x48025c0b, 0x591c0414, 0x84000556, - 0x48023c14, 0x591c1809, 0x580c0403, 0x48025a06, - 0x4816580a, 0x48065a0b, 0x0401fb57, 0x4d400000, - 0x42028000, 0x00000045, 0x591c0202, 0x4c000000, - 0x4d300000, 0x411e6000, 0x0401fc82, 0x5c026000, - 0x5c000000, 0x48023a02, 0x5c028000, 0x4a023c06, - 0x00000006, 0x4a023a03, 0x00000007, 0x497a3a06, - 0x497a3a05, 0x1c01f000, 0x4933c857, 0x83380580, - 0x00000013, 0x0402000b, 0x59300403, 0x4803c857, - 0x82000d80, 0x00000085, 0x0400002b, 0x82000d80, - 0x0000008b, 0x04000028, 0x0201f800, 0x00100615, - 0x83380580, 0x00000027, 0x0402000c, 0x0201f800, - 0x001068f6, 0x4d2c0000, 0x4d400000, 0x59325808, - 0x42028000, 0x00000004, 0x0401fe9f, 0x5c028000, - 0x5c025800, 0x1c01f000, 0x83380580, 0x00000014, - 0x040007f3, 0x83380580, 0x00000089, 0x04000005, - 0x83380580, 0x0000008a, 0x02020000, 0x001076fb, - 0x0201f800, 0x00106cb4, 0x02020000, 0x001076fb, - 0x59300a03, 0x82040580, 0x0000000a, 0x04000009, - 0x82040580, 0x0000000c, 0x04000006, 0x0201f800, - 0x00100615, 0x4a026203, 0x0000000a, 0x1c01f000, - 0x83380480, 0x00000093, 0x0402100c, 0x83380480, - 0x00000085, 0x04001009, 0x83380580, 0x00000089, - 0x0400000a, 0x83380580, 0x0000008a, 0x04000022, - 0x0201f800, 0x00100615, 0x493bc857, 0x4933c857, - 0x0201f000, 0x001076fb, 0x4933c857, 0x4c340000, - 0x41306800, 0x0201f800, 0x00020892, 0x04000011, - 0x4a026203, 0x00000001, 0x4a026403, 0x0000001e, - 0x59cc0c07, 0x48066419, 0x59cc0a07, 0x48066219, - 0x58340809, 0x48066009, 0x4a026406, 0x00000004, - 0x42000800, 0x80000040, 0x0201f800, 0x00020855, - 0x40366000, 0x0201f800, 0x000208b4, 0x5c006800, - 0x1c01f000, 0x4933c857, 0x0201f000, 0x000208b4, - 0x59300809, 0x58040200, 0x8c00051a, 0x02020800, - 0x001006ba, 0x1c01f000, 0x0201f800, 0x0010472e, - 0x0400001e, 0x4a026203, 0x00000002, 0x59300414, - 0x84000558, 0x48026414, 0x8c000512, 0x04000004, - 0x59a80039, 0x48026205, 0x0401f007, 0x59a80839, - 0x59a80037, 0x80040400, 0x82000400, 0x0000001e, - 0x48026205, 0x59300009, 0x82000c00, 0x00000011, - 0x50040000, 0x80000540, 0x04000004, 0x82000c00, - 0x00000000, 0x0401f7fb, 0x45300800, 0x497a6000, - 0x82000540, 0x00000001, 0x1c01f000, 0x82100500, - 0xfffffeef, 0x0402001c, 0x4d2c0000, 0x4937c857, - 0x59340811, 0x83341400, 0x00000011, 0x800409c0, - 0x0400000e, 0x40040000, 0x81300580, 0x04000005, - 0x58040800, 0x82041400, 0x00000000, 0x0401f7f8, - 0x59300800, 0x497a6000, 0x44041000, 0x0201f800, - 0x00020831, 0x0401f002, 0x4933c857, 0x5c025800, - 0x492e6008, 0x0201f800, 0x00020831, 0x0201f000, - 0x000208b4, 0x492fc857, 0x4a025a06, 0x00000006, - 0x0201f000, 0x00020381, 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, 0x00100615, - 0x4933c857, 0x4c080000, 0x4c0c0000, 0x4c580000, - 0x59a8101d, 0x59cc1807, 0x820c1d00, 0x00ffffff, - 0x800c0110, 0x80083580, 0x04020014, 0x83cc1400, - 0x00000008, 0x4200b000, 0x00000002, 0x59300009, - 0x82001c00, 0x00000006, 0x0201f800, 0x001082ff, - 0x0402000a, 0x83cc1400, 0x0000000a, 0x4200b000, - 0x00000002, 0x59300009, 0x82001c00, 0x00000008, - 0x0201f800, 0x001082ff, 0x5c00b000, 0x5c001800, - 0x5c001000, 0x1c01f000, 0x4933c856, 0x0201f800, - 0x0010404b, 0x0201f000, 0x00101bf0, 0x493bc857, - 0x4d2c0000, 0x0201f800, 0x0010082a, 0x02000800, - 0x00100615, 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, 0x00020381, - 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, - 0x59300203, 0x4933c857, 0x4937c857, 0x493bc857, - 0x4803c857, 0x82003480, 0x0000000e, 0x02021800, - 0x00100615, 0x0c01f001, 0x0010a4e8, 0x0010a63a, - 0x0010a4e8, 0x0010a4e8, 0x0010a4e8, 0x0010a4e8, - 0x0010a4e8, 0x0010a59f, 0x0010a4ea, 0x0010a4e8, - 0x0010a4e8, 0x0010a4e8, 0x0010a4e8, 0x0010a4e8, - 0x0201f800, 0x00100615, 0x83380580, 0x0000004c, - 0x02020800, 0x00100615, 0x0201f800, 0x0010473b, - 0x04020020, 0x59a80826, 0x82040500, 0x00000009, - 0x82000580, 0x00000008, 0x0400001a, 0x8c040d12, - 0x0400003d, 0x59cc0806, 0x82040d00, 0xff000000, - 0x82040580, 0x03000000, 0x0400001f, 0x82040580, - 0x50000000, 0x04000005, 0x82040580, 0x52000000, - 0x02020000, 0x000208b4, 0x813669c0, 0x04000006, - 0x4d3c0000, 0x417a7800, 0x0201f800, 0x00101de2, - 0x5c027800, 0x4a026403, 0x00000001, 0x0401f014, - 0x59cc0806, 0x82040d00, 0xff000000, 0x82040580, - 0x03000000, 0x04000008, 0x82040580, 0x50000000, - 0x04000005, 0x82040580, 0x52000000, 0x02020000, - 0x000208b4, 0x4a026403, 0x00000009, 0x4a02641a, - 0x00000009, 0x4a02621a, 0x00000000, 0x813669c0, - 0x0402000b, 0x59cc0001, 0x0201f800, 0x001059b9, - 0x02020000, 0x000208b4, 0x0201f800, 0x001043fc, - 0x02020000, 0x000208b4, 0x49366009, 0x4a026406, - 0x00000004, 0x4a026203, 0x00000001, 0x0201f000, - 0x00106470, 0x0201f800, 0x0010393e, 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, 0x0401fcf7, 0x0401f940, 0x02000800, - 0x00100615, 0x42002000, 0x00000051, 0x0201f800, - 0x001077d1, 0x59cc0000, 0x82000500, 0x00ffffff, - 0x82000580, 0x00ffffff, 0x04000005, 0x4a026203, - 0x00000007, 0x493a6403, 0x1c01f000, 0x59325817, - 0x812e59c0, 0x02020800, 0x00100843, 0x0201f000, - 0x000208b4, 0x813669c0, 0x040007df, 0x59340400, - 0x82000500, 0x000000ff, 0x82000580, 0x00000003, - 0x040207d9, 0x0401fc73, 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, 0x00100615, - 0x59325808, 0x592c0c0b, 0x82040d00, 0x0000e000, - 0x82040580, 0x00002000, 0x04020076, 0x59300817, - 0x800409c0, 0x04000014, 0x58041404, 0x41cca800, - 0x8204a400, 0x00000005, 0x82080480, 0x00000010, - 0x04021004, 0x4008b000, 0x0401fb84, 0x0401f00a, - 0x40001000, 0x4200b000, 0x0000000f, 0x0401fb7f, - 0x58040801, 0x800409c0, 0x040207f2, 0x0201f800, - 0x00100615, 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, 0x001043c7, 0x42005000, - 0x0000000c, 0x0401f037, 0x4a025a06, 0x00000031, - 0x4a02580d, 0x00000009, 0x59340400, 0x4802580e, - 0x0201f800, 0x00020381, 0x0201f800, 0x00107698, - 0x0401f03d, 0x0201f800, 0x001040e4, 0x0201f800, - 0x00104480, 0x42000800, 0x00000003, 0x0201f800, - 0x001043c7, 0x42005000, 0x00000008, 0x0401f021, - 0x59cc0007, 0x0201f800, 0x00105c25, 0x0402001d, - 0x0201f800, 0x001040e4, 0x0401f01a, 0x82240500, - 0x0000ff00, 0x82000580, 0x00000007, 0x040007df, - 0x82240500, 0x000000ff, 0x82000580, 0x00000009, - 0x040007da, 0x0201f800, 0x001044e1, 0x42005000, - 0x0000000a, 0x0401f00b, 0x42005000, 0x0000000e, - 0x0401f003, 0x42005000, 0x00000010, 0x82240500, - 0x0000ff00, 0x82000580, 0x00000007, 0x040007cb, - 0x482a6403, 0x4a026203, 0x00000001, 0x592c000d, - 0x48026011, 0x497a6013, 0x59a80038, 0x48026206, - 0x417a7800, 0x0201f800, 0x00106470, 0x59325817, - 0x812e59c0, 0x04000004, 0x0201f800, 0x00100843, - 0x497a6017, 0x5c00a800, 0x5c00a000, 0x5c00b000, - 0x5c025800, 0x1c01f000, 0x4d2c0000, 0x59325808, - 0x83380580, 0x00000013, 0x0402002a, 0x492fc857, - 0x59300c03, 0x82040580, 0x00000054, 0x0400001e, - 0x82040580, 0x00000010, 0x04000018, 0x82040580, - 0x0000000e, 0x04000015, 0x82040580, 0x00000008, - 0x0400000d, 0x82040580, 0x0000000c, 0x0400000a, - 0x82040580, 0x0000000a, 0x02020800, 0x00100615, - 0x42000800, 0x00000006, 0x0201f800, 0x001043c7, - 0x0401f009, 0x42000800, 0x00000004, 0x0201f800, - 0x001043c7, 0x0401f004, 0x59340200, 0x8400051a, - 0x48026a00, 0x4a025a06, 0x00000000, 0x0201f800, - 0x00020381, 0x0201f800, 0x000208b4, 0x0401f024, - 0x83380580, 0x00000027, 0x0400000f, 0x83380580, - 0x00000014, 0x02020800, 0x00100615, 0x492fc857, - 0x0201f800, 0x001068f6, 0x42028000, 0x00000031, - 0x42000800, 0x00000004, 0x42001000, 0x000000ff, - 0x0401f00a, 0x492fc857, 0x0201f800, 0x001068f6, - 0x42028000, 0x00000031, 0x42000800, 0x00000004, - 0x42001000, 0x00000010, 0x49425a06, 0x4806580d, - 0x480a580e, 0x0201f800, 0x00020381, 0x0201f800, - 0x00104a83, 0x0201f800, 0x00107698, 0x5c025800, - 0x1c01f000, 0x492fc857, 0x42007000, 0x0010b5f6, - 0x58380807, 0x800409c0, 0x04020005, 0x492c7008, - 0x492c7007, 0x0201f000, 0x001008be, 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, - 0x0010082a, 0x0400002c, 0x492fc857, 0x492e6017, - 0x59a8b016, 0x8258b400, 0x0000001b, 0x8258b500, - 0xfffffffc, 0x8058b104, 0x485a5c04, 0x412c7800, - 0x41cca000, 0x82580480, 0x00000010, 0x04021005, - 0x832cac00, 0x00000005, 0x0401fa78, 0x0401f015, - 0x40580800, 0x4200b000, 0x0000000f, 0x832cac00, - 0x00000005, 0x0401fa71, 0x8204b480, 0x0000000f, - 0x0201f800, 0x0010082a, 0x04000004, 0x492c7801, - 0x412c7800, 0x0401f7ec, 0x59325817, 0x0201f800, - 0x00100843, 0x497a6017, 0x80000580, 0x0401f006, - 0x59340200, 0x84000554, 0x48026a00, 0x82000540, - 0x00000001, 0x5c00a800, 0x5c00a000, 0x5c00b000, - 0x5c025800, 0x1c01f000, 0x4933c857, 0x492fc857, - 0x4d2c0000, 0x4c5c0000, 0x5930bc06, 0x59300a03, - 0x82040580, 0x00000007, 0x0400003c, 0x82040580, - 0x00000001, 0x02020800, 0x00100615, 0x0201f800, - 0x0010698c, 0x4df00000, 0x598c000d, 0x81300580, - 0x04020019, 0x59300004, 0x8c000520, 0x04000004, - 0x84000520, 0x48026004, 0x0401f019, 0x825c0580, - 0x00000011, 0x0402000d, 0x42001000, 0x0010b5f4, - 0x50081000, 0x58080002, 0x82000580, 0x00000100, - 0x04000006, 0x5808000c, 0x81300580, 0x02020800, - 0x00100615, 0x0401f00a, 0x0201f800, 0x00106be2, - 0x04020027, 0x59300004, 0x8c000520, 0x04000004, - 0x84000520, 0x48026004, 0x0401f003, 0x0201f800, - 0x00106619, 0x5c03e000, 0x02000800, 0x00106982, - 0x0201f800, 0x00108df4, 0x02000800, 0x00100615, - 0x59325808, 0x4a025a06, 0x00000005, 0x0201f800, - 0x00020381, 0x825c0580, 0x00000005, 0x0400001b, - 0x0201f800, 0x00104a83, 0x825c0580, 0x00000005, - 0x04000016, 0x59325817, 0x812e59c0, 0x02020800, - 0x00100843, 0x0201f800, 0x00107698, 0x80000580, - 0x5c00b800, 0x5c025800, 0x1c01f000, 0x5c03e000, - 0x02000800, 0x00106982, 0x59300c06, 0x82040580, - 0x00000011, 0x040007ae, 0x82040580, 0x00000005, - 0x040007ab, 0x0401f7f3, 0x0201f800, 0x000208b4, - 0x0401f7ef, 0x4c040000, 0x59340200, 0x4803c857, - 0x8c00051c, 0x04000009, 0x59cc0805, 0x591c0019, - 0x4803c857, 0x80040580, 0x04000004, 0x80000580, - 0x4803c856, 0x0401f003, 0x82000540, 0x00000001, - 0x5c000800, 0x1c01f000, 0x4c000000, 0x4c0c0000, - 0x4c100000, 0x42001800, 0x0000ffff, 0x42002000, - 0x00000004, 0x0401f013, 0x4c000000, 0x4c0c0000, - 0x4c100000, 0x59302009, 0x58101c03, 0x42002000, - 0x00000004, 0x0401f00b, 0x4c000000, 0x4c0c0000, - 0x4c100000, 0x59302009, 0x801021c0, 0x02000800, - 0x00100615, 0x58101c03, 0x42002000, 0x00000007, - 0x480fc857, 0x4813c857, 0x481bc857, 0x0201f800, - 0x001038c7, 0x5c002000, 0x5c001800, 0x5c000000, - 0x1c01f000, 0x83380580, 0x00000092, 0x02020800, - 0x00100615, 0x42000800, 0x80000040, 0x4a026203, - 0x00000001, 0x493a6403, 0x0201f000, 0x00020855, - 0x4d400000, 0x0201f800, 0x0010393e, 0x04000008, - 0x59a80005, 0x84000544, 0x48035005, 0x42028000, - 0x0000002a, 0x0201f800, 0x0010a25b, 0x5c028000, - 0x1c01f000, 0x59a80026, 0x8c000508, 0x04000005, - 0x599c0017, 0x8c00050a, 0x04020002, 0x1c01f000, - 0x82000540, 0x00000001, 0x1c01f000, 0x59300420, - 0x84000540, 0x48026420, 0x1c01f000, 0x4817c857, - 0x4c000000, 0x4c040000, 0x8c142d2a, 0x04000004, - 0x598800b9, 0x80000000, 0x480310b9, 0x8c142d2e, - 0x04000004, 0x598800ba, 0x80000000, 0x480310ba, - 0x8c142d2c, 0x04000013, 0x40140000, 0x82000500, - 0x00070000, 0x82000d80, 0x00030000, 0x0400000d, - 0x82000d80, 0x00040000, 0x0400000a, 0x82000d80, - 0x00050000, 0x04000007, 0x59880005, 0x80000000, - 0x48031005, 0x598800bb, 0x80000000, 0x480310bb, - 0x5c000800, 0x5c000000, 0x1c01f000, 0x4817c857, - 0x4c000000, 0x4c040000, 0x8c142d2a, 0x04000004, - 0x598800bc, 0x80000000, 0x480310bc, 0x8c142d2e, - 0x04000004, 0x598800bd, 0x80000000, 0x480310bd, - 0x8c142d2c, 0x04000013, 0x40140000, 0x82000500, - 0x00070000, 0x82000d80, 0x00030000, 0x0400000d, - 0x82000d80, 0x00040000, 0x0400000a, 0x82000d80, - 0x00050000, 0x04000007, 0x59880005, 0x80000000, - 0x48031005, 0x598800be, 0x80000000, 0x480310be, - 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, - 0x598800a7, 0x80000000, 0x480310a7, 0x8c040d2a, - 0x04000004, 0x598800a8, 0x80000000, 0x480310a8, - 0x8c040d28, 0x04000004, 0x598800a9, 0x80000000, - 0x480310a9, 0x8c040d26, 0x04000004, 0x598800aa, - 0x80000000, 0x480310aa, 0x8c040d24, 0x04000004, - 0x598800ab, 0x80000000, 0x480310ab, 0x8c040d22, - 0x04000004, 0x598800ac, 0x80000000, 0x480310ac, - 0x8c040d20, 0x04000004, 0x598800ad, 0x80000000, - 0x480310ad, 0x5c000000, 0x1c01f000, 0x4807c857, - 0x4c000000, 0x598800ae, 0x80000000, 0x480310ae, - 0x5c000000, 0x1c01f000, 0x4807c857, 0x4c000000, - 0x8c040d1c, 0x04000004, 0x598800af, 0x80000000, - 0x480310af, 0x8c040d1a, 0x04000004, 0x598800b0, - 0x80000000, 0x480310b0, 0x5c000000, 0x1c01f000, - 0x4807c857, 0x4c000000, 0x8c040d18, 0x04000004, - 0x598800b1, 0x80000000, 0x480310b1, 0x8c040d16, - 0x04000004, 0x598800b2, 0x80000000, 0x480310b2, - 0x8c040d14, 0x04000004, 0x598800b3, 0x80000000, - 0x480310b3, 0x5c000000, 0x1c01f000, 0x4807c857, - 0x4c000000, 0x8c040d10, 0x04000004, 0x598800b4, - 0x80000000, 0x480310b4, 0x8c040d0c, 0x04000004, - 0x598800b5, 0x80000000, 0x480310b5, 0x5c000000, - 0x1c01f000, 0x4807c857, 0x4c000000, 0x8c040d08, - 0x04000004, 0x598800b6, 0x80000000, 0x480310b6, - 0x8c040d04, 0x04000004, 0x598800b7, 0x80000000, - 0x480310b7, 0x5c000000, 0x1c01f000, 0x4807c856, - 0x4c000000, 0x59880080, 0x80000000, 0x48031080, - 0x5c000000, 0x1c01f000, 0x4803c857, 0x4c040000, - 0x50000800, 0x80040800, 0x4807c857, 0x44040000, - 0x5c000800, 0x1c01f000, 0x480fc857, 0x4c000000, - 0x820c0580, 0x00000000, 0x04020004, 0x42000000, - 0x0010b617, 0x0401f014, 0x820c0580, 0x00001001, - 0x04020004, 0x42000000, 0x0010b618, 0x0401f00e, - 0x820c0580, 0x00001002, 0x04020004, 0x42000000, - 0x0010b619, 0x0401f008, 0x820c0c80, 0x0000201c, - 0x02021800, 0x00100615, 0x820c0500, 0x0000001f, - 0x0c01f804, 0x0401ffdd, 0x5c000000, 0x1c01f000, - 0x0010a8b0, 0x0010a8b3, 0x0010a8b6, 0x0010a8b9, - 0x0010a8bc, 0x0010a8bf, 0x0010a8c2, 0x0010a8c5, - 0x0010a8c8, 0x0010a8cb, 0x0010a8ce, 0x0010a8d1, - 0x0010a8d4, 0x0010a8d7, 0x0010a8da, 0x0010a8dd, - 0x0010a8e0, 0x0010a8e3, 0x0010a8e6, 0x0010a8e9, - 0x0010a8ec, 0x0010a8ef, 0x0010a8f2, 0x0010a8f5, - 0x0010a8f8, 0x0010a8fb, 0x0010a8fe, 0x0010a901, - 0x42000000, 0x0010b61a, 0x1c01f000, 0x42000000, - 0x0010b61b, 0x1c01f000, 0x42000000, 0x0010b61c, - 0x1c01f000, 0x42000000, 0x0010b61d, 0x1c01f000, - 0x42000000, 0x0010b61e, 0x1c01f000, 0x42000000, - 0x0010b61f, 0x1c01f000, 0x42000000, 0x0010b620, - 0x1c01f000, 0x42000000, 0x0010b621, 0x1c01f000, - 0x42000000, 0x0010b622, 0x1c01f000, 0x42000000, - 0x0010b623, 0x1c01f000, 0x42000000, 0x0010b624, - 0x1c01f000, 0x42000000, 0x0010b625, 0x1c01f000, - 0x42000000, 0x0010b626, 0x1c01f000, 0x42000000, - 0x0010b627, 0x1c01f000, 0x42000000, 0x0010b628, - 0x1c01f000, 0x42000000, 0x0010b629, 0x1c01f000, - 0x42000000, 0x0010b62a, 0x1c01f000, 0x42000000, - 0x0010b62b, 0x1c01f000, 0x42000000, 0x0010b62c, - 0x1c01f000, 0x42000000, 0x0010b62d, 0x1c01f000, - 0x42000000, 0x0010b62e, 0x1c01f000, 0x42000000, - 0x0010b62f, 0x1c01f000, 0x42000000, 0x0010b630, - 0x1c01f000, 0x42000000, 0x0010b631, 0x1c01f000, - 0x42000000, 0x0010b632, 0x1c01f000, 0x42000000, - 0x0010b633, 0x1c01f000, 0x42000000, 0x0010b634, - 0x1c01f000, 0x42000000, 0x0010b635, 0x1c01f000, - 0x480fc857, 0x4c000000, 0x820c0580, 0x00000001, - 0x04020004, 0x42000000, 0x0010b60c, 0x0401f012, - 0x820c0580, 0x00000002, 0x04020004, 0x42000000, - 0x0010b60d, 0x0401f00c, 0x820c0580, 0x00000003, - 0x04020004, 0x42000000, 0x0010b60e, 0x0401f006, - 0x820c0580, 0x00000004, 0x04020004, 0x42000000, - 0x0010b60f, 0x0401ff51, 0x5c000000, 0x1c01f000, - 0x4c000000, 0x59a80026, 0x4803c857, 0x8c000502, - 0x04000010, 0x8c000506, 0x04000004, 0x42000000, - 0x0010b63f, 0x0401f012, 0x8c00050a, 0x04000004, - 0x42000000, 0x0010b63e, 0x0401f00d, 0x8c000508, - 0x04000004, 0x42000000, 0x0010b641, 0x0401f008, - 0x0201f800, 0x00104e0d, 0x04000006, 0x8c000506, - 0x04020004, 0x42000000, 0x0010b640, 0x0401ff33, - 0x5c000000, 0x1c01f000, 0x8058b1c0, 0x02000800, - 0x00100615, 0x5450a800, 0x8050a000, 0x8054a800, - 0x8058b040, 0x040207fc, 0x1c01f000, 0x8058b1c0, - 0x02000800, 0x00100615, 0x4450a800, 0x8054a800, - 0x8058b040, 0x040207fd, 0x1c01f000, 0x8058b1c0, - 0x02000800, 0x00100615, 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, - 0xd2764e14 +static u8 ql2400_fw_bin[] = { + 0x04, 0x01, 0xf1, 0x98, 0x00, 0x10, 0xe0, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0xa3, 0x63, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x43, 0x4f, 0x50, 0x59, 0x52, 0x49, 0x47, + 0x48, 0x54, 0x20, 0x32, 0x30, 0x30, 0x35, 0x20, 0x51, 0x4c, 0x4f, 0x47, + 0x49, 0x43, 0x20, 0x43, 0x4f, 0x52, 0x50, 0x4f, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x20, 0x20, 0x20, 0x49, 0x53, 0x50, 0x32, 0x34, 0x78, 0x78, + 0x20, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x20, 0x20, 0x20, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x34, 0x2e, 0x30, 0x2e, + 0x32, 0x33, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x42, 0x00, 0x18, 0x00, 0x00, 0x10, 0x01, 0x4f, 0x42, 0x00, 0x20, 0x00, + 0x00, 0x10, 0xb0, 0xcd, 0x50, 0x0c, 0x08, 0x00, 0x80, 0x0c, 0x18, 0x00, + 0x50, 0x0c, 0x10, 0x00, 0x80, 0x0c, 0x18, 0x00, 0x54, 0x04, 0x20, 0x00, + 0x80, 0x10, 0x20, 0x00, 0x80, 0x04, 0x08, 0x00, 0x80, 0x08, 0x10, 0x40, + 0x04, 0x02, 0x07, 0xfc, 0x50, 0x0c, 0x08, 0x00, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x02, 0x07, 0xf6, 0x44, 0x00, 0x20, 0x00, 0x80, 0x10, 0x20, 0x00, + 0x40, 0x10, 0x00, 0x00, 0x44, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x44, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x44, 0x0c, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x44, 0x10, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x44, 0x14, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x44, 0x18, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x44, 0x1c, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x44, 0x20, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x44, 0x24, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x44, 0x28, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x44, 0x2c, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x44, 0x30, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x44, 0x34, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x44, 0x38, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x44, 0x3c, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x44, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x44, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x44, 0x48, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x44, 0x4c, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x44, 0x50, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x44, 0x54, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x44, 0x58, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x44, 0x5c, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x44, 0x60, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x44, 0x64, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x44, 0x68, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x44, 0x6c, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x44, 0x70, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x44, 0x74, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x44, 0x78, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x44, 0x7c, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x44, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x44, 0x84, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x44, 0x88, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x44, 0x8c, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x44, 0x90, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x44, 0x94, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x44, 0x98, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x44, 0x9c, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x44, 0xa0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x44, 0xa4, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x44, 0xa8, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x44, 0xac, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x44, 0xb0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x44, 0xb4, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x44, 0xb8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x44, 0xbc, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x44, 0xc0, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x44, 0xc4, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x44, 0xc8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x44, 0xcc, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x44, 0xd0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x44, 0xd8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x44, 0xd4, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x44, 0xdc, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x44, 0xe0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x44, 0xe4, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x44, 0xe8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x44, 0xec, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x44, 0xf0, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x44, 0xf4, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x44, 0xf8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x44, 0xfc, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x45, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x45, 0x08, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x45, 0x0c, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x45, 0x10, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x45, 0x14, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x45, 0x18, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x45, 0x1c, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x45, 0x20, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x45, 0x24, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x45, 0x28, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x45, 0x2c, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x45, 0x30, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x45, 0x34, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x45, 0x38, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x45, 0x3c, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x45, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x45, 0x44, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x45, 0x48, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x45, 0x4c, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x45, 0x50, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x45, 0x54, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x45, 0x58, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x45, 0x5c, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x45, 0x60, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x45, 0x64, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x45, 0x68, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x45, 0x6c, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x45, 0x70, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x45, 0x74, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x45, 0x78, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x45, 0x7c, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x45, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x45, 0x84, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x45, 0x88, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x45, 0x8c, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x45, 0x90, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x45, 0x94, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x45, 0x98, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x45, 0x9c, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x45, 0xa0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x45, 0xa4, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x45, 0xa8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x45, 0xac, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x45, 0xb0, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x45, 0xb4, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x45, 0xb8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x45, 0xbc, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x45, 0xc0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x45, 0xc4, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x45, 0xc8, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x45, 0xcc, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x45, 0xd0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x45, 0xd4, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x45, 0xd8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x45, 0xdc, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x45, 0xe0, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x45, 0xe4, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x45, 0xe8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x45, 0xec, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x45, 0xf0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x45, 0xf4, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x45, 0xf8, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x45, 0xfc, 0x00, 0x00, 0x4a, 0x03, 0xc0, 0x20, + 0x00, 0x00, 0x40, 0x00, 0x4a, 0x03, 0xc0, 0x11, 0x40, 0x00, 0x00, 0x10, + 0x04, 0x00, 0x60, 0x00, 0x42, 0x03, 0xe0, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x59, 0xe0, 0x00, 0x17, 0x8c, 0x00, 0x05, 0x08, 0x04, 0x00, 0x00, 0x03, + 0x4a, 0x03, 0xc0, 0x17, 0x00, 0x00, 0x00, 0x00, 0x42, 0x03, 0xe0, 0x00, + 0x30, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x00, 0x00, 0x00, 0xbf, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xbf, 0xe0, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xff, 0xd0, + 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x72, 0x09, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x73, 0x09, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x74, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x74, 0x09, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x77, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x61, 0x30, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x61, 0x50, + 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x61, 0x70, 0x00, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x61, 0x90, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x61, 0xb0, + 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x63, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x10, 0xe0, 0x04, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x08, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x00, 0x10, 0xe9, 0x02, + 0x00, 0x10, 0xca, 0x00, 0x00, 0x00, 0x0a, 0xa3, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x10, 0xf3, 0xa5, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x07, 0x42, + 0x00, 0xff, 0xff, 0xff, 0x00, 0x10, 0xfa, 0xe7, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x05, 0x42, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x42, 0x03, 0xf0, 0x00, 0x00, 0x02, 0x1f, 0xff, 0x40, 0x00, 0x00, 0x00, + 0x42, 0x03, 0xe0, 0x00, 0x90, 0x00, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x42, 0x02, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x08, 0x00, 0x00, 0x02, 0x1f, 0x00, + 0x45, 0x78, 0x08, 0x00, 0x80, 0x04, 0x08, 0x00, 0x80, 0x00, 0x00, 0x40, + 0x04, 0x02, 0x07, 0xfd, 0x42, 0x00, 0x08, 0x00, 0x00, 0x02, 0x08, 0xff, + 0x45, 0x78, 0x08, 0x00, 0x80, 0x04, 0x08, 0x00, 0x82, 0x04, 0x04, 0x80, + 0x00, 0x02, 0x09, 0x19, 0x04, 0x00, 0x17, 0xfc, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x06, 0x25, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x82, 0x00, 0x04, 0x80, 0x24, 0x32, 0x00, 0x02, + 0x04, 0x02, 0x00, 0x15, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x64, + 0x80, 0x04, 0x08, 0x40, 0x04, 0x00, 0x00, 0x07, 0x4a, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x59, 0x80, 0x00, 0x00, + 0x8c, 0x00, 0x05, 0x00, 0x04, 0x00, 0x07, 0xf9, 0x04, 0x00, 0x00, 0x08, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7a, 0x17, 0x50, 0x04, 0x00, 0x00, + 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x02, 0x00, 0x03, 0x84, 0x00, 0x05, 0x4e, + 0x44, 0x00, 0x08, 0x00, 0x4a, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4a, 0x03, 0xc0, 0x20, 0x00, 0x00, 0x00, 0x04, 0x42, 0x03, 0xe0, 0x00, + 0x60, 0x00, 0x00, 0x0f, 0x59, 0xe0, 0x00, 0x23, 0x8c, 0x00, 0x05, 0x00, + 0x04, 0x02, 0x00, 0x21, 0x4a, 0x03, 0x70, 0xe8, 0x00, 0x00, 0x00, 0x03, + 0x4a, 0x03, 0x78, 0xe8, 0x00, 0x00, 0x00, 0x03, 0x42, 0x00, 0x28, 0x00, + 0x00, 0x10, 0x01, 0x80, 0x58, 0x14, 0x08, 0x00, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x00, 0x00, 0x09, 0x58, 0x14, 0x20, 0x02, 0x58, 0x14, 0x10, 0x03, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x06, 0x1c, 0x04, 0x02, 0x00, 0x24, + 0x82, 0x14, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x01, 0xf7, 0xf6, + 0x42, 0x00, 0x28, 0x00, 0x00, 0x10, 0x01, 0x80, 0x58, 0x14, 0xa0, 0x00, + 0x80, 0x50, 0xa1, 0xc0, 0x04, 0x00, 0x00, 0x0b, 0x58, 0x14, 0xa8, 0x01, + 0x40, 0x50, 0x00, 0x00, 0x80, 0x54, 0x04, 0x80, 0x04, 0x00, 0x00, 0x04, + 0x58, 0x14, 0xb0, 0x02, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, + 0x82, 0x14, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x01, 0xf7, 0xf4, + 0x4a, 0x03, 0x70, 0xe8, 0x00, 0x00, 0x00, 0x03, 0x4a, 0x03, 0x78, 0xe8, + 0x00, 0x00, 0x00, 0x03, 0x42, 0x00, 0x28, 0x00, 0x00, 0x10, 0x01, 0x80, + 0x58, 0x14, 0x08, 0x01, 0x80, 0x04, 0x09, 0xc0, 0x04, 0x00, 0x00, 0x13, + 0x58, 0x14, 0x20, 0x02, 0x58, 0x14, 0x10, 0x03, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x06, 0x1c, 0x04, 0x02, 0x00, 0x04, 0x82, 0x14, 0x2c, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x01, 0xf7, 0xf6, 0x4a, 0x03, 0xc0, 0x20, + 0x00, 0x00, 0x40, 0x10, 0x4a, 0x03, 0xc0, 0x11, 0x40, 0x10, 0x00, 0x11, + 0x04, 0x00, 0x60, 0x00, 0x42, 0x03, 0xe0, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x42, 0x03, 0xe0, 0x00, 0x30, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0x04, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x06, 0xb9, 0x4c, 0x14, 0x00, 0x00, 0x42, 0x00, 0x28, 0x00, + 0x00, 0x10, 0xca, 0x00, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0xa3, 0x63, + 0x40, 0x08, 0x00, 0x00, 0x80, 0x14, 0x04, 0x80, 0x82, 0x00, 0x1d, 0x00, + 0xff, 0xff, 0xff, 0x00, 0x04, 0x02, 0x00, 0x03, 0x40, 0x00, 0x18, 0x00, + 0x04, 0x01, 0xf0, 0x03, 0x42, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x48, 0x0b, 0xc8, 0x40, 0x48, 0x0f, 0xc8, 0x42, 0x04, 0x01, 0x10, 0x00, + 0x40, 0x0c, 0x00, 0x00, 0x80, 0x08, 0x14, 0x00, 0x40, 0x14, 0x00, 0x00, + 0x80, 0x08, 0x05, 0x80, 0x04, 0x02, 0x07, 0xf0, 0x5c, 0x00, 0x28, 0x00, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0xd4, 0xa3, 0x40, 0x08, 0x00, 0x00, + 0x80, 0x14, 0x04, 0x80, 0x82, 0x00, 0x1d, 0x00, 0xff, 0xff, 0xff, 0x00, + 0x04, 0x02, 0x00, 0x03, 0x40, 0x00, 0x18, 0x00, 0x04, 0x01, 0xf0, 0x03, + 0x42, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0x48, 0x0b, 0xc8, 0x40, + 0x48, 0x0f, 0xc8, 0x42, 0x04, 0x01, 0x10, 0x00, 0x40, 0x0c, 0x00, 0x00, + 0x80, 0x08, 0x14, 0x00, 0x40, 0x14, 0x00, 0x00, 0x80, 0x08, 0x05, 0x80, + 0x04, 0x02, 0x07, 0xf0, 0x48, 0x17, 0x50, 0x0c, 0x45, 0x78, 0x28, 0x00, + 0x4a, 0x03, 0xc0, 0x14, 0x00, 0x1c, 0x00, 0x1c, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x50, 0x00, 0x00, 0x00, 0x82, 0x00, 0x04, 0x80, + 0x24, 0x22, 0x00, 0x01, 0x04, 0x00, 0x0a, 0xab, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x50, 0x00, 0x00, 0x00, 0x82, 0x00, 0x04, 0x80, + 0x24, 0x32, 0x00, 0x01, 0x04, 0x00, 0x0a, 0xa5, 0x59, 0xc4, 0x00, 0x00, + 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0x00, 0x00, 0x80, 0x00, 0x01, 0x20, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x24, 0x22, 0x04, 0x02, 0x00, 0x05, + 0x59, 0xa8, 0x00, 0x6c, 0x84, 0x00, 0x05, 0x40, 0x48, 0x03, 0x50, 0x6c, + 0x04, 0x01, 0xf0, 0x0a, 0x59, 0xe0, 0x00, 0x03, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x82, 0x00, 0x05, 0x80, 0x00, 0x01, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x04, 0x59, 0xa8, 0x00, 0x6c, 0x84, 0x00, 0x05, 0x42, + 0x48, 0x03, 0x50, 0x6c, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x82, 0x14, 0x14, 0x80, 0x00, 0x17, 0xff, 0xff, 0x04, 0x02, 0x10, 0x09, + 0x80, 0x04, 0x09, 0x02, 0x82, 0x14, 0x14, 0x80, 0x00, 0x13, 0xff, 0xff, + 0x04, 0x02, 0x10, 0x05, 0x80, 0x04, 0x09, 0x02, 0x82, 0x14, 0x14, 0x80, + 0x00, 0x11, 0xff, 0xff, 0x04, 0x00, 0x1a, 0x84, 0x48, 0x07, 0x50, 0x0d, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x24, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x62, 0x98, 0x82, 0x04, 0x0c, 0x00, 0x00, 0x10, 0xd8, 0xd4, + 0x48, 0x07, 0x50, 0x0a, 0x4a, 0x03, 0xc8, 0x10, 0x00, 0x10, 0x00, 0x00, + 0x4a, 0x03, 0xc8, 0x11, 0x00, 0x10, 0xa3, 0x63, 0x4a, 0x03, 0xc8, 0x12, + 0x00, 0x10, 0xca, 0x00, 0x4a, 0x03, 0xc8, 0x13, 0x00, 0x10, 0xd4, 0xa2, + 0x4a, 0x03, 0xc8, 0x29, 0x00, 0x00, 0x00, 0x04, 0x59, 0xe4, 0x00, 0x01, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x03, 0x40, 0x1d, 0x48, 0x03, 0xc8, 0x01, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x04, 0x01, 0xfb, 0x86, + 0x42, 0x02, 0xc0, 0x00, 0x00, 0x10, 0xd8, 0xd4, 0x59, 0xaa, 0xb0, 0x0a, + 0x59, 0xaa, 0xa0, 0x0a, 0x59, 0xaa, 0xa8, 0x0a, 0x59, 0xaa, 0xc8, 0x0d, + 0x49, 0x67, 0x50, 0x66, 0x59, 0xa8, 0x00, 0x0a, 0x48, 0x03, 0x50, 0x0b, + 0x04, 0x01, 0xfa, 0xef, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x71, 0x7f, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x06, 0xea, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x07, 0x45, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x19, 0x4d, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x12, 0x74, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x08, 0xac, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x12, 0x74, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0e, 0x93, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x62, 0xd8, 0x04, 0x01, 0xfa, 0x0d, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x1d, 0xdd, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4f, 0x3c, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4a, 0x35, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5d, 0x7b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5b, 0x02, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x13, 0x0d, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x11, 0x8b, 0x42, 0x03, 0xe0, 0x00, 0xf0, 0x00, 0x00, 0x01, + 0x4a, 0x03, 0x50, 0x6d, 0x00, 0x00, 0x00, 0x26, 0x4a, 0x03, 0x50, 0x6e, + 0x00, 0x00, 0x00, 0x1d, 0x4a, 0x03, 0x50, 0x6f, 0x00, 0x00, 0x00, 0x01, + 0x4a, 0x03, 0x50, 0x70, 0x00, 0x00, 0x00, 0x00, 0x59, 0xe0, 0x00, 0x02, + 0x8c, 0x00, 0x05, 0x1e, 0x42, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0xfe, + 0x04, 0x00, 0x00, 0x03, 0x42, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x01, 0xfe, + 0x50, 0x00, 0x08, 0x00, 0x48, 0x07, 0x50, 0x55, 0x80, 0x04, 0x09, 0x20, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x01, 0x3e, 0x04, 0x02, 0x00, 0x0b, + 0x59, 0xa8, 0x00, 0x6c, 0x84, 0x00, 0x05, 0x48, 0x48, 0x03, 0x50, 0x6c, + 0x4a, 0x03, 0x50, 0x6d, 0x00, 0x00, 0x00, 0x5a, 0x4a, 0x03, 0x50, 0x6e, + 0x00, 0x00, 0x00, 0x58, 0x4a, 0x03, 0x50, 0x70, 0x00, 0x00, 0x00, 0x0f, + 0x04, 0x01, 0xf0, 0x3c, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x01, 0x3f, + 0x04, 0x00, 0x00, 0x0a, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x01, 0x4e, + 0x04, 0x00, 0x00, 0x07, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x01, 0x55, + 0x04, 0x00, 0x00, 0x04, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x01, 0x56, + 0x04, 0x02, 0x00, 0x0b, 0x59, 0xa8, 0x00, 0x6c, 0x84, 0x00, 0x05, 0x4a, + 0x48, 0x03, 0x50, 0x6c, 0x4a, 0x03, 0x50, 0x6d, 0x00, 0x00, 0x00, 0x55, + 0x4a, 0x03, 0x50, 0x6e, 0x00, 0x00, 0x00, 0x52, 0x4a, 0x03, 0x50, 0x70, + 0x00, 0x00, 0x00, 0x09, 0x04, 0x01, 0xf0, 0x26, 0x59, 0xe0, 0x00, 0x03, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x20, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x01, 0x47, 0x04, 0x00, 0x00, 0x10, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x01, 0x45, 0x04, 0x02, 0x00, 0x1a, 0x59, 0xa8, 0x00, 0x6c, + 0x84, 0x00, 0x05, 0x46, 0x48, 0x03, 0x50, 0x6c, 0x4a, 0x03, 0x50, 0x6d, + 0x00, 0x00, 0x00, 0x43, 0x4a, 0x03, 0x50, 0x6e, 0x00, 0x00, 0x00, 0x3e, + 0x4a, 0x03, 0x50, 0x6f, 0x00, 0x00, 0x00, 0x25, 0x4a, 0x03, 0x50, 0x70, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x0c, 0x59, 0xa8, 0x00, 0x6c, + 0x84, 0x00, 0x05, 0x44, 0x48, 0x03, 0x50, 0x6c, 0x4a, 0x03, 0x50, 0x6d, + 0x00, 0x00, 0x00, 0x43, 0x4a, 0x03, 0x50, 0x6e, 0x00, 0x00, 0x00, 0x3e, + 0x4a, 0x03, 0x50, 0x6f, 0x00, 0x00, 0x00, 0x25, 0x4a, 0x03, 0x50, 0x70, + 0x00, 0x00, 0x00, 0x01, 0x4a, 0x03, 0x78, 0xe4, 0x00, 0x0c, 0x00, 0x00, + 0x59, 0xa8, 0x00, 0x6c, 0x8c, 0x00, 0x05, 0x02, 0x04, 0x00, 0x00, 0x04, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x30, 0x04, 0x00, 0x09, 0xde, + 0x4a, 0x03, 0xc0, 0x18, 0x00, 0x00, 0x00, 0x0f, 0x42, 0x03, 0xe0, 0x00, + 0x20, 0x00, 0x05, 0x11, 0x42, 0x03, 0xe0, 0x00, 0x50, 0x01, 0x00, 0x00, + 0x4a, 0x03, 0xc0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x70, 0x13, + 0x59, 0xe0, 0x00, 0x20, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x02, 0x00, 0x0f, 0x4a, 0x03, 0xc0, 0x20, 0x00, 0x00, 0x40, 0x00, + 0x4a, 0x03, 0xc0, 0x11, 0x40, 0x00, 0x00, 0x10, 0x04, 0x00, 0x60, 0x00, + 0x42, 0x03, 0xe0, 0x00, 0x40, 0x00, 0x00, 0x00, 0x59, 0xe0, 0x00, 0x17, + 0x8c, 0x00, 0x05, 0x08, 0x04, 0x00, 0x00, 0x03, 0x4a, 0x03, 0xc0, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x42, 0x03, 0xe0, 0x00, 0x30, 0x00, 0x00, 0x01, + 0x42, 0x02, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x03, 0xe0, 0x00, + 0xb0, 0x60, 0x00, 0x00, 0x59, 0xa8, 0x08, 0x70, 0x40, 0x07, 0xf8, 0x00, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x00, 0x04, 0x4d, 0xf0, 0x00, 0x00, + 0x42, 0x03, 0xe0, 0x00, 0x50, 0x00, 0x00, 0x00, 0x41, 0x6c, 0x00, 0x00, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x08, 0x04, 0x02, 0x19, 0xb4, + 0x0c, 0x01, 0xf8, 0x04, 0x5c, 0x03, 0xe0, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x00, 0x08, 0x00, 0x10, 0x03, 0x49, 0x00, 0x10, 0x03, 0x5c, + 0x00, 0x10, 0x04, 0x2c, 0x00, 0x10, 0x03, 0x48, 0x00, 0x10, 0xd4, 0x71, + 0x00, 0x10, 0x03, 0x48, 0x00, 0x10, 0x03, 0x48, 0x00, 0x10, 0x04, 0xab, + 0x04, 0x01, 0xf9, 0xa7, 0x42, 0x00, 0x08, 0x00, 0x00, 0x10, 0xac, 0x71, + 0x58, 0x04, 0x00, 0x1d, 0x48, 0x03, 0xc8, 0x57, 0x8c, 0x00, 0x05, 0x00, + 0x04, 0x00, 0x00, 0x0d, 0x84, 0x00, 0x05, 0x00, 0x48, 0x00, 0x08, 0x1d, + 0x42, 0x02, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x01, 0xfa, 0xa9, + 0x49, 0xf3, 0xc8, 0x57, 0x5c, 0x00, 0x08, 0x00, 0x5c, 0x00, 0x00, 0x00, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x3e, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x4c, 0x04, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x04, 0x01, 0xfa, 0x8f, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x00, 0x00, 0x10, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xe4, 0x04, 0x02, 0x00, 0x33, + 0x59, 0x94, 0x00, 0x23, 0x82, 0x00, 0x05, 0x80, 0x00, 0x10, 0x3e, 0xab, + 0x04, 0x02, 0x00, 0x04, 0x59, 0x94, 0x00, 0x22, 0x80, 0x00, 0x01, 0xc0, + 0x04, 0x02, 0x00, 0x2c, 0x59, 0xc4, 0x00, 0x06, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0xc0, 0x48, 0x03, 0x88, 0x06, 0x04, 0x01, 0xf0, 0x27, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0x16, 0x83, 0x6c, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x02, 0x00, 0xb8, 0x59, 0xa8, 0x00, 0x16, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x09, 0x04, 0x02, 0x00, 0xb4, + 0x49, 0x7b, 0x50, 0x0f, 0x4a, 0x03, 0x88, 0x93, 0x00, 0x00, 0x00, 0x01, + 0x4a, 0x03, 0x88, 0x05, 0x00, 0x00, 0x00, 0xf0, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0xd3, 0x59, 0xc4, 0x10, 0x06, 0x04, 0x02, 0x00, 0x06, + 0x82, 0x08, 0x15, 0x40, 0x00, 0x00, 0x00, 0xf1, 0x82, 0x08, 0x15, 0x00, + 0xbb, 0xff, 0xff, 0xff, 0x04, 0x01, 0xf0, 0x03, 0x82, 0x08, 0x15, 0x40, + 0x44, 0x00, 0x00, 0xf1, 0x48, 0x0b, 0x88, 0x06, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5c, 0x8c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0xa2, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x08, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x30, + 0x49, 0x7b, 0x50, 0x12, 0x04, 0x01, 0xf0, 0x37, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x37, 0xea, 0x59, 0xc4, 0x00, 0xa4, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x82, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x07, + 0x04, 0x02, 0x10, 0x8f, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x8c, + 0x59, 0xc4, 0x00, 0xa3, 0x82, 0x00, 0x05, 0x00, 0xff, 0xef, 0xff, 0xff, + 0x48, 0x03, 0x88, 0xa3, 0x59, 0xa8, 0x00, 0x48, 0x80, 0x00, 0x01, 0xc0, + 0x04, 0x02, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3d, 0xe7, + 0x04, 0x01, 0xf0, 0x83, 0x59, 0xa8, 0x00, 0x14, 0x84, 0x00, 0x05, 0x46, + 0x48, 0x03, 0x50, 0x14, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xc2, + 0x59, 0xc4, 0x10, 0x06, 0x04, 0x02, 0x00, 0x06, 0x82, 0x08, 0x15, 0x40, + 0x44, 0x00, 0x00, 0x01, 0x82, 0x08, 0x15, 0x00, 0xff, 0xff, 0xff, 0x0f, + 0x04, 0x01, 0xf0, 0x03, 0x82, 0x08, 0x15, 0x40, 0x44, 0x00, 0x00, 0xf1, + 0x48, 0x0b, 0x88, 0x06, 0x49, 0x7b, 0x90, 0x05, 0x4a, 0x03, 0x88, 0x02, + 0x00, 0x00, 0xff, 0xff, 0x4a, 0x03, 0x78, 0xe4, 0x00, 0x00, 0x30, 0x00, + 0x4a, 0x03, 0x78, 0xe4, 0x00, 0x0c, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xaf, 0xda, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x59, 0xa8, 0x10, 0x0f, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x99, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x80, 0x10, 0x59, 0xa8, 0x18, 0x09, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x36, 0xf4, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x17, 0x7f, + 0x85, 0x0e, 0x1d, 0x0a, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x45, 0x5a, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x00, 0x00, 0x09, + 0x8d, 0x0e, 0x1d, 0x06, 0x04, 0x00, 0x00, 0x07, 0x4a, 0x03, 0x50, 0x12, + 0x00, 0x00, 0x00, 0x01, 0x85, 0x0e, 0x1d, 0x0e, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x39, 0x38, 0x04, 0x01, 0xf0, 0x4f, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x46, 0x14, 0x04, 0x00, 0x00, 0x05, 0x59, 0xc4, 0x10, 0x02, + 0x84, 0x08, 0x15, 0x0c, 0x48, 0x0b, 0x88, 0x02, 0x04, 0x01, 0xf0, 0x12, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x02, 0x00, 0x06, + 0x59, 0xa8, 0x00, 0x1c, 0x80, 0x00, 0x05, 0x40, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x8b, 0x49, 0x04, 0x01, 0xf0, 0x0a, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8b, 0x49, 0x59, 0xa8, 0x00, 0x23, 0x8c, 0x00, 0x05, 0x06, + 0x04, 0x02, 0x00, 0x05, 0x59, 0xa8, 0x00, 0x1c, 0x80, 0x00, 0x05, 0x40, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x3f, 0x0a, 0x49, 0x7b, 0x50, 0x25, + 0x49, 0x7b, 0x50, 0x24, 0x49, 0x7b, 0x50, 0x17, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0xa6, 0x59, 0xa8, 0x10, 0x23, 0x04, 0x02, 0x00, 0x0a, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0x59, 0x80, 0x00, 0x15, 0x80, + 0x59, 0xa8, 0x00, 0x27, 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x80, 0x04, 0x0d, 0x40, 0x48, 0x07, 0x50, 0x27, 0x04, 0x01, 0xf0, 0x05, + 0x59, 0xa8, 0x00, 0x27, 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x48, 0x03, 0x50, 0x27, 0x59, 0x9c, 0x00, 0x17, 0x8c, 0x00, 0x05, 0x0a, + 0x04, 0x00, 0x00, 0x02, 0x84, 0x08, 0x15, 0x44, 0x48, 0x0b, 0x50, 0x23, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x00, 0x00, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0x59, 0x48, 0x07, 0x88, 0x80, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x68, 0xfb, 0x49, 0x7b, 0x50, 0x25, 0x49, 0x7b, 0x50, 0x1a, + 0x4a, 0x03, 0x50, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x4a, 0x03, 0x78, 0xe4, + 0x00, 0x00, 0x00, 0xc0, 0x42, 0x02, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x00, 0x00, 0x07, + 0x59, 0xa8, 0x00, 0x23, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0c, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x03, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1a, 0xdd, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0xa8, 0x00, 0x1b, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1a, 0xdd, + 0x04, 0x01, 0xf0, 0x72, 0x59, 0xa8, 0x00, 0x23, 0x8c, 0x00, 0x05, 0x0a, + 0x04, 0x02, 0x00, 0x03, 0x8c, 0x00, 0x05, 0x06, 0x04, 0x00, 0x00, 0x1c, + 0x8c, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x1a, 0x4a, 0x03, 0x88, 0x02, + 0x00, 0x00, 0xff, 0xbf, 0x8c, 0x00, 0x05, 0x02, 0x04, 0x00, 0x00, 0x16, + 0x59, 0x9c, 0x00, 0x18, 0x8c, 0x00, 0x05, 0x16, 0x04, 0x02, 0x00, 0x10, + 0x59, 0xa8, 0x00, 0x24, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x0c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1b, 0xe7, + 0x59, 0xa8, 0x00, 0x23, 0x8c, 0x00, 0x05, 0x04, 0x04, 0x02, 0x00, 0x5b, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x03, 0x41, 0x7a, 0x58, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1c, 0x0c, 0x04, 0x01, 0xf0, 0x55, + 0x59, 0xa8, 0x00, 0x25, 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x52, + 0x59, 0xa8, 0x00, 0x23, 0x8c, 0x00, 0x05, 0x08, 0x04, 0x02, 0x00, 0x05, + 0x59, 0xa8, 0x00, 0x1a, 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x4c, + 0x04, 0x01, 0xf0, 0x03, 0x8c, 0x00, 0x05, 0x16, 0x04, 0x00, 0x00, 0x49, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x46, 0x14, 0x04, 0x02, 0x00, 0x46, + 0x59, 0x9c, 0x00, 0x18, 0x8c, 0x00, 0x05, 0x16, 0x04, 0x02, 0x00, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x49, 0xb0, 0x04, 0x02, 0x00, 0x40, + 0x59, 0x9c, 0x00, 0x17, 0x8c, 0x00, 0x05, 0x0a, 0x04, 0x00, 0x00, 0x0d, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x41, 0x7a, 0x88, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, 0x04, 0x02, 0x00, 0x04, + 0x59, 0x34, 0x02, 0x00, 0x8c, 0x00, 0x05, 0x1a, 0x04, 0x02, 0x00, 0x34, + 0x81, 0x46, 0x88, 0x00, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xf8, + 0x4a, 0x03, 0x88, 0x02, 0x00, 0x00, 0xff, 0xff, 0x42, 0x00, 0x18, 0x00, + 0x00, 0x10, 0xac, 0xb8, 0x04, 0x01, 0xfa, 0x5f, 0x42, 0x00, 0x18, 0x00, + 0x00, 0x10, 0xac, 0xc5, 0x04, 0x01, 0xfa, 0x5c, 0x85, 0x0e, 0x1d, 0x02, + 0x4a, 0x03, 0x78, 0xe4, 0x00, 0x00, 0x00, 0x80, 0x42, 0x02, 0xd8, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x4a, 0x03, 0x50, 0x1b, 0x00, 0x00, 0xff, 0xff, + 0x04, 0x01, 0xf9, 0x50, 0x80, 0x00, 0x05, 0x80, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x14, 0xc3, 0x59, 0x9c, 0x00, 0x18, 0x8c, 0x00, 0x05, 0x16, + 0x04, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x37, 0xc5, + 0x04, 0x01, 0xf0, 0x09, 0x42, 0x00, 0x18, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x42, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x06, 0x42, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x37, 0x64, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xe4, 0x04, 0x00, 0x00, 0x0b, + 0x59, 0xc4, 0x00, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, + 0x04, 0x00, 0x00, 0x04, 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0xff, 0x0f, + 0x04, 0x01, 0xf0, 0x03, 0x82, 0x00, 0x05, 0x00, 0xfb, 0xff, 0xff, 0xff, + 0x48, 0x03, 0x88, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x67, 0x7d, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x94, 0x00, 0x22, 0x59, 0x94, 0x08, 0x23, + 0x80, 0x04, 0x05, 0x40, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x7b, 0x28, 0x23, + 0x1c, 0x01, 0xf0, 0x00, 0x4a, 0x03, 0x88, 0x05, 0x00, 0x00, 0x00, 0xf0, + 0x1c, 0x01, 0xf0, 0x00, 0x4a, 0x03, 0x50, 0x59, 0x00, 0x00, 0x00, 0x04, + 0x4a, 0x03, 0x50, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x03, 0x50, 0x5b, + 0x00, 0x00, 0x00, 0x17, 0x4a, 0x03, 0x50, 0x5c, 0x00, 0x00, 0x00, 0x02, + 0x4a, 0x03, 0x50, 0x0f, 0x00, 0xff, 0xff, 0xff, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8b, 0x49, 0x4a, 0x03, 0x50, 0x27, 0x20, 0x20, 0x00, 0x00, + 0x4a, 0x03, 0x50, 0x28, 0x88, 0x00, 0x02, 0x00, 0x4a, 0x03, 0x50, 0x29, + 0x00, 0xff, 0x00, 0x1f, 0x4a, 0x03, 0x50, 0x2a, 0x00, 0x00, 0x07, 0xd0, + 0x4a, 0x03, 0x50, 0x2b, 0x80, 0x00, 0x00, 0x00, 0x4a, 0x03, 0x50, 0x2c, + 0x00, 0x00, 0x02, 0x00, 0x4a, 0x03, 0x50, 0x2d, 0x00, 0xff, 0x00, 0x00, + 0x4a, 0x03, 0x50, 0x2e, 0x00, 0x01, 0x00, 0x00, 0x4a, 0x03, 0x50, 0x37, + 0x51, 0x4c, 0x4f, 0x47, 0x4a, 0x03, 0x50, 0x38, 0x49, 0x43, 0x20, 0x20, + 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0x44, 0x00, 0x00, 0x41, 0x7a, 0x88, 0x00, + 0x41, 0x78, 0x08, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, + 0x04, 0x02, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x19, + 0x04, 0x02, 0x00, 0x02, 0x80, 0x04, 0x08, 0x00, 0x81, 0x46, 0x88, 0x00, + 0x83, 0x44, 0x05, 0x80, 0x00, 0x00, 0x07, 0xf0, 0x04, 0x02, 0x07, 0xf6, + 0x5c, 0x02, 0x88, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x57, + 0x5c, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x48, 0x03, 0xc8, 0x57, + 0x04, 0x01, 0xf8, 0x0c, 0x48, 0x5f, 0xc8, 0x57, 0x42, 0x03, 0xe0, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x4d, 0x78, 0x00, 0x00, + 0x42, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x80, 0x02, 0x04, 0x01, 0xf0, 0x09, + 0x40, 0x68, 0x00, 0x00, 0x40, 0x6c, 0x08, 0x00, 0x40, 0x70, 0x10, 0x00, + 0x48, 0x5f, 0xc8, 0x57, 0x42, 0x03, 0xe0, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x42, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x80, 0x02, 0x04, 0x00, 0x60, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x4c, 0x04, 0x00, 0x00, 0x59, 0xbc, 0x00, 0xea, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x07, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x02, 0x00, 0x05, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x8d, + 0x5c, 0x00, 0x08, 0x00, 0x48, 0x07, 0xc0, 0x25, 0x80, 0x04, 0x09, 0x20, + 0x48, 0x07, 0xc0, 0x26, 0x5c, 0x00, 0x00, 0x00, 0x48, 0x03, 0xc0, 0x23, + 0x80, 0x00, 0x01, 0x20, 0x48, 0x03, 0xc0, 0x24, 0x5c, 0x00, 0x00, 0x00, + 0x48, 0x03, 0xc8, 0x57, 0x48, 0x03, 0xc0, 0x21, 0x80, 0x00, 0x01, 0x20, + 0x48, 0x03, 0xc0, 0x22, 0x41, 0xf8, 0x00, 0x00, 0x48, 0x03, 0xc0, 0x27, + 0x80, 0x00, 0x01, 0x20, 0x48, 0x03, 0xc0, 0x28, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x50, 0x00, 0x00, 0x00, 0x82, 0x00, 0x04, 0x80, + 0x24, 0x32, 0x00, 0x01, 0x48, 0x03, 0xc8, 0x57, 0x04, 0x00, 0x10, 0x53, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x64, 0x80, 0x04, 0x08, 0x40, + 0x04, 0x00, 0x00, 0x07, 0x4a, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x40, 0x00, 0x00, 0x00, 0x59, 0x80, 0x00, 0x00, 0x8c, 0x00, 0x05, 0x00, + 0x04, 0x00, 0x07, 0xf9, 0x04, 0x00, 0x00, 0x46, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x10, 0xb9, 0x72, 0x46, 0x00, 0x08, 0x00, 0xfa, 0xce, 0xfa, 0xce, + 0x80, 0x04, 0x08, 0x00, 0x4c, 0x08, 0x00, 0x00, 0x4c, 0x0c, 0x00, 0x00, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x58, 0x08, 0x00, 0x13, + 0x44, 0x00, 0x08, 0x00, 0x80, 0x04, 0x08, 0x00, 0x58, 0x08, 0x00, 0x19, + 0x44, 0x00, 0x08, 0x00, 0x80, 0x04, 0x08, 0x00, 0x58, 0x08, 0x00, 0x1a, + 0x44, 0x00, 0x08, 0x00, 0x80, 0x04, 0x08, 0x00, 0x58, 0x08, 0x00, 0x1b, + 0x44, 0x00, 0x08, 0x00, 0x80, 0x04, 0x08, 0x00, 0x58, 0x08, 0x00, 0x1c, + 0x44, 0x00, 0x08, 0x00, 0x80, 0x04, 0x08, 0x00, 0x58, 0x08, 0x00, 0x1f, + 0x44, 0x00, 0x08, 0x00, 0x80, 0x04, 0x08, 0x00, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x7a, 0x40, 0x42, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x0b, + 0x50, 0x08, 0x00, 0x00, 0x44, 0x00, 0x08, 0x00, 0x80, 0x08, 0x10, 0x00, + 0x80, 0x04, 0x08, 0x00, 0x80, 0x0c, 0x18, 0x40, 0x04, 0x02, 0x07, 0xfb, + 0x42, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x03, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x7b, 0x00, 0x48, 0x0c, 0x10, 0x03, 0x58, 0x08, 0x00, 0x05, + 0x44, 0x00, 0x08, 0x00, 0x80, 0x04, 0x08, 0x00, 0x80, 0x0c, 0x18, 0x40, + 0x04, 0x02, 0x17, 0xfb, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x7c, 0x00, + 0x58, 0x08, 0x00, 0x02, 0x44, 0x00, 0x08, 0x00, 0x80, 0x04, 0x08, 0x00, + 0x58, 0x08, 0x00, 0x03, 0x44, 0x00, 0x08, 0x00, 0x80, 0x04, 0x08, 0x00, + 0x58, 0x08, 0x00, 0x20, 0x44, 0x00, 0x08, 0x00, 0x80, 0x04, 0x08, 0x00, + 0x58, 0x08, 0x00, 0x21, 0x44, 0x00, 0x08, 0x00, 0x80, 0x04, 0x08, 0x00, + 0x58, 0x08, 0x00, 0x22, 0x44, 0x00, 0x08, 0x00, 0x80, 0x04, 0x08, 0x00, + 0x58, 0x08, 0x00, 0x23, 0x44, 0x00, 0x08, 0x00, 0x80, 0x04, 0x08, 0x00, + 0x5c, 0x00, 0x18, 0x00, 0x5c, 0x00, 0x10, 0x00, 0x4a, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x5f, 0xc0, 0x20, 0x90, 0x5c, 0xb9, 0xc0, + 0x82, 0x5c, 0xbd, 0x40, 0x00, 0x00, 0x00, 0x12, 0x48, 0x5f, 0xc0, 0x11, + 0x42, 0x03, 0xe0, 0x00, 0x40, 0x00, 0x00, 0x00, 0x42, 0x02, 0xd8, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x59, 0xe0, 0x00, 0x17, 0x8c, 0x00, 0x05, 0x08, + 0x04, 0x00, 0x00, 0x03, 0x4a, 0x03, 0xc0, 0x17, 0x00, 0x00, 0x00, 0x02, + 0x42, 0x03, 0xe0, 0x00, 0x30, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf8, 0x23, + 0x04, 0x01, 0xf7, 0xff, 0x4a, 0x03, 0xc8, 0x50, 0x00, 0x10, 0xb9, 0x8e, + 0x4a, 0x03, 0xc8, 0x51, 0x00, 0x10, 0xc9, 0x8d, 0x4a, 0x03, 0xc8, 0x53, + 0x00, 0x00, 0x08, 0x00, 0x4a, 0x03, 0xc8, 0x55, 0x00, 0x01, 0xeb, 0x5a, + 0x59, 0xe4, 0x00, 0x01, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x3f, 0x00, + 0x48, 0x03, 0xc8, 0x01, 0x4a, 0x03, 0xb1, 0x04, 0x70, 0x00, 0x00, 0x02, + 0x4a, 0x03, 0xa8, 0x04, 0x70, 0x00, 0x00, 0x02, 0x4a, 0x03, 0xb0, 0x04, + 0x70, 0x00, 0x00, 0x02, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0xbb, + 0x49, 0x78, 0x00, 0x01, 0x49, 0x78, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, + 0x5c, 0x03, 0x60, 0x00, 0x4d, 0xb0, 0x00, 0x00, 0x49, 0xb3, 0xc8, 0x57, + 0x48, 0x03, 0xc8, 0x57, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xa8, 0x00, 0x68, 0x8c, 0x00, 0x05, 0x30, + 0x04, 0x02, 0x07, 0xfe, 0x4c, 0x08, 0x00, 0x00, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x01, 0xf8, 0x66, 0x5c, 0x00, 0x10, 0x00, + 0x42, 0x01, 0xd0, 0x00, 0x00, 0x02, 0x8b, 0x0a, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5c, 0x78, 0x4c, 0x08, 0x00, 0x00, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x04, 0x01, 0xf8, 0x5d, 0x5c, 0x00, 0x10, 0x00, + 0x42, 0x01, 0xd0, 0x00, 0x00, 0x02, 0x8b, 0x0a, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5c, 0x78, 0x4c, 0x08, 0x00, 0x00, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x04, 0x01, 0xf8, 0x54, 0x5c, 0x00, 0x10, 0x00, + 0x42, 0x01, 0xd0, 0x00, 0x00, 0x02, 0x8b, 0x0a, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5c, 0x78, 0x04, 0x01, 0xf7, 0xe2, 0x8c, 0x00, 0x05, 0x0c, + 0x59, 0xa8, 0x08, 0x68, 0x04, 0x02, 0x00, 0x03, 0x84, 0x04, 0x0d, 0x30, + 0x04, 0x01, 0xf0, 0x06, 0x84, 0x04, 0x0d, 0x70, 0x48, 0x07, 0x50, 0x68, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf0, 0x44, + 0x48, 0x07, 0x50, 0x68, 0x83, 0x6c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x06, 0x09, 0x00, 0x10, 0x05, 0xeb, + 0x00, 0x10, 0x05, 0xeb, 0x00, 0x10, 0x05, 0xd3, 0x00, 0x10, 0x05, 0xfc, + 0x00, 0x10, 0x05, 0xeb, 0x00, 0x10, 0x05, 0xeb, 0x00, 0x10, 0x05, 0xfc, + 0x59, 0xa8, 0x00, 0x6c, 0x8c, 0x00, 0x05, 0x02, 0x04, 0x02, 0x00, 0x13, + 0x59, 0xc4, 0x08, 0x01, 0x82, 0x04, 0x0d, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0a, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x80, 0x00, 0x04, 0x00, 0x00, 0x04, + 0x42, 0x00, 0x10, 0x00, 0x42, 0x00, 0x40, 0x00, 0x04, 0x01, 0xf0, 0x06, + 0x42, 0x00, 0x10, 0x00, 0x22, 0x00, 0x20, 0x00, 0x04, 0x01, 0xf0, 0x03, + 0x42, 0x00, 0x10, 0x00, 0x12, 0x00, 0x10, 0x00, 0x04, 0x01, 0xf0, 0x29, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x04, 0x04, 0x01, 0xf0, 0x26, + 0x59, 0xa8, 0x00, 0x6c, 0x8c, 0x00, 0x05, 0x02, 0x04, 0x02, 0x00, 0x08, + 0x59, 0xa8, 0x00, 0x68, 0x8c, 0x00, 0x05, 0x34, 0x04, 0x02, 0x00, 0x04, + 0x42, 0x00, 0x10, 0x00, 0x74, 0x05, 0x70, 0x05, 0x04, 0x01, 0xf8, 0x1d, + 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x08, + 0x04, 0x01, 0xf7, 0xfc, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xa8, 0x00, 0x68, + 0x8c, 0x00, 0x05, 0x34, 0x04, 0x02, 0x00, 0x0a, 0x59, 0xa8, 0x00, 0x6c, + 0x8c, 0x00, 0x05, 0x02, 0x04, 0x00, 0x00, 0x04, 0x42, 0x00, 0x10, 0x00, + 0x24, 0x05, 0x20, 0x05, 0x04, 0x01, 0xf0, 0x0c, 0x42, 0x00, 0x10, 0x00, + 0x74, 0x05, 0x70, 0x05, 0x04, 0x01, 0xf0, 0x09, 0x1c, 0x01, 0xf0, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x08, 0x15, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x82, 0x08, 0x15, 0x40, 0x00, 0x1c, 0x00, 0x00, 0x48, 0x0b, 0xc0, 0x13, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xa8, 0x00, 0x68, 0x8c, 0x00, 0x05, 0x30, + 0x04, 0x00, 0x00, 0x02, 0x84, 0x08, 0x15, 0x70, 0x48, 0x0b, 0x50, 0x68, + 0x8c, 0x00, 0x05, 0x30, 0x04, 0x02, 0x00, 0x05, 0x82, 0x08, 0x15, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x80, 0x08, 0x11, 0x14, 0x04, 0x01, 0xff, 0xf0, + 0x1c, 0x01, 0xf0, 0x00, 0x41, 0x78, 0x00, 0x00, 0x50, 0x04, 0x18, 0x00, + 0x80, 0x0c, 0x04, 0x00, 0x80, 0x04, 0x08, 0x00, 0x80, 0x10, 0x20, 0x40, + 0x04, 0x02, 0x07, 0xfc, 0x80, 0x08, 0x05, 0x00, 0x80, 0x00, 0x05, 0x40, + 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x02, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x78, 0x00, 0x00, 0x41, 0x78, 0x08, 0x00, 0x41, 0x78, 0x10, 0x00, + 0x41, 0x78, 0x18, 0x00, 0x41, 0x78, 0x20, 0x00, 0x41, 0x78, 0x28, 0x00, + 0x41, 0x78, 0x30, 0x00, 0x41, 0x78, 0x38, 0x00, 0x41, 0x78, 0x40, 0x00, + 0x41, 0x78, 0x48, 0x00, 0x41, 0x78, 0x50, 0x00, 0x41, 0x78, 0x58, 0x00, + 0x41, 0x78, 0x60, 0x00, 0x41, 0x78, 0x68, 0x00, 0x41, 0x78, 0x70, 0x00, + 0x41, 0x78, 0x78, 0x00, 0x41, 0x78, 0x80, 0x00, 0x41, 0x78, 0x88, 0x00, + 0x41, 0x78, 0x90, 0x00, 0x41, 0x78, 0x98, 0x00, 0x41, 0x78, 0xa0, 0x00, + 0x41, 0x78, 0xa8, 0x00, 0x41, 0x78, 0xb0, 0x00, 0x41, 0x78, 0xb8, 0x00, + 0x41, 0x78, 0xc0, 0x00, 0x41, 0x78, 0xc8, 0x00, 0x41, 0x78, 0xd0, 0x00, + 0x41, 0x78, 0xd8, 0x00, 0x41, 0x78, 0xe0, 0x00, 0x41, 0x78, 0xe8, 0x00, + 0x41, 0x78, 0xf0, 0x00, 0x41, 0x78, 0xf8, 0x00, 0x41, 0x79, 0x00, 0x00, + 0x41, 0x79, 0x08, 0x00, 0x41, 0x79, 0x10, 0x00, 0x41, 0x79, 0x18, 0x00, + 0x41, 0x79, 0x20, 0x00, 0x41, 0x79, 0x28, 0x00, 0x41, 0x79, 0x30, 0x00, + 0x41, 0x79, 0x38, 0x00, 0x41, 0x79, 0x40, 0x00, 0x41, 0x79, 0x48, 0x00, + 0x41, 0x79, 0x50, 0x00, 0x41, 0x79, 0x58, 0x00, 0x41, 0x79, 0x60, 0x00, + 0x41, 0x79, 0x68, 0x00, 0x41, 0x79, 0x70, 0x00, 0x41, 0x79, 0x78, 0x00, + 0x41, 0x79, 0x80, 0x00, 0x41, 0x79, 0x88, 0x00, 0x42, 0x01, 0x90, 0x00, + 0x00, 0x10, 0xad, 0x04, 0x42, 0x01, 0x98, 0x00, 0x00, 0x10, 0xac, 0xdb, + 0x41, 0x79, 0xa0, 0x00, 0x41, 0x79, 0xa8, 0x00, 0x41, 0x79, 0xb0, 0x00, + 0x41, 0x79, 0xb8, 0x00, 0x41, 0x79, 0xc8, 0x00, 0x41, 0x79, 0xc0, 0x00, + 0x41, 0x79, 0xd0, 0x00, 0x41, 0x79, 0xd8, 0x00, 0x41, 0x79, 0xe0, 0x00, + 0x41, 0x79, 0xe8, 0x00, 0x41, 0x79, 0xf0, 0x00, 0x41, 0x79, 0xf8, 0x00, + 0x41, 0x7a, 0x00, 0x00, 0x41, 0x7a, 0x08, 0x00, 0x41, 0x7a, 0x10, 0x00, + 0x41, 0x7a, 0x18, 0x00, 0x41, 0x7a, 0x20, 0x00, 0x42, 0x02, 0x28, 0x00, + 0x00, 0x00, 0x61, 0x00, 0x41, 0x7a, 0x30, 0x00, 0x41, 0x7a, 0x38, 0x00, + 0x41, 0x7a, 0x40, 0x00, 0x41, 0x7a, 0x48, 0x00, 0x41, 0x7a, 0x50, 0x00, + 0x41, 0x7a, 0x58, 0x00, 0x41, 0x7a, 0x60, 0x00, 0x41, 0x7a, 0x68, 0x00, + 0x41, 0x7a, 0x70, 0x00, 0x41, 0x7a, 0x78, 0x00, 0x41, 0x7a, 0x80, 0x00, + 0x41, 0x7a, 0x88, 0x00, 0x41, 0x7a, 0x90, 0x00, 0x41, 0x7a, 0x98, 0x00, + 0x41, 0x7a, 0xe8, 0x00, 0x41, 0x7a, 0xf8, 0x00, 0x42, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0x00, 0x42, 0x03, 0x10, 0x00, 0x00, 0x10, 0xaf, 0xd4, + 0x42, 0x03, 0x18, 0x00, 0x00, 0x00, 0xbf, 0x1d, 0x42, 0x03, 0x20, 0x00, + 0x00, 0x00, 0xbf, 0x32, 0x42, 0x03, 0x28, 0x00, 0x00, 0x10, 0xaf, 0x9c, + 0x42, 0x03, 0x30, 0x00, 0x00, 0x02, 0x08, 0xff, 0x42, 0x03, 0x40, 0x00, + 0x00, 0x10, 0xac, 0x71, 0x42, 0x03, 0x38, 0x00, 0x00, 0x10, 0xac, 0x90, + 0x42, 0x03, 0x48, 0x00, 0x00, 0x10, 0xad, 0x12, 0x42, 0x03, 0x50, 0x00, + 0x00, 0x10, 0xac, 0x00, 0x42, 0x03, 0x58, 0x00, 0x00, 0x10, 0xa4, 0x00, + 0x42, 0x03, 0x08, 0x00, 0x00, 0x10, 0xac, 0xd2, 0x41, 0x7b, 0x60, 0x00, + 0x42, 0x03, 0x68, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x42, 0x03, 0xc8, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x42, 0x03, 0x70, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x42, 0x03, 0x78, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x42, 0x03, 0x80, 0x00, + 0x00, 0x00, 0x77, 0x00, 0x42, 0x03, 0x88, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x42, 0x03, 0x90, 0x00, 0x00, 0x00, 0x60, 0x00, 0x42, 0x03, 0x98, 0x00, + 0x00, 0x10, 0xb6, 0xaa, 0x42, 0x03, 0xa0, 0x00, 0x00, 0x00, 0x76, 0x00, + 0x42, 0x03, 0xa8, 0x00, 0x00, 0x00, 0x74, 0x00, 0x42, 0x03, 0xb0, 0x00, + 0x00, 0x00, 0x72, 0x00, 0x42, 0x03, 0xb8, 0x00, 0x00, 0x00, 0x71, 0x00, + 0x42, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x42, 0x03, 0xd0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x42, 0x03, 0xe8, 0x00, 0x00, 0x02, 0x00, 0xeb, + 0x41, 0x7b, 0xd8, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x50, 0x04, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0x44, 0x00, 0x08, 0x00, + 0x42, 0x00, 0x18, 0x00, 0x00, 0x00, 0x55, 0x55, 0x41, 0x78, 0x20, 0x00, + 0x82, 0x10, 0x24, 0x00, 0x00, 0x01, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, + 0x80, 0x04, 0x2c, 0x00, 0x44, 0x0c, 0x28, 0x00, 0x42, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x0a, 0x80, 0x18, 0x30, 0x40, 0x04, 0x02, 0x07, 0xff, + 0x50, 0x14, 0x00, 0x00, 0x80, 0x0c, 0x05, 0x80, 0x04, 0x02, 0x00, 0x04, + 0x50, 0x04, 0x00, 0x00, 0x80, 0x0c, 0x05, 0x80, 0x04, 0x02, 0x07, 0xf2, + 0x5c, 0x00, 0x00, 0x00, 0x44, 0x00, 0x08, 0x00, 0x80, 0x14, 0x28, 0x40, + 0x48, 0x17, 0xc8, 0x61, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xa8, 0x08, 0x1e, + 0x80, 0x04, 0x09, 0xc0, 0x04, 0x02, 0x00, 0x09, 0x49, 0x78, 0x1c, 0x0c, + 0x4a, 0x00, 0x1a, 0x0c, 0x00, 0x00, 0x02, 0x00, 0x4a, 0x00, 0x18, 0x04, + 0x07, 0x00, 0x00, 0x00, 0x59, 0xa8, 0x00, 0x0f, 0x9c, 0x00, 0x01, 0xc0, + 0x48, 0x00, 0x18, 0x05, 0x04, 0x01, 0xfd, 0xed, 0x9c, 0x04, 0x09, 0xc0, + 0x48, 0x04, 0x18, 0x06, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0xa8, 0x08, 0x0b, 0x40, 0x06, 0xd0, 0x00, 0x42, 0x02, 0xb8, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x59, 0xa8, 0x18, 0x0c, 0x48, 0x0f, 0xc8, 0x57, + 0x82, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x14, 0x82, 0x08, 0x24, 0x00, + 0x00, 0x00, 0x00, 0x14, 0x40, 0x10, 0x00, 0x00, 0x80, 0x0c, 0x04, 0x80, + 0x04, 0x00, 0x10, 0x06, 0x44, 0x08, 0x08, 0x00, 0x40, 0x08, 0x08, 0x00, + 0x40, 0x10, 0x10, 0x00, 0x81, 0x5e, 0xb8, 0x00, 0x04, 0x01, 0xf7, 0xf7, + 0x45, 0x78, 0x08, 0x00, 0x49, 0x5f, 0x50, 0x1f, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x04, 0x41, 0x2d, 0x88, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x83, 0x5c, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x10, 0x09, 0x49, 0x6b, 0xc8, 0x57, + 0x81, 0x5e, 0xb8, 0x40, 0x41, 0x6a, 0x58, 0x00, 0x59, 0x2e, 0xd0, 0x00, + 0x49, 0x7a, 0x58, 0x00, 0x49, 0x7a, 0x58, 0x01, 0x81, 0x2e, 0x59, 0xc0, + 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x22, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x41, 0x7a, 0x58, 0x00, + 0x04, 0x01, 0xf7, 0xf9, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x04, + 0x41, 0x2d, 0x88, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x81, 0x5e, 0xb8, 0x40, 0x04, 0x00, 0x10, 0x08, 0x41, 0x6a, 0x58, 0x00, + 0x49, 0x2f, 0xc8, 0x57, 0x59, 0x2e, 0xd0, 0x00, 0x49, 0x7a, 0x58, 0x00, + 0x49, 0x7a, 0x58, 0x01, 0x81, 0x2e, 0x59, 0xc0, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x22, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x41, 0x7a, 0xb8, 0x00, 0x41, 0x7a, 0x58, 0x00, + 0x04, 0x01, 0xf7, 0xf8, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x2f, 0xc8, 0x57, + 0x49, 0x6a, 0x58, 0x00, 0x41, 0x2e, 0xd0, 0x00, 0x81, 0x5e, 0xb8, 0x00, + 0x59, 0xc8, 0x00, 0x00, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x12, 0x00, + 0x48, 0x03, 0x90, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x2f, 0xc8, 0x57, 0x81, 0x2e, 0x59, 0xc0, 0x04, 0x00, 0x00, 0x07, + 0x59, 0x2c, 0x00, 0x01, 0x49, 0x7a, 0x58, 0x01, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xff, 0xed, 0x5c, 0x02, 0x58, 0x00, 0x04, 0x01, 0xf7, 0xf9, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x07, 0xc8, 0x56, 0x42, 0x00, 0x70, 0x00, + 0x00, 0x10, 0xaf, 0xc6, 0x4a, 0x00, 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x59, 0xe0, 0x00, 0x03, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x80, 0x80, + 0x48, 0x03, 0xc0, 0x03, 0x4a, 0x03, 0xb8, 0x05, 0x90, 0x00, 0x00, 0x01, + 0x59, 0xdc, 0x00, 0x06, 0x4a, 0x03, 0xb8, 0x05, 0x70, 0x00, 0x00, 0x00, + 0x59, 0xdc, 0x00, 0x06, 0x4a, 0x03, 0xb8, 0x05, 0x30, 0x00, 0x00, 0x00, + 0x59, 0xdc, 0x00, 0x06, 0x4a, 0x03, 0xb8, 0x05, 0x80, 0x00, 0x00, 0x00, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x49, 0x7b, 0xb8, 0x07, + 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xfe, 0x4a, 0x03, 0xb8, 0x05, + 0x30, 0x00, 0x00, 0x00, 0x59, 0xdc, 0x00, 0x06, 0x4a, 0x03, 0xb8, 0x05, + 0x60, 0x00, 0x00, 0x01, 0x59, 0xdc, 0x00, 0x06, 0x4a, 0x03, 0xb8, 0x05, + 0x70, 0x00, 0x00, 0x01, 0x59, 0xdc, 0x00, 0x06, 0x4a, 0x03, 0xb8, 0x05, + 0x30, 0x00, 0x00, 0x02, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x49, 0x7b, 0xb8, 0x07, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xfe, + 0x4a, 0x03, 0xb8, 0x05, 0x30, 0x00, 0x00, 0x00, 0x59, 0xdc, 0x00, 0x06, + 0x4a, 0x03, 0xb8, 0x05, 0x60, 0x00, 0x00, 0x01, 0x04, 0x01, 0xff, 0x91, + 0x04, 0x00, 0x0d, 0x7b, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0xaf, 0xc4, + 0x45, 0x2c, 0x10, 0x00, 0x4a, 0x02, 0x58, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x4a, 0x02, 0x58, 0x02, 0x00, 0x00, 0x01, 0x00, 0x4a, 0x02, 0x58, 0x09, + 0x00, 0x10, 0x69, 0xa6, 0x49, 0x7a, 0x58, 0x0a, 0x49, 0x7a, 0x58, 0x0b, + 0x49, 0x7a, 0x58, 0x0c, 0x04, 0x01, 0xff, 0x83, 0x04, 0x00, 0x0d, 0x6d, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0xaf, 0xc5, 0x45, 0x2c, 0x10, 0x00, + 0x4a, 0x02, 0x58, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x02, 0x58, 0x02, + 0x00, 0x00, 0x01, 0x00, 0x4a, 0x02, 0x58, 0x09, 0x00, 0x10, 0x10, 0xd8, + 0x49, 0x7a, 0x58, 0x03, 0x49, 0x7a, 0x58, 0x07, 0x49, 0x7a, 0x58, 0x08, + 0x49, 0x7a, 0x58, 0x0a, 0x59, 0xa8, 0x00, 0x6c, 0x8c, 0x00, 0x05, 0x00, + 0x04, 0x00, 0x00, 0x06, 0x4a, 0x03, 0xb8, 0x05, 0xe0, 0x00, 0x00, 0x01, + 0x59, 0xdc, 0x00, 0x06, 0x8c, 0x00, 0x05, 0x22, 0x04, 0x00, 0x07, 0xfc, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x40, 0x68, 0x10, 0x00, + 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4d, 0xf0, 0x00, 0x00, 0x42, 0x03, 0xe0, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x4c, 0x38, 0x00, 0x00, 0x40, 0x08, 0x70, 0x00, 0x4a, 0x00, 0x70, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x70, 0x00, 0x00, 0x10, 0xaf, 0xc6, + 0x82, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x78, 0x00, 0x00, + 0x58, 0x38, 0x00, 0x05, 0x48, 0x08, 0x70, 0x05, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x00, 0x00, 0x06, 0x48, 0x0b, 0xc8, 0x57, 0x82, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x08, 0x00, 0x00, 0x04, 0x01, 0xf0, 0x03, + 0x48, 0x0b, 0xc8, 0x57, 0x48, 0x08, 0x70, 0x06, 0x58, 0x38, 0x00, 0x01, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x08, 0x0c, 0x5c, 0x00, 0x70, 0x00, + 0x5c, 0x03, 0xe0, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x38, 0x00, 0x00, + 0x42, 0x00, 0x70, 0x00, 0x00, 0x10, 0xaf, 0xc6, 0x58, 0x38, 0x00, 0x01, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x08, 0x03, 0x5c, 0x00, 0x70, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x00, 0x70, 0x00, 0x00, 0x10, 0xaf, 0xc6, + 0x58, 0x38, 0x00, 0x01, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x12, 0x58, 0x38, 0x00, 0x00, 0x0c, 0x01, 0xf0, 0x01, + 0x00, 0x10, 0x07, 0xd4, 0x00, 0x10, 0x07, 0xd3, 0x00, 0x10, 0x07, 0xd3, + 0x00, 0x10, 0x07, 0xd3, 0x00, 0x10, 0x07, 0xd3, 0x00, 0x10, 0x07, 0xd3, + 0x00, 0x10, 0x07, 0xd3, 0x00, 0x10, 0x07, 0xd3, 0x04, 0x01, 0xfd, 0x1c, + 0x58, 0x38, 0x08, 0x08, 0x80, 0x04, 0x09, 0xc0, 0x04, 0x02, 0x00, 0x27, + 0x58, 0x38, 0x00, 0x06, 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x02, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x57, 0x48, 0x00, 0x70, 0x02, + 0x40, 0x00, 0x68, 0x00, 0x58, 0x34, 0x00, 0x00, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x02, 0x00, 0x02, 0x48, 0x00, 0x70, 0x05, 0x48, 0x00, 0x70, 0x06, + 0x4a, 0x03, 0xb8, 0x05, 0x20, 0x00, 0x00, 0x00, 0x59, 0xdc, 0x00, 0x06, + 0x4a, 0x03, 0xb8, 0x05, 0x30, 0x00, 0x00, 0x00, 0x58, 0x34, 0x00, 0x07, + 0x48, 0x03, 0xb8, 0x00, 0x48, 0x03, 0xc8, 0x57, 0x58, 0x34, 0x00, 0x08, + 0x48, 0x03, 0xb8, 0x01, 0x48, 0x03, 0xc8, 0x57, 0x58, 0x34, 0x00, 0x05, + 0x48, 0x00, 0x70, 0x03, 0x58, 0x34, 0x00, 0x03, 0x48, 0x00, 0x70, 0x04, + 0x48, 0x03, 0xb8, 0x03, 0x48, 0x03, 0xc8, 0x57, 0x58, 0x34, 0x00, 0x01, + 0x8c, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x04, 0x4a, 0x00, 0x70, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x28, 0x4a, 0x00, 0x70, 0x01, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf0, 0x3d, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8c, 0x2f, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9e, 0x89, + 0x04, 0x00, 0x00, 0x17, 0x4a, 0x03, 0xb8, 0x05, 0x20, 0x00, 0x00, 0x00, + 0x59, 0xdc, 0x00, 0x06, 0x4a, 0x03, 0xb8, 0x05, 0x30, 0x00, 0x00, 0x00, + 0x48, 0x07, 0xb8, 0x00, 0x48, 0x0b, 0xb8, 0x01, 0x4a, 0x00, 0x70, 0x03, + 0x00, 0x00, 0x00, 0x40, 0x48, 0x0c, 0x70, 0x09, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x10, 0x07, 0xbb, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5b, 0x79, + 0x58, 0x38, 0x00, 0x08, 0x82, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x48, 0x00, 0x70, 0x04, 0x48, 0x03, 0xb8, 0x03, 0x4a, 0x00, 0x70, 0x01, + 0x00, 0x00, 0x00, 0x07, 0x04, 0x01, 0xf0, 0x22, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8c, 0x47, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x07, 0xbb, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5b, 0x50, 0x04, 0x01, 0xf7, 0xb7, 0x4c, 0x04, 0x00, 0x00, + 0x4c, 0x08, 0x00, 0x00, 0x58, 0x38, 0x08, 0x03, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x82, 0x04, 0x04, 0x80, 0x00, 0x00, 0xff, 0xff, + 0x04, 0x02, 0x10, 0x03, 0x40, 0x04, 0x10, 0x00, 0x80, 0x00, 0x05, 0x80, + 0x48, 0x00, 0x70, 0x03, 0x48, 0x0b, 0xc8, 0x57, 0x48, 0x0b, 0xb8, 0x02, + 0x4a, 0x03, 0xb8, 0x05, 0x30, 0x00, 0x00, 0x02, 0x59, 0xdc, 0x00, 0x06, + 0x4a, 0x03, 0xb8, 0x05, 0x70, 0x00, 0x00, 0x01, 0x59, 0xdc, 0x00, 0x06, + 0x4a, 0x03, 0xb8, 0x05, 0x10, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x10, 0x00, + 0x5c, 0x00, 0x08, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x3b, 0xc8, 0x57, + 0x4c, 0x04, 0x00, 0x00, 0x4c, 0x08, 0x00, 0x00, 0x58, 0x38, 0x08, 0x03, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0x82, 0x04, 0x04, 0x80, + 0x00, 0x00, 0xff, 0xff, 0x04, 0x02, 0x10, 0x03, 0x40, 0x04, 0x10, 0x00, + 0x80, 0x00, 0x05, 0x80, 0x48, 0x00, 0x70, 0x03, 0x48, 0x0b, 0xb8, 0x02, + 0x48, 0x03, 0xc8, 0x57, 0x4a, 0x03, 0xb8, 0x05, 0x10, 0x00, 0x00, 0x02, + 0x5c, 0x00, 0x10, 0x00, 0x5c, 0x00, 0x08, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x04, 0x00, 0x00, 0x4c, 0x38, 0x00, 0x00, 0x42, 0x00, 0x70, 0x00, + 0x00, 0x10, 0xaf, 0xc6, 0x59, 0xdc, 0x08, 0x06, 0x48, 0x07, 0xc8, 0x57, + 0x4a, 0x03, 0xb8, 0x05, 0x20, 0x00, 0x00, 0x00, 0x8c, 0x04, 0x0d, 0x3e, + 0x04, 0x00, 0x00, 0x07, 0x8c, 0x04, 0x0d, 0x08, 0x04, 0x02, 0x0c, 0x98, + 0x58, 0x38, 0x00, 0x01, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x0c, 0x01, 0xf8, 0x04, 0x5c, 0x00, 0x70, 0x00, 0x5c, 0x00, 0x08, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x07, 0xc3, 0x00, 0x10, 0x08, 0x67, + 0x00, 0x10, 0x08, 0x77, 0x00, 0x10, 0x04, 0xef, 0x00, 0x10, 0x04, 0xef, + 0x00, 0x10, 0x04, 0xef, 0x00, 0x10, 0x04, 0xef, 0x00, 0x10, 0x11, 0x06, + 0x48, 0x07, 0xc8, 0x56, 0x82, 0x04, 0x0d, 0x00, 0x43, 0x00, 0x0f, 0x80, + 0x04, 0x02, 0x00, 0x09, 0x58, 0x38, 0x00, 0x03, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x00, 0x00, 0x1c, 0x59, 0xdc, 0x00, 0x00, 0x48, 0x03, 0xb8, 0x00, + 0x59, 0xdc, 0x00, 0x01, 0x48, 0x03, 0xb8, 0x01, 0x04, 0x01, 0xf7, 0xaf, + 0x58, 0x38, 0x08, 0x02, 0x4a, 0x00, 0x08, 0x02, 0x00, 0x00, 0x02, 0x00, + 0x04, 0x01, 0xf0, 0x1d, 0x48, 0x07, 0xc8, 0x56, 0x82, 0x04, 0x0d, 0x00, + 0x43, 0x00, 0x0f, 0x80, 0x04, 0x02, 0x00, 0x09, 0x58, 0x38, 0x00, 0x03, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x0c, 0x59, 0xdc, 0x00, 0x00, + 0x48, 0x03, 0xb8, 0x00, 0x59, 0xdc, 0x00, 0x01, 0x48, 0x03, 0xb8, 0x01, + 0x04, 0x01, 0xf7, 0xb7, 0x58, 0x38, 0x00, 0x02, 0x82, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x04, 0x01, 0xf0, 0x0b, 0x4c, 0x34, 0x00, 0x00, 0x58, 0x38, 0x68, 0x02, + 0x59, 0xdc, 0x00, 0x00, 0x48, 0x03, 0xc8, 0x57, 0x48, 0x00, 0x68, 0x07, + 0x59, 0xdc, 0x00, 0x01, 0x48, 0x00, 0x68, 0x08, 0x4a, 0x00, 0x68, 0x02, + 0x00, 0x00, 0x01, 0x00, 0x5c, 0x00, 0x68, 0x00, 0x4a, 0x00, 0x70, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x30, 0x00, 0x00, 0x58, 0x38, 0x60, 0x02, + 0x48, 0x33, 0xc8, 0x57, 0x04, 0x01, 0xf8, 0x07, 0x04, 0x00, 0x00, 0x04, + 0x58, 0x30, 0x00, 0x09, 0x40, 0x30, 0xd0, 0x00, 0x08, 0x01, 0xf8, 0x00, + 0x5c, 0x00, 0x60, 0x00, 0x04, 0x01, 0xf7, 0x25, 0x80, 0x30, 0x61, 0xc0, + 0x04, 0x00, 0x00, 0x09, 0x59, 0xa8, 0x00, 0x0b, 0x80, 0x30, 0x04, 0x80, + 0x04, 0x00, 0x10, 0x07, 0x59, 0xa8, 0x00, 0x0c, 0x80, 0x30, 0x04, 0x80, + 0x04, 0x02, 0x10, 0x04, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x1c, 0x01, 0xf0, 0x00, 0x80, 0x00, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x4d, 0xc0, 0x00, 0x00, 0x42, 0x00, 0x70, 0x00, + 0x00, 0x10, 0xaf, 0xd1, 0x4a, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x78, 0x70, 0x01, 0x42, 0x03, 0x80, 0x00, 0x00, 0x00, 0x77, 0x20, + 0x4a, 0x03, 0x80, 0x06, 0x60, 0x00, 0x00, 0x01, 0x4a, 0x03, 0x80, 0x09, + 0xf4, 0xf6, 0x00, 0x00, 0x42, 0x03, 0x80, 0x00, 0x00, 0x00, 0x77, 0x00, + 0x4a, 0x03, 0x80, 0x06, 0x60, 0x00, 0x00, 0x01, 0x4a, 0x03, 0x80, 0x09, + 0xf4, 0xf6, 0x00, 0x00, 0x4a, 0x03, 0xc8, 0x22, 0x00, 0x00, 0x00, 0x10, + 0x4a, 0x03, 0x70, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x09, + 0x4a, 0x03, 0x70, 0xe9, 0x00, 0x00, 0x3a, 0x0f, 0x4a, 0x03, 0x70, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0x4a, 0x03, 0x70, 0xe8, 0x00, 0x00, 0x00, 0x01, + 0x5c, 0x03, 0x80, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x5c, 0x00, 0x00, + 0x41, 0x78, 0xb8, 0x00, 0x04, 0x01, 0xf8, 0x0a, 0x5c, 0x00, 0xb8, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x4c, 0x5c, 0x00, 0x00, + 0x82, 0x5c, 0xbd, 0x40, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf8, 0x03, + 0x5c, 0x00, 0xb8, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x4d, 0xc0, 0x00, 0x00, 0x4c, 0x50, 0x00, 0x00, 0x4c, 0x58, 0x00, 0x00, + 0x4c, 0x54, 0x00, 0x00, 0x4a, 0x03, 0x70, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x5c, 0xb9, 0xc0, 0x04, 0x00, 0x00, 0x09, 0x4a, 0x03, 0x88, 0x07, + 0x00, 0x00, 0x00, 0x04, 0x59, 0xb8, 0x00, 0xea, 0x8c, 0x00, 0x05, 0x10, + 0x04, 0x00, 0x00, 0x04, 0x59, 0xb8, 0x00, 0xe0, 0x04, 0x01, 0xf8, 0x7c, + 0x04, 0x01, 0xf7, 0xfb, 0x42, 0x03, 0x80, 0x00, 0x00, 0x00, 0x77, 0x20, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0e, 0x08, 0x59, 0xc0, 0x00, 0x07, + 0x4a, 0x03, 0x80, 0x06, 0x20, 0x00, 0x00, 0x00, 0x59, 0xc0, 0x00, 0x07, + 0x4a, 0x03, 0x80, 0x06, 0x80, 0x00, 0x00, 0x0a, 0x59, 0xc0, 0x00, 0x07, + 0x4a, 0x03, 0x80, 0x06, 0x80, 0x00, 0x00, 0x0b, 0x59, 0xc0, 0x00, 0x07, + 0x4a, 0x03, 0x80, 0x06, 0x40, 0x00, 0x00, 0x01, 0x83, 0xc0, 0x05, 0x80, + 0x00, 0x00, 0x77, 0x00, 0x04, 0x00, 0x00, 0x04, 0x42, 0x03, 0x80, 0x00, + 0x00, 0x00, 0x77, 0x00, 0x04, 0x01, 0xf7, 0xed, 0x42, 0x03, 0x80, 0x00, + 0x00, 0x00, 0x77, 0x20, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x59, 0xc0, 0x00, 0x07, 0x8c, 0x00, 0x05, 0x1e, 0x04, 0x00, 0x00, 0x07, + 0x4a, 0x03, 0x80, 0x06, 0x90, 0x00, 0x00, 0x01, 0x80, 0x04, 0x08, 0x40, + 0x04, 0x02, 0x07, 0xfa, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x83, 0xc0, 0x05, 0x80, 0x00, 0x00, 0x77, 0x00, 0x04, 0x00, 0x00, 0x04, + 0x42, 0x03, 0x80, 0x00, 0x00, 0x00, 0x77, 0x00, 0x04, 0x01, 0xf7, 0xf0, + 0x80, 0x5c, 0xb9, 0xc0, 0x04, 0x02, 0x00, 0x1d, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x83, 0xb8, 0xac, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x39, 0x4a, 0x03, 0x70, 0xfb, + 0x00, 0x00, 0x00, 0x01, 0x4a, 0x03, 0x70, 0x20, 0x00, 0x10, 0x0f, 0xd8, + 0x59, 0xa8, 0x00, 0x36, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x48, 0x03, 0x70, 0x21, 0x4a, 0x03, 0x70, 0x35, 0x00, 0x10, 0xb5, 0xaa, + 0x4a, 0x03, 0x70, 0x30, 0x00, 0x10, 0xac, 0x0f, 0x4a, 0x03, 0x70, 0x31, + 0x00, 0x10, 0xa4, 0x00, 0x4a, 0x03, 0x70, 0x32, 0x00, 0x10, 0xac, 0xe6, + 0x4a, 0x03, 0x70, 0x36, 0x00, 0x10, 0xac, 0xf1, 0x59, 0x84, 0x00, 0x02, + 0x48, 0x03, 0x70, 0x34, 0x4a, 0x03, 0x70, 0x38, 0x00, 0x10, 0x0f, 0xcf, + 0x4a, 0x03, 0x70, 0xfb, 0x00, 0x00, 0x00, 0x01, 0x41, 0x78, 0xa0, 0x00, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x83, 0xb8, 0xac, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x39, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x83, 0xb8, 0xac, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x39, + 0x80, 0x5c, 0xb9, 0xc0, 0x04, 0x02, 0x00, 0x04, 0x4a, 0x03, 0x70, 0xe4, + 0xaa, 0xaa, 0xaa, 0xaa, 0x04, 0x01, 0xf0, 0x03, 0x4a, 0x03, 0x70, 0xe4, + 0xa2, 0xaa, 0xaa, 0x82, 0x4a, 0x03, 0x70, 0xe5, 0xaa, 0xaa, 0xaa, 0xaa, + 0x4a, 0x03, 0x70, 0xe6, 0xaa, 0xaa, 0xaa, 0xaa, 0x4a, 0x03, 0x70, 0xfb, + 0x00, 0x00, 0x00, 0x00, 0x4a, 0x03, 0x70, 0xe6, 0xaa, 0xaa, 0xaa, 0xaa, + 0x42, 0x03, 0x80, 0x00, 0x00, 0x00, 0x77, 0x20, 0x4a, 0x03, 0x80, 0x06, + 0x90, 0x00, 0x00, 0x00, 0x59, 0xc0, 0x00, 0x07, 0x8c, 0x00, 0x05, 0x1e, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x42, 0x03, 0x80, 0x00, + 0x00, 0x00, 0x77, 0x00, 0x4a, 0x03, 0x80, 0x06, 0x90, 0x00, 0x00, 0x00, + 0x59, 0xc0, 0x00, 0x07, 0x8c, 0x00, 0x05, 0x1e, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x5c, 0x00, 0xa8, 0x00, 0x5c, 0x00, 0xb0, 0x00, + 0x5c, 0x00, 0xa0, 0x00, 0x5c, 0x03, 0x80, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4d, 0x30, 0x00, 0x00, 0x4d, 0x38, 0x00, 0x00, 0x40, 0x02, 0x60, 0x00, + 0x82, 0x00, 0x05, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x00, 0x0f, 0x83, 0x32, 0x65, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x59, 0x30, 0x02, 0x03, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x02, 0x00, 0x09, 0x59, 0x30, 0x0c, 0x06, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x09, 0x04, 0x02, 0x00, 0x05, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x47, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0xdf, 0x5c, 0x02, 0x70, 0x00, 0x5c, 0x02, 0x60, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0x30, 0x00, 0x00, 0x4d, 0x2c, 0x00, 0x00, + 0x4d, 0x34, 0x00, 0x00, 0x4d, 0x40, 0x00, 0x00, 0x4c, 0xfc, 0x00, 0x00, + 0x4d, 0x38, 0x00, 0x00, 0x4d, 0x3c, 0x00, 0x00, 0x4d, 0x44, 0x00, 0x00, + 0x4d, 0x4c, 0x00, 0x00, 0x4d, 0x48, 0x00, 0x00, 0x4c, 0x5c, 0x00, 0x00, + 0x4c, 0x60, 0x00, 0x00, 0x4c, 0x64, 0x00, 0x00, 0x4d, 0x04, 0x00, 0x00, + 0x4c, 0xc8, 0x00, 0x00, 0x4c, 0xcc, 0x00, 0x00, 0x4c, 0xf4, 0x00, 0x00, + 0x4c, 0xf8, 0x00, 0x00, 0x4c, 0xfc, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x00, 0x16, 0x5c, 0x01, 0xf8, 0x00, 0x5c, 0x01, 0xf0, 0x00, + 0x5c, 0x01, 0xe8, 0x00, 0x5c, 0x01, 0x98, 0x00, 0x5c, 0x01, 0x90, 0x00, + 0x5c, 0x02, 0x08, 0x00, 0x5c, 0x00, 0xc8, 0x00, 0x5c, 0x00, 0xc0, 0x00, + 0x5c, 0x00, 0xb8, 0x00, 0x5c, 0x02, 0x90, 0x00, 0x5c, 0x02, 0x98, 0x00, + 0x5c, 0x02, 0x88, 0x00, 0x5c, 0x02, 0x78, 0x00, 0x5c, 0x02, 0x70, 0x00, + 0x5c, 0x01, 0xf8, 0x00, 0x5c, 0x02, 0x80, 0x00, 0x5c, 0x02, 0x68, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x5c, 0x02, 0x60, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x3b, 0xc8, 0x57, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x00, 0x3d, + 0x83, 0x30, 0x05, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x81, 0x32, 0x65, 0x80, 0x80, 0x00, 0x01, 0x30, 0x82, 0x00, 0x0c, 0x80, + 0x00, 0x00, 0x00, 0x14, 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x0c, 0x01, 0xf0, 0x13, 0x83, 0x30, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x07, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf0, 0x25, 0x1c, 0x01, 0xf0, 0x00, + 0x82, 0x00, 0x0d, 0x00, 0xc0, 0x00, 0x00, 0x38, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xe4, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x53, 0x00, 0x10, 0x09, 0xdb, 0x00, 0x10, 0x09, 0xff, + 0x00, 0x10, 0x09, 0xfa, 0x00, 0x10, 0x0a, 0x1f, 0x00, 0x10, 0x09, 0xe6, + 0x00, 0x10, 0x09, 0xf2, 0x00, 0x10, 0x09, 0xdb, 0x00, 0x10, 0x0a, 0x1a, + 0x00, 0x10, 0x0a, 0x5b, 0x00, 0x10, 0x09, 0xdb, 0x00, 0x10, 0x09, 0xdb, + 0x00, 0x10, 0x09, 0xdb, 0x00, 0x10, 0x09, 0xdb, 0x00, 0x10, 0x0a, 0x5e, + 0x00, 0x10, 0x0a, 0x64, 0x00, 0x10, 0x0a, 0x75, 0x00, 0x10, 0x0a, 0x86, + 0x00, 0x10, 0x09, 0xdb, 0x00, 0x10, 0x0a, 0x8f, 0x00, 0x10, 0x0a, 0x9b, + 0x00, 0x10, 0x09, 0xdb, 0x00, 0x10, 0x09, 0xdb, 0x00, 0x10, 0x09, 0xdb, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x00, 0x10, 0x09, 0xe4, + 0x00, 0x10, 0x0b, 0x36, 0x00, 0x10, 0x0a, 0x2c, 0x00, 0x10, 0x0a, 0x50, + 0x00, 0x10, 0x09, 0xe4, 0x00, 0x10, 0x09, 0xe4, 0x00, 0x10, 0x09, 0xe4, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x48, 0x03, 0xc8, 0x56, + 0x59, 0x30, 0x00, 0x04, 0x8c, 0x00, 0x05, 0x3e, 0x04, 0x02, 0x00, 0x05, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x55, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xdf, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x67, 0xa7, + 0x04, 0x00, 0x07, 0xfa, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x04, 0x01, 0xf8, 0xaa, 0x40, 0x00, 0x28, 0x00, 0x41, 0x78, 0x20, 0x00, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x56, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xdf, 0x48, 0x03, 0xc8, 0x56, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x57, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xdf, + 0x48, 0x03, 0xc8, 0x56, 0x59, 0x30, 0x00, 0x07, 0x8c, 0x00, 0x05, 0x1a, + 0x04, 0x02, 0x00, 0x10, 0x59, 0x32, 0x58, 0x08, 0x81, 0x2e, 0x59, 0xc0, + 0x04, 0x00, 0x00, 0x14, 0x59, 0x2c, 0x04, 0x08, 0x8c, 0x00, 0x05, 0x1c, + 0x04, 0x02, 0x00, 0x03, 0x4a, 0x02, 0x60, 0x11, 0xff, 0xff, 0xff, 0xff, + 0x59, 0x30, 0x00, 0x04, 0x8c, 0x00, 0x05, 0x3e, 0x04, 0x02, 0x00, 0x09, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x48, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xdf, 0x59, 0x32, 0x58, 0x08, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x00, 0x07, 0x04, 0x01, 0xf7, 0xf4, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x67, 0xa7, 0x04, 0x00, 0x07, 0xf6, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x83, 0x30, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x60, 0xd6, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x04, 0x00, 0x00, 0x59, 0xb8, 0x08, 0xea, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x00, 0x04, 0x42, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0xac, 0x5c, 0x00, 0x08, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x04, 0x01, 0xf8, 0xfa, 0x04, 0x00, 0x00, 0x1b, 0x59, 0x32, 0x58, 0x08, + 0x81, 0x2e, 0x59, 0xc0, 0x04, 0x00, 0x00, 0x18, 0x59, 0x2c, 0x02, 0x04, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x29, 0x04, 0x02, 0x00, 0x12, 0x59, 0x30, 0x02, 0x03, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x0b, + 0x59, 0x30, 0x08, 0x07, 0x84, 0x04, 0x0d, 0x26, 0x48, 0x06, 0x60, 0x07, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x00, 0x7b, 0x4a, 0x03, 0x90, 0x0d, + 0x00, 0x00, 0x00, 0x40, 0x4a, 0x03, 0x70, 0xe5, 0x00, 0x00, 0x00, 0x08, + 0x1c, 0x01, 0xf0, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x67, 0xa7, + 0x04, 0x00, 0x07, 0xf4, 0x59, 0x88, 0x00, 0x53, 0x80, 0x00, 0x00, 0x00, + 0x48, 0x03, 0x10, 0x53, 0x4a, 0x03, 0x90, 0x0d, 0x00, 0x00, 0x00, 0x40, + 0x42, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf0, 0x5a, + 0x42, 0x00, 0x78, 0x00, 0x00, 0x10, 0xb5, 0xb1, 0x42, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x05, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x59, 0xd8, 0x4a, 0x03, 0x70, 0xe4, + 0x02, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x41, 0x30, 0x08, 0x00, + 0x80, 0x04, 0x09, 0xc0, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xe4, 0x49, 0x33, 0xc8, 0x57, + 0x81, 0x32, 0x61, 0xc0, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x04, 0x01, 0xf8, 0x35, 0x40, 0x00, 0x28, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa1, 0xb4, 0x04, 0x01, 0xf8, 0xae, 0x04, 0x00, 0x00, 0x07, + 0x59, 0x32, 0x68, 0x09, 0x59, 0x34, 0x02, 0x00, 0x8c, 0x00, 0x05, 0x0e, + 0x59, 0x30, 0x04, 0x14, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x8a, 0xfb, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x81, 0x32, 0x61, 0xc0, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x04, 0x01, 0xf8, 0xa1, + 0x04, 0x00, 0x00, 0x0b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x3d, + 0x04, 0x00, 0x00, 0x08, 0x59, 0x32, 0x58, 0x08, 0x59, 0x2c, 0x02, 0x08, + 0x84, 0x00, 0x05, 0x4e, 0x48, 0x02, 0x5a, 0x08, 0x41, 0x7a, 0x78, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x83, 0xe0, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x5f, 0xc8, 0x57, 0x5c, 0x00, 0x00, 0x00, 0x4d, 0x78, 0x00, 0x00, + 0x42, 0x03, 0xe0, 0x00, 0x50, 0x00, 0x00, 0x00, 0x42, 0x00, 0xb8, 0x00, + 0x00, 0x00, 0x80, 0x05, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x04, 0xf4, + 0x49, 0x33, 0xc8, 0x57, 0x83, 0x30, 0x04, 0x80, 0x00, 0x00, 0x00, 0x20, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x83, 0x30, 0x0c, 0x00, + 0x00, 0x10, 0xb0, 0x9b, 0x50, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x10, 0x02, 0x44, 0x00, 0x08, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x04, 0x01, 0xf7, 0xf4, 0x48, 0x07, 0xc8, 0x56, + 0x59, 0xb8, 0x00, 0xea, 0x8c, 0x00, 0x05, 0x10, 0x04, 0x00, 0x07, 0xfd, + 0x59, 0xb8, 0x00, 0xe0, 0x48, 0x03, 0xc8, 0x57, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x42, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x41, 0x30, 0x08, 0x00, 0x04, 0x01, 0xf0, 0x2d, 0x82, 0x00, 0x05, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0x82, 0x04, 0x0d, 0x00, 0x0f, 0xff, 0xff, 0xff, + 0x80, 0x04, 0x0d, 0x40, 0x48, 0x07, 0xc8, 0x57, 0x59, 0xb8, 0x00, 0xea, + 0x8c, 0x00, 0x05, 0x16, 0x04, 0x02, 0x00, 0x03, 0x48, 0x07, 0x70, 0xe1, + 0x1c, 0x01, 0xf0, 0x00, 0x8c, 0x00, 0x05, 0x10, 0x04, 0x00, 0x07, 0xfa, + 0x4c, 0x04, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x09, 0x5c, 0x00, 0x08, 0x00, + 0x82, 0x10, 0x04, 0x80, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x17, 0xf4, + 0x4c, 0x04, 0x00, 0x00, 0x04, 0x01, 0xfe, 0xbf, 0x5c, 0x00, 0x08, 0x00, + 0x04, 0x01, 0xf7, 0xf0, 0x59, 0xb8, 0x00, 0xe2, 0x59, 0xb8, 0x20, 0xe2, + 0x80, 0x10, 0x05, 0x80, 0x04, 0x02, 0x07, 0xfd, 0x80, 0x10, 0x21, 0x14, + 0x04, 0x01, 0xf0, 0x06, 0x59, 0xb8, 0x00, 0xe2, 0x59, 0xb8, 0x20, 0xe2, + 0x80, 0x10, 0x05, 0x80, 0x04, 0x02, 0x07, 0xfd, 0x04, 0x01, 0xf0, 0x01, + 0x40, 0x10, 0x18, 0x00, 0x80, 0x0c, 0x19, 0x0a, 0x82, 0x10, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x1f, 0x82, 0x0c, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x1f, + 0x80, 0x0c, 0x24, 0x80, 0x82, 0x10, 0x25, 0x00, 0x00, 0x00, 0x00, 0x1f, + 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x00, 0x05, 0x00, 0xf0, 0x00, 0x00, 0x00, + 0x82, 0x04, 0x0d, 0x00, 0x0f, 0xff, 0xff, 0xff, 0x80, 0x04, 0x0d, 0x40, + 0x48, 0x07, 0xc8, 0x57, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0xaf, 0xd2, + 0x50, 0x08, 0x00, 0x00, 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x05, + 0x4a, 0x03, 0x70, 0xe5, 0x00, 0x00, 0x00, 0x03, 0x4a, 0x03, 0x70, 0xe4, + 0x00, 0x00, 0x03, 0x00, 0x80, 0x00, 0x00, 0x00, 0x44, 0x00, 0x10, 0x00, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x59, 0xb8, 0x00, 0xea, + 0x8c, 0x00, 0x05, 0x10, 0x04, 0x00, 0x00, 0x0c, 0x04, 0x01, 0xff, 0xd5, + 0x82, 0x10, 0x04, 0x80, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x07, + 0x4c, 0x04, 0x00, 0x00, 0x4c, 0x08, 0x00, 0x00, 0x04, 0x01, 0xfe, 0x8b, + 0x5c, 0x00, 0x10, 0x00, 0x5c, 0x00, 0x08, 0x00, 0x04, 0x01, 0xf0, 0x20, + 0x59, 0xb8, 0x00, 0xea, 0x8c, 0x00, 0x05, 0x16, 0x04, 0x02, 0x00, 0x1d, + 0x4a, 0x03, 0x70, 0xe4, 0x00, 0x30, 0x00, 0x00, 0x48, 0x07, 0x70, 0xe1, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0x00, 0x80, 0x08, 0x10, 0x40, + 0x04, 0x00, 0x00, 0x12, 0x59, 0xb8, 0x08, 0xe4, 0x8c, 0x04, 0x0d, 0x28, + 0x04, 0x02, 0x07, 0xfc, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0xaf, 0xd2, + 0x50, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x00, 0x05, + 0x4a, 0x03, 0x70, 0xe5, 0x00, 0x00, 0x00, 0x02, 0x4a, 0x03, 0x70, 0xe4, + 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x44, 0x00, 0x10, 0x00, 0x8c, 0x04, 0x0d, 0x2c, 0x1c, 0x01, 0xf0, 0x00, + 0x41, 0xf8, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x80, 0x08, 0x10, 0x40, 0x04, 0x02, 0x07, 0xd3, + 0x41, 0xf8, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x4d, 0x38, 0x00, 0x00, 0x59, 0x30, 0x0c, 0x06, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x09, 0x04, 0x02, 0x00, 0x06, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x47, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0xdf, 0x80, 0x00, 0x05, 0x80, 0x5c, 0x02, 0x70, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x50, 0x00, 0x00, 0x4a, 0x03, 0x90, 0x0d, + 0x00, 0x00, 0x00, 0x01, 0x59, 0xc8, 0xa0, 0x20, 0x4a, 0x03, 0x90, 0x0d, + 0x00, 0x00, 0x00, 0x02, 0x59, 0xc8, 0x08, 0x20, 0x8c, 0x50, 0xa5, 0x2e, + 0x04, 0x00, 0x00, 0x02, 0x90, 0x04, 0x09, 0xc0, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x59, 0xaa, + 0x5c, 0x00, 0xa0, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x04, 0x01, 0xff, 0xf0, + 0x04, 0x00, 0x00, 0x45, 0x49, 0x33, 0xc8, 0x57, 0x59, 0x30, 0x04, 0x06, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x40, + 0x59, 0xc8, 0x20, 0x21, 0x4a, 0x03, 0x90, 0x0d, 0x00, 0x00, 0x00, 0x01, + 0x59, 0xc8, 0x28, 0x21, 0x82, 0x14, 0x2d, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x59, 0x32, 0x58, 0x08, 0x81, 0x2e, 0x59, 0xc0, 0x04, 0x00, 0x00, 0x37, + 0x59, 0x32, 0x68, 0x09, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x45, 0xf8, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x8a, 0xe3, 0x59, 0x9c, 0x00, 0x19, + 0x8c, 0x00, 0x05, 0x0c, 0x04, 0x02, 0x00, 0x18, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x45, 0xf8, 0x04, 0x02, 0x00, 0x15, 0x59, 0x30, 0x08, 0x11, + 0x48, 0x07, 0xc8, 0x57, 0x59, 0x2c, 0x04, 0x08, 0x8c, 0x00, 0x05, 0x1c, + 0x04, 0x02, 0x00, 0x0e, 0x84, 0x00, 0x05, 0x5c, 0x48, 0x02, 0x5c, 0x08, + 0x59, 0x2c, 0x0a, 0x04, 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x48, 0x04, 0x00, 0x00, 0x04, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x18, 0x04, 0x02, 0x00, 0x03, + 0x59, 0x30, 0x08, 0x11, 0x48, 0x06, 0x58, 0x03, 0x4a, 0x02, 0x60, 0x11, + 0x7f, 0xff, 0xff, 0xff, 0x48, 0x16, 0x60, 0x13, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x0f, 0xf8, 0x04, 0x02, 0x00, 0x14, 0x04, 0x01, 0xfa, 0x07, + 0x40, 0x28, 0x00, 0x00, 0x48, 0x02, 0x60, 0x0d, 0x04, 0x00, 0x00, 0x05, + 0x48, 0x32, 0x60, 0x0b, 0x50, 0x20, 0x00, 0x00, 0x48, 0x02, 0x60, 0x0a, + 0x48, 0x22, 0x60, 0x0c, 0x59, 0x30, 0x04, 0x14, 0x8c, 0x00, 0x05, 0x1c, + 0x04, 0x02, 0x00, 0x04, 0x59, 0x9c, 0x00, 0x19, 0x8c, 0x00, 0x05, 0x0c, + 0x04, 0x02, 0x08, 0x6e, 0x4a, 0x03, 0x90, 0x0d, 0x00, 0x00, 0x00, 0x40, + 0x4a, 0x03, 0x70, 0xe5, 0x00, 0x00, 0x00, 0x08, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x88, 0x00, 0x53, 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x10, 0x53, + 0x4a, 0x03, 0x90, 0x0d, 0x00, 0x00, 0x00, 0x40, 0x42, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf7, 0x26, 0x4c, 0xf8, 0x00, 0x00, + 0x58, 0xf4, 0x00, 0x00, 0x80, 0x01, 0xf5, 0x40, 0x04, 0x01, 0xf8, 0x20, + 0x41, 0x78, 0x18, 0x00, 0x04, 0x01, 0xf8, 0xe7, 0x04, 0x02, 0x00, 0x14, + 0x44, 0x14, 0x08, 0x00, 0x04, 0x01, 0xf8, 0x2a, 0x04, 0x00, 0x00, 0x11, + 0x40, 0x04, 0x38, 0x00, 0x42, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x40, 0x14, 0x20, 0x00, 0x04, 0x01, 0xf8, 0xde, 0x04, 0x02, 0x00, 0x0b, + 0x80, 0x1c, 0x38, 0x00, 0x50, 0x1c, 0x00, 0x00, 0x44, 0x00, 0x08, 0x00, + 0x04, 0x01, 0xf8, 0x10, 0x80, 0x1c, 0x05, 0x80, 0x04, 0x00, 0x00, 0x04, + 0x44, 0x10, 0x38, 0x00, 0x80, 0x1c, 0x38, 0x40, 0x44, 0x14, 0x38, 0x00, + 0x04, 0x01, 0xf8, 0x19, 0x5c, 0x01, 0xf0, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x80, 0xf9, 0xf1, 0xc0, 0x04, 0x02, 0x00, 0x03, 0x58, 0xf4, 0x12, 0x02, + 0x04, 0x01, 0xf0, 0x03, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x1c, 0x01, 0xf0, 0x00, 0x80, 0xf9, 0xf1, 0xc0, 0x04, 0x02, 0x00, 0x06, + 0x58, 0xf4, 0x04, 0x01, 0x82, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x80, 0xf4, 0x04, 0x00, 0x04, 0x01, 0xf0, 0x05, 0x58, 0xf8, 0x04, 0x01, + 0x82, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x02, 0x80, 0xf8, 0x04, 0x00, + 0x50, 0x00, 0x28, 0x00, 0x80, 0x00, 0x00, 0x00, 0x50, 0x00, 0x20, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x80, 0xf9, 0xf1, 0xc0, 0x04, 0x02, 0x00, 0x08, + 0x58, 0xf4, 0x04, 0x01, 0x82, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x48, 0x01, 0xec, 0x01, + 0x04, 0x01, 0xf0, 0x0b, 0x58, 0xf8, 0x04, 0x01, 0x82, 0x00, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x48, 0x01, 0xf4, 0x01, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x02, 0x00, 0x02, 0x04, 0x01, 0xf8, 0x09, 0x58, 0xf4, 0x02, 0x02, + 0x80, 0x00, 0x00, 0x40, 0x48, 0x01, 0xea, 0x02, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0x2c, 0x00, 0x00, 0x40, 0xfa, 0x58, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x2e, 0x49, 0x79, 0xe8, 0x00, + 0x41, 0x79, 0xf0, 0x00, 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x80, 0xf5, 0xe9, 0xc0, 0x04, 0x00, 0x00, 0x09, 0x80, 0xf9, 0xf1, 0xc0, + 0x04, 0x02, 0x0f, 0xf5, 0x4d, 0x2c, 0x00, 0x00, 0x40, 0xf6, 0x58, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x2e, 0x41, 0x79, 0xe8, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0xf4, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x45, 0xf8, 0x04, 0x02, 0x00, 0x36, + 0x59, 0x30, 0x08, 0x07, 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0x31, 0x00, + 0x04, 0x02, 0x00, 0x32, 0x8c, 0x04, 0x0d, 0x22, 0x04, 0x00, 0x00, 0x32, + 0x59, 0x30, 0x00, 0x1f, 0x80, 0x01, 0xed, 0x40, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x82, 0x00, 0x05, 0x80, 0xff, 0xff, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x29, 0x58, 0xf4, 0x02, 0x01, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0xdc, 0xb3, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x58, 0xf4, 0x0a, 0x02, 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0xff, 0xfe, + 0x04, 0x00, 0x00, 0x03, 0x04, 0x01, 0xff, 0x86, 0x58, 0xf4, 0x0a, 0x02, + 0x82, 0x04, 0x04, 0x80, 0x00, 0x00, 0x00, 0x0f, 0x04, 0x02, 0x10, 0x59, + 0x80, 0x04, 0x08, 0x00, 0x48, 0x05, 0xea, 0x02, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x5d, 0x82, 0x04, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x0a, 0x58, 0xf4, 0x00, 0x00, + 0x80, 0x01, 0xed, 0x40, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x58, 0xf4, 0x02, 0x01, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0xdd, 0xb9, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x58, 0xf4, 0x04, 0x01, + 0x82, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x48, 0x05, 0xec, 0x01, + 0x80, 0xf4, 0x04, 0x00, 0x59, 0x30, 0x08, 0x12, 0x44, 0x04, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x45, 0x78, 0x00, 0x00, 0x5c, 0x01, 0xe8, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x59, 0xb8, 0x00, 0xe4, 0x8c, 0x00, 0x05, 0x24, 0x04, 0x02, 0x00, 0x23, + 0x4a, 0x03, 0x70, 0xe4, 0x00, 0x03, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x59, 0xb8, 0x00, 0xe4, 0x8c, 0x00, 0x05, 0x24, 0x04, 0x02, 0x00, 0x1b, + 0x59, 0x30, 0x08, 0x07, 0x84, 0x04, 0x0d, 0x62, 0x48, 0x06, 0x60, 0x07, + 0x4a, 0x03, 0x70, 0xe4, 0x00, 0x02, 0x00, 0x00, 0x4d, 0x2c, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x04, 0x04, 0x00, 0x00, 0x25, + 0x49, 0x2e, 0x60, 0x1f, 0x4a, 0x02, 0x5a, 0x01, 0x00, 0x00, 0xdc, 0xb3, + 0x59, 0x30, 0x00, 0x08, 0x80, 0x00, 0x1d, 0x40, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x58, 0x0c, 0x08, 0x0f, 0x48, 0x06, 0x58, 0x03, + 0x59, 0x30, 0x18, 0x11, 0x40, 0x04, 0x00, 0x00, 0x80, 0x0c, 0x05, 0x80, + 0x04, 0x02, 0x00, 0x0d, 0x49, 0x7a, 0x5a, 0x02, 0x4a, 0x02, 0x5c, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x01, 0xf0, 0x11, 0x4a, 0x03, 0x70, 0xe4, + 0x00, 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x80, 0x08, 0x10, 0x40, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x04, 0x01, 0xf7, 0xd6, 0x4a, 0x02, 0x5a, 0x02, 0x00, 0x00, 0x00, 0x01, + 0x4a, 0x02, 0x5c, 0x01, 0x00, 0x00, 0x00, 0x06, 0x49, 0x7a, 0x58, 0x04, + 0x40, 0x0c, 0x00, 0x00, 0x80, 0x04, 0x04, 0x80, 0x48, 0x02, 0x58, 0x05, + 0x41, 0x2d, 0xe8, 0x00, 0x5c, 0x02, 0x58, 0x00, 0x04, 0x01, 0xf7, 0xa9, + 0x5c, 0x02, 0x58, 0x00, 0x4a, 0x02, 0x60, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0x04, 0x01, 0xf7, 0xc3, 0x4d, 0x2c, 0x00, 0x00, 0x58, 0xf6, 0x58, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x2e, 0x40, 0xf6, 0x58, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x2e, 0x5c, 0x02, 0x58, 0x00, + 0x04, 0x01, 0xf7, 0xf5, 0x4d, 0x2c, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x07, 0x04, 0x04, 0x00, 0x07, 0xf8, 0x4a, 0x02, 0x5a, 0x01, + 0x00, 0x00, 0xdd, 0xb9, 0x4a, 0x02, 0x5c, 0x01, 0x00, 0x00, 0x00, 0x02, + 0x49, 0x2d, 0xe8, 0x00, 0x41, 0x2d, 0xe8, 0x00, 0x5c, 0x02, 0x58, 0x00, + 0x04, 0x01, 0xf7, 0xa5, 0x04, 0x01, 0xff, 0x30, 0x82, 0xf4, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x80, 0x0c, 0x04, 0x00, 0x40, 0x00, 0x08, 0x00, + 0x50, 0x04, 0x00, 0x00, 0x80, 0x10, 0x05, 0x80, 0x04, 0x00, 0x00, 0x16, + 0x82, 0x04, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x08, 0x10, 0x40, + 0x04, 0x02, 0x07, 0xfa, 0x80, 0xf9, 0xf1, 0xc0, 0x04, 0x00, 0x00, 0x11, + 0x58, 0xf4, 0x12, 0x02, 0x82, 0x08, 0x14, 0x80, 0x00, 0x00, 0x00, 0x07, + 0x82, 0xf8, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x0c, 0x04, 0x00, + 0x40, 0x00, 0x08, 0x00, 0x50, 0x04, 0x00, 0x00, 0x80, 0x10, 0x05, 0x80, + 0x04, 0x00, 0x00, 0x06, 0x82, 0x04, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x80, 0x08, 0x10, 0x40, 0x04, 0x02, 0x07, 0xfa, 0x04, 0x01, 0xf0, 0x02, + 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf7, 0xfd, 0x4c, 0xf4, 0x00, 0x00, 0x4c, 0xf8, 0x00, 0x00, + 0x40, 0x01, 0xe8, 0x00, 0x59, 0x2c, 0x0a, 0x06, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x02, 0x00, 0x21, 0x82, 0xf4, 0x05, 0x80, 0xff, 0xff, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x1b, 0x58, 0xf4, 0x02, 0x01, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0xdc, 0xb3, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x58, 0xf4, 0x00, 0x00, 0x80, 0x01, 0xf5, 0x40, 0x04, 0x00, 0x00, 0x06, + 0x58, 0xf8, 0x02, 0x01, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0xdd, 0xb9, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x41, 0x78, 0x38, 0x00, + 0x58, 0xf4, 0x40, 0x03, 0x04, 0x01, 0xf8, 0x3d, 0x04, 0x02, 0x00, 0x09, + 0x04, 0x01, 0xff, 0x2e, 0x49, 0x7a, 0x60, 0x1f, 0x59, 0x30, 0x08, 0x07, + 0x84, 0x04, 0x0d, 0x22, 0x48, 0x06, 0x60, 0x07, 0x5c, 0x01, 0xf0, 0x00, + 0x5c, 0x01, 0xe8, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x04, 0x01, 0xff, 0x26, + 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x11, 0x04, 0x01, 0xf7, 0xf6, + 0x82, 0xf4, 0x05, 0x80, 0xff, 0xff, 0xff, 0xff, 0x04, 0x02, 0x0f, 0x20, + 0x04, 0x01, 0xf7, 0xf2, 0x4c, 0xf4, 0x00, 0x00, 0x4c, 0xf8, 0x00, 0x00, + 0x40, 0x01, 0xe8, 0x00, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x02, 0x00, 0x20, 0x82, 0xf4, 0x05, 0x80, 0xff, 0xff, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x1a, 0x58, 0xf4, 0x02, 0x01, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0xdc, 0xb3, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x58, 0xf4, 0x00, 0x00, 0x80, 0x01, 0xf5, 0x40, 0x04, 0x00, 0x00, 0x06, + 0x58, 0xf8, 0x02, 0x01, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0xdd, 0xb9, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x41, 0x78, 0x38, 0x00, + 0x58, 0xf4, 0x40, 0x03, 0x04, 0x01, 0xf8, 0x13, 0x04, 0x02, 0x00, 0x08, + 0x04, 0x01, 0xff, 0x04, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x49, 0x7a, 0x60, 0x1f, 0x5c, 0x01, 0xf0, 0x00, 0x5c, 0x01, 0xe8, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x04, 0x01, 0xfe, 0xfd, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x11, 0x04, 0x01, 0xf7, 0xf9, 0x4c, 0x04, 0x00, 0x00, + 0x82, 0xf4, 0x05, 0x80, 0xff, 0xff, 0xff, 0xff, 0x04, 0x02, 0x0e, 0xf6, + 0x5c, 0x00, 0x08, 0x00, 0x04, 0x01, 0xf7, 0xf3, 0x48, 0x03, 0xc8, 0x56, + 0x40, 0x1c, 0x20, 0x00, 0x41, 0x78, 0x18, 0x00, 0x4c, 0x20, 0x00, 0x00, + 0x04, 0x01, 0xff, 0x86, 0x5c, 0x00, 0x40, 0x00, 0x04, 0x02, 0x00, 0x2c, + 0x40, 0x20, 0x20, 0x00, 0x42, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xff, 0x80, 0x04, 0x02, 0x00, 0x27, 0x04, 0x01, 0xfe, 0xae, + 0x40, 0x08, 0x28, 0x00, 0x82, 0xf4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x40, 0x00, 0x30, 0x00, 0x50, 0x18, 0x20, 0x00, 0x40, 0x10, 0x00, 0x00, + 0x80, 0x1c, 0x05, 0x80, 0x04, 0x00, 0x00, 0x05, 0x42, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xff, 0x73, 0x04, 0x02, 0x00, 0x1a, + 0x82, 0x18, 0x34, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x14, 0x28, 0x40, + 0x04, 0x02, 0x07, 0xf5, 0x80, 0xf9, 0xf1, 0xc0, 0x04, 0x00, 0x00, 0x13, + 0x58, 0xf4, 0x2a, 0x02, 0x82, 0x14, 0x2c, 0x80, 0x00, 0x00, 0x00, 0x07, + 0x82, 0xf8, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0x40, 0x00, 0x30, 0x00, + 0x50, 0x18, 0x20, 0x00, 0x40, 0x10, 0x00, 0x00, 0x80, 0x1c, 0x05, 0x80, + 0x04, 0x00, 0x00, 0x05, 0x42, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xff, 0x5f, 0x04, 0x02, 0x00, 0x06, 0x82, 0x18, 0x34, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x80, 0x14, 0x28, 0x40, 0x04, 0x02, 0x07, 0xf5, + 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf7, 0xfd, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x58, 0x38, 0x02, 0x07, 0x8c, 0x00, 0x05, 0x02, 0x04, 0x00, 0x07, 0xfc, + 0x50, 0x20, 0x00, 0x00, 0x80, 0x38, 0x7c, 0x00, 0x58, 0x3c, 0x28, 0x00, + 0x58, 0x3c, 0x20, 0x01, 0x58, 0x38, 0x04, 0x04, 0x80, 0x00, 0x15, 0x40, + 0x04, 0x02, 0x00, 0x02, 0x58, 0x38, 0x14, 0x07, 0x58, 0xc8, 0x34, 0x01, + 0x58, 0x38, 0x0c, 0x08, 0x59, 0x30, 0x38, 0x07, 0x49, 0x7a, 0x60, 0x12, + 0x49, 0x7a, 0x60, 0x13, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x00, 0xb3, + 0x59, 0x2c, 0x04, 0x08, 0x8c, 0x00, 0x05, 0x02, 0x04, 0x00, 0x07, 0xea, + 0x59, 0x2c, 0x04, 0x09, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x07, 0xe7, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x10, 0x11, + 0x58, 0x38, 0x00, 0x01, 0x80, 0x00, 0x75, 0x40, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x58, 0x38, 0x02, 0x04, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x82, 0x00, 0x04, 0x00, 0x00, 0x10, 0x0f, 0xd8, + 0x50, 0x00, 0x40, 0x00, 0x40, 0x04, 0x00, 0x00, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x00, 0x00, 0x05, 0x82, 0x04, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x02, 0x17, 0xf1, 0x80, 0x20, 0x44, 0x00, 0x50, 0x20, 0x00, 0x00, + 0x80, 0x38, 0x7c, 0x00, 0x58, 0x3c, 0x28, 0x00, 0x58, 0x3c, 0x20, 0x01, + 0x58, 0x3c, 0x10, 0x02, 0x59, 0x2c, 0x0a, 0x07, 0x59, 0x2c, 0x4c, 0x08, + 0x59, 0x2c, 0x30, 0x0d, 0x59, 0x30, 0x38, 0x07, 0x49, 0x7a, 0x60, 0x12, + 0x49, 0x7a, 0x60, 0x13, 0x48, 0x16, 0x60, 0x0e, 0x48, 0x12, 0x60, 0x0f, + 0x48, 0x0a, 0x60, 0x10, 0x48, 0x1a, 0x60, 0x11, 0x80, 0x04, 0x08, 0x40, + 0x48, 0x06, 0x60, 0x0d, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xbb, + 0x80, 0x20, 0x40, 0x00, 0x50, 0x20, 0x18, 0x00, 0x80, 0x0c, 0x19, 0xc0, + 0x04, 0x02, 0x00, 0x0c, 0x58, 0x38, 0x00, 0x01, 0x80, 0x00, 0x75, 0x40, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x58, 0x38, 0x02, 0x04, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x82, 0x00, 0x04, 0x00, + 0x00, 0x10, 0x0f, 0xd8, 0x50, 0x00, 0x40, 0x00, 0x50, 0x20, 0x18, 0x00, + 0x48, 0x3a, 0x60, 0x0b, 0x48, 0x0e, 0x60, 0x0a, 0x48, 0x22, 0x60, 0x0c, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x00, 0xbb, 0x48, 0x03, 0xc8, 0x56, + 0x59, 0x2c, 0x02, 0x08, 0x8c, 0x00, 0x05, 0x1e, 0x04, 0x02, 0x00, 0x17, + 0x50, 0x20, 0x00, 0x00, 0x80, 0x30, 0x6c, 0x00, 0x40, 0x24, 0x00, 0x00, + 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x0d, 0x88, 0x00, 0x10, 0x0d, 0x88, + 0x00, 0x10, 0x0d, 0x91, 0x00, 0x10, 0x0d, 0x88, 0x00, 0x10, 0x0d, 0x88, + 0x00, 0x10, 0x0d, 0x88, 0x00, 0x10, 0x0d, 0x88, 0x00, 0x10, 0x0d, 0x88, + 0x00, 0x10, 0x0d, 0x91, 0x00, 0x10, 0x0d, 0x88, 0x00, 0x10, 0x0d, 0x91, + 0x00, 0x10, 0x0d, 0x88, 0x00, 0x10, 0x0d, 0x88, 0x00, 0x10, 0x0d, 0x91, + 0x00, 0x10, 0x0d, 0x88, 0x00, 0x10, 0x0d, 0x88, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x84, 0x00, 0x05, 0x1e, 0x48, 0x02, 0x5a, 0x08, + 0x50, 0x20, 0x00, 0x00, 0x80, 0x30, 0x6c, 0x00, 0x58, 0x34, 0x38, 0x01, + 0x48, 0x1e, 0x60, 0x0f, 0x04, 0x01, 0xf0, 0x07, 0x58, 0x34, 0x18, 0x02, + 0x58, 0x34, 0x28, 0x00, 0x58, 0x34, 0x38, 0x01, 0x48, 0x0e, 0x60, 0x10, + 0x48, 0x16, 0x60, 0x0e, 0x48, 0x1e, 0x60, 0x0f, 0x04, 0x01, 0xf2, 0x1f, + 0x49, 0x33, 0xc8, 0x57, 0x59, 0x31, 0xf8, 0x08, 0x59, 0x30, 0x0a, 0x06, + 0x80, 0x04, 0x09, 0xc0, 0x04, 0x00, 0x00, 0x05, 0x80, 0x04, 0x09, 0x06, + 0x04, 0x02, 0x00, 0x02, 0x80, 0x04, 0x08, 0x00, 0x48, 0x05, 0xfc, 0x06, + 0x4a, 0x02, 0x62, 0x06, 0x00, 0x00, 0x00, 0x02, 0x59, 0x2c, 0x04, 0x09, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x0b, + 0x04, 0x01, 0xf8, 0x36, 0x59, 0x30, 0x02, 0x03, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x02, 0x00, 0x05, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x48, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0xfc, 0x00, 0x00, 0x58, 0xfc, 0x02, 0x04, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x48, 0x04, 0x02, 0x00, 0x0c, 0x58, 0xfc, 0x00, 0x0b, + 0x80, 0x00, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x09, 0x58, 0xfc, 0x04, 0x07, + 0x80, 0x00, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x06, 0x58, 0xfc, 0x08, 0x0b, + 0x8c, 0x04, 0x0d, 0x16, 0x04, 0x00, 0x00, 0x17, 0x58, 0xfc, 0x00, 0x07, + 0x04, 0x01, 0xf0, 0x0a, 0x58, 0xfc, 0x04, 0x08, 0x8c, 0x00, 0x05, 0x12, + 0x04, 0x02, 0x00, 0x14, 0x58, 0xfc, 0x0c, 0x09, 0x8c, 0x04, 0x0d, 0x16, + 0x04, 0x02, 0x00, 0x03, 0x5c, 0x01, 0xf8, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x58, 0xfc, 0x00, 0x0a, 0x59, 0x30, 0x08, 0x11, 0x80, 0x04, 0x05, 0x80, + 0x04, 0x02, 0x00, 0x09, 0x59, 0x30, 0x00, 0x07, 0x84, 0x00, 0x05, 0x00, + 0x48, 0x02, 0x60, 0x07, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x5c, 0x01, 0xf8, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xdf, + 0x5c, 0x01, 0xf8, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x58, 0xfd, 0xf8, 0x09, + 0x04, 0x01, 0xf7, 0xec, 0x04, 0x01, 0xf8, 0x02, 0x1c, 0x01, 0xf0, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x48, 0x03, 0xc8, 0x57, + 0x49, 0x33, 0xc8, 0x57, 0x59, 0xb8, 0x08, 0xea, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x1e, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x00, 0x1b, 0x59, 0x30, 0x04, 0x06, 0x4c, 0x00, 0x00, 0x00, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x41, 0x42, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x41, 0x30, 0x08, 0x00, 0x4c, 0x18, 0x00, 0x00, 0x04, 0x01, 0xfc, 0xe1, + 0x5c, 0x00, 0x30, 0x00, 0x04, 0x00, 0x00, 0x0b, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1e, 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x07, 0xff, + 0x80, 0x18, 0x30, 0x40, 0x04, 0x02, 0x07, 0xf4, 0x42, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x41, 0x30, 0x08, 0x00, 0x04, 0x01, 0xfc, 0xd5, + 0x5c, 0x00, 0x00, 0x00, 0x48, 0x02, 0x64, 0x06, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x30, 0x00, 0x07, 0x84, 0x00, 0x05, 0x00, 0x48, 0x02, 0x60, 0x07, + 0x04, 0x01, 0xf7, 0xfc, 0x59, 0xc0, 0x00, 0x07, 0x4a, 0x03, 0x80, 0x06, + 0x30, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x59, 0xc0, 0x00, 0x07, + 0x8c, 0x00, 0x05, 0x0a, 0x04, 0x02, 0x07, 0xfe, 0x1c, 0x01, 0xf0, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x48, 0x03, 0xc8, 0x57, + 0x4d, 0xc0, 0x00, 0x00, 0x4a, 0x03, 0x70, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x42, 0x03, 0x80, 0x00, 0x00, 0x00, 0x77, 0x20, 0x04, 0x01, 0xff, 0xf0, + 0x42, 0x03, 0x80, 0x00, 0x00, 0x00, 0x77, 0x00, 0x04, 0x01, 0xff, 0xed, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x02, 0x00, 0x13, + 0x4a, 0x03, 0x88, 0x91, 0x00, 0x00, 0xff, 0xff, 0x49, 0x7b, 0x88, 0x80, + 0x49, 0x7b, 0x88, 0x92, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x90, + 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x08, 0x10, 0x40, + 0x04, 0x02, 0x07, 0xfd, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x75, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x04, 0x01, 0xf8, 0x0e, + 0x5c, 0x03, 0x80, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x4d, 0xe0, + 0x04, 0x01, 0xf8, 0x2d, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x76, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x04, 0x01, 0xf8, 0x05, + 0x48, 0x17, 0x88, 0x92, 0x48, 0x0b, 0x88, 0x80, 0x5c, 0x03, 0x80, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x6f, 0xc8, 0x57, 0x83, 0x6c, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x00, 0x0b, 0x4c, 0x08, 0x00, 0x00, + 0x4c, 0x0c, 0x00, 0x00, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x48, + 0x42, 0x00, 0x18, 0x00, 0x00, 0x00, 0xff, 0xff, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x36, 0xf4, 0x5c, 0x00, 0x18, 0x00, 0x5c, 0x00, 0x10, 0x00, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x12, 0x65, 0x59, 0xa8, 0x00, 0x69, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x00, 0x00, 0x06, 0x59, 0xa8, 0x10, 0x6a, 0x80, 0x08, 0x11, 0xc0, + 0x04, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x19, 0xf7, + 0x4a, 0x03, 0x88, 0x91, 0x00, 0x00, 0xff, 0xff, 0x4a, 0x03, 0x90, 0x0d, + 0x00, 0x00, 0x00, 0x40, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x08, 0xd1, + 0x4a, 0x03, 0x70, 0xe8, 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x48, 0x03, 0xc8, 0x57, + 0x59, 0xc4, 0x10, 0x80, 0x49, 0x7b, 0x88, 0x80, 0x59, 0xc4, 0x28, 0x92, + 0x49, 0x7b, 0x88, 0x92, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, + 0x04, 0x02, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x02, 0x60, 0x59, 0xc4, 0x18, 0xa4, 0x82, 0x0c, 0x1d, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x82, 0x0c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x10, 0x59, 0xc4, 0x18, 0x05, 0x82, 0x0c, 0x1d, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x02, 0x00, 0x0e, 0x59, 0xc4, 0x18, 0xa4, + 0x82, 0x0c, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x82, 0x0c, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x07, 0x04, 0x00, 0x10, 0x04, 0x82, 0x0c, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x0c, 0x04, 0x00, 0x10, 0x03, 0x80, 0x10, 0x20, 0x40, + 0x04, 0x02, 0x07, 0xec, 0x49, 0x7b, 0x88, 0x91, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x10, 0x00, 0x00, 0x42, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x19, + 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x18, 0x92, 0x50, 0x00, 0x18, 0x00, 0x82, 0x0c, 0x1d, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x05, 0x80, 0x10, 0x20, 0x40, + 0x04, 0x02, 0x07, 0xf7, 0x5c, 0x00, 0x20, 0x00, 0x04, 0x01, 0xf7, 0xf0, + 0x5c, 0x00, 0x20, 0x00, 0x04, 0x01, 0xf7, 0xec, 0x48, 0x03, 0xc8, 0x56, + 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0x2c, 0x00, 0x00, 0x59, 0x32, 0x58, 0x08, + 0x59, 0x2c, 0x0a, 0x04, 0x48, 0x07, 0xc8, 0x57, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x0e, 0xae, 0x00, 0x10, 0x0e, 0xae, + 0x00, 0x10, 0x0e, 0xae, 0x00, 0x10, 0x0e, 0xc6, 0x00, 0x10, 0x0e, 0xae, + 0x00, 0x10, 0x0e, 0xae, 0x00, 0x10, 0x0e, 0xae, 0x00, 0x10, 0x0e, 0xae, + 0x00, 0x10, 0x0e, 0xae, 0x00, 0x10, 0x0e, 0xc6, 0x00, 0x10, 0x0e, 0xae, + 0x00, 0x10, 0x0e, 0xb0, 0x00, 0x10, 0x0e, 0xae, 0x00, 0x10, 0x0e, 0xae, + 0x00, 0x10, 0x0e, 0xae, 0x00, 0x10, 0x0e, 0xae, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x3b, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0x2c, 0x02, 0x0a, + 0x8c, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x5f, 0x59, 0x2c, 0x1a, 0x07, + 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x82, 0x00, 0x04, 0x00, + 0x00, 0x10, 0x0f, 0xd8, 0x50, 0x00, 0x10, 0x00, 0x50, 0x08, 0x00, 0x00, + 0x59, 0x30, 0x20, 0x13, 0x48, 0x02, 0x60, 0x0a, 0x49, 0x2e, 0x60, 0x0b, + 0x48, 0x0a, 0x60, 0x0c, 0x48, 0x0e, 0x60, 0x0d, 0x48, 0x12, 0x60, 0x12, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x04, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x82, 0x00, 0x04, 0x00, 0x00, 0x10, 0x0f, 0xd8, + 0x50, 0x00, 0x10, 0x00, 0x50, 0x08, 0x00, 0x00, 0x59, 0x2c, 0x1a, 0x07, + 0x48, 0x02, 0x60, 0x0a, 0x49, 0x2e, 0x60, 0x0b, 0x48, 0x0a, 0x60, 0x0c, + 0x48, 0x0e, 0x60, 0x0d, 0x49, 0x7a, 0x60, 0x12, 0x04, 0x01, 0xf7, 0xf2, + 0x8c, 0x04, 0x0d, 0x00, 0x04, 0x02, 0x00, 0x41, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x3e, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x00, 0xc4, 0x59, 0x30, 0x00, 0x13, 0x59, 0x30, 0x10, 0x12, + 0x80, 0x08, 0x05, 0x80, 0x04, 0x02, 0x00, 0x0c, 0x42, 0x00, 0x78, 0x00, + 0x80, 0x00, 0x00, 0x05, 0x59, 0x2c, 0x12, 0x08, 0x82, 0x08, 0x05, 0x00, + 0xff, 0xff, 0x7f, 0xff, 0x48, 0x02, 0x5a, 0x08, 0x8c, 0x08, 0x15, 0x1e, + 0x04, 0x02, 0x00, 0x2d, 0x82, 0x3c, 0x7d, 0x40, 0x00, 0x00, 0x00, 0x20, + 0x04, 0x01, 0xf0, 0x2a, 0x48, 0x0b, 0xc8, 0x57, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x1f, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x59, 0x30, 0x04, 0x14, 0x48, 0x03, 0xc8, 0x57, 0x8c, 0x00, 0x05, 0x14, + 0x04, 0x02, 0x00, 0x07, 0x59, 0x9c, 0x18, 0x19, 0x8c, 0x0c, 0x1d, 0x12, + 0x04, 0x02, 0x00, 0x04, 0x82, 0x0c, 0x1d, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf0, 0x1d, 0x59, 0x30, 0x20, 0x13, 0x04, 0x01, 0xf8, 0xff, + 0x04, 0x02, 0x00, 0x1a, 0x42, 0x00, 0x78, 0x00, 0x80, 0x00, 0x00, 0x05, + 0x59, 0x30, 0x50, 0x0d, 0x59, 0x2c, 0x02, 0x08, 0x48, 0x03, 0xc8, 0x57, + 0x8c, 0x00, 0x05, 0x1e, 0x04, 0x02, 0x00, 0x05, 0x82, 0x3c, 0x7d, 0x40, + 0x00, 0x00, 0x00, 0x20, 0x59, 0x30, 0x40, 0x0c, 0x04, 0x01, 0xf0, 0x04, + 0x84, 0x00, 0x05, 0x1e, 0x48, 0x02, 0x5a, 0x08, 0x04, 0x01, 0xf8, 0xae, + 0x50, 0x20, 0x18, 0x00, 0x48, 0x0e, 0x60, 0x0a, 0x48, 0x32, 0x60, 0x0b, + 0x48, 0x22, 0x60, 0x0c, 0x48, 0x2a, 0x60, 0x0d, 0x48, 0x0f, 0xc8, 0x57, + 0x48, 0x33, 0xc8, 0x57, 0x48, 0x23, 0xc8, 0x57, 0x48, 0x2b, 0xc8, 0x57, + 0x80, 0x00, 0x05, 0x80, 0x48, 0x3e, 0x60, 0x04, 0x1c, 0x01, 0xf0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x49, 0x33, 0xc8, 0x57, + 0x4d, 0x2c, 0x00, 0x00, 0x59, 0x90, 0x00, 0x04, 0x81, 0x30, 0x05, 0x80, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x88, 0x3d, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x59, 0x32, 0x58, 0x08, 0x4d, 0x3c, 0x00, 0x00, 0x4d, 0x40, 0x00, 0x00, + 0x59, 0x30, 0x00, 0x04, 0x48, 0x03, 0xc8, 0x57, 0x4c, 0x00, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x66, 0x06, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x63, 0xa4, 0x5c, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x05, 0x16, + 0x04, 0x00, 0x00, 0x10, 0x59, 0x2c, 0x00, 0x0f, 0x48, 0x03, 0xc8, 0x57, + 0x48, 0x02, 0x58, 0x07, 0x41, 0x78, 0x08, 0x00, 0x42, 0x02, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4a, 0x8e, + 0x4a, 0x02, 0x5c, 0x06, 0x00, 0x00, 0xff, 0xff, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x71, 0x9c, + 0x04, 0x01, 0xf0, 0x15, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x02, + 0x59, 0x2c, 0x02, 0x08, 0x84, 0x00, 0x05, 0x4e, 0x48, 0x02, 0x5a, 0x08, + 0x59, 0x30, 0x04, 0x06, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x06, + 0x04, 0x02, 0x00, 0x09, 0x81, 0x18, 0x00, 0xca, 0x81, 0xc8, 0x0c, 0x00, + 0x58, 0x04, 0x09, 0x39, 0x59, 0x2c, 0x00, 0x0d, 0x80, 0x04, 0x04, 0x80, + 0x59, 0x2c, 0x08, 0x0f, 0x80, 0x04, 0x04, 0x80, 0x48, 0x02, 0x58, 0x0b, + 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x83, 0xe0, + 0x5c, 0x02, 0x80, 0x00, 0x5c, 0x02, 0x78, 0x00, 0x5c, 0x02, 0x58, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x4d, 0x2c, 0x00, 0x00, + 0x59, 0x90, 0x00, 0x04, 0x81, 0x30, 0x05, 0x80, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x3d, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0x32, 0x58, 0x08, + 0x59, 0x2c, 0x02, 0x08, 0x84, 0x00, 0x05, 0x40, 0x48, 0x02, 0x5a, 0x08, + 0x04, 0x01, 0xf7, 0xbf, 0x49, 0x1b, 0xc8, 0x57, 0x49, 0xd3, 0xc8, 0x57, + 0x4d, 0xd0, 0x00, 0x00, 0x41, 0x78, 0x08, 0x00, 0x80, 0x07, 0xa0, 0xca, + 0x83, 0xd3, 0xa4, 0x00, 0x00, 0x00, 0x76, 0x00, 0x4a, 0x03, 0xa0, 0x05, + 0x80, 0x00, 0x00, 0x02, 0x02, 0x00, 0x48, 0x00, 0x00, 0x02, 0x06, 0xcf, + 0x59, 0xd0, 0x10, 0x06, 0x82, 0x08, 0x05, 0x00, 0x00, 0x00, 0x60, 0x00, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x60, 0x00, 0x04, 0x00, 0x00, 0x07, + 0x8c, 0x08, 0x15, 0x1e, 0x04, 0x00, 0x07, 0xf7, 0x59, 0xd0, 0x10, 0x06, + 0x82, 0x08, 0x05, 0x00, 0x00, 0x00, 0x60, 0x00, 0x04, 0x02, 0x07, 0xf3, + 0x83, 0xd3, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x20, 0x80, 0x04, 0x08, 0x00, + 0x82, 0x04, 0x04, 0x80, 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x17, 0xeb, + 0x5c, 0x03, 0xa0, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x1b, 0xc8, 0x57, + 0x49, 0xd3, 0xc8, 0x57, 0x4d, 0xd0, 0x00, 0x00, 0x41, 0x78, 0x08, 0x00, + 0x80, 0x07, 0xa0, 0xca, 0x83, 0xd3, 0xa4, 0x00, 0x00, 0x00, 0x76, 0x00, + 0x4a, 0x03, 0xa0, 0x05, 0x80, 0x00, 0x00, 0x01, 0x59, 0xd0, 0x00, 0x06, + 0x83, 0xd3, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x20, 0x80, 0x04, 0x08, 0x00, + 0x82, 0x04, 0x04, 0x80, 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x17, 0xf8, + 0x5c, 0x03, 0xa0, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xd0, 0x00, 0x06, + 0x8c, 0x00, 0x05, 0x3e, 0x04, 0x00, 0x00, 0x1e, 0x59, 0x90, 0x28, 0x04, + 0x48, 0x17, 0xc8, 0x57, 0x80, 0x14, 0x29, 0xc0, 0x04, 0x00, 0x00, 0x13, + 0x59, 0x90, 0x00, 0x0a, 0x59, 0x90, 0x08, 0x0b, 0x59, 0x90, 0x10, 0x0c, + 0x59, 0x90, 0x18, 0x0d, 0x48, 0x00, 0x28, 0x0a, 0x48, 0x04, 0x28, 0x0b, + 0x48, 0x08, 0x28, 0x0c, 0x48, 0x0c, 0x28, 0x0d, 0x59, 0xd0, 0x00, 0x00, + 0x59, 0xd0, 0x08, 0x01, 0x59, 0xd0, 0x10, 0x02, 0x59, 0xd0, 0x18, 0x03, + 0x59, 0xd0, 0x20, 0x04, 0x48, 0x00, 0x28, 0x0e, 0x48, 0x04, 0x28, 0x0f, + 0x48, 0x08, 0x28, 0x10, 0x48, 0x0c, 0x28, 0x11, 0x48, 0x10, 0x28, 0x12, + 0x59, 0x90, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x48, 0x03, 0x20, 0x06, 0x4a, 0x03, 0xa0, 0x05, 0x30, 0x00, 0x00, 0x00, + 0x59, 0xd0, 0x00, 0x06, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x80, 0x20, 0x40, 0x00, 0x50, 0x20, 0x00, 0x00, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x00, 0x00, 0x03, 0x80, 0x28, 0x50, 0x40, 0x1c, 0x01, 0xf0, 0x00, + 0x58, 0x30, 0x00, 0x01, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x0e, + 0x48, 0x02, 0x60, 0x0b, 0x40, 0x00, 0x60, 0x00, 0x58, 0x30, 0x02, 0x04, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x82, 0x00, 0x04, 0x00, + 0x00, 0x10, 0x0f, 0xd8, 0x50, 0x00, 0x40, 0x00, 0x80, 0x20, 0x41, 0xc0, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x80, 0x28, 0x50, 0x40, + 0x1c, 0x01, 0xf0, 0x00, 0x40, 0x00, 0x50, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0b, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0f, 0xd3, + 0x00, 0x10, 0x0f, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0f, 0xd3, + 0x00, 0x10, 0x0f, 0xd2, 0x00, 0x10, 0x0f, 0xcf, 0x00, 0x10, 0x0f, 0xd3, + 0x00, 0x10, 0x0f, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x0f, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x0f, 0xd3, 0x00, 0x10, 0x0f, 0xd3, 0x00, 0x10, 0x0f, 0xd3, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0f, 0xd3, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x13, 0xc8, 0x57, + 0x49, 0x2f, 0xc8, 0x57, 0x49, 0x33, 0xc8, 0x57, 0x48, 0x12, 0x60, 0x12, + 0x59, 0x2c, 0x52, 0x07, 0x80, 0x28, 0x51, 0xc0, 0x04, 0x00, 0x00, 0x4a, + 0x41, 0x2c, 0x60, 0x00, 0x04, 0x01, 0xf8, 0x4b, 0x04, 0x00, 0x00, 0x09, + 0x82, 0x24, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, 0x04, 0x02, 0x00, 0x03, + 0x58, 0x30, 0x00, 0x0d, 0x80, 0x10, 0x24, 0x80, 0x50, 0x20, 0x00, 0x00, + 0x80, 0x00, 0x45, 0x40, 0x04, 0x00, 0x00, 0x3f, 0x50, 0x20, 0x00, 0x00, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x0b, 0x80, 0x30, 0x14, 0x00, + 0x58, 0x08, 0x00, 0x02, 0x80, 0x10, 0x24, 0x80, 0x04, 0x00, 0x10, 0x1e, + 0x80, 0x10, 0x21, 0xc0, 0x04, 0x00, 0x00, 0x09, 0x80, 0x28, 0x50, 0x40, + 0x04, 0x00, 0x00, 0x34, 0x80, 0x20, 0x40, 0x00, 0x04, 0x01, 0xf7, 0xf4, + 0x58, 0x30, 0x00, 0x01, 0x80, 0x00, 0x65, 0x40, 0x04, 0x00, 0x00, 0x2f, + 0x04, 0x01, 0xf7, 0xe6, 0x80, 0x28, 0x50, 0x40, 0x04, 0x00, 0x00, 0x2c, + 0x80, 0x20, 0x40, 0x00, 0x50, 0x20, 0x00, 0x00, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x02, 0x00, 0x0a, 0x58, 0x30, 0x00, 0x01, 0x80, 0x00, 0x65, 0x40, + 0x04, 0x00, 0x00, 0x25, 0x58, 0x30, 0x02, 0x04, 0x82, 0x00, 0x4d, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x82, 0x24, 0x44, 0x00, 0x00, 0x10, 0x0f, 0xd8, + 0x50, 0x20, 0x40, 0x00, 0x59, 0x2c, 0x02, 0x08, 0x84, 0x00, 0x05, 0x1e, + 0x48, 0x02, 0x5a, 0x08, 0x04, 0x01, 0xf0, 0x13, 0x80, 0x10, 0x20, 0x80, + 0x80, 0x10, 0x20, 0x00, 0x48, 0x12, 0x60, 0x10, 0x48, 0x13, 0xc8, 0x57, + 0x58, 0x08, 0x08, 0x02, 0x40, 0x10, 0x00, 0x00, 0x80, 0x04, 0x24, 0x80, + 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x58, 0x08, 0x00, 0x00, + 0x58, 0x08, 0x18, 0x01, 0x80, 0x10, 0x24, 0x00, 0x48, 0x12, 0x60, 0x0e, + 0x48, 0x0e, 0x60, 0x0f, 0x48, 0x13, 0xc8, 0x57, 0x59, 0x2c, 0x02, 0x08, + 0x84, 0x00, 0x05, 0x5e, 0x48, 0x02, 0x5a, 0x08, 0x48, 0x33, 0xc8, 0x57, + 0x48, 0x23, 0xc8, 0x57, 0x48, 0x2b, 0xc8, 0x57, 0x48, 0x32, 0x60, 0x0b, + 0x48, 0x22, 0x60, 0x0c, 0x48, 0x2a, 0x60, 0x0d, 0x80, 0x00, 0x05, 0x80, + 0x04, 0x01, 0xf0, 0x03, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x1c, 0x01, 0xf0, 0x00, 0x58, 0x30, 0x02, 0x04, 0x82, 0x00, 0x4d, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x82, 0x24, 0x44, 0x00, 0x00, 0x10, 0x0f, 0xd8, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x29, 0x04, 0x02, 0x00, 0x1b, 0x50, 0x20, 0x40, 0x00, + 0x59, 0x2c, 0x04, 0x09, 0x80, 0x00, 0x05, 0x40, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x00, 0x10, 0x11, 0x58, 0x30, 0x00, 0x01, 0x80, 0x00, 0x65, 0x40, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x58, 0x30, 0x02, 0x04, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x82, 0x00, 0x04, 0x00, + 0x00, 0x10, 0x0f, 0xd8, 0x50, 0x00, 0x40, 0x00, 0x40, 0x04, 0x00, 0x00, + 0x80, 0x04, 0x09, 0xc0, 0x04, 0x00, 0x00, 0x06, 0x82, 0x04, 0x0c, 0x80, + 0x00, 0x00, 0x00, 0x05, 0x04, 0x02, 0x17, 0xf1, 0x80, 0x20, 0x44, 0x00, + 0x80, 0x00, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xe0, 0x00, 0x04, + 0x8c, 0x00, 0x05, 0x0e, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x08, 0x4c, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x5c, 0x00, 0x00, 0x59, 0xe4, 0xb8, 0x00, + 0x48, 0x5f, 0xc8, 0x57, 0x82, 0x5c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x1f, + 0x04, 0x00, 0x00, 0x04, 0x59, 0xe4, 0x08, 0x62, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x82, 0x5c, 0x05, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x8c, 0x5c, 0xbd, 0x0e, + 0x04, 0x02, 0x08, 0x07, 0x8c, 0x5c, 0xbd, 0x0c, 0x04, 0x02, 0x08, 0x09, + 0x8c, 0x5c, 0xbd, 0x0a, 0x04, 0x02, 0x08, 0x79, 0x5c, 0x00, 0xb8, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x4a, 0x03, 0xc8, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0x2c, 0x00, 0x00, + 0x42, 0x00, 0x78, 0x00, 0x00, 0x10, 0xb0, 0xbb, 0x58, 0x3c, 0x00, 0x01, + 0x58, 0x3c, 0x08, 0x02, 0x80, 0x04, 0x05, 0x40, 0x04, 0x00, 0x00, 0x40, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x10, 0xaf, 0xc5, 0x50, 0x06, 0x58, 0x00, + 0x59, 0x2c, 0x00, 0x02, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x0e, 0x59, 0xe4, 0x08, 0x50, 0x59, 0xe4, 0x18, 0x53, + 0x40, 0x0c, 0x00, 0x00, 0x80, 0x04, 0x04, 0x00, 0x59, 0xe4, 0x08, 0x52, + 0x48, 0x07, 0xc8, 0x57, 0x80, 0x04, 0x14, 0x80, 0x04, 0x02, 0x10, 0x08, + 0x40, 0x00, 0x10, 0x00, 0x48, 0x0b, 0xc8, 0x57, 0x4a, 0x00, 0x78, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x06, 0x48, 0x03, 0xc8, 0x57, + 0x04, 0x01, 0xf0, 0x2a, 0x59, 0xe4, 0x10, 0x50, 0x48, 0x0b, 0xc8, 0x57, + 0x49, 0x78, 0x78, 0x00, 0x48, 0x0b, 0xc8, 0x57, 0x48, 0x0f, 0xc8, 0x57, + 0x59, 0x2c, 0x00, 0x03, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x06, + 0x80, 0x08, 0x05, 0x80, 0x04, 0x02, 0x00, 0x04, 0x59, 0x2c, 0x00, 0x03, + 0x48, 0x03, 0xc8, 0x57, 0x48, 0x0b, 0xc8, 0x57, 0x48, 0x0a, 0x58, 0x03, + 0x59, 0x2c, 0x00, 0x07, 0x80, 0x00, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x07, + 0x59, 0x2c, 0x10, 0x07, 0x48, 0x0b, 0xc8, 0x57, 0x58, 0x3c, 0x00, 0x03, + 0x48, 0x03, 0xc8, 0x57, 0x80, 0x08, 0x04, 0x80, 0x04, 0x00, 0x10, 0x03, + 0x58, 0x3c, 0x10, 0x01, 0x48, 0x0b, 0xc8, 0x57, 0x58, 0x3c, 0x08, 0x02, + 0x48, 0x0b, 0xc8, 0x57, 0x48, 0x07, 0xc8, 0x57, 0x4a, 0x02, 0x58, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x4a, 0x02, 0x58, 0x09, 0x00, 0x10, 0x10, 0xd8, + 0x48, 0x0a, 0x58, 0x07, 0x48, 0x06, 0x58, 0x08, 0x59, 0xe4, 0x00, 0x53, + 0x80, 0x00, 0x00, 0xc4, 0x48, 0x02, 0x58, 0x05, 0x41, 0x2c, 0x10, 0x00, + 0x49, 0x2f, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x9e, + 0x5c, 0x02, 0x58, 0x00, 0x4a, 0x03, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x00, 0x78, 0x00, 0x00, 0x10, 0xaf, 0xc5, + 0x50, 0x3c, 0x78, 0x00, 0x4a, 0x00, 0x78, 0x02, 0x00, 0x00, 0x01, 0x00, + 0x42, 0x00, 0x78, 0x00, 0x00, 0x10, 0xb0, 0xbb, 0x58, 0x3c, 0x00, 0x00, + 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x48, 0x00, 0x78, 0x00, + 0x04, 0x01, 0xf0, 0x19, 0x49, 0x78, 0x78, 0x00, 0x58, 0x3c, 0x18, 0x06, + 0x58, 0x3c, 0x00, 0x05, 0x80, 0x0c, 0x18, 0x00, 0x48, 0x0c, 0x78, 0x06, + 0x80, 0x0c, 0x05, 0x80, 0x04, 0x02, 0x00, 0x02, 0x49, 0x78, 0x78, 0x06, + 0x58, 0x3c, 0x08, 0x07, 0x80, 0x04, 0x09, 0xc0, 0x04, 0x00, 0x00, 0x0e, + 0x58, 0x3c, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0x48, 0x00, 0x78, 0x08, + 0x80, 0x04, 0x05, 0x80, 0x04, 0x02, 0x00, 0x09, 0x49, 0x78, 0x78, 0x08, + 0x58, 0x3c, 0x20, 0x06, 0x42, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x28, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x36, 0xf4, 0x1c, 0x01, 0xf0, 0x00, 0x4a, 0x03, 0xc8, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x58, + 0x59, 0xe4, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0x2c, 0x00, 0x00, + 0x4a, 0x00, 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x82, 0x04, 0x0d, 0x00, + 0x43, 0x00, 0x0f, 0x80, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x58, 0x38, 0x00, 0x09, 0x48, 0x03, 0xc0, 0x0f, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8c, 0x47, 0x58, 0x3a, 0x58, 0x08, 0x59, 0x2c, 0x00, 0x00, + 0x48, 0x00, 0x70, 0x08, 0x80, 0x00, 0x01, 0xc0, 0x04, 0x02, 0x00, 0x02, + 0x49, 0x78, 0x70, 0x07, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x2e, + 0x5c, 0x02, 0x58, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x07, 0xc3, + 0x48, 0x03, 0xc8, 0x56, 0x4c, 0x3c, 0x00, 0x00, 0x4d, 0x2c, 0x00, 0x00, + 0x4d, 0x30, 0x00, 0x00, 0x58, 0x30, 0x00, 0x0a, 0x80, 0x02, 0x5d, 0x40, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0x2e, 0x60, 0x08, + 0x4c, 0x30, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8c, 0x60, + 0x5c, 0x00, 0x60, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x58, 0x30, 0x00, 0x02, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x01, 0x00, + 0x04, 0x02, 0x00, 0x10, 0x59, 0x30, 0x78, 0x0b, 0x58, 0x3c, 0x00, 0x01, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x0e, 0x48, 0x02, 0x60, 0x0b, + 0x40, 0x00, 0x78, 0x00, 0x82, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x48, 0x00, 0x60, 0x03, 0x58, 0x3c, 0x00, 0x00, 0x48, 0x00, 0x60, 0x05, + 0x40, 0x30, 0x10, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x9e, + 0x04, 0x01, 0xf0, 0x0c, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x02, + 0x4c, 0x30, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x5c, 0x00, 0x60, 0x00, 0x40, 0x32, 0x58, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x07, 0x2e, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x5c, 0x02, 0x60, 0x00, 0x5c, 0x02, 0x58, 0x00, 0x5c, 0x00, 0x78, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x4d, 0x2c, 0x00, 0x00, + 0x4d, 0x30, 0x00, 0x00, 0x42, 0x00, 0x70, 0x00, 0x00, 0x10, 0xaf, 0xc6, + 0x58, 0x38, 0x08, 0x01, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x02, 0x00, 0x11, 0x58, 0x38, 0x60, 0x02, 0x58, 0x30, 0x00, 0x0a, + 0x81, 0x2c, 0x05, 0x80, 0x04, 0x02, 0x00, 0x0d, 0x59, 0xe0, 0x00, 0x04, + 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x00, 0x07, 0xfe, 0x59, 0xdc, 0x00, 0x06, + 0x48, 0x03, 0xc8, 0x57, 0x4a, 0x03, 0xb8, 0x05, 0x20, 0x00, 0x00, 0x00, + 0x8c, 0x00, 0x05, 0x3e, 0x04, 0x00, 0x07, 0xf8, 0x4a, 0x00, 0x70, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf0, 0x19, 0x58, 0x38, 0x60, 0x06, + 0x40, 0x30, 0x50, 0x00, 0x80, 0x30, 0x61, 0xc0, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x58, 0x30, 0x00, 0x0a, 0x81, 0x2c, 0x05, 0x80, + 0x04, 0x00, 0x00, 0x04, 0x40, 0x30, 0x50, 0x00, 0x58, 0x30, 0x60, 0x00, + 0x04, 0x01, 0xf7, 0xf8, 0x40, 0x28, 0x00, 0x00, 0x80, 0x30, 0x05, 0x80, + 0x58, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, 0x48, 0x00, 0x50, 0x00, + 0x80, 0x00, 0x01, 0xc0, 0x04, 0x02, 0x00, 0x07, 0x48, 0x28, 0x70, 0x05, + 0x04, 0x01, 0xf0, 0x05, 0x80, 0x00, 0x01, 0xc0, 0x04, 0x02, 0x00, 0x02, + 0x48, 0x00, 0x70, 0x05, 0x48, 0x00, 0x70, 0x06, 0x40, 0x32, 0x58, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x2e, 0x42, 0x00, 0x70, 0x00, + 0x00, 0x10, 0xaf, 0xc6, 0x58, 0x38, 0x00, 0x01, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x07, 0xc3, + 0x5c, 0x02, 0x60, 0x00, 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x48, 0x07, 0x90, 0x00, 0x59, 0xc8, 0x00, 0x00, 0x80, 0x04, 0x05, 0x00, + 0x04, 0x02, 0x07, 0xfe, 0x49, 0x7b, 0x90, 0x05, 0x4a, 0x03, 0x90, 0x35, + 0x00, 0x88, 0x02, 0x00, 0x59, 0xa8, 0x00, 0x0d, 0x80, 0x00, 0x00, 0xe0, + 0x48, 0x03, 0x90, 0x0e, 0x4a, 0x03, 0x90, 0x11, 0x00, 0x00, 0x00, 0x24, + 0x4a, 0x03, 0x90, 0x0f, 0x00, 0x10, 0xd8, 0xd4, 0x4a, 0x03, 0x90, 0x10, + 0x00, 0x10, 0xd8, 0xd4, 0x4a, 0x03, 0x90, 0x15, 0x00, 0x00, 0x00, 0x7f, + 0x4a, 0x03, 0x90, 0x0d, 0x00, 0x00, 0x00, 0x40, 0x4a, 0x03, 0x90, 0x00, + 0x00, 0x00, 0x16, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xc8, 0x00, 0x07, + 0x8c, 0x00, 0x05, 0x08, 0x04, 0x02, 0x08, 0xba, 0x59, 0xc8, 0x08, 0x00, + 0x8c, 0x04, 0x0d, 0x16, 0x04, 0x02, 0x00, 0x04, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x0c, 0x01, 0xf0, 0x05, 0x48, 0x07, 0xc8, 0x57, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x0c, 0x01, 0xf0, 0x01, + 0x00, 0x10, 0x11, 0xc4, 0x00, 0x10, 0x11, 0xc2, 0x00, 0x10, 0x55, 0x12, + 0x00, 0x10, 0x11, 0xc2, 0x00, 0x10, 0x11, 0xc6, 0x00, 0x10, 0x11, 0xc2, + 0x00, 0x10, 0x11, 0xc6, 0x00, 0x10, 0x11, 0xc6, 0x00, 0x10, 0x11, 0xc2, + 0x00, 0x10, 0x11, 0xc2, 0x00, 0x10, 0x11, 0xc2, 0x00, 0x10, 0x11, 0xc2, + 0x00, 0x10, 0x11, 0xc6, 0x00, 0x10, 0x11, 0xc2, 0x00, 0x10, 0x11, 0xc6, + 0x00, 0x10, 0x11, 0xc2, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x48, 0x03, 0xc8, 0x57, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xc8, 0x08, 0x0c, + 0x48, 0x07, 0xc8, 0x57, 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0x60, 0x00, + 0x04, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x1b, + 0x04, 0x01, 0xf0, 0x06, 0x82, 0x04, 0x05, 0x00, 0x00, 0x7f, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa1, 0xed, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x66, 0xfa, 0x04, 0x01, 0xf0, 0x2b, + 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0x14, 0x04, 0x00, 0x00, 0x14, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x4a, 0x83, 0x6c, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x0d, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x3d, 0xcb, 0x04, 0x01, 0xf0, 0x07, 0x4a, 0x03, 0x50, 0x30, + 0x00, 0x00, 0x00, 0x01, 0x42, 0x02, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0x16, 0x04, 0x01, 0xf8, 0x17, + 0x04, 0x01, 0xf0, 0x15, 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0x1c, 0x00, + 0x04, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x29, + 0x04, 0x01, 0xf8, 0x10, 0x04, 0x01, 0xf0, 0x0e, 0x82, 0x04, 0x05, 0x00, + 0x00, 0x00, 0x01, 0x40, 0x04, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x3c, 0x04, 0x01, 0xf8, 0x09, 0x04, 0x01, 0xf0, 0x07, + 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0x80, 0x00, 0x04, 0x00, 0x00, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x14, 0x04, 0x01, 0xf8, 0x02, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x0c, 0x00, 0x00, 0x4c, 0x10, 0x00, 0x00, + 0x4c, 0x14, 0x00, 0x00, 0x04, 0x01, 0xfc, 0x0c, 0x5c, 0x00, 0x28, 0x00, + 0x5c, 0x00, 0x20, 0x00, 0x5c, 0x00, 0x18, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x59, 0xa8, 0x08, 0x04, + 0x59, 0xa8, 0x00, 0x28, 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0xf0, 0x00, + 0x80, 0x04, 0x05, 0x40, 0x48, 0x03, 0x50, 0x28, 0x59, 0xa8, 0x00, 0x2c, + 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0xf0, 0x00, 0x80, 0x04, 0x05, 0x40, + 0x48, 0x03, 0x50, 0x2c, 0x48, 0x07, 0x88, 0x82, 0x82, 0x04, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x80, 0x0c, 0x19, 0x08, 0x82, 0x0c, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x40, 0x0c, 0x20, 0x00, 0x90, 0x10, 0x29, 0xc0, + 0x82, 0x04, 0x04, 0x80, 0x00, 0x00, 0x01, 0xe4, 0x04, 0x02, 0x10, 0x05, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x10, 0x20, 0xc6, + 0x04, 0x01, 0xf0, 0x31, 0x82, 0x04, 0x04, 0x80, 0x00, 0x00, 0x02, 0x30, + 0x04, 0x02, 0x10, 0x09, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x80, 0x10, 0x00, 0xc2, 0x80, 0x00, 0x00, 0xc2, 0x80, 0x10, 0x04, 0x00, + 0x80, 0x10, 0x04, 0x00, 0x80, 0x10, 0x24, 0x00, 0x04, 0x01, 0xf0, 0x26, + 0x82, 0x04, 0x04, 0x80, 0x00, 0x00, 0x02, 0x98, 0x04, 0x02, 0x10, 0x08, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x10, 0x00, 0xc2, + 0x80, 0x00, 0x00, 0xc2, 0x80, 0x10, 0x04, 0x00, 0x80, 0x10, 0x24, 0x00, + 0x04, 0x01, 0xf0, 0x1c, 0x82, 0x04, 0x04, 0x80, 0x00, 0x00, 0x03, 0x28, + 0x04, 0x02, 0x10, 0x07, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x80, 0x10, 0x00, 0xc2, 0x80, 0x00, 0x00, 0xc2, 0x80, 0x10, 0x24, 0x00, + 0x04, 0x01, 0xf0, 0x13, 0x82, 0x04, 0x04, 0x80, 0x00, 0x00, 0x04, 0x04, + 0x04, 0x02, 0x10, 0x05, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x80, 0x10, 0x20, 0xc4, 0x04, 0x01, 0xf0, 0x0c, 0x82, 0x04, 0x04, 0x80, + 0x00, 0x00, 0x05, 0x6c, 0x04, 0x02, 0x10, 0x06, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x80, 0x10, 0x00, 0xc2, 0x80, 0x10, 0x24, 0x00, + 0x04, 0x01, 0xf0, 0x04, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x80, 0x10, 0x20, 0xc2, 0x82, 0x10, 0x04, 0x80, 0x00, 0x00, 0x01, 0x10, + 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x20, 0x00, 0x80, 0x08, 0x00, 0xd0, + 0x80, 0x14, 0x05, 0x40, 0x80, 0x10, 0x05, 0x40, 0x48, 0x03, 0x90, 0x35, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xc8, 0x08, 0x15, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xe4, 0x40, 0x68, 0x08, 0x00, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x7c, 0x48, 0x07, 0x90, 0x00, 0x59, 0xc8, 0x00, 0x00, + 0x80, 0x04, 0x05, 0x00, 0x04, 0x02, 0x07, 0xfe, 0x8c, 0x04, 0x0d, 0x04, + 0x04, 0x00, 0x00, 0x03, 0x59, 0xc8, 0x00, 0x35, 0x48, 0x03, 0x90, 0x35, + 0x59, 0xc8, 0x00, 0x00, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x12, 0x00, + 0x48, 0x03, 0x90, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x49, 0x7b, 0x88, 0xa9, 0x4a, 0x03, 0x88, 0x07, 0x00, 0x00, 0x00, 0x01, + 0x49, 0x7b, 0x88, 0x07, 0x59, 0xc4, 0x00, 0x05, 0x48, 0x03, 0x88, 0x05, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x17, 0x7f, 0x42, 0x01, 0xd0, 0x00, + 0x00, 0x00, 0x01, 0xf4, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x78, + 0x49, 0x7b, 0x88, 0x0e, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x01, 0xf4, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x14, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0xa5, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x14, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x18, 0x99, 0x8c, 0x04, 0x0d, 0x00, 0x04, 0x00, 0x00, 0x05, + 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xf3, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x32, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0xb4, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0xa5, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x18, 0x99, 0x8c, 0x04, 0x0d, 0x00, 0x04, 0x00, 0x00, 0x05, + 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xf3, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x59, 0xc4, 0x00, 0x05, 0x48, 0x03, 0x88, 0x05, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x80, 0x00, 0x08, 0xd0, + 0x48, 0x07, 0x50, 0x51, 0x48, 0x07, 0x50, 0x52, 0x48, 0x07, 0x50, 0x53, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x18, 0xa5, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xf4, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0x99, 0x82, 0x04, 0x05, 0x00, + 0xff, 0xff, 0xff, 0xd1, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x02, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x18, 0xa5, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xa0, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0x99, 0x82, 0x04, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xa0, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0xa5, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0x99, + 0x82, 0x04, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0xa5, + 0x42, 0x01, 0xd0, 0x00, 0x00, 0x01, 0xd4, 0xc0, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5c, 0x78, 0x04, 0x01, 0xfa, 0x3e, 0x4a, 0x03, 0x88, 0xa7, + 0x00, 0x00, 0xf7, 0xf7, 0x4a, 0x03, 0x88, 0xa3, 0x80, 0x00, 0x40, 0x3c, + 0x4a, 0x03, 0x88, 0xae, 0x00, 0x00, 0x61, 0xa8, 0x4a, 0x03, 0x88, 0x01, + 0x00, 0x03, 0x20, 0x63, 0x4a, 0x03, 0x88, 0x10, 0x00, 0x41, 0x01, 0x08, + 0x4a, 0x03, 0x88, 0x11, 0x00, 0x52, 0x06, 0x08, 0x4a, 0x03, 0x88, 0x12, + 0x00, 0x45, 0x03, 0x20, 0x4a, 0x03, 0x88, 0x13, 0x00, 0x44, 0x04, 0x05, + 0x4a, 0x03, 0x88, 0x1c, 0x00, 0x41, 0x32, 0xe1, 0x4a, 0x03, 0x88, 0x50, + 0x80, 0x00, 0x01, 0x08, 0x4a, 0x03, 0x88, 0x60, 0x00, 0x00, 0x00, 0x08, + 0x4a, 0x03, 0x88, 0x70, 0x00, 0x00, 0x00, 0x08, 0x4a, 0x03, 0x88, 0x51, + 0x80, 0x00, 0x05, 0x08, 0x4a, 0x03, 0x88, 0x61, 0x00, 0x80, 0x00, 0x00, + 0x4a, 0x03, 0x88, 0x71, 0x00, 0x80, 0x00, 0x00, 0x4a, 0x03, 0x88, 0x52, + 0x80, 0x00, 0x07, 0x08, 0x4a, 0x03, 0x88, 0x62, 0x00, 0x80, 0x00, 0x00, + 0x4a, 0x03, 0x88, 0x72, 0x00, 0x80, 0x00, 0x00, 0x4a, 0x03, 0x88, 0x53, + 0x80, 0x00, 0x06, 0x08, 0x49, 0x7b, 0x88, 0x63, 0x4a, 0x03, 0x88, 0x73, + 0x00, 0x80, 0x00, 0x00, 0x4a, 0x03, 0x88, 0x82, 0x00, 0x00, 0x08, 0x40, + 0x4a, 0x03, 0x88, 0xa5, 0x00, 0x00, 0x00, 0xff, 0x4a, 0x03, 0x88, 0xa6, + 0x00, 0x00, 0x00, 0x1e, 0x4a, 0x03, 0x88, 0xb0, 0x00, 0x00, 0x75, 0x30, + 0x4a, 0x03, 0x88, 0x02, 0x00, 0x00, 0xff, 0xff, 0x4a, 0x03, 0x88, 0x06, + 0xc0, 0xe0, 0x08, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x85, 0x0e, 0x1d, 0x4e, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x18, 0x99, 0x82, 0x04, 0x05, 0x00, 0xff, 0xff, 0xff, 0xaf, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0xa5, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x18, 0x99, 0x4c, 0x04, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, + 0x84, 0x00, 0x05, 0x48, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xf4, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0xa5, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0x99, + 0x82, 0x04, 0x05, 0x00, 0xff, 0xff, 0xff, 0xc1, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x38, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0xa5, 0x5c, 0x00, 0x00, 0x00, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x18, 0xa5, 0x59, 0xc4, 0x08, 0x05, 0x59, 0xc4, 0x00, 0x06, + 0x80, 0x04, 0x0d, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x82, 0x04, 0x05, 0x00, 0x00, 0xe0, 0x08, 0x00, 0x04, 0x02, 0x00, 0x04, + 0x8c, 0x04, 0x0d, 0x3e, 0x04, 0x02, 0x08, 0xd5, 0x04, 0x01, 0xf0, 0x07, + 0x82, 0x04, 0x05, 0x00, 0x00, 0x80, 0x08, 0x00, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xe4, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x4c, 0x5c, 0x00, 0x00, 0x4c, 0x60, 0x00, 0x00, 0x59, 0xc4, 0xb8, 0x05, + 0x59, 0xc4, 0x00, 0x06, 0x8c, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x03, + 0x8c, 0x5c, 0xbd, 0x00, 0x04, 0x02, 0x00, 0x8b, 0x48, 0x5f, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x00, 0x00, 0x1e, + 0x59, 0xc4, 0x00, 0x05, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x04, 0x00, 0x00, 0x42, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xe4, + 0x04, 0x02, 0x00, 0x3f, 0x59, 0xc4, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0x04, 0x02, 0x00, 0x04, 0x4a, 0x03, 0x88, 0x05, + 0x00, 0x00, 0x00, 0xc0, 0x04, 0x01, 0xf0, 0x38, 0x59, 0xa8, 0x00, 0x14, + 0x84, 0x00, 0x05, 0x06, 0x48, 0x03, 0x50, 0x14, 0x42, 0x00, 0x60, 0x00, + 0xff, 0x20, 0x3f, 0xff, 0x42, 0x00, 0x68, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x44, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3e, 0xb0, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x6d, 0x8c, 0x5c, 0xbd, 0x34, + 0x04, 0x02, 0x00, 0x27, 0x4a, 0x03, 0x50, 0x2f, 0x00, 0x00, 0xaa, 0xaa, + 0x59, 0xc4, 0x00, 0x05, 0x8c, 0x00, 0x05, 0x0c, 0x04, 0x02, 0x00, 0x12, + 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x02, 0x00, 0x13, 0x8c, 0x00, 0x05, 0x0a, + 0x04, 0x02, 0x00, 0x14, 0x8c, 0x00, 0x05, 0x08, 0x04, 0x00, 0x00, 0x0b, + 0x59, 0xa8, 0x00, 0x16, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x09, + 0x04, 0x02, 0x00, 0x07, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x12, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4e, 0xa0, 0x04, 0x01, 0xf0, 0x50, 0x4a, 0x03, 0x50, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf0, 0x0b, 0x4a, 0x03, 0x50, 0x30, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf0, 0x08, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x14, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4e, 0x4a, 0x04, 0x01, 0xf0, 0x43, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4e, 0xfc, 0x04, 0x01, 0xf0, 0x40, + 0x8c, 0x5c, 0xbd, 0x34, 0x04, 0x00, 0x00, 0x3c, 0x59, 0xc4, 0x00, 0x05, + 0x8c, 0x00, 0x05, 0x3a, 0x04, 0x02, 0x00, 0x05, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xaf, 0xe6, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x4a, 0x03, 0x88, 0x05, 0x02, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x02, 0x00, 0x10, 0x4a, 0x03, 0x88, 0x05, + 0x04, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xd3, + 0x04, 0x02, 0x00, 0x08, 0x4a, 0x03, 0x50, 0x30, 0x00, 0x00, 0x00, 0x01, + 0x42, 0x02, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0x16, 0x04, 0x01, 0xf0, 0x60, 0x41, 0x78, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0x7e, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x19, 0x46, 0x40, 0x00, 0xc0, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x18, 0xc4, 0x83, 0x6c, 0x15, 0x80, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x02, 0x00, 0x0c, 0x8c, 0x5c, 0xbd, 0x00, 0x04, 0x02, 0x00, 0x17, + 0x8d, 0x0e, 0x1d, 0x06, 0x04, 0x02, 0x00, 0x05, 0x59, 0xc4, 0x10, 0xa3, + 0x82, 0x08, 0x15, 0x40, 0x00, 0x00, 0x00, 0x08, 0x48, 0x0b, 0x88, 0xa3, + 0x59, 0xc4, 0x10, 0x06, 0x84, 0x08, 0x15, 0x40, 0x48, 0x0b, 0x88, 0x06, + 0x4a, 0x03, 0x88, 0x05, 0x04, 0x00, 0x00, 0x00, 0x42, 0x02, 0xd8, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x49, 0x7b, 0x50, 0x13, 0x8d, 0x0e, 0x1d, 0x18, + 0x04, 0x02, 0x00, 0x05, 0x48, 0x03, 0xc8, 0x56, 0x85, 0x0e, 0x1d, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3d, 0xec, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x37, 0xea, 0x8c, 0x5c, 0xbd, 0x3c, 0x04, 0x02, 0x08, 0x58, + 0x8c, 0x5c, 0xbd, 0x00, 0x04, 0x00, 0x00, 0x36, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x99, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x4a, 0x03, 0x88, 0x05, 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x03, 0x52, 0x42, 0x01, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x64, + 0x4c, 0x58, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x78, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0x4d, 0x5c, 0x00, 0xb0, 0x00, + 0x04, 0x00, 0x00, 0x04, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xf6, + 0x04, 0x01, 0xf0, 0x04, 0x4a, 0x03, 0x88, 0x05, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf0, 0x1f, 0x59, 0xc4, 0x00, 0x06, 0x84, 0x00, 0x05, 0x00, + 0x48, 0x03, 0x88, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x67, 0x25, + 0x49, 0x7b, 0x88, 0x80, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa1, 0xd8, + 0x59, 0xc4, 0x00, 0x0d, 0x8c, 0x00, 0x05, 0x00, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0xa1, 0xe6, 0x59, 0xc4, 0x00, 0xa3, 0x82, 0x00, 0x05, 0x00, + 0xfc, 0xf8, 0xff, 0xff, 0x48, 0x03, 0x88, 0xa3, 0x4a, 0x03, 0x50, 0x49, + 0x00, 0x00, 0x00, 0x02, 0x42, 0x02, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x4a, 0x03, 0x88, 0x05, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x05, 0xfc, 0x04, 0x01, 0xfb, 0x77, 0x49, 0x7b, 0x50, 0x4f, + 0x4a, 0x03, 0x50, 0x46, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xd4, 0x71, 0x82, 0x5c, 0xbd, 0x00, 0xbb, 0xff, 0xff, 0xfe, + 0x48, 0x5f, 0x88, 0x05, 0x5c, 0x00, 0xc0, 0x00, 0x5c, 0x00, 0xb8, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xc4, 0x10, 0x04, 0x48, 0x0b, 0xc8, 0x57, + 0x8c, 0x08, 0x15, 0x00, 0x04, 0x00, 0x00, 0x06, 0x48, 0x03, 0xc8, 0x56, + 0x49, 0x7b, 0x28, 0x07, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x67, 0xed, + 0x04, 0x01, 0xf0, 0x0a, 0x82, 0x08, 0x05, 0x00, 0x00, 0x00, 0x01, 0xf0, + 0x04, 0x00, 0x00, 0x07, 0x48, 0x03, 0xc8, 0x56, 0x41, 0x7a, 0x30, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x41, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x68, 0x0f, 0x4a, 0x03, 0x88, 0x05, 0x80, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xc4, 0x08, 0xa3, 0x48, 0x07, 0xc8, 0x57, + 0x84, 0x04, 0x0d, 0x40, 0x48, 0x07, 0x88, 0xa3, 0x1c, 0x01, 0xf0, 0x00, + 0x4d, 0x90, 0x00, 0x00, 0x4d, 0xd0, 0x00, 0x00, 0x4d, 0xa4, 0x00, 0x00, + 0x4d, 0x14, 0x00, 0x00, 0x4a, 0x03, 0x88, 0x05, 0x40, 0x00, 0x00, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x95, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x76, + 0x59, 0xc4, 0x10, 0x04, 0x8c, 0x08, 0x15, 0x00, 0x04, 0x00, 0x00, 0x55, + 0x59, 0x8e, 0x60, 0x0d, 0x49, 0x7b, 0x28, 0x07, 0x81, 0x32, 0x61, 0xc0, + 0x04, 0x00, 0x00, 0x32, 0x59, 0x30, 0x04, 0x03, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x32, 0x04, 0x02, 0x00, 0x2e, 0x59, 0x30, 0x00, 0x1c, + 0x48, 0x03, 0x88, 0x33, 0x4a, 0x03, 0x88, 0x07, 0x00, 0x01, 0x80, 0x00, + 0x42, 0x01, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5c, 0x78, 0x49, 0x7b, 0x88, 0x07, 0x42, 0x01, 0xd0, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x78, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x66, 0x64, 0x42, 0x01, 0xd0, 0x00, + 0x00, 0x00, 0x75, 0x30, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x78, + 0x59, 0xc4, 0x08, 0xa4, 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x82, 0x04, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x18, 0xaa, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0xc4, + 0x59, 0x30, 0x00, 0x08, 0x80, 0x00, 0x05, 0x40, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x40, 0x02, 0x58, 0x00, 0x4a, 0x02, 0x5a, 0x04, + 0x00, 0x00, 0x01, 0x03, 0x59, 0x31, 0xd8, 0x21, 0x58, 0xef, 0x40, 0x0b, + 0x58, 0xec, 0x00, 0x09, 0x08, 0x01, 0xf8, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x04, 0x01, 0xf0, 0x47, 0x59, 0x8c, 0x00, 0x0f, + 0x82, 0x00, 0x1c, 0x80, 0x00, 0x00, 0x00, 0xc8, 0x04, 0x02, 0x10, 0x10, + 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x18, 0x0f, 0x59, 0xc4, 0x00, 0xa4, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x02, 0x00, 0x05, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0xaa, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x2c, 0x04, 0x01, 0xf0, 0x34, + 0x49, 0x33, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x66, 0x64, + 0x81, 0x32, 0x61, 0xc0, 0x04, 0x00, 0x00, 0x2f, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x01, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x27, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, 0x04, 0x01, 0xf0, 0x28, + 0x8c, 0x08, 0x15, 0x08, 0x04, 0x00, 0x00, 0x26, 0x41, 0x7a, 0x30, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x69, 0x2b, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5c, 0x41, 0x59, 0x92, 0x60, 0x04, 0x81, 0x32, 0x61, 0xc0, + 0x04, 0x00, 0x00, 0x13, 0x42, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0xc8, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x68, 0xef, 0x04, 0x02, 0x00, 0x0e, + 0x59, 0xc4, 0x00, 0xa4, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, 0x04, 0x02, 0x00, 0x05, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x18, 0xaa, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x31, + 0x04, 0x01, 0xf0, 0x0c, 0x49, 0x33, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x66, 0x06, 0x81, 0x32, 0x61, 0xc0, 0x04, 0x00, 0x00, 0x07, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, + 0x5c, 0x02, 0x28, 0x00, 0x5c, 0x03, 0x48, 0x00, 0x5c, 0x03, 0xa0, 0x00, + 0x5c, 0x03, 0x20, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x64, 0x63, + 0x4c, 0x00, 0x00, 0x00, 0x40, 0x68, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x81, 0x0c, 0x0d, 0x80, + 0x8c, 0x04, 0x0d, 0x0e, 0x04, 0x00, 0x00, 0x47, 0x48, 0x03, 0xc8, 0x57, + 0x8d, 0x0e, 0x1d, 0x0e, 0x04, 0x00, 0x00, 0x23, 0x85, 0x0e, 0x1d, 0x0e, + 0x49, 0x7b, 0x50, 0x49, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xdb, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x12, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x11, + 0x59, 0xc4, 0x00, 0x01, 0x82, 0x00, 0x05, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x82, 0x00, 0x1d, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, + 0x82, 0x00, 0x1d, 0x80, 0x00, 0x00, 0x80, 0x00, 0x04, 0x00, 0x00, 0x09, + 0x82, 0x00, 0x1d, 0x80, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x42, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf0, 0x06, 0x42, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x03, 0x42, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x36, 0xf4, + 0x85, 0x0e, 0x1d, 0x4e, 0x59, 0xa8, 0x08, 0x49, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x02, 0x00, 0x07, 0x59, 0xc4, 0x00, 0x0d, 0x8c, 0x00, 0x05, 0x20, + 0x04, 0x00, 0x00, 0x04, 0x42, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x01, 0xf0, 0x02, 0x40, 0x04, 0x18, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0xf6, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x12, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xf4, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x05, 0xfc, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x4c, + 0x04, 0x02, 0x00, 0x0c, 0x04, 0x01, 0xf8, 0x50, 0x4d, 0x40, 0x00, 0x00, + 0x4d, 0x3c, 0x00, 0x00, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x28, + 0x42, 0x02, 0x78, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xca, 0x42, 0x5c, 0x02, 0x78, 0x00, 0x5c, 0x02, 0x80, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x04, 0x00, + 0x00, 0x10, 0x1c, 0xdd, 0x50, 0x00, 0x08, 0x00, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x4c, 0x58, 0x00, 0x00, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x49, 0x7b, 0x88, 0xac, 0x49, 0x7b, 0x88, 0xad, 0x80, 0x58, 0xb0, 0x40, + 0x04, 0x02, 0x07, 0xfe, 0x5c, 0x00, 0xb0, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x07, 0xc8, 0x57, 0x48, 0x07, 0x50, 0x0f, 0x80, 0x04, 0x11, 0x08, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x49, 0x7b, 0x88, 0xac, + 0x80, 0x00, 0x05, 0x80, 0x80, 0x08, 0x11, 0xc0, 0x04, 0x02, 0x00, 0x06, + 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x82, 0x00, 0x04, 0x00, + 0x00, 0x10, 0xa3, 0x51, 0x50, 0x00, 0x00, 0x00, 0x48, 0x03, 0x88, 0xad, + 0x80, 0x08, 0x10, 0x40, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xf5, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x40, 0x68, 0x08, 0x00, + 0x04, 0x01, 0xff, 0xeb, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x57, 0x4c, 0x08, 0x00, 0x00, 0x4c, 0x04, 0x00, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x59, 0xc4, 0x08, 0x92, 0x48, 0x07, 0xc8, 0x57, + 0x80, 0x04, 0x15, 0x80, 0x04, 0x00, 0x00, 0x10, 0x80, 0x04, 0x14, 0x80, + 0x04, 0x02, 0x10, 0x07, 0x80, 0x08, 0x10, 0x80, 0x80, 0x08, 0x10, 0x00, + 0x40, 0x08, 0xb0, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, + 0x04, 0x01, 0xf0, 0x04, 0x40, 0x08, 0xb0, 0x00, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x10, 0x48, 0x03, 0x88, 0x86, 0x80, 0x58, 0xb0, 0x40, + 0x04, 0x02, 0x07, 0xfe, 0x49, 0x7b, 0x88, 0x86, 0x5c, 0x00, 0x00, 0x00, + 0x5c, 0x00, 0x08, 0x00, 0x5c, 0x00, 0x10, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x00, 0x00, 0x05, + 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x9c, 0x1f, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xa8, 0x08, 0x6c, + 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x04, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf0, 0x10, + 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0x20, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x02, 0x00, 0x0b, 0x59, 0xc8, 0x08, 0x35, + 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x80, 0x04, 0x09, 0x10, + 0x80, 0x04, 0x08, 0x00, 0x59, 0xa8, 0x00, 0x69, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x00, 0x00, 0x03, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x5a, + 0x48, 0x07, 0xc8, 0x57, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x59, 0xc9, 0x88, 0x35, 0x82, 0xc5, 0x8d, 0x00, 0x00, 0x00, 0x1f, 0x00, + 0x80, 0xc5, 0x89, 0x10, 0x48, 0xc7, 0xc8, 0x57, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x08, + 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x03, + 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x59, 0xa8, 0x00, 0x50, + 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x08, 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x00, 0x00, 0x03, 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x59, 0xa8, 0x00, 0x50, 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x01, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x08, 0x42, 0x01, 0x88, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x03, 0x42, 0x01, 0x88, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x59, 0xa8, 0x00, 0x50, 0x48, 0x03, 0xc8, 0x57, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x08, + 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x03, + 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x59, 0xa8, 0x00, 0x50, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x4c, 0x04, 0x00, 0x00, 0x4c, 0x08, 0x00, 0x00, 0x4c, 0x38, 0x00, 0x00, + 0x59, 0xa8, 0x00, 0x3d, 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x07, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf8, 0x06, + 0x5c, 0x00, 0x70, 0x00, 0x5c, 0x00, 0x10, 0x00, 0x5c, 0x00, 0x08, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x15, 0xd2, + 0x00, 0x10, 0x15, 0xe5, 0x00, 0x10, 0x15, 0xf9, 0x00, 0x10, 0x15, 0xfb, + 0x00, 0x10, 0x16, 0x22, 0x00, 0x10, 0x16, 0x24, 0x00, 0x10, 0x16, 0x26, + 0x48, 0x03, 0xc8, 0x56, 0x4a, 0x03, 0x50, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xfa, 0x21, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf9, 0xb1, + 0x04, 0x01, 0xfa, 0xa7, 0x48, 0x03, 0xc8, 0x56, 0x4a, 0x03, 0x50, 0x3d, + 0x00, 0x00, 0x00, 0x06, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1e, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x16, 0x27, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x5c, 0x4d, 0x49, 0x7b, 0x50, 0x42, 0x4a, 0x03, 0x50, 0x4d, + 0x00, 0x00, 0x00, 0x36, 0x4a, 0x03, 0x50, 0x4c, 0x00, 0x00, 0x00, 0x2a, + 0x48, 0x03, 0xc8, 0x56, 0x4a, 0x03, 0x50, 0x3f, 0x00, 0x00, 0x00, 0x01, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf9, 0x9c, + 0x48, 0x03, 0xc8, 0x56, 0x4a, 0x03, 0x50, 0x3d, 0x00, 0x00, 0x00, 0x06, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x10, 0x16, 0x27, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x5c, 0x4d, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x4a, 0x03, 0x50, 0x4d, + 0x00, 0x00, 0x00, 0x36, 0x48, 0x03, 0xc8, 0x56, 0x4a, 0x03, 0x50, 0x3f, + 0x00, 0x00, 0x00, 0x03, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xfa, 0x97, 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x90, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x90, 0x04, 0x00, 0x00, 0x09, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x09, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x05, 0x41, 0x78, 0x00, 0x00, + 0x04, 0x01, 0xf0, 0x03, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x01, 0xf9, 0x74, 0x49, 0x7b, 0x50, 0x43, 0x48, 0x03, 0xc8, 0x56, + 0x4a, 0x03, 0x50, 0x3d, 0x00, 0x00, 0x00, 0x06, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x1e, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x16, 0x27, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x5c, 0x4d, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x4c, 0x04, 0x00, 0x00, + 0x4c, 0x08, 0x00, 0x00, 0x4c, 0x38, 0x00, 0x00, 0x59, 0xa8, 0x00, 0x3f, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x07, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf8, 0x06, 0x5c, 0x00, 0x70, 0x00, + 0x5c, 0x00, 0x10, 0x00, 0x5c, 0x00, 0x08, 0x00, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x16, 0x3d, 0x00, 0x10, 0x16, 0x5c, + 0x00, 0x10, 0x16, 0xb0, 0x00, 0x10, 0x16, 0xc7, 0x00, 0x10, 0x16, 0xde, + 0x00, 0x10, 0x16, 0xe7, 0x00, 0x10, 0x16, 0xe9, 0x04, 0x01, 0xfa, 0x10, + 0x04, 0x02, 0x00, 0x1b, 0x59, 0xa8, 0x10, 0x45, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xfa, 0x57, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x90, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x90, + 0x04, 0x00, 0x00, 0x09, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x10, + 0x04, 0x00, 0x00, 0x08, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x07, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x84, 0x08, 0x15, 0x40, 0x04, 0x01, 0xf0, 0x04, 0x84, 0x08, 0x15, 0x42, + 0x04, 0x01, 0xf0, 0x02, 0x84, 0x08, 0x15, 0x44, 0x48, 0x0b, 0x50, 0x45, + 0x4a, 0x03, 0x50, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x03, + 0x04, 0x01, 0xf8, 0xcb, 0x04, 0x01, 0xff, 0x82, 0x1c, 0x01, 0xf0, 0x00, + 0x04, 0x01, 0xf8, 0x8f, 0x04, 0x00, 0x00, 0x52, 0x04, 0x01, 0xf9, 0xef, + 0x04, 0x02, 0x00, 0x2a, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xfa, 0x37, 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x90, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x44, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x06, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x90, 0x04, 0x00, 0x00, 0x09, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0xc4, 0x08, 0x01, + 0x82, 0x04, 0x0d, 0x00, 0x00, 0x01, 0x80, 0x00, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x36, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xfa, 0x21, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x90, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x10, + 0x04, 0x00, 0x00, 0x06, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x90, + 0x04, 0x00, 0x00, 0x06, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x59, 0xa8, 0x00, 0x45, 0x84, 0x00, 0x05, 0x42, 0x04, 0x01, 0xf0, 0x03, + 0x59, 0xa8, 0x00, 0x45, 0x84, 0x00, 0x05, 0x40, 0x48, 0x03, 0x50, 0x45, + 0x59, 0xa8, 0x00, 0x42, 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x50, 0x42, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x00, 0x03, + 0x04, 0x01, 0xf8, 0x61, 0x04, 0x01, 0xf0, 0x1e, 0x49, 0x7b, 0x50, 0x42, + 0x59, 0xc4, 0x08, 0x01, 0x82, 0x04, 0x0d, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x80, 0x00, 0x04, 0x00, 0x00, 0x09, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x05, 0x41, 0x78, 0x00, 0x00, + 0x04, 0x01, 0xf0, 0x03, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x01, 0xf9, 0x51, 0x4a, 0x03, 0x50, 0x3f, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x01, 0xf0, 0x04, 0x4a, 0x03, 0x50, 0x3d, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x01, 0xf0, 0x02, 0x04, 0x01, 0xff, 0x42, 0x1c, 0x01, 0xf0, 0x00, + 0x04, 0x01, 0xf8, 0x3b, 0x04, 0x00, 0x00, 0x15, 0x59, 0xa8, 0x00, 0x4c, + 0x80, 0x00, 0x00, 0x40, 0x48, 0x03, 0x50, 0x4c, 0x04, 0x01, 0xf9, 0x98, + 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x50, 0x3d, 0x00, 0x00, 0x00, 0x03, + 0x49, 0x7b, 0x50, 0x3e, 0x04, 0x01, 0xf0, 0x0c, 0x59, 0xa8, 0x00, 0x4c, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x03, 0x04, 0x01, 0xf8, 0x9e, + 0x04, 0x01, 0xf0, 0x02, 0x04, 0x01, 0xf8, 0x4b, 0x04, 0x01, 0xf8, 0x2f, + 0x49, 0x7b, 0x50, 0x42, 0x4a, 0x03, 0x50, 0x3f, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xff, 0x2b, 0x1c, 0x01, 0xf0, 0x00, 0x04, 0x01, 0xf8, 0x24, + 0x04, 0x00, 0x00, 0x15, 0x04, 0x01, 0xf9, 0x84, 0x04, 0x02, 0x00, 0x0f, + 0x59, 0xa8, 0x00, 0x43, 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x50, 0x43, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x07, 0x04, 0x02, 0x00, 0x0c, + 0x4a, 0x03, 0x50, 0x4f, 0x00, 0x00, 0x00, 0x0a, 0x49, 0x7b, 0x50, 0x46, + 0x59, 0xa8, 0x00, 0x45, 0x84, 0x00, 0x05, 0x5e, 0x48, 0x03, 0x50, 0x45, + 0x48, 0x03, 0xc8, 0x57, 0x04, 0x01, 0xf0, 0x05, 0x04, 0x01, 0xf8, 0x17, + 0x4a, 0x03, 0x50, 0x3f, 0x00, 0x00, 0x00, 0x04, 0x04, 0x01, 0xff, 0x3d, + 0x1c, 0x01, 0xf0, 0x00, 0x04, 0x01, 0xf8, 0x0d, 0x04, 0x00, 0x00, 0x07, + 0x04, 0x01, 0xf9, 0x6d, 0x04, 0x02, 0x00, 0x03, 0x04, 0x01, 0xff, 0x1b, + 0x04, 0x01, 0xf0, 0x03, 0x04, 0x01, 0xf8, 0x0c, 0x04, 0x01, 0xff, 0x34, + 0x1c, 0x01, 0xf0, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0xa8, 0x00, 0x4d, + 0x80, 0x00, 0x00, 0x40, 0x48, 0x03, 0x50, 0x4d, 0x04, 0x00, 0x08, 0x91, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x04, 0x00, 0x00, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf9, 0xa6, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x90, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x90, + 0x04, 0x00, 0x00, 0x09, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x10, + 0x04, 0x00, 0x00, 0x09, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x09, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf0, 0x05, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x02, + 0x41, 0x78, 0x00, 0x00, 0x04, 0x01, 0xf8, 0xf0, 0x5c, 0x00, 0x08, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x04, 0x00, 0x00, 0x59, 0xc4, 0x08, 0x01, + 0x82, 0x04, 0x0d, 0x00, 0x00, 0x01, 0x80, 0x00, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x80, 0x00, 0x04, 0x00, 0x00, 0x09, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x01, 0xf0, 0x05, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf0, 0x02, 0x41, 0x78, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x6a, + 0x5c, 0x00, 0x08, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x04, 0x00, 0x00, + 0x59, 0xa8, 0x00, 0x42, 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x50, 0x42, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x05, 0x04, 0x02, 0x00, 0x18, + 0x49, 0x7b, 0x50, 0x42, 0x59, 0xc4, 0x08, 0x01, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x01, 0x80, 0x00, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x09, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x80, 0x00, + 0x04, 0x00, 0x00, 0x09, 0x82, 0x04, 0x05, 0x80, 0x00, 0x01, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x09, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf0, 0x05, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x02, + 0x41, 0x78, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x4a, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf9, 0x55, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x90, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x90, + 0x04, 0x00, 0x00, 0x09, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x10, + 0x04, 0x00, 0x00, 0x09, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x09, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf0, 0x05, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x02, + 0x41, 0x78, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x9f, 0x5c, 0x00, 0x08, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x20, 0x00, 0x00, 0x59, 0xa8, 0x00, 0x45, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x59, 0xa8, 0x40, 0x44, 0x80, 0x20, 0x41, 0x02, + 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x48, 0x23, 0x50, 0x44, + 0x80, 0x20, 0x45, 0x00, 0x04, 0x00, 0x07, 0xfa, 0x8c, 0x00, 0x05, 0x04, + 0x04, 0x02, 0x00, 0x07, 0x8c, 0x00, 0x05, 0x02, 0x04, 0x02, 0x00, 0x08, + 0x8c, 0x00, 0x05, 0x00, 0x04, 0x02, 0x00, 0x08, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x01, 0xf0, 0x05, 0x41, 0x78, 0x00, 0x00, 0x04, 0x01, 0xf0, 0x03, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf8, 0x13, + 0x5c, 0x00, 0x40, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x04, 0x01, 0x10, 0x00, 0x4a, 0x03, 0xc8, 0x40, 0x00, 0x10, 0xac, 0x3d, + 0x4a, 0x03, 0xc8, 0x42, 0x00, 0x00, 0x00, 0x09, 0x40, 0x00, 0x00, 0x00, + 0x04, 0x01, 0x17, 0xff, 0x4a, 0x03, 0x50, 0x44, 0x00, 0x00, 0x00, 0x04, + 0x4a, 0x03, 0x50, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0xa8, 0x08, 0x55, 0x82, 0x04, 0x0d, 0x80, 0x01, 0x39, 0x10, 0x77, + 0x04, 0x02, 0x00, 0x08, 0x59, 0xe0, 0x08, 0x13, 0x8c, 0x04, 0x0d, 0x00, + 0x04, 0x00, 0x00, 0x05, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x02, 0x00, 0x02, 0x41, 0x78, 0x00, 0x00, 0x80, 0x00, 0x01, 0xc0, + 0x04, 0x00, 0x00, 0x40, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x02, 0x00, 0x1d, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xa0, + 0x04, 0x01, 0xf8, 0xfc, 0x82, 0x04, 0x05, 0x40, 0x00, 0x00, 0x00, 0x04, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x01, 0xf9, 0x03, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x04, 0x01, 0xf8, 0xf4, + 0x82, 0x04, 0x05, 0x40, 0x00, 0x00, 0x00, 0x20, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x04, 0x01, 0xf8, 0xfb, 0x59, 0xc4, 0x00, 0x01, + 0x82, 0x00, 0x05, 0x00, 0xff, 0xfe, 0x7f, 0xff, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x03, 0x88, 0x01, 0x59, 0xa8, 0x00, 0x51, + 0x80, 0x00, 0x01, 0x10, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0x04, 0x01, 0xf8, 0xf0, 0x04, 0x01, 0xf0, 0x3c, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x01, 0xf8, 0xdc, + 0x82, 0x04, 0x05, 0x00, 0xff, 0xff, 0xff, 0xfb, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0xa0, 0x04, 0x01, 0xf8, 0xe3, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x04, 0x01, 0xf8, 0xd4, 0x82, 0x04, 0x05, 0x00, + 0xff, 0xff, 0xff, 0xdf, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x04, 0x01, 0xf8, 0xdb, 0x59, 0xc4, 0x00, 0x01, 0x82, 0x00, 0x05, 0x00, + 0xff, 0xfe, 0x7f, 0xff, 0x82, 0x00, 0x05, 0x40, 0x00, 0x01, 0x00, 0x00, + 0x48, 0x03, 0x88, 0x01, 0x59, 0xa8, 0x00, 0x53, 0x80, 0x00, 0x01, 0x10, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x04, 0x01, 0xf8, 0xd0, + 0x04, 0x01, 0xf0, 0x1c, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xa0, + 0x04, 0x01, 0xf8, 0xc0, 0x82, 0x04, 0x05, 0x40, 0x00, 0x00, 0x00, 0x04, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x01, 0xf8, 0xc7, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x04, 0x01, 0xf8, 0xb8, + 0x82, 0x04, 0x05, 0x00, 0xff, 0xff, 0xff, 0xdf, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x04, 0x01, 0xf8, 0xbf, 0x59, 0xc4, 0x00, 0x01, + 0x82, 0x00, 0x05, 0x00, 0xff, 0xfe, 0x7f, 0xff, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x80, 0x00, 0x48, 0x03, 0x88, 0x01, 0x59, 0xa8, 0x00, 0x52, + 0x80, 0x00, 0x01, 0x10, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0x04, 0x01, 0xf8, 0xb4, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x40, 0x68, 0x00, 0x00, 0x04, 0x01, 0xff, 0x96, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x57, 0x59, 0xa8, 0x08, 0x55, + 0x82, 0x04, 0x0d, 0x80, 0x01, 0x39, 0x10, 0x77, 0x04, 0x02, 0x00, 0x08, + 0x59, 0xe0, 0x08, 0x13, 0x8c, 0x04, 0x0d, 0x00, 0x04, 0x00, 0x00, 0x05, + 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x02, 0x04, 0x02, 0x00, 0x02, + 0x41, 0x78, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf9, 0x31, + 0x5c, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x26, + 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x01, 0x04, 0x02, 0x00, 0x10, + 0x59, 0xa8, 0x00, 0x69, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x04, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf9, 0xe6, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x85, + 0x82, 0x04, 0x05, 0x40, 0x00, 0x00, 0x00, 0x90, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x8c, 0x04, 0x01, 0xf0, 0x24, + 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x59, 0xa8, 0x00, 0x69, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x00, 0x00, 0x04, 0x42, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x04, 0x01, 0xf9, 0xd3, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x72, 0x82, 0x04, 0x05, 0x00, 0xff, 0xff, 0xff, 0x6f, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x79, + 0x04, 0x01, 0xf0, 0x11, 0x59, 0xa8, 0x00, 0x69, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x00, 0x00, 0x04, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x04, 0x01, 0xf9, 0xc4, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x63, 0x82, 0x04, 0x05, 0x00, 0xff, 0xff, 0xff, 0x6f, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x68, 0x04, 0x01, 0xf1, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x40, 0x68, 0x00, 0x00, 0x04, 0x01, 0xff, 0xb7, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x08, 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x00, 0x00, 0x03, 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x58, 0x00, 0x00, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x14, 0x80, 0x58, 0xb0, 0x40, + 0x04, 0x00, 0x00, 0x29, 0x59, 0xc4, 0x00, 0x0d, 0x8c, 0x00, 0x05, 0x20, + 0x04, 0x02, 0x07, 0xfc, 0x04, 0x01, 0xf8, 0x3d, 0x59, 0xc4, 0x00, 0x0d, + 0x8c, 0x00, 0x05, 0x20, 0x04, 0x02, 0x07, 0xf8, 0x59, 0xc4, 0x08, 0x08, + 0x84, 0x04, 0x0d, 0x50, 0x48, 0x07, 0x88, 0x08, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0xc8, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xff, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x14, 0x80, 0x58, 0xb0, 0x40, + 0x04, 0x00, 0x00, 0x17, 0x59, 0xc4, 0x00, 0x0d, 0x8c, 0x00, 0x05, 0x20, + 0x04, 0x02, 0x00, 0x14, 0x04, 0x01, 0xf8, 0x2b, 0x59, 0xc4, 0x00, 0x0d, + 0x8c, 0x00, 0x05, 0x20, 0x04, 0x02, 0x00, 0x10, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x0a, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x00, 0x00, 0x03, + 0x04, 0x01, 0xf8, 0x23, 0x04, 0x01, 0xf7, 0xfd, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x64, 0x59, 0xc4, 0x00, 0x0d, 0x8c, 0x00, 0x05, 0x1e, + 0x04, 0x00, 0x00, 0x05, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xfc, + 0x80, 0x00, 0x05, 0x80, 0x04, 0x01, 0xf0, 0x03, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x5c, 0x00, 0xb0, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xa0, + 0x04, 0x01, 0xf8, 0x15, 0x82, 0x04, 0x05, 0x00, 0xff, 0xff, 0xff, 0xfe, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x01, 0xf8, 0x1c, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x0d, + 0x82, 0x04, 0x05, 0x00, 0xff, 0xff, 0xff, 0xfe, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf0, 0x14, 0x40, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x40, 0x68, 0x08, 0x00, + 0x48, 0x07, 0x88, 0x0e, 0x59, 0xc4, 0x08, 0x0f, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x40, 0x05, 0x88, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x40, 0x68, 0x08, 0x00, 0x40, 0x6c, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x90, 0x00, 0x01, 0xc0, 0x80, 0x04, 0x0d, 0x40, 0x84, 0x04, 0x0d, 0x40, + 0x48, 0x07, 0x88, 0x0e, 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, 0x82, 0x00, 0x0d, 0x80, + 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, 0x82, 0x00, 0x0d, 0x80, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, 0x59, 0xc4, 0x08, 0xa3, + 0x04, 0x01, 0xf0, 0x06, 0x59, 0xc4, 0x08, 0xa3, 0x84, 0x04, 0x0d, 0x30, + 0x04, 0x01, 0xf0, 0x03, 0x59, 0xc4, 0x08, 0xa3, 0x84, 0x04, 0x0d, 0x32, + 0x80, 0x04, 0x05, 0x40, 0x48, 0x03, 0x88, 0xa3, 0x48, 0x07, 0x88, 0xa3, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xc4, 0x00, 0xa3, 0x84, 0x00, 0x05, 0x56, + 0x48, 0x03, 0x88, 0xa3, 0x84, 0x00, 0x05, 0x16, 0x48, 0x03, 0x88, 0xa3, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x5f, 0xc8, 0x57, 0x48, 0x63, 0xc8, 0x57, + 0x4c, 0x64, 0x00, 0x00, 0x4d, 0x3c, 0x00, 0x00, 0x4d, 0x40, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x67, 0x25, 0x48, 0x63, 0x50, 0x09, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x4c, 0x04, 0x02, 0x00, 0x63, + 0x82, 0x60, 0x0d, 0x00, 0x00, 0x00, 0xff, 0x00, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x00, 0x00, 0x0c, 0x42, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x59, 0xa8, 0x00, 0x0f, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x80, 0x04, 0x11, 0x10, 0x80, 0x08, 0x15, 0x80, 0x04, 0x00, 0x00, 0x1f, + 0x82, 0x04, 0x15, 0x80, 0x00, 0x00, 0xff, 0x00, 0x04, 0x00, 0x00, 0x0a, + 0x59, 0xc4, 0x10, 0xa3, 0x82, 0x08, 0x15, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x04, 0x00, 0x00, 0x09, 0x59, 0xc4, 0x10, 0xa7, 0x82, 0x08, 0x15, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x82, 0x08, 0x15, 0x80, 0x00, 0x00, 0xff, 0x00, + 0x42, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10, + 0x8d, 0x0e, 0x1d, 0x02, 0x04, 0x02, 0x00, 0x07, 0x8d, 0x0e, 0x1d, 0x00, + 0x04, 0x02, 0x00, 0x0c, 0x59, 0x9c, 0x10, 0x17, 0x8c, 0x08, 0x15, 0x1a, + 0x04, 0x00, 0x00, 0x37, 0x85, 0x0e, 0x1d, 0x42, 0x42, 0x00, 0xc8, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x42, 0x02, 0x78, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x01, 0xf0, 0x05, + 0x85, 0x0e, 0x1d, 0x40, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x41, 0x7a, 0x78, 0x00, 0x59, 0xa8, 0x00, 0x05, 0x8c, 0x00, 0x05, 0x02, + 0x04, 0x02, 0x00, 0x04, 0x8d, 0x0e, 0x1d, 0x0a, 0x04, 0x02, 0x00, 0x30, + 0x85, 0x0e, 0x1d, 0x4a, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xe0, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x59, 0xa8, 0x18, 0x09, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x13, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x36, 0xf4, 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x00, 0x00, 0x15, + 0x4d, 0x40, 0x00, 0x00, 0x82, 0x60, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x42, 0x02, 0x88, 0x00, 0x00, 0x00, 0xff, 0xff, 0x40, 0x64, 0x30, 0x00, + 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x9c, 0x1c, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5d, 0x72, 0x5c, 0x02, 0x80, 0x00, 0x59, 0x9c, 0x08, 0x17, + 0x8c, 0x04, 0x0d, 0x0a, 0x04, 0x02, 0x00, 0x10, 0x49, 0x3f, 0xc8, 0x57, + 0x49, 0x43, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0x42, + 0x04, 0x01, 0xf0, 0x0b, 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x00, 0x00, 0x09, + 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x42, 0x02, 0x88, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9c, 0x1f, 0x49, 0x7b, 0x88, 0x80, + 0x5c, 0x02, 0x80, 0x00, 0x5c, 0x02, 0x78, 0x00, 0x5c, 0x00, 0xc8, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xff, 0x61, 0x82, 0x04, 0x05, 0x40, 0x00, 0x00, 0x00, 0x02, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf7, 0x68, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xff, 0x59, + 0x82, 0x04, 0x05, 0x00, 0xff, 0xff, 0xff, 0xfd, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf7, 0x60, 0x59, 0xc4, 0x08, 0xa8, + 0x04, 0x01, 0xff, 0x4b, 0x04, 0x01, 0xff, 0x4a, 0x59, 0xc4, 0x00, 0xa8, + 0x80, 0x04, 0x0d, 0x80, 0x04, 0x02, 0x07, 0xfb, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x4a, 0x03, 0x88, 0x07, 0x00, 0x00, 0x00, 0x01, + 0x49, 0x7b, 0x88, 0x07, 0x59, 0xc4, 0x00, 0x05, 0x48, 0x03, 0x88, 0x05, + 0x49, 0x7b, 0x50, 0x69, 0x49, 0x7b, 0x50, 0x6a, 0x41, 0x78, 0x58, 0x00, + 0x42, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x68, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x01, 0xf8, 0x24, 0x04, 0x01, 0xf8, 0x2f, + 0x40, 0x40, 0x00, 0x00, 0x48, 0x03, 0xc8, 0x57, 0x82, 0x40, 0x85, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x1d, 0x41, 0x78, 0x58, 0x00, + 0x42, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x42, 0x00, 0x68, 0x00, + 0x00, 0x00, 0x00, 0x14, 0x04, 0x01, 0xf8, 0x18, 0x04, 0x01, 0xf8, 0x23, + 0x40, 0x40, 0x00, 0x00, 0x48, 0x03, 0xc8, 0x57, 0x82, 0x40, 0x85, 0x80, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x02, 0x00, 0x11, 0x42, 0x00, 0x58, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1e, + 0x42, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x14, 0x04, 0x01, 0xf8, 0x0b, + 0x04, 0x01, 0xf8, 0x16, 0x40, 0x40, 0x00, 0x00, 0x48, 0x03, 0xc8, 0x57, + 0x82, 0x40, 0x85, 0x80, 0x00, 0x00, 0xff, 0xff, 0x04, 0x02, 0x00, 0x04, + 0x4a, 0x03, 0x50, 0x69, 0x00, 0x00, 0x00, 0x01, 0x48, 0x03, 0xc8, 0x56, + 0x1c, 0x01, 0xf0, 0x00, 0x41, 0x78, 0x50, 0x00, 0x04, 0x01, 0xf8, 0x12, + 0x04, 0x01, 0xf8, 0x38, 0x40, 0x34, 0x70, 0x00, 0x40, 0x34, 0x08, 0x00, + 0x04, 0x01, 0xf0, 0x3d, 0x42, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf8, 0x0b, 0x04, 0x01, 0xf8, 0x31, 0x40, 0x34, 0x08, 0x00, + 0x04, 0x01, 0xf0, 0x37, 0x42, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x01, 0xf8, 0x05, 0x04, 0x01, 0xf8, 0x1d, 0x04, 0x01, 0xf8, 0x35, + 0x40, 0x04, 0x80, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x04, 0x01, 0xf8, 0x08, + 0x04, 0x01, 0xf8, 0x14, 0x40, 0x28, 0x08, 0x00, 0x04, 0x01, 0xf8, 0x26, + 0x40, 0x2c, 0x08, 0x00, 0x04, 0x01, 0xf8, 0x27, 0x40, 0x30, 0x08, 0x00, + 0x04, 0x01, 0xf0, 0x25, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf8, 0x29, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x01, 0xf8, 0x26, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x04, 0x01, 0xf0, 0x21, 0x41, 0x78, 0x08, 0x00, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf0, 0x1d, + 0x04, 0x01, 0xf9, 0x2e, 0x4a, 0x03, 0xd0, 0x00, 0x00, 0x05, 0x00, 0x04, + 0x04, 0x01, 0xf9, 0x2b, 0x4a, 0x03, 0xd0, 0x00, 0x00, 0x05, 0x00, 0x05, + 0x04, 0x01, 0xf9, 0x28, 0x4a, 0x03, 0xd0, 0x00, 0x00, 0x05, 0x00, 0x04, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x0f, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x01, 0xf0, 0x0a, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x01, 0xf0, 0x07, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x04, 0x01, 0xf0, 0x04, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x04, 0x01, 0xf0, 0x1b, 0x04, 0x01, 0xf9, 0x12, 0x82, 0x08, 0x2c, 0x00, + 0x00, 0x10, 0xa3, 0x51, 0x50, 0x14, 0x28, 0x00, 0x82, 0x08, 0x15, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x13, 0x04, 0x01, 0xf9, 0x0b, + 0x80, 0x08, 0x10, 0x40, 0x80, 0x14, 0x29, 0x02, 0x40, 0x04, 0x00, 0x00, + 0x80, 0x14, 0x05, 0x00, 0x04, 0x00, 0x00, 0x07, 0x4a, 0x03, 0xd0, 0x00, + 0x00, 0x07, 0x00, 0x06, 0x04, 0x01, 0xf9, 0x03, 0x4a, 0x03, 0xd0, 0x00, + 0x00, 0x07, 0x00, 0x07, 0x04, 0x01, 0xf0, 0x06, 0x4a, 0x03, 0xd0, 0x00, + 0x00, 0x07, 0x00, 0x04, 0x04, 0x01, 0xf8, 0xfd, 0x4a, 0x03, 0xd0, 0x00, + 0x00, 0x07, 0x00, 0x05, 0x04, 0x01, 0xf7, 0xec, 0x1c, 0x01, 0xf0, 0x00, + 0x41, 0x78, 0x08, 0x00, 0x82, 0x08, 0x2c, 0x00, 0x00, 0x10, 0xa3, 0x51, + 0x50, 0x14, 0x28, 0x00, 0x82, 0x08, 0x15, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x10, 0x04, 0x01, 0xf8, 0xf1, 0x4a, 0x03, 0xd0, 0x00, + 0x00, 0x05, 0x00, 0x01, 0x04, 0x01, 0xf8, 0xee, 0x59, 0xe8, 0x18, 0x00, + 0x80, 0x08, 0x10, 0x40, 0x80, 0x14, 0x29, 0x02, 0x8c, 0x0c, 0x1d, 0x06, + 0x04, 0x00, 0x00, 0x04, 0x40, 0x14, 0x00, 0x00, 0x80, 0x04, 0x0d, 0x40, + 0x04, 0x01, 0xf8, 0xe6, 0x4a, 0x03, 0xd0, 0x00, 0x00, 0x07, 0x00, 0x00, + 0x04, 0x01, 0xf7, 0xef, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x0b, 0xc8, 0x57, + 0x48, 0x0b, 0x50, 0x6a, 0x59, 0xc4, 0x00, 0x01, 0x82, 0x00, 0x05, 0x00, + 0xff, 0xff, 0xef, 0xff, 0x48, 0x03, 0x88, 0x01, 0x41, 0x78, 0x18, 0x00, + 0x04, 0x01, 0xf8, 0xc4, 0x41, 0x78, 0x58, 0x00, 0x42, 0x00, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x1e, 0x42, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x01, 0xff, 0x7a, 0x42, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x04, 0x01, 0xff, 0x7d, 0x41, 0x78, 0x58, 0x00, 0x42, 0x00, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x1e, 0x42, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x01, 0xff, 0x71, 0x41, 0x78, 0x68, 0x00, 0x04, 0x01, 0xff, 0x75, + 0x41, 0x78, 0x58, 0x00, 0x42, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1e, + 0x41, 0x78, 0x68, 0x00, 0x04, 0x01, 0xff, 0x6a, 0x42, 0x00, 0x68, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xff, 0x6d, 0x42, 0x00, 0x68, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xff, 0x64, 0x42, 0x00, 0x68, 0x00, + 0x00, 0x00, 0x00, 0xf5, 0x04, 0x01, 0xff, 0x67, 0x41, 0x78, 0x58, 0x00, + 0x42, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x42, 0x00, 0x68, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x01, 0xff, 0x5b, 0x42, 0x00, 0x68, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x04, 0x01, 0xff, 0x5e, 0x59, 0xa8, 0x10, 0x6a, + 0x04, 0x01, 0xf8, 0x65, 0x42, 0x00, 0x18, 0x00, 0x00, 0x02, 0x00, 0xf5, + 0x04, 0x01, 0xf8, 0x97, 0x59, 0xa8, 0x10, 0x6a, 0x04, 0x01, 0xf8, 0x79, + 0x41, 0x78, 0x58, 0x00, 0x42, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1e, + 0x42, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x01, 0xff, 0x4b, + 0x41, 0x78, 0x68, 0x00, 0x04, 0x01, 0xff, 0x4f, 0x59, 0xc4, 0x00, 0x01, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x10, 0x00, 0x48, 0x03, 0x88, 0x01, + 0x41, 0x78, 0x58, 0x00, 0x42, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1e, + 0x42, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x15, 0x04, 0x01, 0xff, 0x3f, + 0x04, 0x01, 0xff, 0x4a, 0x40, 0x40, 0x00, 0x00, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x02, 0x4c, 0x00, 0x00, 0x00, 0x41, 0x78, 0x58, 0x00, + 0x42, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x42, 0x00, 0x68, 0x00, + 0x00, 0x00, 0x00, 0x15, 0x04, 0x01, 0xff, 0x34, 0x5c, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x68, 0x00, 0x04, 0x01, 0xff, 0x37, 0x41, 0x78, 0x58, 0x00, + 0x42, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x42, 0x00, 0x68, 0x00, + 0x00, 0x00, 0x00, 0x15, 0x04, 0x01, 0xff, 0x2b, 0x04, 0x01, 0xff, 0x36, + 0x40, 0x40, 0x00, 0x00, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0xff, 0xfd, + 0x4c, 0x00, 0x00, 0x00, 0x41, 0x78, 0x58, 0x00, 0x42, 0x00, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x1e, 0x42, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x15, + 0x04, 0x01, 0xff, 0x20, 0x5c, 0x00, 0x00, 0x00, 0x40, 0x00, 0x68, 0x00, + 0x04, 0x01, 0xff, 0x23, 0x41, 0x78, 0x58, 0x00, 0x42, 0x00, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x1e, 0x42, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x14, + 0x04, 0x01, 0xff, 0x17, 0x04, 0x01, 0xff, 0x22, 0x40, 0x40, 0x00, 0x00, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x40, 0x4c, 0x00, 0x00, 0x00, + 0x41, 0x78, 0x58, 0x00, 0x42, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1e, + 0x42, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x14, 0x04, 0x01, 0xff, 0x0c, + 0x5c, 0x00, 0x00, 0x00, 0x40, 0x00, 0x68, 0x00, 0x04, 0x01, 0xff, 0x0f, + 0x41, 0x78, 0x58, 0x00, 0x42, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1e, + 0x42, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x14, 0x04, 0x01, 0xff, 0x03, + 0x04, 0x01, 0xff, 0x0e, 0x40, 0x40, 0x00, 0x00, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0xff, 0xbf, 0x4c, 0x00, 0x00, 0x00, 0x41, 0x78, 0x58, 0x00, + 0x42, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x42, 0x00, 0x68, 0x00, + 0x00, 0x00, 0x00, 0x14, 0x04, 0x01, 0xfe, 0xf8, 0x5c, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x68, 0x00, 0x04, 0x01, 0xfe, 0xfb, 0x4a, 0x03, 0x88, 0x86, + 0x00, 0x00, 0x20, 0x20, 0x04, 0x01, 0xf0, 0x4c, 0x48, 0x0b, 0xc8, 0x57, + 0x82, 0x08, 0x05, 0x80, 0x00, 0x01, 0x00, 0x00, 0x04, 0x02, 0x00, 0x07, + 0x82, 0x04, 0x0d, 0x40, 0x00, 0x01, 0x00, 0x00, 0x42, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf8, 0x2d, 0x04, 0x01, 0xf0, 0x0f, + 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0x80, 0x00, 0x04, 0x00, 0x00, 0x07, + 0x82, 0x04, 0x0d, 0x40, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x18, 0x00, + 0x00, 0x90, 0x00, 0x01, 0x04, 0x01, 0xf8, 0x24, 0x04, 0x01, 0xf0, 0x06, + 0x82, 0x04, 0x0d, 0x40, 0x00, 0x00, 0x80, 0x00, 0x42, 0x00, 0x18, 0x00, + 0x00, 0x10, 0x00, 0x01, 0x04, 0x01, 0xf8, 0x1e, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x0b, 0xc8, 0x57, 0x82, 0x08, 0x05, 0x80, 0x00, 0x01, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x08, 0x42, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0xa1, + 0x04, 0x01, 0xf8, 0x16, 0x42, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0xc1, + 0x04, 0x01, 0xf8, 0x13, 0x04, 0x01, 0xf0, 0x11, 0x82, 0x08, 0x05, 0x80, + 0x00, 0x00, 0x80, 0x00, 0x04, 0x00, 0x00, 0x08, 0x42, 0x00, 0x18, 0x00, + 0x00, 0x04, 0x00, 0xa1, 0x04, 0x01, 0xf8, 0x0c, 0x42, 0x00, 0x18, 0x00, + 0x00, 0x20, 0x00, 0xc1, 0x04, 0x01, 0xf8, 0x09, 0x04, 0x01, 0xf0, 0x07, + 0x42, 0x00, 0x18, 0x00, 0x00, 0x04, 0x00, 0xa1, 0x04, 0x01, 0xf8, 0x05, + 0x42, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x04, 0x01, 0xf8, 0x02, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x0f, 0xc8, 0x57, 0x41, 0x78, 0x58, 0x00, + 0x42, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x41, 0x78, 0x68, 0x00, + 0x04, 0x01, 0xfe, 0xb7, 0x40, 0x0c, 0x68, 0x00, 0x80, 0x34, 0x69, 0x60, + 0x04, 0x01, 0xfe, 0xba, 0x42, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xfe, 0xb1, 0x40, 0x0c, 0x68, 0x00, 0x04, 0x01, 0xfe, 0xb5, + 0x42, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x01, 0xfe, 0xac, + 0x04, 0x01, 0xfe, 0xb7, 0x40, 0x40, 0x00, 0x00, 0x8c, 0x00, 0x05, 0x04, + 0x04, 0x02, 0x07, 0xfc, 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x64, 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x07, 0xff, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x5c, 0x00, 0x00, 0x4c, 0x60, 0x00, 0x00, + 0x41, 0x78, 0xb8, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x46, 0x14, + 0x04, 0x02, 0x01, 0x02, 0x59, 0xa8, 0xc0, 0x23, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x00, 0x00, 0x03, 0x8c, 0x60, 0xc5, 0x06, + 0x04, 0x00, 0x00, 0x0f, 0x8c, 0x60, 0xc5, 0x00, 0x04, 0x02, 0x00, 0x05, + 0x8c, 0x60, 0xc5, 0x0e, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0xcb, 0x0c, + 0x04, 0x01, 0xf0, 0xf6, 0x04, 0x01, 0xf9, 0xe9, 0x04, 0x02, 0x00, 0xf4, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x02, 0x00, 0x04, + 0x4a, 0x03, 0x50, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x04, 0x01, 0xf0, 0xee, + 0x8c, 0x60, 0xc5, 0x04, 0x04, 0x00, 0x00, 0x04, 0x4a, 0x03, 0x50, 0x1b, + 0x00, 0x00, 0xff, 0xff, 0x04, 0x01, 0xf0, 0xe9, 0x59, 0xa8, 0xc0, 0x0f, + 0x82, 0x60, 0xc5, 0x00, 0x00, 0x00, 0x00, 0xff, 0x59, 0xa8, 0x10, 0x12, + 0x8c, 0x08, 0x15, 0x00, 0x04, 0x00, 0x00, 0x5f, 0x8c, 0x08, 0x15, 0x02, + 0x04, 0x02, 0x00, 0x5d, 0x59, 0xa8, 0xb8, 0x1b, 0x82, 0x5c, 0x0d, 0x80, + 0x00, 0x00, 0xff, 0xff, 0x04, 0x02, 0x00, 0x03, 0x42, 0x00, 0xb8, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x80, 0x5c, 0x11, 0x04, 0x82, 0x08, 0x64, 0x00, + 0x00, 0x10, 0xb5, 0xf0, 0x50, 0x30, 0x08, 0x00, 0x82, 0x5c, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x1b, 0x1a, + 0x00, 0x10, 0x1b, 0x15, 0x00, 0x10, 0x1b, 0x19, 0x00, 0x10, 0x1b, 0x17, + 0x80, 0x04, 0x09, 0x10, 0x04, 0x01, 0xf0, 0x04, 0x80, 0x04, 0x09, 0x30, + 0x04, 0x01, 0xf0, 0x02, 0x80, 0x04, 0x09, 0x20, 0x82, 0x04, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0x0f, 0x4c, 0x00, 0x00, 0x00, 0x82, 0x00, 0x04, 0x00, + 0x00, 0x10, 0x1c, 0xdd, 0x50, 0x00, 0x08, 0x00, 0x80, 0x04, 0x09, 0x10, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x80, 0x5c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x32, 0x80, 0x60, 0x0d, 0x80, 0x04, 0x00, 0x00, 0x30, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x2e, 0x04, 0x01, 0xf0, 0x0a, + 0x83, 0x0c, 0x15, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x00, 0x2e, + 0x59, 0xa8, 0x10, 0x12, 0x84, 0x08, 0x15, 0x42, 0x48, 0x0b, 0x50, 0x12, + 0x4a, 0x03, 0x50, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x04, 0x01, 0xf0, 0x2b, + 0x4c, 0x00, 0x00, 0x00, 0x59, 0xa8, 0x00, 0x6c, 0x8c, 0x00, 0x05, 0x02, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x49, 0xda, 0x5c, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x1f, + 0x41, 0x7a, 0x88, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x58, 0x54, + 0x04, 0x02, 0x00, 0x19, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0xf9, + 0x04, 0x00, 0x00, 0x07, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x49, 0xc5, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0x23, 0x04, 0x00, 0x00, 0x11, + 0x04, 0x01, 0xf0, 0x0e, 0x59, 0x9c, 0x00, 0x19, 0x8c, 0x00, 0x05, 0x0e, + 0x04, 0x02, 0x00, 0x0b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0xb1, + 0x04, 0x02, 0x00, 0x0a, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x49, 0xc5, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0x1e, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xca, 0xe7, 0x04, 0x00, 0x00, 0x03, 0x80, 0x5c, 0xb8, 0x00, + 0x04, 0x01, 0xf7, 0xb0, 0x48, 0x5f, 0x50, 0x1b, 0x04, 0x01, 0xf0, 0x88, + 0x4a, 0x03, 0x50, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x04, 0x01, 0xf0, 0x85, + 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x59, 0xa8, 0x00, 0x1b, + 0x82, 0x00, 0x15, 0x80, 0x00, 0x00, 0xff, 0xff, 0x04, 0x02, 0x00, 0x05, + 0x80, 0x00, 0x0d, 0x80, 0x40, 0x18, 0xb0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x04, 0x01, 0xf0, 0x09, 0x80, 0x18, 0xb4, 0x80, 0x04, 0x00, 0x10, 0x04, + 0x40, 0x00, 0x08, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x04, 0x01, 0xf0, 0x04, + 0x4a, 0x03, 0x50, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x04, 0x01, 0xf0, 0x73, + 0x4c, 0x04, 0x00, 0x00, 0x4c, 0x58, 0x00, 0x00, 0x82, 0x04, 0x04, 0x00, + 0x00, 0x10, 0x1c, 0xdd, 0x50, 0x00, 0x00, 0x00, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x80, 0x60, 0x45, 0x80, 0x04, 0x00, 0x00, 0x5e, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x58, 0x55, 0x04, 0x02, 0x00, 0x63, + 0x59, 0xa8, 0x00, 0x6c, 0x8c, 0x00, 0x05, 0x02, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x49, 0xda, + 0x5c, 0x00, 0xb0, 0x00, 0x5c, 0x00, 0x08, 0x00, 0x04, 0x02, 0x07, 0xd7, + 0x4c, 0x04, 0x00, 0x00, 0x4c, 0x58, 0x00, 0x00, 0x84, 0x5c, 0xbd, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, 0x04, 0x00, 0x00, 0x08, + 0x59, 0x9c, 0x00, 0x19, 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x02, 0x00, 0x49, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0xb6, 0x04, 0x02, 0x00, 0x4e, + 0x04, 0x01, 0xf0, 0x02, 0x84, 0x5c, 0xbd, 0x40, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x49, 0xc5, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x19, + 0x04, 0x02, 0x00, 0x06, 0x8d, 0x0e, 0x1d, 0x02, 0x04, 0x00, 0x00, 0x35, + 0x59, 0x34, 0x02, 0x00, 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x02, 0x00, 0x32, + 0x59, 0xa8, 0x10, 0x12, 0x8c, 0x08, 0x15, 0x02, 0x04, 0x00, 0x00, 0x25, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x44, 0x04, 0x00, 0x00, 0x34, + 0x8c, 0x5c, 0xbd, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x43, 0x13, 0x04, 0x01, 0xf0, 0x2f, 0x04, 0x01, 0xf8, 0xf8, + 0x04, 0x00, 0x00, 0x2d, 0x42, 0x02, 0x60, 0x00, 0x00, 0x10, 0xb5, 0xb8, + 0x49, 0x36, 0x60, 0x09, 0x49, 0x7a, 0x60, 0x08, 0x41, 0x7a, 0x78, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0xa0, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x33, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x00, 0x00, 0x20, 0x41, 0x78, 0x28, 0x00, + 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, 0x4d, 0x40, 0x00, 0x00, + 0x4d, 0x44, 0x00, 0x00, 0x59, 0x36, 0x8c, 0x03, 0x42, 0x02, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x29, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9c, 0x1c, + 0x5c, 0x02, 0x88, 0x00, 0x5c, 0x02, 0x80, 0x00, 0x04, 0x01, 0xf0, 0x13, + 0x49, 0x37, 0xc8, 0x57, 0x59, 0x9c, 0x00, 0x19, 0x8c, 0x00, 0x05, 0x0e, + 0x04, 0x02, 0x00, 0x0f, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0x1e, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0xe7, 0x04, 0x00, 0x00, 0x12, + 0x04, 0x01, 0xf0, 0x09, 0x59, 0xa8, 0x00, 0x12, 0x8c, 0x00, 0x05, 0x00, + 0x04, 0x00, 0x00, 0x03, 0x04, 0x01, 0xf8, 0xcf, 0x04, 0x00, 0x00, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0x23, 0x04, 0x00, 0x00, 0x09, + 0x5c, 0x00, 0xb0, 0x00, 0x5c, 0x00, 0x08, 0x00, 0x80, 0x04, 0x08, 0x00, + 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0x96, 0x4a, 0x03, 0x50, 0x1b, + 0x00, 0x00, 0xff, 0xff, 0x04, 0x01, 0xf0, 0x05, 0x49, 0x37, 0xc8, 0x57, + 0x5c, 0x00, 0xb0, 0x00, 0x5c, 0x00, 0x08, 0x00, 0x48, 0x07, 0x50, 0x1b, + 0x5c, 0x00, 0xc0, 0x00, 0x5c, 0x00, 0xb8, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x42, 0x02, 0x88, 0x00, 0x00, 0x00, 0x07, 0xfc, + 0x42, 0x00, 0x30, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x42, 0xb1, 0x04, 0x02, 0x00, 0x05, 0x04, 0x01, 0xf8, 0x05, + 0x04, 0x00, 0x00, 0x03, 0x4a, 0x03, 0x50, 0x24, 0x00, 0x00, 0xff, 0xff, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x37, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x71, 0xd5, 0x04, 0x00, 0x00, 0x14, 0x49, 0x36, 0x60, 0x09, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x01, 0x41, 0x7a, 0x78, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x5d, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, + 0x59, 0xa8, 0x00, 0x25, 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x50, 0x25, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0xdf, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x0b, 0xc8, 0x57, 0x49, 0x2f, 0xc8, 0x57, + 0x4c, 0x5c, 0x00, 0x00, 0x40, 0x08, 0xb8, 0x00, 0x42, 0x02, 0x88, 0x00, + 0x00, 0x00, 0x07, 0xfd, 0x42, 0x00, 0x30, 0x00, 0x00, 0xff, 0xff, 0xfd, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0xb1, 0x04, 0x02, 0x00, 0x1a, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, 0x04, 0x00, 0x00, 0x17, + 0x49, 0x36, 0x60, 0x09, 0x59, 0x34, 0x00, 0x0a, 0x84, 0x00, 0x05, 0x44, + 0x48, 0x02, 0x68, 0x0a, 0x81, 0x2e, 0x59, 0xc0, 0x04, 0x00, 0x00, 0x05, + 0x59, 0x2c, 0x04, 0x04, 0x8c, 0x00, 0x05, 0x1e, 0x04, 0x00, 0x00, 0x02, + 0x48, 0xee, 0x60, 0x21, 0x49, 0x2e, 0x60, 0x08, 0x4a, 0x02, 0x64, 0x06, + 0x00, 0x00, 0x00, 0x01, 0x48, 0x5e, 0x60, 0x1c, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x22, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x5c, 0x00, 0xb8, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x80, 0x00, 0x05, 0x80, 0x04, 0x01, 0xf7, 0xfd, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x59, 0xa8, 0x00, 0x23, + 0x8c, 0x00, 0x05, 0x08, 0x04, 0x02, 0x00, 0x12, 0x59, 0x30, 0x50, 0x09, + 0x48, 0x2b, 0xc8, 0x57, 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x02, 0x00, 0x0d, 0x04, 0x01, 0xf8, 0x13, 0x04, 0x02, 0x00, 0x0b, + 0x58, 0x28, 0x04, 0x03, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x07, 0xfc, + 0x04, 0x00, 0x00, 0x08, 0x59, 0xa8, 0x00, 0x1a, 0x80, 0x00, 0x00, 0x40, + 0x48, 0x03, 0xc8, 0x57, 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x48, 0x03, 0x50, 0x1a, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xa8, 0x00, 0x25, + 0x80, 0x00, 0x00, 0x40, 0x48, 0x03, 0xc8, 0x57, 0x04, 0x00, 0x17, 0xfc, + 0x48, 0x03, 0x50, 0x25, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x30, 0x00, 0x08, + 0x80, 0x00, 0x01, 0xc0, 0x04, 0x02, 0x00, 0x09, 0x59, 0x30, 0x04, 0x03, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x01, 0x04, 0x02, 0x00, 0x04, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x02, + 0x80, 0x00, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, + 0x49, 0x3f, 0xc8, 0x57, 0x49, 0x47, 0xc8, 0x57, 0x4d, 0x40, 0x00, 0x00, + 0x4d, 0x34, 0x00, 0x00, 0x4d, 0x44, 0x00, 0x00, 0x4c, 0x58, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x76, 0x4d, 0xf0, 0x00, 0x00, + 0x80, 0x60, 0xc1, 0xc0, 0x04, 0x02, 0x00, 0x04, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x04, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x07, 0xf0, 0x41, 0x7a, 0x88, 0x00, 0x41, 0x44, 0x00, 0x00, + 0x81, 0xac, 0x04, 0x00, 0x50, 0x00, 0x00, 0x00, 0x80, 0x02, 0x6d, 0x40, + 0x04, 0x00, 0x00, 0x1a, 0x4d, 0x3c, 0x00, 0x00, 0x42, 0x02, 0x78, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x46, 0x1e, + 0x5c, 0x02, 0x78, 0x00, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xce, 0x09, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xce, 0xf7, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xcf, 0x9c, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x19, 0x04, 0x02, 0x00, 0x05, + 0x49, 0x37, 0xc8, 0x57, 0x4a, 0x02, 0x6c, 0x00, 0x00, 0x00, 0x04, 0x04, + 0x04, 0x01, 0xf0, 0x03, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x4f, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xd2, 0x8a, 0x81, 0x46, 0x88, 0x00, + 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xe0, 0x5c, 0x03, 0xe0, 0x00, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x64, 0x63, 0x5c, 0x00, 0xb0, 0x00, + 0x5c, 0x02, 0x88, 0x00, 0x5c, 0x02, 0x68, 0x00, 0x5c, 0x02, 0x80, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x08, + 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x03, + 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x37, 0xc8, 0x57, 0x49, 0x47, 0xc8, 0x57, + 0x4c, 0x5c, 0x00, 0x00, 0x4c, 0x60, 0x00, 0x00, 0x4c, 0x64, 0x00, 0x00, + 0x59, 0xa8, 0x00, 0x12, 0x8c, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x1f, + 0x59, 0x9c, 0x00, 0x17, 0x8c, 0x00, 0x05, 0x0a, 0x04, 0x02, 0x00, 0x1c, + 0x59, 0x34, 0xba, 0x02, 0x82, 0x5c, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x48, 0x5f, 0xc8, 0x57, 0x41, 0x78, 0xc0, 0x00, 0x41, 0x78, 0xc8, 0x00, + 0x82, 0x60, 0x04, 0x00, 0x00, 0x10, 0xb5, 0xf0, 0x50, 0x00, 0x20, 0x00, + 0x80, 0x60, 0xc1, 0xc0, 0x04, 0x00, 0x00, 0x08, 0x82, 0x10, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x82, 0x00, 0x2d, 0x80, 0x00, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0x0c, 0x80, 0x5c, 0x05, 0x80, 0x04, 0x00, 0x00, 0x0d, + 0x80, 0x10, 0x21, 0x10, 0x80, 0x64, 0xc8, 0x00, 0x82, 0x64, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x02, 0x07, 0xf5, 0x80, 0x60, 0xc0, 0x00, + 0x82, 0x60, 0x05, 0x80, 0x00, 0x00, 0x00, 0x20, 0x04, 0x02, 0x07, 0xeb, + 0x48, 0x13, 0xc8, 0x57, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x5c, 0x00, 0xc8, 0x00, 0x5c, 0x00, 0xc0, 0x00, 0x5c, 0x00, 0xb8, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x08, + 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x02, 0x00, 0x03, + 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xa8, 0x00, 0x23, 0x8c, 0x00, 0x05, 0x12, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x05, 0x94, 0x1c, 0x01, 0xf0, 0x00, + 0x00, 0x00, 0x7e, 0xef, 0x00, 0x00, 0x7d, 0xe8, 0x00, 0x00, 0x7c, 0xe4, + 0x00, 0x00, 0x80, 0xe2, 0x00, 0x00, 0x7b, 0xe1, 0x00, 0x00, 0x80, 0xe0, + 0x00, 0x00, 0x80, 0xdc, 0x00, 0x00, 0x80, 0xda, 0x00, 0x00, 0x7a, 0xd9, + 0x00, 0x00, 0x80, 0xd6, 0x00, 0x00, 0x80, 0xd5, 0x00, 0x00, 0x80, 0xd4, + 0x00, 0x00, 0x80, 0xd3, 0x00, 0x00, 0x80, 0xd2, 0x00, 0x00, 0x80, 0xd1, + 0x00, 0x00, 0x79, 0xce, 0x00, 0x00, 0x78, 0xcd, 0x00, 0x00, 0x80, 0xcc, + 0x00, 0x00, 0x80, 0xcb, 0x00, 0x00, 0x80, 0xca, 0x00, 0x00, 0x80, 0xc9, + 0x00, 0x00, 0x80, 0xc7, 0x00, 0x00, 0x80, 0xc6, 0x00, 0x00, 0x77, 0xc5, + 0x00, 0x00, 0x76, 0xc3, 0x00, 0x00, 0x80, 0xbc, 0x00, 0x00, 0x80, 0xba, + 0x00, 0x00, 0x75, 0xb9, 0x00, 0x00, 0x80, 0xb6, 0x00, 0x00, 0x74, 0xb5, + 0x00, 0x00, 0x73, 0xb4, 0x00, 0x00, 0x72, 0xb3, 0x00, 0x00, 0x80, 0xb2, + 0x00, 0x00, 0x80, 0xb1, 0x00, 0x00, 0x80, 0xae, 0x00, 0x00, 0x71, 0xad, + 0x00, 0x00, 0x80, 0xac, 0x00, 0x00, 0x70, 0xab, 0x00, 0x00, 0x6f, 0xaa, + 0x00, 0x00, 0x6e, 0xa9, 0x00, 0x00, 0x80, 0xa7, 0x00, 0x00, 0x6d, 0xa6, + 0x00, 0x00, 0x6c, 0xa5, 0x00, 0x00, 0x6b, 0xa3, 0x00, 0x00, 0x6a, 0x9f, + 0x00, 0x00, 0x69, 0x9e, 0x00, 0x00, 0x68, 0x9d, 0x00, 0x00, 0x80, 0x9b, + 0x00, 0x00, 0x80, 0x98, 0x00, 0x00, 0x67, 0x97, 0x00, 0x00, 0x66, 0x90, + 0x00, 0x00, 0x65, 0x8f, 0x00, 0x00, 0x64, 0x88, 0x00, 0x00, 0x63, 0x84, + 0x00, 0x00, 0x62, 0x82, 0x00, 0x00, 0x80, 0x81, 0x00, 0x00, 0x80, 0x80, + 0x00, 0x00, 0x61, 0x7c, 0x00, 0x00, 0x60, 0x7a, 0x00, 0x00, 0x80, 0x79, + 0x00, 0x00, 0x5f, 0x76, 0x00, 0x00, 0x80, 0x75, 0x00, 0x00, 0x80, 0x74, + 0x00, 0x00, 0x80, 0x73, 0x00, 0x00, 0x80, 0x72, 0x00, 0x00, 0x80, 0x71, + 0x00, 0x00, 0x80, 0x6e, 0x00, 0x00, 0x5e, 0x6d, 0x00, 0x00, 0x80, 0x6c, + 0x00, 0x00, 0x5d, 0x6b, 0x00, 0x00, 0x5c, 0x6a, 0x00, 0x00, 0x5b, 0x69, + 0x00, 0x00, 0x80, 0x67, 0x00, 0x00, 0x5a, 0x66, 0x00, 0x00, 0x59, 0x65, + 0x00, 0x00, 0x58, 0x63, 0x00, 0x00, 0x57, 0x5c, 0x00, 0x00, 0x56, 0x5a, + 0x00, 0x00, 0x55, 0x59, 0x00, 0x00, 0x80, 0x56, 0x00, 0x00, 0x80, 0x55, + 0x00, 0x00, 0x54, 0x54, 0x00, 0x00, 0x53, 0x53, 0x00, 0x00, 0x52, 0x52, + 0x00, 0x00, 0x51, 0x51, 0x00, 0x00, 0x50, 0x4e, 0x00, 0x00, 0x4f, 0x4d, + 0x00, 0x00, 0x80, 0x4c, 0x00, 0x00, 0x80, 0x4b, 0x00, 0x00, 0x4e, 0x4a, + 0x00, 0x00, 0x4d, 0x49, 0x00, 0x00, 0x80, 0x47, 0x00, 0x00, 0x4c, 0x46, + 0x00, 0x00, 0x80, 0x45, 0x00, 0x00, 0x80, 0x43, 0x00, 0x00, 0x80, 0x3c, + 0x00, 0x00, 0x80, 0x3a, 0x00, 0x00, 0x80, 0x39, 0x00, 0x00, 0x80, 0x36, + 0x00, 0x00, 0x4b, 0x35, 0x00, 0x00, 0x80, 0x34, 0x00, 0x00, 0x4a, 0x33, + 0x00, 0x00, 0x49, 0x32, 0x00, 0x00, 0x48, 0x31, 0x00, 0x00, 0x80, 0x2e, + 0x00, 0x00, 0x47, 0x2d, 0x00, 0x00, 0x46, 0x2c, 0x00, 0x00, 0x45, 0x2b, + 0x00, 0x00, 0x44, 0x2a, 0x00, 0x00, 0x43, 0x29, 0x00, 0x00, 0x42, 0x27, + 0x00, 0x00, 0x80, 0x26, 0x00, 0x00, 0x80, 0x25, 0x00, 0x00, 0x41, 0x23, + 0x00, 0x00, 0x40, 0x1f, 0x00, 0x00, 0x3f, 0x1e, 0x00, 0x00, 0x3e, 0x1d, + 0x00, 0x00, 0x3d, 0x1b, 0x00, 0x00, 0x3c, 0x18, 0x00, 0x00, 0x80, 0x17, + 0x00, 0x00, 0x80, 0x10, 0x00, 0x00, 0x3b, 0x0f, 0x00, 0x00, 0x3a, 0x08, + 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x39, 0x02, 0x00, 0x00, 0x80, 0x01, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x33, 0x00, + 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x2f, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x2d, 0x00, + 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x28, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x26, 0x00, + 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x23, 0x00, + 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x1f, 0x00, + 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x1b, 0x00, + 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x19, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x17, 0x00, + 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x12, 0x00, + 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0f, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x00, + 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0b, 0x00, + 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x04, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x49, 0x2f, 0x40, 0x16, + 0x1c, 0x01, 0xf0, 0x00, 0x83, 0xa0, 0xac, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x83, 0xa0, 0x05, 0x80, 0x00, 0x10, 0xac, 0x71, 0x04, 0x00, 0x00, 0x0c, + 0x49, 0x2f, 0xc8, 0x57, 0x81, 0x2e, 0x59, 0xc0, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x83, 0x2c, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x30, 0x04, 0x01, 0xf0, 0x0f, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x83, 0xe0, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x50, 0x50, 0x00, 0x00, 0x80, 0x50, 0xa0, 0x00, 0x50, 0x50, 0x08, 0x00, + 0x90, 0x04, 0x09, 0xc0, 0x80, 0x04, 0x05, 0x40, 0x44, 0x00, 0xa8, 0x00, + 0x80, 0x50, 0xa0, 0x00, 0x80, 0x54, 0xa8, 0x00, 0x80, 0x58, 0xb0, 0x40, + 0x04, 0x02, 0x07, 0xf7, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xa0, 0x02, 0x06, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x7f, 0x04, 0x02, 0x10, 0xc8, + 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x1e, 0x8d, 0x00, 0x10, 0x1e, 0xcd, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1f, 0x17, 0x00, 0x10, 0x1f, 0x39, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0x8d, 0x00, 0x10, 0x1f, 0x5b, + 0x00, 0x10, 0x1f, 0x6c, 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, + 0x00, 0x10, 0x1f, 0x79, 0x00, 0x10, 0x1f, 0x91, 0x00, 0x10, 0x1f, 0xa9, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1f, 0xd8, 0x00, 0x10, 0x20, 0x0a, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x20, 0x33, 0x00, 0x10, 0x1e, 0xcd, + 0x00, 0x10, 0x20, 0x8e, 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x20, 0xa5, + 0x00, 0x10, 0x20, 0xd6, 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, + 0x00, 0x10, 0x21, 0x0b, 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x21, 0x5d, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x21, 0x62, 0x00, 0x10, 0x21, 0xe6, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x21, 0xed, 0x00, 0x10, 0x1e, 0xcd, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x21, 0xef, 0x00, 0x10, 0x22, 0x6d, + 0x00, 0x10, 0x23, 0xad, 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, + 0x00, 0x10, 0x23, 0xbc, 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x23, 0xd9, + 0x00, 0x10, 0x24, 0x2c, 0x00, 0x10, 0x24, 0x88, 0x00, 0x10, 0x24, 0x9b, + 0x00, 0x10, 0x24, 0xb9, 0x00, 0x10, 0x26, 0xfd, 0x00, 0x10, 0x2a, 0x86, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, + 0x00, 0x10, 0x2b, 0xc5, 0x00, 0x10, 0x2c, 0x39, 0x00, 0x10, 0x1e, 0xcd, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x2c, 0xa7, 0x00, 0x10, 0x1e, 0xcd, + 0x00, 0x10, 0x2d, 0x45, 0x00, 0x10, 0x2d, 0xf5, 0x00, 0x10, 0x1e, 0xcd, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x2e, 0x2c, 0x00, 0x10, 0x2e, 0x84, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x2e, 0xdc, 0x00, 0x10, 0x30, 0x42, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x30, 0x56, 0x00, 0x10, 0x30, 0xe1, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x31, 0x51, 0x00, 0x10, 0x31, 0x55, + 0x00, 0x10, 0x31, 0x74, 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x32, 0x16, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x32, 0x43, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x32, 0x72, 0x00, 0x10, 0x1e, 0xcd, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x32, 0xd7, 0x00, 0x10, 0x34, 0x30, + 0x00, 0x10, 0x34, 0x8d, 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x34, 0xf3, + 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x1e, 0xcd, 0x00, 0x10, 0x35, 0x48, + 0x00, 0x10, 0x35, 0xda, 0x00, 0x10, 0x1e, 0xcd, 0x48, 0xef, 0xc8, 0x57, + 0x40, 0x31, 0xd8, 0x00, 0x58, 0xef, 0x40, 0x0b, 0x58, 0xec, 0x00, 0x02, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x45, + 0x48, 0xef, 0xc8, 0x57, 0x4a, 0x03, 0x42, 0x06, 0x00, 0x00, 0x40, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xcb, 0x83, 0xa0, 0x05, 0x80, + 0x00, 0x10, 0xac, 0x71, 0x04, 0x00, 0x00, 0x0d, 0x58, 0xee, 0x58, 0x0a, + 0x4d, 0x2c, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x56, 0x41, 0xa2, 0x58, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x2e, 0x40, 0xee, 0x58, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x2e, 0x5c, 0x02, 0x58, 0x00, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x04, 0x02, 0x60, 0x07, + 0x59, 0xa0, 0x00, 0x1d, 0x84, 0x00, 0x05, 0x42, 0x48, 0x03, 0x40, 0x1d, + 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x1e, 0xa1, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0xa0, 0x02, 0x06, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x40, 0x00, + 0x04, 0x00, 0x00, 0x06, 0x90, 0x00, 0x01, 0xc0, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x11, 0x48, 0x03, 0xc0, 0x11, 0x04, 0x01, 0xf0, 0x05, + 0x90, 0x00, 0x01, 0xc0, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x10, + 0x48, 0x03, 0xc0, 0x11, 0x04, 0x01, 0xf8, 0x44, 0x59, 0xe0, 0x00, 0x17, + 0x8c, 0x00, 0x05, 0x08, 0x04, 0x02, 0x00, 0x0c, 0x42, 0x03, 0xe0, 0x00, + 0x30, 0x00, 0x00, 0x01, 0x42, 0x03, 0xe0, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x40, 0xee, 0x58, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x2e, + 0x59, 0xa0, 0x00, 0x1d, 0x84, 0x00, 0x05, 0x04, 0x48, 0x03, 0x40, 0x1d, + 0x1c, 0x01, 0xf0, 0x00, 0x4a, 0x03, 0xc0, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x59, 0xa0, 0x02, 0x06, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x40, 0x00, + 0x04, 0x00, 0x07, 0xf0, 0x4a, 0x03, 0xc0, 0x17, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf7, 0xed, 0x48, 0x03, 0xc8, 0x56, 0x4a, 0x03, 0x42, 0x06, + 0x00, 0x00, 0x40, 0x01, 0x04, 0x01, 0xf7, 0xc0, 0x48, 0x03, 0xc8, 0x56, + 0x4a, 0x03, 0x42, 0x06, 0x00, 0x00, 0x40, 0x02, 0x04, 0x01, 0xf7, 0xbc, + 0x48, 0x03, 0xc8, 0x56, 0x4a, 0x03, 0x42, 0x06, 0x00, 0x00, 0x40, 0x03, + 0x04, 0x01, 0xf7, 0xb8, 0x48, 0x03, 0xc8, 0x56, 0x4a, 0x03, 0x42, 0x06, + 0x00, 0x00, 0x40, 0x05, 0x04, 0x01, 0xf7, 0xb4, 0x48, 0x03, 0xc8, 0x56, + 0x4a, 0x03, 0x42, 0x06, 0x00, 0x00, 0x40, 0x06, 0x04, 0x01, 0xf7, 0xb0, + 0x48, 0x03, 0xc8, 0x56, 0x4a, 0x03, 0x42, 0x06, 0x00, 0x00, 0x40, 0x0b, + 0x04, 0x01, 0xf7, 0xac, 0x48, 0x03, 0xc8, 0x56, 0x4a, 0x03, 0x42, 0x06, + 0x00, 0x00, 0x40, 0x0c, 0x04, 0x01, 0xf7, 0xa8, 0x48, 0x03, 0xc8, 0x56, + 0x4a, 0x03, 0x42, 0x06, 0x00, 0x00, 0x40, 0x0c, 0x04, 0x01, 0xf7, 0xa4, + 0x58, 0xec, 0xa8, 0x0a, 0x80, 0x54, 0xa9, 0xc0, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x83, 0xa0, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x82, 0x54, 0xac, 0x00, 0x00, 0x00, 0x00, 0x06, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x0d, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0xa3, 0x30, + 0x59, 0xa0, 0x02, 0x06, 0x48, 0x03, 0xc8, 0x57, 0x59, 0xa0, 0x04, 0x06, + 0x48, 0x03, 0xc8, 0x57, 0x59, 0xa0, 0x02, 0x07, 0x48, 0x03, 0xc8, 0x57, + 0x59, 0xa0, 0x04, 0x07, 0x48, 0x03, 0xc8, 0x57, 0x59, 0xa0, 0x02, 0x08, + 0x48, 0x03, 0xc8, 0x57, 0x59, 0xa0, 0x04, 0x08, 0x48, 0x03, 0xc8, 0x57, + 0x59, 0xa0, 0x02, 0x09, 0x48, 0x03, 0xc8, 0x57, 0x83, 0xe0, 0xac, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x83, 0xa0, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x50, 0x50, 0x00, 0x00, + 0x44, 0x00, 0xa8, 0x00, 0x80, 0x54, 0xa8, 0x00, 0x90, 0x00, 0x01, 0xc0, + 0x44, 0x00, 0xa8, 0x00, 0x80, 0x54, 0xa8, 0x00, 0x80, 0x50, 0xa0, 0x00, + 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xf8, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0xa0, 0x04, 0x06, 0x80, 0x00, 0x00, 0xc2, 0x59, 0xa0, 0x0a, 0x07, + 0x90, 0x04, 0x09, 0xc0, 0x80, 0x04, 0x05, 0x40, 0x84, 0x00, 0x05, 0x40, + 0x59, 0xa0, 0x0c, 0x07, 0x8c, 0x04, 0x0d, 0x00, 0x04, 0x00, 0x00, 0x18, + 0x59, 0xa8, 0x08, 0x6c, 0x8c, 0x04, 0x0d, 0x00, 0x04, 0x02, 0x07, 0xbb, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x64, 0x80, 0x04, 0x08, 0x40, + 0x04, 0x00, 0x00, 0x07, 0x4a, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x40, 0x00, 0x00, 0x00, 0x59, 0x80, 0x10, 0x00, 0x8c, 0x08, 0x15, 0x00, + 0x04, 0x00, 0x07, 0xf9, 0x04, 0x00, 0x00, 0x05, 0x48, 0x03, 0x00, 0x04, + 0x4a, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf7, 0x5c, + 0x4a, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x07, 0xa3, 0x48, 0x03, 0x88, 0x0e, + 0x04, 0x01, 0xf7, 0x55, 0x59, 0xa0, 0x04, 0x06, 0x80, 0x00, 0x00, 0xc2, + 0x59, 0xa0, 0x0c, 0x07, 0x8c, 0x04, 0x0d, 0x00, 0x04, 0x00, 0x00, 0x1a, + 0x59, 0xa8, 0x08, 0x6c, 0x8c, 0x04, 0x0d, 0x00, 0x04, 0x02, 0x07, 0x9d, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x64, 0x80, 0x04, 0x08, 0x40, + 0x04, 0x00, 0x00, 0x07, 0x4a, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x40, 0x00, 0x00, 0x00, 0x59, 0x80, 0x10, 0x00, 0x8c, 0x08, 0x15, 0x00, + 0x04, 0x00, 0x07, 0xf9, 0x04, 0x00, 0x00, 0x07, 0x48, 0x03, 0x00, 0x04, + 0x59, 0x80, 0x08, 0x05, 0x48, 0x07, 0x44, 0x06, 0x4a, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf7, 0x3c, 0x4a, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x00, 0x07, 0x83, 0x48, 0x03, 0x88, 0x0e, 0x59, 0xc4, 0x08, 0x0f, + 0x48, 0x07, 0x44, 0x06, 0x04, 0x01, 0xf7, 0x33, 0x59, 0xa0, 0x1c, 0x06, + 0x59, 0xa0, 0x02, 0x07, 0x90, 0x0c, 0x19, 0xc0, 0x80, 0x0c, 0x1d, 0x40, + 0x58, 0x0c, 0x08, 0x03, 0x80, 0x00, 0x05, 0x80, 0x50, 0x0c, 0x10, 0x00, + 0x80, 0x08, 0x04, 0x00, 0x80, 0x0c, 0x18, 0x00, 0x80, 0x04, 0x08, 0x40, + 0x04, 0x02, 0x07, 0xfc, 0x48, 0x03, 0x44, 0x06, 0x90, 0x00, 0x01, 0xc0, + 0x48, 0x03, 0x42, 0x07, 0x80, 0x00, 0x01, 0xc0, 0x04, 0x00, 0x07, 0x23, + 0x04, 0x01, 0xf7, 0x6a, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x04, + 0x4a, 0x03, 0x42, 0x07, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x03, 0x44, 0x07, + 0x00, 0x00, 0x00, 0x17, 0x59, 0xa8, 0x00, 0x0c, 0x48, 0x03, 0x42, 0x08, + 0x90, 0x00, 0x01, 0xc0, 0x48, 0x03, 0x44, 0x08, 0x4a, 0x03, 0x42, 0x09, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf7, 0x15, 0x59, 0xa0, 0x04, 0x07, + 0x59, 0xa0, 0x12, 0x07, 0x90, 0x08, 0x11, 0xc0, 0x80, 0x08, 0x15, 0x40, + 0x59, 0xa0, 0x04, 0x09, 0x59, 0xa0, 0x1a, 0x09, 0x90, 0x0c, 0x19, 0xc0, + 0x80, 0x0c, 0x1d, 0x40, 0x59, 0xa0, 0x0a, 0x08, 0x59, 0xa0, 0x04, 0x08, + 0x90, 0x04, 0x09, 0xc0, 0x80, 0x04, 0x0d, 0x40, 0x59, 0xa0, 0x02, 0x0a, + 0x82, 0x00, 0x24, 0x80, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x17, 0x55, + 0x59, 0xa0, 0x24, 0x06, 0x90, 0x00, 0x01, 0xc0, 0x80, 0x10, 0x05, 0x40, + 0x59, 0xa8, 0x28, 0x0c, 0x80, 0x14, 0x24, 0x80, 0x04, 0x00, 0x17, 0x4f, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x36, 0xda, 0x59, 0xa0, 0x04, 0x07, + 0x59, 0xa0, 0x12, 0x07, 0x90, 0x08, 0x11, 0xc0, 0x80, 0x08, 0x15, 0x40, + 0x59, 0xa0, 0x04, 0x09, 0x59, 0xa0, 0x1a, 0x09, 0x90, 0x0c, 0x19, 0xc0, + 0x80, 0x0c, 0x1d, 0x40, 0x59, 0xa0, 0x0a, 0x08, 0x59, 0xa0, 0x04, 0x08, + 0x90, 0x04, 0x09, 0xc0, 0x80, 0x04, 0x0d, 0x40, 0x59, 0xa0, 0x02, 0x0a, + 0x82, 0x00, 0x24, 0x80, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x17, 0x3d, + 0x59, 0xa0, 0x24, 0x06, 0x90, 0x00, 0x01, 0xc0, 0x80, 0x10, 0x05, 0x40, + 0x59, 0xa8, 0x28, 0x0c, 0x80, 0x14, 0x24, 0x80, 0x04, 0x00, 0x17, 0x37, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x36, 0xdd, 0x59, 0xa0, 0x24, 0x07, + 0x59, 0xa0, 0x02, 0x07, 0x90, 0x10, 0x21, 0xc0, 0x80, 0x10, 0x25, 0x40, + 0x59, 0xa0, 0x1a, 0x0a, 0x59, 0xa0, 0x04, 0x06, 0x90, 0x0c, 0x19, 0xc0, + 0x80, 0x0c, 0x1d, 0x40, 0x41, 0x78, 0x10, 0x00, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x50, 0x00, 0x00, 0x00, 0x82, 0x00, 0x04, 0x80, + 0x24, 0x32, 0x00, 0x01, 0x04, 0x00, 0x10, 0x16, 0x82, 0x0c, 0x05, 0x80, + 0x00, 0x00, 0x7c, 0x00, 0x04, 0x00, 0x00, 0x13, 0x82, 0x0c, 0x04, 0x80, + 0x00, 0x00, 0x7a, 0x00, 0x04, 0x00, 0x10, 0x10, 0x82, 0x0c, 0x04, 0x80, + 0x00, 0x00, 0x7c, 0xff, 0x04, 0x02, 0x10, 0x0d, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x64, 0x80, 0x04, 0x08, 0x40, 0x04, 0x00, 0x00, 0x07, + 0x4a, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, + 0x59, 0x80, 0x00, 0x00, 0x8c, 0x00, 0x05, 0x00, 0x04, 0x00, 0x07, 0xf9, + 0x04, 0x00, 0x00, 0x08, 0x80, 0x08, 0x10, 0x00, 0x44, 0x10, 0x18, 0x00, + 0x80, 0x08, 0x11, 0xc0, 0x04, 0x00, 0x06, 0xbe, 0x4a, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf6, 0xbb, 0x4a, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x01, 0xf7, 0x02, 0x59, 0xa0, 0x1a, 0x0a, 0x59, 0xa0, 0x04, 0x06, + 0x90, 0x0c, 0x19, 0xc0, 0x80, 0x0c, 0x1d, 0x40, 0x41, 0x78, 0x10, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x82, 0x00, 0x04, 0x80, 0x24, 0x32, 0x00, 0x01, 0x04, 0x00, 0x10, 0x16, + 0x82, 0x0c, 0x05, 0x80, 0x00, 0x00, 0x7c, 0x00, 0x04, 0x00, 0x00, 0x13, + 0x82, 0x0c, 0x04, 0x80, 0x00, 0x00, 0x7a, 0x00, 0x04, 0x00, 0x10, 0x10, + 0x82, 0x0c, 0x04, 0x80, 0x00, 0x00, 0x7c, 0xff, 0x04, 0x02, 0x10, 0x0d, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x64, 0x80, 0x04, 0x08, 0x40, + 0x04, 0x00, 0x00, 0x07, 0x4a, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x40, 0x00, 0x00, 0x00, 0x59, 0x80, 0x00, 0x00, 0x8c, 0x00, 0x05, 0x00, + 0x04, 0x00, 0x07, 0xf9, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x08, 0x10, 0x00, + 0x50, 0x0c, 0x00, 0x00, 0x82, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x48, 0x07, 0x42, 0x07, 0x82, 0x00, 0x0d, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x90, 0x04, 0x09, 0xc0, 0x48, 0x07, 0x44, 0x07, 0x80, 0x08, 0x11, 0xc0, + 0x04, 0x00, 0x06, 0x8c, 0x4a, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf6, 0x89, 0x4a, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x04, 0x04, 0x01, 0xf6, 0xd0, + 0x59, 0xa0, 0x04, 0x06, 0x8c, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x20, + 0x59, 0xa0, 0x12, 0x07, 0x59, 0xa0, 0x1c, 0x07, 0x59, 0xa0, 0x22, 0x08, + 0x48, 0x0b, 0x50, 0x51, 0x48, 0x0f, 0x50, 0x52, 0x48, 0x13, 0x50, 0x53, + 0x59, 0xc4, 0x08, 0x01, 0x82, 0x04, 0x0d, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x80, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x40, 0x08, 0x00, 0x00, + 0x04, 0x01, 0xf0, 0x04, 0x40, 0x0c, 0x00, 0x00, 0x04, 0x01, 0xf0, 0x02, + 0x40, 0x10, 0x00, 0x00, 0x80, 0x00, 0x01, 0x10, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0xa5, + 0x04, 0x01, 0xf0, 0x07, 0x59, 0xa8, 0x10, 0x51, 0x59, 0xa8, 0x18, 0x52, + 0x59, 0xa8, 0x20, 0x53, 0x48, 0x0b, 0x42, 0x07, 0x48, 0x0f, 0x44, 0x07, + 0x48, 0x13, 0x42, 0x08, 0x04, 0x01, 0xf6, 0x5b, 0x4d, 0x2c, 0x00, 0x00, + 0x4d, 0x34, 0x00, 0x00, 0x4d, 0x30, 0x00, 0x00, 0x4d, 0x44, 0x00, 0x00, + 0x59, 0xa2, 0x8c, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, + 0x04, 0x00, 0x00, 0x06, 0x5c, 0x02, 0x88, 0x00, 0x5c, 0x02, 0x60, 0x00, + 0x5c, 0x02, 0x68, 0x00, 0x5c, 0x02, 0x58, 0x00, 0x04, 0x01, 0xf6, 0x9e, + 0x59, 0xa0, 0x44, 0x07, 0x59, 0xa0, 0x02, 0x07, 0x90, 0x00, 0x01, 0xc0, + 0x80, 0x20, 0x45, 0x40, 0x04, 0x01, 0xf8, 0x1e, 0x04, 0x00, 0x00, 0x09, + 0x4a, 0x03, 0x42, 0x08, 0x00, 0x00, 0x00, 0x01, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0xff, 0xff, 0x4a, 0x03, 0x42, 0x07, 0x00, 0x00, 0xff, 0xff, + 0x49, 0x7b, 0x44, 0x07, 0x04, 0x01, 0xf0, 0x0b, 0x04, 0x01, 0xf8, 0x22, + 0x04, 0x00, 0x00, 0x0e, 0x4a, 0x03, 0x42, 0x08, 0x00, 0x00, 0x00, 0x02, + 0x59, 0x30, 0x04, 0x02, 0x48, 0x03, 0x44, 0x06, 0x59, 0x30, 0x02, 0x02, + 0x48, 0x03, 0x42, 0x07, 0x59, 0x30, 0x02, 0x06, 0x48, 0x03, 0x44, 0x07, + 0x5c, 0x02, 0x88, 0x00, 0x5c, 0x02, 0x60, 0x00, 0x5c, 0x02, 0x68, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x04, 0x01, 0xf6, 0x31, 0x5c, 0x02, 0x88, 0x00, + 0x5c, 0x02, 0x60, 0x00, 0x5c, 0x02, 0x68, 0x00, 0x5c, 0x02, 0x58, 0x00, + 0x04, 0x01, 0xf6, 0x78, 0x49, 0x37, 0xc8, 0x56, 0x48, 0x23, 0xc8, 0x56, + 0x4d, 0x2c, 0x00, 0x00, 0x59, 0x34, 0x00, 0x0f, 0x80, 0x02, 0x5d, 0x40, + 0x04, 0x00, 0x00, 0x07, 0x59, 0x2c, 0x00, 0x05, 0x80, 0x20, 0x05, 0x80, + 0x59, 0x2c, 0x00, 0x00, 0x04, 0x02, 0x07, 0xfb, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x23, 0xc8, 0x57, 0x4d, 0x2c, 0x00, 0x00, 0x42, 0x02, 0x60, 0x00, + 0x00, 0x10, 0xd8, 0xd4, 0x59, 0x30, 0x04, 0x06, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x04, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x06, 0x04, 0x02, 0x00, 0x07, 0x59, 0x32, 0x58, 0x08, + 0x81, 0x2e, 0x59, 0xc0, 0x04, 0x00, 0x00, 0x04, 0x59, 0x2c, 0x00, 0x05, + 0x80, 0x20, 0x05, 0x80, 0x04, 0x00, 0x00, 0x0a, 0x83, 0x32, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x24, 0x59, 0xa8, 0x00, 0x0a, 0x81, 0x30, 0x04, 0x80, + 0x04, 0x00, 0x17, 0xef, 0x41, 0x7a, 0x60, 0x00, 0x80, 0x00, 0x05, 0x80, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x83, 0xa0, 0x05, 0x80, 0x00, 0x10, 0xac, 0x71, 0x04, 0x02, 0x06, 0x3d, + 0x59, 0xa8, 0x00, 0x6c, 0x8c, 0x00, 0x05, 0x00, 0x04, 0x02, 0x00, 0x03, + 0x4a, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x03, 0x42, 0x06, + 0x00, 0x00, 0x40, 0x00, 0x4a, 0x03, 0xc0, 0x11, 0x40, 0x00, 0x00, 0x10, + 0x04, 0x01, 0xfe, 0x5f, 0x59, 0xe0, 0x00, 0x17, 0x8c, 0x00, 0x05, 0x08, + 0x04, 0x00, 0x00, 0x03, 0x4a, 0x03, 0xc0, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x42, 0x03, 0xe0, 0x00, 0x30, 0x00, 0x00, 0x01, 0x42, 0x03, 0xe0, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf0, 0x00, 0x59, 0xa0, 0x0c, 0x06, + 0x80, 0x04, 0x09, 0xc0, 0x04, 0x00, 0x00, 0x07, 0x83, 0x6c, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x1a, 0x04, 0x01, 0xf6, 0x2c, 0x42, 0x00, 0x70, 0x00, + 0x00, 0x10, 0xad, 0x10, 0x58, 0x38, 0x1c, 0x01, 0x58, 0x38, 0x22, 0x01, + 0x8c, 0x04, 0x0d, 0x00, 0x04, 0x00, 0x00, 0x0b, 0x59, 0xa0, 0x12, 0x07, + 0x82, 0x08, 0x05, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x04, 0x02, 0x06, 0x26, + 0x82, 0x08, 0x04, 0x80, 0x00, 0x00, 0x08, 0x41, 0x04, 0x02, 0x16, 0x23, + 0x82, 0x08, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x16, 0x20, + 0x8c, 0x04, 0x0d, 0x06, 0x04, 0x00, 0x00, 0x03, 0x4a, 0x03, 0x78, 0xe4, + 0x00, 0x0c, 0x00, 0x00, 0x8c, 0x04, 0x0d, 0x04, 0x04, 0x00, 0x00, 0x04, + 0x59, 0xe0, 0x00, 0x02, 0x84, 0x00, 0x05, 0x48, 0x48, 0x03, 0xc0, 0x02, + 0x8c, 0x04, 0x0d, 0x02, 0x04, 0x00, 0x00, 0x05, 0x42, 0x00, 0x28, 0x00, + 0x00, 0x00, 0x76, 0x00, 0x4a, 0x00, 0x28, 0x05, 0xd0, 0x00, 0x00, 0x00, + 0x40, 0x04, 0x00, 0x00, 0x80, 0x0c, 0x05, 0x40, 0x48, 0x00, 0x74, 0x01, + 0x8c, 0x04, 0x0d, 0x00, 0x04, 0x00, 0x00, 0x02, 0x48, 0x08, 0x72, 0x01, + 0x48, 0x0f, 0x44, 0x06, 0x48, 0x13, 0x42, 0x07, 0x04, 0x01, 0xf5, 0xb8, + 0x4d, 0x44, 0x00, 0x00, 0x4d, 0x34, 0x00, 0x00, 0x59, 0xa2, 0x8c, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, 0x04, 0x02, 0x00, 0x09, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x25, 0x04, 0x00, 0x00, 0x09, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x09, 0x5c, 0x02, 0x68, 0x00, + 0x5c, 0x02, 0x88, 0x00, 0x04, 0x01, 0xf5, 0xf6, 0x5c, 0x02, 0x68, 0x00, + 0x5c, 0x02, 0x88, 0x00, 0x04, 0x01, 0xf5, 0xf7, 0x59, 0xa0, 0x12, 0x07, + 0x59, 0xa0, 0x1c, 0x07, 0x59, 0x34, 0x40, 0x0a, 0x82, 0x20, 0x3d, 0x00, + 0x00, 0x00, 0xe0, 0x00, 0x80, 0x1c, 0x39, 0x1a, 0x8c, 0x08, 0x15, 0x00, + 0x04, 0x00, 0x00, 0x19, 0x82, 0x0c, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x04, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x07, 0xeb, + 0x82, 0x20, 0x45, 0x00, 0xff, 0xff, 0x1f, 0xff, 0x80, 0x04, 0x00, 0xda, + 0x80, 0x20, 0x05, 0x40, 0x48, 0x02, 0x68, 0x0a, 0x4c, 0x1c, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x76, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x49, 0xfd, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x63, + 0x5c, 0x00, 0x38, 0x00, 0x48, 0x1f, 0x44, 0x07, 0x5c, 0x02, 0x68, 0x00, + 0x5c, 0x02, 0x88, 0x00, 0x04, 0x01, 0xf5, 0x83, 0x8d, 0x0e, 0x1d, 0x0e, + 0x04, 0x00, 0x00, 0x04, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf5, 0xca, 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x02, 0x00, 0x10, 0x59, 0xa8, 0x00, 0x0f, 0x49, 0x7b, 0x44, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x00, 0x00, 0x0f, + 0x82, 0x00, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x02, 0x00, 0x0c, + 0x82, 0x00, 0x0c, 0x00, 0x00, 0x10, 0x1c, 0xdd, 0x50, 0x04, 0x08, 0x00, + 0x80, 0x04, 0x09, 0x10, 0x82, 0x04, 0x15, 0x80, 0x00, 0x00, 0x00, 0x80, + 0x04, 0x02, 0x00, 0x04, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x07, + 0x04, 0x01, 0xf5, 0xb5, 0x48, 0x07, 0x44, 0x06, 0x82, 0x00, 0x0d, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x48, 0x07, 0x42, 0x07, 0x80, 0x00, 0x01, 0x20, + 0x48, 0x03, 0x44, 0x07, 0x59, 0xa8, 0x00, 0x23, 0x82, 0x00, 0x15, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x48, 0x0b, 0x44, 0x09, 0x8c, 0x00, 0x05, 0x02, + 0x04, 0x00, 0x00, 0x1f, 0x8c, 0x00, 0x05, 0x06, 0x04, 0x00, 0x00, 0x09, + 0x82, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x82, 0x04, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x0a, 0x04, 0x02, 0x00, 0x04, 0x4a, 0x03, 0x42, 0x09, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x22, 0x8c, 0x00, 0x05, 0x0a, + 0x04, 0x00, 0x00, 0x09, 0x82, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x22, + 0x82, 0x04, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x22, 0x04, 0x02, 0x00, 0x04, + 0x4a, 0x03, 0x42, 0x09, 0x00, 0x00, 0x00, 0x03, 0x04, 0x01, 0xf0, 0x18, + 0x8c, 0x00, 0x05, 0x08, 0x04, 0x00, 0x00, 0x09, 0x82, 0x00, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x12, 0x82, 0x04, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x12, + 0x04, 0x02, 0x00, 0x04, 0x4a, 0x03, 0x42, 0x09, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x01, 0xf0, 0x0e, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, + 0x04, 0x02, 0x00, 0x04, 0x4a, 0x03, 0x42, 0x09, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x01, 0xf5, 0x39, 0x8c, 0x00, 0x05, 0x06, 0x04, 0x00, 0x00, 0x04, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x05, 0x04, 0x01, 0xf5, 0x80, + 0x4a, 0x03, 0x42, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf5, 0x31, + 0x59, 0xa8, 0x00, 0x34, 0x48, 0x03, 0x44, 0x07, 0x59, 0xa8, 0x00, 0x35, + 0x48, 0x03, 0x42, 0x09, 0x04, 0x01, 0xf5, 0x2c, 0x42, 0x00, 0x78, 0x00, + 0x00, 0x10, 0xb0, 0xbb, 0x59, 0xa0, 0x04, 0x06, 0x48, 0x03, 0xc8, 0x57, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x07, 0x04, 0x02, 0x15, 0x75, + 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x21, 0x71, 0x00, 0x10, 0x21, 0x72, + 0x00, 0x10, 0x21, 0x80, 0x00, 0x10, 0x21, 0x93, 0x00, 0x10, 0x21, 0xb4, + 0x00, 0x10, 0x21, 0xda, 0x00, 0x10, 0x21, 0x71, 0x04, 0x01, 0xf5, 0x6c, + 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x05, 0x65, + 0x59, 0xa0, 0x0a, 0x07, 0x59, 0xa0, 0x04, 0x07, 0x90, 0x00, 0x01, 0xc0, + 0x80, 0x04, 0x0d, 0x40, 0x48, 0x07, 0xc8, 0x57, 0x59, 0xa0, 0x0a, 0x08, + 0x59, 0xa0, 0x04, 0x08, 0x90, 0x00, 0x01, 0xc0, 0x80, 0x04, 0x0d, 0x40, + 0x48, 0x07, 0xc8, 0x57, 0x04, 0x01, 0xf0, 0x5a, 0x83, 0x6c, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x05, 0x57, 0x59, 0xa0, 0x04, 0x07, + 0x59, 0xa0, 0x12, 0x07, 0x90, 0x00, 0x01, 0xc0, 0x80, 0x08, 0x15, 0x40, + 0x59, 0xa0, 0x04, 0x08, 0x59, 0xa0, 0x1a, 0x08, 0x90, 0x00, 0x01, 0xc0, + 0x80, 0x0c, 0x1d, 0x40, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb9, 0x8e, + 0x48, 0x0f, 0xc8, 0x57, 0x48, 0x0b, 0xc8, 0x57, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x36, 0xdd, + 0x59, 0xa0, 0x0a, 0x07, 0x59, 0xa0, 0x04, 0x07, 0x90, 0x00, 0x01, 0xc0, + 0x80, 0x04, 0x1d, 0x40, 0x82, 0x0c, 0x0c, 0x80, 0x00, 0x10, 0xa3, 0x63, + 0x04, 0x02, 0x15, 0x44, 0x82, 0x0c, 0x0c, 0x80, 0x00, 0x10, 0x00, 0x00, + 0x04, 0x00, 0x15, 0x41, 0x48, 0x0f, 0xc8, 0x57, 0x82, 0x3c, 0x7c, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x50, 0x3c, 0x08, 0x00, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x00, 0x00, 0x06, 0x82, 0x3c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0d, + 0x04, 0x00, 0x05, 0x38, 0x80, 0x3c, 0x78, 0x00, 0x04, 0x01, 0xf7, 0xf9, + 0x59, 0xe4, 0x10, 0x01, 0x82, 0x08, 0x0d, 0x00, 0xff, 0xfe, 0xff, 0xcf, + 0x48, 0x07, 0xc8, 0x01, 0x44, 0x0c, 0x78, 0x00, 0x46, 0x00, 0x18, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x80, 0x0c, 0x18, 0x00, 0x46, 0x00, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xdf, 0x48, 0x0b, 0xc8, 0x01, 0x04, 0x01, 0xf0, 0x26, + 0x59, 0xa0, 0x1a, 0x07, 0x59, 0xa0, 0x04, 0x07, 0x90, 0x00, 0x01, 0xc0, + 0x80, 0x0c, 0x1d, 0x40, 0x48, 0x0c, 0x78, 0x01, 0x59, 0xa0, 0x22, 0x08, + 0x59, 0xa0, 0x04, 0x08, 0x90, 0x00, 0x01, 0xc0, 0x80, 0x10, 0x25, 0x40, + 0x48, 0x10, 0x78, 0x02, 0x59, 0xa0, 0x02, 0x09, 0x80, 0x00, 0x00, 0x40, + 0x04, 0x00, 0x15, 0x1d, 0x48, 0x00, 0x78, 0x06, 0x80, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x78, 0x05, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x40, 0x00, 0x10, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x62, 0x98, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf5, 0x12, + 0x40, 0x04, 0x00, 0x00, 0x80, 0x0c, 0x1c, 0x00, 0x04, 0x00, 0x15, 0x0f, + 0x48, 0x0c, 0x78, 0x03, 0x48, 0x10, 0x78, 0x04, 0x49, 0x78, 0x78, 0x08, + 0x59, 0xa0, 0x04, 0x09, 0x48, 0x00, 0x78, 0x07, 0x59, 0xe4, 0x00, 0x01, + 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x05, 0x40, 0x00, 0x04, 0x00, 0x00, + 0x48, 0x03, 0xc8, 0x01, 0x04, 0x01, 0xf4, 0xb4, 0x49, 0x78, 0x78, 0x01, + 0x49, 0x78, 0x78, 0x02, 0x49, 0x78, 0x78, 0x06, 0x49, 0x78, 0x78, 0x05, + 0x49, 0x78, 0x78, 0x01, 0x49, 0x78, 0x78, 0x03, 0x49, 0x78, 0x78, 0x04, + 0x49, 0x78, 0x78, 0x08, 0x49, 0x78, 0x78, 0x07, 0x59, 0xe4, 0x00, 0x01, + 0x84, 0x00, 0x05, 0x24, 0x04, 0x01, 0xf7, 0xf3, 0x59, 0xa8, 0x00, 0x05, + 0x48, 0x03, 0x44, 0x06, 0x59, 0xa8, 0x00, 0x06, 0x48, 0x03, 0x42, 0x07, + 0x59, 0xa8, 0x00, 0x07, 0x48, 0x03, 0x44, 0x07, 0x04, 0x01, 0xf4, 0xa1, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x48, 0x03, 0xc8, 0x56, + 0x4a, 0x03, 0xc0, 0x13, 0x03, 0x80, 0x03, 0x00, 0x4a, 0x03, 0xc0, 0x14, + 0x03, 0x80, 0x03, 0x80, 0x59, 0xa0, 0x0c, 0x06, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0xa2, 0x04, 0x02, 0x00, 0x28, 0x59, 0xa0, 0x14, 0x0a, + 0x82, 0x08, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x04, 0x02, 0x10, 0x24, + 0x59, 0xa0, 0x02, 0x0b, 0x8c, 0x00, 0x05, 0x00, 0x04, 0x02, 0x00, 0x2b, + 0x59, 0xa0, 0x0a, 0x0a, 0x80, 0x04, 0x09, 0xc0, 0x04, 0x00, 0x00, 0x1e, + 0x82, 0x04, 0x04, 0x80, 0x00, 0x00, 0x00, 0x41, 0x04, 0x02, 0x10, 0x1b, + 0x82, 0x04, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x03, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0xfc, 0x80, 0x04, 0x09, 0x04, 0x59, 0xa0, 0x04, 0x07, + 0x59, 0xa0, 0x12, 0x07, 0x90, 0x08, 0x11, 0xc0, 0x80, 0x08, 0x15, 0x40, + 0x59, 0xa0, 0x04, 0x09, 0x59, 0xa0, 0x1a, 0x09, 0x90, 0x0c, 0x19, 0xc0, + 0x80, 0x0c, 0x1d, 0x40, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xb6, + 0x04, 0x02, 0x00, 0x06, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x02, + 0x4a, 0x03, 0xc0, 0x14, 0x03, 0x80, 0x00, 0x00, 0x04, 0x01, 0xf4, 0xbd, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xda, 0x4a, 0x01, 0xd8, 0x09, + 0x00, 0x10, 0x22, 0x25, 0x1c, 0x01, 0xf0, 0x00, 0x4a, 0x03, 0xc0, 0x14, + 0x03, 0x80, 0x00, 0x00, 0x04, 0x01, 0xf4, 0xb9, 0x40, 0x31, 0xd8, 0x00, + 0x58, 0xef, 0x40, 0x0b, 0x58, 0xee, 0x58, 0x0d, 0x58, 0xec, 0x00, 0x02, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0xa6, + 0x59, 0xa0, 0x0c, 0x06, 0x59, 0xa0, 0x14, 0x0a, 0x59, 0xa0, 0x02, 0x0b, + 0x8c, 0x00, 0x05, 0x00, 0x04, 0x02, 0x00, 0x31, 0x83, 0x2e, 0x5c, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x41, 0x78, 0x38, 0x00, 0x59, 0xa0, 0x4a, 0x0a, + 0x40, 0x1c, 0x00, 0x00, 0x81, 0x2c, 0x04, 0x00, 0x50, 0x00, 0x40, 0x00, + 0x82, 0x20, 0x1d, 0x00, 0x00, 0x00, 0x00, 0xff, 0x4c, 0x04, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0xaf, 0x5c, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x2d, + 0x80, 0x24, 0x48, 0x40, 0x04, 0x00, 0x00, 0x28, 0x80, 0x08, 0x10, 0x00, + 0x82, 0x20, 0x1d, 0x00, 0x00, 0x00, 0xff, 0x00, 0x80, 0x0c, 0x19, 0x10, + 0x4c, 0x04, 0x00, 0x00, 0x04, 0x01, 0xf8, 0xa5, 0x5c, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x23, 0x80, 0x24, 0x48, 0x40, 0x04, 0x00, 0x00, 0x1e, + 0x80, 0x08, 0x10, 0x00, 0x82, 0x20, 0x1d, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x80, 0x0c, 0x19, 0x20, 0x4c, 0x04, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x9b, + 0x5c, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x19, 0x80, 0x24, 0x48, 0x40, + 0x04, 0x00, 0x00, 0x14, 0x80, 0x08, 0x10, 0x00, 0x82, 0x20, 0x1d, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x80, 0x0c, 0x19, 0x30, 0x4c, 0x04, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x91, 0x5c, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x0f, + 0x80, 0x24, 0x48, 0x40, 0x04, 0x00, 0x00, 0x0a, 0x80, 0x08, 0x10, 0x00, + 0x80, 0x1c, 0x38, 0x00, 0x04, 0x01, 0xf7, 0xd5, 0x59, 0xa0, 0x02, 0x0a, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, 0x40, 0x00, 0x18, 0x00, + 0x04, 0x01, 0xf8, 0x85, 0x04, 0x00, 0x00, 0x04, 0x4a, 0x03, 0xc0, 0x14, + 0x03, 0x80, 0x00, 0x00, 0x04, 0x01, 0xf4, 0x24, 0x4a, 0x03, 0xc0, 0x14, + 0x03, 0x80, 0x00, 0x00, 0x04, 0x01, 0xf4, 0x6d, 0x48, 0x03, 0xc8, 0x56, + 0x4a, 0x03, 0xc0, 0x13, 0x03, 0x80, 0x03, 0x00, 0x4a, 0x03, 0xc0, 0x14, + 0x03, 0x80, 0x03, 0x80, 0x59, 0xa0, 0x0c, 0x06, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0xa2, 0x04, 0x02, 0x00, 0x6e, 0x59, 0xa0, 0x14, 0x0a, + 0x82, 0x08, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x04, 0x02, 0x10, 0x6a, + 0x59, 0xa0, 0x02, 0x0b, 0x8c, 0x00, 0x05, 0x00, 0x04, 0x02, 0x00, 0x5c, + 0x59, 0xa0, 0x1a, 0x0a, 0x80, 0x0c, 0x19, 0xc0, 0x04, 0x00, 0x00, 0x64, + 0x82, 0x0c, 0x04, 0x80, 0x00, 0x00, 0x00, 0x41, 0x04, 0x02, 0x10, 0x61, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xb6, 0x04, 0x02, 0x00, 0x06, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x02, 0x4a, 0x03, 0xc0, 0x14, + 0x03, 0x80, 0x00, 0x00, 0x04, 0x01, 0xf4, 0x4c, 0x83, 0x2e, 0x5c, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x41, 0x78, 0x38, 0x00, 0x59, 0xa0, 0x4a, 0x0a, + 0x40, 0x1c, 0x00, 0x00, 0x81, 0x2c, 0x04, 0x00, 0x40, 0x00, 0x40, 0x00, + 0x4c, 0x04, 0x00, 0x00, 0x4c, 0x08, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x77, + 0x5c, 0x00, 0x10, 0x00, 0x5c, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x48, + 0x44, 0x14, 0x40, 0x00, 0x80, 0x24, 0x48, 0x40, 0x04, 0x00, 0x00, 0x2b, + 0x80, 0x08, 0x10, 0x00, 0x4c, 0x04, 0x00, 0x00, 0x4c, 0x08, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x6d, 0x5c, 0x00, 0x10, 0x00, 0x5c, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x3e, 0x50, 0x20, 0x00, 0x00, 0x80, 0x14, 0x28, 0xd0, + 0x80, 0x14, 0x05, 0x40, 0x44, 0x00, 0x40, 0x00, 0x80, 0x24, 0x48, 0x40, + 0x04, 0x00, 0x00, 0x1e, 0x80, 0x08, 0x10, 0x00, 0x4c, 0x04, 0x00, 0x00, + 0x4c, 0x08, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x60, 0x5c, 0x00, 0x10, 0x00, + 0x5c, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x31, 0x50, 0x20, 0x00, 0x00, + 0x80, 0x14, 0x28, 0xe0, 0x80, 0x14, 0x05, 0x40, 0x44, 0x00, 0x40, 0x00, + 0x80, 0x24, 0x48, 0x40, 0x04, 0x00, 0x00, 0x11, 0x80, 0x08, 0x10, 0x00, + 0x4c, 0x04, 0x00, 0x00, 0x4c, 0x08, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x53, + 0x5c, 0x00, 0x10, 0x00, 0x5c, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x24, + 0x50, 0x20, 0x00, 0x00, 0x80, 0x14, 0x28, 0xf0, 0x80, 0x14, 0x05, 0x40, + 0x44, 0x00, 0x40, 0x00, 0x80, 0x24, 0x48, 0x40, 0x04, 0x00, 0x00, 0x04, + 0x80, 0x08, 0x10, 0x00, 0x80, 0x1c, 0x38, 0x00, 0x04, 0x01, 0xf7, 0xcb, + 0x59, 0xa0, 0x0a, 0x0a, 0x82, 0x04, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x80, 0x04, 0x09, 0x04, + 0x59, 0xa0, 0x04, 0x07, 0x59, 0xa0, 0x12, 0x07, 0x90, 0x08, 0x11, 0xc0, + 0x80, 0x08, 0x15, 0x40, 0x59, 0xa0, 0x04, 0x09, 0x59, 0xa0, 0x1a, 0x09, + 0x90, 0x0c, 0x19, 0xc0, 0x80, 0x0c, 0x1d, 0x40, 0x4a, 0x03, 0xc0, 0x14, + 0x03, 0x80, 0x00, 0x00, 0x41, 0x2c, 0x00, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x36, 0xdd, 0x04, 0x01, 0xf8, 0x33, 0x04, 0x00, 0x00, 0x06, + 0x48, 0x17, 0x44, 0x06, 0x4a, 0x03, 0xc0, 0x14, 0x03, 0x80, 0x00, 0x00, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0x8d, 0x4a, 0x03, 0xc0, 0x14, + 0x03, 0x80, 0x00, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x4a, 0x03, 0xc0, 0x14, 0x03, 0x80, 0x00, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xdd, 0x04, 0x01, 0xf8, 0x36, 0x04, 0x00, 0x00, 0x10, + 0x04, 0x01, 0xf8, 0x62, 0x04, 0x02, 0x00, 0x0f, 0x40, 0x08, 0x08, 0x00, + 0x04, 0x01, 0xf8, 0x5f, 0x04, 0x02, 0x00, 0x0c, 0x40, 0x0c, 0x08, 0x00, + 0x04, 0x01, 0xf8, 0x5c, 0x04, 0x02, 0x00, 0x09, 0x04, 0x01, 0xf8, 0x4b, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0d, 0x40, 0x80, 0x00, 0x00, 0x40, + 0x04, 0x02, 0x07, 0xff, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x1c, 0x01, 0xf0, 0x00, 0x04, 0x01, 0xf8, 0x43, 0x80, 0x00, 0x05, 0x80, + 0x04, 0x01, 0xf7, 0xfd, 0x04, 0x01, 0xf8, 0x21, 0x04, 0x00, 0x00, 0x0a, + 0x82, 0x04, 0x0d, 0x40, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf8, 0x4b, + 0x04, 0x02, 0x00, 0x07, 0x04, 0x01, 0xf8, 0x7e, 0x04, 0x01, 0xf8, 0x98, + 0x04, 0x01, 0xf8, 0x38, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x1c, 0x01, 0xf0, 0x00, 0x04, 0x01, 0xf8, 0x34, 0x80, 0x00, 0x05, 0x80, + 0x04, 0x01, 0xf7, 0xfd, 0x40, 0x04, 0x18, 0x00, 0x04, 0x01, 0xf8, 0x11, + 0x04, 0x00, 0x00, 0x0c, 0x04, 0x01, 0xf8, 0x3d, 0x04, 0x02, 0x00, 0x0b, + 0x40, 0x08, 0x08, 0x00, 0x04, 0x01, 0xf8, 0x3a, 0x04, 0x02, 0x00, 0x08, + 0x40, 0x0c, 0x08, 0x00, 0x04, 0x01, 0xff, 0xe8, 0x04, 0x00, 0x00, 0x04, + 0x04, 0x01, 0xf8, 0x26, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x1c, 0x01, 0xf0, 0x00, 0x04, 0x01, 0xf8, 0x22, 0x80, 0x00, 0x05, 0x80, + 0x04, 0x01, 0xf7, 0xfd, 0x4c, 0x04, 0x00, 0x00, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x64, 0x4a, 0x03, 0xc0, 0x13, 0x03, 0x80, 0x03, 0x00, + 0x80, 0x04, 0x08, 0x40, 0x04, 0x00, 0x00, 0x16, 0x59, 0xe0, 0x00, 0x13, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x03, 0x00, 0x04, 0x02, 0x07, 0xf7, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x64, 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x07, 0xff, + 0x4a, 0x03, 0xc0, 0x13, 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x64, 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x07, 0xff, + 0x4a, 0x03, 0xc0, 0x13, 0x02, 0x00, 0x00, 0x00, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x02, 0x80, 0x00, 0x05, 0x80, + 0x5c, 0x00, 0x08, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4a, 0x03, 0xc0, 0x13, + 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, + 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x07, 0xff, 0x4a, 0x03, 0xc0, 0x13, + 0x02, 0x00, 0x02, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, + 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x07, 0xff, 0x4a, 0x03, 0xc0, 0x13, + 0x01, 0x00, 0x01, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x80, 0x00, 0x00, 0xc2, 0x82, 0x00, 0x05, 0x40, 0x01, 0x00, 0x00, 0x00, + 0x48, 0x03, 0xc0, 0x13, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, + 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x07, 0xff, 0x4a, 0x03, 0xc0, 0x13, + 0x02, 0x00, 0x02, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, + 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x07, 0xff, 0x4a, 0x03, 0xc0, 0x13, + 0x02, 0x00, 0x00, 0x00, 0x80, 0x04, 0x08, 0xc2, 0x80, 0x10, 0x20, 0x40, + 0x04, 0x02, 0x07, 0xec, 0x4a, 0x03, 0xc0, 0x13, 0x01, 0x00, 0x01, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x80, 0x00, 0x00, 0x40, + 0x04, 0x02, 0x07, 0xff, 0x4a, 0x03, 0xc0, 0x13, 0x02, 0x00, 0x02, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x80, 0x00, 0x00, 0x40, + 0x04, 0x02, 0x07, 0xff, 0x59, 0xe0, 0x00, 0x13, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x4a, 0x03, 0xc0, 0x13, 0x02, 0x00, 0x00, 0x00, + 0x4c, 0x04, 0x00, 0x00, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x64, + 0x59, 0xe0, 0x00, 0x13, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x80, 0x04, 0x08, 0x40, 0x04, 0x00, 0x00, 0x03, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x02, 0x07, 0xfa, 0x80, 0x00, 0x05, 0x40, 0x5c, 0x00, 0x08, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4a, 0x03, 0xc0, 0x13, 0x01, 0x00, 0x01, 0x00, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x0d, 0x80, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x80, 0x00, 0x00, 0x40, + 0x04, 0x02, 0x07, 0xff, 0x4a, 0x03, 0xc0, 0x13, 0x02, 0x00, 0x02, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x80, 0x00, 0x00, 0x40, + 0x04, 0x02, 0x07, 0xff, 0x59, 0xe0, 0x00, 0x13, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x01, 0x10, 0x80, 0x04, 0x08, 0xc2, + 0x80, 0x04, 0x0d, 0x40, 0x4a, 0x03, 0xc0, 0x13, 0x02, 0x00, 0x00, 0x00, + 0x80, 0x08, 0x10, 0x40, 0x04, 0x02, 0x07, 0xed, 0x40, 0x04, 0x28, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4a, 0x03, 0xc0, 0x13, 0x01, 0x00, 0x01, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x80, 0x00, 0x00, 0x40, + 0x04, 0x02, 0x07, 0xff, 0x4a, 0x03, 0xc0, 0x13, 0x02, 0x00, 0x02, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x80, 0x00, 0x00, 0x40, + 0x04, 0x02, 0x07, 0xff, 0x4a, 0x03, 0xc0, 0x13, 0x02, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xa0, 0x04, 0x07, 0x59, 0xa8, 0x08, 0x34, + 0x48, 0x03, 0x50, 0x34, 0x48, 0x07, 0x44, 0x07, 0x59, 0xa0, 0x0a, 0x09, + 0x82, 0x04, 0x04, 0x80, 0x00, 0x00, 0x00, 0x14, 0x04, 0x02, 0x10, 0x03, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0xd0, 0x59, 0xa8, 0x00, 0x35, + 0x48, 0x07, 0x50, 0x35, 0x48, 0x03, 0x42, 0x09, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0x8d, 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x0e, 0x59, 0xa8, 0x00, 0x05, 0x59, 0xa0, 0x0c, 0x06, + 0x80, 0x04, 0x15, 0x80, 0x82, 0x08, 0x15, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1e, 0x8d, 0x80, 0x08, 0x05, 0x80, + 0x48, 0x03, 0x50, 0x05, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x05, 0xbd, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0x8d, 0x59, 0xa0, 0x04, 0x06, + 0x59, 0xa8, 0x08, 0x05, 0x48, 0x03, 0x50, 0x05, 0x80, 0x04, 0x0d, 0x80, + 0x8c, 0x04, 0x0d, 0x0c, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x05, 0xbd, + 0x59, 0xa0, 0x02, 0x07, 0x48, 0x03, 0x50, 0x06, 0x59, 0xa0, 0x04, 0x07, + 0x48, 0x03, 0x50, 0x07, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0x8d, + 0x8d, 0x0e, 0x1d, 0x0e, 0x04, 0x00, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x02, 0x00, 0x05, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x16, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x07, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x59, 0xa0, 0x0c, 0x06, + 0x82, 0x04, 0x05, 0x00, 0xff, 0xff, 0xff, 0x00, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x1e, 0xdd, 0x82, 0x04, 0x15, 0x80, 0x00, 0x00, 0x00, 0xff, + 0x04, 0x02, 0x00, 0x07, 0x59, 0xa8, 0x00, 0x0f, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x82, 0x00, 0x15, 0x40, 0x00, 0x00, 0xff, 0x00, + 0x04, 0x01, 0xf0, 0x11, 0x82, 0x04, 0x04, 0x00, 0x00, 0x10, 0x1c, 0xdd, + 0x50, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x10, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, + 0x59, 0xa8, 0x00, 0x0f, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x80, 0x04, 0x15, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, + 0x84, 0x04, 0x09, 0xc0, 0x80, 0x04, 0x15, 0x40, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0x99, 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x48, 0xee, 0x60, 0x21, 0x48, 0x0a, 0x62, 0x1c, 0x4a, 0x02, 0x64, 0x1c, + 0x00, 0x00, 0xbc, 0x09, 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xb6, 0x04, 0x02, 0x00, 0x07, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x49, 0x7a, 0x5a, 0x04, 0x49, 0x7a, 0x58, 0x05, 0x4a, 0x02, 0x5c, 0x04, + 0x00, 0x00, 0x80, 0x00, 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x24, 0x7f, + 0x49, 0x2e, 0x60, 0x08, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x32, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xdf, 0x8d, 0x0e, 0x1d, 0x0e, + 0x04, 0x00, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x16, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x05, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x07, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x59, 0xa0, 0x0c, 0x06, 0x82, 0x04, 0x05, 0x00, + 0xff, 0xff, 0xff, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, + 0x82, 0x04, 0x15, 0x80, 0x00, 0x00, 0x00, 0xff, 0x04, 0x02, 0x00, 0x07, + 0x59, 0xa8, 0x00, 0x0f, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x82, 0x00, 0x15, 0x40, 0x00, 0x00, 0xff, 0x00, 0x04, 0x01, 0xf0, 0x11, + 0x82, 0x04, 0x04, 0x00, 0x00, 0x10, 0x1c, 0xdd, 0x50, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x01, 0x10, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x80, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x59, 0xa8, 0x00, 0x0f, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, 0x80, 0x04, 0x15, 0x80, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x84, 0x04, 0x09, 0xc0, + 0x80, 0x04, 0x15, 0x40, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, + 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x03, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x48, 0xee, 0x60, 0x21, + 0x48, 0x0a, 0x62, 0x1c, 0x4a, 0x02, 0x64, 0x1c, 0x00, 0x00, 0xbc, 0x05, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x36, 0xb6, 0x04, 0x02, 0x00, 0x07, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x49, 0x7a, 0x5a, 0x04, + 0x49, 0x7a, 0x58, 0x05, 0x4a, 0x02, 0x5c, 0x04, 0x00, 0x00, 0x80, 0x00, + 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x24, 0x7f, 0x49, 0x2e, 0x60, 0x08, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x32, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xdf, 0x59, 0x2c, 0x00, 0x05, 0x82, 0x00, 0x05, 0x80, + 0x01, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x1e, 0x8d, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x49, 0x7b, 0x44, 0x06, 0x49, 0x7b, 0x42, 0x07, + 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x00, 0x00, 0x08, 0x59, 0xa8, 0x00, 0x63, + 0x59, 0xa8, 0x08, 0x67, 0x80, 0x04, 0x04, 0x80, 0x59, 0xa8, 0x08, 0x64, + 0x48, 0x07, 0x44, 0x06, 0x80, 0x04, 0x14, 0x80, 0x48, 0x0b, 0x42, 0x07, + 0x49, 0x67, 0x44, 0x07, 0x59, 0xa8, 0x00, 0x0d, 0x48, 0x03, 0x42, 0x09, + 0x49, 0x5f, 0x44, 0x09, 0x59, 0xa8, 0x00, 0x1f, 0x48, 0x03, 0x42, 0x0b, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0x8d, 0x8d, 0x0e, 0x1d, 0x0e, + 0x04, 0x00, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x59, 0xa0, 0x04, 0x06, + 0x8c, 0x00, 0x05, 0x00, 0x04, 0x02, 0x00, 0x0f, 0x59, 0xa8, 0x00, 0x66, + 0x81, 0x64, 0x04, 0x80, 0x04, 0x00, 0x10, 0x08, 0x59, 0xa8, 0x00, 0x0a, + 0x81, 0x50, 0x05, 0x80, 0x04, 0x00, 0x00, 0x09, 0x59, 0xa8, 0x00, 0x67, + 0x59, 0xa8, 0x10, 0x63, 0x80, 0x08, 0x05, 0x80, 0x04, 0x00, 0x00, 0x05, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x18, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x85, 0x0e, 0x1d, 0x58, 0x48, 0x03, 0xc8, 0x56, + 0x85, 0x0e, 0x1d, 0x46, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x39, 0x38, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0x8d, 0x48, 0x03, 0xc8, 0x56, + 0x8d, 0x0e, 0x1d, 0x0e, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xe1, + 0x59, 0xa0, 0x04, 0x06, 0x8c, 0x00, 0x05, 0x1e, 0x04, 0x00, 0x00, 0x08, + 0x48, 0x03, 0xc8, 0x56, 0x59, 0xa0, 0x02, 0x0b, 0x82, 0x00, 0x04, 0x80, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x10, 0x15, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xdd, 0x48, 0x03, 0xc8, 0x56, 0x59, 0xa0, 0x02, 0x0b, + 0x59, 0x9c, 0x0a, 0x01, 0x80, 0x04, 0x04, 0x80, 0x04, 0x02, 0x10, 0x03, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x59, 0xa8, 0x00, 0x0d, + 0x81, 0x64, 0x05, 0x80, 0x04, 0x00, 0x00, 0x09, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x18, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x59, 0xa8, 0x00, 0x23, 0x8c, 0x00, 0x05, 0x0a, + 0x04, 0x00, 0x07, 0xfa, 0x59, 0xa0, 0x04, 0x06, 0x8c, 0x00, 0x05, 0x1e, + 0x04, 0x00, 0x00, 0x40, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, + 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x03, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x36, 0xb6, 0x04, 0x02, 0x00, 0x07, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x49, 0x7a, 0x5a, 0x04, + 0x59, 0xa0, 0x04, 0x06, 0x48, 0x02, 0x62, 0x0a, 0x59, 0xa0, 0x02, 0x09, + 0x48, 0x02, 0x64, 0x0a, 0x59, 0xa0, 0x04, 0x09, 0x48, 0x02, 0x62, 0x0b, + 0x59, 0xa0, 0x02, 0x0d, 0x48, 0x02, 0x62, 0x0c, 0x59, 0xa0, 0x04, 0x0d, + 0x48, 0x02, 0x64, 0x0c, 0x59, 0xa0, 0x02, 0x0e, 0x48, 0x02, 0x62, 0x0d, + 0x59, 0xa0, 0x04, 0x0e, 0x48, 0x02, 0x64, 0x0d, 0x59, 0xa0, 0x02, 0x10, + 0x48, 0x02, 0x62, 0x0e, 0x59, 0xa0, 0x04, 0x10, 0x48, 0x02, 0x64, 0x0e, + 0x59, 0xa0, 0x02, 0x0b, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0xff, 0xfc, + 0x80, 0x00, 0x01, 0x04, 0x48, 0x02, 0x64, 0x0b, 0x04, 0x01, 0xf9, 0xda, + 0x04, 0x00, 0x07, 0xe1, 0x48, 0xee, 0x60, 0x21, 0x58, 0xee, 0x58, 0x0d, + 0x59, 0x30, 0x02, 0x0e, 0x59, 0x30, 0x1c, 0x0e, 0x90, 0x0c, 0x19, 0xc0, + 0x80, 0x0c, 0x1d, 0x40, 0x59, 0x30, 0x02, 0x0c, 0x59, 0x30, 0x14, 0x0c, + 0x90, 0x08, 0x11, 0xc0, 0x80, 0x08, 0x15, 0x40, 0x59, 0x2c, 0x0a, 0x05, + 0x83, 0x2c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x36, 0xda, 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x26, 0x73, + 0x4a, 0x03, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x49, 0x33, 0x40, 0x01, + 0x1c, 0x01, 0xf0, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x76, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0a, 0x20, 0x04, 0x01, 0xf8, 0x6d, + 0x49, 0x7b, 0x50, 0x54, 0x42, 0x01, 0xd0, 0x00, 0x00, 0x00, 0x27, 0x10, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0xb0, 0x59, 0xc4, 0x08, 0x80, + 0x4c, 0x04, 0x00, 0x00, 0x59, 0xc4, 0x08, 0xa3, 0x4c, 0x04, 0x00, 0x00, + 0x49, 0x7b, 0x40, 0x02, 0x04, 0x01, 0xf8, 0x76, 0x04, 0x01, 0xf8, 0x93, + 0x4a, 0x03, 0xa0, 0x05, 0x10, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0xb4, + 0x04, 0x01, 0xf9, 0x01, 0x04, 0x00, 0x00, 0x48, 0x59, 0xc8, 0x00, 0x01, + 0x80, 0x00, 0x01, 0xc0, 0x04, 0x00, 0x07, 0xfc, 0x59, 0xc8, 0x00, 0x18, + 0x82, 0x00, 0x05, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x59, 0xc0, 0x08, 0x08, + 0x82, 0x04, 0x0d, 0x00, 0x0f, 0xff, 0xff, 0xff, 0x80, 0x04, 0x05, 0x40, + 0x48, 0x03, 0x80, 0x08, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0e, 0x08, + 0x59, 0xc0, 0x00, 0x06, 0x4a, 0x03, 0x80, 0x06, 0x10, 0x00, 0x00, 0x00, + 0x59, 0xc0, 0x00, 0x09, 0x82, 0x00, 0x0d, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x24, 0x4a, 0x03, 0x90, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x59, 0xc8, 0x00, 0x20, 0x82, 0x00, 0x05, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x82, 0x00, 0x05, 0x80, 0x32, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x1c, + 0x4a, 0x03, 0x90, 0x0d, 0x00, 0x00, 0x00, 0x01, 0x59, 0xc8, 0x00, 0x20, + 0x82, 0x00, 0x05, 0x00, 0xff, 0x00, 0x00, 0x00, 0x82, 0x00, 0x05, 0x80, + 0xe1, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x14, 0x4a, 0x03, 0x90, 0x0d, + 0x00, 0x00, 0x00, 0x00, 0x59, 0xc8, 0x00, 0x20, 0x82, 0x00, 0x05, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x4a, 0x03, 0x90, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x59, 0xc8, 0x08, 0x21, 0x82, 0x04, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x80, 0x04, 0x05, 0x80, 0x04, 0x02, 0x00, 0x08, 0x59, 0xa8, 0x00, 0x0f, + 0x80, 0x04, 0x05, 0x80, 0x04, 0x02, 0x00, 0x05, 0x59, 0xc4, 0x00, 0x05, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x04, 0x00, 0x00, 0x06, + 0x48, 0x03, 0xc8, 0x56, 0x04, 0x01, 0xf8, 0xd7, 0x4a, 0x03, 0x50, 0x54, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x02, 0x04, 0x01, 0xf8, 0xe1, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x80, 0x00, 0x00, 0x40, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0xc0, 0x08, 0x07, + 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x04, 0x00, 0x07, 0xfa, + 0x04, 0x01, 0xf0, 0x03, 0x4a, 0x03, 0x50, 0x54, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf8, 0xda, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x67, 0x7d, + 0x04, 0x01, 0xf8, 0x18, 0x42, 0x01, 0xd0, 0x00, 0x00, 0x01, 0x86, 0xa0, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0xb0, 0x5c, 0x00, 0x08, 0x00, + 0x48, 0x07, 0x88, 0xa3, 0x5c, 0x00, 0x08, 0x00, 0x48, 0x07, 0x88, 0x80, + 0x59, 0xa8, 0x00, 0x54, 0x80, 0x00, 0x01, 0xc0, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x1e, 0x8d, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xe5, + 0x59, 0x9c, 0x02, 0x01, 0x48, 0x03, 0x50, 0x56, 0x41, 0x78, 0x08, 0x00, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3b, 0x10, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x62, 0xb7, 0x48, 0x0b, 0x50, 0x57, 0x1c, 0x01, 0xf0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x63, 0x59, 0xb8, 0x00, 0xea, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x07, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x00, 0x03, 0x4a, 0x03, 0x70, 0xe8, + 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x03, 0x80, 0x00, + 0x00, 0x00, 0x77, 0x00, 0x4a, 0x03, 0x80, 0x06, 0x30, 0x00, 0x00, 0x00, + 0x59, 0xc0, 0x00, 0x07, 0x8c, 0x00, 0x05, 0x0a, 0x04, 0x02, 0x07, 0xfe, + 0x59, 0xc0, 0x00, 0x06, 0x59, 0xa0, 0x02, 0x09, 0x59, 0xa0, 0x0c, 0x09, + 0x90, 0x04, 0x09, 0xc0, 0x80, 0x04, 0x0d, 0x40, 0x48, 0x07, 0x80, 0x01, + 0x59, 0xa0, 0x02, 0x0e, 0x59, 0xa0, 0x0c, 0x0e, 0x90, 0x04, 0x09, 0xc0, + 0x80, 0x04, 0x0d, 0x40, 0x48, 0x07, 0x80, 0x00, 0x59, 0xa0, 0x02, 0x0b, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0xff, 0xfc, 0x48, 0x03, 0x80, 0x02, + 0x48, 0x03, 0x80, 0x03, 0x48, 0x03, 0x80, 0x05, 0x49, 0x7b, 0x90, 0x09, + 0x59, 0xe0, 0x00, 0x03, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x80, 0x60, + 0x48, 0x03, 0xc0, 0x03, 0x1c, 0x01, 0xf0, 0x00, 0x41, 0x78, 0x08, 0x00, + 0x80, 0x07, 0xa0, 0xca, 0x83, 0xd3, 0xa4, 0x00, 0x00, 0x00, 0x76, 0x00, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x12, 0x65, 0x4a, 0x03, 0xa0, 0x0a, 0x00, 0x00, 0x00, 0x01, + 0x4a, 0x03, 0xa0, 0x05, 0x20, 0x00, 0x00, 0x00, 0x59, 0xd0, 0x00, 0x06, + 0x4a, 0x03, 0xa0, 0x05, 0x30, 0x00, 0x00, 0x00, 0x59, 0xd0, 0x00, 0x06, + 0x8c, 0x00, 0x05, 0x0a, 0x04, 0x02, 0x07, 0xfe, 0x59, 0xd0, 0x00, 0x05, + 0x59, 0xa0, 0x02, 0x10, 0x59, 0xa0, 0x0c, 0x10, 0x90, 0x04, 0x09, 0xc0, + 0x80, 0x04, 0x0d, 0x40, 0x48, 0x07, 0xa0, 0x01, 0x59, 0xa0, 0x02, 0x0d, + 0x59, 0xa0, 0x0c, 0x0d, 0x90, 0x04, 0x09, 0xc0, 0x80, 0x04, 0x0d, 0x40, + 0x48, 0x07, 0xa0, 0x00, 0x59, 0xa0, 0x02, 0x0b, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0xff, 0xfc, 0x48, 0x03, 0xa0, 0x03, 0x48, 0x03, 0xa0, 0x02, + 0x48, 0x03, 0xa0, 0x08, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xa0, 0x00, 0x02, + 0x48, 0x03, 0xc8, 0x57, 0x80, 0x00, 0x01, 0xc0, 0x04, 0x02, 0x00, 0x4a, + 0x59, 0xa8, 0x00, 0x57, 0x48, 0x03, 0x88, 0x80, 0x59, 0xc4, 0x00, 0xa3, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x20, 0x08, 0x84, 0x00, 0x05, 0x3a, + 0x48, 0x03, 0x88, 0xa3, 0x59, 0xc4, 0x00, 0x08, 0x84, 0x00, 0x05, 0x4e, + 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0xff, 0xe1, 0x48, 0x03, 0x88, 0x08, + 0x59, 0xc8, 0x00, 0x40, 0x84, 0x00, 0x05, 0x34, 0x48, 0x03, 0x90, 0x40, + 0x04, 0x01, 0xf9, 0x01, 0x04, 0x02, 0x00, 0x13, 0x59, 0xa8, 0x00, 0x0f, + 0x80, 0x00, 0x00, 0xd0, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x11, + 0x48, 0x03, 0x91, 0x20, 0x59, 0xa8, 0x00, 0x0f, 0x82, 0x00, 0x05, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x82, 0x00, 0x05, 0x40, 0x32, 0x00, 0x00, 0x00, + 0x48, 0x03, 0x91, 0x21, 0x4a, 0x03, 0x91, 0x23, 0xe1, 0x29, 0x00, 0x08, + 0x59, 0xa8, 0x00, 0x0f, 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x48, 0x03, 0x91, 0x22, 0x04, 0x01, 0xf0, 0x16, 0x59, 0xa8, 0x00, 0x0f, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0x00, 0x09, 0xc0, + 0x84, 0x00, 0x01, 0xc0, 0x80, 0x04, 0x05, 0x40, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x03, 0x91, 0x20, 0x59, 0xa8, 0x00, 0x0f, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, 0x82, 0x00, 0x05, 0x40, + 0x01, 0x00, 0x00, 0x00, 0x48, 0x03, 0x91, 0x21, 0x4a, 0x03, 0x91, 0x23, + 0x08, 0x21, 0x00, 0x08, 0x59, 0xa8, 0x00, 0x0f, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x48, 0x03, 0x91, 0x22, 0x49, 0x7b, 0x91, 0x24, + 0x59, 0xa8, 0x0c, 0x58, 0x80, 0x04, 0x08, 0x00, 0x48, 0x07, 0x54, 0x58, + 0x90, 0x04, 0x09, 0xc0, 0x82, 0x04, 0x05, 0x40, 0x00, 0x00, 0xaa, 0xaa, + 0x48, 0x03, 0x91, 0x25, 0x49, 0x7b, 0x91, 0x26, 0x49, 0x7b, 0x91, 0x27, + 0x04, 0x01, 0xf8, 0xce, 0x04, 0x02, 0x00, 0x04, 0x4a, 0x03, 0x91, 0x00, + 0x00, 0x00, 0xe9, 0x80, 0x04, 0x01, 0xf0, 0x03, 0x4a, 0x03, 0x91, 0x00, + 0x00, 0x00, 0xe9, 0xa0, 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x02, 0x50, 0x0d, 0x42, 0x03, 0xe0, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x40, 0xe8, 0x10, 0x00, 0x41, 0x78, 0x08, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x62, 0xb7, 0x59, 0x94, 0x00, 0x24, 0x80, 0x08, 0x04, 0x00, + 0x48, 0x03, 0x28, 0x24, 0x80, 0x00, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, + 0x4d, 0x90, 0x00, 0x00, 0x4d, 0xd0, 0x00, 0x00, 0x4d, 0xa4, 0x00, 0x00, + 0x4d, 0x14, 0x00, 0x00, 0x41, 0x7a, 0x30, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x69, 0x2b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x66, 0x06, + 0x5c, 0x02, 0x28, 0x00, 0x5c, 0x03, 0x48, 0x00, 0x5c, 0x03, 0xa0, 0x00, + 0x5c, 0x03, 0x20, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xc8, 0x00, 0x07, + 0x8c, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x03, 0x4a, 0x03, 0x90, 0x0d, + 0x00, 0x00, 0x00, 0x30, 0x1c, 0x01, 0xf0, 0x00, 0x4a, 0x03, 0x88, 0x05, + 0x00, 0x02, 0x00, 0x00, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x12, 0x65, 0x4a, 0x03, 0x88, 0x91, + 0x00, 0x00, 0xff, 0xff, 0x59, 0xc8, 0x00, 0x35, 0x48, 0x03, 0x90, 0x35, + 0x4a, 0x03, 0x90, 0x0d, 0x00, 0x00, 0x00, 0x40, 0x42, 0x03, 0x80, 0x00, + 0x00, 0x00, 0x77, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0e, 0x08, + 0x42, 0x03, 0x80, 0x00, 0x00, 0x00, 0x77, 0x20, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x0e, 0x08, 0x4a, 0x03, 0xa0, 0x05, 0x20, 0x00, 0x00, 0x00, + 0x4a, 0x03, 0xa0, 0x05, 0x30, 0x00, 0x00, 0x00, 0x59, 0xd0, 0x08, 0x06, + 0x8c, 0x04, 0x0d, 0x0a, 0x04, 0x02, 0x07, 0xfe, 0x1c, 0x01, 0xf0, 0x00, + 0x4d, 0x30, 0x00, 0x00, 0x40, 0x31, 0xd8, 0x00, 0x58, 0xef, 0x40, 0x0b, + 0x58, 0xee, 0x58, 0x0d, 0x58, 0xec, 0x00, 0x02, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x02, 0x00, 0x5c, 0x02, 0x60, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x1e, 0xd1, 0x4d, 0x30, 0x00, 0x00, 0x59, 0xa2, 0x60, 0x01, + 0x59, 0xa0, 0x00, 0x00, 0x40, 0x00, 0xb0, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x48, 0x03, 0x40, 0x00, 0x59, 0x2c, 0x00, 0x01, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x00, 0x00, 0x1e, 0x40, 0x02, 0x58, 0x00, 0x80, 0x58, 0xb0, 0x40, + 0x04, 0x02, 0x07, 0xfb, 0x58, 0xec, 0x10, 0x07, 0x58, 0xec, 0x18, 0x08, + 0x59, 0x2c, 0x0a, 0x05, 0x4d, 0x2c, 0x00, 0x00, 0x58, 0xec, 0x00, 0x0d, + 0x40, 0x02, 0x58, 0x00, 0x59, 0x2c, 0x02, 0x04, 0x5c, 0x02, 0x58, 0x00, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x01, 0x03, 0x04, 0x00, 0x00, 0x08, + 0x83, 0x2c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x36, 0xda, 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x26, 0x73, + 0x04, 0x01, 0xf0, 0x07, 0x83, 0x2c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xdd, 0x4a, 0x01, 0xd8, 0x09, + 0x00, 0x10, 0x26, 0x73, 0x5c, 0x02, 0x60, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x58, 0xec, 0x00, 0x0d, 0x40, 0x02, 0x58, 0x00, 0x59, 0x2c, 0x02, 0x04, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x01, 0x03, 0x04, 0x02, 0x00, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x5c, 0x02, 0x60, 0x00, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0x8d, 0x58, 0xec, 0x00, 0x0d, + 0x40, 0x02, 0x58, 0x00, 0x59, 0x2c, 0x04, 0x04, 0x84, 0x00, 0x05, 0x5e, + 0x48, 0x02, 0x5c, 0x04, 0x42, 0x02, 0x88, 0x00, 0x00, 0x00, 0x07, 0xfd, + 0x42, 0x00, 0x30, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x42, 0xb1, 0x59, 0xa2, 0x60, 0x01, 0x04, 0x00, 0x00, 0x07, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x49, 0x7b, 0x44, 0x06, + 0x5c, 0x02, 0x60, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8b, 0xbe, 0x04, 0x00, 0x07, 0xf8, + 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x26, 0xc7, 0x04, 0x01, 0xf7, 0xdb, + 0x59, 0x2c, 0x00, 0x05, 0x82, 0x00, 0x05, 0x80, 0x01, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xe5, 0x4d, 0x30, 0x00, 0x00, + 0x59, 0xa2, 0x60, 0x01, 0x59, 0x30, 0x02, 0x0b, 0x59, 0x30, 0x1c, 0x0a, + 0x90, 0x00, 0x01, 0xc0, 0x80, 0x0c, 0x1d, 0x40, 0x59, 0x30, 0x04, 0x0d, + 0x59, 0x30, 0x12, 0x0d, 0x90, 0x00, 0x01, 0xc0, 0x80, 0x08, 0x15, 0x40, + 0x59, 0x2c, 0x0a, 0x05, 0x83, 0x2c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xdd, 0x4a, 0x01, 0xd8, 0x09, + 0x00, 0x10, 0x26, 0x73, 0x4a, 0x03, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x5c, 0x02, 0x60, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, + 0x4c, 0x30, 0x00, 0x00, 0x59, 0x30, 0x04, 0x0b, 0x82, 0x00, 0x0c, 0x80, + 0x00, 0x00, 0x00, 0x0e, 0x04, 0x00, 0x10, 0x04, 0x4a, 0x02, 0x5a, 0x05, + 0x00, 0x00, 0x00, 0x0e, 0x04, 0x01, 0xf0, 0x03, 0x48, 0x02, 0x5a, 0x05, + 0x04, 0x01, 0xf0, 0x0a, 0x80, 0x04, 0x09, 0xc0, 0x04, 0x00, 0x00, 0x08, + 0x4c, 0x04, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xb6, + 0x5c, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, + 0x04, 0x01, 0xf7, 0xf0, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x5c, 0x00, 0x60, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xa0, 0x02, 0x06, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x44, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x0f, 0xc8, 0x57, 0x8d, 0x0e, 0x1d, 0x0e, 0x04, 0x00, 0x00, 0x0c, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0xb2, 0x04, 0x02, 0x00, 0x09, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x17, 0xf8, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x17, 0x8b, 0x59, 0xa0, 0x04, 0x06, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0c, 0x01, 0xf0, 0x01, + 0x00, 0x10, 0x27, 0x19, 0x00, 0x10, 0x27, 0x2e, 0x00, 0x10, 0x27, 0x44, + 0x00, 0x10, 0x27, 0x17, 0x00, 0x10, 0x27, 0x17, 0x00, 0x10, 0x27, 0x17, + 0x00, 0x10, 0x27, 0x17, 0x00, 0x10, 0x27, 0x17, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xdd, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0x99, 0x82, 0x04, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x02, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0xa5, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0x99, + 0x82, 0x04, 0x05, 0x40, 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0xa5, + 0x04, 0x01, 0xf0, 0x0b, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0x99, 0x82, 0x04, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0xa5, 0x59, 0xc8, 0x00, 0x40, + 0x4c, 0x00, 0x00, 0x00, 0x59, 0xa8, 0x00, 0x0f, 0x4c, 0x00, 0x00, 0x00, + 0x59, 0xc4, 0x00, 0xa3, 0x4c, 0x00, 0x00, 0x00, 0x59, 0xc4, 0x00, 0x08, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf9, 0x10, 0x04, 0x00, 0x00, 0x20, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x8d, 0x0e, 0x1d, 0x0e, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xe1, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x16, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x1e, 0xe1, 0x59, 0xc4, 0x08, 0xa4, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xe1, 0x59, 0xc8, 0x00, 0x40, + 0x4c, 0x00, 0x00, 0x00, 0x59, 0xa8, 0x00, 0x0f, 0x4c, 0x00, 0x00, 0x00, + 0x59, 0xc4, 0x00, 0xa3, 0x4c, 0x00, 0x00, 0x00, 0x59, 0xc4, 0x00, 0x08, + 0x4c, 0x00, 0x00, 0x00, 0x59, 0xc4, 0x00, 0x80, 0x4c, 0x00, 0x00, 0x00, + 0x59, 0xa0, 0x02, 0x0f, 0x59, 0xa0, 0xbc, 0x0f, 0x90, 0x5c, 0xb9, 0xc0, + 0x80, 0x5c, 0xbd, 0x40, 0x41, 0x78, 0x48, 0x00, 0x41, 0x78, 0x50, 0x00, + 0x41, 0x78, 0x58, 0x00, 0x41, 0x78, 0x90, 0x00, 0x41, 0x78, 0x98, 0x00, + 0x04, 0x01, 0xfe, 0x23, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x76, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0a, 0x20, 0x41, 0x78, 0xc0, 0x00, + 0x49, 0x7b, 0x40, 0x02, 0x04, 0x01, 0xf9, 0x5a, 0x04, 0x01, 0xf9, 0xa8, + 0x59, 0xa0, 0x02, 0x0c, 0x59, 0xa0, 0x0c, 0x0c, 0x80, 0x04, 0x0d, 0x40, + 0x04, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf9, 0xf9, 0x04, 0x01, 0xf9, 0xf8, + 0x04, 0x01, 0xfe, 0x6a, 0x80, 0x60, 0xc1, 0xc0, 0x04, 0x02, 0x00, 0x14, + 0x04, 0x01, 0xfa, 0x96, 0x04, 0x01, 0xfe, 0xb4, 0x04, 0x02, 0x00, 0x0e, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0x4d, 0x04, 0x02, 0x00, 0x08, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x17, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x42, 0x03, 0xe0, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf0, 0x00, 0x42, 0x00, 0x58, 0x00, 0x00, 0x00, 0xaa, 0xaa, + 0x04, 0x01, 0xf0, 0x58, 0x59, 0xc8, 0x00, 0x01, 0x80, 0x00, 0x01, 0xc0, + 0x04, 0x00, 0x07, 0xee, 0x59, 0xc8, 0x08, 0x01, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x00, 0x00, 0x06, 0x04, 0x01, 0xfa, 0x6e, 0x40, 0x24, 0x00, 0x00, + 0x80, 0x28, 0x05, 0x40, 0x80, 0x2c, 0x05, 0x40, 0x04, 0x02, 0x00, 0x4d, + 0x59, 0xa0, 0x00, 0x02, 0x82, 0x00, 0x05, 0x80, 0xfe, 0xed, 0xbe, 0xef, + 0x04, 0x00, 0x00, 0x04, 0x42, 0x00, 0x88, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf0, 0x03, 0x42, 0x00, 0x88, 0x00, 0x10, 0x00, 0x00, 0x04, + 0x04, 0x01, 0xfa, 0x17, 0x4a, 0x03, 0x40, 0x02, 0xfe, 0xed, 0xbe, 0xef, + 0x04, 0x01, 0xfa, 0x6f, 0x04, 0x01, 0xfa, 0x92, 0x04, 0x01, 0xfe, 0xaa, + 0x59, 0xc4, 0x00, 0x05, 0x8c, 0x00, 0x05, 0x34, 0x04, 0x00, 0x00, 0x04, + 0x42, 0x00, 0x58, 0x00, 0x00, 0x00, 0xbb, 0xbb, 0x04, 0x01, 0xf0, 0x38, + 0x04, 0x01, 0xfe, 0x85, 0x04, 0x02, 0x00, 0x07, 0x42, 0x00, 0x58, 0x00, + 0x00, 0x00, 0xcc, 0xcc, 0x48, 0x5f, 0x42, 0x0f, 0x90, 0x5c, 0xb9, 0xc0, + 0x48, 0x5f, 0x44, 0x0f, 0x04, 0x01, 0xf0, 0x30, 0x59, 0xa0, 0x04, 0x0c, + 0x80, 0x00, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x0e, 0x59, 0xa2, 0x60, 0x00, + 0x59, 0x30, 0x00, 0x0d, 0x80, 0x00, 0x01, 0xc0, 0x04, 0x02, 0x07, 0xbe, + 0x59, 0xa2, 0x60, 0x01, 0x59, 0x30, 0x08, 0x0d, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x02, 0x07, 0xba, 0x80, 0x48, 0x91, 0xc0, 0x04, 0x02, 0x07, 0xb8, + 0x80, 0x4c, 0x99, 0xc0, 0x04, 0x02, 0x07, 0xb6, 0x04, 0x01, 0xf8, 0x7a, + 0x80, 0x5c, 0xb8, 0x40, 0x04, 0x00, 0x00, 0x05, 0x40, 0x24, 0x00, 0x00, + 0x80, 0x28, 0x05, 0x40, 0x80, 0x2c, 0x05, 0x40, 0x04, 0x02, 0x00, 0x1a, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0d, 0x40, 0x80, 0x00, 0x00, 0x40, + 0x04, 0x02, 0x00, 0x12, 0x59, 0xc0, 0x00, 0x07, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x05, 0x01, 0xc0, 0x04, 0x02, 0x00, 0x0b, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x18, 0x4d, 0x04, 0x02, 0x00, 0x08, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x17, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x42, 0x03, 0xe0, 0x00, 0x50, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x58, 0x00, 0x00, 0x00, 0xdd, 0xdd, 0x04, 0x01, 0xf0, 0x05, + 0x59, 0xc0, 0x08, 0x07, 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x0c, + 0x04, 0x00, 0x07, 0xea, 0x04, 0x01, 0xfe, 0x5e, 0x59, 0xa0, 0x04, 0x0c, + 0x80, 0x00, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf8, 0x56, + 0x04, 0x01, 0xfe, 0x6d, 0x40, 0x24, 0x00, 0x00, 0x80, 0x28, 0x05, 0x40, + 0x80, 0x2c, 0x05, 0x40, 0x04, 0x02, 0x00, 0x03, 0x80, 0x5c, 0xb9, 0xc0, + 0x04, 0x02, 0x07, 0x81, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x67, 0x7d, + 0x04, 0x01, 0xfd, 0xa5, 0x42, 0x01, 0xd0, 0x00, 0x00, 0x01, 0x86, 0xa0, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0xb0, 0x5c, 0x00, 0x08, 0x00, + 0x48, 0x07, 0x88, 0x80, 0x5c, 0x00, 0x08, 0x00, 0x48, 0x07, 0x88, 0x08, + 0x5c, 0x00, 0x08, 0x00, 0x48, 0x07, 0x88, 0xa3, 0x5c, 0x00, 0x08, 0x00, + 0x48, 0x07, 0x50, 0x0f, 0x5c, 0x00, 0x08, 0x00, 0x48, 0x07, 0x90, 0x40, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x08, 0xac, 0x59, 0xa0, 0x04, 0x06, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x03, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x2c, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0x99, + 0x82, 0x04, 0x05, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0xa5, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x18, 0x99, 0x82, 0x04, 0x05, 0x00, 0xff, 0xff, 0xff, 0xf7, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x18, 0xa5, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0x99, 0x82, 0x04, 0x05, 0x00, + 0xff, 0xff, 0xff, 0xfb, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0xa5, 0x4a, 0x03, 0x88, 0xa7, + 0x00, 0x00, 0xf7, 0xf7, 0x42, 0x00, 0x60, 0x00, 0xbe, 0xff, 0xff, 0xff, + 0x42, 0x00, 0x68, 0x00, 0x80, 0x01, 0x80, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x3f, 0x44, 0x42, 0x00, 0x60, 0x00, 0xff, 0xfe, 0xff, 0xff, + 0x41, 0x78, 0x68, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x44, + 0x40, 0x2c, 0x00, 0x00, 0x80, 0x28, 0x05, 0x40, 0x80, 0x24, 0x05, 0x40, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1e, 0x8d, 0x48, 0x27, 0x44, 0x06, + 0x48, 0x2b, 0x42, 0x07, 0x48, 0x2f, 0x44, 0x07, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xe9, 0x59, 0xa2, 0x60, 0x00, 0x81, 0x32, 0x61, 0xc0, + 0x04, 0x00, 0x00, 0x0e, 0x59, 0x32, 0x58, 0x08, 0x81, 0x2e, 0x59, 0xc0, + 0x04, 0x00, 0x00, 0x0b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x3b, 0x59, 0xa2, 0x60, 0x01, + 0x59, 0x32, 0x58, 0x08, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x3b, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xef, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x15, 0x1e, 0x59, 0xc4, 0x00, 0xa3, 0x84, 0x00, 0x05, 0x5a, + 0x84, 0x00, 0x05, 0x3a, 0x48, 0x03, 0x88, 0xa3, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x15, 0x82, 0x04, 0x02, 0x00, 0x0a, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x17, 0xf8, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x17, 0x8b, 0x04, 0x01, 0xf0, 0x13, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x15, 0x92, 0x04, 0x02, 0x00, 0x08, 0x41, 0x78, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x17, 0xf8, 0x41, 0x78, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x17, 0x8b, 0x04, 0x01, 0xf0, 0x09, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x17, 0xf8, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x17, 0x8b, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0x99, + 0x82, 0x04, 0x05, 0x40, 0x00, 0x00, 0x00, 0x04, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0xa5, + 0x42, 0x01, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x14, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5c, 0x78, 0x59, 0xc4, 0x00, 0x08, 0x84, 0x00, 0x05, 0x4e, + 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0xff, 0xe1, 0x48, 0x03, 0x88, 0x08, + 0x4a, 0x03, 0x88, 0xa7, 0x00, 0x00, 0xf7, 0xf7, 0x4a, 0x03, 0x88, 0x05, + 0x04, 0x00, 0x00, 0x01, 0x42, 0x00, 0x60, 0x00, 0xbe, 0x20, 0xbf, 0xff, + 0x42, 0x00, 0x68, 0x00, 0x80, 0x01, 0x80, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x3f, 0x44, 0x42, 0x00, 0x60, 0x00, 0xff, 0xfe, 0xff, 0xff, + 0x41, 0x78, 0x68, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x44, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x13, 0x88, 0x42, 0x01, 0xd0, 0x00, + 0x00, 0x00, 0x00, 0x14, 0x4c, 0x58, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5c, 0x78, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0x4d, + 0x5c, 0x00, 0xb0, 0x00, 0x04, 0x00, 0x00, 0x04, 0x80, 0x58, 0xb0, 0x40, + 0x04, 0x02, 0x07, 0xf6, 0x04, 0x01, 0xf0, 0x25, 0x59, 0xc4, 0x00, 0x05, + 0x8c, 0x00, 0x05, 0x34, 0x04, 0x02, 0x00, 0x07, 0x59, 0xc4, 0x00, 0xa4, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x08, 0x04, 0x02, 0x00, 0x1c, 0x42, 0x00, 0x60, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x4a, + 0x42, 0x01, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x64, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5c, 0x78, 0x42, 0x00, 0x60, 0x00, 0xfe, 0xff, 0xff, 0xff, + 0x42, 0x00, 0x68, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x3f, 0x44, 0x42, 0x00, 0x60, 0x00, 0xfd, 0xff, 0xff, 0xff, + 0x41, 0x78, 0x68, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x44, + 0x4a, 0x03, 0x88, 0x05, 0x04, 0x00, 0x00, 0x01, 0x59, 0xc4, 0x00, 0xa4, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x42, 0x03, 0x80, 0x00, 0x00, 0x00, 0x77, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x0e, 0x08, 0x59, 0xc0, 0x00, 0x06, 0x59, 0xa0, 0x04, 0x0c, + 0x80, 0x00, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x3f, 0x59, 0xa0, 0x3c, 0x0c, + 0x59, 0xa0, 0x02, 0x09, 0x59, 0xa0, 0x1c, 0x09, 0x90, 0x0c, 0x19, 0xc0, + 0x80, 0x0c, 0x1d, 0x40, 0x59, 0xa0, 0x02, 0x0e, 0x59, 0xa0, 0x24, 0x0e, + 0x90, 0x10, 0x21, 0xc0, 0x80, 0x10, 0x25, 0x40, 0x59, 0xa0, 0x02, 0x0b, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0xff, 0xfc, 0x59, 0xa0, 0x14, 0x0b, + 0x90, 0x08, 0x11, 0xc0, 0x80, 0x08, 0x15, 0x40, 0x48, 0x0b, 0x80, 0x03, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x49, 0x33, 0x40, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x07, 0x1a, 0x4a, 0x02, 0x5a, 0x04, 0x00, 0x00, 0x00, 0x18, + 0x4a, 0x02, 0x58, 0x05, 0x00, 0xab, 0xcd, 0xef, 0x49, 0x2e, 0x60, 0x08, + 0x49, 0x2e, 0x60, 0x0b, 0x48, 0x1e, 0x60, 0x0d, 0x4a, 0x02, 0x60, 0x0c, + 0x00, 0x00, 0x00, 0x04, 0x83, 0x2c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x11, + 0x48, 0x02, 0x60, 0x0a, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0c, + 0x82, 0x1c, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x04, + 0x80, 0x1c, 0x38, 0x40, 0x04, 0x01, 0xf9, 0x60, 0x04, 0x01, 0xf0, 0x04, + 0x41, 0x78, 0x38, 0x00, 0x04, 0x01, 0xf9, 0x5d, 0x04, 0x01, 0xf0, 0x11, + 0x82, 0x1c, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x10, 0x05, + 0x40, 0x04, 0x38, 0x00, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x04, 0x01, 0xf0, 0x06, 0x80, 0x00, 0x15, 0x80, 0x82, 0x08, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x80, 0x1c, 0x38, 0x40, 0x04, 0x02, 0x07, 0xfd, + 0x83, 0x2c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x05, 0x04, 0x01, 0xf9, 0x4d, + 0x04, 0x02, 0x07, 0xf1, 0x49, 0x7b, 0x90, 0x09, 0x59, 0xe0, 0x00, 0x03, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x80, 0x60, 0x48, 0x03, 0xc0, 0x03, + 0x4a, 0x03, 0x80, 0x09, 0x00, 0xe0, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x41, 0x78, 0x08, 0x00, 0x80, 0x07, 0xa0, 0xca, + 0x83, 0xd3, 0xa4, 0x00, 0x00, 0x00, 0x76, 0x00, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x12, 0x65, + 0x4a, 0x03, 0xa0, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x4a, 0x03, 0xa0, 0x05, + 0x20, 0x00, 0x00, 0x00, 0x59, 0xd0, 0x00, 0x06, 0x4a, 0x03, 0xa0, 0x05, + 0x30, 0x00, 0x00, 0x00, 0x59, 0xd0, 0x00, 0x06, 0x8c, 0x00, 0x05, 0x0a, + 0x04, 0x02, 0x07, 0xfe, 0x59, 0xd0, 0x00, 0x05, 0x59, 0xa0, 0x02, 0x0c, + 0x80, 0x00, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x3f, 0x59, 0xa0, 0x3a, 0x0c, + 0x59, 0xa0, 0x02, 0x10, 0x59, 0xa0, 0x1c, 0x10, 0x90, 0x0c, 0x19, 0xc0, + 0x80, 0x0c, 0x1d, 0x40, 0x59, 0xa0, 0x02, 0x0d, 0x59, 0xa0, 0x24, 0x0d, + 0x90, 0x10, 0x21, 0xc0, 0x80, 0x10, 0x25, 0x40, 0x59, 0xa0, 0x12, 0x0b, + 0x82, 0x08, 0x15, 0x00, 0x00, 0x00, 0xff, 0xfc, 0x59, 0xa0, 0x04, 0x0b, + 0x90, 0x00, 0x01, 0xc0, 0x80, 0x08, 0x15, 0x40, 0x48, 0x0b, 0xa0, 0x03, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x49, 0x33, 0x40, 0x01, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x07, 0x1a, 0x4a, 0x02, 0x5a, 0x04, 0x00, 0x00, 0x00, 0x18, + 0x4a, 0x02, 0x58, 0x05, 0x00, 0xab, 0xcd, 0xef, 0x49, 0x2e, 0x60, 0x08, + 0x49, 0x2e, 0x60, 0x0b, 0x48, 0x1e, 0x60, 0x0d, 0x4a, 0x02, 0x60, 0x0c, + 0x00, 0x00, 0x00, 0x04, 0x83, 0x2c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x11, + 0x48, 0x02, 0x60, 0x0a, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0c, + 0x82, 0x1c, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x04, + 0x80, 0x1c, 0x38, 0x40, 0x04, 0x01, 0xf9, 0x03, 0x04, 0x01, 0xf0, 0x04, + 0x41, 0x78, 0x38, 0x00, 0x04, 0x01, 0xf9, 0x00, 0x04, 0x01, 0xf0, 0x11, + 0x82, 0x1c, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x10, 0x05, + 0x40, 0x04, 0x38, 0x00, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x04, 0x01, 0xf0, 0x06, 0x80, 0x00, 0x15, 0x80, 0x82, 0x08, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x80, 0x1c, 0x38, 0x40, 0x04, 0x02, 0x07, 0xfd, + 0x83, 0x2c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x05, 0x04, 0x01, 0xf8, 0xf0, + 0x04, 0x02, 0x07, 0xf1, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x59, 0xa0, 0x02, 0x0c, 0x80, 0x00, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x24, + 0x82, 0x4c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x40, + 0x59, 0xa2, 0x60, 0x01, 0x59, 0x30, 0x38, 0x0d, 0x80, 0x1c, 0x39, 0xc0, + 0x04, 0x00, 0x00, 0x3c, 0x80, 0x1c, 0x38, 0x40, 0x48, 0x1e, 0x60, 0x0d, + 0x59, 0x32, 0x58, 0x0b, 0x59, 0x30, 0x08, 0x0a, 0x50, 0x04, 0x20, 0x00, + 0x58, 0x04, 0x18, 0x01, 0x58, 0x04, 0x10, 0x02, 0x82, 0x08, 0x15, 0x00, + 0xff, 0xff, 0xff, 0xfc, 0x59, 0x30, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, + 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x05, 0x04, 0x02, 0x00, 0x09, + 0x49, 0x7a, 0x60, 0x0c, 0x59, 0x2e, 0x58, 0x01, 0x81, 0x2e, 0x59, 0xc0, + 0x04, 0x00, 0x00, 0x1a, 0x49, 0x2e, 0x60, 0x0b, 0x83, 0x2c, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x04, 0x01, 0xf0, 0x05, 0x48, 0x02, 0x60, 0x0c, + 0x59, 0x30, 0x08, 0x0a, 0x82, 0x04, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x48, 0x06, 0x60, 0x0a, 0x04, 0x01, 0xf0, 0x10, 0x59, 0xa0, 0x12, 0x0b, + 0x82, 0x08, 0x15, 0x00, 0x00, 0x00, 0xff, 0xfc, 0x59, 0xa0, 0x04, 0x0b, + 0x90, 0x00, 0x01, 0xc0, 0x80, 0x08, 0x15, 0x40, 0x48, 0x0b, 0xa0, 0x03, + 0x59, 0xa0, 0x02, 0x0d, 0x59, 0xa0, 0x24, 0x0d, 0x90, 0x10, 0x21, 0xc0, + 0x80, 0x10, 0x25, 0x40, 0x59, 0xa0, 0x02, 0x10, 0x59, 0xa0, 0x1c, 0x10, + 0x90, 0x0c, 0x19, 0xc0, 0x80, 0x0c, 0x1d, 0x40, 0x42, 0x01, 0xd0, 0x00, + 0x00, 0x00, 0x3a, 0x98, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0xb0, + 0x48, 0x0b, 0xa0, 0x02, 0x59, 0xa8, 0x00, 0x56, 0x48, 0x03, 0xa0, 0x08, + 0x48, 0x13, 0xa0, 0x00, 0x48, 0x0f, 0xa0, 0x01, 0x4a, 0x03, 0xa0, 0x05, + 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x58, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x80, 0x4c, 0x98, 0x00, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x47, 0xc8, 0x57, 0x59, 0xa0, 0x04, 0x0c, + 0x80, 0x00, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x24, 0x82, 0x48, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x42, 0x59, 0xa2, 0x60, 0x00, + 0x59, 0x30, 0x38, 0x0d, 0x80, 0x1c, 0x39, 0xc0, 0x04, 0x00, 0x00, 0x3e, + 0x80, 0x1c, 0x38, 0x40, 0x48, 0x1e, 0x60, 0x0d, 0x59, 0x32, 0x58, 0x0b, + 0x59, 0x30, 0x08, 0x0a, 0x50, 0x04, 0x20, 0x00, 0x58, 0x04, 0x18, 0x01, + 0x58, 0x04, 0x10, 0x02, 0x82, 0x08, 0x15, 0x00, 0xff, 0xff, 0xff, 0xfc, + 0x59, 0x30, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x05, 0x04, 0x02, 0x00, 0x09, 0x49, 0x7a, 0x60, 0x0c, + 0x59, 0x2e, 0x58, 0x01, 0x81, 0x2e, 0x59, 0xc0, 0x04, 0x00, 0x00, 0x1d, + 0x49, 0x2e, 0x60, 0x0b, 0x83, 0x2c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x01, 0xf0, 0x05, 0x48, 0x02, 0x60, 0x0c, 0x59, 0x30, 0x08, 0x0a, + 0x82, 0x04, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x03, 0x48, 0x06, 0x60, 0x0a, + 0x04, 0x01, 0xf0, 0x13, 0x82, 0x44, 0x05, 0x80, 0x10, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x1f, 0x59, 0xa0, 0x02, 0x0e, 0x59, 0xa0, 0x24, 0x0e, + 0x90, 0x10, 0x21, 0xc0, 0x80, 0x10, 0x25, 0x40, 0x59, 0xa0, 0x02, 0x09, + 0x59, 0xa0, 0x1c, 0x09, 0x90, 0x0c, 0x19, 0xc0, 0x80, 0x0c, 0x1d, 0x40, + 0x59, 0xa0, 0x02, 0x0b, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0xff, 0xfc, + 0x59, 0xa0, 0x14, 0x0b, 0x90, 0x08, 0x11, 0xc0, 0x80, 0x08, 0x15, 0x40, + 0x48, 0x0b, 0x80, 0x03, 0x48, 0x13, 0x80, 0x00, 0x48, 0x0f, 0x80, 0x01, + 0x48, 0x0b, 0x80, 0x02, 0x59, 0xc8, 0x00, 0x18, 0x82, 0x00, 0x05, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0x59, 0xc0, 0x20, 0x08, 0x82, 0x10, 0x25, 0x00, + 0x0f, 0xff, 0xff, 0xff, 0x80, 0x10, 0x05, 0x40, 0x48, 0x03, 0x80, 0x08, + 0x48, 0x47, 0x80, 0x06, 0x80, 0x48, 0x90, 0x00, 0x82, 0x60, 0xc5, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xc0, 0x00, 0x09, + 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x0d, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x0d, 0x48, 0x5f, 0x42, 0x0f, 0x90, 0x5c, 0xb9, 0xc0, + 0x48, 0x5f, 0x44, 0x0f, 0x8c, 0x00, 0x05, 0x2e, 0x04, 0x00, 0x00, 0x02, + 0x80, 0x28, 0x50, 0x00, 0x8c, 0x00, 0x05, 0x2c, 0x04, 0x00, 0x00, 0x02, + 0x80, 0x24, 0x48, 0x00, 0x8c, 0x00, 0x05, 0x2a, 0x04, 0x00, 0x00, 0x02, + 0x80, 0x2c, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xa0, 0x02, 0x0c, + 0x80, 0x00, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x21, 0x59, 0xd0, 0x08, 0x06, + 0x48, 0x07, 0xc8, 0x57, 0x8c, 0x04, 0x0d, 0x3e, 0x04, 0x00, 0x00, 0x1d, + 0x8c, 0x04, 0x0d, 0x04, 0x04, 0x00, 0x00, 0x1b, 0x4a, 0x03, 0xa0, 0x05, + 0x20, 0x00, 0x00, 0x00, 0x82, 0x4c, 0x04, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x40, 0x4c, 0x00, 0x00, + 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x2a, 0x28, 0x00, 0x10, 0x2a, 0x2a, + 0x00, 0x10, 0x2a, 0x30, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x80, 0x00, 0x00, 0x40, 0x40, 0x00, 0x98, 0x00, 0x04, 0x01, 0xff, 0x46, + 0x04, 0x00, 0x00, 0x0a, 0x04, 0x01, 0xff, 0x44, 0x04, 0x01, 0xf0, 0x08, + 0x80, 0x00, 0x00, 0x40, 0x40, 0x00, 0x98, 0x00, 0x59, 0xd0, 0x08, 0x06, + 0x48, 0x07, 0xc8, 0x57, 0x8c, 0x04, 0x0d, 0x3e, 0x04, 0x02, 0x07, 0xe8, + 0x04, 0x01, 0xff, 0x3c, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xa0, 0x04, 0x0c, + 0x80, 0x00, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x24, 0x59, 0xc0, 0x08, 0x07, + 0x48, 0x07, 0xc8, 0x57, 0x8c, 0x04, 0x0d, 0x3e, 0x04, 0x00, 0x00, 0x20, + 0x59, 0xc0, 0x08, 0x07, 0x4a, 0x03, 0x80, 0x06, 0x20, 0x00, 0x00, 0x00, + 0x82, 0x48, 0x04, 0x80, 0x00, 0x00, 0x00, 0x03, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x40, 0x48, 0x00, 0x00, 0x0c, 0x01, 0xf0, 0x01, + 0x00, 0x10, 0x2a, 0x4b, 0x00, 0x10, 0x2a, 0x4d, 0x00, 0x10, 0x2a, 0x55, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x80, 0x00, 0x00, 0x40, + 0x40, 0x00, 0x90, 0x00, 0x42, 0x00, 0x88, 0x00, 0x10, 0x00, 0x00, 0x04, + 0x04, 0x01, 0xff, 0x68, 0x04, 0x00, 0x00, 0x0c, 0x04, 0x01, 0xff, 0x66, + 0x04, 0x01, 0xf0, 0x0a, 0x80, 0x00, 0x00, 0x40, 0x40, 0x00, 0x90, 0x00, + 0x59, 0xc0, 0x08, 0x07, 0x48, 0x07, 0xc8, 0x57, 0x8c, 0x04, 0x0d, 0x3e, + 0x04, 0x02, 0x07, 0xe5, 0x42, 0x00, 0x88, 0x00, 0x10, 0x00, 0x00, 0x04, + 0x04, 0x01, 0xff, 0x5c, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x2f, 0xc8, 0x57, + 0x40, 0x00, 0xa8, 0x00, 0x4a, 0x03, 0xb8, 0x05, 0x20, 0x00, 0x00, 0x00, + 0x59, 0xdc, 0x00, 0x06, 0x4a, 0x03, 0xb8, 0x05, 0x30, 0x00, 0x00, 0x00, + 0x48, 0x13, 0xb8, 0x00, 0x48, 0x0f, 0xb8, 0x01, 0x48, 0x0b, 0xb8, 0x02, + 0x48, 0x57, 0xb8, 0x03, 0x4a, 0x03, 0xb8, 0x05, 0x30, 0x00, 0x00, 0x02, + 0x59, 0xdc, 0x00, 0x06, 0x4a, 0x03, 0xb8, 0x05, 0x70, 0x00, 0x00, 0x01, + 0x59, 0xdc, 0x00, 0x06, 0x4a, 0x03, 0xb8, 0x05, 0x10, 0x00, 0x00, 0x00, + 0x59, 0xdc, 0x00, 0x06, 0x8c, 0x00, 0x05, 0x3e, 0x04, 0x00, 0x07, 0xfe, + 0x4a, 0x03, 0xb8, 0x05, 0x20, 0x00, 0x00, 0x00, 0x59, 0xdc, 0x00, 0x06, + 0x59, 0xdc, 0x20, 0x00, 0x59, 0xdc, 0x18, 0x01, 0x80, 0x1c, 0x39, 0xc0, + 0x04, 0x00, 0x00, 0x0a, 0x4d, 0x2c, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x07, 0x1a, 0x5c, 0x00, 0x08, 0x00, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x4a, 0x02, 0x5a, 0x04, 0x00, 0x00, 0x00, 0x0a, + 0x49, 0x2c, 0x08, 0x01, 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x00, 0x60, 0x00, + 0x00, 0x10, 0x2b, 0xc3, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x7c, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x12, 0x65, 0x4a, 0x03, 0x90, 0x2c, + 0x00, 0x20, 0x00, 0x00, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x01, 0xf4, + 0x59, 0xc8, 0x00, 0x2c, 0x8c, 0x00, 0x05, 0x2c, 0x04, 0x00, 0x00, 0x07, + 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xfc, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x03, 0x41, 0x78, 0x10, 0x00, 0x04, 0x01, 0xf1, 0x1e, + 0x50, 0x30, 0x10, 0x00, 0x41, 0x78, 0x48, 0x00, 0x4a, 0x03, 0x90, 0x2d, + 0x00, 0x00, 0x80, 0x00, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x01, 0xf4, + 0x59, 0xc8, 0x00, 0x2c, 0x8c, 0x00, 0x05, 0x34, 0x04, 0x00, 0x00, 0x07, + 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xfc, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x03, 0x41, 0x78, 0x10, 0x00, 0x04, 0x01, 0xf1, 0x0f, + 0x04, 0x01, 0xf8, 0x95, 0x80, 0x24, 0x48, 0x00, 0x82, 0x24, 0x05, 0x80, + 0x00, 0x00, 0x03, 0xb1, 0x04, 0x02, 0x07, 0xfc, 0x04, 0x01, 0xf9, 0x11, + 0x41, 0x78, 0x48, 0x00, 0x04, 0x01, 0xf8, 0xbb, 0x80, 0x24, 0x48, 0x00, + 0x82, 0x24, 0x05, 0x80, 0x00, 0x00, 0x03, 0xb1, 0x04, 0x02, 0x07, 0xfc, + 0x80, 0x30, 0x60, 0x00, 0x82, 0x30, 0x05, 0x80, 0x00, 0x10, 0x2b, 0xc5, + 0x04, 0x02, 0x07, 0xe2, 0x59, 0xa8, 0x08, 0x60, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x00, 0x00, 0x07, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x04, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x59, 0xa8, 0x18, 0x5f, + 0x04, 0x01, 0xf0, 0xf6, 0x42, 0x00, 0x60, 0x00, 0x00, 0x10, 0x2b, 0xc3, + 0x50, 0x30, 0x10, 0x00, 0x41, 0x78, 0x48, 0x00, 0x4a, 0x03, 0x90, 0x2d, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x01, 0xf8, 0x76, 0x80, 0x24, 0x48, 0x00, + 0x82, 0x24, 0x05, 0x80, 0x00, 0x00, 0x00, 0x18, 0x04, 0x02, 0x07, 0xfc, + 0x04, 0x01, 0xf8, 0xf2, 0x41, 0x78, 0x48, 0x00, 0x04, 0x01, 0xf8, 0x9c, + 0x80, 0x24, 0x48, 0x00, 0x82, 0x24, 0x05, 0x80, 0x00, 0x00, 0x00, 0x18, + 0x04, 0x02, 0x07, 0xfc, 0x80, 0x30, 0x60, 0x00, 0x82, 0x30, 0x05, 0x80, + 0x00, 0x10, 0x2b, 0xc5, 0x04, 0x02, 0x07, 0xed, 0x59, 0xa8, 0x08, 0x60, + 0x80, 0x04, 0x09, 0xc0, 0x04, 0x00, 0x00, 0x07, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x04, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x59, 0xa8, 0x18, 0x5f, 0x04, 0x01, 0xf0, 0xd7, 0x42, 0x00, 0x60, 0x00, + 0x00, 0x10, 0x2b, 0xc3, 0x50, 0x30, 0x10, 0x00, 0x41, 0x78, 0x48, 0x00, + 0x4a, 0x03, 0x90, 0x2d, 0x00, 0x00, 0x04, 0x00, 0x04, 0x01, 0xf8, 0x57, + 0x80, 0x24, 0x48, 0x00, 0x82, 0x24, 0x05, 0x80, 0x00, 0x00, 0x00, 0x88, + 0x04, 0x02, 0x07, 0xfc, 0x04, 0x01, 0xf8, 0xd3, 0x41, 0x78, 0x48, 0x00, + 0x04, 0x01, 0xf8, 0x7d, 0x80, 0x24, 0x48, 0x00, 0x82, 0x24, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x88, 0x04, 0x02, 0x07, 0xfc, 0x80, 0x30, 0x60, 0x00, + 0x82, 0x30, 0x05, 0x80, 0x00, 0x10, 0x2b, 0xc5, 0x04, 0x02, 0x07, 0xed, + 0x59, 0xa8, 0x08, 0x60, 0x80, 0x04, 0x09, 0xc0, 0x04, 0x00, 0x00, 0x07, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x04, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x59, 0xa8, 0x18, 0x5f, 0x04, 0x01, 0xf0, 0xb8, + 0x42, 0x00, 0x60, 0x00, 0x00, 0x10, 0x2b, 0xc3, 0x50, 0x30, 0x10, 0x00, + 0x41, 0x78, 0x48, 0x00, 0x4a, 0x03, 0x90, 0x2d, 0x00, 0x00, 0x20, 0x00, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x01, 0xf4, 0x59, 0xc8, 0x00, 0x2c, + 0x8c, 0x00, 0x05, 0x30, 0x04, 0x00, 0x00, 0x07, 0x80, 0x58, 0xb0, 0x40, + 0x04, 0x02, 0x07, 0xfc, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x03, + 0x41, 0x78, 0x10, 0x00, 0x04, 0x01, 0xf0, 0xa7, 0x59, 0xc8, 0x00, 0x2c, + 0x82, 0x00, 0x05, 0x00, 0xff, 0xe0, 0xff, 0xff, 0x82, 0x08, 0x0d, 0x00, + 0x00, 0x1f, 0x00, 0x00, 0x80, 0x04, 0x05, 0x40, 0x48, 0x03, 0x90, 0x2c, + 0x04, 0x01, 0xf8, 0x26, 0x80, 0x24, 0x48, 0x00, 0x82, 0x24, 0x05, 0x80, + 0x00, 0x00, 0x01, 0x10, 0x04, 0x02, 0x07, 0xfc, 0x04, 0x01, 0xf8, 0xa2, + 0x41, 0x78, 0x48, 0x00, 0x04, 0x01, 0xf8, 0x4c, 0x59, 0xc8, 0x00, 0x34, + 0x82, 0x08, 0x0d, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x1f, 0x00, 0x00, 0x80, 0x04, 0x05, 0x80, 0x04, 0x00, 0x00, 0x06, + 0x59, 0xa8, 0x00, 0x60, 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x50, 0x60, + 0x40, 0x24, 0x00, 0x00, 0x48, 0x03, 0x50, 0x5f, 0x80, 0x24, 0x48, 0x00, + 0x82, 0x24, 0x05, 0x80, 0x00, 0x00, 0x01, 0x10, 0x04, 0x02, 0x07, 0xf0, + 0x80, 0x30, 0x60, 0x00, 0x82, 0x30, 0x05, 0x80, 0x00, 0x10, 0x2b, 0xc5, + 0x04, 0x02, 0x07, 0xcf, 0x59, 0xa8, 0x08, 0x60, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x00, 0x00, 0x06, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x04, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x59, 0xa8, 0x18, 0x5f, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0x8d, 0x59, 0xc8, 0x00, 0x2c, + 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0x00, 0x00, 0x82, 0x08, 0x0d, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x80, 0x04, 0x05, 0x40, 0x48, 0x03, 0x90, 0x2c, + 0x48, 0x0b, 0x90, 0x28, 0x48, 0x0b, 0x90, 0x29, 0x59, 0xa8, 0x00, 0x61, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x03, + 0x48, 0x0b, 0x90, 0x2a, 0x48, 0x0b, 0x90, 0x2b, 0x59, 0xc8, 0x00, 0x2d, + 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0xfc, 0x00, 0x80, 0x24, 0x05, 0x40, + 0x48, 0x03, 0x90, 0x2d, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x01, 0xf4, + 0x59, 0xc8, 0x00, 0x2c, 0x82, 0x00, 0x05, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x07, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xfb, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x03, 0x41, 0x78, 0x10, 0x00, + 0x04, 0x01, 0xf0, 0x5a, 0x4a, 0x03, 0x90, 0x2e, 0x00, 0x00, 0x00, 0x01, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x01, 0xf4, 0x59, 0xc8, 0x00, 0x2e, + 0x8c, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x06, 0x80, 0x58, 0xb0, 0x40, + 0x04, 0x02, 0x07, 0xfc, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x03, + 0x04, 0x01, 0xf0, 0x4e, 0x1c, 0x01, 0xf0, 0x00, 0x41, 0x78, 0x38, 0x00, + 0x59, 0xc8, 0x00, 0x2d, 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0xfc, 0x00, + 0x80, 0x24, 0x0d, 0x40, 0x48, 0x07, 0x90, 0x2d, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x01, 0xf4, 0x59, 0xc8, 0x00, 0x2c, 0x82, 0x00, 0x05, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, 0x58, 0xb0, 0x40, + 0x04, 0x02, 0x07, 0xfb, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x03, + 0x41, 0x78, 0x10, 0x00, 0x04, 0x01, 0xf0, 0x3b, 0x59, 0xc8, 0x18, 0x30, + 0x59, 0xc8, 0x00, 0x30, 0x80, 0x0c, 0x0d, 0x80, 0x04, 0x02, 0x07, 0xfd, + 0x80, 0x08, 0x0d, 0x80, 0x04, 0x00, 0x00, 0x02, 0x80, 0x1c, 0x38, 0x00, + 0x59, 0xc8, 0x20, 0x31, 0x59, 0xc8, 0x00, 0x31, 0x80, 0x10, 0x0d, 0x80, + 0x04, 0x02, 0x07, 0xfd, 0x80, 0x08, 0x0d, 0x80, 0x04, 0x00, 0x00, 0x02, + 0x80, 0x1c, 0x38, 0x00, 0x59, 0xa8, 0x00, 0x61, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x19, 0x59, 0xc8, 0x28, 0x32, + 0x59, 0xc8, 0x00, 0x32, 0x80, 0x14, 0x0d, 0x80, 0x04, 0x02, 0x07, 0xfd, + 0x80, 0x08, 0x0d, 0x80, 0x04, 0x00, 0x00, 0x02, 0x80, 0x1c, 0x38, 0x00, + 0x59, 0xc8, 0x30, 0x33, 0x59, 0xc8, 0x00, 0x33, 0x80, 0x18, 0x0d, 0x80, + 0x04, 0x02, 0x07, 0xfd, 0x80, 0x08, 0x0d, 0x80, 0x04, 0x00, 0x00, 0x02, + 0x80, 0x1c, 0x38, 0x00, 0x59, 0xc8, 0x00, 0x34, 0x59, 0xc8, 0x08, 0x34, + 0x80, 0x04, 0x0d, 0x80, 0x04, 0x02, 0x07, 0xfd, 0x80, 0x08, 0x0d, 0x80, + 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x0c, + 0x80, 0x1c, 0x38, 0x00, 0x04, 0x01, 0xf0, 0x0a, 0x59, 0xc8, 0x00, 0x34, + 0x59, 0xc8, 0x08, 0x34, 0x80, 0x04, 0x0d, 0x80, 0x04, 0x02, 0x07, 0xfd, + 0x80, 0x08, 0x0d, 0x80, 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0x02, 0x80, 0x1c, 0x38, 0x00, 0x80, 0x1c, 0x39, 0xc0, + 0x04, 0x00, 0x00, 0x05, 0x59, 0xa8, 0x00, 0x60, 0x80, 0x1c, 0x04, 0x00, + 0x48, 0x03, 0x50, 0x60, 0x48, 0x27, 0x50, 0x5f, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0x42, 0x06, 0x48, 0x07, 0x44, 0x06, 0x48, 0x0b, 0x42, 0x07, + 0x48, 0x0f, 0x44, 0x07, 0x48, 0x13, 0x42, 0x08, 0x48, 0x17, 0x44, 0x08, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0x90, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x07, 0xff, + 0x1c, 0x01, 0xf0, 0x00, 0x5a, 0x5a, 0x5a, 0x5a, 0xa5, 0xa5, 0xa5, 0xa5, + 0x59, 0xa0, 0x0c, 0x0a, 0x80, 0x04, 0x09, 0xc0, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x1e, 0xdd, 0x82, 0x04, 0x04, 0x80, 0x00, 0x00, 0x00, 0x21, + 0x02, 0x02, 0x10, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x82, 0x04, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x10, 0x03, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x59, 0xa0, 0x02, 0x08, 0x59, 0xa0, 0x14, 0x07, + 0x90, 0x08, 0x11, 0xc0, 0x80, 0x08, 0x15, 0x40, 0x59, 0xa0, 0x02, 0x07, + 0x59, 0xa0, 0x1c, 0x06, 0x90, 0x0c, 0x19, 0xc0, 0x80, 0x0c, 0x1d, 0x40, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xb6, 0x04, 0x00, 0x00, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xda, 0x4a, 0x01, 0xd8, 0x09, + 0x00, 0x10, 0x2b, 0xe6, 0x1c, 0x01, 0xf0, 0x00, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x40, 0x31, 0xd8, 0x00, 0x58, 0xef, 0x40, 0x0b, 0x58, 0xec, 0x00, 0x02, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x1e, 0xd1, 0x59, 0xa0, 0x0c, 0x0a, 0x82, 0x04, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x10, 0x03, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x59, 0xa0, 0x04, 0x0b, 0x59, 0xa0, 0x12, 0x0b, + 0x90, 0x08, 0x11, 0xc0, 0x80, 0x08, 0x15, 0x40, 0x59, 0xa0, 0x02, 0x09, + 0x59, 0xa0, 0x1c, 0x08, 0x90, 0x0c, 0x19, 0xc0, 0x80, 0x0c, 0x1d, 0x40, + 0x58, 0xec, 0x00, 0x03, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xdd, + 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x2c, 0x01, 0x1c, 0x01, 0xf0, 0x00, + 0x40, 0x31, 0xd8, 0x00, 0x58, 0xef, 0x40, 0x0b, 0x58, 0xec, 0x00, 0x02, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x1e, 0xd1, 0x59, 0xa0, 0x0c, 0x0a, 0x82, 0x04, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x11, 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x1e, 0x8d, + 0x82, 0x04, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x10, 0x59, 0xa0, 0x02, 0x08, + 0x59, 0xa0, 0x14, 0x07, 0x90, 0x08, 0x11, 0xc0, 0x80, 0x08, 0x15, 0x40, + 0x59, 0xa0, 0x02, 0x07, 0x59, 0xa0, 0x1c, 0x06, 0x90, 0x0c, 0x19, 0xc0, + 0x80, 0x0c, 0x1d, 0x40, 0x82, 0x08, 0x14, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x58, 0xec, 0x00, 0x03, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xda, + 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x2c, 0x1f, 0x1c, 0x01, 0xf0, 0x00, + 0x40, 0x31, 0xd8, 0x00, 0x58, 0xef, 0x40, 0x0b, 0x58, 0xec, 0x00, 0x02, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x1e, 0xd1, 0x59, 0xa0, 0x04, 0x0a, 0x82, 0x00, 0x0c, 0x80, + 0x00, 0x00, 0x00, 0x10, 0x59, 0xa0, 0x04, 0x0b, 0x59, 0xa0, 0x12, 0x0b, + 0x90, 0x08, 0x11, 0xc0, 0x80, 0x08, 0x15, 0x40, 0x59, 0xa0, 0x02, 0x09, + 0x59, 0xa0, 0x1c, 0x08, 0x90, 0x0c, 0x19, 0xc0, 0x80, 0x0c, 0x1d, 0x40, + 0x82, 0x08, 0x14, 0x00, 0x00, 0x00, 0x00, 0x40, 0x58, 0xec, 0x00, 0x03, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xdd, 0x4a, 0x01, 0xd8, 0x09, + 0x00, 0x10, 0x1e, 0x86, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0xef, 0xc8, 0x57, + 0x59, 0xa0, 0x02, 0x07, 0x59, 0xa0, 0x14, 0x07, 0x90, 0x00, 0x01, 0xc0, + 0x80, 0x08, 0x15, 0x40, 0x59, 0xa0, 0x02, 0x09, 0x59, 0xa0, 0x1c, 0x09, + 0x90, 0x00, 0x01, 0xc0, 0x80, 0x0c, 0x1d, 0x40, 0x59, 0xa0, 0x04, 0x06, + 0x48, 0x03, 0x40, 0x00, 0x48, 0x0b, 0x40, 0x01, 0x48, 0x0f, 0x40, 0x02, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xb6, 0x04, 0x02, 0x00, 0x05, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xda, 0x4a, 0x01, 0xd8, 0x09, + 0x00, 0x10, 0x2c, 0x54, 0x1c, 0x01, 0xf0, 0x00, 0x40, 0x31, 0xd8, 0x00, + 0x58, 0xef, 0x40, 0x0b, 0x58, 0xee, 0x58, 0x0d, 0x58, 0xec, 0x00, 0x02, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x1e, 0xd1, 0x48, 0xef, 0xc8, 0x57, 0x49, 0xa3, 0xc8, 0x57, + 0x49, 0x2f, 0xc8, 0x57, 0x59, 0x2c, 0x0a, 0x04, 0x80, 0x04, 0x09, 0x10, + 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x19, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x48, 0x05, 0xd8, 0x0c, + 0x04, 0x01, 0xf0, 0x0a, 0x40, 0x31, 0xd8, 0x00, 0x58, 0xef, 0x40, 0x0b, + 0x58, 0xec, 0x00, 0x02, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xd1, 0x48, 0xef, 0xc8, 0x57, + 0x49, 0xa3, 0xc8, 0x57, 0x48, 0xef, 0xc8, 0x57, 0x49, 0xa3, 0xc8, 0x57, + 0x58, 0xec, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x12, + 0x48, 0x01, 0xd8, 0x0c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xb6, + 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x58, 0xec, 0x10, 0x07, 0x58, 0xec, 0x18, 0x08, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xda, 0x4a, 0x01, 0xd8, 0x09, + 0x00, 0x10, 0x2c, 0x68, 0x1c, 0x01, 0xf0, 0x00, 0x58, 0xee, 0x58, 0x0d, + 0x48, 0xef, 0xc8, 0x57, 0x49, 0xa3, 0xc8, 0x57, 0x49, 0x2f, 0xc8, 0x57, + 0x49, 0x2f, 0x30, 0x04, 0x59, 0x2c, 0x04, 0x04, 0x84, 0x00, 0x05, 0x5e, + 0x48, 0x02, 0x5c, 0x04, 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x2c, 0x92, + 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0x2c, 0x00, 0x00, 0x58, 0xee, 0x58, 0x0d, + 0x48, 0xef, 0xc8, 0x57, 0x49, 0xa3, 0xc8, 0x57, 0x49, 0x2f, 0xc8, 0x57, + 0x59, 0x2c, 0x04, 0x04, 0x84, 0x00, 0x05, 0x1e, 0x48, 0x02, 0x5c, 0x04, + 0x59, 0xa0, 0x00, 0x00, 0x59, 0xa0, 0x10, 0x01, 0x59, 0xa0, 0x18, 0x02, + 0x80, 0x08, 0x14, 0x00, 0x82, 0x0c, 0x1c, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x83, 0x2c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x5c, 0x02, 0x58, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x36, 0xdd, 0x8d, 0x0e, 0x1d, 0x0e, 0x04, 0x00, 0x00, 0x05, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x07, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x59, 0xa0, 0x32, 0x0b, + 0x82, 0x18, 0x35, 0x00, 0x00, 0x00, 0x00, 0xff, 0x59, 0xa2, 0x8c, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x1e, 0xdd, 0x83, 0x44, 0x05, 0x80, 0x00, 0x00, 0x07, 0xfd, + 0x04, 0x00, 0x00, 0x08, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x19, + 0x04, 0x00, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x09, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x36, 0xb6, 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x80, 0x18, 0x31, 0xc0, 0x04, 0x00, 0x00, 0x0a, 0x41, 0x2c, 0x08, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xb6, 0x04, 0x02, 0x00, 0x05, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x40, 0x06, 0x58, 0x00, 0x4a, 0x02, 0x5c, 0x04, + 0x00, 0x00, 0x80, 0x00, 0x49, 0x7a, 0x5a, 0x04, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x89, 0x14, 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x2c, 0xe5, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x2c, 0x00, 0x05, 0x82, 0x00, 0x05, 0x80, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x04, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x59, 0x2c, 0x04, 0x06, + 0x82, 0x00, 0x2d, 0x00, 0x00, 0x00, 0xff, 0x00, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x80, 0x00, 0x09, 0x04, 0x80, 0x04, 0x08, 0x00, + 0x82, 0x04, 0x04, 0x80, 0x00, 0x00, 0x00, 0x06, 0x04, 0x00, 0x10, 0x03, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x05, 0x4c, 0x50, 0x00, 0x00, + 0x4c, 0x54, 0x00, 0x00, 0x4c, 0x58, 0x00, 0x00, 0x83, 0x2c, 0xa4, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x40, 0x50, 0xa8, 0x00, 0x40, 0x04, 0xb0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x41, 0x59, 0xa0, 0x04, 0x07, + 0x59, 0xa0, 0x12, 0x07, 0x90, 0x08, 0x11, 0xc0, 0x80, 0x08, 0x15, 0x40, + 0x59, 0xa0, 0x04, 0x09, 0x59, 0xa0, 0x1a, 0x09, 0x90, 0x0c, 0x19, 0xc0, + 0x80, 0x0c, 0x1d, 0x40, 0x83, 0x2c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x4c, 0x14, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xdd, + 0x5c, 0x00, 0x28, 0x00, 0x80, 0x14, 0x29, 0xc0, 0x04, 0x00, 0x00, 0x03, + 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x2d, 0x18, 0x5c, 0x00, 0xb0, 0x00, + 0x5c, 0x00, 0xa8, 0x00, 0x5c, 0x00, 0xa0, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x40, 0x31, 0xd8, 0x00, 0x58, 0xef, 0x40, 0x0b, 0x58, 0xee, 0x58, 0x0d, + 0x58, 0xec, 0x00, 0x02, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xd1, 0x81, 0x2e, 0x59, 0xc0, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0x2c, 0x00, 0x06, + 0x82, 0x00, 0x05, 0x00, 0xff, 0x00, 0x00, 0x00, 0x80, 0x00, 0x09, 0x04, + 0x80, 0x04, 0x09, 0xc0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xd1, + 0x82, 0x04, 0x04, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x04, 0x00, 0x10, 0x03, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x59, 0x2e, 0x58, 0x01, + 0x81, 0x2e, 0x59, 0xc0, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x4c, 0x50, 0x00, 0x00, 0x4c, 0x54, 0x00, 0x00, 0x4c, 0x58, 0x00, 0x00, + 0x83, 0x2c, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x05, 0x40, 0x50, 0xa8, 0x00, + 0x40, 0x04, 0xb0, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x41, + 0x5c, 0x00, 0xb0, 0x00, 0x5c, 0x00, 0xa8, 0x00, 0x5c, 0x00, 0xa0, 0x00, + 0x58, 0xec, 0x10, 0x07, 0x58, 0xec, 0x18, 0x08, 0x83, 0x2c, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x36, 0xdd, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xb6, 0x04, 0x02, 0x00, 0x05, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x59, 0xa0, 0x0c, 0x06, 0x82, 0x04, 0x05, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x84, 0x00, 0x01, 0xc0, 0x82, 0x00, 0x14, 0x80, + 0x00, 0x00, 0x00, 0x07, 0x02, 0x02, 0x10, 0x00, 0x00, 0x10, 0x1e, 0xdd, + 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x2d, 0x5c, 0x00, 0x10, 0x2d, 0x63, + 0x00, 0x10, 0x2d, 0x6a, 0x00, 0x10, 0x2d, 0x6a, 0x00, 0x10, 0x2d, 0x6a, + 0x00, 0x10, 0x2d, 0x6c, 0x00, 0x10, 0x2d, 0x71, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x0d, 0x42, 0x00, 0x38, 0x00, 0x00, 0x10, 0x2d, 0x85, + 0x4a, 0x03, 0x40, 0x00, 0x00, 0x10, 0xac, 0xb8, 0x04, 0x01, 0xf0, 0x13, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x42, 0x00, 0x38, 0x00, + 0x00, 0x10, 0x2d, 0x85, 0x4a, 0x03, 0x40, 0x00, 0x00, 0x10, 0xac, 0xc5, + 0x04, 0x01, 0xf0, 0x0c, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xdd, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x38, 0x00, + 0x00, 0x10, 0x2d, 0x98, 0x04, 0x01, 0xf0, 0x05, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x42, 0x00, 0x38, 0x00, 0x00, 0x10, 0x2d, 0xe2, + 0x59, 0xa0, 0x02, 0x07, 0x59, 0xa0, 0x14, 0x07, 0x90, 0x00, 0x01, 0xc0, + 0x80, 0x08, 0x15, 0x40, 0x59, 0xa0, 0x02, 0x09, 0x59, 0xa0, 0x1c, 0x09, + 0x90, 0x00, 0x01, 0xc0, 0x80, 0x0c, 0x1d, 0x40, 0x83, 0x2c, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x4c, 0x1c, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x36, 0xda, 0x5c, 0x00, 0x38, 0x00, 0x48, 0x1d, 0xd8, 0x09, + 0x1c, 0x01, 0xf0, 0x00, 0x40, 0x31, 0xd8, 0x00, 0x58, 0xef, 0x40, 0x0b, + 0x58, 0xee, 0x58, 0x0d, 0x58, 0xec, 0x00, 0x02, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xd1, + 0x4a, 0x03, 0x50, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x0d, 0x59, 0xa0, 0xa8, 0x00, 0x83, 0x2c, 0xa4, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0x8d, 0x40, 0x31, 0xd8, 0x00, + 0x58, 0xef, 0x40, 0x0b, 0x58, 0xee, 0x58, 0x0d, 0x58, 0xec, 0x00, 0x02, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x1e, 0xd1, 0x83, 0x2c, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x50, 0x50, 0x00, 0x00, 0x82, 0x00, 0x15, 0x00, 0x00, 0x0c, 0x00, 0x16, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x82, 0x50, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x50, 0x04, 0x00, 0x00, 0x82, 0x00, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, + 0x50, 0x50, 0x00, 0x00, 0x82, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x28, + 0x04, 0x00, 0x00, 0x1d, 0x82, 0x08, 0x15, 0x80, 0x00, 0x00, 0x00, 0x28, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x80, 0x50, 0x08, 0x00, + 0x50, 0x04, 0x00, 0x00, 0x82, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x13, + 0x82, 0x08, 0x15, 0x80, 0x00, 0x00, 0x00, 0x13, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x1e, 0xdd, 0x80, 0x04, 0x08, 0x00, 0x50, 0x04, 0x00, 0x00, + 0x82, 0x00, 0x15, 0x00, 0x00, 0x01, 0x00, 0x00, 0x82, 0x08, 0x15, 0x80, + 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, + 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x12, + 0x59, 0x9c, 0x00, 0x19, 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x02, 0x00, 0x0f, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x80, 0x50, 0x08, 0x00, + 0x50, 0x04, 0x00, 0x00, 0x82, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x13, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x80, 0x04, 0x08, 0x00, + 0x50, 0x04, 0x00, 0x00, 0x82, 0x00, 0x15, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0xa8, 0x00, 0x00, 0x10, 0xac, 0xb0, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0x8d, 0x40, 0x31, 0xd8, 0x00, 0x58, 0xef, 0x40, 0x0b, + 0x58, 0xee, 0x58, 0x0d, 0x58, 0xec, 0x00, 0x02, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xd1, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x04, 0x42, 0x00, 0xa8, 0x00, + 0x00, 0x10, 0xb0, 0xc9, 0x83, 0x2c, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, 0x85, 0x0e, 0x1d, 0x50, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0x8d, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x36, 0xb6, 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x59, 0xa0, 0x0c, 0x06, 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x84, 0x00, 0x01, 0xc0, 0x82, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, 0x06, + 0x02, 0x02, 0x10, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x0c, 0x01, 0xf0, 0x01, + 0x00, 0x10, 0x2e, 0x0b, 0x00, 0x10, 0x2e, 0x10, 0x00, 0x10, 0x2e, 0x15, + 0x00, 0x10, 0x2e, 0x15, 0x00, 0x10, 0x2e, 0x15, 0x00, 0x10, 0x2e, 0x17, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x42, 0x00, 0xa0, 0x00, + 0x00, 0x10, 0xac, 0xb8, 0x04, 0x01, 0xf0, 0x0c, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x0d, 0x42, 0x00, 0xa0, 0x00, 0x00, 0x10, 0xac, 0xc5, + 0x04, 0x01, 0xf0, 0x07, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xdd, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0xa0, 0x00, + 0x00, 0x10, 0xac, 0xb0, 0x40, 0x04, 0xb0, 0x00, 0x83, 0x2c, 0xac, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, + 0x59, 0xa0, 0x02, 0x07, 0x59, 0xa0, 0x14, 0x07, 0x90, 0x00, 0x01, 0xc0, + 0x80, 0x08, 0x15, 0x40, 0x59, 0xa0, 0x02, 0x09, 0x59, 0xa0, 0x1c, 0x09, + 0x90, 0x00, 0x01, 0xc0, 0x80, 0x0c, 0x1d, 0x40, 0x83, 0x2c, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x36, 0xdd, + 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x05, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x07, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x59, 0xa0, 0x14, 0x06, 0x80, 0x08, 0x11, 0xc0, + 0x04, 0x02, 0x00, 0x17, 0x59, 0xc4, 0x08, 0x01, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x01, 0x80, 0x00, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x04, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf0, 0x44, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x80, 0x00, + 0x04, 0x02, 0x00, 0x04, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf0, 0x3e, 0x82, 0x04, 0x05, 0x80, 0x00, 0x01, 0x00, 0x00, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x01, 0xf0, 0x37, 0x59, 0xa8, 0x00, 0x6c, + 0x8c, 0x00, 0x05, 0x08, 0x04, 0x00, 0x00, 0x05, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x08, 0x00, 0x04, 0x01, 0xf0, 0x03, + 0x59, 0xa0, 0x02, 0x07, 0x59, 0xa8, 0x08, 0x50, 0x48, 0x03, 0x50, 0x50, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0x82, 0x04, 0x00, 0x00, 0x0d, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0x92, 0x04, 0x00, 0x00, 0x0a, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0xa2, 0x04, 0x00, 0x00, 0x07, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0xb2, 0x04, 0x00, 0x00, 0x04, + 0x48, 0x07, 0x50, 0x50, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xdd, + 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, 0x04, 0x02, 0x00, 0x1b, + 0x59, 0xc4, 0x00, 0x06, 0x84, 0x00, 0x05, 0x00, 0x48, 0x03, 0x88, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x67, 0x25, 0x49, 0x7b, 0x88, 0x80, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa1, 0xd8, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa1, 0xe6, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x99, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x48, 0x03, 0xc8, 0x56, + 0x85, 0x0e, 0x1d, 0x48, 0x4a, 0x03, 0x88, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x42, 0x02, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x04, 0x4a, 0x03, 0x88, 0x05, + 0x00, 0x00, 0x00, 0x01, 0x4a, 0x03, 0x50, 0x46, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x05, 0xfc, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0x8d, 0x8d, 0x0e, 0x1d, 0x0e, 0x04, 0x00, 0x00, 0x05, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x07, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x59, 0xa2, 0x8c, 0x06, + 0x59, 0xa0, 0x32, 0x0b, 0x82, 0x18, 0x35, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x1e, 0xdd, 0x83, 0x44, 0x05, 0x80, 0x00, 0x00, 0x07, 0xfd, + 0x04, 0x00, 0x00, 0x08, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x19, + 0x04, 0x00, 0x00, 0x05, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x36, 0xb6, 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x49, 0x7a, 0x5a, 0x04, 0x4a, 0x02, 0x5c, 0x04, 0x00, 0x00, 0x80, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x89, 0x29, 0x04, 0x02, 0x00, 0x05, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x2e, 0xb7, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x2c, 0x00, 0x05, 0x82, 0x00, 0x0d, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x82, 0x00, 0x05, 0x80, 0x01, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x05, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x80, 0x04, 0x09, 0x04, 0x4c, 0x50, 0x00, 0x00, + 0x4c, 0x54, 0x00, 0x00, 0x4c, 0x58, 0x00, 0x00, 0x83, 0x2c, 0xa4, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x40, 0x50, 0xa8, 0x00, 0x40, 0x04, 0xb0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x41, 0x5c, 0x00, 0xb0, 0x00, + 0x5c, 0x00, 0xa8, 0x00, 0x5c, 0x00, 0xa0, 0x00, 0x59, 0xa0, 0x02, 0x07, + 0x59, 0xa0, 0x14, 0x07, 0x90, 0x00, 0x01, 0xc0, 0x80, 0x08, 0x15, 0x40, + 0x59, 0xa0, 0x02, 0x09, 0x59, 0xa0, 0x1c, 0x09, 0x90, 0x00, 0x01, 0xc0, + 0x80, 0x0c, 0x1d, 0x40, 0x83, 0x2c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x36, 0xdd, 0x49, 0x6f, 0xc8, 0x57, + 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x1a, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x3d, 0xec, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x59, 0xa0, 0x04, 0x07, 0x59, 0xa0, 0x12, 0x07, + 0x90, 0x08, 0x11, 0xc0, 0x80, 0x08, 0x15, 0x40, 0x59, 0xa0, 0x04, 0x09, + 0x59, 0xa0, 0x1a, 0x09, 0x90, 0x0c, 0x19, 0xc0, 0x80, 0x0c, 0x1d, 0x40, + 0x41, 0x9c, 0x00, 0x00, 0x49, 0xa3, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x36, 0xda, 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x2e, 0xf9, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x33, 0xc8, 0x57, 0x40, 0x31, 0xd8, 0x00, + 0x58, 0xef, 0x40, 0x0b, 0x58, 0xec, 0x00, 0x02, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xd1, + 0x59, 0x9c, 0x02, 0x00, 0x80, 0x00, 0x01, 0xc0, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x1e, 0xdd, 0x59, 0xa8, 0x00, 0x6c, 0x8c, 0x00, 0x05, 0x04, + 0x04, 0x02, 0x00, 0x03, 0x8c, 0x00, 0x05, 0x06, 0x04, 0x00, 0x00, 0x04, + 0x59, 0x9c, 0x00, 0x19, 0x84, 0x00, 0x05, 0x0c, 0x48, 0x03, 0x38, 0x19, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x90, 0x2b, 0x59, 0xa8, 0x00, 0x6c, + 0x8c, 0x00, 0x05, 0x02, 0x04, 0x00, 0x00, 0x04, 0x59, 0x9c, 0x00, 0x17, + 0x84, 0x00, 0x05, 0x08, 0x48, 0x03, 0x38, 0x17, 0x85, 0x0e, 0x1d, 0x20, + 0x59, 0x9c, 0x00, 0x17, 0x8c, 0x00, 0x05, 0x08, 0x04, 0x00, 0x00, 0x03, + 0x85, 0x0e, 0x1d, 0x60, 0x04, 0x01, 0xf0, 0x04, 0x8c, 0x00, 0x05, 0x0a, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x48, 0x03, 0xc8, 0x57, + 0x8c, 0x00, 0x05, 0x04, 0x04, 0x02, 0x00, 0x04, 0x59, 0xc4, 0x08, 0xa3, + 0x84, 0x04, 0x0d, 0x7a, 0x48, 0x07, 0x88, 0xa3, 0x8c, 0x00, 0x05, 0x02, + 0x04, 0x02, 0x00, 0x04, 0x59, 0xc4, 0x08, 0xa3, 0x84, 0x04, 0x0d, 0x08, + 0x48, 0x07, 0x88, 0xa3, 0x59, 0x9c, 0x0c, 0x02, 0x8c, 0x00, 0x05, 0x00, + 0x04, 0x02, 0x00, 0x04, 0x8c, 0x00, 0x05, 0x16, 0x04, 0x00, 0x00, 0x12, + 0x04, 0x01, 0xf0, 0x01, 0x82, 0x04, 0x14, 0x80, 0x00, 0x00, 0x00, 0x7f, + 0x02, 0x02, 0x10, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x82, 0x04, 0x14, 0x00, + 0x00, 0x10, 0x1c, 0xdd, 0x50, 0x08, 0x10, 0x00, 0x82, 0x08, 0x15, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x8c, 0x00, 0x05, 0x00, 0x04, 0x02, 0x00, 0x06, + 0x48, 0x0b, 0x50, 0x0f, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x99, 0x59, 0x9c, 0x00, 0x19, + 0x8c, 0x00, 0x05, 0x06, 0x04, 0x00, 0x00, 0x03, 0x4a, 0x03, 0xb8, 0x05, + 0x90, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x02, 0x00, 0x0b, + 0x59, 0xa8, 0x08, 0x05, 0x8c, 0x04, 0x0d, 0x14, 0x04, 0x00, 0x00, 0x08, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x10, 0xac, 0xb0, 0x50, 0x04, 0x08, 0x00, + 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x28, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x1e, 0xdd, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x04, 0x00, 0x00, 0x03, 0x80, 0x00, 0x01, 0x08, 0x04, 0x01, 0xf0, 0x03, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x48, 0x03, 0x90, 0x40, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x82, 0x00, 0x04, 0x00, + 0x00, 0x10, 0x30, 0x3e, 0x50, 0x00, 0x10, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x99, 0x59, 0x9c, 0x02, 0x01, 0x82, 0x00, 0x0c, 0x80, + 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x1e, 0xdd, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x08, 0x41, 0x02, 0x02, 0x10, 0x00, + 0x00, 0x10, 0x1e, 0xdd, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x59, 0x9c, 0x04, 0x01, + 0x80, 0x00, 0x05, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, + 0x59, 0x9c, 0x04, 0x09, 0x59, 0x9c, 0x0c, 0x07, 0x80, 0x04, 0x0c, 0x80, + 0x02, 0x02, 0x10, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x80, 0x00, 0x00, 0x40, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x59, 0x9c, 0x02, 0x09, + 0x59, 0x9c, 0x0a, 0x07, 0x80, 0x04, 0x0c, 0x80, 0x02, 0x02, 0x10, 0x00, + 0x00, 0x10, 0x1e, 0xdd, 0x80, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x1e, 0xdd, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4f, 0x4b, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4a, 0x4f, 0x59, 0x9c, 0x02, 0x01, + 0x48, 0x03, 0x50, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x12, 0x0d, + 0x59, 0x9c, 0x02, 0x0a, 0x80, 0x00, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x03, + 0x48, 0x03, 0x50, 0x4a, 0x04, 0x01, 0xf0, 0x03, 0x4a, 0x03, 0x50, 0x4a, + 0x00, 0x00, 0x00, 0xc8, 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x00, 0x00, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0xc6, 0x41, 0x7a, 0x50, 0x00, + 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x9a, + 0x59, 0x9c, 0x00, 0x03, 0x59, 0x9c, 0x08, 0x04, 0x9c, 0x00, 0x01, 0xc0, + 0x9c, 0x04, 0x09, 0xc0, 0x48, 0x03, 0x50, 0x02, 0x48, 0x07, 0x50, 0x03, + 0x59, 0x9c, 0x10, 0x17, 0x8c, 0x08, 0x15, 0x1c, 0x04, 0x00, 0x00, 0x06, + 0x59, 0x9c, 0x00, 0x05, 0x59, 0x9c, 0x08, 0x06, 0x9c, 0x00, 0x01, 0xc0, + 0x9c, 0x04, 0x09, 0xc0, 0x04, 0x01, 0xf0, 0x03, 0x82, 0x00, 0x05, 0x00, + 0xf0, 0xff, 0xff, 0xff, 0x48, 0x03, 0x50, 0x00, 0x48, 0x07, 0x50, 0x01, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0xac, 0xb8, 0x48, 0x00, 0x10, 0x00, + 0x48, 0x04, 0x10, 0x01, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0xac, 0xc5, + 0x48, 0x00, 0x10, 0x00, 0x48, 0x04, 0x10, 0x01, 0x59, 0xa8, 0x00, 0x6c, + 0x8c, 0x00, 0x05, 0x08, 0x04, 0x02, 0x00, 0x17, 0x8c, 0x00, 0x05, 0x0a, + 0x04, 0x02, 0x00, 0x21, 0x59, 0x9c, 0x10, 0x19, 0x82, 0x08, 0x15, 0x00, + 0x00, 0x00, 0xe0, 0x00, 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x0c, 0x4a, 0x03, 0x50, 0x50, 0x00, 0x00, 0x00, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x17, 0xf8, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x17, 0x8b, 0x04, 0x01, 0xf0, 0x2b, + 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0x20, 0x00, 0x04, 0x02, 0x00, 0x0a, + 0x4a, 0x03, 0x50, 0x50, 0x00, 0x00, 0x00, 0x01, 0x41, 0x78, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x17, 0xf8, 0x41, 0x78, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x17, 0x8b, 0x04, 0x01, 0xf0, 0x1f, + 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0x40, 0x00, 0x04, 0x02, 0x00, 0x06, + 0x4a, 0x03, 0x50, 0x50, 0x00, 0x00, 0x00, 0x02, 0x4a, 0x03, 0x50, 0x46, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x17, 0x82, 0x08, 0x05, 0x80, + 0x00, 0x00, 0x60, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, + 0x59, 0xa8, 0x08, 0x55, 0x82, 0x04, 0x0d, 0x80, 0x01, 0x39, 0x10, 0x77, + 0x04, 0x02, 0x00, 0x05, 0x59, 0xe0, 0x08, 0x13, 0x8c, 0x04, 0x0d, 0x00, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x4a, 0x03, 0x50, 0x50, + 0x00, 0x00, 0x00, 0x03, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x17, 0xf8, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x17, 0x8b, + 0x59, 0x9c, 0x00, 0x19, 0x8c, 0x00, 0x05, 0x20, 0x04, 0x00, 0x00, 0x0d, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0xa5, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0xa5, + 0x4a, 0x03, 0x50, 0x2f, 0x00, 0x00, 0xaa, 0xaa, 0x59, 0x9c, 0x10, 0x18, + 0x82, 0x08, 0x15, 0x00, 0x00, 0x00, 0x00, 0x30, 0x59, 0xa8, 0x00, 0x69, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x0c, 0x82, 0x08, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, + 0x59, 0x9c, 0x10, 0x18, 0x82, 0x08, 0x15, 0x00, 0xff, 0xff, 0xff, 0xcf, + 0x82, 0x08, 0x15, 0x40, 0x00, 0x00, 0x00, 0x10, 0x48, 0x0b, 0x38, 0x18, + 0x04, 0x01, 0xf0, 0x10, 0x82, 0x08, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x07, 0x82, 0x08, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x10, + 0x04, 0x00, 0x00, 0x0a, 0x82, 0x08, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x20, + 0x04, 0x02, 0x00, 0x02, 0x48, 0x07, 0x50, 0x2f, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x37, 0x70, 0x04, 0x00, 0x00, 0x08, 0x48, 0x03, 0xc8, 0x56, + 0x85, 0x0e, 0x1d, 0x46, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0x59, + 0x59, 0xa8, 0x00, 0x27, 0x80, 0x04, 0x05, 0x40, 0x48, 0x03, 0x50, 0x27, + 0x49, 0xf3, 0xc8, 0x57, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x4b, 0xd9, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5b, 0x6f, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x10, 0x4b, 0xc8, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x63, + 0x4a, 0x03, 0x88, 0x05, 0xff, 0xff, 0xff, 0xff, 0x4a, 0x03, 0xc0, 0x14, + 0x00, 0x40, 0x00, 0x40, 0x4a, 0x03, 0xc0, 0x13, 0x00, 0x40, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x45, 0xe7, 0x59, 0xa0, 0x00, 0x1d, + 0x84, 0x00, 0x05, 0x40, 0x48, 0x03, 0x40, 0x1d, 0x49, 0xf3, 0xc8, 0x57, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0x8d, 0x00, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x20, + 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x05, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x59, 0xa0, 0x04, 0x07, 0x59, 0xa0, 0x12, 0x07, 0x90, 0x08, 0x11, 0xc0, + 0x80, 0x08, 0x15, 0x40, 0x59, 0xa0, 0x04, 0x09, 0x59, 0xa0, 0x1a, 0x09, + 0x90, 0x0c, 0x19, 0xc0, 0x80, 0x0c, 0x1d, 0x40, 0x41, 0x9c, 0x00, 0x00, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x36, 0xdd, 0x8d, 0x0e, 0x1d, 0x0e, + 0x04, 0x00, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x16, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x59, 0xa8, 0x00, 0x12, 0x8c, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x11, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x59, 0xa0, 0x04, 0x07, 0x59, 0xa0, 0x12, 0x07, + 0x90, 0x08, 0x11, 0xc0, 0x80, 0x08, 0x15, 0x40, 0x59, 0xa0, 0x04, 0x09, + 0x59, 0xa0, 0x1a, 0x09, 0x90, 0x0c, 0x19, 0xc0, 0x80, 0x0c, 0x1d, 0x40, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0xf0, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x36, 0xdd, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x01, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x42, 0x00, 0xa8, 0x00, + 0x00, 0x10, 0xb5, 0xf0, 0x42, 0x00, 0xa0, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x44, 0x50, 0xa8, 0x00, 0x80, 0x54, 0xa8, 0x00, 0x80, 0x58, 0xb0, 0x40, + 0x04, 0x02, 0x07, 0xfd, 0x4d, 0x44, 0x00, 0x00, 0x4d, 0x34, 0x00, 0x00, + 0x42, 0x02, 0x88, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x00, 0x20, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x42, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x18, 0x00, + 0x00, 0x10, 0xb5, 0xf0, 0x59, 0xa8, 0x10, 0x0f, 0x82, 0x08, 0x15, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x40, 0x18, 0x00, 0x00, 0x0c, 0x01, 0xf0, 0x01, + 0x00, 0x10, 0x30, 0x97, 0x00, 0x10, 0x30, 0x9a, 0x00, 0x10, 0x30, 0x9e, + 0x00, 0x10, 0x30, 0xa2, 0x82, 0x10, 0x25, 0x00, 0xff, 0xff, 0xff, 0x00, + 0x04, 0x01, 0xf0, 0x14, 0x82, 0x10, 0x25, 0x00, 0xff, 0xff, 0x00, 0xff, + 0x84, 0x08, 0x11, 0xc0, 0x04, 0x01, 0xf0, 0x10, 0x82, 0x10, 0x25, 0x00, + 0xff, 0x00, 0xff, 0xff, 0x90, 0x08, 0x11, 0xc0, 0x04, 0x01, 0xf0, 0x0c, + 0x82, 0x10, 0x25, 0x00, 0x00, 0xff, 0xff, 0xff, 0x9c, 0x08, 0x01, 0xc0, + 0x80, 0x10, 0x25, 0x40, 0x44, 0x10, 0x18, 0x00, 0x42, 0x00, 0x30, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x42, 0x00, 0x20, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0c, 0x18, 0x00, 0x04, 0x01, 0xf0, 0x03, 0x40, 0x08, 0x00, 0x00, + 0x80, 0x10, 0x25, 0x40, 0x81, 0x46, 0x88, 0x00, 0x83, 0x44, 0x2c, 0x80, + 0x00, 0x00, 0x00, 0x7f, 0x04, 0x02, 0x10, 0x14, 0x4c, 0x08, 0x00, 0x00, + 0x4c, 0x0c, 0x00, 0x00, 0x4c, 0x18, 0x00, 0x00, 0x4c, 0x1c, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, 0x5c, 0x00, 0x38, 0x00, + 0x5c, 0x00, 0x30, 0x00, 0x5c, 0x00, 0x18, 0x00, 0x5c, 0x00, 0x10, 0x00, + 0x04, 0x02, 0x07, 0xf2, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x25, + 0x04, 0x02, 0x07, 0xef, 0x80, 0x18, 0x30, 0x00, 0x80, 0x1c, 0x38, 0x00, + 0x59, 0x34, 0x12, 0x02, 0x40, 0x18, 0x00, 0x00, 0x0c, 0x01, 0xf7, 0xce, + 0x82, 0x10, 0x05, 0x80, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x02, + 0x44, 0x10, 0x18, 0x00, 0x42, 0x00, 0x18, 0x00, 0x00, 0x10, 0xb5, 0xf0, + 0x50, 0x0c, 0x00, 0x00, 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0xff, 0x00, + 0x80, 0x1c, 0x05, 0x40, 0x44, 0x00, 0x18, 0x00, 0x5c, 0x02, 0x68, 0x00, + 0x5c, 0x02, 0x88, 0x00, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x59, 0xa0, 0x04, 0x07, 0x59, 0xa0, 0x12, 0x07, 0x90, 0x08, 0x11, 0xc0, + 0x80, 0x08, 0x15, 0x40, 0x59, 0xa0, 0x04, 0x09, 0x59, 0xa0, 0x1a, 0x09, + 0x90, 0x0c, 0x19, 0xc0, 0x80, 0x0c, 0x1d, 0x40, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb5, 0xf0, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x36, 0xdd, + 0x59, 0xa2, 0x8c, 0x06, 0x59, 0xa0, 0x02, 0x0b, 0x8c, 0x00, 0x05, 0x00, + 0x04, 0x00, 0x00, 0x0e, 0x59, 0xa0, 0x12, 0x08, 0x59, 0xa0, 0x04, 0x08, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0x00, 0x01, 0xc0, + 0x80, 0x08, 0x15, 0x40, 0x41, 0x78, 0x40, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x46, 0x41, 0x04, 0x00, 0x00, 0x08, 0x48, 0x03, 0x44, 0x06, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0x5a, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xb6, 0x04, 0x02, 0x00, 0x05, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x59, 0xa0, 0x02, 0x0b, 0x8c, 0x00, 0x05, 0x00, + 0x04, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x25, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x37, 0x7a, 0x59, 0xa0, 0x02, 0x0b, + 0x8c, 0x00, 0x05, 0x02, 0x04, 0x00, 0x00, 0x19, 0x83, 0x44, 0x04, 0x80, + 0x00, 0x00, 0x07, 0xf0, 0x04, 0x02, 0x10, 0x16, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x47, 0x2e, 0x04, 0x02, 0x00, 0x13, 0x49, 0x7a, 0x5a, 0x04, + 0x4a, 0x02, 0x5c, 0x04, 0x00, 0x00, 0x80, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x88, 0xfa, 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x31, 0x1a, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0xa2, 0x8c, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x4c, 0x58, 0x00, 0x00, + 0x4c, 0x50, 0x00, 0x00, 0x4c, 0x54, 0x00, 0x00, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x0a, 0x41, 0x34, 0xa0, 0x00, 0x83, 0x2e, 0x5c, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x41, 0x2c, 0xa8, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x30, 0x83, 0x2c, 0xac, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x40, 0x54, 0xa0, 0x00, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x41, 0x5c, 0x00, 0xa8, 0x00, + 0x5c, 0x00, 0xa0, 0x00, 0x5c, 0x00, 0xb0, 0x00, 0x59, 0x2c, 0x08, 0x02, + 0x82, 0x04, 0x05, 0x00, 0x00, 0xff, 0x00, 0xff, 0x90, 0x00, 0x01, 0xc0, + 0x82, 0x04, 0x15, 0x00, 0xff, 0x00, 0xff, 0x00, 0x80, 0x08, 0x05, 0x40, + 0x48, 0x02, 0x58, 0x02, 0x59, 0x2c, 0x08, 0x01, 0x82, 0x04, 0x05, 0x00, + 0x00, 0xff, 0x00, 0xff, 0x90, 0x00, 0x01, 0xc0, 0x82, 0x04, 0x15, 0x00, + 0xff, 0x00, 0xff, 0x00, 0x80, 0x08, 0x05, 0x40, 0x48, 0x02, 0x58, 0x01, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x59, 0xa0, 0x04, 0x07, + 0x59, 0xa0, 0x12, 0x07, 0x90, 0x08, 0x11, 0xc0, 0x80, 0x08, 0x15, 0x40, + 0x59, 0xa0, 0x04, 0x09, 0x59, 0xa0, 0x1a, 0x09, 0x90, 0x0c, 0x19, 0xc0, + 0x80, 0x0c, 0x1d, 0x40, 0x41, 0x2c, 0x00, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x36, 0xdd, 0x49, 0x6f, 0xc8, 0x57, 0x49, 0x6f, 0x44, 0x06, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0x8d, 0x59, 0xa2, 0x8c, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x1e, 0xdd, 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x07, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x83, 0x34, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x59, 0xa0, 0x02, 0x0b, 0x8c, 0x00, 0x05, 0x00, + 0x04, 0x00, 0x00, 0x03, 0x83, 0x34, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x58, 0x04, 0x00, 0x01, 0x48, 0x03, 0x44, 0x09, 0x90, 0x00, 0x01, 0xc0, + 0x48, 0x03, 0x42, 0x09, 0x50, 0x04, 0x00, 0x00, 0x48, 0x03, 0x44, 0x07, + 0x90, 0x00, 0x01, 0xc0, 0x48, 0x03, 0x42, 0x07, 0x59, 0x34, 0x02, 0x00, + 0x48, 0x03, 0x44, 0x06, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0x8d, + 0x8d, 0x0e, 0x1d, 0x0e, 0x04, 0x00, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x59, 0xa0, 0x22, 0x0b, 0x8c, 0x10, 0x25, 0x00, 0x04, 0x02, 0x00, 0x2e, + 0x8c, 0x10, 0x25, 0x06, 0x04, 0x02, 0x00, 0x06, 0x59, 0xa0, 0x32, 0x08, + 0x82, 0x18, 0x04, 0x80, 0x00, 0x00, 0x00, 0x03, 0x02, 0x02, 0x10, 0x00, + 0x00, 0x10, 0x1e, 0xdd, 0x59, 0xa2, 0x8c, 0x06, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0x5a, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x19, 0x04, 0x00, 0x00, 0x05, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x09, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xb6, + 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x59, 0xa0, 0x22, 0x0b, + 0x8c, 0x10, 0x25, 0x06, 0x04, 0x00, 0x00, 0x04, 0x59, 0x34, 0x30, 0x02, + 0x82, 0x18, 0x35, 0x00, 0x00, 0xff, 0xff, 0xff, 0x49, 0x7a, 0x5a, 0x04, + 0x4a, 0x02, 0x5c, 0x04, 0x00, 0x00, 0x80, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x88, 0xbc, 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x32, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0xa2, 0x8c, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x47, 0x19, 0x04, 0x00, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x09, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xb6, 0x04, 0x02, 0x00, 0x05, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x49, 0x7a, 0x5a, 0x04, 0x4a, 0x02, 0x5c, 0x04, + 0x00, 0x00, 0x80, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xb6, + 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x59, 0x2e, 0x58, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0xd1, 0x04, 0x02, 0x00, 0x05, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x31, 0xd2, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x2c, 0x28, 0x05, 0x82, 0x14, 0x0d, 0x80, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x59, 0xa0, 0x02, 0x07, + 0x59, 0xa0, 0x14, 0x07, 0x90, 0x00, 0x01, 0xc0, 0x80, 0x08, 0x15, 0x40, + 0x59, 0xa0, 0x02, 0x09, 0x59, 0xa0, 0x1c, 0x09, 0x90, 0x00, 0x01, 0xc0, + 0x80, 0x0c, 0x1d, 0x40, 0x83, 0x2c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xdd, 0x8c, 0x14, 0x2d, 0x00, + 0x04, 0x00, 0x00, 0x03, 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x31, 0xed, + 0x1c, 0x01, 0xf0, 0x00, 0x40, 0x31, 0xd8, 0x00, 0x58, 0xef, 0x40, 0x0b, + 0x58, 0xee, 0x58, 0x0e, 0x58, 0xec, 0x00, 0x02, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xd1, + 0x81, 0x2e, 0x59, 0xc0, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x83, 0x2c, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x58, 0xec, 0x10, 0x07, 0x58, 0xec, 0x18, 0x08, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x36, 0xdd, 0x59, 0x2c, 0x00, 0x05, + 0x82, 0x00, 0x05, 0x80, 0x01, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x05, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x59, 0xa0, 0x02, 0x07, 0x59, 0xa0, 0x14, 0x07, + 0x90, 0x00, 0x01, 0xc0, 0x80, 0x08, 0x15, 0x40, 0x59, 0xa0, 0x02, 0x09, + 0x59, 0xa0, 0x1c, 0x09, 0x90, 0x00, 0x01, 0xc0, 0x80, 0x0c, 0x1d, 0x40, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x06, 0x83, 0x2c, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x36, 0xdd, + 0x59, 0xa0, 0x0a, 0x0a, 0x80, 0x04, 0x09, 0xc0, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x1e, 0xdd, 0x82, 0x04, 0x04, 0x80, 0x00, 0x00, 0x00, 0xe8, + 0x04, 0x00, 0x10, 0x03, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xe7, + 0x59, 0xa0, 0x02, 0x07, 0x59, 0xa0, 0x14, 0x07, 0x90, 0x00, 0x01, 0xc0, + 0x80, 0x08, 0x15, 0x40, 0x59, 0xa0, 0x02, 0x09, 0x59, 0xa0, 0x1c, 0x09, + 0x90, 0x00, 0x01, 0xc0, 0x80, 0x0c, 0x1d, 0x40, 0x83, 0x88, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xdd, + 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x32, 0x2e, 0x1c, 0x01, 0xf0, 0x00, + 0x40, 0x31, 0xd8, 0x00, 0x58, 0xef, 0x40, 0x0b, 0x58, 0xec, 0x00, 0x02, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x1e, 0xd1, 0x59, 0xa0, 0x02, 0x0b, 0x8c, 0x00, 0x05, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x83, 0x88, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x03, 0xc8, 0x40, 0x4a, 0x03, 0xc8, 0x42, 0x00, 0x00, 0x00, 0x06, + 0x04, 0x01, 0x10, 0x00, 0x49, 0x7b, 0x88, 0x85, 0x4a, 0x03, 0x42, 0x07, + 0x00, 0x00, 0x00, 0xe7, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0x8d, + 0x8d, 0x0e, 0x1d, 0x0e, 0x04, 0x00, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xb6, 0x04, 0x02, 0x00, 0x05, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x49, 0x7a, 0x5a, 0x04, 0x4a, 0x02, 0x5c, 0x04, + 0x00, 0x00, 0x80, 0x00, 0x59, 0xa0, 0x04, 0x06, 0x80, 0x00, 0x01, 0xc0, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x82, 0x00, 0x15, 0x80, + 0x00, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0x05, 0x82, 0x00, 0x14, 0x80, + 0x00, 0x00, 0x00, 0x04, 0x02, 0x02, 0x10, 0x00, 0x00, 0x10, 0x1e, 0xdd, + 0x40, 0x00, 0x10, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1c, 0x0c, + 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x03, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x4a, 0x01, 0xd8, 0x09, + 0x00, 0x10, 0x32, 0x69, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x2c, 0x00, 0x05, + 0x82, 0x00, 0x05, 0x80, 0x01, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x1e, 0x8d, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x04, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x59, 0xa0, 0x14, 0x06, + 0x8c, 0x08, 0x15, 0x08, 0x04, 0x02, 0x00, 0x07, 0x8d, 0x0e, 0x1d, 0x0e, + 0x04, 0x00, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x59, 0xa0, 0x1c, 0x07, + 0x82, 0x0c, 0x04, 0x80, 0x00, 0x00, 0x10, 0x00, 0x02, 0x02, 0x10, 0x00, + 0x00, 0x10, 0x1e, 0xdd, 0x49, 0x7b, 0x28, 0x04, 0x49, 0x7b, 0x28, 0x05, + 0x49, 0x7b, 0x28, 0x1c, 0x49, 0x7b, 0x28, 0x1d, 0x49, 0x7b, 0x28, 0x1f, + 0x49, 0x7b, 0x28, 0x20, 0x49, 0x7b, 0x28, 0x22, 0x49, 0x7b, 0x28, 0x23, + 0x48, 0x03, 0xc8, 0x56, 0x85, 0x0e, 0x1d, 0x06, 0x8c, 0x08, 0x15, 0x00, + 0x04, 0x00, 0x00, 0x05, 0x48, 0x03, 0xc8, 0x56, 0x83, 0x0e, 0x1d, 0x40, + 0x00, 0x00, 0x00, 0x11, 0x04, 0x01, 0xf0, 0x04, 0x8c, 0x08, 0x15, 0x06, + 0x04, 0x00, 0x00, 0x02, 0x85, 0x0e, 0x1d, 0x42, 0x85, 0x0e, 0x1d, 0x0a, + 0x42, 0x02, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x82, 0x08, 0x15, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0x80, 0x08, 0x01, 0x0a, 0x0c, 0x02, 0x00, 0x36, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x02, 0x00, 0x09, + 0x4a, 0x03, 0x50, 0x30, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0x16, 0x04, 0x01, 0xf0, 0x1f, 0x4a, 0x03, 0x50, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf7, 0xfb, 0x49, 0x7b, 0x50, 0x2f, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3d, 0xec, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x76, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x67, 0x25, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x63, 0x59, 0xa0, 0x0a, 0x07, + 0x48, 0x07, 0x88, 0xa7, 0x59, 0xc4, 0x00, 0xa3, 0x82, 0x00, 0x05, 0x00, + 0xfe, 0xff, 0xff, 0xff, 0x82, 0x00, 0x05, 0x40, 0x80, 0x01, 0x80, 0x00, + 0x40, 0x00, 0x08, 0x00, 0x84, 0x04, 0x0d, 0x20, 0x48, 0x03, 0x88, 0xa3, + 0x48, 0x07, 0x88, 0xa3, 0x49, 0x7b, 0x50, 0x4b, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x2d, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3e, 0x74, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5b, 0x43, 0x59, 0xa0, 0x04, 0x07, + 0x80, 0x00, 0x00, 0xc2, 0x80, 0x00, 0x08, 0xc4, 0x80, 0x05, 0xd4, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x00, 0x00, 0x03, 0x59, 0xa0, 0x02, 0x07, + 0x80, 0x00, 0x01, 0x10, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x37, 0xb1, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0x8d, 0x00, 0x10, 0x32, 0x9a, + 0x00, 0x10, 0x32, 0x9d, 0x00, 0x10, 0x32, 0xa5, 0x00, 0x10, 0x1e, 0xdd, + 0x00, 0x10, 0x32, 0xa2, 0x00, 0x10, 0x1e, 0xdd, 0x00, 0x10, 0x1e, 0xdd, + 0x00, 0x10, 0x1e, 0xdd, 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x07, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x59, 0xa0, 0x04, 0x07, + 0x59, 0xa0, 0x0a, 0x07, 0x90, 0x04, 0x09, 0xc0, 0x80, 0x04, 0x0d, 0x40, + 0x48, 0x05, 0xd8, 0x07, 0x59, 0xa0, 0x04, 0x09, 0x59, 0xa0, 0x0a, 0x09, + 0x90, 0x04, 0x09, 0xc0, 0x80, 0x04, 0x0d, 0x40, 0x48, 0x05, 0xd8, 0x08, + 0x4a, 0x01, 0xd8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xfb, 0xcc, + 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x41, 0x7a, 0x88, 0x00, + 0x49, 0x7b, 0x40, 0x01, 0x83, 0x2c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x48, 0x03, 0x40, 0x02, 0x59, 0xa0, 0x04, 0x06, 0x8c, 0x00, 0x05, 0x04, + 0x04, 0x02, 0x00, 0x9a, 0x4c, 0x5c, 0x00, 0x00, 0x4c, 0x60, 0x00, 0x00, + 0x4c, 0x64, 0x00, 0x00, 0x41, 0x78, 0xb8, 0x00, 0x59, 0xa0, 0xc4, 0x06, + 0x59, 0xa0, 0xc8, 0x02, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, + 0x04, 0x02, 0x00, 0x2c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x19, + 0x04, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x46, 0x02, + 0x04, 0x02, 0x00, 0x26, 0x8c, 0x60, 0xc5, 0x3e, 0x04, 0x02, 0x00, 0x22, + 0x8c, 0x60, 0xc5, 0x00, 0x04, 0x00, 0x00, 0x08, 0x59, 0x34, 0x00, 0x09, + 0x44, 0x00, 0xc8, 0x00, 0x80, 0x64, 0xc8, 0x00, 0x59, 0x34, 0x00, 0x08, + 0x44, 0x00, 0xc8, 0x00, 0x80, 0x64, 0xc8, 0x00, 0x04, 0x01, 0xf0, 0x07, + 0x59, 0x34, 0x00, 0x07, 0x44, 0x00, 0xc8, 0x00, 0x80, 0x64, 0xc8, 0x00, + 0x59, 0x34, 0x00, 0x06, 0x44, 0x00, 0xc8, 0x00, 0x80, 0x64, 0xc8, 0x00, + 0x83, 0x44, 0x05, 0x80, 0x00, 0x00, 0x07, 0xfe, 0x04, 0x00, 0x00, 0x0d, + 0x83, 0x44, 0x05, 0x80, 0x00, 0x00, 0x07, 0xfc, 0x04, 0x00, 0x00, 0x0a, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x25, 0x04, 0x00, 0x00, 0x03, + 0x85, 0x46, 0x8d, 0x5e, 0x04, 0x01, 0xf0, 0x05, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x45, 0x55, 0x04, 0x02, 0x00, 0x02, 0x85, 0x46, 0x8d, 0x5e, + 0x45, 0x44, 0xc8, 0x00, 0x85, 0x46, 0x8d, 0x1e, 0x80, 0x64, 0xc8, 0x00, + 0x82, 0x5c, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x81, 0x46, 0x88, 0x00, + 0x83, 0x44, 0x04, 0x80, 0x00, 0x00, 0x07, 0xf0, 0x04, 0x00, 0x10, 0x0e, + 0x8c, 0x60, 0xc5, 0x06, 0x04, 0x00, 0x00, 0x29, 0x83, 0x44, 0x05, 0x80, + 0x00, 0x00, 0x07, 0xf0, 0x04, 0x02, 0x00, 0x04, 0x42, 0x02, 0x88, 0x00, + 0x00, 0x00, 0x07, 0xfe, 0x04, 0x01, 0xf0, 0x06, 0x83, 0x44, 0x05, 0x80, + 0x00, 0x00, 0x07, 0xff, 0x04, 0x02, 0x00, 0x20, 0x42, 0x02, 0x88, 0x00, + 0x00, 0x00, 0x07, 0xfc, 0x82, 0x5c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x3c, + 0x04, 0x02, 0x07, 0xbf, 0x59, 0xa0, 0x00, 0x01, 0x80, 0x5c, 0x04, 0x00, + 0x48, 0x03, 0x40, 0x01, 0x8c, 0x60, 0xc5, 0x3e, 0x04, 0x02, 0x00, 0x07, + 0x59, 0xa0, 0x0a, 0x0a, 0x80, 0x04, 0x09, 0xc0, 0x04, 0x00, 0x00, 0x06, + 0x80, 0x04, 0x04, 0x80, 0x04, 0x02, 0x10, 0x04, 0x84, 0x60, 0xc5, 0x7e, + 0x41, 0x78, 0xb8, 0x00, 0x04, 0x01, 0xf7, 0xb2, 0x49, 0x47, 0x40, 0x00, + 0x48, 0x5d, 0xd8, 0x05, 0x59, 0xa0, 0x00, 0x02, 0x48, 0x01, 0xd8, 0x03, + 0x40, 0xec, 0x10, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x9e, + 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x33, 0x88, 0x5c, 0x00, 0xc8, 0x00, + 0x5c, 0x00, 0xc0, 0x00, 0x5c, 0x00, 0xb8, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x8c, 0x60, 0xc5, 0x3e, 0x04, 0x02, 0x00, 0x1a, 0x80, 0x5c, 0xb9, 0xc0, + 0x04, 0x00, 0x00, 0x24, 0x59, 0xa0, 0x00, 0x01, 0x80, 0x5c, 0x04, 0x00, + 0x48, 0x03, 0x40, 0x01, 0x59, 0xa0, 0x0a, 0x0a, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x00, 0x00, 0x05, 0x80, 0x04, 0x04, 0x80, 0x04, 0x02, 0x10, 0x03, + 0x41, 0x78, 0xb8, 0x00, 0x04, 0x01, 0xf0, 0x0e, 0x59, 0xa0, 0x08, 0x01, + 0x48, 0x07, 0x44, 0x06, 0x48, 0x5d, 0xd8, 0x05, 0x59, 0xa0, 0x00, 0x02, + 0x48, 0x01, 0xd8, 0x03, 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x1e, 0x86, + 0x40, 0xec, 0x10, 0x00, 0x5c, 0x00, 0xc8, 0x00, 0x5c, 0x00, 0xc0, 0x00, + 0x5c, 0x00, 0xb8, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x07, 0x9e, + 0x59, 0xa0, 0x00, 0x01, 0x80, 0x5c, 0x0c, 0x00, 0x59, 0xa0, 0x02, 0x0a, + 0x80, 0x04, 0x04, 0x80, 0x48, 0x03, 0x42, 0x07, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x0a, 0x5c, 0x00, 0xc8, 0x00, 0x5c, 0x00, 0xc0, 0x00, + 0x5c, 0x00, 0xb8, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x59, 0xa0, 0x08, 0x01, 0x48, 0x07, 0x44, 0x06, 0x5c, 0x00, 0xc8, 0x00, + 0x5c, 0x00, 0xc0, 0x00, 0x5c, 0x00, 0xb8, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0x8d, 0x40, 0x31, 0xd8, 0x00, 0x58, 0xef, 0x40, 0x0b, + 0x58, 0xec, 0x00, 0x02, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xd1, 0x59, 0xa2, 0x88, 0x00, + 0x04, 0x01, 0xf7, 0x68, 0x4c, 0x5c, 0x00, 0x00, 0x4c, 0x60, 0x00, 0x00, + 0x4c, 0x64, 0x00, 0x00, 0x41, 0x78, 0xb8, 0x00, 0x59, 0xa0, 0xc4, 0x06, + 0x59, 0xa0, 0xc8, 0x02, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, + 0x04, 0x02, 0x00, 0x31, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x19, + 0x04, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x46, 0x02, + 0x04, 0x02, 0x00, 0x2b, 0x8c, 0x60, 0xc5, 0x3e, 0x04, 0x02, 0x00, 0x27, + 0x83, 0x44, 0x05, 0x80, 0x00, 0x00, 0x07, 0xfe, 0x04, 0x00, 0x00, 0x11, + 0x83, 0x44, 0x05, 0x80, 0x00, 0x00, 0x07, 0xfc, 0x04, 0x00, 0x00, 0x0e, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x25, 0x04, 0x00, 0x00, 0x05, + 0x59, 0x34, 0x04, 0x03, 0x84, 0x00, 0x05, 0x5e, 0x48, 0x02, 0x6c, 0x03, + 0x04, 0x01, 0xf0, 0x07, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x45, 0x55, + 0x04, 0x02, 0x00, 0x04, 0x59, 0x34, 0x04, 0x03, 0x84, 0x00, 0x05, 0x5e, + 0x48, 0x02, 0x6c, 0x03, 0x41, 0x34, 0xa0, 0x00, 0x40, 0x64, 0xa8, 0x00, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x30, 0x59, 0x34, 0x00, 0x07, 0x44, 0x00, 0xa8, 0x00, + 0x59, 0x34, 0x00, 0x06, 0x48, 0x00, 0xa8, 0x01, 0x59, 0x34, 0x00, 0x09, + 0x48, 0x00, 0xa8, 0x02, 0x59, 0x34, 0x00, 0x08, 0x48, 0x00, 0xa8, 0x03, + 0x59, 0x34, 0x04, 0x03, 0x84, 0x00, 0x05, 0x1e, 0x48, 0x02, 0x6c, 0x03, + 0x82, 0x64, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x82, 0x5c, 0xbc, 0x00, + 0x00, 0x00, 0x00, 0x28, 0x81, 0x46, 0x88, 0x00, 0x83, 0x44, 0x04, 0x80, + 0x00, 0x00, 0x07, 0xf0, 0x04, 0x00, 0x10, 0x0e, 0x8c, 0x60, 0xc5, 0x06, + 0x04, 0x00, 0x00, 0x2a, 0x83, 0x44, 0x05, 0x80, 0x00, 0x00, 0x07, 0xf0, + 0x04, 0x02, 0x00, 0x04, 0x42, 0x02, 0x88, 0x00, 0x00, 0x00, 0x07, 0xfe, + 0x04, 0x01, 0xf0, 0x06, 0x83, 0x44, 0x05, 0x80, 0x00, 0x00, 0x07, 0xff, + 0x04, 0x02, 0x00, 0x21, 0x42, 0x02, 0x88, 0x00, 0x00, 0x00, 0x07, 0xfc, + 0x82, 0x5c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x28, 0x04, 0x00, 0x00, 0x02, + 0x04, 0x01, 0xf7, 0xb9, 0x59, 0xa0, 0x00, 0x01, 0x80, 0x5c, 0x04, 0x00, + 0x48, 0x03, 0x40, 0x01, 0x8c, 0x60, 0xc5, 0x3e, 0x04, 0x02, 0x00, 0x07, + 0x59, 0xa0, 0x0a, 0x0a, 0x80, 0x04, 0x09, 0xc0, 0x04, 0x00, 0x00, 0x06, + 0x80, 0x04, 0x04, 0x80, 0x04, 0x02, 0x10, 0x04, 0x84, 0x60, 0xc5, 0x7e, + 0x41, 0x78, 0xb8, 0x00, 0x04, 0x01, 0xf7, 0xac, 0x49, 0x47, 0x40, 0x00, + 0x48, 0x5d, 0xd8, 0x05, 0x59, 0xa0, 0x00, 0x02, 0x48, 0x01, 0xd8, 0x03, + 0x40, 0xec, 0x10, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x9e, + 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x34, 0x27, 0x5c, 0x00, 0xc8, 0x00, + 0x5c, 0x00, 0xc0, 0x00, 0x5c, 0x00, 0xb8, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x8c, 0x60, 0xc5, 0x3e, 0x04, 0x02, 0x00, 0x1a, 0x80, 0x5c, 0xb9, 0xc0, + 0x04, 0x00, 0x00, 0x24, 0x59, 0xa0, 0x00, 0x01, 0x80, 0x5c, 0x04, 0x00, + 0x48, 0x03, 0x40, 0x01, 0x59, 0xa0, 0x0a, 0x0a, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x00, 0x00, 0x05, 0x80, 0x04, 0x04, 0x80, 0x04, 0x02, 0x10, 0x03, + 0x41, 0x78, 0xb8, 0x00, 0x04, 0x01, 0xf0, 0x0e, 0x59, 0xa0, 0x08, 0x01, + 0x48, 0x07, 0x44, 0x06, 0x48, 0x5d, 0xd8, 0x05, 0x59, 0xa0, 0x00, 0x02, + 0x48, 0x01, 0xd8, 0x03, 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x1e, 0x86, + 0x40, 0xec, 0x10, 0x00, 0x5c, 0x00, 0xc8, 0x00, 0x5c, 0x00, 0xc0, 0x00, + 0x5c, 0x00, 0xb8, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x07, 0x9e, + 0x59, 0xa0, 0x00, 0x01, 0x80, 0x5c, 0x0c, 0x00, 0x59, 0xa0, 0x02, 0x0a, + 0x80, 0x04, 0x04, 0x80, 0x48, 0x03, 0x42, 0x07, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x0a, 0x5c, 0x00, 0xc8, 0x00, 0x5c, 0x00, 0xc0, 0x00, + 0x5c, 0x00, 0xb8, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x59, 0xa0, 0x08, 0x01, 0x48, 0x07, 0x44, 0x06, 0x5c, 0x00, 0xc8, 0x00, + 0x5c, 0x00, 0xc0, 0x00, 0x5c, 0x00, 0xb8, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0x8d, 0x40, 0x31, 0xd8, 0x00, 0x58, 0xef, 0x40, 0x0b, + 0x58, 0xec, 0x00, 0x02, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xd1, 0x59, 0xa2, 0x88, 0x00, + 0x04, 0x01, 0xf7, 0x62, 0x42, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x7e, + 0x59, 0xa0, 0x0c, 0x06, 0x59, 0xa0, 0x12, 0x07, 0x59, 0xa0, 0x1c, 0x07, + 0x59, 0xa0, 0x22, 0x09, 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x84, 0x00, 0x01, 0xc0, 0x82, 0x00, 0x34, 0x80, 0x00, 0x00, 0x00, 0x20, + 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x80, 0x14, 0x04, 0x80, + 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x82, 0x04, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x82, 0x00, 0x34, 0x80, 0x00, 0x00, 0x00, 0x20, + 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x80, 0x14, 0x04, 0x80, + 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x82, 0x08, 0x05, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x84, 0x00, 0x01, 0xc0, 0x82, 0x00, 0x34, 0x80, + 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x1e, 0xdd, + 0x80, 0x14, 0x04, 0x80, 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x1e, 0xdd, + 0x82, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, 0x82, 0x00, 0x34, 0x80, + 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x1e, 0xdd, + 0x80, 0x14, 0x04, 0x80, 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x1e, 0xdd, + 0x82, 0x0c, 0x05, 0x00, 0x00, 0x00, 0xff, 0x00, 0x84, 0x00, 0x01, 0xc0, + 0x82, 0x00, 0x34, 0x80, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x10, 0x00, + 0x00, 0x10, 0x1e, 0xdd, 0x80, 0x14, 0x04, 0x80, 0x02, 0x00, 0x10, 0x00, + 0x00, 0x10, 0x1e, 0xdd, 0x82, 0x0c, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x82, 0x00, 0x34, 0x80, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x10, 0x00, + 0x00, 0x10, 0x1e, 0xdd, 0x80, 0x14, 0x04, 0x80, 0x02, 0x00, 0x10, 0x00, + 0x00, 0x10, 0x1e, 0xdd, 0x82, 0x10, 0x05, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x84, 0x00, 0x01, 0xc0, 0x82, 0x00, 0x34, 0x80, 0x00, 0x00, 0x00, 0x20, + 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x80, 0x14, 0x04, 0x80, + 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x82, 0x10, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x82, 0x00, 0x34, 0x80, 0x00, 0x00, 0x00, 0x20, + 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x80, 0x14, 0x04, 0x80, + 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x90, 0x04, 0x01, 0xc0, + 0x80, 0x08, 0x0d, 0x40, 0x90, 0x0c, 0x01, 0xc0, 0x80, 0x10, 0x1d, 0x40, + 0x83, 0xa8, 0x34, 0x00, 0x00, 0x00, 0x00, 0x37, 0x44, 0x04, 0x30, 0x00, + 0x80, 0x18, 0x30, 0x00, 0x44, 0x0c, 0x30, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0x8d, 0x04, 0x01, 0xfa, 0x29, 0x04, 0x02, 0x00, 0x05, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0c, + 0x04, 0x01, 0xf8, 0x53, 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x34, 0x99, + 0x1c, 0x01, 0xf0, 0x00, 0x40, 0x31, 0xd8, 0x00, 0x58, 0xee, 0x58, 0x0d, + 0x58, 0xef, 0x40, 0x0b, 0x58, 0xec, 0x00, 0x02, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xd1, + 0x83, 0x2c, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x04, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x40, 0xc8, 0xa8, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x30, 0x58, 0xc8, 0x02, 0x00, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x00, 0x00, 0x34, 0x58, 0xc8, 0x04, 0x00, 0x82, 0x00, 0x05, 0x00, + 0xff, 0xff, 0xff, 0xfb, 0x04, 0x02, 0x00, 0x30, 0x58, 0xc8, 0x04, 0x01, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x2d, 0x82, 0x00, 0x04, 0x80, + 0x00, 0x00, 0xff, 0x01, 0x04, 0x02, 0x10, 0x2a, 0x58, 0xc8, 0x02, 0x02, + 0x82, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x5c, 0x04, 0x00, 0x10, 0x26, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5f, 0x96, 0x58, 0xc8, 0x0c, 0x08, + 0x58, 0xc8, 0x02, 0x04, 0x80, 0x04, 0x04, 0x80, 0x04, 0x00, 0x10, 0x20, + 0x58, 0xc8, 0x02, 0x04, 0x82, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x02, 0x10, 0x1c, 0x58, 0xc8, 0x02, 0x05, 0x58, 0xc8, 0x0c, 0x08, + 0x80, 0x04, 0x09, 0x02, 0x80, 0x04, 0x04, 0x80, 0x04, 0x00, 0x10, 0x17, + 0x58, 0xc8, 0x0c, 0x08, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5e, 0xe1, + 0x04, 0x00, 0x00, 0x1b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5d, 0xa0, + 0x04, 0x02, 0x00, 0x12, 0x49, 0x79, 0x94, 0x0b, 0x59, 0xc4, 0x08, 0xa3, + 0x82, 0x04, 0x0d, 0x40, 0x00, 0x00, 0x00, 0x02, 0x48, 0x07, 0x88, 0xa3, + 0x4a, 0x03, 0x88, 0x30, 0x00, 0x00, 0x00, 0x01, 0x4a, 0x03, 0x88, 0x32, + 0x01, 0xff, 0xff, 0xff, 0x58, 0xc8, 0x02, 0x02, 0x48, 0x03, 0x08, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5d, 0x82, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0x8d, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xdd, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5f, 0xec, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5f, 0xfd, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5e, 0xd4, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x4c, 0x00, 0x00, 0x00, + 0x59, 0xa0, 0x12, 0x07, 0x59, 0xa0, 0x04, 0x07, 0x90, 0x08, 0x11, 0xc0, + 0x80, 0x08, 0x15, 0x40, 0x59, 0xa0, 0x1a, 0x09, 0x59, 0xa0, 0x04, 0x09, + 0x90, 0x0c, 0x19, 0xc0, 0x80, 0x0c, 0x1d, 0x40, 0x5c, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf1, 0xe8, 0x59, 0x84, 0x00, 0x00, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x50, 0x59, 0x84, 0x00, 0x02, + 0x8c, 0x00, 0x05, 0x04, 0x04, 0x00, 0x00, 0x4d, 0x84, 0x00, 0x05, 0x46, + 0x48, 0x03, 0x08, 0x02, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5e, 0xd4, + 0x59, 0xc4, 0x08, 0xa3, 0x82, 0x04, 0x0d, 0x00, 0xff, 0xff, 0xff, 0xfd, + 0x48, 0x07, 0x88, 0xa3, 0x4c, 0x5c, 0x00, 0x00, 0x42, 0x00, 0xb8, 0x00, + 0x00, 0x10, 0xa4, 0x00, 0x50, 0x5e, 0x68, 0x00, 0x81, 0x36, 0x69, 0xc0, + 0x04, 0x00, 0x00, 0x08, 0x59, 0x36, 0x60, 0x0e, 0x81, 0x32, 0x61, 0xc0, + 0x04, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5e, 0xc5, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x60, 0xac, 0x80, 0x5c, 0xb8, 0x00, + 0x82, 0x5c, 0x05, 0x80, 0x00, 0x10, 0xab, 0xf0, 0x04, 0x02, 0x07, 0xf3, + 0x59, 0x86, 0x60, 0x03, 0x81, 0x32, 0x61, 0xc0, 0x04, 0x00, 0x00, 0x0b, + 0x59, 0x30, 0x04, 0x06, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x09, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0x30, 0xb8, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5e, 0xa8, 0x40, 0x5e, 0x60, 0x00, + 0x04, 0x01, 0xf7, 0xf5, 0x49, 0x7b, 0x08, 0x03, 0x42, 0x00, 0xb8, 0x00, + 0x00, 0x10, 0xac, 0xe8, 0x50, 0x5e, 0x60, 0x00, 0x81, 0x32, 0x61, 0xc0, + 0x04, 0x00, 0x00, 0x11, 0x59, 0x30, 0x04, 0x06, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x09, 0x04, 0x02, 0x00, 0x0d, 0x59, 0x30, 0x02, 0x03, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x04, 0x04, 0x02, 0x00, 0x09, + 0x59, 0x32, 0x68, 0x09, 0x81, 0x36, 0x69, 0xc0, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0d, 0xdd, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5e, 0xa8, 0x45, 0x78, 0xb8, 0x00, + 0x80, 0x5c, 0xb8, 0x00, 0x82, 0x5c, 0x05, 0x80, 0x00, 0x10, 0xac, 0xf0, + 0x04, 0x02, 0x07, 0xe9, 0x42, 0x00, 0x08, 0x00, 0x00, 0x10, 0xac, 0xe6, + 0x49, 0x78, 0x08, 0x01, 0x49, 0x78, 0x08, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5f, 0xec, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5f, 0xfd, + 0x5c, 0x00, 0xb8, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5d, 0x9b, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0x8d, 0x83, 0x6c, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x07, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x59, 0xa0, 0x04, 0x07, 0x59, 0xa0, 0x0a, 0x07, 0x90, 0x04, 0x09, 0xc0, + 0x80, 0x04, 0x0d, 0x40, 0x48, 0x05, 0xd8, 0x07, 0x59, 0xa0, 0x04, 0x09, + 0x59, 0xa0, 0x0a, 0x09, 0x90, 0x04, 0x09, 0xc0, 0x80, 0x04, 0x0d, 0x40, + 0x48, 0x05, 0xd8, 0x08, 0x4a, 0x01, 0xd8, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf9, 0x5b, 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x41, 0x7a, 0x88, 0x00, 0x49, 0x7b, 0x40, 0x01, 0x83, 0x2c, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x48, 0x03, 0x40, 0x02, 0x4c, 0x5c, 0x00, 0x00, + 0x4c, 0x60, 0x00, 0x00, 0x4c, 0x64, 0x00, 0x00, 0x41, 0x78, 0xb8, 0x00, + 0x41, 0x78, 0xc8, 0x00, 0x59, 0xa0, 0xc0, 0x02, 0x41, 0x44, 0x00, 0x00, + 0x81, 0xac, 0x04, 0x00, 0x50, 0x02, 0x68, 0x00, 0x81, 0x36, 0x69, 0xc0, + 0x04, 0x00, 0x00, 0x0d, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x19, + 0x04, 0x02, 0x00, 0x0a, 0x8c, 0x64, 0xcd, 0x3e, 0x04, 0x02, 0x00, 0x06, + 0x59, 0x34, 0x00, 0x02, 0x48, 0x00, 0xc0, 0x00, 0x49, 0x44, 0xc0, 0x01, + 0x82, 0x60, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x02, 0x82, 0x5c, 0xbc, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x81, 0x46, 0x88, 0x00, 0x83, 0x44, 0x04, 0x80, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x02, 0x10, 0x21, 0x82, 0x5c, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x40, 0x04, 0x02, 0x10, 0x02, 0x04, 0x01, 0xf7, 0xe8, + 0x59, 0xa0, 0x00, 0x01, 0x80, 0x5c, 0x04, 0x00, 0x48, 0x03, 0x40, 0x01, + 0x8c, 0x64, 0xcd, 0x3e, 0x04, 0x00, 0x00, 0x03, 0x41, 0x78, 0xb8, 0x00, + 0x04, 0x01, 0xf7, 0xe1, 0x59, 0xa0, 0x0a, 0x0a, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x00, 0x00, 0x06, 0x80, 0x04, 0x04, 0x80, 0x04, 0x02, 0x10, 0x04, + 0x41, 0x78, 0xb8, 0x00, 0x84, 0x64, 0xcd, 0x7e, 0x04, 0x01, 0xf7, 0xd9, + 0x49, 0x47, 0x40, 0x00, 0x48, 0x5d, 0xd8, 0x05, 0x59, 0xa0, 0x00, 0x02, + 0x48, 0x01, 0xd8, 0x03, 0x40, 0xec, 0x10, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x07, 0x9e, 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x35, 0xd1, + 0x5c, 0x00, 0xc8, 0x00, 0x5c, 0x00, 0xc0, 0x00, 0x5c, 0x00, 0xb8, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x8c, 0x64, 0xcd, 0x3e, 0x04, 0x02, 0x00, 0x1b, + 0x80, 0x5c, 0xb9, 0xc0, 0x04, 0x00, 0x00, 0x25, 0x59, 0xa0, 0x00, 0x01, + 0x80, 0x5c, 0x04, 0x00, 0x48, 0x03, 0x40, 0x01, 0x59, 0xa0, 0x0a, 0x0a, + 0x80, 0x04, 0x09, 0xc0, 0x04, 0x00, 0x00, 0x05, 0x80, 0x04, 0x04, 0x80, + 0x04, 0x02, 0x10, 0x03, 0x41, 0x78, 0xb8, 0x00, 0x04, 0x01, 0xf0, 0x0f, + 0x59, 0xa0, 0x08, 0x01, 0x80, 0x04, 0x09, 0x06, 0x48, 0x07, 0x44, 0x06, + 0x48, 0x5d, 0xd8, 0x05, 0x59, 0xa0, 0x00, 0x02, 0x48, 0x01, 0xd8, 0x03, + 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x1e, 0x86, 0x40, 0xec, 0x10, 0x00, + 0x5c, 0x00, 0xc8, 0x00, 0x5c, 0x00, 0xc0, 0x00, 0x5c, 0x00, 0xb8, 0x00, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x07, 0x9e, 0x59, 0xa0, 0x00, 0x01, + 0x80, 0x5c, 0x0c, 0x00, 0x59, 0xa0, 0x02, 0x0a, 0x80, 0x04, 0x04, 0x80, + 0x48, 0x03, 0x42, 0x07, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x0a, + 0x5c, 0x00, 0xc8, 0x00, 0x5c, 0x00, 0xc0, 0x00, 0x5c, 0x00, 0xb8, 0x00, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x59, 0xa0, 0x08, 0x01, + 0x80, 0x04, 0x09, 0x06, 0x48, 0x07, 0x44, 0x06, 0x5c, 0x00, 0xc8, 0x00, + 0x5c, 0x00, 0xc0, 0x00, 0x5c, 0x00, 0xb8, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0x8d, 0x40, 0x31, 0xd8, 0x00, 0x58, 0xef, 0x40, 0x0b, + 0x58, 0xec, 0x00, 0x02, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xd1, 0x59, 0xa2, 0x88, 0x00, + 0x04, 0x01, 0xf7, 0x8d, 0x8d, 0x0e, 0x1d, 0x0e, 0x04, 0x00, 0x00, 0x05, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x59, 0xa8, 0x00, 0x23, 0x8c, 0x00, 0x05, 0x0a, + 0x04, 0x02, 0x00, 0x07, 0x8c, 0x00, 0x05, 0x06, 0x04, 0x02, 0x00, 0x05, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x16, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x04, 0x01, 0xf8, 0xcd, 0x04, 0x02, 0x00, 0x05, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x59, 0xa0, 0x0c, 0x06, 0x80, 0x04, 0x09, 0x02, + 0x59, 0xa0, 0x04, 0x07, 0x59, 0xa0, 0x12, 0x07, 0x90, 0x08, 0x11, 0xc0, + 0x80, 0x08, 0x15, 0x40, 0x59, 0xa0, 0x04, 0x09, 0x59, 0xa0, 0x1a, 0x09, + 0x90, 0x0c, 0x19, 0xc0, 0x80, 0x0c, 0x1d, 0x40, 0x83, 0x2c, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x04, 0x01, 0xf8, 0xdf, 0x4a, 0x01, 0xd8, 0x09, + 0x00, 0x10, 0x35, 0xff, 0x1c, 0x01, 0xf0, 0x00, 0x40, 0x31, 0xd8, 0x00, + 0x58, 0xef, 0x40, 0x0b, 0x58, 0xee, 0x58, 0x0d, 0x58, 0xec, 0x00, 0x02, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x1e, 0xd1, 0x59, 0x2c, 0x00, 0x09, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x58, 0x54, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x42, 0xb1, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x49, 0x47, 0x40, 0x01, + 0x48, 0x1a, 0x68, 0x02, 0x59, 0x2c, 0x00, 0x0a, 0x82, 0x00, 0x1d, 0x80, + 0x70, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x07, 0x04, 0x01, 0xf8, 0xa2, + 0x04, 0x02, 0x00, 0x11, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x82, 0x00, 0x1d, 0x80, + 0x72, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, + 0x04, 0x01, 0xf8, 0x98, 0x04, 0x02, 0x08, 0x97, 0x04, 0x02, 0x08, 0x96, + 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x58, 0xee, 0x58, 0x0d, + 0x4a, 0x02, 0x5c, 0x04, 0x00, 0x00, 0x80, 0x00, 0x49, 0x7a, 0x5a, 0x04, + 0x59, 0x2c, 0x32, 0x08, 0x80, 0x18, 0x31, 0x02, 0x59, 0x2c, 0x18, 0x01, + 0x4a, 0x00, 0x18, 0x05, 0x01, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x88, 0xe5, 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x36, 0x39, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x2c, 0x40, 0x00, 0x59, 0x2c, 0x00, 0x05, 0x82, 0x00, 0x05, 0x80, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x4c, 0x58, 0x00, 0x00, 0x4c, 0x50, 0x00, 0x00, 0x4c, 0x54, 0x00, 0x00, + 0x83, 0x2c, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x05, 0x40, 0x1c, 0xa0, 0x00, + 0x40, 0x1c, 0xa8, 0x00, 0x58, 0x20, 0x28, 0x0a, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x82, 0x14, 0x35, 0x80, 0x70, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x03, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x41, 0x5c, 0x00, 0xa8, 0x00, + 0x5c, 0x00, 0xa0, 0x00, 0x5c, 0x00, 0xb0, 0x00, 0x40, 0x1c, 0x00, 0x00, + 0x58, 0x20, 0x10, 0x06, 0x58, 0x20, 0x18, 0x07, 0x58, 0x20, 0x22, 0x05, + 0x80, 0x10, 0x21, 0x02, 0x82, 0x14, 0x35, 0x80, 0x70, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x08, 0x82, 0x10, 0x34, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf0, 0x79, 0x82, 0x14, 0x35, 0x80, + 0x72, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, + 0x82, 0x10, 0x34, 0x80, 0x00, 0x00, 0x00, 0x2a, 0x02, 0x00, 0x10, 0x00, + 0x00, 0x10, 0x1e, 0xdd, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x04, 0x01, 0xf8, 0x6e, 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x36, 0x73, + 0x1c, 0x01, 0xf0, 0x00, 0x40, 0x31, 0xd8, 0x00, 0x58, 0xef, 0x40, 0x0b, + 0x58, 0xee, 0x58, 0x0e, 0x58, 0xec, 0x00, 0x02, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xd1, + 0x59, 0x2e, 0x58, 0x00, 0x83, 0x2c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x4c, 0x58, 0x00, 0x00, 0x4c, 0x50, 0x00, 0x00, 0x4c, 0x54, 0x00, 0x00, + 0x40, 0x04, 0xa0, 0x00, 0x40, 0x04, 0xa8, 0x00, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x41, + 0x5c, 0x00, 0xa8, 0x00, 0x5c, 0x00, 0xa0, 0x00, 0x5c, 0x00, 0xb0, 0x00, + 0x40, 0xec, 0x10, 0x00, 0x4a, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x4a, 0x00, 0x10, 0x05, 0x00, 0x00, 0x00, 0x3c, 0x48, 0x04, 0x10, 0x03, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x9e, 0x4a, 0x01, 0xd8, 0x09, + 0x00, 0x10, 0x36, 0x95, 0x1c, 0x01, 0xf0, 0x00, 0x40, 0x31, 0xd8, 0x00, + 0x58, 0xef, 0x40, 0x0b, 0x58, 0xee, 0x58, 0x0e, 0x58, 0xec, 0x00, 0x02, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x1e, 0xd1, 0x83, 0x2c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x4c, 0x58, 0x00, 0x00, 0x4c, 0x50, 0x00, 0x00, 0x4c, 0x54, 0x00, 0x00, + 0x40, 0x04, 0xa0, 0x00, 0x40, 0x04, 0xa8, 0x00, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x41, + 0x5c, 0x00, 0xa8, 0x00, 0x5c, 0x00, 0xa0, 0x00, 0x5c, 0x00, 0xb0, 0x00, + 0x40, 0xec, 0x10, 0x00, 0x4a, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x4a, 0x00, 0x10, 0x05, 0x00, 0x00, 0x00, 0x30, 0x48, 0x04, 0x10, 0x03, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x9e, 0x4a, 0x01, 0xd8, 0x09, + 0x00, 0x10, 0x1e, 0x86, 0x1c, 0x01, 0xf0, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x07, 0x1a, 0x04, 0x00, 0x00, 0x10, 0x49, 0x7a, 0x58, 0x00, + 0x58, 0xec, 0x00, 0x0d, 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x04, + 0x49, 0x2d, 0xd8, 0x0d, 0x49, 0x2d, 0xd8, 0x0e, 0x04, 0x01, 0xf0, 0x07, + 0x58, 0xec, 0x00, 0x0e, 0x48, 0x02, 0x58, 0x00, 0x82, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x45, 0x2c, 0x00, 0x00, 0x49, 0x2d, 0xd8, 0x0e, + 0x83, 0x2c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x49, 0x2f, 0xc8, 0x57, + 0x48, 0x03, 0xc8, 0x57, 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0x2c, 0x00, 0x00, + 0x58, 0xec, 0x40, 0x0d, 0x80, 0x20, 0x41, 0xc0, 0x04, 0x00, 0x00, 0x08, + 0x48, 0x23, 0xc8, 0x57, 0x40, 0x22, 0x58, 0x00, 0x59, 0x2c, 0x40, 0x01, + 0x49, 0x7a, 0x58, 0x01, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x2e, + 0x04, 0x01, 0xf7, 0xf8, 0x49, 0x79, 0xd8, 0x0d, 0x49, 0x79, 0xd8, 0x0e, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x03, 0x42, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x03, 0xc8, 0x57, 0x48, 0x07, 0xc8, 0x57, + 0x48, 0x0b, 0xc8, 0x57, 0x48, 0x0f, 0xc8, 0x57, 0x48, 0x1b, 0xc8, 0x57, + 0x48, 0xef, 0xc8, 0x57, 0x48, 0x19, 0xd8, 0x01, 0x80, 0x04, 0x09, 0xc0, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x80, 0x04, 0x08, 0xc4, + 0x48, 0x05, 0xd8, 0x05, 0x48, 0x01, 0xd8, 0x03, 0x48, 0x09, 0xd8, 0x07, + 0x48, 0x0d, 0xd8, 0x08, 0x40, 0xec, 0x10, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x07, 0x9e, 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x1e, 0x86, + 0x1c, 0x01, 0xf0, 0x00, 0x80, 0x00, 0x2d, 0x80, 0x48, 0x0b, 0xc8, 0x57, + 0x48, 0x0f, 0xc8, 0x57, 0x48, 0x13, 0xc8, 0x57, 0x48, 0x17, 0xc8, 0x57, + 0x4d, 0x2c, 0x00, 0x00, 0x4d, 0xa0, 0x00, 0x00, 0x42, 0x03, 0x40, 0x00, + 0x00, 0x10, 0xac, 0x71, 0x59, 0xa0, 0x00, 0x17, 0x80, 0x00, 0x01, 0xc0, + 0x04, 0x02, 0x00, 0x13, 0x04, 0x00, 0x60, 0x12, 0x48, 0x0b, 0xc0, 0x20, + 0x48, 0x0f, 0xc0, 0x21, 0x48, 0x13, 0xc0, 0x22, 0x48, 0x17, 0xc0, 0x23, + 0x90, 0x08, 0x11, 0xc0, 0x82, 0x08, 0x15, 0x40, 0x00, 0x00, 0x00, 0x12, + 0x48, 0x0b, 0xc0, 0x11, 0x59, 0xe0, 0x00, 0x17, 0x8c, 0x00, 0x05, 0x08, + 0x04, 0x02, 0x00, 0x04, 0x42, 0x03, 0xe0, 0x00, 0x30, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf0, 0x53, 0x4a, 0x03, 0xc0, 0x17, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x01, 0xf7, 0xfb, 0x4c, 0x04, 0x00, 0x00, 0x4c, 0x1c, 0x00, 0x00, + 0x80, 0x00, 0x08, 0x00, 0x48, 0x07, 0x40, 0x17, 0x59, 0xa0, 0x38, 0x1a, + 0x48, 0x1f, 0xc8, 0x57, 0x80, 0x1c, 0x39, 0xc0, 0x04, 0x02, 0x00, 0x27, + 0x82, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x02, 0x10, 0x10, + 0x59, 0xa0, 0x00, 0x18, 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x40, 0x18, + 0x59, 0xa0, 0x02, 0x19, 0x82, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x13, 0x48, 0x03, 0x42, 0x19, + 0x04, 0x00, 0x10, 0x03, 0x49, 0x7b, 0x42, 0x19, 0x41, 0x78, 0x00, 0x00, + 0x59, 0xa0, 0x38, 0x16, 0x80, 0x1c, 0x3c, 0x00, 0x04, 0x01, 0xf0, 0x30, + 0x48, 0x03, 0xc8, 0x56, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x1a, + 0x04, 0x00, 0x00, 0x07, 0x49, 0x2f, 0x40, 0x1a, 0x49, 0x2f, 0x40, 0x1b, + 0x41, 0x2c, 0x38, 0x00, 0x49, 0x7b, 0x42, 0x1c, 0x49, 0x7a, 0x58, 0x13, + 0x04, 0x01, 0xf0, 0x26, 0x59, 0x88, 0x00, 0x52, 0x80, 0x00, 0x00, 0x00, + 0x48, 0x03, 0x10, 0x52, 0x59, 0xa0, 0x00, 0x17, 0x80, 0x00, 0x00, 0x40, + 0x48, 0x03, 0x40, 0x17, 0x59, 0xa0, 0x02, 0x19, 0x59, 0xa0, 0x38, 0x16, + 0x80, 0x1c, 0x3c, 0x00, 0x04, 0x01, 0xf0, 0x1c, 0x59, 0xa0, 0x02, 0x1c, + 0x82, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x82, 0x00, 0x0c, 0x80, + 0x00, 0x00, 0x00, 0x12, 0x04, 0x02, 0x10, 0x04, 0x48, 0x03, 0x42, 0x1c, + 0x80, 0x1c, 0x3c, 0x00, 0x04, 0x01, 0xf0, 0x13, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x07, 0x1a, 0x04, 0x02, 0x00, 0x0b, 0x59, 0x88, 0x00, 0x52, + 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x10, 0x52, 0x59, 0xa0, 0x00, 0x17, + 0x80, 0x00, 0x00, 0x40, 0x48, 0x03, 0x40, 0x17, 0x48, 0x03, 0xc8, 0x56, + 0x59, 0xa0, 0x02, 0x1c, 0x80, 0x1c, 0x3c, 0x00, 0x04, 0x01, 0xf0, 0x06, + 0x49, 0x2f, 0x40, 0x1a, 0x49, 0x2c, 0x38, 0x13, 0x41, 0x2c, 0x38, 0x00, + 0x49, 0x7b, 0x42, 0x1c, 0x49, 0x7a, 0x58, 0x13, 0x48, 0x08, 0x3c, 0x00, + 0x48, 0x0c, 0x3a, 0x00, 0x48, 0x10, 0x3c, 0x01, 0x48, 0x14, 0x3a, 0x01, + 0x5c, 0x00, 0x38, 0x00, 0x5c, 0x00, 0x08, 0x00, 0x5c, 0x03, 0x40, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x0f, 0xc8, 0x57, + 0x48, 0x13, 0xc8, 0x57, 0x48, 0x1b, 0xc8, 0x57, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xaf, 0xe1, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x80, 0x18, 0x00, 0xd0, 0x40, 0x00, 0x28, 0x00, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x80, 0x14, 0x04, 0x01, 0xf7, 0x86, 0x4c, 0x00, 0x00, 0x00, + 0x59, 0x9c, 0x00, 0x17, 0x8c, 0x00, 0x05, 0x12, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x59, 0x9c, 0x00, 0x18, + 0x8c, 0x00, 0x05, 0x0e, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x8d, 0x0e, 0x1d, 0x0e, 0x04, 0x00, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x05, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x07, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x59, 0x9c, 0x00, 0x17, 0x8c, 0x00, 0x05, 0x0a, + 0x04, 0x00, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x08, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, 0x59, 0x34, 0x04, 0x05, + 0x8c, 0x00, 0x05, 0x08, 0x04, 0x02, 0x00, 0x04, 0x8c, 0x00, 0x05, 0x0a, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x31, 0x04, 0x49, 0x7a, 0x5a, 0x04, + 0x49, 0x7a, 0x58, 0x05, 0x4a, 0x02, 0x5c, 0x04, 0x00, 0x00, 0x80, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x89, 0x91, 0x04, 0x02, 0x00, 0x05, + 0x4a, 0x03, 0x44, 0x06, 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x1e, 0xd9, 0x4a, 0x01, 0xd8, 0x09, 0x00, 0x10, 0x37, 0xa2, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x2c, 0x00, 0x05, 0x82, 0x00, 0x05, 0x80, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x44, 0x06, + 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x59, 0xa2, 0x8c, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x1e, 0xdd, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x31, 0x04, 0x82, 0x00, 0x15, 0x80, 0x00, 0x00, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x09, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x58, 0x54, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x02, 0x02, 0x5a, 0x04, 0x02, 0x00, 0x0c, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5b, 0x8d, 0x04, 0x01, 0xf0, 0x09, + 0x42, 0x02, 0x88, 0x00, 0x00, 0x00, 0x07, 0xef, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0x5a, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x5b, 0x8d, + 0x81, 0x46, 0x88, 0x40, 0x04, 0x02, 0x17, 0xfb, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x4c, 0x0c, 0x00, 0x00, 0x4d, 0x34, 0x00, 0x00, + 0x4d, 0x44, 0x00, 0x00, 0x42, 0x02, 0x88, 0x00, 0x00, 0x00, 0x07, 0xfe, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, 0x04, 0x02, 0x00, 0x09, + 0x59, 0x34, 0x18, 0x0a, 0x82, 0x0c, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x82, 0x0c, 0x1d, 0x80, 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x80, 0x1b, 0x04, 0x01, 0xff, 0x1f, 0x5c, 0x02, 0x88, 0x00, + 0x5c, 0x02, 0x68, 0x00, 0x5c, 0x00, 0x18, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0xef, 0xc8, 0x57, 0x04, 0x01, 0x10, 0x00, 0x48, 0xef, 0xc8, 0x40, + 0x4a, 0x03, 0xc8, 0x42, 0x00, 0x00, 0x00, 0x11, 0x40, 0x00, 0x00, 0x00, + 0x04, 0x01, 0x17, 0xff, 0x4a, 0x01, 0xd8, 0x0f, 0xbe, 0xef, 0xbe, 0xef, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x7b, 0x40, 0x00, 0x49, 0x7b, 0x40, 0x01, + 0x49, 0x7b, 0x40, 0x02, 0x49, 0x7b, 0x40, 0x03, 0x49, 0x7b, 0x40, 0x04, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xc4, 0x00, 0xa4, 0x4c, 0x58, 0x00, 0x00, + 0x4c, 0x50, 0x00, 0x00, 0x4c, 0x54, 0x00, 0x00, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x82, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x07, + 0x04, 0x00, 0x10, 0x0a, 0x82, 0x00, 0x6c, 0x80, 0x00, 0x00, 0x00, 0x07, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf8, 0x07, + 0x5c, 0x00, 0xa8, 0x00, 0x5c, 0x00, 0xa0, 0x00, 0x5c, 0x00, 0xb0, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x04, 0x01, 0xf9, 0x0c, 0x04, 0x01, 0xf7, 0xfb, + 0x00, 0x10, 0x38, 0x05, 0x00, 0x10, 0x38, 0x0b, 0x00, 0x10, 0x38, 0x30, + 0x00, 0x10, 0x38, 0x52, 0x00, 0x10, 0x39, 0x11, 0x00, 0x10, 0x38, 0x04, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xc4, 0x08, 0x06, 0x8c, 0x04, 0x0d, 0x00, + 0x04, 0x02, 0x00, 0x03, 0x84, 0x04, 0x0d, 0x40, 0x48, 0x07, 0x88, 0x06, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xc4, 0x00, 0x05, 0x8c, 0x00, 0x05, 0x34, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x3f, 0x66, 0x4a, 0x03, 0x88, 0x05, + 0xff, 0xff, 0xff, 0xff, 0x42, 0x00, 0x60, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x4a, 0x59, 0xa8, 0x00, 0x14, + 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0xff, 0xfa, 0x84, 0x00, 0x05, 0x42, + 0x48, 0x03, 0x50, 0x14, 0x49, 0x7b, 0x50, 0x23, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x10, 0xb5, 0xf0, 0x45, 0x78, 0x08, 0x00, 0x49, 0x7b, 0x50, 0x12, + 0x42, 0x00, 0x60, 0x00, 0xff, 0xef, 0xff, 0xff, 0x42, 0x00, 0x68, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x44, + 0x59, 0xc4, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0xff, 0x0f, + 0x48, 0x03, 0x88, 0x06, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3e, 0xab, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5b, 0x62, 0x04, 0x01, 0xf0, 0x01, 0x42, 0x00, 0x60, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x42, 0x00, 0x68, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x44, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0xc8, 0x59, 0xc4, 0x00, 0xa4, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0a, + 0x04, 0x00, 0x00, 0x0f, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xf9, + 0x49, 0x7b, 0x50, 0x13, 0x42, 0x00, 0x60, 0x00, 0xbf, 0x7f, 0xff, 0xff, + 0x42, 0x00, 0x68, 0x00, 0x00, 0x01, 0x80, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x3f, 0x44, 0x42, 0x00, 0x60, 0x00, 0xff, 0xfe, 0xff, 0xff, + 0x41, 0x78, 0x68, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x3f, 0x44, + 0x49, 0x7b, 0x50, 0x13, 0x4a, 0x03, 0x50, 0x11, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x05, 0x80, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x3f, 0x51, + 0x4a, 0x03, 0x88, 0x05, 0xff, 0xff, 0xff, 0xff, 0x59, 0xa8, 0x00, 0x11, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x04, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x38, 0x5d, + 0x00, 0x10, 0x38, 0x8a, 0x00, 0x10, 0x39, 0x07, 0x48, 0x03, 0xc8, 0x56, + 0x59, 0xc4, 0x00, 0xa3, 0x84, 0x00, 0x05, 0x1e, 0x48, 0x03, 0x88, 0xa3, + 0x4a, 0x03, 0x50, 0x11, 0x00, 0x00, 0x00, 0x01, 0x59, 0xc4, 0x00, 0x08, + 0x84, 0x00, 0x05, 0x4e, 0x48, 0x03, 0x88, 0x08, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x3f, 0x28, 0x42, 0x00, 0x78, 0x00, 0x00, 0x10, 0xad, 0x1a, + 0x4a, 0x00, 0x78, 0x06, 0x11, 0x01, 0x00, 0x00, 0x42, 0x00, 0xa0, 0x00, + 0x00, 0x10, 0xac, 0x02, 0x42, 0x00, 0xa8, 0x00, 0x00, 0x10, 0xad, 0x21, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x30, 0x49, 0x7b, 0x88, 0x02, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x49, 0x7b, 0x50, 0x47, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x3e, 0x1e, 0x4a, 0x03, 0x50, 0x47, 0x00, 0x00, 0x00, 0x01, + 0x49, 0x7b, 0x50, 0x15, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x58, + 0x42, 0x00, 0x60, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x00, 0x68, 0x00, + 0x00, 0x08, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x44, + 0x42, 0x00, 0x60, 0x00, 0xff, 0xf7, 0xff, 0xff, 0x41, 0x78, 0x68, 0x00, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x3f, 0x44, 0x59, 0xa8, 0x00, 0x15, + 0x49, 0x7b, 0x50, 0x15, 0x80, 0x00, 0x25, 0x40, 0x04, 0x00, 0x00, 0x6a, + 0x59, 0xc4, 0x00, 0x04, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x02, 0x00, 0x75, 0x59, 0xa8, 0x08, 0x14, 0x8c, 0x04, 0x0d, 0x02, + 0x04, 0x00, 0x00, 0x4f, 0x82, 0x10, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0c, + 0x04, 0x02, 0x00, 0x53, 0x82, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x18, + 0x80, 0x00, 0xb1, 0x04, 0x41, 0xcc, 0x10, 0x00, 0x42, 0x00, 0x18, 0x00, + 0x00, 0x10, 0xad, 0x1a, 0x50, 0x08, 0x08, 0x00, 0x50, 0x0c, 0x00, 0x00, + 0x80, 0x04, 0x05, 0x80, 0x04, 0x02, 0x00, 0x1e, 0x80, 0x08, 0x10, 0x00, + 0x80, 0x0c, 0x18, 0x00, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xf9, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x58, 0x42, 0x00, 0x60, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x42, 0x00, 0x68, 0x00, 0x00, 0x50, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x44, 0x4a, 0x03, 0x50, 0x11, + 0x00, 0x00, 0x00, 0x02, 0x4a, 0x03, 0x50, 0x13, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0x14, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x07, 0xd0, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3d, 0xf2, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x4d, 0x59, 0xa8, 0x00, 0x14, + 0x84, 0x00, 0x05, 0x06, 0x48, 0x03, 0x50, 0x14, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x3f, 0x28, 0x59, 0xcc, 0x08, 0x06, 0x82, 0x04, 0x0d, 0x80, + 0x11, 0x01, 0x00, 0x00, 0x04, 0x02, 0x00, 0x28, 0x59, 0xcc, 0x08, 0x00, + 0x82, 0x04, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x1a, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0xef, 0x04, 0x02, 0x00, 0x17, + 0x59, 0xcc, 0x08, 0x01, 0x82, 0x04, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0xef, 0x04, 0x02, 0x00, 0x11, + 0x83, 0xcc, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x07, 0x42, 0x00, 0xa8, 0x00, + 0x00, 0x10, 0xac, 0x02, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x50, 0x50, 0x08, 0x00, 0x50, 0x54, 0x00, 0x00, 0x80, 0x04, 0x04, 0x80, + 0x04, 0x00, 0x10, 0x07, 0x04, 0x02, 0x00, 0x10, 0x80, 0x50, 0xa0, 0x00, + 0x80, 0x54, 0xa8, 0x00, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xf8, + 0x04, 0x01, 0xf0, 0x0b, 0x59, 0xa8, 0x00, 0x14, 0x84, 0x00, 0x05, 0x02, + 0x48, 0x03, 0x50, 0x14, 0x41, 0xcc, 0xa0, 0x00, 0x42, 0x00, 0xa8, 0x00, + 0x00, 0x10, 0xad, 0x1a, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x3f, 0x58, 0x42, 0x00, 0x60, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x42, 0x00, 0x68, 0x00, 0x00, 0x08, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x3f, 0x44, 0x42, 0x00, 0x60, 0x00, 0xff, 0xf7, 0xff, 0xff, + 0x41, 0x78, 0x68, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x44, + 0x42, 0x00, 0x60, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x00, 0x68, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x44, + 0x59, 0xc4, 0x00, 0x04, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x02, 0x00, 0x06, 0x49, 0x7b, 0x50, 0x15, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x3e, 0x1e, + 0x1c, 0x01, 0xf0, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xa8, 0x00, 0x13, + 0x82, 0x00, 0x6d, 0x80, 0x00, 0x00, 0x00, 0x0f, 0x04, 0x00, 0x00, 0x05, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x1b, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x3d, 0xe7, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xa8, 0x00, 0x14, + 0x84, 0x00, 0x05, 0x06, 0x48, 0x03, 0x50, 0x14, 0x49, 0x7b, 0x50, 0x47, + 0x59, 0xa8, 0x00, 0x13, 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x1e, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf0, 0x01, + 0x00, 0x10, 0x39, 0x4d, 0x00, 0x10, 0x39, 0x64, 0x00, 0x10, 0x39, 0x8d, + 0x00, 0x10, 0x39, 0xa8, 0x00, 0x10, 0x39, 0xcb, 0x00, 0x10, 0x39, 0xfb, + 0x00, 0x10, 0x3a, 0x1d, 0x00, 0x10, 0x3a, 0x50, 0x00, 0x10, 0x3a, 0x72, + 0x00, 0x10, 0x3a, 0x94, 0x00, 0x10, 0x3a, 0xd0, 0x00, 0x10, 0x3a, 0xf7, + 0x00, 0x10, 0x3b, 0x0d, 0x00, 0x10, 0x3b, 0x1f, 0x00, 0x10, 0x3b, 0x37, + 0x00, 0x10, 0x3b, 0x4f, 0x00, 0x10, 0x3b, 0x54, 0x00, 0x10, 0x3b, 0x7c, + 0x00, 0x10, 0x3b, 0x9f, 0x00, 0x10, 0x3b, 0xc5, 0x00, 0x10, 0x3b, 0xe8, + 0x00, 0x10, 0x3c, 0x1c, 0x00, 0x10, 0x3c, 0x5e, 0x00, 0x10, 0x3c, 0x86, + 0x00, 0x10, 0x3c, 0x9e, 0x00, 0x10, 0x3c, 0xde, 0x00, 0x10, 0x3c, 0xf7, + 0x00, 0x10, 0x3d, 0x0a, 0x00, 0x10, 0x3d, 0x0b, 0x48, 0x03, 0xc8, 0x56, + 0x42, 0x02, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x00, 0x00, 0x07, 0x42, 0x00, 0x60, 0x00, + 0xff, 0xff, 0xff, 0xd7, 0x41, 0x78, 0x68, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x3f, 0x44, 0x04, 0x01, 0xf0, 0x09, 0x59, 0xc4, 0x00, 0x06, + 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x48, 0x03, 0x88, 0x06, + 0x4a, 0x03, 0x88, 0x05, 0x00, 0x00, 0x00, 0xf0, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0x0c, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x42, 0x00, 0x60, 0x00, 0xbf, 0x7f, 0xff, 0xff, 0x42, 0x00, 0x68, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x44, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0x14, 0x4a, 0x03, 0x50, 0x13, + 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3e, 0xab, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5b, 0x83, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x3e, 0xb4, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0xd0, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3d, 0xf2, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x5c, 0x4d, 0x59, 0xa8, 0x00, 0x15, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x14, 0x04, 0x02, 0x00, 0x23, 0x48, 0x03, 0xc8, 0x57, + 0x42, 0x00, 0x60, 0x00, 0xff, 0xbf, 0xff, 0xff, 0x41, 0x78, 0x68, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x44, 0x59, 0xc4, 0x00, 0x04, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x00, 0x19, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3d, 0xf2, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5b, 0x6f, 0x59, 0xcc, 0x10, 0x06, 0x82, 0x08, 0x15, 0x80, + 0x11, 0x02, 0x00, 0x00, 0x04, 0x02, 0x00, 0x12, 0x59, 0xcc, 0x10, 0x07, + 0x8c, 0x08, 0x15, 0x3e, 0x04, 0x00, 0x00, 0x0b, 0x59, 0xa8, 0x00, 0x14, + 0x8c, 0x00, 0x05, 0x04, 0x04, 0x02, 0x00, 0x08, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x0d, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x59, 0xa8, 0x00, 0x14, 0x84, 0x00, 0x05, 0x44, 0x48, 0x03, 0x50, 0x14, + 0x4a, 0x03, 0x50, 0x13, 0x00, 0x00, 0x00, 0x10, 0x04, 0x01, 0xf1, 0xcb, + 0x1c, 0x01, 0xf0, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x3d, 0xe7, + 0x48, 0x03, 0xc8, 0x56, 0x4a, 0x03, 0x50, 0x13, 0x00, 0x00, 0x00, 0x03, + 0x42, 0x00, 0x60, 0x00, 0xbf, 0x3f, 0xff, 0xff, 0x42, 0x00, 0x68, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x44, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3e, 0xab, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5b, 0x83, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3e, 0xb4, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3d, 0xf2, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5b, 0x6f, 0x42, 0x00, 0x78, 0x00, 0x00, 0x10, 0xad, 0x20, + 0x46, 0x00, 0x78, 0x00, 0x11, 0x02, 0x00, 0x00, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x3e, 0x1e, + 0x59, 0xa8, 0x00, 0x15, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x1e, + 0x48, 0x03, 0xc8, 0x57, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3d, 0xf2, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5b, 0x6f, 0x59, 0xa8, 0x00, 0x15, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x14, 0x04, 0x02, 0x00, 0x16, + 0x59, 0xcc, 0x10, 0x06, 0x82, 0x08, 0x15, 0x80, 0x11, 0x02, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x12, 0x59, 0xcc, 0x10, 0x07, 0x8c, 0x08, 0x15, 0x3e, + 0x04, 0x00, 0x00, 0x0b, 0x59, 0xa8, 0x00, 0x14, 0x8c, 0x00, 0x05, 0x04, + 0x04, 0x02, 0x00, 0x08, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x0d, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x59, 0xa8, 0x00, 0x14, + 0x84, 0x00, 0x05, 0x44, 0x48, 0x03, 0x50, 0x14, 0x4a, 0x03, 0x50, 0x13, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x01, 0xf0, 0x04, 0x1c, 0x01, 0xf0, 0x00, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x3d, 0xe7, 0x48, 0x03, 0xc8, 0x56, + 0x4a, 0x03, 0x50, 0x13, 0x00, 0x00, 0x00, 0x05, 0x83, 0xcc, 0xa4, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x42, 0x00, 0xa8, 0x00, 0x00, 0x10, 0xad, 0x20, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x30, 0x42, 0x00, 0x78, 0x00, 0x00, 0x10, 0xad, 0x20, + 0x46, 0x00, 0x78, 0x00, 0x11, 0x03, 0x00, 0x00, 0x8d, 0x0e, 0x1d, 0x06, + 0x04, 0x02, 0x00, 0x14, 0x59, 0xa8, 0x00, 0x14, 0x8c, 0x00, 0x05, 0x00, + 0x04, 0x02, 0x00, 0x11, 0x59, 0xa8, 0x08, 0x0f, 0x82, 0x04, 0x05, 0x80, + 0x00, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x0d, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x82, 0x04, 0x04, 0x00, 0x00, 0x10, 0x1c, 0xdd, + 0x50, 0x00, 0x08, 0x00, 0x80, 0x04, 0x09, 0x10, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x01, 0xfb, 0x93, 0x04, 0x00, 0x00, 0x0b, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3e, 0xd2, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x83, 0xcc, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x42, 0x00, 0xa8, 0x00, 0x00, 0x10, 0xad, 0x21, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x30, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x3e, 0x1e, 0x59, 0xa8, 0x00, 0x15, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x1e, 0x48, 0x03, 0xc8, 0x57, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3d, 0xf2, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5b, 0x6f, 0x59, 0xa8, 0x00, 0x15, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x14, 0x04, 0x02, 0x00, 0x16, 0x59, 0xcc, 0x10, 0x06, + 0x82, 0x08, 0x15, 0x80, 0x11, 0x03, 0x00, 0x00, 0x04, 0x02, 0x00, 0x12, + 0x59, 0xcc, 0x10, 0x07, 0x8c, 0x08, 0x15, 0x3e, 0x04, 0x00, 0x00, 0x0b, + 0x59, 0xa8, 0x00, 0x14, 0x8c, 0x00, 0x05, 0x04, 0x04, 0x02, 0x00, 0x08, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x0d, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x59, 0xa8, 0x00, 0x14, 0x84, 0x00, 0x05, 0x44, + 0x48, 0x03, 0x50, 0x14, 0x4a, 0x03, 0x50, 0x13, 0x00, 0x00, 0x00, 0x06, + 0x04, 0x01, 0xf0, 0x03, 0x1c, 0x01, 0xf0, 0x00, 0x04, 0x01, 0xf3, 0xcb, + 0x48, 0x03, 0xc8, 0x56, 0x4a, 0x03, 0x50, 0x13, 0x00, 0x00, 0x00, 0x07, + 0x83, 0xcc, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x06, 0x42, 0x00, 0xa8, 0x00, + 0x00, 0x10, 0xad, 0x20, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, 0x42, 0x00, 0x78, 0x00, + 0x00, 0x10, 0xad, 0x20, 0x46, 0x00, 0x78, 0x00, 0x11, 0x04, 0x00, 0x00, + 0x8d, 0x0e, 0x1d, 0x06, 0x04, 0x02, 0x00, 0x20, 0x59, 0xa8, 0x00, 0x14, + 0x8c, 0x00, 0x05, 0x00, 0x04, 0x02, 0x00, 0x1d, 0x59, 0x9c, 0x00, 0x17, + 0x8c, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x1a, 0x59, 0x9c, 0x14, 0x02, + 0x82, 0x08, 0x04, 0x80, 0x00, 0x00, 0x00, 0x7f, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x4c, 0x08, 0x00, 0x00, 0x82, 0x08, 0x14, 0x00, + 0x00, 0x10, 0x1c, 0xdd, 0x50, 0x08, 0x10, 0x00, 0x82, 0x08, 0x15, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x48, 0x0b, 0x50, 0x0f, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x99, + 0x5c, 0x00, 0x08, 0x00, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x01, 0xfb, 0x37, 0x04, 0x00, 0x00, 0x05, 0x04, 0x01, 0xfd, 0x2c, + 0x04, 0x00, 0x00, 0x03, 0x48, 0x03, 0xc8, 0x56, 0x85, 0x0e, 0x1d, 0x46, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x05, 0x04, 0x01, 0xf3, 0xcf, + 0x59, 0xa8, 0x00, 0x15, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x1e, + 0x48, 0x03, 0xc8, 0x57, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3d, 0xf2, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5b, 0x6f, 0x59, 0xa8, 0x00, 0x15, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x14, 0x04, 0x02, 0x00, 0x16, + 0x59, 0xcc, 0x10, 0x06, 0x82, 0x08, 0x15, 0x80, 0x11, 0x04, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x12, 0x59, 0xcc, 0x10, 0x07, 0x8c, 0x08, 0x15, 0x3e, + 0x04, 0x00, 0x00, 0x0b, 0x59, 0xa8, 0x00, 0x14, 0x8c, 0x00, 0x05, 0x04, + 0x04, 0x02, 0x00, 0x08, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x0d, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x59, 0xa8, 0x00, 0x14, + 0x84, 0x00, 0x05, 0x44, 0x48, 0x03, 0x50, 0x14, 0x4a, 0x03, 0x50, 0x13, + 0x00, 0x00, 0x00, 0x08, 0x04, 0x01, 0xf0, 0x03, 0x1c, 0x01, 0xf0, 0x00, + 0x04, 0x01, 0xf3, 0x76, 0x48, 0x03, 0xc8, 0x56, 0x4a, 0x03, 0x50, 0x13, + 0x00, 0x00, 0x00, 0x09, 0x83, 0xcc, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x42, 0x00, 0xa8, 0x00, 0x00, 0x10, 0xad, 0x20, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, + 0x42, 0x00, 0x78, 0x00, 0x00, 0x10, 0xad, 0x20, 0x46, 0x00, 0x78, 0x00, + 0x11, 0x05, 0x01, 0x00, 0x8d, 0x0e, 0x1d, 0x06, 0x04, 0x02, 0x00, 0x08, + 0x59, 0xa8, 0x00, 0x14, 0x8c, 0x00, 0x05, 0x00, 0x04, 0x02, 0x00, 0x05, + 0x04, 0x01, 0xfa, 0x86, 0x04, 0x02, 0x00, 0x03, 0x48, 0x03, 0xc8, 0x56, + 0x85, 0x0e, 0x1d, 0x46, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x01, 0xfb, 0x92, 0x4d, 0x3c, 0x00, 0x00, 0x42, 0x02, 0x78, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x90, 0xc7, + 0x5c, 0x02, 0x78, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xa8, 0x00, 0x15, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x38, 0x48, 0x03, 0xc8, 0x57, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3d, 0xf2, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5b, 0x6f, 0x59, 0xa8, 0x00, 0x15, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x14, 0x04, 0x02, 0x00, 0x30, 0x59, 0xcc, 0x10, 0x06, + 0x82, 0x08, 0x05, 0x00, 0x11, 0x05, 0x00, 0x00, 0x82, 0x00, 0x05, 0x80, + 0x11, 0x05, 0x00, 0x00, 0x04, 0x02, 0x00, 0x2a, 0x8c, 0x08, 0x15, 0x10, + 0x04, 0x00, 0x00, 0x14, 0x59, 0xcc, 0x10, 0x07, 0x8c, 0x08, 0x15, 0x3e, + 0x04, 0x00, 0x00, 0x0b, 0x59, 0xa8, 0x00, 0x14, 0x8c, 0x00, 0x05, 0x04, + 0x04, 0x02, 0x00, 0x08, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x0d, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x59, 0xa8, 0x00, 0x14, + 0x84, 0x00, 0x05, 0x44, 0x48, 0x03, 0x50, 0x14, 0x4a, 0x03, 0x50, 0x12, + 0x00, 0x00, 0x00, 0x01, 0x4a, 0x03, 0x50, 0x13, 0x00, 0x00, 0x00, 0x0a, + 0x04, 0x01, 0xf8, 0x17, 0x04, 0x01, 0xf0, 0x14, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x02, 0x00, 0x13, 0x59, 0xcc, 0x10, 0x07, 0x8c, 0x08, 0x15, 0x3e, + 0x04, 0x00, 0x00, 0x0b, 0x59, 0xa8, 0x00, 0x14, 0x8c, 0x00, 0x05, 0x04, + 0x04, 0x02, 0x00, 0x08, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x0d, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x59, 0xa8, 0x00, 0x14, + 0x84, 0x00, 0x05, 0x44, 0x48, 0x03, 0x50, 0x14, 0x49, 0x7b, 0x50, 0x12, + 0x4a, 0x03, 0x50, 0x13, 0x00, 0x00, 0x00, 0x0e, 0x04, 0x01, 0xf0, 0x6a, + 0x1c, 0x01, 0xf0, 0x00, 0x04, 0x01, 0xf3, 0x18, 0x48, 0x03, 0xc8, 0x56, + 0x4a, 0x03, 0x50, 0x13, 0x00, 0x00, 0x00, 0x0b, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x10, 0xad, 0x21, 0x40, 0x08, 0xa8, 0x00, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x46, 0x00, 0xa8, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x54, 0xa8, 0x00, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xfc, + 0x42, 0x00, 0x78, 0x00, 0x00, 0x10, 0xad, 0x20, 0x46, 0x00, 0x78, 0x00, + 0x11, 0x06, 0x00, 0x00, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0xad, 0x21, + 0x8d, 0x0e, 0x1d, 0x06, 0x04, 0x00, 0x00, 0x05, 0x50, 0x08, 0x00, 0x00, + 0x46, 0x00, 0x10, 0x00, 0x00, 0xff, 0xff, 0xff, 0x04, 0x01, 0xf0, 0x0c, + 0x50, 0x08, 0x08, 0x00, 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x59, 0xa8, 0x00, 0x0f, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0xe0, + 0x80, 0x04, 0x0d, 0x40, 0x44, 0x04, 0x10, 0x00, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x21, 0x04, 0x01, 0xf3, 0x28, 0x59, 0xa8, 0x00, 0x15, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x12, 0x48, 0x03, 0xc8, 0x57, + 0x59, 0xa8, 0x00, 0x15, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3d, 0xf2, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5b, 0x6f, 0x59, 0xa8, 0x00, 0x15, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x84, 0x04, 0x02, 0x00, 0x09, + 0x59, 0xcc, 0x10, 0x06, 0x82, 0x08, 0x15, 0x80, 0x11, 0x06, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x05, 0x4a, 0x03, 0x50, 0x13, 0x00, 0x00, 0x00, 0x0c, + 0x04, 0x01, 0xf0, 0x03, 0x1c, 0x01, 0xf0, 0x00, 0x04, 0x01, 0xf2, 0xdb, + 0x48, 0x03, 0xc8, 0x56, 0x4a, 0x03, 0x50, 0x13, 0x00, 0x00, 0x00, 0x0d, + 0x83, 0xcc, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x06, 0x42, 0x00, 0xa8, 0x00, + 0x00, 0x10, 0xad, 0x20, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x21, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, 0x42, 0x00, 0x78, 0x00, + 0x00, 0x10, 0xad, 0x20, 0x46, 0x00, 0x78, 0x00, 0x11, 0x07, 0x00, 0x00, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x21, 0x04, 0x01, 0xf3, 0x00, + 0x59, 0xa8, 0x00, 0x15, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x14, + 0x48, 0x03, 0xc8, 0x57, 0x59, 0xa8, 0x00, 0x15, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x10, 0x3d, 0xf2, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5b, 0x6f, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x84, 0x04, 0x02, 0x00, 0x0c, + 0x59, 0xcc, 0x10, 0x06, 0x82, 0x08, 0x15, 0x80, 0x11, 0x07, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x08, 0x4a, 0x03, 0x50, 0x12, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xfa, 0x91, 0x4a, 0x03, 0x50, 0x13, 0x00, 0x00, 0x00, 0x0e, + 0x04, 0x01, 0xf0, 0x03, 0x1c, 0x01, 0xf0, 0x00, 0x04, 0x01, 0xf2, 0xb1, + 0x48, 0x03, 0xc8, 0x56, 0x82, 0x04, 0x0d, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x51, 0x4a, 0x03, 0x50, 0x13, + 0x00, 0x00, 0x00, 0x0f, 0x49, 0x7b, 0x50, 0x15, 0x42, 0x00, 0x60, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x42, 0x00, 0x68, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x44, 0x42, 0x00, 0x60, 0x00, + 0xff, 0xdf, 0xff, 0xff, 0x41, 0x78, 0x68, 0x00, 0x04, 0x01, 0xfb, 0xfc, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0xd0, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x10, 0x3d, 0xf2, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x5b, 0x43, + 0x48, 0x03, 0xc8, 0x56, 0x59, 0xa8, 0x00, 0x15, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x02, 0x02, 0x95, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x4a, 0x03, 0x50, 0x13, 0x00, 0x00, 0x00, 0x11, 0x83, 0xcc, 0xa4, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x42, 0x00, 0xa8, 0x00, 0x00, 0x10, 0xad, 0x20, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x30, 0x42, 0x00, 0xa8, 0x00, 0x00, 0x10, 0xad, 0x20, + 0x46, 0x00, 0xa8, 0x00, 0x11, 0x02, 0x00, 0x00, 0x8d, 0x0e, 0x1d, 0x06, + 0x04, 0x02, 0x00, 0x15, 0x59, 0xa8, 0x00, 0x0f, 0x82, 0x00, 0x0d, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x04, 0x00, 0x00, 0x11, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0x0e, 0x82, 0x00, 0x0c, 0x00, + 0x00, 0x10, 0x1c, 0xdd, 0x50, 0x04, 0x08, 0x00, 0x80, 0x04, 0x09, 0x10, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x7e, 0x04, 0x00, 0x00, 0x07, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x04, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x01, 0xfa, 0x06, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x05, 0x04, 0x01, 0xf2, 0xa3, + 0x59, 0xa8, 0x00, 0x15, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x20, + 0x48, 0x03, 0xc8, 0x57, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3d, 0xf2, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5b, 0x6f, 0x59, 0xa8, 0x00, 0x15, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x14, 0x04, 0x02, 0x00, 0x16, + 0x59, 0xcc, 0x10, 0x06, 0x82, 0x08, 0x15, 0x80, 0x11, 0x03, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x12, 0x59, 0xcc, 0x10, 0x07, 0x8c, 0x08, 0x15, 0x3e, + 0x04, 0x00, 0x00, 0x0b, 0x59, 0xa8, 0x00, 0x14, 0x8c, 0x00, 0x05, 0x04, + 0x04, 0x02, 0x00, 0x08, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x0d, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x59, 0xa8, 0x00, 0x14, + 0x84, 0x00, 0x05, 0x44, 0x48, 0x03, 0x50, 0x14, 0x4a, 0x03, 0x50, 0x13, + 0x00, 0x00, 0x00, 0x12, 0x04, 0x01, 0xf8, 0x04, 0x04, 0x01, 0xf0, 0x02, + 0x04, 0x01, 0xfa, 0x4a, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x4a, 0x03, 0x50, 0x13, 0x00, 0x00, 0x00, 0x13, 0x83, 0xcc, 0xa4, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x42, 0x00, 0xa8, 0x00, 0x00, 0x10, 0xad, 0x20, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x30, 0x42, 0x00, 0xa8, 0x00, 0x00, 0x10, 0xad, 0x20, + 0x46, 0x00, 0xa8, 0x00, 0x11, 0x03, 0x00, 0x00, 0x8d, 0x0e, 0x1d, 0x06, + 0x04, 0x02, 0x00, 0x13, 0x59, 0xa8, 0x00, 0x14, 0x8c, 0x00, 0x05, 0x00, + 0x04, 0x02, 0x00, 0x10, 0x59, 0xa8, 0x08, 0x0f, 0x82, 0x04, 0x05, 0x80, + 0x00, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x0c, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x82, 0x04, 0x04, 0x00, 0x00, 0x10, 0x1c, 0xdd, + 0x50, 0x00, 0x08, 0x00, 0x80, 0x04, 0x09, 0x10, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x01, 0xf9, 0xbf, 0x04, 0x00, 0x00, 0x02, + 0x04, 0x01, 0xfb, 0x11, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x01, 0xf2, 0x5a, 0x59, 0xa8, 0x00, 0x15, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x00, 0x00, 0x20, 0x48, 0x03, 0xc8, 0x57, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x10, 0x3d, 0xf2, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5b, 0x6f, + 0x59, 0xa8, 0x00, 0x15, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x14, + 0x04, 0x02, 0x00, 0x16, 0x59, 0xcc, 0x10, 0x06, 0x82, 0x08, 0x15, 0x80, + 0x11, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x12, 0x59, 0xcc, 0x10, 0x07, + 0x8c, 0x08, 0x15, 0x3e, 0x04, 0x00, 0x00, 0x0b, 0x59, 0xa8, 0x00, 0x14, + 0x8c, 0x00, 0x05, 0x04, 0x04, 0x02, 0x00, 0x08, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x0d, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x59, 0xa8, 0x00, 0x14, 0x84, 0x00, 0x05, 0x44, 0x48, 0x03, 0x50, 0x14, + 0x4a, 0x03, 0x50, 0x13, 0x00, 0x00, 0x00, 0x14, 0x04, 0x01, 0xf8, 0x04, + 0x04, 0x01, 0xf0, 0x02, 0x04, 0x01, 0xfa, 0x01, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x4a, 0x03, 0x50, 0x13, 0x00, 0x00, 0x00, 0x15, + 0x83, 0xcc, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x06, 0x42, 0x00, 0xa8, 0x00, + 0x00, 0x10, 0xad, 0x20, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, 0x42, 0x00, 0xa8, 0x00, + 0x00, 0x10, 0xad, 0x20, 0x46, 0x00, 0xa8, 0x00, 0x11, 0x04, 0x00, 0x00, + 0x8d, 0x0e, 0x1d, 0x06, 0x04, 0x02, 0x00, 0x21, 0x59, 0xa8, 0x00, 0x14, + 0x8c, 0x00, 0x05, 0x00, 0x04, 0x02, 0x00, 0x1e, 0x59, 0x9c, 0x00, 0x17, + 0x8c, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x1b, 0x59, 0x9c, 0x14, 0x02, + 0x82, 0x08, 0x04, 0x80, 0x00, 0x00, 0x00, 0x7f, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x4c, 0x08, 0x00, 0x00, 0x82, 0x08, 0x14, 0x00, + 0x00, 0x10, 0x1c, 0xdd, 0x50, 0x08, 0x10, 0x00, 0x82, 0x08, 0x15, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x48, 0x0b, 0x50, 0x0f, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x99, + 0x5c, 0x00, 0x08, 0x00, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x01, 0xf9, 0x6c, 0x04, 0x00, 0x00, 0x06, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x37, 0x75, 0x04, 0x00, 0x00, 0x03, 0x48, 0x03, 0xc8, 0x56, + 0x85, 0x0e, 0x1d, 0x46, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x01, 0xf2, 0x03, 0x59, 0xa8, 0x00, 0x15, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x00, 0x00, 0x3f, 0x48, 0x03, 0xc8, 0x57, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x10, 0x3d, 0xf2, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5b, 0x6f, + 0x59, 0xa8, 0x00, 0x15, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x14, + 0x04, 0x02, 0x00, 0x35, 0x59, 0xcc, 0x10, 0x06, 0x82, 0x08, 0x05, 0x00, + 0x11, 0x05, 0x00, 0x00, 0x82, 0x00, 0x05, 0x80, 0x11, 0x05, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x2f, 0x8c, 0x08, 0x15, 0x10, 0x04, 0x00, 0x00, 0x10, + 0x04, 0x01, 0xfb, 0x21, 0x59, 0xcc, 0x10, 0x07, 0x8c, 0x08, 0x15, 0x3e, + 0x04, 0x00, 0x00, 0x0b, 0x59, 0xa8, 0x00, 0x14, 0x8c, 0x00, 0x05, 0x04, + 0x04, 0x02, 0x00, 0x08, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x0d, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x59, 0xa8, 0x00, 0x14, + 0x84, 0x00, 0x05, 0x44, 0x48, 0x03, 0x50, 0x14, 0x04, 0x01, 0xf0, 0x13, + 0x59, 0xcc, 0x10, 0x07, 0x8c, 0x08, 0x15, 0x3e, 0x04, 0x00, 0x00, 0x0b, + 0x59, 0xa8, 0x00, 0x14, 0x8c, 0x00, 0x05, 0x04, 0x04, 0x02, 0x00, 0x08, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x0d, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x59, 0xa8, 0x00, 0x14, 0x84, 0x00, 0x05, 0x44, + 0x48, 0x03, 0x50, 0x14, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xfb, 0x03, 0x49, 0x7b, 0x50, 0x12, 0x04, 0x01, 0xf0, 0x03, + 0x4a, 0x03, 0x50, 0x12, 0x00, 0x00, 0x00, 0x01, 0x59, 0xcc, 0x10, 0x07, + 0x8c, 0x08, 0x15, 0x3c, 0x04, 0x00, 0x00, 0x03, 0x4a, 0x03, 0x50, 0x23, + 0x00, 0x00, 0x00, 0x08, 0x4a, 0x03, 0x50, 0x13, 0x00, 0x00, 0x00, 0x16, + 0x04, 0x01, 0xf8, 0x04, 0x04, 0x01, 0xf0, 0x02, 0x04, 0x01, 0xf9, 0x8b, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x83, 0xcc, 0xa4, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x42, 0x00, 0xa8, 0x00, 0x00, 0x10, 0xad, 0x20, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x30, 0x4a, 0x03, 0x50, 0x13, 0x00, 0x00, 0x00, 0x17, + 0x59, 0xa8, 0x00, 0x12, 0x8c, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x06, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0xad, 0x20, 0x46, 0x00, 0x10, 0x00, + 0x11, 0x05, 0x01, 0x00, 0x04, 0x01, 0xf0, 0x03, 0x4a, 0x03, 0x50, 0x13, + 0x00, 0x00, 0x00, 0x1b, 0x8d, 0x0e, 0x1d, 0x06, 0x04, 0x02, 0x00, 0x08, + 0x59, 0xa8, 0x00, 0x14, 0x8c, 0x00, 0x05, 0x00, 0x04, 0x02, 0x00, 0x05, + 0x04, 0x01, 0xf8, 0x94, 0x04, 0x02, 0x00, 0x03, 0x48, 0x03, 0xc8, 0x56, + 0x85, 0x0e, 0x1d, 0x46, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x01, 0xf9, 0xa0, 0x4d, 0x3c, 0x00, 0x00, 0x42, 0x02, 0x78, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x90, 0xc7, + 0x5c, 0x02, 0x78, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xa8, 0x00, 0x15, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x15, 0x48, 0x03, 0xc8, 0x57, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3d, 0xf2, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5b, 0x6f, 0x59, 0xa8, 0x00, 0x15, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x84, 0x04, 0x02, 0x00, 0x0b, 0x59, 0xcc, 0x10, 0x06, + 0x82, 0x08, 0x15, 0x80, 0x11, 0x06, 0x00, 0x00, 0x04, 0x02, 0x00, 0x07, + 0x80, 0x00, 0x05, 0x80, 0x04, 0x01, 0xfa, 0xba, 0x4a, 0x03, 0x50, 0x13, + 0x00, 0x00, 0x00, 0x18, 0x04, 0x01, 0xf8, 0x04, 0x04, 0x01, 0xf0, 0x02, + 0x04, 0x01, 0xf9, 0x4b, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x4a, 0x03, 0x50, 0x13, 0x00, 0x00, 0x00, 0x19, 0x83, 0xcc, 0xa4, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x42, 0x00, 0xa8, 0x00, 0x00, 0x10, 0xad, 0x20, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x30, 0x42, 0x00, 0x38, 0x00, 0x00, 0x10, 0xad, 0x21, + 0x8d, 0x0e, 0x1d, 0x06, 0x04, 0x02, 0x00, 0x18, 0x40, 0x1c, 0x28, 0x00, + 0x50, 0x14, 0x10, 0x00, 0x80, 0x08, 0x01, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x18, 0x00, 0x82, 0x08, 0x15, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x80, 0x00, 0x00, 0xf0, 0x80, 0x08, 0x05, 0x40, 0x44, 0x00, 0x28, 0x00, + 0x59, 0xa8, 0x08, 0x0f, 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x40, 0x0c, 0x10, 0x00, 0x80, 0x08, 0x11, 0x04, 0x82, 0x08, 0x24, 0x00, + 0x00, 0x10, 0xad, 0x21, 0x50, 0x10, 0x10, 0x00, 0x82, 0x0c, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x0c, 0x01, 0xf8, 0x06, 0x80, 0x08, 0x15, 0x40, + 0x44, 0x08, 0x20, 0x00, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x21, + 0x04, 0x01, 0xf1, 0x58, 0x00, 0x10, 0x3c, 0xcb, 0x00, 0x10, 0x3c, 0xd0, + 0x00, 0x10, 0x3c, 0xd5, 0x00, 0x10, 0x3c, 0xda, 0x80, 0x04, 0x08, 0xf0, + 0x40, 0x04, 0x00, 0x00, 0x82, 0x08, 0x15, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x1c, 0x01, 0xf0, 0x00, 0x80, 0x04, 0x08, 0xe0, 0x40, 0x04, 0x00, 0x00, + 0x82, 0x08, 0x15, 0x00, 0xff, 0x00, 0xff, 0xff, 0x1c, 0x01, 0xf0, 0x00, + 0x80, 0x04, 0x08, 0xd0, 0x40, 0x04, 0x00, 0x00, 0x82, 0x08, 0x15, 0x00, + 0xff, 0xff, 0x00, 0xff, 0x1c, 0x01, 0xf0, 0x00, 0x40, 0x04, 0x00, 0x00, + 0x82, 0x08, 0x15, 0x00, 0xff, 0xff, 0xff, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0xa8, 0x00, 0x15, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x16, + 0x48, 0x03, 0xc8, 0x57, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3d, 0xf2, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5b, 0x6f, 0x59, 0xa8, 0x00, 0x15, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x84, 0x04, 0x02, 0x00, 0x0c, + 0x59, 0xcc, 0x10, 0x06, 0x82, 0x08, 0x15, 0x80, 0x11, 0x07, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x08, 0x4a, 0x03, 0x50, 0x12, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf8, 0xd2, 0x4a, 0x03, 0x50, 0x13, 0x00, 0x00, 0x00, 0x1a, + 0x04, 0x01, 0xf8, 0x04, 0x04, 0x01, 0xf0, 0x02, 0x04, 0x01, 0xf8, 0xf2, + 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xfa, 0x58, 0x4a, 0x03, 0x50, 0x13, 0x00, 0x00, 0x00, 0x1b, + 0x83, 0xcc, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x06, 0x42, 0x00, 0xa8, 0x00, + 0x00, 0x10, 0xad, 0x20, 0x59, 0xa8, 0x20, 0x15, 0x40, 0x10, 0x00, 0x00, + 0x80, 0x00, 0xb1, 0x04, 0x40, 0x58, 0x08, 0x00, 0x54, 0x50, 0xa8, 0x00, + 0x80, 0x50, 0xa0, 0x00, 0x80, 0x54, 0xa8, 0x00, 0x80, 0x58, 0xb0, 0x40, + 0x04, 0x02, 0x07, 0xfc, 0x04, 0x01, 0xf1, 0x15, 0x1c, 0x01, 0xf0, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x42, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x42, 0x00, 0x40, 0x00, 0x00, 0x10, 0xad, 0x21, + 0x59, 0x9c, 0x28, 0x17, 0x8c, 0x14, 0x2d, 0x14, 0x04, 0x02, 0x00, 0x1f, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x03, 0x40, 0x20, 0x00, 0x00, + 0x80, 0x08, 0x04, 0x00, 0x50, 0x00, 0x08, 0x00, 0x82, 0x04, 0x25, 0x80, + 0xff, 0xff, 0xff, 0xff, 0x04, 0x02, 0x00, 0x05, 0x80, 0x08, 0x10, 0x40, + 0x80, 0x18, 0x30, 0x40, 0x04, 0x02, 0x07, 0xf8, 0x04, 0x01, 0xf0, 0x5e, + 0x80, 0x08, 0x11, 0xc0, 0x04, 0x02, 0x00, 0x06, 0x82, 0x04, 0x25, 0x80, + 0x3f, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x58, 0x82, 0x04, 0x0d, 0x40, + 0xc0, 0x00, 0x00, 0x00, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x42, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x04, 0x20, 0x00, + 0x80, 0x10, 0x21, 0x02, 0x04, 0x02, 0x10, 0x21, 0x80, 0x0c, 0x18, 0xc2, + 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xfc, 0x04, 0x01, 0xf0, 0x4b, + 0x41, 0x78, 0x10, 0x00, 0x40, 0x20, 0x00, 0x00, 0x80, 0x08, 0x04, 0x00, + 0x50, 0x00, 0x08, 0x00, 0x82, 0x04, 0x25, 0x80, 0xff, 0xff, 0xff, 0xff, + 0x04, 0x02, 0x00, 0x05, 0x80, 0x08, 0x10, 0x00, 0x80, 0x18, 0x30, 0x40, + 0x04, 0x02, 0x07, 0xf8, 0x04, 0x01, 0xf0, 0x40, 0x80, 0x08, 0x11, 0xc0, + 0x04, 0x02, 0x00, 0x03, 0x82, 0x04, 0x0d, 0x40, 0xc0, 0x00, 0x00, 0x00, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x18, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x40, 0x04, 0x20, 0x00, 0x80, 0x10, 0x20, 0xc2, + 0x04, 0x02, 0x10, 0x07, 0x80, 0x0c, 0x19, 0x02, 0x80, 0x58, 0xb0, 0x00, + 0x82, 0x58, 0x04, 0x80, 0x00, 0x00, 0x00, 0x21, 0x04, 0x00, 0x17, 0xfa, + 0x04, 0x01, 0xf0, 0x2f, 0x40, 0x20, 0x00, 0x00, 0x80, 0x08, 0x24, 0x00, + 0x50, 0x10, 0x00, 0x00, 0x80, 0x0c, 0x05, 0x40, 0x44, 0x00, 0x20, 0x00, + 0x59, 0xa8, 0x00, 0x14, 0x84, 0x00, 0x05, 0x40, 0x48, 0x03, 0x50, 0x14, + 0x40, 0x58, 0x00, 0x00, 0x42, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x80, 0x14, 0x2c, 0x80, 0x40, 0x08, 0x00, 0x00, 0x42, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x80, 0x1c, 0x04, 0x80, 0x80, 0x00, 0x00, 0xca, + 0x80, 0x14, 0x2d, 0x40, 0x82, 0x14, 0x4c, 0x00, 0x00, 0x10, 0x1c, 0xdd, + 0x50, 0x24, 0x28, 0x00, 0x82, 0x14, 0x2d, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x48, 0x17, 0x50, 0x0f, 0x4c, 0x04, 0x00, 0x00, 0x40, 0x14, 0x08, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0x1e, 0x5c, 0x00, 0x08, 0x00, + 0x40, 0x00, 0x18, 0x00, 0x50, 0x0c, 0x00, 0x00, 0x80, 0x10, 0x05, 0x40, + 0x44, 0x00, 0x18, 0x00, 0x59, 0xa8, 0x00, 0x14, 0x84, 0x00, 0x05, 0x40, + 0x48, 0x03, 0x50, 0x14, 0x42, 0x00, 0xa8, 0x00, 0x00, 0x10, 0xad, 0x21, + 0x40, 0x20, 0xa0, 0x00, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x02, 0x80, 0x00, 0x05, 0x80, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x07, 0xc8, 0x57, 0x48, 0x0b, 0xc8, 0x57, + 0x40, 0x08, 0xb0, 0x00, 0x83, 0xcc, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x42, 0x00, 0xa8, 0x00, 0x00, 0x10, 0xad, 0x21, 0x40, 0x54, 0x10, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, 0x40, 0x04, 0x18, 0x00, + 0x41, 0x78, 0x20, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x82, 0x0c, 0x1c, 0x80, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x10, 0x04, + 0x80, 0x10, 0x20, 0x00, 0x80, 0x00, 0x00, 0x40, 0x04, 0x01, 0xf7, 0xfb, + 0x40, 0x04, 0x18, 0x00, 0x80, 0x10, 0x21, 0xc0, 0x04, 0x00, 0x00, 0x05, + 0x82, 0x0c, 0x1c, 0x80, 0x00, 0x00, 0x00, 0x20, 0x80, 0x10, 0x20, 0x40, + 0x04, 0x02, 0x07, 0xfd, 0x42, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x80, 0x0c, 0x19, 0xc0, 0x04, 0x00, 0x00, 0x04, 0x80, 0x10, 0x20, 0xc2, + 0x80, 0x0c, 0x18, 0x40, 0x04, 0x02, 0x07, 0xfe, 0x80, 0x08, 0x3c, 0x00, + 0x83, 0xcc, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x14, 0x2c, 0x00, + 0x50, 0x14, 0x00, 0x00, 0x80, 0x10, 0x2d, 0x00, 0x04, 0x02, 0x00, 0x12, + 0x80, 0x10, 0x05, 0x40, 0x44, 0x00, 0x38, 0x00, 0x82, 0x04, 0x24, 0x00, + 0x00, 0x10, 0x1c, 0xdd, 0x50, 0x10, 0x28, 0x00, 0x82, 0x14, 0x2d, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x48, 0x17, 0x50, 0x0f, 0x4c, 0x04, 0x00, 0x00, + 0x40, 0x14, 0x08, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0x1e, + 0x5c, 0x00, 0x08, 0x00, 0x59, 0xa8, 0x00, 0x14, 0x84, 0x00, 0x05, 0x40, + 0x48, 0x03, 0x50, 0x14, 0x80, 0x00, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x07, 0xc8, 0x56, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x17, + 0x59, 0xa8, 0x18, 0x4b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x68, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xf4, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x07, 0xc8, 0x56, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x83, 0xcc, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x07, 0x42, 0x00, 0xa8, 0x00, + 0x00, 0x10, 0xb5, 0xf0, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0xa3, 0x41, + 0x48, 0x07, 0xc8, 0x56, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x67, 0x25, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xf7, 0x04, 0x01, 0xf8, 0xf5, + 0x49, 0x7b, 0x28, 0x04, 0x49, 0x7b, 0x28, 0x05, 0x49, 0x7b, 0x28, 0x1c, + 0x49, 0x7b, 0x28, 0x1d, 0x42, 0x02, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x42, 0x00, 0x60, 0x00, 0xbf, 0x7f, 0xff, 0xff, 0x42, 0x00, 0x68, 0x00, + 0x00, 0x01, 0x80, 0x00, 0x04, 0x01, 0xf9, 0x69, 0x42, 0x00, 0x60, 0x00, + 0xff, 0xfe, 0xff, 0xff, 0x41, 0x78, 0x68, 0x00, 0x04, 0x01, 0xf9, 0x65, + 0x49, 0x7b, 0x50, 0x4b, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x2d, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3e, 0x74, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x5b, 0x43, 0x48, 0x07, 0xc8, 0x56, 0x04, 0x01, 0xff, 0xe3, + 0x49, 0x7b, 0x50, 0x13, 0x49, 0x7b, 0x50, 0x15, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x07, 0xc8, 0x56, 0x42, 0x00, 0x60, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x42, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x28, 0x04, 0x01, 0xf1, 0x53, + 0x48, 0x07, 0xc8, 0x56, 0x04, 0x01, 0xff, 0xc6, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x76, 0x4d, 0xf0, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x66, 0x64, 0x5c, 0x03, 0xe0, 0x00, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x64, 0x63, 0x59, 0xc4, 0x00, 0xa4, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x02, 0x00, 0x0a, 0x42, 0x00, 0x60, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x42, 0x00, 0x68, 0x00, 0x00, 0x20, 0x00, 0x00, 0x04, 0x01, 0xf9, 0x3e, + 0x42, 0x00, 0x60, 0x00, 0xff, 0xdf, 0xff, 0xff, 0x41, 0x78, 0x68, 0x00, + 0x04, 0x01, 0xf9, 0x3a, 0x49, 0x7b, 0x50, 0x13, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0xf7, 0x04, 0x01, 0xf8, 0xb7, 0x59, 0xc4, 0x00, 0xa3, + 0x82, 0x00, 0x05, 0x00, 0xbf, 0x20, 0xbf, 0xff, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x01, 0xc0, 0x00, 0x48, 0x03, 0x88, 0xa3, 0x84, 0x00, 0x05, 0x20, + 0x48, 0x03, 0x88, 0xa3, 0x49, 0x7b, 0x50, 0x4b, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x2d, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3e, 0x74, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x5b, 0x43, 0x49, 0x7b, 0x50, 0x15, + 0x59, 0xb4, 0x00, 0xf5, 0x8c, 0x00, 0x05, 0x00, 0x04, 0x02, 0x00, 0x04, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x48, 0x03, 0x68, 0xf5, + 0x80, 0x04, 0x00, 0xc4, 0x82, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x48, 0x03, 0x91, 0x0a, 0x59, 0xb4, 0x00, 0xf6, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x04, 0x02, 0x07, 0xfd, 0x4a, 0x03, 0x68, 0xf0, + 0x00, 0x10, 0xad, 0x19, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xad, 0x20, + 0x4c, 0x04, 0x00, 0x00, 0x50, 0x00, 0x08, 0x00, 0x82, 0x04, 0x0d, 0x80, + 0x11, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x50, 0x00, 0x08, 0x00, + 0x48, 0x07, 0xc8, 0x57, 0x5c, 0x00, 0x08, 0x00, 0x48, 0x03, 0x68, 0xf1, + 0x82, 0x04, 0x04, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x48, 0x03, 0x68, 0xf3, + 0x59, 0xc4, 0x00, 0xa4, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x08, 0x04, 0x02, 0x00, 0x17, + 0x4c, 0x5c, 0x00, 0x00, 0x4c, 0x60, 0x00, 0x00, 0x59, 0xc4, 0xb8, 0x05, + 0x8c, 0x5c, 0xbd, 0x3a, 0x04, 0x02, 0x00, 0x05, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xaf, 0xe6, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x4a, 0x03, 0x88, 0x05, 0x02, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x19, 0x46, 0x40, 0x00, 0xc0, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x18, 0xc4, 0x42, 0x02, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x49, 0x7b, 0x50, 0x13, 0x5c, 0x00, 0xc0, 0x00, 0x5c, 0x00, 0xb8, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xc8, 0x01, 0x0b, 0x8c, 0x00, 0x05, 0x02, + 0x04, 0x00, 0x07, 0xe2, 0x59, 0xc4, 0x08, 0xa4, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x82, 0x04, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x0b, + 0x04, 0x02, 0x00, 0x05, 0x59, 0xa8, 0x08, 0x13, 0x82, 0x04, 0x0d, 0x40, + 0x00, 0x00, 0x20, 0x00, 0x04, 0x01, 0xf0, 0x04, 0x59, 0xa8, 0x08, 0x11, + 0x82, 0x04, 0x0d, 0x40, 0x00, 0x00, 0x10, 0x00, 0x48, 0x07, 0x50, 0x4b, + 0x59, 0xa8, 0x08, 0x47, 0x80, 0x04, 0x09, 0xc0, 0x04, 0x02, 0x00, 0x07, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0xd0, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x10, 0x3d, 0xf2, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x4d, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x07, 0xc8, 0x56, 0x04, 0x01, 0xff, 0x44, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x76, 0x4d, 0xf0, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x66, 0x64, 0x5c, 0x03, 0xe0, 0x00, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x64, 0x63, 0x59, 0xc4, 0x00, 0xa4, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x02, 0x00, 0x0a, 0x42, 0x00, 0x60, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x42, 0x00, 0x68, 0x00, 0x00, 0x20, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0xbc, 0x42, 0x00, 0x60, 0x00, 0xff, 0xdf, 0xff, 0xff, + 0x41, 0x78, 0x68, 0x00, 0x04, 0x01, 0xf8, 0xb8, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0xc2, 0x04, 0x00, 0x00, 0x14, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0xe4, 0x04, 0x02, 0x00, 0x11, 0x4a, 0x03, 0x50, 0x2f, + 0x00, 0x00, 0xaa, 0xaa, 0x4c, 0x04, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x15, 0x59, 0x59, 0xa8, 0x00, 0x27, 0x82, 0x00, 0x05, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x80, 0x04, 0x05, 0x40, 0x48, 0x03, 0x50, 0x27, + 0x5c, 0x00, 0x08, 0x00, 0x4a, 0x03, 0x50, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0x16, 0x04, 0x01, 0xf0, 0x08, + 0x4a, 0x03, 0x50, 0x49, 0x00, 0x00, 0x00, 0x05, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x14, 0xc3, + 0x04, 0x01, 0xff, 0x22, 0x1c, 0x01, 0xf0, 0x00, 0x04, 0x01, 0xf8, 0x09, + 0x42, 0x00, 0x60, 0x00, 0xbf, 0x7f, 0x7f, 0xff, 0x41, 0x78, 0x68, 0x00, + 0x04, 0x01, 0xf0, 0x95, 0x42, 0x00, 0x60, 0x00, 0xbf, 0x7f, 0x7f, 0xff, + 0x41, 0x78, 0x68, 0x00, 0x04, 0x01, 0xf0, 0x91, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0xe4, 0x04, 0x02, 0x00, 0x09, 0x59, 0xc4, 0x00, 0x06, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0xf0, 0x48, 0x03, 0x88, 0x06, + 0x42, 0x00, 0x60, 0x00, 0xbf, 0xff, 0xff, 0xff, 0x41, 0x78, 0x68, 0x00, + 0x04, 0x01, 0xf8, 0x86, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x40, 0x68, 0x08, 0x00, 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x80, 0x04, 0x08, 0xd0, 0x59, 0xa8, 0x00, 0x14, + 0x8c, 0x00, 0x05, 0x06, 0x04, 0x00, 0x00, 0x06, 0x59, 0xa8, 0x00, 0x0f, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, 0x80, 0x04, 0x05, 0x40, + 0x04, 0x01, 0xf0, 0x03, 0x82, 0x04, 0x05, 0x40, 0x00, 0x00, 0x00, 0xf7, + 0x48, 0x03, 0x88, 0xa7, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x07, 0xc8, 0x56, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x09, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x4d, 0x3c, 0x00, 0x00, 0x4c, 0x18, 0x00, 0x00, 0x42, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x0d, 0x42, 0x02, 0x78, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x01, 0xf0, 0x38, 0x48, 0x07, 0xc8, 0x56, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x3a, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x3c, 0x00, 0x00, + 0x4c, 0x18, 0x00, 0x00, 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x42, 0x02, 0x78, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf0, 0x2a, + 0x48, 0x07, 0xc8, 0x56, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x39, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x42, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x4d, 0x3c, 0x00, 0x00, 0x4c, 0x18, 0x00, 0x00, + 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x42, 0x02, 0x78, 0x00, + 0x00, 0x00, 0x02, 0x02, 0x04, 0x01, 0xf0, 0x1c, 0x48, 0x07, 0xc8, 0x56, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x38, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x4d, 0x3c, 0x00, 0x00, 0x4c, 0x18, 0x00, 0x00, 0x42, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x42, 0x02, 0x78, 0x00, 0x00, 0x00, 0x02, 0x02, + 0x04, 0x01, 0xf0, 0x0e, 0x48, 0x07, 0xc8, 0x56, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x0c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x4d, 0x3c, 0x00, 0x00, + 0x4c, 0x18, 0x00, 0x00, 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0c, + 0x42, 0x02, 0x78, 0x00, 0x00, 0x00, 0x00, 0x02, 0x42, 0x00, 0x18, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x42, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x37, 0x64, 0x5c, 0x00, 0x30, 0x00, + 0x4d, 0x40, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa1, 0x55, + 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xca, 0x42, 0x5c, 0x02, 0x80, 0x00, 0x5c, 0x02, 0x78, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x07, 0xc8, 0x56, 0x04, 0x01, 0x10, 0x00, + 0x4a, 0x03, 0xc8, 0x40, 0x00, 0x10, 0xad, 0x19, 0x4a, 0x03, 0xc8, 0x42, + 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x04, 0x01, 0x17, 0xff, + 0x42, 0x00, 0x78, 0x00, 0x00, 0x10, 0xad, 0x19, 0x46, 0x00, 0x78, 0x00, + 0x00, 0x00, 0x00, 0x11, 0x80, 0x3c, 0x78, 0x00, 0x4a, 0x00, 0x78, 0x00, + 0x22, 0x00, 0x00, 0xef, 0x4a, 0x00, 0x78, 0x01, 0x00, 0x00, 0x00, 0xef, + 0x4a, 0x00, 0x78, 0x02, 0x01, 0x38, 0x00, 0x00, 0x4a, 0x00, 0x78, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x78, 0x04, 0xff, 0xff, 0xff, 0xff, + 0x4a, 0x00, 0x78, 0x05, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x40, 0x68, 0x60, 0x00, 0x40, 0x6c, 0x68, 0x00, 0x59, 0xc4, 0x00, 0xa3, + 0x80, 0x30, 0x05, 0x00, 0x80, 0x34, 0x05, 0x40, 0x48, 0x03, 0x88, 0xa3, + 0x1c, 0x01, 0xf0, 0x00, 0x40, 0x68, 0x60, 0x00, 0x48, 0x33, 0xc8, 0x57, + 0x59, 0xc4, 0x00, 0xa3, 0x80, 0x30, 0x05, 0x40, 0x48, 0x03, 0x88, 0xa3, + 0x80, 0x30, 0x05, 0x80, 0x48, 0x03, 0x88, 0xa3, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x04, 0x00, 0x00, 0x04, 0x4a, 0x03, 0x50, 0x48, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x02, 0x49, 0x7b, 0x50, 0x48, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x59, 0xc8, 0x00, 0x02, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x0a, 0x80, 0x00, 0x00, 0x40, + 0x04, 0x00, 0x00, 0x08, 0x4a, 0x03, 0x90, 0x05, 0x00, 0x00, 0x01, 0x40, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x00, 0x00, 0x40, + 0x04, 0x02, 0x07, 0xff, 0x04, 0x01, 0xf7, 0xf4, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x5c, 0x00, 0x00, 0x4c, 0x60, 0x00, 0x00, 0x59, 0xc4, 0xb8, 0x05, + 0x48, 0x5f, 0xc8, 0x56, 0x8c, 0x5c, 0xbd, 0x3a, 0x04, 0x02, 0x00, 0x05, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xe6, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x4a, 0x03, 0x88, 0x05, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x19, 0x46, 0x40, 0x00, 0xc0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0xc4, 0x4a, 0x03, 0x88, 0x05, + 0x04, 0x00, 0x00, 0x00, 0x5c, 0x00, 0xc0, 0x00, 0x5c, 0x00, 0xb8, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x7a, 0x6a, 0x00, + 0x4a, 0x02, 0x6c, 0x00, 0x00, 0x00, 0x07, 0x07, 0x49, 0x7a, 0x68, 0x01, + 0x49, 0x7a, 0x68, 0x08, 0x49, 0x7a, 0x68, 0x09, 0x49, 0x7a, 0x68, 0x06, + 0x49, 0x7a, 0x68, 0x07, 0x49, 0x7a, 0x6c, 0x0b, 0x49, 0x7a, 0x68, 0x0c, + 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x02, 0x00, 0x06, 0x59, 0x34, 0x08, 0x0f, + 0x59, 0x34, 0x00, 0x10, 0x80, 0x04, 0x05, 0x40, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x4a, 0x02, 0x6a, 0x04, 0x00, 0x00, 0x01, 0x00, + 0x49, 0x7a, 0x6a, 0x03, 0x59, 0x34, 0x04, 0x02, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x48, 0x02, 0x6c, 0x02, 0x49, 0x7a, 0x6c, 0x04, + 0x49, 0x7a, 0x6a, 0x05, 0x49, 0x7a, 0x6c, 0x05, 0x49, 0x7a, 0x68, 0x11, + 0x4d, 0x2c, 0x00, 0x00, 0x59, 0x34, 0x00, 0x0d, 0x49, 0x46, 0x6c, 0x03, + 0x80, 0x02, 0x5d, 0x40, 0x04, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x07, 0x3b, 0x49, 0x7a, 0x68, 0x0d, 0x5c, 0x02, 0x58, 0x00, + 0x59, 0xa8, 0x00, 0x6c, 0x8c, 0x00, 0x05, 0x02, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x04, 0x02, 0x00, 0x02, 0x59, 0x9c, 0x04, 0x01, + 0x48, 0x02, 0x6a, 0x0b, 0x59, 0x9c, 0x02, 0x08, 0x48, 0x02, 0x6c, 0x12, + 0x4a, 0x02, 0x68, 0x0a, 0x00, 0x00, 0x60, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x49, 0xc5, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x80, 0x00, 0x0d, 0x80, 0x04, 0x01, 0xf0, 0x2c, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x47, 0x44, 0x04, 0x02, 0x00, 0x17, 0x59, 0xa8, 0x00, 0x23, + 0x8c, 0x00, 0x05, 0x0a, 0x04, 0x02, 0x00, 0x10, 0x59, 0x34, 0x02, 0x12, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0xff, 0x00, 0x48, 0x03, 0xc8, 0x57, + 0x04, 0x00, 0x00, 0x0b, 0x59, 0x34, 0x0a, 0x00, 0x8c, 0x04, 0x0d, 0x1e, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xe9, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x29, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x49, 0x2f, 0xc8, 0x57, 0x04, 0x01, 0xf0, 0x17, 0x49, 0x2f, 0xc8, 0x57, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x04, 0x01, 0xf0, 0x11, + 0x8d, 0x0e, 0x1d, 0x02, 0x04, 0x02, 0x00, 0x03, 0x8d, 0x0e, 0x1d, 0x00, + 0x04, 0x00, 0x00, 0x04, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x01, 0xf0, 0x0a, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, + 0x59, 0x34, 0x0a, 0x00, 0x8c, 0x04, 0x0d, 0x1e, 0x04, 0x00, 0x00, 0x05, + 0x49, 0x2f, 0xc8, 0x57, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x04, 0x01, 0xf0, 0x03, 0x49, 0x2f, 0xc8, 0x57, 0x80, 0x00, 0x0d, 0x80, + 0x48, 0x03, 0xc8, 0x57, 0x80, 0x02, 0x85, 0x40, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x0f, 0xc8, 0x57, 0x8d, 0x0e, 0x1d, 0x00, 0x04, 0x02, 0x07, 0xed, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x19, 0x04, 0x02, 0x07, 0xe6, + 0x59, 0x34, 0x02, 0x00, 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x00, 0x07, 0xe3, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x01, 0xe9, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x45, 0x07, 0x04, 0x00, 0x07, 0xc1, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x01, 0xed, 0x59, 0x2c, 0x02, 0x06, 0x49, 0x2f, 0xc8, 0x57, + 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x07, 0xff, 0x04, 0x02, 0x00, 0x06, + 0x4a, 0x02, 0x5c, 0x0a, 0x00, 0x00, 0x00, 0x30, 0x42, 0x02, 0x68, 0x00, + 0x00, 0x10, 0xac, 0xf1, 0x04, 0x01, 0xf0, 0x21, 0x82, 0x00, 0x0c, 0x80, + 0x00, 0x00, 0x07, 0xf0, 0x04, 0x02, 0x10, 0x45, 0x81, 0xac, 0x04, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x80, 0x02, 0x6d, 0x40, 0x04, 0x00, 0x00, 0x38, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x46, 0x02, 0x04, 0x02, 0x00, 0x38, + 0x59, 0x2c, 0x04, 0x0a, 0x8c, 0x00, 0x05, 0x0a, 0x04, 0x02, 0x00, 0x14, + 0x59, 0x2e, 0x60, 0x09, 0x83, 0x30, 0x04, 0x80, 0x00, 0x10, 0xd8, 0xd4, + 0x04, 0x00, 0x10, 0x3a, 0x41, 0x58, 0x00, 0x00, 0x81, 0x30, 0x04, 0x80, + 0x04, 0x02, 0x10, 0x37, 0x59, 0x30, 0x0c, 0x06, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x09, 0x04, 0x02, 0x00, 0x36, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x7a, 0x58, 0x00, 0x59, 0x30, 0x00, 0x08, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x18, 0x49, 0x2e, 0x60, 0x08, + 0x04, 0x01, 0xf0, 0x10, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, + 0x04, 0x00, 0x00, 0x19, 0x59, 0x2c, 0x02, 0x06, 0x49, 0x36, 0x60, 0x09, + 0x49, 0x2e, 0x60, 0x08, 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x09, + 0x49, 0x7a, 0x60, 0x15, 0x49, 0x32, 0x58, 0x09, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x00, 0x07, 0xff, 0x04, 0x02, 0x00, 0x03, 0x4a, 0x02, 0x60, 0x15, + 0x00, 0x00, 0x80, 0x00, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x43, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, 0x80, 0x00, 0x05, 0x80, + 0x04, 0x01, 0xf0, 0x1f, 0x40, 0x00, 0x08, 0x00, 0x58, 0x04, 0x00, 0x00, + 0x80, 0x00, 0x0d, 0x40, 0x04, 0x02, 0x07, 0xfd, 0x49, 0x2c, 0x08, 0x00, + 0x04, 0x01, 0xf0, 0x19, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, + 0x04, 0x01, 0xf0, 0x15, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, + 0x04, 0x01, 0xf0, 0x12, 0x83, 0x0c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x00, 0x04, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x01, 0xf0, 0x0c, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, + 0x04, 0x01, 0xf0, 0x09, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x04, 0x01, 0xf0, 0x06, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x07, + 0x04, 0x02, 0x07, 0xfb, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x80, 0x00, 0x05, 0x40, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x2f, 0xc8, 0x57, + 0x59, 0x2e, 0x8c, 0x06, 0x83, 0x44, 0x0d, 0x80, 0x00, 0x00, 0x07, 0xfc, + 0x04, 0x00, 0x00, 0x04, 0x83, 0x44, 0x04, 0x80, 0x00, 0x00, 0x07, 0xf0, + 0x04, 0x02, 0x10, 0x14, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, + 0x04, 0x02, 0x00, 0x11, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x25, + 0x04, 0x02, 0x00, 0x11, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, + 0x04, 0x00, 0x00, 0x1b, 0x49, 0x36, 0x60, 0x09, 0x49, 0x2e, 0x60, 0x08, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x0a, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, + 0x80, 0x00, 0x05, 0x80, 0x04, 0x01, 0xf0, 0x10, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x28, 0x04, 0x01, 0xf0, 0x0c, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x47, 0x44, 0x04, 0x00, 0x07, 0xfb, 0x83, 0x0c, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x04, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x01, 0xf0, 0x03, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x29, 0x80, 0x00, 0x05, 0x40, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x04, 0x01, 0xf7, 0xfc, + 0x49, 0x2f, 0xc8, 0x57, 0x59, 0x2e, 0x8c, 0x06, 0x49, 0x47, 0xc8, 0x57, + 0x83, 0x44, 0x0c, 0x80, 0x00, 0x00, 0x08, 0x00, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0a, 0x04, 0x02, 0x11, 0x9c, 0x59, 0x2c, 0x42, 0x07, + 0x48, 0x23, 0xc8, 0x57, 0x82, 0x20, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x40, 0xa1, 0x00, 0x10, 0x41, 0x29, + 0x00, 0x10, 0x41, 0x79, 0x00, 0x10, 0x41, 0x84, 0x00, 0x10, 0x41, 0x8f, + 0x00, 0x10, 0x40, 0x9d, 0x00, 0x10, 0x40, 0x9d, 0x00, 0x10, 0x40, 0x9d, + 0x00, 0x10, 0x41, 0x9f, 0x00, 0x10, 0x41, 0xfd, 0x00, 0x10, 0x42, 0x22, + 0x00, 0x10, 0x40, 0x9d, 0x00, 0x10, 0x40, 0x9d, 0x00, 0x10, 0x40, 0x9d, + 0x00, 0x10, 0x40, 0x9d, 0x00, 0x10, 0x40, 0x9d, 0x48, 0x03, 0xc8, 0x57, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x04, 0x01, 0xf1, 0x83, + 0x59, 0x2c, 0x10, 0x08, 0x82, 0x08, 0x15, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x59, 0xa8, 0x00, 0x0f, 0x80, 0x08, 0x4d, 0x80, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x01, 0x7b, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x46, 0x41, 0x04, 0x00, 0x00, 0x36, 0x48, 0x03, 0xc8, 0x57, + 0x82, 0x00, 0x4d, 0x80, 0x00, 0x00, 0x00, 0x1d, 0x04, 0x02, 0x00, 0x1a, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x52, 0xd5, 0x59, 0x34, 0x04, 0x05, + 0x4c, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x19, + 0x5c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x8c, 0x20, 0x45, 0x0a, + 0x04, 0x00, 0x00, 0x28, 0x80, 0x00, 0x05, 0x80, 0x44, 0x00, 0x28, 0x00, + 0x59, 0x34, 0x00, 0x08, 0x48, 0x00, 0x28, 0x02, 0x59, 0x34, 0x00, 0x09, + 0x48, 0x00, 0x28, 0x01, 0x59, 0x34, 0x00, 0x06, 0x48, 0x00, 0x28, 0x04, + 0x59, 0x34, 0x00, 0x07, 0x48, 0x00, 0x28, 0x03, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8d, 0xa5, + 0x04, 0x01, 0xf1, 0x8c, 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x4d, 0x80, + 0x00, 0x00, 0x00, 0x1a, 0x04, 0x02, 0x00, 0x03, 0x40, 0x10, 0x10, 0x00, + 0x04, 0x01, 0xf1, 0x5c, 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x4d, 0x80, + 0x00, 0x00, 0x00, 0x1b, 0x04, 0x02, 0x00, 0x03, 0x40, 0x18, 0x10, 0x00, + 0x04, 0x01, 0xf1, 0x56, 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x4d, 0x80, + 0x00, 0x00, 0x00, 0x1c, 0x04, 0x00, 0x01, 0x57, 0x82, 0x00, 0x4d, 0x80, + 0x00, 0x00, 0x00, 0x19, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, + 0x04, 0x00, 0x01, 0x46, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, + 0x04, 0x02, 0x01, 0x5d, 0x59, 0xa8, 0x00, 0x6c, 0x8c, 0x00, 0x05, 0x02, + 0x04, 0x00, 0x00, 0x1b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x19, + 0x04, 0x00, 0x00, 0x18, 0x59, 0x34, 0x02, 0x12, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x04, 0x02, 0x00, 0x0c, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x59, 0xa8, 0x00, 0x23, 0x8c, 0x00, 0x05, 0x06, 0x04, 0x02, 0x00, 0x09, + 0x59, 0x34, 0x00, 0x02, 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x82, 0x00, 0x05, 0x80, 0x00, 0xff, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x49, 0xda, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x40, 0x18, 0x10, 0x00, 0x04, 0x02, 0x01, 0x2d, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, 0x04, 0x00, 0x01, 0x37, + 0x49, 0x36, 0x60, 0x09, 0x49, 0x2e, 0x60, 0x08, 0x4a, 0x02, 0x64, 0x06, + 0x00, 0x00, 0x00, 0x01, 0x8c, 0x20, 0x45, 0x0a, 0x04, 0x00, 0x00, 0x04, + 0x59, 0x2c, 0x04, 0x04, 0x84, 0x00, 0x05, 0x5c, 0x48, 0x02, 0x5c, 0x04, + 0x4c, 0x20, 0x00, 0x00, 0x4d, 0x3c, 0x00, 0x00, 0x42, 0x02, 0x78, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0xa0, + 0x5c, 0x02, 0x78, 0x00, 0x5c, 0x00, 0x40, 0x00, 0x8c, 0x20, 0x45, 0x12, + 0x04, 0x00, 0x00, 0x0b, 0x59, 0x9c, 0x00, 0x18, 0x8c, 0x00, 0x05, 0x18, + 0x04, 0x00, 0x00, 0x08, 0x59, 0x2c, 0x00, 0x09, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x03, 0x80, 0x59, 0x34, 0x08, 0x0a, 0x80, 0x04, 0x0d, 0x40, + 0x84, 0x04, 0x0d, 0x54, 0x48, 0x06, 0x68, 0x0a, 0x41, 0x7a, 0x78, 0x00, + 0x04, 0x01, 0xf9, 0x3e, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x01, 0xf9, 0x4a, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, 0x80, 0x00, 0x05, 0x80, + 0x04, 0x01, 0xf1, 0x30, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, + 0x04, 0x02, 0x01, 0x12, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x1f, + 0x04, 0x00, 0x00, 0x0c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x19, + 0x04, 0x02, 0x01, 0x12, 0x4c, 0x60, 0x00, 0x00, 0x41, 0x78, 0xc0, 0x00, + 0x42, 0x02, 0x78, 0x00, 0x00, 0x00, 0x18, 0x00, 0x41, 0x7a, 0x60, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1c, 0x5e, 0x5c, 0x00, 0xc0, 0x00, + 0x59, 0xa8, 0x00, 0x6c, 0x8c, 0x00, 0x05, 0x02, 0x04, 0x00, 0x00, 0x1b, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x19, 0x04, 0x00, 0x00, 0x18, + 0x59, 0x34, 0x02, 0x12, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x02, 0x00, 0x0c, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x59, 0xa8, 0x00, 0x23, + 0x8c, 0x00, 0x05, 0x06, 0x04, 0x02, 0x00, 0x09, 0x59, 0x34, 0x00, 0x02, + 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0x00, 0x00, 0x82, 0x00, 0x05, 0x80, + 0x00, 0xff, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x49, 0xda, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x40, 0x18, 0x10, 0x00, 0x04, 0x02, 0x00, 0xd4, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0x99, 0x04, 0x00, 0x00, 0xde, 0x59, 0x34, 0x08, 0x0a, + 0x8c, 0x20, 0x45, 0x12, 0x04, 0x00, 0x00, 0x0c, 0x59, 0x9c, 0x00, 0x18, + 0x8c, 0x00, 0x05, 0x18, 0x04, 0x00, 0x00, 0x09, 0x59, 0x2c, 0x00, 0x09, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x80, 0x82, 0x04, 0x15, 0x00, + 0xff, 0xff, 0xfc, 0x7f, 0x80, 0x08, 0x0d, 0x40, 0x84, 0x04, 0x0d, 0x54, + 0x04, 0x01, 0xf0, 0x02, 0x84, 0x04, 0x0d, 0x14, 0x48, 0x06, 0x68, 0x0a, + 0x49, 0x36, 0x60, 0x09, 0x49, 0x2e, 0x60, 0x08, 0x4a, 0x02, 0x64, 0x06, + 0x00, 0x00, 0x00, 0x01, 0x41, 0x7a, 0x78, 0x00, 0x04, 0x01, 0xf8, 0xee, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x05, 0x04, 0x01, 0xf8, 0xfa, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0xdf, 0x80, 0x00, 0x05, 0x80, 0x04, 0x01, 0xf0, 0xe0, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, 0x04, 0x02, 0x00, 0xc2, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x2e, 0x04, 0x02, 0x00, 0xc5, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8d, 0x5d, 0x04, 0x00, 0x00, 0xb6, + 0x80, 0x00, 0x05, 0x80, 0x04, 0x01, 0xf0, 0xd5, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0x5a, 0x04, 0x02, 0x00, 0xb7, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x47, 0x2e, 0x04, 0x02, 0x00, 0xba, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x88, 0xfa, 0x04, 0x00, 0x00, 0xab, 0x80, 0x00, 0x05, 0x80, + 0x04, 0x01, 0xf0, 0xca, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, + 0x04, 0x02, 0x00, 0xac, 0x83, 0x44, 0x4d, 0x80, 0x00, 0x00, 0x07, 0xfe, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x02, 0x00, 0x8d, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x19, 0x04, 0x02, 0x00, 0xaa, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8d, 0x75, 0x04, 0x00, 0x00, 0x9b, + 0x80, 0x00, 0x05, 0x80, 0x04, 0x01, 0xf0, 0xba, 0x82, 0x20, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x70, 0x04, 0x02, 0x00, 0x05, 0x8c, 0x20, 0x45, 0x0e, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x04, 0x02, 0x00, 0x7e, + 0x8c, 0x20, 0x45, 0x0a, 0x04, 0x00, 0x00, 0x0d, 0x4d, 0x3c, 0x00, 0x00, + 0x42, 0x02, 0x78, 0x00, 0x00, 0x00, 0x10, 0x00, 0x8c, 0x20, 0x45, 0x0e, + 0x04, 0x02, 0x00, 0x02, 0x85, 0x3e, 0x7d, 0x56, 0x82, 0x20, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xa0, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x46, 0xfc, + 0x5c, 0x02, 0x78, 0x00, 0x04, 0x01, 0xf0, 0xa1, 0x8c, 0x20, 0x45, 0x08, + 0x04, 0x02, 0x00, 0x24, 0x59, 0x2c, 0x10, 0x08, 0x82, 0x08, 0x15, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x59, 0xa8, 0x00, 0x0f, 0x80, 0x08, 0x4d, 0x80, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x66, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x46, 0x41, 0x04, 0x00, 0x00, 0x2b, + 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x4d, 0x80, 0x00, 0x00, 0x00, 0x1a, + 0x04, 0x02, 0x00, 0x03, 0x40, 0x10, 0x10, 0x00, 0x04, 0x01, 0xf0, 0x64, + 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x4d, 0x80, 0x00, 0x00, 0x00, 0x1b, + 0x04, 0x02, 0x00, 0x03, 0x40, 0x18, 0x10, 0x00, 0x04, 0x01, 0xf0, 0x5e, + 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x4d, 0x80, 0x00, 0x00, 0x00, 0x1c, + 0x04, 0x00, 0x00, 0x5f, 0x82, 0x00, 0x4d, 0x80, 0x00, 0x00, 0x00, 0x19, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x4e, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x01, 0xf0, 0x65, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, 0x04, 0x02, 0x00, 0x62, + 0x4d, 0x3c, 0x00, 0x00, 0x42, 0x02, 0x78, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x8c, 0x20, 0x45, 0x0e, 0x04, 0x02, 0x00, 0x02, 0x85, 0x3e, 0x7d, 0x56, + 0x82, 0x20, 0x05, 0x00, 0x00, 0x00, 0x00, 0x90, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x46, 0xe4, 0x5c, 0x02, 0x78, 0x00, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0a, 0x04, 0x02, 0x00, 0x3a, 0x04, 0x01, 0xf0, 0x6a, + 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x04, 0x02, 0x00, 0x06, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8d, 0x0b, 0x04, 0x00, 0x00, 0x07, 0x80, 0x00, 0x05, 0x80, + 0x04, 0x01, 0xf0, 0x64, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x5d, + 0x04, 0x00, 0x00, 0x59, 0x04, 0x01, 0xf0, 0x5c, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x47, 0x5d, 0x04, 0x00, 0x00, 0x3c, 0x04, 0x01, 0xf0, 0x58, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, 0x04, 0x02, 0x00, 0x3e, + 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x00, 0x48, + 0x8c, 0x20, 0x45, 0x08, 0x04, 0x00, 0x00, 0x0a, 0x4c, 0x60, 0x00, 0x00, + 0x41, 0x78, 0xc0, 0x00, 0x42, 0x02, 0x78, 0x00, 0x00, 0x00, 0x18, 0x00, + 0x41, 0x7a, 0x60, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1c, 0x5e, + 0x5c, 0x00, 0xc0, 0x00, 0x04, 0x01, 0xf0, 0x47, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x47, 0x1f, 0x04, 0x00, 0x00, 0x0c, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x47, 0x19, 0x04, 0x02, 0x00, 0x30, 0x4c, 0x60, 0x00, 0x00, + 0x41, 0x78, 0xc0, 0x00, 0x42, 0x02, 0x78, 0x00, 0x00, 0x00, 0x18, 0x00, + 0x41, 0x7a, 0x60, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1c, 0x5e, + 0x5c, 0x00, 0xc0, 0x00, 0x48, 0x0b, 0xc8, 0x56, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8b, 0x70, 0x04, 0x00, 0x00, 0x18, 0x80, 0x00, 0x05, 0x80, + 0x04, 0x01, 0xf0, 0x37, 0x04, 0x01, 0xf7, 0xdb, 0x48, 0x0b, 0xc8, 0x57, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x19, 0x40, 0x00, 0x10, 0x00, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf0, 0x0a, + 0x48, 0x0b, 0xc8, 0x57, 0x40, 0x00, 0x08, 0x00, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf0, 0x05, 0x48, 0x0b, 0xc8, 0x57, + 0x40, 0x00, 0x08, 0x00, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x48, 0x0b, 0xc8, 0x57, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x31, + 0x04, 0x01, 0xf0, 0x20, 0x48, 0x0b, 0xc8, 0x57, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf7, 0xf7, 0x48, 0x0b, 0xc8, 0x57, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x0a, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf7, 0xf1, 0x48, 0x0b, 0xc8, 0x57, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x40, 0x00, 0x10, 0x00, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf7, 0xea, 0x48, 0x0b, 0xc8, 0x57, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x07, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf7, 0xe4, 0x48, 0x0b, 0xc8, 0x57, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf7, 0xe0, + 0x80, 0x02, 0x85, 0x80, 0x41, 0x78, 0xb0, 0x00, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x37, 0xc8, 0x57, 0x59, 0x32, 0x68, 0x09, 0x59, 0x34, 0x12, 0x00, + 0x81, 0x3e, 0x79, 0xc0, 0x04, 0x00, 0x00, 0x03, 0x84, 0x08, 0x15, 0x40, + 0x04, 0x01, 0xf0, 0x02, 0x84, 0x08, 0x15, 0x00, 0x48, 0x0a, 0x6a, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x40, 0x68, 0x08, 0x00, + 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x32, 0x68, 0x09, 0x5c, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x48, 0x03, 0xc8, 0x57, 0x49, 0x37, 0xc8, 0x57, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x06, 0x04, 0x02, 0x00, 0x04, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x06, 0x04, 0x01, 0xf0, 0x21, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x02, 0x00, 0x04, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x04, 0x04, 0x01, 0xf0, 0x1b, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x07, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, + 0x04, 0x00, 0x00, 0x16, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0x04, 0x00, 0x00, 0x11, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x05, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x05, 0x04, 0x00, 0x00, 0x0c, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x09, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, + 0x04, 0x00, 0x00, 0x07, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0b, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0b, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x48, 0x03, 0xc8, 0x57, 0x48, 0x02, 0x6c, 0x00, + 0x82, 0x04, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x06, 0x04, 0x02, 0x00, 0x05, + 0x59, 0x34, 0x14, 0x04, 0x80, 0x08, 0x11, 0xc0, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x40, 0x68, 0x30, 0x00, 0x04, 0x01, 0xf8, 0x0e, 0x41, 0x35, 0x88, 0x00, + 0x04, 0x00, 0x00, 0x02, 0x41, 0x79, 0x88, 0x00, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x40, 0x68, 0x30, 0x00, + 0x04, 0x01, 0xf8, 0x0b, 0x41, 0x35, 0x88, 0x00, 0x04, 0x00, 0x00, 0x02, + 0x41, 0x79, 0x88, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x48, 0x03, 0xc8, 0x57, + 0x49, 0x47, 0xc8, 0x57, 0x48, 0x1b, 0xc8, 0x57, 0x83, 0x44, 0x04, 0x80, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x02, 0x10, 0x34, 0x83, 0x44, 0x14, 0x00, + 0x00, 0x10, 0xa4, 0x00, 0x50, 0x08, 0x00, 0x00, 0x80, 0x02, 0x6d, 0x40, + 0x04, 0x02, 0x00, 0x11, 0x4c, 0x18, 0x00, 0x00, 0x4d, 0x2c, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x04, 0x41, 0x2e, 0x68, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x5c, 0x00, 0x30, 0x00, 0x04, 0x00, 0x00, 0x27, + 0x45, 0x34, 0x10, 0x00, 0x49, 0x7a, 0x68, 0x0d, 0x49, 0x7a, 0x68, 0x10, + 0x49, 0x7a, 0x68, 0x0f, 0x49, 0x7a, 0x68, 0x0e, 0x4c, 0x18, 0x00, 0x00, + 0x04, 0x01, 0xfc, 0xb4, 0x5c, 0x00, 0x30, 0x00, 0x59, 0x34, 0x0a, 0x12, + 0x4c, 0x04, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, + 0x5c, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x09, 0x82, 0x18, 0x05, 0x00, + 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x08, 0x59, 0xa8, 0x10, 0x0f, + 0x82, 0x08, 0x15, 0x00, 0x00, 0xff, 0xff, 0x00, 0x80, 0x08, 0x05, 0x80, + 0x04, 0x00, 0x00, 0x03, 0x80, 0x00, 0x05, 0x80, 0x04, 0x01, 0xf0, 0x04, + 0x82, 0x18, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xd0, + 0x80, 0x04, 0x0d, 0x80, 0x04, 0x00, 0x00, 0x03, 0x48, 0x03, 0xc8, 0x57, + 0x48, 0x02, 0x6a, 0x12, 0x59, 0x34, 0x00, 0x02, 0x80, 0x18, 0x05, 0x80, + 0x04, 0x00, 0x00, 0x03, 0x48, 0x1b, 0xc8, 0x57, 0x48, 0x1a, 0x68, 0x02, + 0x80, 0x00, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf7, 0xfc, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x08, 0x42, 0x01, 0x88, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x02, 0x00, 0x03, 0x42, 0x01, 0x88, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x47, 0xc8, 0x57, 0x83, 0x44, 0x04, 0x80, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x02, 0x10, 0x11, 0x83, 0x44, 0x14, 0x00, 0x00, 0x10, 0xa4, 0x00, + 0x50, 0x08, 0x00, 0x00, 0x80, 0x02, 0x6d, 0x40, 0x04, 0x00, 0x00, 0x0b, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x19, 0x04, 0x02, 0x00, 0x09, + 0x8d, 0x0e, 0x1d, 0x02, 0x04, 0x00, 0x00, 0x04, 0x59, 0x34, 0x02, 0x00, + 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x00, 0x00, 0x04, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, 0x80, 0x00, 0x05, 0x80, + 0x04, 0x01, 0xf7, 0xfe, 0x5c, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x48, 0x03, 0xc8, 0x57, 0x49, 0x47, 0xc8, 0x57, 0x4d, 0x2c, 0x00, 0x00, + 0x4d, 0x30, 0x00, 0x00, 0x83, 0x44, 0x04, 0x80, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x02, 0x10, 0x24, 0x83, 0x44, 0x14, 0x00, 0x00, 0x10, 0xa4, 0x00, + 0x50, 0x08, 0x00, 0x00, 0x80, 0x02, 0x6d, 0x40, 0x04, 0x00, 0x00, 0x1b, + 0x45, 0x78, 0x10, 0x00, 0x59, 0x34, 0x00, 0x0d, 0x80, 0x02, 0x5d, 0x40, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x07, 0x3b, 0x59, 0x36, 0x60, 0x11, + 0x81, 0x32, 0x61, 0xc0, 0x04, 0x00, 0x00, 0x0e, 0x4c, 0x64, 0x00, 0x00, + 0x59, 0x30, 0xc8, 0x00, 0x59, 0x32, 0x58, 0x08, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x88, 0x3d, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x07, 0x3b, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x82, 0x66, 0x65, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x07, 0xf6, 0x5c, 0x00, 0xc8, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x49, 0xc5, 0x41, 0x36, 0x58, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x2f, 0x80, 0x00, 0x05, 0x80, + 0x5c, 0x02, 0x60, 0x00, 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf7, 0xfb, + 0x4c, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, + 0x41, 0x35, 0x88, 0x00, 0x04, 0x00, 0x00, 0x02, 0x41, 0x79, 0x88, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x58, 0x00, 0x00, + 0x59, 0xcc, 0x00, 0x01, 0x49, 0x37, 0xc8, 0x57, 0x82, 0x00, 0x05, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x48, 0x02, 0x68, 0x02, 0x49, 0x7a, 0x6c, 0x01, + 0x49, 0x7a, 0x6a, 0x01, 0x59, 0x34, 0x02, 0x00, 0x84, 0x00, 0x05, 0x02, + 0x48, 0x02, 0x6a, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, + 0x04, 0x02, 0x00, 0x17, 0x59, 0x34, 0x04, 0x03, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x07, 0xfe, 0x04, 0x00, 0x00, 0x05, 0x59, 0xa8, 0x00, 0x23, + 0x8c, 0x00, 0x05, 0x0a, 0x04, 0x02, 0x00, 0x10, 0x04, 0x01, 0xf0, 0x08, + 0x59, 0xcc, 0x04, 0x08, 0x8c, 0x00, 0x05, 0x18, 0x04, 0x00, 0x00, 0x0c, + 0x59, 0xcc, 0x00, 0x09, 0x48, 0x03, 0x50, 0x32, 0x59, 0xcc, 0x00, 0x0a, + 0x48, 0x03, 0x50, 0x33, 0x59, 0xcc, 0x02, 0x07, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x02, 0x00, 0x03, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x48, 0x03, 0x88, 0x93, 0x48, 0x03, 0x50, 0x1d, 0x59, 0xcc, 0x0a, 0x09, + 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x10, 0x59, 0xcc, 0x04, 0x08, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x02, + 0x84, 0x04, 0x0d, 0x40, 0x59, 0x34, 0x00, 0x0a, 0x82, 0x00, 0x05, 0x00, + 0xff, 0xff, 0xff, 0xee, 0x80, 0x04, 0x05, 0x40, 0x48, 0x02, 0x68, 0x0a, + 0x83, 0xcc, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x83, 0x34, 0xac, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, 0x83, 0xcc, 0xa4, 0x00, + 0x00, 0x00, 0x00, 0x0d, 0x83, 0x34, 0xac, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x30, 0x59, 0xcc, 0x0a, 0x18, 0x82, 0x04, 0x04, 0x80, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x02, 0x10, 0x0c, 0x82, 0x04, 0x04, 0x80, + 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x10, 0x04, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x04, 0x01, 0xf0, 0x06, 0x82, 0x04, 0x04, 0x80, + 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x10, 0x03, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0xad, 0x10, + 0x58, 0x08, 0x02, 0x01, 0x80, 0x04, 0x14, 0x80, 0x04, 0x00, 0x10, 0x02, + 0x40, 0x00, 0x08, 0x00, 0x48, 0x06, 0x6a, 0x04, 0x59, 0x34, 0x04, 0x03, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x07, 0xfe, 0x04, 0x02, 0x00, 0x03, + 0x59, 0xcc, 0x0a, 0x08, 0x48, 0x06, 0x6a, 0x04, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x49, 0xfd, 0x5c, 0x00, 0xb0, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0xa8, 0x00, 0x23, 0x49, 0x37, 0xc8, 0x57, 0x8c, 0x00, 0x05, 0x08, + 0x04, 0x00, 0x00, 0x04, 0x84, 0x00, 0x05, 0x56, 0x48, 0x03, 0xc8, 0x57, + 0x48, 0x03, 0x50, 0x23, 0x59, 0xcc, 0x02, 0x07, 0x48, 0x03, 0xc8, 0x57, + 0x48, 0x02, 0x6a, 0x05, 0x59, 0xcc, 0x02, 0x0a, 0x48, 0x03, 0xc8, 0x57, + 0x48, 0x02, 0x6c, 0x05, 0x59, 0x34, 0x12, 0x00, 0x59, 0x9c, 0x08, 0x18, + 0x59, 0x34, 0x18, 0x0a, 0x48, 0x07, 0xc8, 0x57, 0x48, 0x0b, 0xc8, 0x57, + 0x48, 0x0f, 0xc8, 0x57, 0x59, 0xcc, 0x20, 0x06, 0x82, 0x10, 0x25, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x82, 0x10, 0x25, 0x80, 0x02, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x07, 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x00, 0x00, 0x09, + 0x8c, 0x0c, 0x1d, 0x14, 0x04, 0x00, 0x00, 0x03, 0x8c, 0x0c, 0x1d, 0x0e, + 0x04, 0x00, 0x00, 0x05, 0x8c, 0x04, 0x0d, 0x18, 0x04, 0x00, 0x00, 0x03, + 0x84, 0x08, 0x15, 0x4a, 0x04, 0x01, 0xf0, 0x02, 0x84, 0x08, 0x15, 0x0a, + 0x8c, 0x00, 0x05, 0x10, 0x04, 0x00, 0x00, 0x09, 0x8c, 0x0c, 0x1d, 0x14, + 0x04, 0x00, 0x00, 0x03, 0x8c, 0x0c, 0x1d, 0x10, 0x04, 0x00, 0x00, 0x05, + 0x8c, 0x04, 0x0d, 0x18, 0x04, 0x00, 0x00, 0x03, 0x84, 0x08, 0x15, 0x4e, + 0x04, 0x01, 0xf0, 0x02, 0x84, 0x08, 0x15, 0x0e, 0x8c, 0x00, 0x05, 0x12, + 0x04, 0x00, 0x00, 0x09, 0x8c, 0x0c, 0x1d, 0x14, 0x04, 0x00, 0x00, 0x03, + 0x8c, 0x0c, 0x1d, 0x12, 0x04, 0x00, 0x00, 0x05, 0x8c, 0x04, 0x0d, 0x18, + 0x04, 0x00, 0x00, 0x03, 0x84, 0x08, 0x15, 0x5c, 0x04, 0x01, 0xf0, 0x02, + 0x84, 0x08, 0x15, 0x1c, 0x48, 0x0a, 0x6a, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x4c, 0x5c, 0x00, 0x00, 0x4d, 0x2c, 0x00, 0x00, + 0x4c, 0x58, 0x00, 0x00, 0x59, 0x34, 0x00, 0x0d, 0x80, 0x02, 0x5d, 0x40, + 0x04, 0x00, 0x00, 0x29, 0x59, 0x2c, 0x00, 0x03, 0x82, 0x00, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x0b, 0x41, 0x2c, 0xb8, 0x00, + 0x59, 0x2c, 0x00, 0x01, 0x80, 0x02, 0x5d, 0x40, 0x04, 0x02, 0x07, 0xf9, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x1a, 0x04, 0x00, 0x00, 0x37, + 0x49, 0x2f, 0xc8, 0x57, 0x49, 0x2c, 0xb8, 0x01, 0x04, 0x01, 0xf0, 0x20, + 0x83, 0x2c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x04, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x50, 0x04, 0x00, 0x00, 0x82, 0x00, 0x05, 0x80, + 0xff, 0xff, 0xff, 0xff, 0x04, 0x02, 0x00, 0x06, 0x80, 0x04, 0x10, 0x00, + 0x50, 0x08, 0x00, 0x00, 0x82, 0x00, 0x05, 0x80, 0xff, 0xff, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x07, 0x82, 0x04, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xf4, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x45, 0x48, 0x08, 0x00, 0x45, 0x4c, 0x10, 0x00, + 0x59, 0x2c, 0x18, 0x03, 0x80, 0x0c, 0x18, 0x00, 0x48, 0x0e, 0x58, 0x03, + 0x48, 0x0f, 0xc8, 0x57, 0x04, 0x01, 0xf0, 0x14, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x07, 0x1a, 0x04, 0x00, 0x00, 0x17, 0x49, 0x2f, 0xc8, 0x57, + 0x49, 0x2e, 0x68, 0x0d, 0x49, 0x7a, 0x58, 0x02, 0x4a, 0x02, 0x58, 0x03, + 0x00, 0x00, 0x00, 0x01, 0x49, 0x4a, 0x58, 0x04, 0x49, 0x4e, 0x58, 0x05, + 0x83, 0x2c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x06, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x46, 0x00, 0x08, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x04, 0x08, 0x00, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xfc, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x5c, 0x00, 0xb0, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x5c, 0x00, 0xb8, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x80, 0x00, 0x05, 0x80, 0x04, 0x01, 0xf7, 0xfb, 0x48, 0x03, 0xc8, 0x56, + 0x4d, 0x3c, 0x00, 0x00, 0x4d, 0x2c, 0x00, 0x00, 0x59, 0x34, 0x00, 0x0d, + 0x80, 0x02, 0x5d, 0x40, 0x04, 0x00, 0x00, 0x1f, 0x59, 0x2c, 0x00, 0x02, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x1f, 0x41, 0x2e, 0x78, 0x00, + 0x04, 0x01, 0xf8, 0xd0, 0x04, 0x02, 0x00, 0x1c, 0x46, 0x00, 0x08, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x46, 0x00, 0x10, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x48, 0x13, 0xc8, 0x57, 0x48, 0x0f, 0xc8, 0x57, 0x58, 0x0c, 0x00, 0x03, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x02, 0x04, 0x02, 0x10, 0x14, + 0x48, 0x0f, 0xc8, 0x57, 0x40, 0x0c, 0x00, 0x00, 0x81, 0x2c, 0x05, 0x80, + 0x04, 0x02, 0x00, 0x04, 0x58, 0x0c, 0x00, 0x01, 0x48, 0x02, 0x68, 0x0d, + 0x04, 0x01, 0xf0, 0x03, 0x58, 0x0c, 0x00, 0x01, 0x48, 0x00, 0x20, 0x01, + 0x40, 0x0e, 0x58, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x2e, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x5c, 0x02, 0x58, 0x00, + 0x5c, 0x02, 0x78, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x80, 0x00, 0x05, 0x80, + 0x04, 0x01, 0xf7, 0xfc, 0x80, 0x00, 0x00, 0x40, 0x48, 0x00, 0x18, 0x03, + 0x48, 0x03, 0xc8, 0x57, 0x04, 0x01, 0xf7, 0xf6, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x00, 0x7b, 0x59, 0x30, 0x00, 0x07, 0x84, 0x00, 0x05, 0x4e, + 0x48, 0x02, 0x60, 0x07, 0x59, 0x2c, 0x1a, 0x04, 0x82, 0x0c, 0x1d, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x82, 0x0c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x48, + 0x04, 0x00, 0x00, 0x13, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xa3, + 0x8c, 0x00, 0x05, 0x00, 0x02, 0x02, 0x08, 0x00, 0x00, 0x02, 0x00, 0xda, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x02, 0x59, 0x2c, 0x1a, 0x04, + 0x82, 0x0c, 0x1d, 0x00, 0x00, 0x00, 0x00, 0xff, 0x82, 0x0c, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0xa3, + 0x82, 0x0c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x48, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x02, 0x02, 0xa3, 0x42, 0x00, 0x08, 0x00, 0x80, 0x00, 0x08, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0x2f, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x02, 0xac, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x08, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x00, 0x29, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x2a, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x28, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x43, 0xc8, 0x57, 0x4d, 0x44, 0x00, 0x00, 0x4d, 0x34, 0x00, 0x00, + 0x4d, 0x2c, 0x00, 0x00, 0x4c, 0x58, 0x00, 0x00, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x07, 0xf0, 0x41, 0x7a, 0x88, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0x5a, 0x04, 0x02, 0x00, 0x07, 0x8d, 0x3e, 0x7d, 0x06, + 0x04, 0x00, 0x00, 0x04, 0x59, 0x34, 0x02, 0x00, 0x8c, 0x00, 0x05, 0x0e, + 0x04, 0x02, 0x00, 0x02, 0x04, 0x01, 0xf8, 0x17, 0x81, 0x46, 0x88, 0x00, + 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xf5, 0x83, 0x44, 0x04, 0x80, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x02, 0x10, 0x08, 0x8d, 0x3e, 0x7d, 0x02, + 0x04, 0x00, 0x00, 0x06, 0x42, 0x02, 0x88, 0x00, 0x00, 0x00, 0x07, 0xf0, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x01, 0xf7, 0xeb, + 0x5c, 0x00, 0xb0, 0x00, 0x5c, 0x02, 0x58, 0x00, 0x5c, 0x02, 0x68, 0x00, + 0x5c, 0x02, 0x88, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4d, 0x2c, 0x00, 0x00, 0x41, 0x78, 0x30, 0x00, 0x59, 0x36, 0x58, 0x0f, + 0x81, 0x2e, 0x59, 0xc0, 0x04, 0x00, 0x00, 0x29, 0x59, 0x2c, 0x02, 0x04, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x12, 0x04, 0x00, 0x00, 0x20, 0x8d, 0x3e, 0x7d, 0x00, + 0x04, 0x00, 0x00, 0x03, 0x04, 0x01, 0xf8, 0x3c, 0x04, 0x02, 0x00, 0x1c, + 0x59, 0x2c, 0x20, 0x00, 0x49, 0x7a, 0x58, 0x00, 0x80, 0x18, 0x31, 0xc0, + 0x04, 0x02, 0x00, 0x09, 0x59, 0x34, 0x00, 0x10, 0x81, 0x2c, 0x05, 0x80, + 0x04, 0x02, 0x00, 0x04, 0x49, 0x7a, 0x68, 0x0f, 0x49, 0x7a, 0x68, 0x10, + 0x04, 0x01, 0xf0, 0x08, 0x48, 0x12, 0x68, 0x0f, 0x04, 0x01, 0xf0, 0x06, + 0x48, 0x10, 0x30, 0x00, 0x59, 0x34, 0x00, 0x10, 0x81, 0x2c, 0x05, 0x80, + 0x04, 0x02, 0x00, 0x02, 0x48, 0x1a, 0x68, 0x10, 0x4a, 0x02, 0x5a, 0x04, + 0x00, 0x00, 0x01, 0x03, 0x49, 0x42, 0x5a, 0x06, 0x49, 0x7a, 0x58, 0x09, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x89, 0xe5, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x40, 0x12, 0x58, 0x00, 0x04, 0x01, 0xf7, 0xda, + 0x41, 0x2c, 0x30, 0x00, 0x59, 0x2e, 0x58, 0x00, 0x04, 0x01, 0xf7, 0xd7, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x41, 0x78, 0x18, 0x00, 0x59, 0x34, 0x00, 0x0f, 0x80, 0x02, 0x5d, 0x40, + 0x04, 0x00, 0x00, 0x10, 0x59, 0x2c, 0x00, 0x05, 0x80, 0x20, 0x05, 0x80, + 0x59, 0x2c, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x41, 0x2c, 0x18, 0x00, + 0x04, 0x01, 0xf7, 0xf9, 0x49, 0x7a, 0x58, 0x00, 0x80, 0x0c, 0x19, 0xc0, + 0x04, 0x00, 0x00, 0x08, 0x48, 0x00, 0x18, 0x00, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x02, 0x00, 0x04, 0x48, 0x0e, 0x68, 0x10, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x02, 0x68, 0x0f, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x07, 0xfd, 0x49, 0x7a, 0x68, 0x10, + 0x04, 0x01, 0xf7, 0xf9, 0x59, 0x2c, 0x00, 0x08, 0x81, 0x48, 0x05, 0x80, + 0x04, 0x02, 0x00, 0x03, 0x59, 0x2c, 0x00, 0x09, 0x81, 0x4c, 0x05, 0x80, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x4c, 0x58, 0x00, 0x00, + 0x41, 0x3c, 0x18, 0x00, 0x40, 0x0c, 0x20, 0x00, 0x59, 0x3c, 0x00, 0x02, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x18, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x82, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x50, 0x04, 0x00, 0x00, 0x81, 0x48, 0x05, 0x80, 0x04, 0x02, 0x00, 0x05, + 0x80, 0x04, 0x10, 0x00, 0x50, 0x08, 0x00, 0x00, 0x81, 0x4c, 0x05, 0x80, + 0x04, 0x00, 0x00, 0x0d, 0x82, 0x04, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xf6, 0x40, 0x0c, 0x20, 0x00, + 0x58, 0x0c, 0x00, 0x01, 0x80, 0x00, 0x1d, 0x40, 0x04, 0x02, 0x07, 0xee, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x5c, 0x00, 0xb0, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x80, 0x00, 0x05, 0x80, 0x04, 0x01, 0xf7, 0xfd, + 0x49, 0x37, 0xc8, 0x57, 0x4c, 0x58, 0x00, 0x00, 0x4d, 0x2c, 0x00, 0x00, + 0x59, 0x34, 0x00, 0x0d, 0x80, 0x02, 0x5d, 0x40, 0x04, 0x02, 0x00, 0x16, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x1a, 0x04, 0x00, 0x00, 0x10, + 0x49, 0x2e, 0x68, 0x0d, 0x4a, 0x02, 0x58, 0x02, 0x00, 0x00, 0x00, 0x01, + 0x49, 0x7a, 0x58, 0x03, 0x83, 0x2c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x46, 0x00, 0x08, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x04, 0x08, 0x00, 0x80, 0x58, 0xb0, 0x40, + 0x04, 0x02, 0x07, 0xfc, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x5c, 0x02, 0x58, 0x00, 0x5c, 0x00, 0xb0, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4d, 0x2c, 0x00, 0x00, 0x59, 0x2e, 0x58, 0x01, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x07, 0x3b, 0x5c, 0x02, 0x58, 0x00, 0x49, 0x7a, 0x58, 0x01, + 0x04, 0x01, 0xf7, 0xe9, 0x4d, 0x2c, 0x00, 0x00, 0x59, 0x36, 0x58, 0x0d, + 0x81, 0x2e, 0x59, 0xc0, 0x04, 0x00, 0x00, 0x07, 0x49, 0x37, 0xc8, 0x57, + 0x49, 0x7a, 0x68, 0x0d, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x3b, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x5c, 0x02, 0x58, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x34, 0x04, 0x05, 0x49, 0x37, 0xc8, 0x57, + 0x48, 0x03, 0xc8, 0x57, 0x8c, 0x00, 0x05, 0x08, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, + 0x04, 0x00, 0x00, 0x11, 0x59, 0xa8, 0x08, 0x14, 0x8c, 0x04, 0x0d, 0x04, + 0x04, 0x02, 0x00, 0x0e, 0x59, 0xa8, 0x08, 0x23, 0x8c, 0x04, 0x0d, 0x06, + 0x04, 0x00, 0x00, 0x0b, 0x83, 0xac, 0x04, 0x00, 0x00, 0x00, 0x07, 0xfe, + 0x50, 0x00, 0x00, 0x00, 0x80, 0x02, 0x6d, 0x40, 0x04, 0x00, 0x00, 0x06, + 0x04, 0x01, 0xf9, 0xbc, 0x04, 0x02, 0x00, 0x04, 0x59, 0x34, 0x02, 0x00, + 0x84, 0x00, 0x05, 0x5a, 0x48, 0x02, 0x6a, 0x00, 0x8d, 0x0e, 0x1d, 0x20, + 0x04, 0x00, 0x00, 0x15, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x07, 0xf0, + 0x41, 0x7a, 0x88, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, + 0x04, 0x02, 0x00, 0x0c, 0x04, 0x01, 0xf9, 0xaf, 0x04, 0x02, 0x00, 0x0a, + 0x59, 0xa8, 0x00, 0x0f, 0x59, 0x34, 0x08, 0x02, 0x80, 0x04, 0x05, 0x80, + 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x02, 0x00, 0x04, + 0x59, 0x34, 0x02, 0x00, 0x84, 0x00, 0x05, 0x5a, 0x48, 0x02, 0x6a, 0x00, + 0x81, 0x46, 0x88, 0x00, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xf0, + 0x04, 0x01, 0xf8, 0x90, 0x04, 0x00, 0x00, 0x03, 0x59, 0xa8, 0x08, 0x33, + 0x04, 0x01, 0xf0, 0x05, 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x00, 0x00, 0x07, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0xd0, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x10, 0x45, 0x91, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x4d, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x4d, 0x30, 0x00, 0x00, + 0x4d, 0x34, 0x00, 0x00, 0x4d, 0x44, 0x00, 0x00, 0x4d, 0x3c, 0x00, 0x00, + 0x4c, 0x58, 0x00, 0x00, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x45, 0x91, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5b, 0x6f, 0x59, 0xa8, 0x08, 0x23, + 0x8c, 0x04, 0x0d, 0x06, 0x04, 0x00, 0x00, 0x14, 0x04, 0x01, 0xf8, 0x76, + 0x04, 0x00, 0x00, 0x12, 0x83, 0xae, 0x6c, 0x00, 0x00, 0x00, 0x07, 0xfe, + 0x51, 0x36, 0x68, 0x00, 0x59, 0x34, 0x02, 0x00, 0x84, 0x00, 0x05, 0x1a, + 0x48, 0x02, 0x6a, 0x00, 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x00, 0x00, 0x07, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0xd0, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x10, 0x45, 0x91, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x4d, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1a, 0xdd, 0x04, 0x01, 0xf0, 0x2b, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x80, 0x02, 0x8d, 0x80, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, 0x04, 0x02, 0x00, 0x22, + 0x59, 0x34, 0x02, 0x00, 0x8c, 0x00, 0x05, 0x1a, 0x04, 0x00, 0x00, 0x1f, + 0x59, 0x36, 0x8c, 0x03, 0x41, 0x7a, 0x78, 0x00, 0x42, 0x02, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x29, 0x41, 0x78, 0x30, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x9c, 0x1c, 0x59, 0x34, 0x02, 0x00, 0x84, 0x00, 0x05, 0x58, + 0x84, 0x00, 0x05, 0x1a, 0x48, 0x02, 0x6a, 0x00, 0x49, 0x37, 0xc8, 0x57, + 0x4a, 0x02, 0x6c, 0x00, 0x00, 0x00, 0x07, 0x07, 0x42, 0x02, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x29, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x76, + 0x4d, 0xf0, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xce, 0xf7, + 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xcf, 0x9c, + 0x41, 0x7a, 0x60, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xd2, 0x8a, + 0x5c, 0x03, 0xe0, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x64, 0x63, + 0x81, 0x46, 0x88, 0x00, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xda, + 0x5c, 0x00, 0xb0, 0x00, 0x5c, 0x02, 0x78, 0x00, 0x5c, 0x02, 0x88, 0x00, + 0x5c, 0x02, 0x68, 0x00, 0x5c, 0x02, 0x60, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x59, 0x30, 0x38, 0x09, 0x58, 0x1c, 0x02, 0x00, + 0x84, 0x00, 0x05, 0x1a, 0x48, 0x00, 0x3a, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x02, 0x68, 0x00, 0x00, 0x10, 0xac, 0xf1, 0x49, 0x7a, 0x68, 0x0e, + 0x42, 0x02, 0x88, 0x00, 0x00, 0x00, 0x07, 0xff, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x3f, 0x80, 0x49, 0x37, 0xc8, 0x57, 0x4a, 0x02, 0x6c, 0x00, + 0x00, 0x00, 0x06, 0x06, 0x4a, 0x02, 0x68, 0x02, 0x00, 0xff, 0xff, 0xff, + 0x4a, 0x02, 0x6a, 0x04, 0x00, 0x00, 0x02, 0x00, 0x4a, 0x02, 0x6c, 0x04, + 0x00, 0x00, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x30, 0x00, 0x09, + 0x50, 0x00, 0x00, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x48, 0x03, 0xc8, 0x57, + 0x8c, 0x00, 0x05, 0x0e, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x30, 0x00, 0x09, + 0x50, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x05, 0x0a, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x56, 0x04, 0x01, 0xf9, 0x22, 0x04, 0x00, 0x00, 0x06, + 0x59, 0x34, 0x04, 0x00, 0x82, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x82, 0x04, 0x15, 0x80, 0x00, 0x00, 0x00, 0x05, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x08, 0x42, 0x01, 0x88, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x02, 0x00, 0x03, 0x42, 0x01, 0x88, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4d, 0x34, 0x00, 0x00, 0x83, 0xac, 0x04, 0x00, 0x00, 0x00, 0x07, 0xfe, + 0x50, 0x00, 0x00, 0x00, 0x80, 0x02, 0x6d, 0x40, 0x04, 0x00, 0x00, 0x03, + 0x59, 0x34, 0x02, 0x00, 0x8c, 0x00, 0x05, 0x1a, 0x5c, 0x02, 0x68, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x37, 0xc8, 0x57, 0x49, 0x3f, 0xc8, 0x57, + 0x59, 0x34, 0x04, 0x03, 0x81, 0xac, 0x04, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x81, 0x34, 0x05, 0x80, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x59, 0x34, 0x12, 0x00, 0x81, 0x3e, 0x79, 0xc0, 0x04, 0x00, 0x00, 0x03, + 0x84, 0x08, 0x15, 0x5e, 0x04, 0x01, 0xf0, 0x02, 0x84, 0x08, 0x15, 0x1e, + 0x48, 0x0a, 0x6a, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x37, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1c, 0xd8, 0x04, 0x00, 0x00, 0x06, + 0x59, 0xa8, 0x08, 0x32, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x46, 0x38, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x4d, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x37, 0xc8, 0x57, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x46, 0x38, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5b, 0x6f, 0x59, 0xa8, 0x10, 0x23, + 0x84, 0x08, 0x15, 0x12, 0x48, 0x0b, 0x50, 0x23, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x38, 0x00, 0x00, 0x4c, 0x34, 0x00, 0x00, 0x4c, 0x24, 0x00, 0x00, + 0x4c, 0x60, 0x00, 0x00, 0x40, 0x08, 0xc0, 0x00, 0x83, 0x44, 0x04, 0x80, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x02, 0x10, 0x45, 0x80, 0x00, 0x2d, 0x80, + 0x41, 0x44, 0x20, 0x00, 0x83, 0x44, 0x74, 0x00, 0x00, 0x10, 0xa4, 0x00, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x83, 0x44, 0x4c, 0x80, + 0x00, 0x00, 0x07, 0xf0, 0x04, 0x00, 0x10, 0x03, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x50, 0x38, 0x00, 0x00, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x02, 0x00, 0x1e, 0x41, 0x44, 0x00, 0x00, 0x80, 0x10, 0x05, 0x80, + 0x04, 0x02, 0x00, 0x43, 0x40, 0x10, 0x28, 0x00, 0x82, 0x10, 0x4c, 0x80, + 0x00, 0x00, 0x07, 0xf0, 0x04, 0x00, 0x10, 0x15, 0x82, 0x10, 0x4d, 0x80, + 0x00, 0x00, 0x07, 0xfc, 0x04, 0x02, 0x00, 0x05, 0x82, 0x60, 0x4d, 0x80, + 0x00, 0xff, 0xff, 0xfc, 0x04, 0x02, 0x00, 0x2a, 0x04, 0x01, 0xf0, 0x0e, + 0x82, 0x10, 0x4d, 0x80, 0x00, 0x00, 0x07, 0xfd, 0x04, 0x02, 0x00, 0x05, + 0x82, 0x60, 0x4d, 0x80, 0x00, 0xff, 0xff, 0xfd, 0x04, 0x02, 0x00, 0x23, + 0x04, 0x01, 0xf0, 0x07, 0x82, 0x10, 0x4d, 0x80, 0x00, 0x00, 0x07, 0xff, + 0x04, 0x02, 0x00, 0x1f, 0x82, 0x60, 0x4d, 0x80, 0x00, 0xff, 0xff, 0xff, + 0x04, 0x02, 0x00, 0x1c, 0x84, 0x14, 0x2d, 0x5e, 0x04, 0x01, 0xf0, 0x29, + 0x40, 0x00, 0x68, 0x00, 0x58, 0x34, 0x30, 0x02, 0x82, 0x18, 0x35, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x40, 0x18, 0x00, 0x00, 0x80, 0x60, 0x05, 0x80, + 0x04, 0x02, 0x00, 0x19, 0x40, 0x10, 0x00, 0x00, 0x81, 0x44, 0x05, 0x80, + 0x04, 0x02, 0x00, 0x0a, 0x40, 0x36, 0x68, 0x00, 0x8c, 0x20, 0x45, 0x08, + 0x04, 0x00, 0x00, 0x54, 0x04, 0x01, 0xff, 0x81, 0x04, 0x02, 0x00, 0x52, + 0x49, 0x47, 0xc8, 0x57, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, + 0x04, 0x01, 0xf0, 0x4f, 0x49, 0x47, 0xc8, 0x57, 0x48, 0x0b, 0xc8, 0x57, + 0x48, 0x23, 0xc8, 0x57, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, + 0x04, 0x01, 0xf0, 0x49, 0x49, 0x47, 0xc8, 0x57, 0x48, 0x63, 0xc8, 0x57, + 0x48, 0x13, 0xc8, 0x57, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, + 0x04, 0x01, 0xf0, 0x43, 0x40, 0x10, 0x00, 0x00, 0x81, 0x44, 0x05, 0x80, + 0x04, 0x02, 0x00, 0x07, 0x58, 0x34, 0x30, 0x02, 0x49, 0x47, 0xc8, 0x57, + 0x48, 0x1b, 0xc8, 0x57, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, + 0x04, 0x01, 0xf0, 0x3a, 0x80, 0x10, 0x20, 0x00, 0x80, 0x38, 0x70, 0x00, + 0x83, 0x44, 0x4c, 0x80, 0x00, 0x00, 0x07, 0xf0, 0x04, 0x00, 0x10, 0x09, + 0x82, 0x10, 0x4d, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x02, 0x00, 0x0c, + 0x42, 0x00, 0x20, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x42, 0x00, 0x70, 0x00, + 0x00, 0x10, 0xab, 0xf0, 0x04, 0x01, 0xf0, 0x07, 0x82, 0x10, 0x4d, 0x80, + 0x00, 0x00, 0x07, 0xf0, 0x04, 0x02, 0x00, 0x04, 0x41, 0x78, 0x20, 0x00, + 0x42, 0x00, 0x70, 0x00, 0x00, 0x10, 0xa4, 0x00, 0x80, 0x58, 0xb0, 0x40, + 0x04, 0x02, 0x07, 0xa4, 0x80, 0x14, 0x29, 0xc0, 0x04, 0x02, 0x00, 0x07, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x49, 0x47, 0xc8, 0x57, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x01, 0xf0, 0x1d, + 0x4d, 0x2c, 0x00, 0x00, 0x4c, 0x18, 0x00, 0x00, 0x40, 0x60, 0x30, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0xb1, 0x49, 0x47, 0xc8, 0x57, + 0x49, 0x37, 0xc8, 0x57, 0x5c, 0x00, 0x30, 0x00, 0x5c, 0x02, 0x58, 0x00, + 0x04, 0x02, 0x07, 0xf3, 0x49, 0x7a, 0x6a, 0x12, 0x59, 0xa8, 0x00, 0x23, + 0x8c, 0x00, 0x05, 0x0a, 0x04, 0x02, 0x00, 0x0d, 0x82, 0x60, 0x05, 0x00, + 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x06, 0x59, 0xa8, 0x48, 0x0f, + 0x82, 0x24, 0x4d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x80, 0x24, 0x05, 0x80, + 0x04, 0x02, 0x00, 0x05, 0x82, 0x60, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x80, 0x00, 0x00, 0xd0, 0x48, 0x02, 0x6a, 0x12, 0x48, 0x62, 0x68, 0x02, + 0x80, 0x00, 0x05, 0x80, 0x80, 0x00, 0x05, 0x40, 0x5c, 0x00, 0xc0, 0x00, + 0x5c, 0x00, 0x48, 0x00, 0x5c, 0x00, 0x68, 0x00, 0x5c, 0x00, 0x70, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x34, 0x00, 0x0f, 0x59, 0x34, 0x14, 0x0b, + 0x80, 0x08, 0x10, 0x40, 0x04, 0x00, 0x10, 0x02, 0x48, 0x0a, 0x6c, 0x0b, + 0x80, 0x00, 0x05, 0x40, 0x02, 0x02, 0x08, 0x00, 0x00, 0x02, 0x02, 0x68, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x57, 0x49, 0x47, 0xc8, 0x57, + 0x4c, 0x30, 0x00, 0x00, 0x82, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x04, 0x00, 0x00, 0x06, 0x4c, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8c, 0x70, 0x5c, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x0b, + 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x00, 0x00, 0x06, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0x5a, 0x04, 0x02, 0x00, 0x06, 0x49, 0x37, 0xc8, 0x57, + 0x04, 0x01, 0xfc, 0x1a, 0x80, 0x00, 0x05, 0x80, 0x5c, 0x00, 0x60, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf7, 0xfc, 0x48, 0x03, 0xc8, 0x57, 0x4c, 0x58, 0x00, 0x00, + 0x4d, 0x44, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x80, 0x00, 0x0d, 0x80, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x4c, 0x04, 0x00, 0x00, + 0x40, 0x06, 0x88, 0x00, 0x4c, 0x08, 0x00, 0x00, 0x40, 0x08, 0x00, 0x00, + 0x04, 0x01, 0xff, 0xdd, 0x5c, 0x00, 0x10, 0x00, 0x5c, 0x00, 0x08, 0x00, + 0x80, 0x04, 0x08, 0x00, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xf7, + 0x5c, 0x02, 0x88, 0x00, 0x5c, 0x00, 0xb0, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x08, 0x42, 0x01, 0x88, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x03, 0x42, 0x01, 0x88, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x5c, 0x00, 0x00, 0x59, 0x34, 0x04, 0x00, 0x82, 0x00, 0xbd, 0x80, + 0x00, 0x00, 0x06, 0x06, 0x5c, 0x00, 0xb8, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x5c, 0x00, 0x00, 0x59, 0x34, 0x04, 0x00, 0x82, 0x00, 0xbd, 0x80, + 0x00, 0x00, 0x04, 0x04, 0x5c, 0x00, 0xb8, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x5c, 0x00, 0x00, 0x59, 0x34, 0x04, 0x00, 0x82, 0x00, 0xbd, 0x80, + 0x00, 0x00, 0x04, 0x04, 0x04, 0x00, 0x00, 0x03, 0x82, 0x00, 0xbd, 0x80, + 0x00, 0x00, 0x06, 0x06, 0x5c, 0x00, 0xb8, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x5c, 0x00, 0x00, 0x4c, 0x60, 0x00, 0x00, 0x59, 0x34, 0x04, 0x00, + 0x82, 0x00, 0xbd, 0x00, 0x00, 0x00, 0xff, 0x00, 0x82, 0x5c, 0xc5, 0x80, + 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x03, 0x82, 0x5c, 0xc5, 0x80, + 0x00, 0x00, 0x06, 0x00, 0x5c, 0x00, 0xc0, 0x00, 0x5c, 0x00, 0xb8, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x08, + 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x03, + 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x5c, 0x00, 0x00, 0x59, 0x34, 0x04, 0x00, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, 0x82, 0x00, 0xbd, 0x80, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x03, 0x82, 0x00, 0xbd, 0x80, + 0x00, 0x00, 0x00, 0x05, 0x5c, 0x00, 0xb8, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x48, 0x03, 0xc8, 0x57, + 0x4c, 0x5c, 0x00, 0x00, 0x59, 0x34, 0x04, 0x00, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x84, 0x00, 0xb9, 0xc0, 0x80, 0x5c, 0x05, 0x80, + 0x49, 0x37, 0xc8, 0x57, 0x48, 0x03, 0xc8, 0x57, 0x48, 0x02, 0x6c, 0x00, + 0x5c, 0x00, 0xb8, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x04, 0x00, 0x00, + 0x4c, 0x08, 0x00, 0x00, 0x59, 0x2c, 0x02, 0x07, 0x8c, 0x00, 0x05, 0x0c, + 0x04, 0x00, 0x00, 0x0f, 0x59, 0x2e, 0x8c, 0x06, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x84, 0x00, 0x05, 0x48, 0x4d, 0x3c, 0x00, 0x00, + 0x42, 0x02, 0x78, 0x00, 0x00, 0x00, 0x10, 0x00, 0x04, 0x01, 0xff, 0x7b, + 0x5c, 0x02, 0x78, 0x00, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x5c, 0x00, 0x10, 0x00, 0x5c, 0x00, 0x08, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x80, 0x00, 0x05, 0x80, 0x04, 0x01, 0xf7, 0xfc, 0x59, 0x2c, 0x04, 0x0b, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x60, 0x00, 0x04, 0x00, 0x00, 0x19, 0x83, 0x6c, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x16, 0x83, 0x6c, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x02, 0x01, 0x06, 0x59, 0xa8, 0x00, 0x23, + 0x82, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x38, 0x04, 0x02, 0x00, 0x05, + 0x59, 0xa8, 0x08, 0x2f, 0x80, 0x04, 0x09, 0xc0, 0x04, 0x00, 0x00, 0x0c, + 0x04, 0x01, 0xf0, 0xfe, 0x82, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x82, 0x04, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x00, 0xf9, + 0x82, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x28, 0x04, 0x02, 0x00, 0x03, + 0x8c, 0x00, 0x05, 0x0c, 0x04, 0x00, 0x00, 0xf4, 0x59, 0x2c, 0x10, 0x0a, + 0x82, 0x08, 0x05, 0x00, 0xff, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0xd2, + 0x59, 0xa8, 0x00, 0x0f, 0x80, 0x08, 0x05, 0x80, 0x04, 0x00, 0x00, 0xcc, + 0x59, 0x2c, 0x0c, 0x0b, 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0xe0, 0x00, + 0x82, 0x04, 0x04, 0x80, 0x00, 0x00, 0x80, 0x00, 0x04, 0x02, 0x10, 0xcc, + 0x59, 0x2e, 0x8c, 0x06, 0x83, 0x44, 0x04, 0x80, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x10, 0x07, 0x83, 0x44, 0x05, 0x80, 0x00, 0x00, 0xff, 0xff, + 0x04, 0x02, 0x00, 0xb3, 0x80, 0x04, 0x09, 0xc0, 0x04, 0x02, 0x00, 0xfe, + 0x04, 0x01, 0xf0, 0xb0, 0x80, 0x04, 0x09, 0xc0, 0x04, 0x02, 0x00, 0xfb, + 0x41, 0x78, 0x40, 0x00, 0x04, 0x01, 0xfe, 0x97, 0x04, 0x02, 0x00, 0xe2, + 0x59, 0x34, 0x22, 0x04, 0x59, 0x2c, 0x00, 0x0d, 0x80, 0x10, 0x04, 0x80, + 0x04, 0x00, 0x10, 0xbc, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x53, + 0x59, 0x2c, 0x24, 0x09, 0x82, 0x10, 0x05, 0x00, 0xff, 0xff, 0xff, 0x00, + 0x04, 0x02, 0x00, 0xaa, 0x48, 0x13, 0xc8, 0x57, 0x59, 0x2c, 0x00, 0x0c, + 0x80, 0x00, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x83, 0x82, 0x10, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0xa0, 0x82, 0x10, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x51, 0x04, 0x00, 0x00, 0x9d, 0x82, 0x10, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x16, 0x82, 0x10, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x4b, 0x82, 0x10, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x24, 0x04, 0x00, 0x00, 0x42, 0x82, 0x10, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x21, 0x04, 0x00, 0x00, 0x42, 0x82, 0x10, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x50, 0x04, 0x00, 0x00, 0x37, 0x82, 0x10, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x52, 0x04, 0x00, 0x00, 0x31, 0x82, 0x10, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x05, 0x04, 0x02, 0x00, 0x6b, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x1b, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x59, 0xa8, 0x00, 0x6c, 0x8c, 0x00, 0x05, 0x02, + 0x04, 0x00, 0x00, 0x16, 0x04, 0x01, 0xff, 0x3c, 0x04, 0x00, 0x00, 0x14, + 0x59, 0x34, 0x02, 0x12, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x02, 0x00, 0x0c, + 0x59, 0xa8, 0x00, 0x23, 0x8c, 0x00, 0x05, 0x06, 0x04, 0x02, 0x00, 0x6f, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x59, 0x34, 0x00, 0x02, + 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0x00, 0x00, 0x82, 0x00, 0x05, 0x80, + 0x00, 0xff, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x04, 0x01, 0xf9, 0xea, + 0x04, 0x02, 0x00, 0x65, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, + 0x04, 0x00, 0x00, 0x81, 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x10, + 0x49, 0x36, 0x60, 0x09, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x03, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x42, 0x6c, 0x04, 0x01, 0xf0, 0x44, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf0, 0x03, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x01, 0xff, 0x27, 0x04, 0x02, 0x00, 0x74, + 0x04, 0x01, 0xf0, 0x36, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x33, + 0x04, 0x01, 0xf0, 0x06, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x01, 0xf0, 0x03, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x01, 0xff, 0x13, 0x04, 0x02, 0x00, 0x69, 0x59, 0xa8, 0x00, 0x6c, + 0x8c, 0x00, 0x05, 0x02, 0x04, 0x00, 0x00, 0x16, 0x04, 0x01, 0xff, 0x02, + 0x04, 0x00, 0x00, 0x14, 0x59, 0x34, 0x02, 0x12, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x04, 0x02, 0x00, 0x0c, 0x59, 0xa8, 0x00, 0x23, 0x8c, 0x00, 0x05, 0x06, + 0x04, 0x02, 0x00, 0x35, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x59, 0x34, 0x00, 0x02, 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x82, 0x00, 0x05, 0x80, 0x00, 0xff, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, + 0x04, 0x01, 0xf9, 0xb0, 0x04, 0x02, 0x00, 0x2b, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0x99, 0x04, 0x00, 0x00, 0x47, 0x4a, 0x02, 0x64, 0x06, + 0x00, 0x00, 0x00, 0x10, 0x49, 0x36, 0x60, 0x09, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x00, 0x03, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, 0x04, 0x01, 0xf0, 0x0a, + 0x82, 0x10, 0x25, 0x80, 0x00, 0x00, 0x00, 0x11, 0x04, 0x02, 0x00, 0x30, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, 0x04, 0x00, 0x00, 0x34, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x10, 0x49, 0x36, 0x60, 0x09, + 0x49, 0x2e, 0x60, 0x08, 0x49, 0x32, 0x58, 0x08, 0x81, 0x36, 0x69, 0xc0, + 0x04, 0x00, 0x00, 0x07, 0x59, 0x2c, 0x0c, 0x0b, 0x8c, 0x04, 0x0d, 0x18, + 0x04, 0x00, 0x00, 0x04, 0x59, 0x34, 0x02, 0x00, 0x84, 0x00, 0x05, 0x14, + 0x48, 0x02, 0x6a, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, + 0x80, 0x00, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf7, 0xfd, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x0a, 0x04, 0x01, 0xf0, 0x18, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x04, 0x01, 0xf0, 0x15, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x16, 0x04, 0x01, 0xf0, 0x12, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x17, 0x04, 0x01, 0xf0, 0x0f, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x04, 0x01, 0xf0, 0x0c, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x1b, 0x04, 0x01, 0xf0, 0x09, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x1e, 0x04, 0x01, 0xf0, 0x06, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x24, 0x04, 0x01, 0xf0, 0x03, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x19, + 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x31, 0x04, 0x01, 0xf7, 0xdf, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x01, 0xf0, 0x03, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x41, 0x78, 0x10, 0x00, + 0x04, 0x01, 0xf7, 0xf7, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x59, 0x34, 0x14, 0x00, 0x04, 0x01, 0xf7, 0xf3, 0x42, 0x02, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x04, 0x01, 0xf0, 0x05, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x41, 0x6c, 0x10, 0x00, 0x04, 0x01, 0xf7, 0xec, + 0x41, 0x78, 0x08, 0x00, 0x41, 0x78, 0x10, 0x00, 0x04, 0x01, 0xf7, 0xca, + 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf7, 0xfb, + 0x82, 0x00, 0x4d, 0x80, 0x00, 0x00, 0x00, 0x1d, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x82, 0x00, 0x4d, 0x80, 0x00, 0x00, 0x00, 0x1a, + 0x04, 0x02, 0x00, 0x04, 0x40, 0x10, 0x10, 0x00, 0x40, 0x00, 0x08, 0x00, + 0x04, 0x01, 0xf7, 0xdc, 0x82, 0x00, 0x4d, 0x80, 0x00, 0x00, 0x00, 0x1b, + 0x04, 0x02, 0x00, 0x03, 0x40, 0x18, 0x10, 0x00, 0x04, 0x01, 0xf7, 0xfa, + 0x82, 0x00, 0x4d, 0x80, 0x00, 0x00, 0x00, 0x1c, 0x04, 0x00, 0x07, 0xf7, + 0x82, 0x00, 0x4d, 0x80, 0x00, 0x00, 0x00, 0x19, 0x04, 0x00, 0x07, 0xb5, + 0x04, 0x01, 0xf7, 0xd6, 0x59, 0x2e, 0x60, 0x08, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8c, 0x60, 0x04, 0x00, 0x07, 0xb3, 0x59, 0x30, 0x0c, 0x06, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x11, 0x04, 0x02, 0x07, 0xd6, + 0x83, 0x44, 0x05, 0x80, 0x00, 0x00, 0xff, 0xff, 0x04, 0x02, 0x00, 0x05, + 0x59, 0x32, 0x68, 0x09, 0x81, 0x36, 0x69, 0xc0, 0x04, 0x00, 0x00, 0x0e, + 0x04, 0x01, 0xf7, 0xcf, 0x59, 0x2c, 0x10, 0x0a, 0x82, 0x08, 0x15, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x41, 0x78, 0x40, 0x00, 0x04, 0x01, 0xfd, 0x8b, + 0x04, 0x02, 0x07, 0xd6, 0x59, 0x30, 0x00, 0x09, 0x80, 0x00, 0x01, 0xc0, + 0x04, 0x00, 0x00, 0x03, 0x81, 0x34, 0x05, 0x80, 0x04, 0x02, 0x07, 0xc4, + 0x49, 0x36, 0x60, 0x09, 0x59, 0x2c, 0x0c, 0x0b, 0x82, 0x04, 0x15, 0x00, + 0x00, 0x00, 0xe0, 0x00, 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0x60, 0x00, + 0x04, 0x00, 0x00, 0x11, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x81, 0x36, 0x69, 0xc0, 0x04, 0x00, 0x00, 0x02, 0x59, 0x34, 0x0a, 0x04, + 0x59, 0x2c, 0x00, 0x0d, 0x80, 0x04, 0x04, 0x80, 0x04, 0x00, 0x17, 0xa0, + 0x59, 0x30, 0x0a, 0x03, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x07, + 0x04, 0x02, 0x07, 0xb1, 0x49, 0x2e, 0x60, 0x08, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x54, 0x04, 0x01, 0xf7, 0x74, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa0, 0xb6, 0x04, 0x00, 0x07, 0xb4, 0x04, 0x01, 0xf7, 0xa9, + 0x49, 0x2f, 0xc8, 0x57, 0x59, 0x2e, 0x60, 0x08, 0x49, 0x33, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8c, 0x60, 0x04, 0x00, 0x00, 0x4a, + 0x59, 0x30, 0x14, 0x06, 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x02, 0x00, 0x67, 0x59, 0x2c, 0x02, 0x07, 0x8c, 0x00, 0x05, 0x00, + 0x04, 0x02, 0x00, 0x8b, 0x8d, 0x0e, 0x1d, 0x0e, 0x04, 0x02, 0x00, 0x71, + 0x59, 0x30, 0x12, 0x03, 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0x00, 0x07, + 0x04, 0x02, 0x00, 0x5e, 0x59, 0x2e, 0x8c, 0x06, 0x83, 0x44, 0x04, 0x80, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x02, 0x10, 0x36, 0x41, 0x78, 0x40, 0x00, + 0x59, 0x2c, 0x10, 0x09, 0x82, 0x08, 0x15, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x04, 0x01, 0xfd, 0x4e, 0x04, 0x02, 0x00, 0x66, 0x59, 0x30, 0x00, 0x09, + 0x80, 0x00, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x03, 0x81, 0x34, 0x05, 0x80, + 0x04, 0x02, 0x00, 0x4f, 0x4d, 0x30, 0x00, 0x00, 0x59, 0x2e, 0x60, 0x13, + 0x49, 0x33, 0xc8, 0x57, 0x83, 0x30, 0x05, 0x80, 0xff, 0xff, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x0d, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8c, 0x60, + 0x5c, 0x02, 0x60, 0x00, 0x04, 0x00, 0x00, 0x30, 0x59, 0x1c, 0x14, 0x06, + 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0x00, 0x06, 0x04, 0x00, 0x00, 0x4d, + 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x00, 0x4a, + 0x04, 0x01, 0xf0, 0x02, 0x5c, 0x02, 0x60, 0x00, 0x59, 0xa8, 0x00, 0x0f, + 0x59, 0x2c, 0x10, 0x0a, 0x82, 0x08, 0x15, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x80, 0x08, 0x15, 0x80, 0x04, 0x02, 0x00, 0x1e, 0x59, 0x2c, 0x08, 0x09, + 0x82, 0x04, 0x15, 0x00, 0x00, 0xff, 0xff, 0xff, 0x80, 0x08, 0x15, 0x80, + 0x04, 0x00, 0x00, 0x13, 0x80, 0x04, 0x09, 0x32, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x42, 0x04, 0x02, 0x00, 0x12, 0x49, 0x36, 0x60, 0x09, + 0x49, 0x2e, 0x60, 0x08, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x92, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, 0x80, 0x00, 0x05, 0x80, + 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0a, + 0x04, 0x01, 0xf0, 0x0f, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x04, 0x01, 0xf0, 0x0c, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x14, + 0x04, 0x01, 0xf0, 0x09, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x17, + 0x04, 0x01, 0xf0, 0x06, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x18, + 0x04, 0x01, 0xf0, 0x03, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x49, 0x2f, 0xc8, 0x57, 0x48, 0x0b, 0xc8, 0x57, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x19, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x31, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf7, 0xe6, + 0x49, 0x2f, 0xc8, 0x57, 0x48, 0x03, 0xc8, 0x57, 0x48, 0x0b, 0xc8, 0x57, + 0x40, 0x00, 0x08, 0x00, 0x04, 0x01, 0xf7, 0xf7, 0x49, 0x2f, 0xc8, 0x57, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x41, 0x78, 0x10, 0x00, + 0x04, 0x01, 0xf7, 0xf2, 0x49, 0x33, 0xc8, 0x57, 0x59, 0x30, 0x04, 0x06, + 0x48, 0x03, 0xc8, 0x57, 0x59, 0x30, 0x02, 0x03, 0x48, 0x03, 0xc8, 0x57, + 0x59, 0x30, 0x00, 0x09, 0x48, 0x03, 0xc8, 0x57, 0x42, 0x02, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x41, 0x78, 0x08, 0x00, 0x41, 0x78, 0x10, 0x00, + 0x04, 0x01, 0xf7, 0xe8, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1e, + 0x04, 0x01, 0xf7, 0xf0, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf7, 0xed, 0x82, 0x00, 0x4d, 0x80, 0x00, 0x00, 0x00, 0x1d, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x82, 0x00, 0x4d, 0x80, + 0x00, 0x00, 0x00, 0x1a, 0x04, 0x02, 0x00, 0x03, 0x40, 0x10, 0x10, 0x00, + 0x04, 0x01, 0xf7, 0xdc, 0x82, 0x00, 0x4d, 0x80, 0x00, 0x00, 0x00, 0x1b, + 0x04, 0x02, 0x00, 0x03, 0x40, 0x18, 0x10, 0x00, 0x04, 0x01, 0xf7, 0xd7, + 0x82, 0x00, 0x4d, 0x80, 0x00, 0x00, 0x00, 0x1c, 0x04, 0x00, 0x07, 0xd4, + 0x82, 0x00, 0x4d, 0x80, 0x00, 0x00, 0x00, 0x19, 0x04, 0x00, 0x07, 0xd1, + 0x04, 0x01, 0xf7, 0xd5, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa0, 0xb6, + 0x04, 0x02, 0x07, 0xd7, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf7, 0xdd, 0x5c, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x48, 0x03, 0xc8, 0x57, 0x59, 0x30, 0x20, 0x09, 0x80, 0x10, 0x21, 0xc0, + 0x04, 0x00, 0x00, 0x35, 0x58, 0x10, 0x14, 0x00, 0x48, 0x13, 0xc8, 0x57, + 0x48, 0x0b, 0xc8, 0x57, 0x82, 0x08, 0x1d, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x59, 0x30, 0x0c, 0x03, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x08, + 0x04, 0x00, 0x00, 0x22, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0a, + 0x04, 0x00, 0x00, 0x17, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0c, + 0x04, 0x00, 0x00, 0x10, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x00, 0x00, 0x19, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x00, 0x00, 0x12, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x00, 0x0b, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x00, 0x00, 0x04, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x33, + 0x04, 0x02, 0x00, 0x17, 0x82, 0x0c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x09, + 0x04, 0x00, 0x00, 0x0d, 0x04, 0x01, 0xf0, 0x13, 0x82, 0x0c, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x00, 0x09, 0x04, 0x01, 0xf0, 0x0f, + 0x82, 0x0c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0b, 0x04, 0x00, 0x00, 0x05, + 0x04, 0x01, 0xf0, 0x0b, 0x82, 0x0c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x02, 0x00, 0x08, 0x82, 0x08, 0x1d, 0x00, 0xff, 0xff, 0xff, 0x00, + 0x84, 0x0c, 0x01, 0xc0, 0x80, 0x0c, 0x05, 0x40, 0x48, 0x07, 0xc8, 0x57, + 0x48, 0x03, 0xc8, 0x57, 0x48, 0x00, 0x24, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x9c, 0x00, 0x17, 0x8c, 0x00, 0x05, 0x0a, 0x04, 0x00, 0x00, 0x03, + 0x80, 0x00, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xa8, 0x00, 0x23, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x28, 0x04, 0x00, 0x00, 0x08, + 0x42, 0x02, 0x88, 0x00, 0x00, 0x00, 0x07, 0xfd, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0x5a, 0x04, 0x02, 0x00, 0x03, 0x59, 0x34, 0x00, 0x0a, + 0x8c, 0x00, 0x05, 0x04, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4d, 0x30, 0x00, 0x00, 0x59, 0x34, 0x00, 0x0e, 0x80, 0x02, 0x65, 0x40, + 0x04, 0x00, 0x00, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5e, 0xc5, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x60, 0xac, 0x49, 0x7a, 0x68, 0x0e, + 0x5c, 0x02, 0x60, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x40, 0x68, 0x10, 0x00, 0x04, 0x01, 0xf8, 0x08, 0x42, 0x01, 0x88, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x02, 0x00, 0x03, 0x42, 0x01, 0x88, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4d, 0x44, 0x00, 0x00, 0x4d, 0x34, 0x00, 0x00, 0x80, 0x00, 0x05, 0x80, + 0x40, 0x00, 0x18, 0x00, 0x40, 0x02, 0x88, 0x00, 0x82, 0x08, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x08, 0x04, 0x02, 0x00, 0x03, 0x42, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, + 0x04, 0x02, 0x00, 0x0a, 0x04, 0x01, 0xfd, 0x32, 0x04, 0x02, 0x00, 0x08, + 0x80, 0x0c, 0x19, 0xc0, 0x04, 0x00, 0x00, 0x04, 0x59, 0x34, 0x04, 0x05, + 0x8c, 0x00, 0x05, 0x08, 0x04, 0x00, 0x00, 0x03, 0x80, 0x08, 0x10, 0x40, + 0x04, 0x00, 0x00, 0x09, 0x81, 0x46, 0x88, 0x00, 0x83, 0x44, 0x04, 0x80, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x17, 0xf1, 0x80, 0x00, 0x05, 0x80, + 0x5c, 0x02, 0x68, 0x00, 0x5c, 0x02, 0x88, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x5c, 0x02, 0x68, 0x00, + 0x5c, 0x02, 0x88, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x59, 0xbc, 0x00, 0xe4, 0x8c, 0x00, 0x05, 0x24, + 0x04, 0x02, 0x00, 0x32, 0x59, 0xa8, 0x00, 0x23, 0x8c, 0x00, 0x05, 0x08, + 0x04, 0x02, 0x00, 0x2f, 0x59, 0x34, 0x10, 0x0a, 0x82, 0x08, 0x15, 0x00, + 0x00, 0x00, 0xe0, 0x00, 0x42, 0x00, 0x70, 0x00, 0x00, 0x10, 0xad, 0x10, + 0x58, 0x38, 0x04, 0x01, 0x8c, 0x00, 0x05, 0x04, 0x04, 0x02, 0x00, 0x1a, + 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0x60, 0x00, 0x04, 0x00, 0x00, 0x24, + 0x59, 0x34, 0x1a, 0x04, 0x82, 0x0c, 0x04, 0x80, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x10, 0x04, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0a, 0x00, + 0x04, 0x01, 0xf0, 0x09, 0x82, 0x0c, 0x04, 0x80, 0x00, 0x00, 0x04, 0x00, + 0x04, 0x00, 0x10, 0x04, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x04, 0x01, 0xf0, 0x03, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x02, + 0x80, 0x04, 0x08, 0xc2, 0x82, 0x04, 0x0d, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf0, 0x0e, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0x20, 0x00, 0x04, 0x02, 0x00, 0x04, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x01, 0xf0, 0x06, + 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x03, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x48, 0x06, 0x6c, 0x04, + 0x1c, 0x01, 0xf0, 0x00, 0x4a, 0x03, 0x30, 0x12, 0x00, 0x00, 0x00, 0x00, + 0x4a, 0x03, 0xb1, 0x04, 0x80, 0x00, 0x00, 0x00, 0x49, 0x7b, 0x30, 0x17, + 0x49, 0x7b, 0x30, 0x18, 0x4a, 0x03, 0xb1, 0x04, 0x60, 0x00, 0x00, 0x01, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x9c, 0x00, 0x18, 0x48, 0x03, 0xc8, 0x56, + 0x49, 0x7b, 0x30, 0x15, 0x49, 0x7b, 0x30, 0x16, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x48, 0x03, 0x30, 0x13, 0x04, 0x00, 0x00, 0x09, + 0x59, 0x9c, 0x02, 0x16, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x04, 0x02, 0x00, 0x03, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x48, 0x03, 0x30, 0x14, 0x85, 0x0e, 0x1d, 0x62, 0x1c, 0x01, 0xf0, 0x00, + 0x04, 0x01, 0xff, 0xef, 0x4a, 0x03, 0xc8, 0x26, 0x00, 0x00, 0x00, 0x04, + 0x59, 0x9c, 0x02, 0x09, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x1e, + 0x59, 0x9c, 0x02, 0x07, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x07, + 0x80, 0x00, 0x00, 0xcc, 0x59, 0x9c, 0x08, 0x0d, 0x80, 0x04, 0x04, 0x00, + 0x48, 0x03, 0xb1, 0x00, 0x49, 0x7b, 0xb1, 0x02, 0x59, 0xd8, 0x01, 0x01, + 0x59, 0x9c, 0x00, 0x0d, 0x48, 0x03, 0xb1, 0x00, 0x59, 0x9c, 0x00, 0x0e, + 0x48, 0x03, 0xb1, 0x01, 0x59, 0x9c, 0x02, 0x07, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x02, 0x00, 0x02, 0x49, 0x7b, 0xb1, 0x02, 0x59, 0x9c, 0x0a, 0x09, + 0x82, 0x04, 0x05, 0x40, 0x00, 0x40, 0x00, 0x00, 0x48, 0x03, 0xb1, 0x03, + 0x4a, 0x03, 0xb1, 0x09, 0x00, 0x00, 0x00, 0x04, 0x4a, 0x03, 0xb1, 0x04, + 0x10, 0x00, 0x00, 0x01, 0x8d, 0x0e, 0x1d, 0x22, 0x04, 0x02, 0x00, 0x04, + 0x4a, 0x03, 0x30, 0x12, 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, + 0x4a, 0x03, 0x30, 0x12, 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf7, 0xfd, + 0x4c, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x2c, 0x02, 0x04, + 0x49, 0x2f, 0xc8, 0x57, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x08, + 0x42, 0x03, 0x40, 0x00, 0x00, 0x10, 0xac, 0x71, 0x59, 0xa1, 0xd8, 0x1e, + 0x80, 0xed, 0xd9, 0xc0, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x04, 0x01, 0xf0, 0x03, 0x59, 0x31, 0xd8, 0x21, 0x58, 0xef, 0x40, 0x0b, + 0x58, 0xec, 0x00, 0x09, 0x80, 0x00, 0x01, 0xc0, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x08, 0x01, 0xf8, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x48, 0x03, 0xc8, 0x57, + 0x49, 0x2f, 0xc8, 0x57, 0x49, 0x43, 0xc8, 0x57, 0x48, 0x07, 0xc8, 0x57, + 0x4a, 0x02, 0x5a, 0x04, 0x00, 0x00, 0x01, 0x03, 0x49, 0x42, 0x5a, 0x06, + 0x48, 0x06, 0x5a, 0x08, 0x4a, 0x02, 0x5c, 0x06, 0x00, 0x00, 0xff, 0xff, + 0x81, 0x32, 0x61, 0xc0, 0x04, 0x00, 0x00, 0x03, 0x59, 0x30, 0x04, 0x02, + 0x48, 0x02, 0x5c, 0x06, 0x83, 0x2c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x04, 0x01, 0x10, 0x00, 0x48, 0x03, 0xc8, 0x40, 0x4a, 0x03, 0xc8, 0x42, + 0x00, 0x00, 0x00, 0x0b, 0x04, 0x01, 0x10, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0xa8, 0x00, 0x16, 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x0a, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf8, 0x09, + 0x4a, 0x03, 0x88, 0x05, 0x00, 0x00, 0x00, 0xf0, 0x59, 0xc4, 0x00, 0xa3, + 0x82, 0x00, 0x05, 0x00, 0x02, 0x87, 0x00, 0x00, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x4b, 0x33, + 0x00, 0x10, 0x4a, 0xbf, 0x00, 0x10, 0x4a, 0xda, 0x00, 0x10, 0x4b, 0x03, + 0x00, 0x10, 0x4b, 0x26, 0x00, 0x10, 0x4b, 0x60, 0x00, 0x10, 0x4b, 0x72, + 0x00, 0x10, 0x4a, 0xda, 0x00, 0x10, 0x4b, 0x44, 0x00, 0x10, 0x4a, 0xbe, + 0x1c, 0x01, 0xf0, 0x00, 0x4a, 0x03, 0x88, 0x08, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x01, 0xf8, 0xf7, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4f, 0x2c, + 0x59, 0xc4, 0x08, 0x05, 0x8c, 0x04, 0x0d, 0x0e, 0x04, 0x02, 0x00, 0x13, + 0x8c, 0x04, 0x0d, 0x0a, 0x04, 0x02, 0x00, 0x0b, 0x8c, 0x04, 0x0d, 0x0c, + 0x04, 0x02, 0x00, 0x06, 0x8c, 0x04, 0x0d, 0x08, 0x04, 0x00, 0x00, 0x0d, + 0x4a, 0x03, 0x50, 0x16, 0x00, 0x00, 0x00, 0x03, 0x04, 0x01, 0xf0, 0x0a, + 0x4a, 0x03, 0x50, 0x16, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf0, 0x07, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x12, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x4a, 0x03, 0x50, 0x16, 0x00, 0x00, 0x00, 0x02, + 0x1c, 0x01, 0xf0, 0x00, 0x4a, 0x03, 0x88, 0x08, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x01, 0xf8, 0xdc, 0x59, 0xc4, 0x08, 0x05, 0x8c, 0x04, 0x0d, 0x08, + 0x04, 0x02, 0x00, 0x21, 0x8c, 0x04, 0x0d, 0x0c, 0x04, 0x02, 0x00, 0x1c, + 0x8c, 0x04, 0x0d, 0x0e, 0x04, 0x02, 0x00, 0x17, 0x82, 0x04, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0x04, 0x02, 0x00, 0x1c, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4f, 0x2c, 0x4a, 0x03, 0x88, 0x08, 0x00, 0x00, 0x00, 0x80, + 0x59, 0xc4, 0x00, 0x02, 0x84, 0x00, 0x05, 0x0c, 0x48, 0x03, 0x88, 0x02, + 0x04, 0x01, 0xf9, 0xfe, 0x4d, 0x3c, 0x00, 0x00, 0x42, 0x02, 0x78, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x90, 0xc7, + 0x5c, 0x02, 0x78, 0x00, 0x4a, 0x03, 0x88, 0x08, 0x00, 0x00, 0x00, 0x80, + 0x4a, 0x03, 0x50, 0x16, 0x00, 0x00, 0x00, 0x09, 0x04, 0x01, 0xf0, 0x09, + 0x4a, 0x03, 0x50, 0x16, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x06, + 0x4a, 0x03, 0x50, 0x16, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf0, 0x03, + 0x4a, 0x03, 0x50, 0x16, 0x00, 0x00, 0x00, 0x03, 0x1c, 0x01, 0xf0, 0x00, + 0x04, 0x01, 0xf8, 0xb5, 0x4a, 0x03, 0x88, 0x08, 0x00, 0x00, 0x00, 0x80, + 0x59, 0xc4, 0x08, 0x05, 0x8c, 0x04, 0x0d, 0x0a, 0x04, 0x02, 0x00, 0x1b, + 0x8c, 0x04, 0x0d, 0x0c, 0x04, 0x02, 0x00, 0x16, 0x8c, 0x04, 0x0d, 0x0e, + 0x04, 0x02, 0x00, 0x11, 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0x04, 0x02, 0x00, 0x16, 0x59, 0xc4, 0x00, 0x02, 0x84, 0x00, 0x05, 0x0c, + 0x48, 0x03, 0x88, 0x02, 0x04, 0x01, 0xf9, 0xd9, 0x4d, 0x3c, 0x00, 0x00, + 0x42, 0x02, 0x78, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x90, 0xc7, 0x5c, 0x02, 0x78, 0x00, 0x4a, 0x03, 0x50, 0x16, + 0x00, 0x00, 0x00, 0x09, 0x04, 0x01, 0xf0, 0x09, 0x4a, 0x03, 0x50, 0x16, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x06, 0x4a, 0x03, 0x50, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf0, 0x03, 0x4a, 0x03, 0x50, 0x16, + 0x00, 0x00, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, 0x4a, 0x03, 0x88, 0x08, + 0x00, 0x00, 0x00, 0x08, 0x59, 0xc4, 0x08, 0x05, 0x8c, 0x04, 0x0d, 0x0c, + 0x04, 0x02, 0x00, 0x06, 0x8c, 0x04, 0x0d, 0x0e, 0x04, 0x00, 0x00, 0x06, + 0x4a, 0x03, 0x50, 0x16, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x03, + 0x4a, 0x03, 0x50, 0x16, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x04, 0x01, 0xf8, 0xd9, 0x59, 0xc4, 0x08, 0x05, 0x8c, 0x04, 0x0d, 0x0c, + 0x04, 0x02, 0x00, 0x0d, 0x4c, 0x04, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x80, + 0x5c, 0x00, 0x08, 0x00, 0x8c, 0x04, 0x0d, 0x0a, 0x04, 0x02, 0x00, 0x06, + 0x8c, 0x04, 0x0d, 0x0e, 0x04, 0x00, 0x00, 0x06, 0x4a, 0x03, 0x50, 0x16, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x03, 0x4a, 0x03, 0x50, 0x16, + 0x00, 0x00, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, 0x4a, 0x03, 0x88, 0x08, + 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x4b, 0xc8, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x63, 0x59, 0xc4, 0x08, 0x05, + 0x8c, 0x04, 0x0d, 0x0a, 0x04, 0x02, 0x00, 0x0d, 0x8c, 0x04, 0x0d, 0x08, + 0x04, 0x02, 0x00, 0x0b, 0x8c, 0x04, 0x0d, 0x0c, 0x04, 0x02, 0x00, 0x06, + 0x8c, 0x04, 0x0d, 0x0e, 0x04, 0x00, 0x00, 0x0d, 0x4a, 0x03, 0x50, 0x16, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x0a, 0x4a, 0x03, 0x50, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf0, 0x07, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x12, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x4a, 0x03, 0x50, 0x16, 0x00, 0x00, 0x00, 0x04, 0x1c, 0x01, 0xf0, 0x00, + 0x04, 0x01, 0xf8, 0xac, 0x04, 0x01, 0xf8, 0x57, 0x59, 0xc4, 0x08, 0x05, + 0x8c, 0x04, 0x0d, 0x0a, 0x04, 0x02, 0x00, 0x0b, 0x8c, 0x04, 0x0d, 0x0c, + 0x04, 0x02, 0x00, 0x06, 0x8c, 0x04, 0x0d, 0x0e, 0x04, 0x00, 0x00, 0x09, + 0x4a, 0x03, 0x50, 0x16, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x06, + 0x4a, 0x03, 0x50, 0x16, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf0, 0x03, + 0x4a, 0x03, 0x50, 0x16, 0x00, 0x00, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, + 0x4a, 0x03, 0x88, 0x08, 0x00, 0x00, 0x00, 0x04, 0x04, 0x01, 0xf8, 0x44, + 0x59, 0xc4, 0x08, 0x05, 0x8c, 0x04, 0x0d, 0x0a, 0x04, 0x02, 0x00, 0x10, + 0x8c, 0x04, 0x0d, 0x08, 0x04, 0x02, 0x00, 0x0b, 0x8c, 0x04, 0x0d, 0x0c, + 0x04, 0x02, 0x00, 0x06, 0x8c, 0x04, 0x0d, 0x0e, 0x04, 0x00, 0x00, 0x0c, + 0x4a, 0x03, 0x50, 0x16, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x09, + 0x4a, 0x03, 0x50, 0x16, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf0, 0x06, + 0x4a, 0x03, 0x50, 0x16, 0x00, 0x00, 0x00, 0x03, 0x04, 0x01, 0xf0, 0x03, + 0x4a, 0x03, 0x50, 0x16, 0x00, 0x00, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, + 0x04, 0x01, 0xf9, 0x1c, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x8d, 0x0e, 0x1d, 0x0c, 0x04, 0x00, 0x00, 0x14, 0x85, 0x0e, 0x1d, 0x0c, + 0x4a, 0x03, 0x88, 0x05, 0x00, 0x00, 0x00, 0x10, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x18, 0x92, 0x59, 0xc4, 0x00, 0x05, 0x8c, 0x00, 0x05, 0x08, + 0x04, 0x00, 0x00, 0x08, 0x4a, 0x03, 0x88, 0x08, 0x00, 0x00, 0x00, 0x08, + 0x4a, 0x03, 0x50, 0x30, 0x00, 0x00, 0x00, 0x01, 0x42, 0x02, 0xd8, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x1a, 0x59, 0xc4, 0x00, 0x06, + 0x84, 0x00, 0x05, 0x48, 0x48, 0x03, 0x88, 0x06, 0x04, 0x01, 0xf0, 0x16, + 0x59, 0xa8, 0x00, 0x16, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x00, 0x00, 0x0c, 0x59, 0xa8, 0x00, 0x16, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x05, 0x04, 0x02, 0x00, 0x0c, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x12, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x4a, 0x03, 0x50, 0x16, 0x00, 0x00, 0x00, 0x08, 0x04, 0x01, 0xf0, 0x07, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x12, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x4a, 0x03, 0x50, 0x16, 0x00, 0x00, 0x00, 0x04, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x4c, 0x04, 0x00, 0x00, + 0x4c, 0x08, 0x00, 0x00, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x64, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x4b, 0xc8, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5c, 0x58, 0x5c, 0x00, 0x10, 0x00, 0x5c, 0x00, 0x08, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x4c, 0x04, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x76, + 0x4d, 0xf0, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x66, 0x64, + 0x5c, 0x03, 0xe0, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x64, 0x63, + 0x04, 0x01, 0xff, 0xb8, 0x5c, 0x00, 0x08, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x4c, 0x04, 0x00, 0x00, + 0x4c, 0x08, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x76, + 0x4d, 0xf0, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x66, 0x64, + 0x5c, 0x03, 0xe0, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x64, 0x63, + 0x59, 0xc4, 0x00, 0x06, 0x84, 0x00, 0x05, 0x00, 0x48, 0x03, 0x88, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x67, 0x25, 0x49, 0x7b, 0x88, 0x80, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa1, 0xd8, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa1, 0xe6, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x17, 0x7f, + 0x4a, 0x03, 0x50, 0x49, 0x00, 0x00, 0x00, 0x04, 0x42, 0x02, 0xd8, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x4a, 0x03, 0x88, 0x05, 0x00, 0x00, 0x00, 0x01, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x4b, 0xc8, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5c, 0x63, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x05, 0xfc, + 0x04, 0x01, 0xf8, 0xd7, 0x04, 0x00, 0x00, 0x06, 0x42, 0x00, 0x60, 0x00, + 0xfe, 0xff, 0xff, 0xff, 0x41, 0x78, 0x68, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x3f, 0x44, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xd4, 0x71, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x14, 0xc3, 0x5c, 0x00, 0x10, 0x00, 0x5c, 0x00, 0x08, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xc4, 0x00, 0x08, 0x8c, 0x00, 0x05, 0x08, + 0x04, 0x02, 0x00, 0x07, 0x4a, 0x03, 0x88, 0x08, 0x00, 0x00, 0x00, 0x10, + 0x42, 0x01, 0xd0, 0x00, 0x00, 0x00, 0x13, 0x88, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5c, 0x78, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x4c, 0x04, 0x00, 0x00, 0x59, 0xa8, 0x08, 0x30, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0b, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x0b, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x0b, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x0b, 0x04, 0x01, 0xf0, 0x4c, + 0x4a, 0x03, 0x50, 0x16, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf0, 0x09, + 0x4a, 0x03, 0x50, 0x16, 0x00, 0x00, 0x00, 0x04, 0x04, 0x01, 0xf0, 0x06, + 0x4a, 0x03, 0x50, 0x16, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x03, + 0x4a, 0x03, 0x50, 0x16, 0x00, 0x00, 0x00, 0x07, 0x49, 0x7b, 0x88, 0x80, + 0x4a, 0x03, 0x88, 0x93, 0x00, 0x00, 0x00, 0x01, 0x41, 0x78, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0x36, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x67, 0x25, 0x83, 0x6c, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x00, 0x00, 0x08, 0x59, 0xc4, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, + 0xff, 0xff, 0xff, 0x0f, 0x82, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x01, + 0x48, 0x03, 0x88, 0x06, 0x04, 0x01, 0xf0, 0x07, 0x59, 0xc4, 0x00, 0x06, + 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x82, 0x00, 0x05, 0x40, + 0x04, 0x00, 0x00, 0x00, 0x48, 0x03, 0x88, 0x06, 0x04, 0x01, 0xf8, 0x8a, + 0x04, 0x02, 0x00, 0x05, 0x59, 0xc4, 0x08, 0x06, 0x82, 0x04, 0x0d, 0x00, + 0xfb, 0xff, 0xff, 0x0f, 0x48, 0x07, 0x88, 0x06, 0x59, 0xc4, 0x00, 0x05, + 0x8c, 0x00, 0x05, 0x34, 0x04, 0x02, 0x00, 0x2a, 0x42, 0x00, 0x60, 0x00, + 0xfc, 0x18, 0xff, 0xff, 0x42, 0x00, 0x68, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x44, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x18, 0x92, 0x59, 0xc4, 0x08, 0xa4, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x82, 0x04, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x0c, + 0x04, 0x02, 0x08, 0xbf, 0x04, 0x01, 0xf8, 0x73, 0x04, 0x00, 0x00, 0x06, + 0x42, 0x00, 0x60, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x41, 0x78, 0x68, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x44, 0x83, 0x6c, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x06, 0x59, 0xa8, 0x08, 0x4a, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x4b, 0xd9, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5c, 0x4d, 0x4a, 0x03, 0x50, 0x30, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x01, 0xfe, 0x35, 0x04, 0x01, 0xf8, 0x61, 0x04, 0x02, 0x00, 0x08, + 0x59, 0xc4, 0x08, 0xa4, 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0c, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x5c, 0x00, 0x08, 0x00, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x4c, 0x00, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x8c, 0x4a, 0x03, 0x50, 0x0f, + 0x00, 0xff, 0xff, 0xff, 0x49, 0x7b, 0x50, 0x2f, 0x59, 0xa8, 0x00, 0x27, + 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0x00, 0x00, 0x48, 0x03, 0x50, 0x27, + 0x49, 0x7b, 0x88, 0x80, 0x49, 0x7b, 0x88, 0x93, 0x41, 0x78, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0x36, 0x59, 0xc4, 0x00, 0x01, + 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0xfc, 0xff, 0x48, 0x03, 0x88, 0x01, + 0x42, 0x00, 0x60, 0x00, 0xfc, 0x18, 0xff, 0xff, 0x41, 0x78, 0x68, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x44, 0x4a, 0x03, 0x88, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xc0, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x3d, 0xcb, 0x4a, 0x03, 0x88, 0x05, + 0x04, 0x00, 0x00, 0xf0, 0x59, 0xc4, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, + 0xff, 0xff, 0xff, 0xcf, 0x82, 0x00, 0x05, 0x40, 0x44, 0x00, 0x00, 0xc1, + 0x48, 0x03, 0x88, 0x06, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x5c, 0x00, 0x00, + 0x59, 0xa8, 0xb8, 0x2f, 0x82, 0x5c, 0xbd, 0x80, 0x00, 0x00, 0xaa, 0xaa, + 0x5c, 0x00, 0xb8, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x4c, 0x5c, 0x00, 0x00, 0x59, 0xa8, 0xb8, 0x2f, 0x82, 0x5c, 0xbd, 0x80, + 0x00, 0x00, 0xaa, 0xaa, 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x00, 0x00, 0x03, 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5c, 0x00, 0xb8, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x08, 0x42, 0x01, 0x88, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x03, 0x42, 0x01, 0x88, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x5c, 0x00, 0x00, 0x59, 0x9c, 0xb8, 0x18, 0x82, 0x5c, 0xbd, 0x00, + 0x00, 0x00, 0x00, 0x30, 0x82, 0x5c, 0xbd, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x5c, 0x00, 0xb8, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x08, 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x00, 0x00, 0x03, 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x5c, 0x00, 0x00, + 0x59, 0x9c, 0xb8, 0x18, 0x82, 0x5c, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x82, 0x5c, 0xbd, 0x80, 0x00, 0x00, 0x00, 0x10, 0x5c, 0x00, 0xb8, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x08, + 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x03, + 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x5c, 0x00, 0x00, 0x59, 0x9c, 0xb8, 0x18, + 0x82, 0x5c, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x30, 0x82, 0x5c, 0xbd, 0x80, + 0x00, 0x00, 0x00, 0x20, 0x5c, 0x00, 0xb8, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x0f, 0xc8, 0x57, 0x83, 0x0c, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x13, + 0x04, 0x00, 0x00, 0x22, 0x59, 0x9c, 0x10, 0x17, 0x4d, 0x3c, 0x00, 0x00, + 0x83, 0x0c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x00, 0x05, + 0x41, 0x7a, 0x78, 0x00, 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x02, 0x00, 0x09, + 0x04, 0x01, 0xf0, 0x11, 0x42, 0x02, 0x78, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x00, 0x00, 0x0d, 0x42, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x01, 0xf0, 0x03, 0x42, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0e, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9c, 0x1f, 0x59, 0x9c, 0x10, 0x17, + 0x8c, 0x08, 0x15, 0x0a, 0x04, 0x02, 0x00, 0x07, 0x42, 0x02, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0x42, + 0x48, 0x03, 0xc8, 0x56, 0x85, 0x0e, 0x1d, 0x08, 0x5c, 0x02, 0x78, 0x00, + 0x04, 0x01, 0xf0, 0x09, 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x00, 0x00, 0x07, + 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x42, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9c, 0x1f, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x4c, 0x58, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x9a, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x10, 0xb8, 0xc0, 0x59, 0xc4, 0x00, 0x03, 0x44, 0x00, 0x08, 0x00, + 0x59, 0xc4, 0x00, 0x04, 0x48, 0x00, 0x08, 0x01, 0x59, 0xc4, 0x00, 0x0b, + 0x48, 0x00, 0x08, 0x02, 0x59, 0xc4, 0x00, 0x8e, 0x48, 0x00, 0x08, 0x03, + 0x59, 0xc4, 0x00, 0x8f, 0x48, 0x00, 0x08, 0x04, 0x59, 0xc4, 0x00, 0x90, + 0x48, 0x00, 0x08, 0x05, 0x59, 0xc4, 0x00, 0x91, 0x48, 0x00, 0x08, 0x06, + 0x59, 0xc4, 0x00, 0x92, 0x48, 0x00, 0x08, 0x07, 0x59, 0xc4, 0x00, 0x93, + 0x48, 0x00, 0x08, 0x08, 0x59, 0xc4, 0x00, 0x99, 0x48, 0x00, 0x08, 0x09, + 0x59, 0xc4, 0x00, 0x9e, 0x48, 0x00, 0x08, 0x0a, 0x59, 0xc4, 0x00, 0xaa, + 0x48, 0x00, 0x08, 0x0b, 0x59, 0xc4, 0x00, 0xaf, 0x48, 0x00, 0x08, 0x0c, + 0x59, 0xc4, 0x00, 0xb2, 0x48, 0x00, 0x08, 0x0d, 0x59, 0xc4, 0x00, 0xb1, + 0x48, 0x00, 0x08, 0x0e, 0x82, 0x04, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x41, 0xc4, 0x18, 0x00, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x58, 0x0c, 0x00, 0x50, 0x44, 0x00, 0x08, 0x00, 0x80, 0x04, 0x08, 0x00, + 0x80, 0x0c, 0x18, 0x00, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xfb, + 0x41, 0xc4, 0x18, 0x00, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x58, 0x0c, 0x00, 0x10, 0x44, 0x00, 0x08, 0x00, 0x80, 0x04, 0x08, 0x00, + 0x80, 0x0c, 0x18, 0x00, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xfb, + 0x49, 0x7b, 0x88, 0x30, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x59, 0xc4, 0x00, 0x31, 0x44, 0x00, 0x08, 0x00, 0x80, 0x04, 0x08, 0x00, + 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xfc, 0x49, 0x7b, 0x88, 0xac, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x59, 0xc4, 0x00, 0xad, + 0x44, 0x00, 0x08, 0x00, 0x80, 0x04, 0x08, 0x00, 0x80, 0x58, 0xb0, 0x40, + 0x04, 0x02, 0x07, 0xfc, 0x59, 0xc4, 0x10, 0x01, 0x4c, 0x08, 0x00, 0x00, + 0x84, 0x08, 0x15, 0x0c, 0x48, 0x0b, 0x88, 0x01, 0x4a, 0x03, 0x70, 0xe4, + 0x00, 0x00, 0x03, 0x00, 0x4a, 0x03, 0x70, 0xe5, 0xb0, 0x00, 0x00, 0x00, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x80, 0x04, 0x08, 0x40, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0xb8, 0x00, 0xe5, + 0x8c, 0x00, 0x05, 0x38, 0x04, 0x02, 0x07, 0xfb, 0x4a, 0x03, 0x70, 0xe4, + 0x00, 0x00, 0x02, 0x00, 0x42, 0x00, 0x60, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x42, 0x00, 0x68, 0x00, 0x80, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x3f, 0x44, 0x4a, 0x03, 0x88, 0x07, 0x00, 0x00, 0x00, 0x01, + 0x49, 0x7b, 0x88, 0x07, 0x4a, 0x03, 0x88, 0x08, 0x00, 0x00, 0x00, 0x10, + 0x42, 0x00, 0x60, 0x00, 0xfc, 0xf8, 0xff, 0xff, 0x42, 0x00, 0x68, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x44, + 0x5c, 0x00, 0x10, 0x00, 0x48, 0x0b, 0x88, 0x01, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x10, 0xb8, 0xc0, 0x50, 0x04, 0x00, 0x00, 0x48, 0x03, 0x88, 0x03, + 0x58, 0x04, 0x00, 0x01, 0x48, 0x03, 0x88, 0x04, 0x58, 0x04, 0x00, 0x02, + 0x48, 0x03, 0x88, 0x0b, 0x58, 0x04, 0x00, 0x03, 0x48, 0x03, 0x88, 0x8e, + 0x58, 0x04, 0x00, 0x04, 0x48, 0x03, 0x88, 0x8f, 0x58, 0x04, 0x00, 0x05, + 0x48, 0x03, 0x88, 0x90, 0x58, 0x04, 0x00, 0x06, 0x48, 0x03, 0x88, 0x91, + 0x58, 0x04, 0x00, 0x07, 0x48, 0x03, 0x88, 0x92, 0x58, 0x04, 0x00, 0x08, + 0x48, 0x03, 0x88, 0x93, 0x58, 0x04, 0x00, 0x09, 0x48, 0x03, 0x88, 0x99, + 0x58, 0x04, 0x00, 0x0a, 0x48, 0x03, 0x88, 0x9e, 0x58, 0x04, 0x00, 0x0b, + 0x48, 0x03, 0x88, 0xaa, 0x58, 0x04, 0x00, 0x0c, 0x48, 0x03, 0x88, 0xaf, + 0x58, 0x04, 0x00, 0x0d, 0x48, 0x03, 0x88, 0xb2, 0x58, 0x04, 0x00, 0x0e, + 0x48, 0x03, 0x88, 0xb1, 0x82, 0x04, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x41, 0xc4, 0x18, 0x00, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x50, 0x04, 0x00, 0x00, 0x48, 0x00, 0x18, 0x50, 0x80, 0x04, 0x08, 0x00, + 0x80, 0x0c, 0x18, 0x00, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xfb, + 0x41, 0xc4, 0x18, 0x00, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x50, 0x04, 0x00, 0x00, 0x48, 0x00, 0x18, 0x10, 0x80, 0x04, 0x08, 0x00, + 0x80, 0x0c, 0x18, 0x00, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xfb, + 0x49, 0x7b, 0x88, 0x30, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x50, 0x04, 0x00, 0x00, 0x48, 0x03, 0x88, 0x31, 0x80, 0x04, 0x08, 0x00, + 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xfc, 0x49, 0x7b, 0x88, 0xac, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x50, 0x04, 0x00, 0x00, + 0x48, 0x03, 0x88, 0xad, 0x80, 0x04, 0x08, 0x00, 0x80, 0x58, 0xb0, 0x40, + 0x04, 0x02, 0x07, 0xfc, 0x49, 0x7b, 0x88, 0x80, 0x41, 0x78, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0x36, 0x59, 0xc4, 0x08, 0xa4, + 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x0c, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x4a, 0x03, 0x88, 0x05, 0x04, 0x00, 0x00, 0x00, 0x5c, 0x00, 0xb0, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x4c, 0x58, 0x00, 0x00, + 0x4c, 0xe8, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x13, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x59, 0xc4, 0x10, 0x08, + 0x4c, 0x08, 0x00, 0x00, 0x82, 0x08, 0x05, 0x00, 0xff, 0xff, 0xff, 0x7f, + 0x48, 0x03, 0x88, 0x08, 0x59, 0xc4, 0x00, 0x04, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x3e, 0x02, 0x04, 0x00, 0x00, 0x05, 0x42, 0x01, 0xd0, 0x00, + 0x00, 0x00, 0x00, 0x14, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x78, + 0x59, 0xc4, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0xff, 0x0f, + 0x48, 0x03, 0x88, 0x06, 0x4a, 0x03, 0x88, 0x05, 0x00, 0x00, 0x00, 0x10, + 0x4a, 0x03, 0x88, 0x08, 0x00, 0x00, 0x00, 0x04, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x65, 0x59, 0xc4, 0x00, 0x05, 0x8c, 0x00, 0x05, 0x08, + 0x04, 0x02, 0x00, 0x12, 0x42, 0x01, 0xd0, 0x00, 0x00, 0x00, 0x03, 0xe8, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x78, 0x80, 0x58, 0xb0, 0x40, + 0x04, 0x02, 0x07, 0xf8, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x67, 0x25, + 0x4a, 0x03, 0x88, 0x08, 0x00, 0x00, 0x00, 0x08, 0x4a, 0x03, 0x50, 0x30, + 0x00, 0x00, 0x00, 0x01, 0x42, 0x02, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x30, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0a, 0x20, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x77, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0e, 0x3b, 0x49, 0x7b, 0x88, 0x80, + 0x59, 0xa8, 0x00, 0x27, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x4c, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0x36, + 0x5c, 0x00, 0x00, 0x00, 0x48, 0x03, 0x88, 0x80, 0x4a, 0x03, 0x88, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x65, + 0x4a, 0x03, 0x88, 0x05, 0x00, 0x00, 0x00, 0xf0, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x18, 0x92, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0x59, 0xc4, 0x00, 0x05, 0x80, 0x04, 0x0d, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x42, 0x01, 0xd0, 0x00, 0x00, 0x00, 0x03, 0xe8, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5c, 0x78, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xf2, + 0x04, 0x01, 0xf7, 0xd1, 0x59, 0xc4, 0x00, 0x06, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0xf0, 0x48, 0x03, 0x88, 0x06, 0x59, 0xa8, 0x00, 0x1d, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, + 0x48, 0x03, 0x88, 0x93, 0x80, 0x00, 0x05, 0x80, 0x5c, 0x00, 0x10, 0x00, + 0x4d, 0xf0, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0xbe, + 0x5c, 0x03, 0xe0, 0x00, 0x48, 0x0b, 0x88, 0x08, 0x5c, 0x01, 0xd0, 0x00, + 0x5c, 0x00, 0xb0, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x4c, 0x58, 0x00, 0x00, 0x4c, 0xe8, 0x00, 0x00, 0x59, 0xc4, 0x10, 0x08, + 0x82, 0x08, 0x05, 0x00, 0xff, 0xff, 0xff, 0x7f, 0x48, 0x03, 0x88, 0x08, + 0x4c, 0x08, 0x00, 0x00, 0x59, 0xc4, 0x00, 0x04, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x3e, 0x02, 0x04, 0x00, 0x00, 0x05, 0x42, 0x01, 0xd0, 0x00, + 0x00, 0x00, 0x00, 0x14, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x78, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0a, 0x20, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x78, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0e, 0x3b, 0x4a, 0x03, 0x88, 0x08, + 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x05, 0x80, 0x48, 0x03, 0x88, 0x80, + 0x48, 0x03, 0x88, 0x93, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0x36, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x03, 0x84, 0x4a, 0x03, 0x88, 0x05, + 0x00, 0x00, 0x00, 0xf0, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0x92, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x59, 0xc4, 0x00, 0x05, + 0x80, 0x04, 0x0d, 0x00, 0x04, 0x00, 0x00, 0x15, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xd0, 0x04, 0x02, 0x00, 0x12, 0x42, 0x01, 0xd0, 0x00, + 0x00, 0x00, 0x00, 0x67, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x78, + 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xef, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x67, 0x25, 0x4a, 0x03, 0x88, 0x08, 0x00, 0x00, 0x00, 0x08, + 0x4a, 0x03, 0x50, 0x30, 0x00, 0x00, 0x00, 0x01, 0x42, 0x02, 0xd8, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf0, 0x10, 0x49, 0x7b, 0x88, 0x80, 0x59, 0xa8, 0x00, 0x1d, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, + 0x48, 0x03, 0x88, 0x93, 0x59, 0xa8, 0x00, 0x27, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x4c, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x15, 0x36, 0x5c, 0x00, 0x00, 0x00, 0x48, 0x03, 0x88, 0x80, + 0x80, 0x00, 0x05, 0x80, 0x5c, 0x00, 0x10, 0x00, 0x4d, 0xf0, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0xbe, 0x5c, 0x03, 0xe0, 0x00, + 0x48, 0x0b, 0x88, 0x08, 0x5c, 0x01, 0xd0, 0x00, 0x5c, 0x00, 0xb0, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x59, 0xc4, 0x00, 0x04, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x3e, 0x02, 0x04, 0x00, 0x00, 0x0a, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x67, 0x25, 0x4a, 0x03, 0x88, 0x08, + 0x00, 0x00, 0x00, 0x08, 0x4a, 0x03, 0x50, 0x30, 0x00, 0x00, 0x00, 0x01, + 0x42, 0x02, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x4e, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0a, 0x20, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x79, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0e, 0x3b, 0x59, 0xc4, 0x00, 0x06, + 0x84, 0x00, 0x05, 0x08, 0x48, 0x03, 0x88, 0x06, 0x4a, 0x03, 0x88, 0x05, + 0x00, 0x00, 0x00, 0x10, 0x85, 0x0e, 0x1d, 0x4c, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x64, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x4b, 0xc8, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x4d, 0x4a, 0x03, 0x88, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x7b, 0x88, 0x80, 0x4a, 0x03, 0x88, 0x05, + 0x00, 0x00, 0x00, 0xf0, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0x92, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x59, 0xc4, 0x00, 0x05, + 0x80, 0x04, 0x0d, 0x00, 0x04, 0x00, 0x00, 0x0e, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0x04, 0x02, 0x00, 0x0b, 0x42, 0x01, 0xd0, 0x00, + 0x00, 0x00, 0x03, 0xe8, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x78, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5b, 0x22, 0x59, 0x94, 0x00, 0x04, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x07, 0xec, 0x04, 0x01, 0xf0, 0x21, + 0x4c, 0x08, 0x00, 0x00, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x4b, 0xd9, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5b, 0x6f, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x10, 0x4b, 0xc8, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x63, + 0x5c, 0x00, 0x10, 0x00, 0x49, 0x7b, 0x88, 0x80, 0x59, 0xa8, 0x00, 0x1d, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, + 0x48, 0x03, 0x88, 0x93, 0x59, 0xa8, 0x00, 0x27, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x4c, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x15, 0x36, 0x5c, 0x00, 0x00, 0x00, 0x48, 0x03, 0x88, 0x80, + 0x85, 0x0e, 0x1d, 0x0c, 0x59, 0xc4, 0x00, 0x06, 0x84, 0x00, 0x05, 0x48, + 0x48, 0x03, 0x88, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0xbe, + 0x4a, 0x03, 0x88, 0x08, 0x00, 0x00, 0x00, 0x80, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x4d, 0x40, 0x00, 0x00, 0x4d, 0x3c, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x67, 0x25, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x4c, 0x04, 0x02, 0x00, 0x22, 0x59, 0x9c, 0x10, 0x17, + 0x8d, 0x0e, 0x1d, 0x00, 0x04, 0x02, 0x00, 0x0b, 0x8c, 0x08, 0x15, 0x1a, + 0x04, 0x00, 0x00, 0x1d, 0x85, 0x0e, 0x1d, 0x42, 0x42, 0x02, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x42, 0x02, 0x78, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x02, 0x00, 0x07, 0x04, 0x01, 0xf0, 0x11, + 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x41, 0x7a, 0x78, 0x00, + 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x00, 0x00, 0x0c, 0x4d, 0x40, 0x00, 0x00, + 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x42, 0x02, 0x88, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9c, 0x1c, + 0x5c, 0x02, 0x80, 0x00, 0x59, 0x9c, 0x08, 0x17, 0x8c, 0x04, 0x0d, 0x0a, + 0x04, 0x02, 0x00, 0x05, 0x49, 0x43, 0xc8, 0x57, 0x49, 0x3f, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0x42, 0x49, 0x7b, 0x88, 0x80, + 0x42, 0x02, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xfc, 0xee, + 0x5c, 0x02, 0x78, 0x00, 0x5c, 0x02, 0x80, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0a, 0x20, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x7a, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0e, 0x3b, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0x36, + 0x4a, 0x03, 0x88, 0x80, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x18, 0xbe, 0x42, 0x02, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x7b, 0x30, 0x04, 0x4a, 0x03, 0xb0, 0x04, 0x60, 0x00, 0x00, 0x01, + 0x59, 0xd8, 0x00, 0x05, 0x4a, 0x03, 0xb0, 0x04, 0x90, 0x00, 0x00, 0x01, + 0x4a, 0x03, 0xa8, 0x04, 0x60, 0x00, 0x00, 0x01, 0x59, 0xd4, 0x00, 0x05, + 0x4a, 0x03, 0xa8, 0x04, 0x90, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x54, 0xfc, 0x4a, 0x03, 0xc8, 0x25, 0x00, 0x00, 0x00, 0x04, + 0x4a, 0x03, 0xc8, 0x27, 0x00, 0x00, 0x00, 0x04, 0x59, 0x9c, 0x04, 0x09, + 0x80, 0x00, 0x0d, 0x40, 0x04, 0x00, 0x00, 0x20, 0x59, 0x9c, 0x04, 0x07, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xcc, + 0x59, 0x9c, 0x10, 0x0b, 0x80, 0x08, 0x04, 0x00, 0x48, 0x03, 0xb0, 0x00, + 0x49, 0x7b, 0xb0, 0x02, 0x59, 0xd8, 0x00, 0x01, 0x59, 0x9c, 0x00, 0x0b, + 0x48, 0x03, 0xb0, 0x00, 0x59, 0x9c, 0x00, 0x0c, 0x48, 0x03, 0xb0, 0x01, + 0x59, 0x9c, 0x04, 0x07, 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x02, + 0x49, 0x7b, 0xb0, 0x02, 0x59, 0x9c, 0x0c, 0x09, 0x82, 0x04, 0x05, 0x40, + 0x00, 0x40, 0x00, 0x00, 0x48, 0x03, 0xb0, 0x03, 0x4a, 0x03, 0xb0, 0x09, + 0x00, 0x00, 0x00, 0x04, 0x4a, 0x03, 0xb0, 0x04, 0x10, 0x00, 0x00, 0x01, + 0x59, 0xe0, 0x08, 0x03, 0x82, 0x04, 0x0d, 0x00, 0xff, 0xff, 0xfe, 0xff, + 0x82, 0x04, 0x0d, 0x40, 0x00, 0x00, 0x80, 0x00, 0x48, 0x07, 0xc0, 0x03, + 0x59, 0x9c, 0x04, 0x0a, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x20, + 0x59, 0x9c, 0x04, 0x08, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x07, + 0x80, 0x00, 0x00, 0xcc, 0x59, 0x9c, 0x10, 0x0f, 0x80, 0x08, 0x04, 0x00, + 0x48, 0x03, 0xa8, 0x00, 0x49, 0x7b, 0xa8, 0x02, 0x59, 0xd4, 0x00, 0x01, + 0x59, 0x9c, 0x00, 0x0f, 0x48, 0x03, 0xa8, 0x00, 0x59, 0x9c, 0x00, 0x10, + 0x48, 0x03, 0xa8, 0x01, 0x59, 0x9c, 0x04, 0x08, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x02, 0x00, 0x02, 0x49, 0x7b, 0xa8, 0x02, 0x59, 0x9c, 0x0c, 0x0a, + 0x82, 0x04, 0x05, 0x40, 0x00, 0x40, 0x00, 0x00, 0x48, 0x03, 0xa8, 0x03, + 0x4a, 0x03, 0xa8, 0x09, 0x00, 0x00, 0x00, 0x04, 0x4a, 0x03, 0xa8, 0x04, + 0x10, 0x00, 0x00, 0x01, 0x59, 0xe0, 0x08, 0x03, 0x82, 0x04, 0x0d, 0x00, + 0xff, 0xff, 0xfb, 0xff, 0x82, 0x04, 0x0d, 0x40, 0x00, 0x00, 0x80, 0x00, + 0x48, 0x07, 0xc0, 0x03, 0x80, 0x04, 0x09, 0xc0, 0x04, 0x00, 0x00, 0x07, + 0x42, 0x02, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0xb8, 0x00, + 0x00, 0x02, 0x05, 0xa6, 0x02, 0x00, 0xf0, 0x00, 0x00, 0x02, 0x05, 0xbb, + 0x1c, 0x01, 0xf0, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0xf0, 0x00, 0x00, 0x42, 0x03, 0xe0, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x59, 0x98, 0x10, 0x03, 0x80, 0x08, 0x11, 0xc0, + 0x04, 0x00, 0x00, 0x1e, 0x58, 0x08, 0x00, 0x05, 0x82, 0x00, 0x0d, 0x00, + 0x43, 0x01, 0x87, 0x80, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x53, 0xc6, + 0x8c, 0x00, 0x05, 0x08, 0x04, 0x00, 0x00, 0x15, 0x58, 0x0a, 0x58, 0x08, + 0x59, 0x2c, 0x02, 0x04, 0x49, 0x7a, 0x58, 0x00, 0x49, 0x7a, 0x58, 0x01, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, 0x82, 0x00, 0x0c, 0x80, + 0x00, 0x00, 0x00, 0x4b, 0x04, 0x02, 0x10, 0x0b, 0x0c, 0x01, 0xf8, 0x0f, + 0x5c, 0x03, 0xe0, 0x00, 0x83, 0x70, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x07, 0xe6, 0x02, 0x00, 0xf8, 0x00, 0x00, 0x02, 0x05, 0xbb, + 0x02, 0x00, 0xb0, 0x00, 0x00, 0x02, 0x05, 0xa6, 0x1c, 0x01, 0xf0, 0x00, + 0x04, 0x01, 0xf8, 0x50, 0x5c, 0x03, 0xe0, 0x00, 0x04, 0x01, 0xf7, 0xf9, + 0x04, 0x01, 0xf8, 0xe2, 0x04, 0x01, 0xf7, 0xfd, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x1f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x9b, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x1f, 0x00, 0x10, 0x50, 0x1f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x49, 0x2f, 0xc8, 0x57, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x2d, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x04, 0x01, 0xf0, 0x19, 0x49, 0x2f, 0xc8, 0x57, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x2c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x04, 0x01, 0xf0, 0x11, + 0x49, 0x2f, 0xc8, 0x57, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x2b, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x00, 0x04, 0x01, 0xf0, 0x09, 0x49, 0x2f, 0xc8, 0x57, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x2e, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x01, 0xf0, 0x01, 0x48, 0x03, 0xc8, 0x57, 0x42, 0x02, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x59, 0x2c, 0x0c, 0x04, 0x82, 0x04, 0x0d, 0x00, + 0xff, 0xff, 0x80, 0xff, 0x80, 0x04, 0x05, 0x40, 0x48, 0x02, 0x5c, 0x04, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x49, 0x2f, 0xc8, 0x57, + 0x80, 0x14, 0x01, 0x10, 0x80, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x2d, + 0x04, 0x00, 0x17, 0xda, 0x4a, 0x03, 0x30, 0x06, 0x00, 0x10, 0x50, 0x69, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x05, 0x28, 0x49, 0x2f, 0xc8, 0x57, + 0x80, 0x14, 0x01, 0x10, 0x04, 0x00, 0x07, 0xd3, 0x80, 0x00, 0x00, 0x40, + 0x04, 0x00, 0x00, 0x3e, 0x4a, 0x03, 0x30, 0x06, 0x00, 0x10, 0x50, 0x84, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x05, 0x28, 0x49, 0x2f, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x4c, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x02, 0x05, 0x36, 0x49, 0x2f, 0xc8, 0x57, 0x59, 0x2e, 0x8a, 0x06, + 0x83, 0x44, 0x0c, 0x80, 0x00, 0x00, 0x07, 0xf0, 0x04, 0x02, 0x10, 0x0b, + 0x83, 0x44, 0x04, 0x00, 0x00, 0x10, 0xa4, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x80, 0x02, 0x6d, 0x40, 0x04, 0x00, 0x00, 0x06, 0x49, 0x37, 0xc8, 0x57, + 0x59, 0x34, 0x02, 0x00, 0x8c, 0x00, 0x05, 0x0e, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x02, 0x05, 0x36, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x28, + 0x41, 0x78, 0x08, 0x00, 0x41, 0x7a, 0x60, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4a, 0x8e, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x89, 0xe5, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x59, 0x2c, 0x0a, 0x0a, + 0x8c, 0x04, 0x0d, 0x02, 0x04, 0x02, 0x00, 0x15, 0x49, 0x2f, 0xc8, 0x57, + 0x8d, 0x0e, 0x1d, 0x0e, 0x04, 0x02, 0x00, 0x0f, 0x59, 0x2c, 0x02, 0x07, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x3f, 0xf4, 0x04, 0x02, 0x00, 0x04, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x2c, 0x0a, 0x06, + 0x48, 0x06, 0x5c, 0x06, 0x48, 0x02, 0x5a, 0x06, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, + 0x04, 0x01, 0xf7, 0xf9, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x62, 0x72, 0x59, 0x2c, 0x02, 0x08, + 0x49, 0x2f, 0xc8, 0x57, 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x19, 0x9a, + 0x04, 0x02, 0x17, 0x9f, 0x59, 0x2c, 0x04, 0x08, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x02, 0x07, 0x9c, 0x8d, 0x0e, 0x1d, 0x0e, 0x04, 0x02, 0x00, 0x09, + 0x59, 0x2c, 0x02, 0x07, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x07, 0x97, + 0x49, 0x7a, 0x5a, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x40, 0x52, + 0x04, 0x02, 0x00, 0x04, 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x28, 0x48, 0x02, 0x5a, 0x06, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x59, 0x98, 0x08, 0x02, 0x59, 0x98, 0x00, 0x00, + 0x48, 0x06, 0x58, 0x00, 0x49, 0x2c, 0x08, 0x01, 0x49, 0x2f, 0x30, 0x02, + 0x80, 0x00, 0x00, 0x40, 0x48, 0x03, 0x30, 0x00, 0x04, 0x00, 0x00, 0x02, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x9a, 0x58, 0x01, 0x59, 0x98, 0x00, 0x06, + 0x42, 0x02, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x01, 0xf8, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x2e, 0x8a, 0x06, 0x59, 0x2c, 0x04, 0x06, + 0x48, 0x03, 0xc8, 0x56, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x42, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x15, 0x41, 0x7a, 0x88, 0x00, + 0x42, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x05, 0x40, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x59, 0x2e, 0x8a, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x59, 0x2e, 0x90, 0x08, 0x59, 0x2e, 0x98, 0x09, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x44, 0x2d, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x85, 0x0e, 0x1d, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0x5a, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x45, 0x49, + 0x81, 0x46, 0x88, 0x00, 0x80, 0x5c, 0xb8, 0x40, 0x04, 0x02, 0x07, 0xfa, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x59, 0x2c, 0x0a, 0x08, + 0x48, 0x07, 0xc8, 0x57, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0e, + 0x04, 0x00, 0x00, 0x43, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x46, + 0x04, 0x00, 0x00, 0x44, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x45, + 0x04, 0x00, 0x00, 0x1e, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x29, + 0x04, 0x00, 0x00, 0x0e, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x2a, + 0x04, 0x00, 0x00, 0x09, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0f, + 0x04, 0x00, 0x01, 0xfb, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x2e, + 0x04, 0x00, 0x01, 0xf8, 0x48, 0x07, 0xc8, 0x56, 0x04, 0x01, 0xf1, 0xf1, + 0x85, 0x0e, 0x1d, 0x04, 0x04, 0x01, 0xf1, 0xf4, 0x59, 0x2e, 0x8a, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, 0x04, 0x02, 0x01, 0xf0, + 0x59, 0x34, 0x02, 0x00, 0x84, 0x00, 0x05, 0x18, 0x48, 0x02, 0x6a, 0x00, + 0x59, 0x2e, 0x60, 0x09, 0x49, 0x33, 0xc8, 0x57, 0x83, 0x30, 0x05, 0x80, + 0xff, 0xff, 0xff, 0xff, 0x04, 0x02, 0x00, 0x2a, 0x04, 0x01, 0xf1, 0xe7, + 0x59, 0x2c, 0x14, 0x07, 0x48, 0x0b, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8c, 0x55, 0x41, 0x1e, 0x60, 0x00, 0x04, 0x02, 0x00, 0x03, + 0x48, 0x03, 0xc8, 0x56, 0x04, 0x01, 0xf1, 0xda, 0x59, 0x2e, 0x38, 0x09, + 0x59, 0x1c, 0x14, 0x14, 0x84, 0x08, 0x15, 0x16, 0x84, 0x08, 0x15, 0x54, + 0x48, 0x0a, 0x3c, 0x14, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x3a, + 0x59, 0x2c, 0x04, 0x0b, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x07, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x3b, 0x59, 0x2c, 0x02, 0x0c, + 0x48, 0x02, 0x64, 0x1a, 0x59, 0x2c, 0x04, 0x0c, 0x48, 0x02, 0x62, 0x1a, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x08, 0x00, + 0x80, 0x00, 0x00, 0x40, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x5c, + 0x04, 0x01, 0xf1, 0xc8, 0x59, 0xa8, 0x00, 0x65, 0x84, 0x00, 0x05, 0x10, + 0x48, 0x03, 0x50, 0x65, 0x04, 0x01, 0xf1, 0xc4, 0x59, 0x2c, 0x12, 0x07, + 0x8c, 0x08, 0x15, 0x00, 0x04, 0x02, 0x01, 0xc1, 0x59, 0x2e, 0x8a, 0x06, + 0x59, 0x2e, 0x60, 0x09, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8c, 0x60, + 0x04, 0x02, 0x00, 0x03, 0x48, 0x03, 0xc8, 0x56, 0x04, 0x01, 0xf1, 0xb5, + 0x59, 0x30, 0x0c, 0x06, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x00, 0x00, 0x03, 0x48, 0x03, 0xc8, 0x56, 0x04, 0x01, 0xf1, 0xaf, + 0x59, 0x30, 0x0a, 0x03, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x07, + 0x04, 0x00, 0x00, 0x03, 0x48, 0x03, 0xc8, 0x56, 0x04, 0x01, 0xf1, 0xa9, + 0x59, 0x30, 0x0c, 0x03, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x00, 0x00, 0x25, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x00, 0x00, 0x1a, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x06, + 0x04, 0x00, 0x00, 0x24, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x08, + 0x04, 0x00, 0x00, 0x19, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0a, + 0x04, 0x00, 0x00, 0x0a, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0c, + 0x04, 0x00, 0x00, 0x04, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x2e, + 0x04, 0x02, 0x00, 0x1c, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x04, 0x01, 0xf0, 0x17, 0x59, 0x32, 0x68, 0x09, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x47, 0x2e, 0x04, 0x02, 0x00, 0x15, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x04, 0x01, 0xf0, 0x10, 0x41, 0x7a, 0x78, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0xa0, 0x4a, 0x02, 0x64, 0x06, + 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x01, 0xf0, 0x08, 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xca, 0xa0, 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x01, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x42, 0x6c, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0x39, 0x04, 0x01, 0xf1, 0x78, + 0x40, 0x00, 0x08, 0x00, 0x58, 0x04, 0x00, 0x00, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x02, 0x07, 0xfd, 0x49, 0x2c, 0x08, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x2f, 0xc8, 0x57, 0x59, 0x30, 0x0c, 0x06, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x06, 0x04, 0x02, 0x00, 0x94, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x47, 0x19, 0x04, 0x02, 0x00, 0x05, 0x59, 0x34, 0x02, 0x00, + 0x8c, 0x00, 0x05, 0x1a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0x89, + 0x59, 0x34, 0x02, 0x00, 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x00, 0x00, 0x8a, + 0x59, 0x30, 0x02, 0x03, 0x42, 0x02, 0x78, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x07, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x02, 0x05, 0x89, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x05, 0x89, 0x42, 0x02, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x4a, 0x02, 0x62, 0x06, 0x00, 0x00, 0x00, 0x14, + 0x4d, 0x2c, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9a, 0x5d, + 0x5c, 0x02, 0x58, 0x00, 0x59, 0x30, 0x0c, 0x06, 0x48, 0x07, 0xc8, 0x57, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x07, 0x04, 0x02, 0x00, 0x63, + 0x49, 0x2f, 0xc8, 0x57, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x59, 0x2c, 0x24, 0x0a, + 0x49, 0x2f, 0xc8, 0x57, 0x48, 0x13, 0xc8, 0x57, 0x8c, 0x10, 0x25, 0x1c, + 0x04, 0x02, 0x00, 0x16, 0x8c, 0x10, 0x25, 0x1a, 0x04, 0x00, 0x00, 0x03, + 0x8c, 0x10, 0x25, 0x0a, 0x04, 0x00, 0x00, 0x69, 0x59, 0x34, 0x0a, 0x00, + 0x8c, 0x04, 0x0d, 0x0e, 0x04, 0x00, 0x00, 0x03, 0x8c, 0x10, 0x25, 0x1e, + 0x04, 0x00, 0x00, 0x64, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, + 0x04, 0x00, 0x00, 0x6b, 0x59, 0x2c, 0x24, 0x0a, 0x49, 0x36, 0x60, 0x09, + 0x49, 0x32, 0x58, 0x09, 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x06, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x07, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x05, 0x86, 0x59, 0x2c, 0x0a, 0x0c, 0x59, 0x34, 0x00, 0x0f, + 0x41, 0x78, 0x40, 0x00, 0x80, 0x00, 0x15, 0x40, 0x04, 0x00, 0x00, 0x6d, + 0x58, 0x08, 0x02, 0x04, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x12, 0x04, 0x02, 0x00, 0x04, + 0x58, 0x08, 0x02, 0x0c, 0x80, 0x04, 0x05, 0x80, 0x04, 0x00, 0x00, 0x04, + 0x58, 0x08, 0x00, 0x00, 0x40, 0x08, 0x40, 0x00, 0x04, 0x01, 0xf7, 0xf3, + 0x58, 0x08, 0x00, 0x00, 0x49, 0x78, 0x10, 0x00, 0x80, 0x20, 0x41, 0xc0, + 0x04, 0x00, 0x00, 0x06, 0x48, 0x00, 0x40, 0x00, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x02, 0x00, 0x07, 0x48, 0x22, 0x68, 0x10, 0x04, 0x01, 0xf0, 0x05, + 0x48, 0x02, 0x68, 0x0f, 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x02, + 0x49, 0x7a, 0x68, 0x10, 0x4d, 0x2c, 0x00, 0x00, 0x40, 0x0a, 0x58, 0x00, + 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x5c, 0x02, 0x58, 0x00, 0x04, 0x01, 0xf7, 0xbc, + 0x59, 0x2c, 0x04, 0x0a, 0x8c, 0x00, 0x05, 0x1c, 0x04, 0x00, 0x00, 0x16, + 0x59, 0x2c, 0x02, 0x06, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0xff, 0xff, + 0x04, 0x02, 0x00, 0x12, 0x59, 0x2e, 0x60, 0x09, 0x83, 0x30, 0x05, 0x80, + 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x07, 0xb1, 0x83, 0x30, 0x04, 0x80, + 0x00, 0x10, 0xd8, 0xd4, 0x04, 0x00, 0x10, 0x10, 0x59, 0xa8, 0x00, 0x0a, + 0x81, 0x30, 0x04, 0x80, 0x04, 0x02, 0x10, 0x0d, 0x59, 0x30, 0x00, 0x08, + 0x80, 0x00, 0x01, 0xc0, 0x04, 0x02, 0x00, 0x05, 0x59, 0x30, 0x02, 0x03, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x07, 0x04, 0x00, 0x07, 0x97, + 0x49, 0x2f, 0xc8, 0x57, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x29, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x49, 0x2f, 0xc8, 0x57, + 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x08, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x49, 0x2f, 0xc8, 0x57, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x00, 0x45, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x49, 0x2f, 0xc8, 0x57, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x2a, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x49, 0x2f, 0xc8, 0x57, + 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x28, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x49, 0x2f, 0xc8, 0x57, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x00, 0x06, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x49, 0x2f, 0xc8, 0x57, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x0e, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x59, 0x34, 0x00, 0x10, + 0x49, 0x2e, 0x68, 0x10, 0x49, 0x2f, 0xc8, 0x57, 0x80, 0x00, 0x0d, 0x40, + 0x04, 0x00, 0x00, 0x03, 0x49, 0x2c, 0x08, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x34, 0x04, 0x0b, 0x49, 0x2e, 0x68, 0x0f, 0x49, 0x2f, 0xc8, 0x57, + 0x48, 0x03, 0xc8, 0x57, 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x03, + 0x4a, 0x02, 0x6a, 0x03, 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0xa8, 0x00, 0x0d, 0x81, 0x64, 0x04, 0x80, 0x04, 0x02, 0x17, 0x6e, + 0x42, 0x02, 0x60, 0x00, 0x00, 0x10, 0xd8, 0xd4, 0x59, 0x30, 0x00, 0x09, + 0x81, 0x34, 0x05, 0x80, 0x04, 0x02, 0x00, 0x04, 0x59, 0x30, 0x02, 0x02, + 0x80, 0x04, 0x05, 0x80, 0x04, 0x00, 0x07, 0x59, 0x83, 0x32, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x24, 0x41, 0x58, 0x00, 0x00, 0x81, 0x30, 0x04, 0x80, + 0x04, 0x00, 0x17, 0xf6, 0x04, 0x01, 0xf7, 0x60, 0x49, 0x2f, 0xc8, 0x57, + 0x59, 0x2c, 0x04, 0x07, 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x19, 0x9a, + 0x04, 0x02, 0x15, 0xec, 0x59, 0x2c, 0x02, 0x04, 0x80, 0x00, 0x01, 0x12, + 0x04, 0x02, 0x05, 0xd9, 0x59, 0x2e, 0x8a, 0x06, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0x5a, 0x04, 0x02, 0x00, 0x58, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x47, 0x19, 0x04, 0x02, 0x00, 0x58, 0x59, 0x2e, 0x78, 0x0a, + 0x49, 0x3f, 0xc8, 0x57, 0x8d, 0x3e, 0x7d, 0x3e, 0x04, 0x02, 0x00, 0x06, + 0x8d, 0x0e, 0x1d, 0x0e, 0x04, 0x02, 0x00, 0x4f, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x45, 0x55, 0x04, 0x00, 0x05, 0xd9, 0x83, 0x3c, 0x1d, 0x00, + 0x00, 0x00, 0x00, 0x1f, 0x04, 0x00, 0x05, 0xd6, 0x59, 0x2c, 0x02, 0x07, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x10, 0x00, 0x04, 0x02, 0x15, 0xd2, + 0x80, 0x00, 0x00, 0xc2, 0x80, 0x00, 0x08, 0xc4, 0x80, 0x05, 0xd4, 0x00, + 0x59, 0x2e, 0x90, 0x08, 0x59, 0x2e, 0x98, 0x09, 0x59, 0x34, 0x08, 0x0d, + 0x80, 0x04, 0x09, 0xc0, 0x04, 0x02, 0x00, 0x2e, 0x83, 0x3c, 0x1d, 0x00, + 0x00, 0x00, 0x00, 0x1f, 0x81, 0x78, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x0c, 0x19, 0x02, 0x04, 0x02, 0x17, 0xfe, 0x04, 0x02, 0x05, 0xc3, + 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x52, 0x6b, 0x00, 0x10, 0x52, 0x6e, + 0x00, 0x10, 0x52, 0x7b, 0x00, 0x10, 0x52, 0x7e, 0x00, 0x10, 0x52, 0x81, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x4d, 0x04, 0x01, 0xf0, 0x1a, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x45, 0x27, 0x04, 0x00, 0x00, 0x27, + 0x80, 0xe9, 0xd1, 0xc0, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x5b, 0x8d, + 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x05, 0x41, 0x7a, 0x90, 0x00, + 0x41, 0x7a, 0x98, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x5d, + 0x04, 0x01, 0xf0, 0x0d, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x04, 0x01, 0xf0, 0x06, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4e, + 0x04, 0x01, 0xf0, 0x03, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x52, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x43, 0xe3, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x88, 0x8f, 0x04, 0x00, 0x00, 0x10, 0x8d, 0x3e, 0x7d, 0x3e, + 0x04, 0x02, 0x00, 0x17, 0x1c, 0x01, 0xf0, 0x00, 0x58, 0x04, 0x00, 0x02, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x07, 0x4d, 0x3c, 0x00, 0x00, + 0x40, 0x06, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x45, 0x07, + 0x5c, 0x02, 0x78, 0x00, 0x04, 0x02, 0x07, 0xcb, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x00, 0x30, 0x04, 0x01, 0xf0, 0x0d, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x00, 0x2c, 0x04, 0x01, 0xf0, 0x0a, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x00, 0x28, 0x04, 0x01, 0xf0, 0x07, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x00, 0x29, 0x04, 0x01, 0xf0, 0x04, 0x49, 0x7a, 0x58, 0x09, + 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x02, 0x5a, 0x04, + 0x00, 0x00, 0x01, 0x03, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x49, 0x2f, 0xc8, 0x57, 0x80, 0x14, 0x01, 0x10, 0x80, 0x00, 0x00, 0x40, + 0x04, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf5, 0x6c, 0x59, 0x2c, 0x02, 0x07, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0xff, 0x48, 0x02, 0x5a, 0x07, + 0x8c, 0x00, 0x05, 0x06, 0x04, 0x00, 0x00, 0x04, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x70, 0x04, 0x02, 0x00, 0x03, 0x8d, 0x0e, 0x1d, 0x0e, + 0x04, 0x02, 0x00, 0x18, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0xde, 0xad, + 0x59, 0x2c, 0x04, 0x08, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0xf0, 0xff, + 0x48, 0x02, 0x5c, 0x08, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x40, 0x80, + 0x04, 0x02, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x42, 0x5a, 0x06, + 0x80, 0x58, 0xb1, 0xc0, 0x04, 0x00, 0x00, 0x09, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8d, 0xa5, 0x04, 0x01, 0xf8, 0x0f, 0x44, 0x04, 0x28, 0x00, + 0x82, 0x58, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, 0x04, 0x02, 0x00, 0x02, + 0x48, 0x08, 0x28, 0x01, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x31, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf7, 0xed, 0x59, 0x2c, 0x04, 0x08, 0x80, 0x00, 0x01, 0x18, + 0x83, 0x2c, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x09, 0x80, 0x14, 0x2c, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x2f, 0xc8, 0x57, 0x4a, 0x02, 0x5a, 0x08, + 0x00, 0x00, 0x00, 0x06, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x49, 0x2f, 0xc8, 0x57, 0x4a, 0x02, 0x5a, 0x08, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x49, 0x2f, 0xc8, 0x57, + 0x59, 0x2c, 0x04, 0x0a, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x00, 0x20, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, + 0x04, 0x00, 0x00, 0x21, 0x59, 0x2c, 0x02, 0x04, 0x49, 0x2e, 0x60, 0x08, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x45, 0x04, 0x00, 0x00, 0x0e, 0x59, 0x2c, 0x00, 0x0b, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x58, 0x54, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x02, 0x02, 0x5a, 0x04, 0x02, 0x00, 0x18, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x41, 0x49, 0x36, 0x60, 0x09, 0x4a, 0x02, 0x64, 0x06, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xdf, + 0x59, 0x30, 0x00, 0x15, 0x84, 0x00, 0x05, 0x5e, 0x48, 0x02, 0x60, 0x15, + 0x42, 0x02, 0x68, 0x00, 0x00, 0x10, 0xac, 0xf1, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x04, 0x01, 0xf7, 0xf4, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x01, 0x01, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x2c, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x28, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x49, 0x2f, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5e, 0xd1, 0x04, 0x00, 0x00, 0x0b, 0x59, 0x2c, 0x02, 0x04, + 0x80, 0x00, 0x01, 0x10, 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x04, 0xf9, + 0x59, 0x2c, 0x0c, 0x06, 0x80, 0x04, 0x09, 0xc0, 0x04, 0x00, 0x00, 0x09, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x01, 0xf0, 0x03, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x48, 0x02, 0x5a, 0x06, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x59, 0x2c, 0x0c, 0x07, + 0x80, 0x04, 0x09, 0xc0, 0x04, 0x00, 0x00, 0x24, 0x82, 0x04, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x05, 0x04, 0x02, 0x10, 0x21, 0x4c, 0x04, 0x00, 0x00, + 0x80, 0x04, 0x08, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5e, 0xf6, + 0x5c, 0x00, 0x10, 0x00, 0x04, 0x02, 0x00, 0x18, 0x83, 0x2c, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0xa0, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5f, 0x1f, 0x04, 0x02, 0x00, 0x12, 0x59, 0x2c, 0x12, 0x07, + 0x82, 0xcc, 0x05, 0x80, 0x00, 0x10, 0xac, 0xdb, 0x04, 0x02, 0x00, 0x09, + 0x58, 0xc8, 0x0c, 0x0b, 0x84, 0x04, 0x0d, 0x00, 0x84, 0x04, 0x0d, 0x02, + 0x8c, 0x08, 0x15, 0x00, 0x04, 0x00, 0x00, 0x02, 0x84, 0x04, 0x0d, 0x5e, + 0x48, 0x05, 0x94, 0x0b, 0x04, 0x01, 0xf0, 0x01, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x02, 0x5a, 0x06, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, + 0x04, 0x01, 0xf7, 0xfb, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x04, 0x01, 0xf7, 0xf8, 0x49, 0x2f, 0xc8, 0x57, 0x59, 0x2e, 0x7c, 0x06, + 0x83, 0x3c, 0x05, 0x00, 0xff, 0xff, 0xff, 0xfe, 0x04, 0x02, 0x00, 0x43, + 0x59, 0x2c, 0x40, 0x07, 0x42, 0x02, 0x60, 0x00, 0x00, 0x10, 0xd8, 0xd4, + 0x41, 0x58, 0x18, 0x00, 0x40, 0x0c, 0x00, 0x00, 0x81, 0x30, 0x04, 0x80, + 0x04, 0x02, 0x10, 0x23, 0x59, 0x30, 0x02, 0x03, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x59, 0x30, 0x00, 0x08, + 0x80, 0x00, 0x0d, 0x40, 0x04, 0x00, 0x00, 0x04, 0x58, 0x04, 0x00, 0x05, + 0x80, 0x20, 0x05, 0x80, 0x04, 0x00, 0x00, 0x04, 0x83, 0x32, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x24, 0x04, 0x01, 0xf7, 0xf1, 0x58, 0x04, 0x02, 0x04, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x53, 0x04, 0x00, 0x00, 0x07, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x48, 0x04, 0x00, 0x00, 0x04, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x18, 0x04, 0x02, 0x00, 0x23, 0x4d, 0x2c, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x83, 0xe0, 0x5c, 0x02, 0x58, 0x00, + 0x04, 0x00, 0x00, 0x1e, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x59, 0x2e, 0x8a, 0x06, + 0x83, 0x44, 0x04, 0x80, 0x00, 0x00, 0x07, 0xf0, 0x04, 0x02, 0x10, 0x16, + 0x83, 0x44, 0x04, 0x00, 0x00, 0x10, 0xa4, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x80, 0x02, 0x6d, 0x40, 0x04, 0x00, 0x00, 0x11, 0x4d, 0x2c, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x44, 0xe7, 0x04, 0x00, 0x00, 0x0c, + 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x05, 0x59, 0x2c, 0x0a, 0x08, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4a, 0x8e, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x89, 0xeb, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x5c, 0x02, 0x58, 0x00, 0x04, 0x01, 0xf7, 0xe5, 0x5c, 0x02, 0x58, 0x00, + 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x31, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x49, 0x2f, 0xc8, 0x57, 0x4d, 0x2c, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x1a, 0x04, 0x00, 0x00, 0x16, + 0x49, 0x2f, 0xc8, 0x57, 0x41, 0x2f, 0x40, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x07, 0x1a, 0x04, 0x00, 0x00, 0x0e, 0x49, 0x2f, 0xc8, 0x57, + 0x41, 0x2d, 0xd8, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x37, 0xda, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x37, 0xe4, 0x49, 0xa1, 0xd8, 0x0b, + 0x5c, 0x02, 0x58, 0x00, 0x49, 0x2d, 0xd8, 0x0a, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x1d, 0xe3, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1e, 0x02, + 0x41, 0xa2, 0x58, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x2e, + 0x5c, 0x02, 0x58, 0x00, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x40, 0x05, + 0x4a, 0x02, 0x5c, 0x06, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x48, 0x07, 0xc8, 0x57, 0x48, 0x5f, 0xc8, 0x57, + 0x42, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x5c, 0x00, 0x08, 0x00, + 0x4c, 0x5c, 0x00, 0x00, 0x04, 0x01, 0xf0, 0x05, 0x48, 0x07, 0xc8, 0x57, + 0x48, 0x5f, 0xc8, 0x57, 0x5c, 0x00, 0x08, 0x00, 0x4d, 0x78, 0x00, 0x00, + 0x48, 0x03, 0xc8, 0x57, 0x49, 0x2f, 0xc8, 0x57, 0x8c, 0x00, 0x05, 0x0e, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xe4, 0x42, 0x03, 0xe0, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x42, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x80, 0x03, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x04, 0xf4, 0x80, 0x14, 0x01, 0x10, + 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x04, 0x40, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x47, 0x72, 0x04, 0x02, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x42, 0x5a, 0x06, 0x48, 0x06, 0x58, 0x0d, 0x48, 0x0a, 0x58, 0x0e, + 0x49, 0x43, 0xc8, 0x57, 0x48, 0x07, 0xc8, 0x57, 0x48, 0x0b, 0xc8, 0x57, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x80, 0x14, 0x01, 0x10, + 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x04, 0x31, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x48, 0xd8, 0x04, 0x02, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x42, 0x5a, 0x06, 0x48, 0x06, 0x58, 0x11, 0x48, 0x0a, 0x58, 0x12, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x80, 0x14, 0x01, 0x10, + 0x04, 0x00, 0x04, 0x26, 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x00, 0x0c, + 0x42, 0x02, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x59, 0x2c, 0x02, 0x0a, + 0x8c, 0x00, 0x05, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0x2e, + 0x59, 0x2c, 0x02, 0x07, 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x10, 0x01, + 0x04, 0x02, 0x14, 0x2a, 0x04, 0x01, 0xf0, 0x05, 0x4a, 0x03, 0x30, 0x06, + 0x00, 0x02, 0x05, 0x2e, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x05, 0x28, + 0x42, 0x02, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb6, 0xa9, 0x50, 0x00, 0x70, 0x00, 0x49, 0x2c, 0x70, 0x0b, + 0x49, 0x78, 0x70, 0x0e, 0x49, 0x78, 0x70, 0x0c, 0x59, 0x2c, 0x00, 0x11, + 0x59, 0x2c, 0x08, 0x12, 0x48, 0x00, 0x70, 0x07, 0x48, 0x04, 0x70, 0x08, + 0x59, 0x2c, 0x10, 0x13, 0x82, 0x08, 0x05, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x49, 0x78, 0x70, 0x0d, 0x82, 0x08, 0x04, 0x80, 0x00, 0x00, 0x01, 0x80, + 0x48, 0x03, 0xc8, 0x57, 0x04, 0x00, 0x10, 0x07, 0x48, 0x00, 0x70, 0x0f, + 0x4a, 0x00, 0x70, 0x05, 0x00, 0x00, 0x01, 0x80, 0x4a, 0x00, 0x70, 0x04, + 0x00, 0x00, 0x00, 0x60, 0x04, 0x01, 0xf0, 0x05, 0x49, 0x78, 0x70, 0x0f, + 0x48, 0x08, 0x70, 0x05, 0x80, 0x08, 0x11, 0x04, 0x48, 0x08, 0x70, 0x04, + 0x58, 0x38, 0x00, 0x0a, 0x48, 0x00, 0x70, 0x03, 0x40, 0x38, 0x10, 0x00, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x07, 0x9e, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x07, 0x04, 0x04, 0x00, 0x00, 0x03, 0x59, 0x98, 0x00, 0x05, + 0x08, 0x01, 0xf8, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x40, 0x30, 0x70, 0x00, + 0x58, 0x38, 0x00, 0x0b, 0x80, 0x02, 0x5d, 0x40, 0x04, 0x00, 0x00, 0x1b, + 0x58, 0x38, 0x00, 0x02, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x01, 0x00, + 0x04, 0x00, 0x00, 0x1d, 0x4c, 0x38, 0x00, 0x00, 0x59, 0x2c, 0x02, 0x04, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x12, 0x04, 0x00, 0x00, 0x0b, 0x59, 0x2c, 0x02, 0x08, + 0x84, 0x00, 0x05, 0x4e, 0x48, 0x02, 0x5a, 0x08, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x00, 0x02, 0x4a, 0x02, 0x5a, 0x04, 0x00, 0x00, 0x01, 0x03, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x04, 0x01, 0xf0, 0x05, + 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x10, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x5c, 0x00, 0x70, 0x00, 0x42, 0x02, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x4a, 0x00, 0x70, 0x02, 0x00, 0x00, 0x01, 0x00, + 0x49, 0x78, 0x70, 0x10, 0x1c, 0x01, 0xf0, 0x00, 0x58, 0x38, 0x00, 0x04, + 0x82, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x87, + 0x58, 0x38, 0x00, 0x10, 0x8c, 0x00, 0x05, 0x00, 0x04, 0x02, 0x00, 0x19, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x83, 0x2c, 0xac, 0x00, + 0x00, 0x00, 0x00, 0x11, 0x58, 0x38, 0x00, 0x0a, 0x58, 0x38, 0x10, 0x0d, + 0x80, 0x08, 0xa4, 0x00, 0x4c, 0x38, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x30, 0x5c, 0x00, 0x70, 0x00, 0x58, 0x38, 0x00, 0x0d, + 0x82, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0x48, 0x00, 0x70, 0x0d, + 0x4a, 0x00, 0x70, 0x10, 0x00, 0x00, 0x00, 0x01, 0x58, 0x38, 0x00, 0x04, + 0x82, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x03, 0x48, 0x00, 0x70, 0x04, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x6c, + 0x58, 0x38, 0x00, 0x0e, 0x80, 0x00, 0x1d, 0x40, 0x04, 0x02, 0x00, 0x20, + 0x4c, 0x38, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x04, + 0x5c, 0x00, 0x70, 0x00, 0x04, 0x00, 0x00, 0x10, 0x4a, 0x02, 0x5a, 0x04, + 0x00, 0x00, 0x01, 0x0a, 0x42, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x48, 0x0c, 0x70, 0x0e, 0x58, 0x38, 0x00, 0x0c, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x02, 0x00, 0x02, 0x58, 0x38, 0x00, 0x0b, 0x40, 0x00, 0x08, 0x00, + 0x49, 0x2c, 0x08, 0x01, 0x49, 0x2c, 0x70, 0x0c, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x04, 0x01, 0xf0, 0x11, 0x42, 0x02, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x4a, 0x03, 0x30, 0x05, 0x00, 0x10, 0x54, 0x8e, + 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x02, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb6, 0xa9, 0x50, 0x00, 0x70, 0x00, + 0x04, 0x01, 0xf7, 0xe7, 0x58, 0x3a, 0x58, 0x0c, 0x40, 0x0c, 0x00, 0x00, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x14, 0x80, 0x04, 0x0c, 0x80, + 0x58, 0x38, 0x10, 0x04, 0x58, 0x38, 0x00, 0x0f, 0x41, 0x78, 0x30, 0x00, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x05, 0x84, 0x18, 0x35, 0x40, + 0x82, 0x08, 0x14, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x3c, + 0x40, 0x08, 0x00, 0x00, 0x80, 0x04, 0x04, 0x80, 0x04, 0x00, 0x10, 0x02, + 0x40, 0x08, 0x08, 0x00, 0x40, 0x04, 0xb0, 0x00, 0x41, 0x2c, 0x00, 0x00, + 0x80, 0x0c, 0x04, 0x00, 0x40, 0x00, 0xa8, 0x00, 0x58, 0x38, 0x00, 0x0a, + 0x58, 0x38, 0x10, 0x0d, 0x80, 0x08, 0xa4, 0x00, 0x4c, 0x08, 0x00, 0x00, + 0x4c, 0x04, 0x00, 0x00, 0x4c, 0x0c, 0x00, 0x00, 0x4c, 0x38, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, 0x5c, 0x00, 0x70, 0x00, + 0x5c, 0x00, 0x18, 0x00, 0x5c, 0x00, 0x08, 0x00, 0x40, 0x04, 0x00, 0x00, + 0x58, 0x38, 0x10, 0x04, 0x80, 0x08, 0x04, 0x80, 0x48, 0x00, 0x70, 0x04, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x02, + 0x84, 0x18, 0x35, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x80, 0x04, 0x14, 0x00, + 0x82, 0x08, 0x04, 0x80, 0x00, 0x00, 0x00, 0x60, 0x04, 0x02, 0x00, 0x03, + 0x84, 0x18, 0x35, 0x42, 0x41, 0x78, 0x10, 0x00, 0x40, 0x0c, 0x00, 0x00, + 0x80, 0x04, 0x1c, 0x00, 0x82, 0x0c, 0x04, 0x80, 0x00, 0x00, 0x00, 0x14, + 0x04, 0x02, 0x00, 0x03, 0x84, 0x18, 0x35, 0x44, 0x40, 0x00, 0x18, 0x00, + 0x40, 0x08, 0x08, 0x00, 0x48, 0x04, 0x70, 0x0d, 0x48, 0x0c, 0x70, 0x0e, + 0x40, 0x18, 0x00, 0x00, 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x54, 0xd9, + 0x00, 0x10, 0x54, 0xdd, 0x00, 0x10, 0x54, 0xdb, 0x00, 0x10, 0x54, 0xd9, + 0x00, 0x10, 0x54, 0x75, 0x00, 0x10, 0x54, 0xdd, 0x00, 0x10, 0x54, 0xdb, + 0x00, 0x10, 0x54, 0xd9, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x58, 0x38, 0x10, 0x0f, 0x04, 0x01, 0xf7, 0x39, 0x58, 0x38, 0x08, 0x0d, + 0x82, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x58, 0x38, 0x10, 0x0a, + 0x80, 0x08, 0x04, 0x00, 0x50, 0x00, 0x10, 0x00, 0x80, 0x08, 0x11, 0xc0, + 0x04, 0x02, 0x00, 0x0f, 0x42, 0x02, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x58, 0x3a, 0x58, 0x0b, 0x49, 0x78, 0x70, 0x0b, 0x49, 0x78, 0x70, 0x10, + 0x59, 0x2c, 0x02, 0x04, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x12, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x05, 0x5e, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x05, 0x2e, + 0x58, 0x38, 0x00, 0x0a, 0x80, 0x04, 0x0c, 0x00, 0x82, 0x38, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x54, 0x04, 0x18, 0x00, 0x80, 0x04, 0x08, 0x00, + 0x80, 0x0c, 0x18, 0x00, 0x54, 0x04, 0x18, 0x00, 0x04, 0x01, 0xf7, 0x1a, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x04, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x4a, 0x02, 0x58, 0x0a, 0x00, 0x10, 0xb6, 0x48, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x10, 0xb6, 0xa9, 0x45, 0x2c, 0x08, 0x00, + 0x49, 0x7a, 0x58, 0x0b, 0x49, 0x7a, 0x58, 0x0c, 0x49, 0x7a, 0x58, 0x0d, + 0x49, 0x7a, 0x58, 0x0e, 0x49, 0x7a, 0x58, 0x0f, 0x4a, 0x02, 0x58, 0x09, + 0x00, 0x10, 0x54, 0x2f, 0x49, 0x7a, 0x58, 0x10, 0x4a, 0x02, 0x58, 0x02, + 0x00, 0x00, 0x01, 0x00, 0x4a, 0x02, 0x58, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xc8, 0x00, 0x07, 0x8c, 0x00, 0x05, 0x02, + 0x04, 0x00, 0x00, 0x71, 0x83, 0x5c, 0x2c, 0x80, 0x00, 0x00, 0x00, 0x05, + 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x5a, 0xfd, 0x59, 0xc8, 0x28, 0x17, + 0x48, 0x17, 0x50, 0x6b, 0x49, 0x7b, 0x90, 0x05, 0x82, 0x14, 0x05, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x04, 0x02, 0x00, 0x4f, 0x82, 0x14, 0x05, 0x00, + 0x00, 0x00, 0x03, 0xff, 0x82, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x41, 0xcc, 0x20, 0x00, 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x60, 0x80, + 0x82, 0x0c, 0x04, 0x80, 0x00, 0x00, 0x00, 0x40, 0x04, 0x00, 0x10, 0x06, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x82, 0x0c, 0x1c, 0x80, + 0x00, 0x00, 0x00, 0x40, 0x04, 0x01, 0xf0, 0x03, 0x40, 0x0c, 0x10, 0x00, + 0x41, 0x78, 0x18, 0x00, 0x54, 0x18, 0x20, 0x00, 0x80, 0x10, 0x20, 0x00, + 0x80, 0x18, 0x30, 0x00, 0x80, 0x08, 0x10, 0x40, 0x04, 0x02, 0x07, 0xfc, + 0x80, 0x0c, 0x19, 0xc0, 0x04, 0x00, 0x00, 0x05, 0x59, 0xc8, 0x00, 0x05, + 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x90, 0x05, 0x04, 0x01, 0xf7, 0xea, + 0x82, 0x14, 0x05, 0x00, 0x01, 0xf6, 0x00, 0x00, 0x04, 0x02, 0x00, 0x29, + 0x82, 0x14, 0x05, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x04, 0x00, 0x00, 0x0b, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x20, 0x00, 0x04, 0x02, 0x10, 0x0f, + 0x4a, 0x03, 0x90, 0x05, 0x00, 0x00, 0x01, 0x40, 0x82, 0x14, 0x05, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x32, 0x0c, 0x01, 0xf8, 0x3e, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xcc, 0x04, 0x00, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x81, 0x00, + 0x04, 0x00, 0x07, 0xf4, 0x04, 0x01, 0xf0, 0x1c, 0x48, 0x17, 0xc8, 0x57, + 0x82, 0x14, 0x05, 0x00, 0x00, 0x00, 0x03, 0xff, 0x04, 0x02, 0x00, 0x07, + 0x59, 0xcc, 0x04, 0x00, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x81, 0x00, 0x04, 0x02, 0x00, 0x12, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x8c, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x59, 0xcd, + 0x48, 0x03, 0xc8, 0x56, 0x4a, 0x03, 0x90, 0x05, 0x00, 0x00, 0x01, 0x40, + 0x04, 0x01, 0xf0, 0x20, 0x48, 0x17, 0xc8, 0x57, 0x82, 0x14, 0x05, 0x00, + 0x00, 0xf6, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5a, 0x09, 0x04, 0x02, 0x07, 0xd2, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x00, 0x00, 0x10, 0x59, 0xc4, 0x00, 0xa4, + 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x02, 0x00, 0x09, + 0x49, 0x7b, 0x50, 0x15, 0x59, 0xc4, 0x00, 0xa3, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x08, 0x00, 0x00, 0x48, 0x03, 0x88, 0xa3, 0x82, 0x00, 0x05, 0x00, + 0xff, 0xf7, 0xff, 0xff, 0x48, 0x03, 0x88, 0xa3, 0x48, 0x17, 0xc8, 0x56, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa1, 0x90, 0x4a, 0x03, 0x90, 0x05, + 0x00, 0x00, 0x01, 0x40, 0x04, 0x01, 0xf8, 0x42, 0x48, 0x03, 0xc8, 0x56, + 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x55, 0x97, 0x00, 0x10, 0x58, 0xae, + 0x00, 0x10, 0x55, 0x8f, 0x00, 0x10, 0x55, 0x8f, 0x00, 0x10, 0x55, 0x8f, + 0x00, 0x10, 0x55, 0x8f, 0x00, 0x10, 0x55, 0x8f, 0x00, 0x10, 0x55, 0x8f, + 0x48, 0x03, 0xc8, 0x57, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x29, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x4a, 0x03, 0x90, 0x05, + 0x00, 0x00, 0x01, 0x40, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xcc, 0x04, 0x00, + 0x82, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xff, 0x00, 0x82, 0x04, 0x15, 0x00, + 0x00, 0x00, 0xf0, 0x00, 0x84, 0x04, 0x09, 0xc0, 0x82, 0x14, 0x05, 0x00, + 0x00, 0x00, 0x03, 0xff, 0x80, 0x00, 0x18, 0xc4, 0x8c, 0x14, 0x2d, 0x14, + 0x04, 0x00, 0x00, 0x05, 0x59, 0xcc, 0x00, 0x02, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x80, 0x0c, 0x1c, 0x80, 0x48, 0x0f, 0x50, 0x15, + 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0x20, 0x00, 0x04, 0x02, 0x00, 0x13, + 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x01, 0x04, 0x02, 0x00, 0x0e, + 0x59, 0xcc, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x82, 0x00, 0x05, 0x80, 0x11, 0x00, 0x00, 0x00, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x05, 0x94, 0x04, 0x02, 0x00, 0x11, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x37, 0xea, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5b, 0x22, + 0x04, 0x01, 0xf0, 0x0c, 0x04, 0x01, 0xf8, 0x1f, 0x04, 0x01, 0xf0, 0x0a, + 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0x30, 0x00, 0x04, 0x02, 0x00, 0x03, + 0x04, 0x01, 0xfa, 0x46, 0x04, 0x01, 0xf0, 0x05, 0x82, 0x08, 0x05, 0x80, + 0x00, 0x00, 0x80, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x01, 0xfb, 0x3c, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x17, 0xc8, 0x57, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x28, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x00, 0x0b, + 0x4c, 0x08, 0x00, 0x00, 0x4c, 0x0c, 0x00, 0x00, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x80, 0x48, 0x40, 0x14, 0x18, 0x00, 0x80, 0x14, 0x21, 0x20, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xf4, 0x5c, 0x00, 0x18, 0x00, + 0x5c, 0x00, 0x10, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xcc, 0x00, 0x02, + 0x82, 0x00, 0x05, 0x00, 0xff, 0x00, 0x00, 0x00, 0x82, 0x00, 0x15, 0x80, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, 0x82, 0x00, 0x15, 0x80, + 0x23, 0x00, 0x00, 0x00, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x05, 0x94, + 0x04, 0x02, 0x01, 0xcf, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x23, + 0x04, 0x02, 0x00, 0x55, 0x59, 0xcc, 0x00, 0x04, 0x48, 0x03, 0xc8, 0x57, + 0x59, 0xcc, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x59, 0xcc, 0x08, 0x01, 0x82, 0x04, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x80, 0x04, 0x05, 0x40, 0x48, 0x03, 0xc8, 0x57, 0x04, 0x01, 0xfb, 0xb8, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x05, 0x94, 0x04, 0x00, 0x01, 0xbe, + 0x59, 0x30, 0x0c, 0x06, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x10, + 0x04, 0x00, 0x00, 0x12, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x11, + 0x04, 0x00, 0x00, 0x0f, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x00, 0x00, 0x0c, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x00, 0x00, 0x09, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x08, + 0x04, 0x00, 0x00, 0x06, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0a, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x05, 0x94, 0x04, 0x02, 0x01, 0xa9, + 0x59, 0x30, 0x00, 0x04, 0x82, 0x00, 0x05, 0x00, 0x80, 0x01, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x67, 0xa7, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x05, 0x94, 0x04, 0x02, 0x01, 0xa0, + 0x59, 0xcc, 0x0a, 0x04, 0x48, 0x06, 0x62, 0x02, 0x59, 0xa8, 0x00, 0x15, + 0x80, 0x00, 0x01, 0xc0, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x05, 0x94, + 0x04, 0x00, 0x01, 0x99, 0x59, 0xcc, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x82, 0x00, 0x0d, 0x80, 0x02, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x05, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x15, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xdf, 0x82, 0x00, 0x0d, 0x80, + 0x02, 0x14, 0x00, 0x00, 0x04, 0x00, 0x07, 0xfa, 0x82, 0x00, 0x0d, 0x80, + 0x02, 0x10, 0x00, 0x00, 0x04, 0x00, 0x07, 0xf7, 0x82, 0x00, 0x0d, 0x80, + 0x02, 0x10, 0x00, 0x00, 0x04, 0x00, 0x07, 0xf4, 0x82, 0x00, 0x0d, 0x80, + 0x01, 0x00, 0x00, 0x00, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x05, 0x94, + 0x04, 0x02, 0x01, 0x81, 0x59, 0xcc, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x05, 0x94, + 0x04, 0x02, 0x01, 0x7b, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x16, + 0x04, 0x01, 0xf7, 0xe8, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x22, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x05, 0x94, 0x04, 0x02, 0x01, 0x73, + 0x59, 0xcc, 0x00, 0x04, 0x48, 0x03, 0xc8, 0x57, 0x59, 0xcc, 0x00, 0x06, + 0x48, 0x03, 0xc8, 0x57, 0x59, 0xcc, 0x00, 0x01, 0x48, 0x03, 0xc8, 0x57, + 0x59, 0xa8, 0x00, 0x15, 0x80, 0x00, 0x01, 0xc0, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x05, 0x94, 0x04, 0x00, 0x01, 0x68, 0x59, 0xa8, 0x08, 0x05, + 0x8c, 0x04, 0x0d, 0x14, 0x04, 0x00, 0x00, 0x11, 0x04, 0x01, 0xf9, 0x83, + 0x04, 0x02, 0x00, 0x0f, 0x04, 0x01, 0xf9, 0x99, 0x04, 0x00, 0x00, 0x0d, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x59, 0xcc, 0x00, 0x01, + 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5a, 0xc6, 0x04, 0x00, 0x01, 0x44, 0x42, 0x02, 0x88, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x41, 0x7a, 0x68, 0x00, 0x04, 0x01, 0xf1, 0x40, + 0x59, 0xcc, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x82, 0x00, 0x0d, 0x80, 0x03, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x29, + 0x59, 0xa8, 0x00, 0x23, 0x8c, 0x00, 0x05, 0x08, 0x04, 0x00, 0x00, 0x20, + 0x84, 0x00, 0x05, 0x4c, 0x48, 0x03, 0x50, 0x23, 0x59, 0xcc, 0x08, 0x00, + 0x82, 0x04, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xff, 0x48, 0x07, 0x50, 0x0f, + 0x49, 0x7b, 0x88, 0x30, 0x84, 0x04, 0x0d, 0x70, 0x48, 0x07, 0x88, 0x32, + 0x59, 0xc4, 0x08, 0x02, 0x84, 0x04, 0x0d, 0x4c, 0x48, 0x07, 0x88, 0x02, + 0x59, 0xcc, 0x00, 0x07, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x48, 0x03, 0x88, 0x93, 0x48, 0x03, 0x50, 0x1d, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x59, 0xa8, 0x10, 0x0f, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x99, 0x59, 0xcc, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x05, 0x94, + 0x04, 0x02, 0x01, 0x30, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x17, + 0x04, 0x01, 0xf0, 0xeb, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, + 0x04, 0x02, 0x07, 0xf5, 0x8c, 0x00, 0x05, 0x02, 0x04, 0x02, 0x07, 0xf3, + 0x04, 0x01, 0xf1, 0x27, 0x82, 0x00, 0x0d, 0x80, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x13, 0x59, 0xcc, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x05, 0x94, + 0x04, 0x02, 0x01, 0x1e, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, + 0x04, 0x00, 0x00, 0x04, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1d, + 0x04, 0x01, 0xf0, 0xd6, 0x59, 0xa8, 0x00, 0x23, 0x84, 0x00, 0x05, 0x48, + 0x48, 0x03, 0x50, 0x23, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x04, 0x01, 0xf0, 0xd0, 0x82, 0x00, 0x0d, 0x80, 0x05, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x0a, 0x59, 0xcc, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x05, 0x94, + 0x04, 0x02, 0x01, 0x09, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, + 0x04, 0x01, 0xf0, 0xc4, 0x82, 0x00, 0x0d, 0x80, 0x20, 0x10, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x04, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x19, + 0x04, 0x01, 0xf0, 0xbe, 0x82, 0x00, 0x0d, 0x80, 0x21, 0x10, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x04, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1a, + 0x04, 0x01, 0xf0, 0xb8, 0x82, 0x00, 0x0d, 0x80, 0x52, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x0a, 0x59, 0xcc, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x05, 0x94, + 0x04, 0x02, 0x00, 0xf1, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1b, + 0x04, 0x01, 0xf0, 0xac, 0x82, 0x00, 0x0d, 0x80, 0x50, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x0a, 0x59, 0xcc, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x05, 0x94, + 0x04, 0x02, 0x00, 0xe5, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x04, 0x01, 0xf0, 0xa0, 0x82, 0x00, 0x0d, 0x80, 0x13, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x04, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x34, + 0x04, 0x01, 0xf0, 0x9a, 0x82, 0x00, 0x0d, 0x80, 0x12, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x0a, 0x59, 0xcc, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x05, 0x94, + 0x04, 0x02, 0x00, 0xd3, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x24, + 0x04, 0x01, 0xf0, 0x8e, 0x82, 0x00, 0x0d, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x82, 0x04, 0x0d, 0x80, 0x24, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x04, 0x01, 0xf0, 0x86, + 0x82, 0x00, 0x0d, 0x00, 0xff, 0x00, 0x00, 0x00, 0x82, 0x04, 0x0d, 0x80, + 0x53, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x2a, 0x04, 0x01, 0xf0, 0x7e, 0x82, 0x00, 0x0d, 0x80, + 0x0f, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x04, 0x01, 0xf0, 0x78, 0x82, 0x00, 0x0d, 0x80, + 0x61, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x36, 0x83, 0xcc, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x80, 0x08, 0x08, 0x00, 0x50, 0x08, 0x00, 0x00, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0xff, 0xff, 0x82, 0x00, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x04, 0x4c, 0x58, 0x00, 0x00, 0x80, 0x00, 0xb1, 0x04, + 0x80, 0x58, 0xb1, 0xc0, 0x04, 0x00, 0x00, 0x26, 0x4c, 0x10, 0x00, 0x00, + 0x50, 0x04, 0x18, 0x00, 0x82, 0x0c, 0x15, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x80, 0x08, 0x11, 0x30, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xe5, + 0x82, 0x08, 0x25, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xe2, 0x04, 0x01, 0xf0, 0x0c, + 0x82, 0x08, 0x25, 0x80, 0x00, 0x00, 0x00, 0x01, 0x04, 0x02, 0x00, 0x04, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xe3, 0x04, 0x01, 0xf0, 0x06, + 0x82, 0x08, 0x25, 0x80, 0x00, 0x00, 0x00, 0x02, 0x04, 0x02, 0x00, 0x03, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xe4, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x15, + 0x82, 0x0c, 0x25, 0x00, 0x00, 0x00, 0xff, 0xff, 0x80, 0x0c, 0x19, 0x20, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xf4, 0x5c, 0x00, 0x20, 0x00, + 0x80, 0x04, 0x08, 0x00, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xda, + 0x5c, 0x00, 0xb0, 0x00, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x23, + 0x04, 0x01, 0xf0, 0x40, 0x82, 0x00, 0x0d, 0x80, 0x60, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x04, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3f, + 0x04, 0x01, 0xf0, 0x3a, 0x82, 0x00, 0x0d, 0x80, 0x54, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x08, 0x04, 0x01, 0xfb, 0x3c, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x05, 0x94, 0x04, 0x02, 0x00, 0x75, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x46, 0x04, 0x01, 0xf0, 0x30, 0x82, 0x00, 0x0d, 0x80, + 0x55, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x09, 0x04, 0x01, 0xfb, 0x5a, + 0x04, 0x02, 0x00, 0x04, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x41, + 0x04, 0x01, 0xf0, 0x28, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x42, + 0x04, 0x01, 0xf0, 0x25, 0x82, 0x00, 0x0d, 0x80, 0x78, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x04, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x45, + 0x04, 0x01, 0xf0, 0x1f, 0x82, 0x00, 0x0d, 0x80, 0x10, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x04, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4e, + 0x04, 0x01, 0xf0, 0x19, 0x82, 0x00, 0x0d, 0x80, 0x63, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x04, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4a, + 0x04, 0x01, 0xf0, 0x13, 0x82, 0x00, 0x0d, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x82, 0x04, 0x0d, 0x80, 0x56, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x04, 0x01, 0xf0, 0x0b, + 0x82, 0x00, 0x0d, 0x00, 0xff, 0x00, 0x00, 0x00, 0x82, 0x04, 0x0d, 0x80, + 0x57, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x50, 0x04, 0x01, 0xf0, 0x03, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x1d, 0x59, 0xcc, 0x38, 0x00, 0x82, 0x1c, 0x3d, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x82, 0x1c, 0x05, 0x80, 0x00, 0xff, 0xff, 0xfe, + 0x59, 0xcc, 0x00, 0x01, 0x04, 0x02, 0x00, 0x05, 0x40, 0x00, 0x30, 0x00, + 0x42, 0x02, 0x88, 0x00, 0x00, 0x00, 0x07, 0xfe, 0x04, 0x01, 0xf0, 0x05, + 0x04, 0x01, 0xf8, 0xda, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x05, 0x94, + 0x04, 0x02, 0x00, 0x34, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0xb6, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x05, 0x94, 0x04, 0x02, 0x00, 0x2f, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x46, 0x04, 0x02, 0x00, 0x06, + 0x59, 0xa8, 0x00, 0x0f, 0x80, 0x18, 0x05, 0x80, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x05, 0x94, 0x04, 0x00, 0x00, 0x27, 0x59, 0x34, 0x02, 0x00, + 0x8c, 0x00, 0x05, 0x14, 0x04, 0x00, 0x00, 0x0f, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x30, 0x04, 0x00, 0x00, 0x0c, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x3f, 0x04, 0x00, 0x00, 0x09, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x34, 0x04, 0x00, 0x00, 0x06, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x24, 0x04, 0x00, 0x00, 0x03, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x4c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, + 0x04, 0x00, 0x00, 0x18, 0x49, 0x36, 0x60, 0x09, 0x4a, 0x02, 0x64, 0x06, + 0x00, 0x00, 0x00, 0x04, 0x59, 0xcc, 0x0c, 0x04, 0x48, 0x06, 0x62, 0x02, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x4c, 0x04, 0x02, 0x00, 0x09, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x11, 0x81, 0x36, 0x69, 0xc0, + 0x04, 0x02, 0x00, 0x05, 0x59, 0xcc, 0x00, 0x01, 0x82, 0x00, 0x05, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x48, 0x02, 0x60, 0x1e, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xdf, 0x59, 0x88, 0x00, 0x53, 0x48, 0x03, 0xc8, 0x57, + 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x10, 0x53, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x49, 0x59, 0xcc, 0x18, 0x06, + 0x80, 0x0c, 0x19, 0x30, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xf4, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x71, 0xd5, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x05, 0x94, 0x04, 0x00, 0x07, 0xf1, 0x49, 0x36, 0x60, 0x09, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x04, 0x59, 0xcc, 0x0c, 0x04, + 0x48, 0x06, 0x62, 0x02, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x09, + 0x4a, 0x02, 0x64, 0x1a, 0x00, 0x00, 0x00, 0x09, 0x4a, 0x02, 0x62, 0x1a, + 0x00, 0x00, 0x29, 0x00, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x63, 0x39, 0x59, 0xa8, 0x00, 0x23, + 0x48, 0x03, 0xc8, 0x57, 0x8c, 0x00, 0x05, 0x08, 0x04, 0x00, 0x00, 0x10, + 0x59, 0xcc, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x82, 0x00, 0x0d, 0x80, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0c, + 0x82, 0x00, 0x0d, 0x80, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, + 0x82, 0x00, 0x0d, 0x80, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, + 0x82, 0x00, 0x0d, 0x80, 0x21, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, + 0x80, 0x00, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf7, 0xfd, 0x59, 0xcc, 0x20, 0x06, + 0x82, 0x10, 0x25, 0x00, 0xff, 0x00, 0x00, 0x00, 0x9c, 0x10, 0x21, 0xc0, + 0x04, 0x01, 0xf8, 0x07, 0x82, 0x0c, 0x1c, 0x00, 0x00, 0x10, 0xac, 0xb0, + 0x50, 0x0c, 0x18, 0x00, 0x80, 0x0c, 0x05, 0x00, 0x48, 0x03, 0xc8, 0x57, + 0x1c, 0x01, 0xf0, 0x00, 0x40, 0x10, 0x08, 0x00, 0x41, 0x78, 0x18, 0x00, + 0x82, 0x04, 0x04, 0x80, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x10, 0x04, + 0x80, 0x0c, 0x18, 0x00, 0x40, 0x00, 0x08, 0x00, 0x04, 0x01, 0xf7, 0xfb, + 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x82, 0x00, 0x04, 0x00, + 0x00, 0x10, 0xa3, 0x51, 0x50, 0x00, 0x00, 0x00, 0x8c, 0x04, 0x0d, 0x08, + 0x04, 0x00, 0x00, 0x02, 0x90, 0x00, 0x01, 0xc0, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x04, 0x01, 0xfa, 0xe3, 0x04, 0x02, 0x00, 0x0a, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1c, 0xd8, 0x04, 0x02, 0x00, 0x07, + 0x59, 0xcc, 0x00, 0x02, 0x82, 0x00, 0x05, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x82, 0x00, 0x0d, 0x80, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x02, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x59, 0xcc, 0x04, 0x00, + 0x82, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xff, 0x00, 0x84, 0x04, 0x09, 0xc0, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x33, 0x04, 0x02, 0x00, 0x1f, + 0x04, 0x01, 0xf9, 0x8f, 0x04, 0x00, 0x00, 0x38, 0x59, 0xcc, 0x0a, 0x04, + 0x48, 0x06, 0x62, 0x02, 0x59, 0xcc, 0x00, 0x06, 0x48, 0x03, 0xc8, 0x57, + 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0x00, 0x00, 0x82, 0x00, 0x0d, 0x80, + 0x02, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x09, 0x59, 0xcc, 0x00, 0x06, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0xff, 0xff, 0x04, 0x02, 0x00, 0x2b, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x15, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xdf, 0x82, 0x00, 0x0d, 0x80, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x24, 0x59, 0xcc, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x04, 0x02, 0x00, 0x20, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x16, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xdf, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x32, 0x04, 0x02, 0x00, 0x19, + 0x59, 0xcc, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x82, 0x00, 0x0d, 0x80, 0x14, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x13, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x38, 0x59, 0xcc, 0x00, 0x01, + 0x04, 0x01, 0xf8, 0x10, 0x04, 0x02, 0x00, 0x0e, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x42, 0xb1, 0x04, 0x02, 0x00, 0x0b, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0x99, 0x04, 0x00, 0x00, 0x08, 0x49, 0x36, 0x60, 0x09, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x04, 0x59, 0xcc, 0x0c, 0x04, + 0x48, 0x06, 0x62, 0x02, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xdf, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x57, 0x4c, 0x58, 0x00, 0x00, + 0x4c, 0x10, 0x00, 0x00, 0x4c, 0x38, 0x00, 0x00, 0x4c, 0x34, 0x00, 0x00, + 0x82, 0x00, 0x35, 0x00, 0x00, 0xff, 0xff, 0xff, 0x82, 0x18, 0x15, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x82, 0x08, 0x15, 0x80, 0x00, 0xff, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x16, 0x82, 0x18, 0x14, 0x80, 0x00, 0xff, 0xff, 0xfc, + 0x04, 0x00, 0x10, 0x13, 0x82, 0x18, 0x15, 0x80, 0x00, 0xff, 0xff, 0xfd, + 0x04, 0x02, 0x00, 0x04, 0x42, 0x02, 0x88, 0x00, 0x00, 0x00, 0x07, 0xfd, + 0x04, 0x01, 0xf0, 0x40, 0x82, 0x18, 0x15, 0x80, 0x00, 0xff, 0xff, 0xfe, + 0x04, 0x02, 0x00, 0x04, 0x42, 0x02, 0x88, 0x00, 0x00, 0x00, 0x07, 0xfe, + 0x04, 0x01, 0xf0, 0x3a, 0x82, 0x18, 0x15, 0x80, 0x00, 0xff, 0xff, 0xfc, + 0x04, 0x02, 0x00, 0x04, 0x42, 0x02, 0x88, 0x00, 0x00, 0x00, 0x07, 0xfc, + 0x04, 0x01, 0xf0, 0x34, 0x41, 0x78, 0x10, 0x00, 0x42, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x07, 0xf0, + 0x41, 0xac, 0x70, 0x00, 0x50, 0x38, 0x00, 0x00, 0x80, 0x00, 0x6d, 0x40, + 0x04, 0x02, 0x00, 0x05, 0x80, 0x08, 0x11, 0xc0, 0x04, 0x02, 0x00, 0x1e, + 0x84, 0x10, 0x15, 0x5e, 0x04, 0x01, 0xf0, 0x1c, 0x58, 0x34, 0x02, 0x12, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0xff, 0x00, 0x04, 0x00, 0x00, 0x11, + 0x59, 0xa8, 0x40, 0x0f, 0x82, 0x20, 0x45, 0x00, 0x00, 0xff, 0xff, 0x00, + 0x82, 0x18, 0x05, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x02, + 0x80, 0x20, 0x05, 0x80, 0x58, 0x34, 0x00, 0x02, 0x04, 0x02, 0x00, 0x0f, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, 0x82, 0x18, 0x45, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x80, 0x20, 0x45, 0x80, 0x04, 0x02, 0x00, 0x09, + 0x04, 0x01, 0xf0, 0x06, 0x58, 0x34, 0x00, 0x02, 0x82, 0x00, 0x05, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x80, 0x18, 0x45, 0x80, 0x04, 0x02, 0x00, 0x03, + 0x40, 0x12, 0x88, 0x00, 0x04, 0x01, 0xf0, 0x0c, 0x80, 0x10, 0x20, 0x00, + 0x80, 0x38, 0x70, 0x00, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xdb, + 0x80, 0x08, 0x11, 0xc0, 0x04, 0x02, 0x00, 0x05, 0x48, 0x1b, 0xc8, 0x57, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x03, + 0x84, 0x0a, 0x8d, 0x1e, 0x80, 0x00, 0x05, 0x80, 0x5c, 0x00, 0x68, 0x00, + 0x5c, 0x00, 0x70, 0x00, 0x5c, 0x00, 0x20, 0x00, 0x5c, 0x00, 0xb0, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xa8, 0x00, 0x23, 0x8c, 0x00, 0x05, 0x0e, + 0x04, 0x00, 0x00, 0x03, 0x8c, 0x00, 0x05, 0x02, 0x04, 0x00, 0x00, 0x06, + 0x59, 0xcc, 0x0c, 0x00, 0x80, 0x04, 0x09, 0x10, 0x82, 0x04, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x0c, 0x01, 0xf0, 0x02, 0x1c, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x58, 0xc9, 0x00, 0x10, 0x58, 0xc9, 0x00, 0x10, 0x58, 0xc9, + 0x00, 0x10, 0x59, 0xb8, 0x00, 0x10, 0x58, 0xc9, 0x00, 0x10, 0x58, 0xcb, + 0x00, 0x10, 0x58, 0xe3, 0x00, 0x10, 0x58, 0xe6, 0x00, 0x10, 0x58, 0xc9, + 0x00, 0x10, 0x58, 0xc9, 0x00, 0x10, 0x58, 0xc9, 0x00, 0x10, 0x58, 0xc9, + 0x00, 0x10, 0x58, 0xc9, 0x00, 0x10, 0x58, 0xc9, 0x00, 0x10, 0x58, 0xc9, + 0x00, 0x10, 0x58, 0xc9, 0x48, 0x03, 0xc8, 0x56, 0x1c, 0x01, 0xf0, 0x00, + 0x04, 0x01, 0xf8, 0xde, 0x04, 0x00, 0x00, 0x14, 0x82, 0x14, 0x05, 0x00, + 0x00, 0x00, 0x03, 0xff, 0x80, 0x00, 0x00, 0xc4, 0x82, 0x00, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x0e, 0x59, 0xcc, 0x00, 0x01, + 0x59, 0x32, 0x68, 0x09, 0x59, 0x34, 0x08, 0x02, 0x80, 0x04, 0x05, 0x80, + 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, 0x04, 0x02, 0x00, 0x07, + 0x59, 0xcc, 0x0a, 0x04, 0x48, 0x06, 0x62, 0x02, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x46, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xdf, + 0x59, 0xcc, 0x00, 0x04, 0x48, 0x03, 0xc8, 0x57, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0xcc, 0x00, 0x04, 0x48, 0x03, 0xc8, 0x57, 0x1c, 0x01, 0xf0, 0x00, + 0x04, 0x01, 0xf8, 0xc3, 0x04, 0x00, 0x00, 0x16, 0x82, 0x14, 0x05, 0x00, + 0x00, 0x00, 0x03, 0xff, 0x80, 0x00, 0x00, 0xc4, 0x82, 0x00, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x0c, 0x04, 0x00, 0x10, 0x10, 0x59, 0xcc, 0x00, 0x01, + 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, 0x59, 0x32, 0x68, 0x09, + 0x59, 0x34, 0x08, 0x02, 0x82, 0x04, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x80, 0x04, 0x05, 0x80, 0x04, 0x02, 0x00, 0x07, 0x59, 0xcc, 0x0a, 0x04, + 0x48, 0x06, 0x62, 0x02, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x45, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xdf, 0x59, 0xcc, 0x00, 0x04, + 0x48, 0x03, 0xc8, 0x57, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xcc, 0x00, 0x04, + 0x48, 0x03, 0xc8, 0x57, 0x59, 0xcc, 0x00, 0x00, 0x82, 0x00, 0x05, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x59, 0xcc, 0x10, 0x01, 0x82, 0x08, 0x15, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x80, 0x08, 0x05, 0x40, 0x48, 0x03, 0xc8, 0x57, + 0x48, 0x17, 0xc8, 0x57, 0x04, 0x01, 0xf9, 0xde, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x05, 0x94, 0x04, 0x02, 0x00, 0x16, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x1c, 0xd8, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x05, 0x94, + 0x04, 0x02, 0x00, 0x11, 0x59, 0xcc, 0x00, 0x02, 0x82, 0x00, 0x05, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x05, 0x94, 0x04, 0x02, 0x00, 0x09, + 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x82, 0x00, 0x0c, 0x80, + 0x00, 0x00, 0x00, 0x06, 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x05, 0x94, + 0x04, 0x02, 0x10, 0x02, 0x0c, 0x01, 0xf0, 0x03, 0x48, 0x03, 0xc8, 0x56, + 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x59, 0x2c, 0x00, 0x10, 0x59, 0x2e, + 0x00, 0x10, 0x59, 0x2c, 0x00, 0x10, 0x59, 0x2c, 0x00, 0x10, 0x59, 0x87, + 0x00, 0x10, 0x59, 0x96, 0x48, 0x03, 0xc8, 0x56, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0xa8, 0x00, 0x15, 0x80, 0x00, 0x01, 0xc0, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x05, 0x94, 0x04, 0x02, 0x07, 0xfa, 0x59, 0xcc, 0x08, 0x02, + 0x48, 0x07, 0xc8, 0x56, 0x8c, 0x04, 0x0d, 0x2e, 0x04, 0x02, 0x00, 0x1d, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x71, 0xd5, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x59, 0xcc, 0x00, 0x01, 0x04, 0x01, 0xff, 0x18, + 0x04, 0x02, 0x00, 0x0d, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, + 0x04, 0x02, 0x00, 0x0a, 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x05, + 0x49, 0x36, 0x60, 0x09, 0x59, 0xcc, 0x08, 0x04, 0x48, 0x06, 0x60, 0x1c, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x88, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xdf, 0x48, 0x03, 0xc8, 0x57, 0x42, 0x02, 0x88, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x41, 0x7a, 0x68, 0x00, 0x59, 0xcc, 0x00, 0x01, + 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, 0x48, 0x02, 0x60, 0x1e, + 0x04, 0x01, 0xf7, 0xef, 0x59, 0xcc, 0x00, 0x01, 0x48, 0x03, 0xc8, 0x57, + 0x04, 0x01, 0xfe, 0xff, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x05, 0x94, + 0x04, 0x02, 0x07, 0xd4, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0xb1, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x05, 0x94, 0x04, 0x02, 0x07, 0xcf, + 0x59, 0xcc, 0x00, 0x05, 0x8c, 0x00, 0x05, 0x00, 0x04, 0x02, 0x00, 0x06, + 0x59, 0x34, 0x02, 0x00, 0x8c, 0x00, 0x05, 0x0e, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x05, 0x94, 0x04, 0x02, 0x07, 0xc7, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x47, 0x25, 0x04, 0x02, 0x00, 0x13, 0x04, 0x01, 0xf8, 0x40, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x05, 0x94, 0x04, 0x00, 0x07, 0xc0, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x05, 0x94, 0x04, 0x00, 0x07, 0xbb, 0x49, 0x36, 0x60, 0x09, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x02, 0x59, 0xcc, 0x08, 0x04, + 0x48, 0x06, 0x60, 0x1c, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x88, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xdf, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0x99, 0x04, 0x00, 0x07, 0xaf, 0x49, 0x36, 0x60, 0x09, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x04, 0x59, 0xcc, 0x0c, 0x04, + 0x48, 0x06, 0x62, 0x02, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xdf, 0x59, 0xcc, 0x08, 0x02, + 0x8c, 0x04, 0x0d, 0x2e, 0x04, 0x00, 0x00, 0x0b, 0x04, 0x01, 0xf8, 0x1f, + 0x04, 0x00, 0x00, 0x09, 0x04, 0x01, 0xf9, 0x67, 0x04, 0x02, 0x00, 0x07, + 0x59, 0xcc, 0x0a, 0x04, 0x48, 0x06, 0x62, 0x02, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x89, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xdf, + 0x49, 0x33, 0xc8, 0x57, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xcc, 0x00, 0x04, + 0x48, 0x03, 0xc8, 0x57, 0x59, 0xcc, 0x08, 0x02, 0x8c, 0x04, 0x0d, 0x2e, + 0x04, 0x00, 0x00, 0x0b, 0x04, 0x01, 0xf8, 0x0e, 0x04, 0x00, 0x00, 0x09, + 0x04, 0x01, 0xf9, 0x56, 0x04, 0x02, 0x00, 0x07, 0x59, 0xcc, 0x0a, 0x04, + 0x48, 0x06, 0x62, 0x02, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x8a, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xdf, 0x49, 0x33, 0xc8, 0x57, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xcc, 0x0a, 0x04, 0x04, 0x01, 0xf0, 0x02, + 0x59, 0xcc, 0x0c, 0x04, 0x59, 0xa8, 0x00, 0x0d, 0x59, 0xa8, 0x10, 0x64, + 0x80, 0x08, 0x04, 0x00, 0x80, 0x04, 0x04, 0x80, 0x04, 0x02, 0x10, 0x08, + 0x40, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0xc4, 0x80, 0x04, 0x08, 0xca, + 0x80, 0x04, 0x0c, 0x00, 0x82, 0x06, 0x64, 0x00, 0x00, 0x10, 0xd8, 0xd4, + 0x1c, 0x01, 0xf0, 0x00, 0x80, 0x00, 0x05, 0x80, 0x04, 0x01, 0xf7, 0xfe, + 0x59, 0xcc, 0x08, 0x02, 0x8c, 0x04, 0x0d, 0x2e, 0x04, 0x02, 0x00, 0x10, + 0x04, 0x01, 0xff, 0xec, 0x04, 0x00, 0x00, 0x0e, 0x59, 0xcc, 0x00, 0x01, + 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, 0x59, 0x32, 0x68, 0x09, + 0x59, 0x34, 0x08, 0x02, 0x82, 0x04, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x80, 0x04, 0x05, 0x80, 0x04, 0x02, 0x00, 0x05, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x51, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xdf, + 0x59, 0xcc, 0x00, 0x04, 0x48, 0x03, 0xc8, 0x57, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x05, + 0x04, 0x01, 0xf0, 0x01, 0x48, 0x03, 0xc8, 0x56, 0x4c, 0x3c, 0x00, 0x00, + 0x41, 0xcc, 0x78, 0x00, 0x40, 0x14, 0x20, 0x00, 0x04, 0x01, 0xf8, 0x03, + 0x5c, 0x00, 0x78, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x4c, 0x58, 0x00, 0x00, 0x58, 0x3c, 0x04, 0x00, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0xf0, 0x00, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0xc0, 0x00, + 0x04, 0x00, 0x00, 0x24, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, + 0x04, 0x00, 0x00, 0x21, 0x4c, 0x18, 0x00, 0x00, 0x58, 0x3c, 0x00, 0x01, + 0x04, 0x01, 0xfe, 0x6f, 0x04, 0x02, 0x00, 0x1f, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x42, 0xb1, 0x04, 0x02, 0x00, 0x1c, 0x49, 0x36, 0x60, 0x09, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x1a, 0x04, 0x00, 0x00, 0x18, + 0x49, 0x2e, 0x60, 0x17, 0x49, 0x7a, 0x58, 0x00, 0x49, 0x7a, 0x5a, 0x04, + 0x48, 0x12, 0x5c, 0x04, 0x83, 0x2c, 0xac, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x40, 0x3c, 0xa0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, 0x5c, 0x00, 0x30, 0x00, + 0x48, 0x1a, 0x64, 0x1a, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x3e, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x01, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0x39, + 0x5c, 0x00, 0xb0, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x5c, 0x00, 0x30, 0x00, 0x04, 0x01, 0xf7, 0xfb, + 0x48, 0x03, 0xc8, 0x56, 0x59, 0xcc, 0x04, 0x00, 0x82, 0x00, 0x0d, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0xf0, 0x00, + 0x84, 0x04, 0x09, 0xc0, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x20, 0x00, + 0x04, 0x02, 0x00, 0x4f, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x22, + 0x04, 0x02, 0x00, 0x40, 0x59, 0xc4, 0x00, 0xa4, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x07, + 0x04, 0x00, 0x10, 0x04, 0x82, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x0c, + 0x04, 0x00, 0x10, 0x45, 0x59, 0xcc, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x82, 0x00, 0x0d, 0x80, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x3f, 0x82, 0x00, 0x0d, 0x80, 0x60, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x3c, 0x82, 0x00, 0x0d, 0x80, 0x54, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x39, 0x82, 0x00, 0x0d, 0x80, 0x03, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x1b, 0x59, 0xa8, 0x08, 0x23, 0x8c, 0x04, 0x0d, 0x02, + 0x04, 0x02, 0x00, 0x33, 0x8c, 0x04, 0x0d, 0x08, 0x04, 0x02, 0x00, 0x31, + 0x82, 0x00, 0x0d, 0x80, 0x03, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x00, 0x00, 0x2b, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x46, 0x14, 0x04, 0x00, 0x00, 0x2b, + 0x59, 0xa8, 0x00, 0x1c, 0x80, 0x00, 0x00, 0xd0, 0x59, 0xa8, 0x08, 0x0f, + 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x00, 0xff, 0x80, 0x04, 0x05, 0x40, + 0x59, 0xcc, 0x08, 0x00, 0x82, 0x04, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x80, 0x04, 0x05, 0x80, 0x04, 0x02, 0x00, 0x1b, 0x04, 0x01, 0xf0, 0x1c, + 0x59, 0xc4, 0x08, 0x02, 0x8c, 0x04, 0x0d, 0x0c, 0x04, 0x02, 0x00, 0x17, + 0x82, 0x00, 0x0d, 0x80, 0x52, 0x00, 0x00, 0x00, 0x04, 0x00, 0x07, 0xec, + 0x82, 0x00, 0x0d, 0x80, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x07, 0xe9, + 0x82, 0x00, 0x0d, 0x80, 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x07, 0xe6, + 0x04, 0x01, 0xf0, 0x0d, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x23, + 0x04, 0x02, 0x00, 0x0a, 0x04, 0x01, 0xff, 0x51, 0x04, 0x00, 0x00, 0x08, + 0x59, 0x30, 0x0c, 0x03, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x00, 0x00, 0x06, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x51, + 0x04, 0x00, 0x00, 0x03, 0x80, 0x00, 0x05, 0x80, 0x04, 0x01, 0xf0, 0x03, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0xcc, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x82, 0x00, 0x0d, 0x80, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, + 0x82, 0x00, 0x0d, 0x80, 0x52, 0x00, 0x00, 0x00, 0x04, 0x02, 0x07, 0xf3, + 0x59, 0xa8, 0x00, 0x23, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x07, 0xef, + 0x04, 0x01, 0xf7, 0xec, 0x48, 0x03, 0xc8, 0x56, 0x4c, 0x5c, 0x00, 0x00, + 0x4c, 0x58, 0x00, 0x00, 0x59, 0xa8, 0x00, 0x15, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x4c, 0x04, 0x02, 0x00, 0x1f, 0x59, 0xcc, 0xb8, 0x07, + 0x9c, 0x5c, 0xb9, 0xc0, 0x82, 0x5c, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x8c, 0x5c, 0xbd, 0x00, 0x04, 0x00, 0x00, 0x0a, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x83, 0xa8, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x83, 0xcc, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x7d, 0x41, 0x04, 0x02, 0x00, 0x10, 0x8c, 0x5c, 0xbd, 0x02, + 0x04, 0x00, 0x00, 0x0a, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x83, 0xa8, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0xcc, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x7d, 0x41, + 0x04, 0x02, 0x00, 0x05, 0x8c, 0x5c, 0xbd, 0x04, 0x04, 0x00, 0x00, 0x03, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x5c, 0x00, 0xb0, 0x00, + 0x5c, 0x00, 0xb8, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x4c, 0x5c, 0x00, 0x00, 0x4c, 0x58, 0x00, 0x00, 0x59, 0xa8, 0x00, 0x15, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x4c, 0x04, 0x02, 0x00, 0x1f, + 0x59, 0xcc, 0xb8, 0x07, 0x9c, 0x5c, 0xb9, 0xc0, 0x82, 0x5c, 0xbd, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x8c, 0x5c, 0xbd, 0x00, 0x04, 0x00, 0x00, 0x0a, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x83, 0xa8, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x83, 0xcc, 0x14, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x7d, 0x41, 0x04, 0x02, 0x00, 0x10, + 0x8c, 0x5c, 0xbd, 0x02, 0x04, 0x00, 0x00, 0x0a, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x83, 0xa8, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xcc, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x7d, 0x41, 0x04, 0x02, 0x00, 0x05, 0x8c, 0x5c, 0xbd, 0x04, + 0x04, 0x00, 0x00, 0x03, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x5c, 0x00, 0xb0, 0x00, 0x5c, 0x00, 0xb8, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x57, 0x4c, 0x58, 0x00, 0x00, 0x40, 0x00, 0x30, 0x00, + 0x42, 0x00, 0x20, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x83, 0xac, 0x74, 0x00, 0x00, 0x00, 0x07, 0xf0, + 0x50, 0x38, 0x00, 0x00, 0x80, 0x02, 0x6d, 0x40, 0x04, 0x00, 0x00, 0x06, + 0x59, 0x34, 0x00, 0x02, 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x80, 0x18, 0x05, 0x80, 0x04, 0x00, 0x00, 0x10, 0x80, 0x10, 0x20, 0x00, + 0x80, 0x38, 0x70, 0x00, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xf5, + 0x82, 0x10, 0x04, 0x80, 0x00, 0x00, 0x08, 0x00, 0x42, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x07, 0xf0, + 0x41, 0xac, 0x70, 0x00, 0x04, 0x02, 0x17, 0xed, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x02, 0x40, 0x12, 0x88, 0x00, + 0x5c, 0x00, 0xb0, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xa8, 0x00, 0x23, + 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x00, 0x00, 0x04, 0x8c, 0x00, 0x05, 0x02, + 0x04, 0x00, 0x00, 0x03, 0x80, 0x00, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf7, 0xfd, + 0x59, 0x30, 0x0c, 0x06, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x00, 0x00, 0x06, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x00, 0x00, 0x03, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xc8, 0x00, 0x00, 0x84, 0x00, 0x05, 0x58, + 0x84, 0x00, 0x05, 0x12, 0x48, 0x03, 0x90, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4a, 0x03, 0x28, 0x1a, 0x00, 0x00, 0x03, 0xe8, 0x4a, 0x03, 0x28, 0x02, + 0x00, 0x10, 0xd8, 0xd4, 0x4a, 0x03, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4a, 0x03, 0x28, 0x08, 0x00, 0x10, 0x68, 0x93, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x83, 0x94, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x49, 0x78, 0x78, 0x01, 0x4a, 0x00, 0x78, 0x02, 0x00, 0x10, 0x68, 0x48, + 0x82, 0x3c, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x40, + 0x04, 0x02, 0x07, 0xfa, 0x4a, 0x03, 0x28, 0x19, 0xff, 0xff, 0x00, 0x00, + 0x42, 0x01, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x64, 0x04, 0x01, 0xf9, 0x85, + 0x42, 0x01, 0xd0, 0x00, 0x00, 0x01, 0x86, 0xa0, 0x04, 0x01, 0xf1, 0x94, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, + 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0c, 0x4d, 0x30, 0x00, 0x00, + 0x4d, 0x2c, 0x00, 0x00, 0x4d, 0x34, 0x00, 0x00, 0x4d, 0x40, 0x00, 0x00, + 0x4c, 0xfc, 0x00, 0x00, 0x4d, 0x38, 0x00, 0x00, 0x4d, 0x3c, 0x00, 0x00, + 0x4d, 0x44, 0x00, 0x00, 0x4d, 0x4c, 0x00, 0x00, 0x4d, 0x48, 0x00, 0x00, + 0x4c, 0x5c, 0x00, 0x00, 0x4c, 0x60, 0x00, 0x00, 0x4c, 0x64, 0x00, 0x00, + 0x4c, 0xc8, 0x00, 0x00, 0x4c, 0xcc, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x05, 0xd0, 0x5c, 0x01, 0x98, 0x00, 0x5c, 0x01, 0x90, 0x00, + 0x5c, 0x00, 0xc8, 0x00, 0x5c, 0x00, 0xc0, 0x00, 0x5c, 0x00, 0xb8, 0x00, + 0x5c, 0x02, 0x90, 0x00, 0x5c, 0x02, 0x98, 0x00, 0x5c, 0x02, 0x88, 0x00, + 0x5c, 0x02, 0x78, 0x00, 0x5c, 0x02, 0x70, 0x00, 0x5c, 0x01, 0xf8, 0x00, + 0x5c, 0x02, 0x80, 0x00, 0x5c, 0x02, 0x68, 0x00, 0x5c, 0x02, 0x58, 0x00, + 0x5c, 0x02, 0x60, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x94, 0x00, 0x04, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x0a, 0x59, 0x94, 0x00, 0x25, + 0x80, 0x04, 0x04, 0x00, 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x48, 0x03, 0x28, 0x04, 0x48, 0x0b, 0x28, 0x05, 0x4a, 0x03, 0x28, 0x03, + 0x00, 0x00, 0x00, 0x0a, 0x80, 0x00, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x94, 0x00, 0x1f, 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x0a, + 0x59, 0x94, 0x00, 0x25, 0x80, 0x04, 0x04, 0x00, 0x02, 0x00, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x48, 0x03, 0x28, 0x1f, 0x48, 0x0b, 0x28, 0x20, + 0x4a, 0x03, 0x28, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x05, 0x80, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x40, 0x68, 0x08, 0x00, + 0x40, 0x6c, 0x10, 0x00, 0x04, 0x01, 0xf8, 0x02, 0x5c, 0x00, 0x00, 0x00, + 0x59, 0x94, 0x00, 0x22, 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x0a, + 0x59, 0x94, 0x00, 0x25, 0x80, 0x04, 0x04, 0x00, 0x02, 0x00, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x48, 0x03, 0x28, 0x22, 0x48, 0x0b, 0x28, 0x23, + 0x4a, 0x03, 0x28, 0x21, 0x00, 0x00, 0x00, 0x0a, 0x80, 0x00, 0x05, 0x80, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x59, 0x94, 0x00, 0x05, + 0x48, 0x03, 0xc8, 0x57, 0x48, 0x0b, 0xc8, 0x57, 0x80, 0x08, 0x05, 0x80, + 0x04, 0x02, 0x00, 0x03, 0x49, 0x7b, 0x28, 0x04, 0x49, 0x7b, 0x28, 0x05, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x59, 0x94, 0x00, 0x20, 0x48, 0x03, 0xc8, 0x57, 0x48, 0x0b, 0xc8, 0x57, + 0x80, 0x08, 0x05, 0x80, 0x04, 0x02, 0x00, 0x03, 0x49, 0x7b, 0x28, 0x1f, + 0x49, 0x7b, 0x28, 0x20, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x59, 0x94, 0x00, 0x23, 0x48, 0x03, 0xc8, 0x57, + 0x48, 0x0b, 0xc8, 0x57, 0x80, 0x08, 0x05, 0x80, 0x04, 0x02, 0x00, 0x03, + 0x49, 0x7b, 0x28, 0x22, 0x49, 0x7b, 0x28, 0x23, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x37, 0xc8, 0x57, 0x48, 0xeb, 0xc8, 0x57, + 0x59, 0x34, 0x02, 0x03, 0x80, 0xe8, 0x04, 0x80, 0x04, 0x00, 0x10, 0x02, + 0x48, 0xea, 0x6a, 0x03, 0x1c, 0x01, 0xf0, 0x00, 0x5c, 0x03, 0xe0, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0x44, 0x00, 0x00, 0x42, 0x00, 0x78, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x59, 0x96, 0x88, 0x01, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0x5a, 0x04, 0x02, 0x00, 0x12, 0x59, 0x34, 0x1a, 0x03, + 0x80, 0x0c, 0x18, 0x40, 0x04, 0x00, 0x10, 0x0f, 0x59, 0x94, 0x00, 0x27, + 0x80, 0x0c, 0x04, 0x80, 0x04, 0x00, 0x00, 0x03, 0x48, 0x02, 0x6a, 0x03, + 0x04, 0x02, 0x10, 0x0a, 0x59, 0x34, 0x00, 0x0f, 0x49, 0x7a, 0x6a, 0x03, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x06, 0x4c, 0x3c, 0x00, 0x00, + 0x59, 0x34, 0x14, 0x0b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x68, + 0x5c, 0x00, 0x78, 0x00, 0x81, 0x46, 0x88, 0x00, 0x83, 0x44, 0x04, 0x80, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x02, 0x10, 0x07, 0x80, 0x3c, 0x78, 0x40, + 0x04, 0x02, 0x07, 0xe7, 0x49, 0x47, 0x28, 0x01, 0x5c, 0x02, 0x88, 0x00, + 0x5c, 0x03, 0xe0, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4a, 0x03, 0x28, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x49, 0x7b, 0x28, 0x01, 0x04, 0x01, 0xf7, 0xfa, + 0x42, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x10, 0x59, 0x96, 0x60, 0x02, + 0x59, 0x30, 0x02, 0x05, 0x80, 0x00, 0x0d, 0x40, 0x04, 0x00, 0x00, 0x06, + 0x59, 0x94, 0x00, 0x27, 0x80, 0x04, 0x04, 0x80, 0x48, 0x02, 0x62, 0x05, + 0x04, 0x00, 0x10, 0x2d, 0x04, 0x00, 0x00, 0x2c, 0x59, 0x30, 0x02, 0x06, + 0x80, 0x00, 0x0d, 0x40, 0x04, 0x00, 0x00, 0x14, 0x59, 0xb8, 0x00, 0xe4, + 0x8c, 0x00, 0x05, 0x24, 0x04, 0x02, 0x00, 0x11, 0x4a, 0x03, 0x70, 0xe4, + 0x00, 0x03, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x59, 0xb8, 0x00, 0xe4, + 0x8c, 0x00, 0x05, 0x24, 0x04, 0x00, 0x00, 0x04, 0x4a, 0x03, 0x70, 0xe4, + 0x00, 0x02, 0x00, 0x00, 0x04, 0x01, 0xf0, 0x08, 0x59, 0x94, 0x00, 0x27, + 0x80, 0x04, 0x04, 0x80, 0x48, 0x02, 0x62, 0x06, 0x4a, 0x03, 0x70, 0xe4, + 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x10, 0x1c, 0x04, 0x00, 0x00, 0x1b, + 0x83, 0x32, 0x64, 0x00, 0x00, 0x00, 0x00, 0x24, 0x49, 0x33, 0x28, 0x02, + 0x41, 0x54, 0x00, 0x00, 0x81, 0x30, 0x04, 0x80, 0x04, 0x02, 0x10, 0x05, + 0x80, 0x3c, 0x78, 0x40, 0x04, 0x02, 0x07, 0xdb, 0x5c, 0x03, 0xe0, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x94, 0x00, 0x26, 0x48, 0x03, 0x28, 0x27, + 0x4a, 0x03, 0x28, 0x02, 0x00, 0x10, 0xd8, 0xd4, 0x49, 0x7b, 0x28, 0x26, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x0f, 0x4a, 0x03, 0x28, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x5c, 0x03, 0xe0, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x3c, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x89, 0xfa, + 0x5c, 0x00, 0x78, 0x00, 0x04, 0x01, 0xf7, 0xd1, 0x4c, 0x3c, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x85, 0x5e, 0x5c, 0x00, 0x78, 0x00, + 0x04, 0x01, 0xf7, 0xe2, 0x4a, 0x03, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5c, 0x03, 0xe0, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xa8, 0x08, 0x68, + 0x8c, 0x04, 0x0d, 0x30, 0x04, 0x02, 0x00, 0x29, 0x8c, 0x04, 0x0d, 0x32, + 0x04, 0x00, 0x00, 0x0f, 0x59, 0xa8, 0x00, 0x66, 0x81, 0x64, 0x04, 0x80, + 0x04, 0x00, 0x10, 0x19, 0x59, 0xa8, 0x00, 0x0a, 0x81, 0x50, 0x05, 0x80, + 0x04, 0x00, 0x00, 0x05, 0x59, 0xa8, 0x00, 0x67, 0x59, 0xa8, 0x10, 0x63, + 0x80, 0x08, 0x05, 0x80, 0x04, 0x02, 0x00, 0x12, 0x90, 0x04, 0x11, 0xc0, + 0x82, 0x08, 0x15, 0x00, 0x00, 0x00, 0x70, 0x00, 0x04, 0x01, 0xf0, 0x12, + 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x04, 0x00, 0x00, 0x16, + 0x80, 0x04, 0x08, 0x40, 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0x1f, + 0x04, 0x00, 0x00, 0x03, 0x48, 0x07, 0x50, 0x68, 0x04, 0x01, 0xf0, 0x10, + 0x90, 0x04, 0x01, 0xc0, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x1f, + 0x80, 0x04, 0x0d, 0x40, 0x90, 0x04, 0x01, 0xc0, 0x80, 0x04, 0x05, 0x80, + 0x82, 0x00, 0x15, 0x00, 0x00, 0x00, 0x70, 0x00, 0x82, 0x04, 0x05, 0x00, + 0xff, 0xff, 0x8f, 0xff, 0x80, 0x08, 0x05, 0x40, 0x48, 0x03, 0x50, 0x68, + 0x80, 0x08, 0x11, 0x14, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x06, 0x0a, + 0x1c, 0x01, 0xf0, 0x00, 0x4a, 0x03, 0x28, 0x07, 0x00, 0x00, 0x07, 0xd0, + 0x4a, 0x03, 0x28, 0x06, 0x00, 0x00, 0x00, 0x0a, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0xd0, 0x83, 0x18, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x05, 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x83, 0x94, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x09, 0x83, 0x18, 0x04, 0x00, + 0x00, 0x10, 0x5b, 0x1d, 0x50, 0x00, 0x00, 0x00, 0x80, 0x3c, 0x7c, 0x00, + 0x48, 0x04, 0x78, 0x01, 0x4a, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x0a, + 0x1c, 0x01, 0xf0, 0x00, 0x83, 0x18, 0x04, 0x80, 0x00, 0x00, 0x00, 0x05, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x83, 0x94, 0x7c, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x83, 0x18, 0x04, 0x00, 0x00, 0x10, 0x5b, 0x1d, + 0x50, 0x00, 0x00, 0x00, 0x80, 0x3c, 0x7c, 0x00, 0x49, 0x78, 0x78, 0x01, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x07, 0xc8, 0x57, 0x48, 0x0b, 0xc8, 0x57, + 0x59, 0x94, 0x00, 0x25, 0x80, 0x04, 0x04, 0x00, 0x02, 0x00, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x48, 0x03, 0x28, 0x04, 0x48, 0x0b, 0x28, 0x05, + 0x4a, 0x03, 0x28, 0x03, 0x00, 0x00, 0x00, 0x0a, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x07, 0xc8, 0x57, 0x48, 0x0b, 0xc8, 0x57, 0x59, 0x94, 0x00, 0x25, + 0x80, 0x04, 0x04, 0x00, 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x48, 0x03, 0x28, 0x1c, 0x48, 0x0b, 0x28, 0x1d, 0x4a, 0x03, 0x28, 0x1b, + 0x00, 0x00, 0x00, 0x0a, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x59, 0x94, 0x00, 0x1d, 0x48, 0x03, 0xc8, 0x57, 0x48, 0x0b, 0xc8, 0x57, + 0x80, 0x08, 0x05, 0x80, 0x04, 0x02, 0x00, 0x03, 0x48, 0x03, 0x28, 0x1c, + 0x48, 0x03, 0x28, 0x1d, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x07, 0xc8, 0x57, 0x48, 0x0b, 0xc8, 0x57, 0x59, 0x94, 0x00, 0x25, + 0x80, 0x04, 0x04, 0x00, 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x48, 0x03, 0x28, 0x22, 0x48, 0x0b, 0x28, 0x23, 0x4a, 0x03, 0x28, 0x21, + 0x00, 0x00, 0x00, 0x0a, 0x1c, 0x01, 0xf0, 0x00, 0x80, 0xe9, 0xd1, 0xc0, + 0x04, 0x00, 0x00, 0x0e, 0x04, 0x01, 0xf8, 0x36, 0x04, 0x02, 0x50, 0x00, + 0x42, 0x03, 0xe0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x40, 0xe8, 0x10, 0x00, + 0x41, 0x78, 0x08, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x62, 0xb7, 0x59, 0x94, 0x00, 0x24, + 0x80, 0x08, 0x04, 0x00, 0x48, 0x03, 0x28, 0x24, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x4b, 0xd9, + 0x04, 0x01, 0xfe, 0xe1, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x4b, 0xc8, + 0x04, 0x01, 0xff, 0xd2, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3d, 0xf2, + 0x04, 0x01, 0xfe, 0xdb, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3e, 0x74, + 0x04, 0x01, 0xfe, 0xd8, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3d, 0xcb, + 0x04, 0x01, 0xfe, 0xd5, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3e, 0xab, + 0x04, 0x01, 0xf6, 0xe6, 0x42, 0x03, 0xe0, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x42, 0x03, 0xe0, 0x00, 0xb0, 0x30, 0x00, 0x00, 0x40, 0xeb, 0xf8, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x04, 0x00, 0x40, 0x04, + 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x07, 0xfe, 0x04, 0x01, 0xf0, 0x07, + 0x42, 0x03, 0xe0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x4d, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x03, 0xe0, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x42, 0x03, 0xe0, 0x00, 0xb0, 0x40, 0x00, 0x00, 0x40, 0xeb, 0xf8, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x04, 0x00, 0x50, 0x04, + 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x07, 0xfe, 0x04, 0x01, 0xf0, 0x07, + 0x42, 0x03, 0xe0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x4e, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xa8, 0x00, 0x0d, + 0x82, 0x00, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, 0x59, 0x9c, 0x0a, 0x02, + 0x80, 0x04, 0x09, 0xc0, 0x04, 0x02, 0x00, 0x02, 0x80, 0x04, 0x08, 0x00, + 0x80, 0x04, 0x14, 0x80, 0x04, 0x00, 0x10, 0x02, 0x40, 0x00, 0x08, 0x00, + 0x48, 0x07, 0x50, 0x64, 0x59, 0xa8, 0x10, 0x0d, 0x40, 0x04, 0x00, 0x00, + 0x80, 0x0a, 0xcc, 0x80, 0x49, 0x67, 0x50, 0x0d, 0x49, 0x67, 0x50, 0x66, + 0x59, 0xaa, 0xa8, 0x0a, 0x41, 0x64, 0x08, 0x00, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x24, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x62, 0x98, + 0x82, 0x06, 0xa4, 0x00, 0x00, 0x10, 0xd8, 0xd4, 0x49, 0x53, 0x50, 0x62, + 0x41, 0x52, 0xb0, 0x00, 0x42, 0x00, 0x60, 0x00, 0x00, 0x10, 0xb6, 0x34, + 0x4a, 0x00, 0x60, 0x04, 0x00, 0x00, 0x01, 0x2c, 0x4a, 0x00, 0x60, 0x05, + 0xda, 0x10, 0xda, 0x10, 0x4a, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x11, + 0x4a, 0x00, 0x60, 0x09, 0x00, 0x10, 0xb6, 0x34, 0x4a, 0x00, 0x60, 0x0a, + 0x00, 0x10, 0x0f, 0xd3, 0x59, 0x9c, 0x00, 0x14, 0x48, 0x00, 0x60, 0x11, + 0x59, 0x9c, 0x00, 0x15, 0x48, 0x00, 0x60, 0x12, 0x42, 0x00, 0x60, 0x00, + 0x00, 0x10, 0xb6, 0x10, 0x4a, 0x00, 0x62, 0x03, 0x00, 0x00, 0x00, 0x08, + 0x4a, 0x00, 0x64, 0x06, 0x00, 0x00, 0x00, 0x06, 0x4a, 0x00, 0x60, 0x02, + 0xff, 0xff, 0x00, 0x00, 0x4a, 0x00, 0x60, 0x08, 0x00, 0x10, 0xb6, 0x34, + 0x4a, 0x00, 0x60, 0x14, 0x00, 0x10, 0xb6, 0x34, 0x59, 0x9c, 0x00, 0x14, + 0x48, 0x00, 0x60, 0x15, 0x59, 0x9c, 0x00, 0x15, 0x48, 0x00, 0x60, 0x16, + 0x59, 0x9c, 0x04, 0x13, 0x48, 0x00, 0x60, 0x17, 0x49, 0x50, 0x60, 0x18, + 0x49, 0x54, 0x60, 0x19, 0x59, 0xa8, 0x00, 0x64, 0x48, 0x00, 0x60, 0x1a, + 0x4a, 0x00, 0x60, 0x1b, 0x00, 0x10, 0xac, 0x62, 0x4a, 0x00, 0x60, 0x1c, + 0x00, 0x10, 0xac, 0x63, 0x4a, 0x00, 0x60, 0x1d, 0x00, 0x10, 0xac, 0x67, + 0x42, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x10, 0xb6, 0x10, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0a, 0xa9, + 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x04, 0x00, 0x00, 0x04, 0x82, 0x04, 0x0d, 0x80, 0x00, 0x00, 0x00, 0xc0, + 0x04, 0x02, 0x00, 0x55, 0x82, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x20, 0x20, + 0x59, 0x30, 0x04, 0x14, 0x84, 0x00, 0x05, 0x12, 0x82, 0x04, 0x0d, 0x80, + 0x00, 0x00, 0x20, 0x20, 0x04, 0x00, 0x00, 0x0b, 0x8c, 0x00, 0x05, 0x14, + 0x04, 0x02, 0x00, 0x0f, 0x48, 0x02, 0x64, 0x14, 0x81, 0x3e, 0x79, 0xc0, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x07, 0x0b, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x43, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xdf, + 0x59, 0x32, 0x68, 0x09, 0x59, 0x34, 0x0a, 0x00, 0x8c, 0x04, 0x0d, 0x0a, + 0x04, 0x00, 0x07, 0xf3, 0x84, 0x00, 0x05, 0x52, 0x04, 0x01, 0xf7, 0xf1, + 0x84, 0x00, 0x05, 0x14, 0x59, 0x2c, 0x08, 0x0d, 0x48, 0x06, 0x60, 0x15, + 0x04, 0x01, 0xf7, 0xef, 0x59, 0x32, 0x68, 0x09, 0x59, 0x34, 0x0a, 0x00, + 0x8c, 0x04, 0x0d, 0x0a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x07, 0x1e, + 0x59, 0x30, 0x0c, 0x14, 0x84, 0x04, 0x0d, 0x52, 0x48, 0x06, 0x64, 0x14, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0x1e, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x00, 0x7b, 0x81, 0x3e, 0x79, 0xc0, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x02, 0x07, 0x0b, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0x2c, + 0x8c, 0x00, 0x05, 0x1e, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x07, 0x38, + 0x82, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x20, 0x20, 0x82, 0x04, 0x0d, 0x80, + 0x00, 0x00, 0x20, 0x20, 0x04, 0x00, 0x00, 0x14, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x80, + 0x04, 0x00, 0x00, 0x08, 0x81, 0x3e, 0x79, 0xc0, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x02, 0x07, 0x0b, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x41, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xdf, 0x81, 0x3e, 0x79, 0xc0, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x07, 0x0b, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x43, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xdf, + 0x59, 0x32, 0x68, 0x09, 0x59, 0x34, 0x0a, 0x00, 0x8c, 0x04, 0x0d, 0x0a, + 0x04, 0x00, 0x07, 0xea, 0x59, 0x30, 0x0c, 0x14, 0x84, 0x04, 0x0d, 0x52, + 0x48, 0x06, 0x64, 0x14, 0x04, 0x01, 0xf7, 0xe6, 0x49, 0x2f, 0xc8, 0x57, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0x33, 0x49, 0x2f, 0xc8, 0x57, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0x33, + 0x48, 0x07, 0xc8, 0x56, 0x59, 0xa8, 0x00, 0x65, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x00, 0x00, 0x03, 0x80, 0x08, 0x05, 0x40, 0x04, 0x01, 0xf0, 0x02, + 0x80, 0x08, 0x05, 0x00, 0x48, 0x03, 0x50, 0x65, 0x1c, 0x01, 0xf0, 0x00, + 0x4a, 0x03, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x03, 0x08, 0x02, + 0x00, 0x00, 0x00, 0x01, 0x49, 0x7b, 0x08, 0x03, 0x49, 0x7b, 0x08, 0x04, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x84, 0x00, 0x02, 0x8c, 0x00, 0x05, 0x00, + 0x04, 0x00, 0x00, 0x04, 0x84, 0x00, 0x05, 0x00, 0x4a, 0x03, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x84, 0x00, 0x05, 0x44, 0x84, 0x00, 0x05, 0x06, + 0x48, 0x03, 0x08, 0x02, 0x82, 0x00, 0x0d, 0x00, 0x0f, 0xff, 0xff, 0xff, + 0x42, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x0a, 0xd5, 0x59, 0xa8, 0x00, 0x66, 0x82, 0x00, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x07, 0x48, 0x03, 0x50, 0x66, 0x80, 0x00, 0x05, 0x80, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x10, 0xac, 0xe6, 0x48, 0x00, 0x08, 0x00, + 0x48, 0x00, 0x08, 0x01, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xa8, 0x00, 0x66, + 0x82, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0x48, 0x03, 0x50, 0x66, + 0x1c, 0x01, 0xf0, 0x00, 0x83, 0x64, 0x04, 0x80, 0x00, 0x00, 0x00, 0x08, + 0x04, 0x00, 0x10, 0x1b, 0x58, 0xc8, 0x0a, 0x03, 0x80, 0x00, 0x05, 0x80, + 0x82, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x04, 0x08, 0x40, + 0x04, 0x02, 0x07, 0xfd, 0x81, 0x5c, 0x04, 0x80, 0x04, 0x00, 0x10, 0x13, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0x99, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x04, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x09, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x04, 0x4a, 0x02, 0x60, 0x07, 0x00, 0x00, 0x01, 0x01, + 0x04, 0x01, 0xf8, 0x09, 0x04, 0x01, 0xf8, 0x80, 0x80, 0x58, 0xb0, 0x40, + 0x04, 0x02, 0x07, 0xf3, 0x80, 0x00, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf7, 0xfd, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x1a, 0x49, 0x2e, 0x60, 0x08, + 0x58, 0xc8, 0x0a, 0x03, 0x4a, 0x02, 0x5a, 0x04, 0x00, 0x00, 0x00, 0x2c, + 0x49, 0x7a, 0x58, 0x00, 0x49, 0x7a, 0x58, 0x01, 0x49, 0x7a, 0x5c, 0x04, + 0x49, 0x7a, 0x5c, 0x06, 0x49, 0x7a, 0x58, 0x05, 0x4a, 0x02, 0x5a, 0x08, + 0x00, 0x00, 0x00, 0x05, 0x4a, 0x02, 0x5a, 0x07, 0x00, 0x00, 0x00, 0x02, + 0x58, 0xc8, 0x02, 0x01, 0x48, 0x02, 0x5c, 0x04, 0x58, 0xc8, 0x02, 0x02, + 0x48, 0x02, 0x5c, 0x07, 0x58, 0xc8, 0x02, 0x04, 0x48, 0x02, 0x5c, 0x08, + 0x4a, 0x02, 0x58, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x80, 0x04, 0x08, 0x40, + 0x04, 0x00, 0x00, 0x0c, 0x41, 0x2c, 0x20, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x07, 0x1a, 0x4a, 0x02, 0x5a, 0x04, 0x00, 0x00, 0x00, 0x0a, + 0x49, 0x7a, 0x5c, 0x04, 0x48, 0x12, 0x58, 0x00, 0x49, 0x2c, 0x20, 0x01, + 0x41, 0x2c, 0x20, 0x00, 0x80, 0x04, 0x08, 0x40, 0x04, 0x02, 0x07, 0xf7, + 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0x7c, 0x00, 0x00, 0x42, 0x02, 0xf8, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x4d, 0xf0, 0x00, 0x00, 0x42, 0x03, 0xe0, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x59, 0x84, 0x78, 0x03, 0x80, 0x3c, 0x79, 0xc0, + 0x04, 0x00, 0x00, 0x1e, 0x4c, 0x5c, 0x00, 0x00, 0x58, 0x3c, 0xb8, 0x08, + 0x58, 0x5c, 0x34, 0x08, 0x80, 0x18, 0x31, 0xc0, 0x04, 0x00, 0x00, 0x0b, + 0x04, 0x01, 0xf8, 0x4a, 0x04, 0x00, 0x00, 0x16, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x10, 0xac, 0xe6, 0x04, 0x01, 0xf8, 0x7f, 0x04, 0x00, 0x00, 0x12, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x04, 0x04, 0x00, 0x00, 0x0f, + 0x49, 0x2c, 0xb8, 0x05, 0x58, 0x5c, 0x00, 0x05, 0x80, 0x00, 0x05, 0x40, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x04, 0x01, 0xf8, 0x30, + 0x58, 0x5c, 0x54, 0x08, 0x04, 0x01, 0xf8, 0x0b, 0x5c, 0x00, 0xb8, 0x00, + 0x5c, 0x03, 0xe0, 0x00, 0x81, 0x7e, 0xf8, 0x40, 0x04, 0x02, 0x07, 0xe1, + 0x5c, 0x02, 0xf8, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x5c, 0x00, 0xb8, 0x00, + 0x5c, 0x03, 0xe0, 0x00, 0x5c, 0x02, 0xf8, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x40, 0x5c, 0x60, 0x00, 0x80, 0x28, 0x51, 0xc0, + 0x04, 0x00, 0x00, 0x18, 0x58, 0x5c, 0x02, 0x04, 0x82, 0x00, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x82, 0x04, 0x0c, 0x00, 0x00, 0x10, 0x0f, 0xd8, + 0x50, 0x04, 0x40, 0x00, 0x4c, 0x60, 0x00, 0x00, 0x4c, 0x64, 0x00, 0x00, + 0x4d, 0x04, 0x00, 0x00, 0x40, 0x20, 0xc0, 0x00, 0x40, 0x32, 0x08, 0x00, + 0x59, 0x84, 0xc8, 0x04, 0x4c, 0x28, 0x00, 0x00, 0x04, 0x01, 0xf9, 0x3d, + 0x5c, 0x00, 0x50, 0x00, 0x40, 0x60, 0x40, 0x00, 0x41, 0x04, 0x60, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0f, 0xb6, 0x04, 0x02, 0x07, 0xf6, + 0x5c, 0x02, 0x08, 0x00, 0x5c, 0x00, 0xc8, 0x00, 0x5c, 0x00, 0xc0, 0x00, + 0x58, 0xc8, 0x02, 0x04, 0x48, 0x00, 0xbc, 0x08, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x00, 0x7b, 0x4a, 0x02, 0x60, 0x07, 0x00, 0x00, 0x01, 0x01, + 0x49, 0x7a, 0x60, 0x09, 0x04, 0x01, 0xf0, 0x55, 0x48, 0x03, 0xc8, 0x56, + 0x59, 0x84, 0x00, 0x03, 0x80, 0x02, 0x65, 0x40, 0x04, 0x00, 0x00, 0x03, + 0x59, 0x30, 0x00, 0x00, 0x48, 0x03, 0x08, 0x03, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x59, 0x84, 0x00, 0x03, 0x48, 0x02, 0x60, 0x00, + 0x49, 0x33, 0x08, 0x03, 0x1c, 0x01, 0xf0, 0x00, 0x58, 0xcc, 0x08, 0x05, + 0x40, 0x18, 0x00, 0x00, 0x80, 0x04, 0x04, 0x80, 0x04, 0x00, 0x10, 0x0d, + 0x82, 0xcc, 0x05, 0x80, 0x00, 0x10, 0xac, 0xdb, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x58, 0xc8, 0x02, 0x05, 0x80, 0x04, 0x04, 0x80, + 0x04, 0x00, 0x10, 0x1d, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x1c, 0x01, 0xf0, 0x00, 0x80, 0x00, 0x35, 0x80, 0x04, 0x01, 0xf7, 0xfe, + 0x82, 0xcc, 0x05, 0x80, 0x00, 0x10, 0xac, 0xdb, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x58, 0xc8, 0x04, 0x00, 0x8c, 0x00, 0x05, 0x04, + 0x04, 0x00, 0x07, 0xf8, 0x58, 0xc8, 0x04, 0x0b, 0x8c, 0x00, 0x05, 0x1e, + 0x04, 0x00, 0x07, 0xf5, 0x8c, 0x00, 0x05, 0x00, 0x04, 0x02, 0x07, 0xf3, + 0x84, 0x00, 0x05, 0x40, 0x48, 0x01, 0x94, 0x0b, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x07, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x26, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x36, 0xf4, 0x04, 0x01, 0xf7, 0xe8, 0x58, 0xc8, 0x04, 0x0b, + 0x8c, 0x00, 0x05, 0x1e, 0x04, 0x00, 0x07, 0xe2, 0x8c, 0x00, 0x05, 0x02, + 0x04, 0x02, 0x07, 0xe0, 0x84, 0x00, 0x05, 0x42, 0x48, 0x01, 0x94, 0x0b, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x06, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x25, + 0x42, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x36, 0xf4, 0x04, 0x01, 0xf7, 0xd3, 0x48, 0x03, 0xc8, 0x56, + 0x58, 0x08, 0x00, 0x00, 0x42, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x58, 0x08, 0x08, 0x01, 0x80, 0x04, 0x04, 0x80, 0x04, 0x02, 0x00, 0x04, + 0x40, 0x0c, 0x00, 0x00, 0x80, 0x00, 0x05, 0x40, 0x04, 0x01, 0xf0, 0x05, + 0x04, 0x00, 0x10, 0x03, 0x80, 0x0c, 0x04, 0x80, 0x04, 0x01, 0xf0, 0x02, + 0x80, 0x00, 0x00, 0x80, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x59, 0x30, 0x00, 0x08, 0x80, 0x00, 0x0d, 0x40, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x58, 0x04, 0x00, 0x05, 0x80, 0x00, 0x05, 0x40, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0x30, 0x00, 0x07, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x01, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0xac, 0xe6, 0x58, 0x08, 0x08, 0x01, + 0x82, 0x04, 0x04, 0x00, 0x00, 0x10, 0xac, 0xe8, 0x49, 0x7a, 0x64, 0x14, + 0x4a, 0x02, 0x60, 0x15, 0x00, 0x00, 0xff, 0xff, 0x45, 0x30, 0x00, 0x00, + 0x80, 0x04, 0x08, 0x00, 0x82, 0x04, 0x04, 0x80, 0x00, 0x00, 0x00, 0x08, + 0x04, 0x00, 0x10, 0x02, 0x80, 0x00, 0x0d, 0x80, 0x48, 0x04, 0x10, 0x01, + 0x82, 0x04, 0x04, 0x00, 0x00, 0x10, 0xac, 0xe8, 0x45, 0x78, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x59, 0x30, 0x08, 0x08, + 0x80, 0x04, 0x09, 0xc0, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x4d, 0x2c, 0x00, 0x00, 0x58, 0x06, 0x58, 0x05, 0x81, 0x2e, 0x59, 0xc0, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x07, 0x2e, 0x49, 0x78, 0x08, 0x05, + 0x40, 0x06, 0x58, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x3b, + 0x5c, 0x02, 0x58, 0x00, 0x4d, 0x30, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x5c, 0x02, 0x60, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x08, 0x42, 0x01, 0x88, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x03, 0x42, 0x01, 0x88, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x30, 0x04, 0x06, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x09, + 0x04, 0x02, 0x00, 0x06, 0x59, 0x30, 0x00, 0x07, 0x8c, 0x00, 0x05, 0x10, + 0x04, 0x00, 0x00, 0x03, 0x80, 0x00, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x84, 0x08, 0x02, 0x8c, 0x04, 0x0d, 0x04, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x59, 0x84, 0x08, 0x02, 0x84, 0x04, 0x0d, 0x04, + 0x84, 0x04, 0x0d, 0x40, 0x4a, 0x03, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x07, 0x08, 0x02, 0x82, 0x04, 0x0d, 0x00, 0x0f, 0xff, 0xff, 0xff, + 0x42, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x0a, 0xd5, 0x48, 0x07, 0xc8, 0x57, 0x48, 0x05, 0x98, 0x0a, + 0x49, 0x79, 0x98, 0x01, 0x49, 0x79, 0x98, 0x03, 0x49, 0x79, 0x98, 0x06, + 0x49, 0x79, 0x98, 0x07, 0x49, 0x79, 0x98, 0x08, 0x49, 0x79, 0x98, 0x05, + 0x49, 0x79, 0x98, 0x09, 0x04, 0x01, 0xf8, 0xcc, 0x04, 0x00, 0x00, 0x0a, + 0x04, 0x01, 0xf8, 0xee, 0x04, 0x00, 0x00, 0x08, 0x48, 0x35, 0x98, 0x00, + 0x48, 0x35, 0x98, 0x02, 0x48, 0x35, 0x98, 0x06, 0x4a, 0x01, 0x98, 0x04, + 0x00, 0x00, 0x00, 0x01, 0x4a, 0x01, 0x98, 0x07, 0x00, 0x00, 0x00, 0x05, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x07, 0xc8, 0x57, 0x58, 0xcc, 0x10, 0x07, + 0x40, 0x04, 0x00, 0x00, 0x80, 0x08, 0x04, 0x80, 0x04, 0x02, 0x10, 0x20, + 0x4c, 0x04, 0x00, 0x00, 0x4c, 0x08, 0x00, 0x00, 0x04, 0x01, 0xf8, 0xdd, + 0x5c, 0x00, 0x10, 0x00, 0x5c, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x1c, + 0x58, 0xcc, 0x00, 0x06, 0x80, 0x00, 0x65, 0x40, 0x04, 0x02, 0x00, 0x0b, + 0x48, 0x35, 0x98, 0x00, 0x48, 0x35, 0x98, 0x02, 0x48, 0x35, 0x98, 0x06, + 0x49, 0x79, 0x98, 0x01, 0x49, 0x79, 0x98, 0x03, 0x49, 0x78, 0x68, 0x01, + 0x49, 0x78, 0x68, 0x00, 0x49, 0x79, 0x98, 0x04, 0x49, 0x79, 0x98, 0x07, + 0x04, 0x01, 0xf0, 0x05, 0x48, 0x30, 0x68, 0x01, 0x48, 0x34, 0x60, 0x00, + 0x48, 0x35, 0x98, 0x06, 0x49, 0x78, 0x68, 0x00, 0x58, 0xcc, 0x00, 0x04, + 0x58, 0xcc, 0x10, 0x07, 0x80, 0x00, 0x00, 0x00, 0x82, 0x08, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x48, 0x01, 0x98, 0x04, 0x48, 0x09, 0x98, 0x07, + 0x04, 0x01, 0xf7, 0xdf, 0x80, 0x00, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x0b, 0xc8, 0x57, 0x4c, 0x50, 0x00, 0x00, 0x4c, 0x54, 0x00, 0x00, + 0x4c, 0x58, 0x00, 0x00, 0x40, 0x08, 0x30, 0x00, 0x58, 0xcc, 0x08, 0x01, + 0x82, 0x04, 0x04, 0x80, 0x00, 0x00, 0x00, 0x05, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x82, 0x04, 0x04, 0x00, 0x00, 0x10, 0x60, 0x13, + 0x50, 0x00, 0x00, 0x00, 0x58, 0xcc, 0xa8, 0x00, 0x80, 0x54, 0xac, 0x00, + 0x42, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, + 0x80, 0x0c, 0x04, 0x80, 0x80, 0x08, 0x24, 0x80, 0x04, 0x02, 0x10, 0x02, + 0x40, 0x08, 0x00, 0x00, 0x80, 0x00, 0xb0, 0xc2, 0x80, 0x58, 0xb4, 0x00, + 0x54, 0x50, 0xa8, 0x00, 0x80, 0x50, 0xa0, 0x00, 0x80, 0x54, 0xa8, 0x00, + 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xfc, 0x40, 0x00, 0x10, 0x00, + 0x58, 0xcc, 0x28, 0x05, 0x58, 0xcc, 0x08, 0x07, 0x58, 0xcc, 0x20, 0x01, + 0x80, 0x14, 0x2c, 0x00, 0x80, 0x04, 0x0c, 0x80, 0x80, 0x10, 0x24, 0x00, + 0x48, 0x15, 0x98, 0x05, 0x48, 0x05, 0x98, 0x07, 0x48, 0x11, 0x98, 0x01, + 0x82, 0x10, 0x05, 0x80, 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x00, 0x0c, + 0x48, 0x11, 0x98, 0x01, 0x40, 0x08, 0x00, 0x00, 0x80, 0x18, 0x14, 0x80, + 0x40, 0x08, 0x30, 0x00, 0x04, 0x00, 0x00, 0x03, 0x04, 0x02, 0x17, 0xd6, + 0x80, 0x00, 0x05, 0x80, 0x5c, 0x00, 0xb0, 0x00, 0x5c, 0x00, 0xa8, 0x00, + 0x5c, 0x00, 0xa0, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x58, 0xcc, 0x08, 0x00, + 0x80, 0x04, 0x09, 0xc0, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x58, 0x04, 0x08, 0x00, 0x48, 0x05, 0x98, 0x00, 0x41, 0x78, 0x20, 0x00, + 0x04, 0x01, 0xf7, 0xee, 0x04, 0x01, 0xf8, 0x12, 0x50, 0x60, 0x00, 0x00, + 0x81, 0x04, 0x1c, 0x00, 0x58, 0x5c, 0x02, 0x04, 0x48, 0x03, 0xc8, 0x57, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x2c, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x58, 0x04, 0x02, 0x02, 0x80, 0x00, 0x00, 0xe0, + 0x80, 0x64, 0x05, 0x40, 0x48, 0x00, 0x18, 0x02, 0x58, 0x04, 0x00, 0x00, + 0x48, 0x00, 0x18, 0x00, 0x58, 0x04, 0x00, 0x01, 0x48, 0x00, 0x18, 0x01, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x07, 0xc8, 0x56, 0x58, 0xcc, 0x00, 0x05, + 0x80, 0x00, 0x00, 0x40, 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x48, 0x01, 0x98, 0x05, 0x58, 0xcc, 0x10, 0x03, 0x82, 0x08, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x05, 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x82, 0x08, 0x04, 0x00, 0x00, 0x10, 0x60, 0x13, 0x50, 0x00, 0x00, 0x00, + 0x58, 0xcc, 0x08, 0x02, 0x80, 0x04, 0x0c, 0x00, 0x80, 0x08, 0x10, 0x00, + 0x82, 0x08, 0x04, 0x80, 0x00, 0x00, 0x00, 0x05, 0x04, 0x02, 0x00, 0x0f, + 0x58, 0xcc, 0x20, 0x02, 0x58, 0x10, 0x00, 0x00, 0x80, 0x00, 0x6d, 0x40, + 0x04, 0x00, 0x00, 0x09, 0x4c, 0x34, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x5c, + 0x5c, 0x00, 0x68, 0x00, 0x49, 0x78, 0x68, 0x01, 0x48, 0x35, 0x98, 0x02, + 0x58, 0xcc, 0x00, 0x04, 0x80, 0x00, 0x00, 0x40, 0x48, 0x01, 0x98, 0x04, + 0x49, 0x79, 0x98, 0x03, 0x04, 0x01, 0xf0, 0x02, 0x48, 0x09, 0x98, 0x03, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x07, 0xc8, 0x56, + 0x41, 0x78, 0x18, 0x00, 0x58, 0xc8, 0x02, 0x01, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x00, 0x00, 0x02, 0x80, 0x0c, 0x18, 0x00, 0x58, 0xc8, 0x0c, 0x01, + 0x80, 0x04, 0x0c, 0x80, 0x04, 0x00, 0x10, 0x0a, 0x04, 0x00, 0x00, 0x09, + 0x80, 0x0c, 0x18, 0x00, 0x58, 0xc8, 0x02, 0x02, 0x80, 0x04, 0x14, 0x80, + 0x04, 0x00, 0x10, 0x05, 0x04, 0x00, 0x00, 0x04, 0x80, 0x0c, 0x18, 0x00, + 0x40, 0x08, 0x08, 0x00, 0x04, 0x01, 0xf7, 0xfb, 0x48, 0x0d, 0x92, 0x04, + 0x40, 0x0c, 0x00, 0x00, 0x42, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x80, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x07, 0x04, 0x00, 0x10, 0x06, + 0x80, 0x10, 0x20, 0x00, 0x82, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x00, 0x00, 0x02, 0x04, 0x02, 0x17, 0xfc, 0x48, 0x11, 0x92, 0x03, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x07, 0xc8, 0x56, 0x4d, 0x2c, 0x00, 0x00, + 0x58, 0xcc, 0x00, 0x0a, 0x80, 0x00, 0x05, 0x40, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x82, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x04, 0x04, 0x00, 0x00, 0x12, + 0x49, 0x2d, 0x98, 0x09, 0x49, 0x7a, 0x58, 0x00, 0x49, 0x7a, 0x58, 0x01, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x04, 0x04, 0x00, 0x00, 0x0c, + 0x58, 0xcc, 0x00, 0x09, 0x48, 0x02, 0x58, 0x00, 0x49, 0x7a, 0x58, 0x01, + 0x49, 0x2d, 0x98, 0x09, 0x82, 0x10, 0x24, 0x80, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x02, 0x17, 0xf7, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x58, 0xcc, 0x00, 0x09, + 0x80, 0x02, 0x5d, 0x40, 0x04, 0x00, 0x07, 0xfc, 0x59, 0x2c, 0x20, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x2e, 0x40, 0x10, 0x00, 0x00, + 0x04, 0x01, 0xf7, 0xfa, 0x58, 0xcc, 0x00, 0x09, 0x48, 0xcf, 0xc8, 0x57, + 0x80, 0x00, 0x6d, 0x40, 0x04, 0x00, 0x00, 0x05, 0x50, 0x34, 0x00, 0x00, + 0x48, 0x01, 0x98, 0x09, 0x49, 0x78, 0x68, 0x00, 0x49, 0x78, 0x68, 0x01, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x13, 0xc8, 0x57, 0x58, 0xcc, 0x00, 0x09, + 0x48, 0x00, 0x20, 0x00, 0x48, 0x11, 0x98, 0x09, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x07, 0xc8, 0x56, 0x4d, 0x2c, 0x00, 0x00, + 0x58, 0xcc, 0x00, 0x09, 0x80, 0x02, 0x5d, 0x40, 0x04, 0x00, 0x00, 0x07, + 0x59, 0x2c, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x07, 0x2e, 0x5c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf7, 0xf9, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x07, 0xc8, 0x56, 0x4d, 0x2c, 0x00, 0x00, 0x58, 0xcc, 0x00, 0x02, + 0x80, 0x02, 0x5d, 0x40, 0x04, 0x00, 0x00, 0x07, 0x59, 0x2c, 0x00, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x2e, + 0x5c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf7, 0xf9, 0x49, 0x79, 0x98, 0x00, + 0x49, 0x79, 0x98, 0x02, 0x49, 0x79, 0x98, 0x01, 0x49, 0x79, 0x98, 0x03, + 0x49, 0x79, 0x98, 0x06, 0x49, 0x79, 0x98, 0x07, 0x49, 0x79, 0x98, 0x08, + 0x49, 0x79, 0x98, 0x09, 0x49, 0x79, 0x98, 0x0a, 0x5c, 0x02, 0x58, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, + 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0f, + 0x00, 0x00, 0x00, 0x12, 0x48, 0x03, 0xc8, 0x56, 0x04, 0x01, 0xf8, 0x57, + 0x4a, 0x00, 0xc2, 0x04, 0x00, 0x00, 0x00, 0x3c, 0x59, 0x30, 0x10, 0x09, + 0x82, 0x08, 0x05, 0x80, 0x00, 0x10, 0xac, 0xf1, 0x04, 0x00, 0x00, 0x13, + 0x58, 0x08, 0x08, 0x02, 0x82, 0x04, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x58, 0x08, 0x04, 0x03, 0x48, 0x04, 0xc0, 0x05, 0x48, 0x00, 0xc4, 0x06, + 0x4a, 0x00, 0xc2, 0x07, 0x00, 0x00, 0x00, 0x03, 0x59, 0x30, 0x08, 0x11, + 0x58, 0x5c, 0x04, 0x04, 0x49, 0x78, 0xc2, 0x06, 0x48, 0x04, 0xc4, 0x07, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x0d, 0x58, 0x60, 0x02, 0x06, + 0x84, 0x00, 0x05, 0x40, 0x48, 0x00, 0xc2, 0x06, 0x04, 0x01, 0xf0, 0x09, + 0x58, 0x5c, 0x08, 0x0a, 0x82, 0x04, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x48, 0x04, 0xc0, 0x05, 0x4a, 0x00, 0xc4, 0x06, 0x00, 0x00, 0x07, 0xff, + 0x49, 0x78, 0xc2, 0x07, 0x04, 0x01, 0xf7, 0xef, 0x82, 0x60, 0x3c, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x58, 0x60, 0x54, 0x04, 0x40, 0x28, 0x20, 0x00, + 0x40, 0x5c, 0x60, 0x00, 0x58, 0x5c, 0x0a, 0x04, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x82, 0x04, 0x0c, 0x00, 0x00, 0x10, 0x0f, 0xd8, + 0x50, 0x04, 0x40, 0x00, 0x80, 0x00, 0x4d, 0x80, 0x50, 0x20, 0x00, 0x00, + 0x80, 0x30, 0x74, 0x00, 0x58, 0x38, 0x04, 0x02, 0x8c, 0x24, 0x4d, 0x00, + 0x04, 0x02, 0x00, 0x03, 0x48, 0x00, 0x3a, 0x00, 0x04, 0x01, 0xf0, 0x03, + 0x48, 0x00, 0x3c, 0x00, 0x80, 0x1c, 0x38, 0x00, 0x80, 0x24, 0x48, 0x00, + 0x80, 0x10, 0x20, 0x40, 0x04, 0x00, 0x00, 0x06, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x0f, 0xb6, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x04, 0x01, 0xf7, 0xf0, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x4d, 0x34, 0x00, 0x00, 0x59, 0x30, 0x00, 0x09, 0x80, 0x02, 0x6d, 0x40, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0x34, 0x04, 0x01, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x0e, 0x59, 0x84, 0x00, 0x00, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x0b, 0x83, 0x6c, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x00, 0x08, 0x59, 0x34, 0x1c, 0x03, + 0x42, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x42, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x37, 0x64, + 0x5c, 0x02, 0x68, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x80, 0x00, 0x15, 0x80, 0x58, 0xc8, 0x0c, 0x01, 0x59, 0x30, 0x00, 0x11, + 0x80, 0x04, 0x0c, 0x80, 0x48, 0x06, 0x60, 0x11, 0x58, 0xc8, 0x02, 0x01, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x05, 0x80, 0x08, 0x10, 0x00, + 0x80, 0x04, 0x0c, 0x80, 0x04, 0x00, 0x10, 0x07, 0x04, 0x00, 0x00, 0x06, + 0x58, 0xc8, 0x02, 0x02, 0x80, 0x08, 0x10, 0x00, 0x80, 0x04, 0x0c, 0x80, + 0x04, 0x00, 0x10, 0x02, 0x04, 0x02, 0x07, 0xfd, 0x48, 0x08, 0xbc, 0x08, + 0x48, 0x08, 0xc4, 0x04, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x4a, 0x03, 0x70, 0xe5, 0x00, 0x02, 0x00, 0x00, 0x59, 0xb8, 0x00, 0xe5, + 0x8c, 0x00, 0x05, 0x24, 0x04, 0x02, 0x07, 0xfc, 0x4a, 0x03, 0x70, 0xe5, + 0x00, 0x03, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x59, 0xb8, 0x00, 0xe5, 0x8c, 0x00, 0x05, 0x24, 0x04, 0x02, 0x07, 0xf5, + 0x59, 0x34, 0x00, 0x0e, 0x80, 0x00, 0x6d, 0x40, 0x04, 0x00, 0x00, 0x10, + 0x81, 0x30, 0x05, 0x80, 0x04, 0x02, 0x00, 0x04, 0x58, 0x34, 0x00, 0x00, + 0x48, 0x02, 0x68, 0x0e, 0x04, 0x01, 0xf0, 0x0a, 0x40, 0x34, 0x78, 0x00, + 0x58, 0x34, 0x00, 0x00, 0x80, 0x00, 0x6d, 0x40, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x81, 0x30, 0x05, 0x80, 0x04, 0x02, 0x07, 0xfa, + 0x58, 0x34, 0x00, 0x00, 0x48, 0x00, 0x78, 0x00, 0x49, 0x7a, 0x60, 0x00, + 0x4a, 0x03, 0x70, 0xe5, 0x00, 0x02, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x4d, 0x30, 0x00, 0x00, + 0x4d, 0x2c, 0x00, 0x00, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0xff, + 0x4a, 0x03, 0x70, 0xe5, 0x00, 0x02, 0x00, 0x00, 0x59, 0xb8, 0x00, 0xe5, + 0x8c, 0x00, 0x05, 0x24, 0x04, 0x00, 0x00, 0x05, 0x80, 0x04, 0x08, 0x40, + 0x04, 0x02, 0x07, 0xfa, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x4a, 0x03, 0x70, 0xe5, 0x00, 0x03, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x59, 0xb8, 0x00, 0xe5, 0x8c, 0x00, 0x05, 0x24, + 0x04, 0x02, 0x07, 0xf1, 0x59, 0x34, 0x00, 0x0e, 0x80, 0x02, 0x65, 0x40, + 0x04, 0x00, 0x00, 0x0e, 0x49, 0x33, 0xc8, 0x57, 0x59, 0x30, 0x00, 0x00, + 0x48, 0x02, 0x68, 0x0e, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x04, + 0x49, 0x7a, 0x62, 0x06, 0x49, 0x7a, 0x60, 0x09, 0x4a, 0x02, 0x60, 0x07, + 0x00, 0x00, 0x01, 0x01, 0x59, 0x32, 0x58, 0x08, 0x49, 0x7a, 0x5c, 0x08, + 0x04, 0x01, 0xfd, 0x69, 0x04, 0x01, 0xf7, 0xf1, 0x4a, 0x03, 0x70, 0xe5, + 0x00, 0x02, 0x00, 0x00, 0x5c, 0x02, 0x58, 0x00, 0x5c, 0x02, 0x60, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x4c, 0x00, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x58, 0x54, 0x04, 0x02, 0x00, 0x11, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0xb1, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x5c, 0x00, 0x00, 0x00, 0x48, 0x02, 0x68, 0x02, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, 0x04, 0x00, 0x00, 0x09, + 0x49, 0x36, 0x60, 0x09, 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x01, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xdf, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x30, 0x02, 0x03, 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x0e, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x48, 0x03, 0xc8, 0x57, + 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x61, 0x02, 0x00, 0x10, 0x61, 0x02, + 0x00, 0x10, 0x61, 0x02, 0x00, 0x10, 0x61, 0x04, 0x00, 0x10, 0x61, 0x62, + 0x00, 0x10, 0x61, 0x02, 0x00, 0x10, 0x61, 0x02, 0x00, 0x10, 0x61, 0xb4, + 0x00, 0x10, 0x61, 0xb5, 0x00, 0x10, 0x61, 0x02, 0x00, 0x10, 0x61, 0x02, + 0x00, 0x10, 0x61, 0x02, 0x00, 0x10, 0x61, 0x02, 0x00, 0x10, 0x61, 0x02, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x49, 0x3b, 0xc8, 0x57, + 0x83, 0x38, 0x04, 0x80, 0x00, 0x00, 0x00, 0x50, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x83, 0x38, 0x04, 0x80, 0x00, 0x00, 0x00, 0x49, + 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf0, 0x01, + 0x00, 0x10, 0x61, 0x17, 0x00, 0x10, 0x61, 0x39, 0x00, 0x10, 0x61, 0x15, + 0x00, 0x10, 0x61, 0x15, 0x00, 0x10, 0x61, 0x15, 0x00, 0x10, 0x61, 0x15, + 0x00, 0x10, 0x61, 0x47, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x4d, 0x2c, 0x00, 0x00, 0x59, 0x32, 0x58, 0x08, 0x59, 0x2c, 0x02, 0x06, + 0x48, 0x02, 0x5c, 0x06, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x5c, 0x00, 0x00, 0x59, 0x2c, 0xbc, 0x0a, 0x59, 0x2c, 0x00, 0x00, + 0x48, 0x02, 0x60, 0x08, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xed, + 0x59, 0x30, 0x00, 0x08, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x08, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x07, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x43, 0x5c, 0x00, 0xb8, 0x00, 0x5c, 0x02, 0x58, 0x00, + 0x04, 0x01, 0xf0, 0x88, 0x8c, 0x5c, 0xbd, 0x08, 0x04, 0x02, 0x00, 0x06, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x07, 0x49, 0x7a, 0x62, 0x06, + 0x49, 0x7a, 0x60, 0x08, 0x04, 0x01, 0xf0, 0x03, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x5c, 0x00, 0xb8, 0x00, 0x5c, 0x02, 0x58, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x04, 0x01, 0xfa, 0x6b, 0x4d, 0x2c, 0x00, 0x00, + 0x59, 0x32, 0x58, 0x08, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x3d, + 0x04, 0x00, 0x00, 0x06, 0x4d, 0x40, 0x00, 0x00, 0x42, 0x02, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf9, 0x0a, 0x5c, 0x02, 0x80, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x04, 0x01, 0xfa, 0x5d, 0x4d, 0x3c, 0x00, 0x00, 0x41, 0x7a, 0x78, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0xa0, 0x5c, 0x02, 0x78, 0x00, + 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x14, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa1, 0x37, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x33, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x4d, 0x2c, 0x00, 0x00, + 0x59, 0x32, 0x58, 0x08, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x3d, + 0x04, 0x00, 0x00, 0x06, 0x4d, 0x40, 0x00, 0x00, 0x42, 0x02, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x29, 0x04, 0x01, 0xf8, 0xef, 0x5c, 0x02, 0x80, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x49, 0x3b, 0xc8, 0x57, 0x49, 0x7a, 0x62, 0x06, 0x83, 0x38, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x54, 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x83, 0x38, 0x04, 0x80, 0x00, 0x00, 0x00, 0x47, 0x02, 0x00, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x61, 0xb3, + 0x00, 0x10, 0x61, 0x7c, 0x00, 0x10, 0x61, 0x7a, 0x00, 0x10, 0x61, 0x7a, + 0x00, 0x10, 0x61, 0x7a, 0x00, 0x10, 0x61, 0x7a, 0x00, 0x10, 0x61, 0x7a, + 0x00, 0x10, 0x61, 0x7a, 0x00, 0x10, 0x61, 0x7a, 0x00, 0x10, 0x61, 0x7a, + 0x00, 0x10, 0x61, 0x7a, 0x00, 0x10, 0x61, 0x7a, 0x00, 0x10, 0x61, 0x80, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0x30, 0x00, 0x11, + 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0x00, 0x00, 0x04, 0x02, 0x00, 0x34, + 0x59, 0x84, 0x08, 0x02, 0x8c, 0x04, 0x0d, 0x04, 0x04, 0x00, 0x00, 0x25, + 0x59, 0x30, 0x00, 0x09, 0x80, 0x02, 0x6d, 0x40, 0x04, 0x00, 0x00, 0x1f, + 0x4c, 0x5c, 0x00, 0x00, 0x4c, 0x60, 0x00, 0x00, 0x49, 0x7a, 0x62, 0x06, + 0x59, 0x30, 0xb8, 0x08, 0x58, 0x5c, 0x00, 0x05, 0x80, 0x00, 0xc5, 0x40, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x04, 0x01, 0xfe, 0x8b, + 0x40, 0x62, 0x58, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xed, + 0x49, 0x78, 0xb8, 0x05, 0x04, 0x01, 0xfe, 0xf3, 0x49, 0x7a, 0x60, 0x09, + 0x58, 0x5c, 0x34, 0x08, 0x04, 0x01, 0xfc, 0xa7, 0x04, 0x00, 0x00, 0x0e, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0xac, 0xe6, 0x04, 0x01, 0xfc, 0xdc, + 0x04, 0x00, 0x00, 0x0a, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x1a, + 0x04, 0x00, 0x00, 0x07, 0x49, 0x2c, 0xb8, 0x05, 0x58, 0x5c, 0x54, 0x08, + 0x04, 0x01, 0xfc, 0x6d, 0x5c, 0x00, 0xc0, 0x00, 0x5c, 0x00, 0xb8, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x04, 0x01, 0xfc, 0x93, 0x04, 0x01, 0xf7, 0xfc, + 0x8c, 0x04, 0x0d, 0x06, 0x04, 0x02, 0x07, 0xfc, 0x59, 0x30, 0x00, 0x09, + 0x80, 0x02, 0x6d, 0x40, 0x04, 0x00, 0x00, 0x06, 0x59, 0x34, 0x00, 0x0e, + 0x80, 0x00, 0x05, 0x40, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x49, 0x7a, 0x60, 0x09, 0x04, 0x01, 0xfc, 0xf7, 0x04, 0x01, 0xf7, 0xf2, + 0x04, 0x01, 0xf0, 0x81, 0x48, 0x03, 0xc8, 0x56, 0x48, 0x03, 0xc8, 0x56, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x43, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x03, + 0x49, 0x3a, 0x64, 0x03, 0x59, 0x32, 0x58, 0x08, 0x59, 0x2c, 0x00, 0x0f, + 0x48, 0x02, 0x60, 0x11, 0x49, 0x7a, 0x60, 0x13, 0x59, 0x2c, 0x04, 0x06, + 0x80, 0x00, 0x00, 0xc2, 0x80, 0x00, 0x10, 0xc4, 0x80, 0x08, 0x14, 0x00, + 0x48, 0x0a, 0x62, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0e, 0x95, + 0x42, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, 0x60, 0x04, 0x01, 0xf1, 0x65, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x44, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x59, 0x30, 0x02, 0x03, 0x82, 0x00, 0x0c, 0x80, + 0x00, 0x00, 0x00, 0x0e, 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x00, 0x06, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x00, 0x00, 0x57, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x04, 0x01, 0xfa, 0x99, 0x59, 0x30, 0x00, 0x04, 0x8c, 0x00, 0x05, 0x3e, + 0x04, 0x02, 0x00, 0x05, 0x04, 0x01, 0xf9, 0x98, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x04, 0x01, 0xf2, 0x7f, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xcb, 0x83, 0x04, 0x01, 0xfa, 0x7c, 0x59, 0x32, 0x58, 0x08, + 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x06, 0x04, 0x01, 0xf8, 0x61, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x48, 0x03, 0xc8, 0x56, + 0x59, 0x30, 0x02, 0x03, 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x0e, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x09, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x19, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x35, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x49, 0x33, 0xc8, 0x57, 0x4d, 0x2c, 0x00, 0x00, + 0x59, 0x32, 0x58, 0x08, 0x81, 0x2e, 0x59, 0xc0, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x59, 0x2c, 0x1a, 0x08, 0x8c, 0x0c, 0x1d, 0x0e, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x4d, 0x40, 0x00, 0x00, + 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf8, 0x40, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x71, 0x9c, 0x5c, 0x02, 0x80, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, + 0x04, 0x01, 0xfa, 0x63, 0x4d, 0xf0, 0x00, 0x00, 0x59, 0x30, 0x00, 0x04, + 0x8c, 0x00, 0x05, 0x3e, 0x04, 0x02, 0x00, 0x06, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x67, 0xa7, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x04, 0x01, 0xf0, 0x11, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x84, 0xd5, + 0x04, 0x02, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x66, 0xa5, + 0x04, 0x02, 0x00, 0x0b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xcb, 0x83, + 0x80, 0xc4, 0x00, 0x40, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x5c, 0x03, 0xe0, 0x00, 0x04, 0x00, 0x0a, 0x3a, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, 0x5c, 0x03, 0xe0, 0x00, + 0x04, 0x00, 0x0a, 0x35, 0x80, 0x00, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0d, 0xdd, + 0x49, 0x33, 0xc8, 0x57, 0x4c, 0x5c, 0x00, 0x00, 0x4d, 0x34, 0x00, 0x00, + 0x49, 0x7a, 0x62, 0x06, 0x59, 0x30, 0xb8, 0x08, 0x59, 0x30, 0x00, 0x09, + 0x80, 0x02, 0x6d, 0x40, 0x04, 0x02, 0x0e, 0x4b, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x10, 0xac, 0xe6, 0x04, 0x01, 0xfc, 0x38, 0x04, 0x00, 0x00, 0x09, + 0x58, 0xc8, 0x02, 0x04, 0x48, 0x00, 0xbc, 0x08, 0x41, 0x78, 0x50, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5e, 0x0e, 0x5c, 0x02, 0x68, 0x00, + 0x5c, 0x00, 0xb8, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x78, 0xbc, 0x08, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5e, 0x38, 0x04, 0x01, 0xf7, 0xfa, + 0x48, 0x03, 0xc8, 0x56, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x3d, + 0x04, 0x00, 0x00, 0x0f, 0x59, 0x2c, 0x00, 0x00, 0x80, 0x00, 0x0d, 0x40, + 0x04, 0x00, 0x00, 0x09, 0x49, 0x7a, 0x58, 0x00, 0x49, 0x42, 0x5a, 0x06, + 0x4c, 0x04, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x5c, 0x00, 0x08, 0x00, 0x40, 0x06, 0x58, 0x00, 0x04, 0x01, 0xf7, 0xf6, + 0x49, 0x42, 0x5a, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x1c, 0x01, 0xf0, 0x00, 0x04, 0x01, 0xf8, 0x07, 0x42, 0x01, 0x88, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x03, 0x42, 0x01, 0x88, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, + 0x59, 0x30, 0x0c, 0x06, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0e, + 0x04, 0x00, 0x00, 0x04, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x09, + 0x04, 0x02, 0x00, 0x04, 0x04, 0x01, 0xff, 0xde, 0x49, 0x7a, 0x60, 0x08, + 0x80, 0x00, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x2e, 0x60, 0x09, + 0x83, 0x30, 0x04, 0x80, 0x00, 0x10, 0xd8, 0xd4, 0x04, 0x00, 0x10, 0x16, + 0x41, 0x58, 0x00, 0x00, 0x81, 0x30, 0x04, 0x80, 0x04, 0x02, 0x10, 0x13, + 0x40, 0x04, 0x00, 0x00, 0x59, 0x30, 0x0c, 0x06, 0x80, 0x04, 0x05, 0x80, + 0x04, 0x02, 0x00, 0x12, 0x59, 0x30, 0x0a, 0x03, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x07, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x59, 0x30, 0x00, 0x08, 0x80, 0x00, 0x05, 0x40, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf0, 0x09, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x01, 0xf0, 0x06, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x07, 0x04, 0x02, 0x07, 0xfb, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x59, 0x2c, 0x0a, 0x06, + 0x48, 0x06, 0x5c, 0x06, 0x48, 0x02, 0x5a, 0x06, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x4c, 0x0c, 0x00, 0x00, 0x4c, 0x10, 0x00, 0x00, + 0x4c, 0x14, 0x00, 0x00, 0x4c, 0x18, 0x00, 0x00, 0x80, 0x00, 0x1d, 0x80, + 0x80, 0x00, 0x25, 0x80, 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x03, + 0x40, 0x08, 0x00, 0x00, 0x80, 0x0c, 0x1c, 0x00, 0x40, 0x0c, 0x28, 0x00, + 0x80, 0x0c, 0x19, 0x02, 0x80, 0x10, 0x21, 0x02, 0x82, 0x14, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x03, 0x82, 0x10, 0x25, 0x40, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x04, 0x09, 0x02, 0x80, 0x18, 0x30, 0x40, + 0x04, 0x02, 0x07, 0xf1, 0x40, 0x10, 0x08, 0x00, 0x40, 0x0c, 0x00, 0x00, + 0x5c, 0x00, 0x30, 0x00, 0x5c, 0x00, 0x28, 0x00, 0x5c, 0x00, 0x20, 0x00, + 0x5c, 0x00, 0x18, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x58, 0x00, 0x00, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x00, 0x00, 0x18, 0x80, 0x04, 0x1c, 0x80, 0x04, 0x02, 0x10, 0x16, + 0x80, 0x08, 0x10, 0xc2, 0x80, 0x04, 0x09, 0x82, 0x04, 0x00, 0x10, 0x06, + 0x80, 0x04, 0x1c, 0x80, 0x04, 0x02, 0x10, 0x05, 0x80, 0x58, 0xb0, 0x40, + 0x04, 0x02, 0x07, 0xfa, 0x04, 0x01, 0xf0, 0x06, 0x80, 0x04, 0x1c, 0x80, + 0x40, 0x0c, 0x08, 0x00, 0x80, 0x08, 0x10, 0x00, 0x80, 0x58, 0xb0, 0x40, + 0x04, 0x02, 0x07, 0xf4, 0x4c, 0x00, 0x00, 0x00, 0x41, 0xf0, 0x00, 0x00, + 0x82, 0x00, 0x05, 0x00, 0xf7, 0xff, 0xff, 0xff, 0x40, 0x03, 0xe0, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0xb0, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x41, 0xf0, 0x00, 0x00, 0x82, 0x00, 0x05, 0x40, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf7, 0xf8, 0x42, 0x00, 0x70, 0x00, + 0x00, 0x10, 0xad, 0x10, 0x4a, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x4a, 0x00, 0x74, 0x01, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x72, 0x01, + 0x00, 0x00, 0x08, 0x40, 0x4a, 0x03, 0x78, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x4a, 0x03, 0xc8, 0x21, 0x00, 0x00, 0x00, 0x10, 0x4a, 0x03, 0xc8, 0x23, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x01, 0xf8, 0x1d, 0x4a, 0x03, 0x78, 0xe9, + 0x00, 0x00, 0x3a, 0x0d, 0x4a, 0x03, 0x78, 0xe8, 0x00, 0x00, 0x00, 0x01, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x05, 0x42, 0x03, 0xa0, 0x00, + 0x00, 0x00, 0x76, 0x00, 0x4a, 0x03, 0xa0, 0x05, 0xd0, 0x00, 0x00, 0x01, + 0x59, 0xd0, 0x00, 0x06, 0x4a, 0x03, 0xa0, 0x05, 0x90, 0x00, 0x00, 0x01, + 0x83, 0xd3, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x20, 0x80, 0x04, 0x08, 0x40, + 0x04, 0x02, 0x07, 0xfa, 0x59, 0xe0, 0x00, 0x03, 0x82, 0x00, 0x05, 0x00, + 0xff, 0xff, 0xff, 0xe0, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x80, 0x00, + 0x48, 0x03, 0xc0, 0x03, 0x59, 0xc4, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, + 0xff, 0xfc, 0xff, 0xff, 0x48, 0x03, 0x88, 0x06, 0x1c, 0x01, 0xf0, 0x00, + 0x4d, 0x90, 0x00, 0x00, 0x4d, 0x18, 0x00, 0x00, 0x4a, 0x03, 0x78, 0xe7, + 0xaa, 0xaa, 0xaa, 0xaa, 0x4a, 0x03, 0x78, 0xe6, 0xaa, 0xaa, 0xaa, 0xaa, + 0x4a, 0x03, 0x78, 0xe5, 0xaa, 0xaa, 0xaa, 0xaa, 0x4a, 0x03, 0x78, 0xe4, + 0xaa, 0xaa, 0xaa, 0xaa, 0x4a, 0x03, 0x78, 0x1a, 0x00, 0x10, 0xaf, 0xa2, + 0x4a, 0x03, 0x78, 0x1b, 0x00, 0x10, 0x0f, 0xd8, 0x4a, 0x03, 0x78, 0x1c, + 0x00, 0x10, 0x0f, 0xe8, 0x4a, 0x03, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4a, 0x03, 0x18, 0x01, 0x00, 0x10, 0xad, 0x12, 0x4a, 0x03, 0x18, 0x02, + 0x00, 0x10, 0xad, 0x19, 0x42, 0x00, 0x08, 0x00, 0x00, 0x10, 0xaf, 0xa5, + 0x41, 0x7a, 0x30, 0x00, 0x81, 0x1b, 0x20, 0xc8, 0x83, 0x93, 0x24, 0x00, + 0x00, 0x00, 0xbf, 0x32, 0x48, 0x07, 0x20, 0x00, 0x4a, 0x03, 0x20, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x83, 0x18, 0x04, 0x00, 0x00, 0x10, 0x69, 0x3d, + 0x50, 0x00, 0x00, 0x00, 0x48, 0x03, 0x20, 0x02, 0x82, 0x04, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x81, 0x1a, 0x30, 0x00, 0x83, 0x18, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x17, 0xf1, 0x5c, 0x02, 0x30, 0x00, + 0x5c, 0x03, 0x20, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x06, 0x60, 0x04, + 0x49, 0x7a, 0x60, 0x00, 0x49, 0x7a, 0x60, 0x01, 0x59, 0xbc, 0x00, 0xea, + 0x8c, 0x00, 0x05, 0x16, 0x04, 0x02, 0x07, 0xfe, 0x83, 0x30, 0x04, 0x00, + 0xa0, 0x00, 0x00, 0x00, 0x48, 0x03, 0x78, 0xe1, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x59, 0x30, 0x08, 0x04, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x82, 0x04, 0x0d, 0x40, 0x80, 0x00, 0x00, 0x40, + 0x48, 0x06, 0x60, 0x04, 0x49, 0x7a, 0x60, 0x00, 0x59, 0xbc, 0x00, 0xea, + 0x8c, 0x00, 0x05, 0x16, 0x04, 0x02, 0x07, 0xfe, 0x83, 0x30, 0x04, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x48, 0x03, 0x78, 0xe1, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x30, 0x08, 0x00, 0x49, 0x7a, 0x60, 0x00, 0x04, 0x01, 0xf8, 0xf8, + 0x80, 0x18, 0x31, 0xc0, 0x04, 0x02, 0x00, 0x09, 0x59, 0x8c, 0x00, 0x04, + 0x81, 0x30, 0x05, 0x80, 0x04, 0x02, 0x00, 0x04, 0x48, 0x03, 0x18, 0x04, + 0x48, 0x03, 0x18, 0x05, 0x04, 0x01, 0xf0, 0x08, 0x48, 0x07, 0x18, 0x05, + 0x04, 0x01, 0xf0, 0x06, 0x48, 0x04, 0x30, 0x00, 0x59, 0x8c, 0x00, 0x04, + 0x81, 0x30, 0x05, 0x80, 0x04, 0x02, 0x00, 0x02, 0x48, 0x1b, 0x18, 0x04, + 0x04, 0x01, 0xf0, 0xfe, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x8c, 0x00, 0x0d, + 0x81, 0x30, 0x05, 0x80, 0x04, 0x00, 0x00, 0x03, 0x49, 0x7a, 0x60, 0x07, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xc4, 0x00, 0x04, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x04, 0x00, 0x00, 0x05, 0x4a, 0x03, 0x88, 0x04, + 0x00, 0x00, 0x00, 0x0c, 0x49, 0x7b, 0x28, 0x07, 0x04, 0x01, 0xf0, 0x0a, + 0x04, 0x01, 0xfa, 0xf8, 0x59, 0x30, 0x04, 0x03, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x04, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x42, 0x04, 0x02, 0x00, 0x02, 0x49, 0x7a, 0x60, 0x07, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x69, 0x08, 0x80, 0x00, 0x05, 0x80, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x30, 0x08, 0x04, 0x8c, 0x04, 0x0d, 0x20, + 0x04, 0x02, 0x00, 0x04, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x4d, 0x38, 0x00, 0x00, + 0x59, 0x30, 0x08, 0x04, 0x84, 0x04, 0x0d, 0x20, 0x48, 0x06, 0x60, 0x04, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x49, 0x59, 0x30, 0x02, 0x03, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x03, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x13, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0xdf, 0x80, 0x00, 0x05, 0x80, 0x5c, 0x02, 0x70, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x08, + 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x03, + 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x30, 0x00, 0x17, 0x81, 0x48, 0x05, 0x80, + 0x04, 0x02, 0x00, 0x03, 0x59, 0x30, 0x00, 0x18, 0x81, 0x4c, 0x05, 0x80, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0x2c, 0x00, 0x00, + 0x4d, 0x30, 0x00, 0x00, 0x04, 0x01, 0xf8, 0xd0, 0x4d, 0xf0, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x41, 0x59, 0x90, 0x00, 0x01, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0c, 0x01, 0xf0, 0x01, + 0x00, 0x10, 0x63, 0xbf, 0x00, 0x10, 0x63, 0xb4, 0x00, 0x10, 0x63, 0xb2, + 0x00, 0x10, 0x63, 0xb2, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x59, 0x92, 0x60, 0x04, 0x04, 0x01, 0xf8, 0x80, 0x81, 0x32, 0x61, 0xc0, + 0x04, 0x00, 0x00, 0x08, 0x59, 0x30, 0x00, 0x04, 0x8c, 0x00, 0x05, 0x16, + 0x04, 0x00, 0x00, 0x04, 0x59, 0x32, 0x58, 0x08, 0x49, 0x7a, 0x58, 0x08, + 0x49, 0x7a, 0x58, 0x09, 0x04, 0x01, 0xf8, 0x84, 0x5c, 0x03, 0xe0, 0x00, + 0x04, 0x00, 0x08, 0xa3, 0x5c, 0x02, 0x60, 0x00, 0x5c, 0x02, 0x58, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x48, 0x03, 0xc8, 0x57, 0x4d, 0x30, 0x00, 0x00, 0x49, 0x7b, 0x28, 0x07, + 0x04, 0x01, 0xf8, 0xad, 0x4d, 0xf0, 0x00, 0x00, 0x59, 0x8c, 0x00, 0x00, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x07, 0x48, 0x03, 0xc8, 0x57, + 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x63, 0xf7, 0x00, 0x10, 0x63, 0xda, + 0x00, 0x10, 0x63, 0xe3, 0x00, 0x10, 0x63, 0xe7, 0x00, 0x10, 0x63, 0xf2, + 0x00, 0x10, 0x63, 0xf7, 0x00, 0x10, 0x63, 0xd8, 0x00, 0x10, 0x63, 0xd8, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0x8c, 0x00, 0x0d, + 0x80, 0x02, 0x65, 0x40, 0x04, 0x00, 0x00, 0x04, 0x04, 0x01, 0xf8, 0x1e, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x69, 0x08, 0x04, 0x01, 0xf0, 0x15, 0x04, 0x01, 0xf8, 0x27, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x69, 0x08, 0x04, 0x01, 0xf0, 0x11, + 0x59, 0x8c, 0x00, 0x0d, 0x80, 0x02, 0x65, 0x40, 0x04, 0x00, 0x00, 0x0e, + 0x04, 0x01, 0xf8, 0x38, 0x04, 0x00, 0x00, 0x04, 0x04, 0x01, 0xf8, 0x0f, + 0x04, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf8, 0x1c, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x69, 0x08, 0x04, 0x01, 0xf0, 0x06, 0x04, 0x01, 0xf8, 0x30, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x69, 0x08, 0x5c, 0x03, 0xe0, 0x00, 0x04, 0x00, 0x08, 0x6b, + 0x5c, 0x02, 0x60, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x8c, 0x00, 0x09, + 0x81, 0x30, 0x05, 0x80, 0x04, 0x02, 0x00, 0x0c, 0x04, 0x01, 0xf8, 0x5a, + 0x04, 0x01, 0xf8, 0x43, 0x59, 0x30, 0x00, 0x00, 0x80, 0x00, 0x01, 0xc0, + 0x04, 0x00, 0x00, 0x04, 0x48, 0x03, 0x18, 0x09, 0x49, 0x7a, 0x60, 0x00, + 0x04, 0x01, 0xf0, 0x03, 0x49, 0x7b, 0x18, 0x09, 0x49, 0x7b, 0x18, 0x08, + 0x80, 0x00, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0x2c, 0x00, 0x00, + 0x59, 0x30, 0x04, 0x06, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x02, 0x00, 0x12, 0x59, 0x8c, 0x00, 0x0b, 0x81, 0x30, 0x05, 0x80, + 0x04, 0x02, 0x00, 0x0f, 0x04, 0x01, 0xf8, 0x46, 0x59, 0x32, 0x58, 0x08, + 0x49, 0x7a, 0x58, 0x08, 0x49, 0x7a, 0x58, 0x09, 0x04, 0x01, 0xf8, 0x2c, + 0x59, 0x30, 0x00, 0x00, 0x80, 0x00, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x04, + 0x48, 0x03, 0x18, 0x0b, 0x49, 0x7a, 0x60, 0x00, 0x04, 0x01, 0xf0, 0x03, + 0x49, 0x7b, 0x18, 0x0a, 0x49, 0x7b, 0x18, 0x0b, 0x80, 0x00, 0x05, 0x80, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x8c, 0x00, 0x05, + 0x81, 0x30, 0x05, 0x80, 0x04, 0x02, 0x00, 0x0c, 0x04, 0x01, 0xf8, 0x33, + 0x04, 0x01, 0xf8, 0x1c, 0x59, 0x30, 0x00, 0x00, 0x80, 0x00, 0x01, 0xc0, + 0x04, 0x00, 0x00, 0x04, 0x48, 0x03, 0x18, 0x05, 0x49, 0x7a, 0x60, 0x00, + 0x04, 0x01, 0xf0, 0x03, 0x49, 0x7b, 0x18, 0x05, 0x49, 0x7b, 0x18, 0x04, + 0x80, 0x00, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4a, 0x03, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x49, 0x7b, 0x20, 0x04, + 0x49, 0x7b, 0x20, 0x05, 0x59, 0x90, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x48, 0x03, 0x20, 0x06, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x04, 0x00, 0x00, 0x59, 0x30, 0x00, 0x04, + 0x82, 0x00, 0x05, 0x00, 0x7f, 0xfe, 0xff, 0xff, 0x48, 0x02, 0x60, 0x04, + 0x59, 0xbc, 0x00, 0xe4, 0x8c, 0x00, 0x05, 0x14, 0x04, 0x00, 0x00, 0x09, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x58, 0x04, 0x00, 0x12, + 0x81, 0x30, 0x05, 0x80, 0x04, 0x02, 0x00, 0x04, 0x49, 0x78, 0x08, 0x12, + 0x4a, 0x03, 0x78, 0xe4, 0x00, 0x00, 0x08, 0x00, 0x5c, 0x00, 0x08, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x59, 0x8c, 0x00, 0x0c, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x03, + 0x80, 0x00, 0x00, 0x40, 0x48, 0x03, 0x18, 0x0c, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xbc, 0x00, 0xea, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x02, 0x00, 0x04, 0x48, 0x03, 0xc8, 0x56, 0x4a, 0x03, 0x78, 0xe8, + 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x08, 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x00, 0x00, 0x03, 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xbc, 0x00, 0xea, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x07, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x02, 0x00, 0x11, 0x48, 0x03, 0xc8, 0x56, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x0e, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x59, 0xbc, 0x00, 0xea, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x07, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x05, 0x80, 0x04, 0x08, 0x40, + 0x04, 0x02, 0x07, 0xf9, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xbc, 0x00, 0xea, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0xbc, 0x00, 0xea, + 0x8c, 0x00, 0x05, 0x16, 0x04, 0x02, 0x07, 0xfe, 0x48, 0x07, 0x78, 0xe1, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xbc, 0x00, 0xea, 0x8c, 0x00, 0x05, 0x16, + 0x04, 0x02, 0x07, 0xfe, 0x48, 0x07, 0x78, 0xe1, 0x59, 0xbc, 0x00, 0xea, + 0x8c, 0x00, 0x05, 0x16, 0x04, 0x02, 0x07, 0xfe, 0x48, 0x0b, 0x78, 0xe1, + 0x1c, 0x01, 0xf0, 0x00, 0x4a, 0x03, 0x78, 0xe4, 0x00, 0x00, 0x20, 0x00, + 0x59, 0xa8, 0x00, 0x6c, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0c, + 0x04, 0x02, 0x00, 0x08, 0x42, 0x00, 0x70, 0x00, 0x00, 0x10, 0xad, 0x10, + 0x58, 0x38, 0x04, 0x01, 0x8c, 0x00, 0x05, 0x06, 0x04, 0x02, 0x00, 0x03, + 0x4a, 0x03, 0x78, 0xe4, 0x00, 0x08, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x82, 0x00, 0x0d, 0x00, 0x80, 0x00, 0x00, 0x18, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xe4, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x00, 0x10, 0x64, 0xc6, 0x00, 0x10, 0x65, 0x6b, 0x00, 0x10, 0x65, 0x85, + 0x00, 0x10, 0x64, 0xc6, 0x00, 0x10, 0x64, 0xc8, 0x00, 0x10, 0x64, 0xe9, + 0x00, 0x10, 0x65, 0x08, 0x00, 0x10, 0x65, 0x3d, 0x00, 0x10, 0x64, 0xc6, + 0x00, 0x10, 0x65, 0x69, 0x00, 0x10, 0x64, 0xc6, 0x00, 0x10, 0x64, 0xc6, + 0x00, 0x10, 0x64, 0xc6, 0x00, 0x10, 0x64, 0xc6, 0x00, 0x10, 0x64, 0xc6, + 0x00, 0x10, 0x64, 0xc6, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x4d, 0x30, 0x00, 0x00, 0x4d, 0x90, 0x00, 0x00, 0x4d, 0xd0, 0x00, 0x00, + 0x4d, 0xa4, 0x00, 0x00, 0x4d, 0x14, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x69, 0x2b, 0x59, 0xbc, 0x00, 0xea, 0x8c, 0x00, 0x05, 0x10, + 0x04, 0x00, 0x07, 0xfe, 0x59, 0xbe, 0x60, 0xe0, 0x59, 0x30, 0x00, 0x04, + 0x8c, 0x00, 0x05, 0x20, 0x04, 0x00, 0x00, 0x11, 0x82, 0x00, 0x05, 0x00, + 0xff, 0xfe, 0xfe, 0xff, 0x48, 0x02, 0x60, 0x04, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x01, 0xff, 0x9b, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x0f, 0x17, 0x5c, 0x02, 0x28, 0x00, 0x5c, 0x03, 0x48, 0x00, + 0x5c, 0x03, 0xa0, 0x00, 0x5c, 0x03, 0x20, 0x00, 0x5c, 0x02, 0x60, 0x00, + 0x4a, 0x03, 0x78, 0xe4, 0x00, 0x00, 0x00, 0x08, 0x04, 0x01, 0xf7, 0x7e, + 0x84, 0x00, 0x05, 0x10, 0x48, 0x02, 0x60, 0x04, 0x04, 0x01, 0xf7, 0xf6, + 0x4d, 0x30, 0x00, 0x00, 0x4d, 0x90, 0x00, 0x00, 0x4d, 0xd0, 0x00, 0x00, + 0x4d, 0xa4, 0x00, 0x00, 0x4d, 0x14, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x69, 0x2b, 0x59, 0xbc, 0x00, 0xea, 0x8c, 0x00, 0x05, 0x10, + 0x04, 0x00, 0x07, 0xfe, 0x59, 0xbe, 0x60, 0xe0, 0x59, 0x30, 0x00, 0x04, + 0x8c, 0x00, 0x05, 0x20, 0x04, 0x00, 0x00, 0x0f, 0x82, 0x00, 0x05, 0x00, + 0xff, 0xfe, 0xfe, 0xff, 0x48, 0x02, 0x60, 0x04, 0x04, 0x01, 0xff, 0x7c, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0f, 0x55, 0x5c, 0x02, 0x28, 0x00, + 0x5c, 0x03, 0x48, 0x00, 0x5c, 0x03, 0xa0, 0x00, 0x5c, 0x03, 0x20, 0x00, + 0x5c, 0x02, 0x60, 0x00, 0x4a, 0x03, 0x78, 0xe4, 0x00, 0x00, 0x00, 0x08, + 0x04, 0x01, 0xf7, 0x5f, 0x84, 0x00, 0x05, 0x10, 0x48, 0x02, 0x60, 0x04, + 0x04, 0x01, 0xf7, 0xf6, 0x4d, 0x30, 0x00, 0x00, 0x4d, 0x2c, 0x00, 0x00, + 0x4d, 0x34, 0x00, 0x00, 0x4d, 0xa4, 0x00, 0x00, 0x4c, 0xd0, 0x00, 0x00, + 0x59, 0xbc, 0x00, 0xea, 0x8c, 0x00, 0x05, 0x10, 0x04, 0x00, 0x07, 0xfe, + 0x59, 0xbe, 0x60, 0xe0, 0x81, 0x32, 0x61, 0xc0, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x59, 0x30, 0x00, 0x04, 0x8c, 0x00, 0x05, 0x20, + 0x04, 0x00, 0x00, 0x1e, 0x82, 0x00, 0x05, 0x00, 0xff, 0xfe, 0xfe, 0xff, + 0x48, 0x02, 0x60, 0x04, 0x59, 0x32, 0x68, 0x09, 0x42, 0x03, 0x48, 0x00, + 0x00, 0x10, 0xad, 0x12, 0x04, 0x01, 0x10, 0x00, 0x4a, 0x03, 0xc8, 0x40, + 0x00, 0x10, 0xad, 0x19, 0x4a, 0x03, 0xc8, 0x42, 0x00, 0x00, 0x00, 0x12, + 0x04, 0x01, 0x10, 0x00, 0x4a, 0x03, 0xc8, 0x40, 0x00, 0x10, 0xad, 0x2b, + 0x4a, 0x03, 0xc8, 0x42, 0x00, 0x00, 0x00, 0xff, 0x04, 0x01, 0x10, 0x00, + 0x4a, 0x03, 0xc8, 0x40, 0x00, 0x10, 0xae, 0x2a, 0x4a, 0x03, 0xc8, 0x42, + 0x00, 0x00, 0x00, 0xff, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x69, 0x42, + 0x5c, 0x01, 0xa0, 0x00, 0x5c, 0x03, 0x48, 0x00, 0x5c, 0x02, 0x68, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x5c, 0x02, 0x60, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x84, 0x00, 0x05, 0x10, 0x48, 0x02, 0x60, 0x04, 0x5c, 0x01, 0xa0, 0x00, + 0x5c, 0x03, 0x48, 0x00, 0x5c, 0x02, 0x68, 0x00, 0x5c, 0x02, 0x58, 0x00, + 0x5c, 0x02, 0x60, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4d, 0x30, 0x00, 0x00, 0x4d, 0x2c, 0x00, 0x00, 0x4d, 0x34, 0x00, 0x00, + 0x4c, 0xd0, 0x00, 0x00, 0x4d, 0x90, 0x00, 0x00, 0x4d, 0xd0, 0x00, 0x00, + 0x4d, 0xa4, 0x00, 0x00, 0x4d, 0x14, 0x00, 0x00, 0x04, 0x01, 0xfb, 0xe6, + 0x59, 0xbc, 0x00, 0xea, 0x8c, 0x00, 0x05, 0x10, 0x04, 0x00, 0x07, 0xfe, + 0x59, 0xbe, 0x60, 0xe0, 0x81, 0x32, 0x61, 0xc0, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x59, 0x30, 0x00, 0x04, 0x8c, 0x00, 0x05, 0x20, + 0x04, 0x00, 0x00, 0x0f, 0x82, 0x00, 0x05, 0x00, 0xff, 0xfe, 0xfe, 0xff, + 0x48, 0x02, 0x60, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x70, 0xae, + 0x5c, 0x02, 0x28, 0x00, 0x5c, 0x03, 0x48, 0x00, 0x5c, 0x03, 0xa0, 0x00, + 0x5c, 0x03, 0x20, 0x00, 0x5c, 0x01, 0xa0, 0x00, 0x5c, 0x02, 0x68, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x5c, 0x02, 0x60, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x84, 0x00, 0x05, 0x10, 0x48, 0x02, 0x60, 0x04, 0x5c, 0x02, 0x28, 0x00, + 0x5c, 0x03, 0x48, 0x00, 0x5c, 0x03, 0xa0, 0x00, 0x5c, 0x03, 0x20, 0x00, + 0x5c, 0x01, 0xa0, 0x00, 0x5c, 0x02, 0x68, 0x00, 0x5c, 0x02, 0x58, 0x00, + 0x5c, 0x02, 0x60, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x4d, 0x30, 0x00, 0x00, 0x4d, 0x38, 0x00, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x93, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x04, 0x01, 0xff, 0x05, 0x59, 0x8e, 0x60, 0x0d, + 0x59, 0xc4, 0x00, 0x04, 0x8c, 0x00, 0x05, 0x06, 0x04, 0x00, 0x00, 0x04, + 0x04, 0x01, 0xf8, 0xee, 0x4a, 0x03, 0x88, 0x04, 0x00, 0x00, 0x00, 0x08, + 0x81, 0x32, 0x61, 0xc0, 0x04, 0x00, 0x00, 0x06, 0x04, 0x01, 0xfb, 0xa6, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x14, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0xdf, 0x4a, 0x03, 0x78, 0xe4, 0x00, 0x00, 0x00, 0x02, + 0x5c, 0x02, 0x70, 0x00, 0x5c, 0x02, 0x60, 0x00, 0x04, 0x01, 0xf6, 0xdf, + 0x4d, 0x18, 0x00, 0x00, 0x4d, 0x30, 0x00, 0x00, 0x4d, 0x38, 0x00, 0x00, + 0x4d, 0x90, 0x00, 0x00, 0x4d, 0xd0, 0x00, 0x00, 0x4d, 0xa4, 0x00, 0x00, + 0x4d, 0x14, 0x00, 0x00, 0x04, 0x01, 0xfe, 0xea, 0x41, 0x7a, 0x30, 0x00, + 0x59, 0xc4, 0x08, 0x04, 0x83, 0x18, 0x04, 0x00, 0x00, 0x10, 0x68, 0xea, + 0x50, 0x00, 0x00, 0x00, 0x80, 0x04, 0x05, 0x00, 0x04, 0x00, 0x00, 0x1b, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x94, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x04, 0x01, 0xfb, 0x93, 0x59, 0x92, 0x60, 0x04, + 0x04, 0x01, 0xf8, 0x6c, 0x83, 0x18, 0x04, 0x00, 0x00, 0x10, 0x68, 0xea, + 0x50, 0x00, 0x00, 0x00, 0x48, 0x03, 0x88, 0x04, 0x81, 0x32, 0x61, 0xc0, + 0x04, 0x00, 0x00, 0x0a, 0x59, 0x30, 0x00, 0x04, 0x8c, 0x00, 0x05, 0x0c, + 0x04, 0x02, 0x00, 0x03, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x03, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0xdf, 0x59, 0xc4, 0x00, 0x04, 0x82, 0x00, 0x05, 0x00, + 0x00, 0xf8, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0x81, 0x1a, 0x30, 0x00, + 0x83, 0x18, 0x04, 0x80, 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x17, 0xdd, + 0x4a, 0x03, 0x78, 0xe4, 0x00, 0x00, 0x00, 0x08, 0x5c, 0x02, 0x28, 0x00, + 0x5c, 0x03, 0x48, 0x00, 0x5c, 0x03, 0xa0, 0x00, 0x5c, 0x03, 0x20, 0x00, + 0x5c, 0x02, 0x70, 0x00, 0x5c, 0x02, 0x60, 0x00, 0x5c, 0x02, 0x30, 0x00, + 0x04, 0x01, 0xf6, 0xa8, 0x4d, 0x2c, 0x00, 0x00, 0x4d, 0x34, 0x00, 0x00, + 0x59, 0x32, 0x68, 0x09, 0x59, 0x8c, 0x08, 0x00, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x02, 0x00, 0x06, 0x83, 0x8c, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x83, 0x8c, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x01, 0xf0, 0x10, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x02, 0x00, 0x06, 0x83, 0x8c, 0x14, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x83, 0x8c, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x01, 0xf0, 0x08, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, 0x04, 0x02, 0x00, 0x28, + 0x83, 0x8c, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x83, 0x8c, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x0a, 0x41, 0x30, 0x68, 0x00, 0x58, 0x34, 0x00, 0x00, + 0x80, 0x00, 0x7d, 0x40, 0x04, 0x00, 0x00, 0x20, 0x58, 0x3c, 0x00, 0x09, + 0x81, 0x34, 0x05, 0x80, 0x04, 0x02, 0x00, 0x06, 0x40, 0x3c, 0x68, 0x00, + 0x58, 0x3c, 0x00, 0x00, 0x80, 0x00, 0x7d, 0x40, 0x04, 0x02, 0x07, 0xfa, + 0x04, 0x01, 0xf0, 0x18, 0x49, 0x33, 0xc8, 0x57, 0x48, 0x3f, 0xc8, 0x57, + 0x58, 0x3c, 0x00, 0x00, 0x48, 0x00, 0x68, 0x00, 0x49, 0x30, 0x78, 0x00, + 0x44, 0x3c, 0x10, 0x00, 0x50, 0x0c, 0x00, 0x00, 0x80, 0x3c, 0x05, 0x80, + 0x04, 0x02, 0x00, 0x02, 0x44, 0x34, 0x18, 0x00, 0x80, 0x00, 0x05, 0x80, + 0x48, 0x03, 0x18, 0x0d, 0x48, 0x03, 0x18, 0x0f, 0x59, 0x8c, 0x00, 0x00, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x03, + 0x4a, 0x03, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x05, 0x80, + 0x5c, 0x02, 0x68, 0x00, 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf7, 0xfb, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x08, 0x42, 0x01, 0x88, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x42, 0x01, 0x88, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x1b, 0xc8, 0x57, 0x59, 0xc8, 0x08, 0x40, 0x82, 0x04, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x10, 0x48, 0x03, 0x90, 0x40, 0x59, 0xc4, 0x10, 0x08, + 0x82, 0x08, 0x05, 0x00, 0xff, 0xff, 0xff, 0x7f, 0x48, 0x03, 0x88, 0x08, + 0x4c, 0x04, 0x00, 0x00, 0x4c, 0x08, 0x00, 0x00, 0x04, 0x01, 0xfa, 0xc3, + 0x04, 0x02, 0x00, 0x07, 0x04, 0x01, 0xfa, 0xc7, 0x04, 0x00, 0x00, 0x22, + 0x48, 0x03, 0x88, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0f, 0x95, + 0x04, 0x01, 0xf0, 0x42, 0x4a, 0x03, 0x88, 0x03, 0x00, 0x00, 0x00, 0x08, + 0x59, 0xc4, 0x00, 0x03, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x07, 0xfd, 0x8c, 0x00, 0x05, 0x02, 0x04, 0x02, 0x00, 0x07, + 0x04, 0x01, 0xfa, 0xb9, 0x04, 0x00, 0x00, 0x14, 0x48, 0x03, 0x88, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0f, 0x95, 0x04, 0x01, 0xf0, 0x34, + 0x59, 0xc8, 0x00, 0x40, 0x84, 0x00, 0x05, 0x6a, 0x48, 0x03, 0x90, 0x40, + 0x59, 0xc8, 0x00, 0x40, 0x8c, 0x00, 0x05, 0x2a, 0x04, 0x02, 0x07, 0xfe, + 0x59, 0xc4, 0x00, 0x05, 0x82, 0x00, 0x05, 0x00, 0xc0, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x06, 0x59, 0xc4, 0x00, 0xa3, 0x84, 0x00, 0x05, 0x40, + 0x48, 0x03, 0x88, 0xa3, 0x4a, 0x03, 0x88, 0x05, 0xc0, 0x00, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0f, 0x64, 0x4a, 0x03, 0xa0, 0x05, + 0x30, 0x00, 0x00, 0x00, 0x59, 0xd0, 0x00, 0x06, 0x4a, 0x03, 0xa0, 0x05, + 0x30, 0x00, 0x00, 0x00, 0x59, 0x90, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x48, 0x03, 0x20, 0x06, 0x59, 0xd0, 0x00, 0x05, + 0x8c, 0x00, 0x05, 0x04, 0x04, 0x02, 0x07, 0xfe, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x76, 0x00, 0x83, 0x18, 0x05, 0x40, 0x60, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x08, 0xa1, 0x81, 0x18, 0x00, 0xdc, 0x59, 0xc8, 0x08, 0x40, + 0x80, 0x04, 0x05, 0x40, 0x48, 0x03, 0x90, 0x40, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x30, 0x00, 0x48, 0x03, 0x90, 0x40, 0x59, 0xc8, 0x00, 0x40, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x30, 0x00, 0x04, 0x02, 0x07, 0xfd, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0f, 0x83, 0x83, 0x18, 0x04, 0x00, + 0x00, 0x10, 0x68, 0xea, 0x50, 0x00, 0x00, 0x00, 0x48, 0x03, 0x88, 0x04, + 0x80, 0x00, 0x05, 0x80, 0x4d, 0xf0, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5c, 0x41, 0x5c, 0x03, 0xe0, 0x00, 0x5c, 0x00, 0x10, 0x00, + 0x5c, 0x00, 0x08, 0x00, 0x48, 0x0b, 0x88, 0x08, 0x48, 0x07, 0x90, 0x40, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x59, 0xc8, 0x08, 0x40, + 0x82, 0x04, 0x05, 0x40, 0x00, 0x00, 0x00, 0x10, 0x48, 0x03, 0x90, 0x40, + 0x59, 0xc4, 0x10, 0x08, 0x82, 0x08, 0x05, 0x00, 0xff, 0xff, 0xff, 0x7f, + 0x48, 0x03, 0x88, 0x08, 0x4c, 0x04, 0x00, 0x00, 0x4c, 0x08, 0x00, 0x00, + 0x59, 0xc4, 0x00, 0x04, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x02, 0x00, 0x10, 0x59, 0xc4, 0x00, 0x04, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x04, 0x00, 0x00, 0x05, 0x4a, 0x03, 0x88, 0x04, + 0x00, 0x00, 0x00, 0x0c, 0x8c, 0x00, 0x05, 0x04, 0x04, 0x01, 0xf0, 0x25, + 0x59, 0xc8, 0x00, 0x40, 0x84, 0x00, 0x05, 0x6e, 0x48, 0x03, 0x90, 0x40, + 0x59, 0xc8, 0x00, 0x40, 0x8c, 0x00, 0x05, 0x2e, 0x04, 0x02, 0x07, 0xfe, + 0x04, 0x01, 0xf0, 0x1e, 0x4a, 0x03, 0x88, 0x03, 0x00, 0x00, 0x00, 0x08, + 0x59, 0xc4, 0x00, 0x03, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x07, 0xfd, 0x8c, 0x00, 0x05, 0x02, 0x04, 0x02, 0x00, 0x06, + 0x59, 0xc4, 0x00, 0x04, 0x4a, 0x03, 0x88, 0x04, 0x00, 0x00, 0x00, 0x0c, + 0x8c, 0x00, 0x05, 0x04, 0x04, 0x01, 0xf0, 0x11, 0x59, 0xc8, 0x00, 0x40, + 0x84, 0x00, 0x05, 0x6a, 0x48, 0x03, 0x90, 0x40, 0x59, 0xc8, 0x00, 0x40, + 0x8c, 0x00, 0x05, 0x2a, 0x04, 0x02, 0x07, 0xfe, 0x59, 0xc4, 0x00, 0x05, + 0x82, 0x00, 0x05, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, + 0x59, 0xc4, 0x00, 0xa3, 0x84, 0x00, 0x05, 0x40, 0x48, 0x03, 0x88, 0xa3, + 0x4a, 0x03, 0x88, 0x05, 0xc0, 0x00, 0x00, 0x00, 0x80, 0x00, 0x05, 0x80, + 0x49, 0x7b, 0x28, 0x07, 0x5c, 0x00, 0x10, 0x00, 0x5c, 0x00, 0x08, 0x00, + 0x48, 0x0b, 0x88, 0x08, 0x48, 0x07, 0x90, 0x40, 0x1c, 0x01, 0xf0, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x48, 0x03, 0xc8, 0x57, + 0x49, 0x1b, 0xc8, 0x57, 0x49, 0x33, 0xc8, 0x57, 0x4d, 0x90, 0x00, 0x00, + 0x4d, 0xd0, 0x00, 0x00, 0x4d, 0xa4, 0x00, 0x00, 0x4d, 0x14, 0x00, 0x00, + 0x04, 0x01, 0xfd, 0xc8, 0x4d, 0xf0, 0x00, 0x00, 0x04, 0x01, 0xfa, 0x7b, + 0x59, 0x90, 0x00, 0x04, 0x80, 0x00, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x11, + 0x81, 0x30, 0x05, 0x80, 0x04, 0x02, 0x00, 0x0f, 0x59, 0x30, 0x00, 0x04, + 0x84, 0x00, 0x05, 0x20, 0x48, 0x02, 0x60, 0x04, 0x04, 0x01, 0xff, 0x4d, + 0x04, 0x02, 0x00, 0x09, 0x5c, 0x03, 0xe0, 0x00, 0x04, 0x00, 0x0d, 0xa7, + 0x80, 0x00, 0x05, 0x80, 0x5c, 0x02, 0x28, 0x00, 0x5c, 0x03, 0x48, 0x00, + 0x5c, 0x03, 0xa0, 0x00, 0x5c, 0x03, 0x20, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x04, 0x01, 0xfc, 0xe1, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x59, 0x30, 0x00, 0x04, 0x84, 0x00, 0x05, 0x20, 0x48, 0x02, 0x60, 0x04, + 0x8c, 0x00, 0x05, 0x0c, 0x02, 0x02, 0x08, 0x00, 0x00, 0x02, 0x07, 0xdf, + 0x5c, 0x03, 0xe0, 0x00, 0x04, 0x00, 0x0d, 0x96, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x5c, 0x02, 0x28, 0x00, 0x5c, 0x03, 0x48, 0x00, + 0x5c, 0x03, 0xa0, 0x00, 0x5c, 0x03, 0x20, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x04, 0x01, 0xfd, 0xa0, 0x4d, 0xf0, 0x00, 0x00, + 0x59, 0x8c, 0x00, 0x0d, 0x80, 0x02, 0x65, 0x40, 0x04, 0x00, 0x00, 0x12, + 0x59, 0x30, 0x00, 0x04, 0x84, 0x00, 0x05, 0x20, 0x48, 0x02, 0x60, 0x04, + 0x04, 0x01, 0xff, 0x86, 0x04, 0x00, 0x00, 0x17, 0x04, 0x01, 0xfc, 0xe4, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x13, 0x59, 0x30, 0x00, 0x04, + 0x8c, 0x00, 0x05, 0x0c, 0x02, 0x02, 0x08, 0x00, 0x00, 0x02, 0x07, 0xdf, + 0x5c, 0x03, 0xe0, 0x00, 0x04, 0x00, 0x0d, 0x7b, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, 0x83, 0x6c, 0x15, 0x80, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x07, 0xf9, 0x83, 0x6c, 0x15, 0x80, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x07, 0xf6, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x10, 0x3d, 0xf2, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5b, 0x6f, + 0x5c, 0x03, 0xe0, 0x00, 0x04, 0x00, 0x0d, 0x6c, 0x80, 0x00, 0x05, 0x80, + 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0x30, 0x00, 0x00, 0x4d, 0x18, 0x00, 0x00, + 0x4d, 0x3c, 0x00, 0x00, 0x04, 0x01, 0xfd, 0x79, 0x4d, 0xf0, 0x00, 0x00, + 0x4a, 0x03, 0x78, 0xe4, 0x00, 0x00, 0x00, 0x0f, 0x04, 0x01, 0xfa, 0x07, + 0x41, 0x7a, 0x30, 0x00, 0x59, 0x92, 0x60, 0x04, 0x81, 0x32, 0x61, 0xc0, + 0x04, 0x00, 0x00, 0x10, 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x45, 0xf8, 0x04, 0x00, 0x00, 0x0a, 0x59, 0x30, 0x0c, 0x06, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x04, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x06, 0x04, 0x02, 0x00, 0x03, + 0x42, 0x02, 0x78, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x83, 0xe0, 0x81, 0x1a, 0x30, 0x00, 0x83, 0x18, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x17, 0xeb, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x12, 0x65, + 0x4a, 0x03, 0x78, 0xe4, 0x00, 0x00, 0x00, 0x0a, 0x5c, 0x03, 0xe0, 0x00, + 0x04, 0x00, 0x0d, 0x43, 0x5c, 0x02, 0x78, 0x00, 0x5c, 0x02, 0x30, 0x00, + 0x5c, 0x02, 0x60, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x4d, 0x30, 0x00, 0x00, 0x04, 0x01, 0xfd, 0x4f, 0x4d, 0xf0, 0x00, 0x00, + 0x59, 0xc8, 0x08, 0x40, 0x82, 0x04, 0x05, 0x40, 0x00, 0x00, 0x00, 0x10, + 0x48, 0x03, 0x90, 0x40, 0x59, 0xc4, 0x10, 0x08, 0x82, 0x08, 0x05, 0x00, + 0xff, 0xff, 0xff, 0x7f, 0x48, 0x03, 0x88, 0x08, 0x4c, 0x04, 0x00, 0x00, + 0x4c, 0x08, 0x00, 0x00, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x01, 0xf9, 0xc6, 0x59, 0x8e, 0x60, 0x0d, 0x81, 0x32, 0x61, 0xc0, + 0x04, 0x02, 0x0f, 0x9d, 0x04, 0x00, 0x09, 0xcf, 0x49, 0x7b, 0x28, 0x07, + 0x04, 0x01, 0xf8, 0x0a, 0x5c, 0x00, 0x10, 0x00, 0x5c, 0x00, 0x08, 0x00, + 0x48, 0x0b, 0x88, 0x08, 0x84, 0x04, 0x0d, 0x74, 0x48, 0x07, 0x90, 0x40, + 0x5c, 0x03, 0xe0, 0x00, 0x04, 0x00, 0x0d, 0x21, 0x5c, 0x02, 0x60, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0x38, 0x00, 0x00, 0x4d, 0x18, 0x00, 0x00, + 0x4d, 0x30, 0x00, 0x00, 0x4d, 0x90, 0x00, 0x00, 0x4d, 0xd0, 0x00, 0x00, + 0x4d, 0xa4, 0x00, 0x00, 0x4d, 0x14, 0x00, 0x00, 0x59, 0xc4, 0x10, 0x04, + 0x48, 0x0b, 0xc8, 0x57, 0x82, 0x08, 0x05, 0x00, 0x00, 0x00, 0x3f, 0xf0, + 0x04, 0x00, 0x00, 0x25, 0x41, 0x7a, 0x30, 0x00, 0x4c, 0x08, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x41, 0x5c, 0x00, 0x10, 0x00, + 0x82, 0x08, 0x05, 0x00, 0x00, 0x00, 0x02, 0x10, 0x04, 0x02, 0x00, 0x04, + 0x81, 0x1a, 0x30, 0x00, 0x80, 0x08, 0x11, 0x02, 0x04, 0x01, 0xf7, 0xf7, + 0x04, 0x01, 0xf9, 0xcf, 0x59, 0x92, 0x60, 0x04, 0x49, 0x33, 0xc8, 0x57, + 0x81, 0x32, 0x61, 0xc0, 0x04, 0x02, 0x00, 0x05, 0x59, 0xc4, 0x00, 0xa3, + 0x8c, 0x00, 0x05, 0x1a, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x04, 0x01, 0xfe, 0xa1, 0x04, 0x00, 0x00, 0x09, 0x04, 0x01, 0xfc, 0x3d, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x49, 0x59, 0x30, 0x00, 0x04, + 0x8c, 0x00, 0x05, 0x0c, 0x02, 0x02, 0x08, 0x00, 0x00, 0x02, 0x07, 0xdf, + 0x04, 0x01, 0xf0, 0x07, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4a, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0xdf, 0x5c, 0x02, 0x28, 0x00, 0x5c, 0x03, 0x48, 0x00, + 0x5c, 0x03, 0xa0, 0x00, 0x5c, 0x03, 0x20, 0x00, 0x5c, 0x02, 0x60, 0x00, + 0x5c, 0x02, 0x30, 0x00, 0x5c, 0x02, 0x70, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4d, 0x30, 0x00, 0x00, 0x4d, 0x18, 0x00, 0x00, 0x4d, 0x90, 0x00, 0x00, + 0x04, 0x01, 0xfc, 0xf6, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x59, 0x8c, 0x00, 0x00, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x00, 0x09, 0x75, 0x41, 0x7a, 0x30, 0x00, 0x81, 0x1b, 0x20, 0xc8, + 0x83, 0x93, 0x24, 0x00, 0x00, 0x00, 0xbf, 0x32, 0x59, 0x90, 0x00, 0x01, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x01, 0x04, 0x02, 0x00, 0x0d, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0xd0, 0x59, 0x92, 0x60, 0x04, + 0x59, 0x30, 0x00, 0x11, 0x82, 0x00, 0x05, 0x00, 0xff, 0xf0, 0x00, 0x00, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x03, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x1b, 0x58, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x33, + 0x81, 0x1a, 0x30, 0x00, 0x83, 0x18, 0x04, 0x80, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x00, 0x17, 0xea, 0x59, 0xc8, 0x10, 0x40, 0x84, 0x08, 0x15, 0x34, + 0x48, 0x0b, 0x90, 0x40, 0x04, 0x01, 0xfc, 0xc1, 0x5c, 0x03, 0x20, 0x00, + 0x5c, 0x02, 0x30, 0x00, 0x5c, 0x02, 0x60, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x4d, 0x90, 0x00, 0x00, 0x4d, 0xd0, 0x00, 0x00, + 0x4d, 0xa4, 0x00, 0x00, 0x4d, 0x14, 0x00, 0x00, 0x4d, 0x38, 0x00, 0x00, + 0x04, 0x01, 0xfc, 0xc9, 0x4d, 0xf0, 0x00, 0x00, 0x59, 0x30, 0x00, 0x04, + 0x8c, 0x00, 0x05, 0x3e, 0x04, 0x02, 0x00, 0x07, 0x8c, 0x00, 0x05, 0x20, + 0x04, 0x00, 0x00, 0x27, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0x79, + 0x04, 0x00, 0x00, 0x24, 0x04, 0x01, 0xf0, 0x2c, 0x59, 0x8c, 0x00, 0x0d, + 0x81, 0x30, 0x05, 0x80, 0x04, 0x00, 0x00, 0x12, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x84, 0xd5, 0x04, 0x02, 0x00, 0x26, 0x04, 0x01, 0xf9, 0x1c, + 0x04, 0x00, 0x00, 0x24, 0x48, 0x03, 0x88, 0x04, 0x04, 0x01, 0xf9, 0x6a, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0f, 0x95, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x63, 0xa4, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x59, 0x30, 0x00, 0x04, 0x8c, 0x00, 0x05, 0x0c, 0x04, 0x02, 0x00, 0x0e, + 0x04, 0x01, 0xf0, 0x0f, 0x59, 0xc4, 0x00, 0x04, 0x8c, 0x00, 0x05, 0x04, + 0x04, 0x00, 0x00, 0x15, 0x4a, 0x03, 0x88, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0xc4, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x13, 0x59, 0x30, 0x00, 0x04, 0x8c, 0x00, 0x05, 0x0c, + 0x04, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, + 0x5c, 0x03, 0xe0, 0x00, 0x04, 0x00, 0x0c, 0x88, 0x5c, 0x02, 0x70, 0x00, + 0x5c, 0x02, 0x28, 0x00, 0x5c, 0x03, 0x48, 0x00, 0x5c, 0x03, 0xa0, 0x00, + 0x5c, 0x03, 0x20, 0x00, 0x80, 0x00, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, + 0x5c, 0x03, 0xe0, 0x00, 0x04, 0x00, 0x0c, 0x7f, 0x5c, 0x02, 0x70, 0x00, + 0x5c, 0x02, 0x28, 0x00, 0x5c, 0x03, 0x48, 0x00, 0x5c, 0x03, 0xa0, 0x00, + 0x5c, 0x03, 0x20, 0x00, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x7b, 0x28, 0x07, 0x04, 0x01, 0xfc, 0x88, + 0x59, 0xc4, 0x00, 0xaf, 0x80, 0x00, 0x01, 0xc0, 0x04, 0x02, 0x00, 0x04, + 0x04, 0x01, 0xfc, 0x71, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x14, 0x29, + 0x59, 0x8c, 0x00, 0x0f, 0x82, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x02, 0x10, 0x07, 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x18, 0x0f, + 0x80, 0x00, 0x05, 0x80, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x2c, + 0x04, 0x00, 0x00, 0x0e, 0x04, 0x01, 0xfe, 0xd6, 0x04, 0x02, 0x00, 0x0c, + 0x04, 0x01, 0xfd, 0xbb, 0x04, 0x00, 0x00, 0x0a, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa1, 0xdf, 0x04, 0x01, 0xf9, 0x1c, 0x4d, 0x38, 0x00, 0x00, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x14, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0xdf, 0x5c, 0x02, 0x70, 0x00, 0x04, 0x01, 0xfc, 0x57, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x14, 0x29, 0x4d, 0x90, 0x00, 0x00, + 0x4d, 0xd0, 0x00, 0x00, 0x4d, 0xa4, 0x00, 0x00, 0x4d, 0x14, 0x00, 0x00, + 0x4d, 0x30, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x41, + 0x04, 0x01, 0xfc, 0x60, 0x59, 0xc4, 0x00, 0xaf, 0x80, 0x00, 0x01, 0xc0, + 0x04, 0x00, 0x00, 0x27, 0x04, 0x01, 0xf9, 0x11, 0x59, 0x92, 0x60, 0x04, + 0x49, 0x33, 0xc8, 0x57, 0x59, 0x30, 0x00, 0x04, 0x8c, 0x00, 0x05, 0x16, + 0x04, 0x00, 0x00, 0x0b, 0x04, 0x01, 0xfe, 0x85, 0x04, 0x02, 0x00, 0x1f, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0xa4, 0x04, 0x01, 0xfc, 0x3f, + 0x42, 0x00, 0x08, 0x00, 0x80, 0x00, 0x08, 0x04, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x63, 0x2f, 0x04, 0x01, 0xf0, 0x17, 0x42, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x75, 0x30, 0x04, 0x01, 0xf8, 0xc3, 0x04, 0x02, 0x00, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x31, 0x04, 0x01, 0xf0, 0x10, + 0x04, 0x01, 0xfe, 0x74, 0x04, 0x02, 0x00, 0x0e, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa1, 0xdf, 0x59, 0x30, 0x00, 0x04, 0x8c, 0x00, 0x05, 0x0c, + 0x04, 0x02, 0x00, 0x03, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x03, + 0x4d, 0x38, 0x00, 0x00, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4a, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, 0x5c, 0x02, 0x70, 0x00, + 0x04, 0x01, 0xfc, 0x23, 0x5c, 0x02, 0x60, 0x00, 0x5c, 0x02, 0x28, 0x00, + 0x5c, 0x03, 0x48, 0x00, 0x5c, 0x03, 0xa0, 0x00, 0x5c, 0x03, 0x20, 0x00, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x14, 0x29, 0x4d, 0x90, 0x00, 0x00, + 0x4d, 0xd0, 0x00, 0x00, 0x4d, 0xa4, 0x00, 0x00, 0x4d, 0x14, 0x00, 0x00, + 0x4d, 0x30, 0x00, 0x00, 0x4d, 0x2c, 0x00, 0x00, 0x04, 0x01, 0xfc, 0x28, + 0x04, 0x01, 0xf8, 0xdc, 0x59, 0x92, 0x60, 0x04, 0x49, 0x33, 0xc8, 0x57, + 0x04, 0x01, 0xf8, 0x82, 0x04, 0x00, 0x00, 0x16, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5c, 0x41, 0x81, 0x32, 0x61, 0xc0, 0x04, 0x00, 0x00, 0x34, + 0x59, 0x32, 0x58, 0x08, 0x81, 0x2e, 0x59, 0xc0, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, + 0x04, 0x02, 0x00, 0x1d, 0x59, 0x2c, 0x02, 0x08, 0x84, 0x00, 0x05, 0x50, + 0x48, 0x02, 0x5a, 0x08, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4d, 0xe0, + 0x04, 0x02, 0x00, 0x27, 0x59, 0x2c, 0x02, 0x08, 0x84, 0x00, 0x05, 0x10, + 0x48, 0x02, 0x5a, 0x08, 0x04, 0x01, 0xf0, 0x23, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5c, 0x31, 0x04, 0x01, 0xf0, 0x20, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa1, 0xdf, 0x04, 0x01, 0xfd, 0x98, 0x59, 0x2c, 0x02, 0x08, + 0x84, 0x00, 0x05, 0x50, 0x48, 0x02, 0x5a, 0x08, 0x4d, 0x38, 0x00, 0x00, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, + 0x5c, 0x02, 0x70, 0x00, 0x04, 0x01, 0xf0, 0x11, 0x59, 0x90, 0x00, 0x06, + 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0x00, 0x00, 0x04, 0x02, 0x07, 0xee, + 0x59, 0xc4, 0x08, 0xaf, 0x82, 0x04, 0x04, 0x80, 0x00, 0x00, 0x03, 0xe8, + 0x04, 0x02, 0x17, 0xea, 0x59, 0x90, 0x00, 0x06, 0x82, 0x00, 0x04, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x48, 0x03, 0x20, 0x06, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5c, 0x31, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3d, 0xcb, + 0x5c, 0x02, 0x58, 0x00, 0x5c, 0x02, 0x60, 0x00, 0x5c, 0x02, 0x28, 0x00, + 0x5c, 0x03, 0x48, 0x00, 0x5c, 0x03, 0xa0, 0x00, 0x5c, 0x03, 0x20, 0x00, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x64, 0x63, 0x4d, 0x30, 0x00, 0x00, + 0x4d, 0x2c, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x76, + 0x59, 0x8e, 0x60, 0x0d, 0x49, 0x33, 0xc8, 0x57, 0x59, 0xc4, 0x10, 0x04, + 0x8c, 0x08, 0x15, 0x00, 0x04, 0x00, 0x00, 0x07, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x02, 0x00, 0x07, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4d, 0xe0, 0x04, 0x02, 0x00, 0x2f, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5c, 0x2c, 0x04, 0x01, 0xf0, 0x2c, 0x59, 0x8c, 0x00, 0x0f, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x11, 0x59, 0xc4, 0x08, 0xaf, + 0x82, 0x04, 0x04, 0x80, 0x00, 0x00, 0x03, 0xe8, 0x04, 0x02, 0x10, 0x0d, + 0x59, 0x8c, 0x08, 0x0f, 0x80, 0x04, 0x08, 0x00, 0x48, 0x07, 0x18, 0x0f, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5c, 0x2c, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x20, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3d, 0xcb, 0x04, 0x01, 0xf0, 0x19, + 0x04, 0x01, 0xfd, 0xac, 0x81, 0x32, 0x61, 0xc0, 0x04, 0x02, 0x00, 0x03, + 0x04, 0x01, 0xf8, 0x4d, 0x04, 0x01, 0xf0, 0x14, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa1, 0xdf, 0x59, 0x30, 0x04, 0x06, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x00, 0x07, 0x59, 0x32, 0x58, 0x08, + 0x81, 0x2e, 0x59, 0xc0, 0x04, 0x00, 0x00, 0x04, 0x59, 0x2c, 0x02, 0x08, + 0x84, 0x00, 0x05, 0x50, 0x48, 0x02, 0x5a, 0x08, 0x04, 0x01, 0xf8, 0x58, + 0x4d, 0x38, 0x00, 0x00, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x14, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, 0x5c, 0x02, 0x70, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x5c, 0x02, 0x60, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x64, 0x63, 0x59, 0xc4, 0x08, 0x04, 0x83, 0x18, 0x04, 0x00, + 0x00, 0x10, 0x68, 0xe0, 0x50, 0x00, 0x00, 0x00, 0x80, 0x04, 0x05, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xc4, 0x08, 0x04, 0x83, 0x18, 0x04, 0x00, + 0x00, 0x10, 0x68, 0xe5, 0x50, 0x00, 0x00, 0x00, 0x80, 0x04, 0x05, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x04, 0x20, + 0x00, 0x00, 0x08, 0x40, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x21, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x59, 0x90, 0x08, 0x06, 0x80, 0x04, 0x01, 0x20, + 0x80, 0x0c, 0x04, 0x80, 0x04, 0x02, 0x10, 0x04, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x05, 0x82, 0x04, 0x0c, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x48, 0x07, 0x20, 0x06, 0x80, 0x00, 0x05, 0x80, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x0b, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x76, 0x4d, 0xf0, 0x00, 0x00, 0x48, 0x0b, 0x18, 0x00, + 0x5c, 0x03, 0xe0, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x64, 0x63, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x76, 0x4d, 0xf0, 0x00, 0x00, + 0x49, 0x7b, 0x18, 0x0d, 0x49, 0x7b, 0x18, 0x03, 0x49, 0x7b, 0x18, 0x0e, + 0x49, 0x7b, 0x18, 0x0f, 0x49, 0x7b, 0x18, 0x10, 0x59, 0x8c, 0x00, 0x00, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x09, + 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, 0x04, 0x02, 0x00, 0x04, + 0x4a, 0x03, 0x18, 0x00, 0x00, 0x00, 0x00, 0x05, 0x04, 0x01, 0xf0, 0x03, + 0x4a, 0x03, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x03, 0xe0, 0x00, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x64, 0x63, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x30, 0x00, 0x04, 0x8c, 0x00, 0x05, 0x0c, 0x04, 0x02, 0x00, 0x03, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x83, 0x18, 0x04, 0x80, 0x00, 0x00, 0x00, 0x05, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x49, 0x1b, 0xc8, 0x57, + 0x81, 0x1b, 0x20, 0xc8, 0x83, 0x93, 0x24, 0x00, 0x00, 0x00, 0xbf, 0x32, + 0x81, 0x1b, 0xa0, 0xca, 0x83, 0xd3, 0xa4, 0x00, 0x00, 0x00, 0x76, 0x00, + 0x83, 0x18, 0x04, 0x00, 0x00, 0x10, 0x69, 0x3d, 0x50, 0x03, 0x48, 0x00, + 0x81, 0x1a, 0x28, 0xc2, 0x83, 0x16, 0x2c, 0x00, 0x00, 0x00, 0x61, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x10, 0xaf, 0x29, 0x00, 0x10, 0xaf, 0x40, + 0x00, 0x10, 0xaf, 0x57, 0x00, 0x10, 0xaf, 0x6e, 0x00, 0x10, 0xaf, 0x85, + 0x49, 0x33, 0xc8, 0x57, 0x59, 0x30, 0x04, 0x06, 0x82, 0x00, 0x0c, 0x80, + 0x00, 0x00, 0x00, 0x12, 0x04, 0x02, 0x10, 0x15, 0x04, 0x01, 0x10, 0x00, + 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x69, 0x5b, 0x00, 0x10, 0x69, 0xfe, + 0x00, 0x10, 0x6d, 0x41, 0x00, 0x10, 0x6d, 0xc7, 0x00, 0x10, 0x69, 0xfe, + 0x00, 0x10, 0x6d, 0x41, 0x00, 0x10, 0x6d, 0xc7, 0x00, 0x10, 0x69, 0x5b, + 0x00, 0x10, 0x69, 0xfe, 0x00, 0x10, 0x69, 0x5b, 0x00, 0x10, 0x69, 0x5b, + 0x00, 0x10, 0x69, 0x5b, 0x00, 0x10, 0x69, 0x5b, 0x00, 0x10, 0x69, 0x5b, + 0x00, 0x10, 0x69, 0x5b, 0x00, 0x10, 0x69, 0x5b, 0x00, 0x10, 0x69, 0x62, + 0x00, 0x10, 0x69, 0x62, 0x48, 0x03, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x76, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0xc4, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x64, 0x63, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x10, 0xaf, 0xc4, 0x50, 0x08, 0x10, 0x00, 0x49, 0x30, 0x10, 0x0c, + 0x58, 0x08, 0x00, 0x02, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x01, 0x00, + 0x04, 0x02, 0x00, 0x3c, 0x59, 0x32, 0x58, 0x08, 0x81, 0x2e, 0x59, 0xc0, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x49, 0x2f, 0xc8, 0x56, + 0x59, 0x32, 0x68, 0x09, 0x81, 0x36, 0x69, 0xc0, 0x04, 0x00, 0x00, 0x22, + 0x59, 0x2c, 0x04, 0x0b, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0xe0, 0x00, + 0x04, 0x00, 0x00, 0x03, 0x04, 0x01, 0xfb, 0xc4, 0x04, 0x01, 0xf0, 0x02, + 0x04, 0x01, 0xfb, 0xb4, 0x59, 0x2c, 0x00, 0x0d, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x07, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x58, 0xd0, 0x08, 0x02, + 0x80, 0x04, 0x05, 0x40, 0x48, 0x01, 0xa0, 0x02, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x10, 0xaf, 0xc4, 0x50, 0x08, 0x10, 0x00, 0x49, 0x30, 0x10, 0x0b, + 0x49, 0x2c, 0x10, 0x0a, 0x82, 0xd0, 0x04, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x48, 0x00, 0x10, 0x03, 0x59, 0x2c, 0x00, 0x0d, 0x48, 0x00, 0x10, 0x05, + 0x59, 0x2c, 0x00, 0x0e, 0x48, 0x00, 0x10, 0x07, 0x59, 0x2c, 0x00, 0x0f, + 0x48, 0x00, 0x10, 0x08, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x07, 0x9e, + 0x42, 0x02, 0x68, 0x00, 0x00, 0x10, 0xb5, 0xdc, 0x59, 0x2c, 0x08, 0x0a, + 0x48, 0x06, 0x68, 0x02, 0x82, 0x04, 0x05, 0x00, 0x00, 0xff, 0xff, 0x00, + 0x04, 0x00, 0x00, 0x07, 0x49, 0x7a, 0x6a, 0x12, 0x59, 0xa8, 0x10, 0x0f, + 0x82, 0x08, 0x15, 0x00, 0x00, 0xff, 0xff, 0x00, 0x80, 0x08, 0x05, 0x80, + 0x04, 0x02, 0x07, 0xd3, 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x80, 0x04, 0x08, 0xd0, 0x48, 0x06, 0x6a, 0x12, 0x04, 0x01, 0xf7, 0xce, + 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0x2c, 0x00, 0x00, 0x4d, 0x30, 0x00, 0x00, + 0x4c, 0x58, 0x00, 0x00, 0x4c, 0x54, 0x00, 0x00, 0x4c, 0x50, 0x00, 0x00, + 0x58, 0x32, 0x58, 0x0a, 0x81, 0x2e, 0x59, 0xc0, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x58, 0x30, 0x00, 0x02, 0x4a, 0x00, 0x60, 0x02, + 0x00, 0x00, 0x01, 0x00, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x01, 0x00, + 0x04, 0x02, 0x00, 0x20, 0x58, 0x30, 0x00, 0x0b, 0x58, 0x32, 0x60, 0x0c, + 0x81, 0x30, 0x05, 0x80, 0x04, 0x02, 0x00, 0x12, 0x04, 0x01, 0xf8, 0x30, + 0x04, 0x02, 0x00, 0x14, 0x59, 0x2c, 0x08, 0x0d, 0x82, 0x04, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x80, 0x04, 0x09, 0x04, 0x40, 0x04, 0xb0, 0x00, + 0x42, 0x00, 0xa0, 0x00, 0x00, 0x10, 0xad, 0x19, 0x40, 0x50, 0xa8, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x41, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0xdc, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x71, 0x30, + 0x04, 0x01, 0xf0, 0x05, 0x48, 0x03, 0xc8, 0x57, 0x49, 0x33, 0xc8, 0x57, + 0x04, 0x01, 0xf8, 0x1d, 0x04, 0x00, 0x0f, 0x95, 0x5c, 0x00, 0xa0, 0x00, + 0x5c, 0x00, 0xa8, 0x00, 0x5c, 0x00, 0xb0, 0x00, 0x5c, 0x02, 0x60, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x58, 0x30, 0x00, 0x0b, + 0x58, 0x32, 0x60, 0x0c, 0x48, 0x03, 0xc8, 0x57, 0x49, 0x33, 0xc8, 0x57, + 0x81, 0x30, 0x05, 0x80, 0x04, 0x02, 0x07, 0xf1, 0x04, 0x01, 0xf8, 0x0f, + 0x04, 0x02, 0x07, 0xf3, 0x48, 0x03, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xcc, 0xce, 0x80, 0xc4, 0x00, 0x40, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x71, 0x9c, 0x04, 0x01, 0xf7, 0xe6, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x76, 0x4d, 0xf0, 0x00, 0x00, 0x59, 0x8c, 0x00, 0x0d, + 0x81, 0x30, 0x05, 0x80, 0x04, 0x02, 0x00, 0x09, 0x59, 0x8c, 0x00, 0x05, + 0x81, 0x30, 0x05, 0x80, 0x04, 0x02, 0x00, 0x06, 0x5c, 0x03, 0xe0, 0x00, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x64, 0x63, 0x80, 0x00, 0x05, 0x80, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x57, 0x5c, 0x03, 0xe0, 0x00, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x64, 0x63, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x30, 0x04, 0x03, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x56, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x48, 0x03, 0xc8, 0x57, 0x0c, 0x01, 0xf0, 0x01, + 0x00, 0x10, 0x6b, 0x75, 0x00, 0x10, 0x6b, 0x90, 0x00, 0x10, 0x6b, 0xa1, + 0x00, 0x10, 0x6c, 0xa1, 0x00, 0x10, 0x6c, 0x63, 0x00, 0x10, 0x6c, 0x67, + 0x00, 0x10, 0x6c, 0x76, 0x00, 0x10, 0x6c, 0x8a, 0x00, 0x10, 0x6c, 0x7f, + 0x00, 0x10, 0x6c, 0x8a, 0x00, 0x10, 0x6c, 0xc5, 0x00, 0x10, 0x6c, 0x8a, + 0x00, 0x10, 0x6d, 0x07, 0x00, 0x10, 0x6c, 0x8a, 0x00, 0x10, 0x6d, 0x15, + 0x00, 0x10, 0x6c, 0x8a, 0x00, 0x10, 0x6c, 0x7f, 0x00, 0x10, 0x6c, 0x8a, + 0x00, 0x10, 0x6d, 0x19, 0x00, 0x10, 0x6a, 0x5b, 0x00, 0x10, 0x6a, 0x5b, + 0x00, 0x10, 0x6a, 0x5b, 0x00, 0x10, 0x6a, 0x5b, 0x00, 0x10, 0x6a, 0x5b, + 0x00, 0x10, 0x6a, 0x5b, 0x00, 0x10, 0x6a, 0x5b, 0x00, 0x10, 0x6a, 0x5b, + 0x00, 0x10, 0x6a, 0x5b, 0x00, 0x10, 0x6a, 0x5b, 0x00, 0x10, 0x6a, 0x5b, + 0x00, 0x10, 0x6d, 0xe5, 0x00, 0x10, 0x6e, 0x04, 0x00, 0x10, 0x6e, 0x0e, + 0x00, 0x10, 0x6a, 0x5b, 0x00, 0x10, 0x6e, 0x24, 0x00, 0x10, 0x6c, 0x76, + 0x00, 0x10, 0x6a, 0x5b, 0x00, 0x10, 0x6c, 0x76, 0x00, 0x10, 0x6c, 0x8a, + 0x00, 0x10, 0x6a, 0x5b, 0x00, 0x10, 0x6b, 0xa1, 0x00, 0x10, 0x6c, 0xa1, + 0x00, 0x10, 0x6a, 0x5b, 0x00, 0x10, 0x6e, 0x74, 0x00, 0x10, 0x6c, 0x8a, + 0x00, 0x10, 0x6a, 0x5b, 0x00, 0x10, 0x6e, 0x84, 0x00, 0x10, 0x6c, 0x8a, + 0x00, 0x10, 0x6a, 0x5b, 0x00, 0x10, 0x6c, 0x7f, 0x00, 0x10, 0x6b, 0x66, + 0x00, 0x10, 0x6a, 0x5d, 0x00, 0x10, 0x6a, 0x5b, 0x00, 0x10, 0x6e, 0x9b, + 0x00, 0x10, 0x6e, 0xd1, 0x00, 0x10, 0x6f, 0x4b, 0x00, 0x10, 0x6a, 0x5b, + 0x00, 0x10, 0x6f, 0x5b, 0x00, 0x10, 0x6c, 0x74, 0x00, 0x10, 0x6f, 0x4e, + 0x00, 0x10, 0x6a, 0x5b, 0x00, 0x10, 0x6e, 0x30, 0x00, 0x10, 0x6f, 0x74, + 0x00, 0x10, 0x6a, 0x5b, 0x00, 0x10, 0x6f, 0xa9, 0x00, 0x10, 0x6f, 0xfc, + 0x00, 0x10, 0x6a, 0x5b, 0x00, 0x10, 0x6a, 0x72, 0x00, 0x10, 0x6a, 0xd8, + 0x00, 0x10, 0x6a, 0xe5, 0x00, 0x10, 0x6a, 0x5b, 0x00, 0x10, 0x6c, 0x76, + 0x00, 0x10, 0x6a, 0x5b, 0x00, 0x10, 0x6b, 0x2c, 0x00, 0x10, 0x6b, 0x37, + 0x00, 0x10, 0x6a, 0x5b, 0x00, 0x10, 0x6a, 0x5b, 0x00, 0x10, 0x6a, 0x86, + 0x00, 0x10, 0x6a, 0xab, 0x00, 0x10, 0x70, 0x3b, 0x00, 0x10, 0x70, 0x7c, + 0x00, 0x10, 0x70, 0xa2, 0x00, 0x10, 0x6a, 0x5b, 0x00, 0x10, 0x6a, 0x5b, + 0x00, 0x10, 0x6a, 0x5b, 0x00, 0x10, 0x70, 0x70, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x04, 0x01, 0xfa, 0xcf, 0x59, 0x32, 0x58, 0x08, + 0x59, 0x2c, 0x00, 0x09, 0x48, 0x01, 0xa0, 0x06, 0x59, 0x2c, 0x00, 0x0a, + 0x48, 0x01, 0xa0, 0x07, 0x59, 0x2c, 0x00, 0x0b, 0x48, 0x01, 0xa0, 0x08, + 0x59, 0x2c, 0x00, 0x0c, 0x48, 0x01, 0xa0, 0x09, 0x59, 0x2c, 0x00, 0x0d, + 0x48, 0x01, 0xa0, 0x0a, 0x49, 0x79, 0xa0, 0x0b, 0x59, 0x2c, 0x08, 0x09, + 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x80, 0x04, 0x09, 0x04, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x71, 0x30, 0x4a, 0x02, 0x62, 0x02, 0x00, 0x00, 0xff, 0xff, + 0x04, 0x01, 0xfa, 0xb8, 0x4d, 0x2c, 0x00, 0x00, 0x4a, 0x01, 0xa0, 0x06, + 0x05, 0x00, 0x00, 0x00, 0x59, 0x32, 0x58, 0x08, 0x59, 0x2c, 0x00, 0x09, + 0x48, 0x01, 0xa0, 0x07, 0x59, 0x2c, 0x00, 0x0a, 0x48, 0x01, 0xa0, 0x08, + 0x59, 0x2c, 0x00, 0x0b, 0x48, 0x01, 0xa0, 0x09, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x71, 0x30, + 0x4c, 0x58, 0x00, 0x00, 0x4c, 0x50, 0x00, 0x00, 0x4c, 0x54, 0x00, 0x00, + 0x4d, 0x2c, 0x00, 0x00, 0x04, 0x01, 0xfa, 0xa2, 0x59, 0x32, 0x58, 0x08, + 0x59, 0x30, 0x04, 0x0b, 0x80, 0x00, 0x00, 0xc2, 0x42, 0x00, 0xa8, 0x00, + 0x00, 0x10, 0xad, 0x19, 0x59, 0x2c, 0xb2, 0x05, 0x83, 0x2c, 0xa4, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, + 0x40, 0x58, 0x00, 0x00, 0x80, 0x54, 0xac, 0x00, 0x59, 0x2c, 0x00, 0x01, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x03, 0x40, 0x02, 0x58, 0x00, + 0x04, 0x01, 0xf7, 0xf5, 0x42, 0x00, 0xa0, 0x00, 0x00, 0x10, 0xad, 0x19, + 0x40, 0x50, 0xa8, 0x00, 0x59, 0x30, 0xb4, 0x0b, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x41, 0x59, 0x30, 0x0c, 0x0b, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0xdc, 0x00, 0x5c, 0x02, 0x58, 0x00, 0x5c, 0x00, 0xa8, 0x00, + 0x5c, 0x00, 0xb0, 0x00, 0x5c, 0x00, 0xa0, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x71, 0x30, 0x4c, 0x58, 0x00, 0x00, 0x4c, 0x50, 0x00, 0x00, + 0x4c, 0x54, 0x00, 0x00, 0x4d, 0x2c, 0x00, 0x00, 0x42, 0x03, 0x48, 0x00, + 0x00, 0x10, 0xad, 0x12, 0x04, 0x01, 0xfa, 0x89, 0x59, 0x32, 0x58, 0x08, + 0x59, 0x2c, 0x08, 0x02, 0x48, 0x07, 0xc8, 0x57, 0x40, 0x04, 0x10, 0x00, + 0x80, 0x04, 0x09, 0x04, 0x82, 0x08, 0x15, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x00, 0x08, 0x80, 0x04, 0x08, 0x00, 0x82, 0x08, 0x15, 0x80, + 0x00, 0x00, 0x00, 0x03, 0x80, 0x08, 0x10, 0x00, 0x58, 0xd0, 0x00, 0x02, + 0x80, 0x08, 0x05, 0x40, 0x48, 0x01, 0xa0, 0x02, 0x4a, 0x02, 0x58, 0x05, + 0x02, 0x00, 0x00, 0x00, 0x82, 0xd0, 0xac, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x59, 0x2c, 0xb0, 0x11, 0x83, 0x2c, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, 0x40, 0x58, 0x00, 0x00, + 0x80, 0x54, 0xac, 0x00, 0x59, 0x2e, 0x58, 0x01, 0x41, 0x78, 0x00, 0x00, + 0x81, 0x2e, 0x5d, 0x40, 0x04, 0x02, 0x07, 0xf6, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0xdc, 0x00, 0x5c, 0x02, 0x58, 0x00, 0x5c, 0x00, 0xa8, 0x00, + 0x5c, 0x00, 0xb0, 0x00, 0x5c, 0x00, 0xa0, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x71, 0x30, 0x04, 0x01, 0xfa, 0x54, 0x4a, 0x01, 0xa0, 0x06, + 0x78, 0x00, 0x00, 0x00, 0x59, 0x30, 0x00, 0x1c, 0x84, 0x00, 0x01, 0xc0, + 0x48, 0x01, 0xa4, 0x07, 0x49, 0x79, 0xa2, 0x07, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x71, 0x30, 0x4c, 0x58, 0x00, 0x00, + 0x4c, 0x54, 0x00, 0x00, 0x4c, 0x50, 0x00, 0x00, 0x04, 0x01, 0xfa, 0x52, + 0x4a, 0x01, 0xa0, 0x06, 0x02, 0x00, 0x00, 0x00, 0x59, 0xa8, 0x00, 0x02, + 0x48, 0x01, 0xa0, 0x08, 0x59, 0xa8, 0x00, 0x03, 0x48, 0x01, 0xa0, 0x09, + 0x59, 0xa8, 0x00, 0x00, 0x48, 0x01, 0xa0, 0x0a, 0x59, 0xa8, 0x00, 0x01, + 0x48, 0x01, 0xa0, 0x0b, 0x59, 0x30, 0x00, 0x1c, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x00, 0xe0, 0x00, 0x04, 0x00, 0x00, 0x16, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x00, 0xdf, 0x00, 0x04, 0x00, 0x00, 0x06, 0x4a, 0x01, 0xa4, 0x07, + 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x04, 0x01, 0xf0, 0x27, 0x4a, 0x03, 0xc8, 0x40, 0x00, 0x10, 0xac, 0xb8, + 0x4a, 0x03, 0xc8, 0x42, 0x00, 0x00, 0x00, 0x0d, 0x42, 0x00, 0x18, 0x00, + 0x00, 0x10, 0xac, 0xb8, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x06, 0xd7, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x42, 0x00, 0xa0, 0x00, + 0x00, 0x10, 0xac, 0xb8, 0x04, 0x01, 0xf0, 0x0d, 0x4a, 0x03, 0xc8, 0x40, + 0x00, 0x10, 0xac, 0xc5, 0x4a, 0x03, 0xc8, 0x42, 0x00, 0x00, 0x00, 0x0d, + 0x42, 0x00, 0x18, 0x00, 0x00, 0x10, 0xac, 0xc5, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x06, 0xd7, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, + 0x42, 0x00, 0xa0, 0x00, 0x00, 0x10, 0xac, 0xc5, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x10, 0x48, 0x01, 0xa4, 0x07, 0x4a, 0x01, 0xa2, 0x07, + 0x00, 0x00, 0x00, 0x34, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x0d, + 0x82, 0xd0, 0xac, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x30, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x13, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x5c, 0x00, 0xa0, 0x00, + 0x5c, 0x00, 0xa8, 0x00, 0x5c, 0x00, 0xb0, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x71, 0x30, 0x04, 0x01, 0xfa, 0x00, 0x4a, 0x01, 0xa0, 0x06, + 0x63, 0x00, 0x00, 0x28, 0x59, 0x30, 0x00, 0x1c, 0x48, 0x01, 0xa0, 0x07, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0xdc, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x71, 0x30, + 0x04, 0x01, 0xfa, 0x03, 0x41, 0x78, 0x00, 0x00, 0x41, 0x78, 0x08, 0x00, + 0x42, 0x00, 0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0c, 0x01, 0xf8, 0x1b, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x04, 0x08, 0x00, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x59, 0x84, 0x18, 0x02, 0x8c, 0x0c, 0x1d, 0x00, + 0x04, 0x02, 0x00, 0x08, 0x42, 0x00, 0x20, 0x00, 0x00, 0x05, 0x00, 0x00, + 0x0c, 0x01, 0xf8, 0x11, 0x80, 0x00, 0x00, 0x00, 0x80, 0x04, 0x08, 0x00, + 0x82, 0x08, 0x14, 0x00, 0x00, 0x00, 0x00, 0x04, 0x82, 0x08, 0x05, 0x40, + 0x02, 0x00, 0x00, 0x00, 0x48, 0x01, 0xa0, 0x06, 0x80, 0x04, 0x08, 0xe0, + 0x59, 0x30, 0x00, 0x1c, 0x80, 0x04, 0x05, 0x40, 0x48, 0x01, 0xa0, 0x07, + 0x80, 0x08, 0x09, 0x04, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x71, 0x30, 0x00, 0x10, 0x6b, 0x5c, + 0x00, 0x10, 0x6b, 0x5e, 0x00, 0x10, 0x6b, 0x60, 0x00, 0x10, 0x6b, 0x62, + 0x00, 0x10, 0x6b, 0x64, 0x48, 0x11, 0xa0, 0x08, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x11, 0xa0, 0x09, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x11, 0xa0, 0x0a, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x11, 0xa0, 0x0b, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x11, 0xa0, 0x0c, 0x1c, 0x01, 0xf0, 0x00, 0x4a, 0x02, 0x60, 0x09, + 0x00, 0x10, 0xb5, 0xdc, 0x59, 0xa8, 0x00, 0x0f, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xd0, 0x42, 0x02, 0x68, 0x00, + 0x00, 0x10, 0xb5, 0xdc, 0x48, 0x02, 0x6a, 0x12, 0x04, 0x01, 0xfa, 0x39, + 0x41, 0x78, 0x08, 0x00, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x5c, 0x00, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x71, 0x30, 0x04, 0x01, 0xf9, 0xb7, + 0x4a, 0x01, 0xa0, 0x06, 0x52, 0x00, 0x00, 0x00, 0x49, 0x79, 0xa0, 0x07, + 0x59, 0x9c, 0x00, 0x17, 0x8c, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x05, + 0x59, 0x9c, 0x04, 0x02, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0x0d, + 0x48, 0x05, 0xa0, 0x07, 0x59, 0xa8, 0x00, 0x02, 0x48, 0x01, 0xa0, 0x08, + 0x59, 0xa8, 0x00, 0x03, 0x48, 0x01, 0xa0, 0x09, 0x59, 0xa8, 0x00, 0x00, + 0x48, 0x01, 0xa0, 0x0a, 0x59, 0xa8, 0x00, 0x01, 0x48, 0x01, 0xa0, 0x0b, + 0x59, 0xa8, 0x00, 0x0f, 0x48, 0x01, 0xa0, 0x0c, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x71, 0x30, 0x4a, 0x02, 0x62, 0x02, + 0x00, 0x00, 0xff, 0xff, 0x04, 0x01, 0xf9, 0x9a, 0x4a, 0x01, 0xa0, 0x06, + 0x05, 0x00, 0x00, 0x00, 0x59, 0xa8, 0x00, 0x0f, 0x48, 0x01, 0xa0, 0x07, + 0x59, 0xa8, 0x00, 0x02, 0x59, 0xa8, 0x08, 0x03, 0x48, 0x01, 0xa0, 0x08, + 0x48, 0x05, 0xa0, 0x09, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x71, 0x30, 0x4a, 0x02, 0x62, 0x02, 0x00, 0x00, 0xff, 0xff, + 0x04, 0x01, 0xf9, 0x89, 0x4d, 0x3c, 0x00, 0x00, 0x41, 0x7a, 0x78, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x46, 0x1e, 0x5c, 0x02, 0x78, 0x00, + 0x4a, 0x01, 0xa0, 0x06, 0x03, 0x00, 0x00, 0x00, 0x59, 0x34, 0x04, 0x03, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x07, 0xfe, 0x04, 0x02, 0x00, 0x6d, + 0x4a, 0x01, 0xa0, 0x06, 0x04, 0x00, 0x00, 0x00, 0x81, 0xa4, 0x08, 0x00, + 0x4a, 0x00, 0x08, 0x00, 0x22, 0xff, 0xff, 0xfe, 0x59, 0x34, 0x00, 0x0a, + 0x84, 0x00, 0x05, 0x00, 0x48, 0x02, 0x68, 0x0a, 0x59, 0xc4, 0x10, 0x02, + 0x84, 0x08, 0x15, 0x0c, 0x48, 0x0b, 0x88, 0x02, 0x59, 0xa8, 0x00, 0x23, + 0x8c, 0x00, 0x05, 0x08, 0x04, 0x00, 0x00, 0x10, 0x59, 0xa8, 0x00, 0x27, + 0x48, 0x01, 0xa0, 0x07, 0x59, 0xa8, 0x00, 0x28, 0x82, 0x00, 0x05, 0x00, + 0xff, 0xff, 0x20, 0x00, 0x59, 0x9c, 0x08, 0x18, 0x8c, 0x04, 0x0d, 0x16, + 0x04, 0x00, 0x00, 0x02, 0x84, 0x00, 0x05, 0x6a, 0x48, 0x01, 0xa0, 0x08, + 0x4a, 0x01, 0xa0, 0x09, 0x00, 0x00, 0x27, 0x10, 0x59, 0xa8, 0x00, 0x2a, + 0x48, 0x01, 0xa0, 0x0a, 0x04, 0x01, 0xf0, 0x38, 0x59, 0xa8, 0x00, 0x27, + 0x48, 0x01, 0xa0, 0x07, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, + 0x04, 0x02, 0x00, 0x09, 0x49, 0x7b, 0x88, 0x80, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x4c, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x15, 0x36, 0x5c, 0x00, 0x00, 0x00, 0x48, 0x03, 0x88, 0x80, + 0x59, 0xa8, 0x00, 0x28, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, + 0x04, 0x02, 0x00, 0x04, 0x82, 0x00, 0x05, 0x00, 0x37, 0xff, 0xff, 0xff, + 0x04, 0x01, 0xf0, 0x03, 0x82, 0x00, 0x05, 0x00, 0x3f, 0xff, 0xff, 0xff, + 0x59, 0x9c, 0x08, 0x18, 0x8c, 0x04, 0x0d, 0x16, 0x04, 0x00, 0x00, 0x02, + 0x84, 0x00, 0x05, 0x6a, 0x8d, 0x0e, 0x1d, 0x10, 0x04, 0x00, 0x00, 0x19, + 0x59, 0x30, 0x0c, 0x03, 0x82, 0x04, 0x15, 0x80, 0x00, 0x00, 0x00, 0x51, + 0x04, 0x00, 0x00, 0x15, 0x82, 0x04, 0x15, 0x80, 0x00, 0x00, 0x00, 0x31, + 0x04, 0x00, 0x00, 0x12, 0x4c, 0x58, 0x00, 0x00, 0x4c, 0x50, 0x00, 0x00, + 0x4c, 0x54, 0x00, 0x00, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x42, 0x00, 0xa0, 0x00, 0x00, 0x10, 0xb0, 0xc9, 0x82, 0xd0, 0xac, 0x00, + 0x00, 0x00, 0x00, 0x1f, 0x4c, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x30, 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0xa8, 0x00, + 0x5c, 0x00, 0xa0, 0x00, 0x5c, 0x00, 0xb0, 0x00, 0x84, 0x00, 0x05, 0x7a, + 0x48, 0x01, 0xa0, 0x08, 0x49, 0x79, 0xa0, 0x09, 0x49, 0x79, 0xa0, 0x0a, + 0x59, 0xa8, 0x00, 0x02, 0x59, 0xa8, 0x08, 0x03, 0x48, 0x01, 0xa0, 0x0b, + 0x48, 0x05, 0xa0, 0x0c, 0x59, 0xa8, 0x00, 0x00, 0x59, 0xa8, 0x08, 0x01, + 0x48, 0x01, 0xa0, 0x0d, 0x48, 0x05, 0xa0, 0x0e, 0x49, 0x79, 0xa0, 0x0f, + 0x49, 0x79, 0xa0, 0x10, 0x49, 0x79, 0xa0, 0x11, 0x49, 0x79, 0xa0, 0x12, + 0x49, 0x79, 0xa0, 0x13, 0x49, 0x79, 0xa0, 0x14, 0x49, 0x79, 0xa0, 0x15, + 0x49, 0x79, 0xa0, 0x16, 0x59, 0xa8, 0x00, 0x2b, 0x84, 0x00, 0x05, 0x76, + 0x48, 0x01, 0xa0, 0x17, 0x59, 0xa8, 0x00, 0x2c, 0x48, 0x01, 0xa0, 0x18, + 0x49, 0x79, 0xa0, 0x19, 0x49, 0x79, 0xa0, 0x1a, 0x04, 0x01, 0xf0, 0x43, + 0x59, 0xa8, 0x00, 0x23, 0x8c, 0x00, 0x05, 0x08, 0x04, 0x00, 0x00, 0x0d, + 0x59, 0xa8, 0x00, 0x27, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x59, 0xc4, 0x08, 0x80, 0x80, 0x04, 0x0d, 0x80, 0x04, 0x00, 0x00, 0x07, + 0x49, 0x7b, 0x88, 0x80, 0x4c, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x15, 0x36, 0x5c, 0x00, 0x00, 0x00, 0x48, 0x03, 0x88, 0x80, + 0x59, 0xa8, 0x00, 0x27, 0x48, 0x01, 0xa0, 0x07, 0x4c, 0x64, 0x00, 0x00, + 0x4d, 0x2c, 0x00, 0x00, 0x59, 0xa8, 0xc8, 0x28, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x88, 0x3d, 0x04, 0x00, 0x00, 0x0d, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8d, 0xe6, 0x04, 0x02, 0x00, 0x0a, 0x59, 0x2c, 0x02, 0x07, + 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x00, 0x00, 0x07, 0x82, 0x64, 0xcd, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x59, 0x2c, 0x00, 0x09, 0x82, 0x00, 0x05, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x80, 0x64, 0xcd, 0x40, 0x48, 0x65, 0xa0, 0x08, + 0x5c, 0x02, 0x58, 0x00, 0x5c, 0x00, 0xc8, 0x00, 0x59, 0xa8, 0x00, 0x29, + 0x48, 0x01, 0xa0, 0x09, 0x59, 0xa8, 0x00, 0x2a, 0x48, 0x01, 0xa0, 0x0a, + 0x59, 0xa8, 0x00, 0x02, 0x59, 0xa8, 0x08, 0x03, 0x48, 0x01, 0xa0, 0x0b, + 0x48, 0x05, 0xa0, 0x0c, 0x59, 0xa8, 0x00, 0x00, 0x59, 0xa8, 0x08, 0x01, + 0x48, 0x01, 0xa0, 0x0d, 0x48, 0x05, 0xa0, 0x0e, 0x49, 0x79, 0xa0, 0x0f, + 0x49, 0x79, 0xa0, 0x10, 0x49, 0x79, 0xa0, 0x11, 0x49, 0x79, 0xa0, 0x12, + 0x49, 0x79, 0xa0, 0x13, 0x49, 0x79, 0xa0, 0x14, 0x49, 0x79, 0xa0, 0x15, + 0x49, 0x79, 0xa0, 0x16, 0x59, 0xa8, 0x00, 0x2b, 0x48, 0x01, 0xa0, 0x17, + 0x59, 0xa8, 0x00, 0x2c, 0x48, 0x01, 0xa0, 0x18, 0x59, 0xa8, 0x00, 0x2d, + 0x48, 0x01, 0xa0, 0x19, 0x59, 0xa8, 0x00, 0x2e, 0x48, 0x01, 0xa0, 0x1a, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0xdc, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x71, 0x30, + 0x04, 0x01, 0xf8, 0xc9, 0x4a, 0x01, 0xa0, 0x06, 0x50, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf7, 0xb5, 0x04, 0x01, 0xf8, 0xc5, 0x4a, 0x01, 0xa0, 0x06, + 0x21, 0x10, 0x00, 0x14, 0x49, 0x79, 0xa0, 0x07, 0x49, 0x79, 0xa0, 0x08, + 0x49, 0x79, 0xa0, 0x09, 0x49, 0x79, 0xa0, 0x0a, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x71, 0x30, 0x04, 0x01, 0xf8, 0xbf, + 0x04, 0x01, 0xf0, 0x02, 0x04, 0x01, 0xf8, 0xc4, 0x4a, 0x01, 0xa0, 0x06, + 0x02, 0x00, 0x00, 0x00, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x71, 0x30, 0x04, 0x01, 0xf8, 0xbb, 0x4a, 0x01, 0xa0, 0x06, + 0x02, 0x00, 0x00, 0x00, 0x59, 0x30, 0x04, 0x03, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x31, 0x04, 0x02, 0x07, 0x96, 0x81, 0xa4, 0x08, 0x00, + 0x4a, 0x00, 0x08, 0x01, 0x00, 0xff, 0xff, 0xfe, 0x04, 0x01, 0xf7, 0x2e, + 0x04, 0x01, 0xf8, 0xb0, 0x4a, 0x01, 0xa0, 0x06, 0x01, 0x00, 0x00, 0x00, + 0x59, 0x30, 0x04, 0x1a, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x03, + 0x48, 0x01, 0xa4, 0x07, 0x04, 0x01, 0xf0, 0x03, 0x4a, 0x01, 0xa4, 0x07, + 0x00, 0x00, 0x00, 0x03, 0x59, 0x30, 0x02, 0x1a, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x00, 0x00, 0x03, 0x48, 0x01, 0xa2, 0x07, 0x04, 0x01, 0xf0, 0x03, + 0x4a, 0x01, 0xa2, 0x07, 0x00, 0x00, 0x2a, 0x00, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x71, 0x30, 0x4a, 0x02, 0x62, 0x02, + 0x00, 0x00, 0xff, 0xff, 0x04, 0x01, 0xf8, 0x89, 0x4a, 0x01, 0xa4, 0x06, + 0x00, 0x00, 0x20, 0x10, 0x4a, 0x01, 0xa2, 0x06, 0x00, 0x00, 0x00, 0x14, + 0x4a, 0x01, 0xa4, 0x07, 0x00, 0x00, 0x08, 0x00, 0x4a, 0x01, 0xa2, 0x07, + 0x00, 0x00, 0x20, 0x00, 0x80, 0x00, 0x05, 0x80, 0x59, 0x9c, 0x08, 0x17, + 0x8c, 0x04, 0x0d, 0x0a, 0x04, 0x02, 0x00, 0x03, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x20, 0x8c, 0x04, 0x0d, 0x08, 0x04, 0x00, 0x00, 0x03, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x02, 0x59, 0x34, 0x08, 0x0a, 0x8c, 0x04, 0x0d, 0x14, + 0x04, 0x00, 0x00, 0x05, 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x03, 0x80, + 0x80, 0x04, 0x05, 0x40, 0x04, 0x01, 0xf0, 0x06, 0x59, 0x9c, 0x08, 0x18, + 0x8c, 0x04, 0x0d, 0x18, 0x04, 0x00, 0x00, 0x03, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x03, 0x80, 0x04, 0x01, 0xf0, 0x3c, 0x04, 0x01, 0xf8, 0x75, + 0x4a, 0x01, 0xa4, 0x06, 0x00, 0x00, 0x02, 0x10, 0x4a, 0x01, 0xa2, 0x06, + 0x00, 0x00, 0x00, 0x14, 0x4a, 0x01, 0xa4, 0x07, 0x00, 0x00, 0x08, 0x00, + 0x59, 0x34, 0x00, 0x0a, 0x8c, 0x00, 0x05, 0x16, 0x04, 0x00, 0x00, 0x14, + 0x59, 0x34, 0x0c, 0x05, 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x04, 0x00, 0x00, 0x13, 0x59, 0x34, 0x0a, 0x05, 0x82, 0x04, 0x05, 0x00, + 0x00, 0x00, 0xc0, 0x00, 0x04, 0x02, 0x00, 0x09, 0x8c, 0x04, 0x0d, 0x1a, + 0x04, 0x00, 0x00, 0x04, 0x4a, 0x01, 0xa2, 0x07, 0x00, 0x00, 0x21, 0x00, + 0x04, 0x01, 0xf0, 0x0c, 0x4a, 0x01, 0xa2, 0x07, 0x00, 0x00, 0x01, 0x00, + 0x04, 0x01, 0xf0, 0x09, 0x4a, 0x01, 0xa2, 0x07, 0x00, 0x00, 0x04, 0x00, + 0x04, 0x01, 0xf0, 0x06, 0x4a, 0x01, 0xa2, 0x07, 0x00, 0x00, 0x07, 0x00, + 0x04, 0x01, 0xf0, 0x03, 0x4a, 0x01, 0xa2, 0x07, 0x00, 0x00, 0x08, 0x00, + 0x80, 0x00, 0x05, 0x80, 0x59, 0x9c, 0x08, 0x17, 0x8c, 0x04, 0x0d, 0x0a, + 0x04, 0x02, 0x00, 0x03, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x20, + 0x8c, 0x04, 0x0d, 0x08, 0x04, 0x00, 0x00, 0x03, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x02, + 0x59, 0x34, 0x0a, 0x00, 0x8c, 0x04, 0x0d, 0x0e, 0x04, 0x00, 0x00, 0x0b, + 0x84, 0x00, 0x05, 0x50, 0x59, 0x9c, 0x10, 0x17, 0x8c, 0x08, 0x15, 0x0a, + 0x04, 0x02, 0x00, 0x04, 0x8c, 0x04, 0x0d, 0x0a, 0x04, 0x00, 0x00, 0x02, + 0x84, 0x00, 0x05, 0x4e, 0x8c, 0x04, 0x0d, 0x1c, 0x04, 0x00, 0x00, 0x02, + 0x84, 0x00, 0x05, 0x52, 0x48, 0x01, 0xa2, 0x0a, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x71, 0x30, 0x04, 0x01, 0xf8, 0x33, + 0x4a, 0x01, 0xa0, 0x06, 0x02, 0x10, 0x00, 0x14, 0x4a, 0x01, 0xa0, 0x07, + 0x01, 0x00, 0x00, 0x00, 0x49, 0x79, 0xa0, 0x08, 0x49, 0x79, 0xa0, 0x09, + 0x49, 0x79, 0xa0, 0x0a, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x71, 0x30, 0x04, 0x01, 0xf8, 0x25, 0x4a, 0x01, 0xa0, 0x06, + 0x02, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf6, 0x60, 0x49, 0x33, 0xc8, 0x57, + 0x04, 0x01, 0xf8, 0x20, 0x4a, 0x01, 0xa0, 0x06, 0x01, 0x00, 0x00, 0x00, + 0x4a, 0x01, 0xa4, 0x07, 0x00, 0x00, 0x00, 0x0b, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x71, 0x30, 0x42, 0x00, 0x50, 0x00, + 0x32, 0x00, 0x00, 0x00, 0x42, 0x00, 0x60, 0x00, 0x08, 0x29, 0x00, 0x00, + 0x41, 0x78, 0x68, 0x00, 0x41, 0x78, 0x78, 0x00, 0x04, 0x01, 0xf3, 0xe3, + 0x42, 0x00, 0x50, 0x00, 0x22, 0x00, 0x00, 0x00, 0x42, 0x00, 0x60, 0x00, + 0x01, 0x29, 0x00, 0x00, 0x41, 0x78, 0x68, 0x00, 0x41, 0x78, 0x78, 0x00, + 0x04, 0x01, 0xf3, 0xdc, 0x42, 0x00, 0x50, 0x00, 0x33, 0x00, 0x00, 0x00, + 0x42, 0x00, 0x60, 0x00, 0x08, 0x98, 0x00, 0x00, 0x41, 0x78, 0x68, 0x00, + 0x41, 0x78, 0x78, 0x00, 0x04, 0x01, 0xf3, 0xd5, 0x42, 0x00, 0x50, 0x00, + 0x23, 0x00, 0x00, 0x00, 0x42, 0x00, 0x60, 0x00, 0x01, 0x98, 0x00, 0x00, + 0x41, 0x78, 0x68, 0x00, 0x41, 0x78, 0x78, 0x00, 0x04, 0x01, 0xf3, 0xce, + 0x59, 0x30, 0x04, 0x03, 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x85, + 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x82, 0x00, 0x0c, 0x80, + 0x00, 0x00, 0x00, 0x93, 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x82, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x85, 0x0c, 0x01, 0xf0, 0x01, + 0x00, 0x10, 0x6d, 0x5b, 0x00, 0x10, 0x6d, 0x5d, 0x00, 0x10, 0x6d, 0x6a, + 0x00, 0x10, 0x6d, 0x5b, 0x00, 0x10, 0x6d, 0x5b, 0x00, 0x10, 0x6d, 0x5b, + 0x00, 0x10, 0x6d, 0x5b, 0x00, 0x10, 0x6d, 0x5b, 0x00, 0x10, 0x6d, 0x5b, + 0x00, 0x10, 0x6d, 0x5b, 0x00, 0x10, 0x6d, 0x5b, 0x00, 0x10, 0x6d, 0x5b, + 0x00, 0x10, 0x6d, 0x5b, 0x00, 0x10, 0x6d, 0x77, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x49, 0x33, 0xc8, 0x57, 0x04, 0x01, 0xf8, 0x51, + 0x59, 0x30, 0x00, 0x1c, 0x48, 0x01, 0xa0, 0x04, 0x48, 0x01, 0xa0, 0x07, + 0x49, 0x79, 0xa4, 0x08, 0x4a, 0x01, 0xa2, 0x08, 0x00, 0x00, 0xff, 0xff, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0xdc, 0x00, 0x04, 0x01, 0xf3, 0xc7, 0x49, 0x33, 0xc8, 0x57, + 0x04, 0x01, 0xf8, 0x50, 0x59, 0x30, 0x00, 0x1c, 0x48, 0x01, 0xa0, 0x04, + 0x4a, 0x01, 0xa4, 0x06, 0x00, 0x00, 0x00, 0x03, 0x4a, 0x01, 0xa2, 0x06, + 0x00, 0x00, 0x03, 0x00, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x04, 0x01, 0xf3, 0xba, + 0x4d, 0x2c, 0x00, 0x00, 0x59, 0x32, 0x58, 0x08, 0x49, 0x33, 0xc8, 0x57, + 0x49, 0x2f, 0xc8, 0x57, 0x81, 0x2e, 0x59, 0xc0, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x59, 0x34, 0x0a, 0x12, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x59, 0x2c, 0x00, 0x0a, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x90, 0x00, 0x01, 0xc0, 0x80, 0x04, 0x05, 0x40, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x11, 0x44, 0x03, 0x48, 0x00, + 0x81, 0xa5, 0xa0, 0x00, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0x59, 0x2c, 0x00, 0x09, + 0x82, 0x00, 0x05, 0x00, 0xff, 0x00, 0x00, 0x00, 0x82, 0x00, 0x1d, 0x80, + 0x84, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, 0x82, 0x00, 0x1d, 0x80, + 0x85, 0x00, 0x00, 0x00, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x07, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x83, 0x2c, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x50, 0x0c, 0x00, 0x00, 0x44, 0x01, 0xa0, 0x00, 0x80, 0x0c, 0x18, 0x00, + 0x80, 0xd1, 0xa0, 0x00, 0x80, 0x08, 0x10, 0x40, 0x04, 0x02, 0x07, 0xfb, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x5c, 0x02, 0x58, 0x00, + 0x04, 0x01, 0xf3, 0x89, 0x42, 0x00, 0x50, 0x00, 0x81, 0x00, 0x00, 0x00, + 0x42, 0x00, 0x60, 0x00, 0x00, 0x09, 0x00, 0x00, 0x41, 0x78, 0x68, 0x00, + 0x41, 0x78, 0x78, 0x00, 0x04, 0x01, 0xf3, 0x60, 0x42, 0x00, 0x50, 0x00, + 0x84, 0x00, 0x00, 0x00, 0x42, 0x00, 0x60, 0x00, 0x00, 0x99, 0x00, 0x00, + 0x59, 0x30, 0x04, 0x06, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x00, 0x00, 0x02, 0x84, 0x30, 0x65, 0x2e, 0x41, 0x78, 0x68, 0x00, + 0x41, 0x78, 0x78, 0x00, 0x04, 0x01, 0xf3, 0x54, 0x42, 0x00, 0x50, 0x00, + 0x85, 0x00, 0x00, 0x00, 0x42, 0x00, 0x60, 0x00, 0x00, 0x99, 0x00, 0x00, + 0x59, 0x30, 0x04, 0x06, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x00, 0x00, 0x02, 0x84, 0x30, 0x65, 0x2e, 0x41, 0x78, 0x68, 0x00, + 0x41, 0x78, 0x78, 0x00, 0x04, 0x01, 0xf3, 0x48, 0x59, 0x30, 0x04, 0x03, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x53, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x82, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x4b, + 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0x32, 0x68, 0x09, + 0x59, 0x36, 0x8c, 0x03, 0x48, 0x03, 0xc8, 0x57, 0x0c, 0x01, 0xf0, 0x01, + 0x00, 0x10, 0x6e, 0x4b, 0x00, 0x10, 0x6e, 0x53, 0x00, 0x10, 0x6e, 0x5b, + 0x00, 0x10, 0x6e, 0x63, 0x00, 0x10, 0x6d, 0xdc, 0x00, 0x10, 0x6d, 0xdc, + 0x00, 0x10, 0x6d, 0xdc, 0x00, 0x10, 0x6e, 0x43, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x42, 0x00, 0x50, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x42, 0x00, 0x60, 0x00, 0x08, 0x29, 0x00, 0x00, 0x41, 0x78, 0x68, 0x00, + 0x41, 0x78, 0x78, 0x00, 0x04, 0x01, 0xf3, 0x2a, 0x49, 0x33, 0xc8, 0x57, + 0x04, 0x01, 0xff, 0x46, 0x4a, 0x01, 0xa0, 0x06, 0x12, 0x00, 0x00, 0x00, + 0x59, 0x30, 0x04, 0x06, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x02, 0x00, 0x03, 0x59, 0x34, 0x00, 0x02, 0x04, 0x01, 0xf0, 0x02, + 0x59, 0xa8, 0x00, 0x0f, 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x48, 0x01, 0xa0, 0x07, 0x59, 0x30, 0x04, 0x19, 0x48, 0x01, 0xa4, 0x08, + 0x59, 0x30, 0x02, 0x19, 0x48, 0x01, 0xa2, 0x08, 0x49, 0x79, 0xa0, 0x09, + 0x49, 0x79, 0xa0, 0x0a, 0x49, 0x79, 0xa0, 0x0b, 0x49, 0x79, 0xa0, 0x0c, + 0x49, 0x79, 0xa0, 0x0d, 0x49, 0x79, 0xa0, 0x0e, 0x49, 0x79, 0xa0, 0x0f, + 0x49, 0x79, 0xa0, 0x10, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0b, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x04, 0x01, 0xf3, 0x2d, + 0x04, 0x01, 0xff, 0x28, 0x4a, 0x01, 0xa0, 0x06, 0x0f, 0x00, 0x00, 0x00, + 0x59, 0x30, 0x00, 0x1c, 0x48, 0x01, 0xa0, 0x07, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, + 0x04, 0x01, 0xf3, 0x23, 0x04, 0x01, 0xff, 0x2c, 0x4a, 0x01, 0xa0, 0x06, + 0x02, 0x00, 0x00, 0x00, 0x59, 0xc4, 0x00, 0x85, 0x48, 0x03, 0x10, 0x04, + 0x59, 0x88, 0x00, 0x00, 0x48, 0x01, 0xa0, 0x07, 0x59, 0x88, 0x00, 0x01, + 0x48, 0x01, 0xa0, 0x08, 0x59, 0x88, 0x00, 0x02, 0x48, 0x01, 0xa0, 0x09, + 0x59, 0x88, 0x00, 0x03, 0x48, 0x01, 0xa0, 0x0a, 0x59, 0x88, 0x00, 0x04, + 0x48, 0x01, 0xa0, 0x0b, 0x59, 0x88, 0x00, 0x05, 0x48, 0x01, 0xa0, 0x0c, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x07, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0xdc, 0x00, 0x04, 0x01, 0xf3, 0x0d, 0x4a, 0x02, 0x62, 0x02, + 0x00, 0x00, 0xff, 0xff, 0x04, 0x01, 0xff, 0x06, 0x4a, 0x01, 0xa0, 0x06, + 0x62, 0x00, 0x00, 0x00, 0x59, 0x30, 0x00, 0x1c, 0x48, 0x01, 0xa0, 0x07, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0xdc, 0x00, 0x04, 0x01, 0xf3, 0x01, 0x04, 0x01, 0xfe, 0xfc, + 0x59, 0x30, 0x08, 0x08, 0x4c, 0x50, 0x00, 0x00, 0x4c, 0x54, 0x00, 0x00, + 0x4c, 0x58, 0x00, 0x00, 0x82, 0x04, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x0a, + 0x59, 0x30, 0xb0, 0x1c, 0x82, 0xd0, 0xac, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, 0x59, 0x30, 0x08, 0x1c, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x5c, 0x00, 0xb0, 0x00, + 0x5c, 0x00, 0xa8, 0x00, 0x5c, 0x00, 0xa0, 0x00, 0x04, 0x01, 0xf2, 0xee, + 0x04, 0x01, 0xff, 0x9b, 0x59, 0x30, 0x00, 0x17, 0x48, 0x01, 0xa0, 0x06, + 0x59, 0x30, 0x00, 0x18, 0x48, 0x01, 0xa0, 0x07, 0x4a, 0x01, 0xa0, 0x08, + 0x00, 0x00, 0x10, 0x00, 0x04, 0x01, 0xf0, 0x20, 0x04, 0x01, 0xff, 0x93, + 0x59, 0x30, 0x00, 0x17, 0x48, 0x01, 0xa0, 0x06, 0x59, 0x30, 0x00, 0x18, + 0x48, 0x01, 0xa0, 0x07, 0x4a, 0x01, 0xa0, 0x08, 0x00, 0x00, 0x40, 0x00, + 0x04, 0x01, 0xf0, 0x18, 0x04, 0x01, 0xff, 0x8b, 0x59, 0x30, 0x00, 0x17, + 0x48, 0x01, 0xa0, 0x06, 0x59, 0x30, 0x00, 0x18, 0x48, 0x01, 0xa0, 0x07, + 0x4a, 0x01, 0xa0, 0x08, 0x00, 0x00, 0x20, 0x00, 0x04, 0x01, 0xf0, 0x10, + 0x04, 0x01, 0xff, 0x83, 0x59, 0x30, 0x00, 0x17, 0x48, 0x01, 0xa0, 0x06, + 0x59, 0x30, 0x00, 0x18, 0x48, 0x01, 0xa0, 0x07, 0x4a, 0x01, 0xa0, 0x08, + 0x00, 0x00, 0x04, 0x00, 0x04, 0x01, 0xf0, 0x08, 0x04, 0x01, 0xff, 0x7b, + 0x59, 0x30, 0x00, 0x17, 0x48, 0x01, 0xa0, 0x06, 0x59, 0x30, 0x00, 0x18, + 0x48, 0x01, 0xa0, 0x07, 0x4a, 0x01, 0xa0, 0x08, 0x00, 0x00, 0x02, 0x00, + 0x49, 0x79, 0xa0, 0x09, 0x49, 0x79, 0xa0, 0x0a, 0x49, 0x79, 0xa0, 0x0b, + 0x49, 0x79, 0xa0, 0x0c, 0x49, 0x79, 0xa0, 0x0d, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, + 0x04, 0x01, 0xf2, 0xbd, 0x04, 0x01, 0xfe, 0xc6, 0x4a, 0x01, 0xa0, 0x06, + 0x02, 0x00, 0x00, 0x14, 0x49, 0x79, 0xa4, 0x07, 0x49, 0x79, 0xa2, 0x07, + 0x59, 0xa8, 0x00, 0x37, 0x48, 0x01, 0xa0, 0x08, 0x59, 0xa8, 0x00, 0x38, + 0x48, 0x01, 0xa0, 0x09, 0x4a, 0x01, 0xa0, 0x0a, 0x00, 0x04, 0x78, 0x78, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x05, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0xdc, 0x00, 0x04, 0x01, 0xf2, 0xad, 0x04, 0x01, 0xfe, 0xb6, + 0x4a, 0x01, 0xa0, 0x06, 0x02, 0x14, 0x00, 0x18, 0x4a, 0x01, 0xa4, 0x07, + 0x00, 0x00, 0x08, 0x00, 0x59, 0x30, 0x00, 0x1c, 0x82, 0x00, 0x0d, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x90, 0x04, 0x09, 0xc0, 0x48, 0x05, 0xa2, 0x07, + 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, 0x48, 0x01, 0xa0, 0x0a, + 0x49, 0x79, 0xa4, 0x08, 0x49, 0x79, 0xa2, 0x08, 0x49, 0x79, 0xa4, 0x09, + 0x49, 0x79, 0xa2, 0x09, 0x49, 0x79, 0xa0, 0x0b, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, + 0x04, 0x01, 0xf2, 0x96, 0x49, 0x33, 0xc8, 0x57, 0x49, 0x37, 0xc8, 0x57, + 0x4d, 0x1c, 0x00, 0x00, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x35, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8b, 0xff, 0x04, 0x02, 0x00, 0x21, + 0x04, 0x01, 0xfe, 0x89, 0x4a, 0x01, 0xa0, 0x06, 0x13, 0x00, 0x00, 0x00, + 0x59, 0x32, 0x38, 0x1e, 0x59, 0x1c, 0x04, 0x14, 0x8c, 0x00, 0x05, 0x02, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0x1c, 0x00, 0x19, + 0x48, 0x01, 0xa0, 0x05, 0x59, 0x1c, 0x04, 0x06, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x07, 0x59, 0x30, 0x08, 0x09, + 0x58, 0x04, 0x00, 0x02, 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x48, 0x01, 0xa0, 0x07, 0x04, 0x01, 0xf0, 0x03, 0x59, 0xa8, 0x00, 0x0f, + 0x48, 0x01, 0xa0, 0x07, 0x59, 0x30, 0x04, 0x19, 0x48, 0x01, 0xa4, 0x08, + 0x59, 0x30, 0x02, 0x19, 0x48, 0x01, 0xa2, 0x08, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, + 0x5c, 0x02, 0x38, 0x00, 0x04, 0x01, 0xf2, 0x6e, 0x48, 0x03, 0xc8, 0x56, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x76, 0x59, 0x8c, 0x00, 0x0d, + 0x81, 0x30, 0x05, 0x80, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0xc4, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x5c, 0x02, 0x38, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x64, 0x63, 0x48, 0x03, 0xc8, 0x56, 0x4d, 0x2c, 0x00, 0x00, + 0x4d, 0x1c, 0x00, 0x00, 0x59, 0x32, 0x38, 0x1e, 0x81, 0x1e, 0x39, 0xc0, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0x1c, 0x0c, 0x06, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x06, 0x04, 0x00, 0x00, 0x0d, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x36, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x37, 0x4a, 0x02, 0x64, 0x1a, + 0x00, 0x00, 0x00, 0x03, 0x4a, 0x02, 0x62, 0x1a, 0x00, 0x00, 0x17, 0x00, + 0x5c, 0x02, 0x38, 0x00, 0x5c, 0x02, 0x58, 0x00, 0x04, 0x01, 0xf0, 0x64, + 0x04, 0x01, 0xf8, 0x4b, 0x42, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x59, 0x1c, 0x02, 0x03, 0x59, 0x1c, 0x08, 0x04, 0x8c, 0x04, 0x0d, 0x3e, + 0x04, 0x02, 0x00, 0x23, 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x0e, + 0x0c, 0x00, 0x10, 0x03, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x00, 0x10, 0x6f, 0x05, 0x00, 0x10, 0x6f, 0x11, 0x00, 0x10, 0x6f, 0x07, + 0x00, 0x10, 0x6f, 0x11, 0x00, 0x10, 0x6f, 0x0d, 0x00, 0x10, 0x6f, 0x05, + 0x00, 0x10, 0x6f, 0x05, 0x00, 0x10, 0x6f, 0x11, 0x00, 0x10, 0x6f, 0x11, + 0x00, 0x10, 0x6f, 0x05, 0x00, 0x10, 0x6f, 0x05, 0x00, 0x10, 0x6f, 0x05, + 0x00, 0x10, 0x6f, 0x05, 0x00, 0x10, 0x6f, 0x05, 0x00, 0x10, 0x6f, 0x11, + 0x00, 0x10, 0x6f, 0x05, 0x00, 0x10, 0x6f, 0x11, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x59, 0x1c, 0x04, 0x14, 0x48, 0x03, 0xc8, 0x57, + 0x8c, 0x00, 0x05, 0x18, 0x04, 0x00, 0x00, 0x03, 0x8c, 0x00, 0x05, 0x12, + 0x04, 0x00, 0x00, 0x03, 0x80, 0x00, 0x15, 0x80, 0x04, 0x01, 0xf0, 0x03, + 0x42, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x59, 0x1c, 0x00, 0x15, + 0x48, 0x01, 0xa0, 0x0a, 0x04, 0x01, 0xf0, 0x18, 0x04, 0x01, 0xf8, 0x1f, + 0x59, 0x1e, 0x58, 0x08, 0x81, 0x2e, 0x59, 0xc0, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x59, 0x2c, 0x10, 0x0f, 0x59, 0x1c, 0x00, 0x11, + 0x80, 0x08, 0x04, 0x80, 0x48, 0x01, 0xa0, 0x0a, 0x59, 0x1c, 0x02, 0x03, + 0x59, 0x1c, 0x08, 0x04, 0x8c, 0x04, 0x0d, 0x3e, 0x04, 0x02, 0x00, 0x07, + 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x07, + 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, + 0x42, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf0, 0x02, + 0x80, 0x00, 0x15, 0x80, 0x48, 0x09, 0xa0, 0x0b, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, + 0x5c, 0x02, 0x38, 0x00, 0x5c, 0x02, 0x58, 0x00, 0x04, 0x01, 0xf1, 0xfe, + 0x48, 0x03, 0xc8, 0x56, 0x04, 0x01, 0xfe, 0x06, 0x4a, 0x01, 0xa0, 0x06, + 0x02, 0x00, 0x00, 0x00, 0x59, 0x30, 0x0c, 0x19, 0x48, 0x05, 0xa4, 0x07, + 0x59, 0x30, 0x0a, 0x19, 0x48, 0x05, 0xa2, 0x07, 0x59, 0xa8, 0x10, 0x0f, + 0x59, 0x30, 0x08, 0x09, 0x58, 0x04, 0x18, 0x02, 0x82, 0x0c, 0x1d, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x59, 0x30, 0x08, 0x1e, 0x58, 0x04, 0x04, 0x06, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x00, 0x04, + 0x48, 0x09, 0xa0, 0x08, 0x48, 0x0d, 0xa0, 0x09, 0x04, 0x01, 0xf0, 0x03, + 0x48, 0x0d, 0xa0, 0x08, 0x48, 0x09, 0xa0, 0x09, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x04, 0x01, 0xfd, 0xee, 0x04, 0x01, 0xf0, 0x03, + 0x48, 0x03, 0xc8, 0x56, 0x04, 0x01, 0xfd, 0xe4, 0x4a, 0x01, 0xa0, 0x06, + 0x01, 0x00, 0x00, 0x00, 0x59, 0x30, 0x04, 0x1a, 0x48, 0x01, 0xa4, 0x07, + 0x59, 0x30, 0x02, 0x1a, 0x48, 0x01, 0xa2, 0x07, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, + 0x04, 0x01, 0xf1, 0xd6, 0x48, 0x03, 0xc8, 0x56, 0x4d, 0x1c, 0x00, 0x00, + 0x04, 0x01, 0xfd, 0xc8, 0x4a, 0x01, 0xa0, 0x06, 0x14, 0x00, 0x00, 0x00, + 0x59, 0x32, 0x38, 0x1e, 0x59, 0x1c, 0x00, 0x19, 0x48, 0x01, 0xa0, 0x05, + 0x59, 0x30, 0x04, 0x19, 0x48, 0x01, 0xa4, 0x07, 0x59, 0x30, 0x02, 0x19, + 0x48, 0x01, 0xa2, 0x07, 0x59, 0x30, 0x00, 0x15, 0x48, 0x01, 0xa0, 0x08, + 0x59, 0x30, 0x02, 0x16, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x84, 0x00, 0x01, 0xc0, 0x48, 0x01, 0xa4, 0x09, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, + 0x5c, 0x02, 0x38, 0x00, 0x04, 0x01, 0xf1, 0xbd, 0x48, 0x03, 0xc8, 0x56, + 0x04, 0x01, 0xf8, 0x0b, 0x59, 0x30, 0x04, 0x1a, 0x90, 0x00, 0x01, 0xc0, + 0x48, 0x01, 0xa0, 0x05, 0x04, 0x01, 0xf9, 0xf4, 0x41, 0x78, 0x08, 0x00, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x04, 0x01, 0xf9, 0xb3, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x5c, 0x2c, 0x48, 0x03, 0xc8, 0x56, + 0x59, 0x30, 0x08, 0x17, 0x82, 0x04, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x46, 0x03, 0x48, 0x00, 0x00, 0x00, 0x00, 0x21, 0x58, 0x04, 0x04, 0x04, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x30, 0x00, 0x04, 0x00, 0x00, 0x03, 0x46, 0x03, 0x48, 0x00, + 0x00, 0x00, 0x00, 0x41, 0x81, 0xa5, 0xa0, 0x00, 0x58, 0x0c, 0x00, 0x01, + 0x82, 0x00, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xff, 0x82, 0x04, 0x0d, 0x40, + 0xc2, 0x00, 0x00, 0x00, 0x48, 0x05, 0xa0, 0x00, 0x58, 0x0c, 0x08, 0x00, + 0x82, 0x04, 0x15, 0x00, 0x00, 0xff, 0xff, 0xff, 0x82, 0x00, 0x05, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x80, 0x08, 0x05, 0x40, 0x48, 0x01, 0xa0, 0x01, + 0x58, 0x0c, 0x00, 0x02, 0x82, 0x00, 0x05, 0x80, 0x00, 0xc0, 0x00, 0x00, + 0x82, 0x00, 0x05, 0x00, 0x00, 0xfd, 0x03, 0x00, 0x48, 0x01, 0xa0, 0x02, + 0x58, 0x0c, 0x00, 0x03, 0x48, 0x01, 0xa0, 0x03, 0x58, 0x0c, 0x04, 0x04, + 0x48, 0x01, 0xa4, 0x04, 0x58, 0x0c, 0x02, 0x04, 0x48, 0x01, 0xa2, 0x04, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x59, 0xa8, 0x00, 0x23, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x28, 0x04, 0x02, 0x00, 0x09, + 0x59, 0xa8, 0x00, 0x23, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x28, + 0x04, 0x00, 0x00, 0x03, 0x49, 0x7a, 0x6a, 0x12, 0x04, 0x01, 0xf0, 0x03, + 0x4a, 0x02, 0x6a, 0x12, 0x00, 0x00, 0xff, 0x00, 0x42, 0x00, 0x50, 0x00, + 0x22, 0x00, 0x00, 0x00, 0x42, 0x00, 0x60, 0x00, 0x01, 0x38, 0x00, 0x00, + 0x41, 0x78, 0x68, 0x00, 0x41, 0x78, 0x78, 0x00, 0x04, 0x01, 0xf9, 0x52, + 0x59, 0x30, 0x10, 0x08, 0x4a, 0x01, 0xa0, 0x06, 0x54, 0x00, 0x00, 0x00, + 0x59, 0xa8, 0x00, 0x0f, 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x58, 0x08, 0x0c, 0x0a, 0x80, 0x04, 0x08, 0xf0, 0x80, 0x04, 0x05, 0x40, + 0x48, 0x01, 0xa0, 0x07, 0x58, 0x08, 0x00, 0x0a, 0x82, 0x00, 0x05, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x48, 0x01, 0xa0, 0x08, 0x59, 0xa8, 0x00, 0x02, + 0x48, 0x01, 0xa0, 0x09, 0x59, 0xa8, 0x00, 0x03, 0x48, 0x01, 0xa0, 0x0a, + 0x59, 0xa8, 0x00, 0x00, 0x48, 0x01, 0xa0, 0x0b, 0x59, 0xa8, 0x00, 0x01, + 0x48, 0x01, 0xa0, 0x0c, 0x58, 0x08, 0x00, 0x0c, 0x9c, 0x00, 0x01, 0xc0, + 0x48, 0x01, 0xa0, 0x0d, 0x58, 0x08, 0x00, 0x0d, 0x9c, 0x00, 0x01, 0xc0, + 0x48, 0x01, 0xa0, 0x0e, 0x58, 0x08, 0x00, 0x0e, 0x9c, 0x00, 0x01, 0xc0, + 0x48, 0x01, 0xa0, 0x0f, 0x58, 0x08, 0x00, 0x0f, 0x9c, 0x00, 0x01, 0xc0, + 0x48, 0x01, 0xa0, 0x10, 0x58, 0x08, 0x00, 0x10, 0x9c, 0x00, 0x01, 0xc0, + 0x48, 0x01, 0xa0, 0x11, 0x58, 0x08, 0x00, 0x11, 0x9c, 0x00, 0x01, 0xc0, + 0x48, 0x01, 0xa0, 0x12, 0x58, 0x08, 0x00, 0x12, 0x9c, 0x00, 0x01, 0xc0, + 0x48, 0x01, 0xa0, 0x13, 0x58, 0x08, 0x00, 0x13, 0x9c, 0x00, 0x01, 0xc0, + 0x48, 0x01, 0xa0, 0x14, 0x58, 0x08, 0x00, 0x10, 0x9c, 0x00, 0x01, 0xc0, + 0x48, 0x01, 0xa0, 0x15, 0x58, 0x08, 0x00, 0x11, 0x9c, 0x00, 0x01, 0xc0, + 0x48, 0x01, 0xa0, 0x16, 0x58, 0x08, 0x00, 0x12, 0x9c, 0x00, 0x01, 0xc0, + 0x48, 0x01, 0xa0, 0x17, 0x58, 0x08, 0x00, 0x13, 0x9c, 0x00, 0x01, 0xc0, + 0x48, 0x01, 0xa0, 0x18, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x13, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x04, 0x01, 0xf1, 0x35, + 0x48, 0x03, 0xc8, 0x56, 0x42, 0x00, 0x50, 0x00, 0x22, 0x00, 0x00, 0x00, + 0x42, 0x00, 0x60, 0x00, 0x01, 0x29, 0x00, 0x00, 0x41, 0x78, 0x68, 0x00, + 0x41, 0x78, 0x78, 0x00, 0x04, 0x01, 0xf9, 0x0b, 0x59, 0x30, 0x10, 0x08, + 0x4a, 0x01, 0xa0, 0x06, 0x55, 0x00, 0x00, 0x00, 0x58, 0x08, 0x00, 0x0b, + 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, 0x58, 0x08, 0x0c, 0x0a, + 0x80, 0x04, 0x08, 0xf0, 0x80, 0x04, 0x05, 0x40, 0x48, 0x01, 0xa0, 0x07, + 0x58, 0x08, 0x08, 0x0a, 0x82, 0x04, 0x0d, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x59, 0xa8, 0x00, 0x0f, 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x80, 0x04, 0x05, 0x40, 0x48, 0x01, 0xa0, 0x08, 0x58, 0x08, 0x00, 0x0c, + 0x9c, 0x00, 0x01, 0xc0, 0x48, 0x01, 0xa0, 0x09, 0x58, 0x08, 0x00, 0x0d, + 0x9c, 0x00, 0x01, 0xc0, 0x48, 0x01, 0xa0, 0x0a, 0x58, 0x08, 0x00, 0x0e, + 0x9c, 0x00, 0x01, 0xc0, 0x48, 0x01, 0xa0, 0x0b, 0x58, 0x08, 0x00, 0x0f, + 0x9c, 0x00, 0x01, 0xc0, 0x48, 0x01, 0xa0, 0x0c, 0x59, 0xa8, 0x00, 0x02, + 0x48, 0x01, 0xa0, 0x0d, 0x59, 0xa8, 0x00, 0x03, 0x48, 0x01, 0xa0, 0x0e, + 0x59, 0xa8, 0x00, 0x00, 0x48, 0x01, 0xa0, 0x0f, 0x59, 0xa8, 0x00, 0x01, + 0x48, 0x01, 0xa0, 0x10, 0x58, 0x08, 0x00, 0x10, 0x48, 0x01, 0xa0, 0x11, + 0x58, 0x08, 0x00, 0x11, 0x48, 0x01, 0xa0, 0x12, 0x58, 0x08, 0x00, 0x12, + 0x48, 0x01, 0xa0, 0x13, 0x58, 0x08, 0x00, 0x13, 0x48, 0x01, 0xa0, 0x14, + 0x49, 0x79, 0xa0, 0x15, 0x49, 0x79, 0xa0, 0x16, 0x49, 0x79, 0xa0, 0x17, + 0x49, 0x79, 0xa0, 0x18, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x13, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x04, 0x01, 0xf0, 0xf6, + 0x04, 0x01, 0xfc, 0xff, 0x59, 0x30, 0x00, 0x1c, 0x80, 0x00, 0x01, 0xc0, + 0x04, 0x00, 0x00, 0x08, 0x4a, 0x01, 0xa0, 0x06, 0x01, 0x00, 0x00, 0x00, + 0x4a, 0x01, 0xa4, 0x07, 0x00, 0x00, 0x00, 0x03, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf0, 0x28, 0x4a, 0x01, 0xa0, 0x06, + 0x02, 0x00, 0x00, 0x00, 0x41, 0x78, 0x08, 0x00, 0x83, 0x6c, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x02, 0x00, 0x03, 0x84, 0x04, 0x0d, 0x42, + 0x04, 0x01, 0xf0, 0x0d, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, + 0x04, 0x02, 0x00, 0x03, 0x84, 0x04, 0x0d, 0x4a, 0x04, 0x01, 0xf0, 0x02, + 0x84, 0x04, 0x0d, 0x48, 0x59, 0xa8, 0x00, 0x23, 0x8c, 0x00, 0x05, 0x06, + 0x04, 0x02, 0x00, 0x03, 0x8c, 0x00, 0x05, 0x0a, 0x04, 0x00, 0x00, 0x02, + 0x84, 0x04, 0x0d, 0x46, 0x48, 0x05, 0xa2, 0x07, 0x59, 0xc4, 0x00, 0x85, + 0x48, 0x03, 0x10, 0x04, 0x4c, 0x58, 0x00, 0x00, 0x4c, 0x50, 0x00, 0x00, + 0x4c, 0x54, 0x00, 0x00, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x83, 0x88, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xd0, 0xac, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, + 0x5c, 0x00, 0xa8, 0x00, 0x5c, 0x00, 0xa0, 0x00, 0x5c, 0x00, 0xb0, 0x00, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0xdc, 0x00, 0x04, 0x01, 0xf0, 0xc1, 0x04, 0x01, 0xfc, 0xbc, + 0x4a, 0x01, 0xa0, 0x06, 0x56, 0x00, 0x00, 0x00, 0x59, 0x34, 0x00, 0x06, + 0x48, 0x01, 0xa0, 0x07, 0x59, 0x34, 0x00, 0x07, 0x48, 0x01, 0xa0, 0x08, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0xdc, 0x00, 0x04, 0x01, 0xf0, 0xb5, 0x48, 0x03, 0xc8, 0x56, + 0x04, 0x01, 0xfc, 0xbd, 0x59, 0x30, 0x08, 0x1c, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x00, 0x00, 0x0e, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x04, 0x82, 0x04, 0x04, 0x80, 0x00, 0x00, 0x00, 0x07, + 0x04, 0x02, 0x10, 0x08, 0x4a, 0x01, 0xa0, 0x06, 0x01, 0x00, 0x00, 0x00, + 0x4a, 0x01, 0xa4, 0x07, 0x00, 0x00, 0x00, 0x03, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf0, 0x12, 0x4a, 0x01, 0xa0, 0x06, + 0x02, 0x00, 0x00, 0x1c, 0x4a, 0x01, 0xa0, 0x07, 0x00, 0x00, 0x00, 0x01, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0xac, 0xbd, 0x50, 0x08, 0x00, 0x00, + 0x9c, 0x00, 0x01, 0xc0, 0x48, 0x01, 0xa0, 0x09, 0x59, 0xa8, 0x00, 0x0f, + 0x48, 0x01, 0xa0, 0x0a, 0x59, 0xa8, 0x00, 0x02, 0x59, 0xa8, 0x08, 0x03, + 0x48, 0x01, 0xa0, 0x0b, 0x48, 0x05, 0xa0, 0x0c, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, + 0x04, 0x01, 0xf0, 0x8f, 0x4d, 0x2c, 0x00, 0x00, 0x04, 0x01, 0xfc, 0x89, + 0x59, 0x32, 0x58, 0x08, 0x59, 0x2c, 0x00, 0x08, 0x82, 0x00, 0x05, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x48, 0x01, 0xa0, 0x01, 0x4a, 0x01, 0xa0, 0x06, + 0x51, 0x00, 0x00, 0x00, 0x5c, 0x02, 0x58, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x6b, 0xb7, 0x48, 0x03, 0xc8, 0x56, 0x59, 0xa8, 0x08, 0x0f, + 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x00, 0xff, 0x59, 0x32, 0x58, 0x08, + 0x59, 0x32, 0x68, 0x09, 0x59, 0xa8, 0x30, 0x23, 0x8c, 0x18, 0x35, 0x0a, + 0x04, 0x02, 0x00, 0x08, 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x02, 0x00, 0x06, + 0x80, 0x00, 0x1d, 0x80, 0x59, 0xa8, 0x20, 0x0f, 0x82, 0x10, 0x25, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x04, 0x01, 0xf0, 0x01, 0x59, 0x30, 0x04, 0x06, + 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x09, + 0x04, 0x00, 0x00, 0x06, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x0a, + 0x04, 0x00, 0x00, 0x2e, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x59, 0x30, 0x00, 0x15, 0x8c, 0x00, 0x05, 0x1e, 0x04, 0x02, 0x00, 0x20, + 0x42, 0x00, 0x50, 0x00, 0x04, 0x00, 0x00, 0x00, 0x42, 0x00, 0x60, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x59, 0x2c, 0x04, 0x0a, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x30, 0x80, 0x00, 0x00, 0xe0, 0x80, 0x30, 0x65, 0x40, + 0x59, 0x34, 0x00, 0x0a, 0x8c, 0x00, 0x05, 0x08, 0x04, 0x00, 0x00, 0x02, + 0x84, 0x30, 0x65, 0x46, 0x41, 0x78, 0x68, 0x00, 0x41, 0x78, 0x78, 0x00, + 0x04, 0x01, 0xf8, 0x31, 0x59, 0x30, 0x0c, 0x14, 0x80, 0x04, 0x00, 0x00, + 0x48, 0x02, 0x64, 0x14, 0x40, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0xd0, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x20, 0x48, 0x01, 0xa4, 0x03, + 0x83, 0x18, 0x0d, 0x40, 0x00, 0x00, 0x00, 0x38, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0xc9, 0x20, 0x04, 0x01, 0xf8, 0x68, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x5c, 0x31, 0x59, 0xa8, 0x00, 0x23, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x28, 0x04, 0x00, 0x00, 0x03, 0x49, 0x7a, 0x6a, 0x12, + 0x04, 0x01, 0xf7, 0xdc, 0x4a, 0x02, 0x6a, 0x12, 0x00, 0x00, 0xff, 0x00, + 0x04, 0x01, 0xf7, 0xd9, 0x42, 0x00, 0x50, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x42, 0x00, 0x60, 0x00, 0x20, 0x29, 0x00, 0x00, 0x41, 0x78, 0x68, 0x00, + 0x41, 0x78, 0x78, 0x00, 0x04, 0x01, 0xf8, 0x12, 0x83, 0x18, 0x0d, 0x40, + 0x00, 0x00, 0x00, 0x38, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0xc9, 0xa0, + 0x04, 0x01, 0xf8, 0x51, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0xd0, + 0x59, 0x30, 0x00, 0x11, 0x82, 0x00, 0x05, 0x00, 0xff, 0xf0, 0x00, 0x00, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x03, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x1b, 0x58, 0x41, 0x78, 0x10, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x5c, 0x33, 0x42, 0x01, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf0, 0x03, 0x42, 0x01, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x11, + 0x59, 0x34, 0x0a, 0x12, 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x59, 0xa8, 0x00, 0x0f, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x90, 0x00, 0x01, 0xc0, 0x80, 0x04, 0x05, 0x40, 0x80, 0xd0, 0x05, 0x40, + 0x44, 0x03, 0x48, 0x00, 0x81, 0xa5, 0xa0, 0x00, 0x59, 0x34, 0x00, 0x02, + 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, 0x80, 0x28, 0x05, 0x40, + 0x48, 0x01, 0xa0, 0x00, 0x59, 0xa8, 0x00, 0x0f, 0x48, 0x01, 0xa0, 0x01, + 0x48, 0x31, 0xa0, 0x02, 0x82, 0x34, 0x05, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x01, 0xa0, 0x03, 0x59, 0x30, 0x04, 0x02, 0x48, 0x01, 0xa4, 0x04, + 0x59, 0x30, 0x0a, 0x02, 0x48, 0x05, 0xa2, 0x04, 0x8c, 0x30, 0x65, 0x2e, + 0x04, 0x00, 0x00, 0x03, 0x48, 0x05, 0xa4, 0x04, 0x48, 0x01, 0xa2, 0x04, + 0x48, 0x3d, 0xa0, 0x05, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x07, 0xc8, 0x57, + 0x4c, 0x04, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x2a, 0x5c, 0x00, 0x08, 0x00, + 0x40, 0x04, 0x00, 0x00, 0x80, 0x08, 0x15, 0x40, 0x80, 0x00, 0x00, 0xc4, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x20, 0x00, 0x48, 0x03, 0x91, 0x0a, + 0x59, 0xb4, 0x00, 0xf6, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x18, + 0x04, 0x02, 0x07, 0xfd, 0x4a, 0x03, 0x68, 0xf0, 0x00, 0x10, 0xad, 0x12, + 0x42, 0x00, 0x18, 0x00, 0x00, 0x10, 0xad, 0x13, 0x58, 0x0c, 0x00, 0x00, + 0x48, 0x03, 0xc8, 0x57, 0x58, 0x0c, 0x00, 0x04, 0x48, 0x03, 0xc8, 0x57, + 0x58, 0x0c, 0x00, 0x06, 0x48, 0x03, 0xc8, 0x57, 0x4a, 0x03, 0x68, 0xf1, + 0x00, 0x10, 0xad, 0x19, 0x48, 0x0b, 0x68, 0xf3, 0x4a, 0x03, 0x78, 0xe4, + 0x00, 0x00, 0x80, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x5c, 0x2c, + 0x48, 0x07, 0xc8, 0x57, 0x48, 0x0a, 0x28, 0x00, 0x4c, 0x04, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x0a, 0x5c, 0x00, 0x08, 0x00, 0x59, 0xb4, 0x00, 0xf6, + 0x8c, 0x00, 0x05, 0x0a, 0x04, 0x02, 0x07, 0xfe, 0x49, 0xa7, 0x68, 0xf2, + 0x48, 0x07, 0x68, 0xf4, 0x4a, 0x03, 0x78, 0xe4, 0x00, 0x00, 0x80, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4a, 0x03, 0x78, 0xe4, 0x00, 0x00, 0xc0, 0x00, + 0x59, 0xbc, 0x00, 0xe4, 0x8c, 0x00, 0x05, 0x20, 0x04, 0x00, 0x00, 0x0c, + 0x4a, 0x03, 0x78, 0xe4, 0x00, 0x00, 0x80, 0x00, 0x42, 0x00, 0x70, 0x00, + 0x00, 0x00, 0x03, 0xe8, 0x59, 0xbc, 0x00, 0xe4, 0x8c, 0x00, 0x05, 0x20, + 0x04, 0x00, 0x07, 0xf5, 0x80, 0x38, 0x70, 0x40, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x04, 0x01, 0xf7, 0xfa, 0x1c, 0x01, 0xf0, 0x00, + 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0x00, 0x00, 0x82, 0x00, 0x05, 0x80, + 0x01, 0x05, 0x00, 0x00, 0x04, 0x02, 0x00, 0x0d, 0x59, 0x9c, 0x08, 0x18, + 0x8c, 0x04, 0x0d, 0x10, 0x04, 0x00, 0x00, 0x0a, 0x59, 0xa8, 0x08, 0x06, + 0x8c, 0x04, 0x0d, 0x0a, 0x04, 0x00, 0x00, 0x07, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x80, 0x4f, 0x41, 0x78, 0x18, 0x00, 0x41, 0x78, 0x20, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x36, 0xf4, 0x1c, 0x01, 0xf0, 0x00, + 0x41, 0x78, 0x10, 0x00, 0x42, 0x02, 0x60, 0x00, 0x00, 0x10, 0xd8, 0xd4, + 0x59, 0xa8, 0x18, 0x0d, 0x48, 0x0a, 0x64, 0x02, 0x4a, 0x02, 0x62, 0x02, + 0x00, 0x00, 0xff, 0xff, 0x80, 0x08, 0x10, 0x00, 0x80, 0x0c, 0x18, 0x40, + 0x04, 0x00, 0x00, 0x04, 0x83, 0x32, 0x64, 0x00, 0x00, 0x00, 0x00, 0x24, + 0x04, 0x01, 0xf7, 0xf8, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, 0x41, 0x31, 0x88, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x5c, 0x03, 0x60, 0x00, + 0x4d, 0xb0, 0x00, 0x00, 0x49, 0xb3, 0xc8, 0x57, 0x49, 0x33, 0xc8, 0x57, + 0x59, 0x30, 0x02, 0x03, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x2c, 0x59, 0x30, 0x04, 0x06, 0x48, 0x03, 0xc8, 0x57, + 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x11, + 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x0e, + 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x06, + 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x06, 0x04, 0x02, 0x00, 0x11, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9d, 0xc7, 0x59, 0x30, 0x00, 0x1c, + 0x80, 0x00, 0x01, 0xc0, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x90, 0xa2, + 0x04, 0x01, 0xf0, 0x0a, 0x59, 0x30, 0x08, 0x1e, 0x48, 0x07, 0xc8, 0x57, + 0x80, 0x04, 0x09, 0xc0, 0x04, 0x00, 0x00, 0x06, 0x58, 0x04, 0x00, 0x1c, + 0x48, 0x03, 0xc8, 0x57, 0x81, 0x30, 0x05, 0x80, 0x04, 0x02, 0x00, 0x02, + 0x49, 0x78, 0x08, 0x1c, 0x49, 0x7a, 0x60, 0x08, 0x4a, 0x02, 0x60, 0x04, + 0x00, 0x00, 0x40, 0x00, 0x59, 0xa8, 0x00, 0x34, 0x82, 0x00, 0x0c, 0x80, + 0x00, 0x00, 0x00, 0x51, 0x04, 0x00, 0x10, 0x02, 0x80, 0x00, 0x01, 0x02, + 0x48, 0x02, 0x62, 0x06, 0x49, 0x7a, 0x62, 0x05, 0x49, 0x7a, 0x60, 0x09, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x07, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x04, 0x41, 0x31, 0x88, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x81, 0x66, 0xc9, 0xc0, + 0x04, 0x00, 0x00, 0x1c, 0x41, 0x62, 0x60, 0x00, 0x41, 0x58, 0x00, 0x00, + 0x59, 0x30, 0x0a, 0x03, 0x82, 0x04, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x83, 0x32, 0x64, 0x00, 0x00, 0x00, 0x00, 0x24, + 0x81, 0x30, 0x0c, 0x80, 0x04, 0x00, 0x17, 0xf9, 0x42, 0x02, 0x60, 0x00, + 0x00, 0x10, 0xd8, 0xd4, 0x04, 0x01, 0xf7, 0xf6, 0x49, 0x33, 0xc8, 0x57, + 0x81, 0x66, 0xc8, 0x40, 0x83, 0x30, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x24, + 0x80, 0x04, 0x04, 0x80, 0x04, 0x02, 0x10, 0x06, 0x40, 0x06, 0xc0, 0x00, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x08, 0x81, 0x32, 0x61, 0xc0, + 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x02, 0xc0, 0x00, 0x00, 0x10, 0xd8, 0xd4, + 0x04, 0x01, 0xf7, 0xfa, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x23, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x49, 0x33, 0xc8, 0x56, + 0x41, 0x7a, 0x60, 0x00, 0x04, 0x01, 0xf7, 0xf5, 0x4c, 0x00, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x13, 0x04, 0x02, 0x00, 0x0b, 0x59, 0x30, 0x00, 0x04, + 0x8c, 0x00, 0x05, 0x3e, 0x04, 0x00, 0x00, 0x07, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x76, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0xc4, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x63, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x59, 0x88, 0x00, 0x53, 0x80, 0x00, 0x00, 0x00, + 0x48, 0x03, 0x10, 0x53, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, + 0x59, 0x30, 0x02, 0x03, 0x82, 0x00, 0x34, 0x80, 0x00, 0x00, 0x00, 0x0e, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x4d, 0x2c, 0x00, 0x00, + 0x0c, 0x01, 0xf8, 0x03, 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x72, 0x29, 0x00, 0x10, 0x77, 0x9c, 0x00, 0x10, 0x78, 0xf0, + 0x00, 0x10, 0x72, 0x29, 0x00, 0x10, 0x79, 0x56, 0x00, 0x10, 0x73, 0x90, + 0x00, 0x10, 0x72, 0x29, 0x00, 0x10, 0x72, 0x29, 0x00, 0x10, 0x77, 0x32, + 0x00, 0x10, 0x72, 0x29, 0x00, 0x10, 0x72, 0x29, 0x00, 0x10, 0x72, 0x29, + 0x00, 0x10, 0x72, 0x29, 0x00, 0x10, 0x72, 0x29, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x49, 0x33, 0xc8, 0x57, 0x59, 0x30, 0x02, 0x03, + 0x82, 0x00, 0x34, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x72, 0x40, + 0x00, 0x10, 0x82, 0x36, 0x00, 0x10, 0x72, 0x40, 0x00, 0x10, 0x72, 0x40, + 0x00, 0x10, 0x72, 0x40, 0x00, 0x10, 0x72, 0x40, 0x00, 0x10, 0x72, 0x40, + 0x00, 0x10, 0x72, 0x40, 0x00, 0x10, 0x81, 0xe0, 0x00, 0x10, 0x82, 0x52, + 0x00, 0x10, 0x82, 0xc1, 0x00, 0x10, 0x82, 0x52, 0x00, 0x10, 0x82, 0xc1, + 0x00, 0x10, 0x72, 0x40, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x49, 0x33, 0xc8, 0x57, + 0x4d, 0x2c, 0x00, 0x00, 0x59, 0x32, 0x58, 0x08, 0x59, 0x30, 0x02, 0x03, + 0x82, 0x00, 0x34, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf8, 0x03, 0x5c, 0x02, 0x58, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x72, 0x5d, 0x00, 0x10, 0x72, 0x5d, + 0x00, 0x10, 0x72, 0x5d, 0x00, 0x10, 0x72, 0x79, 0x00, 0x10, 0x72, 0xc5, + 0x00, 0x10, 0x72, 0x5d, 0x00, 0x10, 0x72, 0x5d, 0x00, 0x10, 0x72, 0x5d, + 0x00, 0x10, 0x72, 0x5f, 0x00, 0x10, 0x72, 0x5d, 0x00, 0x10, 0x72, 0x5d, + 0x00, 0x10, 0x72, 0x5d, 0x00, 0x10, 0x72, 0x5d, 0x00, 0x10, 0x72, 0x5d, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x49, 0x33, 0xc8, 0x57, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x40, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x4a, 0x02, 0x60, 0x07, 0x00, 0x08, 0x20, 0x00, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x03, 0x49, 0x3a, 0x64, 0x03, + 0x4a, 0x02, 0x5c, 0x08, 0x00, 0x00, 0x00, 0x01, 0x59, 0x2c, 0x00, 0x0d, + 0x48, 0x02, 0x60, 0x11, 0x49, 0x7a, 0x60, 0x13, 0x59, 0x2c, 0x02, 0x08, + 0x80, 0x00, 0x00, 0xc2, 0x80, 0x00, 0x10, 0xc4, 0x80, 0x08, 0x14, 0x00, + 0x48, 0x0a, 0x62, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0e, 0x95, + 0x42, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, 0x60, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x63, 0x2f, 0x49, 0x33, 0xc8, 0x57, 0x83, 0x38, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x50, 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x83, 0x38, 0x04, 0x80, 0x00, 0x00, 0x00, 0x49, 0x02, 0x00, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x72, 0x8c, + 0x00, 0x10, 0x72, 0x97, 0x00, 0x10, 0x72, 0x8a, 0x00, 0x10, 0x72, 0x8a, + 0x00, 0x10, 0x72, 0x8a, 0x00, 0x10, 0x72, 0x8a, 0x00, 0x10, 0x72, 0xa2, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x04, 0x4a, 0x02, 0x5c, 0x08, 0x00, 0x00, 0x00, 0x02, + 0x59, 0x2c, 0x02, 0x07, 0x48, 0x02, 0x5c, 0x09, 0x59, 0x2c, 0x02, 0x09, + 0x48, 0x02, 0x5a, 0x07, 0x59, 0x2c, 0x00, 0x0c, 0x48, 0x02, 0x58, 0x0d, + 0x1c, 0x01, 0xf0, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0xa4, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x3d, 0x04, 0x00, 0x00, 0x05, + 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x06, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0xa4, 0x4d, 0x3c, 0x00, 0x00, + 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0xa0, + 0x5c, 0x02, 0x78, 0x00, 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x14, + 0x41, 0x78, 0x28, 0x00, 0x42, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x4d, 0x40, 0x00, 0x00, 0x4d, 0x44, 0x00, 0x00, 0x59, 0x36, 0x8c, 0x03, + 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x90, 0xb2, 0x5c, 0x02, 0x88, 0x00, 0x5c, 0x02, 0x80, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x33, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x3d, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x00, 0x29, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x49, 0x33, 0xc8, 0x57, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x48, 0x04, 0x00, 0x00, 0x05, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x53, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x59, 0x2c, 0x02, 0x06, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x07, 0x04, 0x00, 0x00, 0x09, 0x59, 0x30, 0x00, 0x11, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x06, 0x59, 0x2c, 0x08, 0x0c, + 0x80, 0x04, 0x04, 0x80, 0x48, 0x02, 0x58, 0x0c, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x00, 0x15, 0x59, 0x2c, 0x02, 0x06, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x02, 0x00, 0x03, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x49, 0x33, 0xc8, 0x57, 0x4d, 0x2c, 0x00, 0x00, + 0x4c, 0x50, 0x00, 0x00, 0x4c, 0x54, 0x00, 0x00, 0x4c, 0x58, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x1a, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x49, 0x7a, 0x5a, 0x06, 0x59, 0xa8, 0x00, 0x6b, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x48, 0x02, 0x5c, 0x07, + 0x59, 0xa8, 0x08, 0x15, 0x82, 0x04, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x18, + 0x48, 0x06, 0x5a, 0x07, 0x41, 0x2c, 0x78, 0x00, 0x4d, 0x2c, 0x00, 0x00, + 0x41, 0xcc, 0xa0, 0x00, 0x42, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x82, 0x04, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x2d, 0x04, 0x02, 0x10, 0x06, 0x83, 0x2c, 0xac, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x83, 0x93, + 0x04, 0x01, 0xf0, 0x2e, 0x40, 0x04, 0x30, 0x00, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x2c, 0x83, 0x2c, 0xac, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x83, 0x93, 0x82, 0x18, 0x34, 0x80, + 0x00, 0x00, 0x00, 0x2c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x1a, + 0x04, 0x00, 0x00, 0x1a, 0x80, 0x14, 0x28, 0x00, 0x4a, 0x02, 0x58, 0x04, + 0x00, 0x00, 0x01, 0x10, 0x49, 0x2c, 0x78, 0x01, 0x82, 0x18, 0x0c, 0x80, + 0x00, 0x00, 0x00, 0x3d, 0x04, 0x02, 0x10, 0x07, 0x40, 0x18, 0x08, 0x00, + 0x83, 0x2c, 0xac, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x83, 0x93, 0x04, 0x01, 0xf0, 0x15, 0x82, 0x08, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x3c, 0x82, 0x18, 0x34, 0x80, 0x00, 0x00, 0x00, 0x3c, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x41, 0x2c, 0x78, 0x00, + 0x83, 0x2c, 0xac, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x83, 0x93, 0x04, 0x01, 0xf7, 0xe5, 0x5c, 0x02, 0x58, 0x00, + 0x59, 0x2c, 0x02, 0x06, 0x84, 0x00, 0x05, 0x5e, 0x48, 0x02, 0x5a, 0x06, + 0x59, 0x2c, 0x04, 0x07, 0x80, 0x08, 0x05, 0x40, 0x48, 0x02, 0x5c, 0x07, + 0x04, 0x01, 0xf0, 0x02, 0x5c, 0x02, 0x58, 0x00, 0x81, 0x36, 0x69, 0xc0, + 0x04, 0x00, 0x00, 0x03, 0x59, 0x34, 0x34, 0x03, 0x04, 0x01, 0xf0, 0x03, + 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0xff, 0xff, 0x49, 0x32, 0x58, 0x08, + 0x48, 0x1a, 0x5c, 0x06, 0x82, 0x10, 0x05, 0x80, 0x00, 0x00, 0x00, 0x54, + 0x04, 0x02, 0x00, 0x02, 0x49, 0x1e, 0x58, 0x13, 0x84, 0x14, 0x01, 0xc0, + 0x80, 0x10, 0x05, 0x40, 0x48, 0x02, 0x58, 0x04, 0x59, 0x2c, 0x00, 0x01, + 0x49, 0x7a, 0x58, 0x01, 0x4c, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x5c, 0x02, 0x58, 0x00, 0x81, 0x2e, 0x59, 0xc0, + 0x04, 0x02, 0x07, 0xf9, 0x5c, 0x00, 0xb0, 0x00, 0x5c, 0x00, 0xa8, 0x00, + 0x5c, 0x00, 0xa0, 0x00, 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x4c, 0x5c, 0x00, 0x00, 0x4d, 0x2c, 0x00, 0x00, + 0x4c, 0x50, 0x00, 0x00, 0x4c, 0x54, 0x00, 0x00, 0x4c, 0x58, 0x00, 0x00, + 0x41, 0x2c, 0xb8, 0x00, 0x59, 0x2c, 0x04, 0x0b, 0x8c, 0x00, 0x05, 0x16, + 0x04, 0x00, 0x00, 0x03, 0x41, 0xcc, 0xa0, 0x00, 0x04, 0x01, 0xf0, 0x03, + 0x83, 0xcc, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0x08, 0xb0, 0x00, + 0x41, 0x78, 0x10, 0x00, 0x82, 0x58, 0x04, 0x80, 0x00, 0x00, 0x00, 0x48, + 0x04, 0x00, 0x10, 0x04, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x40, 0x00, 0x10, 0x00, 0x4c, 0x08, 0x00, 0x00, 0x4d, 0x2c, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x1a, 0x04, 0x00, 0x00, 0x26, + 0x5c, 0x00, 0x18, 0x00, 0x49, 0x2c, 0x18, 0x01, 0x48, 0x5a, 0x58, 0x00, + 0x82, 0x58, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x58, 0xb1, 0x04, + 0x83, 0x2c, 0xac, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x41, 0x58, 0x5c, 0x04, 0x0b, 0x8c, 0x00, 0x05, 0x00, + 0x04, 0x00, 0x00, 0x0e, 0x83, 0x2c, 0x14, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x8c, 0x00, 0x05, 0x16, 0x04, 0x00, 0x00, 0x03, 0x82, 0x08, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x46, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x80, 0x08, 0x10, 0x00, 0x46, 0x00, 0x10, 0x00, 0x00, 0x00, 0x09, 0x00, + 0x84, 0x00, 0x05, 0x00, 0x48, 0x00, 0xbc, 0x0b, 0x5c, 0x00, 0x10, 0x00, + 0x80, 0x08, 0x11, 0xc0, 0x04, 0x02, 0x07, 0xd7, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x5c, 0x00, 0xb0, 0x00, 0x5c, 0x00, 0xa8, 0x00, + 0x5c, 0x00, 0xa0, 0x00, 0x5c, 0x02, 0x58, 0x00, 0x5c, 0x00, 0xb8, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x5c, 0x02, 0x58, 0x00, 0x5c, 0x00, 0x10, 0x00, + 0x04, 0x01, 0xf7, 0xf8, 0x49, 0x33, 0xc8, 0x57, 0x83, 0x38, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x15, 0x04, 0x02, 0x00, 0x03, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x83, 0x38, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x16, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x49, 0x33, 0xc8, 0x57, 0x4d, 0x2c, 0x00, 0x00, + 0x4c, 0x50, 0x00, 0x00, 0x4c, 0x54, 0x00, 0x00, 0x4c, 0x58, 0x00, 0x00, + 0x59, 0x32, 0x58, 0x08, 0x83, 0xcc, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x59, 0xcc, 0x18, 0x06, 0x82, 0x0c, 0x05, 0x80, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x04, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x01, 0xf0, 0x0f, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x83, 0x2c, 0xac, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x30, 0x8c, 0x0c, 0x1d, 0x00, 0x04, 0x00, 0x00, 0x0b, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x59, 0x2e, 0x58, 0x01, + 0x81, 0x2e, 0x59, 0xc0, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x83, 0x2c, 0xac, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x30, 0x04, 0x01, 0xf8, 0x16, 0x5c, 0x00, 0xb0, 0x00, + 0x5c, 0x00, 0xa8, 0x00, 0x5c, 0x00, 0xa0, 0x00, 0x5c, 0x02, 0x58, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x4c, 0x50, 0x00, 0x00, + 0x4c, 0x54, 0x00, 0x00, 0x4c, 0x58, 0x00, 0x00, 0x83, 0xcc, 0xa4, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x59, 0x30, 0xa8, 0x08, 0x82, 0x54, 0xac, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, 0x5c, 0x00, 0xb0, 0x00, + 0x5c, 0x00, 0xa8, 0x00, 0x5c, 0x00, 0xa0, 0x00, 0x49, 0x33, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x3d, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x4d, 0x2c, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8d, 0xe6, 0x04, 0x02, 0x00, 0x0b, 0x41, 0x78, 0x08, 0x00, + 0x4d, 0x40, 0x00, 0x00, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8c, 0x81, 0x5c, 0x02, 0x80, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x59, 0x31, 0xd8, 0x21, 0x58, 0xef, 0x40, 0x0b, 0x58, 0xee, 0x58, 0x0d, + 0x4a, 0x02, 0x5a, 0x04, 0x00, 0x00, 0x01, 0x03, 0x58, 0xec, 0x00, 0x09, + 0x08, 0x01, 0xf8, 0x00, 0x5c, 0x02, 0x58, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x49, 0x33, 0xc8, 0x57, 0x59, 0xcc, 0x18, 0x06, + 0x82, 0x0c, 0x05, 0x80, 0x02, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x14, + 0x4a, 0x02, 0x68, 0x02, 0x00, 0xff, 0xff, 0xfd, 0x59, 0x34, 0x00, 0x0a, + 0x84, 0x00, 0x05, 0x04, 0x48, 0x02, 0x68, 0x0a, 0x59, 0x30, 0x08, 0x08, + 0x80, 0x04, 0x09, 0xc0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x4a, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x01, 0x03, 0x48, 0x0c, 0x08, 0x05, + 0x59, 0x31, 0xd8, 0x21, 0x58, 0xef, 0x40, 0x0b, 0x58, 0xee, 0x58, 0x0d, + 0x58, 0xec, 0x00, 0x09, 0x08, 0x01, 0xf8, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x3b, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x4c, 0x0c, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x04, 0x5c, 0x00, 0x18, 0x00, 0x04, 0x02, 0x07, 0xeb, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x4d, 0x2c, 0x00, 0x00, + 0x59, 0x32, 0x58, 0x08, 0x81, 0x2e, 0x59, 0xc0, 0x04, 0x02, 0x00, 0x09, + 0x49, 0x7a, 0x62, 0x06, 0x49, 0x7a, 0x62, 0x05, 0x4d, 0x38, 0x00, 0x00, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x22, 0x04, 0x01, 0xfb, 0x7b, + 0x5c, 0x02, 0x70, 0x00, 0x80, 0x00, 0x05, 0x80, 0x5c, 0x02, 0x58, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x4d, 0x2c, 0x00, 0x00, + 0x4c, 0x50, 0x00, 0x00, 0x4c, 0x54, 0x00, 0x00, 0x4c, 0x58, 0x00, 0x00, + 0x59, 0x32, 0x58, 0x08, 0x59, 0x2e, 0x58, 0x01, 0x83, 0x2c, 0xac, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x83, 0xcc, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x59, 0xa8, 0x08, 0x6b, 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x03, 0xff, + 0x82, 0x04, 0x14, 0x80, 0x00, 0x00, 0x00, 0x0f, 0x04, 0x00, 0x10, 0x1b, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x30, 0x59, 0x2e, 0x58, 0x01, 0x83, 0x2c, 0xac, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x82, 0x08, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x0f, + 0x04, 0x00, 0x10, 0x0d, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, 0x59, 0x2e, 0x58, 0x01, + 0x83, 0x2c, 0xac, 0x00, 0x00, 0x00, 0x00, 0x05, 0x82, 0x04, 0x14, 0x80, + 0x00, 0x00, 0x00, 0x0f, 0x04, 0x00, 0x10, 0x07, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x40, 0x08, 0xb0, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x30, 0x04, 0x01, 0xf0, 0x04, 0x40, 0x04, 0xb0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, 0x59, 0x31, 0xd8, 0x21, + 0x58, 0xef, 0x40, 0x0b, 0x58, 0xee, 0x58, 0x0d, 0x4a, 0x02, 0x5a, 0x04, + 0x00, 0x00, 0x01, 0x03, 0x59, 0x2e, 0x58, 0x01, 0x58, 0xec, 0x00, 0x09, + 0x08, 0x01, 0xf8, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x5c, 0x00, 0xb0, 0x00, 0x5c, 0x00, 0xa8, 0x00, 0x5c, 0x00, 0xa0, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, + 0x4d, 0x2c, 0x00, 0x00, 0x4c, 0x50, 0x00, 0x00, 0x4c, 0x54, 0x00, 0x00, + 0x4c, 0x58, 0x00, 0x00, 0x59, 0xcc, 0x00, 0x06, 0x82, 0x00, 0x0d, 0x80, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x2c, 0x59, 0xcc, 0x00, 0x07, + 0x90, 0x00, 0xb1, 0xc0, 0x82, 0x58, 0xb5, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x80, 0x58, 0xb1, 0x04, 0x82, 0x58, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x82, 0x58, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x07, 0x04, 0x00, 0x10, 0x03, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x06, 0x83, 0xcc, 0xa4, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x59, 0x30, 0x10, 0x08, 0x80, 0x08, 0x11, 0xc0, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x82, 0x08, 0xac, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, + 0x82, 0x00, 0x0d, 0x00, 0xff, 0x00, 0x00, 0x00, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x00, 0x00, 0x19, 0x82, 0x00, 0xb5, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x80, 0x58, 0xb1, 0x04, 0x82, 0x58, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x0e, + 0x04, 0x00, 0x10, 0x03, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x0d, + 0x58, 0x08, 0x10, 0x01, 0x80, 0x08, 0x11, 0xc0, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x82, 0x08, 0xac, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, 0x04, 0x01, 0xf0, 0x08, + 0x59, 0x30, 0x10, 0x08, 0x80, 0x08, 0x11, 0xc0, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x48, 0x00, 0x10, 0x05, 0x59, 0xcc, 0x00, 0x07, + 0x48, 0x00, 0x10, 0x06, 0x04, 0x01, 0xff, 0x3b, 0x5c, 0x00, 0xb0, 0x00, + 0x5c, 0x00, 0xa8, 0x00, 0x5c, 0x00, 0xa0, 0x00, 0x5c, 0x02, 0x58, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x59, 0xcc, 0x00, 0x06, 0x82, 0x00, 0x05, 0x80, + 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x4d, 0x2c, 0x00, 0x00, 0x59, 0x32, 0x58, 0x08, + 0x81, 0x2e, 0x59, 0xc0, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x48, 0x06, 0x5a, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x5c, 0x02, 0x58, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x49, 0x33, 0xc8, 0x57, 0x4d, 0x2c, 0x00, 0x00, 0x4c, 0x50, 0x00, 0x00, + 0x4c, 0x54, 0x00, 0x00, 0x4c, 0x58, 0x00, 0x00, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x59, 0xcc, 0x08, 0x06, 0x82, 0x04, 0x05, 0x80, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x82, 0x04, 0xb5, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x80, 0x58, 0xb1, 0x04, 0x83, 0xcc, 0xa4, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x59, 0x30, 0x00, 0x08, 0x82, 0x00, 0xac, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, + 0x04, 0x01, 0xff, 0x0c, 0x5c, 0x00, 0xb0, 0x00, 0x5c, 0x00, 0xa8, 0x00, + 0x5c, 0x00, 0xa0, 0x00, 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x48, 0x03, 0xc8, 0x57, 0x48, 0x07, 0xc8, 0x57, + 0x48, 0x0b, 0xc8, 0x57, 0x48, 0x0f, 0xc8, 0x57, 0x48, 0x13, 0xc8, 0x57, + 0x48, 0x1b, 0xc8, 0x57, 0x49, 0x2f, 0xc8, 0x57, 0x4d, 0x2c, 0x00, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x04, + 0x5c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x48, 0x02, 0x58, 0x03, + 0x5c, 0x00, 0x00, 0x00, 0x48, 0x02, 0x58, 0x0a, 0x4c, 0x00, 0x00, 0x00, + 0x48, 0x1a, 0x58, 0x01, 0x48, 0x12, 0x58, 0x09, 0x48, 0x06, 0x58, 0x05, + 0x48, 0x0a, 0x58, 0x07, 0x48, 0x0e, 0x58, 0x08, 0x41, 0x2c, 0x10, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x9e, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x49, 0x37, 0xc8, 0x57, 0x4d, 0x1c, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5a, 0xe9, 0x04, 0x02, 0x00, 0x25, + 0x59, 0xcc, 0x00, 0x01, 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x59, 0x34, 0x10, 0x02, 0x82, 0x08, 0x15, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x80, 0x08, 0x05, 0x80, 0x04, 0x02, 0x00, 0x1d, 0x49, 0x7a, 0x62, 0x05, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x35, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8b, 0xff, 0x04, 0x02, 0x00, 0x12, 0x59, 0x1c, 0x00, 0x1c, + 0x80, 0x00, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x0f, 0x49, 0x7a, 0x38, 0x1c, + 0x59, 0x1c, 0x04, 0x14, 0x8c, 0x00, 0x05, 0x02, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x84, 0x00, 0x05, 0x02, 0x48, 0x02, 0x3c, 0x14, + 0x59, 0x1c, 0x14, 0x06, 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x00, 0x06, 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0x00, 0x06, + 0x04, 0x00, 0x00, 0x05, 0x04, 0x01, 0xfc, 0x8c, 0x04, 0x01, 0xf0, 0x04, + 0x04, 0x01, 0xf8, 0x05, 0x04, 0x01, 0xf0, 0x02, 0x04, 0x01, 0xf8, 0xc0, + 0x5c, 0x02, 0x38, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0x2c, 0x00, 0x00, + 0x59, 0x1e, 0x58, 0x08, 0x49, 0x33, 0xc8, 0x57, 0x49, 0x1f, 0xc8, 0x57, + 0x49, 0x3b, 0xc8, 0x57, 0x49, 0x2f, 0xc8, 0x57, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x15, 0x04, 0x00, 0x00, 0xb3, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x16, 0x04, 0x02, 0x00, 0xae, 0x4d, 0x30, 0x00, 0x00, + 0x41, 0x1e, 0x60, 0x00, 0x59, 0xcc, 0x02, 0x07, 0x48, 0x03, 0xc8, 0x57, + 0x82, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xff, 0x00, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, 0x00, 0x04, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x03, 0x00, 0x04, 0x02, 0x00, 0x5b, 0x59, 0x1c, 0x02, 0x03, + 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0d, + 0x04, 0x00, 0x00, 0x3f, 0x81, 0x2e, 0x59, 0xc0, 0x04, 0x00, 0x00, 0x9a, + 0x59, 0x1c, 0x02, 0x02, 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0xff, 0xff, 0x04, 0x02, 0x00, 0x7e, 0x59, 0x2c, 0x02, 0x0a, + 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, 0x04, 0x02, 0x00, 0x07, + 0x59, 0x2c, 0x08, 0x0f, 0x59, 0x1c, 0x00, 0x11, 0x48, 0x03, 0xc8, 0x57, + 0x48, 0x07, 0xc8, 0x57, 0x80, 0x04, 0x05, 0x80, 0x04, 0x02, 0x00, 0x71, + 0x59, 0x1c, 0x04, 0x14, 0x48, 0x03, 0xc8, 0x57, 0x8c, 0x00, 0x05, 0x00, + 0x04, 0x02, 0x00, 0x6d, 0x41, 0x78, 0x08, 0x00, 0x59, 0x1c, 0x12, 0x06, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x62, 0xb7, 0x59, 0x2c, 0x04, 0x06, 0x48, 0x03, 0xc8, 0x57, + 0x80, 0x00, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x0c, 0x80, 0x08, 0x0c, 0x80, + 0x04, 0x00, 0x10, 0x04, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x80, 0x00, 0x10, 0x40, 0x48, 0x0a, 0x5c, 0x06, 0x80, 0x08, 0x11, 0xc0, + 0x04, 0x02, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x85, 0x89, + 0x04, 0x01, 0xf0, 0x6b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x89, 0x42, + 0x59, 0x1c, 0x08, 0x17, 0x59, 0x1c, 0x00, 0x18, 0x48, 0x06, 0x58, 0x08, + 0x48, 0x02, 0x58, 0x09, 0x59, 0x30, 0x00, 0x07, 0x8c, 0x00, 0x05, 0x00, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x0d, 0xdd, 0x49, 0x7a, 0x38, 0x08, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x01, 0xe0, 0x04, 0x02, 0x00, 0x4a, + 0x41, 0x1e, 0x60, 0x00, 0x04, 0x01, 0xfc, 0x2c, 0x04, 0x01, 0xf0, 0x5a, + 0x04, 0x01, 0xfc, 0x63, 0x04, 0x00, 0x00, 0x13, 0x49, 0x36, 0x60, 0x09, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x03, 0x49, 0x2e, 0x60, 0x08, + 0x59, 0x1c, 0x08, 0x17, 0x59, 0x1c, 0x10, 0x18, 0x48, 0x06, 0x60, 0x17, + 0x48, 0x0a, 0x60, 0x18, 0x4d, 0x38, 0x00, 0x00, 0x59, 0x1e, 0x74, 0x03, + 0x4d, 0x30, 0x00, 0x00, 0x41, 0x1e, 0x60, 0x00, 0x04, 0x01, 0xfc, 0x1c, + 0x5c, 0x02, 0x60, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, + 0x5c, 0x02, 0x70, 0x00, 0x04, 0x01, 0xf0, 0x46, 0x59, 0xa8, 0x00, 0x36, + 0x48, 0x02, 0x3a, 0x05, 0x04, 0x01, 0xf0, 0x43, 0x59, 0xcc, 0x04, 0x07, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0b, 0x04, 0x02, 0x00, 0x25, + 0x59, 0x34, 0x0a, 0x00, 0x84, 0x04, 0x0d, 0x0e, 0x48, 0x06, 0x6a, 0x00, + 0x59, 0x2c, 0x0a, 0x04, 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x82, 0x04, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x14, 0x04, 0x00, 0x00, 0x03, + 0x4a, 0x02, 0x62, 0x1d, 0x00, 0x00, 0x00, 0x03, 0x59, 0x30, 0x00, 0x07, + 0x8c, 0x00, 0x05, 0x00, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x0d, 0xdd, + 0x4d, 0x40, 0x00, 0x00, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x59, 0x2c, 0x0a, 0x08, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4a, 0x8e, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x5c, 0x02, 0x80, 0x00, + 0x49, 0x7a, 0x60, 0x08, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x85, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x09, 0x4a, 0x02, 0x64, 0x06, + 0x00, 0x00, 0x00, 0x02, 0x42, 0x00, 0x08, 0x00, 0x80, 0x00, 0x40, 0x4b, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x5c, 0x04, 0x01, 0xf0, 0x1b, + 0x59, 0xcc, 0x02, 0x07, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x2a, 0x00, + 0x04, 0x02, 0x00, 0x04, 0x59, 0xa8, 0x00, 0x36, 0x48, 0x02, 0x3a, 0x05, + 0x04, 0x01, 0xf0, 0x14, 0x81, 0x2e, 0x59, 0xc0, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x4a, 0x02, 0x5a, 0x04, 0x00, 0x00, 0x01, 0x03, + 0x59, 0x1c, 0x00, 0x07, 0x8c, 0x00, 0x05, 0x00, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x0d, 0xdd, 0x59, 0x1c, 0x04, 0x02, 0x48, 0x02, 0x5c, 0x06, + 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x71, 0x9c, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x46, 0xdb, 0x5c, 0x02, 0x60, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x04, 0x01, 0xf0, 0x02, + 0x5c, 0x02, 0x60, 0x00, 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x04, 0x01, 0xf8, 0x19, 0x04, 0x01, 0xf7, 0xfd, 0x49, 0x33, 0xc8, 0x57, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x15, 0x04, 0x02, 0x00, 0x04, + 0x59, 0xa8, 0x00, 0x36, 0x48, 0x02, 0x3a, 0x05, 0x04, 0x01, 0xf0, 0x0d, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x16, 0x04, 0x02, 0x00, 0x0d, + 0x4d, 0x30, 0x00, 0x00, 0x41, 0x1e, 0x60, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x9d, 0xc7, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x38, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x5c, 0x02, 0x60, 0x00, + 0x49, 0x7a, 0x38, 0x1c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x1c, 0x04, 0x14, 0x84, 0x00, 0x05, 0x40, + 0x48, 0x02, 0x3c, 0x14, 0x59, 0xcc, 0x10, 0x0b, 0x49, 0x33, 0xc8, 0x57, + 0x49, 0x1f, 0xc8, 0x57, 0x49, 0x2f, 0xc8, 0x57, 0x48, 0x03, 0xc8, 0x57, + 0x48, 0x0b, 0xc8, 0x57, 0x8c, 0x08, 0x15, 0x3c, 0x04, 0x00, 0x00, 0x06, + 0x59, 0xa8, 0x00, 0x36, 0x48, 0x02, 0x3a, 0x05, 0x49, 0x7a, 0x38, 0x1c, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x4d, 0x30, 0x00, 0x00, + 0x41, 0x1e, 0x60, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x83, 0xd4, + 0x5c, 0x02, 0x60, 0x00, 0x59, 0x1c, 0x04, 0x06, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x59, 0x1c, 0x04, 0x03, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x50, + 0x04, 0x02, 0x00, 0x0d, 0x4d, 0x30, 0x00, 0x00, 0x41, 0x1e, 0x60, 0x00, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x08, 0x00, + 0x80, 0x00, 0x00, 0x43, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x5c, + 0x5c, 0x02, 0x60, 0x00, 0x49, 0x7a, 0x38, 0x1c, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x59, 0x1c, 0x02, 0x03, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x0d, 0x04, 0x00, 0x00, 0x14, 0x81, 0x2e, 0x59, 0xc0, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0x1c, 0x02, 0x03, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x04, 0x04, 0x02, 0x00, 0x11, + 0x59, 0x2c, 0x02, 0x0a, 0x8c, 0x00, 0x05, 0x02, 0x04, 0x00, 0x00, 0x0e, + 0x4a, 0x02, 0x38, 0x12, 0x0f, 0xff, 0xff, 0xff, 0x59, 0x2c, 0x02, 0x08, + 0x84, 0x00, 0x05, 0x1e, 0x48, 0x02, 0x5a, 0x08, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x48, 0x02, 0x3a, 0x14, 0x04, 0x01, 0xf0, 0x21, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x48, 0x02, 0x3a, 0x14, + 0x04, 0x01, 0xf0, 0x1d, 0x59, 0x2c, 0x02, 0x0a, 0x48, 0x03, 0xc8, 0x57, + 0x8c, 0x00, 0x05, 0x00, 0x04, 0x02, 0x00, 0x0b, 0x8c, 0x00, 0x05, 0x02, + 0x04, 0x00, 0x07, 0xf7, 0x59, 0x1c, 0x04, 0x14, 0x8c, 0x00, 0x05, 0x1c, + 0x04, 0x02, 0x07, 0xeb, 0x59, 0x1c, 0x00, 0x11, 0x48, 0x03, 0xc8, 0x57, + 0x80, 0x00, 0x01, 0xc0, 0x04, 0x00, 0x07, 0xf0, 0x04, 0x01, 0xf7, 0xe6, + 0x8c, 0x08, 0x15, 0x3a, 0x04, 0x02, 0x07, 0xed, 0x59, 0xcc, 0x00, 0x0a, + 0x59, 0x2c, 0x18, 0x0f, 0x48, 0x03, 0xc8, 0x57, 0x48, 0x0f, 0xc8, 0x57, + 0x80, 0x0c, 0x05, 0x80, 0x04, 0x00, 0x07, 0xe7, 0x59, 0xcc, 0x00, 0x0a, + 0x48, 0x03, 0xc8, 0x57, 0x48, 0x02, 0x38, 0x16, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x48, 0x02, 0x3a, 0x14, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x8a, 0x82, 0x49, 0x33, 0xc8, 0x57, 0x4d, 0x1c, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5a, 0xe9, 0x04, 0x02, 0x00, 0x4a, + 0x59, 0xcc, 0x00, 0x01, 0x59, 0x34, 0x10, 0x02, 0x80, 0x08, 0x05, 0x80, + 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, 0x04, 0x02, 0x00, 0x41, + 0x59, 0x30, 0x14, 0x19, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8c, 0x55, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0x1c, 0x14, 0x06, + 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0x00, 0x07, 0x04, 0x00, 0x00, 0x38, + 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x35, + 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x32, + 0x59, 0x1c, 0x02, 0x02, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x04, 0x59, 0x30, 0x1a, 0x19, 0x80, 0x0c, 0x05, 0x80, + 0x04, 0x02, 0x00, 0x2b, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x15, + 0x04, 0x00, 0x00, 0x26, 0x4d, 0x30, 0x00, 0x00, 0x4d, 0x2c, 0x00, 0x00, + 0x41, 0x1e, 0x60, 0x00, 0x59, 0x32, 0x58, 0x08, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x88, 0x3d, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x59, 0x2c, 0x02, 0x04, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x14, 0x04, 0x00, 0x00, 0x03, + 0x4a, 0x02, 0x62, 0x1d, 0x00, 0x00, 0x00, 0x03, 0x42, 0x02, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x59, 0x2c, 0x0a, 0x08, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4a, 0x8e, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x5c, 0x02, 0x58, 0x00, 0x49, 0x7a, 0x60, 0x08, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x85, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x09, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x02, 0x42, 0x00, 0x08, 0x00, + 0x80, 0x00, 0x40, 0x4b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x5c, + 0x5c, 0x02, 0x60, 0x00, 0x04, 0x01, 0xf0, 0x03, 0x59, 0xa8, 0x00, 0x36, + 0x48, 0x02, 0x3a, 0x05, 0x49, 0x7a, 0x38, 0x1c, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x5c, 0x02, 0x38, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x4c, 0x58, 0x00, 0x00, 0x4d, 0x2c, 0x00, 0x00, + 0x59, 0x32, 0x58, 0x08, 0x83, 0x38, 0x35, 0x80, 0x00, 0x00, 0x00, 0x15, + 0x04, 0x00, 0x00, 0x10, 0x59, 0x34, 0x22, 0x00, 0x84, 0x10, 0x25, 0x02, + 0x48, 0x12, 0x6a, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x3d, + 0x04, 0x00, 0x00, 0x65, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8d, 0xe6, + 0x04, 0x02, 0x00, 0x05, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8d, 0xc3, 0x04, 0x01, 0xfa, 0x10, + 0x04, 0x01, 0xf0, 0x78, 0x83, 0xcc, 0x14, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x83, 0x34, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x7d, 0x41, + 0x04, 0x02, 0x00, 0x15, 0x83, 0xcc, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0a, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x83, 0x34, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x7d, 0x41, + 0x04, 0x02, 0x00, 0x0c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1c, 0x36, + 0x59, 0x34, 0x22, 0x00, 0x59, 0xcc, 0x10, 0x07, 0x80, 0x08, 0x11, 0xc0, + 0x04, 0x00, 0x00, 0x03, 0x48, 0x0a, 0x68, 0x01, 0x84, 0x10, 0x25, 0x42, + 0x84, 0x10, 0x25, 0x1a, 0x48, 0x12, 0x6a, 0x00, 0x04, 0x01, 0xf0, 0x5e, + 0x4d, 0x3c, 0x00, 0x00, 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xca, 0xa0, 0x5c, 0x02, 0x78, 0x00, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x33, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x59, 0x34, 0x02, 0x00, 0x84, 0x00, 0x05, 0x58, 0x48, 0x02, 0x6a, 0x00, + 0x4d, 0x30, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x49, 0x36, 0x60, 0x09, + 0x49, 0x7a, 0x60, 0x08, 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x01, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa1, 0x37, + 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x00, 0x00, 0x11, 0x41, 0x78, 0x28, 0x00, + 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x4d, 0x40, 0x00, 0x00, + 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x9c, 0x14, 0x5c, 0x02, 0x80, 0x00, 0x4a, 0x02, 0x64, 0x06, + 0x00, 0x00, 0x00, 0x04, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x07, + 0x4a, 0x02, 0x64, 0x20, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x09, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x0b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0x39, 0x5c, 0x02, 0x60, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x3d, 0x04, 0x00, 0x00, 0x22, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8d, 0xe6, 0x04, 0x02, 0x00, 0x22, + 0x04, 0x01, 0xf9, 0xb5, 0x04, 0x01, 0xf0, 0x1d, 0x4d, 0x3c, 0x00, 0x00, + 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0xa0, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x33, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x59, 0x34, 0x02, 0x00, 0x84, 0x00, 0x05, 0x58, + 0x48, 0x02, 0x6a, 0x00, 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x41, 0x78, 0x28, 0x00, 0x42, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x4d, 0x40, 0x00, 0x00, 0x4d, 0x44, 0x00, 0x00, 0x59, 0x36, 0x8c, 0x03, + 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x90, 0xb2, 0x5c, 0x02, 0x88, 0x00, 0x5c, 0x02, 0x80, 0x00, + 0x5c, 0x02, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1c, 0x36, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x04, 0x01, 0xf0, 0x02, + 0x04, 0x01, 0xfc, 0xa5, 0x5c, 0x02, 0x58, 0x00, 0x5c, 0x00, 0xb0, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x41, 0x38, 0x00, 0x00, + 0x83, 0x38, 0x34, 0x80, 0x00, 0x00, 0x00, 0x56, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x77, 0x96, + 0x00, 0x10, 0x77, 0x91, 0x00, 0x10, 0x77, 0x96, 0x00, 0x10, 0x77, 0x96, + 0x00, 0x10, 0x77, 0x96, 0x00, 0x10, 0x77, 0x96, 0x00, 0x10, 0x77, 0x8f, + 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, + 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, + 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, + 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, + 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, + 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, + 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, + 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, + 0x00, 0x10, 0x77, 0x96, 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x96, + 0x00, 0x10, 0x77, 0x96, 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, + 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, + 0x00, 0x10, 0x77, 0x96, 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, + 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, + 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, + 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x96, 0x00, 0x10, 0x77, 0x96, + 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, + 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, + 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, + 0x00, 0x10, 0x77, 0x96, 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, + 0x00, 0x10, 0x77, 0x96, 0x00, 0x10, 0x77, 0x96, 0x00, 0x10, 0x77, 0x8f, + 0x00, 0x10, 0x77, 0x96, 0x00, 0x10, 0x77, 0x96, 0x00, 0x10, 0x77, 0x8f, + 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, + 0x00, 0x10, 0x77, 0x96, 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, + 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x96, 0x00, 0x10, 0x77, 0x8f, + 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x96, + 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, 0x00, 0x10, 0x77, 0x8f, + 0x00, 0x10, 0x77, 0x96, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, 0x49, 0x3a, 0x64, 0x03, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x63, 0x39, 0x49, 0x33, 0xc8, 0x57, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, 0x49, 0x3a, 0x64, 0x03, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x63, 0x39, 0x59, 0x30, 0x04, 0x03, + 0x82, 0x00, 0x34, 0x80, 0x00, 0x00, 0x00, 0x56, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x83, 0x38, 0x35, 0x80, 0x00, 0x00, 0x00, 0x13, + 0x04, 0x00, 0x00, 0x96, 0x83, 0x38, 0x35, 0x80, 0x00, 0x00, 0x00, 0x27, + 0x04, 0x02, 0x00, 0x4c, 0x49, 0x33, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x63, 0xc4, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x89, 0x4c, + 0x04, 0x00, 0x00, 0x0b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x89, 0x69, + 0x04, 0x00, 0x00, 0x41, 0x59, 0x30, 0x04, 0x03, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x22, 0x04, 0x02, 0x00, 0x38, 0x04, 0x01, 0xfc, 0x5d, + 0x04, 0x00, 0x00, 0x3a, 0x04, 0x01, 0xf0, 0x3a, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x1c, 0x36, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, 0x04, 0x01, 0xf9, 0x05, + 0x4d, 0x44, 0x00, 0x00, 0x59, 0x36, 0x8c, 0x03, 0x83, 0x44, 0x05, 0x80, + 0x00, 0x00, 0x07, 0xfe, 0x04, 0x02, 0x00, 0x08, 0x59, 0xa8, 0x10, 0x23, + 0x84, 0x08, 0x15, 0x40, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, + 0x04, 0x02, 0x00, 0x02, 0x84, 0x08, 0x15, 0x4a, 0x48, 0x0b, 0x50, 0x23, + 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, 0x4d, 0x3c, 0x00, 0x00, + 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0xa0, + 0x5c, 0x02, 0x78, 0x00, 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x00, 0x0c, 0x59, 0x32, 0x68, 0x09, 0x59, 0x34, 0x00, 0x08, + 0x80, 0x00, 0x01, 0xc0, 0x04, 0x02, 0x00, 0x08, 0x59, 0x36, 0x8c, 0x03, + 0x49, 0x33, 0xc8, 0x57, 0x49, 0x37, 0xc8, 0x57, 0x49, 0x47, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x43, 0x0f, 0x04, 0x01, 0xf0, 0x0c, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x33, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x15, + 0x41, 0x78, 0x28, 0x00, 0x42, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x90, 0xb2, 0x5c, 0x02, 0x88, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8b, 0x64, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x1c, 0x01, 0xf0, 0x00, 0x04, 0x01, 0xf8, 0xd2, + 0x04, 0x01, 0xf7, 0xfa, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x14, + 0x04, 0x00, 0x00, 0x0c, 0x49, 0x33, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x67, 0xa7, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x72, 0x0c, + 0x59, 0x30, 0x02, 0x03, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x00, 0x00, 0xf3, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x49, 0x33, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0xc4, + 0x4d, 0x3c, 0x00, 0x00, 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xca, 0xa0, 0x5c, 0x02, 0x78, 0x00, 0x42, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x16, 0x41, 0x78, 0x28, 0x00, 0x4d, 0x40, 0x00, 0x00, + 0x4d, 0x44, 0x00, 0x00, 0x59, 0x36, 0x8c, 0x03, 0x42, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x90, 0xb2, 0x5c, 0x02, 0x88, 0x00, + 0x5c, 0x02, 0x80, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x33, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x89, 0x4c, 0x04, 0x02, 0x00, 0x0c, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x1c, 0x36, 0x04, 0x01, 0xf8, 0xa3, 0x59, 0x34, 0x0c, 0x03, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x07, 0xfe, 0x04, 0x02, 0x07, 0xc8, + 0x59, 0xa8, 0x08, 0x23, 0x84, 0x04, 0x0d, 0x40, 0x48, 0x07, 0x50, 0x23, + 0x04, 0x01, 0xf7, 0xc4, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x89, 0x69, + 0x04, 0x02, 0x00, 0x03, 0x04, 0x01, 0xf8, 0x97, 0x04, 0x01, 0xf7, 0xbf, + 0x59, 0x30, 0x04, 0x03, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x32, + 0x04, 0x02, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x04, 0x01, 0xf7, 0xb8, 0x59, 0x30, 0x04, 0x03, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x22, 0x04, 0x00, 0x08, 0x8b, 0x04, 0x01, 0xf7, 0xb3, + 0x49, 0x33, 0xc8, 0x57, 0x48, 0x03, 0xc8, 0x57, 0x0c, 0x01, 0xf0, 0x01, + 0x00, 0x10, 0x78, 0xb8, 0x00, 0x10, 0x78, 0xb8, 0x00, 0x10, 0x78, 0xb8, + 0x00, 0x10, 0x78, 0xb8, 0x00, 0x10, 0x78, 0xb8, 0x00, 0x10, 0x78, 0xb8, + 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, + 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, + 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, + 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, + 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, + 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, + 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, + 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, + 0x00, 0x10, 0x78, 0x9b, 0x00, 0x10, 0x78, 0xb8, 0x00, 0x10, 0x78, 0x92, + 0x00, 0x10, 0x78, 0xb8, 0x00, 0x10, 0x78, 0xb8, 0x00, 0x10, 0x78, 0x92, + 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, + 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0xb8, 0x00, 0x10, 0x78, 0xb8, + 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, + 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, + 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0xa9, + 0x00, 0x10, 0x78, 0xb8, 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0xa2, + 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, + 0x00, 0x10, 0x78, 0xa2, 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, + 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0xb8, 0x00, 0x10, 0x78, 0xa5, + 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x94, 0x00, 0x10, 0x78, 0xb8, + 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0xb8, 0x00, 0x10, 0x78, 0xb8, + 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, + 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0xb8, 0x00, 0x10, 0x78, 0x92, + 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0xb8, + 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, + 0x00, 0x10, 0x78, 0xb8, 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0x92, + 0x00, 0x10, 0x78, 0x92, 0x00, 0x10, 0x78, 0xb8, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x4d, 0x2c, 0x00, 0x00, 0x59, 0x32, 0x58, 0x08, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x5c, 0x02, 0x58, 0x00, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x05, 0x59, 0xa8, 0x00, 0x36, 0x48, 0x02, 0x62, 0x05, + 0x59, 0xa8, 0x00, 0x34, 0x48, 0x02, 0x62, 0x06, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x30, 0x08, 0x1e, 0x49, 0x78, 0x0a, 0x05, 0x04, 0x01, 0xf0, 0x14, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8b, 0x64, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1e, 0xd9, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x76, 0x04, 0x00, 0x00, 0x05, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0xc4, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0xc4, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x64, 0x63, 0x49, 0x33, 0xc8, 0x57, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x02, 0x59, 0xa8, 0x00, 0x34, 0x48, 0x02, 0x62, 0x06, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x3d, 0x04, 0x00, 0x00, 0x2a, + 0x4d, 0x2c, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8d, 0xe6, + 0x04, 0x02, 0x00, 0x0a, 0x4d, 0x40, 0x00, 0x00, 0x42, 0x02, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x31, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8c, 0x81, 0x5c, 0x02, 0x80, 0x00, + 0x04, 0x01, 0xf0, 0x1c, 0x59, 0x30, 0x0c, 0x06, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x04, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x11, 0x04, 0x02, 0x00, 0x0a, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x00, 0x31, 0x4a, 0x02, 0x58, 0x0d, 0x00, 0x00, 0x00, 0x04, + 0x4a, 0x02, 0x58, 0x0e, 0x00, 0x00, 0x00, 0xff, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x04, 0x01, 0xf0, 0x0c, 0x59, 0x2c, 0x04, 0x04, + 0x8c, 0x00, 0x05, 0x1e, 0x04, 0x00, 0x00, 0x09, 0x4a, 0x02, 0x5a, 0x04, + 0x00, 0x00, 0x01, 0x03, 0x4a, 0x02, 0x58, 0x05, 0x01, 0x00, 0x00, 0x00, + 0x59, 0x31, 0xd8, 0x21, 0x58, 0xef, 0x40, 0x0b, 0x58, 0xec, 0x00, 0x09, + 0x08, 0x01, 0xf8, 0x00, 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x59, 0x34, 0x04, 0x00, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x82, 0x00, 0x34, 0x80, 0x00, 0x00, 0x00, 0x0c, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0x30, 0x34, 0x03, + 0x82, 0x18, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x4d, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x8b, 0xd0, 0x82, 0x18, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x33, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x8b, 0x87, 0x82, 0x18, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x28, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x89, 0xaa, + 0x82, 0x18, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x29, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x89, 0xbe, 0x82, 0x18, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x1f, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x73, 0xc3, 0x82, 0x18, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x55, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x73, 0x9c, + 0x82, 0x18, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x05, 0x8b, + 0x82, 0x18, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x22, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x73, 0xf0, 0x82, 0x18, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x35, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x74, 0xeb, 0x82, 0x18, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x39, 0x04, 0x00, 0x05, 0x30, 0x82, 0x18, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x3d, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x74, 0x20, + 0x82, 0x18, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x44, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x74, 0x5d, 0x82, 0x18, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x49, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x74, 0xb2, 0x82, 0x18, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x41, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x74, 0x9e, + 0x82, 0x18, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x43, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x8d, 0x22, 0x82, 0x18, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x51, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x8d, 0x88, 0x82, 0x18, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x02, 0x00, 0x03, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x83, 0x38, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x15, + 0x04, 0x00, 0x00, 0x06, 0x83, 0x38, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x16, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x72, 0x0c, 0x04, 0x01, 0xf2, 0x24, + 0x4d, 0x2c, 0x00, 0x00, 0x4d, 0x3c, 0x00, 0x00, 0x0c, 0x01, 0xf8, 0x04, + 0x5c, 0x02, 0x78, 0x00, 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x79, 0x5e, 0x00, 0x10, 0x79, 0x62, 0x00, 0x10, 0x79, 0x5e, + 0x00, 0x10, 0x79, 0xd5, 0x00, 0x10, 0x79, 0x5e, 0x00, 0x10, 0x7a, 0xe1, + 0x00, 0x10, 0x7b, 0x7a, 0x00, 0x10, 0x79, 0x5e, 0x00, 0x10, 0x79, 0x5e, + 0x00, 0x10, 0x7b, 0x43, 0x00, 0x10, 0x79, 0x5e, 0x00, 0x10, 0x7b, 0x55, + 0x49, 0x33, 0xc8, 0x57, 0x49, 0x7a, 0x60, 0x07, 0x59, 0x30, 0x08, 0x08, + 0x58, 0x04, 0x00, 0x00, 0x4a, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x01, 0x03, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x49, 0x33, 0xc8, 0x57, + 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x59, 0xa8, 0x00, 0x15, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x74, 0x04, 0x02, 0x00, 0x5b, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x9b, 0x50, 0x04, 0x02, 0x00, 0x16, 0x04, 0x01, 0xf8, 0x5b, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x3d, 0x04, 0x00, 0x00, 0x0c, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8d, 0xe6, 0x04, 0x02, 0x00, 0x09, + 0x41, 0x78, 0x08, 0x00, 0x4d, 0x40, 0x00, 0x00, 0x42, 0x02, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8c, 0x81, + 0x5c, 0x02, 0x80, 0x00, 0x04, 0x01, 0xf0, 0x03, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x1c, 0x36, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x45, 0xe1, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x88, 0x3d, 0x04, 0x00, 0x00, 0x07, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8d, 0xe6, 0x04, 0x02, 0x00, 0x04, 0x04, 0x01, 0xff, 0x3d, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x41, 0x7a, 0x78, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0xa0, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x33, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x59, 0x34, 0x02, 0x00, 0x84, 0x00, 0x05, 0x58, 0x48, 0x02, 0x6a, 0x00, + 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa1, 0x37, 0x4d, 0x30, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0x99, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x49, 0x36, 0x60, 0x09, 0x49, 0x7a, 0x60, 0x08, 0x4a, 0x02, 0x64, 0x06, + 0x00, 0x00, 0x00, 0x01, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x01, + 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x00, 0x00, 0x11, 0x4a, 0x02, 0x64, 0x06, + 0x00, 0x00, 0x00, 0x04, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x07, + 0x4a, 0x02, 0x64, 0x20, 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x4d, 0x40, 0x00, 0x00, 0x42, 0x02, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x29, 0x41, 0x78, 0x28, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x9c, 0x14, 0x5c, 0x02, 0x80, 0x00, 0x04, 0x01, 0xf0, 0x09, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x42, 0x6c, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0x39, 0x5c, 0x02, 0x60, 0x00, + 0x04, 0x01, 0xff, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1c, 0x36, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x04, 0x01, 0xff, 0x01, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0xdd, + 0x49, 0x33, 0xc8, 0x57, 0x59, 0x34, 0x02, 0x00, 0x8c, 0x00, 0x05, 0x00, + 0x04, 0x00, 0x00, 0x0c, 0x4d, 0x3c, 0x00, 0x00, 0x41, 0x7a, 0x78, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x5d, 0x5c, 0x02, 0x78, 0x00, + 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x00, 0x00, 0x05, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x59, 0xa8, 0x08, 0x15, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x74, 0x04, 0x00, 0x00, 0x0e, + 0x48, 0x07, 0xc8, 0x57, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x01, 0x00, + 0x04, 0x02, 0x00, 0xb7, 0x59, 0xcc, 0x04, 0x08, 0x48, 0x03, 0xc8, 0x57, + 0x8c, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0xb3, 0x59, 0x34, 0x14, 0x03, + 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0x07, 0xfe, 0x04, 0x00, 0x00, 0x06, + 0x04, 0x01, 0xf0, 0xae, 0x59, 0x34, 0x14, 0x03, 0x82, 0x08, 0x05, 0x80, + 0x00, 0x00, 0x07, 0xfe, 0x04, 0x02, 0x00, 0x1a, 0x59, 0xa8, 0x00, 0x23, + 0x8c, 0x00, 0x05, 0x06, 0x04, 0x00, 0x00, 0x15, 0x59, 0xcc, 0x00, 0x00, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, 0x59, 0xa8, 0x08, 0x0f, + 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x00, 0xff, 0x80, 0x04, 0x05, 0x80, + 0x04, 0x00, 0x00, 0x0d, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1c, 0x36, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x21, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x42, 0x02, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x3d, 0xcb, 0x04, 0x01, 0xfa, 0x9b, 0x04, 0x01, 0xf0, 0x4c, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x43, 0x46, 0x59, 0x34, 0x14, 0x03, + 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0x07, 0xfc, 0x04, 0x02, 0x00, 0x1f, + 0x4a, 0x02, 0x68, 0x02, 0x00, 0xff, 0xff, 0xfc, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x88, 0x3d, 0x04, 0x00, 0x00, 0x12, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8d, 0xe6, 0x04, 0x02, 0x00, 0x0f, 0x04, 0x01, 0xf8, 0xa9, + 0x41, 0x78, 0x08, 0x00, 0x4d, 0x40, 0x00, 0x00, 0x42, 0x02, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8c, 0x81, + 0x5c, 0x02, 0x80, 0x00, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x1c, 0x36, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x59, 0xa8, 0x00, 0x6c, 0x8c, 0x00, 0x05, 0x02, 0x04, 0x00, 0x00, 0x11, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x04, 0x02, 0x00, 0x09, 0x59, 0x34, 0x00, 0x02, + 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0x00, 0x00, 0x82, 0x00, 0x05, 0x80, + 0x00, 0xff, 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x49, 0xda, + 0x04, 0x02, 0x00, 0x5a, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x3d, + 0x04, 0x00, 0x00, 0x5b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8d, 0xe6, + 0x04, 0x02, 0x00, 0x05, 0x59, 0x2c, 0x04, 0x04, 0x8c, 0x00, 0x05, 0x1c, + 0x04, 0x02, 0x07, 0xc9, 0x04, 0x01, 0xf8, 0x77, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x63, 0x39, + 0x59, 0xcc, 0x04, 0x08, 0x8c, 0x00, 0x05, 0x18, 0x04, 0x00, 0x00, 0x10, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8b, 0x1b, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x00, 0x00, 0x04, 0x59, 0xcc, 0x04, 0x08, + 0x8c, 0x00, 0x05, 0x16, 0x04, 0x02, 0x07, 0xb3, 0x59, 0xa8, 0x00, 0x23, + 0x84, 0x00, 0x05, 0x4a, 0x48, 0x03, 0x50, 0x23, 0x59, 0xa8, 0x00, 0x0f, + 0x84, 0x00, 0x05, 0x70, 0x48, 0x03, 0x88, 0x32, 0x04, 0x01, 0xf7, 0xac, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xef, 0x48, 0x0b, 0x50, 0x0f, + 0x49, 0x7b, 0x88, 0x30, 0x84, 0x08, 0x15, 0x70, 0x48, 0x0b, 0x88, 0x32, + 0x59, 0xc4, 0x08, 0x02, 0x84, 0x04, 0x0d, 0x4c, 0x48, 0x07, 0x88, 0x02, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8b, 0x49, 0x59, 0xa8, 0x00, 0x23, + 0x84, 0x00, 0x05, 0x48, 0x48, 0x03, 0x50, 0x23, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x9b, 0xad, 0x04, 0x02, 0x07, 0x9b, 0x59, 0xa8, 0x00, 0x23, + 0x84, 0x00, 0x05, 0x4c, 0x48, 0x03, 0x50, 0x23, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, + 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x5d, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x58, 0x54, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x42, 0xb1, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x49, 0x36, 0x60, 0x09, + 0x59, 0x34, 0x02, 0x00, 0x84, 0x00, 0x05, 0x1a, 0x48, 0x02, 0x6a, 0x00, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x42, 0x6c, 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x01, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x63, 0x39, + 0x04, 0x01, 0xfe, 0x2e, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf0, 0x0a, 0x59, 0x9c, 0x00, 0x17, 0x8c, 0x00, 0x05, 0x0a, + 0x04, 0x00, 0x07, 0xab, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x49, 0x33, 0xc8, 0x57, 0x80, 0x00, 0x35, 0x40, + 0x04, 0x00, 0x00, 0x05, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, 0x80, 0x18, 0x31, 0xc0, + 0x04, 0x02, 0x00, 0x0e, 0x59, 0x30, 0x20, 0x08, 0x80, 0x10, 0x21, 0xc0, + 0x04, 0x00, 0x00, 0x04, 0x58, 0x10, 0x04, 0x04, 0x8c, 0x00, 0x05, 0x1e, + 0x04, 0x02, 0x00, 0x08, 0x59, 0x34, 0x1c, 0x03, 0x42, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x12, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x37, 0x64, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x1c, 0x36, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x4c, 0x5c, 0x00, 0x00, 0x4d, 0x2c, 0x00, 0x00, 0x59, 0x32, 0x58, 0x08, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x52, 0xd5, 0x5c, 0x02, 0x58, 0x00, + 0x59, 0xcc, 0x00, 0x08, 0x48, 0x00, 0x28, 0x05, 0x59, 0xcc, 0x00, 0x09, + 0x48, 0x00, 0x28, 0x06, 0x49, 0x78, 0x28, 0x07, 0x49, 0x78, 0x28, 0x08, + 0x49, 0x78, 0x28, 0x09, 0x49, 0x78, 0x28, 0x0a, 0x59, 0xcc, 0x00, 0x13, + 0x8c, 0x00, 0x05, 0x3e, 0x04, 0x00, 0x00, 0x09, 0x59, 0xcc, 0x04, 0x14, + 0x90, 0x00, 0x01, 0xc0, 0x59, 0xcc, 0xbc, 0x15, 0x80, 0x5c, 0x05, 0x40, + 0x48, 0x00, 0x28, 0x07, 0x59, 0xcc, 0x04, 0x16, 0x90, 0x00, 0x01, 0xc0, + 0x48, 0x00, 0x28, 0x08, 0x59, 0xcc, 0x00, 0x17, 0x8c, 0x00, 0x05, 0x3e, + 0x04, 0x00, 0x00, 0x09, 0x59, 0xcc, 0x04, 0x18, 0x90, 0x00, 0x01, 0xc0, + 0x59, 0xcc, 0xbc, 0x19, 0x80, 0x5c, 0x05, 0x40, 0x48, 0x00, 0x28, 0x09, + 0x59, 0xcc, 0x04, 0x1a, 0x90, 0x00, 0x01, 0xc0, 0x48, 0x00, 0x28, 0x0a, + 0x5c, 0x00, 0xb8, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, + 0x59, 0xa8, 0x00, 0x15, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x14, + 0x04, 0x02, 0x00, 0x48, 0x59, 0xa8, 0x00, 0x6c, 0x8c, 0x00, 0x05, 0x02, + 0x04, 0x00, 0x00, 0x15, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x02, 0x00, 0x09, + 0x59, 0x34, 0x00, 0x02, 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x82, 0x00, 0x05, 0x80, 0x00, 0xff, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0a, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x49, 0xda, 0x04, 0x00, 0x00, 0x05, 0x59, 0xa8, 0x00, 0x6c, + 0x84, 0x00, 0x05, 0x4c, 0x48, 0x03, 0x50, 0x6c, 0x04, 0x01, 0xf0, 0x31, + 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x00, 0x0b, + 0x59, 0x30, 0x00, 0x08, 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x08, + 0x59, 0x34, 0x1c, 0x03, 0x42, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x13, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x37, 0x64, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x43, 0xa7, + 0x04, 0x01, 0xfe, 0xb9, 0x04, 0x01, 0xfa, 0x19, 0x04, 0x02, 0x00, 0x1f, + 0x59, 0x34, 0x04, 0x04, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x1c, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x42, 0x6c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x3d, + 0x04, 0x00, 0x00, 0x11, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8d, 0xe6, + 0x04, 0x02, 0x00, 0x0a, 0x41, 0x78, 0x08, 0x00, 0x4d, 0x40, 0x00, 0x00, + 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8c, 0x81, 0x5c, 0x02, 0x80, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x4a, 0x02, 0x5a, 0x04, 0x00, 0x00, 0x01, 0x03, + 0x4a, 0x02, 0x58, 0x05, 0x02, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x1c, 0x36, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x49, 0x75, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x88, 0x3d, 0x04, 0x00, 0x00, 0x07, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8d, 0xe6, 0x04, 0x02, 0x00, 0x04, 0x04, 0x01, 0xfd, 0x8d, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x04, 0x01, 0xfd, 0x8a, + 0x80, 0x00, 0x05, 0x80, 0x59, 0xa8, 0x00, 0x6c, 0x8c, 0x00, 0x05, 0x0c, + 0x04, 0x00, 0x00, 0x05, 0x84, 0x00, 0x05, 0x0c, 0x48, 0x03, 0x50, 0x6c, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xff, 0x60, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x59, 0xa8, 0x00, 0x15, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x14, 0x04, 0x02, 0x00, 0x0b, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x42, 0x6c, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x63, 0x39, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf7, 0x4d, 0x49, 0x33, 0xc8, 0x57, 0x40, 0x00, 0x30, 0x00, + 0x59, 0xa8, 0x00, 0x15, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x02, 0x00, 0x0a, 0x82, 0x18, 0x35, 0x80, 0x00, 0x00, 0x00, 0x0b, + 0x04, 0x02, 0x00, 0x05, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf7, 0x3b, 0x48, 0x03, 0xc8, 0x57, 0x4d, 0x2c, 0x00, 0x00, + 0x4d, 0x3c, 0x00, 0x00, 0x0c, 0x01, 0xf8, 0x04, 0x5c, 0x02, 0x78, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x79, 0x5e, + 0x00, 0x10, 0x7b, 0x89, 0x00, 0x10, 0x79, 0x5e, 0x00, 0x10, 0x7b, 0xdd, + 0x00, 0x10, 0x79, 0x5e, 0x00, 0x10, 0x7c, 0x4b, 0x00, 0x10, 0x7b, 0x7a, + 0x00, 0x10, 0x79, 0x5e, 0x00, 0x10, 0x79, 0x5e, 0x00, 0x10, 0x7c, 0x6b, + 0x00, 0x10, 0x79, 0x5e, 0x00, 0x10, 0x7c, 0x7b, 0x49, 0x33, 0xc8, 0x57, + 0x4d, 0x1c, 0x00, 0x00, 0x59, 0x30, 0x14, 0x03, 0x82, 0x08, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x08, 0x82, 0x08, 0x15, 0x80, + 0x00, 0x00, 0x00, 0x1e, 0x04, 0x02, 0x00, 0x03, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x5c, 0x02, 0x38, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x04, 0x01, 0xff, 0x5a, 0x04, 0x01, 0xf7, 0xfd, 0x49, 0x33, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x3d, 0x04, 0x00, 0x00, 0x0b, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8d, 0xe6, 0x04, 0x02, 0x00, 0x08, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8d, 0xc3, 0x04, 0x01, 0xfd, 0x2e, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x04, 0x01, 0xf8, 0xf4, 0x04, 0x02, 0x00, 0x2f, + 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x5d, + 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0xa0, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x33, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x59, 0x34, 0x02, 0x00, 0x84, 0x00, 0x05, 0x58, + 0x48, 0x02, 0x6a, 0x00, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x02, + 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa1, 0x37, 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x00, 0x00, 0x11, + 0x4d, 0x40, 0x00, 0x00, 0x41, 0x78, 0x28, 0x00, 0x42, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9c, 0x14, 0x5c, 0x02, 0x80, 0x00, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x07, 0x4a, 0x02, 0x64, 0x06, + 0x00, 0x00, 0x00, 0x04, 0x4a, 0x02, 0x64, 0x20, 0x00, 0x00, 0x00, 0x01, + 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0x39, + 0x04, 0x01, 0xf7, 0xf7, 0x59, 0xcc, 0x04, 0x07, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x09, 0x04, 0x02, 0x00, 0x0a, 0x59, 0x34, 0x04, 0x12, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0x0c, + 0x80, 0x00, 0x00, 0x40, 0x48, 0x02, 0x6c, 0x12, 0x4a, 0x02, 0x62, 0x06, + 0x00, 0x00, 0x00, 0x0a, 0x04, 0x01, 0xf7, 0xea, 0x59, 0xcc, 0x02, 0x07, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0xff, 0x00, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x19, 0x00, 0x04, 0x00, 0x07, 0xc3, 0x04, 0x01, 0xfc, 0xe8, + 0x80, 0x00, 0x05, 0x80, 0x04, 0x01, 0xf6, 0xc5, 0x49, 0x33, 0xc8, 0x57, + 0x59, 0xa8, 0x00, 0x2f, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x15, + 0x59, 0x34, 0x04, 0x03, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x07, 0xfe, + 0x04, 0x02, 0x00, 0x11, 0x59, 0xa8, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00, + 0x48, 0x03, 0x50, 0x0f, 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x42, 0x5d, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x01, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x63, 0x39, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x88, 0x3d, 0x04, 0x00, 0x00, 0x11, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8d, 0xe6, 0x04, 0x02, 0x00, 0x0e, 0x4c, 0x58, 0x00, 0x00, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8d, 0xc3, 0x5c, 0x00, 0xb0, 0x00, 0x04, 0x01, 0xfc, 0xc1, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x42, 0x6c, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x04, 0x01, 0xfc, 0xba, 0x59, 0xcc, 0x34, 0x07, 0x82, 0x18, 0x35, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x82, 0x18, 0x05, 0x80, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x00, 0x00, 0x1c, 0x82, 0x18, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0b, + 0x04, 0x00, 0x00, 0x16, 0x59, 0xcc, 0x02, 0x07, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x04, 0x02, 0x00, 0x04, 0x82, 0x18, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x12, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x19, 0x00, 0x04, 0x02, 0x00, 0x0c, 0x82, 0x18, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x0c, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1c, 0x36, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf6, 0x78, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x3d, + 0x59, 0x32, 0x58, 0x08, 0x04, 0x00, 0x00, 0x08, 0x59, 0x2c, 0x02, 0x04, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x01, 0x39, 0x04, 0x00, 0x07, 0xf6, + 0x59, 0x2c, 0x04, 0x04, 0x8c, 0x00, 0x05, 0x1e, 0x04, 0x02, 0x07, 0xf3, + 0x59, 0x34, 0x04, 0x03, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x07, 0xfe, + 0x04, 0x02, 0x00, 0x07, 0x59, 0xa8, 0x00, 0x23, 0x84, 0x00, 0x05, 0x40, + 0x48, 0x03, 0x50, 0x23, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3e, 0xee, + 0x04, 0x01, 0xf7, 0xe9, 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xca, 0xa0, 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa1, 0x37, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x33, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x04, 0x01, 0xf7, 0xdd, 0x49, 0x33, 0xc8, 0x57, 0x04, 0x01, 0xf8, 0x4d, + 0x04, 0x02, 0x00, 0x0b, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x01, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x03, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x63, 0x39, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8d, 0xe6, 0x04, 0x02, 0x00, 0x0a, + 0x4c, 0x58, 0x00, 0x00, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8d, 0xc3, 0x5c, 0x00, 0xb0, 0x00, + 0x04, 0x01, 0xfc, 0x5d, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x04, 0x01, 0xfc, 0x5a, 0x80, 0x00, 0x05, 0x80, 0x04, 0x01, 0xf6, 0x37, + 0x49, 0x33, 0xc8, 0x57, 0x04, 0x01, 0xf8, 0x2d, 0x04, 0x02, 0x00, 0x0b, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x09, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x42, 0x6c, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x63, 0x39, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf6, 0x27, 0x49, 0x33, 0xc8, 0x57, 0x04, 0x01, 0xf8, 0x1d, + 0x04, 0x02, 0x00, 0x0b, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0b, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x01, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x63, 0x39, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf6, 0x17, 0x49, 0x33, 0xc8, 0x57, + 0x59, 0xcc, 0x04, 0x07, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x02, 0x00, 0x09, 0x59, 0xcc, 0x02, 0x07, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x2a, 0x00, + 0x04, 0x00, 0x00, 0x03, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x1e, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, + 0x4d, 0x40, 0x00, 0x00, 0x4c, 0x58, 0x00, 0x00, 0x59, 0xa8, 0x00, 0x23, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x03, 0x48, 0x03, 0x50, 0x23, + 0x04, 0x01, 0xf8, 0x59, 0x04, 0x00, 0x00, 0x35, 0x4d, 0x34, 0x00, 0x00, + 0x4d, 0x44, 0x00, 0x00, 0x59, 0xa8, 0x00, 0x23, 0x84, 0x00, 0x05, 0x52, + 0x48, 0x03, 0x50, 0x23, 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x00, 0x00, 0x0a, + 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x42, 0x02, 0x88, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9c, 0x1c, 0x85, 0x0e, 0x1d, 0x44, + 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x4d, 0x3c, 0x00, 0x00, + 0x42, 0x02, 0x78, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xca, 0x42, 0x5c, 0x02, 0x78, 0x00, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x33, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1a, 0xdd, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x42, 0x02, 0x88, 0x00, 0x00, 0x00, 0x07, 0xf0, + 0x4d, 0x2c, 0x00, 0x00, 0x83, 0x44, 0x05, 0x80, 0x00, 0x00, 0x07, 0xfe, + 0x04, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x43, 0x0f, + 0x81, 0x46, 0x88, 0x00, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xf9, + 0x5c, 0x02, 0x58, 0x00, 0x59, 0xcc, 0x04, 0x08, 0x8c, 0x00, 0x05, 0x1e, + 0x04, 0x00, 0x00, 0x04, 0x59, 0xa8, 0x00, 0x23, 0x84, 0x00, 0x05, 0x12, + 0x48, 0x03, 0x50, 0x23, 0x5c, 0x02, 0x88, 0x00, 0x5c, 0x02, 0x68, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x43, 0x46, 0x4a, 0x02, 0x68, 0x02, + 0x00, 0xff, 0xff, 0xfe, 0x59, 0xa8, 0x08, 0x23, 0x84, 0x04, 0x0d, 0x50, + 0x59, 0xcc, 0x00, 0x13, 0x8c, 0x00, 0x05, 0x3e, 0x04, 0x00, 0x00, 0x03, + 0x8c, 0x00, 0x05, 0x36, 0x04, 0x00, 0x00, 0x04, 0x59, 0xcc, 0x00, 0x17, + 0x8c, 0x00, 0x05, 0x36, 0x04, 0x02, 0x00, 0x02, 0x84, 0x04, 0x0d, 0x10, + 0x48, 0x07, 0x50, 0x23, 0x59, 0xcc, 0x08, 0x00, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x48, 0x07, 0x50, 0x0f, 0x80, 0x04, 0x01, 0x10, + 0x48, 0x03, 0x50, 0x1c, 0x48, 0x03, 0x88, 0x81, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x00, 0x00, 0x07, 0x59, 0xcc, 0x00, 0x09, + 0x48, 0x03, 0x50, 0x32, 0x59, 0xcc, 0x00, 0x0a, 0x48, 0x03, 0x50, 0x33, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8b, 0x1b, 0x5c, 0x00, 0xb0, 0x00, + 0x5c, 0x02, 0x80, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, + 0x4c, 0x58, 0x00, 0x00, 0x59, 0xa8, 0x00, 0x1c, 0x80, 0x00, 0x01, 0xc0, + 0x04, 0x00, 0x00, 0x23, 0x59, 0xcc, 0x10, 0x00, 0x82, 0x08, 0x15, 0x00, + 0x00, 0xff, 0xff, 0x00, 0x80, 0x08, 0x11, 0x10, 0x80, 0x08, 0x05, 0x80, + 0x04, 0x00, 0x00, 0x04, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x09, + 0x04, 0x01, 0xf0, 0x16, 0x83, 0xcc, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0b, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x83, 0x34, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x04, 0x01, 0xf8, 0x30, 0x04, 0x00, 0x00, 0x04, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x0a, 0x04, 0x01, 0xf0, 0x0b, + 0x83, 0xcc, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x83, 0x34, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x04, 0x01, 0xf8, 0x25, 0x04, 0x00, 0x00, 0x07, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x0b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x5c, 0x00, 0xb0, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x59, 0xcc, 0x02, 0x06, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x14, 0x04, 0x02, 0x00, 0x16, + 0x59, 0xcc, 0x04, 0x07, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x02, 0x00, 0x12, 0x59, 0xcc, 0x02, 0x07, 0x8c, 0x00, 0x05, 0x1a, + 0x04, 0x00, 0x00, 0x0d, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0f, 0x00, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x01, 0x00, 0x04, 0x02, 0x00, 0x08, + 0x59, 0xcc, 0x02, 0x0a, 0x8c, 0x00, 0x05, 0x08, 0x04, 0x02, 0x00, 0x03, + 0x8c, 0x00, 0x05, 0x0a, 0x04, 0x00, 0x00, 0x03, 0x80, 0x00, 0x05, 0x80, + 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x1c, 0x01, 0xf0, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x48, 0x03, 0xc8, 0x57, 0x48, 0x0b, 0xc8, 0x57, 0x48, 0x0f, 0xc8, 0x57, + 0x48, 0x5b, 0xc8, 0x57, 0x50, 0x08, 0x08, 0x00, 0x50, 0x0c, 0x00, 0x00, + 0x80, 0x04, 0x25, 0x80, 0x04, 0x02, 0x00, 0x07, 0x80, 0x08, 0x10, 0x00, + 0x80, 0x0c, 0x18, 0x00, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xf9, + 0x80, 0x00, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x57, + 0x48, 0x07, 0xc8, 0x57, 0x48, 0x0b, 0xc8, 0x57, 0x48, 0x0f, 0xc8, 0x57, + 0x80, 0x04, 0x04, 0x80, 0x04, 0x00, 0x10, 0x06, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x82, 0x04, 0x0d, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x1c, 0x01, 0xf0, 0x00, 0x41, 0x78, 0x00, 0x00, 0x04, 0x01, 0xf7, 0xfc, + 0x83, 0x38, 0x04, 0x80, 0x00, 0x00, 0x00, 0x53, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x83, 0x38, 0x04, 0x80, 0x00, 0x00, 0x00, 0x4b, + 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf0, 0x01, + 0x00, 0x10, 0x7d, 0x71, 0x00, 0x10, 0x7d, 0x71, 0x00, 0x10, 0x7d, 0x71, + 0x00, 0x10, 0x7d, 0x71, 0x00, 0x10, 0x7d, 0x6f, 0x00, 0x10, 0x7d, 0x6f, + 0x00, 0x10, 0x7d, 0x6f, 0x00, 0x10, 0x7d, 0x71, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x49, 0x3b, 0xc8, 0x57, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x0d, 0x49, 0x3a, 0x64, 0x03, 0x42, 0x00, 0x08, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0x5c, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x13, 0x04, 0x02, 0x00, 0x08, + 0x59, 0x30, 0x04, 0x03, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x50, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x49, 0x33, 0xc8, 0x57, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x27, 0x04, 0x02, 0x00, 0x30, 0x49, 0x33, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0xc4, 0x4d, 0x3c, 0x00, 0x00, + 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0xa0, + 0x5c, 0x02, 0x78, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x33, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x4d, 0x2c, 0x00, 0x00, + 0x59, 0x32, 0x58, 0x08, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x3d, + 0x49, 0x2f, 0xc8, 0x57, 0x04, 0x00, 0x00, 0x0d, 0x4a, 0x02, 0x5a, 0x04, + 0x00, 0x00, 0x01, 0x03, 0x59, 0x30, 0x0c, 0x02, 0x48, 0x06, 0x5c, 0x06, + 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x29, 0x49, 0x7a, 0x58, 0x09, + 0x59, 0x2c, 0x0c, 0x08, 0x84, 0x04, 0x0d, 0x50, 0x48, 0x06, 0x5c, 0x08, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x5c, 0x02, 0x58, 0x00, + 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x15, 0x41, 0x78, 0x28, 0x00, + 0x42, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x03, 0x4d, 0x40, 0x00, 0x00, + 0x4d, 0x44, 0x00, 0x00, 0x59, 0x36, 0x8c, 0x03, 0x42, 0x02, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x29, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x90, 0xb2, + 0x5c, 0x02, 0x88, 0x00, 0x5c, 0x02, 0x80, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x14, + 0x04, 0x02, 0x00, 0x0d, 0x59, 0x30, 0x04, 0x03, 0x82, 0x00, 0x0c, 0x80, + 0x00, 0x00, 0x00, 0x53, 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x82, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x49, 0x33, 0xc8, 0x57, 0x48, 0x03, 0xc8, 0x57, + 0x0c, 0x01, 0xf0, 0x0e, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x53, + 0x04, 0x00, 0x00, 0x0a, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x48, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0x30, 0x04, 0x03, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x50, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x7d, 0xe7, + 0x00, 0x10, 0x7d, 0xe5, 0x00, 0x10, 0x7d, 0xe5, 0x00, 0x10, 0x7d, 0xe5, + 0x00, 0x10, 0x7d, 0xe5, 0x00, 0x10, 0x7d, 0xe5, 0x00, 0x10, 0x7d, 0xe5, + 0x00, 0x10, 0x7d, 0xe5, 0x00, 0x10, 0x7d, 0xe5, 0x00, 0x10, 0x7d, 0xe5, + 0x00, 0x10, 0x7d, 0xe5, 0x00, 0x10, 0x7d, 0xfe, 0x00, 0x10, 0x7d, 0xfe, + 0x00, 0x10, 0x7d, 0xfe, 0x00, 0x10, 0x7d, 0xfe, 0x00, 0x10, 0x7d, 0xe5, + 0x00, 0x10, 0x7d, 0xfe, 0x00, 0x10, 0x7d, 0xe5, 0x00, 0x10, 0x7d, 0xfe, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x49, 0x33, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0xc4, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x88, 0x3d, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x4d, 0x2c, 0x00, 0x00, 0x59, 0x32, 0x58, 0x08, 0x4a, 0x02, 0x5a, 0x04, + 0x00, 0x00, 0x01, 0x03, 0x59, 0x30, 0x04, 0x02, 0x48, 0x02, 0x5c, 0x06, + 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x06, 0x49, 0x7a, 0x58, 0x09, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x5c, 0x02, 0x58, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x89, 0x42, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x49, 0x33, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x63, 0xc4, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0x30, 0x00, 0x1c, + 0x80, 0x00, 0x01, 0xc0, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x90, 0xa2, + 0x59, 0x30, 0x00, 0x04, 0x8c, 0x00, 0x05, 0x3e, 0x04, 0x02, 0x00, 0x2a, + 0x59, 0x32, 0x58, 0x08, 0x59, 0x2c, 0x0c, 0x08, 0x59, 0xcc, 0x28, 0x08, + 0x82, 0x14, 0x1d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x00, 0x02, + 0x59, 0xcc, 0x18, 0x09, 0x84, 0x04, 0x0d, 0x58, 0x48, 0x06, 0x5c, 0x08, + 0x82, 0x14, 0x35, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x04, 0x02, 0x00, 0x28, + 0x59, 0x34, 0x02, 0x00, 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x02, 0x00, 0x82, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x08, 0x69, 0x04, 0x02, 0x00, 0x06, + 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x00, 0x59, 0x30, 0x08, 0x11, + 0x80, 0x04, 0x09, 0xc0, 0x04, 0x02, 0x09, 0x54, 0x4a, 0x02, 0x5a, 0x04, + 0x00, 0x00, 0x01, 0x03, 0x48, 0x06, 0x58, 0x07, 0x48, 0x0e, 0x58, 0x0a, + 0x90, 0x14, 0x09, 0xc0, 0x48, 0x06, 0x58, 0x09, 0x59, 0x30, 0x0c, 0x02, + 0x48, 0x06, 0x5c, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x46, 0xdb, 0x59, 0xcc, 0x00, 0x08, + 0x8c, 0x00, 0x05, 0x18, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x89, 0xf0, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x67, 0xa7, 0x04, 0x00, 0x07, 0xd5, 0x4d, 0x3c, 0x00, 0x00, + 0x42, 0x02, 0x78, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x83, 0xe0, 0x5c, 0x02, 0x78, 0x00, 0x04, 0x01, 0xf7, 0xce, + 0x48, 0x17, 0xc8, 0x57, 0x48, 0x0f, 0xc8, 0x57, 0x82, 0x18, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0x0e, 0x59, 0x2c, 0x02, 0x04, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x48, 0x04, 0x02, 0x00, 0x08, 0x59, 0x2c, 0x04, 0x07, + 0x80, 0x00, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8f, 0x93, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x8f, 0xdb, + 0x82, 0x18, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x00, 0x04, + 0x59, 0x34, 0x02, 0x00, 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x02, 0x00, 0x33, + 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x00, 0x41, 0x78, 0x20, 0x00, + 0x8c, 0x18, 0x35, 0x10, 0x04, 0x00, 0x00, 0x07, 0x59, 0xcc, 0x00, 0x0c, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0x02, + 0x48, 0x03, 0xc8, 0x57, 0x59, 0xcc, 0x20, 0x0b, 0x48, 0x12, 0x58, 0x0c, + 0x41, 0x78, 0x00, 0x00, 0x8c, 0x18, 0x35, 0x12, 0x04, 0x00, 0x00, 0x02, + 0x59, 0xcc, 0x00, 0x0a, 0x48, 0x02, 0x58, 0x0b, 0x80, 0x10, 0x0c, 0x00, + 0x04, 0x00, 0x07, 0xb7, 0x82, 0x04, 0x14, 0x80, 0x00, 0x00, 0x00, 0x1d, + 0x04, 0x00, 0x10, 0x06, 0x59, 0x2c, 0x04, 0x04, 0x8c, 0x00, 0x05, 0x1e, + 0x04, 0x00, 0x00, 0x0e, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x4c, 0x50, 0x00, 0x00, 0x4c, 0x54, 0x00, 0x00, 0x83, 0xcc, 0xa4, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x83, 0x2c, 0xac, 0x00, 0x00, 0x00, 0x00, 0x0d, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x83, 0x9c, 0x5c, 0x00, 0xa8, 0x00, + 0x5c, 0x00, 0xa0, 0x00, 0x04, 0x01, 0xf7, 0xa4, 0x59, 0x30, 0x00, 0x11, + 0x59, 0x30, 0x14, 0x02, 0x48, 0x0a, 0x5c, 0x06, 0x48, 0x02, 0x58, 0x07, + 0x48, 0x0e, 0x58, 0x0a, 0x90, 0x14, 0x01, 0xc0, 0x48, 0x02, 0x58, 0x09, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x83, 0x45, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x83, 0x81, 0x04, 0x01, 0xf7, 0xa5, 0x59, 0x2c, 0x02, 0x0a, + 0x8c, 0x00, 0x05, 0x02, 0x04, 0x00, 0x07, 0xcc, 0x59, 0x2c, 0x02, 0x08, + 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x02, 0x07, 0xc9, 0x59, 0x30, 0x00, 0x11, + 0x80, 0x0c, 0x0d, 0x80, 0x04, 0x00, 0x07, 0xc6, 0x48, 0x03, 0xc8, 0x57, + 0x48, 0x0f, 0xc8, 0x57, 0x8c, 0x18, 0x35, 0x14, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x8a, 0x2e, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x07, 0xbf, + 0x48, 0x07, 0xc8, 0x56, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x8a, 0x2e, + 0x59, 0x2c, 0x02, 0x0a, 0x8c, 0x00, 0x05, 0x02, 0x04, 0x00, 0x07, 0x80, + 0x59, 0x30, 0x00, 0x11, 0x80, 0x00, 0x01, 0xc0, 0x04, 0x00, 0x07, 0x7d, + 0x59, 0x2c, 0x02, 0x08, 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x02, 0x07, 0x7a, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x8a, 0x2e, 0x59, 0xcc, 0x20, 0x06, + 0x59, 0xcc, 0x28, 0x07, 0x04, 0x01, 0xf0, 0x38, 0x04, 0x01, 0xf0, 0x37, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x59, 0x30, 0x00, 0x1c, + 0x80, 0x00, 0x01, 0xc0, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x90, 0xa2, + 0x59, 0x32, 0x58, 0x08, 0x59, 0x2c, 0x0c, 0x08, 0x41, 0x78, 0x28, 0x00, + 0x41, 0x78, 0x18, 0x00, 0x84, 0x04, 0x0d, 0x58, 0x48, 0x06, 0x5c, 0x08, + 0x41, 0x78, 0x30, 0x00, 0x59, 0x34, 0x02, 0x00, 0x8c, 0x00, 0x05, 0x0e, + 0x04, 0x02, 0x00, 0x1b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x08, 0x69, + 0x04, 0x02, 0x00, 0x07, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x59, 0x30, 0x08, 0x11, 0x48, 0x07, 0xc8, 0x57, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x02, 0x08, 0xb3, 0x4a, 0x02, 0x5a, 0x04, 0x00, 0x00, 0x01, 0x03, + 0x48, 0x06, 0x58, 0x07, 0x48, 0x0e, 0x58, 0x0a, 0x90, 0x14, 0x09, 0xc0, + 0x48, 0x06, 0x58, 0x09, 0x49, 0x33, 0xc8, 0x57, 0x59, 0x30, 0x0c, 0x02, + 0x48, 0x06, 0x5c, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8d, 0xef, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x46, 0xdb, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x59, 0x2c, 0x02, 0x0a, 0x8c, 0x00, 0x05, 0x02, 0x04, 0x00, 0x07, 0xe7, + 0x59, 0x30, 0x00, 0x11, 0x48, 0x03, 0xc8, 0x57, 0x80, 0x00, 0x01, 0xc0, + 0x04, 0x00, 0x07, 0xe3, 0x59, 0x2c, 0x02, 0x08, 0x8c, 0x00, 0x05, 0x0e, + 0x04, 0x02, 0x07, 0xe0, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x8a, 0x2e, + 0x59, 0x30, 0x00, 0x1c, 0x80, 0x00, 0x01, 0xc0, 0x4c, 0x10, 0x00, 0x00, + 0x4c, 0x14, 0x00, 0x00, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x90, 0xa2, + 0x5c, 0x00, 0x28, 0x00, 0x5c, 0x00, 0x20, 0x00, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x02, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x43, + 0x59, 0x32, 0x58, 0x08, 0x59, 0x2c, 0x02, 0x0a, 0x8c, 0x00, 0x05, 0x02, + 0x04, 0x02, 0x00, 0x1c, 0x40, 0x10, 0x00, 0x00, 0x59, 0x2c, 0x08, 0x0f, + 0x80, 0x04, 0x0c, 0x80, 0x40, 0x14, 0x00, 0x00, 0x80, 0x04, 0x04, 0x80, + 0x04, 0x00, 0x10, 0x18, 0x59, 0x30, 0x00, 0x04, 0x8c, 0x00, 0x05, 0x3e, + 0x04, 0x02, 0x00, 0x0a, 0x48, 0x12, 0x60, 0x13, 0x48, 0x16, 0x60, 0x11, + 0x49, 0x7a, 0x62, 0x05, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0e, 0xda, + 0x04, 0x02, 0x00, 0x0d, 0x59, 0x30, 0x08, 0x04, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x63, 0x2f, 0x4c, 0x10, 0x00, 0x00, 0x4c, 0x14, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x67, 0xa7, 0x5c, 0x00, 0x28, 0x00, + 0x5c, 0x00, 0x20, 0x00, 0x04, 0x00, 0x07, 0xf1, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x72, 0x0c, 0x49, 0x33, 0xc8, 0x57, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x07, 0xc8, 0x57, 0x40, 0x04, 0x28, 0x00, 0x04, 0x01, 0xf7, 0xe7, + 0x83, 0x38, 0x04, 0x80, 0x00, 0x00, 0x00, 0x58, 0x04, 0x02, 0x10, 0x05, + 0x83, 0x38, 0x04, 0x80, 0x00, 0x00, 0x00, 0x40, 0x04, 0x00, 0x10, 0x02, + 0x0c, 0x01, 0xf0, 0x02, 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x7f, 0x31, + 0x00, 0x10, 0x7f, 0x31, 0x00, 0x10, 0x7f, 0x31, 0x00, 0x10, 0x7f, 0x31, + 0x00, 0x10, 0x7f, 0x31, 0x00, 0x10, 0x7f, 0x31, 0x00, 0x10, 0x7f, 0x31, + 0x00, 0x10, 0x7f, 0x31, 0x00, 0x10, 0x7f, 0x31, 0x00, 0x10, 0x7f, 0x31, + 0x00, 0x10, 0x7f, 0x33, 0x00, 0x10, 0x7f, 0x31, 0x00, 0x10, 0x7f, 0x31, + 0x00, 0x10, 0x7f, 0x31, 0x00, 0x10, 0x7f, 0x31, 0x00, 0x10, 0x7f, 0x40, + 0x00, 0x10, 0x7f, 0x31, 0x00, 0x10, 0x7f, 0x31, 0x00, 0x10, 0x7f, 0x31, + 0x00, 0x10, 0x7f, 0x31, 0x00, 0x10, 0x7f, 0x6e, 0x00, 0x10, 0x7f, 0x31, + 0x00, 0x10, 0x7f, 0x31, 0x00, 0x10, 0x7f, 0x31, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x49, 0x33, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x66, 0x06, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x02, + 0x59, 0xa8, 0x00, 0x36, 0x48, 0x02, 0x62, 0x05, 0x59, 0x30, 0x00, 0x11, + 0x59, 0x30, 0x08, 0x15, 0x80, 0x04, 0x0c, 0x80, 0x48, 0x06, 0x60, 0x15, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x63, 0xa4, 0x49, 0x33, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0xa4, 0x4d, 0x3c, 0x00, 0x00, + 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0xa0, + 0x5c, 0x02, 0x78, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x33, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x88, 0x3d, 0x04, 0x00, 0x00, 0x10, 0x4d, 0x2c, 0x00, 0x00, + 0x59, 0x32, 0x58, 0x08, 0x4a, 0x02, 0x5a, 0x04, 0x00, 0x00, 0x01, 0x03, + 0x59, 0x30, 0x04, 0x02, 0x48, 0x02, 0x5c, 0x06, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x00, 0x29, 0x49, 0x7a, 0x58, 0x09, 0x59, 0x2c, 0x0c, 0x08, + 0x84, 0x04, 0x0d, 0x50, 0x48, 0x06, 0x5c, 0x08, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x5c, 0x02, 0x58, 0x00, 0x42, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x14, 0x41, 0x78, 0x28, 0x00, 0x4d, 0x40, 0x00, 0x00, + 0x4d, 0x44, 0x00, 0x00, 0x59, 0x36, 0x8c, 0x03, 0x42, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x90, 0xb2, 0x5c, 0x02, 0x88, 0x00, + 0x5c, 0x02, 0x80, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x49, 0x33, 0xc8, 0x57, 0x59, 0x30, 0x08, 0x08, 0x49, 0x78, 0x08, 0x09, + 0x49, 0x78, 0x08, 0x0a, 0x58, 0x04, 0x14, 0x08, 0x84, 0x08, 0x15, 0x58, + 0x48, 0x08, 0x0c, 0x08, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x07, 0xc8, 0x57, + 0x8c, 0x04, 0x0d, 0x3e, 0x04, 0x02, 0x00, 0x24, 0x49, 0x7a, 0x5a, 0x06, + 0x59, 0x30, 0x00, 0x1f, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x18, + 0x49, 0x7a, 0x5a, 0x06, 0x4c, 0x04, 0x00, 0x00, 0x4c, 0x08, 0x00, 0x00, + 0x4c, 0x0c, 0x00, 0x00, 0x4c, 0x10, 0x00, 0x00, 0x4c, 0x14, 0x00, 0x00, + 0x40, 0x00, 0x28, 0x00, 0x58, 0x14, 0x10, 0x03, 0x40, 0x04, 0x00, 0x00, + 0x80, 0x08, 0x14, 0x80, 0x48, 0x08, 0x28, 0x03, 0x40, 0x14, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0c, 0x91, 0x5c, 0x00, 0x28, 0x00, + 0x5c, 0x00, 0x20, 0x00, 0x5c, 0x00, 0x18, 0x00, 0x5c, 0x00, 0x10, 0x00, + 0x5c, 0x00, 0x08, 0x00, 0x59, 0x2c, 0x02, 0x06, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x02, 0x00, 0x09, 0x04, 0x01, 0xf0, 0x05, 0x59, 0x2c, 0x04, 0x08, + 0x8c, 0x00, 0x05, 0x1c, 0x04, 0x00, 0x00, 0x02, 0x59, 0x2c, 0x08, 0x03, + 0x48, 0x07, 0xc8, 0x57, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x15, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x30, 0x00, 0x1f, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x00, 0x00, 0x09, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x11, + 0x59, 0x30, 0x00, 0x1f, 0x4c, 0x04, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x0c, 0x91, 0x5c, 0x00, 0x08, 0x00, 0x04, 0x01, 0xf7, 0xf5, + 0x48, 0x07, 0xc8, 0x56, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x07, + 0x1c, 0x01, 0xf0, 0x00, 0x83, 0x38, 0x04, 0x80, 0x00, 0x00, 0x00, 0x58, + 0x04, 0x02, 0x10, 0x07, 0x83, 0x38, 0x04, 0x80, 0x00, 0x00, 0x00, 0x40, + 0x04, 0x00, 0x10, 0x04, 0x4d, 0x2c, 0x00, 0x00, 0x0c, 0x01, 0xf8, 0x03, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x7f, 0xcd, + 0x00, 0x10, 0x7f, 0xcd, 0x00, 0x10, 0x7f, 0xcd, 0x00, 0x10, 0x7f, 0xcd, + 0x00, 0x10, 0x7f, 0xcd, 0x00, 0x10, 0x7f, 0xcf, 0x00, 0x10, 0x7f, 0xcd, + 0x00, 0x10, 0x7f, 0xcd, 0x00, 0x10, 0x80, 0x54, 0x00, 0x10, 0x7f, 0xcd, + 0x00, 0x10, 0x7f, 0xcd, 0x00, 0x10, 0x7f, 0xcd, 0x00, 0x10, 0x7f, 0xcd, + 0x00, 0x10, 0x7f, 0xcd, 0x00, 0x10, 0x7f, 0xcd, 0x00, 0x10, 0x7f, 0xcd, + 0x00, 0x10, 0x7f, 0xcd, 0x00, 0x10, 0x7f, 0xcd, 0x00, 0x10, 0x7f, 0xcd, + 0x00, 0x10, 0x81, 0x0c, 0x00, 0x10, 0x81, 0x35, 0x00, 0x10, 0x81, 0x14, + 0x00, 0x10, 0x7f, 0xcd, 0x00, 0x10, 0x81, 0x41, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x59, 0x30, 0x00, 0x1c, 0x80, 0x00, 0x01, 0xc0, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x90, 0xa2, 0x59, 0x30, 0x00, 0x07, + 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x00, 0x00, 0x7e, 0x8c, 0x00, 0x05, 0x00, + 0x04, 0x00, 0x00, 0x70, 0x8c, 0x00, 0x05, 0x1c, 0x04, 0x00, 0x00, 0x09, + 0x84, 0x00, 0x05, 0x00, 0x48, 0x02, 0x60, 0x07, 0x59, 0x32, 0x58, 0x08, + 0x59, 0x2c, 0x3c, 0x08, 0x84, 0x1c, 0x3d, 0x58, 0x48, 0x1e, 0x5c, 0x08, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x08, 0x1b, 0x59, 0x32, 0x58, 0x08, + 0x59, 0x2c, 0x3c, 0x08, 0x84, 0x1c, 0x3d, 0x58, 0x59, 0x30, 0x00, 0x07, + 0x8c, 0x00, 0x05, 0x1c, 0x04, 0x02, 0x07, 0xf3, 0x48, 0x1e, 0x5c, 0x08, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x07, 0xfe, 0x59, 0x30, 0x00, 0x07, + 0x8c, 0x00, 0x05, 0x1c, 0x04, 0x02, 0x07, 0xea, 0x59, 0xcc, 0x08, 0x08, + 0x59, 0x2c, 0x02, 0x04, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x48, 0x04, 0x02, 0x00, 0x0c, + 0x49, 0x7a, 0x58, 0x0b, 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0x08, 0x59, 0x2c, 0x04, 0x07, 0x80, 0x00, 0x01, 0xc0, + 0x04, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8f, 0x93, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x0d, 0x98, 0x90, 0x04, 0x21, 0xc0, + 0x48, 0x12, 0x58, 0x09, 0x41, 0x78, 0x20, 0x00, 0x82, 0x04, 0x05, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x00, 0x02, 0x59, 0xcc, 0x20, 0x09, + 0x82, 0x04, 0x35, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x04, 0x02, 0x00, 0x27, + 0x48, 0x1e, 0x5c, 0x08, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x18, 0x31, 0xc0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0d, 0x98, + 0x41, 0x78, 0x20, 0x00, 0x8c, 0x18, 0x35, 0x10, 0x04, 0x00, 0x00, 0x02, + 0x59, 0xcc, 0x20, 0x0b, 0x48, 0x12, 0x58, 0x0c, 0x41, 0x78, 0x00, 0x00, + 0x8c, 0x18, 0x35, 0x12, 0x04, 0x00, 0x00, 0x02, 0x59, 0xcc, 0x00, 0x0a, + 0x48, 0x02, 0x58, 0x0b, 0x80, 0x10, 0x0c, 0x00, 0x02, 0x00, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0d, 0x98, + 0x82, 0x04, 0x14, 0x80, 0x00, 0x00, 0x00, 0x1d, 0x04, 0x02, 0x10, 0x0c, + 0x4c, 0x50, 0x00, 0x00, 0x4c, 0x54, 0x00, 0x00, 0x83, 0xcc, 0xa4, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x83, 0x2c, 0xac, 0x00, 0x00, 0x00, 0x00, 0x0d, + 0x04, 0x01, 0xfb, 0x71, 0x5c, 0x00, 0xa8, 0x00, 0x5c, 0x00, 0xa0, 0x00, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x0d, 0x98, 0x04, 0x01, 0xfb, 0x15, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x0d, 0x98, 0x41, 0x2c, 0x78, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x1a, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x49, 0x2c, 0x78, 0x09, 0x84, 0x1c, 0x3d, 0x52, + 0x48, 0x1c, 0x7c, 0x08, 0x4a, 0x02, 0x5a, 0x04, 0x00, 0x00, 0x01, 0x03, + 0x48, 0x12, 0x58, 0x0a, 0x90, 0x04, 0x01, 0xc0, 0x48, 0x02, 0x58, 0x09, + 0x58, 0x3c, 0x04, 0x04, 0x58, 0x3c, 0x10, 0x05, 0x58, 0x3c, 0x22, 0x08, + 0x48, 0x02, 0x5c, 0x04, 0x48, 0x0a, 0x58, 0x05, 0x48, 0x12, 0x5a, 0x08, + 0x04, 0x01, 0xf7, 0xc7, 0x8c, 0x00, 0x05, 0x24, 0x04, 0x00, 0x07, 0x92, + 0x59, 0x32, 0x58, 0x08, 0x4c, 0x00, 0x00, 0x00, 0x59, 0x2c, 0x04, 0x08, + 0x8c, 0x00, 0x05, 0x1c, 0x5c, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x03, + 0x4a, 0x02, 0x60, 0x11, 0xff, 0xff, 0xff, 0xff, 0x84, 0x00, 0x05, 0x24, + 0x04, 0x01, 0xf7, 0x88, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xa8, 0x00, 0x36, + 0x48, 0x02, 0x62, 0x05, 0x59, 0x32, 0x58, 0x08, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x02, 0x59, 0x2c, 0x24, 0x08, 0x59, 0x30, 0x08, 0x07, + 0x49, 0x33, 0xc8, 0x57, 0x48, 0x07, 0xc8, 0x57, 0x59, 0x2c, 0x02, 0x04, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x48, 0x04, 0x02, 0x00, 0x04, 0x8c, 0x10, 0x25, 0x00, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x8f, 0xdb, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x8c, 0x04, 0x0d, 0x1e, 0x04, 0x00, 0x00, 0x27, + 0x41, 0x78, 0x08, 0x00, 0x49, 0x7a, 0x58, 0x09, 0x59, 0x2c, 0x1c, 0x09, + 0x59, 0x30, 0x00, 0x11, 0x59, 0x34, 0x12, 0x00, 0x49, 0x7a, 0x62, 0x05, + 0x8c, 0x08, 0x15, 0x0e, 0x04, 0x02, 0x00, 0x6e, 0x48, 0x07, 0xc8, 0x57, + 0x48, 0x06, 0x58, 0x0a, 0x80, 0x00, 0x0d, 0x40, 0x04, 0x02, 0x0f, 0x01, + 0x59, 0x30, 0x04, 0x02, 0x48, 0x02, 0x5c, 0x06, 0x48, 0x06, 0x58, 0x07, + 0x4a, 0x02, 0x5a, 0x04, 0x00, 0x00, 0x01, 0x03, 0x4c, 0x04, 0x00, 0x00, + 0x4c, 0x0c, 0x00, 0x00, 0x4c, 0x10, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8d, 0xef, 0x5c, 0x00, 0x20, 0x00, 0x5c, 0x00, 0x18, 0x00, + 0x5c, 0x00, 0x08, 0x00, 0x8c, 0x10, 0x25, 0x12, 0x04, 0x02, 0x00, 0x1a, + 0x4c, 0x0c, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x46, 0xdb, 0x5c, 0x00, 0x18, 0x00, + 0x8c, 0x0c, 0x1d, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x89, 0xf0, 0x48, 0x13, 0xc8, 0x57, + 0x8c, 0x10, 0x25, 0x18, 0x04, 0x00, 0x00, 0x4b, 0x41, 0x78, 0x08, 0x00, + 0x59, 0x2c, 0x1c, 0x09, 0x82, 0x0c, 0x05, 0x80, 0x00, 0x00, 0x10, 0x00, + 0x04, 0x00, 0x07, 0xd6, 0x8c, 0x10, 0x25, 0x12, 0x04, 0x00, 0x07, 0xd4, + 0x59, 0x2c, 0x78, 0x09, 0x58, 0x3c, 0x08, 0x0a, 0x58, 0x3c, 0x1c, 0x09, + 0x04, 0x01, 0xf7, 0xd0, 0x48, 0x07, 0xc8, 0x57, 0x59, 0x2c, 0x78, 0x09, + 0x59, 0x30, 0x04, 0x02, 0x59, 0x2c, 0x14, 0x04, 0x8c, 0x08, 0x15, 0x1e, + 0x04, 0x02, 0x00, 0x0d, 0x59, 0x2c, 0x12, 0x06, 0x48, 0x00, 0x7c, 0x06, + 0x48, 0x04, 0x78, 0x07, 0x48, 0x08, 0x7a, 0x06, 0x84, 0x10, 0x25, 0x12, + 0x48, 0x10, 0x7c, 0x08, 0x4c, 0x0c, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x07, 0x3b, 0x40, 0x3e, 0x58, 0x00, 0x04, 0x01, 0xfa, 0xd3, + 0x04, 0x01, 0xf7, 0xd9, 0x48, 0x02, 0x5c, 0x06, 0x48, 0x06, 0x58, 0x07, + 0x58, 0x3c, 0x08, 0x0c, 0x58, 0x3c, 0x00, 0x0b, 0x80, 0x04, 0x0c, 0x00, + 0x82, 0x04, 0x14, 0x80, 0x00, 0x00, 0x00, 0x1d, 0x04, 0x00, 0x10, 0x06, + 0x58, 0x3c, 0x10, 0x01, 0x48, 0x0a, 0x58, 0x01, 0x49, 0x78, 0x78, 0x01, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x82, 0x04, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x14, 0x4c, 0x0c, 0x00, 0x00, 0x4c, 0x50, 0x00, 0x00, + 0x4c, 0x54, 0x00, 0x00, 0x82, 0x3c, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x83, 0x2c, 0xac, 0x00, 0x00, 0x00, 0x00, 0x08, 0x4c, 0x10, 0x00, 0x00, + 0x4c, 0x3c, 0x00, 0x00, 0x04, 0x01, 0xfa, 0xd4, 0x5c, 0x00, 0x78, 0x00, + 0x5c, 0x00, 0x20, 0x00, 0x5c, 0x00, 0xa8, 0x00, 0x5c, 0x00, 0xa0, 0x00, + 0x84, 0x10, 0x25, 0x12, 0x48, 0x12, 0x5c, 0x08, 0x40, 0x3e, 0x58, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x3b, 0x42, 0x03, 0x40, 0x00, + 0x00, 0x10, 0xac, 0x71, 0x59, 0xa1, 0xd8, 0x1e, 0x80, 0xed, 0xd9, 0xc0, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x48, 0xef, 0xc8, 0x57, + 0x58, 0xec, 0x00, 0x09, 0x48, 0x03, 0xc8, 0x57, 0x08, 0x01, 0xf8, 0x00, + 0x04, 0x01, 0xf7, 0xac, 0x49, 0x33, 0xc8, 0x57, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x30, 0x14, 0x14, 0x48, 0x0b, 0xc8, 0x57, 0x8c, 0x08, 0x15, 0x1c, + 0x04, 0x02, 0x00, 0x0e, 0x80, 0x00, 0x05, 0x40, 0x48, 0x03, 0xc8, 0x57, + 0x04, 0x00, 0x07, 0x8d, 0x80, 0x04, 0x2c, 0x80, 0x04, 0x02, 0x17, 0x8b, + 0x8c, 0x08, 0x15, 0x14, 0x04, 0x02, 0x00, 0x05, 0x59, 0x2c, 0x08, 0x0f, + 0x48, 0x07, 0xc8, 0x57, 0x80, 0x04, 0x04, 0x80, 0x48, 0x02, 0x60, 0x16, + 0x84, 0x08, 0x15, 0x5c, 0x48, 0x0a, 0x64, 0x14, 0x59, 0x30, 0x10, 0x07, + 0x84, 0x08, 0x15, 0x1e, 0x48, 0x0a, 0x60, 0x07, 0x4c, 0x10, 0x00, 0x00, + 0x4c, 0x3c, 0x00, 0x00, 0x4d, 0x40, 0x00, 0x00, 0x59, 0x2e, 0x82, 0x06, + 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8d, 0xef, 0x49, 0x42, 0x5a, 0x06, 0x5c, 0x02, 0x80, 0x00, + 0x5c, 0x00, 0x78, 0x00, 0x5c, 0x00, 0x20, 0x00, 0x49, 0x7a, 0x58, 0x09, + 0x8c, 0x10, 0x25, 0x12, 0x04, 0x00, 0x00, 0x06, 0x4d, 0x2c, 0x00, 0x00, + 0x40, 0x3e, 0x58, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x3b, + 0x5c, 0x02, 0x58, 0x00, 0x82, 0x10, 0x25, 0x00, 0xff, 0xff, 0xed, 0xff, + 0x48, 0x12, 0x5c, 0x08, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x8a, 0x2e, + 0x59, 0x32, 0x58, 0x08, 0x59, 0x2c, 0x04, 0x08, 0x8c, 0x00, 0x05, 0x18, + 0x04, 0x00, 0x00, 0x04, 0x41, 0x2d, 0xf8, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x0d, 0xb1, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, + 0x59, 0x32, 0x58, 0x08, 0x49, 0x7a, 0x58, 0x09, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x4a, 0x02, 0x5a, 0x04, 0x00, 0x00, 0x01, 0x03, + 0x59, 0x30, 0x08, 0x11, 0x48, 0x07, 0xc8, 0x57, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x02, 0x00, 0x0a, 0x48, 0x06, 0x58, 0x07, 0x59, 0x30, 0x0c, 0x02, + 0x48, 0x06, 0x5c, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x46, 0xdb, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x59, 0x34, 0x02, 0x00, 0x8c, 0x00, 0x05, 0x0e, + 0x04, 0x02, 0x00, 0x05, 0x59, 0x30, 0x08, 0x11, 0x04, 0x01, 0xfe, 0x4a, + 0x48, 0x06, 0x58, 0x07, 0x04, 0x01, 0xf7, 0xf2, 0x59, 0x2c, 0x02, 0x08, + 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x02, 0x07, 0xfa, 0x49, 0x33, 0xc8, 0x57, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x8a, 0x2e, 0x49, 0x33, 0xc8, 0x57, + 0x59, 0x32, 0x58, 0x08, 0x81, 0x2e, 0x59, 0xc0, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x59, 0x2c, 0x02, 0x0a, 0x8c, 0x00, 0x05, 0x02, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x4a, 0x02, 0x62, 0x06, + 0x00, 0x00, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x30, 0x00, 0x1c, + 0x80, 0x00, 0x01, 0xc0, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x90, 0xa2, + 0x59, 0x30, 0x00, 0x07, 0x49, 0x33, 0xc8, 0x57, 0x48, 0x03, 0xc8, 0x57, + 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x00, 0x00, 0x37, 0x8c, 0x00, 0x05, 0x00, + 0x04, 0x00, 0x00, 0x29, 0x8c, 0x00, 0x05, 0x1c, 0x04, 0x00, 0x00, 0x0a, + 0x84, 0x00, 0x05, 0x00, 0x48, 0x02, 0x60, 0x07, 0x59, 0x32, 0x58, 0x08, + 0x59, 0x2c, 0x3c, 0x08, 0x48, 0x1f, 0xc8, 0x57, 0x84, 0x1c, 0x3d, 0x58, + 0x48, 0x1e, 0x5c, 0x08, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x08, 0x1b, + 0x59, 0x32, 0x58, 0x08, 0x59, 0x2c, 0x3c, 0x08, 0x84, 0x1c, 0x3d, 0x58, + 0x59, 0x30, 0x00, 0x07, 0x8c, 0x00, 0x05, 0x1c, 0x04, 0x02, 0x07, 0xf2, + 0x48, 0x1e, 0x5c, 0x08, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x07, 0xfe, + 0x59, 0x30, 0x00, 0x07, 0x8c, 0x00, 0x05, 0x1c, 0x04, 0x02, 0x07, 0xe9, + 0x59, 0x2c, 0x02, 0x04, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x48, 0x04, 0x02, 0x00, 0x03, + 0x49, 0x7a, 0x58, 0x0b, 0x04, 0x01, 0xf0, 0x02, 0x49, 0x7a, 0x58, 0x09, + 0x48, 0x1e, 0x5c, 0x08, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x0d, 0x98, 0x8c, 0x00, 0x05, 0x24, + 0x04, 0x00, 0x07, 0xd9, 0x59, 0x32, 0x58, 0x08, 0x4c, 0x00, 0x00, 0x00, + 0x59, 0x2c, 0x04, 0x08, 0x8c, 0x00, 0x05, 0x1c, 0x5c, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x03, 0x4a, 0x02, 0x60, 0x11, 0xff, 0xff, 0xff, 0xff, + 0x84, 0x00, 0x05, 0x24, 0x04, 0x01, 0xf7, 0xcf, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x41, 0x78, 0x08, 0x00, 0x83, 0x38, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x58, 0x04, 0x02, 0x10, 0x0b, 0x83, 0x38, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x40, 0x04, 0x00, 0x10, 0x08, 0x4d, 0x2c, 0x00, 0x00, + 0x59, 0x32, 0x58, 0x08, 0x81, 0x2e, 0x59, 0xc0, 0x0c, 0x02, 0x08, 0x06, + 0x5c, 0x02, 0x58, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x49, 0x3b, 0xc8, 0x57, 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x81, 0xaa, + 0x00, 0x10, 0x81, 0xaa, 0x00, 0x10, 0x81, 0xaa, 0x00, 0x10, 0x81, 0xaa, + 0x00, 0x10, 0x81, 0xaa, 0x00, 0x10, 0x81, 0xac, 0x00, 0x10, 0x81, 0xaa, + 0x00, 0x10, 0x81, 0xaa, 0x00, 0x10, 0x81, 0xaa, 0x00, 0x10, 0x81, 0xaa, + 0x00, 0x10, 0x81, 0xaa, 0x00, 0x10, 0x81, 0xaa, 0x00, 0x10, 0x81, 0xaa, + 0x00, 0x10, 0x81, 0xaa, 0x00, 0x10, 0x81, 0xaa, 0x00, 0x10, 0x81, 0xaa, + 0x00, 0x10, 0x81, 0xaa, 0x00, 0x10, 0x81, 0xaa, 0x00, 0x10, 0x81, 0xaa, + 0x00, 0x10, 0x81, 0xaa, 0x00, 0x10, 0x81, 0xaf, 0x00, 0x10, 0x81, 0xaa, + 0x00, 0x10, 0x81, 0xaa, 0x00, 0x10, 0x81, 0xaa, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x59, 0xcc, 0x08, 0x08, 0x49, 0x7a, 0x58, 0x07, + 0x48, 0x07, 0xc8, 0x57, 0x59, 0x30, 0x04, 0x02, 0x48, 0x02, 0x5c, 0x06, + 0x4a, 0x02, 0x5a, 0x04, 0x00, 0x00, 0x01, 0x03, 0x90, 0x04, 0x01, 0xc0, + 0x48, 0x02, 0x58, 0x09, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x04, 0x09, 0xc0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x59, 0xcc, 0x00, 0x09, 0x48, 0x02, 0x58, 0x0a, 0x82, 0x04, 0x25, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x02, 0x59, 0xcc, 0x20, 0x0b, + 0x48, 0x12, 0x58, 0x0c, 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x04, 0x00, 0x00, 0x02, 0x59, 0xcc, 0x00, 0x0a, 0x48, 0x02, 0x58, 0x0b, + 0x80, 0x10, 0x0c, 0x00, 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x82, 0x04, 0x14, 0x80, + 0x00, 0x00, 0x00, 0x1d, 0x04, 0x00, 0x10, 0x06, 0x59, 0x2c, 0x04, 0x04, + 0x8c, 0x00, 0x05, 0x1e, 0x04, 0x00, 0x00, 0x0e, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x4c, 0x50, 0x00, 0x00, 0x4c, 0x54, 0x00, 0x00, + 0x83, 0xcc, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x83, 0x2c, 0xac, 0x00, + 0x00, 0x00, 0x00, 0x0d, 0x04, 0x01, 0xf9, 0xc3, 0x5c, 0x00, 0xa8, 0x00, + 0x5c, 0x00, 0xa0, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x04, 0x01, 0xf9, 0x67, 0x04, 0x01, 0xf1, 0xa2, 0x83, 0x38, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x93, 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x83, 0x38, 0x04, 0x80, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x81, 0xf8, + 0x00, 0x10, 0x81, 0xf6, 0x00, 0x10, 0x81, 0xf6, 0x00, 0x10, 0x81, 0xff, + 0x00, 0x10, 0x81, 0xf6, 0x00, 0x10, 0x81, 0xf6, 0x00, 0x10, 0x81, 0xf6, + 0x00, 0x10, 0x81, 0xf6, 0x00, 0x10, 0x81, 0xf6, 0x00, 0x10, 0x81, 0xf6, + 0x00, 0x10, 0x81, 0xf6, 0x00, 0x10, 0x81, 0xf6, 0x00, 0x10, 0x81, 0xf6, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x01, 0x49, 0x3a, 0x64, 0x03, 0x42, 0x00, 0x08, 0x00, + 0x80, 0x00, 0x00, 0x40, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0x5c, + 0x49, 0x33, 0xc8, 0x57, 0x59, 0xcc, 0x14, 0x04, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8c, 0x55, 0x04, 0x00, 0x00, 0x1b, 0x59, 0x1c, 0x02, 0x03, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x17, + 0x59, 0x1c, 0x00, 0x09, 0x81, 0x34, 0x05, 0x80, 0x04, 0x02, 0x00, 0x14, + 0x4d, 0x30, 0x00, 0x00, 0x4d, 0x1c, 0x00, 0x00, 0x41, 0x1e, 0x60, 0x00, + 0x04, 0x01, 0xf9, 0xc6, 0x5c, 0x02, 0x38, 0x00, 0x5c, 0x02, 0x60, 0x00, + 0x04, 0x00, 0x00, 0x0b, 0x59, 0xcc, 0x00, 0x05, 0x8c, 0x00, 0x05, 0x00, + 0x04, 0x02, 0x00, 0x03, 0x04, 0x01, 0xf9, 0x90, 0x04, 0x01, 0xf0, 0x03, + 0x4a, 0x02, 0x3a, 0x03, 0x00, 0x00, 0x00, 0x02, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x86, 0x04, 0x01, 0xf0, 0x05, 0x04, 0x01, 0xf9, 0xaa, + 0x04, 0x00, 0x07, 0xf5, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x87, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x08, 0x00, + 0x80, 0x00, 0x00, 0x40, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x5c, + 0x59, 0x34, 0x02, 0x00, 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x00, 0x00, 0x0d, + 0x59, 0xcc, 0x14, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8c, 0x55, + 0x04, 0x00, 0x00, 0x09, 0x59, 0x1c, 0x04, 0x14, 0x8c, 0x00, 0x05, 0x1a, + 0x04, 0x00, 0x00, 0x06, 0x4d, 0x30, 0x00, 0x00, 0x41, 0x1e, 0x60, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8a, 0x43, 0x5c, 0x02, 0x60, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x13, + 0x04, 0x02, 0x00, 0x0b, 0x59, 0x30, 0x04, 0x03, 0x48, 0x03, 0xc8, 0x57, + 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x86, 0x04, 0x00, 0x00, 0x12, + 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x87, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x04, 0x01, 0xf0, 0x0d, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x27, 0x04, 0x00, 0x00, 0x05, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x14, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x49, 0x3b, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0xc4, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x71, 0x9c, 0x49, 0x33, 0xc8, 0x57, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x71, 0x9c, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x13, 0x04, 0x02, 0x00, 0x06, 0x59, 0x30, 0x04, 0x03, + 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x85, + 0x0c, 0x01, 0xf0, 0x4d, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x27, + 0x04, 0x02, 0x00, 0x41, 0x49, 0x33, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x63, 0xc4, 0x4d, 0x3c, 0x00, 0x00, 0x41, 0x7a, 0x78, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0xa0, 0x5c, 0x02, 0x78, 0x00, + 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x15, 0x41, 0x78, 0x28, 0x00, + 0x42, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x03, 0x42, 0x02, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x29, 0x4d, 0x40, 0x00, 0x00, 0x4d, 0x44, 0x00, 0x00, + 0x59, 0x36, 0x8c, 0x03, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x90, 0xb2, + 0x5c, 0x02, 0x88, 0x00, 0x5c, 0x02, 0x80, 0x00, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x33, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x3d, 0x04, 0x00, 0x00, 0x0c, + 0x4d, 0x2c, 0x00, 0x00, 0x59, 0x32, 0x58, 0x08, 0x4a, 0x02, 0x5a, 0x04, + 0x00, 0x00, 0x01, 0x03, 0x59, 0x30, 0x04, 0x02, 0x48, 0x02, 0x5c, 0x06, + 0x49, 0x7a, 0x58, 0x09, 0x49, 0x42, 0x5a, 0x06, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x5c, 0x02, 0x58, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x89, 0x42, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x89, 0x04, 0x00, 0x00, 0x05, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x8a, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x72, 0x0c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x67, 0xa7, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x72, 0x0c, 0x59, 0x30, 0x0a, 0x03, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x2a, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0c, 0x04, 0x00, 0x00, 0x27, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x14, 0x04, 0x02, 0x07, 0xea, 0x49, 0x33, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0xc4, 0x42, 0x02, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x04, 0x01, 0xf7, 0xd2, 0x00, 0x10, 0x82, 0xb5, + 0x00, 0x10, 0x82, 0xb3, 0x00, 0x10, 0x82, 0xb3, 0x00, 0x10, 0x82, 0xb3, + 0x00, 0x10, 0x82, 0xb3, 0x00, 0x10, 0x82, 0xb3, 0x00, 0x10, 0x82, 0xbb, + 0x00, 0x10, 0x82, 0xb3, 0x00, 0x10, 0x82, 0xb3, 0x00, 0x10, 0x82, 0xb3, + 0x00, 0x10, 0x82, 0xb3, 0x00, 0x10, 0x82, 0xb3, 0x00, 0x10, 0x82, 0xb3, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x49, 0x33, 0xc8, 0x57, + 0x59, 0xa8, 0x00, 0x34, 0x48, 0x02, 0x62, 0x06, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x0a, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, + 0x59, 0xa8, 0x00, 0x34, 0x48, 0x02, 0x62, 0x06, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x0c, 0x1c, 0x01, 0xf0, 0x00, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x89, 0x04, 0x00, 0x00, 0x08, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x8a, 0x04, 0x00, 0x00, 0x32, 0x49, 0x33, 0xc8, 0x57, + 0x49, 0x3b, 0xc8, 0x57, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x72, 0x0c, + 0x49, 0x33, 0xc8, 0x57, 0x59, 0x32, 0x58, 0x08, 0x59, 0x30, 0x0a, 0x1d, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x00, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x46, 0xdb, 0x04, 0x01, 0xf0, 0x0c, + 0x59, 0x30, 0x02, 0x1d, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x02, 0x00, 0x08, 0x59, 0x30, 0x0c, 0x16, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x39, 0x04, 0x00, 0x00, 0x2c, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x35, 0x04, 0x00, 0x00, 0x29, 0x4c, 0x5c, 0x00, 0x00, + 0x41, 0x30, 0xb8, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, + 0x04, 0x00, 0x00, 0x10, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x1e, 0x59, 0xcc, 0x0c, 0x07, + 0x48, 0x06, 0x64, 0x19, 0x59, 0xcc, 0x0a, 0x07, 0x48, 0x06, 0x62, 0x19, + 0x49, 0x36, 0x60, 0x09, 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x01, + 0x42, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, 0x40, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0x5c, 0x40, 0x5e, 0x60, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x5c, 0x00, 0xb8, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x59, 0x30, 0x02, 0x1d, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x02, 0x00, 0x42, 0x59, 0x30, 0x0c, 0x16, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x35, 0x04, 0x00, 0x00, 0x07, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x1e, 0x04, 0x00, 0x00, 0x04, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x39, 0x04, 0x02, 0x00, 0x38, + 0x49, 0x33, 0xc8, 0x57, 0x4c, 0x5c, 0x00, 0x00, 0x4c, 0x60, 0x00, 0x00, + 0x4d, 0x1c, 0x00, 0x00, 0x41, 0x30, 0xb8, 0x00, 0x40, 0x04, 0xc0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8b, 0xff, 0x04, 0x02, 0x00, 0x29, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, 0x04, 0x00, 0x00, 0x26, + 0x49, 0x1f, 0xc8, 0x57, 0x49, 0x33, 0xc8, 0x57, 0x82, 0x60, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x35, 0x04, 0x00, 0x00, 0x04, 0x82, 0x60, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x39, 0x04, 0x02, 0x00, 0x02, 0x49, 0x32, 0x38, 0x1c, + 0x48, 0x62, 0x64, 0x03, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x01, 0x58, 0x5c, 0x08, 0x09, + 0x48, 0x07, 0xc8, 0x57, 0x48, 0x06, 0x60, 0x09, 0x58, 0x5c, 0x0c, 0x15, + 0x48, 0x07, 0xc8, 0x57, 0x48, 0x06, 0x64, 0x15, 0x58, 0x5c, 0x0a, 0x15, + 0x48, 0x07, 0xc8, 0x57, 0x48, 0x06, 0x62, 0x15, 0x58, 0x5c, 0x0a, 0x16, + 0x48, 0x07, 0xc8, 0x57, 0x48, 0x06, 0x62, 0x16, 0x58, 0x5c, 0x0c, 0x19, + 0x48, 0x07, 0xc8, 0x57, 0x48, 0x06, 0x64, 0x19, 0x58, 0x5c, 0x0a, 0x19, + 0x48, 0x07, 0xc8, 0x57, 0x48, 0x06, 0x62, 0x19, 0x49, 0x1e, 0x60, 0x1e, + 0x42, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, 0x40, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0x5c, 0x40, 0x5e, 0x60, 0x00, 0x5c, 0x02, 0x38, 0x00, + 0x5c, 0x00, 0xc0, 0x00, 0x5c, 0x00, 0xb8, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x59, 0x30, 0x02, 0x1d, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x46, 0xdb, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x48, 0x03, 0xc8, 0x56, + 0x4c, 0x50, 0x00, 0x00, 0x4c, 0x54, 0x00, 0x00, 0x41, 0x2c, 0x78, 0x00, + 0x4c, 0x3c, 0x00, 0x00, 0x42, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x82, 0x04, 0x04, 0x80, 0x00, 0x00, 0x01, 0x01, 0x04, 0x00, 0x10, 0x03, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40, 0x04, 0x30, 0x00, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x83, 0xcc, 0xa4, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x83, 0x2c, 0xac, 0x00, 0x00, 0x00, 0x00, 0x0d, + 0x04, 0x01, 0xf8, 0x44, 0x82, 0x18, 0x34, 0x80, 0x00, 0x00, 0x00, 0x1c, + 0x59, 0x2e, 0x58, 0x01, 0x81, 0x2e, 0x59, 0xc0, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x07, 0x3b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x1a, + 0x04, 0x00, 0x00, 0x17, 0x80, 0x14, 0x28, 0x00, 0x4a, 0x02, 0x5a, 0x04, + 0x00, 0x00, 0x01, 0x10, 0x49, 0x7a, 0x5c, 0x04, 0x49, 0x2c, 0x78, 0x01, + 0x82, 0x18, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x3d, 0x04, 0x02, 0x10, 0x06, + 0x40, 0x18, 0x08, 0x00, 0x83, 0x2c, 0xac, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x01, 0xf8, 0x2f, 0x04, 0x01, 0xf0, 0x0a, 0x82, 0x18, 0x34, 0x80, + 0x00, 0x00, 0x00, 0x3c, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x41, 0x2c, 0x78, 0x00, 0x83, 0x2c, 0xac, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x01, 0xf8, 0x26, 0x04, 0x01, 0xf7, 0xe8, 0x5c, 0x00, 0x78, 0x00, + 0x84, 0x14, 0x29, 0xc0, 0x82, 0x14, 0x2d, 0x40, 0x00, 0x00, 0x00, 0x03, + 0x48, 0x14, 0x7a, 0x04, 0x40, 0x3e, 0x58, 0x00, 0x5c, 0x00, 0xa8, 0x00, + 0x5c, 0x00, 0xa0, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x2f, 0xc8, 0x57, + 0x81, 0x2e, 0x59, 0xc0, 0x04, 0x00, 0x00, 0x0f, 0x4d, 0x2c, 0x00, 0x00, + 0x4c, 0x3c, 0x00, 0x00, 0x59, 0x2c, 0x78, 0x01, 0x80, 0x3c, 0x79, 0xc0, + 0x04, 0x00, 0x00, 0x06, 0x49, 0x7a, 0x58, 0x01, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x40, 0x3e, 0x58, 0x00, 0x04, 0x01, 0xf7, 0xf9, + 0x5c, 0x00, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x4c, 0x58, 0x00, 0x00, 0x82, 0x04, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x80, 0x04, 0xb1, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, + 0x5c, 0x00, 0xb0, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x4c, 0x58, 0x00, 0x00, 0x82, 0x04, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x80, 0x04, 0xb1, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, + 0x5c, 0x00, 0xb0, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x1c, 0x0c, 0x06, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x04, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, 0x04, 0x02, 0x00, 0x1a, + 0x4d, 0x30, 0x00, 0x00, 0x4d, 0x2c, 0x00, 0x00, 0x41, 0x1e, 0x60, 0x00, + 0x59, 0x32, 0x58, 0x08, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x3d, + 0x04, 0x00, 0x00, 0x0f, 0x4d, 0x40, 0x00, 0x00, 0x42, 0x02, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x13, 0x59, 0x2c, 0x0a, 0x08, 0x84, 0x04, 0x0d, 0x54, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4a, 0x8e, 0x5c, 0x02, 0x80, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8d, 0xef, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x89, 0x42, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x71, 0x9c, 0x5c, 0x02, 0x58, 0x00, + 0x5c, 0x02, 0x60, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xcc, 0x00, 0x05, + 0x8c, 0x00, 0x05, 0x00, 0x04, 0x02, 0x00, 0x0b, 0x59, 0x1c, 0x04, 0x06, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, 0x04, 0x02, 0x00, 0x07, + 0x59, 0x1c, 0x0c, 0x03, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x85, + 0x04, 0x00, 0x00, 0x03, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x8b, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x4d, 0x3c, 0x00, 0x00, + 0x42, 0x02, 0x78, 0x00, 0x00, 0x00, 0x00, 0x02, 0x59, 0x30, 0x04, 0x06, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x12, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf8, 0x0a, 0x5c, 0x02, 0x78, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x59, 0x30, 0x04, 0x06, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x12, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x83, 0xfe, + 0x00, 0x10, 0x83, 0xfb, 0x00, 0x10, 0x83, 0xfb, 0x00, 0x10, 0x84, 0x26, + 0x00, 0x10, 0x83, 0xf9, 0x00, 0x10, 0x83, 0xfb, 0x00, 0x10, 0x84, 0x17, + 0x00, 0x10, 0x83, 0xfb, 0x00, 0x10, 0x83, 0xf9, 0x00, 0x10, 0x61, 0xee, + 0x00, 0x10, 0x83, 0xfb, 0x00, 0x10, 0x83, 0xfb, 0x00, 0x10, 0x83, 0xfb, + 0x00, 0x10, 0x83, 0xf9, 0x00, 0x10, 0x83, 0xf9, 0x00, 0x10, 0x83, 0xf9, + 0x00, 0x10, 0x84, 0xf8, 0x00, 0x10, 0x83, 0xfb, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x48, 0x03, 0xc8, 0x56, 0x80, 0x00, 0x05, 0x80, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x8d, 0x3e, 0x7d, 0x02, + 0x04, 0x02, 0x00, 0x16, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x3d, + 0x04, 0x00, 0x00, 0x0f, 0x59, 0x32, 0x58, 0x08, 0x41, 0x78, 0x08, 0x00, + 0x4d, 0x40, 0x00, 0x00, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4a, 0x8e, 0x5c, 0x02, 0x80, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8d, 0xef, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x89, 0xeb, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x71, 0x9c, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x45, 0xf8, 0x04, 0x02, 0x00, 0x0c, + 0x4d, 0x40, 0x00, 0x00, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9a, 0x5d, 0x4a, 0x02, 0x64, 0x06, + 0x00, 0x00, 0x00, 0x06, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x07, + 0x5c, 0x02, 0x80, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x76, 0x4d, 0xf0, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0xba, 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x0e, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf0, 0x01, + 0x00, 0x10, 0x84, 0x40, 0x00, 0x10, 0x84, 0xad, 0x00, 0x10, 0x84, 0x57, + 0x00, 0x10, 0x84, 0xc1, 0x00, 0x10, 0x84, 0xa8, 0x00, 0x10, 0x84, 0x3e, + 0x00, 0x10, 0x84, 0x40, 0x00, 0x10, 0x84, 0x40, 0x00, 0x10, 0x84, 0x44, + 0x00, 0x10, 0x84, 0x40, 0x00, 0x10, 0x84, 0x40, 0x00, 0x10, 0x84, 0x40, + 0x00, 0x10, 0x84, 0x40, 0x00, 0x10, 0x84, 0x57, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x5c, 0x03, 0xe0, 0x00, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x64, 0x63, 0x04, 0x01, 0xf7, 0xb8, 0x5c, 0x03, 0xe0, 0x00, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x64, 0x63, 0x59, 0x30, 0x04, 0x06, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x07, 0xb4, + 0x59, 0x30, 0x02, 0x03, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0d, + 0x04, 0x00, 0x07, 0xb0, 0x8d, 0x3e, 0x7d, 0x02, 0x04, 0x02, 0x07, 0xae, + 0x4d, 0x34, 0x00, 0x00, 0x59, 0x32, 0x68, 0x09, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x46, 0xdb, 0x5c, 0x02, 0x68, 0x00, 0x04, 0x01, 0xf7, 0xa8, + 0x59, 0x30, 0x00, 0x04, 0x84, 0x00, 0x05, 0x5c, 0x48, 0x02, 0x60, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x63, 0x59, 0x30, 0x04, 0x06, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x06, 0x04, 0x00, 0x00, 0x43, + 0x8d, 0x3e, 0x7d, 0x02, 0x04, 0x02, 0x00, 0x41, 0x49, 0x7a, 0x62, 0x1d, + 0x59, 0x30, 0x02, 0x03, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0d, + 0x04, 0x00, 0x00, 0x03, 0x4a, 0x02, 0x62, 0x1d, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x01, 0xfb, 0xd4, 0x04, 0x00, 0x00, 0x24, 0x4d, 0x2c, 0x00, 0x00, + 0x4d, 0x40, 0x00, 0x00, 0x59, 0x32, 0x58, 0x08, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x89, 0xeb, 0x59, 0x2c, 0x04, 0x08, 0x8c, 0x00, 0x05, 0x12, + 0x04, 0x00, 0x00, 0x09, 0x4d, 0x2c, 0x00, 0x00, 0x84, 0x00, 0x05, 0x12, + 0x48, 0x02, 0x5c, 0x08, 0x59, 0x2c, 0x08, 0x09, 0x40, 0x06, 0x58, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x3b, 0x5c, 0x02, 0x58, 0x00, + 0x4d, 0x40, 0x00, 0x00, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x59, 0x2c, 0x0a, 0x08, 0x8c, 0x04, 0x0d, 0x0e, 0x04, 0x00, 0x00, 0x04, + 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf0, 0x01, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4a, 0x8e, 0x5c, 0x02, 0x80, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8d, 0xef, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x49, 0x7a, 0x60, 0x08, 0x5c, 0x02, 0x80, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x8d, 0x3e, 0x7d, 0x00, 0x04, 0x00, 0x00, 0x09, + 0x4d, 0x34, 0x00, 0x00, 0x59, 0x32, 0x68, 0x09, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x46, 0xdb, 0x5c, 0x02, 0x68, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x71, 0x9c, 0x04, 0x01, 0xf0, 0x0b, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x85, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x09, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x02, 0x42, 0x00, 0x08, 0x00, + 0x80, 0x00, 0x40, 0x4b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x5c, + 0x5c, 0x03, 0xe0, 0x00, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x64, 0x76, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x63, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x0d, 0xdd, 0x04, 0x01, 0xf7, 0xab, 0x59, 0x8c, 0x00, 0x0d, + 0x81, 0x30, 0x05, 0x80, 0x04, 0x02, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x66, 0xd5, 0x04, 0x02, 0x00, 0x1d, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xcc, 0xce, 0x80, 0xc4, 0x00, 0x40, 0x04, 0x02, 0x00, 0x06, + 0x59, 0x30, 0x0c, 0x03, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x40, + 0x04, 0x00, 0x07, 0x8a, 0x04, 0x01, 0xf7, 0x9c, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x63, 0x79, 0x04, 0x00, 0x00, 0x11, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x04, 0x01, 0xf8, 0x14, 0x04, 0x02, 0x00, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x66, 0xa5, 0x04, 0x02, 0x00, 0x0a, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xcb, 0x83, 0x80, 0xc4, 0x00, 0x40, + 0x04, 0x02, 0x07, 0xf3, 0x59, 0x30, 0x0c, 0x03, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x40, 0x04, 0x00, 0x07, 0x77, 0x04, 0x01, 0xf7, 0x89, + 0x59, 0x30, 0x02, 0x03, 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x0e, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf7, 0x5c, + 0x41, 0x7a, 0x30, 0x00, 0x42, 0x03, 0x20, 0x00, 0x00, 0x00, 0xbf, 0x32, + 0x59, 0x90, 0x00, 0x04, 0x81, 0x30, 0x05, 0x80, 0x04, 0x00, 0x00, 0x09, + 0x83, 0x93, 0x24, 0x00, 0x00, 0x00, 0x00, 0x10, 0x81, 0x1a, 0x30, 0x00, + 0x83, 0x18, 0x04, 0x80, 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x17, 0xf8, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x30, 0x00, 0x04, 0x8c, 0x00, 0x05, 0x3e, 0x04, 0x00, 0x00, 0x10, + 0x8c, 0x00, 0x05, 0x0c, 0x04, 0x02, 0x00, 0x0e, 0x8c, 0x00, 0x05, 0x16, + 0x04, 0x02, 0x00, 0x06, 0x82, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x1f, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x05, 0x04, 0x02, 0x00, 0x04, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x01, 0xf0, 0x05, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x02, + 0x59, 0x30, 0x02, 0x03, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x76, 0x4d, 0xf0, 0x00, 0x00, + 0x59, 0x30, 0x02, 0x03, 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x0e, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf0, 0x01, + 0x00, 0x10, 0x85, 0x12, 0x00, 0x10, 0x85, 0x2f, 0x00, 0x10, 0x85, 0x16, + 0x00, 0x10, 0x85, 0x10, 0x00, 0x10, 0x85, 0x10, 0x00, 0x10, 0x85, 0x10, + 0x00, 0x10, 0x85, 0x10, 0x00, 0x10, 0x85, 0x10, 0x00, 0x10, 0x85, 0x10, + 0x00, 0x10, 0x85, 0x10, 0x00, 0x10, 0x85, 0x10, 0x00, 0x10, 0x85, 0x10, + 0x00, 0x10, 0x85, 0x10, 0x00, 0x10, 0x85, 0x10, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x5c, 0x03, 0xe0, 0x00, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x64, 0x63, 0x04, 0x01, 0xf6, 0xe6, 0x5c, 0x03, 0xe0, 0x00, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x64, 0x63, 0x4d, 0x2c, 0x00, 0x00, + 0x59, 0x32, 0x58, 0x08, 0x59, 0x30, 0x04, 0x03, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x52, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x11, 0x4d, + 0x04, 0x01, 0xfb, 0x1d, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x49, 0x75, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x71, 0x9c, 0x5c, 0x02, 0x58, 0x00, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x8c, 0x00, 0x0d, 0x81, 0x30, 0x05, 0x80, 0x04, 0x02, 0x00, 0x1b, + 0x59, 0x30, 0x00, 0x04, 0x8c, 0x00, 0x05, 0x20, 0x04, 0x00, 0x00, 0x04, + 0x84, 0x00, 0x05, 0x20, 0x48, 0x02, 0x60, 0x04, 0x04, 0x01, 0xf0, 0x1b, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0xaf, 0xc4, 0x50, 0x08, 0x10, 0x00, + 0x58, 0x08, 0x00, 0x02, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x01, 0x00, + 0x04, 0x00, 0x00, 0x0b, 0x58, 0x08, 0x00, 0x0c, 0x81, 0x30, 0x05, 0x80, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xcc, 0xce, 0x80, 0xc4, 0x00, 0x40, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x04, 0x01, 0xf7, 0xce, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x66, 0xd5, 0x04, 0x02, 0x00, 0x0d, 0x59, 0x30, 0x00, 0x04, + 0x8c, 0x00, 0x05, 0x20, 0x04, 0x00, 0x00, 0x04, 0x84, 0x00, 0x05, 0x20, + 0x48, 0x02, 0x60, 0x04, 0x04, 0x01, 0xf7, 0xc5, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xcc, 0xce, 0x80, 0xc4, 0x00, 0x40, 0x04, 0x00, 0x07, 0xc1, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0x30, 0x02, 0x03, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf7, 0xa5, 0x59, 0x30, 0x04, 0x06, + 0x49, 0x33, 0xc8, 0x57, 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x0c, 0x80, + 0x00, 0x00, 0x00, 0x12, 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x85, 0x7d, 0x00, 0x10, 0x86, 0x4d, + 0x00, 0x10, 0x87, 0x76, 0x00, 0x10, 0x85, 0x89, 0x00, 0x10, 0x71, 0x9c, + 0x00, 0x10, 0x85, 0x7d, 0x00, 0x10, 0x9a, 0x4d, 0x00, 0x02, 0x07, 0xbb, + 0x00, 0x10, 0x86, 0x4d, 0x00, 0x10, 0x61, 0xcb, 0x00, 0x10, 0x87, 0xd6, + 0x00, 0x10, 0x85, 0x78, 0x00, 0x10, 0x85, 0x78, 0x00, 0x10, 0x85, 0x78, + 0x00, 0x10, 0x85, 0x78, 0x00, 0x10, 0x85, 0x78, 0x00, 0x10, 0x8f, 0x3e, + 0x00, 0x10, 0x8f, 0x3e, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x04, 0x01, 0xfb, 0xef, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x78, 0xc2, + 0x1c, 0x01, 0xf0, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x76, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0xc4, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x63, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x4a, 0x02, 0x62, 0x06, 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x41, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x4d, 0x2c, 0x00, 0x00, 0x4d, 0x40, 0x00, 0x00, + 0x41, 0x7a, 0x58, 0x00, 0x04, 0x01, 0xfa, 0xad, 0x04, 0x00, 0x00, 0x07, + 0x59, 0x32, 0x58, 0x08, 0x59, 0x2c, 0x02, 0x08, 0x84, 0x00, 0x05, 0x4c, + 0x48, 0x02, 0x5a, 0x08, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x76, 0x04, 0x01, 0xff, 0x4a, + 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x0e, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf8, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x63, 0x5c, 0x02, 0x80, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x86, 0x4c, + 0x00, 0x10, 0x85, 0xb6, 0x00, 0x10, 0x85, 0xc7, 0x00, 0x10, 0x85, 0xee, + 0x00, 0x10, 0x86, 0x1d, 0x00, 0x10, 0x85, 0xb4, 0x00, 0x10, 0x85, 0x7d, + 0x00, 0x10, 0x85, 0x7d, 0x00, 0x10, 0x85, 0x7d, 0x00, 0x10, 0x85, 0xb4, + 0x00, 0x10, 0x85, 0xb4, 0x00, 0x10, 0x85, 0xb4, 0x00, 0x10, 0x85, 0xb4, + 0x00, 0x10, 0x85, 0xc7, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x59, 0x8c, 0x00, 0x0d, 0x48, 0x03, 0xc8, 0x57, 0x81, 0x30, 0x05, 0x80, + 0x04, 0x02, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x66, 0xd5, + 0x04, 0x02, 0x00, 0x41, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xcc, 0xce, + 0x80, 0xc4, 0x00, 0x40, 0x04, 0x00, 0x00, 0x44, 0x48, 0x03, 0xc8, 0x56, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0x79, 0x04, 0x00, 0x00, 0x39, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x49, 0x7a, 0x62, 0x1d, + 0x81, 0x2e, 0x59, 0xc0, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x59, 0x2c, 0x02, 0x04, 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x14, + 0x04, 0x00, 0x00, 0x03, 0x4a, 0x02, 0x62, 0x1d, 0x00, 0x00, 0x00, 0x03, + 0x59, 0x2c, 0x0a, 0x08, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4a, 0x8e, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8d, 0xef, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x49, 0x7a, 0x60, 0x08, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x85, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x09, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x02, 0x59, 0x30, 0x08, 0x04, + 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x82, 0x04, 0x0d, 0x40, + 0x80, 0x00, 0x40, 0x4b, 0x48, 0x06, 0x60, 0x04, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x63, 0x42, 0x00, 0x08, 0x00, 0x80, 0x00, 0x40, 0x4b, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0x5c, 0x04, 0x01, 0xfe, 0xe7, + 0x04, 0x02, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x66, 0xa5, + 0x04, 0x02, 0x00, 0x0b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xcb, 0x83, + 0x80, 0xc4, 0x00, 0x40, 0x04, 0x02, 0x07, 0xcb, 0x59, 0x30, 0x0c, 0x03, + 0x48, 0x07, 0xc8, 0x57, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x40, + 0x04, 0x00, 0x00, 0x09, 0x04, 0x01, 0xf7, 0xcb, 0x59, 0x30, 0x02, 0x03, + 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x0e, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf7, 0xa3, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x63, 0x81, 0x2e, 0x59, 0xc0, + 0x04, 0x00, 0x00, 0x13, 0x59, 0x2c, 0x0a, 0x08, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4a, 0x8e, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8d, 0xef, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x59, 0x30, 0x02, 0x03, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0d, 0x04, 0x00, 0x00, 0x08, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x63, 0x4d, 0x34, 0x00, 0x00, + 0x59, 0x32, 0x68, 0x09, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x46, 0xdb, + 0x5c, 0x02, 0x68, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x71, 0x9c, + 0x04, 0x01, 0xf0, 0x30, 0x81, 0x2e, 0x59, 0xc0, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8c, 0x4f, + 0x04, 0x02, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0d, 0xdd, + 0x04, 0x01, 0xf7, 0xa2, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x63, + 0x59, 0x2c, 0x02, 0x08, 0x84, 0x00, 0x05, 0x0c, 0x48, 0x02, 0x5a, 0x08, + 0x59, 0x2c, 0x04, 0x06, 0x80, 0x00, 0x00, 0xc2, 0x80, 0x00, 0x08, 0xc4, + 0x80, 0x04, 0x0c, 0x00, 0x48, 0x06, 0x62, 0x06, 0x42, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x41, 0x30, 0x08, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x0a, 0xd5, 0x04, 0x00, 0x00, 0x0d, 0x59, 0x2c, 0x02, 0x08, + 0x8c, 0x00, 0x05, 0x1c, 0x04, 0x02, 0x00, 0x06, 0x84, 0x00, 0x05, 0x5c, + 0x48, 0x02, 0x5a, 0x08, 0x4a, 0x02, 0x62, 0x06, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x01, 0xf0, 0x0f, 0x4d, 0x30, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x12, 0x01, 0x5c, 0x02, 0x60, 0x00, 0x59, 0x30, 0x02, 0x03, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x04, 0x04, 0x02, 0x00, 0x07, + 0x4d, 0x38, 0x00, 0x00, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x48, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, 0x5c, 0x02, 0x70, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x3d, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x59, 0x30, 0x02, 0x03, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x48, 0x03, 0xc8, 0x57, 0x0c, 0x01, 0xf0, 0x01, + 0x00, 0x10, 0x86, 0x66, 0x00, 0x10, 0x85, 0x86, 0x00, 0x10, 0x86, 0x68, + 0x00, 0x10, 0x86, 0x66, 0x00, 0x10, 0x86, 0x68, 0x00, 0x10, 0x86, 0x68, + 0x00, 0x10, 0x85, 0x7e, 0x00, 0x10, 0x86, 0x66, 0x00, 0x10, 0x85, 0x7a, + 0x00, 0x10, 0x86, 0x66, 0x00, 0x10, 0x86, 0x66, 0x00, 0x10, 0x86, 0x66, + 0x00, 0x10, 0x86, 0x66, 0x00, 0x10, 0x86, 0x66, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x4d, 0x34, 0x00, 0x00, 0x4d, 0x2c, 0x00, 0x00, + 0x59, 0x32, 0x68, 0x09, 0x59, 0x34, 0x04, 0x00, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x0c, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0x30, 0x34, 0x03, + 0x82, 0x18, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x04, 0x04, 0x02, 0x00, 0x04, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x06, + 0x82, 0x18, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x03, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x48, 0x03, 0xc8, 0x57, + 0x0c, 0x01, 0xf8, 0x04, 0x5c, 0x02, 0x58, 0x00, 0x5c, 0x02, 0x68, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x86, 0x8f, 0x00, 0x10, 0x87, 0x23, + 0x00, 0x10, 0x86, 0x91, 0x00, 0x10, 0x86, 0xc6, 0x00, 0x10, 0x86, 0x91, + 0x00, 0x10, 0x87, 0x40, 0x00, 0x10, 0x86, 0x91, 0x00, 0x10, 0x86, 0x9b, + 0x00, 0x10, 0x86, 0x8f, 0x00, 0x10, 0x87, 0x40, 0x00, 0x10, 0x86, 0x8f, + 0x00, 0x10, 0x86, 0xaa, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x59, 0x30, 0x04, 0x03, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x16, + 0x04, 0x00, 0x00, 0x2e, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x00, 0x00, 0x2b, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x00, 0x00, 0x28, 0x04, 0x01, 0xfa, 0xce, 0x04, 0x00, 0x00, 0x26, + 0x59, 0x30, 0x04, 0x03, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x22, + 0x04, 0x00, 0x00, 0xa3, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x39, + 0x04, 0x00, 0x00, 0xa8, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x35, + 0x04, 0x00, 0x00, 0xa5, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x1e, + 0x04, 0x00, 0x00, 0x1b, 0x04, 0x01, 0xf9, 0x93, 0x04, 0x00, 0x00, 0x07, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8d, 0xe6, 0x04, 0x02, 0x00, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x4f, 0x04, 0x01, 0xf0, 0x11, + 0x59, 0x30, 0x04, 0x03, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x02, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x19, + 0x04, 0x00, 0x00, 0x0a, 0x4d, 0x3c, 0x00, 0x00, 0x41, 0x7a, 0x78, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0xa0, 0x5c, 0x02, 0x78, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x33, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x78, 0xc2, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x71, 0x9c, 0x04, 0x01, 0xf9, 0x77, + 0x04, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8d, 0xe6, + 0x04, 0x00, 0x00, 0x9a, 0x59, 0x30, 0x0c, 0x03, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x16, 0x04, 0x00, 0x00, 0x4b, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x02, 0x00, 0x29, 0x59, 0xa8, 0x00, 0x23, + 0x8c, 0x00, 0x05, 0x02, 0x04, 0x02, 0x00, 0x13, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x02, 0x00, 0x10, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0xe4, 0x04, 0x02, 0x00, 0x06, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0x7e, + 0x04, 0x01, 0xf0, 0x85, 0x4a, 0x03, 0x50, 0x30, 0x00, 0x00, 0x00, 0x01, + 0x42, 0x02, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0x16, 0x04, 0x01, 0xf0, 0x7e, 0x59, 0x34, 0x04, 0x12, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0x10, + 0x80, 0x00, 0x00, 0x40, 0x48, 0x02, 0x6c, 0x12, 0x49, 0x7a, 0x60, 0x08, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x07, 0x4a, 0x02, 0x62, 0x06, + 0x00, 0x00, 0x03, 0x98, 0x49, 0x7a, 0x62, 0x05, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0x99, 0x04, 0x00, 0x00, 0x05, 0x49, 0x36, 0x60, 0x09, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x20, + 0x59, 0x30, 0x04, 0x03, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x02, 0x00, 0x0d, 0x59, 0x34, 0x04, 0x03, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x07, 0xfe, 0x04, 0x02, 0x00, 0x09, 0x59, 0xa8, 0x00, 0x23, + 0x84, 0x00, 0x05, 0x40, 0x48, 0x03, 0x50, 0x23, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x3e, 0xfc, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x78, 0xc2, + 0x04, 0x01, 0xf0, 0x0c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x78, 0xc2, + 0x4d, 0x3c, 0x00, 0x00, 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xca, 0xa0, 0x5c, 0x02, 0x78, 0x00, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x33, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1c, 0x36, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x71, 0x9c, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x01, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x63, 0x39, 0x04, 0x01, 0xf9, 0x1a, + 0x04, 0x02, 0x07, 0x9e, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1c, 0x36, + 0x4d, 0x3c, 0x00, 0x00, 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xca, 0xa0, 0x5c, 0x02, 0x78, 0x00, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x33, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x18, 0x41, 0x78, 0x28, 0x00, + 0x42, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x40, 0x00, 0x00, + 0x4d, 0x44, 0x00, 0x00, 0x59, 0x36, 0x8c, 0x03, 0x42, 0x02, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x29, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x90, 0xb2, + 0x5c, 0x02, 0x88, 0x00, 0x5c, 0x02, 0x80, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x71, 0x9c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x4f, + 0x04, 0x01, 0xf7, 0xc8, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x3c, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x74, 0x11, 0x04, 0x02, 0x07, 0xc1, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x30, 0x0c, 0x03, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8b, 0xff, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x83, 0x6c, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x04, 0x4a, 0x02, 0x62, 0x06, + 0x00, 0x00, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x30, 0x04, 0x03, + 0x48, 0x02, 0x64, 0x16, 0x4a, 0x02, 0x62, 0x1d, 0x00, 0x00, 0x00, 0x01, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x85, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x09, 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x02, + 0x42, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, 0x4b, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0x5c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x78, 0xc2, + 0x4d, 0x3c, 0x00, 0x00, 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xca, 0xa0, 0x5c, 0x02, 0x78, 0x00, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x33, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x49, 0x7a, 0x60, 0x08, 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x07, + 0x4a, 0x02, 0x62, 0x06, 0x00, 0x00, 0x03, 0x98, 0x49, 0x7a, 0x62, 0x05, + 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x3f, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x4d, 0x34, 0x00, 0x00, + 0x59, 0x32, 0x68, 0x09, 0x59, 0x30, 0x02, 0x03, 0x82, 0x00, 0x0c, 0x80, + 0x00, 0x00, 0x00, 0x0e, 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x48, 0x03, 0xc8, 0x57, 0x0c, 0x01, 0xf8, 0x03, 0x5c, 0x02, 0x68, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x87, 0x93, 0x00, 0x10, 0x85, 0x86, + 0x00, 0x10, 0x87, 0x93, 0x00, 0x10, 0x87, 0x93, 0x00, 0x10, 0x87, 0x93, + 0x00, 0x10, 0x87, 0x93, 0x00, 0x10, 0x87, 0x93, 0x00, 0x10, 0x87, 0x93, + 0x00, 0x10, 0x87, 0x93, 0x00, 0x10, 0x85, 0x86, 0x00, 0x10, 0x87, 0x95, + 0x00, 0x10, 0x85, 0x86, 0x00, 0x10, 0x87, 0x9d, 0x00, 0x10, 0x87, 0x93, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x8b, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x0b, + 0x42, 0x00, 0x08, 0x00, 0x80, 0x00, 0x40, 0x4b, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0x5c, 0x59, 0x30, 0x0a, 0x1d, 0x4d, 0x3c, 0x00, 0x00, + 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0xa0, + 0x5c, 0x02, 0x78, 0x00, 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x11, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa1, 0x37, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x33, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x41, 0x30, 0x68, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, + 0x04, 0x00, 0x00, 0x08, 0x49, 0x36, 0x60, 0x09, 0x4d, 0x30, 0x00, 0x00, + 0x40, 0x36, 0x60, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x71, 0x9c, + 0x5c, 0x02, 0x60, 0x00, 0x04, 0x01, 0xf0, 0x02, 0x40, 0x36, 0x60, 0x00, + 0x49, 0x7a, 0x60, 0x08, 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x01, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x01, 0x8d, 0x0e, 0x1d, 0x20, + 0x04, 0x00, 0x00, 0x11, 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x04, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x07, 0x4a, 0x02, 0x64, 0x20, + 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x4d, 0x40, 0x00, 0x00, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, + 0x41, 0x78, 0x28, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9c, 0x14, + 0x5c, 0x02, 0x80, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x0b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x63, 0x39, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x45, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x59, 0x30, 0x02, 0x03, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x48, 0x03, 0xc8, 0x57, 0x0c, 0x01, 0xf0, 0x01, + 0x00, 0x10, 0x88, 0x07, 0x00, 0x10, 0x87, 0xef, 0x00, 0x10, 0x87, 0xf3, + 0x00, 0x10, 0x88, 0x08, 0x00, 0x10, 0x87, 0xf1, 0x00, 0x10, 0x87, 0xef, + 0x00, 0x10, 0x87, 0xef, 0x00, 0x10, 0x87, 0xef, 0x00, 0x10, 0x87, 0xef, + 0x00, 0x10, 0x87, 0xef, 0x00, 0x10, 0x87, 0xef, 0x00, 0x10, 0x87, 0xef, + 0x00, 0x10, 0x87, 0xef, 0x00, 0x10, 0x87, 0xef, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0d, 0xdd, + 0x4d, 0x2c, 0x00, 0x00, 0x59, 0x32, 0x58, 0x08, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x00, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x5c, 0x02, 0x58, 0x00, 0x49, 0x7a, 0x60, 0x08, 0x4a, 0x02, 0x62, 0x1d, + 0x00, 0x00, 0x00, 0x0a, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x85, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x09, 0x4a, 0x02, 0x64, 0x06, + 0x00, 0x00, 0x00, 0x02, 0x42, 0x00, 0x08, 0x00, 0x80, 0x00, 0x40, 0x4b, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0x5c, 0x1c, 0x01, 0xf0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x76, 0x4d, 0xf0, 0x00, 0x00, + 0x04, 0x01, 0xfc, 0xca, 0x04, 0x02, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x66, 0xa5, 0x04, 0x02, 0x00, 0x0d, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xcb, 0x83, 0x80, 0xc4, 0x00, 0x40, 0x04, 0x02, 0x00, 0x05, + 0x5c, 0x03, 0xe0, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x63, + 0x04, 0x01, 0xf7, 0xdc, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0x79, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x5c, 0x03, 0xe0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x63, 0x59, 0x30, 0x02, 0x03, + 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x0e, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf7, 0xb9, + 0x48, 0x03, 0xc8, 0x56, 0x59, 0xa8, 0x00, 0x0d, 0x59, 0xa8, 0x08, 0x64, + 0x80, 0x04, 0x04, 0x00, 0x80, 0x08, 0x04, 0x80, 0x04, 0x02, 0x10, 0x04, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, + 0x80, 0x00, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x08, 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x03, 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x04, 0x00, 0x00, + 0x59, 0x30, 0x08, 0x08, 0x59, 0xa8, 0x00, 0x0b, 0x80, 0x04, 0x04, 0x80, + 0x04, 0x00, 0x10, 0x07, 0x59, 0xa8, 0x00, 0x0c, 0x80, 0x04, 0x04, 0x80, + 0x04, 0x02, 0x10, 0x04, 0x80, 0x04, 0x09, 0xc0, 0x5c, 0x00, 0x08, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x80, 0x04, 0x09, 0xc0, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x48, 0x03, 0xc8, 0x56, 0x04, 0x01, 0xf7, 0xfa, + 0x48, 0x03, 0xc8, 0x56, 0x4d, 0x30, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0x99, 0x04, 0x00, 0x00, 0x0a, 0x04, 0x01, 0xf8, 0x31, + 0x4d, 0x38, 0x00, 0x00, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4b, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, 0x5c, 0x02, 0x70, 0x00, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x5c, 0x02, 0x60, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x4d, 0x30, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x71, 0xd5, 0x04, 0x00, 0x00, 0x1d, + 0x04, 0x01, 0xf8, 0x21, 0x4d, 0x30, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x76, 0x4d, 0xf0, 0x00, 0x00, 0x4d, 0x3c, 0x00, 0x00, + 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xce, 0xf7, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xcf, 0x9c, 0x5c, 0x02, 0x78, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xd2, 0x8a, 0x5c, 0x03, 0xe0, 0x00, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x64, 0x63, 0x5c, 0x02, 0x60, 0x00, + 0x8d, 0x3e, 0x7d, 0x3e, 0x04, 0x02, 0x00, 0x0b, 0x4d, 0x38, 0x00, 0x00, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0xdf, 0x5c, 0x02, 0x70, 0x00, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x5c, 0x02, 0x60, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x04, 0x01, 0xf7, 0xfa, + 0x59, 0x2c, 0x04, 0x07, 0x49, 0x4a, 0x60, 0x17, 0x49, 0x4e, 0x60, 0x18, + 0x49, 0x36, 0x60, 0x09, 0x49, 0x2e, 0x60, 0x08, 0x4a, 0x02, 0x64, 0x06, + 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0xc2, 0x80, 0x00, 0x08, 0xc4, + 0x80, 0x04, 0x04, 0x00, 0x48, 0x02, 0x62, 0x06, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x3b, 0xc8, 0x57, 0x4d, 0x30, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0x99, 0x04, 0x00, 0x00, 0x0d, 0x04, 0x01, 0xff, 0xef, + 0x4d, 0x40, 0x00, 0x00, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x01, 0xf8, 0x0d, 0x5c, 0x02, 0x80, 0x00, 0x8d, 0x3e, 0x7d, 0x3e, + 0x04, 0x02, 0x00, 0x07, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x5c, 0x02, 0x60, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x04, 0x01, 0xf7, 0xfa, 0x48, 0x03, 0xc8, 0x56, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x76, 0x4d, 0xf0, 0x00, 0x00, 0x4d, 0x3c, 0x00, 0x00, + 0x4d, 0x44, 0x00, 0x00, 0x59, 0x36, 0x8c, 0x03, 0x42, 0x02, 0x78, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xce, 0x5a, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xce, 0xa8, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xcf, 0x9c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xd2, 0x8a, + 0x5c, 0x02, 0x88, 0x00, 0x5c, 0x02, 0x78, 0x00, 0x5c, 0x03, 0xe0, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x64, 0x63, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x4d, 0x30, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0x99, 0x04, 0x00, 0x00, 0x0f, 0x48, 0x1a, 0x60, 0x1c, + 0x48, 0xee, 0x60, 0x21, 0x49, 0x36, 0x60, 0x09, 0x4a, 0x02, 0x64, 0x06, + 0x00, 0x00, 0x00, 0x01, 0x49, 0x2e, 0x60, 0x08, 0x4d, 0x38, 0x00, 0x00, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0xdf, 0x5c, 0x02, 0x70, 0x00, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x5c, 0x02, 0x60, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x4d, 0x30, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0x99, 0x04, 0x00, 0x00, 0x0e, 0x48, 0xee, 0x60, 0x21, + 0x49, 0x36, 0x60, 0x09, 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x01, + 0x49, 0x2e, 0x60, 0x08, 0x4d, 0x38, 0x00, 0x00, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x55, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, + 0x5c, 0x02, 0x70, 0x00, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x5c, 0x02, 0x60, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x4d, 0x30, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, + 0x04, 0x00, 0x00, 0x0f, 0x48, 0x1a, 0x60, 0x1c, 0x48, 0xee, 0x60, 0x21, + 0x49, 0x36, 0x60, 0x09, 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x01, + 0x49, 0x2e, 0x60, 0x08, 0x4d, 0x38, 0x00, 0x00, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x3d, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, + 0x5c, 0x02, 0x70, 0x00, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x5c, 0x02, 0x60, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x4d, 0x30, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x71, 0xd5, + 0x04, 0x00, 0x00, 0x14, 0x49, 0x36, 0x60, 0x09, 0x49, 0x2f, 0xc8, 0x57, + 0x49, 0x33, 0xc8, 0x57, 0x59, 0x2c, 0x04, 0x04, 0x8c, 0x00, 0x05, 0x1e, + 0x04, 0x00, 0x00, 0x03, 0x48, 0xef, 0xc8, 0x57, 0x48, 0xee, 0x60, 0x21, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x01, 0x49, 0x2e, 0x60, 0x08, + 0x4d, 0x38, 0x00, 0x00, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, 0x5c, 0x02, 0x70, 0x00, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x5c, 0x02, 0x60, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x4d, 0x30, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, 0x04, 0x00, 0x00, 0x0f, + 0x48, 0xee, 0x60, 0x21, 0x48, 0x1a, 0x60, 0x1c, 0x49, 0x36, 0x60, 0x09, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x01, 0x49, 0x2e, 0x60, 0x08, + 0x4d, 0x38, 0x00, 0x00, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x44, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, 0x5c, 0x02, 0x70, 0x00, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x5c, 0x02, 0x60, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x4d, 0x30, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, 0x04, 0x00, 0x00, 0x0f, + 0x48, 0x1a, 0x60, 0x1c, 0x48, 0xee, 0x60, 0x21, 0x49, 0x36, 0x60, 0x09, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x01, 0x49, 0x2e, 0x60, 0x08, + 0x4d, 0x38, 0x00, 0x00, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, 0x5c, 0x02, 0x70, 0x00, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x5c, 0x02, 0x60, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x30, 0x00, 0x09, + 0x80, 0x00, 0x15, 0x40, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x58, 0x08, 0x04, 0x0b, 0x48, 0x03, 0xc8, 0x56, 0x80, 0x00, 0x00, 0x40, + 0x04, 0x00, 0x10, 0x02, 0x48, 0x00, 0x14, 0x0b, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x59, 0x30, 0x04, 0x03, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x0f, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x0c, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x09, 0x59, 0x9c, 0x08, 0x19, + 0x8c, 0x04, 0x0d, 0x0e, 0x04, 0x00, 0x00, 0x04, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x08, 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x00, 0x00, 0x03, 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x4c, 0x00, 0x00, 0x00, 0x4d, 0x2c, 0x00, 0x00, 0x59, 0x30, 0x04, 0x06, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x1d, + 0x59, 0x30, 0x00, 0x08, 0x80, 0x02, 0x5d, 0x40, 0x80, 0x00, 0x01, 0xc0, + 0x04, 0x00, 0x00, 0x19, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8d, 0xe6, + 0x04, 0x00, 0x00, 0x14, 0x59, 0x30, 0x04, 0x06, 0x82, 0x00, 0x45, 0x80, + 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x10, 0x82, 0x00, 0x45, 0x80, + 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x00, 0x0d, 0x82, 0x00, 0x45, 0x80, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x0c, 0x82, 0x00, 0x45, 0x80, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x09, 0x82, 0x00, 0x45, 0x80, + 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x06, 0x59, 0x2c, 0x04, 0x04, + 0x8c, 0x00, 0x05, 0x1e, 0x04, 0x00, 0x00, 0x03, 0x80, 0x00, 0x05, 0x80, + 0x04, 0x01, 0xf0, 0x03, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x5c, 0x02, 0x58, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x4d, 0x30, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x71, 0xd5, 0x04, 0x00, 0x00, 0x13, 0x49, 0x36, 0x60, 0x09, + 0x48, 0xee, 0x60, 0x21, 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x01, + 0x49, 0x2e, 0x60, 0x08, 0x4d, 0x3c, 0x00, 0x00, 0x41, 0x7a, 0x78, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0xa0, 0x5c, 0x02, 0x78, 0x00, + 0x4d, 0x38, 0x00, 0x00, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x28, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, 0x5c, 0x02, 0x70, 0x00, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x5c, 0x02, 0x60, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x15, 0x04, 0x02, 0x00, 0x0d, 0x59, 0xa8, 0x00, 0x15, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x74, 0x04, 0x02, 0x00, 0x09, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x43, 0x46, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x01, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x29, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x63, 0x39, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x78, 0xc2, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x48, 0x03, 0xc8, 0x56, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x16, + 0x04, 0x02, 0x00, 0x07, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x73, 0xd3, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x15, + 0x04, 0x02, 0x00, 0x13, 0x59, 0xa8, 0x00, 0x15, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x14, 0x04, 0x02, 0x00, 0x0f, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x43, 0xa7, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x7d, 0x26, + 0x04, 0x02, 0x00, 0x0a, 0x59, 0x34, 0x04, 0x04, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x00, 0x00, 0x07, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x73, 0xd3, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x78, 0xc2, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x59, 0x2c, 0x02, 0x06, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x56, 0x59, 0x2c, 0x02, 0x08, 0x84, 0x00, 0x05, 0x4a, + 0x48, 0x02, 0x5a, 0x08, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x7a, 0x62, 0x05, + 0x49, 0x7a, 0x60, 0x08, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x50, 0x42, 0x00, 0x08, 0x00, + 0x80, 0x00, 0x00, 0x43, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0x5c, + 0x49, 0x33, 0xc8, 0x57, 0x4d, 0x34, 0x00, 0x00, 0x59, 0x32, 0x68, 0x09, + 0x59, 0x34, 0x02, 0x00, 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x00, 0x00, 0x06, + 0x59, 0x30, 0x04, 0x06, 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x12, + 0x04, 0x02, 0x10, 0x04, 0x0c, 0x01, 0xf8, 0x06, 0x5c, 0x02, 0x68, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x85, 0x7d, + 0x04, 0x01, 0xf7, 0xfc, 0x00, 0x10, 0x85, 0x7d, 0x00, 0x10, 0x8a, 0x1c, + 0x00, 0x10, 0x8a, 0x20, 0x00, 0x10, 0x8a, 0x23, 0x00, 0x10, 0x9c, 0x86, + 0x00, 0x10, 0x9c, 0xa3, 0x00, 0x10, 0x9c, 0xa7, 0x00, 0x10, 0x85, 0x7d, + 0x00, 0x10, 0x85, 0x7d, 0x00, 0x10, 0x85, 0x7d, 0x00, 0x10, 0x85, 0x7d, + 0x00, 0x10, 0x85, 0x7d, 0x00, 0x10, 0x85, 0x7d, 0x00, 0x10, 0x85, 0x7d, + 0x00, 0x10, 0x85, 0x7d, 0x00, 0x10, 0x85, 0x7d, 0x00, 0x10, 0x85, 0x7d, + 0x00, 0x10, 0x85, 0x7d, 0x48, 0x03, 0xc8, 0x56, 0x40, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x30, 0x00, 0x1c, + 0x48, 0x03, 0xc8, 0x57, 0x59, 0x30, 0x04, 0x14, 0x49, 0x33, 0xc8, 0x57, + 0x48, 0x03, 0xc8, 0x57, 0x8c, 0x00, 0x05, 0x02, 0x04, 0x00, 0x00, 0x05, + 0x48, 0x03, 0xc8, 0x57, 0x84, 0x00, 0x05, 0x40, 0x48, 0x02, 0x64, 0x14, + 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, + 0x41, 0x30, 0x08, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0a, 0xd5, + 0x04, 0x01, 0xf8, 0x10, 0x04, 0x02, 0x00, 0x0e, 0x59, 0x30, 0x0c, 0x14, + 0x59, 0x30, 0x04, 0x03, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x40, + 0x04, 0x00, 0x00, 0x03, 0x84, 0x04, 0x0d, 0x40, 0x04, 0x01, 0xf0, 0x05, + 0x59, 0xa8, 0x00, 0x34, 0x82, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0a, + 0x48, 0x02, 0x62, 0x05, 0x84, 0x04, 0x0d, 0x42, 0x48, 0x06, 0x64, 0x14, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x4d, 0x34, 0x00, 0x00, + 0x59, 0x32, 0x68, 0x09, 0x59, 0x34, 0x02, 0x00, 0x8c, 0x00, 0x05, 0x0e, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0x30, 0x00, 0x1c, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x33, 0x59, 0x30, 0x04, 0x03, + 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x40, + 0x04, 0x00, 0x00, 0x03, 0x8d, 0x0e, 0x1d, 0x0e, 0x04, 0x02, 0x00, 0x2a, + 0x4d, 0x1c, 0x00, 0x00, 0x41, 0x32, 0x38, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0x99, 0x04, 0x00, 0x00, 0x23, 0x49, 0x32, 0x38, 0x1c, + 0x59, 0x1c, 0x04, 0x14, 0x84, 0x00, 0x05, 0x42, 0x48, 0x02, 0x3c, 0x14, + 0x49, 0x36, 0x60, 0x09, 0x59, 0x1c, 0x04, 0x06, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x06, 0x59, 0x1c, 0x02, 0x02, + 0x48, 0x02, 0x64, 0x19, 0x59, 0x1c, 0x04, 0x02, 0x48, 0x02, 0x62, 0x19, + 0x04, 0x01, 0xf0, 0x05, 0x59, 0x1c, 0x02, 0x02, 0x48, 0x02, 0x62, 0x19, + 0x59, 0x1c, 0x04, 0x02, 0x48, 0x02, 0x64, 0x19, 0x49, 0x1e, 0x60, 0x1e, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x01, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x35, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, + 0x42, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, 0x40, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0x5c, 0x41, 0x1e, 0x60, 0x00, 0x5c, 0x02, 0x38, 0x00, + 0x80, 0x00, 0x05, 0x80, 0x5c, 0x02, 0x68, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x41, 0x1e, 0x60, 0x00, 0x5c, 0x02, 0x38, 0x00, 0x59, 0xa8, 0x00, 0x36, + 0x48, 0x02, 0x62, 0x05, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf7, 0xf8, 0x49, 0x33, 0xc8, 0x57, 0x4d, 0x2c, 0x00, 0x00, + 0x49, 0x32, 0x38, 0x1c, 0x4a, 0x02, 0x62, 0x02, 0x00, 0x00, 0xff, 0xff, + 0x59, 0x1e, 0x58, 0x08, 0x59, 0x1c, 0x00, 0x07, 0x8c, 0x00, 0x05, 0x1e, + 0x04, 0x00, 0x00, 0x05, 0x84, 0x00, 0x05, 0x1e, 0x48, 0x02, 0x38, 0x07, + 0x49, 0x7a, 0x58, 0x09, 0x04, 0x01, 0xf0, 0x18, 0x59, 0x2c, 0x04, 0x08, + 0x8c, 0x00, 0x05, 0x18, 0x04, 0x00, 0x00, 0x15, 0x84, 0x00, 0x05, 0x18, + 0x48, 0x02, 0x5c, 0x08, 0x4d, 0x40, 0x00, 0x00, 0x59, 0x2e, 0x82, 0x06, + 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xfb, 0x57, + 0x49, 0x42, 0x5a, 0x06, 0x5c, 0x02, 0x80, 0x00, 0x49, 0x7a, 0x58, 0x09, + 0x59, 0x2c, 0x04, 0x08, 0x8c, 0x00, 0x05, 0x12, 0x04, 0x00, 0x00, 0x08, + 0x4d, 0x2c, 0x00, 0x00, 0x84, 0x00, 0x05, 0x12, 0x48, 0x02, 0x5c, 0x08, + 0x59, 0x2e, 0x58, 0x09, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x3b, + 0x5c, 0x02, 0x58, 0x00, 0x59, 0xa8, 0x00, 0x36, 0x48, 0x02, 0x62, 0x05, + 0x59, 0x1c, 0x02, 0x14, 0x48, 0x02, 0x62, 0x16, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x08, 0x4a, 0x02, 0x3a, 0x03, + 0x00, 0x00, 0x00, 0x02, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x00, 0x00, 0x08, 0x49, 0x7a, 0x60, 0x15, 0x04, 0x01, 0xf0, 0x1e, + 0x59, 0x1c, 0x00, 0x07, 0x84, 0x00, 0x05, 0x40, 0x48, 0x02, 0x38, 0x07, + 0x4a, 0x02, 0x3a, 0x03, 0x00, 0x00, 0x00, 0x04, 0x59, 0x1c, 0x04, 0x14, + 0x48, 0x03, 0xc8, 0x57, 0x84, 0x00, 0x05, 0x1c, 0x84, 0x00, 0x05, 0x54, + 0x48, 0x02, 0x3c, 0x14, 0x59, 0x2c, 0x00, 0x0f, 0x40, 0x00, 0x10, 0x00, + 0x59, 0x1c, 0x08, 0x16, 0x80, 0x04, 0x04, 0x80, 0x04, 0x02, 0x17, 0xf0, + 0x59, 0x1c, 0x00, 0x16, 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0xff, 0xfc, + 0x48, 0x02, 0x60, 0x15, 0x48, 0x02, 0x38, 0x16, 0x59, 0x1c, 0x0a, 0x14, + 0x48, 0x07, 0xc8, 0x57, 0x82, 0x04, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x02, 0x00, 0x05, 0x48, 0x0b, 0xc8, 0x57, 0x48, 0x03, 0xc8, 0x57, + 0x4a, 0x02, 0x38, 0x12, 0xff, 0xff, 0xff, 0xff, 0x59, 0x1c, 0x04, 0x02, + 0x48, 0x02, 0x64, 0x19, 0x59, 0x1c, 0x02, 0x02, 0x48, 0x02, 0x62, 0x19, + 0x59, 0x1e, 0x68, 0x09, 0x49, 0x36, 0x60, 0x09, 0x4a, 0x02, 0x64, 0x06, + 0x00, 0x00, 0x00, 0x01, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x39, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x08, 0x00, + 0x80, 0x00, 0x00, 0x40, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x5c, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, + 0x59, 0x30, 0x04, 0x14, 0x8c, 0x00, 0x05, 0x14, 0x04, 0x00, 0x00, 0x15, + 0x8c, 0x00, 0x05, 0x1c, 0x04, 0x02, 0x00, 0x12, 0x59, 0x30, 0x00, 0x16, + 0x80, 0x10, 0x04, 0x80, 0x04, 0x00, 0x10, 0x06, 0x04, 0x00, 0x00, 0x05, + 0x59, 0x30, 0x04, 0x14, 0x84, 0x00, 0x05, 0x14, 0x84, 0x00, 0x05, 0x5c, + 0x04, 0x01, 0xf0, 0x09, 0x48, 0x12, 0x60, 0x16, 0x48, 0x12, 0x60, 0x12, + 0x40, 0x10, 0x00, 0x00, 0x59, 0x2c, 0x18, 0x0f, 0x80, 0x0c, 0x04, 0x80, + 0x48, 0x02, 0x60, 0x11, 0x59, 0x30, 0x04, 0x14, 0x84, 0x00, 0x05, 0x14, + 0x48, 0x02, 0x64, 0x14, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, + 0x8c, 0x00, 0x05, 0x1c, 0x04, 0x02, 0x00, 0x06, 0x59, 0x30, 0x00, 0x12, + 0x48, 0x02, 0x60, 0x16, 0x59, 0x30, 0x04, 0x14, 0x84, 0x00, 0x05, 0x5c, + 0x48, 0x02, 0x64, 0x14, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x08, 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x00, 0x00, 0x03, 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x30, 0x0c, 0x03, + 0x49, 0x33, 0xc8, 0x57, 0x48, 0x07, 0xc8, 0x57, 0x82, 0x04, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x34, 0x04, 0x00, 0x10, 0x06, 0x82, 0x04, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x3c, 0x04, 0x02, 0x10, 0x03, 0x80, 0x00, 0x05, 0x80, + 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf7, 0xfd, 0x41, 0x78, 0x08, 0x00, 0x59, 0xa8, 0x10, 0x32, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x62, 0xb7, 0x80, 0x08, 0x11, 0xc0, 0x04, 0x02, 0x00, 0x03, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x14, 0x48, 0x0b, 0x50, 0x34, + 0x59, 0xa8, 0x10, 0x33, 0x48, 0x0b, 0x50, 0x2a, 0x41, 0x78, 0x08, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x62, 0xb7, 0x80, 0x08, 0x11, 0xc0, 0x04, 0x02, 0x00, 0x03, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x14, 0x48, 0x0b, 0x50, 0x35, + 0x82, 0x08, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x48, 0x0b, 0x50, 0x36, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x99, 0x42, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x40, 0x08, 0x08, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0a, 0xa9, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0x59, 0xa8, 0x10, 0x0f, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x99, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x46, 0x2e, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4a, 0x03, 0x50, 0x34, + 0x00, 0x00, 0x00, 0x28, 0x4a, 0x03, 0x50, 0x35, 0x00, 0x00, 0x00, 0x14, + 0x4a, 0x03, 0x50, 0x2a, 0x00, 0x00, 0x07, 0xd0, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x1e, 0x48, 0x0b, 0x50, 0x36, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x99, + 0x42, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x40, 0x08, 0x08, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0a, 0xa9, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x59, 0xa8, 0x10, 0x0f, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x64, 0x99, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, + 0x4d, 0x2c, 0x00, 0x00, 0x59, 0x30, 0x04, 0x03, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x3e, 0x04, 0x02, 0x00, 0x05, 0x59, 0x32, 0x58, 0x17, + 0x81, 0x2e, 0x59, 0xc0, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x07, 0x2e, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x37, 0xc8, 0x57, + 0x4d, 0x30, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, + 0x04, 0x00, 0x00, 0x11, 0x49, 0x36, 0x60, 0x09, 0x4a, 0x02, 0x64, 0x06, + 0x00, 0x00, 0x00, 0x01, 0x49, 0x2e, 0x60, 0x08, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, + 0x4d, 0x38, 0x00, 0x00, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x33, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, 0x5c, 0x02, 0x70, 0x00, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x5c, 0x02, 0x60, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x4d, 0x2c, 0x00, 0x00, + 0x4c, 0x58, 0x00, 0x00, 0x4d, 0x3c, 0x00, 0x00, 0x59, 0x32, 0x58, 0x08, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x15, 0x04, 0x02, 0x00, 0x25, + 0x59, 0xa8, 0xb0, 0x15, 0x82, 0x58, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x19, + 0x04, 0x00, 0x10, 0x03, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x18, + 0x80, 0x58, 0xb1, 0x04, 0x04, 0x01, 0xfa, 0x0f, 0x80, 0x00, 0x05, 0x80, + 0x04, 0x01, 0xfa, 0x1f, 0x83, 0x2c, 0xac, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x83, 0xcc, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x30, 0x4c, 0x60, 0x00, 0x00, 0x42, 0x00, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x59, 0x2c, 0x10, 0x0a, 0x8c, 0x08, 0x15, 0x18, + 0x04, 0x02, 0x00, 0x06, 0x59, 0xa8, 0x00, 0x0f, 0x59, 0x2c, 0x10, 0x0d, + 0x80, 0x08, 0x05, 0x80, 0x04, 0x02, 0x00, 0x07, 0x41, 0x78, 0xc0, 0x00, + 0x59, 0x30, 0x10, 0x09, 0x58, 0x08, 0x14, 0x03, 0x41, 0x7a, 0x78, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1c, 0x5e, 0x5c, 0x00, 0xc0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x73, 0xd3, 0x04, 0x01, 0xf0, 0x08, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xfa, 0x0e, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x78, 0xc2, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x5c, 0x02, 0x78, 0x00, 0x5c, 0x00, 0xb0, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x56, + 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x36, 0x60, 0x09, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x01, 0x49, 0x2e, 0x60, 0x08, + 0x4d, 0x38, 0x00, 0x00, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4d, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, 0x5c, 0x02, 0x70, 0x00, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x42, 0x01, 0x88, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, + 0x4d, 0x2c, 0x00, 0x00, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x15, + 0x04, 0x02, 0x00, 0x27, 0x59, 0xa8, 0x08, 0x15, 0x59, 0x32, 0x58, 0x08, + 0x59, 0x30, 0x04, 0x0b, 0x80, 0x00, 0x00, 0xc4, 0x80, 0x04, 0x05, 0x80, + 0x04, 0x02, 0x00, 0x21, 0x4c, 0x50, 0x00, 0x00, 0x4c, 0x54, 0x00, 0x00, + 0x4c, 0x58, 0x00, 0x00, 0x83, 0xcc, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x40, 0x50, 0xa8, 0x00, 0x59, 0x30, 0xb4, 0x0b, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x41, 0x83, 0xcc, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x59, 0x2c, 0xb2, 0x05, 0x83, 0x2c, 0xac, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, 0x59, 0x2e, 0x58, 0x01, + 0x81, 0x2e, 0x59, 0xc0, 0x04, 0x02, 0x07, 0xf9, 0x59, 0x31, 0xd8, 0x21, + 0x58, 0xef, 0x40, 0x0b, 0x58, 0xee, 0x58, 0x0d, 0x4a, 0x02, 0x5a, 0x04, + 0x00, 0x00, 0x01, 0x03, 0x58, 0xec, 0x00, 0x09, 0x08, 0x01, 0xf8, 0x00, + 0x59, 0x30, 0x04, 0x02, 0x5c, 0x00, 0xb0, 0x00, 0x5c, 0x00, 0xa8, 0x00, + 0x5c, 0x00, 0xa0, 0x00, 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x78, 0xc2, 0x5c, 0x02, 0x58, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x82, 0x04, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x35, 0x04, 0x00, 0x00, 0x05, 0x59, 0x30, 0x14, 0x19, + 0x04, 0x01, 0xf8, 0x51, 0x04, 0x00, 0x00, 0x27, 0x04, 0x01, 0xf0, 0x06, + 0x4d, 0x30, 0x00, 0x00, 0x59, 0x32, 0x60, 0x1e, 0x04, 0x01, 0xf8, 0x57, + 0x5c, 0x02, 0x60, 0x00, 0x04, 0x00, 0x00, 0x20, 0x59, 0x1c, 0x0c, 0x06, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x04, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x06, 0x04, 0x02, 0x00, 0x1c, + 0x59, 0x1c, 0x0c, 0x02, 0x59, 0x30, 0x04, 0x19, 0x80, 0x04, 0x05, 0x80, + 0x04, 0x00, 0x00, 0x09, 0x59, 0x30, 0x02, 0x19, 0x80, 0x04, 0x05, 0x80, + 0x04, 0x02, 0x00, 0x15, 0x59, 0x1c, 0x0a, 0x02, 0x59, 0x30, 0x04, 0x19, + 0x80, 0x04, 0x05, 0x80, 0x04, 0x02, 0x00, 0x11, 0x04, 0x01, 0xf0, 0x09, + 0x59, 0x30, 0x0a, 0x19, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x05, 0x59, 0x1c, 0x02, 0x02, 0x59, 0x30, 0x0a, 0x19, + 0x80, 0x04, 0x05, 0x80, 0x04, 0x02, 0x00, 0x08, 0x59, 0x1c, 0x00, 0x09, + 0x59, 0x30, 0x08, 0x09, 0x80, 0x04, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, + 0x41, 0x7a, 0x38, 0x00, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x59, 0xb8, 0x00, 0xe4, + 0x8c, 0x00, 0x05, 0x38, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x2c, 0x4a, 0x03, 0x70, 0xe4, + 0x20, 0x00, 0x00, 0x00, 0x59, 0xb8, 0x00, 0xe4, 0x80, 0x04, 0x08, 0x40, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x8c, 0x00, 0x05, 0x3c, + 0x04, 0x02, 0x07, 0xf9, 0x4a, 0x03, 0x70, 0xe4, 0x30, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x59, 0xb8, 0x00, 0xe4, 0x8c, 0x00, 0x05, 0x3c, 0x04, 0x02, 0x07, 0xf1, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x4a, 0x03, 0x70, 0xe4, + 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x59, 0xb8, 0x00, 0xe4, + 0x8c, 0x00, 0x05, 0x38, 0x04, 0x02, 0x07, 0xfb, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x30, 0x08, 0x07, 0x8c, 0x04, 0x0d, 0x1e, 0x59, 0x2c, 0x0c, 0x08, + 0x04, 0x02, 0x00, 0x02, 0x8c, 0x04, 0x0d, 0x18, 0x1c, 0x01, 0xf0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x29, 0x04, 0x00, 0x00, 0x08, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x24, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x62, 0x98, 0x82, 0x06, 0x3c, 0x00, 0x00, 0x10, 0xd8, 0xd4, + 0x49, 0x1f, 0xc8, 0x57, 0x1c, 0x01, 0xf0, 0x00, 0x83, 0x30, 0x04, 0x80, + 0x00, 0x10, 0xd8, 0xd4, 0x04, 0x00, 0x10, 0x0a, 0x59, 0xa8, 0x00, 0x0a, + 0x81, 0x30, 0x04, 0x80, 0x04, 0x02, 0x10, 0x07, 0x59, 0x30, 0x14, 0x02, + 0x04, 0x01, 0xff, 0xee, 0x04, 0x00, 0x00, 0x07, 0x41, 0x1c, 0x00, 0x00, + 0x81, 0x30, 0x05, 0x80, 0x04, 0x00, 0x00, 0x03, 0x81, 0x78, 0x05, 0x00, + 0x04, 0x01, 0xf0, 0x02, 0x81, 0x30, 0x05, 0x40, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x47, 0xc8, 0x57, 0x4d, 0x30, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0x5a, 0x04, 0x02, 0x00, 0x0a, 0x42, 0x02, 0x60, 0x00, + 0x00, 0x10, 0xb5, 0xb8, 0x49, 0x36, 0x60, 0x09, 0x49, 0x2e, 0x60, 0x08, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0xa0, 0x80, 0x00, 0x05, 0x80, + 0x5c, 0x02, 0x60, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf7, 0xfc, 0x49, 0x33, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x3d, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x4d, 0x2c, 0x00, 0x00, 0x4d, 0x34, 0x00, 0x00, + 0x4d, 0x44, 0x00, 0x00, 0x4c, 0x58, 0x00, 0x00, 0x59, 0x32, 0x58, 0x08, + 0x59, 0x32, 0x68, 0x09, 0x49, 0x42, 0x5a, 0x06, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x52, 0xd5, 0x59, 0x2e, 0x8c, 0x06, 0x59, 0x2c, 0x42, 0x07, + 0x82, 0x20, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0c, 0x01, 0xf8, 0x06, + 0x5c, 0x00, 0xb0, 0x00, 0x5c, 0x02, 0x88, 0x00, 0x5c, 0x02, 0x68, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x8c, 0xac, + 0x00, 0x10, 0x8c, 0xce, 0x00, 0x10, 0x8c, 0xd5, 0x00, 0x10, 0x8c, 0xd9, + 0x00, 0x10, 0x8c, 0xe2, 0x00, 0x10, 0x8c, 0xa9, 0x00, 0x10, 0x8c, 0xa9, + 0x00, 0x10, 0x8c, 0xa9, 0x00, 0x10, 0x8c, 0xe6, 0x00, 0x10, 0x8c, 0xf2, + 0x00, 0x10, 0x8c, 0xf2, 0x00, 0x10, 0x8c, 0xa9, 0x00, 0x10, 0x8c, 0xa9, + 0x00, 0x10, 0x8c, 0xa9, 0x00, 0x10, 0x8c, 0xa9, 0x00, 0x10, 0x8c, 0xa9, + 0x48, 0x03, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x81, 0x42, 0x81, 0xc0, 0x04, 0x02, 0x00, 0x12, 0x41, 0x78, 0x58, 0x00, + 0x59, 0x2c, 0x04, 0x04, 0x8c, 0x00, 0x05, 0x1c, 0x04, 0x02, 0x00, 0x02, + 0x59, 0x34, 0x5c, 0x05, 0x44, 0x2c, 0x28, 0x00, 0x59, 0x34, 0x00, 0x08, + 0x48, 0x00, 0x28, 0x02, 0x59, 0x34, 0x00, 0x09, 0x48, 0x00, 0x28, 0x01, + 0x59, 0x34, 0x00, 0x06, 0x48, 0x00, 0x28, 0x04, 0x59, 0x34, 0x00, 0x07, + 0x48, 0x00, 0x28, 0x03, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x0b, + 0x04, 0x01, 0xf0, 0x37, 0x59, 0x2c, 0x02, 0x07, 0x8c, 0x00, 0x05, 0x1e, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x02, 0x00, 0x32, + 0x82, 0x04, 0xb5, 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x2f, + 0x44, 0x04, 0x28, 0x00, 0x59, 0x32, 0x68, 0x09, 0x59, 0x34, 0x04, 0x00, + 0x48, 0x00, 0x28, 0x01, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x01, 0xf0, 0x28, 0x81, 0x42, 0x81, 0xc0, 0x04, 0x02, 0x00, 0x30, + 0x59, 0x34, 0x5c, 0x05, 0x44, 0x2c, 0x28, 0x00, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x21, 0x83, 0x40, 0xb5, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1e, 0x04, 0x01, 0xf0, 0x27, + 0x81, 0x42, 0x81, 0xc0, 0x04, 0x02, 0x00, 0x25, 0x59, 0x34, 0x02, 0x00, + 0x44, 0x00, 0x28, 0x00, 0x59, 0x34, 0x00, 0x01, 0x48, 0x00, 0x28, 0x01, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf0, 0x14, + 0x83, 0x40, 0xb5, 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x1b, + 0x04, 0x01, 0xf0, 0x10, 0x83, 0x40, 0xb5, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x0d, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x5d, + 0x04, 0x00, 0x00, 0x14, 0x8c, 0x20, 0x45, 0x0e, 0x04, 0x00, 0x00, 0x02, + 0x49, 0x7a, 0x60, 0x09, 0x41, 0x78, 0xb0, 0x00, 0x49, 0x7a, 0x5a, 0x06, + 0x04, 0x01, 0xf0, 0x04, 0x83, 0x40, 0xb5, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x0b, 0x59, 0x2c, 0x04, 0x04, 0x84, 0x00, 0x05, 0x1c, + 0x48, 0x02, 0x5c, 0x04, 0x59, 0x2c, 0x02, 0x07, 0x84, 0x00, 0x05, 0x1e, + 0x48, 0x02, 0x5a, 0x07, 0x04, 0x01, 0xf8, 0xaa, 0x49, 0x7a, 0x60, 0x08, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x59, 0x2c, 0x02, 0x07, + 0x8c, 0x00, 0x05, 0x1e, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x02, 0x07, 0xf2, 0x82, 0x04, 0xb5, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x07, 0xef, 0x44, 0x04, 0x28, 0x00, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf7, 0xeb, 0x49, 0x37, 0xc8, 0x57, + 0x4d, 0x30, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, + 0x04, 0x00, 0x00, 0x11, 0x49, 0x36, 0x60, 0x09, 0x4a, 0x02, 0x64, 0x06, + 0x00, 0x00, 0x00, 0x01, 0x49, 0x2e, 0x60, 0x08, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x0b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, + 0x4d, 0x38, 0x00, 0x00, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x43, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, 0x5c, 0x02, 0x70, 0x00, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x5c, 0x02, 0x60, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x37, 0xc8, 0x57, 0x4d, 0x2c, 0x00, 0x00, + 0x59, 0x32, 0x58, 0x08, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x15, + 0x04, 0x02, 0x00, 0x25, 0x59, 0xa8, 0x00, 0x15, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x02, 0x00, 0x21, 0x59, 0xa8, 0x00, 0x0f, + 0x59, 0x2c, 0x10, 0x09, 0x80, 0x08, 0x05, 0x80, 0x04, 0x02, 0x00, 0x10, + 0x4d, 0x44, 0x00, 0x00, 0x59, 0x2e, 0x8c, 0x06, 0x59, 0x2c, 0x02, 0x07, + 0x48, 0x03, 0xc8, 0x56, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x84, 0x00, 0x05, 0x48, 0x4d, 0x3c, 0x00, 0x00, 0x42, 0x02, 0x78, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x46, 0xe4, + 0x5c, 0x02, 0x78, 0x00, 0x5c, 0x02, 0x88, 0x00, 0x04, 0x01, 0xf0, 0x04, + 0x48, 0x03, 0xc8, 0x56, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x5d, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x3d, 0x04, 0x00, 0x00, 0x17, + 0x4d, 0x40, 0x00, 0x00, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x78, 0x08, 0x00, 0x04, 0x01, 0xff, 0x38, 0x5c, 0x02, 0x80, 0x00, + 0x04, 0x01, 0xf0, 0x0e, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x5d, + 0x04, 0x02, 0x07, 0xf4, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x3d, + 0x04, 0x00, 0x00, 0x0a, 0x4c, 0x58, 0x00, 0x00, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf8, 0x6e, 0x5c, 0x00, 0xb0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x78, 0xc2, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x37, 0xc8, 0x57, 0x4d, 0x30, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0x99, 0x04, 0x00, 0x00, 0x12, 0x49, 0x36, 0x60, 0x09, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x01, 0x4d, 0x3c, 0x00, 0x00, + 0x4d, 0x38, 0x00, 0x00, 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x42, 0x5d, 0x49, 0x2e, 0x60, 0x08, 0x42, 0x02, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, + 0x5c, 0x02, 0x70, 0x00, 0x5c, 0x02, 0x78, 0x00, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x5c, 0x02, 0x60, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x37, 0xc8, 0x57, 0x4d, 0x30, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x71, 0xd5, 0x04, 0x00, 0x00, 0x0d, 0x49, 0x36, 0x60, 0x09, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x01, 0x49, 0x2e, 0x60, 0x08, + 0x4d, 0x38, 0x00, 0x00, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x51, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, 0x5c, 0x02, 0x70, 0x00, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x5c, 0x02, 0x60, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x4c, 0x58, 0x00, 0x00, + 0x59, 0x32, 0x58, 0x08, 0x83, 0x38, 0x35, 0x80, 0x00, 0x00, 0x00, 0x15, + 0x04, 0x02, 0x00, 0x11, 0x59, 0x2c, 0x00, 0x08, 0x82, 0x00, 0x05, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x04, 0x02, 0x00, 0x0a, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x52, 0xd5, 0x59, 0xcc, 0x00, 0x00, 0x82, 0x00, 0x05, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x44, 0x00, 0x28, 0x00, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf8, 0x0b, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x73, 0xd3, 0x04, 0x01, 0xf0, 0x06, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf8, 0x23, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x78, 0xc2, 0x5c, 0x00, 0xb0, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x2f, 0xc8, 0x57, 0x4c, 0x58, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x80, 0x58, 0xb1, 0xc0, 0x04, 0x00, 0x00, 0x0b, 0x82, 0x58, 0x05, 0x00, + 0xff, 0xff, 0xff, 0xf0, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x80, 0x58, 0xb0, 0xd0, 0x59, 0x2c, 0x04, 0x08, 0x82, 0x00, 0x05, 0x00, + 0xff, 0xff, 0xf0, 0xff, 0x80, 0x58, 0x05, 0x40, 0x48, 0x02, 0x5c, 0x08, + 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0xb0, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x2f, 0xc8, 0x57, 0x4c, 0x00, 0x00, 0x00, 0x4c, 0x04, 0x00, 0x00, + 0x80, 0x00, 0x00, 0xd8, 0x59, 0x2c, 0x0c, 0x08, 0x82, 0x04, 0x0d, 0x00, + 0xff, 0xff, 0x0f, 0xff, 0x80, 0x04, 0x05, 0x40, 0x48, 0x02, 0x5c, 0x08, + 0x5c, 0x00, 0x08, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x4d, 0x2c, 0x00, 0x00, 0x59, 0x32, 0x58, 0x08, + 0x59, 0x2c, 0x02, 0x07, 0x84, 0x00, 0x05, 0x5e, 0x48, 0x02, 0x5a, 0x07, + 0x4c, 0x50, 0x00, 0x00, 0x4c, 0x54, 0x00, 0x00, 0x4c, 0x58, 0x00, 0x00, + 0x04, 0x01, 0xff, 0xd9, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x52, 0xd5, + 0x46, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x14, 0x28, 0x00, + 0x80, 0x58, 0xb0, 0x40, 0x83, 0xcc, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x40, 0x14, 0xa8, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa3, 0x30, + 0x5c, 0x00, 0xb0, 0x00, 0x5c, 0x00, 0xa8, 0x00, 0x5c, 0x00, 0xa0, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x08, 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x00, 0x00, 0x03, 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x32, 0x58, 0x08, + 0x59, 0x2c, 0x02, 0x04, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x01, 0x52, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x30, 0x00, 0x1f, + 0x80, 0x00, 0x05, 0x40, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x0c, 0x91, + 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0x2c, 0x00, 0x00, 0x59, 0x32, 0x58, 0x08, + 0x59, 0x30, 0x02, 0x03, 0x49, 0x33, 0xc8, 0x57, 0x49, 0x2f, 0xc8, 0x57, + 0x49, 0x3b, 0xc8, 0x57, 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x34, 0x80, + 0x00, 0x00, 0x00, 0x0e, 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x0c, 0x01, 0xf8, 0x03, 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x8e, 0x10, 0x00, 0x10, 0x8e, 0x1b, 0x00, 0x10, 0x8e, 0x59, + 0x00, 0x10, 0x8e, 0x10, 0x00, 0x10, 0x8e, 0x10, 0x00, 0x10, 0x8e, 0x10, + 0x00, 0x10, 0x8e, 0x10, 0x00, 0x10, 0x8e, 0x10, 0x00, 0x10, 0x8e, 0x12, + 0x00, 0x10, 0x8e, 0x10, 0x00, 0x10, 0x8e, 0x10, 0x00, 0x10, 0x8e, 0x10, + 0x00, 0x10, 0x8e, 0x10, 0x00, 0x10, 0x8e, 0x10, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x83, 0x38, 0x34, 0x80, 0x00, 0x00, 0x00, 0x56, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x49, 0x3a, 0x64, 0x03, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x63, 0x39, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x13, + 0x04, 0x02, 0x00, 0x10, 0x49, 0x2f, 0xc8, 0x57, 0x59, 0x2c, 0x00, 0x0c, + 0x80, 0x00, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x06, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x02, 0x59, 0xa8, 0x00, 0x34, 0x48, 0x02, 0x62, 0x06, + 0x1c, 0x01, 0xf0, 0x00, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x27, + 0x04, 0x00, 0x00, 0x1b, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x14, + 0x04, 0x00, 0x00, 0x12, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x15, + 0x04, 0x00, 0x00, 0x05, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x16, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x67, 0xa7, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x72, 0x0c, + 0x59, 0x30, 0x02, 0x03, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x04, 0x01, 0xf0, 0x16, + 0x49, 0x37, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0xc4, + 0x4a, 0x02, 0x58, 0x0e, 0x00, 0x00, 0x00, 0x11, 0x04, 0x01, 0xf0, 0x06, + 0x49, 0x37, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0xc4, + 0x4a, 0x02, 0x58, 0x0e, 0x00, 0x00, 0x00, 0x10, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x00, 0x31, 0x4a, 0x02, 0x58, 0x0d, 0x00, 0x00, 0x00, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x49, 0x75, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x71, 0x9c, + 0x59, 0x34, 0x14, 0x00, 0x82, 0x08, 0x1d, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x59, 0x30, 0x0c, 0x03, 0x48, 0x0b, 0xc8, 0x57, 0x48, 0x07, 0xc8, 0x57, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x53, 0x04, 0x00, 0x00, 0x2e, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x16, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x17, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x1c, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x00, 0x1d, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x33, 0x04, 0x00, 0x00, 0x1a, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1b, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x04, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x04, 0x01, 0xf8, 0x9e, 0x04, 0x01, 0xf0, 0x16, + 0x82, 0x0c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x08, 0x49, + 0x04, 0x01, 0xf0, 0x12, 0x82, 0x0c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0b, + 0x04, 0x02, 0x00, 0x0f, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, 0x04, 0x01, 0xf0, 0x0a, + 0x82, 0x0c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x08, 0x61, + 0x04, 0x01, 0xf0, 0x06, 0x82, 0x0c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x09, + 0x04, 0x00, 0x08, 0x86, 0x04, 0x01, 0xf0, 0x02, 0x04, 0x01, 0xf8, 0x90, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x52, 0x59, 0xa8, 0x10, 0x15, + 0x59, 0x2c, 0x04, 0x0b, 0x8c, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x03, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x59, 0x2c, 0x04, 0x0b, + 0x8c, 0x00, 0x05, 0x16, 0x04, 0x00, 0x00, 0x03, 0x82, 0x08, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x59, 0x2c, 0x00, 0x0c, 0x49, 0x7a, 0x58, 0x0d, + 0x49, 0x7a, 0x58, 0x0e, 0x80, 0x08, 0x0c, 0x80, 0x04, 0x00, 0x00, 0x09, + 0x04, 0x00, 0x10, 0x05, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x07, + 0x40, 0x00, 0x10, 0x00, 0x04, 0x01, 0xf0, 0x06, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x00, 0x15, 0x04, 0x01, 0xf0, 0x03, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x0a, 0x58, 0x0c, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x73, 0x4d, 0x04, 0x00, 0x00, 0x10, 0x59, 0x2c, 0x10, 0x01, + 0x48, 0x0a, 0x60, 0x0b, 0x58, 0x08, 0x08, 0x00, 0x82, 0x08, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x59, 0x2c, 0x10, 0x11, 0x59, 0x2c, 0x18, 0x12, + 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x20, 0x00, + 0x00, 0x10, 0x11, 0x1c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x74, 0xcd, + 0x04, 0x00, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x00, 0x2c, 0x49, 0x7a, 0x58, 0x0c, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x15, 0x04, 0x02, 0x00, 0x0a, + 0x59, 0xa8, 0x00, 0x6c, 0x8c, 0x00, 0x05, 0x02, 0x04, 0x02, 0x00, 0x0b, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x43, 0x46, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x42, 0x6c, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x42, 0x6c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x02, 0x00, 0x09, + 0x59, 0x34, 0x00, 0x02, 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x82, 0x00, 0x05, 0x80, 0x00, 0xff, 0x00, 0x00, 0x04, 0x00, 0x07, 0xec, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x49, 0xda, 0x04, 0x00, 0x07, 0xe7, 0x59, 0x2c, 0x04, 0x0b, + 0x84, 0x00, 0x05, 0x40, 0x48, 0x02, 0x5c, 0x0b, 0x04, 0x01, 0xf7, 0xe9, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x15, 0x04, 0x02, 0x00, 0x0f, + 0x59, 0xa8, 0x00, 0x6c, 0x8c, 0x00, 0x05, 0x02, 0x04, 0x02, 0x00, 0x10, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x43, 0xa7, 0x4d, 0x3c, 0x00, 0x00, + 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x5d, + 0x5c, 0x02, 0x78, 0x00, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x42, 0x6c, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x42, 0x6c, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x04, 0x02, 0x00, 0x09, 0x59, 0x34, 0x00, 0x02, + 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0x00, 0x00, 0x82, 0x00, 0x05, 0x80, + 0x00, 0xff, 0x00, 0x00, 0x04, 0x00, 0x07, 0xe7, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x49, 0xda, + 0x04, 0x00, 0x07, 0xe2, 0x59, 0x2c, 0x04, 0x0b, 0x84, 0x00, 0x05, 0x40, + 0x48, 0x02, 0x5c, 0x0b, 0x04, 0x01, 0xf7, 0xe9, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x42, 0x6c, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x15, 0x04, 0x02, 0x00, 0x05, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9b, 0x50, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x45, 0xe1, 0x1c, 0x01, 0xf0, 0x00, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x15, 0x04, 0x02, 0x00, 0x1d, 0x4c, 0x58, 0x00, 0x00, + 0x83, 0xcc, 0x14, 0x00, 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x83, 0x34, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x7d, 0x41, 0x04, 0x02, 0x00, 0x12, + 0x83, 0xcc, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x83, 0x34, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x7d, 0x41, 0x04, 0x02, 0x00, 0x09, + 0x59, 0x34, 0x22, 0x00, 0x59, 0xcc, 0x10, 0x07, 0x80, 0x08, 0x11, 0xc0, + 0x04, 0x00, 0x00, 0x03, 0x48, 0x0a, 0x68, 0x01, 0x84, 0x10, 0x25, 0x42, + 0x84, 0x10, 0x25, 0x1a, 0x48, 0x12, 0x6a, 0x00, 0x5c, 0x00, 0xb0, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x4a, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x76, 0x59, 0x30, 0x02, 0x03, 0x49, 0x33, 0xc8, 0x57, + 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x0e, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf8, 0x03, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x64, 0x63, 0x00, 0x10, 0x8f, 0x5e, + 0x00, 0x10, 0x8f, 0x6d, 0x00, 0x10, 0x8f, 0x5f, 0x00, 0x10, 0x8f, 0x5c, + 0x00, 0x10, 0x8f, 0x5c, 0x00, 0x10, 0x8f, 0x5c, 0x00, 0x10, 0x8f, 0x5c, + 0x00, 0x10, 0x8f, 0x5c, 0x00, 0x10, 0x8f, 0x5c, 0x00, 0x10, 0x8f, 0x5c, + 0x00, 0x10, 0x8f, 0x5c, 0x00, 0x10, 0x8f, 0x5c, 0x00, 0x10, 0x8f, 0x5c, + 0x00, 0x10, 0x8f, 0x5c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x30, 0x04, 0x03, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x52, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x85, 0x86, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x49, 0x75, 0x59, 0x32, 0x58, 0x08, + 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x06, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x71, 0x9c, + 0x59, 0x30, 0x18, 0x04, 0x84, 0x0c, 0x05, 0x20, 0x48, 0x02, 0x60, 0x04, + 0x59, 0x8c, 0x00, 0x0d, 0x81, 0x30, 0x05, 0x80, 0x04, 0x02, 0x00, 0x10, + 0x8c, 0x0c, 0x1d, 0x20, 0x04, 0x02, 0x00, 0x10, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x10, 0xaf, 0xc4, 0x50, 0x08, 0x10, 0x00, 0x58, 0x08, 0x00, 0x02, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x0f, + 0x58, 0x08, 0x00, 0x0c, 0x81, 0x30, 0x05, 0x80, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x49, 0x78, 0x10, 0x0c, 0x04, 0x01, 0xf0, 0x03, + 0x8c, 0x0c, 0x1d, 0x20, 0x04, 0x02, 0x07, 0xdc, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xcc, 0xce, 0x80, 0xc4, 0x00, 0x40, 0x04, 0x00, 0x07, 0xd8, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x66, 0xd5, 0x04, 0x00, 0x07, 0xf8, 0x59, 0x30, 0x02, 0x03, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf7, 0xbc, 0x49, 0x33, 0xc8, 0x57, + 0x4c, 0x50, 0x00, 0x00, 0x4c, 0x54, 0x00, 0x00, 0x4c, 0x58, 0x00, 0x00, + 0x59, 0x2c, 0x0c, 0x07, 0x48, 0x06, 0x58, 0x0a, 0x59, 0xcc, 0x08, 0x09, + 0x48, 0x06, 0x58, 0x07, 0x59, 0xcc, 0x08, 0x08, 0x48, 0x06, 0x58, 0x0b, + 0x59, 0xa8, 0x08, 0x6b, 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0x03, 0xff, + 0x80, 0x00, 0x10, 0xc4, 0x8c, 0x04, 0x0d, 0x14, 0x04, 0x00, 0x00, 0x05, + 0x59, 0xcc, 0x00, 0x02, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x80, 0x08, 0x14, 0x80, 0x82, 0x08, 0x04, 0x80, 0x00, 0x00, 0x00, 0xf1, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x48, 0x0a, 0x62, 0x1a, + 0x41, 0x2c, 0x08, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x04, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x49, 0x2c, 0x08, 0x09, + 0x58, 0x04, 0x04, 0x08, 0x84, 0x00, 0x05, 0x52, 0x84, 0x00, 0x05, 0x40, + 0x48, 0x00, 0x0c, 0x08, 0x82, 0x08, 0x14, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x80, 0x08, 0x11, 0x04, 0x83, 0xcc, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x83, 0x2c, 0xac, 0x00, 0x00, 0x00, 0x00, 0x04, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x82, 0x08, 0x04, 0x80, 0x00, 0x00, 0x00, 0x10, + 0x04, 0x02, 0x10, 0x03, 0x40, 0x08, 0x08, 0x00, 0x80, 0x00, 0x05, 0x80, + 0x40, 0x04, 0xb0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x41, 0x5c, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xc0, + 0x04, 0x00, 0x00, 0x0d, 0x41, 0x2c, 0x10, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x04, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x49, 0x2c, 0x10, 0x01, 0x83, 0x2c, 0xac, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x5c, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, + 0x04, 0x01, 0xf7, 0xe9, 0x5c, 0x00, 0xb0, 0x00, 0x5c, 0x00, 0xa8, 0x00, + 0x5c, 0x00, 0xa0, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, + 0x4d, 0x2c, 0x00, 0x00, 0x4c, 0x38, 0x00, 0x00, 0x59, 0x32, 0x58, 0x08, + 0x59, 0x30, 0x02, 0x1a, 0x48, 0x02, 0x5a, 0x08, 0x59, 0x30, 0x10, 0x11, + 0x80, 0x08, 0x11, 0xc0, 0x04, 0x02, 0x00, 0x08, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x59, 0x2c, 0x00, 0x0b, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x00, 0x0b, 0x04, 0x01, 0xf0, 0x0b, + 0x8c, 0x08, 0x15, 0x3e, 0x04, 0x00, 0x00, 0x06, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x00, 0x07, 0x80, 0x08, 0x10, 0x80, 0x80, 0x08, 0x10, 0x00, + 0x04, 0x01, 0xf0, 0x03, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x15, + 0x48, 0x0a, 0x58, 0x07, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb6, 0xa8, + 0x50, 0x00, 0x70, 0x00, 0x58, 0x38, 0x00, 0x0b, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x02, 0x00, 0x08, 0x49, 0x30, 0x70, 0x0c, 0x49, 0x30, 0x70, 0x0b, + 0x58, 0x38, 0x00, 0x02, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x08, 0x09, 0x04, 0x01, 0xf0, 0x05, 0x82, 0x00, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x45, 0x30, 0x10, 0x00, 0x49, 0x30, 0x70, 0x0b, + 0x5c, 0x00, 0x70, 0x00, 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x59, 0x2c, 0x00, 0x09, 0x40, 0x00, 0x10, 0x00, + 0x48, 0x00, 0x70, 0x0a, 0x82, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x48, 0x00, 0x70, 0x03, 0x59, 0x2c, 0x00, 0x0d, 0x59, 0x2c, 0x10, 0x0e, + 0x48, 0x00, 0x70, 0x07, 0x48, 0x08, 0x70, 0x08, 0x59, 0x2c, 0x00, 0x0a, + 0x59, 0x2c, 0x12, 0x08, 0x80, 0x08, 0x0c, 0x80, 0x04, 0x00, 0x10, 0x02, + 0x40, 0x00, 0x10, 0x00, 0x82, 0x08, 0x14, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x80, 0x08, 0x11, 0x04, 0x82, 0x08, 0x04, 0x80, 0x00, 0x00, 0x00, 0x10, + 0x04, 0x02, 0x10, 0x03, 0x80, 0x00, 0x05, 0x80, 0x04, 0x01, 0xf0, 0x03, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x70, 0x0d, + 0x48, 0x08, 0x70, 0x04, 0x80, 0x08, 0x10, 0xc4, 0x48, 0x08, 0x70, 0x05, + 0x40, 0x38, 0x10, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x9e, + 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0x2c, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x07, 0x04, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x10, 0xb6, 0xa8, 0x45, 0x2c, 0x08, 0x00, + 0x49, 0x7a, 0x58, 0x0b, 0x49, 0x7a, 0x58, 0x0c, 0x49, 0x7a, 0x58, 0x0d, + 0x4a, 0x02, 0x58, 0x09, 0x00, 0x10, 0x90, 0x3e, 0x4a, 0x02, 0x58, 0x02, + 0x00, 0x00, 0x01, 0x00, 0x4a, 0x02, 0x58, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x33, 0xc8, 0x57, + 0x4d, 0x30, 0x00, 0x00, 0x4d, 0x2c, 0x00, 0x00, 0x4c, 0x5c, 0x00, 0x00, + 0x40, 0x30, 0xb8, 0x00, 0x58, 0x5c, 0x00, 0x0a, 0x80, 0x02, 0x5d, 0x40, + 0x04, 0x02, 0x00, 0x04, 0x58, 0x5c, 0x00, 0x0c, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf0, 0x44, 0x58, 0x5c, 0x00, 0x02, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x01, 0x00, 0x04, 0x02, 0x00, 0x22, 0x59, 0x2c, 0x08, 0x01, + 0x4c, 0x04, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x2e, + 0x5c, 0x00, 0x08, 0x00, 0x80, 0x04, 0x09, 0xc0, 0x04, 0x00, 0x00, 0x1c, + 0x48, 0x04, 0xb8, 0x0a, 0x58, 0x5c, 0x10, 0x0d, 0x80, 0x08, 0x11, 0xc0, + 0x04, 0x02, 0x00, 0x05, 0x40, 0x06, 0x58, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x07, 0x3b, 0x04, 0x01, 0xf0, 0x14, 0x82, 0x08, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x10, 0x04, 0x02, 0x10, 0x03, 0x80, 0x00, 0x05, 0x80, + 0x04, 0x01, 0xf0, 0x03, 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x48, 0x00, 0xb8, 0x0d, 0x48, 0x08, 0xb8, 0x04, 0x80, 0x08, 0x10, 0xc4, + 0x48, 0x08, 0xb8, 0x05, 0x82, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x48, 0x00, 0xb8, 0x03, 0x40, 0x5c, 0x10, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x07, 0x9e, 0x04, 0x01, 0xf0, 0x25, 0x04, 0x01, 0xf8, 0x28, + 0x58, 0x5c, 0x00, 0x0c, 0x80, 0x02, 0x65, 0x40, 0x59, 0x30, 0x00, 0x00, + 0x80, 0x00, 0x0d, 0x40, 0x04, 0x02, 0x00, 0x02, 0x48, 0x00, 0xb8, 0x0b, + 0x48, 0x00, 0xb8, 0x0c, 0x49, 0x7a, 0x60, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x49, 0x78, 0xb8, 0x0a, 0x59, 0x32, 0x58, 0x08, 0x4a, 0x02, 0x5a, 0x04, + 0x00, 0x00, 0x01, 0x03, 0x59, 0x30, 0x04, 0x02, 0x48, 0x02, 0x5c, 0x06, + 0x59, 0x2c, 0x10, 0x0b, 0x4c, 0x08, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x89, 0x42, + 0x5c, 0x00, 0x10, 0x00, 0x8c, 0x08, 0x15, 0x18, 0x04, 0x00, 0x00, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x89, 0xf0, 0x04, 0x01, 0xf0, 0x03, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x40, 0x5c, 0x70, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x80, 0x02, 0x65, 0x40, 0x04, 0x00, 0x00, 0x03, + 0x59, 0x32, 0x58, 0x08, 0x04, 0x01, 0xff, 0x78, 0x5c, 0x00, 0xb8, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x5c, 0x02, 0x60, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x3b, 0xc8, 0x57, 0x58, 0x38, 0x00, 0x0a, 0x40, 0x02, 0x58, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x3b, 0x58, 0x38, 0x00, 0x0c, + 0x80, 0x02, 0x65, 0x40, 0x59, 0x30, 0x00, 0x08, 0x80, 0x02, 0x5d, 0x40, + 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x03, 0xc8, 0x57, 0x4d, 0x1c, 0x00, 0x00, 0x49, 0x7a, 0x60, 0x1c, + 0x41, 0x32, 0x38, 0x00, 0x40, 0x02, 0x60, 0x00, 0x4d, 0x3c, 0x00, 0x00, + 0x42, 0x02, 0x78, 0x00, 0x00, 0x00, 0x00, 0x05, 0x04, 0x01, 0xf8, 0x3f, + 0x5c, 0x02, 0x78, 0x00, 0x41, 0x1e, 0x60, 0x00, 0x59, 0x30, 0x04, 0x14, + 0x84, 0x00, 0x05, 0x02, 0x48, 0x02, 0x64, 0x14, 0x5c, 0x02, 0x38, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x1b, 0xc8, 0x57, 0x49, 0x33, 0xc8, 0x57, + 0x4c, 0x5c, 0x00, 0x00, 0x4c, 0x60, 0x00, 0x00, 0x40, 0x10, 0xb8, 0x00, + 0x40, 0x14, 0xc0, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa1, 0x37, + 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x00, 0x00, 0x08, 0x40, 0x60, 0x28, 0x00, + 0x40, 0x5c, 0x30, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9c, 0x1c, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x02, + 0x80, 0x00, 0x05, 0x80, 0x5c, 0x00, 0xc0, 0x00, 0x5c, 0x00, 0xb8, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x03, 0xc8, 0x56, 0x4d, 0x30, 0x00, 0x00, + 0x42, 0x02, 0x60, 0x00, 0x00, 0x10, 0xd8, 0xd4, 0x59, 0xa8, 0x00, 0x0d, + 0x81, 0x64, 0x05, 0x80, 0x04, 0x00, 0x00, 0x1a, 0x59, 0x30, 0x0c, 0x06, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x0d, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x06, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x84, 0xf8, 0x04, 0x01, 0xf0, 0x09, 0x59, 0x30, 0x02, 0x03, + 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x07, 0x04, 0x00, 0x00, 0x05, + 0x48, 0x07, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8b, 0x0d, + 0x04, 0x02, 0x08, 0x08, 0x83, 0x32, 0x64, 0x00, 0x00, 0x00, 0x00, 0x24, + 0x41, 0x58, 0x00, 0x00, 0x81, 0x30, 0x04, 0x80, 0x04, 0x00, 0x17, 0xe5, + 0x5c, 0x02, 0x60, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, + 0x59, 0x30, 0x04, 0x03, 0x48, 0x03, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x76, 0x4d, 0xf0, 0x00, 0x00, 0x59, 0x30, 0x04, 0x06, + 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x00, 0x00, 0x18, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x00, 0x00, 0x09, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x00, 0x00, 0x06, 0x49, 0x33, 0xc8, 0x56, 0x5c, 0x03, 0xe0, 0x00, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x64, 0x63, 0x04, 0x01, 0xf0, 0x3d, + 0x59, 0x30, 0x02, 0x03, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x00, 0x00, 0x18, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x00, 0x00, 0x27, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x00, 0x00, 0x24, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x59, 0x30, 0x02, 0x03, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x09, + 0x04, 0x00, 0x00, 0x0c, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x0b, + 0x04, 0x00, 0x00, 0x09, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x0a, + 0x04, 0x00, 0x00, 0x18, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x0c, + 0x04, 0x00, 0x00, 0x15, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x59, 0x8c, 0x00, 0x0d, 0x81, 0x30, 0x05, 0x80, 0x04, 0x02, 0x00, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x66, 0xd5, 0x04, 0x02, 0x00, 0x0d, + 0x59, 0x30, 0x00, 0x04, 0x48, 0x03, 0xc8, 0x57, 0x8c, 0x00, 0x05, 0x20, + 0x04, 0x00, 0x00, 0x04, 0x84, 0x00, 0x05, 0x20, 0x48, 0x02, 0x60, 0x04, + 0x04, 0x01, 0xf0, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xcc, 0xce, + 0x80, 0xc4, 0x00, 0x40, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x5c, 0x03, 0xe0, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x64, 0x63, + 0x59, 0x30, 0x04, 0x06, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x00, 0x00, 0x09, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x49, 0x75, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x89, 0x69, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x78, 0xc2, 0x8d, 0x3e, 0x7d, 0x00, 0x04, 0x00, 0x00, 0x03, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x71, 0x9c, 0x4a, 0x02, 0x62, 0x1d, + 0x00, 0x00, 0x00, 0x01, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x85, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x09, 0x4a, 0x02, 0x64, 0x06, + 0x00, 0x00, 0x00, 0x02, 0x42, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, 0x4b, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0x5c, 0x49, 0x33, 0xc8, 0x57, + 0x59, 0x36, 0x8c, 0x03, 0x4c, 0x18, 0x00, 0x00, 0x59, 0x30, 0x02, 0x03, + 0x82, 0x00, 0x34, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x30, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x91, 0x62, 0x00, 0x10, 0x96, 0x5b, + 0x00, 0x10, 0x97, 0x5f, 0x00, 0x10, 0x91, 0x62, 0x00, 0x10, 0x91, 0x62, + 0x00, 0x10, 0x91, 0x62, 0x00, 0x10, 0x91, 0x62, 0x00, 0x10, 0x91, 0x62, + 0x00, 0x10, 0x91, 0x85, 0x00, 0x10, 0x91, 0x62, 0x00, 0x10, 0x91, 0x62, + 0x00, 0x10, 0x91, 0x62, 0x00, 0x10, 0x91, 0x62, 0x00, 0x10, 0x91, 0x62, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x49, 0x33, 0xc8, 0x57, + 0x42, 0x02, 0x88, 0x00, 0x00, 0x00, 0xff, 0xff, 0x81, 0x36, 0x69, 0xc0, + 0x04, 0x00, 0x00, 0x02, 0x59, 0x36, 0x8c, 0x03, 0x4c, 0x18, 0x00, 0x00, + 0x59, 0x30, 0x02, 0x03, 0x82, 0x00, 0x34, 0x80, 0x00, 0x00, 0x00, 0x0e, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf8, 0x03, + 0x5c, 0x00, 0x30, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x91, 0x81, + 0x00, 0x10, 0x9a, 0x0d, 0x00, 0x10, 0x91, 0x81, 0x00, 0x10, 0x91, 0x81, + 0x00, 0x10, 0x91, 0x81, 0x00, 0x10, 0x91, 0x81, 0x00, 0x10, 0x91, 0x81, + 0x00, 0x10, 0xa1, 0x4a, 0x00, 0x10, 0x99, 0x7c, 0x00, 0x10, 0x9d, 0x17, + 0x00, 0x10, 0x9d, 0x4d, 0x00, 0x10, 0x9d, 0x17, 0x00, 0x10, 0x9d, 0x4d, + 0x00, 0x10, 0x91, 0x81, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x83, 0x38, 0x34, 0x80, + 0x00, 0x00, 0x00, 0x51, 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x41, 0x38, 0x00, 0x00, 0x49, 0x3b, 0xc8, 0x57, 0x4d, 0x1c, 0x00, 0x00, + 0x4d, 0x40, 0x00, 0x00, 0x0c, 0x01, 0xf8, 0x04, 0x5c, 0x02, 0x80, 0x00, + 0x5c, 0x02, 0x38, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x91, 0xe2, + 0x00, 0x10, 0x93, 0xc1, 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xe2, + 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x93, 0xcc, 0x00, 0x10, 0x91, 0xe2, + 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xe2, + 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xe2, + 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xe2, + 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xe2, + 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xe2, + 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x92, 0x04, 0x00, 0x10, 0x92, 0x41, + 0x00, 0x10, 0x92, 0x58, 0x00, 0x10, 0x92, 0xb4, 0x00, 0x10, 0x93, 0x1a, + 0x00, 0x10, 0x93, 0x57, 0x00, 0x10, 0x93, 0x87, 0x00, 0x10, 0x91, 0xe2, + 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x93, 0xd4, 0x00, 0x10, 0x91, 0xe2, + 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x93, 0xe2, 0x00, 0x10, 0x93, 0xeb, + 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xe2, + 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x94, 0x85, + 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x92, 0xef, + 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x94, 0x44, + 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xe2, + 0x00, 0x10, 0x94, 0x93, 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xe2, + 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x94, 0xdf, 0x00, 0x10, 0x91, 0xe2, + 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xe2, + 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x95, 0x2f, + 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x95, 0x5b, 0x00, 0x10, 0x95, 0x66, + 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xe4, + 0x00, 0x10, 0x95, 0x71, 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xe2, + 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xf3, 0x00, 0x10, 0x91, 0xe2, + 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x91, 0xe2, 0x00, 0x10, 0x95, 0x78, + 0x00, 0x10, 0x95, 0x80, 0x00, 0x10, 0x95, 0x9e, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x49, 0x33, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x9d, 0x7d, 0x04, 0x02, 0x03, 0xc2, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x1c, 0xd8, 0x04, 0x02, 0x03, 0xbf, 0x59, 0xcc, 0x04, 0x07, + 0x48, 0x02, 0x60, 0x1c, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x45, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x63, 0x39, 0x49, 0x33, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x9d, 0x7d, 0x04, 0x02, 0x03, 0xb3, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x1c, 0xd8, 0x04, 0x02, 0x03, 0xb0, 0x04, 0x01, 0xfb, 0xf0, + 0x04, 0x02, 0x01, 0x9b, 0x59, 0xcc, 0x00, 0x07, 0x48, 0x02, 0x60, 0x1c, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x4a, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x63, 0x39, + 0x49, 0x33, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1c, 0xd8, + 0x04, 0x02, 0x00, 0x09, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x46, 0x14, + 0x04, 0x02, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x08, 0x04, 0x02, 0x00, 0x08, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x09, 0x4a, 0x02, 0x64, 0x1a, + 0x00, 0x00, 0x00, 0x09, 0x4a, 0x02, 0x62, 0x1a, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf1, 0xb2, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x44, + 0x04, 0x00, 0x00, 0x17, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9a, 0xe0, + 0x04, 0x02, 0x00, 0x1e, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, + 0x4d, 0x3c, 0x00, 0x00, 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xca, 0xa0, 0x5c, 0x02, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x43, 0x46, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x08, + 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x03, 0x8d, 0x0e, 0x1d, 0x20, + 0x04, 0x00, 0x01, 0x9d, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x07, + 0x41, 0x78, 0x28, 0x00, 0x04, 0x01, 0xf1, 0x88, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x9b, 0xad, 0x04, 0x02, 0x07, 0xe8, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x09, 0x4a, 0x02, 0x64, 0x1a, 0x00, 0x00, 0x00, 0x0e, + 0x4a, 0x02, 0x62, 0x1a, 0x00, 0x00, 0x19, 0x00, 0x04, 0x01, 0xf1, 0x8f, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x09, 0x4a, 0x02, 0x64, 0x1a, + 0x00, 0x00, 0x00, 0x03, 0x4a, 0x02, 0x62, 0x1a, 0x00, 0x00, 0x0f, 0x00, + 0x04, 0x01, 0xf1, 0x88, 0x49, 0x33, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x1c, 0xd8, 0x04, 0x02, 0x03, 0x65, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x46, 0x14, 0x04, 0x02, 0x03, 0x62, 0x49, 0x3a, 0x64, 0x03, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9a, 0xbb, 0x04, 0x02, 0x00, 0x06, + 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x05, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x06, 0x04, 0x01, 0xf7, 0xda, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x07, 0x4a, 0x02, 0x64, 0x1a, 0x00, 0x00, 0x00, 0x09, + 0x4a, 0x02, 0x62, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf1, 0x71, + 0x49, 0x33, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x46, 0x14, + 0x04, 0x02, 0x03, 0x4e, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9d, 0x7d, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x1c, 0xd8, 0x04, 0x02, 0x03, 0x49, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x44, 0x04, 0x02, 0x00, 0x05, + 0x42, 0x02, 0x78, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x42, 0x5d, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x2e, + 0x04, 0x02, 0x00, 0x31, 0x59, 0xcc, 0x02, 0x06, 0x82, 0x00, 0x35, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x00, 0x34, 0x82, 0x00, 0x34, 0x80, + 0x00, 0x00, 0x00, 0x14, 0x04, 0x00, 0x10, 0x31, 0x59, 0x34, 0x30, 0x0a, + 0x84, 0x18, 0x35, 0x16, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x14, + 0x04, 0x02, 0x00, 0x02, 0x84, 0x18, 0x35, 0x56, 0x48, 0x1a, 0x68, 0x0a, + 0x59, 0xcc, 0x04, 0x06, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x02, 0x00, 0x26, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9b, 0x2d, + 0x04, 0x02, 0x00, 0x2e, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x19, + 0x04, 0x02, 0x00, 0x07, 0x4c, 0x60, 0x00, 0x00, 0x41, 0x78, 0xc0, 0x00, + 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1c, 0x5e, + 0x5c, 0x00, 0xc0, 0x00, 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x02, 0x00, 0x09, 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa1, 0x2f, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x34, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x43, 0xa7, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x0a, 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x04, 0x01, 0xf7, 0x90, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x0b, + 0x4a, 0x02, 0x64, 0x1a, 0x00, 0x00, 0x00, 0x09, 0x4a, 0x02, 0x62, 0x1a, + 0x00, 0x00, 0x1e, 0x00, 0x04, 0x01, 0xf1, 0x27, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x2f, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x0b, 0x4a, 0x02, 0x64, 0x1a, + 0x00, 0x00, 0x00, 0x07, 0x4a, 0x02, 0x62, 0x1a, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf1, 0x1c, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x0b, + 0x4a, 0x02, 0x64, 0x1a, 0x00, 0x00, 0x00, 0x03, 0x4a, 0x02, 0x62, 0x1a, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf1, 0x15, 0x49, 0x33, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x46, 0x14, 0x04, 0x02, 0x02, 0xf2, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9d, 0x7d, 0x04, 0x02, 0x02, 0xef, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1c, 0xd8, 0x04, 0x02, 0x02, 0xec, + 0x59, 0xcc, 0x02, 0x06, 0x82, 0x00, 0x35, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x02, 0x00, 0x20, 0x82, 0x00, 0x34, 0x80, 0x00, 0x00, 0x00, 0x14, + 0x04, 0x00, 0x10, 0x1d, 0x59, 0xcc, 0x04, 0x06, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x00, 0x19, 0x59, 0x34, 0x04, 0x00, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x07, 0x07, 0x04, 0x00, 0x00, 0x1c, + 0x41, 0x7a, 0x78, 0x00, 0x4c, 0x60, 0x00, 0x00, 0x41, 0x78, 0xc0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1c, 0x5e, 0x5c, 0x00, 0xc0, 0x00, + 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa1, 0x2f, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x31, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x0c, 0x41, 0x78, 0x28, 0x00, 0x42, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x21, 0x04, 0x01, 0xf7, 0x4a, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x0d, 0x4a, 0x02, 0x64, 0x1a, 0x00, 0x00, 0x00, 0x07, + 0x4a, 0x02, 0x62, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf0, 0xe1, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x0d, 0x4a, 0x02, 0x64, 0x1a, + 0x00, 0x00, 0x00, 0x09, 0x4a, 0x02, 0x62, 0x1a, 0x00, 0x00, 0x1e, 0x00, + 0x04, 0x01, 0xf0, 0xda, 0x49, 0x33, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x46, 0x14, 0x04, 0x02, 0x02, 0xb7, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x9d, 0x7d, 0x04, 0x02, 0x02, 0xb4, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x1c, 0xd8, 0x04, 0x02, 0x02, 0xb1, 0x04, 0x01, 0xfa, 0xf1, + 0x04, 0x02, 0x00, 0x19, 0x49, 0x3a, 0x64, 0x03, 0x4c, 0x5c, 0x00, 0x00, + 0x04, 0x01, 0xfa, 0xf7, 0x04, 0x02, 0x00, 0x0d, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x2e, 0x40, 0x14, 0xb8, 0x00, 0x8d, 0x0e, 0x1d, 0x20, + 0x04, 0x00, 0x00, 0x0e, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x07, + 0x40, 0x5c, 0x28, 0x00, 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x24, + 0x5c, 0x00, 0xb8, 0x00, 0x04, 0x01, 0xf0, 0xad, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x0d, 0x4a, 0x02, 0x64, 0x1a, 0x00, 0x00, 0x00, 0x07, + 0x4a, 0x02, 0x62, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0xb8, 0x00, + 0x04, 0x01, 0xf0, 0xb6, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x0d, + 0x4a, 0x02, 0x64, 0x1a, 0x00, 0x00, 0x00, 0x09, 0x4a, 0x02, 0x62, 0x1a, + 0x00, 0x00, 0x1e, 0x00, 0x04, 0x01, 0xf0, 0xaf, 0x49, 0x33, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x46, 0x14, 0x04, 0x02, 0x06, 0xf3, + 0x59, 0xa8, 0x00, 0x23, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x06, 0xed, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x2e, 0x04, 0x02, 0x00, 0x2c, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9b, 0x35, 0x04, 0x02, 0x00, 0x07, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x0e, 0x41, 0x78, 0x28, 0x00, + 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x52, 0x04, 0x01, 0xf6, 0xfb, + 0x49, 0x33, 0xc8, 0x57, 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa1, 0x37, 0x4d, 0x3c, 0x00, 0x00, + 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0xa0, + 0x5c, 0x02, 0x78, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x33, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x59, 0x34, 0x02, 0x00, + 0x84, 0x00, 0x05, 0x58, 0x48, 0x02, 0x6a, 0x00, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x0b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, + 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x00, 0x00, 0x7b, 0x42, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x04, 0x01, 0xf0, 0x60, 0x49, 0x33, 0xc8, 0x57, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x0f, 0x4a, 0x02, 0x64, 0x1a, + 0x00, 0x00, 0x00, 0x03, 0x4a, 0x02, 0x62, 0x1a, 0x00, 0x00, 0x1e, 0x00, + 0x04, 0x01, 0xf0, 0x77, 0x59, 0x34, 0x04, 0x00, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x07, 0x03, 0x04, 0x00, 0x07, 0xf5, 0x04, 0x01, 0xf0, 0x40, + 0x49, 0x33, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x46, 0x14, + 0x04, 0x02, 0x02, 0x4f, 0x59, 0xa8, 0x00, 0x23, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x08, + 0x04, 0x00, 0x02, 0x49, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x25, + 0x04, 0x02, 0x00, 0x2f, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9b, 0x50, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x9a, 0xe0, 0x04, 0x02, 0x00, 0x07, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x10, 0x41, 0x78, 0x28, 0x00, + 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x50, 0x04, 0x01, 0xf6, 0xbc, + 0x4d, 0x3c, 0x00, 0x00, 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xca, 0xa0, 0x5c, 0x02, 0x78, 0x00, 0x42, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa1, 0x37, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x33, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x59, 0x34, 0x02, 0x00, 0x84, 0x00, 0x05, 0x58, + 0x48, 0x02, 0x6a, 0x00, 0x04, 0x01, 0xf7, 0xc6, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x11, 0x4a, 0x02, 0x64, 0x1a, 0x00, 0x00, 0x00, 0x03, + 0x4a, 0x02, 0x62, 0x1a, 0x00, 0x00, 0x1e, 0x00, 0x04, 0x01, 0xf0, 0x42, + 0x49, 0x33, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1c, 0xd8, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x9d, 0x7d, 0x04, 0x02, 0x02, 0x1d, + 0x04, 0x01, 0xfa, 0x5d, 0x04, 0x02, 0x00, 0x08, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x12, 0x04, 0x01, 0xf0, 0x37, 0x59, 0x34, 0x04, 0x00, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x07, 0x03, 0x04, 0x00, 0x07, 0xeb, + 0x4d, 0x3c, 0x00, 0x00, 0x41, 0x7a, 0x78, 0x00, 0x42, 0x02, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x29, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0xa0, + 0x5c, 0x02, 0x78, 0x00, 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x17, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa1, 0x37, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x33, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x00, 0x00, 0x1b, 0x42, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, + 0x49, 0x33, 0xc8, 0x57, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x01, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x07, 0x4c, 0x18, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa1, 0x69, 0x5c, 0x00, 0x30, 0x00, + 0x41, 0x78, 0x28, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x9c, 0x14, + 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x46, 0x4c, 0x14, 0x00, 0x00, + 0x4c, 0x18, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa1, 0x69, + 0x5c, 0x00, 0x30, 0x00, 0x5c, 0x00, 0x28, 0x00, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x9c, 0x14, 0x49, 0x33, 0xc8, 0x57, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0b, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x63, 0x39, + 0x49, 0x33, 0xc8, 0x57, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x05, 0x04, 0x01, 0xf7, 0xf5, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x9d, 0x7d, 0x04, 0x02, 0x01, 0xd3, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x1c, 0xd8, 0x04, 0x02, 0x01, 0xd0, 0x04, 0x01, 0xfa, 0x10, + 0x04, 0x02, 0x07, 0xbb, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x20, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x63, 0x39, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1c, 0xd8, + 0x04, 0x02, 0x01, 0xc5, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x23, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x63, 0x39, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9d, 0x7d, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x1c, 0xd8, 0x04, 0x02, 0x01, 0xba, + 0x04, 0x01, 0xf9, 0xfa, 0x04, 0x02, 0x07, 0xa5, 0x40, 0x30, 0x08, 0x00, + 0x59, 0xa8, 0x10, 0x0f, 0x59, 0xcc, 0x00, 0x07, 0x82, 0x00, 0x05, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x80, 0x08, 0x05, 0x80, 0x04, 0x00, 0x00, 0x19, + 0x59, 0xcc, 0x14, 0x08, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x29, + 0x04, 0x00, 0x00, 0x2d, 0x59, 0xcc, 0x0c, 0x08, 0x4d, 0x30, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x59, 0xaa, 0x41, 0x32, 0x38, 0x00, + 0x5c, 0x02, 0x60, 0x00, 0x04, 0x00, 0x00, 0x26, 0x59, 0x1c, 0x02, 0x02, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x05, + 0x59, 0xcc, 0x12, 0x08, 0x59, 0x1c, 0x02, 0x02, 0x80, 0x08, 0x05, 0x80, + 0x04, 0x02, 0x00, 0x1e, 0x59, 0x1c, 0x04, 0x06, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x07, 0x04, 0x02, 0x00, 0x1a, 0x04, 0x01, 0xf0, 0x2c, + 0x59, 0xcc, 0x12, 0x08, 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x0c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8c, 0x55, + 0x04, 0x00, 0x00, 0x12, 0x59, 0xcc, 0x14, 0x08, 0x59, 0x1c, 0x02, 0x02, + 0x80, 0x08, 0x05, 0x80, 0x04, 0x02, 0x00, 0x0e, 0x59, 0x1c, 0x00, 0x09, + 0x81, 0x34, 0x05, 0x80, 0x04, 0x00, 0x00, 0x16, 0x04, 0x01, 0xf0, 0x0a, + 0x59, 0xcc, 0x14, 0x08, 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x9b, 0xdc, 0x04, 0x02, 0x00, 0x10, 0x59, 0xcc, 0x12, 0x08, + 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x19, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x26, 0x4a, 0x02, 0x62, 0x1a, + 0x00, 0x00, 0x17, 0x00, 0x59, 0xcc, 0x12, 0x04, 0x82, 0x08, 0x15, 0x80, + 0x00, 0x00, 0xff, 0xff, 0x04, 0x02, 0x07, 0x98, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x25, 0x04, 0x01, 0xf7, 0x95, 0x59, 0x1c, 0x04, 0x06, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x07, 0x04, 0x02, 0x07, 0xf2, + 0x59, 0x1c, 0x04, 0x03, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x24, + 0x04, 0x02, 0x00, 0x06, 0x4d, 0x30, 0x00, 0x00, 0x41, 0x1e, 0x60, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x5c, 0x02, 0x60, 0x00, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x25, 0x04, 0x01, 0xf7, 0x85, + 0x49, 0x33, 0xc8, 0x57, 0x4d, 0x3c, 0x00, 0x00, 0x42, 0x02, 0x78, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x5d, + 0x5c, 0x02, 0x78, 0x00, 0x4c, 0x58, 0x00, 0x00, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x83, 0xa8, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x83, 0xcc, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x7d, 0x41, 0x5c, 0x00, 0xb0, 0x00, 0x04, 0x00, 0x00, 0x04, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x31, 0x04, 0x01, 0xf7, 0x70, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x83, 0xa8, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xcc, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x7d, 0x41, 0x04, 0x02, 0x00, 0x10, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x59, 0xa9, 0x04, 0x00, 0x00, 0x0d, 0x59, 0x30, 0x04, 0x06, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x01, 0x04, 0x02, 0x00, 0x09, + 0x59, 0x30, 0x04, 0x03, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x02, 0x00, 0x05, 0x59, 0x30, 0x00, 0x09, 0x81, 0x34, 0x05, 0x80, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x02, 0x00, 0x0f, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0xd3, 0x04, 0x02, 0x00, 0x08, 0x4a, 0x03, 0x50, 0x30, + 0x00, 0x00, 0x00, 0x01, 0x42, 0x02, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0x16, 0x04, 0x01, 0xf0, 0x05, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0x7e, 0x1c, 0x01, 0xf0, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x1c, 0xd8, 0x04, 0x02, 0x01, 0x22, 0x04, 0x01, 0xf9, 0x62, + 0x04, 0x02, 0x07, 0x0d, 0x49, 0x3a, 0x64, 0x03, 0x04, 0x01, 0xf9, 0xb2, + 0x04, 0x02, 0x00, 0x04, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x2b, + 0x04, 0x01, 0xf7, 0x39, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x2c, + 0x04, 0x01, 0xf7, 0x36, 0x49, 0x33, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5a, 0xe9, 0x04, 0x02, 0x01, 0x13, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x1c, 0xd8, 0x04, 0x02, 0x01, 0x10, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x47, 0x19, 0x04, 0x02, 0x07, 0x25, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x45, 0xf8, 0x04, 0x00, 0x00, 0x3c, 0x59, 0xcc, 0x04, 0x08, + 0x48, 0x02, 0x64, 0x19, 0x59, 0xcc, 0x02, 0x08, 0x48, 0x02, 0x62, 0x19, + 0x59, 0xcc, 0x08, 0x07, 0x59, 0x34, 0x00, 0x02, 0x82, 0x00, 0x05, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x80, 0x04, 0x05, 0x80, 0x04, 0x00, 0x00, 0x12, + 0x59, 0xa8, 0x00, 0x0f, 0x80, 0x04, 0x05, 0x80, 0x04, 0x02, 0x00, 0x21, + 0x59, 0xcc, 0x14, 0x08, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8c, 0x55, + 0x04, 0x00, 0x00, 0x23, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9c, 0xb5, + 0x04, 0x00, 0x00, 0x20, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa1, 0x16, + 0x04, 0x00, 0x00, 0x1d, 0x49, 0x1e, 0x60, 0x1e, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x36, 0x04, 0x01, 0xf0, 0xe9, 0x59, 0xcc, 0x12, 0x08, + 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x09, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8c, 0x55, 0x04, 0x00, 0x00, 0x12, + 0x59, 0x1c, 0x02, 0x02, 0x59, 0xcc, 0x0c, 0x08, 0x80, 0x04, 0x05, 0x80, + 0x04, 0x02, 0x00, 0x0e, 0x04, 0x01, 0xf7, 0xeb, 0x59, 0xcc, 0x14, 0x08, + 0x41, 0x32, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9b, 0xdc, + 0x04, 0x00, 0x00, 0x08, 0x04, 0x01, 0xf7, 0xe5, 0x48, 0x03, 0xc8, 0x56, + 0x4a, 0x02, 0x64, 0x1a, 0x00, 0x00, 0x00, 0x09, 0x4a, 0x02, 0x62, 0x1a, + 0x00, 0x00, 0x15, 0x00, 0x04, 0x01, 0xf0, 0x06, 0x48, 0x03, 0xc8, 0x56, + 0x4a, 0x02, 0x64, 0x1a, 0x00, 0x00, 0x00, 0x03, 0x4a, 0x02, 0x62, 0x1a, + 0x00, 0x00, 0x17, 0x00, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x37, + 0x04, 0x01, 0xf0, 0xc9, 0x48, 0x03, 0xc8, 0x56, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x12, 0x04, 0x01, 0xf0, 0xc5, 0x49, 0x33, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5a, 0xe9, 0x04, 0x02, 0x00, 0xc7, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1c, 0xd8, 0x04, 0x02, 0x00, 0xc4, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x19, 0x04, 0x02, 0x06, 0xd9, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x45, 0xf8, 0x04, 0x00, 0x00, 0x3e, + 0x59, 0xcc, 0x04, 0x07, 0x48, 0x02, 0x64, 0x19, 0x59, 0xcc, 0x12, 0x07, + 0x48, 0x0a, 0x62, 0x19, 0x82, 0x08, 0x05, 0x80, 0x00, 0x00, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8c, 0x55, + 0x04, 0x00, 0x00, 0x2c, 0x04, 0x01, 0xf0, 0x06, 0x59, 0xcc, 0x14, 0x07, + 0x41, 0x32, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9b, 0xdc, + 0x04, 0x00, 0x00, 0x26, 0x59, 0xcc, 0x0c, 0x07, 0x59, 0x1c, 0x02, 0x02, + 0x80, 0x04, 0x05, 0x80, 0x04, 0x02, 0x00, 0x22, 0x4d, 0x30, 0x00, 0x00, + 0x41, 0x1e, 0x60, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x83, 0xd4, + 0x5c, 0x02, 0x60, 0x00, 0x59, 0xcc, 0x0c, 0x09, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x84, 0x04, 0x09, 0xc0, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa1, 0x16, 0x04, 0x00, 0x00, 0x16, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x0a, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x00, 0x04, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x07, 0x04, 0x02, 0x00, 0x07, 0x59, 0x1c, 0x00, 0x08, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x04, 0x59, 0xcc, 0x28, 0x08, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x9c, 0xc9, 0x48, 0x03, 0xc8, 0x56, + 0x4a, 0x02, 0x64, 0x1a, 0x00, 0x00, 0x00, 0x09, 0x4a, 0x02, 0x62, 0x1a, + 0x00, 0x00, 0x2a, 0x00, 0x04, 0x01, 0xf0, 0x06, 0x48, 0x03, 0xc8, 0x56, + 0x4a, 0x02, 0x64, 0x1a, 0x00, 0x00, 0x00, 0x03, 0x4a, 0x02, 0x62, 0x1a, + 0x00, 0x00, 0x03, 0x00, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x3b, + 0x04, 0x01, 0xf0, 0x7b, 0x48, 0x03, 0xc8, 0x56, 0x4a, 0x02, 0x64, 0x1a, + 0x00, 0x00, 0x00, 0x0b, 0x4a, 0x02, 0x62, 0x1a, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf7, 0xf8, 0x4c, 0x08, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x46, 0x14, 0x04, 0x00, 0x00, 0x26, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x45, 0xe1, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9d, 0xe9, + 0x04, 0x02, 0x00, 0x1e, 0x59, 0xa8, 0x00, 0x23, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x03, 0x48, 0x03, 0x50, 0x23, 0x59, 0xa8, 0x00, 0x1c, + 0x80, 0x00, 0x00, 0xd0, 0x59, 0xa8, 0x08, 0x0f, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x80, 0x04, 0x15, 0x40, 0x48, 0x0b, 0x50, 0x0f, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x99, 0x49, 0x7b, 0x50, 0x25, 0x8d, 0x0e, 0x1d, 0x20, + 0x04, 0x00, 0x00, 0x06, 0x4a, 0x03, 0x28, 0x04, 0x00, 0x00, 0x07, 0xd0, + 0x59, 0x9c, 0x00, 0x17, 0x8c, 0x00, 0x05, 0x0a, 0x04, 0x02, 0x00, 0x0a, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x1a, 0xdd, 0x5c, 0x00, 0x10, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9e, 0x0b, 0x04, 0x01, 0xf7, 0xfc, + 0x5c, 0x00, 0x10, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1c, 0xd8, 0x04, 0x02, 0x00, 0x4c, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9e, 0x10, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x47, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x63, 0x39, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x1c, 0xd8, 0x04, 0x02, 0x00, 0x41, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x9e, 0x10, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x47, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x63, 0x39, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1c, 0xd8, + 0x04, 0x02, 0x00, 0x36, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9e, 0x10, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x04, 0x01, 0xf8, 0x34, + 0x04, 0x00, 0x00, 0x30, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x4e, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x63, 0x39, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x4f, + 0x49, 0x7a, 0x60, 0x1c, 0x59, 0xcc, 0x0a, 0x06, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x80, 0x04, 0x09, 0xc0, 0x04, 0x00, 0x06, 0x41, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x01, 0x04, 0x02, 0x00, 0x05, + 0x59, 0xcc, 0x08, 0x08, 0x59, 0xa8, 0x00, 0x05, 0x80, 0x04, 0x05, 0x80, + 0x04, 0x00, 0x06, 0x3a, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x02, 0x00, 0x0a, 0x83, 0xcc, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0b, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x83, 0x34, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x7d, 0x41, + 0x04, 0x00, 0x06, 0x2e, 0x4a, 0x02, 0x60, 0x1c, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf6, 0x2b, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x50, + 0x59, 0xcc, 0x02, 0x07, 0x48, 0x02, 0x60, 0x1c, 0x04, 0x01, 0xf6, 0x26, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x08, 0x00, + 0x80, 0x00, 0x00, 0x40, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0x5c, + 0x48, 0x03, 0xc8, 0x57, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x4d, 0x2c, 0x00, 0x00, 0x4c, 0x50, 0x00, 0x00, 0x4c, 0x58, 0x00, 0x00, + 0x4c, 0x54, 0x00, 0x00, 0x59, 0xa8, 0x00, 0x15, 0x82, 0x00, 0x0c, 0x80, + 0x00, 0x00, 0x08, 0x41, 0x04, 0x02, 0x10, 0x2d, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x07, 0x04, 0x04, 0x00, 0x00, 0x2a, 0x49, 0x2e, 0x60, 0x08, + 0x59, 0xa8, 0x00, 0x15, 0x48, 0x02, 0x58, 0x02, 0x82, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x01, 0x04, 0x83, 0xcc, 0xa4, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x0b, + 0x04, 0x00, 0x10, 0x15, 0x4a, 0x02, 0x58, 0x11, 0x00, 0x00, 0x00, 0x0b, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x83, 0x2c, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x40, 0x00, 0xa8, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x30, 0x41, 0x2c, 0x70, 0x00, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x02, 0x00, 0x03, 0x49, 0x78, 0x70, 0x01, 0x04, 0x01, 0xf0, 0x0e, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x04, 0x04, 0x00, 0x00, 0x0e, + 0x49, 0x2c, 0x70, 0x01, 0x40, 0x04, 0x00, 0x00, 0x04, 0x01, 0xf7, 0xea, + 0x48, 0x02, 0x58, 0x11, 0x40, 0x00, 0xb0, 0x00, 0x83, 0x2c, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x40, 0x00, 0xa8, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa3, 0x30, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf0, 0x06, 0x49, 0x7b, 0x50, 0x15, 0x59, 0x32, 0x58, 0x08, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x3b, 0x80, 0x00, 0x05, 0x80, + 0x5c, 0x00, 0xa8, 0x00, 0x5c, 0x00, 0xb0, 0x00, 0x5c, 0x00, 0xa0, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0x34, 0x00, 0x00, + 0x59, 0x32, 0x68, 0x09, 0x59, 0x34, 0x34, 0x00, 0x49, 0x33, 0xc8, 0x57, + 0x49, 0x37, 0xc8, 0x57, 0x48, 0x1b, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x47, 0x25, 0x5c, 0x02, 0x68, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x4c, 0x60, 0x00, 0x00, 0x4c, 0x5c, 0x00, 0x00, + 0x4d, 0x3c, 0x00, 0x00, 0x4d, 0x44, 0x00, 0x00, 0x4d, 0x34, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x4f, 0x04, 0x02, 0x00, 0x37, 0x59, 0xcc, 0x02, 0x07, + 0x82, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xff, 0x00, 0x90, 0x04, 0x11, 0xc0, + 0x59, 0xcc, 0x00, 0x0a, 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x80, 0x08, 0x15, 0x40, 0x48, 0x0a, 0x60, 0x1c, 0x8c, 0x04, 0x0d, 0x18, + 0x04, 0x00, 0x00, 0x11, 0x42, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa1, 0x27, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x32, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, + 0x42, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x02, 0x42, 0x00, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x1c, 0x5e, 0x04, 0x01, 0xf0, 0x1f, 0x41, 0x78, 0xb8, 0x00, + 0x8c, 0x04, 0x0d, 0x1a, 0x04, 0x00, 0x00, 0x19, 0x59, 0xcc, 0x00, 0x0a, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x58, 0x54, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x02, 0x02, 0x5a, 0x04, 0x02, 0x00, 0x13, 0x59, 0x30, 0x00, 0x09, + 0x4c, 0x00, 0x00, 0x00, 0x49, 0x36, 0x60, 0x09, 0x42, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa1, 0x2f, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x32, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x41, 0x7a, 0x78, 0x00, 0x41, 0x78, 0xc0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1c, 0x5e, 0x5c, 0x00, 0x00, 0x00, + 0x48, 0x02, 0x60, 0x09, 0x04, 0x01, 0xf0, 0x04, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x03, 0x40, 0x5c, 0x28, 0x00, + 0x80, 0x00, 0x05, 0x80, 0x5c, 0x02, 0x68, 0x00, 0x5c, 0x02, 0x88, 0x00, + 0x5c, 0x02, 0x78, 0x00, 0x5c, 0x00, 0xb8, 0x00, 0x5c, 0x00, 0xc0, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x59, 0xcc, 0x02, 0x06, + 0x82, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x10, 0x04, 0x02, 0x10, 0x06, + 0x4a, 0x02, 0x62, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x02, 0x80, 0x00, 0x05, 0x80, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x4a, 0x02, 0x62, 0x1a, + 0x00, 0x00, 0x00, 0x00, 0x59, 0xcc, 0x04, 0x07, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x02, 0x00, 0x09, 0x59, 0xcc, 0x00, 0x06, 0x82, 0x00, 0x05, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x14, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x03, 0x82, 0x00, 0x0d, 0x80, 0x00, 0x10, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x30, 0x04, 0x03, 0x82, 0x00, 0x34, 0x80, + 0x00, 0x00, 0x00, 0x51, 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x83, 0x38, 0x35, 0x80, 0x00, 0x00, 0x00, 0x13, 0x04, 0x02, 0x00, 0x03, + 0x48, 0x03, 0xc8, 0x57, 0x0c, 0x01, 0xf0, 0x16, 0x49, 0x33, 0xc8, 0x57, + 0x49, 0x3b, 0xc8, 0x57, 0x83, 0x38, 0x35, 0x80, 0x00, 0x00, 0x00, 0x27, + 0x04, 0x00, 0x00, 0x05, 0x83, 0x38, 0x35, 0x80, 0x00, 0x00, 0x00, 0x14, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x49, 0x3b, 0xc8, 0x57, + 0x49, 0x37, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x45, 0xe1, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x42, 0x6c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0xc4, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x71, 0x9c, 0x00, 0x10, 0x96, 0xcb, + 0x00, 0x10, 0x96, 0xd4, 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x96, 0xcb, + 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x96, 0xd4, 0x00, 0x10, 0x96, 0xdf, + 0x00, 0x10, 0x97, 0x52, 0x00, 0x10, 0x97, 0x24, 0x00, 0x10, 0x97, 0x52, + 0x00, 0x10, 0x97, 0x3c, 0x00, 0x10, 0x97, 0x52, 0x00, 0x10, 0x97, 0x43, + 0x00, 0x10, 0x97, 0x52, 0x00, 0x10, 0x97, 0x4b, 0x00, 0x10, 0x97, 0x52, + 0x00, 0x10, 0x97, 0x4b, 0x00, 0x10, 0x97, 0x52, 0x00, 0x10, 0x97, 0x52, + 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x96, 0xcb, + 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x96, 0xcb, + 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x96, 0xcb, + 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x96, 0xd4, + 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x97, 0x52, 0x00, 0x10, 0x96, 0xcb, + 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x97, 0x52, 0x00, 0x10, 0x96, 0xcb, + 0x00, 0x10, 0x97, 0x4f, 0x00, 0x10, 0x97, 0x52, 0x00, 0x10, 0x96, 0xcb, + 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x96, 0xcb, + 0x00, 0x10, 0x97, 0x52, 0x00, 0x10, 0x97, 0x52, 0x00, 0x10, 0x96, 0xcb, + 0x00, 0x10, 0x97, 0x48, 0x00, 0x10, 0x97, 0x52, 0x00, 0x10, 0x96, 0xcb, + 0x00, 0x10, 0x96, 0xd9, 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x96, 0xcb, + 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x97, 0x4e, + 0x00, 0x10, 0x97, 0x52, 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x96, 0xcb, + 0x00, 0x10, 0x97, 0x52, 0x00, 0x10, 0x97, 0x52, 0x00, 0x10, 0x96, 0xcb, + 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x96, 0xcb, + 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x96, 0xcb, + 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x96, 0xcd, + 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x96, 0xcd, 0x00, 0x10, 0x96, 0xcb, + 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x96, 0xcd, 0x00, 0x10, 0x96, 0xcb, + 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x96, 0xcb, 0x00, 0x10, 0x96, 0xcd, + 0x00, 0x10, 0x96, 0xcd, 0x00, 0x10, 0x96, 0xcd, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x4d, 0x2c, 0x00, 0x00, 0x59, 0x32, 0x58, 0x08, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x3b, 0x5c, 0x02, 0x58, 0x00, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x59, 0xa8, 0x00, 0x34, + 0x48, 0x02, 0x62, 0x06, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x02, + 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0x3c, 0x00, 0x00, 0x41, 0x7a, 0x78, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x5d, 0x5c, 0x02, 0x78, 0x00, + 0x04, 0x01, 0xf0, 0x74, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, 0x59, 0xa8, 0x00, 0x23, + 0x8c, 0x00, 0x05, 0x08, 0x04, 0x00, 0x00, 0x12, 0x59, 0x32, 0x68, 0x09, + 0x4c, 0x58, 0x00, 0x00, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x83, 0xa8, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x83, 0x34, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x7d, 0x41, + 0x80, 0x00, 0x05, 0x40, 0x5c, 0x00, 0xb0, 0x00, 0x04, 0x02, 0x00, 0x60, + 0x59, 0x34, 0x02, 0x00, 0x84, 0x00, 0x05, 0x1a, 0x48, 0x02, 0x6a, 0x00, + 0x04, 0x01, 0xf0, 0x1b, 0x59, 0x9c, 0x00, 0x17, 0x8c, 0x00, 0x05, 0x0a, + 0x04, 0x02, 0x00, 0x59, 0x4d, 0x3c, 0x00, 0x00, 0x41, 0x7a, 0x78, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x5d, 0x5c, 0x02, 0x78, 0x00, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x42, 0x6c, 0x59, 0x34, 0x02, 0x12, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x04, 0x00, 0x00, 0x4c, 0x59, 0x9c, 0x00, 0x19, + 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x02, 0x00, 0x49, 0x41, 0x6c, 0x00, 0x00, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, 0x04, 0x02, 0x00, 0x04, + 0x59, 0xa8, 0x00, 0x1a, 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x50, 0x1a, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x42, 0x6c, 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x01, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0x39, + 0x4c, 0xe8, 0x00, 0x00, 0x42, 0x01, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5b, 0x8d, 0x5c, 0x01, 0xd0, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x25, + 0x04, 0x00, 0x00, 0x2c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x60, 0x59, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x42, 0x6c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa1, 0x5f, + 0x04, 0x02, 0x00, 0x23, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, 0x4a, 0x02, 0x64, 0x06, + 0x00, 0x00, 0x00, 0x01, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x63, 0x39, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x47, 0x2e, + 0x04, 0x02, 0x00, 0x14, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x04, 0x01, 0xf8, 0x13, 0x04, 0x01, 0xf0, 0x10, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, + 0x04, 0x01, 0xf7, 0x9c, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x01, 0xf0, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x45, 0xe1, + 0x04, 0x01, 0xf0, 0x05, 0x04, 0x01, 0xf0, 0x04, 0x04, 0x01, 0xf0, 0x03, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x49, 0x33, 0xc8, 0x57, 0x48, 0x07, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, 0x4d, 0x3c, 0x00, 0x00, + 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x5d, + 0x5c, 0x02, 0x78, 0x00, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x45, 0xe1, + 0x59, 0x34, 0x04, 0x00, 0x48, 0x03, 0xc8, 0x57, 0x80, 0x00, 0x01, 0x10, + 0x82, 0x00, 0x34, 0x80, 0x00, 0x00, 0x00, 0x0c, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x83, 0x38, 0x35, 0x80, 0x00, 0x00, 0x00, 0x15, + 0x04, 0x02, 0x00, 0x02, 0x0c, 0x01, 0xf0, 0x06, 0x83, 0x38, 0x35, 0x80, + 0x00, 0x00, 0x00, 0x16, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x0c, 0x01, 0xf0, 0x0d, 0x00, 0x10, 0x79, 0x5e, 0x00, 0x10, 0x79, 0x5e, + 0x00, 0x10, 0x79, 0x5e, 0x00, 0x10, 0x79, 0x5e, 0x00, 0x10, 0x79, 0x5e, + 0x00, 0x10, 0x79, 0x5e, 0x00, 0x10, 0x97, 0xb2, 0x00, 0x10, 0x97, 0x87, + 0x00, 0x10, 0x79, 0x5e, 0x00, 0x10, 0x79, 0x5e, 0x00, 0x10, 0x79, 0x5e, + 0x00, 0x10, 0x79, 0x5e, 0x00, 0x10, 0x79, 0x5e, 0x00, 0x10, 0x79, 0x5e, + 0x00, 0x10, 0x79, 0x5e, 0x00, 0x10, 0x79, 0x5e, 0x00, 0x10, 0x79, 0x5e, + 0x00, 0x10, 0x79, 0x5e, 0x00, 0x10, 0x97, 0xb2, 0x00, 0x10, 0x97, 0xb9, + 0x00, 0x10, 0x79, 0x5e, 0x00, 0x10, 0x79, 0x5e, 0x00, 0x10, 0x79, 0x5e, + 0x00, 0x10, 0x79, 0x5e, 0x49, 0x33, 0xc8, 0x57, 0x59, 0x9c, 0x00, 0x17, + 0x8c, 0x00, 0x05, 0x0a, 0x04, 0x02, 0x00, 0x1b, 0x81, 0x36, 0x69, 0xc0, + 0x04, 0x00, 0x00, 0x19, 0x59, 0x34, 0x02, 0x12, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x04, 0x00, 0x00, 0x15, 0x59, 0x9c, 0x00, 0x19, + 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x02, 0x00, 0x12, 0x4d, 0x3c, 0x00, 0x00, + 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x5d, + 0x5c, 0x02, 0x78, 0x00, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, 0x4a, 0x02, 0x64, 0x06, + 0x00, 0x00, 0x00, 0x01, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x63, 0x39, 0x59, 0xcc, 0x00, 0x01, 0x59, 0x34, 0x08, 0x02, + 0x80, 0x04, 0x05, 0x80, 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x59, 0x34, 0x50, 0x02, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x80, 0x48, 0x2a, 0x68, 0x02, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x49, 0x33, 0xc8, 0x57, + 0x59, 0x30, 0x34, 0x03, 0x82, 0x18, 0x35, 0x80, 0x00, 0x00, 0x00, 0x1e, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x7c, 0x99, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x01, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x63, 0x39, 0x49, 0x3b, 0xc8, 0x57, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x51, 0x04, 0x02, 0x00, 0x0b, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x67, 0xa7, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x72, 0x0c, 0x59, 0x30, 0x02, 0x03, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x6d, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x27, + 0x04, 0x00, 0x00, 0x14, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x48, + 0x04, 0x00, 0x00, 0x06, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x14, + 0x04, 0x00, 0x00, 0x0e, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x67, 0xa7, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x72, 0x0c, 0x59, 0x30, 0x02, 0x03, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0xac, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x49, 0x33, 0xc8, 0x57, + 0x59, 0x30, 0x04, 0x03, 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x44, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x82, 0x00, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x40, 0x02, 0x70, 0x00, 0x48, 0x03, 0xc8, 0x57, 0x0c, 0x01, 0xf0, 0x01, + 0x00, 0x10, 0x97, 0xf9, 0x00, 0x10, 0x97, 0xfb, 0x00, 0x10, 0x97, 0xfb, + 0x00, 0x10, 0x98, 0x15, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0xc4, 0x59, 0x32, 0x58, 0x08, + 0x81, 0x2e, 0x59, 0xc0, 0x04, 0x00, 0x00, 0x15, 0x83, 0x2c, 0x05, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x04, 0x00, 0x00, 0x12, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x02, 0x59, 0x32, 0x68, 0x09, 0x59, 0x34, 0x02, 0x00, + 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x02, 0x00, 0x0c, 0x42, 0x02, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x01, 0xfb, 0xbb, 0x49, 0x7a, 0x60, 0x08, + 0x59, 0x30, 0x02, 0x06, 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x03, + 0x59, 0xa8, 0x00, 0x35, 0x48, 0x02, 0x62, 0x06, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x07, 0x1c, 0x01, 0xf0, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x63, 0xc4, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x3d, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x71, 0x9c, 0x59, 0x32, 0x58, 0x08, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x2e, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x71, 0x9c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x59, 0x32, 0x58, 0x08, 0x59, 0x2c, 0x04, 0x0a, 0x8c, 0x00, 0x05, 0x02, + 0x04, 0x00, 0x00, 0x07, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x07, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x43, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xdf, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x04, + 0x1c, 0x01, 0xf0, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9d, 0x83, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0xaa, 0x1c, 0x01, 0xf0, 0x00, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x41, 0x42, 0x02, 0x78, 0x00, 0x80, 0x00, 0x20, 0x42, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0x5c, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x51, 0x04, 0x00, 0x00, 0x06, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x41, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x1c, 0x01, 0xf0, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x38, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9d, 0xc7, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x83, 0x38, 0x04, 0x80, 0x00, 0x00, 0x00, 0x52, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x83, 0x38, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x49, 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x98, 0x5e, 0x00, 0x10, 0x98, 0x7f, + 0x00, 0x10, 0x98, 0x5c, 0x00, 0x10, 0x98, 0x5c, 0x00, 0x10, 0x98, 0x5c, + 0x00, 0x10, 0x98, 0x5c, 0x00, 0x10, 0x98, 0x7f, 0x00, 0x10, 0x98, 0x5c, + 0x00, 0x10, 0x98, 0xa0, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x59, 0x32, 0x58, 0x08, 0x59, 0x2c, 0x04, 0x0a, 0x8c, 0x00, 0x05, 0x1e, + 0x04, 0x00, 0x00, 0x0d, 0x82, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x82, 0x04, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x0d, + 0x59, 0x30, 0x08, 0x04, 0x8c, 0x04, 0x0d, 0x18, 0x04, 0x02, 0x00, 0x0a, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x41, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x08, 0xcb, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x07, + 0x49, 0x7a, 0x62, 0x06, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0x38, + 0x59, 0x32, 0x58, 0x08, 0x59, 0x2c, 0x0c, 0x0a, 0x8c, 0x04, 0x0d, 0x1a, + 0x04, 0x02, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x38, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x9d, 0x83, 0x04, 0x00, 0x07, 0xfa, 0x1c, 0x01, 0xf0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0xa4, 0x59, 0x32, 0x58, 0x08, + 0x59, 0x32, 0x68, 0x09, 0x59, 0x34, 0x02, 0x00, 0x8c, 0x00, 0x05, 0x0e, + 0x04, 0x00, 0x00, 0x0e, 0x59, 0x2c, 0x04, 0x0a, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x80, + 0x04, 0x00, 0x00, 0x05, 0x59, 0x2c, 0x00, 0x0f, 0x59, 0x30, 0x18, 0x15, + 0x80, 0x0c, 0x1c, 0x80, 0x48, 0x0e, 0x60, 0x15, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf0, 0x0d, 0x42, 0x02, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x01, 0xfb, 0x31, 0x59, 0x30, 0x02, 0x06, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x04, 0x59, 0xa8, 0x00, 0x35, + 0x80, 0x00, 0x00, 0xc2, 0x48, 0x02, 0x62, 0x06, 0x49, 0x7a, 0x60, 0x08, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x07, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x67, 0xa7, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0x30, 0x02, 0x03, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x07, 0x94, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x07, 0x49, 0x7a, 0x62, 0x06, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0x38, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x07, + 0x49, 0x7a, 0x62, 0x06, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0x33, + 0x59, 0x30, 0x04, 0x14, 0x8c, 0x00, 0x05, 0x1c, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x02, 0x08, 0xbc, 0x59, 0x32, 0x58, 0x08, 0x59, 0x2c, 0x20, 0x0f, + 0x40, 0x08, 0x00, 0x00, 0x80, 0x10, 0x24, 0x80, 0x59, 0x30, 0x00, 0x15, + 0x80, 0x10, 0x24, 0x00, 0x48, 0x12, 0x60, 0x15, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x08, 0xbc, 0x8c, 0x04, 0x0d, 0x0e, 0x04, 0x02, 0x00, 0x0a, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x06, 0x04, 0x01, 0xf8, 0x23, + 0x59, 0x30, 0x00, 0x1f, 0x80, 0x00, 0x05, 0x40, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x0c, 0xbb, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0x33, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x0c, 0xbb, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0xc3, 0x04, 0x01, 0xf7, 0xd8, + 0x59, 0x30, 0x04, 0x14, 0x8c, 0x00, 0x05, 0x1c, 0x04, 0x00, 0x00, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0a, 0xa4, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x08, 0xb5, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x30, 0x00, 0x11, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x0a, 0xa4, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0xb5, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x2f, 0xc8, 0x57, 0x48, 0x0b, 0xc8, 0x57, + 0x8c, 0x08, 0x15, 0x3e, 0x04, 0x00, 0x00, 0x06, 0x80, 0x08, 0x10, 0x80, + 0x80, 0x08, 0x10, 0x00, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x04, 0x01, 0xf0, 0x03, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x15, + 0x48, 0x0a, 0x58, 0x0b, 0x1c, 0x01, 0xf0, 0x00, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x13, 0x04, 0x00, 0x00, 0x05, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x14, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x59, 0x30, 0x04, 0x14, 0x8c, 0x00, 0x05, 0x16, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x1c, 0x01, 0xf0, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x59, 0x30, 0x00, 0x08, 0x80, 0x00, 0x05, 0x40, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x30, 0x04, 0x14, 0x8c, 0x00, 0x05, 0x16, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x1c, 0x01, 0xf0, 0x00, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x04, 0x49, 0x3a, 0x64, 0x03, 0x42, 0x00, 0x08, 0x00, + 0x80, 0x00, 0x20, 0x01, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0x5c, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x03, 0x49, 0x3a, 0x64, 0x03, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x00, 0xbe, 0x59, 0x32, 0x58, 0x08, + 0x59, 0x2c, 0x04, 0x0a, 0x8c, 0x00, 0x05, 0x1e, 0x04, 0x00, 0x00, 0x12, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x11, 0x59, 0x30, 0x04, 0x14, + 0x8c, 0x00, 0x05, 0x12, 0x04, 0x02, 0x00, 0x0a, 0x8c, 0x00, 0x05, 0x10, + 0x04, 0x02, 0x00, 0x08, 0x59, 0x2c, 0x04, 0x0c, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x02, 0x00, 0x05, 0x82, 0x08, 0x0d, 0x40, 0x80, 0x00, 0x30, 0x65, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x63, 0x2f, 0x82, 0x08, 0x0d, 0x40, + 0x80, 0x00, 0x20, 0x65, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x63, 0x2f, + 0x82, 0x08, 0x0d, 0x40, 0x80, 0x00, 0x20, 0x42, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x63, 0x2f, 0x49, 0x33, 0xc8, 0x57, 0x49, 0x3b, 0xc8, 0x57, + 0x83, 0x38, 0x04, 0x80, 0x00, 0x00, 0x00, 0x44, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x83, 0x38, 0x04, 0x80, 0x00, 0x00, 0x00, 0x41, + 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf0, 0x01, + 0x00, 0x10, 0x99, 0x45, 0x00, 0x10, 0x99, 0x55, 0x00, 0x10, 0x99, 0x6a, + 0x59, 0x32, 0x58, 0x08, 0x59, 0x2c, 0x04, 0x0a, 0x8c, 0x00, 0x05, 0x1e, + 0x04, 0x00, 0x00, 0x1d, 0x82, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x82, 0x0c, 0x1d, 0x80, 0x00, 0x00, 0x00, 0xc0, 0x04, 0x00, 0x00, 0x18, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, 0x49, 0x3a, 0x64, 0x03, + 0x42, 0x00, 0x08, 0x00, 0x80, 0x00, 0x20, 0x42, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0x5c, 0x59, 0x32, 0x58, 0x08, 0x59, 0x2c, 0x04, 0x0a, + 0x8c, 0x00, 0x05, 0x1e, 0x04, 0x00, 0x00, 0x0d, 0x82, 0x00, 0x1d, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x82, 0x0c, 0x1d, 0x80, 0x00, 0x00, 0x00, 0xc0, + 0x04, 0x00, 0x00, 0x08, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, + 0x49, 0x3a, 0x64, 0x03, 0x42, 0x00, 0x08, 0x00, 0x80, 0x00, 0x20, 0x01, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0x5c, 0x49, 0x7a, 0x60, 0x08, + 0x49, 0x7a, 0x62, 0x06, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x01, 0xf2, 0x5d, 0x59, 0x32, 0x58, 0x08, 0x59, 0x2c, 0x04, 0x0a, + 0x8c, 0x00, 0x05, 0x1e, 0x04, 0x00, 0x07, 0xf8, 0x82, 0x00, 0x1d, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x82, 0x0c, 0x1d, 0x80, 0x00, 0x00, 0x00, 0xc0, + 0x04, 0x00, 0x07, 0xf3, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x03, + 0x49, 0x3a, 0x64, 0x03, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x00, 0xbe, + 0x82, 0x08, 0x0d, 0x40, 0x80, 0x00, 0x20, 0x65, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x63, 0x2f, 0x49, 0x33, 0xc8, 0x57, 0x49, 0x3b, 0xc8, 0x57, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x85, 0x04, 0x00, 0x00, 0x06, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x88, 0x04, 0x00, 0x00, 0x0a, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x09, 0x49, 0x3a, 0x64, 0x03, 0x42, 0x00, 0x08, 0x00, + 0x80, 0x00, 0x00, 0x4b, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0x5c, + 0x4d, 0x1c, 0x00, 0x00, 0x81, 0x36, 0x69, 0xc0, 0x04, 0x00, 0x00, 0x03, + 0x04, 0x01, 0xfb, 0xed, 0x04, 0x02, 0x00, 0x43, 0x59, 0xcc, 0x14, 0x04, + 0x04, 0x01, 0xf8, 0x45, 0x04, 0x00, 0x00, 0x18, 0x59, 0x1c, 0x04, 0x06, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x82, 0x00, 0x25, 0x80, + 0x00, 0x00, 0x00, 0x06, 0x04, 0x00, 0x00, 0x07, 0x82, 0x00, 0x25, 0x80, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x2d, 0x82, 0x00, 0x25, 0x80, + 0x00, 0x00, 0x00, 0x11, 0x04, 0x02, 0x00, 0x0c, 0x49, 0x7a, 0x3a, 0x05, + 0x42, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x54, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x72, 0xe2, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x07, + 0x49, 0x3a, 0x64, 0x03, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa1, 0x69, + 0x04, 0x01, 0xf0, 0x2b, 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x00, 0x00, 0x04, + 0x42, 0x02, 0x38, 0x00, 0xff, 0xff, 0xff, 0xff, 0x04, 0x01, 0xf7, 0xf2, + 0x81, 0x36, 0x69, 0xc0, 0x04, 0x02, 0x00, 0x09, 0x59, 0xcc, 0x00, 0x01, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x58, 0x54, 0x04, 0x02, 0x00, 0x1e, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0xb1, 0x04, 0x02, 0x00, 0x1b, + 0x49, 0x36, 0x60, 0x09, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x87, + 0x59, 0xcc, 0x12, 0x04, 0x82, 0x08, 0x15, 0x80, 0x00, 0x00, 0xff, 0xff, + 0x04, 0x02, 0x00, 0x03, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x86, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x08, 0x00, + 0x80, 0x00, 0x00, 0x40, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x5c, + 0x04, 0x01, 0xf0, 0x0d, 0x59, 0x1c, 0x02, 0x03, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x07, 0x04, 0x02, 0x07, 0xdf, 0x4d, 0x30, 0x00, 0x00, + 0x41, 0x1e, 0x60, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x71, 0x9c, + 0x5c, 0x02, 0x60, 0x00, 0x04, 0x01, 0xf7, 0xd9, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x71, 0x9c, 0x5c, 0x02, 0x38, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x48, 0x0b, 0xc8, 0x57, 0x42, 0x00, 0x28, 0x00, + 0x00, 0x10, 0xd8, 0xd4, 0x41, 0x30, 0x00, 0x00, 0x80, 0x14, 0x05, 0x80, + 0x04, 0x00, 0x00, 0x17, 0x58, 0x14, 0x02, 0x03, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x13, 0x58, 0x14, 0x02, 0x02, + 0x80, 0x08, 0x05, 0x80, 0x04, 0x02, 0x00, 0x10, 0x58, 0x14, 0x1c, 0x06, + 0x82, 0x0c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x00, 0x0c, + 0x82, 0x0c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x1d, + 0x59, 0x30, 0x20, 0x09, 0x58, 0x14, 0x00, 0x09, 0x80, 0x00, 0x01, 0xc0, + 0x04, 0x00, 0x00, 0x0b, 0x80, 0x10, 0x21, 0xc0, 0x04, 0x00, 0x00, 0x03, + 0x80, 0x10, 0x05, 0x80, 0x04, 0x00, 0x00, 0x10, 0x82, 0x14, 0x2c, 0x00, + 0x00, 0x00, 0x00, 0x24, 0x41, 0x54, 0x00, 0x00, 0x80, 0x14, 0x04, 0x80, + 0x04, 0x02, 0x10, 0x0e, 0x04, 0x01, 0xf7, 0xe2, 0x58, 0x14, 0x00, 0x1e, + 0x80, 0x10, 0x21, 0xc0, 0x04, 0x00, 0x00, 0x05, 0x58, 0x10, 0x20, 0x02, + 0x82, 0x10, 0x25, 0x00, 0x00, 0xff, 0xff, 0xff, 0x04, 0x01, 0xf7, 0xf2, + 0x58, 0x10, 0x20, 0x1e, 0x04, 0x01, 0xf7, 0xf0, 0x40, 0x16, 0x38, 0x00, + 0x81, 0x30, 0x05, 0x40, 0x04, 0x01, 0xf0, 0x02, 0x80, 0x00, 0x05, 0x80, + 0x1c, 0x01, 0xf0, 0x00, 0x58, 0x14, 0x18, 0x07, 0x8c, 0x0c, 0x1d, 0x10, + 0x04, 0x02, 0x07, 0xea, 0x04, 0x01, 0xf7, 0xe1, 0x49, 0x33, 0xc8, 0x57, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x13, 0x04, 0x02, 0x00, 0x0e, + 0x59, 0x30, 0x04, 0x03, 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x0c, 0x80, + 0x00, 0x00, 0x00, 0x85, 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x93, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x82, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x85, + 0x0c, 0x01, 0xf0, 0x19, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x27, + 0x04, 0x00, 0x00, 0x05, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x14, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x72, 0x0c, 0x49, 0x3b, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0xc4, 0x59, 0x32, 0x58, 0x08, + 0x81, 0x2e, 0x59, 0xc0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x71, 0x9c, + 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x31, 0x4a, 0x02, 0x58, 0x11, + 0x00, 0x00, 0x00, 0x04, 0x4a, 0x02, 0x58, 0x12, 0x00, 0x00, 0x00, 0xff, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x71, 0x9c, 0x00, 0x10, 0x9a, 0x44, 0x00, 0x10, 0x9a, 0x4b, + 0x00, 0x10, 0x9a, 0x4b, 0x00, 0x10, 0x9a, 0x44, 0x00, 0x10, 0x9a, 0x44, + 0x00, 0x10, 0x9a, 0x44, 0x00, 0x10, 0x9a, 0x44, 0x00, 0x10, 0x9a, 0x44, + 0x00, 0x10, 0x9a, 0x44, 0x00, 0x10, 0x9a, 0x44, 0x00, 0x10, 0x9a, 0x44, + 0x00, 0x10, 0x9a, 0x44, 0x00, 0x10, 0x9a, 0x44, 0x00, 0x10, 0x9a, 0x46, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0x32, 0x58, 0x08, + 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x49, 0x33, 0xc8, 0x57, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x42, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x04, 0x01, 0xfb, 0x75, + 0x49, 0x7a, 0x62, 0x05, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0b, + 0x04, 0x01, 0xf8, 0x07, 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x06, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x07, 0x49, 0x7a, 0x62, 0x06, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x49, 0x43, 0xc8, 0x57, + 0x59, 0x30, 0x04, 0x06, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x07, + 0x04, 0x02, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x76, 0x4d, 0xf0, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x84, 0xe4, 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x0e, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf0, 0x01, + 0x00, 0x10, 0x9a, 0x91, 0x00, 0x10, 0x9a, 0x95, 0x00, 0x10, 0x9a, 0x7c, + 0x00, 0x10, 0x9a, 0xa4, 0x00, 0x10, 0x9a, 0xb8, 0x00, 0x10, 0x9a, 0x7c, + 0x00, 0x10, 0x9a, 0x7c, 0x00, 0x10, 0x9a, 0x7c, 0x00, 0x10, 0x9a, 0x7c, + 0x00, 0x10, 0x9a, 0x7c, 0x00, 0x10, 0x9a, 0x7c, 0x00, 0x10, 0x9a, 0x7c, + 0x00, 0x10, 0x9a, 0x7c, 0x00, 0x10, 0x9a, 0x7c, 0x4d, 0x40, 0x00, 0x00, + 0x59, 0x30, 0x00, 0x1f, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x05, + 0x41, 0x40, 0x08, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0c, 0xbb, + 0x40, 0x06, 0x80, 0x00, 0x4d, 0x2c, 0x00, 0x00, 0x59, 0x32, 0x58, 0x08, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x3d, 0x04, 0x02, 0x09, 0x3e, + 0x4c, 0x5c, 0x00, 0x00, 0x59, 0x30, 0xb8, 0x09, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x71, 0x9c, 0x48, 0x5e, 0x60, 0x09, 0x5c, 0x00, 0xb8, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x5c, 0x02, 0x80, 0x00, 0x5c, 0x03, 0xe0, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x64, 0x63, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x8c, 0x00, 0x0d, 0x81, 0x30, 0x05, 0x80, 0x04, 0x02, 0x00, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x66, 0xd5, 0x04, 0x02, 0x00, 0x18, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xcc, 0xce, 0x80, 0xc4, 0x00, 0x40, + 0x04, 0x00, 0x07, 0xde, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0x79, + 0x04, 0x00, 0x00, 0x11, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x84, 0xd5, 0x04, 0x02, 0x00, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x66, 0xa5, 0x04, 0x02, 0x00, 0x09, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xcb, 0x83, 0x80, 0xc4, 0x00, 0x40, + 0x04, 0x00, 0x07, 0xcf, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0x79, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0x30, 0x02, 0x03, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf7, 0xb7, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x0d, 0xdd, 0x04, 0x01, 0xf7, 0xc2, 0x49, 0x33, 0xc8, 0x57, + 0x4d, 0x44, 0x00, 0x00, 0x4d, 0x34, 0x00, 0x00, 0x59, 0xcc, 0x00, 0x07, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x58, 0x54, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x02, 0x02, 0x5a, 0x04, 0x02, 0x00, 0x1a, 0x59, 0x30, 0x00, 0x09, + 0x4c, 0x00, 0x00, 0x00, 0x49, 0x36, 0x60, 0x09, 0x42, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x0b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa1, 0x37, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x30, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x4d, 0x3c, 0x00, 0x00, 0x4d, 0x40, 0x00, 0x00, + 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, 0x41, 0x7a, 0x78, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xca, 0xa0, 0x5c, 0x02, 0x80, 0x00, + 0x5c, 0x02, 0x78, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x48, 0x02, 0x60, 0x09, + 0x59, 0xcc, 0x00, 0x07, 0x48, 0x02, 0x68, 0x02, 0x80, 0x00, 0x05, 0x80, + 0x5c, 0x02, 0x68, 0x00, 0x5c, 0x02, 0x88, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x4c, 0x04, 0x00, 0x00, 0x59, 0xa8, 0x00, 0x15, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x74, 0x04, 0x02, 0x00, 0x40, + 0x59, 0xcc, 0x0a, 0x08, 0x82, 0x04, 0x04, 0x80, 0x00, 0x00, 0x01, 0x00, + 0x04, 0x00, 0x10, 0x33, 0x59, 0xcc, 0x0c, 0x08, 0x82, 0x04, 0x05, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x04, 0x00, 0x00, 0x35, 0x59, 0xa8, 0x00, 0x2f, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x09, 0x59, 0x30, 0x10, 0x09, + 0x58, 0x08, 0x02, 0x12, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x04, 0x00, 0x00, 0x04, 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x2a, 0x59, 0xcc, 0x0c, 0x09, 0x80, 0x04, 0x08, 0x40, + 0x04, 0x00, 0x10, 0x24, 0x59, 0xa8, 0x08, 0x23, 0x8c, 0x04, 0x0d, 0x06, + 0x04, 0x00, 0x00, 0x04, 0x59, 0xcc, 0x0c, 0x0f, 0x8c, 0x04, 0x0d, 0x1e, + 0x04, 0x02, 0x00, 0x12, 0x59, 0xcc, 0x0a, 0x17, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x02, 0x00, 0x12, 0x59, 0xcc, 0x0a, 0x18, 0x82, 0x04, 0x04, 0x80, + 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x10, 0x14, 0x59, 0xcc, 0x0c, 0x18, + 0x80, 0x04, 0x09, 0xc0, 0x04, 0x02, 0x00, 0x0e, 0x59, 0xcc, 0x0c, 0x19, + 0x80, 0x04, 0x08, 0x40, 0x04, 0x00, 0x10, 0x11, 0x59, 0xcc, 0x0c, 0x1a, + 0x80, 0x04, 0x08, 0x40, 0x04, 0x00, 0x10, 0x11, 0x04, 0x01, 0xf0, 0x18, + 0x4a, 0x02, 0x62, 0x1a, 0x00, 0x00, 0x01, 0x00, 0x04, 0x01, 0xf0, 0x12, + 0x4a, 0x02, 0x62, 0x1a, 0x00, 0x00, 0x03, 0x00, 0x04, 0x01, 0xf0, 0x0f, + 0x4a, 0x02, 0x62, 0x1a, 0x00, 0x00, 0x05, 0x00, 0x04, 0x01, 0xf0, 0x0c, + 0x4a, 0x02, 0x62, 0x1a, 0x00, 0x00, 0x07, 0x00, 0x04, 0x01, 0xf0, 0x09, + 0x4a, 0x02, 0x62, 0x1a, 0x00, 0x00, 0x09, 0x00, 0x04, 0x01, 0xf0, 0x06, + 0x4a, 0x02, 0x62, 0x1a, 0x00, 0x00, 0x0f, 0x00, 0x04, 0x01, 0xf0, 0x03, + 0x4a, 0x02, 0x62, 0x1a, 0x00, 0x00, 0x2d, 0x00, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x02, 0x80, 0x00, 0x05, 0x80, + 0x5c, 0x00, 0x08, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xcc, 0x04, 0x07, + 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x03, 0x4a, 0x02, 0x62, 0x1a, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x4c, 0x58, 0x00, 0x00, + 0x59, 0xcc, 0x00, 0x0c, 0x59, 0x34, 0x08, 0x02, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x80, 0x04, 0x05, 0x80, 0x04, 0x02, 0x00, 0x12, + 0x83, 0xcc, 0x14, 0x00, 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x83, 0x34, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x7d, 0x41, 0x04, 0x02, 0x00, 0x09, + 0x83, 0xcc, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x83, 0x34, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x7d, 0x41, 0x5c, 0x00, 0xb0, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x4c, 0x58, 0x00, 0x00, + 0x83, 0xcc, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x83, 0x34, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x7d, 0x41, 0x04, 0x02, 0x00, 0x0c, + 0x83, 0xcc, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x83, 0x34, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x7d, 0x41, 0x04, 0x00, 0x00, 0x14, + 0x49, 0x33, 0xc8, 0x56, 0x49, 0x33, 0xc8, 0x56, 0x49, 0x33, 0xc8, 0x57, + 0x59, 0x34, 0x00, 0x09, 0x48, 0x03, 0xc8, 0x57, 0x59, 0x34, 0x00, 0x0e, + 0x48, 0x03, 0xc8, 0x57, 0x59, 0x34, 0x00, 0x08, 0x48, 0x03, 0xc8, 0x57, + 0x59, 0x34, 0x00, 0x0d, 0x48, 0x03, 0xc8, 0x57, 0x59, 0x34, 0x00, 0x07, + 0x48, 0x03, 0xc8, 0x57, 0x59, 0x34, 0x00, 0x0c, 0x48, 0x03, 0xc8, 0x57, + 0x59, 0x34, 0x00, 0x06, 0x48, 0x03, 0xc8, 0x57, 0x59, 0x34, 0x00, 0x0b, + 0x48, 0x03, 0xc8, 0x57, 0x5c, 0x00, 0xb0, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x81, 0x32, 0x61, 0xc0, + 0x04, 0x00, 0x00, 0x2d, 0x83, 0x30, 0x0d, 0x80, 0x00, 0x10, 0xb5, 0xb8, + 0x04, 0x00, 0x00, 0x2a, 0x8d, 0x3e, 0x7d, 0x06, 0x04, 0x02, 0x00, 0x28, + 0x59, 0x30, 0x0c, 0x06, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x00, 0x00, 0x0a, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x02, 0x00, 0x21, 0x59, 0x30, 0x02, 0x1d, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x02, 0x00, 0x1d, 0x59, 0x30, 0x0c, 0x16, + 0x04, 0x01, 0xf0, 0x02, 0x59, 0x30, 0x0c, 0x03, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x39, 0x04, 0x00, 0x00, 0x04, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x35, 0x04, 0x02, 0x00, 0x14, 0x4d, 0x30, 0x00, 0x00, + 0x4d, 0x1c, 0x00, 0x00, 0x59, 0x32, 0x60, 0x1e, 0x49, 0x33, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8c, 0x60, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x59, 0x1c, 0x00, 0x1c, 0x49, 0x7a, 0x38, 0x1c, + 0x59, 0x1c, 0x0c, 0x14, 0x84, 0x04, 0x0d, 0x02, 0x48, 0x06, 0x3c, 0x14, + 0x5c, 0x02, 0x38, 0x00, 0x5c, 0x02, 0x60, 0x00, 0x81, 0x30, 0x05, 0x80, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x49, 0x7a, 0x60, 0x1e, + 0x1c, 0x01, 0xf0, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x48, 0x03, 0xc8, 0x57, 0x4d, 0x3c, 0x00, 0x00, 0x42, 0x02, 0x78, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x5d, + 0x5c, 0x02, 0x78, 0x00, 0x4c, 0x58, 0x00, 0x00, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x83, 0xa8, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x83, 0xcc, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x7d, 0x41, 0x5c, 0x00, 0xb0, 0x00, 0x80, 0x00, 0x05, 0x40, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x2f, 0xc8, 0x57, + 0x49, 0x43, 0xc8, 0x57, 0x59, 0xa8, 0x00, 0x0b, 0x81, 0x2c, 0x04, 0x80, + 0x04, 0x00, 0x10, 0x11, 0x59, 0xa8, 0x00, 0x0c, 0x81, 0x2c, 0x04, 0x80, + 0x04, 0x02, 0x10, 0x0e, 0x59, 0x2c, 0x00, 0x00, 0x80, 0x00, 0x5d, 0x40, + 0x04, 0x00, 0x00, 0x08, 0x49, 0x7a, 0x58, 0x00, 0x49, 0x42, 0x5a, 0x06, + 0x4c, 0x2c, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x5c, 0x02, 0x58, 0x00, 0x04, 0x01, 0xf7, 0xf7, 0x49, 0x42, 0x5a, 0x06, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x3f, 0xc8, 0x57, 0x49, 0x33, 0xc8, 0x57, 0x48, 0x0b, 0xc8, 0x57, + 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x00, 0x00, 0x2e, 0x41, 0x50, 0x28, 0x00, + 0x81, 0x3e, 0x79, 0xc0, 0x04, 0x02, 0x00, 0x06, 0x59, 0xa8, 0x00, 0x63, + 0x80, 0x00, 0x00, 0x00, 0x59, 0xa8, 0x08, 0x67, 0x80, 0x04, 0x05, 0x80, + 0x04, 0x00, 0x00, 0x26, 0x41, 0x30, 0x00, 0x00, 0x80, 0x14, 0x05, 0x80, + 0x04, 0x00, 0x00, 0x1a, 0x58, 0x14, 0x02, 0x03, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x16, 0x58, 0x14, 0x02, 0x02, + 0x80, 0x08, 0x05, 0x80, 0x04, 0x02, 0x00, 0x13, 0x58, 0x14, 0x1c, 0x06, + 0x82, 0x0c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x00, 0x0f, + 0x82, 0x0c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x17, + 0x59, 0x30, 0x00, 0x09, 0x58, 0x14, 0x20, 0x09, 0x80, 0x10, 0x21, 0xc0, + 0x04, 0x02, 0x00, 0x06, 0x58, 0x14, 0x20, 0x1e, 0x59, 0x30, 0x18, 0x09, + 0x58, 0x0c, 0x00, 0x02, 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x80, 0x10, 0x05, 0x80, 0x04, 0x00, 0x00, 0x07, 0x82, 0x14, 0x2c, 0x00, + 0x00, 0x00, 0x00, 0x24, 0x41, 0x54, 0x00, 0x00, 0x80, 0x14, 0x04, 0x80, + 0x04, 0x02, 0x10, 0x05, 0x04, 0x01, 0xf7, 0xdf, 0x40, 0x16, 0x38, 0x00, + 0x81, 0x30, 0x05, 0x40, 0x04, 0x01, 0xf0, 0x02, 0x80, 0x00, 0x05, 0x80, + 0x1c, 0x01, 0xf0, 0x00, 0x58, 0x14, 0x18, 0x07, 0x8c, 0x0c, 0x1d, 0x10, + 0x04, 0x02, 0x07, 0xf3, 0x04, 0x01, 0xf7, 0xe7, 0x42, 0x00, 0x20, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x59, 0x30, 0x10, 0x09, 0x80, 0x08, 0x11, 0xc0, + 0x04, 0x00, 0x00, 0x02, 0x58, 0x08, 0x24, 0x03, 0x41, 0x30, 0x10, 0x00, + 0x04, 0x01, 0xf0, 0x07, 0x41, 0x78, 0x10, 0x00, 0x41, 0x44, 0x20, 0x00, + 0x04, 0x01, 0xf0, 0x04, 0x41, 0x78, 0x10, 0x00, 0x42, 0x00, 0x20, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x5c, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x48, 0x03, 0xc8, 0x57, 0x48, 0x0b, 0xc8, 0x57, 0x48, 0x13, 0xc8, 0x57, + 0x49, 0x2f, 0xc8, 0x57, 0x49, 0x43, 0xc8, 0x57, 0x4d, 0x2c, 0x00, 0x00, + 0x4c, 0x08, 0x00, 0x00, 0x4c, 0x10, 0x00, 0x00, 0x4c, 0x14, 0x00, 0x00, + 0x4c, 0x18, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x1a, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x5c, 0x00, 0x30, 0x00, + 0x5c, 0x00, 0x28, 0x00, 0x5c, 0x00, 0x20, 0x00, 0x5c, 0x00, 0x10, 0x00, + 0x4a, 0x02, 0x5a, 0x04, 0x00, 0x00, 0x01, 0x0d, 0x80, 0x08, 0x11, 0xc0, + 0x04, 0x00, 0x00, 0x17, 0x83, 0x40, 0x05, 0x80, 0x00, 0x00, 0x00, 0x29, + 0x04, 0x02, 0x00, 0x10, 0x82, 0x18, 0x05, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x00, 0x00, 0x0a, 0x82, 0x18, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x00, 0x07, 0x82, 0x18, 0x05, 0x80, 0x00, 0x00, 0x00, 0x08, + 0x04, 0x00, 0x00, 0x04, 0x82, 0x18, 0x05, 0x80, 0x00, 0x00, 0x00, 0x09, + 0x04, 0x02, 0x00, 0x04, 0x4a, 0x02, 0x58, 0x09, 0xff, 0xff, 0xff, 0xff, + 0x04, 0x01, 0xf0, 0x02, 0x48, 0x0a, 0x58, 0x09, 0x58, 0x08, 0x02, 0x02, + 0x48, 0x02, 0x5c, 0x13, 0x04, 0x01, 0xf0, 0x05, 0x4a, 0x02, 0x58, 0x09, + 0xff, 0xff, 0xff, 0xff, 0x4a, 0x02, 0x5c, 0x13, 0x00, 0x00, 0xff, 0xff, + 0x49, 0x42, 0x5a, 0x08, 0x48, 0x12, 0x5a, 0x06, 0x82, 0x10, 0x05, 0x80, + 0x00, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x12, 0x4c, 0x14, 0x00, 0x00, + 0x4c, 0x18, 0x00, 0x00, 0x4d, 0x44, 0x00, 0x00, 0x4d, 0x34, 0x00, 0x00, + 0x40, 0x12, 0x88, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0x5a, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0x34, 0x00, 0x02, + 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, 0x48, 0x02, 0x58, 0x12, + 0x5c, 0x02, 0x68, 0x00, 0x5c, 0x02, 0x88, 0x00, 0x5c, 0x00, 0x30, 0x00, + 0x5c, 0x00, 0x28, 0x00, 0x49, 0x7a, 0x58, 0x00, 0x49, 0x7a, 0x5c, 0x04, + 0x83, 0x40, 0x05, 0x80, 0x00, 0x00, 0x00, 0x46, 0x04, 0x02, 0x00, 0x02, + 0x48, 0x16, 0x5a, 0x07, 0x48, 0x1a, 0x5c, 0x08, 0x04, 0x01, 0xfb, 0xec, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x08, 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x00, 0x00, 0x03, 0x42, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x30, 0x08, 0x09, + 0x80, 0x04, 0x09, 0xc0, 0x04, 0x00, 0x00, 0x04, 0x58, 0x04, 0x04, 0x03, + 0x81, 0x44, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf7, 0xfd, 0x49, 0x33, 0xc8, 0x57, + 0x4c, 0x04, 0x00, 0x00, 0x59, 0x30, 0x04, 0x03, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0x1e, 0x04, 0x02, 0x00, 0x16, 0x80, 0x00, 0x00, 0xd0, + 0x59, 0x30, 0x0a, 0x16, 0x82, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x80, 0x04, 0x05, 0x40, 0x48, 0x03, 0xc8, 0x57, 0x48, 0x02, 0x64, 0x16, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x85, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x09, 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x05, + 0x4a, 0x02, 0x62, 0x1d, 0x00, 0x00, 0x00, 0x04, 0x59, 0xa8, 0x00, 0x35, + 0x48, 0x02, 0x62, 0x06, 0x42, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, 0x4b, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x5c, 0x5c, 0x00, 0x08, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x40, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x30, 0x04, 0x14, + 0x49, 0x33, 0xc8, 0x57, 0x48, 0x03, 0xc8, 0x57, 0x8c, 0x00, 0x05, 0x18, + 0x04, 0x00, 0x00, 0x09, 0x8c, 0x00, 0x05, 0x12, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x8a, 0x43, 0x04, 0x01, 0xf9, 0x18, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0x38, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x1c, 0x04, 0x06, 0x48, 0x03, 0xc8, 0x57, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x09, 0x04, 0x02, 0x10, 0x0b, + 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x9c, 0xc4, 0x00, 0x10, 0x9c, 0xc4, + 0x00, 0x10, 0x9c, 0xc4, 0x00, 0x10, 0x9c, 0xc6, 0x00, 0x10, 0x9c, 0xc4, + 0x00, 0x10, 0x9c, 0xc6, 0x00, 0x10, 0x9c, 0xc6, 0x00, 0x10, 0x9c, 0xc4, + 0x00, 0x10, 0x9c, 0xc6, 0x80, 0x00, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x1c, 0x04, 0x06, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x1f, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x06, 0x04, 0x00, 0x00, 0x0e, + 0x48, 0x03, 0xc8, 0x57, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x3b, + 0x4a, 0x02, 0x64, 0x1a, 0x00, 0x00, 0x00, 0x09, 0x4a, 0x02, 0x62, 0x1a, + 0x00, 0x00, 0x2a, 0x00, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, + 0x42, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, 0x40, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x07, 0x5c, 0x48, 0x03, 0xc8, 0x56, 0x4c, 0x04, 0x00, 0x00, + 0x4c, 0x14, 0x00, 0x00, 0x4d, 0x30, 0x00, 0x00, 0x41, 0x1e, 0x60, 0x00, + 0x04, 0x01, 0xf8, 0xe6, 0x49, 0x7a, 0x62, 0x05, 0x59, 0x30, 0x04, 0x14, + 0x48, 0x03, 0xc8, 0x57, 0x82, 0x00, 0x05, 0x00, 0xff, 0xff, 0xad, 0xff, + 0x48, 0x02, 0x64, 0x14, 0x49, 0x7a, 0x64, 0x05, 0x5c, 0x02, 0x60, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x1a, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x5c, 0x00, 0x28, 0x00, 0x5c, 0x00, 0x08, 0x00, + 0x4a, 0x02, 0x5a, 0x04, 0x00, 0x00, 0x01, 0x0d, 0x49, 0x7a, 0x58, 0x00, + 0x49, 0x7a, 0x5c, 0x04, 0x4a, 0x02, 0x5a, 0x08, 0x00, 0x00, 0x00, 0x45, + 0x49, 0x1e, 0x58, 0x09, 0x59, 0x30, 0x04, 0x02, 0x48, 0x02, 0x5c, 0x07, + 0x59, 0x30, 0x04, 0x19, 0x48, 0x02, 0x5c, 0x0b, 0x59, 0x1c, 0x04, 0x14, + 0x84, 0x00, 0x05, 0x56, 0x48, 0x02, 0x3c, 0x14, 0x59, 0x1c, 0x18, 0x09, + 0x58, 0x0c, 0x04, 0x03, 0x48, 0x02, 0x5a, 0x06, 0x48, 0x16, 0x58, 0x0a, + 0x48, 0x06, 0x5a, 0x0b, 0x04, 0x01, 0xfb, 0x5a, 0x4d, 0x40, 0x00, 0x00, + 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x45, 0x59, 0x1c, 0x02, 0x02, + 0x4c, 0x00, 0x00, 0x00, 0x4d, 0x30, 0x00, 0x00, 0x41, 0x1e, 0x60, 0x00, + 0x04, 0x01, 0xfd, 0x52, 0x5c, 0x02, 0x60, 0x00, 0x5c, 0x00, 0x00, 0x00, + 0x48, 0x02, 0x3a, 0x02, 0x5c, 0x02, 0x80, 0x00, 0x4a, 0x02, 0x3c, 0x06, + 0x00, 0x00, 0x00, 0x06, 0x4a, 0x02, 0x3a, 0x03, 0x00, 0x00, 0x00, 0x07, + 0x49, 0x7a, 0x3a, 0x06, 0x49, 0x7a, 0x3a, 0x05, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x13, + 0x04, 0x02, 0x00, 0x0b, 0x59, 0x30, 0x04, 0x03, 0x48, 0x03, 0xc8, 0x57, + 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x85, 0x04, 0x00, 0x00, 0x2b, + 0x82, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x8b, 0x04, 0x00, 0x00, 0x28, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x27, 0x04, 0x02, 0x00, 0x0c, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x63, 0xc4, 0x4d, 0x2c, 0x00, 0x00, 0x4d, 0x40, 0x00, 0x00, + 0x59, 0x32, 0x58, 0x08, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x01, 0xfe, 0x97, 0x5c, 0x02, 0x80, 0x00, 0x5c, 0x02, 0x58, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x14, + 0x04, 0x00, 0x07, 0xf3, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x89, + 0x04, 0x00, 0x00, 0x05, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x8a, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x72, 0x0c, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x67, 0xa7, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x72, 0x0c, + 0x59, 0x30, 0x0a, 0x03, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0a, + 0x04, 0x00, 0x00, 0x09, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0c, + 0x04, 0x00, 0x00, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x0a, 0x1c, 0x01, 0xf0, 0x00, + 0x83, 0x38, 0x04, 0x80, 0x00, 0x00, 0x00, 0x93, 0x04, 0x02, 0x10, 0x0c, + 0x83, 0x38, 0x04, 0x80, 0x00, 0x00, 0x00, 0x85, 0x04, 0x00, 0x10, 0x09, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x89, 0x04, 0x00, 0x00, 0x0a, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x8a, 0x04, 0x00, 0x00, 0x22, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x49, 0x3b, 0xc8, 0x57, + 0x49, 0x33, 0xc8, 0x57, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x72, 0x0c, + 0x49, 0x33, 0xc8, 0x57, 0x4c, 0x34, 0x00, 0x00, 0x41, 0x30, 0x68, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, 0x04, 0x00, 0x00, 0x11, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x1e, 0x59, 0xcc, 0x0c, 0x07, 0x48, 0x06, 0x64, 0x19, + 0x59, 0xcc, 0x0a, 0x07, 0x48, 0x06, 0x62, 0x19, 0x58, 0x34, 0x08, 0x09, + 0x48, 0x06, 0x60, 0x09, 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x04, + 0x42, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, 0x40, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0x5c, 0x40, 0x36, 0x60, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x5c, 0x00, 0x68, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x59, 0x30, 0x08, 0x09, 0x58, 0x04, 0x02, 0x00, 0x8c, 0x00, 0x05, 0x1a, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x05, 0x94, 0x1c, 0x01, 0xf0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x45, 0xfe, 0x04, 0x00, 0x00, 0x1e, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x02, 0x59, 0x30, 0x04, 0x14, + 0x84, 0x00, 0x05, 0x58, 0x48, 0x02, 0x64, 0x14, 0x8c, 0x00, 0x05, 0x12, + 0x04, 0x00, 0x00, 0x04, 0x59, 0xa8, 0x00, 0x36, 0x48, 0x02, 0x62, 0x05, + 0x04, 0x01, 0xf0, 0x07, 0x59, 0xa8, 0x08, 0x36, 0x59, 0xa8, 0x00, 0x34, + 0x80, 0x04, 0x04, 0x00, 0x82, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x1e, + 0x48, 0x02, 0x62, 0x05, 0x59, 0x30, 0x00, 0x09, 0x82, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x11, 0x50, 0x04, 0x00, 0x00, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x00, 0x00, 0x04, 0x82, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf7, 0xfb, 0x45, 0x30, 0x08, 0x00, 0x49, 0x7a, 0x60, 0x00, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, + 0x82, 0x10, 0x05, 0x00, 0xff, 0xff, 0xfe, 0xef, 0x04, 0x02, 0x00, 0x1c, + 0x4d, 0x2c, 0x00, 0x00, 0x49, 0x37, 0xc8, 0x57, 0x59, 0x34, 0x08, 0x11, + 0x83, 0x34, 0x14, 0x00, 0x00, 0x00, 0x00, 0x11, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x00, 0x00, 0x0e, 0x40, 0x04, 0x00, 0x00, 0x81, 0x30, 0x05, 0x80, + 0x04, 0x00, 0x00, 0x05, 0x58, 0x04, 0x08, 0x00, 0x82, 0x04, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf7, 0xf8, 0x59, 0x30, 0x08, 0x00, + 0x49, 0x7a, 0x60, 0x00, 0x44, 0x04, 0x10, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0x38, 0x04, 0x01, 0xf0, 0x02, 0x49, 0x33, 0xc8, 0x57, + 0x5c, 0x02, 0x58, 0x00, 0x49, 0x2e, 0x60, 0x08, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0x38, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x49, 0x2f, 0xc8, 0x57, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x06, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x4c, 0x34, 0x00, 0x00, + 0x59, 0x30, 0x00, 0x09, 0x80, 0x00, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x10, + 0x82, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x11, 0x50, 0x34, 0x00, 0x00, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x09, 0x81, 0x30, 0x05, 0x80, + 0x04, 0x00, 0x00, 0x05, 0x50, 0x34, 0x00, 0x00, 0x82, 0x00, 0x6c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf7, 0xf8, 0x59, 0x30, 0x00, 0x00, + 0x44, 0x00, 0x68, 0x00, 0x5c, 0x00, 0x68, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x30, 0x0c, 0x06, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x00, 0x07, 0xfb, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x11, + 0x04, 0x00, 0x07, 0xf8, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x06, + 0x04, 0x00, 0x07, 0xf5, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x00, 0x07, 0xf2, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x49, 0x33, 0xc8, 0x57, 0x4c, 0x08, 0x00, 0x00, 0x4c, 0x0c, 0x00, 0x00, + 0x4c, 0x58, 0x00, 0x00, 0x59, 0xa8, 0x10, 0x1c, 0x59, 0xcc, 0x18, 0x07, + 0x82, 0x0c, 0x1d, 0x00, 0x00, 0xff, 0xff, 0xff, 0x80, 0x0c, 0x01, 0x10, + 0x80, 0x08, 0x35, 0x80, 0x04, 0x02, 0x00, 0x14, 0x83, 0xcc, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x59, 0x30, 0x00, 0x09, 0x82, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x7d, 0x41, 0x04, 0x02, 0x00, 0x0a, + 0x83, 0xcc, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x59, 0x30, 0x00, 0x09, 0x82, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x7d, 0x41, + 0x5c, 0x00, 0xb0, 0x00, 0x5c, 0x00, 0x18, 0x00, 0x5c, 0x00, 0x10, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x56, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x3e, 0xe0, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x1a, 0xdd, + 0x49, 0x3b, 0xc8, 0x57, 0x4d, 0x2c, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x07, 0x1a, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x83, 0x2c, 0xac, 0x00, 0x00, 0x00, 0x00, 0x05, 0x4c, 0x58, 0x00, 0x00, + 0x4c, 0x54, 0x00, 0x00, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x45, 0x78, 0xa8, 0x00, 0x80, 0x54, 0xa8, 0x00, 0x80, 0x58, 0xb0, 0x40, + 0x04, 0x02, 0x07, 0xfd, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x46, + 0x04, 0x02, 0x00, 0x04, 0x4a, 0x02, 0x5a, 0x04, 0x00, 0x00, 0x01, 0x44, + 0x04, 0x01, 0xf0, 0x08, 0x4a, 0x02, 0x5a, 0x04, 0x00, 0x00, 0x01, 0x46, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x41, 0x04, 0x00, 0x00, 0x03, + 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x01, 0x59, 0xcc, 0x00, 0x07, + 0x82, 0x00, 0x05, 0x00, 0xff, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x10, + 0x59, 0xcc, 0x10, 0x08, 0x82, 0x08, 0x15, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x80, 0x08, 0x15, 0x40, 0x48, 0x0a, 0x58, 0x0a, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x46, 0x04, 0x02, 0x00, 0x06, 0x59, 0xcc, 0x00, 0x07, + 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, 0x48, 0x02, 0x58, 0x0b, + 0x04, 0x01, 0xf0, 0x05, 0x59, 0xcc, 0x00, 0x08, 0x82, 0x00, 0x05, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x48, 0x02, 0x58, 0x0b, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x46, 0x04, 0x02, 0x00, 0x04, 0x83, 0xcc, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x04, 0x01, 0xf0, 0x03, 0x83, 0xcc, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x0d, 0x50, 0x08, 0x00, 0x00, 0x9c, 0x00, 0x01, 0xc0, + 0x48, 0x02, 0x58, 0x0c, 0x80, 0x08, 0x10, 0x00, 0x50, 0x08, 0x00, 0x00, + 0x9c, 0x00, 0x01, 0xc0, 0x48, 0x02, 0x58, 0x0d, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x46, 0x04, 0x02, 0x00, 0x08, 0x59, 0xcc, 0x00, 0x0b, + 0x9c, 0x00, 0x01, 0xc0, 0x48, 0x02, 0x58, 0x0e, 0x59, 0xcc, 0x00, 0x0c, + 0x9c, 0x00, 0x01, 0xc0, 0x48, 0x02, 0x58, 0x0f, 0x04, 0x01, 0xf0, 0x07, + 0x59, 0xcc, 0x00, 0x0f, 0x9c, 0x00, 0x01, 0xc0, 0x48, 0x02, 0x58, 0x0e, + 0x59, 0xcc, 0x00, 0x10, 0x9c, 0x00, 0x01, 0xc0, 0x48, 0x02, 0x58, 0x0f, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x46, 0x04, 0x02, 0x00, 0x04, + 0x83, 0xcc, 0x14, 0x00, 0x00, 0x00, 0x00, 0x11, 0x04, 0x01, 0xf0, 0x03, + 0x83, 0xcc, 0x14, 0x00, 0x00, 0x00, 0x00, 0x15, 0x41, 0x2c, 0x30, 0x00, + 0x82, 0x18, 0x34, 0x00, 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x50, 0x08, 0x00, 0x00, 0x9c, 0x00, 0x01, 0xc0, + 0x44, 0x00, 0x30, 0x00, 0x80, 0x08, 0x10, 0x00, 0x80, 0x18, 0x30, 0x00, + 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xfa, 0x5c, 0x00, 0xa8, 0x00, + 0x5c, 0x00, 0xb0, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x49, 0x2f, 0xc8, 0x57, 0x59, 0x30, 0x08, 0x09, + 0x58, 0x04, 0x02, 0x00, 0x8c, 0x00, 0x05, 0x1e, 0x04, 0x00, 0x00, 0x04, + 0x59, 0x2c, 0x02, 0x08, 0x84, 0x00, 0x05, 0x58, 0x48, 0x02, 0x5a, 0x08, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xe0, 0x18, 0x0f, 0x59, 0x9c, 0x04, 0x13, + 0x80, 0x0c, 0x10, 0x00, 0x80, 0x08, 0x05, 0x80, 0x04, 0x02, 0x00, 0x02, + 0x41, 0x78, 0x10, 0x00, 0x59, 0xe0, 0x00, 0x10, 0x59, 0xe0, 0x08, 0x10, + 0x80, 0x04, 0x0d, 0x80, 0x04, 0x02, 0x07, 0xfd, 0x80, 0x08, 0x05, 0x80, + 0x04, 0x00, 0x00, 0x0b, 0x4c, 0x08, 0x00, 0x00, 0x59, 0x9c, 0x08, 0x14, + 0x59, 0x9c, 0x10, 0x15, 0x80, 0x0c, 0x00, 0xcc, 0x80, 0x04, 0x0c, 0x00, + 0x82, 0x08, 0x14, 0x40, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x18, 0x00, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x48, 0x03, 0xc8, 0x57, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x30, 0x02, 0x03, 0x49, 0x33, 0xc8, 0x57, + 0x49, 0x37, 0xc8, 0x57, 0x49, 0x3b, 0xc8, 0x57, 0x48, 0x03, 0xc8, 0x57, + 0x82, 0x00, 0x34, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x9e, 0xb9, + 0x00, 0x10, 0xa0, 0x0a, 0x00, 0x10, 0x9e, 0xb9, 0x00, 0x10, 0x9e, 0xb9, + 0x00, 0x10, 0x9e, 0xb9, 0x00, 0x10, 0x9e, 0xb9, 0x00, 0x10, 0x9e, 0xb9, + 0x00, 0x10, 0x9f, 0x6f, 0x00, 0x10, 0x9e, 0xbb, 0x00, 0x10, 0x9e, 0xb9, + 0x00, 0x10, 0x9e, 0xb9, 0x00, 0x10, 0x9e, 0xb9, 0x00, 0x10, 0x9e, 0xb9, + 0x00, 0x10, 0x9e, 0xb9, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x4c, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x46, 0x14, + 0x04, 0x02, 0x00, 0x20, 0x59, 0xa8, 0x08, 0x23, 0x82, 0x04, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x08, + 0x04, 0x00, 0x00, 0x1a, 0x8c, 0x04, 0x0d, 0x12, 0x04, 0x00, 0x00, 0x3d, + 0x59, 0xcc, 0x08, 0x06, 0x82, 0x04, 0x0d, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x82, 0x04, 0x05, 0x80, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1f, + 0x82, 0x04, 0x05, 0x80, 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, + 0x82, 0x04, 0x05, 0x80, 0x52, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x81, 0x36, 0x69, 0xc0, 0x04, 0x00, 0x00, 0x06, + 0x4d, 0x3c, 0x00, 0x00, 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xca, 0xa0, 0x5c, 0x02, 0x78, 0x00, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x14, 0x59, 0xcc, 0x08, 0x06, + 0x82, 0x04, 0x0d, 0x00, 0xff, 0x00, 0x00, 0x00, 0x82, 0x04, 0x05, 0x80, + 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x82, 0x04, 0x05, 0x80, + 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0x82, 0x04, 0x05, 0x80, + 0x52, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x07, 0xbb, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x09, 0x4a, 0x02, 0x64, 0x1a, + 0x00, 0x00, 0x00, 0x09, 0x4a, 0x02, 0x62, 0x1a, 0x00, 0x00, 0x00, 0x00, + 0x81, 0x36, 0x69, 0xc0, 0x04, 0x02, 0x00, 0x0b, 0x59, 0xcc, 0x00, 0x01, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x58, 0x54, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x02, 0x07, 0xbb, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0xb1, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x49, 0x36, 0x60, 0x09, + 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x04, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x63, 0x39, + 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x00, 0x00, 0x23, 0x59, 0xcc, 0x08, 0x06, + 0x48, 0x07, 0xc8, 0x57, 0x82, 0x04, 0x0d, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x82, 0x04, 0x05, 0x80, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x33, + 0x82, 0x04, 0x05, 0x80, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x41, + 0x82, 0x04, 0x05, 0x80, 0x21, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x52, + 0x82, 0x04, 0x05, 0x80, 0x24, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x4f, + 0x82, 0x04, 0x05, 0x80, 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x4c, + 0x82, 0x04, 0x05, 0x80, 0x52, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x49, + 0x82, 0x04, 0x05, 0x80, 0x05, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x0d, + 0x59, 0xcc, 0x08, 0x06, 0x82, 0x04, 0x0d, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x9c, 0x04, 0x31, 0xc0, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x46, + 0x42, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xfc, 0xeb, + 0x04, 0x01, 0xf9, 0x40, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x42, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x51, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x72, 0xe2, 0x59, 0xcc, 0x00, 0x00, 0x82, 0x00, 0x05, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x82, 0x00, 0x05, 0x80, 0x00, 0xff, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x05, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x07, + 0x49, 0x3a, 0x64, 0x03, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x32, 0x58, 0x17, + 0x81, 0x2e, 0x59, 0xc0, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x07, 0x3b, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x81, 0x36, 0x69, 0xc0, + 0x04, 0x00, 0x07, 0xdf, 0x59, 0x34, 0x04, 0x00, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x02, 0x07, 0xd9, 0x04, 0x01, 0xfc, 0x64, 0x04, 0x02, 0x07, 0xd7, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x09, 0x4a, 0x02, 0x64, 0x1a, + 0x00, 0x00, 0x00, 0x0e, 0x4a, 0x02, 0x62, 0x1a, 0x00, 0x00, 0x19, 0x00, + 0x04, 0x01, 0xf7, 0xa3, 0x81, 0x36, 0x69, 0xc0, 0x04, 0x00, 0x00, 0x0c, + 0x59, 0x34, 0x0c, 0x00, 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x07, 0x95, + 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0xff, 0x00, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x07, 0x00, 0x04, 0x02, 0x07, 0xc3, 0x4a, 0x02, 0x64, 0x03, + 0x00, 0x00, 0x00, 0x09, 0x4a, 0x02, 0x64, 0x1a, 0x00, 0x00, 0x00, 0x09, + 0x4a, 0x02, 0x62, 0x1a, 0x00, 0x00, 0x1e, 0x00, 0x04, 0x01, 0xf7, 0x8f, + 0x81, 0x36, 0x69, 0xc0, 0x04, 0x00, 0x07, 0xf8, 0x59, 0x34, 0x0c, 0x00, + 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0xff, 0x00, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0xf2, 0x04, 0x01, 0xf7, 0xb3, + 0x4d, 0x2c, 0x00, 0x00, 0x4c, 0x58, 0x00, 0x00, 0x4c, 0x50, 0x00, 0x00, + 0x4c, 0x54, 0x00, 0x00, 0x41, 0x38, 0x50, 0x00, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x54, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x59, 0x32, 0x58, 0x08, 0x59, 0x2c, 0x0c, 0x0b, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x00, 0xe0, 0x00, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x20, 0x00, + 0x04, 0x02, 0x00, 0x76, 0x59, 0x30, 0x08, 0x17, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x00, 0x00, 0x14, 0x58, 0x04, 0x14, 0x04, 0x41, 0xcc, 0xa8, 0x00, + 0x82, 0x04, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x05, 0x82, 0x08, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x10, 0x04, 0x02, 0x10, 0x04, 0x40, 0x08, 0xb0, 0x00, + 0x04, 0x01, 0xfb, 0xa6, 0x04, 0x01, 0xf0, 0x0a, 0x40, 0x00, 0x10, 0x00, + 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x04, 0x01, 0xfb, 0xa1, + 0x58, 0x04, 0x08, 0x01, 0x80, 0x04, 0x09, 0xc0, 0x04, 0x02, 0x07, 0xf2, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x81, 0x36, 0x69, 0xc0, + 0x04, 0x00, 0x00, 0x5e, 0x59, 0x34, 0x4c, 0x00, 0x59, 0x2c, 0x0c, 0x09, + 0x48, 0x07, 0xc8, 0x57, 0x48, 0x27, 0xc8, 0x57, 0x82, 0x04, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x00, 0x2a, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x00, 0x00, 0x32, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x20, + 0x04, 0x00, 0x00, 0x36, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x52, + 0x04, 0x00, 0x00, 0x42, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x50, + 0x04, 0x00, 0x00, 0x42, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x21, + 0x04, 0x00, 0x00, 0x04, 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x24, + 0x04, 0x02, 0x00, 0x43, 0x82, 0x24, 0x05, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x07, 0x04, 0x00, 0x00, 0x08, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x09, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x42, 0x6c, 0x42, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0c, + 0x04, 0x01, 0xf0, 0x37, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x31, + 0x4a, 0x02, 0x58, 0x0d, 0x00, 0x00, 0x00, 0x09, 0x59, 0x34, 0x04, 0x00, + 0x48, 0x02, 0x58, 0x0e, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x71, 0x9c, 0x04, 0x01, 0xf0, 0x3d, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x80, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x43, 0x46, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, 0x42, 0x00, 0x50, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x04, 0x01, 0xf0, 0x21, 0x59, 0xcc, 0x00, 0x07, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5a, 0xc6, 0x04, 0x02, 0x00, 0x1d, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x80, 0x04, 0x01, 0xf0, 0x1a, + 0x82, 0x24, 0x05, 0x00, 0x00, 0x00, 0xff, 0x00, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x07, 0x04, 0x00, 0x07, 0xdf, 0x82, 0x24, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x09, + 0x04, 0x00, 0x07, 0xda, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x43, 0xa7, + 0x42, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x01, 0xf0, 0x0b, + 0x42, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x04, 0x01, 0xf0, 0x03, + 0x42, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 0x24, 0x05, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x07, + 0x04, 0x00, 0x07, 0xcb, 0x48, 0x2a, 0x64, 0x03, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x01, 0x59, 0x2c, 0x00, 0x0d, 0x48, 0x02, 0x60, 0x11, + 0x49, 0x7a, 0x60, 0x13, 0x59, 0xa8, 0x00, 0x35, 0x48, 0x02, 0x62, 0x06, + 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0x39, + 0x59, 0x32, 0x58, 0x17, 0x81, 0x2e, 0x59, 0xc0, 0x04, 0x00, 0x00, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x3b, 0x49, 0x7a, 0x60, 0x17, + 0x5c, 0x00, 0xa8, 0x00, 0x5c, 0x00, 0xa0, 0x00, 0x5c, 0x00, 0xb0, 0x00, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0x2c, 0x00, 0x00, + 0x59, 0x32, 0x58, 0x08, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x13, + 0x04, 0x02, 0x00, 0x2a, 0x49, 0x2f, 0xc8, 0x57, 0x59, 0x30, 0x0c, 0x03, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x54, 0x04, 0x00, 0x00, 0x1e, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x18, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x04, 0x00, 0x00, 0x15, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x0d, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0c, 0x04, 0x00, 0x00, 0x0a, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x0a, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x6c, 0x04, 0x01, 0xf0, 0x09, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x42, 0x6c, 0x04, 0x01, 0xf0, 0x04, 0x59, 0x34, 0x02, 0x00, + 0x84, 0x00, 0x05, 0x1a, 0x48, 0x02, 0x6a, 0x00, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x04, 0x01, 0xf0, 0x24, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x27, 0x04, 0x00, 0x00, 0x0f, + 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x14, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x49, 0x2f, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x63, 0xc4, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x31, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x42, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x04, 0x01, 0xf0, 0x0a, 0x49, 0x2f, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0xc4, 0x42, 0x02, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x31, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x49, 0x42, 0x5a, 0x06, + 0x48, 0x06, 0x58, 0x0d, 0x48, 0x0a, 0x58, 0x0e, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x49, 0x75, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x71, 0x9c, 0x5c, 0x02, 0x58, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x2f, 0xc8, 0x57, 0x42, 0x00, 0x70, 0x00, + 0x00, 0x10, 0xaf, 0xc6, 0x58, 0x38, 0x08, 0x07, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x02, 0x00, 0x05, 0x49, 0x2c, 0x70, 0x08, 0x49, 0x2c, 0x70, 0x07, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x07, 0xbb, 0x49, 0x2c, 0x08, 0x00, + 0x49, 0x2c, 0x70, 0x07, 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0x2c, 0x00, 0x00, + 0x4c, 0x58, 0x00, 0x00, 0x4c, 0x50, 0x00, 0x00, 0x4c, 0x54, 0x00, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x49, 0x37, 0xc8, 0x57, 0x59, 0xcc, 0x08, 0x06, + 0x48, 0x07, 0xc8, 0x57, 0x82, 0x04, 0x0d, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x82, 0x04, 0x05, 0x80, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0d, + 0x82, 0x04, 0x05, 0x80, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0a, + 0x82, 0x04, 0x05, 0x80, 0x21, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x30, + 0x82, 0x04, 0x05, 0x80, 0x24, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x2d, + 0x82, 0x04, 0x05, 0x80, 0x20, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x2f, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x1a, 0x04, 0x00, 0x00, 0x2c, + 0x49, 0x2f, 0xc8, 0x57, 0x49, 0x2e, 0x60, 0x17, 0x59, 0xa8, 0xb0, 0x15, + 0x82, 0x58, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x82, 0x58, 0xb5, 0x00, + 0xff, 0xff, 0xff, 0xfc, 0x80, 0x58, 0xb1, 0x04, 0x48, 0x5a, 0x5c, 0x04, + 0x41, 0x2c, 0x78, 0x00, 0x41, 0xcc, 0xa0, 0x00, 0x82, 0x58, 0x04, 0x80, + 0x00, 0x00, 0x00, 0x10, 0x04, 0x02, 0x10, 0x05, 0x83, 0x2c, 0xac, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x04, 0x01, 0xfa, 0x9a, 0x04, 0x01, 0xf0, 0x15, + 0x40, 0x58, 0x08, 0x00, 0x42, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x83, 0x2c, 0xac, 0x00, 0x00, 0x00, 0x00, 0x05, 0x04, 0x01, 0xfa, 0x93, + 0x82, 0x04, 0xb4, 0x80, 0x00, 0x00, 0x00, 0x0f, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x07, 0x1a, 0x04, 0x00, 0x00, 0x04, 0x49, 0x2c, 0x78, 0x01, + 0x41, 0x2c, 0x78, 0x00, 0x04, 0x01, 0xf7, 0xec, 0x59, 0x32, 0x58, 0x17, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x3b, 0x49, 0x7a, 0x60, 0x17, + 0x80, 0x00, 0x05, 0x80, 0x04, 0x01, 0xf0, 0x06, 0x59, 0x34, 0x02, 0x00, + 0x84, 0x00, 0x05, 0x54, 0x48, 0x02, 0x6a, 0x00, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x5c, 0x00, 0xa8, 0x00, 0x5c, 0x00, 0xa0, 0x00, + 0x5c, 0x00, 0xb0, 0x00, 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x49, 0x2f, 0xc8, 0x57, 0x4d, 0x2c, 0x00, 0x00, + 0x4c, 0x5c, 0x00, 0x00, 0x59, 0x30, 0xbc, 0x06, 0x59, 0x30, 0x0a, 0x03, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x07, 0x04, 0x00, 0x00, 0x3d, + 0x82, 0x04, 0x05, 0x80, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x76, + 0x4d, 0xf0, 0x00, 0x00, 0x59, 0x8c, 0x00, 0x0d, 0x81, 0x30, 0x05, 0x80, + 0x04, 0x02, 0x00, 0x19, 0x59, 0x30, 0x00, 0x04, 0x8c, 0x00, 0x05, 0x20, + 0x04, 0x00, 0x00, 0x04, 0x84, 0x00, 0x05, 0x20, 0x48, 0x02, 0x60, 0x04, + 0x04, 0x01, 0xf0, 0x19, 0x82, 0x5c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x11, + 0x04, 0x02, 0x00, 0x0d, 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0xaf, 0xc4, + 0x50, 0x08, 0x10, 0x00, 0x58, 0x08, 0x00, 0x02, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x06, 0x58, 0x08, 0x00, 0x0c, + 0x81, 0x30, 0x05, 0x80, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x04, 0x01, 0xf0, 0x0a, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x66, 0xd5, + 0x04, 0x02, 0x00, 0x28, 0x59, 0x30, 0x00, 0x04, 0x8c, 0x00, 0x05, 0x20, + 0x04, 0x00, 0x00, 0x04, 0x84, 0x00, 0x05, 0x20, 0x48, 0x02, 0x60, 0x04, + 0x04, 0x01, 0xf0, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xcc, 0xce, + 0x80, 0xc4, 0x00, 0x40, 0x5c, 0x03, 0xe0, 0x00, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x64, 0x63, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x3d, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0x32, 0x58, 0x08, + 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x82, 0x5c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x05, + 0x04, 0x00, 0x00, 0x1b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x49, 0x75, + 0x82, 0x5c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x00, 0x16, + 0x59, 0x32, 0x58, 0x17, 0x81, 0x2e, 0x59, 0xc0, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x07, 0x3b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x71, 0x9c, + 0x80, 0x00, 0x05, 0x80, 0x5c, 0x00, 0xb8, 0x00, 0x5c, 0x02, 0x58, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x5c, 0x03, 0xe0, 0x00, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x64, 0x63, 0x59, 0x30, 0x0c, 0x06, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x07, 0xad, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x07, 0xaa, 0x04, 0x01, 0xf7, 0xf3, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x04, 0x01, 0xf7, 0xef, + 0x4c, 0x04, 0x00, 0x00, 0x59, 0x34, 0x02, 0x00, 0x48, 0x03, 0xc8, 0x57, + 0x8c, 0x00, 0x05, 0x1c, 0x04, 0x00, 0x00, 0x09, 0x59, 0xcc, 0x08, 0x05, + 0x59, 0x1c, 0x00, 0x19, 0x48, 0x03, 0xc8, 0x57, 0x80, 0x04, 0x05, 0x80, + 0x04, 0x00, 0x00, 0x04, 0x80, 0x00, 0x05, 0x80, 0x48, 0x03, 0xc8, 0x56, + 0x04, 0x01, 0xf0, 0x03, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, + 0x5c, 0x00, 0x08, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x4c, 0x0c, 0x00, 0x00, 0x4c, 0x10, 0x00, 0x00, 0x42, 0x00, 0x18, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x42, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x01, 0xf0, 0x13, 0x4c, 0x00, 0x00, 0x00, 0x4c, 0x0c, 0x00, 0x00, + 0x4c, 0x10, 0x00, 0x00, 0x59, 0x30, 0x20, 0x09, 0x58, 0x10, 0x1c, 0x03, + 0x42, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x01, 0xf0, 0x0b, + 0x4c, 0x00, 0x00, 0x00, 0x4c, 0x0c, 0x00, 0x00, 0x4c, 0x10, 0x00, 0x00, + 0x59, 0x30, 0x20, 0x09, 0x80, 0x10, 0x21, 0xc0, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x58, 0x10, 0x1c, 0x03, 0x42, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x48, 0x0f, 0xc8, 0x57, 0x48, 0x13, 0xc8, 0x57, + 0x48, 0x1b, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x37, 0x64, + 0x5c, 0x00, 0x20, 0x00, 0x5c, 0x00, 0x18, 0x00, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x92, + 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, 0x42, 0x00, 0x08, 0x00, + 0x80, 0x00, 0x00, 0x40, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x01, + 0x49, 0x3a, 0x64, 0x03, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x02, 0x07, 0x5c, + 0x4d, 0x40, 0x00, 0x00, 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x00, 0x00, 0x06, + 0x85, 0x0e, 0x1d, 0x44, 0x42, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2a, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9c, 0x1f, 0x5c, 0x02, 0x80, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xa8, 0x00, 0x23, 0x8c, 0x00, 0x05, 0x08, + 0x04, 0x00, 0x00, 0x05, 0x59, 0x9c, 0x00, 0x17, 0x8c, 0x00, 0x05, 0x0a, + 0x04, 0x02, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x30, 0x04, 0x20, + 0x84, 0x00, 0x05, 0x40, 0x48, 0x02, 0x64, 0x20, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x03, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x64, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8c, 0x2f, 0x59, 0x30, 0x02, 0x03, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x08, 0x04, 0x02, 0x00, 0x15, 0x42, 0x00, 0xc8, 0x00, + 0x00, 0x00, 0x00, 0x32, 0x42, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x41, 0x30, 0x08, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0a, 0xd5, + 0x04, 0x00, 0x00, 0x0d, 0x59, 0x30, 0x02, 0x03, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x08, 0x04, 0x02, 0x00, 0x09, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1e, 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x07, 0xff, + 0x80, 0x64, 0xc8, 0x40, 0x04, 0x02, 0x07, 0xf1, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8c, 0x47, + 0x5c, 0x00, 0xc8, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x17, 0xc8, 0x57, + 0x4c, 0x00, 0x00, 0x00, 0x4c, 0x04, 0x00, 0x00, 0x8c, 0x14, 0x2d, 0x2a, + 0x04, 0x00, 0x00, 0x04, 0x59, 0x88, 0x00, 0xb9, 0x80, 0x00, 0x00, 0x00, + 0x48, 0x03, 0x10, 0xb9, 0x8c, 0x14, 0x2d, 0x2e, 0x04, 0x00, 0x00, 0x04, + 0x59, 0x88, 0x00, 0xba, 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x10, 0xba, + 0x8c, 0x14, 0x2d, 0x2c, 0x04, 0x00, 0x00, 0x13, 0x40, 0x14, 0x00, 0x00, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x07, 0x00, 0x00, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0d, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0a, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x05, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x59, 0x88, 0x00, 0x05, + 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x10, 0x05, 0x59, 0x88, 0x00, 0xbb, + 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x10, 0xbb, 0x5c, 0x00, 0x08, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x17, 0xc8, 0x57, + 0x4c, 0x00, 0x00, 0x00, 0x4c, 0x04, 0x00, 0x00, 0x8c, 0x14, 0x2d, 0x2a, + 0x04, 0x00, 0x00, 0x04, 0x59, 0x88, 0x00, 0xbc, 0x80, 0x00, 0x00, 0x00, + 0x48, 0x03, 0x10, 0xbc, 0x8c, 0x14, 0x2d, 0x2e, 0x04, 0x00, 0x00, 0x04, + 0x59, 0x88, 0x00, 0xbd, 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x10, 0xbd, + 0x8c, 0x14, 0x2d, 0x2c, 0x04, 0x00, 0x00, 0x13, 0x40, 0x14, 0x00, 0x00, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x07, 0x00, 0x00, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0d, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0a, 0x82, 0x00, 0x0d, 0x80, + 0x00, 0x05, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x59, 0x88, 0x00, 0x05, + 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x10, 0x05, 0x59, 0x88, 0x00, 0xbe, + 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x10, 0xbe, 0x5c, 0x00, 0x08, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x59, 0x88, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0xc8, 0x57, + 0x48, 0x03, 0x10, 0x01, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x59, 0x88, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x48, 0x03, 0xc8, 0x57, 0x48, 0x03, 0x10, 0x00, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x59, 0x88, 0x00, 0x02, + 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0xc8, 0x57, 0x48, 0x03, 0x10, 0x02, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x07, 0xc8, 0x57, + 0x4c, 0x00, 0x00, 0x00, 0x8c, 0x04, 0x0d, 0x2c, 0x04, 0x00, 0x00, 0x04, + 0x59, 0x88, 0x00, 0xa7, 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x10, 0xa7, + 0x8c, 0x04, 0x0d, 0x2a, 0x04, 0x00, 0x00, 0x04, 0x59, 0x88, 0x00, 0xa8, + 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x10, 0xa8, 0x8c, 0x04, 0x0d, 0x28, + 0x04, 0x00, 0x00, 0x04, 0x59, 0x88, 0x00, 0xa9, 0x80, 0x00, 0x00, 0x00, + 0x48, 0x03, 0x10, 0xa9, 0x8c, 0x04, 0x0d, 0x26, 0x04, 0x00, 0x00, 0x04, + 0x59, 0x88, 0x00, 0xaa, 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x10, 0xaa, + 0x8c, 0x04, 0x0d, 0x24, 0x04, 0x00, 0x00, 0x04, 0x59, 0x88, 0x00, 0xab, + 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x10, 0xab, 0x8c, 0x04, 0x0d, 0x22, + 0x04, 0x00, 0x00, 0x04, 0x59, 0x88, 0x00, 0xac, 0x80, 0x00, 0x00, 0x00, + 0x48, 0x03, 0x10, 0xac, 0x8c, 0x04, 0x0d, 0x20, 0x04, 0x00, 0x00, 0x04, + 0x59, 0x88, 0x00, 0xad, 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x10, 0xad, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x07, 0xc8, 0x57, + 0x4c, 0x00, 0x00, 0x00, 0x59, 0x88, 0x00, 0xae, 0x80, 0x00, 0x00, 0x00, + 0x48, 0x03, 0x10, 0xae, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x07, 0xc8, 0x57, 0x4c, 0x00, 0x00, 0x00, 0x8c, 0x04, 0x0d, 0x1c, + 0x04, 0x00, 0x00, 0x04, 0x59, 0x88, 0x00, 0xaf, 0x80, 0x00, 0x00, 0x00, + 0x48, 0x03, 0x10, 0xaf, 0x8c, 0x04, 0x0d, 0x1a, 0x04, 0x00, 0x00, 0x04, + 0x59, 0x88, 0x00, 0xb0, 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x10, 0xb0, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x07, 0xc8, 0x57, + 0x4c, 0x00, 0x00, 0x00, 0x8c, 0x04, 0x0d, 0x18, 0x04, 0x00, 0x00, 0x04, + 0x59, 0x88, 0x00, 0xb1, 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x10, 0xb1, + 0x8c, 0x04, 0x0d, 0x16, 0x04, 0x00, 0x00, 0x04, 0x59, 0x88, 0x00, 0xb2, + 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x10, 0xb2, 0x8c, 0x04, 0x0d, 0x14, + 0x04, 0x00, 0x00, 0x04, 0x59, 0x88, 0x00, 0xb3, 0x80, 0x00, 0x00, 0x00, + 0x48, 0x03, 0x10, 0xb3, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x07, 0xc8, 0x57, 0x4c, 0x00, 0x00, 0x00, 0x8c, 0x04, 0x0d, 0x10, + 0x04, 0x00, 0x00, 0x04, 0x59, 0x88, 0x00, 0xb4, 0x80, 0x00, 0x00, 0x00, + 0x48, 0x03, 0x10, 0xb4, 0x8c, 0x04, 0x0d, 0x0c, 0x04, 0x00, 0x00, 0x04, + 0x59, 0x88, 0x00, 0xb5, 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x10, 0xb5, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x07, 0xc8, 0x57, + 0x4c, 0x00, 0x00, 0x00, 0x8c, 0x04, 0x0d, 0x08, 0x04, 0x00, 0x00, 0x04, + 0x59, 0x88, 0x00, 0xb6, 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x10, 0xb6, + 0x8c, 0x04, 0x0d, 0x04, 0x04, 0x00, 0x00, 0x04, 0x59, 0x88, 0x00, 0xb7, + 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x10, 0xb7, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x07, 0xc8, 0x56, 0x4c, 0x00, 0x00, 0x00, + 0x59, 0x88, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x10, 0x80, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x40, 0x68, 0x00, 0x00, + 0x48, 0x03, 0xc8, 0x57, 0x4c, 0x04, 0x00, 0x00, 0x50, 0x00, 0x08, 0x00, + 0x80, 0x04, 0x08, 0x00, 0x48, 0x07, 0xc8, 0x57, 0x44, 0x04, 0x00, 0x00, + 0x5c, 0x00, 0x08, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x48, 0x0f, 0xc8, 0x57, + 0x4c, 0x00, 0x00, 0x00, 0x82, 0x0c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x04, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xe7, + 0x04, 0x01, 0xf0, 0x14, 0x82, 0x0c, 0x05, 0x80, 0x00, 0x00, 0x10, 0x01, + 0x04, 0x02, 0x00, 0x04, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xe8, + 0x04, 0x01, 0xf0, 0x0e, 0x82, 0x0c, 0x05, 0x80, 0x00, 0x00, 0x10, 0x02, + 0x04, 0x02, 0x00, 0x04, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xe9, + 0x04, 0x01, 0xf0, 0x08, 0x82, 0x0c, 0x0c, 0x80, 0x00, 0x00, 0x20, 0x1c, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x82, 0x0c, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x1f, 0x0c, 0x01, 0xf8, 0x04, 0x04, 0x01, 0xff, 0xdd, + 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x10, 0xa2, 0xa2, + 0x00, 0x10, 0xa2, 0xa5, 0x00, 0x10, 0xa2, 0xa8, 0x00, 0x10, 0xa2, 0xab, + 0x00, 0x10, 0xa2, 0xae, 0x00, 0x10, 0xa2, 0xb1, 0x00, 0x10, 0xa2, 0xb4, + 0x00, 0x10, 0xa2, 0xb7, 0x00, 0x10, 0xa2, 0xba, 0x00, 0x10, 0xa2, 0xbd, + 0x00, 0x10, 0xa2, 0xc0, 0x00, 0x10, 0xa2, 0xc3, 0x00, 0x10, 0xa2, 0xc6, + 0x00, 0x10, 0xa2, 0xc9, 0x00, 0x10, 0xa2, 0xcc, 0x00, 0x10, 0xa2, 0xcf, + 0x00, 0x10, 0xa2, 0xd2, 0x00, 0x10, 0xa2, 0xd5, 0x00, 0x10, 0xa2, 0xd8, + 0x00, 0x10, 0xa2, 0xdb, 0x00, 0x10, 0xa2, 0xde, 0x00, 0x10, 0xa2, 0xe1, + 0x00, 0x10, 0xa2, 0xe4, 0x00, 0x10, 0xa2, 0xe7, 0x00, 0x10, 0xa2, 0xea, + 0x00, 0x10, 0xa2, 0xed, 0x00, 0x10, 0xa2, 0xf0, 0x00, 0x10, 0xa2, 0xf3, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xea, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xeb, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xec, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xed, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xee, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xef, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xf0, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xf1, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xf2, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xf3, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xf4, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xf5, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xf6, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xf7, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xf8, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xf9, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xfa, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xfb, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xfc, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xfd, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xfe, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xaf, 0xff, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x01, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x02, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x03, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x04, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x05, 0x1c, 0x01, 0xf0, 0x00, + 0x48, 0x0f, 0xc8, 0x57, 0x4c, 0x00, 0x00, 0x00, 0x82, 0x0c, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x02, 0x00, 0x04, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xaf, 0xdc, 0x04, 0x01, 0xf0, 0x12, 0x82, 0x0c, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x02, 0x00, 0x04, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xaf, 0xdd, 0x04, 0x01, 0xf0, 0x0c, 0x82, 0x0c, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x00, 0x04, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xaf, 0xde, 0x04, 0x01, 0xf0, 0x06, 0x82, 0x0c, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x02, 0x00, 0x04, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xaf, 0xdf, 0x04, 0x01, 0xff, 0x51, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x59, 0xa8, 0x00, 0x23, + 0x48, 0x03, 0xc8, 0x57, 0x8c, 0x00, 0x05, 0x02, 0x04, 0x00, 0x00, 0x10, + 0x8c, 0x00, 0x05, 0x06, 0x04, 0x00, 0x00, 0x04, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x0f, 0x04, 0x01, 0xf0, 0x12, 0x8c, 0x00, 0x05, 0x0a, + 0x04, 0x00, 0x00, 0x04, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x0e, + 0x04, 0x01, 0xf0, 0x0d, 0x8c, 0x00, 0x05, 0x08, 0x04, 0x00, 0x00, 0x04, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x11, 0x04, 0x01, 0xf0, 0x08, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xa6, 0x04, 0x00, 0x00, 0x06, + 0x8c, 0x00, 0x05, 0x06, 0x04, 0x02, 0x00, 0x04, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xb0, 0x10, 0x04, 0x01, 0xff, 0x33, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x80, 0x58, 0xb1, 0xc0, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x54, 0x50, 0xa8, 0x00, 0x80, 0x50, 0xa0, 0x00, + 0x80, 0x54, 0xa8, 0x00, 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xfc, + 0x1c, 0x01, 0xf0, 0x00, 0x80, 0x58, 0xb1, 0xc0, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x44, 0x50, 0xa8, 0x00, 0x80, 0x54, 0xa8, 0x00, + 0x80, 0x58, 0xb0, 0x40, 0x04, 0x02, 0x07, 0xfd, 0x1c, 0x01, 0xf0, 0x00, + 0x80, 0x58, 0xb1, 0xc0, 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x04, 0xef, + 0x50, 0x50, 0x00, 0x00, 0x9c, 0x00, 0x01, 0xc0, 0x44, 0x00, 0xa8, 0x00, + 0x80, 0x50, 0xa0, 0x00, 0x80, 0x54, 0xa8, 0x00, 0x80, 0x58, 0xb0, 0x40, + 0x04, 0x02, 0x07, 0xfa, 0x1c, 0x01, 0xf0, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x59, 0xa8, 0x00, 0x07, 0x8c, 0x00, 0x05, 0x1c, 0x5c, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x21, 0x0c, 0xe7, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xe0, 0x00, 0x00, 0x00, 0x20, 0x2a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0xfe, + 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x03, 0x35, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xac, 0x88, + 0x50, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xc0, 0x04, 0x02, 0x09, 0x7c, + 0x04, 0x01, 0xf9, 0x3f, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x04, 0x50, + 0x04, 0x01, 0xfa, 0xf5, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x53, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x05, 0xd0, 0x04, 0x01, 0xf7, 0xef, + 0x59, 0xb8, 0x00, 0xea, 0x82, 0x00, 0x0d, 0x00, 0xf0, 0x00, 0x00, 0x38, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x09, 0xba, 0x8c, 0x00, 0x05, 0x10, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x09, 0xb9, 0x59, 0xba, 0x60, 0xe0, + 0x81, 0x30, 0x01, 0x82, 0x04, 0x02, 0x10, 0x42, 0x04, 0x00, 0x20, 0x28, + 0x85, 0x32, 0x65, 0x3e, 0x59, 0x30, 0x04, 0x06, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x00, 0x20, 0x59, 0x30, 0x02, 0x03, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x04, 0x04, 0x02, 0x00, 0x1c, + 0x59, 0x32, 0x58, 0x08, 0x59, 0x30, 0x00, 0x04, 0x4a, 0x02, 0x5a, 0x04, + 0x00, 0x00, 0x01, 0x03, 0x49, 0x7a, 0x58, 0x09, 0x8c, 0x00, 0x05, 0x3e, + 0x04, 0x02, 0x00, 0x10, 0x04, 0x01, 0xfa, 0xb7, 0x59, 0x32, 0x68, 0x09, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x59, 0x34, 0x00, 0x0f, + 0x59, 0x34, 0x14, 0x0b, 0x80, 0x08, 0x10, 0x40, 0x04, 0x00, 0x10, 0x02, + 0x48, 0x0a, 0x6c, 0x0b, 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x0a, 0x2c, + 0x59, 0xb8, 0x00, 0xea, 0x8c, 0x00, 0x05, 0x10, 0x04, 0x02, 0x07, 0xdf, + 0x1c, 0x01, 0xf0, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x67, 0xa7, + 0x04, 0x00, 0x07, 0xef, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x09, 0xa5, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x55, 0x04, 0x01, 0xf0, 0x23, + 0x83, 0x32, 0x65, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x59, 0x30, 0x04, 0x06, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x00, 0x11, + 0x59, 0x32, 0x58, 0x08, 0x59, 0x32, 0x68, 0x09, 0x4a, 0x02, 0x5a, 0x04, + 0x00, 0x00, 0x01, 0x03, 0x49, 0x7a, 0x58, 0x09, 0x04, 0x01, 0xfa, 0x95, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xbb, 0x59, 0x34, 0x00, 0x0f, + 0x59, 0x34, 0x14, 0x0b, 0x80, 0x08, 0x10, 0x40, 0x04, 0x00, 0x10, 0x02, + 0x48, 0x0a, 0x6c, 0x0b, 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x0a, 0x0b, + 0x04, 0x01, 0xf7, 0xdf, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x54, + 0x04, 0x01, 0xf0, 0x0a, 0x83, 0x30, 0x05, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x09, 0xa8, 0x81, 0x32, 0x65, 0x80, + 0x80, 0x00, 0x01, 0x3a, 0x82, 0x00, 0x04, 0x00, 0x00, 0x10, 0x09, 0xc0, + 0x50, 0x02, 0x70, 0x00, 0x59, 0x30, 0x0c, 0x06, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x09, 0xa5, + 0x59, 0x30, 0x00, 0x04, 0x8c, 0x00, 0x05, 0x3e, 0x04, 0x02, 0x00, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0xdf, 0x04, 0x01, 0xf7, 0xc8, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x67, 0xa7, 0x04, 0x00, 0x07, 0xfb, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x09, 0xa5, 0x59, 0x32, 0x58, 0x08, + 0x41, 0x2c, 0x70, 0x00, 0x58, 0x38, 0x0a, 0x04, 0x82, 0x04, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x82, 0x00, 0x0c, 0x00, 0x00, 0x10, 0x0f, 0xd8, + 0x50, 0x04, 0x40, 0x00, 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x0d, 0x1b, + 0x00, 0x10, 0x0d, 0x1b, 0x00, 0x02, 0x00, 0x94, 0x00, 0x10, 0x0d, 0x1b, + 0x00, 0x10, 0x0d, 0x1b, 0x00, 0x10, 0x0d, 0x1b, 0x00, 0x10, 0x0d, 0x1b, + 0x00, 0x10, 0x0d, 0x1b, 0x00, 0x02, 0x00, 0xa4, 0x00, 0x10, 0x0d, 0x2f, + 0x00, 0x10, 0x0d, 0x1b, 0x00, 0x10, 0x0d, 0x1b, 0x00, 0x10, 0x0d, 0x1d, + 0x00, 0x10, 0x0d, 0x1b, 0x00, 0x10, 0x0d, 0x1b, 0x00, 0x10, 0x0d, 0x1b, + 0x58, 0x38, 0x04, 0x0a, 0x8c, 0x00, 0x05, 0x00, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x50, 0x20, 0x00, 0x00, 0x80, 0x38, 0x7c, 0x00, + 0x58, 0x3c, 0x10, 0x02, 0x58, 0x3c, 0x28, 0x00, 0x58, 0x3c, 0x20, 0x01, + 0x58, 0x38, 0x0a, 0x07, 0x58, 0x38, 0x30, 0x0f, 0x59, 0x30, 0x38, 0x07, + 0x58, 0x38, 0x4c, 0x08, 0x58, 0x38, 0x00, 0x0d, 0x48, 0x02, 0x60, 0x12, + 0x04, 0x01, 0xf0, 0x10, 0x58, 0x38, 0x02, 0x0a, 0x8c, 0x00, 0x05, 0x02, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0d, 0x1b, 0x50, 0x20, 0x00, 0x00, + 0x80, 0x38, 0x7c, 0x00, 0x58, 0x3c, 0x28, 0x00, 0x58, 0x3c, 0x20, 0x01, + 0x58, 0x3c, 0x10, 0x02, 0x59, 0x2c, 0x0a, 0x07, 0x59, 0x2c, 0x4c, 0x08, + 0x59, 0x2c, 0x30, 0x0f, 0x59, 0x30, 0x38, 0x07, 0x49, 0x7a, 0x60, 0x12, + 0x49, 0x7a, 0x60, 0x13, 0x48, 0x16, 0x60, 0x0e, 0x48, 0x12, 0x60, 0x0f, + 0x48, 0x0a, 0x60, 0x10, 0x48, 0x1a, 0x60, 0x11, 0x80, 0x04, 0x08, 0x40, + 0x48, 0x06, 0x60, 0x0d, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x0d, 0x5c, + 0x84, 0x1c, 0x3d, 0x40, 0x48, 0x1e, 0x60, 0x07, 0x1c, 0x01, 0xf0, 0x00, + 0x41, 0x78, 0x78, 0x00, 0x59, 0x32, 0x58, 0x08, 0x59, 0x2c, 0x0c, 0x0a, + 0x8c, 0x04, 0x0d, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0xd3, + 0x59, 0x2c, 0x00, 0x0d, 0x59, 0x2c, 0x10, 0x0f, 0x59, 0x2c, 0x0a, 0x04, + 0x48, 0x0a, 0x60, 0x11, 0x48, 0x02, 0x60, 0x12, 0x48, 0x02, 0x60, 0x13, + 0x41, 0x2c, 0x30, 0x00, 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x82, 0x00, 0x04, 0x00, 0x00, 0x10, 0x0f, 0xd8, 0x50, 0x00, 0x38, 0x00, + 0x50, 0x1c, 0x00, 0x00, 0x40, 0x1c, 0x10, 0x00, 0x59, 0x2c, 0x1a, 0x07, + 0x48, 0x02, 0x60, 0x0a, 0x48, 0x1a, 0x60, 0x0b, 0x48, 0x0a, 0x60, 0x0c, + 0x48, 0x0e, 0x60, 0x0d, 0x84, 0x3c, 0x7d, 0x4a, 0x40, 0x3c, 0x10, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x2c, 0x0a, 0x04, 0x49, 0x7a, 0x60, 0x12, + 0x41, 0x78, 0x78, 0x00, 0x59, 0x2c, 0x1a, 0x07, 0x82, 0x04, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x82, 0x00, 0x04, 0x00, 0x00, 0x10, 0x0f, 0xd8, + 0x50, 0x00, 0x40, 0x00, 0x50, 0x20, 0x00, 0x00, 0x48, 0x02, 0x60, 0x0a, + 0x49, 0x2e, 0x60, 0x0b, 0x48, 0x22, 0x60, 0x0c, 0x48, 0x0e, 0x60, 0x0d, + 0x48, 0x3e, 0x60, 0x04, 0x80, 0x00, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, + 0x00, 0x02, 0x01, 0x3e, 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, + 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, + 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, + 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, + 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, + 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, + 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, + 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, + 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, + 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, + 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, + 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, + 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, + 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, + 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, + 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, + 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, + 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, + 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, + 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, + 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, 0x00, 0x02, 0x01, 0x2b, + 0x00, 0x02, 0x01, 0x2b, 0x4c, 0x00, 0x00, 0x00, 0x4d, 0xf0, 0x00, 0x00, + 0x42, 0x03, 0xe0, 0x00, 0xb0, 0x10, 0x00, 0x00, 0x41, 0xf0, 0x00, 0x00, + 0x81, 0xfe, 0x15, 0x00, 0x8d, 0x0a, 0x15, 0x12, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x13, 0x36, 0x8d, 0x0a, 0x15, 0x18, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x02, 0x07, 0x68, 0x8d, 0x0a, 0x15, 0x1a, 0x04, 0x02, 0x0e, 0xde, + 0x83, 0x08, 0x05, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x04, 0x02, 0x08, 0x04, + 0x5c, 0x03, 0xe0, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x18, 0x01, 0xf0, 0x00, + 0x8d, 0x0a, 0x15, 0x16, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x11, 0xa5, + 0x8d, 0x0a, 0x15, 0x14, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x10, 0x70, + 0x8d, 0x0a, 0x15, 0x08, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x10, 0x75, + 0x8d, 0x0a, 0x15, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x06, 0xcf, + 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xac, 0x8e, + 0x50, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x05, 0x04, 0x04, 0x00, 0x00, 0x14, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xac, 0x8e, 0x50, 0x00, 0x00, 0x00, + 0x8c, 0x00, 0x05, 0x02, 0x04, 0x02, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, + 0x4d, 0xf0, 0x00, 0x00, 0x42, 0x03, 0xe0, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x42, 0x03, 0x40, 0x00, 0x00, 0x10, 0xac, 0x71, 0x59, 0xa0, 0x00, 0x1d, + 0x59, 0xa1, 0xd8, 0x1e, 0x84, 0x00, 0x05, 0x02, 0x48, 0x03, 0x40, 0x1d, + 0x58, 0xec, 0x00, 0x09, 0x08, 0x01, 0xf8, 0x00, 0x5c, 0x03, 0xe0, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x04, 0x02, 0x70, 0x02, 0x04, 0x02, 0x60, 0x02, + 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0xf0, 0x00, 0x00, 0x42, 0x03, 0xe0, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x1a, + 0x04, 0x00, 0x00, 0x1a, 0x41, 0x2d, 0xd8, 0x00, 0x48, 0xef, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x37, 0xda, 0x42, 0x03, 0x40, 0x00, + 0x00, 0x10, 0xac, 0x71, 0x49, 0xa1, 0xd8, 0x0b, 0x48, 0xef, 0x40, 0x1e, + 0x59, 0xa0, 0x00, 0x1d, 0x84, 0x00, 0x05, 0x44, 0x48, 0x03, 0x40, 0x1d, + 0x59, 0xe0, 0x00, 0x20, 0x48, 0x03, 0xc8, 0x57, 0x59, 0xe0, 0x00, 0x21, + 0x48, 0x03, 0xc8, 0x57, 0x59, 0xe0, 0x00, 0x22, 0x48, 0x03, 0xc8, 0x57, + 0x59, 0xe0, 0x00, 0x23, 0x48, 0x03, 0xc8, 0x57, 0x59, 0xe0, 0x00, 0x24, + 0x48, 0x03, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1d, 0xe3, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1e, 0x02, 0x5c, 0x03, 0xe0, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0xa0, 0x00, 0x00, 0x4d, 0xf0, 0x00, 0x00, + 0x42, 0x03, 0xe0, 0x00, 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x60, 0x51, + 0x42, 0x03, 0x40, 0x00, 0x00, 0x10, 0xac, 0x71, 0x59, 0xa0, 0x10, 0x17, + 0x59, 0xa0, 0x18, 0x18, 0x80, 0x0c, 0x19, 0xc0, 0x04, 0x02, 0x00, 0x08, + 0x59, 0xa0, 0x38, 0x1b, 0x80, 0x1c, 0x39, 0xc0, 0x02, 0x00, 0x08, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x59, 0xa0, 0x04, 0x1c, 0x80, 0x1c, 0x3c, 0x00, + 0x04, 0x01, 0xf0, 0x0c, 0x59, 0xa0, 0x04, 0x19, 0x82, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x48, 0x03, 0x44, 0x19, 0x82, 0x00, 0x0c, 0x80, + 0x00, 0x00, 0x00, 0x13, 0x04, 0x00, 0x10, 0x03, 0x49, 0x7b, 0x44, 0x19, + 0x41, 0x78, 0x00, 0x00, 0x59, 0xa0, 0x38, 0x16, 0x80, 0x1c, 0x3c, 0x00, + 0x80, 0x08, 0x10, 0x40, 0x48, 0x0b, 0x40, 0x17, 0x58, 0x1c, 0x02, 0x00, + 0x48, 0x03, 0xc0, 0x21, 0x58, 0x1c, 0x04, 0x01, 0x48, 0x03, 0xc0, 0x22, + 0x58, 0x1c, 0x02, 0x01, 0x48, 0x03, 0xc0, 0x23, 0x58, 0x1c, 0x04, 0x00, + 0x48, 0x03, 0xc0, 0x20, 0x90, 0x00, 0x01, 0xc0, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x00, 0x12, 0x48, 0x03, 0xc0, 0x11, 0x59, 0xe0, 0x00, 0x17, + 0x8c, 0x00, 0x05, 0x08, 0x04, 0x00, 0x00, 0x03, 0x4a, 0x03, 0xc0, 0x17, + 0x00, 0x00, 0x00, 0x02, 0x42, 0x03, 0xe0, 0x00, 0x30, 0x00, 0x00, 0x01, + 0x80, 0x0c, 0x19, 0xc0, 0x04, 0x00, 0x00, 0x07, 0x80, 0x0c, 0x18, 0x40, + 0x48, 0x0f, 0x40, 0x18, 0x04, 0x02, 0x00, 0x1f, 0x49, 0x7b, 0x44, 0x19, + 0x49, 0x7b, 0x42, 0x19, 0x04, 0x01, 0xf0, 0x1c, 0x80, 0x08, 0x11, 0xc0, + 0x04, 0x02, 0x00, 0x0b, 0x4d, 0x2c, 0x00, 0x00, 0x59, 0xa2, 0x58, 0x1b, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x2e, 0x5c, 0x02, 0x58, 0x00, + 0x49, 0x7b, 0x40, 0x1b, 0x49, 0x7b, 0x40, 0x1a, 0x49, 0x7b, 0x44, 0x1c, + 0x49, 0x7b, 0x42, 0x1c, 0x04, 0x01, 0xf0, 0x10, 0x59, 0xa0, 0x04, 0x1c, + 0x82, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x82, 0x00, 0x0c, 0x80, + 0x00, 0x00, 0x00, 0x12, 0x48, 0x03, 0x44, 0x1c, 0x04, 0x00, 0x10, 0x09, + 0x4d, 0x2c, 0x00, 0x00, 0x59, 0xa2, 0x58, 0x1b, 0x59, 0x2c, 0x38, 0x13, + 0x48, 0x1f, 0x40, 0x1b, 0x49, 0x7b, 0x44, 0x1c, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x07, 0x2e, 0x5c, 0x02, 0x58, 0x00, 0x5c, 0x03, 0xe0, 0x00, + 0x5c, 0x03, 0x40, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x83, 0x0c, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x3f, 0xe4, + 0x59, 0x34, 0x04, 0x00, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x06, 0x06, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x3f, 0xb6, 0x59, 0x34, 0x00, 0x0d, + 0x80, 0x02, 0x7d, 0x40, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x3f, 0xef, + 0x04, 0x01, 0xf8, 0x03, 0x80, 0x00, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x34, 0x00, 0x0f, 0x59, 0x34, 0x12, 0x03, 0x80, 0x08, 0x05, 0x40, + 0x04, 0x02, 0x00, 0x5f, 0x59, 0x34, 0x00, 0x0b, 0x80, 0x00, 0x11, 0x20, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0xff, 0xff, 0x80, 0x08, 0x04, 0x80, + 0x04, 0x02, 0x10, 0x59, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x07, 0x99, + 0x04, 0x00, 0x00, 0x52, 0x59, 0x2c, 0x04, 0x06, 0x49, 0x36, 0x60, 0x09, + 0x49, 0x2e, 0x60, 0x08, 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x03, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x40, 0x80, 0x08, 0x10, 0x00, + 0x48, 0x0a, 0x6c, 0x0b, 0x80, 0x00, 0x00, 0xc2, 0x80, 0x00, 0x10, 0xc4, + 0x80, 0x08, 0x04, 0x00, 0x59, 0x2c, 0x08, 0x08, 0x59, 0x2c, 0x18, 0x09, + 0x59, 0x2c, 0x02, 0x0a, 0x48, 0x0a, 0x62, 0x06, 0x48, 0x06, 0x60, 0x17, + 0x48, 0x0e, 0x60, 0x18, 0x8c, 0x00, 0x05, 0x02, 0x04, 0x00, 0x00, 0x2a, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x04, 0x59, 0x2c, 0x02, 0x07, + 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x00, 0x1a, 0x59, 0xa8, 0x00, 0x6d, + 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x07, 0xff, 0x59, 0x2c, 0x02, 0x04, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x18, 0x04, 0x02, 0x00, 0x11, 0x59, 0x2c, 0x18, 0x0f, + 0x59, 0x30, 0x00, 0x07, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x91, + 0x48, 0x0e, 0x60, 0x11, 0x48, 0x02, 0x60, 0x07, 0x42, 0x00, 0x00, 0x00, + 0x80, 0x08, 0x00, 0x04, 0x48, 0x02, 0x60, 0x04, 0x59, 0xbc, 0x00, 0xea, + 0x8c, 0x00, 0x05, 0x16, 0x04, 0x02, 0x07, 0xfe, 0x83, 0x30, 0x04, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x48, 0x03, 0x78, 0xe1, 0x1c, 0x01, 0xf0, 0x00, + 0x04, 0x01, 0xfe, 0x4c, 0x59, 0x30, 0x00, 0x07, 0x84, 0x00, 0x05, 0x4e, + 0x48, 0x02, 0x60, 0x07, 0x59, 0x2c, 0x1a, 0x04, 0x82, 0x0c, 0x1d, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x82, 0x0c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x48, + 0x04, 0x00, 0x00, 0x12, 0x04, 0x01, 0xf7, 0xec, 0x8c, 0x00, 0x05, 0x00, + 0x04, 0x02, 0x0e, 0x9f, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x02, + 0x59, 0xa8, 0x00, 0x6e, 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x07, 0xff, + 0x59, 0x2c, 0x1a, 0x04, 0x82, 0x0c, 0x1d, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x82, 0x0c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x18, 0x04, 0x00, 0x07, 0xdf, + 0x82, 0x0c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x48, 0x04, 0x02, 0x07, 0xdc, + 0x42, 0x00, 0x08, 0x00, 0x80, 0x00, 0x08, 0x04, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x63, 0x2f, 0x80, 0x08, 0x11, 0xc0, 0x04, 0x02, 0x00, 0x03, + 0x4a, 0x02, 0x6a, 0x03, 0x00, 0x00, 0x00, 0x01, 0x59, 0x34, 0x00, 0x10, + 0x49, 0x2e, 0x68, 0x10, 0x80, 0x00, 0x0d, 0x40, 0x04, 0x02, 0x00, 0x03, + 0x49, 0x2e, 0x68, 0x0f, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x2c, 0x08, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x83, 0x44, 0x0c, 0x80, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x02, 0x10, 0x09, 0x83, 0x44, 0x04, 0x00, 0x00, 0x10, 0xa4, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0x04, + 0x40, 0x02, 0x68, 0x00, 0x80, 0x00, 0x05, 0x80, 0x1c, 0x01, 0xf0, 0x00, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x34, 0x02, 0x03, 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x4d, + 0x4d, 0x30, 0x00, 0x00, 0x4d, 0x2c, 0x00, 0x00, 0x59, 0x34, 0x00, 0x0f, + 0x80, 0x02, 0x5d, 0x40, 0x04, 0x00, 0x00, 0x46, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x07, 0x99, 0x04, 0x00, 0x00, 0x41, 0x59, 0x2c, 0x00, 0x00, + 0x48, 0x02, 0x68, 0x0f, 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x02, + 0x48, 0x02, 0x68, 0x10, 0x59, 0x2c, 0x2a, 0x04, 0x80, 0x08, 0x10, 0x00, + 0x48, 0x0a, 0x6c, 0x0b, 0x49, 0x36, 0x60, 0x09, 0x49, 0x2e, 0x60, 0x08, + 0x82, 0x14, 0x2d, 0x00, 0x00, 0x00, 0x00, 0xff, 0x82, 0x14, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x12, 0x04, 0x00, 0x00, 0x37, 0x4a, 0x02, 0x64, 0x06, + 0x00, 0x00, 0x00, 0x03, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x40, + 0x59, 0x2c, 0x04, 0x06, 0x80, 0x00, 0x00, 0xc2, 0x80, 0x00, 0x18, 0xc4, + 0x80, 0x0c, 0x04, 0x00, 0x48, 0x02, 0x62, 0x06, 0x59, 0x2c, 0x08, 0x08, + 0x59, 0x2c, 0x18, 0x09, 0x59, 0x2c, 0x02, 0x0a, 0x48, 0x06, 0x60, 0x17, + 0x48, 0x0e, 0x60, 0x18, 0x8c, 0x00, 0x05, 0x02, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x44, 0x67, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x04, + 0x59, 0x2c, 0x02, 0x07, 0x80, 0x00, 0x00, 0x40, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x44, 0x5a, 0x82, 0x14, 0x05, 0x80, 0x00, 0x00, 0x00, 0x18, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x44, 0x5a, 0x59, 0x2c, 0x18, 0x0f, + 0x59, 0x30, 0x00, 0x07, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x91, + 0x48, 0x0e, 0x60, 0x11, 0x48, 0x02, 0x60, 0x07, 0x42, 0x00, 0x00, 0x00, + 0x80, 0x08, 0x00, 0x04, 0x48, 0x02, 0x60, 0x04, 0x59, 0xbc, 0x00, 0xea, + 0x8c, 0x00, 0x05, 0x16, 0x04, 0x02, 0x07, 0xfe, 0x83, 0x30, 0x04, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x48, 0x03, 0x78, 0xe1, 0x59, 0x34, 0x00, 0x0b, + 0x80, 0x00, 0x11, 0x20, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x80, 0x08, 0x04, 0x80, 0x04, 0x00, 0x17, 0xbc, 0x04, 0x01, 0xf0, 0x03, + 0x4a, 0x02, 0x6a, 0x03, 0x00, 0x00, 0x00, 0x01, 0x5c, 0x02, 0x58, 0x00, + 0x5c, 0x02, 0x60, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x7a, 0x58, 0x00, + 0x49, 0x32, 0x58, 0x09, 0x4a, 0x02, 0x64, 0x06, 0x00, 0x00, 0x00, 0x06, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x07, 0x04, 0x01, 0xf8, 0x02, + 0x04, 0x01, 0xf7, 0xed, 0x8d, 0x0e, 0x1d, 0x0e, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x44, 0x89, 0x8d, 0x0e, 0x1d, 0x04, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x44, 0x85, 0x59, 0x34, 0x02, 0x00, 0x8c, 0x00, 0x05, 0x18, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x44, 0x81, 0x59, 0x2c, 0x0a, 0x0c, + 0x48, 0x06, 0x62, 0x02, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x8c, 0x00, 0x05, 0x08, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x44, 0x7d, + 0x4d, 0x3c, 0x00, 0x00, 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x06, 0xd5, 0x5c, 0x02, 0x78, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x7a, 0x58, 0x01, 0x40, 0x06, 0x58, 0x00, 0x59, 0x2c, 0x00, 0x01, + 0x49, 0x6a, 0x58, 0x00, 0x81, 0x5e, 0xb8, 0x00, 0x41, 0x2e, 0xd0, 0x00, + 0x80, 0x00, 0x0d, 0x40, 0x04, 0x02, 0x07, 0xf9, 0x59, 0xc8, 0x00, 0x00, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x12, 0x00, 0x48, 0x03, 0x90, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x98, 0x00, 0x14, 0x48, 0x03, 0x28, 0x19, + 0x59, 0xd8, 0x09, 0x0b, 0x48, 0x07, 0x30, 0x15, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x2c, 0x04, 0x04, 0x8c, 0x00, 0x05, 0x1e, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x4a, 0x7b, 0x49, 0x7a, 0x58, 0x00, 0x8d, 0x0e, 0x1d, 0x26, + 0x04, 0x02, 0x00, 0x0e, 0x04, 0x02, 0xd0, 0x07, 0x59, 0x2c, 0x00, 0x01, + 0x49, 0x2f, 0xb1, 0x07, 0x80, 0x00, 0x0d, 0x40, 0x04, 0x02, 0x0f, 0xe3, + 0x04, 0x00, 0xe0, 0x65, 0x1c, 0x01, 0xf0, 0x00, 0x04, 0x00, 0xe8, 0x63, + 0x04, 0x00, 0xd7, 0xf9, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x24, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa2, 0x60, 0x04, 0x01, 0xf8, 0xa8, + 0x04, 0x00, 0xd8, 0xb3, 0x04, 0x00, 0xe0, 0x5b, 0x59, 0xd8, 0x01, 0x05, + 0x82, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x87, 0x80, 0x04, 0x02, 0x00, 0xc2, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x98, 0x00, 0x12, 0x0c, 0x01, 0xf0, 0x01, + 0x00, 0x02, 0x03, 0x0a, 0x00, 0x02, 0x03, 0x0b, 0x00, 0x02, 0x03, 0x16, + 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0xf0, 0x00, 0x00, 0x42, 0x03, 0xe0, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x04, 0x02, 0x68, 0xc2, 0x04, 0x00, 0x60, 0x03, + 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x02, 0x09, 0x2b, 0x8d, 0x0e, 0x1d, 0x26, + 0x04, 0x02, 0x08, 0x9e, 0x5c, 0x03, 0xe0, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x4d, 0xf0, 0x00, 0x00, 0x42, 0x03, 0xe0, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x59, 0x94, 0x00, 0x19, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x20, 0x1b, + 0x04, 0x00, 0x00, 0x0e, 0x59, 0x98, 0x00, 0x13, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x00, 0x16, 0x59, 0xa8, 0x00, 0x66, + 0x81, 0x64, 0x05, 0x80, 0x04, 0x02, 0x00, 0x13, 0x8d, 0x0e, 0x1d, 0x20, + 0x04, 0x00, 0x00, 0x07, 0x59, 0xa8, 0x00, 0x67, 0x59, 0xa8, 0x08, 0x63, + 0x80, 0x04, 0x05, 0x80, 0x04, 0x02, 0x00, 0x0d, 0x8d, 0x0e, 0x1d, 0x20, + 0x04, 0x02, 0x00, 0x22, 0x59, 0xd8, 0x09, 0x0b, 0x59, 0xd8, 0x01, 0x0a, + 0x80, 0x04, 0x05, 0x80, 0x04, 0x00, 0x00, 0x1b, 0x59, 0x98, 0x00, 0x15, + 0x80, 0x04, 0x05, 0x80, 0x04, 0x00, 0x00, 0x0c, 0x59, 0x98, 0x00, 0x14, + 0x48, 0x03, 0x28, 0x19, 0x48, 0x07, 0x30, 0x15, 0x04, 0x00, 0xe8, 0xcc, + 0x04, 0x00, 0x60, 0x03, 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x02, 0x08, 0xe1, + 0x8d, 0x0e, 0x1d, 0x26, 0x04, 0x02, 0x08, 0x76, 0x5c, 0x03, 0xe0, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x04, 0x00, 0x67, 0xf8, 0x4a, 0x03, 0xc0, 0x11, + 0x80, 0x40, 0x00, 0x12, 0x4a, 0x03, 0xc0, 0x20, 0x00, 0x00, 0x80, 0x40, + 0x59, 0xe0, 0x00, 0x17, 0x8c, 0x00, 0x05, 0x08, 0x04, 0x00, 0x00, 0x03, + 0x4a, 0x03, 0xc0, 0x17, 0x00, 0x00, 0x00, 0x02, 0x42, 0x03, 0xe0, 0x00, + 0x30, 0x00, 0x00, 0x01, 0x4a, 0x03, 0x28, 0x19, 0xff, 0xff, 0x00, 0x00, + 0x04, 0x01, 0xf7, 0xea, 0x59, 0xe0, 0x00, 0x0f, 0x59, 0xe0, 0x08, 0x0f, + 0x80, 0x04, 0x05, 0x80, 0x04, 0x02, 0x07, 0xfd, 0x59, 0xe0, 0x00, 0x10, + 0x59, 0xe0, 0x10, 0x10, 0x80, 0x08, 0x15, 0x80, 0x04, 0x02, 0x07, 0xfd, + 0x40, 0x06, 0x50, 0x00, 0x80, 0x04, 0x15, 0x80, 0x04, 0x00, 0x07, 0xd5, + 0x04, 0x00, 0x67, 0xe2, 0x04, 0x01, 0xf7, 0xe6, 0x59, 0xd8, 0x11, 0x08, + 0x83, 0x5c, 0x04, 0x80, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x10, 0x0f, + 0x04, 0x02, 0xb0, 0x0d, 0x48, 0x0b, 0xb0, 0x07, 0x04, 0x00, 0xe7, 0xfa, + 0x59, 0xd8, 0x01, 0x05, 0x82, 0x00, 0x05, 0x00, 0x00, 0x01, 0x87, 0x80, + 0x04, 0x02, 0x00, 0x61, 0x8d, 0x0e, 0x1d, 0x22, 0x04, 0x00, 0x00, 0x12, + 0x59, 0x94, 0x00, 0x19, 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x27, 0x7b, + 0x1c, 0x01, 0xf0, 0x00, 0x04, 0x00, 0xf0, 0x0a, 0x49, 0x68, 0x10, 0x00, + 0x40, 0x0a, 0xd0, 0x00, 0x81, 0x5e, 0xb8, 0x00, 0x59, 0xc8, 0x00, 0x00, + 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x12, 0x00, 0x48, 0x03, 0x90, 0x00, + 0x04, 0x02, 0xe7, 0xee, 0x04, 0x01, 0xf7, 0xe6, 0x48, 0x0b, 0xa8, 0x07, + 0x04, 0x02, 0xe7, 0xeb, 0x04, 0x01, 0xf7, 0xe3, 0x04, 0x00, 0x60, 0x21, + 0x85, 0x0e, 0x1d, 0x24, 0x59, 0xd8, 0x01, 0x0a, 0x59, 0xd8, 0x09, 0x0a, + 0x80, 0x04, 0x05, 0x80, 0x04, 0x02, 0x07, 0xfd, 0x80, 0x04, 0x08, 0xe0, + 0x8d, 0x0e, 0x1d, 0x20, 0x04, 0x02, 0x00, 0x1b, 0x82, 0x04, 0x0d, 0x40, + 0x00, 0x00, 0x00, 0x13, 0x48, 0x07, 0xc0, 0x11, 0x59, 0xe0, 0x00, 0x17, + 0x8c, 0x00, 0x05, 0x08, 0x04, 0x02, 0x00, 0x04, 0x42, 0x03, 0xe0, 0x00, + 0x30, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x04, 0x05, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x1d, + 0x04, 0x00, 0x00, 0x06, 0x4a, 0x03, 0xc0, 0x17, 0x00, 0x00, 0x00, 0x03, + 0x42, 0x03, 0xe0, 0x00, 0x30, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, + 0x4a, 0x03, 0xc0, 0x17, 0x00, 0x00, 0x00, 0x0d, 0x42, 0x03, 0xe0, 0x00, + 0x30, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, 0x85, 0x0e, 0x1d, 0x64, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xe0, 0x00, 0x0f, 0x59, 0xe0, 0x10, 0x0f, + 0x80, 0x08, 0x15, 0x80, 0x04, 0x02, 0x07, 0xfd, 0x81, 0x28, 0x15, 0x80, + 0x04, 0x00, 0x07, 0xe1, 0x40, 0x02, 0x50, 0x00, 0x82, 0x04, 0x0d, 0x40, + 0x00, 0x00, 0x00, 0x1d, 0x04, 0x01, 0xf7, 0xdf, 0x59, 0x98, 0x08, 0x17, + 0x59, 0x2c, 0x00, 0x01, 0x49, 0x2f, 0x30, 0x17, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x00, 0x00, 0x05, 0x49, 0x2c, 0x08, 0x00, 0x80, 0x00, 0x0d, 0x40, + 0x04, 0x02, 0x07, 0x2b, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x2f, 0x30, 0x18, + 0x85, 0x0e, 0x1d, 0x66, 0x04, 0x01, 0xf7, 0xfb, 0x04, 0x02, 0xd0, 0x0c, + 0x59, 0x98, 0x08, 0x18, 0x58, 0x04, 0x00, 0x00, 0x48, 0x07, 0xb1, 0x07, + 0x80, 0x00, 0x0d, 0x40, 0x04, 0x02, 0x00, 0x05, 0x48, 0x03, 0x30, 0x17, + 0x85, 0x0e, 0x1d, 0x26, 0x48, 0x03, 0x30, 0x18, 0x1c, 0x01, 0xf0, 0x00, + 0x04, 0x00, 0xd7, 0xf8, 0x04, 0x01, 0xf7, 0xfd, 0x59, 0xd8, 0x01, 0x05, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x01, 0x87, 0x80, 0x04, 0x02, 0x00, 0x05, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x24, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x48, 0x03, 0xc8, 0x57, 0x48, 0x5f, 0xc8, 0x57, + 0x8c, 0x00, 0x05, 0x0e, 0x02, 0x02, 0x08, 0x00, 0x00, 0x10, 0x04, 0xe4, + 0x42, 0x03, 0xe0, 0x00, 0x50, 0x00, 0x00, 0x00, 0x42, 0x00, 0xb8, 0x00, + 0x00, 0x00, 0x80, 0x04, 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x04, 0xf4, + 0x04, 0x00, 0xe7, 0x8a, 0x59, 0xd8, 0x01, 0x05, 0x82, 0x00, 0x05, 0x00, + 0x00, 0x01, 0x87, 0x80, 0x04, 0x02, 0x07, 0xf1, 0x8d, 0x0e, 0x1d, 0x24, + 0x04, 0x02, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xd8, 0x01, 0x0a, + 0x59, 0xd8, 0x09, 0x0a, 0x80, 0x04, 0x05, 0x80, 0x04, 0x02, 0x07, 0xfd, + 0x80, 0x04, 0x08, 0xe0, 0x85, 0x0e, 0x1d, 0x24, 0x8d, 0x0e, 0x1d, 0x20, + 0x04, 0x02, 0x00, 0x19, 0x82, 0x04, 0x0d, 0x40, 0x00, 0x00, 0x00, 0x13, + 0x48, 0x07, 0xc0, 0x11, 0x59, 0xe0, 0x00, 0x17, 0x8c, 0x00, 0x05, 0x08, + 0x04, 0x02, 0x00, 0x04, 0x42, 0x03, 0xe0, 0x00, 0x30, 0x00, 0x00, 0x01, + 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x82, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x1d, 0x04, 0x00, 0x00, 0x06, + 0x4a, 0x03, 0xc0, 0x17, 0x00, 0x00, 0x00, 0x03, 0x42, 0x03, 0xe0, 0x00, + 0x30, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, 0x4a, 0x03, 0xc0, 0x17, + 0x00, 0x00, 0x00, 0x0d, 0x42, 0x03, 0xe0, 0x00, 0x30, 0x00, 0x00, 0x01, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xe0, 0x00, 0x0f, 0x59, 0xe0, 0x10, 0x0f, + 0x80, 0x08, 0x15, 0x80, 0x04, 0x02, 0x07, 0xfd, 0x81, 0x28, 0x15, 0x80, + 0x04, 0x00, 0x07, 0xe3, 0x40, 0x02, 0x50, 0x00, 0x82, 0x04, 0x0d, 0x40, + 0x00, 0x00, 0x00, 0x1d, 0x04, 0x01, 0xf7, 0xe1, 0x59, 0xda, 0x59, 0x08, + 0x49, 0x6a, 0x58, 0x00, 0x41, 0x2e, 0xd0, 0x00, 0x81, 0x5e, 0xb8, 0x00, + 0x04, 0x00, 0xe7, 0xfc, 0x59, 0xc8, 0x00, 0x00, 0x82, 0x00, 0x05, 0x40, + 0x00, 0x00, 0x12, 0x00, 0x48, 0x03, 0x90, 0x00, 0x59, 0xd8, 0x09, 0x0b, + 0x59, 0x98, 0x00, 0x15, 0x48, 0x07, 0x30, 0x15, 0x80, 0x04, 0x04, 0x80, + 0x04, 0x02, 0x00, 0x04, 0x59, 0x94, 0x00, 0x19, 0x80, 0x00, 0x05, 0x40, + 0x04, 0x02, 0x20, 0x03, 0x59, 0x98, 0x08, 0x14, 0x48, 0x07, 0x28, 0x19, + 0x59, 0xd8, 0x01, 0x05, 0x82, 0x00, 0x05, 0x00, 0x00, 0x01, 0x87, 0x80, + 0x04, 0x02, 0x07, 0xad, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x98, 0x10, 0x16, + 0x59, 0xe0, 0x00, 0x10, 0x59, 0xe0, 0x08, 0x10, 0x80, 0x04, 0x1d, 0x80, + 0x04, 0x02, 0x07, 0xfd, 0x80, 0x08, 0x05, 0x80, 0x04, 0x00, 0x00, 0x11, + 0x48, 0x07, 0x30, 0x16, 0x59, 0xe0, 0x00, 0x0f, 0x59, 0xe0, 0x10, 0x0f, + 0x80, 0x08, 0x1d, 0x80, 0x04, 0x02, 0x07, 0xfd, 0x81, 0x28, 0x05, 0x80, + 0x04, 0x00, 0x00, 0x06, 0x40, 0x0a, 0x50, 0x00, 0x40, 0x08, 0x00, 0x00, + 0x80, 0x04, 0x05, 0x80, 0x04, 0x02, 0x06, 0xb9, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x94, 0x00, 0x19, 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x27, 0xfa, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xe0, 0x00, 0x0f, 0x59, 0xe0, 0x10, 0x0f, + 0x80, 0x08, 0x1d, 0x80, 0x04, 0x02, 0x07, 0xfd, 0x81, 0x28, 0x05, 0x80, + 0x04, 0x00, 0x07, 0xf6, 0x40, 0x0a, 0x50, 0x00, 0x59, 0x94, 0x00, 0x19, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x27, 0xef, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0xe0, 0x00, 0x0f, 0x59, 0xe0, 0x10, 0x0f, 0x80, 0x08, 0x0d, 0x80, + 0x04, 0x02, 0x07, 0xfd, 0x81, 0x28, 0x05, 0x80, 0x04, 0x02, 0x00, 0x02, + 0x1c, 0x01, 0xf0, 0x00, 0x40, 0x0a, 0x50, 0x00, 0x90, 0x08, 0x11, 0xc0, + 0x82, 0x08, 0x15, 0x40, 0x00, 0x00, 0x00, 0x1c, 0x48, 0x0b, 0xc0, 0x11, + 0x59, 0xe0, 0x00, 0x17, 0x8c, 0x00, 0x05, 0x08, 0x04, 0x00, 0x00, 0x03, + 0x4a, 0x03, 0xc0, 0x17, 0x00, 0x00, 0x00, 0x0c, 0x42, 0x03, 0xe0, 0x00, + 0x30, 0x00, 0x00, 0x01, 0x1c, 0x01, 0xf0, 0x00, 0x41, 0x70, 0x00, 0x00, + 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x4f, 0x9e, 0x00, 0x02, 0x04, 0x5b, + 0x00, 0x10, 0x4f, 0x9e, 0x00, 0x10, 0x4f, 0x9f, 0x00, 0x10, 0x4f, 0x9c, + 0x00, 0x10, 0x4f, 0x9c, 0x00, 0x10, 0x4f, 0x9c, 0x00, 0x10, 0x4f, 0x9c, + 0x00, 0x10, 0x54, 0x29, 0x04, 0x01, 0x00, 0x37, 0x59, 0x98, 0x00, 0x04, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x3c, 0x04, 0x02, 0xc0, 0x1c, + 0x42, 0x02, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x10, 0x4d, 0xf0, 0x00, 0x00, + 0x42, 0x03, 0xe0, 0x00, 0x50, 0x00, 0x00, 0x00, 0x49, 0xdb, 0x30, 0x03, + 0x59, 0xda, 0x58, 0x08, 0x59, 0x2c, 0x2a, 0x04, 0x49, 0x7a, 0x58, 0x00, + 0x49, 0x7a, 0x58, 0x01, 0x82, 0x14, 0x05, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x79, 0x04, 0x02, 0x10, 0x36, + 0x0c, 0x01, 0xf8, 0x39, 0x5c, 0x03, 0xe0, 0x00, 0x81, 0x7e, 0xf8, 0x40, + 0x04, 0x00, 0x00, 0x09, 0x83, 0x6c, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x02, 0x00, 0x06, 0x83, 0x70, 0x05, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x02, 0x00, 0x10, 0x04, 0x01, 0x00, 0x1b, 0x04, 0x00, 0xc7, 0xe8, + 0x04, 0x00, 0xf9, 0x40, 0x04, 0x00, 0xb1, 0x2a, 0x59, 0xd4, 0x00, 0x05, + 0x82, 0x00, 0x05, 0x00, 0x43, 0x01, 0x87, 0x80, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x53, 0xbf, 0x59, 0xd8, 0x00, 0x05, 0x82, 0x00, 0x05, 0x00, + 0x43, 0x01, 0x87, 0x80, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x53, 0xc6, + 0x1c, 0x01, 0xf0, 0x00, 0x83, 0x70, 0x05, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x02, 0x00, 0x08, 0x00, 0x00, 0x10, 0x4f, 0x9f, 0x83, 0x70, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x02, 0x07, 0xed, 0x04, 0x01, 0x00, 0x05, + 0x04, 0x00, 0xc7, 0xd2, 0x04, 0x01, 0xf7, 0xea, 0x42, 0x02, 0xf8, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x4d, 0xf0, 0x00, 0x00, 0x42, 0x03, 0xe0, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x49, 0xd7, 0x30, 0x03, 0x59, 0xd6, 0x58, 0x08, + 0x04, 0x01, 0xf7, 0xce, 0x4d, 0xf0, 0x00, 0x00, 0x42, 0x03, 0xe0, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x40, 0x02, 0x58, 0x00, 0x59, 0x2c, 0x2a, 0x04, + 0x49, 0x7b, 0x30, 0x03, 0x49, 0x7b, 0x30, 0x04, 0x42, 0x02, 0xf8, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x04, 0x01, 0xf7, 0xc7, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x50, 0x0f, 0x5c, 0x03, 0xe0, 0x00, 0x04, 0x01, 0xf7, 0xd4, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0xaa, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x1f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0xd2, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x02, 0x05, 0x4c, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x52, 0x37, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x02, 0x05, 0x21, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x42, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x53, 0x53, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x53, 0x9e, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x39, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x53, 0x17, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x52, 0xe5, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x52, 0xe5, + 0x00, 0x10, 0x53, 0xf0, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x52, 0xa7, 0x00, 0x10, 0x53, 0xd5, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x53, 0xe4, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, 0x00, 0x10, 0x50, 0x0f, + 0x00, 0x10, 0x50, 0x0f, 0x80, 0x14, 0x01, 0x10, 0x80, 0x00, 0x00, 0x40, + 0x04, 0x00, 0x00, 0x0b, 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x50, 0x17, + 0x4a, 0x03, 0x30, 0x06, 0x00, 0x02, 0x05, 0x2e, 0x48, 0x03, 0x30, 0x00, + 0x49, 0x2f, 0x30, 0x01, 0x49, 0x2f, 0x30, 0x02, 0x42, 0x02, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x2c, 0x04, 0x06, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x19, 0x9a, 0x02, 0x02, 0x10, 0x00, + 0x00, 0x10, 0x50, 0x27, 0x8d, 0x0e, 0x1d, 0x0e, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x50, 0x4b, 0x59, 0x2e, 0x8a, 0x06, 0x83, 0x44, 0x0c, 0x80, + 0x00, 0x00, 0x07, 0xf0, 0x02, 0x02, 0x10, 0x00, 0x00, 0x10, 0x50, 0x27, + 0x83, 0x44, 0x04, 0x00, 0x00, 0x10, 0xa4, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x80, 0x02, 0x6d, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x50, 0x5f, + 0x59, 0x34, 0x00, 0x02, 0x59, 0x2c, 0x08, 0x10, 0x80, 0x04, 0x05, 0x80, + 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x50, 0x27, 0x04, 0x01, 0xfc, 0x98, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x50, 0x62, 0x1c, 0x01, 0xf0, 0x00, 0x80, 0x14, 0x01, 0x10, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x50, 0x17, 0x80, 0x00, 0x00, 0x40, + 0x04, 0x02, 0x00, 0x0b, 0x59, 0x2c, 0x04, 0x0a, 0x8c, 0x00, 0x05, 0x04, + 0x04, 0x00, 0x00, 0x0b, 0x59, 0x2c, 0x02, 0x07, 0x82, 0x00, 0x0c, 0x80, + 0x00, 0x00, 0x10, 0x01, 0x02, 0x02, 0x10, 0x00, 0x00, 0x10, 0x50, 0x27, + 0x02, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x54, 0x03, 0x4a, 0x03, 0x30, 0x06, + 0x00, 0x02, 0x05, 0x5e, 0x04, 0x01, 0xf7, 0xcb, 0x59, 0x2c, 0x04, 0x06, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x19, 0x9a, 0x02, 0x02, 0x10, 0x00, + 0x00, 0x10, 0x50, 0x27, 0x59, 0x2e, 0x8a, 0x06, 0x41, 0x7a, 0x78, 0x00, + 0x04, 0x01, 0xfc, 0xf5, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x51, 0xdb, + 0x59, 0x34, 0x00, 0x02, 0x59, 0x2c, 0x08, 0x08, 0x80, 0x04, 0x05, 0x80, + 0x82, 0x00, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x50, 0x27, 0x59, 0x2e, 0x60, 0x09, 0x49, 0x7a, 0x58, 0x08, + 0x83, 0x30, 0x05, 0x80, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x51, 0x9b, 0x83, 0x30, 0x04, 0x80, 0x00, 0x10, 0xd8, 0xd4, + 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x51, 0xf8, 0x59, 0xa8, 0x00, 0x0a, + 0x81, 0x30, 0x04, 0x80, 0x02, 0x02, 0x10, 0x00, 0x00, 0x10, 0x51, 0xf8, + 0x59, 0x2c, 0x24, 0x0a, 0x49, 0x36, 0x60, 0x09, 0x8c, 0x10, 0x25, 0x1c, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x51, 0x89, 0x59, 0xa8, 0x00, 0x65, + 0x8c, 0x00, 0x05, 0x10, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x52, 0x11, + 0x8d, 0x0e, 0x1d, 0x0e, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x51, 0x6f, + 0x8d, 0x0e, 0x1d, 0x04, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x52, 0x02, + 0x59, 0x34, 0x02, 0x00, 0x8c, 0x00, 0x05, 0x18, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x51, 0xf3, 0x59, 0x30, 0x0c, 0x06, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x06, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x51, 0x93, + 0x59, 0x30, 0x04, 0x14, 0x8c, 0x00, 0x05, 0x16, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x51, 0xfd, 0x8c, 0x10, 0x25, 0x08, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x9d, 0xa4, 0x59, 0x30, 0x08, 0x08, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x09, 0xc0, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x51, 0x6a, 0x59, 0x2c, 0x0a, 0x0c, 0x48, 0x06, 0x62, 0x02, + 0x49, 0x2e, 0x60, 0x08, 0x04, 0x01, 0xf1, 0x30, 0x4d, 0xf0, 0x00, 0x00, + 0x42, 0x03, 0xe0, 0x00, 0x50, 0x00, 0x00, 0x00, 0x04, 0x02, 0xb0, 0x0b, + 0x83, 0x5c, 0x04, 0x80, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x10, 0x0d, + 0x81, 0x5e, 0xb8, 0x40, 0x41, 0x6a, 0x58, 0x00, 0x59, 0x2e, 0xd0, 0x00, + 0x49, 0x2f, 0xb0, 0x07, 0x49, 0x7a, 0x58, 0x00, 0x49, 0x7a, 0x58, 0x01, + 0x04, 0x00, 0xb7, 0xf7, 0x59, 0xd8, 0x00, 0x05, 0x82, 0x00, 0x05, 0x00, + 0x43, 0x01, 0x87, 0x80, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x53, 0xc6, + 0x5c, 0x03, 0xe0, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0xf0, 0x00, 0x00, + 0x42, 0x03, 0xe0, 0x00, 0x50, 0x00, 0x00, 0x00, 0x04, 0x02, 0xf0, 0x0b, + 0x83, 0x5c, 0x04, 0x80, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x10, 0x0d, + 0x81, 0x5e, 0xb8, 0x40, 0x41, 0x6a, 0x58, 0x00, 0x59, 0x2e, 0xd0, 0x00, + 0x49, 0x2f, 0xa8, 0x07, 0x49, 0x7a, 0x58, 0x00, 0x49, 0x7a, 0x58, 0x01, + 0x04, 0x00, 0xf7, 0xf7, 0x59, 0xd4, 0x00, 0x05, 0x82, 0x00, 0x05, 0x00, + 0x43, 0x01, 0x87, 0x80, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x53, 0xbf, + 0x5c, 0x03, 0xe0, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0xf0, 0x00, 0x00, + 0x42, 0x03, 0xe0, 0x00, 0x50, 0x00, 0x00, 0x00, 0x59, 0x94, 0x00, 0x24, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x00, 0x00, 0xf5, 0x4c, 0x00, 0x00, 0x00, + 0x59, 0xe0, 0x00, 0x02, 0x8c, 0x00, 0x05, 0x1e, 0x04, 0x02, 0x00, 0x1b, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x82, 0x00, 0x04, 0x80, 0x24, 0x32, 0x00, 0x02, 0x04, 0x02, 0x00, 0x15, + 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x64, 0x80, 0x04, 0x08, 0x40, + 0x04, 0x00, 0x00, 0x07, 0x4a, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x40, 0x00, 0x00, 0x00, 0x59, 0x80, 0x00, 0x00, 0x8c, 0x00, 0x05, 0x00, + 0x04, 0x00, 0x07, 0xf9, 0x04, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x7a, 0x17, 0x50, 0x04, 0x00, 0x00, 0x8c, 0x00, 0x05, 0x0e, + 0x04, 0x02, 0x00, 0x03, 0x84, 0x00, 0x05, 0x4e, 0x44, 0x00, 0x08, 0x00, + 0x4a, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, + 0x59, 0x94, 0x78, 0x1a, 0x48, 0x03, 0x28, 0x25, 0x80, 0x3c, 0x04, 0x80, + 0x04, 0x00, 0x10, 0x04, 0x04, 0x00, 0x00, 0x03, 0x48, 0x03, 0x28, 0x1a, + 0x04, 0x01, 0xf0, 0x22, 0x41, 0x78, 0x78, 0x00, 0x80, 0x3c, 0x78, 0x00, + 0x82, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0xe8, 0x04, 0x00, 0x27, 0xfd, + 0x48, 0x03, 0x28, 0x1a, 0x59, 0xa8, 0x00, 0x21, 0x80, 0x3c, 0x14, 0x00, + 0x48, 0x0b, 0x50, 0x21, 0x80, 0x3c, 0x00, 0x40, 0x04, 0x00, 0x00, 0x02, + 0x48, 0x3f, 0xc8, 0x57, 0x59, 0xe4, 0x08, 0x52, 0x59, 0xa8, 0x00, 0x22, + 0x80, 0x04, 0x05, 0x80, 0x04, 0x00, 0x00, 0x04, 0x48, 0x0b, 0xc8, 0x57, + 0x59, 0xe4, 0x00, 0x52, 0x48, 0x03, 0x50, 0x22, 0x59, 0x94, 0x00, 0x26, + 0x80, 0x3c, 0x04, 0x00, 0x48, 0x03, 0x28, 0x26, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5c, 0x00, 0x59, 0x94, 0x00, 0x00, 0x82, 0x00, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x06, 0x59, 0x94, 0x00, 0x26, + 0x48, 0x03, 0x28, 0x27, 0x49, 0x7b, 0x28, 0x26, 0x4a, 0x03, 0x28, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x4c, 0x0c, 0x00, 0x00, 0x59, 0x94, 0x00, 0x07, + 0x80, 0x00, 0x0d, 0x40, 0x04, 0x00, 0x00, 0x1d, 0x59, 0x94, 0x10, 0x06, + 0x59, 0x94, 0x00, 0x25, 0x80, 0x08, 0x1c, 0x80, 0x04, 0x00, 0x10, 0x04, + 0x04, 0x00, 0x00, 0x03, 0x48, 0x0f, 0x28, 0x06, 0x04, 0x01, 0xf0, 0x16, + 0x80, 0x04, 0x08, 0x40, 0x48, 0x07, 0x28, 0x07, 0x82, 0x04, 0x05, 0x80, + 0x00, 0x00, 0x03, 0xe8, 0x04, 0x02, 0x00, 0x07, 0x4c, 0x04, 0x00, 0x00, + 0x4c, 0x0c, 0x00, 0x00, 0x59, 0x94, 0x00, 0x08, 0x08, 0x01, 0xf8, 0x00, + 0x5c, 0x00, 0x18, 0x00, 0x5c, 0x00, 0x08, 0x00, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x02, 0x00, 0x04, 0x59, 0x94, 0x00, 0x08, 0x08, 0x01, 0xf8, 0x00, + 0x04, 0x01, 0xf0, 0x06, 0x40, 0x0c, 0x00, 0x00, 0x82, 0x0c, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x27, 0xed, 0x48, 0x0f, 0x28, 0x06, + 0x5c, 0x00, 0x18, 0x00, 0x4d, 0x18, 0x00, 0x00, 0x59, 0xc4, 0x00, 0x08, + 0x8c, 0x00, 0x05, 0x34, 0x04, 0x02, 0x00, 0x25, 0x41, 0x7a, 0x30, 0x00, + 0x83, 0x94, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x09, 0x58, 0x3c, 0x00, 0x01, + 0x80, 0x00, 0x0d, 0x40, 0x04, 0x02, 0x00, 0x08, 0x82, 0x3c, 0x7c, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x81, 0x1a, 0x30, 0x00, 0x83, 0x18, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x05, 0x04, 0x02, 0x07, 0xf8, 0x04, 0x01, 0xf0, 0x18, + 0x58, 0x3c, 0x10, 0x00, 0x59, 0x94, 0x00, 0x25, 0x80, 0x08, 0x04, 0x80, + 0x04, 0x00, 0x10, 0x05, 0x04, 0x00, 0x00, 0x04, 0x48, 0x00, 0x78, 0x00, + 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x10, 0x10, 0x80, 0x04, 0x08, 0x40, + 0x48, 0x04, 0x78, 0x01, 0x04, 0x00, 0x00, 0x08, 0x82, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x0a, 0x48, 0x00, 0x78, 0x00, 0x04, 0x00, 0x27, 0xfa, + 0x82, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x04, 0x01, 0xf7, 0xe8, + 0x58, 0x3c, 0x00, 0x02, 0x4c, 0x3c, 0x00, 0x00, 0x08, 0x01, 0xf8, 0x00, + 0x5c, 0x00, 0x78, 0x00, 0x04, 0x01, 0xf7, 0xe3, 0x5c, 0x02, 0x30, 0x00, + 0x59, 0x94, 0x00, 0x19, 0x80, 0x00, 0x15, 0x40, 0x04, 0x00, 0x00, 0x07, + 0x04, 0x00, 0x20, 0x06, 0x59, 0x94, 0x00, 0x25, 0x80, 0x08, 0x04, 0x80, + 0x04, 0x02, 0x10, 0x02, 0x80, 0x00, 0x05, 0x80, 0x48, 0x03, 0x28, 0x19, + 0x59, 0x94, 0x00, 0x1c, 0x80, 0x00, 0x0d, 0x40, 0x04, 0x00, 0x00, 0x13, + 0x59, 0x94, 0x10, 0x1b, 0x59, 0x94, 0x00, 0x25, 0x80, 0x08, 0x04, 0x80, + 0x04, 0x00, 0x10, 0x05, 0x04, 0x00, 0x00, 0x04, 0x48, 0x03, 0x28, 0x1b, + 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x10, 0x0b, 0x80, 0x04, 0x08, 0x40, + 0x48, 0x07, 0x28, 0x1c, 0x04, 0x02, 0x00, 0x04, 0x59, 0x94, 0x00, 0x1d, + 0x08, 0x01, 0xf8, 0x00, 0x04, 0x01, 0xf0, 0x05, 0x82, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x0a, 0x48, 0x03, 0x28, 0x1b, 0x04, 0x00, 0x27, 0xf7, + 0x59, 0x94, 0x00, 0x04, 0x80, 0x00, 0x0d, 0x40, 0x04, 0x00, 0x00, 0x13, + 0x59, 0x94, 0x10, 0x03, 0x59, 0x94, 0x00, 0x25, 0x80, 0x08, 0x04, 0x80, + 0x04, 0x00, 0x10, 0x05, 0x04, 0x00, 0x00, 0x04, 0x48, 0x03, 0x28, 0x03, + 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x10, 0x0b, 0x80, 0x04, 0x08, 0x40, + 0x48, 0x07, 0x28, 0x04, 0x04, 0x02, 0x00, 0x04, 0x59, 0x94, 0x00, 0x05, + 0x08, 0x01, 0xf8, 0x00, 0x04, 0x01, 0xf0, 0x05, 0x82, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x0a, 0x48, 0x03, 0x28, 0x03, 0x04, 0x00, 0x27, 0xf7, + 0x59, 0x94, 0x00, 0x1f, 0x80, 0x00, 0x0d, 0x40, 0x04, 0x00, 0x00, 0x13, + 0x59, 0x94, 0x10, 0x1e, 0x59, 0x94, 0x00, 0x25, 0x80, 0x08, 0x04, 0x80, + 0x04, 0x00, 0x10, 0x05, 0x04, 0x00, 0x00, 0x04, 0x48, 0x03, 0x28, 0x1e, + 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x10, 0x0b, 0x80, 0x04, 0x08, 0x40, + 0x48, 0x07, 0x28, 0x1f, 0x04, 0x02, 0x00, 0x04, 0x59, 0x94, 0x00, 0x20, + 0x08, 0x01, 0xf8, 0x00, 0x04, 0x01, 0xf0, 0x05, 0x82, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x48, 0x03, 0x28, 0x1e, 0x04, 0x00, 0x27, 0xf7, + 0x59, 0x94, 0x00, 0x22, 0x80, 0x00, 0x0d, 0x40, 0x04, 0x00, 0x00, 0x13, + 0x59, 0x94, 0x10, 0x21, 0x59, 0x94, 0x00, 0x25, 0x80, 0x08, 0x04, 0x80, + 0x04, 0x00, 0x10, 0x05, 0x04, 0x00, 0x00, 0x04, 0x48, 0x03, 0x28, 0x21, + 0x80, 0x00, 0x00, 0x40, 0x04, 0x02, 0x10, 0x0b, 0x80, 0x04, 0x08, 0x40, + 0x48, 0x07, 0x28, 0x22, 0x04, 0x02, 0x00, 0x04, 0x59, 0x94, 0x00, 0x23, + 0x08, 0x01, 0xf8, 0x00, 0x04, 0x01, 0xf0, 0x05, 0x82, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x0a, 0x48, 0x03, 0x28, 0x21, 0x04, 0x00, 0x27, 0xf7, + 0x59, 0x94, 0x08, 0x24, 0x59, 0x94, 0x00, 0x25, 0x80, 0x04, 0x04, 0x80, + 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x48, 0x03, 0x28, 0x24, + 0x59, 0x94, 0x00, 0x00, 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x5b, 0x94, + 0x00, 0x10, 0x5b, 0x96, 0x00, 0x10, 0x5b, 0xbc, 0x59, 0x94, 0x00, 0x24, + 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x28, 0x24, 0x42, 0x03, 0xe0, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x2c, 0x04, 0x06, + 0x80, 0x00, 0x00, 0xc2, 0x80, 0x00, 0x08, 0xc4, 0x80, 0x04, 0x0c, 0x00, + 0x59, 0x2c, 0x04, 0x0a, 0x48, 0x06, 0x62, 0x06, 0x82, 0x00, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x5d, 0x45, + 0x8c, 0x00, 0x05, 0x00, 0x04, 0x02, 0x00, 0x2c, 0x59, 0xa8, 0x08, 0x6f, + 0x80, 0x04, 0x08, 0x40, 0x04, 0x02, 0x07, 0xff, 0x8c, 0x00, 0x05, 0x1e, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x5d, 0x20, 0x82, 0x00, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x5d, 0x16, + 0x82, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x20, 0x20, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x5d, 0x13, 0x81, 0x3e, 0x79, 0xc0, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x5d, 0x13, 0x59, 0x2c, 0x0c, 0x0c, 0x80, 0x04, 0x09, 0xc0, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x5d, 0x13, 0x59, 0x30, 0x0a, 0x03, + 0x82, 0x04, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x07, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x5d, 0x13, 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x03, + 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x43, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x00, 0xbe, 0x82, 0x08, 0x0d, 0x40, 0x80, 0x00, 0x34, 0x65, + 0x48, 0x06, 0x60, 0x04, 0x49, 0x7a, 0x60, 0x00, 0x59, 0xbc, 0x00, 0xea, + 0x8c, 0x00, 0x05, 0x16, 0x04, 0x02, 0x07, 0xfe, 0x83, 0x30, 0x04, 0x00, + 0xa0, 0x00, 0x00, 0x00, 0x48, 0x03, 0x78, 0xe1, 0x1c, 0x01, 0xf0, 0x00, + 0x8c, 0x00, 0x05, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x5d, 0x68, + 0x8c, 0x00, 0x05, 0x1e, 0x04, 0x00, 0x00, 0x0e, 0x82, 0x00, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x04, 0x00, 0x00, 0x05, 0x82, 0x04, 0x0d, 0x80, + 0x00, 0x00, 0x00, 0xc0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x5d, 0x6d, + 0x82, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x20, 0x20, 0x82, 0x04, 0x0d, 0x80, + 0x00, 0x00, 0x20, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x5d, 0x34, + 0x59, 0x2c, 0x02, 0x07, 0x80, 0x00, 0x00, 0x40, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x5d, 0x3e, 0x59, 0x2c, 0x18, 0x0d, 0x80, 0x0c, 0x19, 0xc0, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x5d, 0x3e, 0x59, 0x2c, 0x18, 0x0f, + 0x59, 0x30, 0x00, 0x07, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00, 0x11, + 0x48, 0x0e, 0x60, 0x11, 0x48, 0x02, 0x60, 0x07, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x04, 0x4a, 0x02, 0x64, 0x03, 0x00, 0x00, 0x00, 0x42, + 0x42, 0x00, 0x08, 0x00, 0x80, 0x00, 0x20, 0x01, 0x04, 0x01, 0xf0, 0x2a, + 0x5c, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x48, 0x03, 0xc8, 0x57, + 0x48, 0x07, 0xc8, 0x57, 0x04, 0x01, 0xf0, 0x03, 0x42, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x59, 0x32, 0x58, 0x08, 0x83, 0x2c, 0x05, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0d, 0x59, 0x2c, 0x00, 0x00, + 0x48, 0x06, 0x5a, 0x06, 0x48, 0x02, 0x60, 0x08, 0x59, 0x2c, 0x04, 0x0a, + 0x8c, 0x00, 0x05, 0x10, 0x04, 0x02, 0x00, 0x08, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x02, 0x02, 0xe9, 0x41, 0x7a, 0x78, 0x00, 0x59, 0x30, 0x00, 0x08, + 0x80, 0x02, 0x5d, 0x40, 0x04, 0x02, 0x07, 0x8c, 0x1c, 0x01, 0xf0, 0x00, + 0x45, 0x6a, 0x58, 0x00, 0x41, 0x2e, 0xd0, 0x00, 0x81, 0x5e, 0xb8, 0x00, + 0x59, 0xc8, 0x00, 0x00, 0x82, 0x00, 0x05, 0x40, 0x00, 0x00, 0x12, 0x00, + 0x48, 0x03, 0x90, 0x00, 0x04, 0x01, 0xf7, 0xf4, 0x59, 0x84, 0x00, 0x00, + 0x80, 0x00, 0x05, 0x40, 0x04, 0x02, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0x84, 0x00, 0x03, 0x80, 0x00, 0x05, 0x40, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x5d, 0xe5, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x30, 0x00, 0x04, + 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x04, 0x0d, 0x40, + 0x48, 0x06, 0x60, 0x04, 0x59, 0xbc, 0x00, 0xea, 0x8c, 0x00, 0x05, 0x16, + 0x04, 0x02, 0x07, 0xfe, 0x83, 0x30, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x48, 0x03, 0x78, 0xe1, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xbc, 0x00, 0xea, + 0x82, 0x00, 0x15, 0x00, 0xb0, 0x00, 0x00, 0x18, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x64, 0xb0, 0x8c, 0x00, 0x05, 0x10, 0x04, 0x00, 0x00, 0x2a, + 0x59, 0xbc, 0x10, 0xe0, 0x82, 0x08, 0x05, 0x00, 0xff, 0xff, 0xf0, 0x00, + 0x04, 0x02, 0x00, 0x0a, 0x80, 0x08, 0x01, 0x08, 0x82, 0x0a, 0x35, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x48, 0x03, 0xc8, 0x57, 0x12, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x64, 0xb6, 0x84, 0x00, 0x05, 0x10, 0x48, 0x02, 0x60, 0x04, + 0x04, 0x01, 0xf0, 0x16, 0x84, 0x0a, 0x65, 0x3e, 0x59, 0x30, 0x00, 0x04, + 0x8c, 0x00, 0x05, 0x20, 0x04, 0x00, 0x07, 0xfa, 0x82, 0x00, 0x05, 0x00, + 0xff, 0xfe, 0xfe, 0xff, 0x48, 0x02, 0x60, 0x04, 0x8c, 0x08, 0x15, 0x3e, + 0x04, 0x02, 0x00, 0x05, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x13, + 0x04, 0x01, 0xf8, 0x58, 0x04, 0x01, 0xf0, 0x09, 0x59, 0x30, 0x00, 0x04, + 0x8c, 0x00, 0x05, 0x14, 0x04, 0x00, 0x00, 0x03, 0x04, 0x01, 0xff, 0xac, + 0x04, 0x01, 0xf0, 0x2e, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x04, 0x01, 0xf8, 0x4f, 0x59, 0xbc, 0x00, 0xea, 0x82, 0x00, 0x15, 0x00, + 0xb0, 0x00, 0x00, 0x18, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x64, 0xb0, + 0x8c, 0x00, 0x05, 0x10, 0x04, 0x02, 0x07, 0xd8, 0x1c, 0x01, 0xf0, 0x00, + 0x83, 0x64, 0x04, 0x80, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x19, + 0x41, 0x62, 0x60, 0x00, 0x41, 0x58, 0x00, 0x00, 0x59, 0x30, 0x0a, 0x03, + 0x82, 0x04, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x09, + 0x4a, 0x02, 0x62, 0x03, 0x00, 0x00, 0x00, 0x08, 0x81, 0x66, 0xc8, 0x40, + 0x83, 0x32, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x24, 0x81, 0x60, 0x04, 0x80, + 0x04, 0x02, 0x10, 0x09, 0x1c, 0x01, 0xf0, 0x00, 0x83, 0x32, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x24, 0x81, 0x30, 0x0c, 0x80, 0x04, 0x00, 0x17, 0xf1, + 0x42, 0x02, 0x60, 0x00, 0x00, 0x10, 0xd8, 0xd4, 0x04, 0x01, 0xf7, 0xee, + 0x83, 0x7a, 0xc5, 0x40, 0x00, 0x10, 0xd8, 0xd4, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x23, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xa2, 0x60, 0x49, 0x67, 0xc8, 0x57, 0x80, 0x02, 0x65, 0x80, + 0x1c, 0x01, 0xf0, 0x00, 0x83, 0x30, 0x04, 0x80, 0x00, 0x10, 0xd8, 0xd4, + 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x41, 0x58, 0x00, 0x00, + 0x81, 0x30, 0x04, 0x80, 0x04, 0x02, 0x10, 0x0c, 0x45, 0x7a, 0x60, 0x00, + 0x4a, 0x02, 0x62, 0x02, 0x00, 0x00, 0xff, 0xff, 0x04, 0x01, 0x10, 0x00, + 0x83, 0x30, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0x48, 0x03, 0xc8, 0x40, + 0x4a, 0x03, 0xc8, 0x42, 0x00, 0x00, 0x00, 0x21, 0x81, 0x66, 0xc8, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x41, 0x54, 0x00, 0x00, 0x81, 0x30, 0x04, 0x80, + 0x02, 0x02, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x45, 0x7a, 0x60, 0x00, + 0x4a, 0x02, 0x62, 0x02, 0x00, 0x00, 0xff, 0xff, 0x04, 0x01, 0x10, 0x00, + 0x83, 0x30, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0x48, 0x03, 0xc8, 0x40, + 0x4a, 0x03, 0xc8, 0x42, 0x00, 0x00, 0x00, 0x21, 0x59, 0xa8, 0x00, 0x63, + 0x49, 0x33, 0x50, 0x62, 0x80, 0x00, 0x00, 0x00, 0x48, 0x03, 0x50, 0x63, + 0x1c, 0x01, 0xf0, 0x00, 0x4d, 0x34, 0x00, 0x00, 0x59, 0x32, 0x68, 0x09, + 0x59, 0x30, 0x04, 0x06, 0x82, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x1f, + 0x0c, 0x01, 0xf8, 0x03, 0x5c, 0x02, 0x68, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x71, 0xfe, 0x00, 0x10, 0x72, 0x11, 0x00, 0x10, 0x72, 0x2b, + 0x00, 0x02, 0x08, 0x07, 0x00, 0x10, 0x91, 0x49, 0x00, 0x10, 0x91, 0x64, + 0x00, 0x02, 0x08, 0x7c, 0x00, 0x10, 0x71, 0xfe, 0x00, 0x10, 0x72, 0x11, + 0x00, 0x10, 0x60, 0xed, 0x00, 0x10, 0x72, 0x44, 0x00, 0x10, 0x71, 0xfe, + 0x00, 0x10, 0x71, 0xfe, 0x00, 0x10, 0x71, 0xfe, 0x00, 0x10, 0x71, 0xfe, + 0x00, 0x10, 0x71, 0xfe, 0x00, 0x10, 0x8d, 0xf4, 0x00, 0x10, 0x9e, 0xa1, + 0x00, 0x10, 0x71, 0xfe, 0x00, 0x10, 0x71, 0xfe, 0x00, 0x10, 0x71, 0xfe, + 0x00, 0x10, 0x71, 0xfe, 0x00, 0x10, 0x71, 0xfe, 0x00, 0x10, 0x71, 0xfe, + 0x00, 0x10, 0x71, 0xfe, 0x00, 0x10, 0x71, 0xfe, 0x00, 0x10, 0x71, 0xfe, + 0x00, 0x10, 0x71, 0xfe, 0x00, 0x10, 0x71, 0xfe, 0x00, 0x10, 0x71, 0xfe, + 0x00, 0x10, 0x71, 0xfe, 0x00, 0x10, 0x71, 0xfe, 0x59, 0x30, 0x02, 0x03, + 0x82, 0x00, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x72, 0x42, + 0x00, 0x10, 0x7d, 0x79, 0x00, 0x02, 0x08, 0x1b, 0x00, 0x10, 0x7f, 0x11, + 0x00, 0x10, 0x7f, 0xab, 0x00, 0x10, 0x72, 0x42, 0x00, 0x10, 0x72, 0x42, + 0x00, 0x10, 0x72, 0x42, 0x00, 0x10, 0x7d, 0x5e, 0x00, 0x10, 0x72, 0x42, + 0x00, 0x10, 0x72, 0x42, 0x00, 0x10, 0x72, 0x42, 0x00, 0x10, 0x72, 0x42, + 0x00, 0x10, 0x81, 0x81, 0x83, 0x38, 0x04, 0x80, 0x00, 0x00, 0x00, 0x58, + 0x04, 0x02, 0x10, 0x07, 0x83, 0x38, 0x04, 0x80, 0x00, 0x00, 0x00, 0x40, + 0x04, 0x00, 0x10, 0x04, 0x4d, 0x2c, 0x00, 0x00, 0x0c, 0x01, 0xf8, 0x03, + 0x5c, 0x02, 0x58, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x7e, 0x03, + 0x00, 0x10, 0x7e, 0x03, 0x00, 0x10, 0x7e, 0x03, 0x00, 0x10, 0x7e, 0x03, + 0x00, 0x10, 0x7e, 0x03, 0x00, 0x10, 0x7e, 0x05, 0x00, 0x10, 0x7e, 0xa7, + 0x00, 0x10, 0x7e, 0x03, 0x00, 0x10, 0x7e, 0x03, 0x00, 0x10, 0x7e, 0x03, + 0x00, 0x10, 0x7e, 0x03, 0x00, 0x10, 0x7e, 0x03, 0x00, 0x10, 0x7e, 0x03, + 0x00, 0x10, 0x7e, 0x03, 0x00, 0x10, 0x7e, 0x03, 0x00, 0x10, 0x7e, 0x03, + 0x00, 0x10, 0x7e, 0x03, 0x00, 0x10, 0x7e, 0x03, 0x00, 0x10, 0x7e, 0x03, + 0x00, 0x10, 0x7e, 0xab, 0x00, 0x02, 0x08, 0x3d, 0x00, 0x10, 0x7e, 0x03, + 0x00, 0x10, 0x7e, 0xaa, 0x00, 0x10, 0x7e, 0xac, 0x59, 0x32, 0x58, 0x08, + 0x59, 0x30, 0x08, 0x11, 0x59, 0x30, 0x14, 0x02, 0x59, 0x34, 0x02, 0x00, + 0x8c, 0x00, 0x05, 0x0e, 0x04, 0x02, 0x00, 0x1c, 0x04, 0x01, 0xf8, 0x26, + 0x04, 0x00, 0x00, 0x05, 0x4a, 0x02, 0x5a, 0x04, 0x00, 0x00, 0x01, 0x03, + 0x49, 0x7a, 0x58, 0x09, 0x04, 0x01, 0xf0, 0x09, 0x4a, 0x02, 0x5a, 0x04, + 0x00, 0x00, 0x01, 0x03, 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x7a, 0x58, 0x09, 0x80, 0x04, 0x09, 0xc0, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x10, 0x7f, 0x76, 0x48, 0x06, 0x58, 0x07, 0x48, 0x0a, 0x5c, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x02, 0x02, 0xe9, 0x59, 0x34, 0x00, 0x0f, + 0x59, 0x34, 0x14, 0x0b, 0x80, 0x08, 0x10, 0x40, 0x04, 0x00, 0x10, 0x02, + 0x48, 0x0a, 0x6c, 0x0b, 0x80, 0x00, 0x05, 0x40, 0x02, 0x02, 0x08, 0x00, + 0x00, 0x02, 0x02, 0x68, 0x04, 0x01, 0xf7, 0x5e, 0x59, 0x2c, 0x02, 0x0a, + 0x8c, 0x00, 0x05, 0x02, 0x04, 0x00, 0x07, 0xe9, 0x80, 0x04, 0x09, 0xc0, + 0x04, 0x00, 0x07, 0xe7, 0x59, 0x2c, 0x02, 0x08, 0x8c, 0x00, 0x05, 0x0e, + 0x04, 0x02, 0x07, 0xe4, 0x49, 0x33, 0xc8, 0x57, 0x02, 0x01, 0xf0, 0x00, + 0x00, 0x10, 0x8a, 0x2e, 0x59, 0x2c, 0x02, 0x0a, 0x8c, 0x00, 0x05, 0x00, + 0x04, 0x00, 0x00, 0x10, 0x59, 0x30, 0x00, 0x15, 0x59, 0x2c, 0x38, 0x0f, + 0x80, 0x1c, 0x3c, 0x80, 0x04, 0x00, 0x00, 0x0c, 0x4a, 0x02, 0x5a, 0x06, + 0x00, 0x00, 0x00, 0x15, 0x8c, 0x1c, 0x3d, 0x3e, 0x04, 0x00, 0x00, 0x05, + 0x4a, 0x02, 0x5a, 0x06, 0x00, 0x00, 0x00, 0x07, 0x80, 0x1c, 0x38, 0x80, + 0x80, 0x1c, 0x38, 0x00, 0x48, 0x1f, 0xc8, 0x57, 0x82, 0x1c, 0x0d, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x30, 0x02, 0x03, + 0x82, 0x00, 0x34, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf0, 0x01, 0x00, 0x10, 0x91, 0x83, + 0x00, 0x02, 0x08, 0x90, 0x00, 0x10, 0x98, 0x3c, 0x00, 0x10, 0x98, 0x4a, + 0x00, 0x02, 0x08, 0xac, 0x00, 0x10, 0x91, 0x83, 0x00, 0x10, 0x99, 0x37, + 0x00, 0x02, 0x08, 0xcb, 0x00, 0x10, 0x91, 0x83, 0x00, 0x10, 0x91, 0x83, + 0x00, 0x10, 0x91, 0x83, 0x00, 0x10, 0x91, 0x83, 0x00, 0x10, 0x91, 0x83, + 0x00, 0x10, 0x91, 0x83, 0x83, 0x38, 0x05, 0x80, 0x00, 0x00, 0x00, 0x13, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x97, 0xc4, 0x59, 0x30, 0x04, 0x03, + 0x82, 0x02, 0x74, 0x80, 0x00, 0x00, 0x00, 0x44, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x82, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x40, + 0x02, 0x00, 0x18, 0x00, 0x00, 0x10, 0x04, 0xef, 0x0c, 0x01, 0xf0, 0x01, + 0x00, 0x10, 0x98, 0x20, 0x00, 0x02, 0x08, 0xa2, 0x00, 0x10, 0x98, 0x22, + 0x00, 0x10, 0x98, 0x34, 0x59, 0x32, 0x58, 0x08, 0x83, 0x2c, 0x05, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0x59, 0x2c, 0x0c, 0x0a, + 0x8c, 0x04, 0x0d, 0x1a, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x98, 0x2f, + 0x04, 0x01, 0xfe, 0x8e, 0x04, 0x01, 0xf7, 0x10, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x48, 0x04, 0x00, 0x00, 0x07, 0x83, 0x38, 0x05, 0x80, + 0x00, 0x00, 0x00, 0x53, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x98, 0xd9, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xef, 0x59, 0x30, 0x00, 0x1f, + 0x59, 0x30, 0x10, 0x11, 0x59, 0x30, 0x08, 0x09, 0x58, 0x04, 0x0a, 0x00, + 0x8c, 0x04, 0x0d, 0x0e, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x98, 0xb5, + 0x80, 0x08, 0x11, 0xc0, 0x02, 0x02, 0x00, 0x00, 0x00, 0x10, 0x98, 0xc2, + 0x59, 0x30, 0x00, 0x1f, 0x80, 0x00, 0x05, 0x40, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x10, 0x98, 0xd0, 0x59, 0x32, 0x58, 0x08, 0x59, 0x2c, 0x04, 0x0a, + 0x8c, 0x00, 0x05, 0x1e, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x98, 0xab, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x41, 0x04, 0x01, 0xf0, 0x01, + 0x83, 0x38, 0x04, 0x80, 0x00, 0x00, 0x00, 0x54, 0x02, 0x02, 0x18, 0x00, + 0x00, 0x10, 0x04, 0xef, 0x83, 0x38, 0x04, 0x80, 0x00, 0x00, 0x00, 0x40, + 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x98, 0xf6, 0x0c, 0x01, 0xf0, 0x01, + 0x00, 0x10, 0x99, 0x02, 0x00, 0x02, 0x08, 0xe8, 0x00, 0x10, 0x99, 0x0e, + 0x00, 0x10, 0x99, 0x15, 0x00, 0x10, 0x99, 0x02, 0x00, 0x10, 0x99, 0x02, + 0x00, 0x10, 0x99, 0x02, 0x00, 0x10, 0x99, 0x02, 0x00, 0x10, 0x99, 0x04, + 0x00, 0x10, 0x99, 0x09, 0x00, 0x10, 0x99, 0x09, 0x00, 0x10, 0x99, 0x02, + 0x00, 0x10, 0x99, 0x02, 0x00, 0x10, 0x99, 0x02, 0x00, 0x10, 0x99, 0x02, + 0x00, 0x10, 0x99, 0x09, 0x00, 0x10, 0x99, 0x02, 0x00, 0x10, 0x99, 0x09, + 0x00, 0x10, 0x99, 0x02, 0x00, 0x10, 0x99, 0x04, 0x4a, 0x02, 0x62, 0x03, + 0x00, 0x00, 0x00, 0x01, 0x49, 0x3a, 0x64, 0x03, 0x42, 0x00, 0x08, 0x00, + 0x80, 0x00, 0x20, 0x42, 0x04, 0x01, 0xf6, 0x6f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 0xf0, 0x7d, 0x50, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xca, 0x00, + 0x00, 0x00, 0x0a, 0xa3, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xd4, 0xd0, + 0x42, 0x00, 0x10, 0x00, 0x00, 0x10, 0xd4, 0xc1, 0x44, 0x00, 0x10, 0x00, + 0x42, 0x01, 0x38, 0x00, 0x00, 0x10, 0xd8, 0xd0, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x10, 0xd4, 0xc0, 0x44, 0x9c, 0x00, 0x00, 0x40, 0x9d, 0x40, 0x00, + 0x40, 0x9d, 0x68, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x00, 0xd0, 0x00, + 0x00, 0x00, 0x00, 0x0d, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x44, 0x00, 0xd0, 0x00, 0x04, 0x01, 0xf7, 0xfb, 0x42, 0x00, 0xd0, 0x00, + 0x00, 0x00, 0x00, 0x0d, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x44, 0x00, 0xd0, 0x00, 0x04, 0x01, 0xf7, 0xfb, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x37, 0xc8, 0x57, 0x51, 0x34, 0xd2, 0x00, 0x84, 0x68, 0xd5, 0x02, + 0x44, 0x6a, 0x6a, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x80, 0x9d, 0x38, 0x40, + 0x48, 0x81, 0x38, 0x00, 0x49, 0x37, 0xc8, 0x57, 0x42, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x71, 0xd0, + 0x40, 0xc6, 0x60, 0x00, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x00, 0x12, + 0x49, 0x35, 0x88, 0x09, 0x48, 0x81, 0x8c, 0x06, 0x41, 0x7a, 0x78, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x59, 0x59, 0xa8, 0xd0, 0x1a, + 0x80, 0x68, 0xd0, 0x00, 0x48, 0x6b, 0x50, 0x1a, 0x59, 0x9c, 0xd0, 0x19, + 0x41, 0x7a, 0x70, 0x00, 0x8c, 0x68, 0xd5, 0x0e, 0x04, 0x02, 0x00, 0x03, + 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x71, 0xf9, 0x41, 0x79, 0x00, 0x00, 0x40, 0x81, 0x88, 0x00, + 0x58, 0x9d, 0x00, 0x00, 0x80, 0x9d, 0x38, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x82, 0x9d, 0x3c, 0x80, 0x00, 0x00, 0x00, 0x04, 0x48, 0x81, 0x38, 0x00, + 0x48, 0x85, 0x38, 0x01, 0x48, 0x89, 0x38, 0x02, 0x48, 0x8d, 0x38, 0x03, + 0x41, 0x35, 0x08, 0x00, 0x41, 0x45, 0x10, 0x00, 0x41, 0x2d, 0x18, 0x00, + 0x49, 0x43, 0xc8, 0x57, 0x49, 0x3f, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x6d, 0x40, 0xc5, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xcf, 0x72, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xcf, 0x62, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xd0, 0x11, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xd1, 0x5d, 0x80, 0x81, 0x01, 0xc0, 0x04, 0x02, 0x00, 0x3a, + 0x41, 0x7a, 0x88, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x43, 0x3e, + 0x40, 0xc6, 0x68, 0x00, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x00, 0x16, + 0x8d, 0x3e, 0x7d, 0x06, 0x04, 0x00, 0x00, 0x04, 0x50, 0xc4, 0xd2, 0x00, + 0x8c, 0x68, 0xd5, 0x0e, 0x04, 0x02, 0x00, 0x16, 0x8d, 0x3e, 0x7d, 0x18, + 0x04, 0x00, 0x00, 0x29, 0x59, 0x35, 0x00, 0x0f, 0x04, 0x01, 0xf0, 0x06, + 0x49, 0x41, 0x02, 0x06, 0x40, 0x82, 0x58, 0x00, 0x50, 0x81, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4a, 0x76, 0x80, 0x81, 0x01, 0xc0, + 0x04, 0x02, 0x07, 0xfa, 0x49, 0x7a, 0x68, 0x0f, 0x49, 0x7a, 0x68, 0x10, + 0x49, 0x37, 0xc8, 0x57, 0x46, 0x02, 0x6c, 0x00, 0x00, 0x00, 0x07, 0x07, + 0x81, 0x46, 0x88, 0x00, 0x83, 0x45, 0x74, 0x80, 0x00, 0x00, 0x07, 0xef, + 0x04, 0x00, 0x07, 0xe3, 0x04, 0x00, 0x17, 0xe2, 0x8d, 0x3e, 0x7d, 0x02, + 0x04, 0x00, 0x00, 0x1b, 0x49, 0x7b, 0x50, 0x1c, 0x42, 0x02, 0x88, 0x00, + 0x00, 0x00, 0x07, 0xf0, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x43, 0x3e, + 0x40, 0xc6, 0x68, 0x00, 0x48, 0xc7, 0xc8, 0x57, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x00, 0x05, 0x46, 0x01, 0x8c, 0x00, 0x00, 0x00, 0x07, 0x07, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x7c, 0x81, 0x46, 0x88, 0x00, + 0x83, 0x45, 0x74, 0x80, 0x00, 0x00, 0x07, 0xff, 0x04, 0x00, 0x07, 0xf3, + 0x04, 0x00, 0x17, 0xf2, 0x04, 0x01, 0xf0, 0x08, 0x49, 0x37, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3f, 0x7c, 0x04, 0x01, 0xf7, 0xe3, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x5f, 0x04, 0x01, 0xf7, 0xc5, + 0x40, 0x86, 0x68, 0x00, 0x40, 0x8a, 0x88, 0x00, 0x40, 0x8e, 0x58, 0x00, + 0x58, 0x9d, 0x18, 0x03, 0x58, 0x9d, 0x10, 0x02, 0x58, 0x9d, 0x08, 0x01, + 0x58, 0x9d, 0x00, 0x00, 0x82, 0x9d, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x9d, 0x3c, 0x80, 0x00, 0x00, 0x00, 0x06, + 0x48, 0x81, 0x38, 0x00, 0x48, 0x85, 0x38, 0x01, 0x48, 0x89, 0x38, 0x02, + 0x48, 0x8d, 0x38, 0x03, 0x48, 0x91, 0x38, 0x04, 0x48, 0x95, 0x38, 0x05, + 0x41, 0x35, 0x28, 0x00, 0x41, 0x41, 0x20, 0x00, 0x41, 0x45, 0x18, 0x00, + 0x41, 0x2d, 0x10, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x49, 0x3f, 0xc8, 0x57, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x6d, 0x40, 0xc5, 0x08, 0x00, + 0x59, 0x32, 0x68, 0x09, 0x81, 0x36, 0x69, 0xc0, 0x04, 0x00, 0x00, 0x1f, + 0x59, 0x34, 0xd4, 0x03, 0x40, 0x6a, 0x88, 0x00, 0x42, 0x02, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x29, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xce, 0x09, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xce, 0xf7, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xcf, 0x9c, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xd2, 0x8a, + 0x49, 0x37, 0xc8, 0x57, 0x8d, 0x3e, 0x7d, 0x18, 0x04, 0x00, 0x00, 0x15, + 0x59, 0x35, 0x00, 0x0f, 0x80, 0x81, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x0a, + 0x49, 0x41, 0x02, 0x06, 0x40, 0x82, 0x58, 0x00, 0x50, 0x81, 0x00, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4a, 0x76, 0x80, 0x81, 0x01, 0xc0, + 0x04, 0x02, 0x07, 0xfa, 0x48, 0x82, 0x68, 0x0f, 0x48, 0x82, 0x68, 0x10, + 0x49, 0x37, 0xc8, 0x57, 0x46, 0x02, 0x6c, 0x00, 0x00, 0x00, 0x07, 0x07, + 0x80, 0x85, 0x09, 0xc0, 0x04, 0x00, 0x00, 0x07, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x5f, 0x04, 0x01, 0xf0, 0x04, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x3f, 0x7c, 0x04, 0x01, 0xf7, 0xf9, 0x40, 0x8a, 0x58, 0x00, + 0x40, 0x8e, 0x88, 0x00, 0x40, 0x92, 0x80, 0x00, 0x40, 0x96, 0x68, 0x00, + 0x58, 0x9d, 0x28, 0x05, 0x58, 0x9d, 0x20, 0x04, 0x58, 0x9d, 0x18, 0x03, + 0x58, 0x9d, 0x10, 0x02, 0x58, 0x9d, 0x08, 0x01, 0x58, 0x9d, 0x00, 0x00, + 0x82, 0x9d, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x06, 0x1c, 0x01, 0xf0, 0x00, + 0x80, 0x9d, 0x38, 0x40, 0x48, 0x81, 0x38, 0x00, 0x49, 0x37, 0xc8, 0x57, + 0x42, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x71, 0xd0, 0x40, 0xc6, 0x60, 0x00, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x00, 0x18, 0x49, 0x35, 0x88, 0x09, 0x59, 0x34, 0xd4, 0x03, + 0x82, 0x69, 0x74, 0x80, 0x00, 0x00, 0x07, 0xfe, 0x04, 0x00, 0x00, 0x03, + 0x41, 0x7a, 0x78, 0x00, 0x04, 0x01, 0xff, 0xa9, 0x48, 0x82, 0x64, 0x06, + 0x41, 0x7a, 0x78, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x42, 0x59, + 0x42, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x42, 0x67, 0x59, 0xa8, 0xd0, 0x1a, 0x80, 0x68, 0xd0, 0x00, + 0x48, 0x6b, 0x50, 0x1a, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x71, 0xf9, 0x41, 0x79, 0x00, 0x00, + 0x40, 0x81, 0x88, 0x00, 0x58, 0x9d, 0x00, 0x00, 0x80, 0x9d, 0x38, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x9d, 0x3c, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x48, 0x81, 0x38, 0x00, 0x48, 0x85, 0x38, 0x01, 0x4a, 0x03, 0xc8, 0x56, + 0x12, 0x34, 0x56, 0x78, 0x42, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x48, 0x83, 0x50, 0x1b, 0x42, 0x02, 0x88, 0x00, 0x00, 0x00, 0x07, 0xfe, + 0x42, 0x00, 0xd0, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x42, 0xa1, 0x40, 0xc6, 0x68, 0x00, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x00, 0x0c, 0x04, 0x01, 0xff, 0x00, 0x04, 0x01, 0xff, 0xc8, + 0x40, 0xc5, 0x08, 0x00, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x02, 0x00, 0x07, + 0x59, 0xa8, 0xd0, 0x23, 0x84, 0x68, 0xd5, 0x4e, 0x48, 0x6b, 0x50, 0x23, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8b, 0x45, 0x40, 0x85, 0x00, 0x00, + 0x40, 0x81, 0x88, 0x00, 0x58, 0x9d, 0x08, 0x01, 0x58, 0x9d, 0x00, 0x00, + 0x82, 0x9d, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, + 0x82, 0x9d, 0x3c, 0x80, 0x00, 0x00, 0x00, 0x02, 0x48, 0x81, 0x38, 0x00, + 0x48, 0x85, 0x38, 0x01, 0x40, 0x69, 0x00, 0x00, 0x40, 0x6d, 0x08, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x3e, 0x59, 0xbc, 0x00, 0x2f, + 0x81, 0x31, 0x74, 0x80, 0x04, 0x00, 0x00, 0x18, 0x59, 0xbc, 0xd0, 0x2e, + 0x41, 0x30, 0x00, 0x00, 0x80, 0x69, 0x74, 0x80, 0x04, 0x00, 0x00, 0x1e, + 0x51, 0x30, 0xd8, 0x00, 0x80, 0x6c, 0xd9, 0xc0, 0x04, 0x02, 0x00, 0x09, + 0x59, 0x31, 0x70, 0x01, 0x48, 0xb9, 0x08, 0x01, 0x59, 0x30, 0xd0, 0x01, + 0x80, 0x68, 0xd1, 0xc0, 0x04, 0x02, 0x00, 0x02, 0x48, 0x86, 0x68, 0x0c, + 0x48, 0x6e, 0x60, 0x01, 0x04, 0x01, 0xf0, 0x36, 0x59, 0x30, 0xd8, 0x01, + 0x80, 0x6c, 0xd9, 0xc0, 0x04, 0x02, 0x00, 0x1f, 0x51, 0x31, 0x70, 0x00, + 0x44, 0xb9, 0x00, 0x00, 0x44, 0x6e, 0x60, 0x00, 0x48, 0x6e, 0x68, 0x0c, + 0x04, 0x01, 0xf0, 0x2e, 0x59, 0x30, 0xd8, 0x01, 0x80, 0x6c, 0xd9, 0xc0, + 0x04, 0x02, 0x00, 0x0f, 0x51, 0x30, 0xd0, 0x00, 0x80, 0x68, 0xd1, 0xc0, + 0x04, 0x02, 0x00, 0x20, 0x48, 0x6f, 0x78, 0x2f, 0x48, 0x6f, 0x78, 0x2e, + 0x48, 0x6e, 0x68, 0x0c, 0x04, 0x01, 0xf0, 0x24, 0x59, 0x30, 0xd0, 0x01, + 0x80, 0x68, 0xd1, 0xc0, 0x04, 0x02, 0x00, 0x13, 0x48, 0x83, 0x78, 0x2e, + 0x44, 0x69, 0x00, 0x00, 0x48, 0x6a, 0x68, 0x0c, 0x04, 0x01, 0xf0, 0x1d, + 0x51, 0x30, 0xd0, 0x00, 0x80, 0x68, 0xd1, 0xc0, 0x04, 0x02, 0x00, 0x16, + 0x48, 0x6f, 0x78, 0x2f, 0x59, 0x31, 0x70, 0x01, 0x48, 0xbb, 0x78, 0x2e, + 0x48, 0x6a, 0x60, 0x01, 0x04, 0x01, 0xf0, 0x15, 0x51, 0x31, 0x70, 0x00, + 0x44, 0xb8, 0xd8, 0x00, 0x44, 0x6d, 0x00, 0x00, 0x45, 0x7a, 0x60, 0x00, + 0x49, 0x7a, 0x60, 0x01, 0x04, 0x01, 0xf0, 0x0f, 0x59, 0x31, 0x70, 0x01, + 0x48, 0xbb, 0x78, 0x2e, 0x59, 0x31, 0x70, 0x01, 0x44, 0xb9, 0x00, 0x00, + 0x49, 0x7a, 0x60, 0x01, 0x04, 0x01, 0xf0, 0x09, 0x51, 0x31, 0x70, 0x00, + 0x48, 0xbb, 0x78, 0x2f, 0x44, 0x6e, 0x60, 0x00, 0x04, 0x01, 0xf7, 0xd6, + 0x51, 0x31, 0x70, 0x00, 0x44, 0xb8, 0xd8, 0x00, 0x48, 0x6f, 0x78, 0x2f, + 0x04, 0x01, 0xf7, 0xf0, 0x58, 0x9d, 0x08, 0x01, 0x58, 0x9d, 0x00, 0x00, + 0x82, 0x9d, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, + 0x82, 0x9d, 0x3c, 0x80, 0x00, 0x00, 0x00, 0x05, 0x48, 0x81, 0x38, 0x00, + 0x48, 0x85, 0x38, 0x01, 0x48, 0x89, 0x38, 0x02, 0x48, 0x8d, 0x38, 0x03, + 0x48, 0x91, 0x38, 0x04, 0x49, 0x33, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x6d, 0x40, 0xc5, 0x20, 0x00, 0x41, 0x35, 0x18, 0x00, + 0x41, 0x19, 0x10, 0x00, 0x41, 0x91, 0x08, 0x00, 0x59, 0x32, 0x68, 0x09, + 0x59, 0xbc, 0xd8, 0x2f, 0x40, 0x6c, 0xe0, 0x00, 0x80, 0x6c, 0xd9, 0xc0, + 0x04, 0x00, 0x00, 0x0c, 0x41, 0x30, 0x00, 0x00, 0x80, 0x6d, 0x74, 0x80, + 0x04, 0x00, 0x00, 0x27, 0x58, 0x6c, 0xd0, 0x09, 0x41, 0x34, 0x00, 0x00, + 0x80, 0x69, 0x74, 0x80, 0x04, 0x00, 0x00, 0x1c, 0x40, 0x6c, 0xe0, 0x00, + 0x50, 0x6c, 0xd8, 0x00, 0x80, 0x6c, 0xd9, 0xc0, 0x04, 0x02, 0x07, 0xf6, + 0x83, 0xbc, 0xd4, 0x00, 0x00, 0x00, 0x00, 0x32, 0x40, 0x6b, 0x20, 0x00, + 0x41, 0x7a, 0x30, 0x00, 0x59, 0x90, 0xd0, 0x04, 0x41, 0x30, 0x00, 0x00, + 0x80, 0x69, 0x74, 0x80, 0x04, 0x00, 0x00, 0x0b, 0x81, 0x1a, 0x30, 0x00, + 0x83, 0x19, 0x74, 0x80, 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x00, 0x1e, + 0x83, 0x93, 0x24, 0x00, 0x00, 0x00, 0x00, 0x10, 0x59, 0x90, 0xd0, 0x04, + 0x41, 0x30, 0x00, 0x00, 0x80, 0x69, 0x74, 0x80, 0x04, 0x02, 0x07, 0xf7, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x65, 0xfd, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x31, 0x04, 0x01, 0xf0, 0x0b, 0x40, 0x6d, 0x00, 0x00, + 0x58, 0x6c, 0xd8, 0x01, 0x80, 0x6c, 0xd9, 0xc0, 0x04, 0x00, 0x07, 0xd9, + 0x41, 0x30, 0x00, 0x00, 0x80, 0x6d, 0x74, 0x80, 0x04, 0x02, 0x07, 0xfa, + 0x40, 0x70, 0xd0, 0x00, 0x40, 0x80, 0xd8, 0x00, 0x04, 0x01, 0xff, 0x6e, + 0x40, 0x87, 0x20, 0x00, 0x40, 0x8a, 0x30, 0x00, 0x40, 0x8e, 0x68, 0x00, + 0x80, 0x91, 0x70, 0x40, 0x04, 0x00, 0x00, 0x0b, 0x42, 0x00, 0xd0, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x0e, 0x40, 0x87, 0x20, 0x00, + 0x40, 0x8a, 0x30, 0x00, 0x40, 0x8e, 0x68, 0x00, 0x80, 0x91, 0x70, 0x40, + 0x04, 0x00, 0x00, 0x06, 0x41, 0x78, 0xd0, 0x00, 0x04, 0x01, 0xf0, 0x07, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x5f, 0x04, 0x01, 0xf7, 0xf4, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x5f, 0x04, 0x01, 0xf7, 0xf9, + 0x40, 0x69, 0x88, 0x00, 0x58, 0x9d, 0x20, 0x04, 0x58, 0x9d, 0x18, 0x03, + 0x58, 0x9d, 0x10, 0x02, 0x58, 0x9d, 0x08, 0x01, 0x58, 0x9d, 0x00, 0x00, + 0x82, 0x9d, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x05, 0x1c, 0x01, 0xf0, 0x00, + 0x82, 0x9d, 0x3c, 0x80, 0x00, 0x00, 0x00, 0x02, 0x48, 0x81, 0x38, 0x00, + 0x48, 0x85, 0x38, 0x01, 0x40, 0x69, 0x00, 0x00, 0x51, 0x31, 0x08, 0x00, + 0x45, 0x7a, 0x60, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x3e, + 0x80, 0x81, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x08, 0x44, 0x85, 0x00, 0x00, + 0x59, 0x8c, 0xd0, 0x0a, 0x41, 0x30, 0x00, 0x00, 0x80, 0x69, 0x74, 0x80, + 0x04, 0x02, 0x00, 0x0b, 0x48, 0x83, 0x18, 0x0a, 0x04, 0x01, 0xf0, 0x09, + 0x59, 0x8c, 0xd0, 0x0a, 0x41, 0x30, 0x00, 0x00, 0x80, 0x69, 0x74, 0x80, + 0x04, 0x00, 0x00, 0x03, 0x48, 0x87, 0x18, 0x0b, 0x04, 0x01, 0xf0, 0x03, + 0x48, 0x83, 0x18, 0x0a, 0x48, 0x83, 0x18, 0x0b, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x54, 0x58, 0x9d, 0x08, 0x01, 0x58, 0x9d, 0x00, 0x00, + 0x82, 0x9d, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x81, 0x32, 0x61, 0xc0, 0x04, 0x00, 0x00, 0x0d, + 0x59, 0x8c, 0xd8, 0x0b, 0x41, 0x78, 0xd0, 0x00, 0x04, 0x01, 0xf0, 0x06, + 0x41, 0x30, 0x00, 0x00, 0x80, 0x6d, 0x74, 0x80, 0x04, 0x00, 0x00, 0x0d, + 0x40, 0x6c, 0xd0, 0x00, 0x50, 0x6c, 0xd8, 0x00, 0x80, 0x6c, 0xd9, 0xc0, + 0x04, 0x02, 0x07, 0xfa, 0x41, 0x78, 0xd0, 0x00, 0x04, 0x01, 0xf0, 0x13, + 0x41, 0x78, 0xd0, 0x00, 0x40, 0x68, 0xd8, 0x00, 0x40, 0x68, 0xe0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xec, 0x04, 0x01, 0xf0, 0x0d, + 0x04, 0x01, 0xff, 0xca, 0x59, 0x8c, 0xd0, 0x0d, 0x41, 0x30, 0x00, 0x00, + 0x80, 0x69, 0x74, 0x80, 0x04, 0x00, 0x00, 0x05, 0x49, 0x7a, 0x60, 0x07, + 0x42, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x04, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x69, 0x04, 0x04, 0x01, 0xf7, 0xfa, + 0x40, 0x69, 0x88, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x9d, 0x3c, 0x80, + 0x00, 0x00, 0x00, 0x02, 0x48, 0x81, 0x38, 0x00, 0x48, 0x85, 0x38, 0x01, + 0x40, 0x69, 0x00, 0x00, 0x51, 0x31, 0x08, 0x00, 0x45, 0x7a, 0x60, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x3e, 0x80, 0x81, 0x01, 0xc0, + 0x04, 0x00, 0x00, 0x08, 0x44, 0x85, 0x00, 0x00, 0x59, 0x8c, 0xd0, 0x08, + 0x41, 0x30, 0x00, 0x00, 0x80, 0x69, 0x74, 0x80, 0x04, 0x02, 0x00, 0x0b, + 0x48, 0x83, 0x18, 0x08, 0x04, 0x01, 0xf0, 0x09, 0x59, 0x8c, 0xd0, 0x08, + 0x41, 0x30, 0x00, 0x00, 0x80, 0x69, 0x74, 0x80, 0x04, 0x00, 0x00, 0x03, + 0x48, 0x87, 0x18, 0x09, 0x04, 0x01, 0xf0, 0x03, 0x48, 0x83, 0x18, 0x08, + 0x48, 0x83, 0x18, 0x09, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x54, + 0x58, 0x9d, 0x08, 0x01, 0x58, 0x9d, 0x00, 0x00, 0x82, 0x9d, 0x3c, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x33, 0xc8, 0x57, + 0x81, 0x32, 0x61, 0xc0, 0x04, 0x00, 0x00, 0x1b, 0x59, 0x8c, 0xd8, 0x09, + 0x41, 0x78, 0xd0, 0x00, 0x04, 0x01, 0xf0, 0x06, 0x41, 0x30, 0x00, 0x00, + 0x80, 0x6d, 0x74, 0x80, 0x04, 0x00, 0x00, 0x07, 0x40, 0x6c, 0xd0, 0x00, + 0x50, 0x6c, 0xd8, 0x00, 0x80, 0x6c, 0xd9, 0xc0, 0x04, 0x02, 0x07, 0xfa, + 0x41, 0x78, 0xd0, 0x00, 0x04, 0x01, 0xf0, 0x18, 0x04, 0x01, 0xff, 0xd0, + 0x59, 0x8c, 0xd0, 0x0d, 0x41, 0x30, 0x00, 0x00, 0x80, 0x69, 0x74, 0x80, + 0x04, 0x00, 0x00, 0x10, 0x59, 0x30, 0xd4, 0x03, 0x82, 0x69, 0x74, 0x80, + 0x00, 0x00, 0x00, 0x42, 0x04, 0x00, 0x00, 0x04, 0x42, 0x00, 0xd0, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x0c, 0x49, 0x7a, 0x60, 0x07, + 0x04, 0x01, 0xf7, 0xfc, 0x41, 0x78, 0xd0, 0x00, 0x40, 0x68, 0xd8, 0x00, + 0x40, 0x68, 0xe0, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xec, + 0x04, 0x01, 0xf0, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x69, 0x04, + 0x04, 0x01, 0xf7, 0xef, 0x40, 0x69, 0x88, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x82, 0x9d, 0x3c, 0x80, 0x00, 0x00, 0x00, 0x02, 0x48, 0x81, 0x38, 0x00, + 0x48, 0x85, 0x38, 0x01, 0x40, 0x69, 0x00, 0x00, 0x51, 0x31, 0x08, 0x00, + 0x45, 0x7a, 0x60, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x3e, + 0x80, 0x81, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x08, 0x44, 0x85, 0x00, 0x00, + 0x59, 0x8c, 0xd0, 0x04, 0x41, 0x30, 0x00, 0x00, 0x80, 0x69, 0x74, 0x80, + 0x04, 0x02, 0x00, 0x0b, 0x48, 0x83, 0x18, 0x04, 0x04, 0x01, 0xf0, 0x09, + 0x59, 0x8c, 0xd0, 0x04, 0x41, 0x30, 0x00, 0x00, 0x80, 0x69, 0x74, 0x80, + 0x04, 0x00, 0x00, 0x03, 0x48, 0x87, 0x18, 0x05, 0x04, 0x01, 0xf0, 0x03, + 0x48, 0x83, 0x18, 0x04, 0x48, 0x83, 0x18, 0x05, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x54, 0x58, 0x9d, 0x08, 0x01, 0x58, 0x9d, 0x00, 0x00, + 0x82, 0x9d, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, + 0x82, 0x9d, 0x3c, 0x80, 0x00, 0x00, 0x00, 0x02, 0x48, 0x81, 0x38, 0x00, + 0x48, 0x85, 0x38, 0x01, 0x49, 0x33, 0xc8, 0x57, 0x81, 0x32, 0x61, 0xc0, + 0x04, 0x00, 0x00, 0x23, 0x59, 0x8d, 0x00, 0x05, 0x40, 0x81, 0x08, 0x00, + 0x04, 0x01, 0xf0, 0x06, 0x41, 0x30, 0x00, 0x00, 0x80, 0x81, 0x74, 0x80, + 0x04, 0x00, 0x00, 0x07, 0x40, 0x81, 0x08, 0x00, 0x50, 0x81, 0x00, 0x00, + 0x80, 0x81, 0x01, 0xc0, 0x04, 0x02, 0x07, 0xfa, 0x41, 0x78, 0xd0, 0x00, + 0x04, 0x01, 0xf0, 0x28, 0x59, 0x8c, 0xd0, 0x0d, 0x80, 0x69, 0x74, 0x80, + 0x04, 0x00, 0x00, 0x22, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x3e, + 0x59, 0x8c, 0xd0, 0x05, 0x40, 0x80, 0x00, 0x00, 0x80, 0x69, 0x74, 0x80, + 0x04, 0x00, 0x00, 0x14, 0x59, 0x8c, 0xd0, 0x04, 0x80, 0x69, 0x74, 0x80, + 0x04, 0x00, 0x00, 0x07, 0x45, 0x79, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x54, 0x42, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf0, 0x16, 0x48, 0x87, 0x18, 0x04, 0x45, 0x79, 0x00, 0x00, + 0x45, 0x79, 0x08, 0x00, 0x04, 0x01, 0xf7, 0xf8, 0x41, 0x78, 0xd0, 0x00, + 0x40, 0x68, 0xd8, 0x00, 0x40, 0x68, 0xe0, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xec, 0x04, 0x01, 0xf0, 0x0c, 0x50, 0x81, 0x70, 0x00, + 0x48, 0xbb, 0x18, 0x05, 0x45, 0x79, 0x00, 0x00, 0x59, 0x8c, 0xd0, 0x04, + 0x80, 0x69, 0x74, 0x80, 0x04, 0x02, 0x07, 0xec, 0x49, 0x7b, 0x18, 0x04, + 0x04, 0x01, 0xf7, 0xea, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x69, 0x04, + 0x04, 0x01, 0xf7, 0xdd, 0x40, 0x69, 0x88, 0x00, 0x58, 0x9d, 0x08, 0x01, + 0x58, 0x9d, 0x00, 0x00, 0x82, 0x9d, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x9d, 0x3c, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x48, 0x81, 0x38, 0x00, 0x48, 0x85, 0x38, 0x01, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x6d, 0x40, 0xc5, 0x08, 0x00, 0x04, 0x01, 0xff, 0x70, + 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x00, 0x06, 0x42, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x80, 0x85, 0x70, 0x40, 0x04, 0x02, 0x00, 0x0c, + 0x04, 0x01, 0xf0, 0x09, 0x04, 0x01, 0xff, 0x24, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x02, 0x07, 0xf9, 0x04, 0x01, 0xff, 0xae, 0x40, 0xc5, 0x00, 0x00, + 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x07, 0xf7, 0x04, 0x01, 0xf7, 0xf4, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x5f, 0x40, 0x81, 0x88, 0x00, + 0x58, 0x9d, 0x08, 0x01, 0x58, 0x9d, 0x00, 0x00, 0x82, 0x9d, 0x3c, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x9d, 0x3c, 0x80, + 0x00, 0x00, 0x00, 0x02, 0x48, 0x81, 0x38, 0x00, 0x48, 0x85, 0x38, 0x01, + 0x5c, 0x00, 0xd0, 0x00, 0x4c, 0x68, 0x00, 0x00, 0x48, 0x6b, 0xc8, 0x57, + 0x41, 0x35, 0x00, 0x00, 0x41, 0x2d, 0x08, 0x00, 0x59, 0x32, 0x68, 0x09, + 0x59, 0x32, 0x58, 0x08, 0x59, 0x30, 0xd4, 0x06, 0x82, 0x69, 0x74, 0x80, + 0x00, 0x00, 0x00, 0x11, 0x83, 0xf1, 0x75, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x30, 0x82, 0xb9, 0x74, 0x80, 0x0c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x2d, 0x49, 0x33, 0xc8, 0x57, 0x49, 0x43, 0xc8, 0x57, + 0x49, 0x3f, 0xc8, 0x57, 0x59, 0x30, 0xd4, 0x06, 0x48, 0x6b, 0xc8, 0x57, + 0x59, 0x30, 0xd4, 0x06, 0x82, 0x69, 0x74, 0x80, 0x00, 0x00, 0x00, 0x11, + 0x83, 0xf1, 0x75, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x18, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xcd, 0x11, 0x80, 0x68, 0xd4, 0x00, + 0x50, 0x68, 0xd0, 0x00, 0x08, 0x69, 0xf0, 0x00, 0x00, 0x10, 0xcd, 0x23, + 0x00, 0x10, 0xcd, 0x6d, 0x00, 0x10, 0xcd, 0x2b, 0x00, 0x10, 0xcd, 0x78, + 0x00, 0x10, 0xcd, 0x6d, 0x00, 0x10, 0xcd, 0x5f, 0x00, 0x10, 0xcd, 0x53, + 0x00, 0x10, 0xcd, 0x23, 0x00, 0x10, 0xcd, 0x23, 0x00, 0x10, 0xcd, 0x4a, + 0x00, 0x10, 0xcd, 0x3f, 0x00, 0x10, 0xcd, 0x23, 0x00, 0x10, 0xcd, 0x23, + 0x00, 0x10, 0xcd, 0x23, 0x00, 0x10, 0xcd, 0x23, 0x00, 0x10, 0xcd, 0x23, + 0x00, 0x10, 0xcd, 0x33, 0x00, 0x10, 0xcd, 0x33, 0x41, 0x78, 0xd0, 0x00, + 0x40, 0x68, 0xd8, 0x00, 0x40, 0x68, 0xe0, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xec, 0x40, 0x82, 0x68, 0x00, 0x40, 0x86, 0x58, 0x00, + 0x04, 0x01, 0xf0, 0x78, 0x81, 0x2e, 0x59, 0xc0, 0x04, 0x00, 0x00, 0x62, + 0x41, 0x78, 0xd0, 0x00, 0x40, 0x68, 0xd8, 0x00, 0x40, 0x68, 0xe0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xec, 0x04, 0x01, 0xf0, 0x70, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x34, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x02, 0x00, 0x68, 0x59, 0x32, 0x58, 0x17, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x07, 0x37, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x71, 0x98, + 0x40, 0x82, 0x68, 0x00, 0x40, 0x86, 0x58, 0x00, 0x04, 0x01, 0xf0, 0x64, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x34, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x07, 0xf8, 0x49, 0x42, 0x5a, 0x06, 0x49, 0x7a, 0x5c, 0x09, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4a, 0x76, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x71, 0x98, 0x04, 0x01, 0xf7, 0xf3, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x88, 0x34, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x07, 0xed, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x62, 0x5f, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x71, 0x98, 0x04, 0x01, 0xf7, 0xea, 0x59, 0x30, 0xd0, 0x07, + 0x8c, 0x68, 0xd5, 0x00, 0x04, 0x02, 0x00, 0x46, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x88, 0x34, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x07, 0xe1, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9b, 0xc2, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x71, 0x98, 0x04, 0x01, 0xf7, 0xde, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x88, 0x34, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x07, 0xd8, + 0x59, 0x2c, 0xd2, 0x04, 0x82, 0x68, 0xd5, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x82, 0x69, 0x74, 0x80, 0x00, 0x00, 0x00, 0x55, 0x04, 0x02, 0x07, 0xc5, + 0x49, 0x42, 0x5a, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4a, 0x76, + 0x04, 0x01, 0xf7, 0xdb, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xd0, 0x7d, + 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x02, 0x00, 0x25, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8b, 0x60, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x78, 0xbe, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x71, 0x98, 0x04, 0x01, 0xf7, 0xc5, + 0x59, 0x30, 0xd0, 0x07, 0x8c, 0x68, 0xd5, 0x00, 0x04, 0x02, 0x00, 0x1e, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x34, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x07, 0xbc, 0x4a, 0x02, 0x5a, 0x04, 0x00, 0x00, 0x01, 0x03, + 0x49, 0x42, 0x5a, 0x06, 0x49, 0x7a, 0x58, 0x09, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x89, 0xe1, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9e, 0x7b, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4a, 0x76, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x89, 0x3e, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x71, 0x98, + 0x04, 0x01, 0xf7, 0xaf, 0x59, 0x30, 0xd2, 0x1d, 0x82, 0x69, 0x74, 0x80, + 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x07, 0xf8, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x71, 0x98, 0x04, 0x01, 0xf7, 0xa8, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x1c, 0x32, 0x04, 0x01, 0xf7, 0xda, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x0d, 0xdb, 0x04, 0x01, 0xf7, 0xe1, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x0d, 0xdb, 0x04, 0x01, 0xf7, 0xb9, 0x49, 0x42, 0x5a, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4a, 0x76, 0x04, 0x01, 0xf7, 0x96, + 0x58, 0x9d, 0x08, 0x01, 0x58, 0x9d, 0x00, 0x00, 0x82, 0x9d, 0x3c, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, 0x80, 0x9d, 0x38, 0x40, + 0x48, 0x81, 0x38, 0x00, 0x59, 0x30, 0xd4, 0x06, 0x82, 0x69, 0x74, 0x80, + 0x00, 0x00, 0x00, 0x11, 0x83, 0xf1, 0x75, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x20, 0x82, 0xb9, 0x74, 0x80, 0x0c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x1d, 0x82, 0x69, 0x74, 0x80, 0x00, 0x00, 0x00, 0x11, + 0x83, 0xf1, 0x75, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x18, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xcd, 0xbc, 0x80, 0x68, 0xd4, 0x00, + 0x50, 0x68, 0xd0, 0x00, 0x08, 0x69, 0xf0, 0x00, 0x00, 0x10, 0xcd, 0xde, + 0x00, 0x10, 0xcd, 0xf2, 0x00, 0x10, 0xcd, 0xde, 0x00, 0x10, 0xcd, 0xd4, + 0x00, 0x10, 0xcd, 0xe9, 0x00, 0x10, 0xcd, 0xe9, 0x00, 0x10, 0xcd, 0xe1, + 0x00, 0x10, 0xcd, 0xde, 0x00, 0x10, 0xcd, 0xde, 0x00, 0x10, 0xcd, 0xde, + 0x00, 0x10, 0xcd, 0xde, 0x00, 0x10, 0xcd, 0xde, 0x00, 0x10, 0xcd, 0xde, + 0x00, 0x10, 0xcd, 0xde, 0x00, 0x10, 0xcd, 0xde, 0x00, 0x10, 0xcd, 0xde, + 0x00, 0x10, 0xcd, 0xde, 0x00, 0x10, 0xcd, 0xfe, 0x41, 0x78, 0xd0, 0x00, + 0x40, 0x68, 0xd8, 0x00, 0x40, 0x68, 0xe0, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xec, 0x04, 0x01, 0xf0, 0x32, 0x59, 0x30, 0xd0, 0x09, + 0x83, 0x3c, 0xdd, 0x00, 0x00, 0x00, 0x10, 0x00, 0x8d, 0x3e, 0x7d, 0x18, + 0x04, 0x02, 0x00, 0x06, 0x8d, 0x3e, 0x7d, 0x06, 0x04, 0x00, 0x00, 0x04, + 0x50, 0x68, 0xd2, 0x00, 0x8c, 0x68, 0xd5, 0x0e, 0x04, 0x02, 0x00, 0x28, + 0x42, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x25, + 0x83, 0x3c, 0xd5, 0x00, 0x00, 0x00, 0x10, 0x00, 0x42, 0x00, 0xd8, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x8d, 0x3e, 0x7d, 0x18, 0x04, 0x02, 0x00, 0x1f, + 0x40, 0x68, 0xd8, 0x00, 0x04, 0x01, 0xf0, 0x1d, 0x8d, 0x3e, 0x7d, 0x18, + 0x04, 0x00, 0x00, 0x03, 0x8d, 0x3e, 0x7d, 0x16, 0x04, 0x00, 0x07, 0xf2, + 0x59, 0x30, 0xd4, 0x20, 0x41, 0x78, 0xd8, 0x00, 0x8c, 0x68, 0xd5, 0x00, + 0x04, 0x02, 0x00, 0x15, 0x04, 0x01, 0xf7, 0xed, 0x83, 0x3d, 0x05, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x8d, 0x3e, 0x7d, 0x18, 0x04, 0x02, 0x07, 0xe9, + 0x8d, 0x3e, 0x7d, 0x06, 0x04, 0x00, 0x07, 0xe7, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8b, 0x04, 0x40, 0x80, 0xd8, 0x00, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x02, 0x00, 0x09, 0x04, 0x01, 0xf7, 0xe1, 0x83, 0x3c, 0xd5, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x8d, 0x3e, 0x7d, 0x18, 0x04, 0x02, 0x07, 0xdd, + 0x40, 0x68, 0xd8, 0x00, 0x8d, 0x3e, 0x7d, 0x16, 0x04, 0x00, 0x07, 0xda, + 0x40, 0x6d, 0x88, 0x00, 0x58, 0x9d, 0x00, 0x00, 0x80, 0x9d, 0x38, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x9d, 0x3c, 0x80, 0x00, 0x00, 0x00, 0x06, + 0x48, 0x81, 0x38, 0x00, 0x48, 0x85, 0x38, 0x01, 0x48, 0x89, 0x38, 0x02, + 0x48, 0x8d, 0x38, 0x03, 0x48, 0x91, 0x38, 0x04, 0x48, 0x95, 0x38, 0x05, + 0x49, 0x33, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x6d, + 0x40, 0xc5, 0x28, 0x00, 0x41, 0x35, 0x20, 0x00, 0x41, 0x31, 0x10, 0x00, + 0x41, 0x2d, 0x18, 0x00, 0x41, 0x79, 0x08, 0x00, 0x59, 0x8e, 0x60, 0x05, + 0x04, 0x01, 0xf0, 0x0a, 0x59, 0x32, 0x68, 0x09, 0x81, 0x36, 0x69, 0xc0, + 0x04, 0x00, 0x00, 0x05, 0x59, 0x34, 0xd4, 0x03, 0x41, 0x44, 0x00, 0x00, + 0x80, 0x69, 0x74, 0x80, 0x04, 0x00, 0x00, 0x0b, 0x41, 0x31, 0x08, 0x00, + 0x51, 0x32, 0x60, 0x00, 0x81, 0x32, 0x61, 0xc0, 0x04, 0x02, 0x07, 0xf6, + 0x40, 0x8a, 0x60, 0x00, 0x40, 0x8e, 0x58, 0x00, 0x40, 0x92, 0x68, 0x00, + 0x80, 0x95, 0x70, 0x40, 0x04, 0x00, 0x00, 0x25, 0x04, 0x01, 0xf0, 0x26, + 0x04, 0x01, 0xff, 0x7b, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x07, 0xf4, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x34, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x00, 0x15, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x34, + 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8d, 0xdd, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x00, 0x0d, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x34, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x07, 0xe4, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8d, 0xdd, + 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x07, 0xe0, 0x59, 0x30, 0xd4, 0x03, + 0x82, 0x69, 0x74, 0x80, 0x00, 0x00, 0x00, 0x43, 0x04, 0x00, 0x07, 0xdc, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0x5b, 0x51, 0x31, 0x00, 0x00, + 0x40, 0x84, 0xd0, 0x00, 0x04, 0x01, 0xfe, 0x22, 0x04, 0x01, 0xfe, 0xa1, + 0x40, 0x82, 0x60, 0x00, 0x04, 0x01, 0xf7, 0xd6, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x5f, 0x58, 0x9d, 0x28, 0x05, 0x58, 0x9d, 0x20, 0x04, + 0x58, 0x9d, 0x18, 0x03, 0x58, 0x9d, 0x10, 0x02, 0x58, 0x9d, 0x08, 0x01, + 0x58, 0x9d, 0x00, 0x00, 0x82, 0x9d, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x9d, 0x3c, 0x80, 0x00, 0x00, 0x00, 0x06, + 0x48, 0x81, 0x38, 0x00, 0x48, 0x85, 0x38, 0x01, 0x48, 0x89, 0x38, 0x02, + 0x48, 0x8d, 0x38, 0x03, 0x48, 0x91, 0x38, 0x04, 0x48, 0x95, 0x38, 0x05, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x6d, 0x40, 0xc5, 0x28, 0x00, + 0x41, 0x2d, 0x10, 0x00, 0x41, 0x31, 0x18, 0x00, 0x41, 0x35, 0x20, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x43, 0x3e, 0x40, 0xc6, 0x68, 0x00, + 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x00, 0x2e, 0x41, 0x79, 0x08, 0x00, + 0x59, 0x8e, 0x60, 0x0b, 0x04, 0x01, 0xf0, 0x03, 0x41, 0x31, 0x08, 0x00, + 0x51, 0x32, 0x60, 0x00, 0x81, 0x32, 0x61, 0xc0, 0x04, 0x00, 0x00, 0x1c, + 0x59, 0x30, 0xd0, 0x09, 0x41, 0x34, 0x00, 0x00, 0x80, 0x69, 0x74, 0x80, + 0x04, 0x02, 0x07, 0xf9, 0x04, 0x01, 0xff, 0x2f, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x00, 0x03, 0x8d, 0x3e, 0x7d, 0x00, 0x04, 0x00, 0x00, 0x0a, + 0x04, 0x01, 0xff, 0x2a, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x07, 0xf1, + 0x8d, 0x3e, 0x7d, 0x00, 0x04, 0x00, 0x07, 0xef, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x63, 0x91, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x07, 0xeb, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0x5b, 0x51, 0x31, 0x00, 0x00, + 0x40, 0x84, 0xd0, 0x00, 0x04, 0x01, 0xfd, 0x56, 0x04, 0x01, 0xfe, 0x62, + 0x40, 0x82, 0x60, 0x00, 0x81, 0x32, 0x61, 0xc0, 0x04, 0x02, 0x07, 0xe6, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x44, 0xb4, 0x40, 0x8a, 0x58, 0x00, + 0x40, 0x8e, 0x60, 0x00, 0x40, 0x92, 0x68, 0x00, 0x80, 0x95, 0x70, 0x40, + 0x04, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf0, 0x09, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x5f, 0x04, 0x01, 0xf0, 0x06, 0x41, 0x78, 0xd0, 0x00, + 0x40, 0x68, 0xd8, 0x00, 0x40, 0x68, 0xe0, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xec, 0x58, 0x9d, 0x28, 0x05, 0x58, 0x9d, 0x20, 0x04, + 0x58, 0x9d, 0x18, 0x03, 0x58, 0x9d, 0x10, 0x02, 0x58, 0x9d, 0x08, 0x01, + 0x58, 0x9d, 0x00, 0x00, 0x82, 0x9d, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x9d, 0x3c, 0x80, 0x00, 0x00, 0x00, 0x06, + 0x48, 0x81, 0x38, 0x00, 0x48, 0x85, 0x38, 0x01, 0x48, 0x89, 0x38, 0x02, + 0x48, 0x8d, 0x38, 0x03, 0x48, 0x91, 0x38, 0x04, 0x48, 0x95, 0x38, 0x05, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x6d, 0x40, 0xc5, 0x28, 0x00, + 0x41, 0x2d, 0x20, 0x00, 0x41, 0x35, 0x18, 0x00, 0x41, 0x31, 0x10, 0x00, + 0x42, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x59, 0x8e, 0x60, 0x09, + 0x81, 0x32, 0x61, 0xc0, 0x04, 0x00, 0x00, 0x0c, 0x59, 0x32, 0x68, 0x09, + 0x59, 0x34, 0xd4, 0x03, 0x41, 0x44, 0x00, 0x00, 0x80, 0x69, 0x74, 0x80, + 0x04, 0x00, 0x00, 0x10, 0x80, 0x81, 0x01, 0xc0, 0x04, 0x00, 0x00, 0x0b, + 0x41, 0x31, 0x08, 0x00, 0x51, 0x32, 0x60, 0x00, 0x81, 0x32, 0x61, 0xc0, + 0x04, 0x02, 0x07, 0xf6, 0x40, 0x8a, 0x60, 0x00, 0x40, 0x8e, 0x68, 0x00, + 0x40, 0x92, 0x58, 0x00, 0x80, 0x95, 0x70, 0x40, 0x04, 0x00, 0x00, 0x1c, + 0x04, 0x01, 0xf0, 0x23, 0x42, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x01, 0xf7, 0xeb, 0x04, 0x01, 0xfe, 0xd8, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x00, 0x07, 0x8d, 0x3e, 0x7d, 0x00, 0x04, 0x00, 0x00, 0x05, + 0x59, 0x30, 0xd4, 0x06, 0x82, 0x69, 0x74, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x00, 0x12, 0x04, 0x01, 0xfe, 0xcf, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x07, 0xe6, 0x8d, 0x3e, 0x7d, 0x00, 0x04, 0x02, 0x07, 0xe4, + 0x51, 0x31, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0x5b, + 0x40, 0x84, 0xd0, 0x00, 0x04, 0x01, 0xfd, 0x43, 0x04, 0x01, 0xfe, 0x0b, + 0x40, 0x82, 0x60, 0x00, 0x41, 0x79, 0x00, 0x00, 0x04, 0x01, 0xf7, 0xdb, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x5f, 0x04, 0x01, 0xf0, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0x91, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x02, 0x07, 0xf1, 0x04, 0x01, 0xf7, 0xeb, 0x58, 0x9d, 0x28, 0x05, + 0x58, 0x9d, 0x20, 0x04, 0x58, 0x9d, 0x18, 0x03, 0x58, 0x9d, 0x10, 0x02, + 0x58, 0x9d, 0x08, 0x01, 0x58, 0x9d, 0x00, 0x00, 0x82, 0x9d, 0x3c, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x9d, 0x3c, 0x80, + 0x00, 0x00, 0x00, 0x02, 0x48, 0x81, 0x38, 0x00, 0x48, 0x85, 0x38, 0x01, + 0x49, 0x47, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x6d, + 0x40, 0xc5, 0x08, 0x00, 0x41, 0x3d, 0x00, 0x00, 0x85, 0x3e, 0x7d, 0x00, + 0x04, 0x01, 0xff, 0xa7, 0x04, 0x01, 0xff, 0x58, 0x40, 0x82, 0x78, 0x00, + 0x80, 0x85, 0x70, 0x40, 0x04, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf0, 0x03, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x5f, 0x58, 0x9d, 0x08, 0x01, + 0x58, 0x9d, 0x00, 0x00, 0x82, 0x9d, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x9d, 0x3c, 0x80, 0x00, 0x00, 0x00, 0x05, + 0x48, 0x81, 0x38, 0x00, 0x48, 0x85, 0x38, 0x01, 0x48, 0x89, 0x38, 0x02, + 0x48, 0x8d, 0x38, 0x03, 0x48, 0x91, 0x38, 0x04, 0x41, 0x2d, 0x20, 0x00, + 0x41, 0x35, 0x18, 0x00, 0x41, 0x31, 0x10, 0x00, 0x41, 0x79, 0x08, 0x00, + 0x59, 0x8e, 0x60, 0x0b, 0x81, 0x32, 0x61, 0xc0, 0x04, 0x00, 0x00, 0x11, + 0x04, 0x01, 0xfe, 0x8b, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x02, 0x00, 0x06, + 0x41, 0x31, 0x08, 0x00, 0x51, 0x32, 0x60, 0x00, 0x81, 0x32, 0x61, 0xc0, + 0x04, 0x02, 0x07, 0xfa, 0x04, 0x01, 0xf0, 0x09, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x63, 0x5b, 0x51, 0x31, 0x00, 0x00, 0x40, 0x84, 0xd0, 0x00, + 0x04, 0x01, 0xfc, 0xb8, 0x04, 0x01, 0xfd, 0xc4, 0x40, 0x82, 0x60, 0x00, + 0x04, 0x01, 0xf7, 0xef, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x44, 0x8d, + 0x40, 0x8e, 0x68, 0x00, 0x40, 0x8a, 0x60, 0x00, 0x40, 0x92, 0x58, 0x00, + 0x58, 0x9d, 0x20, 0x04, 0x58, 0x9d, 0x18, 0x03, 0x58, 0x9d, 0x10, 0x02, + 0x58, 0x9d, 0x08, 0x01, 0x58, 0x9d, 0x00, 0x00, 0x82, 0x9d, 0x3c, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x9d, 0x3c, 0x80, + 0x00, 0x00, 0x00, 0x05, 0x48, 0x81, 0x38, 0x00, 0x48, 0x85, 0x38, 0x01, + 0x48, 0x89, 0x38, 0x02, 0x48, 0x8d, 0x38, 0x03, 0x48, 0x91, 0x38, 0x04, + 0x41, 0x2d, 0x20, 0x00, 0x41, 0x35, 0x18, 0x00, 0x41, 0x31, 0x10, 0x00, + 0x41, 0x79, 0x08, 0x00, 0x59, 0x8e, 0x60, 0x09, 0x81, 0x32, 0x61, 0xc0, + 0x04, 0x00, 0x00, 0x11, 0x04, 0x01, 0xfe, 0x60, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x02, 0x00, 0x06, 0x41, 0x31, 0x08, 0x00, 0x51, 0x32, 0x60, 0x00, + 0x81, 0x32, 0x61, 0xc0, 0x04, 0x02, 0x07, 0xfa, 0x04, 0x01, 0xf0, 0x09, + 0x51, 0x31, 0x00, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0x5b, + 0x40, 0x84, 0xd0, 0x00, 0x04, 0x01, 0xfc, 0xd1, 0x04, 0x01, 0xfd, 0x99, + 0x40, 0x82, 0x60, 0x00, 0x04, 0x01, 0xf7, 0xef, 0x40, 0x8a, 0x60, 0x00, + 0x40, 0x8e, 0x68, 0x00, 0x40, 0x92, 0x58, 0x00, 0x58, 0x9d, 0x20, 0x04, + 0x58, 0x9d, 0x18, 0x03, 0x58, 0x9d, 0x10, 0x02, 0x58, 0x9d, 0x08, 0x01, + 0x58, 0x9d, 0x00, 0x00, 0x82, 0x9d, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x1c, 0x01, 0xf0, 0x00, 0x80, 0x9d, 0x38, 0x40, 0x48, 0x81, 0x38, 0x00, + 0x49, 0x43, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x6d, + 0x40, 0xc5, 0x00, 0x00, 0x04, 0x01, 0xff, 0xd1, 0x04, 0x01, 0xff, 0xa5, + 0x80, 0x81, 0x70, 0x40, 0x04, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf0, 0x03, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x5f, 0x58, 0x9d, 0x00, 0x00, + 0x80, 0x9d, 0x38, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x9d, 0x3c, 0x80, + 0x00, 0x00, 0x00, 0x04, 0x48, 0x81, 0x38, 0x00, 0x48, 0x85, 0x38, 0x01, + 0x48, 0x89, 0x38, 0x02, 0x48, 0x8d, 0x38, 0x03, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x6d, 0x40, 0xc5, 0x18, 0x00, 0x41, 0x31, 0x10, 0x00, + 0x41, 0x79, 0x08, 0x00, 0x59, 0x8e, 0x60, 0x05, 0x81, 0x32, 0x61, 0xc0, + 0x04, 0x00, 0x00, 0x08, 0x04, 0x01, 0xfe, 0x27, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x02, 0x00, 0x09, 0x41, 0x31, 0x08, 0x00, 0x51, 0x32, 0x60, 0x00, + 0x81, 0x32, 0x61, 0xc0, 0x04, 0x02, 0x07, 0xfa, 0x40, 0x8a, 0x60, 0x00, + 0x80, 0x8d, 0x70, 0x40, 0x04, 0x00, 0x00, 0x0a, 0x04, 0x01, 0xf0, 0x0b, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0x5b, 0x51, 0x31, 0x00, 0x00, + 0x40, 0x84, 0xd0, 0x00, 0x04, 0x01, 0xfc, 0xde, 0x04, 0x01, 0xfd, 0x5d, + 0x40, 0x82, 0x60, 0x00, 0x04, 0x01, 0xf7, 0xec, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x5f, 0x58, 0x9d, 0x18, 0x03, 0x58, 0x9d, 0x10, 0x02, + 0x58, 0x9d, 0x08, 0x01, 0x58, 0x9d, 0x00, 0x00, 0x82, 0x9d, 0x3c, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x1c, 0x01, 0xf0, 0x00, 0x80, 0x9d, 0x38, 0x40, + 0x44, 0xa1, 0x38, 0x00, 0x82, 0x9d, 0x3c, 0x80, 0x00, 0x00, 0x00, 0x05, + 0x40, 0x9d, 0x40, 0x00, 0x82, 0x9d, 0x3c, 0x80, 0x00, 0x00, 0x00, 0x07, + 0x48, 0x81, 0x38, 0x00, 0x48, 0x85, 0x38, 0x01, 0x48, 0x89, 0x38, 0x02, + 0x48, 0x8d, 0x38, 0x03, 0x48, 0x91, 0x38, 0x04, 0x48, 0x95, 0x38, 0x05, + 0x48, 0x99, 0x38, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x6d, + 0x48, 0xc5, 0x40, 0x00, 0x41, 0x31, 0x18, 0x00, 0x41, 0x35, 0x28, 0x00, + 0x49, 0x19, 0x40, 0x02, 0x41, 0x2d, 0x20, 0x00, 0x49, 0x91, 0x40, 0x01, + 0x41, 0xd1, 0x30, 0x00, 0x49, 0xa5, 0x40, 0x03, 0x49, 0x15, 0x40, 0x04, + 0x59, 0xbe, 0x60, 0x2f, 0x81, 0x32, 0x61, 0xc0, 0x04, 0x00, 0x00, 0x1b, + 0x41, 0x31, 0x08, 0x00, 0x04, 0x01, 0xf0, 0x05, 0x80, 0x81, 0x01, 0xc0, + 0x04, 0x00, 0x00, 0x17, 0x41, 0x31, 0x08, 0x00, 0x40, 0x82, 0x60, 0x00, + 0x51, 0x31, 0x00, 0x00, 0x59, 0x32, 0x68, 0x09, 0x59, 0x34, 0xd4, 0x03, + 0x41, 0x44, 0x00, 0x00, 0x80, 0x69, 0x74, 0x80, 0x04, 0x02, 0x07, 0xf7, + 0x59, 0x31, 0x00, 0x01, 0x8d, 0x3e, 0x7d, 0x00, 0x04, 0x00, 0x00, 0x05, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0x91, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x00, 0x04, 0x04, 0x01, 0xfd, 0xdc, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x02, 0x00, 0x21, 0x41, 0x31, 0x10, 0x00, 0x40, 0x82, 0x60, 0x00, + 0x80, 0x81, 0x01, 0xc0, 0x04, 0x02, 0x07, 0xf3, 0x41, 0x7a, 0x30, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x69, 0x27, 0x59, 0x92, 0x60, 0x04, + 0x81, 0x32, 0x61, 0xc0, 0x04, 0x00, 0x00, 0x06, 0x59, 0x32, 0x68, 0x09, + 0x59, 0x34, 0xd4, 0x03, 0x41, 0x44, 0x00, 0x00, 0x80, 0x69, 0x74, 0x80, + 0x04, 0x00, 0x00, 0x18, 0x81, 0x1a, 0x30, 0x00, 0x83, 0x19, 0x74, 0x80, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x07, 0xf3, 0x04, 0x00, 0x17, 0xf2, + 0x40, 0x8e, 0x60, 0x00, 0x40, 0x96, 0x68, 0x00, 0x58, 0xa2, 0x30, 0x02, + 0x40, 0x92, 0x58, 0x00, 0x58, 0xa3, 0x20, 0x01, 0x40, 0x9b, 0xa0, 0x00, + 0x58, 0xa3, 0x48, 0x03, 0x58, 0xa2, 0x28, 0x04, 0x58, 0xa0, 0xd0, 0x00, + 0x80, 0x69, 0x70, 0x40, 0x04, 0x00, 0x00, 0x17, 0x04, 0x01, 0xf0, 0x18, + 0x40, 0x84, 0xd0, 0x00, 0x40, 0x88, 0xd8, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xcb, 0x2f, 0x04, 0x01, 0xfc, 0xfb, 0x04, 0x01, 0xf7, 0xdc, + 0x8d, 0x3e, 0x7d, 0x00, 0x04, 0x00, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x63, 0x91, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x07, 0xe4, + 0x04, 0x01, 0xfd, 0xad, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x07, 0xe1, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x65, 0xfd, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x31, 0x04, 0x01, 0xfc, 0xec, 0x04, 0x01, 0xf7, 0xdb, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x5f, 0x58, 0x9d, 0x30, 0x06, + 0x58, 0x9d, 0x28, 0x05, 0x58, 0x9d, 0x20, 0x04, 0x58, 0x9d, 0x18, 0x03, + 0x58, 0x9d, 0x10, 0x02, 0x58, 0x9d, 0x08, 0x01, 0x58, 0x9d, 0x00, 0x00, + 0x82, 0x9d, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x50, 0x9d, 0x40, 0x00, + 0x80, 0x9d, 0x38, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x80, 0x9d, 0x38, 0x40, + 0x44, 0xa1, 0x38, 0x00, 0x82, 0x9d, 0x3c, 0x80, 0x00, 0x00, 0x00, 0x07, + 0x40, 0x9d, 0x40, 0x00, 0x82, 0x9d, 0x3c, 0x80, 0x00, 0x00, 0x00, 0x07, + 0x48, 0x81, 0x38, 0x00, 0x48, 0x85, 0x38, 0x01, 0x48, 0x89, 0x38, 0x02, + 0x48, 0x8d, 0x38, 0x03, 0x48, 0x91, 0x38, 0x04, 0x48, 0x95, 0x38, 0x05, + 0x48, 0x99, 0x38, 0x06, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x6d, + 0x40, 0xc5, 0x28, 0x00, 0x41, 0x31, 0x30, 0x00, 0x49, 0x35, 0x40, 0x01, + 0x49, 0x2d, 0x40, 0x00, 0x49, 0x19, 0x40, 0x04, 0x49, 0x91, 0x40, 0x03, + 0x49, 0xd1, 0x40, 0x02, 0x49, 0xa5, 0x40, 0x05, 0x49, 0x15, 0x40, 0x06, + 0x59, 0xbe, 0x60, 0x2f, 0x81, 0x32, 0x61, 0xc0, 0x04, 0x00, 0x00, 0x23, + 0x41, 0x31, 0x20, 0x00, 0x41, 0x79, 0x08, 0x00, 0x51, 0x31, 0x10, 0x00, + 0x59, 0x32, 0x68, 0x09, 0x04, 0x01, 0xf0, 0x09, 0x41, 0x31, 0x18, 0x00, + 0x80, 0x85, 0x09, 0xc0, 0x04, 0x00, 0x00, 0x10, 0x80, 0x81, 0x01, 0xc0, + 0x04, 0x00, 0x00, 0x02, 0x40, 0x82, 0x60, 0x00, 0x80, 0x81, 0x01, 0xc0, + 0x04, 0x00, 0x00, 0x0d, 0x59, 0x31, 0x00, 0x01, 0x04, 0x01, 0xfd, 0x6c, + 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x07, 0xf5, 0x40, 0x90, 0xd0, 0x00, + 0x40, 0x8c, 0xd8, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xcb, 0x2f, + 0x04, 0x01, 0xfc, 0xab, 0x04, 0x01, 0xf7, 0xf2, 0x41, 0x31, 0x08, 0x00, + 0x04, 0x01, 0xf7, 0xf0, 0x80, 0x89, 0x11, 0xc0, 0x04, 0x00, 0x00, 0x06, + 0x40, 0x8a, 0x60, 0x00, 0x80, 0x85, 0x09, 0xc0, 0x04, 0x00, 0x00, 0x03, + 0x40, 0x85, 0x20, 0x00, 0x40, 0x81, 0x08, 0x00, 0x80, 0x89, 0x11, 0xc0, + 0x04, 0x02, 0x07, 0xe1, 0x41, 0x7a, 0x30, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x69, 0x27, 0x59, 0x92, 0x60, 0x04, 0x81, 0x32, 0x61, 0xc0, + 0x04, 0x00, 0x00, 0x05, 0x59, 0x32, 0x68, 0x09, 0x04, 0x01, 0xfd, 0x51, + 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x02, 0x00, 0x11, 0x81, 0x1a, 0x30, 0x00, + 0x83, 0x19, 0x74, 0x80, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x07, 0xf4, + 0x04, 0x00, 0x17, 0xf3, 0x40, 0x9a, 0x60, 0x00, 0x58, 0xa2, 0x68, 0x01, + 0x58, 0xa2, 0x58, 0x00, 0x58, 0xa2, 0x30, 0x04, 0x58, 0xa3, 0x20, 0x03, + 0x58, 0xa3, 0xa0, 0x02, 0x58, 0xa3, 0x48, 0x05, 0x58, 0xa2, 0x28, 0x06, + 0x80, 0x95, 0x70, 0x40, 0x04, 0x00, 0x00, 0x08, 0x04, 0x01, 0xf0, 0x09, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x65, 0xfd, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x64, 0x31, 0x04, 0x01, 0xfc, 0x80, 0x04, 0x01, 0xf7, 0xeb, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x5f, 0x58, 0x9d, 0x30, 0x06, + 0x58, 0x9d, 0x28, 0x05, 0x58, 0x9d, 0x20, 0x04, 0x58, 0x9d, 0x18, 0x03, + 0x58, 0x9d, 0x10, 0x02, 0x58, 0x9d, 0x08, 0x01, 0x58, 0x9d, 0x00, 0x00, + 0x82, 0x9d, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x50, 0x9d, 0x40, 0x00, + 0x80, 0x9d, 0x38, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x41, 0x78, 0xe0, 0x00, + 0x59, 0x30, 0xd4, 0x03, 0x48, 0x6b, 0xc8, 0x56, 0x59, 0x30, 0xdc, 0x03, + 0x82, 0x6c, 0xd4, 0x80, 0x00, 0x00, 0x00, 0x02, 0x82, 0x69, 0x74, 0x80, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x07, + 0x59, 0x9c, 0xd0, 0x19, 0x82, 0x69, 0x74, 0x80, 0x00, 0x00, 0x00, 0x80, + 0x04, 0x02, 0x00, 0x05, 0x80, 0x6c, 0xd9, 0xc0, 0x04, 0x02, 0x00, 0x03, + 0x42, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x71, 0x88, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x80, 0x9d, 0x38, 0x40, 0x48, 0x81, 0x38, 0x00, + 0x59, 0x30, 0xdc, 0x06, 0x82, 0x6d, 0x74, 0x80, 0x00, 0x00, 0x00, 0x11, + 0x83, 0xf1, 0x75, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x27, + 0x82, 0xb9, 0x74, 0x80, 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x24, + 0x59, 0x32, 0x68, 0x09, 0x82, 0x6d, 0x74, 0x80, 0x00, 0x00, 0x00, 0x11, + 0x83, 0xf1, 0x75, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1d, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xd0, 0xa7, 0x80, 0x6c, 0xd4, 0x00, + 0x50, 0x68, 0xd0, 0x00, 0x08, 0x69, 0xf0, 0x00, 0x00, 0x10, 0xd0, 0xbe, + 0x00, 0x10, 0xd1, 0x0b, 0x00, 0x10, 0xd0, 0xdc, 0x00, 0x10, 0xd1, 0x1d, + 0x00, 0x10, 0xd1, 0x0b, 0x00, 0x10, 0xd0, 0xd8, 0x00, 0x10, 0xd0, 0xe8, + 0x00, 0x10, 0xd0, 0xbe, 0x00, 0x10, 0xd0, 0xb9, 0x00, 0x10, 0xd0, 0xfe, + 0x00, 0x10, 0xd0, 0xcc, 0x00, 0x10, 0xd0, 0xb9, 0x00, 0x10, 0xd0, 0xb9, + 0x00, 0x10, 0xd0, 0xb9, 0x00, 0x10, 0xd0, 0xb9, 0x00, 0x10, 0xd0, 0xbe, + 0x00, 0x10, 0xd0, 0xcc, 0x00, 0x10, 0xd0, 0xc5, 0x40, 0x6c, 0xd0, 0x00, + 0x41, 0x78, 0xd8, 0x00, 0x40, 0x6c, 0xe0, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xec, 0x04, 0x01, 0xf0, 0x9c, 0x40, 0x6c, 0xd0, 0x00, + 0x41, 0x78, 0xd8, 0x00, 0x40, 0x6c, 0xe0, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xec, 0x04, 0x01, 0xf0, 0x96, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xcd, 0xa7, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x07, 0xf6, + 0x59, 0x32, 0x58, 0x17, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x37, + 0x59, 0x30, 0xd2, 0x03, 0x82, 0x69, 0x74, 0x80, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x00, 0x00, 0x78, 0x59, 0x32, 0x58, 0x08, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x88, 0x34, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x02, 0x00, 0x54, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x71, 0x98, 0x04, 0x01, 0xf0, 0x83, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xcd, 0xa7, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x07, 0xe3, 0x59, 0x32, 0x58, 0x08, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x88, 0x34, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x07, 0xf5, + 0x49, 0x42, 0x5a, 0x06, 0x49, 0x7a, 0x5c, 0x09, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4a, 0x76, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x89, 0x3e, + 0x04, 0x01, 0xf7, 0xee, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xcd, 0xa7, + 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x07, 0xd3, 0x59, 0x30, 0xd2, 0x03, + 0x82, 0x69, 0x74, 0x80, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x61, + 0x59, 0x32, 0x58, 0x08, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x34, + 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x07, 0xe1, 0x49, 0x42, 0x5a, 0x06, + 0x49, 0x7a, 0x5c, 0x09, 0x81, 0x36, 0x69, 0xc0, 0x04, 0x02, 0x00, 0x2b, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8d, 0xeb, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4a, 0x76, 0x04, 0x01, 0xf7, 0xd8, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5e, 0xbc, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x02, 0x07, 0xbd, + 0x59, 0x30, 0xd2, 0x03, 0x82, 0x69, 0x74, 0x80, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x00, 0x00, 0x45, 0x42, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x47, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x71, 0xf9, 0x04, 0x01, 0xf0, 0x50, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xcd, 0xa7, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x07, 0xb0, 0x59, 0x30, 0xd4, 0x03, 0x82, 0x69, 0x74, 0x80, + 0x00, 0x00, 0x00, 0x43, 0x04, 0x00, 0x07, 0xac, 0x04, 0x01, 0xff, 0x6a, + 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x02, 0x00, 0x38, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x89, 0x60, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x07, 0xbc, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x78, 0xbe, 0x04, 0x01, 0xf7, 0xb9, + 0x81, 0x36, 0x69, 0xc0, 0x04, 0x02, 0x00, 0x0f, 0x41, 0x78, 0xd0, 0x00, + 0x40, 0x68, 0xd8, 0x00, 0x40, 0x68, 0xe0, 0x00, 0x04, 0x01, 0xf7, 0xa0, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9e, 0x7b, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8d, 0xeb, 0x04, 0x01, 0xf7, 0xd4, 0x49, 0x42, 0x5a, 0x06, + 0x49, 0x7a, 0x5c, 0x09, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4a, 0x76, + 0x04, 0x01, 0xf7, 0xa9, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xcd, 0xa7, + 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x07, 0x8e, 0x59, 0x30, 0xd2, 0x03, + 0x82, 0x69, 0x74, 0x80, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x23, + 0x59, 0x31, 0x00, 0x08, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x34, + 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x07, 0x9c, 0x4a, 0x01, 0x02, 0x04, + 0x00, 0x00, 0x01, 0x03, 0x59, 0x30, 0xd4, 0x02, 0x48, 0x69, 0x04, 0x06, + 0x58, 0x80, 0xd4, 0x08, 0x8c, 0x68, 0xd5, 0x12, 0x04, 0x02, 0x00, 0x13, + 0x49, 0x41, 0x02, 0x06, 0x49, 0x79, 0x00, 0x09, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8d, 0xeb, 0x40, 0x82, 0x58, 0x00, 0x04, 0x01, 0xf7, 0x9d, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0d, 0xdb, 0x04, 0x01, 0xf7, 0x87, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0d, 0xdb, 0x04, 0x01, 0xf0, 0x0e, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x1c, 0x32, 0x04, 0x01, 0xf7, 0xc7, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0d, 0xdb, 0x04, 0x01, 0xf7, 0x9e, + 0x58, 0x82, 0x58, 0x09, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x37, + 0x04, 0x01, 0xf7, 0xeb, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0d, 0xdb, + 0x04, 0x01, 0xf7, 0xdc, 0x58, 0x9d, 0x00, 0x00, 0x80, 0x9d, 0x38, 0x00, + 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x9d, 0x3c, 0x80, 0x00, 0x00, 0x00, 0x05, + 0x48, 0x81, 0x38, 0x00, 0x48, 0x85, 0x38, 0x01, 0x48, 0x89, 0x38, 0x02, + 0x48, 0x8d, 0x38, 0x03, 0x48, 0x91, 0x38, 0x04, 0x41, 0x31, 0x08, 0x00, + 0x41, 0x2d, 0x10, 0x00, 0x41, 0x35, 0x18, 0x00, 0x41, 0x39, 0x20, 0x00, + 0x49, 0x33, 0xc8, 0x57, 0x49, 0x43, 0xc8, 0x57, 0x49, 0x3f, 0xc8, 0x57, + 0x42, 0x01, 0x00, 0x00, 0x00, 0x10, 0xd8, 0xd4, 0x59, 0xa8, 0xd0, 0x0d, + 0x41, 0x64, 0x00, 0x00, 0x80, 0x69, 0x74, 0x80, 0x04, 0x00, 0x00, 0x2b, + 0x41, 0x58, 0x00, 0x00, 0x80, 0x81, 0x74, 0x80, 0x04, 0x02, 0x10, 0x0d, + 0x40, 0x82, 0x60, 0x00, 0x8d, 0x3e, 0x7d, 0x12, 0x04, 0x00, 0x00, 0x04, + 0x40, 0x80, 0x00, 0x00, 0x80, 0x85, 0x74, 0x80, 0x04, 0x00, 0x00, 0x02, + 0x04, 0x01, 0xff, 0x17, 0x82, 0x81, 0x04, 0x00, 0x00, 0x00, 0x00, 0x24, + 0x41, 0x58, 0x00, 0x00, 0x80, 0x81, 0x74, 0x80, 0x04, 0x00, 0x17, 0xf5, + 0x41, 0x54, 0x00, 0x00, 0x80, 0x81, 0x74, 0x80, 0x04, 0x02, 0x10, 0x1b, + 0x8d, 0x3e, 0x7d, 0x18, 0x04, 0x00, 0x00, 0x19, 0x59, 0xa8, 0xd0, 0x63, + 0x59, 0xa8, 0x00, 0x67, 0x80, 0x69, 0x74, 0x80, 0x04, 0x00, 0x00, 0x15, + 0x40, 0x82, 0x60, 0x00, 0x58, 0x80, 0xd0, 0x09, 0x80, 0x68, 0xd1, 0xc0, + 0x04, 0x02, 0x00, 0x05, 0x58, 0x80, 0xd2, 0x03, 0x82, 0x69, 0x74, 0x80, + 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x02, 0x04, 0x01, 0xff, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa1, 0x6d, 0x04, 0x01, 0xfe, 0xfd, + 0x82, 0x81, 0x04, 0x00, 0x00, 0x00, 0x00, 0x24, 0x41, 0x54, 0x00, 0x00, + 0x80, 0x81, 0x74, 0x80, 0x04, 0x00, 0x17, 0xea, 0x04, 0x01, 0xf0, 0x03, + 0x41, 0x51, 0x00, 0x00, 0x04, 0x01, 0xf7, 0xe4, 0x40, 0x86, 0x60, 0x00, + 0x40, 0x8a, 0x58, 0x00, 0x40, 0x8e, 0x68, 0x00, 0x40, 0x92, 0x70, 0x00, + 0x58, 0x9d, 0x20, 0x04, 0x58, 0x9d, 0x18, 0x03, 0x58, 0x9d, 0x10, 0x02, + 0x58, 0x9d, 0x08, 0x01, 0x58, 0x9d, 0x00, 0x00, 0x82, 0x9d, 0x3c, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x1c, 0x01, 0xf0, 0x00, 0x80, 0x9d, 0x38, 0x40, + 0x48, 0x81, 0x38, 0x00, 0x59, 0x30, 0xdc, 0x06, 0x82, 0x6d, 0x74, 0x80, + 0x00, 0x00, 0x00, 0x11, 0x83, 0xf1, 0x75, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x26, 0x82, 0xb9, 0x74, 0x80, 0x0c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x23, 0x82, 0x6d, 0x74, 0x80, 0x00, 0x00, 0x00, 0x11, + 0x83, 0xf1, 0x75, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1d, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xd1, 0xbe, 0x80, 0x6c, 0xd4, 0x00, + 0x50, 0x68, 0xd0, 0x00, 0x08, 0x69, 0xf0, 0x00, 0x00, 0x10, 0xd1, 0xd5, + 0x00, 0x10, 0xd2, 0x22, 0x00, 0x10, 0xd1, 0xe0, 0x00, 0x10, 0xd1, 0xf8, + 0x00, 0x10, 0xd2, 0x22, 0x00, 0x10, 0xd1, 0xdc, 0x00, 0x10, 0xd2, 0x43, + 0x00, 0x10, 0xd1, 0xd5, 0x00, 0x10, 0xd1, 0xd0, 0x00, 0x10, 0xd2, 0x59, + 0x00, 0x10, 0xd2, 0x35, 0x00, 0x10, 0xd1, 0xd0, 0x00, 0x10, 0xd1, 0xd0, + 0x00, 0x10, 0xd1, 0xd0, 0x00, 0x10, 0xd1, 0xd0, 0x00, 0x10, 0xd1, 0xd5, + 0x00, 0x10, 0xd1, 0xef, 0x00, 0x10, 0xd1, 0xe8, 0x40, 0x6c, 0xd0, 0x00, + 0x41, 0x78, 0xd8, 0x00, 0x40, 0x6c, 0xe0, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xec, 0x04, 0x01, 0xf0, 0xaa, 0x40, 0x6c, 0xd0, 0x00, + 0x41, 0x78, 0xd8, 0x00, 0x40, 0x6c, 0xe0, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xec, 0x04, 0x01, 0xf0, 0xa4, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xcd, 0xa7, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x07, 0xf6, + 0x59, 0x32, 0x58, 0x08, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x34, + 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x02, 0x00, 0x88, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x71, 0x98, 0x04, 0x01, 0xf0, 0x98, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xcd, 0xa7, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x07, 0xea, + 0x59, 0x32, 0x58, 0x17, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x37, + 0x59, 0x32, 0x58, 0x08, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x34, + 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x07, 0xf2, 0x49, 0x42, 0x5a, 0x06, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4a, 0x76, 0x04, 0x01, 0xf7, 0xee, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xcd, 0xa7, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x07, 0xda, 0x8d, 0x3e, 0x7d, 0x00, 0x04, 0x00, 0x00, 0x09, + 0x59, 0x30, 0xd0, 0x17, 0x41, 0x48, 0x00, 0x00, 0x80, 0x69, 0x74, 0x80, + 0x04, 0x02, 0x07, 0xd4, 0x59, 0x30, 0xd0, 0x18, 0x41, 0x4c, 0x00, 0x00, + 0x80, 0x69, 0x74, 0x80, 0x04, 0x02, 0x07, 0xd0, 0x59, 0x30, 0xd2, 0x03, + 0x82, 0x69, 0x74, 0x80, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x73, + 0x59, 0x31, 0x00, 0x08, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x34, + 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x07, 0xd7, 0x4a, 0x01, 0x02, 0x04, + 0x00, 0x00, 0x01, 0x03, 0x58, 0x80, 0xd4, 0x08, 0x8c, 0x68, 0xd5, 0x12, + 0x04, 0x02, 0x00, 0x65, 0x49, 0x41, 0x02, 0x06, 0x49, 0x79, 0x00, 0x09, + 0x40, 0x82, 0x58, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9e, 0x7b, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x8d, 0xeb, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x89, 0xe1, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4a, 0x76, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x89, 0x3e, 0x04, 0x01, 0xf7, 0xc4, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xcd, 0xa7, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x07, 0xb0, 0x59, 0x30, 0xd4, 0x03, 0x82, 0x69, 0x74, 0x80, + 0x00, 0x00, 0x00, 0x43, 0x04, 0x00, 0x07, 0xac, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0xd0, 0x7d, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x02, 0x00, 0x48, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x89, 0x60, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x07, 0xb4, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x78, 0xbe, + 0x04, 0x01, 0xf7, 0xb1, 0x59, 0x30, 0xd2, 0x03, 0x82, 0x69, 0x74, 0x80, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x37, 0x59, 0x32, 0x58, 0x08, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x34, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x07, 0xa8, 0x49, 0x42, 0x5a, 0x06, 0x49, 0x7a, 0x5c, 0x09, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4a, 0x76, 0x04, 0x01, 0xf7, 0xa3, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xcd, 0xa7, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x07, 0x8f, 0x59, 0x30, 0xd2, 0x03, 0x82, 0x69, 0x74, 0x80, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x28, 0x59, 0x32, 0x58, 0x08, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x34, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x07, 0x96, 0x49, 0x42, 0x5a, 0x06, 0x49, 0x7a, 0x5c, 0x09, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9e, 0x7b, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x8d, 0xeb, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4a, 0x76, + 0x04, 0x01, 0xf7, 0x8d, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5e, 0xbc, + 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x02, 0x07, 0x79, 0x59, 0x30, 0xd2, 0x03, + 0x82, 0x69, 0x74, 0x80, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x07, 0x75, + 0x82, 0x69, 0x74, 0x80, 0x00, 0x00, 0x00, 0x03, 0x04, 0x02, 0x07, 0x72, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x63, 0xa0, 0x59, 0x32, 0x58, 0x08, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x88, 0x34, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x07, 0x7b, 0x04, 0x01, 0xf7, 0x8a, 0x49, 0x42, 0x5a, 0x06, + 0x49, 0x7a, 0x5c, 0x09, 0x04, 0x01, 0xf7, 0xaf, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x0d, 0xdb, 0x04, 0x01, 0xf7, 0xc8, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x0d, 0xdb, 0x04, 0x01, 0xf7, 0xd7, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x1c, 0x32, 0x04, 0x01, 0xf7, 0xb7, 0x58, 0x82, 0x58, 0x09, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x07, 0x37, 0x04, 0x01, 0xf7, 0x99, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x0d, 0xdb, 0x04, 0x01, 0xf7, 0x8c, + 0x58, 0x9d, 0x00, 0x00, 0x80, 0x9d, 0x38, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9c, 0x74, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x02, 0x00, 0x02, 0x04, 0x01, 0xf0, 0x03, 0x59, 0x32, 0x68, 0x09, + 0x04, 0x01, 0xff, 0x21, 0x1c, 0x01, 0xf0, 0x00, 0x82, 0x9d, 0x3c, 0x80, + 0x00, 0x00, 0x00, 0x06, 0x48, 0x81, 0x38, 0x00, 0x48, 0x85, 0x38, 0x01, + 0x48, 0x89, 0x38, 0x02, 0x48, 0x8d, 0x38, 0x03, 0x48, 0x91, 0x38, 0x04, + 0x48, 0x95, 0x38, 0x05, 0x41, 0x31, 0x10, 0x00, 0x41, 0x2d, 0x20, 0x00, + 0x41, 0x35, 0x28, 0x00, 0x49, 0x33, 0xc8, 0x57, 0x49, 0x47, 0xc8, 0x57, + 0x49, 0x43, 0xc8, 0x57, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x6d, + 0x40, 0xc5, 0x18, 0x00, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x9b, 0x79, + 0x41, 0x31, 0x08, 0x00, 0x81, 0x32, 0x61, 0xc0, 0x04, 0x00, 0x00, 0x48, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0xb8, 0x81, 0x31, 0x74, 0x80, + 0x04, 0x00, 0x00, 0x44, 0x59, 0xa8, 0xd0, 0x0d, 0x80, 0x68, 0xd0, 0x40, + 0x42, 0x01, 0x00, 0x00, 0x00, 0x10, 0xd8, 0xd4, 0x40, 0x68, 0x00, 0x00, + 0x81, 0x65, 0x74, 0x80, 0x04, 0x00, 0x00, 0x43, 0x41, 0x58, 0x00, 0x00, + 0x80, 0x81, 0x74, 0x80, 0x04, 0x02, 0x10, 0x0c, 0x40, 0x82, 0x60, 0x00, + 0x40, 0x80, 0x00, 0x00, 0x80, 0x85, 0x74, 0x80, 0x04, 0x00, 0x00, 0x03, + 0x40, 0x84, 0xd0, 0x00, 0x04, 0x01, 0xff, 0xcf, 0x82, 0x81, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x24, 0x41, 0x58, 0x00, 0x00, 0x80, 0x81, 0x74, 0x80, + 0x04, 0x00, 0x17, 0xf6, 0x41, 0x54, 0x00, 0x00, 0x80, 0x81, 0x74, 0x80, + 0x04, 0x02, 0x10, 0x12, 0x8d, 0x3e, 0x7d, 0x18, 0x04, 0x00, 0x00, 0x10, + 0x59, 0xa8, 0xd0, 0x63, 0x59, 0xa8, 0x00, 0x67, 0x80, 0x69, 0x74, 0x80, + 0x04, 0x00, 0x00, 0x0c, 0x40, 0x82, 0x60, 0x00, 0x58, 0x80, 0xd0, 0x09, + 0x80, 0x68, 0xd1, 0xc0, 0x04, 0x00, 0x00, 0x0e, 0x40, 0x84, 0xd0, 0x00, + 0x04, 0x01, 0xff, 0xbb, 0x82, 0x81, 0x04, 0x00, 0x00, 0x00, 0x00, 0x24, + 0x41, 0x54, 0x00, 0x00, 0x80, 0x81, 0x74, 0x80, 0x04, 0x00, 0x17, 0xf0, + 0x40, 0x8a, 0x60, 0x00, 0x40, 0x92, 0x58, 0x00, 0x40, 0x96, 0x68, 0x00, + 0x80, 0x8d, 0x70, 0x40, 0x04, 0x00, 0x00, 0x1e, 0x04, 0x01, 0xf0, 0x23, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x43, 0x3e, 0x40, 0xc6, 0x68, 0x00, + 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x07, 0xf1, 0x58, 0xc4, 0xd0, 0x02, + 0x59, 0x30, 0xd8, 0x1e, 0x82, 0x68, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x80, 0x6d, 0x74, 0x80, 0x04, 0x02, 0x07, 0xeb, 0x59, 0x30, 0xd2, 0x03, + 0x82, 0x69, 0x74, 0x80, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x11, + 0x49, 0x36, 0x60, 0x09, 0x04, 0x01, 0xfe, 0xc6, 0x82, 0x81, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x24, 0x04, 0x01, 0xf7, 0xe4, 0x59, 0xa8, 0xd0, 0x0d, + 0x42, 0x01, 0x00, 0x00, 0x00, 0x10, 0xd8, 0xd4, 0x40, 0x68, 0x00, 0x00, + 0x81, 0x65, 0x74, 0x80, 0x04, 0x02, 0x07, 0xbf, 0x41, 0x51, 0x00, 0x00, + 0x04, 0x01, 0xf7, 0xcb, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x64, 0x5f, + 0x04, 0x01, 0xf0, 0x04, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0xa1, 0x6d, + 0x04, 0x01, 0xf7, 0xee, 0x58, 0x9d, 0x28, 0x05, 0x58, 0x9d, 0x20, 0x04, + 0x58, 0x9d, 0x18, 0x03, 0x58, 0x9d, 0x10, 0x02, 0x58, 0x9d, 0x08, 0x01, + 0x58, 0x9d, 0x00, 0x00, 0x82, 0x9d, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x1c, 0x01, 0xf0, 0x00, 0x42, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x14, 0xbe, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x5c, 0x88, 0x59, 0xc4, 0xd0, 0xa3, 0x84, 0x68, 0xd5, 0x06, + 0x48, 0x6b, 0x88, 0xa3, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xb9, + 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x02, 0x00, 0x05, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0xdb, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x00, 0x6a, + 0x59, 0xc4, 0xd0, 0xa3, 0x82, 0x68, 0xd5, 0x00, 0xbe, 0x7f, 0xff, 0xff, + 0x48, 0x6b, 0x88, 0xa3, 0x42, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x3e, 0xc0, 0x59, 0xc4, 0xd0, 0xa3, + 0x82, 0x68, 0xd5, 0x40, 0x00, 0x01, 0x80, 0x00, 0x84, 0x68, 0xd5, 0x1c, + 0x48, 0x6b, 0x88, 0xa3, 0x59, 0xc4, 0xd0, 0xa3, 0x84, 0x68, 0xd5, 0x20, + 0x48, 0x6b, 0x88, 0xa3, 0x49, 0x7b, 0x88, 0x08, 0x59, 0xc4, 0xd0, 0x06, + 0x82, 0x68, 0xd5, 0x00, 0xfb, 0xff, 0xff, 0x0e, 0x48, 0x6b, 0x88, 0x06, + 0x49, 0x7b, 0x28, 0x22, 0x49, 0x7b, 0x28, 0x23, 0x42, 0x00, 0xd0, 0x00, + 0x00, 0x00, 0x01, 0xf4, 0x42, 0x00, 0xd8, 0x00, 0x00, 0x10, 0xd4, 0x90, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5b, 0x5d, 0x4a, 0x03, 0x88, 0x05, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0x79, + 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x00, 0x21, 0x42, 0x00, 0xd0, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0x3f, + 0x42, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x17, 0xf3, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0x7e, + 0x4a, 0x03, 0x50, 0x3b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0xb9, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x00, 0x2a, + 0x59, 0xc4, 0xd0, 0xa4, 0x82, 0x68, 0xd5, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x82, 0x69, 0x74, 0x80, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x03, + 0x4a, 0x03, 0x88, 0x05, 0x04, 0x00, 0x00, 0x00, 0x59, 0xc4, 0xd0, 0xa3, + 0x82, 0x68, 0xd5, 0x40, 0x00, 0x01, 0xc0, 0x00, 0x48, 0x6b, 0x88, 0xa3, + 0x59, 0xc4, 0xd0, 0xa3, 0x84, 0x68, 0xd5, 0x20, 0x48, 0x6b, 0x88, 0xa3, + 0x04, 0x01, 0xf0, 0x4b, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0x89, + 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x00, 0x06, 0x41, 0x78, 0xd0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0x3f, 0x41, 0x78, 0xd0, 0x00, + 0x04, 0x01, 0xf7, 0xde, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0x99, + 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x02, 0x00, 0x25, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x15, 0xa9, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x00, 0x34, + 0x59, 0xa8, 0xd0, 0x46, 0x80, 0x68, 0xd1, 0xc0, 0x04, 0x00, 0x07, 0xd5, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0xb8, 0x4a, 0x03, 0x50, 0x3b, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x32, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0xdb, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x02, 0x07, 0xd4, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xca, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x00, 0x18, 0x4a, 0x03, 0x50, 0x30, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0x16, 0x04, 0x01, 0xf0, 0x25, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xca, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x00, 0x15, 0x59, 0xc4, 0xd0, 0xa3, 0x84, 0x68, 0xd5, 0x70, + 0x84, 0x68, 0xd5, 0x32, 0x48, 0x6b, 0x88, 0xa3, 0x4a, 0x03, 0x88, 0x08, + 0x00, 0x00, 0x00, 0x08, 0x04, 0x01, 0xf7, 0x9e, 0x42, 0x00, 0xd0, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0x3f, + 0x42, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x01, 0xf7, 0xaf, + 0x40, 0xc4, 0xd0, 0x00, 0x40, 0xc4, 0xd8, 0x00, 0x40, 0xc4, 0xe0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xec, 0x04, 0x01, 0xf7, 0xbb, + 0x40, 0xc4, 0xd0, 0x00, 0x40, 0xc4, 0xd8, 0x00, 0x40, 0xc4, 0xe0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xec, 0x04, 0x01, 0xf7, 0x8b, + 0x40, 0xc4, 0xd0, 0x00, 0x40, 0xc4, 0xd8, 0x00, 0x40, 0xc4, 0xe0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x04, 0xec, 0x04, 0x01, 0xf7, 0x9f, + 0x1c, 0x01, 0xf0, 0x00, 0x59, 0x94, 0xd0, 0x22, 0x59, 0x94, 0x00, 0x23, + 0x80, 0x68, 0xd5, 0x40, 0x41, 0x78, 0xd8, 0x00, 0x80, 0x68, 0xd1, 0xc0, + 0x04, 0x02, 0x00, 0x03, 0x42, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x40, 0x6d, 0x88, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x17, 0x7b, 0x4a, 0x03, 0x50, 0x3b, 0x00, 0x00, 0x00, 0x02, + 0x49, 0x7b, 0x50, 0x46, 0x59, 0xc4, 0xd0, 0xa3, 0x84, 0x68, 0xd5, 0x20, + 0x48, 0x6b, 0x88, 0xa3, 0x49, 0x7b, 0x28, 0x22, 0x49, 0x7b, 0x28, 0x23, + 0x42, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x42, 0x00, 0xd8, 0x00, + 0x00, 0x10, 0xd4, 0x90, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x5b, 0x5d, + 0x1c, 0x01, 0xf0, 0x00, 0x04, 0x01, 0xff, 0xe5, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x00, 0x04, 0x4a, 0x03, 0x50, 0x3b, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x01, 0xf0, 0x1f, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0xa9, + 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x00, 0x04, 0x59, 0xa8, 0xd0, 0x46, + 0x80, 0x68, 0xd1, 0xc0, 0x04, 0x02, 0x00, 0x08, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x18, 0x44, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x02, 0x00, 0x02, + 0x04, 0x01, 0xf0, 0x13, 0x04, 0x01, 0xff, 0xdd, 0x04, 0x01, 0xf0, 0x11, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0xb8, 0x59, 0xa8, 0xd0, 0x45, + 0x8c, 0x68, 0xd5, 0x1e, 0x04, 0x00, 0x07, 0xf9, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x4c, 0xca, 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x02, 0x00, 0x03, + 0x04, 0x01, 0xff, 0xd2, 0x04, 0x01, 0xf0, 0x06, 0x4a, 0x03, 0x50, 0x30, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0x16, + 0x04, 0x01, 0xf7, 0xfa, 0x1c, 0x01, 0xf0, 0x00, 0x4a, 0x03, 0x50, 0x3b, + 0x00, 0x00, 0x00, 0x03, 0x49, 0x7b, 0x88, 0x85, 0x1c, 0x01, 0xf0, 0x00, + 0x42, 0x02, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x49, 0x7b, 0x50, 0x3b, + 0x4a, 0x03, 0x88, 0x05, 0x00, 0x00, 0x00, 0x01, 0x49, 0x7b, 0x28, 0x22, + 0x49, 0x7b, 0x28, 0x23, 0x49, 0x7b, 0x88, 0x85, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0xc4, 0xd0, 0x05, 0x82, 0x68, 0xd5, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x04, 0x02, 0x00, 0x03, 0x48, 0x6b, 0x88, 0x85, 0x04, 0x01, 0xf0, 0x06, + 0x59, 0xc4, 0xd0, 0x06, 0x82, 0x68, 0xd5, 0x40, 0x00, 0x00, 0x00, 0xf1, + 0x48, 0x6b, 0x88, 0x06, 0x04, 0x01, 0xff, 0xed, 0x1c, 0x01, 0xf0, 0x00, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xdb, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x00, 0x05, 0x59, 0xa8, 0xd0, 0x2f, 0x82, 0x69, 0x74, 0x80, + 0x00, 0x00, 0xaa, 0xaa, 0x04, 0x00, 0x00, 0x0c, 0x49, 0x7b, 0x50, 0x2f, + 0x59, 0xc4, 0xd0, 0x06, 0x82, 0x68, 0xd5, 0x40, 0x04, 0x00, 0x00, 0x01, + 0x48, 0x6b, 0x88, 0x06, 0x8d, 0x0e, 0x1d, 0x06, 0x04, 0x02, 0x00, 0x08, + 0x59, 0xc4, 0xd0, 0xa3, 0x84, 0x68, 0xd5, 0x46, 0x48, 0x6b, 0x88, 0xa3, + 0x04, 0x01, 0xf0, 0x04, 0x4a, 0x03, 0x50, 0x0f, 0x00, 0xff, 0xff, 0xff, + 0x04, 0x01, 0xf7, 0xf3, 0x04, 0x01, 0xff, 0xd5, 0x1c, 0x01, 0xf0, 0x00, + 0x82, 0x9d, 0x3c, 0x80, 0x00, 0x00, 0x00, 0x02, 0x48, 0x81, 0x38, 0x00, + 0x48, 0x85, 0x38, 0x01, 0x04, 0x01, 0xff, 0x8b, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x02, 0x00, 0x20, 0x4a, 0x03, 0x88, 0x05, 0x00, 0x00, 0x00, 0xf0, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x18, 0x44, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x00, 0x13, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xca, + 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x02, 0x00, 0x18, 0x59, 0xc4, 0xd0, 0xa4, + 0x82, 0x68, 0xd5, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x82, 0x69, 0x74, 0x80, + 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x06, 0x59, 0xc4, 0xd0, 0x05, + 0x82, 0x69, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x8c, 0x68, 0xd5, 0x34, + 0x04, 0x00, 0x00, 0x0f, 0x04, 0x01, 0xff, 0xcc, 0x49, 0x7b, 0x88, 0x85, + 0x04, 0x01, 0xf0, 0x24, 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0xa9, + 0x80, 0xc5, 0x89, 0xc0, 0x04, 0x00, 0x07, 0xfb, 0x59, 0xa8, 0xd0, 0x46, + 0x80, 0x68, 0xd1, 0xc0, 0x04, 0x00, 0x07, 0xf8, 0x04, 0x01, 0xff, 0xa9, + 0x04, 0x01, 0xf0, 0x1b, 0x04, 0x01, 0xff, 0xb4, 0x04, 0x01, 0xf0, 0x19, + 0x59, 0x95, 0x08, 0x22, 0x80, 0x85, 0x70, 0x40, 0x04, 0x02, 0x07, 0xf1, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4c, 0xdb, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x07, 0xed, 0x4a, 0x03, 0x88, 0x05, 0x00, 0x00, 0x00, 0xf0, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x4d, 0x1a, 0x4a, 0x03, 0x50, 0x2f, + 0x00, 0x00, 0xaa, 0xaa, 0x48, 0x83, 0x50, 0x30, 0x59, 0xc4, 0xd0, 0xa3, + 0x84, 0x68, 0xd5, 0x46, 0x48, 0x6b, 0x88, 0xa3, 0x40, 0x86, 0xd8, 0x00, + 0x48, 0x83, 0x50, 0x3b, 0x48, 0x87, 0x88, 0x05, 0x48, 0x83, 0x28, 0x22, + 0x48, 0x83, 0x28, 0x23, 0x04, 0x01, 0xff, 0x9c, 0x04, 0x01, 0xf7, 0xdc, + 0x58, 0x9d, 0x08, 0x01, 0x58, 0x9d, 0x00, 0x00, 0x82, 0x9d, 0x3c, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x1c, 0x01, 0xf0, 0x00, 0x59, 0xa9, 0x70, 0x3b, + 0x48, 0xbb, 0xc8, 0x56, 0x42, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x14, 0xbe, 0x49, 0x7b, 0x50, 0x3b, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x15, 0xa9, 0x80, 0xc5, 0x89, 0xc0, + 0x04, 0x00, 0x00, 0x0e, 0x59, 0xa8, 0xd0, 0x4f, 0x80, 0x68, 0xd1, 0xc0, + 0x04, 0x02, 0x00, 0x08, 0x80, 0x68, 0xd1, 0xc0, 0x04, 0x02, 0x00, 0x09, + 0x4a, 0x03, 0x50, 0x4f, 0x00, 0x00, 0x00, 0x0a, 0x4a, 0x03, 0x50, 0x46, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0xf0, 0x04, 0x80, 0x68, 0xd0, 0x40, + 0x48, 0x6b, 0x50, 0x4f, 0x04, 0x01, 0xf7, 0xf7, 0x49, 0x7b, 0x88, 0x85, + 0x02, 0x01, 0xf8, 0x00, 0x00, 0x10, 0x05, 0x99, 0x1c, 0x01, 0xf0, 0x00, + 0x59, 0xa8, 0xd0, 0x3b, 0x82, 0x69, 0x74, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x83, 0xf1, 0x75, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0c, + 0x80, 0x69, 0x70, 0x40, 0x04, 0x00, 0x00, 0x12, 0x80, 0x69, 0x70, 0x40, + 0x04, 0x00, 0x10, 0x0e, 0x82, 0x69, 0x74, 0x80, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x00, 0x00, 0x0f, 0x82, 0x69, 0x74, 0x80, 0x00, 0x00, 0x00, 0x03, + 0x04, 0x00, 0x00, 0x0e, 0x04, 0x01, 0xf0, 0x0e, 0x42, 0x00, 0xd8, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x41, 0x78, 0xe0, 0x00, 0x02, 0x01, 0xf8, 0x00, + 0x00, 0x10, 0x04, 0xec, 0x04, 0x01, 0xf0, 0x08, 0x04, 0x01, 0xfe, 0x76, + 0x04, 0x01, 0xf0, 0x06, 0x04, 0x01, 0xff, 0x2e, 0x04, 0x01, 0xf0, 0x04, + 0x04, 0x01, 0xff, 0x82, 0x04, 0x01, 0xf0, 0x02, 0x04, 0x01, 0xff, 0xc7, + 0x1c, 0x01, 0xf0, 0x00, 0x49, 0x7b, 0x28, 0x23, 0x1c, 0x01, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, + 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0b, + 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0e, + 0x00, 0x00, 0x00, 0x0f, 0x94, 0x1b, 0xc5, 0x02, 0x02, 0x80, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x07, 0x42, + 0x07, 0x3f, 0xca, 0x5a, 0x07, 0x05, 0xa5, 0xa5, 0x01, 0x92, 0x80, 0x09, + 0x07, 0x0f, 0xf0, 0xe1, 0x03, 0x80, 0x00, 0x06, 0x04, 0x95, 0x80, 0x10, + 0x05, 0x30, 0x80, 0x00, 0x05, 0x00, 0x80, 0x00, 0x06, 0x00, 0x90, 0x2f, + 0x04, 0xa0, 0x04, 0xf2, 0x02, 0x02, 0xf0, 0x51, 0x04, 0x2e, 0x40, 0x20, + 0x01, 0x8f, 0x02, 0x1e, 0x03, 0x3e, 0x50, 0x00, 0x03, 0x02, 0x00, 0x00, + 0x07, 0x8d, 0x00, 0x18, 0x05, 0x93, 0x04, 0x28, 0x00, 0x92, 0x04, 0x2a, + 0x02, 0x8a, 0x03, 0x19, 0x07, 0x8b, 0x03, 0x17, 0x04, 0x8e, 0x80, 0x10, + 0x06, 0x78, 0xaa, 0xe5, 0x06, 0x00, 0x00, 0x01, 0x07, 0x81, 0x81, 0x74, + 0x04, 0x00, 0x10, 0xe6, 0x04, 0x48, 0xe0, 0xe6, 0x04, 0x81, 0x80, 0x10, + 0x00, 0x2f, 0xb0, 0x08, 0x04, 0x48, 0xe0, 0xe6, 0x04, 0x81, 0x80, 0x10, + 0x06, 0x0f, 0xf0, 0xe6, 0x00, 0x58, 0x04, 0x01, 0x05, 0x48, 0x80, 0xff, + 0x04, 0x81, 0x80, 0x10, 0x02, 0x2a, 0x50, 0x01, 0x03, 0x04, 0x30, 0xd4, + 0x06, 0x78, 0x00, 0x43, 0x03, 0x0e, 0x00, 0x00, 0x03, 0x04, 0x50, 0xff, + 0x06, 0x78, 0x00, 0x43, 0x03, 0x01, 0x90, 0x00, 0x05, 0x81, 0x85, 0xeb, + 0x02, 0x7c, 0x00, 0x45, 0x03, 0x02, 0x00, 0x00, 0x06, 0x81, 0x00, 0x37, + 0x02, 0x7c, 0x00, 0x45, 0x03, 0x04, 0x00, 0x00, 0x06, 0x81, 0x00, 0xc7, + 0x02, 0x7c, 0x00, 0x45, 0x03, 0x08, 0x00, 0x00, 0x06, 0x81, 0x06, 0x43, + 0x04, 0x90, 0x80, 0x37, 0x02, 0x91, 0x05, 0xe9, 0x01, 0x04, 0x10, 0xa6, + 0x03, 0x79, 0xff, 0x41, 0x03, 0x7f, 0xff, 0xff, 0x07, 0x2d, 0x60, 0x00, + 0x07, 0x60, 0x12, 0x41, 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x09, + 0x05, 0x60, 0x04, 0x00, 0x05, 0x0f, 0x80, 0xff, 0x05, 0x6c, 0x04, 0xff, + 0x06, 0x81, 0x06, 0x01, 0x07, 0x3f, 0xa0, 0x09, 0x06, 0x00, 0x00, 0x01, + 0x02, 0x79, 0xff, 0x02, 0x07, 0x00, 0xff, 0xff, 0x07, 0x0f, 0xf0, 0xd1, + 0x01, 0x79, 0xfe, 0xff, 0x07, 0x00, 0xff, 0xff, 0x04, 0x5c, 0x04, 0x02, + 0x04, 0x81, 0x86, 0x01, 0x06, 0x0f, 0xf0, 0xd0, 0x01, 0x79, 0xfe, 0xff, + 0x07, 0x00, 0xff, 0xff, 0x05, 0x7d, 0xfe, 0xff, 0x07, 0x00, 0xff, 0xff, + 0x06, 0x81, 0x05, 0xe3, 0x05, 0x60, 0x0e, 0x41, 0x05, 0x0f, 0x80, 0xff, + 0x03, 0x2f, 0xa0, 0x69, 0x07, 0x48, 0x00, 0x00, 0x07, 0x81, 0x05, 0xf5, + 0x06, 0x78, 0x00, 0x43, 0x07, 0x00, 0x00, 0xf0, 0x07, 0x81, 0x00, 0x5f, + 0x03, 0x7c, 0x00, 0xff, 0x06, 0x00, 0x00, 0x10, 0x07, 0x81, 0x00, 0x5f, + 0x02, 0x80, 0x05, 0xf1, 0x03, 0x79, 0xff, 0x00, 0x07, 0x0f, 0xff, 0xff, + 0x06, 0x78, 0x00, 0x43, 0x07, 0xf0, 0x00, 0x00, 0x07, 0x5a, 0x00, 0x00, + 0x02, 0x0e, 0xf0, 0x01, 0x03, 0x86, 0x05, 0xf3, 0x05, 0x48, 0x40, 0x00, + 0x02, 0xa1, 0x81, 0x9e, 0x06, 0x2d, 0x60, 0x01, 0x00, 0x2f, 0xb0, 0x01, + 0x07, 0x0f, 0xf0, 0x69, 0x01, 0x86, 0x80, 0x72, 0x06, 0x0f, 0xf0, 0x79, + 0x05, 0x5c, 0x04, 0x41, 0x06, 0x81, 0x00, 0x10, 0x01, 0x2f, 0xb0, 0x00, + 0x06, 0x05, 0x60, 0xfb, 0x03, 0x80, 0x00, 0x78, 0x06, 0x0f, 0xf0, 0x79, + 0x02, 0x86, 0x81, 0x98, 0x07, 0x0f, 0xf0, 0x69, 0x05, 0x5c, 0x04, 0x41, + 0x06, 0x81, 0x00, 0x10, 0x06, 0x05, 0x60, 0xfb, 0x04, 0x00, 0xd0, 0xd0, + 0x06, 0x2d, 0x60, 0x02, 0x06, 0x48, 0x30, 0x0d, 0x06, 0x81, 0x00, 0x86, + 0x07, 0x0f, 0xf0, 0xd1, 0x06, 0x2d, 0x60, 0x01, 0x04, 0x5c, 0x04, 0x0b, + 0x06, 0x81, 0x00, 0x89, 0x05, 0x48, 0x80, 0x00, 0x04, 0x81, 0x80, 0x86, + 0x07, 0x2e, 0x50, 0x0c, 0x00, 0x20, 0x80, 0x01, 0x04, 0xa0, 0x04, 0xf7, + 0x02, 0x80, 0x00, 0x10, 0x06, 0x2d, 0x60, 0x01, 0x07, 0xf0, 0x00, 0x00, + 0x07, 0xf0, 0x00, 0x00, 0x07, 0x0f, 0xf0, 0xd1, 0x01, 0x79, 0xfe, 0xff, + 0x07, 0x00, 0x00, 0xff, 0x05, 0x5c, 0x04, 0x0c, 0x05, 0x81, 0x80, 0xbb, + 0x00, 0x07, 0xb0, 0x01, 0x03, 0x07, 0x90, 0x41, 0x03, 0x07, 0xa0, 0x00, + 0x06, 0x60, 0x0a, 0x79, 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x0a, + 0x06, 0x00, 0x00, 0x10, 0x07, 0x2d, 0x50, 0x03, 0x07, 0x8d, 0x00, 0x96, + 0x03, 0x07, 0xc0, 0x03, 0x00, 0x07, 0xd0, 0x04, 0x01, 0x07, 0xe0, 0x05, + 0x03, 0x07, 0xf0, 0x06, 0x02, 0x08, 0x00, 0x07, 0x00, 0x08, 0x10, 0x08, + 0x01, 0x08, 0x20, 0x09, 0x03, 0x08, 0x30, 0x0a, 0x00, 0x08, 0x40, 0x0b, + 0x03, 0x08, 0x50, 0x0c, 0x06, 0x8d, 0x00, 0xa1, 0x06, 0x78, 0x00, 0x7a, + 0x07, 0xf0, 0x00, 0x00, 0x01, 0x08, 0x80, 0xff, 0x03, 0x38, 0x60, 0x00, + 0x03, 0x01, 0x00, 0x00, 0x07, 0x2e, 0x63, 0x00, 0x02, 0x0e, 0xf0, 0x7f, + 0x02, 0x86, 0x00, 0x10, 0x07, 0x0f, 0xf0, 0x7d, 0x04, 0x50, 0x04, 0x7c, + 0x05, 0x0f, 0x80, 0xff, 0x00, 0x2f, 0xa8, 0x19, 0x06, 0x8d, 0x00, 0xae, + 0x02, 0x08, 0x00, 0x01, 0x00, 0x08, 0x10, 0x02, 0x04, 0x48, 0x80, 0x7a, + 0x06, 0x81, 0x00, 0xb5, 0x03, 0x79, 0xff, 0x03, 0x07, 0x00, 0x00, 0xff, + 0x01, 0x08, 0x20, 0x03, 0x06, 0x8d, 0x00, 0xb6, 0x02, 0x38, 0x60, 0x04, + 0x03, 0x01, 0x00, 0x00, 0x07, 0x2e, 0x6c, 0x00, 0x02, 0x80, 0x00, 0x10, + 0x06, 0x78, 0x00, 0x43, 0x07, 0x00, 0x00, 0xf0, 0x07, 0x81, 0x05, 0xfc, + 0x05, 0x00, 0x20, 0xff, 0x02, 0x7c, 0x00, 0x02, 0x06, 0x00, 0x00, 0x10, + 0x07, 0x81, 0x00, 0xc3, 0x03, 0x80, 0x05, 0xfc, 0x07, 0x00, 0xc0, 0xd1, + 0x03, 0x79, 0xff, 0x0c, 0x07, 0x00, 0x00, 0xff, 0x03, 0x80, 0x00, 0x8e, + 0x02, 0x04, 0xa0, 0x51, 0x06, 0x78, 0x00, 0x43, 0x07, 0x00, 0x00, 0xf0, + 0x03, 0x7c, 0x00, 0xff, 0x06, 0x00, 0x00, 0x10, 0x07, 0x81, 0x81, 0x6a, + 0x07, 0x2d, 0x60, 0x00, 0x00, 0x94, 0x85, 0xe5, 0x05, 0x0f, 0xb0, 0x56, + 0x04, 0x48, 0x80, 0xe6, 0x04, 0x81, 0x80, 0x10, 0x06, 0x0f, 0xf0, 0xd0, + 0x01, 0x79, 0xfe, 0xff, 0x07, 0x00, 0xff, 0xff, 0x05, 0x7d, 0xfe, 0xff, + 0x07, 0x00, 0xff, 0xff, 0x06, 0x81, 0x05, 0xe3, 0x04, 0xa0, 0x02, 0x15, + 0x03, 0x49, 0xc0, 0xe4, 0x07, 0x81, 0x81, 0x1d, 0x07, 0x0f, 0xf0, 0x93, + 0x05, 0x00, 0x10, 0xff, 0x07, 0x0f, 0xf0, 0x93, 0x04, 0x5c, 0x04, 0x01, + 0x05, 0x81, 0x80, 0xdb, 0x02, 0x04, 0x60, 0x92, 0x04, 0x00, 0x20, 0x46, + 0x04, 0x60, 0x02, 0x02, 0x00, 0x54, 0x04, 0x01, 0x04, 0x82, 0x80, 0xe6, + 0x04, 0x50, 0x04, 0x25, 0x07, 0x00, 0x60, 0xff, 0x07, 0x30, 0xff, 0xff, + 0x07, 0x00, 0x00, 0x0f, 0x07, 0x42, 0x00, 0x0f, 0x05, 0x81, 0x01, 0x90, + 0x06, 0xa0, 0x05, 0xcb, 0x06, 0x48, 0xa0, 0x02, 0x04, 0x81, 0x80, 0xe9, + 0x00, 0x04, 0x70, 0x89, 0x07, 0x0f, 0xf0, 0x47, 0x04, 0x5c, 0x04, 0x43, + 0x07, 0x78, 0x00, 0xff, 0x07, 0xf0, 0x00, 0x00, 0x07, 0x81, 0x81, 0x8e, + 0x07, 0x78, 0x00, 0x47, 0x05, 0x00, 0xe0, 0x00, 0x05, 0x81, 0x85, 0xd2, + 0x07, 0x0f, 0xf0, 0x06, 0x01, 0x86, 0x01, 0x17, 0x01, 0x79, 0xfe, 0x47, + 0x07, 0x00, 0x00, 0x0f, 0x01, 0x04, 0x80, 0xff, 0x05, 0x6c, 0x70, 0x48, + 0x06, 0x81, 0x81, 0x02, 0x00, 0x7a, 0x0d, 0x4a, 0x04, 0x00, 0x38, 0x01, + 0x02, 0x20, 0xf0, 0x01, 0x01, 0x80, 0x01, 0x0f, 0x07, 0x60, 0x8e, 0x48, + 0x03, 0x4a, 0x60, 0xff, 0x07, 0x00, 0xf0, 0xff, 0x07, 0x4b, 0x88, 0xff, + 0x03, 0x70, 0x00, 0xff, 0x07, 0x00, 0x06, 0x00, 0x05, 0x50, 0x04, 0x48, + 0x07, 0x4d, 0x00, 0xff, 0x04, 0x5a, 0x04, 0x4a, 0x03, 0x04, 0xa0, 0xff, + 0x07, 0x0f, 0xf0, 0x0f, 0x01, 0x54, 0x04, 0x06, 0x05, 0x82, 0x01, 0x17, + 0x04, 0x95, 0x01, 0x20, 0x05, 0xa0, 0x01, 0xbd, 0x02, 0x86, 0x81, 0x23, + 0x01, 0x34, 0xbf, 0xff, 0x07, 0x0f, 0xff, 0xff, 0x01, 0x04, 0x10, 0x2e, + 0x05, 0x0f, 0xd0, 0x41, 0x00, 0x80, 0x01, 0x26, 0x05, 0x95, 0x01, 0x1d, + 0x05, 0xa0, 0x01, 0xbd, 0x01, 0x86, 0x01, 0x1d, 0x02, 0x02, 0xf0, 0x0e, + 0x05, 0x2e, 0x40, 0x30, 0x04, 0x0f, 0xd0, 0x2f, 0x07, 0x0f, 0xc0, 0xff, + 0x05, 0xa0, 0x02, 0x1b, 0x02, 0x80, 0x00, 0x10, 0x04, 0x00, 0xe0, 0x2f, + 0x04, 0x2e, 0x40, 0x20, 0x02, 0x02, 0xf0, 0x51, 0x00, 0x04, 0x10, 0x0e, + 0x00, 0x04, 0xb0, 0x0e, 0x05, 0x0f, 0xd0, 0x41, 0x02, 0x4a, 0x6c, 0x46, + 0x04, 0x50, 0x04, 0x23, 0x05, 0x00, 0x70, 0xff, 0x03, 0x62, 0x00, 0x24, + 0x05, 0x00, 0x80, 0xff, 0x04, 0x00, 0x40, 0x46, 0x07, 0x00, 0x50, 0x0f, + 0x03, 0x20, 0x60, 0x00, 0x05, 0x60, 0x10, 0x48, 0x07, 0x00, 0xa0, 0xff, + 0x07, 0x00, 0x90, 0x0a, 0x07, 0x0f, 0xf0, 0x05, 0x04, 0x50, 0x04, 0x46, + 0x00, 0x54, 0x04, 0x25, 0x04, 0x82, 0x01, 0x57, 0x05, 0x60, 0x16, 0x22, + 0x05, 0x0f, 0x80, 0xff, 0x06, 0x3f, 0xa0, 0x32, 0x06, 0x00, 0x00, 0x02, + 0x03, 0x20, 0x30, 0x00, 0x01, 0x20, 0x40, 0x00, 0x03, 0x20, 0x50, 0x00, + 0x01, 0x20, 0xb0, 0x00, 0x03, 0x20, 0xc0, 0x00, 0x07, 0x60, 0x14, 0x41, + 0x05, 0x0f, 0x80, 0xff, 0x04, 0x3f, 0xa8, 0x52, 0x06, 0x00, 0x00, 0x01, + 0x07, 0x0f, 0xf0, 0x56, 0x05, 0x6c, 0x02, 0xff, 0x05, 0x0f, 0xb0, 0xff, + 0x07, 0x05, 0x60, 0xff, 0x03, 0x07, 0x90, 0x41, 0x05, 0x60, 0x0e, 0x41, + 0x05, 0x0f, 0x80, 0xff, 0x07, 0x3f, 0xa0, 0x11, 0x06, 0x00, 0x00, 0x3d, + 0x06, 0x78, 0x00, 0x43, 0x07, 0xf0, 0x00, 0x00, 0x06, 0x5a, 0x00, 0x7a, + 0x01, 0x08, 0x80, 0xff, 0x04, 0xa0, 0x01, 0xb6, 0x05, 0x8d, 0x01, 0x50, + 0x02, 0x08, 0xa0, 0x4a, 0x01, 0x08, 0xb0, 0x4b, 0x02, 0x38, 0x60, 0x01, + 0x03, 0x01, 0x00, 0x00, 0x07, 0x2e, 0x63, 0x00, 0x02, 0x80, 0x00, 0xa8, + 0x05, 0x00, 0xd0, 0x0a, 0x05, 0x50, 0x04, 0x05, 0x01, 0x4a, 0x68, 0xff, + 0x07, 0x00, 0x90, 0xff, 0x01, 0x54, 0x04, 0x0a, 0x07, 0x00, 0xc0, 0xff, + 0x06, 0x00, 0xa0, 0x23, 0x05, 0x00, 0xb0, 0x24, 0x02, 0x20, 0x60, 0x01, + 0x05, 0x60, 0x16, 0x22, 0x05, 0x0f, 0x80, 0xff, 0x06, 0x3f, 0xa0, 0x4a, + 0x06, 0x00, 0x00, 0x02, 0x05, 0x60, 0x10, 0x22, 0x05, 0x0f, 0x80, 0xff, + 0x04, 0x3f, 0xa8, 0x19, 0x06, 0x00, 0x00, 0x01, 0x06, 0x00, 0xa0, 0x0d, + 0x01, 0x80, 0x01, 0x3c, 0x06, 0x78, 0x00, 0x43, 0x07, 0x00, 0x00, 0xf0, + 0x05, 0x00, 0x10, 0xff, 0x02, 0x7c, 0x00, 0x01, 0x07, 0x00, 0x00, 0x30, + 0x06, 0x81, 0x05, 0xd9, 0x02, 0x7c, 0x00, 0x01, 0x06, 0x00, 0x00, 0x20, + 0x06, 0x81, 0x05, 0xd9, 0x02, 0x80, 0x05, 0xf1, 0x05, 0x48, 0x80, 0xff, + 0x06, 0x81, 0x00, 0x10, 0x07, 0x0f, 0xf0, 0x56, 0x05, 0x0f, 0xb0, 0xff, + 0x04, 0x48, 0x80, 0xe5, 0x05, 0x81, 0x01, 0x7d, 0x04, 0x48, 0x80, 0xe6, + 0x04, 0x81, 0x80, 0x10, 0x00, 0x80, 0x01, 0x83, 0x05, 0x6c, 0x02, 0xff, + 0x05, 0x0f, 0xb0, 0xff, 0x07, 0x05, 0x60, 0xff, 0x07, 0x2e, 0x53, 0x00, + 0x04, 0x48, 0x80, 0xe6, 0x04, 0x81, 0x80, 0x10, 0x07, 0x2d, 0x50, 0x03, + 0x06, 0x78, 0x00, 0x43, 0x07, 0xf0, 0x00, 0x00, 0x01, 0x08, 0x80, 0xff, + 0x05, 0x8d, 0x01, 0x87, 0x03, 0x38, 0x60, 0x05, 0x03, 0x01, 0x00, 0x00, + 0x03, 0x3e, 0x60, 0x00, 0x07, 0x00, 0x00, 0x0c, 0x05, 0x2e, 0x52, 0x00, + 0x02, 0x80, 0x00, 0x10, 0x01, 0x20, 0x91, 0x8e, 0x01, 0x80, 0x04, 0xfa, + 0x01, 0x20, 0x91, 0x90, 0x01, 0x80, 0x04, 0xfa, 0x00, 0x20, 0x91, 0x92, + 0x01, 0x80, 0x04, 0xfa, 0x03, 0x20, 0x90, 0x00, 0x01, 0x80, 0x04, 0xfa, + 0x01, 0x20, 0x91, 0x96, 0x01, 0x80, 0x04, 0xfa, 0x00, 0x20, 0x91, 0x98, + 0x01, 0x80, 0x04, 0xfa, 0x02, 0x49, 0x30, 0x75, 0x06, 0x81, 0x05, 0x32, + 0x01, 0x20, 0x91, 0x9a, 0x01, 0x80, 0x04, 0xfa, 0x06, 0x60, 0x1e, 0x01, + 0x05, 0x0f, 0x80, 0xff, 0x06, 0x3f, 0xa0, 0x29, 0x06, 0x00, 0x00, 0x08, + 0x02, 0x01, 0x50, 0x10, 0x02, 0x01, 0x60, 0x51, 0x00, 0x01, 0x70, 0x51, + 0x00, 0x01, 0x10, 0x51, 0x05, 0x60, 0x1a, 0x41, 0x05, 0x0f, 0x80, 0xff, + 0x05, 0x3f, 0xa8, 0x3a, 0x06, 0x00, 0x00, 0x08, 0x05, 0x60, 0x0e, 0x41, + 0x05, 0x0f, 0x80, 0xff, 0x01, 0x46, 0x40, 0x00, 0x03, 0x2f, 0xa0, 0x0a, + 0x07, 0x00, 0x60, 0x11, 0x05, 0x00, 0x70, 0x12, 0x04, 0x00, 0x80, 0x13, + 0x07, 0x00, 0x90, 0x14, 0x06, 0x00, 0xa0, 0x15, 0x04, 0x00, 0xb0, 0x16, + 0x07, 0x00, 0xc0, 0x17, 0x07, 0xc0, 0x00, 0x00, 0x07, 0x2d, 0x50, 0x03, + 0x06, 0x60, 0x14, 0x79, 0x05, 0x0f, 0x80, 0xff, 0x04, 0x8d, 0x01, 0xb9, + 0x06, 0x3f, 0xa0, 0x51, 0x06, 0x00, 0x00, 0x3e, 0x07, 0xc0, 0x00, 0x00, + 0x06, 0x00, 0x50, 0x51, 0x04, 0x00, 0xe0, 0x2c, 0x06, 0x60, 0x06, 0x0e, + 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x09, 0x03, 0x79, 0xff, 0x00, + 0x07, 0x00, 0x00, 0xff, 0x07, 0x6c, 0x00, 0x00, 0x05, 0x81, 0x01, 0xdd, + 0x06, 0x60, 0x48, 0x0e, 0x05, 0x00, 0xe0, 0xff, 0x03, 0x40, 0x00, 0xff, + 0x01, 0x54, 0x04, 0x27, 0x04, 0x82, 0x02, 0x0d, 0x03, 0x40, 0x00, 0x05, + 0x07, 0x0f, 0xf0, 0x05, 0x05, 0x5c, 0x04, 0x28, 0x05, 0x81, 0x02, 0x11, + 0x01, 0x68, 0x0e, 0x05, 0x05, 0x6c, 0x04, 0x05, 0x06, 0x81, 0x81, 0xbf, + 0x04, 0x0f, 0x80, 0x29, 0x05, 0x3f, 0xa8, 0x09, 0x07, 0x00, 0x00, 0x24, + 0x06, 0x60, 0x06, 0x49, 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x09, + 0x03, 0x79, 0xff, 0x00, 0x07, 0x00, 0x00, 0xff, 0x07, 0x6c, 0x00, 0x00, + 0x06, 0x81, 0x81, 0xbf, 0x04, 0x00, 0xe0, 0x49, 0x03, 0x40, 0x00, 0x2d, + 0x05, 0x0f, 0x80, 0x2b, 0x05, 0x3f, 0xa8, 0x0a, 0x06, 0x00, 0x00, 0x16, + 0x06, 0x60, 0x48, 0x0e, 0x03, 0x02, 0xc0, 0xff, 0x03, 0x40, 0x00, 0xff, + 0x01, 0x54, 0x04, 0x27, 0x05, 0x82, 0x02, 0x0f, 0x07, 0x2d, 0x60, 0x00, + 0x04, 0x60, 0x04, 0x0e, 0x05, 0x0f, 0x80, 0xff, 0x00, 0x04, 0xd0, 0xd0, + 0x03, 0x79, 0xff, 0x4d, 0x07, 0x00, 0xff, 0xff, 0x01, 0x04, 0xe0, 0xd1, + 0x03, 0x79, 0xff, 0x4e, 0x07, 0x00, 0xff, 0xff, 0x06, 0x2d, 0x60, 0x02, + 0x03, 0x2f, 0xa0, 0x09, 0x02, 0x04, 0xf0, 0xd0, 0x06, 0x4b, 0x00, 0x4f, + 0x07, 0x78, 0x00, 0x00, 0x07, 0xff, 0xff, 0x00, 0x04, 0x5a, 0x04, 0x4f, + 0x07, 0x00, 0x00, 0xff, 0x00, 0x20, 0x10, 0x08, 0x04, 0x00, 0x20, 0x51, + 0x06, 0x00, 0x30, 0x51, 0x05, 0x30, 0x40, 0x00, 0x07, 0x00, 0x00, 0x60, + 0x03, 0x20, 0x50, 0x09, 0x07, 0x00, 0x60, 0x22, 0x04, 0x60, 0x04, 0x0e, + 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x3a, 0x06, 0x60, 0x3a, 0x0e, + 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x12, 0x06, 0x00, 0x00, 0x26, + 0x05, 0x00, 0x10, 0xd1, 0x04, 0x60, 0x32, 0x0e, 0x05, 0x0f, 0x80, 0xff, + 0x01, 0x2f, 0xa8, 0x0a, 0x06, 0x0f, 0xf0, 0x0e, 0x05, 0x5c, 0x04, 0x2e, + 0x04, 0x81, 0x02, 0x13, 0x07, 0xc0, 0x00, 0x00, 0x04, 0x00, 0xe0, 0x26, + 0x00, 0x80, 0x01, 0xcb, 0x02, 0x02, 0xc0, 0x26, 0x00, 0x80, 0x01, 0xe6, + 0x05, 0x00, 0xe0, 0x2e, 0x00, 0x80, 0x01, 0xe6, 0x04, 0x00, 0xe0, 0x51, + 0x01, 0x80, 0x02, 0x0c, 0x03, 0x49, 0xc0, 0xe4, 0x05, 0x81, 0x02, 0x18, + 0x07, 0xc0, 0x00, 0x00, 0x01, 0x3e, 0x40, 0x00, 0x07, 0x0c, 0x00, 0x00, + 0x07, 0xc0, 0x00, 0x00, 0x01, 0x3e, 0x40, 0x00, 0x03, 0x08, 0x00, 0x00, + 0x07, 0xc0, 0x00, 0x00, 0x02, 0x97, 0x03, 0x08, 0x02, 0x2a, 0x50, 0x02, + 0x06, 0x90, 0x82, 0x20, 0x01, 0x91, 0x02, 0xa5, 0x03, 0x04, 0x00, 0xa6, + 0x06, 0x78, 0xaa, 0xe5, 0x06, 0x00, 0x00, 0x01, 0x01, 0xa1, 0x86, 0x33, + 0x06, 0x60, 0x0c, 0x40, 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x21, + 0x07, 0x4b, 0x00, 0x00, 0x07, 0x6c, 0x06, 0x00, 0x06, 0x81, 0x82, 0xa7, + 0x05, 0x60, 0x04, 0x03, 0x05, 0x0f, 0x80, 0xff, 0x07, 0x3f, 0xa0, 0x09, + 0x06, 0x00, 0x00, 0x02, 0x02, 0x79, 0xff, 0x04, 0x07, 0x00, 0xff, 0xff, + 0x01, 0x04, 0x40, 0xd7, 0x01, 0x79, 0xfe, 0x44, 0x07, 0x00, 0xff, 0xff, + 0x04, 0x5c, 0x04, 0x04, 0x07, 0x81, 0x82, 0xa9, 0x03, 0x49, 0xf0, 0x44, + 0x07, 0x81, 0x82, 0xb2, 0x02, 0x49, 0x50, 0x01, 0x06, 0x81, 0x82, 0xab, + 0x06, 0x0f, 0xf0, 0x79, 0x04, 0x5c, 0x04, 0x40, 0x07, 0x81, 0x82, 0x3f, + 0x06, 0x44, 0xf0, 0x7a, 0x00, 0x2f, 0xb0, 0x08, 0x06, 0x0f, 0xf0, 0x79, + 0x04, 0x5c, 0x04, 0x40, 0x07, 0x81, 0x82, 0x44, 0x06, 0x44, 0xf0, 0x7a, + 0x00, 0x2f, 0xb0, 0x08, 0x06, 0x48, 0xf0, 0x01, 0x07, 0x81, 0x82, 0x9c, + 0x04, 0x60, 0x0e, 0x40, 0x05, 0x0f, 0x80, 0xff, 0x06, 0x48, 0x00, 0x01, + 0x05, 0x81, 0x02, 0x63, 0x04, 0x48, 0xe0, 0x01, 0x05, 0x81, 0x02, 0x87, + 0x02, 0x46, 0x00, 0x01, 0x06, 0x44, 0xf0, 0x01, 0x01, 0x2f, 0xa8, 0x0a, + 0x04, 0x00, 0x80, 0x40, 0x06, 0xa0, 0x05, 0x04, 0x03, 0x86, 0x82, 0xa0, + 0x00, 0x49, 0x10, 0x01, 0x07, 0x81, 0x82, 0xa0, 0x07, 0x00, 0x50, 0xd8, + 0x05, 0x78, 0x01, 0x05, 0x07, 0xff, 0xff, 0x00, 0x06, 0x60, 0x0c, 0x02, + 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x12, 0x06, 0x00, 0x00, 0x02, + 0x05, 0xa0, 0x04, 0xee, 0x06, 0x2d, 0xa0, 0x01, 0x01, 0x3e, 0x40, 0x00, + 0x06, 0x00, 0x00, 0x80, 0x06, 0x93, 0x00, 0x13, 0x02, 0x92, 0x00, 0x13, + 0x02, 0x80, 0x00, 0x10, 0x06, 0x44, 0xf0, 0x01, 0x01, 0x2f, 0xa8, 0x0a, + 0x02, 0x0e, 0xf0, 0x02, 0x00, 0x86, 0x02, 0x89, 0x04, 0x60, 0x08, 0x40, + 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x09, 0x06, 0x00, 0x00, 0x02, + 0x05, 0x78, 0x01, 0x05, 0x00, 0x80, 0x04, 0x40, 0x01, 0x7c, 0x01, 0x05, + 0x05, 0x00, 0x04, 0x00, 0x06, 0x81, 0x82, 0x89, 0x06, 0x60, 0x1e, 0x02, + 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x09, 0x06, 0x00, 0x00, 0x02, + 0x04, 0x60, 0x2a, 0x40, 0x05, 0x0f, 0x80, 0xff, 0x07, 0x0f, 0xf0, 0x05, + 0x05, 0x3f, 0xa8, 0x09, 0x06, 0x00, 0x00, 0x02, 0x05, 0x5c, 0x04, 0x05, + 0x06, 0x81, 0x82, 0x89, 0x07, 0x00, 0x50, 0xd8, 0x05, 0x78, 0x01, 0x05, + 0x07, 0xff, 0xff, 0x00, 0x06, 0x00, 0x60, 0x51, 0x06, 0x60, 0x0c, 0x02, + 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x12, 0x06, 0x00, 0x00, 0x02, + 0x04, 0x00, 0x80, 0x40, 0x00, 0x45, 0xe0, 0x08, 0x05, 0xa0, 0x04, 0xee, + 0x00, 0x80, 0x02, 0x5d, 0x06, 0x44, 0xf0, 0x01, 0x01, 0x2f, 0xa8, 0x0a, + 0x05, 0x00, 0x20, 0xd8, 0x04, 0x60, 0x04, 0x40, 0x05, 0x0f, 0x80, 0xff, + 0x07, 0x3f, 0xa0, 0x0a, 0x06, 0x00, 0x00, 0x01, 0x06, 0x48, 0x00, 0x01, + 0x07, 0x81, 0x82, 0x95, 0x05, 0x30, 0x80, 0x00, 0x03, 0x04, 0x00, 0x00, + 0x06, 0x00, 0x90, 0x40, 0x04, 0xa0, 0x04, 0xf2, 0x00, 0x80, 0x02, 0x5d, + 0x07, 0xa0, 0x06, 0x33, 0x05, 0x4b, 0x08, 0x00, 0x05, 0x6a, 0x07, 0x00, + 0x06, 0x60, 0x0c, 0x40, 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x0a, + 0x00, 0x80, 0x02, 0x5d, 0x01, 0x3e, 0x40, 0x00, 0x06, 0x00, 0x00, 0x80, + 0x01, 0x20, 0x92, 0x9c, 0x01, 0x80, 0x04, 0xfa, 0x06, 0x00, 0x90, 0x08, + 0x05, 0x30, 0x80, 0x00, 0x05, 0x00, 0x40, 0x00, 0x04, 0xa0, 0x04, 0xf2, + 0x00, 0x80, 0x02, 0x5d, 0x02, 0x20, 0x90, 0x02, 0x01, 0x80, 0x02, 0xf9, + 0x03, 0x20, 0x90, 0x00, 0x01, 0x80, 0x02, 0xf9, 0x02, 0x20, 0x90, 0x04, + 0x01, 0x80, 0x02, 0xf9, 0x07, 0xa0, 0x03, 0x11, 0x06, 0x2d, 0xa0, 0x01, + 0x05, 0x30, 0x80, 0x00, 0x05, 0x00, 0x20, 0x00, 0x06, 0x00, 0x90, 0x40, + 0x04, 0xa0, 0x04, 0xf2, 0x00, 0x80, 0x02, 0x5e, 0x01, 0x3e, 0x40, 0x00, + 0x06, 0x00, 0x00, 0x80, 0x02, 0x49, 0x50, 0x01, 0x06, 0x81, 0x82, 0xef, + 0x04, 0x60, 0x08, 0x40, 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x09, + 0x06, 0x00, 0x00, 0x01, 0x07, 0x21, 0xf0, 0x00, 0x03, 0x49, 0xf0, 0x03, + 0x05, 0x81, 0x02, 0xbe, 0x02, 0x45, 0xf0, 0x1f, 0x06, 0x00, 0x00, 0x02, + 0x00, 0x86, 0x02, 0xef, 0x07, 0x60, 0x14, 0x00, 0x05, 0x0f, 0x80, 0xff, + 0x01, 0x2f, 0xa8, 0x09, 0x06, 0x48, 0x00, 0x01, 0x04, 0x81, 0x02, 0xef, + 0x06, 0x60, 0x24, 0x40, 0x05, 0x0f, 0x80, 0xff, 0x01, 0x2f, 0xa8, 0x09, + 0x02, 0x0e, 0xf0, 0x01, 0x02, 0x86, 0x82, 0xef, 0x00, 0x9b, 0x02, 0xef, + 0x05, 0x00, 0x20, 0xd8, 0x06, 0x2d, 0xa0, 0x01, 0x06, 0x30, 0x30, 0x02, + 0x05, 0x00, 0x04, 0x30, 0x04, 0x60, 0x04, 0x40, 0x05, 0x0f, 0x80, 0xff, + 0x07, 0x3f, 0xa0, 0x12, 0x06, 0x00, 0x00, 0x01, 0x02, 0x8f, 0x82, 0xd3, + 0x05, 0x00, 0x40, 0xd8, 0x06, 0x2d, 0xa0, 0x01, 0x07, 0x60, 0x1e, 0x00, + 0x05, 0x0f, 0x80, 0xff, 0x07, 0x3f, 0xa0, 0x09, 0x06, 0x00, 0x00, 0x01, + 0x06, 0x0f, 0xf0, 0x04, 0x00, 0x54, 0x04, 0x02, 0x05, 0x82, 0x02, 0xed, + 0x06, 0x00, 0x50, 0x51, 0x06, 0x00, 0x60, 0x51, 0x06, 0x60, 0x22, 0x40, + 0x05, 0x0f, 0x80, 0xff, 0x06, 0x3f, 0xa0, 0x1a, 0x06, 0x00, 0x00, 0x02, + 0x06, 0x60, 0x0a, 0x40, 0x05, 0x0f, 0x80, 0xff, 0x07, 0x3f, 0xa0, 0x0a, + 0x07, 0x00, 0x00, 0x03, 0x06, 0x0f, 0xf0, 0x40, 0x04, 0x5a, 0x04, 0x1f, + 0x01, 0x0e, 0xb0, 0xff, 0x06, 0x93, 0x00, 0x13, 0x02, 0x92, 0x00, 0x13, + 0x02, 0x80, 0x00, 0x10, 0x04, 0x00, 0x40, 0x02, 0x01, 0x80, 0x02, 0xdd, + 0x07, 0xa0, 0x03, 0x11, 0x06, 0x2d, 0xa0, 0x01, 0x05, 0x30, 0x80, 0x00, + 0x07, 0x00, 0x50, 0x00, 0x06, 0x00, 0x90, 0x40, 0x04, 0xa0, 0x04, 0xf2, + 0x05, 0x00, 0x80, 0xd8, 0x04, 0xa0, 0x04, 0xf7, 0x06, 0x2d, 0xa0, 0x01, + 0x02, 0x80, 0x00, 0x13, 0x05, 0x0f, 0xd0, 0x09, 0x05, 0x0f, 0xd0, 0x41, + 0x01, 0x3e, 0x40, 0x00, 0x06, 0x00, 0x00, 0x80, 0x05, 0x30, 0x80, 0x00, + 0x03, 0x01, 0x30, 0x00, 0x04, 0xa0, 0x04, 0xf2, 0x01, 0x04, 0x40, 0xd7, + 0x03, 0x49, 0xf0, 0x44, 0x07, 0x81, 0x03, 0x06, 0x06, 0x2d, 0xa0, 0x01, + 0x03, 0x8f, 0x03, 0x06, 0x03, 0xe0, 0x00, 0x00, 0x06, 0x2d, 0xa0, 0x01, + 0x02, 0x80, 0x00, 0x13, 0x02, 0x49, 0xc0, 0xe5, 0x06, 0x81, 0x00, 0x13, + 0x06, 0x2d, 0xa0, 0x01, 0x07, 0xf0, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, + 0x03, 0x3e, 0x50, 0x00, 0x07, 0x0c, 0x00, 0x00, 0x03, 0x8f, 0x03, 0x0a, + 0x03, 0x80, 0x00, 0x11, 0x05, 0x00, 0x20, 0xd8, 0x04, 0x60, 0x04, 0x40, + 0x05, 0x0f, 0x80, 0xff, 0x07, 0x3f, 0xa0, 0x0a, 0x06, 0x00, 0x00, 0x01, + 0x07, 0xc0, 0x00, 0x00, 0x00, 0x2f, 0xb0, 0x01, 0x02, 0x80, 0x03, 0x1a, + 0x01, 0x2f, 0xb0, 0x00, 0x03, 0x07, 0x50, 0x87, 0x07, 0x8d, 0x03, 0x1b, + 0x03, 0x38, 0x60, 0x00, 0x03, 0x02, 0x00, 0x00, 0x04, 0x48, 0x20, 0x75, + 0x07, 0x81, 0x03, 0x66, 0x06, 0x48, 0xa0, 0xe6, 0x06, 0x81, 0x03, 0x5b, + 0x06, 0x42, 0x00, 0x7f, 0x07, 0x81, 0x03, 0x59, 0x03, 0x40, 0x00, 0x7e, + 0x06, 0x0f, 0xf0, 0x38, 0x01, 0x54, 0x04, 0x7e, 0x03, 0xd0, 0x03, 0x48, + 0x05, 0x60, 0x02, 0x7d, 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x09, + 0x03, 0x0e, 0xf0, 0x00, 0x03, 0x86, 0x05, 0x2b, 0x01, 0x07, 0xd0, 0x00, + 0x05, 0x60, 0x08, 0x00, 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x09, + 0x03, 0x68, 0x1e, 0x00, 0x04, 0x50, 0x04, 0x20, 0x05, 0x0f, 0x80, 0xff, + 0x07, 0x3f, 0xa0, 0x09, 0x07, 0x00, 0x00, 0x3f, 0x02, 0x80, 0x03, 0x25, + 0x07, 0x0f, 0xf0, 0x7d, 0x04, 0x50, 0x04, 0x7c, 0x05, 0x0f, 0x80, 0xff, + 0x00, 0x2f, 0xa8, 0x19, 0x06, 0x8d, 0x03, 0x3b, 0x02, 0x08, 0x00, 0x01, + 0x00, 0x08, 0x10, 0x02, 0x04, 0x48, 0x80, 0x7a, 0x07, 0x81, 0x03, 0x42, + 0x03, 0x79, 0xff, 0x03, 0x07, 0x00, 0x00, 0xff, 0x01, 0x08, 0x20, 0x03, + 0x06, 0x8d, 0x03, 0x43, 0x02, 0x38, 0x60, 0x04, 0x03, 0x01, 0x00, 0x00, + 0x07, 0x2e, 0x6c, 0x00, 0x03, 0x80, 0x03, 0x66, 0x03, 0x80, 0x03, 0x4e, + 0x03, 0x80, 0x03, 0x50, 0x02, 0x80, 0x03, 0x52, 0x02, 0x80, 0x03, 0x54, + 0x03, 0x80, 0x03, 0x56, 0x02, 0x80, 0x03, 0x58, 0x07, 0x27, 0xc0, 0x05, + 0x02, 0x80, 0x03, 0x37, 0x06, 0x27, 0xc0, 0x08, 0x02, 0x80, 0x03, 0x37, + 0x06, 0x27, 0xc0, 0x0b, 0x02, 0x80, 0x03, 0x37, 0x06, 0x27, 0xc0, 0x0e, + 0x02, 0x80, 0x03, 0x37, 0x07, 0x27, 0xc0, 0x11, 0x02, 0x80, 0x03, 0x37, + 0x03, 0x80, 0x03, 0x28, 0x05, 0x2e, 0x68, 0x00, 0x03, 0x80, 0x03, 0x66, + 0x04, 0x48, 0x80, 0xe6, 0x06, 0x81, 0x05, 0x58, 0x05, 0x2e, 0x62, 0x00, + 0x07, 0x0f, 0xf0, 0x88, 0x01, 0x79, 0xfe, 0xff, 0x07, 0x0f, 0xff, 0xff, + 0x04, 0x81, 0x85, 0x23, 0x06, 0x0f, 0xf0, 0x83, 0x01, 0x86, 0x83, 0x81, + 0x03, 0x3e, 0x60, 0x00, 0x07, 0x00, 0x00, 0x03, 0x07, 0x8d, 0x03, 0x66, + 0x07, 0x28, 0x60, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x07, 0x8d, 0x03, 0x69, + 0x02, 0x8c, 0x03, 0x1a, 0x06, 0x48, 0xc0, 0xe6, 0x04, 0x81, 0x83, 0x86, + 0x04, 0x48, 0xe0, 0xe6, 0x07, 0x81, 0x03, 0x7e, 0x00, 0x49, 0x20, 0xe6, + 0x06, 0x81, 0x03, 0x79, 0x06, 0xa0, 0x05, 0x94, 0x05, 0x00, 0x10, 0x88, + 0x00, 0x70, 0x01, 0x01, 0x03, 0x10, 0x00, 0x00, 0x00, 0x08, 0x80, 0x01, + 0x03, 0x3e, 0x60, 0x00, 0x07, 0x00, 0x00, 0x88, 0x02, 0x80, 0x05, 0x85, + 0x02, 0x38, 0x60, 0x01, 0x07, 0x03, 0x00, 0x00, 0x03, 0x3e, 0x60, 0x00, + 0x06, 0x00, 0x00, 0x08, 0x03, 0x80, 0x03, 0xff, 0x02, 0x79, 0x90, 0x75, + 0x05, 0x00, 0x04, 0x0f, 0x06, 0x81, 0x00, 0x10, 0x06, 0x60, 0x14, 0x79, + 0x05, 0x00, 0x80, 0xff, 0x06, 0x30, 0x90, 0x52, 0x06, 0x00, 0x00, 0x3e, + 0x02, 0x80, 0x03, 0x8a, 0x06, 0x60, 0x22, 0x79, 0x05, 0x00, 0x80, 0xff, + 0x05, 0x30, 0x98, 0x12, 0x07, 0x00, 0x00, 0x41, 0x06, 0x48, 0x00, 0x7a, + 0x06, 0x81, 0x03, 0x92, 0x04, 0x48, 0x80, 0x75, 0x04, 0x81, 0x83, 0x92, + 0x04, 0x0f, 0x80, 0x08, 0x07, 0x0f, 0xa0, 0x09, 0x00, 0x49, 0x10, 0x7a, + 0x02, 0xa1, 0x84, 0x01, 0x00, 0x79, 0x80, 0x75, 0x06, 0x00, 0x05, 0x07, + 0x04, 0x81, 0x85, 0x43, 0x04, 0x48, 0xb0, 0x75, 0x07, 0x81, 0x03, 0x99, + 0x02, 0x49, 0x30, 0x75, 0x07, 0x81, 0x05, 0x30, 0x06, 0x48, 0xc0, 0xe6, + 0x05, 0x81, 0x83, 0xac, 0x06, 0x8d, 0x03, 0x9b, 0x02, 0x38, 0x60, 0x01, + 0x07, 0x03, 0x00, 0x00, 0x00, 0x49, 0x10, 0x7a, 0x06, 0x81, 0x03, 0xa2, + 0x02, 0x0e, 0xf0, 0x83, 0x03, 0x86, 0x03, 0xac, 0x06, 0x48, 0x30, 0x75, + 0x06, 0x81, 0x03, 0xfd, 0x06, 0x78, 0x00, 0x7a, 0x07, 0x00, 0x00, 0x35, + 0x02, 0xa1, 0x84, 0xe5, 0x05, 0x30, 0x80, 0x00, 0x07, 0x06, 0x00, 0x00, + 0x06, 0x00, 0x90, 0x79, 0x04, 0xa0, 0x04, 0xf2, 0x02, 0x80, 0x03, 0xfd, + 0x06, 0x48, 0x30, 0x75, 0x07, 0x81, 0x05, 0x0f, 0x06, 0x8d, 0x03, 0xae, + 0x02, 0x38, 0x60, 0x01, 0x07, 0x03, 0x00, 0x00, 0x04, 0x44, 0xe0, 0x7a, + 0x06, 0x48, 0x30, 0x7a, 0x04, 0x81, 0x83, 0xdf, 0x04, 0x48, 0x70, 0x7a, + 0x06, 0x81, 0x03, 0xf8, 0x06, 0x48, 0xf0, 0x7a, 0x07, 0x81, 0x03, 0xca, + 0x04, 0xa0, 0x04, 0xe5, 0x04, 0x00, 0x80, 0x79, 0x06, 0xa0, 0x05, 0x04, + 0x00, 0x86, 0x83, 0xda, 0x00, 0x49, 0x10, 0x7a, 0x04, 0x81, 0x83, 0xda, + 0x04, 0x60, 0x04, 0x08, 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x09, + 0x06, 0x00, 0x00, 0x02, 0x05, 0x78, 0x01, 0x05, 0x07, 0xff, 0xff, 0x00, + 0x07, 0x60, 0x0c, 0x7b, 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x12, + 0x06, 0x00, 0x00, 0x02, 0x05, 0xa0, 0x04, 0xee, 0x02, 0x80, 0x03, 0xfd, + 0x05, 0x60, 0x10, 0x7b, 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x09, + 0x03, 0x49, 0xc0, 0x00, 0x05, 0x81, 0x83, 0xd8, 0x04, 0x60, 0x0e, 0x79, + 0x05, 0x0f, 0x80, 0xff, 0x07, 0x3f, 0xa0, 0x0a, 0x06, 0x00, 0x00, 0x3d, + 0x06, 0x60, 0x0a, 0x79, 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x0a, + 0x06, 0x00, 0x00, 0x10, 0x02, 0x80, 0x03, 0xfd, 0x00, 0x46, 0xe0, 0x7a, + 0x02, 0x80, 0x03, 0xf8, 0x06, 0x00, 0x90, 0x08, 0x05, 0x30, 0x80, 0x00, + 0x05, 0x00, 0x40, 0x00, 0x04, 0xa0, 0x04, 0xf2, 0x02, 0x80, 0x03, 0xfd, + 0x05, 0x60, 0x16, 0x7b, 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x11, + 0x07, 0x0f, 0xf0, 0x00, 0x04, 0x50, 0x04, 0x01, 0x03, 0x04, 0x60, 0xff, + 0x06, 0x0f, 0xf0, 0x25, 0x00, 0x54, 0x04, 0x46, 0x06, 0x82, 0x03, 0xe9, + 0x03, 0x04, 0x60, 0xff, 0x04, 0x09, 0x20, 0x46, 0x05, 0xa0, 0x02, 0x1b, + 0x06, 0x60, 0x06, 0x79, 0x05, 0x0f, 0x80, 0xff, 0x00, 0x20, 0x10, 0x07, + 0x01, 0x2f, 0xa8, 0x0a, 0x00, 0x46, 0x04, 0x7a, 0x03, 0x46, 0x30, 0xff, + 0x05, 0x00, 0x20, 0xff, 0x06, 0x00, 0x30, 0x51, 0x04, 0x60, 0x0e, 0x79, + 0x05, 0x0f, 0x80, 0xff, 0x07, 0x3f, 0xa0, 0x12, 0x06, 0x00, 0x00, 0x01, + 0x02, 0x80, 0x03, 0xfd, 0x04, 0xa0, 0x04, 0xe5, 0x05, 0x30, 0x80, 0x00, + 0x03, 0x02, 0x00, 0x00, 0x06, 0x00, 0x90, 0x79, 0x04, 0xa0, 0x04, 0xf2, + 0x03, 0x3e, 0x6a, 0x00, 0x07, 0x00, 0x00, 0x0a, 0x02, 0x07, 0x90, 0x51, + 0x02, 0x80, 0x00, 0x10, 0x04, 0x60, 0x3e, 0x79, 0x05, 0x0f, 0x80, 0xff, + 0x03, 0x2f, 0xa0, 0x09, 0x07, 0x0f, 0xf0, 0x00, 0x00, 0x86, 0x04, 0x1a, + 0x05, 0x7d, 0xfe, 0xff, 0x07, 0xff, 0xff, 0xff, 0x04, 0x81, 0x04, 0x1a, + 0x05, 0x0f, 0x80, 0x00, 0x01, 0x2f, 0xa8, 0x11, 0x00, 0x79, 0xfe, 0x02, + 0x07, 0x00, 0x00, 0xff, 0x07, 0x7d, 0x66, 0xff, 0x06, 0x00, 0x00, 0xdc, + 0x06, 0x81, 0x84, 0x1a, 0x06, 0x0f, 0xf0, 0x01, 0x03, 0x86, 0x84, 0x1b, + 0x06, 0x4b, 0x00, 0x02, 0x06, 0x42, 0x00, 0x02, 0x06, 0x0f, 0xf0, 0x02, + 0x05, 0x50, 0x04, 0x00, 0x05, 0x0f, 0x80, 0xff, 0x05, 0x00, 0x40, 0x84, + 0x07, 0x3f, 0xa0, 0x0a, 0x06, 0x00, 0x00, 0x02, 0x07, 0xc0, 0x00, 0x00, + 0x04, 0x60, 0x02, 0x01, 0x05, 0x0f, 0x80, 0xff, 0x07, 0x3f, 0xa0, 0x09, + 0x06, 0x00, 0x00, 0x01, 0x00, 0x79, 0xfe, 0x02, 0x07, 0x00, 0x00, 0xff, + 0x07, 0x7d, 0x72, 0xff, 0x07, 0x00, 0x00, 0xdd, 0x06, 0x81, 0x84, 0x1a, + 0x06, 0x4b, 0x00, 0x02, 0x06, 0x42, 0x00, 0x02, 0x06, 0x00, 0x00, 0x01, + 0x01, 0x80, 0x04, 0x14, 0x06, 0x05, 0x00, 0x4c, 0x00, 0x80, 0x04, 0x2c, + 0x05, 0x93, 0x04, 0x28, 0x05, 0xa0, 0x04, 0xeb, 0x05, 0x4b, 0xc4, 0x50, + 0x04, 0x81, 0x04, 0x2f, 0x01, 0xd0, 0x04, 0x30, 0x00, 0x80, 0x04, 0x2f, + 0x00, 0x80, 0x04, 0x40, 0x01, 0x80, 0x04, 0x42, 0x01, 0x80, 0x04, 0xaa, + 0x01, 0x80, 0x04, 0xbd, 0x01, 0x80, 0x04, 0x4d, 0x01, 0x80, 0x04, 0x42, + 0x00, 0x80, 0x04, 0x7f, 0x00, 0x80, 0x04, 0x40, 0x00, 0x80, 0x04, 0x40, + 0x00, 0x80, 0x04, 0xc1, 0x00, 0x80, 0x04, 0x40, 0x01, 0x80, 0x04, 0xc5, + 0x00, 0x80, 0x04, 0xda, 0x01, 0x80, 0x04, 0x96, 0x00, 0x80, 0x04, 0x40, + 0x00, 0x80, 0x04, 0x40, 0x00, 0x20, 0x94, 0x40, 0x01, 0x80, 0x04, 0xfa, + 0x03, 0x79, 0xff, 0x50, 0x07, 0x0f, 0xff, 0xff, 0x06, 0x0f, 0xf0, 0x79, + 0x05, 0x5c, 0x04, 0x50, 0x04, 0x81, 0x04, 0xba, 0x00, 0x2f, 0xb0, 0x08, + 0x06, 0x0f, 0xf0, 0x79, 0x05, 0x5c, 0x04, 0x50, 0x04, 0x81, 0x04, 0xb9, + 0x05, 0xa0, 0x04, 0xdd, 0x01, 0x80, 0x04, 0xb2, 0x01, 0x79, 0xfe, 0x50, + 0x07, 0x0f, 0xff, 0xff, 0x07, 0x00, 0x50, 0xff, 0x06, 0x0f, 0xf0, 0x79, + 0x05, 0x5c, 0x04, 0x05, 0x04, 0x81, 0x04, 0x57, 0x00, 0x2f, 0xb0, 0x08, + 0x06, 0x0f, 0xf0, 0x79, 0x05, 0x5c, 0x04, 0x05, 0x06, 0x81, 0x84, 0xb6, + 0x07, 0x0f, 0xf0, 0x87, 0x01, 0x79, 0x80, 0xff, 0x06, 0x00, 0x05, 0x07, + 0x07, 0x81, 0x84, 0x5f, 0x02, 0x20, 0x30, 0x40, 0x05, 0x00, 0x20, 0x87, + 0x00, 0x49, 0xd0, 0x02, 0x04, 0x81, 0x04, 0x79, 0x05, 0x93, 0x04, 0x66, + 0x01, 0x25, 0x70, 0x00, 0x07, 0x3c, 0x3f, 0xff, 0x07, 0x00, 0x00, 0x0f, + 0x05, 0x2e, 0x40, 0x03, 0x07, 0x2e, 0x50, 0x30, 0x03, 0x04, 0xc0, 0x50, + 0x02, 0x40, 0x00, 0x57, 0x06, 0x74, 0x00, 0x57, 0x06, 0x00, 0x00, 0x02, + 0x06, 0x82, 0x00, 0x16, 0x04, 0x00, 0x20, 0x83, 0x07, 0x00, 0x30, 0x84, + 0x04, 0x00, 0x40, 0x85, 0x06, 0x60, 0x22, 0x79, 0x05, 0x0f, 0x80, 0xff, + 0x06, 0x3f, 0xa0, 0x1a, 0x06, 0x00, 0x00, 0x01, 0x04, 0xa0, 0x04, 0xe5, + 0x06, 0xa0, 0x05, 0x9d, 0x03, 0x3e, 0x6a, 0x00, 0x07, 0x00, 0x00, 0x0a, + 0x06, 0x2e, 0x50, 0x20, 0x00, 0x3e, 0x40, 0x02, 0x07, 0x00, 0x0a, 0x00, + 0x03, 0x80, 0x03, 0xff, 0x07, 0x42, 0x00, 0x03, 0x07, 0x81, 0x84, 0x5c, + 0x00, 0x79, 0x80, 0x02, 0x06, 0x00, 0x05, 0x07, 0x07, 0x81, 0x84, 0x5f, + 0x01, 0x80, 0x04, 0x6a, 0x04, 0x93, 0x04, 0x86, 0x01, 0x25, 0x70, 0x00, + 0x07, 0x3c, 0x3f, 0xff, 0x07, 0x00, 0x00, 0x0f, 0x05, 0x2e, 0x40, 0x03, + 0x07, 0x2e, 0x50, 0x30, 0x03, 0x04, 0xc0, 0x50, 0x06, 0x78, 0x00, 0xe6, + 0x07, 0x00, 0x00, 0x41, 0x05, 0x81, 0x04, 0x8b, 0x07, 0xa0, 0x05, 0xa6, + 0x04, 0x81, 0x80, 0x16, 0x00, 0x2f, 0xb0, 0x08, 0x06, 0x78, 0x00, 0xe6, + 0x07, 0x00, 0x00, 0x41, 0x04, 0x81, 0x04, 0x91, 0x07, 0xa0, 0x05, 0xa6, + 0x04, 0x81, 0x80, 0x16, 0x06, 0x2e, 0x50, 0x20, 0x00, 0x3e, 0x40, 0x02, + 0x07, 0x00, 0x0a, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x02, 0x80, 0x00, 0x10, + 0x03, 0x79, 0xff, 0x50, 0x07, 0x0f, 0xff, 0xff, 0x06, 0x0f, 0xf0, 0x79, + 0x05, 0x5c, 0x04, 0x50, 0x07, 0x81, 0x84, 0x9c, 0x02, 0x45, 0x50, 0x7a, + 0x00, 0x2f, 0xb0, 0x08, 0x06, 0x0f, 0xf0, 0x79, 0x05, 0x5c, 0x04, 0x50, + 0x06, 0x81, 0x84, 0xa1, 0x02, 0x45, 0x50, 0x7a, 0x00, 0x2f, 0xb0, 0x08, + 0x05, 0x60, 0x0e, 0x50, 0x05, 0x0f, 0x80, 0xff, 0x01, 0x2f, 0xa8, 0x09, + 0x02, 0x45, 0x50, 0x01, 0x05, 0x60, 0x0e, 0x50, 0x05, 0x0f, 0x80, 0xff, + 0x01, 0x2f, 0xa8, 0x0a, 0x00, 0x80, 0x04, 0xb3, 0x06, 0x95, 0x84, 0xba, + 0x01, 0x79, 0xfe, 0x50, 0x07, 0x0f, 0xff, 0xff, 0x04, 0x5c, 0x04, 0x2f, + 0x06, 0x81, 0x84, 0xba, 0x02, 0x02, 0xf0, 0x51, 0x04, 0x2e, 0x40, 0x20, + 0x00, 0x80, 0x04, 0xb3, 0x00, 0x2f, 0xb0, 0x08, 0x00, 0x3e, 0x40, 0x02, + 0x07, 0x00, 0x0a, 0x00, 0x02, 0x80, 0x00, 0x16, 0x06, 0x93, 0x84, 0xb9, + 0x06, 0x2e, 0x50, 0x20, 0x04, 0x2e, 0x40, 0x02, 0x00, 0x2f, 0xb0, 0x08, + 0x01, 0x3e, 0x40, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x02, 0x80, 0x00, 0x16, + 0x01, 0x79, 0xfe, 0x50, 0x07, 0x0f, 0xff, 0xff, 0x01, 0x02, 0x10, 0xff, + 0x02, 0x80, 0x00, 0x16, 0x01, 0x79, 0xfe, 0x50, 0x07, 0x0f, 0xff, 0xff, + 0x05, 0x03, 0x40, 0xff, 0x00, 0x80, 0x04, 0xb3, 0x01, 0x79, 0xfe, 0x50, + 0x07, 0x0f, 0xff, 0xff, 0x01, 0x02, 0xe0, 0xff, 0x07, 0x60, 0x28, 0x2e, + 0x05, 0x0f, 0x80, 0xff, 0x05, 0x22, 0x20, 0x00, 0x07, 0x22, 0x30, 0x00, + 0x05, 0x22, 0x40, 0x00, 0x07, 0x22, 0x50, 0x00, 0x07, 0x22, 0x60, 0x00, + 0x05, 0x22, 0x70, 0x00, 0x05, 0x22, 0x80, 0x00, 0x07, 0x22, 0x90, 0x00, + 0x07, 0x22, 0xa0, 0x00, 0x05, 0x22, 0xb0, 0x00, 0x06, 0x3f, 0xa0, 0x51, + 0x07, 0x00, 0x00, 0x11, 0x02, 0x02, 0xc0, 0x26, 0x05, 0x22, 0xd0, 0x00, + 0x05, 0x2e, 0x40, 0x0c, 0x02, 0x80, 0x00, 0x16, 0x03, 0x04, 0x30, 0xd4, + 0x06, 0x2e, 0x50, 0x08, 0x00, 0x80, 0x01, 0x76, 0x05, 0x60, 0x0e, 0x50, + 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x09, 0x03, 0x46, 0x00, 0x00, + 0x01, 0x80, 0x04, 0xe8, 0x02, 0x46, 0x00, 0x7a, 0x00, 0x45, 0x20, 0x7a, + 0x00, 0x80, 0x04, 0xe6, 0x02, 0x46, 0x00, 0x7a, 0x06, 0x00, 0x00, 0x7a, + 0x04, 0x60, 0x0e, 0x79, 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x0a, + 0x07, 0xc0, 0x00, 0x00, 0x03, 0x92, 0x84, 0xeb, 0x07, 0x05, 0x00, 0xe1, + 0x07, 0xc0, 0x00, 0x00, 0x02, 0x45, 0xf0, 0x08, 0x04, 0x84, 0x04, 0xef, + 0x02, 0x0e, 0x00, 0x08, 0x07, 0xc0, 0x00, 0x00, 0x07, 0x0f, 0xf0, 0x09, + 0x06, 0x5a, 0x00, 0x08, 0x04, 0x84, 0x04, 0xf4, 0x02, 0x0e, 0x00, 0x08, + 0x07, 0xc0, 0x00, 0x00, 0x04, 0x84, 0x04, 0xf7, 0x02, 0x0e, 0x00, 0x08, + 0x07, 0xc0, 0x00, 0x00, 0x05, 0x30, 0x80, 0x00, 0x05, 0x00, 0xd0, 0x00, + 0x04, 0xa0, 0x04, 0xf2, 0x05, 0xa0, 0x04, 0xff, 0x02, 0x80, 0x00, 0x10, + 0x05, 0x2e, 0x43, 0x00, 0x07, 0x2e, 0x50, 0x0c, 0x07, 0x3c, 0x3f, 0xff, + 0x07, 0x00, 0x00, 0x0f, 0x07, 0xc0, 0x00, 0x00, 0x06, 0x60, 0x22, 0x08, + 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x11, 0x07, 0x6a, 0x00, 0x00, + 0x04, 0x81, 0x85, 0x0d, 0x06, 0x6a, 0x00, 0x01, 0x06, 0x81, 0x05, 0x0d, + 0x06, 0x00, 0x60, 0x51, 0x07, 0xc0, 0x00, 0x00, 0x02, 0x20, 0x60, 0x01, + 0x07, 0xc0, 0x00, 0x00, 0x06, 0x78, 0x00, 0x7a, 0x07, 0x00, 0x00, 0x21, + 0x05, 0x81, 0x85, 0x14, 0x00, 0x49, 0x10, 0x7a, 0x04, 0x81, 0x83, 0xae, + 0x04, 0x0f, 0xd0, 0x79, 0x06, 0x48, 0x30, 0x7a, 0x01, 0xa1, 0x86, 0x2d, + 0x05, 0xa0, 0x04, 0xe2, 0x05, 0x30, 0x80, 0x00, 0x05, 0x00, 0x10, 0x00, + 0x06, 0x00, 0x90, 0x79, 0x04, 0xa0, 0x04, 0xf2, 0x06, 0x8d, 0x05, 0x1c, + 0x03, 0x3e, 0x6a, 0x00, 0x06, 0x00, 0x00, 0x0e, 0x02, 0x07, 0x90, 0x51, + 0x03, 0x38, 0x60, 0x06, 0x03, 0x01, 0x00, 0x00, 0x02, 0x80, 0x00, 0x10, + 0x06, 0x48, 0x30, 0x7a, 0x01, 0xa1, 0x86, 0x2d, 0x05, 0xa0, 0x04, 0xe2, + 0x05, 0x30, 0x80, 0x00, 0x05, 0x00, 0x10, 0x00, 0x06, 0x00, 0x90, 0x79, + 0x04, 0xa0, 0x04, 0xf2, 0x02, 0x80, 0x05, 0x85, 0x06, 0x48, 0x30, 0x7a, + 0x07, 0x81, 0x81, 0x96, 0x04, 0xa0, 0x04, 0xe5, 0x03, 0x20, 0x95, 0x2b, + 0x01, 0x80, 0x04, 0xfa, 0x02, 0x49, 0x00, 0x75, 0x06, 0x81, 0x05, 0x40, + 0x04, 0x00, 0x20, 0x89, 0x04, 0x78, 0x01, 0x02, 0x07, 0xf0, 0x00, 0x00, + 0x05, 0x00, 0x10, 0x88, 0x06, 0xa0, 0x05, 0x94, 0x04, 0x74, 0x01, 0x01, + 0x03, 0x10, 0x00, 0x00, 0x06, 0x0f, 0xf0, 0x02, 0x04, 0x5c, 0x04, 0x01, + 0x05, 0x81, 0x85, 0x41, 0x00, 0x08, 0x80, 0x01, 0x03, 0x3e, 0x60, 0x00, + 0x07, 0x00, 0x00, 0xc0, 0x03, 0x80, 0x05, 0x81, 0x07, 0xf0, 0x00, 0x00, + 0x03, 0x20, 0x95, 0x41, 0x01, 0x80, 0x04, 0xfa, 0x04, 0x0f, 0xd0, 0x75, + 0x04, 0x0f, 0xd0, 0x7a, 0x04, 0x0f, 0xd0, 0x79, 0x06, 0x48, 0x30, 0x7a, + 0x06, 0x81, 0x05, 0x4c, 0x06, 0x78, 0x00, 0x75, 0x06, 0x00, 0x00, 0x07, + 0x05, 0x81, 0x85, 0x53, 0x07, 0xa0, 0x06, 0x2d, 0x06, 0x48, 0x60, 0x75, + 0x06, 0x81, 0x81, 0x94, 0x02, 0x49, 0x00, 0x75, 0x07, 0x81, 0x81, 0x9a, + 0x04, 0x48, 0x70, 0x75, 0x04, 0x81, 0x85, 0x5b, 0x02, 0x80, 0x05, 0x62, + 0x05, 0x30, 0x80, 0x00, 0x03, 0x01, 0x00, 0x00, 0x06, 0x00, 0x90, 0x79, + 0x04, 0xa0, 0x04, 0xf2, 0x02, 0x80, 0x00, 0x10, 0x04, 0x48, 0xe0, 0xe6, + 0x05, 0x81, 0x83, 0x66, 0x00, 0x80, 0x01, 0x92, 0x05, 0x30, 0x80, 0x00, + 0x05, 0x00, 0xe0, 0x00, 0x06, 0x00, 0x90, 0x79, 0x04, 0xa0, 0x04, 0xf2, + 0x04, 0x00, 0x80, 0x89, 0x04, 0xa0, 0x04, 0xf7, 0x03, 0x80, 0x05, 0x81, + 0x05, 0xa0, 0x04, 0xe2, 0x05, 0x30, 0x80, 0x00, 0x07, 0x00, 0xf0, 0x00, + 0x06, 0x00, 0x90, 0x79, 0x07, 0x00, 0x00, 0x88, 0x07, 0xa0, 0x05, 0x6a, + 0x04, 0xa0, 0x04, 0xf2, 0x02, 0x80, 0x00, 0x10, 0x03, 0x38, 0x60, 0x00, + 0x07, 0x03, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x06, 0x8d, 0x05, 0x6d, + 0x03, 0x3e, 0x6a, 0x00, 0x06, 0x00, 0x00, 0x0e, 0x02, 0x07, 0x90, 0x51, + 0x04, 0x48, 0xb0, 0x75, 0x07, 0x81, 0x05, 0x78, 0x02, 0x49, 0x30, 0x75, + 0x07, 0x81, 0x05, 0x78, 0x05, 0x30, 0x10, 0x05, 0x03, 0x01, 0x00, 0x00, + 0x02, 0x80, 0x05, 0x7a, 0x05, 0x30, 0x10, 0x06, 0x03, 0x01, 0x00, 0x00, + 0x05, 0x00, 0x20, 0x87, 0x06, 0x48, 0x50, 0x02, 0x04, 0x81, 0x85, 0x7a, + 0x07, 0x44, 0xc0, 0x00, 0x01, 0x08, 0x80, 0x00, 0x02, 0x08, 0x60, 0x01, + 0x07, 0xc0, 0x00, 0x00, 0x05, 0x00, 0x10, 0x88, 0x06, 0xa0, 0x05, 0x94, + 0x06, 0x44, 0xc0, 0x01, 0x00, 0x08, 0x80, 0x01, 0x03, 0x3e, 0x6a, 0x00, + 0x06, 0x00, 0x00, 0x0e, 0x00, 0x49, 0x20, 0xe6, 0x04, 0x81, 0x85, 0x8a, + 0x02, 0x07, 0x90, 0x51, 0x06, 0x8d, 0x05, 0x8a, 0x06, 0x0f, 0xf0, 0x89, + 0x03, 0x49, 0x90, 0xff, 0x06, 0x81, 0x05, 0x91, 0x03, 0x38, 0x60, 0x05, + 0x03, 0x01, 0x00, 0x00, 0x02, 0x80, 0x00, 0x10, 0x03, 0x38, 0x60, 0x06, + 0x03, 0x01, 0x00, 0x00, 0x02, 0x80, 0x00, 0x10, 0x06, 0x8d, 0x05, 0x94, + 0x03, 0x38, 0x60, 0x00, 0x07, 0x03, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, + 0x06, 0x8d, 0x05, 0x98, 0x07, 0x0f, 0xf0, 0x87, 0x07, 0x48, 0x50, 0xff, + 0x05, 0x81, 0x85, 0x99, 0x07, 0xc0, 0x00, 0x00, 0x06, 0x8d, 0x05, 0x9d, + 0x02, 0x38, 0x60, 0x01, 0x07, 0x03, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, + 0x06, 0x8d, 0x05, 0xa1, 0x07, 0x0f, 0xf0, 0x87, 0x07, 0x48, 0x50, 0xff, + 0x04, 0x81, 0x85, 0xa2, 0x07, 0xc0, 0x00, 0x00, 0x05, 0x00, 0x20, 0x87, + 0x00, 0x49, 0xd0, 0x02, 0x04, 0x81, 0x85, 0xb5, 0x00, 0x2f, 0xb0, 0x08, + 0x06, 0x78, 0x00, 0xe6, 0x07, 0x00, 0x00, 0x41, 0x00, 0x2f, 0xb0, 0x08, + 0x04, 0x81, 0x85, 0xb5, 0x06, 0xa0, 0x05, 0xcb, 0x04, 0x48, 0xe0, 0x02, + 0x07, 0x81, 0x05, 0xb8, 0x06, 0x48, 0xa0, 0x02, 0x04, 0x81, 0x85, 0xc2, + 0x06, 0x48, 0x60, 0x02, 0x06, 0x81, 0x05, 0xbc, 0x02, 0x40, 0x00, 0x57, + 0x05, 0x6a, 0x02, 0xff, 0x07, 0xc0, 0x00, 0x00, 0x06, 0xa0, 0x05, 0xcb, + 0x06, 0x78, 0x81, 0x02, 0x06, 0x00, 0x00, 0x04, 0x04, 0x81, 0x85, 0xb5, + 0x04, 0x00, 0x20, 0x89, 0x07, 0x0f, 0xf0, 0xd4, 0x04, 0x5c, 0x04, 0x02, + 0x07, 0x78, 0x00, 0xff, 0x07, 0xf0, 0x00, 0x00, 0x04, 0x81, 0x85, 0xb5, + 0x00, 0x20, 0x20, 0x10, 0x02, 0x8c, 0x05, 0xb5, 0x07, 0xf0, 0x00, 0x00, + 0x06, 0x42, 0x00, 0x02, 0x05, 0x81, 0x85, 0xc3, 0x06, 0xa0, 0x05, 0x9d, + 0x03, 0x3e, 0x6a, 0x00, 0x07, 0x00, 0x00, 0x0a, 0x07, 0xc0, 0x00, 0x00, + 0x07, 0xf0, 0x00, 0x00, 0x06, 0x0f, 0xf0, 0xa2, 0x05, 0x00, 0x20, 0xff, + 0x06, 0x0f, 0xf0, 0xa2, 0x04, 0x5c, 0x04, 0x02, 0x05, 0x81, 0x85, 0xcc, + 0x07, 0xc0, 0x00, 0x00, 0x05, 0xa0, 0x02, 0x1b, 0x03, 0x49, 0x50, 0x47, + 0x07, 0x81, 0x05, 0xd7, 0x03, 0x20, 0x90, 0x1d, 0x02, 0x80, 0x06, 0x29, + 0x02, 0x20, 0x90, 0x1f, 0x02, 0x80, 0x06, 0x29, 0x01, 0x49, 0x80, 0xe4, + 0x04, 0x81, 0x80, 0x10, 0x01, 0x3e, 0x40, 0x00, 0x07, 0x00, 0x30, 0x00, + 0x05, 0x60, 0x0e, 0x35, 0x05, 0x0f, 0x80, 0xff, 0x05, 0xa0, 0x07, 0x21, + 0x01, 0x20, 0x80, 0x03, 0x04, 0xa0, 0x04, 0xf7, 0x02, 0x80, 0x05, 0xf1, + 0x03, 0x20, 0x90, 0x09, 0x02, 0x80, 0x06, 0x29, 0x03, 0x20, 0x90, 0x11, + 0x02, 0x80, 0x06, 0x29, 0x02, 0x20, 0x90, 0x07, 0x02, 0x80, 0x06, 0x29, + 0x03, 0x20, 0x90, 0x03, 0x02, 0x80, 0x06, 0x29, 0x00, 0x49, 0x80, 0x43, + 0x04, 0x81, 0x85, 0xe3, 0x00, 0x49, 0x70, 0x43, 0x05, 0x81, 0x85, 0xe7, + 0x02, 0x20, 0x90, 0x01, 0x02, 0x80, 0x06, 0x29, 0x02, 0x20, 0x90, 0x0d, + 0x02, 0x80, 0x06, 0x29, 0x03, 0x20, 0x90, 0x0f, 0x02, 0x80, 0x06, 0x29, + 0x03, 0x49, 0x30, 0x00, 0x07, 0x81, 0x05, 0xfa, 0x02, 0x7c, 0x00, 0x45, + 0x07, 0x0a, 0x00, 0x00, 0x07, 0x81, 0x06, 0x03, 0x02, 0x20, 0x90, 0x0b, + 0x02, 0x80, 0x06, 0x29, 0x02, 0x20, 0x90, 0x13, 0x05, 0x30, 0x80, 0x00, + 0x01, 0x01, 0x20, 0x00, 0x04, 0xa0, 0x04, 0xf2, 0x00, 0x80, 0x01, 0x83, + 0x03, 0x20, 0x90, 0x05, 0x02, 0x80, 0x06, 0x29, 0x07, 0x2e, 0x50, 0x0c, + 0x00, 0x20, 0x80, 0x02, 0x04, 0xa0, 0x04, 0xf7, 0x02, 0x80, 0x00, 0x10, + 0x02, 0x20, 0x90, 0x15, 0x02, 0x80, 0x06, 0x29, 0x07, 0x2d, 0x60, 0x00, + 0x05, 0x30, 0x80, 0x00, 0x05, 0x00, 0x70, 0x00, 0x07, 0xf0, 0x00, 0x00, + 0x07, 0x00, 0x90, 0xd1, 0x03, 0x79, 0xff, 0x09, 0x07, 0x00, 0xff, 0xff, + 0x04, 0xa0, 0x04, 0xf2, 0x03, 0x20, 0x90, 0x17, 0x02, 0x80, 0x06, 0x29, + 0x03, 0x3e, 0x50, 0x00, 0x06, 0x00, 0x00, 0x80, 0x02, 0x20, 0x90, 0x19, + 0x02, 0x80, 0x06, 0x29, 0x07, 0x2d, 0x60, 0x00, 0x03, 0x3e, 0x50, 0x00, + 0x06, 0x00, 0x00, 0x80, 0x07, 0xf0, 0x00, 0x00, 0x06, 0x0f, 0xf0, 0xd0, + 0x01, 0x79, 0xfe, 0xff, 0x07, 0x00, 0xff, 0xff, 0x05, 0x7d, 0xfe, 0xff, + 0x07, 0x00, 0xff, 0xff, 0x04, 0x81, 0x80, 0x10, 0x02, 0x40, 0x00, 0x58, + 0x00, 0x64, 0x20, 0x58, 0x06, 0x82, 0x00, 0x10, 0x03, 0x3e, 0x50, 0x00, + 0x06, 0x00, 0x00, 0x80, 0x04, 0x05, 0x80, 0x51, 0x03, 0x20, 0x90, 0x1b, + 0x02, 0x80, 0x06, 0x29, 0x05, 0x30, 0x80, 0x00, 0x01, 0x01, 0x20, 0x00, + 0x04, 0xa0, 0x04, 0xf2, 0x00, 0x80, 0x01, 0x76, 0x05, 0xa0, 0x02, 0x1b, + 0x05, 0x30, 0x80, 0x00, 0x05, 0x00, 0x80, 0x00, 0x06, 0x00, 0x90, 0x79, + 0x04, 0xa0, 0x04, 0xf2, 0x07, 0xc0, 0x00, 0x00, 0x03, 0x49, 0x00, 0xe4, + 0x04, 0x81, 0x86, 0x3d, 0x01, 0x3e, 0x40, 0x00, 0x07, 0x00, 0x00, 0xc0, + 0x07, 0xf0, 0x00, 0x00, 0x03, 0x49, 0x00, 0xe4, 0x04, 0x81, 0x86, 0x3b, + 0x07, 0xc0, 0x00, 0x00, 0x01, 0x3e, 0x40, 0x00, 0x06, 0x00, 0x00, 0x80, + 0x07, 0xf0, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, + 0x03, 0x49, 0x00, 0xe4, 0x07, 0x81, 0x06, 0x35, 0x02, 0x80, 0x06, 0x3d, + 0x07, 0x2d, 0x60, 0x00, 0x00, 0x49, 0x80, 0x43, 0x06, 0x81, 0x06, 0x57, + 0x06, 0x0f, 0xf0, 0xd0, 0x01, 0x79, 0xfe, 0xff, 0x07, 0x00, 0xff, 0xff, + 0x05, 0x7d, 0xfe, 0xff, 0x07, 0x00, 0xff, 0xff, 0x04, 0x81, 0x86, 0x07, + 0x05, 0x0f, 0x80, 0x30, 0x03, 0x2f, 0xa0, 0x09, 0x03, 0x79, 0xff, 0x00, + 0x07, 0x00, 0xff, 0xff, 0x07, 0x0f, 0xf0, 0xd1, 0x01, 0x79, 0xfe, 0xff, + 0x07, 0x00, 0xff, 0xff, 0x05, 0x5c, 0x04, 0x00, 0x06, 0x81, 0x06, 0x07, + 0x04, 0x00, 0x40, 0x51, 0x03, 0x80, 0x06, 0x9f, 0x04, 0xa0, 0x07, 0x01, + 0x06, 0x2d, 0x60, 0x01, 0x02, 0x0e, 0xf0, 0x04, 0x03, 0x86, 0x06, 0x09, + 0x06, 0x60, 0x00, 0x04, 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x09, + 0x07, 0x4b, 0x00, 0x00, 0x05, 0x00, 0x20, 0x00, 0x07, 0x69, 0xff, 0x00, + 0x01, 0x64, 0x08, 0x00, 0x07, 0x82, 0x06, 0x09, 0x01, 0x64, 0x0e, 0x00, + 0x05, 0x82, 0x86, 0x09, 0x07, 0x0f, 0xf0, 0x36, 0x04, 0x5c, 0x04, 0x04, + 0x05, 0x81, 0x86, 0x72, 0x07, 0x2d, 0x60, 0x00, 0x05, 0x0f, 0x80, 0x30, + 0x03, 0x2f, 0xa0, 0x09, 0x03, 0x79, 0xff, 0x00, 0x07, 0x00, 0xff, 0xff, + 0x07, 0x0f, 0xf0, 0xd1, 0x01, 0x79, 0xfe, 0xff, 0x07, 0x00, 0xff, 0xff, + 0x05, 0x5c, 0x04, 0x00, 0x06, 0x81, 0x06, 0x07, 0x04, 0x48, 0x20, 0x34, + 0x07, 0x81, 0x06, 0x24, 0x06, 0x48, 0x30, 0x34, 0x05, 0x81, 0x86, 0x24, + 0x07, 0x0f, 0xf0, 0xd4, 0x07, 0x78, 0x00, 0xff, 0x07, 0x00, 0x00, 0xf0, + 0x03, 0x7c, 0x00, 0xff, 0x06, 0x00, 0x00, 0x10, 0x07, 0x81, 0x06, 0x9f, + 0x06, 0xa0, 0x06, 0xfb, 0x02, 0x49, 0x00, 0xe5, 0x07, 0x81, 0x06, 0x82, + 0x03, 0x3e, 0x50, 0x00, 0x06, 0x00, 0x00, 0x80, 0x02, 0x80, 0x00, 0x10, + 0x04, 0x60, 0x1c, 0x04, 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x09, + 0x06, 0x00, 0x00, 0x20, 0x03, 0x0e, 0xf0, 0x41, 0x02, 0x86, 0x06, 0x13, + 0x06, 0x2d, 0x60, 0x02, 0x05, 0x60, 0x2a, 0x41, 0x05, 0x0f, 0x80, 0xff, + 0x01, 0x2f, 0xa8, 0x09, 0x06, 0x0f, 0xf0, 0xd0, 0x07, 0x4b, 0x00, 0xff, + 0x04, 0x5c, 0x04, 0x01, 0x04, 0x81, 0x86, 0x9d, 0x06, 0x2d, 0x60, 0x01, + 0x07, 0x60, 0x28, 0x41, 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x09, + 0x06, 0x00, 0x00, 0x01, 0x07, 0x0f, 0xf0, 0xd1, 0x05, 0x4b, 0x80, 0xff, + 0x07, 0x4b, 0x00, 0x03, 0x05, 0x5c, 0x04, 0x03, 0x04, 0x81, 0x86, 0x9d, + 0x03, 0x3e, 0x50, 0x00, 0x06, 0x00, 0x00, 0x80, 0x01, 0x80, 0x07, 0x33, + 0x07, 0x60, 0x00, 0x41, 0x02, 0x80, 0x06, 0x83, 0x06, 0xa0, 0x06, 0xfb, + 0x02, 0x49, 0x00, 0xe5, 0x07, 0x81, 0x06, 0xa5, 0x03, 0x3e, 0x50, 0x00, + 0x06, 0x00, 0x00, 0x80, 0x02, 0x80, 0x00, 0x10, 0x07, 0xa0, 0x06, 0xe7, + 0x03, 0x0e, 0xf0, 0x41, 0x03, 0x86, 0x06, 0x17, 0x04, 0x05, 0x80, 0x51, + 0x07, 0x2d, 0x60, 0x00, 0x05, 0x60, 0x10, 0x41, 0x05, 0x0f, 0x80, 0xff, + 0x01, 0x2f, 0xa8, 0x09, 0x06, 0x00, 0xa0, 0xd0, 0x05, 0x00, 0xb0, 0xd1, + 0x06, 0x2d, 0x60, 0x01, 0x07, 0xf0, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, + 0x06, 0x00, 0xc0, 0xd0, 0x05, 0x00, 0xd0, 0xd1, 0x06, 0x2d, 0x60, 0x02, + 0x02, 0x79, 0xff, 0x0d, 0x07, 0xff, 0x00, 0x00, 0x04, 0x4d, 0x80, 0x0d, + 0x06, 0x0f, 0xf0, 0xd0, 0x07, 0x4b, 0x00, 0xff, 0x06, 0x5a, 0x00, 0x0d, + 0x06, 0x60, 0x12, 0x01, 0x05, 0x0f, 0x80, 0xff, 0x07, 0x3f, 0xa0, 0x22, + 0x07, 0x00, 0x00, 0x05, 0x00, 0x79, 0xfe, 0x0d, 0x07, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x20, 0xff, 0x05, 0x60, 0x2a, 0x41, 0x05, 0x0f, 0x80, 0xff, + 0x07, 0x3f, 0xa0, 0x0a, 0x06, 0x00, 0x00, 0x01, 0x02, 0x0e, 0xf0, 0x04, + 0x03, 0x86, 0x06, 0xe4, 0x04, 0x60, 0x1c, 0x04, 0x05, 0x0f, 0x80, 0xff, + 0x05, 0x3f, 0xa8, 0x09, 0x06, 0x00, 0x00, 0x01, 0x05, 0x0f, 0x80, 0xff, + 0x05, 0x3f, 0xa8, 0x0a, 0x06, 0x00, 0x00, 0x20, 0x07, 0x60, 0x28, 0x41, + 0x05, 0x0f, 0x80, 0xff, 0x07, 0x3f, 0xa0, 0x09, 0x06, 0x00, 0x00, 0x01, + 0x02, 0x79, 0xff, 0x02, 0x07, 0x00, 0x00, 0xff, 0x06, 0x78, 0x00, 0x0d, + 0x07, 0x00, 0xff, 0x00, 0x06, 0x5a, 0x00, 0x02, 0x07, 0x60, 0x28, 0x41, + 0x05, 0x0f, 0x80, 0xff, 0x07, 0x3f, 0xa0, 0x0a, 0x06, 0x00, 0x00, 0x01, + 0x07, 0x60, 0x00, 0x41, 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x0a, + 0x06, 0x00, 0x00, 0x01, 0x07, 0x60, 0x12, 0x41, 0x05, 0x0f, 0x80, 0xff, + 0x07, 0x3f, 0xa0, 0x0a, 0x06, 0x00, 0x00, 0x02, 0x03, 0x3e, 0x50, 0x00, + 0x06, 0x00, 0x00, 0x80, 0x01, 0x80, 0x07, 0x33, 0x04, 0x0f, 0x80, 0x32, + 0x07, 0x3f, 0xa0, 0x11, 0x06, 0x00, 0x00, 0x01, 0x06, 0x0f, 0xf0, 0x02, + 0x05, 0x5c, 0x04, 0x03, 0x04, 0x81, 0x86, 0xef, 0x00, 0x04, 0x10, 0x51, + 0x07, 0xc0, 0x00, 0x00, 0x04, 0x60, 0x04, 0x02, 0x04, 0x50, 0x04, 0x32, + 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x09, 0x06, 0x00, 0x00, 0x20, + 0x00, 0x40, 0x04, 0x02, 0x01, 0x68, 0x0e, 0xff, 0x07, 0x00, 0x30, 0xff, + 0x04, 0x0f, 0x80, 0x32, 0x05, 0x3f, 0xa8, 0x0a, 0x06, 0x00, 0x00, 0x01, + 0x07, 0xc0, 0x00, 0x00, 0x02, 0x49, 0x00, 0xe5, 0x06, 0x81, 0x06, 0xfe, + 0x07, 0xc0, 0x00, 0x00, 0x03, 0x3e, 0x50, 0x00, 0x07, 0x00, 0x00, 0xc0, + 0x07, 0xc0, 0x00, 0x00, 0x05, 0x00, 0x40, 0x36, 0x06, 0x00, 0x00, 0xd0, + 0x01, 0x79, 0xfe, 0x00, 0x07, 0x00, 0xff, 0xff, 0x05, 0x7d, 0xfe, 0xff, + 0x07, 0x00, 0xff, 0xff, 0x04, 0x81, 0x07, 0x20, 0x07, 0x00, 0x00, 0xd1, + 0x03, 0x79, 0xff, 0x00, 0x07, 0x00, 0xff, 0xff, 0x06, 0x00, 0x50, 0x51, + 0x06, 0x0f, 0xf0, 0x31, 0x05, 0x50, 0x04, 0x05, 0x05, 0x0f, 0x80, 0xff, + 0x07, 0x3f, 0xa0, 0x09, 0x06, 0x00, 0x00, 0x02, 0x02, 0x0e, 0xf0, 0x04, + 0x00, 0x86, 0x07, 0x1a, 0x04, 0x60, 0x04, 0x04, 0x05, 0x0f, 0x80, 0xff, + 0x01, 0x2f, 0xa8, 0x09, 0x00, 0x79, 0xfe, 0x01, 0x07, 0x00, 0xff, 0xff, + 0x05, 0x5c, 0x04, 0x00, 0x04, 0x81, 0x07, 0x20, 0x01, 0x40, 0x04, 0x05, + 0x07, 0x00, 0x50, 0xff, 0x05, 0x7d, 0xe0, 0xff, 0x06, 0x00, 0x00, 0x07, + 0x07, 0x81, 0x87, 0x0c, 0x04, 0x00, 0x40, 0x51, 0x07, 0xc0, 0x00, 0x00, + 0x07, 0x2d, 0x60, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, + 0x00, 0x01, 0x10, 0xd0, 0x01, 0x01, 0x20, 0xd1, 0x06, 0x2d, 0x60, 0x01, + 0x07, 0xf0, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x02, 0x01, 0x30, 0xd0, + 0x01, 0x01, 0x40, 0xd1, 0x06, 0x2d, 0x60, 0x02, 0x01, 0x01, 0x70, 0xd4, + 0x07, 0xf0, 0x00, 0x00, 0x02, 0x01, 0x50, 0xd0, 0x03, 0x01, 0x60, 0xd1, + 0x05, 0x3f, 0xa8, 0x3a, 0x06, 0x00, 0x00, 0x08, 0x07, 0xc0, 0x00, 0x00, + 0x07, 0x60, 0x0c, 0x41, 0x05, 0x0f, 0x80, 0xff, 0x07, 0x3f, 0xa0, 0x09, + 0x06, 0x00, 0x00, 0x01, 0x04, 0x78, 0x01, 0x02, 0x07, 0xff, 0xff, 0x00, + 0x04, 0x6a, 0x07, 0x02, 0x05, 0x0f, 0x80, 0xff, 0x07, 0x3f, 0xa0, 0x0a, + 0x06, 0x00, 0x00, 0x01, 0x05, 0x60, 0x0e, 0x41, 0x05, 0x0f, 0x80, 0xff, + 0x03, 0x2f, 0xa0, 0x69, 0x03, 0x80, 0x00, 0x53, 0xfa, 0x02, 0x28, 0xad, + 0x02, 0x80, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x05, 0x42, 0x04, 0x0f, 0x80, 0x1f, 0x01, 0x2f, 0xa8, 0xc9, + 0x04, 0x0f, 0x80, 0x1f, 0x07, 0x3f, 0xa0, 0x81, 0x06, 0x00, 0x00, 0x10, + 0x03, 0x20, 0x00, 0x05, 0x07, 0x42, 0x00, 0x00, 0x05, 0x0f, 0xb0, 0x00, + 0x04, 0x0f, 0x80, 0x1f, 0x07, 0x3f, 0xa0, 0x11, 0x06, 0x00, 0x00, 0x38, + 0x04, 0x0f, 0x80, 0x1f, 0x05, 0x3f, 0xa8, 0x59, 0x07, 0x00, 0x00, 0x3a, + 0x05, 0x0f, 0xe0, 0x00, 0x05, 0x81, 0x80, 0x0a, 0x07, 0x84, 0x00, 0x3c, + 0x04, 0x95, 0x80, 0x19, 0x03, 0x0e, 0x00, 0x11, 0x07, 0x2e, 0x42, 0x00, + 0x03, 0x80, 0x00, 0x14, 0x02, 0x91, 0x00, 0x1f, 0x05, 0x00, 0x10, 0xc0, + 0x04, 0x48, 0x20, 0x01, 0x04, 0x81, 0x80, 0xf8, 0x06, 0x48, 0x30, 0x01, + 0x06, 0x81, 0x81, 0x5b, 0x02, 0x92, 0x00, 0x29, 0x06, 0x8b, 0x00, 0x29, + 0x01, 0x8a, 0x01, 0x60, 0x05, 0x00, 0x10, 0xc0, 0x06, 0x78, 0x00, 0x01, + 0x05, 0x00, 0x07, 0xc0, 0x06, 0x81, 0x82, 0x3e, 0x06, 0x78, 0x00, 0x01, + 0x05, 0x00, 0xf8, 0x00, 0x07, 0x81, 0x82, 0x88, 0x03, 0x91, 0x00, 0x30, + 0x04, 0x0f, 0xe0, 0x29, 0x03, 0x86, 0x00, 0x30, 0x07, 0x6c, 0x00, 0x1d, + 0x05, 0x81, 0x02, 0x9c, 0x07, 0x6c, 0x0a, 0x1d, 0x05, 0x81, 0x02, 0xc5, + 0x02, 0x92, 0x00, 0xab, 0x04, 0x0f, 0xe0, 0x2f, 0x03, 0x86, 0x00, 0x3c, + 0x06, 0x00, 0x00, 0x13, 0x05, 0x0f, 0xb0, 0x00, 0x06, 0x6c, 0x00, 0x73, + 0x07, 0x81, 0x03, 0xd7, 0x01, 0x49, 0x20, 0xe4, 0x05, 0x81, 0x80, 0x3c, + 0x03, 0x40, 0x00, 0x00, 0x07, 0x6c, 0x0a, 0x00, 0x04, 0x81, 0x80, 0x34, + 0x06, 0x96, 0x00, 0x3e, 0x03, 0xb9, 0x00, 0xca, 0x05, 0x90, 0x80, 0x14, + 0x01, 0x01, 0x70, 0xe1, 0x07, 0x78, 0x00, 0x17, 0x03, 0xe0, 0x00, 0x00, + 0x06, 0x81, 0x00, 0x91, 0x05, 0x00, 0x10, 0xff, 0x01, 0x79, 0xfe, 0x17, + 0x03, 0x1f, 0xff, 0xff, 0x07, 0x00, 0x00, 0xff, 0x05, 0x60, 0x08, 0x00, + 0x05, 0x0f, 0x80, 0xff, 0x07, 0x3f, 0xa0, 0x09, 0x06, 0x00, 0x00, 0x01, + 0x06, 0x78, 0x00, 0x02, 0x02, 0x80, 0x00, 0x40, 0x03, 0x7c, 0x00, 0xff, + 0x03, 0x80, 0x00, 0x00, 0x06, 0x81, 0x00, 0x5d, 0x02, 0x49, 0xf0, 0x02, + 0x07, 0x81, 0x00, 0xaa, 0x04, 0x48, 0xe0, 0x02, 0x06, 0x81, 0x00, 0x5d, + 0x07, 0x60, 0x0c, 0x00, 0x05, 0x0f, 0x80, 0xff, 0x07, 0x3f, 0xa0, 0x09, + 0x06, 0x00, 0x00, 0x01, 0x06, 0x78, 0x00, 0x02, 0x07, 0xff, 0xff, 0x00, + 0x03, 0x7c, 0x00, 0xff, 0x05, 0x00, 0x02, 0x00, 0x05, 0x81, 0x80, 0xaa, + 0x06, 0x4b, 0xd4, 0x01, 0x03, 0xd0, 0x00, 0x5f, 0x02, 0x80, 0x00, 0xa8, + 0x02, 0x80, 0x00, 0x67, 0x03, 0x80, 0x00, 0x71, 0x03, 0x80, 0x00, 0x7b, + 0x02, 0x80, 0x00, 0x85, 0x02, 0x80, 0x00, 0x8f, 0x02, 0x80, 0x00, 0xa8, + 0x02, 0x80, 0x00, 0xa8, 0x05, 0x0f, 0xe0, 0x27, 0x00, 0x86, 0x80, 0x6b, + 0x01, 0x02, 0x80, 0x00, 0x02, 0x80, 0x00, 0x6e, 0x07, 0x60, 0x00, 0x27, + 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x0a, 0x01, 0x02, 0x70, 0x00, + 0x02, 0x40, 0x00, 0x29, 0x03, 0x80, 0x00, 0xaa, 0x04, 0x0f, 0xe0, 0x25, + 0x00, 0x86, 0x80, 0x75, 0x03, 0x02, 0x60, 0x00, 0x03, 0x80, 0x00, 0x78, + 0x06, 0x60, 0x00, 0x25, 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x0a, + 0x03, 0x02, 0x50, 0x00, 0x02, 0x40, 0x00, 0x29, 0x03, 0x80, 0x00, 0xaa, + 0x05, 0x0f, 0xe0, 0x21, 0x00, 0x86, 0x80, 0x7f, 0x01, 0x02, 0x20, 0x00, + 0x03, 0x80, 0x00, 0x82, 0x07, 0x60, 0x00, 0x21, 0x05, 0x0f, 0x80, 0xff, + 0x03, 0x2f, 0xa0, 0x0a, 0x01, 0x02, 0x10, 0x00, 0x02, 0x40, 0x00, 0x29, + 0x03, 0x80, 0x00, 0xaa, 0x04, 0x0f, 0xe0, 0x23, 0x00, 0x86, 0x80, 0x89, + 0x01, 0x02, 0x40, 0x00, 0x02, 0x80, 0x00, 0x8c, 0x06, 0x60, 0x00, 0x23, + 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x0a, 0x03, 0x02, 0x30, 0x00, + 0x02, 0x40, 0x00, 0x29, 0x03, 0x80, 0x00, 0xaa, 0x06, 0xa0, 0x00, 0xda, + 0x03, 0x80, 0x00, 0xaa, 0x01, 0x64, 0x08, 0x17, 0x04, 0x82, 0x80, 0xa8, + 0x07, 0x0f, 0xf0, 0x17, 0x03, 0xd0, 0x00, 0x95, 0x02, 0x80, 0x00, 0x9d, + 0x03, 0x80, 0x00, 0x9f, 0x02, 0x80, 0x00, 0xa2, 0x03, 0x80, 0x00, 0xa5, + 0x02, 0x80, 0x00, 0xa8, 0x02, 0x80, 0x00, 0xa8, 0x02, 0x80, 0x00, 0xa8, + 0x02, 0x80, 0x00, 0xa8, 0x03, 0xe0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x14, + 0x05, 0x90, 0x80, 0x9f, 0x03, 0x01, 0x60, 0xe1, 0x03, 0x80, 0x00, 0xaa, + 0x04, 0x90, 0x80, 0xa2, 0x03, 0x01, 0x50, 0xe1, 0x03, 0x80, 0x00, 0xaa, + 0x05, 0x90, 0x80, 0xa5, 0x01, 0x01, 0x40, 0xe1, 0x03, 0x80, 0x00, 0xaa, + 0x06, 0x0f, 0xc0, 0x13, 0x07, 0xa0, 0x05, 0x3a, 0x03, 0x80, 0x00, 0x14, + 0x01, 0x49, 0x40, 0xe4, 0x00, 0xa1, 0x80, 0xae, 0x03, 0x80, 0x00, 0x3c, + 0x02, 0x68, 0x1e, 0x0d, 0x05, 0x0f, 0xb0, 0xff, 0x04, 0x60, 0x08, 0x76, + 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x09, 0x06, 0x00, 0x00, 0x01, + 0x05, 0x48, 0x80, 0x03, 0x05, 0x81, 0x80, 0xbd, 0x04, 0x00, 0x80, 0x0d, + 0x01, 0x20, 0xd0, 0x00, 0x01, 0x3e, 0x40, 0x00, 0x05, 0x00, 0x02, 0x00, + 0x06, 0x00, 0x90, 0x76, 0x04, 0x00, 0x20, 0x75, 0x06, 0xa0, 0x05, 0x26, + 0x07, 0xc0, 0x00, 0x00, 0x07, 0x2e, 0x48, 0x00, 0x07, 0x00, 0x00, 0x12, + 0x02, 0x80, 0x00, 0xcd, 0x07, 0x47, 0xf0, 0x00, 0x05, 0x60, 0x08, 0x00, + 0x05, 0x0f, 0x80, 0xff, 0x01, 0x2f, 0xa8, 0x09, 0x02, 0x49, 0xf0, 0x01, + 0x06, 0x81, 0x00, 0xcd, 0x01, 0x01, 0x20, 0x00, 0x05, 0x2e, 0x4c, 0x00, + 0x07, 0xc0, 0x00, 0x00, 0x07, 0x00, 0x00, 0xeb, 0x03, 0x49, 0xf0, 0x00, + 0x04, 0x81, 0x80, 0xc1, 0x05, 0x60, 0x08, 0x00, 0x05, 0x0f, 0x80, 0xff, + 0x01, 0x2f, 0xa8, 0x09, 0x04, 0x48, 0xe0, 0x01, 0x06, 0x81, 0x00, 0xd3, + 0x07, 0xc0, 0x00, 0x00, 0x00, 0x79, 0xc1, 0x01, 0x07, 0xff, 0xff, 0xff, + 0x02, 0x7a, 0x4b, 0x01, 0x03, 0x80, 0x00, 0x00, 0x05, 0x60, 0x08, 0x00, + 0x05, 0x0f, 0x80, 0xff, 0x01, 0x2f, 0xa8, 0x0a, 0x07, 0x60, 0x0c, 0x00, + 0x05, 0x0f, 0x80, 0xff, 0x01, 0x2f, 0xa8, 0x21, 0x06, 0x78, 0x00, 0x01, + 0x07, 0xff, 0xff, 0x00, 0x03, 0x7c, 0x00, 0xff, 0x05, 0x00, 0x07, 0x00, + 0x07, 0x81, 0x00, 0xed, 0x06, 0x60, 0x18, 0x04, 0x07, 0x00, 0x30, 0xff, + 0x05, 0x0f, 0x80, 0xff, 0x01, 0x2f, 0xa8, 0x09, 0x05, 0x0f, 0x80, 0x03, + 0x03, 0x2f, 0xa0, 0x0a, 0x04, 0x0f, 0xe0, 0x01, 0x03, 0x86, 0x00, 0xee, + 0x04, 0x60, 0x02, 0x01, 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x0a, + 0x07, 0xc0, 0x00, 0x00, 0x05, 0x0f, 0xe0, 0x2e, 0x01, 0x86, 0x80, 0xf3, + 0x01, 0x02, 0xe0, 0x00, 0x03, 0x02, 0xf0, 0x00, 0x02, 0x80, 0x00, 0xf7, + 0x07, 0x60, 0x00, 0x2e, 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x0a, + 0x01, 0x02, 0xe0, 0x00, 0x07, 0xc0, 0x00, 0x00, 0x02, 0x2c, 0x00, 0x04, + 0x05, 0x6c, 0x04, 0x1d, 0x05, 0x81, 0x01, 0x0c, 0x05, 0x6c, 0x02, 0x1d, + 0x04, 0x81, 0x01, 0x23, 0x05, 0x6c, 0x08, 0x1d, 0x05, 0x81, 0x01, 0x35, + 0x07, 0x6c, 0x06, 0x1d, 0x04, 0x81, 0x01, 0x4f, 0x05, 0x21, 0xd0, 0x00, + 0x02, 0x02, 0xc0, 0x13, 0x02, 0x02, 0xa0, 0x13, 0x02, 0x02, 0x00, 0x13, + 0x04, 0x60, 0x02, 0x1a, 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x0a, + 0x07, 0x00, 0x00, 0x09, 0x03, 0xb6, 0x00, 0xbe, 0x04, 0x84, 0x80, 0x1f, + 0x03, 0x80, 0x00, 0x3c, 0x04, 0x0f, 0xe0, 0x2a, 0x00, 0x86, 0x01, 0x02, + 0x06, 0x00, 0x00, 0x13, 0x04, 0x00, 0x10, 0x13, 0x05, 0x60, 0x10, 0x2b, + 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x12, 0x06, 0x42, 0x00, 0x29, + 0x06, 0x60, 0x00, 0x2a, 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x09, + 0x06, 0x00, 0x00, 0x01, 0x05, 0x0f, 0xe0, 0x03, 0x00, 0x86, 0x01, 0x20, + 0x01, 0x02, 0x80, 0x03, 0x06, 0x60, 0x00, 0x2a, 0x05, 0x0f, 0x80, 0xff, + 0x05, 0x3f, 0xa8, 0x0a, 0x07, 0x00, 0x00, 0x09, 0x01, 0x80, 0x01, 0x50, + 0x00, 0x02, 0x80, 0x13, 0x00, 0x02, 0x70, 0x13, 0x01, 0x80, 0x01, 0x50, + 0x04, 0x0f, 0xe0, 0x2a, 0x00, 0x86, 0x01, 0x01, 0x06, 0x42, 0x00, 0x29, + 0x06, 0x60, 0x00, 0x2a, 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x09, + 0x06, 0x00, 0x00, 0x01, 0x05, 0x0f, 0xe0, 0x03, 0x00, 0x86, 0x01, 0x32, + 0x03, 0x02, 0x60, 0x03, 0x06, 0x60, 0x00, 0x2a, 0x05, 0x0f, 0x80, 0xff, + 0x05, 0x3f, 0xa8, 0x0a, 0x07, 0x00, 0x00, 0x09, 0x01, 0x80, 0x01, 0x50, + 0x02, 0x02, 0x60, 0x13, 0x02, 0x02, 0x50, 0x13, 0x01, 0x80, 0x01, 0x50, + 0x04, 0x0f, 0xe0, 0x2a, 0x00, 0x86, 0x01, 0x01, 0x06, 0x42, 0x00, 0x29, + 0x06, 0x60, 0x00, 0x2a, 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x09, + 0x06, 0x00, 0x00, 0x01, 0x05, 0x0f, 0xe0, 0x03, 0x01, 0x86, 0x01, 0x44, + 0x01, 0x02, 0x20, 0x03, 0x06, 0x60, 0x00, 0x2a, 0x05, 0x0f, 0x80, 0xff, + 0x05, 0x3f, 0xa8, 0x0a, 0x07, 0x00, 0x00, 0x09, 0x00, 0x80, 0x01, 0x46, + 0x00, 0x02, 0x20, 0x13, 0x00, 0x02, 0x10, 0x13, 0x06, 0x47, 0xf0, 0x20, + 0x00, 0x7a, 0x01, 0x20, 0x04, 0x00, 0x01, 0x01, 0x05, 0xa0, 0x02, 0x8d, + 0x04, 0x00, 0x80, 0x2a, 0x06, 0xa0, 0x05, 0x1f, 0x02, 0x94, 0x81, 0x01, + 0x05, 0x21, 0xd0, 0x05, 0x00, 0x80, 0x01, 0x02, 0x01, 0x80, 0x01, 0x0a, + 0x06, 0x47, 0xf0, 0x20, 0x06, 0x48, 0x60, 0x20, 0x07, 0x81, 0x81, 0x55, + 0x05, 0xa0, 0x02, 0x8d, 0x00, 0x80, 0x01, 0x01, 0x00, 0x7a, 0x01, 0x20, + 0x04, 0x00, 0x01, 0x01, 0x05, 0xa0, 0x02, 0x8d, 0x04, 0x00, 0x80, 0x2a, + 0x06, 0xa0, 0x05, 0x1f, 0x00, 0x80, 0x01, 0x01, 0x04, 0x0f, 0xd0, 0x2a, + 0x05, 0x2e, 0x40, 0x03, 0x00, 0x20, 0x80, 0x10, 0x06, 0xa0, 0x05, 0x1f, + 0x01, 0x80, 0x01, 0x0a, 0x00, 0x01, 0x80, 0x98, 0x07, 0x48, 0x00, 0x18, + 0x07, 0x81, 0x81, 0x71, 0x05, 0x48, 0x10, 0x18, 0x07, 0x81, 0x81, 0x6f, + 0x05, 0x48, 0x20, 0x18, 0x06, 0x81, 0x81, 0x6d, 0x07, 0x48, 0x30, 0x18, + 0x06, 0x81, 0x81, 0x6b, 0x00, 0x2f, 0xb0, 0x04, 0x01, 0x80, 0x01, 0x72, + 0x01, 0x2f, 0xb0, 0x03, 0x01, 0x80, 0x01, 0x72, 0x00, 0x2f, 0xb0, 0x02, + 0x01, 0x80, 0x01, 0x72, 0x00, 0x2f, 0xb0, 0x01, 0x01, 0x80, 0x01, 0x72, + 0x01, 0x2f, 0xb0, 0x00, 0x01, 0x79, 0xfe, 0x78, 0x07, 0x00, 0x00, 0xff, + 0x03, 0x01, 0x90, 0xff, 0x00, 0x01, 0x70, 0x86, 0x04, 0x8b, 0x01, 0x76, + 0x03, 0x38, 0x50, 0x00, 0x03, 0x02, 0x00, 0x00, 0x07, 0x78, 0x00, 0x17, + 0x00, 0x43, 0x04, 0x07, 0x06, 0x81, 0x81, 0xfe, 0x04, 0x6c, 0x04, 0x19, + 0x05, 0x81, 0x01, 0xb2, 0x04, 0x6c, 0x02, 0x19, 0x05, 0x81, 0x01, 0x82, + 0x07, 0x21, 0x90, 0x00, 0x01, 0x80, 0x01, 0x96, 0x07, 0x21, 0x90, 0x00, + 0x07, 0x48, 0x30, 0x17, 0x05, 0x81, 0x01, 0x9c, 0x05, 0x48, 0x20, 0x17, + 0x05, 0x81, 0x01, 0xa3, 0x04, 0x48, 0xb0, 0x75, 0x07, 0x81, 0x81, 0x96, + 0x06, 0x60, 0x14, 0x76, 0x05, 0x0f, 0x80, 0xff, 0x07, 0x3f, 0xa0, 0x22, + 0x06, 0x00, 0x00, 0x3e, 0x06, 0x00, 0x00, 0x80, 0x05, 0x00, 0x10, 0x81, + 0x05, 0x00, 0x20, 0x82, 0x06, 0x00, 0x30, 0x83, 0x05, 0x00, 0x40, 0x84, + 0x04, 0x60, 0x1c, 0x76, 0x05, 0x0f, 0x80, 0xff, 0x02, 0x2f, 0xa0, 0x2a, + 0x07, 0x21, 0x90, 0x00, 0x07, 0x78, 0x00, 0x78, 0x07, 0xff, 0xff, 0x00, + 0x04, 0x5a, 0x04, 0x19, 0x01, 0x07, 0x80, 0xff, 0x04, 0x84, 0x80, 0x1f, + 0x03, 0x80, 0x00, 0x3c, 0x04, 0x0f, 0xe0, 0x7f, 0x00, 0x86, 0x01, 0xab, + 0x04, 0xa0, 0x01, 0xcb, 0x01, 0x92, 0x01, 0x96, 0x04, 0x0f, 0xe0, 0x7f, + 0x06, 0xa6, 0x81, 0xcb, 0x01, 0x80, 0x01, 0x96, 0x05, 0x60, 0x10, 0x7b, + 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x09, 0x07, 0x44, 0xf0, 0x00, + 0x05, 0x60, 0x10, 0x7b, 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x0a, + 0x00, 0x80, 0x01, 0x89, 0x05, 0x2e, 0x40, 0x0c, 0x04, 0x00, 0x80, 0xfb, + 0x04, 0x6a, 0xa1, 0x08, 0x06, 0x00, 0x90, 0x76, 0x04, 0x00, 0x20, 0x75, + 0x06, 0xa0, 0x05, 0x26, 0x01, 0x80, 0x01, 0x96, 0x06, 0x21, 0x90, 0x01, + 0x05, 0x48, 0x20, 0x17, 0x04, 0x81, 0x01, 0xbf, 0x04, 0x8b, 0x01, 0xb5, + 0x06, 0x0f, 0xf0, 0x86, 0x03, 0x49, 0xf0, 0xff, 0x06, 0x81, 0x81, 0x75, + 0x07, 0x48, 0x30, 0x17, 0x04, 0x81, 0x01, 0xbc, 0x05, 0x0f, 0xd0, 0xff, + 0x04, 0x0f, 0xe0, 0x7f, 0x06, 0xa6, 0x81, 0xcb, 0x01, 0x80, 0x01, 0x96, + 0x05, 0x00, 0x40, 0x84, 0x04, 0xa0, 0x02, 0x20, 0x01, 0x92, 0x01, 0x96, + 0x07, 0x0f, 0xf0, 0x7d, 0x04, 0x50, 0x04, 0x7c, 0x05, 0x60, 0x04, 0xff, + 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x09, 0x07, 0x0f, 0xf0, 0x00, + 0x00, 0x54, 0x04, 0x79, 0x03, 0x07, 0x90, 0xff, 0x01, 0x80, 0x01, 0xa3, + 0x06, 0x0f, 0xf0, 0x79, 0x00, 0x54, 0x04, 0x7a, 0x04, 0x82, 0x01, 0xf7, + 0x04, 0x81, 0x01, 0xf7, 0x07, 0x0f, 0xf0, 0x7d, 0x04, 0x50, 0x04, 0x7c, + 0x05, 0x0f, 0x80, 0xff, 0x00, 0x2f, 0xa8, 0x19, 0x04, 0x8b, 0x01, 0xd3, + 0x02, 0x08, 0x00, 0x01, 0x00, 0x08, 0x10, 0x02, 0x01, 0x08, 0x20, 0x03, + 0x05, 0x8b, 0x01, 0xd7, 0x03, 0x38, 0x50, 0x00, 0x03, 0x01, 0x00, 0x00, + 0x02, 0x40, 0x00, 0x19, 0x07, 0x0f, 0xf0, 0x03, 0x04, 0x50, 0x04, 0x79, + 0x03, 0x07, 0x90, 0xff, 0x03, 0x40, 0x00, 0x7e, 0x06, 0x42, 0x00, 0x7f, + 0x04, 0x81, 0x01, 0xf7, 0x07, 0x0f, 0xf0, 0x7e, 0x05, 0x0f, 0x80, 0xff, + 0x03, 0x2f, 0xa0, 0x09, 0x05, 0x0f, 0xe0, 0x00, 0x03, 0x86, 0x81, 0xf6, + 0x07, 0x0f, 0xf0, 0x7d, 0x05, 0x60, 0x02, 0xff, 0x05, 0x0f, 0x80, 0xff, + 0x03, 0x2f, 0xa0, 0x09, 0x01, 0x07, 0xd0, 0x00, 0x00, 0x86, 0x01, 0xf8, + 0x05, 0x60, 0x08, 0x7d, 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x09, + 0x03, 0x68, 0x1e, 0x00, 0x05, 0x50, 0x04, 0x1b, 0x05, 0x0f, 0x80, 0xff, + 0x03, 0x2f, 0xa0, 0x09, 0x01, 0x07, 0xe0, 0x00, 0x07, 0x0f, 0xf0, 0x7e, + 0x01, 0x80, 0x01, 0xe2, 0x03, 0x07, 0xc0, 0x00, 0x07, 0xc0, 0x00, 0x00, + 0x05, 0x2e, 0x40, 0x0c, 0x04, 0x00, 0x80, 0xfb, 0x04, 0x6a, 0xa1, 0x08, + 0x06, 0x00, 0x90, 0x76, 0x04, 0x00, 0x20, 0x75, 0x02, 0x80, 0x05, 0x26, + 0x04, 0x0f, 0xd0, 0x76, 0x05, 0x0f, 0xd0, 0x17, 0x06, 0x0f, 0xf0, 0x86, + 0x07, 0x78, 0x00, 0xff, 0x07, 0x00, 0x00, 0x60, 0x03, 0x7c, 0x00, 0xff, + 0x07, 0x00, 0x00, 0x60, 0x07, 0x81, 0x82, 0x00, 0x07, 0x78, 0x00, 0x78, + 0x07, 0xff, 0xff, 0x00, 0x04, 0x5a, 0x04, 0x19, 0x01, 0x07, 0x80, 0xff, + 0x06, 0x60, 0x14, 0x76, 0x05, 0x0f, 0x80, 0xff, 0x07, 0x3f, 0xa0, 0x22, + 0x06, 0x00, 0x00, 0x3e, 0x05, 0x2e, 0x40, 0x0c, 0x04, 0x60, 0x08, 0x76, + 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x09, 0x06, 0x00, 0x00, 0x01, + 0x05, 0x48, 0x80, 0x03, 0x04, 0x81, 0x02, 0x1a, 0x04, 0x00, 0xd0, 0xfb, + 0x06, 0x6a, 0x81, 0x0d, 0x01, 0x3e, 0x40, 0x00, 0x07, 0x00, 0x03, 0x00, + 0x02, 0x80, 0x00, 0x29, 0x04, 0x00, 0x80, 0xfb, 0x06, 0x6a, 0x81, 0x08, + 0x06, 0x00, 0x90, 0x76, 0x04, 0x00, 0x20, 0x75, 0x06, 0xa0, 0x05, 0x26, + 0x02, 0x80, 0x00, 0x29, 0x02, 0x40, 0x00, 0x7f, 0x07, 0x42, 0x00, 0x7e, + 0x05, 0x0f, 0x80, 0x7e, 0x03, 0x2f, 0xa0, 0x09, 0x05, 0x0f, 0xe0, 0x00, + 0x03, 0x86, 0x82, 0x3a, 0x07, 0x0f, 0xf0, 0x7d, 0x05, 0x5c, 0x04, 0x7b, + 0x04, 0x81, 0x02, 0x2f, 0x07, 0x60, 0x00, 0x7d, 0x05, 0x0f, 0x80, 0xff, + 0x03, 0x2f, 0xa0, 0x09, 0x05, 0x0f, 0xe0, 0x00, 0x02, 0x86, 0x82, 0x2f, + 0x07, 0x0f, 0xf0, 0x7b, 0x01, 0x07, 0xd0, 0xff, 0x05, 0x60, 0x08, 0x7d, + 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x09, 0x03, 0x68, 0x1e, 0x00, + 0x04, 0x50, 0x04, 0x1c, 0x01, 0x07, 0xe0, 0xff, 0x05, 0x0f, 0x80, 0xff, + 0x03, 0x2f, 0xa0, 0x09, 0x05, 0x0f, 0xe0, 0x00, 0x01, 0x86, 0x02, 0x3c, + 0x03, 0x07, 0xc0, 0x00, 0x07, 0xc0, 0x00, 0x00, 0x04, 0x0f, 0xd0, 0x76, + 0x03, 0x80, 0x05, 0x3a, 0x01, 0x01, 0x80, 0xc0, 0x05, 0x48, 0xe0, 0x18, + 0x06, 0x81, 0x82, 0x57, 0x07, 0x48, 0xf0, 0x18, 0x07, 0x81, 0x82, 0x53, + 0x03, 0x49, 0x00, 0x18, 0x06, 0x81, 0x82, 0x4f, 0x01, 0x49, 0x10, 0x18, + 0x07, 0x81, 0x82, 0x4b, 0x07, 0x3c, 0x00, 0x00, 0x06, 0x00, 0x00, 0x40, + 0x02, 0x20, 0x00, 0x04, 0x01, 0x80, 0x02, 0x5a, 0x07, 0x3c, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x20, 0x03, 0x20, 0x00, 0x03, 0x01, 0x80, 0x02, 0x5a, + 0x07, 0x3c, 0x00, 0x00, 0x06, 0x00, 0x00, 0x10, 0x02, 0x20, 0x00, 0x02, + 0x01, 0x80, 0x02, 0x5a, 0x07, 0x3c, 0x00, 0x00, 0x06, 0x00, 0x00, 0x08, + 0x02, 0x20, 0x00, 0x01, 0x01, 0x80, 0x02, 0x5a, 0x07, 0x3c, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x04, 0x06, 0x00, 0x00, 0x13, 0x05, 0x0f, 0xb0, 0x00, + 0x04, 0x0f, 0xe0, 0x76, 0x01, 0x86, 0x02, 0x7d, 0x04, 0x6c, 0x02, 0x73, + 0x07, 0x81, 0x82, 0x69, 0x04, 0x48, 0xb0, 0x75, 0x04, 0x81, 0x02, 0x70, + 0x06, 0x00, 0x00, 0x13, 0x04, 0x00, 0x10, 0x13, 0x05, 0x60, 0x10, 0x7b, + 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x12, 0x00, 0x46, 0xb0, 0x75, + 0x03, 0xb6, 0x00, 0xbe, 0x01, 0x80, 0x02, 0x71, 0x06, 0x6c, 0x00, 0x73, + 0x04, 0x81, 0x02, 0x6e, 0x04, 0x0f, 0xd0, 0x76, 0x07, 0xa0, 0x05, 0x3a, + 0x03, 0x80, 0x00, 0x14, 0x04, 0x0f, 0xd0, 0x76, 0x01, 0x80, 0x02, 0x71, + 0x00, 0x45, 0x20, 0x75, 0x00, 0x07, 0x70, 0x13, 0x06, 0x47, 0xf0, 0x75, + 0x06, 0x48, 0x60, 0x75, 0x07, 0x81, 0x82, 0x77, 0x05, 0xa0, 0x02, 0x93, + 0x01, 0x80, 0x02, 0x7d, 0x00, 0x7a, 0x01, 0x75, 0x04, 0x00, 0x01, 0x01, + 0x05, 0xa0, 0x02, 0x93, 0x04, 0x00, 0x80, 0x76, 0x02, 0x45, 0xf0, 0x08, + 0x06, 0xa0, 0x05, 0x1f, 0x07, 0x27, 0x30, 0x00, 0x05, 0x60, 0x02, 0x72, + 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x0a, 0x07, 0x00, 0x00, 0x09, + 0x03, 0x79, 0xff, 0x78, 0x07, 0x00, 0x00, 0xff, 0x02, 0x07, 0x60, 0x13, + 0x02, 0x07, 0x50, 0x13, 0x04, 0x84, 0x80, 0x1f, 0x03, 0x80, 0x00, 0x3c, + 0x07, 0x0f, 0xc0, 0xff, 0x05, 0x2e, 0x40, 0x0c, 0x00, 0x20, 0x80, 0x20, + 0x06, 0xa0, 0x05, 0x1f, 0x00, 0x80, 0x02, 0x86, 0x06, 0x00, 0x00, 0x20, + 0x04, 0x00, 0x10, 0x16, 0x04, 0x60, 0x08, 0x2a, 0x05, 0x0f, 0x80, 0xff, + 0x03, 0x2f, 0xa0, 0x12, 0x07, 0xc0, 0x00, 0x00, 0x06, 0x00, 0x00, 0x75, + 0x04, 0x00, 0x10, 0xa2, 0x04, 0x4b, 0x08, 0x01, 0x06, 0x0f, 0xf0, 0x16, + 0x06, 0x5a, 0x00, 0x01, 0x04, 0x60, 0x08, 0x76, 0x05, 0x0f, 0x80, 0xff, + 0x03, 0x2f, 0xa0, 0x12, 0x07, 0xc0, 0x00, 0x00, 0x05, 0x0f, 0xe0, 0x22, + 0x00, 0x86, 0x02, 0xa7, 0x04, 0x21, 0xd0, 0x04, 0x03, 0x02, 0xa0, 0x22, + 0x05, 0xa0, 0x02, 0xd4, 0x04, 0x48, 0x80, 0x20, 0x04, 0x81, 0x02, 0xb9, + 0x04, 0x0f, 0xd0, 0x2a, 0x05, 0x21, 0xd0, 0x00, 0x02, 0x02, 0xa0, 0x13, + 0x02, 0x02, 0x00, 0x13, 0x04, 0x0f, 0xe0, 0x26, 0x00, 0x86, 0x02, 0xbf, + 0x04, 0x21, 0xd0, 0x01, 0x02, 0x02, 0xa0, 0x26, 0x05, 0xa0, 0x02, 0xd4, + 0x02, 0x02, 0xc0, 0x13, 0x00, 0x68, 0x3e, 0x20, 0x07, 0x00, 0x60, 0xff, + 0x05, 0x6c, 0x02, 0x06, 0x06, 0x81, 0x03, 0x07, 0x05, 0x6c, 0x04, 0x06, + 0x07, 0x81, 0x03, 0x1d, 0x07, 0x6c, 0x06, 0x06, 0x07, 0x81, 0x03, 0x8e, + 0x04, 0x48, 0x80, 0x20, 0x07, 0x81, 0x82, 0xbb, 0x05, 0x6c, 0x16, 0x06, + 0x07, 0x81, 0x03, 0x9c, 0x06, 0xa0, 0x05, 0x16, 0x00, 0x80, 0x02, 0xcd, + 0x04, 0x0f, 0xd0, 0x2a, 0x05, 0x21, 0xd0, 0x00, 0x02, 0x02, 0xa0, 0x13, + 0x02, 0x02, 0x00, 0x13, 0x05, 0x0f, 0xe0, 0x28, 0x00, 0x86, 0x02, 0xcd, + 0x03, 0x02, 0xa0, 0x28, 0x04, 0x21, 0xd0, 0x02, 0x05, 0xa0, 0x02, 0xd4, + 0x01, 0x80, 0x02, 0xdb, 0x05, 0x0f, 0xe0, 0x22, 0x00, 0x86, 0x02, 0xcd, + 0x04, 0x21, 0xd0, 0x04, 0x03, 0x02, 0xa0, 0x22, 0x05, 0xa0, 0x02, 0xd4, + 0x04, 0x48, 0x80, 0x20, 0x07, 0x81, 0x82, 0xcf, 0x06, 0xa0, 0x05, 0x16, + 0x05, 0x84, 0x80, 0x30, 0x03, 0x80, 0x00, 0x3c, 0x04, 0x0f, 0xd0, 0x2a, + 0x05, 0x21, 0xd0, 0x00, 0x02, 0x02, 0xa0, 0x13, 0x02, 0x02, 0x00, 0x13, + 0x00, 0x80, 0x02, 0xcd, 0x04, 0x60, 0x08, 0x2a, 0x05, 0x0f, 0x80, 0xff, + 0x02, 0x2f, 0xa0, 0x31, 0x03, 0x02, 0x00, 0x00, 0x00, 0x02, 0xb0, 0x04, + 0x01, 0x01, 0x80, 0x05, 0x07, 0xc0, 0x00, 0x00, 0x04, 0x00, 0x70, 0x2a, + 0x07, 0xa0, 0x03, 0xcf, 0x00, 0x7a, 0x01, 0x01, 0x07, 0x06, 0x00, 0x00, + 0x07, 0x30, 0x30, 0x00, 0x07, 0x00, 0x82, 0x90, 0x07, 0x60, 0x00, 0x18, + 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x09, 0x07, 0x00, 0x00, 0x03, + 0x04, 0x48, 0xe0, 0x07, 0x06, 0x81, 0x82, 0xe9, 0x06, 0x00, 0x60, 0x13, + 0x01, 0x80, 0x02, 0xf0, 0x02, 0x40, 0x00, 0x10, 0x04, 0x81, 0x02, 0xe9, + 0x06, 0x00, 0x60, 0x10, 0x04, 0x60, 0x32, 0x2a, 0x05, 0x0f, 0x80, 0xff, + 0x07, 0x3f, 0xa0, 0x0a, 0x07, 0x00, 0x00, 0x03, 0x05, 0x0f, 0x80, 0x1e, + 0x03, 0x2f, 0xa0, 0x3a, 0x06, 0x3a, 0xa0, 0x20, 0x06, 0x00, 0x00, 0x02, + 0x01, 0x3e, 0x40, 0x00, 0x07, 0x00, 0x00, 0x30, 0x01, 0x98, 0x02, 0xf6, + 0x07, 0x0f, 0xf0, 0xf6, 0x03, 0x68, 0x30, 0xff, 0x06, 0x81, 0x82, 0xf7, + 0x07, 0x0f, 0x00, 0x1e, 0x05, 0x60, 0x10, 0x2b, 0x05, 0x0f, 0x10, 0xff, + 0x06, 0x3f, 0x3c, 0x08, 0x06, 0x00, 0x00, 0x0d, 0x01, 0x3e, 0x40, 0x00, + 0x06, 0x00, 0x00, 0x20, 0x04, 0x0f, 0x80, 0x1a, 0x03, 0x20, 0x00, 0x0a, + 0x02, 0x20, 0x17, 0xd0, 0x03, 0x2f, 0xa0, 0x12, 0x02, 0x02, 0xc0, 0x13, + 0x00, 0x80, 0x02, 0xcd, 0x04, 0x00, 0x70, 0x13, 0x07, 0xa0, 0x03, 0xcf, + 0x00, 0x7a, 0x01, 0x01, 0x07, 0x05, 0x00, 0x00, 0x07, 0x30, 0x30, 0x00, + 0x07, 0x00, 0x88, 0x90, 0x07, 0x4d, 0x00, 0x05, 0x06, 0x00, 0x60, 0x13, + 0x05, 0x0f, 0x80, 0x1e, 0x03, 0x2f, 0xa0, 0x3a, 0x05, 0x60, 0x1a, 0x2b, + 0x05, 0x0f, 0x80, 0xff, 0x02, 0x2f, 0xa0, 0x19, 0x04, 0x00, 0x10, 0x02, + 0x04, 0x00, 0x20, 0x13, 0x04, 0x0f, 0x80, 0x1f, 0x02, 0x2f, 0xa0, 0x1a, + 0x07, 0x3a, 0xa0, 0x0c, 0x06, 0x00, 0x00, 0x02, 0x07, 0x30, 0x0c, 0x03, + 0x06, 0x00, 0x00, 0x0d, 0x02, 0x80, 0x03, 0xbc, 0x04, 0x00, 0x70, 0x13, + 0x07, 0xa0, 0x03, 0xcf, 0x00, 0x7a, 0x01, 0x01, 0x03, 0x07, 0x00, 0x00, + 0x06, 0x60, 0x28, 0x2a, 0x05, 0x0f, 0x80, 0xff, 0x07, 0x3f, 0xa0, 0x09, + 0x06, 0x00, 0x00, 0x04, 0x02, 0x49, 0x90, 0x08, 0x06, 0x81, 0x03, 0x2a, + 0x07, 0x30, 0x30, 0x00, 0x07, 0x00, 0x88, 0x90, 0x02, 0x80, 0x03, 0x2c, + 0x07, 0x30, 0x30, 0x00, 0x04, 0x00, 0x89, 0x80, 0x05, 0x00, 0x70, 0x03, + 0x07, 0x4d, 0x00, 0x05, 0x06, 0x00, 0x60, 0x13, 0x05, 0x0f, 0x80, 0x1e, + 0x03, 0x2f, 0xa0, 0x3a, 0x07, 0x60, 0x14, 0x2b, 0x05, 0x0f, 0x80, 0xff, + 0x03, 0x2f, 0xa0, 0x21, 0x06, 0x4b, 0x00, 0x02, 0x02, 0x49, 0x90, 0x08, + 0x06, 0x81, 0x03, 0x38, 0x06, 0x44, 0xc0, 0x02, 0x05, 0x4b, 0x04, 0x00, + 0x05, 0x00, 0x40, 0xff, 0x06, 0x69, 0x81, 0x04, 0x05, 0x81, 0x83, 0x4d, + 0x06, 0x00, 0x00, 0x13, 0x04, 0x00, 0x10, 0x13, 0x04, 0x78, 0x01, 0x02, + 0x06, 0x00, 0x00, 0x10, 0x06, 0x00, 0x30, 0x13, 0x04, 0x00, 0x40, 0x13, + 0x06, 0x00, 0x50, 0x13, 0x06, 0x00, 0x60, 0x13, 0x04, 0x00, 0x70, 0x13, + 0x00, 0x64, 0x40, 0x15, 0x06, 0x82, 0x03, 0x49, 0x04, 0x44, 0x80, 0x02, + 0x02, 0x20, 0x50, 0x08, 0x04, 0x0f, 0x80, 0x1f, 0x03, 0x2f, 0xa0, 0x42, + 0x04, 0x00, 0x80, 0x15, 0x02, 0x80, 0x03, 0x86, 0x04, 0x6c, 0x80, 0x04, + 0x04, 0x81, 0x83, 0x5b, 0x01, 0x20, 0x80, 0x18, 0x06, 0x78, 0x00, 0x02, + 0x07, 0x00, 0x00, 0x03, 0x04, 0x81, 0x83, 0x5e, 0x06, 0x00, 0x30, 0x01, + 0x06, 0x00, 0x00, 0x13, 0x04, 0x00, 0x10, 0x13, 0x04, 0x00, 0x40, 0x13, + 0x06, 0x00, 0x50, 0x13, 0x04, 0x0f, 0x80, 0x1f, 0x02, 0x2f, 0xa0, 0x32, + 0x02, 0x80, 0x03, 0x86, 0x04, 0x0f, 0xd0, 0x2a, 0x07, 0xa0, 0x05, 0x3a, + 0x03, 0x80, 0x00, 0x14, 0x03, 0x79, 0xff, 0x03, 0x07, 0x00, 0x00, 0xff, + 0x04, 0x48, 0x80, 0x02, 0x07, 0x81, 0x03, 0x65, 0x07, 0x0f, 0xf0, 0x03, + 0x04, 0x50, 0x04, 0x08, 0x05, 0x00, 0x80, 0xff, 0x03, 0x79, 0xff, 0x00, + 0x07, 0x00, 0x00, 0xff, 0x06, 0x48, 0x90, 0x02, 0x07, 0x81, 0x03, 0x6c, + 0x07, 0x0f, 0xf0, 0x00, 0x04, 0x50, 0x04, 0x08, 0x05, 0x00, 0x80, 0xff, + 0x07, 0x00, 0x50, 0x03, 0x05, 0x00, 0x40, 0x00, 0x06, 0x00, 0x30, 0x01, + 0x06, 0x00, 0x00, 0x13, 0x04, 0x00, 0x10, 0x13, 0x04, 0x0f, 0x80, 0x1f, + 0x02, 0x2f, 0xa0, 0x32, 0x05, 0x60, 0x1c, 0x2b, 0x05, 0x0f, 0x80, 0xff, + 0x02, 0x2f, 0xa0, 0x31, 0x06, 0x60, 0x0c, 0x1f, 0x05, 0x0f, 0x80, 0xff, + 0x02, 0x2f, 0xa0, 0x32, 0x02, 0x68, 0x06, 0x08, 0x06, 0x81, 0x03, 0x86, + 0x01, 0x64, 0x08, 0xff, 0x05, 0x7d, 0xfe, 0xff, 0x07, 0xff, 0xff, 0xff, + 0x03, 0x40, 0x00, 0xff, 0x04, 0x5a, 0x04, 0x07, 0x07, 0x00, 0x00, 0xff, + 0x07, 0x60, 0x06, 0x1e, 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x0a, + 0x06, 0x60, 0x09, 0x08, 0x06, 0x69, 0xf9, 0x08, 0x02, 0x7a, 0x00, 0x08, + 0x06, 0x00, 0x00, 0x20, 0x07, 0x0a, 0xa0, 0xff, 0x02, 0x4a, 0x24, 0x08, + 0x03, 0x7a, 0x00, 0xff, 0x06, 0x00, 0x00, 0xdc, 0x07, 0x00, 0x00, 0xff, + 0x02, 0x80, 0x03, 0xbc, 0x04, 0x00, 0x70, 0x13, 0x07, 0xa0, 0x03, 0xcf, + 0x00, 0x7a, 0x01, 0x01, 0x07, 0x03, 0x00, 0x00, 0x07, 0x30, 0x30, 0x00, + 0x07, 0x00, 0x81, 0x90, 0x06, 0x00, 0x60, 0x13, 0x05, 0x0f, 0x80, 0x1e, + 0x03, 0x2f, 0xa0, 0x3a, 0x07, 0x3a, 0xa0, 0x00, 0x06, 0x00, 0x00, 0x02, + 0x07, 0x30, 0x0c, 0x00, 0x07, 0x00, 0x00, 0x05, 0x02, 0x80, 0x03, 0xbc, + 0x04, 0x00, 0x70, 0x13, 0x07, 0xa0, 0x03, 0xcf, 0x00, 0x7a, 0x01, 0x01, + 0x07, 0x81, 0x00, 0x00, 0x07, 0x30, 0x30, 0x00, 0x07, 0x00, 0x00, 0x90, + 0x06, 0x00, 0x60, 0x13, 0x06, 0x60, 0x0c, 0x2a, 0x05, 0x0f, 0x80, 0xff, + 0x05, 0x3f, 0xa8, 0x09, 0x07, 0x00, 0x00, 0x03, 0x04, 0x78, 0x01, 0x07, + 0x07, 0xff, 0xff, 0x00, 0x00, 0x7c, 0x01, 0x07, 0x07, 0x00, 0x05, 0x00, + 0x05, 0x81, 0x83, 0xaf, 0x07, 0x30, 0x30, 0x00, 0x05, 0x00, 0x08, 0x90, + 0x07, 0x4d, 0x00, 0x05, 0x06, 0x60, 0x28, 0x2a, 0x05, 0x0f, 0x80, 0xff, + 0x05, 0x3f, 0xa8, 0x09, 0x07, 0x00, 0x00, 0x03, 0x00, 0x49, 0xd0, 0x07, + 0x06, 0x81, 0x03, 0xb6, 0x02, 0x20, 0x60, 0x01, 0x05, 0x0f, 0x80, 0x1e, + 0x03, 0x2f, 0xa0, 0x3a, 0x07, 0x3a, 0xa0, 0x00, 0x06, 0x00, 0x00, 0x02, + 0x07, 0x30, 0x0c, 0x00, 0x07, 0x00, 0x00, 0x05, 0x01, 0x3e, 0x40, 0x00, + 0x07, 0x00, 0x00, 0x30, 0x03, 0x98, 0x03, 0xbe, 0x07, 0x0f, 0xf0, 0xf6, + 0x03, 0x68, 0x30, 0xff, 0x04, 0x81, 0x83, 0xbf, 0x07, 0x0f, 0x00, 0x1e, + 0x04, 0x0f, 0x10, 0x1f, 0x07, 0x0f, 0x30, 0x00, 0x01, 0x3e, 0x40, 0x00, + 0x06, 0x00, 0x00, 0x20, 0x04, 0x0f, 0x80, 0x1a, 0x03, 0x20, 0x00, 0x0a, + 0x02, 0x20, 0x17, 0xd0, 0x03, 0x2f, 0xa0, 0x12, 0x00, 0x80, 0x02, 0xcd, + 0x03, 0x20, 0x00, 0x00, 0x06, 0x00, 0x60, 0x76, 0x03, 0x80, 0x03, 0xd1, + 0x03, 0x20, 0x00, 0x11, 0x06, 0x00, 0x60, 0x2a, 0x05, 0xa0, 0x04, 0x66, + 0x05, 0x60, 0x04, 0x06, 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x09, + 0x06, 0x00, 0x00, 0x02, 0x07, 0xc0, 0x00, 0x00, 0x02, 0x07, 0x60, 0x2f, + 0x04, 0x60, 0x08, 0x76, 0x05, 0x0f, 0x80, 0xff, 0x02, 0x2f, 0xa0, 0x31, + 0x03, 0x07, 0x50, 0x00, 0x00, 0x07, 0xb0, 0x04, 0x01, 0x01, 0x80, 0x05, + 0x06, 0x60, 0x00, 0x76, 0x05, 0x00, 0x20, 0xff, 0x05, 0x0f, 0x80, 0xff, + 0x03, 0x2f, 0xa0, 0x11, 0x03, 0x02, 0xf0, 0x00, 0x01, 0x86, 0x83, 0xee, + 0x02, 0x02, 0xf0, 0x01, 0x00, 0x86, 0x83, 0xec, 0x00, 0x02, 0xe0, 0x13, + 0x07, 0x60, 0x18, 0x18, 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x0a, + 0x07, 0x00, 0x00, 0x09, 0x02, 0x80, 0x03, 0xf4, 0x00, 0x02, 0xe0, 0x01, + 0x02, 0x80, 0x03, 0xf4, 0x04, 0x0f, 0xe0, 0x01, 0x03, 0x86, 0x03, 0xe7, + 0x07, 0x60, 0x00, 0x2e, 0x05, 0x0f, 0x80, 0xff, 0x01, 0x2f, 0xa8, 0x0a, + 0x00, 0x02, 0xe0, 0x01, 0x06, 0x00, 0x00, 0x13, 0x04, 0x00, 0x10, 0x13, + 0x04, 0x0f, 0x80, 0x02, 0x03, 0x2f, 0xa0, 0x12, 0x06, 0x27, 0x30, 0x01, + 0x04, 0x48, 0xb0, 0x75, 0x05, 0x81, 0x83, 0xff, 0x04, 0x60, 0x20, 0x76, + 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x11, 0x07, 0x00, 0x00, 0x3c, + 0x01, 0x79, 0xfe, 0x78, 0x07, 0x00, 0x00, 0xff, 0x03, 0x01, 0x90, 0xff, + 0x02, 0x86, 0x84, 0x07, 0x05, 0xa0, 0x04, 0x1b, 0x00, 0x07, 0x80, 0x19, + 0x00, 0x92, 0x04, 0x1a, 0x01, 0x80, 0x04, 0x5f, 0x04, 0x0f, 0xd0, 0x76, + 0x04, 0x0f, 0xd0, 0x19, 0x04, 0x60, 0x02, 0x76, 0x05, 0x00, 0x20, 0xff, + 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x09, 0x04, 0x0f, 0x80, 0x02, + 0x05, 0x3f, 0xa8, 0x0a, 0x07, 0x00, 0x00, 0x09, 0x05, 0x0f, 0xe0, 0x00, + 0x03, 0x86, 0x84, 0x17, 0x07, 0x60, 0x18, 0x18, 0x05, 0x0f, 0x80, 0xff, + 0x05, 0x3f, 0xa8, 0x0a, 0x07, 0x00, 0x00, 0x09, 0x01, 0x80, 0x04, 0x18, + 0x07, 0xa0, 0x00, 0xee, 0x07, 0x27, 0x30, 0x00, 0x02, 0x07, 0x60, 0x13, + 0x03, 0x80, 0x00, 0x3c, 0x05, 0x8b, 0x04, 0x1b, 0x03, 0x38, 0x50, 0x00, + 0x07, 0x03, 0x00, 0x00, 0x05, 0x60, 0x08, 0x18, 0x05, 0x0f, 0x80, 0xff, + 0x03, 0x2f, 0xa0, 0x09, 0x05, 0x4b, 0x04, 0x00, 0x03, 0x08, 0xa0, 0xff, + 0x01, 0x79, 0xfe, 0x00, 0x07, 0x00, 0x00, 0xff, 0x01, 0x08, 0x80, 0xff, + 0x04, 0x48, 0xb0, 0x75, 0x05, 0x81, 0x04, 0x35, 0x07, 0x60, 0x14, 0x7b, + 0x05, 0x0f, 0x80, 0xff, 0x00, 0x2f, 0xa8, 0x19, 0x06, 0x4b, 0x00, 0x01, + 0x02, 0x08, 0x00, 0x02, 0x01, 0x08, 0x10, 0x03, 0x00, 0x08, 0x20, 0x01, + 0x02, 0x08, 0x30, 0x01, 0x02, 0x07, 0x90, 0x01, 0x02, 0x07, 0xa0, 0x01, + 0x00, 0x08, 0x40, 0x13, 0x02, 0x07, 0xf0, 0x13, 0x00, 0x80, 0x04, 0x57, + 0x06, 0x48, 0x50, 0x75, 0x05, 0x81, 0x04, 0x4d, 0x02, 0x46, 0x50, 0x75, + 0x06, 0x60, 0x14, 0x76, 0x05, 0x0f, 0x80, 0xff, 0x07, 0x3f, 0xa0, 0x21, + 0x06, 0x00, 0x00, 0x3e, 0x07, 0x0f, 0xf0, 0x7d, 0x04, 0x50, 0x04, 0x7c, + 0x05, 0x0f, 0x80, 0xff, 0x00, 0x2f, 0xa8, 0x19, 0x04, 0x8b, 0x04, 0x40, + 0x02, 0x08, 0x00, 0x01, 0x00, 0x08, 0x10, 0x02, 0x01, 0x08, 0x20, 0x03, + 0x03, 0x07, 0x90, 0x03, 0x02, 0x08, 0x30, 0x7a, 0x03, 0x40, 0x00, 0x7e, + 0x06, 0x42, 0x00, 0x7f, 0x04, 0x81, 0x04, 0x52, 0x07, 0x0f, 0xf0, 0x7e, + 0x05, 0xa0, 0x01, 0xe2, 0x02, 0x92, 0x84, 0x52, 0x00, 0x80, 0x04, 0x5e, + 0x05, 0x8b, 0x04, 0x4d, 0x06, 0x60, 0x14, 0x76, 0x05, 0x0f, 0x80, 0xff, + 0x07, 0x3f, 0xa0, 0x41, 0x06, 0x00, 0x00, 0x3e, 0x06, 0x60, 0x24, 0x76, + 0x05, 0x0f, 0x80, 0xff, 0x07, 0x3f, 0xa0, 0x09, 0x06, 0x00, 0x00, 0x07, + 0x00, 0x08, 0x40, 0x0e, 0x04, 0x8b, 0x04, 0x57, 0x03, 0x38, 0x50, 0x00, + 0x03, 0x01, 0x00, 0x00, 0x06, 0x21, 0x90, 0x01, 0x04, 0x0f, 0xe0, 0x7f, + 0x00, 0x86, 0x04, 0x5e, 0x00, 0x80, 0x01, 0xcb, 0x07, 0xc0, 0x00, 0x00, + 0x00, 0x68, 0x3e, 0x75, 0x04, 0x81, 0x04, 0x64, 0x04, 0x48, 0xd0, 0x75, + 0x04, 0x81, 0x04, 0x8a, 0x00, 0x80, 0x04, 0xbc, 0x06, 0xa0, 0x05, 0x1a, + 0x00, 0x80, 0x04, 0x1a, 0x03, 0x97, 0x84, 0x71, 0x07, 0x60, 0x24, 0x18, + 0x05, 0x0f, 0x80, 0xff, 0x01, 0x2f, 0xa8, 0x09, 0x06, 0x78, 0x00, 0x01, + 0x07, 0x00, 0x00, 0xff, 0x07, 0x5a, 0x00, 0x00, 0x07, 0x0f, 0xf0, 0x14, + 0x05, 0x69, 0xfe, 0xff, 0x05, 0x4b, 0x08, 0xff, 0x07, 0x5a, 0x00, 0x00, + 0x05, 0x60, 0x04, 0x18, 0x05, 0x0f, 0x80, 0xff, 0x01, 0x2f, 0xa8, 0x09, + 0x04, 0x0f, 0xe0, 0x07, 0x03, 0x86, 0x84, 0x78, 0x01, 0x20, 0x40, 0x00, + 0x00, 0x80, 0x04, 0x86, 0x00, 0x70, 0x01, 0x01, 0x03, 0x01, 0x00, 0x00, + 0x06, 0x78, 0x00, 0x01, 0x07, 0xff, 0x00, 0x00, 0x07, 0x6c, 0x00, 0xff, + 0x06, 0x81, 0x84, 0x80, 0x00, 0x70, 0x01, 0x01, 0x03, 0x01, 0x00, 0x00, + 0x05, 0x60, 0x04, 0x18, 0x05, 0x0f, 0x80, 0xff, 0x01, 0x2f, 0xa8, 0x0a, + 0x06, 0x78, 0x00, 0x01, 0x07, 0xff, 0x00, 0x00, 0x05, 0x00, 0x40, 0xff, + 0x02, 0x79, 0xff, 0x01, 0x07, 0x00, 0xff, 0xff, 0x05, 0x00, 0x20, 0x14, + 0x07, 0xc0, 0x00, 0x00, 0x04, 0x00, 0x70, 0x76, 0x04, 0x48, 0xb0, 0x75, + 0x04, 0x81, 0x04, 0xa4, 0x03, 0x20, 0x00, 0x11, 0x06, 0x00, 0x60, 0x76, + 0x07, 0xa0, 0x03, 0xd1, 0x00, 0x7a, 0x01, 0x01, 0x07, 0x06, 0x00, 0x00, + 0x07, 0x30, 0x30, 0x00, 0x07, 0x00, 0x82, 0x90, 0x07, 0x60, 0x00, 0x18, + 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x09, 0x07, 0x00, 0x00, 0x03, + 0x04, 0x48, 0xe0, 0x07, 0x07, 0x81, 0x84, 0x9c, 0x06, 0x00, 0x60, 0x13, + 0x01, 0x80, 0x04, 0xb7, 0x02, 0x40, 0x00, 0x10, 0x05, 0x81, 0x04, 0x9c, + 0x06, 0x00, 0x60, 0x10, 0x04, 0x60, 0x32, 0x76, 0x05, 0x0f, 0x80, 0xff, + 0x07, 0x3f, 0xa0, 0x0a, 0x07, 0x00, 0x00, 0x03, 0x01, 0x80, 0x04, 0xb7, + 0x06, 0x00, 0x00, 0x7a, 0x02, 0x49, 0x30, 0x75, 0x06, 0x81, 0x84, 0xad, + 0x04, 0x60, 0x2a, 0x76, 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x09, + 0x06, 0x0f, 0xf0, 0x7a, 0x05, 0x50, 0x04, 0x00, 0x07, 0x00, 0x00, 0xff, + 0x06, 0x47, 0x30, 0x75, 0x04, 0x60, 0x2a, 0x76, 0x05, 0x0f, 0x80, 0xff, + 0x03, 0x2f, 0xa0, 0x0a, 0x07, 0xa0, 0x03, 0xcc, 0x00, 0x7a, 0x01, 0x01, + 0x03, 0x01, 0x00, 0x00, 0x06, 0x30, 0x30, 0x08, 0x05, 0x00, 0x80, 0x00, + 0x06, 0x00, 0x60, 0x0e, 0x05, 0x0f, 0x80, 0x74, 0x03, 0x2f, 0xa0, 0x3a, + 0x05, 0x30, 0x79, 0xa0, 0x07, 0x00, 0x00, 0x0c, 0x00, 0x80, 0x04, 0xfd, + 0x00, 0x68, 0x3e, 0x75, 0x07, 0x6c, 0x0a, 0xff, 0x05, 0x81, 0x04, 0xdb, + 0x04, 0x00, 0x70, 0x13, 0x03, 0x20, 0x00, 0x11, 0x06, 0x00, 0x60, 0x76, + 0x07, 0xa0, 0x03, 0xd1, 0x00, 0x7a, 0x01, 0x01, 0x03, 0x07, 0x00, 0x00, + 0x06, 0x60, 0x28, 0x76, 0x05, 0x0f, 0x80, 0xff, 0x05, 0x3f, 0xa8, 0x09, + 0x06, 0x00, 0x00, 0x01, 0x03, 0x49, 0x90, 0x03, 0x04, 0x81, 0x04, 0xd0, + 0x07, 0x30, 0x30, 0x00, 0x07, 0x00, 0x88, 0x90, 0x05, 0x30, 0x79, 0xa0, + 0x07, 0x00, 0x00, 0x0c, 0x01, 0x80, 0x04, 0xd4, 0x07, 0x30, 0x30, 0x00, + 0x04, 0x00, 0x89, 0x80, 0x04, 0x30, 0x79, 0x20, 0x07, 0x00, 0x00, 0x0c, + 0x07, 0x4d, 0x00, 0x05, 0x06, 0x00, 0x60, 0x13, 0x05, 0x0f, 0x80, 0x74, + 0x03, 0x2f, 0xa0, 0x3a, 0x04, 0x30, 0x79, 0x20, 0x07, 0x00, 0x00, 0x0c, + 0x00, 0x80, 0x04, 0xfd, 0x04, 0x60, 0x2a, 0x76, 0x05, 0x0f, 0x80, 0xff, + 0x03, 0x2f, 0xa0, 0x09, 0x06, 0x0f, 0xf0, 0x7a, 0x05, 0x50, 0x04, 0x00, + 0x07, 0x00, 0x00, 0xff, 0x06, 0x47, 0x30, 0x75, 0x04, 0x60, 0x2a, 0x76, + 0x05, 0x0f, 0x80, 0xff, 0x03, 0x2f, 0xa0, 0x0a, 0x04, 0x00, 0x70, 0x76, + 0x07, 0xa0, 0x03, 0xcc, 0x00, 0x7a, 0x01, 0x01, 0x03, 0x01, 0x00, 0x00, + 0x06, 0x30, 0x30, 0x08, 0x07, 0x00, 0x88, 0x00, 0x07, 0x4d, 0x00, 0x05, + 0x06, 0x60, 0x0a, 0x76, 0x05, 0x0f, 0x80, 0xff, 0x07, 0x3f, 0xa0, 0x09, + 0x07, 0x00, 0x00, 0x03, 0x05, 0x4b, 0x04, 0x06, 0x04, 0x5a, 0x04, 0x04, + 0x05, 0x00, 0x40, 0xff, 0x06, 0x00, 0x60, 0x0e, 0x05, 0x0f, 0x80, 0x74, + 0x03, 0x2f, 0xa0, 0x3a, 0x06, 0x48, 0xc0, 0x75, 0x04, 0x81, 0x04, 0xfb, + 0x06, 0x30, 0x7d, 0x20, 0x07, 0x00, 0x00, 0x0c, 0x00, 0x80, 0x04, 0xfd, + 0x04, 0x30, 0x79, 0x20, 0x07, 0x00, 0x00, 0x0c, 0x01, 0x3e, 0x40, 0x00, + 0x07, 0x00, 0x00, 0x30, 0x01, 0x98, 0x04, 0xff, 0x07, 0x0f, 0xf0, 0xf6, + 0x07, 0x48, 0x50, 0xff, 0x05, 0x81, 0x85, 0x00, 0x05, 0x0f, 0x20, 0x74, + 0x06, 0x0a, 0x00, 0x07, 0x04, 0x00, 0x70, 0xfb, 0x04, 0x6a, 0x70, 0x07, + 0x05, 0x0f, 0x40, 0xff, 0x01, 0x3e, 0x40, 0x00, 0x06, 0x00, 0x00, 0x20, + 0x06, 0x78, 0x00, 0x7a, 0x07, 0xff, 0xf0, 0x00, 0x04, 0x81, 0x85, 0x10, + 0x03, 0x20, 0x00, 0x0a, 0x02, 0x20, 0x17, 0xd0, 0x02, 0x80, 0x05, 0x13, + 0x03, 0x20, 0x00, 0x0a, 0x06, 0x30, 0x1b, 0x58, 0x06, 0x00, 0x00, 0x01, + 0x05, 0x0f, 0x80, 0x72, 0x03, 0x2f, 0xa0, 0x12, 0x00, 0x80, 0x04, 0x1a, + 0x01, 0x20, 0x80, 0x60, 0x06, 0x00, 0x90, 0x2a, 0x04, 0x00, 0x20, 0x20, + 0x02, 0x80, 0x05, 0x26, 0x04, 0x00, 0x80, 0xfb, 0x06, 0x6a, 0xe1, 0x08, + 0x06, 0x00, 0x90, 0x76, 0x04, 0x00, 0x20, 0x75, 0x02, 0x80, 0x05, 0x26, + 0x03, 0x20, 0x11, 0x00, 0x05, 0x84, 0x85, 0x24, 0x06, 0x42, 0x00, 0x01, + 0x04, 0x81, 0x85, 0x20, 0x02, 0x80, 0x05, 0x3d, 0x02, 0x0e, 0x00, 0x08, + 0x07, 0xc0, 0x00, 0x00, 0x05, 0x0f, 0xd0, 0x09, 0x04, 0x0f, 0xd0, 0x08, + 0x03, 0x20, 0x11, 0x00, 0x05, 0x84, 0x85, 0x2d, 0x06, 0x42, 0x00, 0x01, + 0x04, 0x81, 0x85, 0x29, 0x02, 0x80, 0x05, 0x3d, 0x00, 0x7a, 0x01, 0x02, + 0x04, 0x00, 0x01, 0x01, 0x05, 0x60, 0x08, 0x09, 0x05, 0x0f, 0x80, 0xff, + 0x07, 0x3f, 0xa0, 0x0a, 0x06, 0x00, 0x00, 0x01, 0x02, 0x0e, 0x00, 0x08, + 0x06, 0x84, 0x05, 0x37, 0x03, 0x0e, 0x00, 0x09, 0x07, 0xc0, 0x00, 0x00, + 0x01, 0x01, 0x10, 0x09, 0x05, 0x2e, 0x43, 0x00, 0x07, 0xc0, 0x00, 0x00, + 0x05, 0x2e, 0x40, 0x0f, 0x01, 0x20, 0x80, 0x90, 0x02, 0x80, 0x05, 0x1f, + 0x07, 0x0f, 0xc0, 0xff, 0x04, 0x0f, 0x80, 0x13, 0x03, 0x2f, 0xa0, 0x09, + 0x02, 0x80, 0x05, 0x40, 0x77, 0x78, 0x21, 0xfa, 0xff, 0xee, 0xff, 0xd6 }; -#ifdef UNIQUE_FW_NAME -uint32_t fw2400_length01 = 0x0000a971 ; -#else -uint32_t risc_code_length01 = 0x0000a971 ; -#endif - - -#ifdef UNIQUE_FW_NAME -uint32_t fw2400_addr02 = 0x0010d000 ; -#else -uint32_t risc_code_addr02 = 0x0010d000 ; -#endif - -#ifdef UNIQUE_FW_NAME -uint32_t fw2400_code02[] = { -#else -uint32_t risc_code02[] = { -#endif - 0x00000000, 0x00000000, 0x0010d000, 0x0000165e, - 0x00000000, 0x00000000, 0x00020000, 0x000009f7, - 0x836c0580, 0x00000003, 0x02020000, 0x00100314, - 0x42000000, 0x0010b2b7, 0x50000000, 0x800001c0, - 0x0402098a, 0x0401f94d, 0x0201f800, 0x00020524, - 0x0401fbfe, 0x0201f800, 0x0002084c, 0x0201f800, - 0x000206af, 0x0401f7ef, 0x59b800ea, 0x82000d00, - 0xf0000038, 0x02020000, 0x00100ac3, 0x8c000510, - 0x02000000, 0x00100ac2, 0x59ba60e0, 0x81300182, - 0x0402104e, 0x04002030, 0x8532653e, 0x59300406, - 0x82000580, 0x00000003, 0x04020028, 0x59300203, - 0x82000580, 0x00000004, 0x04020024, 0x59325808, - 0x59300402, 0x4a025a04, 0x00000103, 0x900001c0, - 0x48025806, 0x497a5807, 0x497a5c09, 0x5930001f, - 0x80000540, 0x02020800, 0x00100d9a, 0x59300004, - 0x8c00053e, 0x04020010, 0x0401fb47, 0x59326809, - 0x0201f800, 0x000208b4, 0x5934000f, 0x5934140b, - 0x80081040, 0x04001002, 0x480a6c0b, 0x80000540, - 0x04020a31, 0x59b800ea, 0x8c000510, 0x040207d7, - 0x1c01f000, 0x0201f800, 0x00106cb4, 0x040007ef, - 0x0201f000, 0x00100aae, 0x42027000, 0x00000055, - 0x0401f027, 0x83326500, 0x3fffffff, 0x59300406, - 0x82000580, 0x00000003, 0x04020015, 0x59325808, - 0x59326809, 0x59301402, 0x4a025a04, 0x00000103, - 0x900811c0, 0x480a5806, 0x497a5c09, 0x497a5807, - 0x0401fb21, 0x0201f800, 0x000208b4, 0x5934000f, - 0x5934140b, 0x80081040, 0x04001002, 0x480a6c0b, - 0x80000540, 0x04020a0c, 0x0401f7db, 0x42027000, - 0x00000054, 0x0401f00a, 0x83300500, 0x60000000, - 0x02000000, 0x00100ab1, 0x81326580, 0x8000013a, - 0x82000400, 0x00100ac9, 0x50027000, 0x59300c06, - 0x82040580, 0x00000002, 0x02000000, 0x00100aae, - 0x59300004, 0x8c00053e, 0x04020004, 0x0201f800, - 0x000208d8, 0x0401f7c4, 0x0201f800, 0x00106cb4, - 0x040007fb, 0x0201f000, 0x00100aae, 0x59325808, - 0x412c7000, 0x58380a04, 0x82040500, 0x0000000f, - 0x82000c00, 0x0010110d, 0x50044000, 0x0c01f001, - 0x00100e24, 0x00100e24, 0x000200a0, 0x00100e24, - 0x00100e24, 0x00100e24, 0x00100e24, 0x00100e24, - 0x000200b0, 0x00100e38, 0x00100e24, 0x00100e24, - 0x00100e26, 0x00100e24, 0x00100e24, 0x00100e24, - 0x5838040a, 0x8c000500, 0x02000800, 0x00100615, - 0x50200000, 0x80387c00, 0x583c1002, 0x583c2800, - 0x583c2001, 0x58380a07, 0x5838300f, 0x59303807, - 0x58384c08, 0x5838000d, 0x48026012, 0x0401f010, - 0x5838020a, 0x8c000502, 0x02000000, 0x00100e24, - 0x50200000, 0x80387c00, 0x583c2800, 0x583c2001, - 0x583c1002, 0x592c0a07, 0x592c4c08, 0x592c300f, - 0x59303807, 0x497a6012, 0x497a6013, 0x4816600e, - 0x4812600f, 0x480a6010, 0x481a6011, 0x80040840, - 0x4806600d, 0x02020000, 0x00100e65, 0x841c3d40, - 0x481e6007, 0x1c01f000, 0x41787800, 0x59325808, - 0x592c0c0a, 0x8c040d02, 0x02000000, 0x00100fda, - 0x592c000d, 0x592c100f, 0x592c0a04, 0x480a6011, - 0x48026012, 0x48026013, 0x412c3000, 0x82040500, - 0x0000000f, 0x82000400, 0x0010110d, 0x50003800, - 0x501c0000, 0x401c1000, 0x592c1a07, 0x4802600a, - 0x481a600b, 0x480a600c, 0x480e600d, 0x843c7d4a, - 0x403c1000, 0x1c01f000, 0x41787800, 0x497a6012, - 0x592c0a04, 0x412c3000, 0x592c1a07, 0x82040500, - 0x0000000f, 0x82000400, 0x0010110d, 0x50004000, - 0x50200000, 0x40201000, 0x4802600a, 0x481a600b, - 0x480a600c, 0x480e600d, 0x80000580, 0x483e6004, - 0x1c01f000, 0x0002014c, 0x00020139, 0x00020139, - 0x00020139, 0x00020139, 0x00020139, 0x00020139, - 0x00020139, 0x00020139, 0x00020139, 0x00020139, - 0x00020139, 0x00020139, 0x00020139, 0x00020139, - 0x00020139, 0x00020139, 0x00020139, 0x00020139, - 0x00020139, 0x00020139, 0x00020139, 0x00020139, - 0x00020139, 0x00020139, 0x00020139, 0x00020139, - 0x00020139, 0x00020139, 0x00020139, 0x00020139, - 0x00020139, 0x00020139, 0x00020139, 0x00020139, - 0x00020139, 0x00020139, 0x00020139, 0x00020139, - 0x00020139, 0x00020139, 0x00020139, 0x00020139, - 0x00020139, 0x00020139, 0x00020139, 0x00020139, - 0x00020139, 0x00020139, 0x00020139, 0x00020139, - 0x00020139, 0x00020139, 0x00020139, 0x00020139, - 0x00020139, 0x00020139, 0x00020139, 0x00020139, - 0x00020139, 0x00020139, 0x00020139, 0x00020139, - 0x00020139, 0x4c000000, 0x4df00000, 0x4203e000, - 0xb0100000, 0x41f00000, 0x81fe1500, 0x8d0a1512, - 0x02020800, 0x00101468, 0x8d0a1518, 0x02020800, - 0x00020861, 0x8d0a151a, 0x04020ed0, 0x83080500, - 0x00000d00, 0x04020804, 0x5c03e000, 0x5c000000, - 0x1801f000, 0x8d0a1516, 0x02020800, 0x001012d9, - 0x8d0a1514, 0x02020800, 0x001011a5, 0x8d0a1508, - 0x02020800, 0x001011aa, 0x8d0a1500, 0x02020000, - 0x000207c8, 0x1c01f000, 0x42000000, 0x0010b2bd, - 0x50000000, 0x8c000504, 0x04000014, 0x42000000, - 0x0010b2bd, 0x50000000, 0x8c000502, 0x04020002, - 0x1c01f000, 0x4df00000, 0x4203e000, 0x50000000, - 0x42034000, 0x0010b2a0, 0x59a0001d, 0x59a1d81e, - 0x84000502, 0x4803401d, 0x58ec0009, 0x0801f800, - 0x5c03e000, 0x1c01f000, 0x04027002, 0x04026002, - 0x1c01f000, 0x4df00000, 0x4203e000, 0x50000000, - 0x0201f800, 0x0010082a, 0x0400001a, 0x412dd800, - 0x48efc857, 0x0201f800, 0x00103941, 0x42034000, - 0x0010b2a0, 0x49a1d80b, 0x48ef401e, 0x59a0001d, - 0x84000544, 0x4803401d, 0x59e00020, 0x4803c857, - 0x59e00021, 0x4803c857, 0x59e00022, 0x4803c857, - 0x59e00023, 0x4803c857, 0x59e00024, 0x4803c857, - 0x0201f800, 0x00101fbb, 0x0201f800, 0x00101fda, - 0x5c03e000, 0x1c01f000, 0x4da00000, 0x4df00000, - 0x4203e000, 0x50000000, 0x04006051, 0x42034000, - 0x0010b2a0, 0x59a01017, 0x59a01818, 0x800c19c0, - 0x04020008, 0x59a0381b, 0x801c39c0, 0x02000800, - 0x00100615, 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, 0x0010083a, 0x5c025800, 0x497b401b, - 0x497b401a, 0x497b441c, 0x497b421c, 0x0401f010, - 0x59a0041c, 0x82000400, 0x00000002, 0x82000c80, - 0x00000012, 0x4803441c, 0x04001009, 0x4d2c0000, - 0x59a2581b, 0x592c3813, 0x481f401b, 0x497b441c, - 0x0201f800, 0x0010083a, 0x5c025800, 0x5c03e000, - 0x5c034000, 0x1c01f000, 0x59a80005, 0x82000500, - 0x00000003, 0x02020000, 0x00104145, 0x59340400, - 0x82000580, 0x00000606, 0x02020000, 0x00104116, - 0x5934000d, 0x80027d40, 0x02020000, 0x00104151, - 0x0401f803, 0x80000580, 0x1c01f000, 0x5934000f, - 0x59341203, 0x80080540, 0x0402005d, 0x5934020b, - 0x5934140b, 0x80080480, 0x04021059, 0x0201f800, - 0x00020892, 0x04000052, 0x592c0406, 0x49366009, - 0x492e6008, 0x4a026406, 0x00000003, 0x4a026403, - 0x00000040, 0x80081000, 0x480a6c0b, 0x800000c2, - 0x800018c4, 0x800c0400, 0x48026206, 0x592c0808, - 0x592c1809, 0x592c020a, 0x48066017, 0x480e6018, - 0x8c000502, 0x0400002a, 0x4a026203, 0x00000004, - 0x592c0207, 0x80000040, 0x0402001a, 0x59a80070, - 0x80000040, 0x040207ff, 0x592c0204, 0x82000500, - 0x000000ff, 0x82000580, 0x00000018, 0x04020011, - 0x592c180f, 0x59300007, 0x82000540, 0x00000091, - 0x480e6011, 0x48026007, 0x42000000, 0x80000004, - 0x48026004, 0x59bc00ea, 0x8c000516, 0x040207fe, - 0x83300400, 0x20000000, 0x480378e1, 0x1c01f000, - 0x0401fe4b, 0x59300007, 0x8400054e, 0x48026007, - 0x592c1a04, 0x820c1d00, 0x000000ff, 0x820c0580, - 0x00000048, 0x04000012, 0x0401f7ec, 0x8c000500, - 0x04020e9e, 0x4a026203, 0x00000002, 0x59a80071, - 0x80000040, 0x040207ff, 0x592c1a04, 0x820c1d00, - 0x000000ff, 0x820c0580, 0x00000018, 0x040007df, - 0x820c0580, 0x00000048, 0x040207dc, 0x42000800, - 0x80000804, 0x0201f000, 0x00106466, 0x800811c0, - 0x04020003, 0x4a026a03, 0x00000001, 0x59340010, - 0x492e6810, 0x80000d40, 0x04020003, 0x492e680f, - 0x1c01f000, 0x492c0800, 0x1c01f000, 0x83440c80, - 0x00000800, 0x04021009, 0x83440400, 0x0010aa00, - 0x50000000, 0x80000540, 0x04000004, 0x40026800, - 0x80000580, 0x1c01f000, 0x82000540, 0x00000001, - 0x1c01f000, 0x59340203, 0x80000540, 0x0402004b, - 0x4d300000, 0x4d2c0000, 0x5934000f, 0x80025d40, - 0x04000044, 0x0201f800, 0x00020892, 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, 0x001045a1, - 0x4a026203, 0x00000004, 0x592c0207, 0x80000040, - 0x02020000, 0x00104594, 0x82140580, 0x00000018, - 0x02020000, 0x00104594, 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, 0x001045c3, 0x59a80005, - 0x8c000504, 0x02020000, 0x001045bf, 0x59340200, - 0x8c000518, 0x02020000, 0x001045bb, 0x592c0a0c, - 0x48066202, 0x4a025a06, 0x00000000, 0x8c000508, - 0x02020000, 0x001045b7, 0x4d3c0000, 0x417a7800, - 0x0201f800, 0x000207ce, 0x5c027800, 0x1c01f000, - 0x59980026, 0x497a5800, 0x80000540, 0x04020067, - 0x59d80105, 0x82000d00, 0x00018780, 0x04020197, - 0x800000f6, 0x8000013c, 0x0c01f001, 0x000202f3, - 0x0002034e, 0x00020308, 0x00020326, 0x592c0001, - 0x492fb107, 0x80000d40, 0x04020805, 0x59940019, - 0x80000540, 0x04002085, 0x1c01f000, 0x497a5801, - 0x40065800, 0x592c0001, 0x496a5800, 0x815eb800, - 0x412ed000, 0x80000d40, 0x040207f9, 0x59c80000, - 0x82000540, 0x00001200, 0x48039000, 0x1c01f000, - 0x492fb107, 0x592c0001, 0x80000d40, 0x04020ff0, - 0x59da5908, 0x835c0480, 0x00000020, 0x0400100d, - 0x0402b00b, 0x492fb007, 0x0400e7fa, 0x59d80105, - 0x82000500, 0x00018780, 0x0402016c, 0x59940019, - 0x80000540, 0x04002065, 0x1c01f000, 0x0400f009, - 0x496a5800, 0x412ed000, 0x815eb800, 0x59c80000, - 0x82000540, 0x00001200, 0x48039000, 0x0401f7ef, - 0x492fa807, 0x0401f7ed, 0x59d81108, 0x45681000, - 0x400ad000, 0x815eb800, 0x0400e7fc, 0x59c80000, - 0x82000540, 0x00001200, 0x48039000, 0x0402d009, - 0x592c0001, 0x492fb107, 0x80000d40, 0x04020fc8, - 0x59940019, 0x80000540, 0x04002048, 0x1c01f000, - 0x59d80105, 0x82000500, 0x00018780, 0x04020147, - 0x42000000, 0x0010b654, 0x0201f800, 0x0010a86e, - 0x59980026, 0x59980828, 0x80000000, 0x48033026, - 0x492f3028, 0x800409c0, 0x04000003, 0x492c0800, - 0x0401f002, 0x492f3029, 0x592c0001, 0x80000d40, - 0x04020faf, 0x0401f7e7, 0x59980026, 0x59980828, - 0x80000000, 0x48033026, 0x492f3028, 0x800409c0, - 0x04000003, 0x492c0800, 0x0401f002, 0x492f3029, - 0x592c0001, 0x80000d40, 0x04020fa1, 0x0402d00d, - 0x59980029, 0x80025d40, 0x0400000e, 0x59980026, - 0x80000040, 0x48033026, 0x04020002, 0x48033028, - 0x592c0000, 0x48033029, 0x492fb107, 0x0400d7f5, - 0x42000000, 0x0010b654, 0x0201f800, 0x0010a86e, - 0x0402e00a, 0x59da5908, 0x496a5800, 0x412ed000, - 0x815eb800, 0x0400e7fc, 0x59c80000, 0x82000540, - 0x00001200, 0x48039000, 0x59d80105, 0x82000500, - 0x00018780, 0x04020109, 0x59940019, 0x80000540, - 0x04002002, 0x1c01f000, 0x59980023, 0x48032819, - 0x1c01f000, 0x592c0404, 0x8c00051e, 0x02020000, - 0x00104b7b, 0x59980022, 0x80000540, 0x0402075d, - 0x59980026, 0x497a5800, 0x80000540, 0x02020000, - 0x00104ba6, 0x59d80105, 0x82000d00, 0x00018780, - 0x040200f2, 0x800000f6, 0x8000013c, 0x0c01f001, - 0x00020398, 0x00104ba6, 0x0002039d, 0x000203e6, - 0x592c0001, 0x492fb107, 0x80000d40, 0x04020760, - 0x1c01f000, 0x592c0001, 0x492fb107, 0x80000d40, - 0x04020f5b, 0x59da5908, 0x835c0480, 0x00000020, - 0x0400102b, 0x0402b033, 0x492fb007, 0x0400e7fa, - 0x59d80105, 0x82000500, 0x00018780, 0x040200d7, - 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, 0x0400e7cb, 0x0401f7d1, - 0x0402f7f7, 0x492fa807, 0x0400e7c7, 0x0401f7cd, - 0x59e0000f, 0x59e0100f, 0x80081580, 0x040207fd, - 0x81281580, 0x040007d4, 0x40025000, 0x82040d40, - 0x0000001d, 0x0401f7d2, 0x59d80908, 0x45680800, - 0x4006d000, 0x815eb800, 0x0400e7fc, 0x59c80000, - 0x82000540, 0x00001200, 0x48039000, 0x02006000, - 0x00104b8d, 0x59d8010a, 0x59d8090a, 0x80040d80, - 0x040207fd, 0x900001c0, 0x82000540, 0x00000013, - 0x4803c011, 0x5998002b, 0x84000500, 0x4803302b, - 0x59e00017, 0x8c000508, 0x04000003, 0x4a03c017, - 0x00000003, 0x4203e000, 0x30000001, 0x59d80105, - 0x82000500, 0x00018780, 0x0402007c, 0x0202d000, - 0x00104b92, 0x592c0001, 0x492fb107, 0x80000d40, - 0x040206ef, 0x1c01f000, 0x59980020, 0x0c01f001, - 0x00020413, 0x00020414, 0x00020434, 0x1c01f000, - 0x4df00000, 0x4203e000, 0x50000000, 0x04026876, - 0x04006004, 0x599c0017, 0x8c000508, 0x040208f5, - 0x59980029, 0x80025d40, 0x0400000a, 0x0402d00b, - 0x59980026, 0x80000040, 0x48033026, 0x592c0000, - 0x492fb107, 0x48033029, 0x04020002, 0x48033028, - 0x5c03e000, 0x1c01f000, 0x59d80105, 0x82000500, - 0x00018780, 0x04020055, 0x42000000, 0x0010b654, - 0x0201f800, 0x0010a86e, 0x5c03e000, 0x1c01f000, - 0x4df00000, 0x4203e000, 0x50000000, 0x599cb817, - 0x59940019, 0x80000540, 0x04002023, 0x0400000e, - 0x59980022, 0x82000580, 0x00000005, 0x0400001e, - 0x59a80069, 0x81640580, 0x0402001b, 0x8c5cbd08, - 0x04000007, 0x59a8006a, 0x59a80866, 0x80040580, - 0x04020015, 0x8c5cbd08, 0x0402002b, 0x59d8090b, - 0x59d8010a, 0x80040580, 0x0400000d, 0x0400600e, - 0x4a03c011, 0x80400012, 0x4a03c020, 0x00008040, - 0x59e00017, 0x8c000508, 0x04000003, 0x4a03c017, - 0x00000002, 0x4203e000, 0x30000001, 0x4a032819, - 0xffff0000, 0x0400e879, 0x04006003, 0x8c5cbd08, - 0x0402088e, 0x59980029, 0x80025d40, 0x04020003, - 0x5c03e000, 0x1c01f000, 0x59d80105, 0x82000500, - 0x00018780, 0x04020019, 0x0202d000, 0x00104c06, - 0x59980826, 0x592c0000, 0x80040840, 0x48073026, - 0x492fb107, 0x48033029, 0x040207f2, 0x48033028, - 0x0401f7f0, 0x59e0000f, 0x59e0080f, 0x80040580, - 0x040207fd, 0x59e00010, 0x59e01010, 0x80081580, - 0x040207fd, 0x40065000, 0x80041580, 0x040007cc, - 0x040067e1, 0x0401f7cf, 0x4803c857, 0x485fc857, - 0x8c00050e, 0x02020800, 0x0010060d, 0x4203e000, - 0x50000000, 0x4200b800, 0x00008004, 0x0201f000, - 0x0010061a, 0x5998002b, 0x8c000500, 0x04020039, - 0x0400e006, 0x59d80105, 0x82000500, 0x00018780, - 0x040207ee, 0x1c01f000, 0x59da5908, 0x835c0c80, - 0x00000020, 0x04001003, 0x0400b028, 0x0400f02a, - 0x496a5800, 0x412ed000, 0x815eb800, 0x59c80000, - 0x82000540, 0x00001200, 0x48039000, 0x0400e7f3, - 0x59d8010a, 0x59d8090a, 0x80040580, 0x040207fd, - 0x800408e0, 0x599c1017, 0x8c081508, 0x04020021, - 0x82040d40, 0x00000013, 0x4807c011, 0x59e00017, - 0x8c000508, 0x0400000a, 0x4a03c017, 0x00000003, - 0x82040500, 0x000000ff, 0x82000580, 0x0000001d, - 0x04020003, 0x4a03c017, 0x0000000d, 0x4203e000, - 0x30000001, 0x59d80105, 0x82000500, 0x00018780, - 0x040207c2, 0x1c01f000, 0x492fb007, 0x0400e7d3, - 0x0401f7e0, 0x492fa807, 0x0400e7d0, 0x0401f7dd, - 0x84000500, 0x4803302b, 0x0400e7cc, 0x0401f7d9, - 0x59e0000f, 0x59e0100f, 0x80081580, 0x040207fd, - 0x81281580, 0x040007db, 0x40025000, 0x82040d40, - 0x0000001d, 0x0401f7d9, 0x59da5908, 0x496a5800, - 0x412ed000, 0x815eb800, 0x0400e7fc, 0x59c80000, - 0x82000540, 0x00001200, 0x48039000, 0x59d8090b, - 0x59980024, 0x48073024, 0x80040480, 0x04020004, - 0x59940019, 0x80000540, 0x04022003, 0x59980823, - 0x48072819, 0x59d80105, 0x82000500, 0x00018780, - 0x04020796, 0x1c01f000, 0x59981025, 0x59e00010, - 0x59e00810, 0x80041d80, 0x040207fd, 0x80080580, - 0x04000011, 0x48073025, 0x59e0000f, 0x59e0100f, - 0x80081d80, 0x040207fd, 0x81280580, 0x04000006, - 0x400a5000, 0x40080000, 0x80040580, 0x0402067f, - 0x1c01f000, 0x59940019, 0x80000540, 0x040227fa, - 0x1c01f000, 0x59e0000f, 0x59e0100f, 0x80081d80, - 0x040207fd, 0x81280580, 0x040007f6, 0x400a5000, - 0x59940019, 0x80000540, 0x040027ef, 0x1c01f000, - 0x59e0000f, 0x59e0100f, 0x80080d80, 0x040207fd, - 0x81280580, 0x04020002, 0x1c01f000, 0x400a5000, - 0x900811c0, 0x82081540, 0x0000001c, 0x480bc011, - 0x59e00017, 0x8c000508, 0x04000003, 0x4a03c017, - 0x0000000c, 0x4203e000, 0x30000001, 0x1c01f000, - 0x41700000, 0x0c01f001, 0x001050f0, 0x0002052f, - 0x001050f0, 0x001050f1, 0x001050ee, 0x001050ee, - 0x001050ee, 0x001050ee, 0x00105594, 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, 0x0400f94b, - 0x0400b135, 0x59d40005, 0x82000500, 0x43018780, - 0x02020000, 0x00105523, 0x59d80005, 0x82000500, - 0x43018780, 0x02020000, 0x0010552a, 0x1c01f000, - 0x83700580, 0x00000003, 0x02000800, 0x001050f1, - 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, 0x00105161, 0x5c03e000, 0x0401f7d4, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105207, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105171, 0x00105161, - 0x00105161, 0x00105161, 0x00105231, 0x00105161, - 0x00105161, 0x00105161, 0x00020623, 0x00105161, - 0x00105398, 0x00105161, 0x00105161, 0x00105161, - 0x000205f5, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105199, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x001054b7, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105502, 0x00105161, 0x0010518b, - 0x00105161, 0x0010547b, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105449, 0x00105161, 0x00105449, - 0x00105556, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105409, 0x00105539, - 0x00105161, 0x00105549, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x00105161, 0x00105161, 0x00105161, - 0x00105161, 0x592c0204, 0x80000110, 0x80000040, - 0x0400000b, 0x02001000, 0x00105169, 0x48033002, - 0x492f3003, 0x492f3004, 0x4a033008, 0x00020603, - 0x4202e000, 0x00000003, 0x1c01f000, 0x592c0406, - 0x82000c80, 0x0000199a, 0x02021000, 0x00105179, - 0x59a80021, 0x80000540, 0x02020000, 0x001051a7, - 0x592e8a06, 0x83440c80, 0x000007f0, 0x02021000, - 0x00105179, 0x83440400, 0x0010aa00, 0x50000000, - 0x80026d40, 0x02000000, 0x001051bb, 0x59340002, - 0x592c0810, 0x80040580, 0x82000500, 0x00ffffff, - 0x02020000, 0x00105179, 0x0201f800, 0x000201ee, - 0x02020000, 0x001051be, 0x1c01f000, 0x592c0204, - 0x80000110, 0x02000000, 0x00105169, 0x80000040, - 0x0402000b, 0x592c040a, 0x8c000504, 0x04000010, - 0x592c0207, 0x82000c80, 0x00001001, 0x02021000, - 0x00105179, 0x0201f000, 0x0010556e, 0x48033002, - 0x492f3003, 0x492f3004, 0x4a033008, 0x0002063b, - 0x4202e000, 0x00000003, 0x1c01f000, 0x592c0406, - 0x82000c80, 0x0000199a, 0x02021000, 0x00105179, - 0x592e8a06, 0x417a7800, 0x0401fc25, 0x02020000, - 0x0010533c, 0x59340002, 0x592c0808, 0x80040580, - 0x82000500, 0x00ffffff, 0x02020000, 0x00105179, - 0x497a5808, 0x592e6009, 0x83300580, 0xffffffff, - 0x02000000, 0x001052fc, 0x83300480, 0x0010cfc0, - 0x02001000, 0x00105359, 0x59a8000b, 0x81300480, - 0x02021000, 0x00105359, 0x592c240a, 0x49366009, - 0x8c10251c, 0x02020000, 0x001052ea, 0x59a80068, - 0x8c000510, 0x02020000, 0x00105372, 0x59a80821, - 0x800409c0, 0x02020000, 0x001052d0, 0x59a80805, - 0x8c040d04, 0x02020000, 0x00105363, 0x59340200, - 0x8c000518, 0x02020000, 0x00105354, 0x59300c06, - 0x82040580, 0x00000006, 0x02020000, 0x001052f4, - 0x59300414, 0x8c000516, 0x02020000, 0x0010535e, - 0x8c102508, 0x02020000, 0x0010a3d7, 0x59300808, - 0x4a025a06, 0x00000000, 0x800409c0, 0x02020000, - 0x001052cb, 0x592c0a0c, 0x48066202, 0x492e6008, - 0x0401f14a, 0x4df00000, 0x4203e000, 0x50000000, - 0x0402b00b, 0x835c0480, 0x00000020, 0x0400100d, - 0x815eb840, 0x416a5800, 0x592ed000, 0x492fb007, - 0x497a5800, 0x497a5801, 0x0400b7f7, 0x59d80005, - 0x82000500, 0x43018780, 0x02020000, 0x0010552a, - 0x5c03e000, 0x1c01f000, 0x4df00000, 0x4203e000, - 0x50000000, 0x0402f00b, 0x835c0480, 0x00000020, - 0x0400100d, 0x815eb840, 0x416a5800, 0x592ed000, - 0x492fa807, 0x497a5800, 0x497a5801, 0x0400f7f7, - 0x59d40005, 0x82000500, 0x43018780, 0x02020000, - 0x00105523, 0x5c03e000, 0x1c01f000, 0x4df00000, - 0x4203e000, 0x50000000, 0x59940024, 0x80000540, - 0x0400010f, 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, - 0x00105d5a, 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, 0x04000007, 0x04002006, - 0x59940025, 0x80080480, 0x04021002, 0x80000580, - 0x48032819, 0x5994001c, 0x80000d40, 0x04000013, - 0x5994101b, 0x59940025, 0x80080480, 0x04001005, - 0x04000004, 0x4803281b, 0x80000040, 0x0402100b, - 0x80040840, 0x4807281c, 0x04020004, 0x5994001d, - 0x0801f800, 0x0401f005, 0x82000400, 0x0000000a, - 0x4803281b, 0x040027f7, 0x59940004, 0x80000d40, - 0x04000013, 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, 0x00100615, 0x48032824, 0x59940000, - 0x0c01f001, 0x00105cee, 0x00105cf0, 0x00105d16, - 0x59940024, 0x80000000, 0x48032824, 0x4203e000, - 0x70000000, 0x1c01f000, 0x592c0406, 0x800000c2, - 0x800008c4, 0x80040c00, 0x592c040a, 0x48066206, - 0x82000d00, 0x00000003, 0x02000000, 0x00105e97, - 0x8c000500, 0x0402002c, 0x59a80872, 0x80040840, - 0x040207ff, 0x8c00051e, 0x02000000, 0x00105e72, - 0x82000d00, 0x000000c0, 0x02020000, 0x00105e68, - 0x82000d00, 0x00002020, 0x02020000, 0x00105e65, - 0x813e79c0, 0x02020000, 0x00105e65, 0x592c0c0c, - 0x800409c0, 0x02020000, 0x00105e65, 0x59300a03, - 0x82040d80, 0x00000007, 0x02020000, 0x00105e65, - 0x4a026203, 0x00000003, 0x4a026403, 0x00000043, - 0x0201f800, 0x000200ca, 0x82080d40, 0x80003465, - 0x48066004, 0x497a6000, 0x59bc00ea, 0x8c000516, - 0x040207fe, 0x83300400, 0xa0000000, 0x480378e1, - 0x1c01f000, 0x8c000502, 0x02020000, 0x00105eba, - 0x8c00051e, 0x0400000e, 0x82000d00, 0x000000c0, - 0x04000005, 0x82040d80, 0x000000c0, 0x02020000, - 0x00105ebf, 0x82000d00, 0x00002020, 0x82040d80, - 0x00002020, 0x02000000, 0x00105e86, 0x592c0207, - 0x80000040, 0x02020000, 0x00105e90, 0x592c180d, - 0x800c19c0, 0x02020000, 0x00105e90, 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, 0x00020381, 0x417a7800, - 0x59300008, 0x80025d40, 0x0402078c, 0x1c01f000, - 0x456a5800, 0x412ed000, 0x815eb800, 0x59c80000, - 0x82000540, 0x00001200, 0x48039000, 0x0401f7f4, - 0x59840000, 0x80000540, 0x04020002, 0x1c01f000, - 0x59840003, 0x80000540, 0x02020000, 0x00105f37, - 0x1c01f000, 0x59300004, 0x82000500, 0x00000100, - 0x80040d40, 0x48066004, 0x59bc00ea, 0x8c000516, - 0x040207fe, 0x83300400, 0x40000000, 0x480378e1, - 0x1c01f000, 0x59bc00ea, 0x82001500, 0xb0000018, - 0x02020000, 0x001069c6, 0x8c000510, 0x0400002a, - 0x59bc10e0, 0x82080500, 0xfffff000, 0x0402000a, - 0x80080108, 0x820a3500, 0x0000000f, 0x4803c857, - 0x1201f000, 0x001069cc, 0x84000510, 0x48026004, - 0x0401f016, 0x840a653e, 0x59300004, 0x8c000520, - 0x040007fa, 0x82000500, 0xfffefeff, 0x48026004, - 0x8c08153e, 0x04020005, 0x42027000, 0x00000013, - 0x0401f858, 0x0401f009, 0x59300004, 0x8c000514, - 0x04000003, 0x0401ffac, 0x0401f02e, 0x42027000, - 0x00000049, 0x0401f84f, 0x59bc00ea, 0x82001500, - 0xb0000018, 0x02020000, 0x001069c6, 0x8c000510, - 0x040207d8, 0x1c01f000, 0x83640480, 0x00000010, - 0x04001019, 0x41626000, 0x41580000, 0x59300a03, - 0x82040d80, 0x00000000, 0x04000008, 0x83326400, - 0x00000024, 0x81300c80, 0x040017f9, 0x42026000, - 0x0010cfc0, 0x0401f7f6, 0x4a026203, 0x00000008, - 0x8166c840, 0x8332c400, 0x00000024, 0x81600480, - 0x04021002, 0x1c01f000, 0x837ac540, 0x0010cfc0, - 0x1c01f000, 0x42000000, 0x0010b653, 0x0201f800, - 0x0010a86e, 0x4967c857, 0x80026580, 0x1c01f000, - 0x83300480, 0x0010cfc0, 0x02001800, 0x00100615, - 0x41580000, 0x81300480, 0x0402100c, 0x04011000, - 0x457a6000, 0x4a026202, 0x0000ffff, 0x83300400, - 0x00000003, 0x4803c840, 0x4a03c842, 0x00000021, - 0x8166c800, 0x1c01f000, 0x41540000, 0x81300480, - 0x02021800, 0x00100615, 0x04011000, 0x457a6000, - 0x4a026202, 0x0000ffff, 0x83300400, 0x00000003, - 0x4803c840, 0x4a03c842, 0x00000021, 0x59a80066, - 0x49335065, 0x80000000, 0x48035066, 0x1c01f000, - 0x4d340000, 0x59326809, 0x59300406, 0x82000500, - 0x0000001f, 0x0c01f803, 0x5c026800, 0x1c01f000, - 0x001076ed, 0x00107700, 0x0010771a, 0x00020900, - 0x001096c1, 0x001096dc, 0x00020975, 0x001076ed, - 0x00107700, 0x00106226, 0x00107733, 0x001076ed, - 0x001076ed, 0x001076ed, 0x001076ed, 0x001076ed, - 0x0010936a, 0x0010a4d0, 0x001076ed, 0x001076ed, - 0x001076ed, 0x001076ed, 0x001076ed, 0x001076ed, - 0x001076ed, 0x001076ed, 0x001076ed, 0x001076ed, - 0x001076ed, 0x001076ed, 0x001076ed, 0x001076ed, - 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, - 0x00100615, 0x0c01f001, 0x00107731, 0x00108337, - 0x00020914, 0x001084cc, 0x00108566, 0x00107731, - 0x00107731, 0x00107731, 0x0010831c, 0x00107731, - 0x00107731, 0x00107731, 0x00107731, 0x0010873a, - 0x83380480, 0x00000058, 0x04021007, 0x83380480, - 0x00000040, 0x04001004, 0x4d2c0000, 0x0c01f803, - 0x5c025800, 0x1c01f000, 0x001083c1, 0x001083c1, - 0x001083c1, 0x001083c1, 0x001083c1, 0x001083c3, - 0x00108463, 0x001083c1, 0x001083c1, 0x001083c1, - 0x001083c1, 0x001083c1, 0x001083c1, 0x001083c1, - 0x001083c1, 0x001083c1, 0x001083c1, 0x001083c1, - 0x001083c1, 0x00108467, 0x00020936, 0x001083c1, - 0x00108466, 0x00108468, 0x59325808, 0x59300811, - 0x59301402, 0x59340200, 0x8c00050e, 0x0402001c, - 0x0401f826, 0x04000005, 0x4a025a04, 0x00000103, - 0x497a5c09, 0x0401f009, 0x4a025a04, 0x00000103, - 0x4a025a06, 0x00000000, 0x497a5c09, 0x800409c0, - 0x02020800, 0x00108531, 0x48065807, 0x480a5c06, - 0x0201f800, 0x00020381, 0x5934000f, 0x5934140b, - 0x80081040, 0x04001002, 0x480a6c0b, 0x80000540, - 0x02020800, 0x00020275, 0x0401f75e, 0x592c020a, - 0x8c000502, 0x040007e9, 0x800409c0, 0x040007e7, - 0x592c0208, 0x8c00050e, 0x040207e4, 0x4933c857, - 0x0201f000, 0x00108fc6, 0x592c020a, 0x8c000500, - 0x04000010, 0x59300015, 0x592c380f, 0x801c3c80, - 0x0400000c, 0x4a025a06, 0x00000015, 0x8c1c3d3e, - 0x04000005, 0x4a025a06, 0x00000007, 0x801c3880, - 0x801c3800, 0x481fc857, 0x821c0d40, 0x00000000, - 0x1c01f000, 0x59300203, 0x82003480, 0x0000000e, - 0x02021800, 0x00100615, 0x0c01f001, 0x001096fb, - 0x00020989, 0x00109d9c, 0x00109daa, 0x000209a5, - 0x001096fb, 0x00109e98, 0x000209c4, 0x001096fb, - 0x001096fb, 0x001096fb, 0x001096fb, 0x001096fb, - 0x001096fb, 0x83380580, 0x00000013, 0x02020000, - 0x00109d23, 0x59300403, 0x82027480, 0x00000044, - 0x02021800, 0x00100615, 0x82000480, 0x00000040, - 0x02001800, 0x00100615, 0x0c01f001, 0x00109d80, - 0x0002099b, 0x00109d82, 0x00109d94, 0x59325808, - 0x832c0500, 0x00ff0000, 0x04000005, 0x592c0c0a, - 0x8c040d1a, 0x02020000, 0x00109d8f, 0x0401fe8e, - 0x0401f710, 0x83380580, 0x00000048, 0x04000007, - 0x83380580, 0x00000053, 0x02000000, 0x00109e3a, - 0x0201f800, 0x00100615, 0x5930001f, 0x59301011, - 0x59300809, 0x58040a00, 0x8c040d0e, 0x02020000, - 0x00109e16, 0x800811c0, 0x02020000, 0x00109e23, - 0x5930001f, 0x80000540, 0x02020000, 0x00109e31, - 0x59325808, 0x592c040a, 0x8c00051e, 0x02000000, - 0x00109e0c, 0x42027000, 0x00000041, 0x0401f001, - 0x83380480, 0x00000054, 0x02021800, 0x00100615, - 0x83380480, 0x00000040, 0x02001000, 0x00109e57, - 0x0c01f001, 0x00109e63, 0x000209e1, 0x00109e6f, - 0x00109e76, 0x00109e63, 0x00109e63, 0x00109e63, - 0x00109e63, 0x00109e65, 0x00109e6a, 0x00109e6a, - 0x00109e63, 0x00109e63, 0x00109e63, 0x00109e63, - 0x00109e6a, 0x00109e63, 0x00109e6a, 0x00109e63, - 0x00109e65, 0x4a026203, 0x00000001, 0x493a6403, - 0x42000800, 0x80002042, 0x0401f66f, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0xa36ec441, 0x00000000, - 0x00000000, 0x00000000, 0x00000005, 0xfffffffb, - 0x02800004, 0x00000000, 0x0000c000, 0x0000071b, - 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, 0x048185c4, 0x027c0045, 0x03020000, - 0x06810037, 0x027c0045, 0x03040000, 0x068100c7, - 0x027c0045, 0x03080000, 0x0681061c, 0x04908037, - 0x029105c2, 0x010410a6, 0x0379ff41, 0x037fffff, - 0x072d6000, 0x07601241, 0x050f80ff, 0x032fa009, - 0x05600400, 0x050f80ff, 0x056c04ff, 0x068105da, - 0x073fa009, 0x06000001, 0x0279ff02, 0x0700ffff, - 0x070ff0d1, 0x0179feff, 0x0700ffff, 0x045c0402, - 0x048185da, 0x060ff0d0, 0x0179feff, 0x0700ffff, - 0x057dfeff, 0x0700ffff, 0x068105bc, 0x05600e41, - 0x050f80ff, 0x032fa069, 0x07480000, 0x068105ce, - 0x06780043, 0x070000f0, 0x0781005f, 0x037c00ff, - 0x06000010, 0x0781005f, 0x038005ca, 0x0379ff00, - 0x070fffff, 0x06780043, 0x07f00000, 0x075a0000, - 0x020ef001, 0x038605cc, 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, 0x068105d5, 0x050020ff, 0x027c0002, - 0x06000010, 0x078100c3, 0x028005d5, 0x0700c0d1, - 0x0379ff0c, 0x070000ff, 0x0380008e, 0x0204a051, - 0x06780043, 0x070000f0, 0x037c00ff, 0x06000010, - 0x0781816a, 0x072d6000, 0x019485be, 0x050fb056, - 0x044880e6, 0x04818010, 0x060ff0d0, 0x0179feff, - 0x0700ffff, 0x057dfeff, 0x0700ffff, 0x068105bc, - 0x05a00212, 0x0349c0e4, 0x0781811d, 0x070ff093, - 0x050010ff, 0x070ff093, 0x045c0401, 0x058180db, - 0x02046092, 0x04002046, 0x04600202, 0x00540401, - 0x048280e6, 0x04500425, 0x070060ff, 0x0730ffff, - 0x0700000f, 0x0742000f, 0x05810190, 0x06a005a4, - 0x0648a002, 0x048180e9, 0x00047089, 0x070ff047, - 0x045c0443, 0x077800ff, 0x07f00000, 0x0781818e, - 0x07780047, 0x0500e000, 0x048185ab, 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, 0x078105b2, - 0x027c0001, 0x06000020, 0x078105b2, 0x038005ca, - 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, 0x0681050b, - 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, 0x01a1860c, 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, 0x07a0060c, 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, 0x00800252, 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, - 0x06810531, 0x052e6200, 0x070ff088, 0x0179feff, - 0x070fffff, 0x04818501, 0x060ff083, 0x0086836d, - 0x033e6000, 0x07000003, 0x068d0352, 0x07286000, - 0x07f00000, 0x078d0355, 0x038c0306, 0x0648c0e6, - 0x05818372, 0x0448e0e6, 0x0781036a, 0x004920e6, - 0x07810365, 0x06a0056d, 0x05001088, 0x00700101, - 0x03100000, 0x00088001, 0x033e6000, 0x07000088, - 0x0280055e, 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, - 0x0481851c, 0x0448b075, 0x06810385, 0x02493075, - 0x07810509, 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, - 0x06a00576, 0x033e6a00, 0x0302000a, 0x062e5020, - 0x003e4002, 0x07000a00, 0x028003f1, 0x07420003, - 0x0781844e, 0x00798002, 0x06000507, 0x06818451, - 0x0180045c, 0x05930478, 0x01257000, 0x073c3fff, - 0x0700000f, 0x052e4003, 0x072e5030, 0x0304c050, - 0x067800e6, 0x07000041, 0x0581047d, 0x06a0057f, - 0x04818016, 0x002fb008, 0x067800e6, 0x07000041, - 0x04810483, 0x06a0057f, 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, 0x01a18606, 0x05a004cc, - 0x05308000, 0x05001000, 0x06009079, 0x04a004dc, - 0x0280055e, 0x0249c0e6, 0x058104f9, 0x0280036d, - 0x0648307a, 0x07818196, 0x05a004cf, 0x02209504, - 0x018004e4, 0x02490075, 0x06810519, 0x04002089, - 0x04780102, 0x07f00000, 0x05001088, 0x06a0056d, - 0x04740101, 0x03100000, 0x060ff002, 0x045c0401, - 0x0481851a, 0x00088001, 0x033e6000, 0x070000c0, - 0x0380055a, 0x07f00000, 0x0220951a, 0x018004e4, - 0x040fd075, 0x040fd07a, 0x040fd079, 0x0648307a, - 0x06810525, 0x06780075, 0x06000007, 0x0481852c, - 0x07a00606, 0x06486075, 0x06818194, 0x02490075, - 0x0781819a, 0x04487075, 0x04818534, 0x0280053b, - 0x05308000, 0x03010000, 0x06009079, 0x04a004dc, - 0x02800010, 0x0448e0e6, 0x04818352, 0x00800192, - 0x05308000, 0x0500e000, 0x06009079, 0x04a004dc, - 0x04008089, 0x05a004e1, 0x0380055a, 0x05a004cc, - 0x05308000, 0x0700f000, 0x06009079, 0x07000088, - 0x06a00543, 0x04a004dc, 0x02800010, 0x03386000, - 0x07030000, 0x07f00000, 0x068d0546, 0x033e6a00, - 0x0202000e, 0x02079051, 0x0448b075, 0x06810551, - 0x02493075, 0x06810551, 0x05301005, 0x03010000, - 0x03800553, 0x05301006, 0x03010000, 0x05002087, - 0x06485002, 0x05818553, 0x0744c000, 0x01088000, - 0x02086001, 0x07c00000, 0x05001088, 0x06a0056d, - 0x0644c001, 0x00088001, 0x033e6a00, 0x0202000e, - 0x004920e6, 0x05818563, 0x02079051, 0x078d0563, - 0x060ff089, 0x034990ff, 0x0781056a, 0x03386005, - 0x03010000, 0x02800010, 0x03386006, 0x03010000, - 0x02800010, 0x068d056d, 0x03386000, 0x07030000, - 0x07f00000, 0x078d0571, 0x070ff087, 0x074850ff, - 0x05818572, 0x07c00000, 0x068d0576, 0x02386001, - 0x07030000, 0x07f00000, 0x068d057a, 0x070ff087, - 0x074850ff, 0x0581857b, 0x07c00000, 0x05002087, - 0x0049d002, 0x0581858e, 0x002fb008, 0x067800e6, - 0x07000041, 0x002fb008, 0x0581858e, 0x06a005a4, - 0x0448e002, 0x06810591, 0x0648a002, 0x0481859b, - 0x06486002, 0x07810595, 0x02400057, 0x056a02ff, - 0x07c00000, 0x06a005a4, 0x06788102, 0x06000004, - 0x0581858e, 0x04002089, 0x070ff0d4, 0x045c0402, - 0x077800ff, 0x07f00000, 0x0581858e, 0x00202010, - 0x038c058e, 0x07f00000, 0x06420002, 0x0581859c, - 0x06a00576, 0x033e6a00, 0x0302000a, 0x07c00000, - 0x07f00000, 0x060ff0a2, 0x050020ff, 0x060ff0a2, - 0x045c0402, 0x058185a5, 0x07c00000, 0x05a00218, - 0x03495047, 0x068105b0, 0x0320901d, 0x02800602, - 0x0220901f, 0x02800602, 0x014980e4, 0x04818010, - 0x013e4000, 0x07003000, 0x05600e35, 0x050f80ff, - 0x07a006fa, 0x01208003, 0x05a004e1, 0x038005ca, - 0x03209009, 0x02800602, 0x03209011, 0x02800602, - 0x02209007, 0x02800602, 0x03209003, 0x02800602, - 0x00498043, 0x048185bc, 0x00497043, 0x058185c0, - 0x02209001, 0x02800602, 0x0220900d, 0x02800602, - 0x0320900f, 0x02800602, 0x03493000, 0x068105d3, - 0x027c0045, 0x070a0000, 0x068105dc, 0x0220900b, - 0x02800602, 0x02209013, 0x05308000, 0x01012000, - 0x04a004dc, 0x00800183, 0x03209005, 0x02800602, - 0x072e500c, 0x00208002, 0x05a004e1, 0x02800010, - 0x02209015, 0x02800602, 0x072d6000, 0x05308000, - 0x05007000, 0x07f00000, 0x070090d1, 0x0379ff09, - 0x0700ffff, 0x04a004dc, 0x03209017, 0x02800602, - 0x033e5000, 0x06000080, 0x02209019, 0x02800602, - 0x072d6000, 0x033e5000, 0x06000080, 0x07f00000, - 0x060ff0d0, 0x0179feff, 0x0700ffff, 0x057dfeff, - 0x0700ffff, 0x04818010, 0x02400058, 0x00642058, - 0x06820010, 0x033e5000, 0x06000080, 0x04058051, - 0x0320901b, 0x02800602, 0x05308000, 0x01012000, - 0x04a004dc, 0x00800176, 0x05a00218, 0x05308000, - 0x05008000, 0x06009079, 0x04a004dc, 0x07c00000, - 0x034900e4, 0x04818616, 0x013e4000, 0x070000c0, - 0x07f00000, 0x034900e4, 0x05818614, 0x07c00000, - 0x013e4000, 0x06000080, 0x07f00000, 0x07f00000, - 0x07f00000, 0x034900e4, 0x0681060e, 0x02800616, - 0x072d6000, 0x00498043, 0x07810630, 0x060ff0d0, - 0x0179feff, 0x0700ffff, 0x057dfeff, 0x0700ffff, - 0x048185e0, 0x050f8030, 0x032fa009, 0x0379ff00, - 0x0700ffff, 0x070ff0d1, 0x0179feff, 0x0700ffff, - 0x055c0400, 0x068105e0, 0x04004051, 0x03800678, - 0x06a006da, 0x062d6001, 0x020ef004, 0x038605e2, - 0x06600004, 0x050f80ff, 0x032fa009, 0x074b0000, - 0x05002000, 0x0769ff00, 0x01640800, 0x078205e2, - 0x01640e00, 0x058285e2, 0x070ff036, 0x045c0404, - 0x0581864b, 0x072d6000, 0x050f8030, 0x032fa009, - 0x0379ff00, 0x0700ffff, 0x070ff0d1, 0x0179feff, - 0x0700ffff, 0x055c0400, 0x068105e0, 0x04482034, - 0x068105fd, 0x06483034, 0x048185fd, 0x070ff0d4, - 0x077800ff, 0x070000f0, 0x037c00ff, 0x06000010, - 0x07810678, 0x07a006d4, 0x024900e5, 0x0681065b, - 0x033e5000, 0x06000080, 0x02800010, 0x04601c04, - 0x050f80ff, 0x053fa809, 0x06000020, 0x030ef041, - 0x028605ec, 0x062d6002, 0x05602a41, 0x050f80ff, - 0x012fa809, 0x060ff0d0, 0x074b00ff, 0x045c0401, - 0x04818676, 0x062d6001, 0x07602841, 0x050f80ff, - 0x053fa809, 0x06000001, 0x070ff0d1, 0x054b80ff, - 0x074b0003, 0x055c0403, 0x04818676, 0x033e5000, - 0x06000080, 0x0180070c, 0x07600041, 0x0380065c, - 0x07a006d4, 0x024900e5, 0x0781067e, 0x033e5000, - 0x06000080, 0x02800010, 0x07a006c0, 0x030ef041, - 0x038605f0, 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, - 0x038606bd, 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, 0x0180070c, - 0x040f8032, 0x073fa011, 0x06000001, 0x060ff002, - 0x055c0403, 0x048186c8, 0x00041051, 0x07c00000, - 0x04600402, 0x04500432, 0x050f80ff, 0x053fa809, - 0x06000020, 0x00400402, 0x01680eff, 0x070030ff, - 0x040f8032, 0x053fa80a, 0x06000001, 0x07c00000, - 0x024900e5, 0x078106d7, 0x07c00000, 0x033e5000, - 0x070000c0, 0x07c00000, 0x05004036, 0x060000d0, - 0x0179fe00, 0x0700ffff, 0x057dfeff, 0x0700ffff, - 0x078106f9, 0x070000d1, 0x0379ff00, 0x0700ffff, - 0x06005051, 0x060ff031, 0x05500405, 0x050f80ff, - 0x073fa009, 0x06000002, 0x020ef004, 0x038606f3, - 0x04600404, 0x050f80ff, 0x012fa809, 0x0079fe01, - 0x0700ffff, 0x055c0400, 0x078106f9, 0x01400405, - 0x070050ff, 0x057de0ff, 0x06000007, 0x048186e5, - 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, 0xdb4ee9e2, 0x02800004, - 0x00000000, 0x00008000, 0x00000542, 0x040f801f, - 0x012fa8c9, 0x040f801f, 0x073fa081, 0x06000010, - 0x03200005, 0x07420000, 0x050fb000, 0x040f801f, - 0x073fa011, 0x06000038, 0x040f801f, 0x053fa859, - 0x0700003a, 0x050fe000, 0x0581800a, 0x0784003c, - 0x04958019, 0x030e0011, 0x072e4200, 0x03800014, - 0x0291001f, 0x050010c0, 0x04482001, 0x058180fa, - 0x06483001, 0x0681815d, 0x02920029, 0x068b0029, - 0x008a0162, 0x050010c0, 0x06780001, 0x050007c0, - 0x06818240, 0x06780001, 0x0500f800, 0x06818280, - 0x03910030, 0x040fe029, 0x03860030, 0x076c001d, - 0x058102b1, 0x076c0a1d, 0x048102da, 0x029200ab, - 0x040fe02f, 0x0386003c, 0x06000013, 0x050fb000, - 0x066c0073, 0x068103ec, 0x014920e4, 0x0581803c, - 0x03400000, 0x076c0a00, 0x04818034, 0x0696003e, - 0x03b900ca, 0x05908014, 0x010170e1, 0x07780017, - 0x03e00000, 0x06810091, 0x050010ff, 0x0179fe17, - 0x031fffff, 0x070000ff, 0x05600800, 0x050f80ff, - 0x073fa009, 0x06000001, 0x06780002, 0x02800040, - 0x037c00ff, 0x03800000, 0x0681005d, 0x0249f002, - 0x078100aa, 0x0448e002, 0x0681005d, 0x07600c00, - 0x050f80ff, 0x073fa009, 0x06000001, 0x06780002, - 0x07ffff00, 0x037c00ff, 0x05000200, 0x058180aa, - 0x064bd401, 0x03d0005f, 0x028000a8, 0x02800067, - 0x03800071, 0x0380007b, 0x02800085, 0x0280008f, - 0x028000a8, 0x028000a8, 0x050fe027, 0x0086806b, - 0x01028000, 0x0280006e, 0x07600027, 0x050f80ff, - 0x032fa00a, 0x01027000, 0x02400029, 0x038000aa, - 0x040fe025, 0x00868075, 0x03026000, 0x03800078, - 0x06600025, 0x050f80ff, 0x032fa00a, 0x03025000, - 0x02400029, 0x038000aa, 0x050fe021, 0x0086807f, - 0x01022000, 0x03800082, 0x07600021, 0x050f80ff, - 0x032fa00a, 0x01021000, 0x02400029, 0x038000aa, - 0x040fe023, 0x00868089, 0x01024000, 0x0280008c, - 0x06600023, 0x050f80ff, 0x032fa00a, 0x03023000, - 0x02400029, 0x038000aa, 0x06a000da, 0x038000aa, - 0x01640817, 0x048280a8, 0x070ff017, 0x03d00095, - 0x0280009d, 0x0380009f, 0x028000a2, 0x038000a5, - 0x028000a8, 0x028000a8, 0x028000a8, 0x028000a8, - 0x03e00000, 0x03800014, 0x0590809f, 0x030160e1, - 0x038000aa, 0x049080a2, 0x030150e1, 0x038000aa, - 0x059080a5, 0x010140e1, 0x038000aa, 0x060fc013, - 0x07a0053a, 0x03800014, 0x014940e4, 0x00a180ae, - 0x0380003c, 0x02681e0d, 0x050fb0ff, 0x04600876, - 0x050f80ff, 0x053fa809, 0x06000001, 0x05488003, - 0x058180bd, 0x0400800d, 0x0120d000, 0x013e4000, - 0x05000200, 0x06009076, 0x04002075, 0x06a00526, - 0x07c00000, 0x072e4800, 0x07000012, 0x028000cd, - 0x0747f000, 0x05600800, 0x050f80ff, 0x012fa809, - 0x0249f001, 0x068100cd, 0x01012000, 0x052e4c00, - 0x07c00000, 0x070000eb, 0x0349f000, 0x048180c1, - 0x05600800, 0x050f80ff, 0x012fa809, 0x0448e001, - 0x068100d3, 0x07c00000, 0x0079c101, 0x07ffffff, - 0x027a4b01, 0x03800000, 0x05600800, 0x050f80ff, - 0x012fa80a, 0x07600c00, 0x050f80ff, 0x012fa821, - 0x06780001, 0x07ffff00, 0x037c00ff, 0x05000700, - 0x068100ef, 0x06601804, 0x070030ff, 0x050f80ff, - 0x012fa809, 0x05002000, 0x050f8003, 0x073fa00a, - 0x06000001, 0x040fe001, 0x038600f0, 0x04600201, - 0x050f80ff, 0x032fa00a, 0x07c00000, 0x050fe02e, - 0x018680f5, 0x0102e000, 0x0302f000, 0x038000f9, - 0x0760002e, 0x050f80ff, 0x032fa00a, 0x0102e000, - 0x07c00000, 0x022c0004, 0x056c041d, 0x0481010e, - 0x056c021d, 0x04810125, 0x056c081d, 0x04810137, - 0x076c061d, 0x04810151, 0x0521d000, 0x0202c013, - 0x0202a013, 0x02020013, 0x0460021a, 0x050f80ff, - 0x053fa80a, 0x07000009, 0x03b600be, 0x0484801f, - 0x0380003c, 0x040fe02a, 0x00860104, 0x06000013, - 0x04001013, 0x0560102b, 0x050f80ff, 0x032fa012, - 0x06420029, 0x0660002a, 0x050f80ff, 0x053fa809, - 0x06000001, 0x050fe003, 0x01860122, 0x01028003, - 0x0660002a, 0x050f80ff, 0x053fa80a, 0x07000009, - 0x00800152, 0x00028013, 0x00027013, 0x00800152, - 0x040fe02a, 0x01860103, 0x06420029, 0x0660002a, - 0x050f80ff, 0x053fa809, 0x06000001, 0x050fe003, - 0x00860134, 0x03026003, 0x0660002a, 0x050f80ff, - 0x053fa80a, 0x07000009, 0x00800152, 0x02026013, - 0x02025013, 0x00800152, 0x040fe02a, 0x01860103, - 0x06420029, 0x0660002a, 0x050f80ff, 0x053fa809, - 0x06000001, 0x050fe003, 0x00860146, 0x01022003, - 0x0660002a, 0x050f80ff, 0x053fa80a, 0x07000009, - 0x01800148, 0x00022013, 0x00021013, 0x0647f020, - 0x007a0120, 0x04000101, 0x04a002a2, 0x0400802a, - 0x06a0051f, 0x03948103, 0x0521d005, 0x00800104, - 0x0180010c, 0x0647f020, 0x06486020, 0x06818157, - 0x04a002a2, 0x01800103, 0x007a0120, 0x04000101, - 0x04a002a2, 0x0400802a, 0x06a0051f, 0x01800103, - 0x040fd02a, 0x052e4003, 0x00208010, 0x06a0051f, - 0x0180010c, 0x00018098, 0x07480018, 0x06818173, - 0x05481018, 0x07818171, 0x05482018, 0x0781816f, - 0x07483018, 0x0681816d, 0x002fb004, 0x01800174, - 0x012fb003, 0x01800174, 0x002fb002, 0x01800174, - 0x002fb001, 0x01800174, 0x012fb000, 0x0179fe78, - 0x070000ff, 0x030190ff, 0x00017086, 0x058b0178, - 0x03385000, 0x03020000, 0x07780017, 0x00430407, - 0x07818200, 0x046c0419, 0x058101b4, 0x046c0219, - 0x05810184, 0x07219000, 0x00800198, 0x07219000, - 0x07483017, 0x0481019e, 0x05482017, 0x058101a5, - 0x0448b075, 0x06818198, 0x06601476, 0x050f80ff, - 0x073fa022, 0x0600003e, 0x06000080, 0x05001081, - 0x05002082, 0x06003083, 0x05004084, 0x04601c76, - 0x050f80ff, 0x022fa02a, 0x07219000, 0x07780078, - 0x07ffff00, 0x045a0419, 0x010780ff, 0x0484801f, - 0x0380003c, 0x040fe07f, 0x008601ad, 0x04a001cd, - 0x00920198, 0x040fe07f, 0x06a681cd, 0x00800198, - 0x0560107b, 0x050f80ff, 0x032fa009, 0x0744f000, - 0x0560107b, 0x050f80ff, 0x032fa00a, 0x0180018b, - 0x052e400c, 0x040080fb, 0x046aa108, 0x06009076, - 0x04002075, 0x06a00526, 0x00800198, 0x06219001, - 0x05482017, 0x048101c1, 0x058b01b7, 0x060ff086, - 0x0349f0ff, 0x07818177, 0x07483017, 0x058101be, - 0x050fd0ff, 0x040fe07f, 0x06a681cd, 0x00800198, - 0x05004084, 0x05a00222, 0x00920198, 0x070ff07d, - 0x0450047c, 0x056004ff, 0x050f80ff, 0x032fa009, - 0x070ff000, 0x00540479, 0x030790ff, 0x018001a5, - 0x060ff079, 0x0054047a, 0x058201f9, 0x058101f9, - 0x070ff07d, 0x0450047c, 0x050f80ff, 0x002fa819, - 0x048b01d5, 0x02080001, 0x00081002, 0x01082003, - 0x048b01d9, 0x03385000, 0x03010000, 0x02400019, - 0x070ff003, 0x04500479, 0x030790ff, 0x0340007e, - 0x0642007f, 0x058101f9, 0x070ff07e, 0x050f80ff, - 0x032fa009, 0x050fe000, 0x028681f8, 0x070ff07d, - 0x056002ff, 0x050f80ff, 0x032fa009, 0x0107d000, - 0x018601fa, 0x0560087d, 0x050f80ff, 0x032fa009, - 0x03681e00, 0x0550041b, 0x050f80ff, 0x032fa009, - 0x0107e000, 0x070ff07e, 0x018001e4, 0x0307c000, - 0x07c00000, 0x052e400c, 0x040080fb, 0x046aa108, - 0x06009076, 0x04002075, 0x02800526, 0x040fd076, - 0x050fd017, 0x060ff086, 0x077800ff, 0x07000060, - 0x037c00ff, 0x07000060, 0x06818202, 0x07780078, - 0x07ffff00, 0x045a0419, 0x010780ff, 0x06601476, - 0x050f80ff, 0x073fa022, 0x0600003e, 0x052e400c, - 0x04600876, 0x050f80ff, 0x053fa809, 0x06000001, - 0x05488003, 0x0481021c, 0x0400d0fb, 0x066a810d, - 0x013e4000, 0x07000300, 0x02800029, 0x040080fb, - 0x066a8108, 0x06009076, 0x04002075, 0x06a00526, - 0x02800029, 0x0240007f, 0x0742007e, 0x050f807e, - 0x032fa009, 0x050fe000, 0x0386823c, 0x070ff07d, - 0x055c047b, 0x04810231, 0x0760007d, 0x050f80ff, - 0x032fa009, 0x050fe000, 0x02868231, 0x070ff07b, - 0x0107d0ff, 0x0560087d, 0x050f80ff, 0x032fa009, - 0x03681e00, 0x0450041c, 0x0107e0ff, 0x050f80ff, - 0x032fa009, 0x050fe000, 0x0086023e, 0x0307c000, - 0x07c00000, 0x040fd076, 0x0380053a, 0x010180c0, - 0x0548e018, 0x07818259, 0x0748f018, 0x07818255, - 0x03490018, 0x06818251, 0x01491018, 0x0781824d, - 0x073c0000, 0x06000040, 0x02200004, 0x0180025c, - 0x073c0000, 0x06000020, 0x03200003, 0x0180025c, - 0x073c0000, 0x06000010, 0x02200002, 0x0180025c, - 0x073c0000, 0x06000008, 0x02200001, 0x0180025c, - 0x073c0000, 0x06000004, 0x06000013, 0x050fb000, - 0x040fe076, 0x00860275, 0x046c0273, 0x04810285, - 0x066c0073, 0x05810266, 0x040fd076, 0x07a0053a, - 0x03800014, 0x040fd076, 0x01800269, 0x00452075, - 0x00077013, 0x0647f075, 0x06486075, 0x0781826f, - 0x04a002a8, 0x00800275, 0x007a0175, 0x04000101, - 0x04a002a8, 0x04008076, 0x0245f008, 0x06a0051f, - 0x07273000, 0x05600272, 0x050f80ff, 0x053fa80a, - 0x07000009, 0x0379ff78, 0x070000ff, 0x02076013, - 0x02075013, 0x0484801f, 0x0380003c, 0x070fc0ff, - 0x052e400c, 0x00208020, 0x06a0051f, 0x0180027e, - 0x04600276, 0x050010ff, 0x040f8001, 0x032fa009, - 0x040f8001, 0x053fa80a, 0x07000009, 0x070ff000, - 0x02868297, 0x06601276, 0x050f80ff, 0x073fa009, - 0x0700000c, 0x07601818, 0x050f80ff, 0x053fa80a, - 0x07000009, 0x00800298, 0x07a000f0, 0x0448b075, - 0x04810268, 0x06000013, 0x04001013, 0x0560107b, - 0x050f80ff, 0x032fa012, 0x0046b075, 0x03b600be, - 0x01800269, 0x06000020, 0x04001016, 0x0460082a, - 0x050f80ff, 0x032fa012, 0x07c00000, 0x06000075, - 0x040010a2, 0x044b0801, 0x060ff016, 0x065a0001, - 0x04600876, 0x050f80ff, 0x032fa012, 0x07c00000, - 0x050fe022, 0x008602bc, 0x0421d004, 0x0302a022, - 0x04a002e9, 0x04488020, 0x048102ce, 0x040fd02a, - 0x0521d000, 0x0202a013, 0x02020013, 0x040fe026, - 0x018602d4, 0x0421d001, 0x0202a026, 0x04a002e9, - 0x0202c013, 0x00683e20, 0x070060ff, 0x056c0206, - 0x0681031c, 0x056c0406, 0x06810332, 0x076c0606, - 0x078103a3, 0x04488020, 0x068182d0, 0x056c1606, - 0x078103b1, 0x06a00516, 0x018002e2, 0x040fd02a, - 0x0521d000, 0x0202a013, 0x02020013, 0x050fe028, - 0x018602e2, 0x0302a028, 0x0421d002, 0x04a002e9, - 0x018002f0, 0x050fe022, 0x018602e2, 0x0421d004, - 0x0302a022, 0x04a002e9, 0x04488020, 0x078182e4, - 0x06a00516, 0x05848030, 0x0380003c, 0x040fd02a, - 0x0521d000, 0x0202a013, 0x02020013, 0x018002e2, - 0x0460082a, 0x050f80ff, 0x022fa031, 0x03020000, - 0x0002b004, 0x01018005, 0x07c00000, 0x0400702a, - 0x07a003e4, 0x007a0101, 0x07060000, 0x07303000, - 0x07008290, 0x07600018, 0x050f80ff, 0x053fa809, - 0x07000003, 0x0448e007, 0x068182fe, 0x06006013, - 0x03800305, 0x02400010, 0x048102fe, 0x06006010, - 0x0460322a, 0x050f80ff, 0x073fa00a, 0x07000003, - 0x050f801e, 0x032fa03a, 0x063aa020, 0x06000002, - 0x013e4000, 0x07000030, 0x0298030b, 0x070ff0f6, - 0x036830ff, 0x0581830c, 0x070f001e, 0x0560102b, - 0x050f10ff, 0x063f3c08, 0x0600000d, 0x013e4000, - 0x06000020, 0x040f801a, 0x0320000a, 0x022017d0, - 0x032fa012, 0x0202c013, 0x018002e2, 0x04007013, - 0x07a003e4, 0x007a0101, 0x07050000, 0x07303000, - 0x07008890, 0x074d0005, 0x06006013, 0x050f801e, - 0x032fa03a, 0x05601a2b, 0x050f80ff, 0x022fa019, - 0x04001002, 0x04002013, 0x040f801f, 0x022fa01a, - 0x073aa00c, 0x06000002, 0x07300c03, 0x0600000d, - 0x038003d1, 0x04007013, 0x07a003e4, 0x007a0101, - 0x03070000, 0x0660282a, 0x050f80ff, 0x073fa009, - 0x06000004, 0x02499008, 0x0781033f, 0x07303000, - 0x07008890, 0x03800341, 0x07303000, 0x04008980, - 0x05007003, 0x074d0005, 0x06006013, 0x050f801e, - 0x032fa03a, 0x0760142b, 0x050f80ff, 0x032fa021, - 0x064b0002, 0x02499008, 0x0781034d, 0x0644c002, - 0x054b0400, 0x050040ff, 0x06698104, 0x04818362, - 0x06000013, 0x04001013, 0x04780102, 0x06000010, - 0x06003013, 0x04004013, 0x06005013, 0x06006013, - 0x04007013, 0x00644015, 0x0682035e, 0x04448002, - 0x02205008, 0x040f801f, 0x032fa042, 0x04008015, - 0x0280039b, 0x046c8004, 0x04818370, 0x01208018, - 0x06780002, 0x07000003, 0x04818373, 0x06003001, - 0x06000013, 0x04001013, 0x04004013, 0x06005013, - 0x040f801f, 0x022fa032, 0x0280039b, 0x040fd02a, - 0x07a0053a, 0x03800014, 0x0379ff03, 0x070000ff, - 0x04488002, 0x0681037a, 0x070ff003, 0x04500408, - 0x050080ff, 0x0379ff00, 0x070000ff, 0x06489002, - 0x07810381, 0x070ff000, 0x04500408, 0x050080ff, - 0x07005003, 0x05004000, 0x06003001, 0x06000013, - 0x04001013, 0x040f801f, 0x022fa032, 0x05601c2b, - 0x050f80ff, 0x022fa031, 0x06600c1f, 0x050f80ff, - 0x022fa032, 0x02680608, 0x0681039b, 0x016408ff, - 0x057dfeff, 0x07ffffff, 0x034000ff, 0x045a0407, - 0x070000ff, 0x0760061e, 0x050f80ff, 0x032fa00a, - 0x06600908, 0x0669f908, 0x027a0008, 0x06000020, - 0x070aa0ff, 0x014a20ff, 0x037a00ff, 0x060000dc, - 0x070000ff, 0x038003d1, 0x04007013, 0x07a003e4, - 0x007a0101, 0x07030000, 0x07303000, 0x07008190, - 0x06006013, 0x050f801e, 0x032fa03a, 0x073aa000, - 0x06000002, 0x07300c00, 0x07000005, 0x038003d1, - 0x04007013, 0x07a003e4, 0x007a0101, 0x07810000, - 0x07303000, 0x07000090, 0x06006013, 0x06600c2a, - 0x050f80ff, 0x053fa809, 0x07000003, 0x04780107, - 0x07ffff00, 0x007c0107, 0x07000500, 0x048183c4, - 0x07303000, 0x05000890, 0x074d0005, 0x0660282a, - 0x050f80ff, 0x053fa809, 0x07000003, 0x0049d007, - 0x068103cb, 0x02206001, 0x050f801e, 0x032fa03a, - 0x073aa000, 0x06000002, 0x07300c00, 0x07000005, - 0x013e4000, 0x07000030, 0x029803d3, 0x070ff0f6, - 0x036830ff, 0x058183d4, 0x070f001e, 0x040f101f, - 0x070f3000, 0x013e4000, 0x06000020, 0x040f801a, - 0x0320000a, 0x022017d0, 0x032fa012, 0x018002e2, - 0x03200000, 0x06006076, 0x028003e6, 0x03200011, - 0x0600602a, 0x04a0046b, 0x05600406, 0x050f80ff, - 0x053fa809, 0x06000002, 0x07c00000, 0x0207602f, - 0x04600876, 0x050f80ff, 0x022fa031, 0x03075000, - 0x0007b004, 0x01018005, 0x06600076, 0x050020ff, - 0x050f80ff, 0x012fa809, 0x0202f001, 0x018683fa, - 0x0002e013, 0x040f8002, 0x053fa80a, 0x07000009, - 0x06273001, 0x0448b075, 0x06818404, 0x04602076, - 0x050f80ff, 0x053fa811, 0x0700003c, 0x0179fe78, - 0x070000ff, 0x030190ff, 0x0386840c, 0x04a00420, - 0x00078019, 0x0092041f, 0x00800464, 0x040fd076, - 0x040fd019, 0x04600276, 0x050020ff, 0x050f80ff, - 0x032fa009, 0x040f8002, 0x053fa80a, 0x07000009, - 0x050fe000, 0x0286841c, 0x07601818, 0x050f80ff, - 0x053fa80a, 0x07000009, 0x0180041d, 0x07a000f0, - 0x07273000, 0x02076013, 0x0380003c, 0x048b0420, - 0x03385000, 0x07030000, 0x05600818, 0x050f80ff, - 0x032fa009, 0x054b0400, 0x0308a0ff, 0x0179fe00, - 0x070000ff, 0x010880ff, 0x0448b075, 0x0581043a, - 0x0760147b, 0x050f80ff, 0x002fa819, 0x064b0001, - 0x02080002, 0x01081003, 0x00082001, 0x02083001, - 0x02079001, 0x0207a001, 0x00084013, 0x0207f013, - 0x0180045c, 0x06485075, 0x04810452, 0x02465075, - 0x06601476, 0x050f80ff, 0x073fa021, 0x0600003e, - 0x070ff07d, 0x0450047c, 0x050f80ff, 0x002fa819, - 0x048b0445, 0x02080001, 0x00081002, 0x01082003, - 0x03079003, 0x0208307a, 0x0340007e, 0x0642007f, - 0x04810457, 0x070ff07e, 0x05a001e4, 0x02928457, - 0x01800463, 0x048b0452, 0x06601476, 0x050f80ff, - 0x073fa041, 0x0600003e, 0x06602476, 0x050f80ff, - 0x073fa009, 0x06000007, 0x0008400e, 0x058b045c, - 0x03385000, 0x03010000, 0x06219001, 0x040fe07f, - 0x01860463, 0x008001cd, 0x07c00000, 0x00683e75, - 0x05810469, 0x0448d075, 0x0481048f, 0x018004bd, - 0x06a0051a, 0x0080041f, 0x02978476, 0x07602418, - 0x050f80ff, 0x012fa809, 0x06780001, 0x070000ff, - 0x075a0000, 0x070ff014, 0x0569feff, 0x054b08ff, - 0x075a0000, 0x05600418, 0x050f80ff, 0x012fa809, - 0x040fe007, 0x0386847d, 0x01204000, 0x0180048b, - 0x00700101, 0x03010000, 0x06780001, 0x07ff0000, - 0x076c00ff, 0x06818485, 0x00700101, 0x03010000, - 0x05600418, 0x050f80ff, 0x012fa80a, 0x06780001, - 0x07ff0000, 0x050040ff, 0x0279ff01, 0x0700ffff, - 0x05002014, 0x07c00000, 0x04007076, 0x0448b075, - 0x058104a9, 0x03200011, 0x06006076, 0x06a003e6, - 0x007a0101, 0x07060000, 0x07303000, 0x07008290, - 0x07600018, 0x050f80ff, 0x053fa809, 0x07000003, - 0x0448e007, 0x068184a1, 0x06006013, 0x018004b8, - 0x02400010, 0x048104a1, 0x06006010, 0x04603276, - 0x050f80ff, 0x073fa00a, 0x07000003, 0x018004b8, - 0x04602a76, 0x050f80ff, 0x032fa009, 0x060ff07a, - 0x05500400, 0x070000ff, 0x04602a76, 0x050f80ff, - 0x032fa00a, 0x07a003e1, 0x007a0101, 0x03010000, - 0x06303008, 0x05008000, 0x0600600e, 0x050f8074, - 0x032fa03a, 0x053079a0, 0x0700000c, 0x008004fd, - 0x00683e75, 0x076c0aff, 0x048104dc, 0x04007013, - 0x03200011, 0x06006076, 0x06a003e6, 0x007a0101, - 0x03070000, 0x06602876, 0x050f80ff, 0x053fa809, - 0x06000001, 0x03499003, 0x058104d1, 0x07303000, - 0x07008890, 0x053079a0, 0x0700000c, 0x008004d5, - 0x07303000, 0x04008980, 0x04307920, 0x0700000c, - 0x074d0005, 0x06006013, 0x050f8074, 0x032fa03a, - 0x04307920, 0x0700000c, 0x008004fd, 0x04602a76, - 0x050f80ff, 0x032fa009, 0x060ff07a, 0x05500400, - 0x070000ff, 0x04602a76, 0x050f80ff, 0x032fa00a, - 0x04007076, 0x07a003e1, 0x007a0101, 0x03010000, - 0x06303008, 0x07008800, 0x074d0005, 0x06600a76, - 0x050f80ff, 0x073fa009, 0x07000003, 0x054b0406, - 0x045a0404, 0x050040ff, 0x0600600e, 0x050f8074, - 0x032fa03a, 0x0648c075, 0x048104fb, 0x06307d20, - 0x0700000c, 0x008004fd, 0x04307920, 0x0700000c, - 0x013e4000, 0x07000030, 0x019804ff, 0x070ff0f6, - 0x074850ff, 0x05818500, 0x050f2074, 0x060a0007, - 0x040070fb, 0x046a7007, 0x050f40ff, 0x013e4000, - 0x06000020, 0x0678007a, 0x07fff000, 0x04818510, - 0x0320000a, 0x022017d0, 0x02800513, 0x0320000a, - 0x06301b58, 0x06000001, 0x050f8072, 0x032fa012, - 0x0080041f, 0x01208060, 0x0600902a, 0x04002020, - 0x02800526, 0x040080fb, 0x066ae108, 0x06009076, - 0x04002075, 0x02800526, 0x03201100, 0x05848524, - 0x06420001, 0x04818520, 0x0280053d, 0x020e0008, - 0x07c00000, 0x050fd009, 0x040fd008, 0x03201100, - 0x0584852d, 0x06420001, 0x04818529, 0x0280053d, - 0x007a0102, 0x04000101, 0x05600809, 0x050f80ff, - 0x073fa00a, 0x06000001, 0x020e0008, 0x06840537, - 0x030e0009, 0x07c00000, 0x01011009, 0x052e4300, - 0x07c00000, 0x052e400f, 0x01208090, 0x0280051f, - 0x070fc0ff, 0x040f8013, 0x032fa009, 0x02800540, - 0x6321d92e, 0xffef19a2 +struct firmware ql2400_fw = { + .size = sizeof(ql2400_fw_bin), + .data = ql2400_fw_bin }; - -#ifdef UNIQUE_FW_NAME -uint32_t fw2400_length02 = 0x0000165e ; -#else -uint32_t risc_code_length02 = 0x0000165e ; -#endif - diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index 9bc1f153f..87f90c4f0 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c @@ -1,25 +1,12 @@ /* - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.6.x - * Copyright (C) 2003-2005 QLogic Corporation - * (www.qlogic.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, 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. + * QLogic Fibre Channel HBA Driver + * Copyright (c) 2003-2005 QLogic Corporation * + * See LICENSE.qla2xxx for copyright and licensing details. */ #include "qla_def.h" #include -#include /* SYSFS attributes --------------------------------------------------------- */ @@ -29,15 +16,16 @@ qla2x00_sysfs_read_fw_dump(struct kobject *kobj, char *buf, loff_t off, { struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj, struct device, kobj))); + char *rbuf = (char *)ha->fw_dump; if (ha->fw_dump_reading == 0) return 0; - if (off > ha->fw_dump_buffer_len) - return 0; - if (off + count > ha->fw_dump_buffer_len) - count = ha->fw_dump_buffer_len - off; + if (off > ha->fw_dump_len) + return 0; + if (off + count > ha->fw_dump_len) + count = ha->fw_dump_len - off; - memcpy(buf, &ha->fw_dump_buffer[off], count); + memcpy(buf, &rbuf[off], count); return (count); } @@ -49,7 +37,6 @@ qla2x00_sysfs_write_fw_dump(struct kobject *kobj, char *buf, loff_t off, struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj, struct device, kobj))); int reading; - uint32_t dump_size; if (off != 0) return (0); @@ -57,49 +44,27 @@ qla2x00_sysfs_write_fw_dump(struct kobject *kobj, char *buf, loff_t off, reading = simple_strtol(buf, NULL, 10); switch (reading) { case 0: - if (ha->fw_dump_reading == 1) { - qla_printk(KERN_INFO, ha, - "Firmware dump cleared on (%ld).\n", - ha->host_no); + if (!ha->fw_dump_reading) + break; - vfree(ha->fw_dump_buffer); - free_pages((unsigned long)ha->fw_dump, - ha->fw_dump_order); + qla_printk(KERN_INFO, ha, + "Firmware dump cleared on (%ld).\n", ha->host_no); - ha->fw_dump_reading = 0; - ha->fw_dump_buffer = NULL; - ha->fw_dump = NULL; - } + ha->fw_dump_reading = 0; + ha->fw_dumped = 0; break; case 1: - if (ha->fw_dump != NULL && !ha->fw_dump_reading) { + if (ha->fw_dumped && !ha->fw_dump_reading) { ha->fw_dump_reading = 1; - dump_size = FW_DUMP_SIZE_1M; - if (ha->fw_memory_size < 0x20000) - dump_size = FW_DUMP_SIZE_128K; - else if (ha->fw_memory_size < 0x80000) - dump_size = FW_DUMP_SIZE_512K; - ha->fw_dump_buffer = (char *)vmalloc(dump_size); - if (ha->fw_dump_buffer == NULL) { - qla_printk(KERN_WARNING, ha, - "Unable to allocate memory for firmware " - "dump buffer (%d).\n", dump_size); - - ha->fw_dump_reading = 0; - return (count); - } qla_printk(KERN_INFO, ha, - "Firmware dump ready for read on (%ld).\n", + "Raw firmware dump ready for read on (%ld).\n", ha->host_no); - memset(ha->fw_dump_buffer, 0, dump_size); - if (IS_QLA2100(ha) || IS_QLA2200(ha)) - qla2100_ascii_fw_dump(ha); - else - qla2300_ascii_fw_dump(ha); - ha->fw_dump_buffer_len = strlen(ha->fw_dump_buffer); } break; + case 2: + qla2x00_alloc_fw_dump(ha); + break; } return (count); } @@ -121,26 +86,18 @@ qla2x00_sysfs_read_nvram(struct kobject *kobj, char *buf, loff_t off, { struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj, struct device, kobj))); - uint16_t *witer; unsigned long flags; - uint16_t cnt; - if (!capable(CAP_SYS_ADMIN) || off != 0 || count != sizeof(nvram_t)) + if (!capable(CAP_SYS_ADMIN) || off != 0) return 0; /* Read NVRAM. */ spin_lock_irqsave(&ha->hardware_lock, flags); - qla2x00_lock_nvram_access(ha); - witer = (uint16_t *)buf; - for (cnt = 0; cnt < count / 2; cnt++) { - *witer = cpu_to_le16(qla2x00_get_nvram_word(ha, - cnt+ha->nvram_base)); - witer++; - } - qla2x00_unlock_nvram_access(ha); + ha->isp_ops.read_nvram(ha, (uint8_t *)buf, ha->nvram_base, + ha->nvram_size); spin_unlock_irqrestore(&ha->hardware_lock, flags); - return (count); + return ha->nvram_size; } static ssize_t @@ -149,34 +106,38 @@ qla2x00_sysfs_write_nvram(struct kobject *kobj, char *buf, loff_t off, { struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj, struct device, kobj))); - uint8_t *iter; - uint16_t *witer; unsigned long flags; uint16_t cnt; - uint8_t chksum; - if (!capable(CAP_SYS_ADMIN) || off != 0 || count != sizeof(nvram_t)) + if (!capable(CAP_SYS_ADMIN) || off != 0 || count != ha->nvram_size) return 0; /* Checksum NVRAM. */ - iter = (uint8_t *)buf; - chksum = 0; - for (cnt = 0; cnt < count - 1; cnt++) - chksum += *iter++; - chksum = ~chksum + 1; - *iter = chksum; + if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + uint32_t *iter; + uint32_t chksum; + + iter = (uint32_t *)buf; + chksum = 0; + for (cnt = 0; cnt < ((count >> 2) - 1); cnt++) + chksum += le32_to_cpu(*iter++); + chksum = ~chksum + 1; + *iter = cpu_to_le32(chksum); + } else { + uint8_t *iter; + uint8_t chksum; + + iter = (uint8_t *)buf; + chksum = 0; + for (cnt = 0; cnt < count - 1; cnt++) + chksum += *iter++; + chksum = ~chksum + 1; + *iter = chksum; + } /* Write NVRAM. */ spin_lock_irqsave(&ha->hardware_lock, flags); - qla2x00_lock_nvram_access(ha); - qla2x00_release_nvram_protection(ha); - witer = (uint16_t *)buf; - for (cnt = 0; cnt < count / 2; cnt++) { - qla2x00_write_nvram_word(ha, cnt+ha->nvram_base, - cpu_to_le16(*witer)); - witer++; - } - qla2x00_unlock_nvram_access(ha); + ha->isp_ops.write_nvram(ha, (uint8_t *)buf, ha->nvram_base, count); spin_unlock_irqrestore(&ha->hardware_lock, flags); return (count); @@ -188,11 +149,236 @@ static struct bin_attribute sysfs_nvram_attr = { .mode = S_IRUSR | S_IWUSR, .owner = THIS_MODULE, }, - .size = sizeof(nvram_t), + .size = 512, .read = qla2x00_sysfs_read_nvram, .write = qla2x00_sysfs_write_nvram, }; +static ssize_t +qla2x00_sysfs_read_optrom(struct kobject *kobj, char *buf, loff_t off, + size_t count) +{ + struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj, + struct device, kobj))); + + if (ha->optrom_state != QLA_SREADING) + return 0; + if (off > ha->optrom_size) + return 0; + if (off + count > ha->optrom_size) + count = ha->optrom_size - off; + + memcpy(buf, &ha->optrom_buffer[off], count); + + return count; +} + +static ssize_t +qla2x00_sysfs_write_optrom(struct kobject *kobj, char *buf, loff_t off, + size_t count) +{ + struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj, + struct device, kobj))); + + if (ha->optrom_state != QLA_SWRITING) + return -EINVAL; + if (off > ha->optrom_size) + return -ERANGE; + if (off + count > ha->optrom_size) + count = ha->optrom_size - off; + + memcpy(&ha->optrom_buffer[off], buf, count); + + return count; +} + +static struct bin_attribute sysfs_optrom_attr = { + .attr = { + .name = "optrom", + .mode = S_IRUSR | S_IWUSR, + .owner = THIS_MODULE, + }, + .size = OPTROM_SIZE_24XX, + .read = qla2x00_sysfs_read_optrom, + .write = qla2x00_sysfs_write_optrom, +}; + +static ssize_t +qla2x00_sysfs_write_optrom_ctl(struct kobject *kobj, char *buf, loff_t off, + size_t count) +{ + struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj, + struct device, kobj))); + int val; + + if (off) + return 0; + + if (sscanf(buf, "%d", &val) != 1) + return -EINVAL; + + switch (val) { + case 0: + if (ha->optrom_state != QLA_SREADING && + ha->optrom_state != QLA_SWRITING) + break; + + ha->optrom_state = QLA_SWAITING; + vfree(ha->optrom_buffer); + ha->optrom_buffer = NULL; + break; + case 1: + if (ha->optrom_state != QLA_SWAITING) + break; + + ha->optrom_state = QLA_SREADING; + ha->optrom_buffer = (uint8_t *)vmalloc(ha->optrom_size); + if (ha->optrom_buffer == NULL) { + qla_printk(KERN_WARNING, ha, + "Unable to allocate memory for optrom retrieval " + "(%x).\n", ha->optrom_size); + + ha->optrom_state = QLA_SWAITING; + return count; + } + + memset(ha->optrom_buffer, 0, ha->optrom_size); + ha->isp_ops.read_optrom(ha, ha->optrom_buffer, 0, + ha->optrom_size); + break; + case 2: + if (ha->optrom_state != QLA_SWAITING) + break; + + ha->optrom_state = QLA_SWRITING; + ha->optrom_buffer = (uint8_t *)vmalloc(ha->optrom_size); + if (ha->optrom_buffer == NULL) { + qla_printk(KERN_WARNING, ha, + "Unable to allocate memory for optrom update " + "(%x).\n", ha->optrom_size); + + ha->optrom_state = QLA_SWAITING; + return count; + } + memset(ha->optrom_buffer, 0, ha->optrom_size); + break; + case 3: + if (ha->optrom_state != QLA_SWRITING) + break; + + ha->isp_ops.write_optrom(ha, ha->optrom_buffer, 0, + ha->optrom_size); + break; + } + return count; +} + +static struct bin_attribute sysfs_optrom_ctl_attr = { + .attr = { + .name = "optrom_ctl", + .mode = S_IWUSR, + .owner = THIS_MODULE, + }, + .size = 0, + .write = qla2x00_sysfs_write_optrom_ctl, +}; + +static ssize_t +qla2x00_sysfs_read_vpd(struct kobject *kobj, char *buf, loff_t off, + size_t count) +{ + struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj, + struct device, kobj))); + unsigned long flags; + + if (!capable(CAP_SYS_ADMIN) || off != 0) + return 0; + + /* Read NVRAM. */ + spin_lock_irqsave(&ha->hardware_lock, flags); + ha->isp_ops.read_nvram(ha, (uint8_t *)buf, ha->vpd_base, ha->vpd_size); + spin_unlock_irqrestore(&ha->hardware_lock, flags); + + return ha->vpd_size; +} + +static ssize_t +qla2x00_sysfs_write_vpd(struct kobject *kobj, char *buf, loff_t off, + size_t count) +{ + struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj, + struct device, kobj))); + unsigned long flags; + + if (!capable(CAP_SYS_ADMIN) || off != 0 || count != ha->vpd_size) + return 0; + + /* Write NVRAM. */ + spin_lock_irqsave(&ha->hardware_lock, flags); + ha->isp_ops.write_nvram(ha, (uint8_t *)buf, ha->vpd_base, count); + spin_unlock_irqrestore(&ha->hardware_lock, flags); + + return count; +} + +static struct bin_attribute sysfs_vpd_attr = { + .attr = { + .name = "vpd", + .mode = S_IRUSR | S_IWUSR, + .owner = THIS_MODULE, + }, + .size = 0, + .read = qla2x00_sysfs_read_vpd, + .write = qla2x00_sysfs_write_vpd, +}; + +static ssize_t +qla2x00_sysfs_read_sfp(struct kobject *kobj, char *buf, loff_t off, + size_t count) +{ + struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj, + struct device, kobj))); + uint16_t iter, addr, offset; + int rval; + + if (!capable(CAP_SYS_ADMIN) || off != 0 || count != SFP_DEV_SIZE * 2) + return 0; + + addr = 0xa0; + for (iter = 0, offset = 0; iter < (SFP_DEV_SIZE * 2) / SFP_BLOCK_SIZE; + iter++, offset += SFP_BLOCK_SIZE) { + if (iter == 4) { + /* Skip to next device address. */ + addr = 0xa2; + offset = 0; + } + + rval = qla2x00_read_sfp(ha, ha->sfp_data_dma, addr, offset, + SFP_BLOCK_SIZE); + if (rval != QLA_SUCCESS) { + qla_printk(KERN_WARNING, ha, + "Unable to read SFP data (%x/%x/%x).\n", rval, + addr, offset); + count = 0; + break; + } + memcpy(buf, ha->sfp_data, SFP_BLOCK_SIZE); + buf += SFP_BLOCK_SIZE; + } + + return count; +} + +static struct bin_attribute sysfs_sfp_attr = { + .attr = { + .name = "sfp", + .mode = S_IRUSR | S_IWUSR, + .owner = THIS_MODULE, + }, + .size = SFP_DEV_SIZE * 2, + .read = qla2x00_sysfs_read_sfp, +}; + void qla2x00_alloc_sysfs_attr(scsi_qla_host_t *ha) { @@ -200,6 +386,15 @@ qla2x00_alloc_sysfs_attr(scsi_qla_host_t *ha) sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_fw_dump_attr); sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_nvram_attr); + sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_optrom_attr); + sysfs_create_bin_file(&host->shost_gendev.kobj, + &sysfs_optrom_ctl_attr); + if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + sysfs_create_bin_file(&host->shost_gendev.kobj, + &sysfs_vpd_attr); + sysfs_create_bin_file(&host->shost_gendev.kobj, + &sysfs_sfp_attr); + } } void @@ -209,8 +404,275 @@ qla2x00_free_sysfs_attr(scsi_qla_host_t *ha) sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_fw_dump_attr); sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_nvram_attr); + sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_optrom_attr); + sysfs_remove_bin_file(&host->shost_gendev.kobj, + &sysfs_optrom_ctl_attr); + if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + sysfs_remove_bin_file(&host->shost_gendev.kobj, + &sysfs_vpd_attr); + sysfs_remove_bin_file(&host->shost_gendev.kobj, + &sysfs_sfp_attr); + } + + if (ha->beacon_blink_led == 1) + ha->isp_ops.beacon_off(ha); +} + +/* Scsi_Host attributes. */ + +static ssize_t +qla2x00_drvr_version_show(struct class_device *cdev, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%s\n", qla2x00_version_str); +} + +static ssize_t +qla2x00_fw_version_show(struct class_device *cdev, char *buf) +{ + scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev)); + char fw_str[30]; + + return snprintf(buf, PAGE_SIZE, "%s\n", + ha->isp_ops.fw_version_str(ha, fw_str)); +} + +static ssize_t +qla2x00_serial_num_show(struct class_device *cdev, char *buf) +{ + scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev)); + uint32_t sn; + + sn = ((ha->serial0 & 0x1f) << 16) | (ha->serial2 << 8) | ha->serial1; + return snprintf(buf, PAGE_SIZE, "%c%05d\n", 'A' + sn / 100000, + sn % 100000); +} + +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, "ISP%04X\n", ha->pdev->device); +} + +static ssize_t +qla2x00_isp_id_show(struct class_device *cdev, char *buf) +{ + scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev)); + return snprintf(buf, PAGE_SIZE, "%04x %04x %04x %04x\n", + ha->product_id[0], ha->product_id[1], ha->product_id[2], + ha->product_id[3]); +} + +static ssize_t +qla2x00_model_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->model_number); +} + +static ssize_t +qla2x00_model_desc_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->model_desc ? ha->model_desc: ""); +} + +static ssize_t +qla2x00_pci_info_show(struct class_device *cdev, char *buf) +{ + scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev)); + char pci_info[30]; + + return snprintf(buf, PAGE_SIZE, "%s\n", + ha->isp_ops.pci_info_str(ha, pci_info)); +} + +static ssize_t +qla2x00_state_show(struct class_device *cdev, char *buf) +{ + scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev)); + int len = 0; + + if (atomic_read(&ha->loop_state) == LOOP_DOWN || + atomic_read(&ha->loop_state) == LOOP_DEAD) + len = snprintf(buf, PAGE_SIZE, "Link Down\n"); + else if (atomic_read(&ha->loop_state) != LOOP_READY || + test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags) || + test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) + len = snprintf(buf, PAGE_SIZE, "Unknown Link State\n"); + else { + len = snprintf(buf, PAGE_SIZE, "Link Up - "); + + switch (ha->current_topology) { + case ISP_CFG_NL: + len += snprintf(buf + len, PAGE_SIZE-len, "Loop\n"); + break; + case ISP_CFG_FL: + len += snprintf(buf + len, PAGE_SIZE-len, "FL_Port\n"); + break; + case ISP_CFG_N: + len += snprintf(buf + len, PAGE_SIZE-len, + "N_Port to N_Port\n"); + break; + case ISP_CFG_F: + len += snprintf(buf + len, PAGE_SIZE-len, "F_Port\n"); + break; + default: + len += snprintf(buf + len, PAGE_SIZE-len, "Loop\n"); + break; + } + } + return len; +} + +static ssize_t +qla2x00_zio_show(struct class_device *cdev, char *buf) +{ + scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev)); + int len = 0; + + switch (ha->zio_mode) { + case QLA_ZIO_MODE_6: + len += snprintf(buf + len, PAGE_SIZE-len, "Mode 6\n"); + break; + case QLA_ZIO_DISABLED: + len += snprintf(buf + len, PAGE_SIZE-len, "Disabled\n"); + break; + } + return len; +} + +static ssize_t +qla2x00_zio_store(struct class_device *cdev, const char *buf, size_t count) +{ + scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev)); + int val = 0; + uint16_t zio_mode; + + if (!IS_ZIO_SUPPORTED(ha)) + return -ENOTSUPP; + + if (sscanf(buf, "%d", &val) != 1) + return -EINVAL; + + if (val) + zio_mode = QLA_ZIO_MODE_6; + else + zio_mode = QLA_ZIO_DISABLED; + + /* Update per-hba values and queue a reset. */ + if (zio_mode != QLA_ZIO_DISABLED || ha->zio_mode != QLA_ZIO_DISABLED) { + ha->zio_mode = zio_mode; + set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); + } + return strlen(buf); +} + +static ssize_t +qla2x00_zio_timer_show(struct class_device *cdev, char *buf) +{ + scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev)); + + return snprintf(buf, PAGE_SIZE, "%d us\n", ha->zio_timer * 100); +} + +static ssize_t +qla2x00_zio_timer_store(struct class_device *cdev, const char *buf, + size_t count) +{ + scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev)); + int val = 0; + uint16_t zio_timer; + + if (sscanf(buf, "%d", &val) != 1) + return -EINVAL; + if (val > 25500 || val < 100) + return -ERANGE; + + zio_timer = (uint16_t)(val / 100); + ha->zio_timer = zio_timer; + + return strlen(buf); +} + +static ssize_t +qla2x00_beacon_show(struct class_device *cdev, char *buf) +{ + scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev)); + int len = 0; + + if (ha->beacon_blink_led) + len += snprintf(buf + len, PAGE_SIZE-len, "Enabled\n"); + else + len += snprintf(buf + len, PAGE_SIZE-len, "Disabled\n"); + return len; } +static ssize_t +qla2x00_beacon_store(struct class_device *cdev, const char *buf, + size_t count) +{ + scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev)); + int val = 0; + int rval; + + if (IS_QLA2100(ha) || IS_QLA2200(ha)) + return -EPERM; + + if (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) { + qla_printk(KERN_WARNING, ha, + "Abort ISP active -- ignoring beacon request.\n"); + return -EBUSY; + } + + if (sscanf(buf, "%d", &val) != 1) + return -EINVAL; + + if (val) + rval = ha->isp_ops.beacon_on(ha); + else + rval = ha->isp_ops.beacon_off(ha); + + if (rval != QLA_SUCCESS) + count = 0; + + return count; +} + +static CLASS_DEVICE_ATTR(driver_version, S_IRUGO, qla2x00_drvr_version_show, + NULL); +static CLASS_DEVICE_ATTR(fw_version, S_IRUGO, qla2x00_fw_version_show, NULL); +static CLASS_DEVICE_ATTR(serial_num, S_IRUGO, qla2x00_serial_num_show, NULL); +static CLASS_DEVICE_ATTR(isp_name, S_IRUGO, qla2x00_isp_name_show, NULL); +static CLASS_DEVICE_ATTR(isp_id, S_IRUGO, qla2x00_isp_id_show, NULL); +static CLASS_DEVICE_ATTR(model_name, S_IRUGO, qla2x00_model_name_show, NULL); +static CLASS_DEVICE_ATTR(model_desc, S_IRUGO, qla2x00_model_desc_show, NULL); +static CLASS_DEVICE_ATTR(pci_info, S_IRUGO, qla2x00_pci_info_show, NULL); +static CLASS_DEVICE_ATTR(state, S_IRUGO, qla2x00_state_show, NULL); +static CLASS_DEVICE_ATTR(zio, S_IRUGO | S_IWUSR, qla2x00_zio_show, + qla2x00_zio_store); +static CLASS_DEVICE_ATTR(zio_timer, S_IRUGO | S_IWUSR, qla2x00_zio_timer_show, + qla2x00_zio_timer_store); +static CLASS_DEVICE_ATTR(beacon, S_IRUGO | S_IWUSR, qla2x00_beacon_show, + qla2x00_beacon_store); + +struct class_device_attribute *qla2x00_host_attrs[] = { + &class_device_attr_driver_version, + &class_device_attr_fw_version, + &class_device_attr_serial_num, + &class_device_attr_isp_name, + &class_device_attr_isp_id, + &class_device_attr_model_name, + &class_device_attr_model_desc, + &class_device_attr_pci_info, + &class_device_attr_state, + &class_device_attr_zio, + &class_device_attr_zio_timer, + &class_device_attr_beacon, + NULL, +}; + /* Host attributes. */ static void @@ -222,22 +684,65 @@ qla2x00_get_host_port_id(struct Scsi_Host *shost) ha->d_id.b.area << 8 | ha->d_id.b.al_pa; } +static void +qla2x00_get_host_speed(struct Scsi_Host *shost) +{ + scsi_qla_host_t *ha = to_qla_host(shost); + uint32_t speed = 0; + + switch (ha->link_data_rate) { + case LDR_1GB: + speed = 1; + break; + case LDR_2GB: + speed = 2; + break; + case LDR_4GB: + speed = 4; + break; + } + fc_host_speed(shost) = speed; +} + +static void +qla2x00_get_host_port_type(struct Scsi_Host *shost) +{ + scsi_qla_host_t *ha = to_qla_host(shost); + uint32_t port_type = FC_PORTTYPE_UNKNOWN; + + switch (ha->current_topology) { + case ISP_CFG_NL: + port_type = FC_PORTTYPE_LPORT; + break; + case ISP_CFG_FL: + port_type = FC_PORTTYPE_NLPORT; + break; + case ISP_CFG_N: + port_type = FC_PORTTYPE_PTP; + break; + case ISP_CFG_F: + port_type = FC_PORTTYPE_NPORT; + break; + } + fc_host_port_type(shost) = port_type; +} + static void qla2x00_get_starget_node_name(struct scsi_target *starget) { struct Scsi_Host *host = dev_to_shost(starget->dev.parent); scsi_qla_host_t *ha = to_qla_host(host); fc_port_t *fcport; - uint64_t node_name = 0; + u64 node_name = 0; list_for_each_entry(fcport, &ha->fcports, list) { if (starget->id == fcport->os_target_id) { - node_name = *(uint64_t *)fcport->node_name; + node_name = wwn_to_u64(fcport->node_name); break; } } - fc_starget_node_name(starget) = be64_to_cpu(node_name); + fc_starget_node_name(starget) = node_name; } static void @@ -246,16 +751,16 @@ qla2x00_get_starget_port_name(struct scsi_target *starget) struct Scsi_Host *host = dev_to_shost(starget->dev.parent); scsi_qla_host_t *ha = to_qla_host(host); fc_port_t *fcport; - uint64_t port_name = 0; + u64 port_name = 0; list_for_each_entry(fcport, &ha->fcports, list) { if (starget->id == fcport->os_target_id) { - port_name = *(uint64_t *)fcport->port_name; + port_name = wwn_to_u64(fcport->port_name); break; } } - fc_starget_port_name(starget) = be64_to_cpu(port_name); + fc_starget_port_name(starget) = port_name; } static void @@ -300,14 +805,65 @@ qla2x00_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout) rport->dev_loss_tmo = ha->port_down_retry_count + 5; } +static int +qla2x00_issue_lip(struct Scsi_Host *shost) +{ + scsi_qla_host_t *ha = to_qla_host(shost); + + set_bit(LOOP_RESET_NEEDED, &ha->dpc_flags); + return 0; +} + +static struct fc_host_statistics * +qla2x00_get_fc_host_stats(struct Scsi_Host *shost) +{ + scsi_qla_host_t *ha = to_qla_host(shost); + int rval; + uint16_t mb_stat[1]; + link_stat_t stat_buf; + struct fc_host_statistics *pfc_host_stat; + + pfc_host_stat = &ha->fc_host_stat; + memset(pfc_host_stat, -1, sizeof(struct fc_host_statistics)); + + if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + rval = qla24xx_get_isp_stats(ha, (uint32_t *)&stat_buf, + sizeof(stat_buf) / 4, mb_stat); + } else { + rval = qla2x00_get_link_status(ha, ha->loop_id, &stat_buf, + mb_stat); + } + if (rval != 0) { + qla_printk(KERN_WARNING, ha, + "Unable to retrieve host statistics (%d).\n", mb_stat[0]); + return pfc_host_stat; + } + + pfc_host_stat->link_failure_count = stat_buf.link_fail_cnt; + pfc_host_stat->loss_of_sync_count = stat_buf.loss_sync_cnt; + pfc_host_stat->loss_of_signal_count = stat_buf.loss_sig_cnt; + pfc_host_stat->prim_seq_protocol_err_count = stat_buf.prim_seq_err_cnt; + pfc_host_stat->invalid_tx_word_count = stat_buf.inval_xmit_word_cnt; + pfc_host_stat->invalid_crc_count = stat_buf.inval_crc_cnt; + + return pfc_host_stat; +} + struct fc_function_template qla2xxx_transport_functions = { .show_host_node_name = 1, .show_host_port_name = 1, + .show_host_supported_classes = 1, + .get_host_port_id = qla2x00_get_host_port_id, .show_host_port_id = 1, + .get_host_speed = qla2x00_get_host_speed, + .show_host_speed = 1, + .get_host_port_type = qla2x00_get_host_port_type, + .show_host_port_type = 1, .dd_fcrport_size = sizeof(struct fc_port *), + .show_rport_supported_classes = 1, .get_starget_node_name = qla2x00_get_starget_node_name, .show_starget_node_name = 1, @@ -320,13 +876,14 @@ struct fc_function_template qla2xxx_transport_functions = { .set_rport_dev_loss_tmo = qla2x00_set_rport_loss_tmo, .show_rport_dev_loss_tmo = 1, + .issue_fc_host_lip = qla2x00_issue_lip, + .get_fc_host_stats = qla2x00_get_fc_host_stats, }; void qla2x00_init_host_attr(scsi_qla_host_t *ha) { - fc_host_node_name(ha->host) = - be64_to_cpu(*(uint64_t *)ha->init_cb->node_name); - fc_host_port_name(ha->host) = - be64_to_cpu(*(uint64_t *)ha->init_cb->port_name); + fc_host_node_name(ha->host) = wwn_to_u64(ha->node_name); + fc_host_port_name(ha->host) = wwn_to_u64(ha->port_name); + fc_host_supported_classes(ha->host) = FC_COS_CLASS3; } diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c index 2d9b12ffe..f6ed6962b 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.c +++ b/drivers/scsi/qla2xxx/qla_dbg.c @@ -8,7 +8,34 @@ #include -static int qla_uprintf(char **, char *, ...); +static inline void +qla2xxx_prep_dump(scsi_qla_host_t *ha, struct qla2xxx_fw_dump *fw_dump) +{ + fw_dump->fw_major_version = htonl(ha->fw_major_version); + fw_dump->fw_minor_version = htonl(ha->fw_minor_version); + fw_dump->fw_subminor_version = htonl(ha->fw_subminor_version); + fw_dump->fw_attributes = htonl(ha->fw_attributes); + + fw_dump->vendor = htonl(ha->pdev->vendor); + fw_dump->device = htonl(ha->pdev->device); + fw_dump->subsystem_vendor = htonl(ha->pdev->subsystem_vendor); + fw_dump->subsystem_device = htonl(ha->pdev->subsystem_device); +} + +static inline void * +qla2xxx_copy_queues(scsi_qla_host_t *ha, void *ptr) +{ + /* Request queue. */ + memcpy(ptr, ha->request_ring, ha->request_q_length * + sizeof(request_t)); + + /* Response queue. */ + ptr += ha->request_q_length * sizeof(request_t); + memcpy(ptr, ha->response_ring, ha->response_q_length * + sizeof(response_t)); + + return ptr + (ha->response_q_length * sizeof(response_t)); +} /** * qla2300_fw_dump() - Dumps binary data from the 2300 firmware. @@ -28,7 +55,7 @@ qla2300_fw_dump(scsi_qla_host_t *ha, int hardware_locked) uint16_t __iomem *dmp_reg; unsigned long flags; struct qla2300_fw_dump *fw; - uint32_t dump_size, data_ram_cnt; + uint32_t data_ram_cnt; risc_address = data_ram_cnt = 0; mb0 = mb2 = 0; @@ -37,29 +64,23 @@ qla2300_fw_dump(scsi_qla_host_t *ha, int hardware_locked) if (!hardware_locked) spin_lock_irqsave(&ha->hardware_lock, flags); - if (ha->fw_dump != NULL) { + if (!ha->fw_dump) { qla_printk(KERN_WARNING, ha, - "Firmware has been previously dumped (%p) -- ignoring " - "request...\n", ha->fw_dump); + "No buffer available for dump!!!\n"); goto qla2300_fw_dump_failed; } - /* Allocate (large) dump buffer. */ - dump_size = sizeof(struct qla2300_fw_dump); - dump_size += (ha->fw_memory_size - 0x11000) * sizeof(uint16_t); - ha->fw_dump_order = get_order(dump_size); - ha->fw_dump = (struct qla2300_fw_dump *) __get_free_pages(GFP_ATOMIC, - ha->fw_dump_order); - if (ha->fw_dump == NULL) { + if (ha->fw_dumped) { qla_printk(KERN_WARNING, ha, - "Unable to allocated memory for firmware dump (%d/%d).\n", - ha->fw_dump_order, dump_size); + "Firmware has been previously dumped (%p) -- ignoring " + "request...\n", ha->fw_dump); goto qla2300_fw_dump_failed; } - fw = ha->fw_dump; + fw = &ha->fw_dump->isp.isp23; + qla2xxx_prep_dump(ha, ha->fw_dump); rval = QLA_SUCCESS; - fw->hccr = RD_REG_WORD(®->hccr); + fw->hccr = htons(RD_REG_WORD(®->hccr)); /* Pause RISC. */ WRT_REG_WORD(®->hccr, HCCR_PAUSE_RISC); @@ -80,85 +101,86 @@ qla2300_fw_dump(scsi_qla_host_t *ha, int hardware_locked) if (rval == QLA_SUCCESS) { dmp_reg = (uint16_t __iomem *)(reg + 0); for (cnt = 0; cnt < sizeof(fw->pbiu_reg) / 2; cnt++) - fw->pbiu_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->pbiu_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x10); for (cnt = 0; cnt < sizeof(fw->risc_host_reg) / 2; cnt++) - fw->risc_host_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->risc_host_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x40); for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++) - fw->mailbox_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->mailbox_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); WRT_REG_WORD(®->ctrl_status, 0x40); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->resp_dma_reg) / 2; cnt++) - fw->resp_dma_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->resp_dma_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); WRT_REG_WORD(®->ctrl_status, 0x50); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->dma_reg) / 2; cnt++) - fw->dma_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->dma_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); WRT_REG_WORD(®->ctrl_status, 0x00); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0xA0); for (cnt = 0; cnt < sizeof(fw->risc_hdw_reg) / 2; cnt++) - fw->risc_hdw_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->risc_hdw_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); WRT_REG_WORD(®->pcr, 0x2000); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->risc_gp0_reg) / 2; cnt++) - fw->risc_gp0_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->risc_gp0_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); WRT_REG_WORD(®->pcr, 0x2200); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->risc_gp1_reg) / 2; cnt++) - fw->risc_gp1_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->risc_gp1_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); WRT_REG_WORD(®->pcr, 0x2400); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->risc_gp2_reg) / 2; cnt++) - fw->risc_gp2_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->risc_gp2_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); WRT_REG_WORD(®->pcr, 0x2600); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->risc_gp3_reg) / 2; cnt++) - fw->risc_gp3_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->risc_gp3_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); WRT_REG_WORD(®->pcr, 0x2800); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->risc_gp4_reg) / 2; cnt++) - fw->risc_gp4_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->risc_gp4_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); WRT_REG_WORD(®->pcr, 0x2A00); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->risc_gp5_reg) / 2; cnt++) - fw->risc_gp5_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->risc_gp5_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); WRT_REG_WORD(®->pcr, 0x2C00); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->risc_gp6_reg) / 2; cnt++) - fw->risc_gp6_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->risc_gp6_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); WRT_REG_WORD(®->pcr, 0x2E00); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->risc_gp7_reg) / 2; cnt++) - fw->risc_gp7_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->risc_gp7_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); WRT_REG_WORD(®->ctrl_status, 0x10); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->frame_buf_hdw_reg) / 2; cnt++) - fw->frame_buf_hdw_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->frame_buf_hdw_reg[cnt] = + htons(RD_REG_WORD(dmp_reg++)); WRT_REG_WORD(®->ctrl_status, 0x20); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->fpm_b0_reg) / 2; cnt++) - fw->fpm_b0_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->fpm_b0_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); WRT_REG_WORD(®->ctrl_status, 0x30); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->fpm_b1_reg) / 2; cnt++) - fw->fpm_b1_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->fpm_b1_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); /* Reset RISC. */ WRT_REG_WORD(®->ctrl_status, CSR_ISP_SOFT_RESET); @@ -233,7 +255,7 @@ qla2300_fw_dump(scsi_qla_host_t *ha, int hardware_locked) if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) { rval = mb0 & MBS_MASK; - fw->risc_ram[cnt] = mb2; + fw->risc_ram[cnt] = htons(mb2); } else { rval = QLA_FUNCTION_FAILED; } @@ -292,7 +314,7 @@ qla2300_fw_dump(scsi_qla_host_t *ha, int hardware_locked) if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) { rval = mb0 & MBS_MASK; - fw->stack_ram[cnt] = mb2; + fw->stack_ram[cnt] = htons(mb2); } else { rval = QLA_FUNCTION_FAILED; } @@ -352,23 +374,25 @@ qla2300_fw_dump(scsi_qla_host_t *ha, int hardware_locked) if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) { rval = mb0 & MBS_MASK; - fw->data_ram[cnt] = mb2; + fw->data_ram[cnt] = htons(mb2); } else { rval = QLA_FUNCTION_FAILED; } } + if (rval == QLA_SUCCESS) + qla2xxx_copy_queues(ha, &fw->data_ram[cnt]); if (rval != QLA_SUCCESS) { qla_printk(KERN_WARNING, ha, "Failed to dump firmware (%x)!!!\n", rval); + ha->fw_dumped = 0; - free_pages((unsigned long)ha->fw_dump, ha->fw_dump_order); - ha->fw_dump = NULL; } else { qla_printk(KERN_INFO, ha, "Firmware dump saved to temp buffer (%ld/%p).\n", ha->host_no, ha->fw_dump); + ha->fw_dumped = 1; } qla2300_fw_dump_failed: @@ -376,193 +400,6 @@ qla2300_fw_dump_failed: spin_unlock_irqrestore(&ha->hardware_lock, flags); } -/** - * qla2300_ascii_fw_dump() - Converts a binary firmware dump to ASCII. - * @ha: HA context - */ -void -qla2300_ascii_fw_dump(scsi_qla_host_t *ha) -{ - uint32_t cnt; - char *uiter; - char fw_info[30]; - struct qla2300_fw_dump *fw; - uint32_t data_ram_cnt; - - uiter = ha->fw_dump_buffer; - fw = ha->fw_dump; - - qla_uprintf(&uiter, "%s Firmware Version %s\n", ha->model_number, - ha->isp_ops.fw_version_str(ha, fw_info)); - - qla_uprintf(&uiter, "\n[==>BEG]\n"); - - qla_uprintf(&uiter, "HCCR Register:\n%04x\n\n", fw->hccr); - - qla_uprintf(&uiter, "PBIU Registers:"); - for (cnt = 0; cnt < sizeof (fw->pbiu_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->pbiu_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nReqQ-RspQ-Risc2Host Status registers:"); - for (cnt = 0; cnt < sizeof (fw->risc_host_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->risc_host_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nMailbox Registers:"); - for (cnt = 0; cnt < sizeof (fw->mailbox_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->mailbox_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nAuto Request Response DMA Registers:"); - for (cnt = 0; cnt < sizeof (fw->resp_dma_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->resp_dma_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nDMA Registers:"); - for (cnt = 0; cnt < sizeof (fw->dma_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->dma_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRISC Hardware Registers:"); - for (cnt = 0; cnt < sizeof (fw->risc_hdw_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->risc_hdw_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRISC GP0 Registers:"); - for (cnt = 0; cnt < sizeof (fw->risc_gp0_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->risc_gp0_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRISC GP1 Registers:"); - for (cnt = 0; cnt < sizeof (fw->risc_gp1_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->risc_gp1_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRISC GP2 Registers:"); - for (cnt = 0; cnt < sizeof (fw->risc_gp2_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->risc_gp2_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRISC GP3 Registers:"); - for (cnt = 0; cnt < sizeof (fw->risc_gp3_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->risc_gp3_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRISC GP4 Registers:"); - for (cnt = 0; cnt < sizeof (fw->risc_gp4_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->risc_gp4_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRISC GP5 Registers:"); - for (cnt = 0; cnt < sizeof (fw->risc_gp5_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->risc_gp5_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRISC GP6 Registers:"); - for (cnt = 0; cnt < sizeof (fw->risc_gp6_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->risc_gp6_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRISC GP7 Registers:"); - for (cnt = 0; cnt < sizeof (fw->risc_gp7_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->risc_gp7_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nFrame Buffer Hardware Registers:"); - for (cnt = 0; cnt < sizeof (fw->frame_buf_hdw_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->frame_buf_hdw_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nFPM B0 Registers:"); - for (cnt = 0; cnt < sizeof (fw->fpm_b0_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->fpm_b0_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nFPM B1 Registers:"); - for (cnt = 0; cnt < sizeof (fw->fpm_b1_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->fpm_b1_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nCode RAM Dump:"); - for (cnt = 0; cnt < sizeof (fw->risc_ram) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n%04x: ", cnt + 0x0800); - } - qla_uprintf(&uiter, "%04x ", fw->risc_ram[cnt]); - } - - qla_uprintf(&uiter, "\n\nStack RAM Dump:"); - for (cnt = 0; cnt < sizeof (fw->stack_ram) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n%05x: ", cnt + 0x10000); - } - qla_uprintf(&uiter, "%04x ", fw->stack_ram[cnt]); - } - - qla_uprintf(&uiter, "\n\nData RAM Dump:"); - data_ram_cnt = ha->fw_memory_size - 0x11000 + 1; - for (cnt = 0; cnt < data_ram_cnt; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n%05x: ", cnt + 0x11000); - } - qla_uprintf(&uiter, "%04x ", fw->data_ram[cnt]); - } - - qla_uprintf(&uiter, "\n\n[<==END] ISP Debug Dump."); -} - /** * qla2100_fw_dump() - Dumps binary data from the 2100/2200 firmware. * @ha: HA context @@ -587,27 +424,23 @@ qla2100_fw_dump(scsi_qla_host_t *ha, int hardware_locked) if (!hardware_locked) spin_lock_irqsave(&ha->hardware_lock, flags); - if (ha->fw_dump != NULL) { + if (!ha->fw_dump) { qla_printk(KERN_WARNING, ha, - "Firmware has been previously dumped (%p) -- ignoring " - "request...\n", ha->fw_dump); + "No buffer available for dump!!!\n"); goto qla2100_fw_dump_failed; } - /* Allocate (large) dump buffer. */ - ha->fw_dump_order = get_order(sizeof(struct qla2100_fw_dump)); - ha->fw_dump = (struct qla2100_fw_dump *) __get_free_pages(GFP_ATOMIC, - ha->fw_dump_order); - if (ha->fw_dump == NULL) { + if (ha->fw_dumped) { qla_printk(KERN_WARNING, ha, - "Unable to allocated memory for firmware dump (%d/%Zd).\n", - ha->fw_dump_order, sizeof(struct qla2100_fw_dump)); + "Firmware has been previously dumped (%p) -- ignoring " + "request...\n", ha->fw_dump); goto qla2100_fw_dump_failed; } - fw = ha->fw_dump; + fw = &ha->fw_dump->isp.isp21; + qla2xxx_prep_dump(ha, ha->fw_dump); rval = QLA_SUCCESS; - fw->hccr = RD_REG_WORD(®->hccr); + fw->hccr = htons(RD_REG_WORD(®->hccr)); /* Pause RISC. */ WRT_REG_WORD(®->hccr, HCCR_PAUSE_RISC); @@ -621,79 +454,81 @@ qla2100_fw_dump(scsi_qla_host_t *ha, int hardware_locked) if (rval == QLA_SUCCESS) { dmp_reg = (uint16_t __iomem *)(reg + 0); for (cnt = 0; cnt < sizeof(fw->pbiu_reg) / 2; cnt++) - fw->pbiu_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->pbiu_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x10); for (cnt = 0; cnt < ha->mbx_count; cnt++) { if (cnt == 8) { - dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0xe0); + dmp_reg = (uint16_t __iomem *) + ((uint8_t __iomem *)reg + 0xe0); } - fw->mailbox_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->mailbox_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); } dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x20); for (cnt = 0; cnt < sizeof(fw->dma_reg) / 2; cnt++) - fw->dma_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->dma_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); WRT_REG_WORD(®->ctrl_status, 0x00); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0xA0); for (cnt = 0; cnt < sizeof(fw->risc_hdw_reg) / 2; cnt++) - fw->risc_hdw_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->risc_hdw_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); WRT_REG_WORD(®->pcr, 0x2000); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->risc_gp0_reg) / 2; cnt++) - fw->risc_gp0_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->risc_gp0_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); WRT_REG_WORD(®->pcr, 0x2100); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->risc_gp1_reg) / 2; cnt++) - fw->risc_gp1_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->risc_gp1_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); WRT_REG_WORD(®->pcr, 0x2200); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->risc_gp2_reg) / 2; cnt++) - fw->risc_gp2_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->risc_gp2_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); WRT_REG_WORD(®->pcr, 0x2300); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->risc_gp3_reg) / 2; cnt++) - fw->risc_gp3_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->risc_gp3_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); WRT_REG_WORD(®->pcr, 0x2400); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->risc_gp4_reg) / 2; cnt++) - fw->risc_gp4_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->risc_gp4_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); WRT_REG_WORD(®->pcr, 0x2500); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->risc_gp5_reg) / 2; cnt++) - fw->risc_gp5_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->risc_gp5_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); WRT_REG_WORD(®->pcr, 0x2600); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->risc_gp6_reg) / 2; cnt++) - fw->risc_gp6_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->risc_gp6_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); WRT_REG_WORD(®->pcr, 0x2700); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->risc_gp7_reg) / 2; cnt++) - fw->risc_gp7_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->risc_gp7_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); WRT_REG_WORD(®->ctrl_status, 0x10); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->frame_buf_hdw_reg) / 2; cnt++) - fw->frame_buf_hdw_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->frame_buf_hdw_reg[cnt] = + htons(RD_REG_WORD(dmp_reg++)); WRT_REG_WORD(®->ctrl_status, 0x20); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->fpm_b0_reg) / 2; cnt++) - fw->fpm_b0_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->fpm_b0_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); WRT_REG_WORD(®->ctrl_status, 0x30); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->fpm_b1_reg) / 2; cnt++) - fw->fpm_b1_reg[cnt] = RD_REG_WORD(dmp_reg++); + fw->fpm_b1_reg[cnt] = htons(RD_REG_WORD(dmp_reg++)); /* Reset the ISP. */ WRT_REG_WORD(®->ctrl_status, CSR_ISP_SOFT_RESET); @@ -768,22 +603,25 @@ qla2100_fw_dump(scsi_qla_host_t *ha, int hardware_locked) if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) { rval = mb0 & MBS_MASK; - fw->risc_ram[cnt] = mb2; + fw->risc_ram[cnt] = htons(mb2); } else { rval = QLA_FUNCTION_FAILED; } } + if (rval == QLA_SUCCESS) + qla2xxx_copy_queues(ha, &fw->risc_ram[cnt]); + if (rval != QLA_SUCCESS) { qla_printk(KERN_WARNING, ha, "Failed to dump firmware (%x)!!!\n", rval); + ha->fw_dumped = 0; - free_pages((unsigned long)ha->fw_dump, ha->fw_dump_order); - ha->fw_dump = NULL; } else { qla_printk(KERN_INFO, ha, "Firmware dump saved to temp buffer (%ld/%p).\n", ha->host_no, ha->fw_dump); + ha->fw_dumped = 1; } qla2100_fw_dump_failed: @@ -791,179 +629,6 @@ qla2100_fw_dump_failed: spin_unlock_irqrestore(&ha->hardware_lock, flags); } -/** - * qla2100_ascii_fw_dump() - Converts a binary firmware dump to ASCII. - * @ha: HA context - */ -void -qla2100_ascii_fw_dump(scsi_qla_host_t *ha) -{ - uint32_t cnt; - char *uiter; - char fw_info[30]; - struct qla2100_fw_dump *fw; - - uiter = ha->fw_dump_buffer; - fw = ha->fw_dump; - - qla_uprintf(&uiter, "%s Firmware Version %s\n", ha->model_number, - ha->isp_ops.fw_version_str(ha, fw_info)); - - qla_uprintf(&uiter, "\n[==>BEG]\n"); - - qla_uprintf(&uiter, "HCCR Register:\n%04x\n\n", fw->hccr); - - qla_uprintf(&uiter, "PBIU Registers:"); - for (cnt = 0; cnt < sizeof (fw->pbiu_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->pbiu_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nMailbox Registers:"); - for (cnt = 0; cnt < sizeof (fw->mailbox_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->mailbox_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nDMA Registers:"); - for (cnt = 0; cnt < sizeof (fw->dma_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->dma_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRISC Hardware Registers:"); - for (cnt = 0; cnt < sizeof (fw->risc_hdw_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->risc_hdw_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRISC GP0 Registers:"); - for (cnt = 0; cnt < sizeof (fw->risc_gp0_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->risc_gp0_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRISC GP1 Registers:"); - for (cnt = 0; cnt < sizeof (fw->risc_gp1_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->risc_gp1_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRISC GP2 Registers:"); - for (cnt = 0; cnt < sizeof (fw->risc_gp2_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->risc_gp2_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRISC GP3 Registers:"); - for (cnt = 0; cnt < sizeof (fw->risc_gp3_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->risc_gp3_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRISC GP4 Registers:"); - for (cnt = 0; cnt < sizeof (fw->risc_gp4_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->risc_gp4_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRISC GP5 Registers:"); - for (cnt = 0; cnt < sizeof (fw->risc_gp5_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->risc_gp5_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRISC GP6 Registers:"); - for (cnt = 0; cnt < sizeof (fw->risc_gp6_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->risc_gp6_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRISC GP7 Registers:"); - for (cnt = 0; cnt < sizeof (fw->risc_gp7_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->risc_gp7_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nFrame Buffer Hardware Registers:"); - for (cnt = 0; cnt < sizeof (fw->frame_buf_hdw_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->frame_buf_hdw_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nFPM B0 Registers:"); - for (cnt = 0; cnt < sizeof (fw->fpm_b0_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->fpm_b0_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nFPM B1 Registers:"); - for (cnt = 0; cnt < sizeof (fw->fpm_b1_reg) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n"); - } - qla_uprintf(&uiter, "%04x ", fw->fpm_b1_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRISC SRAM:"); - for (cnt = 0; cnt < sizeof (fw->risc_ram) / 2; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n%04x: ", cnt + 0x1000); - } - qla_uprintf(&uiter, "%04x ", fw->risc_ram[cnt]); - } - - qla_uprintf(&uiter, "\n\n[<==END] ISP Debug Dump."); - - return; -} - -static int -qla_uprintf(char **uiter, char *fmt, ...) -{ - int iter, len; - char buf[128]; - va_list args; - - va_start(args, fmt); - len = vsprintf(buf, fmt, args); - va_end(args); - - for (iter = 0; iter < len; iter++, *uiter += 1) - *uiter[0] = buf[iter]; - - return (len); -} - - void qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked) { @@ -980,6 +645,7 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked) unsigned long flags; struct qla24xx_fw_dump *fw; uint32_t ext_mem_cnt; + void *eft; risc_address = ext_mem_cnt = 0; memset(mb, 0, sizeof(mb)); @@ -988,7 +654,7 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked) if (!hardware_locked) spin_lock_irqsave(&ha->hardware_lock, flags); - if (!ha->fw_dump24) { + if (!ha->fw_dump) { qla_printk(KERN_WARNING, ha, "No buffer available for dump!!!\n"); goto qla24xx_fw_dump_failed; @@ -997,13 +663,14 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked) if (ha->fw_dumped) { qla_printk(KERN_WARNING, ha, "Firmware has been previously dumped (%p) -- ignoring " - "request...\n", ha->fw_dump24); + "request...\n", ha->fw_dump); goto qla24xx_fw_dump_failed; } - fw = (struct qla24xx_fw_dump *) ha->fw_dump24; + fw = &ha->fw_dump->isp.isp24; + qla2xxx_prep_dump(ha, ha->fw_dump); rval = QLA_SUCCESS; - fw->host_status = RD_REG_DWORD(®->host_status); + fw->host_status = htonl(RD_REG_DWORD(®->host_status)); /* Pause RISC. */ if ((RD_REG_DWORD(®->hccr) & HCCRX_RISC_PAUSE) == 0) { @@ -1025,7 +692,7 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked) /* Host interface registers. */ dmp_reg = (uint32_t __iomem *)(reg + 0); for (cnt = 0; cnt < sizeof(fw->host_reg) / 4; cnt++) - fw->host_reg[cnt] = RD_REG_DWORD(dmp_reg++); + fw->host_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); /* Disable interrupts. */ WRT_REG_DWORD(®->ictrl, 0); @@ -1037,470 +704,471 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked) dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); WRT_REG_DWORD(dmp_reg, 0xB0000000); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); - fw->shadow_reg[0] = RD_REG_DWORD(dmp_reg); + fw->shadow_reg[0] = htonl(RD_REG_DWORD(dmp_reg)); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); WRT_REG_DWORD(dmp_reg, 0xB0100000); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); - fw->shadow_reg[1] = RD_REG_DWORD(dmp_reg); + fw->shadow_reg[1] = htonl(RD_REG_DWORD(dmp_reg)); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); WRT_REG_DWORD(dmp_reg, 0xB0200000); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); - fw->shadow_reg[2] = RD_REG_DWORD(dmp_reg); + fw->shadow_reg[2] = htonl(RD_REG_DWORD(dmp_reg)); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); WRT_REG_DWORD(dmp_reg, 0xB0300000); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); - fw->shadow_reg[3] = RD_REG_DWORD(dmp_reg); + fw->shadow_reg[3] = htonl(RD_REG_DWORD(dmp_reg)); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); WRT_REG_DWORD(dmp_reg, 0xB0400000); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); - fw->shadow_reg[4] = RD_REG_DWORD(dmp_reg); + fw->shadow_reg[4] = htonl(RD_REG_DWORD(dmp_reg)); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); WRT_REG_DWORD(dmp_reg, 0xB0500000); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); - fw->shadow_reg[5] = RD_REG_DWORD(dmp_reg); + fw->shadow_reg[5] = htonl(RD_REG_DWORD(dmp_reg)); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); WRT_REG_DWORD(dmp_reg, 0xB0600000); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); - fw->shadow_reg[6] = RD_REG_DWORD(dmp_reg); + fw->shadow_reg[6] = htonl(RD_REG_DWORD(dmp_reg)); /* Mailbox registers. */ mbx_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++) - fw->mailbox_reg[cnt] = RD_REG_WORD(mbx_reg++); + fw->mailbox_reg[cnt] = htons(RD_REG_WORD(mbx_reg++)); /* Transfer sequence registers. */ iter_reg = fw->xseq_gp_reg; WRT_REG_DWORD(®->iobase_addr, 0xBF00); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0xBF10); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0xBF20); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0xBF30); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0xBF40); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0xBF50); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0xBF60); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0xBF70); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0xBFE0); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < sizeof(fw->xseq_0_reg) / 4; cnt++) - fw->xseq_0_reg[cnt] = RD_REG_DWORD(dmp_reg++); + fw->xseq_0_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0xBFF0); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < sizeof(fw->xseq_1_reg) / 4; cnt++) - fw->xseq_1_reg[cnt] = RD_REG_DWORD(dmp_reg++); + fw->xseq_1_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); /* Receive sequence registers. */ iter_reg = fw->rseq_gp_reg; WRT_REG_DWORD(®->iobase_addr, 0xFF00); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0xFF10); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0xFF20); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0xFF30); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0xFF40); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0xFF50); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0xFF60); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0xFF70); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0xFFD0); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < sizeof(fw->rseq_0_reg) / 4; cnt++) - fw->rseq_0_reg[cnt] = RD_REG_DWORD(dmp_reg++); + fw->rseq_0_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0xFFE0); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < sizeof(fw->rseq_1_reg) / 4; cnt++) - fw->rseq_1_reg[cnt] = RD_REG_DWORD(dmp_reg++); + fw->rseq_1_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0xFFF0); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < sizeof(fw->rseq_2_reg) / 4; cnt++) - fw->rseq_2_reg[cnt] = RD_REG_DWORD(dmp_reg++); + fw->rseq_2_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); /* Command DMA registers. */ WRT_REG_DWORD(®->iobase_addr, 0x7100); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < sizeof(fw->cmd_dma_reg) / 4; cnt++) - fw->cmd_dma_reg[cnt] = RD_REG_DWORD(dmp_reg++); + fw->cmd_dma_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); /* Queues. */ iter_reg = fw->req0_dma_reg; WRT_REG_DWORD(®->iobase_addr, 0x7200); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 8; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xE4); for (cnt = 0; cnt < 7; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); iter_reg = fw->resp0_dma_reg; WRT_REG_DWORD(®->iobase_addr, 0x7300); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 8; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xE4); for (cnt = 0; cnt < 7; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); iter_reg = fw->req1_dma_reg; WRT_REG_DWORD(®->iobase_addr, 0x7400); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 8; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xE4); for (cnt = 0; cnt < 7; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); /* Transmit DMA registers. */ iter_reg = fw->xmt0_dma_reg; WRT_REG_DWORD(®->iobase_addr, 0x7600); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x7610); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); iter_reg = fw->xmt1_dma_reg; WRT_REG_DWORD(®->iobase_addr, 0x7620); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x7630); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); iter_reg = fw->xmt2_dma_reg; WRT_REG_DWORD(®->iobase_addr, 0x7640); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x7650); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); iter_reg = fw->xmt3_dma_reg; WRT_REG_DWORD(®->iobase_addr, 0x7660); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x7670); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); iter_reg = fw->xmt4_dma_reg; WRT_REG_DWORD(®->iobase_addr, 0x7680); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x7690); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x76A0); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < sizeof(fw->xmt_data_dma_reg) / 4; cnt++) - fw->xmt_data_dma_reg[cnt] = RD_REG_DWORD(dmp_reg++); + fw->xmt_data_dma_reg[cnt] = + htonl(RD_REG_DWORD(dmp_reg++)); /* Receive DMA registers. */ iter_reg = fw->rcvt0_data_dma_reg; WRT_REG_DWORD(®->iobase_addr, 0x7700); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x7710); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); iter_reg = fw->rcvt1_data_dma_reg; WRT_REG_DWORD(®->iobase_addr, 0x7720); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x7730); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); /* RISC registers. */ iter_reg = fw->risc_gp_reg; WRT_REG_DWORD(®->iobase_addr, 0x0F00); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x0F10); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x0F20); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x0F30); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x0F40); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x0F50); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x0F60); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x0F70); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); /* Local memory controller registers. */ iter_reg = fw->lmc_reg; WRT_REG_DWORD(®->iobase_addr, 0x3000); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x3010); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x3020); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x3030); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x3040); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x3050); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x3060); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); /* Fibre Protocol Module registers. */ iter_reg = fw->fpm_hdw_reg; WRT_REG_DWORD(®->iobase_addr, 0x4000); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x4010); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x4020); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x4030); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x4040); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x4050); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x4060); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x4070); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x4080); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x4090); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x40A0); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x40B0); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); /* Frame Buffer registers. */ iter_reg = fw->fb_hdw_reg; WRT_REG_DWORD(®->iobase_addr, 0x6000); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x6010); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x6020); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x6030); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x6040); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x6100); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x6130); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x6150); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x6170); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x6190); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); WRT_REG_DWORD(®->iobase_addr, 0x61B0); dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); for (cnt = 0; cnt < 16; cnt++) - *iter_reg++ = RD_REG_DWORD(dmp_reg++); + *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); /* Reset RISC. */ WRT_REG_DWORD(®->ctrl_status, @@ -1590,7 +1258,7 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked) if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) { rval = mb[0] & MBS_MASK; - fw->code_ram[cnt] = (mb[3] << 16) | mb[2]; + fw->code_ram[cnt] = htonl((mb[3] << 16) | mb[2]); } else { rval = QLA_FUNCTION_FAILED; } @@ -1640,12 +1308,18 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked) if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) { rval = mb[0] & MBS_MASK; - fw->ext_mem[cnt] = (mb[3] << 16) | mb[2]; + fw->ext_mem[cnt] = htonl((mb[3] << 16) | mb[2]); } else { rval = QLA_FUNCTION_FAILED; } } + if (rval == QLA_SUCCESS) { + eft = qla2xxx_copy_queues(ha, &fw->ext_mem[cnt]); + if (ha->eft) + memcpy(eft, ha->eft, ntohl(ha->fw_dump->eft_size)); + } + if (rval != QLA_SUCCESS) { qla_printk(KERN_WARNING, ha, "Failed to dump firmware (%x)!!!\n", rval); @@ -1654,7 +1328,7 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked) } else { qla_printk(KERN_INFO, ha, "Firmware dump saved to temp buffer (%ld/%p).\n", - ha->host_no, ha->fw_dump24); + ha->host_no, ha->fw_dump); ha->fw_dumped = 1; } @@ -1663,252 +1337,6 @@ qla24xx_fw_dump_failed: spin_unlock_irqrestore(&ha->hardware_lock, flags); } -void -qla24xx_ascii_fw_dump(scsi_qla_host_t *ha) -{ - uint32_t cnt; - char *uiter; - struct qla24xx_fw_dump *fw; - uint32_t ext_mem_cnt; - - uiter = ha->fw_dump_buffer; - fw = ha->fw_dump24; - - qla_uprintf(&uiter, "ISP FW Version %d.%02d.%02d Attributes %04x\n", - ha->fw_major_version, ha->fw_minor_version, - ha->fw_subminor_version, ha->fw_attributes); - - qla_uprintf(&uiter, "\nR2H Status Register\n%04x\n", fw->host_status); - - qla_uprintf(&uiter, "\nHost Interface Registers"); - for (cnt = 0; cnt < sizeof(fw->host_reg) / 4; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->host_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nShadow Registers"); - for (cnt = 0; cnt < sizeof(fw->shadow_reg) / 4; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->shadow_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nMailbox Registers"); - for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->mailbox_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nXSEQ GP Registers"); - for (cnt = 0; cnt < sizeof(fw->xseq_gp_reg) / 4; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->xseq_gp_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nXSEQ-0 Registers"); - for (cnt = 0; cnt < sizeof(fw->xseq_0_reg) / 4; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->xseq_0_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nXSEQ-1 Registers"); - for (cnt = 0; cnt < sizeof(fw->xseq_1_reg) / 4; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->xseq_1_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRSEQ GP Registers"); - for (cnt = 0; cnt < sizeof(fw->rseq_gp_reg) / 4; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->rseq_gp_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRSEQ-0 Registers"); - for (cnt = 0; cnt < sizeof(fw->rseq_0_reg) / 4; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->rseq_0_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRSEQ-1 Registers"); - for (cnt = 0; cnt < sizeof(fw->rseq_1_reg) / 4; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->rseq_1_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRSEQ-2 Registers"); - for (cnt = 0; cnt < sizeof(fw->rseq_2_reg) / 4; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->rseq_2_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nCommand DMA Registers"); - for (cnt = 0; cnt < sizeof(fw->cmd_dma_reg) / 4; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->cmd_dma_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRequest0 Queue DMA Channel Registers"); - for (cnt = 0; cnt < sizeof(fw->req0_dma_reg) / 4; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->req0_dma_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nResponse0 Queue DMA Channel Registers"); - for (cnt = 0; cnt < sizeof(fw->resp0_dma_reg) / 4; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->resp0_dma_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRequest1 Queue DMA Channel Registers"); - for (cnt = 0; cnt < sizeof(fw->req1_dma_reg) / 4; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->req1_dma_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nXMT0 Data DMA Registers"); - for (cnt = 0; cnt < sizeof(fw->xmt0_dma_reg) / 4; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->xmt0_dma_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nXMT1 Data DMA Registers"); - for (cnt = 0; cnt < sizeof(fw->xmt1_dma_reg) / 4; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->xmt1_dma_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nXMT2 Data DMA Registers"); - for (cnt = 0; cnt < sizeof(fw->xmt2_dma_reg) / 4; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->xmt2_dma_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nXMT3 Data DMA Registers"); - for (cnt = 0; cnt < sizeof(fw->xmt3_dma_reg) / 4; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->xmt3_dma_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nXMT4 Data DMA Registers"); - for (cnt = 0; cnt < sizeof(fw->xmt4_dma_reg) / 4; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->xmt4_dma_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nXMT Data DMA Common Registers"); - for (cnt = 0; cnt < sizeof(fw->xmt_data_dma_reg) / 4; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->xmt_data_dma_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRCV Thread 0 Data DMA Registers"); - for (cnt = 0; cnt < sizeof(fw->rcvt0_data_dma_reg) / 4; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->rcvt0_data_dma_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRCV Thread 1 Data DMA Registers"); - for (cnt = 0; cnt < sizeof(fw->rcvt1_data_dma_reg) / 4; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->rcvt1_data_dma_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nRISC GP Registers"); - for (cnt = 0; cnt < sizeof(fw->risc_gp_reg) / 4; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->risc_gp_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nLMC Registers"); - for (cnt = 0; cnt < sizeof(fw->lmc_reg) / 4; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->lmc_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nFPM Hardware Registers"); - for (cnt = 0; cnt < sizeof(fw->fpm_hdw_reg) / 4; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->fpm_hdw_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nFB Hardware Registers"); - for (cnt = 0; cnt < sizeof(fw->fb_hdw_reg) / 4; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->fb_hdw_reg[cnt]); - } - - qla_uprintf(&uiter, "\n\nCode RAM"); - for (cnt = 0; cnt < sizeof (fw->code_ram) / 4; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n%08x: ", cnt + 0x20000); - } - qla_uprintf(&uiter, "%08x ", fw->code_ram[cnt]); - } - - qla_uprintf(&uiter, "\n\nExternal Memory"); - ext_mem_cnt = ha->fw_memory_size - 0x100000 + 1; - for (cnt = 0; cnt < ext_mem_cnt; cnt++) { - if (cnt % 8 == 0) { - qla_uprintf(&uiter, "\n%08x: ", cnt + 0x100000); - } - qla_uprintf(&uiter, "%08x ", fw->ext_mem[cnt]); - } - - qla_uprintf(&uiter, "\n[<==END] ISP Debug Dump"); -} - - /****************************************************************************/ /* Driver Debug Functions. */ /****************************************************************************/ @@ -1995,7 +1423,6 @@ qla2x00_print_scsi_cmd(struct scsi_cmnd * cmd) return; printk(" sp flags=0x%x\n", sp->flags); - printk(" state=%d\n", sp->state); } void diff --git a/drivers/scsi/qla2xxx/qla_dbg.h b/drivers/scsi/qla2xxx/qla_dbg.h index ab6afeaa2..533425338 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.h +++ b/drivers/scsi/qla2xxx/qla_dbg.h @@ -37,134 +37,86 @@ /* * Macros use for debugging the driver. */ -#undef ENTER_TRACE -#if defined(ENTER_TRACE) -#define ENTER(x) do { printk("qla2100 : Entering %s()\n", x); } while (0) -#define LEAVE(x) do { printk("qla2100 : Leaving %s()\n", x); } while (0) -#define ENTER_INTR(x) do { printk("qla2100 : Entering %s()\n", x); } while (0) -#define LEAVE_INTR(x) do { printk("qla2100 : Leaving %s()\n", x); } while (0) -#else -#define ENTER(x) do {} while (0) -#define LEAVE(x) do {} while (0) -#define ENTER_INTR(x) do {} while (0) -#define LEAVE_INTR(x) do {} while (0) -#endif -#if DEBUG_QLA2100 -#define DEBUG(x) do {x;} while (0); -#else -#define DEBUG(x) do {} while (0); -#endif +#define DEBUG(x) do { if (extended_error_logging) { x; } } while (0) #if defined(QL_DEBUG_LEVEL_1) -#define DEBUG1(x) do {x;} while (0); +#define DEBUG1(x) do {x;} while (0) #else -#define DEBUG1(x) do {} while (0); +#define DEBUG1(x) do {} while (0) #endif -#if defined(QL_DEBUG_LEVEL_2) -#define DEBUG2(x) do {x;} while (0); -#define DEBUG2_3(x) do {x;} while (0); -#define DEBUG2_3_11(x) do {x;} while (0); -#define DEBUG2_9_10(x) do {x;} while (0); -#define DEBUG2_11(x) do {x;} while (0); -#define DEBUG2_13(x) do {x;} while (0); -#else -#define DEBUG2(x) do {} while (0); -#endif +#define DEBUG2(x) do { if (extended_error_logging) { x; } } while (0) +#define DEBUG2_3(x) do { if (extended_error_logging) { x; } } while (0) +#define DEBUG2_3_11(x) do { if (extended_error_logging) { x; } } while (0) +#define DEBUG2_9_10(x) do { if (extended_error_logging) { x; } } while (0) +#define DEBUG2_11(x) do { if (extended_error_logging) { x; } } while (0) +#define DEBUG2_13(x) do { if (extended_error_logging) { x; } } while (0) #if defined(QL_DEBUG_LEVEL_3) -#define DEBUG3(x) do {x;} while (0); -#define DEBUG2_3(x) do {x;} while (0); -#define DEBUG2_3_11(x) do {x;} while (0); -#define DEBUG3_11(x) do {x;} while (0); +#define DEBUG3(x) do {x;} while (0) +#define DEBUG3_11(x) do {x;} while (0) #else -#define DEBUG3(x) do {} while (0); - #if !defined(QL_DEBUG_LEVEL_2) - #define DEBUG2_3(x) do {} while (0); - #endif +#define DEBUG3(x) do {} while (0) #endif #if defined(QL_DEBUG_LEVEL_4) -#define DEBUG4(x) do {x;} while (0); +#define DEBUG4(x) do {x;} while (0) #else -#define DEBUG4(x) do {} while (0); +#define DEBUG4(x) do {} while (0) #endif #if defined(QL_DEBUG_LEVEL_5) -#define DEBUG5(x) do {x;} while (0); +#define DEBUG5(x) do {x;} while (0) #else -#define DEBUG5(x) do {} while (0); +#define DEBUG5(x) do {} while (0) #endif #if defined(QL_DEBUG_LEVEL_7) -#define DEBUG7(x) do {x;} while (0); +#define DEBUG7(x) do {x;} while (0) #else -#define DEBUG7(x) do {} while (0); +#define DEBUG7(x) do {} while (0) #endif #if defined(QL_DEBUG_LEVEL_9) -#define DEBUG9(x) do {x;} while (0); -#define DEBUG9_10(x) do {x;} while (0); -#define DEBUG2_9_10(x) do {x;} while (0); +#define DEBUG9(x) do {x;} while (0) +#define DEBUG9_10(x) do {x;} while (0) #else -#define DEBUG9(x) do {} while (0); +#define DEBUG9(x) do {} while (0) #endif #if defined(QL_DEBUG_LEVEL_10) -#define DEBUG10(x) do {x;} while (0); -#define DEBUG2_9_10(x) do {x;} while (0); -#define DEBUG9_10(x) do {x;} while (0); +#define DEBUG10(x) do {x;} while (0) +#define DEBUG9_10(x) do {x;} while (0) #else -#define DEBUG10(x) do {} while (0); - #if !defined(DEBUG2_9_10) - #define DEBUG2_9_10(x) do {} while (0); - #endif +#define DEBUG10(x) do {} while (0) #if !defined(DEBUG9_10) - #define DEBUG9_10(x) do {} while (0); + #define DEBUG9_10(x) do {} while (0) #endif #endif #if defined(QL_DEBUG_LEVEL_11) -#define DEBUG11(x) do{x;} while(0); -#if !defined(DEBUG2_11) -#define DEBUG2_11(x) do{x;} while(0); -#endif -#if !defined(DEBUG2_3_11) -#define DEBUG2_3_11(x) do{x;} while(0); -#endif +#define DEBUG11(x) do{x;} while(0) #if !defined(DEBUG3_11) -#define DEBUG3_11(x) do{x;} while(0); +#define DEBUG3_11(x) do{x;} while(0) #endif #else -#define DEBUG11(x) do{} while(0); - #if !defined(QL_DEBUG_LEVEL_2) - #define DEBUG2_11(x) do{} while(0); - #if !defined(QL_DEBUG_LEVEL_3) - #define DEBUG2_3_11(x) do{} while(0); - #endif - #endif +#define DEBUG11(x) do{} while(0) #if !defined(QL_DEBUG_LEVEL_3) - #define DEBUG3_11(x) do{} while(0); + #define DEBUG3_11(x) do{} while(0) #endif #endif #if defined(QL_DEBUG_LEVEL_12) -#define DEBUG12(x) do {x;} while (0); +#define DEBUG12(x) do {x;} while (0) #else -#define DEBUG12(x) do {} while (0); +#define DEBUG12(x) do {} while (0) #endif #if defined(QL_DEBUG_LEVEL_13) #define DEBUG13(x) do {x;} while (0) -#if !defined(DEBUG2_13) -#define DEBUG2_13(x) do {x;} while(0) -#endif #else #define DEBUG13(x) do {} while (0) -#if !defined(QL_DEBUG_LEVEL_2) -#define DEBUG2_13(x) do {} while(0) -#endif #endif #if defined(QL_DEBUG_LEVEL_14) @@ -176,9 +128,6 @@ /* * Firmware Dump structure definition */ -#define FW_DUMP_SIZE_128K 0xBC000 -#define FW_DUMP_SIZE_512K 0x2FC000 -#define FW_DUMP_SIZE_1M 0x5FC000 struct qla2300_fw_dump { uint16_t hccr; @@ -224,8 +173,6 @@ struct qla2100_fw_dump { uint16_t risc_ram[0xf000]; }; -#define FW_DUMP_SIZE_24XX 0x2B0000 - struct qla24xx_fw_dump { uint32_t host_status; uint32_t host_reg[32]; @@ -257,3 +204,39 @@ struct qla24xx_fw_dump { uint32_t code_ram[0x2000]; uint32_t ext_mem[1]; }; + +#define EFT_NUM_BUFFERS 4 +#define EFT_BYTES_PER_BUFFER 0x4000 +#define EFT_SIZE ((EFT_BYTES_PER_BUFFER) * (EFT_NUM_BUFFERS)) + +struct qla2xxx_fw_dump { + uint8_t signature[4]; + uint32_t version; + + uint32_t fw_major_version; + uint32_t fw_minor_version; + uint32_t fw_subminor_version; + uint32_t fw_attributes; + + uint32_t vendor; + uint32_t device; + uint32_t subsystem_vendor; + uint32_t subsystem_device; + + uint32_t fixed_size; + uint32_t mem_size; + uint32_t req_q_size; + uint32_t rsp_q_size; + + uint32_t eft_size; + uint32_t eft_addr_l; + uint32_t eft_addr_h; + + uint32_t header_size; + + union { + struct qla2100_fw_dump isp21; + struct qla2300_fw_dump isp23; + struct qla24xx_fw_dump isp24; + } isp; +}; diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index 53508f3c4..0930260ae 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h @@ -31,6 +31,8 @@ #include #include +#define QLA2XXX_DRIVER_NAME "qla2xxx" + /* * We have MAILBOX_REGISTER_COUNT sized arrays in a few places, * but that's fine as we don't look at the last 24 ones for @@ -189,22 +191,13 @@ typedef struct srb { struct scsi_cmnd *cmd; /* Linux SCSI command pkt */ - struct timer_list timer; /* Command timer */ - atomic_t ref_count; /* Reference count for this structure */ uint16_t flags; - /* Request state */ - uint16_t state; - /* Single transfer DMA context */ dma_addr_t dma_handle; uint32_t request_sense_length; uint8_t *request_sense_ptr; - - /* SRB magic number */ - uint16_t magic; -#define SRB_MAGIC 0x10CB } srb_t; /* @@ -225,21 +218,6 @@ typedef struct srb { #define SRB_IOCTL BIT_10 /* IOCTL command. */ #define SRB_TAPE BIT_11 /* FCP2 (Tape) command. */ -/* - * SRB state definitions - */ -#define SRB_FREE_STATE 0 /* returned back */ -#define SRB_PENDING_STATE 1 /* queued in LUN Q */ -#define SRB_ACTIVE_STATE 2 /* in Active Array */ -#define SRB_DONE_STATE 3 /* queued in Done Queue */ -#define SRB_RETRY_STATE 4 /* in Retry Queue */ -#define SRB_SUSPENDED_STATE 5 /* in suspended state */ -#define SRB_NO_QUEUE_STATE 6 /* is in between states */ -#define SRB_ACTIVE_TIMEOUT_STATE 7 /* in Active Array but timed out */ -#define SRB_FAILOVER_STATE 8 /* in Failover Queue */ -#define SRB_SCSI_RETRY_STATE 9 /* in Scsi Retry Queue */ - - /* * ISP I/O Register Set structure definitions. */ @@ -270,6 +248,8 @@ struct device_reg_2xxx { #define NVR_SELECT BIT_1 #define NVR_CLOCK BIT_0 +#define NVR_WAIT_CNT 20000 + union { struct { uint16_t mailbox0; @@ -507,6 +487,7 @@ typedef struct { #define MBA_IP_RCV_BUFFER_EMPTY 0x8026 /* IP receive buffer queue empty. */ #define MBA_IP_HDR_DATA_SPLIT 0x8027 /* IP header/data splitting feature */ /* used. */ +#define MBA_TRACE_NOTIFICATION 0x8028 /* Trace/Diagnostic notification. */ #define MBA_POINT_TO_POINT 0x8030 /* Point to point mode. */ #define MBA_CMPLT_1_16BIT 0x8031 /* Completion 1 16bit IOSB. */ #define MBA_CMPLT_2_16BIT 0x8032 /* Completion 2 16bit IOSB. */ @@ -628,7 +609,9 @@ typedef struct { #define MBC_SERDES_PARAMS 0x10 /* Serdes Tx Parameters. */ #define MBC_GET_IOCB_STATUS 0x12 /* Get IOCB status command. */ #define MBC_GET_TIMEOUT_PARAMS 0x22 /* Get FW timeouts. */ +#define MBC_TRACE_CONTROL 0x27 /* Trace control command. */ #define MBC_GEN_SYSTEM_ERROR 0x2a /* Generate System Error. */ +#define MBC_READ_SFP 0x31 /* Read SFP Data. */ #define MBC_SET_TIMEOUT_PARAMS 0x32 /* Set FW timeouts. */ #define MBC_MID_INITIALIZE_FIRMWARE 0x48 /* MID Initialize firmware. */ #define MBC_MID_GET_VP_DATABASE 0x49 /* MID Get VP Database. */ @@ -638,6 +621,9 @@ typedef struct { #define MBC_GET_LINK_PRIV_STATS 0x6d /* Get link & private data. */ #define MBC_SET_VENDOR_ID 0x76 /* Set Vendor ID. */ +#define TC_ENABLE 4 +#define TC_DISABLE 5 + /* Firmware return data sizes */ #define FCAL_MAP_SIZE 128 @@ -1513,62 +1499,6 @@ typedef struct { uint8_t port_name[WWN_SIZE]; } sw_info_t; -/* - * Inquiry command structure. - */ -#define INQ_DATA_SIZE 36 - -/* - * Inquiry mailbox IOCB packet definition. - */ -typedef struct { - union { - cmd_a64_entry_t cmd; - sts_entry_t rsp; - struct cmd_type_7 cmd24; - struct sts_entry_24xx rsp24; - } p; - uint8_t inq[INQ_DATA_SIZE]; -} inq_cmd_rsp_t; - -/* - * Report LUN command structure. - */ -#define CHAR_TO_SHORT(a, b) (uint16_t)((uint8_t)b << 8 | (uint8_t)a) - -typedef struct { - uint32_t len; - uint32_t rsrv; -} rpt_hdr_t; - -typedef struct { - struct { - uint8_t b : 6; - uint8_t address_method : 2; - } msb; - uint8_t lsb; - uint8_t unused[6]; -} rpt_lun_t; - -typedef struct { - rpt_hdr_t hdr; - rpt_lun_t lst[MAX_LUNS]; -} rpt_lun_lst_t; - -/* - * Report Lun mailbox IOCB packet definition. - */ -typedef struct { - union { - cmd_a64_entry_t cmd; - sts_entry_t rsp; - struct cmd_type_7 cmd24; - struct sts_entry_24xx rsp24; - } p; - rpt_lun_lst_t list; -} rpt_lun_cmd_rsp_t; - - /* * Fibre channel port type. */ @@ -1587,7 +1517,6 @@ typedef struct { typedef struct fc_port { struct list_head list; struct scsi_qla_host *ha; - struct scsi_qla_host *vis_ha; /* only used when suspending lun */ uint8_t node_name[WWN_SIZE]; uint8_t port_name[WWN_SIZE]; @@ -1602,23 +1531,13 @@ typedef struct fc_port { unsigned int os_target_id; - uint16_t iodesc_idx_sent; - int port_login_retry_count; int login_retry; atomic_t port_down_timer; - uint8_t device_type; - uint8_t unused; - - uint8_t mp_byte; /* multi-path byte (not used) */ - uint8_t cur_path; /* current path id */ - spinlock_t rport_lock; struct fc_rport *rport, *drport; u32 supported_classes; - struct work_struct rport_add_work; - struct work_struct rport_del_work; } fc_port_t; /* @@ -2027,54 +1946,6 @@ struct sns_cmd_pkt { } p; }; -/* IO descriptors */ -#define MAX_IO_DESCRIPTORS 32 - -#define ABORT_IOCB_CB 0 -#define ADISC_PORT_IOCB_CB 1 -#define LOGOUT_PORT_IOCB_CB 2 -#define LOGIN_PORT_IOCB_CB 3 -#define LAST_IOCB_CB 4 - -#define IODESC_INVALID_INDEX 0xFFFF -#define IODESC_ADISC_NEEDED 0xFFFE -#define IODESC_LOGIN_NEEDED 0xFFFD - -struct io_descriptor { - uint16_t used:1; - uint16_t idx:11; - uint16_t cb_idx:4; - - struct timer_list timer; - - struct scsi_qla_host *ha; - - port_id_t d_id; - fc_port_t *remote_fcport; - - uint32_t signature; -}; - -struct qla_fw_info { - unsigned short addressing; /* addressing method used to load fw */ -#define FW_INFO_ADDR_NORMAL 0 -#define FW_INFO_ADDR_EXTENDED 1 -#define FW_INFO_ADDR_NOMORE 0xffff - unsigned short *fwcode; /* pointer to FW array */ - unsigned short *fwlen; /* number of words in array */ - unsigned short *fwstart; /* start address for F/W */ - unsigned long *lfwstart; /* start address (long) for F/W */ -}; - -struct qla_board_info { - char *drv_name; - - char isp_name[8]; - struct qla_fw_info *fw_info; - char *fw_fname; - struct scsi_host_template *sht; -}; - struct fw_blob { char *name; uint32_t segs[4]; @@ -2132,7 +2003,6 @@ struct isp_operations { uint32_t); void (*fw_dump) (struct scsi_qla_host *, int); - void (*ascii_fw_dump) (struct scsi_qla_host *); int (*beacon_on) (struct scsi_qla_host *); int (*beacon_off) (struct scsi_qla_host *); @@ -2176,6 +2046,7 @@ typedef struct scsi_qla_host { uint32_t enable_led_scheme :1; uint32_t msi_enabled :1; uint32_t msix_enabled :1; + uint32_t disable_serdes :1; } flags; atomic_t loop_state; @@ -2269,7 +2140,7 @@ typedef struct scsi_qla_host { mempool_t *srb_mempool; /* This spinlock is used to protect "io transactions", you must - * aquire it before doing any IO to the card, eg with RD_REG*() and + * acquire it before doing any IO to the card, eg with RD_REG*() and * WRT_REG*() for the duration of your entire commandtransaction. * * This spinlock is of lower priority than the io request lock. @@ -2303,9 +2174,6 @@ typedef struct scsi_qla_host { uint32_t current_outstanding_cmd; srb_t *status_srb; /* Status continuation entry. */ - uint16_t revision; - uint8_t ports; - /* ISP configuration data. */ uint16_t loop_id; /* Host adapter loop id */ uint16_t fb_rev; @@ -2361,10 +2229,6 @@ typedef struct scsi_qla_host { /* Fibre Channel Device List. */ struct list_head fcports; - struct list_head rscn_fcports; - - struct io_descriptor io_descriptors[MAX_IO_DESCRIPTORS]; - uint16_t iodesc_signature; /* RSCN queue. */ uint32_t rscn_queue[MAX_RSCN_COUNT]; @@ -2380,6 +2244,11 @@ typedef struct scsi_qla_host { struct sns_cmd_pkt *sns_cmd; dma_addr_t sns_cmd_dma; +#define SFP_DEV_SIZE 256 +#define SFP_BLOCK_SIZE 64 + void *sfp_data; + dma_addr_t sfp_data_dma; + struct task_struct *dpc_thread; uint8_t dpc_active; /* DPC routine is active */ @@ -2395,9 +2264,6 @@ typedef struct scsi_qla_host { struct gid_list_info *gid_list; int gid_list_info_size; - dma_addr_t rlc_rsp_dma; - rpt_lun_cmd_rsp_t *rlc_rsp; - /* Small DMA pool allocations -- maximum 256 bytes in length. */ #define DMA_POOL_SIZE 256 struct dma_pool *s_dma_pool; @@ -2406,9 +2272,6 @@ typedef struct scsi_qla_host { init_cb_t *init_cb; int init_cb_size; - dma_addr_t iodesc_pd_dma; - port_database_t *iodesc_pd; - /* These are used by mailbox operations. */ volatile uint16_t mailbox_out[MAILBOX_REGISTER_COUNT]; @@ -2435,28 +2298,28 @@ typedef struct scsi_qla_host { mbx_cmd_t mc; /* Basic firmware related information. */ - struct qla_board_info *brd_info; uint16_t fw_major_version; uint16_t fw_minor_version; uint16_t fw_subminor_version; uint16_t fw_attributes; uint32_t fw_memory_size; uint32_t fw_transfer_size; + uint32_t fw_srisc_address; +#define RISC_START_ADDRESS_2100 0x1000 +#define RISC_START_ADDRESS_2300 0x800 +#define RISC_START_ADDRESS_2400 0x100000 uint16_t fw_options[16]; /* slots: 1,2,3,10,11 */ uint8_t fw_seriallink_options[4]; uint16_t fw_seriallink_options24[4]; /* Firmware dump information. */ - void *fw_dump; - int fw_dump_order; - int fw_dump_reading; - char *fw_dump_buffer; - int fw_dump_buffer_len; - + struct qla2xxx_fw_dump *fw_dump; + uint32_t fw_dump_len; int fw_dumped; - void *fw_dump24; - int fw_dump24_len; + int fw_dump_reading; + dma_addr_t eft_dma; + void *eft; uint8_t host_str[16]; uint32_t pci_attr; @@ -2503,8 +2366,6 @@ typedef struct scsi_qla_host { test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags) || \ atomic_read(&ha->loop_state) == LOOP_DOWN) -#define TGT_Q(ha, t) (ha->otgt[t]) - #define to_qla_host(x) ((scsi_qla_host_t *) (x)->hostdata) #define qla_printk(level, ha, format, arg...) \ @@ -2537,19 +2398,6 @@ typedef struct scsi_qla_host { #define QLA_RSCNS_HANDLED 0x108 #define QLA_ALREADY_REGISTERED 0x109 -/* -* Stat info for all adpaters -*/ -struct _qla2x00stats { - unsigned long mboxtout; /* mailbox timeouts */ - unsigned long mboxerr; /* mailbox errors */ - unsigned long ispAbort; /* ISP aborts */ - unsigned long debugNo; - unsigned long loop_resync; - unsigned long outarray_full; - unsigned long retry_q_cnt; -}; - #define NVRAM_DELAY() udelay(10) #define INVALID_HANDLE (MAX_OUTSTANDING_COMMANDS+1) @@ -2565,12 +2413,6 @@ struct _qla2x00stats { #include "qla_dbg.h" #include "qla_inline.h" -/* -* String arrays -*/ -#define LINESIZE 256 -#define MAXARGS 26 - #define CMD_SP(Cmnd) ((Cmnd)->SCp.ptr) #define CMD_COMPL_STATUS(Cmnd) ((Cmnd)->SCp.this_residual) #define CMD_RESID_LEN(Cmnd) ((Cmnd)->SCp.buffers_residual) diff --git a/drivers/scsi/qla2xxx/qla_devtbl.h b/drivers/scsi/qla2xxx/qla_devtbl.h index a8fc0ffc7..dd435410d 100644 --- a/drivers/scsi/qla2xxx/qla_devtbl.h +++ b/drivers/scsi/qla2xxx/qla_devtbl.h @@ -1,4 +1,4 @@ -#define QLA_MODEL_NAMES 0x4A +#define QLA_MODEL_NAMES 0x57 /* * Adapter model names and descriptions. @@ -76,6 +76,19 @@ static char *qla2x00_model_name[QLA_MODEL_NAMES*2] = { "QLE2440", "PCI-Express to 4Gb FC, Single Channel", /* 0x145 */ "QLE2464", "PCI-Express to 4Gb FC, Quad Channel", /* 0x146 */ "QLA2440", "PCI-X 2.0 to 4Gb FC, Single Channel", /* 0x147 */ - " ", " ", /* 0x148 */ + "HP AE369A", "PCI-X 2.0 to 4Gb FC, Dual Channel", /* 0x148 */ "QLA2340", "Sun 133MHz PCI-X to 2Gb FC, Single Channel", /* 0x149 */ + " ", " ", /* 0x14a */ + " ", " ", /* 0x14b */ + "QMC2432M", "IBM eServer BC 4Gb FC Expansion Card CFFE", /* 0x14c */ + "QMC2422M", "IBM eServer BC 4Gb FC Expansion Card CFFX", /* 0x14d */ + "QLE220", "Sun PCI-Express to 4Gb FC, Single Channel", /* 0x14e */ + " ", " ", /* 0x14f */ + " ", " ", /* 0x150 */ + " ", " ", /* 0x151 */ + "QME2462", "PCI-Express to 4Gb FC, Dual Channel Mezz HBA", /* 0x152 */ + "QMH2462", "PCI-Express to 4Gb FC, Dual Channel Mezz HBA", /* 0x153 */ + " ", " ", /* 0x154 */ + "QLE220", "PCI-Express to 4Gb FC, Single Channel", /* 0x155 */ + "QLE220", "PCI-Express to 4Gb FC, Single Channel", /* 0x156 */ }; diff --git a/drivers/scsi/qla2xxx/qla_fw.h b/drivers/scsi/qla2xxx/qla_fw.h index 1ee58ad2f..a0a722cf4 100644 --- a/drivers/scsi/qla2xxx/qla_fw.h +++ b/drivers/scsi/qla2xxx/qla_fw.h @@ -7,7 +7,6 @@ #ifndef __QLA_FW_H #define __QLA_FW_H -#define RISC_SADDRESS 0x100000 #define MBS_CHECKSUM_ERROR 0x4010 /* @@ -142,7 +141,7 @@ struct nvram_24xx { * BIT 2 = Enable Memory Map BIOS * BIT 3 = Enable Selectable Boot * BIT 4 = Disable RISC code load - * BIT 5 = + * BIT 5 = Disable Serdes * BIT 6 = * BIT 7 = * @@ -279,7 +278,7 @@ struct init_cb_24xx { uint16_t response_q_length; uint16_t request_q_length; - uint16_t link_down_timeout; /* Milliseconds. */ + uint16_t link_down_on_nos; /* Milliseconds. */ uint16_t prio_request_q_length; @@ -463,7 +462,7 @@ struct sts_entry_24xx { uint16_t comp_status; /* Completion status. */ uint16_t ox_id; /* OX_ID used by the firmware. */ - uint32_t residual_len; /* Residual transfer length. */ + uint32_t residual_len; /* FW calc residual transfer length. */ uint16_t reserved_1; uint16_t state_flags; /* State flags. */ diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h index 91e83e2c1..8311ac2b9 100644 --- a/drivers/scsi/qla2xxx/qla_gbl.h +++ b/drivers/scsi/qla2xxx/qla_gbl.h @@ -9,9 +9,6 @@ #include -extern void qla2x00_remove_one(struct pci_dev *); -extern int qla2x00_probe_one(struct pci_dev *, struct qla_board_info *); - /* * Global Function Prototypes in qla_init.c source file. */ @@ -34,13 +31,9 @@ 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 fc_port_t *qla2x00_alloc_fcport(scsi_qla_host_t *, gfp_t); extern int qla2x00_loop_resync(scsi_qla_host_t *); -extern int qla2x00_find_new_loop_id(scsi_qla_host_t *, fc_port_t *); extern int qla2x00_fabric_login(scsi_qla_host_t *, fc_port_t *, uint16_t *); extern int qla2x00_local_device_login(scsi_qla_host_t *, fc_port_t *); @@ -54,6 +47,8 @@ extern int qla2x00_abort_isp(scsi_qla_host_t *); extern void qla2x00_update_fcport(scsi_qla_host_t *, fc_port_t *); extern void qla2x00_reg_remote_port(scsi_qla_host_t *, fc_port_t *); +extern void qla2x00_alloc_fw_dump(scsi_qla_host_t *); + /* * Global Data in qla_os.c source file. */ @@ -64,14 +59,13 @@ extern int qlport_down_retry; extern int ql2xplogiabsentdevice; extern int ql2xloginretrycount; extern int ql2xfdmienable; -extern int ql2xprocessrscn; +extern int ql2xallocfwdump; +extern int extended_error_logging; extern void qla2x00_sp_compl(scsi_qla_host_t *, srb_t *); extern char *qla2x00_get_fw_version_str(struct scsi_qla_host *, char *); -extern void qla2x00_cmd_timeout(srb_t *); - extern void qla2x00_mark_device_lost(scsi_qla_host_t *, fc_port_t *, int, int); extern void qla2x00_mark_all_devices_lost(scsi_qla_host_t *, int); @@ -86,8 +80,6 @@ extern void qla2xxx_wake_dpc(scsi_qla_host_t *); /* * Global Function Prototypes in qla_iocb.c source file. */ -extern void qla2x00_isp_cmd(scsi_qla_host_t *); - extern uint16_t qla2x00_calc_iocbs_32(uint16_t); extern uint16_t qla2x00_calc_iocbs_64(uint16_t); extern void qla2x00_build_scsi_iocbs_32(srb_t *, cmd_entry_t *, uint16_t); @@ -210,6 +202,12 @@ qla2x00_set_serdes_params(scsi_qla_host_t *, uint16_t, uint16_t, uint16_t); extern int qla2x00_stop_firmware(scsi_qla_host_t *); +extern int +qla2x00_trace_control(scsi_qla_host_t *, uint16_t, dma_addr_t, uint16_t); + +extern int +qla2x00_read_sfp(scsi_qla_host_t *, dma_addr_t, uint16_t, uint16_t, uint16_t); + /* * Global Function Prototypes in qla_isr.c source file. */ @@ -260,9 +258,6 @@ extern int qla24xx_write_optrom_data(struct scsi_qla_host *, uint8_t *, extern void qla2100_fw_dump(scsi_qla_host_t *, int); extern void qla2300_fw_dump(scsi_qla_host_t *, int); extern void qla24xx_fw_dump(scsi_qla_host_t *, int); -extern void qla2100_ascii_fw_dump(scsi_qla_host_t *); -extern void qla2300_ascii_fw_dump(scsi_qla_host_t *); -extern void qla24xx_ascii_fw_dump(scsi_qla_host_t *); extern void qla2x00_dump_regs(scsi_qla_host_t *); extern void qla2x00_dump_buffer(uint8_t *, uint32_t); extern void qla2x00_print_scsi_cmd(struct scsi_cmnd *); @@ -285,22 +280,6 @@ extern void *qla2x00_prep_ms_fdmi_iocb(scsi_qla_host_t *, uint32_t, uint32_t); extern void *qla24xx_prep_ms_fdmi_iocb(scsi_qla_host_t *, uint32_t, uint32_t); extern int qla2x00_fdmi_register(scsi_qla_host_t *); -/* - * Global Function Prototypes in qla_rscn.c source file. - */ -extern fc_port_t *qla2x00_alloc_rscn_fcport(scsi_qla_host_t *, gfp_t); -extern int qla2x00_handle_port_rscn(scsi_qla_host_t *, uint32_t, fc_port_t *, - int); -extern void qla2x00_process_iodesc(scsi_qla_host_t *, struct mbx_entry *); -extern void qla2x00_cancel_io_descriptors(scsi_qla_host_t *); - -/* - * Global Function Prototypes in qla_xioctl.c source file. - */ -#define qla2x00_enqueue_aen(ha, cmd, mode) do { } while (0) -#define qla2x00_alloc_ioctl_mem(ha) (0) -#define qla2x00_free_ioctl_mem(ha) do { } while (0) - /* * Global Function Prototypes in qla_attr.c source file. */ diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 89a3fc059..859649160 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c @@ -39,6 +39,8 @@ static int qla2x00_fabric_dev_login(scsi_qla_host_t *, fc_port_t *, static int qla2x00_restart_isp(scsi_qla_host_t *); +static int qla2x00_find_new_loop_id(scsi_qla_host_t *ha, fc_port_t *dev); + /****************************************************************************/ /* QLogic ISP2x00 Hardware Support Functions. */ /****************************************************************************/ @@ -89,6 +91,17 @@ qla2x00_initialize_adapter(scsi_qla_host_t *ha) ha->isp_ops.nvram_config(ha); + if (ha->flags.disable_serdes) { + /* Mask HBA via NVRAM settings? */ + qla_printk(KERN_INFO, ha, "Masking HBA WWPN " + "%02x%02x%02x%02x%02x%02x%02x%02x (via NVRAM).\n", + ha->port_name[0], ha->port_name[1], + ha->port_name[2], ha->port_name[3], + ha->port_name[4], ha->port_name[5], + ha->port_name[6], ha->port_name[7]); + return QLA_FUNCTION_FAILED; + } + qla_printk(KERN_INFO, ha, "Verifying loaded RISC code...\n"); retry = 10; @@ -194,7 +207,6 @@ qla2100_pci_config(scsi_qla_host_t *ha) mwi = 0; if (pci_set_mwi(ha->pdev)) mwi = PCI_COMMAND_INVALIDATE; - pci_read_config_word(ha->pdev, PCI_REVISION_ID, &ha->revision); pci_read_config_word(ha->pdev, PCI_COMMAND, &w); w |= mwi | (PCI_COMMAND_PARITY | PCI_COMMAND_SERR); @@ -232,7 +244,6 @@ qla2300_pci_config(scsi_qla_host_t *ha) mwi = 0; if (pci_set_mwi(ha->pdev)) mwi = PCI_COMMAND_INVALIDATE; - pci_read_config_word(ha->pdev, PCI_REVISION_ID, &ha->revision); pci_read_config_word(ha->pdev, PCI_COMMAND, &w); w |= mwi | (PCI_COMMAND_PARITY | PCI_COMMAND_SERR); @@ -320,7 +331,6 @@ qla24xx_pci_config(scsi_qla_host_t *ha) mwi = 0; if (pci_set_mwi(ha->pdev)) mwi = PCI_COMMAND_INVALIDATE; - pci_read_config_word(ha->pdev, PCI_REVISION_ID, &ha->revision); pci_read_config_word(ha->pdev, PCI_COMMAND, &w); w |= mwi | (PCI_COMMAND_PARITY | PCI_COMMAND_SERR); @@ -386,9 +396,7 @@ qla2x00_isp_firmware(scsi_qla_host_t *ha) qla_printk(KERN_INFO, ha, "RISC CODE NOT loaded\n"); /* Verify checksum of loaded RISC code. */ - rval = qla2x00_verify_checksum(ha, - IS_QLA24XX(ha) || IS_QLA54XX(ha) ? RISC_SADDRESS : - *ha->brd_info->fw_info[0].fwstart); + rval = qla2x00_verify_checksum(ha, ha->fw_srisc_address); } if (rval) { @@ -411,7 +419,6 @@ qla2x00_reset_chip(scsi_qla_host_t *ha) unsigned long flags = 0; struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; uint32_t cnt; - unsigned long mbx_flags = 0; uint16_t cmd; ha->isp_ops.disable_intrs(ha); @@ -519,20 +526,8 @@ qla2x00_reset_chip(scsi_qla_host_t *ha) if (IS_QLA2100(ha) || IS_QLA2200(ha) || IS_QLA2300(ha)) { for (cnt = 0; cnt < 30000; cnt++) { - if (!(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags))) - spin_lock_irqsave(&ha->mbx_reg_lock, mbx_flags); - - if (RD_MAILBOX_REG(ha, reg, 0) != MBS_BUSY) { - if (!(test_bit(ABORT_ISP_ACTIVE, - &ha->dpc_flags))) - spin_unlock_irqrestore( - &ha->mbx_reg_lock, mbx_flags); + if (RD_MAILBOX_REG(ha, reg, 0) != MBS_BUSY) break; - } - - if (!(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags))) - spin_unlock_irqrestore(&ha->mbx_reg_lock, - mbx_flags); udelay(100); } @@ -788,19 +783,104 @@ qla24xx_chip_diag(scsi_qla_host_t *ha) return rval; } -static void +void qla2x00_alloc_fw_dump(scsi_qla_host_t *ha) { + int rval; + uint32_t dump_size, fixed_size, mem_size, req_q_size, rsp_q_size, + eft_size; + dma_addr_t eft_dma; + void *eft; + + if (ha->fw_dump) { + qla_printk(KERN_WARNING, ha, + "Firmware dump previously allocated.\n"); + return; + } + ha->fw_dumped = 0; - ha->fw_dump24_len = sizeof(struct qla24xx_fw_dump); - ha->fw_dump24_len += (ha->fw_memory_size - 0x100000) * sizeof(uint32_t); - ha->fw_dump24 = vmalloc(ha->fw_dump24_len); - if (ha->fw_dump24) - qla_printk(KERN_INFO, ha, "Allocated (%d KB) for firmware " - "dump...\n", ha->fw_dump24_len / 1024); - else + fixed_size = mem_size = eft_size = 0; + if (IS_QLA2100(ha) || IS_QLA2200(ha)) { + fixed_size = sizeof(struct qla2100_fw_dump); + } else if (IS_QLA23XX(ha)) { + fixed_size = offsetof(struct qla2300_fw_dump, data_ram); + mem_size = (ha->fw_memory_size - 0x11000 + 1) * + sizeof(uint16_t); + } else if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + fixed_size = offsetof(struct qla24xx_fw_dump, ext_mem); + mem_size = (ha->fw_memory_size - 0x100000 + 1) * + sizeof(uint32_t); + + /* Allocate memory for Extended Trace Buffer. */ + eft = dma_alloc_coherent(&ha->pdev->dev, EFT_SIZE, &eft_dma, + GFP_KERNEL); + if (!eft) { + qla_printk(KERN_WARNING, ha, "Unable to allocate " + "(%d KB) for EFT.\n", EFT_SIZE / 1024); + goto cont_alloc; + } + + rval = qla2x00_trace_control(ha, TC_ENABLE, eft_dma, + EFT_NUM_BUFFERS); + if (rval) { + qla_printk(KERN_WARNING, ha, "Unable to initialize " + "EFT (%d).\n", rval); + dma_free_coherent(&ha->pdev->dev, EFT_SIZE, eft, + eft_dma); + goto cont_alloc; + } + + qla_printk(KERN_INFO, ha, "Allocated (%d KB) for EFT...\n", + EFT_SIZE / 1024); + + eft_size = EFT_SIZE; + memset(eft, 0, eft_size); + ha->eft_dma = eft_dma; + ha->eft = eft; + } +cont_alloc: + req_q_size = ha->request_q_length * sizeof(request_t); + rsp_q_size = ha->response_q_length * sizeof(response_t); + + dump_size = offsetof(struct qla2xxx_fw_dump, isp); + dump_size += fixed_size + mem_size + req_q_size + rsp_q_size + + eft_size; + + ha->fw_dump = vmalloc(dump_size); + if (!ha->fw_dump) { qla_printk(KERN_WARNING, ha, "Unable to allocate (%d KB) for " - "firmware dump!!!\n", ha->fw_dump24_len / 1024); + "firmware dump!!!\n", dump_size / 1024); + + if (ha->eft) { + dma_free_coherent(&ha->pdev->dev, eft_size, ha->eft, + ha->eft_dma); + ha->eft = NULL; + ha->eft_dma = 0; + } + return; + } + + qla_printk(KERN_INFO, ha, "Allocated (%d KB) for firmware dump...\n", + dump_size / 1024); + + ha->fw_dump_len = dump_size; + ha->fw_dump->signature[0] = 'Q'; + ha->fw_dump->signature[1] = 'L'; + ha->fw_dump->signature[2] = 'G'; + ha->fw_dump->signature[3] = 'C'; + ha->fw_dump->version = __constant_htonl(1); + + ha->fw_dump->fixed_size = htonl(fixed_size); + ha->fw_dump->mem_size = htonl(mem_size); + ha->fw_dump->req_q_size = htonl(req_q_size); + ha->fw_dump->rsp_q_size = htonl(rsp_q_size); + + ha->fw_dump->eft_size = htonl(eft_size); + ha->fw_dump->eft_addr_l = htonl(LSD(ha->eft_dma)); + ha->fw_dump->eft_addr_h = htonl(MSD(ha->eft_dma)); + + ha->fw_dump->header_size = + htonl(offsetof(struct qla2xxx_fw_dump, isp)); } /** @@ -822,9 +902,6 @@ qla2x00_resize_request_q(scsi_qla_host_t *ha) if (IS_QLA2100(ha) || IS_QLA2200(ha)) return; - if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) - qla2x00_alloc_fw_dump(ha); - /* Retrieve IOCB counts available to the firmware. */ rval = qla2x00_get_resource_cnts(ha, NULL, NULL, NULL, &fw_iocb_cnt); if (rval) @@ -892,6 +969,9 @@ qla2x00_setup_chip(scsi_qla_host_t *ha) &ha->fw_subminor_version, &ha->fw_attributes, &ha->fw_memory_size); qla2x00_resize_request_q(ha); + + if (ql2xallocfwdump) + qla2x00_alloc_fw_dump(ha); } } else { DEBUG2(printk(KERN_INFO @@ -1195,8 +1275,7 @@ qla2x00_fw_ready(scsi_qla_host_t *ha) rval = QLA_FUNCTION_FAILED; if (atomic_read(&ha->loop_down_timer) && - (fw_state >= FSTATE_LOSS_OF_SYNC || - fw_state == FSTATE_WAIT_AL_PA)) { + fw_state != FSTATE_READY) { /* Loop down. Timeout on min_wait for states * other than Wait for Login. */ @@ -1545,6 +1624,12 @@ qla2x00_nvram_config(scsi_qla_host_t *ha) while (cnt--) *dptr1++ = *dptr2++; + /* Use alternate WWN? */ + if (nv->host_p[1] & BIT_7) { + memcpy(icb->node_name, nv->alternate_node_name, WWN_SIZE); + memcpy(icb->port_name, nv->alternate_port_name, WWN_SIZE); + } + /* Prepare nodename */ if ((icb->firmware_options[1] & BIT_6) == 0) { /* @@ -1558,6 +1643,8 @@ qla2x00_nvram_config(scsi_qla_host_t *ha) /* * Set host adapter parameters. */ + if (nv->host_p[0] & BIT_7) + extended_error_logging = 1; ha->flags.disable_risc_code_load = ((nv->host_p[0] & BIT_4) ? 1 : 0); /* Always load RISC code on non ISP2[12]00 chips. */ if (!IS_QLA2100(ha) && !IS_QLA2200(ha)) @@ -1566,6 +1653,7 @@ qla2x00_nvram_config(scsi_qla_host_t *ha) ha->flags.enable_lip_full_login = ((nv->host_p[1] & BIT_2) ? 1 : 0); ha->flags.enable_target_reset = ((nv->host_p[1] & BIT_3) ? 1 : 0); ha->flags.enable_led_scheme = (nv->special_options[1] & BIT_4) ? 1 : 0; + ha->flags.disable_serdes = 0; ha->operating_mode = (icb->add_firmware_options[0] & (BIT_6 | BIT_5 | BIT_4)) >> 4; @@ -1681,14 +1769,6 @@ qla2x00_nvram_config(scsi_qla_host_t *ha) return (rval); } -static void -qla2x00_rport_add(void *data) -{ - fc_port_t *fcport = data; - - qla2x00_reg_remote_port(fcport->ha, fcport); -} - static void qla2x00_rport_del(void *data) { @@ -1712,7 +1792,7 @@ qla2x00_rport_del(void *data) * * Returns a pointer to the allocated fcport, or NULL, if none available. */ -fc_port_t * +static fc_port_t * qla2x00_alloc_fcport(scsi_qla_host_t *ha, gfp_t flags) { fc_port_t *fcport; @@ -1726,13 +1806,10 @@ qla2x00_alloc_fcport(scsi_qla_host_t *ha, gfp_t flags) fcport->ha = ha; fcport->port_type = FCT_UNKNOWN; fcport->loop_id = FC_NO_LOOP_ID; - fcport->iodesc_idx_sent = IODESC_INVALID_INDEX; atomic_set(&fcport->state, FCS_UNCONFIGURED); fcport->flags = FCF_RLC_SUPPORT; fcport->supported_classes = FC_COS_UNSPECIFIED; spin_lock_init(&fcport->rport_lock); - INIT_WORK(&fcport->rport_add_work, qla2x00_rport_add, fcport); - INIT_WORK(&fcport->rport_del_work, qla2x00_rport_del, fcport); return (fcport); } @@ -1792,6 +1869,9 @@ qla2x00_configure_loop(scsi_qla_host_t *ha) set_bit(RSCN_UPDATE, &flags); clear_bit(LOCAL_LOOP_UPDATE, &flags); + } else if (ha->current_topology == ISP_CFG_N) { + clear_bit(RSCN_UPDATE, &flags); + } else if (!ha->flags.online || (test_bit(ABORT_ISP_ACTIVE, &flags))) { @@ -2055,10 +2135,6 @@ qla2x00_update_fcport(scsi_qla_host_t *ha, fc_port_t *fcport) PORT_RETRY_TIME); fcport->flags &= ~FCF_LOGIN_NEEDED; - if (fcport->port_type == FCT_INITIATOR || - fcport->port_type == FCT_BROADCAST) - fcport->device_type = TYPE_PROCESSOR; - atomic_set(&fcport->state, FCS_ONLINE); if (ha->flags.init_done) @@ -2273,8 +2349,7 @@ qla2x00_configure_fabric(scsi_qla_host_t *ha) } /* Remove device from the new list and add it to DB */ - list_del(&fcport->list); - list_add_tail(&fcport->list, &ha->fcports); + list_move_tail(&fcport->list, &ha->fcports); /* Login and update database */ qla2x00_fabric_dev_login(ha, fcport, &next_loopid); @@ -2513,7 +2588,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *ha, struct list_head *new_fcports) * Context: * Kernel context. */ -int +static int qla2x00_find_new_loop_id(scsi_qla_host_t *ha, fc_port_t *dev) { int rval; @@ -2587,7 +2662,6 @@ static int qla2x00_device_resync(scsi_qla_host_t *ha) { int rval; - int rval2; uint32_t mask; fc_port_t *fcport; uint32_t rscn_entry; @@ -2643,17 +2717,6 @@ qla2x00_device_resync(scsi_qla_host_t *ha) switch (format) { case 0: - if (ql2xprocessrscn && - !IS_QLA2100(ha) && !IS_QLA2200(ha) && - !IS_QLA6312(ha) && !IS_QLA6322(ha) && - !IS_QLA24XX(ha) && !IS_QLA54XX(ha) && - ha->flags.init_done) { - /* Handle port RSCN via asyncronous IOCBs */ - rval2 = qla2x00_handle_port_rscn(ha, rscn_entry, - NULL, 0); - if (rval2 == QLA_SUCCESS) - continue; - } mask = 0xffffff; break; case 1: @@ -2671,10 +2734,6 @@ qla2x00_device_resync(scsi_qla_host_t *ha) rval = QLA_SUCCESS; - /* Abort any outstanding IO descriptors. */ - if (!IS_QLA2100(ha) && !IS_QLA2200(ha)) - qla2x00_cancel_io_descriptors(ha); - list_for_each_entry(fcport, &ha->fcports, list) { if ((fcport->flags & FCF_FABRIC_DEVICE) == 0 || (fcport->d_id.b24 & mask) != d_id.b24 || @@ -3004,6 +3063,7 @@ qla2x00_update_fcports(scsi_qla_host_t *ha) int qla2x00_abort_isp(scsi_qla_host_t *ha) { + int rval; unsigned long flags = 0; uint16_t cnt; srb_t *sp; @@ -3060,6 +3120,16 @@ qla2x00_abort_isp(scsi_qla_host_t *ha) ha->isp_abort_cnt = 0; clear_bit(ISP_ABORT_RETRY, &ha->dpc_flags); + + if (ha->eft) { + rval = qla2x00_trace_control(ha, TC_ENABLE, + ha->eft_dma, EFT_NUM_BUFFERS); + if (rval) { + qla_printk(KERN_WARNING, ha, + "Unable to reinitialize EFT " + "(%d).\n", rval); + } + } } else { /* failed the ISP abort */ ha->flags.online = 1; if (test_bit(ISP_ABORT_RETRY, &ha->dpc_flags)) { @@ -3080,14 +3150,14 @@ qla2x00_abort_isp(scsi_qla_host_t *ha) ha->isp_abort_cnt--; DEBUG(printk("qla%ld: ISP abort - " "retry remaining %d\n", - ha->host_no, ha->isp_abort_cnt);) + ha->host_no, ha->isp_abort_cnt)); status = 1; } } else { ha->isp_abort_cnt = MAX_RETRIES_OF_ISP_ABORT; DEBUG(printk("qla2x00(%ld): ISP error recovery " "- retrying (%d) more times\n", - ha->host_no, ha->isp_abort_cnt);) + ha->host_no, ha->isp_abort_cnt)); set_bit(ISP_ABORT_RETRY, &ha->dpc_flags); status = 1; } @@ -3101,7 +3171,7 @@ qla2x00_abort_isp(scsi_qla_host_t *ha) } else { DEBUG(printk(KERN_INFO "qla2x00_abort_isp(%ld): exiting.\n", - ha->host_no);) + ha->host_no)); } return(status); @@ -3177,7 +3247,7 @@ qla2x00_restart_isp(scsi_qla_host_t *ha) clear_bit(RESET_MARKER_NEEDED, &ha->dpc_flags); if (!(status = qla2x00_fw_ready(ha))) { DEBUG(printk("%s(): Start configure loop, " - "status = %d\n", __func__, status);) + "status = %d\n", __func__, status)); /* Issue a marker after FW becomes ready. */ qla2x00_marker(ha, 0, 0, MK_SYNC_ALL); @@ -3201,7 +3271,7 @@ qla2x00_restart_isp(scsi_qla_host_t *ha) DEBUG(printk("%s(): Configure loop done, status = 0x%x\n", __func__, - status);) + status)); } return (status); } @@ -3321,7 +3391,6 @@ qla24xx_nvram_config(scsi_qla_host_t *ha) nv->node_name[6] = 0x55; nv->node_name[7] = 0x86; nv->login_retry_count = __constant_cpu_to_le16(8); - nv->link_down_timeout = __constant_cpu_to_le16(200); nv->interrupt_delay_timer = __constant_cpu_to_le16(0); nv->login_timeout = __constant_cpu_to_le16(0); nv->firmware_options_1 = @@ -3350,7 +3419,7 @@ qla24xx_nvram_config(scsi_qla_host_t *ha) *dptr1++ = *dptr2++; icb->login_retry_count = nv->login_retry_count; - icb->link_down_timeout = nv->link_down_timeout; + icb->link_down_on_nos = nv->link_down_on_nos; /* Copy 2nd segment. */ dptr1 = (uint8_t *)&icb->interrupt_delay_timer; @@ -3383,8 +3452,14 @@ qla24xx_nvram_config(scsi_qla_host_t *ha) } else strcpy(ha->model_number, "QLA2462"); + /* Use alternate WWN? */ + if (nv->host_p & __constant_cpu_to_le32(BIT_15)) { + memcpy(icb->node_name, nv->alternate_node_name, WWN_SIZE); + memcpy(icb->port_name, nv->alternate_port_name, WWN_SIZE); + } + /* Prepare nodename */ - if ((icb->firmware_options_1 & BIT_14) == 0) { + if ((icb->firmware_options_1 & __constant_cpu_to_le32(BIT_14)) == 0) { /* * Firmware will apply the following mask if the nodename was * not provided. @@ -3399,9 +3474,10 @@ qla24xx_nvram_config(scsi_qla_host_t *ha) ha->flags.enable_lip_full_login = 1; ha->flags.enable_target_reset = 1; ha->flags.enable_led_scheme = 0; + ha->flags.disable_serdes = le32_to_cpu(nv->host_p) & BIT_5 ? 1: 0; - ha->operating_mode = - (icb->firmware_options_2 & (BIT_6 | BIT_5 | BIT_4)) >> 4; + ha->operating_mode = (le32_to_cpu(icb->firmware_options_2) & + (BIT_6 | BIT_5 | BIT_4)) >> 4; memcpy(ha->fw_seriallink_options24, nv->seriallink_options, sizeof(ha->fw_seriallink_options24)); @@ -3498,134 +3574,7 @@ 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, 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; - - /* Load firmware sequences */ - fw_iter = ha->brd_info->fw_info; - *srisc_addr = *ha->brd_info->fw_info->fwstart; - while (fw_iter->addressing != FW_INFO_ADDR_NOMORE) { - risc_code = fw_iter->fwcode; - 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_size > 0 && !rval) { - cnt = (uint16_t)(ha->fw_transfer_size >> 1); - 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 = (uint16_t *)ha->request_ring; - for (i = 0; i < cnt; i++) - req_ring[i] = cpu_to_le16(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 -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 +static int qla24xx_load_risc_flash(scsi_qla_host_t *ha, uint32_t *srisc_addr) { int rval; @@ -3707,7 +3656,7 @@ qla24xx_load_risc_flash(scsi_qla_host_t *ha, uint32_t *srisc_addr) return rval; } -#else /* !defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE) */ +#define QLA_FW_URL "ftp://ftp.qlogic.com/outgoing/linux/firmware/" int qla2x00_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr) @@ -3722,6 +3671,8 @@ qla2x00_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr) blob = qla2x00_request_firmware(ha); if (!blob) { qla_printk(KERN_ERR, ha, "Firmware image unavailable.\n"); + qla_printk(KERN_ERR, ha, "Firmware images can be retrieved " + "from: " QLA_FW_URL ".\n"); return QLA_FUNCTION_FAILED; } @@ -3823,7 +3774,13 @@ qla24xx_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr) blob = qla2x00_request_firmware(ha); if (!blob) { qla_printk(KERN_ERR, ha, "Firmware image unavailable.\n"); - return QLA_FUNCTION_FAILED; + qla_printk(KERN_ERR, ha, "Firmware images can be retrieved " + "from: " QLA_FW_URL ".\n"); + + /* Try to load RISC code from flash. */ + qla_printk(KERN_ERR, ha, "Attempting to load (potentially " + "outdated) firmware from flash.\n"); + return qla24xx_load_risc_flash(ha, srisc_addr); } rval = QLA_SUCCESS; @@ -3909,4 +3866,3 @@ qla24xx_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr) fail_fw_integrity: return QLA_FUNCTION_FAILED; } -#endif diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c index 8f0f4a298..c5b3c610a 100644 --- a/drivers/scsi/qla2xxx/qla_iocb.c +++ b/drivers/scsi/qla2xxx/qla_iocb.c @@ -15,6 +15,7 @@ static inline uint16_t qla2x00_get_cmd_direction(struct scsi_cmnd *cmd); static inline cont_entry_t *qla2x00_prep_cont_type0_iocb(scsi_qla_host_t *); static inline cont_a64_entry_t *qla2x00_prep_cont_type1_iocb(scsi_qla_host_t *); static request_t *qla2x00_req_pkt(scsi_qla_host_t *ha); +static void qla2x00_isp_cmd(scsi_qla_host_t *ha); /** * qla2x00_get_cmd_direction() - Determine control_flag data direction. @@ -408,7 +409,6 @@ qla2x00_start_scsi(srb_t *sp) ha->request_ring_ptr++; sp->flags |= SRB_DMA_VALID; - sp->state = SRB_ACTIVE_STATE; /* Set chip new ring index. */ WRT_REG_WORD(ISP_REQ_Q_IN(ha, reg), ha->req_ring_index); @@ -471,6 +471,7 @@ __qla2x00_marker(scsi_qla_host_t *ha, uint16_t loop_id, uint16_t lun, mrk24->nport_handle = cpu_to_le16(loop_id); mrk24->lun[1] = LSB(lun); mrk24->lun[2] = MSB(lun); + host_to_fcp_swap(mrk24->lun, sizeof(mrk24->lun)); } else { SET_TARGET_ID(ha, mrk->target, loop_id); mrk->lun = cpu_to_le16(lun); @@ -575,7 +576,7 @@ qla2x00_req_pkt(scsi_qla_host_t *ha) * * Note: The caller must hold the hardware lock before calling this routine. */ -void +static void qla2x00_isp_cmd(scsi_qla_host_t *ha) { device_reg_t __iomem *reg = ha->iobase; @@ -838,7 +839,6 @@ qla24xx_start_scsi(srb_t *sp) ha->request_ring_ptr++; sp->flags |= SRB_DMA_VALID; - sp->state = SRB_ACTIVE_STATE; /* Set chip new ring index. */ WRT_REG_DWORD(®->req_q_in, ha->req_ring_index); diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index 2003dbb70..de0613135 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c @@ -395,10 +395,6 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb) set_bit(REGISTER_FC4_NEEDED, &ha->dpc_flags); ha->flags.management_server_logged_in = 0; - - /* Update AEN queue. */ - qla2x00_enqueue_aen(ha, MBA_LIP_OCCURRED, NULL); - break; case MBA_LOOP_UP: /* Loop Up Event */ @@ -418,9 +414,6 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb) link_speed); ha->flags.management_server_logged_in = 0; - - /* Update AEN queue. */ - qla2x00_enqueue_aen(ha, MBA_LOOP_UP, NULL); break; case MBA_LOOP_DOWN: /* Loop Down Event */ @@ -439,9 +432,6 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb) ha->link_data_rate = LDR_UNKNOWN; if (ql2xfdmienable) set_bit(REGISTER_FDMI_NEEDED, &ha->dpc_flags); - - /* Update AEN queue. */ - qla2x00_enqueue_aen(ha, MBA_LOOP_DOWN, NULL); break; case MBA_LIP_RESET: /* LIP reset occurred */ @@ -460,10 +450,6 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb) ha->operating_mode = LOOP; ha->flags.management_server_logged_in = 0; - - /* Update AEN queue. */ - qla2x00_enqueue_aen(ha, MBA_LIP_RESET, NULL); - break; case MBA_POINT_TO_POINT: /* Point-to-Point */ @@ -514,47 +500,6 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb) break; case MBA_PORT_UPDATE: /* Port database update */ - /* - * If a single remote port just logged into (or logged out of) - * us, create a new entry in our rscn fcports list and handle - * the event like an RSCN. - */ - if (ql2xprocessrscn && - !IS_QLA2100(ha) && !IS_QLA2200(ha) && !IS_QLA6312(ha) && - !IS_QLA6322(ha) && !IS_QLA24XX(ha) && !IS_QLA54XX(ha) && - ha->flags.init_done && mb[1] != 0xffff && - ((ha->operating_mode == P2P && mb[1] != 0) || - (ha->operating_mode != P2P && mb[1] != - SNS_FIRST_LOOP_ID)) && (mb[2] == 6 || mb[2] == 7)) { - int rval; - fc_port_t *rscn_fcport; - - /* Create new fcport for login. */ - rscn_fcport = qla2x00_alloc_rscn_fcport(ha, GFP_ATOMIC); - if (rscn_fcport) { - DEBUG14(printk("scsi(%ld): Port Update -- " - "creating RSCN fcport %p for %x/%x/%x.\n", - ha->host_no, rscn_fcport, mb[1], mb[2], - mb[3])); - - rscn_fcport->loop_id = mb[1]; - rscn_fcport->d_id.b24 = INVALID_PORT_ID; - atomic_set(&rscn_fcport->state, - FCS_DEVICE_LOST); - list_add_tail(&rscn_fcport->list, - &ha->rscn_fcports); - - rval = qla2x00_handle_port_rscn(ha, 0, - rscn_fcport, 1); - if (rval == QLA_SUCCESS) - break; - } else { - DEBUG14(printk("scsi(%ld): Port Update -- " - "-- unable to allocate RSCN fcport " - "login.\n", ha->host_no)); - } - } - /* * If PORT UPDATE is global (recieved LIP_OCCURED/LIP_RESET * event etc. earlier indicating loop is down) then process @@ -586,9 +531,6 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb) set_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags); set_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags); - - /* Update AEN queue. */ - qla2x00_enqueue_aen(ha, MBA_PORT_UPDATE, NULL); break; case MBA_RSCN_UPDATE: /* State Change Registration */ @@ -625,9 +567,6 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb) set_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags); set_bit(RSCN_UPDATE, &ha->dpc_flags); - - /* Update AEN queue. */ - qla2x00_enqueue_aen(ha, MBA_RSCN_UPDATE, &mb[0]); break; /* case MBA_RIO_RESPONSE: */ @@ -648,6 +587,11 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb) DEBUG2(printk("scsi(%ld): Discard RND Frame -- %04x %04x " "%04x.\n", ha->host_no, mb[1], mb[2], mb[3])); break; + + case MBA_TRACE_NOTIFICATION: + DEBUG2(printk("scsi(%ld): Trace Notification -- %04x %04x.\n", + ha->host_no, mb[1], mb[2])); + break; } } @@ -753,25 +697,6 @@ qla2x00_process_response_queue(struct scsi_qla_host *ha) case MS_IOCB_TYPE: qla2x00_ms_entry(ha, (ms_iocb_entry_t *)pkt); break; - case MBX_IOCB_TYPE: - if (!IS_QLA2100(ha) && !IS_QLA2200(ha) && - !IS_QLA6312(ha) && !IS_QLA6322(ha)) { - if (pkt->sys_define == SOURCE_ASYNC_IOCB) { - qla2x00_process_iodesc(ha, - (struct mbx_entry *)pkt); - } else { - /* MBX IOCB Type Not Supported. */ - DEBUG4(printk(KERN_WARNING - "scsi(%ld): Received unknown MBX " - "IOCB response pkt type=%x " - "source=%x entry status=%x.\n", - ha->host_no, pkt->entry_type, - pkt->sys_define, - pkt->entry_status)); - } - break; - } - /* Fallthrough. */ default: /* Type Not Supported. */ DEBUG4(printk(KERN_WARNING @@ -805,7 +730,7 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) uint16_t scsi_status; uint8_t lscsi_status; int32_t resid; - uint32_t sense_len, rsp_info_len, resid_len; + uint32_t sense_len, rsp_info_len, resid_len, fw_resid_len; uint8_t *rsp_info, *sense_data; sts = (sts_entry_t *) pkt; @@ -844,8 +769,7 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) cp = sp->cmd; if (cp == NULL) { DEBUG2(printk("scsi(%ld): Command already returned back to OS " - "pkt->handle=%d sp=%p sp->state:%d\n", - ha->host_no, sts->handle, sp, sp->state)); + "pkt->handle=%d sp=%p.\n", ha->host_no, sts->handle, sp)); qla_printk(KERN_WARNING, ha, "Command is NULL: already returned to OS (sp=%p)\n", sp); @@ -859,11 +783,12 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) fcport = sp->fcport; - sense_len = rsp_info_len = resid_len = 0; + sense_len = rsp_info_len = resid_len = fw_resid_len = 0; if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { sense_len = le32_to_cpu(sts24->sense_len); rsp_info_len = le32_to_cpu(sts24->rsp_data_len); resid_len = le32_to_cpu(sts24->rsp_residual_count); + fw_resid_len = le32_to_cpu(sts24->residual_len); rsp_info = sts24->data; sense_data = sts24->data; host_to_fcp_swap(sts24->data, sizeof(sts24->data)); @@ -963,14 +888,21 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) case CS_DATA_UNDERRUN: resid = resid_len; + /* Use F/W calculated residual length. */ + if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) + resid = fw_resid_len; + if (scsi_status & SS_RESIDUAL_UNDER) { cp->resid = resid; CMD_RESID_LEN(cp) = resid; } else { DEBUG2(printk(KERN_INFO "scsi(%ld:%d:%d) UNDERRUN status detected " - "0x%x-0x%x.\n", ha->host_no, cp->device->id, - cp->device->lun, comp_status, scsi_status)); + "0x%x-0x%x. resid=0x%x fw_resid=0x%x cdb=0x%x " + "os_underflow=0x%x\n", ha->host_no, + cp->device->id, cp->device->lun, comp_status, + scsi_status, resid_len, resid, cp->cmnd[0], + cp->underflow)); } @@ -1181,7 +1113,7 @@ qla2x00_status_cont_entry(scsi_qla_host_t *ha, sts_cont_entry_t *pkt) cp = sp->cmd; if (cp == NULL) { DEBUG2(printk("%s(): Cmd already returned back to OS " - "sp=%p sp->state:%d\n", __func__, sp, sp->state)); + "sp=%p.\n", __func__, sp)); qla_printk(KERN_INFO, ha, "cmd is NULL: already returned to OS (sp=%p)\n", sp); @@ -1505,8 +1437,8 @@ qla24xx_ms_entry(scsi_qla_host_t *ha, struct ct_entry_24xx *pkt) DEBUG3(printk("%s(%ld): pkt=%p pkthandle=%d.\n", __func__, ha->host_no, pkt, pkt->handle)); - DEBUG9(printk("%s: ct pkt dump:\n", __func__);) - DEBUG9(qla2x00_dump_buffer((void *)pkt, sizeof(struct ct_entry_24xx));) + DEBUG9(printk("%s: ct pkt dump:\n", __func__)); + DEBUG9(qla2x00_dump_buffer((void *)pkt, sizeof(struct ct_entry_24xx))); /* Validate handle. */ if (pkt->handle < MAX_OUTSTANDING_COMMANDS) diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index d6cb3bd1a..879f281e2 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c @@ -13,13 +13,13 @@ qla2x00_mbx_sem_timeout(unsigned long data) { struct semaphore *sem_ptr = (struct semaphore *)data; - DEBUG11(printk("qla2x00_sem_timeout: entered.\n");) + DEBUG11(printk("qla2x00_sem_timeout: entered.\n")); if (sem_ptr != NULL) { up(sem_ptr); } - DEBUG11(printk("qla2x00_mbx_sem_timeout: exiting.\n");) + DEBUG11(printk("qla2x00_mbx_sem_timeout: exiting.\n")); } /* @@ -61,7 +61,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp) rval = QLA_SUCCESS; abort_active = test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags); - DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no);) + DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); /* * Wait for active mailbox commands to finish by waiting at most tov @@ -72,7 +72,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp) if (qla2x00_down_timeout(&ha->mbx_cmd_sem, mcp->tov * HZ)) { /* Timeout occurred. Return error. */ DEBUG2_3_11(printk("%s(%ld): cmd access timeout. " - "Exiting.\n", __func__, ha->host_no);) + "Exiting.\n", __func__, ha->host_no)); return QLA_FUNCTION_TIMEOUT; } } @@ -86,7 +86,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp) spin_lock_irqsave(&ha->mbx_reg_lock, mbx_flags); DEBUG11(printk("scsi(%ld): prepare to issue mbox cmd=0x%x.\n", - ha->host_no, mcp->mb[0]);) + ha->host_no, mcp->mb[0])); spin_lock_irqsave(&ha->hardware_lock, flags); @@ -131,14 +131,14 @@ qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp) /* Unlock mbx registers and wait for interrupt */ DEBUG11(printk("%s(%ld): going to unlock irq & waiting for interrupt. " - "jiffies=%lx.\n", __func__, ha->host_no, jiffies);) + "jiffies=%lx.\n", __func__, ha->host_no, jiffies)); /* Wait for mbx cmd completion until timeout */ if (!abort_active && io_lock_on) { /* sleep on completion semaphore */ DEBUG11(printk("%s(%ld): INTERRUPT MODE. Initializing timer.\n", - __func__, ha->host_no);) + __func__, ha->host_no)); init_timer(&tmp_intr_timer); tmp_intr_timer.data = (unsigned long)&ha->mbx_intr_sem; @@ -147,11 +147,11 @@ qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp) (void (*)(unsigned long))qla2x00_mbx_sem_timeout; DEBUG11(printk("%s(%ld): Adding timer.\n", __func__, - ha->host_no);) + ha->host_no)); add_timer(&tmp_intr_timer); DEBUG11(printk("%s(%ld): going to unlock & sleep. " - "time=0x%lx.\n", __func__, ha->host_no, jiffies);) + "time=0x%lx.\n", __func__, ha->host_no, jiffies)); set_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags); @@ -170,14 +170,14 @@ qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp) down(&ha->mbx_intr_sem); DEBUG11(printk("%s(%ld): waking up. time=0x%lx\n", __func__, - ha->host_no, jiffies);) + ha->host_no, jiffies)); clear_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags); /* delete the timer */ del_timer(&tmp_intr_timer); } else { DEBUG3_11(printk("%s(%ld): cmd=%x POLLING MODE.\n", __func__, - ha->host_no, command);) + ha->host_no, command)); if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) WRT_REG_DWORD(®->isp24.hccr, HCCRX_SET_HOST_INT); @@ -209,7 +209,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp) uint16_t *iptr2; DEBUG3_11(printk("%s(%ld): cmd %x completed.\n", __func__, - ha->host_no, command);) + ha->host_no, command)); /* Got interrupt. Clear the flag. */ ha->flags.mbox_int = 0; @@ -266,7 +266,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp) if (!abort_active) { DEBUG11(printk("%s(%ld): checking for additional resp " - "interrupt.\n", __func__, ha->host_no);) + "interrupt.\n", __func__, ha->host_no)); /* polling mode for non isp_abort commands. */ qla2x00_poll(ha); @@ -277,9 +277,9 @@ qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp) if (!io_lock_on || (mcp->flags & IOCTL_CMD)) { /* not in dpc. schedule it for dpc to take over. */ DEBUG(printk("%s(%ld): timeout schedule " - "isp_abort_needed.\n", __func__, ha->host_no);) + "isp_abort_needed.\n", __func__, ha->host_no)); DEBUG2_3_11(printk("%s(%ld): timeout schedule " - "isp_abort_needed.\n", __func__, ha->host_no);) + "isp_abort_needed.\n", __func__, ha->host_no)); qla_printk(KERN_WARNING, ha, "Mailbox command timeout occured. Scheduling ISP " "abort.\n"); @@ -288,9 +288,9 @@ qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp) } else if (!abort_active) { /* call abort directly since we are in the DPC thread */ DEBUG(printk("%s(%ld): timeout calling abort_isp\n", - __func__, ha->host_no);) + __func__, ha->host_no)); DEBUG2_3_11(printk("%s(%ld): timeout calling " - "abort_isp\n", __func__, ha->host_no);) + "abort_isp\n", __func__, ha->host_no)); qla_printk(KERN_WARNING, ha, "Mailbox command timeout occured. Issuing ISP " "abort.\n"); @@ -303,9 +303,9 @@ qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp) } clear_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags); DEBUG(printk("%s(%ld): finished abort_isp\n", __func__, - ha->host_no);) + ha->host_no)); DEBUG2_3_11(printk("%s(%ld): finished abort_isp\n", - __func__, ha->host_no);) + __func__, ha->host_no)); } } @@ -316,9 +316,9 @@ qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp) if (rval) { DEBUG2_3_11(printk("%s(%ld): **** FAILED. mbx0=%x, mbx1=%x, " "mbx2=%x, cmd=%x ****\n", __func__, ha->host_no, - mcp->mb[0], mcp->mb[1], mcp->mb[2], command);) + mcp->mb[0], mcp->mb[1], mcp->mb[2], command)); } else { - DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no);) + DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); } return rval; @@ -394,7 +394,7 @@ qla2x00_execute_fw(scsi_qla_host_t *ha, uint32_t risc_addr) mbx_cmd_t mc; mbx_cmd_t *mcp = &mc; - DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no);) + DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); mcp->mb[0] = MBC_EXECUTE_FIRMWARE; mcp->out_mb = MBX_0; @@ -424,10 +424,10 @@ qla2x00_execute_fw(scsi_qla_host_t *ha, uint32_t risc_addr) } else { if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { DEBUG11(printk("%s(%ld): done exchanges=%x.\n", - __func__, ha->host_no, mcp->mb[1]);) + __func__, ha->host_no, mcp->mb[1])); } else { DEBUG11(printk("%s(%ld): done.\n", __func__, - ha->host_no);) + ha->host_no)); } } @@ -611,7 +611,7 @@ qla2x00_mbx_reg_test(scsi_qla_host_t *ha) mbx_cmd_t mc; mbx_cmd_t *mcp = &mc; - DEBUG11(printk("qla2x00_mbx_reg_test(%ld): entered.\n", ha->host_no);) + DEBUG11(printk("qla2x00_mbx_reg_test(%ld): entered.\n", ha->host_no)); mcp->mb[0] = MBC_MAILBOX_REGISTER_TEST; mcp->mb[1] = 0xAAAA; @@ -639,11 +639,11 @@ qla2x00_mbx_reg_test(scsi_qla_host_t *ha) if (rval != QLA_SUCCESS) { /*EMPTY*/ DEBUG2_3_11(printk("qla2x00_mbx_reg_test(%ld): failed=%x.\n", - ha->host_no, rval);) + ha->host_no, rval)); } else { /*EMPTY*/ DEBUG11(printk("qla2x00_mbx_reg_test(%ld): done.\n", - ha->host_no);) + ha->host_no)); } return rval; @@ -671,7 +671,7 @@ qla2x00_verify_checksum(scsi_qla_host_t *ha, uint32_t risc_addr) mbx_cmd_t mc; mbx_cmd_t *mcp = &mc; - DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no);) + DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); mcp->mb[0] = MBC_VERIFY_CHECKSUM; mcp->out_mb = MBX_0; @@ -694,9 +694,9 @@ qla2x00_verify_checksum(scsi_qla_host_t *ha, uint32_t risc_addr) if (rval != QLA_SUCCESS) { DEBUG2_3_11(printk("%s(%ld): failed=%x chk sum=%x.\n", __func__, ha->host_no, rval, (IS_QLA24XX(ha) || IS_QLA54XX(ha) ? - (mcp->mb[2] << 16) | mcp->mb[1]: mcp->mb[1]));) + (mcp->mb[2] << 16) | mcp->mb[1]: mcp->mb[1]))); } else { - DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no);) + DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); } return rval; @@ -743,9 +743,9 @@ qla2x00_issue_iocb(scsi_qla_host_t *ha, void* buffer, dma_addr_t phys_addr, if (rval != QLA_SUCCESS) { /*EMPTY*/ DEBUG(printk("qla2x00_issue_iocb(%ld): failed rval 0x%x\n", - ha->host_no, rval);) + ha->host_no, rval)); DEBUG2(printk("qla2x00_issue_iocb(%ld): failed rval 0x%x\n", - ha->host_no, rval);) + ha->host_no, rval)); } else { sts_entry_t *sts_entry = (sts_entry_t *) buffer; @@ -781,7 +781,7 @@ qla2x00_abort_command(scsi_qla_host_t *ha, srb_t *sp) mbx_cmd_t mc; mbx_cmd_t *mcp = &mc; - DEBUG11(printk("qla2x00_abort_command(%ld): entered.\n", ha->host_no);) + DEBUG11(printk("qla2x00_abort_command(%ld): entered.\n", ha->host_no)); fcport = sp->fcport; @@ -813,11 +813,11 @@ qla2x00_abort_command(scsi_qla_host_t *ha, srb_t *sp) if (rval != QLA_SUCCESS) { DEBUG2_3_11(printk("qla2x00_abort_command(%ld): failed=%x.\n", - ha->host_no, rval);) + ha->host_no, rval)); } else { sp->flags |= SRB_ABORT_PENDING; DEBUG11(printk("qla2x00_abort_command(%ld): done.\n", - ha->host_no);) + ha->host_no)); } return rval; @@ -848,7 +848,7 @@ qla2x00_abort_target(fc_port_t *fcport) if (fcport == NULL) return 0; - DEBUG11(printk("%s(%ld): entered.\n", __func__, fcport->ha->host_no);) + DEBUG11(printk("%s(%ld): entered.\n", __func__, fcport->ha->host_no)); ha = fcport->ha; mcp->mb[0] = MBC_ABORT_TARGET; @@ -872,11 +872,11 @@ qla2x00_abort_target(fc_port_t *fcport) if (rval != QLA_SUCCESS) { DEBUG2_3_11(printk("qla2x00_abort_target(%ld): failed=%x.\n", - ha->host_no, rval);) + ha->host_no, rval)); } else { /*EMPTY*/ DEBUG11(printk("qla2x00_abort_target(%ld): done.\n", - ha->host_no);) + ha->host_no)); } return rval; @@ -912,7 +912,7 @@ qla2x00_get_adapter_id(scsi_qla_host_t *ha, uint16_t *id, uint8_t *al_pa, mbx_cmd_t *mcp = &mc; DEBUG11(printk("qla2x00_get_adapter_id(%ld): entered.\n", - ha->host_no);) + ha->host_no)); mcp->mb[0] = MBC_GET_ADAPTER_LOOP_ID; mcp->out_mb = MBX_0; @@ -933,11 +933,11 @@ qla2x00_get_adapter_id(scsi_qla_host_t *ha, uint16_t *id, uint8_t *al_pa, if (rval != QLA_SUCCESS) { /*EMPTY*/ DEBUG2_3_11(printk("qla2x00_get_adapter_id(%ld): failed=%x.\n", - ha->host_no, rval);) + ha->host_no, rval)); } else { /*EMPTY*/ DEBUG11(printk("qla2x00_get_adapter_id(%ld): done.\n", - ha->host_no);) + ha->host_no)); } return rval; @@ -968,7 +968,7 @@ qla2x00_get_retry_cnt(scsi_qla_host_t *ha, uint8_t *retry_cnt, uint8_t *tov, mbx_cmd_t *mcp = &mc; DEBUG11(printk("qla2x00_get_retry_cnt(%ld): entered.\n", - ha->host_no);) + ha->host_no)); mcp->mb[0] = MBC_GET_RETRY_COUNT; mcp->out_mb = MBX_0; @@ -980,7 +980,7 @@ qla2x00_get_retry_cnt(scsi_qla_host_t *ha, uint8_t *retry_cnt, uint8_t *tov, if (rval != QLA_SUCCESS) { /*EMPTY*/ DEBUG2_3_11(printk("qla2x00_get_retry_cnt(%ld): failed = %x.\n", - ha->host_no, mcp->mb[0]);) + ha->host_no, mcp->mb[0])); } else { /* Convert returned data and check our values. */ *r_a_tov = mcp->mb[3] / 2; @@ -992,7 +992,7 @@ qla2x00_get_retry_cnt(scsi_qla_host_t *ha, uint8_t *retry_cnt, uint8_t *tov, } DEBUG11(printk("qla2x00_get_retry_cnt(%ld): done. mb3=%d " - "ratov=%d.\n", ha->host_no, mcp->mb[3], ratov);) + "ratov=%d.\n", ha->host_no, mcp->mb[3], ratov)); } return rval; @@ -1023,7 +1023,7 @@ qla2x00_init_firmware(scsi_qla_host_t *ha, uint16_t size) mbx_cmd_t *mcp = &mc; DEBUG11(printk("qla2x00_init_firmware(%ld): entered.\n", - ha->host_no);) + ha->host_no)); mcp->mb[0] = MBC_INITIALIZE_FIRMWARE; mcp->mb[2] = MSW(ha->init_cb_dma); @@ -1043,11 +1043,11 @@ qla2x00_init_firmware(scsi_qla_host_t *ha, uint16_t size) /*EMPTY*/ DEBUG2_3_11(printk("qla2x00_init_firmware(%ld): failed=%x " "mb0=%x.\n", - ha->host_no, rval, mcp->mb[0]);) + ha->host_no, rval, mcp->mb[0])); } else { /*EMPTY*/ DEBUG11(printk("qla2x00_init_firmware(%ld): done.\n", - ha->host_no);) + ha->host_no)); } return rval; @@ -1079,7 +1079,7 @@ qla2x00_get_port_database(scsi_qla_host_t *ha, fc_port_t *fcport, uint8_t opt) struct port_database_24xx *pd24; dma_addr_t pd_dma; - DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no);) + DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); pd24 = NULL; pd = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &pd_dma); @@ -1220,7 +1220,7 @@ qla2x00_get_firmware_state(scsi_qla_host_t *ha, uint16_t *dptr) mbx_cmd_t *mcp = &mc; DEBUG11(printk("qla2x00_get_firmware_state(%ld): entered.\n", - ha->host_no);) + ha->host_no)); mcp->mb[0] = MBC_GET_FIRMWARE_STATE; mcp->out_mb = MBX_0; @@ -1235,11 +1235,11 @@ qla2x00_get_firmware_state(scsi_qla_host_t *ha, uint16_t *dptr) if (rval != QLA_SUCCESS) { /*EMPTY*/ DEBUG2_3_11(printk("qla2x00_get_firmware_state(%ld): " - "failed=%x.\n", ha->host_no, rval);) + "failed=%x.\n", ha->host_no, rval)); } else { /*EMPTY*/ DEBUG11(printk("qla2x00_get_firmware_state(%ld): done.\n", - ha->host_no);) + ha->host_no)); } return rval; @@ -1272,7 +1272,7 @@ qla2x00_get_port_name(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t *name, mbx_cmd_t *mcp = &mc; DEBUG11(printk("qla2x00_get_port_name(%ld): entered.\n", - ha->host_no);) + ha->host_no)); mcp->mb[0] = MBC_GET_PORT_NAME; mcp->out_mb = MBX_1|MBX_0; @@ -1292,7 +1292,7 @@ qla2x00_get_port_name(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t *name, if (rval != QLA_SUCCESS) { /*EMPTY*/ DEBUG2_3_11(printk("qla2x00_get_port_name(%ld): failed=%x.\n", - ha->host_no, rval);) + ha->host_no, rval)); } else { if (name != NULL) { /* This function returns name in big endian. */ @@ -1307,7 +1307,7 @@ qla2x00_get_port_name(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t *name, } DEBUG11(printk("qla2x00_get_port_name(%ld): done.\n", - ha->host_no);) + ha->host_no)); } return rval; @@ -1335,7 +1335,7 @@ qla2x00_lip_reset(scsi_qla_host_t *ha) mbx_cmd_t mc; mbx_cmd_t *mcp = &mc; - DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no);) + DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { mcp->mb[0] = MBC_LIP_FULL_LOGIN; @@ -1364,10 +1364,10 @@ qla2x00_lip_reset(scsi_qla_host_t *ha) if (rval != QLA_SUCCESS) { /*EMPTY*/ DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", - __func__, ha->host_no, rval);) + __func__, ha->host_no, rval)); } else { /*EMPTY*/ - DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no);) + DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); } return rval; @@ -1400,10 +1400,10 @@ qla2x00_send_sns(scsi_qla_host_t *ha, dma_addr_t sns_phys_address, mbx_cmd_t *mcp = &mc; DEBUG11(printk("qla2x00_send_sns(%ld): entered.\n", - ha->host_no);) + ha->host_no)); DEBUG11(printk("qla2x00_send_sns: retry cnt=%d ratov=%d total " - "tov=%d.\n", ha->retry_count, ha->login_timeout, mcp->tov);) + "tov=%d.\n", ha->retry_count, ha->login_timeout, mcp->tov)); mcp->mb[0] = MBC_SEND_SNS_COMMAND; mcp->mb[1] = cmd_size; @@ -1421,12 +1421,12 @@ qla2x00_send_sns(scsi_qla_host_t *ha, dma_addr_t sns_phys_address, if (rval != QLA_SUCCESS) { /*EMPTY*/ DEBUG(printk("qla2x00_send_sns(%ld): failed=%x mb[0]=%x " - "mb[1]=%x.\n", ha->host_no, rval, mcp->mb[0], mcp->mb[1]);) + "mb[1]=%x.\n", ha->host_no, rval, mcp->mb[0], mcp->mb[1])); DEBUG2_3_11(printk("qla2x00_send_sns(%ld): failed=%x mb[0]=%x " - "mb[1]=%x.\n", ha->host_no, rval, mcp->mb[0], mcp->mb[1]);) + "mb[1]=%x.\n", ha->host_no, rval, mcp->mb[0], mcp->mb[1])); } else { /*EMPTY*/ - DEBUG11(printk("qla2x00_send_sns(%ld): done.\n", ha->host_no);) + DEBUG11(printk("qla2x00_send_sns(%ld): done.\n", ha->host_no)); } return rval; @@ -1442,7 +1442,7 @@ qla24xx_login_fabric(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain, dma_addr_t lg_dma; uint32_t iop[2]; - DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no);) + DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); lg = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &lg_dma); if (lg == NULL) { @@ -1458,13 +1458,15 @@ qla24xx_login_fabric(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain, lg->control_flags = __constant_cpu_to_le16(LCF_COMMAND_PLOGI); if (opt & BIT_0) lg->control_flags |= __constant_cpu_to_le16(LCF_COND_PLOGI); + if (opt & BIT_1) + lg->control_flags |= __constant_cpu_to_le16(LCF_SKIP_PRLI); lg->port_id[0] = al_pa; lg->port_id[1] = area; lg->port_id[2] = domain; rval = qla2x00_issue_iocb(ha, lg, lg_dma, 0); if (rval != QLA_SUCCESS) { DEBUG2_3_11(printk("%s(%ld): failed to issue Login IOCB " - "(%x).\n", __func__, ha->host_no, rval);) + "(%x).\n", __func__, ha->host_no, rval)); } else if (lg->entry_status != 0) { DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " "-- error status (%x).\n", __func__, ha->host_no, @@ -1505,7 +1507,7 @@ qla24xx_login_fabric(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain, break; } } else { - DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no);) + DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); iop[0] = le32_to_cpu(lg->io_parameter[0]); @@ -1559,7 +1561,7 @@ qla2x00_login_fabric(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain, mbx_cmd_t mc; mbx_cmd_t *mcp = &mc; - DEBUG11(printk("qla2x00_login_fabric(%ld): entered.\n", ha->host_no);) + DEBUG11(printk("qla2x00_login_fabric(%ld): entered.\n", ha->host_no)); mcp->mb[0] = MBC_LOGIN_FABRIC_PORT; mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0; @@ -1604,11 +1606,11 @@ qla2x00_login_fabric(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain, /*EMPTY*/ DEBUG2_3_11(printk("qla2x00_login_fabric(%ld): failed=%x " "mb[0]=%x mb[1]=%x mb[2]=%x.\n", ha->host_no, rval, - mcp->mb[0], mcp->mb[1], mcp->mb[2]);) + mcp->mb[0], mcp->mb[1], mcp->mb[2])); } else { /*EMPTY*/ DEBUG11(printk("qla2x00_login_fabric(%ld): done.\n", - ha->host_no);) + ha->host_no)); } return rval; @@ -1643,7 +1645,7 @@ qla2x00_login_local_device(scsi_qla_host_t *ha, fc_port_t *fcport, fcport->d_id.b.domain, fcport->d_id.b.area, fcport->d_id.b.al_pa, mb_ret, opt); - DEBUG3(printk("%s(%ld): entered.\n", __func__, ha->host_no);) + DEBUG3(printk("%s(%ld): entered.\n", __func__, ha->host_no)); mcp->mb[0] = MBC_LOGIN_LOOP_PORT; if (HAS_EXTENDED_IDS(ha)) @@ -1677,13 +1679,13 @@ qla2x00_login_local_device(scsi_qla_host_t *ha, fc_port_t *fcport, DEBUG(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x " "mb[6]=%x mb[7]=%x.\n", __func__, ha->host_no, rval, - mcp->mb[0], mcp->mb[1], mcp->mb[6], mcp->mb[7]);) + mcp->mb[0], mcp->mb[1], mcp->mb[6], mcp->mb[7])); DEBUG2_3(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x " "mb[6]=%x mb[7]=%x.\n", __func__, ha->host_no, rval, - mcp->mb[0], mcp->mb[1], mcp->mb[6], mcp->mb[7]);) + mcp->mb[0], mcp->mb[1], mcp->mb[6], mcp->mb[7])); } else { /*EMPTY*/ - DEBUG3(printk("%s(%ld): done.\n", __func__, ha->host_no);) + DEBUG3(printk("%s(%ld): done.\n", __func__, ha->host_no)); } return (rval); @@ -1697,7 +1699,7 @@ qla24xx_fabric_logout(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain, struct logio_entry_24xx *lg; dma_addr_t lg_dma; - DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no);) + DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); lg = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &lg_dma); if (lg == NULL) { @@ -1718,7 +1720,7 @@ qla24xx_fabric_logout(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain, rval = qla2x00_issue_iocb(ha, lg, lg_dma, 0); if (rval != QLA_SUCCESS) { DEBUG2_3_11(printk("%s(%ld): failed to issue Logout IOCB " - "(%x).\n", __func__, ha->host_no, rval);) + "(%x).\n", __func__, ha->host_no, rval)); } else if (lg->entry_status != 0) { DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " "-- error status (%x).\n", __func__, ha->host_no, @@ -1729,10 +1731,10 @@ qla24xx_fabric_logout(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain, "-- completion status (%x) ioparam=%x/%x.\n", __func__, ha->host_no, le16_to_cpu(lg->comp_status), le32_to_cpu(lg->io_parameter[0]), - le32_to_cpu(lg->io_parameter[1]));) + le32_to_cpu(lg->io_parameter[1]))); } else { /*EMPTY*/ - DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no);) + DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); } dma_pool_free(ha->s_dma_pool, lg, lg_dma); @@ -1765,7 +1767,7 @@ qla2x00_fabric_logout(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain, mbx_cmd_t *mcp = &mc; DEBUG11(printk("qla2x00_fabric_logout(%ld): entered.\n", - ha->host_no);) + ha->host_no)); mcp->mb[0] = MBC_LOGOUT_FABRIC_PORT; mcp->out_mb = MBX_1|MBX_0; @@ -1785,11 +1787,11 @@ qla2x00_fabric_logout(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain, if (rval != QLA_SUCCESS) { /*EMPTY*/ DEBUG2_3_11(printk("qla2x00_fabric_logout(%ld): failed=%x " - "mbx1=%x.\n", ha->host_no, rval, mcp->mb[1]);) + "mbx1=%x.\n", ha->host_no, rval, mcp->mb[1])); } else { /*EMPTY*/ DEBUG11(printk("qla2x00_fabric_logout(%ld): done.\n", - ha->host_no);) + ha->host_no)); } return rval; @@ -1818,7 +1820,7 @@ qla2x00_full_login_lip(scsi_qla_host_t *ha) mbx_cmd_t *mcp = &mc; DEBUG11(printk("qla2x00_full_login_lip(%ld): entered.\n", - ha->host_no);) + ha->host_no)); mcp->mb[0] = MBC_LIP_FULL_LOGIN; mcp->mb[1] = 0; @@ -1833,11 +1835,11 @@ qla2x00_full_login_lip(scsi_qla_host_t *ha) if (rval != QLA_SUCCESS) { /*EMPTY*/ DEBUG2_3_11(printk("qla2x00_full_login_lip(%ld): failed=%x.\n", - ha->host_no, rval);) + ha->host_no, rval)); } else { /*EMPTY*/ DEBUG11(printk("qla2x00_full_login_lip(%ld): done.\n", - ha->host_no);) + ha->host_no)); } return rval; @@ -1864,7 +1866,7 @@ qla2x00_get_id_list(scsi_qla_host_t *ha, void *id_list, dma_addr_t id_list_dma, mbx_cmd_t *mcp = &mc; DEBUG11(printk("qla2x00_get_id_list(%ld): entered.\n", - ha->host_no);) + ha->host_no)); if (id_list == NULL) return QLA_FUNCTION_FAILED; @@ -1893,11 +1895,11 @@ qla2x00_get_id_list(scsi_qla_host_t *ha, void *id_list, dma_addr_t id_list_dma, if (rval != QLA_SUCCESS) { /*EMPTY*/ DEBUG2_3_11(printk("qla2x00_get_id_list(%ld): failed=%x.\n", - ha->host_no, rval);) + ha->host_no, rval)); } else { *entries = mcp->mb[1]; DEBUG11(printk("qla2x00_get_id_list(%ld): done.\n", - ha->host_no);) + ha->host_no)); } return rval; @@ -1936,7 +1938,7 @@ qla2x00_get_resource_cnts(scsi_qla_host_t *ha, uint16_t *cur_xchg_cnt, if (rval != QLA_SUCCESS) { /*EMPTY*/ DEBUG2_3_11(printk("%s(%ld): failed = %x.\n", __func__, - ha->host_no, mcp->mb[0]);) + ha->host_no, mcp->mb[0])); } else { DEBUG11(printk("%s(%ld): done. mb1=%x mb2=%x mb3=%x mb6=%x " "mb7=%x mb10=%x.\n", __func__, ha->host_no, @@ -2045,7 +2047,7 @@ qla2x00_get_link_status(scsi_qla_host_t *ha, uint16_t loop_id, link_stat_t *stat_buf; dma_addr_t stat_buf_dma; - DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no);) + DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); stat_buf = dma_pool_alloc(ha->s_dma_pool, GFP_ATOMIC, &stat_buf_dma); if (stat_buf == NULL) { @@ -2083,7 +2085,7 @@ qla2x00_get_link_status(scsi_qla_host_t *ha, uint16_t loop_id, if (rval == QLA_SUCCESS) { if (mcp->mb[0] != MBS_COMMAND_COMPLETE) { DEBUG2_3_11(printk("%s(%ld): cmd failed. mbx0=%x.\n", - __func__, ha->host_no, mcp->mb[0]);) + __func__, ha->host_no, mcp->mb[0])); status[0] = mcp->mb[0]; rval = BIT_1; } else { @@ -2108,12 +2110,12 @@ qla2x00_get_link_status(scsi_qla_host_t *ha, uint16_t loop_id, stat_buf->loss_sync_cnt, stat_buf->loss_sig_cnt, stat_buf->prim_seq_err_cnt, stat_buf->inval_xmit_word_cnt, - stat_buf->inval_crc_cnt);) + stat_buf->inval_crc_cnt)); } } else { /* Failed. */ DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, - ha->host_no, rval);) + ha->host_no, rval)); rval = BIT_1; } @@ -2132,7 +2134,7 @@ qla24xx_get_isp_stats(scsi_qla_host_t *ha, uint32_t *dwbuf, uint32_t dwords, uint32_t *sbuf, *siter; dma_addr_t sbuf_dma; - DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no);) + DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); if (dwords > (DMA_POOL_SIZE / 4)) { DEBUG2_3_11(printk("%s(%ld): Unabled to retrieve %d DWORDs " @@ -2196,7 +2198,7 @@ qla24xx_abort_command(scsi_qla_host_t *ha, srb_t *sp) dma_addr_t abt_dma; uint32_t handle; - DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no);) + DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); fcport = sp->fcport; @@ -2229,7 +2231,7 @@ qla24xx_abort_command(scsi_qla_host_t *ha, srb_t *sp) rval = qla2x00_issue_iocb(ha, abt, abt_dma, 0); if (rval != QLA_SUCCESS) { DEBUG2_3_11(printk("%s(%ld): failed to issue IOCB (%x).\n", - __func__, ha->host_no, rval);) + __func__, ha->host_no, rval)); } else if (abt->entry_status != 0) { DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " "-- error status (%x).\n", __func__, ha->host_no, @@ -2238,10 +2240,10 @@ qla24xx_abort_command(scsi_qla_host_t *ha, srb_t *sp) } else if (abt->nport_handle != __constant_cpu_to_le16(0)) { DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " "-- completion status (%x).\n", __func__, ha->host_no, - le16_to_cpu(abt->nport_handle));) + le16_to_cpu(abt->nport_handle))); rval = QLA_FUNCTION_FAILED; } else { - DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no);) + DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); sp->flags |= SRB_ABORT_PENDING; } @@ -2268,7 +2270,7 @@ qla24xx_abort_target(fc_port_t *fcport) if (fcport == NULL) return 0; - DEBUG11(printk("%s(%ld): entered.\n", __func__, fcport->ha->host_no);) + DEBUG11(printk("%s(%ld): entered.\n", __func__, fcport->ha->host_no)); ha = fcport->ha; tsk = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &tsk_dma); @@ -2290,7 +2292,7 @@ qla24xx_abort_target(fc_port_t *fcport) rval = qla2x00_issue_iocb(ha, tsk, tsk_dma, 0); if (rval != QLA_SUCCESS) { DEBUG2_3_11(printk("%s(%ld): failed to issue Target Reset IOCB " - "(%x).\n", __func__, ha->host_no, rval);) + "(%x).\n", __func__, ha->host_no, rval)); goto atarget_done; } else if (tsk->p.sts.entry_status != 0) { DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " @@ -2302,7 +2304,7 @@ qla24xx_abort_target(fc_port_t *fcport) __constant_cpu_to_le16(CS_COMPLETE)) { DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB " "-- completion status (%x).\n", __func__, - ha->host_no, le16_to_cpu(tsk->p.sts.comp_status));) + ha->host_no, le16_to_cpu(tsk->p.sts.comp_status))); rval = QLA_FUNCTION_FAILED; goto atarget_done; } @@ -2311,9 +2313,9 @@ qla24xx_abort_target(fc_port_t *fcport) rval = qla2x00_marker(ha, fcport->loop_id, 0, MK_SYNC_ID); if (rval != QLA_SUCCESS) { DEBUG2_3_11(printk("%s(%ld): failed to issue Marker IOCB " - "(%x).\n", __func__, ha->host_no, rval);) + "(%x).\n", __func__, ha->host_no, rval)); } else { - DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no);) + DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); } atarget_done: @@ -2460,3 +2462,81 @@ qla2x00_stop_firmware(scsi_qla_host_t *ha) return rval; } + +int +qla2x00_trace_control(scsi_qla_host_t *ha, uint16_t ctrl, dma_addr_t eft_dma, + uint16_t buffers) +{ + int rval; + mbx_cmd_t mc; + mbx_cmd_t *mcp = &mc; + + if (!IS_QLA24XX(ha) && !IS_QLA54XX(ha)) + return QLA_FUNCTION_FAILED; + + DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); + + mcp->mb[0] = MBC_TRACE_CONTROL; + mcp->mb[1] = ctrl; + mcp->out_mb = MBX_1|MBX_0; + mcp->in_mb = MBX_1|MBX_0; + if (ctrl == TC_ENABLE) { + mcp->mb[2] = LSW(eft_dma); + mcp->mb[3] = MSW(eft_dma); + mcp->mb[4] = LSW(MSD(eft_dma)); + mcp->mb[5] = MSW(MSD(eft_dma)); + mcp->mb[6] = buffers; + mcp->mb[7] = buffers; + mcp->out_mb |= MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2; + } + mcp->tov = 30; + mcp->flags = 0; + rval = qla2x00_mailbox_command(ha, mcp); + + if (rval != QLA_SUCCESS) { + DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x.\n", + __func__, ha->host_no, rval, mcp->mb[0], mcp->mb[1])); + } else { + DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); + } + + return rval; +} + +int +qla2x00_read_sfp(scsi_qla_host_t *ha, dma_addr_t sfp_dma, uint16_t addr, + uint16_t off, uint16_t count) +{ + int rval; + mbx_cmd_t mc; + mbx_cmd_t *mcp = &mc; + + if (!IS_QLA24XX(ha) && !IS_QLA54XX(ha)) + return QLA_FUNCTION_FAILED; + + DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); + + mcp->mb[0] = MBC_READ_SFP; + mcp->mb[1] = addr; + mcp->mb[2] = MSW(sfp_dma); + mcp->mb[3] = LSW(sfp_dma); + mcp->mb[6] = MSW(MSD(sfp_dma)); + mcp->mb[7] = LSW(MSD(sfp_dma)); + mcp->mb[8] = count; + mcp->mb[9] = off; + mcp->mb[10] = 0; + mcp->out_mb = MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; + mcp->in_mb = MBX_0; + mcp->tov = 30; + mcp->flags = 0; + rval = qla2x00_mailbox_command(ha, mcp); + + if (rval != QLA_SUCCESS) { + DEBUG2_3_11(printk("%s(%ld): failed=%x (%x).\n", __func__, + ha->host_no, rval, mcp->mb[0])); + } else { + DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); + } + + return rval; +} diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 584fe5d8e..ef45f7490 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c @@ -39,14 +39,14 @@ MODULE_PARM_DESC(ql2xlogintimeout, int qlport_down_retry = 30; module_param(qlport_down_retry, int, S_IRUGO|S_IRUSR); MODULE_PARM_DESC(qlport_down_retry, - "Maximum number of command retries to a port that returns" + "Maximum number of command retries to a port that returns " "a PORT-DOWN status."); int ql2xplogiabsentdevice; module_param(ql2xplogiabsentdevice, int, S_IRUGO|S_IWUSR); MODULE_PARM_DESC(ql2xplogiabsentdevice, "Option to enable PLOGI to devices that are not present after " - "a Fabric scan. This is needed for several broken switches." + "a Fabric scan. This is needed for several broken switches. " "Default is 0 - no PLOGI. 1 - perfom PLOGI."); int ql2xloginretrycount = 0; @@ -54,12 +54,18 @@ module_param(ql2xloginretrycount, int, S_IRUGO|S_IRUSR); MODULE_PARM_DESC(ql2xloginretrycount, "Specify an alternate value for the NVRAM login retry count."); -#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 +int ql2xallocfwdump = 1; +module_param(ql2xallocfwdump, int, S_IRUGO|S_IRUSR); +MODULE_PARM_DESC(ql2xallocfwdump, + "Option to enable allocation of memory for a firmware dump " + "during HBA initialization. Memory allocation requirements " + "vary by ISP type. Default is 1 - allocate memory."); + +int extended_error_logging; +module_param(extended_error_logging, int, S_IRUGO|S_IRUSR); +MODULE_PARM_DESC(extended_error_logging, + "Option to enable extended error logging, " + "Default is 0 - no logging. 1 - log errors."); static void qla2x00_free_device(scsi_qla_host_t *); @@ -71,12 +77,6 @@ MODULE_PARM_DESC(ql2xfdmienable, "Enables FDMI registratons " "Default is 0 - no FDMI. 1 - perfom FDMI."); -int ql2xprocessrscn; -module_param(ql2xprocessrscn, int, S_IRUGO|S_IRUSR); -MODULE_PARM_DESC(ql2xprocessrscn, - "Option to enable port RSCN handling via a series of less" - "fabric intrusive ADISCs and PLOGIs."); - /* * SCSI host template entry points */ @@ -99,7 +99,7 @@ static int qla2x00_change_queue_type(struct scsi_device *, int); static struct scsi_host_template qla2x00_driver_template = { .module = THIS_MODULE, - .name = "qla2xxx", + .name = QLA2XXX_DRIVER_NAME, .queuecommand = qla2x00_queuecommand, .eh_abort_handler = qla2xxx_eh_abort, @@ -128,7 +128,7 @@ static struct scsi_host_template qla2x00_driver_template = { static struct scsi_host_template qla24xx_driver_template = { .module = THIS_MODULE, - .name = "qla2xxx", + .name = QLA2XXX_DRIVER_NAME, .queuecommand = qla24xx_queuecommand, .eh_abort_handler = qla2xxx_eh_abort, @@ -340,7 +340,6 @@ qla2x00_get_new_sp(scsi_qla_host_t *ha, fc_port_t *fcport, if (!sp) return sp; - atomic_set(&sp->ref_count, 1); sp->ha = ha; sp->fcport = fcport; sp->cmd = cmd; @@ -577,6 +576,10 @@ qla2x00_wait_for_loop_ready(scsi_qla_host_t *ha) while ((!atomic_read(&ha->loop_down_timer) && atomic_read(&ha->loop_state) == LOOP_DOWN) || atomic_read(&ha->loop_state) != LOOP_READY) { + if (atomic_read(&ha->loop_state) == LOOP_DEAD) { + return_status = QLA_FUNCTION_FAILED; + break; + } msleep(1000); if (time_after_eq(jiffies, loop_timeout)) { return_status = QLA_FUNCTION_FAILED; @@ -632,10 +635,9 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) if (sp->cmd != cmd) continue; - DEBUG2(printk("%s(%ld): aborting sp %p from RISC. pid=%ld " - "sp->state=%x\n", __func__, ha->host_no, sp, serial, - sp->state)); - DEBUG3(qla2x00_print_scsi_cmd(cmd);) + DEBUG2(printk("%s(%ld): aborting sp %p from RISC. pid=%ld.\n", + __func__, ha->host_no, sp, serial)); + DEBUG3(qla2x00_print_scsi_cmd(cmd)); spin_unlock_irqrestore(&ha->hardware_lock, flags); if (ha->isp_ops.abort_command(ha, sp)) { @@ -742,7 +744,6 @@ qla2xxx_eh_device_reset(struct scsi_cmnd *cmd) { scsi_qla_host_t *ha = to_qla_host(cmd->device->host); fc_port_t *fcport = (struct fc_port *) cmd->device->hostdata; - srb_t *sp; int ret; unsigned int id, lun; unsigned long serial; @@ -753,8 +754,7 @@ qla2xxx_eh_device_reset(struct scsi_cmnd *cmd) lun = cmd->device->lun; serial = cmd->serial_number; - sp = (srb_t *) CMD_SP(cmd); - if (!sp || !fcport) + if (!fcport) return ret; qla_printk(KERN_INFO, ha, @@ -777,7 +777,7 @@ qla2xxx_eh_device_reset(struct scsi_cmnd *cmd) #endif } else { DEBUG2(printk(KERN_INFO - "%s failed: loop not ready\n",__func__);) + "%s failed: loop not ready\n",__func__)); } if (ret == FAILED) { @@ -873,7 +873,6 @@ qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd) { scsi_qla_host_t *ha = to_qla_host(cmd->device->host); fc_port_t *fcport = (struct fc_port *) cmd->device->hostdata; - srb_t *sp; int ret; unsigned int id, lun; unsigned long serial; @@ -884,8 +883,7 @@ qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd) lun = cmd->device->lun; serial = cmd->serial_number; - sp = (srb_t *) CMD_SP(cmd); - if (!sp || !fcport) + if (!fcport) return ret; qla_printk(KERN_INFO, ha, @@ -934,7 +932,6 @@ qla2xxx_eh_host_reset(struct scsi_cmnd *cmd) { scsi_qla_host_t *ha = to_qla_host(cmd->device->host); fc_port_t *fcport = (struct fc_port *) cmd->device->hostdata; - srb_t *sp; int ret; unsigned int id, lun; unsigned long serial; @@ -945,8 +942,7 @@ qla2xxx_eh_host_reset(struct scsi_cmnd *cmd) lun = cmd->device->lun; serial = cmd->serial_number; - sp = (srb_t *) CMD_SP(cmd); - if (!sp || !fcport) + if (!fcport) return ret; qla_printk(KERN_INFO, ha, @@ -1032,12 +1028,12 @@ qla2x00_loop_reset(scsi_qla_host_t *ha) /* Empty */ DEBUG2_3(printk("%s(%ld): **** FAILED ****\n", __func__, - ha->host_no);) + ha->host_no)); } else { /* Empty */ DEBUG3(printk("%s(%ld): exiting normally.\n", __func__, - ha->host_no);) + ha->host_no)); } return(status); @@ -1157,18 +1153,22 @@ qla2x00_set_isp_flags(scsi_qla_host_t *ha) case PCI_DEVICE_ID_QLOGIC_ISP2100: ha->device_type |= DT_ISP2100; ha->device_type &= ~DT_EXTENDED_IDS; + ha->fw_srisc_address = RISC_START_ADDRESS_2100; break; case PCI_DEVICE_ID_QLOGIC_ISP2200: ha->device_type |= DT_ISP2200; ha->device_type &= ~DT_EXTENDED_IDS; + ha->fw_srisc_address = RISC_START_ADDRESS_2100; break; case PCI_DEVICE_ID_QLOGIC_ISP2300: ha->device_type |= DT_ISP2300; ha->device_type |= DT_ZIO_SUPPORTED; + ha->fw_srisc_address = RISC_START_ADDRESS_2300; break; case PCI_DEVICE_ID_QLOGIC_ISP2312: ha->device_type |= DT_ISP2312; ha->device_type |= DT_ZIO_SUPPORTED; + ha->fw_srisc_address = RISC_START_ADDRESS_2300; break; case PCI_DEVICE_ID_QLOGIC_ISP2322: ha->device_type |= DT_ISP2322; @@ -1176,26 +1176,33 @@ qla2x00_set_isp_flags(scsi_qla_host_t *ha) if (ha->pdev->subsystem_vendor == 0x1028 && ha->pdev->subsystem_device == 0x0170) ha->device_type |= DT_OEM_001; + ha->fw_srisc_address = RISC_START_ADDRESS_2300; break; case PCI_DEVICE_ID_QLOGIC_ISP6312: ha->device_type |= DT_ISP6312; + ha->fw_srisc_address = RISC_START_ADDRESS_2300; break; case PCI_DEVICE_ID_QLOGIC_ISP6322: ha->device_type |= DT_ISP6322; + ha->fw_srisc_address = RISC_START_ADDRESS_2300; break; case PCI_DEVICE_ID_QLOGIC_ISP2422: ha->device_type |= DT_ISP2422; ha->device_type |= DT_ZIO_SUPPORTED; + ha->fw_srisc_address = RISC_START_ADDRESS_2400; break; case PCI_DEVICE_ID_QLOGIC_ISP2432: ha->device_type |= DT_ISP2432; ha->device_type |= DT_ZIO_SUPPORTED; + ha->fw_srisc_address = RISC_START_ADDRESS_2400; break; case PCI_DEVICE_ID_QLOGIC_ISP5422: ha->device_type |= DT_ISP5422; + ha->fw_srisc_address = RISC_START_ADDRESS_2400; break; case PCI_DEVICE_ID_QLOGIC_ISP5432: ha->device_type |= DT_ISP5432; + ha->fw_srisc_address = RISC_START_ADDRESS_2400; break; } } @@ -1242,7 +1249,7 @@ qla2x00_iospace_config(scsi_qla_host_t *ha) goto iospace_error_exit; } - if (pci_request_regions(ha->pdev, ha->brd_info->drv_name)) { + if (pci_request_regions(ha->pdev, QLA2XXX_DRIVER_NAME)) { qla_printk(KERN_WARNING, ha, "Failed to reserve PIO/MMIO regions (%s)\n", pci_name(ha->pdev)); @@ -1324,7 +1331,8 @@ qla24xx_disable_intrs(scsi_qla_host_t *ha) /* * PCI driver interface */ -int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) +static int __devinit +qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) { int ret = -ENODEV; device_reg_t __iomem *reg; @@ -1358,8 +1366,7 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) ha->pdev = pdev; ha->host = host; ha->host_no = host->host_no; - ha->brd_info = brd_info; - sprintf(ha->host_str, "%s_%ld", ha->brd_info->drv_name, ha->host_no); + sprintf(ha->host_str, "%s_%ld", QLA2XXX_DRIVER_NAME, ha->host_no); /* Set ISP-type information. */ qla2x00_set_isp_flags(ha); @@ -1376,7 +1383,6 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) spin_lock_init(&ha->hardware_lock); ha->prev_topology = 0; - ha->ports = MAX_BUSES; ha->init_cb_size = sizeof(init_cb_t); ha->mgmt_svr_loop_id = MANAGEMENT_SERVER; ha->link_data_rate = LDR_UNKNOWN; @@ -1407,7 +1413,6 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) ha->isp_ops.read_nvram = qla2x00_read_nvram_data; ha->isp_ops.write_nvram = qla2x00_write_nvram_data; ha->isp_ops.fw_dump = qla2100_fw_dump; - ha->isp_ops.ascii_fw_dump = qla2100_ascii_fw_dump; ha->isp_ops.read_optrom = qla2x00_read_optrom_data; ha->isp_ops.write_optrom = qla2x00_write_optrom_data; if (IS_QLA2100(ha)) { @@ -1434,7 +1439,6 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) ha->isp_ops.pci_config = qla2300_pci_config; ha->isp_ops.intr_handler = qla2300_intr_handler; ha->isp_ops.fw_dump = qla2300_fw_dump; - ha->isp_ops.ascii_fw_dump = qla2300_ascii_fw_dump; ha->isp_ops.beacon_on = qla2x00_beacon_on; ha->isp_ops.beacon_off = qla2x00_beacon_off; ha->isp_ops.beacon_blink = qla2x00_beacon_blink; @@ -1457,10 +1461,6 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) 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; -#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; @@ -1475,7 +1475,6 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) ha->isp_ops.read_nvram = qla24xx_read_nvram_data; ha->isp_ops.write_nvram = qla24xx_write_nvram_data; ha->isp_ops.fw_dump = qla24xx_fw_dump; - ha->isp_ops.ascii_fw_dump = qla24xx_ascii_fw_dump; ha->isp_ops.read_optrom = qla24xx_read_optrom_data; ha->isp_ops.write_optrom = qla24xx_write_optrom_data; ha->isp_ops.beacon_on = qla24xx_beacon_on; @@ -1494,7 +1493,6 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) INIT_LIST_HEAD(&ha->list); INIT_LIST_HEAD(&ha->fcports); - INIT_LIST_HEAD(&ha->rscn_fcports); /* * These locks are used to prevent more than one CPU @@ -1543,12 +1541,12 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) host->cmd_per_lun = 3; host->unique_id = ha->instance; host->max_cmd_len = MAX_CMDSZ; - host->max_channel = ha->ports - 1; + host->max_channel = MAX_BUSES - 1; host->max_lun = MAX_LUNS; host->transportt = qla2xxx_transport_template; ret = request_irq(pdev->irq, ha->isp_ops.intr_handler, - SA_INTERRUPT|SA_SHIRQ, ha->brd_info->drv_name, ha); + IRQF_DISABLED|IRQF_SHARED, QLA2XXX_DRIVER_NAME, ha); if (ret) { qla_printk(KERN_WARNING, ha, "Failed to reserve interrupt %d already in use.\n", @@ -1646,9 +1644,9 @@ probe_disable_device: probe_out: return ret; } -EXPORT_SYMBOL_GPL(qla2x00_probe_one); -void qla2x00_remove_one(struct pci_dev *pdev) +static void __devexit +qla2x00_remove_one(struct pci_dev *pdev) { scsi_qla_host_t *ha; @@ -1666,15 +1664,10 @@ void qla2x00_remove_one(struct pci_dev *pdev) pci_set_drvdata(pdev, NULL); } -EXPORT_SYMBOL_GPL(qla2x00_remove_one); static void qla2x00_free_device(scsi_qla_host_t *ha) { - /* Abort any outstanding IO descriptors. */ - if (!IS_QLA2100(ha) && !IS_QLA2200(ha)) - qla2x00_cancel_io_descriptors(ha); - /* Disable timer */ if (ha->timer_active) qla2x00_stop_timer(ha); @@ -1691,6 +1684,9 @@ qla2x00_free_device(scsi_qla_host_t *ha) kthread_stop(t); } + if (ha->eft) + qla2x00_trace_control(ha, TC_DISABLE, 0, 0); + /* Stop currently executing firmware. */ qla2x00_stop_firmware(ha); @@ -1884,19 +1880,8 @@ qla2x00_mem_alloc(scsi_qla_host_t *ha) continue; } - ha->rlc_rsp = dma_alloc_coherent(&ha->pdev->dev, - sizeof(rpt_lun_cmd_rsp_t), &ha->rlc_rsp_dma, GFP_KERNEL); - if (ha->rlc_rsp == NULL) { - qla_printk(KERN_WARNING, ha, - "Memory Allocation failed - rlc"); - - qla2x00_mem_free(ha); - msleep(100); - - continue; - } - - snprintf(name, sizeof(name), "qla2xxx_%ld", ha->host_no); + snprintf(name, sizeof(name), "%s_%ld", QLA2XXX_DRIVER_NAME, + ha->host_no); ha->s_dma_pool = dma_pool_create(name, &ha->pdev->dev, DMA_POOL_SIZE, 8, 0); if (ha->s_dma_pool == NULL) { @@ -1923,32 +1908,6 @@ qla2x00_mem_alloc(scsi_qla_host_t *ha) } memset(ha->init_cb, 0, ha->init_cb_size); - /* Get consistent memory allocated for Get Port Database cmd */ - ha->iodesc_pd = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, - &ha->iodesc_pd_dma); - if (ha->iodesc_pd == NULL) { - /* error */ - qla_printk(KERN_WARNING, ha, - "Memory Allocation failed - iodesc_pd\n"); - - qla2x00_mem_free(ha); - msleep(100); - - continue; - } - memset(ha->iodesc_pd, 0, PORT_DATABASE_SIZE); - - /* Allocate ioctl related memory. */ - if (qla2x00_alloc_ioctl_mem(ha)) { - qla_printk(KERN_WARNING, ha, - "Memory Allocation failed - ioctl_mem\n"); - - qla2x00_mem_free(ha); - msleep(100); - - continue; - } - if (qla2x00_allocate_sp_pool(ha)) { qla_printk(KERN_WARNING, ha, "Memory Allocation failed - " @@ -2011,6 +1970,26 @@ qla2x00_mem_alloc(scsi_qla_host_t *ha) continue; } memset(ha->ct_sns, 0, sizeof(struct ct_sns_pkt)); + + if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { + /* + * Get consistent memory allocated for SFP + * block. + */ + ha->sfp_data = dma_pool_alloc(ha->s_dma_pool, + GFP_KERNEL, &ha->sfp_data_dma); + if (ha->sfp_data == NULL) { + qla_printk(KERN_WARNING, ha, + "Memory Allocation failed - " + "sfp_data\n"); + + qla2x00_mem_free(ha); + msleep(100); + + continue; + } + memset(ha->sfp_data, 0, SFP_BLOCK_SIZE); + } } /* Done all allocations without any error. */ @@ -2045,12 +2024,16 @@ qla2x00_mem_free(scsi_qla_host_t *ha) return; } - /* free ioctl memory */ - qla2x00_free_ioctl_mem(ha); - /* free sp pool */ qla2x00_free_sp_pool(ha); + if (ha->fw_dump) { + if (ha->eft) + dma_free_coherent(&ha->pdev->dev, + ntohl(ha->fw_dump->eft_size), ha->eft, ha->eft_dma); + vfree(ha->fw_dump); + } + if (ha->sns_cmd) dma_free_coherent(&ha->pdev->dev, sizeof(struct sns_cmd_pkt), ha->sns_cmd, ha->sns_cmd_dma); @@ -2059,23 +2042,18 @@ qla2x00_mem_free(scsi_qla_host_t *ha) dma_free_coherent(&ha->pdev->dev, sizeof(struct ct_sns_pkt), ha->ct_sns, ha->ct_sns_dma); + if (ha->sfp_data) + dma_pool_free(ha->s_dma_pool, ha->sfp_data, ha->sfp_data_dma); + if (ha->ms_iocb) dma_pool_free(ha->s_dma_pool, ha->ms_iocb, ha->ms_iocb_dma); - if (ha->iodesc_pd) - dma_pool_free(ha->s_dma_pool, ha->iodesc_pd, ha->iodesc_pd_dma); - if (ha->init_cb) dma_pool_free(ha->s_dma_pool, ha->init_cb, ha->init_cb_dma); if (ha->s_dma_pool) dma_pool_destroy(ha->s_dma_pool); - if (ha->rlc_rsp) - dma_free_coherent(&ha->pdev->dev, - sizeof(rpt_lun_cmd_rsp_t), ha->rlc_rsp, - ha->rlc_rsp_dma); - if (ha->gid_list) dma_free_coherent(&ha->pdev->dev, GID_LIST_SIZE, ha->gid_list, ha->gid_list_dma); @@ -2090,21 +2068,19 @@ qla2x00_mem_free(scsi_qla_host_t *ha) (ha->request_q_length + 1) * sizeof(request_t), ha->request_ring, ha->request_dma); + ha->eft = NULL; + ha->eft_dma = 0; ha->sns_cmd = NULL; ha->sns_cmd_dma = 0; ha->ct_sns = NULL; ha->ct_sns_dma = 0; ha->ms_iocb = NULL; ha->ms_iocb_dma = 0; - ha->iodesc_pd = NULL; - ha->iodesc_pd_dma = 0; ha->init_cb = NULL; ha->init_cb_dma = 0; ha->s_dma_pool = NULL; - ha->rlc_rsp = NULL; - ha->rlc_rsp_dma = 0; ha->gid_list = NULL; ha->gid_list_dma = 0; @@ -2122,18 +2098,9 @@ qla2x00_mem_free(scsi_qla_host_t *ha) } INIT_LIST_HEAD(&ha->fcports); - if (ha->fw_dump) - free_pages((unsigned long)ha->fw_dump, ha->fw_dump_order); - - vfree(ha->fw_dump24); - - vfree(ha->fw_dump_buffer); - ha->fw_dump = NULL; - ha->fw_dump24 = NULL; ha->fw_dumped = 0; ha->fw_dump_reading = 0; - ha->fw_dump_buffer = NULL; vfree(ha->optrom_buffer); } @@ -2148,8 +2115,6 @@ qla2x00_mem_free(scsi_qla_host_t *ha) * * Context: * Kernel context. - * - * Note: Sets the ref_count for non Null sp to one. */ static int qla2x00_allocate_sp_pool(scsi_qla_host_t *ha) @@ -2273,9 +2238,6 @@ qla2x00_do_dpc(void *data) next_loopid = 0; list_for_each_entry(fcport, &ha->fcports, list) { - if (fcport->port_type != FCT_TARGET) - continue; - /* * If the port is not ONLINE then try to login * to it if we haven't run out of retries. @@ -2593,14 +2555,6 @@ qla2x00_down_timeout(struct semaphore *sema, unsigned long timeout) return -ETIMEDOUT; } -#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 5 @@ -2612,12 +2566,14 @@ qla2x00_down_timeout(struct semaphore *sema, unsigned long timeout) static DECLARE_MUTEX(qla_fw_lock); +extern struct firmware ql2100_fw, ql2200_fw, ql2300_fw, ql2322_fw, ql2400_fw; + 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 = "ql2400_fw.bin", }, + { .name = "ql2100_fw.bin", .segs = { 0x1000, 0 }, .fw = &ql2100_fw }, + { .name = "ql2200_fw.bin", .segs = { 0x1000, 0 }, .fw = &ql2200_fw }, + { .name = "ql2300_fw.bin", .segs = { 0x800, 0 }, .fw = &ql2300_fw }, + { .name = "ql2322_fw.bin", .segs = { 0x800, 0x1c000, 0x1e000, 0 }, .fw = &ql2322_fw }, + { .name = "ql2400_fw.bin", .fw = &ql2400_fw }, }; struct fw_blob * @@ -2667,73 +2623,32 @@ qla2x00_release_firmware(void) up(&qla_fw_lock); } -static struct qla_board_info qla_board_tbl = { - .drv_name = "qla2xxx", -}; - static struct pci_device_id qla2xxx_pci_tbl[] = { - { 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, }, - { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5422, - PCI_ANY_ID, PCI_ANY_ID, }, - { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5432, - PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2100) }, + { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2200) }, + { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2300) }, + { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2312) }, + { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2322) }, + { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP6312) }, + { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP6322) }, + { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2422) }, + { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2432) }, + { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5422) }, + { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5432) }, { 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, &qla_board_tbl); -} - -static void __devexit -qla2xxx_remove_one(struct pci_dev *pdev) -{ - qla2x00_remove_one(pdev); -} - static struct pci_driver qla2xxx_pci_driver = { - .name = "qla2xxx", + .name = QLA2XXX_DRIVER_NAME, .driver = { .owner = THIS_MODULE, }, .id_table = qla2xxx_pci_tbl, - .probe = qla2xxx_probe_one, - .remove = __devexit_p(qla2xxx_remove_one), + .probe = qla2x00_probe_one, + .remove = __devexit_p(qla2x00_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. **/ @@ -2753,19 +2668,16 @@ 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 + if (extended_error_logging) + strcat(qla2x00_version_str, "-debug"); + qla2xxx_transport_template = fc_attach_transport(&qla2xxx_transport_functions); if (!qla2xxx_transport_template) return -ENODEV; printk(KERN_INFO "QLogic Fibre Channel HBA Driver\n"); - ret = qla2x00_pci_module_init(); + ret = pci_register_driver(&qla2xxx_pci_driver); if (ret) { kmem_cache_destroy(srb_cachep); fc_release_transport(qla2xxx_transport_template); @@ -2779,8 +2691,8 @@ qla2x00_module_init(void) static void __exit qla2x00_module_exit(void) { - qla2x00_pci_module_exit(); - qla2x00_release_firmware(); + pci_unregister_driver(&qla2xxx_pci_driver); + /* qla2x00_release_firmware(); */ kmem_cache_destroy(srb_cachep); fc_release_transport(qla2xxx_transport_template); } diff --git a/drivers/scsi/qla2xxx/qla_rscn.c b/drivers/scsi/qla2xxx/qla_rscn.c deleted file mode 100644 index b70bebe18..000000000 --- a/drivers/scsi/qla2xxx/qla_rscn.c +++ /dev/null @@ -1,1426 +0,0 @@ -/* - * QLogic Fibre Channel HBA Driver - * Copyright (c) 2003-2005 QLogic Corporation - * - * See LICENSE.qla2xxx for copyright and licensing details. - */ -#include "qla_def.h" - -/** - * IO descriptor handle definitions. - * - * Signature form: - * - * |31------28|27-------------------12|11-------0| - * | Type | Rolling Signature | Index | - * |----------|-----------------------|----------| - * - **/ - -#define HDL_TYPE_SCSI 0 -#define HDL_TYPE_ASYNC_IOCB 0x0A - -#define HDL_INDEX_BITS 12 -#define HDL_ITER_BITS 16 -#define HDL_TYPE_BITS 4 - -#define HDL_INDEX_MASK ((1UL << HDL_INDEX_BITS) - 1) -#define HDL_ITER_MASK ((1UL << HDL_ITER_BITS) - 1) -#define HDL_TYPE_MASK ((1UL << HDL_TYPE_BITS) - 1) - -#define HDL_INDEX_SHIFT 0 -#define HDL_ITER_SHIFT (HDL_INDEX_SHIFT + HDL_INDEX_BITS) -#define HDL_TYPE_SHIFT (HDL_ITER_SHIFT + HDL_ITER_BITS) - -/* Local Prototypes. */ -static inline uint32_t qla2x00_to_handle(uint16_t, uint16_t, uint16_t); -static inline uint16_t qla2x00_handle_to_idx(uint32_t); -static inline uint32_t qla2x00_iodesc_to_handle(struct io_descriptor *); -static inline struct io_descriptor *qla2x00_handle_to_iodesc(scsi_qla_host_t *, - uint32_t); - -static inline struct io_descriptor *qla2x00_alloc_iodesc(scsi_qla_host_t *); -static inline void qla2x00_free_iodesc(struct io_descriptor *); -static inline void qla2x00_init_io_descriptors(scsi_qla_host_t *); - -static void qla2x00_iodesc_timeout(unsigned long); -static inline void qla2x00_add_iodesc_timer(struct io_descriptor *); -static inline void qla2x00_remove_iodesc_timer(struct io_descriptor *); - -static inline void qla2x00_update_login_fcport(scsi_qla_host_t *, - struct mbx_entry *, fc_port_t *); - -static int qla2x00_send_abort_iocb(scsi_qla_host_t *, struct io_descriptor *, - uint32_t, int); -static int qla2x00_send_abort_iocb_cb(scsi_qla_host_t *, struct io_descriptor *, - struct mbx_entry *); - -static int qla2x00_send_adisc_iocb(scsi_qla_host_t *, struct io_descriptor *, - int); -static int qla2x00_send_adisc_iocb_cb(scsi_qla_host_t *, struct io_descriptor *, - struct mbx_entry *); - -static int qla2x00_send_logout_iocb(scsi_qla_host_t *, struct io_descriptor *, - int); -static int qla2x00_send_logout_iocb_cb(scsi_qla_host_t *, - struct io_descriptor *, struct mbx_entry *); - -static int qla2x00_send_login_iocb(scsi_qla_host_t *, struct io_descriptor *, - port_id_t *, int); -static int qla2x00_send_login_iocb_cb(scsi_qla_host_t *, struct io_descriptor *, - struct mbx_entry *); - -/** - * Mailbox IOCB callback array. - **/ -static int (*iocb_function_cb_list[LAST_IOCB_CB]) - (scsi_qla_host_t *, struct io_descriptor *, struct mbx_entry *) = { - - qla2x00_send_abort_iocb_cb, - qla2x00_send_adisc_iocb_cb, - qla2x00_send_logout_iocb_cb, - qla2x00_send_login_iocb_cb, -}; - - -/** - * Generic IO descriptor handle routines. - **/ - -/** - * qla2x00_to_handle() - Create a descriptor handle. - * @type: descriptor type - * @iter: descriptor rolling signature - * @idx: index to the descriptor array - * - * Returns a composite handle based in the @type, @iter, and @idx. - */ -static inline uint32_t -qla2x00_to_handle(uint16_t type, uint16_t iter, uint16_t idx) -{ - return ((uint32_t)(((uint32_t)type << HDL_TYPE_SHIFT) | - ((uint32_t)iter << HDL_ITER_SHIFT) | - ((uint32_t)idx << HDL_INDEX_SHIFT))); -} - -/** - * qla2x00_handle_to_idx() - Retrive the index for a given handle. - * @handle: descriptor handle - * - * Returns the index specified by the @handle. - */ -static inline uint16_t -qla2x00_handle_to_idx(uint32_t handle) -{ - return ((uint16_t)(((handle) >> HDL_INDEX_SHIFT) & HDL_INDEX_MASK)); -} - -/** - * qla2x00_iodesc_to_handle() - Convert an IO descriptor to a unique handle. - * @iodesc: io descriptor - * - * Returns a unique handle for @iodesc. - */ -static inline uint32_t -qla2x00_iodesc_to_handle(struct io_descriptor *iodesc) -{ - uint32_t handle; - - handle = qla2x00_to_handle(HDL_TYPE_ASYNC_IOCB, - ++iodesc->ha->iodesc_signature, iodesc->idx); - iodesc->signature = handle; - - return (handle); -} - -/** - * qla2x00_handle_to_iodesc() - Retrieve an IO descriptor given a unique handle. - * @ha: HA context - * @handle: handle to io descriptor - * - * Returns a pointer to the io descriptor, or NULL, if the io descriptor does - * not exist or the io descriptors signature does not @handle. - */ -static inline struct io_descriptor * -qla2x00_handle_to_iodesc(scsi_qla_host_t *ha, uint32_t handle) -{ - uint16_t idx; - struct io_descriptor *iodesc; - - idx = qla2x00_handle_to_idx(handle); - iodesc = &ha->io_descriptors[idx]; - if (iodesc) - if (iodesc->signature != handle) - iodesc = NULL; - - return (iodesc); -} - - -/** - * IO descriptor allocation routines. - **/ - -/** - * qla2x00_alloc_iodesc() - Allocate an IO descriptor from the pool. - * @ha: HA context - * - * Returns a pointer to the allocated io descriptor, or NULL, if none available. - */ -static inline struct io_descriptor * -qla2x00_alloc_iodesc(scsi_qla_host_t *ha) -{ - uint16_t iter; - struct io_descriptor *iodesc; - - iodesc = NULL; - for (iter = 0; iter < MAX_IO_DESCRIPTORS; iter++) { - if (ha->io_descriptors[iter].used) - continue; - - iodesc = &ha->io_descriptors[iter]; - iodesc->used = 1; - iodesc->idx = iter; - init_timer(&iodesc->timer); - iodesc->ha = ha; - iodesc->signature = qla2x00_iodesc_to_handle(iodesc); - break; - } - - return (iodesc); -} - -/** - * qla2x00_free_iodesc() - Free an IO descriptor. - * @iodesc: io descriptor - * - * NOTE: The io descriptors timer *must* be stopped before it can be free'd. - */ -static inline void -qla2x00_free_iodesc(struct io_descriptor *iodesc) -{ - iodesc->used = 0; - iodesc->signature = 0; -} - -/** - * qla2x00_remove_iodesc_timer() - Remove an active timer from an IO descriptor. - * @iodesc: io descriptor - */ -static inline void -qla2x00_remove_iodesc_timer(struct io_descriptor *iodesc) -{ - if (iodesc->timer.function != NULL) { - del_timer_sync(&iodesc->timer); - iodesc->timer.data = (unsigned long) NULL; - iodesc->timer.function = NULL; - } -} - -/** - * qla2x00_init_io_descriptors() - Initialize the pool of IO descriptors. - * @ha: HA context - */ -static inline void -qla2x00_init_io_descriptors(scsi_qla_host_t *ha) -{ - uint16_t iter; - - for (iter = 0; iter < MAX_IO_DESCRIPTORS; iter++) { - if (!ha->io_descriptors[iter].used) - continue; - - qla2x00_remove_iodesc_timer(&ha->io_descriptors[iter]); - qla2x00_free_iodesc(&ha->io_descriptors[iter]); - } -} - - -/** - * IO descriptor timer routines. - **/ - -/** - * qla2x00_iodesc_timeout() - Timeout IO descriptor handler. - * @data: io descriptor - */ -static void -qla2x00_iodesc_timeout(unsigned long data) -{ - struct io_descriptor *iodesc; - - iodesc = (struct io_descriptor *) data; - - DEBUG14(printk("scsi(%ld): IO descriptor timeout, index=%x " - "signature=%08x, scheduling ISP abort.\n", iodesc->ha->host_no, - iodesc->idx, iodesc->signature)); - - qla2x00_free_iodesc(iodesc); - - qla_printk(KERN_WARNING, iodesc->ha, - "IO descriptor timeout. Scheduling ISP abort.\n"); - set_bit(ISP_ABORT_NEEDED, &iodesc->ha->dpc_flags); -} - -/** - * qla2x00_add_iodesc_timer() - Add and start a timer for an IO descriptor. - * @iodesc: io descriptor - * - * NOTE: - * The firmware shall timeout an outstanding mailbox IOCB in 2 * R_A_TOV (in - * tenths of a second) after it hits the wire. But, if there are any request - * resource contraints (i.e. during heavy I/O), exchanges can be held off for - * at most R_A_TOV. Therefore, the driver will wait 4 * R_A_TOV before - * scheduling a recovery (big hammer). - */ -static inline void -qla2x00_add_iodesc_timer(struct io_descriptor *iodesc) -{ - unsigned long timeout; - - timeout = (iodesc->ha->r_a_tov * 4) / 10; - init_timer(&iodesc->timer); - iodesc->timer.data = (unsigned long) iodesc; - iodesc->timer.expires = jiffies + (timeout * HZ); - iodesc->timer.function = - (void (*) (unsigned long)) qla2x00_iodesc_timeout; - add_timer(&iodesc->timer); -} - -/** - * IO descriptor support routines. - **/ - -/** - * qla2x00_update_login_fcport() - Update fcport data after login processing. - * @ha: HA context - * @mbxstat: Mailbox command status IOCB - * @fcport: port to update - */ -static inline void -qla2x00_update_login_fcport(scsi_qla_host_t *ha, struct mbx_entry *mbxstat, - fc_port_t *fcport) -{ - if (le16_to_cpu(mbxstat->mb1) & BIT_0) { - fcport->port_type = FCT_INITIATOR; - } else { - fcport->port_type = FCT_TARGET; - if (le16_to_cpu(mbxstat->mb1) & BIT_1) { - fcport->flags |= FCF_TAPE_PRESENT; - } - } - fcport->login_retry = 0; - fcport->port_login_retry_count = ha->port_down_retry_count * - PORT_RETRY_TIME; - atomic_set(&fcport->port_down_timer, ha->port_down_retry_count * - PORT_RETRY_TIME); - fcport->flags |= FCF_FABRIC_DEVICE; - fcport->flags &= ~FCF_FAILOVER_NEEDED; - fcport->iodesc_idx_sent = IODESC_INVALID_INDEX; - atomic_set(&fcport->state, FCS_ONLINE); - schedule_work(&fcport->rport_add_work); -} - - -/** - * Mailbox IOCB commands. - **/ - -/** - * qla2x00_get_mbx_iocb_entry() - Retrieve an IOCB from the request queue. - * @ha: HA context - * @handle: handle to io descriptor - * - * Returns a pointer to the reqest entry, or NULL, if none were available. - */ -static inline struct mbx_entry * -qla2x00_get_mbx_iocb_entry(scsi_qla_host_t *ha, uint32_t handle) -{ - uint16_t cnt; - struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; - struct mbx_entry *mbxentry; - - mbxentry = NULL; - - if (ha->req_q_cnt < 3) { - cnt = qla2x00_debounce_register(ISP_REQ_Q_OUT(ha, reg)); - if (ha->req_ring_index < cnt) - ha->req_q_cnt = cnt - ha->req_ring_index; - else - ha->req_q_cnt = ha->request_q_length - - (ha->req_ring_index - cnt); - } - if (ha->req_q_cnt >= 3) { - mbxentry = (struct mbx_entry *)ha->request_ring_ptr; - - memset(mbxentry, 0, sizeof(struct mbx_entry)); - mbxentry->entry_type = MBX_IOCB_TYPE; - mbxentry->entry_count = 1; - mbxentry->sys_define1 = SOURCE_ASYNC_IOCB; - mbxentry->handle = handle; - } - return (mbxentry); -} - -/** - * qla2x00_send_abort_iocb() - Issue an abort IOCB to the firmware. - * @ha: HA context - * @iodesc: io descriptor - * @handle_to_abort: firmware handle to abort - * @ha_locked: is function called with the hardware lock - * - * Returns QLA_SUCCESS if the IOCB was issued. - */ -static int -qla2x00_send_abort_iocb(scsi_qla_host_t *ha, struct io_descriptor *iodesc, - uint32_t handle_to_abort, int ha_locked) -{ - unsigned long flags = 0; - struct mbx_entry *mbxentry; - - /* Send marker if required. */ - if (qla2x00_issue_marker(ha, ha_locked) != QLA_SUCCESS) - return (QLA_FUNCTION_FAILED); - - if (!ha_locked) - spin_lock_irqsave(&ha->hardware_lock, flags); - - /* Build abort mailbox IOCB. */ - mbxentry = qla2x00_get_mbx_iocb_entry(ha, iodesc->signature); - if (mbxentry == NULL) { - if (!ha_locked) - spin_unlock_irqrestore(&ha->hardware_lock, flags); - - return (QLA_FUNCTION_FAILED); - } - mbxentry->mb0 = __constant_cpu_to_le16(MBC_ABORT_COMMAND); - mbxentry->mb1 = mbxentry->loop_id.extended = - cpu_to_le16(iodesc->remote_fcport->loop_id); - mbxentry->mb2 = LSW(handle_to_abort); - mbxentry->mb3 = MSW(handle_to_abort); - wmb(); - - qla2x00_add_iodesc_timer(iodesc); - - /* Issue command to ISP. */ - qla2x00_isp_cmd(ha); - - if (!ha_locked) - spin_unlock_irqrestore(&ha->hardware_lock, flags); - - DEBUG14(printk("scsi(%ld): Sending Abort IOCB (%08x) to [%x], aborting " - "%08x.\n", ha->host_no, iodesc->signature, - iodesc->remote_fcport->loop_id, handle_to_abort)); - - return (QLA_SUCCESS); -} - -/** - * qla2x00_send_abort_iocb_cb() - Abort IOCB callback. - * @ha: HA context - * @iodesc: io descriptor - * @mbxstat: mailbox status IOCB - * - * Returns QLA_SUCCESS if @iodesc can be freed by the caller, else, @iodesc - * will be used for a retry. - */ -static int -qla2x00_send_abort_iocb_cb(scsi_qla_host_t *ha, struct io_descriptor *iodesc, - struct mbx_entry *mbxstat) -{ - DEBUG14(printk("scsi(%ld): Abort IOCB -- sent to [%x/%02x%02x%02x], " - "status=%x mb0=%x.\n", ha->host_no, iodesc->remote_fcport->loop_id, - iodesc->d_id.b.domain, iodesc->d_id.b.area, iodesc->d_id.b.al_pa, - le16_to_cpu(mbxstat->status), le16_to_cpu(mbxstat->mb0))); - - return (QLA_SUCCESS); -} - - -/** - * qla2x00_send_adisc_iocb() - Issue a Get Port Database IOCB to the firmware. - * @ha: HA context - * @iodesc: io descriptor - * @ha_locked: is function called with the hardware lock - * - * Returns QLA_SUCCESS if the IOCB was issued. - */ -static int -qla2x00_send_adisc_iocb(scsi_qla_host_t *ha, struct io_descriptor *iodesc, - int ha_locked) -{ - unsigned long flags = 0; - struct mbx_entry *mbxentry; - - /* Send marker if required. */ - if (qla2x00_issue_marker(ha, ha_locked) != QLA_SUCCESS) - return (QLA_FUNCTION_FAILED); - - if (!ha_locked) - spin_lock_irqsave(&ha->hardware_lock, flags); - - /* Build Get Port Database IOCB. */ - mbxentry = qla2x00_get_mbx_iocb_entry(ha, iodesc->signature); - if (mbxentry == NULL) { - if (!ha_locked) - spin_unlock_irqrestore(&ha->hardware_lock, flags); - - return (QLA_FUNCTION_FAILED); - } - mbxentry->mb0 = __constant_cpu_to_le16(MBC_GET_PORT_DATABASE); - mbxentry->mb1 = mbxentry->loop_id.extended = - cpu_to_le16(iodesc->remote_fcport->loop_id); - mbxentry->mb2 = cpu_to_le16(MSW(LSD(ha->iodesc_pd_dma))); - mbxentry->mb3 = cpu_to_le16(LSW(LSD(ha->iodesc_pd_dma))); - mbxentry->mb6 = cpu_to_le16(MSW(MSD(ha->iodesc_pd_dma))); - mbxentry->mb7 = cpu_to_le16(LSW(MSD(ha->iodesc_pd_dma))); - mbxentry->mb10 = __constant_cpu_to_le16(BIT_0); - wmb(); - - qla2x00_add_iodesc_timer(iodesc); - - /* Issue command to ISP. */ - qla2x00_isp_cmd(ha); - - if (!ha_locked) - spin_unlock_irqrestore(&ha->hardware_lock, flags); - - DEBUG14(printk("scsi(%ld): Sending Adisc IOCB (%08x) to [%x].\n", - ha->host_no, iodesc->signature, iodesc->remote_fcport->loop_id)); - - return (QLA_SUCCESS); -} - -/** - * qla2x00_send_adisc_iocb_cb() - Get Port Database IOCB callback. - * @ha: HA context - * @iodesc: io descriptor - * @mbxstat: mailbox status IOCB - * - * Returns QLA_SUCCESS if @iodesc can be freed by the caller, else, @iodesc - * will be used for a retry. - */ -static int -qla2x00_send_adisc_iocb_cb(scsi_qla_host_t *ha, struct io_descriptor *iodesc, - struct mbx_entry *mbxstat) -{ - fc_port_t *remote_fcport; - - remote_fcport = iodesc->remote_fcport; - - /* Ensure the port IDs are consistent. */ - if (remote_fcport->d_id.b24 != iodesc->d_id.b24) { - DEBUG14(printk("scsi(%ld): Adisc IOCB -- ignoring, remote port " - "id changed from [%02x%02x%02x] to [%02x%02x%02x].\n", - ha->host_no, remote_fcport->d_id.b.domain, - remote_fcport->d_id.b.area, remote_fcport->d_id.b.al_pa, - iodesc->d_id.b.domain, iodesc->d_id.b.area, - iodesc->d_id.b.al_pa)); - - return (QLA_SUCCESS); - } - - /* Only process the last command. */ - if (remote_fcport->iodesc_idx_sent != iodesc->idx) { - DEBUG14(printk("scsi(%ld): Adisc IOCB -- ignoring, sent to " - "[%02x%02x%02x], expected %x, received %x.\n", ha->host_no, - iodesc->d_id.b.domain, iodesc->d_id.b.area, - iodesc->d_id.b.al_pa, remote_fcport->iodesc_idx_sent, - iodesc->idx)); - - return (QLA_SUCCESS); - } - - if (le16_to_cpu(mbxstat->status) == CS_COMPLETE) { - DEBUG14(printk("scsi(%ld): Adisc IOCB -- marking " - "[%x/%02x%02x%02x] online.\n", ha->host_no, - remote_fcport->loop_id, remote_fcport->d_id.b.domain, - remote_fcport->d_id.b.area, remote_fcport->d_id.b.al_pa)); - - atomic_set(&remote_fcport->state, FCS_ONLINE); - } else { - DEBUG14(printk("scsi(%ld): Adisc IOCB -- marking " - "[%x/%02x%02x%02x] lost, status=%x mb0=%x.\n", ha->host_no, - remote_fcport->loop_id, remote_fcport->d_id.b.domain, - remote_fcport->d_id.b.area, remote_fcport->d_id.b.al_pa, - le16_to_cpu(mbxstat->status), le16_to_cpu(mbxstat->mb0))); - - if (atomic_read(&remote_fcport->state) != FCS_DEVICE_DEAD) - atomic_set(&remote_fcport->state, FCS_DEVICE_LOST); - } - remote_fcport->iodesc_idx_sent = IODESC_INVALID_INDEX; - - return (QLA_SUCCESS); -} - - -/** - * qla2x00_send_logout_iocb() - Issue a fabric port logout IOCB to the firmware. - * @ha: HA context - * @iodesc: io descriptor - * @ha_locked: is function called with the hardware lock - * - * Returns QLA_SUCCESS if the IOCB was issued. - */ -static int -qla2x00_send_logout_iocb(scsi_qla_host_t *ha, struct io_descriptor *iodesc, - int ha_locked) -{ - unsigned long flags = 0; - struct mbx_entry *mbxentry; - - /* Send marker if required. */ - if (qla2x00_issue_marker(ha, ha_locked) != QLA_SUCCESS) - return (QLA_FUNCTION_FAILED); - - if (!ha_locked) - spin_lock_irqsave(&ha->hardware_lock, flags); - - /* Build fabric port logout mailbox IOCB. */ - mbxentry = qla2x00_get_mbx_iocb_entry(ha, iodesc->signature); - if (mbxentry == NULL) { - if (!ha_locked) - spin_unlock_irqrestore(&ha->hardware_lock, flags); - - return (QLA_FUNCTION_FAILED); - } - mbxentry->mb0 = __constant_cpu_to_le16(MBC_LOGOUT_FABRIC_PORT); - mbxentry->mb1 = mbxentry->loop_id.extended = - cpu_to_le16(iodesc->remote_fcport->loop_id); - wmb(); - - qla2x00_add_iodesc_timer(iodesc); - - /* Issue command to ISP. */ - qla2x00_isp_cmd(ha); - - if (!ha_locked) - spin_unlock_irqrestore(&ha->hardware_lock, flags); - - DEBUG14(printk("scsi(%ld): Sending Logout IOCB (%08x) to [%x].\n", - ha->host_no, iodesc->signature, iodesc->remote_fcport->loop_id)); - - return (QLA_SUCCESS); -} - -/** - * qla2x00_send_logout_iocb_cb() - Fabric port logout IOCB callback. - * @ha: HA context - * @iodesc: io descriptor - * @mbxstat: mailbox status IOCB - * - * Returns QLA_SUCCESS if @iodesc can be freed by the caller, else, @iodesc - * will be used for a retry. - */ -static int -qla2x00_send_logout_iocb_cb(scsi_qla_host_t *ha, struct io_descriptor *iodesc, - struct mbx_entry *mbxstat) -{ - DEBUG14(printk("scsi(%ld): Logout IOCB -- sent to [%x/%02x%02x%02x], " - "status=%x mb0=%x mb1=%x.\n", ha->host_no, - iodesc->remote_fcport->loop_id, - iodesc->remote_fcport->d_id.b.domain, - iodesc->remote_fcport->d_id.b.area, - iodesc->remote_fcport->d_id.b.al_pa, le16_to_cpu(mbxstat->status), - le16_to_cpu(mbxstat->mb0), le16_to_cpu(mbxstat->mb1))); - - return (QLA_SUCCESS); -} - - -/** - * qla2x00_send_login_iocb() - Issue a fabric port login IOCB to the firmware. - * @ha: HA context - * @iodesc: io descriptor - * @d_id: port id for device - * @ha_locked: is function called with the hardware lock - * - * Returns QLA_SUCCESS if the IOCB was issued. - */ -static int -qla2x00_send_login_iocb(scsi_qla_host_t *ha, struct io_descriptor *iodesc, - port_id_t *d_id, int ha_locked) -{ - unsigned long flags = 0; - struct mbx_entry *mbxentry; - - /* Send marker if required. */ - if (qla2x00_issue_marker(ha, ha_locked) != QLA_SUCCESS) - return (QLA_FUNCTION_FAILED); - - if (!ha_locked) - spin_lock_irqsave(&ha->hardware_lock, flags); - - /* Build fabric port login mailbox IOCB. */ - mbxentry = qla2x00_get_mbx_iocb_entry(ha, iodesc->signature); - if (mbxentry == NULL) { - if (!ha_locked) - spin_unlock_irqrestore(&ha->hardware_lock, flags); - - return (QLA_FUNCTION_FAILED); - } - mbxentry->mb0 = __constant_cpu_to_le16(MBC_LOGIN_FABRIC_PORT); - mbxentry->mb1 = mbxentry->loop_id.extended = - cpu_to_le16(iodesc->remote_fcport->loop_id); - mbxentry->mb2 = cpu_to_le16(d_id->b.domain); - mbxentry->mb3 = cpu_to_le16(d_id->b.area << 8 | d_id->b.al_pa); - mbxentry->mb10 = __constant_cpu_to_le16(BIT_0); - wmb(); - - qla2x00_add_iodesc_timer(iodesc); - - /* Issue command to ISP. */ - qla2x00_isp_cmd(ha); - - if (!ha_locked) - spin_unlock_irqrestore(&ha->hardware_lock, flags); - - DEBUG14(printk("scsi(%ld): Sending Login IOCB (%08x) to " - "[%x/%02x%02x%02x].\n", ha->host_no, iodesc->signature, - iodesc->remote_fcport->loop_id, d_id->b.domain, d_id->b.area, - d_id->b.al_pa)); - - return (QLA_SUCCESS); -} - -/** - * qla2x00_send_login_iocb_cb() - Fabric port logout IOCB callback. - * @ha: HA context - * @iodesc: io descriptor - * @mbxstat: mailbox status IOCB - * - * Returns QLA_SUCCESS if @iodesc can be freed by the caller, else, @iodesc - * will be used for a retry. - */ -static int -qla2x00_send_login_iocb_cb(scsi_qla_host_t *ha, struct io_descriptor *iodesc, - struct mbx_entry *mbxstat) -{ - int rval; - fc_port_t *fcport, *remote_fcport, *exist_fcport; - struct io_descriptor *abort_iodesc, *login_iodesc; - uint16_t status, mb[8]; - uint16_t reuse; - uint16_t remote_loopid; - port_id_t remote_did, inuse_did; - - remote_fcport = iodesc->remote_fcport; - - /* Only process the last command. */ - if (remote_fcport->iodesc_idx_sent != iodesc->idx) { - DEBUG14(printk("scsi(%ld): Login IOCB -- ignoring, sent to " - "[%02x%02x%02x], expected %x, received %x.\n", - ha->host_no, iodesc->d_id.b.domain, iodesc->d_id.b.area, - iodesc->d_id.b.al_pa, remote_fcport->iodesc_idx_sent, - iodesc->idx)); - - /* Free RSCN fcport resources. */ - if (remote_fcport->port_type == FCT_RSCN) { - DEBUG14(printk("scsi(%ld): Login IOCB -- Freeing RSCN " - "fcport %p [%x/%02x%02x%02x] given ignored Login " - "IOCB.\n", ha->host_no, remote_fcport, - remote_fcport->loop_id, - remote_fcport->d_id.b.domain, - remote_fcport->d_id.b.area, - remote_fcport->d_id.b.al_pa)); - - list_del(&remote_fcport->list); - kfree(remote_fcport); - } - return (QLA_SUCCESS); - } - - status = le16_to_cpu(mbxstat->status); - mb[0] = le16_to_cpu(mbxstat->mb0); - mb[1] = le16_to_cpu(mbxstat->mb1); - mb[2] = le16_to_cpu(mbxstat->mb2); - mb[6] = le16_to_cpu(mbxstat->mb6); - mb[7] = le16_to_cpu(mbxstat->mb7); - - /* Good status? */ - if ((status == CS_COMPLETE || status == CS_COMPLETE_CHKCOND) && - mb[0] == MBS_COMMAND_COMPLETE) { - - DEBUG14(printk("scsi(%ld): Login IOCB -- status=%x mb1=%x pn=" - "%02x%02x%02x%02x%02x%02x%02x%02x.\n", ha->host_no, status, - mb[1], mbxstat->port_name[0], mbxstat->port_name[1], - mbxstat->port_name[2], mbxstat->port_name[3], - mbxstat->port_name[4], mbxstat->port_name[5], - mbxstat->port_name[6], mbxstat->port_name[7])); - - memcpy(remote_fcport->node_name, mbxstat->node_name, WWN_SIZE); - memcpy(remote_fcport->port_name, mbxstat->port_name, WWN_SIZE); - - /* Is the device already in our fcports list? */ - if (remote_fcport->port_type != FCT_RSCN) { - DEBUG14(printk("scsi(%ld): Login IOCB -- marking " - "[%x/%02x%02x%02x] online.\n", ha->host_no, - remote_fcport->loop_id, - remote_fcport->d_id.b.domain, - remote_fcport->d_id.b.area, - remote_fcport->d_id.b.al_pa)); - - qla2x00_update_login_fcport(ha, mbxstat, remote_fcport); - - return (QLA_SUCCESS); - } - - /* Does the RSCN portname already exist in our fcports list? */ - exist_fcport = NULL; - list_for_each_entry(fcport, &ha->fcports, list) { - if (memcmp(remote_fcport->port_name, fcport->port_name, - WWN_SIZE) == 0) { - exist_fcport = fcport; - break; - } - } - if (exist_fcport != NULL) { - DEBUG14(printk("scsi(%ld): Login IOCB -- found RSCN " - "fcport in fcports list [%p].\n", ha->host_no, - exist_fcport)); - - /* Abort any ADISC that could have been sent. */ - if (exist_fcport->iodesc_idx_sent != iodesc->idx && - exist_fcport->iodesc_idx_sent < - MAX_IO_DESCRIPTORS && - ha->io_descriptors[exist_fcport->iodesc_idx_sent]. - cb_idx == ADISC_PORT_IOCB_CB) { - - abort_iodesc = qla2x00_alloc_iodesc(ha); - if (abort_iodesc) { - DEBUG14(printk("scsi(%ld): Login IOCB " - "-- issuing abort to outstanding " - "Adisc [%x/%02x%02x%02x].\n", - ha->host_no, remote_fcport->loop_id, - exist_fcport->d_id.b.domain, - exist_fcport->d_id.b.area, - exist_fcport->d_id.b.al_pa)); - - abort_iodesc->cb_idx = ABORT_IOCB_CB; - abort_iodesc->d_id.b24 = - exist_fcport->d_id.b24; - abort_iodesc->remote_fcport = - exist_fcport; - exist_fcport->iodesc_idx_sent = - abort_iodesc->idx; - qla2x00_send_abort_iocb(ha, - abort_iodesc, ha->io_descriptors[ - exist_fcport->iodesc_idx_sent]. - signature, 1); - } else { - DEBUG14(printk("scsi(%ld): Login IOCB " - "-- unable to abort outstanding " - "Adisc [%x/%02x%02x%02x].\n", - ha->host_no, remote_fcport->loop_id, - exist_fcport->d_id.b.domain, - exist_fcport->d_id.b.area, - exist_fcport->d_id.b.al_pa)); - } - } - - /* - * If the existing fcport is waiting to send an ADISC - * or LOGIN, then reuse remote fcport (RSCN) to - * continue waiting. - */ - reuse = 0; - remote_loopid = remote_fcport->loop_id; - remote_did.b24 = remote_fcport->d_id.b24; - if (exist_fcport->iodesc_idx_sent == - IODESC_ADISC_NEEDED || - exist_fcport->iodesc_idx_sent == - IODESC_LOGIN_NEEDED) { - DEBUG14(printk("scsi(%ld): Login IOCB -- " - "existing fcport [%x/%02x%02x%02x] " - "waiting for IO descriptor, reuse RSCN " - "fcport.\n", ha->host_no, - exist_fcport->loop_id, - exist_fcport->d_id.b.domain, - exist_fcport->d_id.b.area, - exist_fcport->d_id.b.al_pa)); - - reuse++; - remote_fcport->iodesc_idx_sent = - exist_fcport->iodesc_idx_sent; - exist_fcport->iodesc_idx_sent = - IODESC_INVALID_INDEX; - remote_fcport->loop_id = exist_fcport->loop_id; - remote_fcport->d_id.b24 = - exist_fcport->d_id.b24; - } - - /* Logout the old loopid. */ - if (!reuse && - exist_fcport->loop_id != remote_fcport->loop_id && - exist_fcport->loop_id != FC_NO_LOOP_ID) { - login_iodesc = qla2x00_alloc_iodesc(ha); - if (login_iodesc) { - DEBUG14(printk("scsi(%ld): Login IOCB " - "-- issuing logout to free old " - "loop id [%x/%02x%02x%02x].\n", - ha->host_no, exist_fcport->loop_id, - exist_fcport->d_id.b.domain, - exist_fcport->d_id.b.area, - exist_fcport->d_id.b.al_pa)); - - login_iodesc->cb_idx = - LOGOUT_PORT_IOCB_CB; - login_iodesc->d_id.b24 = - exist_fcport->d_id.b24; - login_iodesc->remote_fcport = - exist_fcport; - exist_fcport->iodesc_idx_sent = - login_iodesc->idx; - qla2x00_send_logout_iocb(ha, - login_iodesc, 1); - } else { - /* Ran out of IO descriptiors. */ - DEBUG14(printk("scsi(%ld): Login IOCB " - "-- unable to logout to free old " - "loop id [%x/%02x%02x%02x].\n", - ha->host_no, exist_fcport->loop_id, - exist_fcport->d_id.b.domain, - exist_fcport->d_id.b.area, - exist_fcport->d_id.b.al_pa)); - - exist_fcport->iodesc_idx_sent = - IODESC_INVALID_INDEX; - } - - } - - /* Update existing fcport with remote fcport info. */ - DEBUG14(printk("scsi(%ld): Login IOCB -- marking " - "existing fcport [%x/%02x%02x%02x] online.\n", - ha->host_no, remote_loopid, remote_did.b.domain, - remote_did.b.area, remote_did.b.al_pa)); - - memcpy(exist_fcport->node_name, - remote_fcport->node_name, WWN_SIZE); - exist_fcport->loop_id = remote_loopid; - exist_fcport->d_id.b24 = remote_did.b24; - qla2x00_update_login_fcport(ha, mbxstat, exist_fcport); - - /* Finally, free the remote (RSCN) fcport. */ - if (!reuse) { - DEBUG14(printk("scsi(%ld): Login IOCB -- " - "Freeing RSCN fcport %p " - "[%x/%02x%02x%02x].\n", ha->host_no, - remote_fcport, remote_fcport->loop_id, - remote_fcport->d_id.b.domain, - remote_fcport->d_id.b.area, - remote_fcport->d_id.b.al_pa)); - - list_del(&remote_fcport->list); - kfree(remote_fcport); - } - - return (QLA_SUCCESS); - } - - /* - * A new device has been added, move the RSCN fcport to our - * fcports list. - */ - DEBUG14(printk("scsi(%ld): Login IOCB -- adding RSCN fcport " - "[%x/%02x%02x%02x] to fcports list.\n", ha->host_no, - remote_fcport->loop_id, remote_fcport->d_id.b.domain, - remote_fcport->d_id.b.area, remote_fcport->d_id.b.al_pa)); - - list_del(&remote_fcport->list); - remote_fcport->flags = (FCF_RLC_SUPPORT | FCF_RESCAN_NEEDED); - qla2x00_update_login_fcport(ha, mbxstat, remote_fcport); - list_add_tail(&remote_fcport->list, &ha->fcports); - set_bit(FCPORT_RESCAN_NEEDED, &ha->dpc_flags); - } else { - /* Handle login failure. */ - if (remote_fcport->login_retry != 0) { - if (mb[0] == MBS_LOOP_ID_USED) { - inuse_did.b.domain = LSB(mb[1]); - inuse_did.b.area = MSB(mb[2]); - inuse_did.b.al_pa = LSB(mb[2]); - - DEBUG14(printk("scsi(%ld): Login IOCB -- loop " - "id [%x] used by port id [%02x%02x%02x].\n", - ha->host_no, remote_fcport->loop_id, - inuse_did.b.domain, inuse_did.b.area, - inuse_did.b.al_pa)); - - if (remote_fcport->d_id.b24 == - INVALID_PORT_ID) { - /* - * Invalid port id means we are trying - * to login to a remote port with just - * a loop id without knowing about the - * port id. Copy the port id and try - * again. - */ - remote_fcport->d_id.b24 = inuse_did.b24; - iodesc->d_id.b24 = inuse_did.b24; - } else { - remote_fcport->loop_id++; - rval = qla2x00_find_new_loop_id(ha, - remote_fcport); - if (rval == QLA_FUNCTION_FAILED) { - /* No more loop ids. */ - return (QLA_SUCCESS); - } - } - } else if (mb[0] == MBS_PORT_ID_USED) { - /* - * Device has another loop ID. The firmware - * group recommends the driver perform an - * implicit login with the specified ID. - */ - DEBUG14(printk("scsi(%ld): Login IOCB -- port " - "id [%02x%02x%02x] already assigned to " - "loop id [%x].\n", ha->host_no, - iodesc->d_id.b.domain, iodesc->d_id.b.area, - iodesc->d_id.b.al_pa, mb[1])); - - remote_fcport->loop_id = mb[1]; - - } else { - /* Unable to perform login, try again. */ - DEBUG14(printk("scsi(%ld): Login IOCB -- " - "failed login [%x/%02x%02x%02x], status=%x " - "mb0=%x mb1=%x mb2=%x mb6=%x mb7=%x.\n", - ha->host_no, remote_fcport->loop_id, - iodesc->d_id.b.domain, iodesc->d_id.b.area, - iodesc->d_id.b.al_pa, status, mb[0], mb[1], - mb[2], mb[6], mb[7])); - } - - /* Reissue Login with the same IO descriptor. */ - iodesc->signature = - qla2x00_iodesc_to_handle(iodesc); - iodesc->cb_idx = LOGIN_PORT_IOCB_CB; - iodesc->d_id.b24 = remote_fcport->d_id.b24; - remote_fcport->iodesc_idx_sent = iodesc->idx; - remote_fcport->login_retry--; - - DEBUG14(printk("scsi(%ld): Login IOCB -- retrying " - "login to [%x/%02x%02x%02x] (%d).\n", ha->host_no, - remote_fcport->loop_id, - remote_fcport->d_id.b.domain, - remote_fcport->d_id.b.area, - remote_fcport->d_id.b.al_pa, - remote_fcport->login_retry)); - - qla2x00_send_login_iocb(ha, iodesc, - &remote_fcport->d_id, 1); - - return (QLA_FUNCTION_FAILED); - } else { - /* No more logins, mark device dead. */ - DEBUG14(printk("scsi(%ld): Login IOCB -- failed " - "login [%x/%02x%02x%02x] after retries, status=%x " - "mb0=%x mb1=%x mb2=%x mb6=%x mb7=%x.\n", - ha->host_no, remote_fcport->loop_id, - iodesc->d_id.b.domain, iodesc->d_id.b.area, - iodesc->d_id.b.al_pa, status, mb[0], mb[1], - mb[2], mb[6], mb[7])); - - atomic_set(&remote_fcport->state, FCS_DEVICE_DEAD); - if (remote_fcport->port_type == FCT_RSCN) { - DEBUG14(printk("scsi(%ld): Login IOCB -- " - "Freeing dead RSCN fcport %p " - "[%x/%02x%02x%02x].\n", ha->host_no, - remote_fcport, remote_fcport->loop_id, - remote_fcport->d_id.b.domain, - remote_fcport->d_id.b.area, - remote_fcport->d_id.b.al_pa)); - - list_del(&remote_fcport->list); - kfree(remote_fcport); - } - } - } - - return (QLA_SUCCESS); -} - - -/** - * IO descriptor processing routines. - **/ - -/** - * qla2x00_alloc_rscn_fcport() - Allocate an RSCN type fcport. - * @ha: HA context - * @flags: allocation flags - * - * Returns a pointer to the allocated RSCN fcport, or NULL, if none available. - */ -fc_port_t * -qla2x00_alloc_rscn_fcport(scsi_qla_host_t *ha, gfp_t flags) -{ - fc_port_t *fcport; - - fcport = qla2x00_alloc_fcport(ha, flags); - if (fcport == NULL) - return (fcport); - - /* Setup RSCN fcport structure. */ - fcport->port_type = FCT_RSCN; - - return (fcport); -} - -/** - * qla2x00_handle_port_rscn() - Handle port RSCN. - * @ha: HA context - * @rscn_entry: RSCN entry - * @fcport: fcport entry to updated - * - * Returns QLA_SUCCESS if the port RSCN was handled. - */ -int -qla2x00_handle_port_rscn(scsi_qla_host_t *ha, uint32_t rscn_entry, - fc_port_t *known_fcport, int ha_locked) -{ - int rval; - port_id_t rscn_pid; - fc_port_t *fcport, *remote_fcport, *rscn_fcport; - struct io_descriptor *iodesc; - - remote_fcport = NULL; - rscn_fcport = NULL; - - /* Prepare port id based on incoming entries. */ - if (known_fcport) { - rscn_pid.b24 = known_fcport->d_id.b24; - remote_fcport = known_fcport; - - DEBUG14(printk("scsi(%ld): Handle RSCN -- process RSCN for " - "fcport [%02x%02x%02x].\n", ha->host_no, - remote_fcport->d_id.b.domain, remote_fcport->d_id.b.area, - remote_fcport->d_id.b.al_pa)); - } else { - rscn_pid.b.domain = LSB(MSW(rscn_entry)); - rscn_pid.b.area = MSB(LSW(rscn_entry)); - rscn_pid.b.al_pa = LSB(LSW(rscn_entry)); - - DEBUG14(printk("scsi(%ld): Handle RSCN -- process RSCN for " - "port id [%02x%02x%02x].\n", ha->host_no, - rscn_pid.b.domain, rscn_pid.b.area, rscn_pid.b.al_pa)); - - /* - * Search fcport lists for a known entry at the specified port - * ID. - */ - list_for_each_entry(fcport, &ha->fcports, list) { - if (rscn_pid.b24 == fcport->d_id.b24) { - remote_fcport = fcport; - break; - } - } - list_for_each_entry(fcport, &ha->rscn_fcports, list) { - if (rscn_pid.b24 == fcport->d_id.b24) { - rscn_fcport = fcport; - break; - } - } - if (remote_fcport == NULL) - remote_fcport = rscn_fcport; - } - - /* - * If the port is already in our fcport list and online, send an ADISC - * to see if it's still alive. Issue login if a new fcport or the known - * fcport is currently offline. - */ - if (remote_fcport) { - /* - * No need to send request if the remote fcport is currently - * waiting for an available io descriptor. - */ - if (known_fcport == NULL && - (remote_fcport->iodesc_idx_sent == IODESC_ADISC_NEEDED || - remote_fcport->iodesc_idx_sent == IODESC_LOGIN_NEEDED)) { - /* - * If previous waiting io descriptor is an ADISC, then - * the new RSCN may come from a new remote fcport being - * plugged into the same location. - */ - if (remote_fcport->port_type == FCT_RSCN) { - remote_fcport->iodesc_idx_sent = - IODESC_LOGIN_NEEDED; - } else if (remote_fcport->iodesc_idx_sent == - IODESC_ADISC_NEEDED) { - fc_port_t *new_fcport; - - remote_fcport->iodesc_idx_sent = - IODESC_INVALID_INDEX; - - /* Create new fcport for later login. */ - new_fcport = qla2x00_alloc_rscn_fcport(ha, - ha_locked ? GFP_ATOMIC: GFP_KERNEL); - if (new_fcport) { - DEBUG14(printk("scsi(%ld): Handle RSCN " - "-- creating RSCN fcport %p for " - "future login.\n", ha->host_no, - new_fcport)); - - new_fcport->d_id.b24 = - remote_fcport->d_id.b24; - new_fcport->iodesc_idx_sent = - IODESC_LOGIN_NEEDED; - - list_add_tail(&new_fcport->list, - &ha->rscn_fcports); - set_bit(IODESC_PROCESS_NEEDED, - &ha->dpc_flags); - } else { - DEBUG14(printk("scsi(%ld): Handle RSCN " - "-- unable to allocate RSCN fcport " - "for future login.\n", - ha->host_no)); - } - } - return (QLA_SUCCESS); - } - - /* Send ADISC if the fcport is online */ - if (atomic_read(&remote_fcport->state) == FCS_ONLINE || - remote_fcport->iodesc_idx_sent == IODESC_ADISC_NEEDED) { - - atomic_set(&remote_fcport->state, FCS_DEVICE_LOST); - - iodesc = qla2x00_alloc_iodesc(ha); - if (iodesc == NULL) { - /* Mark fcport for later adisc processing */ - DEBUG14(printk("scsi(%ld): Handle RSCN -- not " - "enough IO descriptors for Adisc, flag " - "for later processing.\n", ha->host_no)); - - remote_fcport->iodesc_idx_sent = - IODESC_ADISC_NEEDED; - set_bit(IODESC_PROCESS_NEEDED, &ha->dpc_flags); - - return (QLA_SUCCESS); - } - - iodesc->cb_idx = ADISC_PORT_IOCB_CB; - iodesc->d_id.b24 = rscn_pid.b24; - iodesc->remote_fcport = remote_fcport; - remote_fcport->iodesc_idx_sent = iodesc->idx; - qla2x00_send_adisc_iocb(ha, iodesc, ha_locked); - - return (QLA_SUCCESS); - } else if (remote_fcport->iodesc_idx_sent < - MAX_IO_DESCRIPTORS && - ha->io_descriptors[remote_fcport->iodesc_idx_sent].cb_idx == - ADISC_PORT_IOCB_CB) { - /* - * Receiving another RSCN while an ADISC is pending, - * abort the IOCB. Use the same descriptor for the - * abort. - */ - uint32_t handle_to_abort; - - iodesc = &ha->io_descriptors[ - remote_fcport->iodesc_idx_sent]; - qla2x00_remove_iodesc_timer(iodesc); - handle_to_abort = iodesc->signature; - iodesc->signature = qla2x00_iodesc_to_handle(iodesc); - iodesc->cb_idx = ABORT_IOCB_CB; - iodesc->d_id.b24 = remote_fcport->d_id.b24; - iodesc->remote_fcport = remote_fcport; - remote_fcport->iodesc_idx_sent = iodesc->idx; - - DEBUG14(printk("scsi(%ld): Handle RSCN -- issuing " - "abort to outstanding Adisc [%x/%02x%02x%02x].\n", - ha->host_no, remote_fcport->loop_id, - iodesc->d_id.b.domain, iodesc->d_id.b.area, - iodesc->d_id.b.al_pa)); - - qla2x00_send_abort_iocb(ha, iodesc, handle_to_abort, - ha_locked); - } - } - - /* We need to login to the remote port, find it. */ - if (known_fcport) { - remote_fcport = known_fcport; - } else if (rscn_fcport && rscn_fcport->d_id.b24 != INVALID_PORT_ID && - rscn_fcport->iodesc_idx_sent < MAX_IO_DESCRIPTORS && - ha->io_descriptors[rscn_fcport->iodesc_idx_sent].cb_idx == - LOGIN_PORT_IOCB_CB) { - /* - * Ignore duplicate RSCN on fcport which has already - * initiated a login IOCB. - */ - DEBUG14(printk("scsi(%ld): Handle RSCN -- ignoring, login " - "already sent to [%02x%02x%02x].\n", ha->host_no, - rscn_fcport->d_id.b.domain, rscn_fcport->d_id.b.area, - rscn_fcport->d_id.b.al_pa)); - - return (QLA_SUCCESS); - } else if (rscn_fcport && rscn_fcport->d_id.b24 != INVALID_PORT_ID && - rscn_fcport != remote_fcport) { - /* Reuse same rscn fcport. */ - DEBUG14(printk("scsi(%ld): Handle RSCN -- reusing RSCN fcport " - "[%02x%02x%02x].\n", ha->host_no, - rscn_fcport->d_id.b.domain, rscn_fcport->d_id.b.area, - rscn_fcport->d_id.b.al_pa)); - - remote_fcport = rscn_fcport; - } else { - /* Create new fcport for later login. */ - remote_fcport = qla2x00_alloc_rscn_fcport(ha, - ha_locked ? GFP_ATOMIC: GFP_KERNEL); - list_add_tail(&remote_fcport->list, &ha->rscn_fcports); - } - if (remote_fcport == NULL) - return (QLA_SUCCESS); - - /* Prepare fcport for login. */ - atomic_set(&remote_fcport->state, FCS_DEVICE_LOST); - remote_fcport->login_retry = 3; /* ha->login_retry_count; */ - remote_fcport->d_id.b24 = rscn_pid.b24; - - iodesc = qla2x00_alloc_iodesc(ha); - if (iodesc == NULL) { - /* Mark fcport for later adisc processing. */ - DEBUG14(printk("scsi(%ld): Handle RSCN -- not enough IO " - "descriptors for Login, flag for later processing.\n", - ha->host_no)); - - remote_fcport->iodesc_idx_sent = IODESC_LOGIN_NEEDED; - set_bit(IODESC_PROCESS_NEEDED, &ha->dpc_flags); - - return (QLA_SUCCESS); - } - - if (known_fcport == NULL || rscn_pid.b24 != INVALID_PORT_ID) { - remote_fcport->loop_id = ha->min_external_loopid; - - rval = qla2x00_find_new_loop_id(ha, remote_fcport); - if (rval == QLA_FUNCTION_FAILED) { - /* No more loop ids, failed. */ - DEBUG14(printk("scsi(%ld): Handle RSCN -- no available " - "loop id to perform Login, failed.\n", - ha->host_no)); - - return (rval); - } - } - - iodesc->cb_idx = LOGIN_PORT_IOCB_CB; - iodesc->d_id.b24 = rscn_pid.b24; - iodesc->remote_fcport = remote_fcport; - remote_fcport->iodesc_idx_sent = iodesc->idx; - - DEBUG14(printk("scsi(%ld): Handle RSCN -- attempting login to " - "[%x/%02x%02x%02x].\n", ha->host_no, remote_fcport->loop_id, - iodesc->d_id.b.domain, iodesc->d_id.b.area, iodesc->d_id.b.al_pa)); - - qla2x00_send_login_iocb(ha, iodesc, &rscn_pid, ha_locked); - - return (QLA_SUCCESS); -} - -/** - * qla2x00_process_iodesc() - Complete IO descriptor processing. - * @ha: HA context - * @mbxstat: Mailbox IOCB status - */ -void -qla2x00_process_iodesc(scsi_qla_host_t *ha, struct mbx_entry *mbxstat) -{ - int rval; - uint32_t signature; - fc_port_t *fcport; - struct io_descriptor *iodesc; - - signature = mbxstat->handle; - - DEBUG14(printk("scsi(%ld): Process IODesc -- processing %08x.\n", - ha->host_no, signature)); - - /* Retrieve proper IO descriptor. */ - iodesc = qla2x00_handle_to_iodesc(ha, signature); - if (iodesc == NULL) { - DEBUG14(printk("scsi(%ld): Process IODesc -- ignoring, " - "incorrect signature %08x.\n", ha->host_no, signature)); - - return; - } - - /* Stop IO descriptor timer. */ - qla2x00_remove_iodesc_timer(iodesc); - - /* Verify signature match. */ - if (iodesc->signature != signature) { - DEBUG14(printk("scsi(%ld): Process IODesc -- ignoring, " - "signature mismatch, sent %08x, received %08x.\n", - ha->host_no, iodesc->signature, signature)); - - return; - } - - /* Go with IOCB callback. */ - rval = iocb_function_cb_list[iodesc->cb_idx](ha, iodesc, mbxstat); - if (rval != QLA_SUCCESS) { - /* IO descriptor reused by callback. */ - return; - } - - qla2x00_free_iodesc(iodesc); - - if (test_bit(IODESC_PROCESS_NEEDED, &ha->dpc_flags)) { - /* Scan our fcports list for any RSCN requests. */ - list_for_each_entry(fcport, &ha->fcports, list) { - if (fcport->iodesc_idx_sent == IODESC_ADISC_NEEDED || - fcport->iodesc_idx_sent == IODESC_LOGIN_NEEDED) { - qla2x00_handle_port_rscn(ha, 0, fcport, 1); - return; - } - } - - /* Scan our RSCN fcports list for any RSCN requests. */ - list_for_each_entry(fcport, &ha->rscn_fcports, list) { - if (fcport->iodesc_idx_sent == IODESC_ADISC_NEEDED || - fcport->iodesc_idx_sent == IODESC_LOGIN_NEEDED) { - qla2x00_handle_port_rscn(ha, 0, fcport, 1); - return; - } - } - } - clear_bit(IODESC_PROCESS_NEEDED, &ha->dpc_flags); -} - -/** - * qla2x00_cancel_io_descriptors() - Cancel all outstanding io descriptors. - * @ha: HA context - * - * This routine will also delete any RSCN entries related to the outstanding - * IO descriptors. - */ -void -qla2x00_cancel_io_descriptors(scsi_qla_host_t *ha) -{ - fc_port_t *fcport, *fcptemp; - - clear_bit(IODESC_PROCESS_NEEDED, &ha->dpc_flags); - - /* Abort all IO descriptors. */ - qla2x00_init_io_descriptors(ha); - - /* Reset all pending IO descriptors in fcports list. */ - list_for_each_entry(fcport, &ha->fcports, list) { - fcport->iodesc_idx_sent = IODESC_INVALID_INDEX; - } - - /* Reset all pending IO descriptors in rscn fcports list. */ - list_for_each_entry_safe(fcport, fcptemp, &ha->rscn_fcports, list) { - DEBUG14(printk("scsi(%ld): Cancel IOs -- Freeing RSCN fcport " - "%p [%x/%02x%02x%02x].\n", ha->host_no, fcport, - fcport->loop_id, fcport->d_id.b.domain, fcport->d_id.b.area, - fcport->d_id.b.al_pa)); - - list_del(&fcport->list); - kfree(fcport); - } -} diff --git a/drivers/scsi/qla2xxx/qla_settings.h b/drivers/scsi/qla2xxx/qla_settings.h index 363205c0e..249e4d90f 100644 --- a/drivers/scsi/qla2xxx/qla_settings.h +++ b/drivers/scsi/qla2xxx/qla_settings.h @@ -16,7 +16,6 @@ /* Max time to wait for the loop to be in LOOP_READY state */ #define MAX_LOOP_TIMEOUT (60 * 5) -#define EH_ACTIVE 1 /* Error handler active */ /* * Some vendor subsystems do not recover properly after a device reset. Define diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c index 8b0121dce..c71dbd5bd 100644 --- a/drivers/scsi/qla2xxx/qla_sup.c +++ b/drivers/scsi/qla2xxx/qla_sup.c @@ -97,7 +97,7 @@ qla2x00_write_nvram_word(scsi_qla_host_t *ha, uint32_t addr, uint16_t data) { int count; uint16_t word; - uint32_t nv_cmd; + uint32_t nv_cmd, wait_cnt; struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; qla2x00_nv_write(ha, NVR_DATA_OUT); @@ -127,7 +127,13 @@ qla2x00_write_nvram_word(scsi_qla_host_t *ha, uint32_t addr, uint16_t data) /* Wait for NVRAM to become ready */ WRT_REG_WORD(®->nvram, NVR_SELECT); RD_REG_WORD(®->nvram); /* PCI Posting. */ + wait_cnt = NVR_WAIT_CNT; do { + if (!--wait_cnt) { + DEBUG9_10(printk("%s(%ld): NVRAM didn't go ready...\n", + __func__, ha->host_no)); + break; + } NVRAM_DELAY(); word = RD_REG_WORD(®->nvram); } while ((word & NVR_DATA_IN) == 0); @@ -301,16 +307,17 @@ qla2x00_clear_nvram_protection(scsi_qla_host_t *ha) { int ret, stat; struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; - uint32_t word; + uint32_t word, wait_cnt; uint16_t wprot, wprot_old; /* Clear NVRAM write protection. */ ret = QLA_FUNCTION_FAILED; - wprot_old = cpu_to_le16(qla2x00_get_nvram_word(ha, 0)); - stat = qla2x00_write_nvram_word_tmo(ha, 0, + + wprot_old = cpu_to_le16(qla2x00_get_nvram_word(ha, ha->nvram_base)); + stat = qla2x00_write_nvram_word_tmo(ha, ha->nvram_base, __constant_cpu_to_le16(0x1234), 100000); - wprot = cpu_to_le16(qla2x00_get_nvram_word(ha, 0)); - if (stat != QLA_SUCCESS || wprot != __constant_cpu_to_le16(0x1234)) { + wprot = cpu_to_le16(qla2x00_get_nvram_word(ha, ha->nvram_base)); + if (stat != QLA_SUCCESS || wprot != 0x1234) { /* Write enable. */ qla2x00_nv_write(ha, NVR_DATA_OUT); qla2x00_nv_write(ha, 0); @@ -341,14 +348,22 @@ qla2x00_clear_nvram_protection(scsi_qla_host_t *ha) /* Wait for NVRAM to become ready. */ WRT_REG_WORD(®->nvram, NVR_SELECT); RD_REG_WORD(®->nvram); /* PCI Posting. */ + wait_cnt = NVR_WAIT_CNT; do { + if (!--wait_cnt) { + DEBUG9_10(printk("%s(%ld): NVRAM didn't go " + "ready...\n", __func__, + ha->host_no)); + break; + } NVRAM_DELAY(); word = RD_REG_WORD(®->nvram); } while ((word & NVR_DATA_IN) == 0); - ret = QLA_SUCCESS; + if (wait_cnt) + ret = QLA_SUCCESS; } else - qla2x00_write_nvram_word(ha, 0, wprot_old); + qla2x00_write_nvram_word(ha, ha->nvram_base, wprot_old); return ret; } @@ -357,7 +372,7 @@ static void qla2x00_set_nvram_protection(scsi_qla_host_t *ha, int stat) { struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; - uint32_t word; + uint32_t word, wait_cnt; if (stat != QLA_SUCCESS) return; @@ -393,7 +408,13 @@ qla2x00_set_nvram_protection(scsi_qla_host_t *ha, int stat) /* Wait for NVRAM to become ready. */ WRT_REG_WORD(®->nvram, NVR_SELECT); RD_REG_WORD(®->nvram); /* PCI Posting. */ + wait_cnt = NVR_WAIT_CNT; do { + if (!--wait_cnt) { + DEBUG9_10(printk("%s(%ld): NVRAM didn't go ready...\n", + __func__, ha->host_no)); + break; + } NVRAM_DELAY(); word = RD_REG_WORD(®->nvram); } while ((word & NVR_DATA_IN) == 0); @@ -500,6 +521,20 @@ qla24xx_get_flash_manufacturer(scsi_qla_host_t *ha, uint8_t *man_id, ids = qla24xx_read_flash_dword(ha, flash_data_to_access_addr(0xd03ab)); *man_id = LSB(ids); *flash_id = MSB(ids); + + /* Check if man_id and flash_id are valid. */ + if (ids != 0xDEADDEAD && (*man_id == 0 || *flash_id == 0)) { + /* Read information using 0x9f opcode + * Device ID, Mfg ID would be read in the format: + * + * Example: ATMEL 0x00 01 45 1F + * Extract MFG and Dev ID from last two bytes. + */ + ids = qla24xx_read_flash_dword(ha, + flash_data_to_access_addr(0xd009f)); + *man_id = LSB(ids); + *flash_id = MSB(ids); + } } int @@ -508,8 +543,8 @@ qla24xx_write_flash_data(scsi_qla_host_t *ha, uint32_t *dwptr, uint32_t faddr, { int ret; uint32_t liter; - uint32_t sec_mask, rest_addr, conf_addr; - uint32_t fdata; + uint32_t sec_mask, rest_addr, conf_addr, sec_end_mask; + uint32_t fdata, findex ; uint8_t man_id, flash_id; struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; @@ -519,6 +554,7 @@ qla24xx_write_flash_data(scsi_qla_host_t *ha, uint32_t *dwptr, uint32_t faddr, DEBUG9(printk("%s(%ld): Flash man_id=%d flash_id=%d\n", __func__, ha->host_no, man_id, flash_id)); + sec_end_mask = 0; conf_addr = flash_conf_to_access_addr(0x03d8); switch (man_id) { case 0xbf: /* STT flash. */ @@ -531,6 +567,12 @@ qla24xx_write_flash_data(scsi_qla_host_t *ha, uint32_t *dwptr, uint32_t faddr, rest_addr = 0x3fff; sec_mask = 0x3c000; break; + case 0x1f: // Atmel 26DF081A + rest_addr = 0x0fff; + sec_mask = 0xff000; + sec_end_mask = 0x003ff; + conf_addr = flash_conf_to_access_addr(0x0320); + break; default: /* Default to 64 kb sector size. */ rest_addr = 0x3fff; @@ -545,11 +587,30 @@ qla24xx_write_flash_data(scsi_qla_host_t *ha, uint32_t *dwptr, uint32_t faddr, /* Disable flash write-protection. */ qla24xx_write_flash_dword(ha, flash_conf_to_access_addr(0x101), 0); + /* Some flash parts need an additional zero-write to clear bits.*/ + qla24xx_write_flash_dword(ha, flash_conf_to_access_addr(0x101), 0); do { /* Loop once to provide quick error exit. */ for (liter = 0; liter < dwords; liter++, faddr++, dwptr++) { + if (man_id == 0x1f) { + findex = faddr << 2; + fdata = findex & sec_mask; + } else { + findex = faddr; + fdata = (findex & sec_mask) << 2; + } + /* Are we at the beginning of a sector? */ - if ((faddr & rest_addr) == 0) { + if ((findex & rest_addr) == 0) { + /* + * Do sector unprotect at 4K boundry for Atmel + * part. + */ + if (man_id == 0x1f) + qla24xx_write_flash_dword(ha, + flash_conf_to_access_addr(0x0339), + (fdata & 0xff00) | ((fdata << 16) & + 0xff0000) | ((fdata >> 16) & 0xff)); fdata = (faddr & sec_mask) << 2; ret = qla24xx_write_flash_dword(ha, conf_addr, (fdata & 0xff00) |((fdata << 16) & @@ -570,6 +631,14 @@ qla24xx_write_flash_data(scsi_qla_host_t *ha, uint32_t *dwptr, uint32_t faddr, ha->host_no, faddr, *dwptr)); break; } + + /* Do sector protect at 4K boundry for Atmel part. */ + if (man_id == 0x1f && + ((faddr & sec_end_mask) == 0x3ff)) + qla24xx_write_flash_dword(ha, + flash_conf_to_access_addr(0x0336), + (fdata & 0xff00) | ((fdata << 16) & + 0xff0000) | ((fdata >> 16) & 0xff)); } } while (0); diff --git a/drivers/scsi/qla2xxx/qla_version.h b/drivers/scsi/qla2xxx/qla_version.h index d537192a1..971259032 100644 --- a/drivers/scsi/qla2xxx/qla_version.h +++ b/drivers/scsi/qla2xxx/qla_version.h @@ -7,9 +7,9 @@ /* * Driver version */ -#define QLA2XXX_VERSION "8.01.04-k" +#define QLA2XXX_VERSION "8.01.07-k1" #define QLA_DRIVER_MAJOR_VER 8 #define QLA_DRIVER_MINOR_VER 1 -#define QLA_DRIVER_PATCH_VER 4 +#define QLA_DRIVER_PATCH_VER 7 #define QLA_DRIVER_BETA_VER 0 diff --git a/drivers/scsi/qlogicpti.c b/drivers/scsi/qlogicpti.c index c7e78dcf0..5b2f0741a 100644 --- a/drivers/scsi/qlogicpti.c +++ b/drivers/scsi/qlogicpti.c @@ -1,6 +1,6 @@ /* qlogicpti.c: Performance Technologies QlogicISP sbus card driver. * - * Copyright (C) 1996 David S. Miller (davem@caipfs.rutgers.edu) + * Copyright (C) 1996, 2006 David S. Miller (davem@davemloft.net) * * A lot of this driver was directly stolen from Erik H. Moe's PCI * Qlogic ISP driver. Mucho kudos to him for this code. @@ -43,12 +43,9 @@ #include #include #include -#include #include #include - - #define MAX_TARGETS 16 #define MAX_LUNS 8 /* 32 for 1.31 F/W */ @@ -58,7 +55,6 @@ static struct qlogicpti *qptichain = NULL; static DEFINE_SPINLOCK(qptichain_lock); -static int qptis_running = 0; #define PACKB(a, b) (((a)<<4)|(b)) @@ -132,7 +128,7 @@ static const u_char mbox_param[] = { PACKB(0, 0) /* 0x0042 */ }; -#define MAX_MBOX_COMMAND (sizeof(mbox_param)/sizeof(u_short)) +#define MAX_MBOX_COMMAND ARRAY_SIZE(mbox_param) /* queue length's _must_ be power of two: */ #define QUEUE_DEPTH(in, out, ql) ((in - out) & (ql)) @@ -722,10 +718,10 @@ static int __init qpti_register_irq(struct qlogicpti *qpti) * sanely maintain. */ if (request_irq(qpti->irq, qpti_intr, - SA_SHIRQ, "Qlogic/PTI", qpti)) + IRQF_SHARED, "Qlogic/PTI", qpti)) goto fail; - printk("qpti%d: IRQ %s ", qpti->qpti_id, __irq_itoa(qpti->irq)); + printk("qpti%d: IRQ %d ", qpti->qpti_id, qpti->irq); return 0; @@ -816,180 +812,13 @@ static int __init qpti_map_queues(struct qlogicpti *qpti) return 0; } -/* Detect all PTI Qlogic ISP's in the machine. */ -static int __init qlogicpti_detect(struct scsi_host_template *tpnt) -{ - struct qlogicpti *qpti; - struct Scsi_Host *qpti_host; - struct sbus_bus *sbus; - struct sbus_dev *sdev; - int nqptis = 0, nqptis_in_use = 0; - - tpnt->proc_name = "qlogicpti"; - for_each_sbus(sbus) { - for_each_sbusdev(sdev, sbus) { - /* Is this a red snapper? */ - if (strcmp(sdev->prom_name, "ptisp") && - strcmp(sdev->prom_name, "PTI,ptisp") && - strcmp(sdev->prom_name, "QLGC,isp") && - strcmp(sdev->prom_name, "SUNW,isp")) - continue; - - /* Sometimes Antares cards come up not completely - * setup, and we get a report of a zero IRQ. - * Skip over them in such cases so we survive. - */ - if (sdev->irqs[0] == 0) { - printk("qpti%d: Adapter reports no interrupt, " - "skipping over this card.", nqptis); - continue; - } - - /* Yep, register and allocate software state. */ - qpti_host = scsi_register(tpnt, sizeof(struct qlogicpti)); - if (!qpti_host) { - printk("QPTI: Cannot register PTI Qlogic ISP SCSI host"); - continue; - } - qpti = (struct qlogicpti *) qpti_host->hostdata; - - /* We are wide capable, 16 targets. */ - qpti_host->max_id = MAX_TARGETS; - - /* Setup back pointers and misc. state. */ - qpti->qhost = qpti_host; - qpti->sdev = sdev; - qpti->qpti_id = nqptis++; - qpti->prom_node = sdev->prom_node; - prom_getstring(qpti->prom_node, "name", - qpti->prom_name, - sizeof(qpti->prom_name)); - - /* This is not correct, actually. There's a switch - * on the PTI cards that put them into "emulation" - * mode- i.e., report themselves as QLGC,isp - * instead of PTI,ptisp. The only real substantive - * difference between non-pti and pti cards is - * the tmon register. Which is possibly even - * there for Qlogic cards, but non-functional. - */ - qpti->is_pti = (strcmp (qpti->prom_name, "QLGC,isp") != 0); - - qpti_chain_add(qpti); - if (qpti_map_regs(qpti) < 0) - goto fail_unlink; - - if (qpti_register_irq(qpti) < 0) - goto fail_unmap_regs; - - qpti_get_scsi_id(qpti); - qpti_get_bursts(qpti); - qpti_get_clock(qpti); - - /* Clear out scsi_cmnd array. */ - memset(qpti->cmd_slots, 0, sizeof(qpti->cmd_slots)); - - if (qpti_map_queues(qpti) < 0) - goto fail_free_irq; - - /* Load the firmware. */ - if (qlogicpti_load_firmware(qpti)) - goto fail_unmap_queues; - if (qpti->is_pti) { - /* Check the PTI status reg. */ - if (qlogicpti_verify_tmon(qpti)) - goto fail_unmap_queues; - } - - /* Reset the ISP and init res/req queues. */ - if (qlogicpti_reset_hardware(qpti_host)) - goto fail_unmap_queues; - - printk("(Firmware v%d.%d.%d)", qpti->fware_majrev, - qpti->fware_minrev, qpti->fware_micrev); - { - char buffer[60]; - - prom_getstring (qpti->prom_node, - "isp-fcode", buffer, 60); - if (buffer[0]) - printk("(Firmware %s)", buffer); - if (prom_getbool(qpti->prom_node, "differential")) - qpti->differential = 1; - } - - printk (" [%s Wide, using %s interface]\n", - (qpti->ultra ? "Ultra" : "Fast"), - (qpti->differential ? "differential" : "single ended")); - - nqptis_in_use++; - continue; - - fail_unmap_queues: -#define QSIZE(entries) (((entries) + 1) * QUEUE_ENTRY_LEN) - sbus_free_consistent(qpti->sdev, - QSIZE(RES_QUEUE_LEN), - qpti->res_cpu, qpti->res_dvma); - sbus_free_consistent(qpti->sdev, - QSIZE(QLOGICPTI_REQ_QUEUE_LEN), - qpti->req_cpu, qpti->req_dvma); -#undef QSIZE - fail_free_irq: - free_irq(qpti->irq, qpti); - - fail_unmap_regs: - sbus_iounmap(qpti->qregs, - qpti->sdev->reg_addrs[0].reg_size); - if (qpti->is_pti) - sbus_iounmap(qpti->sreg, sizeof(unsigned char)); - fail_unlink: - qpti_chain_del(qpti); - scsi_unregister(qpti->qhost); - } - } - if (nqptis) - printk("QPTI: Total of %d PTI Qlogic/ISP hosts found, %d actually in use.\n", - nqptis, nqptis_in_use); - qptis_running = nqptis_in_use; - return nqptis; -} - -static int qlogicpti_release(struct Scsi_Host *host) -{ - struct qlogicpti *qpti = (struct qlogicpti *) host->hostdata; - - /* Remove visibility from IRQ handlers. */ - qpti_chain_del(qpti); - - /* Shut up the card. */ - sbus_writew(0, qpti->qregs + SBUS_CTRL); - - /* Free IRQ handler and unmap Qlogic,ISP and PTI status regs. */ - free_irq(qpti->irq, qpti); - -#define QSIZE(entries) (((entries) + 1) * QUEUE_ENTRY_LEN) - sbus_free_consistent(qpti->sdev, - QSIZE(RES_QUEUE_LEN), - qpti->res_cpu, qpti->res_dvma); - sbus_free_consistent(qpti->sdev, - QSIZE(QLOGICPTI_REQ_QUEUE_LEN), - qpti->req_cpu, qpti->req_dvma); -#undef QSIZE - - sbus_iounmap(qpti->qregs, qpti->sdev->reg_addrs[0].reg_size); - if (qpti->is_pti) - sbus_iounmap(qpti->sreg, sizeof(unsigned char)); - - return 0; -} - const char *qlogicpti_info(struct Scsi_Host *host) { static char buf[80]; struct qlogicpti *qpti = (struct qlogicpti *) host->hostdata; - sprintf(buf, "PTI Qlogic,ISP SBUS SCSI irq %s regs at %p", - __irq_itoa(qpti->qhost->irq), qpti->qregs); + sprintf(buf, "PTI Qlogic,ISP SBUS SCSI irq %d regs at %p", + qpti->qhost->irq, qpti->qregs); return buf; } @@ -1045,7 +874,7 @@ static inline int load_cmd(struct scsi_cmnd *Cmnd, struct Command_Entry *cmd, if (Cmnd->use_sg) { int sg_count; - sg = (struct scatterlist *) Cmnd->buffer; + sg = (struct scatterlist *) Cmnd->request_buffer; sg_count = sbus_map_sg(qpti->sdev, sg, Cmnd->use_sg, Cmnd->sc_data_direction); ds = cmd->dataseg; @@ -1449,7 +1278,7 @@ static struct scsi_cmnd *qlogicpti_intr_handler(struct qlogicpti *qpti) if (Cmnd->use_sg) { sbus_unmap_sg(qpti->sdev, - (struct scatterlist *)Cmnd->buffer, + (struct scatterlist *)Cmnd->request_buffer, Cmnd->use_sg, Cmnd->sc_data_direction); } else { @@ -1552,9 +1381,9 @@ static int qlogicpti_reset(struct scsi_cmnd *Cmnd) return return_status; } -static struct scsi_host_template driver_template = { - .detect = qlogicpti_detect, - .release = qlogicpti_release, +static struct scsi_host_template qpti_template = { + .module = THIS_MODULE, + .name = "qlogicpti", .info = qlogicpti_info, .queuecommand = qlogicpti_queuecommand_slow, .eh_abort_handler = qlogicpti_abort, @@ -1566,8 +1395,189 @@ static struct scsi_host_template driver_template = { .use_clustering = ENABLE_CLUSTERING, }; +static int __devinit qpti_sbus_probe(struct of_device *dev, const struct of_device_id *match) +{ + static int nqptis; + struct sbus_dev *sdev = to_sbus_device(&dev->dev); + struct device_node *dp = dev->node; + struct scsi_host_template *tpnt = match->data; + struct Scsi_Host *host; + struct qlogicpti *qpti; + char *fcode; + + /* Sometimes Antares cards come up not completely + * setup, and we get a report of a zero IRQ. + */ + if (sdev->irqs[0] == 0) + return -ENODEV; + + host = scsi_host_alloc(tpnt, sizeof(struct qlogicpti)); + if (!host) + return -ENOMEM; + + qpti = (struct qlogicpti *) host->hostdata; + + host->max_id = MAX_TARGETS; + qpti->qhost = host; + qpti->sdev = sdev; + qpti->qpti_id = nqptis; + qpti->prom_node = sdev->prom_node; + strcpy(qpti->prom_name, sdev->ofdev.node->name); + qpti->is_pti = strcmp(qpti->prom_name, "QLGC,isp"); + + if (qpti_map_regs(qpti) < 0) + goto fail_unlink; + + if (qpti_register_irq(qpti) < 0) + goto fail_unmap_regs; + + qpti_get_scsi_id(qpti); + qpti_get_bursts(qpti); + qpti_get_clock(qpti); + + /* Clear out scsi_cmnd array. */ + memset(qpti->cmd_slots, 0, sizeof(qpti->cmd_slots)); + + if (qpti_map_queues(qpti) < 0) + goto fail_free_irq; + + /* Load the firmware. */ + if (qlogicpti_load_firmware(qpti)) + goto fail_unmap_queues; + if (qpti->is_pti) { + /* Check the PTI status reg. */ + if (qlogicpti_verify_tmon(qpti)) + goto fail_unmap_queues; + } + + /* Reset the ISP and init res/req queues. */ + if (qlogicpti_reset_hardware(host)) + goto fail_unmap_queues; + + if (scsi_add_host(host, &dev->dev)) + goto fail_unmap_queues; + + printk("(Firmware v%d.%d.%d)", qpti->fware_majrev, + qpti->fware_minrev, qpti->fware_micrev); + + fcode = of_get_property(dp, "isp-fcode", NULL); + if (fcode && fcode[0]) + printk("(Firmware %s)", fcode); + if (of_find_property(dp, "differential", NULL) != NULL) + qpti->differential = 1; + + printk (" [%s Wide, using %s interface]\n", + (qpti->ultra ? "Ultra" : "Fast"), + (qpti->differential ? "differential" : "single ended")); + + dev_set_drvdata(&sdev->ofdev.dev, qpti); + + qpti_chain_add(qpti); + + scsi_scan_host(host); + nqptis++; + + return 0; + +fail_unmap_queues: +#define QSIZE(entries) (((entries) + 1) * QUEUE_ENTRY_LEN) + sbus_free_consistent(qpti->sdev, + QSIZE(RES_QUEUE_LEN), + qpti->res_cpu, qpti->res_dvma); + sbus_free_consistent(qpti->sdev, + QSIZE(QLOGICPTI_REQ_QUEUE_LEN), + qpti->req_cpu, qpti->req_dvma); +#undef QSIZE + +fail_unmap_regs: + sbus_iounmap(qpti->qregs, + qpti->sdev->reg_addrs[0].reg_size); + if (qpti->is_pti) + sbus_iounmap(qpti->sreg, sizeof(unsigned char)); + +fail_free_irq: + free_irq(qpti->irq, qpti); + +fail_unlink: + scsi_host_put(host); + + return -ENODEV; +} + +static int __devexit qpti_sbus_remove(struct of_device *dev) +{ + struct qlogicpti *qpti = dev_get_drvdata(&dev->dev); + + qpti_chain_del(qpti); + + scsi_remove_host(qpti->qhost); + + /* Shut up the card. */ + sbus_writew(0, qpti->qregs + SBUS_CTRL); + + /* Free IRQ handler and unmap Qlogic,ISP and PTI status regs. */ + free_irq(qpti->irq, qpti); + +#define QSIZE(entries) (((entries) + 1) * QUEUE_ENTRY_LEN) + sbus_free_consistent(qpti->sdev, + QSIZE(RES_QUEUE_LEN), + qpti->res_cpu, qpti->res_dvma); + sbus_free_consistent(qpti->sdev, + QSIZE(QLOGICPTI_REQ_QUEUE_LEN), + qpti->req_cpu, qpti->req_dvma); +#undef QSIZE + + sbus_iounmap(qpti->qregs, qpti->sdev->reg_addrs[0].reg_size); + if (qpti->is_pti) + sbus_iounmap(qpti->sreg, sizeof(unsigned char)); + + scsi_host_put(qpti->qhost); + + return 0; +} + +static struct of_device_id qpti_match[] = { + { + .name = "ptisp", + .data = &qpti_template, + }, + { + .name = "PTI,ptisp", + .data = &qpti_template, + }, + { + .name = "QLGC,isp", + .data = &qpti_template, + }, + { + .name = "SUNW,isp", + .data = &qpti_template, + }, + {}, +}; +MODULE_DEVICE_TABLE(of, qpti_match); + +static struct of_platform_driver qpti_sbus_driver = { + .name = "qpti", + .match_table = qpti_match, + .probe = qpti_sbus_probe, + .remove = __devexit_p(qpti_sbus_remove), +}; -#include "scsi_module.c" +static int __init qpti_init(void) +{ + return of_register_driver(&qpti_sbus_driver, &sbus_bus_type); +} + +static void __exit qpti_exit(void) +{ + of_unregister_driver(&qpti_sbus_driver); +} +MODULE_DESCRIPTION("QlogicISP SBUS driver"); +MODULE_AUTHOR("David S. Miller (davem@davemloft.net)"); MODULE_LICENSE("GPL"); +MODULE_VERSION("2.0"); +module_init(qpti_init); +module_exit(qpti_exit); diff --git a/drivers/scsi/raid_class.c b/drivers/scsi/raid_class.c index 50c398aab..327b33a57 100644 --- a/drivers/scsi/raid_class.c +++ b/drivers/scsi/raid_class.c @@ -131,7 +131,7 @@ static const char *raid_state_name(enum raid_state state) int i; char *name = NULL; - for (i = 0; i < sizeof(raid_states)/sizeof(raid_states[0]); i++) { + for (i = 0; i < ARRAY_SIZE(raid_states); i++) { if (raid_states[i].value == state) { name = raid_states[i].name; break; @@ -161,7 +161,7 @@ static const char *raid_level_name(enum raid_level level) int i; char *name = NULL; - for (i = 0; i < sizeof(raid_levels)/sizeof(raid_levels[0]); i++) { + for (i = 0; i < ARRAY_SIZE(raid_levels); i++) { if (raid_levels[i].value == level) { name = raid_levels[i].name; break; diff --git a/drivers/scsi/sata_mv.c b/drivers/scsi/sata_mv.c index f16f92a6e..39ace4c6e 100644 --- a/drivers/scsi/sata_mv.c +++ b/drivers/scsi/sata_mv.c @@ -93,7 +93,7 @@ enum { 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_NO_ATAPI), + ATA_FLAG_NO_ATAPI | ATA_FLAG_PIO_POLLING), MV_6XXX_FLAGS = MV_FLAG_IRQ_COALESCE, CRQB_FLAG_READ = (1 << 0), @@ -272,33 +272,33 @@ enum chip_type { /* Command ReQuest Block: 32B */ struct mv_crqb { - u32 sg_addr; - u32 sg_addr_hi; - u16 ctrl_flags; - u16 ata_cmd[11]; + __le32 sg_addr; + __le32 sg_addr_hi; + __le16 ctrl_flags; + __le16 ata_cmd[11]; }; struct mv_crqb_iie { - u32 addr; - u32 addr_hi; - u32 flags; - u32 len; - u32 ata_cmd[4]; + __le32 addr; + __le32 addr_hi; + __le32 flags; + __le32 len; + __le32 ata_cmd[4]; }; /* Command ResPonse Block: 8B */ struct mv_crpb { - u16 id; - u16 flags; - u32 tmstmp; + __le16 id; + __le16 flags; + __le32 tmstmp; }; /* EDMA Physical Region Descriptor (ePRD); A.K.A. SG */ struct mv_sg { - u32 addr; - u32 flags_size; - u32 addr_hi; - u32 reserved; + __le32 addr; + __le32 flags_size; + __le32 addr_hi; + __le32 reserved; }; struct mv_port_priv { @@ -390,6 +390,7 @@ static struct scsi_host_template mv_sht = { .proc_name = DRV_NAME, .dma_boundary = MV_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, + .slave_destroy = ata_scsi_slave_destroy, .bios_param = ata_std_bios_param, }; @@ -406,6 +407,7 @@ static const struct ata_port_operations mv5_ops = { .qc_prep = mv_qc_prep, .qc_issue = mv_qc_issue, + .data_xfer = ata_mmio_data_xfer, .eng_timeout = mv_eng_timeout, @@ -433,6 +435,7 @@ static const struct ata_port_operations mv6_ops = { .qc_prep = mv_qc_prep, .qc_issue = mv_qc_issue, + .data_xfer = ata_mmio_data_xfer, .eng_timeout = mv_eng_timeout, @@ -460,6 +463,7 @@ static const struct ata_port_operations mv_iie_ops = { .qc_prep = mv_qc_prep_iie, .qc_issue = mv_qc_issue, + .data_xfer = ata_mmio_data_xfer, .eng_timeout = mv_eng_timeout, @@ -683,7 +687,7 @@ static void mv_stop_dma(struct ata_port *ap) } if (EDMA_EN & reg) { - printk(KERN_ERR "ata%u: Unable to stop eDMA\n", ap->id); + ata_port_printk(ap, KERN_ERR, "Unable to stop eDMA\n"); /* FIXME: Consider doing a reset here to recover */ } } @@ -1028,7 +1032,7 @@ static inline unsigned mv_inc_q_index(unsigned index) return (index + 1) & MV_MAX_Q_DEPTH_MASK; } -static inline void mv_crqb_pack_cmd(u16 *cmdw, u8 data, u8 addr, unsigned last) +static inline void mv_crqb_pack_cmd(__le16 *cmdw, u8 data, u8 addr, unsigned last) { u16 tmp = data | (addr << CRQB_CMD_ADDR_SHIFT) | CRQB_CMD_CS | (last ? CRQB_CMD_LAST : 0); @@ -1051,7 +1055,7 @@ static void mv_qc_prep(struct ata_queued_cmd *qc) { struct ata_port *ap = qc->ap; struct mv_port_priv *pp = ap->private_data; - u16 *cw; + __le16 *cw; struct ata_taskfile *tf; u16 flags = 0; unsigned in_index; @@ -1307,8 +1311,8 @@ static void mv_err_intr(struct ata_port *ap, int reset_allowed) edma_err_cause = readl(port_mmio + EDMA_ERR_IRQ_CAUSE_OFS); if (EDMA_ERR_SERR & edma_err_cause) { - serr = scr_read(ap, SCR_ERROR); - scr_write_flush(ap, SCR_ERROR, serr); + sata_scr_read(ap, SCR_ERROR, &serr); + sata_scr_write_flush(ap, SCR_ERROR, serr); } if (EDMA_ERR_SELF_DIS & edma_err_cause) { struct mv_port_priv *pp = ap->private_data; @@ -1377,7 +1381,7 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant, /* Note that DEV_IRQ might happen spuriously during EDMA, * and should be ignored in such cases. * The cause of this is still under investigation. - */ + */ if (pp->pp_flags & MV_PP_FLAG_EDMA_EN) { /* EDMA: check for response queue interrupt */ if ((CRPB_DMA_DONE << hard_port) & hc_irq_cause) { @@ -1398,7 +1402,7 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant, } } - if (ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR)) + if (ap && (ap->flags & ATA_FLAG_DISABLED)) continue; err_mask = ac_err_mask(ata_status); @@ -1419,7 +1423,7 @@ 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)) { + if (!(qc->tf.flags & ATA_TFLAG_POLLING)) { qc->err_mask |= err_mask; ata_qc_complete(qc); } @@ -1949,16 +1953,16 @@ static void __mv_phy_reset(struct ata_port *ap, int can_sleep) /* Issue COMRESET via SControl */ comreset_retry: - scr_write_flush(ap, SCR_CONTROL, 0x301); + sata_scr_write_flush(ap, SCR_CONTROL, 0x301); __msleep(1, can_sleep); - scr_write_flush(ap, SCR_CONTROL, 0x300); + sata_scr_write_flush(ap, SCR_CONTROL, 0x300); __msleep(20, can_sleep); timeout = jiffies + msecs_to_jiffies(200); do { - sstatus = scr_read(ap, SCR_STATUS) & 0x3; - if ((sstatus == 3) || (sstatus == 0)) + sata_scr_read(ap, SCR_STATUS, &sstatus); + if (((sstatus & 0x3) == 3) || ((sstatus & 0x3) == 0)) break; __msleep(1, can_sleep); @@ -1974,11 +1978,12 @@ comreset_retry: "SCtrl 0x%08x\n", mv_scr_read(ap, SCR_STATUS), mv_scr_read(ap, SCR_ERROR), mv_scr_read(ap, SCR_CONTROL)); - if (sata_dev_present(ap)) { + if (ata_port_online(ap)) { ata_port_probe(ap); } else { - printk(KERN_INFO "ata%u: no device found (phy stat %08x)\n", - ap->id, scr_read(ap, SCR_STATUS)); + sata_scr_read(ap, SCR_STATUS, &sstatus); + ata_port_printk(ap, KERN_INFO, + "no device found (phy stat %08x)\n", sstatus); ata_port_disable(ap); return; } @@ -2005,7 +2010,7 @@ comreset_retry: tf.nsect = readb((void __iomem *) ap->ioaddr.nsect_addr); dev->class = ata_dev_classify(&tf); - if (!ata_dev_present(dev)) { + if (!ata_dev_enabled(dev)) { VPRINTK("Port disabled post-sig: No device present.\n"); ata_port_disable(ap); } @@ -2037,7 +2042,7 @@ static void mv_eng_timeout(struct ata_port *ap) struct ata_queued_cmd *qc; unsigned long flags; - printk(KERN_ERR "ata%u: Entering mv_eng_timeout\n",ap->id); + ata_port_printk(ap, KERN_ERR, "Entering mv_eng_timeout\n"); DPRINTK("All regs @ start of eng_timeout\n"); mv_dump_all_regs(ap->host_set->mmio_base, ap->port_no, to_pci_dev(ap->host_set->dev)); @@ -2390,7 +2395,7 @@ static int mv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) probe_ent->port_ops = mv_port_info[board_idx].port_ops; probe_ent->irq = pdev->irq; - probe_ent->irq_flags = SA_SHIRQ; + probe_ent->irq_flags = IRQF_SHARED; probe_ent->mmio_base = mmio_base; probe_ent->private_data = hpriv; diff --git a/drivers/scsi/sata_nv.c b/drivers/scsi/sata_nv.c index b0403ccd8..56da25581 100644 --- a/drivers/scsi/sata_nv.c +++ b/drivers/scsi/sata_nv.c @@ -4,38 +4,33 @@ * Copyright 2004 NVIDIA Corp. All rights reserved. * Copyright 2004 Andrew Chew * - * The contents of this file are subject to the Open - * Software License version 1.1 that can be found at - * http://www.opensource.org/licenses/osl-1.1.txt and is included herein - * by reference. * - * Alternatively, the contents of this file may be used under the terms - * of the GNU General Public License version 2 (the "GPL") as distributed - * in the kernel source COPYING file, in which case the provisions of - * the GPL are applicable instead of the above. If you wish to allow - * the use of your version of this file only under the terms of the - * GPL and not to allow others to use your version of this file under - * the OSL, indicate your decision by deleting the provisions above and - * replace them with the notice and other provisions required by the GPL. - * If you do not delete the provisions above, a recipient may use your - * version of this file under either the OSL or the GPL. + * 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. * - * 0.06 - * - Added generic SATA support by using a pci_device_id that filters on - * the IDE storage class code. + * 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. * - * 0.03 - * - Fixed a bug where the hotplug handlers for non-CK804/MCP04 were using - * mmio_base, which is only set for the CK804/MCP04 case. + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * - * 0.02 - * - Added support for CK804 SATA controller. * - * 0.01 - * - Initial revision. + * libata documentation is available via 'make {ps|pdf}docs', + * as Documentation/DocBook/libata.* + * + * No hardware documentation available outside of NVIDIA. + * This driver programs the NVIDIA SATA controller in a similar + * fashion as with other PCI IDE BMDMA controllers, with a few + * NV-specific details such as register offsets, SATA phy location, + * hotplug info, etc. + * */ -#include #include #include #include @@ -43,83 +38,74 @@ #include #include #include -#include "scsi.h" +#include #include #include #define DRV_NAME "sata_nv" -#define DRV_VERSION "0.6" - -#define NV_PORTS 2 -#define NV_PIO_MASK 0x1f -#define NV_MWDMA_MASK 0x07 -#define NV_UDMA_MASK 0x7f -#define NV_PORT0_SCR_REG_OFFSET 0x00 -#define NV_PORT1_SCR_REG_OFFSET 0x40 - -#define NV_INT_STATUS 0x10 -#define NV_INT_STATUS_CK804 0x440 -#define NV_INT_STATUS_PDEV_INT 0x01 -#define NV_INT_STATUS_PDEV_PM 0x02 -#define NV_INT_STATUS_PDEV_ADDED 0x04 -#define NV_INT_STATUS_PDEV_REMOVED 0x08 -#define NV_INT_STATUS_SDEV_INT 0x10 -#define NV_INT_STATUS_SDEV_PM 0x20 -#define NV_INT_STATUS_SDEV_ADDED 0x40 -#define NV_INT_STATUS_SDEV_REMOVED 0x80 -#define NV_INT_STATUS_PDEV_HOTPLUG (NV_INT_STATUS_PDEV_ADDED | \ - NV_INT_STATUS_PDEV_REMOVED) -#define NV_INT_STATUS_SDEV_HOTPLUG (NV_INT_STATUS_SDEV_ADDED | \ - NV_INT_STATUS_SDEV_REMOVED) -#define NV_INT_STATUS_HOTPLUG (NV_INT_STATUS_PDEV_HOTPLUG | \ - NV_INT_STATUS_SDEV_HOTPLUG) - -#define NV_INT_ENABLE 0x11 -#define NV_INT_ENABLE_CK804 0x441 -#define NV_INT_ENABLE_PDEV_MASK 0x01 -#define NV_INT_ENABLE_PDEV_PM 0x02 -#define NV_INT_ENABLE_PDEV_ADDED 0x04 -#define NV_INT_ENABLE_PDEV_REMOVED 0x08 -#define NV_INT_ENABLE_SDEV_MASK 0x10 -#define NV_INT_ENABLE_SDEV_PM 0x20 -#define NV_INT_ENABLE_SDEV_ADDED 0x40 -#define NV_INT_ENABLE_SDEV_REMOVED 0x80 -#define NV_INT_ENABLE_PDEV_HOTPLUG (NV_INT_ENABLE_PDEV_ADDED | \ - NV_INT_ENABLE_PDEV_REMOVED) -#define NV_INT_ENABLE_SDEV_HOTPLUG (NV_INT_ENABLE_SDEV_ADDED | \ - NV_INT_ENABLE_SDEV_REMOVED) -#define NV_INT_ENABLE_HOTPLUG (NV_INT_ENABLE_PDEV_HOTPLUG | \ - NV_INT_ENABLE_SDEV_HOTPLUG) - -#define NV_INT_CONFIG 0x12 -#define NV_INT_CONFIG_METHD 0x01 // 0 = INT, 1 = SMI - -// For PCI config register 20 -#define NV_MCP_SATA_CFG_20 0x50 -#define NV_MCP_SATA_CFG_20_SATA_SPACE_EN 0x04 +#define DRV_VERSION "2.0" + +enum { + NV_PORTS = 2, + NV_PIO_MASK = 0x1f, + NV_MWDMA_MASK = 0x07, + NV_UDMA_MASK = 0x7f, + NV_PORT0_SCR_REG_OFFSET = 0x00, + NV_PORT1_SCR_REG_OFFSET = 0x40, + + /* INT_STATUS/ENABLE */ + NV_INT_STATUS = 0x10, + NV_INT_ENABLE = 0x11, + NV_INT_STATUS_CK804 = 0x440, + NV_INT_ENABLE_CK804 = 0x441, + + /* INT_STATUS/ENABLE bits */ + NV_INT_DEV = 0x01, + NV_INT_PM = 0x02, + NV_INT_ADDED = 0x04, + NV_INT_REMOVED = 0x08, + + NV_INT_PORT_SHIFT = 4, /* each port occupies 4 bits */ + + NV_INT_ALL = 0x0f, + NV_INT_MASK = NV_INT_DEV | + NV_INT_ADDED | NV_INT_REMOVED, + + /* INT_CONFIG */ + NV_INT_CONFIG = 0x12, + NV_INT_CONFIG_METHD = 0x01, // 0 = INT, 1 = SMI + + // For PCI config register 20 + NV_MCP_SATA_CFG_20 = 0x50, + NV_MCP_SATA_CFG_20_SATA_SPACE_EN = 0x04, +}; static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent); -static irqreturn_t nv_interrupt (int irq, void *dev_instance, - struct pt_regs *regs); +static void nv_ck804_host_stop(struct ata_host_set *host_set); +static irqreturn_t nv_generic_interrupt(int irq, void *dev_instance, + struct pt_regs *regs); +static irqreturn_t nv_nf2_interrupt(int irq, void *dev_instance, + struct pt_regs *regs); +static irqreturn_t nv_ck804_interrupt(int irq, void *dev_instance, + struct pt_regs *regs); static u32 nv_scr_read (struct ata_port *ap, unsigned int sc_reg); static void nv_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val); -static void nv_host_stop (struct ata_host_set *host_set); -static void nv_enable_hotplug(struct ata_probe_ent *probe_ent); -static void nv_disable_hotplug(struct ata_host_set *host_set); -static void nv_check_hotplug(struct ata_host_set *host_set); -static void nv_enable_hotplug_ck804(struct ata_probe_ent *probe_ent); -static void nv_disable_hotplug_ck804(struct ata_host_set *host_set); -static void nv_check_hotplug_ck804(struct ata_host_set *host_set); + +static void nv_nf2_freeze(struct ata_port *ap); +static void nv_nf2_thaw(struct ata_port *ap); +static void nv_ck804_freeze(struct ata_port *ap); +static void nv_ck804_thaw(struct ata_port *ap); +static void nv_error_handler(struct ata_port *ap); enum nv_host_type { GENERIC, NFORCE2, - NFORCE3, + NFORCE3 = NFORCE2, /* NF2 == NF3 as far as sata_nv is concerned */ CK804 }; -static struct pci_device_id nv_pci_tbl[] = { +static const struct pci_device_id nv_pci_tbl[] = { { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2S_SATA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, NFORCE2 }, { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA, @@ -134,54 +120,33 @@ static struct pci_device_id nv_pci_tbl[] = { PCI_ANY_ID, PCI_ANY_ID, 0, 0, CK804 }, { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SATA2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CK804 }, + { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, GENERIC }, + { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA2, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, GENERIC }, + { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, GENERIC }, + { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA2, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, GENERIC }, + { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, GENERIC }, + { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA2, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, GENERIC }, + { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA3, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, GENERIC }, + { PCI_VENDOR_ID_NVIDIA, 0x045c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, GENERIC }, + { PCI_VENDOR_ID_NVIDIA, 0x045d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, GENERIC }, + { PCI_VENDOR_ID_NVIDIA, 0x045e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, GENERIC }, + { PCI_VENDOR_ID_NVIDIA, 0x045f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, GENERIC }, { PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_IDE<<8, 0xffff00, GENERIC }, + { PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, + PCI_ANY_ID, PCI_ANY_ID, + PCI_CLASS_STORAGE_RAID<<8, 0xffff00, GENERIC }, { 0, } /* terminate list */ }; -#define NV_HOST_FLAGS_SCR_MMIO 0x00000001 - -struct nv_host_desc -{ - enum nv_host_type host_type; - void (*enable_hotplug)(struct ata_probe_ent *probe_ent); - void (*disable_hotplug)(struct ata_host_set *host_set); - void (*check_hotplug)(struct ata_host_set *host_set); - -}; -static struct nv_host_desc nv_device_tbl[] = { - { - .host_type = GENERIC, - .enable_hotplug = NULL, - .disable_hotplug= NULL, - .check_hotplug = NULL, - }, - { - .host_type = NFORCE2, - .enable_hotplug = nv_enable_hotplug, - .disable_hotplug= nv_disable_hotplug, - .check_hotplug = nv_check_hotplug, - }, - { - .host_type = NFORCE3, - .enable_hotplug = nv_enable_hotplug, - .disable_hotplug= nv_disable_hotplug, - .check_hotplug = nv_check_hotplug, - }, - { .host_type = CK804, - .enable_hotplug = nv_enable_hotplug_ck804, - .disable_hotplug= nv_disable_hotplug_ck804, - .check_hotplug = nv_check_hotplug_ck804, - }, -}; - -struct nv_host -{ - struct nv_host_desc *host_desc; - unsigned long host_flags; -}; - static struct pci_driver nv_pci_driver = { .name = DRV_NAME, .id_table = nv_pci_tbl, @@ -189,68 +154,133 @@ static struct pci_driver nv_pci_driver = { .remove = ata_pci_remove_one, }; -static Scsi_Host_Template nv_sht = { +static struct scsi_host_template nv_sht = { .module = THIS_MODULE, .name = DRV_NAME, .ioctl = ata_scsi_ioctl, .queuecommand = ata_scsi_queuecmd, - .eh_strategy_handler = ata_scsi_error, .can_queue = ATA_DEF_QUEUE, .this_id = ATA_SHT_THIS_ID, .sg_tablesize = LIBATA_MAX_PRD, - .max_sectors = ATA_MAX_SECTORS, .cmd_per_lun = ATA_SHT_CMD_PER_LUN, .emulated = ATA_SHT_EMULATED, .use_clustering = ATA_SHT_USE_CLUSTERING, .proc_name = DRV_NAME, .dma_boundary = ATA_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, + .slave_destroy = ata_scsi_slave_destroy, .bios_param = ata_std_bios_param, - .ordered_flush = 1, }; -static struct ata_port_operations nv_ops = { +static const struct ata_port_operations nv_generic_ops = { .port_disable = ata_port_disable, .tf_load = ata_tf_load, .tf_read = ata_tf_read, .exec_command = ata_exec_command, .check_status = ata_check_status, .dev_select = ata_std_dev_select, - .phy_reset = sata_phy_reset, .bmdma_setup = ata_bmdma_setup, .bmdma_start = ata_bmdma_start, .bmdma_stop = ata_bmdma_stop, .bmdma_status = ata_bmdma_status, .qc_prep = ata_qc_prep, .qc_issue = ata_qc_issue_prot, - .eng_timeout = ata_eng_timeout, - .irq_handler = nv_interrupt, + .freeze = ata_bmdma_freeze, + .thaw = ata_bmdma_thaw, + .error_handler = nv_error_handler, + .post_internal_cmd = ata_bmdma_post_internal_cmd, + .data_xfer = ata_pio_data_xfer, + .irq_handler = nv_generic_interrupt, .irq_clear = ata_bmdma_irq_clear, .scr_read = nv_scr_read, .scr_write = nv_scr_write, .port_start = ata_port_start, .port_stop = ata_port_stop, - .host_stop = nv_host_stop, + .host_stop = ata_pci_host_stop, }; -/* FIXME: The hardware provides the necessary SATA PHY controls - * to support ATA_FLAG_SATA_RESET. However, it is currently - * necessary to disable that flag, to solve misdetection problems. - * See http://bugme.osdl.org/show_bug.cgi?id=3352 for more info. - * - * This problem really needs to be investigated further. But in the - * meantime, we avoid ATA_FLAG_SATA_RESET to get people working. - */ -static struct ata_port_info nv_port_info = { - .sht = &nv_sht, - .host_flags = ATA_FLAG_SATA | - /* ATA_FLAG_SATA_RESET | */ - ATA_FLAG_SRST | - ATA_FLAG_NO_LEGACY, - .pio_mask = NV_PIO_MASK, - .mwdma_mask = NV_MWDMA_MASK, - .udma_mask = NV_UDMA_MASK, - .port_ops = &nv_ops, +static const struct ata_port_operations nv_nf2_ops = { + .port_disable = ata_port_disable, + .tf_load = ata_tf_load, + .tf_read = ata_tf_read, + .exec_command = ata_exec_command, + .check_status = ata_check_status, + .dev_select = ata_std_dev_select, + .bmdma_setup = ata_bmdma_setup, + .bmdma_start = ata_bmdma_start, + .bmdma_stop = ata_bmdma_stop, + .bmdma_status = ata_bmdma_status, + .qc_prep = ata_qc_prep, + .qc_issue = ata_qc_issue_prot, + .freeze = nv_nf2_freeze, + .thaw = nv_nf2_thaw, + .error_handler = nv_error_handler, + .post_internal_cmd = ata_bmdma_post_internal_cmd, + .data_xfer = ata_pio_data_xfer, + .irq_handler = nv_nf2_interrupt, + .irq_clear = ata_bmdma_irq_clear, + .scr_read = nv_scr_read, + .scr_write = nv_scr_write, + .port_start = ata_port_start, + .port_stop = ata_port_stop, + .host_stop = ata_pci_host_stop, +}; + +static const struct ata_port_operations nv_ck804_ops = { + .port_disable = ata_port_disable, + .tf_load = ata_tf_load, + .tf_read = ata_tf_read, + .exec_command = ata_exec_command, + .check_status = ata_check_status, + .dev_select = ata_std_dev_select, + .bmdma_setup = ata_bmdma_setup, + .bmdma_start = ata_bmdma_start, + .bmdma_stop = ata_bmdma_stop, + .bmdma_status = ata_bmdma_status, + .qc_prep = ata_qc_prep, + .qc_issue = ata_qc_issue_prot, + .freeze = nv_ck804_freeze, + .thaw = nv_ck804_thaw, + .error_handler = nv_error_handler, + .post_internal_cmd = ata_bmdma_post_internal_cmd, + .data_xfer = ata_pio_data_xfer, + .irq_handler = nv_ck804_interrupt, + .irq_clear = ata_bmdma_irq_clear, + .scr_read = nv_scr_read, + .scr_write = nv_scr_write, + .port_start = ata_port_start, + .port_stop = ata_port_stop, + .host_stop = nv_ck804_host_stop, +}; + +static struct ata_port_info nv_port_info[] = { + /* generic */ + { + .sht = &nv_sht, + .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY, + .pio_mask = NV_PIO_MASK, + .mwdma_mask = NV_MWDMA_MASK, + .udma_mask = NV_UDMA_MASK, + .port_ops = &nv_generic_ops, + }, + /* nforce2/3 */ + { + .sht = &nv_sht, + .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY, + .pio_mask = NV_PIO_MASK, + .mwdma_mask = NV_MWDMA_MASK, + .udma_mask = NV_UDMA_MASK, + .port_ops = &nv_nf2_ops, + }, + /* ck804 */ + { + .sht = &nv_sht, + .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY, + .pio_mask = NV_PIO_MASK, + .mwdma_mask = NV_MWDMA_MASK, + .udma_mask = NV_UDMA_MASK, + .port_ops = &nv_ck804_ops, + }, }; MODULE_AUTHOR("NVIDIA"); @@ -259,11 +289,10 @@ MODULE_LICENSE("GPL"); MODULE_DEVICE_TABLE(pci, nv_pci_tbl); MODULE_VERSION(DRV_VERSION); -static irqreturn_t nv_interrupt (int irq, void *dev_instance, - struct pt_regs *regs) +static irqreturn_t nv_generic_interrupt(int irq, void *dev_instance, + struct pt_regs *regs) { struct ata_host_set *host_set = dev_instance; - struct nv_host *host = host_set->private_data; unsigned int i; unsigned int handled = 0; unsigned long flags; @@ -274,74 +303,193 @@ static irqreturn_t nv_interrupt (int irq, void *dev_instance, struct ata_port *ap; ap = host_set->ports[i]; - if (ap && (!(ap->flags & ATA_FLAG_PORT_DISABLED))) { + if (ap && + !(ap->flags & ATA_FLAG_DISABLED)) { struct ata_queued_cmd *qc; qc = ata_qc_from_tag(ap, ap->active_tag); - if (qc && (!(qc->tf.ctl & ATA_NIEN))) + if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) handled += ata_host_intr(ap, qc); + else + // No request pending? Clear interrupt status + // anyway, in case there's one pending. + ap->ops->check_status(ap); } } - if (host->host_desc->check_hotplug) - host->host_desc->check_hotplug(host_set); - spin_unlock_irqrestore(&host_set->lock, flags); return IRQ_RETVAL(handled); } -static u32 nv_scr_read (struct ata_port *ap, unsigned int sc_reg) +static int nv_host_intr(struct ata_port *ap, u8 irq_stat) +{ + struct ata_queued_cmd *qc = ata_qc_from_tag(ap, ap->active_tag); + int handled; + + /* freeze if hotplugged */ + if (unlikely(irq_stat & (NV_INT_ADDED | NV_INT_REMOVED))) { + ata_port_freeze(ap); + return 1; + } + + /* bail out if not our interrupt */ + if (!(irq_stat & NV_INT_DEV)) + return 0; + + /* DEV interrupt w/ no active qc? */ + if (unlikely(!qc || (qc->tf.flags & ATA_TFLAG_POLLING))) { + ata_check_status(ap); + return 1; + } + + /* handle interrupt */ + handled = ata_host_intr(ap, qc); + if (unlikely(!handled)) { + /* spurious, clear it */ + ata_check_status(ap); + } + + return 1; +} + +static irqreturn_t nv_do_interrupt(struct ata_host_set *host_set, u8 irq_stat) +{ + int i, handled = 0; + + for (i = 0; i < host_set->n_ports; i++) { + struct ata_port *ap = host_set->ports[i]; + + if (ap && !(ap->flags & ATA_FLAG_DISABLED)) + handled += nv_host_intr(ap, irq_stat); + + irq_stat >>= NV_INT_PORT_SHIFT; + } + + return IRQ_RETVAL(handled); +} + +static irqreturn_t nv_nf2_interrupt(int irq, void *dev_instance, + struct pt_regs *regs) { - struct ata_host_set *host_set = ap->host_set; - struct nv_host *host = host_set->private_data; + struct ata_host_set *host_set = dev_instance; + u8 irq_stat; + irqreturn_t ret; + + spin_lock(&host_set->lock); + irq_stat = inb(host_set->ports[0]->ioaddr.scr_addr + NV_INT_STATUS); + ret = nv_do_interrupt(host_set, irq_stat); + spin_unlock(&host_set->lock); + + return ret; +} + +static irqreturn_t nv_ck804_interrupt(int irq, void *dev_instance, + struct pt_regs *regs) +{ + struct ata_host_set *host_set = dev_instance; + u8 irq_stat; + irqreturn_t ret; + spin_lock(&host_set->lock); + irq_stat = readb(host_set->mmio_base + NV_INT_STATUS_CK804); + ret = nv_do_interrupt(host_set, irq_stat); + spin_unlock(&host_set->lock); + + return ret; +} + +static u32 nv_scr_read (struct ata_port *ap, unsigned int sc_reg) +{ if (sc_reg > SCR_CONTROL) return 0xffffffffU; - if (host->host_flags & NV_HOST_FLAGS_SCR_MMIO) - return readl((void*)ap->ioaddr.scr_addr + (sc_reg * 4)); - else - return inl(ap->ioaddr.scr_addr + (sc_reg * 4)); + return ioread32((void __iomem *)ap->ioaddr.scr_addr + (sc_reg * 4)); } static void nv_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val) { - struct ata_host_set *host_set = ap->host_set; - struct nv_host *host = host_set->private_data; - if (sc_reg > SCR_CONTROL) return; - if (host->host_flags & NV_HOST_FLAGS_SCR_MMIO) - writel(val, (void*)ap->ioaddr.scr_addr + (sc_reg * 4)); - else - outl(val, ap->ioaddr.scr_addr + (sc_reg * 4)); + iowrite32(val, (void __iomem *)ap->ioaddr.scr_addr + (sc_reg * 4)); +} + +static void nv_nf2_freeze(struct ata_port *ap) +{ + unsigned long scr_addr = ap->host_set->ports[0]->ioaddr.scr_addr; + int shift = ap->port_no * NV_INT_PORT_SHIFT; + u8 mask; + + mask = inb(scr_addr + NV_INT_ENABLE); + mask &= ~(NV_INT_ALL << shift); + outb(mask, scr_addr + NV_INT_ENABLE); +} + +static void nv_nf2_thaw(struct ata_port *ap) +{ + unsigned long scr_addr = ap->host_set->ports[0]->ioaddr.scr_addr; + int shift = ap->port_no * NV_INT_PORT_SHIFT; + u8 mask; + + outb(NV_INT_ALL << shift, scr_addr + NV_INT_STATUS); + + mask = inb(scr_addr + NV_INT_ENABLE); + mask |= (NV_INT_MASK << shift); + outb(mask, scr_addr + NV_INT_ENABLE); } -static void nv_host_stop (struct ata_host_set *host_set) +static void nv_ck804_freeze(struct ata_port *ap) { - struct nv_host *host = host_set->private_data; + void __iomem *mmio_base = ap->host_set->mmio_base; + int shift = ap->port_no * NV_INT_PORT_SHIFT; + u8 mask; + + mask = readb(mmio_base + NV_INT_ENABLE_CK804); + mask &= ~(NV_INT_ALL << shift); + writeb(mask, mmio_base + NV_INT_ENABLE_CK804); +} + +static void nv_ck804_thaw(struct ata_port *ap) +{ + void __iomem *mmio_base = ap->host_set->mmio_base; + int shift = ap->port_no * NV_INT_PORT_SHIFT; + u8 mask; + + writeb(NV_INT_ALL << shift, mmio_base + NV_INT_STATUS_CK804); + + mask = readb(mmio_base + NV_INT_ENABLE_CK804); + mask |= (NV_INT_MASK << shift); + writeb(mask, mmio_base + NV_INT_ENABLE_CK804); +} - // Disable hotplug event interrupts. - if (host->host_desc->disable_hotplug) - host->host_desc->disable_hotplug(host_set); +static int nv_hardreset(struct ata_port *ap, unsigned int *class) +{ + unsigned int dummy; - kfree(host); + /* SATA hardreset fails to retrieve proper device signature on + * some controllers. Don't classify on hardreset. For more + * info, see http://bugme.osdl.org/show_bug.cgi?id=3352 + */ + return sata_std_hardreset(ap, &dummy); +} - ata_host_stop(host_set); +static void nv_error_handler(struct ata_port *ap) +{ + ata_bmdma_drive_eh(ap, ata_std_prereset, ata_std_softreset, + nv_hardreset, ata_std_postreset); } static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) { static int printed_version = 0; - struct nv_host *host; struct ata_port_info *ppi; struct ata_probe_ent *probe_ent; int pci_dev_busy = 0; int rc; u32 bar; + unsigned long base; // Make sure this is a SATA controller by counting the number of bars // (NVIDIA SATA controllers will always have six bars). Otherwise, @@ -351,7 +499,7 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) return -ENODEV; if (!printed_version++) - printk(KERN_DEBUG DRV_NAME " version " DRV_VERSION "\n"); + dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n"); rc = pci_enable_device(pdev); if (rc) @@ -372,45 +520,29 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) rc = -ENOMEM; - ppi = &nv_port_info; - probe_ent = ata_pci_init_native_mode(pdev, &ppi); + ppi = &nv_port_info[ent->driver_data]; + probe_ent = ata_pci_init_native_mode(pdev, &ppi, ATA_PORT_PRIMARY | ATA_PORT_SECONDARY); if (!probe_ent) goto err_out_regions; - host = kmalloc(sizeof(struct nv_host), GFP_KERNEL); - if (!host) + probe_ent->mmio_base = pci_iomap(pdev, 5, 0); + if (!probe_ent->mmio_base) { + rc = -EIO; goto err_out_free_ent; + } - memset(host, 0, sizeof(struct nv_host)); - host->host_desc = &nv_device_tbl[ent->driver_data]; - - probe_ent->private_data = host; - - if (pci_resource_flags(pdev, 5) & IORESOURCE_MEM) - host->host_flags |= NV_HOST_FLAGS_SCR_MMIO; - - if (host->host_flags & NV_HOST_FLAGS_SCR_MMIO) { - unsigned long base; - - probe_ent->mmio_base = ioremap(pci_resource_start(pdev, 5), - pci_resource_len(pdev, 5)); - if (probe_ent->mmio_base == NULL) { - rc = -EIO; - goto err_out_free_host; - } + base = (unsigned long)probe_ent->mmio_base; - base = (unsigned long)probe_ent->mmio_base; + probe_ent->port[0].scr_addr = base + NV_PORT0_SCR_REG_OFFSET; + probe_ent->port[1].scr_addr = base + NV_PORT1_SCR_REG_OFFSET; - probe_ent->port[0].scr_addr = - base + NV_PORT0_SCR_REG_OFFSET; - probe_ent->port[1].scr_addr = - base + NV_PORT1_SCR_REG_OFFSET; - } else { + /* enable SATA space for CK804 */ + if (ent->driver_data == CK804) { + u8 regval; - probe_ent->port[0].scr_addr = - pci_resource_start(pdev, 5) | NV_PORT0_SCR_REG_OFFSET; - probe_ent->port[1].scr_addr = - pci_resource_start(pdev, 5) | NV_PORT1_SCR_REG_OFFSET; + pci_read_config_byte(pdev, NV_MCP_SATA_CFG_20, ®val); + regval |= NV_MCP_SATA_CFG_20_SATA_SPACE_EN; + pci_write_config_byte(pdev, NV_MCP_SATA_CFG_20, regval); } pci_set_master(pdev); @@ -419,19 +551,12 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) if (rc != NV_PORTS) goto err_out_iounmap; - // Enable hotplug event interrupts. - if (host->host_desc->enable_hotplug) - host->host_desc->enable_hotplug(probe_ent); - kfree(probe_ent); return 0; err_out_iounmap: - if (host->host_flags & NV_HOST_FLAGS_SCR_MMIO) - iounmap(probe_ent->mmio_base); -err_out_free_host: - kfree(host); + pci_iounmap(pdev, probe_ent->mmio_base); err_out_free_ent: kfree(probe_ent); err_out_regions: @@ -443,119 +568,17 @@ err_out: return rc; } -static void nv_enable_hotplug(struct ata_probe_ent *probe_ent) -{ - u8 intr_mask; - - outb(NV_INT_STATUS_HOTPLUG, - probe_ent->port[0].scr_addr + NV_INT_STATUS); - - intr_mask = inb(probe_ent->port[0].scr_addr + NV_INT_ENABLE); - intr_mask |= NV_INT_ENABLE_HOTPLUG; - - outb(intr_mask, probe_ent->port[0].scr_addr + NV_INT_ENABLE); -} - -static void nv_disable_hotplug(struct ata_host_set *host_set) -{ - u8 intr_mask; - - intr_mask = inb(host_set->ports[0]->ioaddr.scr_addr + NV_INT_ENABLE); - - intr_mask &= ~(NV_INT_ENABLE_HOTPLUG); - - outb(intr_mask, host_set->ports[0]->ioaddr.scr_addr + NV_INT_ENABLE); -} - -static void nv_check_hotplug(struct ata_host_set *host_set) -{ - u8 intr_status; - - intr_status = inb(host_set->ports[0]->ioaddr.scr_addr + NV_INT_STATUS); - - // Clear interrupt status. - outb(0xff, host_set->ports[0]->ioaddr.scr_addr + NV_INT_STATUS); - - if (intr_status & NV_INT_STATUS_HOTPLUG) { - if (intr_status & NV_INT_STATUS_PDEV_ADDED) - printk(KERN_WARNING "nv_sata: " - "Primary device added\n"); - - if (intr_status & NV_INT_STATUS_PDEV_REMOVED) - printk(KERN_WARNING "nv_sata: " - "Primary device removed\n"); - - if (intr_status & NV_INT_STATUS_SDEV_ADDED) - printk(KERN_WARNING "nv_sata: " - "Secondary device added\n"); - - if (intr_status & NV_INT_STATUS_SDEV_REMOVED) - printk(KERN_WARNING "nv_sata: " - "Secondary device removed\n"); - } -} - -static void nv_enable_hotplug_ck804(struct ata_probe_ent *probe_ent) -{ - struct pci_dev *pdev = to_pci_dev(probe_ent->dev); - u8 intr_mask; - u8 regval; - - pci_read_config_byte(pdev, NV_MCP_SATA_CFG_20, ®val); - regval |= NV_MCP_SATA_CFG_20_SATA_SPACE_EN; - pci_write_config_byte(pdev, NV_MCP_SATA_CFG_20, regval); - - writeb(NV_INT_STATUS_HOTPLUG, probe_ent->mmio_base + NV_INT_STATUS_CK804); - - intr_mask = readb(probe_ent->mmio_base + NV_INT_ENABLE_CK804); - intr_mask |= NV_INT_ENABLE_HOTPLUG; - - writeb(intr_mask, probe_ent->mmio_base + NV_INT_ENABLE_CK804); -} - -static void nv_disable_hotplug_ck804(struct ata_host_set *host_set) +static void nv_ck804_host_stop(struct ata_host_set *host_set) { struct pci_dev *pdev = to_pci_dev(host_set->dev); - u8 intr_mask; u8 regval; - intr_mask = readb(host_set->mmio_base + NV_INT_ENABLE_CK804); - - intr_mask &= ~(NV_INT_ENABLE_HOTPLUG); - - writeb(intr_mask, host_set->mmio_base + NV_INT_ENABLE_CK804); - + /* disable SATA space for CK804 */ pci_read_config_byte(pdev, NV_MCP_SATA_CFG_20, ®val); regval &= ~NV_MCP_SATA_CFG_20_SATA_SPACE_EN; pci_write_config_byte(pdev, NV_MCP_SATA_CFG_20, regval); -} - -static void nv_check_hotplug_ck804(struct ata_host_set *host_set) -{ - u8 intr_status; - - intr_status = readb(host_set->mmio_base + NV_INT_STATUS_CK804); - // Clear interrupt status. - writeb(0xff, host_set->mmio_base + NV_INT_STATUS_CK804); - - if (intr_status & NV_INT_STATUS_HOTPLUG) { - if (intr_status & NV_INT_STATUS_PDEV_ADDED) - printk(KERN_WARNING "nv_sata: " - "Primary device added\n"); - - if (intr_status & NV_INT_STATUS_PDEV_REMOVED) - printk(KERN_WARNING "nv_sata: " - "Primary device removed\n"); - - if (intr_status & NV_INT_STATUS_SDEV_ADDED) - printk(KERN_WARNING "nv_sata: " - "Secondary device added\n"); - - if (intr_status & NV_INT_STATUS_SDEV_REMOVED) - printk(KERN_WARNING "nv_sata: " - "Secondary device removed\n"); - } + ata_pci_host_stop(host_set); } static int __init nv_init(void) diff --git a/drivers/scsi/sata_promise.c b/drivers/scsi/sata_promise.c index df5776210..b1d865e52 100644 --- a/drivers/scsi/sata_promise.c +++ b/drivers/scsi/sata_promise.c @@ -76,7 +76,8 @@ enum { PDC_RESET = (1 << 11), /* HDMA reset */ PDC_COMMON_FLAGS = ATA_FLAG_NO_LEGACY | ATA_FLAG_SRST | - ATA_FLAG_MMIO | ATA_FLAG_NO_ATAPI, + ATA_FLAG_MMIO | ATA_FLAG_NO_ATAPI | + ATA_FLAG_PIO_POLLING, }; @@ -120,6 +121,7 @@ static struct scsi_host_template pdc_ata_sht = { .proc_name = DRV_NAME, .dma_boundary = ATA_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, + .slave_destroy = ata_scsi_slave_destroy, .bios_param = ata_std_bios_param, }; @@ -136,6 +138,7 @@ static const struct ata_port_operations pdc_sata_ops = { .qc_prep = pdc_qc_prep, .qc_issue = pdc_qc_issue_prot, .eng_timeout = pdc_eng_timeout, + .data_xfer = ata_mmio_data_xfer, .irq_handler = pdc_interrupt, .irq_clear = pdc_irq_clear, @@ -158,6 +161,7 @@ static const struct ata_port_operations pdc_pata_ops = { .qc_prep = pdc_qc_prep, .qc_issue = pdc_qc_issue_prot, + .data_xfer = ata_mmio_data_xfer, .eng_timeout = pdc_eng_timeout, .irq_handler = pdc_interrupt, .irq_clear = pdc_irq_clear, @@ -265,8 +269,15 @@ static const struct pci_device_id pdc_ata_pci_tbl[] = { { PCI_VENDOR_ID_PROMISE, 0x6629, PCI_ANY_ID, PCI_ANY_ID, 0, 0, board_20619 }, +/* TODO: remove all associated board_20771 code, as it completely + * duplicates board_2037x code, unless reason for separation can be + * divined. + */ +#if 0 { PCI_VENDOR_ID_PROMISE, 0x3570, PCI_ANY_ID, PCI_ANY_ID, 0, 0, board_20771 }, +#endif + { } /* terminate list */ }; @@ -359,35 +370,41 @@ static void pdc_reset_port(struct ata_port *ap) static void pdc_sata_phy_reset(struct ata_port *ap) { -/* pdc_reset_port(ap); */ /* pata fix */ -/* sata_phy_reset(ap); */ /* pata fix */ - /* if no sata flag, test for pata drive */ /* pata fix */ - if (ap->flags & ATA_FLAG_SATA) /* pata fix */ - { /* pata fix */ - pdc_reset_port(ap); /* pata fix */ - sata_phy_reset(ap); /* pata fix */ - } /* pata fix */ - else /* pata fix */ - pdc_pata_phy_reset(ap); /* pata fix */ + /* pdc_reset_port(ap); */ /* pata fix */ + /* sata_phy_reset(ap); */ /* pata fix */ + /* if no sata flag, test for pata drive */ /* pata fix */ + if (ap->flags & ATA_FLAG_SATA) /* pata fix */ + { /* pata fix */ + pdc_reset_port(ap); /* pata fix */ + sata_phy_reset(ap); /* pata fix */ + } /* pata fix */ + else /* pata fix */ + pdc_pata_phy_reset(ap); /* pata fix */ +} + +static void pdc_pata_cbl_detect(struct ata_port *ap) +{ + u8 tmp; + void __iomem *mmio = (void *) ap->ioaddr.cmd_addr + PDC_CTLSTAT + 0x03; + + tmp = readb(mmio); + + if (tmp & 0x01) { + ap->cbl = ATA_CBL_PATA40; + ap->udma_mask &= ATA_UDMA_MASK_40C; + } else + ap->cbl = ATA_CBL_PATA80; } static void pdc_pata_phy_reset(struct ata_port *ap) { - /* FIXME: add cable detect. Don't assume 40-pin cable */ -/* ap->cbl = ATA_CBL_PATA40; */ /* pata fix */ -/* ap->udma_mask &= ATA_UDMA_MASK_40C; */ /* pata fix */ - /* add cable detection code for pata drives */ /* pata fix */ - u8 tmp; /* pata fix */ - void *mmio = (void *) ap->ioaddr.cmd_addr + PDC_CTLSTAT + 0x03; /* pata fix */ - tmp = readb(mmio); /* pata fix */ - if (tmp & 0x01) /* pata fix */ - { /* pata fix */ - ap->cbl = ATA_CBL_PATA40; /* pata fix */ - ap->udma_mask &= ATA_UDMA_MASK_40C; /* pata fix */ - } /* pata fix */ - else /* pata fix */ - ap->cbl = ATA_CBL_PATA80; /* pata fix */ + u8 tmp; /* pata fix */ + void *mmio = (void *) ap->ioaddr.cmd_addr + PDC_CTLSTAT + 0x03; /* pata fix */ + tmp = readb(mmio); /* pata fix */ + if (tmp & 0x01) /* pata fix */ + ap->udma_mask &= ATA_UDMA_MASK_40C; /* pata fix */ + pdc_pata_cbl_detect(ap); pdc_reset_port(ap); ata_port_probe(ap); ata_bus_reset(ap); @@ -454,7 +471,7 @@ static void pdc_eng_timeout(struct ata_port *ap) switch (qc->tf.protocol) { case ATA_PROT_DMA: case ATA_PROT_NODATA: - printk(KERN_ERR "ata%u: command timeout\n", ap->id); + ata_port_printk(ap, KERN_ERR, "command timeout\n"); drv_stat = ata_wait_idle(ap); qc->err_mask |= __ac_err_mask(drv_stat); break; @@ -462,8 +479,9 @@ static void pdc_eng_timeout(struct ata_port *ap) default: drv_stat = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000); - printk(KERN_ERR "ata%u: unknown timeout, cmd 0x%x stat 0x%x\n", - ap->id, qc->tf.command, drv_stat); + ata_port_printk(ap, KERN_ERR, + "unknown timeout, cmd 0x%x stat 0x%x\n", + qc->tf.command, drv_stat); qc->err_mask |= ac_err_mask(drv_stat); break; @@ -552,11 +570,11 @@ static irqreturn_t pdc_interrupt (int irq, void *dev_instance, struct pt_regs *r ap = host_set->ports[i]; tmp = mask & (1 << (i + 1)); if (tmp && ap && - !(ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR))) { + !(ap->flags & ATA_FLAG_DISABLED)) { struct ata_queued_cmd *qc; qc = ata_qc_from_tag(ap, ap->active_tag); - if (qc && (!(qc->tf.ctl & ATA_NIEN))) + if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) handled += pdc_host_intr(ap, qc); } } @@ -696,10 +714,6 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e if (!printed_version++) dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n"); - /* - * If this driver happens to only be useful on Apple's K2, then - * we should check that here as it has a normal Serverworks ID - */ rc = pci_enable_device(pdev); if (rc) return rc; @@ -751,7 +765,7 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e probe_ent->port_ops = pdc_port_info[board_idx].port_ops; probe_ent->irq = pdev->irq; - probe_ent->irq_flags = SA_SHIRQ; + probe_ent->irq_flags = IRQF_SHARED; probe_ent->mmio_base = mmio_base; pdc_ata_setup_port(&probe_ent->port[0], base + 0x200); diff --git a/drivers/scsi/sata_qstor.c b/drivers/scsi/sata_qstor.c index 1383e8a28..d374c1db0 100644 --- a/drivers/scsi/sata_qstor.c +++ b/drivers/scsi/sata_qstor.c @@ -6,21 +6,24 @@ * Copyright 2005 Pacific Digital Corporation. * (OSL/GPL code release authorized by Jalil Fadavi). * - * The contents of this file are subject to the Open - * Software License version 1.1 that can be found at - * http://www.opensource.org/licenses/osl-1.1.txt and is included herein - * by reference. * - * Alternatively, the contents of this file may be used under the terms - * of the GNU General Public License version 2 (the "GPL") as distributed - * in the kernel source COPYING file, in which case the provisions of - * the GPL are applicable instead of the above. If you wish to allow - * the use of your version of this file only under the terms of the - * GPL and not to allow others to use your version of this file under - * the OSL, indicate your decision by deleting the provisions above and - * replace them with the notice and other provisions required by the GPL. - * If you do not delete the provisions above, a recipient may use your - * version of this file under either the OSL or the GPL. + * 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; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * + * + * libata documentation is available via 'make {ps|pdf}docs', + * as Documentation/DocBook/libata.* * */ @@ -32,13 +35,13 @@ #include #include #include -#include "scsi.h" +#include #include #include #include #define DRV_NAME "sata_qstor" -#define DRV_VERSION "0.04" +#define DRV_VERSION "0.06" enum { QS_PORTS = 4, @@ -48,8 +51,6 @@ enum { QS_PRD_BYTES = QS_MAX_PRD * 16, QS_PKT_BYTES = QS_CPB_BYTES + QS_PRD_BYTES, - QS_DMA_BOUNDARY = ~0UL, - /* global register offsets */ QS_HCF_CNFG3 = 0x0003, /* host configuration offset */ QS_HID_HPHY = 0x0004, /* host physical interface info */ @@ -98,6 +99,10 @@ enum { board_2068_idx = 0, /* QStor 4-port SATA/RAID */ }; +enum { + QS_DMA_BOUNDARY = ~0UL +}; + typedef enum { qs_state_idle, qs_state_pkt, qs_state_mmio } qs_state_t; struct qs_port_priv { @@ -115,23 +120,21 @@ static void qs_host_stop(struct ata_host_set *host_set); static void qs_port_stop(struct ata_port *ap); static void qs_phy_reset(struct ata_port *ap); static void qs_qc_prep(struct ata_queued_cmd *qc); -static int qs_qc_issue(struct ata_queued_cmd *qc); +static unsigned int qs_qc_issue(struct ata_queued_cmd *qc); static int qs_check_atapi_dma(struct ata_queued_cmd *qc); -static void qs_bmdma_stop(struct ata_port *ap); +static void qs_bmdma_stop(struct ata_queued_cmd *qc); static u8 qs_bmdma_status(struct ata_port *ap); static void qs_irq_clear(struct ata_port *ap); static void qs_eng_timeout(struct ata_port *ap); -static Scsi_Host_Template qs_ata_sht = { +static struct scsi_host_template qs_ata_sht = { .module = THIS_MODULE, .name = DRV_NAME, .ioctl = ata_scsi_ioctl, .queuecommand = ata_scsi_queuecmd, - .eh_strategy_handler = ata_scsi_error, .can_queue = ATA_DEF_QUEUE, .this_id = ATA_SHT_THIS_ID, .sg_tablesize = QS_MAX_PRD, - .max_sectors = ATA_MAX_SECTORS, .cmd_per_lun = ATA_SHT_CMD_PER_LUN, .emulated = ATA_SHT_EMULATED, //FIXME .use_clustering = ATA_SHT_USE_CLUSTERING, @@ -139,10 +142,11 @@ static Scsi_Host_Template qs_ata_sht = { .proc_name = DRV_NAME, .dma_boundary = QS_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, + .slave_destroy = ata_scsi_slave_destroy, .bios_param = ata_std_bios_param, }; -static struct ata_port_operations qs_ata_ops = { +static const struct ata_port_operations qs_ata_ops = { .port_disable = ata_port_disable, .tf_load = ata_tf_load, .tf_read = ata_tf_read, @@ -153,6 +157,7 @@ static struct ata_port_operations qs_ata_ops = { .phy_reset = qs_phy_reset, .qc_prep = qs_qc_prep, .qc_issue = qs_qc_issue, + .data_xfer = ata_mmio_data_xfer, .eng_timeout = qs_eng_timeout, .irq_handler = qs_intr, .irq_clear = qs_irq_clear, @@ -165,21 +170,21 @@ static 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, .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | ATA_FLAG_SATA_RESET | //FIXME ATA_FLAG_SRST | - ATA_FLAG_MMIO, + ATA_FLAG_MMIO | ATA_FLAG_PIO_POLLING, .pio_mask = 0x10, /* pio4 */ .udma_mask = 0x7f, /* udma0-6 */ .port_ops = &qs_ata_ops, }, }; -static struct pci_device_id qs_ata_pci_tbl[] = { +static const struct pci_device_id qs_ata_pci_tbl[] = { { PCI_VENDOR_ID_PDC, 0x2068, PCI_ANY_ID, PCI_ANY_ID, 0, 0, board_2068_idx }, @@ -198,7 +203,7 @@ static int qs_check_atapi_dma(struct ata_queued_cmd *qc) return 1; /* ATAPI DMA not supported */ } -static void qs_bmdma_stop(struct ata_port *ap) +static void qs_bmdma_stop(struct ata_queued_cmd *qc) { /* nothing */ } @@ -263,18 +268,19 @@ static void qs_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val) writel(val, (void __iomem *)(ap->ioaddr.scr_addr + (sc_reg * 8))); } -static void qs_fill_sg(struct ata_queued_cmd *qc) +static unsigned int qs_fill_sg(struct ata_queued_cmd *qc) { - struct scatterlist *sg = qc->sg; + struct scatterlist *sg; struct ata_port *ap = qc->ap; struct qs_port_priv *pp = ap->private_data; unsigned int nelem; u8 *prd = pp->pkt + QS_CPB_BYTES; - assert(sg != NULL); - assert(qc->n_elem > 0); + WARN_ON(qc->__sg == NULL); + WARN_ON(qc->n_elem == 0 && qc->pad_len == 0); - for (nelem = 0; nelem < qc->n_elem; nelem++,sg++) { + nelem = 0; + ata_for_each_sg(sg, qc) { u64 addr; u32 len; @@ -288,7 +294,10 @@ static void qs_fill_sg(struct ata_queued_cmd *qc) VPRINTK("PRD[%u] = (0x%llX, 0x%X)\n", nelem, (unsigned long long)addr, len); + nelem++; } + + return nelem; } static void qs_qc_prep(struct ata_queued_cmd *qc) @@ -297,6 +306,7 @@ static void qs_qc_prep(struct ata_queued_cmd *qc) u8 dflags = QS_DF_PORD, *buf = pp->pkt; u8 hflags = QS_HF_DAT | QS_HF_IEN | QS_HF_VLD; u64 addr; + unsigned int nelem; VPRINTK("ENTER\n"); @@ -306,7 +316,7 @@ static void qs_qc_prep(struct ata_queued_cmd *qc) return; } - qs_fill_sg(qc); + nelem = qs_fill_sg(qc); if ((qc->tf.flags & ATA_TFLAG_WRITE)) hflags |= QS_HF_DIRO; @@ -317,7 +327,7 @@ static void qs_qc_prep(struct ata_queued_cmd *qc) buf[ 0] = QS_HCB_HDR; buf[ 1] = hflags; *(__le32 *)(&buf[ 4]) = cpu_to_le32(qc->nsect * ATA_SECT_SIZE); - *(__le32 *)(&buf[ 8]) = cpu_to_le32(qc->n_elem); + *(__le32 *)(&buf[ 8]) = cpu_to_le32(nelem); addr = ((u64)pp->pkt_dma) + QS_CPB_BYTES; *(__le64 *)(&buf[16]) = cpu_to_le64(addr); @@ -342,7 +352,7 @@ static inline void qs_packet_start(struct ata_queued_cmd *qc) readl(chan + QS_CCT_CFF); /* flush */ } -static int qs_qc_issue(struct ata_queued_cmd *qc) +static unsigned int qs_qc_issue(struct ata_queued_cmd *qc) { struct qs_port_priv *pp = qc->ap->private_data; @@ -386,19 +396,20 @@ static inline unsigned int qs_intr_pkt(struct ata_host_set *host_set) DPRINTK("SFF=%08x%08x: sCHAN=%u sHST=%d sDST=%02x\n", sff1, sff0, port_no, sHST, sDST); handled = 1; - if (ap && (!(ap->flags & ATA_FLAG_PORT_DISABLED))) { + if (ap && !(ap->flags & ATA_FLAG_DISABLED)) { struct ata_queued_cmd *qc; struct qs_port_priv *pp = ap->private_data; if (!pp || pp->state != qs_state_pkt) continue; qc = ata_qc_from_tag(ap, ap->active_tag); - if (qc && (!(qc->tf.ctl & ATA_NIEN))) { + if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) { switch (sHST) { - case 0: /* sucessful CPB */ + case 0: /* successful CPB */ case 3: /* device error */ pp->state = qs_state_idle; qs_enter_reg_mode(qc->ap); - ata_qc_complete(qc, sDST); + qc->err_mask |= ac_err_mask(sDST); + ata_qc_complete(qc); break; default: break; @@ -417,24 +428,26 @@ static inline unsigned int qs_intr_mmio(struct ata_host_set *host_set) for (port_no = 0; port_no < host_set->n_ports; ++port_no) { struct ata_port *ap; ap = host_set->ports[port_no]; - if (ap && (!(ap->flags & ATA_FLAG_PORT_DISABLED))) { + if (ap && + !(ap->flags & ATA_FLAG_DISABLED)) { struct ata_queued_cmd *qc; struct qs_port_priv *pp = ap->private_data; if (!pp || pp->state != qs_state_mmio) continue; qc = ata_qc_from_tag(ap, ap->active_tag); - if (qc && (!(qc->tf.ctl & ATA_NIEN))) { + if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) { /* check main status, clearing INTRQ */ - u8 status = ata_chk_status(ap); + u8 status = ata_check_status(ap); if ((status & ATA_BUSY)) continue; DPRINTK("ata%u: protocol %d (dev_stat 0x%X)\n", ap->id, qc->tf.protocol, status); - + /* complete taskfile transaction */ pp->state = qs_state_idle; - ata_qc_complete(qc, status); + qc->err_mask |= ac_err_mask(status); + ata_qc_complete(qc); handled = 1; } } @@ -489,7 +502,7 @@ static int qs_port_start(struct ata_port *ap) if (rc) return rc; qs_enter_reg_mode(ap); - pp = kcalloc(1, sizeof(*pp), GFP_KERNEL); + pp = kzalloc(sizeof(*pp), GFP_KERNEL); if (!pp) { rc = -ENOMEM; goto err_out; @@ -533,11 +546,12 @@ static void qs_port_stop(struct ata_port *ap) static void qs_host_stop(struct ata_host_set *host_set) { void __iomem *mmio_base = host_set->mmio_base; + struct pci_dev *pdev = to_pci_dev(host_set->dev); writeb(0, mmio_base + QS_HCT_CTRL); /* disable host interrupts */ writeb(QS_CNFG3_GSRST, mmio_base + QS_HCF_CNFG3); /* global reset */ - ata_host_stop(host_set); + pci_iounmap(pdev, mmio_base); } static void qs_host_init(unsigned int chip_id, struct ata_probe_ent *pe) @@ -591,25 +605,22 @@ static int qs_set_dma_masks(struct pci_dev *pdev, void __iomem *mmio_base) if (rc) { rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK); if (rc) { - printk(KERN_ERR DRV_NAME - "(%s): 64-bit DMA enable failed\n", - pci_name(pdev)); + dev_printk(KERN_ERR, &pdev->dev, + "64-bit DMA enable failed\n"); return rc; } } } else { rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK); if (rc) { - printk(KERN_ERR DRV_NAME - "(%s): 32-bit DMA enable failed\n", - pci_name(pdev)); + dev_printk(KERN_ERR, &pdev->dev, + "32-bit DMA enable failed\n"); return rc; } rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK); if (rc) { - printk(KERN_ERR DRV_NAME - "(%s): 32-bit consistent DMA enable failed\n", - pci_name(pdev)); + dev_printk(KERN_ERR, &pdev->dev, + "32-bit consistent DMA enable failed\n"); return rc; } } @@ -626,7 +637,7 @@ static int qs_ata_init_one(struct pci_dev *pdev, int rc, port_no; if (!printed_version++) - printk(KERN_DEBUG DRV_NAME " version " DRV_VERSION "\n"); + dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n"); rc = pci_enable_device(pdev); if (rc) @@ -641,8 +652,7 @@ static int qs_ata_init_one(struct pci_dev *pdev, goto err_out_regions; } - mmio_base = ioremap(pci_resource_start(pdev, 4), - pci_resource_len(pdev, 4)); + mmio_base = pci_iomap(pdev, 4, 0); if (mmio_base == NULL) { rc = -ENOMEM; goto err_out_regions; @@ -670,7 +680,7 @@ static int qs_ata_init_one(struct pci_dev *pdev, probe_ent->port_ops = qs_port_info[board_idx].port_ops; probe_ent->irq = pdev->irq; - probe_ent->irq_flags = SA_SHIRQ; + probe_ent->irq_flags = IRQF_SHARED; probe_ent->mmio_base = mmio_base; probe_ent->n_ports = QS_PORTS; @@ -692,7 +702,7 @@ static int qs_ata_init_one(struct pci_dev *pdev, return 0; err_out_iounmap: - iounmap(mmio_base); + pci_iounmap(pdev, mmio_base); err_out_regions: pci_release_regions(pdev); err_out: diff --git a/drivers/scsi/sata_sil.c b/drivers/scsi/sata_sil.c index 106627299..d0a85073e 100644 --- a/drivers/scsi/sata_sil.c +++ b/drivers/scsi/sata_sil.c @@ -46,23 +46,26 @@ #include #define DRV_NAME "sata_sil" -#define DRV_VERSION "0.9" +#define DRV_VERSION "2.0" enum { /* * host flags */ + SIL_FLAG_NO_SATA_IRQ = (1 << 28), SIL_FLAG_RERR_ON_DMA_ACT = (1 << 29), SIL_FLAG_MOD15WRITE = (1 << 30), + SIL_DFL_HOST_FLAGS = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | - ATA_FLAG_MMIO, + ATA_FLAG_MMIO | ATA_FLAG_HRST_TO_RESUME, /* * Controller IDs */ sil_3112 = 0, - sil_3512 = 1, - sil_3114 = 2, + sil_3112_no_sata_irq = 1, + sil_3512 = 2, + sil_3114 = 3, /* * Register offsets @@ -84,6 +87,20 @@ enum { /* BMDMA/BMDMA2 */ SIL_INTR_STEERING = (1 << 1), + SIL_DMA_ENABLE = (1 << 0), /* DMA run switch */ + SIL_DMA_RDWR = (1 << 3), /* DMA Rd-Wr */ + SIL_DMA_SATA_IRQ = (1 << 4), /* OR of all SATA IRQs */ + SIL_DMA_ACTIVE = (1 << 16), /* DMA running */ + SIL_DMA_ERROR = (1 << 17), /* PCI bus error */ + SIL_DMA_COMPLETE = (1 << 18), /* cmd complete / IRQ pending */ + SIL_DMA_N_SATA_IRQ = (1 << 6), /* SATA_IRQ for the next channel */ + SIL_DMA_N_ACTIVE = (1 << 24), /* ACTIVE for the next channel */ + SIL_DMA_N_ERROR = (1 << 25), /* ERROR for the next channel */ + SIL_DMA_N_COMPLETE = (1 << 26), /* COMPLETE for the next channel */ + + /* SIEN */ + SIL_SIEN_N = (1 << 16), /* triggered by SError.N */ + /* * Others */ @@ -92,10 +109,15 @@ enum { }; static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent); +static int sil_pci_device_resume(struct pci_dev *pdev); static void sil_dev_config(struct ata_port *ap, struct ata_device *dev); static u32 sil_scr_read (struct ata_port *ap, unsigned int sc_reg); static void sil_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val); static void sil_post_set_mode (struct ata_port *ap); +static irqreturn_t sil_interrupt(int irq, void *dev_instance, + struct pt_regs *regs); +static void sil_freeze(struct ata_port *ap); +static void sil_thaw(struct ata_port *ap); static const struct pci_device_id sil_pci_tbl[] = { @@ -104,8 +126,8 @@ static const struct pci_device_id sil_pci_tbl[] = { { 0x1095, 0x3512, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3512 }, { 0x1095, 0x3114, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3114 }, { 0x1002, 0x436e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 }, - { 0x1002, 0x4379, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 }, - { 0x1002, 0x437a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 }, + { 0x1002, 0x4379, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112_no_sata_irq }, + { 0x1002, 0x437a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112_no_sata_irq }, { } /* terminate list */ }; @@ -139,6 +161,8 @@ static struct pci_driver sil_pci_driver = { .id_table = sil_pci_tbl, .probe = sil_init_one, .remove = ata_pci_remove_one, + .suspend = ata_pci_device_suspend, + .resume = sil_pci_device_resume, }; static struct scsi_host_template sil_sht = { @@ -155,7 +179,10 @@ static struct scsi_host_template sil_sht = { .proc_name = DRV_NAME, .dma_boundary = ATA_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, + .slave_destroy = ata_scsi_slave_destroy, .bios_param = ata_std_bios_param, + .suspend = ata_scsi_device_suspend, + .resume = ata_scsi_device_resume, }; static const struct ata_port_operations sil_ops = { @@ -166,7 +193,6 @@ static const struct ata_port_operations sil_ops = { .check_status = ata_check_status, .exec_command = ata_exec_command, .dev_select = ata_std_dev_select, - .probe_reset = ata_std_probe_reset, .post_set_mode = sil_post_set_mode, .bmdma_setup = ata_bmdma_setup, .bmdma_start = ata_bmdma_start, @@ -174,8 +200,12 @@ static const struct ata_port_operations sil_ops = { .bmdma_status = ata_bmdma_status, .qc_prep = ata_qc_prep, .qc_issue = ata_qc_issue_prot, - .eng_timeout = ata_eng_timeout, - .irq_handler = ata_interrupt, + .data_xfer = ata_mmio_data_xfer, + .freeze = sil_freeze, + .thaw = sil_thaw, + .error_handler = ata_bmdma_error_handler, + .post_internal_cmd = ata_bmdma_post_internal_cmd, + .irq_handler = sil_interrupt, .irq_clear = ata_bmdma_irq_clear, .scr_read = sil_scr_read, .scr_write = sil_scr_write, @@ -194,6 +224,16 @@ static const struct ata_port_info sil_port_info[] = { .udma_mask = 0x3f, /* udma0-5 */ .port_ops = &sil_ops, }, + /* sil_3112_no_sata_irq */ + { + .sht = &sil_sht, + .host_flags = SIL_DFL_HOST_FLAGS | SIL_FLAG_MOD15WRITE | + SIL_FLAG_NO_SATA_IRQ, + .pio_mask = 0x1f, /* pio0-4 */ + .mwdma_mask = 0x07, /* mwdma0-2 */ + .udma_mask = 0x3f, /* udma0-5 */ + .port_ops = &sil_ops, + }, /* sil_3512 */ { .sht = &sil_sht, @@ -220,6 +260,7 @@ static const struct { unsigned long tf; /* ATA taskfile register block */ unsigned long ctl; /* ATA control/altstatus register block */ unsigned long bmdma; /* DMA register block */ + unsigned long bmdma2; /* DMA register block #2 */ unsigned long fifo_cfg; /* FIFO Valid Byte Count and Control */ unsigned long scr; /* SATA control register block */ unsigned long sien; /* SATA Interrupt Enable register */ @@ -227,10 +268,10 @@ static const struct { unsigned long sfis_cfg; /* SATA FIS reception config register */ } sil_port[] = { /* port 0 ... */ - { 0x80, 0x8A, 0x00, 0x40, 0x100, 0x148, 0xb4, 0x14c }, - { 0xC0, 0xCA, 0x08, 0x44, 0x180, 0x1c8, 0xf4, 0x1cc }, - { 0x280, 0x28A, 0x200, 0x240, 0x300, 0x348, 0x2b4, 0x34c }, - { 0x2C0, 0x2CA, 0x208, 0x244, 0x380, 0x3c8, 0x2f4, 0x3cc }, + { 0x80, 0x8A, 0x00, 0x10, 0x40, 0x100, 0x148, 0xb4, 0x14c }, + { 0xC0, 0xCA, 0x08, 0x18, 0x44, 0x180, 0x1c8, 0xf4, 0x1cc }, + { 0x280, 0x28A, 0x200, 0x210, 0x240, 0x300, 0x348, 0x2b4, 0x34c }, + { 0x2C0, 0x2CA, 0x208, 0x218, 0x244, 0x380, 0x3c8, 0x2f4, 0x3cc }, /* ... port 3 */ }; @@ -263,7 +304,7 @@ static void sil_post_set_mode (struct ata_port *ap) for (i = 0; i < 2; i++) { dev = &ap->device[i]; - if (!ata_dev_present(dev)) + if (!ata_dev_enabled(dev)) dev_mode[i] = 0; /* PIO0/1/2 */ else if (dev->flags & ATA_DFLAG_PIO) dev_mode[i] = 1; /* PIO3/4 */ @@ -314,6 +355,156 @@ static void sil_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val) writel(val, mmio); } +static void sil_host_intr(struct ata_port *ap, u32 bmdma2) +{ + struct ata_queued_cmd *qc = ata_qc_from_tag(ap, ap->active_tag); + u8 status; + + if (unlikely(bmdma2 & SIL_DMA_SATA_IRQ)) { + u32 serror; + + /* SIEN doesn't mask SATA IRQs on some 3112s. Those + * controllers continue to assert IRQ as long as + * SError bits are pending. Clear SError immediately. + */ + serror = sil_scr_read(ap, SCR_ERROR); + sil_scr_write(ap, SCR_ERROR, serror); + + /* Trigger hotplug and accumulate SError only if the + * port isn't already frozen. Otherwise, PHY events + * during hardreset makes controllers with broken SIEN + * repeat probing needlessly. + */ + if (!(ap->pflags & ATA_PFLAG_FROZEN)) { + ata_ehi_hotplugged(&ap->eh_info); + ap->eh_info.serror |= serror; + } + + goto freeze; + } + + if (unlikely(!qc || qc->tf.ctl & ATA_NIEN)) + goto freeze; + + /* Check whether we are expecting interrupt in this state */ + switch (ap->hsm_task_state) { + case HSM_ST_FIRST: + /* Some pre-ATAPI-4 devices assert INTRQ + * at this state when ready to receive CDB. + */ + + /* Check the ATA_DFLAG_CDB_INTR flag is enough here. + * The flag was turned on only for atapi devices. + * No need to check is_atapi_taskfile(&qc->tf) again. + */ + if (!(qc->dev->flags & ATA_DFLAG_CDB_INTR)) + goto err_hsm; + break; + case HSM_ST_LAST: + if (qc->tf.protocol == ATA_PROT_DMA || + qc->tf.protocol == ATA_PROT_ATAPI_DMA) { + /* clear DMA-Start bit */ + ap->ops->bmdma_stop(qc); + + if (bmdma2 & SIL_DMA_ERROR) { + qc->err_mask |= AC_ERR_HOST_BUS; + ap->hsm_task_state = HSM_ST_ERR; + } + } + break; + case HSM_ST: + break; + default: + goto err_hsm; + } + + /* check main status, clearing INTRQ */ + status = ata_chk_status(ap); + if (unlikely(status & ATA_BUSY)) + goto err_hsm; + + /* ack bmdma irq events */ + ata_bmdma_irq_clear(ap); + + /* kick HSM in the ass */ + ata_hsm_move(ap, qc, status, 0); + + return; + + err_hsm: + qc->err_mask |= AC_ERR_HSM; + freeze: + ata_port_freeze(ap); +} + +static irqreturn_t sil_interrupt(int irq, void *dev_instance, + struct pt_regs *regs) +{ + struct ata_host_set *host_set = dev_instance; + void __iomem *mmio_base = host_set->mmio_base; + int handled = 0; + int i; + + spin_lock(&host_set->lock); + + for (i = 0; i < host_set->n_ports; i++) { + struct ata_port *ap = host_set->ports[i]; + u32 bmdma2 = readl(mmio_base + sil_port[ap->port_no].bmdma2); + + if (unlikely(!ap || ap->flags & ATA_FLAG_DISABLED)) + continue; + + /* turn off SATA_IRQ if not supported */ + if (ap->flags & SIL_FLAG_NO_SATA_IRQ) + bmdma2 &= ~SIL_DMA_SATA_IRQ; + + if (bmdma2 == 0xffffffff || + !(bmdma2 & (SIL_DMA_COMPLETE | SIL_DMA_SATA_IRQ))) + continue; + + sil_host_intr(ap, bmdma2); + handled = 1; + } + + spin_unlock(&host_set->lock); + + return IRQ_RETVAL(handled); +} + +static void sil_freeze(struct ata_port *ap) +{ + void __iomem *mmio_base = ap->host_set->mmio_base; + u32 tmp; + + /* global IRQ mask doesn't block SATA IRQ, turn off explicitly */ + writel(0, mmio_base + sil_port[ap->port_no].sien); + + /* plug IRQ */ + tmp = readl(mmio_base + SIL_SYSCFG); + tmp |= SIL_MASK_IDE0_INT << ap->port_no; + writel(tmp, mmio_base + SIL_SYSCFG); + readl(mmio_base + SIL_SYSCFG); /* flush */ +} + +static void sil_thaw(struct ata_port *ap) +{ + void __iomem *mmio_base = ap->host_set->mmio_base; + u32 tmp; + + /* clear IRQ */ + ata_chk_status(ap); + ata_bmdma_irq_clear(ap); + + /* turn on SATA IRQ if supported */ + if (!(ap->flags & SIL_FLAG_NO_SATA_IRQ)) + writel(SIL_SIEN_N, mmio_base + sil_port[ap->port_no].sien); + + /* turn on IRQ */ + tmp = readl(mmio_base + SIL_SYSCFG); + tmp &= ~(SIL_MASK_IDE0_INT << ap->port_no); + writel(tmp, mmio_base + SIL_SYSCFG); +} + /** * sil_dev_config - Apply device/host-specific errata fixups * @ap: Port containing device to be examined @@ -360,21 +551,67 @@ static void sil_dev_config(struct ata_port *ap, struct ata_device *dev) if (slow_down || ((ap->flags & SIL_FLAG_MOD15WRITE) && (quirks & SIL_QUIRK_MOD15WRITE))) { - printk(KERN_INFO "ata%u(%u): applying Seagate errata fix (mod15write workaround)\n", - ap->id, dev->devno); + ata_dev_printk(dev, KERN_INFO, "applying Seagate errata fix " + "(mod15write workaround)\n"); dev->max_sectors = 15; return; } /* limit to udma5 */ if (quirks & SIL_QUIRK_UDMA5MAX) { - printk(KERN_INFO "ata%u(%u): applying Maxtor errata fix %s\n", - ap->id, dev->devno, model_num); + ata_dev_printk(dev, KERN_INFO, + "applying Maxtor errata fix %s\n", model_num); dev->udma_mask &= ATA_UDMA5; return; } } +static void sil_init_controller(struct pci_dev *pdev, + int n_ports, unsigned long host_flags, + void __iomem *mmio_base) +{ + u8 cls; + u32 tmp; + int i; + + /* Initialize FIFO PCI bus arbitration */ + cls = sil_get_device_cache_line(pdev); + if (cls) { + cls >>= 3; + cls++; /* cls = (line_size/8)+1 */ + for (i = 0; i < n_ports; i++) + writew(cls << 8 | cls, + mmio_base + sil_port[i].fifo_cfg); + } else + dev_printk(KERN_WARNING, &pdev->dev, + "cache line size not set. Driver may not function\n"); + + /* Apply R_ERR on DMA activate FIS errata workaround */ + if (host_flags & SIL_FLAG_RERR_ON_DMA_ACT) { + int cnt; + + for (i = 0, cnt = 0; i < n_ports; i++) { + tmp = readl(mmio_base + sil_port[i].sfis_cfg); + if ((tmp & 0x3) != 0x01) + continue; + if (!cnt) + dev_printk(KERN_INFO, &pdev->dev, + "Applying R_ERR on DMA activate " + "FIS errata fix\n"); + writel(tmp & ~0x3, mmio_base + sil_port[i].sfis_cfg); + cnt++; + } + } + + if (n_ports == 4) { + /* flip the magic "make 4 ports work" bit */ + tmp = readl(mmio_base + sil_port[2].bmdma); + if ((tmp & SIL_INTR_STEERING) == 0) + writel(tmp | SIL_INTR_STEERING, + mmio_base + sil_port[2].bmdma); + } +} + static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) { static int printed_version; @@ -384,16 +621,10 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) int rc; unsigned int i; int pci_dev_busy = 0; - u32 tmp, irq_mask; - u8 cls; if (!printed_version++) dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n"); - /* - * If this driver happens to only be useful on Apple's K2, then - * we should check that here as it has a normal Serverworks ID - */ rc = pci_enable_device(pdev); if (rc) return rc; @@ -426,7 +657,7 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) probe_ent->mwdma_mask = sil_port_info[ent->driver_data].mwdma_mask; probe_ent->udma_mask = sil_port_info[ent->driver_data].udma_mask; probe_ent->irq = pdev->irq; - probe_ent->irq_flags = SA_SHIRQ; + probe_ent->irq_flags = IRQF_SHARED; probe_ent->host_flags = sil_port_info[ent->driver_data].host_flags; mmio_base = pci_iomap(pdev, 5, 0); @@ -448,60 +679,8 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) ata_std_ports(&probe_ent->port[i]); } - /* Initialize FIFO PCI bus arbitration */ - cls = sil_get_device_cache_line(pdev); - if (cls) { - cls >>= 3; - cls++; /* cls = (line_size/8)+1 */ - for (i = 0; i < probe_ent->n_ports; i++) - writew(cls << 8 | cls, - mmio_base + sil_port[i].fifo_cfg); - } else - dev_printk(KERN_WARNING, &pdev->dev, - "cache line size not set. Driver may not function\n"); - - /* Apply R_ERR on DMA activate FIS errata workaround */ - if (probe_ent->host_flags & SIL_FLAG_RERR_ON_DMA_ACT) { - int cnt; - - for (i = 0, cnt = 0; i < probe_ent->n_ports; i++) { - tmp = readl(mmio_base + sil_port[i].sfis_cfg); - if ((tmp & 0x3) != 0x01) - continue; - if (!cnt) - dev_printk(KERN_INFO, &pdev->dev, - "Applying R_ERR on DMA activate " - "FIS errata fix\n"); - writel(tmp & ~0x3, mmio_base + sil_port[i].sfis_cfg); - cnt++; - } - } - - if (ent->driver_data == sil_3114) { - irq_mask = SIL_MASK_4PORT; - - /* flip the magic "make 4 ports work" bit */ - tmp = readl(mmio_base + sil_port[2].bmdma); - if ((tmp & SIL_INTR_STEERING) == 0) - writel(tmp | SIL_INTR_STEERING, - mmio_base + sil_port[2].bmdma); - - } else { - irq_mask = SIL_MASK_2PORT; - } - - /* make sure IDE0/1/2/3 interrupts are not masked */ - tmp = readl(mmio_base + SIL_SYSCFG); - if (tmp & irq_mask) { - tmp &= ~irq_mask; - writel(tmp, mmio_base + SIL_SYSCFG); - readl(mmio_base + SIL_SYSCFG); /* flush */ - } - - /* mask all SATA phy-related interrupts */ - /* TODO: unmask bit 6 (SError N bit) for hotplug */ - for (i = 0; i < probe_ent->n_ports; i++) - writel(0, mmio_base + sil_port[i].sien); + sil_init_controller(pdev, probe_ent->n_ports, probe_ent->host_flags, + mmio_base); pci_set_master(pdev); @@ -521,6 +700,18 @@ err_out: return rc; } +static int sil_pci_device_resume(struct pci_dev *pdev) +{ + struct ata_host_set *host_set = dev_get_drvdata(&pdev->dev); + + ata_pci_device_do_resume(pdev); + sil_init_controller(pdev, host_set->n_ports, host_set->ports[0]->flags, + host_set->mmio_base); + ata_host_set_resume(host_set); + + return 0; +} + static int __init sil_init(void) { return pci_module_init(&sil_pci_driver); diff --git a/drivers/scsi/sata_sil24.c b/drivers/scsi/sata_sil24.c index cb9082fd7..3f368c7d3 100644 --- a/drivers/scsi/sata_sil24.c +++ b/drivers/scsi/sata_sil24.c @@ -31,15 +31,15 @@ #include #define DRV_NAME "sata_sil24" -#define DRV_VERSION "0.23" +#define DRV_VERSION "0.3" /* * Port request block (PRB) 32 bytes */ struct sil24_prb { - u16 ctrl; - u16 prot; - u32 rx_cnt; + __le16 ctrl; + __le16 prot; + __le32 rx_cnt; u8 fis[6 * 4]; }; @@ -47,17 +47,17 @@ struct sil24_prb { * Scatter gather entry (SGE) 16 bytes */ struct sil24_sge { - u64 addr; - u32 cnt; - u32 flags; + __le64 addr; + __le32 cnt; + __le32 flags; }; /* * Port multiplier */ struct sil24_port_multiplier { - u32 diag; - u32 sactive; + __le32 diag; + __le32 sactive; }; enum { @@ -86,12 +86,22 @@ enum { /* HOST_SLOT_STAT bits */ HOST_SSTAT_ATTN = (1 << 31), + /* HOST_CTRL bits */ + HOST_CTRL_M66EN = (1 << 16), /* M66EN PCI bus signal */ + HOST_CTRL_TRDY = (1 << 17), /* latched PCI TRDY */ + HOST_CTRL_STOP = (1 << 18), /* latched PCI STOP */ + HOST_CTRL_DEVSEL = (1 << 19), /* latched PCI DEVSEL */ + HOST_CTRL_REQ64 = (1 << 20), /* latched PCI REQ64 */ + HOST_CTRL_GLOBAL_RST = (1 << 31), /* global reset */ + /* * Port registers * (8192 bytes @ +0x0000, +0x2000, +0x4000 and +0x6000 @ BAR2) */ PORT_REGS_SIZE = 0x2000, - PORT_PRB = 0x0000, /* (32 bytes PRB + 16 bytes SGEs * 6) * 31 (3968 bytes) */ + + PORT_LRAM = 0x0000, /* 31 LRAM slots and PM regs */ + PORT_LRAM_SLOT_SZ = 0x0080, /* 32 bytes PRB + 2 SGE, ACT... */ PORT_PM = 0x0f80, /* 8 bytes PM * 16 (128 bytes) */ /* 32 bit regs */ @@ -142,8 +152,16 @@ enum { PORT_IRQ_PWR_CHG = (1 << 3), /* power management change */ PORT_IRQ_PHYRDY_CHG = (1 << 4), /* PHY ready change */ PORT_IRQ_COMWAKE = (1 << 5), /* COMWAKE received */ - PORT_IRQ_UNK_FIS = (1 << 6), /* Unknown FIS received */ - PORT_IRQ_SDB_FIS = (1 << 11), /* SDB FIS received */ + PORT_IRQ_UNK_FIS = (1 << 6), /* unknown FIS received */ + PORT_IRQ_DEV_XCHG = (1 << 7), /* device exchanged */ + PORT_IRQ_8B10B = (1 << 8), /* 8b/10b decode error threshold */ + PORT_IRQ_CRC = (1 << 9), /* CRC error threshold */ + PORT_IRQ_HANDSHAKE = (1 << 10), /* handshake error threshold */ + PORT_IRQ_SDB_NOTIFY = (1 << 11), /* SDB notify received */ + + DEF_PORT_IRQ = PORT_IRQ_COMPLETE | PORT_IRQ_ERROR | + PORT_IRQ_PHYRDY_CHG | PORT_IRQ_DEV_XCHG | + PORT_IRQ_UNK_FIS, /* bits[27:16] are unmasked (raw) */ PORT_IRQ_RAW_SHIFT = 16, @@ -174,7 +192,7 @@ enum { PORT_CERR_CMD_PCIPERR = 27, /* ctrl[15:13] 110 - PCI parity err while fetching PRB */ PORT_CERR_XFR_UNDEF = 32, /* PSD ecode 00 - undefined */ PORT_CERR_XFR_TGTABRT = 33, /* PSD ecode 01 - target abort */ - PORT_CERR_XFR_MSGABRT = 34, /* PSD ecode 10 - master abort */ + PORT_CERR_XFR_MSTABRT = 34, /* PSD ecode 10 - master abort */ PORT_CERR_XFR_PCIPERR = 35, /* PSD ecode 11 - PCI prity err during transfer */ PORT_CERR_SENDSERVICE = 36, /* FIS received while sending service */ @@ -202,11 +220,19 @@ enum { SGE_DRD = (1 << 29), /* discard data read (/dev/null) data address ignored */ + SIL24_MAX_CMDS = 31, + /* board id */ BID_SIL3124 = 0, BID_SIL3132 = 1, BID_SIL3131 = 2, + /* host flags */ + SIL24_COMMON_FLAGS = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | + ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA | + ATA_FLAG_NCQ | ATA_FLAG_SKIP_D2H_BSY, + SIL24_FLAG_PCIX_IRQ_WOC = (1 << 24), /* IRQ loss errata on PCI-X */ + IRQ_STAT_4PORTS = 0xf, }; @@ -226,6 +252,58 @@ union sil24_cmd_block { struct sil24_atapi_block atapi; }; +static struct sil24_cerr_info { + unsigned int err_mask, action; + const char *desc; +} sil24_cerr_db[] = { + [0] = { AC_ERR_DEV, ATA_EH_REVALIDATE, + "device error" }, + [PORT_CERR_DEV] = { AC_ERR_DEV, ATA_EH_REVALIDATE, + "device error via D2H FIS" }, + [PORT_CERR_SDB] = { AC_ERR_DEV, ATA_EH_REVALIDATE, + "device error via SDB FIS" }, + [PORT_CERR_DATA] = { AC_ERR_ATA_BUS, ATA_EH_SOFTRESET, + "error in data FIS" }, + [PORT_CERR_SEND] = { AC_ERR_ATA_BUS, ATA_EH_SOFTRESET, + "failed to transmit command FIS" }, + [PORT_CERR_INCONSISTENT] = { AC_ERR_HSM, ATA_EH_SOFTRESET, + "protocol mismatch" }, + [PORT_CERR_DIRECTION] = { AC_ERR_HSM, ATA_EH_SOFTRESET, + "data directon mismatch" }, + [PORT_CERR_UNDERRUN] = { AC_ERR_HSM, ATA_EH_SOFTRESET, + "ran out of SGEs while writing" }, + [PORT_CERR_OVERRUN] = { AC_ERR_HSM, ATA_EH_SOFTRESET, + "ran out of SGEs while reading" }, + [PORT_CERR_PKT_PROT] = { AC_ERR_HSM, ATA_EH_SOFTRESET, + "invalid data directon for ATAPI CDB" }, + [PORT_CERR_SGT_BOUNDARY] = { AC_ERR_SYSTEM, ATA_EH_SOFTRESET, + "SGT no on qword boundary" }, + [PORT_CERR_SGT_TGTABRT] = { AC_ERR_HOST_BUS, ATA_EH_SOFTRESET, + "PCI target abort while fetching SGT" }, + [PORT_CERR_SGT_MSTABRT] = { AC_ERR_HOST_BUS, ATA_EH_SOFTRESET, + "PCI master abort while fetching SGT" }, + [PORT_CERR_SGT_PCIPERR] = { AC_ERR_HOST_BUS, ATA_EH_SOFTRESET, + "PCI parity error while fetching SGT" }, + [PORT_CERR_CMD_BOUNDARY] = { AC_ERR_SYSTEM, ATA_EH_SOFTRESET, + "PRB not on qword boundary" }, + [PORT_CERR_CMD_TGTABRT] = { AC_ERR_HOST_BUS, ATA_EH_SOFTRESET, + "PCI target abort while fetching PRB" }, + [PORT_CERR_CMD_MSTABRT] = { AC_ERR_HOST_BUS, ATA_EH_SOFTRESET, + "PCI master abort while fetching PRB" }, + [PORT_CERR_CMD_PCIPERR] = { AC_ERR_HOST_BUS, ATA_EH_SOFTRESET, + "PCI parity error while fetching PRB" }, + [PORT_CERR_XFR_UNDEF] = { AC_ERR_HOST_BUS, ATA_EH_SOFTRESET, + "undefined error while transferring data" }, + [PORT_CERR_XFR_TGTABRT] = { AC_ERR_HOST_BUS, ATA_EH_SOFTRESET, + "PCI target abort while transferring data" }, + [PORT_CERR_XFR_MSTABRT] = { AC_ERR_HOST_BUS, ATA_EH_SOFTRESET, + "PCI master abort while transferring data" }, + [PORT_CERR_XFR_PCIPERR] = { AC_ERR_HOST_BUS, ATA_EH_SOFTRESET, + "PCI parity error while transferring data" }, + [PORT_CERR_SENDSERVICE] = { AC_ERR_HSM, ATA_EH_SOFTRESET, + "FIS received while sending service FIS" }, +}; + /* * ap->private_data * @@ -249,16 +327,19 @@ static u8 sil24_check_status(struct ata_port *ap); static u32 sil24_scr_read(struct ata_port *ap, unsigned sc_reg); static void sil24_scr_write(struct ata_port *ap, unsigned sc_reg, u32 val); static void sil24_tf_read(struct ata_port *ap, struct ata_taskfile *tf); -static int sil24_probe_reset(struct ata_port *ap, unsigned int *classes); static void sil24_qc_prep(struct ata_queued_cmd *qc); static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc); static void sil24_irq_clear(struct ata_port *ap); -static void sil24_eng_timeout(struct ata_port *ap); static irqreturn_t sil24_interrupt(int irq, void *dev_instance, struct pt_regs *regs); +static void sil24_freeze(struct ata_port *ap); +static void sil24_thaw(struct ata_port *ap); +static void sil24_error_handler(struct ata_port *ap); +static void sil24_post_internal_cmd(struct ata_queued_cmd *qc); static int sil24_port_start(struct ata_port *ap); static void sil24_port_stop(struct ata_port *ap); static void sil24_host_stop(struct ata_host_set *host_set); static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); +static int sil24_pci_device_resume(struct pci_dev *pdev); static const struct pci_device_id sil24_pci_tbl[] = { { 0x1095, 0x3124, PCI_ANY_ID, PCI_ANY_ID, 0, 0, BID_SIL3124 }, @@ -274,6 +355,8 @@ static struct pci_driver sil24_pci_driver = { .id_table = sil24_pci_tbl, .probe = sil24_init_one, .remove = ata_pci_remove_one, /* safe? */ + .suspend = ata_pci_device_suspend, + .resume = sil24_pci_device_resume, }; static struct scsi_host_template sil24_sht = { @@ -281,7 +364,8 @@ static struct scsi_host_template sil24_sht = { .name = DRV_NAME, .ioctl = ata_scsi_ioctl, .queuecommand = ata_scsi_queuecmd, - .can_queue = ATA_DEF_QUEUE, + .change_queue_depth = ata_scsi_change_queue_depth, + .can_queue = SIL24_MAX_CMDS, .this_id = ATA_SHT_THIS_ID, .sg_tablesize = LIBATA_MAX_PRD, .cmd_per_lun = ATA_SHT_CMD_PER_LUN, @@ -290,7 +374,10 @@ static struct scsi_host_template sil24_sht = { .proc_name = DRV_NAME, .dma_boundary = ATA_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, + .slave_destroy = ata_scsi_slave_destroy, .bios_param = ata_std_bios_param, + .suspend = ata_scsi_device_suspend, + .resume = ata_scsi_device_resume, }; static const struct ata_port_operations sil24_ops = { @@ -304,19 +391,20 @@ static const struct ata_port_operations sil24_ops = { .tf_read = sil24_tf_read, - .probe_reset = sil24_probe_reset, - .qc_prep = sil24_qc_prep, .qc_issue = sil24_qc_issue, - .eng_timeout = sil24_eng_timeout, - .irq_handler = sil24_interrupt, .irq_clear = sil24_irq_clear, .scr_read = sil24_scr_read, .scr_write = sil24_scr_write, + .freeze = sil24_freeze, + .thaw = sil24_thaw, + .error_handler = sil24_error_handler, + .post_internal_cmd = sil24_post_internal_cmd, + .port_start = sil24_port_start, .port_stop = sil24_port_stop, .host_stop = sil24_host_stop, @@ -333,9 +421,8 @@ static struct ata_port_info sil24_port_info[] = { /* sil_3124 */ { .sht = &sil24_sht, - .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | - ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA | - SIL24_NPORTS2FLAG(4), + .host_flags = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(4) | + SIL24_FLAG_PCIX_IRQ_WOC, .pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ .udma_mask = 0x3f, /* udma0-5 */ @@ -344,9 +431,7 @@ static struct ata_port_info sil24_port_info[] = { /* sil_3132 */ { .sht = &sil24_sht, - .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | - ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA | - SIL24_NPORTS2FLAG(2), + .host_flags = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(2), .pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ .udma_mask = 0x3f, /* udma0-5 */ @@ -355,9 +440,7 @@ static struct ata_port_info sil24_port_info[] = { /* sil_3131/sil_3531 */ { .sht = &sil24_sht, - .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | - ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA | - SIL24_NPORTS2FLAG(1), + .host_flags = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(1), .pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ .udma_mask = 0x3f, /* udma0-5 */ @@ -365,6 +448,13 @@ static struct ata_port_info sil24_port_info[] = { }, }; +static int sil24_tag(int tag) +{ + if (unlikely(ata_tag_internal(tag))) + return 0; + return tag; +} + static void sil24_dev_config(struct ata_port *ap, struct ata_device *dev) { void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; @@ -426,56 +516,65 @@ static void sil24_tf_read(struct ata_port *ap, struct ata_taskfile *tf) *tf = pp->tf; } -static int sil24_softreset(struct ata_port *ap, int verbose, - unsigned int *class) +static int sil24_init_port(struct ata_port *ap) +{ + void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; + u32 tmp; + + writel(PORT_CS_INIT, port + PORT_CTRL_STAT); + ata_wait_register(port + PORT_CTRL_STAT, + PORT_CS_INIT, PORT_CS_INIT, 10, 100); + tmp = ata_wait_register(port + PORT_CTRL_STAT, + PORT_CS_RDY, 0, 10, 100); + + if ((tmp & (PORT_CS_INIT | PORT_CS_RDY)) != PORT_CS_RDY) + return -EIO; + return 0; +} + +static int sil24_softreset(struct ata_port *ap, unsigned int *class) { void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; struct sil24_port_priv *pp = ap->private_data; struct sil24_prb *prb = &pp->cmd_block[0].ata.prb; dma_addr_t paddr = pp->cmd_block_dma; - unsigned long timeout = jiffies + ATA_TMOUT_BOOT * HZ; - u32 irq_enable, irq_stat; + u32 mask, irq_stat; + const char *reason; DPRINTK("ENTER\n"); - if (!sata_dev_present(ap)) { + if (ata_port_offline(ap)) { DPRINTK("PHY reports no device\n"); *class = ATA_DEV_NONE; goto out; } - /* temporarily turn off IRQs during SRST */ - irq_enable = readl(port + PORT_IRQ_ENABLE_SET); - writel(irq_enable, port + PORT_IRQ_ENABLE_CLR); - - /* - * XXX: Not sure whether the following sleep is needed or not. - * The original driver had it. So.... - */ - msleep(10); + /* put the port into known state */ + if (sil24_init_port(ap)) { + reason ="port not ready"; + goto err; + } + /* do SRST */ prb->ctrl = cpu_to_le16(PRB_CTRL_SRST); prb->fis[1] = 0; /* no PM yet */ writel((u32)paddr, port + PORT_CMD_ACTIVATE); + writel((u64)paddr >> 32, port + PORT_CMD_ACTIVATE + 4); - do { - irq_stat = readl(port + PORT_IRQ_STAT); - writel(irq_stat, port + PORT_IRQ_STAT); /* clear irq */ - - irq_stat >>= PORT_IRQ_RAW_SHIFT; - if (irq_stat & (PORT_IRQ_COMPLETE | PORT_IRQ_ERROR)) - break; - - msleep(100); - } while (time_before(jiffies, timeout)); + mask = (PORT_IRQ_COMPLETE | PORT_IRQ_ERROR) << PORT_IRQ_RAW_SHIFT; + irq_stat = ata_wait_register(port + PORT_IRQ_STAT, mask, 0x0, + 100, ATA_TMOUT_BOOT / HZ * 1000); - /* restore IRQs */ - writel(irq_enable, port + PORT_IRQ_ENABLE_SET); + writel(irq_stat, port + PORT_IRQ_STAT); /* clear IRQs */ + irq_stat >>= PORT_IRQ_RAW_SHIFT; if (!(irq_stat & PORT_IRQ_COMPLETE)) { - DPRINTK("EXIT, srst failed\n"); - return -EIO; + if (irq_stat & PORT_IRQ_ERROR) + reason = "SRST command error"; + else + reason = "timeout"; + goto err; } sil24_update_tf(ap); @@ -487,22 +586,57 @@ static int sil24_softreset(struct ata_port *ap, int verbose, out: DPRINTK("EXIT, class=%u\n", *class); return 0; + + err: + ata_port_printk(ap, KERN_ERR, "softreset failed (%s)\n", reason); + return -EIO; } -static int sil24_hardreset(struct ata_port *ap, int verbose, - unsigned int *class) +static int sil24_hardreset(struct ata_port *ap, unsigned int *class) { - unsigned int dummy_class; + void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; + const char *reason; + int tout_msec, rc; + u32 tmp; - /* sil24 doesn't report device signature after hard reset */ - return sata_std_hardreset(ap, verbose, &dummy_class); -} + /* sil24 does the right thing(tm) without any protection */ + sata_set_spd(ap); -static int sil24_probe_reset(struct ata_port *ap, unsigned int *classes) -{ - return ata_drive_probe_reset(ap, ata_std_probeinit, - sil24_softreset, sil24_hardreset, - ata_std_postreset, classes); + tout_msec = 100; + if (ata_port_online(ap)) + tout_msec = 5000; + + writel(PORT_CS_DEV_RST, port + PORT_CTRL_STAT); + tmp = ata_wait_register(port + PORT_CTRL_STAT, + PORT_CS_DEV_RST, PORT_CS_DEV_RST, 10, tout_msec); + + /* SStatus oscillates between zero and valid status after + * DEV_RST, debounce it. + */ + rc = sata_phy_debounce(ap, sata_deb_timing_long); + if (rc) { + reason = "PHY debouncing failed"; + goto err; + } + + if (tmp & PORT_CS_DEV_RST) { + if (ata_port_offline(ap)) + return 0; + reason = "link not ready"; + goto err; + } + + /* Sil24 doesn't store signature FIS after hardreset, so we + * can't wait for BSY to clear. Some devices take a long time + * to get ready and those devices will choke if we don't wait + * for BSY clearance here. Tell libata to perform follow-up + * softreset. + */ + return -EAGAIN; + + err: + ata_port_printk(ap, KERN_ERR, "hardreset failed (%s)\n", reason); + return -EIO; } static inline void sil24_fill_sg(struct ata_queued_cmd *qc, @@ -528,17 +662,20 @@ static void sil24_qc_prep(struct ata_queued_cmd *qc) { struct ata_port *ap = qc->ap; struct sil24_port_priv *pp = ap->private_data; - union sil24_cmd_block *cb = pp->cmd_block + qc->tag; + union sil24_cmd_block *cb; struct sil24_prb *prb; struct sil24_sge *sge; + u16 ctrl = 0; + + cb = &pp->cmd_block[sil24_tag(qc->tag)]; switch (qc->tf.protocol) { case ATA_PROT_PIO: case ATA_PROT_DMA: + case ATA_PROT_NCQ: case ATA_PROT_NODATA: prb = &cb->ata.prb; sge = cb->ata.sge; - prb->ctrl = 0; break; case ATA_PROT_ATAPI: @@ -551,12 +688,10 @@ static void sil24_qc_prep(struct ata_queued_cmd *qc) if (qc->tf.protocol != ATA_PROT_ATAPI_NODATA) { if (qc->tf.flags & ATA_TFLAG_WRITE) - prb->ctrl = cpu_to_le16(PRB_CTRL_PACKET_WRITE); + ctrl = PRB_CTRL_PACKET_WRITE; else - prb->ctrl = cpu_to_le16(PRB_CTRL_PACKET_READ); - } else - prb->ctrl = 0; - + ctrl = PRB_CTRL_PACKET_READ; + } break; default: @@ -565,6 +700,7 @@ static void sil24_qc_prep(struct ata_queued_cmd *qc) BUG(); } + prb->ctrl = cpu_to_le16(ctrl); ata_tf_to_fis(&qc->tf, prb->fis, 0); if (qc->flags & ATA_QCFLAG_DMAMAP) @@ -574,11 +710,18 @@ static void sil24_qc_prep(struct ata_queued_cmd *qc) static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc) { struct ata_port *ap = qc->ap; - void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; struct sil24_port_priv *pp = ap->private_data; - dma_addr_t paddr = pp->cmd_block_dma + qc->tag * sizeof(*pp->cmd_block); + void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; + unsigned int tag = sil24_tag(qc->tag); + dma_addr_t paddr; + void __iomem *activate; + + paddr = pp->cmd_block_dma + tag * sizeof(*pp->cmd_block); + activate = port + PORT_CMD_ACTIVATE + tag * 8; + + writel((u32)paddr, activate); + writel((u64)paddr >> 32, activate + 4); - writel((u32)paddr, port + PORT_CMD_ACTIVATE); return 0; } @@ -587,162 +730,139 @@ static void sil24_irq_clear(struct ata_port *ap) /* unused */ } -static int __sil24_restart_controller(void __iomem *port) +static void sil24_freeze(struct ata_port *ap) { - u32 tmp; - int cnt; - - writel(PORT_CS_INIT, port + PORT_CTRL_STAT); - - /* Max ~10ms */ - for (cnt = 0; cnt < 10000; cnt++) { - tmp = readl(port + PORT_CTRL_STAT); - if (tmp & PORT_CS_RDY) - return 0; - udelay(1); - } + void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; - return -1; + /* Port-wide IRQ mask in HOST_CTRL doesn't really work, clear + * PORT_IRQ_ENABLE instead. + */ + writel(0xffff, port + PORT_IRQ_ENABLE_CLR); } -static void sil24_restart_controller(struct ata_port *ap) +static void sil24_thaw(struct ata_port *ap) { - if (__sil24_restart_controller((void __iomem *)ap->ioaddr.cmd_addr)) - printk(KERN_ERR DRV_NAME - " ata%u: failed to restart controller\n", ap->id); + void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; + u32 tmp; + + /* clear IRQ */ + tmp = readl(port + PORT_IRQ_STAT); + writel(tmp, port + PORT_IRQ_STAT); + + /* turn IRQ back on */ + writel(DEF_PORT_IRQ, port + PORT_IRQ_ENABLE_SET); } -static int __sil24_reset_controller(void __iomem *port) +static void sil24_error_intr(struct ata_port *ap) { - int cnt; - u32 tmp; + void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; + struct ata_eh_info *ehi = &ap->eh_info; + int freeze = 0; + u32 irq_stat; - /* Reset controller state. Is this correct? */ - writel(PORT_CS_DEV_RST, port + PORT_CTRL_STAT); - readl(port + PORT_CTRL_STAT); /* sync */ + /* on error, we need to clear IRQ explicitly */ + irq_stat = readl(port + PORT_IRQ_STAT); + writel(irq_stat, port + PORT_IRQ_STAT); - /* Max ~100ms */ - for (cnt = 0; cnt < 1000; cnt++) { - udelay(100); - tmp = readl(port + PORT_CTRL_STAT); - if (!(tmp & PORT_CS_DEV_RST)) - break; - } + /* first, analyze and record host port events */ + ata_ehi_clear_desc(ehi); - if (tmp & PORT_CS_DEV_RST) - return -1; + ata_ehi_push_desc(ehi, "irq_stat 0x%08x", irq_stat); - if (tmp & PORT_CS_RDY) - return 0; + if (irq_stat & (PORT_IRQ_PHYRDY_CHG | PORT_IRQ_DEV_XCHG)) { + ata_ehi_hotplugged(ehi); + ata_ehi_push_desc(ehi, ", %s", + irq_stat & PORT_IRQ_PHYRDY_CHG ? + "PHY RDY changed" : "device exchanged"); + freeze = 1; + } - return __sil24_restart_controller(port); -} + if (irq_stat & PORT_IRQ_UNK_FIS) { + ehi->err_mask |= AC_ERR_HSM; + ehi->action |= ATA_EH_SOFTRESET; + ata_ehi_push_desc(ehi , ", unknown FIS"); + freeze = 1; + } -static void sil24_reset_controller(struct ata_port *ap) -{ - printk(KERN_NOTICE DRV_NAME - " ata%u: resetting controller...\n", ap->id); - if (__sil24_reset_controller((void __iomem *)ap->ioaddr.cmd_addr)) - printk(KERN_ERR DRV_NAME - " ata%u: failed to reset controller\n", ap->id); -} + /* deal with command error */ + if (irq_stat & PORT_IRQ_ERROR) { + struct sil24_cerr_info *ci = NULL; + unsigned int err_mask = 0, action = 0; + struct ata_queued_cmd *qc; + u32 cerr; + + /* analyze CMD_ERR */ + cerr = readl(port + PORT_CMD_ERR); + if (cerr < ARRAY_SIZE(sil24_cerr_db)) + ci = &sil24_cerr_db[cerr]; + + if (ci && ci->desc) { + err_mask |= ci->err_mask; + action |= ci->action; + ata_ehi_push_desc(ehi, ", %s", ci->desc); + } else { + err_mask |= AC_ERR_OTHER; + action |= ATA_EH_SOFTRESET; + ata_ehi_push_desc(ehi, ", unknown command error %d", + cerr); + } -static void sil24_eng_timeout(struct ata_port *ap) -{ - struct ata_queued_cmd *qc; + /* record error info */ + qc = ata_qc_from_tag(ap, ap->active_tag); + if (qc) { + sil24_update_tf(ap); + qc->err_mask |= err_mask; + } else + ehi->err_mask |= err_mask; - qc = ata_qc_from_tag(ap, ap->active_tag); + ehi->action |= action; + } - printk(KERN_ERR "ata%u: command timeout\n", ap->id); - qc->err_mask |= AC_ERR_TIMEOUT; - ata_eh_qc_complete(qc); + /* freeze or abort */ + if (freeze) + ata_port_freeze(ap); + else + ata_port_abort(ap); +} - sil24_reset_controller(ap); +static void sil24_finish_qc(struct ata_queued_cmd *qc) +{ + if (qc->flags & ATA_QCFLAG_RESULT_TF) + sil24_update_tf(qc->ap); } -static void sil24_error_intr(struct ata_port *ap, u32 slot_stat) +static inline void sil24_host_intr(struct ata_port *ap) { - struct ata_queued_cmd *qc = ata_qc_from_tag(ap, ap->active_tag); - struct sil24_port_priv *pp = ap->private_data; void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; - u32 irq_stat, cmd_err, sstatus, serror; - unsigned int err_mask; + u32 slot_stat, qc_active; + int rc; - irq_stat = readl(port + PORT_IRQ_STAT); - writel(irq_stat, port + PORT_IRQ_STAT); /* clear irq */ + slot_stat = readl(port + PORT_SLOT_STAT); - if (!(irq_stat & PORT_IRQ_ERROR)) { - /* ignore non-completion, non-error irqs for now */ - printk(KERN_WARNING DRV_NAME - "ata%u: non-error exception irq (irq_stat %x)\n", - ap->id, irq_stat); + if (unlikely(slot_stat & HOST_SSTAT_ATTN)) { + sil24_error_intr(ap); return; } - cmd_err = readl(port + PORT_CMD_ERR); - sstatus = readl(port + PORT_SSTATUS); - serror = readl(port + PORT_SERROR); - if (serror) - writel(serror, port + PORT_SERROR); + if (ap->flags & SIL24_FLAG_PCIX_IRQ_WOC) + writel(PORT_IRQ_COMPLETE, port + PORT_IRQ_STAT); - /* - * Don't log ATAPI device errors. They're supposed to happen - * and any serious errors will be logged using sense data by - * the SCSI layer. - */ - if (ap->device[0].class != ATA_DEV_ATAPI || cmd_err > PORT_CERR_SDB) - printk("ata%u: error interrupt on port%d\n" - " stat=0x%x irq=0x%x cmd_err=%d sstatus=0x%x serror=0x%x\n", - ap->id, ap->port_no, slot_stat, irq_stat, cmd_err, sstatus, serror); - - if (cmd_err == PORT_CERR_DEV || cmd_err == PORT_CERR_SDB) { - /* - * Device is reporting error, tf registers are valid. - */ - sil24_update_tf(ap); - err_mask = ac_err_mask(pp->tf.command); - sil24_restart_controller(ap); - } else { - /* - * Other errors. libata currently doesn't have any - * mechanism to report these errors. Just turn on - * ATA_ERR. - */ - err_mask = AC_ERR_OTHER; - sil24_reset_controller(ap); - } - - if (qc) { - qc->err_mask |= err_mask; - ata_qc_complete(qc); + qc_active = slot_stat & ~HOST_SSTAT_ATTN; + rc = ata_qc_complete_multiple(ap, qc_active, sil24_finish_qc); + if (rc > 0) + return; + if (rc < 0) { + struct ata_eh_info *ehi = &ap->eh_info; + ehi->err_mask |= AC_ERR_HSM; + ehi->action |= ATA_EH_SOFTRESET; + ata_port_freeze(ap); + return; } -} - -static inline void sil24_host_intr(struct ata_port *ap) -{ - struct ata_queued_cmd *qc = ata_qc_from_tag(ap, ap->active_tag); - void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; - u32 slot_stat; - - slot_stat = readl(port + PORT_SLOT_STAT); - if (!(slot_stat & HOST_SSTAT_ATTN)) { - struct sil24_port_priv *pp = ap->private_data; - /* - * !HOST_SSAT_ATTN guarantees successful completion, - * so reading back tf registers is unnecessary for - * most commands. TODO: read tf registers for - * commands which require these values on successful - * completion (EXECUTE DEVICE DIAGNOSTIC, CHECK POWER, - * DEVICE RESET and READ PORT MULTIPLIER (any more?). - */ - sil24_update_tf(ap); - if (qc) { - qc->err_mask |= ac_err_mask(pp->tf.command); - ata_qc_complete(qc); - } - } else - sil24_error_intr(ap, slot_stat); + if (ata_ratelimit()) + ata_port_printk(ap, KERN_INFO, "spurious interrupt " + "(slot_stat 0x%x active_tag %d sactive 0x%x)\n", + slot_stat, ap->active_tag, ap->sactive); } static irqreturn_t sil24_interrupt(int irq, void *dev_instance, struct pt_regs *regs) @@ -769,7 +889,7 @@ static irqreturn_t sil24_interrupt(int irq, void *dev_instance, struct pt_regs * for (i = 0; i < host_set->n_ports; i++) if (status & (1 << i)) { struct ata_port *ap = host_set->ports[i]; - if (ap && !(ap->flags & ATA_FLAG_PORT_DISABLED)) { + if (ap && !(ap->flags & ATA_FLAG_DISABLED)) { sil24_host_intr(host_set->ports[i]); handled++; } else @@ -782,9 +902,35 @@ static irqreturn_t sil24_interrupt(int irq, void *dev_instance, struct pt_regs * return IRQ_RETVAL(handled); } +static void sil24_error_handler(struct ata_port *ap) +{ + struct ata_eh_context *ehc = &ap->eh_context; + + if (sil24_init_port(ap)) { + ata_eh_freeze_port(ap); + ehc->i.action |= ATA_EH_HARDRESET; + } + + /* perform recovery */ + ata_do_eh(ap, ata_std_prereset, sil24_softreset, sil24_hardreset, + ata_std_postreset); +} + +static void sil24_post_internal_cmd(struct ata_queued_cmd *qc) +{ + struct ata_port *ap = qc->ap; + + if (qc->flags & ATA_QCFLAG_FAILED) + qc->err_mask |= AC_ERR_OTHER; + + /* make DMA engine forget about the failed command */ + if (qc->err_mask) + sil24_init_port(ap); +} + static inline void sil24_cblk_free(struct sil24_port_priv *pp, struct device *dev) { - const size_t cb_size = sizeof(*pp->cmd_block); + const size_t cb_size = sizeof(*pp->cmd_block) * SIL24_MAX_CMDS; dma_free_coherent(dev, cb_size, pp->cmd_block, pp->cmd_block_dma); } @@ -794,7 +940,7 @@ static int sil24_port_start(struct ata_port *ap) struct device *dev = ap->host_set->dev; struct sil24_port_priv *pp; union sil24_cmd_block *cb; - size_t cb_size = sizeof(*cb); + size_t cb_size = sizeof(*cb) * SIL24_MAX_CMDS; dma_addr_t cb_dma; int rc = -ENOMEM; @@ -848,6 +994,64 @@ static void sil24_host_stop(struct ata_host_set *host_set) kfree(hpriv); } +static void sil24_init_controller(struct pci_dev *pdev, int n_ports, + unsigned long host_flags, + void __iomem *host_base, + void __iomem *port_base) +{ + u32 tmp; + int i; + + /* GPIO off */ + writel(0, host_base + HOST_FLASH_CMD); + + /* clear global reset & mask interrupts during initialization */ + writel(0, host_base + HOST_CTRL); + + /* init ports */ + for (i = 0; i < n_ports; i++) { + void __iomem *port = port_base + i * PORT_REGS_SIZE; + + /* Initial PHY setting */ + writel(0x20c, port + PORT_PHY_CFG); + + /* Clear port RST */ + tmp = readl(port + PORT_CTRL_STAT); + if (tmp & PORT_CS_PORT_RST) { + writel(PORT_CS_PORT_RST, port + PORT_CTRL_CLR); + tmp = ata_wait_register(port + PORT_CTRL_STAT, + PORT_CS_PORT_RST, + PORT_CS_PORT_RST, 10, 100); + if (tmp & PORT_CS_PORT_RST) + dev_printk(KERN_ERR, &pdev->dev, + "failed to clear port RST\n"); + } + + /* Configure IRQ WoC */ + if (host_flags & SIL24_FLAG_PCIX_IRQ_WOC) + writel(PORT_CS_IRQ_WOC, port + PORT_CTRL_STAT); + else + writel(PORT_CS_IRQ_WOC, port + PORT_CTRL_CLR); + + /* Zero error counters. */ + writel(0x8000, port + PORT_DECODE_ERR_THRESH); + writel(0x8000, port + PORT_CRC_ERR_THRESH); + writel(0x8000, port + PORT_HSHK_ERR_THRESH); + writel(0x0000, port + PORT_DECODE_ERR_CNT); + writel(0x0000, port + PORT_CRC_ERR_CNT); + writel(0x0000, port + PORT_HSHK_ERR_CNT); + + /* Always use 64bit activation */ + writel(PORT_CS_32BIT_ACTV, port + PORT_CTRL_CLR); + + /* Clear port multiplier enable and resume bits */ + writel(PORT_CS_PM_EN | PORT_CS_RESUME, port + PORT_CTRL_CLR); + } + + /* Turn on interrupts */ + writel(IRQ_STAT_4PORTS, host_base + HOST_CTRL); +} + static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) { static int printed_version = 0; @@ -858,6 +1062,7 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) void __iomem *host_base = NULL; void __iomem *port_base = NULL; int i, rc; + u32 tmp; if (!printed_version++) dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n"); @@ -900,8 +1105,7 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) probe_ent->n_ports = SIL24_FLAG2NPORTS(pinfo->host_flags); probe_ent->irq = pdev->irq; - probe_ent->irq_flags = SA_SHIRQ; - probe_ent->mmio_base = port_base; + probe_ent->irq_flags = IRQF_SHARED; probe_ent->private_data = hpriv; hpriv->host_base = host_base; @@ -910,92 +1114,54 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) /* * Configure the device */ - /* - * FIXME: This device is certainly 64-bit capable. We just - * don't know how to use it. After fixing 32bit activation in - * this function, enable 64bit masks here. - */ - rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK); - if (rc) { - dev_printk(KERN_ERR, &pdev->dev, - "32-bit DMA enable failed\n"); - goto out_free; - } - rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK); - if (rc) { - dev_printk(KERN_ERR, &pdev->dev, - "32-bit consistent DMA enable failed\n"); - goto out_free; + if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) { + rc = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK); + if (rc) { + rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK); + if (rc) { + dev_printk(KERN_ERR, &pdev->dev, + "64-bit DMA enable failed\n"); + goto out_free; + } + } + } else { + rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK); + if (rc) { + dev_printk(KERN_ERR, &pdev->dev, + "32-bit DMA enable failed\n"); + goto out_free; + } + rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK); + if (rc) { + dev_printk(KERN_ERR, &pdev->dev, + "32-bit consistent DMA enable failed\n"); + goto out_free; + } } - /* GPIO off */ - writel(0, host_base + HOST_FLASH_CMD); - - /* Mask interrupts during initialization */ - writel(0, host_base + HOST_CTRL); + /* Apply workaround for completion IRQ loss on PCI-X errata */ + if (probe_ent->host_flags & SIL24_FLAG_PCIX_IRQ_WOC) { + tmp = readl(host_base + HOST_CTRL); + if (tmp & (HOST_CTRL_TRDY | HOST_CTRL_STOP | HOST_CTRL_DEVSEL)) + dev_printk(KERN_INFO, &pdev->dev, + "Applying completion IRQ loss on PCI-X " + "errata fix\n"); + else + probe_ent->host_flags &= ~SIL24_FLAG_PCIX_IRQ_WOC; + } for (i = 0; i < probe_ent->n_ports; i++) { - void __iomem *port = port_base + i * PORT_REGS_SIZE; - unsigned long portu = (unsigned long)port; - u32 tmp; - int cnt; + unsigned long portu = + (unsigned long)port_base + i * PORT_REGS_SIZE; - probe_ent->port[i].cmd_addr = portu + PORT_PRB; + probe_ent->port[i].cmd_addr = portu; probe_ent->port[i].scr_addr = portu + PORT_SCONTROL; ata_std_ports(&probe_ent->port[i]); - - /* Initial PHY setting */ - writel(0x20c, port + PORT_PHY_CFG); - - /* Clear port RST */ - tmp = readl(port + PORT_CTRL_STAT); - if (tmp & PORT_CS_PORT_RST) { - writel(PORT_CS_PORT_RST, port + PORT_CTRL_CLR); - readl(port + PORT_CTRL_STAT); /* sync */ - for (cnt = 0; cnt < 10; cnt++) { - msleep(10); - tmp = readl(port + PORT_CTRL_STAT); - if (!(tmp & PORT_CS_PORT_RST)) - break; - } - if (tmp & PORT_CS_PORT_RST) - dev_printk(KERN_ERR, &pdev->dev, - "failed to clear port RST\n"); - } - - /* Zero error counters. */ - writel(0x8000, port + PORT_DECODE_ERR_THRESH); - writel(0x8000, port + PORT_CRC_ERR_THRESH); - writel(0x8000, port + PORT_HSHK_ERR_THRESH); - writel(0x0000, port + PORT_DECODE_ERR_CNT); - writel(0x0000, port + PORT_CRC_ERR_CNT); - writel(0x0000, port + PORT_HSHK_ERR_CNT); - - /* FIXME: 32bit activation? */ - writel(0, port + PORT_ACTIVATE_UPPER_ADDR); - writel(PORT_CS_32BIT_ACTV, port + PORT_CTRL_STAT); - - /* Configure interrupts */ - writel(0xffff, port + PORT_IRQ_ENABLE_CLR); - writel(PORT_IRQ_COMPLETE | PORT_IRQ_ERROR | PORT_IRQ_SDB_FIS, - port + PORT_IRQ_ENABLE_SET); - - /* Clear interrupts */ - writel(0x0fff0fff, port + PORT_IRQ_STAT); - writel(PORT_CS_IRQ_WOC, port + PORT_CTRL_CLR); - - /* Clear port multiplier enable and resume bits */ - writel(PORT_CS_PM_EN | PORT_CS_RESUME, port + PORT_CTRL_CLR); - - /* Reset itself */ - if (__sil24_reset_controller(port)) - dev_printk(KERN_ERR, &pdev->dev, - "failed to reset controller\n"); } - /* Turn on interrupts */ - writel(IRQ_STAT_4PORTS, host_base + HOST_CTRL); + sil24_init_controller(pdev, probe_ent->n_ports, probe_ent->host_flags, + host_base, port_base); pci_set_master(pdev); @@ -1018,6 +1184,25 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) return rc; } +static int sil24_pci_device_resume(struct pci_dev *pdev) +{ + struct ata_host_set *host_set = dev_get_drvdata(&pdev->dev); + struct sil24_host_priv *hpriv = host_set->private_data; + + ata_pci_device_do_resume(pdev); + + if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) + writel(HOST_CTRL_GLOBAL_RST, hpriv->host_base + HOST_CTRL); + + sil24_init_controller(pdev, host_set->n_ports, + host_set->ports[0]->flags, + hpriv->host_base, hpriv->port_base); + + ata_host_set_resume(host_set); + + return 0; +} + static int __init sil24_init(void) { return pci_module_init(&sil24_pci_driver); diff --git a/drivers/scsi/sata_sis.c b/drivers/scsi/sata_sis.c index 728530df2..ee6b5df41 100644 --- a/drivers/scsi/sata_sis.c +++ b/drivers/scsi/sata_sis.c @@ -30,7 +30,6 @@ * */ -#include #include #include #include @@ -43,7 +42,7 @@ #include #define DRV_NAME "sata_sis" -#define DRV_VERSION "0.5" +#define DRV_VERSION "0.6" enum { sis_180 = 0, @@ -96,6 +95,7 @@ static struct scsi_host_template sis_sht = { .proc_name = DRV_NAME, .dma_boundary = ATA_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, + .slave_destroy = ata_scsi_slave_destroy, .bios_param = ata_std_bios_param, }; @@ -106,14 +106,17 @@ static const struct ata_port_operations sis_ops = { .check_status = ata_check_status, .exec_command = ata_exec_command, .dev_select = ata_std_dev_select, - .phy_reset = sata_phy_reset, .bmdma_setup = ata_bmdma_setup, .bmdma_start = ata_bmdma_start, .bmdma_stop = ata_bmdma_stop, .bmdma_status = ata_bmdma_status, .qc_prep = ata_qc_prep, .qc_issue = ata_qc_issue_prot, - .eng_timeout = ata_eng_timeout, + .data_xfer = ata_pio_data_xfer, + .freeze = ata_bmdma_freeze, + .thaw = ata_bmdma_thaw, + .error_handler = ata_bmdma_error_handler, + .post_internal_cmd = ata_bmdma_post_internal_cmd, .irq_handler = ata_interrupt, .irq_clear = ata_bmdma_irq_clear, .scr_read = sis_scr_read, @@ -125,8 +128,7 @@ static const struct ata_port_operations sis_ops = { static struct ata_port_info sis_port_info = { .sht = &sis_sht, - .host_flags = ATA_FLAG_SATA | ATA_FLAG_SATA_RESET | - ATA_FLAG_NO_LEGACY, + .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY, .pio_mask = 0x1f, .mwdma_mask = 0x7, .udma_mask = 0x7f, diff --git a/drivers/scsi/sata_svw.c b/drivers/scsi/sata_svw.c index 53b0d5c0a..7d0858095 100644 --- a/drivers/scsi/sata_svw.c +++ b/drivers/scsi/sata_svw.c @@ -36,7 +36,6 @@ * */ -#include #include #include #include @@ -54,7 +53,7 @@ #endif /* CONFIG_PPC_OF */ #define DRV_NAME "sata_svw" -#define DRV_VERSION "1.07" +#define DRV_VERSION "2.0" enum { /* Taskfile registers offsets */ @@ -257,7 +256,7 @@ static int k2_sata_proc_info(struct Scsi_Host *shost, char *page, char **start, int len, index; /* Find the ata_port */ - ap = (struct ata_port *) &shost->hostdata[0]; + ap = ata_shost_to_port(shost); if (ap == NULL) return 0; @@ -299,6 +298,7 @@ static struct scsi_host_template k2_sata_sht = { .proc_name = DRV_NAME, .dma_boundary = ATA_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, + .slave_destroy = ata_scsi_slave_destroy, #ifdef CONFIG_PPC_OF .proc_info = k2_sata_proc_info, #endif @@ -313,14 +313,17 @@ static const struct ata_port_operations k2_sata_ops = { .check_status = k2_stat_check_status, .exec_command = ata_exec_command, .dev_select = ata_std_dev_select, - .phy_reset = sata_phy_reset, .bmdma_setup = k2_bmdma_setup_mmio, .bmdma_start = k2_bmdma_start_mmio, .bmdma_stop = ata_bmdma_stop, .bmdma_status = ata_bmdma_status, .qc_prep = ata_qc_prep, .qc_issue = ata_qc_issue_prot, - .eng_timeout = ata_eng_timeout, + .data_xfer = ata_mmio_data_xfer, + .freeze = ata_bmdma_freeze, + .thaw = ata_bmdma_thaw, + .error_handler = ata_bmdma_error_handler, + .post_internal_cmd = ata_bmdma_post_internal_cmd, .irq_handler = ata_interrupt, .irq_clear = ata_bmdma_irq_clear, .scr_read = k2_sata_scr_read, @@ -420,12 +423,12 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e writel(0x0, mmio_base + K2_SATA_SIM_OFFSET); probe_ent->sht = &k2_sata_sht; - probe_ent->host_flags = ATA_FLAG_SATA | ATA_FLAG_SATA_RESET | - ATA_FLAG_NO_LEGACY | ATA_FLAG_MMIO; + probe_ent->host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | + ATA_FLAG_MMIO; probe_ent->port_ops = &k2_sata_ops; probe_ent->n_ports = 4; probe_ent->irq = pdev->irq; - probe_ent->irq_flags = SA_SHIRQ; + probe_ent->irq_flags = IRQF_SHARED; probe_ent->mmio_base = mmio_base; /* We don't care much about the PIO/UDMA masks, but the core won't like us diff --git a/drivers/scsi/sata_sx4.c b/drivers/scsi/sata_sx4.c index 140cea05d..ccc8cad24 100644 --- a/drivers/scsi/sata_sx4.c +++ b/drivers/scsi/sata_sx4.c @@ -7,21 +7,26 @@ * * Copyright 2003-2004 Red Hat, Inc. * - * The contents of this file are subject to the Open - * Software License version 1.1 that can be found at - * http://www.opensource.org/licenses/osl-1.1.txt and is included herein - * by reference. * - * Alternatively, the contents of this file may be used under the terms - * of the GNU General Public License version 2 (the "GPL") as distributed - * in the kernel source COPYING file, in which case the provisions of - * the GPL are applicable instead of the above. If you wish to allow - * the use of your version of this file only under the terms of the - * GPL and not to allow others to use your version of this file under - * the OSL, indicate your decision by deleting the provisions above and - * replace them with the notice and other provisions required by the GPL. - * If you do not delete the provisions above, a recipient may use your - * version of this file under either the OSL or the GPL. + * 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; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * + * + * libata documentation is available via 'make {ps|pdf}docs', + * as Documentation/DocBook/libata.* + * + * Hardware documentation available under NDA. * */ @@ -33,14 +38,15 @@ #include #include #include -#include "scsi.h" +#include #include +#include #include #include #include "sata_promise.h" #define DRV_NAME "sata_sx4" -#define DRV_VERSION "0.7" +#define DRV_VERSION "0.9" enum { @@ -94,7 +100,7 @@ enum { PDC_DIMM1_CONTROL_OFFSET = 0x84, PDC_SDRAM_CONTROL_OFFSET = 0x88, PDC_I2C_WRITE = 0x00000000, - PDC_I2C_READ = 0x00000040, + PDC_I2C_READ = 0x00000040, PDC_I2C_START = 0x00000080, PDC_I2C_MASK_INT = 0x00000020, PDC_I2C_COMPLETE = 0x00010000, @@ -105,16 +111,16 @@ enum { PDC_DIMM_SPD_COLUMN_NUM = 4, PDC_DIMM_SPD_MODULE_ROW = 5, PDC_DIMM_SPD_TYPE = 11, - PDC_DIMM_SPD_FRESH_RATE = 12, - PDC_DIMM_SPD_BANK_NUM = 17, + PDC_DIMM_SPD_FRESH_RATE = 12, + PDC_DIMM_SPD_BANK_NUM = 17, PDC_DIMM_SPD_CAS_LATENCY = 18, - PDC_DIMM_SPD_ATTRIBUTE = 21, + PDC_DIMM_SPD_ATTRIBUTE = 21, PDC_DIMM_SPD_ROW_PRE_CHARGE = 27, - PDC_DIMM_SPD_ROW_ACTIVE_DELAY = 28, + PDC_DIMM_SPD_ROW_ACTIVE_DELAY = 28, PDC_DIMM_SPD_RAS_CAS_DELAY = 29, PDC_DIMM_SPD_ACTIVE_PRECHARGE = 30, PDC_DIMM_SPD_SYSTEM_FREQ = 126, - PDC_CTL_STATUS = 0x08, + PDC_CTL_STATUS = 0x08, PDC_DIMM_WINDOW_CTLR = 0x0C, PDC_TIME_CONTROL = 0x3C, PDC_TIME_PERIOD = 0x40, @@ -132,7 +138,7 @@ struct pdc_port_priv { }; struct pdc_host_priv { - void *dimm_mmio; + void __iomem *dimm_mmio; unsigned int doing_hdma; unsigned int hdma_prod; @@ -152,46 +158,44 @@ static void pdc_20621_phy_reset (struct ata_port *ap); static int pdc_port_start(struct ata_port *ap); static void pdc_port_stop(struct ata_port *ap); static void pdc20621_qc_prep(struct ata_queued_cmd *qc); -static void pdc_tf_load_mmio(struct ata_port *ap, struct ata_taskfile *tf); -static void pdc_exec_command_mmio(struct ata_port *ap, struct ata_taskfile *tf); +static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf); +static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf); static void pdc20621_host_stop(struct ata_host_set *host_set); static unsigned int pdc20621_dimm_init(struct ata_probe_ent *pe); static int pdc20621_detect_dimm(struct ata_probe_ent *pe); -static unsigned int pdc20621_i2c_read(struct ata_probe_ent *pe, +static unsigned int pdc20621_i2c_read(struct ata_probe_ent *pe, u32 device, u32 subaddr, u32 *pdata); static int pdc20621_prog_dimm0(struct ata_probe_ent *pe); static unsigned int pdc20621_prog_dimm_global(struct ata_probe_ent *pe); #ifdef ATA_VERBOSE_DEBUG -static void pdc20621_get_from_dimm(struct ata_probe_ent *pe, +static void pdc20621_get_from_dimm(struct ata_probe_ent *pe, void *psource, u32 offset, u32 size); #endif -static void pdc20621_put_to_dimm(struct ata_probe_ent *pe, +static void pdc20621_put_to_dimm(struct ata_probe_ent *pe, void *psource, u32 offset, u32 size); static void pdc20621_irq_clear(struct ata_port *ap); -static int pdc20621_qc_issue_prot(struct ata_queued_cmd *qc); +static unsigned int pdc20621_qc_issue_prot(struct ata_queued_cmd *qc); -static Scsi_Host_Template pdc_sata_sht = { +static struct scsi_host_template pdc_sata_sht = { .module = THIS_MODULE, .name = DRV_NAME, .ioctl = ata_scsi_ioctl, .queuecommand = ata_scsi_queuecmd, - .eh_strategy_handler = ata_scsi_error, .can_queue = ATA_DEF_QUEUE, .this_id = ATA_SHT_THIS_ID, .sg_tablesize = LIBATA_MAX_PRD, - .max_sectors = ATA_MAX_SECTORS, .cmd_per_lun = ATA_SHT_CMD_PER_LUN, .emulated = ATA_SHT_EMULATED, .use_clustering = ATA_SHT_USE_CLUSTERING, .proc_name = DRV_NAME, .dma_boundary = ATA_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, + .slave_destroy = ata_scsi_slave_destroy, .bios_param = ata_std_bios_param, - .ordered_flush = 1, }; -static struct ata_port_operations pdc_20621_ops = { +static const struct ata_port_operations pdc_20621_ops = { .port_disable = ata_port_disable, .tf_load = pdc_tf_load_mmio, .tf_read = ata_tf_read, @@ -201,6 +205,7 @@ static struct ata_port_operations pdc_20621_ops = { .phy_reset = pdc_20621_phy_reset, .qc_prep = pdc20621_qc_prep, .qc_issue = pdc20621_qc_issue_prot, + .data_xfer = ata_mmio_data_xfer, .eng_timeout = pdc_eng_timeout, .irq_handler = pdc20621_interrupt, .irq_clear = pdc20621_irq_clear, @@ -209,12 +214,13 @@ static 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 | ATA_FLAG_PIO_POLLING, .pio_mask = 0x1f, /* pio0-4 */ .mwdma_mask = 0x07, /* mwdma0-2 */ .udma_mask = 0x7f, /* udma0-6 ; FIXME */ @@ -223,7 +229,7 @@ static struct ata_port_info pdc_port_info[] = { }; -static struct pci_device_id pdc_sata_pci_tbl[] = { +static const struct pci_device_id pdc_sata_pci_tbl[] = { { PCI_VENDOR_ID_PROMISE, 0x6622, PCI_ANY_ID, PCI_ANY_ID, 0, 0, board_20621 }, { } /* terminate list */ @@ -240,13 +246,14 @@ static struct pci_driver pdc_sata_pci_driver = { static void pdc20621_host_stop(struct ata_host_set *host_set) { + struct pci_dev *pdev = to_pci_dev(host_set->dev); struct pdc_host_priv *hpriv = host_set->private_data; - void *dimm_mmio = hpriv->dimm_mmio; + void __iomem *dimm_mmio = hpriv->dimm_mmio; - iounmap(dimm_mmio); + pci_iounmap(pdev, dimm_mmio); kfree(hpriv); - ata_host_stop(host_set); + pci_iounmap(pdev, host_set->mmio_base); } static int pdc_port_start(struct ata_port *ap) @@ -443,17 +450,17 @@ static inline void pdc20621_host_pkt(struct ata_taskfile *tf, u8 *buf, static void pdc20621_dma_prep(struct ata_queued_cmd *qc) { - struct scatterlist *sg = qc->sg; + struct scatterlist *sg; struct ata_port *ap = qc->ap; struct pdc_port_priv *pp = ap->private_data; - void *mmio = ap->host_set->mmio_base; + void __iomem *mmio = ap->host_set->mmio_base; struct pdc_host_priv *hpriv = ap->host_set->private_data; - void *dimm_mmio = hpriv->dimm_mmio; + void __iomem *dimm_mmio = hpriv->dimm_mmio; unsigned int portno = ap->port_no; - unsigned int i, last, idx, total_len = 0, sgt_len; + unsigned int i, idx, total_len = 0, sgt_len; u32 *buf = (u32 *) &pp->dimm_buf[PDC_DIMM_HEADER_SZ]; - assert(qc->flags & ATA_QCFLAG_DMAMAP); + WARN_ON(!(qc->flags & ATA_QCFLAG_DMAMAP)); VPRINTK("ata%u: ENTER\n", ap->id); @@ -463,12 +470,11 @@ static void pdc20621_dma_prep(struct ata_queued_cmd *qc) /* * Build S/G table */ - last = qc->n_elem; idx = 0; - for (i = 0; i < last; i++) { - buf[idx++] = cpu_to_le32(sg_dma_address(&sg[i])); - buf[idx++] = cpu_to_le32(sg_dma_len(&sg[i])); - total_len += sg[i].length; + ata_for_each_sg(sg, qc) { + buf[idx++] = cpu_to_le32(sg_dma_address(sg)); + buf[idx++] = cpu_to_le32(sg_dma_len(sg)); + total_len += sg_dma_len(sg); } buf[idx - 1] |= cpu_to_le32(ATA_PRD_EOT); sgt_len = idx * 4; @@ -508,9 +514,9 @@ static void pdc20621_nodata_prep(struct ata_queued_cmd *qc) { struct ata_port *ap = qc->ap; struct pdc_port_priv *pp = ap->private_data; - void *mmio = ap->host_set->mmio_base; + void __iomem *mmio = ap->host_set->mmio_base; struct pdc_host_priv *hpriv = ap->host_set->private_data; - void *dimm_mmio = hpriv->dimm_mmio; + void __iomem *dimm_mmio = hpriv->dimm_mmio; unsigned int portno = ap->port_no; unsigned int i; @@ -560,7 +566,7 @@ static void __pdc20621_push_hdma(struct ata_queued_cmd *qc, { struct ata_port *ap = qc->ap; struct ata_host_set *host_set = ap->host_set; - void *mmio = host_set->mmio_base; + void __iomem *mmio = host_set->mmio_base; /* hard-code chip #0 */ mmio += PDC_CHIP0_OFS; @@ -634,7 +640,7 @@ static void pdc20621_packet_start(struct ata_queued_cmd *qc) struct ata_port *ap = qc->ap; struct ata_host_set *host_set = ap->host_set; unsigned int port_no = ap->port_no; - void *mmio = host_set->mmio_base; + void __iomem *mmio = host_set->mmio_base; unsigned int rw = (qc->tf.flags & ATA_TFLAG_WRITE); u8 seq = (u8) (port_no + 1); unsigned int port_ofs; @@ -663,8 +669,8 @@ static void pdc20621_packet_start(struct ata_queued_cmd *qc) readl(mmio + PDC_20621_SEQCTL + (seq * 4)); /* flush */ writel(port_ofs + PDC_DIMM_ATA_PKT, - (void *) ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT); - readl((void *) ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT); + (void __iomem *) ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT); + readl((void __iomem *) ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT); VPRINTK("submitted ofs 0x%x (%u), seq %u\n", port_ofs + PDC_DIMM_ATA_PKT, port_ofs + PDC_DIMM_ATA_PKT, @@ -672,7 +678,7 @@ static void pdc20621_packet_start(struct ata_queued_cmd *qc) } } -static int pdc20621_qc_issue_prot(struct ata_queued_cmd *qc) +static unsigned int pdc20621_qc_issue_prot(struct ata_queued_cmd *qc) { switch (qc->tf.protocol) { case ATA_PROT_DMA: @@ -694,7 +700,7 @@ static int pdc20621_qc_issue_prot(struct ata_queued_cmd *qc) static inline unsigned int pdc20621_host_intr( struct ata_port *ap, struct ata_queued_cmd *qc, unsigned int doing_hdma, - void *mmio) + void __iomem *mmio) { unsigned int port_no = ap->port_no; unsigned int port_ofs = @@ -712,7 +718,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, ata_wait_idle(ap)); + qc->err_mask |= ac_err_mask(ata_wait_idle(ap)); + ata_qc_complete(qc); pdc20621_pop_hdma(qc); } @@ -741,8 +748,8 @@ static inline unsigned int pdc20621_host_intr( struct ata_port *ap, writel(0x00000001, mmio + PDC_20621_SEQCTL + (seq * 4)); readl(mmio + PDC_20621_SEQCTL + (seq * 4)); writel(port_ofs + PDC_DIMM_ATA_PKT, - (void *) ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT); - readl((void *) ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT); + (void __iomem *) ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT); + readl((void __iomem *) ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT); } /* step two - execute ATA command */ @@ -750,7 +757,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, ata_wait_idle(ap)); + qc->err_mask |= ac_err_mask(ata_wait_idle(ap)); + ata_qc_complete(qc); pdc20621_pop_hdma(qc); } handled = 1; @@ -760,7 +768,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, status); + qc->err_mask |= ac_err_mask(status); + ata_qc_complete(qc); handled = 1; } else { @@ -773,7 +782,7 @@ static inline unsigned int pdc20621_host_intr( struct ata_port *ap, static void pdc20621_irq_clear(struct ata_port *ap) { struct ata_host_set *host_set = ap->host_set; - void *mmio = host_set->mmio_base; + void __iomem *mmio = host_set->mmio_base; mmio += PDC_CHIP0_OFS; @@ -787,7 +796,7 @@ static irqreturn_t pdc20621_interrupt (int irq, void *dev_instance, struct pt_re u32 mask = 0; unsigned int i, tmp, port_no; unsigned int handled = 0; - void *mmio_base; + void __iomem *mmio_base; VPRINTK("ENTER\n"); @@ -825,11 +834,12 @@ static irqreturn_t pdc20621_interrupt (int irq, void *dev_instance, struct pt_re ap = host_set->ports[port_no]; tmp = mask & (1 << i); VPRINTK("seq %u, port_no %u, ap %p, tmp %x\n", i, port_no, ap, tmp); - if (tmp && ap && (!(ap->flags & ATA_FLAG_PORT_DISABLED))) { + if (tmp && ap && + !(ap->flags & ATA_FLAG_DISABLED)) { struct ata_queued_cmd *qc; qc = ata_qc_from_tag(ap, ap->active_tag); - if (qc && (!(qc->tf.ctl & ATA_NIEN))) + if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) handled += pdc20621_host_intr(ap, qc, (i > 4), mmio_base); } @@ -847,47 +857,40 @@ static irqreturn_t pdc20621_interrupt (int irq, void *dev_instance, struct pt_re static void pdc_eng_timeout(struct ata_port *ap) { u8 drv_stat; + struct ata_host_set *host_set = ap->host_set; struct ata_queued_cmd *qc; + unsigned long flags; DPRINTK("ENTER\n"); - qc = ata_qc_from_tag(ap, ap->active_tag); - if (!qc) { - printk(KERN_ERR "ata%u: BUG: timeout without command\n", - ap->id); - goto out; - } + spin_lock_irqsave(&host_set->lock, flags); - /* hack alert! We cannot use the supplied completion - * function from inside the ->eh_strategy_handler() thread. - * libata is the only user of ->eh_strategy_handler() in - * any kernel, so the default scsi_done() assumes it is - * not being called from the SCSI EH. - */ - qc->scsidone = scsi_finish_command; + qc = ata_qc_from_tag(ap, ap->active_tag); switch (qc->tf.protocol) { case ATA_PROT_DMA: case ATA_PROT_NODATA: - printk(KERN_ERR "ata%u: command timeout\n", ap->id); - ata_qc_complete(qc, ata_wait_idle(ap) | ATA_ERR); + ata_port_printk(ap, KERN_ERR, "command timeout\n"); + qc->err_mask |= __ac_err_mask(ata_wait_idle(ap)); break; default: drv_stat = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000); - printk(KERN_ERR "ata%u: unknown timeout, cmd 0x%x stat 0x%x\n", - ap->id, qc->tf.command, drv_stat); + ata_port_printk(ap, KERN_ERR, + "unknown timeout, cmd 0x%x stat 0x%x\n", + qc->tf.command, drv_stat); - ata_qc_complete(qc, drv_stat); + qc->err_mask |= ac_err_mask(drv_stat); break; } -out: + spin_unlock_irqrestore(&host_set->lock, flags); + ata_eh_qc_complete(qc); DPRINTK("EXIT\n"); } -static void pdc_tf_load_mmio(struct ata_port *ap, struct ata_taskfile *tf) +static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf) { WARN_ON (tf->protocol == ATA_PROT_DMA || tf->protocol == ATA_PROT_NODATA); @@ -895,7 +898,7 @@ static void pdc_tf_load_mmio(struct ata_port *ap, struct ata_taskfile *tf) } -static void pdc_exec_command_mmio(struct ata_port *ap, struct ata_taskfile *tf) +static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf) { WARN_ON (tf->protocol == ATA_PROT_DMA || tf->protocol == ATA_PROT_NODATA); @@ -922,23 +925,23 @@ static void pdc_sata_setup_port(struct ata_ioports *port, unsigned long base) #ifdef ATA_VERBOSE_DEBUG -static void pdc20621_get_from_dimm(struct ata_probe_ent *pe, void *psource, +static void pdc20621_get_from_dimm(struct ata_probe_ent *pe, void *psource, u32 offset, u32 size) { u32 window_size; u16 idx; u8 page_mask; long dist; - void *mmio = pe->mmio_base; + void __iomem *mmio = pe->mmio_base; struct pdc_host_priv *hpriv = pe->private_data; - void *dimm_mmio = hpriv->dimm_mmio; + void __iomem *dimm_mmio = hpriv->dimm_mmio; /* hard-code chip #0 */ mmio += PDC_CHIP0_OFS; - page_mask = 0x00; - window_size = 0x2000 * 4; /* 32K byte uchar size */ - idx = (u16) (offset / window_size); + page_mask = 0x00; + window_size = 0x2000 * 4; /* 32K byte uchar size */ + idx = (u16) (offset / window_size); writel(0x01, mmio + PDC_GENERAL_CTLR); readl(mmio + PDC_GENERAL_CTLR); @@ -947,19 +950,19 @@ static void pdc20621_get_from_dimm(struct ata_probe_ent *pe, void *psource, offset -= (idx * window_size); idx++; - dist = ((long) (window_size - (offset + size))) >= 0 ? size : + dist = ((long) (window_size - (offset + size))) >= 0 ? size : (long) (window_size - offset); - memcpy_fromio((char *) psource, (char *) (dimm_mmio + offset / 4), + memcpy_fromio((char *) psource, (char *) (dimm_mmio + offset / 4), dist); - psource += dist; + psource += dist; size -= dist; for (; (long) size >= (long) window_size ;) { writel(0x01, mmio + PDC_GENERAL_CTLR); readl(mmio + PDC_GENERAL_CTLR); writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR); readl(mmio + PDC_DIMM_WINDOW_CTLR); - memcpy_fromio((char *) psource, (char *) (dimm_mmio), + memcpy_fromio((char *) psource, (char *) (dimm_mmio), window_size / 4); psource += window_size; size -= window_size; @@ -971,71 +974,70 @@ static void pdc20621_get_from_dimm(struct ata_probe_ent *pe, void *psource, readl(mmio + PDC_GENERAL_CTLR); writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR); readl(mmio + PDC_DIMM_WINDOW_CTLR); - memcpy_fromio((char *) psource, (char *) (dimm_mmio), + memcpy_fromio((char *) psource, (char *) (dimm_mmio), size / 4); } } #endif -static void pdc20621_put_to_dimm(struct ata_probe_ent *pe, void *psource, +static void pdc20621_put_to_dimm(struct ata_probe_ent *pe, void *psource, u32 offset, u32 size) { u32 window_size; u16 idx; u8 page_mask; long dist; - void *mmio = pe->mmio_base; + void __iomem *mmio = pe->mmio_base; struct pdc_host_priv *hpriv = pe->private_data; - void *dimm_mmio = hpriv->dimm_mmio; + void __iomem *dimm_mmio = hpriv->dimm_mmio; - /* hard-code chip #0 */ + /* hard-code chip #0 */ mmio += PDC_CHIP0_OFS; - page_mask = 0x00; - window_size = 0x2000 * 4; /* 32K byte uchar size */ + page_mask = 0x00; + window_size = 0x2000 * 4; /* 32K byte uchar size */ idx = (u16) (offset / window_size); writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR); readl(mmio + PDC_DIMM_WINDOW_CTLR); - offset -= (idx * window_size); + offset -= (idx * window_size); idx++; dist = ((long)(s32)(window_size - (offset + size))) >= 0 ? size : (long) (window_size - offset); - memcpy_toio((char *) (dimm_mmio + offset / 4), (char *) psource, dist); + memcpy_toio(dimm_mmio + offset / 4, psource, dist); writel(0x01, mmio + PDC_GENERAL_CTLR); readl(mmio + PDC_GENERAL_CTLR); - psource += dist; + psource += dist; size -= dist; for (; (long) size >= (long) window_size ;) { writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR); readl(mmio + PDC_DIMM_WINDOW_CTLR); - memcpy_toio((char *) (dimm_mmio), (char *) psource, - window_size / 4); + memcpy_toio(dimm_mmio, psource, window_size / 4); writel(0x01, mmio + PDC_GENERAL_CTLR); readl(mmio + PDC_GENERAL_CTLR); psource += window_size; size -= window_size; idx ++; } - + if (size) { writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR); readl(mmio + PDC_DIMM_WINDOW_CTLR); - memcpy_toio((char *) (dimm_mmio), (char *) psource, size / 4); + memcpy_toio(dimm_mmio, psource, size / 4); writel(0x01, mmio + PDC_GENERAL_CTLR); readl(mmio + PDC_GENERAL_CTLR); } } -static unsigned int pdc20621_i2c_read(struct ata_probe_ent *pe, u32 device, +static unsigned int pdc20621_i2c_read(struct ata_probe_ent *pe, u32 device, u32 subaddr, u32 *pdata) { - void *mmio = pe->mmio_base; + void __iomem *mmio = pe->mmio_base; u32 i2creg = 0; - u32 status; + u32 status; u32 count =0; /* hard-code chip #0 */ @@ -1049,7 +1051,7 @@ static unsigned int pdc20621_i2c_read(struct ata_probe_ent *pe, u32 device, readl(mmio + PDC_I2C_ADDR_DATA_OFFSET); /* Write Control to perform read operation, mask int */ - writel(PDC_I2C_READ | PDC_I2C_START | PDC_I2C_MASK_INT, + writel(PDC_I2C_READ | PDC_I2C_START | PDC_I2C_MASK_INT, mmio + PDC_I2C_CONTROL_OFFSET); for (count = 0; count <= 1000; count ++) { @@ -1062,26 +1064,26 @@ static unsigned int pdc20621_i2c_read(struct ata_probe_ent *pe, u32 device, } *pdata = (status >> 8) & 0x000000ff; - return 1; + return 1; } static int pdc20621_detect_dimm(struct ata_probe_ent *pe) { u32 data=0 ; - if (pdc20621_i2c_read(pe, PDC_DIMM0_SPD_DEV_ADDRESS, + if (pdc20621_i2c_read(pe, PDC_DIMM0_SPD_DEV_ADDRESS, PDC_DIMM_SPD_SYSTEM_FREQ, &data)) { if (data == 100) return 100; } else return 0; - + if (pdc20621_i2c_read(pe, PDC_DIMM0_SPD_DEV_ADDRESS, 9, &data)) { - if(data <= 0x75) + if(data <= 0x75) return 133; } else return 0; - + return 0; } @@ -1091,15 +1093,15 @@ static int pdc20621_prog_dimm0(struct ata_probe_ent *pe) u32 spd0[50]; u32 data = 0; int size, i; - u8 bdimmsize; - void *mmio = pe->mmio_base; + u8 bdimmsize; + void __iomem *mmio = pe->mmio_base; static const struct { unsigned int reg; unsigned int ofs; } pdc_i2c_read_data [] = { - { PDC_DIMM_SPD_TYPE, 11 }, + { PDC_DIMM_SPD_TYPE, 11 }, { PDC_DIMM_SPD_FRESH_RATE, 12 }, - { PDC_DIMM_SPD_COLUMN_NUM, 4 }, + { PDC_DIMM_SPD_COLUMN_NUM, 4 }, { PDC_DIMM_SPD_ATTRIBUTE, 21 }, { PDC_DIMM_SPD_ROW_NUM, 3 }, { PDC_DIMM_SPD_BANK_NUM, 17 }, @@ -1108,7 +1110,7 @@ static int pdc20621_prog_dimm0(struct ata_probe_ent *pe) { PDC_DIMM_SPD_ROW_ACTIVE_DELAY, 28 }, { PDC_DIMM_SPD_RAS_CAS_DELAY, 29 }, { PDC_DIMM_SPD_ACTIVE_PRECHARGE, 30 }, - { PDC_DIMM_SPD_CAS_LATENCY, 18 }, + { PDC_DIMM_SPD_CAS_LATENCY, 18 }, }; /* hard-code chip #0 */ @@ -1116,17 +1118,17 @@ static int pdc20621_prog_dimm0(struct ata_probe_ent *pe) for(i=0; i spd0[28]) - ? spd0[29] : spd0[28]) + 9) / 10) - 1) << 10; + data |= (((((spd0[29] > spd0[28]) + ? spd0[29] : spd0[28]) + 9) / 10) - 1) << 10; data |= ((spd0[30] - spd0[29] + 9) / 10 - 2) << 12; - - if (spd0[18] & 0x08) + + if (spd0[18] & 0x08) data |= ((0x03) << 14); else if (spd0[18] & 0x04) data |= ((0x02) << 14); @@ -1135,7 +1137,7 @@ static int pdc20621_prog_dimm0(struct ata_probe_ent *pe) else data |= (0 << 14); - /* + /* Calculate the size of bDIMMSize (power of 2) and merge the DIMM size by program start/end address. */ @@ -1145,9 +1147,9 @@ static int pdc20621_prog_dimm0(struct ata_probe_ent *pe) data |= (((size / 16) - 1) << 16); data |= (0 << 23); data |= 8; - writel(data, mmio + PDC_DIMM0_CONTROL_OFFSET); + writel(data, mmio + PDC_DIMM0_CONTROL_OFFSET); readl(mmio + PDC_DIMM0_CONTROL_OFFSET); - return size; + return size; } @@ -1155,7 +1157,7 @@ static unsigned int pdc20621_prog_dimm_global(struct ata_probe_ent *pe) { u32 data, spd0; int error, i; - void *mmio = pe->mmio_base; + void __iomem *mmio = pe->mmio_base; /* hard-code chip #0 */ mmio += PDC_CHIP0_OFS; @@ -1167,12 +1169,12 @@ static unsigned int pdc20621_prog_dimm_global(struct ata_probe_ent *pe) Refresh Enable (bit 17) */ - data = 0x022259F1; + data = 0x022259F1; writel(data, mmio + PDC_SDRAM_CONTROL_OFFSET); readl(mmio + PDC_SDRAM_CONTROL_OFFSET); /* Turn on for ECC */ - pdc20621_i2c_read(pe, PDC_DIMM0_SPD_DEV_ADDRESS, + pdc20621_i2c_read(pe, PDC_DIMM0_SPD_DEV_ADDRESS, PDC_DIMM_SPD_TYPE, &spd0); if (spd0 == 0x02) { data |= (0x01 << 16); @@ -1186,22 +1188,22 @@ static unsigned int pdc20621_prog_dimm_global(struct ata_probe_ent *pe) data |= (1<<19); writel(data, mmio + PDC_SDRAM_CONTROL_OFFSET); - error = 1; + error = 1; for (i = 1; i <= 10; i++) { /* polling ~5 secs */ data = readl(mmio + PDC_SDRAM_CONTROL_OFFSET); if (!(data & (1<<19))) { error = 0; - break; + break; } msleep(i*100); } return error; } - + static unsigned int pdc20621_dimm_init(struct ata_probe_ent *pe) { - int speed, size, length; + int speed, size, length; u32 addr,spd0,pci_status; u32 tmp=0; u32 time_period=0; @@ -1209,7 +1211,7 @@ static unsigned int pdc20621_dimm_init(struct ata_probe_ent *pe) u32 ticks=0; u32 clock=0; u32 fparam=0; - void *mmio = pe->mmio_base; + void __iomem *mmio = pe->mmio_base; /* hard-code chip #0 */ mmio += PDC_CHIP0_OFS; @@ -1228,7 +1230,7 @@ static unsigned int pdc20621_dimm_init(struct ata_probe_ent *pe) /* Wait 3 seconds */ msleep(3000); - /* + /* When timer is enabled, counter is decreased every internal clock cycle. */ @@ -1236,24 +1238,24 @@ static unsigned int pdc20621_dimm_init(struct ata_probe_ent *pe) tcount = readl(mmio + PDC_TIME_COUNTER); VPRINTK("Time Counter Register (0x44): 0x%x\n", tcount); - /* + /* If SX4 is on PCI-X bus, after 3 seconds, the timer counter register should be >= (0xffffffff - 3x10^8). */ if(tcount >= PCI_X_TCOUNT) { ticks = (time_period - tcount); VPRINTK("Num counters 0x%x (%d)\n", ticks, ticks); - + clock = (ticks / 300000); VPRINTK("10 * Internal clk = 0x%x (%d)\n", clock, clock); - + clock = (clock * 33); VPRINTK("10 * Internal clk * 33 = 0x%x (%d)\n", clock, clock); /* PLL F Param (bit 22:16) */ fparam = (1400000 / clock) - 2; VPRINTK("PLL F Param: 0x%x (%d)\n", fparam, fparam); - + /* OD param = 0x2 (bit 31:30), R param = 0x5 (bit 29:25) */ pci_status = (0x8a001824 | (fparam << 16)); } else @@ -1264,21 +1266,21 @@ static unsigned int pdc20621_dimm_init(struct ata_probe_ent *pe) writel(pci_status, mmio + PDC_CTL_STATUS); readl(mmio + PDC_CTL_STATUS); - /* + /* Read SPD of DIMM by I2C interface, and program the DIMM Module Controller. */ if (!(speed = pdc20621_detect_dimm(pe))) { - printk(KERN_ERR "Detect Local DIMM Fail\n"); + printk(KERN_ERR "Detect Local DIMM Fail\n"); return 1; /* DIMM error */ } VPRINTK("Local DIMM Speed = %d\n", speed); - /* Programming DIMM0 Module Control Register (index_CID0:80h) */ + /* Programming DIMM0 Module Control Register (index_CID0:80h) */ size = pdc20621_prog_dimm0(pe); VPRINTK("Local DIMM Size = %dMB\n",size); - /* Programming DIMM Module Global Control Register (index_CID0:88h) */ + /* Programming DIMM Module Global Control Register (index_CID0:88h) */ if (pdc20621_prog_dimm_global(pe)) { printk(KERN_ERR "Programming DIMM Module Global Control Register Fail\n"); return 1; @@ -1297,30 +1299,30 @@ static unsigned int pdc20621_dimm_init(struct ata_probe_ent *pe) pdc20621_put_to_dimm(pe, (void *) test_parttern1, 0x10040, 40); pdc20621_get_from_dimm(pe, (void *) test_parttern2, 0x40, 40); - printk(KERN_ERR "%x, %x, %s\n", test_parttern2[0], + printk(KERN_ERR "%x, %x, %s\n", test_parttern2[0], test_parttern2[1], &(test_parttern2[2])); - pdc20621_get_from_dimm(pe, (void *) test_parttern2, 0x10040, + pdc20621_get_from_dimm(pe, (void *) test_parttern2, 0x10040, 40); - printk(KERN_ERR "%x, %x, %s\n", test_parttern2[0], + printk(KERN_ERR "%x, %x, %s\n", test_parttern2[0], test_parttern2[1], &(test_parttern2[2])); pdc20621_put_to_dimm(pe, (void *) test_parttern1, 0x40, 40); pdc20621_get_from_dimm(pe, (void *) test_parttern2, 0x40, 40); - printk(KERN_ERR "%x, %x, %s\n", test_parttern2[0], + printk(KERN_ERR "%x, %x, %s\n", test_parttern2[0], test_parttern2[1], &(test_parttern2[2])); } #endif /* ECC initiliazation. */ - pdc20621_i2c_read(pe, PDC_DIMM0_SPD_DEV_ADDRESS, + pdc20621_i2c_read(pe, PDC_DIMM0_SPD_DEV_ADDRESS, PDC_DIMM_SPD_TYPE, &spd0); if (spd0 == 0x02) { VPRINTK("Start ECC initialization\n"); addr = 0; length = size * 1024 * 1024; while (addr < length) { - pdc20621_put_to_dimm(pe, (void *) &tmp, addr, + pdc20621_put_to_dimm(pe, (void *) &tmp, addr, sizeof(u32)); addr += sizeof(u32); } @@ -1333,7 +1335,7 @@ static unsigned int pdc20621_dimm_init(struct ata_probe_ent *pe) static void pdc_20621_init(struct ata_probe_ent *pe) { u32 tmp; - void *mmio = pe->mmio_base; + void __iomem *mmio = pe->mmio_base; /* hard-code chip #0 */ mmio += PDC_CHIP0_OFS; @@ -1366,19 +1368,16 @@ static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id * static int printed_version; struct ata_probe_ent *probe_ent = NULL; unsigned long base; - void *mmio_base, *dimm_mmio = NULL; + void __iomem *mmio_base; + void __iomem *dimm_mmio = NULL; struct pdc_host_priv *hpriv = NULL; unsigned int board_idx = (unsigned int) ent->driver_data; int pci_dev_busy = 0; int rc; if (!printed_version++) - printk(KERN_DEBUG DRV_NAME " version " DRV_VERSION "\n"); + dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n"); - /* - * If this driver happens to only be useful on Apple's K2, then - * we should check that here as it has a normal Serverworks ID - */ rc = pci_enable_device(pdev); if (rc) return rc; @@ -1406,8 +1405,7 @@ static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id * probe_ent->dev = pci_dev_to_dev(pdev); INIT_LIST_HEAD(&probe_ent->node); - mmio_base = ioremap(pci_resource_start(pdev, 3), - pci_resource_len(pdev, 3)); + mmio_base = pci_iomap(pdev, 3, 0); if (mmio_base == NULL) { rc = -ENOMEM; goto err_out_free_ent; @@ -1421,8 +1419,7 @@ static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id * } memset(hpriv, 0, sizeof(*hpriv)); - dimm_mmio = ioremap(pci_resource_start(pdev, 4), - pci_resource_len(pdev, 4)); + dimm_mmio = pci_iomap(pdev, 4, 0); if (!dimm_mmio) { kfree(hpriv); rc = -ENOMEM; @@ -1439,7 +1436,7 @@ static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id * probe_ent->port_ops = pdc_port_info[board_idx].port_ops; probe_ent->irq = pdev->irq; - probe_ent->irq_flags = SA_SHIRQ; + probe_ent->irq_flags = IRQF_SHARED; probe_ent->mmio_base = mmio_base; probe_ent->private_data = hpriv; @@ -1469,9 +1466,9 @@ static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id * err_out_iounmap_dimm: /* only get to this label if 20621 */ kfree(hpriv); - iounmap(dimm_mmio); + pci_iounmap(pdev, dimm_mmio); err_out_iounmap: - iounmap(mmio_base); + pci_iounmap(pdev, mmio_base); err_out_free_ent: kfree(probe_ent); err_out_regions: diff --git a/drivers/scsi/sata_uli.c b/drivers/scsi/sata_uli.c index a71fb54ee..33cdb4867 100644 --- a/drivers/scsi/sata_uli.c +++ b/drivers/scsi/sata_uli.c @@ -1,25 +1,29 @@ /* * sata_uli.c - ULi Electronics SATA * - * The contents of this file are subject to the Open - * Software License version 1.1 that can be found at - * http://www.opensource.org/licenses/osl-1.1.txt and is included herein - * by reference. * - * Alternatively, the contents of this file may be used under the terms - * of the GNU General Public License version 2 (the "GPL") as distributed - * in the kernel source COPYING file, in which case the provisions of - * the GPL are applicable instead of the above. If you wish to allow - * the use of your version of this file only under the terms of the - * GPL and not to allow others to use your version of this file under - * the OSL, indicate your decision by deleting the provisions above and - * replace them with the notice and other provisions required by the GPL. - * If you do not delete the provisions above, a recipient may use your - * version of this file under either the OSL or the GPL. + * 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; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * + * + * libata documentation is available via 'make {ps|pdf}docs', + * as Documentation/DocBook/libata.* + * + * Hardware documentation available under NDA. * */ -#include #include #include #include @@ -27,18 +31,20 @@ #include #include #include -#include "scsi.h" +#include #include #include #define DRV_NAME "sata_uli" -#define DRV_VERSION "0.5" +#define DRV_VERSION "1.0" enum { uli_5289 = 0, uli_5287 = 1, uli_5281 = 2, + uli_max_ports = 4, + /* PCI configuration registers */ ULI5287_BASE = 0x90, /* sata0 phy SCR registers */ ULI5287_OFFS = 0x10, /* offset from sata0->sata1 phy regs */ @@ -46,11 +52,15 @@ enum { ULI5281_OFFS = 0x60, /* offset from sata0->sata1 phy regs */ }; +struct uli_priv { + unsigned int scr_cfg_addr[uli_max_ports]; +}; + static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent); static u32 uli_scr_read (struct ata_port *ap, unsigned int sc_reg); static void uli_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val); -static struct pci_device_id uli_pci_tbl[] = { +static const struct pci_device_id uli_pci_tbl[] = { { PCI_VENDOR_ID_AL, 0x5289, PCI_ANY_ID, PCI_ANY_ID, 0, 0, uli_5289 }, { PCI_VENDOR_ID_AL, 0x5287, PCI_ANY_ID, PCI_ANY_ID, 0, 0, uli_5287 }, { PCI_VENDOR_ID_AL, 0x5281, PCI_ANY_ID, PCI_ANY_ID, 0, 0, uli_5281 }, @@ -65,27 +75,25 @@ static struct pci_driver uli_pci_driver = { .remove = ata_pci_remove_one, }; -static Scsi_Host_Template uli_sht = { +static struct scsi_host_template uli_sht = { .module = THIS_MODULE, .name = DRV_NAME, .ioctl = ata_scsi_ioctl, .queuecommand = ata_scsi_queuecmd, - .eh_strategy_handler = ata_scsi_error, .can_queue = ATA_DEF_QUEUE, .this_id = ATA_SHT_THIS_ID, .sg_tablesize = LIBATA_MAX_PRD, - .max_sectors = ATA_MAX_SECTORS, .cmd_per_lun = ATA_SHT_CMD_PER_LUN, .emulated = ATA_SHT_EMULATED, .use_clustering = ATA_SHT_USE_CLUSTERING, .proc_name = DRV_NAME, .dma_boundary = ATA_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, + .slave_destroy = ata_scsi_slave_destroy, .bios_param = ata_std_bios_param, - .ordered_flush = 1, }; -static struct ata_port_operations uli_ops = { +static const struct ata_port_operations uli_ops = { .port_disable = ata_port_disable, .tf_load = ata_tf_load, @@ -94,16 +102,18 @@ static struct ata_port_operations uli_ops = { .exec_command = ata_exec_command, .dev_select = ata_std_dev_select, - .phy_reset = sata_phy_reset, - .bmdma_setup = ata_bmdma_setup, .bmdma_start = ata_bmdma_start, .bmdma_stop = ata_bmdma_stop, .bmdma_status = ata_bmdma_status, .qc_prep = ata_qc_prep, .qc_issue = ata_qc_issue_prot, + .data_xfer = ata_pio_data_xfer, - .eng_timeout = ata_eng_timeout, + .freeze = ata_bmdma_freeze, + .thaw = ata_bmdma_thaw, + .error_handler = ata_bmdma_error_handler, + .post_internal_cmd = ata_bmdma_post_internal_cmd, .irq_handler = ata_interrupt, .irq_clear = ata_bmdma_irq_clear, @@ -118,10 +128,9 @@ static struct ata_port_operations uli_ops = { static struct ata_port_info uli_port_info = { .sht = &uli_sht, - .host_flags = ATA_FLAG_SATA | ATA_FLAG_SATA_RESET | - ATA_FLAG_NO_LEGACY, - .pio_mask = 0x03, //support pio mode 4 (FIXME) - .udma_mask = 0x7f, //support udma mode 6 + .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY, + .pio_mask = 0x1f, /* pio0-4 */ + .udma_mask = 0x7f, /* udma0-6 */ .port_ops = &uli_ops, }; @@ -134,7 +143,8 @@ MODULE_VERSION(DRV_VERSION); static unsigned int get_scr_cfg_addr(struct ata_port *ap, unsigned int sc_reg) { - return ap->ioaddr.scr_addr + (4 * sc_reg); + struct uli_priv *hpriv = ap->host_set->private_data; + return hpriv->scr_cfg_addr[ap->port_no] + (4 * sc_reg); } static u32 uli_scr_cfg_read (struct ata_port *ap, unsigned int sc_reg) @@ -171,25 +181,18 @@ static void uli_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val) uli_scr_cfg_write(ap, sc_reg, val); } -/* move to PCI layer, integrate w/ MSI stuff */ -static void pci_enable_intx(struct pci_dev *pdev) -{ - u16 pci_command; - - pci_read_config_word(pdev, PCI_COMMAND, &pci_command); - if (pci_command & PCI_COMMAND_INTX_DISABLE) { - pci_command &= ~PCI_COMMAND_INTX_DISABLE; - pci_write_config_word(pdev, PCI_COMMAND, pci_command); - } -} - static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) { + static int printed_version; struct ata_probe_ent *probe_ent; struct ata_port_info *ppi; int rc; unsigned int board_idx = (unsigned int) ent->driver_data; int pci_dev_busy = 0; + struct uli_priv *hpriv; + + if (!printed_version++) + dev_printk(KERN_INFO, &pdev->dev, "version " DRV_VERSION "\n"); rc = pci_enable_device(pdev); if (rc) @@ -209,16 +212,24 @@ static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) goto err_out_regions; ppi = &uli_port_info; - probe_ent = ata_pci_init_native_mode(pdev, &ppi); + probe_ent = ata_pci_init_native_mode(pdev, &ppi, ATA_PORT_PRIMARY | ATA_PORT_SECONDARY); if (!probe_ent) { rc = -ENOMEM; goto err_out_regions; } - + + hpriv = kzalloc(sizeof(*hpriv), GFP_KERNEL); + if (!hpriv) { + rc = -ENOMEM; + goto err_out_probe_ent; + } + + probe_ent->private_data = hpriv; + switch (board_idx) { case uli_5287: - probe_ent->port[0].scr_addr = ULI5287_BASE; - probe_ent->port[1].scr_addr = ULI5287_BASE + ULI5287_OFFS; + hpriv->scr_cfg_addr[0] = ULI5287_BASE; + hpriv->scr_cfg_addr[1] = ULI5287_BASE + ULI5287_OFFS; probe_ent->n_ports = 4; probe_ent->port[2].cmd_addr = pci_resource_start(pdev, 0) + 8; @@ -226,27 +237,27 @@ static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) probe_ent->port[2].ctl_addr = (pci_resource_start(pdev, 1) | ATA_PCI_CTL_OFS) + 4; probe_ent->port[2].bmdma_addr = pci_resource_start(pdev, 4) + 16; - probe_ent->port[2].scr_addr = ULI5287_BASE + ULI5287_OFFS*4; + hpriv->scr_cfg_addr[2] = ULI5287_BASE + ULI5287_OFFS*4; probe_ent->port[3].cmd_addr = pci_resource_start(pdev, 2) + 8; probe_ent->port[3].altstatus_addr = probe_ent->port[3].ctl_addr = (pci_resource_start(pdev, 3) | ATA_PCI_CTL_OFS) + 4; probe_ent->port[3].bmdma_addr = pci_resource_start(pdev, 4) + 24; - probe_ent->port[3].scr_addr = ULI5287_BASE + ULI5287_OFFS*5; + hpriv->scr_cfg_addr[3] = ULI5287_BASE + ULI5287_OFFS*5; ata_std_ports(&probe_ent->port[2]); ata_std_ports(&probe_ent->port[3]); break; case uli_5289: - probe_ent->port[0].scr_addr = ULI5287_BASE; - probe_ent->port[1].scr_addr = ULI5287_BASE + ULI5287_OFFS; + hpriv->scr_cfg_addr[0] = ULI5287_BASE; + hpriv->scr_cfg_addr[1] = ULI5287_BASE + ULI5287_OFFS; break; case uli_5281: - probe_ent->port[0].scr_addr = ULI5281_BASE; - probe_ent->port[1].scr_addr = ULI5281_BASE + ULI5281_OFFS; + hpriv->scr_cfg_addr[0] = ULI5281_BASE; + hpriv->scr_cfg_addr[1] = ULI5281_BASE + ULI5281_OFFS; break; default: @@ -255,7 +266,7 @@ static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) } pci_set_master(pdev); - pci_enable_intx(pdev); + pci_intx(pdev, 1); /* FIXME: check ata_device_add return value */ ata_device_add(probe_ent); @@ -263,9 +274,10 @@ static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) return 0; +err_out_probe_ent: + kfree(probe_ent); err_out_regions: pci_release_regions(pdev); - err_out: if (!pci_dev_busy) pci_disable_device(pdev); diff --git a/drivers/scsi/sata_via.c b/drivers/scsi/sata_via.c index 9e7ae4e0d..a3727af8b 100644 --- a/drivers/scsi/sata_via.c +++ b/drivers/scsi/sata_via.c @@ -47,7 +47,7 @@ #include #define DRV_NAME "sata_via" -#define DRV_VERSION "1.1" +#define DRV_VERSION "2.0" enum board_ids_enum { vt6420, @@ -74,8 +74,10 @@ enum { static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent); static u32 svia_scr_read (struct ata_port *ap, unsigned int sc_reg); static void svia_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val); +static void vt6420_error_handler(struct ata_port *ap); static const struct pci_device_id svia_pci_tbl[] = { + { 0x1106, 0x0591, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6420 }, { 0x1106, 0x3149, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6420 }, { 0x1106, 0x3249, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6421 }, @@ -103,10 +105,11 @@ static struct scsi_host_template svia_sht = { .proc_name = DRV_NAME, .dma_boundary = ATA_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, + .slave_destroy = ata_scsi_slave_destroy, .bios_param = ata_std_bios_param, }; -static const struct ata_port_operations svia_sata_ops = { +static const struct ata_port_operations vt6420_sata_ops = { .port_disable = ata_port_disable, .tf_load = ata_tf_load, @@ -115,7 +118,36 @@ static const struct ata_port_operations svia_sata_ops = { .exec_command = ata_exec_command, .dev_select = ata_std_dev_select, - .phy_reset = sata_phy_reset, + .bmdma_setup = ata_bmdma_setup, + .bmdma_start = ata_bmdma_start, + .bmdma_stop = ata_bmdma_stop, + .bmdma_status = ata_bmdma_status, + + .qc_prep = ata_qc_prep, + .qc_issue = ata_qc_issue_prot, + .data_xfer = ata_pio_data_xfer, + + .freeze = ata_bmdma_freeze, + .thaw = ata_bmdma_thaw, + .error_handler = vt6420_error_handler, + .post_internal_cmd = ata_bmdma_post_internal_cmd, + + .irq_handler = ata_interrupt, + .irq_clear = ata_bmdma_irq_clear, + + .port_start = ata_port_start, + .port_stop = ata_port_stop, + .host_stop = ata_host_stop, +}; + +static const struct ata_port_operations vt6421_sata_ops = { + .port_disable = ata_port_disable, + + .tf_load = ata_tf_load, + .tf_read = ata_tf_read, + .check_status = ata_check_status, + .exec_command = ata_exec_command, + .dev_select = ata_std_dev_select, .bmdma_setup = ata_bmdma_setup, .bmdma_start = ata_bmdma_start, @@ -124,8 +156,12 @@ static const struct ata_port_operations svia_sata_ops = { .qc_prep = ata_qc_prep, .qc_issue = ata_qc_issue_prot, + .data_xfer = ata_pio_data_xfer, - .eng_timeout = ata_eng_timeout, + .freeze = ata_bmdma_freeze, + .thaw = ata_bmdma_thaw, + .error_handler = ata_bmdma_error_handler, + .post_internal_cmd = ata_bmdma_post_internal_cmd, .irq_handler = ata_interrupt, .irq_clear = ata_bmdma_irq_clear, @@ -138,13 +174,13 @@ static const struct ata_port_operations svia_sata_ops = { .host_stop = ata_host_stop, }; -static struct ata_port_info svia_port_info = { +static struct ata_port_info vt6420_port_info = { .sht = &svia_sht, - .host_flags = ATA_FLAG_SATA | ATA_FLAG_SRST | ATA_FLAG_NO_LEGACY, + .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY, .pio_mask = 0x1f, .mwdma_mask = 0x07, .udma_mask = 0x7f, - .port_ops = &svia_sata_ops, + .port_ops = &vt6420_sata_ops, }; MODULE_AUTHOR("Jeff Garzik"); @@ -167,6 +203,81 @@ static void svia_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val) outl(val, ap->ioaddr.scr_addr + (4 * sc_reg)); } +/** + * vt6420_prereset - prereset for vt6420 + * @ap: target ATA port + * + * SCR registers on vt6420 are pieces of shit and may hang the + * whole machine completely if accessed with the wrong timing. + * To avoid such catastrophe, vt6420 doesn't provide generic SCR + * access operations, but uses SStatus and SControl only during + * boot probing in controlled way. + * + * As the old (pre EH update) probing code is proven to work, we + * strictly follow the access pattern. + * + * LOCKING: + * Kernel thread context (may sleep) + * + * RETURNS: + * 0 on success, -errno otherwise. + */ +static int vt6420_prereset(struct ata_port *ap) +{ + struct ata_eh_context *ehc = &ap->eh_context; + unsigned long timeout = jiffies + (HZ * 5); + u32 sstatus, scontrol; + int online; + + /* don't do any SCR stuff if we're not loading */ + if (!ATA_PFLAG_LOADING) + goto skip_scr; + + /* Resume phy. This is the old resume sequence from + * __sata_phy_reset(). + */ + svia_scr_write(ap, SCR_CONTROL, 0x300); + svia_scr_read(ap, SCR_CONTROL); /* flush */ + + /* wait for phy to become ready, if necessary */ + do { + msleep(200); + if ((svia_scr_read(ap, SCR_STATUS) & 0xf) != 1) + break; + } while (time_before(jiffies, timeout)); + + /* open code sata_print_link_status() */ + sstatus = svia_scr_read(ap, SCR_STATUS); + scontrol = svia_scr_read(ap, SCR_CONTROL); + + online = (sstatus & 0xf) == 0x3; + + ata_port_printk(ap, KERN_INFO, + "SATA link %s 1.5 Gbps (SStatus %X SControl %X)\n", + online ? "up" : "down", sstatus, scontrol); + + /* SStatus is read one more time */ + svia_scr_read(ap, SCR_STATUS); + + if (!online) { + /* tell EH to bail */ + ehc->i.action &= ~ATA_EH_RESET_MASK; + return 0; + } + + skip_scr: + /* wait for !BSY */ + ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT); + + return 0; +} + +static void vt6420_error_handler(struct ata_port *ap) +{ + return ata_bmdma_drive_eh(ap, vt6420_prereset, ata_std_softreset, + NULL, ata_std_postreset); +} + static const unsigned int svia_bar_sizes[] = { 8, 4, 8, 4, 16, 256 }; @@ -207,7 +318,7 @@ static void vt6421_init_addrs(struct ata_probe_ent *probe_ent, static struct ata_probe_ent *vt6420_init_probe_ent(struct pci_dev *pdev) { struct ata_probe_ent *probe_ent; - struct ata_port_info *ppi = &svia_port_info; + struct ata_port_info *ppi = &vt6420_port_info; probe_ent = ata_pci_init_native_mode(pdev, &ppi, ATA_PORT_PRIMARY | ATA_PORT_SECONDARY); if (!probe_ent) @@ -235,12 +346,11 @@ static struct ata_probe_ent *vt6421_init_probe_ent(struct pci_dev *pdev) INIT_LIST_HEAD(&probe_ent->node); probe_ent->sht = &svia_sht; - probe_ent->host_flags = ATA_FLAG_SATA | ATA_FLAG_SATA_RESET | - ATA_FLAG_NO_LEGACY; - probe_ent->port_ops = &svia_sata_ops; + probe_ent->host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY; + probe_ent->port_ops = &vt6421_sata_ops; probe_ent->n_ports = N_PORTS; probe_ent->irq = pdev->irq; - probe_ent->irq_flags = SA_SHIRQ; + probe_ent->irq_flags = IRQF_SHARED; probe_ent->pio_mask = 0x1f; probe_ent->mwdma_mask = 0x07; probe_ent->udma_mask = 0x7f; @@ -333,10 +443,10 @@ static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) if ((pci_resource_start(pdev, i) == 0) || (pci_resource_len(pdev, i) < bar_sizes[i])) { dev_printk(KERN_ERR, &pdev->dev, - "invalid PCI BAR %u (sz 0x%lx, val 0x%lx)\n", - i, - pci_resource_start(pdev, i), - pci_resource_len(pdev, i)); + "invalid PCI BAR %u (sz 0x%llx, val 0x%llx)\n", + i, + (unsigned long long)pci_resource_start(pdev, i), + (unsigned long long)pci_resource_len(pdev, i)); rc = -ENODEV; goto err_out_regions; } diff --git a/drivers/scsi/sata_vsc.c b/drivers/scsi/sata_vsc.c index 8a29ce340..ad3787159 100644 --- a/drivers/scsi/sata_vsc.c +++ b/drivers/scsi/sata_vsc.c @@ -47,7 +47,7 @@ #include #define DRV_NAME "sata_vsc" -#define DRV_VERSION "1.2" +#define DRV_VERSION "2.0" enum { /* Interrupt register offsets (from chip base address) */ @@ -221,14 +221,21 @@ static irqreturn_t vsc_sata_interrupt (int irq, void *dev_instance, ap = host_set->ports[i]; - if (ap && !(ap->flags & - (ATA_FLAG_PORT_DISABLED|ATA_FLAG_NOINTR))) { + if (is_vsc_sata_int_err(i, int_status)) { + u32 err_status; + printk(KERN_DEBUG "%s: ignoring interrupt(s)\n", __FUNCTION__); + err_status = ap ? vsc_sata_scr_read(ap, SCR_ERROR) : 0; + vsc_sata_scr_write(ap, SCR_ERROR, err_status); + handled++; + } + + if (ap && !(ap->flags & ATA_FLAG_DISABLED)) { struct ata_queued_cmd *qc; qc = ata_qc_from_tag(ap, ap->active_tag); - if (qc && (!(qc->tf.ctl & ATA_NIEN))) { + if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) handled += ata_host_intr(ap, qc); - } else if (is_vsc_sata_int_err(i, int_status)) { + else if (is_vsc_sata_int_err(i, int_status)) { /* * On some chips (i.e. Intel 31244), an error * interrupt will sneak in at initialization @@ -272,6 +279,7 @@ static struct scsi_host_template vsc_sata_sht = { .proc_name = DRV_NAME, .dma_boundary = ATA_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, + .slave_destroy = ata_scsi_slave_destroy, .bios_param = ata_std_bios_param, }; @@ -283,14 +291,17 @@ static const struct ata_port_operations vsc_sata_ops = { .exec_command = ata_exec_command, .check_status = ata_check_status, .dev_select = ata_std_dev_select, - .phy_reset = sata_phy_reset, .bmdma_setup = ata_bmdma_setup, .bmdma_start = ata_bmdma_start, .bmdma_stop = ata_bmdma_stop, .bmdma_status = ata_bmdma_status, .qc_prep = ata_qc_prep, .qc_issue = ata_qc_issue_prot, - .eng_timeout = ata_eng_timeout, + .data_xfer = ata_mmio_data_xfer, + .freeze = ata_bmdma_freeze, + .thaw = ata_bmdma_thaw, + .error_handler = ata_bmdma_error_handler, + .post_internal_cmd = ata_bmdma_post_internal_cmd, .irq_handler = vsc_sata_interrupt, .irq_clear = ata_bmdma_irq_clear, .scr_read = vsc_sata_scr_read, @@ -385,11 +396,11 @@ static int __devinit vsc_sata_init_one (struct pci_dev *pdev, const struct pci_d probe_ent->sht = &vsc_sata_sht; probe_ent->host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | - ATA_FLAG_MMIO | ATA_FLAG_SATA_RESET; + ATA_FLAG_MMIO; probe_ent->port_ops = &vsc_sata_ops; probe_ent->n_ports = 4; probe_ent->irq = pdev->irq; - probe_ent->irq_flags = SA_SHIRQ; + probe_ent->irq_flags = IRQF_SHARED; probe_ent->mmio_base = mmio_base; /* We don't care much about the PIO/UDMA masks, but the core won't like us @@ -432,15 +443,12 @@ err_out: } -/* - * 0x1725/0x7174 is the Vitesse VSC-7174 - * 0x8086/0x3200 is the Intel 31244, which is supposed to be identical - * compatibility is untested as of yet - */ static const struct pci_device_id vsc_sata_pci_tbl[] = { - { 0x1725, 0x7174, PCI_ANY_ID, PCI_ANY_ID, 0x10600, 0xFFFFFF, 0 }, - { 0x8086, 0x3200, PCI_ANY_ID, PCI_ANY_ID, 0x10600, 0xFFFFFF, 0 }, - { } + { PCI_VENDOR_ID_VITESSE, 0x7174, + PCI_ANY_ID, PCI_ANY_ID, 0x10600, 0xFFFFFF, 0 }, + { PCI_VENDOR_ID_INTEL, 0x3200, + PCI_ANY_ID, PCI_ANY_ID, 0x10600, 0xFFFFFF, 0 }, + { } /* terminate list */ }; diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index 73994e2ac..b332caddd 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c @@ -63,7 +63,6 @@ #include #include #include -#include #include "scsi_priv.h" #include "scsi_logging.h" @@ -116,79 +115,6 @@ const char *const scsi_device_types[MAX_SCSI_DEVICE_CODE] = { }; EXPORT_SYMBOL(scsi_device_types); -/* - * Function: scsi_allocate_request - * - * Purpose: Allocate a request descriptor. - * - * Arguments: device - device for which we want a request - * gfp_mask - allocation flags passed to kmalloc - * - * Lock status: No locks assumed to be held. This function is SMP-safe. - * - * Returns: Pointer to request block. - */ -struct scsi_request *scsi_allocate_request(struct scsi_device *sdev, - gfp_t gfp_mask) -{ - const int offset = ALIGN(sizeof(struct scsi_request), 4); - const int size = offset + sizeof(struct request); - struct scsi_request *sreq; - - sreq = kzalloc(size, gfp_mask); - if (likely(sreq != NULL)) { - sreq->sr_request = (struct request *)(((char *)sreq) + offset); - sreq->sr_device = sdev; - sreq->sr_host = sdev->host; - sreq->sr_magic = SCSI_REQ_MAGIC; - sreq->sr_data_direction = DMA_BIDIRECTIONAL; - } - - return sreq; -} -EXPORT_SYMBOL(scsi_allocate_request); - -void __scsi_release_request(struct scsi_request *sreq) -{ - struct request *req = sreq->sr_request; - - /* unlikely because the tag was usually ended earlier by the - * mid-layer. However, for layering reasons ULD's don't end - * the tag of commands they generate. */ - if (unlikely(blk_rq_tagged(req))) { - unsigned long flags; - struct request_queue *q = req->q; - - spin_lock_irqsave(q->queue_lock, flags); - blk_queue_end_tag(q, req); - spin_unlock_irqrestore(q->queue_lock, flags); - } - - - if (likely(sreq->sr_command != NULL)) { - struct scsi_cmnd *cmd = sreq->sr_command; - - sreq->sr_command = NULL; - scsi_next_command(cmd); - } -} - -/* - * Function: scsi_release_request - * - * Purpose: Release a request descriptor. - * - * Arguments: sreq - request to release - * - * Lock status: No locks assumed to be held. This function is SMP-safe. - */ -void scsi_release_request(struct scsi_request *sreq) -{ - __scsi_release_request(sreq); - kfree(sreq); -} -EXPORT_SYMBOL(scsi_release_request); - struct scsi_host_cmd_pool { kmem_cache_t *slab; unsigned int users; @@ -420,7 +346,7 @@ void scsi_log_send(struct scsi_cmnd *cmd) if (level > 3) { printk(KERN_INFO "buffer = 0x%p, bufflen = %d," " done = 0x%p, queuecommand 0x%p\n", - cmd->buffer, cmd->bufflen, + cmd->request_buffer, cmd->request_bufflen, cmd->done, sdev->host->hostt->queuecommand); @@ -646,79 +572,30 @@ int scsi_dispatch_cmd(struct scsi_cmnd *cmd) return rtn; } -/* - * Function: scsi_init_cmd_from_req - * - * Purpose: Queue a SCSI command - * Purpose: Initialize a struct scsi_cmnd from a struct scsi_request - * - * Arguments: cmd - command descriptor. - * sreq - Request from the queue. - * - * Lock status: None needed. - * - * Returns: Nothing. - * - * Notes: Mainly transfer data from the request structure to the - * command structure. The request structure is allocated - * using the normal memory allocator, and requests can pile - * up to more or less any depth. The command structure represents - * a consumable resource, as these are allocated into a pool - * when the SCSI subsystem initializes. The preallocation is - * required so that in low-memory situations a disk I/O request - * won't cause the memory manager to try and write out a page. - * The request structure is generally used by ioctls and character - * devices. - */ -void scsi_init_cmd_from_req(struct scsi_cmnd *cmd, struct scsi_request *sreq) -{ - sreq->sr_command = cmd; - - cmd->cmd_len = sreq->sr_cmd_len; - cmd->use_sg = sreq->sr_use_sg; - - cmd->request = sreq->sr_request; - memcpy(cmd->data_cmnd, sreq->sr_cmnd, sizeof(cmd->data_cmnd)); - cmd->serial_number = 0; - cmd->bufflen = sreq->sr_bufflen; - cmd->buffer = sreq->sr_buffer; - cmd->retries = 0; - cmd->allowed = sreq->sr_allowed; - cmd->done = sreq->sr_done; - cmd->timeout_per_command = sreq->sr_timeout_per_command; - cmd->sc_data_direction = sreq->sr_data_direction; - cmd->sglist_len = sreq->sr_sglist_len; - cmd->underflow = sreq->sr_underflow; - cmd->sc_request = sreq; - memcpy(cmd->cmnd, sreq->sr_cmnd, sizeof(sreq->sr_cmnd)); - - /* - * Zero the sense buffer. Some host adapters automatically request - * sense on error. 0 is not a valid sense code. - */ - memset(cmd->sense_buffer, 0, sizeof(sreq->sr_sense_buffer)); - cmd->request_buffer = sreq->sr_buffer; - cmd->request_bufflen = sreq->sr_bufflen; - cmd->old_use_sg = cmd->use_sg; - if (cmd->cmd_len == 0) - cmd->cmd_len = COMMAND_SIZE(cmd->cmnd[0]); - cmd->old_cmd_len = cmd->cmd_len; - cmd->sc_old_data_direction = cmd->sc_data_direction; - cmd->old_underflow = cmd->underflow; - - /* - * Start the timer ticking. - */ - cmd->result = 0; - - SCSI_LOG_MLQUEUE(3, printk("Leaving scsi_init_cmd_from_req()\n")); -} /* * Per-CPU I/O completion queue. */ static DEFINE_PER_CPU(struct list_head, scsi_done_q); +/** + * scsi_req_abort_cmd -- Request command recovery for the specified command + * cmd: pointer to the SCSI command of interest + * + * This function requests that SCSI Core start recovery for the + * command by deleting the timer and adding the command to the eh + * queue. It can be called by either LLDDs or SCSI Core. LLDDs who + * implement their own error recovery MAY ignore the timeout event if + * they generated scsi_req_abort_cmd. + */ +void scsi_req_abort_cmd(struct scsi_cmnd *cmd) +{ + if (!scsi_delete_timer(cmd)) + return; + scsi_times_out(cmd); +} +EXPORT_SYMBOL(scsi_req_abort_cmd); + /** * scsi_done - Enqueue the finished SCSI command into the done queue. * @cmd: The SCSI Command for which a low-level device driver (LLDD) gives @@ -784,11 +661,6 @@ void __scsi_done(struct scsi_cmnd *cmd) */ int scsi_retry_command(struct scsi_cmnd *cmd) { - /* - * Restore the SCSI command state. - */ - scsi_setup_cmd_retry(cmd); - /* * Zero the sense information from the last time we tried * this command. @@ -809,7 +681,6 @@ void scsi_finish_command(struct scsi_cmnd *cmd) { struct scsi_device *sdev = cmd->device; struct Scsi_Host *shost = sdev->host; - struct scsi_request *sreq; scsi_device_unbusy(sdev); @@ -835,25 +706,6 @@ void scsi_finish_command(struct scsi_cmnd *cmd) "Notifying upper driver of completion " "(result %x)\n", cmd->result)); - /* - * We can get here with use_sg=0, causing a panic in the upper level - */ - cmd->use_sg = cmd->old_use_sg; - - /* - * If there is an associated request structure, copy the data over - * before we call the completion function. - */ - sreq = cmd->sc_request; - if (sreq) { - sreq->sr_result = sreq->sr_command->result; - if (sreq->sr_result) { - memcpy(sreq->sr_sense_buffer, - sreq->sr_command->sense_buffer, - sizeof(sreq->sr_sense_buffer)); - } - } - cmd->done(cmd); } EXPORT_SYMBOL(scsi_finish_command); diff --git a/drivers/scsi/scsi.h b/drivers/scsi/scsi.h index 5ee5d80a9..d5a55fae6 100644 --- a/drivers/scsi/scsi.h +++ b/drivers/scsi/scsi.h @@ -20,12 +20,9 @@ #ifndef _SCSI_H #define _SCSI_H -#include /* for CONFIG_SCSI_LOGGING */ - #include #include #include -#include #include #include diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c index 5a5d2af8e..a80303c6b 100644 --- a/drivers/scsi/scsi_debug.c +++ b/drivers/scsi/scsi_debug.c @@ -24,7 +24,6 @@ * module options to "modprobe scsi_debug num_tgts=2" [20021221] */ -#include #include #include @@ -51,18 +50,22 @@ #include "scsi_logging.h" #include "scsi_debug.h" -#define SCSI_DEBUG_VERSION "1.75" -static const char * scsi_debug_version_date = "20050113"; +#define SCSI_DEBUG_VERSION "1.79" +static const char * scsi_debug_version_date = "20060604"; /* Additional Sense Code (ASC) used */ -#define NO_ADDED_SENSE 0x0 +#define NO_ADDITIONAL_SENSE 0x0 +#define LOGICAL_UNIT_NOT_READY 0x4 #define UNRECOVERED_READ_ERR 0x11 +#define PARAMETER_LIST_LENGTH_ERR 0x1a #define INVALID_OPCODE 0x20 #define ADDR_OUT_OF_RANGE 0x21 #define INVALID_FIELD_IN_CDB 0x24 +#define INVALID_FIELD_IN_PARAM_LIST 0x26 #define POWERON_RESET 0x29 #define SAVING_PARAMS_UNSUP 0x39 -#define THRESHHOLD_EXCEEDED 0x5d +#define THRESHOLD_EXCEEDED 0x5d +#define LOW_POWER_COND_ON 0x5e #define SDEBUG_TAGGED_QUEUING 0 /* 0 | MSG_SIMPLE_TAG | MSG_ORDERED_TAG */ @@ -81,6 +84,8 @@ static const char * scsi_debug_version_date = "20050113"; #define DEF_SCSI_LEVEL 5 /* INQUIRY, byte2 [5->SPC-3] */ #define DEF_PTYPE 0 #define DEF_D_SENSE 0 +#define DEF_NO_LUN_0 0 +#define DEF_VIRTUAL_GB 0 /* bit mask values for scsi_debug_opts */ #define SCSI_DEBUG_OPT_NOISE 1 @@ -107,6 +112,7 @@ static const char * scsi_debug_version_date = "20050113"; /* If REPORT LUNS has luns >= 256 it can choose "flat space" (value 1) * or "peripheral device" addressing (value 0) */ #define SAM2_LUN_ADDRESS_METHOD 0 +#define SAM2_WLUN_REPORT_LUNS 0xc101 static int scsi_debug_add_host = DEF_NUM_HOST; static int scsi_debug_delay = DEF_DELAY; @@ -119,13 +125,16 @@ static int scsi_debug_opts = DEF_OPTS; static int scsi_debug_scsi_level = DEF_SCSI_LEVEL; static int scsi_debug_ptype = DEF_PTYPE; /* SCSI peripheral type (0==disk) */ static int scsi_debug_dsense = DEF_D_SENSE; +static int scsi_debug_no_lun_0 = DEF_NO_LUN_0; +static int scsi_debug_virtual_gb = DEF_VIRTUAL_GB; static int scsi_debug_cmnd_count = 0; #define DEV_READONLY(TGT) (0) #define DEV_REMOVEABLE(TGT) (0) -static unsigned long sdebug_store_size; /* in bytes */ +static unsigned int sdebug_store_size; /* in bytes */ +static unsigned int sdebug_store_sectors; static sector_t sdebug_capacity; /* in sectors */ /* old BIOS stuff, kernel may get rid of them but some mode sense pages @@ -150,7 +159,9 @@ struct sdebug_dev_info { unsigned int target; unsigned int lun; struct sdebug_host_info *sdbg_host; + unsigned int wlun; char reset; + char stopped; char used; }; @@ -194,11 +205,11 @@ static struct scsi_host_template sdebug_driver_template = { .bios_param = scsi_debug_biosparam, .can_queue = SCSI_DEBUG_CANQUEUE, .this_id = 7, - .sg_tablesize = 64, - .cmd_per_lun = 3, - .max_sectors = 4096, + .sg_tablesize = 256, + .cmd_per_lun = 16, + .max_sectors = 0xffff, .unchecked_isa_dma = 0, - .use_clustering = DISABLE_CLUSTERING, + .use_clustering = ENABLE_CLUSTERING, .module = THIS_MODULE, }; @@ -226,19 +237,32 @@ static struct device_driver sdebug_driverfs_driver = { static const int check_condition_result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION; +static unsigned char ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0, + 0, 0, 0x2, 0x4b}; +static unsigned char iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0, + 0, 0, 0x0, 0x0}; + /* function declarations */ static int resp_inquiry(struct scsi_cmnd * SCpnt, int target, struct sdebug_dev_info * devip); static int resp_requests(struct scsi_cmnd * SCpnt, struct sdebug_dev_info * devip); +static int resp_start_stop(struct scsi_cmnd * scp, + struct sdebug_dev_info * devip); static int resp_readcap(struct scsi_cmnd * SCpnt, struct sdebug_dev_info * devip); -static int resp_mode_sense(struct scsi_cmnd * SCpnt, int target, +static int resp_readcap16(struct scsi_cmnd * SCpnt, + struct sdebug_dev_info * devip); +static int resp_mode_sense(struct scsi_cmnd * scp, int target, struct sdebug_dev_info * devip); -static int resp_read(struct scsi_cmnd * SCpnt, int upper_blk, int block, - int num, struct sdebug_dev_info * devip); -static int resp_write(struct scsi_cmnd * SCpnt, int upper_blk, int block, - int num, struct sdebug_dev_info * devip); +static int resp_mode_select(struct scsi_cmnd * scp, int mselect6, + struct sdebug_dev_info * devip); +static int resp_log_sense(struct scsi_cmnd * scp, + struct sdebug_dev_info * devip); +static int resp_read(struct scsi_cmnd * SCpnt, unsigned long long lba, + unsigned int num, struct sdebug_dev_info * devip); +static int resp_write(struct scsi_cmnd * SCpnt, unsigned long long lba, + unsigned int num, struct sdebug_dev_info * devip); static int resp_report_luns(struct scsi_cmnd * SCpnt, struct sdebug_dev_info * devip); static int fill_from_dev_buffer(struct scsi_cmnd * scp, unsigned char * arr, @@ -249,8 +273,8 @@ static void timer_intr_handler(unsigned long); static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev); static void mk_sense_buffer(struct sdebug_dev_info * devip, int key, int asc, int asq); -static int check_reset(struct scsi_cmnd * SCpnt, - struct sdebug_dev_info * devip); +static int check_readiness(struct scsi_cmnd * SCpnt, int reset_only, + struct sdebug_dev_info * devip); static int schedule_resp(struct scsi_cmnd * cmnd, struct sdebug_dev_info * devip, done_funct_t done, int scsi_result, int delta_jiff); @@ -258,9 +282,11 @@ static void __init sdebug_build_parts(unsigned char * ramp); static void __init init_all_queued(void); static void stop_all_queued(void); static int stop_queued_cmnd(struct scsi_cmnd * cmnd); -static int inquiry_evpd_83(unsigned char * arr, int dev_id_num, - const char * dev_id_str, int dev_id_str_len); -static void do_create_driverfs_files(void); +static int inquiry_evpd_83(unsigned char * arr, int target_dev_id, + int dev_id_num, const char * dev_id_str, + int dev_id_str_len); +static int inquiry_evpd_88(unsigned char * arr, int target_dev_id); +static int do_create_driverfs_files(void); static void do_remove_driverfs_files(void); static int sdebug_add_adapter(void); @@ -275,18 +301,22 @@ static int scsi_debug_queuecommand(struct scsi_cmnd * SCpnt, done_funct_t done) { unsigned char *cmd = (unsigned char *) SCpnt->cmnd; - int block, upper_blk, num, k; + int len, k, j; + unsigned int num; + unsigned long long lba; int errsts = 0; - int target = scmd_id(SCpnt); + int target = SCpnt->device->id; struct sdebug_dev_info * devip = NULL; int inj_recovered = 0; + int delay_override = 0; if (done == NULL) return 0; /* assume mid level reprocessing command */ + SCpnt->resid = 0; if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmd) { printk(KERN_INFO "scsi_debug: cmd "); - for (k = 0, num = SCpnt->cmd_len; k < num; ++k) + for (k = 0, len = SCpnt->cmd_len; k < len; ++k) printk("%02x ", (int)cmd[k]); printk("\n"); } @@ -297,7 +327,8 @@ int scsi_debug_queuecommand(struct scsi_cmnd * SCpnt, done_funct_t done) DID_NO_CONNECT << 16, 0); } - if (SCpnt->device->lun >= scsi_debug_max_luns) + if ((SCpnt->device->lun >= scsi_debug_max_luns) && + (SCpnt->device->lun != SAM2_WLUN_REPORT_LUNS)) return schedule_resp(SCpnt, NULL, done, DID_NO_CONNECT << 16, 0); devip = devInfoReg(SCpnt->device); @@ -316,118 +347,150 @@ int scsi_debug_queuecommand(struct scsi_cmnd * SCpnt, done_funct_t done) inj_recovered = 1; /* to reads and writes below */ } + if (devip->wlun) { + switch (*cmd) { + case INQUIRY: + case REQUEST_SENSE: + case TEST_UNIT_READY: + case REPORT_LUNS: + break; /* only allowable wlun commands */ + default: + if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) + printk(KERN_INFO "scsi_debug: Opcode: 0x%x " + "not supported for wlun\n", *cmd); + mk_sense_buffer(devip, ILLEGAL_REQUEST, + INVALID_OPCODE, 0); + errsts = check_condition_result; + return schedule_resp(SCpnt, devip, done, errsts, + 0); + } + } + switch (*cmd) { case INQUIRY: /* mandatory, ignore unit attention */ + delay_override = 1; errsts = resp_inquiry(SCpnt, target, devip); break; case REQUEST_SENSE: /* mandatory, ignore unit attention */ + delay_override = 1; errsts = resp_requests(SCpnt, devip); break; case REZERO_UNIT: /* actually this is REWIND for SSC */ case START_STOP: - errsts = check_reset(SCpnt, devip); + errsts = resp_start_stop(SCpnt, devip); break; case ALLOW_MEDIUM_REMOVAL: - if ((errsts = check_reset(SCpnt, devip))) + if ((errsts = check_readiness(SCpnt, 1, devip))) break; if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) printk(KERN_INFO "scsi_debug: Medium removal %s\n", cmd[4] ? "inhibited" : "enabled"); break; case SEND_DIAGNOSTIC: /* mandatory */ - errsts = check_reset(SCpnt, devip); + errsts = check_readiness(SCpnt, 1, devip); break; case TEST_UNIT_READY: /* mandatory */ - errsts = check_reset(SCpnt, devip); + delay_override = 1; + errsts = check_readiness(SCpnt, 0, devip); break; case RESERVE: - errsts = check_reset(SCpnt, devip); + errsts = check_readiness(SCpnt, 1, devip); break; case RESERVE_10: - errsts = check_reset(SCpnt, devip); + errsts = check_readiness(SCpnt, 1, devip); break; case RELEASE: - errsts = check_reset(SCpnt, devip); + errsts = check_readiness(SCpnt, 1, devip); break; case RELEASE_10: - errsts = check_reset(SCpnt, devip); + errsts = check_readiness(SCpnt, 1, devip); break; case READ_CAPACITY: errsts = resp_readcap(SCpnt, devip); break; + case SERVICE_ACTION_IN: + if (SAI_READ_CAPACITY_16 != cmd[1]) { + mk_sense_buffer(devip, ILLEGAL_REQUEST, + INVALID_OPCODE, 0); + errsts = check_condition_result; + break; + } + errsts = resp_readcap16(SCpnt, devip); + break; case READ_16: case READ_12: case READ_10: case READ_6: - if ((errsts = check_reset(SCpnt, devip))) + if ((errsts = check_readiness(SCpnt, 0, devip))) break; - upper_blk = 0; if ((*cmd) == READ_16) { - upper_blk = cmd[5] + (cmd[4] << 8) + - (cmd[3] << 16) + (cmd[2] << 24); - block = cmd[9] + (cmd[8] << 8) + - (cmd[7] << 16) + (cmd[6] << 24); + for (lba = 0, j = 0; j < 8; ++j) { + if (j > 0) + lba <<= 8; + lba += cmd[2 + j]; + } num = cmd[13] + (cmd[12] << 8) + (cmd[11] << 16) + (cmd[10] << 24); } else if ((*cmd) == READ_12) { - block = cmd[5] + (cmd[4] << 8) + + lba = cmd[5] + (cmd[4] << 8) + (cmd[3] << 16) + (cmd[2] << 24); num = cmd[9] + (cmd[8] << 8) + (cmd[7] << 16) + (cmd[6] << 24); } else if ((*cmd) == READ_10) { - block = cmd[5] + (cmd[4] << 8) + + lba = cmd[5] + (cmd[4] << 8) + (cmd[3] << 16) + (cmd[2] << 24); num = cmd[8] + (cmd[7] << 8); - } else { - block = cmd[3] + (cmd[2] << 8) + + } else { /* READ (6) */ + lba = cmd[3] + (cmd[2] << 8) + ((cmd[1] & 0x1f) << 16); - num = cmd[4]; + num = (0 == cmd[4]) ? 256 : cmd[4]; } - errsts = resp_read(SCpnt, upper_blk, block, num, devip); + errsts = resp_read(SCpnt, lba, num, devip); if (inj_recovered && (0 == errsts)) { mk_sense_buffer(devip, RECOVERED_ERROR, - THRESHHOLD_EXCEEDED, 0); + THRESHOLD_EXCEEDED, 0); errsts = check_condition_result; } break; case REPORT_LUNS: /* mandatory, ignore unit attention */ + delay_override = 1; errsts = resp_report_luns(SCpnt, devip); break; case VERIFY: /* 10 byte SBC-2 command */ - errsts = check_reset(SCpnt, devip); + errsts = check_readiness(SCpnt, 0, devip); break; case WRITE_16: case WRITE_12: case WRITE_10: case WRITE_6: - if ((errsts = check_reset(SCpnt, devip))) + if ((errsts = check_readiness(SCpnt, 0, devip))) break; - upper_blk = 0; if ((*cmd) == WRITE_16) { - upper_blk = cmd[5] + (cmd[4] << 8) + - (cmd[3] << 16) + (cmd[2] << 24); - block = cmd[9] + (cmd[8] << 8) + - (cmd[7] << 16) + (cmd[6] << 24); + for (lba = 0, j = 0; j < 8; ++j) { + if (j > 0) + lba <<= 8; + lba += cmd[2 + j]; + } num = cmd[13] + (cmd[12] << 8) + (cmd[11] << 16) + (cmd[10] << 24); } else if ((*cmd) == WRITE_12) { - block = cmd[5] + (cmd[4] << 8) + + lba = cmd[5] + (cmd[4] << 8) + (cmd[3] << 16) + (cmd[2] << 24); num = cmd[9] + (cmd[8] << 8) + (cmd[7] << 16) + (cmd[6] << 24); } else if ((*cmd) == WRITE_10) { - block = cmd[5] + (cmd[4] << 8) + + lba = cmd[5] + (cmd[4] << 8) + (cmd[3] << 16) + (cmd[2] << 24); num = cmd[8] + (cmd[7] << 8); - } else { - block = cmd[3] + (cmd[2] << 8) + + } else { /* WRITE (6) */ + lba = cmd[3] + (cmd[2] << 8) + ((cmd[1] & 0x1f) << 16); - num = cmd[4]; + num = (0 == cmd[4]) ? 256 : cmd[4]; } - errsts = resp_write(SCpnt, upper_blk, block, num, devip); + errsts = resp_write(SCpnt, lba, num, devip); if (inj_recovered && (0 == errsts)) { mk_sense_buffer(devip, RECOVERED_ERROR, - THRESHHOLD_EXCEEDED, 0); + THRESHOLD_EXCEEDED, 0); errsts = check_condition_result; } break; @@ -435,20 +498,31 @@ int scsi_debug_queuecommand(struct scsi_cmnd * SCpnt, done_funct_t done) case MODE_SENSE_10: errsts = resp_mode_sense(SCpnt, target, devip); break; + case MODE_SELECT: + errsts = resp_mode_select(SCpnt, 1, devip); + break; + case MODE_SELECT_10: + errsts = resp_mode_select(SCpnt, 0, devip); + break; + case LOG_SENSE: + errsts = resp_log_sense(SCpnt, devip); + break; case SYNCHRONIZE_CACHE: - errsts = check_reset(SCpnt, devip); + delay_override = 1; + errsts = check_readiness(SCpnt, 0, devip); break; default: if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) printk(KERN_INFO "scsi_debug: Opcode: 0x%x not " "supported\n", *cmd); - if ((errsts = check_reset(SCpnt, devip))) + if ((errsts = check_readiness(SCpnt, 1, devip))) break; /* Unit attention takes precedence */ mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_OPCODE, 0); errsts = check_condition_result; break; } - return schedule_resp(SCpnt, devip, done, errsts, scsi_debug_delay); + return schedule_resp(SCpnt, devip, done, errsts, + (delay_override ? 0 : scsi_debug_delay)); } static int scsi_debug_ioctl(struct scsi_device *dev, int cmd, void __user *arg) @@ -460,7 +534,8 @@ static int scsi_debug_ioctl(struct scsi_device *dev, int cmd, void __user *arg) /* return -ENOTTY; // correct return but upsets fdisk */ } -static int check_reset(struct scsi_cmnd * SCpnt, struct sdebug_dev_info * devip) +static int check_readiness(struct scsi_cmnd * SCpnt, int reset_only, + struct sdebug_dev_info * devip) { if (devip->reset) { if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) @@ -470,6 +545,14 @@ static int check_reset(struct scsi_cmnd * SCpnt, struct sdebug_dev_info * devip) mk_sense_buffer(devip, UNIT_ATTENTION, POWERON_RESET, 0); return check_condition_result; } + if ((0 == reset_only) && devip->stopped) { + if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) + printk(KERN_INFO "scsi_debug: Reporting Not " + "ready: initializing command required\n"); + mk_sense_buffer(devip, NOT_READY, LOGICAL_UNIT_NOT_READY, + 0x2); + return check_condition_result; + } return 0; } @@ -493,7 +576,10 @@ static int fill_from_dev_buffer(struct scsi_cmnd * scp, unsigned char * arr, req_len = scp->request_bufflen; act_len = (req_len < arr_len) ? req_len : arr_len; memcpy(scp->request_buffer, arr, act_len); - scp->resid = req_len - act_len; + if (scp->resid) + scp->resid -= act_len; + else + scp->resid = req_len - act_len; return 0; } sgpnt = (struct scatterlist *)scp->request_buffer; @@ -516,7 +602,10 @@ static int fill_from_dev_buffer(struct scsi_cmnd * scp, unsigned char * arr, } req_len += sgpnt->length; } - scp->resid = req_len - act_len; + if (scp->resid) + scp->resid -= act_len; + else + scp->resid = req_len - act_len; return 0; } @@ -567,12 +656,14 @@ static const char * inq_vendor_id = "Linux "; static const char * inq_product_id = "scsi_debug "; static const char * inq_product_rev = "0004"; -static int inquiry_evpd_83(unsigned char * arr, int dev_id_num, - const char * dev_id_str, int dev_id_str_len) +static int inquiry_evpd_83(unsigned char * arr, int target_dev_id, + int dev_id_num, const char * dev_id_str, + int dev_id_str_len) { - int num; + int num, port_a; + char b[32]; - /* Two identification descriptors: */ + port_a = target_dev_id + 1; /* T10 vendor identifier field format (faked) */ arr[0] = 0x2; /* ASCII */ arr[1] = 0x1; @@ -583,25 +674,246 @@ static int inquiry_evpd_83(unsigned char * arr, int dev_id_num, num = 8 + 16 + dev_id_str_len; arr[3] = num; num += 4; - /* NAA IEEE registered identifier (faked) */ - arr[num] = 0x1; /* binary */ - arr[num + 1] = 0x3; - arr[num + 2] = 0x0; - arr[num + 3] = 0x8; - arr[num + 4] = 0x51; /* ieee company id=0x123456 (faked) */ - arr[num + 5] = 0x23; - arr[num + 6] = 0x45; - arr[num + 7] = 0x60; - arr[num + 8] = (dev_id_num >> 24); - arr[num + 9] = (dev_id_num >> 16) & 0xff; - arr[num + 10] = (dev_id_num >> 8) & 0xff; - arr[num + 11] = dev_id_num & 0xff; - return num + 12; + if (dev_id_num >= 0) { + /* NAA-5, Logical unit identifier (binary) */ + arr[num++] = 0x1; /* binary (not necessarily sas) */ + arr[num++] = 0x3; /* PIV=0, lu, naa */ + arr[num++] = 0x0; + arr[num++] = 0x8; + arr[num++] = 0x53; /* naa-5 ieee company id=0x333333 (fake) */ + arr[num++] = 0x33; + arr[num++] = 0x33; + arr[num++] = 0x30; + arr[num++] = (dev_id_num >> 24); + arr[num++] = (dev_id_num >> 16) & 0xff; + arr[num++] = (dev_id_num >> 8) & 0xff; + arr[num++] = dev_id_num & 0xff; + /* Target relative port number */ + arr[num++] = 0x61; /* proto=sas, binary */ + arr[num++] = 0x94; /* PIV=1, target port, rel port */ + arr[num++] = 0x0; /* reserved */ + arr[num++] = 0x4; /* length */ + arr[num++] = 0x0; /* reserved */ + arr[num++] = 0x0; /* reserved */ + arr[num++] = 0x0; + arr[num++] = 0x1; /* relative port A */ + } + /* NAA-5, Target port identifier */ + arr[num++] = 0x61; /* proto=sas, binary */ + arr[num++] = 0x93; /* piv=1, target port, naa */ + arr[num++] = 0x0; + arr[num++] = 0x8; + arr[num++] = 0x52; /* naa-5, company id=0x222222 (fake) */ + arr[num++] = 0x22; + arr[num++] = 0x22; + arr[num++] = 0x20; + arr[num++] = (port_a >> 24); + arr[num++] = (port_a >> 16) & 0xff; + arr[num++] = (port_a >> 8) & 0xff; + arr[num++] = port_a & 0xff; + /* NAA-5, Target device identifier */ + arr[num++] = 0x61; /* proto=sas, binary */ + arr[num++] = 0xa3; /* piv=1, target device, naa */ + arr[num++] = 0x0; + arr[num++] = 0x8; + arr[num++] = 0x52; /* naa-5, company id=0x222222 (fake) */ + arr[num++] = 0x22; + arr[num++] = 0x22; + arr[num++] = 0x20; + arr[num++] = (target_dev_id >> 24); + arr[num++] = (target_dev_id >> 16) & 0xff; + arr[num++] = (target_dev_id >> 8) & 0xff; + arr[num++] = target_dev_id & 0xff; + /* SCSI name string: Target device identifier */ + arr[num++] = 0x63; /* proto=sas, UTF-8 */ + arr[num++] = 0xa8; /* piv=1, target device, SCSI name string */ + arr[num++] = 0x0; + arr[num++] = 24; + memcpy(arr + num, "naa.52222220", 12); + num += 12; + snprintf(b, sizeof(b), "%08X", target_dev_id); + memcpy(arr + num, b, 8); + num += 8; + memset(arr + num, 0, 4); + num += 4; + return num; +} + + +static unsigned char vpd84_data[] = { +/* from 4th byte */ 0x22,0x22,0x22,0x0,0xbb,0x0, + 0x22,0x22,0x22,0x0,0xbb,0x1, + 0x22,0x22,0x22,0x0,0xbb,0x2, +}; + +static int inquiry_evpd_84(unsigned char * arr) +{ + memcpy(arr, vpd84_data, sizeof(vpd84_data)); + return sizeof(vpd84_data); +} + +static int inquiry_evpd_85(unsigned char * arr) +{ + int num = 0; + const char * na1 = "https://www.kernel.org/config"; + const char * na2 = "http://www.kernel.org/log"; + int plen, olen; + + arr[num++] = 0x1; /* lu, storage config */ + arr[num++] = 0x0; /* reserved */ + arr[num++] = 0x0; + olen = strlen(na1); + plen = olen + 1; + if (plen % 4) + plen = ((plen / 4) + 1) * 4; + arr[num++] = plen; /* length, null termianted, padded */ + memcpy(arr + num, na1, olen); + memset(arr + num + olen, 0, plen - olen); + num += plen; + + arr[num++] = 0x4; /* lu, logging */ + arr[num++] = 0x0; /* reserved */ + arr[num++] = 0x0; + olen = strlen(na2); + plen = olen + 1; + if (plen % 4) + plen = ((plen / 4) + 1) * 4; + arr[num++] = plen; /* length, null terminated, padded */ + memcpy(arr + num, na2, olen); + memset(arr + num + olen, 0, plen - olen); + num += plen; + + return num; +} + +/* SCSI ports VPD page */ +static int inquiry_evpd_88(unsigned char * arr, int target_dev_id) +{ + int num = 0; + int port_a, port_b; + + port_a = target_dev_id + 1; + port_b = port_a + 1; + arr[num++] = 0x0; /* reserved */ + arr[num++] = 0x0; /* reserved */ + arr[num++] = 0x0; + arr[num++] = 0x1; /* relative port 1 (primary) */ + memset(arr + num, 0, 6); + num += 6; + arr[num++] = 0x0; + arr[num++] = 12; /* length tp descriptor */ + /* naa-5 target port identifier (A) */ + arr[num++] = 0x61; /* proto=sas, binary */ + arr[num++] = 0x93; /* PIV=1, target port, NAA */ + arr[num++] = 0x0; /* reserved */ + arr[num++] = 0x8; /* length */ + arr[num++] = 0x52; /* NAA-5, company_id=0x222222 (fake) */ + arr[num++] = 0x22; + arr[num++] = 0x22; + arr[num++] = 0x20; + arr[num++] = (port_a >> 24); + arr[num++] = (port_a >> 16) & 0xff; + arr[num++] = (port_a >> 8) & 0xff; + arr[num++] = port_a & 0xff; + + arr[num++] = 0x0; /* reserved */ + arr[num++] = 0x0; /* reserved */ + arr[num++] = 0x0; + arr[num++] = 0x2; /* relative port 2 (secondary) */ + memset(arr + num, 0, 6); + num += 6; + arr[num++] = 0x0; + arr[num++] = 12; /* length tp descriptor */ + /* naa-5 target port identifier (B) */ + arr[num++] = 0x61; /* proto=sas, binary */ + arr[num++] = 0x93; /* PIV=1, target port, NAA */ + arr[num++] = 0x0; /* reserved */ + arr[num++] = 0x8; /* length */ + arr[num++] = 0x52; /* NAA-5, company_id=0x222222 (fake) */ + arr[num++] = 0x22; + arr[num++] = 0x22; + arr[num++] = 0x20; + arr[num++] = (port_b >> 24); + arr[num++] = (port_b >> 16) & 0xff; + arr[num++] = (port_b >> 8) & 0xff; + arr[num++] = port_b & 0xff; + + return num; +} + + +static unsigned char vpd89_data[] = { +/* from 4th byte */ 0,0,0,0, +'l','i','n','u','x',' ',' ',' ', +'S','A','T',' ','s','c','s','i','_','d','e','b','u','g',' ',' ', +'1','2','3','4', +0x34,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +0xec,0,0,0, +0x5a,0xc,0xff,0x3f,0x37,0xc8,0x10,0,0,0,0,0,0x3f,0,0,0, +0,0,0,0,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0,0,0,0x40,0x4,0,0x2e,0x33, +0x38,0x31,0x20,0x20,0x20,0x20,0x54,0x53,0x38,0x33,0x30,0x30,0x33,0x31, +0x53,0x41, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x10,0x80, +0,0,0,0x2f,0,0,0,0x2,0,0x2,0x7,0,0xff,0xff,0x1,0, +0x3f,0,0xc1,0xff,0x3e,0,0x10,0x1,0xb0,0xf8,0x50,0x9,0,0,0x7,0, +0x3,0,0x78,0,0x78,0,0xf0,0,0x78,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x2,0,0,0,0,0,0,0, +0x7e,0,0x1b,0,0x6b,0x34,0x1,0x7d,0x3,0x40,0x69,0x34,0x1,0x3c,0x3,0x40, +0x7f,0x40,0,0,0,0,0xfe,0xfe,0,0,0,0,0,0xfe,0,0, +0,0,0,0,0,0,0,0,0xb0,0xf8,0x50,0x9,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1,0,0xb0,0xf8,0x50,0x9,0xb0,0xf8,0x50,0x9,0x20,0x20,0x2,0,0xb6,0x42, +0,0x80,0x8a,0,0x6,0x3c,0xa,0x3c,0xff,0xff,0xc6,0x7,0,0x1,0,0x8, +0xf0,0xf,0,0x10,0x2,0,0x30,0,0,0,0,0,0,0,0x6,0xfe, +0,0,0x2,0,0x50,0,0x8a,0,0x4f,0x95,0,0,0x21,0,0xb,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa5,0x51, +}; + +static int inquiry_evpd_89(unsigned char * arr) +{ + memcpy(arr, vpd89_data, sizeof(vpd89_data)); + return sizeof(vpd89_data); +} + + +static unsigned char vpdb0_data[] = { + /* from 4th byte */ 0,0,0,4, + 0,0,0x4,0, + 0,0,0,64, +}; + +static int inquiry_evpd_b0(unsigned char * arr) +{ + memcpy(arr, vpdb0_data, sizeof(vpdb0_data)); + if (sdebug_store_sectors > 0x400) { + arr[4] = (sdebug_store_sectors >> 24) & 0xff; + arr[5] = (sdebug_store_sectors >> 16) & 0xff; + arr[6] = (sdebug_store_sectors >> 8) & 0xff; + arr[7] = sdebug_store_sectors & 0xff; + } + return sizeof(vpdb0_data); } #define SDEBUG_LONG_INQ_SZ 96 -#define SDEBUG_MAX_INQ_ARR_SZ 128 +#define SDEBUG_MAX_INQ_ARR_SZ 584 static int resp_inquiry(struct scsi_cmnd * scp, int target, struct sdebug_dev_info * devip) @@ -609,64 +921,113 @@ static int resp_inquiry(struct scsi_cmnd * scp, int target, unsigned char pq_pdt; unsigned char arr[SDEBUG_MAX_INQ_ARR_SZ]; unsigned char *cmd = (unsigned char *)scp->cmnd; - int alloc_len; + int alloc_len, n; alloc_len = (cmd[3] << 8) + cmd[4]; memset(arr, 0, SDEBUG_MAX_INQ_ARR_SZ); - pq_pdt = (scsi_debug_ptype & 0x1f); + if (devip->wlun) + pq_pdt = 0x1e; /* present, wlun */ + else if (scsi_debug_no_lun_0 && (0 == devip->lun)) + pq_pdt = 0x7f; /* not present, no device type */ + else + pq_pdt = (scsi_debug_ptype & 0x1f); arr[0] = pq_pdt; if (0x2 & cmd[1]) { /* CMDDT bit set */ mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0); return check_condition_result; } else if (0x1 & cmd[1]) { /* EVPD bit set */ - int dev_id_num, len; - char dev_id_str[6]; + int lu_id_num, target_dev_id, len; + char lu_id_str[6]; + int host_no = devip->sdbg_host->shost->host_no; - dev_id_num = ((devip->sdbg_host->shost->host_no + 1) * 2000) + - (devip->target * 1000) + devip->lun; - len = scnprintf(dev_id_str, 6, "%d", dev_id_num); + lu_id_num = devip->wlun ? -1 : (((host_no + 1) * 2000) + + (devip->target * 1000) + devip->lun); + target_dev_id = ((host_no + 1) * 2000) + + (devip->target * 1000) - 3; + len = scnprintf(lu_id_str, 6, "%d", lu_id_num); if (0 == cmd[2]) { /* supported vital product data pages */ - arr[3] = 3; - arr[4] = 0x0; /* this page */ - arr[5] = 0x80; /* unit serial number */ - arr[6] = 0x83; /* device identification */ + arr[1] = cmd[2]; /*sanity */ + n = 4; + arr[n++] = 0x0; /* this page */ + arr[n++] = 0x80; /* unit serial number */ + arr[n++] = 0x83; /* device identification */ + arr[n++] = 0x84; /* software interface ident. */ + arr[n++] = 0x85; /* management network addresses */ + arr[n++] = 0x86; /* extended inquiry */ + arr[n++] = 0x87; /* mode page policy */ + arr[n++] = 0x88; /* SCSI ports */ + arr[n++] = 0x89; /* ATA information */ + arr[n++] = 0xb0; /* Block limits (SBC) */ + arr[3] = n - 4; /* number of supported VPD pages */ } else if (0x80 == cmd[2]) { /* unit serial number */ - arr[1] = 0x80; + arr[1] = cmd[2]; /*sanity */ arr[3] = len; - memcpy(&arr[4], dev_id_str, len); + memcpy(&arr[4], lu_id_str, len); } else if (0x83 == cmd[2]) { /* device identification */ - arr[1] = 0x83; - arr[3] = inquiry_evpd_83(&arr[4], dev_id_num, - dev_id_str, len); + arr[1] = cmd[2]; /*sanity */ + arr[3] = inquiry_evpd_83(&arr[4], target_dev_id, + lu_id_num, lu_id_str, len); + } else if (0x84 == cmd[2]) { /* Software interface ident. */ + arr[1] = cmd[2]; /*sanity */ + arr[3] = inquiry_evpd_84(&arr[4]); + } else if (0x85 == cmd[2]) { /* Management network addresses */ + arr[1] = cmd[2]; /*sanity */ + arr[3] = inquiry_evpd_85(&arr[4]); + } else if (0x86 == cmd[2]) { /* extended inquiry */ + arr[1] = cmd[2]; /*sanity */ + arr[3] = 0x3c; /* number of following entries */ + arr[4] = 0x0; /* no protection stuff */ + arr[5] = 0x7; /* head of q, ordered + simple q's */ + } else if (0x87 == cmd[2]) { /* mode page policy */ + arr[1] = cmd[2]; /*sanity */ + arr[3] = 0x8; /* number of following entries */ + arr[4] = 0x2; /* disconnect-reconnect mp */ + arr[6] = 0x80; /* mlus, shared */ + arr[8] = 0x18; /* protocol specific lu */ + arr[10] = 0x82; /* mlus, per initiator port */ + } else if (0x88 == cmd[2]) { /* SCSI Ports */ + arr[1] = cmd[2]; /*sanity */ + arr[3] = inquiry_evpd_88(&arr[4], target_dev_id); + } else if (0x89 == cmd[2]) { /* ATA information */ + arr[1] = cmd[2]; /*sanity */ + n = inquiry_evpd_89(&arr[4]); + arr[2] = (n >> 8); + arr[3] = (n & 0xff); + } else if (0xb0 == cmd[2]) { /* Block limits (SBC) */ + arr[1] = cmd[2]; /*sanity */ + arr[3] = inquiry_evpd_b0(&arr[4]); } else { /* Illegal request, invalid field in cdb */ mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0); return check_condition_result; } + len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len); return fill_from_dev_buffer(scp, arr, - min(alloc_len, SDEBUG_MAX_INQ_ARR_SZ)); + min(len, SDEBUG_MAX_INQ_ARR_SZ)); } /* drops through here for a standard inquiry */ arr[1] = DEV_REMOVEABLE(target) ? 0x80 : 0; /* Removable disk */ arr[2] = scsi_debug_scsi_level; arr[3] = 2; /* response_data_format==2 */ arr[4] = SDEBUG_LONG_INQ_SZ - 5; - arr[6] = 0x1; /* claim: ADDR16 */ + arr[6] = 0x10; /* claim: MultiP */ /* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */ - arr[7] = 0x3a; /* claim: WBUS16, SYNC, LINKED + CMDQUE */ + arr[7] = 0xa; /* claim: LINKED + CMDQUE */ memcpy(&arr[8], inq_vendor_id, 8); memcpy(&arr[16], inq_product_id, 16); memcpy(&arr[32], inq_product_rev, 4); /* version descriptors (2 bytes each) follow */ - arr[58] = 0x0; arr[59] = 0x40; /* SAM-2 */ - arr[60] = 0x3; arr[61] = 0x0; /* SPC-3 */ + arr[58] = 0x0; arr[59] = 0x77; /* SAM-3 ANSI */ + arr[60] = 0x3; arr[61] = 0x14; /* SPC-3 ANSI */ + n = 62; if (scsi_debug_ptype == 0) { - arr[62] = 0x1; arr[63] = 0x80; /* SBC */ + arr[n++] = 0x3; arr[n++] = 0x3d; /* SBC-2 ANSI */ } else if (scsi_debug_ptype == 1) { - arr[62] = 0x2; arr[63] = 0x00; /* SSC */ + arr[n++] = 0x3; arr[n++] = 0x60; /* SSC-2 no version */ } + arr[n++] = 0xc; arr[n++] = 0xf; /* SAS-1.1 rev 10 */ return fill_from_dev_buffer(scp, arr, min(alloc_len, SDEBUG_LONG_INQ_SZ)); } @@ -677,46 +1038,141 @@ static int resp_requests(struct scsi_cmnd * scp, unsigned char * sbuff; unsigned char *cmd = (unsigned char *)scp->cmnd; unsigned char arr[SDEBUG_SENSE_LEN]; + int want_dsense; int len = 18; - memset(arr, 0, SDEBUG_SENSE_LEN); + memset(arr, 0, sizeof(arr)); if (devip->reset == 1) - mk_sense_buffer(devip, 0, NO_ADDED_SENSE, 0); + mk_sense_buffer(devip, 0, NO_ADDITIONAL_SENSE, 0); + want_dsense = !!(cmd[1] & 1) || scsi_debug_dsense; sbuff = devip->sense_buff; - if ((cmd[1] & 1) && (! scsi_debug_dsense)) { - /* DESC bit set and sense_buff in fixed format */ - arr[0] = 0x72; - arr[1] = sbuff[2]; /* sense key */ - arr[2] = sbuff[12]; /* asc */ - arr[3] = sbuff[13]; /* ascq */ - len = 8; - } else + if ((iec_m_pg[2] & 0x4) && (6 == (iec_m_pg[3] & 0xf))) { + if (want_dsense) { + arr[0] = 0x72; + arr[1] = 0x0; /* NO_SENSE in sense_key */ + arr[2] = THRESHOLD_EXCEEDED; + arr[3] = 0xff; /* TEST set and MRIE==6 */ + } else { + arr[0] = 0x70; + arr[2] = 0x0; /* NO_SENSE in sense_key */ + arr[7] = 0xa; /* 18 byte sense buffer */ + arr[12] = THRESHOLD_EXCEEDED; + arr[13] = 0xff; /* TEST set and MRIE==6 */ + } + } else if (devip->stopped) { + if (want_dsense) { + arr[0] = 0x72; + arr[1] = 0x0; /* NO_SENSE in sense_key */ + arr[2] = LOW_POWER_COND_ON; + arr[3] = 0x0; /* TEST set and MRIE==6 */ + } else { + arr[0] = 0x70; + arr[2] = 0x0; /* NO_SENSE in sense_key */ + arr[7] = 0xa; /* 18 byte sense buffer */ + arr[12] = LOW_POWER_COND_ON; + arr[13] = 0x0; /* TEST set and MRIE==6 */ + } + } else { memcpy(arr, sbuff, SDEBUG_SENSE_LEN); - mk_sense_buffer(devip, 0, NO_ADDED_SENSE, 0); + if ((cmd[1] & 1) && (! scsi_debug_dsense)) { + /* DESC bit set and sense_buff in fixed format */ + memset(arr, 0, sizeof(arr)); + arr[0] = 0x72; + arr[1] = sbuff[2]; /* sense key */ + arr[2] = sbuff[12]; /* asc */ + arr[3] = sbuff[13]; /* ascq */ + len = 8; + } + } + mk_sense_buffer(devip, 0, NO_ADDITIONAL_SENSE, 0); return fill_from_dev_buffer(scp, arr, len); } +static int resp_start_stop(struct scsi_cmnd * scp, + struct sdebug_dev_info * devip) +{ + unsigned char *cmd = (unsigned char *)scp->cmnd; + int power_cond, errsts, start; + + if ((errsts = check_readiness(scp, 1, devip))) + return errsts; + power_cond = (cmd[4] & 0xf0) >> 4; + if (power_cond) { + mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, + 0); + return check_condition_result; + } + start = cmd[4] & 1; + if (start == devip->stopped) + devip->stopped = !start; + return 0; +} + #define SDEBUG_READCAP_ARR_SZ 8 static int resp_readcap(struct scsi_cmnd * scp, struct sdebug_dev_info * devip) { unsigned char arr[SDEBUG_READCAP_ARR_SZ]; - unsigned long capac; + unsigned int capac; int errsts; - if ((errsts = check_reset(scp, devip))) + if ((errsts = check_readiness(scp, 1, devip))) return errsts; + /* following just in case virtual_gb changed */ + if (scsi_debug_virtual_gb > 0) { + sdebug_capacity = 2048 * 1024; + sdebug_capacity *= scsi_debug_virtual_gb; + } else + sdebug_capacity = sdebug_store_sectors; memset(arr, 0, SDEBUG_READCAP_ARR_SZ); - capac = (unsigned long)sdebug_capacity - 1; - arr[0] = (capac >> 24); - arr[1] = (capac >> 16) & 0xff; - arr[2] = (capac >> 8) & 0xff; - arr[3] = capac & 0xff; + if (sdebug_capacity < 0xffffffff) { + capac = (unsigned int)sdebug_capacity - 1; + arr[0] = (capac >> 24); + arr[1] = (capac >> 16) & 0xff; + arr[2] = (capac >> 8) & 0xff; + arr[3] = capac & 0xff; + } else { + arr[0] = 0xff; + arr[1] = 0xff; + arr[2] = 0xff; + arr[3] = 0xff; + } arr[6] = (SECT_SIZE_PER(target) >> 8) & 0xff; arr[7] = SECT_SIZE_PER(target) & 0xff; return fill_from_dev_buffer(scp, arr, SDEBUG_READCAP_ARR_SZ); } +#define SDEBUG_READCAP16_ARR_SZ 32 +static int resp_readcap16(struct scsi_cmnd * scp, + struct sdebug_dev_info * devip) +{ + unsigned char *cmd = (unsigned char *)scp->cmnd; + unsigned char arr[SDEBUG_READCAP16_ARR_SZ]; + unsigned long long capac; + int errsts, k, alloc_len; + + if ((errsts = check_readiness(scp, 1, devip))) + return errsts; + alloc_len = ((cmd[10] << 24) + (cmd[11] << 16) + (cmd[12] << 8) + + cmd[13]); + /* following just in case virtual_gb changed */ + if (scsi_debug_virtual_gb > 0) { + sdebug_capacity = 2048 * 1024; + sdebug_capacity *= scsi_debug_virtual_gb; + } else + sdebug_capacity = sdebug_store_sectors; + memset(arr, 0, SDEBUG_READCAP16_ARR_SZ); + capac = sdebug_capacity - 1; + for (k = 0; k < 8; ++k, capac >>= 8) + arr[7 - k] = capac & 0xff; + arr[8] = (SECT_SIZE_PER(target) >> 24) & 0xff; + arr[9] = (SECT_SIZE_PER(target) >> 16) & 0xff; + arr[10] = (SECT_SIZE_PER(target) >> 8) & 0xff; + arr[11] = SECT_SIZE_PER(target) & 0xff; + return fill_from_dev_buffer(scp, arr, + min(alloc_len, SDEBUG_READCAP16_ARR_SZ)); +} + /* <> */ static int resp_err_recov_pg(unsigned char * p, int pcontrol, int target) @@ -772,27 +1228,98 @@ static int resp_caching_pg(unsigned char * p, int pcontrol, int target) static int resp_ctrl_m_pg(unsigned char * p, int pcontrol, int target) { /* Control mode page for mode_sense */ - unsigned char ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0, + unsigned char ch_ctrl_m_pg[] = {/* 0xa, 10, */ 0x6, 0, 0, 0, 0, 0, + 0, 0, 0, 0}; + unsigned char d_ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0x2, 0x4b}; if (scsi_debug_dsense) ctrl_m_pg[2] |= 0x4; + else + ctrl_m_pg[2] &= ~0x4; memcpy(p, ctrl_m_pg, sizeof(ctrl_m_pg)); if (1 == pcontrol) - memset(p + 2, 0, sizeof(ctrl_m_pg) - 2); + memcpy(p + 2, ch_ctrl_m_pg, sizeof(ch_ctrl_m_pg)); + else if (2 == pcontrol) + memcpy(p, d_ctrl_m_pg, sizeof(d_ctrl_m_pg)); return sizeof(ctrl_m_pg); } + static int resp_iec_m_pg(unsigned char * p, int pcontrol, int target) { /* Informational Exceptions control mode page for mode_sense */ - unsigned char iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0, - 0, 0, 0x0, 0x0}; + unsigned char ch_iec_m_pg[] = {/* 0x1c, 0xa, */ 0x4, 0xf, 0, 0, 0, 0, + 0, 0, 0x0, 0x0}; + unsigned char d_iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0, + 0, 0, 0x0, 0x0}; + memcpy(p, iec_m_pg, sizeof(iec_m_pg)); if (1 == pcontrol) - memset(p + 2, 0, sizeof(iec_m_pg) - 2); + memcpy(p + 2, ch_iec_m_pg, sizeof(ch_iec_m_pg)); + else if (2 == pcontrol) + memcpy(p, d_iec_m_pg, sizeof(d_iec_m_pg)); return sizeof(iec_m_pg); } +static int resp_sas_sf_m_pg(unsigned char * p, int pcontrol, int target) +{ /* SAS SSP mode page - short format for mode_sense */ + unsigned char sas_sf_m_pg[] = {0x19, 0x6, + 0x6, 0x0, 0x7, 0xd0, 0x0, 0x0}; + + memcpy(p, sas_sf_m_pg, sizeof(sas_sf_m_pg)); + if (1 == pcontrol) + memset(p + 2, 0, sizeof(sas_sf_m_pg) - 2); + return sizeof(sas_sf_m_pg); +} + + +static int resp_sas_pcd_m_spg(unsigned char * p, int pcontrol, int target, + int target_dev_id) +{ /* SAS phy control and discover mode page for mode_sense */ + unsigned char sas_pcd_m_pg[] = {0x59, 0x1, 0, 0x64, 0, 0x6, 0, 2, + 0, 0, 0, 0, 0x10, 0x9, 0x8, 0x0, + 0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1, + 0x2, 0, 0, 0, 0, 0, 0, 0, + 0x88, 0x99, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0x10, 0x9, 0x8, 0x0, + 0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1, + 0x3, 0, 0, 0, 0, 0, 0, 0, + 0x88, 0x99, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + int port_a, port_b; + + port_a = target_dev_id + 1; + port_b = port_a + 1; + memcpy(p, sas_pcd_m_pg, sizeof(sas_pcd_m_pg)); + p[20] = (port_a >> 24); + p[21] = (port_a >> 16) & 0xff; + p[22] = (port_a >> 8) & 0xff; + p[23] = port_a & 0xff; + p[48 + 20] = (port_b >> 24); + p[48 + 21] = (port_b >> 16) & 0xff; + p[48 + 22] = (port_b >> 8) & 0xff; + p[48 + 23] = port_b & 0xff; + if (1 == pcontrol) + memset(p + 4, 0, sizeof(sas_pcd_m_pg) - 4); + return sizeof(sas_pcd_m_pg); +} + +static int resp_sas_sha_m_spg(unsigned char * p, int pcontrol) +{ /* SAS SSP shared protocol specific port mode subpage */ + unsigned char sas_sha_m_pg[] = {0x59, 0x2, 0, 0xc, 0, 0x6, 0x10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + + memcpy(p, sas_sha_m_pg, sizeof(sas_sha_m_pg)); + if (1 == pcontrol) + memset(p + 4, 0, sizeof(sas_sha_m_pg) - 4); + return sizeof(sas_sha_m_pg); +} + #define SDEBUG_MAX_MSENSE_SZ 256 static int resp_mode_sense(struct scsi_cmnd * scp, int target, @@ -801,12 +1328,12 @@ static int resp_mode_sense(struct scsi_cmnd * scp, int target, unsigned char dbd; int pcontrol, pcode, subpcode; unsigned char dev_spec; - int alloc_len, msense_6, offset, len, errsts; + int alloc_len, msense_6, offset, len, errsts, target_dev_id; unsigned char * ap; unsigned char arr[SDEBUG_MAX_MSENSE_SZ]; unsigned char *cmd = (unsigned char *)scp->cmnd; - if ((errsts = check_reset(scp, devip))) + if ((errsts = check_readiness(scp, 1, devip))) return errsts; dbd = cmd[1] & 0x8; pcontrol = (cmd[2] & 0xc0) >> 6; @@ -820,6 +1347,8 @@ static int resp_mode_sense(struct scsi_cmnd * scp, int target, 0); return check_condition_result; } + target_dev_id = ((devip->sdbg_host->shost->host_no + 1) * 2000) + + (devip->target * 1000) - 3; dev_spec = DEV_READONLY(target) ? 0x80 : 0x0; if (msense_6) { arr[2] = dev_spec; @@ -830,7 +1359,8 @@ static int resp_mode_sense(struct scsi_cmnd * scp, int target, } ap = arr + offset; - if (0 != subpcode) { /* TODO: Control Extension page */ + if ((subpcode > 0x0) && (subpcode < 0xff) && (0x19 != pcode)) { + /* TODO: Control Extension page */ mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0); return check_condition_result; @@ -856,17 +1386,45 @@ static int resp_mode_sense(struct scsi_cmnd * scp, int target, len = resp_ctrl_m_pg(ap, pcontrol, target); offset += len; break; + case 0x19: /* if spc==1 then sas phy, control+discover */ + if ((subpcode > 0x2) && (subpcode < 0xff)) { + mk_sense_buffer(devip, ILLEGAL_REQUEST, + INVALID_FIELD_IN_CDB, 0); + return check_condition_result; + } + len = 0; + if ((0x0 == subpcode) || (0xff == subpcode)) + len += resp_sas_sf_m_pg(ap + len, pcontrol, target); + if ((0x1 == subpcode) || (0xff == subpcode)) + len += resp_sas_pcd_m_spg(ap + len, pcontrol, target, + target_dev_id); + if ((0x2 == subpcode) || (0xff == subpcode)) + len += resp_sas_sha_m_spg(ap + len, pcontrol); + offset += len; + break; case 0x1c: /* Informational Exceptions Mode page, all devices */ len = resp_iec_m_pg(ap, pcontrol, target); offset += len; break; case 0x3f: /* Read all Mode pages */ - len = resp_err_recov_pg(ap, pcontrol, target); - len += resp_disconnect_pg(ap + len, pcontrol, target); - len += resp_format_pg(ap + len, pcontrol, target); - len += resp_caching_pg(ap + len, pcontrol, target); - len += resp_ctrl_m_pg(ap + len, pcontrol, target); - len += resp_iec_m_pg(ap + len, pcontrol, target); + if ((0 == subpcode) || (0xff == subpcode)) { + len = resp_err_recov_pg(ap, pcontrol, target); + len += resp_disconnect_pg(ap + len, pcontrol, target); + len += resp_format_pg(ap + len, pcontrol, target); + len += resp_caching_pg(ap + len, pcontrol, target); + len += resp_ctrl_m_pg(ap + len, pcontrol, target); + len += resp_sas_sf_m_pg(ap + len, pcontrol, target); + if (0xff == subpcode) { + len += resp_sas_pcd_m_spg(ap + len, pcontrol, + target, target_dev_id); + len += resp_sas_sha_m_spg(ap + len, pcontrol); + } + len += resp_iec_m_pg(ap + len, pcontrol, target); + } else { + mk_sense_buffer(devip, ILLEGAL_REQUEST, + INVALID_FIELD_IN_CDB, 0); + return check_condition_result; + } offset += len; break; default: @@ -883,71 +1441,274 @@ static int resp_mode_sense(struct scsi_cmnd * scp, int target, return fill_from_dev_buffer(scp, arr, min(alloc_len, offset)); } -static int resp_read(struct scsi_cmnd * SCpnt, int upper_blk, int block, - int num, struct sdebug_dev_info * devip) +#define SDEBUG_MAX_MSELECT_SZ 512 + +static int resp_mode_select(struct scsi_cmnd * scp, int mselect6, + struct sdebug_dev_info * devip) +{ + int pf, sp, ps, md_len, bd_len, off, spf, pg_len; + int param_len, res, errsts, mpage; + unsigned char arr[SDEBUG_MAX_MSELECT_SZ]; + unsigned char *cmd = (unsigned char *)scp->cmnd; + + if ((errsts = check_readiness(scp, 1, devip))) + return errsts; + memset(arr, 0, sizeof(arr)); + pf = cmd[1] & 0x10; + sp = cmd[1] & 0x1; + param_len = mselect6 ? cmd[4] : ((cmd[7] << 8) + cmd[8]); + if ((0 == pf) || sp || (param_len > SDEBUG_MAX_MSELECT_SZ)) { + mk_sense_buffer(devip, ILLEGAL_REQUEST, + INVALID_FIELD_IN_CDB, 0); + return check_condition_result; + } + res = fetch_to_dev_buffer(scp, arr, param_len); + if (-1 == res) + return (DID_ERROR << 16); + else if ((res < param_len) && + (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)) + printk(KERN_INFO "scsi_debug: mode_select: cdb indicated=%d, " + " IO sent=%d bytes\n", param_len, res); + md_len = mselect6 ? (arr[0] + 1) : ((arr[0] << 8) + arr[1] + 2); + bd_len = mselect6 ? arr[3] : ((arr[6] << 8) + arr[7]); + if ((md_len > 2) || (0 != bd_len)) { + mk_sense_buffer(devip, ILLEGAL_REQUEST, + INVALID_FIELD_IN_PARAM_LIST, 0); + return check_condition_result; + } + off = bd_len + (mselect6 ? 4 : 8); + mpage = arr[off] & 0x3f; + ps = !!(arr[off] & 0x80); + if (ps) { + mk_sense_buffer(devip, ILLEGAL_REQUEST, + INVALID_FIELD_IN_PARAM_LIST, 0); + return check_condition_result; + } + spf = !!(arr[off] & 0x40); + pg_len = spf ? ((arr[off + 2] << 8) + arr[off + 3] + 4) : + (arr[off + 1] + 2); + if ((pg_len + off) > param_len) { + mk_sense_buffer(devip, ILLEGAL_REQUEST, + PARAMETER_LIST_LENGTH_ERR, 0); + return check_condition_result; + } + switch (mpage) { + case 0xa: /* Control Mode page */ + if (ctrl_m_pg[1] == arr[off + 1]) { + memcpy(ctrl_m_pg + 2, arr + off + 2, + sizeof(ctrl_m_pg) - 2); + scsi_debug_dsense = !!(ctrl_m_pg[2] & 0x4); + return 0; + } + break; + case 0x1c: /* Informational Exceptions Mode page */ + if (iec_m_pg[1] == arr[off + 1]) { + memcpy(iec_m_pg + 2, arr + off + 2, + sizeof(iec_m_pg) - 2); + return 0; + } + break; + default: + break; + } + mk_sense_buffer(devip, ILLEGAL_REQUEST, + INVALID_FIELD_IN_PARAM_LIST, 0); + return check_condition_result; +} + +static int resp_temp_l_pg(unsigned char * arr) +{ + unsigned char temp_l_pg[] = {0x0, 0x0, 0x3, 0x2, 0x0, 38, + 0x0, 0x1, 0x3, 0x2, 0x0, 65, + }; + + memcpy(arr, temp_l_pg, sizeof(temp_l_pg)); + return sizeof(temp_l_pg); +} + +static int resp_ie_l_pg(unsigned char * arr) +{ + unsigned char ie_l_pg[] = {0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 38, + }; + + memcpy(arr, ie_l_pg, sizeof(ie_l_pg)); + if (iec_m_pg[2] & 0x4) { /* TEST bit set */ + arr[4] = THRESHOLD_EXCEEDED; + arr[5] = 0xff; + } + return sizeof(ie_l_pg); +} + +#define SDEBUG_MAX_LSENSE_SZ 512 + +static int resp_log_sense(struct scsi_cmnd * scp, + struct sdebug_dev_info * devip) +{ + int ppc, sp, pcontrol, pcode, alloc_len, errsts, len, n; + unsigned char arr[SDEBUG_MAX_LSENSE_SZ]; + unsigned char *cmd = (unsigned char *)scp->cmnd; + + if ((errsts = check_readiness(scp, 1, devip))) + return errsts; + memset(arr, 0, sizeof(arr)); + ppc = cmd[1] & 0x2; + sp = cmd[1] & 0x1; + if (ppc || sp) { + mk_sense_buffer(devip, ILLEGAL_REQUEST, + INVALID_FIELD_IN_CDB, 0); + return check_condition_result; + } + pcontrol = (cmd[2] & 0xc0) >> 6; + pcode = cmd[2] & 0x3f; + alloc_len = (cmd[7] << 8) + cmd[8]; + arr[0] = pcode; + switch (pcode) { + case 0x0: /* Supported log pages log page */ + n = 4; + arr[n++] = 0x0; /* this page */ + arr[n++] = 0xd; /* Temperature */ + arr[n++] = 0x2f; /* Informational exceptions */ + arr[3] = n - 4; + break; + case 0xd: /* Temperature log page */ + arr[3] = resp_temp_l_pg(arr + 4); + break; + case 0x2f: /* Informational exceptions log page */ + arr[3] = resp_ie_l_pg(arr + 4); + break; + default: + mk_sense_buffer(devip, ILLEGAL_REQUEST, + INVALID_FIELD_IN_CDB, 0); + return check_condition_result; + } + len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len); + return fill_from_dev_buffer(scp, arr, + min(len, SDEBUG_MAX_INQ_ARR_SZ)); +} + +static int resp_read(struct scsi_cmnd * SCpnt, unsigned long long lba, + unsigned int num, struct sdebug_dev_info * devip) { unsigned long iflags; + unsigned int block, from_bottom; + unsigned long long u; int ret; - if (upper_blk || (block + num > sdebug_capacity)) { + if (lba + num > sdebug_capacity) { mk_sense_buffer(devip, ILLEGAL_REQUEST, ADDR_OUT_OF_RANGE, 0); return check_condition_result; } + /* transfer length excessive (tie in to block limits VPD page) */ + if (num > sdebug_store_sectors) { + mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, + 0); + return check_condition_result; + } if ((SCSI_DEBUG_OPT_MEDIUM_ERR & scsi_debug_opts) && - (block <= OPT_MEDIUM_ERR_ADDR) && - ((block + num) > OPT_MEDIUM_ERR_ADDR)) { + (lba <= OPT_MEDIUM_ERR_ADDR) && + ((lba + num) > OPT_MEDIUM_ERR_ADDR)) { + /* claim unrecoverable read error */ mk_sense_buffer(devip, MEDIUM_ERROR, UNRECOVERED_READ_ERR, 0); - /* claim unrecoverable read error */ + /* set info field and valid bit for fixed descriptor */ + if (0x70 == (devip->sense_buff[0] & 0x7f)) { + devip->sense_buff[0] |= 0x80; /* Valid bit */ + ret = OPT_MEDIUM_ERR_ADDR; + devip->sense_buff[3] = (ret >> 24) & 0xff; + devip->sense_buff[4] = (ret >> 16) & 0xff; + devip->sense_buff[5] = (ret >> 8) & 0xff; + devip->sense_buff[6] = ret & 0xff; + } return check_condition_result; } read_lock_irqsave(&atomic_rw, iflags); - ret = fill_from_dev_buffer(SCpnt, fake_storep + (block * SECT_SIZE), - num * SECT_SIZE); + if ((lba + num) <= sdebug_store_sectors) + ret = fill_from_dev_buffer(SCpnt, + fake_storep + (lba * SECT_SIZE), + num * SECT_SIZE); + else { + /* modulo when one arg is 64 bits needs do_div() */ + u = lba; + block = do_div(u, sdebug_store_sectors); + from_bottom = 0; + if ((block + num) > sdebug_store_sectors) + from_bottom = (block + num) - sdebug_store_sectors; + ret = fill_from_dev_buffer(SCpnt, + fake_storep + (block * SECT_SIZE), + (num - from_bottom) * SECT_SIZE); + if ((0 == ret) && (from_bottom > 0)) + ret = fill_from_dev_buffer(SCpnt, fake_storep, + from_bottom * SECT_SIZE); + } read_unlock_irqrestore(&atomic_rw, iflags); return ret; } -static int resp_write(struct scsi_cmnd * SCpnt, int upper_blk, int block, - int num, struct sdebug_dev_info * devip) +static int resp_write(struct scsi_cmnd * SCpnt, unsigned long long lba, + unsigned int num, struct sdebug_dev_info * devip) { unsigned long iflags; + unsigned int block, to_bottom; + unsigned long long u; int res; - if (upper_blk || (block + num > sdebug_capacity)) { + if (lba + num > sdebug_capacity) { mk_sense_buffer(devip, ILLEGAL_REQUEST, ADDR_OUT_OF_RANGE, 0); return check_condition_result; } + /* transfer length excessive (tie in to block limits VPD page) */ + if (num > sdebug_store_sectors) { + mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, + 0); + return check_condition_result; + } write_lock_irqsave(&atomic_rw, iflags); - res = fetch_to_dev_buffer(SCpnt, fake_storep + (block * SECT_SIZE), - num * SECT_SIZE); + if ((lba + num) <= sdebug_store_sectors) + res = fetch_to_dev_buffer(SCpnt, + fake_storep + (lba * SECT_SIZE), + num * SECT_SIZE); + else { + /* modulo when one arg is 64 bits needs do_div() */ + u = lba; + block = do_div(u, sdebug_store_sectors); + to_bottom = 0; + if ((block + num) > sdebug_store_sectors) + to_bottom = (block + num) - sdebug_store_sectors; + res = fetch_to_dev_buffer(SCpnt, + fake_storep + (block * SECT_SIZE), + (num - to_bottom) * SECT_SIZE); + if ((0 == res) && (to_bottom > 0)) + res = fetch_to_dev_buffer(SCpnt, fake_storep, + to_bottom * SECT_SIZE); + } write_unlock_irqrestore(&atomic_rw, iflags); if (-1 == res) return (DID_ERROR << 16); else if ((res < (num * SECT_SIZE)) && (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)) - printk(KERN_INFO "scsi_debug: write: cdb indicated=%d, " + printk(KERN_INFO "scsi_debug: write: cdb indicated=%u, " " IO sent=%d bytes\n", num * SECT_SIZE, res); return 0; } -#define SDEBUG_RLUN_ARR_SZ 128 +#define SDEBUG_RLUN_ARR_SZ 256 static int resp_report_luns(struct scsi_cmnd * scp, struct sdebug_dev_info * devip) { unsigned int alloc_len; - int lun_cnt, i, upper; + int lun_cnt, i, upper, num, n, wlun, lun; unsigned char *cmd = (unsigned char *)scp->cmnd; int select_report = (int)cmd[2]; struct scsi_lun *one_lun; unsigned char arr[SDEBUG_RLUN_ARR_SZ]; + unsigned char * max_addr; alloc_len = cmd[9] + (cmd[8] << 8) + (cmd[7] << 16) + (cmd[6] << 24); - if ((alloc_len < 16) || (select_report > 2)) { + if ((alloc_len < 4) || (select_report > 2)) { mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0); return check_condition_result; @@ -955,18 +1716,37 @@ static int resp_report_luns(struct scsi_cmnd * scp, /* can produce response with up to 16k luns (lun 0 to lun 16383) */ memset(arr, 0, SDEBUG_RLUN_ARR_SZ); lun_cnt = scsi_debug_max_luns; - arr[2] = ((sizeof(struct scsi_lun) * lun_cnt) >> 8) & 0xff; - arr[3] = (sizeof(struct scsi_lun) * lun_cnt) & 0xff; - lun_cnt = min((int)((SDEBUG_RLUN_ARR_SZ - 8) / - sizeof(struct scsi_lun)), lun_cnt); + if (1 == select_report) + lun_cnt = 0; + else if (scsi_debug_no_lun_0 && (lun_cnt > 0)) + --lun_cnt; + wlun = (select_report > 0) ? 1 : 0; + num = lun_cnt + wlun; + arr[2] = ((sizeof(struct scsi_lun) * num) >> 8) & 0xff; + arr[3] = (sizeof(struct scsi_lun) * num) & 0xff; + n = min((int)((SDEBUG_RLUN_ARR_SZ - 8) / + sizeof(struct scsi_lun)), num); + if (n < num) { + wlun = 0; + lun_cnt = n; + } one_lun = (struct scsi_lun *) &arr[8]; - for (i = 0; i < lun_cnt; i++) { - upper = (i >> 8) & 0x3f; + max_addr = arr + SDEBUG_RLUN_ARR_SZ; + for (i = 0, lun = (scsi_debug_no_lun_0 ? 1 : 0); + ((i < lun_cnt) && ((unsigned char *)(one_lun + i) < max_addr)); + i++, lun++) { + upper = (lun >> 8) & 0x3f; if (upper) one_lun[i].scsi_lun[0] = (upper | (SAM2_LUN_ADDRESS_METHOD << 6)); - one_lun[i].scsi_lun[1] = i & 0xff; + one_lun[i].scsi_lun[1] = lun & 0xff; } + if (wlun) { + one_lun[i].scsi_lun[0] = (SAM2_WLUN_REPORT_LUNS >> 8) & 0xff; + one_lun[i].scsi_lun[1] = SAM2_WLUN_REPORT_LUNS & 0xff; + i++; + } + alloc_len = (unsigned char *)(one_lun + i) - arr; return fill_from_dev_buffer(scp, arr, min((int)alloc_len, SDEBUG_RLUN_ARR_SZ)); } @@ -1002,7 +1782,8 @@ static void timer_intr_handler(unsigned long indx) static int scsi_debug_slave_alloc(struct scsi_device * sdp) { if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) - sdev_printk(KERN_INFO, sdp, "scsi_debug: slave_alloc\n"); + printk(KERN_INFO "scsi_debug: slave_alloc <%u %u %u %u>\n", + sdp->host->host_no, sdp->channel, sdp->id, sdp->lun); return 0; } @@ -1011,7 +1792,8 @@ static int scsi_debug_slave_configure(struct scsi_device * sdp) struct sdebug_dev_info * devip; if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) - sdev_printk(KERN_INFO, sdp, "scsi_debug: slave_configure\n"); + printk(KERN_INFO "scsi_debug: slave_configure <%u %u %u %u>\n", + sdp->host->host_no, sdp->channel, sdp->id, sdp->lun); if (sdp->host->max_cmd_len != SCSI_DEBUG_MAX_CMD_LEN) sdp->host->max_cmd_len = SCSI_DEBUG_MAX_CMD_LEN; devip = devInfoReg(sdp); @@ -1019,6 +1801,7 @@ static int scsi_debug_slave_configure(struct scsi_device * sdp) if (sdp->host->cmd_per_lun) scsi_adjust_queue_depth(sdp, SDEBUG_TAGGED_QUEUING, sdp->host->cmd_per_lun); + blk_queue_max_segment_size(sdp->request_queue, 256 * 1024); return 0; } @@ -1028,7 +1811,8 @@ static void scsi_debug_slave_destroy(struct scsi_device * sdp) (struct sdebug_dev_info *)sdp->hostdata; if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) - sdev_printk(KERN_INFO, sdp, "scsi_debug: slave_destroy\n"); + printk(KERN_INFO "scsi_debug: slave_destroy <%u %u %u %u>\n", + sdp->host->host_no, sdp->channel, sdp->id, sdp->lun); if (devip) { /* make this slot avaliable for re-use */ devip->used = 0; @@ -1085,6 +1869,8 @@ static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev) open_devip->sense_buff[0] = 0x70; open_devip->sense_buff[7] = 0xa; } + if (sdev->lun == SAM2_WLUN_REPORT_LUNS) + open_devip->wlun = SAM2_WLUN_REPORT_LUNS & 0xff; return open_devip; } return NULL; @@ -1273,7 +2059,7 @@ static void __init sdebug_build_parts(unsigned char * ramp) printk(KERN_WARNING "scsi_debug:build_parts: reducing " "partitions to %d\n", SDEBUG_MAX_PARTS); } - num_sectors = (int)(sdebug_store_size / SECT_SIZE); + num_sectors = (int)sdebug_store_sectors; sectors_per_part = (num_sectors - sdebug_sectors_per) / scsi_debug_num_parts; heads_by_sects = sdebug_heads * sdebug_sectors_per; @@ -1316,9 +2102,9 @@ static int schedule_resp(struct scsi_cmnd * cmnd, if (scsi_result) { struct scsi_device * sdp = cmnd->device; - sdev_printk(KERN_INFO, sdp, - "non-zero result=0x%x\n", - scsi_result); + printk(KERN_INFO "scsi_debug: <%u %u %u %u> " + "non-zero result=0x%x\n", sdp->host->host_no, + sdp->channel, sdp->id, sdp->lun, scsi_result); } } if (cmnd && devip) { @@ -1365,21 +2151,19 @@ static int schedule_resp(struct scsi_cmnd * cmnd, } } -/* Set 'perm' (4th argument) to 0 to disable module_param's definition - * of sysfs parameters (which module_param doesn't yet support). - * Sysfs parameters defined explicitly below. - */ -module_param_named(add_host, scsi_debug_add_host, int, 0); /* perm=0644 */ -module_param_named(delay, scsi_debug_delay, int, 0); /* perm=0644 */ -module_param_named(dev_size_mb, scsi_debug_dev_size_mb, int, 0); -module_param_named(dsense, scsi_debug_dsense, int, 0); -module_param_named(every_nth, scsi_debug_every_nth, int, 0); -module_param_named(max_luns, scsi_debug_max_luns, int, 0); -module_param_named(num_parts, scsi_debug_num_parts, int, 0); -module_param_named(num_tgts, scsi_debug_num_tgts, int, 0); -module_param_named(opts, scsi_debug_opts, int, 0); /* perm=0644 */ -module_param_named(ptype, scsi_debug_ptype, int, 0); -module_param_named(scsi_level, scsi_debug_scsi_level, int, 0); +module_param_named(add_host, scsi_debug_add_host, int, S_IRUGO | S_IWUSR); +module_param_named(delay, scsi_debug_delay, int, S_IRUGO | S_IWUSR); +module_param_named(dev_size_mb, scsi_debug_dev_size_mb, int, S_IRUGO); +module_param_named(dsense, scsi_debug_dsense, int, S_IRUGO | S_IWUSR); +module_param_named(every_nth, scsi_debug_every_nth, int, S_IRUGO | S_IWUSR); +module_param_named(max_luns, scsi_debug_max_luns, int, S_IRUGO | S_IWUSR); +module_param_named(no_lun_0, scsi_debug_no_lun_0, int, S_IRUGO | S_IWUSR); +module_param_named(num_parts, scsi_debug_num_parts, int, S_IRUGO); +module_param_named(num_tgts, scsi_debug_num_tgts, int, S_IRUGO | S_IWUSR); +module_param_named(opts, scsi_debug_opts, int, S_IRUGO | S_IWUSR); +module_param_named(ptype, scsi_debug_ptype, int, S_IRUGO | S_IWUSR); +module_param_named(scsi_level, scsi_debug_scsi_level, int, S_IRUGO); +module_param_named(virtual_gb, scsi_debug_virtual_gb, int, S_IRUGO | S_IWUSR); MODULE_AUTHOR("Eric Youngdale + Douglas Gilbert"); MODULE_DESCRIPTION("SCSI debug adapter driver"); @@ -1388,15 +2172,17 @@ MODULE_VERSION(SCSI_DEBUG_VERSION); MODULE_PARM_DESC(add_host, "0..127 hosts allowed(def=1)"); MODULE_PARM_DESC(delay, "# of jiffies to delay response(def=1)"); -MODULE_PARM_DESC(dev_size_mb, "size in MB of ram shared by devs"); -MODULE_PARM_DESC(dsense, "use descriptor sense format(def: fixed)"); +MODULE_PARM_DESC(dev_size_mb, "size in MB of ram shared by devs(def=8)"); +MODULE_PARM_DESC(dsense, "use descriptor sense format(def=0 -> fixed)"); MODULE_PARM_DESC(every_nth, "timeout every nth command(def=100)"); -MODULE_PARM_DESC(max_luns, "number of SCSI LUNs per target to simulate"); +MODULE_PARM_DESC(max_luns, "number of LUNs per target to simulate(def=1)"); +MODULE_PARM_DESC(no_lun_0, "no LU number 0 (def=0 -> have lun 0)"); MODULE_PARM_DESC(num_parts, "number of partitions(def=0)"); -MODULE_PARM_DESC(num_tgts, "number of SCSI targets per host to simulate"); -MODULE_PARM_DESC(opts, "1->noise, 2->medium_error, 4->..."); +MODULE_PARM_DESC(num_tgts, "number of targets per host to simulate(def=1)"); +MODULE_PARM_DESC(opts, "1->noise, 2->medium_error, 4->... (def=0)"); MODULE_PARM_DESC(ptype, "SCSI peripheral type(def=0[disk])"); MODULE_PARM_DESC(scsi_level, "SCSI level to simulate(def=5[SPC-3])"); +MODULE_PARM_DESC(virtual_gb, "virtual gigabyte size (def=0 -> use dev_size_mb)"); static char sdebug_info[256]; @@ -1548,6 +2334,24 @@ static ssize_t sdebug_dsense_store(struct device_driver * ddp, DRIVER_ATTR(dsense, S_IRUGO | S_IWUSR, sdebug_dsense_show, sdebug_dsense_store); +static ssize_t sdebug_no_lun_0_show(struct device_driver * ddp, char * buf) +{ + return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_no_lun_0); +} +static ssize_t sdebug_no_lun_0_store(struct device_driver * ddp, + const char * buf, size_t count) +{ + int n; + + if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) { + scsi_debug_no_lun_0 = n; + return count; + } + return -EINVAL; +} +DRIVER_ATTR(no_lun_0, S_IRUGO | S_IWUSR, sdebug_no_lun_0_show, + sdebug_no_lun_0_store); + static ssize_t sdebug_num_tgts_show(struct device_driver * ddp, char * buf) { return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_num_tgts); @@ -1623,6 +2427,29 @@ static ssize_t sdebug_scsi_level_show(struct device_driver * ddp, char * buf) } DRIVER_ATTR(scsi_level, S_IRUGO, sdebug_scsi_level_show, NULL); +static ssize_t sdebug_virtual_gb_show(struct device_driver * ddp, char * buf) +{ + return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_virtual_gb); +} +static ssize_t sdebug_virtual_gb_store(struct device_driver * ddp, + const char * buf, size_t count) +{ + int n; + + if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) { + scsi_debug_virtual_gb = n; + if (scsi_debug_virtual_gb > 0) { + sdebug_capacity = 2048 * 1024; + sdebug_capacity *= scsi_debug_virtual_gb; + } else + sdebug_capacity = sdebug_store_sectors; + return count; + } + return -EINVAL; +} +DRIVER_ATTR(virtual_gb, S_IRUGO | S_IWUSR, sdebug_virtual_gb_show, + sdebug_virtual_gb_store); + static ssize_t sdebug_add_host_show(struct device_driver * ddp, char * buf) { return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_add_host); @@ -1660,19 +2487,22 @@ static ssize_t sdebug_add_host_store(struct device_driver * ddp, DRIVER_ATTR(add_host, S_IRUGO | S_IWUSR, sdebug_add_host_show, sdebug_add_host_store); -static void do_create_driverfs_files(void) +static int do_create_driverfs_files(void) { - driver_create_file(&sdebug_driverfs_driver, &driver_attr_add_host); - driver_create_file(&sdebug_driverfs_driver, &driver_attr_delay); - driver_create_file(&sdebug_driverfs_driver, &driver_attr_dev_size_mb); - driver_create_file(&sdebug_driverfs_driver, &driver_attr_dsense); - driver_create_file(&sdebug_driverfs_driver, &driver_attr_every_nth); - driver_create_file(&sdebug_driverfs_driver, &driver_attr_max_luns); - driver_create_file(&sdebug_driverfs_driver, &driver_attr_num_tgts); - driver_create_file(&sdebug_driverfs_driver, &driver_attr_num_parts); - driver_create_file(&sdebug_driverfs_driver, &driver_attr_ptype); - driver_create_file(&sdebug_driverfs_driver, &driver_attr_opts); - driver_create_file(&sdebug_driverfs_driver, &driver_attr_scsi_level); + int ret; + + ret = driver_create_file(&sdebug_driverfs_driver, &driver_attr_add_host); + ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_delay); + ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dev_size_mb); + ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dsense); + ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_every_nth); + ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_max_luns); + ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_num_tgts); + ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_num_parts); + ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_ptype); + ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_opts); + ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_scsi_level); + return ret; } static void do_remove_driverfs_files(void) @@ -1692,14 +2522,20 @@ static void do_remove_driverfs_files(void) static int __init scsi_debug_init(void) { - unsigned long sz; + unsigned int sz; int host_to_add; int k; + int ret; if (scsi_debug_dev_size_mb < 1) scsi_debug_dev_size_mb = 1; /* force minimum 1 MB ramdisk */ - sdebug_store_size = (unsigned long)scsi_debug_dev_size_mb * 1048576; - sdebug_capacity = sdebug_store_size / SECT_SIZE; + sdebug_store_size = (unsigned int)scsi_debug_dev_size_mb * 1048576; + sdebug_store_sectors = sdebug_store_size / SECT_SIZE; + if (scsi_debug_virtual_gb > 0) { + sdebug_capacity = 2048 * 1024; + sdebug_capacity *= scsi_debug_virtual_gb; + } else + sdebug_capacity = sdebug_store_sectors; /* play around with geometry, don't waste too much on track 0 */ sdebug_heads = 8; @@ -1728,12 +2564,32 @@ static int __init scsi_debug_init(void) if (scsi_debug_num_parts > 0) sdebug_build_parts(fake_storep); - init_all_queued(); + ret = device_register(&pseudo_primary); + if (ret < 0) { + printk(KERN_WARNING "scsi_debug: device_register error: %d\n", + ret); + goto free_vm; + } + ret = bus_register(&pseudo_lld_bus); + if (ret < 0) { + printk(KERN_WARNING "scsi_debug: bus_register error: %d\n", + ret); + goto dev_unreg; + } + ret = driver_register(&sdebug_driverfs_driver); + if (ret < 0) { + printk(KERN_WARNING "scsi_debug: driver_register error: %d\n", + ret); + goto bus_unreg; + } + ret = do_create_driverfs_files(); + if (ret < 0) { + printk(KERN_WARNING "scsi_debug: driver_create_file error: %d\n", + ret); + goto del_files; + } - device_register(&pseudo_primary); - bus_register(&pseudo_lld_bus); - driver_register(&sdebug_driverfs_driver); - do_create_driverfs_files(); + init_all_queued(); sdebug_driver_template.proc_name = (char *)sdebug_proc_name; @@ -1753,6 +2609,18 @@ static int __init scsi_debug_init(void) scsi_debug_add_host); } return 0; + +del_files: + do_remove_driverfs_files(); + driver_unregister(&sdebug_driverfs_driver); +bus_unreg: + bus_unregister(&pseudo_lld_bus); +dev_unreg: + device_unregister(&pseudo_primary); +free_vm: + vfree(fake_storep); + + return ret; } static void __exit scsi_debug_exit(void) @@ -1813,7 +2681,7 @@ static int sdebug_add_adapter(void) struct sdebug_dev_info *sdbg_devinfo; struct list_head *lh, *lh_sf; - sdbg_host = kzalloc(sizeof(*sdbg_host), GFP_KERNEL); + sdbg_host = kzalloc(sizeof(*sdbg_host),GFP_KERNEL); if (NULL == sdbg_host) { printk(KERN_ERR "%s: out of memory at line %d\n", @@ -1825,7 +2693,7 @@ static int sdebug_add_adapter(void) devs_per_host = scsi_debug_num_tgts * scsi_debug_max_luns; for (k = 0; k < devs_per_host; k++) { - sdbg_devinfo = kzalloc(sizeof(*sdbg_devinfo), GFP_KERNEL); + sdbg_devinfo = kzalloc(sizeof(*sdbg_devinfo),GFP_KERNEL); if (NULL == sdbg_devinfo) { printk(KERN_ERR "%s: out of memory at line %d\n", __FUNCTION__, __LINE__); @@ -1906,7 +2774,7 @@ static int sdebug_driver_probe(struct device * dev) hpnt->max_id = scsi_debug_num_tgts + 1; else hpnt->max_id = scsi_debug_num_tgts; - hpnt->max_lun = scsi_debug_max_luns; + hpnt->max_lun = SAM2_WLUN_REPORT_LUNS; /* = scsi_debug_max_luns; */ error = scsi_add_host(hpnt, &sdbg_host->dev); if (error) { @@ -1960,7 +2828,7 @@ static void sdebug_max_tgts_luns(void) hpnt->max_id = scsi_debug_num_tgts + 1; else hpnt->max_id = scsi_debug_num_tgts; - hpnt->max_lun = scsi_debug_max_luns; + hpnt->max_lun = SAM2_WLUN_REPORT_LUNS; /* scsi_debug_max_luns; */ } spin_unlock(&sdebug_host_list_lock); } diff --git a/drivers/scsi/scsi_devinfo.c b/drivers/scsi/scsi_devinfo.c index 62f8cb7b3..3d0429bc1 100644 --- a/drivers/scsi/scsi_devinfo.c +++ b/drivers/scsi/scsi_devinfo.c @@ -159,8 +159,10 @@ static struct { {"HITACHI", "DF400", "*", BLIST_SPARSELUN}, {"HITACHI", "DF500", "*", BLIST_SPARSELUN}, {"HITACHI", "DF600", "*", BLIST_SPARSELUN}, + {"HITACHI", "DISK-SUBSYSTEM", "*", BLIST_ATTACH_PQ3 | BLIST_SPARSELUN | BLIST_LARGELUN}, + {"HITACHI", "OPEN-E", "*", BLIST_ATTACH_PQ3 | BLIST_SPARSELUN | BLIST_LARGELUN}, {"HP", "A6189A", NULL, BLIST_SPARSELUN | BLIST_LARGELUN}, /* HP VA7400 */ - {"HP", "OPEN-", "*", BLIST_SPARSELUN | BLIST_LARGELUN}, /* HP XP Arrays */ + {"HP", "OPEN-", "*", BLIST_REPORTLUN2}, /* HP XP Arrays */ {"HP", "NetRAID-4M", NULL, BLIST_FORCELUN}, {"HP", "HSV100", NULL, BLIST_REPORTLUN2 | BLIST_NOSTARTONADD}, {"HP", "C1557A", NULL, BLIST_FORCELUN}, diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index 1c75646f9..3d355d054 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c @@ -26,13 +26,13 @@ #include #include +#include #include #include #include #include #include #include -#include #include "scsi_priv.h" #include "scsi_logging.h" @@ -57,6 +57,28 @@ void scsi_eh_wakeup(struct Scsi_Host *shost) } } +/** + * scsi_schedule_eh - schedule EH for SCSI host + * @shost: SCSI host to invoke error handling on. + * + * Schedule SCSI EH without scmd. + **/ +void scsi_schedule_eh(struct Scsi_Host *shost) +{ + unsigned long flags; + + spin_lock_irqsave(shost->host_lock, flags); + + if (scsi_host_set_state(shost, SHOST_RECOVERY) == 0 || + scsi_host_set_state(shost, SHOST_CANCEL_RECOVERY) == 0) { + shost->host_eh_scheduled++; + scsi_eh_wakeup(shost); + } + + spin_unlock_irqrestore(shost->host_lock, flags); +} +EXPORT_SYMBOL_GPL(scsi_schedule_eh); + /** * scsi_eh_scmd_add - add scsi cmd to error handling. * @scmd: scmd to run eh on. @@ -438,21 +460,72 @@ static void scsi_eh_done(struct scsi_cmnd *scmd) * Return value: * SUCCESS or FAILED or NEEDS_RETRY **/ -static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, int timeout) +static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, unsigned char *cmnd, + int cmnd_size, int timeout, int copy_sense) { struct scsi_device *sdev = scmd->device; struct Scsi_Host *shost = sdev->host; - DECLARE_COMPLETION(done); + int old_result = scmd->result; + DECLARE_COMPLETION_ONSTACK(done); unsigned long timeleft; unsigned long flags; + unsigned char old_cmnd[MAX_COMMAND_SIZE]; + enum dma_data_direction old_data_direction; + unsigned short old_use_sg; + unsigned char old_cmd_len; + unsigned old_bufflen; + void *old_buffer; int rtn; + /* + * We need saved copies of a number of fields - this is because + * error handling may need to overwrite these with different values + * to run different commands, and once error handling is complete, + * we will need to restore these values prior to running the actual + * command. + */ + old_buffer = scmd->request_buffer; + old_bufflen = scmd->request_bufflen; + memcpy(old_cmnd, scmd->cmnd, sizeof(scmd->cmnd)); + old_data_direction = scmd->sc_data_direction; + old_cmd_len = scmd->cmd_len; + old_use_sg = scmd->use_sg; + + memset(scmd->cmnd, 0, sizeof(scmd->cmnd)); + memcpy(scmd->cmnd, cmnd, cmnd_size); + + if (copy_sense) { + int gfp_mask = GFP_ATOMIC; + + if (shost->hostt->unchecked_isa_dma) + gfp_mask |= __GFP_DMA; + + scmd->sc_data_direction = DMA_FROM_DEVICE; + scmd->request_bufflen = 252; + scmd->request_buffer = kzalloc(scmd->request_bufflen, gfp_mask); + if (!scmd->request_buffer) + return FAILED; + } else { + scmd->request_buffer = NULL; + scmd->request_bufflen = 0; + scmd->sc_data_direction = DMA_NONE; + } + + scmd->underflow = 0; + scmd->use_sg = 0; + scmd->cmd_len = COMMAND_SIZE(scmd->cmnd[0]); + if (sdev->scsi_level <= SCSI_2) scmd->cmnd[1] = (scmd->cmnd[1] & 0x1f) | (sdev->lun << 5 & 0xe0); + /* + * Zero the sense buffer. The scsi spec mandates that any + * untransferred sense data should be interpreted as being zero. + */ + memset(scmd->sense_buffer, 0, sizeof(scmd->sense_buffer)); + shost->eh_action = &done; - scmd->request->rq_status = RQ_SCSI_BUSY; spin_lock_irqsave(shost->host_lock, flags); scsi_log_send(scmd); @@ -461,7 +534,6 @@ static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, int timeout) timeleft = wait_for_completion_timeout(&done, timeout); - scmd->request->rq_status = RQ_SCSI_DONE; shost->eh_action = NULL; scsi_log_completion(scmd, SUCCESS); @@ -502,6 +574,29 @@ static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, int timeout) rtn = FAILED; } + + /* + * Last chance to have valid sense data. + */ + if (copy_sense) { + if (!SCSI_SENSE_VALID(scmd)) { + memcpy(scmd->sense_buffer, scmd->request_buffer, + sizeof(scmd->sense_buffer)); + } + kfree(scmd->request_buffer); + } + + + /* + * Restore original data + */ + scmd->request_buffer = old_buffer; + scmd->request_bufflen = old_bufflen; + memcpy(scmd->cmnd, old_cmnd, sizeof(scmd->cmnd)); + scmd->sc_data_direction = old_data_direction; + scmd->cmd_len = old_cmd_len; + scmd->use_sg = old_use_sg; + scmd->result = old_result; return rtn; } @@ -517,56 +612,9 @@ static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, int timeout) static int scsi_request_sense(struct scsi_cmnd *scmd) { static unsigned char generic_sense[6] = - {REQUEST_SENSE, 0, 0, 0, 252, 0}; - unsigned char *scsi_result; - int saved_result; - int rtn; - - memcpy(scmd->cmnd, generic_sense, sizeof(generic_sense)); + {REQUEST_SENSE, 0, 0, 0, 252, 0}; - scsi_result = kmalloc(252, GFP_ATOMIC | ((scmd->device->host->hostt->unchecked_isa_dma) ? __GFP_DMA : 0)); - - - if (unlikely(!scsi_result)) { - printk(KERN_ERR "%s: cannot allocate scsi_result.\n", - __FUNCTION__); - return FAILED; - } - - /* - * zero the sense buffer. some host adapters automatically always - * request sense, so it is not a good idea that - * scmd->request_buffer and scmd->sense_buffer point to the same - * address (db). 0 is not a valid sense code. - */ - memset(scmd->sense_buffer, 0, sizeof(scmd->sense_buffer)); - memset(scsi_result, 0, 252); - - saved_result = scmd->result; - scmd->request_buffer = scsi_result; - scmd->request_bufflen = 252; - scmd->use_sg = 0; - scmd->cmd_len = COMMAND_SIZE(scmd->cmnd[0]); - scmd->sc_data_direction = DMA_FROM_DEVICE; - scmd->underflow = 0; - - rtn = scsi_send_eh_cmnd(scmd, SENSE_TIMEOUT); - - /* last chance to have valid sense data */ - if(!SCSI_SENSE_VALID(scmd)) { - memcpy(scmd->sense_buffer, scmd->request_buffer, - sizeof(scmd->sense_buffer)); - } - - kfree(scsi_result); - - /* - * when we eventually call scsi_finish, we really wish to complete - * the original request, so let's restore the original data. (db) - */ - scsi_setup_cmd_retry(scmd); - scmd->result = saved_result; - return rtn; + return scsi_send_eh_cmnd(scmd, generic_sense, 6, SENSE_TIMEOUT, 1); } /** @@ -585,12 +633,6 @@ void scsi_eh_finish_cmd(struct scsi_cmnd *scmd, struct list_head *done_q) { scmd->device->host->host_failed--; scmd->eh_eflags = 0; - - /* - * set this back so that the upper level can correctly free up - * things. - */ - scsi_setup_cmd_retry(scmd); list_move_tail(&scmd->eh_entry, done_q); } EXPORT_SYMBOL(scsi_eh_finish_cmd); @@ -695,47 +737,23 @@ static int scsi_eh_tur(struct scsi_cmnd *scmd) { static unsigned char tur_command[6] = {TEST_UNIT_READY, 0, 0, 0, 0, 0}; int retry_cnt = 1, rtn; - int saved_result; retry_tur: - memcpy(scmd->cmnd, tur_command, sizeof(tur_command)); + rtn = scsi_send_eh_cmnd(scmd, tur_command, 6, SENSE_TIMEOUT, 0); - /* - * zero the sense buffer. the scsi spec mandates that any - * untransferred sense data should be interpreted as being zero. - */ - memset(scmd->sense_buffer, 0, sizeof(scmd->sense_buffer)); - - saved_result = scmd->result; - scmd->request_buffer = NULL; - scmd->request_bufflen = 0; - scmd->use_sg = 0; - scmd->cmd_len = COMMAND_SIZE(scmd->cmnd[0]); - scmd->underflow = 0; - scmd->sc_data_direction = DMA_NONE; - - rtn = scsi_send_eh_cmnd(scmd, SENSE_TIMEOUT); - - /* - * when we eventually call scsi_finish, we really wish to complete - * the original request, so let's restore the original data. (db) - */ - scsi_setup_cmd_retry(scmd); - scmd->result = saved_result; - - /* - * hey, we are done. let's look to see what happened. - */ SCSI_LOG_ERROR_RECOVERY(3, printk("%s: scmd %p rtn %x\n", __FUNCTION__, scmd, rtn)); - if (rtn == SUCCESS) - return 0; - else if (rtn == NEEDS_RETRY) { + + switch (rtn) { + case NEEDS_RETRY: if (retry_cnt--) goto retry_tur; + /*FALLTHRU*/ + case SUCCESS: return 0; + default: + return 1; } - return 1; } /** @@ -817,44 +835,16 @@ static int scsi_try_bus_device_reset(struct scsi_cmnd *scmd) static int scsi_eh_try_stu(struct scsi_cmnd *scmd) { static unsigned char stu_command[6] = {START_STOP, 0, 0, 0, 1, 0}; - int rtn; - int saved_result; - - if (!scmd->device->allow_restart) - return 1; - - memcpy(scmd->cmnd, stu_command, sizeof(stu_command)); - - /* - * zero the sense buffer. the scsi spec mandates that any - * untransferred sense data should be interpreted as being zero. - */ - memset(scmd->sense_buffer, 0, sizeof(scmd->sense_buffer)); - - saved_result = scmd->result; - scmd->request_buffer = NULL; - scmd->request_bufflen = 0; - scmd->use_sg = 0; - scmd->cmd_len = COMMAND_SIZE(scmd->cmnd[0]); - scmd->underflow = 0; - scmd->sc_data_direction = DMA_NONE; - rtn = scsi_send_eh_cmnd(scmd, START_UNIT_TIMEOUT); + if (scmd->device->allow_restart) { + int rtn; - /* - * when we eventually call scsi_finish, we really wish to complete - * the original request, so let's restore the original data. (db) - */ - scsi_setup_cmd_retry(scmd); - scmd->result = saved_result; + rtn = scsi_send_eh_cmnd(scmd, stu_command, 6, + START_UNIT_TIMEOUT, 0); + if (rtn == SUCCESS) + return 0; + } - /* - * hey, we are done. let's look to see what happened. - */ - SCSI_LOG_ERROR_RECOVERY(3, printk("%s: scmd %p rtn %x\n", - __FUNCTION__, scmd, rtn)); - if (rtn == SUCCESS) - return 0; return 1; } @@ -1517,7 +1507,7 @@ int scsi_error_handler(void *data) */ set_current_state(TASK_INTERRUPTIBLE); while (!kthread_should_stop()) { - if (shost->host_failed == 0 || + if ((shost->host_failed == 0 && shost->host_eh_scheduled == 0) || shost->host_failed != shost->host_busy) { SCSI_LOG_ERROR_RECOVERY(1, printk("Error handler scsi_eh_%d sleeping\n", @@ -1652,27 +1642,24 @@ int scsi_reset_provider(struct scsi_device *dev, int flag) { struct scsi_cmnd *scmd = scsi_get_command(dev, GFP_KERNEL); + struct Scsi_Host *shost = dev->host; struct request req; + unsigned long flags; int rtn; scmd->request = &req; memset(&scmd->eh_timeout, 0, sizeof(scmd->eh_timeout)); - scmd->request->rq_status = RQ_SCSI_BUSY; memset(&scmd->cmnd, '\0', sizeof(scmd->cmnd)); scmd->scsi_done = scsi_reset_provider_done_command; scmd->done = NULL; - scmd->buffer = NULL; - scmd->bufflen = 0; scmd->request_buffer = NULL; scmd->request_bufflen = 0; scmd->cmd_len = 0; scmd->sc_data_direction = DMA_BIDIRECTIONAL; - scmd->sc_request = NULL; - scmd->sc_magic = SCSI_CMND_MAGIC; init_timer(&scmd->eh_timeout); @@ -1682,6 +1669,10 @@ scsi_reset_provider(struct scsi_device *dev, int flag) */ scmd->pid = 0; + spin_lock_irqsave(shost->host_lock, flags); + shost->tmf_in_progress = 1; + spin_unlock_irqrestore(shost->host_lock, flags); + switch (flag) { case SCSI_TRY_RESET_DEVICE: rtn = scsi_try_bus_device_reset(scmd); @@ -1700,6 +1691,22 @@ scsi_reset_provider(struct scsi_device *dev, int flag) rtn = FAILED; } + spin_lock_irqsave(shost->host_lock, flags); + shost->tmf_in_progress = 0; + spin_unlock_irqrestore(shost->host_lock, flags); + + /* + * be sure to wake up anyone who was sleeping or had their queue + * suspended while we performed the TMF. + */ + SCSI_LOG_ERROR_RECOVERY(3, + printk("%s: waking up host to restart after TMF\n", + __FUNCTION__)); + + wake_up(&shost->host_wait); + + scsi_run_host_queues(shost); + scsi_next_command(scmd); return rtn; } @@ -1769,14 +1776,6 @@ int scsi_normalize_sense(const u8 *sense_buffer, int sb_len, } EXPORT_SYMBOL(scsi_normalize_sense); -int scsi_request_normalize_sense(struct scsi_request *sreq, - struct scsi_sense_hdr *sshdr) -{ - return scsi_normalize_sense(sreq->sr_sense_buffer, - sizeof(sreq->sr_sense_buffer), sshdr); -} -EXPORT_SYMBOL(scsi_request_normalize_sense); - int scsi_command_normalize_sense(struct scsi_cmnd *cmd, struct scsi_sense_hdr *sshdr) { diff --git a/drivers/scsi/scsi_ioctl.c b/drivers/scsi/scsi_ioctl.c index 46ababf31..32293f451 100644 --- a/drivers/scsi/scsi_ioctl.c +++ b/drivers/scsi/scsi_ioctl.c @@ -15,11 +15,11 @@ #include #include +#include #include #include #include #include -#include #include #include diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index faee4757c..077c1c691 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -19,18 +19,18 @@ #include #include +#include #include #include #include #include #include -#include #include "scsi_priv.h" #include "scsi_logging.h" -#define SG_MEMPOOL_NR (sizeof(scsi_sg_pools)/sizeof(struct scsi_host_sg_pool)) +#define SG_MEMPOOL_NR ARRAY_SIZE(scsi_sg_pools) #define SG_MEMPOOL_SIZE 32 struct scsi_host_sg_pool { @@ -83,7 +83,7 @@ static void scsi_unprep_request(struct request *req) struct scsi_cmnd *cmd = req->special; req->flags &= ~REQ_DONTPREP; - req->special = (req->flags & REQ_SPECIAL) ? cmd->sc_request : NULL; + req->special = NULL; scsi_put_command(cmd); } @@ -161,72 +161,6 @@ int scsi_queue_insert(struct scsi_cmnd *cmd, int reason) return 0; } -/* - * Function: scsi_do_req - * - * Purpose: Queue a SCSI request - * - * Arguments: sreq - command descriptor. - * cmnd - actual SCSI command to be performed. - * buffer - data buffer. - * bufflen - size of data buffer. - * done - completion function to be run. - * timeout - how long to let it run before timeout. - * retries - number of retries we allow. - * - * Lock status: No locks held upon entry. - * - * Returns: Nothing. - * - * Notes: This function is only used for queueing requests for things - * like ioctls and character device requests - this is because - * we essentially just inject a request into the queue for the - * device. - * - * In order to support the scsi_device_quiesce function, we - * now inject requests on the *head* of the device queue - * rather than the tail. - */ -void scsi_do_req(struct scsi_request *sreq, const void *cmnd, - void *buffer, unsigned bufflen, - void (*done)(struct scsi_cmnd *), - int timeout, int retries) -{ - /* - * If the upper level driver is reusing these things, then - * we should release the low-level block now. Another one will - * be allocated later when this request is getting queued. - */ - __scsi_release_request(sreq); - - /* - * Our own function scsi_done (which marks the host as not busy, - * disables the timeout counter, etc) will be called by us or by the - * scsi_hosts[host].queuecommand() function needs to also call - * the completion function for the high level driver. - */ - memcpy(sreq->sr_cmnd, cmnd, sizeof(sreq->sr_cmnd)); - sreq->sr_bufflen = bufflen; - sreq->sr_buffer = buffer; - sreq->sr_allowed = retries; - sreq->sr_done = done; - sreq->sr_timeout_per_command = timeout; - - if (sreq->sr_cmd_len == 0) - sreq->sr_cmd_len = COMMAND_SIZE(sreq->sr_cmnd[0]); - - /* - * 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 - */ - sreq->sr_request->flags &= ~REQ_DONTPREP; - blk_insert_request(sreq->sr_device->request_queue, sreq->sr_request, - 1, sreq); -} -EXPORT_SYMBOL(scsi_do_req); - /** * scsi_execute - insert request and wait for the result * @sdev: scsi device @@ -502,60 +436,16 @@ EXPORT_SYMBOL_GPL(scsi_execute_async); * * Arguments: cmd - command that is ready to be queued. * - * Returns: Nothing - * * Notes: This function has the job of initializing a number of * fields related to error handling. Typically this will * be called once for each command, as required. */ -static int scsi_init_cmd_errh(struct scsi_cmnd *cmd) +static void scsi_init_cmd_errh(struct scsi_cmnd *cmd) { cmd->serial_number = 0; - memset(cmd->sense_buffer, 0, sizeof cmd->sense_buffer); - if (cmd->cmd_len == 0) cmd->cmd_len = COMMAND_SIZE(cmd->cmnd[0]); - - /* - * We need saved copies of a number of fields - this is because - * error handling may need to overwrite these with different values - * to run different commands, and once error handling is complete, - * we will need to restore these values prior to running the actual - * command. - */ - cmd->old_use_sg = cmd->use_sg; - cmd->old_cmd_len = cmd->cmd_len; - cmd->sc_old_data_direction = cmd->sc_data_direction; - cmd->old_underflow = cmd->underflow; - memcpy(cmd->data_cmnd, cmd->cmnd, sizeof(cmd->cmnd)); - cmd->buffer = cmd->request_buffer; - cmd->bufflen = cmd->request_bufflen; - - return 1; -} - -/* - * Function: scsi_setup_cmd_retry() - * - * Purpose: Restore the command state for a retry - * - * Arguments: cmd - command to be restored - * - * Returns: Nothing - * - * Notes: Immediately prior to retrying a command, we need - * to restore certain fields that we saved above. - */ -void scsi_setup_cmd_retry(struct scsi_cmnd *cmd) -{ - memcpy(cmd->cmnd, cmd->data_cmnd, sizeof(cmd->data_cmnd)); - cmd->request_buffer = cmd->buffer; - cmd->request_bufflen = cmd->bufflen; - cmd->use_sg = cmd->old_use_sg; - cmd->cmd_len = cmd->old_cmd_len; - cmd->sc_data_direction = cmd->sc_old_data_direction; - cmd->underflow = cmd->old_underflow; } void scsi_device_unbusy(struct scsi_device *sdev) @@ -566,7 +456,7 @@ void scsi_device_unbusy(struct scsi_device *sdev) spin_lock_irqsave(shost->host_lock, flags); shost->host_busy--; if (unlikely(scsi_host_in_recovery(shost) && - shost->host_failed)) + (shost->host_failed || shost->host_eh_scheduled))) scsi_eh_wakeup(shost); spin_unlock(shost->host_lock); spin_lock(sdev->request_queue->queue_lock); @@ -873,22 +763,13 @@ static void scsi_free_sgtable(struct scatterlist *sgl, int index) */ static void scsi_release_buffers(struct scsi_cmnd *cmd) { - struct request *req = cmd->request; - - /* - * Free up any indirection buffers we allocated for DMA purposes. - */ if (cmd->use_sg) scsi_free_sgtable(cmd->request_buffer, cmd->sglist_len); - else if (cmd->request_buffer != req->buffer) - kfree(cmd->request_buffer); /* * Zero these out. They now point to freed memory, and it is * dangerous to hang onto the pointers. */ - cmd->buffer = NULL; - cmd->bufflen = 0; cmd->request_buffer = NULL; cmd->request_bufflen = 0; } @@ -921,11 +802,10 @@ static void scsi_release_buffers(struct scsi_cmnd *cmd) * b) We can just use scsi_requeue_command() here. This would * be used if we just wanted to retry, for example. */ -void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes, - unsigned int block_bytes) +void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) { int result = cmd->result; - int this_count = cmd->bufflen; + int this_count = cmd->request_bufflen; request_queue_t *q = cmd->device->request_queue; struct request *req = cmd->request; int clear_errors = 1; @@ -933,28 +813,14 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes, int sense_valid = 0; int sense_deferred = 0; - /* - * Free up any indirection buffers we allocated for DMA purposes. - * For the case of a READ, we need to copy the data out of the - * bounce buffer and into the real buffer. - */ - if (cmd->use_sg) - scsi_free_sgtable(cmd->buffer, cmd->sglist_len); - else if (cmd->buffer != req->buffer) { - if (rq_data_dir(req) == READ) { - unsigned long flags; - char *to = bio_kmap_irq(req->bio, &flags); - memcpy(to, cmd->buffer, cmd->bufflen); - bio_kunmap_irq(to, &flags); - } - kfree(cmd->buffer); - } + scsi_release_buffers(cmd); if (result) { sense_valid = scsi_command_normalize_sense(cmd, &sshdr); if (sense_valid) sense_deferred = scsi_sense_is_deferred(&sshdr); } + if (blk_pc_request(req)) { /* SG_IO ioctl from block level */ req->errors = result; if (result) { @@ -974,100 +840,74 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes, req->data_len = cmd->resid; } - /* - * Zero these out. They now point to freed memory, and it is - * dangerous to hang onto the pointers. - */ - cmd->buffer = NULL; - cmd->bufflen = 0; - cmd->request_buffer = NULL; - cmd->request_bufflen = 0; - /* * Next deal with any sectors which we were able to correctly * handle. */ - if (good_bytes >= 0) { - SCSI_LOG_HLCOMPLETE(1, printk("%ld sectors total, %d bytes done.\n", - req->nr_sectors, good_bytes)); - SCSI_LOG_HLCOMPLETE(1, printk("use_sg is %d\n", cmd->use_sg)); + SCSI_LOG_HLCOMPLETE(1, printk("%ld sectors total, " + "%d bytes done.\n", + req->nr_sectors, good_bytes)); + SCSI_LOG_HLCOMPLETE(1, printk("use_sg is %d\n", cmd->use_sg)); - if (clear_errors) - req->errors = 0; - /* - * If multiple sectors are requested in one buffer, then - * they will have been finished off by the first command. - * If not, then we have a multi-buffer command. - * - * If block_bytes != 0, it means we had a medium error - * of some sort, and that we want to mark some number of - * sectors as not uptodate. Thus we want to inhibit - * requeueing right here - we will requeue down below - * when we handle the bad sectors. - */ + if (clear_errors) + req->errors = 0; - /* - * If the command completed without error, then either - * finish off the rest of the command, or start a new one. - */ - if (scsi_end_request(cmd, 1, good_bytes, result == 0) == NULL) - return; - } - /* - * Now, if we were good little boys and girls, Santa left us a request - * sense buffer. We can extract information from this, so we - * can choose a block to remap, etc. + /* A number of bytes were successfully read. If there + * are leftovers and there is some kind of error + * (result != 0), retry the rest. + */ + if (scsi_end_request(cmd, 1, good_bytes, result == 0) == NULL) + return; + + /* good_bytes = 0, or (inclusive) there were leftovers and + * result = 0, so scsi_end_request couldn't retry. */ if (sense_valid && !sense_deferred) { switch (sshdr.sense_key) { case UNIT_ATTENTION: if (cmd->device->removable) { - /* detected disc change. set a bit + /* Detected disc change. Set a bit * and quietly refuse further access. */ cmd->device->changed = 1; - scsi_end_request(cmd, 0, - this_count, 1); + scsi_end_request(cmd, 0, this_count, 1); return; } else { - /* - * Must have been a power glitch, or a - * bus reset. Could not have been a - * media change, so we just retry the - * request and see what happens. - */ + /* Must have been a power glitch, or a + * bus reset. Could not have been a + * media change, so we just retry the + * request and see what happens. + */ scsi_requeue_command(q, cmd); return; } break; case ILLEGAL_REQUEST: - /* - * If we had an ILLEGAL REQUEST returned, then we may - * have performed an unsupported command. The only - * thing this should be would be a ten byte read where - * only a six byte read was supported. Also, on a - * system where READ CAPACITY failed, we may have read - * past the end of the disk. - */ + /* If we had an ILLEGAL REQUEST returned, then + * we may have performed an unsupported + * command. The only thing this should be + * would be a ten byte read where only a six + * byte read was supported. Also, on a system + * where READ CAPACITY failed, we may have + * read past the end of the disk. + */ 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; - /* - * This will cause a retry with a 6-byte - * command. + /* This will cause a retry with a + * 6-byte command. */ scsi_requeue_command(q, cmd); - result = 0; + return; } else { scsi_end_request(cmd, 0, this_count, 1); return; } break; case NOT_READY: - /* - * If the device is in the process of becoming + /* If the device is in the process of becoming * ready, or has a temporary blockage, retry. */ if (sshdr.asc == 0x04) { @@ -1087,7 +927,7 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes, } if (!(req->flags & REQ_QUIET)) { scmd_printk(KERN_INFO, cmd, - "Device not ready: "); + "Device not ready: "); scsi_print_sense_hdr("", &sshdr); } scsi_end_request(cmd, 0, this_count, 1); @@ -1095,21 +935,21 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes, case VOLUME_OVERFLOW: if (!(req->flags & REQ_QUIET)) { scmd_printk(KERN_INFO, cmd, - "Volume overflow, CDB: "); - __scsi_print_command(cmd->data_cmnd); + "Volume overflow, CDB: "); + __scsi_print_command(cmd->cmnd); scsi_print_sense("", cmd); } - scsi_end_request(cmd, 0, block_bytes, 1); + /* See SSC3rXX or current. */ + scsi_end_request(cmd, 0, this_count, 1); return; default: break; } - } /* driver byte != 0 */ + } if (host_byte(result) == DID_RESET) { - /* - * Third party bus reset or reset for error - * recovery reasons. Just retry the request - * and see what happens. + /* Third party bus reset or reset for error recovery + * reasons. Just retry the request and see what + * happens. */ scsi_requeue_command(q, cmd); return; @@ -1117,21 +957,13 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes, if (result) { if (!(req->flags & REQ_QUIET)) { scmd_printk(KERN_INFO, cmd, - "SCSI error: return code = 0x%x\n", result); - + "SCSI error: return code = 0x%08x\n", + result); if (driver_byte(result) & DRIVER_SENSE) scsi_print_sense("", cmd); } - /* - * Mark a single buffer as not uptodate. Queue the remainder. - * We sometimes get this cruft in the event that a medium error - * isn't properly reported. - */ - block_bytes = req->hard_cur_sectors << 9; - if (!block_bytes) - block_bytes = req->data_len; - scsi_end_request(cmd, 0, block_bytes, 1); } + scsi_end_request(cmd, 0, this_count, !result); } EXPORT_SYMBOL(scsi_io_completion); @@ -1235,7 +1067,7 @@ static void scsi_blk_pc_done(struct scsi_cmnd *cmd) * 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); + scsi_io_completion(cmd, cmd->request_bufflen); } static void scsi_setup_blk_pc_cmnd(struct scsi_cmnd *cmd) @@ -1300,15 +1132,7 @@ static int scsi_prep_fn(struct request_queue *q, struct request *req) * at request->cmd, as this tells us the real story. */ if (req->flags & REQ_SPECIAL && req->special) { - struct scsi_request *sreq = req->special; - - if (sreq->sr_magic == SCSI_REQ_MAGIC) { - cmd = scsi_get_command(sreq->sr_device, GFP_ATOMIC); - if (unlikely(!cmd)) - goto defer; - scsi_init_cmd_from_req(cmd, sreq); - } else - cmd = req->special; + cmd = req->special; } else if (req->flags & (REQ_CMD | REQ_BLOCK_PC)) { if(unlikely(specials_only) && !(req->flags & REQ_SPECIAL)) { @@ -2124,6 +1948,7 @@ scsi_device_set_state(struct scsi_device *sdev, enum scsi_device_state state) switch (oldstate) { case SDEV_CREATED: case SDEV_RUNNING: + case SDEV_QUIESCE: case SDEV_OFFLINE: case SDEV_BLOCK: break; @@ -2134,6 +1959,9 @@ scsi_device_set_state(struct scsi_device *sdev, enum scsi_device_state state) case SDEV_DEL: switch (oldstate) { + case SDEV_CREATED: + case SDEV_RUNNING: + case SDEV_OFFLINE: case SDEV_CANCEL: break; default: @@ -2363,3 +2191,61 @@ scsi_target_unblock(struct device *dev) device_for_each_child(dev, NULL, target_unblock); } EXPORT_SYMBOL_GPL(scsi_target_unblock); + +/** + * scsi_kmap_atomic_sg - find and atomically map an sg-elemnt + * @sg: scatter-gather list + * @sg_count: number of segments in sg + * @offset: offset in bytes into sg, on return offset into the mapped area + * @len: bytes to map, on return number of bytes mapped + * + * Returns virtual address of the start of the mapped page + */ +void *scsi_kmap_atomic_sg(struct scatterlist *sg, int sg_count, + size_t *offset, size_t *len) +{ + int i; + size_t sg_len = 0, len_complete = 0; + struct page *page; + + for (i = 0; i < sg_count; i++) { + len_complete = sg_len; /* Complete sg-entries */ + sg_len += sg[i].length; + if (sg_len > *offset) + break; + } + + if (unlikely(i == sg_count)) { + printk(KERN_ERR "%s: Bytes in sg: %zu, requested offset %zu, " + "elements %d\n", + __FUNCTION__, sg_len, *offset, sg_count); + WARN_ON(1); + return NULL; + } + + /* Offset starting from the beginning of first page in this sg-entry */ + *offset = *offset - len_complete + sg[i].offset; + + /* Assumption: contiguous pages can be accessed as "page + i" */ + page = nth_page(sg[i].page, (*offset >> PAGE_SHIFT)); + *offset &= ~PAGE_MASK; + + /* Bytes in this sg-entry from *offset to the end of the page */ + sg_len = PAGE_SIZE - *offset; + if (*len > sg_len) + *len = sg_len; + + return kmap_atomic(page, KM_BIO_SRC_IRQ); +} +EXPORT_SYMBOL(scsi_kmap_atomic_sg); + +/** + * scsi_kunmap_atomic_sg - atomically unmap a virtual address, previously + * mapped with scsi_kmap_atomic_sg + * @virt: virtual address to be unmapped + */ +void scsi_kunmap_atomic_sg(void *virt) +{ + kunmap_atomic(virt, KM_BIO_SRC_IRQ); +} +EXPORT_SYMBOL(scsi_kunmap_atomic_sg); diff --git a/drivers/scsi/scsi_logging.h b/drivers/scsi/scsi_logging.h index e1722ba94..1f65139e1 100644 --- a/drivers/scsi/scsi_logging.h +++ b/drivers/scsi/scsi_logging.h @@ -1,7 +1,6 @@ #ifndef _SCSI_LOGGING_H #define _SCSI_LOGGING_H -#include /* * This defines the scsi logging feature. It is a means by which the user @@ -45,10 +44,12 @@ extern unsigned int scsi_logging_level; ((scsi_logging_level >> (SHIFT)) & ((1 << (BITS)) - 1)) #define SCSI_CHECK_LOGGING(SHIFT, BITS, LEVEL, CMD) \ -{ \ +do { \ if (unlikely((SCSI_LOG_LEVEL(SHIFT, BITS)) > (LEVEL))) \ - (CMD); \ -} + do { \ + CMD; \ + } while (0); \ +} while (0) #else #define SCSI_CHECK_LOGGING(SHIFT, BITS, LEVEL, CMD) #endif /* CONFIG_SCSI_LOGGING */ diff --git a/drivers/scsi/scsi_priv.h b/drivers/scsi/scsi_priv.h index 27c48274e..ae24c85aa 100644 --- a/drivers/scsi/scsi_priv.h +++ b/drivers/scsi/scsi_priv.h @@ -1,23 +1,15 @@ #ifndef _SCSI_PRIV_H #define _SCSI_PRIV_H -#include #include struct request_queue; struct scsi_cmnd; struct scsi_device; struct scsi_host_template; -struct scsi_request; struct Scsi_Host; -/* - * Magic values for certain scsi structs. Shouldn't ever be used. - */ -#define SCSI_CMND_MAGIC 0xE25C23A5 -#define SCSI_REQ_MAGIC 0x75F6D354 - /* * Scsi Error Handler Flags */ @@ -34,9 +26,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 void scsi_init_cmd_from_req(struct scsi_cmnd *cmd, - struct scsi_request *sreq); -extern void __scsi_release_request(struct scsi_request *sreq); extern void __scsi_done(struct scsi_cmnd *cmd); extern int scsi_retry_command(struct scsi_cmnd *cmd); #ifdef CONFIG_SCSI_LOGGING @@ -68,7 +57,6 @@ extern int scsi_eh_scmd_add(struct scsi_cmnd *, int); /* scsi_lib.c */ extern int scsi_maybe_unblock_host(struct scsi_device *sdev); -extern void scsi_setup_cmd_retry(struct scsi_cmnd *cmd); extern void scsi_device_unbusy(struct scsi_device *sdev); extern int scsi_queue_insert(struct scsi_cmnd *cmd, int reason); extern void scsi_next_command(struct scsi_cmnd *cmd); @@ -127,7 +115,7 @@ extern struct bus_type scsi_bus_type; * classes. */ -#define SCSI_DEVICE_BLOCK_MAX_TIMEOUT (HZ*60) +#define SCSI_DEVICE_BLOCK_MAX_TIMEOUT 600 /* units in seconds */ extern int scsi_internal_device_block(struct scsi_device *sdev); extern int scsi_internal_device_unblock(struct scsi_device *sdev); diff --git a/drivers/scsi/scsi_proc.c b/drivers/scsi/scsi_proc.c index 07be62bba..55200e4fd 100644 --- a/drivers/scsi/scsi_proc.c +++ b/drivers/scsi/scsi_proc.c @@ -266,8 +266,6 @@ static ssize_t proc_scsi_write(struct file *file, const char __user *buf, lun = simple_strtoul(p + 1, &p, 0); err = scsi_add_single_device(host, channel, id, lun); - if (err >= 0) - err = length; /* * Usage: echo "scsi remove-single-device 0 1 2 3" >/proc/scsi/scsi @@ -284,6 +282,13 @@ static ssize_t proc_scsi_write(struct file *file, const char __user *buf, err = scsi_remove_single_device(host, channel, id, lun); } + /* + * convert success returns so that we return the + * number of bytes consumed. + */ + if (!err) + err = length; + out: free_page((unsigned long)buffer); return err; diff --git a/drivers/scsi/scsi_sas_internal.h b/drivers/scsi/scsi_sas_internal.h index d76e6e3d8..e1edab45a 100644 --- a/drivers/scsi/scsi_sas_internal.h +++ b/drivers/scsi/scsi_sas_internal.h @@ -2,7 +2,8 @@ #define _SCSI_SAS_INTERNAL_H #define SAS_HOST_ATTRS 0 -#define SAS_PORT_ATTRS 17 +#define SAS_PHY_ATTRS 17 +#define SAS_PORT_ATTRS 1 #define SAS_RPORT_ATTRS 7 #define SAS_END_DEV_ATTRS 3 #define SAS_EXPANDER_ATTRS 7 @@ -13,12 +14,14 @@ struct sas_internal { struct sas_domain_function_template *dft; struct class_device_attribute private_host_attrs[SAS_HOST_ATTRS]; - struct class_device_attribute private_phy_attrs[SAS_PORT_ATTRS]; + struct class_device_attribute private_phy_attrs[SAS_PHY_ATTRS]; + struct class_device_attribute private_port_attrs[SAS_PORT_ATTRS]; struct class_device_attribute private_rphy_attrs[SAS_RPORT_ATTRS]; struct class_device_attribute private_end_dev_attrs[SAS_END_DEV_ATTRS]; struct class_device_attribute private_expander_attrs[SAS_EXPANDER_ATTRS]; struct transport_container phy_attr_cont; + struct transport_container port_attr_cont; struct transport_container rphy_attr_cont; struct transport_container end_dev_attr_cont; struct transport_container expander_attr_cont; @@ -28,7 +31,8 @@ struct sas_internal { * needed by scsi_sysfs.c */ struct class_device_attribute *host_attrs[SAS_HOST_ATTRS + 1]; - struct class_device_attribute *phy_attrs[SAS_PORT_ATTRS + 1]; + struct class_device_attribute *phy_attrs[SAS_PHY_ATTRS + 1]; + struct class_device_attribute *port_attrs[SAS_PORT_ATTRS + 1]; struct class_device_attribute *rphy_attrs[SAS_RPORT_ATTRS + 1]; struct class_device_attribute *end_dev_attrs[SAS_END_DEV_ATTRS + 1]; struct class_device_attribute *expander_attrs[SAS_EXPANDER_ATTRS + 1]; diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index 1a5474bd1..1bd92b9b4 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c @@ -25,7 +25,6 @@ * or a LUN is seen that cannot have a device attached to it. */ -#include #include #include #include @@ -33,11 +32,11 @@ #include #include +#include #include #include #include #include -#include #include #include @@ -810,12 +809,39 @@ static int scsi_add_lun(struct scsi_device *sdev, char *inq_result, int *bflags) static inline void scsi_destroy_sdev(struct scsi_device *sdev) { + scsi_device_set_state(sdev, SDEV_DEL); if (sdev->host->hostt->slave_destroy) sdev->host->hostt->slave_destroy(sdev); transport_destroy_device(&sdev->sdev_gendev); put_device(&sdev->sdev_gendev); } +#ifdef CONFIG_SCSI_LOGGING +/** + * scsi_inq_str - print INQUIRY data from min to max index, + * strip trailing whitespace + * @buf: Output buffer with at least end-first+1 bytes of space + * @inq: Inquiry buffer (input) + * @first: Offset of string into inq + * @end: Index after last character in inq + */ +static unsigned char *scsi_inq_str(unsigned char *buf, unsigned char *inq, + unsigned first, unsigned end) +{ + unsigned term = 0, idx; + + for (idx = 0; idx + first < end && idx + first < inq[4] + 5; idx++) { + if (inq[idx+first] > ' ') { + buf[idx] = inq[idx+first]; + term = idx+1; + } else { + buf[idx] = ' '; + } + } + buf[term] = 0; + return buf; +} +#endif /** * scsi_probe_and_add_lun - probe a LUN, if a LUN is found add it @@ -880,10 +906,12 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget, if (scsi_probe_lun(sdev, result, result_len, &bflags)) goto out_free_result; + if (bflagsp) + *bflagsp = bflags; /* * result contains valid SCSI INQUIRY data. */ - if ((result[0] >> 5) == 3) { + if (((result[0] >> 5) == 3) && !(bflags & BLIST_ATTACH_PQ3)) { /* * For a Peripheral qualifier 3 (011b), the SCSI * spec says: The device server is not capable of @@ -894,9 +922,22 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget, * logical disk configured at sdev->lun, but there * is a target id responding. */ - SCSI_LOG_SCAN_BUS(3, printk(KERN_INFO - "scsi scan: peripheral qualifier of 3," - " no device added\n")); + SCSI_LOG_SCAN_BUS(2, sdev_printk(KERN_INFO, sdev, "scsi scan:" + " peripheral qualifier of 3, device not" + " added\n")) + if (lun == 0) { + SCSI_LOG_SCAN_BUS(1, { + unsigned char vend[9]; + unsigned char mod[17]; + + sdev_printk(KERN_INFO, sdev, + "scsi scan: consider passing scsi_mod." + "dev_flags=%s:%s:0x240 or 0x800240\n", + scsi_inq_str(vend, result, 8, 16), + scsi_inq_str(mod, result, 16, 32)); + }); + } + res = SCSI_SCAN_TARGET_PRESENT; goto out_free_result; } @@ -920,8 +961,6 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget, sdev->lockable = 0; scsi_unlock_floptical(sdev, result); } - if (bflagsp) - *bflagsp = bflags; } out_free_result: @@ -946,7 +985,6 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget, * scsi_sequential_lun_scan - sequentially scan a SCSI target * @starget: pointer to target structure to scan * @bflags: black/white list flag for LUN 0 - * @lun0_res: result of scanning LUN 0 * * Description: * Generally, scan from LUN 1 (LUN 0 is assumed to already have been @@ -956,8 +994,7 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget, * Modifies sdevscan->lun. **/ static void scsi_sequential_lun_scan(struct scsi_target *starget, - int bflags, int lun0_res, int scsi_level, - int rescan) + int bflags, int scsi_level, int rescan) { unsigned int sparse_lun, lun, max_dev_lun; struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); @@ -977,13 +1014,6 @@ static void scsi_sequential_lun_scan(struct scsi_target *starget, } else sparse_lun = 0; - /* - * If not sparse lun and no device attached at LUN 0 do not scan - * any further. - */ - if (!sparse_lun && (lun0_res != SCSI_SCAN_LUN_PRESENT)) - return; - /* * If less than SCSI_1_CSS, and no special lun scaning, stop * scanning; this matches 2.4 behaviour, but could just be a bug @@ -1395,7 +1425,7 @@ static void __scsi_scan_target(struct device *parent, unsigned int channel, * do a sequential scan. */ scsi_sequential_lun_scan(starget, bflags, - res, starget->scsi_level, rescan); + starget->scsi_level, rescan); } out_reap: @@ -1473,7 +1503,7 @@ int scsi_scan_host_selected(struct Scsi_Host *shost, unsigned int channel, __FUNCTION__, channel, id, lun)); if (((channel != SCAN_WILD_CARD) && (channel > shost->max_channel)) || - ((id != SCAN_WILD_CARD) && (id > shost->max_id)) || + ((id != SCAN_WILD_CARD) && (id >= shost->max_id)) || ((lun != SCAN_WILD_CARD) && (lun > shost->max_lun))) return -EINVAL; diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index a6fde5294..e7fe565b9 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c @@ -6,7 +6,6 @@ * Created to pull SCSI mid layer sysfs routines into one file. */ -#include #include #include #include @@ -39,7 +38,7 @@ const char *scsi_device_state_name(enum scsi_device_state state) int i; char *name = NULL; - for (i = 0; i < sizeof(sdev_states)/sizeof(sdev_states[0]); i++) { + for (i = 0; i < ARRAY_SIZE(sdev_states); i++) { if (sdev_states[i].value == state) { name = sdev_states[i].name; break; @@ -65,7 +64,7 @@ const char *scsi_host_state_name(enum scsi_host_state state) int i; char *name = NULL; - for (i = 0; i < sizeof(shost_states)/sizeof(shost_states[0]); i++) { + for (i = 0; i < ARRAY_SIZE(shost_states); i++) { if (shost_states[i].value == state) { name = shost_states[i].name; break; @@ -160,7 +159,7 @@ store_shost_state(struct class_device *class_dev, const char *buf, size_t count) struct Scsi_Host *shost = class_to_shost(class_dev); enum scsi_host_state state = 0; - for (i = 0; i < sizeof(shost_states)/sizeof(shost_states[0]); i++) { + for (i = 0; i < ARRAY_SIZE(shost_states); i++) { const int len = strlen(shost_states[i].name); if (strncmp(shost_states[i].name, buf, len) == 0 && buf[len] == '\n') { @@ -466,7 +465,7 @@ store_state_field(struct device *dev, struct device_attribute *attr, const char struct scsi_device *sdev = to_scsi_device(dev); enum scsi_device_state state = 0; - for (i = 0; i < sizeof(sdev_states)/sizeof(sdev_states[0]); i++) { + for (i = 0; i < ARRAY_SIZE(sdev_states); i++) { const int len = strlen(sdev_states[i].name); if (strncmp(sdev_states[i].name, buf, len) == 0 && buf[len] == '\n') { diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c index 95c5478dc..b03aa8510 100644 --- a/drivers/scsi/scsi_transport_fc.c +++ b/drivers/scsi/scsi_transport_fc.c @@ -50,7 +50,7 @@ static const char *get_fc_##title##_name(enum table_type table_key) \ int i; \ char *name = NULL; \ \ - for (i = 0; i < sizeof(table)/sizeof(table[0]); i++) { \ + for (i = 0; i < ARRAY_SIZE(table); i++) { \ if (table[i].value == table_key) { \ name = table[i].name; \ break; \ @@ -65,7 +65,7 @@ static int get_fc_##title##_match(const char *table_key, \ { \ int i; \ \ - for (i = 0; i < sizeof(table)/sizeof(table[0]); i++) { \ + for (i = 0; i < ARRAY_SIZE(table); i++) { \ if (strncmp(table_key, table[i].name, \ table[i].matchlen) == 0) { \ *value = table[i].value; \ @@ -140,7 +140,7 @@ get_fc_##title##_names(u32 table_key, char *buf) \ ssize_t len = 0; \ int i; \ \ - for (i = 0; i < sizeof(table)/sizeof(table[0]); i++) { \ + for (i = 0; i < ARRAY_SIZE(table); i++) { \ if (table[i].value & table_key) { \ len += sprintf(buf + len, "%s%s", \ prefix, table[i].name); \ @@ -368,7 +368,7 @@ static DECLARE_TRANSPORT_CLASS(fc_rport_class, * should insulate the loss of a remote port. * The maximum will be capped by the value of SCSI_DEVICE_BLOCK_MAX_TIMEOUT. */ -static unsigned int fc_dev_loss_tmo = SCSI_DEVICE_BLOCK_MAX_TIMEOUT; +static unsigned int fc_dev_loss_tmo = 60; /* seconds */ module_param_named(dev_loss_tmo, fc_dev_loss_tmo, int, S_IRUGO|S_IWUSR); MODULE_PARM_DESC(dev_loss_tmo, @@ -1284,7 +1284,9 @@ EXPORT_SYMBOL(fc_release_transport); * @work: Work to queue for execution. * * Return value: - * 0 on success / != 0 for error + * 1 - work queued for execution + * 0 - work is already queued + * -EINVAL - work queue doesn't exist **/ static int fc_queue_work(struct Scsi_Host *shost, struct work_struct *work) @@ -1434,8 +1436,6 @@ fc_starget_delete(void *data) struct Scsi_Host *shost = rport_to_shost(rport); unsigned long flags; - scsi_target_unblock(&rport->dev); - spin_lock_irqsave(shost->host_lock, flags); if (rport->flags & FC_RPORT_DEVLOSS_PENDING) { spin_unlock_irqrestore(shost->host_lock, flags); @@ -1476,7 +1476,8 @@ fc_rport_final_delete(void *data) transport_remove_device(dev); device_del(dev); transport_destroy_device(dev); - put_device(&shost->shost_gendev); + put_device(&shost->shost_gendev); /* for fc_host->rport list */ + put_device(dev); /* for self-reference */ } @@ -1537,13 +1538,13 @@ fc_rport_create(struct Scsi_Host *shost, int channel, else rport->scsi_target_id = -1; list_add_tail(&rport->peers, &fc_host->rports); - get_device(&shost->shost_gendev); + get_device(&shost->shost_gendev); /* for fc_host->rport list */ spin_unlock_irqrestore(shost->host_lock, flags); dev = &rport->dev; - device_initialize(dev); - dev->parent = get_device(&shost->shost_gendev); + device_initialize(dev); /* takes self reference */ + dev->parent = get_device(&shost->shost_gendev); /* parent reference */ dev->release = fc_rport_dev_release; sprintf(dev->bus_id, "rport-%d:%d-%d", shost->host_no, channel, rport->number); @@ -1567,10 +1568,9 @@ fc_rport_create(struct Scsi_Host *shost, int channel, delete_rport: transport_destroy_device(dev); - put_device(dev->parent); spin_lock_irqsave(shost->host_lock, flags); list_del(&rport->peers); - put_device(&shost->shost_gendev); + put_device(&shost->shost_gendev); /* for fc_host->rport list */ spin_unlock_irqrestore(shost->host_lock, flags); put_device(dev->parent); kfree(rport); @@ -1707,6 +1707,8 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel, spin_unlock_irqrestore(shost->host_lock, flags); + scsi_target_unblock(&rport->dev); + return rport; } } @@ -1762,9 +1764,10 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel, /* initiate a scan of the target */ rport->flags |= FC_RPORT_SCAN_PENDING; scsi_queue_work(shost, &rport->scan_work); - } - - spin_unlock_irqrestore(shost->host_lock, flags); + spin_unlock_irqrestore(shost->host_lock, flags); + scsi_target_unblock(&rport->dev); + } else + spin_unlock_irqrestore(shost->host_lock, flags); return rport; } @@ -1938,6 +1941,7 @@ fc_remote_port_rolechg(struct fc_rport *rport, u32 roles) rport->flags |= FC_RPORT_SCAN_PENDING; scsi_queue_work(shost, &rport->scan_work); spin_unlock_irqrestore(shost->host_lock, flags); + scsi_target_unblock(&rport->dev); } } EXPORT_SYMBOL(fc_remote_port_rolechg); @@ -1970,8 +1974,9 @@ fc_timeout_deleted_rport(void *data) dev_printk(KERN_ERR, &rport->dev, "blocked FC remote port time out: no longer" " a FCP target, removing starget\n"); - fc_queue_work(shost, &rport->stgt_delete_work); spin_unlock_irqrestore(shost->host_lock, flags); + scsi_target_unblock(&rport->dev); + fc_queue_work(shost, &rport->stgt_delete_work); return; } @@ -2035,17 +2040,15 @@ fc_timeout_deleted_rport(void *data) * went away and didn't come back - we'll remove * all attached scsi devices. */ - fc_queue_work(shost, &rport->stgt_delete_work); - spin_unlock_irqrestore(shost->host_lock, flags); + + scsi_target_unblock(&rport->dev); + fc_queue_work(shost, &rport->stgt_delete_work); } /** * fc_scsi_scan_rport - called to perform a scsi scan on a remote port. * - * Will unblock the target (in case it went away and has now come back), - * then invoke a scan. - * * @data: remote port to be scanned. **/ static void @@ -2057,7 +2060,6 @@ fc_scsi_scan_rport(void *data) if ((rport->port_state == FC_PORTSTATE_ONLINE) && (rport->roles & FC_RPORT_ROLE_FCP_TARGET)) { - scsi_target_unblock(&rport->dev); scsi_scan_target(&rport->dev, rport->channel, rport->scsi_target_id, SCAN_WILD_CARD, 1); } diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c index 2730d507e..2ecd14188 100644 --- a/drivers/scsi/scsi_transport_iscsi.c +++ b/drivers/scsi/scsi_transport_iscsi.c @@ -31,31 +31,27 @@ #include #include -#define ISCSI_SESSION_ATTRS 8 -#define ISCSI_CONN_ATTRS 6 +#define ISCSI_SESSION_ATTRS 11 +#define ISCSI_CONN_ATTRS 11 +#define ISCSI_HOST_ATTRS 0 +#define ISCSI_TRANSPORT_VERSION "1.1-646" struct iscsi_internal { + int daemon_pid; struct scsi_transport_template t; struct iscsi_transport *iscsi_transport; struct list_head list; - /* - * based on transport capabilities, at register time we set these - * bits to tell the transport class it wants attributes displayed - * in sysfs or that it can support different iSCSI Data-Path - * capabilities - */ - uint32_t param_mask; - struct class_device cdev; - /* - * We do not have any private or other attrs. - */ + + struct class_device_attribute *host_attrs[ISCSI_HOST_ATTRS + 1]; struct transport_container conn_cont; struct class_device_attribute *conn_attrs[ISCSI_CONN_ATTRS + 1]; struct transport_container session_cont; struct class_device_attribute *session_attrs[ISCSI_SESSION_ATTRS + 1]; }; +static int iscsi_session_nr; /* sysfs session id for next new session */ + /* * list of registered transports and lock that must * be held while accessing list. The iscsi_transport_lock must @@ -120,6 +116,24 @@ static struct attribute_group iscsi_transport_group = { .attrs = iscsi_transport_attrs, }; +static int iscsi_setup_host(struct transport_container *tc, struct device *dev, + struct class_device *cdev) +{ + struct Scsi_Host *shost = dev_to_shost(dev); + struct iscsi_host *ihost = shost->shost_data; + + memset(ihost, 0, sizeof(*ihost)); + INIT_LIST_HEAD(&ihost->sessions); + mutex_init(&ihost->mutex); + return 0; +} + +static DECLARE_TRANSPORT_CLASS(iscsi_host_class, + "iscsi_host", + iscsi_setup_host, + NULL, + NULL); + static DECLARE_TRANSPORT_CLASS(iscsi_session_class, "iscsi_session", NULL, @@ -133,7 +147,6 @@ static DECLARE_TRANSPORT_CLASS(iscsi_connection_class, NULL); static struct sock *nls; -static int daemon_pid; static DEFINE_MUTEX(rx_queue_mutex); struct mempool_zone { @@ -165,14 +178,23 @@ static DEFINE_SPINLOCK(sesslock); static LIST_HEAD(connlist); static DEFINE_SPINLOCK(connlock); -static struct iscsi_cls_session *iscsi_session_lookup(uint64_t handle) +static uint32_t iscsi_conn_get_sid(struct iscsi_cls_conn *conn) +{ + struct iscsi_cls_session *sess = iscsi_dev_to_session(conn->dev.parent); + return sess->sid; +} + +/* + * Returns the matching session to a given sid + */ +static struct iscsi_cls_session *iscsi_session_lookup(uint32_t sid) { unsigned long flags; struct iscsi_cls_session *sess; spin_lock_irqsave(&sesslock, flags); list_for_each_entry(sess, &sesslist, sess_list) { - if (sess == iscsi_ptr(handle)) { + if (sess->sid == sid) { spin_unlock_irqrestore(&sesslock, flags); return sess; } @@ -181,14 +203,17 @@ static struct iscsi_cls_session *iscsi_session_lookup(uint64_t handle) return NULL; } -static struct iscsi_cls_conn *iscsi_conn_lookup(uint64_t handle) +/* + * Returns the matching connection to a given sid / cid tuple + */ +static struct iscsi_cls_conn *iscsi_conn_lookup(uint32_t sid, uint32_t cid) { unsigned long flags; struct iscsi_cls_conn *conn; spin_lock_irqsave(&connlock, flags); list_for_each_entry(conn, &connlist, conn_list) { - if (conn == iscsi_ptr(handle)) { + if ((conn->cid == cid) && (iscsi_conn_get_sid(conn) == sid)) { spin_unlock_irqrestore(&connlock, flags); return conn; } @@ -204,13 +229,11 @@ static struct iscsi_cls_conn *iscsi_conn_lookup(uint64_t handle) static void iscsi_session_release(struct device *dev) { struct iscsi_cls_session *session = iscsi_dev_to_session(dev); - struct iscsi_transport *transport = session->transport; struct Scsi_Host *shost; shost = iscsi_session_to_shost(session); scsi_host_put(shost); kfree(session); - module_put(transport->owner); } static int iscsi_is_session_dev(const struct device *dev) @@ -218,51 +241,164 @@ static int iscsi_is_session_dev(const struct device *dev) return dev->release == iscsi_session_release; } -/** - * iscsi_create_session - create iscsi class session - * @shost: scsi host - * @transport: iscsi transport - * - * This can be called from a LLD or iscsi_transport - **/ +static int iscsi_user_scan(struct Scsi_Host *shost, uint channel, + uint id, uint lun) +{ + struct iscsi_host *ihost = shost->shost_data; + struct iscsi_cls_session *session; + + mutex_lock(&ihost->mutex); + list_for_each_entry(session, &ihost->sessions, host_list) { + if ((channel == SCAN_WILD_CARD || channel == 0) && + (id == SCAN_WILD_CARD || id == session->target_id)) + scsi_scan_target(&session->dev, 0, + session->target_id, lun, 1); + } + mutex_unlock(&ihost->mutex); + + return 0; +} + +static void session_recovery_timedout(void *data) +{ + struct iscsi_cls_session *session = data; + + dev_printk(KERN_INFO, &session->dev, "iscsi: session recovery timed " + "out after %d secs\n", session->recovery_tmo); + + if (session->transport->session_recovery_timedout) + session->transport->session_recovery_timedout(session); + + scsi_target_unblock(&session->dev); +} + +void iscsi_unblock_session(struct iscsi_cls_session *session) +{ + if (!cancel_delayed_work(&session->recovery_work)) + flush_scheduled_work(); + scsi_target_unblock(&session->dev); +} +EXPORT_SYMBOL_GPL(iscsi_unblock_session); + +void iscsi_block_session(struct iscsi_cls_session *session) +{ + scsi_target_block(&session->dev); + schedule_delayed_work(&session->recovery_work, + session->recovery_tmo * HZ); +} +EXPORT_SYMBOL_GPL(iscsi_block_session); + struct iscsi_cls_session * -iscsi_create_session(struct Scsi_Host *shost, struct iscsi_transport *transport) +iscsi_alloc_session(struct Scsi_Host *shost, + struct iscsi_transport *transport) { struct iscsi_cls_session *session; - int err; - if (!try_module_get(transport->owner)) + session = kzalloc(sizeof(*session) + transport->sessiondata_size, + GFP_KERNEL); + if (!session) return NULL; - session = kzalloc(sizeof(*session), GFP_KERNEL); - if (!session) - goto module_put; session->transport = transport; + session->recovery_tmo = 120; + INIT_WORK(&session->recovery_work, session_recovery_timedout, session); + INIT_LIST_HEAD(&session->host_list); + INIT_LIST_HEAD(&session->sess_list); /* this is released in the dev's release function */ scsi_host_get(shost); - snprintf(session->dev.bus_id, BUS_ID_SIZE, "session%u", shost->host_no); session->dev.parent = &shost->shost_gendev; session->dev.release = iscsi_session_release; - err = device_register(&session->dev); + device_initialize(&session->dev); + if (transport->sessiondata_size) + session->dd_data = &session[1]; + return session; +} +EXPORT_SYMBOL_GPL(iscsi_alloc_session); + +int iscsi_add_session(struct iscsi_cls_session *session, unsigned int target_id) +{ + struct Scsi_Host *shost = iscsi_session_to_shost(session); + struct iscsi_host *ihost; + int err; + + ihost = shost->shost_data; + session->sid = iscsi_session_nr++; + session->target_id = target_id; + + snprintf(session->dev.bus_id, BUS_ID_SIZE, "session%u", + session->sid); + err = device_add(&session->dev); if (err) { dev_printk(KERN_ERR, &session->dev, "iscsi: could not " "register session's dev\n"); - goto free_session; + goto release_host; } transport_register_device(&session->dev); - return session; + mutex_lock(&ihost->mutex); + list_add(&session->host_list, &ihost->sessions); + mutex_unlock(&ihost->mutex); + return 0; -free_session: - kfree(session); -module_put: - module_put(transport->owner); - return NULL; +release_host: + scsi_host_put(shost); + return err; } +EXPORT_SYMBOL_GPL(iscsi_add_session); + +/** + * iscsi_create_session - create iscsi class session + * @shost: scsi host + * @transport: iscsi transport + * + * This can be called from a LLD or iscsi_transport. + **/ +struct iscsi_cls_session * +iscsi_create_session(struct Scsi_Host *shost, + struct iscsi_transport *transport, + unsigned int target_id) +{ + struct iscsi_cls_session *session; + session = iscsi_alloc_session(shost, transport); + if (!session) + return NULL; + + if (iscsi_add_session(session, target_id)) { + iscsi_free_session(session); + return NULL; + } + return session; +} EXPORT_SYMBOL_GPL(iscsi_create_session); +void iscsi_remove_session(struct iscsi_cls_session *session) +{ + struct Scsi_Host *shost = iscsi_session_to_shost(session); + struct iscsi_host *ihost = shost->shost_data; + + if (!cancel_delayed_work(&session->recovery_work)) + flush_scheduled_work(); + + mutex_lock(&ihost->mutex); + list_del(&session->host_list); + mutex_unlock(&ihost->mutex); + + scsi_remove_target(&session->dev); + + transport_unregister_device(&session->dev); + device_del(&session->dev); +} +EXPORT_SYMBOL_GPL(iscsi_remove_session); + +void iscsi_free_session(struct iscsi_cls_session *session) +{ + put_device(&session->dev); +} + +EXPORT_SYMBOL_GPL(iscsi_free_session); + /** * iscsi_destroy_session - destroy iscsi session * @session: iscsi_session @@ -272,18 +408,65 @@ EXPORT_SYMBOL_GPL(iscsi_create_session); **/ int iscsi_destroy_session(struct iscsi_cls_session *session) { - transport_unregister_device(&session->dev); - device_unregister(&session->dev); + iscsi_remove_session(session); + iscsi_free_session(session); return 0; } - EXPORT_SYMBOL_GPL(iscsi_destroy_session); +static void mempool_zone_destroy(struct mempool_zone *zp) +{ + mempool_destroy(zp->pool); + kfree(zp); +} + +static void* +mempool_zone_alloc_skb(gfp_t gfp_mask, void *pool_data) +{ + struct mempool_zone *zone = pool_data; + + return alloc_skb(zone->size, gfp_mask); +} + +static void +mempool_zone_free_skb(void *element, void *pool_data) +{ + kfree_skb(element); +} + +static struct mempool_zone * +mempool_zone_init(unsigned max, unsigned size, unsigned hiwat) +{ + struct mempool_zone *zp; + + zp = kzalloc(sizeof(*zp), GFP_KERNEL); + if (!zp) + return NULL; + + zp->size = size; + zp->hiwat = hiwat; + INIT_LIST_HEAD(&zp->freequeue); + spin_lock_init(&zp->freelock); + atomic_set(&zp->allocated, 0); + + zp->pool = mempool_create(max, mempool_zone_alloc_skb, + mempool_zone_free_skb, zp); + if (!zp->pool) { + kfree(zp); + return NULL; + } + + return zp; +} + static void iscsi_conn_release(struct device *dev) { struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev); struct device *parent = conn->dev.parent; + mempool_zone_destroy(conn->z_pdu); + mempool_zone_destroy(conn->z_error); + kfree(conn); put_device(parent); } @@ -293,6 +476,31 @@ static int iscsi_is_conn_dev(const struct device *dev) return dev->release == iscsi_conn_release; } +static int iscsi_create_event_pools(struct iscsi_cls_conn *conn) +{ + conn->z_pdu = mempool_zone_init(Z_MAX_PDU, + NLMSG_SPACE(sizeof(struct iscsi_uevent) + + sizeof(struct iscsi_hdr) + + DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH), + Z_HIWAT_PDU); + if (!conn->z_pdu) { + dev_printk(KERN_ERR, &conn->dev, "iscsi: can not allocate " + "pdu zone for new conn\n"); + return -ENOMEM; + } + + conn->z_error = mempool_zone_init(Z_MAX_ERROR, + NLMSG_SPACE(sizeof(struct iscsi_uevent)), + Z_HIWAT_ERROR); + if (!conn->z_error) { + dev_printk(KERN_ERR, &conn->dev, "iscsi: can not allocate " + "error zone for new conn\n"); + mempool_zone_destroy(conn->z_pdu); + return -ENOMEM; + } + return 0; +} + /** * iscsi_create_conn - create iscsi class connection * @session: iscsi cls session @@ -301,12 +509,16 @@ static int iscsi_is_conn_dev(const struct device *dev) * This can be called from a LLD or iscsi_transport. The connection * is child of the session so cid must be unique for all connections * on the session. + * + * Since we do not support MCS, cid will normally be zero. In some cases + * for software iscsi we could be trying to preallocate a connection struct + * in which case there could be two connection structs and cid would be + * non-zero. **/ struct iscsi_cls_conn * iscsi_create_conn(struct iscsi_cls_session *session, uint32_t cid) { struct iscsi_transport *transport = session->transport; - struct Scsi_Host *shost = iscsi_session_to_shost(session); struct iscsi_cls_conn *conn; int err; @@ -319,12 +531,17 @@ iscsi_create_conn(struct iscsi_cls_session *session, uint32_t cid) INIT_LIST_HEAD(&conn->conn_list); conn->transport = transport; + conn->cid = cid; + + if (iscsi_create_event_pools(conn)) + goto free_conn; /* this is released in the dev's release function */ if (!get_device(&session->dev)) - goto free_conn; + goto free_conn_pools; + snprintf(conn->dev.bus_id, BUS_ID_SIZE, "connection%d:%u", - shost->host_no, cid); + session->sid, cid); conn->dev.parent = &session->dev; conn->dev.release = iscsi_conn_release; err = device_register(&conn->dev); @@ -338,6 +555,8 @@ iscsi_create_conn(struct iscsi_cls_session *session, uint32_t cid) release_parent_ref: put_device(&session->dev); +free_conn_pools: + free_conn: kfree(conn); return NULL; @@ -360,105 +579,6 @@ int iscsi_destroy_conn(struct iscsi_cls_conn *conn) EXPORT_SYMBOL_GPL(iscsi_destroy_conn); -/* - * These functions are used only by software iscsi_transports - * which do not allocate and more their scsi_hosts since this - * is initiated from userspace. - */ - -/* - * iSCSI Session's hostdata organization: - * - * *------------------* <== hostdata_session(host->hostdata) - * | ptr to class sess| - * |------------------| <== iscsi_hostdata(host->hostdata) - * | transport's data | - * *------------------* - */ - -#define hostdata_privsize(_t) (sizeof(unsigned long) + _t->hostdata_size + \ - _t->hostdata_size % sizeof(unsigned long)) - -#define hostdata_session(_hostdata) (iscsi_ptr(*(unsigned long *)_hostdata)) - -/** - * iscsi_transport_create_session - create iscsi cls session and host - * scsit: scsi transport template - * transport: iscsi transport template - * - * This can be used by software iscsi_transports that allocate - * a session per scsi host. - **/ -struct Scsi_Host * -iscsi_transport_create_session(struct scsi_transport_template *scsit, - struct iscsi_transport *transport) -{ - struct iscsi_cls_session *session; - struct Scsi_Host *shost; - unsigned long flags; - - shost = scsi_host_alloc(transport->host_template, - hostdata_privsize(transport)); - if (!shost) { - printk(KERN_ERR "iscsi: can not allocate SCSI host for " - "session\n"); - return NULL; - } - - shost->max_id = 1; - shost->max_channel = 0; - shost->max_lun = transport->max_lun; - shost->max_cmd_len = transport->max_cmd_len; - shost->transportt = scsit; - shost->transportt->create_work_queue = 1; - - if (scsi_add_host(shost, NULL)) - goto free_host; - - session = iscsi_create_session(shost, transport); - if (!session) - goto remove_host; - - *(unsigned long*)shost->hostdata = (unsigned long)session; - spin_lock_irqsave(&sesslock, flags); - list_add(&session->sess_list, &sesslist); - spin_unlock_irqrestore(&sesslock, flags); - return shost; - -remove_host: - scsi_remove_host(shost); -free_host: - scsi_host_put(shost); - return NULL; -} - -EXPORT_SYMBOL_GPL(iscsi_transport_create_session); - -/** - * iscsi_transport_destroy_session - destroy session and scsi host - * shost: scsi host - * - * This can be used by software iscsi_transports that allocate - * a session per scsi host. - **/ -int iscsi_transport_destroy_session(struct Scsi_Host *shost) -{ - struct iscsi_cls_session *session; - unsigned long flags; - - scsi_remove_host(shost); - session = hostdata_session(shost->hostdata); - spin_lock_irqsave(&sesslock, flags); - list_del(&session->sess_list); - spin_unlock_irqrestore(&sesslock, flags); - iscsi_destroy_session(session); - /* ref from host alloc */ - scsi_host_put(shost); - return 0; -} - -EXPORT_SYMBOL_GPL(iscsi_transport_destroy_session); - /* * iscsi interface functions */ @@ -484,20 +604,6 @@ static inline struct list_head *skb_to_lh(struct sk_buff *skb) return (struct list_head *)&skb->cb; } -static void* -mempool_zone_alloc_skb(gfp_t gfp_mask, void *pool_data) -{ - struct mempool_zone *zone = pool_data; - - return alloc_skb(zone->size, gfp_mask); -} - -static void -mempool_zone_free_skb(void *element, void *pool_data) -{ - kfree_skb(element); -} - static void mempool_zone_complete(struct mempool_zone *zone) { @@ -517,37 +623,6 @@ mempool_zone_complete(struct mempool_zone *zone) spin_unlock_irqrestore(&zone->freelock, flags); } -static struct mempool_zone * -mempool_zone_init(unsigned max, unsigned size, unsigned hiwat) -{ - struct mempool_zone *zp; - - zp = kzalloc(sizeof(*zp), GFP_KERNEL); - if (!zp) - return NULL; - - zp->size = size; - zp->hiwat = hiwat; - INIT_LIST_HEAD(&zp->freequeue); - spin_lock_init(&zp->freelock); - atomic_set(&zp->allocated, 0); - - zp->pool = mempool_create(max, mempool_zone_alloc_skb, - mempool_zone_free_skb, zp); - if (!zp->pool) { - kfree(zp); - return NULL; - } - - return zp; -} - -static void mempool_zone_destroy(struct mempool_zone *zp) -{ - mempool_destroy(zp->pool); - kfree(zp); -} - static struct sk_buff* mempool_zone_get_skb(struct mempool_zone *zone) { @@ -560,13 +635,34 @@ mempool_zone_get_skb(struct mempool_zone *zone) } static int -iscsi_unicast_skb(struct mempool_zone *zone, struct sk_buff *skb) +iscsi_broadcast_skb(struct mempool_zone *zone, struct sk_buff *skb, gfp_t gfp) +{ + unsigned long flags; + int rc; + + skb_get(skb); + rc = netlink_broadcast(nls, skb, 0, 1, gfp); + if (rc < 0) { + mempool_free(skb, zone->pool); + printk(KERN_ERR "iscsi: can not broadcast skb (%d)\n", rc); + return rc; + } + + spin_lock_irqsave(&zone->freelock, flags); + INIT_LIST_HEAD(skb_to_lh(skb)); + list_add(skb_to_lh(skb), &zone->freequeue); + spin_unlock_irqrestore(&zone->freelock, flags); + return 0; +} + +static int +iscsi_unicast_skb(struct mempool_zone *zone, struct sk_buff *skb, int pid) { unsigned long flags; int rc; skb_get(skb); - rc = netlink_unicast(nls, skb, daemon_pid, MSG_DONTWAIT); + rc = netlink_unicast(nls, skb, pid, MSG_DONTWAIT); if (rc < 0) { mempool_free(skb, zone->pool); printk(KERN_ERR "iscsi: can not unicast skb (%d)\n", rc); @@ -574,6 +670,7 @@ iscsi_unicast_skb(struct mempool_zone *zone, struct sk_buff *skb) } spin_lock_irqsave(&zone->freelock, flags); + INIT_LIST_HEAD(skb_to_lh(skb)); list_add(skb_to_lh(skb), &zone->freequeue); spin_unlock_irqrestore(&zone->freelock, flags); @@ -587,9 +684,14 @@ int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, struct sk_buff *skb; struct iscsi_uevent *ev; char *pdu; + struct iscsi_internal *priv; int len = NLMSG_SPACE(sizeof(*ev) + sizeof(struct iscsi_hdr) + data_size); + priv = iscsi_if_transport_lookup(conn->transport); + if (!priv) + return -EINVAL; + mempool_zone_complete(conn->z_pdu); skb = mempool_zone_get_skb(conn->z_pdu); @@ -600,19 +702,20 @@ int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, return -ENOMEM; } - nlh = __nlmsg_put(skb, daemon_pid, 0, 0, (len - sizeof(*nlh)), 0); + nlh = __nlmsg_put(skb, priv->daemon_pid, 0, 0, (len - sizeof(*nlh)), 0); ev = NLMSG_DATA(nlh); memset(ev, 0, sizeof(*ev)); ev->transport_handle = iscsi_handle(conn->transport); ev->type = ISCSI_KEVENT_RECV_PDU; if (atomic_read(&conn->z_pdu->allocated) >= conn->z_pdu->hiwat) ev->iferror = -ENOMEM; - ev->r.recv_req.conn_handle = iscsi_handle(conn); + ev->r.recv_req.cid = conn->cid; + ev->r.recv_req.sid = iscsi_conn_get_sid(conn); pdu = (char*)ev + sizeof(*ev); memcpy(pdu, hdr, sizeof(struct iscsi_hdr)); memcpy(pdu + sizeof(struct iscsi_hdr), data, data_size); - return iscsi_unicast_skb(conn->z_pdu, skb); + return iscsi_unicast_skb(conn->z_pdu, skb, priv->daemon_pid); } EXPORT_SYMBOL_GPL(iscsi_recv_pdu); @@ -621,8 +724,13 @@ void iscsi_conn_error(struct iscsi_cls_conn *conn, enum iscsi_err error) struct nlmsghdr *nlh; struct sk_buff *skb; struct iscsi_uevent *ev; + struct iscsi_internal *priv; int len = NLMSG_SPACE(sizeof(*ev)); + priv = iscsi_if_transport_lookup(conn->transport); + if (!priv) + return; + mempool_zone_complete(conn->z_error); skb = mempool_zone_get_skb(conn->z_error); @@ -632,16 +740,17 @@ void iscsi_conn_error(struct iscsi_cls_conn *conn, enum iscsi_err error) return; } - nlh = __nlmsg_put(skb, daemon_pid, 0, 0, (len - sizeof(*nlh)), 0); + nlh = __nlmsg_put(skb, priv->daemon_pid, 0, 0, (len - sizeof(*nlh)), 0); ev = NLMSG_DATA(nlh); ev->transport_handle = iscsi_handle(conn->transport); ev->type = ISCSI_KEVENT_CONN_ERROR; if (atomic_read(&conn->z_error->allocated) >= conn->z_error->hiwat) ev->iferror = -ENOMEM; ev->r.connerror.error = error; - ev->r.connerror.conn_handle = iscsi_handle(conn); + ev->r.connerror.cid = conn->cid; + ev->r.connerror.sid = iscsi_conn_get_sid(conn); - iscsi_unicast_skb(conn->z_error, skb); + iscsi_broadcast_skb(conn->z_error, skb, GFP_ATOMIC); dev_printk(KERN_INFO, &conn->dev, "iscsi: detected conn error (%d)\n", error); @@ -671,7 +780,7 @@ iscsi_if_send_reply(int pid, int seq, int type, int done, int multi, nlh = __nlmsg_put(skb, pid, seq, t, (len - sizeof(*nlh)), 0); nlh->nlmsg_flags = flags; memcpy(NLMSG_DATA(nlh), payload, size); - return iscsi_unicast_skb(z_reply, skb); + return iscsi_unicast_skb(z_reply, skb, pid); } static int @@ -683,13 +792,18 @@ iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh) struct iscsi_cls_conn *conn; struct nlmsghdr *nlhstat; struct iscsi_uevent *evstat; + struct iscsi_internal *priv; int len = NLMSG_SPACE(sizeof(*ev) + sizeof(struct iscsi_stats) + sizeof(struct iscsi_stats_custom) * ISCSI_STATS_CUSTOM_MAX); int err = 0; - conn = iscsi_conn_lookup(ev->u.get_stats.conn_handle); + priv = iscsi_if_transport_lookup(transport); + if (!priv) + return -EINVAL; + + conn = iscsi_conn_lookup(ev->u.get_stats.sid, ev->u.get_stats.cid); if (!conn) return -EEXIST; @@ -705,7 +819,7 @@ iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh) return -ENOMEM; } - nlhstat = __nlmsg_put(skbstat, daemon_pid, 0, 0, + nlhstat = __nlmsg_put(skbstat, priv->daemon_pid, 0, 0, (len - sizeof(*nlhstat)), 0); evstat = NLMSG_DATA(nlhstat); memset(evstat, 0, sizeof(*evstat)); @@ -713,8 +827,10 @@ iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh) evstat->type = nlh->nlmsg_type; if (atomic_read(&conn->z_pdu->allocated) >= conn->z_pdu->hiwat) evstat->iferror = -ENOMEM; - evstat->u.get_stats.conn_handle = - ev->u.get_stats.conn_handle; + evstat->u.get_stats.cid = + ev->u.get_stats.cid; + evstat->u.get_stats.sid = + ev->u.get_stats.sid; stats = (struct iscsi_stats *) ((char*)evstat + sizeof(*evstat)); memset(stats, 0, sizeof(*stats)); @@ -729,27 +845,157 @@ iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh) skb_trim(skbstat, NLMSG_ALIGN(actual_size)); nlhstat->nlmsg_len = actual_size; - err = iscsi_unicast_skb(conn->z_pdu, skbstat); + err = iscsi_unicast_skb(conn->z_pdu, skbstat, priv->daemon_pid); } while (err < 0 && err != -ECONNREFUSED); return err; } +/** + * iscsi_if_destroy_session_done - send session destr. completion event + * @conn: last connection for session + * + * This is called by HW iscsi LLDs to notify userpsace that its HW has + * removed a session. + **/ +int iscsi_if_destroy_session_done(struct iscsi_cls_conn *conn) +{ + struct iscsi_internal *priv; + struct iscsi_cls_session *session; + struct Scsi_Host *shost; + struct iscsi_uevent *ev; + struct sk_buff *skb; + struct nlmsghdr *nlh; + unsigned long flags; + int rc, len = NLMSG_SPACE(sizeof(*ev)); + + priv = iscsi_if_transport_lookup(conn->transport); + if (!priv) + return -EINVAL; + + session = iscsi_dev_to_session(conn->dev.parent); + shost = iscsi_session_to_shost(session); + + mempool_zone_complete(conn->z_pdu); + + skb = mempool_zone_get_skb(conn->z_pdu); + if (!skb) { + dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of " + "session creation event\n"); + return -ENOMEM; + } + + nlh = __nlmsg_put(skb, priv->daemon_pid, 0, 0, (len - sizeof(*nlh)), 0); + ev = NLMSG_DATA(nlh); + ev->transport_handle = iscsi_handle(conn->transport); + ev->type = ISCSI_KEVENT_DESTROY_SESSION; + ev->r.d_session.host_no = shost->host_no; + ev->r.d_session.sid = session->sid; + + /* + * this will occur if the daemon is not up, so we just warn + * the user and when the daemon is restarted it will handle it + */ + rc = iscsi_broadcast_skb(conn->z_pdu, skb, GFP_KERNEL); + if (rc < 0) + dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of " + "session destruction event. Check iscsi daemon\n"); + + spin_lock_irqsave(&sesslock, flags); + list_del(&session->sess_list); + spin_unlock_irqrestore(&sesslock, flags); + + spin_lock_irqsave(&connlock, flags); + conn->active = 0; + list_del(&conn->conn_list); + spin_unlock_irqrestore(&connlock, flags); + + return rc; +} +EXPORT_SYMBOL_GPL(iscsi_if_destroy_session_done); + +/** + * iscsi_if_create_session_done - send session creation completion event + * @conn: leading connection for session + * + * This is called by HW iscsi LLDs to notify userpsace that its HW has + * created a session or a existing session is back in the logged in state. + **/ +int iscsi_if_create_session_done(struct iscsi_cls_conn *conn) +{ + struct iscsi_internal *priv; + struct iscsi_cls_session *session; + struct Scsi_Host *shost; + struct iscsi_uevent *ev; + struct sk_buff *skb; + struct nlmsghdr *nlh; + unsigned long flags; + int rc, len = NLMSG_SPACE(sizeof(*ev)); + + priv = iscsi_if_transport_lookup(conn->transport); + if (!priv) + return -EINVAL; + + session = iscsi_dev_to_session(conn->dev.parent); + shost = iscsi_session_to_shost(session); + + mempool_zone_complete(conn->z_pdu); + + skb = mempool_zone_get_skb(conn->z_pdu); + if (!skb) { + dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of " + "session creation event\n"); + return -ENOMEM; + } + + nlh = __nlmsg_put(skb, priv->daemon_pid, 0, 0, (len - sizeof(*nlh)), 0); + ev = NLMSG_DATA(nlh); + ev->transport_handle = iscsi_handle(conn->transport); + ev->type = ISCSI_UEVENT_CREATE_SESSION; + ev->r.c_session_ret.host_no = shost->host_no; + ev->r.c_session_ret.sid = session->sid; + + /* + * this will occur if the daemon is not up, so we just warn + * the user and when the daemon is restarted it will handle it + */ + rc = iscsi_broadcast_skb(conn->z_pdu, skb, GFP_KERNEL); + if (rc < 0) + dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of " + "session creation event. Check iscsi daemon\n"); + + spin_lock_irqsave(&sesslock, flags); + list_add(&session->sess_list, &sesslist); + spin_unlock_irqrestore(&sesslock, flags); + + spin_lock_irqsave(&connlock, flags); + list_add(&conn->conn_list, &connlist); + conn->active = 1; + spin_unlock_irqrestore(&connlock, flags); + return rc; +} +EXPORT_SYMBOL_GPL(iscsi_if_create_session_done); + static int iscsi_if_create_session(struct iscsi_internal *priv, struct iscsi_uevent *ev) { struct iscsi_transport *transport = priv->iscsi_transport; struct iscsi_cls_session *session; - uint32_t sid; + unsigned long flags; + uint32_t hostno; - session = transport->create_session(&priv->t, + session = transport->create_session(transport, &priv->t, ev->u.c_session.initial_cmdsn, - &sid); + &hostno); if (!session) return -ENOMEM; - ev->r.c_session_ret.session_handle = iscsi_handle(session); - ev->r.c_session_ret.sid = sid; + spin_lock_irqsave(&sesslock, flags); + list_add(&session->sess_list, &sesslist); + spin_unlock_irqrestore(&sesslock, flags); + + ev->r.c_session_ret.host_no = hostno; + ev->r.c_session_ret.sid = session->sid; return 0; } @@ -760,35 +1006,23 @@ iscsi_if_create_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev) struct iscsi_cls_session *session; unsigned long flags; - session = iscsi_session_lookup(ev->u.c_conn.session_handle); - if (!session) + session = iscsi_session_lookup(ev->u.c_conn.sid); + if (!session) { + printk(KERN_ERR "iscsi: invalid session %d\n", + ev->u.c_conn.sid); return -EINVAL; + } conn = transport->create_conn(session, ev->u.c_conn.cid); - if (!conn) + if (!conn) { + printk(KERN_ERR "iscsi: couldn't create a new " + "connection for session %d\n", + session->sid); return -ENOMEM; - - conn->z_pdu = mempool_zone_init(Z_MAX_PDU, - NLMSG_SPACE(sizeof(struct iscsi_uevent) + - sizeof(struct iscsi_hdr) + - DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH), - Z_HIWAT_PDU); - if (!conn->z_pdu) { - dev_printk(KERN_ERR, &conn->dev, "iscsi: can not allocate " - "pdu zone for new conn\n"); - goto destroy_conn; - } - - conn->z_error = mempool_zone_init(Z_MAX_ERROR, - NLMSG_SPACE(sizeof(struct iscsi_uevent)), - Z_HIWAT_ERROR); - if (!conn->z_error) { - dev_printk(KERN_ERR, &conn->dev, "iscsi: can not allocate " - "error zone for new conn\n"); - goto free_pdu_pool; } - ev->r.handle = iscsi_handle(conn); + ev->r.c_conn_ret.sid = session->sid; + ev->r.c_conn_ret.cid = conn->cid; spin_lock_irqsave(&connlock, flags); list_add(&conn->conn_list, &connlist); @@ -796,13 +1030,6 @@ iscsi_if_create_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev) spin_unlock_irqrestore(&connlock, flags); return 0; - -free_pdu_pool: - mempool_zone_destroy(conn->z_pdu); -destroy_conn: - if (transport->destroy_conn) - transport->destroy_conn(conn->dd_data); - return -ENOMEM; } static int @@ -810,9 +1037,8 @@ iscsi_if_destroy_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev { unsigned long flags; struct iscsi_cls_conn *conn; - struct mempool_zone *z_error, *z_pdu; - conn = iscsi_conn_lookup(ev->u.d_conn.conn_handle); + conn = iscsi_conn_lookup(ev->u.d_conn.sid, ev->u.d_conn.cid); if (!conn) return -EINVAL; spin_lock_irqsave(&connlock, flags); @@ -820,16 +1046,85 @@ iscsi_if_destroy_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev list_del(&conn->conn_list); spin_unlock_irqrestore(&connlock, flags); - z_pdu = conn->z_pdu; - z_error = conn->z_error; - if (transport->destroy_conn) transport->destroy_conn(conn); + return 0; +} - mempool_zone_destroy(z_pdu); - mempool_zone_destroy(z_error); +static int +iscsi_set_param(struct iscsi_transport *transport, struct iscsi_uevent *ev) +{ + char *data = (char*)ev + sizeof(*ev); + struct iscsi_cls_conn *conn; + struct iscsi_cls_session *session; + int err = 0, value = 0; - return 0; + session = iscsi_session_lookup(ev->u.set_param.sid); + conn = iscsi_conn_lookup(ev->u.set_param.sid, ev->u.set_param.cid); + if (!conn || !session) + return -EINVAL; + + switch (ev->u.set_param.param) { + case ISCSI_PARAM_SESS_RECOVERY_TMO: + sscanf(data, "%d", &value); + if (value != 0) + session->recovery_tmo = value; + break; + default: + err = transport->set_param(conn, ev->u.set_param.param, + data, ev->u.set_param.len); + } + + return err; +} + +static int +iscsi_if_transport_ep(struct iscsi_transport *transport, + struct iscsi_uevent *ev, int msg_type) +{ + struct sockaddr *dst_addr; + int rc = 0; + + switch (msg_type) { + case ISCSI_UEVENT_TRANSPORT_EP_CONNECT: + if (!transport->ep_connect) + return -EINVAL; + + dst_addr = (struct sockaddr *)((char*)ev + sizeof(*ev)); + rc = transport->ep_connect(dst_addr, + ev->u.ep_connect.non_blocking, + &ev->r.ep_connect_ret.handle); + break; + case ISCSI_UEVENT_TRANSPORT_EP_POLL: + if (!transport->ep_poll) + return -EINVAL; + + ev->r.retcode = transport->ep_poll(ev->u.ep_poll.ep_handle, + ev->u.ep_poll.timeout_ms); + break; + case ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT: + if (!transport->ep_disconnect) + return -EINVAL; + + transport->ep_disconnect(ev->u.ep_disconnect.ep_handle); + break; + } + return rc; +} + +static int +iscsi_tgt_dscvr(struct iscsi_transport *transport, + struct iscsi_uevent *ev) +{ + struct sockaddr *dst_addr; + + if (!transport->tgt_dscvr) + return -EINVAL; + + dst_addr = (struct sockaddr *)((char*)ev + sizeof(*ev)); + return transport->tgt_dscvr(ev->u.tgt_dscvr.type, + ev->u.tgt_dscvr.host_no, + ev->u.tgt_dscvr.enable, dst_addr); } static int @@ -841,6 +1136,7 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) struct iscsi_internal *priv; struct iscsi_cls_session *session; struct iscsi_cls_conn *conn; + unsigned long flags; priv = iscsi_if_transport_lookup(iscsi_ptr(ev->transport_handle)); if (!priv) @@ -850,15 +1146,21 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) if (!try_module_get(transport->owner)) return -EINVAL; + priv->daemon_pid = NETLINK_CREDS(skb)->pid; + switch (nlh->nlmsg_type) { case ISCSI_UEVENT_CREATE_SESSION: err = iscsi_if_create_session(priv, ev); break; case ISCSI_UEVENT_DESTROY_SESSION: - session = iscsi_session_lookup(ev->u.d_session.session_handle); - if (session) + session = iscsi_session_lookup(ev->u.d_session.sid); + if (session) { + spin_lock_irqsave(&sesslock, flags); + list_del(&session->sess_list); + spin_unlock_irqrestore(&sesslock, flags); + transport->destroy_session(session); - else + } else err = -EINVAL; break; case ISCSI_UEVENT_CREATE_CONN: @@ -868,41 +1170,35 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) err = iscsi_if_destroy_conn(transport, ev); break; case ISCSI_UEVENT_BIND_CONN: - session = iscsi_session_lookup(ev->u.b_conn.session_handle); - conn = iscsi_conn_lookup(ev->u.b_conn.conn_handle); + session = iscsi_session_lookup(ev->u.b_conn.sid); + conn = iscsi_conn_lookup(ev->u.b_conn.sid, ev->u.b_conn.cid); if (session && conn) ev->r.retcode = transport->bind_conn(session, conn, - ev->u.b_conn.transport_fd, + ev->u.b_conn.transport_eph, ev->u.b_conn.is_leading); else err = -EINVAL; break; case ISCSI_UEVENT_SET_PARAM: - conn = iscsi_conn_lookup(ev->u.set_param.conn_handle); - if (conn) - ev->r.retcode = transport->set_param(conn, - ev->u.set_param.param, ev->u.set_param.value); - else - err = -EINVAL; + err = iscsi_set_param(transport, ev); break; case ISCSI_UEVENT_START_CONN: - conn = iscsi_conn_lookup(ev->u.start_conn.conn_handle); + conn = iscsi_conn_lookup(ev->u.start_conn.sid, ev->u.start_conn.cid); if (conn) ev->r.retcode = transport->start_conn(conn); else err = -EINVAL; - break; case ISCSI_UEVENT_STOP_CONN: - conn = iscsi_conn_lookup(ev->u.stop_conn.conn_handle); + conn = iscsi_conn_lookup(ev->u.stop_conn.sid, ev->u.stop_conn.cid); if (conn) transport->stop_conn(conn, ev->u.stop_conn.flag); else err = -EINVAL; break; case ISCSI_UEVENT_SEND_PDU: - conn = iscsi_conn_lookup(ev->u.send_pdu.conn_handle); + conn = iscsi_conn_lookup(ev->u.send_pdu.sid, ev->u.send_pdu.cid); if (conn) ev->r.retcode = transport->send_pdu(conn, (struct iscsi_hdr*)((char*)ev + sizeof(*ev)), @@ -914,6 +1210,14 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) case ISCSI_UEVENT_GET_STATS: err = iscsi_if_get_stats(transport, nlh); break; + case ISCSI_UEVENT_TRANSPORT_EP_CONNECT: + case ISCSI_UEVENT_TRANSPORT_EP_POLL: + case ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT: + err = iscsi_if_transport_ep(transport, ev, nlh->nlmsg_type); + break; + case ISCSI_UEVENT_TGT_DSCVR: + err = iscsi_tgt_dscvr(transport, ev); + break; default: err = -EINVAL; break; @@ -923,9 +1227,11 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) return err; } -/* Get message from skb (based on rtnetlink_rcv_skb). Each message is - * processed by iscsi_if_recv_msg. Malformed skbs with wrong length are - * or invalid creds discarded silently. */ +/* + * Get message from skb (based on rtnetlink_rcv_skb). Each message is + * processed by iscsi_if_recv_msg. Malformed skbs with wrong lengths or + * invalid creds are discarded silently. + */ static void iscsi_if_rx(struct sock *sk, int len) { @@ -937,7 +1243,6 @@ iscsi_if_rx(struct sock *sk, int len) skb_pull(skb, skb->len); goto free_skb; } - daemon_pid = NETLINK_CREDS(skb)->pid; while (skb->len >= NLMSG_SPACE(0)) { int err; @@ -988,31 +1293,38 @@ free_skb: #define iscsi_cdev_to_conn(_cdev) \ iscsi_dev_to_conn(_cdev->dev) +#define ISCSI_CLASS_ATTR(_prefix,_name,_mode,_show,_store) \ +struct class_device_attribute class_device_attr_##_prefix##_##_name = \ + __ATTR(_name,_mode,_show,_store) + /* * iSCSI connection attrs */ -#define iscsi_conn_int_attr_show(param, format) \ +#define iscsi_conn_attr_show(param) \ static ssize_t \ -show_conn_int_param_##param(struct class_device *cdev, char *buf) \ +show_conn_param_##param(struct class_device *cdev, char *buf) \ { \ - uint32_t value = 0; \ struct iscsi_cls_conn *conn = iscsi_cdev_to_conn(cdev); \ struct iscsi_transport *t = conn->transport; \ - \ - t->get_conn_param(conn, param, &value); \ - return snprintf(buf, 20, format"\n", value); \ + return t->get_conn_param(conn, param, buf); \ } -#define iscsi_conn_int_attr(field, param, format) \ - iscsi_conn_int_attr_show(param, format) \ -static CLASS_DEVICE_ATTR(field, S_IRUGO, show_conn_int_param_##param, NULL); - -iscsi_conn_int_attr(max_recv_dlength, ISCSI_PARAM_MAX_RECV_DLENGTH, "%u"); -iscsi_conn_int_attr(max_xmit_dlength, ISCSI_PARAM_MAX_XMIT_DLENGTH, "%u"); -iscsi_conn_int_attr(header_digest, ISCSI_PARAM_HDRDGST_EN, "%d"); -iscsi_conn_int_attr(data_digest, ISCSI_PARAM_DATADGST_EN, "%d"); -iscsi_conn_int_attr(ifmarker, ISCSI_PARAM_IFMARKER_EN, "%d"); -iscsi_conn_int_attr(ofmarker, ISCSI_PARAM_OFMARKER_EN, "%d"); +#define iscsi_conn_attr(field, param) \ + iscsi_conn_attr_show(param) \ +static ISCSI_CLASS_ATTR(conn, field, S_IRUGO, show_conn_param_##param, \ + NULL); + +iscsi_conn_attr(max_recv_dlength, ISCSI_PARAM_MAX_RECV_DLENGTH); +iscsi_conn_attr(max_xmit_dlength, ISCSI_PARAM_MAX_XMIT_DLENGTH); +iscsi_conn_attr(header_digest, ISCSI_PARAM_HDRDGST_EN); +iscsi_conn_attr(data_digest, ISCSI_PARAM_DATADGST_EN); +iscsi_conn_attr(ifmarker, ISCSI_PARAM_IFMARKER_EN); +iscsi_conn_attr(ofmarker, ISCSI_PARAM_OFMARKER_EN); +iscsi_conn_attr(persistent_port, ISCSI_PARAM_PERSISTENT_PORT); +iscsi_conn_attr(port, ISCSI_PARAM_CONN_PORT); +iscsi_conn_attr(exp_statsn, ISCSI_PARAM_EXP_STATSN); +iscsi_conn_attr(persistent_address, ISCSI_PARAM_PERSISTENT_ADDRESS); +iscsi_conn_attr(address, ISCSI_PARAM_CONN_ADDRESS); #define iscsi_cdev_to_session(_cdev) \ iscsi_dev_to_session(_cdev->dev) @@ -1020,42 +1332,67 @@ iscsi_conn_int_attr(ofmarker, ISCSI_PARAM_OFMARKER_EN, "%d"); /* * iSCSI session attrs */ -#define iscsi_session_int_attr_show(param, format) \ +#define iscsi_session_attr_show(param) \ static ssize_t \ -show_session_int_param_##param(struct class_device *cdev, char *buf) \ +show_session_param_##param(struct class_device *cdev, char *buf) \ { \ - uint32_t value = 0; \ - struct iscsi_cls_session *session = iscsi_cdev_to_session(cdev); \ + struct iscsi_cls_session *session = iscsi_cdev_to_session(cdev); \ struct iscsi_transport *t = session->transport; \ - \ - t->get_session_param(session, param, &value); \ - return snprintf(buf, 20, format"\n", value); \ + return t->get_session_param(session, param, buf); \ } -#define iscsi_session_int_attr(field, param, format) \ - iscsi_session_int_attr_show(param, format) \ -static CLASS_DEVICE_ATTR(field, S_IRUGO, show_session_int_param_##param, NULL); - -iscsi_session_int_attr(initial_r2t, ISCSI_PARAM_INITIAL_R2T_EN, "%d"); -iscsi_session_int_attr(max_outstanding_r2t, ISCSI_PARAM_MAX_R2T, "%hu"); -iscsi_session_int_attr(immediate_data, ISCSI_PARAM_IMM_DATA_EN, "%d"); -iscsi_session_int_attr(first_burst_len, ISCSI_PARAM_FIRST_BURST, "%u"); -iscsi_session_int_attr(max_burst_len, ISCSI_PARAM_MAX_BURST, "%u"); -iscsi_session_int_attr(data_pdu_in_order, ISCSI_PARAM_PDU_INORDER_EN, "%d"); -iscsi_session_int_attr(data_seq_in_order, ISCSI_PARAM_DATASEQ_INORDER_EN, "%d"); -iscsi_session_int_attr(erl, ISCSI_PARAM_ERL, "%d"); - -#define SETUP_SESSION_RD_ATTR(field, param) \ - if (priv->param_mask & (1 << param)) { \ - priv->session_attrs[count] = &class_device_attr_##field;\ +#define iscsi_session_attr(field, param) \ + iscsi_session_attr_show(param) \ +static ISCSI_CLASS_ATTR(sess, field, S_IRUGO, show_session_param_##param, \ + NULL); + +iscsi_session_attr(targetname, ISCSI_PARAM_TARGET_NAME); +iscsi_session_attr(initial_r2t, ISCSI_PARAM_INITIAL_R2T_EN); +iscsi_session_attr(max_outstanding_r2t, ISCSI_PARAM_MAX_R2T); +iscsi_session_attr(immediate_data, ISCSI_PARAM_IMM_DATA_EN); +iscsi_session_attr(first_burst_len, ISCSI_PARAM_FIRST_BURST); +iscsi_session_attr(max_burst_len, ISCSI_PARAM_MAX_BURST); +iscsi_session_attr(data_pdu_in_order, ISCSI_PARAM_PDU_INORDER_EN); +iscsi_session_attr(data_seq_in_order, ISCSI_PARAM_DATASEQ_INORDER_EN); +iscsi_session_attr(erl, ISCSI_PARAM_ERL); +iscsi_session_attr(tpgt, ISCSI_PARAM_TPGT); + +#define iscsi_priv_session_attr_show(field, format) \ +static ssize_t \ +show_priv_session_##field(struct class_device *cdev, char *buf) \ +{ \ + struct iscsi_cls_session *session = iscsi_cdev_to_session(cdev);\ + return sprintf(buf, format"\n", session->field); \ +} + +#define iscsi_priv_session_attr(field, format) \ + iscsi_priv_session_attr_show(field, format) \ +static ISCSI_CLASS_ATTR(priv_sess, field, S_IRUGO, show_priv_session_##field, \ + NULL) +iscsi_priv_session_attr(recovery_tmo, "%d"); + +#define SETUP_PRIV_SESSION_RD_ATTR(field) \ +do { \ + priv->session_attrs[count] = &class_device_attr_priv_sess_##field; \ + count++; \ +} while (0) + + +#define SETUP_SESSION_RD_ATTR(field, param_flag) \ +do { \ + if (tt->param_mask & param_flag) { \ + priv->session_attrs[count] = &class_device_attr_sess_##field; \ count++; \ - } + } \ +} while (0) -#define SETUP_CONN_RD_ATTR(field, param) \ - if (priv->param_mask & (1 << param)) { \ - priv->conn_attrs[count] = &class_device_attr_##field; \ +#define SETUP_CONN_RD_ATTR(field, param_flag) \ +do { \ + if (tt->param_mask & param_flag) { \ + priv->conn_attrs[count] = &class_device_attr_conn_##field; \ count++; \ - } + } \ +} while (0) static int iscsi_session_match(struct attribute_container *cont, struct device *dev) @@ -1104,6 +1441,24 @@ static int iscsi_conn_match(struct attribute_container *cont, return &priv->conn_cont.ac == cont; } +static int iscsi_host_match(struct attribute_container *cont, + struct device *dev) +{ + struct Scsi_Host *shost; + struct iscsi_internal *priv; + + if (!scsi_is_host_device(dev)) + return 0; + + shost = dev_to_shost(dev); + if (!shost->transportt || + shost->transportt->host_attrs.ac.class != &iscsi_host_class.class) + return 0; + + priv = to_iscsi_internal(shost->transportt); + return &priv->t.host_attrs.ac == cont; +} + struct scsi_transport_template * iscsi_register_transport(struct iscsi_transport *tt) { @@ -1121,7 +1476,9 @@ iscsi_register_transport(struct iscsi_transport *tt) if (!priv) return NULL; INIT_LIST_HEAD(&priv->list); + priv->daemon_pid = -1; priv->iscsi_transport = tt; + priv->t.user_scan = iscsi_user_scan; priv->cdev.class = &iscsi_transport_class; snprintf(priv->cdev.class_id, BUS_ID_SIZE, "%s", tt->name); @@ -1133,18 +1490,13 @@ iscsi_register_transport(struct iscsi_transport *tt) if (err) goto unregister_cdev; - /* setup parameters mask */ - priv->param_mask = 0xFFFFFFFF; - if (!(tt->caps & CAP_MULTI_R2T)) - priv->param_mask &= ~(1 << ISCSI_PARAM_MAX_R2T); - if (!(tt->caps & CAP_HDRDGST)) - priv->param_mask &= ~(1 << ISCSI_PARAM_HDRDGST_EN); - if (!(tt->caps & CAP_DATADGST)) - priv->param_mask &= ~(1 << ISCSI_PARAM_DATADGST_EN); - if (!(tt->caps & CAP_MARKERS)) { - priv->param_mask &= ~(1 << ISCSI_PARAM_IFMARKER_EN); - priv->param_mask &= ~(1 << ISCSI_PARAM_OFMARKER_EN); - } + /* host parameters */ + priv->t.host_attrs.ac.attrs = &priv->host_attrs[0]; + priv->t.host_attrs.ac.class = &iscsi_host_class.class; + priv->t.host_attrs.ac.match = iscsi_host_match; + priv->t.host_size = sizeof(struct iscsi_host); + priv->host_attrs[0] = NULL; + transport_container_register(&priv->t.host_attrs); /* connection parameters */ priv->conn_cont.ac.attrs = &priv->conn_attrs[0]; @@ -1152,12 +1504,17 @@ iscsi_register_transport(struct iscsi_transport *tt) priv->conn_cont.ac.match = iscsi_conn_match; transport_container_register(&priv->conn_cont); - SETUP_CONN_RD_ATTR(max_recv_dlength, ISCSI_PARAM_MAX_RECV_DLENGTH); - SETUP_CONN_RD_ATTR(max_xmit_dlength, ISCSI_PARAM_MAX_XMIT_DLENGTH); - SETUP_CONN_RD_ATTR(header_digest, ISCSI_PARAM_HDRDGST_EN); - SETUP_CONN_RD_ATTR(data_digest, ISCSI_PARAM_DATADGST_EN); - SETUP_CONN_RD_ATTR(ifmarker, ISCSI_PARAM_IFMARKER_EN); - SETUP_CONN_RD_ATTR(ofmarker, ISCSI_PARAM_OFMARKER_EN); + SETUP_CONN_RD_ATTR(max_recv_dlength, ISCSI_MAX_RECV_DLENGTH); + SETUP_CONN_RD_ATTR(max_xmit_dlength, ISCSI_MAX_XMIT_DLENGTH); + SETUP_CONN_RD_ATTR(header_digest, ISCSI_HDRDGST_EN); + SETUP_CONN_RD_ATTR(data_digest, ISCSI_DATADGST_EN); + SETUP_CONN_RD_ATTR(ifmarker, ISCSI_IFMARKER_EN); + SETUP_CONN_RD_ATTR(ofmarker, ISCSI_OFMARKER_EN); + SETUP_CONN_RD_ATTR(address, ISCSI_CONN_ADDRESS); + SETUP_CONN_RD_ATTR(port, ISCSI_CONN_PORT); + SETUP_CONN_RD_ATTR(exp_statsn, ISCSI_EXP_STATSN); + SETUP_CONN_RD_ATTR(persistent_address, ISCSI_PERSISTENT_ADDRESS); + SETUP_CONN_RD_ATTR(persistent_port, ISCSI_PERSISTENT_PORT); BUG_ON(count > ISCSI_CONN_ATTRS); priv->conn_attrs[count] = NULL; @@ -1169,14 +1526,17 @@ iscsi_register_transport(struct iscsi_transport *tt) priv->session_cont.ac.match = iscsi_session_match; transport_container_register(&priv->session_cont); - SETUP_SESSION_RD_ATTR(initial_r2t, ISCSI_PARAM_INITIAL_R2T_EN); - SETUP_SESSION_RD_ATTR(max_outstanding_r2t, ISCSI_PARAM_MAX_R2T); - SETUP_SESSION_RD_ATTR(immediate_data, ISCSI_PARAM_IMM_DATA_EN); - SETUP_SESSION_RD_ATTR(first_burst_len, ISCSI_PARAM_FIRST_BURST); - SETUP_SESSION_RD_ATTR(max_burst_len, ISCSI_PARAM_MAX_BURST); - SETUP_SESSION_RD_ATTR(data_pdu_in_order, ISCSI_PARAM_PDU_INORDER_EN); - SETUP_SESSION_RD_ATTR(data_seq_in_order,ISCSI_PARAM_DATASEQ_INORDER_EN) - SETUP_SESSION_RD_ATTR(erl, ISCSI_PARAM_ERL); + SETUP_SESSION_RD_ATTR(initial_r2t, ISCSI_INITIAL_R2T_EN); + SETUP_SESSION_RD_ATTR(max_outstanding_r2t, ISCSI_MAX_R2T); + SETUP_SESSION_RD_ATTR(immediate_data, ISCSI_IMM_DATA_EN); + SETUP_SESSION_RD_ATTR(first_burst_len, ISCSI_FIRST_BURST); + SETUP_SESSION_RD_ATTR(max_burst_len, ISCSI_MAX_BURST); + SETUP_SESSION_RD_ATTR(data_pdu_in_order, ISCSI_PDU_INORDER_EN); + SETUP_SESSION_RD_ATTR(data_seq_in_order, ISCSI_DATASEQ_INORDER_EN); + SETUP_SESSION_RD_ATTR(erl, ISCSI_ERL); + SETUP_SESSION_RD_ATTR(targetname, ISCSI_TARGET_NAME); + SETUP_SESSION_RD_ATTR(tpgt, ISCSI_TPGT); + SETUP_PRIV_SESSION_RD_ATTR(recovery_tmo); BUG_ON(count > ISCSI_SESSION_ATTRS); priv->session_attrs[count] = NULL; @@ -1214,6 +1574,7 @@ int iscsi_unregister_transport(struct iscsi_transport *tt) transport_container_unregister(&priv->conn_cont); transport_container_unregister(&priv->session_cont); + transport_container_unregister(&priv->t.host_attrs); sysfs_remove_group(&priv->cdev.kobj, &iscsi_transport_group); class_device_unregister(&priv->cdev); @@ -1253,14 +1614,21 @@ static __init int iscsi_transport_init(void) { int err; + printk(KERN_INFO "Loading iSCSI transport class v%s.", + ISCSI_TRANSPORT_VERSION); + err = class_register(&iscsi_transport_class); if (err) return err; - err = transport_class_register(&iscsi_connection_class); + err = transport_class_register(&iscsi_host_class); if (err) goto unregister_transport_class; + err = transport_class_register(&iscsi_connection_class); + if (err) + goto unregister_host_class; + err = transport_class_register(&iscsi_session_class); if (err) goto unregister_conn_class; @@ -1288,6 +1656,8 @@ unregister_session_class: transport_class_unregister(&iscsi_session_class); unregister_conn_class: transport_class_unregister(&iscsi_connection_class); +unregister_host_class: + transport_class_unregister(&iscsi_host_class); unregister_transport_class: class_unregister(&iscsi_transport_class); return err; @@ -1300,6 +1670,7 @@ static void __exit iscsi_transport_exit(void) netlink_unregister_notifier(&iscsi_nl_notifier); transport_class_unregister(&iscsi_connection_class); transport_class_unregister(&iscsi_session_class); + transport_class_unregister(&iscsi_host_class); class_unregister(&iscsi_transport_class); } @@ -1311,3 +1682,4 @@ MODULE_AUTHOR("Mike Christie , " "Alex Aizman "); MODULE_DESCRIPTION("iSCSI Transport Interface"); MODULE_LICENSE("GPL"); +MODULE_VERSION(ISCSI_TRANSPORT_VERSION); diff --git a/drivers/scsi/scsi_transport_sas.c b/drivers/scsi/scsi_transport_sas.c index f3b160663..5a625c3fd 100644 --- a/drivers/scsi/scsi_transport_sas.c +++ b/drivers/scsi/scsi_transport_sas.c @@ -41,6 +41,7 @@ struct sas_host_attrs { struct mutex lock; u32 next_target_id; u32 next_expander_id; + int next_port_id; }; #define to_sas_host_attrs(host) ((struct sas_host_attrs *)(host)->shost_data) @@ -65,7 +66,7 @@ get_sas_##title##_names(u32 table_key, char *buf) \ ssize_t len = 0; \ int i; \ \ - for (i = 0; i < sizeof(table)/sizeof(table[0]); i++) { \ + for (i = 0; i < ARRAY_SIZE(table); i++) { \ if (table[i].value & table_key) { \ len += sprintf(buf + len, "%s%s", \ prefix, table[i].name); \ @@ -83,7 +84,7 @@ get_sas_##title##_names(u32 table_key, char *buf) \ ssize_t len = 0; \ int i; \ \ - for (i = 0; i < sizeof(table)/sizeof(table[0]); i++) { \ + for (i = 0; i < ARRAY_SIZE(table); i++) { \ if (table[i].value == table_key) { \ len += sprintf(buf + len, "%s", \ table[i].name); \ @@ -146,6 +147,7 @@ static int sas_host_setup(struct transport_container *tc, struct device *dev, mutex_init(&sas_host->lock); sas_host->next_target_id = 0; sas_host->next_expander_id = 0; + sas_host->next_port_id = 0; return 0; } @@ -174,11 +176,28 @@ static int sas_host_match(struct attribute_container *cont, static int do_sas_phy_delete(struct device *dev, void *data) { - if (scsi_is_sas_phy(dev)) + int pass = (int)(unsigned long)data; + + if (pass == 0 && scsi_is_sas_port(dev)) + sas_port_delete(dev_to_sas_port(dev)); + else if (pass == 1 && scsi_is_sas_phy(dev)) sas_phy_delete(dev_to_phy(dev)); return 0; } +/** + * sas_remove_children -- tear down a devices SAS data structures + * @dev: device belonging to the sas object + * + * Removes all SAS PHYs and remote PHYs for a given object + */ +void sas_remove_children(struct device *dev) +{ + device_for_each_child(dev, (void *)0, do_sas_phy_delete); + device_for_each_child(dev, (void *)1, do_sas_phy_delete); +} +EXPORT_SYMBOL(sas_remove_children); + /** * sas_remove_host -- tear down a Scsi_Host's SAS data structures * @shost: Scsi Host that is torn down @@ -188,13 +207,13 @@ static int do_sas_phy_delete(struct device *dev, void *data) */ void sas_remove_host(struct Scsi_Host *shost) { - device_for_each_child(&shost->shost_gendev, NULL, do_sas_phy_delete); + sas_remove_children(&shost->shost_gendev); } EXPORT_SYMBOL(sas_remove_host); /* - * SAS Port attributes + * SAS Phy attributes */ #define sas_phy_show_simple(field, name, format_string, cast) \ @@ -310,7 +329,7 @@ sas_phy_protocol_attr(identify.target_port_protocols, sas_phy_simple_attr(identify.sas_address, sas_address, "0x%016llx\n", unsigned long long); sas_phy_simple_attr(identify.phy_identifier, phy_identifier, "%d\n", u8); -sas_phy_simple_attr(port_identifier, port_identifier, "%d\n", u8); +//sas_phy_simple_attr(port_identifier, port_identifier, "%d\n", int); sas_phy_linkspeed_attr(negotiated_linkrate); sas_phy_linkspeed_attr(minimum_linkrate_hw); sas_phy_linkspeed_attr(minimum_linkrate); @@ -378,9 +397,10 @@ struct sas_phy *sas_phy_alloc(struct device *parent, int number) device_initialize(&phy->dev); phy->dev.parent = get_device(parent); phy->dev.release = sas_phy_release; + INIT_LIST_HEAD(&phy->port_siblings); if (scsi_is_sas_expander_device(parent)) { struct sas_rphy *rphy = dev_to_rphy(parent); - sprintf(phy->dev.bus_id, "phy-%d-%d:%d", shost->host_no, + sprintf(phy->dev.bus_id, "phy-%d:%d:%d", shost->host_no, rphy->scsi_target_id, number); } else sprintf(phy->dev.bus_id, "phy-%d:%d", shost->host_no, number); @@ -440,8 +460,8 @@ sas_phy_delete(struct sas_phy *phy) { struct device *dev = &phy->dev; - if (phy->rphy) - sas_rphy_delete(phy->rphy); + /* this happens if the phy is still part of a port when deleted */ + BUG_ON(!list_empty(&phy->port_siblings)); transport_remove_device(dev); device_del(dev); @@ -463,6 +483,310 @@ int scsi_is_sas_phy(const struct device *dev) } EXPORT_SYMBOL(scsi_is_sas_phy); +/* + * SAS Port attributes + */ +#define sas_port_show_simple(field, name, format_string, cast) \ +static ssize_t \ +show_sas_port_##name(struct class_device *cdev, char *buf) \ +{ \ + struct sas_port *port = transport_class_to_sas_port(cdev); \ + \ + return snprintf(buf, 20, format_string, cast port->field); \ +} + +#define sas_port_simple_attr(field, name, format_string, type) \ + sas_port_show_simple(field, name, format_string, (type)) \ +static CLASS_DEVICE_ATTR(name, S_IRUGO, show_sas_port_##name, NULL) + +sas_port_simple_attr(num_phys, num_phys, "%d\n", int); + +static DECLARE_TRANSPORT_CLASS(sas_port_class, + "sas_port", NULL, NULL, NULL); + +static int sas_port_match(struct attribute_container *cont, struct device *dev) +{ + struct Scsi_Host *shost; + struct sas_internal *i; + + if (!scsi_is_sas_port(dev)) + return 0; + shost = dev_to_shost(dev->parent); + + if (!shost->transportt) + return 0; + if (shost->transportt->host_attrs.ac.class != + &sas_host_class.class) + return 0; + + i = to_sas_internal(shost->transportt); + return &i->port_attr_cont.ac == cont; +} + + +static void sas_port_release(struct device *dev) +{ + struct sas_port *port = dev_to_sas_port(dev); + + BUG_ON(!list_empty(&port->phy_list)); + + put_device(dev->parent); + kfree(port); +} + +static void sas_port_create_link(struct sas_port *port, + struct sas_phy *phy) +{ + sysfs_create_link(&port->dev.kobj, &phy->dev.kobj, phy->dev.bus_id); + sysfs_create_link(&phy->dev.kobj, &port->dev.kobj, "port"); +} + +static void sas_port_delete_link(struct sas_port *port, + struct sas_phy *phy) +{ + sysfs_remove_link(&port->dev.kobj, phy->dev.bus_id); + sysfs_remove_link(&phy->dev.kobj, "port"); +} + +/** sas_port_alloc - allocate and initialize a SAS port structure + * + * @parent: parent device + * @port_id: port number + * + * Allocates a SAS port structure. It will be added to the device tree + * below the device specified by @parent which must be either a Scsi_Host + * or a sas_expander_device. + * + * Returns %NULL on error + */ +struct sas_port *sas_port_alloc(struct device *parent, int port_id) +{ + struct Scsi_Host *shost = dev_to_shost(parent); + struct sas_port *port; + + port = kzalloc(sizeof(*port), GFP_KERNEL); + if (!port) + return NULL; + + port->port_identifier = port_id; + + device_initialize(&port->dev); + + port->dev.parent = get_device(parent); + port->dev.release = sas_port_release; + + mutex_init(&port->phy_list_mutex); + INIT_LIST_HEAD(&port->phy_list); + + if (scsi_is_sas_expander_device(parent)) { + struct sas_rphy *rphy = dev_to_rphy(parent); + sprintf(port->dev.bus_id, "port-%d:%d:%d", shost->host_no, + rphy->scsi_target_id, port->port_identifier); + } else + sprintf(port->dev.bus_id, "port-%d:%d", shost->host_no, + port->port_identifier); + + transport_setup_device(&port->dev); + + return port; +} +EXPORT_SYMBOL(sas_port_alloc); + +/** sas_port_alloc_num - allocate and initialize a SAS port structure + * + * @parent: parent device + * + * Allocates a SAS port structure and a number to go with it. This + * interface is really for adapters where the port number has no + * meansing, so the sas class should manage them. It will be added to + * the device tree below the device specified by @parent which must be + * either a Scsi_Host or a sas_expander_device. + * + * Returns %NULL on error + */ +struct sas_port *sas_port_alloc_num(struct device *parent) +{ + int index; + struct Scsi_Host *shost = dev_to_shost(parent); + struct sas_host_attrs *sas_host = to_sas_host_attrs(shost); + + /* FIXME: use idr for this eventually */ + mutex_lock(&sas_host->lock); + if (scsi_is_sas_expander_device(parent)) { + struct sas_rphy *rphy = dev_to_rphy(parent); + struct sas_expander_device *exp = rphy_to_expander_device(rphy); + + index = exp->next_port_id++; + } else + index = sas_host->next_port_id++; + mutex_unlock(&sas_host->lock); + return sas_port_alloc(parent, index); +} +EXPORT_SYMBOL(sas_port_alloc_num); + +/** + * sas_port_add - add a SAS port to the device hierarchy + * + * @port: port to be added + * + * publishes a port to the rest of the system + */ +int sas_port_add(struct sas_port *port) +{ + int error; + + /* No phys should be added until this is made visible */ + BUG_ON(!list_empty(&port->phy_list)); + + error = device_add(&port->dev); + + if (error) + return error; + + transport_add_device(&port->dev); + transport_configure_device(&port->dev); + + return 0; +} +EXPORT_SYMBOL(sas_port_add); + +/** + * sas_port_free -- free a SAS PORT + * @port: SAS PORT to free + * + * Frees the specified SAS PORT. + * + * Note: + * This function must only be called on a PORT that has not + * sucessfully been added using sas_port_add(). + */ +void sas_port_free(struct sas_port *port) +{ + transport_destroy_device(&port->dev); + put_device(&port->dev); +} +EXPORT_SYMBOL(sas_port_free); + +/** + * sas_port_delete -- remove SAS PORT + * @port: SAS PORT to remove + * + * Removes the specified SAS PORT. If the SAS PORT has an + * associated phys, unlink them from the port as well. + */ +void sas_port_delete(struct sas_port *port) +{ + struct device *dev = &port->dev; + struct sas_phy *phy, *tmp_phy; + + if (port->rphy) { + sas_rphy_delete(port->rphy); + port->rphy = NULL; + } + + mutex_lock(&port->phy_list_mutex); + list_for_each_entry_safe(phy, tmp_phy, &port->phy_list, + port_siblings) { + sas_port_delete_link(port, phy); + list_del_init(&phy->port_siblings); + } + mutex_unlock(&port->phy_list_mutex); + + if (port->is_backlink) { + struct device *parent = port->dev.parent; + + sysfs_remove_link(&port->dev.kobj, parent->bus_id); + port->is_backlink = 0; + } + + transport_remove_device(dev); + device_del(dev); + transport_destroy_device(dev); + put_device(dev); +} +EXPORT_SYMBOL(sas_port_delete); + +/** + * scsi_is_sas_port -- check if a struct device represents a SAS port + * @dev: device to check + * + * Returns: + * %1 if the device represents a SAS Port, %0 else + */ +int scsi_is_sas_port(const struct device *dev) +{ + return dev->release == sas_port_release; +} +EXPORT_SYMBOL(scsi_is_sas_port); + +/** + * sas_port_add_phy - add another phy to a port to form a wide port + * @port: port to add the phy to + * @phy: phy to add + * + * When a port is initially created, it is empty (has no phys). All + * ports must have at least one phy to operated, and all wide ports + * must have at least two. The current code makes no difference + * between ports and wide ports, but the only object that can be + * connected to a remote device is a port, so ports must be formed on + * all devices with phys if they're connected to anything. + */ +void sas_port_add_phy(struct sas_port *port, struct sas_phy *phy) +{ + mutex_lock(&port->phy_list_mutex); + if (unlikely(!list_empty(&phy->port_siblings))) { + /* make sure we're already on this port */ + struct sas_phy *tmp; + + list_for_each_entry(tmp, &port->phy_list, port_siblings) + if (tmp == phy) + break; + /* If this trips, you added a phy that was already + * part of a different port */ + if (unlikely(tmp != phy)) { + dev_printk(KERN_ERR, &port->dev, "trying to add phy %s fails: it's already part of another port\n", phy->dev.bus_id); + BUG(); + } + } else { + sas_port_create_link(port, phy); + list_add_tail(&phy->port_siblings, &port->phy_list); + port->num_phys++; + } + mutex_unlock(&port->phy_list_mutex); +} +EXPORT_SYMBOL(sas_port_add_phy); + +/** + * sas_port_delete_phy - remove a phy from a port or wide port + * @port: port to remove the phy from + * @phy: phy to remove + * + * This operation is used for tearing down ports again. It must be + * done to every port or wide port before calling sas_port_delete. + */ +void sas_port_delete_phy(struct sas_port *port, struct sas_phy *phy) +{ + mutex_lock(&port->phy_list_mutex); + sas_port_delete_link(port, phy); + list_del_init(&phy->port_siblings); + port->num_phys--; + mutex_unlock(&port->phy_list_mutex); +} +EXPORT_SYMBOL(sas_port_delete_phy); + +void sas_port_mark_backlink(struct sas_port *port) +{ + struct device *parent = port->dev.parent->parent->parent; + + if (port->is_backlink) + return; + port->is_backlink = 1; + sysfs_create_link(&port->dev.kobj, &parent->kobj, + parent->bus_id); + +} +EXPORT_SYMBOL(sas_port_mark_backlink); + /* * SAS remote PHY attributes. */ @@ -747,6 +1071,18 @@ static void sas_end_device_release(struct device *dev) kfree(edev); } +/** + * sas_rphy_initialize - common rphy intialization + * @rphy: rphy to initialise + * + * Used by both sas_end_device_alloc() and sas_expander_alloc() to + * initialise the common rphy component of each. + */ +static void sas_rphy_initialize(struct sas_rphy *rphy) +{ + INIT_LIST_HEAD(&rphy->list); +} + /** * sas_end_device_alloc - allocate an rphy for an end device * @@ -755,7 +1091,7 @@ static void sas_end_device_release(struct device *dev) * Returns: * SAS PHY allocated or %NULL if the allocation failed. */ -struct sas_rphy *sas_end_device_alloc(struct sas_phy *parent) +struct sas_rphy *sas_end_device_alloc(struct sas_port *parent) { struct Scsi_Host *shost = dev_to_shost(&parent->dev); struct sas_end_device *rdev; @@ -768,9 +1104,15 @@ struct sas_rphy *sas_end_device_alloc(struct sas_phy *parent) device_initialize(&rdev->rphy.dev); rdev->rphy.dev.parent = get_device(&parent->dev); rdev->rphy.dev.release = sas_end_device_release; - sprintf(rdev->rphy.dev.bus_id, "end_device-%d:%d-%d", - shost->host_no, parent->port_identifier, parent->number); + if (scsi_is_sas_expander_device(parent->dev.parent)) { + struct sas_rphy *rphy = dev_to_rphy(parent->dev.parent); + sprintf(rdev->rphy.dev.bus_id, "end_device-%d:%d:%d", + shost->host_no, rphy->scsi_target_id, parent->port_identifier); + } else + sprintf(rdev->rphy.dev.bus_id, "end_device-%d:%d", + shost->host_no, parent->port_identifier); rdev->rphy.identify.device_type = SAS_END_DEVICE; + sas_rphy_initialize(&rdev->rphy); transport_setup_device(&rdev->rphy.dev); return &rdev->rphy; @@ -785,7 +1127,7 @@ EXPORT_SYMBOL(sas_end_device_alloc); * Returns: * SAS PHY allocated or %NULL if the allocation failed. */ -struct sas_rphy *sas_expander_alloc(struct sas_phy *parent, +struct sas_rphy *sas_expander_alloc(struct sas_port *parent, enum sas_device_type type) { struct Scsi_Host *shost = dev_to_shost(&parent->dev); @@ -809,6 +1151,7 @@ struct sas_rphy *sas_expander_alloc(struct sas_phy *parent, sprintf(rdev->rphy.dev.bus_id, "expander-%d:%d", shost->host_no, rdev->rphy.scsi_target_id); rdev->rphy.identify.device_type = type; + sas_rphy_initialize(&rdev->rphy); transport_setup_device(&rdev->rphy.dev); return &rdev->rphy; @@ -823,7 +1166,7 @@ EXPORT_SYMBOL(sas_expander_alloc); */ int sas_rphy_add(struct sas_rphy *rphy) { - struct sas_phy *parent = dev_to_phy(rphy->dev.parent); + struct sas_port *parent = dev_to_sas_port(rphy->dev.parent); struct Scsi_Host *shost = dev_to_shost(parent->dev.parent); struct sas_host_attrs *sas_host = to_sas_host_attrs(shost); struct sas_identify *identify = &rphy->identify; @@ -851,7 +1194,7 @@ int sas_rphy_add(struct sas_rphy *rphy) if (identify->device_type == SAS_END_DEVICE && rphy->scsi_target_id != -1) { - scsi_scan_target(&rphy->dev, parent->port_identifier, + scsi_scan_target(&rphy->dev, 0, rphy->scsi_target_id, ~0, 0); } @@ -896,7 +1239,7 @@ void sas_rphy_delete(struct sas_rphy *rphy) { struct device *dev = &rphy->dev; - struct sas_phy *parent = dev_to_phy(dev->parent); + struct sas_port *parent = dev_to_sas_port(dev->parent); struct Scsi_Host *shost = dev_to_shost(parent->dev.parent); struct sas_host_attrs *sas_host = to_sas_host_attrs(shost); @@ -906,7 +1249,7 @@ sas_rphy_delete(struct sas_rphy *rphy) break; case SAS_EDGE_EXPANDER_DEVICE: case SAS_FANOUT_EXPANDER_DEVICE: - device_for_each_child(dev, NULL, do_sas_phy_delete); + sas_remove_children(dev); break; default: break; @@ -953,15 +1296,13 @@ static int sas_user_scan(struct Scsi_Host *shost, uint channel, mutex_lock(&sas_host->lock); list_for_each_entry(rphy, &sas_host->rphy_list, list) { - struct sas_phy *parent = dev_to_phy(rphy->dev.parent); - if (rphy->identify.device_type != SAS_END_DEVICE || rphy->scsi_target_id == -1) continue; - if ((channel == SCAN_WILD_CARD || channel == parent->port_identifier) && + if ((channel == SCAN_WILD_CARD || channel == 0) && (id == SCAN_WILD_CARD || id == rphy->scsi_target_id)) { - scsi_scan_target(&rphy->dev, parent->port_identifier, + scsi_scan_target(&rphy->dev, 0, rphy->scsi_target_id, lun, 1); } } @@ -989,16 +1330,19 @@ static int sas_user_scan(struct Scsi_Host *shost, uint channel, #define SETUP_OPTIONAL_RPORT_ATTRIBUTE(field, func) \ SETUP_TEMPLATE(rphy_attrs, field, S_IRUGO, i->f->func) -#define SETUP_PORT_ATTRIBUTE(field) \ +#define SETUP_PHY_ATTRIBUTE(field) \ SETUP_TEMPLATE(phy_attrs, field, S_IRUGO, 1) -#define SETUP_OPTIONAL_PORT_ATTRIBUTE(field, func) \ +#define SETUP_PORT_ATTRIBUTE(field) \ + SETUP_TEMPLATE(port_attrs, field, S_IRUGO, 1) + +#define SETUP_OPTIONAL_PHY_ATTRIBUTE(field, func) \ SETUP_TEMPLATE(phy_attrs, field, S_IRUGO, i->f->func) -#define SETUP_PORT_ATTRIBUTE_WRONLY(field) \ +#define SETUP_PHY_ATTRIBUTE_WRONLY(field) \ SETUP_TEMPLATE(phy_attrs, field, S_IWUGO, 1) -#define SETUP_OPTIONAL_PORT_ATTRIBUTE_WRONLY(field, func) \ +#define SETUP_OPTIONAL_PHY_ATTRIBUTE_WRONLY(field, func) \ SETUP_TEMPLATE(phy_attrs, field, S_IWUGO, i->f->func) #define SETUP_END_DEV_ATTRIBUTE(field) \ @@ -1034,6 +1378,11 @@ sas_attach_transport(struct sas_function_template *ft) i->phy_attr_cont.ac.match = sas_phy_match; transport_container_register(&i->phy_attr_cont); + i->port_attr_cont.ac.class = &sas_port_class.class; + i->port_attr_cont.ac.attrs = &i->port_attrs[0]; + i->port_attr_cont.ac.match = sas_port_match; + transport_container_register(&i->port_attr_cont); + i->rphy_attr_cont.ac.class = &sas_rphy_class.class; i->rphy_attr_cont.ac.attrs = &i->rphy_attrs[0]; i->rphy_attr_cont.ac.match = sas_rphy_match; @@ -1052,29 +1401,34 @@ sas_attach_transport(struct sas_function_template *ft) i->f = ft; count = 0; + SETUP_PORT_ATTRIBUTE(num_phys); i->host_attrs[count] = NULL; count = 0; - SETUP_PORT_ATTRIBUTE(initiator_port_protocols); - SETUP_PORT_ATTRIBUTE(target_port_protocols); - SETUP_PORT_ATTRIBUTE(device_type); - SETUP_PORT_ATTRIBUTE(sas_address); - SETUP_PORT_ATTRIBUTE(phy_identifier); - SETUP_PORT_ATTRIBUTE(port_identifier); - SETUP_PORT_ATTRIBUTE(negotiated_linkrate); - SETUP_PORT_ATTRIBUTE(minimum_linkrate_hw); - SETUP_PORT_ATTRIBUTE(minimum_linkrate); - SETUP_PORT_ATTRIBUTE(maximum_linkrate_hw); - SETUP_PORT_ATTRIBUTE(maximum_linkrate); - - SETUP_PORT_ATTRIBUTE(invalid_dword_count); - SETUP_PORT_ATTRIBUTE(running_disparity_error_count); - SETUP_PORT_ATTRIBUTE(loss_of_dword_sync_count); - SETUP_PORT_ATTRIBUTE(phy_reset_problem_count); - SETUP_OPTIONAL_PORT_ATTRIBUTE_WRONLY(link_reset, phy_reset); - SETUP_OPTIONAL_PORT_ATTRIBUTE_WRONLY(hard_reset, phy_reset); + SETUP_PHY_ATTRIBUTE(initiator_port_protocols); + SETUP_PHY_ATTRIBUTE(target_port_protocols); + SETUP_PHY_ATTRIBUTE(device_type); + SETUP_PHY_ATTRIBUTE(sas_address); + SETUP_PHY_ATTRIBUTE(phy_identifier); + //SETUP_PHY_ATTRIBUTE(port_identifier); + SETUP_PHY_ATTRIBUTE(negotiated_linkrate); + SETUP_PHY_ATTRIBUTE(minimum_linkrate_hw); + SETUP_PHY_ATTRIBUTE(minimum_linkrate); + SETUP_PHY_ATTRIBUTE(maximum_linkrate_hw); + SETUP_PHY_ATTRIBUTE(maximum_linkrate); + + SETUP_PHY_ATTRIBUTE(invalid_dword_count); + SETUP_PHY_ATTRIBUTE(running_disparity_error_count); + SETUP_PHY_ATTRIBUTE(loss_of_dword_sync_count); + SETUP_PHY_ATTRIBUTE(phy_reset_problem_count); + SETUP_OPTIONAL_PHY_ATTRIBUTE_WRONLY(link_reset, phy_reset); + SETUP_OPTIONAL_PHY_ATTRIBUTE_WRONLY(hard_reset, phy_reset); i->phy_attrs[count] = NULL; + count = 0; + SETUP_PORT_ATTRIBUTE(num_phys); + i->port_attrs[count] = NULL; + count = 0; SETUP_RPORT_ATTRIBUTE(rphy_initiator_port_protocols); SETUP_RPORT_ATTRIBUTE(rphy_target_port_protocols); @@ -1117,6 +1471,7 @@ void sas_release_transport(struct scsi_transport_template *t) transport_container_unregister(&i->t.host_attrs); transport_container_unregister(&i->phy_attr_cont); + transport_container_unregister(&i->port_attr_cont); transport_container_unregister(&i->rphy_attr_cont); transport_container_unregister(&i->end_dev_attr_cont); transport_container_unregister(&i->expander_attr_cont); @@ -1135,9 +1490,12 @@ static __init int sas_transport_init(void) error = transport_class_register(&sas_phy_class); if (error) goto out_unregister_transport; - error = transport_class_register(&sas_rphy_class); + error = transport_class_register(&sas_port_class); if (error) goto out_unregister_phy; + error = transport_class_register(&sas_rphy_class); + if (error) + goto out_unregister_port; error = transport_class_register(&sas_end_dev_class); if (error) goto out_unregister_rphy; @@ -1151,6 +1509,8 @@ static __init int sas_transport_init(void) transport_class_unregister(&sas_end_dev_class); out_unregister_rphy: transport_class_unregister(&sas_rphy_class); + out_unregister_port: + transport_class_unregister(&sas_port_class); out_unregister_phy: transport_class_unregister(&sas_phy_class); out_unregister_transport: @@ -1164,6 +1524,7 @@ static void __exit sas_transport_exit(void) { transport_class_unregister(&sas_host_class); transport_class_unregister(&sas_phy_class); + transport_class_unregister(&sas_port_class); transport_class_unregister(&sas_rphy_class); transport_class_unregister(&sas_end_dev_class); transport_class_unregister(&sas_expander_class); diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c index 780aaedcb..29a9a53cd 100644 --- a/drivers/scsi/scsi_transport_spi.c +++ b/drivers/scsi/scsi_transport_spi.c @@ -18,7 +18,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include #include #include #include @@ -146,7 +145,7 @@ static inline const char *spi_signal_to_string(enum spi_signal_type type) { int i; - for (i = 0; i < sizeof(signal_types)/sizeof(signal_types[0]); i++) { + for (i = 0; i < ARRAY_SIZE(signal_types); i++) { if (type == signal_types[i].value) return signal_types[i].name; } @@ -156,7 +155,7 @@ static inline enum spi_signal_type spi_signal_to_value(const char *name) { int i, len; - for (i = 0; i < sizeof(signal_types)/sizeof(signal_types[0]); i++) { + for (i = 0; i < ARRAY_SIZE(signal_types); i++) { len = strlen(signal_types[i].name); if (strncmp(name, signal_types[i].name, len) == 0 && (name[len] == '\n' || name[len] == '\0')) @@ -785,6 +784,7 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer) { struct spi_internal *i = to_spi_internal(sdev->host->transportt); struct scsi_target *starget = sdev->sdev_target; + struct Scsi_Host *shost = sdev->host; int len = sdev->inquiry_len; /* first set us up for narrow async */ DV_SET(offset, 0); @@ -844,6 +844,14 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer) if (spi_min_period(starget) == 8) DV_SET(pcomp_en, 1); } + /* now that we've done all this, actually check the bus + * signal type (if known). Some devices are stupid on + * a SE bus and still claim they can try LVD only settings */ + if (i->f->get_signalling) + i->f->get_signalling(shost); + if (spi_signalling(shost) == SPI_SIGNAL_SE || + spi_signalling(shost) == SPI_SIGNAL_HVD) + DV_SET(dt, 0); /* Do the read only INQUIRY tests */ spi_dv_retrain(sdev, buffer, buffer + sdev->inquiry_len, spi_dv_device_compare_inquiry); diff --git a/drivers/scsi/scsi_typedefs.h b/drivers/scsi/scsi_typedefs.h index 29f038b42..2ed4c5cb7 100644 --- a/drivers/scsi/scsi_typedefs.h +++ b/drivers/scsi/scsi_typedefs.h @@ -1,3 +1,2 @@ typedef struct scsi_cmnd Scsi_Cmnd; -typedef struct scsi_request Scsi_Request; diff --git a/drivers/scsi/scsicam.c b/drivers/scsi/scsicam.c index b78354fc4..cd68a66c7 100644 --- a/drivers/scsi/scsicam.c +++ b/drivers/scsi/scsicam.c @@ -57,6 +57,7 @@ EXPORT_SYMBOL(scsi_bios_ptable); int scsicam_bios_param(struct block_device *bdev, sector_t capacity, int *ip) { unsigned char *p; + u64 capacity64 = capacity; /* Suppress gcc warning */ int ret; p = scsi_bios_ptable(bdev); @@ -68,7 +69,7 @@ int scsicam_bios_param(struct block_device *bdev, sector_t capacity, int *ip) (unsigned int *)ip + 0, (unsigned int *)ip + 1); kfree(p); - if (ret == -1) { + if (ret == -1 && capacity64 < (1ULL << 32)) { /* pick some standard mapping with at most 1024 cylinders, and at most 62 sectors per track - this works up to 7905 MB */ diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index c647d85d9..98bd3aab9 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -32,7 +32,6 @@ * than the level indicated above to trigger output. */ -#include #include #include #include @@ -175,7 +174,7 @@ static ssize_t sd_store_cache_type(struct class_device *cdev, const char *buf, * it's not worth the risk */ return -EINVAL; - for (i = 0; i < sizeof(sd_cache_types)/sizeof(sd_cache_types[0]); i++) { + for (i = 0; i < ARRAY_SIZE(sd_cache_types); i++) { const int len = strlen(sd_cache_types[i]); if (strncmp(sd_cache_types[i], buf, len) == 0 && buf[len] == '\n') { @@ -208,6 +207,23 @@ static ssize_t sd_store_cache_type(struct class_device *cdev, const char *buf, return count; } +static ssize_t sd_store_allow_restart(struct class_device *cdev, const char *buf, + size_t count) +{ + struct scsi_disk *sdkp = to_scsi_disk(cdev); + struct scsi_device *sdp = sdkp->device; + + if (!capable(CAP_SYS_ADMIN)) + return -EACCES; + + if (sdp->type != TYPE_DISK) + return -EINVAL; + + sdp->allow_restart = simple_strtoul(buf, NULL, 10); + + return count; +} + static ssize_t sd_show_cache_type(struct class_device *cdev, char *buf) { struct scsi_disk *sdkp = to_scsi_disk(cdev); @@ -223,10 +239,19 @@ static ssize_t sd_show_fua(struct class_device *cdev, char *buf) return snprintf(buf, 20, "%u\n", sdkp->DPOFUA); } +static ssize_t sd_show_allow_restart(struct class_device *cdev, char *buf) +{ + struct scsi_disk *sdkp = to_scsi_disk(cdev); + + return snprintf(buf, 40, "%d\n", sdkp->device->allow_restart); +} + static struct class_device_attribute sd_disk_attrs[] = { __ATTR(cache_type, S_IRUGO|S_IWUSR, sd_show_cache_type, sd_store_cache_type), __ATTR(FUA, S_IRUGO, sd_show_fua, NULL), + __ATTR(allow_restart, S_IRUGO|S_IWUSR, sd_show_allow_restart, + sd_store_allow_restart), __ATTR_NULL, }; @@ -477,8 +502,7 @@ static int sd_init_command(struct scsi_cmnd * SCpnt) SCpnt->cmnd[4] = (unsigned char) this_count; SCpnt->cmnd[5] = 0; } - SCpnt->request_bufflen = SCpnt->bufflen = - this_count * sdp->sector_size; + SCpnt->request_bufflen = this_count * sdp->sector_size; /* * We shouldn't disconnect in the middle of a sector, so with a dumb @@ -891,11 +915,10 @@ static struct block_device_operations sd_fops = { static void sd_rw_intr(struct scsi_cmnd * SCpnt) { int result = SCpnt->result; - int this_count = SCpnt->bufflen; - int good_bytes = (result == 0 ? this_count : 0); - sector_t block_sectors = 1; - u64 first_err_block; - sector_t error_sector; + unsigned int xfer_size = SCpnt->request_bufflen; + unsigned int good_bytes = result ? 0 : xfer_size; + u64 start_lba = SCpnt->request->sector; + u64 bad_lba; struct scsi_sense_hdr sshdr; int sense_valid = 0; int sense_deferred = 0; @@ -906,7 +929,6 @@ static void sd_rw_intr(struct scsi_cmnd * SCpnt) if (sense_valid) sense_deferred = scsi_sense_is_deferred(&sshdr); } - #ifdef CONFIG_SCSI_LOGGING SCSI_LOG_HLCOMPLETE(1, printk("sd_rw_intr: %s: res=0x%x\n", SCpnt->request->rq_disk->disk_name, result)); @@ -916,89 +938,72 @@ static void sd_rw_intr(struct scsi_cmnd * SCpnt) sshdr.sense_key, sshdr.asc, sshdr.ascq)); } #endif - /* - Handle MEDIUM ERRORs that indicate partial success. Since this is a - relatively rare error condition, no care is taken to avoid - unnecessary additional work such as memcpy's that could be avoided. - */ - if (driver_byte(result) != 0 && - sense_valid && !sense_deferred) { - switch (sshdr.sense_key) { - case MEDIUM_ERROR: - if (!blk_fs_request(SCpnt->request)) - break; - info_valid = scsi_get_sense_info_fld( - SCpnt->sense_buffer, SCSI_SENSE_BUFFERSIZE, - &first_err_block); - /* - * May want to warn and skip if following cast results - * in actual truncation (if sector_t < 64 bits) - */ - error_sector = (sector_t)first_err_block; - if (SCpnt->request->bio != NULL) - block_sectors = bio_sectors(SCpnt->request->bio); - switch (SCpnt->device->sector_size) { - case 1024: - error_sector <<= 1; - if (block_sectors < 2) - block_sectors = 2; - break; - case 2048: - error_sector <<= 2; - if (block_sectors < 4) - block_sectors = 4; - break; - case 4096: - error_sector <<=3; - if (block_sectors < 8) - block_sectors = 8; - break; - case 256: - error_sector >>= 1; - break; - default: - break; - } + if (driver_byte(result) != DRIVER_SENSE && + (!sense_valid || sense_deferred)) + goto out; - error_sector &= ~(block_sectors - 1); - good_bytes = (error_sector - SCpnt->request->sector) << 9; - if (good_bytes < 0 || good_bytes >= this_count) - good_bytes = 0; + switch (sshdr.sense_key) { + case HARDWARE_ERROR: + case MEDIUM_ERROR: + if (!blk_fs_request(SCpnt->request)) + goto out; + info_valid = scsi_get_sense_info_fld(SCpnt->sense_buffer, + SCSI_SENSE_BUFFERSIZE, + &bad_lba); + if (!info_valid) + goto out; + if (xfer_size <= SCpnt->device->sector_size) + goto out; + switch (SCpnt->device->sector_size) { + case 256: + start_lba <<= 1; break; - - case RECOVERED_ERROR: /* an error occurred, but it recovered */ - case NO_SENSE: /* LLDD got sense data */ - /* - * Inform the user, but make sure that it's not treated - * as a hard error. - */ - scsi_print_sense("sd", SCpnt); - SCpnt->result = 0; - memset(SCpnt->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE); - good_bytes = this_count; + case 512: break; - - case ILLEGAL_REQUEST: - if (SCpnt->device->use_10_for_rw && - (SCpnt->cmnd[0] == READ_10 || - SCpnt->cmnd[0] == WRITE_10)) - SCpnt->device->use_10_for_rw = 0; - if (SCpnt->device->use_10_for_ms && - (SCpnt->cmnd[0] == MODE_SENSE_10 || - SCpnt->cmnd[0] == MODE_SELECT_10)) - SCpnt->device->use_10_for_ms = 0; + case 1024: + start_lba >>= 1; + break; + case 2048: + start_lba >>= 2; + break; + case 4096: + start_lba >>= 3; break; - default: + /* Print something here with limiting frequency. */ + goto out; break; } + /* This computation should always be done in terms of + * the resolution of the device's medium. + */ + good_bytes = (bad_lba - start_lba)*SCpnt->device->sector_size; + break; + case RECOVERED_ERROR: + case NO_SENSE: + /* Inform the user, but make sure that it's not treated + * as a hard error. + */ + scsi_print_sense("sd", SCpnt); + SCpnt->result = 0; + memset(SCpnt->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE); + good_bytes = xfer_size; + break; + case ILLEGAL_REQUEST: + if (SCpnt->device->use_10_for_rw && + (SCpnt->cmnd[0] == READ_10 || + SCpnt->cmnd[0] == WRITE_10)) + SCpnt->device->use_10_for_rw = 0; + if (SCpnt->device->use_10_for_ms && + (SCpnt->cmnd[0] == MODE_SENSE_10 || + SCpnt->cmnd[0] == MODE_SELECT_10)) + SCpnt->device->use_10_for_ms = 0; + break; + default: + break; } - /* - * This calls the generic completion function, now that we know - * how many actual sectors finished, and how many sectors we need - * to say have failed. - */ - scsi_io_completion(SCpnt, good_bytes, block_sectors << 9); + out: + scsi_io_completion(SCpnt, good_bytes); } static int media_not_present(struct scsi_disk *sdkp, diff --git a/drivers/scsi/seagate.c b/drivers/scsi/seagate.c index 0ff83ddf1..2679ea8bf 100644 --- a/drivers/scsi/seagate.c +++ b/drivers/scsi/seagate.c @@ -312,7 +312,7 @@ static Signature __initdata signatures[] = { {"IBM F1 V1.2009/22/93", 5, 25, FD}, }; -#define NUM_SIGNATURES (sizeof(signatures) / sizeof(Signature)) +#define NUM_SIGNATURES ARRAY_SIZE(signatures) #endif /* n OVERRIDE */ /* @@ -457,7 +457,7 @@ int __init seagate_st0x_detect (struct scsi_host_template * tpnt) * space for the on-board RAM instead. */ - for (i = 0; i < (sizeof (seagate_bases) / sizeof (unsigned int)); ++i) { + for (i = 0; i < ARRAY_SIZE(seagate_bases); ++i) { void __iomem *p = ioremap(seagate_bases[i], 0x2000); if (!p) continue; @@ -497,7 +497,7 @@ int __init seagate_st0x_detect (struct scsi_host_template * tpnt) return 0; hostno = instance->host_no; - if (request_irq (irq, do_seagate_reconnect_intr, SA_INTERRUPT, (controller_type == SEAGATE) ? "seagate" : "tmc-8xx", instance)) { + if (request_irq (irq, do_seagate_reconnect_intr, IRQF_DISABLED, (controller_type == SEAGATE) ? "seagate" : "tmc-8xx", instance)) { printk(KERN_ERR "scsi%d : unable to allocate IRQ%d\n", hostno, irq); return 0; } @@ -1002,7 +1002,7 @@ connect_loop: } #endif - buffer = (struct scatterlist *) SCint->buffer; + buffer = (struct scatterlist *) SCint->request_buffer; len = buffer->length; data = page_address(buffer->page) + buffer->offset; } else { diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index b09894244..34f9343ed 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c @@ -18,8 +18,8 @@ * */ -static int sg_version_num = 30533; /* 2 digits for each component */ -#define SG_VERSION_STR "3.5.33" +static int sg_version_num = 30534; /* 2 digits for each component */ +#define SG_VERSION_STR "3.5.34" /* * D. P. Gilbert (dgilbert@interlog.com, dougg@triode.net.au), notes: @@ -28,7 +28,6 @@ static int sg_version_num = 30533; /* 2 digits for each component */ * (otherwise the macros compile to empty statements). * */ -#include #include #include @@ -61,7 +60,7 @@ static int sg_version_num = 30533; /* 2 digits for each component */ #ifdef CONFIG_SCSI_PROC_FS #include -static char *sg_version_date = "20050908"; +static char *sg_version_date = "20060818"; static int sg_proc_init(void); static void sg_proc_cleanup(void); @@ -1165,7 +1164,7 @@ sg_vma_nopage(struct vm_area_struct *vma, unsigned long addr, int *type) len = vma->vm_end - sa; len = (len < sg->length) ? len : sg->length; if (offset < len) { - page = sg->page; + page = virt_to_page(page_address(sg->page) + offset); get_page(page); /* increment page count */ break; } @@ -1402,6 +1401,7 @@ sg_add(struct class_device *cl_dev, struct class_interface *cl_intf) Sg_device *sdp = NULL; struct cdev * cdev = NULL; int error, k; + unsigned long iflags; disk = alloc_disk(1); if (!disk) { @@ -1429,7 +1429,7 @@ sg_add(struct class_device *cl_dev, struct class_interface *cl_intf) error = cdev_add(cdev, MKDEV(SCSI_GENERIC_MAJOR, k), 1); if (error) - goto out; + goto cdev_add_err; sdp->cdev = cdev; if (sg_sysfs_valid) { @@ -1456,6 +1456,13 @@ sg_add(struct class_device *cl_dev, struct class_interface *cl_intf) return 0; +cdev_add_err: + write_lock_irqsave(&sg_dev_arr_lock, iflags); + kfree(sg_dev_arr[k]); + sg_dev_arr[k] = NULL; + sg_nr_dev--; + write_unlock_irqrestore(&sg_dev_arr_lock, iflags); + out: put_disk(disk); if (cdev) @@ -2635,8 +2642,7 @@ static int sg_proc_init(void) { int k, mask; - int num_leaves = - sizeof (sg_proc_leaf_arr) / sizeof (sg_proc_leaf_arr[0]); + int num_leaves = ARRAY_SIZE(sg_proc_leaf_arr); struct proc_dir_entry *pdep; struct sg_proc_leaf * leaf; @@ -2661,8 +2667,7 @@ static void sg_proc_cleanup(void) { int k; - int num_leaves = - sizeof (sg_proc_leaf_arr) / sizeof (sg_proc_leaf_arr[0]); + int num_leaves = ARRAY_SIZE(sg_proc_leaf_arr); if (!sg_proc_sgp) return; diff --git a/drivers/scsi/sim710.c b/drivers/scsi/sim710.c index 255886a9a..b27e85428 100644 --- a/drivers/scsi/sim710.c +++ b/drivers/scsi/sim710.c @@ -26,7 +26,6 @@ * */ -#include #include #include @@ -134,7 +133,7 @@ sim710_probe_common(struct device *dev, unsigned long base_addr, host->this_id = scsi_id; host->base = base_addr; host->irq = irq; - if (request_irq(irq, NCR_700_intr, SA_SHIRQ, "sim710", host)) { + if (request_irq(irq, NCR_700_intr, IRQF_SHARED, "sim710", host)) { printk(KERN_ERR "sim710: request_irq failed\n"); goto out_put_host; } diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index 7c80711e1..fae6e95a6 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c @@ -217,7 +217,7 @@ int sr_media_change(struct cdrom_device_info *cdi, int slot) static void rw_intr(struct scsi_cmnd * SCpnt) { int result = SCpnt->result; - int this_count = SCpnt->bufflen; + int this_count = SCpnt->request_bufflen; int good_bytes = (result == 0 ? this_count : 0); int block_sectors = 0; long error_sector; @@ -292,7 +292,7 @@ static void rw_intr(struct scsi_cmnd * SCpnt) * how many actual sectors finished, and how many sectors we need * to say have failed. */ - scsi_io_completion(SCpnt, good_bytes, block_sectors << 9); + scsi_io_completion(SCpnt, good_bytes); } static int sr_init_command(struct scsi_cmnd * SCpnt) @@ -360,7 +360,7 @@ static int sr_init_command(struct scsi_cmnd * SCpnt) "mismatch count %d, bytes %d\n", size, SCpnt->request_bufflen); if (SCpnt->request_bufflen > size) - SCpnt->request_bufflen = SCpnt->bufflen = size; + SCpnt->request_bufflen = size; } } @@ -387,8 +387,7 @@ static int sr_init_command(struct scsi_cmnd * SCpnt) if (this_count > 0xffff) { this_count = 0xffff; - SCpnt->request_bufflen = SCpnt->bufflen = - this_count * s_size; + SCpnt->request_bufflen = this_count * s_size; } SCpnt->cmnd[2] = (unsigned char) (block >> 24) & 0xff; diff --git a/drivers/scsi/sr_vendor.c b/drivers/scsi/sr_vendor.c index 9dde8df2f..a3e9d0f2e 100644 --- a/drivers/scsi/sr_vendor.c +++ b/drivers/scsi/sr_vendor.c @@ -34,7 +34,6 @@ * HP 6020 writers now supported. */ -#include #include #include #include diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 56cb49006..7f669b600 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -368,7 +368,7 @@ static int st_chk_result(struct scsi_tape *STp, struct st_request * SRpnt) SRpnt->cmd[0], SRpnt->cmd[1], SRpnt->cmd[2], SRpnt->cmd[3], SRpnt->cmd[4], SRpnt->cmd[5]); if (cmdstatp->have_sense) - __scsi_print_sense("st", SRpnt->sense, SCSI_SENSE_BUFFERSIZE); + __scsi_print_sense(name, SRpnt->sense, SCSI_SENSE_BUFFERSIZE); } ) /* end DEB */ if (!debugging) { /* Abnormal conditions for tape */ if (!cmdstatp->have_sense) @@ -384,9 +384,8 @@ static int st_chk_result(struct scsi_tape *STp, struct st_request * SRpnt) scode != VOLUME_OVERFLOW && SRpnt->cmd[0] != MODE_SENSE && SRpnt->cmd[0] != TEST_UNIT_READY) { - printk(KERN_WARNING "%s: Error with sense data: ", name); - __scsi_print_sense("st", SRpnt->sense, - SCSI_SENSE_BUFFERSIZE); + + __scsi_print_sense(name, SRpnt->sense, SCSI_SENSE_BUFFERSIZE); } } @@ -1193,7 +1192,7 @@ static int st_open(struct inode *inode, struct file *filp) /* Flush the tape buffer before close */ -static int st_flush(struct file *filp) +static int st_flush(struct file *filp, fl_owner_t id) { int result = 0, result2; unsigned char cmd[MAX_COMMAND_SIZE]; @@ -2818,7 +2817,7 @@ static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned lon (cmdstatp->sense_hdr.sense_key == NO_SENSE || cmdstatp->sense_hdr.sense_key == RECOVERED_ERROR) && undone == 0) { - ioctl_result = 0; /* EOF written succesfully at EOM */ + ioctl_result = 0; /* EOF written successfully at EOM */ if (fileno >= 0) fileno++; STps->drv_file = fileno; @@ -3599,7 +3598,6 @@ static struct st_buffer * tb->use_sg = max_sg; tb->frp = (struct st_buf_fragment *)(&(tb->sg[0]) + max_sg); - tb->in_use = 1; tb->dma = need_dma; tb->buffer_size = got; @@ -3839,7 +3837,7 @@ static int __init st_setup(char *str) break; } } - if (i >= sizeof(parms) / sizeof(struct st_dev_parm)) + if (i >= ARRAY_SIZE(parms)) printk(KERN_WARNING "st: invalid parameter in '%s'\n", stp); stp = strchr(stp, ','); diff --git a/drivers/scsi/st.h b/drivers/scsi/st.h index 411209048..05a5cae12 100644 --- a/drivers/scsi/st.h +++ b/drivers/scsi/st.h @@ -31,7 +31,6 @@ struct st_request { /* The tape buffer descriptor. */ struct st_buffer { - unsigned char in_use; unsigned char dma; /* DMA-able buffer */ unsigned char do_dio; /* direct i/o set up? */ int buffer_size; diff --git a/drivers/scsi/sun3_NCR5380.c b/drivers/scsi/sun3_NCR5380.c index 25cced91c..2f8073b73 100644 --- a/drivers/scsi/sun3_NCR5380.c +++ b/drivers/scsi/sun3_NCR5380.c @@ -517,7 +517,7 @@ static __inline__ void initialize_SCp(Scsi_Cmnd *cmd) */ if (cmd->use_sg) { - cmd->SCp.buffer = (struct scatterlist *) cmd->buffer; + cmd->SCp.buffer = (struct scatterlist *) cmd->request_buffer; cmd->SCp.buffers_residual = cmd->use_sg - 1; cmd->SCp.ptr = (char *) SGADDR(cmd->SCp.buffer); cmd->SCp.this_residual = cmd->SCp.buffer->length; @@ -535,7 +535,6 @@ static __inline__ void initialize_SCp(Scsi_Cmnd *cmd) } -#include #include #if 1 diff --git a/drivers/scsi/sun3x_esp.c b/drivers/scsi/sun3x_esp.c index cc990bed9..6b60536ac 100644 --- a/drivers/scsi/sun3x_esp.c +++ b/drivers/scsi/sun3x_esp.c @@ -97,7 +97,7 @@ int sun3x_esp_detect(struct scsi_host_template *tpnt) esp->esp_command_dvma = dvma_vtob((unsigned long)esp->esp_command); esp->irq = 2; - if (request_irq(esp->irq, esp_intr, SA_INTERRUPT, + if (request_irq(esp->irq, esp_intr, IRQF_DISABLED, "SUN3X SCSI", esp->ehost)) { esp_deallocate(esp); return 0; @@ -332,11 +332,11 @@ static void dma_mmu_get_scsi_sgl (struct NCR_ESP *esp, Scsi_Cmnd *sp) struct scatterlist *sg = sp->SCp.buffer; while (sz >= 0) { - sg[sz].dvma_address = dvma_map((unsigned long)page_address(sg[sz].page) + + sg[sz].dma_address = dvma_map((unsigned long)page_address(sg[sz].page) + sg[sz].offset, sg[sz].length); sz--; } - sp->SCp.ptr=(char *)((unsigned long)sp->SCp.buffer->dvma_address); + sp->SCp.ptr=(char *)((unsigned long)sp->SCp.buffer->dma_address); } static void dma_mmu_release_scsi_one (struct NCR_ESP *esp, Scsi_Cmnd *sp) @@ -347,17 +347,17 @@ static void dma_mmu_release_scsi_one (struct NCR_ESP *esp, Scsi_Cmnd *sp) static void dma_mmu_release_scsi_sgl (struct NCR_ESP *esp, Scsi_Cmnd *sp) { int sz = sp->use_sg - 1; - struct scatterlist *sg = (struct scatterlist *)sp->buffer; + struct scatterlist *sg = (struct scatterlist *)sp->request_buffer; while(sz >= 0) { - dvma_unmap((char *)sg[sz].dvma_address); + dvma_unmap((char *)sg[sz].dma_address); sz--; } } static void dma_advance_sg (Scsi_Cmnd *sp) { - sp->SCp.ptr = (char *)((unsigned long)sp->SCp.buffer->dvma_address); + sp->SCp.ptr = (char *)((unsigned long)sp->SCp.buffer->dma_address); } static int sun3x_esp_release(struct Scsi_Host *instance) diff --git a/drivers/scsi/sym53c8xx_2/sym53c8xx.h b/drivers/scsi/sym53c8xx_2/sym53c8xx.h index 481103769..7519728df 100644 --- a/drivers/scsi/sym53c8xx_2/sym53c8xx.h +++ b/drivers/scsi/sym53c8xx_2/sym53c8xx.h @@ -40,7 +40,6 @@ #ifndef SYM53C8XX_H #define SYM53C8XX_H -#include /* * DMA addressing mode. diff --git a/drivers/scsi/sym53c8xx_2/sym_glue.c b/drivers/scsi/sym53c8xx_2/sym_glue.c index 9c83b4d39..739d3ef46 100644 --- a/drivers/scsi/sym53c8xx_2/sym_glue.c +++ b/drivers/scsi/sym53c8xx_2/sym_glue.c @@ -54,14 +54,8 @@ #define NAME53C "sym53c" #define NAME53C8XX "sym53c8xx" -/* SPARC just has to be different ... */ -#ifdef __sparc__ -#define IRQ_FMT "%s" -#define IRQ_PRM(x) __irq_itoa(x) -#else #define IRQ_FMT "%d" #define IRQ_PRM(x) (x) -#endif struct sym_driver_setup sym_driver_setup = SYM_LINUX_DRIVER_SETUP; unsigned int sym_debug_flags = 0; @@ -156,7 +150,7 @@ static void __unmap_scsi_data(struct pci_dev *pdev, struct scsi_cmnd *cmd) switch(SYM_UCMD_PTR(cmd)->data_mapped) { case 2: - pci_unmap_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir); + pci_unmap_sg(pdev, cmd->request_buffer, cmd->use_sg, dma_dir); break; case 1: pci_unmap_single(pdev, SYM_UCMD_PTR(cmd)->data_mapping, @@ -186,7 +180,7 @@ static int __map_scsi_sg_data(struct pci_dev *pdev, struct scsi_cmnd *cmd) int use_sg; int dma_dir = cmd->sc_data_direction; - use_sg = pci_map_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir); + use_sg = pci_map_sg(pdev, cmd->request_buffer, cmd->use_sg, dma_dir); if (use_sg > 0) { SYM_UCMD_PTR(cmd)->data_mapped = 2; SYM_UCMD_PTR(cmd)->data_mapping = use_sg; @@ -376,7 +370,7 @@ static int sym_scatter(struct sym_hcb *np, struct sym_ccb *cp, struct scsi_cmnd if (!use_sg) segment = sym_scatter_no_sglist(np, cp, cmd); else if ((use_sg = map_scsi_sg_data(np, cmd)) > 0) { - struct scatterlist *scatter = (struct scatterlist *)cmd->buffer; + struct scatterlist *scatter = (struct scatterlist *)cmd->request_buffer; struct sym_tcb *tp = &np->target[cp->target]; struct sym_tblmove *data; @@ -1553,7 +1547,7 @@ static struct Scsi_Host * __devinit sym_attach(struct scsi_host_template *tpnt, * If we synchonize the C code with SCRIPTS on interrupt, * we do not want to share the INTR line at all. */ - if (request_irq(pdev->irq, sym53c8xx_intr, SA_SHIRQ, NAME53C8XX, np)) { + if (request_irq(pdev->irq, sym53c8xx_intr, IRQF_SHARED, NAME53C8XX, np)) { printf_err("%s: request irq %d failure\n", sym_name(np), pdev->irq); goto attach_failed; @@ -2090,7 +2084,7 @@ static struct pci_device_id sym2_id_table[] __devinitdata = { { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_NCR_53C860, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_53C1510, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, + PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_SCSI<<8, 0xffff00, 0UL }, { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_NCR_53C896, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_NCR_53C895, diff --git a/drivers/scsi/sym53c8xx_2/sym_glue.h b/drivers/scsi/sym53c8xx_2/sym_glue.h index a446cda3f..e022d3c71 100644 --- a/drivers/scsi/sym53c8xx_2/sym_glue.h +++ b/drivers/scsi/sym53c8xx_2/sym_glue.h @@ -40,7 +40,6 @@ #ifndef SYM_GLUE_H #define SYM_GLUE_H -#include #include #include #include diff --git a/drivers/scsi/sym53c8xx_2/sym_hipd.c b/drivers/scsi/sym53c8xx_2/sym_hipd.c index a671bdc07..940fa1e6f 100644 --- a/drivers/scsi/sym53c8xx_2/sym_hipd.c +++ b/drivers/scsi/sym53c8xx_2/sym_hipd.c @@ -1276,8 +1276,7 @@ static struct sym_chip sym_dev_table[] = { FE_RAM|FE_IO256|FE_LEDC} }; -#define sym_num_devs \ - (sizeof(sym_dev_table) / sizeof(sym_dev_table[0])) +#define sym_num_devs (ARRAY_SIZE(sym_dev_table)) /* * Look up the chip table. diff --git a/drivers/scsi/t128.c b/drivers/scsi/t128.c index 21305fc91..2df6747cb 100644 --- a/drivers/scsi/t128.c +++ b/drivers/scsi/t128.c @@ -126,15 +126,15 @@ static struct override { unsigned long address; int irq; -} overrides +} overrides #ifdef T128_OVERRIDE [] __initdata = T128_OVERRIDE; #else - [4] __initdata = {{0, IRQ_AUTO}, {0, IRQ_AUTO}, + [4] __initdata = {{0, IRQ_AUTO}, {0, IRQ_AUTO}, {0 ,IRQ_AUTO}, {0, IRQ_AUTO}}; #endif -#define NO_OVERRIDES (sizeof(overrides) / sizeof(struct override)) +#define NO_OVERRIDES ARRAY_SIZE(overrides) static struct base { unsigned int address; @@ -143,7 +143,7 @@ static struct base { { 0xcc000, 0}, { 0xc8000, 0}, { 0xdc000, 0}, { 0xd8000, 0} }; -#define NO_BASES (sizeof (bases) / sizeof (struct base)) +#define NO_BASES ARRAY_SIZE(bases) static struct signature { const char *string; @@ -152,7 +152,7 @@ static struct signature { {"TSROM: SCSI BIOS, Version 1.12", 0x36}, }; -#define NO_SIGNATURES (sizeof (signatures) / sizeof (struct signature)) +#define NO_SIGNATURES ARRAY_SIZE(signatures) /* * Function : t128_setup(char *str, int *ints) @@ -260,7 +260,7 @@ found: instance->irq = NCR5380_probe_irq(instance, T128_IRQS); if (instance->irq != SCSI_IRQ_NONE) - if (request_irq(instance->irq, t128_intr, SA_INTERRUPT, "t128", instance)) { + if (request_irq(instance->irq, t128_intr, IRQF_DISABLED, "t128", instance)) { printk("scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq); instance->irq = SCSI_IRQ_NONE; diff --git a/drivers/scsi/tmscsim.c b/drivers/scsi/tmscsim.c index 91322aff2..9404ff3d4 100644 --- a/drivers/scsi/tmscsim.c +++ b/drivers/scsi/tmscsim.c @@ -218,7 +218,6 @@ #endif #define DCBDEBUG1(x) C_NOP -#include #include #include #include @@ -2585,7 +2584,7 @@ static int __devinit dc390_probe_one(struct pci_dev *pdev, /* Reset Pending INT */ DC390_read8_(INT_Status, io_port); - if (request_irq(pdev->irq, do_DC390_Interrupt, SA_SHIRQ, + if (request_irq(pdev->irq, do_DC390_Interrupt, IRQF_SHARED, "tmscsim", pACB)) { printk(KERN_ERR "DC390: register IRQ error!\n"); goto out_release_region; diff --git a/drivers/scsi/tmscsim.h b/drivers/scsi/tmscsim.h index d4495272f..9b66fa8d3 100644 --- a/drivers/scsi/tmscsim.h +++ b/drivers/scsi/tmscsim.h @@ -9,7 +9,6 @@ #define _TMSCSIM_H #include -#include #define SCSI_IRQ_NONE 255 diff --git a/drivers/scsi/u14-34f.c b/drivers/scsi/u14-34f.c index 33cd90fc6..57449611e 100644 --- a/drivers/scsi/u14-34f.c +++ b/drivers/scsi/u14-34f.c @@ -405,7 +405,6 @@ * the driver sets host->wish_block = TRUE for all ISA boards. */ -#include #include #include #include @@ -873,7 +872,7 @@ static int port_detect \ /* Board detected, allocate its IRQ */ if (request_irq(irq, do_interrupt_handler, - SA_INTERRUPT | ((subversion == ESA) ? SA_SHIRQ : 0), + IRQF_DISABLED | ((subversion == ESA) ? IRQF_SHARED : 0), driver_name, (void *) &sha[j])) { printk("%s: unable to allocate IRQ %u, detaching.\n", name, irq); goto freelock; diff --git a/drivers/scsi/wd33c93.c b/drivers/scsi/wd33c93.c index d8a72609a..2083454db 100644 --- a/drivers/scsi/wd33c93.c +++ b/drivers/scsi/wd33c93.c @@ -71,7 +71,6 @@ * Richard Hirst August 2000 */ -#include #include #include @@ -374,7 +373,7 @@ wd33c93_queuecommand(struct scsi_cmnd *cmd, */ if (cmd->use_sg) { - cmd->SCp.buffer = (struct scatterlist *) cmd->buffer; + cmd->SCp.buffer = (struct scatterlist *) cmd->request_buffer; cmd->SCp.buffers_residual = cmd->use_sg - 1; cmd->SCp.ptr = page_address(cmd->SCp.buffer->page) + cmd->SCp.buffer->offset; @@ -939,6 +938,7 @@ wd33c93_intr(struct Scsi_Host *instance) DB(DB_INTR, printk("%02x", cmd->SCp.Status)) if (hostdata->level2 >= L2_BASIC) { sr = read_wd33c93(regs, WD_SCSI_STATUS); /* clear interrupt */ + udelay(7); hostdata->state = S_RUNNING_LEVEL2; write_wd33c93(regs, WD_COMMAND_PHASE, 0x50); write_wd33c93_cmd(regs, WD_CMD_SEL_ATN_XFER); @@ -955,6 +955,7 @@ wd33c93_intr(struct Scsi_Host *instance) msg = read_1_byte(regs); sr = read_wd33c93(regs, WD_SCSI_STATUS); /* clear interrupt */ + udelay(7); hostdata->incoming_msg[hostdata->incoming_ptr] = msg; if (hostdata->incoming_msg[0] == EXTENDED_MESSAGE) @@ -1358,6 +1359,7 @@ wd33c93_intr(struct Scsi_Host *instance) } else { /* Verify this is a change to MSG_IN and read the message */ sr = read_wd33c93(regs, WD_SCSI_STATUS); + udelay(7); if (sr == (CSR_ABORT | PHS_MESS_IN) || sr == (CSR_UNEXP | PHS_MESS_IN) || sr == (CSR_SRV_REQ | PHS_MESS_IN)) { @@ -1374,6 +1376,7 @@ wd33c93_intr(struct Scsi_Host *instance) asr); } sr = read_wd33c93(regs, WD_SCSI_STATUS); + udelay(7); if (sr != CSR_MSGIN) printk ("wd33c93: Not paused with ACK on RESEL (%02x)\n", @@ -1701,7 +1704,7 @@ wd33c93_abort(struct scsi_cmnd * cmd) } #define MAX_WD33C93_HOSTS 4 -#define MAX_SETUP_ARGS ((int)(sizeof(setup_args) / sizeof(char *))) +#define MAX_SETUP_ARGS ARRAY_SIZE(setup_args) #define SETUP_BUFFER_SIZE 200 static char setup_buffer[SETUP_BUFFER_SIZE]; static char setup_used[MAX_SETUP_ARGS]; diff --git a/drivers/scsi/wd33c93.h b/drivers/scsi/wd33c93.h index 193ec517d..edcb0365c 100644 --- a/drivers/scsi/wd33c93.h +++ b/drivers/scsi/wd33c93.h @@ -22,7 +22,6 @@ #ifndef WD33C93_H #define WD33C93_H -#include #define PROC_INTERFACE /* add code for /proc/scsi/wd33c93/xxx interface */ #ifdef PROC_INTERFACE diff --git a/drivers/scsi/wd7000.c b/drivers/scsi/wd7000.c index fb54a87a8..a0b61af48 100644 --- a/drivers/scsi/wd7000.c +++ b/drivers/scsi/wd7000.c @@ -267,7 +267,7 @@ static const long wd7000_biosaddr[] = { 0xc0000, 0xc2000, 0xc4000, 0xc6000, 0xc8000, 0xca000, 0xcc000, 0xce000, 0xd0000, 0xd2000, 0xd4000, 0xd6000, 0xd8000, 0xda000, 0xdc000, 0xde000 }; -#define NUM_ADDRS (sizeof(wd7000_biosaddr)/sizeof(long)) +#define NUM_ADDRS ARRAY_SIZE(wd7000_biosaddr) static const unsigned short wd7000_iobase[] = { 0x0300, 0x0308, 0x0310, 0x0318, 0x0320, 0x0328, 0x0330, 0x0338, @@ -275,13 +275,13 @@ static const unsigned short wd7000_iobase[] = { 0x0380, 0x0388, 0x0390, 0x0398, 0x03a0, 0x03a8, 0x03b0, 0x03b8, 0x03c0, 0x03c8, 0x03d0, 0x03d8, 0x03e0, 0x03e8, 0x03f0, 0x03f8 }; -#define NUM_IOPORTS (sizeof(wd7000_iobase)/sizeof(unsigned short)) +#define NUM_IOPORTS ARRAY_SIZE(wd7000_iobase) static const short wd7000_irq[] = { 3, 4, 5, 7, 9, 10, 11, 12, 14, 15 }; -#define NUM_IRQS (sizeof(wd7000_irq)/sizeof(short)) +#define NUM_IRQS ARRAY_SIZE(wd7000_irq) static const short wd7000_dma[] = { 5, 6, 7 }; -#define NUM_DMAS (sizeof(wd7000_dma)/sizeof(short)) +#define NUM_DMAS ARRAY_SIZE(wd7000_dma) /* * The following is set up by wd7000_detect, and used thereafter for @@ -317,7 +317,7 @@ static Config configs[] = { {7, 6, 0x350, BUS_ON, BUS_OFF}, /* My configuration (Zaga) */ {-1, -1, 0x0, BUS_ON, BUS_OFF} /* Empty slot */ }; -#define NUM_CONFIGS (sizeof(configs)/sizeof(Config)) +#define NUM_CONFIGS ARRAY_SIZE(configs) /* * The following list defines strings to look for in the BIOS that identify @@ -333,7 +333,7 @@ typedef struct signature { static const Signature signatures[] = { {"SSTBIOS", 0x0000d, 7} /* "SSTBIOS" @ offset 0x0000d */ }; -#define NUM_SIGNATURES (sizeof(signatures)/sizeof(Signature)) +#define NUM_SIGNATURES ARRAY_SIZE(signatures) /* @@ -1250,7 +1250,7 @@ static int wd7000_init(Adapter * host) return 0; - if (request_irq(host->irq, wd7000_intr, SA_INTERRUPT, "wd7000", host)) { + if (request_irq(host->irq, wd7000_intr, IRQF_DISABLED, "wd7000", host)) { printk("wd7000_init: can't get IRQ %d.\n", host->irq); return (0); } @@ -1391,7 +1391,7 @@ static int wd7000_proc_info(struct Scsi_Host *host, char *buffer, char **start, * */ -static int wd7000_detect(struct scsi_host_template *tpnt) +static __init int wd7000_detect(struct scsi_host_template *tpnt) { short present = 0, biosaddr_ptr, sig_ptr, i, pass; short biosptr[NUM_CONFIGS]; diff --git a/drivers/scsi/zalon.c b/drivers/scsi/zalon.c index a6cfbb3b3..4b5f908d3 100644 --- a/drivers/scsi/zalon.c +++ b/drivers/scsi/zalon.c @@ -136,7 +136,7 @@ zalon_probe(struct parisc_device *dev) if (!host) goto fail; - if (request_irq(dev->irq, ncr53c8xx_intr, SA_SHIRQ, "zalon", host)) { + if (request_irq(dev->irq, ncr53c8xx_intr, IRQF_SHARED, "zalon", host)) { printk(KERN_ERR "%s: irq problem with %d, detaching\n ", dev->dev.bus_id, dev->irq); goto fail; diff --git a/drivers/serial/21285.c b/drivers/serial/21285.c index 7572665a8..57438326b 100644 --- a/drivers/serial/21285.c +++ b/drivers/serial/21285.c @@ -7,7 +7,6 @@ * * $Id: 21285.c,v 1.37 2002/07/28 10:03:27 rmk Exp $ */ -#include #include #include #include @@ -479,7 +478,6 @@ static struct uart_driver serial21285_reg = { .owner = THIS_MODULE, .driver_name = "ttyFB", .dev_name = "ttyFB", - .devfs_name = "ttyFB", .major = SERIAL_21285_MAJOR, .minor = SERIAL_21285_MINOR, .nr = 1, diff --git a/drivers/serial/68328serial.c b/drivers/serial/68328serial.c index b88a7c115..993a70242 100644 --- a/drivers/serial/68328serial.c +++ b/drivers/serial/68328serial.c @@ -23,7 +23,6 @@ #include #include #include -#include #include #include #include @@ -131,17 +130,6 @@ static int m68328_console_baud = CONSOLE_BAUD_RATE; static int m68328_console_cbaud = DEFAULT_CBAUD; -/* - * tmp_buf is used as a temporary buffer by serial_write. We need to - * lock it in case the memcpy_fromfs blocks while swapping in a page, - * and some other program tries to do a serial write at the same time. - * Since the lock will only come under contention when the system is - * swapping and available memory is low, it makes sense to share one - * buffer across all the serial ports, since it significantly saves - * memory if large numbers of serial ports are open. - */ -static unsigned char tmp_buf[SERIAL_XMIT_SIZE]; /* This is cheating */ - static inline int serial_paranoia_check(struct m68k_serial *info, char *name, const char *routine) { @@ -211,16 +199,16 @@ static void rs_stop(struct tty_struct *tty) if (serial_paranoia_check(info, tty->name, "rs_stop")) return; - save_flags(flags); cli(); + local_irq_save(flags); uart->ustcnt &= ~USTCNT_TXEN; - restore_flags(flags); + local_irq_restore(flags); } static void rs_put_char(char ch) { int flags, loops = 0; - save_flags(flags); cli(); + local_irq_save(flags); while (!(UTX & UTX_TX_AVAIL) && (loops < 1000)) { loops++; @@ -229,7 +217,7 @@ static void rs_put_char(char ch) UTX_TXDATA = ch; udelay(5); - restore_flags(flags); + local_irq_restore(flags); } static void rs_start(struct tty_struct *tty) @@ -241,7 +229,7 @@ static void rs_start(struct tty_struct *tty) if (serial_paranoia_check(info, tty->name, "rs_start")) return; - save_flags(flags); cli(); + local_irq_save(flags); if (info->xmit_cnt && info->xmit_buf && !(uart->ustcnt & USTCNT_TXEN)) { #ifdef USE_INTS uart->ustcnt |= USTCNT_TXEN | USTCNT_TX_INTR_MASK; @@ -249,7 +237,7 @@ static void rs_start(struct tty_struct *tty) uart->ustcnt |= USTCNT_TXEN; #endif } - restore_flags(flags); + local_irq_restore(flags); } /* Drop into either the boot monitor or kadb upon receiving a break @@ -327,14 +315,6 @@ static void receive_chars(struct m68k_serial *info, struct pt_regs *regs, if(!tty) goto clear_and_exit; - /* - * Make sure that we do not overflow the buffer - */ - if (tty_request_buffer_room(tty, 1) == 0) { - tty_schedule_flip(tty); - return; - } - flag = TTY_NORMAL; if(rx & URX_PARITY_ERROR) { @@ -473,7 +453,7 @@ static int startup(struct m68k_serial * info) return -ENOMEM; } - save_flags(flags); cli(); + local_irq_save(flags); /* * Clear the FIFO buffers and disable them @@ -506,7 +486,7 @@ static int startup(struct m68k_serial * info) change_speed(info); info->flags |= S_INITIALIZED; - restore_flags(flags); + local_irq_restore(flags); return 0; } @@ -523,7 +503,7 @@ static void shutdown(struct m68k_serial * info) if (!(info->flags & S_INITIALIZED)) return; - save_flags(flags); cli(); /* Disable interrupts */ + local_irq_save(flags); if (info->xmit_buf) { free_page((unsigned long) info->xmit_buf); @@ -534,7 +514,7 @@ static void shutdown(struct m68k_serial * info) set_bit(TTY_IO_ERROR, &info->tty->flags); info->flags &= ~S_INITIALIZED; - restore_flags(flags); + local_irq_restore(flags); } struct { @@ -655,24 +635,24 @@ static void rs_fair_output(void) if (info == 0) return; if (info->xmit_buf == 0) return; - save_flags(flags); cli(); + local_irq_save(flags); left = info->xmit_cnt; while (left != 0) { c = info->xmit_buf[info->xmit_tail]; info->xmit_tail = (info->xmit_tail+1) & (SERIAL_XMIT_SIZE-1); info->xmit_cnt--; - restore_flags(flags); + local_irq_restore(flags); rs_put_char(c); - save_flags(flags); cli(); + local_irq_save(flags); left = min(info->xmit_cnt, left-1); } /* Last character is being transmitted now (hopefully). */ udelay(5); - restore_flags(flags); + local_irq_restore(flags); return; } @@ -720,11 +700,11 @@ static void rs_flush_chars(struct tty_struct *tty) #endif /* Enable transmitter */ - save_flags(flags); cli(); + local_irq_save(flags); if (info->xmit_cnt <= 0 || tty->stopped || tty->hw_stopped || !info->xmit_buf) { - restore_flags(flags); + local_irq_restore(flags); return; } @@ -749,7 +729,7 @@ static void rs_flush_chars(struct tty_struct *tty) while (!(uart->utx.w & UTX_TX_AVAIL)) udelay(5); } #endif - restore_flags(flags); + local_irq_restore(flags); } extern void console_printn(const char * b, int count); @@ -768,18 +748,22 @@ static int rs_write(struct tty_struct * tty, if (!tty || !info->xmit_buf) return 0; - save_flags(flags); + local_save_flags(flags); while (1) { - cli(); + local_irq_disable(); c = min_t(int, count, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1, SERIAL_XMIT_SIZE - info->xmit_head)); + local_irq_restore(flags); + if (c <= 0) break; memcpy(info->xmit_buf + info->xmit_head, buf, c); + + local_irq_disable(); info->xmit_head = (info->xmit_head + c) & (SERIAL_XMIT_SIZE-1); info->xmit_cnt += c; - restore_flags(flags); + local_irq_restore(flags); buf += c; count -= c; total += c; @@ -787,7 +771,7 @@ static int rs_write(struct tty_struct * tty, if (info->xmit_cnt && !tty->stopped && !tty->hw_stopped) { /* Enable transmitter */ - cli(); + local_irq_disable(); #ifndef USE_INTS while(info->xmit_cnt) { #endif @@ -807,9 +791,9 @@ static int rs_write(struct tty_struct * tty, #ifndef USE_INTS } #endif - restore_flags(flags); + local_irq_restore(flags); } - restore_flags(flags); + return total; } @@ -838,12 +822,13 @@ static int rs_chars_in_buffer(struct tty_struct *tty) static void rs_flush_buffer(struct tty_struct *tty) { struct m68k_serial *info = (struct m68k_serial *)tty->driver_data; + unsigned long flags; if (serial_paranoia_check(info, tty->name, "rs_flush_buffer")) return; - cli(); + local_irq_save(flags); info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; - sti(); + local_irq_restore(flags); tty_wakeup(tty); } @@ -973,14 +958,15 @@ static int get_lsr_info(struct m68k_serial * info, unsigned int *value) m68328_uart *uart = &uart_addr[info->line]; #endif unsigned char status; + unsigned long flags; - cli(); + local_irq_save(flags); #ifdef CONFIG_SERIAL_68328_RTS_CTS status = (uart->utx.w & UTX_CTS_STAT) ? 1 : 0; #else status = 0; #endif - sti(); + local_irq_restore(flags); put_user(status,value); return 0; } @@ -994,14 +980,13 @@ static void send_break(struct m68k_serial * info, unsigned int duration) unsigned long flags; if (!info->port) return; - save_flags(flags); - cli(); + local_irq_save(flags); #ifdef USE_INTS uart->utx.w |= UTX_SEND_BREAK; msleep_interruptible(duration); uart->utx.w &= ~UTX_SEND_BREAK; #endif - restore_flags(flags); + local_irq_restore(flags); } static int rs_ioctl(struct tty_struct *tty, struct file * file, @@ -1060,7 +1045,7 @@ static int rs_ioctl(struct tty_struct *tty, struct file * file, (struct serial_struct *) arg); case TIOCSERGETLSR: /* Get line status register */ if (access_ok(VERIFY_WRITE, (void *) arg, - sizeof(unsigned int)); + sizeof(unsigned int))) return get_lsr_info(info, (unsigned int *) arg); return -EFAULT; case TIOCSERGSTRUCT: @@ -1113,10 +1098,10 @@ static void rs_close(struct tty_struct *tty, struct file * filp) if (!info || serial_paranoia_check(info, tty->name, "rs_close")) return; - save_flags(flags); cli(); + local_irq_save(flags); if (tty_hung_up_p(filp)) { - restore_flags(flags); + local_irq_restore(flags); return; } @@ -1138,7 +1123,7 @@ static void rs_close(struct tty_struct *tty, struct file * filp) info->count = 0; } if (info->count) { - restore_flags(flags); + local_irq_restore(flags); return; } info->flags |= S_CLOSING; @@ -1186,7 +1171,7 @@ static void rs_close(struct tty_struct *tty, struct file * filp) } info->flags &= ~(S_NORMAL_ACTIVE|S_CLOSING); wake_up_interruptible(&info->close_wait); - restore_flags(flags); + local_irq_restore(flags); } /* @@ -1262,9 +1247,9 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp, info->count--; info->blocked_open++; while (1) { - cli(); + local_irq_disable(); m68k_rtsdtr(info, 1); - sti(); + local_irq_enable(); current->state = TASK_INTERRUPTIBLE; if (tty_hung_up_p(filp) || !(info->flags & S_INITIALIZED)) { @@ -1444,7 +1429,7 @@ rs68328_init(void) return -ENOMEM; } - save_flags(flags); cli(); + local_irq_save(flags); for(i=0;idata = info; #endif } - restore_flags(flags); + local_irq_restore(flags); return 0; } diff --git a/drivers/serial/68328serial.h b/drivers/serial/68328serial.h index 978f8a609..58aa21546 100644 --- a/drivers/serial/68328serial.h +++ b/drivers/serial/68328serial.h @@ -11,7 +11,6 @@ #ifndef _MC683XX_SERIAL_H #define _MC683XX_SERIAL_H -#include struct serial_struct { int type; diff --git a/drivers/serial/68360serial.c b/drivers/serial/68360serial.c index 9843ae3d4..e80e70e9b 100644 --- a/drivers/serial/68360serial.c +++ b/drivers/serial/68360serial.c @@ -20,7 +20,6 @@ * int rs_360_init(void); */ -#include #include #include #include diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c index 968597781..fd8b94e8d 100644 --- a/drivers/serial/8250.c +++ b/drivers/serial/8250.c @@ -22,7 +22,6 @@ * mapbase is the physical address of the IO port. * membase is an 'ioremapped' cookie. */ -#include #if defined(CONFIG_SERIAL_8250_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #define SUPPORT_SYSRQ @@ -52,7 +51,7 @@ /* * Configuration: - * share_irqs - whether we pass SA_SHIRQ to request_irq(). This option + * share_irqs - whether we pass IRQF_SHARED to request_irq(). This option * is unsafe when used on edge-triggered interrupts. */ static unsigned int share_irqs = SERIAL8250_SHARE_IRQS; @@ -303,6 +302,7 @@ static inline int map_8250_out_reg(struct uart_8250_port *up, int offset) static unsigned int serial_in(struct uart_8250_port *up, int offset) { + unsigned int tmp; offset = map_8250_in_reg(up, offset) << up->port.regshift; switch (up->port.iotype) { @@ -321,6 +321,13 @@ static unsigned int serial_in(struct uart_8250_port *up, int offset) return __raw_readl(up->port.membase + offset); #endif + case UPIO_TSI: + if (offset == UART_IIR) { + tmp = readl((u32 *)(up->port.membase + UART_RX)); + return (cpu_to_le32(tmp) >> 8) & 0xff; + } else + return readb(up->port.membase + offset); + default: return inb(up->port.iobase + offset); } @@ -350,6 +357,10 @@ serial_out(struct uart_8250_port *up, int offset, int value) __raw_writel(value, up->port.membase + offset); break; #endif + case UPIO_TSI: + if (!((offset == UART_IER) && (value & UART_IER_UUE))) + writeb(value, up->port.membase + offset); + break; default: outb(value, up->port.iobase + offset); @@ -1404,7 +1415,7 @@ static void serial_do_unlink(struct irq_info *i, struct uart_8250_port *up) static int serial_link_irq_chain(struct uart_8250_port *up) { struct irq_info *i = irq_lists + up->port.irq; - int ret, irq_flags = up->port.flags & UPF_SHARE_IRQ ? SA_SHIRQ : 0; + int ret, irq_flags = up->port.flags & UPF_SHARE_IRQ ? IRQF_SHARED : 0; spin_lock_irq(&i->lock); @@ -2386,7 +2397,6 @@ int __init serial8250_start_console(struct uart_port *port, char *options) static struct uart_driver serial8250_reg = { .owner = THIS_MODULE, .driver_name = "serial", - .devfs_name = "tts/", .dev_name = "ttyS", .major = TTY_MAJOR, .minor = 64, diff --git a/drivers/serial/8250.h b/drivers/serial/8250.h index 490606b87..91bd28f2b 100644 --- a/drivers/serial/8250.h +++ b/drivers/serial/8250.h @@ -15,7 +15,6 @@ * $Id: 8250.h,v 1.8 2002/07/21 21:32:30 rmk Exp $ */ -#include #include struct old_serial_port { diff --git a/drivers/serial/8250_mca.c b/drivers/serial/8250_mca.c index ac205256d..d10be944a 100644 --- a/drivers/serial/8250_mca.c +++ b/drivers/serial/8250_mca.c @@ -8,7 +8,6 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ -#include #include #include #include diff --git a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c index 94886c000..851e4839d 100644 --- a/drivers/serial/8250_pci.c +++ b/drivers/serial/8250_pci.c @@ -134,7 +134,7 @@ afavlab_setup(struct serial_private *priv, struct pciserial_board *board, * and Keystone have one Diva chip with 3 UARTs. Some later machines have * one Diva chip, but it has been expanded to 5 UARTs. */ -static int __devinit pci_hp_diva_init(struct pci_dev *dev) +static int pci_hp_diva_init(struct pci_dev *dev) { int rc = 0; @@ -194,7 +194,7 @@ pci_hp_diva_setup(struct serial_private *priv, struct pciserial_board *board, /* * Added for EKF Intel i960 serial boards */ -static int __devinit pci_inteli960ni_init(struct pci_dev *dev) +static int pci_inteli960ni_init(struct pci_dev *dev) { unsigned long oldval; @@ -216,7 +216,7 @@ static int __devinit pci_inteli960ni_init(struct pci_dev *dev) * seems to be mainly needed on card using the PLX which also use I/O * mapped memory. */ -static int __devinit pci_plx9050_init(struct pci_dev *dev) +static int pci_plx9050_init(struct pci_dev *dev) { u8 irq_config; void __iomem *p; @@ -314,7 +314,7 @@ sbs_setup(struct serial_private *priv, struct pciserial_board *board, /* global control register offset for SBS PMC-OctalPro */ #define OCT_REG_CR_OFF 0x500 -static int __devinit sbs_init(struct pci_dev *dev) +static int sbs_init(struct pci_dev *dev) { u8 __iomem *p; @@ -458,11 +458,11 @@ static int pci_siig_setup(struct serial_private *priv, * growing *huge*, we use this function to collapse some 70 entries * in the PCI table into one, for sanity's and compactness's sake. */ -static unsigned short timedia_single_port[] = { +static const unsigned short timedia_single_port[] = { 0x4025, 0x4027, 0x4028, 0x5025, 0x5027, 0 }; -static unsigned short timedia_dual_port[] = { +static const unsigned short timedia_dual_port[] = { 0x0002, 0x4036, 0x4037, 0x4038, 0x4078, 0x4079, 0x4085, 0x4088, 0x4089, 0x5037, 0x5078, 0x5079, 0x5085, 0x6079, 0x7079, 0x8079, 0x8137, 0x8138, 0x8237, 0x8238, 0x9079, @@ -470,35 +470,34 @@ static unsigned short timedia_dual_port[] = { 0xD079, 0 }; -static unsigned short timedia_quad_port[] = { +static const unsigned short timedia_quad_port[] = { 0x4055, 0x4056, 0x4095, 0x4096, 0x5056, 0x8156, 0x8157, 0x8256, 0x8257, 0x9056, 0x9156, 0x9157, 0x9158, 0x9159, 0x9256, 0x9257, 0xA056, 0xA157, 0xA158, 0xA159, 0xB056, 0xB157, 0 }; -static unsigned short timedia_eight_port[] = { +static const unsigned short timedia_eight_port[] = { 0x4065, 0x4066, 0x5065, 0x5066, 0x8166, 0x9066, 0x9166, 0x9167, 0x9168, 0xA066, 0xA167, 0xA168, 0 }; static const struct timedia_struct { int num; - unsigned short *ids; + const unsigned short *ids; } timedia_data[] = { { 1, timedia_single_port }, { 2, timedia_dual_port }, { 4, timedia_quad_port }, - { 8, timedia_eight_port }, - { 0, NULL } + { 8, timedia_eight_port } }; -static int __devinit pci_timedia_init(struct pci_dev *dev) +static int pci_timedia_init(struct pci_dev *dev) { - unsigned short *ids; + const unsigned short *ids; int i, j; - for (i = 0; timedia_data[i].num; i++) { + for (i = 0; i < ARRAY_SIZE(timedia_data); i++) { ids = timedia_data[i].ids; for (j = 0; ids[j]; j++) if (dev->subsystem_device == ids[j]) @@ -566,13 +565,13 @@ titan_400l_800l_setup(struct serial_private *priv, return setup_port(priv, port, bar, offset, board->reg_shift); } -static int __devinit pci_xircom_init(struct pci_dev *dev) +static int pci_xircom_init(struct pci_dev *dev) { msleep(100); return 0; } -static int __devinit pci_netmos_init(struct pci_dev *dev) +static int pci_netmos_init(struct pci_dev *dev) { /* subdevice 0x00PS means

parallel, serial */ unsigned int num_serial = dev->subsystem_device & 0xf; @@ -594,8 +593,8 @@ pci_default_setup(struct serial_private *priv, struct pciserial_board *board, else offset += idx * board->uart_offset; - maxnr = (pci_resource_len(priv->dev, bar) - board->first_offset) / - (8 << board->reg_shift); + maxnr = (pci_resource_len(priv->dev, bar) - board->first_offset) >> + (board->reg_shift + 3); if (board->flags & FL_REGION_SZ_CAP && idx >= maxnr) return 1; @@ -622,7 +621,7 @@ pci_default_setup(struct serial_private *priv, struct pciserial_board *board, */ static struct pci_serial_quirk pci_serial_quirks[] = { /* - * AFAVLAB cards. + * AFAVLAB cards - these may be called via parport_serial * It is not clear whether this applies to all products. */ { @@ -754,7 +753,7 @@ static struct pci_serial_quirk pci_serial_quirks[] = { .exit = __devexit_p(sbs_exit), }, /* - * SIIG cards. + * SIIG cards - these may be called via parport_serial */ { .vendor = PCI_VENDOR_ID_SIIG, @@ -811,7 +810,7 @@ static struct pci_serial_quirk pci_serial_quirks[] = { .setup = pci_default_setup, }, /* - * Netmos cards + * Netmos cards - these may be called via parport_serial */ { .vendor = PCI_VENDOR_ID_NETMOS, @@ -936,6 +935,7 @@ enum pci_board_num_t { pbn_b1_8_1382400, pbn_b2_1_115200, + pbn_b2_2_115200, pbn_b2_8_115200, pbn_b2_1_460800, @@ -1243,6 +1243,12 @@ static struct pciserial_board pci_boards[] __devinitdata = { .base_baud = 115200, .uart_offset = 8, }, + [pbn_b2_2_115200] = { + .flags = FL_BASE2, + .num_ports = 2, + .base_baud = 115200, + .uart_offset = 8, + }, [pbn_b2_8_115200] = { .flags = FL_BASE2, .num_ports = 8, @@ -2339,6 +2345,13 @@ static struct pci_device_id serial_pci_tbl[] = { PCI_ANY_ID, PCI_ANY_ID, 0, 0, pbn_b0_1_115200 }, + /* + * IntaShield IS-200 + */ + { PCI_VENDOR_ID_INTASHIELD, PCI_DEVICE_ID_INTASHIELD_IS200, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, /* 135a.0811 */ + pbn_b2_2_115200 }, + /* * These entries match devices with class COMMUNICATION_SERIAL, * COMMUNICATION_MODEM or COMMUNICATION_MULTISERIAL diff --git a/drivers/serial/8250_pnp.c b/drivers/serial/8250_pnp.c index b79ed0665..632f62d6e 100644 --- a/drivers/serial/8250_pnp.c +++ b/drivers/serial/8250_pnp.c @@ -323,8 +323,10 @@ static const struct pnp_device_id pnp_dev_table[] = { { "USR9180", 0 }, /* U.S. Robotics 56K Voice INT PnP*/ { "USR9190", 0 }, - /* HP Compaq Tablet PC tc1100 Wacom tablet */ + /* Wacom tablets */ + { "WACF004", 0 }, { "WACF005", 0 }, + { "WACF006", 0 }, /* Rockwell's (PORALiNK) 33600 INT PNP */ { "WCI0003", 0 }, /* Unkown PnP modems */ @@ -429,6 +431,8 @@ serial_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id) #endif port.flags |= UPF_SKIP_TEST | UPF_BOOT_AUTOCONF; + if (pnp_irq_flags(dev, 0) & IORESOURCE_IRQ_SHAREABLE) + port.flags |= UPF_SHARE_IRQ; port.uartclk = 1843200; port.dev = &dev->dev; diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index d2716173d..48f0eef5f 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig @@ -301,21 +301,22 @@ config SERIAL_AMBA_PL011_CONSOLE kernel at boot time.) config SERIAL_AT91 - bool "AT91RM9200 serial port support" - depends on ARM && ARCH_AT91RM9200 + bool "AT91RM9200 / AT91SAM9261 serial port support" + depends on ARM && (ARCH_AT91RM9200 || ARCH_AT91SAM9261) select SERIAL_CORE help - This enables the driver for the on-chip UARTs of the AT91RM9200 - processor. + This enables the driver for the on-chip UARTs of the Atmel + AT91RM9200 and AT91SAM926 processor. config SERIAL_AT91_CONSOLE - bool "Support for console on AT91RM9200 serial port" + bool "Support for console on AT91RM9200 / AT91SAM9261 serial port" depends on SERIAL_AT91=y select SERIAL_CORE_CONSOLE help - Say Y here if you wish to use a UART on the AT91RM9200 as the system - console (the system console is the device which receives all kernel - messages and warnings and which allows logins in single user mode). + Say Y here if you wish to use a UART on the Atmel AT91RM9200 or + AT91SAM9261 as the system console (the system console is the device + which receives all kernel messages and warnings and which allows + logins in single user mode). config SERIAL_AT91_TTYAT bool "Install as device ttyAT0-4 instead of ttyS0-4" @@ -354,21 +355,24 @@ config SERIAL_CLPS711X_CONSOLE kernel at boot time.) config SERIAL_S3C2410 - tristate "Samsung S3C2410 Serial port support" + tristate "Samsung S3C2410/S3C2440/S3C2442/S3C2412 Serial port support" depends on ARM && ARCH_S3C2410 select SERIAL_CORE help - Support for the on-chip UARTs on the Samsung S3C2410X CPU, + Support for the on-chip UARTs on the Samsung S3C24XX series CPUs, providing /dev/ttySAC0, 1 and 2 (note, some machines may not provide all of these ports, depending on how the serial port pins are configured. + Currently this driver supports the UARTS on the S3C2410, S3C2440, + S3C2442, S3C2412 and S3C2413 CPUs. + config SERIAL_S3C2410_CONSOLE bool "Support for console on S3C2410 serial port" depends on SERIAL_S3C2410=y select SERIAL_CORE_CONSOLE help - Allow selection of the S3C2410 on-board serial ports for use as + Allow selection of the S3C24XX on-board serial ports for use as an virtual console. Even if you say Y here, the currently visible virtual console @@ -804,7 +808,6 @@ config SERIAL_MPC52xx tristate "Freescale MPC52xx family PSC serial support" depends on PPC_MPC52xx select SERIAL_CORE - select FW_LOADER help This drivers support the MPC52xx PSC serial ports. If you would like to use them, you must answer Y or M to this option. Not that @@ -938,4 +941,23 @@ config SERIAL_SGI_IOC3 If you have an SGI Altix with an IOC3 serial card, say Y or M. Otherwise, say N. +config SERIAL_NETX + bool "NetX serial port support" + depends on ARM && ARCH_NETX + select SERIAL_CORE + help + If you have a machine based on a Hilscher NetX SoC you + can enable its onboard serial port by enabling this option. + + To compile this driver as a module, choose M here: the + module will be called netx-serial. + +config SERIAL_NETX_CONSOLE + bool "Console on NetX serial port" + depends on SERIAL_NETX + select SERIAL_CORE_CONSOLE + help + If you have enabled the serial port on the Motorola IMX + CPU you can make it the console by answering Y to this option. + endmenu diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile index 0a71bf68a..927faee03 100644 --- a/drivers/serial/Makefile +++ b/drivers/serial/Makefile @@ -55,3 +55,4 @@ obj-$(CONFIG_SERIAL_VR41XX) += vr41xx_siu.o obj-$(CONFIG_SERIAL_SGI_IOC4) += ioc4_serial.o obj-$(CONFIG_SERIAL_SGI_IOC3) += ioc3_serial.o obj-$(CONFIG_SERIAL_AT91) += at91_serial.o +obj-$(CONFIG_SERIAL_NETX) += netx-serial.o diff --git a/drivers/serial/amba-pl010.c b/drivers/serial/amba-pl010.c index 163141400..7311d8487 100644 --- a/drivers/serial/amba-pl010.c +++ b/drivers/serial/amba-pl010.c @@ -31,7 +31,6 @@ * required, these have to be supplied via some other means (eg, GPIO) * and hooked into this driver. */ -#include #if defined(CONFIG_SERIAL_AMBA_PL010_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #define SUPPORT_SYSRQ @@ -52,7 +51,7 @@ #include -#define UART_NR 2 +#define UART_NR 8 #define SERIAL_AMBA_MAJOR 204 #define SERIAL_AMBA_MINOR 16 diff --git a/drivers/serial/amba-pl011.c b/drivers/serial/amba-pl011.c index 3d966cfc9..a8d7124e8 100644 --- a/drivers/serial/amba-pl011.c +++ b/drivers/serial/amba-pl011.c @@ -31,7 +31,6 @@ * required, these have to be supplied via some other means (eg, GPIO) * and hooked into this driver. */ -#include #if defined(CONFIG_SERIAL_AMBA_PL011_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #define SUPPORT_SYSRQ diff --git a/drivers/serial/at91_serial.c b/drivers/serial/at91_serial.c index 6547fe0ce..54c6b2adf 100644 --- a/drivers/serial/at91_serial.c +++ b/drivers/serial/at91_serial.c @@ -2,7 +2,6 @@ * linux/drivers/char/at91_serial.c * * Driver for Atmel AT91RM9200 Serial ports - * * Copyright (C) 2003 Rick Bronson * * Based on drivers/char/serial_sa1100.c, by Deep Blue Solutions Ltd. @@ -23,24 +22,26 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ -#include #include #include #include #include #include #include +#include #include #include #include +#include #include #include -#include +#include +#include #include -#include - +#include +#include #if defined(CONFIG_SERIAL_AT91_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #define SUPPORT_SYSRQ @@ -67,7 +68,6 @@ #endif -#define AT91_VA_BASE_DBGU ((unsigned long) AT91_VA_BASE_SYS + AT91_DBGU) #define AT91_ISR_PASS_LIMIT 256 #define UART_PUT_CR(port,v) writel(v, (port)->membase + AT91_US_CR) @@ -87,16 +87,33 @@ /* PDC registers */ #define UART_PUT_PTCR(port,v) writel(v, (port)->membase + AT91_PDC_PTCR) +#define UART_GET_PTSR(port) readl((port)->membase + AT91_PDC_PTSR) + #define UART_PUT_RPR(port,v) writel(v, (port)->membase + AT91_PDC_RPR) +#define UART_GET_RPR(port) readl((port)->membase + AT91_PDC_RPR) #define UART_PUT_RCR(port,v) writel(v, (port)->membase + AT91_PDC_RCR) -#define UART_GET_RCR(port) readl((port)->membase + AT91_PDC_RCR) #define UART_PUT_RNPR(port,v) writel(v, (port)->membase + AT91_PDC_RNPR) #define UART_PUT_RNCR(port,v) writel(v, (port)->membase + AT91_PDC_RNCR) +#define UART_PUT_TPR(port,v) writel(v, (port)->membase + AT91_PDC_TPR) +#define UART_PUT_TCR(port,v) writel(v, (port)->membase + AT91_PDC_TCR) +//#define UART_PUT_TNPR(port,v) writel(v, (port)->membase + AT91_PDC_TNPR) +//#define UART_PUT_TNCR(port,v) writel(v, (port)->membase + AT91_PDC_TNCR) static int (*at91_open)(struct uart_port *); static void (*at91_close)(struct uart_port *); +/* + * We wrap our port structure around the generic uart_port. + */ +struct at91_uart_port { + struct uart_port uart; /* uart */ + struct clk *clk; /* uart clock */ + unsigned short suspended; /* is port suspended? */ +}; + +static struct at91_uart_port at91_ports[AT91_NR_UART]; + #ifdef SUPPORT_SYSRQ static struct console at91_console; #endif @@ -115,16 +132,19 @@ static u_int at91_tx_empty(struct uart_port *port) static void at91_set_mctrl(struct uart_port *port, u_int mctrl) { unsigned int control = 0; + unsigned int mode; - /* - * Errata #39: RTS0 is not internally connected to PA21. We need to drive - * the pin manually. - */ - if (port->mapbase == AT91_VA_BASE_US0) { - if (mctrl & TIOCM_RTS) - at91_sys_write(AT91_PIOA + PIO_CODR, AT91_PA21_RTS0); - else - at91_sys_write(AT91_PIOA + PIO_SODR, AT91_PA21_RTS0); + if (arch_identify() == ARCH_ID_AT91RM9200) { + /* + * AT91RM9200 Errata #39: RTS0 is not internally connected to PA21. + * We need to drive the pin manually. + */ + if (port->mapbase == AT91_BASE_US0) { + if (mctrl & TIOCM_RTS) + at91_set_gpio_value(AT91_PIN_PA21, 0); + else + at91_set_gpio_value(AT91_PIN_PA21, 1); + } } if (mctrl & TIOCM_RTS) @@ -137,7 +157,15 @@ static void at91_set_mctrl(struct uart_port *port, u_int mctrl) else control |= AT91_US_DTRDIS; - UART_PUT_CR(port,control); + UART_PUT_CR(port, control); + + /* Local loopback mode? */ + mode = UART_GET_MR(port) & ~AT91_US_CHMODE; + if (mctrl & TIOCM_LOOP) + mode |= AT91_US_CHMODE_LOC_LOOP; + else + mode |= AT91_US_CHMODE_NORMAL; + UART_PUT_MR(port, mode); } /* @@ -169,8 +197,9 @@ static u_int at91_get_mctrl(struct uart_port *port) */ static void at91_stop_tx(struct uart_port *port) { + struct at91_uart_port *at91_port = (struct at91_uart_port *) port; + UART_PUT_IDR(port, AT91_US_TXRDY); - port->read_status_mask &= ~AT91_US_TXRDY; } /* @@ -178,7 +207,8 @@ static void at91_stop_tx(struct uart_port *port) */ static void at91_start_tx(struct uart_port *port) { - port->read_status_mask |= AT91_US_TXRDY; + struct at91_uart_port *at91_port = (struct at91_uart_port *) port; + UART_PUT_IER(port, AT91_US_TXRDY); } @@ -187,6 +217,8 @@ static void at91_start_tx(struct uart_port *port) */ static void at91_stop_rx(struct uart_port *port) { + struct at91_uart_port *at91_port = (struct at91_uart_port *) port; + UART_PUT_IDR(port, AT91_US_RXRDY); } @@ -195,7 +227,6 @@ static void at91_stop_rx(struct uart_port *port) */ static void at91_enable_ms(struct uart_port *port) { - port->read_status_mask |= (AT91_US_RIIC | AT91_US_DSRIC | AT91_US_DCDIC | AT91_US_CTSIC); UART_PUT_IER(port, AT91_US_RIIC | AT91_US_DSRIC | AT91_US_DCDIC | AT91_US_CTSIC); } @@ -218,8 +249,8 @@ static void at91_rx_chars(struct uart_port *port, struct pt_regs *regs) struct tty_struct *tty = port->info->tty; unsigned int status, ch, flg; - status = UART_GET_CSR(port) & port->read_status_mask; - while (status & (AT91_US_RXRDY)) { + status = UART_GET_CSR(port); + while (status & AT91_US_RXRDY) { ch = UART_GET_CHAR(port); port->icount.rx++; @@ -230,40 +261,38 @@ static void at91_rx_chars(struct uart_port *port, struct pt_regs *regs) * note that the error handling code is * out of the main execution path */ - if (unlikely(status & (AT91_US_PARE | AT91_US_FRAME | AT91_US_OVRE))) { + if (unlikely(status & (AT91_US_PARE | AT91_US_FRAME | AT91_US_OVRE | AT91_US_RXBRK))) { UART_PUT_CR(port, AT91_US_RSTSTA); /* clear error */ - if (status & (AT91_US_PARE)) + if (status & AT91_US_RXBRK) { + status &= ~(AT91_US_PARE | AT91_US_FRAME); /* ignore side-effect */ + port->icount.brk++; + if (uart_handle_break(port)) + goto ignore_char; + } + if (status & AT91_US_PARE) port->icount.parity++; - if (status & (AT91_US_FRAME)) + if (status & AT91_US_FRAME) port->icount.frame++; - if (status & (AT91_US_OVRE)) + if (status & AT91_US_OVRE) port->icount.overrun++; - if (status & AT91_US_PARE) + status &= port->read_status_mask; + + if (status & AT91_US_RXBRK) + flg = TTY_BREAK; + else if (status & AT91_US_PARE) flg = TTY_PARITY; else if (status & AT91_US_FRAME) flg = TTY_FRAME; - if (status & AT91_US_OVRE) { - /* - * overrun does *not* affect the character - * we read from the FIFO - */ - tty_insert_flip_char(tty, ch, flg); - ch = 0; - flg = TTY_OVERRUN; - } -#ifdef SUPPORT_SYSRQ - port->sysrq = 0; -#endif } if (uart_handle_sysrq_char(port, ch, regs)) goto ignore_char; - tty_insert_flip_char(tty, ch, flg); + uart_insert_char(port, status, AT91_US_OVRE, ch, flg); ignore_char: - status = UART_GET_CSR(port) & port->read_status_mask; + status = UART_GET_CSR(port); } tty_flip_buffer_push(tty); @@ -308,40 +337,35 @@ static void at91_tx_chars(struct uart_port *port) static irqreturn_t at91_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct uart_port *port = dev_id; + struct at91_uart_port *at91_port = (struct at91_uart_port *) port; unsigned int status, pending, pass_counter = 0; status = UART_GET_CSR(port); - pending = status & port->read_status_mask; - if (pending) { - do { - if (pending & AT91_US_RXRDY) - at91_rx_chars(port, regs); - - /* Clear the relevent break bits */ - if (pending & AT91_US_RXBRK) { - UART_PUT_CR(port, AT91_US_RSTSTA); - port->icount.brk++; - uart_handle_break(port); - } + pending = status & UART_GET_IMR(port); + while (pending) { + /* Interrupt receive */ + if (pending & AT91_US_RXRDY) + at91_rx_chars(port, regs); + + // TODO: All reads to CSR will clear these interrupts! + if (pending & AT91_US_RIIC) port->icount.rng++; + if (pending & AT91_US_DSRIC) port->icount.dsr++; + if (pending & AT91_US_DCDIC) + uart_handle_dcd_change(port, !(status & AT91_US_DCD)); + if (pending & AT91_US_CTSIC) + uart_handle_cts_change(port, !(status & AT91_US_CTS)); + if (pending & (AT91_US_RIIC | AT91_US_DSRIC | AT91_US_DCDIC | AT91_US_CTSIC)) + wake_up_interruptible(&port->info->delta_msr_wait); + + /* Interrupt transmit */ + if (pending & AT91_US_TXRDY) + at91_tx_chars(port); + + if (pass_counter++ > AT91_ISR_PASS_LIMIT) + break; - // TODO: All reads to CSR will clear these interrupts! - if (pending & AT91_US_RIIC) port->icount.rng++; - if (pending & AT91_US_DSRIC) port->icount.dsr++; - if (pending & AT91_US_DCDIC) - uart_handle_dcd_change(port, !(status & AT91_US_DCD)); - if (pending & AT91_US_CTSIC) - uart_handle_cts_change(port, !(status & AT91_US_CTS)); - if (pending & (AT91_US_RIIC | AT91_US_DSRIC | AT91_US_DCDIC | AT91_US_CTSIC)) - wake_up_interruptible(&port->info->delta_msr_wait); - - if (pending & AT91_US_TXRDY) - at91_tx_chars(port); - if (pass_counter++ > AT91_ISR_PASS_LIMIT) - break; - - status = UART_GET_CSR(port); - pending = status & port->read_status_mask; - } while (pending); + status = UART_GET_CSR(port); + pending = status & UART_GET_IMR(port); } return IRQ_HANDLED; } @@ -351,6 +375,7 @@ static irqreturn_t at91_interrupt(int irq, void *dev_id, struct pt_regs *regs) */ static int at91_startup(struct uart_port *port) { + struct at91_uart_port *at91_port = (struct at91_uart_port *) port; int retval; /* @@ -363,7 +388,7 @@ static int at91_startup(struct uart_port *port) /* * Allocate the IRQ */ - retval = request_irq(port->irq, at91_interrupt, SA_SHIRQ, "at91_serial", port); + retval = request_irq(port->irq, at91_interrupt, IRQF_SHARED, "at91_serial", port); if (retval) { printk("at91_serial: at91_startup - Can't get irq\n"); return retval; @@ -381,14 +406,14 @@ static int at91_startup(struct uart_port *port) } } - port->read_status_mask = AT91_US_RXRDY | AT91_US_TXRDY | AT91_US_OVRE - | AT91_US_FRAME | AT91_US_PARE | AT91_US_RXBRK; /* * Finally, enable the serial port */ UART_PUT_CR(port, AT91_US_RSTSTA | AT91_US_RSTRX); UART_PUT_CR(port, AT91_US_TXEN | AT91_US_RXEN); /* enable xmit & rcvr */ - UART_PUT_IER(port, AT91_US_RXRDY); /* do receive only */ + + UART_PUT_IER(port, AT91_US_RXRDY); /* enable receive only */ + return 0; } @@ -397,6 +422,8 @@ static int at91_startup(struct uart_port *port) */ static void at91_shutdown(struct uart_port *port) { + struct at91_uart_port *at91_port = (struct at91_uart_port *) port; + /* * Disable all interrupts, port and break condition. */ @@ -421,21 +448,22 @@ static void at91_shutdown(struct uart_port *port) */ static void at91_serial_pm(struct uart_port *port, unsigned int state, unsigned int oldstate) { + struct at91_uart_port *at91_port = (struct at91_uart_port *) port; + switch (state) { case 0: /* * Enable the peripheral clock for this serial port. * This is called on uart_open() or a resume event. */ - at91_sys_write(AT91_PMC_PCER, 1 << port->irq); + clk_enable(at91_port->clk); break; case 3: /* * Disable the peripheral clock for this serial port. * This is called on uart_close() or a suspend event. */ - if (port->irq != AT91_ID_SYS) /* is this a shared clock? */ - at91_sys_write(AT91_PMC_PCDR, 1 << port->irq); + clk_disable(at91_port->clk); break; default: printk(KERN_ERR "at91_serial: unknown pm %d\n", state); @@ -494,9 +522,9 @@ static void at91_set_termios(struct uart_port *port, struct termios * termios, s spin_lock_irqsave(&port->lock, flags); - port->read_status_mask |= AT91_US_OVRE; + port->read_status_mask = AT91_US_OVRE; if (termios->c_iflag & INPCK) - port->read_status_mask |= AT91_US_FRAME | AT91_US_PARE; + port->read_status_mask |= (AT91_US_FRAME | AT91_US_PARE); if (termios->c_iflag & (BRKINT | PARMRK)) port->read_status_mask |= AT91_US_RXBRK; @@ -552,7 +580,7 @@ static void at91_set_termios(struct uart_port *port, struct termios * termios, s */ static const char *at91_type(struct uart_port *port) { - return (port->type == PORT_AT91RM9200) ? "AT91_SERIAL" : NULL; + return (port->type == PORT_AT91) ? "AT91_SERIAL" : NULL; } /* @@ -560,8 +588,15 @@ static const char *at91_type(struct uart_port *port) */ static void at91_release_port(struct uart_port *port) { - release_mem_region(port->mapbase, - (port->mapbase == AT91_VA_BASE_DBGU) ? 512 : SZ_16K); + struct platform_device *pdev = to_platform_device(port->dev); + int size = pdev->resource[0].end - pdev->resource[0].start + 1; + + release_mem_region(port->mapbase, size); + + if (port->flags & UPF_IOREMAP) { + iounmap(port->membase); + port->membase = NULL; + } } /* @@ -569,10 +604,21 @@ static void at91_release_port(struct uart_port *port) */ static int at91_request_port(struct uart_port *port) { - return request_mem_region(port->mapbase, - (port->mapbase == AT91_VA_BASE_DBGU) ? 512 : SZ_16K, - "at91_serial") != NULL ? 0 : -EBUSY; + struct platform_device *pdev = to_platform_device(port->dev); + int size = pdev->resource[0].end - pdev->resource[0].start + 1; + + if (!request_mem_region(port->mapbase, size, "at91_serial")) + return -EBUSY; + + if (port->flags & UPF_IOREMAP) { + port->membase = ioremap(port->mapbase, size); + if (port->membase == NULL) { + release_mem_region(port->mapbase, size); + return -ENOMEM; + } + } + return 0; } /* @@ -581,7 +627,7 @@ static int at91_request_port(struct uart_port *port) static void at91_config_port(struct uart_port *port, int flags) { if (flags & UART_CONFIG_TYPE) { - port->type = PORT_AT91RM9200; + port->type = PORT_AT91; at91_request_port(port); } } @@ -592,7 +638,7 @@ static void at91_config_port(struct uart_port *port, int flags) static int at91_verify_port(struct uart_port *port, struct serial_struct *ser) { int ret = 0; - if (ser->type != PORT_UNKNOWN && ser->type != PORT_AT91RM9200) + if (ser->type != PORT_UNKNOWN && ser->type != PORT_AT91) ret = -EINVAL; if (port->irq != ser->irq) ret = -EINVAL; @@ -624,33 +670,47 @@ static struct uart_ops at91_pops = { .type = at91_type, .release_port = at91_release_port, .request_port = at91_request_port, - .config_port = at91_config_port, - .verify_port = at91_verify_port, + .config_port = at91_config_port, + .verify_port = at91_verify_port, .pm = at91_serial_pm, }; -static struct uart_port at91_ports[AT91_NR_UART]; - -void __init at91_init_ports(void) +/* + * Configure the port from the platform device resource info. + */ +static void __devinit at91_init_port(struct at91_uart_port *at91_port, struct platform_device *pdev) { - static int first = 1; - int i; - - if (!first) - return; - first = 0; + struct uart_port *port = &at91_port->uart; + struct at91_uart_data *data = pdev->dev.platform_data; + + port->iotype = UPIO_MEM; + port->flags = UPF_BOOT_AUTOCONF; + port->ops = &at91_pops; + port->fifosize = 1; + port->line = pdev->id; + port->dev = &pdev->dev; + + port->mapbase = pdev->resource[0].start; + port->irq = pdev->resource[1].start; + + if (port->mapbase == AT91_VA_BASE_SYS + AT91_DBGU) /* Part of system perpherals - already mapped */ + port->membase = (void __iomem *) port->mapbase; + else { + port->flags |= UPF_IOREMAP; + port->membase = NULL; + } - for (i = 0; i < AT91_NR_UART; i++) { - at91_ports[i].iotype = UPIO_MEM; - at91_ports[i].flags = UPF_BOOT_AUTOCONF; - at91_ports[i].uartclk = at91_master_clock; - at91_ports[i].ops = &at91_pops; - at91_ports[i].fifosize = 1; - at91_ports[i].line = i; - } + if (!at91_port->clk) { /* for console, the clock could already be configured */ + at91_port->clk = clk_get(&pdev->dev, "usart"); + clk_enable(at91_port->clk); + port->uartclk = clk_get_rate(at91_port->clk); + } } -void __init at91_register_uart_fns(struct at91rm9200_port_fns *fns) +/* + * Register board-specific modem-control line handlers. + */ +void __init at91_register_uart_fns(struct at91_port_fns *fns) { if (fns->enable_ms) at91_pops.enable_ms = fns->enable_ms; @@ -664,51 +724,6 @@ void __init at91_register_uart_fns(struct at91rm9200_port_fns *fns) at91_pops.set_wake = fns->set_wake; } -/* - * Setup ports. - */ -void __init at91_register_uart(int idx, int port) -{ - if ((idx < 0) || (idx >= AT91_NR_UART)) { - printk(KERN_ERR "%s: bad index number %d\n", __FUNCTION__, idx); - return; - } - - switch (port) { - case 0: - at91_ports[idx].membase = (void __iomem *) AT91_VA_BASE_US0; - at91_ports[idx].mapbase = AT91_VA_BASE_US0; - at91_ports[idx].irq = AT91_ID_US0; - AT91_CfgPIO_USART0(); - break; - case 1: - at91_ports[idx].membase = (void __iomem *) AT91_VA_BASE_US1; - at91_ports[idx].mapbase = AT91_VA_BASE_US1; - at91_ports[idx].irq = AT91_ID_US1; - AT91_CfgPIO_USART1(); - break; - case 2: - at91_ports[idx].membase = (void __iomem *) AT91_VA_BASE_US2; - at91_ports[idx].mapbase = AT91_VA_BASE_US2; - at91_ports[idx].irq = AT91_ID_US2; - AT91_CfgPIO_USART2(); - break; - case 3: - at91_ports[idx].membase = (void __iomem *) AT91_VA_BASE_US3; - at91_ports[idx].mapbase = AT91_VA_BASE_US3; - at91_ports[idx].irq = AT91_ID_US3; - AT91_CfgPIO_USART3(); - break; - case 4: - at91_ports[idx].membase = (void __iomem *) AT91_VA_BASE_DBGU; - at91_ports[idx].mapbase = AT91_VA_BASE_DBGU; - at91_ports[idx].irq = AT91_ID_SYS; - AT91_CfgPIO_DBGU(); - break; - default: - printk(KERN_ERR "%s : bad port number %d\n", __FUNCTION__, port); - } -} #ifdef CONFIG_SERIAL_AT91_CONSOLE static void at91_console_putchar(struct uart_port *port, int ch) @@ -723,7 +738,7 @@ static void at91_console_putchar(struct uart_port *port, int ch) */ static void at91_console_write(struct console *co, const char *s, u_int count) { - struct uart_port *port = at91_ports + co->index; + struct uart_port *port = &at91_ports[co->index].uart; unsigned int status, imr; /* @@ -778,23 +793,15 @@ static void __init at91_console_get_options(struct uart_port *port, int *baud, i static int __init at91_console_setup(struct console *co, char *options) { - struct uart_port *port; + struct uart_port *port = &at91_ports[co->index].uart; int baud = 115200; int bits = 8; int parity = 'n'; int flow = 'n'; - /* - * Check whether an invalid uart number has been specified, and - * if so, search for the first available port that does have - * console support. - */ - port = uart_get_console(at91_ports, AT91_NR_UART, co); + if (port->membase == 0) /* Port not initialized yet - delay setup */ + return -ENODEV; - /* - * Enable the serial console, in-case bootloader did not do it. - */ - at91_sys_write(AT91_PMC_PCER, 1 << port->irq); /* enable clock */ UART_PUT_IDR(port, -1); /* disable interrupts */ UART_PUT_CR(port, AT91_US_RSTSTA | AT91_US_RSTRX); UART_PUT_CR(port, AT91_US_TXEN | AT91_US_RXEN); @@ -821,58 +828,147 @@ static struct console at91_console = { #define AT91_CONSOLE_DEVICE &at91_console -static int __init at91_console_init(void) +/* + * Early console initialization (before VM subsystem initialized). + */ +static int __init at91_console_init(void) { - at91_init_ports(); + if (at91_default_console_device) { + add_preferred_console(AT91_DEVICENAME, at91_default_console_device->id, NULL); + at91_init_port(&(at91_ports[at91_default_console_device->id]), at91_default_console_device); + register_console(&at91_console); + } - at91_console.index = at91_console_port; - register_console(&at91_console); return 0; } console_initcall(at91_console_init); +/* + * Late console initialization. + */ +static int __init at91_late_console_init(void) +{ + if (at91_default_console_device && !(at91_console.flags & CON_ENABLED)) + register_console(&at91_console); + + return 0; +} +core_initcall(at91_late_console_init); + #else #define AT91_CONSOLE_DEVICE NULL #endif static struct uart_driver at91_uart = { .owner = THIS_MODULE, - .driver_name = AT91_DEVICENAME, + .driver_name = "at91_serial", .dev_name = AT91_DEVICENAME, - .devfs_name = AT91_DEVICENAME, .major = SERIAL_AT91_MAJOR, .minor = MINOR_START, .nr = AT91_NR_UART, .cons = AT91_CONSOLE_DEVICE, }; -static int __init at91_serial_init(void) +#ifdef CONFIG_PM +static int at91_serial_suspend(struct platform_device *pdev, pm_message_t state) { - int ret, i; + struct uart_port *port = platform_get_drvdata(pdev); + struct at91_uart_port *at91_port = (struct at91_uart_port *) port; + + if (device_may_wakeup(&pdev->dev) && !at91_suspend_entering_slow_clock()) + enable_irq_wake(port->irq); + else { + disable_irq_wake(port->irq); + uart_suspend_port(&at91_uart, port); + at91_port->suspended = 1; + } - at91_init_ports(); + return 0; +} - ret = uart_register_driver(&at91_uart); - if (ret) - return ret; +static int at91_serial_resume(struct platform_device *pdev) +{ + struct uart_port *port = platform_get_drvdata(pdev); + struct at91_uart_port *at91_port = (struct at91_uart_port *) port; - for (i = 0; i < AT91_NR_UART; i++) { - if (at91_serial_map[i] >= 0) - uart_add_one_port(&at91_uart, &at91_ports[i]); + if (at91_port->suspended) { + uart_resume_port(&at91_uart, port); + at91_port->suspended = 0; } return 0; } +#else +#define at91_serial_suspend NULL +#define at91_serial_resume NULL +#endif -static void __exit at91_serial_exit(void) +static int __devinit at91_serial_probe(struct platform_device *pdev) { - int i; + struct at91_uart_port *port; + int ret; - for (i = 0; i < AT91_NR_UART; i++) { - if (at91_serial_map[i] >= 0) - uart_remove_one_port(&at91_uart, &at91_ports[i]); - } + port = &at91_ports[pdev->id]; + at91_init_port(port, pdev); + ret = uart_add_one_port(&at91_uart, &port->uart); + if (!ret) { + device_init_wakeup(&pdev->dev, 1); + platform_set_drvdata(pdev, port); + } + + return ret; +} + +static int __devexit at91_serial_remove(struct platform_device *pdev) +{ + struct uart_port *port = platform_get_drvdata(pdev); + struct at91_uart_port *at91_port = (struct at91_uart_port *) port; + int ret = 0; + + clk_disable(at91_port->clk); + clk_put(at91_port->clk); + + device_init_wakeup(&pdev->dev, 0); + platform_set_drvdata(pdev, NULL); + + if (port) { + ret = uart_remove_one_port(&at91_uart, port); + kfree(port); + } + + return ret; +} + +static struct platform_driver at91_serial_driver = { + .probe = at91_serial_probe, + .remove = __devexit_p(at91_serial_remove), + .suspend = at91_serial_suspend, + .resume = at91_serial_resume, + .driver = { + .name = "at91_usart", + .owner = THIS_MODULE, + }, +}; + +static int __init at91_serial_init(void) +{ + int ret; + + ret = uart_register_driver(&at91_uart); + if (ret) + return ret; + + ret = platform_driver_register(&at91_serial_driver); + if (ret) + uart_unregister_driver(&at91_uart); + + return ret; +} + +static void __exit at91_serial_exit(void) +{ + platform_driver_unregister(&at91_serial_driver); uart_unregister_driver(&at91_uart); } diff --git a/drivers/serial/clps711x.c b/drivers/serial/clps711x.c index 2691112c8..f27d852ce 100644 --- a/drivers/serial/clps711x.c +++ b/drivers/serial/clps711x.c @@ -25,7 +25,6 @@ * $Id: clps711x.c,v 1.42 2002/07/28 10:03:28 rmk Exp $ * */ -#include #if defined(CONFIG_SERIAL_CLPS711X_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #define SUPPORT_SYSRQ diff --git a/drivers/serial/cpm_uart/cpm_uart.h b/drivers/serial/cpm_uart/cpm_uart.h index 5f6187baa..a8f894c78 100644 --- a/drivers/serial/cpm_uart/cpm_uart.h +++ b/drivers/serial/cpm_uart/cpm_uart.h @@ -5,11 +5,19 @@ * * Copyright (C) 2004 Freescale Semiconductor, Inc. * + * 2006 (c) MontaVista Software, Inc. + * Vitaly Bordug + * + * This file is licensed under the terms of the GNU General Public License + * version 2. This program is licensed "as is" without any warranty of any + * kind, whether express or implied. + * */ #ifndef CPM_UART_H #define CPM_UART_H -#include +#include +#include #if defined(CONFIG_CPM2) #include "cpm_uart_cpm2.h" @@ -26,27 +34,29 @@ #define FLAG_SMC 0x00000002 #define FLAG_CONSOLE 0x00000001 -#define UART_SMC1 0 -#define UART_SMC2 1 -#define UART_SCC1 2 -#define UART_SCC2 3 -#define UART_SCC3 4 -#define UART_SCC4 5 +#define UART_SMC1 fsid_smc1_uart +#define UART_SMC2 fsid_smc2_uart +#define UART_SCC1 fsid_scc1_uart +#define UART_SCC2 fsid_scc2_uart +#define UART_SCC3 fsid_scc3_uart +#define UART_SCC4 fsid_scc4_uart -#define UART_NR 6 +#define UART_NR fs_uart_nr #define RX_NUM_FIFO 4 #define RX_BUF_SIZE 32 #define TX_NUM_FIFO 4 #define TX_BUF_SIZE 32 +#define SCC_WAIT_CLOSING 100 + struct uart_cpm_port { struct uart_port port; - u16 rx_nrfifos; + u16 rx_nrfifos; u16 rx_fifosize; - u16 tx_nrfifos; + u16 tx_nrfifos; u16 tx_fifosize; - smc_t *smcp; + smc_t *smcp; smc_uart_t *smcup; scc_t *sccp; scc_uart_t *sccup; @@ -62,11 +72,14 @@ struct uart_cpm_port { uint dp_addr; void *mem_addr; dma_addr_t dma_addr; + u32 mem_size; /* helpers */ int baud; int bits; /* Keep track of 'odd' SMC2 wirings */ int is_portb; + /* wait on close if needed */ + int wait_closing; }; extern int cpm_uart_port_map[UART_NR]; @@ -86,4 +99,38 @@ void scc2_lineif(struct uart_cpm_port *pinfo); void scc3_lineif(struct uart_cpm_port *pinfo); void scc4_lineif(struct uart_cpm_port *pinfo); +/* + virtual to phys transtalion +*/ +static inline unsigned long cpu2cpm_addr(void* addr, struct uart_cpm_port *pinfo) +{ + int offset; + u32 val = (u32)addr; + /* sane check */ + if (likely((val >= (u32)pinfo->mem_addr)) && + (val<((u32)pinfo->mem_addr + pinfo->mem_size))) { + offset = val - (u32)pinfo->mem_addr; + return pinfo->dma_addr+offset; + } + /* something nasty happened */ + BUG(); + return 0; +} + +static inline void *cpm2cpu_addr(unsigned long addr, struct uart_cpm_port *pinfo) +{ + int offset; + u32 val = addr; + /* sane check */ + if (likely((val >= pinfo->dma_addr) && + (val<(pinfo->dma_addr + pinfo->mem_size)))) { + offset = val - (u32)pinfo->dma_addr; + return (void*)(pinfo->mem_addr+offset); + } + /* something nasty happened */ + BUG(); + return 0; +} + + #endif /* CPM_UART_H */ diff --git a/drivers/serial/cpm_uart/cpm_uart_core.c b/drivers/serial/cpm_uart/cpm_uart_core.c index 29db677d4..90ff96e33 100644 --- a/drivers/serial/cpm_uart/cpm_uart_core.c +++ b/drivers/serial/cpm_uart/cpm_uart_core.c @@ -7,11 +7,13 @@ * Based on ppc8xx.c by Thomas Gleixner * Based on drivers/serial/amba.c by Russell King * - * Maintainer: Kumar Gala (kumar.gala@freescale.com) (CPM2) + * Maintainer: Kumar Gala (galak@kernel.crashing.org) (CPM2) * Pantelis Antoniou (panto@intracom.gr) (CPM1) - * + * * Copyright (C) 2004 Freescale Semiconductor, Inc. * (C) 2004 Intracom, S.A. + * (C) 2005-2006 MontaVista Software, Inc. + * Vitaly Bordug * * 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 @@ -29,7 +31,6 @@ * */ -#include #include #include #include @@ -40,6 +41,7 @@ #include #include #include +#include #include #include @@ -59,7 +61,7 @@ /* Track which ports are configured as uarts */ int cpm_uart_port_map[UART_NR]; /* How many ports did we config as uarts */ -int cpm_uart_nr; +int cpm_uart_nr = 0; /**************************************************************/ @@ -70,8 +72,55 @@ static void cpm_uart_initbd(struct uart_cpm_port *pinfo); /**************************************************************/ + +/* Place-holder for board-specific stuff */ +struct platform_device* __attribute__ ((weak)) __init +early_uart_get_pdev(int index) +{ + return NULL; +} + + +static void cpm_uart_count(void) +{ + cpm_uart_nr = 0; +#ifdef CONFIG_SERIAL_CPM_SMC1 + cpm_uart_port_map[cpm_uart_nr++] = UART_SMC1; +#endif +#ifdef CONFIG_SERIAL_CPM_SMC2 + cpm_uart_port_map[cpm_uart_nr++] = UART_SMC2; +#endif +#ifdef CONFIG_SERIAL_CPM_SCC1 + cpm_uart_port_map[cpm_uart_nr++] = UART_SCC1; +#endif +#ifdef CONFIG_SERIAL_CPM_SCC2 + cpm_uart_port_map[cpm_uart_nr++] = UART_SCC2; +#endif +#ifdef CONFIG_SERIAL_CPM_SCC3 + cpm_uart_port_map[cpm_uart_nr++] = UART_SCC3; +#endif +#ifdef CONFIG_SERIAL_CPM_SCC4 + cpm_uart_port_map[cpm_uart_nr++] = UART_SCC4; +#endif +} + +/* Get UART number by its id */ +static int cpm_uart_id2nr(int id) +{ + int i; + if (id < UART_NR) { + for (i=0; ismcp; @@ -126,7 +175,7 @@ static void cpm_uart_stop_tx(struct uart_port *port, unsigned int tty_stop) /* * Start transmitter */ -static void cpm_uart_start_tx(struct uart_port *port, unsigned int tty_start) +static void cpm_uart_start_tx(struct uart_port *port) { struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port; volatile smc_t *smcp = pinfo->smcp; @@ -143,15 +192,18 @@ static void cpm_uart_start_tx(struct uart_port *port, unsigned int tty_start) } if (cpm_uart_tx_pump(port) != 0) { - if (IS_SMC(pinfo)) + if (IS_SMC(pinfo)) { smcp->smc_smcm |= SMCM_TX; - else + smcp->smc_smcmr |= SMCMR_TEN; + } else { sccp->scc_sccm |= UART_SCCM_TX; + pinfo->sccp->scc_gsmrl |= SCC_GSMRL_ENT; + } } } /* - * Stop receiver + * Stop receiver */ static void cpm_uart_stop_rx(struct uart_port *port) { @@ -176,7 +228,7 @@ static void cpm_uart_enable_ms(struct uart_port *port) } /* - * Generate a break. + * Generate a break. */ static void cpm_uart_break_ctl(struct uart_port *port, int break_state) { @@ -231,19 +283,16 @@ static void cpm_uart_int_rx(struct uart_port *port, struct pt_regs *regs) /* get number of characters, and check spce in flip-buffer */ i = bdp->cbd_datlen; - /* If we have not enough room in tty flip buffer, then we try + /* If we have not enough room in tty flip buffer, then we try * later, which will be the next rx-interrupt or a timeout */ - if ((tty->flip.count + i) >= TTY_FLIPBUF_SIZE) { - tty->flip.work.func((void *)tty); - if ((tty->flip.count + i) >= TTY_FLIPBUF_SIZE) { - printk(KERN_WARNING "TTY_DONT_FLIP set\n"); - return; - } + if(tty_buffer_request_room(tty, i) < i) { + printk(KERN_WARNING "No room in flip buffer\n"); + return; } /* get pointer */ - cp = (unsigned char *)bus_to_virt(bdp->cbd_bufaddr); + cp = cpm2cpu_addr(bdp->cbd_bufaddr, pinfo); /* loop through the buffer */ while (i-- > 0) { @@ -258,20 +307,19 @@ static void cpm_uart_int_rx(struct uart_port *port, struct pt_regs *regs) continue; error_return: - *tty->flip.char_buf_ptr++ = ch; - *tty->flip.flag_buf_ptr++ = flg; - tty->flip.count++; + tty_insert_flip_char(tty, ch, flg); } /* End while (i--) */ /* This BD is ready to be used again. Clear status. get next */ - bdp->cbd_sc &= ~(BD_SC_BR | BD_SC_FR | BD_SC_PR | BD_SC_OV); + bdp->cbd_sc &= ~(BD_SC_BR | BD_SC_FR | BD_SC_PR | BD_SC_OV | BD_SC_ID); bdp->cbd_sc |= BD_SC_EMPTY; if (bdp->cbd_sc & BD_SC_WRAP) bdp = pinfo->rx_bd_base; else bdp++; + } /* End for (;;) */ /* Write back buffer pointer */ @@ -336,22 +384,22 @@ static irqreturn_t cpm_uart_int(int irq, void *data, struct pt_regs *regs) if (IS_SMC(pinfo)) { events = smcp->smc_smce; + smcp->smc_smce = events; if (events & SMCM_BRKE) uart_handle_break(port); if (events & SMCM_RX) cpm_uart_int_rx(port, regs); if (events & SMCM_TX) cpm_uart_int_tx(port, regs); - smcp->smc_smce = events; } else { events = sccp->scc_scce; + sccp->scc_scce = events; if (events & UART_SCCM_BRKE) uart_handle_break(port); if (events & UART_SCCM_RX) cpm_uart_int_rx(port, regs); if (events & UART_SCCM_TX) cpm_uart_int_tx(port, regs); - sccp->scc_scce = events; } return (events) ? IRQ_HANDLED : IRQ_NONE; } @@ -360,6 +408,7 @@ static int cpm_uart_startup(struct uart_port *port) { int retval; struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port; + int line = pinfo - cpm_uart_ports; pr_debug("CPM uart[%d]:startup\n", port->line); @@ -376,9 +425,17 @@ static int cpm_uart_startup(struct uart_port *port) pinfo->sccp->scc_sccm |= UART_SCCM_RX; } + if (!(pinfo->flags & FLAG_CONSOLE)) + cpm_line_cr_cmd(line,CPM_CR_INIT_TRX); return 0; } +inline void cpm_uart_wait_until_send(struct uart_cpm_port *pinfo) +{ + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(pinfo->wait_closing); +} + /* * Shutdown the uart */ @@ -394,6 +451,15 @@ static void cpm_uart_shutdown(struct uart_port *port) /* If the port is not the console, disable Rx and Tx. */ if (!(pinfo->flags & FLAG_CONSOLE)) { + /* Wait for all the BDs marked sent */ + while(!cpm_uart_tx_empty(port)) { + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(2); + } + + if (pinfo->wait_closing) + cpm_uart_wait_until_send(pinfo); + /* Stop uarts */ if (IS_SMC(pinfo)) { volatile smc_t *smcp = pinfo->smcp; @@ -406,7 +472,11 @@ static void cpm_uart_shutdown(struct uart_port *port) } /* Shut them really down and reinit buffer descriptors */ - cpm_line_cr_cmd(line, CPM_CR_STOP_TX); + if (IS_SMC(pinfo)) + cpm_line_cr_cmd(line, CPM_CR_STOP_TX); + else + cpm_line_cr_cmd(line, CPM_CR_GRA_STOP_TX); + cpm_uart_initbd(pinfo); } } @@ -502,7 +572,7 @@ static void cpm_uart_set_termios(struct uart_port *port, */ if ((termios->c_cflag & CREAD) == 0) port->read_status_mask &= ~BD_SC_EMPTY; - + spin_lock_irqsave(&port->lock, flags); /* Start bit has not been added (so don't, because we would just @@ -569,8 +639,9 @@ static int cpm_uart_tx_pump(struct uart_port *port) /* Pick next descriptor and fill from buffer */ bdp = pinfo->tx_cur; - p = bus_to_virt(bdp->cbd_bufaddr); - *p++ = xmit->buf[xmit->tail]; + p = cpm2cpu_addr(bdp->cbd_bufaddr, pinfo); + + *p++ = port->x_char; bdp->cbd_datlen = 1; bdp->cbd_sc |= BD_SC_READY; /* Get next BD. */ @@ -586,7 +657,7 @@ static int cpm_uart_tx_pump(struct uart_port *port) } if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { - cpm_uart_stop_tx(port, 0); + cpm_uart_stop_tx(port); return 0; } @@ -595,7 +666,7 @@ static int cpm_uart_tx_pump(struct uart_port *port) while (!(bdp->cbd_sc & BD_SC_READY) && (xmit->tail != xmit->head)) { count = 0; - p = bus_to_virt(bdp->cbd_bufaddr); + p = cpm2cpu_addr(bdp->cbd_bufaddr, pinfo); while (count < pinfo->tx_fifosize) { *p++ = xmit->buf[xmit->tail]; xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); @@ -606,6 +677,7 @@ static int cpm_uart_tx_pump(struct uart_port *port) } bdp->cbd_datlen = count; bdp->cbd_sc |= BD_SC_READY; + __asm__("eieio"); /* Get next BD. */ if (bdp->cbd_sc & BD_SC_WRAP) bdp = pinfo->tx_bd_base; @@ -618,7 +690,7 @@ static int cpm_uart_tx_pump(struct uart_port *port) uart_write_wakeup(port); if (uart_circ_empty(xmit)) { - cpm_uart_stop_tx(port, 0); + cpm_uart_stop_tx(port); return 0; } @@ -643,12 +715,12 @@ static void cpm_uart_initbd(struct uart_cpm_port *pinfo) mem_addr = pinfo->mem_addr; bdp = pinfo->rx_cur = pinfo->rx_bd_base; for (i = 0; i < (pinfo->rx_nrfifos - 1); i++, bdp++) { - bdp->cbd_bufaddr = virt_to_bus(mem_addr); + bdp->cbd_bufaddr = cpu2cpm_addr(mem_addr, pinfo); bdp->cbd_sc = BD_SC_EMPTY | BD_SC_INTRPT; mem_addr += pinfo->rx_fifosize; } - - bdp->cbd_bufaddr = virt_to_bus(mem_addr); + + bdp->cbd_bufaddr = cpu2cpm_addr(mem_addr, pinfo); bdp->cbd_sc = BD_SC_WRAP | BD_SC_EMPTY | BD_SC_INTRPT; /* Set the physical address of the host memory @@ -658,12 +730,12 @@ static void cpm_uart_initbd(struct uart_cpm_port *pinfo) mem_addr = pinfo->mem_addr + L1_CACHE_ALIGN(pinfo->rx_nrfifos * pinfo->rx_fifosize); bdp = pinfo->tx_cur = pinfo->tx_bd_base; for (i = 0; i < (pinfo->tx_nrfifos - 1); i++, bdp++) { - bdp->cbd_bufaddr = virt_to_bus(mem_addr); + bdp->cbd_bufaddr = cpu2cpm_addr(mem_addr, pinfo); bdp->cbd_sc = BD_SC_INTRPT; mem_addr += pinfo->tx_fifosize; } - - bdp->cbd_bufaddr = virt_to_bus(mem_addr); + + bdp->cbd_bufaddr = cpu2cpm_addr(mem_addr, pinfo); bdp->cbd_sc = BD_SC_WRAP | BD_SC_INTRPT; } @@ -763,6 +835,8 @@ static void cpm_uart_init_smc(struct uart_cpm_port *pinfo) /* Using idle charater time requires some additional tuning. */ up->smc_mrblr = pinfo->rx_fifosize; up->smc_maxidl = pinfo->rx_fifosize; + up->smc_brklen = 0; + up->smc_brkec = 0; up->smc_brkcr = 1; cpm_line_cr_cmd(line, CPM_CR_INIT_TRX); @@ -793,14 +867,6 @@ static int cpm_uart_request_port(struct uart_port *port) if (pinfo->flags & FLAG_CONSOLE) return 0; - /* - * Setup any port IO, connect any baud rate generators, - * etc. This is expected to be handled by board - * dependant code - */ - if (pinfo->set_lineif) - pinfo->set_lineif(pinfo); - if (IS_SMC(pinfo)) { pinfo->smcp->smc_smcm &= ~(SMCM_RX | SMCM_TX); pinfo->smcp->smc_smcmr &= ~(SMCMR_REN | SMCMR_TEN); @@ -815,6 +881,10 @@ static int cpm_uart_request_port(struct uart_port *port) return ret; cpm_uart_initbd(pinfo); + if (IS_SMC(pinfo)) + cpm_uart_init_smc(pinfo); + else + cpm_uart_init_scc(pinfo); return 0; } @@ -863,13 +933,13 @@ struct uart_cpm_port cpm_uart_ports[UART_NR] = { .port = { .irq = SMC1_IRQ, .ops = &cpm_uart_pops, - .iotype = SERIAL_IO_MEM, + .iotype = UPIO_MEM, .lock = SPIN_LOCK_UNLOCKED, }, .flags = FLAG_SMC, .tx_nrfifos = TX_NUM_FIFO, .tx_fifosize = TX_BUF_SIZE, - .rx_nrfifos = RX_NUM_FIFO, + .rx_nrfifos = RX_NUM_FIFO, .rx_fifosize = RX_BUF_SIZE, .set_lineif = smc1_lineif, }, @@ -877,13 +947,13 @@ struct uart_cpm_port cpm_uart_ports[UART_NR] = { .port = { .irq = SMC2_IRQ, .ops = &cpm_uart_pops, - .iotype = SERIAL_IO_MEM, + .iotype = UPIO_MEM, .lock = SPIN_LOCK_UNLOCKED, }, .flags = FLAG_SMC, .tx_nrfifos = TX_NUM_FIFO, .tx_fifosize = TX_BUF_SIZE, - .rx_nrfifos = RX_NUM_FIFO, + .rx_nrfifos = RX_NUM_FIFO, .rx_fifosize = RX_BUF_SIZE, .set_lineif = smc2_lineif, #ifdef CONFIG_SERIAL_CPM_ALT_SMC2 @@ -894,56 +964,112 @@ struct uart_cpm_port cpm_uart_ports[UART_NR] = { .port = { .irq = SCC1_IRQ, .ops = &cpm_uart_pops, - .iotype = SERIAL_IO_MEM, + .iotype = UPIO_MEM, .lock = SPIN_LOCK_UNLOCKED, }, .tx_nrfifos = TX_NUM_FIFO, .tx_fifosize = TX_BUF_SIZE, - .rx_nrfifos = RX_NUM_FIFO, + .rx_nrfifos = RX_NUM_FIFO, .rx_fifosize = RX_BUF_SIZE, .set_lineif = scc1_lineif, + .wait_closing = SCC_WAIT_CLOSING, }, [UART_SCC2] = { .port = { .irq = SCC2_IRQ, .ops = &cpm_uart_pops, - .iotype = SERIAL_IO_MEM, + .iotype = UPIO_MEM, .lock = SPIN_LOCK_UNLOCKED, }, .tx_nrfifos = TX_NUM_FIFO, .tx_fifosize = TX_BUF_SIZE, - .rx_nrfifos = RX_NUM_FIFO, + .rx_nrfifos = RX_NUM_FIFO, .rx_fifosize = RX_BUF_SIZE, .set_lineif = scc2_lineif, + .wait_closing = SCC_WAIT_CLOSING, }, [UART_SCC3] = { .port = { .irq = SCC3_IRQ, .ops = &cpm_uart_pops, - .iotype = SERIAL_IO_MEM, + .iotype = UPIO_MEM, .lock = SPIN_LOCK_UNLOCKED, }, .tx_nrfifos = TX_NUM_FIFO, .tx_fifosize = TX_BUF_SIZE, - .rx_nrfifos = RX_NUM_FIFO, + .rx_nrfifos = RX_NUM_FIFO, .rx_fifosize = RX_BUF_SIZE, .set_lineif = scc3_lineif, + .wait_closing = SCC_WAIT_CLOSING, }, [UART_SCC4] = { .port = { .irq = SCC4_IRQ, .ops = &cpm_uart_pops, - .iotype = SERIAL_IO_MEM, + .iotype = UPIO_MEM, .lock = SPIN_LOCK_UNLOCKED, }, .tx_nrfifos = TX_NUM_FIFO, .tx_fifosize = TX_BUF_SIZE, - .rx_nrfifos = RX_NUM_FIFO, + .rx_nrfifos = RX_NUM_FIFO, .rx_fifosize = RX_BUF_SIZE, .set_lineif = scc4_lineif, + .wait_closing = SCC_WAIT_CLOSING, }, }; +int cpm_uart_drv_get_platform_data(struct platform_device *pdev, int is_con) +{ + struct resource *r; + struct fs_uart_platform_info *pdata = pdev->dev.platform_data; + int idx = pdata->fs_no; /* It is UART_SMCx or UART_SCCx index */ + struct uart_cpm_port *pinfo; + int line; + u32 mem, pram; + + line = cpm_uart_id2nr(idx); + if(line < 0) { + printk(KERN_ERR"%s(): port %d is not registered", __FUNCTION__, idx); + return -1; + } + + pinfo = (struct uart_cpm_port *) &cpm_uart_ports[idx]; + + pinfo->brg = pdata->brg; + + if (!is_con) { + pinfo->port.line = line; + pinfo->port.flags = UPF_BOOT_AUTOCONF; + } + + if (!(r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs"))) + return -EINVAL; + mem = r->start; + + if (!(r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pram"))) + return -EINVAL; + pram = r->start; + + if(idx > fsid_smc2_uart) { + pinfo->sccp = (scc_t *)mem; + pinfo->sccup = (scc_uart_t *)pram; + } else { + pinfo->smcp = (smc_t *)mem; + pinfo->smcup = (smc_uart_t *)pram; + } + pinfo->tx_nrfifos = pdata->tx_num_fifo; + pinfo->tx_fifosize = pdata->tx_buf_size; + + pinfo->rx_nrfifos = pdata->rx_num_fifo; + pinfo->rx_fifosize = pdata->rx_buf_size; + + pinfo->port.uartclk = pdata->uart_clk; + pinfo->port.mapbase = (unsigned long)mem; + pinfo->port.irq = platform_get_irq(pdev, 0); + + return 0; +} + #ifdef CONFIG_SERIAL_CPM_CONSOLE /* * Print a string to the serial port trying not to disturb @@ -983,11 +1109,8 @@ static void cpm_uart_console_write(struct console *co, const char *s, * If the buffer address is in the CPM DPRAM, don't * convert it. */ - if ((uint) (bdp->cbd_bufaddr) > (uint) CPM_ADDR) - cp = (unsigned char *) (bdp->cbd_bufaddr); - else - cp = bus_to_virt(bdp->cbd_bufaddr); - + cp = cpm2cpu_addr(bdp->cbd_bufaddr, pinfo); + *cp = *s; bdp->cbd_datlen = 1; @@ -1003,10 +1126,7 @@ static void cpm_uart_console_write(struct console *co, const char *s, while ((bdp->cbd_sc & BD_SC_READY) != 0) ; - if ((uint) (bdp->cbd_bufaddr) > (uint) CPM_ADDR) - cp = (unsigned char *) (bdp->cbd_bufaddr); - else - cp = bus_to_virt(bdp->cbd_bufaddr); + cp = cpm2cpu_addr(bdp->cbd_bufaddr, pinfo); *cp = 13; bdp->cbd_datlen = 1; @@ -1029,9 +1149,7 @@ static void cpm_uart_console_write(struct console *co, const char *s, pinfo->tx_cur = (volatile cbd_t *) bdp; } -/* - * Setup console. Be careful is called early ! - */ + static int __init cpm_uart_console_setup(struct console *co, char *options) { struct uart_port *port; @@ -1042,10 +1160,30 @@ static int __init cpm_uart_console_setup(struct console *co, char *options) int flow = 'n'; int ret; + struct fs_uart_platform_info *pdata; + struct platform_device* pdev = early_uart_get_pdev(co->index); + + if (!pdev) { + pr_info("cpm_uart: console: compat mode\n"); + /* compatibility - will be cleaned up */ + cpm_uart_init_portdesc(); + } + port = (struct uart_port *)&cpm_uart_ports[cpm_uart_port_map[co->index]]; pinfo = (struct uart_cpm_port *)port; - + if (!pdev) { + if (pinfo->set_lineif) + pinfo->set_lineif(pinfo); + } else { + pdata = pdev->dev.platform_data; + if (pdata) + if (pdata->init_ioports) + pdata->init_ioports(); + + cpm_uart_drv_get_platform_data(pdev, 1); + } + pinfo->flags |= FLAG_CONSOLE; if (options) { @@ -1059,14 +1197,6 @@ static int __init cpm_uart_console_setup(struct console *co, char *options) baud = 9600; } - /* - * Setup any port IO, connect any baud rate generators, - * etc. This is expected to be handled by board - * dependant code - */ - if (pinfo->set_lineif) - pinfo->set_lineif(pinfo); - if (IS_SMC(pinfo)) { pinfo->smcp->smc_smcm &= ~(SMCM_RX | SMCM_TX); pinfo->smcp->smc_smcmr &= ~(SMCMR_REN | SMCMR_TEN); @@ -1092,24 +1222,21 @@ static int __init cpm_uart_console_setup(struct console *co, char *options) return 0; } -extern struct uart_driver cpm_reg; +static struct uart_driver cpm_reg; static struct console cpm_scc_uart_console = { - .name "ttyCPM", - .write cpm_uart_console_write, - .device uart_console_device, - .setup cpm_uart_console_setup, - .flags CON_PRINTBUFFER, - .index -1, + .name = "ttyCPM", + .write = cpm_uart_console_write, + .device = uart_console_device, + .setup = cpm_uart_console_setup, + .flags = CON_PRINTBUFFER, + .index = -1, .data = &cpm_reg, }; int __init cpm_uart_console_init(void) { - int ret = cpm_uart_init_portdesc(); - - if (!ret) - register_console(&cpm_scc_uart_console); - return ret; + register_console(&cpm_scc_uart_console); + return 0; } console_initcall(cpm_uart_console_init); @@ -1127,44 +1254,129 @@ static struct uart_driver cpm_reg = { .minor = SERIAL_CPM_MINOR, .cons = CPM_UART_CONSOLE, }; - -static int __init cpm_uart_init(void) +static int cpm_uart_drv_probe(struct device *dev) { - int ret, i; - - printk(KERN_INFO "Serial: CPM driver $Revision: 0.01 $\n"); + struct platform_device *pdev = to_platform_device(dev); + struct fs_uart_platform_info *pdata; + int ret = -ENODEV; -#ifndef CONFIG_SERIAL_CPM_CONSOLE - ret = cpm_uart_init_portdesc(); - if (ret) + if(!pdev) { + printk(KERN_ERR"CPM UART: platform data missing!\n"); return ret; -#endif + } - cpm_reg.nr = cpm_uart_nr; - ret = uart_register_driver(&cpm_reg); + pdata = pdev->dev.platform_data; + pr_debug("cpm_uart_drv_probe: Adding CPM UART %d\n", cpm_uart_id2nr(pdata->fs_no)); - if (ret) + if ((ret = cpm_uart_drv_get_platform_data(pdev, 0))) return ret; - for (i = 0; i < cpm_uart_nr; i++) { - int con = cpm_uart_port_map[i]; - cpm_uart_ports[con].port.line = i; - cpm_uart_ports[con].port.flags = UPF_BOOT_AUTOCONF; - uart_add_one_port(&cpm_reg, &cpm_uart_ports[con].port); - } + if (pdata->init_ioports) + pdata->init_ioports(); - return ret; + ret = uart_add_one_port(&cpm_reg, &cpm_uart_ports[pdata->fs_no].port); + + return ret; } -static void __exit cpm_uart_exit(void) +static int cpm_uart_drv_remove(struct device *dev) { + struct platform_device *pdev = to_platform_device(dev); + struct fs_uart_platform_info *pdata = pdev->dev.platform_data; + + pr_debug("cpm_uart_drv_remove: Removing CPM UART %d\n", + cpm_uart_id2nr(pdata->fs_no)); + + uart_remove_one_port(&cpm_reg, &cpm_uart_ports[pdata->fs_no].port); + return 0; +} + +static struct device_driver cpm_smc_uart_driver = { + .name = "fsl-cpm-smc:uart", + .bus = &platform_bus_type, + .probe = cpm_uart_drv_probe, + .remove = cpm_uart_drv_remove, +}; + +static struct device_driver cpm_scc_uart_driver = { + .name = "fsl-cpm-scc:uart", + .bus = &platform_bus_type, + .probe = cpm_uart_drv_probe, + .remove = cpm_uart_drv_remove, +}; + +/* + This is supposed to match uart devices on platform bus, + */ +static int match_is_uart (struct device* dev, void* data) +{ + struct platform_device* pdev = container_of(dev, struct platform_device, dev); + int ret = 0; + /* this was setfunc as uart */ + if(strstr(pdev->name,":uart")) { + ret = 1; + } + return ret; +} + + +static int cpm_uart_init(void) { + + int ret; int i; + struct device *dev; + printk(KERN_INFO "Serial: CPM driver $Revision: 0.02 $\n"); + + /* lookup the bus for uart devices */ + dev = bus_find_device(&platform_bus_type, NULL, 0, match_is_uart); + + /* There are devices on the bus - all should be OK */ + if (dev) { + cpm_uart_count(); + cpm_reg.nr = cpm_uart_nr; + + if (!(ret = uart_register_driver(&cpm_reg))) { + if ((ret = driver_register(&cpm_smc_uart_driver))) { + uart_unregister_driver(&cpm_reg); + return ret; + } + if ((ret = driver_register(&cpm_scc_uart_driver))) { + driver_unregister(&cpm_scc_uart_driver); + uart_unregister_driver(&cpm_reg); + } + } + } else { + /* No capable platform devices found - falling back to legacy mode */ + pr_info("cpm_uart: WARNING: no UART devices found on platform bus!\n"); + pr_info( + "cpm_uart: the driver will guess configuration, but this mode is no longer supported.\n"); +#ifndef CONFIG_SERIAL_CPM_CONSOLE + ret = cpm_uart_init_portdesc(); + if (ret) + return ret; +#endif + + cpm_reg.nr = cpm_uart_nr; + ret = uart_register_driver(&cpm_reg); + + if (ret) + return ret; + + for (i = 0; i < cpm_uart_nr; i++) { + int con = cpm_uart_port_map[i]; + cpm_uart_ports[con].port.line = i; + cpm_uart_ports[con].port.flags = UPF_BOOT_AUTOCONF; + uart_add_one_port(&cpm_reg, &cpm_uart_ports[con].port); + } - for (i = 0; i < cpm_uart_nr; i++) { - int con = cpm_uart_port_map[i]; - uart_remove_one_port(&cpm_reg, &cpm_uart_ports[con].port); } + return ret; +} +static void __exit cpm_uart_exit(void) +{ + driver_unregister(&cpm_scc_uart_driver); + driver_unregister(&cpm_smc_uart_driver); uart_unregister_driver(&cpm_reg); } diff --git a/drivers/serial/cpm_uart/cpm_uart_cpm1.c b/drivers/serial/cpm_uart/cpm_uart_cpm1.c index de26cf7b0..95afc3729 100644 --- a/drivers/serial/cpm_uart/cpm_uart_cpm1.c +++ b/drivers/serial/cpm_uart/cpm_uart_cpm1.c @@ -3,11 +3,13 @@ * * Driver for CPM (SCC/SMC) serial ports; CPM1 definitions * - * Maintainer: Kumar Gala (kumar.gala@freescale.com) (CPM2) + * Maintainer: Kumar Gala (galak@kernel.crashing.org) (CPM2) * Pantelis Antoniou (panto@intracom.gr) (CPM1) - * + * * Copyright (C) 2004 Freescale Semiconductor, Inc. * (C) 2004 Intracom, S.A. + * (C) 2006 MontaVista Software, Inc. + * Vitaly Bordug * * 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 @@ -25,7 +27,6 @@ * */ -#include #include #include #include @@ -81,25 +82,11 @@ void cpm_line_cr_cmd(int line, int cmd) void smc1_lineif(struct uart_cpm_port *pinfo) { - volatile cpm8xx_t *cp = cpmp; - unsigned int iobits = 0x000000c0; - - if (!pinfo->is_portb) { - cp->cp_pbpar |= iobits; - cp->cp_pbdir &= ~iobits; - cp->cp_pbodr &= ~iobits; - } else { - ((immap_t *)IMAP_ADDR)->im_ioport.iop_papar |= iobits; - ((immap_t *)IMAP_ADDR)->im_ioport.iop_padir &= ~iobits; - ((immap_t *)IMAP_ADDR)->im_ioport.iop_paodr &= ~iobits; - } - pinfo->brg = 1; } void smc2_lineif(struct uart_cpm_port *pinfo) { - /* XXX SMC2: insert port configuration here */ pinfo->brg = 2; } @@ -128,7 +115,7 @@ void scc4_lineif(struct uart_cpm_port *pinfo) } /* - * Allocate DP-Ram and memory buffers. We need to allocate a transmit and + * Allocate DP-Ram and memory buffers. We need to allocate a transmit and * receive buffer descriptors from dual port ram, and a character * buffer area from host mem. If we are allocating for the console we need * to do it from bootmem @@ -155,8 +142,10 @@ int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con) memsz = L1_CACHE_ALIGN(pinfo->rx_nrfifos * pinfo->rx_fifosize) + L1_CACHE_ALIGN(pinfo->tx_nrfifos * pinfo->tx_fifosize); if (is_con) { - mem_addr = (u8 *) m8xx_cpm_hostalloc(memsz); - dma_addr = 0; + /* was hostalloc but changed cause it blows away the */ + /* large tlb mapping when pinning the kernel area */ + mem_addr = (u8 *) cpm_dpram_addr(cpm_dpalloc(memsz, 8)); + dma_addr = (u32)mem_addr; } else mem_addr = dma_alloc_coherent(NULL, memsz, &dma_addr, GFP_KERNEL); @@ -169,8 +158,9 @@ int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con) } pinfo->dp_addr = dp_offset; - pinfo->mem_addr = mem_addr; - pinfo->dma_addr = dma_addr; + pinfo->mem_addr = mem_addr; /* virtual address*/ + pinfo->dma_addr = dma_addr; /* physical address*/ + pinfo->mem_size = memsz; pinfo->rx_buf = mem_addr; pinfo->tx_buf = pinfo->rx_buf + L1_CACHE_ALIGN(pinfo->rx_nrfifos diff --git a/drivers/serial/cpm_uart/cpm_uart_cpm2.c b/drivers/serial/cpm_uart/cpm_uart_cpm2.c index b422c3abf..ef3bb476c 100644 --- a/drivers/serial/cpm_uart/cpm_uart_cpm2.c +++ b/drivers/serial/cpm_uart/cpm_uart_cpm2.c @@ -3,11 +3,13 @@ * * Driver for CPM (SCC/SMC) serial ports; CPM2 definitions * - * Maintainer: Kumar Gala (kumar.gala@freescale.com) (CPM2) + * Maintainer: Kumar Gala (galak@kernel.crashing.org) (CPM2) * Pantelis Antoniou (panto@intracom.gr) (CPM1) * * Copyright (C) 2004 Freescale Semiconductor, Inc. * (C) 2004 Intracom, S.A. + * (C) 2006 MontaVista Software, Inc. + * Vitaly Bordug * * 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 @@ -25,7 +27,6 @@ * */ -#include #include #include #include @@ -134,12 +135,21 @@ void scc1_lineif(struct uart_cpm_port *pinfo) void scc2_lineif(struct uart_cpm_port *pinfo) { + /* + * STx GP3 uses the SCC2 secondary option pin assignment + * which this driver doesn't account for in the static + * pin assignments. This kind of board specific info + * really has to get out of the driver so boards can + * be supported in a sane fashion. + */ +#ifndef CONFIG_STX_GP3 volatile iop_cpm2_t *io = &cpm2_immr->im_ioport; io->iop_pparb |= 0x008b0000; io->iop_pdirb |= 0x00880000; io->iop_psorb |= 0x00880000; io->iop_pdirb &= ~0x00030000; io->iop_psorb &= ~0x00030000; +#endif cpm2_immr->im_cpmux.cmx_scr &= 0xff00ffff; cpm2_immr->im_cpmux.cmx_scr |= 0x00090000; pinfo->brg = 2; @@ -200,8 +210,10 @@ int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con) memsz = L1_CACHE_ALIGN(pinfo->rx_nrfifos * pinfo->rx_fifosize) + L1_CACHE_ALIGN(pinfo->tx_nrfifos * pinfo->tx_fifosize); - if (is_con) + if (is_con) { mem_addr = alloc_bootmem(memsz); + dma_addr = virt_to_bus(mem_addr); + } else mem_addr = dma_alloc_coherent(NULL, memsz, &dma_addr, GFP_KERNEL); @@ -216,6 +228,7 @@ int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con) pinfo->dp_addr = dp_offset; pinfo->mem_addr = mem_addr; pinfo->dma_addr = dma_addr; + pinfo->mem_size = memsz; pinfo->rx_buf = mem_addr; pinfo->tx_buf = pinfo->rx_buf + L1_CACHE_ALIGN(pinfo->rx_nrfifos @@ -248,6 +261,7 @@ int cpm_uart_init_portdesc(void) cpm_uart_ports[UART_SMC1].smcp = (smc_t *) & cpm2_immr->im_smc[0]; cpm_uart_ports[UART_SMC1].smcup = (smc_uart_t *) & cpm2_immr->im_dprambase[PROFF_SMC1]; + *(u16 *)(&cpm2_immr->im_dprambase[PROFF_SMC1_BASE]) = PROFF_SMC1; cpm_uart_ports[UART_SMC1].port.mapbase = (unsigned long)&cpm2_immr->im_smc[0]; cpm_uart_ports[UART_SMC1].smcp->smc_smcm |= (SMCM_RX | SMCM_TX); @@ -260,6 +274,7 @@ int cpm_uart_init_portdesc(void) cpm_uart_ports[UART_SMC2].smcp = (smc_t *) & cpm2_immr->im_smc[1]; cpm_uart_ports[UART_SMC2].smcup = (smc_uart_t *) & cpm2_immr->im_dprambase[PROFF_SMC2]; + *(u16 *)(&cpm2_immr->im_dprambase[PROFF_SMC2_BASE]) = PROFF_SMC2; cpm_uart_ports[UART_SMC2].port.mapbase = (unsigned long)&cpm2_immr->im_smc[1]; cpm_uart_ports[UART_SMC2].smcp->smc_smcm |= (SMCM_RX | SMCM_TX); diff --git a/drivers/serial/crisv10.c b/drivers/serial/crisv10.c index 89700141f..cabd048c8 100644 --- a/drivers/serial/crisv10.c +++ b/drivers/serial/crisv10.c @@ -415,7 +415,7 @@ * Fixed DEF_TX value that caused the serial transmitter pin (txd) to go to 0 when * closing the last filehandle, NASTY!. * Added break generation, not tested though! - * Use SA_SHIRQ when request_irq() for ser2 and ser3 (shared with) par0 and par1. + * Use IRQF_SHARED when request_irq() for ser2 and ser3 (shared with) par0 and par1. * You can't use them at the same time (yet..), but you can hopefully switch * between ser2/par0, ser3/par1 with the same kernel config. * Replaced some magic constants with defines @@ -425,7 +425,6 @@ static char *serial_version = "$Revision: 1.25 $"; -#include #include #include #include @@ -2573,12 +2572,6 @@ static void flush_to_flip_buffer(struct e100_serial *info) DFLIP( if (1) { - - if (test_bit(TTY_DONT_FLIP, &tty->flags)) { - DEBUG_LOG(info->line, "*** TTY_DONT_FLIP set flip.count %i ***\n", tty->flip.count); - DEBUG_LOG(info->line, "*** recv_cnt %i\n", info->recv_cnt); - } else { - } DEBUG_LOG(info->line, "*** rxtot %i\n", info->icount.rx); DEBUG_LOG(info->line, "ldisc %lu\n", tty->ldisc.chars_in_buffer(tty)); DEBUG_LOG(info->line, "room %lu\n", tty->ldisc.receive_room(tty)); @@ -4884,7 +4877,7 @@ rs_init(void) driver->init_termios = tty_std_termios; driver->init_termios.c_cflag = B115200 | CS8 | CREAD | HUPCL | CLOCAL; /* is normally B9600 default... */ - driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS; + driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV; driver->termios = serial_termios; driver->termios_locked = serial_termios_locked; @@ -4949,55 +4942,55 @@ rs_init(void) /* Not needed in simulator. May only complicate stuff. */ /* hook the irq's for DMA channel 6 and 7, serial output and input, and some more... */ - if (request_irq(SERIAL_IRQ_NBR, ser_interrupt, SA_SHIRQ | SA_INTERRUPT, "serial ", NULL)) + if (request_irq(SERIAL_IRQ_NBR, ser_interrupt, IRQF_SHARED | IRQF_DISABLED, "serial ", NULL)) panic("irq8"); #ifdef CONFIG_ETRAX_SERIAL_PORT0 #ifdef CONFIG_ETRAX_SERIAL_PORT0_DMA6_OUT - if (request_irq(SER0_DMA_TX_IRQ_NBR, tr_interrupt, SA_INTERRUPT, "serial 0 dma tr", NULL)) + if (request_irq(SER0_DMA_TX_IRQ_NBR, tr_interrupt, IRQF_DISABLED, "serial 0 dma tr", NULL)) panic("irq22"); #endif #ifdef CONFIG_ETRAX_SERIAL_PORT0_DMA7_IN - if (request_irq(SER0_DMA_RX_IRQ_NBR, rec_interrupt, SA_INTERRUPT, "serial 0 dma rec", NULL)) + if (request_irq(SER0_DMA_RX_IRQ_NBR, rec_interrupt, IRQF_DISABLED, "serial 0 dma rec", NULL)) panic("irq23"); #endif #endif #ifdef CONFIG_ETRAX_SERIAL_PORT1 #ifdef CONFIG_ETRAX_SERIAL_PORT1_DMA8_OUT - if (request_irq(SER1_DMA_TX_IRQ_NBR, tr_interrupt, SA_INTERRUPT, "serial 1 dma tr", NULL)) + if (request_irq(SER1_DMA_TX_IRQ_NBR, tr_interrupt, IRQF_DISABLED, "serial 1 dma tr", NULL)) panic("irq24"); #endif #ifdef CONFIG_ETRAX_SERIAL_PORT1_DMA9_IN - if (request_irq(SER1_DMA_RX_IRQ_NBR, rec_interrupt, SA_INTERRUPT, "serial 1 dma rec", NULL)) + if (request_irq(SER1_DMA_RX_IRQ_NBR, rec_interrupt, IRQF_DISABLED, "serial 1 dma rec", NULL)) panic("irq25"); #endif #endif #ifdef CONFIG_ETRAX_SERIAL_PORT2 /* DMA Shared with par0 (and SCSI0 and ATA) */ #ifdef CONFIG_ETRAX_SERIAL_PORT2_DMA2_OUT - if (request_irq(SER2_DMA_TX_IRQ_NBR, tr_interrupt, SA_SHIRQ | SA_INTERRUPT, "serial 2 dma tr", NULL)) + if (request_irq(SER2_DMA_TX_IRQ_NBR, tr_interrupt, IRQF_SHARED | IRQF_DISABLED, "serial 2 dma tr", NULL)) panic("irq18"); #endif #ifdef CONFIG_ETRAX_SERIAL_PORT2_DMA3_IN - if (request_irq(SER2_DMA_RX_IRQ_NBR, rec_interrupt, SA_SHIRQ | SA_INTERRUPT, "serial 2 dma rec", NULL)) + if (request_irq(SER2_DMA_RX_IRQ_NBR, rec_interrupt, IRQF_SHARED | IRQF_DISABLED, "serial 2 dma rec", NULL)) panic("irq19"); #endif #endif #ifdef CONFIG_ETRAX_SERIAL_PORT3 /* DMA Shared with par1 (and SCSI1 and Extern DMA 0) */ #ifdef CONFIG_ETRAX_SERIAL_PORT3_DMA4_OUT - if (request_irq(SER3_DMA_TX_IRQ_NBR, tr_interrupt, SA_SHIRQ | SA_INTERRUPT, "serial 3 dma tr", NULL)) + if (request_irq(SER3_DMA_TX_IRQ_NBR, tr_interrupt, IRQF_SHARED | IRQF_DISABLED, "serial 3 dma tr", NULL)) panic("irq20"); #endif #ifdef CONFIG_ETRAX_SERIAL_PORT3_DMA5_IN - if (request_irq(SER3_DMA_RX_IRQ_NBR, rec_interrupt, SA_SHIRQ | SA_INTERRUPT, "serial 3 dma rec", NULL)) + if (request_irq(SER3_DMA_RX_IRQ_NBR, rec_interrupt, IRQF_SHARED | IRQF_DISABLED, "serial 3 dma rec", NULL)) panic("irq21"); #endif #endif #ifdef CONFIG_ETRAX_SERIAL_FLUSH_DMA_FAST - if (request_irq(TIMER1_IRQ_NBR, timeout_interrupt, SA_SHIRQ | SA_INTERRUPT, + if (request_irq(TIMER1_IRQ_NBR, timeout_interrupt, IRQF_SHARED | IRQF_DISABLED, "fast serial dma timeout", NULL)) { printk(KERN_CRIT "err: timer1 irq\n"); } diff --git a/drivers/serial/crisv10.h b/drivers/serial/crisv10.h index 1800c0e75..f30b93d6e 100644 --- a/drivers/serial/crisv10.h +++ b/drivers/serial/crisv10.h @@ -7,7 +7,6 @@ #ifndef _ETRAX_SERIAL_H #define _ETRAX_SERIAL_H -#include #include #include diff --git a/drivers/serial/dz.c b/drivers/serial/dz.c index bf71bad5c..8a98aae80 100644 --- a/drivers/serial/dz.c +++ b/drivers/serial/dz.c @@ -26,7 +26,6 @@ #undef DEBUG_DZ -#include #include #include #include @@ -674,7 +673,7 @@ static void dz_reset(struct dz_port *dport) } #ifdef CONFIG_SERIAL_DZ_CONSOLE -static void dz_console_putchar(struct uart_port *port, int ch) +static void dz_console_putchar(struct uart_port *uport, int ch) { struct dz_port *dport = (struct dz_port *)uport; unsigned long flags; @@ -768,11 +767,7 @@ void __init dz_serial_console_init(void) static struct uart_driver dz_reg = { .owner = THIS_MODULE, .driver_name = "serial", -#ifdef CONFIG_DEVFS - .dev_name = "tts/%d", -#else .dev_name = "ttyS%d", -#endif .major = TTY_MAJOR, .minor = 64, .nr = DZ_NB_PORT, @@ -802,7 +797,7 @@ int __init dz_init(void) restore_flags(flags); if (request_irq(dz_ports[0].port.irq, dz_interrupt, - SA_INTERRUPT, "DZ", &dz_ports[0])) + IRQF_DISABLED, "DZ", &dz_ports[0])) panic("Unable to register DZ interrupt"); ret = uart_register_driver(&dz_reg); diff --git a/drivers/serial/icom.c b/drivers/serial/icom.c index 144a7a352..a3c00a252 100644 --- a/drivers/serial/icom.c +++ b/drivers/serial/icom.c @@ -24,7 +24,6 @@ */ #define SERIAL_DO_RESTART #include -#include #include #include #include @@ -1564,7 +1563,7 @@ static int __devinit icom_probe(struct pci_dev *dev, /* save off irq and request irq line */ if ( (retval = request_irq(dev->irq, icom_interrupt, - SA_INTERRUPT | SA_SHIRQ, ICOM_DRIVER_NAME, + IRQF_DISABLED | IRQF_SHARED, ICOM_DRIVER_NAME, (void *) icom_adapter))) { goto probe_exit2; } diff --git a/drivers/serial/imx.c b/drivers/serial/imx.c index d202eb4f3..4a142d6b8 100644 --- a/drivers/serial/imx.c +++ b/drivers/serial/imx.c @@ -25,7 +25,6 @@ * [29-Mar-2005] Mike Lee * Added hardware handshake */ -#include #if defined(CONFIG_SERIAL_IMX_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #define SUPPORT_SYSRQ @@ -405,7 +404,7 @@ static int imx_startup(struct uart_port *port) if (retval) goto error_out2; retval = request_irq(sport->rtsirq, imx_rtsint, - SA_TRIGGER_FALLING | SA_TRIGGER_RISING, + IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, DRIVER_NAME, sport); if (retval) goto error_out3; @@ -888,7 +887,6 @@ static struct uart_driver imx_reg = { .owner = THIS_MODULE, .driver_name = DRIVER_NAME, .dev_name = "ttySMX", - .devfs_name = "ttsmx/", .major = SERIAL_IMX_MAJOR, .minor = MINOR_START, .nr = ARRAY_SIZE(imx_ports), diff --git a/drivers/serial/ioc4_serial.c b/drivers/serial/ioc4_serial.c index ba4e13a22..576ca1eaa 100644 --- a/drivers/serial/ioc4_serial.c +++ b/drivers/serial/ioc4_serial.c @@ -3,7 +3,7 @@ * 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. + * Copyright (C) 2003-2006 Silicon Graphics, Inc. All Rights Reserved. */ @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include /* @@ -130,12 +130,19 @@ IOC4_SIO_IR_S3_TX_EXPLICIT) /* Bitmasks for IOC4_OTHER_IR, IOC4_OTHER_IEC, and IOC4_OTHER_IES */ -#define IOC4_OTHER_IR_ATA_INT 0x00000001 /* ATAPI intr pass-thru */ -#define IOC4_OTHER_IR_ATA_MEMERR 0x00000002 /* ATAPI DMA PCI error */ -#define IOC4_OTHER_IR_S0_MEMERR 0x00000004 /* Port 0 PCI error */ -#define IOC4_OTHER_IR_S1_MEMERR 0x00000008 /* Port 1 PCI error */ -#define IOC4_OTHER_IR_S2_MEMERR 0x00000010 /* Port 2 PCI error */ -#define IOC4_OTHER_IR_S3_MEMERR 0x00000020 /* Port 3 PCI error */ +#define IOC4_OTHER_IR_ATA_INT 0x00000001 /* ATAPI intr pass-thru */ +#define IOC4_OTHER_IR_ATA_MEMERR 0x00000002 /* ATAPI DMA PCI error */ +#define IOC4_OTHER_IR_S0_MEMERR 0x00000004 /* Port 0 PCI error */ +#define IOC4_OTHER_IR_S1_MEMERR 0x00000008 /* Port 1 PCI error */ +#define IOC4_OTHER_IR_S2_MEMERR 0x00000010 /* Port 2 PCI error */ +#define IOC4_OTHER_IR_S3_MEMERR 0x00000020 /* Port 3 PCI error */ +#define IOC4_OTHER_IR_KBD_INT 0x00000040 /* Keyboard/mouse */ +#define IOC4_OTHER_IR_RESERVED 0x007fff80 /* Reserved */ +#define IOC4_OTHER_IR_RT_INT 0x00800000 /* INT_OUT section output */ +#define IOC4_OTHER_IR_GEN_INT 0xff000000 /* Generic pins */ + +#define IOC4_OTHER_IR_SER_MEMERR (IOC4_OTHER_IR_S0_MEMERR | IOC4_OTHER_IR_S1_MEMERR | \ + IOC4_OTHER_IR_S2_MEMERR | IOC4_OTHER_IR_S3_MEMERR) /* Bitmasks for IOC4_SIO_CR */ #define IOC4_SIO_CR_CMD_PULSE_SHIFT 0 /* byte bus strobe shift */ @@ -274,70 +281,24 @@ struct ioc4_uartregs { #define i4u_dlm u2.dlm #define i4u_fcr u3.fcr -/* PCI memory space register map addressed using pci_bar0 */ -struct ioc4_memregs { - struct ioc4_mem { - /* Miscellaneous IOC4 registers */ - uint32_t pci_err_addr_l; - uint32_t pci_err_addr_h; - uint32_t sio_ir; - uint32_t other_ir; - - /* These registers are read-only for general kernel code. */ - uint32_t sio_ies_ro; - uint32_t other_ies_ro; - uint32_t sio_iec_ro; - uint32_t other_iec_ro; - uint32_t sio_cr; - uint32_t misc_fill1; - uint32_t int_out; - uint32_t misc_fill2; - uint32_t gpcr_s; - uint32_t gpcr_c; - uint32_t gpdr; - uint32_t misc_fill3; - uint32_t gppr_0; - uint32_t gppr_1; - uint32_t gppr_2; - uint32_t gppr_3; - uint32_t gppr_4; - uint32_t gppr_5; - uint32_t gppr_6; - uint32_t gppr_7; - } ioc4_mem; - - char misc_fill4[0x100 - 0x5C - 4]; - - /* ATA/ATAP registers */ - uint32_t ata_notused[9]; - char ata_fill1[0x140 - 0x120 - 4]; - uint32_t ata_notused1[8]; - char ata_fill2[0x200 - 0x15C - 4]; - - /* Keyboard and mouse registers */ - uint32_t km_notused[5];; - char km_fill1[0x300 - 0x210 - 4]; - - /* Serial port registers used for DMA serial I/O */ - struct ioc4_serial { - uint32_t sbbr01_l; - uint32_t sbbr01_h; - uint32_t sbbr23_l; - uint32_t sbbr23_h; - - struct ioc4_serialregs port_0; - struct ioc4_serialregs port_1; - struct ioc4_serialregs port_2; - struct ioc4_serialregs port_3; - struct ioc4_uartregs uart_0; - struct ioc4_uartregs uart_1; - struct ioc4_uartregs uart_2; - struct ioc4_uartregs uart_3; - } ioc4_serial; -}; +/* Serial port registers used for DMA serial I/O */ +struct ioc4_serial { + uint32_t sbbr01_l; + uint32_t sbbr01_h; + uint32_t sbbr23_l; + uint32_t sbbr23_h; + + struct ioc4_serialregs port_0; + struct ioc4_serialregs port_1; + struct ioc4_serialregs port_2; + struct ioc4_serialregs port_3; + struct ioc4_uartregs uart_0; + struct ioc4_uartregs uart_1; + struct ioc4_uartregs uart_2; + struct ioc4_uartregs uart_3; +} ioc4_serial; /* UART clock speed */ -#define IOC4_SER_XIN_CLK IOC4_SER_XIN_CLK_66 #define IOC4_SER_XIN_CLK_66 66666667 #define IOC4_SER_XIN_CLK_33 33333333 @@ -347,6 +308,8 @@ struct ioc4_memregs { typedef void ioc4_intr_func_f(void *, uint32_t); typedef ioc4_intr_func_f *ioc4_intr_func_t; +static unsigned int Num_of_ioc4_cards; + /* defining this will get you LOTS of great debug info */ //#define DEBUG_INTERRUPTS #define DPRINT_CONFIG(_x...) ; @@ -356,12 +319,16 @@ typedef ioc4_intr_func_f *ioc4_intr_func_t; #define WAKEUP_CHARS 256 /* number of characters we want to transmit to the lower level at a time */ -#define IOC4_MAX_CHARS 128 +#define IOC4_MAX_CHARS 256 +#define IOC4_FIFO_CHARS 255 /* Device name we're using */ -#define DEVICE_NAME "ttyIOC" -#define DEVICE_MAJOR 204 -#define DEVICE_MINOR 50 +#define DEVICE_NAME_RS232 "ttyIOC" +#define DEVICE_NAME_RS422 "ttyAIOC" +#define DEVICE_MAJOR 204 +#define DEVICE_MINOR_RS232 50 +#define DEVICE_MINOR_RS422 84 + /* register offsets */ #define IOC4_SERIAL_OFFSET 0x300 @@ -377,10 +344,8 @@ typedef ioc4_intr_func_f *ioc4_intr_func_t; #define MAX_BAUD_SUPPORTED 115200 /* protocol types supported */ -enum sio_proto { - PROTO_RS232, - PROTO_RS422 -}; +#define PROTO_RS232 3 +#define PROTO_RS422 7 /* Notification types */ #define N_DATA_READY 0x01 @@ -412,8 +377,8 @@ enum sio_proto { | UART_LCR_WLEN7 | UART_LCR_WLEN8) #define LCR_MASK_STOP_BITS (UART_LCR_STOP) -#define PENDING(_p) (readl(&(_p)->ip_mem->sio_ir) & _p->ip_ienb) -#define READ_SIO_IR(_p) readl(&(_p)->ip_mem->sio_ir) +#define PENDING(_p) (readl(&(_p)->ip_mem->sio_ir.raw) & _p->ip_ienb) +#define READ_SIO_IR(_p) readl(&(_p)->ip_mem->sio_ir.raw) /* Default to 4k buffers */ #ifdef IOC4_1K_BUFFERS @@ -431,11 +396,17 @@ enum sio_proto { /* * This is the entry saved by the driver - one per card */ + +#define UART_PORT_MIN 0 +#define UART_PORT_RS232 UART_PORT_MIN +#define UART_PORT_RS422 1 +#define UART_PORT_COUNT 2 /* one for each mode */ + struct ioc4_control { int ic_irq; struct { - /* uart ports are allocated here */ - struct uart_port icp_uart_port; + /* uart ports are allocated here - 1 for rs232, 1 for rs422 */ + struct uart_port icp_uart_port[UART_PORT_COUNT]; /* Handy reference material */ struct ioc4_port *icp_port; } ic_port[IOC4_NUM_SERIAL_PORTS]; @@ -447,7 +418,7 @@ struct ioc4_control { */ #define MAX_IOC4_INTR_ENTS (8 * sizeof(uint32_t)) struct ioc4_soft { - struct ioc4_mem __iomem *is_ioc4_mem_addr; + struct ioc4_misc_regs __iomem *is_ioc4_misc_addr; struct ioc4_serial __iomem *is_ioc4_serial_addr; /* Each interrupt type has an entry in the array */ @@ -479,14 +450,16 @@ struct ioc4_soft { /* Local port info for each IOC4 serial ports */ struct ioc4_port { - struct uart_port *ip_port; + struct uart_port *ip_port; /* current active port ptr */ + /* Ptrs for all ports */ + struct uart_port *ip_all_ports[UART_PORT_COUNT]; /* Back ptrs for this port */ struct ioc4_control *ip_control; struct pci_dev *ip_pdev; struct ioc4_soft *ip_ioc4_soft; /* pci mem addresses */ - struct ioc4_mem __iomem *ip_mem; + struct ioc4_misc_regs __iomem *ip_mem; struct ioc4_serial __iomem *ip_serial; struct ioc4_serialregs __iomem *ip_serial_regs; struct ioc4_uartregs __iomem *ip_uart_regs; @@ -538,6 +511,9 @@ struct ioc4_port { #define DCD_ON 0x02 #define LOWAT_WRITTEN 0x04 #define READ_ABORTED 0x08 +#define PORT_ACTIVE 0x10 +#define PORT_INACTIVE 0 /* This is the value when "off" */ + /* Since each port has different register offsets and bitmasks * for everything, we'll store those that we need in tables so we @@ -553,7 +529,7 @@ struct hooks { uint32_t intr_dma_error; uint32_t intr_clear; uint32_t intr_all; - char rs422_select_pin; + int rs422_select_pin; }; static struct hooks hooks_array[IOC4_NUM_SERIAL_PORTS] = { @@ -659,6 +635,23 @@ struct ring_buffer { static void receive_chars(struct uart_port *); static void handle_intr(void *arg, uint32_t sio_ir); +/* + * port_is_active - determines if this port is currently active + * @port: ptr to soft struct for this port + * @uart_port: uart port to test for + */ +static inline int port_is_active(struct ioc4_port *port, + struct uart_port *uart_port) +{ + if (port) { + if ((port->ip_flags & PORT_ACTIVE) + && (port->ip_port == uart_port)) + return 1; + } + return 0; +} + + /** * write_ireg - write the interrupt regs * @ioc4_soft: ptr to soft struct for this port @@ -669,7 +662,7 @@ static void handle_intr(void *arg, uint32_t sio_ir); static inline void write_ireg(struct ioc4_soft *ioc4_soft, uint32_t val, int which, int type) { - struct ioc4_mem __iomem *mem = ioc4_soft->is_ioc4_mem_addr; + struct ioc4_misc_regs __iomem *mem = ioc4_soft->is_ioc4_misc_addr; unsigned long flags; spin_lock_irqsave(&ioc4_soft->is_ir_lock, flags); @@ -678,11 +671,11 @@ write_ireg(struct ioc4_soft *ioc4_soft, uint32_t val, int which, int type) case IOC4_SIO_INTR_TYPE: switch (which) { case IOC4_W_IES: - writel(val, &mem->sio_ies_ro); + writel(val, &mem->sio_ies.raw); break; case IOC4_W_IEC: - writel(val, &mem->sio_iec_ro); + writel(val, &mem->sio_iec.raw); break; } break; @@ -690,11 +683,11 @@ write_ireg(struct ioc4_soft *ioc4_soft, uint32_t val, int which, int type) case IOC4_OTHER_INTR_TYPE: switch (which) { case IOC4_W_IES: - writel(val, &mem->other_ies_ro); + writel(val, &mem->other_ies.raw); break; case IOC4_W_IEC: - writel(val, &mem->other_iec_ro); + writel(val, &mem->other_iec.raw); break; } break; @@ -744,18 +737,33 @@ static int set_baud(struct ioc4_port *port, int baud) /** * get_ioc4_port - given a uart port, return the control structure * @port: uart port + * @set: set this port as current */ -static struct ioc4_port *get_ioc4_port(struct uart_port *the_port) +static struct ioc4_port *get_ioc4_port(struct uart_port *the_port, int set) { - struct ioc4_control *control = dev_get_drvdata(the_port->dev); - int ii; + struct ioc4_driver_data *idd = dev_get_drvdata(the_port->dev); + struct ioc4_control *control = idd->idd_serial_data; + struct ioc4_port *port; + int port_num, port_type; if (control) { - for ( ii = 0; ii < IOC4_NUM_SERIAL_PORTS; ii++ ) { - if (!control->ic_port[ii].icp_port) + for ( port_num = 0; port_num < IOC4_NUM_SERIAL_PORTS; + port_num++ ) { + port = control->ic_port[port_num].icp_port; + if (!port) continue; - if (the_port == control->ic_port[ii].icp_port->ip_port) - return control->ic_port[ii].icp_port; + for (port_type = UART_PORT_MIN; + port_type < UART_PORT_COUNT; + port_type++) { + if (the_port == port->ip_all_ports + [port_type]) { + /* set local copy */ + if (set) { + port->ip_port = the_port; + } + return port; + } + } } } return NULL; @@ -782,7 +790,7 @@ static struct ioc4_port *get_ioc4_port(struct uart_port *the_port) static inline uint32_t pending_intrs(struct ioc4_soft *soft, int type) { - struct ioc4_mem __iomem *mem = soft->is_ioc4_mem_addr; + struct ioc4_misc_regs __iomem *mem = soft->is_ioc4_misc_addr; unsigned long flag; uint32_t intrs = 0; @@ -793,11 +801,11 @@ pending_intrs(struct ioc4_soft *soft, int type) switch (type) { case IOC4_SIO_INTR_TYPE: - intrs = readl(&mem->sio_ir) & readl(&mem->sio_ies_ro); + intrs = readl(&mem->sio_ir.raw) & readl(&mem->sio_ies.raw); break; case IOC4_OTHER_INTR_TYPE: - intrs = readl(&mem->other_ir) & readl(&mem->other_ies_ro); + intrs = readl(&mem->other_ir.raw) & readl(&mem->other_ies.raw); /* Don't process any ATA interrupte */ intrs &= ~(IOC4_OTHER_IR_ATA_INT | IOC4_OTHER_IR_ATA_MEMERR); @@ -826,7 +834,7 @@ static int inline port_init(struct ioc4_port *port) /* Wait until any pending bus activity for this port has ceased */ do - sio_cr = readl(&port->ip_mem->sio_cr); + sio_cr = readl(&port->ip_mem->sio_cr.raw); while (!(sio_cr & IOC4_SIO_CR_SIO_DIAG_IDLE)); /* Finish reset sequence */ @@ -899,7 +907,7 @@ static int inline port_init(struct ioc4_port *port) write_ireg(port->ip_ioc4_soft, hooks->intr_clear, IOC4_W_IEC, IOC4_SIO_INTR_TYPE); port->ip_ienb &= ~hooks->intr_clear; - writel(hooks->intr_clear, &port->ip_mem->sio_ir); + writel(hooks->intr_clear, &port->ip_mem->sio_ir.raw); return 0; } @@ -918,23 +926,23 @@ static void handle_dma_error_intr(void *arg, uint32_t other_ir) spin_lock_irqsave(&port->ip_lock, flags); /* ACK the interrupt */ - writel(hooks->intr_dma_error, &port->ip_mem->other_ir); + writel(hooks->intr_dma_error, &port->ip_mem->other_ir.raw); - if (readl(&port->ip_mem->pci_err_addr_l) & IOC4_PCI_ERR_ADDR_VLD) { + if (readl(&port->ip_mem->pci_err_addr_l.raw) & IOC4_PCI_ERR_ADDR_VLD) { printk(KERN_ERR "PCI error address is 0x%lx, " "master is serial port %c %s\n", (((uint64_t)readl(&port->ip_mem->pci_err_addr_h) << 32) - | readl(&port->ip_mem->pci_err_addr_l)) + | readl(&port->ip_mem->pci_err_addr_l.raw)) & IOC4_PCI_ERR_ADDR_ADDR_MSK, '1' + - ((char)(readl(&port->ip_mem-> pci_err_addr_l) & + ((char)(readl(&port->ip_mem->pci_err_addr_l.raw) & IOC4_PCI_ERR_ADDR_MST_NUM_MSK) >> 1), - (readl(&port->ip_mem->pci_err_addr_l) + (readl(&port->ip_mem->pci_err_addr_l.raw) & IOC4_PCI_ERR_ADDR_MST_TYP_MSK) ? "RX" : "TX"); - if (readl(&port->ip_mem->pci_err_addr_l) + if (readl(&port->ip_mem->pci_err_addr_l.raw) & IOC4_PCI_ERR_ADDR_MUL_ERR) { printk(KERN_ERR "Multiple errors occurred\n"); @@ -981,6 +989,7 @@ intr_connect(struct ioc4_soft *soft, int type, * @arg: handler arg * @regs: registers */ + static irqreturn_t ioc4_intr(int irq, void *arg, struct pt_regs *regs) { struct ioc4_soft *soft; @@ -988,7 +997,7 @@ static irqreturn_t ioc4_intr(int irq, void *arg, struct pt_regs *regs) int xx, num_intrs = 0; int intr_type; int handled = 0; - struct ioc4_intr_info *ii; + struct ioc4_intr_info *intr_info; soft = arg; for (intr_type = 0; intr_type < IOC4_NUM_INTR_TYPES; intr_type++) { @@ -1001,43 +1010,30 @@ static irqreturn_t ioc4_intr(int irq, void *arg, struct pt_regs *regs) * which interrupt bits are set. */ for (xx = 0; xx < num_intrs; xx++) { - ii = &soft->is_intr_type[intr_type].is_intr_info[xx]; - if ((this_mir = this_ir & ii->sd_bits)) { + intr_info = &soft->is_intr_type[intr_type].is_intr_info[xx]; + if ((this_mir = this_ir & intr_info->sd_bits)) { /* Disable owned interrupts, call handler */ handled++; - write_ireg(soft, ii->sd_bits, IOC4_W_IEC, + write_ireg(soft, intr_info->sd_bits, IOC4_W_IEC, intr_type); - ii->sd_intr(ii->sd_info, this_mir); + intr_info->sd_intr(intr_info->sd_info, this_mir); this_ir &= ~this_mir; } } - if (this_ir) { - printk(KERN_ERR - "unknown IOC4 %s interrupt 0x%x, sio_ir = 0x%x," - " sio_ies = 0x%x, other_ir = 0x%x :" - "other_ies = 0x%x\n", - (intr_type == IOC4_SIO_INTR_TYPE) ? "sio" : - "other", this_ir, - readl(&soft->is_ioc4_mem_addr->sio_ir), - readl(&soft->is_ioc4_mem_addr->sio_ies_ro), - readl(&soft->is_ioc4_mem_addr->other_ir), - readl(&soft->is_ioc4_mem_addr->other_ies_ro)); - } } #ifdef DEBUG_INTERRUPTS { - struct ioc4_mem __iomem *mem = soft->is_ioc4_mem_addr; - spinlock_t *lp = &soft->is_ir_lock; + struct ioc4_misc_regs __iomem *mem = soft->is_ioc4_misc_addr; unsigned long flag; spin_lock_irqsave(&soft->is_ir_lock, flag); - printk ("%s : %d : mem 0x%p sio_ir 0x%x sio_ies_ro 0x%x " - "other_ir 0x%x other_ies_ro 0x%x mask 0x%x\n", + printk ("%s : %d : mem 0x%p sio_ir 0x%x sio_ies 0x%x " + "other_ir 0x%x other_ies 0x%x mask 0x%x\n", __FUNCTION__, __LINE__, - (void *)mem, readl(&mem->sio_ir), - readl(&mem->sio_ies_ro), - readl(&mem->other_ir), - readl(&mem->other_ies_ro), + (void *)mem, readl(&mem->sio_ir.raw), + readl(&mem->sio_ies.raw), + readl(&mem->other_ir.raw), + readl(&mem->other_ies.raw), IOC4_OTHER_IR_ATA_INT | IOC4_OTHER_IR_ATA_MEMERR); spin_unlock_irqrestore(&soft->is_ir_lock, flag); } @@ -1049,21 +1045,20 @@ static irqreturn_t ioc4_intr(int irq, void *arg, struct pt_regs *regs) * ioc4_attach_local - Device initialization. * Called at *_attach() time for each * IOC4 with serial ports in the system. - * @control: ioc4_control ptr - * @pdev: PCI handle for this device - * @soft: soft struct for this device - * @ioc4: ioc4 mem space + * @idd: Master module data for this IOC4 */ -static int inline ioc4_attach_local(struct pci_dev *pdev, - struct ioc4_control *control, - struct ioc4_soft *soft, void __iomem *ioc4_mem, - void __iomem *ioc4_serial) +static int inline ioc4_attach_local(struct ioc4_driver_data *idd) { struct ioc4_port *port; struct ioc4_port *ports[IOC4_NUM_SERIAL_PORTS]; int port_number; uint16_t ioc4_revid_min = 62; uint16_t ioc4_revid; + struct pci_dev *pdev = idd->idd_pdev; + struct ioc4_control* control = idd->idd_serial_data; + struct ioc4_soft *soft = control->ic_soft; + void __iomem *ioc4_misc = idd->idd_misc_regs; + void __iomem *ioc4_serial = soft->is_ioc4_serial_addr; /* IOC4 firmware must be at least rev 62 */ pci_read_config_word(pdev, PCI_COMMAND_SPECIAL, &ioc4_revid); @@ -1076,7 +1071,7 @@ static int inline ioc4_attach_local(struct pci_dev *pdev, ioc4_revid, ioc4_revid_min); return -EPERM; } - BUG_ON(ioc4_mem == NULL); + BUG_ON(ioc4_misc == NULL); BUG_ON(ioc4_serial == NULL); /* Create port structures for each port */ @@ -1089,6 +1084,7 @@ static int inline ioc4_attach_local(struct pci_dev *pdev, return -ENOMEM; } memset(port, 0, sizeof(struct ioc4_port)); + spin_lock_init(&port->ip_lock); /* we need to remember the previous ones, to point back to * them farther down - setting up the ring buffers. @@ -1100,10 +1096,18 @@ static int inline ioc4_attach_local(struct pci_dev *pdev, port->ip_ioc4_soft = soft; port->ip_pdev = pdev; port->ip_ienb = 0; - port->ip_pci_bus_speed = IOC4_SER_XIN_CLK; + /* Use baud rate calculations based on detected PCI + * bus speed. Simply test whether the PCI clock is + * running closer to 66MHz or 33MHz. + */ + if (idd->count_period/IOC4_EXTINT_COUNT_DIVISOR < 20) { + port->ip_pci_bus_speed = IOC4_SER_XIN_CLK_66; + } else { + port->ip_pci_bus_speed = IOC4_SER_XIN_CLK_33; + } port->ip_baud = 9600; port->ip_control = control; - port->ip_mem = ioc4_mem; + port->ip_mem = ioc4_misc; port->ip_serial = ioc4_serial; /* point to the right hook */ @@ -1216,7 +1220,7 @@ static inline int local_open(struct ioc4_port *port) { int spiniter = 0; - port->ip_flags = 0; + port->ip_flags = PORT_ACTIVE; /* Pause the DMA interface if necessary */ if (port->ip_sscr & IOC4_SSCR_DMA_EN) { @@ -1226,6 +1230,7 @@ static inline int local_open(struct ioc4_port *port) & IOC4_SSCR_PAUSE_STATE) == 0) { spiniter++; if (spiniter > MAXITER) { + port->ip_flags = PORT_INACTIVE; return -1; } } @@ -1545,14 +1550,13 @@ static int set_notification(struct ioc4_port *port, int mask, int set_on) /** * set_mcr - set the master control reg * @the_port: port to use - * @set: set ? * @mask1: mcr mask * @mask2: shadow mask */ -static inline int set_mcr(struct uart_port *the_port, int set, +static inline int set_mcr(struct uart_port *the_port, int mask1, int mask2) { - struct ioc4_port *port = get_ioc4_port(the_port); + struct ioc4_port *port = get_ioc4_port(the_port, 0); uint32_t shadow; int spiniter = 0; char mcr; @@ -1575,13 +1579,9 @@ static inline int set_mcr(struct uart_port *the_port, int set, mcr = (shadow & 0xff000000) >> 24; /* Set new value */ - if (set) { - mcr |= mask1; - shadow |= mask2; - } else { - mcr &= ~mask1; - shadow &= ~mask2; - } + mcr |= mask1; + shadow |= mask2; + writeb(mcr, &port->ip_uart_regs->i4u_mcr); writel(shadow, &port->ip_serial_regs->shadow); @@ -1597,21 +1597,19 @@ static inline int set_mcr(struct uart_port *the_port, int set, * @port: port to use * @proto: protocol to use */ -static int ioc4_set_proto(struct ioc4_port *port, enum sio_proto proto) +static int ioc4_set_proto(struct ioc4_port *port, int proto) { struct hooks *hooks = port->ip_hooks; switch (proto) { case PROTO_RS232: /* Clear the appropriate GIO pin */ - writel(0, (&port->ip_mem->gppr_0 + - hooks->rs422_select_pin)); + writel(0, (&port->ip_mem->gppr[hooks->rs422_select_pin].raw)); break; case PROTO_RS422: /* Set the appropriate GIO pin */ - writel(1, (&port->ip_mem->gppr_0 + - hooks->rs422_select_pin)); + writel(1, (&port->ip_mem->gppr[hooks->rs422_select_pin].raw)); break; default: @@ -1630,7 +1628,7 @@ static void transmit_chars(struct uart_port *the_port) int result; char *start; struct tty_struct *tty; - struct ioc4_port *port = get_ioc4_port(the_port); + struct ioc4_port *port = get_ioc4_port(the_port, 0); struct uart_info *info; if (!the_port) @@ -1686,7 +1684,7 @@ static void ioc4_change_speed(struct uart_port *the_port, struct termios *new_termios, struct termios *old_termios) { - struct ioc4_port *port = get_ioc4_port(the_port); + struct ioc4_port *port = get_ioc4_port(the_port, 0); int baud, bits; unsigned cflag; int new_parity = 0, new_parity_enable = 0, new_stop = 0, new_data = 8; @@ -1736,12 +1734,14 @@ ioc4_change_speed(struct uart_port *the_port, baud = 9600; if (!the_port->fifosize) - the_port->fifosize = IOC4_MAX_CHARS; + the_port->fifosize = IOC4_FIFO_CHARS; the_port->timeout = ((the_port->fifosize * HZ * bits) / (baud / 10)); the_port->timeout += HZ / 50; /* Add .02 seconds of slop */ the_port->ignore_status_mask = N_ALL_INPUT; + info->tty->low_latency = 1; + if (I_IGNPAR(info->tty)) the_port->ignore_status_mask &= ~(N_PARITY_ERROR | N_FRAMING_ERROR); @@ -1756,11 +1756,9 @@ ioc4_change_speed(struct uart_port *the_port, } if (cflag & CRTSCTS) { - info->flags |= ASYNC_CTS_FLOW; port->ip_sscr |= IOC4_SSCR_HFC_EN; } else { - info->flags &= ~ASYNC_CTS_FLOW; port->ip_sscr &= ~IOC4_SSCR_HFC_EN; } writel(port->ip_sscr, &port->ip_serial_regs->sscr); @@ -1787,52 +1785,42 @@ ioc4_change_speed(struct uart_port *the_port, */ static inline int ic4_startup_local(struct uart_port *the_port) { - int retval = 0; struct ioc4_port *port; struct uart_info *info; if (!the_port) return -1; - port = get_ioc4_port(the_port); + port = get_ioc4_port(the_port, 0); if (!port) return -1; info = the_port->info; - if (info->flags & UIF_INITIALIZED) { - return retval; - } - if (info->tty) { - set_bit(TTY_IO_ERROR, &info->tty->flags); - clear_bit(TTY_IO_ERROR, &info->tty->flags); - if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI) - info->tty->alt_speed = 57600; - if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI) - info->tty->alt_speed = 115200; - if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI) - info->tty->alt_speed = 230400; - if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP) - info->tty->alt_speed = 460800; - } local_open(port); + /* set the protocol - mapbase has the port type */ + ioc4_set_proto(port, the_port->mapbase); + /* set the speed of the serial port */ ioc4_change_speed(the_port, info->tty->termios, (struct termios *)0); - info->flags |= UIF_INITIALIZED; return 0; } /* * ioc4_cb_output_lowat - called when the output low water mark is hit - * @port: port to output + * @the_port: port to output */ -static void ioc4_cb_output_lowat(struct ioc4_port *port) +static void ioc4_cb_output_lowat(struct uart_port *the_port) { + unsigned long pflags; + /* ip_lock is set on the call here */ - if (port->ip_port) { - transmit_chars(port->ip_port); + if (the_port) { + spin_lock_irqsave(&the_port->lock, pflags); + transmit_chars(the_port); + spin_unlock_irqrestore(&the_port->lock, pflags); } } @@ -1885,7 +1873,7 @@ static void handle_intr(void *arg, uint32_t sio_ir) if (sio_ir & hooks->intr_delta_dcd) { /* ACK the interrupt */ writel(hooks->intr_delta_dcd, - &port->ip_mem->sio_ir); + &port->ip_mem->sio_ir.raw); shadow = readl(&port->ip_serial_regs->shadow); @@ -1907,7 +1895,7 @@ static void handle_intr(void *arg, uint32_t sio_ir) if (sio_ir & hooks->intr_delta_cts) { /* ACK the interrupt */ writel(hooks->intr_delta_cts, - &port->ip_mem->sio_ir); + &port->ip_mem->sio_ir.raw); shadow = readl(&port->ip_serial_regs->shadow); @@ -1928,7 +1916,7 @@ static void handle_intr(void *arg, uint32_t sio_ir) if (sio_ir & hooks->intr_rx_timer) { /* ACK the interrupt */ writel(hooks->intr_rx_timer, - &port->ip_mem->sio_ir); + &port->ip_mem->sio_ir.raw); if ((port->ip_notify & N_DATA_READY) && (port->ip_port)) { @@ -1974,10 +1962,10 @@ static void handle_intr(void *arg, uint32_t sio_ir) /* ACK the interrupt */ writel(hooks->intr_tx_explicit, - &port->ip_mem->sio_ir); + &port->ip_mem->sio_ir.raw); if (port->ip_notify & N_OUTPUT_LOWAT) - ioc4_cb_output_lowat(port); + ioc4_cb_output_lowat(port->ip_port); } /* Handle tx_mt. Must come after tx_explicit. */ @@ -1990,7 +1978,7 @@ static void handle_intr(void *arg, uint32_t sio_ir) * So send the notification now. */ if (port->ip_notify & N_OUTPUT_LOWAT) { - ioc4_cb_output_lowat(port); + ioc4_cb_output_lowat(port->ip_port); /* We need to reload the sio_ir since the lowat * call may have caused another write to occur, @@ -2077,7 +2065,7 @@ static inline int do_read(struct uart_port *the_port, unsigned char *buf, int len) { int prod_ptr, cons_ptr, total; - struct ioc4_port *port = get_ioc4_port(the_port); + struct ioc4_port *port = get_ioc4_port(the_port, 0); struct ring *inring; struct ring_entry *entry; struct hooks *hooks = port->ip_hooks; @@ -2109,8 +2097,7 @@ static inline int do_read(struct uart_port *the_port, unsigned char *buf, * available data as long as it returns some. */ /* Re-arm the timer */ - writel(port->ip_rx_cons | IOC4_SRCIR_ARM, - &port->ip_serial_regs->srcir); + writel(port->ip_rx_cons | IOC4_SRCIR_ARM, &port->ip_serial_regs->srcir); prod_ptr = readl(&port->ip_serial_regs->srpir) & PROD_CONS_MASK; cons_ptr = port->ip_rx_cons; @@ -2344,6 +2331,7 @@ static inline int do_read(struct uart_port *the_port, unsigned char *buf, } return total; } + /** * receive_chars - upper level read. Called with ip_lock. * @the_port: port to read from @@ -2352,9 +2340,10 @@ static void receive_chars(struct uart_port *the_port) { struct tty_struct *tty; unsigned char ch[IOC4_MAX_CHARS]; - int read_count, request_count; + int read_count, request_count = IOC4_MAX_CHARS; struct uart_icount *icount; struct uart_info *info = the_port->info; + unsigned long pflags; /* Make sure all the pointers are "good" ones */ if (!info) @@ -2362,24 +2351,22 @@ static void receive_chars(struct uart_port *the_port) if (!info->tty) return; + spin_lock_irqsave(&the_port->lock, pflags); tty = info->tty; - request_count = TTY_FLIPBUF_SIZE - tty->flip.count - 1; + request_count = tty_buffer_request_room(tty, IOC4_MAX_CHARS); if (request_count > 0) { - if (request_count > IOC4_MAX_CHARS - 2) - request_count = IOC4_MAX_CHARS - 2; icount = &the_port->icount; read_count = do_read(the_port, ch, request_count); if (read_count > 0) { - memcpy(tty->flip.char_buf_ptr, ch, read_count); - memset(tty->flip.flag_buf_ptr, TTY_NORMAL, read_count); - tty->flip.char_buf_ptr += read_count; - tty->flip.flag_buf_ptr += read_count; - tty->flip.count += read_count; + tty_insert_flip_string(tty, ch, read_count); icount->rx += read_count; } } + + spin_unlock_irqrestore(&the_port->lock, pflags); + tty_flip_buffer_push(tty); } @@ -2390,27 +2377,40 @@ static void receive_chars(struct uart_port *the_port) */ static const char *ic4_type(struct uart_port *the_port) { - return "SGI IOC4 Serial"; + if (the_port->mapbase == PROTO_RS232) + return "SGI IOC4 Serial [rs232]"; + else + return "SGI IOC4 Serial [rs422]"; } /** - * ic4_tx_empty - Is the transmitter empty? We pretend we're always empty - * @port: Port to operate on (we ignore since we always return 1) + * ic4_tx_empty - Is the transmitter empty? + * @port: Port to operate on * */ static unsigned int ic4_tx_empty(struct uart_port *the_port) { - return 1; + struct ioc4_port *port = get_ioc4_port(the_port, 0); + unsigned int ret = 0; + + if (port_is_active(port, the_port)) { + if (readl(&port->ip_serial_regs->shadow) & IOC4_SHADOW_TEMT) + ret = TIOCSER_TEMT; + } + return ret; } /** * ic4_stop_tx - stop the transmitter * @port: Port to operate on - * @tty_stop: Set to 1 if called via uart_stop * */ -static void ic4_stop_tx(struct uart_port *the_port, unsigned int tty_stop) +static void ic4_stop_tx(struct uart_port *the_port) { + struct ioc4_port *port = get_ioc4_port(the_port, 0); + + if (port_is_active(port, the_port)) + set_notification(port, N_OUTPUT_LOWAT, 0); } /** @@ -2433,24 +2433,22 @@ static void ic4_shutdown(struct uart_port *the_port) struct ioc4_port *port; struct uart_info *info; - port = get_ioc4_port(the_port); + port = get_ioc4_port(the_port, 0); if (!port) return; info = the_port->info; - - if (!(info->flags & UIF_INITIALIZED)) - return; + port->ip_port = NULL; wake_up_interruptible(&info->delta_msr_wait); if (info->tty) set_bit(TTY_IO_ERROR, &info->tty->flags); - spin_lock_irqsave(&port->ip_lock, port_flags); + spin_lock_irqsave(&the_port->lock, port_flags); set_notification(port, N_ALL, 0); - info->flags &= ~UIF_INITIALIZED; - spin_unlock_irqrestore(&port->ip_lock, port_flags); + port->ip_flags = PORT_INACTIVE; + spin_unlock_irqrestore(&the_port->lock, port_flags); } /** @@ -2462,6 +2460,11 @@ static void ic4_shutdown(struct uart_port *the_port) static void ic4_set_mctrl(struct uart_port *the_port, unsigned int mctrl) { unsigned char mcr = 0; + struct ioc4_port *port; + + port = get_ioc4_port(the_port, 0); + if (!port_is_active(port, the_port)) + return; if (mctrl & TIOCM_RTS) mcr |= UART_MCR_RTS; @@ -2474,7 +2477,7 @@ static void ic4_set_mctrl(struct uart_port *the_port, unsigned int mctrl) if (mctrl & TIOCM_LOOP) mcr |= UART_MCR_LOOP; - set_mcr(the_port, 1, mcr, IOC4_SHADOW_DTR); + set_mcr(the_port, mcr, IOC4_SHADOW_DTR); } /** @@ -2484,11 +2487,11 @@ static void ic4_set_mctrl(struct uart_port *the_port, unsigned int mctrl) */ static unsigned int ic4_get_mctrl(struct uart_port *the_port) { - struct ioc4_port *port = get_ioc4_port(the_port); + struct ioc4_port *port = get_ioc4_port(the_port, 0); uint32_t shadow; unsigned int ret = 0; - if (!port) + if (!port_is_active(port, the_port)) return 0; shadow = readl(&port->ip_serial_regs->shadow); @@ -2504,18 +2507,15 @@ static unsigned int ic4_get_mctrl(struct uart_port *the_port) /** * ic4_start_tx - Start transmitter, flush any output * @port: Port to operate on - * @tty_stop: Set to 1 if called via uart_start * */ -static void ic4_start_tx(struct uart_port *the_port, unsigned int tty_stop) +static void ic4_start_tx(struct uart_port *the_port) { - struct ioc4_port *port = get_ioc4_port(the_port); - unsigned long flags; + struct ioc4_port *port = get_ioc4_port(the_port, 0); - if (port) { - spin_lock_irqsave(&port->ip_lock, flags); - transmit_chars(the_port); - spin_unlock_irqrestore(&port->ip_lock, flags); + if (port_is_active(port, the_port)) { + set_notification(port, N_OUTPUT_LOWAT, 1); + enable_intrs(port, port->ip_hooks->intr_tx_mt); } } @@ -2530,7 +2530,7 @@ static void ic4_break_ctl(struct uart_port *the_port, int break_state) } /** - * ic4_startup - Start up the serial port - always return 0 (We're always on) + * ic4_startup - Start up the serial port * @port: Port to operate on * */ @@ -2542,24 +2542,23 @@ static int ic4_startup(struct uart_port *the_port) struct uart_info *info; unsigned long port_flags; - if (!the_port) { + if (!the_port) return -ENODEV; - } - port = get_ioc4_port(the_port); - if (!port) { + port = get_ioc4_port(the_port, 1); + if (!port) return -ENODEV; - } info = the_port->info; control = port->ip_control; if (!control) { + port->ip_port = NULL; return -ENODEV; } /* Start up the serial port */ - spin_lock_irqsave(&port->ip_lock, port_flags); + spin_lock_irqsave(&the_port->lock, port_flags); retval = ic4_startup_local(the_port); - spin_unlock_irqrestore(&port->ip_lock, port_flags); + spin_unlock_irqrestore(&the_port->lock, port_flags); return retval; } @@ -2574,12 +2573,11 @@ static void ic4_set_termios(struct uart_port *the_port, struct termios *termios, struct termios *old_termios) { - struct ioc4_port *port = get_ioc4_port(the_port); unsigned long port_flags; - spin_lock_irqsave(&port->ip_lock, port_flags); + spin_lock_irqsave(&the_port->lock, port_flags); ioc4_change_speed(the_port, termios, old_termios); - spin_unlock_irqrestore(&port->ip_lock, port_flags); + spin_unlock_irqrestore(&the_port->lock, port_flags); } /** @@ -2615,27 +2613,107 @@ static struct uart_ops ioc4_ops = { * Boot-time initialization code */ -static struct uart_driver ioc4_uart = { +static struct uart_driver ioc4_uart_rs232 = { + .owner = THIS_MODULE, + .driver_name = "ioc4_serial_rs232", + .dev_name = DEVICE_NAME_RS232, + .major = DEVICE_MAJOR, + .minor = DEVICE_MINOR_RS232, + .nr = IOC4_NUM_CARDS * IOC4_NUM_SERIAL_PORTS, +}; + +static struct uart_driver ioc4_uart_rs422 = { .owner = THIS_MODULE, - .driver_name = "ioc4_serial", - .dev_name = DEVICE_NAME, + .driver_name = "ioc4_serial_rs422", + .dev_name = DEVICE_NAME_RS422, .major = DEVICE_MAJOR, - .minor = DEVICE_MINOR, + .minor = DEVICE_MINOR_RS422, .nr = IOC4_NUM_CARDS * IOC4_NUM_SERIAL_PORTS, }; + +/** + * ioc4_serial_remove_one - detach function + * + * @idd: IOC4 master module data for this IOC4 + */ + +static int ioc4_serial_remove_one(struct ioc4_driver_data *idd) +{ + int port_num, port_type; + struct ioc4_control *control; + struct uart_port *the_port; + struct ioc4_port *port; + struct ioc4_soft *soft; + + /* If serial driver did not attach, don't try to detach */ + control = idd->idd_serial_data; + if (!control) + return 0; + + for (port_num = 0; port_num < IOC4_NUM_SERIAL_PORTS; port_num++) { + for (port_type = UART_PORT_MIN; + port_type < UART_PORT_COUNT; + port_type++) { + the_port = &control->ic_port[port_num].icp_uart_port + [port_type]; + if (the_port) { + switch (port_type) { + case UART_PORT_RS422: + uart_remove_one_port(&ioc4_uart_rs422, + the_port); + break; + default: + case UART_PORT_RS232: + uart_remove_one_port(&ioc4_uart_rs232, + the_port); + break; + } + } + } + port = control->ic_port[port_num].icp_port; + /* we allocate in pairs */ + if (!(port_num & 1) && port) { + pci_free_consistent(port->ip_pdev, + TOTAL_RING_BUF_SIZE, + port->ip_cpu_ringbuf, + port->ip_dma_ringbuf); + kfree(port); + } + } + soft = control->ic_soft; + if (soft) { + free_irq(control->ic_irq, soft); + if (soft->is_ioc4_serial_addr) { + release_region((unsigned long) + soft->is_ioc4_serial_addr, + sizeof(struct ioc4_serial)); + } + kfree(soft); + } + kfree(control); + idd->idd_serial_data = NULL; + + return 0; +} + + /** - * ioc4_serial_core_attach - register with serial core + * ioc4_serial_core_attach_rs232 - register with serial core * This is done during pci probing * @pdev: handle for this card */ static inline int -ioc4_serial_core_attach(struct pci_dev *pdev) +ioc4_serial_core_attach(struct pci_dev *pdev, int port_type) { struct ioc4_port *port; struct uart_port *the_port; - struct ioc4_control *control = pci_get_drvdata(pdev); - int ii; + struct ioc4_driver_data *idd = pci_get_drvdata(pdev); + struct ioc4_control *control = idd->idd_serial_data; + int port_num; + int port_type_idx; + struct uart_driver *u_driver; + DPRINT_CONFIG(("%s: attach pdev 0x%p - control 0x%p\n", __FUNCTION__, pdev, (void *)control)); @@ -2643,92 +2721,80 @@ ioc4_serial_core_attach(struct pci_dev *pdev) if (!control) return -ENODEV; + port_type_idx = (port_type == PROTO_RS232) ? UART_PORT_RS232 + : UART_PORT_RS422; + + u_driver = (port_type == PROTO_RS232) ? &ioc4_uart_rs232 + : &ioc4_uart_rs422; + /* once around for each port on this card */ - for (ii = 0; ii < IOC4_NUM_SERIAL_PORTS; ii++) { - the_port = &control->ic_port[ii].icp_uart_port; - port = control->ic_port[ii].icp_port; - port->ip_port = the_port; + for (port_num = 0; port_num < IOC4_NUM_SERIAL_PORTS; port_num++) { + the_port = &control->ic_port[port_num].icp_uart_port + [port_type_idx]; + port = control->ic_port[port_num].icp_port; + port->ip_all_ports[port_type_idx] = the_port; - DPRINT_CONFIG(("%s: attach the_port 0x%p / port 0x%p\n", + DPRINT_CONFIG(("%s: attach the_port 0x%p / port 0x%p : type %s\n", __FUNCTION__, (void *)the_port, - (void *)port)); + (void *)port, + port_type == PROTO_RS232 ? "rs232" : "rs422")); - spin_lock_init(&the_port->lock); /* membase, iobase and mapbase just need to be non-0 */ the_port->membase = (unsigned char __iomem *)1; - the_port->line = the_port->iobase = ii; - the_port->mapbase = 1; + the_port->iobase = (pdev->bus->number << 16) | port_num; + the_port->line = (Num_of_ioc4_cards << 2) | port_num; + the_port->mapbase = port_type; the_port->type = PORT_16550A; - the_port->fifosize = IOC4_MAX_CHARS; + the_port->fifosize = IOC4_FIFO_CHARS; the_port->ops = &ioc4_ops; the_port->irq = control->ic_irq; the_port->dev = &pdev->dev; - if (uart_add_one_port(&ioc4_uart, the_port) < 0) { + spin_lock_init(&the_port->lock); + if (uart_add_one_port(u_driver, the_port) < 0) { printk(KERN_WARNING - "%s: unable to add port %d\n", - __FUNCTION__, the_port->line); + "%s: unable to add port %d bus %d\n", + __FUNCTION__, the_port->line, pdev->bus->number); } else { DPRINT_CONFIG( - ("IOC4 serial driver port %d irq = %d\n", - the_port->line, the_port->irq)); + ("IOC4 serial port %d irq = %d, bus %d\n", + the_port->line, the_port->irq, pdev->bus->number)); } - /* all ports are rs232 for now */ - ioc4_set_proto(port, PROTO_RS232); } return 0; } /** * ioc4_serial_attach_one - register attach function - * called per card found from ioc4_serial_detect as part - * of module_init(). - * @pdev: handle for this card - * @pci_id: pci id for this card + * called per card found from IOC4 master module. + * @idd: Master module data for this IOC4 */ int -ioc4_serial_attach_one(struct pci_dev *pdev, const struct pci_device_id *pci_id) +ioc4_serial_attach_one(struct ioc4_driver_data *idd) { - struct ioc4_mem __iomem *mem; - unsigned long tmp_addr, tmp_addr1; + unsigned long tmp_addr1; struct ioc4_serial __iomem *serial; struct ioc4_soft *soft; struct ioc4_control *control; - int tmp, ret = 0; + int ret = 0; - DPRINT_CONFIG(("%s (0x%p, 0x%p)\n", __FUNCTION__, pdev, pci_id)); + DPRINT_CONFIG(("%s (0x%p, 0x%p)\n", __FUNCTION__, idd->idd_pdev, + idd->idd_pci_id)); - /* Map in the ioc4 memory */ - tmp_addr = pci_resource_start(pdev, 0); - if (!tmp_addr) { - printk(KERN_WARNING - "ioc4 (%p) : unable to get PIO mapping for " - "MEM space\n", (void *)pdev); - return -ENODEV; - } - if (!request_region(tmp_addr, sizeof(struct ioc4_mem), "sioc4_mem")) { - printk(KERN_ALERT - "ioc4 (%p): unable to get request region for " - "MEM space\n", (void *)pdev); - return -ENODEV; - } - mem = ioremap(tmp_addr, sizeof(struct ioc4_mem)); - if (!mem) { - printk(KERN_WARNING - "ioc4 (%p) : unable to remap ioc4 memory\n", - (void *)pdev); - ret = -ENODEV; - goto out1; - } + /* PCI-RT does not bring out serial connections. + * Do not attach to this particular IOC4. + */ + if (idd->idd_variant == IOC4_VARIANT_PCI_RT) + return 0; /* request serial registers */ - tmp_addr1 = pci_resource_start(pdev, 0) + IOC4_SERIAL_OFFSET; + tmp_addr1 = idd->idd_bar0 + IOC4_SERIAL_OFFSET; if (!request_region(tmp_addr1, sizeof(struct ioc4_serial), "sioc4_uart")) { printk(KERN_WARNING "ioc4 (%p): unable to get request region for " - "uart space\n", (void *)pdev); + "uart space\n", (void *)idd->idd_pdev); ret = -ENODEV; goto out1; } @@ -2736,16 +2802,16 @@ ioc4_serial_attach_one(struct pci_dev *pdev, const struct pci_device_id *pci_id) if (!serial) { printk(KERN_WARNING "ioc4 (%p) : unable to remap ioc4 serial register\n", - (void *)pdev); + (void *)idd->idd_pdev); ret = -ENODEV; goto out2; } DPRINT_CONFIG(("%s : mem 0x%p, serial 0x%p\n", - __FUNCTION__, (void *)mem, (void *)serial)); + __FUNCTION__, (void *)idd->idd_misc_regs, + (void *)serial)); /* Get memory for the new card */ - control = kmalloc(sizeof(struct ioc4_control) * IOC4_NUM_SERIAL_PORTS, - GFP_KERNEL); + control = kmalloc(sizeof(struct ioc4_control), GFP_KERNEL); if (!control) { printk(KERN_WARNING "ioc4_attach_one" @@ -2754,64 +2820,68 @@ ioc4_serial_attach_one(struct pci_dev *pdev, const struct pci_device_id *pci_id) goto out2; } memset(control, 0, sizeof(struct ioc4_control)); - pci_set_drvdata(pdev, control); + idd->idd_serial_data = control; /* Allocate the soft structure */ soft = kmalloc(sizeof(struct ioc4_soft), GFP_KERNEL); if (!soft) { printk(KERN_WARNING "ioc4 (%p): unable to get memory for the soft struct\n", - (void *)pdev); + (void *)idd->idd_pdev); ret = -ENOMEM; goto out3; } memset(soft, 0, sizeof(struct ioc4_soft)); spin_lock_init(&soft->is_ir_lock); - soft->is_ioc4_mem_addr = mem; + soft->is_ioc4_misc_addr = idd->idd_misc_regs; soft->is_ioc4_serial_addr = serial; /* Init the IOC4 */ - pci_read_config_dword(pdev, PCI_COMMAND, &tmp); - pci_write_config_dword(pdev, PCI_COMMAND, - tmp | PCI_COMMAND_PARITY | PCI_COMMAND_SERR); - - writel(0xf << IOC4_SIO_CR_CMD_PULSE_SHIFT, &mem->sio_cr); + writel(0xf << IOC4_SIO_CR_CMD_PULSE_SHIFT, + &idd->idd_misc_regs->sio_cr.raw); /* Enable serial port mode select generic PIO pins as outputs */ writel(IOC4_GPCR_UART0_MODESEL | IOC4_GPCR_UART1_MODESEL | IOC4_GPCR_UART2_MODESEL | IOC4_GPCR_UART3_MODESEL, - &mem->gpcr_s); + &idd->idd_misc_regs->gpcr_s.raw); - /* Clear and disable all interrupts */ + /* Clear and disable all serial interrupts */ write_ireg(soft, ~0, IOC4_W_IEC, IOC4_SIO_INTR_TYPE); - writel(~0, &mem->sio_ir); - write_ireg(soft, ~(IOC4_OTHER_IR_ATA_INT | IOC4_OTHER_IR_ATA_MEMERR), - IOC4_W_IEC, IOC4_OTHER_INTR_TYPE); - writel(~(IOC4_OTHER_IR_ATA_MEMERR | IOC4_OTHER_IR_ATA_MEMERR), - &mem->other_ir); + writel(~0, &idd->idd_misc_regs->sio_ir.raw); + write_ireg(soft, IOC4_OTHER_IR_SER_MEMERR, IOC4_W_IEC, + IOC4_OTHER_INTR_TYPE); + writel(IOC4_OTHER_IR_SER_MEMERR, &idd->idd_misc_regs->other_ir.raw); control->ic_soft = soft; - if (!request_irq(pdev->irq, ioc4_intr, SA_SHIRQ, - "sgi-ioc4serial", (void *)soft)) { - control->ic_irq = pdev->irq; + + /* Hook up interrupt handler */ + if (!request_irq(idd->idd_pdev->irq, ioc4_intr, IRQF_SHARED, + "sgi-ioc4serial", soft)) { + control->ic_irq = idd->idd_pdev->irq; } else { printk(KERN_WARNING "%s : request_irq fails for IRQ 0x%x\n ", - __FUNCTION__, pdev->irq); + __FUNCTION__, idd->idd_pdev->irq); } - if ((ret = ioc4_attach_local(pdev, control, soft, - soft->is_ioc4_mem_addr, - soft->is_ioc4_serial_addr))) + ret = ioc4_attach_local(idd); + if (ret) goto out4; - /* register port with the serial core */ + /* register port with the serial core - 1 rs232, 1 rs422 */ - if ((ret = ioc4_serial_core_attach(pdev))) + if ((ret = ioc4_serial_core_attach(idd->idd_pdev, PROTO_RS232))) goto out4; + if ((ret = ioc4_serial_core_attach(idd->idd_pdev, PROTO_RS422))) + goto out5; + + Num_of_ioc4_cards++; + return ret; /* error exits that give back resources */ +out5: + ioc4_serial_remove_one(idd); out4: kfree(soft); out3: @@ -2819,58 +2889,17 @@ out3: out2: release_region(tmp_addr1, sizeof(struct ioc4_serial)); out1: - release_region(tmp_addr, sizeof(struct ioc4_mem)); return ret; } -/** - * ioc4_serial_remove_one - detach function - * - * @pdev: handle for this card - */ - -#if 0 -void ioc4_serial_remove_one(struct pci_dev *pdev) -{ - int ii; - struct ioc4_control *control; - struct uart_port *the_port; - struct ioc4_port *port; - struct ioc4_soft *soft; - - control = pci_get_drvdata(pdev); - - for (ii = 0; ii < IOC4_NUM_SERIAL_PORTS; ii++) { - the_port = &control->ic_port[ii].icp_uart_port; - if (the_port) { - uart_remove_one_port(&ioc4_uart, the_port); - } - port = control->ic_port[ii].icp_port; - if (!(ii & 1) && port) { - pci_free_consistent(port->ip_pdev, - TOTAL_RING_BUF_SIZE, - (void *)port->ip_cpu_ringbuf, - port->ip_dma_ringbuf); - kfree(port); - } - } - soft = control->ic_soft; - if (soft) { - free_irq(control->ic_irq, (void *)soft); - if (soft->is_ioc4_serial_addr) { - release_region((unsigned long) - soft->is_ioc4_serial_addr, - sizeof(struct ioc4_serial)); - } - kfree(soft); - } - kfree(control); - pci_set_drvdata(pdev, NULL); - uart_unregister_driver(&ioc4_uart); -} -#endif +static struct ioc4_submodule ioc4_serial_submodule = { + .is_name = "IOC4_serial", + .is_owner = THIS_MODULE, + .is_probe = ioc4_serial_attach_one, + .is_remove = ioc4_serial_remove_one, +}; /** * ioc4_serial_init - module init @@ -2880,18 +2909,33 @@ int ioc4_serial_init(void) int ret; /* register with serial core */ - if ((ret = uart_register_driver(&ioc4_uart)) < 0) { + if ((ret = uart_register_driver(&ioc4_uart_rs232)) < 0) { printk(KERN_WARNING - "%s: Couldn't register IOC4 serial driver\n", + "%s: Couldn't register rs232 IOC4 serial driver\n", __FUNCTION__); return ret; } - return 0; + if ((ret = uart_register_driver(&ioc4_uart_rs422)) < 0) { + printk(KERN_WARNING + "%s: Couldn't register rs422 IOC4 serial driver\n", + __FUNCTION__); + return ret; + } + + /* register with IOC4 main module */ + return ioc4_register_submodule(&ioc4_serial_submodule); } +static void __devexit ioc4_serial_exit(void) +{ + ioc4_unregister_submodule(&ioc4_serial_submodule); + uart_unregister_driver(&ioc4_uart_rs232); + uart_unregister_driver(&ioc4_uart_rs422); +} + +module_init(ioc4_serial_init); +module_exit(ioc4_serial_exit); + MODULE_AUTHOR("Pat Gefre - Silicon Graphics Inc. (SGI) "); MODULE_DESCRIPTION("Serial PCI driver module for SGI IOC4 Base-IO Card"); MODULE_LICENSE("GPL"); - -EXPORT_SYMBOL(ioc4_serial_init); -EXPORT_SYMBOL(ioc4_serial_attach_one); diff --git a/drivers/serial/ip22zilog.c b/drivers/serial/ip22zilog.c index 651772474..5ff269fb6 100644 --- a/drivers/serial/ip22zilog.c +++ b/drivers/serial/ip22zilog.c @@ -12,7 +12,6 @@ * Copyright (C) 2002 Ralf Baechle (ralf@linux-mips.org) * Copyright (C) 2002 David S. Miller (davem@redhat.com) */ -#include #include #include #include @@ -1085,7 +1084,6 @@ static struct console ip22zilog_console = { static struct uart_driver ip22zilog_reg = { .owner = THIS_MODULE, .driver_name = "serial", - .devfs_name = "tts/", .dev_name = "ttyS", .major = TTY_MAJOR, .minor = 64, @@ -1145,9 +1143,8 @@ static void __init ip22zilog_prepare(void) up[(chip * 2) + 1].port.fifosize = 1; up[(chip * 2) + 1].port.ops = &ip22zilog_pops; up[(chip * 2) + 1].port.type = PORT_IP22ZILOG; - up[(chip * 2) + 1].port.flags |= IP22ZILOG_FLAG_IS_CHANNEL_A; up[(chip * 2) + 1].port.line = (chip * 2) + 1; - up[(chip * 2) + 1].flags = 0; + up[(chip * 2) + 1].flags |= IP22ZILOG_FLAG_IS_CHANNEL_A; } } diff --git a/drivers/serial/jsm/jsm_driver.c b/drivers/serial/jsm/jsm_driver.c index cc5d21300..244f63be3 100644 --- a/drivers/serial/jsm/jsm_driver.c +++ b/drivers/serial/jsm/jsm_driver.c @@ -20,7 +20,8 @@ * * Contact Information: * Scott H Kilau - * Wendy Xiong + * Wendy Xiong + * * ***********************************************************************/ #include @@ -42,17 +43,14 @@ struct uart_driver jsm_uart_driver = { .owner = THIS_MODULE, .driver_name = JSM_DRIVER_NAME, .dev_name = "ttyn", - .major = 253, + .major = 0, .minor = JSM_MINOR_START, .nr = NR_PORTS, }; int jsm_debug; -int jsm_rawreadok; module_param(jsm_debug, int, 0); -module_param(jsm_rawreadok, int, 0); MODULE_PARM_DESC(jsm_debug, "Driver debugging level"); -MODULE_PARM_DESC(jsm_rawreadok, "Bypass flip buffers on input"); static int jsm_probe_one(struct pci_dev *pdev, const struct pci_device_id *ent) { @@ -123,7 +121,7 @@ static int jsm_probe_one(struct pci_dev *pdev, const struct pci_device_id *ent) } rc = request_irq(brd->irq, brd->bd_ops->intr, - SA_INTERRUPT|SA_SHIRQ, "JSM", brd); + IRQF_DISABLED|IRQF_SHARED, "JSM", brd); if (rc) { printk(KERN_WARNING "Failed to hook IRQ %d\n",brd->irq); goto out_iounmap; diff --git a/drivers/serial/jsm/jsm_tty.c b/drivers/serial/jsm/jsm_tty.c index 98de2258f..f8262e6ad 100644 --- a/drivers/serial/jsm/jsm_tty.c +++ b/drivers/serial/jsm/jsm_tty.c @@ -20,8 +20,10 @@ * * Contact Information: * Scott H Kilau - * Wendy Xiong - * + * Ananda Venkatarman + * Modifications: + * 01/19/06: changed jsm_input routine to use the dynamically allocated + * tty_buffer changes. Contributors: Scott Kilau and Ananda V. ***********************************************************************/ #include #include @@ -113,7 +115,7 @@ static void jsm_tty_set_mctrl(struct uart_port *port, unsigned int mctrl) udelay(10); } -static void jsm_tty_start_tx(struct uart_port *port, unsigned int tty_start) +static void jsm_tty_start_tx(struct uart_port *port) { struct jsm_channel *channel = (struct jsm_channel *)port; @@ -125,7 +127,7 @@ static void jsm_tty_start_tx(struct uart_port *port, unsigned int tty_start) jsm_printk(IOCTL, INFO, &channel->ch_bd->pci_dev, "finish\n"); } -static void jsm_tty_stop_tx(struct uart_port *port, unsigned int tty_stop) +static void jsm_tty_stop_tx(struct uart_port *port) { struct jsm_channel *channel = (struct jsm_channel *)port; @@ -140,12 +142,14 @@ static void jsm_tty_send_xchar(struct uart_port *port, char ch) { unsigned long lock_flags; struct jsm_channel *channel = (struct jsm_channel *)port; + struct termios *termios; spin_lock_irqsave(&port->lock, lock_flags); - if (ch == port->info->tty->termios->c_cc[VSTART]) + termios = port->info->tty->termios; + if (ch == termios->c_cc[VSTART]) channel->ch_bd->bd_ops->send_start_character(channel); - if (ch == port->info->tty->termios->c_cc[VSTOP]) + if (ch == termios->c_cc[VSTOP]) channel->ch_bd->bd_ops->send_stop_character(channel); spin_unlock_irqrestore(&port->lock, lock_flags); } @@ -176,6 +180,7 @@ static int jsm_tty_open(struct uart_port *port) struct jsm_board *brd; int rc = 0; struct jsm_channel *channel = (struct jsm_channel *)port; + struct termios *termios; /* Get board pointer from our array of majors we have allocated */ brd = channel->ch_bd; @@ -237,12 +242,13 @@ static int jsm_tty_open(struct uart_port *port) channel->ch_cached_lsr = 0; channel->ch_stops_sent = 0; - channel->ch_c_cflag = port->info->tty->termios->c_cflag; - channel->ch_c_iflag = port->info->tty->termios->c_iflag; - channel->ch_c_oflag = port->info->tty->termios->c_oflag; - channel->ch_c_lflag = port->info->tty->termios->c_lflag; - channel->ch_startc = port->info->tty->termios->c_cc[VSTART]; - channel->ch_stopc = port->info->tty->termios->c_cc[VSTOP]; + termios = port->info->tty->termios; + channel->ch_c_cflag = termios->c_cflag; + channel->ch_c_iflag = termios->c_iflag; + channel->ch_c_oflag = termios->c_oflag; + channel->ch_c_lflag = termios->c_lflag; + channel->ch_startc = termios->c_cc[VSTART]; + channel->ch_stopc = termios->c_cc[VSTOP]; /* Tell UART to init itself */ brd->bd_ops->uart_init(channel); @@ -497,16 +503,15 @@ void jsm_input(struct jsm_channel *ch) { struct jsm_board *bd; struct tty_struct *tp; + struct tty_ldisc *ld; u32 rmask; u16 head; u16 tail; int data_len; unsigned long lock_flags; - int flip_len; + int flip_len = 0; int len = 0; int n = 0; - char *buf = NULL; - char *buf2 = NULL; int s = 0; int i = 0; @@ -574,56 +579,43 @@ void jsm_input(struct jsm_channel *ch) /* * If the rxbuf is empty and we are not throttled, put as much - * as we can directly into the linux TTY flip buffer. - * The jsm_rawreadok case takes advantage of carnal knowledge that - * the char_buf and the flag_buf are next to each other and - * are each of (2 * TTY_FLIPBUF_SIZE) size. + * as we can directly into the linux TTY buffer. * - * NOTE: if(!tty->real_raw), the call to ldisc.receive_buf - *actually still uses the flag buffer, so you can't - *use it for input data */ - if (jsm_rawreadok) { - if (tp->real_raw) - flip_len = MYFLIPLEN; - else - flip_len = 2 * TTY_FLIPBUF_SIZE; - } else - flip_len = TTY_FLIPBUF_SIZE - tp->flip.count; + flip_len = TTY_FLIPBUF_SIZE; len = min(data_len, flip_len); len = min(len, (N_TTY_BUF_SIZE - 1) - tp->read_cnt); + ld = tty_ldisc_ref(tp); + + /* + * If we were unable to get a reference to the ld, + * don't flush our buffer, and act like the ld doesn't + * have any space to put the data right now. + */ + if (!ld) { + len = 0; + } else { + /* + * If ld doesn't have a pointer to a receive_buf function, + * flush the data, then act like the ld doesn't have any + * space to put the data right now. + */ + if (!ld->receive_buf) { + ch->ch_r_head = ch->ch_r_tail; + len = 0; + } + } if (len <= 0) { spin_unlock_irqrestore(&ch->ch_lock, lock_flags); jsm_printk(READ, INFO, &ch->ch_bd->pci_dev, "jsm_input 1\n"); + if (ld) + tty_ldisc_deref(ld); return; } - /* - * If we're bypassing flip buffers on rx, we can blast it - * right into the beginning of the buffer. - */ - if (jsm_rawreadok) { - if (tp->real_raw) { - if (ch->ch_flags & CH_FLIPBUF_IN_USE) { - jsm_printk(READ, INFO, &ch->ch_bd->pci_dev, - "JSM - FLIPBUF in use. delaying input\n"); - spin_unlock_irqrestore(&ch->ch_lock, lock_flags); - return; - } - ch->ch_flags |= CH_FLIPBUF_IN_USE; - buf = ch->ch_bd->flipbuf; - buf2 = NULL; - } else { - buf = tp->flip.char_buf; - buf2 = tp->flip.flag_buf; - } - } else { - buf = tp->flip.char_buf_ptr; - buf2 = tp->flip.flag_buf_ptr; - } - + len = tty_buffer_request_room(tp, len); n = len; /* @@ -638,121 +630,47 @@ void jsm_input(struct jsm_channel *ch) if (s <= 0) break; - memcpy(buf, ch->ch_rqueue + tail, s); - - /* buf2 is only set when port isn't raw */ - if (buf2) - memcpy(buf2, ch->ch_equeue + tail, s); - - tail += s; - buf += s; - if (buf2) - buf2 += s; - n -= s; - /* Flip queue if needed */ - tail &= rmask; - } + /* + * If conditions are such that ld needs to see all + * UART errors, we will have to walk each character + * and error byte and send them to the buffer one at + * a time. + */ - /* - * In high performance mode, we don't have to update - * flag_buf or any of the counts or pointers into flip buf. - */ - if (!jsm_rawreadok) { if (I_PARMRK(tp) || I_BRKINT(tp) || I_INPCK(tp)) { - for (i = 0; i < len; i++) { + for (i = 0; i < s; i++) { /* * Give the Linux ld the flags in the * format it likes. */ - if (tp->flip.flag_buf_ptr[i] & UART_LSR_BI) - tp->flip.flag_buf_ptr[i] = TTY_BREAK; - else if (tp->flip.flag_buf_ptr[i] & UART_LSR_PE) - tp->flip.flag_buf_ptr[i] = TTY_PARITY; - else if (tp->flip.flag_buf_ptr[i] & UART_LSR_FE) - tp->flip.flag_buf_ptr[i] = TTY_FRAME; + if (*(ch->ch_equeue +tail +i) & UART_LSR_BI) + tty_insert_flip_char(tp, *(ch->ch_rqueue +tail +i), TTY_BREAK); + else if (*(ch->ch_equeue +tail +i) & UART_LSR_PE) + tty_insert_flip_char(tp, *(ch->ch_rqueue +tail +i), TTY_PARITY); + else if (*(ch->ch_equeue +tail +i) & UART_LSR_FE) + tty_insert_flip_char(tp, *(ch->ch_rqueue +tail +i), TTY_FRAME); else - tp->flip.flag_buf_ptr[i] = TTY_NORMAL; + tty_insert_flip_char(tp, *(ch->ch_rqueue +tail +i), TTY_NORMAL); } } else { - memset(tp->flip.flag_buf_ptr, 0, len); + tty_insert_flip_string(tp, ch->ch_rqueue + tail, s) ; } - - tp->flip.char_buf_ptr += len; - tp->flip.flag_buf_ptr += len; - tp->flip.count += len; - } - else if (!tp->real_raw) { - if (I_PARMRK(tp) || I_BRKINT(tp) || I_INPCK(tp)) { - for (i = 0; i < len; i++) { - /* - * Give the Linux ld the flags in the - * format it likes. - */ - if (tp->flip.flag_buf_ptr[i] & UART_LSR_BI) - tp->flip.flag_buf_ptr[i] = TTY_BREAK; - else if (tp->flip.flag_buf_ptr[i] & UART_LSR_PE) - tp->flip.flag_buf_ptr[i] = TTY_PARITY; - else if (tp->flip.flag_buf_ptr[i] & UART_LSR_FE) - tp->flip.flag_buf_ptr[i] = TTY_FRAME; - else - tp->flip.flag_buf_ptr[i] = TTY_NORMAL; - } - } else - memset(tp->flip.flag_buf, 0, len); + tail += s; + n -= s; + /* Flip queue if needed */ + tail &= rmask; } - /* - * If we're doing raw reads, jam it right into the - * line disc bypassing the flip buffers. - */ - if (jsm_rawreadok) { - if (tp->real_raw) { - ch->ch_r_tail = tail & rmask; - ch->ch_e_tail = tail & rmask; - - jsm_check_queue_flow_control(ch); + ch->ch_r_tail = tail & rmask; + ch->ch_e_tail = tail & rmask; + jsm_check_queue_flow_control(ch); + spin_unlock_irqrestore(&ch->ch_lock, lock_flags); - /* !!! WE *MUST* LET GO OF ALL LOCKS BEFORE CALLING RECEIVE BUF !!! */ + /* Tell the tty layer its okay to "eat" the data now */ + tty_flip_buffer_push(tp); - spin_unlock_irqrestore(&ch->ch_lock, lock_flags); - - jsm_printk(READ, INFO, &ch->ch_bd->pci_dev, - "jsm_input. %d real_raw len:%d calling receive_buf for board %d\n", - __LINE__, len, ch->ch_bd->boardnum); - tp->ldisc.receive_buf(tp, ch->ch_bd->flipbuf, NULL, len); - - /* Allow use of channel flip buffer again */ - spin_lock_irqsave(&ch->ch_lock, lock_flags); - ch->ch_flags &= ~CH_FLIPBUF_IN_USE; - spin_unlock_irqrestore(&ch->ch_lock, lock_flags); - - } else { - ch->ch_r_tail = tail & rmask; - ch->ch_e_tail = tail & rmask; - - jsm_check_queue_flow_control(ch); - - /* !!! WE *MUST* LET GO OF ALL LOCKS BEFORE CALLING RECEIVE BUF !!! */ - spin_unlock_irqrestore(&ch->ch_lock, lock_flags); - - jsm_printk(READ, INFO, &ch->ch_bd->pci_dev, - "jsm_input. %d not real_raw len:%d calling receive_buf for board %d\n", - __LINE__, len, ch->ch_bd->boardnum); - - tp->ldisc.receive_buf(tp, tp->flip.char_buf, tp->flip.flag_buf, len); - } - } else { - ch->ch_r_tail = tail & rmask; - ch->ch_e_tail = tail & rmask; - - jsm_check_queue_flow_control(ch); - - spin_unlock_irqrestore(&ch->ch_lock, lock_flags); - - jsm_printk(READ, INFO, &ch->ch_bd->pci_dev, - "jsm_input. %d not jsm_read raw okay scheduling flip\n", __LINE__); - tty_schedule_flip(tp); - } + if (ld) + tty_ldisc_deref(ld); jsm_printk(IOCTL, INFO, &ch->ch_bd->pci_dev, "finish\n"); } @@ -863,6 +781,7 @@ static void jsm_carrier(struct jsm_channel *ch) void jsm_check_queue_flow_control(struct jsm_channel *ch) { + struct board_ops *bd_ops = ch->ch_bd->bd_ops; int qleft = 0; /* Store how much space we have left in the queue */ @@ -888,7 +807,7 @@ void jsm_check_queue_flow_control(struct jsm_channel *ch) /* HWFLOW */ if (ch->ch_c_cflag & CRTSCTS) { if(!(ch->ch_flags & CH_RECEIVER_OFF)) { - ch->ch_bd->bd_ops->disable_receiver(ch); + bd_ops->disable_receiver(ch); ch->ch_flags |= (CH_RECEIVER_OFF); jsm_printk(READ, INFO, &ch->ch_bd->pci_dev, "Internal queue hit hilevel mark (%d)! Turning off interrupts.\n", @@ -898,7 +817,7 @@ void jsm_check_queue_flow_control(struct jsm_channel *ch) /* SWFLOW */ else if (ch->ch_c_iflag & IXOFF) { if (ch->ch_stops_sent <= MAX_STOPS_SENT) { - ch->ch_bd->bd_ops->send_stop_character(ch); + bd_ops->send_stop_character(ch); ch->ch_stops_sent++; jsm_printk(READ, INFO, &ch->ch_bd->pci_dev, "Sending stop char! Times sent: %x\n", ch->ch_stops_sent); @@ -925,7 +844,7 @@ void jsm_check_queue_flow_control(struct jsm_channel *ch) /* HWFLOW */ if (ch->ch_c_cflag & CRTSCTS) { if (ch->ch_flags & CH_RECEIVER_OFF) { - ch->ch_bd->bd_ops->enable_receiver(ch); + bd_ops->enable_receiver(ch); ch->ch_flags &= ~(CH_RECEIVER_OFF); jsm_printk(READ, INFO, &ch->ch_bd->pci_dev, "Internal queue hit lowlevel mark (%d)! Turning on interrupts.\n", @@ -935,7 +854,7 @@ void jsm_check_queue_flow_control(struct jsm_channel *ch) /* SWFLOW */ else if (ch->ch_c_iflag & IXOFF && ch->ch_stops_sent) { ch->ch_stops_sent = 0; - ch->ch_bd->bd_ops->send_start_character(ch); + bd_ops->send_start_character(ch); jsm_printk(READ, INFO, &ch->ch_bd->pci_dev, "Sending start char!\n"); } } diff --git a/drivers/serial/m32r_sio.c b/drivers/serial/m32r_sio.c index 321a40f33..e7fe4bb46 100644 --- a/drivers/serial/m32r_sio.c +++ b/drivers/serial/m32r_sio.c @@ -25,7 +25,6 @@ * membase is an 'ioremapped' cookie. This is compatible with the old * serial.c driver, and is currently the preferred form. */ -#include #if defined(CONFIG_SERIAL_M32R_SIO_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #define SUPPORT_SYSRQ @@ -543,7 +542,7 @@ static void serial_do_unlink(struct irq_info *i, struct uart_sio_port *up) static int serial_link_irq_chain(struct uart_sio_port *up) { struct irq_info *i = irq_lists + up->port.irq; - int ret, irq_flags = up->port.flags & UPF_SHARE_IRQ ? SA_SHIRQ : 0; + int ret, irq_flags = up->port.flags & UPF_SHARE_IRQ ? IRQF_SHARED : 0; spin_lock_irq(&i->lock); @@ -1131,7 +1130,6 @@ console_initcall(m32r_sio_console_init); static struct uart_driver m32r_sio_reg = { .owner = THIS_MODULE, .driver_name = "sio", - .devfs_name = "tts/", .dev_name = "ttyS", .major = TTY_MAJOR, .minor = 64, diff --git a/drivers/serial/m32r_sio.h b/drivers/serial/m32r_sio.h index 7c3ec24f7..849f1b2c2 100644 --- a/drivers/serial/m32r_sio.h +++ b/drivers/serial/m32r_sio.h @@ -15,7 +15,6 @@ * (at your option) any later version. */ -#include struct m32r_sio_probe { struct module *owner; diff --git a/drivers/serial/m32r_sio_reg.h b/drivers/serial/m32r_sio_reg.h index 9c8645294..467147379 100644 --- a/drivers/serial/m32r_sio_reg.h +++ b/drivers/serial/m32r_sio_reg.h @@ -15,7 +15,6 @@ #ifndef _M32R_SIO_REG_H #define _M32R_SIO_REG_H -#include #ifdef CONFIG_SERIAL_M32R_PLDSIO diff --git a/drivers/serial/mcfserial.c b/drivers/serial/mcfserial.c index 8cbbb954d..832abd3c4 100644 --- a/drivers/serial/mcfserial.c +++ b/drivers/serial/mcfserial.c @@ -60,11 +60,11 @@ struct timer_list mcfrs_timer_struct; #if defined(CONFIG_HW_FEITH) #define CONSOLE_BAUD_RATE 38400 #define DEFAULT_CBAUD B38400 -#elif defined(CONFIG_MOD5272) || defined(CONFIG_M5208EVB) +#elif defined(CONFIG_MOD5272) || defined(CONFIG_M5208EVB) || defined(CONFIG_M5329EVB) #define CONSOLE_BAUD_RATE 115200 #define DEFAULT_CBAUD B115200 #elif defined(CONFIG_ARNEWSH) || defined(CONFIG_FREESCALE) || \ - defined(CONFIG_senTec) || defined(CONFIG_SNEHA) + defined(CONFIG_senTec) || defined(CONFIG_SNEHA) || defined(CONFIG_AVNET) #define CONSOLE_BAUD_RATE 19200 #define DEFAULT_CBAUD B19200 #endif @@ -93,7 +93,7 @@ static struct tty_driver *mcfrs_serial_driver; #undef SERIAL_DEBUG_FLOW #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \ - defined(CONFIG_M520x) + defined(CONFIG_M520x) || defined(CONFIG_M532x) #define IRQBASE (MCFINT_VECBASE+MCFINT_UART0) #else #define IRQBASE 73 @@ -1545,6 +1545,28 @@ static void mcfrs_irqinit(struct mcf_serial *info) *feci2c_par |= MCF_GPIO_PAR_FECI2C_PAR_SCL_UTXD2 | MCF_GPIO_PAR_FECI2C_PAR_SDA_URXD2; } +#elif defined(CONFIG_M532x) + volatile unsigned char *uartp; + uartp = info->addr; + switch (info->line) { + case 0: + MCF_INTC0_ICR26 = 0x3; + MCF_INTC0_CIMR = 26; + /* GPIO initialization */ + MCF_GPIO_PAR_UART |= 0x000F; + break; + case 1: + MCF_INTC0_ICR27 = 0x3; + MCF_INTC0_CIMR = 27; + /* GPIO initialization */ + MCF_GPIO_PAR_UART |= 0x0FF0; + break; + case 2: + MCF_INTC0_ICR28 = 0x3; + MCF_INTC0_CIMR = 28; + /* GPIOs also must be initalized, depends on board */ + break; + } #else volatile unsigned char *icrp, *uartp; @@ -1574,7 +1596,7 @@ static void mcfrs_irqinit(struct mcf_serial *info) /* Clear mask, so no surprise interrupts. */ uartp[MCFUART_UIMR] = 0; - if (request_irq(info->irq, mcfrs_interrupt, SA_INTERRUPT, + if (request_irq(info->irq, mcfrs_interrupt, IRQF_DISABLED, "ColdFire UART", NULL)) { printk("MCFRS: Unable to attach ColdFire UART %d interrupt " "vector=%d\n", info->line, info->irq); @@ -1691,7 +1713,6 @@ mcfrs_init(void) /* Initialize the tty_driver structure */ mcfrs_serial_driver->owner = THIS_MODULE; mcfrs_serial_driver->name = "ttyS"; - mcfrs_serial_driver->devfs_name = "ttys/"; mcfrs_serial_driver->driver_name = "serial"; mcfrs_serial_driver->major = TTY_MAJOR; mcfrs_serial_driver->minor_start = 64; diff --git a/drivers/serial/mcfserial.h b/drivers/serial/mcfserial.h index a2b28e862..56420e2cb 100644 --- a/drivers/serial/mcfserial.h +++ b/drivers/serial/mcfserial.h @@ -14,7 +14,6 @@ #ifndef _MCF_SERIAL_H #define _MCF_SERIAL_H -#include #include #ifdef __KERNEL__ diff --git a/drivers/serial/mpc52xx_uart.c b/drivers/serial/mpc52xx_uart.c index 2a5cf174c..7708e5dd3 100644 --- a/drivers/serial/mpc52xx_uart.c +++ b/drivers/serial/mpc52xx_uart.c @@ -37,15 +37,14 @@ * by the bootloader or in the platform init code. * * The idx field must be equal to the PSC index ( e.g. 0 for PSC1, 1 for PSC2, - * and so on). So the PSC1 is mapped to /dev/ttyS0, PSC2 to /dev/ttyS1 and so - * on. But be warned, it's an ABSOLUTE REQUIREMENT ! This is needed mainly for - * the console code : without this 1:1 mapping, at early boot time, when we are - * parsing the kernel args console=ttyS?, we wouldn't know wich PSC it will be - * mapped to. + * and so on). So the PSC1 is mapped to /dev/ttyPSC0, PSC2 to /dev/ttyPSC1 and + * so on. But be warned, it's an ABSOLUTE REQUIREMENT ! This is needed mainly + * fpr the console code : without this 1:1 mapping, at early boot time, when we + * are parsing the kernel args console=ttyPSC?, we wouldn't know which PSC it + * will be mapped to. */ -#include -#include +#include #include #include #include @@ -65,6 +64,10 @@ #include +/* We've been assigned a range on the "Low-density serial ports" major */ +#define SERIAL_PSC_MAJOR 204 +#define SERIAL_PSC_MINOR 148 + #define ISR_PASS_LIMIT 256 /* Max number of iteration in the interrupt */ @@ -119,7 +122,7 @@ mpc52xx_uart_get_mctrl(struct uart_port *port) } static void -mpc52xx_uart_stop_tx(struct uart_port *port, unsigned int tty_stop) +mpc52xx_uart_stop_tx(struct uart_port *port) { /* port->lock taken by caller */ port->read_status_mask &= ~MPC52xx_PSC_IMR_TXRDY; @@ -127,7 +130,7 @@ mpc52xx_uart_stop_tx(struct uart_port *port, unsigned int tty_stop) } static void -mpc52xx_uart_start_tx(struct uart_port *port, unsigned int tty_start) +mpc52xx_uart_start_tx(struct uart_port *port) { /* port->lock taken by caller */ port->read_status_mask |= MPC52xx_PSC_IMR_TXRDY; @@ -187,7 +190,7 @@ mpc52xx_uart_startup(struct uart_port *port) /* Request IRQ */ ret = request_irq(port->irq, mpc52xx_uart_int, - SA_INTERRUPT | SA_SAMPLE_RANDOM, "mpc52xx_psc_uart", port); + IRQF_DISABLED | IRQF_SAMPLE_RANDOM, "mpc52xx_psc_uart", port); if (ret) return ret; @@ -401,17 +404,13 @@ static inline int mpc52xx_uart_int_rx_chars(struct uart_port *port, struct pt_regs *regs) { struct tty_struct *tty = port->info->tty; - unsigned char ch; + unsigned char ch, flag; unsigned short status; /* While we can read, do so ! */ while ( (status = in_be16(&PSC(port)->mpc52xx_psc_status)) & MPC52xx_PSC_SR_RXRDY) { - /* If we are full, just stop reading */ - if (tty->flip.count >= TTY_FLIPBUF_SIZE) - break; - /* Get the char */ ch = in_8(&PSC(port)->mpc52xx_psc_buffer_8); @@ -424,45 +423,35 @@ mpc52xx_uart_int_rx_chars(struct uart_port *port, struct pt_regs *regs) #endif /* Store it */ - *tty->flip.char_buf_ptr = ch; - *tty->flip.flag_buf_ptr = 0; + + flag = TTY_NORMAL; port->icount.rx++; if ( status & (MPC52xx_PSC_SR_PE | MPC52xx_PSC_SR_FE | - MPC52xx_PSC_SR_RB | - MPC52xx_PSC_SR_OE) ) { + MPC52xx_PSC_SR_RB) ) { if (status & MPC52xx_PSC_SR_RB) { - *tty->flip.flag_buf_ptr = TTY_BREAK; + flag = TTY_BREAK; uart_handle_break(port); } else if (status & MPC52xx_PSC_SR_PE) - *tty->flip.flag_buf_ptr = TTY_PARITY; + flag = TTY_PARITY; else if (status & MPC52xx_PSC_SR_FE) - *tty->flip.flag_buf_ptr = TTY_FRAME; - if (status & MPC52xx_PSC_SR_OE) { - /* - * Overrun is special, since it's - * reported immediately, and doesn't - * affect the current character - */ - if (tty->flip.count < (TTY_FLIPBUF_SIZE-1)) { - tty->flip.flag_buf_ptr++; - tty->flip.char_buf_ptr++; - tty->flip.count++; - } - *tty->flip.flag_buf_ptr = TTY_OVERRUN; - } + flag = TTY_FRAME; /* Clear error condition */ out_8(&PSC(port)->command,MPC52xx_PSC_RST_ERR_STAT); } - - tty->flip.char_buf_ptr++; - tty->flip.flag_buf_ptr++; - tty->flip.count++; - + tty_insert_flip_char(tty, ch, flag); + if (status & MPC52xx_PSC_SR_OE) { + /* + * Overrun is special, since it's + * reported immediately, and doesn't + * affect the current character + */ + tty_insert_flip_char(tty, 0, TTY_OVERRUN); + } } tty_flip_buffer_push(tty); @@ -485,7 +474,7 @@ mpc52xx_uart_int_tx_chars(struct uart_port *port) /* Nothing to do ? */ if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { - mpc52xx_uart_stop_tx(port,0); + mpc52xx_uart_stop_tx(port); return 0; } @@ -504,7 +493,7 @@ mpc52xx_uart_int_tx_chars(struct uart_port *port) /* Maybe we're done after all */ if (uart_circ_empty(xmit)) { - mpc52xx_uart_stop_tx(port,0); + mpc52xx_uart_stop_tx(port); return 0; } @@ -613,15 +602,14 @@ mpc52xx_console_write(struct console *co, const char *s, unsigned int count) udelay(1); /* Write all the chars */ - for ( i=0 ; impc52xx_psc_buffer_8, *s); - + for (i = 0; i < count; i++, s++) { /* Line return handling */ - if ( *s++ == '\n' ) + if (*s == '\n') out_8(&psc->mpc52xx_psc_buffer_8, '\r'); + /* Send the char */ + out_8(&psc->mpc52xx_psc_buffer_8, *s); + /* Wait the TX buffer to be empty */ j = 20000; /* Maximum wait */ while (!(in_be16(&psc->mpc52xx_psc_status) & @@ -668,15 +656,15 @@ mpc52xx_console_setup(struct console *co, char *options) } -extern struct uart_driver mpc52xx_uart_driver; +static struct uart_driver mpc52xx_uart_driver; static struct console mpc52xx_console = { - .name = "ttyS", + .name = "ttyPSC", .write = mpc52xx_console_write, .device = uart_console_device, .setup = mpc52xx_console_setup, .flags = CON_PRINTBUFFER, - .index = -1, /* Specified on the cmdline (e.g. console=ttyS0 ) */ + .index = -1, /* Specified on the cmdline (e.g. console=ttyPSC0 ) */ .data = &mpc52xx_uart_driver, }; @@ -703,10 +691,9 @@ console_initcall(mpc52xx_console_init); static struct uart_driver mpc52xx_uart_driver = { .owner = THIS_MODULE, .driver_name = "mpc52xx_psc_uart", - .dev_name = "ttyS", - .devfs_name = "ttyS", - .major = TTY_MAJOR, - .minor = 64, + .dev_name = "ttyPSC", + .major = SERIAL_PSC_MAJOR, + .minor = SERIAL_PSC_MINOR, .nr = MPC52xx_PSC_MAXNUM, .cons = MPC52xx_PSC_CONSOLE, }; @@ -717,16 +704,15 @@ static struct uart_driver mpc52xx_uart_driver = { /* ======================================================================== */ static int __devinit -mpc52xx_uart_probe(struct device *dev) +mpc52xx_uart_probe(struct platform_device *dev) { - struct platform_device *pdev = to_platform_device(dev); - struct resource *res = pdev->resource; + struct resource *res = dev->resource; struct uart_port *port = NULL; int i, idx, ret; /* Check validity & presence */ - idx = pdev->id; + idx = dev->id; if (idx < 0 || idx >= MPC52xx_PSC_MAXNUM) return -EINVAL; @@ -740,8 +726,7 @@ mpc52xx_uart_probe(struct device *dev) spin_lock_init(&port->lock); port->uartclk = __res.bi_ipbfreq / 2; /* Look at CTLR doc */ - port->fifosize = 255; /* Should be 512 ! But it can't be */ - /* stored in a unsigned char */ + port->fifosize = 512; port->iotype = UPIO_MEM; port->flags = UPF_BOOT_AUTOCONF | ( uart_console(port) ? 0 : UPF_IOREMAP ); @@ -749,7 +734,7 @@ mpc52xx_uart_probe(struct device *dev) port->ops = &mpc52xx_uart_ops; /* Search for IRQ and mapbase */ - for (i=0 ; inum_resources ; i++, res++) { + for (i=0 ; inum_resources ; i++, res++) { if (res->flags & IORESOURCE_MEM) port->mapbase = res->start; else if (res->flags & IORESOURCE_IRQ) @@ -761,17 +746,17 @@ mpc52xx_uart_probe(struct device *dev) /* Add the port to the uart sub-system */ ret = uart_add_one_port(&mpc52xx_uart_driver, port); if (!ret) - dev_set_drvdata(dev, (void*)port); + platform_set_drvdata(dev, (void*)port); return ret; } static int -mpc52xx_uart_remove(struct device *dev) +mpc52xx_uart_remove(struct platform_device *dev) { - struct uart_port *port = (struct uart_port *) dev_get_drvdata(dev); + struct uart_port *port = (struct uart_port *) platform_get_drvdata(dev); - dev_set_drvdata(dev, NULL); + platform_set_drvdata(dev, NULL); if (port) uart_remove_one_port(&mpc52xx_uart_driver, port); @@ -781,37 +766,38 @@ mpc52xx_uart_remove(struct device *dev) #ifdef CONFIG_PM static int -mpc52xx_uart_suspend(struct device *dev, u32 state, u32 level) +mpc52xx_uart_suspend(struct platform_device *dev, pm_message_t state) { - struct uart_port *port = (struct uart_port *) dev_get_drvdata(dev); + struct uart_port *port = (struct uart_port *) platform_get_drvdata(dev); - if (sport && level == SUSPEND_DISABLE) + if (sport) uart_suspend_port(&mpc52xx_uart_driver, port); return 0; } static int -mpc52xx_uart_resume(struct device *dev, u32 level) +mpc52xx_uart_resume(struct platform_device *dev) { - struct uart_port *port = (struct uart_port *) dev_get_drvdata(dev); + struct uart_port *port = (struct uart_port *) platform_get_drvdata(dev); - if (port && level == RESUME_ENABLE) + if (port) uart_resume_port(&mpc52xx_uart_driver, port); return 0; } #endif -static struct device_driver mpc52xx_uart_platform_driver = { - .name = "mpc52xx-psc", - .bus = &platform_bus_type, +static struct platform_driver mpc52xx_uart_platform_driver = { .probe = mpc52xx_uart_probe, .remove = mpc52xx_uart_remove, #ifdef CONFIG_PM .suspend = mpc52xx_uart_suspend, .resume = mpc52xx_uart_resume, #endif + .driver = { + .name = "mpc52xx-psc", + }, }; @@ -828,7 +814,7 @@ mpc52xx_uart_init(void) ret = uart_register_driver(&mpc52xx_uart_driver); if (ret == 0) { - ret = driver_register(&mpc52xx_uart_platform_driver); + ret = platform_driver_register(&mpc52xx_uart_platform_driver); if (ret) uart_unregister_driver(&mpc52xx_uart_driver); } @@ -839,7 +825,7 @@ mpc52xx_uart_init(void) static void __exit mpc52xx_uart_exit(void) { - driver_unregister(&mpc52xx_uart_platform_driver); + platform_driver_unregister(&mpc52xx_uart_platform_driver); uart_unregister_driver(&mpc52xx_uart_driver); } diff --git a/drivers/serial/mpsc.c b/drivers/serial/mpsc.c index a8314aee2..63d2a66e5 100644 --- a/drivers/serial/mpsc.c +++ b/drivers/serial/mpsc.c @@ -1,6 +1,4 @@ /* - * drivers/serial/mpsc.c - * * Generic driver for the MPSC (UART mode) on Marvell parts (e.g., GT64240, * GT64260, MV64340, MV64360, GT96100, ... ). * @@ -52,7 +50,262 @@ * 4) AFAICT, hardware flow control isn't supported by the controller --MAG. */ -#include "mpsc.h" + +#if defined(CONFIG_SERIAL_MPSC_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) +#define SUPPORT_SYSRQ +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#if defined(CONFIG_SERIAL_MPSC_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) +#define SUPPORT_SYSRQ +#endif + +#define MPSC_NUM_CTLRS 2 + +/* + * Descriptors and buffers must be cache line aligned. + * Buffers lengths must be multiple of cache line size. + * Number of Tx & Rx descriptors must be powers of 2. + */ +#define MPSC_RXR_ENTRIES 32 +#define MPSC_RXRE_SIZE dma_get_cache_alignment() +#define MPSC_RXR_SIZE (MPSC_RXR_ENTRIES * MPSC_RXRE_SIZE) +#define MPSC_RXBE_SIZE dma_get_cache_alignment() +#define MPSC_RXB_SIZE (MPSC_RXR_ENTRIES * MPSC_RXBE_SIZE) + +#define MPSC_TXR_ENTRIES 32 +#define MPSC_TXRE_SIZE dma_get_cache_alignment() +#define MPSC_TXR_SIZE (MPSC_TXR_ENTRIES * MPSC_TXRE_SIZE) +#define MPSC_TXBE_SIZE dma_get_cache_alignment() +#define MPSC_TXB_SIZE (MPSC_TXR_ENTRIES * MPSC_TXBE_SIZE) + +#define MPSC_DMA_ALLOC_SIZE (MPSC_RXR_SIZE + MPSC_RXB_SIZE + \ + MPSC_TXR_SIZE + MPSC_TXB_SIZE + \ + dma_get_cache_alignment() /* for alignment */) + +/* Rx and Tx Ring entry descriptors -- assume entry size is <= cacheline size */ +struct mpsc_rx_desc { + u16 bufsize; + u16 bytecnt; + u32 cmdstat; + u32 link; + u32 buf_ptr; +} __attribute((packed)); + +struct mpsc_tx_desc { + u16 bytecnt; + u16 shadow; + u32 cmdstat; + u32 link; + u32 buf_ptr; +} __attribute((packed)); + +/* + * Some regs that have the erratum that you can't read them are are shared + * between the two MPSC controllers. This struct contains those shared regs. + */ +struct mpsc_shared_regs { + phys_addr_t mpsc_routing_base_p; + phys_addr_t sdma_intr_base_p; + + void __iomem *mpsc_routing_base; + void __iomem *sdma_intr_base; + + u32 MPSC_MRR_m; + u32 MPSC_RCRR_m; + u32 MPSC_TCRR_m; + u32 SDMA_INTR_CAUSE_m; + u32 SDMA_INTR_MASK_m; +}; + +/* The main driver data structure */ +struct mpsc_port_info { + struct uart_port port; /* Overlay uart_port structure */ + + /* Internal driver state for this ctlr */ + u8 ready; + u8 rcv_data; + tcflag_t c_iflag; /* save termios->c_iflag */ + tcflag_t c_cflag; /* save termios->c_cflag */ + + /* Info passed in from platform */ + u8 mirror_regs; /* Need to mirror regs? */ + u8 cache_mgmt; /* Need manual cache mgmt? */ + u8 brg_can_tune; /* BRG has baud tuning? */ + u32 brg_clk_src; + u16 mpsc_max_idle; + int default_baud; + int default_bits; + int default_parity; + int default_flow; + + /* Physical addresses of various blocks of registers (from platform) */ + phys_addr_t mpsc_base_p; + phys_addr_t sdma_base_p; + phys_addr_t brg_base_p; + + /* Virtual addresses of various blocks of registers (from platform) */ + void __iomem *mpsc_base; + void __iomem *sdma_base; + void __iomem *brg_base; + + /* Descriptor ring and buffer allocations */ + void *dma_region; + dma_addr_t dma_region_p; + + dma_addr_t rxr; /* Rx descriptor ring */ + dma_addr_t rxr_p; /* Phys addr of rxr */ + u8 *rxb; /* Rx Ring I/O buf */ + u8 *rxb_p; /* Phys addr of rxb */ + u32 rxr_posn; /* First desc w/ Rx data */ + + dma_addr_t txr; /* Tx descriptor ring */ + dma_addr_t txr_p; /* Phys addr of txr */ + u8 *txb; /* Tx Ring I/O buf */ + u8 *txb_p; /* Phys addr of txb */ + int txr_head; /* Where new data goes */ + int txr_tail; /* Where sent data comes off */ + + /* Mirrored values of regs we can't read (if 'mirror_regs' set) */ + u32 MPSC_MPCR_m; + u32 MPSC_CHR_1_m; + u32 MPSC_CHR_2_m; + u32 MPSC_CHR_10_m; + u32 BRG_BCR_m; + struct mpsc_shared_regs *shared_regs; +}; + +/* Hooks to platform-specific code */ +int mpsc_platform_register_driver(void); +void mpsc_platform_unregister_driver(void); + +/* Hooks back in to mpsc common to be called by platform-specific code */ +struct mpsc_port_info *mpsc_device_probe(int index); +struct mpsc_port_info *mpsc_device_remove(int index); + +/* Main MPSC Configuration Register Offsets */ +#define MPSC_MMCRL 0x0000 +#define MPSC_MMCRH 0x0004 +#define MPSC_MPCR 0x0008 +#define MPSC_CHR_1 0x000c +#define MPSC_CHR_2 0x0010 +#define MPSC_CHR_3 0x0014 +#define MPSC_CHR_4 0x0018 +#define MPSC_CHR_5 0x001c +#define MPSC_CHR_6 0x0020 +#define MPSC_CHR_7 0x0024 +#define MPSC_CHR_8 0x0028 +#define MPSC_CHR_9 0x002c +#define MPSC_CHR_10 0x0030 +#define MPSC_CHR_11 0x0034 + +#define MPSC_MPCR_FRZ (1 << 9) +#define MPSC_MPCR_CL_5 0 +#define MPSC_MPCR_CL_6 1 +#define MPSC_MPCR_CL_7 2 +#define MPSC_MPCR_CL_8 3 +#define MPSC_MPCR_SBL_1 0 +#define MPSC_MPCR_SBL_2 1 + +#define MPSC_CHR_2_TEV (1<<1) +#define MPSC_CHR_2_TA (1<<7) +#define MPSC_CHR_2_TTCS (1<<9) +#define MPSC_CHR_2_REV (1<<17) +#define MPSC_CHR_2_RA (1<<23) +#define MPSC_CHR_2_CRD (1<<25) +#define MPSC_CHR_2_EH (1<<31) +#define MPSC_CHR_2_PAR_ODD 0 +#define MPSC_CHR_2_PAR_SPACE 1 +#define MPSC_CHR_2_PAR_EVEN 2 +#define MPSC_CHR_2_PAR_MARK 3 + +/* MPSC Signal Routing */ +#define MPSC_MRR 0x0000 +#define MPSC_RCRR 0x0004 +#define MPSC_TCRR 0x0008 + +/* Serial DMA Controller Interface Registers */ +#define SDMA_SDC 0x0000 +#define SDMA_SDCM 0x0008 +#define SDMA_RX_DESC 0x0800 +#define SDMA_RX_BUF_PTR 0x0808 +#define SDMA_SCRDP 0x0810 +#define SDMA_TX_DESC 0x0c00 +#define SDMA_SCTDP 0x0c10 +#define SDMA_SFTDP 0x0c14 + +#define SDMA_DESC_CMDSTAT_PE (1<<0) +#define SDMA_DESC_CMDSTAT_CDL (1<<1) +#define SDMA_DESC_CMDSTAT_FR (1<<3) +#define SDMA_DESC_CMDSTAT_OR (1<<6) +#define SDMA_DESC_CMDSTAT_BR (1<<9) +#define SDMA_DESC_CMDSTAT_MI (1<<10) +#define SDMA_DESC_CMDSTAT_A (1<<11) +#define SDMA_DESC_CMDSTAT_AM (1<<12) +#define SDMA_DESC_CMDSTAT_CT (1<<13) +#define SDMA_DESC_CMDSTAT_C (1<<14) +#define SDMA_DESC_CMDSTAT_ES (1<<15) +#define SDMA_DESC_CMDSTAT_L (1<<16) +#define SDMA_DESC_CMDSTAT_F (1<<17) +#define SDMA_DESC_CMDSTAT_P (1<<18) +#define SDMA_DESC_CMDSTAT_EI (1<<23) +#define SDMA_DESC_CMDSTAT_O (1<<31) + +#define SDMA_DESC_DFLT (SDMA_DESC_CMDSTAT_O | \ + SDMA_DESC_CMDSTAT_EI) + +#define SDMA_SDC_RFT (1<<0) +#define SDMA_SDC_SFM (1<<1) +#define SDMA_SDC_BLMR (1<<6) +#define SDMA_SDC_BLMT (1<<7) +#define SDMA_SDC_POVR (1<<8) +#define SDMA_SDC_RIFB (1<<9) + +#define SDMA_SDCM_ERD (1<<7) +#define SDMA_SDCM_AR (1<<15) +#define SDMA_SDCM_STD (1<<16) +#define SDMA_SDCM_TXD (1<<23) +#define SDMA_SDCM_AT (1<<31) + +#define SDMA_0_CAUSE_RXBUF (1<<0) +#define SDMA_0_CAUSE_RXERR (1<<1) +#define SDMA_0_CAUSE_TXBUF (1<<2) +#define SDMA_0_CAUSE_TXEND (1<<3) +#define SDMA_1_CAUSE_RXBUF (1<<8) +#define SDMA_1_CAUSE_RXERR (1<<9) +#define SDMA_1_CAUSE_TXBUF (1<<10) +#define SDMA_1_CAUSE_TXEND (1<<11) + +#define SDMA_CAUSE_RX_MASK (SDMA_0_CAUSE_RXBUF | SDMA_0_CAUSE_RXERR | \ + SDMA_1_CAUSE_RXBUF | SDMA_1_CAUSE_RXERR) +#define SDMA_CAUSE_TX_MASK (SDMA_0_CAUSE_TXBUF | SDMA_0_CAUSE_TXEND | \ + SDMA_1_CAUSE_TXBUF | SDMA_1_CAUSE_TXEND) + +/* SDMA Interrupt registers */ +#define SDMA_INTR_CAUSE 0x0000 +#define SDMA_INTR_MASK 0x0080 + +/* Baud Rate Generator Interface Registers */ +#define BRG_BCR 0x0000 +#define BRG_BTR 0x0004 /* * Define how this driver is known to the outside (we've been assigned a @@ -61,13 +314,16 @@ #define MPSC_MAJOR 204 #define MPSC_MINOR_START 44 #define MPSC_DRIVER_NAME "MPSC" -#define MPSC_DEVFS_NAME "ttymm/" #define MPSC_DEV_NAME "ttyMM" #define MPSC_VERSION "1.00" static struct mpsc_port_info mpsc_ports[MPSC_NUM_CTLRS]; static struct mpsc_shared_regs mpsc_shared_regs; +static struct uart_driver mpsc_reg; +static void mpsc_start_rx(struct mpsc_port_info *pi); +static void mpsc_free_ring_mem(struct mpsc_port_info *pi); +static void mpsc_release_port(struct uart_port *port); /* ****************************************************************************** * @@ -546,7 +802,6 @@ static int mpsc_alloc_ring_mem(struct mpsc_port_info *pi) { int rc = 0; - static void mpsc_free_ring_mem(struct mpsc_port_info *pi); pr_debug("mpsc_alloc_ring_mem[%d]: Allocating ring mem\n", pi->port.line); @@ -745,7 +1000,6 @@ mpsc_rx_intr(struct mpsc_port_info *pi, struct pt_regs *regs) int rc = 0; u8 *bp; char flag = TTY_NORMAL; - static void mpsc_start_rx(struct mpsc_port_info *pi); pr_debug("mpsc_rx_intr[%d]: Handling Rx intr\n", pi->port.line); @@ -765,12 +1019,12 @@ mpsc_rx_intr(struct mpsc_port_info *pi, struct pt_regs *regs) bytes_in = be16_to_cpu(rxre->bytecnt); /* Following use of tty struct directly is deprecated */ - if (unlikely((tty->flip.count + bytes_in) >= TTY_FLIPBUF_SIZE)){ + if (unlikely(tty_buffer_request_room(tty, bytes_in) < bytes_in)) { if (tty->low_latency) tty_flip_buffer_push(tty); /* - * If this failed then we will throw awa the bytes - * but mst do so to clear interrupts. + * If this failed then we will throw away the bytes + * but must do so to clear interrupts. */ } @@ -1056,12 +1310,9 @@ mpsc_get_mctrl(struct uart_port *port) { struct mpsc_port_info *pi = (struct mpsc_port_info *)port; u32 mflags, status; - ulong iflags; - spin_lock_irqsave(&pi->port.lock, iflags); status = (pi->mirror_regs) ? pi->MPSC_CHR_10_m : readl(pi->mpsc_base + MPSC_CHR_10); - spin_unlock_irqrestore(&pi->port.lock, iflags); mflags = 0; if (status & 0x1) @@ -1073,18 +1324,18 @@ mpsc_get_mctrl(struct uart_port *port) } static void -mpsc_stop_tx(struct uart_port *port, uint tty_start) +mpsc_stop_tx(struct uart_port *port) { struct mpsc_port_info *pi = (struct mpsc_port_info *)port; - pr_debug("mpsc_stop_tx[%d]: tty_start: %d\n", port->line, tty_start); + pr_debug("mpsc_stop_tx[%d]\n", port->line); mpsc_freeze(pi); return; } static void -mpsc_start_tx(struct uart_port *port, uint tty_start) +mpsc_start_tx(struct uart_port *port) { struct mpsc_port_info *pi = (struct mpsc_port_info *)port; @@ -1092,7 +1343,7 @@ mpsc_start_tx(struct uart_port *port, uint tty_start) mpsc_copy_tx_data(pi); mpsc_sdma_start_tx(pi); - pr_debug("mpsc_start_tx[%d]: tty_start: %d\n", port->line, tty_start); + pr_debug("mpsc_start_tx[%d]\n", port->line); return; } @@ -1101,6 +1352,8 @@ mpsc_start_rx(struct mpsc_port_info *pi) { pr_debug("mpsc_start_rx[%d]: Starting...\n", pi->port.line); + /* Issue a Receive Abort to clear any receive errors */ + writel(MPSC_CHR_2_RA, pi->mpsc_base + MPSC_CHR_2); if (pi->rcv_data) { mpsc_enter_hunt(pi); mpsc_sdma_cmd(pi, SDMA_SDCM_ERD); @@ -1159,10 +1412,10 @@ mpsc_startup(struct uart_port *port) /* If irq's are shared, need to set flag */ if (mpsc_ports[0].port.irq == mpsc_ports[1].port.irq) - flag = SA_SHIRQ; + flag = IRQF_SHARED; if (request_irq(pi->port.irq, mpsc_sdma_intr, flag, - "mpsc/sdma", pi)) + "mpsc-sdma", pi)) printk(KERN_ERR "MPSC: Can't get SDMA IRQ %d\n", pi->port.irq); @@ -1178,7 +1431,6 @@ static void mpsc_shutdown(struct uart_port *port) { struct mpsc_port_info *pi = (struct mpsc_port_info *)port; - static void mpsc_release_port(struct uart_port *port); pr_debug("mpsc_shutdown[%d]: Shutting down MPSC\n", port->line); @@ -1448,7 +1700,6 @@ mpsc_console_setup(struct console *co, char *options) return uart_set_options(&pi->port, co, baud, parity, bits, flow); } -extern struct uart_driver mpsc_reg; static struct console mpsc_console = { .name = MPSC_DEV_NAME, .write = mpsc_console_write, @@ -1550,15 +1801,14 @@ mpsc_shared_unmap_regs(void) } static int -mpsc_shared_drv_probe(struct device *dev) +mpsc_shared_drv_probe(struct platform_device *dev) { - struct platform_device *pd = to_platform_device(dev); struct mpsc_shared_pdata *pdata; int rc = -ENODEV; - if (pd->id == 0) { - if (!(rc = mpsc_shared_map_regs(pd))) { - pdata = (struct mpsc_shared_pdata *)dev->platform_data; + if (dev->id == 0) { + if (!(rc = mpsc_shared_map_regs(dev))) { + pdata = (struct mpsc_shared_pdata *)dev->dev.platform_data; mpsc_shared_regs.MPSC_MRR_m = pdata->mrr_val; mpsc_shared_regs.MPSC_RCRR_m= pdata->rcrr_val; @@ -1576,12 +1826,11 @@ mpsc_shared_drv_probe(struct device *dev) } static int -mpsc_shared_drv_remove(struct device *dev) +mpsc_shared_drv_remove(struct platform_device *dev) { - struct platform_device *pd = to_platform_device(dev); int rc = -ENODEV; - if (pd->id == 0) { + if (dev->id == 0) { mpsc_shared_unmap_regs(); mpsc_shared_regs.MPSC_MRR_m = 0; mpsc_shared_regs.MPSC_RCRR_m = 0; @@ -1594,11 +1843,12 @@ mpsc_shared_drv_remove(struct device *dev) return rc; } -static struct device_driver mpsc_shared_driver = { - .name = MPSC_SHARED_NAME, - .bus = &platform_bus_type, +static struct platform_driver mpsc_shared_driver = { .probe = mpsc_shared_drv_probe, .remove = mpsc_shared_drv_remove, + .driver = { + .name = MPSC_SHARED_NAME, + }, }; /* @@ -1611,7 +1861,6 @@ static struct device_driver mpsc_shared_driver = { static struct uart_driver mpsc_reg = { .owner = THIS_MODULE, .driver_name = MPSC_DRIVER_NAME, - .devfs_name = MPSC_DEVFS_NAME, .dev_name = MPSC_DEV_NAME, .major = MPSC_MAJOR, .minor = MPSC_MINOR_START, @@ -1731,19 +1980,18 @@ mpsc_drv_get_platform_data(struct mpsc_port_info *pi, } static int -mpsc_drv_probe(struct device *dev) +mpsc_drv_probe(struct platform_device *dev) { - struct platform_device *pd = to_platform_device(dev); struct mpsc_port_info *pi; int rc = -ENODEV; - pr_debug("mpsc_drv_probe: Adding MPSC %d\n", pd->id); + pr_debug("mpsc_drv_probe: Adding MPSC %d\n", dev->id); - if (pd->id < MPSC_NUM_CTLRS) { - pi = &mpsc_ports[pd->id]; + if (dev->id < MPSC_NUM_CTLRS) { + pi = &mpsc_ports[dev->id]; - if (!(rc = mpsc_drv_map_regs(pi, pd))) { - mpsc_drv_get_platform_data(pi, pd, pd->id); + if (!(rc = mpsc_drv_map_regs(pi, dev))) { + mpsc_drv_get_platform_data(pi, dev, dev->id); if (!(rc = mpsc_make_ready(pi))) if (!(rc = uart_add_one_port(&mpsc_reg, @@ -1763,27 +2011,26 @@ mpsc_drv_probe(struct device *dev) } static int -mpsc_drv_remove(struct device *dev) +mpsc_drv_remove(struct platform_device *dev) { - struct platform_device *pd = to_platform_device(dev); - - pr_debug("mpsc_drv_exit: Removing MPSC %d\n", pd->id); + pr_debug("mpsc_drv_exit: Removing MPSC %d\n", dev->id); - if (pd->id < MPSC_NUM_CTLRS) { - uart_remove_one_port(&mpsc_reg, &mpsc_ports[pd->id].port); - mpsc_release_port((struct uart_port *)&mpsc_ports[pd->id].port); - mpsc_drv_unmap_regs(&mpsc_ports[pd->id]); + if (dev->id < MPSC_NUM_CTLRS) { + uart_remove_one_port(&mpsc_reg, &mpsc_ports[dev->id].port); + mpsc_release_port((struct uart_port *)&mpsc_ports[dev->id].port); + mpsc_drv_unmap_regs(&mpsc_ports[dev->id]); return 0; } else return -ENODEV; } -static struct device_driver mpsc_driver = { - .name = MPSC_CTLR_NAME, - .bus = &platform_bus_type, +static struct platform_driver mpsc_driver = { .probe = mpsc_drv_probe, .remove = mpsc_drv_remove, + .driver = { + .name = MPSC_CTLR_NAME, + }, }; static int __init @@ -1797,9 +2044,9 @@ mpsc_drv_init(void) memset(&mpsc_shared_regs, 0, sizeof(mpsc_shared_regs)); if (!(rc = uart_register_driver(&mpsc_reg))) { - if (!(rc = driver_register(&mpsc_shared_driver))) { - if ((rc = driver_register(&mpsc_driver))) { - driver_unregister(&mpsc_shared_driver); + if (!(rc = platform_driver_register(&mpsc_shared_driver))) { + if ((rc = platform_driver_register(&mpsc_driver))) { + platform_driver_unregister(&mpsc_shared_driver); uart_unregister_driver(&mpsc_reg); } } @@ -1814,8 +2061,8 @@ mpsc_drv_init(void) static void __exit mpsc_drv_exit(void) { - driver_unregister(&mpsc_driver); - driver_unregister(&mpsc_shared_driver); + platform_driver_unregister(&mpsc_driver); + platform_driver_unregister(&mpsc_shared_driver); uart_unregister_driver(&mpsc_reg); memset(mpsc_ports, 0, sizeof(mpsc_ports)); memset(&mpsc_shared_regs, 0, sizeof(mpsc_shared_regs)); diff --git a/drivers/serial/mux.c b/drivers/serial/mux.c index 64c0e8912..4a1c9983f 100644 --- a/drivers/serial/mux.c +++ b/drivers/serial/mux.c @@ -16,7 +16,6 @@ ** */ -#include #include #include #include diff --git a/drivers/serial/pmac_zilog.c b/drivers/serial/pmac_zilog.c index 513ff8597..bfd2a2275 100644 --- a/drivers/serial/pmac_zilog.c +++ b/drivers/serial/pmac_zilog.c @@ -42,7 +42,6 @@ #undef DEBUG_HARD #undef USE_CTRL_O_SYSRQ -#include #include #include @@ -101,7 +100,6 @@ static DEFINE_MUTEX(pmz_irq_mutex); static struct uart_driver pmz_uart_reg = { .owner = THIS_MODULE, .driver_name = "ttyS", - .devfs_name = "tts/", .dev_name = "ttyS", .major = TTY_MAJOR, }; @@ -936,7 +934,7 @@ static int pmz_startup(struct uart_port *port) } pmz_get_port_A(uap)->flags |= PMACZILOG_FLAG_IS_IRQ_ON; - if (request_irq(uap->port.irq, pmz_interrupt, SA_SHIRQ, "PowerMac Zilog", uap)) { + if (request_irq(uap->port.irq, pmz_interrupt, IRQF_SHARED, "PowerMac Zilog", uap)) { dev_err(&uap->dev->ofdev.dev, "Unable to register zs interrupt handler.\n"); pmz_set_scc_power(uap, 0); @@ -1445,8 +1443,8 @@ static int __init pmz_init_port(struct uart_pmac_port *uap) uap->flags &= ~PMACZILOG_FLAG_HAS_DMA; goto no_dma; } - uap->tx_dma_irq = np->intrs[1].line; - uap->rx_dma_irq = np->intrs[2].line; + uap->tx_dma_irq = irq_of_parse_and_map(np, 1); + uap->rx_dma_irq = irq_of_parse_and_map(np, 2); } no_dma: @@ -1493,7 +1491,7 @@ no_dma: * Init remaining bits of "port" structure */ uap->port.iotype = UPIO_MEM; - uap->port.irq = np->intrs[0].line; + uap->port.irq = irq_of_parse_and_map(np, 0); uap->port.uartclk = ZS_CLOCK; uap->port.fifosize = 1; uap->port.ops = &pmz_pops; diff --git a/drivers/serial/pxa.c b/drivers/serial/pxa.c index 77d4568cc..a720953a4 100644 --- a/drivers/serial/pxa.c +++ b/drivers/serial/pxa.c @@ -24,7 +24,6 @@ * with the serial core maintainer satisfaction to appear soon. */ -#include #if defined(CONFIG_SERIAL_PXA_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #define SUPPORT_SYSRQ @@ -269,7 +268,6 @@ static unsigned int serial_pxa_get_mctrl(struct uart_port *port) unsigned char status; unsigned int ret; -return TIOCM_CTS | TIOCM_DSR | TIOCM_CAR; status = serial_in(up, UART_MSR); ret = 0; @@ -391,7 +389,7 @@ static int serial_pxa_startup(struct uart_port *port) /* * Finally, enable interrupts. Note: Modem status interrupts - * are set via set_termios(), which will be occuring imminently + * are set via set_termios(), which will be occurring imminently * anyway, so we don't enable them here. */ up->ier = UART_IER_RLSI | UART_IER_RDI | UART_IER_RTOIE | UART_IER_UUE; @@ -781,7 +779,6 @@ static struct uart_pxa_port serial_pxa_ports[] = { static struct uart_driver serial_pxa_reg = { .owner = THIS_MODULE, .driver_name = "PXA serial", - .devfs_name = "tts/", .dev_name = "ttyS", .major = TTY_MAJOR, .minor = 64, diff --git a/drivers/serial/s3c2410.c b/drivers/serial/s3c2410.c index f5aac92fb..95738a19c 100644 --- a/drivers/serial/s3c2410.c +++ b/drivers/serial/s3c2410.c @@ -55,7 +55,6 @@ * BJD, 04-Nov-2004 */ -#include #if defined(CONFIG_SERIAL_S3C2410_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #define SUPPORT_SYSRQ @@ -149,7 +148,6 @@ s3c24xx_serial_dbg(const char *fmt, ...) /* UART name and device definitions */ #define S3C24XX_SERIAL_NAME "ttySAC" -#define S3C24XX_SERIAL_DEVFS "tts/" #define S3C24XX_SERIAL_MAJOR 204 #define S3C24XX_SERIAL_MINOR 64 @@ -872,6 +870,8 @@ static const char *s3c24xx_serial_type(struct uart_port *port) return "S3C2410"; case PORT_S3C2440: return "S3C2440"; + case PORT_S3C2412: + return "S3C2412"; default: return NULL; } @@ -950,7 +950,6 @@ static struct uart_driver s3c24xx_uart_drv = { .nr = 3, .cons = S3C24XX_SERIAL_CONSOLE, .driver_name = S3C24XX_SERIAL_NAME, - .devfs_name = S3C24XX_SERIAL_DEVFS, .major = S3C24XX_SERIAL_MAJOR, .minor = S3C24XX_SERIAL_MINOR, }; @@ -1365,7 +1364,7 @@ static inline void s3c2410_serial_exit(void) #endif /* CONFIG_CPU_S3C2410 */ -#ifdef CONFIG_CPU_S3C2440 +#if defined(CONFIG_CPU_S3C2440) || defined(CONFIG_CPU_S3C2442) static int s3c2440_serial_setsource(struct uart_port *port, struct s3c24xx_uart_clksrc *clk) @@ -1528,6 +1527,141 @@ static inline void s3c2440_serial_exit(void) #define s3c2440_uart_inf_at NULL #endif /* CONFIG_CPU_S3C2440 */ +#if defined(CONFIG_CPU_S3C2412) || defined(CONFIG_CPU_S3C2413) + +static int s3c2412_serial_setsource(struct uart_port *port, + struct s3c24xx_uart_clksrc *clk) +{ + unsigned long ucon = rd_regl(port, S3C2410_UCON); + + ucon &= ~S3C2412_UCON_CLKMASK; + + if (strcmp(clk->name, "uclk") == 0) + ucon |= S3C2440_UCON_UCLK; + else if (strcmp(clk->name, "pclk") == 0) + ucon |= S3C2440_UCON_PCLK; + else if (strcmp(clk->name, "usysclk") == 0) + ucon |= S3C2412_UCON_USYSCLK; + else { + printk(KERN_ERR "unknown clock source %s\n", clk->name); + return -EINVAL; + } + + wr_regl(port, S3C2410_UCON, ucon); + return 0; +} + + +static int s3c2412_serial_getsource(struct uart_port *port, + struct s3c24xx_uart_clksrc *clk) +{ + unsigned long ucon = rd_regl(port, S3C2410_UCON); + + switch (ucon & S3C2412_UCON_CLKMASK) { + case S3C2412_UCON_UCLK: + clk->divisor = 1; + clk->name = "uclk"; + break; + + case S3C2412_UCON_PCLK: + case S3C2412_UCON_PCLK2: + clk->divisor = 1; + clk->name = "pclk"; + break; + + case S3C2412_UCON_USYSCLK: + clk->divisor = 1; + clk->name = "usysclk"; + break; + } + + return 0; +} + +static int s3c2412_serial_resetport(struct uart_port *port, + struct s3c2410_uartcfg *cfg) +{ + unsigned long ucon = rd_regl(port, S3C2410_UCON); + + dbg("%s: port=%p (%08lx), cfg=%p\n", + __FUNCTION__, port, port->mapbase, cfg); + + /* ensure we don't change the clock settings... */ + + ucon &= S3C2412_UCON_CLKMASK; + + wr_regl(port, S3C2410_UCON, ucon | cfg->ucon); + wr_regl(port, S3C2410_ULCON, cfg->ulcon); + + /* reset both fifos */ + + wr_regl(port, S3C2410_UFCON, cfg->ufcon | S3C2410_UFCON_RESETBOTH); + wr_regl(port, S3C2410_UFCON, cfg->ufcon); + + return 0; +} + +static struct s3c24xx_uart_info s3c2412_uart_inf = { + .name = "Samsung S3C2412 UART", + .type = PORT_S3C2412, + .fifosize = 64, + .rx_fifomask = S3C2440_UFSTAT_RXMASK, + .rx_fifoshift = S3C2440_UFSTAT_RXSHIFT, + .rx_fifofull = S3C2440_UFSTAT_RXFULL, + .tx_fifofull = S3C2440_UFSTAT_TXFULL, + .tx_fifomask = S3C2440_UFSTAT_TXMASK, + .tx_fifoshift = S3C2440_UFSTAT_TXSHIFT, + .get_clksrc = s3c2412_serial_getsource, + .set_clksrc = s3c2412_serial_setsource, + .reset_port = s3c2412_serial_resetport, +}; + +/* device management */ + +static int s3c2412_serial_probe(struct platform_device *dev) +{ + dbg("s3c2440_serial_probe: dev=%p\n", dev); + return s3c24xx_serial_probe(dev, &s3c2412_uart_inf); +} + +static struct platform_driver s3c2412_serial_drv = { + .probe = s3c2412_serial_probe, + .remove = s3c24xx_serial_remove, + .suspend = s3c24xx_serial_suspend, + .resume = s3c24xx_serial_resume, + .driver = { + .name = "s3c2412-uart", + .owner = THIS_MODULE, + }, +}; + + +static inline int s3c2412_serial_init(void) +{ + return s3c24xx_serial_init(&s3c2412_serial_drv, &s3c2412_uart_inf); +} + +static inline void s3c2412_serial_exit(void) +{ + platform_driver_unregister(&s3c2412_serial_drv); +} + +#define s3c2412_uart_inf_at &s3c2412_uart_inf +#else + +static inline int s3c2412_serial_init(void) +{ + return 0; +} + +static inline void s3c2412_serial_exit(void) +{ +} + +#define s3c2412_uart_inf_at NULL +#endif /* CONFIG_CPU_S3C2440 */ + + /* module initialisation code */ static int __init s3c24xx_serial_modinit(void) @@ -1542,6 +1676,7 @@ static int __init s3c24xx_serial_modinit(void) s3c2400_serial_init(); s3c2410_serial_init(); + s3c2412_serial_init(); s3c2440_serial_init(); return 0; @@ -1551,6 +1686,7 @@ static void __exit s3c24xx_serial_modexit(void) { s3c2400_serial_exit(); s3c2410_serial_exit(); + s3c2412_serial_exit(); s3c2440_serial_exit(); uart_unregister_driver(&s3c24xx_uart_drv); @@ -1773,6 +1909,8 @@ static int s3c24xx_serial_initconsole(void) info = s3c2410_uart_inf_at; } else if (strcmp(dev->name, "s3c2440-uart") == 0) { info = s3c2440_uart_inf_at; + } else if (strcmp(dev->name, "s3c2412-uart") == 0) { + info = s3c2412_uart_inf_at; } else { printk(KERN_ERR "s3c24xx: no driver for %s\n", dev->name); return 0; @@ -1796,4 +1934,4 @@ console_initcall(s3c24xx_serial_initconsole); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Ben Dooks "); -MODULE_DESCRIPTION("Samsung S3C2410/S3C2440 Serial port driver"); +MODULE_DESCRIPTION("Samsung S3C2410/S3C2440/S3C2412 Serial port driver"); diff --git a/drivers/serial/sa1100.c b/drivers/serial/sa1100.c index c2d9068b4..db3486d33 100644 --- a/drivers/serial/sa1100.c +++ b/drivers/serial/sa1100.c @@ -24,7 +24,6 @@ * $Id: sa1100.c,v 1.50 2002/07/29 14:41:04 rmk Exp $ * */ -#include #if defined(CONFIG_SERIAL_SA1100_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #define SUPPORT_SYSRQ @@ -816,7 +815,6 @@ static struct uart_driver sa1100_reg = { .owner = THIS_MODULE, .driver_name = "ttySA", .dev_name = "ttySA", - .devfs_name = "ttySA", .major = SERIAL_SA1100_MAJOR, .minor = MINOR_START, .nr = NR_PORTS, diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c index 17839e753..c59dcb7a8 100644 --- a/drivers/serial/serial_core.c +++ b/drivers/serial/serial_core.c @@ -22,7 +22,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include #include #include #include @@ -50,6 +49,12 @@ */ static DEFINE_MUTEX(port_mutex); +/* + * lockdep: port->lock is initialized in two places, but we + * want only one lock-class: + */ +static struct lock_class_key port_lock_key; + #define HIGH_BITS_OFFSET ((sizeof(long)-sizeof(int))*8) #define uart_users(state) ((state)->count + ((state)->info ? (state)->info->blocked_open : 0)) @@ -691,7 +696,8 @@ static int uart_set_info(struct uart_state *state, (new_serial.baud_base != port->uartclk / 16) || (close_delay != state->close_delay) || (closing_wait != state->closing_wait) || - (new_serial.xmit_fifo_size != port->fifosize) || + (new_serial.xmit_fifo_size && + new_serial.xmit_fifo_size != port->fifosize) || (((new_flags ^ old_flags) & ~UPF_USR_MASK) != 0)) goto exit; port->flags = ((port->flags & ~UPF_USR_MASK) | @@ -796,7 +802,8 @@ static int uart_set_info(struct uart_state *state, port->custom_divisor = new_serial.custom_divisor; state->close_delay = close_delay; state->closing_wait = closing_wait; - port->fifosize = new_serial.xmit_fifo_size; + if (new_serial.xmit_fifo_size) + port->fifosize = new_serial.xmit_fifo_size; if (state->info->tty) state->info->tty->low_latency = (port->flags & UPF_LOW_LATENCY) ? 1 : 0; @@ -1866,6 +1873,7 @@ uart_set_options(struct uart_port *port, struct console *co, * early. */ spin_lock_init(&port->lock); + lockdep_set_class(&port->lock, &port_lock_key); memset(&termios, 0, sizeof(struct termios)); @@ -1924,6 +1932,9 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *port) if (state->info && state->info->flags & UIF_INITIALIZED) { const struct uart_ops *ops = port->ops; + state->info->flags = (state->info->flags & ~UIF_INITIALIZED) + | UIF_SUSPENDED; + spin_lock_irq(&port->lock); ops->stop_tx(port); ops->set_mctrl(port, 0); @@ -1983,7 +1994,7 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *port) console_start(port->cons); } - if (state->info && state->info->flags & UIF_INITIALIZED) { + if (state->info && state->info->flags & UIF_SUSPENDED) { const struct uart_ops *ops = port->ops; int ret; @@ -1995,15 +2006,17 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *port) ops->set_mctrl(port, port->mctrl); ops->start_tx(port); spin_unlock_irq(&port->lock); + state->info->flags |= UIF_INITIALIZED; } else { /* * Failed to resume - maybe hardware went away? * Clear the "initialized" flag so we won't try * to call the low level drivers shutdown method. */ - state->info->flags &= ~UIF_INITIALIZED; uart_shutdown(state); } + + state->info->flags &= ~UIF_SUSPENDED; } mutex_unlock(&state->mutex); @@ -2028,6 +2041,7 @@ uart_report_port(struct uart_driver *drv, struct uart_port *port) case UPIO_MEM: case UPIO_MEM32: case UPIO_AU: + case UPIO_TSI: snprintf(address, sizeof(address), "MMIO 0x%lx", port->mapbase); break; @@ -2153,7 +2167,6 @@ int uart_register_driver(struct uart_driver *drv) normal->owner = drv->owner; normal->driver_name = drv->driver_name; - normal->devfs_name = drv->devfs_name; normal->name = drv->dev_name; normal->major = drv->major; normal->minor_start = drv->minor; @@ -2161,7 +2174,7 @@ int uart_register_driver(struct uart_driver *drv) normal->subtype = SERIAL_TYPE_NORMAL; normal->init_termios = tty_std_termios; normal->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; - normal->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS; + normal->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV; normal->driver_state = drv; tty_set_operations(normal, &uart_ops); @@ -2249,8 +2262,10 @@ int uart_add_one_port(struct uart_driver *drv, struct uart_port *port) * If this port is a console, then the spinlock is already * initialised. */ - if (!(uart_console(port) && (port->cons->flags & CON_ENABLED))) + if (!(uart_console(port) && (port->cons->flags & CON_ENABLED))) { spin_lock_init(&port->lock); + lockdep_set_class(&port->lock, &port_lock_key); + } uart_configure_port(drv, state, port); @@ -2312,7 +2327,7 @@ int uart_remove_one_port(struct uart_driver *drv, struct uart_port *port) mutex_unlock(&state->mutex); /* - * Remove the devices from devfs + * Remove the devices from the tty layer */ tty_unregister_device(drv->tty_driver, port->line); @@ -2367,6 +2382,9 @@ int uart_match_port(struct uart_port *port1, struct uart_port *port2) return (port1->iobase == port2->iobase) && (port1->hub6 == port2->hub6); case UPIO_MEM: + case UPIO_MEM32: + case UPIO_AU: + case UPIO_TSI: return (port1->mapbase == port2->mapbase); } return 0; diff --git a/drivers/serial/serial_cs.c b/drivers/serial/serial_cs.c index 2c7077354..06a246ae5 100644 --- a/drivers/serial/serial_cs.c +++ b/drivers/serial/serial_cs.c @@ -185,14 +185,12 @@ static int serial_suspend(struct pcmcia_device *link) static int serial_resume(struct pcmcia_device *link) { - if (pcmcia_dev_present(link)) { - struct serial_info *info = link->priv; - int i; + struct serial_info *info = link->priv; + int i; - for (i = 0; i < info->ndev; i++) - serial8250_resume_port(info->line[i]); - wakeup_card(info); - } + for (i = 0; i < info->ndev; i++) + serial8250_resume_port(info->line[i]); + wakeup_card(info); return 0; } @@ -786,6 +784,7 @@ static struct pcmcia_device_id serial_ids[] = { PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "COMpad4.cis"), PCMCIA_DEVICE_CIS_PROD_ID123("ADVANTECH", "COMpad-32/85", "1.0", 0x96913a85, 0x8fbe92ae, 0x0877b627, "COMpad2.cis"), PCMCIA_DEVICE_CIS_PROD_ID2("RS-COM 2P", 0xad20b156, "RS-COM-2P.cis"), + PCMCIA_DEVICE_CIS_MANF_CARD(0x0013, 0x0000, "GLOBETROTTER.cis"), /* too generic */ /* PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0160, 0x0002), */ /* PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0160, 0x0002), */ diff --git a/drivers/serial/serial_lh7a40x.c b/drivers/serial/serial_lh7a40x.c index 56f269b6b..23ddedbae 100644 --- a/drivers/serial/serial_lh7a40x.c +++ b/drivers/serial/serial_lh7a40x.c @@ -27,7 +27,6 @@ * */ -#include #if defined(CONFIG_SERIAL_LH7A40X_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #define SUPPORT_SYSRQ @@ -112,13 +111,12 @@ struct uart_port_lh7a40x { unsigned int statusPrev; /* Most recently read modem status */ }; -static void lh7a40xuart_stop_tx (struct uart_port* port, unsigned int tty_stop) +static void lh7a40xuart_stop_tx (struct uart_port* port) { BIT_CLR (port, UART_R_INTEN, TxInt); } -static void lh7a40xuart_start_tx (struct uart_port* port, - unsigned int tty_start) +static void lh7a40xuart_start_tx (struct uart_port* port) { BIT_SET (port, UART_R_INTEN, TxInt); @@ -146,23 +144,15 @@ lh7a40xuart_rx_chars (struct uart_port* port) { struct tty_struct* tty = port->info->tty; int cbRxMax = 256; /* (Gross) limit on receive */ - unsigned int data, flag;/* Received data and status */ + unsigned int data; /* Received data and status */ + unsigned int flag; while (!(UR (port, UART_R_STATUS) & nRxRdy) && --cbRxMax) { - if (tty->flip.count >= TTY_FLIPBUF_SIZE) { - if (tty->low_latency) - tty_flip_buffer_push(tty); - /* - * If this failed then we will throw away the - * bytes but must do so to clear interrupts - */ - } - data = UR (port, UART_R_DATA); flag = TTY_NORMAL; ++port->icount.rx; - if (unlikely(data & RxError)) { /* Quick check, short-circuit */ + if (unlikely(data & RxError)) { if (data & RxBreak) { data &= ~(RxFramingError | RxParityError); ++port->icount.brk; @@ -208,7 +198,7 @@ static void lh7a40xuart_tx_chars (struct uart_port* port) return; } if (uart_circ_empty (xmit) || uart_tx_stopped (port)) { - lh7a40xuart_stop_tx (port, 0); + lh7a40xuart_stop_tx (port); return; } @@ -230,7 +220,7 @@ static void lh7a40xuart_tx_chars (struct uart_port* port) uart_write_wakeup (port); if (uart_circ_empty (xmit)) - lh7a40xuart_stop_tx (port, 0); + lh7a40xuart_stop_tx (port); } static void lh7a40xuart_modem_status (struct uart_port* port) @@ -313,7 +303,7 @@ static void lh7a40xuart_set_mctrl (struct uart_port* port, unsigned int mctrl) /* Note, kernel appears to be setting DTR and RTS on console. */ /* *** FIXME: this deserves more work. There's some work in - tracing all of the IO pins. */ + tracing all of the IO pins. */ #if 0 if( port->mapbase == UART1_PHYS) { gpioRegs_t *gpio = (gpioRegs_t *)IO_ADDRESS(GPIO_PHYS); @@ -511,12 +501,12 @@ static struct uart_port_lh7a40x lh7a40x_ports[DEV_NR] = { .port = { .membase = (void*) io_p2v (UART1_PHYS), .mapbase = UART1_PHYS, - .iotype = SERIAL_IO_MEM, + .iotype = UPIO_MEM, .irq = IRQ_UART1INTR, .uartclk = 14745600/2, .fifosize = 16, .ops = &lh7a40x_uart_ops, - .flags = ASYNC_BOOT_AUTOCONF, + .flags = UPF_BOOT_AUTOCONF, .line = 0, }, }, @@ -524,12 +514,12 @@ static struct uart_port_lh7a40x lh7a40x_ports[DEV_NR] = { .port = { .membase = (void*) io_p2v (UART2_PHYS), .mapbase = UART2_PHYS, - .iotype = SERIAL_IO_MEM, + .iotype = UPIO_MEM, .irq = IRQ_UART2INTR, .uartclk = 14745600/2, .fifosize = 16, .ops = &lh7a40x_uart_ops, - .flags = ASYNC_BOOT_AUTOCONF, + .flags = UPF_BOOT_AUTOCONF, .line = 1, }, }, @@ -537,12 +527,12 @@ static struct uart_port_lh7a40x lh7a40x_ports[DEV_NR] = { .port = { .membase = (void*) io_p2v (UART3_PHYS), .mapbase = UART3_PHYS, - .iotype = SERIAL_IO_MEM, + .iotype = UPIO_MEM, .irq = IRQ_UART3INTR, .uartclk = 14745600/2, .fifosize = 16, .ops = &lh7a40x_uart_ops, - .flags = ASYNC_BOOT_AUTOCONF, + .flags = UPF_BOOT_AUTOCONF, .line = 2, }, }, @@ -553,6 +543,12 @@ static struct uart_port_lh7a40x lh7a40x_ports[DEV_NR] = { #else # define LH7A40X_CONSOLE &lh7a40x_console +static void lh7a40xuart_console_putchar(struct uart_port *port, int ch) +{ + while (UR(port, UART_R_STATUS) & nTxRdy) + ; + UR(port, UART_R_DATA) = ch; +} static void lh7a40xuart_console_write (struct console* co, const char* s, @@ -566,16 +562,7 @@ static void lh7a40xuart_console_write (struct console* co, UR (port, UART_R_INTEN) = 0; /* Disable all interrupts */ BIT_SET (port, UART_R_CON, UARTEN | SIRDIS); /* Enable UART */ - for (; count-- > 0; ++s) { - while (UR (port, UART_R_STATUS) & nTxRdy) - ; - UR (port, UART_R_DATA) = *s; - if (*s == '\n') { - while ((UR (port, UART_R_STATUS) & TxBusy)) - ; - UR (port, UART_R_DATA) = '\r'; - } - } + uart_console_write(port, s, count, lh7a40xuart_console_putchar); /* Wait until all characters are sent */ while (UR (port, UART_R_STATUS) & TxBusy) @@ -633,7 +620,7 @@ static int __init lh7a40xuart_console_setup (struct console* co, char* options) return uart_set_options (port, co, baud, parity, bits, flow); } -extern struct uart_driver lh7a40x_reg; +static struct uart_driver lh7a40x_reg; static struct console lh7a40x_console = { .name = "ttyAM", .write = lh7a40xuart_console_write, @@ -675,9 +662,13 @@ static int __init lh7a40xuart_init(void) if (ret == 0) { int i; - for (i = 0; i < DEV_NR; i++) + for (i = 0; i < DEV_NR; i++) { + /* UART3, when used, requires GPIO pin reallocation */ + if (lh7a40x_ports[i].port.mapbase == UART3_PHYS) + GPIO_PINMUX |= 1<<3; uart_add_one_port (&lh7a40x_reg, &lh7a40x_ports[i].port); + } } return ret; } diff --git a/drivers/serial/serial_txx9.c b/drivers/serial/serial_txx9.c index 3f1051a4a..b361669f8 100644 --- a/drivers/serial/serial_txx9.c +++ b/drivers/serial/serial_txx9.c @@ -31,8 +31,13 @@ * 1.01 Set fifosize to make tx_empry called properly. * Use standard uart_get_divisor. * 1.02 Cleanup. (import 8250.c changes) + * 1.03 Fix low-latency mode. (import 8250.c changes) + * 1.04 Remove usage of deprecated functions, cleanup. + * 1.05 More strict check in verify_port. Cleanup. + * 1.06 Do not insert a char caused previous overrun. + * Fix some spin_locks. + * Do not call uart_add_one_port for absent ports. */ -#include #if defined(CONFIG_SERIAL_TXX9_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #define SUPPORT_SYSRQ @@ -50,11 +55,12 @@ #include #include #include +#include #include #include -static char *serial_version = "1.02"; +static char *serial_version = "1.06"; static char *serial_name = "TX39/49 Serial driver"; #define PASS_LIMIT 256 @@ -62,12 +68,10 @@ static char *serial_name = "TX39/49 Serial driver"; #if !defined(CONFIG_SERIAL_TXX9_STDSERIAL) /* "ttyS" is used for standard serial driver */ #define TXX9_TTY_NAME "ttyTX" -#define TXX9_TTY_DEVFS_NAME "tttx/" #define TXX9_TTY_MINOR_START (64 + 64) /* ttyTX0(128), ttyTX1(129) */ #else /* acts like standard serial driver */ #define TXX9_TTY_NAME "ttyS" -#define TXX9_TTY_DEVFS_NAME "tts/" #define TXX9_TTY_MINOR_START 64 #endif #define TXX9_TTY_MAJOR TTY_MAJOR @@ -86,11 +90,13 @@ static char *serial_name = "TX39/49 Serial driver"; */ #ifdef ENABLE_SERIAL_TXX9_PCI #define NR_PCI_BOARDS 4 -#define UART_NR (2 + NR_PCI_BOARDS) +#define UART_NR (4 + NR_PCI_BOARDS) #else -#define UART_NR 2 +#define UART_NR 4 #endif +#define HIGH_BITS_OFFSET ((sizeof(long)-sizeof(int))*8) + struct uart_txx9_port { struct uart_port port; @@ -207,7 +213,7 @@ static inline unsigned int sio_in(struct uart_txx9_port *up, int offset) { switch (up->port.iotype) { default: - return *(volatile u32 *)(up->port.membase + offset); + return __raw_readl(up->port.membase + offset); case UPIO_PORT: return inl(up->port.iobase + offset); } @@ -218,7 +224,7 @@ sio_out(struct uart_txx9_port *up, int offset, int value) { switch (up->port.iotype) { default: - *(volatile u32 *)(up->port.membase + offset) = value; + __raw_writel(value, up->port.membase + offset); break; case UPIO_PORT: outl(value, up->port.iobase + offset); @@ -253,37 +259,22 @@ sio_quot_set(struct uart_txx9_port *up, int quot) sio_out(up, TXX9_SIBGR, 0xff | TXX9_SIBGR_BCLK_T6); } -static void serial_txx9_stop_tx(struct uart_port *port, unsigned int tty_stop) +static void serial_txx9_stop_tx(struct uart_port *port) { struct uart_txx9_port *up = (struct uart_txx9_port *)port; - unsigned long flags; - - spin_lock_irqsave(&up->port.lock, flags); sio_mask(up, TXX9_SIDICR, TXX9_SIDICR_TIE); - spin_unlock_irqrestore(&up->port.lock, flags); } -static void serial_txx9_start_tx(struct uart_port *port, unsigned int tty_start) +static void serial_txx9_start_tx(struct uart_port *port) { struct uart_txx9_port *up = (struct uart_txx9_port *)port; - unsigned long flags; - - spin_lock_irqsave(&up->port.lock, flags); sio_set(up, TXX9_SIDICR, TXX9_SIDICR_TIE); - spin_unlock_irqrestore(&up->port.lock, flags); } static void serial_txx9_stop_rx(struct uart_port *port) { struct uart_txx9_port *up = (struct uart_txx9_port *)port; - unsigned long flags; - - spin_lock_irqsave(&up->port.lock, flags); up->port.read_status_mask &= ~TXX9_SIDISR_RDIS; -#if 0 - sio_mask(up, TXX9_SIDICR, TXX9_SIDICR_RIE); -#endif - spin_unlock_irqrestore(&up->port.lock, flags); } static void serial_txx9_enable_ms(struct uart_port *port) @@ -299,20 +290,16 @@ receive_chars(struct uart_txx9_port *up, unsigned int *status, struct pt_regs *r unsigned int disr = *status; int max_count = 256; char flag; + unsigned int next_ignore_status_mask; do { - /* The following is not allowed by the tty layer and - unsafe. It should be fixed ASAP */ - if (unlikely(tty->flip.count >= TTY_FLIPBUF_SIZE)) { - if(tty->low_latency) - tty_flip_buffer_push(tty); - /* If this failed then we will throw away the - bytes but must do so to clear interrupts */ - } ch = sio_in(up, TXX9_SIRFIFO); flag = TTY_NORMAL; up->port.icount.rx++; + /* mask out RFDN_MASK bit added by previous overrun */ + next_ignore_status_mask = + up->port.ignore_status_mask & ~TXX9_SIDISR_RFDN_MASK; if (unlikely(disr & (TXX9_SIDISR_UBRK | TXX9_SIDISR_UPER | TXX9_SIDISR_UFER | TXX9_SIDISR_UOER))) { /* @@ -333,8 +320,17 @@ receive_chars(struct uart_txx9_port *up, unsigned int *status, struct pt_regs *r up->port.icount.parity++; else if (disr & TXX9_SIDISR_UFER) up->port.icount.frame++; - if (disr & TXX9_SIDISR_UOER) + if (disr & TXX9_SIDISR_UOER) { up->port.icount.overrun++; + /* + * The receiver read buffer still hold + * a char which caused overrun. + * Ignore next char by adding RFDN_MASK + * to ignore_status_mask temporarily. + */ + next_ignore_status_mask |= + TXX9_SIDISR_RFDN_MASK; + } /* * Mask off conditions which should be ingored. @@ -354,9 +350,12 @@ receive_chars(struct uart_txx9_port *up, unsigned int *status, struct pt_regs *r uart_insert_char(&up->port, disr, TXX9_SIDISR_UOER, ch, flag); ignore_char: + up->port.ignore_status_mask = next_ignore_status_mask; disr = sio_in(up, TXX9_SIDISR); } while (!(disr & TXX9_SIDISR_UVALID) && (max_count-- > 0)); + spin_unlock(&up->port.lock); tty_flip_buffer_push(tty); + spin_lock(&up->port.lock); *status = disr; } @@ -372,7 +371,7 @@ static inline void transmit_chars(struct uart_txx9_port *up) return; } if (uart_circ_empty(xmit) || uart_tx_stopped(&up->port)) { - serial_txx9_stop_tx(&up->port, 0); + serial_txx9_stop_tx(&up->port); return; } @@ -389,7 +388,7 @@ static inline void transmit_chars(struct uart_txx9_port *up) uart_write_wakeup(&up->port); if (uart_circ_empty(xmit)) - serial_txx9_stop_tx(&up->port, 0); + serial_txx9_stop_tx(&up->port); } static irqreturn_t serial_txx9_interrupt(int irq, void *dev_id, struct pt_regs *regs) @@ -442,13 +441,10 @@ static unsigned int serial_txx9_tx_empty(struct uart_port *port) static unsigned int serial_txx9_get_mctrl(struct uart_port *port) { struct uart_txx9_port *up = (struct uart_txx9_port *)port; - unsigned long flags; unsigned int ret; - spin_lock_irqsave(&up->port.lock, flags); ret = ((sio_in(up, TXX9_SIFLCR) & TXX9_SIFLCR_RTSSC) ? 0 : TIOCM_RTS) | ((sio_in(up, TXX9_SICISR) & TXX9_SICISR_CTSS) ? 0 : TIOCM_CTS); - spin_unlock_irqrestore(&up->port.lock, flags); return ret; } @@ -456,14 +452,11 @@ static unsigned int serial_txx9_get_mctrl(struct uart_port *port) static void serial_txx9_set_mctrl(struct uart_port *port, unsigned int mctrl) { struct uart_txx9_port *up = (struct uart_txx9_port *)port; - unsigned long flags; - spin_lock_irqsave(&up->port.lock, flags); if (mctrl & TIOCM_RTS) sio_mask(up, TXX9_SIFLCR, TXX9_SIFLCR_RTSSC); else sio_set(up, TXX9_SIFLCR, TXX9_SIFLCR_RTSSC); - spin_unlock_irqrestore(&up->port.lock, flags); } static void serial_txx9_break_ctl(struct uart_port *port, int break_state) @@ -487,7 +480,7 @@ static int serial_txx9_startup(struct uart_port *port) /* * Clear the FIFO buffers and disable them. - * (they will be reeanbled in set_termios()) + * (they will be reenabled in set_termios()) */ sio_set(up, TXX9_SIFCR, TXX9_SIFCR_TFRST | TXX9_SIFCR_RFRST | TXX9_SIFCR_FRSTE); @@ -502,7 +495,7 @@ static int serial_txx9_startup(struct uart_port *port) sio_out(up, TXX9_SIDISR, 0); retval = request_irq(up->port.irq, serial_txx9_interrupt, - SA_SHIRQ, "serial_txx9", up); + IRQF_SHARED, "serial_txx9", up); if (retval) return retval; @@ -670,17 +663,8 @@ serial_txx9_pm(struct uart_port *port, unsigned int state, unsigned int oldstate) { struct uart_txx9_port *up = (struct uart_txx9_port *)port; - if (state) { - /* sleep */ - - if (up->pm) - up->pm(port, state, oldstate); - } else { - /* wake */ - - if (up->pm) - up->pm(port, state, oldstate); - } + if (up->pm) + up->pm(port, state, oldstate); } static int serial_txx9_request_resource(struct uart_txx9_port *up) @@ -799,8 +783,14 @@ static void serial_txx9_config_port(struct uart_port *port, int uflags) static int serial_txx9_verify_port(struct uart_port *port, struct serial_struct *ser) { - if (ser->irq < 0 || - ser->baud_base < 9600 || ser->type != PORT_TXX9) + unsigned long new_port = ser->port; + if (HIGH_BITS_OFFSET) + new_port += (unsigned long)ser->port_high << HIGH_BITS_OFFSET; + if (ser->type != port->type || + ser->irq != port->irq || + ser->io_type != port->iotype || + new_port != port->iobase || + (unsigned long)ser->iomem_base != port->mapbase) return -EINVAL; return 0; } @@ -842,7 +832,8 @@ static void __init serial_txx9_register_ports(struct uart_driver *drv) up->port.line = i; up->port.ops = &serial_txx9_pops; - uart_add_one_port(drv, &up->port); + if (up->port.iobase || up->port.mapbase) + uart_add_one_port(drv, &up->port); } } @@ -869,6 +860,14 @@ static inline void wait_for_xmitr(struct uart_txx9_port *up) } } +static void serial_txx9_console_putchar(struct uart_port *port, int ch) +{ + struct uart_txx9_port *up = (struct uart_txx9_port *)port; + + wait_for_xmitr(up); + sio_out(up, TXX9_SITFIFO, ch); +} + /* * Print a string to the serial port trying not to disturb * any possible real use of the port... @@ -880,7 +879,6 @@ serial_txx9_console_write(struct console *co, const char *s, unsigned int count) { struct uart_txx9_port *up = &serial_txx9_ports[co->index]; unsigned int ier, flcr; - int i; /* * First save the UER then disable the interrupts @@ -894,22 +892,7 @@ serial_txx9_console_write(struct console *co, const char *s, unsigned int count) if (!(up->port.flags & UPF_CONS_FLOW) && (flcr & TXX9_SIFLCR_TES)) sio_out(up, TXX9_SIFLCR, flcr & ~TXX9_SIFLCR_TES); - /* - * Now, do each character - */ - for (i = 0; i < count; i++, s++) { - wait_for_xmitr(up); - - /* - * Send the character out. - * If a LF, also do CR... - */ - sio_out(up, TXX9_SITFIFO, *s); - if (*s == 10) { - wait_for_xmitr(up); - sio_out(up, TXX9_SITFIFO, 13); - } - } + uart_console_write(&up->port, s, count, serial_txx9_console_putchar); /* * Finally, wait for transmitter to become empty @@ -941,11 +924,6 @@ static int serial_txx9_console_setup(struct console *co, char *options) if (!port->ops) return -ENODEV; - /* - * Temporary fix. - */ - spin_lock_init(&port->lock); - /* * Disable UART interrupts, set DTR and RTS high * and set speed. @@ -982,14 +960,6 @@ static int __init serial_txx9_console_init(void) } console_initcall(serial_txx9_console_init); -static int __init serial_txx9_late_console_init(void) -{ - if (!(serial_txx9_console.flags & CON_ENABLED)) - register_console(&serial_txx9_console); - return 0; -} -late_initcall(serial_txx9_late_console_init); - #define SERIAL_TXX9_CONSOLE &serial_txx9_console #else #define SERIAL_TXX9_CONSOLE NULL @@ -998,7 +968,6 @@ late_initcall(serial_txx9_late_console_init); static struct uart_driver serial_txx9_reg = { .owner = THIS_MODULE, .driver_name = "serial_txx9", - .devfs_name = TXX9_TTY_DEVFS_NAME, .dev_name = TXX9_TTY_NAME, .major = TXX9_TTY_MAJOR, .minor = TXX9_TTY_MINOR_START, @@ -1042,6 +1011,71 @@ static void serial_txx9_resume_port(int line) uart_resume_port(&serial_txx9_reg, &serial_txx9_ports[line].port); } +static DEFINE_MUTEX(serial_txx9_mutex); + +/** + * serial_txx9_register_port - register a serial port + * @port: serial port template + * + * Configure the serial port specified by the request. + * + * The port is then probed and if necessary the IRQ is autodetected + * If this fails an error is returned. + * + * On success the port is ready to use and the line number is returned. + */ +static int __devinit serial_txx9_register_port(struct uart_port *port) +{ + int i; + struct uart_txx9_port *uart; + int ret = -ENOSPC; + + mutex_lock(&serial_txx9_mutex); + for (i = 0; i < UART_NR; i++) { + uart = &serial_txx9_ports[i]; + if (!(uart->port.iobase || uart->port.mapbase)) + break; + } + if (i < UART_NR) { + uart->port.iobase = port->iobase; + uart->port.membase = port->membase; + uart->port.irq = port->irq; + uart->port.uartclk = port->uartclk; + uart->port.iotype = port->iotype; + uart->port.flags = port->flags | UPF_BOOT_AUTOCONF; + uart->port.mapbase = port->mapbase; + if (port->dev) + uart->port.dev = port->dev; + ret = uart_add_one_port(&serial_txx9_reg, &uart->port); + if (ret == 0) + ret = uart->port.line; + } + mutex_unlock(&serial_txx9_mutex); + return ret; +} + +/** + * serial_txx9_unregister_port - remove a txx9 serial port at runtime + * @line: serial line number + * + * Remove one serial port. This may not be called from interrupt + * context. We hand the port back to the our control. + */ +static void __devexit serial_txx9_unregister_port(int line) +{ + struct uart_txx9_port *uart = &serial_txx9_ports[line]; + + mutex_lock(&serial_txx9_mutex); + uart_remove_one_port(&serial_txx9_reg, &uart->port); + uart->port.flags = 0; + uart->port.type = PORT_UNKNOWN; + uart->port.iobase = 0; + uart->port.mapbase = 0; + uart->port.membase = NULL; + uart->port.dev = NULL; + mutex_unlock(&serial_txx9_mutex); +} + /* * Probe one serial board. Unfortunately, there is no rhyme nor reason * to the arrangement of serial ports on a PCI card. @@ -1059,13 +1093,13 @@ pciserial_txx9_init_one(struct pci_dev *dev, const struct pci_device_id *ent) memset(&port, 0, sizeof(port)); port.ops = &serial_txx9_pops; - port.flags |= UPF_BOOT_AUTOCONF; /* uart_ops.config_port will be called */ port.flags |= UPF_TXX9_HAVE_CTS_LINE; port.uartclk = 66670000; port.irq = dev->irq; port.iotype = UPIO_PORT; port.iobase = pci_resource_start(dev, 1); - line = uart_register_port(&serial_txx9_reg, &port); + port.dev = &dev->dev; + line = serial_txx9_register_port(&port); if (line < 0) { printk(KERN_WARNING "Couldn't register serial port %s: %d\n", pci_name(dev), line); } @@ -1081,7 +1115,7 @@ static void __devexit pciserial_txx9_remove_one(struct pci_dev *dev) pci_set_drvdata(dev, NULL); if (line) { - uart_unregister_port(&serial_txx9_reg, line); + serial_txx9_unregister_port(line); pci_disable_device(dev); } } @@ -1092,6 +1126,8 @@ static int pciserial_txx9_suspend_one(struct pci_dev *dev, pm_message_t state) if (line) serial_txx9_suspend_port(line); + pci_save_state(dev); + pci_set_power_state(dev, pci_choose_state(dev, state)); return 0; } @@ -1099,8 +1135,13 @@ static int pciserial_txx9_resume_one(struct pci_dev *dev) { int line = (int)(long)pci_get_drvdata(dev); - if (line) + pci_set_power_state(dev, PCI_D0); + pci_restore_state(dev); + + if (line) { + pci_enable_device(dev); serial_txx9_resume_port(line); + } return 0; } @@ -1134,7 +1175,7 @@ static int __init serial_txx9_init(void) serial_txx9_register_ports(&serial_txx9_reg); #ifdef ENABLE_SERIAL_TXX9_PCI - ret = pci_module_init(&serial_txx9_pci_driver); + ret = pci_register_driver(&serial_txx9_pci_driver); #endif } return ret; @@ -1147,8 +1188,11 @@ static void __exit serial_txx9_exit(void) #ifdef ENABLE_SERIAL_TXX9_PCI pci_unregister_driver(&serial_txx9_pci_driver); #endif - for (i = 0; i < UART_NR; i++) - uart_remove_one_port(&serial_txx9_reg, &serial_txx9_ports[i].port); + for (i = 0; i < UART_NR; i++) { + struct uart_txx9_port *up = &serial_txx9_ports[i]; + if (up->port.iobase || up->port.mapbase) + uart_remove_one_port(&serial_txx9_reg, &up->port); + } uart_unregister_driver(&serial_txx9_reg); } diff --git a/drivers/serial/sh-sci.c b/drivers/serial/sh-sci.c index 44f6bf79b..cbede06ca 100644 --- a/drivers/serial/sh-sci.c +++ b/drivers/serial/sh-sci.c @@ -20,7 +20,6 @@ #undef DEBUG -#include #include #include #include @@ -842,7 +841,7 @@ static int sci_request_irq(struct sci_port *port) printk(KERN_ERR "sci: Cannot allocate irq.(IRQ=0)\n"); return -ENODEV; } - if (request_irq(port->irqs[0], sci_mpxed_interrupt, SA_INTERRUPT, + if (request_irq(port->irqs[0], sci_mpxed_interrupt, IRQF_DISABLED, "sci", port)) { printk(KERN_ERR "sci: Cannot allocate irq.\n"); return -ENODEV; @@ -851,7 +850,7 @@ static int sci_request_irq(struct sci_port *port) for (i = 0; i < ARRAY_SIZE(handlers); i++) { if (!port->irqs[i]) continue; - if (request_irq(port->irqs[i], handlers[i], SA_INTERRUPT, + if (request_irq(port->irqs[i], handlers[i], IRQF_DISABLED, desc[i], port)) { printk(KERN_ERR "sci: Cannot allocate irq.\n"); return -ENODEV; @@ -1580,7 +1579,7 @@ static int __init serial_console_setup(struct console *co, char *options) h8300_sci_enable(port, sci_enable); #endif #elif defined(CONFIG_SUPERH64) - port->uartclk = current_cpu_info.module_clock * 16; + port->uartclk = current_cpu_data.module_clock * 16; #else { struct clk *clk = clk_get("module_clk"); @@ -1699,9 +1698,6 @@ static char banner[] __initdata = static struct uart_driver sci_uart_driver = { .owner = THIS_MODULE, .driver_name = "sci", -#ifdef CONFIG_DEVFS_FS - .devfs_name = "ttsc/", -#endif .dev_name = "ttySC", .major = SCI_MAJOR, .minor = SCI_MINOR_START, @@ -1724,7 +1720,7 @@ static int __init sci_init(void) #if defined(__H8300H__) || defined(__H8300S__) sciport->port.uartclk = CONFIG_CPU_CLOCK; #elif defined(CONFIG_SUPERH64) - sciport->port.uartclk = current_cpu_info.module_clock * 16; + sciport->port.uartclk = current_cpu_data.module_clock * 16; #else struct clk *clk = clk_get("module_clk"); sciport->port.uartclk = clk_get_rate(clk) * 16; diff --git a/drivers/serial/sh-sci.h b/drivers/serial/sh-sci.h index 1f14bb438..ab320fa32 100644 --- a/drivers/serial/sh-sci.h +++ b/drivers/serial/sh-sci.h @@ -10,7 +10,6 @@ * Modified to support SH7300(SH-Mobile) SCIF. Takashi Kusuda (Jun 2003). * Modified to support H8/300 Series Yoshinori Sato (Feb 2004). */ -#include #include #if defined(__H8300H__) || defined(__H8300S__) diff --git a/drivers/serial/sn_console.c b/drivers/serial/sn_console.c index fee6418e8..2f148e5b9 100644 --- a/drivers/serial/sn_console.c +++ b/drivers/serial/sn_console.c @@ -6,7 +6,7 @@ * driver for that. * * - * Copyright (c) 2004-2005 Silicon Graphics, Inc. All Rights Reserved. + * Copyright (c) 2004-2006 Silicon Graphics, Inc. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of version 2 of the GNU General Public License @@ -37,7 +37,6 @@ * http://oss.sgi.com/projects/GenInfo/NoticeExplan */ -#include #include #include #include @@ -259,10 +258,9 @@ static unsigned int snp_tx_empty(struct uart_port *port) /** * snp_stop_tx - stop the transmitter - no-op for us * @port: Port to operat eon - we ignore - no-op function - * @tty_stop: Set to 1 if called via uart_stop * */ -static void snp_stop_tx(struct uart_port *port, unsigned int tty_stop) +static void snp_stop_tx(struct uart_port *port) { } @@ -325,10 +323,9 @@ static void snp_stop_rx(struct uart_port *port) /** * snp_start_tx - Start transmitter * @port: Port to operate on - * @tty_stop: Set to 1 if called via uart_start * */ -static void snp_start_tx(struct uart_port *port, unsigned int tty_stop) +static void snp_start_tx(struct uart_port *port) { if (sal_console_port.sc_ops->sal_wakeup_transmit) sal_console_port.sc_ops->sal_wakeup_transmit(&sal_console_port, @@ -521,11 +518,7 @@ sn_receive_chars(struct sn_cons_port *port, struct pt_regs *regs, /* record the character to pass up to the tty layer */ if (tty) { - *tty->flip.char_buf_ptr = ch; - *tty->flip.flag_buf_ptr = TTY_NORMAL; - tty->flip.char_buf_ptr++; - tty->flip.count++; - if (tty->flip.count == TTY_FLIPBUF_SIZE) + if(tty_insert_flip_char(tty, ch, TTY_NORMAL) == 0) break; } port->sc_port.icount.rx++; @@ -572,6 +565,7 @@ static void sn_transmit_chars(struct sn_cons_port *port, int raw) if (uart_circ_empty(xmit) || uart_tx_stopped(&port->sc_port)) { /* Nothing to do. */ + ia64_sn_console_intr_disable(SAL_CONSOLE_INTR_XMIT); return; } @@ -614,7 +608,7 @@ static void sn_transmit_chars(struct sn_cons_port *port, int raw) uart_write_wakeup(&port->sc_port); if (uart_circ_empty(xmit)) - snp_stop_tx(&port->sc_port, 0); /* no-op for us */ + snp_stop_tx(&port->sc_port); /* no-op for us */ } /** @@ -654,7 +648,7 @@ static irqreturn_t sn_sal_interrupt(int irq, void *dev_id, struct pt_regs *regs) static int sn_sal_connect_interrupt(struct sn_cons_port *port) { if (request_irq(SGI_UART_VECTOR, sn_sal_interrupt, - SA_INTERRUPT | SA_SHIRQ, + IRQF_DISABLED | IRQF_SHARED, "SAL console driver", port) >= 0) { return SGI_UART_VECTOR; } @@ -825,7 +819,7 @@ static int __init sn_sal_module_init(void) int retval; if (!ia64_platform_is("sn2")) - return -ENODEV; + return 0; printk(KERN_INFO "sn_console: Console driver init\n"); @@ -834,8 +828,8 @@ static int __init sn_sal_module_init(void) misc.name = DEVICE_NAME_DYNAMIC; retval = misc_register(&misc); if (retval != 0) { - printk - ("Failed to register console device using misc_register.\n"); + printk(KERN_WARNING "Failed to register console " + "device using misc_register.\n"); return -ENODEV; } sal_console_uart.major = MISC_MAJOR; @@ -947,88 +941,75 @@ sn_sal_console_write(struct console *co, const char *s, unsigned count) { unsigned long flags = 0; struct sn_cons_port *port = &sal_console_port; -#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT) static int stole_lock = 0; -#endif BUG_ON(!port->sc_is_asynch); /* We can't look at the xmit buffer if we're not registered with serial core * yet. So only do the fancy recovery after registering */ - if (port->sc_port.info) { - - /* somebody really wants this output, might be an - * oops, kdb, panic, etc. make sure they get it. */ -#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT) - if (spin_is_locked(&port->sc_port.lock)) { - int lhead = port->sc_port.info->xmit.head; - int ltail = port->sc_port.info->xmit.tail; - int counter, got_lock = 0; + if (!port->sc_port.info) { + /* Not yet registered with serial core - simple case */ + puts_raw_fixed(port->sc_ops->sal_puts_raw, s, count); + return; + } - /* - * We attempt to determine if someone has died with the - * lock. We wait ~20 secs after the head and tail ptrs - * stop moving and assume the lock holder is not functional - * and plow ahead. If the lock is freed within the time out - * period we re-get the lock and go ahead normally. We also - * remember if we have plowed ahead so that we don't have - * to wait out the time out period again - the asumption - * is that we will time out again. - */ + /* somebody really wants this output, might be an + * oops, kdb, panic, etc. make sure they get it. */ + if (spin_is_locked(&port->sc_port.lock)) { + int lhead = port->sc_port.info->xmit.head; + int ltail = port->sc_port.info->xmit.tail; + int counter, got_lock = 0; + + /* + * We attempt to determine if someone has died with the + * lock. We wait ~20 secs after the head and tail ptrs + * stop moving and assume the lock holder is not functional + * and plow ahead. If the lock is freed within the time out + * period we re-get the lock and go ahead normally. We also + * remember if we have plowed ahead so that we don't have + * to wait out the time out period again - the asumption + * is that we will time out again. + */ - for (counter = 0; counter < 150; mdelay(125), counter++) { - if (!spin_is_locked(&port->sc_port.lock) - || stole_lock) { - if (!stole_lock) { - spin_lock_irqsave(&port-> - sc_port.lock, - flags); - got_lock = 1; - } - break; - } else { - /* still locked */ - if ((lhead != - port->sc_port.info->xmit.head) - || (ltail != - port->sc_port.info->xmit. - tail)) { - lhead = - port->sc_port.info->xmit. - head; - ltail = - port->sc_port.info->xmit. - tail; - counter = 0; - } + for (counter = 0; counter < 150; mdelay(125), counter++) { + if (!spin_is_locked(&port->sc_port.lock) + || stole_lock) { + if (!stole_lock) { + spin_lock_irqsave(&port->sc_port.lock, + flags); + got_lock = 1; } - } - /* flush anything in the serial core xmit buffer, raw */ - sn_transmit_chars(port, 1); - if (got_lock) { - spin_unlock_irqrestore(&port->sc_port.lock, - flags); - stole_lock = 0; + break; } else { - /* fell thru */ - stole_lock = 1; + /* still locked */ + if ((lhead != port->sc_port.info->xmit.head) + || (ltail != + port->sc_port.info->xmit.tail)) { + lhead = + port->sc_port.info->xmit.head; + ltail = + port->sc_port.info->xmit.tail; + counter = 0; + } } - puts_raw_fixed(port->sc_ops->sal_puts_raw, s, count); - } else { - stole_lock = 0; -#endif - spin_lock_irqsave(&port->sc_port.lock, flags); - sn_transmit_chars(port, 1); + } + /* flush anything in the serial core xmit buffer, raw */ + sn_transmit_chars(port, 1); + if (got_lock) { spin_unlock_irqrestore(&port->sc_port.lock, flags); - - puts_raw_fixed(port->sc_ops->sal_puts_raw, s, count); -#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT) + stole_lock = 0; + } else { + /* fell thru */ + stole_lock = 1; } -#endif - } - else { - /* Not yet registered with serial core - simple case */ + puts_raw_fixed(port->sc_ops->sal_puts_raw, s, count); + } else { + stole_lock = 0; + spin_lock_irqsave(&port->sc_port.lock, flags); + sn_transmit_chars(port, 1); + spin_unlock_irqrestore(&port->sc_port.lock, flags); + puts_raw_fixed(port->sc_ops->sal_puts_raw, s, count); } } @@ -1092,6 +1073,7 @@ int __init sn_serial_console_early_setup(void) return -1; sal_console_port.sc_ops = &poll_ops; + spin_lock_init(&sal_console_port.sc_port.lock); early_sn_setup(); /* Find SAL entry points */ register_console(&sal_console_early); diff --git a/drivers/serial/suncore.c b/drivers/serial/suncore.c index fa4ae9424..e35d9ab35 100644 --- a/drivers/serial/suncore.c +++ b/drivers/serial/suncore.c @@ -10,7 +10,6 @@ * Copyright (C) 2002 David S. Miller (davem@redhat.com) */ -#include #include #include #include diff --git a/drivers/serial/sunhv.c b/drivers/serial/sunhv.c index f137804b3..f851f0f44 100644 --- a/drivers/serial/sunhv.c +++ b/drivers/serial/sunhv.c @@ -20,8 +20,8 @@ #include #include -#include -#include +#include +#include #include #if defined(CONFIG_MAGIC_SYSRQ) @@ -353,7 +353,6 @@ static struct uart_ops sunhv_pops = { static struct uart_driver sunhv_reg = { .owner = THIS_MODULE, .driver_name = "serial", - .devfs_name = "tts/", .dev_name = "ttyS", .major = TTY_MAJOR, }; @@ -408,143 +407,120 @@ static inline struct console *SUNHV_CONSOLE(void) return &sunhv_console; } -static int __init hv_console_compatible(char *buf, int len) -{ - while (len) { - int this_len; - - if (!strcmp(buf, "qcn")) - return 1; - - this_len = strlen(buf) + 1; - - buf += this_len; - len -= this_len; - } - - return 0; -} - -static unsigned int __init get_interrupt(void) -{ - const char *cons_str = "console"; - const char *compat_str = "compatible"; - int node = prom_getchild(sun4v_vdev_root); - char buf[64]; - int err, len; - - node = prom_searchsiblings(node, cons_str); - if (!node) - return 0; - - len = prom_getproplen(node, compat_str); - if (len == 0 || len == -1) - return 0; - - err = prom_getproperty(node, compat_str, buf, 64); - if (err == -1) - return 0; - - if (!hv_console_compatible(buf, len)) - return 0; - - /* Ok, the this is the OBP node for the sun4v hypervisor - * console device. Decode the interrupt. - */ - return sun4v_vdev_device_interrupt(node); -} - -static int __init sunhv_init(void) +static int __devinit hv_probe(struct of_device *op, const struct of_device_id *match) { struct uart_port *port; - int ret; + int err; - if (tlb_type != hypervisor) + if (op->irqs[0] == 0xffffffff) return -ENODEV; - port = kmalloc(sizeof(struct uart_port), GFP_KERNEL); + port = kzalloc(sizeof(struct uart_port), GFP_KERNEL); if (unlikely(!port)) return -ENOMEM; - memset(port, 0, sizeof(struct uart_port)); + sunhv_port = port; port->line = 0; port->ops = &sunhv_pops; port->type = PORT_SUNHV; port->uartclk = ( 29491200 / 16 ); /* arbitrary */ - /* Set this just to make uart_configure_port() happy. */ port->membase = (unsigned char __iomem *) __pa(port); - port->irq = get_interrupt(); - if (!port->irq) { - kfree(port); - return -ENODEV; - } + port->irq = op->irqs[0]; + + port->dev = &op->dev; sunhv_reg.minor = sunserial_current_minor; sunhv_reg.nr = 1; - ret = uart_register_driver(&sunhv_reg); - if (ret < 0) { - printk(KERN_ERR "SUNHV: uart_register_driver() failed %d\n", - ret); - kfree(port); - - return ret; - } + err = uart_register_driver(&sunhv_reg); + if (err) + goto out_free_port; sunhv_reg.tty_driver->name_base = sunhv_reg.minor - 64; sunserial_current_minor += 1; sunhv_reg.cons = SUNHV_CONSOLE(); - sunhv_port = port; + err = uart_add_one_port(&sunhv_reg, port); + if (err) + goto out_unregister_driver; - ret = uart_add_one_port(&sunhv_reg, port); - if (ret < 0) { - printk(KERN_ERR "SUNHV: uart_add_one_port() failed %d\n", ret); - sunserial_current_minor -= 1; - uart_unregister_driver(&sunhv_reg); - kfree(port); - sunhv_port = NULL; - return -ENODEV; - } + err = request_irq(port->irq, sunhv_interrupt, 0, "hvcons", port); + if (err) + goto out_remove_port; - if (request_irq(port->irq, sunhv_interrupt, - SA_SHIRQ, "serial(sunhv)", port)) { - printk(KERN_ERR "sunhv: Cannot register IRQ\n"); - uart_remove_one_port(&sunhv_reg, port); - sunserial_current_minor -= 1; - uart_unregister_driver(&sunhv_reg); - kfree(port); - sunhv_port = NULL; - return -ENODEV; - } + dev_set_drvdata(&op->dev, port); return 0; + +out_remove_port: + uart_remove_one_port(&sunhv_reg, port); + +out_unregister_driver: + sunserial_current_minor -= 1; + uart_unregister_driver(&sunhv_reg); + +out_free_port: + kfree(port); + sunhv_port = NULL; + return err; } -static void __exit sunhv_exit(void) +static int __devexit hv_remove(struct of_device *dev) { - struct uart_port *port = sunhv_port; - - BUG_ON(!port); + struct uart_port *port = dev_get_drvdata(&dev->dev); free_irq(port->irq, port); uart_remove_one_port(&sunhv_reg, port); - sunserial_current_minor -= 1; + sunserial_current_minor -= 1; uart_unregister_driver(&sunhv_reg); - kfree(sunhv_port); + kfree(port); sunhv_port = NULL; + + dev_set_drvdata(&dev->dev, NULL); + + return 0; +} + +static struct of_device_id hv_match[] = { + { + .name = "console", + .compatible = "qcn", + }, + {}, +}; +MODULE_DEVICE_TABLE(of, hv_match); + +static struct of_platform_driver hv_driver = { + .name = "hv", + .match_table = hv_match, + .probe = hv_probe, + .remove = __devexit_p(hv_remove), +}; + +static int __init sunhv_init(void) +{ + if (tlb_type != hypervisor) + return -ENODEV; + + return of_register_driver(&hv_driver, &of_bus_type); +} + +static void __exit sunhv_exit(void) +{ + of_unregister_driver(&hv_driver); } module_init(sunhv_init); module_exit(sunhv_exit); MODULE_AUTHOR("David S. Miller"); -MODULE_DESCRIPTION("SUN4V Hypervisor console driver") +MODULE_DESCRIPTION("SUN4V Hypervisor console driver"); +MODULE_VERSION("2.0"); MODULE_LICENSE("GPL"); diff --git a/drivers/serial/sunsab.c b/drivers/serial/sunsab.c index bfbe9dc90..cfe20f730 100644 --- a/drivers/serial/sunsab.c +++ b/drivers/serial/sunsab.c @@ -1,7 +1,7 @@ /* sunsab.c: ASYNC Driver for the SIEMENS SAB82532 DUSCC. * * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) - * Copyright (C) 2002 David S. Miller (davem@redhat.com) + * Copyright (C) 2002, 2006 David S. Miller (davem@davemloft.net) * * Rewrote buffer handling to use CIRC(Circular Buffer) macros. * Maxim Krasnyanskiy @@ -12,10 +12,9 @@ * Theodore Ts'o , 2001-Oct-12 * * Ported to new 2.5.x UART layer. - * David S. Miller + * David S. Miller */ -#include #include #include #include @@ -37,8 +36,8 @@ #include #include -#include -#include +#include +#include #if defined(CONFIG_SERIAL_SUNZILOG_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #define SUPPORT_SYSRQ @@ -851,7 +850,6 @@ static struct uart_ops sunsab_pops = { static struct uart_driver sunsab_reg = { .owner = THIS_MODULE, .driver_name = "serial", - .devfs_name = "tts/", .dev_name = "ttyS", .major = TTY_MAJOR, }; @@ -888,6 +886,15 @@ static int sunsab_console_setup(struct console *con, char *options) unsigned long flags; unsigned int baud, quot; + /* + * The console framework calls us for each and every port + * registered. Defer the console setup until the requested + * port has been properly discovered. A bit of a hack, + * though... + */ + if (up->port.type != PORT_SUNSAB) + return -1; + printk("Console: ttyS%d (SAB82532)\n", (sunsab_reg.minor - 64) + con->index); @@ -977,199 +984,189 @@ static inline struct console *SUNSAB_CONSOLE(void) #define sunsab_console_init() do { } while (0) #endif -static void __init for_each_sab_edev(void (*callback)(struct linux_ebus_device *, void *), void *arg) +static int __devinit sunsab_init_one(struct uart_sunsab_port *up, + struct of_device *op, + unsigned long offset, + int line) { - struct linux_ebus *ebus; - struct linux_ebus_device *edev = NULL; - - for_each_ebus(ebus) { - for_each_ebusdev(edev, ebus) { - if (!strcmp(edev->prom_name, "se")) { - callback(edev, arg); - continue; - } else if (!strcmp(edev->prom_name, "serial")) { - char compat[32]; - int clen; - - /* On RIO this can be an SE, check it. We could - * just check ebus->is_rio, but this is more portable. - */ - clen = prom_getproperty(edev->prom_node, "compatible", - compat, sizeof(compat)); - if (clen > 0) { - if (strncmp(compat, "sab82532", 8) == 0) { - callback(edev, arg); - continue; - } - } - } - } - } -} + up->port.line = line; + up->port.dev = &op->dev; + + up->port.mapbase = op->resource[0].start + offset; + up->port.membase = of_ioremap(&op->resource[0], offset, + sizeof(union sab82532_async_regs), + "sab"); + if (!up->port.membase) + return -ENOMEM; + up->regs = (union sab82532_async_regs __iomem *) up->port.membase; -static void __init sab_count_callback(struct linux_ebus_device *edev, void *arg) -{ - int *count_p = arg; + up->port.irq = op->irqs[0]; - (*count_p)++; -} + up->port.fifosize = SAB82532_XMIT_FIFO_SIZE; + up->port.iotype = UPIO_MEM; -static void __init sab_attach_callback(struct linux_ebus_device *edev, void *arg) -{ - int *instance_p = arg; - struct uart_sunsab_port *up; - unsigned long regs, offset; - int i; + writeb(SAB82532_IPC_IC_ACT_LOW, &up->regs->w.ipc); - /* Note: ports are located in reverse order */ - regs = edev->resource[0].start; - offset = sizeof(union sab82532_async_regs); - for (i = 0; i < 2; i++) { - up = &sunsab_ports[(*instance_p * 2) + 1 - i]; + up->port.ops = &sunsab_pops; + up->port.type = PORT_SUNSAB; + up->port.uartclk = SAB_BASE_BAUD; - memset(up, 0, sizeof(*up)); - up->regs = ioremap(regs + offset, sizeof(union sab82532_async_regs)); - up->port.irq = edev->irqs[0]; - up->port.fifosize = SAB82532_XMIT_FIFO_SIZE; - up->port.mapbase = (unsigned long)up->regs; - up->port.iotype = UPIO_MEM; + up->type = readb(&up->regs->r.vstr) & 0x0f; + writeb(~((1 << 1) | (1 << 2) | (1 << 4)), &up->regs->w.pcr); + writeb(0xff, &up->regs->w.pim); + if ((up->port.line & 0x1) == 0) { + up->pvr_dsr_bit = (1 << 0); + up->pvr_dtr_bit = (1 << 1); + } else { + up->pvr_dsr_bit = (1 << 3); + up->pvr_dtr_bit = (1 << 2); + } + up->cached_pvr = (1 << 1) | (1 << 2) | (1 << 4); + writeb(up->cached_pvr, &up->regs->w.pvr); + up->cached_mode = readb(&up->regs->rw.mode); + up->cached_mode |= SAB82532_MODE_FRTS; + writeb(up->cached_mode, &up->regs->rw.mode); + up->cached_mode |= SAB82532_MODE_RTS; + writeb(up->cached_mode, &up->regs->rw.mode); - writeb(SAB82532_IPC_IC_ACT_LOW, &up->regs->w.ipc); + up->tec_timeout = SAB82532_MAX_TEC_TIMEOUT; + up->cec_timeout = SAB82532_MAX_CEC_TIMEOUT; - offset -= sizeof(union sab82532_async_regs); + if (!(up->port.line & 0x01)) { + int err; + + err = request_irq(up->port.irq, sunsab_interrupt, + IRQF_SHARED, "sab", up); + if (err) { + of_iounmap(up->port.membase, + sizeof(union sab82532_async_regs)); + return err; + } } - - (*instance_p)++; + + return 0; } -static int __init probe_for_sabs(void) +static int __devinit sab_probe(struct of_device *op, const struct of_device_id *match) { - int this_sab = 0; + static int inst; + struct uart_sunsab_port *up; + int err; + + up = &sunsab_ports[inst * 2]; + + err = sunsab_init_one(&up[0], op, + 0, + (inst * 2) + 0); + if (err) + return err; + + err = sunsab_init_one(&up[1], op, + sizeof(union sab82532_async_regs), + (inst * 2) + 1); + if (err) { + of_iounmap(up[0].port.membase, + sizeof(union sab82532_async_regs)); + free_irq(up[0].port.irq, &up[0]); + return err; + } - /* Find device instances. */ - for_each_sab_edev(&sab_count_callback, &this_sab); - if (!this_sab) - return -ENODEV; + uart_add_one_port(&sunsab_reg, &up[0].port); + uart_add_one_port(&sunsab_reg, &up[1].port); - /* Allocate tables. */ - sunsab_ports = kmalloc(sizeof(struct uart_sunsab_port) * this_sab * 2, - GFP_KERNEL); - if (!sunsab_ports) - return -ENOMEM; + dev_set_drvdata(&op->dev, &up[0]); - num_channels = this_sab * 2; + inst++; - this_sab = 0; - for_each_sab_edev(&sab_attach_callback, &this_sab); return 0; } -static void __init sunsab_init_hw(void) +static void __devexit sab_remove_one(struct uart_sunsab_port *up) { - int i; - - for (i = 0; i < num_channels; i++) { - struct uart_sunsab_port *up = &sunsab_ports[i]; - - up->port.line = i; - up->port.ops = &sunsab_pops; - up->port.type = PORT_SUNSAB; - up->port.uartclk = SAB_BASE_BAUD; - - up->type = readb(&up->regs->r.vstr) & 0x0f; - writeb(~((1 << 1) | (1 << 2) | (1 << 4)), &up->regs->w.pcr); - writeb(0xff, &up->regs->w.pim); - if (up->port.line == 0) { - up->pvr_dsr_bit = (1 << 0); - up->pvr_dtr_bit = (1 << 1); - } else { - up->pvr_dsr_bit = (1 << 3); - up->pvr_dtr_bit = (1 << 2); - } - up->cached_pvr = (1 << 1) | (1 << 2) | (1 << 4); - writeb(up->cached_pvr, &up->regs->w.pvr); - up->cached_mode = readb(&up->regs->rw.mode); - up->cached_mode |= SAB82532_MODE_FRTS; - writeb(up->cached_mode, &up->regs->rw.mode); - up->cached_mode |= SAB82532_MODE_RTS; - writeb(up->cached_mode, &up->regs->rw.mode); - - up->tec_timeout = SAB82532_MAX_TEC_TIMEOUT; - up->cec_timeout = SAB82532_MAX_CEC_TIMEOUT; - - if (!(up->port.line & 0x01)) { - if (request_irq(up->port.irq, sunsab_interrupt, - SA_SHIRQ, "serial(sab82532)", up)) { - printk("sunsab%d: can't get IRQ %x\n", - i, up->port.irq); - continue; - } - } - } + uart_remove_one_port(&sunsab_reg, &up->port); + if (!(up->port.line & 1)) + free_irq(up->port.irq, up); + of_iounmap(up->port.membase, + sizeof(union sab82532_async_regs)); } -static int __init sunsab_init(void) +static int __devexit sab_remove(struct of_device *op) { - int ret = probe_for_sabs(); - int i; + struct uart_sunsab_port *up = dev_get_drvdata(&op->dev); - if (ret < 0) - return ret; + sab_remove_one(&up[0]); + sab_remove_one(&up[1]); - sunsab_init_hw(); + dev_set_drvdata(&op->dev, NULL); - sunsab_reg.minor = sunserial_current_minor; - sunsab_reg.nr = num_channels; - - ret = uart_register_driver(&sunsab_reg); - if (ret < 0) { - int i; + return 0; +} - for (i = 0; i < num_channels; i++) { - struct uart_sunsab_port *up = &sunsab_ports[i]; +static struct of_device_id sab_match[] = { + { + .name = "se", + }, + { + .name = "serial", + .compatible = "sab82532", + }, + {}, +}; +MODULE_DEVICE_TABLE(of, sab_match); - if (!(up->port.line & 0x01)) - free_irq(up->port.irq, up); - iounmap(up->regs); - } - kfree(sunsab_ports); - sunsab_ports = NULL; +static struct of_platform_driver sab_driver = { + .name = "sab", + .match_table = sab_match, + .probe = sab_probe, + .remove = __devexit_p(sab_remove), +}; - return ret; +static int __init sunsab_init(void) +{ + struct device_node *dp; + int err; + + num_channels = 0; + for_each_node_by_name(dp, "se") + num_channels += 2; + for_each_node_by_name(dp, "serial") { + if (of_device_is_compatible(dp, "sab82532")) + num_channels += 2; } - sunsab_reg.tty_driver->name_base = sunsab_reg.minor - 64; + if (num_channels) { + sunsab_ports = kzalloc(sizeof(struct uart_sunsab_port) * + num_channels, GFP_KERNEL); + if (!sunsab_ports) + return -ENOMEM; - sunsab_reg.cons = SUNSAB_CONSOLE(); + sunsab_reg.minor = sunserial_current_minor; + sunsab_reg.nr = num_channels; - sunserial_current_minor += num_channels; - - for (i = 0; i < num_channels; i++) { - struct uart_sunsab_port *up = &sunsab_ports[i]; + err = uart_register_driver(&sunsab_reg); + if (err) { + kfree(sunsab_ports); + sunsab_ports = NULL; + + return err; + } - uart_add_one_port(&sunsab_reg, &up->port); + sunsab_reg.tty_driver->name_base = sunsab_reg.minor - 64; + sunsab_reg.cons = SUNSAB_CONSOLE(); + sunserial_current_minor += num_channels; } - return 0; + return of_register_driver(&sab_driver, &of_bus_type); } static void __exit sunsab_exit(void) { - int i; - - for (i = 0; i < num_channels; i++) { - struct uart_sunsab_port *up = &sunsab_ports[i]; - - uart_remove_one_port(&sunsab_reg, &up->port); - - if (!(up->port.line & 0x01)) - free_irq(up->port.irq, up); - iounmap(up->regs); + of_unregister_driver(&sab_driver); + if (num_channels) { + sunserial_current_minor -= num_channels; + uart_unregister_driver(&sunsab_reg); } - sunserial_current_minor -= num_channels; - uart_unregister_driver(&sunsab_reg); - kfree(sunsab_ports); sunsab_ports = NULL; } diff --git a/drivers/serial/sunsu.c b/drivers/serial/sunsu.c index 2b4f96541..d3a5aeee7 100644 --- a/drivers/serial/sunsu.c +++ b/drivers/serial/sunsu.c @@ -12,10 +12,9 @@ * Theodore Ts'o , 2001-Oct-12 * * Converted to new 2.5.x UART layer. - * David S. Miller (davem@redhat.com), 2002-Jul-29 + * David S. Miller (davem@davemloft.net), 2002-Jul-29 */ -#include #include #include #include @@ -40,11 +39,8 @@ #include #include -#include -#include -#ifdef CONFIG_SPARC64 -#include -#endif +#include +#include #if defined(CONFIG_SERIAL_SUNSU_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #define SUPPORT_SYSRQ @@ -94,10 +90,10 @@ struct uart_sunsu_port { /* Probing information. */ enum su_type su_type; unsigned int type_probed; /* XXX Stupid */ - int port_node; + unsigned long reg_size; #ifdef CONFIG_SERIO - struct serio *serio; + struct serio serio; int serio_open; #endif }; @@ -509,7 +505,7 @@ static void receive_kbd_ms_chars(struct uart_sunsu_port *up, struct pt_regs *reg /* Stop-A is handled by drivers/char/keyboard.c now. */ if (up->su_type == SU_PORT_KBD) { #ifdef CONFIG_SERIO - serio_interrupt(up->serio, ch, 0, regs); + serio_interrupt(&up->serio, ch, 0, regs); #endif } else if (up->su_type == SU_PORT_MS) { int ret = suncore_mouse_baud_detection(ch, is_break); @@ -523,7 +519,7 @@ static void receive_kbd_ms_chars(struct uart_sunsu_port *up, struct pt_regs *reg case 0: #ifdef CONFIG_SERIO - serio_interrupt(up->serio, ch, 0, regs); + serio_interrupt(&up->serio, ch, 0, regs); #endif break; }; @@ -671,10 +667,10 @@ static int sunsu_startup(struct uart_port *port) if (up->su_type != SU_PORT_PORT) { retval = request_irq(up->port.irq, sunsu_kbd_ms_interrupt, - SA_SHIRQ, su_typev[up->su_type], up); + IRQF_SHARED, su_typev[up->su_type], up); } else { retval = request_irq(up->port.irq, sunsu_serial_interrupt, - SA_SHIRQ, su_typev[up->su_type], up); + IRQF_SHARED, su_typev[up->su_type], up); } if (retval) { printk("su: Cannot register IRQ %d\n", up->port.irq); @@ -1031,99 +1027,14 @@ static void sunsu_autoconfig(struct uart_sunsu_port *up) { unsigned char status1, status2, scratch, scratch2, scratch3; unsigned char save_lcr, save_mcr; - struct linux_ebus_device *dev = NULL; - struct linux_ebus *ebus; -#ifdef CONFIG_SPARC64 - struct sparc_isa_bridge *isa_br; - struct sparc_isa_device *isa_dev; -#endif -#ifndef CONFIG_SPARC64 - struct linux_prom_registers reg0; -#endif unsigned long flags; - if (!up->port_node || !up->su_type) + if (up->su_type == SU_PORT_NONE) return; up->type_probed = PORT_UNKNOWN; up->port.iotype = UPIO_MEM; - /* - * First we look for Ebus-bases su's - */ - for_each_ebus(ebus) { - for_each_ebusdev(dev, ebus) { - if (dev->prom_node == up->port_node) { - /* - * The EBus is broken on sparc; it delivers - * virtual addresses in resources. Oh well... - * This is correct on sparc64, though. - */ - up->port.membase = (char *) dev->resource[0].start; - /* - * This is correct on both architectures. - */ - up->port.mapbase = dev->resource[0].start; - up->port.irq = dev->irqs[0]; - goto ebus_done; - } - } - } - -#ifdef CONFIG_SPARC64 - for_each_isa(isa_br) { - for_each_isadev(isa_dev, isa_br) { - if (isa_dev->prom_node == up->port_node) { - /* Same on sparc64. Cool architecure... */ - up->port.membase = (char *) isa_dev->resource.start; - up->port.mapbase = isa_dev->resource.start; - up->port.irq = isa_dev->irq; - goto ebus_done; - } - } - } -#endif - -#ifdef CONFIG_SPARC64 - /* - * Not on Ebus, bailing. - */ - return; -#else - /* - * Not on Ebus, must be OBIO. - */ - if (prom_getproperty(up->port_node, "reg", - (char *)®0, sizeof(reg0)) == -1) { - prom_printf("sunsu: no \"reg\" property\n"); - return; - } - prom_apply_obio_ranges(®0, 1); - if (reg0.which_io != 0) { /* Just in case... */ - prom_printf("sunsu: bus number nonzero: 0x%x:%x\n", - reg0.which_io, reg0.phys_addr); - return; - } - up->port.mapbase = reg0.phys_addr; - if ((up->port.membase = ioremap(reg0.phys_addr, reg0.reg_size)) == 0) { - prom_printf("sunsu: Cannot map registers.\n"); - return; - } - - /* - * 0x20 is sun4m thing, Dave Redman heritage. - * See arch/sparc/kernel/irq.c. - */ -#define IRQ_4M(n) ((n)|0x20) - - /* - * There is no intr property on MrCoffee, so hardwire it. - */ - up->port.irq = IRQ_4M(13); -#endif - -ebus_done: - spin_lock_irqsave(&up->port.lock, flags); if (!(up->port.flags & UPF_BUGGY_UART)) { @@ -1265,23 +1176,17 @@ out: static struct uart_driver sunsu_reg = { .owner = THIS_MODULE, .driver_name = "serial", - .devfs_name = "tts/", .dev_name = "ttyS", .major = TTY_MAJOR, }; -static int __init sunsu_kbd_ms_init(struct uart_sunsu_port *up, int channel) +static int __init sunsu_kbd_ms_init(struct uart_sunsu_port *up) { int quot, baud; #ifdef CONFIG_SERIO struct serio *serio; #endif - spin_lock_init(&up->port.lock); - up->port.line = channel; - up->port.type = PORT_UNKNOWN; - up->port.uartclk = (SU_BASE_BAUD * 16); - if (up->su_type == SU_PORT_KBD) { up->cflag = B1200 | CS8 | CLOCAL | CREAD; baud = 1200; @@ -1293,41 +1198,36 @@ static int __init sunsu_kbd_ms_init(struct uart_sunsu_port *up, int channel) sunsu_autoconfig(up); if (up->port.type == PORT_UNKNOWN) - return -1; + return -ENODEV; - printk(KERN_INFO "su%d at 0x%p (irq = %s) is a %s\n", - channel, - up->port.membase, __irq_itoa(up->port.irq), - sunsu_type(&up->port)); + printk("%s: %s port at %lx, irq %u\n", + to_of_device(up->port.dev)->node->full_name, + (up->su_type == SU_PORT_KBD) ? "Keyboard" : "Mouse", + up->port.mapbase, up->port.irq); #ifdef CONFIG_SERIO - up->serio = serio = kmalloc(sizeof(struct serio), GFP_KERNEL); - if (serio) { - memset(serio, 0, sizeof(*serio)); - - serio->port_data = up; - - serio->id.type = SERIO_RS232; - if (up->su_type == SU_PORT_KBD) { - serio->id.proto = SERIO_SUNKBD; - strlcpy(serio->name, "sukbd", sizeof(serio->name)); - } else { - serio->id.proto = SERIO_SUN; - serio->id.extra = 1; - strlcpy(serio->name, "sums", sizeof(serio->name)); - } - strlcpy(serio->phys, (channel == 0 ? "su/serio0" : "su/serio1"), - sizeof(serio->phys)); + serio = &up->serio; + serio->port_data = up; - serio->write = sunsu_serio_write; - serio->open = sunsu_serio_open; - serio->close = sunsu_serio_close; - - serio_register_port(serio); + serio->id.type = SERIO_RS232; + if (up->su_type == SU_PORT_KBD) { + serio->id.proto = SERIO_SUNKBD; + strlcpy(serio->name, "sukbd", sizeof(serio->name)); } else { - printk(KERN_WARNING "su%d: not enough memory for serio port\n", - channel); + serio->id.proto = SERIO_SUN; + serio->id.extra = 1; + strlcpy(serio->name, "sums", sizeof(serio->name)); } + strlcpy(serio->phys, + (!(up->port.line & 1) ? "su/serio0" : "su/serio1"), + sizeof(serio->phys)); + + serio->write = sunsu_serio_write; + serio->open = sunsu_serio_open; + serio->close = sunsu_serio_close; + serio->dev.parent = up->port.dev; + + serio_register_port(serio); #endif sunsu_change_speed(&up->port, up->cflag, 0, quot); @@ -1459,22 +1359,20 @@ static struct console sunsu_cons = { * Register console. */ -static inline struct console *SUNSU_CONSOLE(void) +static inline struct console *SUNSU_CONSOLE(int num_uart) { int i; if (con_is_present()) return NULL; - for (i = 0; i < UART_NR; i++) { + for (i = 0; i < num_uart; i++) { int this_minor = sunsu_reg.minor + i; if ((this_minor - 64) == (serial_console - 1)) break; } - if (i == UART_NR) - return NULL; - if (sunsu_ports[i].port_node == 0) + if (i == num_uart) return NULL; sunsu_cons.index = i; @@ -1482,252 +1380,203 @@ static inline struct console *SUNSU_CONSOLE(void) return &sunsu_cons; } #else -#define SUNSU_CONSOLE() (NULL) +#define SUNSU_CONSOLE(num_uart) (NULL) #define sunsu_serial_console_init() do { } while (0) #endif -static int __init sunsu_serial_init(void) +static enum su_type __devinit su_get_type(struct device_node *dp) { - int instance, ret, i; + struct device_node *ap = of_find_node_by_path("/aliases"); - /* How many instances do we need? */ - instance = 0; - for (i = 0; i < UART_NR; i++) { - struct uart_sunsu_port *up = &sunsu_ports[i]; + if (ap) { + char *keyb = of_get_property(ap, "keyboard", NULL); + char *ms = of_get_property(ap, "mouse", NULL); - if (up->su_type == SU_PORT_MS || - up->su_type == SU_PORT_KBD) - continue; - - spin_lock_init(&up->port.lock); - up->port.flags |= UPF_BOOT_AUTOCONF; - up->port.type = PORT_UNKNOWN; - up->port.uartclk = (SU_BASE_BAUD * 16); + if (keyb) { + if (dp == of_find_node_by_path(keyb)) + return SU_PORT_KBD; + } + if (ms) { + if (dp == of_find_node_by_path(ms)) + return SU_PORT_MS; + } + } - sunsu_autoconfig(up); - if (up->port.type == PORT_UNKNOWN) - continue; + return SU_PORT_PORT; +} - up->port.line = instance++; - up->port.ops = &sunsu_pops; +static int __devinit su_probe(struct of_device *op, const struct of_device_id *match) +{ + static int inst; + struct device_node *dp = op->node; + struct uart_sunsu_port *up; + struct resource *rp; + enum su_type type; + int err; + + type = su_get_type(dp); + if (type == SU_PORT_PORT) { + if (inst >= UART_NR) + return -EINVAL; + up = &sunsu_ports[inst]; + } else { + up = kzalloc(sizeof(*up), GFP_KERNEL); + if (!up) + return -ENOMEM; } - sunsu_reg.minor = sunserial_current_minor; + up->port.line = inst; - sunsu_reg.nr = instance; - - ret = uart_register_driver(&sunsu_reg); - if (ret < 0) - return ret; + spin_lock_init(&up->port.lock); - sunsu_reg.tty_driver->name_base = sunsu_reg.minor - 64; + up->su_type = type; - sunserial_current_minor += instance; + rp = &op->resource[0]; + up->port.mapbase = rp->start; + up->reg_size = (rp->end - rp->start) + 1; + up->port.membase = of_ioremap(rp, 0, up->reg_size, "su"); + if (!up->port.membase) { + if (type != SU_PORT_PORT) + kfree(up); + return -ENOMEM; + } - sunsu_reg.cons = SUNSU_CONSOLE(); + up->port.irq = op->irqs[0]; - for (i = 0; i < UART_NR; i++) { - struct uart_sunsu_port *up = &sunsu_ports[i]; + up->port.dev = &op->dev; - /* Do not register Keyboard/Mouse lines with UART - * layer. - */ - if (up->su_type == SU_PORT_MS || - up->su_type == SU_PORT_KBD) - continue; + up->port.type = PORT_UNKNOWN; + up->port.uartclk = (SU_BASE_BAUD * 16); - if (up->port.type == PORT_UNKNOWN) - continue; + err = 0; + if (up->su_type == SU_PORT_KBD || up->su_type == SU_PORT_MS) { + err = sunsu_kbd_ms_init(up); + if (err) { + kfree(up); + goto out_unmap; + } + dev_set_drvdata(&op->dev, up); - uart_add_one_port(&sunsu_reg, &up->port); + return 0; } - return 0; -} + up->port.flags |= UPF_BOOT_AUTOCONF; -static int su_node_ok(int node, char *name, int namelen) -{ - if (strncmp(name, "su", namelen) == 0 || - strncmp(name, "su_pnp", namelen) == 0) - return 1; - - if (strncmp(name, "serial", namelen) == 0) { - char compat[32]; - int clen; - - /* Is it _really_ a 'su' device? */ - clen = prom_getproperty(node, "compatible", compat, sizeof(compat)); - if (clen > 0) { - if (strncmp(compat, "sab82532", 8) == 0) { - /* Nope, Siemens serial, not for us. */ - return 0; - } - } - return 1; - } + sunsu_autoconfig(up); - return 0; -} + err = -ENODEV; + if (up->port.type == PORT_UNKNOWN) + goto out_unmap; -#define SU_PROPSIZE 128 + up->port.ops = &sunsu_pops; -/* - * Scan status structure. - * "prop" is a local variable but it eats stack to keep it in each - * stack frame of a recursive procedure. - */ -struct su_probe_scan { - int msnode, kbnode; /* PROM nodes for mouse and keyboard */ - int msx, kbx; /* minors for mouse and keyboard */ - int devices; /* scan index */ - char prop[SU_PROPSIZE]; -}; + err = uart_add_one_port(&sunsu_reg, &up->port); + if (err) + goto out_unmap; -/* - * We have several platforms which present 'su' in different parts - * of the device tree. 'su' may be found under obio, ebus, isa and pci. - * We walk over the tree and find them wherever PROM hides them. - */ -static void __init su_probe_any(struct su_probe_scan *t, int sunode) -{ - struct uart_sunsu_port *up; - int len; + dev_set_drvdata(&op->dev, up); - if (t->devices >= UART_NR) - return; + inst++; - for (; sunode != 0; sunode = prom_getsibling(sunode)) { - len = prom_getproperty(sunode, "name", t->prop, SU_PROPSIZE); - if (len <= 1) - continue; /* Broken PROM node */ - - if (su_node_ok(sunode, t->prop, len)) { - up = &sunsu_ports[t->devices]; - if (t->kbnode != 0 && sunode == t->kbnode) { - t->kbx = t->devices; - up->su_type = SU_PORT_KBD; - } else if (t->msnode != 0 && sunode == t->msnode) { - t->msx = t->devices; - up->su_type = SU_PORT_MS; - } else { -#ifdef CONFIG_SPARC64 - /* - * Do not attempt to use the truncated - * keyboard/mouse ports as serial ports - * on Ultras with PC keyboard attached. - */ - if (prom_getbool(sunode, "mouse")) - continue; - if (prom_getbool(sunode, "keyboard")) - continue; -#endif - up->su_type = SU_PORT_PORT; - } - up->port_node = sunode; - ++t->devices; - } else { - su_probe_any(t, prom_getchild(sunode)); - } - } + return 0; + +out_unmap: + of_iounmap(up->port.membase, up->reg_size); + return err; } -static int __init sunsu_probe(void) +static int __devexit su_remove(struct of_device *dev) { - int node; - int len; - struct su_probe_scan scan; + struct uart_sunsu_port *up = dev_get_drvdata(&dev->dev);; - /* - * First, we scan the tree. - */ - scan.devices = 0; - scan.msx = -1; - scan.kbx = -1; - scan.kbnode = 0; - scan.msnode = 0; + if (up->su_type == SU_PORT_MS || + up->su_type == SU_PORT_KBD) { +#ifdef CONFIG_SERIO + serio_unregister_port(&up->serio); +#endif + kfree(up); + } else if (up->port.type != PORT_UNKNOWN) { + uart_remove_one_port(&sunsu_reg, &up->port); + } - /* - * Get the nodes for keyboard and mouse from 'aliases'... - */ - node = prom_getchild(prom_root_node); - node = prom_searchsiblings(node, "aliases"); - if (node != 0) { - len = prom_getproperty(node, "keyboard", scan.prop, SU_PROPSIZE); - if (len > 0) { - scan.prop[len] = 0; - scan.kbnode = prom_finddevice(scan.prop); - } + dev_set_drvdata(&dev->dev, NULL); - len = prom_getproperty(node, "mouse", scan.prop, SU_PROPSIZE); - if (len > 0) { - scan.prop[len] = 0; - scan.msnode = prom_finddevice(scan.prop); - } - } + return 0; +} - su_probe_any(&scan, prom_getchild(prom_root_node)); +static struct of_device_id su_match[] = { + { + .name = "su", + }, + { + .name = "su_pnp", + }, + { + .name = "serial", + .compatible = "su", + }, + {}, +}; +MODULE_DEVICE_TABLE(of, su_match); - /* - * Second, we process the special case of keyboard and mouse. - * - * Currently if we got keyboard and mouse hooked to "su" ports - * we do not use any possible remaining "su" as a serial port. - * Thus, we ignore values of .msx and .kbx, then compact ports. - */ - if (scan.msx != -1 && scan.kbx != -1) { - sunsu_ports[0].su_type = SU_PORT_MS; - sunsu_ports[0].port_node = scan.msnode; - sunsu_kbd_ms_init(&sunsu_ports[0], 0); +static struct of_platform_driver su_driver = { + .name = "su", + .match_table = su_match, + .probe = su_probe, + .remove = __devexit_p(su_remove), +}; - sunsu_ports[1].su_type = SU_PORT_KBD; - sunsu_ports[1].port_node = scan.kbnode; - sunsu_kbd_ms_init(&sunsu_ports[1], 1); +static int num_uart; - return 0; - } +static int __init sunsu_init(void) +{ + struct device_node *dp; + int err; - if (scan.msx != -1 || scan.kbx != -1) { - printk("sunsu_probe: cannot match keyboard and mouse, confused\n"); - return -ENODEV; + num_uart = 0; + for_each_node_by_name(dp, "su") { + if (su_get_type(dp) == SU_PORT_PORT) + num_uart++; + } + for_each_node_by_name(dp, "su_pnp") { + if (su_get_type(dp) == SU_PORT_PORT) + num_uart++; + } + for_each_node_by_name(dp, "serial") { + if (of_device_is_compatible(dp, "su")) { + if (su_get_type(dp) == SU_PORT_PORT) + num_uart++; + } } - if (scan.devices == 0) - return -ENODEV; + if (num_uart) { + sunsu_reg.minor = sunserial_current_minor; + sunsu_reg.nr = num_uart; + err = uart_register_driver(&sunsu_reg); + if (err) + return err; + sunsu_reg.tty_driver->name_base = sunsu_reg.minor - 64; + sunserial_current_minor += num_uart; + sunsu_reg.cons = SUNSU_CONSOLE(num_uart); + } - /* - * Console must be initiated after the generic initialization. - */ - sunsu_serial_init(); + err = of_register_driver(&su_driver, &of_bus_type); + if (err && num_uart) + uart_unregister_driver(&sunsu_reg); - return 0; + return err; } static void __exit sunsu_exit(void) { - int i, saw_uart; - - saw_uart = 0; - for (i = 0; i < UART_NR; i++) { - struct uart_sunsu_port *up = &sunsu_ports[i]; - - if (up->su_type == SU_PORT_MS || - up->su_type == SU_PORT_KBD) { -#ifdef CONFIG_SERIO - if (up->serio) { - serio_unregister_port(up->serio); - up->serio = NULL; - } -#endif - } else if (up->port.type != PORT_UNKNOWN) { - uart_remove_one_port(&sunsu_reg, &up->port); - saw_uart++; - } - } - - if (saw_uart) + if (num_uart) uart_unregister_driver(&sunsu_reg); } -module_init(sunsu_probe); +module_init(sunsu_init); module_exit(sunsu_exit); + +MODULE_AUTHOR("Eddie C. Dost, Peter Zaitcev, and David S. Miller"); +MODULE_DESCRIPTION("Sun SU serial port driver"); +MODULE_VERSION("2.0"); MODULE_LICENSE("GPL"); diff --git a/drivers/serial/sunzilog.c b/drivers/serial/sunzilog.c index cd49ebbf4..d34f336d5 100644 --- a/drivers/serial/sunzilog.c +++ b/drivers/serial/sunzilog.c @@ -1,5 +1,4 @@ -/* - * sunzilog.c +/* sunzilog.c: Zilog serial driver for Sparc systems. * * Driver for Zilog serial chips found on Sun workstations and * servers. This driver could actually be made more generic. @@ -10,10 +9,9 @@ * C. Dost, Pete Zaitcev, Ted Ts'o and Alex Buell for their * work there. * - * Copyright (C) 2002 David S. Miller (davem@redhat.com) + * Copyright (C) 2002, 2006 David S. Miller (davem@davemloft.net) */ -#include #include #include #include @@ -38,10 +36,8 @@ #include #include -#ifdef CONFIG_SPARC64 -#include -#endif -#include +#include +#include #if defined(CONFIG_SERIAL_SUNZILOG_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #define SUPPORT_SYSRQ @@ -65,16 +61,13 @@ #define ZSDELAY() #define ZSDELAY_LONG() #define ZS_WSYNC(__channel) \ - sbus_readb(&((__channel)->control)) + readb(&((__channel)->control)) #endif static int num_sunzilog; #define NUM_SUNZILOG num_sunzilog #define NUM_CHANNELS (NUM_SUNZILOG * 2) -#define KEYBOARD_LINE 0x2 -#define MOUSE_LINE 0x3 - #define ZS_CLOCK 4915200 /* Zilog input clock rate. */ #define ZS_CLOCK_DIVISOR 16 /* Divisor this driver uses. */ @@ -107,7 +100,7 @@ struct uart_sunzilog_port { unsigned char prev_status; #ifdef CONFIG_SERIO - struct serio *serio; + struct serio serio; int serio_open; #endif }; @@ -138,9 +131,9 @@ static unsigned char read_zsreg(struct zilog_channel __iomem *channel, { unsigned char retval; - sbus_writeb(reg, &channel->control); + writeb(reg, &channel->control); ZSDELAY(); - retval = sbus_readb(&channel->control); + retval = readb(&channel->control); ZSDELAY(); return retval; @@ -149,9 +142,9 @@ static unsigned char read_zsreg(struct zilog_channel __iomem *channel, static void write_zsreg(struct zilog_channel __iomem *channel, unsigned char reg, unsigned char value) { - sbus_writeb(reg, &channel->control); + writeb(reg, &channel->control); ZSDELAY(); - sbus_writeb(value, &channel->control); + writeb(value, &channel->control); ZSDELAY(); } @@ -162,17 +155,17 @@ static void sunzilog_clear_fifo(struct zilog_channel __iomem *channel) for (i = 0; i < 32; i++) { unsigned char regval; - regval = sbus_readb(&channel->control); + regval = readb(&channel->control); ZSDELAY(); if (regval & Rx_CH_AV) break; regval = read_zsreg(channel, R1); - sbus_readb(&channel->data); + readb(&channel->data); ZSDELAY(); if (regval & (PAR_ERR | Rx_OVR | CRC_ERR)) { - sbus_writeb(ERR_RES, &channel->control); + writeb(ERR_RES, &channel->control); ZSDELAY(); ZS_WSYNC(channel); } @@ -194,7 +187,7 @@ static void __load_zsregs(struct zilog_channel __iomem *channel, unsigned char * udelay(100); } - sbus_writeb(ERR_RES, &channel->control); + writeb(ERR_RES, &channel->control); ZSDELAY(); ZS_WSYNC(channel); @@ -291,7 +284,7 @@ static void sunzilog_kbdms_receive_chars(struct uart_sunzilog_port *up, /* Stop-A is handled by drivers/char/keyboard.c now. */ #ifdef CONFIG_SERIO if (up->serio_open) - serio_interrupt(up->serio, ch, 0, regs); + serio_interrupt(&up->serio, ch, 0, regs); #endif } else if (ZS_IS_MOUSE(up)) { int ret = suncore_mouse_baud_detection(ch, is_break); @@ -306,7 +299,7 @@ static void sunzilog_kbdms_receive_chars(struct uart_sunzilog_port *up, case 0: #ifdef CONFIG_SERIO if (up->serio_open) - serio_interrupt(up->serio, ch, 0, regs); + serio_interrupt(&up->serio, ch, 0, regs); #endif break; }; @@ -330,12 +323,12 @@ sunzilog_receive_chars(struct uart_sunzilog_port *up, r1 = read_zsreg(channel, R1); if (r1 & (PAR_ERR | Rx_OVR | CRC_ERR)) { - sbus_writeb(ERR_RES, &channel->control); + writeb(ERR_RES, &channel->control); ZSDELAY(); ZS_WSYNC(channel); } - ch = sbus_readb(&channel->control); + ch = readb(&channel->control); ZSDELAY(); /* This funny hack depends upon BRK_ABRT not interfering @@ -347,7 +340,7 @@ sunzilog_receive_chars(struct uart_sunzilog_port *up, if (!(ch & Rx_CH_AV)) break; - ch = sbus_readb(&channel->data); + ch = readb(&channel->data); ZSDELAY(); ch &= up->parity_mask; @@ -406,10 +399,10 @@ static void sunzilog_status_handle(struct uart_sunzilog_port *up, { unsigned char status; - status = sbus_readb(&channel->control); + status = readb(&channel->control); ZSDELAY(); - sbus_writeb(RES_EXT_INT, &channel->control); + writeb(RES_EXT_INT, &channel->control); ZSDELAY(); ZS_WSYNC(channel); @@ -421,7 +414,7 @@ static void sunzilog_status_handle(struct uart_sunzilog_port *up, * confusing the PROM. */ while (1) { - status = sbus_readb(&channel->control); + status = readb(&channel->control); ZSDELAY(); if (!(status & BRK_ABRT)) break; @@ -458,7 +451,7 @@ static void sunzilog_transmit_chars(struct uart_sunzilog_port *up, struct circ_buf *xmit; if (ZS_IS_CONS(up)) { - unsigned char status = sbus_readb(&channel->control); + unsigned char status = readb(&channel->control); ZSDELAY(); /* TX still busy? Just wait for the next TX done interrupt. @@ -487,7 +480,7 @@ static void sunzilog_transmit_chars(struct uart_sunzilog_port *up, if (up->port.x_char) { up->flags |= SUNZILOG_FLAG_TX_ACTIVE; - sbus_writeb(up->port.x_char, &channel->data); + writeb(up->port.x_char, &channel->data); ZSDELAY(); ZS_WSYNC(channel); @@ -506,7 +499,7 @@ static void sunzilog_transmit_chars(struct uart_sunzilog_port *up, goto ack_tx_int; up->flags |= SUNZILOG_FLAG_TX_ACTIVE; - sbus_writeb(xmit->buf[xmit->tail], &channel->data); + writeb(xmit->buf[xmit->tail], &channel->data); ZSDELAY(); ZS_WSYNC(channel); @@ -519,7 +512,7 @@ static void sunzilog_transmit_chars(struct uart_sunzilog_port *up, return; ack_tx_int: - sbus_writeb(RES_Tx_P, &channel->control); + writeb(RES_Tx_P, &channel->control); ZSDELAY(); ZS_WSYNC(channel); } @@ -540,7 +533,7 @@ static irqreturn_t sunzilog_interrupt(int irq, void *dev_id, struct pt_regs *reg /* Channel A */ tty = NULL; if (r3 & (CHAEXT | CHATxIP | CHARxIP)) { - sbus_writeb(RES_H_IUS, &channel->control); + writeb(RES_H_IUS, &channel->control); ZSDELAY(); ZS_WSYNC(channel); @@ -563,7 +556,7 @@ static irqreturn_t sunzilog_interrupt(int irq, void *dev_id, struct pt_regs *reg spin_lock(&up->port.lock); tty = NULL; if (r3 & (CHBEXT | CHBTxIP | CHBRxIP)) { - sbus_writeb(RES_H_IUS, &channel->control); + writeb(RES_H_IUS, &channel->control); ZSDELAY(); ZS_WSYNC(channel); @@ -594,7 +587,7 @@ static __inline__ unsigned char sunzilog_read_channel_status(struct uart_port *p unsigned char status; channel = ZILOG_CHANNEL_FROM_PORT(port); - status = sbus_readb(&channel->control); + status = readb(&channel->control); ZSDELAY(); return status; @@ -682,7 +675,7 @@ static void sunzilog_start_tx(struct uart_port *port) up->flags |= SUNZILOG_FLAG_TX_ACTIVE; up->flags &= ~SUNZILOG_FLAG_TX_STOPPED; - status = sbus_readb(&channel->control); + status = readb(&channel->control); ZSDELAY(); /* TX busy? Just wait for the TX done interrupt. */ @@ -693,7 +686,7 @@ static void sunzilog_start_tx(struct uart_port *port) * IRQ sending engine. */ if (port->x_char) { - sbus_writeb(port->x_char, &channel->data); + writeb(port->x_char, &channel->data); ZSDELAY(); ZS_WSYNC(channel); @@ -702,7 +695,7 @@ static void sunzilog_start_tx(struct uart_port *port) } else { struct circ_buf *xmit = &port->info->xmit; - sbus_writeb(xmit->buf[xmit->tail], &channel->data); + writeb(xmit->buf[xmit->tail], &channel->data); ZSDELAY(); ZS_WSYNC(channel); @@ -779,7 +772,7 @@ static void __sunzilog_startup(struct uart_sunzilog_port *up) struct zilog_channel __iomem *channel; channel = ZILOG_CHANNEL_FROM_PORT(&up->port); - up->prev_status = sbus_readb(&channel->control); + up->prev_status = readb(&channel->control); /* Enable receiver and transmitter. */ up->curregs[R3] |= RxENAB; @@ -963,7 +956,7 @@ sunzilog_set_termios(struct uart_port *port, struct termios *termios, static const char *sunzilog_type(struct uart_port *port) { - return "SunZilog"; + return "zs"; } /* We do not request/release mappings of the registers here, this @@ -1012,242 +1005,55 @@ static struct uart_sunzilog_port *sunzilog_port_table; static struct zilog_layout __iomem **sunzilog_chip_regs; static struct uart_sunzilog_port *sunzilog_irq_chain; -static int zilog_irq = -1; static struct uart_driver sunzilog_reg = { .owner = THIS_MODULE, .driver_name = "ttyS", - .devfs_name = "tts/", .dev_name = "ttyS", .major = TTY_MAJOR, }; -static void * __init alloc_one_table(unsigned long size) -{ - void *ret; - - ret = kmalloc(size, GFP_KERNEL); - if (ret != NULL) - memset(ret, 0, size); - - return ret; -} - -static void __init sunzilog_alloc_tables(void) -{ - sunzilog_port_table = - alloc_one_table(NUM_CHANNELS * sizeof(struct uart_sunzilog_port)); - sunzilog_chip_regs = - alloc_one_table(NUM_SUNZILOG * sizeof(struct zilog_layout __iomem *)); - - if (sunzilog_port_table == NULL || sunzilog_chip_regs == NULL) { - prom_printf("SunZilog: Cannot allocate tables.\n"); - prom_halt(); - } -} - -#ifdef CONFIG_SPARC64 - -/* We used to attempt to use the address property of the Zilog device node - * but that totally is not necessary on sparc64. - */ -static struct zilog_layout __iomem * __init get_zs_sun4u(int chip, int zsnode) +static int __init sunzilog_alloc_tables(void) { - void __iomem *mapped_addr; - unsigned int sun4u_ino; - struct sbus_bus *sbus = NULL; - struct sbus_dev *sdev = NULL; - int err; - - if (central_bus == NULL) { - for_each_sbus(sbus) { - for_each_sbusdev(sdev, sbus) { - if (sdev->prom_node == zsnode) - goto found; - } - } - } - found: - if (sdev == NULL && central_bus == NULL) { - prom_printf("SunZilog: sdev&¢ral == NULL for " - "Zilog %d in get_zs_sun4u.\n", chip); - prom_halt(); - } - if (central_bus == NULL) { - mapped_addr = - sbus_ioremap(&sdev->resource[0], 0, - PAGE_SIZE, - "Zilog Registers"); - } else { - struct linux_prom_registers zsregs[1]; - - err = prom_getproperty(zsnode, "reg", - (char *) &zsregs[0], - sizeof(zsregs)); - if (err == -1) { - prom_printf("SunZilog: Cannot map " - "Zilog %d regs on " - "central bus.\n", chip); - prom_halt(); - } - apply_fhc_ranges(central_bus->child, - &zsregs[0], 1); - apply_central_ranges(central_bus, &zsregs[0], 1); - mapped_addr = (void __iomem *) - ((((u64)zsregs[0].which_io)<<32UL) | - ((u64)zsregs[0].phys_addr)); - } - - if (zilog_irq == -1) { - if (central_bus) { - unsigned long iclr, imap; - - iclr = central_bus->child->fhc_regs.uregs - + FHC_UREGS_ICLR; - imap = central_bus->child->fhc_regs.uregs - + FHC_UREGS_IMAP; - zilog_irq = build_irq(12, 0, iclr, imap); - } else { - err = prom_getproperty(zsnode, "interrupts", - (char *) &sun4u_ino, - sizeof(sun4u_ino)); - zilog_irq = sbus_build_irq(sbus_root, sun4u_ino); - } - } - - return (struct zilog_layout __iomem *) mapped_addr; -} -#else /* CONFIG_SPARC64 */ - -/* - * XXX The sun4d case is utterly screwed: it tries to re-walk the tree - * (for the 3rd time) in order to find bootbus and cpu. Streamline it. - */ -static struct zilog_layout __iomem * __init get_zs_sun4cmd(int chip, int node) -{ - struct linux_prom_irqs irq_info[2]; - void __iomem *mapped_addr = NULL; - int zsnode, cpunode, bbnode; - struct linux_prom_registers zsreg[4]; - struct resource res; - - if (sparc_cpu_model == sun4d) { - int walk; - - zsnode = 0; - bbnode = 0; - cpunode = 0; - for (walk = prom_getchild(prom_root_node); - (walk = prom_searchsiblings(walk, "cpu-unit")) != 0; - walk = prom_getsibling(walk)) { - bbnode = prom_getchild(walk); - if (bbnode && - (bbnode = prom_searchsiblings(bbnode, "bootbus"))) { - if ((zsnode = prom_getchild(bbnode)) == node) { - cpunode = walk; - break; - } - } - } - if (!walk) { - prom_printf("SunZilog: Cannot find the %d'th bootbus on sun4d.\n", - (chip / 2)); - prom_halt(); - } + struct uart_sunzilog_port *up; + unsigned long size; + int i; - if (prom_getproperty(zsnode, "reg", - (char *) zsreg, sizeof(zsreg)) == -1) { - prom_printf("SunZilog: Cannot map Zilog %d\n", chip); - prom_halt(); - } - /* XXX Looks like an off by one? */ - prom_apply_generic_ranges(bbnode, cpunode, zsreg, 1); - res.start = zsreg[0].phys_addr; - res.end = res.start + (8 - 1); - res.flags = zsreg[0].which_io | IORESOURCE_IO; - mapped_addr = sbus_ioremap(&res, 0, 8, "Zilog Serial"); + size = NUM_CHANNELS * sizeof(struct uart_sunzilog_port); + sunzilog_port_table = kzalloc(size, GFP_KERNEL); + if (!sunzilog_port_table) + return -ENOMEM; - } else { - zsnode = node; + for (i = 0; i < NUM_CHANNELS; i++) { + up = &sunzilog_port_table[i]; -#if 0 /* XXX When was this used? */ - if (prom_getintdefault(zsnode, "slave", -1) != chipid) { - zsnode = prom_getsibling(zsnode); - continue; - } -#endif + spin_lock_init(&up->port.lock); - /* - * "address" is only present on ports that OBP opened - * (from Mitch Bradley's "Hitchhiker's Guide to OBP"). - * We do not use it. - */ + if (i == 0) + sunzilog_irq_chain = up; - if (prom_getproperty(zsnode, "reg", - (char *) zsreg, sizeof(zsreg)) == -1) { - prom_printf("SunZilog: Cannot map Zilog %d\n", chip); - prom_halt(); - } - if (sparc_cpu_model == sun4m) /* Crude. Pass parent. XXX */ - prom_apply_obio_ranges(zsreg, 1); - res.start = zsreg[0].phys_addr; - res.end = res.start + (8 - 1); - res.flags = zsreg[0].which_io | IORESOURCE_IO; - mapped_addr = sbus_ioremap(&res, 0, 8, "Zilog Serial"); + if (i < NUM_CHANNELS - 1) + up->next = up + 1; + else + up->next = NULL; } - if (prom_getproperty(zsnode, "intr", - (char *) irq_info, sizeof(irq_info)) - % sizeof(struct linux_prom_irqs)) { - prom_printf("SunZilog: Cannot get IRQ property for Zilog %d.\n", - chip); - prom_halt(); - } - if (zilog_irq == -1) { - zilog_irq = irq_info[0].pri; - } else if (zilog_irq != irq_info[0].pri) { - /* XXX. Dumb. Should handle per-chip IRQ, for add-ons. */ - prom_printf("SunZilog: Inconsistent IRQ layout for Zilog %d.\n", - chip); - prom_halt(); + size = NUM_SUNZILOG * sizeof(struct zilog_layout __iomem *); + sunzilog_chip_regs = kzalloc(size, GFP_KERNEL); + if (!sunzilog_chip_regs) { + kfree(sunzilog_port_table); + sunzilog_irq_chain = NULL; + return -ENOMEM; } - return (struct zilog_layout __iomem *) mapped_addr; + return 0; } -#endif /* !(CONFIG_SPARC64) */ -/* Get the address of the registers for SunZilog instance CHIP. */ -static struct zilog_layout __iomem * __init get_zs(int chip, int node) +static void sunzilog_free_tables(void) { - if (chip < 0 || chip >= NUM_SUNZILOG) { - prom_printf("SunZilog: Illegal chip number %d in get_zs.\n", chip); - prom_halt(); - } - -#ifdef CONFIG_SPARC64 - return get_zs_sun4u(chip, node); -#else - - if (sparc_cpu_model == sun4) { - struct resource res; - - /* Not probe-able, hard code it. */ - switch (chip) { - case 0: - res.start = 0xf1000000; - break; - case 1: - res.start = 0xf0000000; - break; - }; - zilog_irq = 12; - res.end = (res.start + (8 - 1)); - res.flags = IORESOURCE_IO; - return sbus_ioremap(&res, 0, 8, "SunZilog"); - } - - return get_zs_sun4cmd(chip, node); -#endif + kfree(sunzilog_port_table); + sunzilog_irq_chain = NULL; + kfree(sunzilog_chip_regs); } #define ZS_PUT_CHAR_MAX_DELAY 2000 /* 10 ms */ @@ -1261,7 +1067,7 @@ static void sunzilog_putchar(struct uart_port *port, int ch) * udelay with ZSDELAY as that is a NOP on some platforms. -DaveM */ do { - unsigned char val = sbus_readb(&channel->control); + unsigned char val = readb(&channel->control); if (val & Tx_BUF_EMP) { ZSDELAY(); break; @@ -1269,7 +1075,7 @@ static void sunzilog_putchar(struct uart_port *port, int ch) udelay(5); } while (--loops); - sbus_writeb(ch, &channel->data); + writeb(ch, &channel->data); ZSDELAY(); ZS_WSYNC(channel); } @@ -1340,6 +1146,9 @@ static int __init sunzilog_console_setup(struct console *con, char *options) unsigned long flags; int baud, brg; + if (up->port.type != PORT_SUNZILOG) + return -1; + printk(KERN_INFO "Console: ttyS%d (SunZilog zs%d)\n", (sunzilog_reg.minor - 64) + con->index, con->index); @@ -1386,28 +1195,6 @@ static struct console sunzilog_console = { .data = &sunzilog_reg, }; -static int __init sunzilog_console_init(void) -{ - int i; - - if (con_is_present()) - return 0; - - for (i = 0; i < NUM_CHANNELS; i++) { - int this_minor = sunzilog_reg.minor + i; - - if ((this_minor - 64) == (serial_console - 1)) - break; - } - if (i == NUM_CHANNELS) - return 0; - - sunzilog_console.index = i; - sunzilog_port_table[i].flags |= SUNZILOG_FLAG_IS_CONS; - register_console(&sunzilog_console); - return 0; -} - static inline struct console *SUNZILOG_CONSOLE(void) { int i; @@ -1432,116 +1219,19 @@ static inline struct console *SUNZILOG_CONSOLE(void) #else #define SUNZILOG_CONSOLE() (NULL) -#define sunzilog_console_init() do { } while (0) #endif -/* - * We scan the PROM tree recursively. This is the most reliable way - * to find Zilog nodes on various platforms. However, we face an extreme - * shortage of kernel stack, so we must be very careful. To that end, - * we scan only to a certain depth, and we use a common property buffer - * in the scan structure. - */ -#define ZS_PROPSIZE 128 -#define ZS_SCAN_DEPTH 5 - -struct zs_probe_scan { - int depth; - void (*scanner)(struct zs_probe_scan *t, int node); - - int devices; - char prop[ZS_PROPSIZE]; -}; - -static int __inline__ sunzilog_node_ok(int node, const char *name, int len) -{ - if (strncmp(name, "zs", len) == 0) - return 1; - /* Don't fold this procedure just yet. Compare to su_node_ok(). */ - return 0; -} - -static void __init sunzilog_scan(struct zs_probe_scan *t, int node) -{ - int len; - - for (; node != 0; node = prom_getsibling(node)) { - len = prom_getproperty(node, "name", t->prop, ZS_PROPSIZE); - if (len <= 1) - continue; /* Broken PROM node */ - if (sunzilog_node_ok(node, t->prop, len)) { - (*t->scanner)(t, node); - } else { - if (t->depth < ZS_SCAN_DEPTH) { - t->depth++; - sunzilog_scan(t, prom_getchild(node)); - --t->depth; - } - } - } -} - -static void __init sunzilog_prepare(void) -{ - struct uart_sunzilog_port *up; - struct zilog_layout __iomem *rp; - int channel, chip; - - /* - * Temporary fix. - */ - for (channel = 0; channel < NUM_CHANNELS; channel++) - spin_lock_init(&sunzilog_port_table[channel].port.lock); - - sunzilog_irq_chain = up = &sunzilog_port_table[0]; - for (channel = 0; channel < NUM_CHANNELS - 1; channel++) - up[channel].next = &up[channel + 1]; - up[channel].next = NULL; - - for (chip = 0; chip < NUM_SUNZILOG; chip++) { - rp = sunzilog_chip_regs[chip]; - up[(chip * 2) + 0].port.membase = (void __iomem *)&rp->channelA; - up[(chip * 2) + 1].port.membase = (void __iomem *)&rp->channelB; - - /* Channel A */ - up[(chip * 2) + 0].port.iotype = UPIO_MEM; - up[(chip * 2) + 0].port.irq = zilog_irq; - up[(chip * 2) + 0].port.uartclk = ZS_CLOCK; - up[(chip * 2) + 0].port.fifosize = 1; - up[(chip * 2) + 0].port.ops = &sunzilog_pops; - up[(chip * 2) + 0].port.type = PORT_SUNZILOG; - up[(chip * 2) + 0].port.flags = 0; - up[(chip * 2) + 0].port.line = (chip * 2) + 0; - up[(chip * 2) + 0].flags |= SUNZILOG_FLAG_IS_CHANNEL_A; - - /* Channel B */ - up[(chip * 2) + 1].port.iotype = UPIO_MEM; - up[(chip * 2) + 1].port.irq = zilog_irq; - up[(chip * 2) + 1].port.uartclk = ZS_CLOCK; - up[(chip * 2) + 1].port.fifosize = 1; - up[(chip * 2) + 1].port.ops = &sunzilog_pops; - up[(chip * 2) + 1].port.type = PORT_SUNZILOG; - up[(chip * 2) + 1].port.flags = 0; - up[(chip * 2) + 1].port.line = (chip * 2) + 1; - up[(chip * 2) + 1].flags |= 0; - } -} - static void __init sunzilog_init_kbdms(struct uart_sunzilog_port *up, int channel) { int baud, brg; - if (channel == KEYBOARD_LINE) { - up->flags |= SUNZILOG_FLAG_CONS_KEYB; + if (up->flags & SUNZILOG_FLAG_CONS_KEYB) { up->cflag = B1200 | CS8 | CLOCAL | CREAD; baud = 1200; } else { - up->flags |= SUNZILOG_FLAG_CONS_MOUSE; up->cflag = B4800 | CS8 | CLOCAL | CREAD; baud = 4800; } - printk(KERN_INFO "zs%d at 0x%p (irq = %s) is a SunZilog\n", - channel, up->port.membase, __irq_itoa(zilog_irq)); up->curregs[R15] = BRKIE; brg = BPS_TO_BRG(baud, ZS_CLOCK / ZS_CLOCK_DIVISOR); @@ -1551,218 +1241,290 @@ static void __init sunzilog_init_kbdms(struct uart_sunzilog_port *up, int channe } #ifdef CONFIG_SERIO -static void __init sunzilog_register_serio(struct uart_sunzilog_port *up, int channel) +static void __init sunzilog_register_serio(struct uart_sunzilog_port *up) { - struct serio *serio; - - up->serio = serio = kmalloc(sizeof(struct serio), GFP_KERNEL); - if (serio) { - memset(serio, 0, sizeof(*serio)); - - serio->port_data = up; - - serio->id.type = SERIO_RS232; - if (channel == KEYBOARD_LINE) { - serio->id.proto = SERIO_SUNKBD; - strlcpy(serio->name, "zskbd", sizeof(serio->name)); - } else { - serio->id.proto = SERIO_SUN; - serio->id.extra = 1; - strlcpy(serio->name, "zsms", sizeof(serio->name)); - } - strlcpy(serio->phys, - (channel == KEYBOARD_LINE ? "zs/serio0" : "zs/serio1"), - sizeof(serio->phys)); + struct serio *serio = &up->serio; - serio->write = sunzilog_serio_write; - serio->open = sunzilog_serio_open; - serio->close = sunzilog_serio_close; + serio->port_data = up; - serio_register_port(serio); + serio->id.type = SERIO_RS232; + if (up->flags & SUNZILOG_FLAG_CONS_KEYB) { + serio->id.proto = SERIO_SUNKBD; + strlcpy(serio->name, "zskbd", sizeof(serio->name)); } else { - printk(KERN_WARNING "zs%d: not enough memory for serio port\n", - channel); + serio->id.proto = SERIO_SUN; + serio->id.extra = 1; + strlcpy(serio->name, "zsms", sizeof(serio->name)); } + strlcpy(serio->phys, + ((up->flags & SUNZILOG_FLAG_CONS_KEYB) ? + "zs/serio0" : "zs/serio1"), + sizeof(serio->phys)); + + serio->write = sunzilog_serio_write; + serio->open = sunzilog_serio_open; + serio->close = sunzilog_serio_close; + serio->dev.parent = up->port.dev; + + serio_register_port(serio); } #endif -static void __init sunzilog_init_hw(void) +static void __init sunzilog_init_hw(struct uart_sunzilog_port *up) { - int i; - - for (i = 0; i < NUM_CHANNELS; i++) { - struct uart_sunzilog_port *up = &sunzilog_port_table[i]; - struct zilog_channel __iomem *channel = ZILOG_CHANNEL_FROM_PORT(&up->port); - unsigned long flags; - int baud, brg; + struct zilog_channel __iomem *channel; + unsigned long flags; + int baud, brg; - spin_lock_irqsave(&up->port.lock, flags); + channel = ZILOG_CHANNEL_FROM_PORT(&up->port); - if (ZS_IS_CHANNEL_A(up)) { - write_zsreg(channel, R9, FHWRES); - ZSDELAY_LONG(); - (void) read_zsreg(channel, R0); - } + spin_lock_irqsave(&up->port.lock, flags); + if (ZS_IS_CHANNEL_A(up)) { + write_zsreg(channel, R9, FHWRES); + ZSDELAY_LONG(); + (void) read_zsreg(channel, R0); + } - if (i == KEYBOARD_LINE || i == MOUSE_LINE) { - sunzilog_init_kbdms(up, i); - up->curregs[R9] |= (NV | MIE); - write_zsreg(channel, R9, up->curregs[R9]); - } else { - /* Normal serial TTY. */ - up->parity_mask = 0xff; - up->curregs[R1] = EXT_INT_ENAB | INT_ALL_Rx | TxINT_ENAB; - up->curregs[R4] = PAR_EVEN | X16CLK | SB1; - up->curregs[R3] = RxENAB | Rx8; - up->curregs[R5] = TxENAB | Tx8; - up->curregs[R9] = NV | MIE; - up->curregs[R10] = NRZ; - up->curregs[R11] = TCBR | RCBR; - baud = 9600; - brg = BPS_TO_BRG(baud, ZS_CLOCK / ZS_CLOCK_DIVISOR); - up->curregs[R12] = (brg & 0xff); - up->curregs[R13] = (brg >> 8) & 0xff; - up->curregs[R14] = BRSRC | BRENAB; - __load_zsregs(channel, up->curregs); - write_zsreg(channel, R9, up->curregs[R9]); - } + if (up->flags & (SUNZILOG_FLAG_CONS_KEYB | + SUNZILOG_FLAG_CONS_MOUSE)) { + sunzilog_init_kbdms(up, up->port.line); + up->curregs[R9] |= (NV | MIE); + write_zsreg(channel, R9, up->curregs[R9]); + } else { + /* Normal serial TTY. */ + up->parity_mask = 0xff; + up->curregs[R1] = EXT_INT_ENAB | INT_ALL_Rx | TxINT_ENAB; + up->curregs[R4] = PAR_EVEN | X16CLK | SB1; + up->curregs[R3] = RxENAB | Rx8; + up->curregs[R5] = TxENAB | Tx8; + up->curregs[R9] = NV | MIE; + up->curregs[R10] = NRZ; + up->curregs[R11] = TCBR | RCBR; + baud = 9600; + brg = BPS_TO_BRG(baud, ZS_CLOCK / ZS_CLOCK_DIVISOR); + up->curregs[R12] = (brg & 0xff); + up->curregs[R13] = (brg >> 8) & 0xff; + up->curregs[R14] = BRSRC | BRENAB; + __load_zsregs(channel, up->curregs); + write_zsreg(channel, R9, up->curregs[R9]); + } - spin_unlock_irqrestore(&up->port.lock, flags); + spin_unlock_irqrestore(&up->port.lock, flags); #ifdef CONFIG_SERIO - if (i == KEYBOARD_LINE || i == MOUSE_LINE) - sunzilog_register_serio(up, i); + if (up->flags & (SUNZILOG_FLAG_CONS_KEYB | + SUNZILOG_FLAG_CONS_MOUSE)) + sunzilog_register_serio(up); #endif - } } -static struct zilog_layout __iomem * __init get_zs(int chip, int node); - -static void __init sunzilog_scan_probe(struct zs_probe_scan *t, int node) -{ - sunzilog_chip_regs[t->devices] = get_zs(t->devices, node); - t->devices++; -} +static int zilog_irq = -1; -static int __init sunzilog_ports_init(void) +static int __devinit zs_probe(struct of_device *op, const struct of_device_id *match) { - struct zs_probe_scan scan; - int ret; - int uart_count; - int i; + static int inst; + struct uart_sunzilog_port *up; + struct zilog_layout __iomem *rp; + int keyboard_mouse; + int err; - printk(KERN_DEBUG "SunZilog: %d chips.\n", NUM_SUNZILOG); + keyboard_mouse = 0; + if (of_find_property(op->node, "keyboard", NULL)) + keyboard_mouse = 1; + + sunzilog_chip_regs[inst] = of_ioremap(&op->resource[0], 0, + sizeof(struct zilog_layout), + "zs"); + if (!sunzilog_chip_regs[inst]) + return -ENOMEM; + + rp = sunzilog_chip_regs[inst]; + + if (zilog_irq == -1) + zilog_irq = op->irqs[0]; + + up = &sunzilog_port_table[inst * 2]; + + /* Channel A */ + up[0].port.mapbase = op->resource[0].start + 0x00; + up[0].port.membase = (void __iomem *) &rp->channelA; + up[0].port.iotype = UPIO_MEM; + up[0].port.irq = op->irqs[0]; + up[0].port.uartclk = ZS_CLOCK; + up[0].port.fifosize = 1; + up[0].port.ops = &sunzilog_pops; + up[0].port.type = PORT_SUNZILOG; + up[0].port.flags = 0; + up[0].port.line = (inst * 2) + 0; + up[0].port.dev = &op->dev; + up[0].flags |= SUNZILOG_FLAG_IS_CHANNEL_A; + if (keyboard_mouse) + up[0].flags |= SUNZILOG_FLAG_CONS_KEYB; + sunzilog_init_hw(&up[0]); + + /* Channel B */ + up[1].port.mapbase = op->resource[0].start + 0x04; + up[1].port.membase = (void __iomem *) &rp->channelB; + up[1].port.iotype = UPIO_MEM; + up[1].port.irq = op->irqs[0]; + up[1].port.uartclk = ZS_CLOCK; + up[1].port.fifosize = 1; + up[1].port.ops = &sunzilog_pops; + up[1].port.type = PORT_SUNZILOG; + up[1].port.flags = 0; + up[1].port.line = (inst * 2) + 1; + up[1].port.dev = &op->dev; + up[1].flags |= 0; + if (keyboard_mouse) + up[1].flags |= SUNZILOG_FLAG_CONS_MOUSE; + sunzilog_init_hw(&up[1]); + + if (!keyboard_mouse) { + err = uart_add_one_port(&sunzilog_reg, &up[0].port); + if (err) { + of_iounmap(rp, sizeof(struct zilog_layout)); + return err; + } + err = uart_add_one_port(&sunzilog_reg, &up[1].port); + if (err) { + uart_remove_one_port(&sunzilog_reg, &up[0].port); + of_iounmap(rp, sizeof(struct zilog_layout)); + return err; + } + } else { + printk(KERN_INFO "%s: Keyboard at MMIO %lx (irq = %d) " + "is a zs\n", + op->dev.bus_id, up[0].port.mapbase, op->irqs[0]); + printk(KERN_INFO "%s: Mouse at MMIO %lx (irq = %d) " + "is a zs\n", + op->dev.bus_id, up[1].port.mapbase, op->irqs[0]); + } - scan.scanner = sunzilog_scan_probe; - scan.depth = 0; - scan.devices = 0; - sunzilog_scan(&scan, prom_getchild(prom_root_node)); + dev_set_drvdata(&op->dev, &up[0]); - sunzilog_prepare(); + inst++; - if (request_irq(zilog_irq, sunzilog_interrupt, SA_SHIRQ, - "SunZilog", sunzilog_irq_chain)) { - prom_printf("SunZilog: Unable to register zs interrupt handler.\n"); - prom_halt(); - } + return 0; +} - sunzilog_init_hw(); +static void __devexit zs_remove_one(struct uart_sunzilog_port *up) +{ + if (ZS_IS_KEYB(up) || ZS_IS_MOUSE(up)) { +#ifdef CONFIG_SERIO + serio_unregister_port(&up->serio); +#endif + } else + uart_remove_one_port(&sunzilog_reg, &up->port); +} - /* We can only init this once we have probed the Zilogs - * in the system. Do not count channels assigned to keyboards - * or mice when we are deciding how many ports to register. - */ - uart_count = 0; - for (i = 0; i < NUM_CHANNELS; i++) { - struct uart_sunzilog_port *up = &sunzilog_port_table[i]; +static int __devexit zs_remove(struct of_device *dev) +{ + struct uart_sunzilog_port *up = dev_get_drvdata(&dev->dev); + struct zilog_layout __iomem *regs; - if (ZS_IS_KEYB(up) || ZS_IS_MOUSE(up)) - continue; + zs_remove_one(&up[0]); + zs_remove_one(&up[1]); - uart_count++; - } - - sunzilog_reg.nr = uart_count; - sunzilog_reg.minor = sunserial_current_minor; + regs = sunzilog_chip_regs[up[0].port.line / 2]; + of_iounmap(regs, sizeof(struct zilog_layout)); - ret = uart_register_driver(&sunzilog_reg); - if (ret == 0) { - sunzilog_reg.tty_driver->name_base = sunzilog_reg.minor - 64; - sunzilog_reg.cons = SUNZILOG_CONSOLE(); + dev_set_drvdata(&dev->dev, NULL); - sunserial_current_minor += uart_count; + return 0; +} - for (i = 0; i < NUM_CHANNELS; i++) { - struct uart_sunzilog_port *up = &sunzilog_port_table[i]; +static struct of_device_id zs_match[] = { + { + .name = "zs", + }, + {}, +}; +MODULE_DEVICE_TABLE(of, zs_match); - if (ZS_IS_KEYB(up) || ZS_IS_MOUSE(up)) - continue; +static struct of_platform_driver zs_driver = { + .name = "zs", + .match_table = zs_match, + .probe = zs_probe, + .remove = __devexit_p(zs_remove), +}; - if (uart_add_one_port(&sunzilog_reg, &up->port)) { - printk(KERN_ERR - "SunZilog: failed to add port zs%d\n", i); - } - } +static int __init sunzilog_init(void) +{ + struct device_node *dp; + int err, uart_count; + int num_keybms; + + NUM_SUNZILOG = 0; + num_keybms = 0; + for_each_node_by_name(dp, "zs") { + NUM_SUNZILOG++; + if (of_find_property(dp, "keyboard", NULL)) + num_keybms++; } - return ret; -} + uart_count = 0; + if (NUM_SUNZILOG) { + int uart_count; -static void __init sunzilog_scan_count(struct zs_probe_scan *t, int node) -{ - t->devices++; -} + err = sunzilog_alloc_tables(); + if (err) + goto out; -static int __init sunzilog_ports_count(void) -{ - struct zs_probe_scan scan; + uart_count = (NUM_SUNZILOG * 2) - (2 * num_keybms); - /* Sun4 Zilog setup is hard coded, no probing to do. */ - if (sparc_cpu_model == sun4) - return 2; + sunzilog_reg.nr = uart_count; + sunzilog_reg.minor = sunserial_current_minor; + err = uart_register_driver(&sunzilog_reg); + if (err) + goto out_free_tables; - scan.scanner = sunzilog_scan_count; - scan.depth = 0; - scan.devices = 0; + sunzilog_reg.tty_driver->name_base = sunzilog_reg.minor - 64; + sunzilog_reg.cons = SUNZILOG_CONSOLE(); - sunzilog_scan(&scan, prom_getchild(prom_root_node)); + sunserial_current_minor += uart_count; + } - return scan.devices; -} + err = of_register_driver(&zs_driver, &of_bus_type); + if (err) + goto out_unregister_uart; -static int __init sunzilog_init(void) -{ + if (zilog_irq != -1) { + err = request_irq(zilog_irq, sunzilog_interrupt, IRQF_SHARED, + "zs", sunzilog_irq_chain); + if (err) + goto out_unregister_driver; + } - NUM_SUNZILOG = sunzilog_ports_count(); - if (NUM_SUNZILOG == 0) - return -ENODEV; +out: + return err; - sunzilog_alloc_tables(); +out_unregister_driver: + of_unregister_driver(&zs_driver); - sunzilog_ports_init(); +out_unregister_uart: + if (NUM_SUNZILOG) { + uart_unregister_driver(&sunzilog_reg); + sunzilog_reg.cons = NULL; + } - return 0; +out_free_tables: + sunzilog_free_tables(); + goto out; } static void __exit sunzilog_exit(void) { - int i; + of_unregister_driver(&zs_driver); - for (i = 0; i < NUM_CHANNELS; i++) { - struct uart_sunzilog_port *up = &sunzilog_port_table[i]; - - if (ZS_IS_KEYB(up) || ZS_IS_MOUSE(up)) { -#ifdef CONFIG_SERIO - if (up->serio) { - serio_unregister_port(up->serio); - up->serio = NULL; - } -#endif - } else - uart_remove_one_port(&sunzilog_reg, &up->port); + if (zilog_irq != -1) { + free_irq(zilog_irq, sunzilog_irq_chain); + zilog_irq = -1; } - uart_unregister_driver(&sunzilog_reg); + if (NUM_SUNZILOG) { + uart_unregister_driver(&sunzilog_reg); + sunzilog_free_tables(); + } } module_init(sunzilog_init); @@ -1770,4 +1532,5 @@ module_exit(sunzilog_exit); MODULE_AUTHOR("David S. Miller"); MODULE_DESCRIPTION("Sun Zilog serial port driver"); +MODULE_VERSION("2.0"); MODULE_LICENSE("GPL"); diff --git a/drivers/serial/v850e_uart.c b/drivers/serial/v850e_uart.c index df705fda4..f802867c9 100644 --- a/drivers/serial/v850e_uart.c +++ b/drivers/serial/v850e_uart.c @@ -372,13 +372,13 @@ static int v850e_uart_startup (struct uart_port *port) /* Alloc RX irq. */ err = request_irq (V850E_UART_RX_IRQ (port->line), v850e_uart_rx_irq, - SA_INTERRUPT, "v850e_uart", port); + IRQF_DISABLED, "v850e_uart", port); if (err) return err; /* Alloc TX irq. */ err = request_irq (V850E_UART_TX_IRQ (port->line), v850e_uart_tx_irq, - SA_INTERRUPT, "v850e_uart", port); + IRQF_DISABLED, "v850e_uart", port); if (err) { free_irq (V850E_UART_RX_IRQ (port->line), port); return err; @@ -468,7 +468,6 @@ static struct uart_ops v850e_uart_ops = { static struct uart_driver v850e_uart_driver = { .owner = THIS_MODULE, .driver_name = "v850e_uart", - .devfs_name = "tts/", .dev_name = "ttyS", .major = TTY_MAJOR, .minor = V850E_UART_MINOR_BASE, diff --git a/drivers/serial/vr41xx_siu.c b/drivers/serial/vr41xx_siu.c index 1f985327b..6c8b0ea83 100644 --- a/drivers/serial/vr41xx_siu.c +++ b/drivers/serial/vr41xx_siu.c @@ -1,7 +1,7 @@ /* * Driver for NEC VR4100 series Serial Interface Unit. * - * Copyright (C) 2004-2005 Yoichi Yuasa + * Copyright (C) 2004-2005 Yoichi Yuasa * * Based on drivers/serial/8250.c, by Russell King. * @@ -19,14 +19,13 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include #if defined(CONFIG_SERIAL_VR41XX_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #define SUPPORT_SYSRQ #endif #include -#include +#include #include #include #include @@ -39,6 +38,7 @@ #include #include +#include #include #include @@ -284,7 +284,7 @@ static unsigned int siu_get_mctrl(struct uart_port *port) return mctrl; } -static void siu_stop_tx(struct uart_port *port, unsigned int tty_stop) +static void siu_stop_tx(struct uart_port *port) { unsigned long flags; uint8_t ier; @@ -298,7 +298,7 @@ static void siu_stop_tx(struct uart_port *port, unsigned int tty_stop) spin_unlock_irqrestore(&port->lock, flags); } -static void siu_start_tx(struct uart_port *port, unsigned int tty_start) +static void siu_start_tx(struct uart_port *port) { unsigned long flags; uint8_t ier; @@ -371,11 +371,6 @@ static inline void receive_chars(struct uart_port *port, uint8_t *status, lsr = *status; do { - if (unlikely(tty->flip.count >= TTY_FLIPBUF_SIZE)) { - if (tty->low_latency) - tty_flip_buffer_push(tty); - } - ch = siu_read(port, UART_RX); port->icount.rx++; flag = TTY_NORMAL; @@ -458,7 +453,7 @@ static inline void transmit_chars(struct uart_port *port) } if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { - siu_stop_tx(port, 0); + siu_stop_tx(port); return; } @@ -474,7 +469,7 @@ static inline void transmit_chars(struct uart_port *port) uart_write_wakeup(port); if (uart_circ_empty(xmit)) - siu_stop_tx(port, 0); + siu_stop_tx(port); } static irqreturn_t siu_interrupt(int irq, void *dev_id, struct pt_regs *regs) @@ -826,25 +821,23 @@ static void wait_for_xmitr(struct uart_port *port) } } +static void siu_console_putchar(struct uart_port *port, int ch) +{ + wait_for_xmitr(port); + siu_write(port, UART_TX, ch); +} + static void siu_console_write(struct console *con, const char *s, unsigned count) { struct uart_port *port; uint8_t ier; - unsigned i; port = &siu_uart_ports[con->index]; ier = siu_read(port, UART_IER); siu_write(port, UART_IER, 0); - for (i = 0; i < count && *s != '\0'; i++, s++) { - wait_for_xmitr(port); - siu_write(port, UART_TX, *s); - if (*s == '\n') { - wait_for_xmitr(port); - siu_write(port, UART_TX, '\r'); - } - } + uart_console_write(port, s, count, siu_console_putchar); wait_for_xmitr(port); siu_write(port, UART_IER, ier); @@ -918,13 +911,12 @@ static struct uart_driver siu_uart_driver = { .owner = THIS_MODULE, .driver_name = "SIU", .dev_name = "ttyVR", - .devfs_name = "ttvr/", .major = SIU_MAJOR, .minor = SIU_MINOR_BASE, .cons = SERIAL_VR41XX_CONSOLE, }; -static int siu_probe(struct device *dev) +static int __devinit siu_probe(struct platform_device *dev) { struct uart_port *port; int num, i, retval; @@ -941,7 +933,7 @@ static int siu_probe(struct device *dev) for (i = 0; i < num; i++) { port = &siu_uart_ports[i]; port->ops = &siu_uart_ops; - port->dev = dev; + port->dev = &dev->dev; retval = uart_add_one_port(&siu_uart_driver, port); if (retval < 0) { @@ -958,14 +950,14 @@ static int siu_probe(struct device *dev) return 0; } -static int siu_remove(struct device *dev) +static int __devexit siu_remove(struct platform_device *dev) { struct uart_port *port; int i; for (i = 0; i < siu_uart_driver.nr; i++) { port = &siu_uart_ports[i]; - if (port->dev == dev) { + if (port->dev == &dev->dev) { uart_remove_one_port(&siu_uart_driver, port); port->dev = NULL; } @@ -976,18 +968,15 @@ static int siu_remove(struct device *dev) return 0; } -static int siu_suspend(struct device *dev, pm_message_t state, u32 level) +static int siu_suspend(struct platform_device *dev, pm_message_t state) { struct uart_port *port; int i; - if (level != SUSPEND_DISABLE) - return 0; - for (i = 0; i < siu_uart_driver.nr; i++) { port = &siu_uart_ports[i]; if ((port->type == PORT_VR41XX_SIU || - port->type == PORT_VR41XX_DSIU) && port->dev == dev) + port->type == PORT_VR41XX_DSIU) && port->dev == &dev->dev) uart_suspend_port(&siu_uart_driver, port); } @@ -995,18 +984,15 @@ static int siu_suspend(struct device *dev, pm_message_t state, u32 level) return 0; } -static int siu_resume(struct device *dev, u32 level) +static int siu_resume(struct platform_device *dev) { struct uart_port *port; int i; - if (level != RESUME_ENABLE) - return 0; - for (i = 0; i < siu_uart_driver.nr; i++) { port = &siu_uart_ports[i]; if ((port->type == PORT_VR41XX_SIU || - port->type == PORT_VR41XX_DSIU) && port->dev == dev) + port->type == PORT_VR41XX_DSIU) && port->dev == &dev->dev) uart_resume_port(&siu_uart_driver, port); } @@ -1015,34 +1001,41 @@ static int siu_resume(struct device *dev, u32 level) static struct platform_device *siu_platform_device; -static struct device_driver siu_device_driver = { - .name = "SIU", - .bus = &platform_bus_type, +static struct platform_driver siu_device_driver = { .probe = siu_probe, - .remove = siu_remove, + .remove = __devexit_p(siu_remove), .suspend = siu_suspend, .resume = siu_resume, + .driver = { + .name = "SIU", + .owner = THIS_MODULE, + }, }; -static int __devinit vr41xx_siu_init(void) +static int __init vr41xx_siu_init(void) { int retval; - siu_platform_device = platform_device_register_simple("SIU", -1, NULL, 0); - if (IS_ERR(siu_platform_device)) - return PTR_ERR(siu_platform_device); + siu_platform_device = platform_device_alloc("SIU", -1); + if (!siu_platform_device) + return -ENOMEM; - retval = driver_register(&siu_device_driver); + retval = platform_device_add(siu_platform_device); + if (retval < 0) { + platform_device_put(siu_platform_device); + return retval; + } + + retval = platform_driver_register(&siu_device_driver); if (retval < 0) platform_device_unregister(siu_platform_device); return retval; } -static void __devexit vr41xx_siu_exit(void) +static void __exit vr41xx_siu_exit(void) { - driver_unregister(&siu_device_driver); - + platform_driver_unregister(&siu_device_driver); platform_device_unregister(siu_platform_device); } diff --git a/drivers/sn/ioc3.c b/drivers/sn/ioc3.c index 501316b19..6c7e0352d 100644 --- a/drivers/sn/ioc3.c +++ b/drivers/sn/ioc3.c @@ -7,7 +7,6 @@ * Pat Gefre - IOC3 serial port IRQ demuxer */ -#include #include #include #include @@ -26,7 +25,7 @@ static DECLARE_RWSEM(ioc3_devices_rwsem); static struct ioc3_submodule *ioc3_submodules[IOC3_MAX_SUBMODULES]; static struct ioc3_submodule *ioc3_ethernet; -static rwlock_t ioc3_submodules_lock = RW_LOCK_UNLOCKED; +static DEFINE_RWLOCK(ioc3_submodules_lock); /* NIC probing code */ @@ -707,7 +706,7 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id) writel(~0, &idd->vma->eisr); idd->dual_irq = 1; - if (!request_irq(pdev->irq, ioc3_intr_eth, SA_SHIRQ, + if (!request_irq(pdev->irq, ioc3_intr_eth, IRQF_SHARED, "ioc3-eth", (void *)idd)) { idd->irq_eth = pdev->irq; } else { @@ -715,7 +714,7 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id) "%s : request_irq fails for IRQ 0x%x\n ", __FUNCTION__, pdev->irq); } - if (!request_irq(pdev->irq+2, ioc3_intr_io, SA_SHIRQ, + if (!request_irq(pdev->irq+2, ioc3_intr_io, IRQF_SHARED, "ioc3-io", (void *)idd)) { idd->irq_io = pdev->irq+2; } else { @@ -724,7 +723,7 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id) __FUNCTION__, pdev->irq+2); } } else { - if (!request_irq(pdev->irq, ioc3_intr_io, SA_SHIRQ, + if (!request_irq(pdev->irq, ioc3_intr_io, IRQF_SHARED, "ioc3", (void *)idd)) { idd->irq_io = pdev->irq; } else { diff --git a/drivers/sn/ioc4.c b/drivers/sn/ioc4.c index d9e4ee280..8562821e6 100644 --- a/drivers/sn/ioc4.c +++ b/drivers/sn/ioc4.c @@ -6,60 +6,471 @@ * Copyright (C) 2005 Silicon Graphics, Inc. All Rights Reserved. */ -/* - * This file contains a shim driver for the IOC4 IDE and serial drivers. +/* This file contains the master driver module for use by SGI IOC4 subdrivers. + * + * It allocates any resources shared between multiple subdevices, and + * provides accessor functions (where needed) and the like for those + * resources. It also provides a mechanism for the subdevice modules + * to support loading and unloading. + * + * Non-shared resources (e.g. external interrupt A_INT_OUT register page + * alias, serial port and UART registers) are handled by the subdevice + * modules themselves. + * + * This is all necessary because IOC4 is not implemented as a multi-function + * PCI device, but an amalgamation of disparate registers for several + * types of device (ATA, serial, external interrupts). The normal + * resource management in the kernel doesn't have quite the right interfaces + * to handle this situation (e.g. multiple modules can't claim the same + * PCI ID), thus this IOC4 master module. */ #include #include #include -#include -#include +#include +#include +#include +#include +#include +#include +#include +/*************** + * Definitions * + ***************/ -static int __devinit -ioc4_probe_one(struct pci_dev *pdev, const struct pci_device_id *pci_id) +/* Tweakable values */ + +/* PCI bus speed detection/calibration */ +#define IOC4_CALIBRATE_COUNT 63 /* Calibration cycle period */ +#define IOC4_CALIBRATE_CYCLES 256 /* Average over this many cycles */ +#define IOC4_CALIBRATE_DISCARD 2 /* Discard first few cycles */ +#define IOC4_CALIBRATE_LOW_MHZ 25 /* Lower bound on bus speed sanity */ +#define IOC4_CALIBRATE_HIGH_MHZ 75 /* Upper bound on bus speed sanity */ +#define IOC4_CALIBRATE_DEFAULT_MHZ 66 /* Assumed if sanity check fails */ + +/************************ + * Submodule management * + ************************/ + +static DEFINE_MUTEX(ioc4_mutex); + +static LIST_HEAD(ioc4_devices); +static LIST_HEAD(ioc4_submodules); + +/* Register an IOC4 submodule */ +int +ioc4_register_submodule(struct ioc4_submodule *is) +{ + struct ioc4_driver_data *idd; + + mutex_lock(&ioc4_mutex); + list_add(&is->is_list, &ioc4_submodules); + + /* Initialize submodule for each IOC4 */ + if (!is->is_probe) + goto out; + + list_for_each_entry(idd, &ioc4_devices, idd_list) { + if (is->is_probe(idd)) { + printk(KERN_WARNING + "%s: IOC4 submodule %s probe failed " + "for pci_dev %s", + __FUNCTION__, module_name(is->is_owner), + pci_name(idd->idd_pdev)); + } + } + out: + mutex_unlock(&ioc4_mutex); + return 0; +} + +/* Unregister an IOC4 submodule */ +void +ioc4_unregister_submodule(struct ioc4_submodule *is) +{ + struct ioc4_driver_data *idd; + + mutex_lock(&ioc4_mutex); + list_del(&is->is_list); + + /* Remove submodule for each IOC4 */ + if (!is->is_remove) + goto out; + + list_for_each_entry(idd, &ioc4_devices, idd_list) { + if (is->is_remove(idd)) { + printk(KERN_WARNING + "%s: IOC4 submodule %s remove failed " + "for pci_dev %s.\n", + __FUNCTION__, module_name(is->is_owner), + pci_name(idd->idd_pdev)); + } + } + out: + mutex_unlock(&ioc4_mutex); +} + +/********************* + * Device management * + *********************/ + +#define IOC4_CALIBRATE_LOW_LIMIT \ + (1000*IOC4_EXTINT_COUNT_DIVISOR/IOC4_CALIBRATE_LOW_MHZ) +#define IOC4_CALIBRATE_HIGH_LIMIT \ + (1000*IOC4_EXTINT_COUNT_DIVISOR/IOC4_CALIBRATE_HIGH_MHZ) +#define IOC4_CALIBRATE_DEFAULT \ + (1000*IOC4_EXTINT_COUNT_DIVISOR/IOC4_CALIBRATE_DEFAULT_MHZ) + +#define IOC4_CALIBRATE_END \ + (IOC4_CALIBRATE_CYCLES + IOC4_CALIBRATE_DISCARD) + +#define IOC4_INT_OUT_MODE_TOGGLE 0x7 /* Toggle INT_OUT every COUNT+1 ticks */ + +/* Determines external interrupt output clock period of the PCI bus an + * IOC4 is attached to. This value can be used to determine the PCI + * bus speed. + * + * IOC4 has a design feature that various internal timers are derived from + * the PCI bus clock. This causes IOC4 device drivers to need to take the + * bus speed into account when setting various register values (e.g. INT_OUT + * register COUNT field, UART divisors, etc). Since this information is + * needed by several subdrivers, it is determined by the main IOC4 driver, + * even though the following code utilizes external interrupt registers + * to perform the speed calculation. + */ +static void +ioc4_clock_calibrate(struct ioc4_driver_data *idd) +{ + extern unsigned long sn_rtc_cycles_per_second; + union ioc4_int_out int_out; + union ioc4_gpcr gpcr; + unsigned int state, last_state = 1; + uint64_t start = 0, end, period; + unsigned int count = 0; + + /* Enable output */ + gpcr.raw = 0; + gpcr.fields.dir = IOC4_GPCR_DIR_0; + gpcr.fields.int_out_en = 1; + writel(gpcr.raw, &idd->idd_misc_regs->gpcr_s.raw); + + /* Reset to power-on state */ + writel(0, &idd->idd_misc_regs->int_out.raw); + mmiowb(); + + /* Set up square wave */ + int_out.raw = 0; + int_out.fields.count = IOC4_CALIBRATE_COUNT; + int_out.fields.mode = IOC4_INT_OUT_MODE_TOGGLE; + int_out.fields.diag = 0; + writel(int_out.raw, &idd->idd_misc_regs->int_out.raw); + mmiowb(); + + /* Check square wave period averaged over some number of cycles */ + do { + int_out.raw = readl(&idd->idd_misc_regs->int_out.raw); + state = int_out.fields.int_out; + if (!last_state && state) { + count++; + if (count == IOC4_CALIBRATE_END) { + end = rtc_time(); + break; + } else if (count == IOC4_CALIBRATE_DISCARD) + start = rtc_time(); + } + last_state = state; + } while (1); + + /* Calculation rearranged to preserve intermediate precision. + * Logically: + * 1. "end - start" gives us number of RTC cycles over all the + * square wave cycles measured. + * 2. Divide by number of square wave cycles to get number of + * RTC cycles per square wave cycle. + * 3. Divide by 2*(int_out.fields.count+1), which is the formula + * by which the IOC4 generates the square wave, to get the + * number of RTC cycles per IOC4 INT_OUT count. + * 4. Divide by sn_rtc_cycles_per_second to get seconds per + * count. + * 5. Multiply by 1E9 to get nanoseconds per count. + */ + period = ((end - start) * 1000000000) / + (IOC4_CALIBRATE_CYCLES * 2 * (IOC4_CALIBRATE_COUNT + 1) + * sn_rtc_cycles_per_second); + + /* Bounds check the result. */ + if (period > IOC4_CALIBRATE_LOW_LIMIT || + period < IOC4_CALIBRATE_HIGH_LIMIT) { + printk(KERN_INFO + "IOC4 %s: Clock calibration failed. Assuming" + "PCI clock is %d ns.\n", + pci_name(idd->idd_pdev), + IOC4_CALIBRATE_DEFAULT / IOC4_EXTINT_COUNT_DIVISOR); + period = IOC4_CALIBRATE_DEFAULT; + } else { + printk(KERN_DEBUG + "IOC4 %s: PCI clock is %ld ns.\n", + pci_name(idd->idd_pdev), + period / IOC4_EXTINT_COUNT_DIVISOR); + } + + /* Remember results. We store the extint clock period rather + * than the PCI clock period so that greater precision is + * retained. Divide by IOC4_EXTINT_COUNT_DIVISOR to get + * PCI clock period. + */ + idd->count_period = period; +} + +/* There are three variants of IOC4 cards: IO9, IO10, and PCI-RT. + * Each brings out different combinations of IOC4 signals, thus. + * the IOC4 subdrivers need to know to which we're attached. + * + * We look for the presence of a SCSI (IO9) or SATA (IO10) controller + * on the same PCI bus at slot number 3 to differentiate IO9 from IO10. + * If neither is present, it's a PCI-RT. + */ +static unsigned int +ioc4_variant(struct ioc4_driver_data *idd) { + struct pci_dev *pdev = NULL; + int found = 0; + + /* IO9: Look for a QLogic ISP 12160 at the same bus and slot 3. */ + do { + pdev = pci_get_device(PCI_VENDOR_ID_QLOGIC, + PCI_DEVICE_ID_QLOGIC_ISP12160, pdev); + if (pdev && + idd->idd_pdev->bus->number == pdev->bus->number && + 3 == PCI_SLOT(pdev->devfn)) + found = 1; + pci_dev_put(pdev); + } while (pdev && !found); + if (NULL != pdev) + return IOC4_VARIANT_IO9; + + /* IO10: Look for a Vitesse VSC 7174 at the same bus and slot 3. */ + pdev = NULL; + do { + pdev = pci_get_device(PCI_VENDOR_ID_VITESSE, + PCI_DEVICE_ID_VITESSE_VSC7174, pdev); + if (pdev && + idd->idd_pdev->bus->number == pdev->bus->number && + 3 == PCI_SLOT(pdev->devfn)) + found = 1; + pci_dev_put(pdev); + } while (pdev && !found); + if (NULL != pdev) + return IOC4_VARIANT_IO10; + + /* PCI-RT: No SCSI/SATA controller will be present */ + return IOC4_VARIANT_PCI_RT; +} + +/* Adds a new instance of an IOC4 card */ +static int +ioc4_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id) +{ + struct ioc4_driver_data *idd; + struct ioc4_submodule *is; + uint32_t pcmd; int ret; + /* Enable IOC4 and take ownership of it */ if ((ret = pci_enable_device(pdev))) { printk(KERN_WARNING - "%s: Failed to enable device with " - "pci_dev 0x%p... returning\n", - __FUNCTION__, (void *)pdev); - return ret; + "%s: Failed to enable IOC4 device for pci_dev %s.\n", + __FUNCTION__, pci_name(pdev)); + goto out; } pci_set_master(pdev); - /* attach each sub-device */ - ret = ioc4_ide_attach_one(pdev, pci_id); - if (ret) - return ret; - return ioc4_serial_attach_one(pdev, pci_id); + /* Set up per-IOC4 data */ + idd = kmalloc(sizeof(struct ioc4_driver_data), GFP_KERNEL); + if (!idd) { + printk(KERN_WARNING + "%s: Failed to allocate IOC4 data for pci_dev %s.\n", + __FUNCTION__, pci_name(pdev)); + ret = -ENODEV; + goto out_idd; + } + idd->idd_pdev = pdev; + idd->idd_pci_id = pci_id; + + /* Map IOC4 misc registers. These are shared between subdevices + * so the main IOC4 module manages them. + */ + idd->idd_bar0 = pci_resource_start(idd->idd_pdev, 0); + if (!idd->idd_bar0) { + printk(KERN_WARNING + "%s: Unable to find IOC4 misc resource " + "for pci_dev %s.\n", + __FUNCTION__, pci_name(idd->idd_pdev)); + ret = -ENODEV; + goto out_pci; + } + if (!request_region(idd->idd_bar0, sizeof(struct ioc4_misc_regs), + "ioc4_misc")) { + printk(KERN_WARNING + "%s: Unable to request IOC4 misc region " + "for pci_dev %s.\n", + __FUNCTION__, pci_name(idd->idd_pdev)); + ret = -ENODEV; + goto out_pci; + } + idd->idd_misc_regs = ioremap(idd->idd_bar0, + sizeof(struct ioc4_misc_regs)); + if (!idd->idd_misc_regs) { + printk(KERN_WARNING + "%s: Unable to remap IOC4 misc region " + "for pci_dev %s.\n", + __FUNCTION__, pci_name(idd->idd_pdev)); + ret = -ENODEV; + goto out_misc_region; + } + + /* Failsafe portion of per-IOC4 initialization */ + + /* Detect card variant */ + idd->idd_variant = ioc4_variant(idd); + printk(KERN_INFO "IOC4 %s: %s card detected.\n", pci_name(pdev), + idd->idd_variant == IOC4_VARIANT_IO9 ? "IO9" : + idd->idd_variant == IOC4_VARIANT_PCI_RT ? "PCI-RT" : + idd->idd_variant == IOC4_VARIANT_IO10 ? "IO10" : "unknown"); + + /* Initialize IOC4 */ + pci_read_config_dword(idd->idd_pdev, PCI_COMMAND, &pcmd); + pci_write_config_dword(idd->idd_pdev, PCI_COMMAND, + pcmd | PCI_COMMAND_PARITY | PCI_COMMAND_SERR); + + /* Determine PCI clock */ + ioc4_clock_calibrate(idd); + + /* Disable/clear all interrupts. Need to do this here lest + * one submodule request the shared IOC4 IRQ, but interrupt + * is generated by a different subdevice. + */ + /* Disable */ + writel(~0, &idd->idd_misc_regs->other_iec.raw); + writel(~0, &idd->idd_misc_regs->sio_iec); + /* Clear (i.e. acknowledge) */ + writel(~0, &idd->idd_misc_regs->other_ir.raw); + writel(~0, &idd->idd_misc_regs->sio_ir); + + /* Track PCI-device specific data */ + idd->idd_serial_data = NULL; + pci_set_drvdata(idd->idd_pdev, idd); + + mutex_lock(&ioc4_mutex); + list_add_tail(&idd->idd_list, &ioc4_devices); + + /* Add this IOC4 to all submodules */ + list_for_each_entry(is, &ioc4_submodules, is_list) { + if (is->is_probe && is->is_probe(idd)) { + printk(KERN_WARNING + "%s: IOC4 submodule 0x%s probe failed " + "for pci_dev %s.\n", + __FUNCTION__, module_name(is->is_owner), + pci_name(idd->idd_pdev)); + } + } + mutex_unlock(&ioc4_mutex); + + return 0; + +out_misc_region: + release_region(idd->idd_bar0, sizeof(struct ioc4_misc_regs)); +out_pci: + kfree(idd); +out_idd: + pci_disable_device(pdev); +out: + return ret; } -/* pci device struct */ -static struct pci_device_id ioc4_s_id_table[] = { +/* Removes a particular instance of an IOC4 card. */ +static void +ioc4_remove(struct pci_dev *pdev) +{ + struct ioc4_submodule *is; + struct ioc4_driver_data *idd; + + idd = pci_get_drvdata(pdev); + + /* Remove this IOC4 from all submodules */ + mutex_lock(&ioc4_mutex); + list_for_each_entry(is, &ioc4_submodules, is_list) { + if (is->is_remove && is->is_remove(idd)) { + printk(KERN_WARNING + "%s: IOC4 submodule 0x%s remove failed " + "for pci_dev %s.\n", + __FUNCTION__, module_name(is->is_owner), + pci_name(idd->idd_pdev)); + } + } + mutex_unlock(&ioc4_mutex); + + /* Release resources */ + iounmap(idd->idd_misc_regs); + if (!idd->idd_bar0) { + printk(KERN_WARNING + "%s: Unable to get IOC4 misc mapping for pci_dev %s. " + "Device removal may be incomplete.\n", + __FUNCTION__, pci_name(idd->idd_pdev)); + } + release_region(idd->idd_bar0, sizeof(struct ioc4_misc_regs)); + + /* Disable IOC4 and relinquish */ + pci_disable_device(pdev); + + /* Remove and free driver data */ + mutex_lock(&ioc4_mutex); + list_del(&idd->idd_list); + mutex_unlock(&ioc4_mutex); + kfree(idd); +} + +static struct pci_device_id ioc4_id_table[] = { {PCI_VENDOR_ID_SGI, PCI_DEVICE_ID_SGI_IOC4, PCI_ANY_ID, PCI_ANY_ID, 0x0b4000, 0xFFFFFF}, {0} }; -MODULE_DEVICE_TABLE(pci, ioc4_s_id_table); -static struct pci_driver __devinitdata ioc4_s_driver = { - .name = "IOC4", - .id_table = ioc4_s_id_table, - .probe = ioc4_probe_one, +static struct pci_driver ioc4_driver = { + .name = "IOC4", + .id_table = ioc4_id_table, + .probe = ioc4_probe, + .remove = ioc4_remove, }; -static int __devinit ioc4_detect(void) +MODULE_DEVICE_TABLE(pci, ioc4_id_table); + +/********************* + * Module management * + *********************/ + +/* Module load */ +static int __devinit +ioc4_init(void) { - ioc4_serial_init(); + return pci_register_driver(&ioc4_driver); +} - return pci_register_driver(&ioc4_s_driver); +/* Module unload */ +static void __devexit +ioc4_exit(void) +{ + pci_unregister_driver(&ioc4_driver); } -module_init(ioc4_detect); -MODULE_AUTHOR("Pat Gefre - Silicon Graphics Inc. (SGI) "); -MODULE_DESCRIPTION("PCI driver module for SGI IOC4 Base-IO Card"); +module_init(ioc4_init); +module_exit(ioc4_exit); + +MODULE_AUTHOR("Brent Casavant - Silicon Graphics, Inc. "); +MODULE_DESCRIPTION("PCI driver master module for SGI IOC4 Base-IO Card"); MODULE_LICENSE("GPL"); + +EXPORT_SYMBOL(ioc4_register_submodule); +EXPORT_SYMBOL(ioc4_unregister_submodule); diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 1cea4a679..146298ad7 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -210,6 +210,7 @@ spi_new_device(struct spi_master *master, struct spi_board_info *chip) proxy->master = master; proxy->chip_select = chip->chip_select; proxy->max_speed_hz = chip->max_speed_hz; + proxy->mode = chip->mode; proxy->irq = chip->irq; proxy->modalias = chip->modalias; @@ -509,7 +510,7 @@ static void spi_complete(void *arg) */ int spi_sync(struct spi_device *spi, struct spi_message *message) { - DECLARE_COMPLETION(done); + DECLARE_COMPLETION_ONSTACK(done); int status; message->complete = spi_complete; diff --git a/drivers/spi/spi_bitbang.c b/drivers/spi/spi_bitbang.c index dd2f950b2..a23862ef7 100644 --- a/drivers/spi/spi_bitbang.c +++ b/drivers/spi/spi_bitbang.c @@ -16,7 +16,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include #include #include #include diff --git a/drivers/spi/spi_butterfly.c b/drivers/spi/spi_butterfly.c index a006a1ee2..39d9b20f2 100644 --- a/drivers/spi/spi_butterfly.c +++ b/drivers/spi/spi_butterfly.c @@ -17,7 +17,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include #include #include diff --git a/drivers/spi/spi_s3c24xx.c b/drivers/spi/spi_s3c24xx.c index 5fc14563e..20eb6e95a 100644 --- a/drivers/spi/spi_s3c24xx.c +++ b/drivers/spi/spi_s3c24xx.c @@ -13,7 +13,6 @@ //#define DEBUG -#include #include #include #include diff --git a/drivers/spi/spi_s3c24xx_gpio.c b/drivers/spi/spi_s3c24xx_gpio.c index aacdceb8f..a5d2cdfff 100644 --- a/drivers/spi/spi_s3c24xx_gpio.c +++ b/drivers/spi/spi_s3c24xx_gpio.c @@ -11,7 +11,6 @@ * */ -#include #include #include #include diff --git a/drivers/tc/lk201.c b/drivers/tc/lk201.c index cf10d5cdf..757dec9c7 100644 --- a/drivers/tc/lk201.c +++ b/drivers/tc/lk201.c @@ -8,7 +8,6 @@ * Copyright (C) 2001, 2002, 2003, 2004 Maciej W. Rozycki */ -#include #include #include diff --git a/drivers/tc/zs.c b/drivers/tc/zs.c index 2dffa8e30..5e8a27620 100644 --- a/drivers/tc/zs.c +++ b/drivers/tc/zs.c @@ -39,7 +39,6 @@ * is shared with DSRS(DTE) at pin 23. */ -#include #include #include #include @@ -1745,7 +1744,6 @@ int __init zs_init(void) /* Not all of this is exactly right for us. */ serial_driver->owner = THIS_MODULE; - serial_driver->devfs_name = "tts/"; serial_driver->name = "ttyS"; serial_driver->major = TTY_MAJOR; serial_driver->minor_start = 64; @@ -1754,7 +1752,7 @@ int __init zs_init(void) serial_driver->init_termios = tty_std_termios; serial_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; - serial_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS; + serial_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV; tty_set_operations(serial_driver, &serial_ops); if (tty_register_driver(serial_driver)) @@ -1793,7 +1791,7 @@ int __init zs_init(void) zs_soft[channel].clk_divisor = 16; zs_soft[channel].zs_baud = get_zsbaud(&zs_soft[channel]); - if (request_irq(zs_soft[channel].irq, rs_interrupt, SA_SHIRQ, + if (request_irq(zs_soft[channel].irq, rs_interrupt, IRQF_SHARED, "scc", &zs_soft[channel])) printk(KERN_ERR "decserial: can't get irq %d\n", zs_soft[channel].irq); diff --git a/drivers/telephony/ixj.c b/drivers/telephony/ixj.c index 5578a9dd0..f6b2948ab 100644 --- a/drivers/telephony/ixj.c +++ b/drivers/telephony/ixj.c @@ -5712,7 +5712,7 @@ static int ixj_daa_write(IXJ *j) return 1; } -int ixj_set_tone_off(unsigned short arg, IXJ *j) +static int ixj_set_tone_off(unsigned short arg, IXJ *j) { j->tone_off_time = arg; if (ixj_WriteDSPCommand(0x6E05, j)) /* Set Tone Off Period */ diff --git a/drivers/telephony/phonedev.c b/drivers/telephony/phonedev.c index e166fffea..e41f49afd 100644 --- a/drivers/telephony/phonedev.c +++ b/drivers/telephony/phonedev.c @@ -28,7 +28,6 @@ #include #include -#include #include #define PHONE_NUM_DEVICES 256 @@ -106,8 +105,6 @@ int phone_register_device(struct phone_device *p, int unit) if (phone_device[i] == NULL) { phone_device[i] = p; p->minor = i; - devfs_mk_cdev(MKDEV(PHONE_MAJOR,i), - S_IFCHR|S_IRUSR|S_IWUSR, "phone/%d", i); mutex_unlock(&phone_lock); return 0; } @@ -125,7 +122,6 @@ void phone_unregister_device(struct phone_device *pfd) mutex_lock(&phone_lock); if (phone_device[pfd->minor] != pfd) panic("phone: bad unregister"); - devfs_remove("phone/%d", pfd->minor); phone_device[pfd->minor] = NULL; mutex_unlock(&phone_lock); } diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig index 7fdbc5dad..005043197 100644 --- a/drivers/usb/Kconfig +++ b/drivers/usb/Kconfig @@ -23,7 +23,8 @@ config USB_ARCH_HAS_OHCI default y if ARCH_LH7A404 default y if ARCH_S3C2410 default y if PXA27x - default y if ARCH_AT91RM9200 + default y if ARCH_EP93XX + default y if (ARCH_AT91RM9200 || ARCH_AT91SAM9261) # PPC: default y if STB03xxx default y if PPC_MPC52xx diff --git a/drivers/usb/Makefile b/drivers/usb/Makefile index 9b7d9769f..4710eb02e 100644 --- a/drivers/usb/Makefile +++ b/drivers/usb/Makefile @@ -48,6 +48,7 @@ obj-$(CONFIG_USB_MICROTEK) += image/ obj-$(CONFIG_USB_SERIAL) += serial/ obj-$(CONFIG_USB_AUERSWALD) += misc/ +obj-$(CONFIG_USB_CYPRESS_CY7C63)+= misc/ obj-$(CONFIG_USB_CYTHERM) += misc/ obj-$(CONFIG_USB_EMI26) += misc/ obj-$(CONFIG_USB_EMI62) += misc/ @@ -61,6 +62,7 @@ obj-$(CONFIG_USB_TEST) += misc/ obj-$(CONFIG_USB_USS720) += misc/ obj-$(CONFIG_USB_PHIDGETSERVO) += misc/ obj-$(CONFIG_USB_SISUSBVGA) += misc/ +obj-$(CONFIG_USB_APPLEDISPLAY) += misc/ obj-$(CONFIG_USB_ATM) += atm/ obj-$(CONFIG_USB_SPEEDTOUCH) += atm/ diff --git a/drivers/usb/atm/usbatm.c b/drivers/usb/atm/usbatm.c index 546249843..a38701c74 100644 --- a/drivers/usb/atm/usbatm.c +++ b/drivers/usb/atm/usbatm.c @@ -1039,7 +1039,7 @@ static void usbatm_tasklet_schedule(unsigned long data) tasklet_schedule((struct tasklet_struct *) data); } -static inline void usbatm_init_channel(struct usbatm_channel *channel) +static void usbatm_init_channel(struct usbatm_channel *channel) { spin_lock_init(&channel->lock); INIT_LIST_HEAD(&channel->list); diff --git a/drivers/usb/atm/xusbatm.c b/drivers/usb/atm/xusbatm.c index 42d6823b8..70125c6d3 100644 --- a/drivers/usb/atm/xusbatm.c +++ b/drivers/usb/atm/xusbatm.c @@ -20,7 +20,6 @@ ******************************************************************************/ #include -#include /* FIXME: required by linux/etherdevice.h */ #include /* for random_ether_addr() */ #include "usbatm.h" diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 6dd339f4c..ca90326f2 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c @@ -63,7 +63,7 @@ #include #include #include -#include +#include #include #include #include @@ -127,8 +127,8 @@ static int acm_wb_alloc(struct acm *acm) wb->use = 1; return wbn; } - wbn = (wbn + 1) % ACM_NWB; - if (++i >= ACM_NWB) + wbn = (wbn + 1) % ACM_NW; + if (++i >= ACM_NW) return -1; } } @@ -142,10 +142,9 @@ static int acm_wb_is_avail(struct acm *acm) { int i, n; - n = 0; - for (i = 0; i < ACM_NWB; i++) { - if (!acm->wb[i].use) - n++; + n = ACM_NW; + for (i = 0; i < ACM_NW; i++) { + n -= acm->wb[i].use; } return n; } @@ -167,7 +166,7 @@ static void acm_write_done(struct acm *acm) acm->write_ready = 1; wbn = acm->write_current; acm_wb_free(acm, wbn); - acm->write_current = (wbn + 1) % ACM_NWB; + acm->write_current = (wbn + 1) % ACM_NW; spin_unlock_irqrestore(&acm->write_lock, flags); } @@ -291,22 +290,32 @@ static void acm_read_bulk(struct urb *urb, struct pt_regs *regs) 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); + int status = urb->status; + dbg("Entering acm_read_bulk with status %d", urb->status); if (!ACM_READY(acm)) return; - if (urb->status) - dev_dbg(&acm->data->dev, "bulk rx status %d\n", urb->status); + if (status) + dev_dbg(&acm->data->dev, "bulk rx status %d", status); 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); - + if (likely(status == 0)) { + 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); + } else { + /* we drop the buffer due to an error */ + spin_lock(&acm->read_lock); + list_add_tail(&rcv->list, &acm->spare_read_urbs); + list_add(&buf->list, &acm->spare_read_bufs); + spin_unlock(&acm->read_lock); + /* nevertheless the tasklet must be kicked unconditionally + so the queue cannot dry up */ + } tasklet_schedule(&acm->urb_task); } @@ -334,7 +343,7 @@ next_buffer: list_del(&buf->list); spin_unlock(&acm->read_lock); - dbg("acm_rx_tasklet: procesing buf 0x%p, size = %d\n", buf, buf->size); + dbg("acm_rx_tasklet: procesing buf 0x%p, size = %d", buf, buf->size); tty_buffer_request_room(tty, buf->size); if (!acm->throttle) @@ -385,7 +394,7 @@ urbs: 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); + dbg("acm_rx_tasklet: sending urb 0x%p, rcv 0x%p, buf 0x%p", rcv->urb, rcv, buf); /* This shouldn't kill the driver as unsuccessful URBs are returned to the free-urbs-pool and resubmited ASAP */ @@ -404,7 +413,7 @@ static void acm_write_bulk(struct urb *urb, struct pt_regs *regs) { struct acm *acm = (struct acm *)urb->context; - dbg("Entering acm_write_bulk with status %d\n", urb->status); + dbg("Entering acm_write_bulk with status %d", urb->status); acm_write_done(acm); acm_write_start(acm); @@ -415,7 +424,7 @@ static void acm_write_bulk(struct urb *urb, struct pt_regs *regs) static void acm_softint(void *private) { struct acm *acm = private; - dbg("Entering acm_softint.\n"); + dbg("Entering acm_softint."); if (!ACM_READY(acm)) return; @@ -431,7 +440,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"); + dbg("Entering acm_tty_open."); mutex_lock(&open_mutex); @@ -464,10 +473,10 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp) 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++) { + for (i = 0; i < acm->rx_buflimit; i++) { list_add(&(acm->ru[i].list), &acm->spare_read_urbs); } - for (i = 0; i < ACM_NRB; i++) { + for (i = 0; i < acm->rx_buflimit; i++) { list_add(&(acm->rb[i].list), &acm->spare_read_bufs); } @@ -488,14 +497,15 @@ bail_out: static void acm_tty_unregister(struct acm *acm) { - int i; + int i,nr; + nr = acm->rx_buflimit; 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->writeurb); - for (i = 0; i < ACM_NRU; i++) + for (i = 0; i < nr; i++) usb_free_urb(acm->ru[i].urb); kfree(acm); } @@ -503,18 +513,19 @@ static void acm_tty_unregister(struct acm *acm) static void acm_tty_close(struct tty_struct *tty, struct file *filp) { struct acm *acm = tty->driver_data; - int i; + int i,nr; if (!acm || !acm->used) return; + nr = acm->rx_buflimit; mutex_lock(&open_mutex); if (!--acm->used) { if (acm->dev) { acm_set_control(acm, acm->ctrlout = 0); usb_kill_urb(acm->ctrlurb); usb_kill_urb(acm->writeurb); - for (i = 0; i < ACM_NRU; i++) + for (i = 0; i < nr; i++) usb_kill_urb(acm->ru[i].urb); } else acm_tty_unregister(acm); @@ -530,7 +541,7 @@ static int acm_tty_write(struct tty_struct *tty, const unsigned char *buf, int c int wbn; struct acm_wb *wb; - dbg("Entering acm_tty_write to write %d bytes,\n", count); + dbg("Entering acm_tty_write to write %d bytes,", count); if (!ACM_READY(acm)) return -EINVAL; @@ -576,7 +587,7 @@ static int acm_tty_chars_in_buffer(struct tty_struct *tty) /* * This is inaccurate (overcounts), but it works. */ - return (ACM_NWB - acm_wb_is_avail(acm)) * acm->writesize; + return (ACM_NW - acm_wb_is_avail(acm)) * acm->writesize; } static void acm_tty_throttle(struct tty_struct *tty) @@ -712,7 +723,7 @@ static void acm_write_buffers_free(struct acm *acm) int i; struct acm_wb *wb; - for (wb = &acm->wb[0], i = 0; i < ACM_NWB; i++, wb++) { + for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++) { usb_buffer_free(acm->dev, acm->writesize, wb->buf, wb->dmah); } } @@ -723,7 +734,7 @@ static int acm_write_buffers_alloc(struct acm *acm) int i; struct acm_wb *wb; - for (wb = &acm->wb[0], i = 0; i < ACM_NWB; i++, wb++) { + for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++) { wb->buf = usb_buffer_alloc(acm->dev, acm->writesize, GFP_KERNEL, &wb->dmah); if (!wb->buf) { @@ -760,10 +771,14 @@ static int acm_probe (struct usb_interface *intf, int call_interface_num = -1; int data_interface_num; unsigned long quirks; + int num_rx_buf; int i; - /* handle quirks deadly to normal probing*/ + /* normal quirks */ quirks = (unsigned long)id->driver_info; + num_rx_buf = (quirks == SINGLE_RX_URB) ? 1 : ACM_NR; + + /* handle quirks deadly to normal probing*/ if (quirks == NO_UNION_NORMAL) { data_interface = usb_ifnum_to_if(usb_dev, 1); control_interface = usb_ifnum_to_if(usb_dev, 0); @@ -778,7 +793,7 @@ static int acm_probe (struct usb_interface *intf, if (!buflen) { if (intf->cur_altsetting->endpoint->extralen && intf->cur_altsetting->endpoint->extra) { - dev_dbg(&intf->dev,"Seeking extra descriptors on endpoint\n"); + dev_dbg(&intf->dev,"Seeking extra descriptors on endpoint"); buflen = intf->cur_altsetting->endpoint->extralen; buffer = intf->cur_altsetting->endpoint->extra; } else { @@ -827,24 +842,24 @@ next_desc: if (!union_header) { if (call_interface_num > 0) { - dev_dbg(&intf->dev,"No union descriptor, using call management descriptor\n"); + dev_dbg(&intf->dev,"No union descriptor, using call management descriptor"); data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = call_interface_num)); control_interface = intf; } else { - dev_dbg(&intf->dev,"No union descriptor, giving up\n"); + dev_dbg(&intf->dev,"No union descriptor, giving up"); return -ENODEV; } } else { control_interface = usb_ifnum_to_if(usb_dev, union_header->bMasterInterface0); data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = union_header->bSlaveInterface0)); if (!control_interface || !data_interface) { - dev_dbg(&intf->dev,"no interfaces\n"); + dev_dbg(&intf->dev,"no interfaces"); return -ENODEV; } } if (data_interface_num != call_interface_num) - dev_dbg(&intf->dev,"Seperate call control interface. That is not fully supported.\n"); + dev_dbg(&intf->dev,"Seperate call control interface. That is not fully supported."); skip_normal_probe: @@ -852,7 +867,7 @@ skip_normal_probe: if (data_interface->cur_altsetting->desc.bInterfaceClass != CDC_DATA_INTERFACE_TYPE) { if (control_interface->cur_altsetting->desc.bInterfaceClass == CDC_DATA_INTERFACE_TYPE) { struct usb_interface *t; - dev_dbg(&intf->dev,"Your device has switched interfaces.\n"); + dev_dbg(&intf->dev,"Your device has switched interfaces."); t = control_interface; control_interface = data_interface; @@ -863,7 +878,7 @@ skip_normal_probe: } if (usb_interface_claimed(data_interface)) { /* valid in this context */ - dev_dbg(&intf->dev,"The data interface isn't available\n"); + dev_dbg(&intf->dev,"The data interface isn't available"); return -EBUSY; } @@ -880,7 +895,7 @@ skip_normal_probe: if ((epread->bEndpointAddress & USB_DIR_IN) != USB_DIR_IN) { /* descriptors are swapped */ struct usb_endpoint_descriptor *t; - dev_dbg(&intf->dev,"The data interface has switched endpoints\n"); + dev_dbg(&intf->dev,"The data interface has switched endpoints"); t = epread; epread = epwrite; @@ -895,12 +910,12 @@ skip_normal_probe: } if (!(acm = kzalloc(sizeof(struct acm), GFP_KERNEL))) { - dev_dbg(&intf->dev, "out of memory (acm kzalloc)\n"); + dev_dbg(&intf->dev, "out of memory (acm kzalloc)"); goto alloc_fail; } ctrlsize = le16_to_cpu(epctrl->wMaxPacketSize); - readsize = le16_to_cpu(epread->wMaxPacketSize)*2; + readsize = le16_to_cpu(epread->wMaxPacketSize)* ( quirks == SINGLE_RX_URB ? 1 : 2); acm->writesize = le16_to_cpu(epwrite->wMaxPacketSize); acm->control = control_interface; acm->data = data_interface; @@ -909,6 +924,7 @@ skip_normal_probe: acm->ctrl_caps = ac_management_function; acm->ctrlsize = ctrlsize; acm->readsize = readsize; + acm->rx_buflimit = num_rx_buf; acm->urb_task.func = acm_rx_tasklet; acm->urb_task.data = (unsigned long) acm; INIT_WORK(&acm->work, acm_softint, acm); @@ -920,44 +936,43 @@ skip_normal_probe: buf = usb_buffer_alloc(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma); if (!buf) { - dev_dbg(&intf->dev, "out of memory (ctrl buffer alloc)\n"); + dev_dbg(&intf->dev, "out of memory (ctrl buffer alloc)"); goto alloc_fail2; } acm->ctrl_buffer = buf; if (acm_write_buffers_alloc(acm) < 0) { - dev_dbg(&intf->dev, "out of memory (write buffer alloc)\n"); + dev_dbg(&intf->dev, "out of memory (write buffer alloc)"); goto alloc_fail4; } acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL); if (!acm->ctrlurb) { - dev_dbg(&intf->dev, "out of memory (ctrlurb kmalloc)\n"); + dev_dbg(&intf->dev, "out of memory (ctrlurb kmalloc)"); goto alloc_fail5; } - for (i = 0; i < ACM_NRU; i++) { + for (i = 0; i < num_rx_buf; 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"); + dev_dbg(&intf->dev, "out of memory (read urbs usb_alloc_urb)"); goto alloc_fail7; } rcv->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; rcv->instance = acm; } - for (i = 0; i < ACM_NRB; i++) { + for (i = 0; i < num_rx_buf; 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"); + dev_dbg(&intf->dev, "out of memory (read bufs usb_buffer_alloc)"); goto alloc_fail7; } } acm->writeurb = usb_alloc_urb(0, GFP_KERNEL); if (!acm->writeurb) { - dev_dbg(&intf->dev, "out of memory (writeurb kmalloc)\n"); + dev_dbg(&intf->dev, "out of memory (writeurb kmalloc)"); goto alloc_fail7; } @@ -988,9 +1003,9 @@ skip_normal_probe: return 0; alloc_fail7: - for (i = 0; i < ACM_NRB; i++) + for (i = 0; i < num_rx_buf; i++) usb_buffer_free(usb_dev, acm->readsize, acm->rb[i].base, acm->rb[i].dma); - for (i = 0; i < ACM_NRU; i++) + for (i = 0; i < num_rx_buf; i++) usb_free_urb(acm->ru[i].urb); usb_free_urb(acm->ctrlurb); alloc_fail5: @@ -1027,7 +1042,7 @@ static void acm_disconnect(struct usb_interface *intf) usb_kill_urb(acm->ctrlurb); usb_kill_urb(acm->writeurb); - for (i = 0; i < ACM_NRU; i++) + for (i = 0; i < acm->rx_buflimit; i++) usb_kill_urb(acm->ru[i].urb); INIT_LIST_HEAD(&acm->filled_read_bufs); @@ -1039,7 +1054,7 @@ static void acm_disconnect(struct usb_interface *intf) acm_write_buffers_free(acm); usb_buffer_free(usb_dev, acm->ctrlsize, acm->ctrl_buffer, acm->ctrl_dma); - for (i = 0; i < ACM_NRB; i++) + for (i = 0; i < acm->rx_buflimit; i++) usb_buffer_free(usb_dev, acm->readsize, acm->rb[i].base, acm->rb[i].dma); usb_driver_release_interface(&acm_driver, intf == acm->control ? acm->data : intf); @@ -1068,6 +1083,12 @@ static struct usb_device_id acm_ids[] = { { USB_DEVICE(0x0482, 0x0203), /* KYOCERA AH-K3001V */ .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ }, + { USB_DEVICE(0x0ace, 0x1608), /* ZyDAS 56K USB MODEM */ + .driver_info = SINGLE_RX_URB, /* firmware bug */ + }, + { USB_DEVICE(0x0ace, 0x1611), /* ZyDAS 56K USB MODEM - new version */ + .driver_info = SINGLE_RX_URB, /* firmware bug */ + }, /* control interfaces with various AT-command sets */ { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, USB_CDC_ACM_PROTO_AT_V25TER) }, @@ -1127,12 +1148,11 @@ static int __init acm_init(void) acm_tty_driver->owner = THIS_MODULE, acm_tty_driver->driver_name = "acm", acm_tty_driver->name = "ttyACM", - acm_tty_driver->devfs_name = "usb/acm/", acm_tty_driver->major = ACM_TTY_MAJOR, acm_tty_driver->minor_start = 0, acm_tty_driver->type = TTY_DRIVER_TYPE_SERIAL, acm_tty_driver->subtype = SERIAL_TYPE_NORMAL, - acm_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS, + acm_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV; acm_tty_driver->init_termios = tty_std_termios; acm_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; tty_set_operations(acm_tty_driver, &acm_ops); diff --git a/drivers/usb/class/cdc-acm.h b/drivers/usb/class/cdc-acm.h index 9009114e3..1bcaea32c 100644 --- a/drivers/usb/class/cdc-acm.h +++ b/drivers/usb/class/cdc-acm.h @@ -51,17 +51,62 @@ * Internal driver structures. */ +/* + * The only reason to have several buffers is to accomodate assumptions + * in line disciplines. They ask for empty space amount, receive our URB size, + * and proceed to issue several 1-character writes, assuming they will fit. + * The very first write takes a complete URB. Fortunately, this only happens + * when processing onlcr, so we only need 2 buffers. These values must be + * powers of 2. + */ +#define ACM_NW 2 +#define ACM_NR 16 + +struct acm_wb { + unsigned char *buf; + dma_addr_t dmah; + int len; + 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, *write_buffer; /* buffers of urbs */ - dma_addr_t ctrl_dma, read_dma, write_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_NW]; + struct acm_ru ru[ACM_NR]; + struct acm_rb rb[ACM_NR]; + int rx_buflimit; + 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) */ @@ -71,8 +116,6 @@ struct acm { unsigned int minor; /* acm minor number */ unsigned char throttle; /* throttled by tty layer */ unsigned char clocal; /* termios CLOCAL */ - unsigned char ready_for_write; /* write urb can be used */ - unsigned char resubmit_to_unthrottle; /* throtteling has disabled the read urb */ unsigned int ctrl_caps; /* control capabilities from the class specific header */ }; @@ -80,3 +123,4 @@ struct acm { /* constants describing various quirks and errors */ #define NO_UNION_NORMAL 1 +#define SINGLE_RX_URB 2 diff --git a/drivers/usb/core/Kconfig b/drivers/usb/core/Kconfig index a08787e25..6e3b5358a 100644 --- a/drivers/usb/core/Kconfig +++ b/drivers/usb/core/Kconfig @@ -31,9 +31,6 @@ config USB_DEVICEFS For the format of the various /proc/bus/usb/ files, please read . - Please note that this code is completely unrelated to devfs, the - "/dev file system support". - Most users want to say Y here. config USB_BANDWIDTH diff --git a/drivers/usb/core/Makefile b/drivers/usb/core/Makefile index 28329ddf1..ec510922a 100644 --- a/drivers/usb/core/Makefile +++ b/drivers/usb/core/Makefile @@ -3,7 +3,8 @@ # 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 + config.o file.o buffer.o sysfs.o endpoint.o \ + devio.o notify.o ifeq ($(CONFIG_PCI),y) usbcore-objs += hcd-pci.o diff --git a/drivers/usb/core/buffer.c b/drivers/usb/core/buffer.c index ad742cec9..f4f4ef0f3 100644 --- a/drivers/usb/core/buffer.c +++ b/drivers/usb/core/buffer.c @@ -5,7 +5,6 @@ * and should work with all USB controllers, regardles of bus type. */ -#include #include #include #include diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c index a9d89c78c..4c9e63e66 100644 --- a/drivers/usb/core/config.c +++ b/drivers/usb/core/config.c @@ -1,4 +1,3 @@ -#include #include #include #include diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index 545da37af..d8b047623 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c @@ -47,6 +47,7 @@ #include #include #include +#include #include #include #include @@ -58,6 +59,9 @@ #define USB_DEVICE_MAX USB_MAXBUS * 128 static struct class *usb_device_class; +/* Mutual exclusion for removal, open, and release */ +DEFINE_MUTEX(usbfs_mutex); + struct async { struct list_head asynclist; struct dev_state *ps; @@ -68,6 +72,7 @@ struct async { void __user *userbuffer; void __user *userurb; struct urb *urb; + u32 secid; }; static int usbfs_snoop = 0; @@ -312,7 +317,7 @@ static void async_completed(struct urb *urb, struct pt_regs *regs) sinfo.si_code = SI_ASYNCIO; sinfo.si_addr = as->userurb; kill_proc_info_as_uid(as->signr, &sinfo, as->pid, as->uid, - as->euid); + as->euid, as->secid); } snoop(&urb->dev->dev, "urb complete\n"); snoop_urb(urb, as->userurb); @@ -539,21 +544,19 @@ static int usbdev_open(struct inode *inode, struct file *file) struct dev_state *ps; int ret; - /* - * no locking necessary here, as chrdev_open has the kernel lock - * (still acquire the kernel lock for safety) - */ + /* Protect against simultaneous removal or release */ + mutex_lock(&usbfs_mutex); + ret = -ENOMEM; if (!(ps = kmalloc(sizeof(struct dev_state), GFP_KERNEL))) - goto out_nolock; + goto out; - lock_kernel(); ret = -ENOENT; /* check if we are called from a real node or usbfs */ if (imajor(inode) == USB_DEVICE_MAJOR) dev = usbdev_lookup_minor(iminor(inode)); if (!dev) - dev = inode->u.generic_ip; + dev = inode->i_private; if (!dev) { kfree(ps); goto out; @@ -572,13 +575,13 @@ static int usbdev_open(struct inode *inode, struct file *file) ps->disc_euid = current->euid; ps->disccontext = NULL; ps->ifclaimed = 0; + security_task_getsecid(current, &ps->secid); wmb(); list_add_tail(&ps->list, &dev->filelist); file->private_data = ps; out: - unlock_kernel(); - out_nolock: - return ret; + mutex_unlock(&usbfs_mutex); + return ret; } static int usbdev_release(struct inode *inode, struct file *file) @@ -588,7 +591,12 @@ static int usbdev_release(struct inode *inode, struct file *file) unsigned int ifnum; usb_lock_device(dev); + + /* Protect against simultaneous open */ + mutex_lock(&usbfs_mutex); list_del_init(&ps->list); + mutex_unlock(&usbfs_mutex); + for (ifnum = 0; ps->ifclaimed && ifnum < 8*sizeof(ps->ifclaimed); ifnum++) { if (test_bit(ifnum, &ps->ifclaimed)) @@ -597,9 +605,8 @@ static int usbdev_release(struct inode *inode, struct file *file) destroy_all_async(ps); usb_unlock_device(dev); usb_put_dev(dev); - ps->dev = NULL; kfree(ps); - return 0; + return 0; } static int proc_control(struct dev_state *ps, void __user *arg) @@ -823,8 +830,7 @@ static int proc_connectinfo(struct dev_state *ps, void __user *arg) static int proc_resetdevice(struct dev_state *ps) { - return usb_reset_device(ps->dev); - + return usb_reset_composite_device(ps->dev, NULL); } static int proc_setintf(struct dev_state *ps, void __user *arg) @@ -923,8 +929,8 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb, if ((ep->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_CONTROL) return -EINVAL; - /* min 8 byte setup packet, max arbitrary */ - if (uurb->buffer_length < 8 || uurb->buffer_length > PAGE_SIZE) + /* min 8 byte setup packet, max 8 byte setup plus an arbitrary data stage */ + if (uurb->buffer_length < 8 || uurb->buffer_length > (8 + MAX_USBFS_BUFFER_SIZE)) return -EINVAL; if (!(dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL))) return -ENOMEM; @@ -982,7 +988,8 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb, return -EFAULT; } for (totlen = u = 0; u < uurb->number_of_packets; u++) { - if (isopkt[u].length > 1023) { + /* arbitrary limit, sufficient for USB 2.0 high-bandwidth iso */ + if (isopkt[u].length > 8192) { kfree(isopkt); return -EINVAL; } @@ -1053,6 +1060,7 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb, as->pid = current->pid; as->uid = current->uid; as->euid = current->euid; + security_task_getsecid(current, &as->secid); if (!(uurb->endpoint & USB_DIR_IN)) { if (copy_from_user(as->urb->transfer_buffer, uurb->buffer, as->urb->transfer_buffer_length)) { free_async(as); diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c index c196f3845..ec8906501 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c @@ -21,7 +21,6 @@ * */ -#include #include #include #include "hcd.h" diff --git a/drivers/usb/core/file.c b/drivers/usb/core/file.c index b263a54a1..8de4f8c99 100644 --- a/drivers/usb/core/file.c +++ b/drivers/usb/core/file.c @@ -15,7 +15,6 @@ * */ -#include #include #include #include @@ -61,33 +60,66 @@ static struct file_operations usb_fops = { .open = usb_open, }; -static struct class *usb_class; +static struct usb_class { + struct kref kref; + struct class *class; +} *usb_class; -int usb_major_init(void) +static int init_usb_class(void) { - int error; + int result = 0; - error = register_chrdev(USB_MAJOR, "usb", &usb_fops); - if (error) { - err("unable to get major %d for usb devices", USB_MAJOR); - goto out; + if (usb_class != NULL) { + kref_get(&usb_class->kref); + goto exit; + } + + usb_class = kmalloc(sizeof(*usb_class), GFP_KERNEL); + if (!usb_class) { + result = -ENOMEM; + goto exit; } - usb_class = class_create(THIS_MODULE, "usb"); - if (IS_ERR(usb_class)) { - error = PTR_ERR(usb_class); + kref_init(&usb_class->kref); + usb_class->class = class_create(THIS_MODULE, "usb"); + if (IS_ERR(usb_class->class)) { + result = IS_ERR(usb_class->class); err("class_create failed for usb devices"); - unregister_chrdev(USB_MAJOR, "usb"); - goto out; + kfree(usb_class); + usb_class = NULL; } -out: +exit: + return result; +} + +static void release_usb_class(struct kref *kref) +{ + /* Ok, we cheat as we know we only have one usb_class */ + class_destroy(usb_class->class); + kfree(usb_class); + usb_class = NULL; +} + +static void destroy_usb_class(void) +{ + if (usb_class) + kref_put(&usb_class->kref, release_usb_class); +} + +int usb_major_init(void) +{ + int error; + + error = register_chrdev(USB_MAJOR, "usb", &usb_fops); + if (error) + err("unable to get major %d for usb devices", USB_MAJOR); + return error; } void usb_major_cleanup(void) { - class_destroy(usb_class); unregister_chrdev(USB_MAJOR, "usb"); } @@ -146,6 +178,10 @@ int usb_register_dev(struct usb_interface *intf, } spin_unlock (&minor_lock); + if (retval) + goto exit; + + retval = init_usb_class(); if (retval) goto exit; @@ -158,7 +194,7 @@ int usb_register_dev(struct usb_interface *intf, ++temp; else temp = name; - intf->class_dev = class_device_create(usb_class, NULL, + intf->class_dev = class_device_create(usb_class->class, NULL, MKDEV(USB_MAJOR, minor), &intf->dev, "%s", temp); if (IS_ERR(intf->class_dev)) { @@ -206,9 +242,10 @@ void usb_deregister_dev(struct usb_interface *intf, spin_unlock (&minor_lock); snprintf(name, BUS_ID_SIZE, class_driver->name, intf->minor - minor_base); - class_device_destroy(usb_class, MKDEV(USB_MAJOR, intf->minor)); + class_device_destroy(usb_class->class, MKDEV(USB_MAJOR, intf->minor)); intf->class_dev = NULL; intf->minor = -1; + destroy_usb_class(); } EXPORT_SYMBOL(usb_deregister_dev); diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c index 66b78404a..5078fb337 100644 --- a/drivers/usb/core/hcd-pci.c +++ b/drivers/usb/core/hcd-pci.c @@ -16,7 +16,6 @@ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include #include #include @@ -126,7 +125,7 @@ int usb_hcd_pci_probe (struct pci_dev *dev, const struct pci_device_id *id) pci_set_master (dev); - retval = usb_add_hcd (hcd, dev->irq, SA_SHIRQ); + retval = usb_add_hcd (hcd, dev->irq, IRQF_SHARED); if (retval != 0) goto err4; return retval; diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index e2e00ba4e..fb4d058bb 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c @@ -22,7 +22,6 @@ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include #include #include @@ -1826,24 +1825,16 @@ int usb_add_hcd(struct usb_hcd *hcd, /* enable irqs just before we start the controller */ if (hcd->driver->irq) { - char buf[8], *bufp = buf; - -#ifdef __sparc__ - bufp = __irq_itoa(irqnum); -#else - sprintf(buf, "%d", irqnum); -#endif - snprintf(hcd->irq_descr, sizeof(hcd->irq_descr), "%s:usb%d", hcd->driver->description, hcd->self.busnum); if ((retval = request_irq(irqnum, &usb_hcd_irq, irqflags, hcd->irq_descr, hcd)) != 0) { dev_err(hcd->self.controller, - "request interrupt %s failed\n", bufp); + "request interrupt %d failed\n", irqnum); goto err_request_irq; } hcd->irq = irqnum; - dev_info(hcd->self.controller, "irq %s, %s 0x%08llx\n", bufp, + dev_info(hcd->self.controller, "irq %d, %s 0x%08llx\n", irqnum, (hcd->driver->flags & HCD_MEMORY) ? "io mem" : "io base", (unsigned long long)hcd->rsrc_start); diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 90b8d43c6..26c8cb5f3 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -8,7 +8,6 @@ * */ -#include #include #include #include @@ -432,15 +431,22 @@ static void hub_power_on(struct usb_hub *hub) { int port1; unsigned pgood_delay = hub->descriptor->bPwrOn2PwrGood * 2; - u16 wHubCharacteristics = le16_to_cpu(hub->descriptor->wHubCharacteristics); - - /* if hub supports power switching, enable power on each port */ - if ((wHubCharacteristics & HUB_CHAR_LPSM) < 2) { + u16 wHubCharacteristics = + le16_to_cpu(hub->descriptor->wHubCharacteristics); + + /* Enable power on each port. Some hubs have reserved values + * of LPSM (> 2) in their descriptors, even though they are + * USB 2.0 hubs. Some hubs do not implement port-power switching + * but only emulate it. In all cases, the ports won't work + * unless we send these messages to the hub. + */ + if ((wHubCharacteristics & HUB_CHAR_LPSM) < 2) dev_dbg(hub->intfdev, "enabling power on all ports\n"); - for (port1 = 1; port1 <= hub->descriptor->bNbrPorts; port1++) - set_port_feature(hub->hdev, port1, - USB_PORT_FEAT_POWER); - } + else + dev_dbg(hub->intfdev, "trying to enable port power on " + "non-switchable hub\n"); + for (port1 = 1; port1 <= hub->descriptor->bNbrPorts; port1++) + set_port_feature(hub->hdev, port1, USB_PORT_FEAT_POWER); /* Wait at least 100 msec for power to become stable */ msleep(max(pgood_delay, (unsigned) 100)); @@ -518,15 +524,16 @@ static int hub_port_disable(struct usb_hub *hub, int port1, int set_state) /* caller has locked the hub device */ -static void hub_pre_reset(struct usb_hub *hub, int disable_ports) +static void hub_pre_reset(struct usb_interface *intf) { + struct usb_hub *hub = usb_get_intfdata(intf); 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) + if (hub->error == 0) hub_port_disable(hub, port1, 0); } } @@ -534,8 +541,10 @@ static void hub_pre_reset(struct usb_hub *hub, int disable_ports) } /* caller has locked the hub device */ -static void hub_post_reset(struct usb_hub *hub) +static void hub_post_reset(struct usb_interface *intf) { + struct usb_hub *hub = usb_get_intfdata(intf); + hub_activate(hub); hub_power_on(hub); } @@ -795,15 +804,16 @@ static void hub_disconnect(struct usb_interface *intf) struct usb_hub *hub = usb_get_intfdata (intf); struct usb_device *hdev; + /* Disconnect all children and quiesce the hub */ + hub->error = 0; + hub_pre_reset(intf); + usb_set_intfdata (intf, NULL); hdev = hub->hdev; if (hdev->speed == USB_SPEED_HIGH) highspeed_hubs--; - /* Disconnect all children and quiesce the hub */ - hub_pre_reset(hub, 1); - usb_free_urb(hub->urb); hub->urb = NULL; @@ -1169,6 +1179,7 @@ static int choose_configuration(struct usb_device *udev) { int i; int num_configs; + int insufficient_power = 0; struct usb_host_config *c, *best; best = NULL; @@ -1221,8 +1232,10 @@ static int choose_configuration(struct usb_device *udev) */ /* Rule out configs that draw too much bus current */ - if (c->desc.bMaxPower * 2 > udev->bus_mA) + if (c->desc.bMaxPower * 2 > udev->bus_mA) { + insufficient_power++; continue; + } /* If the first config's first interface is COMM/2/0xff * (MSFT RNDIS), rule it out unless Linux has host-side @@ -1231,7 +1244,7 @@ static int choose_configuration(struct usb_device *udev) && desc->bInterfaceClass == USB_CLASS_COMM && desc->bInterfaceSubClass == 2 && desc->bInterfaceProtocol == 0xff) { -#ifndef CONFIG_USB_NET_RNDIS +#ifndef CONFIG_USB_NET_RNDIS_HOST continue; #else best = c; @@ -1256,6 +1269,11 @@ static int choose_configuration(struct usb_device *udev) best = c; } + if (insufficient_power > 0) + dev_info(&udev->dev, "rejected %d configuration%s " + "due to insufficient available bus power\n", + insufficient_power, plural(insufficient_power)); + if (best) { i = best->desc.bConfigurationValue; dev_info(&udev->dev, @@ -1772,7 +1790,10 @@ static int finish_device_resume(struct usb_device *udev) * and device drivers will know about any resume quirks. */ status = usb_get_status(udev, USB_RECIP_DEVICE, 0, &devstatus); - if (status < 2) + if (status >= 0) + status = (status == 2 ? 0 : -ENODEV); + + if (status) dev_dbg(&udev->dev, "gone after usb resume? status %d\n", status); @@ -1861,7 +1882,12 @@ hub_port_resume(struct usb_hub *hub, int port1, struct usb_device *udev) dev_dbg(hub->intfdev, "port %d status %04x.%04x after resume, %d\n", port1, portchange, devstatus, status); + if (status >= 0) + status = -ENODEV; } else { + if (portchange & USB_PORT_STAT_C_SUSPEND) + clear_port_feature(hub->hdev, port1, + USB_PORT_FEAT_C_SUSPEND); /* TRSMRCY = 10 msec */ msleep(10); if (udev) @@ -2732,7 +2758,8 @@ static void hub_events(void) /* If the hub has died, clean up after it */ if (hdev->state == USB_STATE_NOTATTACHED) { - hub_pre_reset(hub, 0); + hub->error = -ENODEV; + hub_pre_reset(intf); goto loop; } @@ -2744,7 +2771,7 @@ static void hub_events(void) dev_dbg (hub_dev, "resetting for error %d\n", hub->error); - ret = usb_reset_device(hdev); + ret = usb_reset_composite_device(hdev, intf); if (ret) { dev_dbg (hub_dev, "error resetting hub: %d\n", ret); @@ -2913,6 +2940,8 @@ static struct usb_driver hub_driver = { .disconnect = hub_disconnect, .suspend = hub_suspend, .resume = hub_resume, + .pre_reset = hub_pre_reset, + .post_reset = hub_post_reset, .ioctl = hub_ioctl, .id_table = hub_id_table, }; @@ -2992,9 +3021,9 @@ static int config_descriptors_changed(struct usb_device *udev) * usb_reset_device - perform a USB port reset to reinitialize a device * @udev: device to reset (not in SUSPENDED or NOTATTACHED state) * - * WARNING - don't reset any device unless drivers for all of its - * interfaces are expecting that reset! Maybe some driver->reset() - * method should eventually help ensure sufficient cooperation. + * WARNING - don't use this routine to reset a composite device + * (one with multiple interfaces owned by separate drivers)! + * Use usb_reset_composite_device() instead. * * Do a port reset, reassign the device's address, and establish its * former operating configuration. If the reset fails, or the device's @@ -3018,7 +3047,6 @@ int usb_reset_device(struct usb_device *udev) struct usb_device *parent_hdev = udev->parent; struct usb_hub *parent_hub; struct usb_device_descriptor descriptor = udev->descriptor; - struct usb_hub *hub = NULL; int i, ret = 0; int port1 = udev->portnum; @@ -3036,14 +3064,6 @@ int usb_reset_device(struct usb_device *udev) } parent_hub = hdev_to_hub(parent_hdev); - /* If we're resetting an active hub, take some special actions */ - if (udev->actconfig && udev->actconfig->desc.bNumInterfaces > 0 && - udev->actconfig->interface[0]->dev.driver == - &hub_driver.driver && - (hub = hdev_to_hub(udev)) != NULL) { - hub_pre_reset(hub, 0); - } - set_bit(port1, parent_hub->busy_bits); for (i = 0; i < SET_CONFIG_TRIES; ++i) { @@ -3102,11 +3122,87 @@ int usb_reset_device(struct usb_device *udev) } done: - if (hub) - hub_post_reset(hub); return 0; re_enumerate: hub_port_logical_disconnect(parent_hub, port1); return -ENODEV; } + +/** + * usb_reset_composite_device - warn interface drivers and perform a USB port reset + * @udev: device to reset (not in SUSPENDED or NOTATTACHED state) + * @iface: interface bound to the driver making the request (optional) + * + * Warns all drivers bound to registered interfaces (using their pre_reset + * method), performs the port reset, and then lets the drivers know that + * the reset is over (using their post_reset method). + * + * Return value is the same as for usb_reset_device(). + * + * The caller must own the device lock. For example, it's safe to use + * this from a driver probe() routine after downloading new firmware. + * For calls that might not occur during probe(), drivers should lock + * the device using usb_lock_device_for_reset(). + * + * The interface locks are acquired during the pre_reset stage and released + * during the post_reset stage. However if iface is not NULL and is + * currently being probed, we assume that the caller already owns its + * lock. + */ +int usb_reset_composite_device(struct usb_device *udev, + struct usb_interface *iface) +{ + int ret; + struct usb_host_config *config = udev->actconfig; + + if (udev->state == USB_STATE_NOTATTACHED || + udev->state == USB_STATE_SUSPENDED) { + dev_dbg(&udev->dev, "device reset not allowed in state %d\n", + udev->state); + return -EINVAL; + } + + if (iface && iface->condition != USB_INTERFACE_BINDING) + iface = NULL; + + if (config) { + int i; + struct usb_interface *cintf; + struct usb_driver *drv; + + for (i = 0; i < config->desc.bNumInterfaces; ++i) { + cintf = config->interface[i]; + if (cintf != iface) + down(&cintf->dev.sem); + if (device_is_registered(&cintf->dev) && + cintf->dev.driver) { + drv = to_usb_driver(cintf->dev.driver); + if (drv->pre_reset) + (drv->pre_reset)(cintf); + } + } + } + + ret = usb_reset_device(udev); + + if (config) { + int i; + struct usb_interface *cintf; + struct usb_driver *drv; + + for (i = config->desc.bNumInterfaces - 1; i >= 0; --i) { + cintf = config->interface[i]; + if (device_is_registered(&cintf->dev) && + cintf->dev.driver) { + drv = to_usb_driver(cintf->dev.driver); + if (drv->post_reset) + (drv->post_reset)(cintf); + } + if (cintf != iface) + up(&cintf->dev.sem); + } + } + + return ret; +} diff --git a/drivers/usb/core/inode.c b/drivers/usb/core/inode.c index 3cf945cc5..58b4b1012 100644 --- a/drivers/usb/core/inode.c +++ b/drivers/usb/core/inode.c @@ -27,7 +27,6 @@ /*****************************************************************************/ -#include #include #include #include @@ -201,7 +200,7 @@ static void update_sb(struct super_block *sb) if (!root) return; - mutex_lock(&root->d_inode->i_mutex); + mutex_lock_nested(&root->d_inode->i_mutex, I_MUTEX_PARENT); list_for_each_entry(bus, &root->d_subdirs, d_u.d_child) { if (bus->d_inode) { @@ -250,7 +249,6 @@ static struct inode *usbfs_get_inode (struct super_block *sb, int mode, dev_t de inode->i_mode = mode; inode->i_uid = current->fsuid; inode->i_gid = current->fsgid; - inode->i_blksize = PAGE_CACHE_SIZE; inode->i_blocks = 0; inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; switch (mode & S_IFMT) { @@ -403,8 +401,8 @@ static loff_t default_file_lseek (struct file *file, loff_t offset, int orig) static int default_open (struct inode *inode, struct file *file) { - if (inode->u.generic_ip) - file->private_data = inode->u.generic_ip; + if (inode->i_private) + file->private_data = inode->i_private; return 0; } @@ -510,7 +508,7 @@ static struct dentry *fs_create_file (const char *name, mode_t mode, } else { if (dentry->d_inode) { if (data) - dentry->d_inode->u.generic_ip = data; + dentry->d_inode->i_private = data; if (fops) dentry->d_inode->i_fop = fops; dentry->d_inode->i_uid = uid; @@ -528,7 +526,7 @@ static void fs_remove_file (struct dentry *dentry) if (!parent || !parent->d_inode) return; - mutex_lock(&parent->d_inode->i_mutex); + mutex_lock_nested(&parent->d_inode->i_mutex, I_MUTEX_PARENT); if (usbfs_positive(dentry)) { if (dentry->d_inode) { if (S_ISDIR(dentry->d_inode->i_mode)) @@ -543,10 +541,10 @@ static void fs_remove_file (struct dentry *dentry) /* --------------------------------------------------------------------- */ -static struct super_block *usb_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int usb_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_single(fs_type, flags, data, usbfs_fill_super); + return get_sb_single(fs_type, flags, data, usbfs_fill_super, mnt); } static struct file_system_type usb_fs_type = { @@ -569,7 +567,7 @@ static int create_special_files (void) ignore_mount = 1; /* create the devices special file */ - retval = simple_pin_fs("usbfs", &usbfs_mount, &usbfs_mount_count); + retval = simple_pin_fs(&usb_fs_type, &usbfs_mount, &usbfs_mount_count); if (retval) { err ("Unable to get usbfs mount"); goto exit; @@ -696,11 +694,11 @@ static void usbfs_remove_device(struct usb_device *dev) wake_up_all(&ds->wait); list_del_init(&ds->list); if (ds->discsignr) { - sinfo.si_signo = SIGPIPE; + sinfo.si_signo = ds->discsignr; sinfo.si_errno = EPIPE; sinfo.si_code = SI_ASYNCIO; sinfo.si_addr = ds->disccontext; - kill_proc_info_as_uid(ds->discsignr, &sinfo, ds->disc_pid, ds->disc_uid, ds->disc_euid); + kill_proc_info_as_uid(ds->discsignr, &sinfo, ds->disc_pid, ds->disc_uid, ds->disc_euid, ds->secid); } } } diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index 08fb20f06..4cc8d3e67 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c @@ -2,7 +2,6 @@ * message.c - synchronous message handling */ -#include #include /* for scatterlist macros */ #include #include @@ -157,6 +156,37 @@ int usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request, __u } +/** + * usb_interrupt_msg - Builds an interrupt urb, sends it off and waits for completion + * @usb_dev: pointer to the usb device to send the message to + * @pipe: endpoint "pipe" to send the message to + * @data: pointer to the data to send + * @len: length in bytes of the data to send + * @actual_length: pointer to a location to put the actual length transferred in bytes + * @timeout: time in msecs to wait for the message to complete before + * timing out (if 0 the wait is forever) + * Context: !in_interrupt () + * + * This function sends a simple interrupt message to a specified endpoint and + * waits for the message to complete, or timeout. + * + * If successful, it returns 0, otherwise a negative error number. The number + * of actual bytes transferred will be stored in the actual_length paramater. + * + * Don't use this function from within an interrupt context, like a bottom half + * handler. If you need an asynchronous message, or need to send a message + * from within interrupt context, use usb_submit_urb() If a thread in your + * driver uses this call, make sure your disconnect() method can wait for it to + * complete. Since you don't have a handle on the URB used, you can't cancel + * the request. + */ +int usb_interrupt_msg(struct usb_device *usb_dev, unsigned int pipe, + void *data, int len, int *actual_length, int timeout) +{ + return usb_bulk_msg(usb_dev, pipe, data, len, actual_length, timeout); +} +EXPORT_SYMBOL_GPL(usb_interrupt_msg); + /** * usb_bulk_msg - Builds a bulk urb, sends it off and waits for completion * @usb_dev: pointer to the usb device to send the message to @@ -1380,15 +1410,7 @@ free_interfaces: return ret; } } - } - - /* if it's already configured, clear out old state first. - * getting rid of old interfaces means unbinding their drivers. - */ - if (dev->state != USB_STATE_ADDRESS) - usb_disable_device (dev, 1); // Skip ep0 - if (cp) { i = dev->bus_mA - cp->desc.bMaxPower * 2; if (i < 0) dev_warn(&dev->dev, "new config #%d exceeds power " @@ -1396,84 +1418,91 @@ free_interfaces: configuration, -i); } + /* if it's already configured, clear out old state first. + * getting rid of old interfaces means unbinding their drivers. + */ + if (dev->state != USB_STATE_ADDRESS) + usb_disable_device (dev, 1); // Skip ep0 + if ((ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), USB_REQ_SET_CONFIGURATION, 0, configuration, 0, - NULL, 0, USB_CTRL_SET_TIMEOUT)) < 0) - goto free_interfaces; + NULL, 0, USB_CTRL_SET_TIMEOUT)) < 0) { + + /* All the old state is gone, so what else can we do? + * The device is probably useless now anyway. + */ + cp = NULL; + } dev->actconfig = cp; - if (!cp) + if (!cp) { usb_set_device_state(dev, USB_STATE_ADDRESS); - else { - usb_set_device_state(dev, USB_STATE_CONFIGURED); + goto free_interfaces; + } + usb_set_device_state(dev, USB_STATE_CONFIGURED); - /* Initialize the new interface structures and the - * hc/hcd/usbcore interface/endpoint state. - */ - for (i = 0; i < nintf; ++i) { - struct usb_interface_cache *intfc; - struct usb_interface *intf; - struct usb_host_interface *alt; - - cp->interface[i] = intf = new_interfaces[i]; - intfc = cp->intf_cache[i]; - intf->altsetting = intfc->altsetting; - intf->num_altsetting = intfc->num_altsetting; - kref_get(&intfc->ref); - - alt = usb_altnum_to_altsetting(intf, 0); - - /* No altsetting 0? We'll assume the first altsetting. - * We could use a GetInterface call, but if a device is - * so non-compliant that it doesn't have altsetting 0 - * then I wouldn't trust its reply anyway. - */ - if (!alt) - alt = &intf->altsetting[0]; - - intf->cur_altsetting = alt; - usb_enable_interface(dev, intf); - intf->dev.parent = &dev->dev; - intf->dev.driver = NULL; - intf->dev.bus = &usb_bus_type; - intf->dev.dma_mask = dev->dev.dma_mask; - intf->dev.release = release_interface; - device_initialize (&intf->dev); - mark_quiesced(intf); - sprintf (&intf->dev.bus_id[0], "%d-%s:%d.%d", - dev->bus->busnum, dev->devpath, - configuration, - alt->desc.bInterfaceNumber); - } - kfree(new_interfaces); + /* Initialize the new interface structures and the + * hc/hcd/usbcore interface/endpoint state. + */ + for (i = 0; i < nintf; ++i) { + struct usb_interface_cache *intfc; + struct usb_interface *intf; + struct usb_host_interface *alt; + + cp->interface[i] = intf = new_interfaces[i]; + intfc = cp->intf_cache[i]; + intf->altsetting = intfc->altsetting; + intf->num_altsetting = intfc->num_altsetting; + kref_get(&intfc->ref); - if (cp->string == NULL) - cp->string = usb_cache_string(dev, - cp->desc.iConfiguration); + alt = usb_altnum_to_altsetting(intf, 0); - /* Now that all the interfaces are set up, register them - * to trigger binding of drivers to interfaces. probe() - * routines may install different altsettings and may - * claim() any interfaces not yet bound. Many class drivers - * need that: CDC, audio, video, etc. + /* No altsetting 0? We'll assume the first altsetting. + * We could use a GetInterface call, but if a device is + * so non-compliant that it doesn't have altsetting 0 + * then I wouldn't trust its reply anyway. */ - for (i = 0; i < nintf; ++i) { - struct usb_interface *intf = cp->interface[i]; - - dev_dbg (&dev->dev, - "adding %s (config #%d, interface %d)\n", - intf->dev.bus_id, configuration, - intf->cur_altsetting->desc.bInterfaceNumber); - ret = device_add (&intf->dev); - if (ret != 0) { - dev_err(&dev->dev, - "device_add(%s) --> %d\n", - intf->dev.bus_id, - ret); - continue; - } - usb_create_sysfs_intf_files (intf); + if (!alt) + alt = &intf->altsetting[0]; + + intf->cur_altsetting = alt; + usb_enable_interface(dev, intf); + intf->dev.parent = &dev->dev; + intf->dev.driver = NULL; + intf->dev.bus = &usb_bus_type; + intf->dev.dma_mask = dev->dev.dma_mask; + intf->dev.release = release_interface; + device_initialize (&intf->dev); + mark_quiesced(intf); + sprintf (&intf->dev.bus_id[0], "%d-%s:%d.%d", + dev->bus->busnum, dev->devpath, + configuration, alt->desc.bInterfaceNumber); + } + kfree(new_interfaces); + + if (cp->string == NULL) + cp->string = usb_cache_string(dev, cp->desc.iConfiguration); + + /* Now that all the interfaces are set up, register them + * to trigger binding of drivers to interfaces. probe() + * routines may install different altsettings and may + * claim() any interfaces not yet bound. Many class drivers + * need that: CDC, audio, video, etc. + */ + for (i = 0; i < nintf; ++i) { + struct usb_interface *intf = cp->interface[i]; + + dev_dbg (&dev->dev, + "adding %s (config #%d, interface %d)\n", + intf->dev.bus_id, configuration, + intf->cur_altsetting->desc.bInterfaceNumber); + ret = device_add (&intf->dev); + if (ret != 0) { + dev_err(&dev->dev, "device_add(%s) --> %d\n", + intf->dev.bus_id, ret); + continue; } + usb_create_sysfs_intf_files (intf); } return 0; diff --git a/drivers/usb/core/notify.c b/drivers/usb/core/notify.c index fe0ed54fa..6b36897ca 100644 --- a/drivers/usb/core/notify.c +++ b/drivers/usb/core/notify.c @@ -9,7 +9,6 @@ */ -#include #include #include #include @@ -51,8 +50,11 @@ void usb_notify_add_device(struct usb_device *udev) void usb_notify_remove_device(struct usb_device *udev) { + /* Protect against simultaneous usbfs open */ + mutex_lock(&usbfs_mutex); blocking_notifier_call_chain(&usb_notifier_list, USB_DEVICE_REMOVE, udev); + mutex_unlock(&usbfs_mutex); } void usb_notify_add_bus(struct usb_bus *ubus) diff --git a/drivers/usb/core/sysfs.c b/drivers/usb/core/sysfs.c index 4d0c9e65c..dec973aff 100644 --- a/drivers/usb/core/sysfs.c +++ b/drivers/usb/core/sysfs.c @@ -10,21 +10,14 @@ */ -#include #include - -#ifdef CONFIG_USB_DEBUG - #define DEBUG -#else - #undef DEBUG -#endif #include - #include "usb.h" /* Active configuration fields */ #define usb_actconfig_show(field, multiplier, format_string) \ -static ssize_t show_##field (struct device *dev, char *buf) \ +static ssize_t show_##field (struct device *dev, \ + struct device_attribute *attr, char *buf) \ { \ struct usb_device *udev; \ struct usb_host_config *actconfig; \ @@ -46,22 +39,17 @@ usb_actconfig_attr (bNumInterfaces, 1, "%2d\n") usb_actconfig_attr (bmAttributes, 1, "%2x\n") usb_actconfig_attr (bMaxPower, 2, "%3dmA\n") -static ssize_t show_configuration_string(struct device *dev, char *buf) +static ssize_t show_configuration_string(struct device *dev, + struct device_attribute *attr, char *buf) { struct usb_device *udev; struct usb_host_config *actconfig; - int len; udev = to_usb_device (dev); actconfig = udev->actconfig; if ((!actconfig) || (!actconfig->string)) return 0; - len = sprintf(buf, actconfig->string, PAGE_SIZE); - if (len < 0) - return 0; - buf[len] = '\n'; - buf[len+1] = 0; - return len+1; + return sprintf(buf, "%s\n", actconfig->string); } static DEVICE_ATTR(configuration, S_IRUGO, show_configuration_string, NULL); @@ -69,7 +57,8 @@ static DEVICE_ATTR(configuration, S_IRUGO, show_configuration_string, NULL); usb_actconfig_show(bConfigurationValue, 1, "%u\n"); static ssize_t -set_bConfigurationValue (struct device *dev, const char *buf, size_t count) +set_bConfigurationValue (struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) { struct usb_device *udev = udev = to_usb_device (dev); int config, value; @@ -87,18 +76,13 @@ static DEVICE_ATTR(bConfigurationValue, S_IRUGO | S_IWUSR, /* String fields */ #define usb_string_attr(name) \ -static ssize_t show_##name(struct device *dev, char *buf) \ +static ssize_t show_##name(struct device *dev, \ + struct device_attribute *attr, char *buf) \ { \ struct usb_device *udev; \ - int len; \ \ udev = to_usb_device (dev); \ - len = snprintf(buf, 256, "%s", udev->name); \ - if (len < 0) \ - return 0; \ - buf[len] = '\n'; \ - buf[len+1] = 0; \ - return len+1; \ + return sprintf(buf, "%s\n", udev->name); \ } \ static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL); @@ -107,7 +91,7 @@ usb_string_attr(manufacturer); usb_string_attr(serial); static ssize_t -show_speed (struct device *dev, char *buf) +show_speed (struct device *dev, struct device_attribute *attr, char *buf) { struct usb_device *udev; char *speed; @@ -133,7 +117,7 @@ show_speed (struct device *dev, char *buf) static DEVICE_ATTR(speed, S_IRUGO, show_speed, NULL); static ssize_t -show_devnum (struct device *dev, char *buf) +show_devnum (struct device *dev, struct device_attribute *attr, char *buf) { struct usb_device *udev; @@ -143,7 +127,7 @@ show_devnum (struct device *dev, char *buf) static DEVICE_ATTR(devnum, S_IRUGO, show_devnum, NULL); static ssize_t -show_version (struct device *dev, char *buf) +show_version (struct device *dev, struct device_attribute *attr, char *buf) { struct usb_device *udev; u16 bcdUSB; @@ -155,7 +139,7 @@ show_version (struct device *dev, char *buf) static DEVICE_ATTR(version, S_IRUGO, show_version, NULL); static ssize_t -show_maxchild (struct device *dev, char *buf) +show_maxchild (struct device *dev, struct device_attribute *attr, char *buf) { struct usb_device *udev; @@ -167,7 +151,8 @@ static DEVICE_ATTR(maxchild, S_IRUGO, show_maxchild, NULL); /* Descriptor fields */ #define usb_descriptor_attr_le16(field, format_string) \ static ssize_t \ -show_##field (struct device *dev, char *buf) \ +show_##field (struct device *dev, struct device_attribute *attr, \ + char *buf) \ { \ struct usb_device *udev; \ \ @@ -183,7 +168,8 @@ usb_descriptor_attr_le16(bcdDevice, "%04x\n") #define usb_descriptor_attr(field, format_string) \ static ssize_t \ -show_##field (struct device *dev, char *buf) \ +show_##field (struct device *dev, struct device_attribute *attr, \ + char *buf) \ { \ struct usb_device *udev; \ \ @@ -196,6 +182,7 @@ usb_descriptor_attr (bDeviceClass, "%02x\n") usb_descriptor_attr (bDeviceSubClass, "%02x\n") usb_descriptor_attr (bDeviceProtocol, "%02x\n") usb_descriptor_attr (bNumConfigurations, "%d\n") +usb_descriptor_attr (bMaxPacketSize0, "%d\n") static struct attribute *dev_attrs[] = { /* current configuration's attributes */ @@ -211,6 +198,7 @@ static struct attribute *dev_attrs[] = { &dev_attr_bDeviceSubClass.attr, &dev_attr_bDeviceProtocol.attr, &dev_attr_bNumConfigurations.attr, + &dev_attr_bMaxPacketSize0.attr, &dev_attr_speed.attr, &dev_attr_devnum.attr, &dev_attr_version.attr, @@ -234,19 +222,21 @@ void usb_create_sysfs_dev_files (struct usb_device *udev) if (udev->serial) device_create_file (dev, &dev_attr_serial); device_create_file (dev, &dev_attr_configuration); + usb_create_ep_files(dev, &udev->ep0, udev); } void usb_remove_sysfs_dev_files (struct usb_device *udev) { struct device *dev = &udev->dev; + usb_remove_ep_files(&udev->ep0); sysfs_remove_group(&dev->kobj, &dev_attr_grp); - if (udev->descriptor.iManufacturer) + if (udev->manufacturer) device_remove_file(dev, &dev_attr_manufacturer); - if (udev->descriptor.iProduct) + if (udev->product) device_remove_file(dev, &dev_attr_product); - if (udev->descriptor.iSerialNumber) + if (udev->serial) device_remove_file(dev, &dev_attr_serial); device_remove_file (dev, &dev_attr_configuration); } @@ -254,11 +244,13 @@ void usb_remove_sysfs_dev_files (struct usb_device *udev) /* Interface fields */ #define usb_intf_attr(field, format_string) \ static ssize_t \ -show_##field (struct device *dev, char *buf) \ +show_##field (struct device *dev, struct device_attribute *attr, \ + char *buf) \ { \ struct usb_interface *intf = to_usb_interface (dev); \ \ - return sprintf (buf, format_string, intf->cur_altsetting->desc.field); \ + return sprintf (buf, format_string, \ + intf->cur_altsetting->desc.field); \ } \ static DEVICE_ATTR(field, S_IRUGO, show_##field, NULL); @@ -269,7 +261,8 @@ usb_intf_attr (bInterfaceClass, "%02x\n") usb_intf_attr (bInterfaceSubClass, "%02x\n") usb_intf_attr (bInterfaceProtocol, "%02x\n") -static ssize_t show_interface_string(struct device *dev, char *buf) +static ssize_t show_interface_string(struct device *dev, + struct device_attribute *attr, char *buf) { struct usb_interface *intf; struct usb_device *udev; @@ -286,34 +279,28 @@ static ssize_t show_interface_string(struct device *dev, char *buf) } static DEVICE_ATTR(interface, S_IRUGO, show_interface_string, NULL); -static ssize_t show_modalias(struct device *dev, char *buf) +static ssize_t show_modalias(struct device *dev, + struct device_attribute *attr, char *buf) { struct usb_interface *intf; struct usb_device *udev; - int len; + struct usb_host_interface *alt; intf = to_usb_interface(dev); udev = interface_to_usbdev(intf); - - len = sprintf(buf, "usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic", - le16_to_cpu(udev->descriptor.idVendor), - le16_to_cpu(udev->descriptor.idProduct), - le16_to_cpu(udev->descriptor.bcdDevice), - udev->descriptor.bDeviceClass, - udev->descriptor.bDeviceSubClass, - udev->descriptor.bDeviceProtocol); - buf += len; - - if (udev->descriptor.bDeviceClass == 0) { - struct usb_host_interface *alt = intf->cur_altsetting; - - return len + sprintf(buf, "%02Xisc%02Xip%02X\n", - alt->desc.bInterfaceClass, - alt->desc.bInterfaceSubClass, - alt->desc.bInterfaceProtocol); - } else { - return len + sprintf(buf, "*isc*ip*\n"); - } + alt = intf->cur_altsetting; + + return sprintf(buf, "usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02X" + "ic%02Xisc%02Xip%02X\n", + le16_to_cpu(udev->descriptor.idVendor), + le16_to_cpu(udev->descriptor.idProduct), + le16_to_cpu(udev->descriptor.bcdDevice), + udev->descriptor.bDeviceClass, + udev->descriptor.bDeviceSubClass, + udev->descriptor.bDeviceProtocol, + alt->desc.bInterfaceClass, + alt->desc.bInterfaceSubClass, + alt->desc.bInterfaceProtocol); } static DEVICE_ATTR(modalias, S_IRUGO, show_modalias, NULL); @@ -331,20 +318,47 @@ static struct attribute_group intf_attr_grp = { .attrs = intf_attrs, }; +static inline void usb_create_intf_ep_files(struct usb_interface *intf, + struct usb_device *udev) +{ + struct usb_host_interface *iface_desc; + int i; + + iface_desc = intf->cur_altsetting; + for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) + usb_create_ep_files(&intf->dev, &iface_desc->endpoint[i], + udev); +} + +static inline void usb_remove_intf_ep_files(struct usb_interface *intf) +{ + struct usb_host_interface *iface_desc; + int i; + + iface_desc = intf->cur_altsetting; + for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) + usb_remove_ep_files(&iface_desc->endpoint[i]); +} + void usb_create_sysfs_intf_files (struct usb_interface *intf) { + struct usb_device *udev = interface_to_usbdev(intf); + struct usb_host_interface *alt = intf->cur_altsetting; + sysfs_create_group(&intf->dev.kobj, &intf_attr_grp); - if (intf->cur_altsetting->string) + if (alt->string == NULL) + alt->string = usb_cache_string(udev, alt->desc.iInterface); + if (alt->string) device_create_file(&intf->dev, &dev_attr_interface); - + usb_create_intf_ep_files(intf, udev); } void usb_remove_sysfs_intf_files (struct usb_interface *intf) { + usb_remove_intf_ep_files(intf); sysfs_remove_group(&intf->dev.kobj, &intf_attr_grp); if (intf->cur_altsetting->string) device_remove_file(&intf->dev, &dev_attr_interface); - } diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c index dad4d8fd8..986498837 100644 --- a/drivers/usb/core/urb.c +++ b/drivers/usb/core/urb.c @@ -1,4 +1,3 @@ -#include #include #include #include diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index b7fdc1cd1..184c24660 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c @@ -21,7 +21,6 @@ * are evil. */ -#include #include #include #include @@ -991,6 +990,8 @@ void usb_buffer_unmap_sg (struct usb_device *dev, unsigned pipe, static int verify_suspended(struct device *dev, void *unused) { + if (dev->driver == NULL) + return 0; return (dev->power.power_state.event == PM_EVENT_ON) ? -EBUSY : 0; } @@ -1207,6 +1208,7 @@ EXPORT_SYMBOL(usb_ifnum_to_if); EXPORT_SYMBOL(usb_altnum_to_altsetting); EXPORT_SYMBOL(usb_reset_device); +EXPORT_SYMBOL(usb_reset_composite_device); EXPORT_SYMBOL(__usb_get_extra_descriptor); diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h index 4647e1ebc..1217fbbe5 100644 --- a/drivers/usb/core/usb.h +++ b/drivers/usb/core/usb.h @@ -4,6 +4,9 @@ extern void usb_create_sysfs_dev_files (struct usb_device *dev); extern void usb_remove_sysfs_dev_files (struct usb_device *dev); extern void usb_create_sysfs_intf_files (struct usb_interface *intf); extern void usb_remove_sysfs_intf_files (struct usb_interface *intf); +extern void usb_create_ep_files(struct device *parent, struct usb_host_endpoint *endpoint, + struct usb_device *udev); +extern void usb_remove_ep_files(struct usb_host_endpoint *endpoint); extern void usb_disable_endpoint (struct usb_device *dev, unsigned int epaddr); extern void usb_disable_interface (struct usb_device *dev, @@ -56,6 +59,7 @@ static inline int is_active(struct usb_interface *f) extern const char *usbcore_name; /* usbfs stuff */ +extern struct mutex usbfs_mutex; extern struct usb_driver usbfs_driver; extern struct file_operations usbfs_devices_fops; extern struct file_operations usbfs_device_file_operations; @@ -77,6 +81,7 @@ struct dev_state { uid_t disc_uid, disc_euid; void __user *disccontext; unsigned long ifclaimed; + u32 secid; }; /* internal notify stuff */ diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index 363b2ad74..1a32d9677 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig @@ -207,7 +207,7 @@ config USB_AT91 config USB_GADGET_DUMMY_HCD boolean "Dummy HCD (DEVELOPMENT)" - depends on USB && EXPERIMENTAL + depends on (USB=y || (USB=m && USB_GADGET=m)) && EXPERIMENTAL select USB_GADGET_DUALSPEED help This host controller driver emulates USB, looping all data transfer diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c index b8d0b7825..cfebca05e 100644 --- a/drivers/usb/gadget/at91_udc.c +++ b/drivers/usb/gadget/at91_udc.c @@ -25,7 +25,6 @@ #undef VERBOSE #undef PACKET_TRACE -#include #include #include #include @@ -58,19 +57,23 @@ /* * This controller is simple and PIO-only. It's used in many AT91-series - * ARMv4T controllers, including the at91rm9200 (arm920T, with MMU), - * at91sam9261 (arm926ejs, with MMU), and several no-mmu versions. + * full speed USB controllers, including the at91rm9200 (arm920T, with MMU), + * at91sam926x (arm926ejs, with MMU), and several no-mmu versions. * * This driver expects the board has been wired with two GPIOs suppporting * a VBUS sensing IRQ, and a D+ pullup. (They may be omitted, but the - * testing hasn't covered such cases.) The pullup is most important; it + * testing hasn't covered such cases.) + * + * The pullup is most important (so it's integrated on sam926x parts). It * provides software control over whether the host enumerates the device. + * * The VBUS sensing helps during enumeration, and allows both USB clocks * (and the transceiver) to stay gated off until they're necessary, saving - * power. During USB suspend, the 48 MHz clock is gated off. + * power. During USB suspend, the 48 MHz clock is gated off in hardware; + * it may also be gated off by software during some Linux sleep states. */ -#define DRIVER_VERSION "8 March 2005" +#define DRIVER_VERSION "3 May 2006" static const char driver_name [] = "at91_udc"; static const char ep0name[] = "ep0"; @@ -317,9 +320,15 @@ static void done(struct at91_ep *ep, struct at91_request *req, int status) * * There are also state bits like FORCESTALL, EPEDS, DIR, and EPTYPE * that shouldn't normally be changed. + * + * NOTE at91sam9260 docs mention synch between UDPCK and MCK clock domains, + * implying a need to wait for one write to complete (test relevant bits) + * before starting the next write. This shouldn't be an issue given how + * infrequently we write, except maybe for write-then-read idioms. */ #define SET_FX (AT91_UDP_TXPKTRDY) -#define CLR_FX (RX_DATA_READY | AT91_UDP_RXSETUP | AT91_UDP_STALLSENT | AT91_UDP_TXCOMP) +#define CLR_FX (RX_DATA_READY | AT91_UDP_RXSETUP \ + | AT91_UDP_STALLSENT | AT91_UDP_TXCOMP) /* pull OUT packet data from the endpoint's fifo */ static int read_fifo (struct at91_ep *ep, struct at91_request *req) @@ -473,7 +482,8 @@ static void nuke(struct at91_ep *ep, int status) /*-------------------------------------------------------------------------*/ -static int at91_ep_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) +static int at91_ep_enable(struct usb_ep *_ep, + const struct usb_endpoint_descriptor *desc) { struct at91_ep *ep = container_of(_ep, struct at91_ep, ep); struct at91_udc *dev = ep->udc; @@ -583,11 +593,12 @@ static int at91_ep_disable (struct usb_ep * _ep) * interesting for request or buffer allocation. */ -static struct usb_request *at91_ep_alloc_request (struct usb_ep *_ep, unsigned int gfp_flags) +static struct usb_request * +at91_ep_alloc_request(struct usb_ep *_ep, unsigned int gfp_flags) { struct at91_request *req; - req = kcalloc(1, sizeof (struct at91_request), SLAB_KERNEL); + req = kcalloc(1, sizeof (struct at91_request), gfp_flags); if (!req) return NULL; @@ -863,6 +874,7 @@ static void stop_activity(struct at91_udc *udc) if (udc->gadget.speed == USB_SPEED_UNKNOWN) driver = NULL; udc->gadget.speed = USB_SPEED_UNKNOWN; + udc->suspended = 0; for (i = 0; i < NUM_ENDPOINTS; i++) { struct at91_ep *ep = &udc->ep[i]; @@ -890,8 +902,8 @@ static void clk_off(struct at91_udc *udc) return; udc->clocked = 0; udc->gadget.speed = USB_SPEED_UNKNOWN; - clk_disable(udc->iclk); clk_disable(udc->fclk); + clk_disable(udc->iclk); } /* @@ -912,9 +924,6 @@ static void pullup(struct at91_udc *udc, int is_on) at91_udp_write(AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS); at91_set_gpio_value(udc->board.pullup_pin, 0); clk_off(udc); - - // REVISIT: with transceiver disabled, will D- float - // so that a host would falsely detect a device? } } @@ -1291,7 +1300,8 @@ static void handle_ep0(struct at91_udc *udc) if (udc->wait_for_addr_ack) { u32 tmp; - at91_udp_write(AT91_UDP_FADDR, AT91_UDP_FEN | udc->addr); + at91_udp_write(AT91_UDP_FADDR, + AT91_UDP_FEN | udc->addr); tmp = at91_udp_read(AT91_UDP_GLB_STAT); tmp &= ~AT91_UDP_FADDEN; if (udc->addr) @@ -1362,9 +1372,10 @@ static irqreturn_t at91_udc_irq (int irq, void *_udc, struct pt_regs *r) u32 rescans = 5; while (rescans--) { - u32 status = at91_udp_read(AT91_UDP_ISR); + u32 status; - status &= at91_udp_read(AT91_UDP_IMR); + status = at91_udp_read(AT91_UDP_ISR) + & at91_udp_read(AT91_UDP_IMR); if (!status) break; @@ -1380,18 +1391,17 @@ static irqreturn_t at91_udc_irq (int irq, void *_udc, struct pt_regs *r) stop_activity(udc); /* enable ep0 */ - at91_udp_write(AT91_UDP_CSR(0), AT91_UDP_EPEDS | AT91_UDP_EPTYPE_CTRL); + at91_udp_write(AT91_UDP_CSR(0), + AT91_UDP_EPEDS | AT91_UDP_EPTYPE_CTRL); udc->gadget.speed = USB_SPEED_FULL; udc->suspended = 0; at91_udp_write(AT91_UDP_IER, AT91_UDP_EP(0)); /* * NOTE: this driver keeps clocks off unless the - * USB host is present. That saves power, and also - * eliminates IRQs (reset, resume, suspend) that can - * otherwise flood from the controller. If your - * board doesn't support VBUS detection, suspend and - * resume irq logic may need more attention... + * USB host is present. That saves power, but for + * boards that don't support VBUS detection, both + * clocks need to be active most of the time. */ /* host initiated suspend (3+ms bus idle) */ @@ -1453,13 +1463,19 @@ static irqreturn_t at91_udc_irq (int irq, void *_udc, struct pt_regs *r) /*-------------------------------------------------------------------------*/ +static void nop_release(struct device *dev) +{ + /* nothing to free */ +} + static struct at91_udc controller = { .gadget = { - .ops = &at91_udc_ops, - .ep0 = &controller.ep[0].ep, - .name = driver_name, - .dev = { - .bus_id = "gadget" + .ops = &at91_udc_ops, + .ep0 = &controller.ep[0].ep, + .name = driver_name, + .dev = { + .bus_id = "gadget", + .release = nop_release, } }, .ep[0] = { @@ -1469,7 +1485,8 @@ static struct at91_udc controller = { }, .udc = &controller, .maxpacket = 8, - .creg = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(0)), + .creg = (void __iomem *)(AT91_VA_BASE_UDP + + AT91_UDP_CSR(0)), .int_mask = 1 << 0, }, .ep[1] = { @@ -1480,7 +1497,8 @@ static struct at91_udc controller = { .udc = &controller, .is_pingpong = 1, .maxpacket = 64, - .creg = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(1)), + .creg = (void __iomem *)(AT91_VA_BASE_UDP + + AT91_UDP_CSR(1)), .int_mask = 1 << 1, }, .ep[2] = { @@ -1491,7 +1509,8 @@ static struct at91_udc controller = { .udc = &controller, .is_pingpong = 1, .maxpacket = 64, - .creg = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(2)), + .creg = (void __iomem *)(AT91_VA_BASE_UDP + + AT91_UDP_CSR(2)), .int_mask = 1 << 2, }, .ep[3] = { @@ -1502,7 +1521,8 @@ static struct at91_udc controller = { }, .udc = &controller, .maxpacket = 8, - .creg = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(3)), + .creg = (void __iomem *)(AT91_VA_BASE_UDP + + AT91_UDP_CSR(3)), .int_mask = 1 << 3, }, .ep[4] = { @@ -1513,7 +1533,8 @@ static struct at91_udc controller = { .udc = &controller, .is_pingpong = 1, .maxpacket = 256, - .creg = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(4)), + .creg = (void __iomem *)(AT91_VA_BASE_UDP + + AT91_UDP_CSR(4)), .int_mask = 1 << 4, }, .ep[5] = { @@ -1524,10 +1545,11 @@ static struct at91_udc controller = { .udc = &controller, .is_pingpong = 1, .maxpacket = 256, - .creg = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(5)), + .creg = (void __iomem *)(AT91_VA_BASE_UDP + + AT91_UDP_CSR(5)), .int_mask = 1 << 5, }, - /* ep6 and ep7 are also reserved */ + /* ep6 and ep7 are also reserved (custom silicon might use them) */ }; static irqreturn_t at91_vbus_irq(int irq, void *_udc, struct pt_regs *r) @@ -1594,6 +1616,7 @@ int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) local_irq_disable(); udc->enabled = 0; + at91_udp_write(AT91_UDP_IDR, ~0); pullup(udc, 0); local_irq_enable(); @@ -1625,6 +1648,16 @@ static int __devinit at91udc_probe(struct platform_device *pdev) return -ENODEV; } + if (pdev->num_resources != 2) { + DBG("invalid num_resources"); + return -ENODEV; + } + if ((pdev->resource[0].flags != IORESOURCE_MEM) + || (pdev->resource[1].flags != IORESOURCE_IRQ)) { + DBG("invalid resource type"); + return -ENODEV; + } + if (!request_mem_region(AT91_BASE_UDP, SZ_16K, driver_name)) { DBG("someone's using UDC memory\n"); return -EBUSY; @@ -1650,19 +1683,26 @@ static int __devinit at91udc_probe(struct platform_device *pdev) if (retval < 0) goto fail0; - /* disable everything until there's a gadget driver and vbus */ - pullup(udc, 0); + /* don't do anything until we have both gadget driver and VBUS */ + clk_enable(udc->iclk); + at91_udp_write(AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS); + at91_udp_write(AT91_UDP_IDR, 0xffffffff); + clk_disable(udc->iclk); /* request UDC and maybe VBUS irqs */ - if (request_irq(AT91_ID_UDP, at91_udc_irq, SA_INTERRUPT, driver_name, udc)) { - DBG("request irq %d failed\n", AT91_ID_UDP); + udc->udp_irq = platform_get_irq(pdev, 0); + if (request_irq(udc->udp_irq, at91_udc_irq, + IRQF_DISABLED, driver_name, udc)) { + DBG("request irq %d failed\n", udc->udp_irq); retval = -EBUSY; goto fail1; } if (udc->board.vbus_pin > 0) { - if (request_irq(udc->board.vbus_pin, at91_vbus_irq, SA_INTERRUPT, driver_name, udc)) { - DBG("request vbus irq %d failed\n", udc->board.vbus_pin); - free_irq(AT91_ID_UDP, udc); + if (request_irq(udc->board.vbus_pin, at91_vbus_irq, + IRQF_DISABLED, driver_name, udc)) { + DBG("request vbus irq %d failed\n", + udc->board.vbus_pin); + free_irq(udc->udp_irq, udc); retval = -EBUSY; goto fail1; } @@ -1671,6 +1711,7 @@ static int __devinit at91udc_probe(struct platform_device *pdev) udc->vbus = 1; } dev_set_drvdata(dev, udc); + device_init_wakeup(dev, 1); create_debug_file(udc); INFO("%s version %s\n", driver_name, DRIVER_VERSION); @@ -1679,14 +1720,14 @@ static int __devinit at91udc_probe(struct platform_device *pdev) fail1: device_unregister(&udc->gadget.dev); fail0: - release_mem_region(AT91_VA_BASE_UDP, SZ_16K); + release_mem_region(AT91_BASE_UDP, SZ_16K); DBG("%s probe failed, %d\n", driver_name, retval); return retval; } -static int __devexit at91udc_remove(struct platform_device *dev) +static int __devexit at91udc_remove(struct platform_device *pdev) { - struct at91_udc *udc = platform_get_drvdata(dev); + struct at91_udc *udc = platform_get_drvdata(pdev); DBG("remove\n"); @@ -1695,10 +1736,11 @@ static int __devexit at91udc_remove(struct platform_device *dev) if (udc->driver != 0) usb_gadget_unregister_driver(udc->driver); + device_init_wakeup(&pdev->dev, 0); remove_debug_file(udc); if (udc->board.vbus_pin > 0) free_irq(udc->board.vbus_pin, udc); - free_irq(AT91_ID_UDP, udc); + free_irq(udc->udp_irq, udc); device_unregister(&udc->gadget.dev); release_mem_region(AT91_BASE_UDP, SZ_16K); @@ -1709,31 +1751,36 @@ static int __devexit at91udc_remove(struct platform_device *dev) } #ifdef CONFIG_PM -static int at91udc_suspend(struct platform_device *dev, pm_message_t mesg) +static int at91udc_suspend(struct platform_device *pdev, pm_message_t mesg) { - struct at91_udc *udc = platform_get_drvdata(dev); + struct at91_udc *udc = platform_get_drvdata(pdev); + int wake = udc->driver && device_may_wakeup(&pdev->dev); - /* - * The "safe" suspend transitions are opportunistic ... e.g. when - * the USB link is suspended (48MHz clock autogated off), or when - * it's disconnected (programmatically gated off, elsewhere). - * Then we can suspend, and the chip can enter slow clock mode. - * - * The problem case is some component (user mode?) suspending this - * device while it's active, with the 48 MHz clock in use. There - * are two basic approaches: (a) veto suspend levels involving slow - * clock mode, (b) disconnect, so 48 MHz will no longer be in use - * and we can enter slow clock mode. This uses (b) for now, since - * it's simplest until AT91 PM exists and supports the other option. + /* Unless we can act normally to the host (letting it wake us up + * whenever it has work for us) force disconnect. Wakeup requires + * PLLB for USB events (signaling for reset, wakeup, or incoming + * tokens) and VBUS irqs (on systems which support them). */ - if (udc->vbus && !udc->suspended) + if ((!udc->suspended && udc->addr) + || !wake + || at91_suspend_entering_slow_clock()) { pullup(udc, 0); + disable_irq_wake(udc->udp_irq); + } else + enable_irq_wake(udc->udp_irq); + + if (udc->board.vbus_pin > 0) { + if (wake) + enable_irq_wake(udc->board.vbus_pin); + else + disable_irq_wake(udc->board.vbus_pin); + } return 0; } -static int at91udc_resume(struct platform_device *dev) +static int at91udc_resume(struct platform_device *pdev) { - struct at91_udc *udc = platform_get_drvdata(dev); + struct at91_udc *udc = platform_get_drvdata(pdev); /* maybe reconnect to host; if so, clocks on */ pullup(udc, 1); @@ -1749,7 +1796,7 @@ static struct platform_driver at91_udc = { .remove = __devexit_p(at91udc_remove), .shutdown = at91udc_shutdown, .suspend = at91udc_suspend, - .resume = at91udc_resume, + .resume = at91udc_resume, .driver = { .name = (char *) driver_name, .owner = THIS_MODULE, @@ -1768,6 +1815,6 @@ static void __devexit udc_exit_module(void) } module_exit(udc_exit_module); -MODULE_DESCRIPTION("AT91RM9200 udc driver"); +MODULE_DESCRIPTION("AT91 udc driver"); MODULE_AUTHOR("Thomas Rathbone, David Brownell"); MODULE_LICENSE("GPL"); diff --git a/drivers/usb/gadget/at91_udc.h b/drivers/usb/gadget/at91_udc.h index 5a4799ced..882af42e8 100644 --- a/drivers/usb/gadget/at91_udc.h +++ b/drivers/usb/gadget/at91_udc.h @@ -141,6 +141,7 @@ struct at91_udc { struct clk *iclk, *fclk; struct platform_device *pdev; struct proc_dir_entry *pde; + int udp_irq; }; static inline struct at91_udc *to_udc(struct usb_gadget *g) diff --git a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c index 42ce41d71..7d1c22c34 100644 --- a/drivers/usb/gadget/dummy_hcd.c +++ b/drivers/usb/gadget/dummy_hcd.c @@ -36,7 +36,6 @@ #define DEBUG -#include #include #include #include @@ -610,7 +609,8 @@ static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req) if (!dum->driver) return -ESHUTDOWN; - spin_lock_irqsave (&dum->lock, flags); + local_irq_save (flags); + spin_lock (&dum->lock); list_for_each_entry (req, &ep->queue, queue) { if (&req->req == _req) { list_del_init (&req->queue); @@ -619,7 +619,7 @@ static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req) break; } } - spin_unlock_irqrestore (&dum->lock, flags); + spin_unlock (&dum->lock); if (retval == 0) { dev_dbg (udc_dev(dum), @@ -627,6 +627,7 @@ static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req) req, _ep->name, _req->length, _req->buf); _req->complete (_ep, _req); } + local_irq_restore (flags); return retval; } diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c index f7c6d758e..53d584589 100644 --- a/drivers/usb/gadget/epautoconf.c +++ b/drivers/usb/gadget/epautoconf.c @@ -34,12 +34,12 @@ /* we must assign addresses for configurable endpoints (like net2280) */ -static __initdata unsigned epnum; +static __devinitdata unsigned epnum; // #define MANY_ENDPOINTS #ifdef MANY_ENDPOINTS /* more than 15 configurable endpoints */ -static __initdata unsigned in_epnum; +static __devinitdata unsigned in_epnum; #endif @@ -59,7 +59,7 @@ static __initdata unsigned in_epnum; * NOTE: each endpoint is unidirectional, as specified by its USB * descriptor; and isn't specific to a configuration or altsetting. */ -static int __init +static int __devinit ep_matches ( struct usb_gadget *gadget, struct usb_ep *ep, @@ -73,7 +73,7 @@ ep_matches ( /* endpoint already claimed? */ if (0 != ep->driver_data) return 0; - + /* only support ep0 for portable CONTROL traffic */ type = desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; if (USB_ENDPOINT_XFER_CONTROL == type) @@ -186,7 +186,7 @@ ep_matches ( return 1; } -static struct usb_ep * __init +static struct usb_ep * __devinit find_ep (struct usb_gadget *gadget, const char *name) { struct usb_ep *ep; @@ -228,7 +228,7 @@ find_ep (struct usb_gadget *gadget, const char *name) * * On failure, this returns a null endpoint descriptor. */ -struct usb_ep * __init usb_ep_autoconfig ( +struct usb_ep * __devinit usb_ep_autoconfig ( struct usb_gadget *gadget, struct usb_endpoint_descriptor *desc ) @@ -276,7 +276,7 @@ struct usb_ep * __init usb_ep_autoconfig ( return ep; } - /* Second, look at endpoints until an unclaimed one looks usable */ + /* Second, look at endpoints until an unclaimed one looks usable */ list_for_each_entry (ep, &gadget->ep_list, ep_list) { if (ep_matches (gadget, ep, desc)) return ep; @@ -295,7 +295,7 @@ struct usb_ep * __init usb_ep_autoconfig ( * state such as ep->driver_data and the record of assigned endpoints * used by usb_ep_autoconfig(). */ -void __init usb_ep_autoconfig_reset (struct usb_gadget *gadget) +void __devinit usb_ep_autoconfig_reset (struct usb_gadget *gadget) { struct usb_ep *ep; diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c index 9c4422ac9..fed484da5 100644 --- a/drivers/usb/gadget/ether.c +++ b/drivers/usb/gadget/ether.c @@ -23,7 +23,6 @@ // #define DEBUG 1 // #define VERBOSE -#include #include #include #include @@ -49,7 +48,7 @@ #include #include -#include +#include #include #include @@ -101,9 +100,9 @@ static const char driver_desc [] = DRIVER_DESC; /* CDC and RNDIS support the same host-chosen outgoing packet filters. */ #define DEFAULT_FILTER (USB_CDC_PACKET_TYPE_BROADCAST \ - |USB_CDC_PACKET_TYPE_ALL_MULTICAST \ - |USB_CDC_PACKET_TYPE_PROMISCUOUS \ - |USB_CDC_PACKET_TYPE_DIRECTED) + |USB_CDC_PACKET_TYPE_ALL_MULTICAST \ + |USB_CDC_PACKET_TYPE_PROMISCUOUS \ + |USB_CDC_PACKET_TYPE_DIRECTED) /*-------------------------------------------------------------------------*/ @@ -118,6 +117,8 @@ struct eth_dev { struct usb_ep *in_ep, *out_ep, *status_ep; const struct usb_endpoint_descriptor *in, *out, *status; + + spinlock_t req_lock; struct list_head tx_reqs, rx_reqs; struct net_device *net; @@ -261,7 +262,7 @@ MODULE_PARM_DESC(host_addr, "Host Ethernet Address"); #define DEV_CONFIG_CDC #endif -#ifdef CONFIG_USB_GADGET_MUSBHDRC +#ifdef CONFIG_USB_GADGET_MUSB_HDRC #define DEV_CONFIG_CDC #endif @@ -318,7 +319,7 @@ static inline int rndis_active(struct eth_dev *dev) #define DEFAULT_QLEN 2 /* double buffering by default */ /* peak bulk transfer bits-per-second */ -#define HS_BPS (13 * 512 * 8 * 1000 * 8) +#define HS_BPS (13 * 512 * 8 * 1000 * 8) #define FS_BPS (19 * 64 * 1 * 1000 * 8) #ifdef CONFIG_USB_GADGET_DUALSPEED @@ -466,7 +467,7 @@ eth_config = { }; #ifdef CONFIG_USB_ETH_RNDIS -static struct usb_config_descriptor +static struct usb_config_descriptor rndis_config = { .bLength = sizeof rndis_config, .bDescriptorType = USB_DT_CONFIG, @@ -511,7 +512,7 @@ static const struct usb_interface_descriptor rndis_control_intf = { .bLength = sizeof rndis_control_intf, .bDescriptorType = USB_DT_INTERFACE, - + .bInterfaceNumber = 0, .bNumEndpoints = 1, .bInterfaceClass = USB_CLASS_COMM, @@ -545,20 +546,20 @@ static const struct usb_cdc_union_desc union_desc = { #ifdef CONFIG_USB_ETH_RNDIS static const struct usb_cdc_call_mgmt_descriptor call_mgmt_descriptor = { - .bLength = sizeof call_mgmt_descriptor, - .bDescriptorType = USB_DT_CS_INTERFACE, - .bDescriptorSubType = USB_CDC_CALL_MANAGEMENT_TYPE, + .bLength = sizeof call_mgmt_descriptor, + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = USB_CDC_CALL_MANAGEMENT_TYPE, - .bmCapabilities = 0x00, - .bDataInterface = 0x01, + .bmCapabilities = 0x00, + .bDataInterface = 0x01, }; static const struct usb_cdc_acm_descriptor acm_descriptor = { - .bLength = sizeof acm_descriptor, - .bDescriptorType = USB_DT_CS_INTERFACE, - .bDescriptorSubType = USB_CDC_ACM_TYPE, + .bLength = sizeof acm_descriptor, + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = USB_CDC_ACM_TYPE, - .bmCapabilities = 0x00, + .bmCapabilities = 0x00, }; #endif @@ -595,7 +596,7 @@ static const struct usb_cdc_ether_desc ether_desc = { * RNDIS requires the status endpoint, since it uses that encapsulation * mechanism for its funky RPC scheme. */ - + #define LOG2_STATUS_INTERVAL_MSEC 5 /* 1 << 5 == 32 msec */ #define STATUS_BYTECOUNT 16 /* 8 byte header + data */ @@ -978,7 +979,7 @@ set_ether_config (struct eth_dev *dev, gfp_t gfp_flags) result = usb_ep_enable (dev->status_ep, dev->status); if (result != 0) { - DEBUG (dev, "enable %s --> %d\n", + DEBUG (dev, "enable %s --> %d\n", dev->status_ep->name, result); goto done; } @@ -1002,15 +1003,15 @@ set_ether_config (struct eth_dev *dev, gfp_t gfp_flags) if (!cdc_active(dev)) { result = usb_ep_enable (dev->in_ep, dev->in); if (result != 0) { - DEBUG(dev, "enable %s --> %d\n", + DEBUG(dev, "enable %s --> %d\n", dev->in_ep->name, result); goto done; } result = usb_ep_enable (dev->out_ep, dev->out); if (result != 0) { - DEBUG (dev, "enable %s --> %d\n", - dev->in_ep->name, result); + DEBUG (dev, "enable %s --> %d\n", + dev->out_ep->name, result); goto done; } } @@ -1067,21 +1068,31 @@ static void eth_reset_config (struct eth_dev *dev) */ if (dev->in) { usb_ep_disable (dev->in_ep); + spin_lock(&dev->req_lock); while (likely (!list_empty (&dev->tx_reqs))) { req = container_of (dev->tx_reqs.next, struct usb_request, list); list_del (&req->list); + + spin_unlock(&dev->req_lock); usb_ep_free_request (dev->in_ep, req); + spin_lock(&dev->req_lock); } + spin_unlock(&dev->req_lock); } if (dev->out) { usb_ep_disable (dev->out_ep); + spin_lock(&dev->req_lock); while (likely (!list_empty (&dev->rx_reqs))) { req = container_of (dev->rx_reqs.next, struct usb_request, list); list_del (&req->list); + + spin_unlock(&dev->req_lock); usb_ep_free_request (dev->out_ep, req); + spin_lock(&dev->req_lock); } + spin_unlock(&dev->req_lock); } if (dev->status) { @@ -1144,7 +1155,7 @@ eth_set_config (struct eth_dev *dev, unsigned number, gfp_t gfp_flags) #ifdef CONFIG_USB_GADGET_DUALSPEED case USB_SPEED_HIGH: speed = "high"; break; #endif - default: speed = "?"; break; + default: speed = "?"; break; } dev->config = number; @@ -1206,7 +1217,7 @@ static void issue_start_status (struct eth_dev *dev) struct usb_request *req = dev->stat_req; struct usb_cdc_notification *event; int value; - + DEBUG (dev, "%s, flush old status first\n", __FUNCTION__); /* flush old status @@ -1268,7 +1279,7 @@ static void rndis_command_complete (struct usb_ep *ep, struct usb_request *req) { struct eth_dev *dev = ep->driver_data; int status; - + /* received RNDIS command from USB_CDC_SEND_ENCAPSULATED_COMMAND */ spin_lock(&dev->lock); status = rndis_msg_parser (dev->rndis_config, (u8 *) req->buf); @@ -1472,7 +1483,7 @@ done_set_intf: #endif /* DEV_CONFIG_CDC */ -#ifdef CONFIG_USB_ETH_RNDIS +#ifdef CONFIG_USB_ETH_RNDIS /* RNDIS uses the CDC command encapsulation mechanism to implement * an RPC scheme, with much getting/setting of attributes by OID. */ @@ -1489,7 +1500,7 @@ done_set_intf: req->complete = rndis_command_complete; /* later, rndis_control_ack () sends a notification */ break; - + case USB_CDC_GET_ENCAPSULATED_RESPONSE: if ((USB_DIR_IN|USB_TYPE_CLASS|USB_RECIP_INTERFACE) == ctrl->bRequestType @@ -1641,7 +1652,7 @@ rx_submit (struct eth_dev *dev, struct usb_request *req, gfp_t gfp_flags) DEBUG (dev, "no rx skb\n"); goto enomem; } - + /* Some platforms perform better when IP packets are aligned, * but on at least one, checksumming fails otherwise. Note: * RNDIS headers involve variable numbers of LE32 values. @@ -1660,9 +1671,9 @@ enomem: if (retval) { DEBUG (dev, "rx submit --> %d\n", retval); dev_kfree_skb_any (skb); - spin_lock (&dev->lock); + spin_lock(&dev->req_lock); list_add (&req->list, &dev->rx_reqs); - spin_unlock (&dev->lock); + spin_unlock(&dev->req_lock); } return retval; } @@ -1720,7 +1731,7 @@ quiesce: case -EOVERFLOW: dev->stats.rx_over_errors++; // FALLTHROUGH - + default: dev->stats.rx_errors++; DEBUG (dev, "rx status %d\n", status); @@ -1731,8 +1742,9 @@ quiesce: dev_kfree_skb_any (skb); if (!netif_running (dev->net)) { clean: - /* nobody reading rx_reqs, so no dev->lock */ + spin_lock(&dev->req_lock); list_add (&req->list, &dev->rx_reqs); + spin_unlock(&dev->req_lock); req = NULL; } if (req) @@ -1783,15 +1795,18 @@ static int alloc_requests (struct eth_dev *dev, unsigned n, gfp_t gfp_flags) { int status; + spin_lock(&dev->req_lock); status = prealloc (&dev->tx_reqs, dev->in_ep, n, gfp_flags); if (status < 0) goto fail; status = prealloc (&dev->rx_reqs, dev->out_ep, n, gfp_flags); if (status < 0) goto fail; - return 0; + goto done; fail: DEBUG (dev, "can't alloc requests\n"); +done: + spin_unlock(&dev->req_lock); return status; } @@ -1801,21 +1816,21 @@ static void rx_fill (struct eth_dev *dev, gfp_t gfp_flags) unsigned long flags; /* fill unused rxq slots with some skb */ - spin_lock_irqsave (&dev->lock, flags); + spin_lock_irqsave(&dev->req_lock, flags); while (!list_empty (&dev->rx_reqs)) { req = container_of (dev->rx_reqs.next, struct usb_request, list); list_del_init (&req->list); - spin_unlock_irqrestore (&dev->lock, flags); + spin_unlock_irqrestore(&dev->req_lock, flags); if (rx_submit (dev, req, gfp_flags) < 0) { defer_kevent (dev, WORK_RX_MEMORY); return; } - spin_lock_irqsave (&dev->lock, flags); + spin_lock_irqsave(&dev->req_lock, flags); } - spin_unlock_irqrestore (&dev->lock, flags); + spin_unlock_irqrestore(&dev->req_lock, flags); } static void eth_work (void *_dev) @@ -1849,9 +1864,9 @@ static void tx_complete (struct usb_ep *ep, struct usb_request *req) } dev->stats.tx_packets++; - spin_lock (&dev->lock); + spin_lock(&dev->req_lock); list_add (&req->list, &dev->tx_reqs); - spin_unlock (&dev->lock); + spin_unlock(&dev->req_lock); dev_kfree_skb_any (skb); atomic_dec (&dev->tx_qlen); @@ -1897,12 +1912,12 @@ static int eth_start_xmit (struct sk_buff *skb, struct net_device *net) /* ignores USB_CDC_PACKET_TYPE_DIRECTED */ } - spin_lock_irqsave (&dev->lock, flags); + spin_lock_irqsave(&dev->req_lock, flags); req = container_of (dev->tx_reqs.next, struct usb_request, list); list_del (&req->list); if (list_empty (&dev->tx_reqs)) netif_stop_queue (net); - spin_unlock_irqrestore (&dev->lock, flags); + spin_unlock_irqrestore(&dev->req_lock, flags); /* no buffer copies needed, unless the network stack did it * or the hardware can't use skb buffers. @@ -1915,7 +1930,7 @@ static int eth_start_xmit (struct sk_buff *skb, struct net_device *net) sizeof (struct rndis_packet_msg_type)); if (!skb_rndis) goto drop; - + dev_kfree_skb_any (skb); skb = skb_rndis; rndis_add_hdr (skb); @@ -1956,11 +1971,11 @@ static int eth_start_xmit (struct sk_buff *skb, struct net_device *net) drop: dev->stats.tx_dropped++; dev_kfree_skb_any (skb); - spin_lock_irqsave (&dev->lock, flags); + spin_lock_irqsave(&dev->req_lock, flags); if (list_empty (&dev->tx_reqs)) netif_start_queue (net); list_add (&req->list, &dev->tx_reqs); - spin_unlock_irqrestore (&dev->lock, flags); + spin_unlock_irqrestore(&dev->req_lock, flags); } return 0; } @@ -2001,7 +2016,7 @@ static int rndis_control_ack (struct net_device *net) struct eth_dev *dev = netdev_priv(net); u32 length; struct usb_request *resp = dev->stat_req; - + /* in case RNDIS calls this after disconnect */ if (!dev->status) { DEBUG (dev, "status ENODEV\n"); @@ -2021,16 +2036,16 @@ static int rndis_control_ack (struct net_device *net) resp->length = 8; resp->complete = rndis_control_ack_complete; resp->context = dev; - + *((__le32 *) resp->buf) = __constant_cpu_to_le32 (1); *((__le32 *) resp->buf + 1) = __constant_cpu_to_le32 (0); - + length = usb_ep_queue (dev->status_ep, resp, GFP_ATOMIC); if (length < 0) { resp->status = 0; rndis_control_ack_complete (dev->status_ep, resp); } - + return 0; } @@ -2047,7 +2062,7 @@ static void eth_start (struct eth_dev *dev, gfp_t gfp_flags) /* fill the rx queue */ rx_fill (dev, gfp_flags); - /* and open the tx floodgates */ + /* and open the tx floodgates */ atomic_set (&dev->tx_qlen, 0); netif_wake_queue (dev->net); if (rndis_active(dev)) { @@ -2076,7 +2091,7 @@ static int eth_stop (struct net_device *net) netif_stop_queue (net); DEBUG (dev, "stop stats: rx/tx %ld/%ld, errs %ld/%ld\n", - dev->stats.rx_packets, dev->stats.tx_packets, + dev->stats.rx_packets, dev->stats.tx_packets, dev->stats.rx_errors, dev->stats.tx_errors ); @@ -2095,7 +2110,7 @@ static int eth_stop (struct net_device *net) usb_ep_enable (dev->status_ep, dev->status); } } - + if (rndis_active(dev)) { rndis_set_param_medium (dev->rndis_config, NDIS_MEDIUM_802_3, 0); @@ -2132,7 +2147,7 @@ eth_req_free (struct usb_ep *ep, struct usb_request *req) } -static void __exit +static void /* __init_or_exit */ eth_unbind (struct usb_gadget *gadget) { struct eth_dev *dev = get_gadget_data (gadget); @@ -2159,7 +2174,7 @@ eth_unbind (struct usb_gadget *gadget) set_gadget_data (gadget, NULL); } -static u8 __init nibble (unsigned char c) +static u8 __devinit nibble (unsigned char c) { if (likely (isdigit (c))) return c - '0'; @@ -2169,7 +2184,7 @@ static u8 __init nibble (unsigned char c) return 0; } -static int __init get_ether_addr(const char *str, u8 *dev_addr) +static int __devinit get_ether_addr(const char *str, u8 *dev_addr) { if (str) { unsigned i; @@ -2190,7 +2205,7 @@ static int __init get_ether_addr(const char *str, u8 *dev_addr) return 1; } -static int __init +static int __devinit eth_bind (struct usb_gadget *gadget) { struct eth_dev *dev; @@ -2301,7 +2316,7 @@ autoconf_fail: return -ENODEV; } in_ep->driver_data = in_ep; /* claim */ - + out_ep = usb_ep_autoconfig (gadget, &fs_sink_desc); if (!out_ep) goto autoconf_fail; @@ -2374,11 +2389,12 @@ autoconf_fail: #endif } - net = alloc_etherdev (sizeof *dev); - if (!net) + net = alloc_etherdev (sizeof *dev); + if (!net) return status; dev = netdev_priv(net); spin_lock_init (&dev->lock); + spin_lock_init (&dev->req_lock); INIT_WORK (&dev->work, eth_work, dev); INIT_LIST_HEAD (&dev->tx_reqs); INIT_LIST_HEAD (&dev->rx_reqs); @@ -2454,7 +2470,7 @@ autoconf_fail: dev->gadget = gadget; set_gadget_data (gadget, dev); gadget->ep0->driver_data = dev; - + /* two kinds of host-initiated state changes: * - iff DATA transfer is active, carrier is "on" * - tx queueing enabled if open *and* carrier is "on" @@ -2462,8 +2478,8 @@ autoconf_fail: netif_stop_queue (dev->net); netif_carrier_off (dev->net); - SET_NETDEV_DEV (dev->net, &gadget->dev); - status = register_netdev (dev->net); + SET_NETDEV_DEV (dev->net, &gadget->dev); + status = register_netdev (dev->net); if (status < 0) goto fail1; @@ -2488,7 +2504,7 @@ autoconf_fail: u32 vendorID = 0; /* FIXME RNDIS vendor id == "vendor NIC code" == ? */ - + dev->rndis_config = rndis_register (rndis_control_ack); if (dev->rndis_config < 0) { fail0: @@ -2496,7 +2512,7 @@ fail0: status = -ENODEV; goto fail; } - + /* these set up a lot of the OIDs that RNDIS needs */ rndis_set_host_mac (dev->rndis_config, dev->host_mac); if (rndis_set_param_dev (dev->rndis_config, dev->net, @@ -2548,7 +2564,7 @@ static struct usb_gadget_driver eth_driver = { .function = (char *) driver_desc, .bind = eth_bind, - .unbind = __exit_p(eth_unbind), + .unbind = eth_unbind, .setup = eth_setup, .disconnect = eth_disconnect, @@ -2556,7 +2572,7 @@ static struct usb_gadget_driver eth_driver = { .suspend = eth_suspend, .resume = eth_resume, - .driver = { + .driver = { .name = (char *) shortname, .owner = THIS_MODULE, }, diff --git a/drivers/usb/gadget/file_storage.c b/drivers/usb/gadget/file_storage.c index 6f887478b..8d7f1e84c 100644 --- a/drivers/usb/gadget/file_storage.c +++ b/drivers/usb/gadget/file_storage.c @@ -221,7 +221,6 @@ #undef VERBOSE #undef DUMP_MSGS -#include #include #include @@ -1906,7 +1905,6 @@ static int fsync_sub(struct lun *curlun) inode = filp->f_dentry->d_inode; mutex_lock(&inode->i_mutex); - current->flags |= PF_SYNCWRITE; rc = filemap_fdatawrite(inode->i_mapping); err = filp->f_op->fsync(filp, filp->f_dentry, 1); if (!rc) @@ -1914,7 +1912,6 @@ static int fsync_sub(struct lun *curlun) err = filemap_fdatawait(inode->i_mapping); if (!rc) rc = err; - current->flags &= ~PF_SYNCWRITE; mutex_unlock(&inode->i_mutex); VLDBG(curlun, "fdatasync -> %d\n", rc); return rc; @@ -3694,7 +3691,7 @@ static void lun_release(struct device *dev) kref_put(&fsg->ref, fsg_release); } -static void __exit fsg_unbind(struct usb_gadget *gadget) +static void /* __init_or_exit */ fsg_unbind(struct usb_gadget *gadget) { struct fsg_dev *fsg = get_gadget_data(gadget); int i; diff --git a/drivers/usb/gadget/goku_udc.c b/drivers/usb/gadget/goku_udc.c index 66b81bbf6..7cf2999e8 100644 --- a/drivers/usb/gadget/goku_udc.c +++ b/drivers/usb/gadget/goku_udc.c @@ -24,7 +24,6 @@ // #define VERBOSE /* extra debug messages (success too) */ // #define USB_TRACE /* packet-level success messages */ -#include #include #include #include @@ -1850,7 +1849,6 @@ static int goku_probe(struct pci_dev *pdev, const struct pci_device_id *id) unsigned long resource, len; void __iomem *base = NULL; int retval; - char buf [8], *bufp; /* if you want to support more than one controller in a system, * usb_gadget_driver_{register,unregister}() must change. @@ -1913,20 +1911,14 @@ static int goku_probe(struct pci_dev *pdev, const struct pci_device_id *id) pci_set_drvdata(pdev, dev); INFO(dev, "%s\n", driver_desc); INFO(dev, "version: " DRIVER_VERSION " %s\n", dmastr()); -#ifndef __sparc__ - scnprintf(buf, sizeof buf, "%d", pdev->irq); - bufp = buf; -#else - bufp = __irq_itoa(pdev->irq); -#endif - INFO(dev, "irq %s, pci mem %p\n", bufp, base); + INFO(dev, "irq %d, pci mem %p\n", pdev->irq, base); /* init to known state, then setup irqs */ udc_reset(dev); udc_reinit (dev); - if (request_irq(pdev->irq, goku_irq, SA_SHIRQ/*|SA_SAMPLE_RANDOM*/, + if (request_irq(pdev->irq, goku_irq, IRQF_SHARED/*|IRQF_SAMPLE_RANDOM*/, driver_name, dev) != 0) { - DBG(dev, "request interrupt %s failed\n", bufp); + DBG(dev, "request interrupt %d failed\n", pdev->irq); retval = -EBUSY; goto done; } diff --git a/drivers/usb/gadget/inode.c b/drivers/usb/gadget/inode.c index 0eb010a3f..084fe6236 100644 --- a/drivers/usb/gadget/inode.c +++ b/drivers/usb/gadget/inode.c @@ -342,7 +342,7 @@ fail: static ssize_t ep_io (struct ep_data *epdata, void *buf, unsigned len) { - DECLARE_COMPLETION (done); + DECLARE_COMPLETION_ONSTACK (done); int value; spin_lock_irq (&epdata->dev->lock); @@ -528,7 +528,7 @@ struct kiocb_priv { struct usb_request *req; struct ep_data *epdata; void *buf; - char __user *ubuf; + char __user *ubuf; /* NULL for writes */ unsigned actual; }; @@ -566,7 +566,6 @@ static ssize_t ep_aio_read_retry(struct kiocb *iocb) status = priv->actual; kfree(priv->buf); kfree(priv); - aio_put_req(iocb); return status; } @@ -580,8 +579,8 @@ static void ep_aio_complete(struct usb_ep *ep, struct usb_request *req) spin_lock(&epdata->dev->lock); priv->req = NULL; priv->epdata = NULL; - if (NULL == iocb->ki_retry - || unlikely(0 == req->actual) + if (priv->ubuf == NULL + || unlikely(req->actual == 0) || unlikely(kiocbIsCancelled(iocb))) { kfree(req->buf); kfree(priv); @@ -618,7 +617,7 @@ ep_aio_rwtail( char __user *ubuf ) { - struct kiocb_priv *priv = (void *) &iocb->private; + struct kiocb_priv *priv; struct usb_request *req; ssize_t value; @@ -670,7 +669,7 @@ fail: kfree(priv); put_ep(epdata); } else - value = -EIOCBQUEUED; + value = (ubuf ? -EIOCBRETRY : -EIOCBQUEUED); return value; } @@ -845,7 +844,7 @@ fail1: static int ep_open (struct inode *inode, struct file *fd) { - struct ep_data *data = inode->u.generic_ip; + struct ep_data *data = inode->i_private; int value = -EBUSY; if (down_interruptible (&data->lock) != 0) @@ -1039,7 +1038,7 @@ scan: /* ep0 can't deliver events when STATE_SETUP */ for (i = 0; i < n; i++) { if (dev->event [i].type == GADGETFS_SETUP) { - len = n = i + 1; + len = i + 1; len *= sizeof (struct usb_gadgetfs_event); n = 0; break; @@ -1587,13 +1586,13 @@ gadgetfs_create_file (struct super_block *sb, char const *name, static int activate_ep_files (struct dev_data *dev) { struct usb_ep *ep; + struct ep_data *data; gadget_for_each_ep (ep, dev->gadget) { - struct ep_data *data; data = kzalloc(sizeof(*data), GFP_KERNEL); if (!data) - goto enomem; + goto enomem0; data->state = STATE_EP_DISABLED; init_MUTEX (&data->lock); init_waitqueue_head (&data->wait); @@ -1608,21 +1607,23 @@ static int activate_ep_files (struct dev_data *dev) data->req = usb_ep_alloc_request (ep, GFP_KERNEL); if (!data->req) - goto enomem; + goto enomem1; data->inode = gadgetfs_create_file (dev->sb, data->name, data, &ep_config_operations, &data->dentry); - if (!data->inode) { - usb_ep_free_request(ep, data->req); - kfree (data); - goto enomem; - } + if (!data->inode) + goto enomem2; list_add_tail (&data->epfiles, &dev->epfiles); } return 0; -enomem: +enomem2: + usb_ep_free_request (ep, data->req); +enomem1: + put_dev (dev); + kfree (data); +enomem0: DBG (dev, "%s enomem\n", __FUNCTION__); destroy_ep_files (dev); return -ENOMEM; @@ -1793,7 +1794,7 @@ static struct usb_gadget_driver probe_driver = { * * After initialization, the device stays active for as long as that * $CHIP file is open. Events may then be read from that descriptor, - * such configuration notifications. More complex drivers will handle + * such as configuration notifications. More complex drivers will handle * some control requests in user space. */ @@ -1908,7 +1909,7 @@ fail: static int dev_open (struct inode *inode, struct file *fd) { - struct dev_data *dev = inode->u.generic_ip; + struct dev_data *dev = inode->i_private; int value = -EBUSY; if (dev->state == STATE_DEV_DISABLED) { @@ -1965,11 +1966,10 @@ gadgetfs_make_inode (struct super_block *sb, inode->i_mode = mode; inode->i_uid = default_uid; inode->i_gid = default_gid; - inode->i_blksize = PAGE_CACHE_SIZE; inode->i_blocks = 0; inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; - inode->u.generic_ip = data; + inode->i_private = data; inode->i_fop = fops; } return inode; @@ -2033,12 +2033,10 @@ gadgetfs_fill_super (struct super_block *sb, void *opts, int silent) NULL, &simple_dir_operations, S_IFDIR | S_IRUGO | S_IXUGO); if (!inode) - return -ENOMEM; + goto enomem0; inode->i_op = &simple_dir_inode_operations; - if (!(d = d_alloc_root (inode))) { - iput (inode); - return -ENOMEM; - } + if (!(d = d_alloc_root (inode))) + goto enomem1; sb->s_root = d; /* the ep0 file is named after the controller we expect; @@ -2046,29 +2044,36 @@ gadgetfs_fill_super (struct super_block *sb, void *opts, int silent) */ dev = dev_new (); if (!dev) - return -ENOMEM; + goto enomem2; dev->sb = sb; - if (!(inode = gadgetfs_create_file (sb, CHIP, + if (!gadgetfs_create_file (sb, CHIP, dev, &dev_init_operations, - &dev->dentry))) { - put_dev(dev); - return -ENOMEM; - } + &dev->dentry)) + goto enomem3; /* other endpoint files are available after hardware setup, * from binding to a controller. */ the_device = dev; return 0; + +enomem3: + put_dev (dev); +enomem2: + dput (d); +enomem1: + iput (inode); +enomem0: + return -ENOMEM; } /* "mount -t gadgetfs path /dev/gadget" ends up here */ -static struct super_block * +static int gadgetfs_get_sb (struct file_system_type *t, int flags, - const char *path, void *opts) + const char *path, void *opts, struct vfsmount *mnt) { - return get_sb_single (t, flags, opts, gadgetfs_fill_super); + return get_sb_single (t, flags, opts, gadgetfs_fill_super, mnt); } static void diff --git a/drivers/usb/gadget/lh7a40x_udc.c b/drivers/usb/gadget/lh7a40x_udc.c index 0d3424eda..36db72579 100644 --- a/drivers/usb/gadget/lh7a40x_udc.c +++ b/drivers/usb/gadget/lh7a40x_udc.c @@ -2107,7 +2107,7 @@ static int lh7a40x_udc_probe(struct platform_device *pdev) /* irq setup after old hardware state is cleaned up */ retval = - request_irq(IRQ_USBINTR, lh7a40x_udc_irq, SA_INTERRUPT, driver_name, + request_irq(IRQ_USBINTR, lh7a40x_udc_irq, IRQF_DISABLED, driver_name, dev); if (retval != 0) { DEBUG(KERN_ERR "%s: can't get irq %i, err %d\n", driver_name, @@ -2143,7 +2143,7 @@ static int lh7a40x_udc_remove(struct platform_device *pdev) static struct platform_driver udc_driver = { .probe = lh7a40x_udc_probe, - .remove = lh7a40x_udc_remove + .remove = lh7a40x_udc_remove, /* FIXME power management support */ /* .suspend = ... disable UDC */ /* .resume = ... re-enable UDC */ diff --git a/drivers/usb/gadget/lh7a40x_udc.h b/drivers/usb/gadget/lh7a40x_udc.h index 9b2e6f7cb..e3bb78524 100644 --- a/drivers/usb/gadget/lh7a40x_udc.h +++ b/drivers/usb/gadget/lh7a40x_udc.h @@ -24,7 +24,6 @@ #ifndef __LH7A40X_H_ #define __LH7A40X_H_ -#include #include #include #include diff --git a/drivers/usb/gadget/net2280.c b/drivers/usb/gadget/net2280.c index 0b9293493..09243239d 100644 --- a/drivers/usb/gadget/net2280.c +++ b/drivers/usb/gadget/net2280.c @@ -46,7 +46,6 @@ #undef DEBUG /* messages on error and most fault paths */ #undef VERBOSE /* extra debug messages (success too) */ -#include #include #include #include @@ -2822,7 +2821,6 @@ static int net2280_probe (struct pci_dev *pdev, const struct pci_device_id *id) unsigned long resource, len; void __iomem *base = NULL; int retval, i; - char buf [8], *bufp; /* if you want to support more than one controller in a system, * usb_gadget_driver_{register,unregister}() must change. @@ -2896,15 +2894,10 @@ static int net2280_probe (struct pci_dev *pdev, const struct pci_device_id *id) retval = -ENODEV; goto done; } -#ifndef __sparc__ - scnprintf (buf, sizeof buf, "%d", pdev->irq); - bufp = buf; -#else - bufp = __irq_itoa(pdev->irq); -#endif - if (request_irq (pdev->irq, net2280_irq, SA_SHIRQ, driver_name, dev) + + if (request_irq (pdev->irq, net2280_irq, IRQF_SHARED, driver_name, dev) != 0) { - ERROR (dev, "request interrupt %s failed\n", bufp); + ERROR (dev, "request interrupt %d failed\n", pdev->irq); retval = -EBUSY; goto done; } @@ -2953,8 +2946,8 @@ static int net2280_probe (struct pci_dev *pdev, const struct pci_device_id *id) /* done */ INFO (dev, "%s\n", driver_desc); - INFO (dev, "irq %s, pci mem %p, chip rev %04x\n", - bufp, base, dev->chiprev); + INFO (dev, "irq %d, pci mem %p, chip rev %04x\n", + pdev->irq, base, dev->chiprev); INFO (dev, "version: " DRIVER_VERSION "; dma %s\n", use_dma ? (use_dma_chaining ? "chaining" : "enabled") @@ -2972,6 +2965,22 @@ done: return retval; } +/* make sure the board is quiescent; otherwise it will continue + * generating IRQs across the upcoming reboot. + */ + +static void net2280_shutdown (struct pci_dev *pdev) +{ + struct net2280 *dev = pci_get_drvdata (pdev); + + /* disable IRQs */ + writel (0, &dev->regs->pciirqenb0); + writel (0, &dev->regs->pciirqenb1); + + /* disable the pullup so the host will think we're gone */ + writel (0, &dev->usb->usbctl); +} + /*-------------------------------------------------------------------------*/ @@ -3001,6 +3010,7 @@ static struct pci_driver net2280_pci_driver = { .probe = net2280_probe, .remove = net2280_remove, + .shutdown = net2280_shutdown, /* FIXME add power management support */ }; diff --git a/drivers/usb/gadget/omap_udc.c b/drivers/usb/gadget/omap_udc.c index fbea51448..65d749a2b 100644 --- a/drivers/usb/gadget/omap_udc.c +++ b/drivers/usb/gadget/omap_udc.c @@ -22,7 +22,6 @@ #undef DEBUG #undef VERBOSE -#include #include #include #include @@ -773,7 +772,7 @@ static void dma_error(int lch, u16 ch_status, void *data) struct omap_ep *ep = data; /* if ch_status & OMAP_DMA_DROP_IRQ ... */ - /* if ch_status & OMAP_DMA_TOUT_IRQ ... */ + /* if ch_status & OMAP1_DMA_TOUT_IRQ ... */ ERR("%s dma error, lch %d status %02x\n", ep->ep.name, lch, ch_status); /* complete current transfer ... */ @@ -2819,7 +2818,7 @@ bad_on_1710: /* USB general purpose IRQ: ep0, state changes, dma, etc */ status = request_irq(pdev->resource[1].start, omap_udc_irq, - SA_SAMPLE_RANDOM, driver_name, udc); + IRQF_SAMPLE_RANDOM, driver_name, udc); if (status != 0) { ERR( "can't get irq %ld, err %d\n", pdev->resource[1].start, status); @@ -2828,7 +2827,7 @@ bad_on_1710: /* USB "non-iso" IRQ (PIO for all but ep0) */ status = request_irq(pdev->resource[2].start, omap_udc_pio_irq, - SA_SAMPLE_RANDOM, "omap_udc pio", udc); + IRQF_SAMPLE_RANDOM, "omap_udc pio", udc); if (status != 0) { ERR( "can't get irq %ld, err %d\n", pdev->resource[2].start, status); @@ -2836,7 +2835,7 @@ bad_on_1710: } #ifdef USE_ISO status = request_irq(pdev->resource[3].start, omap_udc_iso_irq, - SA_INTERRUPT, "omap_udc iso", udc); + IRQF_DISABLED, "omap_udc iso", udc); if (status != 0) { ERR("can't get irq %ld, err %d\n", pdev->resource[3].start, status); @@ -2870,7 +2869,7 @@ cleanup0: static int __exit omap_udc_remove(struct platform_device *pdev) { - DECLARE_COMPLETION(done); + DECLARE_COMPLETION_ONSTACK(done); if (!udc) return -ENODEV; diff --git a/drivers/usb/gadget/pxa2xx_udc.c b/drivers/usb/gadget/pxa2xx_udc.c index 680f7fc5b..fff027d30 100644 --- a/drivers/usb/gadget/pxa2xx_udc.c +++ b/drivers/usb/gadget/pxa2xx_udc.c @@ -27,7 +27,6 @@ #undef DEBUG // #define VERBOSE DBG_VERBOSE -#include #include #include #include @@ -53,7 +52,9 @@ #include #include #include +#ifdef CONFIG_ARCH_PXA #include +#endif #include #include @@ -545,6 +546,7 @@ write_ep0_fifo (struct pxa2xx_ep *ep, struct pxa2xx_request *req) count = req->req.length; done (ep, req, 0); ep0_idle(ep->dev); +#ifndef CONFIG_ARCH_IXP4XX #if 1 /* This seems to get rid of lost status irqs in some cases: * host responds quickly, or next request involves config @@ -564,6 +566,7 @@ write_ep0_fifo (struct pxa2xx_ep *ep, struct pxa2xx_request *req) udelay(1); } while (count); } +#endif #endif } else if (ep->dev->req_pending) ep0start(ep->dev, 0, "IN"); @@ -1585,7 +1588,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) int retval; if (!driver - || driver->speed != USB_SPEED_FULL + || driver->speed < USB_SPEED_FULL || !driver->bind || !driver->unbind || !driver->disconnect @@ -2427,6 +2430,7 @@ static struct pxa2xx_udc memory = { #define PXA210_B1 0x00000123 #define PXA210_B0 0x00000122 #define IXP425_A0 0x000001c1 +#define IXP465_AD 0x00000200 /* * probe - binds to the platform device @@ -2463,6 +2467,8 @@ static int __init pxa2xx_udc_probe(struct platform_device *pdev) break; #elif defined(CONFIG_ARCH_IXP4XX) case IXP425_A0: + case IXP465_AD: + dev->has_cfr = 1; out_dma = 0; break; #endif @@ -2515,7 +2521,7 @@ static int __init pxa2xx_udc_probe(struct platform_device *pdev) /* irq setup after old hardware state is cleaned up */ retval = request_irq(IRQ_USB, pxa2xx_udc_irq, - SA_INTERRUPT, driver_name, dev); + IRQF_DISABLED, driver_name, dev); if (retval != 0) { printk(KERN_ERR "%s: can't get irq %i, err %d\n", driver_name, IRQ_USB, retval); @@ -2527,7 +2533,7 @@ static int __init pxa2xx_udc_probe(struct platform_device *pdev) if (machine_is_lubbock()) { retval = request_irq(LUBBOCK_USB_DISC_IRQ, lubbock_vbus_irq, - SA_INTERRUPT | SA_SAMPLE_RANDOM, + IRQF_DISABLED | IRQF_SAMPLE_RANDOM, driver_name, dev); if (retval != 0) { printk(KERN_ERR "%s: can't get irq %i, err %d\n", @@ -2538,7 +2544,7 @@ lubbock_fail0: } retval = request_irq(LUBBOCK_USB_IRQ, lubbock_vbus_irq, - SA_INTERRUPT | SA_SAMPLE_RANDOM, + IRQF_DISABLED | IRQF_SAMPLE_RANDOM, driver_name, dev); if (retval != 0) { printk(KERN_ERR "%s: can't get irq %i, err %d\n", @@ -2575,10 +2581,12 @@ static int __exit pxa2xx_udc_remove(struct platform_device *pdev) free_irq(IRQ_USB, dev); dev->got_irq = 0; } +#ifdef CONFIG_ARCH_LUBBOCK if (machine_is_lubbock()) { free_irq(LUBBOCK_USB_DISC_IRQ, dev); free_irq(LUBBOCK_USB_IRQ, dev); } +#endif platform_set_drvdata(pdev, NULL); the_controller = NULL; return 0; diff --git a/drivers/usb/gadget/rndis.c b/drivers/usb/gadget/rndis.c index 6d6eaad73..408c3380d 100644 --- a/drivers/usb/gadget/rndis.c +++ b/drivers/usb/gadget/rndis.c @@ -1,29 +1,28 @@ -/* +/* * RNDIS MSG parser - * + * * Version: $Id: rndis.c,v 1.19 2004/03/25 21:33:46 robert Exp $ - * + * * Authors: Benedikt Spranger, Pengutronix - * Robert Schwebel, Pengutronix - * + * Robert Schwebel, Pengutronix + * * 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. - * + * version 2, as published by the Free Software Foundation. + * * This software was originally developed in conformance with * Microsoft's Remote NDIS Specification License Agreement. - * + * * 03/12/2004 Kai-Uwe Bloem * Fixed message length bug in init_response - * + * * 03/25/2004 Kai-Uwe Bloem - * Fixed rndis_rm_hdr length bug. + * Fixed rndis_rm_hdr length bug. * * Copyright (C) 2004 by David Brownell * updates to merge with Linux 2.6, better match RNDIS spec */ -#include #include #include #include @@ -82,7 +81,7 @@ static rndis_resp_t *rndis_add_response (int configNr, u32 length); /* supported OIDs */ -static const u32 oid_supported_list [] = +static const u32 oid_supported_list [] = { /* the general stuff */ OID_GEN_SUPPORTED_LIST, @@ -103,7 +102,7 @@ static const u32 oid_supported_list [] = #if 0 OID_GEN_RNDIS_CONFIG_PARAMETER, #endif - + /* the statistical stuff */ OID_GEN_XMIT_OK, OID_GEN_RCV_OK, @@ -127,14 +126,14 @@ static const u32 oid_supported_list [] = OID_GEN_TRANSMIT_QUEUE_LENGTH, #endif /* RNDIS_OPTIONAL_STATS */ - /* mandatory 802.3 */ + /* mandatory 802.3 */ /* the general stuff */ OID_802_3_PERMANENT_ADDRESS, OID_802_3_CURRENT_ADDRESS, OID_802_3_MULTICAST_LIST, OID_802_3_MAC_OPTIONS, OID_802_3_MAXIMUM_LIST_SIZE, - + /* the statistical stuff */ OID_802_3_RCV_ERROR_ALIGNMENT, OID_802_3_XMIT_ONE_COLLISION, @@ -172,8 +171,8 @@ static int gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, rndis_resp_t *r) { - int retval = -ENOTSUPP; - u32 length = 4; /* usually */ + int retval = -ENOTSUPP; + u32 length = 4; /* usually */ __le32 *outbuf; int i, count; rndis_query_cmplt_type *resp; @@ -211,27 +210,27 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, outbuf[i] = cpu_to_le32 (oid_supported_list[i]); retval = 0; break; - + /* mandatory */ case OID_GEN_HARDWARE_STATUS: DEBUG("%s: OID_GEN_HARDWARE_STATUS\n", __FUNCTION__); - /* Bogus question! + /* Bogus question! * Hardware must be ready to receive high level protocols. - * BTW: + * BTW: * reddite ergo quae sunt Caesaris Caesari * et quae sunt Dei Deo! */ *outbuf = __constant_cpu_to_le32 (0); retval = 0; break; - + /* mandatory */ case OID_GEN_MEDIA_SUPPORTED: DEBUG("%s: OID_GEN_MEDIA_SUPPORTED\n", __FUNCTION__); *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr].medium); retval = 0; break; - + /* mandatory */ case OID_GEN_MEDIA_IN_USE: DEBUG("%s: OID_GEN_MEDIA_IN_USE\n", __FUNCTION__); @@ -239,7 +238,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr].medium); retval = 0; break; - + /* mandatory */ case OID_GEN_MAXIMUM_FRAME_SIZE: DEBUG("%s: OID_GEN_MAXIMUM_FRAME_SIZE\n", __FUNCTION__); @@ -249,7 +248,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, retval = 0; } break; - + /* mandatory */ case OID_GEN_LINK_SPEED: if (rndis_debug > 1) @@ -272,7 +271,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, retval = 0; } break; - + /* mandatory */ case OID_GEN_RECEIVE_BLOCK_SIZE: DEBUG("%s: OID_GEN_RECEIVE_BLOCK_SIZE\n", __FUNCTION__); @@ -282,7 +281,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, retval = 0; } break; - + /* mandatory */ case OID_GEN_VENDOR_ID: DEBUG("%s: OID_GEN_VENDOR_ID\n", __FUNCTION__); @@ -290,7 +289,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, rndis_per_dev_params [configNr].vendorID); retval = 0; break; - + /* mandatory */ case OID_GEN_VENDOR_DESCRIPTION: DEBUG("%s: OID_GEN_VENDOR_DESCRIPTION\n", __FUNCTION__); @@ -356,7 +355,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, DEBUG("%s: OID_GEN_XMIT_OK\n", __FUNCTION__); if (rndis_per_dev_params [configNr].stats) { *outbuf = cpu_to_le32 ( - rndis_per_dev_params [configNr].stats->tx_packets - + rndis_per_dev_params [configNr].stats->tx_packets - rndis_per_dev_params [configNr].stats->tx_errors - rndis_per_dev_params [configNr].stats->tx_dropped); retval = 0; @@ -369,13 +368,13 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, DEBUG("%s: OID_GEN_RCV_OK\n", __FUNCTION__); if (rndis_per_dev_params [configNr].stats) { *outbuf = cpu_to_le32 ( - rndis_per_dev_params [configNr].stats->rx_packets - + rndis_per_dev_params [configNr].stats->rx_packets - rndis_per_dev_params [configNr].stats->rx_errors - rndis_per_dev_params [configNr].stats->rx_dropped); retval = 0; } break; - + /* mandatory */ case OID_GEN_XMIT_ERROR: if (rndis_debug > 1) @@ -386,7 +385,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, retval = 0; } break; - + /* mandatory */ case OID_GEN_RCV_ERROR: if (rndis_debug > 1) @@ -397,7 +396,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, retval = 0; } break; - + /* mandatory */ case OID_GEN_RCV_NO_BUFFER: DEBUG("%s: OID_GEN_RCV_NO_BUFFER\n", __FUNCTION__); @@ -411,7 +410,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, #ifdef RNDIS_OPTIONAL_STATS case OID_GEN_DIRECTED_BYTES_XMIT: DEBUG("%s: OID_GEN_DIRECTED_BYTES_XMIT\n", __FUNCTION__); - /* + /* * Aunt Tilly's size of shoes * minus antarctica count of penguins * divided by weight of Alpha Centauri @@ -419,7 +418,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, if (rndis_per_dev_params [configNr].stats) { *outbuf = cpu_to_le32 ( (rndis_per_dev_params [configNr] - .stats->tx_packets - + .stats->tx_packets - rndis_per_dev_params [configNr] .stats->tx_errors - rndis_per_dev_params [configNr] @@ -428,14 +427,14 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, retval = 0; } break; - + case OID_GEN_DIRECTED_FRAMES_XMIT: DEBUG("%s: OID_GEN_DIRECTED_FRAMES_XMIT\n", __FUNCTION__); /* dito */ if (rndis_per_dev_params [configNr].stats) { *outbuf = cpu_to_le32 ( (rndis_per_dev_params [configNr] - .stats->tx_packets - + .stats->tx_packets - rndis_per_dev_params [configNr] .stats->tx_errors - rndis_per_dev_params [configNr] @@ -444,7 +443,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, retval = 0; } break; - + case OID_GEN_MULTICAST_BYTES_XMIT: DEBUG("%s: OID_GEN_MULTICAST_BYTES_XMIT\n", __FUNCTION__); if (rndis_per_dev_params [configNr].stats) { @@ -453,7 +452,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, retval = 0; } break; - + case OID_GEN_MULTICAST_FRAMES_XMIT: DEBUG("%s: OID_GEN_MULTICAST_FRAMES_XMIT\n", __FUNCTION__); if (rndis_per_dev_params [configNr].stats) { @@ -462,7 +461,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, retval = 0; } break; - + case OID_GEN_BROADCAST_BYTES_XMIT: DEBUG("%s: OID_GEN_BROADCAST_BYTES_XMIT\n", __FUNCTION__); if (rndis_per_dev_params [configNr].stats) { @@ -471,7 +470,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, retval = 0; } break; - + case OID_GEN_BROADCAST_FRAMES_XMIT: DEBUG("%s: OID_GEN_BROADCAST_FRAMES_XMIT\n", __FUNCTION__); if (rndis_per_dev_params [configNr].stats) { @@ -480,19 +479,19 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, retval = 0; } break; - + case OID_GEN_DIRECTED_BYTES_RCV: DEBUG("%s: OID_GEN_DIRECTED_BYTES_RCV\n", __FUNCTION__); *outbuf = __constant_cpu_to_le32 (0); retval = 0; break; - + case OID_GEN_DIRECTED_FRAMES_RCV: DEBUG("%s: OID_GEN_DIRECTED_FRAMES_RCV\n", __FUNCTION__); *outbuf = __constant_cpu_to_le32 (0); retval = 0; break; - + case OID_GEN_MULTICAST_BYTES_RCV: DEBUG("%s: OID_GEN_MULTICAST_BYTES_RCV\n", __FUNCTION__); if (rndis_per_dev_params [configNr].stats) { @@ -501,7 +500,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, retval = 0; } break; - + case OID_GEN_MULTICAST_FRAMES_RCV: DEBUG("%s: OID_GEN_MULTICAST_FRAMES_RCV\n", __FUNCTION__); if (rndis_per_dev_params [configNr].stats) { @@ -510,7 +509,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, retval = 0; } break; - + case OID_GEN_BROADCAST_BYTES_RCV: DEBUG("%s: OID_GEN_BROADCAST_BYTES_RCV\n", __FUNCTION__); if (rndis_per_dev_params [configNr].stats) { @@ -519,7 +518,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, retval = 0; } break; - + case OID_GEN_BROADCAST_FRAMES_RCV: DEBUG("%s: OID_GEN_BROADCAST_FRAMES_RCV\n", __FUNCTION__); if (rndis_per_dev_params [configNr].stats) { @@ -528,7 +527,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, retval = 0; } break; - + case OID_GEN_RCV_CRC_ERROR: DEBUG("%s: OID_GEN_RCV_CRC_ERROR\n", __FUNCTION__); if (rndis_per_dev_params [configNr].stats) { @@ -537,7 +536,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, retval = 0; } break; - + case OID_GEN_TRANSMIT_QUEUE_LENGTH: DEBUG("%s: OID_GEN_TRANSMIT_QUEUE_LENGTH\n", __FUNCTION__); *outbuf = __constant_cpu_to_le32 (0); @@ -558,7 +557,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, retval = 0; } break; - + /* mandatory */ case OID_802_3_CURRENT_ADDRESS: DEBUG("%s: OID_802_3_CURRENT_ADDRESS\n", __FUNCTION__); @@ -570,7 +569,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, retval = 0; } break; - + /* mandatory */ case OID_802_3_MULTICAST_LIST: DEBUG("%s: OID_802_3_MULTICAST_LIST\n", __FUNCTION__); @@ -578,7 +577,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, *outbuf = __constant_cpu_to_le32 (0xE0000000); retval = 0; break; - + /* mandatory */ case OID_802_3_MAXIMUM_LIST_SIZE: DEBUG("%s: OID_802_3_MAXIMUM_LIST_SIZE\n", __FUNCTION__); @@ -586,7 +585,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, *outbuf = __constant_cpu_to_le32 (1); retval = 0; break; - + case OID_802_3_MAC_OPTIONS: DEBUG("%s: OID_802_3_MAC_OPTIONS\n", __FUNCTION__); break; @@ -602,56 +601,56 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, retval = 0; } break; - + /* mandatory */ case OID_802_3_XMIT_ONE_COLLISION: DEBUG("%s: OID_802_3_XMIT_ONE_COLLISION\n", __FUNCTION__); *outbuf = __constant_cpu_to_le32 (0); retval = 0; break; - + /* mandatory */ case OID_802_3_XMIT_MORE_COLLISIONS: DEBUG("%s: OID_802_3_XMIT_MORE_COLLISIONS\n", __FUNCTION__); *outbuf = __constant_cpu_to_le32 (0); retval = 0; break; - + #ifdef RNDIS_OPTIONAL_STATS case OID_802_3_XMIT_DEFERRED: DEBUG("%s: OID_802_3_XMIT_DEFERRED\n", __FUNCTION__); /* TODO */ break; - + case OID_802_3_XMIT_MAX_COLLISIONS: DEBUG("%s: OID_802_3_XMIT_MAX_COLLISIONS\n", __FUNCTION__); /* TODO */ break; - + case OID_802_3_RCV_OVERRUN: DEBUG("%s: OID_802_3_RCV_OVERRUN\n", __FUNCTION__); /* TODO */ break; - + case OID_802_3_XMIT_UNDERRUN: DEBUG("%s: OID_802_3_XMIT_UNDERRUN\n", __FUNCTION__); /* TODO */ break; - + case OID_802_3_XMIT_HEARTBEAT_FAILURE: DEBUG("%s: OID_802_3_XMIT_HEARTBEAT_FAILURE\n", __FUNCTION__); /* TODO */ break; - + case OID_802_3_XMIT_TIMES_CRS_LOST: DEBUG("%s: OID_802_3_XMIT_TIMES_CRS_LOST\n", __FUNCTION__); /* TODO */ break; - + case OID_802_3_XMIT_LATE_COLLISIONS: DEBUG("%s: OID_802_3_XMIT_LATE_COLLISIONS\n", __FUNCTION__); /* TODO */ - break; + break; #endif /* RNDIS_OPTIONAL_STATS */ #ifdef RNDIS_PM @@ -676,23 +675,23 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, #endif default: - printk (KERN_WARNING "%s: query unknown OID 0x%08X\n", + printk (KERN_WARNING "%s: query unknown OID 0x%08X\n", __FUNCTION__, OID); } if (retval < 0) length = 0; - + resp->InformationBufferLength = cpu_to_le32 (length); r->length = length + sizeof *resp; resp->MessageLength = cpu_to_le32 (r->length); return retval; } -static int gen_ndis_set_resp (u8 configNr, u32 OID, u8 *buf, u32 buf_len, - rndis_resp_t *r) +static int gen_ndis_set_resp (u8 configNr, u32 OID, u8 *buf, u32 buf_len, + rndis_resp_t *r) { rndis_set_cmplt_type *resp; - int i, retval = -ENOTSUPP; + int i, retval = -ENOTSUPP; struct rndis_params *params; if (!r) @@ -745,9 +744,9 @@ update_linkstate: netif_stop_queue (params->dev); } break; - + case OID_802_3_MULTICAST_LIST: - /* I think we can ignore this */ + /* I think we can ignore this */ DEBUG("%s: OID_802_3_MULTICAST_LIST\n", __FUNCTION__); retval = 0; break; @@ -796,29 +795,29 @@ update_linkstate: #endif /* RNDIS_PM */ default: - printk (KERN_WARNING "%s: set unknown OID 0x%08X, size %d\n", + printk (KERN_WARNING "%s: set unknown OID 0x%08X, size %d\n", __FUNCTION__, OID, buf_len); } - + return retval; } -/* - * Response Functions +/* + * Response Functions */ static int rndis_init_response (int configNr, rndis_init_msg_type *buf) { - rndis_init_cmplt_type *resp; + rndis_init_cmplt_type *resp; rndis_resp_t *r; - + if (!rndis_per_dev_params [configNr].dev) return -ENOTSUPP; - + r = rndis_add_response (configNr, sizeof (rndis_init_cmplt_type)); if (!r) return -ENOMEM; resp = (rndis_init_cmplt_type *) r->buf; - + resp->MessageType = __constant_cpu_to_le32 ( REMOTE_NDIS_INITIALIZE_CMPLT); resp->MessageLength = __constant_cpu_to_le32 (52); @@ -837,11 +836,11 @@ static int rndis_init_response (int configNr, rndis_init_msg_type *buf) resp->PacketAlignmentFactor = __constant_cpu_to_le32 (0); resp->AFListOffset = __constant_cpu_to_le32 (0); resp->AFListSize = __constant_cpu_to_le32 (0); - + if (rndis_per_dev_params [configNr].ack) - rndis_per_dev_params [configNr].ack ( - rndis_per_dev_params [configNr].dev); - + rndis_per_dev_params [configNr].ack ( + rndis_per_dev_params [configNr].dev); + return 0; } @@ -849,10 +848,10 @@ static int rndis_query_response (int configNr, rndis_query_msg_type *buf) { rndis_query_cmplt_type *resp; rndis_resp_t *r; - + // DEBUG("%s: OID = %08X\n", __FUNCTION__, cpu_to_le32(buf->OID)); if (!rndis_per_dev_params [configNr].dev) return -ENOTSUPP; - + /* * we need more memory: * gen_ndis_query_resp expects enough space for @@ -864,10 +863,10 @@ static int rndis_query_response (int configNr, rndis_query_msg_type *buf) if (!r) return -ENOMEM; resp = (rndis_query_cmplt_type *) r->buf; - + resp->MessageType = __constant_cpu_to_le32 (REMOTE_NDIS_QUERY_CMPLT); resp->RequestID = buf->RequestID; /* Still LE in msg buffer */ - + if (gen_ndis_query_resp (configNr, le32_to_cpu (buf->OID), le32_to_cpu(buf->InformationBufferOffset) + 8 + (u8 *) buf, @@ -881,10 +880,10 @@ static int rndis_query_response (int configNr, rndis_query_msg_type *buf) resp->InformationBufferOffset = __constant_cpu_to_le32 (0); } else resp->Status = __constant_cpu_to_le32 (RNDIS_STATUS_SUCCESS); - + if (rndis_per_dev_params [configNr].ack) - rndis_per_dev_params [configNr].ack ( - rndis_per_dev_params [configNr].dev); + rndis_per_dev_params [configNr].ack ( + rndis_per_dev_params [configNr].dev); return 0; } @@ -893,7 +892,7 @@ static int rndis_set_response (int configNr, rndis_set_msg_type *buf) u32 BufLength, BufOffset; rndis_set_cmplt_type *resp; rndis_resp_t *r; - + r = rndis_add_response (configNr, sizeof (rndis_set_cmplt_type)); if (!r) return -ENOMEM; @@ -906,26 +905,27 @@ static int rndis_set_response (int configNr, rndis_set_msg_type *buf) DEBUG("%s: Length: %d\n", __FUNCTION__, BufLength); DEBUG("%s: Offset: %d\n", __FUNCTION__, BufOffset); DEBUG("%s: InfoBuffer: ", __FUNCTION__); - + for (i = 0; i < BufLength; i++) { DEBUG ("%02x ", *(((u8 *) buf) + i + 8 + BufOffset)); } - + DEBUG ("\n"); #endif - + resp->MessageType = __constant_cpu_to_le32 (REMOTE_NDIS_SET_CMPLT); resp->MessageLength = __constant_cpu_to_le32 (16); resp->RequestID = buf->RequestID; /* Still LE in msg buffer */ - if (gen_ndis_set_resp (configNr, le32_to_cpu (buf->OID), - ((u8 *) buf) + 8 + BufOffset, BufLength, r)) - resp->Status = __constant_cpu_to_le32 (RNDIS_STATUS_NOT_SUPPORTED); - else resp->Status = __constant_cpu_to_le32 (RNDIS_STATUS_SUCCESS); - + if (gen_ndis_set_resp (configNr, le32_to_cpu (buf->OID), + ((u8 *) buf) + 8 + BufOffset, BufLength, r)) + resp->Status = __constant_cpu_to_le32 (RNDIS_STATUS_NOT_SUPPORTED); + else + resp->Status = __constant_cpu_to_le32 (RNDIS_STATUS_SUCCESS); + if (rndis_per_dev_params [configNr].ack) - rndis_per_dev_params [configNr].ack ( - rndis_per_dev_params [configNr].dev); - + rndis_per_dev_params [configNr].ack ( + rndis_per_dev_params [configNr].dev); + return 0; } @@ -933,27 +933,27 @@ static int rndis_reset_response (int configNr, rndis_reset_msg_type *buf) { rndis_reset_cmplt_type *resp; rndis_resp_t *r; - + r = rndis_add_response (configNr, sizeof (rndis_reset_cmplt_type)); if (!r) return -ENOMEM; resp = (rndis_reset_cmplt_type *) r->buf; - + resp->MessageType = __constant_cpu_to_le32 (REMOTE_NDIS_RESET_CMPLT); resp->MessageLength = __constant_cpu_to_le32 (16); resp->Status = __constant_cpu_to_le32 (RNDIS_STATUS_SUCCESS); /* resent information */ resp->AddressingReset = __constant_cpu_to_le32 (1); - + if (rndis_per_dev_params [configNr].ack) - rndis_per_dev_params [configNr].ack ( - rndis_per_dev_params [configNr].dev); + rndis_per_dev_params [configNr].ack ( + rndis_per_dev_params [configNr].dev); return 0; } static int rndis_keepalive_response (int configNr, - rndis_keepalive_msg_type *buf) + rndis_keepalive_msg_type *buf) { rndis_keepalive_cmplt_type *resp; rndis_resp_t *r; @@ -964,48 +964,48 @@ static int rndis_keepalive_response (int configNr, if (!r) return -ENOMEM; resp = (rndis_keepalive_cmplt_type *) r->buf; - + resp->MessageType = __constant_cpu_to_le32 ( REMOTE_NDIS_KEEPALIVE_CMPLT); resp->MessageLength = __constant_cpu_to_le32 (16); resp->RequestID = buf->RequestID; /* Still LE in msg buffer */ resp->Status = __constant_cpu_to_le32 (RNDIS_STATUS_SUCCESS); - + if (rndis_per_dev_params [configNr].ack) - rndis_per_dev_params [configNr].ack ( - rndis_per_dev_params [configNr].dev); - + rndis_per_dev_params [configNr].ack ( + rndis_per_dev_params [configNr].dev); + return 0; } -/* - * Device to Host Comunication +/* + * Device to Host Comunication */ static int rndis_indicate_status_msg (int configNr, u32 status) { - rndis_indicate_status_msg_type *resp; + rndis_indicate_status_msg_type *resp; rndis_resp_t *r; - + if (rndis_per_dev_params [configNr].state == RNDIS_UNINITIALIZED) - return -ENOTSUPP; - - r = rndis_add_response (configNr, + return -ENOTSUPP; + + r = rndis_add_response (configNr, sizeof (rndis_indicate_status_msg_type)); if (!r) return -ENOMEM; resp = (rndis_indicate_status_msg_type *) r->buf; - + resp->MessageType = __constant_cpu_to_le32 ( REMOTE_NDIS_INDICATE_STATUS_MSG); resp->MessageLength = __constant_cpu_to_le32 (20); resp->Status = cpu_to_le32 (status); resp->StatusBufferLength = __constant_cpu_to_le32 (0); resp->StatusBufferOffset = __constant_cpu_to_le32 (0); - - if (rndis_per_dev_params [configNr].ack) - rndis_per_dev_params [configNr].ack ( - rndis_per_dev_params [configNr].dev); + + if (rndis_per_dev_params [configNr].ack) + rndis_per_dev_params [configNr].ack ( + rndis_per_dev_params [configNr].dev); return 0; } @@ -1013,7 +1013,7 @@ int rndis_signal_connect (int configNr) { rndis_per_dev_params [configNr].media_state = NDIS_MEDIA_STATE_CONNECTED; - return rndis_indicate_status_msg (configNr, + return rndis_indicate_status_msg (configNr, RNDIS_STATUS_MEDIA_CONNECT); } @@ -1045,26 +1045,26 @@ void rndis_set_host_mac (int configNr, const u8 *addr) rndis_per_dev_params [configNr].host_mac = addr; } -/* - * Message Parser +/* + * Message Parser */ int rndis_msg_parser (u8 configNr, u8 *buf) { u32 MsgType, MsgLength; __le32 *tmp; struct rndis_params *params; - + if (!buf) return -ENOMEM; - - tmp = (__le32 *) buf; + + tmp = (__le32 *) buf; MsgType = le32_to_cpup(tmp++); MsgLength = le32_to_cpup(tmp++); - + if (configNr >= RNDIS_MAX_CONFIGS) return -ENOTSUPP; params = &rndis_per_dev_params [configNr]; - + /* NOTE: RNDIS is *EXTREMELY* chatty ... Windows constantly polls for * rx/tx statistics and link status, in addition to KEEPALIVE traffic * and normal HC level polling to see if there's any IN traffic. @@ -1073,12 +1073,12 @@ int rndis_msg_parser (u8 configNr, u8 *buf) /* For USB: responses may take up to 10 seconds */ switch (MsgType) { case REMOTE_NDIS_INITIALIZE_MSG: - DEBUG("%s: REMOTE_NDIS_INITIALIZE_MSG\n", + DEBUG("%s: REMOTE_NDIS_INITIALIZE_MSG\n", __FUNCTION__ ); params->state = RNDIS_INITIALIZED; return rndis_init_response (configNr, - (rndis_init_msg_type *) buf); - + (rndis_init_msg_type *) buf); + case REMOTE_NDIS_HALT_MSG: DEBUG("%s: REMOTE_NDIS_HALT_MSG\n", __FUNCTION__ ); @@ -1088,37 +1088,37 @@ int rndis_msg_parser (u8 configNr, u8 *buf) netif_stop_queue (params->dev); } return 0; - + case REMOTE_NDIS_QUERY_MSG: - return rndis_query_response (configNr, - (rndis_query_msg_type *) buf); - + return rndis_query_response (configNr, + (rndis_query_msg_type *) buf); + case REMOTE_NDIS_SET_MSG: - return rndis_set_response (configNr, - (rndis_set_msg_type *) buf); - + return rndis_set_response (configNr, + (rndis_set_msg_type *) buf); + case REMOTE_NDIS_RESET_MSG: - DEBUG("%s: REMOTE_NDIS_RESET_MSG\n", + DEBUG("%s: REMOTE_NDIS_RESET_MSG\n", __FUNCTION__ ); return rndis_reset_response (configNr, - (rndis_reset_msg_type *) buf); + (rndis_reset_msg_type *) buf); case REMOTE_NDIS_KEEPALIVE_MSG: /* For USB: host does this every 5 seconds */ if (rndis_debug > 1) - DEBUG("%s: REMOTE_NDIS_KEEPALIVE_MSG\n", + DEBUG("%s: REMOTE_NDIS_KEEPALIVE_MSG\n", __FUNCTION__ ); return rndis_keepalive_response (configNr, - (rndis_keepalive_msg_type *) + (rndis_keepalive_msg_type *) buf); - - default: + + default: /* At least Windows XP emits some undefined RNDIS messages. * In one case those messages seemed to relate to the host * suspending itself. */ printk (KERN_WARNING - "%s: unknown RNDIS message 0x%08X len %d\n", + "%s: unknown RNDIS message 0x%08X len %d\n", __FUNCTION__ , MsgType, MsgLength); { unsigned i; @@ -1142,14 +1142,14 @@ int rndis_msg_parser (u8 configNr, u8 *buf) } break; } - + return -ENOTSUPP; } int rndis_register (int (* rndis_control_ack) (struct net_device *)) { u8 i; - + for (i = 0; i < RNDIS_MAX_CONFIGS; i++) { if (!rndis_per_dev_params [i].used) { rndis_per_dev_params [i].used = 1; @@ -1159,32 +1159,32 @@ int rndis_register (int (* rndis_control_ack) (struct net_device *)) } } DEBUG("failed\n"); - + return -1; } void rndis_deregister (int configNr) { DEBUG("%s: \n", __FUNCTION__ ); - + if (configNr >= RNDIS_MAX_CONFIGS) return; rndis_per_dev_params [configNr].used = 0; - + return; } -int rndis_set_param_dev (u8 configNr, struct net_device *dev, +int rndis_set_param_dev (u8 configNr, struct net_device *dev, struct net_device_stats *stats, u16 *cdc_filter) { DEBUG("%s:\n", __FUNCTION__ ); if (!dev || !stats) return -1; if (configNr >= RNDIS_MAX_CONFIGS) return -1; - + rndis_per_dev_params [configNr].dev = dev; rndis_per_dev_params [configNr].stats = stats; rndis_per_dev_params [configNr].filter = cdc_filter; - + return 0; } @@ -1193,10 +1193,10 @@ int rndis_set_param_vendor (u8 configNr, u32 vendorID, const char *vendorDescr) DEBUG("%s:\n", __FUNCTION__ ); if (!vendorDescr) return -1; if (configNr >= RNDIS_MAX_CONFIGS) return -1; - + rndis_per_dev_params [configNr].vendorID = vendorID; rndis_per_dev_params [configNr].vendorDescr = vendorDescr; - + return 0; } @@ -1204,10 +1204,10 @@ int rndis_set_param_medium (u8 configNr, u32 medium, u32 speed) { DEBUG("%s: %u %u\n", __FUNCTION__, medium, speed); if (configNr >= RNDIS_MAX_CONFIGS) return -1; - + rndis_per_dev_params [configNr].medium = medium; rndis_per_dev_params [configNr].speed = speed; - + return 0; } @@ -1229,9 +1229,9 @@ void rndis_free_response (int configNr, u8 *buf) { rndis_resp_t *r; struct list_head *act, *tmp; - - list_for_each_safe (act, tmp, - &(rndis_per_dev_params [configNr].resp_queue)) + + list_for_each_safe (act, tmp, + &(rndis_per_dev_params [configNr].resp_queue)) { r = list_entry (act, rndis_resp_t, list); if (r && r->buf == buf) { @@ -1244,12 +1244,12 @@ void rndis_free_response (int configNr, u8 *buf) u8 *rndis_get_next_response (int configNr, u32 *length) { rndis_resp_t *r; - struct list_head *act, *tmp; - + struct list_head *act, *tmp; + if (!length) return NULL; - - list_for_each_safe (act, tmp, - &(rndis_per_dev_params [configNr].resp_queue)) + + list_for_each_safe (act, tmp, + &(rndis_per_dev_params [configNr].resp_queue)) { r = list_entry (act, rndis_resp_t, list); if (!r->send) { @@ -1258,24 +1258,24 @@ u8 *rndis_get_next_response (int configNr, u32 *length) return r->buf; } } - + return NULL; } static rndis_resp_t *rndis_add_response (int configNr, u32 length) { rndis_resp_t *r; - + /* NOTE: this gets copied into ether.c USB_BUFSIZ bytes ... */ r = kmalloc (sizeof (rndis_resp_t) + length, GFP_ATOMIC); if (!r) return NULL; - + r->buf = (u8 *) (r + 1); r->length = length; r->send = 0; - - list_add_tail (&r->list, - &(rndis_per_dev_params [configNr].resp_queue)); + + list_add_tail (&r->list, + &(rndis_per_dev_params [configNr].resp_queue)); return r; } @@ -1301,14 +1301,14 @@ int rndis_rm_hdr(struct sk_buff *skb) #ifdef CONFIG_USB_GADGET_DEBUG_FILES -static int rndis_proc_read (char *page, char **start, off_t off, int count, int *eof, - void *data) +static int rndis_proc_read (char *page, char **start, off_t off, int count, int *eof, + void *data) { char *out = page; int len; rndis_params *param = (rndis_params *) data; - - out += snprintf (out, count, + + out += snprintf (out, count, "Config Nr. %d\n" "used : %s\n" "state : %s\n" @@ -1316,8 +1316,8 @@ static int rndis_proc_read (char *page, char **start, off_t off, int count, int "speed : %d\n" "cable : %s\n" "vendor ID : 0x%08X\n" - "vendor : %s\n", - param->confignr, (param->used) ? "y" : "n", + "vendor : %s\n", + param->confignr, (param->used) ? "y" : "n", ({ char *s = "?"; switch (param->state) { case RNDIS_UNINITIALIZED: @@ -1327,32 +1327,32 @@ static int rndis_proc_read (char *page, char **start, off_t off, int count, int case RNDIS_DATA_INITIALIZED: s = "RNDIS_DATA_INITIALIZED"; break; }; s; }), - param->medium, - (param->media_state) ? 0 : param->speed*100, + param->medium, + (param->media_state) ? 0 : param->speed*100, (param->media_state) ? "disconnected" : "connected", - param->vendorID, param->vendorDescr); - + param->vendorID, param->vendorDescr); + len = out - page; len -= off; - + if (len < count) { *eof = 1; if (len <= 0) return 0; } else len = count; - + *start = page + off; return len; } -static int rndis_proc_write (struct file *file, const char __user *buffer, - unsigned long count, void *data) +static int rndis_proc_write (struct file *file, const char __user *buffer, + unsigned long count, void *data) { rndis_params *p = data; u32 speed = 0; int i, fl_speed = 0; - + for (i = 0; i < count; i++) { char c; if (get_user(c, buffer)) @@ -1379,15 +1379,15 @@ static int rndis_proc_write (struct file *file, const char __user *buffer, case 'd': rndis_signal_disconnect(p->confignr); break; - default: + default: if (fl_speed) p->speed = speed; else DEBUG ("%c is not valid\n", c); break; } - + buffer++; } - + return count; } @@ -1398,7 +1398,7 @@ static struct proc_dir_entry *rndis_connect_state [RNDIS_MAX_CONFIGS]; #endif /* CONFIG_USB_GADGET_DEBUG_FILES */ -int __init rndis_init (void) +int __devinit rndis_init (void) { u8 i; @@ -1408,7 +1408,7 @@ int __init rndis_init (void) sprintf (name, NAME_TEMPLATE, i); if (!(rndis_connect_state [i] - = create_proc_entry (name, 0660, NULL))) + = create_proc_entry (name, 0660, NULL))) { DEBUG ("%s :remove entries", __FUNCTION__); while (i) { @@ -1432,7 +1432,7 @@ int __init rndis_init (void) = NDIS_MEDIA_STATE_DISCONNECTED; INIT_LIST_HEAD (&(rndis_per_dev_params [i].resp_queue)); } - + return 0; } @@ -1441,7 +1441,7 @@ void rndis_exit (void) #ifdef CONFIG_USB_GADGET_DEBUG_FILES u8 i; char name [20]; - + for (i = 0; i < RNDIS_MAX_CONFIGS; i++) { sprintf (name, NAME_TEMPLATE, i); remove_proc_entry (name, NULL); diff --git a/drivers/usb/gadget/rndis.h b/drivers/usb/gadget/rndis.h index 95b4c6326..4c3c7259f 100644 --- a/drivers/usb/gadget/rndis.h +++ b/drivers/usb/gadget/rndis.h @@ -1,15 +1,15 @@ -/* +/* * RNDIS Definitions for Remote NDIS - * + * * Version: $Id: rndis.h,v 1.15 2004/03/25 21:33:46 robert Exp $ - * + * * Authors: Benedikt Spranger, Pengutronix - * Robert Schwebel, Pengutronix - * - * This program is free software; you can redistribute it and/or + * Robert Schwebel, Pengutronix + * + * 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. - * + * version 2, as published by the Free Software Foundation. + * * This software was originally developed in conformance with * Microsoft's Remote NDIS Specification License Agreement. */ @@ -34,7 +34,7 @@ #define RNDIS_STATUS_MEDIA_CONNECT 0x4001000BU /* Device connected */ #define RNDIS_STATUS_MEDIA_DISCONNECT 0x4001000CU /* Device disconnected */ /* For all not specified status messages: - * RNDIS_STATUS_Xxx -> NDIS_STATUS_Xxx + * RNDIS_STATUS_Xxx -> NDIS_STATUS_Xxx */ /* Message Set for Connectionless (802.3) Devices */ @@ -69,7 +69,7 @@ #define OID_PNP_ENABLE_WAKE_UP 0xFD010106 -typedef struct rndis_init_msg_type +typedef struct rndis_init_msg_type { __le32 MessageType; __le32 MessageLength; @@ -234,12 +234,12 @@ typedef struct rndis_params const u8 *host_mac; u16 *filter; - struct net_device *dev; + struct net_device *dev; struct net_device_stats *stats; u32 vendorID; const char *vendorDescr; - int (*ack) (struct net_device *); + int (*ack) (struct net_device *); struct list_head resp_queue; } rndis_params; @@ -250,7 +250,7 @@ void rndis_deregister (int configNr); int rndis_set_param_dev (u8 configNr, struct net_device *dev, struct net_device_stats *stats, u16 *cdc_filter); -int rndis_set_param_vendor (u8 configNr, u32 vendorID, +int rndis_set_param_vendor (u8 configNr, u32 vendorID, const char *vendorDescr); int rndis_set_param_medium (u8 configNr, u32 medium, u32 speed); void rndis_add_hdr (struct sk_buff *skb); @@ -264,7 +264,7 @@ int rndis_signal_disconnect (int configNr); int rndis_state (int configNr); extern void rndis_set_host_mac (int configNr, const u8 *addr); -int __init rndis_init (void); +int __devinit rndis_init (void); void rndis_exit (void); #endif /* _LINUX_RNDIS_H */ diff --git a/drivers/usb/gadget/serial.c b/drivers/usb/gadget/serial.c index b992546c3..e762aa19a 100644 --- a/drivers/usb/gadget/serial.c +++ b/drivers/usb/gadget/serial.c @@ -17,7 +17,6 @@ * */ -#include #include #include #include @@ -45,88 +44,16 @@ #include #include -#include +#include #include #include "gadget_chips.h" -/* Wait Cond */ - -#define __wait_cond_interruptible(wq, condition, lock, flags, ret) \ -do { \ - wait_queue_t __wait; \ - init_waitqueue_entry(&__wait, current); \ - \ - add_wait_queue(&wq, &__wait); \ - for (;;) { \ - set_current_state(TASK_INTERRUPTIBLE); \ - if (condition) \ - break; \ - if (!signal_pending(current)) { \ - spin_unlock_irqrestore(lock, flags); \ - schedule(); \ - spin_lock_irqsave(lock, flags); \ - continue; \ - } \ - ret = -ERESTARTSYS; \ - break; \ - } \ - current->state = TASK_RUNNING; \ - remove_wait_queue(&wq, &__wait); \ -} while (0) - -#define wait_cond_interruptible(wq, condition, lock, flags) \ -({ \ - int __ret = 0; \ - if (!(condition)) \ - __wait_cond_interruptible(wq, condition, lock, flags, \ - __ret); \ - __ret; \ -}) - -#define __wait_cond_interruptible_timeout(wq, condition, lock, flags, \ - timeout, ret) \ -do { \ - signed long __timeout = timeout; \ - wait_queue_t __wait; \ - init_waitqueue_entry(&__wait, current); \ - \ - add_wait_queue(&wq, &__wait); \ - for (;;) { \ - set_current_state(TASK_INTERRUPTIBLE); \ - if (__timeout == 0) \ - break; \ - if (condition) \ - break; \ - if (!signal_pending(current)) { \ - spin_unlock_irqrestore(lock, flags); \ - __timeout = schedule_timeout(__timeout); \ - spin_lock_irqsave(lock, flags); \ - continue; \ - } \ - ret = -ERESTARTSYS; \ - break; \ - } \ - current->state = TASK_RUNNING; \ - remove_wait_queue(&wq, &__wait); \ -} while (0) - -#define wait_cond_interruptible_timeout(wq, condition, lock, flags, \ - timeout) \ -({ \ - int __ret = 0; \ - if (!(condition)) \ - __wait_cond_interruptible_timeout(wq, condition, lock, \ - flags, timeout, __ret); \ - __ret; \ -}) - - /* Defines */ -#define GS_VERSION_STR "v2.0" -#define GS_VERSION_NUM 0x0200 +#define GS_VERSION_STR "v2.2" +#define GS_VERSION_NUM 0x0202 #define GS_LONG_NAME "Gadget Serial" #define GS_SHORT_NAME "g_serial" @@ -660,12 +587,11 @@ static int __init gs_module_init(void) gs_tty_driver->owner = THIS_MODULE; gs_tty_driver->driver_name = GS_SHORT_NAME; gs_tty_driver->name = "ttygs"; - gs_tty_driver->devfs_name = "usb/ttygs/"; gs_tty_driver->major = GS_MAJOR; gs_tty_driver->minor_start = GS_MINOR_START; gs_tty_driver->type = TTY_DRIVER_TYPE_SERIAL; gs_tty_driver->subtype = SERIAL_TYPE_NORMAL; - gs_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS; + gs_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV; gs_tty_driver->init_termios = tty_std_termios; gs_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; tty_set_operations(gs_tty_driver, &gs_tty_ops); @@ -843,9 +769,19 @@ exit_unlock_dev: /* * gs_close */ + +#define GS_WRITE_FINISHED_EVENT_SAFELY(p) \ +({ \ + int cond; \ + \ + spin_lock_irq(&(p)->port_lock); \ + cond = !(p)->port_dev || !gs_buf_data_avail((p)->port_write_buf); \ + spin_unlock_irq(&(p)->port_lock); \ + cond; \ +}) + static void gs_close(struct tty_struct *tty, struct file *file) { - unsigned long flags; struct gs_port *port = tty->driver_data; struct semaphore *sem; @@ -859,7 +795,7 @@ static void gs_close(struct tty_struct *tty, struct file *file) sem = &gs_open_close_sem[port->port_num]; down(sem); - spin_lock_irqsave(&port->port_lock, flags); + spin_lock_irq(&port->port_lock); if (port->port_open_count == 0) { printk(KERN_ERR @@ -887,12 +823,11 @@ 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); + spin_unlock_irq(&port->port_lock); + wait_event_interruptible_timeout(port->port_write_wait, + GS_WRITE_FINISHED_EVENT_SAFELY(port), + GS_CLOSE_TIMEOUT * HZ); + spin_lock_irq(&port->port_lock); } /* free disconnected port on final close */ @@ -912,7 +847,7 @@ static void gs_close(struct tty_struct *tty, struct file *file) port->port_num, tty, file); exit: - spin_unlock_irqrestore(&port->port_lock, flags); + spin_unlock_irq(&port->port_lock); up(sem); } @@ -1538,7 +1473,7 @@ autoconf_fail: * Called on module unload. Frees the control request and device * structure. */ -static void __exit gs_unbind(struct usb_gadget *gadget) +static void /* __init_or_exit */ gs_unbind(struct usb_gadget *gadget) { struct gs_dev *dev = get_gadget_data(gadget); diff --git a/drivers/usb/gadget/zero.c b/drivers/usb/gadget/zero.c index 68e3d8f5d..b7018ee48 100644 --- a/drivers/usb/gadget/zero.c +++ b/drivers/usb/gadget/zero.c @@ -62,7 +62,6 @@ #define DEBUG 1 // #define VERBOSE -#include #include #include #include @@ -1122,7 +1121,7 @@ zero_autoresume (unsigned long _dev) /*-------------------------------------------------------------------------*/ -static void __exit +static void /* __init_or_exit */ zero_unbind (struct usb_gadget *gadget) { struct zero_dev *dev = get_gadget_data (gadget); diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index e27b79a3c..b93d71d28 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig @@ -47,12 +47,29 @@ config USB_EHCI_ROOT_HUB_TT controller is needed. It's safe to say "y" even if your controller doesn't support this feature. - This supports the EHCI implementation from TransDimension Inc. + This supports the EHCI implementation that's originally + from ARC, and has since changed hands a few times. + +config USB_EHCI_TT_NEWSCHED + bool "Improved Transaction Translator scheduling (EXPERIMENTAL)" + depends on USB_EHCI_HCD && EXPERIMENTAL + ---help--- + This changes the periodic scheduling code to fill more of the low + and full speed bandwidth available from the Transaction Translator + (TT) in USB 2.0 hubs. Without this, only one transfer will be + issued in each microframe, significantly reducing the number of + periodic low/fullspeed transfers possible. + + If you have multiple periodic low/fullspeed devices connected to a + highspeed USB hub which is connected to a highspeed USB Host + Controller, and some of those devices will not work correctly + (possibly due to "ENOSPC" or "-28" errors), say Y. + + If unsure, say N. config USB_ISP116X_HCD tristate "ISP116X HCD support" depends on USB - default N ---help--- The ISP1160 and ISP1161 chips are USB host controllers. Enable this option if your board has this chip. If unsure, say N. @@ -127,7 +144,6 @@ config USB_UHCI_HCD config USB_SL811_HCD tristate "SL811HS HCD support" depends on USB - default N help The SL811HS is a single-port USB controller that supports either host side or peripheral side roles. Enable this option if your @@ -140,7 +156,6 @@ config USB_SL811_HCD config USB_SL811_CS tristate "CF/PCMCIA support for SL811HS HCD" depends on USB_SL811_HCD && PCMCIA - default N help Wraps a PCMCIA driver around the SL811HS HCD, supporting the RATOC REX-CFU1U CF card (often used with PDAs). If unsure, say N. diff --git a/drivers/usb/host/ehci-au1xxx.c b/drivers/usb/host/ehci-au1xxx.c index 63eadeec1..26ed757d2 100644 --- a/drivers/usb/host/ehci-au1xxx.c +++ b/drivers/usb/host/ehci-au1xxx.c @@ -16,10 +16,6 @@ #include #include -#ifndef CONFIG_SOC_AU1200 -#error "this Alchemy chip doesn't have EHCI" -#else /* Au1200 */ - #define USB_HOST_CONFIG (USB_MSR_BASE + USB_MSR_MCFG) #define USB_MCFG_PFEN (1<<31) #define USB_MCFG_RDCOMB (1<<30) @@ -45,8 +41,6 @@ #endif #define USBH_DISABLE (USB_MCFG_EBMEN | USB_MCFG_EMEMEN) -#endif /* Au1200 */ - extern int usb_disabled(void); /*-------------------------------------------------------------------------*/ @@ -111,9 +105,9 @@ int usb_ehci_au1xxx_probe(const struct hc_driver *driver, /* Au1200 AB USB does not support coherent memory */ if (!(read_c0_prid() & 0xff)) { - pr_info("%s: this is chip revision AB!\n", dev->dev.name); + pr_info("%s: this is chip revision AB!\n", dev->name); pr_info("%s: update your board or re-configure the kernel\n", - dev->dev.name); + dev->name); return -ENODEV; } #endif @@ -152,7 +146,7 @@ int usb_ehci_au1xxx_probe(const struct hc_driver *driver, /* ehci_hcd_init(hcd_to_ehci(hcd)); */ retval = - usb_add_hcd(hcd, dev->resource[1].start, SA_INTERRUPT | SA_SHIRQ); + usb_add_hcd(hcd, dev->resource[1].start, IRQF_DISABLED | IRQF_SHARED); if (retval == 0) return retval; @@ -232,9 +226,8 @@ static const struct hc_driver ehci_au1xxx_hc_driver = { /*-------------------------------------------------------------------------*/ -static int ehci_hcd_au1xxx_drv_probe(struct device *dev) +static int ehci_hcd_au1xxx_drv_probe(struct platform_device *pdev) { - struct platform_device *pdev = to_platform_device(dev); struct usb_hcd *hcd = NULL; int ret; @@ -247,10 +240,9 @@ static int ehci_hcd_au1xxx_drv_probe(struct device *dev) return ret; } -static int ehci_hcd_au1xxx_drv_remove(struct device *dev) +static int ehci_hcd_au1xxx_drv_remove(struct platform_device *pdev) { - struct platform_device *pdev = to_platform_device(dev); - struct usb_hcd *hcd = dev_get_drvdata(dev); + struct usb_hcd *hcd = platform_get_drvdata(pdev); usb_ehci_au1xxx_remove(hcd, pdev); return 0; @@ -272,26 +264,14 @@ static int ehci_hcd_au1xxx_drv_resume(struct device *dev) return 0; } */ -static struct device_driver ehci_hcd_au1xxx_driver = { - .name = "au1xxx-ehci", - .bus = &platform_bus_type, +MODULE_ALIAS("au1xxx-ehci"); +static struct platform_driver ehci_hcd_au1xxx_driver = { .probe = ehci_hcd_au1xxx_drv_probe, .remove = ehci_hcd_au1xxx_drv_remove, /*.suspend = ehci_hcd_au1xxx_drv_suspend, */ /*.resume = ehci_hcd_au1xxx_drv_resume, */ + .driver = { + .name = "au1xxx-ehci", + .bus = &platform_bus_type + } }; - -static int __init ehci_hcd_au1xxx_init(void) -{ - pr_debug(DRIVER_INFO " (Au1xxx)\n"); - - return driver_register(&ehci_hcd_au1xxx_driver); -} - -static void __exit ehci_hcd_au1xxx_cleanup(void) -{ - driver_unregister(&ehci_hcd_au1xxx_driver); -} - -module_init(ehci_hcd_au1xxx_init); -module_exit(ehci_hcd_au1xxx_cleanup); diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c index f985f121a..d030516ed 100644 --- a/drivers/usb/host/ehci-fsl.c +++ b/drivers/usb/host/ehci-fsl.c @@ -121,7 +121,7 @@ int usb_hcd_fsl_probe(const struct hc_driver *driver, temp = in_le32(hcd->regs + 0x1a8); out_le32(hcd->regs + 0x1a8, temp | 0x3); - retval = usb_add_hcd(hcd, irq, SA_SHIRQ); + retval = usb_add_hcd(hcd, irq, IRQF_SHARED); if (retval != 0) goto err4; return retval; @@ -324,43 +324,12 @@ static int ehci_fsl_drv_remove(struct platform_device *pdev) return 0; } -static struct platform_driver ehci_fsl_dr_driver = { - .probe = ehci_fsl_drv_probe, - .remove = ehci_fsl_drv_remove, - .driver = { - .name = "fsl-usb2-dr", - }, -}; +MODULE_ALIAS("fsl-ehci"); -static struct platform_driver ehci_fsl_mph_driver = { +static struct platform_driver ehci_fsl_driver = { .probe = ehci_fsl_drv_probe, .remove = ehci_fsl_drv_remove, .driver = { - .name = "fsl-usb2-mph", + .name = "fsl-ehci", }, }; - -static int __init ehci_fsl_init(void) -{ - int retval; - - 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)); - - retval = platform_driver_register(&ehci_fsl_dr_driver); - if (retval) - return retval; - - return platform_driver_register(&ehci_fsl_mph_driver); -} - -static void __exit ehci_fsl_cleanup(void) -{ - platform_driver_unregister(&ehci_fsl_mph_driver); - platform_driver_unregister(&ehci_fsl_dr_driver); -} - -module_init(ehci_fsl_init); -module_exit(ehci_fsl_cleanup); diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 79f2d8b9b..d63177a8e 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c @@ -16,7 +16,6 @@ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include #include #include @@ -626,10 +625,11 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd, struct pt_regs *regs) writel (status | CMD_RUN, &ehci->regs->command); while (i--) { - status = readl (&ehci->regs->port_status [i]); - if (status & PORT_OWNER) + int pstatus = readl (&ehci->regs->port_status [i]); + + if (pstatus & PORT_OWNER) continue; - if (!(status & PORT_RESUME) + if (!(pstatus & PORT_RESUME) || ehci->reset_done [i] != 0) continue; @@ -889,19 +889,59 @@ MODULE_LICENSE ("GPL"); #ifdef CONFIG_PCI #include "ehci-pci.c" -#define EHCI_BUS_GLUED +#define PCI_DRIVER ehci_pci_driver #endif -#ifdef CONFIG_PPC_83xx +#ifdef CONFIG_MPC834x #include "ehci-fsl.c" -#define EHCI_BUS_GLUED +#define PLATFORM_DRIVER ehci_fsl_driver #endif -#ifdef CONFIG_SOC_AU1X00 +#ifdef CONFIG_SOC_AU1200 #include "ehci-au1xxx.c" -#define EHCI_BUS_GLUED +#define PLATFORM_DRIVER ehci_hcd_au1xxx_driver #endif -#ifndef EHCI_BUS_GLUED +#if !defined(PCI_DRIVER) && !defined(PLATFORM_DRIVER) #error "missing bus glue for ehci-hcd" #endif + +static int __init ehci_hcd_init(void) +{ + int retval = 0; + + 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)); + +#ifdef PLATFORM_DRIVER + retval = platform_driver_register(&PLATFORM_DRIVER); + if (retval < 0) + return retval; +#endif + +#ifdef PCI_DRIVER + retval = pci_register_driver(&PCI_DRIVER); + if (retval < 0) { +#ifdef PLATFORM_DRIVER + platform_driver_unregister(&PLATFORM_DRIVER); +#endif + } +#endif + + return retval; +} +module_init(ehci_hcd_init); + +static void __exit ehci_hcd_cleanup(void) +{ +#ifdef PLATFORM_DRIVER + platform_driver_unregister(&PLATFORM_DRIVER); +#endif +#ifdef PCI_DRIVER + pci_unregister_driver(&PCI_DRIVER); +#endif +} +module_exit(ehci_hcd_cleanup); + diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index a1bd2bea6..cadffacd9 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c @@ -76,6 +76,30 @@ static int ehci_pci_setup(struct usb_hcd *hcd) dbg_hcs_params(ehci, "reset"); dbg_hcc_params(ehci, "reset"); + /* ehci_init() causes memory for DMA transfers to be + * allocated. Thus, any vendor-specific workarounds based on + * limiting the type of memory used for DMA transfers must + * happen before ehci_init() is called. */ + switch (pdev->vendor) { + 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; + } + /* cache this readonly data; minimize chip reads */ ehci->hcs_params = readl(&ehci->caps->hcs_params); @@ -88,8 +112,6 @@ static int ehci_pci_setup(struct usb_hcd *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) { @@ -107,19 +129,6 @@ static int ehci_pci_setup(struct usb_hcd *hcd) break; case PCI_VENDOR_ID_NVIDIA: switch (pdev->device) { - /* NVidia reports that certain chips don't handle - * QH, ITD, or SITD addresses above 2GB. (But TD, - * data buffer, and periodic schedule are normal.) - */ - 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; /* Some NForce2 chips have problems with selective suspend; * fixed in newer silicon. */ @@ -370,23 +379,3 @@ static struct pci_driver ehci_pci_driver = { .resume = usb_hcd_pci_resume, #endif }; - -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", - hcd_name, - sizeof(struct ehci_qh), sizeof(struct ehci_qtd), - sizeof(struct ehci_itd), sizeof(struct ehci_sitd)); - - return pci_register_driver(&ehci_pci_driver); -} -module_init(ehci_hcd_pci_init); - -static void __exit ehci_hcd_pci_cleanup(void) -{ - pci_unregister_driver(&ehci_pci_driver); -} -module_exit(ehci_hcd_pci_cleanup); diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index 5871944e6..4859900bd 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c @@ -163,6 +163,190 @@ static int same_tt (struct usb_device *dev1, struct usb_device *dev2) return 1; } +#ifdef CONFIG_USB_EHCI_TT_NEWSCHED + +/* Which uframe does the low/fullspeed transfer start in? + * + * The parameter is the mask of ssplits in "H-frame" terms + * and this returns the transfer start uframe in "B-frame" terms, + * which allows both to match, e.g. a ssplit in "H-frame" uframe 0 + * will cause a transfer in "B-frame" uframe 0. "B-frames" lag + * "H-frames" by 1 uframe. See the EHCI spec sec 4.5 and figure 4.7. + */ +static inline unsigned char tt_start_uframe(struct ehci_hcd *ehci, __le32 mask) +{ + unsigned char smask = QH_SMASK & le32_to_cpu(mask); + if (!smask) { + ehci_err(ehci, "invalid empty smask!\n"); + /* uframe 7 can't have bw so this will indicate failure */ + return 7; + } + return ffs(smask) - 1; +} + +static const unsigned char +max_tt_usecs[] = { 125, 125, 125, 125, 125, 125, 30, 0 }; + +/* carryover low/fullspeed bandwidth that crosses uframe boundries */ +static inline void carryover_tt_bandwidth(unsigned short tt_usecs[8]) +{ + int i; + for (i=0; i<7; i++) { + if (max_tt_usecs[i] < tt_usecs[i]) { + tt_usecs[i+1] += tt_usecs[i] - max_tt_usecs[i]; + tt_usecs[i] = max_tt_usecs[i]; + } + } +} + +/* How many of the tt's periodic downstream 1000 usecs are allocated? + * + * While this measures the bandwidth in terms of usecs/uframe, + * the low/fullspeed bus has no notion of uframes, so any particular + * low/fullspeed transfer can "carry over" from one uframe to the next, + * since the TT just performs downstream transfers in sequence. + * + * For example two seperate 100 usec transfers can start in the same uframe, + * and the second one would "carry over" 75 usecs into the next uframe. + */ +static void +periodic_tt_usecs ( + struct ehci_hcd *ehci, + struct usb_device *dev, + unsigned frame, + unsigned short tt_usecs[8] +) +{ + __le32 *hw_p = &ehci->periodic [frame]; + union ehci_shadow *q = &ehci->pshadow [frame]; + unsigned char uf; + + memset(tt_usecs, 0, 16); + + while (q->ptr) { + switch (Q_NEXT_TYPE(*hw_p)) { + case Q_TYPE_ITD: + hw_p = &q->itd->hw_next; + q = &q->itd->itd_next; + continue; + case Q_TYPE_QH: + if (same_tt(dev, q->qh->dev)) { + uf = tt_start_uframe(ehci, q->qh->hw_info2); + tt_usecs[uf] += q->qh->tt_usecs; + } + hw_p = &q->qh->hw_next; + q = &q->qh->qh_next; + continue; + case Q_TYPE_SITD: + if (same_tt(dev, q->sitd->urb->dev)) { + uf = tt_start_uframe(ehci, q->sitd->hw_uframe); + tt_usecs[uf] += q->sitd->stream->tt_usecs; + } + hw_p = &q->sitd->hw_next; + q = &q->sitd->sitd_next; + continue; + // case Q_TYPE_FSTN: + default: + ehci_dbg(ehci, + "ignoring periodic frame %d FSTN\n", frame); + hw_p = &q->fstn->hw_next; + q = &q->fstn->fstn_next; + } + } + + carryover_tt_bandwidth(tt_usecs); + + if (max_tt_usecs[7] < tt_usecs[7]) + ehci_err(ehci, "frame %d tt sched overrun: %d usecs\n", + frame, tt_usecs[7] - max_tt_usecs[7]); +} + +/* + * Return true if the device's tt's downstream bus is available for a + * periodic transfer of the specified length (usecs), starting at the + * specified frame/uframe. Note that (as summarized in section 11.19 + * of the usb 2.0 spec) TTs can buffer multiple transactions for each + * uframe. + * + * The uframe parameter is when the fullspeed/lowspeed transfer + * should be executed in "B-frame" terms, which is the same as the + * highspeed ssplit's uframe (which is in "H-frame" terms). For example + * a ssplit in "H-frame" 0 causes a transfer in "B-frame" 0. + * See the EHCI spec sec 4.5 and fig 4.7. + * + * This checks if the full/lowspeed bus, at the specified starting uframe, + * has the specified bandwidth available, according to rules listed + * in USB 2.0 spec section 11.18.1 fig 11-60. + * + * This does not check if the transfer would exceed the max ssplit + * limit of 16, specified in USB 2.0 spec section 11.18.4 requirement #4, + * since proper scheduling limits ssplits to less than 16 per uframe. + */ +static int tt_available ( + struct ehci_hcd *ehci, + unsigned period, + struct usb_device *dev, + unsigned frame, + unsigned uframe, + u16 usecs +) +{ + if ((period == 0) || (uframe >= 7)) /* error */ + return 0; + + for (; frame < ehci->periodic_size; frame += period) { + unsigned short tt_usecs[8]; + + periodic_tt_usecs (ehci, dev, frame, tt_usecs); + + ehci_vdbg(ehci, "tt frame %d check %d usecs start uframe %d in" + " schedule %d/%d/%d/%d/%d/%d/%d/%d\n", + frame, usecs, uframe, + tt_usecs[0], tt_usecs[1], tt_usecs[2], tt_usecs[3], + tt_usecs[4], tt_usecs[5], tt_usecs[6], tt_usecs[7]); + + if (max_tt_usecs[uframe] <= tt_usecs[uframe]) { + ehci_vdbg(ehci, "frame %d uframe %d fully scheduled\n", + frame, uframe); + return 0; + } + + /* special case for isoc transfers larger than 125us: + * the first and each subsequent fully used uframe + * must be empty, so as to not illegally delay + * already scheduled transactions + */ + if (125 < usecs) { + int ufs = (usecs / 125) - 1; + int i; + for (i = uframe; i < (uframe + ufs) && i < 8; i++) + if (0 < tt_usecs[i]) { + ehci_vdbg(ehci, + "multi-uframe xfer can't fit " + "in frame %d uframe %d\n", + frame, i); + return 0; + } + } + + tt_usecs[uframe] += usecs; + + carryover_tt_bandwidth(tt_usecs); + + /* fail if the carryover pushed bw past the last uframe's limit */ + if (max_tt_usecs[7] < tt_usecs[7]) { + ehci_vdbg(ehci, + "tt unavailable usecs %d frame %d uframe %d\n", + usecs, frame, uframe); + return 0; + } + } + + return 1; +} + +#else + /* return true iff the device's transaction translator is available * for a periodic transfer starting at the specified frame, using * all the uframes in the mask. @@ -237,6 +421,8 @@ static int tt_no_collision ( return 1; } +#endif /* CONFIG_USB_EHCI_TT_NEWSCHED */ + /*-------------------------------------------------------------------------*/ static int enable_periodic (struct ehci_hcd *ehci) @@ -481,7 +667,7 @@ static int check_intr_schedule ( ) { int retval = -ENOSPC; - u8 mask; + u8 mask = 0; if (qh->c_usecs && uframe >= 6) /* FSTN territory? */ goto done; @@ -494,6 +680,24 @@ static int check_intr_schedule ( goto done; } +#ifdef CONFIG_USB_EHCI_TT_NEWSCHED + if (tt_available (ehci, qh->period, qh->dev, frame, uframe, + qh->tt_usecs)) { + unsigned i; + + /* TODO : this may need FSTN for SSPLIT in uframe 5. */ + for (i=uframe+1; i<8 && iperiod, qh->c_usecs)) + goto done; + else + mask |= 1 << i; + + retval = 0; + + *c_maskp = cpu_to_le32 (mask << 8); + } +#else /* Make sure this tt's buffer is also available for CSPLITs. * We pessimize a bit; probably the typical full speed case * doesn't need the second CSPLIT. @@ -514,6 +718,7 @@ static int check_intr_schedule ( goto done; retval = 0; } +#endif done: return retval; } @@ -1047,12 +1252,21 @@ sitd_slot_ok ( frame = uframe >> 3; uf = uframe & 7; +#ifdef CONFIG_USB_EHCI_TT_NEWSCHED + /* The tt's fullspeed bus bandwidth must be available. + * tt_available scheduling guarantees 10+% for control/bulk. + */ + if (!tt_available (ehci, period_uframes << 3, + stream->udev, frame, uf, stream->tt_usecs)) + return 0; +#else /* tt must be idle for start(s), any gap, and csplit. * assume scheduling slop leaves 10+% for control/bulk. */ if (!tt_no_collision (ehci, period_uframes << 3, stream->udev, frame, mask)) return 0; +#endif /* check starts (OUT uses more than one) */ max_used = 100 - stream->usecs; diff --git a/drivers/usb/host/hc_crisv10.c b/drivers/usb/host/hc_crisv10.c index 2fe7fd194..61e571782 100644 --- a/drivers/usb/host/hc_crisv10.c +++ b/drivers/usb/host/hc_crisv10.c @@ -4,7 +4,6 @@ * Copyright (c) 2002, 2003 Axis Communications AB. */ -#include #include #include #include @@ -411,8 +410,7 @@ static inline void urb_list_move_last(struct urb *urb, int epid) urb_entry_t *urb_entry = __urb_list_entry(urb, epid); assert(urb_entry); - list_del(&urb_entry->list); - list_add_tail(&urb_entry->list, &urb_list[epid]); + list_move_tail(&urb_entry->list, &urb_list[epid]); } /* Get the next urb in the list. */ diff --git a/drivers/usb/host/isp116x-hcd.c b/drivers/usb/host/isp116x-hcd.c index e99210b79..8c6b38a0b 100644 --- a/drivers/usb/host/isp116x-hcd.c +++ b/drivers/usb/host/isp116x-hcd.c @@ -63,7 +63,7 @@ #include #include #include -#include +#include #include #include @@ -781,7 +781,7 @@ static int isp116x_urb_enqueue(struct usb_hcd *hcd, if (ep->branch < PERIODIC_SIZE) break; - ret = ep->branch = balance(isp116x, ep->period, ep->load); + ep->branch = ret = balance(isp116x, ep->period, ep->load); if (ret < 0) goto fail; ret = 0; @@ -1204,7 +1204,7 @@ static int isp116x_show_dbg(struct seq_file *s, void *unused) static int isp116x_open_seq(struct inode *inode, struct file *file) { - return single_open(file, isp116x_show_dbg, inode->u.generic_ip); + return single_open(file, isp116x_show_dbg, inode->i_private); } static struct file_operations isp116x_debug_fops = { @@ -1653,7 +1653,7 @@ static int __init isp116x_probe(struct platform_device *pdev) goto err6; } - ret = usb_add_hcd(hcd, irq, SA_INTERRUPT); + ret = usb_add_hcd(hcd, irq, IRQF_DISABLED); if (ret) goto err6; diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c index 6b7350b52..85cc05970 100644 --- a/drivers/usb/host/ohci-at91.c +++ b/drivers/usb/host/ohci-at91.c @@ -4,7 +4,7 @@ * Copyright (C) 2004 SAN People (Pty) Ltd. * Copyright (C) 2005 Thibaut VARENE * - * AT91RM9200 Bus Glue + * AT91 Bus Glue * * Based on fragments of 2.4 driver by Rick Bronson. * Based on ohci-omap.c @@ -19,12 +19,13 @@ #include #include -#ifndef CONFIG_ARCH_AT91RM9200 -#error "CONFIG_ARCH_AT91RM9200 must be defined." +#ifndef CONFIG_ARCH_AT91 +#error "CONFIG_ARCH_AT91 must be defined." #endif /* interface and function clocks */ static struct clk *iclk, *fclk; +static int clocked; extern int usb_disabled(void); @@ -35,13 +36,14 @@ static void at91_start_hc(struct platform_device *pdev) struct usb_hcd *hcd = platform_get_drvdata(pdev); struct ohci_regs __iomem *regs = hcd->regs; - dev_dbg(&pdev->dev, "starting AT91RM9200 OHCI USB Controller\n"); + dev_dbg(&pdev->dev, "start\n"); /* * Start the USB clocks. */ clk_enable(iclk); clk_enable(fclk); + clocked = 1; /* * The USB host controller must remain in reset. @@ -54,7 +56,7 @@ static void at91_stop_hc(struct platform_device *pdev) struct usb_hcd *hcd = platform_get_drvdata(pdev); struct ohci_regs __iomem *regs = hcd->regs; - dev_dbg(&pdev->dev, "stopping AT91RM9200 OHCI USB Controller\n"); + dev_dbg(&pdev->dev, "stop\n"); /* * Put the USB host controller into reset. @@ -66,6 +68,7 @@ static void at91_stop_hc(struct platform_device *pdev) */ clk_disable(fclk); clk_disable(iclk); + clocked = 0; } @@ -78,14 +81,15 @@ static int usb_hcd_at91_remove (struct usb_hcd *, struct platform_device *); /** - * usb_hcd_at91_probe - initialize AT91RM9200-based HCDs + * usb_hcd_at91_probe - initialize AT91-based HCDs * Context: !in_interrupt() * * Allocates basic resources for this USB host controller, and * then invokes the start() method for the HCD associated with it * through the hotplug entry's driver_data. */ -int usb_hcd_at91_probe (const struct hc_driver *driver, struct platform_device *pdev) +static int usb_hcd_at91_probe(const struct hc_driver *driver, + struct platform_device *pdev) { int retval; struct usb_hcd *hcd = NULL; @@ -95,12 +99,13 @@ int usb_hcd_at91_probe (const struct hc_driver *driver, struct platform_device * return -ENODEV; } - if ((pdev->resource[0].flags != IORESOURCE_MEM) || (pdev->resource[1].flags != IORESOURCE_IRQ)) { + if ((pdev->resource[0].flags != IORESOURCE_MEM) + || (pdev->resource[1].flags != IORESOURCE_IRQ)) { pr_debug("hcd probe: invalid resource type\n"); return -ENODEV; } - hcd = usb_create_hcd(driver, &pdev->dev, "at91rm9200"); + hcd = usb_create_hcd(driver, &pdev->dev, "at91"); if (!hcd) return -ENOMEM; hcd->rsrc_start = pdev->resource[0].start; @@ -125,7 +130,7 @@ int usb_hcd_at91_probe (const struct hc_driver *driver, struct platform_device * at91_start_hc(pdev); ohci_hcd_init(hcd_to_ohci(hcd)); - retval = usb_add_hcd(hcd, pdev->resource[1].start, SA_INTERRUPT); + retval = usb_add_hcd(hcd, pdev->resource[1].start, IRQF_DISABLED); if (retval == 0) return retval; @@ -149,21 +154,23 @@ int usb_hcd_at91_probe (const struct hc_driver *driver, struct platform_device * /* may be called with controller, bus, and devices active */ /** - * usb_hcd_at91_remove - shutdown processing for AT91RM9200-based HCDs + * usb_hcd_at91_remove - shutdown processing for AT91-based HCDs * @dev: USB Host Controller being removed * Context: !in_interrupt() * * Reverses the effect of usb_hcd_at91_probe(), first invoking * the HCD's stop() method. It is always called from a thread - * context, normally "rmmod", "apmd", or something similar. + * context, "rmmod" or something similar. * */ -static int usb_hcd_at91_remove (struct usb_hcd *hcd, struct platform_device *pdev) +static int usb_hcd_at91_remove(struct usb_hcd *hcd, + struct platform_device *pdev) { usb_remove_hcd(hcd); at91_stop_hc(pdev); iounmap(hcd->regs); release_mem_region(hcd->rsrc_start, hcd->rsrc_len); + disable_irq_wake(hcd->irq); clk_put(fclk); clk_put(iclk); @@ -178,19 +185,21 @@ static int usb_hcd_at91_remove (struct usb_hcd *hcd, struct platform_device *pde static int __devinit ohci_at91_start (struct usb_hcd *hcd) { -// struct at91_ohci_data *board = hcd->self.controller->platform_data; + struct at91_usbh_data *board = hcd->self.controller->platform_data; struct ohci_hcd *ohci = hcd_to_ohci (hcd); + struct usb_device *root = hcd->self.root_hub; int ret; if ((ret = ohci_init(ohci)) < 0) return ret; + root->maxchild = board->ports; + if ((ret = ohci_run(ohci)) < 0) { err("can't start %s", hcd->self.bus_name); ohci_stop(hcd); return ret; } -// hcd->self.root_hub->maxchild = board->ports; return 0; } @@ -198,7 +207,7 @@ ohci_at91_start (struct usb_hcd *hcd) static const struct hc_driver ohci_at91_hc_driver = { .description = hcd_name, - .product_desc = "AT91RM9200 OHCI", + .product_desc = "AT91 OHCI", .hcd_priv_size = sizeof(struct ohci_hcd), /* @@ -240,33 +249,54 @@ static const struct hc_driver ohci_at91_hc_driver = { /*-------------------------------------------------------------------------*/ -static int ohci_hcd_at91_drv_probe(struct platform_device *dev) +static int ohci_hcd_at91_drv_probe(struct platform_device *pdev) { - return usb_hcd_at91_probe(&ohci_at91_hc_driver, dev); + device_init_wakeup(&pdev->dev, 1); + return usb_hcd_at91_probe(&ohci_at91_hc_driver, pdev); } -static int ohci_hcd_at91_drv_remove(struct platform_device *dev) +static int ohci_hcd_at91_drv_remove(struct platform_device *pdev) { - return usb_hcd_at91_remove(platform_get_drvdata(dev), dev); + device_init_wakeup(&pdev->dev, 0); + return usb_hcd_at91_remove(platform_get_drvdata(pdev), pdev); } #ifdef CONFIG_PM -/* REVISIT suspend/resume look "too" simple here */ - static int -ohci_hcd_at91_drv_suspend(struct platform_device *dev, pm_message_t mesg) +ohci_hcd_at91_drv_suspend(struct platform_device *pdev, pm_message_t mesg) { - clk_disable(fclk); - clk_disable(iclk); + struct usb_hcd *hcd = platform_get_drvdata(pdev); + struct ohci_hcd *ohci = hcd_to_ohci(hcd); + + if (device_may_wakeup(&pdev->dev)) + enable_irq_wake(hcd->irq); + else + disable_irq_wake(hcd->irq); + + /* + * The integrated transceivers seem unable to notice disconnect, + * reconnect, or wakeup without the 48 MHz clock active. so for + * correctness, always discard connection state (using reset). + * + * REVISIT: some boards will be able to turn VBUS off... + */ + if (at91_suspend_entering_slow_clock()) { + ohci_usb_reset (ohci); + clk_disable(fclk); + clk_disable(iclk); + clocked = 0; + } return 0; } -static int ohci_hcd_at91_drv_resume(struct platform_device *dev) +static int ohci_hcd_at91_drv_resume(struct platform_device *pdev) { - clk_enable(iclk); - clk_enable(fclk); + if (!clocked) { + clk_enable(iclk); + clk_enable(fclk); + } return 0; } @@ -275,7 +305,7 @@ static int ohci_hcd_at91_drv_resume(struct platform_device *dev) #define ohci_hcd_at91_drv_resume NULL #endif -MODULE_ALIAS("at91rm9200-ohci"); +MODULE_ALIAS("at91_ohci"); static struct platform_driver ohci_hcd_at91_driver = { .probe = ohci_hcd_at91_drv_probe, @@ -283,7 +313,7 @@ static struct platform_driver ohci_hcd_at91_driver = { .suspend = ohci_hcd_at91_drv_suspend, .resume = ohci_hcd_at91_drv_resume, .driver = { - .name = "at91rm9200-ohci", + .name = "at91_ohci", .owner = THIS_MODULE, }, }; diff --git a/drivers/usb/host/ohci-au1xxx.c b/drivers/usb/host/ohci-au1xxx.c index 3981bf15c..f7a975d5d 100644 --- a/drivers/usb/host/ohci-au1xxx.c +++ b/drivers/usb/host/ohci-au1xxx.c @@ -18,8 +18,13 @@ * This file is licenced under the GPL. */ +#include +#include + #include +#ifndef CONFIG_SOC_AU1200 + #define USBH_ENABLE_BE (1<<0) #define USBH_ENABLE_C (1<<1) #define USBH_ENABLE_E (1<<2) @@ -34,37 +39,98 @@ #error not byte order defined #endif +#else /* Au1200 */ + +#define USB_HOST_CONFIG (USB_MSR_BASE + USB_MSR_MCFG) +#define USB_MCFG_PFEN (1<<31) +#define USB_MCFG_RDCOMB (1<<30) +#define USB_MCFG_SSDEN (1<<23) +#define USB_MCFG_OHCCLKEN (1<<16) +#define USB_MCFG_UCAM (1<<7) +#define USB_MCFG_OBMEN (1<<1) +#define USB_MCFG_OMEMEN (1<<0) + +#define USBH_ENABLE_CE USB_MCFG_OHCCLKEN +#ifdef CONFIG_DMA_COHERENT +#define USBH_ENABLE_INIT (USB_MCFG_OHCCLKEN \ + | USB_MCFG_PFEN | USB_MCFG_RDCOMB \ + | USB_MCFG_SSDEN | USB_MCFG_UCAM \ + | USB_MCFG_OBMEN | USB_MCFG_OMEMEN) +#else +#define USBH_ENABLE_INIT (USB_MCFG_OHCCLKEN \ + | USB_MCFG_PFEN | USB_MCFG_RDCOMB \ + | USB_MCFG_SSDEN \ + | USB_MCFG_OBMEN | USB_MCFG_OMEMEN) +#endif +#define USBH_DISABLE (USB_MCFG_OBMEN | USB_MCFG_OMEMEN) + +#endif /* Au1200 */ + extern int usb_disabled(void); /*-------------------------------------------------------------------------*/ -static void au1xxx_start_hc(struct platform_device *dev) +static void au1xxx_start_ohc(struct platform_device *dev) { printk(KERN_DEBUG __FILE__ ": starting Au1xxx OHCI USB Controller\n"); /* enable host controller */ + +#ifndef CONFIG_SOC_AU1200 + au_writel(USBH_ENABLE_CE, USB_HOST_CONFIG); udelay(1000); au_writel(USBH_ENABLE_INIT, USB_HOST_CONFIG); udelay(1000); +#else /* Au1200 */ + + /* write HW defaults again in case Yamon cleared them */ + if (au_readl(USB_HOST_CONFIG) == 0) { + au_writel(0x00d02000, USB_HOST_CONFIG); + au_readl(USB_HOST_CONFIG); + udelay(1000); + } + au_writel(USBH_ENABLE_CE | au_readl(USB_HOST_CONFIG), USB_HOST_CONFIG); + au_readl(USB_HOST_CONFIG); + udelay(1000); + au_writel(USBH_ENABLE_INIT | au_readl(USB_HOST_CONFIG), USB_HOST_CONFIG); + au_readl(USB_HOST_CONFIG); + udelay(1000); + +#endif /* Au1200 */ + +#ifndef CONFIG_SOC_AU1200 /* wait for reset complete (read register twice; see au1500 errata) */ while (au_readl(USB_HOST_CONFIG), !(au_readl(USB_HOST_CONFIG) & USBH_ENABLE_RD)) +#endif udelay(1000); printk(KERN_DEBUG __FILE__ ": Clock to USB host has been enabled \n"); } -static void au1xxx_stop_hc(struct platform_device *dev) +static void au1xxx_stop_ohc(struct platform_device *dev) { printk(KERN_DEBUG __FILE__ ": stopping Au1xxx OHCI USB Controller\n"); +#ifndef CONFIG_SOC_AU1200 + + /* Disable clock */ + au_writel(au_readl(USB_HOST_CONFIG) & ~USBH_ENABLE_CE, USB_HOST_CONFIG); + +#else /* Au1200 */ + + /* Disable mem */ + au_writel(~USBH_DISABLE & au_readl(USB_HOST_CONFIG), USB_HOST_CONFIG); + udelay(1000); /* Disable clock */ - au_writel(readl((void *)USB_HOST_CONFIG) & ~USBH_ENABLE_CE, USB_HOST_CONFIG); + au_writel(~USBH_ENABLE_CE & au_readl(USB_HOST_CONFIG), USB_HOST_CONFIG); + au_readl(USB_HOST_CONFIG); +#endif /* Au1200 */ } @@ -75,7 +141,7 @@ static void au1xxx_stop_hc(struct platform_device *dev) /** - * usb_hcd_au1xxx_probe - initialize Au1xxx-based HCDs + * usb_ohci_au1xxx_probe - initialize Au1xxx-based HCDs * Context: !in_interrupt() * * Allocates basic resources for this USB host controller, and @@ -83,14 +149,25 @@ static void au1xxx_stop_hc(struct platform_device *dev) * through the hotplug entry's driver_data. * */ -int usb_hcd_au1xxx_probe (const struct hc_driver *driver, +static int usb_ohci_au1xxx_probe(const struct hc_driver *driver, struct platform_device *dev) { int retval; struct usb_hcd *hcd; - if(dev->resource[1].flags != IORESOURCE_IRQ) { - pr_debug ("resource[1] is not IORESOURCE_IRQ"); +#if defined(CONFIG_SOC_AU1200) && defined(CONFIG_DMA_COHERENT) + /* Au1200 AB USB does not support coherent memory */ + if (!(read_c0_prid() & 0xff)) { + pr_info("%s: this is chip revision AB !!\n", + dev->name); + pr_info("%s: update your board or re-configure the kernel\n", + dev->name); + return -ENODEV; + } +#endif + + if (dev->resource[1].flags != IORESOURCE_IRQ) { + pr_debug("resource[1] is not IORESOURCE_IRQ\n"); return -ENOMEM; } @@ -101,26 +178,26 @@ int usb_hcd_au1xxx_probe (const struct hc_driver *driver, hcd->rsrc_len = dev->resource[0].end - dev->resource[0].start + 1; if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { - pr_debug("request_mem_region failed"); + pr_debug("request_mem_region failed\n"); retval = -EBUSY; goto err1; } hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); if (!hcd->regs) { - pr_debug("ioremap failed"); + pr_debug("ioremap failed\n"); retval = -ENOMEM; goto err2; } - au1xxx_start_hc(dev); + au1xxx_start_ohc(dev); ohci_hcd_init(hcd_to_ohci(hcd)); - retval = usb_add_hcd(hcd, dev->resource[1].start, SA_INTERRUPT); + retval = usb_add_hcd(hcd, dev->resource[1].start, IRQF_DISABLED | IRQF_SHARED); if (retval == 0) return retval; - au1xxx_stop_hc(dev); + au1xxx_stop_ohc(dev); iounmap(hcd->regs); err2: release_mem_region(hcd->rsrc_start, hcd->rsrc_len); @@ -143,10 +220,10 @@ int usb_hcd_au1xxx_probe (const struct hc_driver *driver, * context, normally "rmmod", "apmd", or something similar. * */ -void usb_hcd_au1xxx_remove (struct usb_hcd *hcd, struct platform_device *dev) +static void usb_ohci_au1xxx_remove(struct usb_hcd *hcd, struct platform_device *dev) { usb_remove_hcd(hcd); - au1xxx_stop_hc(dev); + au1xxx_stop_ohc(dev); iounmap(hcd->regs); release_mem_region(hcd->rsrc_start, hcd->rsrc_len); usb_put_hcd(hcd); @@ -214,13 +291,17 @@ static const struct hc_driver ohci_au1xxx_hc_driver = { */ .hub_status_data = ohci_hub_status_data, .hub_control = ohci_hub_control, +#ifdef CONFIG_PM + .bus_suspend = ohci_bus_suspend, + .bus_resume = ohci_bus_resume, +#endif + .start_port_reset = ohci_start_port_reset, }; /*-------------------------------------------------------------------------*/ -static int ohci_hcd_au1xxx_drv_probe(struct device *dev) +static int ohci_hcd_au1xxx_drv_probe(struct platform_device *pdev) { - struct platform_device *pdev = to_platform_device(dev); int ret; pr_debug ("In ohci_hcd_au1xxx_drv_probe"); @@ -228,42 +309,41 @@ static int ohci_hcd_au1xxx_drv_probe(struct device *dev) if (usb_disabled()) return -ENODEV; - ret = usb_hcd_au1xxx_probe(&ohci_au1xxx_hc_driver, pdev); + ret = usb_ohci_au1xxx_probe(&ohci_au1xxx_hc_driver, pdev); return ret; } -static int ohci_hcd_au1xxx_drv_remove(struct device *dev) +static int ohci_hcd_au1xxx_drv_remove(struct platform_device *pdev) { - struct platform_device *pdev = to_platform_device(dev); - struct usb_hcd *hcd = dev_get_drvdata(dev); + struct usb_hcd *hcd = platform_get_drvdata(pdev); - usb_hcd_au1xxx_remove(hcd, pdev); + usb_ohci_au1xxx_remove(hcd, pdev); return 0; } /*TBD*/ -/*static int ohci_hcd_au1xxx_drv_suspend(struct device *dev) +/*static int ohci_hcd_au1xxx_drv_suspend(struct platform_device *dev) { - struct platform_device *pdev = to_platform_device(dev); - struct usb_hcd *hcd = dev_get_drvdata(dev); + struct usb_hcd *hcd = platform_get_drvdata(dev); return 0; } -static int ohci_hcd_au1xxx_drv_resume(struct device *dev) +static int ohci_hcd_au1xxx_drv_resume(struct platform_device *dev) { - struct platform_device *pdev = to_platform_device(dev); - struct usb_hcd *hcd = dev_get_drvdata(dev); + struct usb_hcd *hcd = platform_get_drvdata(dev); return 0; } */ -static struct device_driver ohci_hcd_au1xxx_driver = { - .name = "au1xxx-ohci", - .bus = &platform_bus_type, +static struct platform_driver ohci_hcd_au1xxx_driver = { .probe = ohci_hcd_au1xxx_drv_probe, .remove = ohci_hcd_au1xxx_drv_remove, /*.suspend = ohci_hcd_au1xxx_drv_suspend, */ /*.resume = ohci_hcd_au1xxx_drv_resume, */ + .driver = { + .name = "au1xxx-ohci", + .owner = THIS_MODULE, + }, }; static int __init ohci_hcd_au1xxx_init (void) @@ -272,12 +352,12 @@ static int __init ohci_hcd_au1xxx_init (void) pr_debug ("block sizes: ed %d td %d\n", sizeof (struct ed), sizeof (struct td)); - return driver_register(&ohci_hcd_au1xxx_driver); + return platform_driver_register(&ohci_hcd_au1xxx_driver); } static void __exit ohci_hcd_au1xxx_cleanup (void) { - driver_unregister(&ohci_hcd_au1xxx_driver); + platform_driver_unregister(&ohci_hcd_au1xxx_driver); } module_init (ohci_hcd_au1xxx_init); diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index 73f5a379d..94d8cf4b3 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c @@ -74,7 +74,6 @@ * This file is licenced under the GPL. */ -#include #include #include #include @@ -902,6 +901,10 @@ MODULE_LICENSE ("GPL"); #include "ohci-pxa27x.c" #endif +#ifdef CONFIG_ARCH_EP93XX +#include "ohci-ep93xx.c" +#endif + #ifdef CONFIG_SOC_AU1X00 #include "ohci-au1xxx.c" #endif @@ -910,7 +913,7 @@ MODULE_LICENSE ("GPL"); #include "ohci-ppc-soc.c" #endif -#ifdef CONFIG_ARCH_AT91RM9200 +#if defined(CONFIG_ARCH_AT91RM9200) || defined(CONFIG_ARCH_AT91SAM9261) #include "ohci-at91.c" #endif @@ -920,9 +923,11 @@ MODULE_LICENSE ("GPL"); || defined(CONFIG_ARCH_OMAP) \ || defined (CONFIG_ARCH_LH7A404) \ || defined (CONFIG_PXA27x) \ + || defined (CONFIG_ARCH_EP93XX) \ || defined (CONFIG_SOC_AU1X00) \ || defined (CONFIG_USB_OHCI_HCD_PPC_SOC) \ || defined (CONFIG_ARCH_AT91RM9200) \ + || defined (CONFIG_ARCH_AT91SAM9261) \ ) #error "missing bus glue for ohci-hcd" #endif diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c index 0bb972b58..5b0a23fd7 100644 --- a/drivers/usb/host/ohci-hub.c +++ b/drivers/usb/host/ohci-hub.c @@ -581,14 +581,14 @@ static int ohci_hub_control ( break; case GetHubStatus: temp = roothub_status (ohci) & ~(RH_HS_CRWE | RH_HS_DRWE); - *(__le32 *) buf = cpu_to_le32 (temp); + put_unaligned(cpu_to_le32 (temp), (__le32 *) buf); break; case GetPortStatus: if (!wIndex || wIndex > ports) goto error; wIndex--; temp = roothub_portstatus (ohci, wIndex); - *(__le32 *) buf = cpu_to_le32 (temp); + put_unaligned(cpu_to_le32 (temp), (__le32 *) buf); #ifndef OHCI_VERBOSE_DEBUG if (*(u16*)(buf+2)) /* only if wPortChange is interesting */ diff --git a/drivers/usb/host/ohci-lh7a404.c b/drivers/usb/host/ohci-lh7a404.c index 817620d73..5602da9bd 100644 --- a/drivers/usb/host/ohci-lh7a404.c +++ b/drivers/usb/host/ohci-lh7a404.c @@ -16,9 +16,10 @@ * This file is licenced under the GPL. */ +#include +#include + #include -#include -#include extern int usb_disabled(void); @@ -99,7 +100,7 @@ int usb_hcd_lh7a404_probe (const struct hc_driver *driver, lh7a404_start_hc(dev); ohci_hcd_init(hcd_to_ohci(hcd)); - retval = usb_add_hcd(hcd, dev->resource[1].start, SA_INTERRUPT); + retval = usb_add_hcd(hcd, dev->resource[1].start, IRQF_DISABLED); if (retval == 0) return retval; @@ -195,13 +196,17 @@ static const struct hc_driver ohci_lh7a404_hc_driver = { */ .hub_status_data = ohci_hub_status_data, .hub_control = ohci_hub_control, +#ifdef CONFIG_PM + .bus_suspend = ohci_bus_suspend, + .bus_resume = ohci_bus_resume, +#endif + .start_port_reset = ohci_start_port_reset, }; /*-------------------------------------------------------------------------*/ -static int ohci_hcd_lh7a404_drv_probe(struct device *dev) +static int ohci_hcd_lh7a404_drv_probe(struct platform_device *pdev) { - struct platform_device *pdev = to_platform_device(dev); int ret; pr_debug ("In ohci_hcd_lh7a404_drv_probe"); @@ -213,39 +218,38 @@ static int ohci_hcd_lh7a404_drv_probe(struct device *dev) return ret; } -static int ohci_hcd_lh7a404_drv_remove(struct device *dev) +static int ohci_hcd_lh7a404_drv_remove(struct platform_device *pdev) { - struct platform_device *pdev = to_platform_device(dev); - struct usb_hcd *hcd = dev_get_drvdata(dev); + struct usb_hcd *hcd = platform_get_drvdata(pdev); usb_hcd_lh7a404_remove(hcd, pdev); return 0; } /*TBD*/ -/*static int ohci_hcd_lh7a404_drv_suspend(struct device *dev) +/*static int ohci_hcd_lh7a404_drv_suspend(struct platform_device *dev) { - struct platform_device *pdev = to_platform_device(dev); - struct usb_hcd *hcd = dev_get_drvdata(dev); + struct usb_hcd *hcd = platform_get_drvdata(dev); return 0; } -static int ohci_hcd_lh7a404_drv_resume(struct device *dev) +static int ohci_hcd_lh7a404_drv_resume(struct platform_device *dev) { - struct platform_device *pdev = to_platform_device(dev); - struct usb_hcd *hcd = dev_get_drvdata(dev); + struct usb_hcd *hcd = platform_get_drvdata(dev); return 0; } */ -static struct device_driver ohci_hcd_lh7a404_driver = { - .name = "lh7a404-ohci", - .bus = &platform_bus_type, +static struct platform_driver ohci_hcd_lh7a404_driver = { .probe = ohci_hcd_lh7a404_drv_probe, .remove = ohci_hcd_lh7a404_drv_remove, /*.suspend = ohci_hcd_lh7a404_drv_suspend, */ /*.resume = ohci_hcd_lh7a404_drv_resume, */ + .driver = { + .name = "lh7a404-ohci", + .owner = THIS_MODULE, + }, }; static int __init ohci_hcd_lh7a404_init (void) @@ -254,12 +258,12 @@ static int __init ohci_hcd_lh7a404_init (void) pr_debug ("block sizes: ed %d td %d\n", sizeof (struct ed), sizeof (struct td)); - return driver_register(&ohci_hcd_lh7a404_driver); + return platform_driver_register(&ohci_hcd_lh7a404_driver); } static void __exit ohci_hcd_lh7a404_cleanup (void) { - driver_unregister(&ohci_hcd_lh7a404_driver); + platform_driver_unregister(&ohci_hcd_lh7a404_driver); } module_init (ohci_hcd_lh7a404_init); diff --git a/drivers/usb/host/ohci-omap.c b/drivers/usb/host/ohci-omap.c index ca19abe01..c4c4babd4 100644 --- a/drivers/usb/host/ohci-omap.c +++ b/drivers/usb/host/ohci-omap.c @@ -14,7 +14,7 @@ * This file is licenced under the GPL. */ -#include /* SA_INTERRUPT */ +#include /* IRQF_DISABLED */ #include #include #include @@ -334,7 +334,7 @@ int usb_hcd_omap_probe (const struct hc_driver *driver, retval = -ENXIO; goto err2; } - retval = usb_add_hcd(hcd, irq, SA_INTERRUPT); + retval = usb_add_hcd(hcd, irq, IRQF_DISABLED); if (retval == 0) return retval; diff --git a/drivers/usb/host/ohci-ppc-soc.c b/drivers/usb/host/ohci-ppc-soc.c index 17964c39d..9fe56ff16 100644 --- a/drivers/usb/host/ohci-ppc-soc.c +++ b/drivers/usb/host/ohci-ppc-soc.c @@ -14,7 +14,8 @@ * This file is licenced under the GPL. */ -#include +#include +#include /* configure so an HC device and id are always provided */ /* always called with process context; sleeping is OK */ @@ -23,9 +24,7 @@ * usb_hcd_ppc_soc_probe - initialize On-Chip HCDs * Context: !in_interrupt() * - * Allocates basic resources for this USB host controller, and - * then invokes the start() method for the HCD associated with it - * through the hotplug entry's driver_data. + * Allocates basic resources for this USB host controller. * * Store this function in the HCD's struct pci_driver as probe(). */ @@ -37,7 +36,6 @@ static int usb_hcd_ppc_soc_probe(const struct hc_driver *driver, struct ohci_hcd *ohci; struct resource *res; int irq; - struct usb_hcd_platform_data *pd = pdev->dev.platform_data; pr_debug("initializing PPC-SOC USB Controller\n"); @@ -73,21 +71,16 @@ static int usb_hcd_ppc_soc_probe(const struct hc_driver *driver, goto err2; } - if (pd->start && (retval = pd->start(pdev))) - goto err3; - ohci = hcd_to_ohci(hcd); ohci->flags |= OHCI_BIG_ENDIAN; ohci_hcd_init(ohci); - retval = usb_add_hcd(hcd, irq, SA_INTERRUPT); + retval = usb_add_hcd(hcd, irq, IRQF_DISABLED); if (retval == 0) return retval; pr_debug("Removing PPC-SOC USB Controller\n"); - if (pd && pd->stop) - pd->stop(pdev); - err3: + iounmap(hcd->regs); err2: release_mem_region(hcd->rsrc_start, hcd->rsrc_len); @@ -105,25 +98,21 @@ static int usb_hcd_ppc_soc_probe(const struct hc_driver *driver, * @pdev: USB Host Controller being removed * Context: !in_interrupt() * - * Reverses the effect of usb_hcd_ppc_soc_probe(), first invoking - * the HCD's stop() method. It is always called from a thread + * Reverses the effect of usb_hcd_ppc_soc_probe(). + * It is always called from a thread * context, normally "rmmod", "apmd", or something similar. * */ static void usb_hcd_ppc_soc_remove(struct usb_hcd *hcd, struct platform_device *pdev) { - struct usb_hcd_platform_data *pd = pdev->dev.platform_data; - usb_remove_hcd(hcd); pr_debug("stopping PPC-SOC USB Controller\n"); - if (pd && pd->stop) - pd->stop(pdev); iounmap(hcd->regs); release_mem_region(hcd->rsrc_start, hcd->rsrc_len); - usb_hcd_put(hcd); + usb_put_hcd(hcd); } static int __devinit @@ -177,16 +166,15 @@ static const struct hc_driver ohci_ppc_soc_hc_driver = { */ .hub_status_data = ohci_hub_status_data, .hub_control = ohci_hub_control, -#ifdef CONFIG_USB_SUSPEND - .hub_suspend = ohci_hub_suspend, - .hub_resume = ohci_hub_resume, +#ifdef CONFIG_PM + .bus_suspend = ohci_bus_suspend, + .bus_resume = ohci_bus_resume, #endif .start_port_reset = ohci_start_port_reset, }; -static int ohci_hcd_ppc_soc_drv_probe(struct device *dev) +static int ohci_hcd_ppc_soc_drv_probe(struct platform_device *pdev) { - struct platform_device *pdev = to_platform_device(dev); int ret; if (usb_disabled()) @@ -196,24 +184,25 @@ static int ohci_hcd_ppc_soc_drv_probe(struct device *dev) return ret; } -static int ohci_hcd_ppc_soc_drv_remove(struct device *dev) +static int ohci_hcd_ppc_soc_drv_remove(struct platform_device *pdev) { - struct platform_device *pdev = to_platform_device(dev); - struct usb_hcd *hcd = dev_get_drvdata(dev); + struct usb_hcd *hcd = platform_get_drvdata(pdev); usb_hcd_ppc_soc_remove(hcd, pdev); return 0; } -static struct device_driver ohci_hcd_ppc_soc_driver = { - .name = "ppc-soc-ohci", - .bus = &platform_bus_type, +static struct platform_driver ohci_hcd_ppc_soc_driver = { .probe = ohci_hcd_ppc_soc_drv_probe, .remove = ohci_hcd_ppc_soc_drv_remove, -#if defined(CONFIG_USB_SUSPEND) || defined(CONFIG_PM) +#ifdef CONFIG_PM /*.suspend = ohci_hcd_ppc_soc_drv_suspend,*/ /*.resume = ohci_hcd_ppc_soc_drv_resume,*/ #endif + .driver = { + .name = "ppc-soc-ohci", + .owner = THIS_MODULE, + }, }; static int __init ohci_hcd_ppc_soc_init(void) @@ -222,12 +211,12 @@ static int __init ohci_hcd_ppc_soc_init(void) pr_debug("block sizes: ed %d td %d\n", sizeof(struct ed), sizeof(struct td)); - return driver_register(&ohci_hcd_ppc_soc_driver); + return platform_driver_register(&ohci_hcd_ppc_soc_driver); } static void __exit ohci_hcd_ppc_soc_cleanup(void) { - driver_unregister(&ohci_hcd_ppc_soc_driver); + platform_driver_unregister(&ohci_hcd_ppc_soc_driver); } module_init(ohci_hcd_ppc_soc_init); diff --git a/drivers/usb/host/ohci-pxa27x.c b/drivers/usb/host/ohci-pxa27x.c index fafe7c126..6f559e102 100644 --- a/drivers/usb/host/ohci-pxa27x.c +++ b/drivers/usb/host/ohci-pxa27x.c @@ -190,7 +190,7 @@ int usb_hcd_pxa27x_probe (const struct hc_driver *driver, struct platform_device ohci_hcd_init(hcd_to_ohci(hcd)); - retval = usb_add_hcd(hcd, pdev->resource[1].start, SA_INTERRUPT); + retval = usb_add_hcd(hcd, pdev->resource[1].start, IRQF_DISABLED); if (retval == 0) return retval; diff --git a/drivers/usb/host/ohci-s3c2410.c b/drivers/usb/host/ohci-s3c2410.c index 1da5de573..d2fc6969a 100644 --- a/drivers/usb/host/ohci-s3c2410.c +++ b/drivers/usb/host/ohci-s3c2410.c @@ -388,7 +388,7 @@ static int usb_hcd_s3c2410_probe (const struct hc_driver *driver, ohci_hcd_init(hcd_to_ohci(hcd)); - retval = usb_add_hcd(hcd, dev->resource[1].start, SA_INTERRUPT); + retval = usb_add_hcd(hcd, dev->resource[1].start, IRQF_DISABLED); if (retval != 0) goto err_ioremap; diff --git a/drivers/usb/host/ohci-sa1111.c b/drivers/usb/host/ohci-sa1111.c index fb3221ebb..ce3de106c 100644 --- a/drivers/usb/host/ohci-sa1111.c +++ b/drivers/usb/host/ohci-sa1111.c @@ -143,7 +143,7 @@ int usb_hcd_sa1111_probe (const struct hc_driver *driver, sa1111_start_hc(dev); ohci_hcd_init(hcd_to_ohci(hcd)); - retval = usb_add_hcd(hcd, dev->irq[1], SA_INTERRUPT); + retval = usb_add_hcd(hcd, dev->irq[1], IRQF_DISABLED); if (retval == 0) return retval; diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c index 1045f846f..208616509 100644 --- a/drivers/usb/host/pci-quirks.c +++ b/drivers/usb/host/pci-quirks.c @@ -8,7 +8,6 @@ * (and others) */ -#include #include #include #include @@ -168,8 +167,6 @@ static int __devinit mmio_resource_enabled(struct pci_dev *pdev, int idx) static void __devinit quirk_usb_handoff_ohci(struct pci_dev *pdev) { void __iomem *base; - int wait_time; - u32 control; if (!mmio_resource_enabled(pdev, 0)) return; @@ -180,9 +177,10 @@ static void __devinit quirk_usb_handoff_ohci(struct pci_dev *pdev) /* On PA-RISC, PDC can leave IR set incorrectly; ignore it there. */ #ifndef __hppa__ - control = readl(base + OHCI_CONTROL); +{ + u32 control = readl(base + OHCI_CONTROL); if (control & OHCI_CTRL_IR) { - wait_time = 500; /* arbitrary; 5 seconds */ + int wait_time = 500; /* arbitrary; 5 seconds */ writel(OHCI_INTR_OC, base + OHCI_INTRENABLE); writel(OHCI_OCR, base + OHCI_CMDSTATUS); while (wait_time > 0 && @@ -199,6 +197,7 @@ static void __devinit quirk_usb_handoff_ohci(struct pci_dev *pdev) /* reset controller, preserving RWC */ writel(control & OHCI_CTRL_RWC, base + OHCI_CONTROL); } +} #endif /* diff --git a/drivers/usb/host/sl811-hcd.c b/drivers/usb/host/sl811-hcd.c index a92343052..fa34092bb 100644 --- a/drivers/usb/host/sl811-hcd.c +++ b/drivers/usb/host/sl811-hcd.c @@ -31,7 +31,6 @@ #undef VERBOSE #undef PACKET_TRACE -#include #include #include #include @@ -46,7 +45,7 @@ #include #include #include -#include +#include #include #include @@ -1684,9 +1683,13 @@ sl811h_probe(struct platform_device *dev) if (!addr || !data) return -ENODEV; ioaddr = 1; - - addr_reg = (void __iomem *) addr->start; - data_reg = (void __iomem *) data->start; + /* + * NOTE: 64-bit resource->start is getting truncated + * to avoid compiler warning, assuming that ->start + * is always 32-bit for this case + */ + addr_reg = (void __iomem *) (unsigned long) addr->start; + data_reg = (void __iomem *) (unsigned long) data->start; } else { addr_reg = ioremap(addr->start, 1); if (addr_reg == NULL) { @@ -1746,7 +1749,7 @@ sl811h_probe(struct platform_device *dev) * was on a system with single edge triggering, so most sorts of * triggering arrangement should work. */ - retval = usb_add_hcd(hcd, irq, SA_INTERRUPT | SA_SHIRQ); + retval = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED); if (retval != 0) goto err6; diff --git a/drivers/usb/host/sl811_cs.c b/drivers/usb/host/sl811_cs.c index 6e1732650..54f554e0f 100644 --- a/drivers/usb/host/sl811_cs.c +++ b/drivers/usb/host/sl811_cs.c @@ -19,15 +19,15 @@ #include #include #include +#include -#include #include #include #include #include #include -#include +#include MODULE_AUTHOR("Botond Botyanszki"); MODULE_DESCRIPTION("REX-CFU1U PCMCIA driver for 2.6"); @@ -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); @@ -66,20 +66,13 @@ module_param(pc_debug, int, 0644); static const char driver_name[DEV_NAME_LEN] = "sl811_cs"; -static dev_link_t *dev_list = NULL; - -static int irq_list[4] = { -1 }; -static int irq_list_count; - -module_param_array(irq_list, int, &irq_list_count, 0444); - -INT_MODULE_PARM(irq_mask, 0xdeb8); - typedef struct local_info_t { - dev_link_t link; + struct pcmcia_device *p_dev; dev_node_t node; } local_info_t; +static void sl811_cs_release(struct pcmcia_device * link); + /*====================================================================*/ static void release_platform_dev(struct device * dev) @@ -108,7 +101,7 @@ static struct resource resources[] = { }, }; -extern struct device_driver sl811h_driver; +extern struct platform_driver sl811h_driver; static struct platform_device platform_dev = { .id = -1, @@ -136,69 +129,36 @@ 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; + platform_dev.name = sl811h_driver.driver.name; return platform_device_register(&platform_dev); } /*====================================================================*/ -static void sl811_cs_detach(dev_link_t *link) +static void sl811_cs_detach(struct pcmcia_device *link) { - dev_link_t **linkp; - DBG(0, "sl811_cs_detach(0x%p)\n", link); - /* Locate device structure */ - for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) { - if (*linkp == link) - break; - } - if (*linkp == NULL) - return; - - /* Break the link with Card Services */ - if (link->handle) - pcmcia_deregister_client(link->handle); + sl811_cs_release(link); - /* Unlink device structure, and free it */ - *linkp = link->next; /* This points to the parent local_info_t struct */ kfree(link->priv); } -static void sl811_cs_release(dev_link_t * link) +static void sl811_cs_release(struct pcmcia_device * link) { - DBG(0, "sl811_cs_release(0x%p)\n", link); - if (link->open) { - DBG(1, "sl811_cs: release postponed, '%s' still open\n", - link->dev->dev_name); - link->state |= DEV_STALE_CONFIG; - return; - } - - /* Unlink the device chain */ - link->dev = NULL; - + pcmcia_disable_device(link); platform_device_unregister(&platform_dev); - pcmcia_release_configuration(link->handle); - if (link->io.NumPorts1) - pcmcia_release_io(link->handle, &link->io); - if (link->irq.AssignedIRQ) - pcmcia_release_irq(link->handle, &link->irq); - link->state &= ~DEV_CONFIG; - - if (link->state & DEV_STALE_LINK) - sl811_cs_detach(link); } -static void sl811_cs_config(dev_link_t *link) +static int sl811_cs_config(struct pcmcia_device *link) { - client_handle_t handle = link->handle; - struct device *parent = &handle_to_dev(handle); + struct device *parent = &handle_to_dev(link); local_info_t *dev = link->priv; tuple_t tuple; cisparse_t parse; @@ -214,27 +174,23 @@ static void sl811_cs_config(dev_link_t *link) tuple.TupleData = buf; tuple.TupleDataMax = sizeof(buf); tuple.TupleOffset = 0; - CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); - CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); - CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); + CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); + CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, &tuple, &parse)); link->conf.ConfigBase = parse.config.base; link->conf.Present = parse.config.rmask[0]; - /* Configure card */ - link->state |= DEV_CONFIG; - /* Look up the current Vcc */ CS_CHECK(GetConfigurationInfo, - pcmcia_get_configuration_info(handle, &conf)); - link->conf.Vcc = conf.Vcc; + pcmcia_get_configuration_info(link, &conf)); tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; - CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); while (1) { cistpl_cftable_entry_t *cfg = &(parse.cftable_entry); - if (pcmcia_get_tuple_data(handle, &tuple) != 0 - || pcmcia_parse_tuple(handle, &tuple, &parse) + if (pcmcia_get_tuple_data(link, &tuple) != 0 + || pcmcia_parse_tuple(link, &tuple, &parse) != 0) goto next_entry; @@ -260,10 +216,10 @@ static void sl811_cs_config(dev_link_t *link) } if (cfg->vpp1.present & (1<conf.Vpp1 = link->conf.Vpp2 = + link->conf.Vpp = cfg->vpp1.param[CISTPL_POWER_VNOM]/10000; else if (dflt.vpp1.present & (1<conf.Vpp1 = link->conf.Vpp2 = + link->conf.Vpp = dflt.vpp1.param[CISTPL_POWER_VNOM]/10000; /* we need an interrupt */ @@ -280,15 +236,14 @@ static void sl811_cs_config(dev_link_t *link) link->io.BasePort1 = io->win[0].base; link->io.NumPorts1 = io->win[0].len; - if (pcmcia_request_io(link->handle, &link->io) != 0) + if (pcmcia_request_io(link, &link->io) != 0) goto next_entry; } break; next_entry: - if (link->io.NumPorts1) - pcmcia_release_io(link->handle, &link->io); - last_ret = pcmcia_get_next_tuple(handle, &tuple); + pcmcia_disable_device(link); + last_ret = pcmcia_get_next_tuple(link, &tuple); } /* require an IRQ and two registers */ @@ -296,135 +251,73 @@ next_entry: goto cs_failed; if (link->conf.Attributes & CONF_ENABLE_IRQ) CS_CHECK(RequestIRQ, - pcmcia_request_irq(link->handle, &link->irq)); + pcmcia_request_irq(link, &link->irq)); else goto cs_failed; CS_CHECK(RequestConfiguration, - pcmcia_request_configuration(link->handle, &link->conf)); + pcmcia_request_configuration(link, &link->conf)); sprintf(dev->node.dev_name, driver_name); dev->node.major = dev->node.minor = 0; - link->dev = &dev->node; + link->dev_node = &dev->node; - printk(KERN_INFO "%s: index 0x%02x: Vcc %d.%d", - dev->node.dev_name, link->conf.ConfigIndex, - link->conf.Vcc/10, link->conf.Vcc%10); - if (link->conf.Vpp1) - printk(", Vpp %d.%d", link->conf.Vpp1/10, link->conf.Vpp1%10); + printk(KERN_INFO "%s: index 0x%02x: ", + dev->node.dev_name, link->conf.ConfigIndex); + if (link->conf.Vpp) + printk(", Vpp %d.%d", link->conf.Vpp/10, link->conf.Vpp%10); printk(", irq %d", link->irq.AssignedIRQ); printk(", io 0x%04x-0x%04x", link->io.BasePort1, link->io.BasePort1+link->io.NumPorts1-1); printk("\n"); - link->state &= ~DEV_CONFIG_PENDING; - if (sl811_hc_init(parent, link->io.BasePort1, link->irq.AssignedIRQ) < 0) { cs_failed: printk("sl811_cs_config failed\n"); - cs_error(link->handle, last_fn, last_ret); + cs_error(link, last_fn, last_ret); sl811_cs_release(link); - link->state &= ~DEV_CONFIG_PENDING; - } -} - -static int -sl811_cs_event(event_t event, int priority, event_callback_args_t *args) -{ - dev_link_t *link = args->client_data; - - DBG(1, "sl811_cs_event(0x%06x)\n", event); - - switch (event) { - case CS_EVENT_CARD_REMOVAL: - link->state &= ~DEV_PRESENT; - if (link->state & DEV_CONFIG) - sl811_cs_release(link); - break; - - case CS_EVENT_CARD_INSERTION: - link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; - sl811_cs_config(link); - break; - - case CS_EVENT_PM_SUSPEND: - link->state |= DEV_SUSPEND; - /* Fall through... */ - case CS_EVENT_RESET_PHYSICAL: - if (link->state & DEV_CONFIG) - pcmcia_release_configuration(link->handle); - break; - - case CS_EVENT_PM_RESUME: - link->state &= ~DEV_SUSPEND; - /* Fall through... */ - case CS_EVENT_CARD_RESET: - if (link->state & DEV_CONFIG) - pcmcia_request_configuration(link->handle, &link->conf); - DBG(0, "reset sl811-hcd here?\n"); - break; + return -ENODEV; } return 0; } -static dev_link_t *sl811_cs_attach(void) +static int sl811_cs_probe(struct pcmcia_device *link) { local_info_t *local; - dev_link_t *link; - client_reg_t client_reg; - int ret, i; local = kmalloc(sizeof(local_info_t), GFP_KERNEL); if (!local) - return NULL; + return -ENOMEM; memset(local, 0, sizeof(local_info_t)); - link = &local->link; + local->p_dev = link; link->priv = local; /* Initialize */ link->irq.Attributes = IRQ_TYPE_EXCLUSIVE; link->irq.IRQInfo1 = IRQ_INFO2_VALID|IRQ_LEVEL_ID; - if (irq_list[0] == -1) - link->irq.IRQInfo2 = irq_mask; - else - for (i = 0; i < irq_list_count; i++) - link->irq.IRQInfo2 |= 1 << irq_list[i]; link->irq.Handler = NULL; link->conf.Attributes = 0; - link->conf.Vcc = 33; link->conf.IntType = INT_MEMORY_AND_IO; - /* Register with Card Services */ - link->next = dev_list; - dev_list = link; - client_reg.dev_info = (dev_info_t *) &driver_name; - client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE; - client_reg.EventMask = - CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL | - CS_EVENT_RESET_PHYSICAL | CS_EVENT_CARD_RESET | - CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME; - client_reg.event_handler = &sl811_cs_event; - client_reg.Version = 0x0210; - client_reg.event_callback_args.client_data = link; - ret = pcmcia_register_client(&link->handle, &client_reg); - if (ret != CS_SUCCESS) { - cs_error(link->handle, RegisterClient, ret); - sl811_cs_detach(link); - return NULL; - } - - return link; + return sl811_cs_config(link); } +static struct pcmcia_device_id sl811_ids[] = { + PCMCIA_DEVICE_MANF_CARD(0xc015, 0x0001), /* RATOC USB HOST CF+ Card */ + PCMCIA_DEVICE_NULL, +}; +MODULE_DEVICE_TABLE(pcmcia, sl811_ids); + static struct pcmcia_driver sl811_cs_driver = { .owner = THIS_MODULE, .drv = { .name = (char *)driver_name, }, - .attach = sl811_cs_attach, - .detach = sl811_cs_detach, + .probe = sl811_cs_probe, + .remove = sl811_cs_detach, + .id_table = sl811_ids, }; /*====================================================================*/ diff --git a/drivers/usb/host/uhci-debug.c b/drivers/usb/host/uhci-debug.c index e12393196..d1372cb27 100644 --- a/drivers/usb/host/uhci-debug.c +++ b/drivers/usb/host/uhci-debug.c @@ -9,7 +9,6 @@ * (C) Copyright 1999-2001 Johannes Erdfelt */ -#include #include #include #include @@ -98,6 +97,7 @@ static int uhci_show_urbp(struct urb_priv *urbp, char *buf, int len, int space) char *out = buf; struct uhci_td *td; int i, nactive, ninactive; + char *ptype; if (len < 200) return 0; @@ -110,13 +110,15 @@ static int uhci_show_urbp(struct urb_priv *urbp, char *buf, int len, int space) (usb_pipein(urbp->urb->pipe) ? "IN" : "OUT")); switch (usb_pipetype(urbp->urb->pipe)) { - case PIPE_ISOCHRONOUS: out += sprintf(out, "ISO"); break; - case PIPE_INTERRUPT: out += sprintf(out, "INT"); break; - case PIPE_BULK: out += sprintf(out, "BLK"); break; - case PIPE_CONTROL: out += sprintf(out, "CTL"); break; + case PIPE_ISOCHRONOUS: ptype = "ISO"; break; + case PIPE_INTERRUPT: ptype = "INT"; break; + case PIPE_BULK: ptype = "BLK"; break; + default: + case PIPE_CONTROL: ptype = "CTL"; break; } - out += sprintf(out, "%s", (urbp->fsbr ? " FSBR" : "")); + out += sprintf(out, "%s%s", ptype, (urbp->fsbr ? " FSBR" : "")); + out += sprintf(out, " Actlen=%d", urbp->urb->actual_length); if (urbp->urb->status != -EINPROGRESS) out += sprintf(out, " Status=%d", urbp->urb->status); @@ -124,7 +126,8 @@ static int uhci_show_urbp(struct urb_priv *urbp, char *buf, int len, int space) i = nactive = ninactive = 0; list_for_each_entry(td, &urbp->td_list, list) { - if (++i <= 10 || debug > 2) { + if (urbp->qh->type != USB_ENDPOINT_XFER_ISOC && + (++i <= 10 || debug > 2)) { out += sprintf(out, "%*s%d: ", space + 2, "", i); out += uhci_show_td(td, out, len - (out - buf), 0); } else { @@ -147,13 +150,27 @@ static int uhci_show_qh(struct uhci_qh *qh, char *buf, int len, int space) char *out = buf; int i, nurbs; __le32 element = qh_element(qh); + char *qtype; /* Try to make sure there's enough memory */ - if (len < 80 * 6) + if (len < 80 * 7) return 0; - out += sprintf(out, "%*s[%p] link (%08x) element (%08x)\n", space, "", - qh, le32_to_cpu(qh->link), le32_to_cpu(element)); + switch (qh->type) { + case USB_ENDPOINT_XFER_ISOC: qtype = "ISO"; break; + case USB_ENDPOINT_XFER_INT: qtype = "INT"; break; + case USB_ENDPOINT_XFER_BULK: qtype = "BLK"; break; + case USB_ENDPOINT_XFER_CONTROL: qtype = "CTL"; break; + default: qtype = "Skel" ; break; + } + + out += sprintf(out, "%*s[%p] %s QH link (%08x) element (%08x)\n", + space, "", qh, qtype, + le32_to_cpu(qh->link), le32_to_cpu(element)); + if (qh->type == USB_ENDPOINT_XFER_ISOC) + out += sprintf(out, "%*s period %d frame %x desc [%p]\n", + space, "", qh->period, qh->iso_frame, + qh->iso_packet_desc); if (element & UHCI_PTR_QH) out += sprintf(out, "%*s Element points to QH (bug?)\n", space, ""); @@ -261,7 +278,8 @@ static int uhci_show_root_hub_state(struct uhci_hcd *uhci, char *buf, int len) default: rh_state = "?"; break; } - out += sprintf(out, "Root-hub state: %s\n", rh_state); + out += sprintf(out, "Root-hub state: %s FSBR: %d\n", + rh_state, uhci->fsbr_is_on); return out - buf; } @@ -275,7 +293,7 @@ static int uhci_show_status(struct uhci_hcd *uhci, char *buf, int len) unsigned short portsc1, portsc2; /* Try to make sure there's enough memory */ - if (len < 80 * 6) + if (len < 80 * 9) return 0; usbcmd = inw(io_addr + 0); @@ -314,6 +332,10 @@ static int uhci_show_status(struct uhci_hcd *uhci, char *buf, int len) out += sprintf(out, " sof = %02x\n", sof); out += uhci_show_sc(1, portsc1, out, len - (out - buf)); out += uhci_show_sc(2, portsc2, out, len - (out - buf)); + out += sprintf(out, "Most recent frame: %x (%d) " + "Last ISO frame: %x (%d)\n", + uhci->frame_number, uhci->frame_number & 1023, + uhci->last_iso_frame, uhci->last_iso_frame & 1023); return out - buf; } @@ -406,7 +428,7 @@ struct uhci_debug { static int uhci_debug_open(struct inode *inode, struct file *file) { - struct uhci_hcd *uhci = inode->u.generic_ip; + struct uhci_hcd *uhci = inode->i_private; struct uhci_debug *up; int ret = -ENOMEM; unsigned long flags; diff --git a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c index d225e11f4..4151f6186 100644 --- a/drivers/usb/host/uhci-hcd.c +++ b/drivers/usb/host/uhci-hcd.c @@ -13,7 +13,7 @@ * (C) Copyright 2000 Yggdrasil Computing, Inc. (port of new PCI interface * support from usb-ohci.c by Adam Richter, adam@yggdrasil.com). * (C) Copyright 1999 Gregory P. Smith (from usb-ohci.c) - * (C) Copyright 2004-2005 Alan Stern, stern@rowland.harvard.edu + * (C) Copyright 2004-2006 Alan Stern, stern@rowland.harvard.edu * * Intel documents this fairly well, and as far as I know there * are no royalties or anything like that, but even so there are @@ -22,7 +22,6 @@ * */ -#include #include #include #include @@ -31,7 +30,6 @@ #include #include #include -#include #include #include #include @@ -88,15 +86,6 @@ static void suspend_rh(struct uhci_hcd *uhci, enum uhci_rh_state new_state); static void wakeup_rh(struct uhci_hcd *uhci); static void uhci_get_current_frame_number(struct uhci_hcd *uhci); -/* If a transfer is still active after this much time, turn off FSBR */ -#define IDLE_TIMEOUT msecs_to_jiffies(50) -#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 TDs */ -/* to make sure it doesn't hog all of the bandwidth */ -#define DEPTH_INTERVAL 5 - #include "uhci-debug.c" #include "uhci-q.c" #include "uhci-hub.c" @@ -120,22 +109,29 @@ static void finish_reset(struct uhci_hcd *uhci) uhci->is_stopped = UHCI_IS_STOPPED; uhci_to_hcd(uhci)->state = HC_STATE_HALT; uhci_to_hcd(uhci)->poll_rh = 0; + + uhci->dead = 0; /* Full reset resurrects the controller */ } /* * Last rites for a defunct/nonfunctional controller * or one we don't want to use any more. */ -static void hc_died(struct uhci_hcd *uhci) +static void uhci_hc_died(struct uhci_hcd *uhci) { + uhci_get_current_frame_number(uhci); uhci_reset_hc(to_pci_dev(uhci_dev(uhci)), uhci->io_addr); finish_reset(uhci); - uhci->hc_inaccessible = 1; + uhci->dead = 1; + + /* The current frame may already be partway finished */ + ++uhci->frame_number; } /* - * Initialize a controller that was newly discovered or has just been - * resumed. In either case we can't be sure of its previous state. + * Initialize a controller that was newly discovered or has lost power + * or otherwise been reset while it was suspended. In none of these cases + * can we be sure of its previous state. */ static void check_and_reset_hc(struct uhci_hcd *uhci) { @@ -155,7 +151,8 @@ static void configure_hc(struct uhci_hcd *uhci) outl(uhci->frame_dma_handle, uhci->io_addr + USBFLBASEADD); /* Set the current frame number */ - outw(uhci->frame_number, uhci->io_addr + USBFRNUM); + outw(uhci->frame_number & UHCI_MAX_SOF_NUMBER, + uhci->io_addr + USBFRNUM); /* Mark controller as not halted before we enable interrupts */ uhci_to_hcd(uhci)->state = HC_STATE_SUSPENDED; @@ -207,7 +204,8 @@ __acquires(uhci->lock) int int_enable; auto_stop = (new_state == UHCI_RH_AUTO_STOPPED); - dev_dbg(uhci_dev(uhci), "%s%s\n", __FUNCTION__, + dev_dbg(&uhci_to_hcd(uhci)->self.root_hub->dev, + "%s%s\n", __FUNCTION__, (auto_stop ? " (auto-stop)" : "")); /* If we get a suspend request when we're already auto-stopped @@ -241,27 +239,27 @@ __acquires(uhci->lock) spin_unlock_irq(&uhci->lock); msleep(1); spin_lock_irq(&uhci->lock); - if (uhci->hc_inaccessible) /* Died */ + if (uhci->dead) return; } if (!(inw(uhci->io_addr + USBSTS) & USBSTS_HCH)) - dev_warn(uhci_dev(uhci), "Controller not stopped yet!\n"); + dev_warn(&uhci_to_hcd(uhci)->self.root_hub->dev, + "Controller not stopped yet!\n"); uhci_get_current_frame_number(uhci); - smp_wmb(); uhci->rh_state = new_state; uhci->is_stopped = UHCI_IS_STOPPED; uhci_to_hcd(uhci)->poll_rh = !int_enable; uhci_scan_schedule(uhci, NULL); + uhci_fsbr_off(uhci); } static void start_rh(struct uhci_hcd *uhci) { uhci_to_hcd(uhci)->state = HC_STATE_RUNNING; uhci->is_stopped = 0; - smp_wmb(); /* Mark it configured and running with a 64-byte max packet. * All interrupts are enabled, even though RESUME won't do anything. @@ -278,7 +276,8 @@ static void wakeup_rh(struct uhci_hcd *uhci) __releases(uhci->lock) __acquires(uhci->lock) { - dev_dbg(uhci_dev(uhci), "%s%s\n", __FUNCTION__, + dev_dbg(&uhci_to_hcd(uhci)->self.root_hub->dev, + "%s%s\n", __FUNCTION__, uhci->rh_state == UHCI_RH_AUTO_STOPPED ? " (auto-start)" : ""); @@ -293,7 +292,7 @@ __acquires(uhci->lock) spin_unlock_irq(&uhci->lock); msleep(20); spin_lock_irq(&uhci->lock); - if (uhci->hc_inaccessible) /* Died */ + if (uhci->dead) return; /* End Global Resume and wait for EOP to be sent */ @@ -345,7 +344,7 @@ static irqreturn_t uhci_irq(struct usb_hcd *hcd, struct pt_regs *regs) errbuf, ERRBUF_LEN); lprintk(errbuf); } - hc_died(uhci); + uhci_hc_died(uhci); /* Force a callback in case there are * pending unlinks */ @@ -368,12 +367,21 @@ static irqreturn_t uhci_irq(struct usb_hcd *hcd, struct pt_regs *regs) /* * Store the current frame number in uhci->frame_number if the controller - * is runnning + * is runnning. Expand from 11 bits (of which we use only 10) to a + * full-sized integer. + * + * Like many other parts of the driver, this code relies on being polled + * more than once per second as long as the controller is running. */ static void uhci_get_current_frame_number(struct uhci_hcd *uhci) { - if (!uhci->is_stopped) - uhci->frame_number = inw(uhci->io_addr + USBFRNUM); + if (!uhci->is_stopped) { + unsigned delta; + + delta = (inw(uhci->io_addr + USBFRNUM) - uhci->frame_number) & + (UHCI_NUMFRAMES - 1); + uhci->frame_number += delta; + } } /* @@ -407,7 +415,7 @@ static void release_uhci(struct uhci_hcd *uhci) uhci->frame, uhci->frame_dma_handle); } -static int uhci_reset(struct usb_hcd *hcd) +static int uhci_init(struct usb_hcd *hcd) { struct uhci_hcd *uhci = hcd_to_uhci(hcd); unsigned io_size = (unsigned) hcd->rsrc_len; @@ -459,7 +467,7 @@ static void uhci_shutdown(struct pci_dev *pdev) { struct usb_hcd *hcd = (struct usb_hcd *) pci_get_drvdata(pdev); - hc_died(hcd_to_uhci(hcd)); + uhci_hc_died(hcd_to_uhci(hcd)); } /* @@ -487,14 +495,10 @@ static int uhci_start(struct usb_hcd *hcd) hcd->uses_new_polling = 1; - uhci->fsbr = 0; - uhci->fsbrtimeout = 0; - spin_lock_init(&uhci->lock); - - INIT_LIST_HEAD(&uhci->td_remove_list); + setup_timer(&uhci->fsbr_timer, uhci_fsbr_timeout, + (unsigned long) uhci); INIT_LIST_HEAD(&uhci->idle_qh_list); - init_waitqueue_head(&uhci->waitqh); if (DEBUG_CONFIGURED) { @@ -665,11 +669,12 @@ static void uhci_stop(struct usb_hcd *hcd) struct uhci_hcd *uhci = hcd_to_uhci(hcd); spin_lock_irq(&uhci->lock); - if (!uhci->hc_inaccessible) - hc_died(uhci); + if (test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags) && !uhci->dead) + uhci_hc_died(uhci); uhci_scan_schedule(uhci, NULL); spin_unlock_irq(&uhci->lock); + del_timer_sync(&uhci->fsbr_timer); release_uhci(uhci); } @@ -677,12 +682,15 @@ static void uhci_stop(struct usb_hcd *hcd) static int uhci_rh_suspend(struct usb_hcd *hcd) { struct uhci_hcd *uhci = hcd_to_uhci(hcd); + int rc = 0; spin_lock_irq(&uhci->lock); - if (!uhci->hc_inaccessible) /* Not dead */ + if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) + rc = -ESHUTDOWN; + else if (!uhci->dead) suspend_rh(uhci, UHCI_RH_SUSPENDED); spin_unlock_irq(&uhci->lock); - return 0; + return rc; } static int uhci_rh_resume(struct usb_hcd *hcd) @@ -691,13 +699,10 @@ static int uhci_rh_resume(struct usb_hcd *hcd) int rc = 0; spin_lock_irq(&uhci->lock); - if (uhci->hc_inaccessible) { - if (uhci->rh_state == UHCI_RH_SUSPENDED) { - dev_warn(uhci_dev(uhci), "HC isn't running!\n"); - rc = -ENODEV; - } - /* Otherwise the HC is dead */ - } else + if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) { + dev_warn(&hcd->self.root_hub->dev, "HC isn't running!\n"); + rc = -ESHUTDOWN; + } else if (!uhci->dead) wakeup_rh(uhci); spin_unlock_irq(&uhci->lock); return rc; @@ -711,8 +716,8 @@ static int uhci_suspend(struct usb_hcd *hcd, pm_message_t message) dev_dbg(uhci_dev(uhci), "%s\n", __FUNCTION__); spin_lock_irq(&uhci->lock); - if (uhci->hc_inaccessible) /* Dead or already suspended */ - goto done; + if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags) || uhci->dead) + goto done_okay; /* Already suspended or dead */ if (uhci->rh_state > UHCI_RH_SUSPENDED) { dev_warn(uhci_dev(uhci), "Root hub isn't suspended!\n"); @@ -725,12 +730,12 @@ static int uhci_suspend(struct usb_hcd *hcd, pm_message_t message) */ 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; /* FIXME: Enable non-PME# remote wakeup? */ +done_okay: + clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); done: spin_unlock_irq(&uhci->lock); return rc; @@ -743,24 +748,22 @@ 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. + * even if the controller was dead. */ set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); mb(); - if (uhci->rh_state == UHCI_RH_RESET) /* Dead */ - return 0; spin_lock_irq(&uhci->lock); /* FIXME: Disable non-PME# remote wakeup? */ - uhci->hc_inaccessible = 0; - - /* The BIOS may have changed the controller settings during a - * system wakeup. Check it and reconfigure to avoid problems. + /* The firmware or a boot kernel may have changed the controller + * settings during a system wakeup. Check it and reconfigure + * to avoid problems. */ check_and_reset_hc(uhci); + + /* If the controller was dead before, it's back alive now */ configure_hc(uhci); if (uhci->rh_state == UHCI_RH_RESET) { @@ -810,18 +813,15 @@ done: static int uhci_hcd_get_frame_number(struct usb_hcd *hcd) { struct uhci_hcd *uhci = hcd_to_uhci(hcd); - unsigned long flags; - int is_stopped; - int frame_number; + unsigned frame_number; + unsigned delta; /* Minimize latency by avoiding the spinlock */ - local_irq_save(flags); - is_stopped = uhci->is_stopped; - smp_rmb(); - frame_number = (is_stopped ? uhci->frame_number : - inw(uhci->io_addr + USBFRNUM)); - local_irq_restore(flags); - return frame_number; + frame_number = uhci->frame_number; + barrier(); + delta = (inw(uhci->io_addr + USBFRNUM) - frame_number) & + (UHCI_NUMFRAMES - 1); + return frame_number + delta; } static const char hcd_name[] = "uhci_hcd"; @@ -836,7 +836,7 @@ static const struct hc_driver uhci_driver = { .flags = HCD_USB11, /* Basic lifecycle operations */ - .reset = uhci_reset, + .reset = uhci_init, .start = uhci_start, #ifdef CONFIG_PM .suspend = uhci_suspend, diff --git a/drivers/usb/host/uhci-hcd.h b/drivers/usb/host/uhci-hcd.h index d5c8f4d92..108e3de2d 100644 --- a/drivers/usb/host/uhci-hcd.h +++ b/drivers/usb/host/uhci-hcd.h @@ -84,6 +84,13 @@ #define CAN_SCHEDULE_FRAMES 1000 /* how far in the future frames * can be scheduled */ +/* When no queues need Full-Speed Bandwidth Reclamation, + * delay this long before turning FSBR off */ +#define FSBR_OFF_DELAY msecs_to_jiffies(10) + +/* If a queue hasn't advanced after this much time, assume it is stuck */ +#define QH_WAIT_TIMEOUT msecs_to_jiffies(200) + /* * Queue Headers @@ -121,21 +128,31 @@ struct uhci_qh { __le32 element; /* Queue element (TD) pointer */ /* Software fields */ - dma_addr_t dma_handle; - struct list_head node; /* Node in the list of QHs */ struct usb_host_endpoint *hep; /* Endpoint information */ struct usb_device *udev; struct list_head queue; /* Queue of urbps for this QH */ struct uhci_qh *skel; /* Skeleton for this QH */ struct uhci_td *dummy_td; /* Dummy TD to end the queue */ + struct uhci_td *post_td; /* Last TD completed */ + struct usb_iso_packet_descriptor *iso_packet_desc; + /* Next urb->iso_frame_desc entry */ + unsigned long advance_jiffies; /* Time of last queue advance */ unsigned int unlink_frame; /* When the QH was unlinked */ + unsigned int period; /* For Interrupt and Isochronous QHs */ + unsigned int iso_frame; /* Frame # for iso_packet_desc */ + int iso_status; /* Status for Isochronous URBs */ + int state; /* QH_STATE_xxx; see above */ + int type; /* Queue type (control, bulk, etc) */ + + dma_addr_t dma_handle; unsigned int initial_toggle:1; /* Endpoint's current toggle value */ unsigned int needs_fixup:1; /* Must fix the TD toggle values */ - unsigned int is_stopped:1; /* Queue was stopped by an error */ + unsigned int is_stopped:1; /* Queue was stopped by error/unlink */ + unsigned int wait_expired:1; /* QH_WAIT_TIMEOUT has expired */ } __attribute__((aligned(16))); /* @@ -226,7 +243,6 @@ struct uhci_td { dma_addr_t dma_handle; struct list_head list; - struct list_head remove_list; int frame; /* for iso: what frame? */ struct list_head fl_list; @@ -305,38 +321,8 @@ static inline u32 td_status(struct uhci_td *td) { #define skel_bulk_qh skelqh[12] #define skel_term_qh skelqh[13] -/* - * Search tree for determining where fits in the skelqh[] - * skeleton. - * - * An interrupt request should be placed into the slowest skelqh[] - * which meets the interval/period/frequency requirement. - * An interrupt request is allowed to be faster than but not slower. - * - * For a given , this function returns the appropriate/matching - * skelqh[] index value. - */ -static inline int __interval_to_skel(int interval) -{ - if (interval < 16) { - if (interval < 4) { - if (interval < 2) - return 9; /* int1 for 0-1 ms */ - return 8; /* int2 for 2-3 ms */ - } - if (interval < 8) - return 7; /* int4 for 4-7 ms */ - return 6; /* int8 for 8-15 ms */ - } - if (interval < 64) { - if (interval < 32) - return 5; /* int16 for 16-31 ms */ - return 4; /* int32 for 32-63 ms */ - } - if (interval < 128) - return 3; /* int64 for 64-127 ms */ - return 2; /* int128 for 128-255 ms (Max.) */ -} +/* Find the skelqh entry corresponding to an interval exponent */ +#define UHCI_SKEL_INDEX(exponent) (9 - exponent) /* @@ -396,32 +382,32 @@ struct uhci_hcd { __le32 *frame; void **frame_cpu; /* CPU's frame list */ - int fsbr; /* Full-speed bandwidth reclamation */ - unsigned long fsbrtimeout; /* FSBR delay */ - enum uhci_rh_state rh_state; unsigned long auto_stop_time; /* When to AUTO_STOP */ unsigned int frame_number; /* As of last check */ unsigned int is_stopped; #define UHCI_IS_STOPPED 9999 /* Larger than a frame # */ + unsigned int last_iso_frame; /* Frame of last scan */ + unsigned int cur_iso_frame; /* Frame for current scan */ unsigned int scan_in_progress:1; /* Schedule scan is running */ unsigned int need_rescan:1; /* Redo the schedule scan */ - unsigned int hc_inaccessible:1; /* HC is suspended or dead */ + unsigned int dead:1; /* Controller has died */ unsigned int working_RD:1; /* Suspended root hub doesn't need to be polled */ unsigned int is_initialized:1; /* Data structure is usable */ + unsigned int fsbr_is_on:1; /* FSBR is turned on */ + unsigned int fsbr_is_wanted:1; /* Does any URB want FSBR? */ + unsigned int fsbr_expiring:1; /* FSBR is timing out */ + + struct timer_list fsbr_timer; /* For turning off FBSR */ /* Support for port suspend/resume/reset */ unsigned long port_c_suspend; /* Bit-arrays of ports */ unsigned long resuming_ports; unsigned long ports_timeout; /* Time to stop signalling */ - /* 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 */ - struct list_head idle_qh_list; /* Where the idle QHs live */ int rh_numports; /* Number of root-hub ports */ @@ -442,6 +428,9 @@ static inline struct usb_hcd *uhci_to_hcd(struct uhci_hcd *uhci) #define uhci_dev(u) (uhci_to_hcd(u)->self.controller) +/* Utility macro for comparing frame numbers */ +#define uhci_frame_before_eq(f1, f2) (0 <= (int) ((f2) - (f1))) + /* * Private per-URB data @@ -454,9 +443,7 @@ struct urb_priv { struct uhci_qh *qh; /* QH for this URB */ struct list_head td_list; - unsigned fsbr : 1; /* URB turned on FSBR */ - unsigned short_transfer : 1; /* URB got a short transfer, no - * need to rescan */ + unsigned fsbr:1; /* URB wants FSBR */ }; diff --git a/drivers/usb/host/uhci-hub.c b/drivers/usb/host/uhci-hub.c index c8451d957..c545ef92f 100644 --- a/drivers/usb/host/uhci-hub.c +++ b/drivers/usb/host/uhci-hub.c @@ -171,9 +171,8 @@ static int uhci_hub_status_data(struct usb_hcd *hcd, char *buf) spin_lock_irqsave(&uhci->lock, flags); uhci_scan_schedule(uhci, NULL); - if (uhci->hc_inaccessible) + if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags) || uhci->dead) goto done; - check_fsbr(uhci); uhci_check_ports(uhci); status = get_hub_status_data(uhci, buf); @@ -228,7 +227,7 @@ static int uhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, u16 wPortChange, wPortStatus; unsigned long flags; - if (uhci->hc_inaccessible) + if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags) || uhci->dead) return -ETIMEDOUT; spin_lock_irqsave(&uhci->lock, flags); diff --git a/drivers/usb/host/uhci-q.c b/drivers/usb/host/uhci-q.c index 5f44354c4..431e8f31f 100644 --- a/drivers/usb/host/uhci-q.c +++ b/drivers/usb/host/uhci-q.c @@ -13,10 +13,9 @@ * (C) Copyright 2000 Yggdrasil Computing, Inc. (port of new PCI interface * support from usb-ohci.c by Adam Richter, adam@yggdrasil.com). * (C) Copyright 1999 Gregory P. Smith (from usb-ohci.c) - * (C) Copyright 2004-2005 Alan Stern, stern@rowland.harvard.edu + * (C) Copyright 2004-2006 Alan Stern, stern@rowland.harvard.edu */ -static void uhci_free_pending_tds(struct uhci_hcd *uhci); /* * Technically, updating td->status here is a race, but it's not really a @@ -38,6 +37,60 @@ static inline void uhci_clear_next_interrupt(struct uhci_hcd *uhci) uhci->term_td->status &= ~cpu_to_le32(TD_CTRL_IOC); } + +/* + * Full-Speed Bandwidth Reclamation (FSBR). + * We turn on FSBR whenever a queue that wants it is advancing, + * and leave it on for a short time thereafter. + */ +static void uhci_fsbr_on(struct uhci_hcd *uhci) +{ + uhci->fsbr_is_on = 1; + uhci->skel_term_qh->link = cpu_to_le32( + uhci->skel_fs_control_qh->dma_handle) | UHCI_PTR_QH; +} + +static void uhci_fsbr_off(struct uhci_hcd *uhci) +{ + uhci->fsbr_is_on = 0; + uhci->skel_term_qh->link = UHCI_PTR_TERM; +} + +static void uhci_add_fsbr(struct uhci_hcd *uhci, struct urb *urb) +{ + struct urb_priv *urbp = urb->hcpriv; + + if (!(urb->transfer_flags & URB_NO_FSBR)) + urbp->fsbr = 1; +} + +static void uhci_urbp_wants_fsbr(struct uhci_hcd *uhci, struct urb_priv *urbp) +{ + if (urbp->fsbr) { + uhci->fsbr_is_wanted = 1; + if (!uhci->fsbr_is_on) + uhci_fsbr_on(uhci); + else if (uhci->fsbr_expiring) { + uhci->fsbr_expiring = 0; + del_timer(&uhci->fsbr_timer); + } + } +} + +static void uhci_fsbr_timeout(unsigned long _uhci) +{ + struct uhci_hcd *uhci = (struct uhci_hcd *) _uhci; + unsigned long flags; + + spin_lock_irqsave(&uhci->lock, flags); + if (uhci->fsbr_expiring) { + uhci->fsbr_expiring = 0; + uhci_fsbr_off(uhci); + } + spin_unlock_irqrestore(&uhci->lock, flags); +} + + static struct uhci_td *uhci_alloc_td(struct uhci_hcd *uhci) { dma_addr_t dma_handle; @@ -51,7 +104,6 @@ static struct uhci_td *uhci_alloc_td(struct uhci_hcd *uhci) td->frame = -1; INIT_LIST_HEAD(&td->list); - INIT_LIST_HEAD(&td->remove_list); INIT_LIST_HEAD(&td->fl_list); return td; @@ -61,8 +113,6 @@ static void uhci_free_td(struct uhci_hcd *uhci, struct uhci_td *td) { if (!list_empty(&td->list)) dev_warn(uhci_dev(uhci), "td %p still in list!\n", td); - if (!list_empty(&td->remove_list)) - dev_warn(uhci_dev(uhci), "td %p still in remove_list!\n", td); if (!list_empty(&td->fl_list)) dev_warn(uhci_dev(uhci), "td %p still in fl_list!\n", td); @@ -77,6 +127,16 @@ static inline void uhci_fill_td(struct uhci_td *td, u32 status, td->buffer = cpu_to_le32(buffer); } +static void uhci_add_td_to_urbp(struct uhci_td *td, struct urb_priv *urbp) +{ + list_add_tail(&td->list, &urbp->td_list); +} + +static void uhci_remove_td_from_urbp(struct uhci_td *td) +{ + list_del_init(&td->list); +} + /* * We insert Isochronous URBs directly into the frame list at the beginning */ @@ -138,6 +198,24 @@ static inline void uhci_remove_td_from_frame_list(struct uhci_hcd *uhci, td->frame = -1; } +static inline void uhci_remove_tds_from_frame(struct uhci_hcd *uhci, + unsigned int framenum) +{ + struct uhci_td *ftd, *ltd; + + framenum &= (UHCI_NUMFRAMES - 1); + + ftd = uhci->frame_cpu[framenum]; + if (ftd) { + ltd = list_entry(ftd->fl_list.prev, struct uhci_td, fl_list); + uhci->frame[framenum] = ltd->link; + uhci->frame_cpu[framenum] = NULL; + + while (!list_empty(&ftd->fl_list)) + list_del_init(ftd->fl_list.prev); + } +} + /* * Remove all the TDs for an Isochronous URB from the frame list */ @@ -148,7 +226,6 @@ static void uhci_unlink_isochronous_tds(struct uhci_hcd *uhci, struct urb *urb) list_for_each_entry(td, &urbp->td_list, list) uhci_remove_td_from_frame_list(uhci, td); - wmb(); } static struct uhci_qh *uhci_alloc_qh(struct uhci_hcd *uhci, @@ -161,6 +238,7 @@ static struct uhci_qh *uhci_alloc_qh(struct uhci_hcd *uhci, if (!qh) return NULL; + memset(qh, 0, sizeof(*qh)); qh->dma_handle = dma_handle; qh->element = UHCI_PTR_TERM; @@ -179,10 +257,11 @@ static struct uhci_qh *uhci_alloc_qh(struct uhci_hcd *uhci, qh->hep = hep; qh->udev = udev; hep->hcpriv = qh; + qh->type = hep->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; } else { /* Skeleton QH */ qh->state = QH_STATE_ACTIVE; - qh->udev = NULL; + qh->type = -1; } return qh; } @@ -202,35 +281,64 @@ static void uhci_free_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) } /* - * When the currently executing URB is dequeued, save its current toggle value + * When a queue is stopped and a dequeued URB is given back, adjust + * the previous TD link (if the URB isn't first on the queue) or + * save its toggle value (if it is first and is currently executing). + * + * Returns 0 if the URB should not yet be given back, 1 otherwise. */ -static void uhci_save_toggle(struct uhci_qh *qh, struct urb *urb) +static int uhci_cleanup_queue(struct uhci_hcd *uhci, struct uhci_qh *qh, + struct urb *urb) { - struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv; + struct urb_priv *urbp = urb->hcpriv; struct uhci_td *td; + int ret = 1; + + /* Isochronous pipes don't use toggles and their TD link pointers + * get adjusted during uhci_urb_dequeue(). But since their queues + * cannot truly be stopped, we have to watch out for dequeues + * occurring after the nominal unlink frame. */ + if (qh->type == USB_ENDPOINT_XFER_ISOC) { + ret = (uhci->frame_number + uhci->is_stopped != + qh->unlink_frame); + goto done; + } + + /* If the URB isn't first on its queue, adjust the link pointer + * of the last TD in the previous URB. The toggle doesn't need + * to be saved since this URB can't be executing yet. */ + if (qh->queue.next != &urbp->node) { + struct urb_priv *purbp; + struct uhci_td *ptd; + + purbp = list_entry(urbp->node.prev, struct urb_priv, node); + WARN_ON(list_empty(&purbp->td_list)); + ptd = list_entry(purbp->td_list.prev, struct uhci_td, + list); + td = list_entry(urbp->td_list.prev, struct uhci_td, + list); + ptd->link = td->link; + goto done; + } /* If the QH element pointer is UHCI_PTR_TERM then then currently * executing URB has already been unlinked, so this one isn't it. */ - if (qh_element(qh) == UHCI_PTR_TERM || - qh->queue.next != &urbp->node) - return; + if (qh_element(qh) == UHCI_PTR_TERM) + goto done; qh->element = UHCI_PTR_TERM; - /* Only bulk and interrupt pipes have to worry about toggles */ - if (!(usb_pipetype(urb->pipe) == PIPE_BULK || - usb_pipetype(urb->pipe) == PIPE_INTERRUPT)) - return; + /* Control pipes have to worry about toggles */ + if (qh->type == USB_ENDPOINT_XFER_CONTROL) + goto done; - /* Find the first active TD; that's the device's toggle state */ - list_for_each_entry(td, &urbp->td_list, list) { - if (td_status(td) & TD_CTRL_ACTIVE) { - qh->needs_fixup = 1; - qh->initial_toggle = uhci_toggle(td_token(td)); - return; - } - } + /* Save the next toggle value */ + WARN_ON(list_empty(&urbp->td_list)); + td = list_entry(urbp->td_list.next, struct uhci_td, list); + qh->needs_fixup = 1; + qh->initial_toggle = uhci_toggle(td_token(td)); - WARN_ON(1); +done: + return ret; } /* @@ -305,6 +413,10 @@ static void uhci_activate_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) qh->element = cpu_to_le32(td->dma_handle); } + /* Treat the queue as if it has just advanced */ + qh->wait_expired = 0; + qh->advance_jiffies = jiffies; + if (qh->state == QH_STATE_ACTIVE) return; qh->state = QH_STATE_ACTIVE; @@ -370,6 +482,12 @@ static void uhci_make_qh_idle(struct uhci_hcd *uhci, struct uhci_qh *qh) list_move(&qh->node, &uhci->idle_qh_list); qh->state = QH_STATE_IDLE; + /* Now that the QH is idle, its post_td isn't being used */ + if (qh->post_td) { + uhci_free_td(uhci, qh->post_td); + qh->post_td = NULL; + } + /* If anyone is waiting for a QH to become idle, wake them up */ if (uhci->num_waiting) wake_up_all(&uhci->waitqh); @@ -395,21 +513,6 @@ static inline struct urb_priv *uhci_alloc_urb_priv(struct uhci_hcd *uhci, return urbp; } -static void uhci_add_td_to_urb(struct urb *urb, struct uhci_td *td) -{ - struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv; - - list_add_tail(&td->list, &urbp->td_list); -} - -static void uhci_remove_td_from_urb(struct uhci_td *td) -{ - if (list_empty(&td->list)) - return; - - list_del_init(&td->list); -} - static void uhci_free_urb_priv(struct uhci_hcd *uhci, struct urb_priv *urbp) { @@ -419,48 +522,15 @@ static void uhci_free_urb_priv(struct uhci_hcd *uhci, dev_warn(uhci_dev(uhci), "urb %p still on QH's list!\n", urbp->urb); - uhci_get_current_frame_number(uhci); - if (uhci->frame_number + uhci->is_stopped != uhci->td_remove_age) { - uhci_free_pending_tds(uhci); - uhci->td_remove_age = uhci->frame_number; - } - - /* Check to see if the remove list is empty. Set the IOC bit */ - /* to force an interrupt so we can remove the TDs. */ - if (list_empty(&uhci->td_remove_list)) - uhci_set_next_interrupt(uhci); - list_for_each_entry_safe(td, tmp, &urbp->td_list, list) { - uhci_remove_td_from_urb(td); - list_add(&td->remove_list, &uhci->td_remove_list); + uhci_remove_td_from_urbp(td); + uhci_free_td(uhci, td); } urbp->urb->hcpriv = NULL; kmem_cache_free(uhci_up_cachep, urbp); } -static void uhci_inc_fsbr(struct uhci_hcd *uhci, struct urb *urb) -{ - struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv; - - if ((!(urb->transfer_flags & URB_NO_FSBR)) && !urbp->fsbr) { - urbp->fsbr = 1; - if (!uhci->fsbr++ && !uhci->fsbrtimeout) - uhci->skel_term_qh->link = cpu_to_le32(uhci->skel_fs_control_qh->dma_handle) | UHCI_PTR_QH; - } -} - -static void uhci_dec_fsbr(struct uhci_hcd *uhci, struct urb *urb) -{ - struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv; - - if ((!(urb->transfer_flags & URB_NO_FSBR)) && urbp->fsbr) { - urbp->fsbr = 0; - if (!--uhci->fsbr) - uhci->fsbrtimeout = jiffies + FSBR_DELAY; - } -} - /* * Map status to standard result codes * @@ -487,7 +557,6 @@ static int uhci_map_status(int status, int dir_out) return -ENOSR; if (status & TD_CTRL_STALLED) /* Stalled */ return -EPIPE; - WARN_ON(status & TD_CTRL_ACTIVE); /* Active */ return 0; } @@ -503,6 +572,7 @@ static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb, int len = urb->transfer_buffer_length; dma_addr_t data = urb->transfer_dma; __le32 *plink; + struct urb_priv *urbp = urb->hcpriv; /* The "pipe" thing contains the destination in bits 8--18 */ destination = (urb->pipe & PIPE_DEVEP_MASK) | USB_PID_SETUP; @@ -516,7 +586,7 @@ static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb, * Build the TD for the control request setup packet */ td = qh->dummy_td; - uhci_add_td_to_urb(urb, td); + uhci_add_td_to_urbp(td, urbp); uhci_fill_td(td, status, destination | uhci_explen(8), urb->setup_dma); plink = &td->link; @@ -548,7 +618,7 @@ static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb, /* Alternate Data0/1 (start with Data1) */ destination ^= TD_TOKEN_TOGGLE; - uhci_add_td_to_urb(urb, td); + uhci_add_td_to_urbp(td, urbp); uhci_fill_td(td, status, destination | uhci_explen(pktsze), data); plink = &td->link; @@ -579,7 +649,7 @@ static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb, status &= ~TD_CTRL_SPD; - uhci_add_td_to_urb(urb, td); + uhci_add_td_to_urbp(td, urbp); uhci_fill_td(td, status | TD_CTRL_IOC, destination | uhci_explen(0), 0); plink = &td->link; @@ -606,144 +676,18 @@ static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb, qh->skel = uhci->skel_ls_control_qh; else { qh->skel = uhci->skel_fs_control_qh; - uhci_inc_fsbr(uhci, urb); + uhci_add_fsbr(uhci, urb); } + + urb->actual_length = -8; /* Account for the SETUP packet */ return 0; nomem: /* Remove the dummy TD from the td_list so it doesn't get freed */ - uhci_remove_td_from_urb(qh->dummy_td); + uhci_remove_td_from_urbp(qh->dummy_td); return -ENOMEM; } -/* - * If control-IN transfer was short, the status packet wasn't sent. - * This routine changes the element pointer in the QH to point at the - * status TD. It's safe to do this even while the QH is live, because - * the hardware only updates the element pointer following a successful - * transfer. The inactive TD for the short packet won't cause an update, - * so the pointer won't get overwritten. The next time the controller - * sees this QH, it will send the status packet. - */ -static int usb_control_retrigger_status(struct uhci_hcd *uhci, struct urb *urb) -{ - struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv; - struct uhci_td *td; - - urbp->short_transfer = 1; - - td = list_entry(urbp->td_list.prev, struct uhci_td, list); - urbp->qh->element = cpu_to_le32(td->dma_handle); - - return -EINPROGRESS; -} - - -static int uhci_result_control(struct uhci_hcd *uhci, struct urb *urb) -{ - struct list_head *tmp, *head; - struct urb_priv *urbp = urb->hcpriv; - struct uhci_td *td; - unsigned int status; - int ret = 0; - - head = &urbp->td_list; - if (urbp->short_transfer) { - tmp = head->prev; - goto status_stage; - } - - urb->actual_length = 0; - - tmp = head->next; - td = list_entry(tmp, struct uhci_td, list); - - /* The first TD is the SETUP stage, check the status, but skip */ - /* the count */ - status = uhci_status_bits(td_status(td)); - if (status & TD_CTRL_ACTIVE) - return -EINPROGRESS; - - if (status) - goto td_error; - - /* The rest of the TDs (but the last) are data */ - tmp = tmp->next; - while (tmp != head && tmp->next != head) { - unsigned int ctrlstat; - - td = list_entry(tmp, struct uhci_td, list); - tmp = tmp->next; - - ctrlstat = td_status(td); - status = uhci_status_bits(ctrlstat); - if (status & TD_CTRL_ACTIVE) - return -EINPROGRESS; - - urb->actual_length += uhci_actual_length(ctrlstat); - - if (status) - goto td_error; - - /* Check to see if we received a short packet */ - if (uhci_actual_length(ctrlstat) < - uhci_expected_length(td_token(td))) { - if (urb->transfer_flags & URB_SHORT_NOT_OK) { - ret = -EREMOTEIO; - goto err; - } - - return usb_control_retrigger_status(uhci, urb); - } - } - -status_stage: - td = list_entry(tmp, struct uhci_td, list); - - /* Control status stage */ - status = td_status(td); - -#ifdef I_HAVE_BUGGY_APC_BACKUPS - /* APC BackUPS Pro kludge */ - /* It tries to send all of the descriptor instead of the amount */ - /* we requested */ - if (status & TD_CTRL_IOC && /* IOC is masked out by uhci_status_bits */ - status & TD_CTRL_ACTIVE && - status & TD_CTRL_NAK) - return 0; -#endif - - status = uhci_status_bits(status); - if (status & TD_CTRL_ACTIVE) - return -EINPROGRESS; - - if (status) - goto td_error; - - return 0; - -td_error: - ret = uhci_map_status(status, uhci_packetout(td_token(td))); - -err: - if ((debug == 1 && ret != -EPIPE) || debug > 1) { - /* Some debugging code */ - dev_dbg(uhci_dev(uhci), "%s: failed with status %x\n", - __FUNCTION__, status); - - if (errbuf) { - /* Print the chain for debugging purposes */ - uhci_show_qh(urbp->qh, errbuf, ERRBUF_LEN, 0); - lprintk(errbuf); - } - } - - /* Note that the queue has stopped */ - urbp->qh->element = UHCI_PTR_TERM; - urbp->qh->is_stopped = 1; - return ret; -} - /* * Common submit for bulk and interrupt */ @@ -756,6 +700,7 @@ static int uhci_submit_common(struct uhci_hcd *uhci, struct urb *urb, int len = urb->transfer_buffer_length; dma_addr_t data = urb->transfer_dma; __le32 *plink; + struct urb_priv *urbp = urb->hcpriv; unsigned int toggle; if (len < 0) @@ -793,7 +738,7 @@ static int uhci_submit_common(struct uhci_hcd *uhci, struct urb *urb, goto nomem; *plink = cpu_to_le32(td->dma_handle); } - uhci_add_td_to_urb(urb, td); + uhci_add_td_to_urbp(td, urbp); uhci_fill_td(td, status, destination | uhci_explen(pktsze) | (toggle << TD_TOKEN_TOGGLE_SHIFT), @@ -821,7 +766,7 @@ static int uhci_submit_common(struct uhci_hcd *uhci, struct urb *urb, goto nomem; *plink = cpu_to_le32(td->dma_handle); - uhci_add_td_to_urb(urb, td); + uhci_add_td_to_urbp(td, urbp); uhci_fill_td(td, status, destination | uhci_explen(0) | (toggle << TD_TOKEN_TOGGLE_SHIFT), @@ -851,6 +796,7 @@ static int uhci_submit_common(struct uhci_hcd *uhci, struct urb *urb, wmb(); qh->dummy_td->status |= __constant_cpu_to_le32(TD_CTRL_ACTIVE); qh->dummy_td = td; + qh->period = urb->interval; usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), usb_pipeout(urb->pipe), toggle); @@ -858,119 +804,180 @@ static int uhci_submit_common(struct uhci_hcd *uhci, struct urb *urb, nomem: /* Remove the dummy TD from the td_list so it doesn't get freed */ - uhci_remove_td_from_urb(qh->dummy_td); + uhci_remove_td_from_urbp(qh->dummy_td); return -ENOMEM; } +static inline int uhci_submit_bulk(struct uhci_hcd *uhci, struct urb *urb, + struct uhci_qh *qh) +{ + int ret; + + /* Can't have low-speed bulk transfers */ + if (urb->dev->speed == USB_SPEED_LOW) + return -EINVAL; + + qh->skel = uhci->skel_bulk_qh; + ret = uhci_submit_common(uhci, urb, qh); + if (ret == 0) + uhci_add_fsbr(uhci, urb); + return ret; +} + +static int uhci_submit_interrupt(struct uhci_hcd *uhci, struct urb *urb, + struct uhci_qh *qh) +{ + int exponent; + + /* USB 1.1 interrupt transfers only involve one packet per interval. + * Drivers can submit URBs of any length, but longer ones will need + * multiple intervals to complete. + */ + + /* Figure out which power-of-two queue to use */ + for (exponent = 7; exponent >= 0; --exponent) { + if ((1 << exponent) <= urb->interval) + break; + } + if (exponent < 0) + return -EINVAL; + urb->interval = 1 << exponent; + + if (qh->period == 0) + qh->skel = uhci->skelqh[UHCI_SKEL_INDEX(exponent)]; + else if (qh->period != urb->interval) + return -EINVAL; /* Can't change the period */ + + return uhci_submit_common(uhci, urb, qh); +} + /* - * Common result for bulk and interrupt + * Fix up the data structures following a short transfer + */ +static int uhci_fixup_short_transfer(struct uhci_hcd *uhci, + struct uhci_qh *qh, struct urb_priv *urbp) +{ + struct uhci_td *td; + struct list_head *tmp; + int ret; + + td = list_entry(urbp->td_list.prev, struct uhci_td, list); + if (qh->type == USB_ENDPOINT_XFER_CONTROL) { + + /* When a control transfer is short, we have to restart + * the queue at the status stage transaction, which is + * the last TD. */ + WARN_ON(list_empty(&urbp->td_list)); + qh->element = cpu_to_le32(td->dma_handle); + tmp = td->list.prev; + ret = -EINPROGRESS; + + } else { + + /* When a bulk/interrupt transfer is short, we have to + * fix up the toggles of the following URBs on the queue + * before restarting the queue at the next URB. */ + qh->initial_toggle = uhci_toggle(td_token(qh->post_td)) ^ 1; + uhci_fixup_toggles(qh, 1); + + if (list_empty(&urbp->td_list)) + td = qh->post_td; + qh->element = td->link; + tmp = urbp->td_list.prev; + ret = 0; + } + + /* Remove all the TDs we skipped over, from tmp back to the start */ + while (tmp != &urbp->td_list) { + td = list_entry(tmp, struct uhci_td, list); + tmp = tmp->prev; + + uhci_remove_td_from_urbp(td); + uhci_free_td(uhci, td); + } + return ret; +} + +/* + * Common result for control, bulk, and interrupt */ static int uhci_result_common(struct uhci_hcd *uhci, struct urb *urb) { struct urb_priv *urbp = urb->hcpriv; - struct uhci_td *td; - unsigned int status = 0; + struct uhci_qh *qh = urbp->qh; + struct uhci_td *td, *tmp; + unsigned status; int ret = 0; - urb->actual_length = 0; - - list_for_each_entry(td, &urbp->td_list, list) { - unsigned int ctrlstat = td_status(td); + list_for_each_entry_safe(td, tmp, &urbp->td_list, list) { + unsigned int ctrlstat; + int len; + ctrlstat = td_status(td); status = uhci_status_bits(ctrlstat); if (status & TD_CTRL_ACTIVE) return -EINPROGRESS; - urb->actual_length += uhci_actual_length(ctrlstat); - - if (status) - goto td_error; + len = uhci_actual_length(ctrlstat); + urb->actual_length += len; - if (uhci_actual_length(ctrlstat) < - uhci_expected_length(td_token(td))) { - if (urb->transfer_flags & URB_SHORT_NOT_OK) { - ret = -EREMOTEIO; - goto err; + if (status) { + ret = uhci_map_status(status, + uhci_packetout(td_token(td))); + if ((debug == 1 && ret != -EPIPE) || debug > 1) { + /* Some debugging code */ + dev_dbg(&urb->dev->dev, + "%s: failed with status %x\n", + __FUNCTION__, status); + + if (debug > 1 && errbuf) { + /* Print the chain for debugging */ + uhci_show_qh(urbp->qh, errbuf, + ERRBUF_LEN, 0); + lprintk(errbuf); + } } - /* - * This URB stopped short of its end. We have to - * fix up the toggles of the following URBs on the - * queue and restart the queue. But only if this - * TD isn't the last one in the URB. - * - * Do this only the first time we encounter the - * short URB. - */ - if (!urbp->short_transfer && - &td->list != urbp->td_list.prev) { - urbp->short_transfer = 1; - urbp->qh->initial_toggle = - uhci_toggle(td_token(td)) ^ 1; - uhci_fixup_toggles(urbp->qh, 1); - - td = list_entry(urbp->td_list.prev, - struct uhci_td, list); - urbp->qh->element = td->link; - } - break; - } - } + } else if (len < uhci_expected_length(td_token(td))) { - return 0; + /* We received a short packet */ + if (urb->transfer_flags & URB_SHORT_NOT_OK) + ret = -EREMOTEIO; -td_error: - ret = uhci_map_status(status, uhci_packetout(td_token(td))); + /* Fixup needed only if this isn't the URB's last TD */ + else if (&td->list != urbp->td_list.prev) + ret = 1; + } - if ((debug == 1 && ret != -EPIPE) || debug > 1) { - /* Some debugging code */ - dev_dbg(uhci_dev(uhci), "%s: failed with status %x\n", - __FUNCTION__, status); + uhci_remove_td_from_urbp(td); + if (qh->post_td) + uhci_free_td(uhci, qh->post_td); + qh->post_td = td; - if (debug > 1 && errbuf) { - /* Print the chain for debugging purposes */ - uhci_show_qh(urbp->qh, errbuf, ERRBUF_LEN, 0); - lprintk(errbuf); - } + if (ret != 0) + goto err; } -err: - - /* Note that the queue has stopped and save the next toggle value */ - urbp->qh->element = UHCI_PTR_TERM; - urbp->qh->is_stopped = 1; - urbp->qh->needs_fixup = 1; - urbp->qh->initial_toggle = uhci_toggle(td_token(td)) ^ - (ret == -EREMOTEIO); return ret; -} - -static inline int uhci_submit_bulk(struct uhci_hcd *uhci, struct urb *urb, - struct uhci_qh *qh) -{ - int ret; - - /* Can't have low-speed bulk transfers */ - if (urb->dev->speed == USB_SPEED_LOW) - return -EINVAL; - qh->skel = uhci->skel_bulk_qh; - ret = uhci_submit_common(uhci, urb, qh); - if (ret == 0) - uhci_inc_fsbr(uhci, urb); +err: + if (ret < 0) { + /* In case a control transfer gets an error + * during the setup stage */ + urb->actual_length = max(urb->actual_length, 0); + + /* Note that the queue has stopped and save + * the next toggle value */ + qh->element = UHCI_PTR_TERM; + qh->is_stopped = 1; + qh->needs_fixup = (qh->type != USB_ENDPOINT_XFER_CONTROL); + qh->initial_toggle = uhci_toggle(td_token(td)) ^ + (ret == -EREMOTEIO); + + } else /* Short packet received */ + ret = uhci_fixup_short_transfer(uhci, qh, urbp); return ret; } -static inline int uhci_submit_interrupt(struct uhci_hcd *uhci, struct urb *urb, - struct uhci_qh *qh) -{ - /* USB 1.1 interrupt transfers only involve one packet per interval. - * Drivers can submit URBs of any length, but longer ones will need - * multiple intervals to complete. - */ - qh->skel = uhci->skelqh[__interval_to_skel(urb->interval)]; - return uhci_submit_common(uhci, urb, qh); -} - /* * Isochronous transfers */ @@ -982,38 +989,57 @@ static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb, unsigned long destination, status; struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv; - if (urb->number_of_packets > 900) /* 900? Why? */ + /* Values must not be too big (could overflow below) */ + if (urb->interval >= UHCI_NUMFRAMES || + urb->number_of_packets >= UHCI_NUMFRAMES) return -EFBIG; - status = TD_CTRL_ACTIVE | TD_CTRL_IOS; - destination = (urb->pipe & PIPE_DEVEP_MASK) | usb_packetid(urb->pipe); - - /* Figure out the starting frame number */ - if (urb->transfer_flags & URB_ISO_ASAP) { - if (list_empty(&qh->queue)) { + /* Check the period and figure out the starting frame number */ + if (qh->period == 0) { + if (urb->transfer_flags & URB_ISO_ASAP) { uhci_get_current_frame_number(uhci); - urb->start_frame = (uhci->frame_number + 10); + urb->start_frame = uhci->frame_number + 10; + } else { + i = urb->start_frame - uhci->last_iso_frame; + if (i <= 0 || i >= UHCI_NUMFRAMES) + return -EINVAL; + } + } else if (qh->period != urb->interval) { + return -EINVAL; /* Can't change the period */ - } else { /* Go right after the last one */ - struct urb *last_urb; + } else { /* Pick up where the last URB leaves off */ + if (list_empty(&qh->queue)) { + frame = qh->iso_frame; + } else { + struct urb *lurb; - last_urb = list_entry(qh->queue.prev, + lurb = list_entry(qh->queue.prev, struct urb_priv, node)->urb; - urb->start_frame = (last_urb->start_frame + - last_urb->number_of_packets * - last_urb->interval); + frame = lurb->start_frame + + lurb->number_of_packets * + lurb->interval; } - } else { - /* FIXME: Sanity check */ + if (urb->transfer_flags & URB_ISO_ASAP) + urb->start_frame = frame; + else if (urb->start_frame != frame) + return -EINVAL; } - urb->start_frame &= (UHCI_NUMFRAMES - 1); + + /* Make sure we won't have to go too far into the future */ + if (uhci_frame_before_eq(uhci->last_iso_frame + UHCI_NUMFRAMES, + urb->start_frame + urb->number_of_packets * + urb->interval)) + return -EFBIG; + + status = TD_CTRL_ACTIVE | TD_CTRL_IOS; + destination = (urb->pipe & PIPE_DEVEP_MASK) | usb_packetid(urb->pipe); for (i = 0; i < urb->number_of_packets; i++) { td = uhci_alloc_td(uhci); if (!td) return -ENOMEM; - uhci_add_td_to_urb(urb, td); + uhci_add_td_to_urbp(td, urbp); uhci_fill_td(td, status, destination | uhci_explen(urb->iso_frame_desc[i].length), urb->transfer_dma + @@ -1024,12 +1050,19 @@ static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb, td->status |= __constant_cpu_to_le32(TD_CTRL_IOC); qh->skel = uhci->skel_iso_qh; + qh->period = urb->interval; /* Add the TDs to the frame list */ frame = urb->start_frame; list_for_each_entry(td, &urbp->td_list, list) { uhci_insert_td_in_frame_list(uhci, td, frame); - frame += urb->interval; + frame += qh->period; + } + + if (list_empty(&qh->queue)) { + qh->iso_packet_desc = &urb->iso_frame_desc[0]; + qh->iso_frame = urb->start_frame; + qh->iso_status = 0; } return 0; @@ -1037,37 +1070,44 @@ static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb, static int uhci_result_isochronous(struct uhci_hcd *uhci, struct urb *urb) { - struct uhci_td *td; - struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv; - int status; - int i, ret = 0; - - urb->actual_length = urb->error_count = 0; + struct uhci_td *td, *tmp; + struct urb_priv *urbp = urb->hcpriv; + struct uhci_qh *qh = urbp->qh; - i = 0; - list_for_each_entry(td, &urbp->td_list, list) { + list_for_each_entry_safe(td, tmp, &urbp->td_list, list) { + unsigned int ctrlstat; + int status; int actlength; - unsigned int ctrlstat = td_status(td); - if (ctrlstat & TD_CTRL_ACTIVE) + if (uhci_frame_before_eq(uhci->cur_iso_frame, qh->iso_frame)) return -EINPROGRESS; - actlength = uhci_actual_length(ctrlstat); - urb->iso_frame_desc[i].actual_length = actlength; - urb->actual_length += actlength; + uhci_remove_tds_from_frame(uhci, qh->iso_frame); + + ctrlstat = td_status(td); + if (ctrlstat & TD_CTRL_ACTIVE) { + status = -EXDEV; /* TD was added too late? */ + } else { + status = uhci_map_status(uhci_status_bits(ctrlstat), + usb_pipeout(urb->pipe)); + actlength = uhci_actual_length(ctrlstat); + + urb->actual_length += actlength; + qh->iso_packet_desc->actual_length = actlength; + qh->iso_packet_desc->status = status; + } - status = uhci_map_status(uhci_status_bits(ctrlstat), - usb_pipeout(urb->pipe)); - urb->iso_frame_desc[i].status = status; if (status) { urb->error_count++; - ret = status; + qh->iso_status = status; } - i++; + uhci_remove_td_from_urbp(td); + uhci_free_td(uhci, td); + qh->iso_frame += qh->period; + ++qh->iso_packet_desc; } - - return ret; + return qh->iso_status; } static int uhci_urb_enqueue(struct usb_hcd *hcd, @@ -1101,14 +1141,14 @@ static int uhci_urb_enqueue(struct usb_hcd *hcd, } urbp->qh = qh; - switch (usb_pipetype(urb->pipe)) { - case PIPE_CONTROL: + switch (qh->type) { + case USB_ENDPOINT_XFER_CONTROL: ret = uhci_submit_control(uhci, urb, qh); break; - case PIPE_BULK: + case USB_ENDPOINT_XFER_BULK: ret = uhci_submit_bulk(uhci, urb, qh); break; - case PIPE_INTERRUPT: + case USB_ENDPOINT_XFER_INT: if (list_empty(&qh->queue)) { bustime = usb_check_bandwidth(urb->dev, urb); if (bustime < 0) @@ -1127,7 +1167,8 @@ static int uhci_urb_enqueue(struct usb_hcd *hcd, ret = uhci_submit_interrupt(uhci, urb, qh); } break; - case PIPE_ISOCHRONOUS: + case USB_ENDPOINT_XFER_ISOC: + urb->error_count = 0; bustime = usb_check_bandwidth(urb->dev, urb); if (bustime < 0) { ret = bustime; @@ -1148,9 +1189,12 @@ static int uhci_urb_enqueue(struct usb_hcd *hcd, /* If the new URB is the first and only one on this QH then either * the QH is new and idle or else it's unlinked and waiting to - * become idle, so we can activate it right away. */ - if (qh->queue.next == &urbp->node) + * become idle, so we can activate it right away. But only if the + * queue isn't stopped. */ + if (qh->queue.next == &urbp->node && !qh->is_stopped) { uhci_activate_qh(uhci, qh); + uhci_urbp_wants_fsbr(uhci, urbp); + } goto done; err_submit_failed: @@ -1170,16 +1214,26 @@ static int uhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb) struct uhci_hcd *uhci = hcd_to_uhci(hcd); unsigned long flags; struct urb_priv *urbp; + struct uhci_qh *qh; spin_lock_irqsave(&uhci->lock, flags); urbp = urb->hcpriv; if (!urbp) /* URB was never linked! */ goto done; + qh = urbp->qh; /* Remove Isochronous TDs from the frame list ASAP */ - if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) + if (qh->type == USB_ENDPOINT_XFER_ISOC) { uhci_unlink_isochronous_tds(uhci, urb); - uhci_unlink_qh(uhci, urbp->qh); + mb(); + + /* If the URB has already started, update the QH unlink time */ + uhci_get_current_frame_number(uhci); + if (uhci_frame_before_eq(urb->start_frame, uhci->frame_number)) + qh->unlink_frame = uhci->frame_number; + } + + uhci_unlink_qh(uhci, qh); done: spin_unlock_irqrestore(&uhci->lock, flags); @@ -1196,22 +1250,17 @@ __acquires(uhci->lock) { struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv; - /* Isochronous TDs get unlinked directly from the frame list */ - if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) - uhci_unlink_isochronous_tds(uhci, urb); - - /* If the URB isn't first on its queue, adjust the link pointer - * of the last TD in the previous URB. */ - else if (qh->queue.next != &urbp->node) { - struct urb_priv *purbp; - struct uhci_td *ptd, *ltd; - - purbp = list_entry(urbp->node.prev, struct urb_priv, node); - ptd = list_entry(purbp->td_list.prev, struct uhci_td, - list); - ltd = list_entry(urbp->td_list.prev, struct uhci_td, - list); - ptd->link = ltd->link; + /* When giving back the first URB in an Isochronous queue, + * reinitialize the QH's iso-related members for the next URB. */ + if (qh->type == USB_ENDPOINT_XFER_ISOC && + urbp->node.prev == &qh->queue && + urbp->node.next != &qh->queue) { + struct urb *nurb = list_entry(urbp->node.next, + struct urb_priv, node)->urb; + + qh->iso_packet_desc = &nurb->iso_frame_desc[0]; + qh->iso_frame = nurb->start_frame; + qh->iso_status = 0; } /* Take the URB off the QH's queue. If the queue is now empty, @@ -1223,16 +1272,15 @@ __acquires(uhci->lock) qh->needs_fixup = 0; } - uhci_dec_fsbr(uhci, urb); /* Safe since it checks */ uhci_free_urb_priv(uhci, urbp); - switch (usb_pipetype(urb->pipe)) { - case PIPE_ISOCHRONOUS: + switch (qh->type) { + case USB_ENDPOINT_XFER_ISOC: /* Release bandwidth for Interrupt or Isoc. transfers */ if (urb->bandwidth) usb_release_bandwidth(urb->dev, urb, 1); break; - case PIPE_INTERRUPT: + case USB_ENDPOINT_XFER_INT: /* Release bandwidth for Interrupt or Isoc. transfers */ /* Make sure we don't release if we have a queued URB */ if (list_empty(&qh->queue) && urb->bandwidth) @@ -1254,6 +1302,7 @@ __acquires(uhci->lock) uhci_unlink_qh(uhci, qh); /* Bandwidth stuff not yet implemented */ + qh->period = 0; } } @@ -1275,17 +1324,10 @@ static void uhci_scan_qh(struct uhci_hcd *uhci, struct uhci_qh *qh, urbp = list_entry(qh->queue.next, struct urb_priv, node); urb = urbp->urb; - switch (usb_pipetype(urb->pipe)) { - case PIPE_CONTROL: - status = uhci_result_control(uhci, urb); - break; - case PIPE_ISOCHRONOUS: + if (qh->type == USB_ENDPOINT_XFER_ISOC) status = uhci_result_isochronous(uhci, urb); - break; - default: /* PIPE_BULK or PIPE_INTERRUPT */ + else status = uhci_result_common(uhci, urb); - break; - } if (status == -EINPROGRESS) break; @@ -1293,31 +1335,43 @@ static void uhci_scan_qh(struct uhci_hcd *uhci, struct uhci_qh *qh, if (urb->status == -EINPROGRESS) /* Not dequeued */ urb->status = status; else - status = -ECONNRESET; + status = ECONNRESET; /* Not -ECONNRESET */ spin_unlock(&urb->lock); /* Dequeued but completed URBs can't be given back unless * the QH is stopped or has finished unlinking. */ - if (status == -ECONNRESET && - !(qh->is_stopped || QH_FINISHED_UNLINKING(qh))) - return; + if (status == ECONNRESET) { + if (QH_FINISHED_UNLINKING(qh)) + qh->is_stopped = 1; + else if (!qh->is_stopped) + return; + } uhci_giveback_urb(uhci, qh, urb, regs); - if (qh->is_stopped) + if (status < 0 && qh->type != USB_ENDPOINT_XFER_ISOC) break; } /* If the QH is neither stopped nor finished unlinking (normal case), * our work here is done. */ - restart: - if (!(qh->is_stopped || QH_FINISHED_UNLINKING(qh))) + if (QH_FINISHED_UNLINKING(qh)) + qh->is_stopped = 1; + else if (!qh->is_stopped) return; /* Otherwise give back each of the dequeued URBs */ +restart: list_for_each_entry(urbp, &qh->queue, node) { urb = urbp->urb; if (urb->status != -EINPROGRESS) { - uhci_save_toggle(qh, urb); + + /* Fix up the TD links and save the toggles for + * non-Isochronous queues. For Isochronous queues, + * test for too-recent dequeues. */ + if (!uhci_cleanup_queue(uhci, qh, urb)) { + qh->is_stopped = 0; + return; + } uhci_giveback_urb(uhci, qh, urb, regs); goto restart; } @@ -1329,6 +1383,18 @@ static void uhci_scan_qh(struct uhci_hcd *uhci, struct uhci_qh *qh, if (!list_empty(&qh->queue)) { if (qh->needs_fixup) uhci_fixup_toggles(qh, 0); + + /* If the first URB on the queue wants FSBR but its time + * limit has expired, set the next TD to interrupt on + * completion before reactivating the QH. */ + urbp = list_entry(qh->queue.next, struct urb_priv, node); + if (urbp->fsbr && qh->wait_expired) { + struct uhci_td *td = list_entry(urbp->td_list.next, + struct uhci_td, list); + + td->status |= __cpu_to_le32(TD_CTRL_IOC); + } + uhci_activate_qh(uhci, qh); } @@ -1338,15 +1404,84 @@ static void uhci_scan_qh(struct uhci_hcd *uhci, struct uhci_qh *qh, uhci_make_qh_idle(uhci, qh); } -static void uhci_free_pending_tds(struct uhci_hcd *uhci) +/* + * Check for queues that have made some forward progress. + * Returns 0 if the queue is not Isochronous, is ACTIVE, and + * has not advanced since last examined; 1 otherwise. + * + * Early Intel controllers have a bug which causes qh->element sometimes + * not to advance when a TD completes successfully. The queue remains + * stuck on the inactive completed TD. We detect such cases and advance + * the element pointer by hand. + */ +static int uhci_advance_check(struct uhci_hcd *uhci, struct uhci_qh *qh) { - struct uhci_td *td, *tmp; + struct urb_priv *urbp = NULL; + struct uhci_td *td; + int ret = 1; + unsigned status; - list_for_each_entry_safe(td, tmp, &uhci->td_remove_list, remove_list) { - list_del_init(&td->remove_list); + if (qh->type == USB_ENDPOINT_XFER_ISOC) + goto done; - uhci_free_td(uhci, td); + /* Treat an UNLINKING queue as though it hasn't advanced. + * This is okay because reactivation will treat it as though + * it has advanced, and if it is going to become IDLE then + * this doesn't matter anyway. Furthermore it's possible + * for an UNLINKING queue not to have any URBs at all, or + * for its first URB not to have any TDs (if it was dequeued + * just as it completed). So it's not easy in any case to + * test whether such queues have advanced. */ + if (qh->state != QH_STATE_ACTIVE) { + urbp = NULL; + status = 0; + + } else { + urbp = list_entry(qh->queue.next, struct urb_priv, node); + td = list_entry(urbp->td_list.next, struct uhci_td, list); + status = td_status(td); + if (!(status & TD_CTRL_ACTIVE)) { + + /* We're okay, the queue has advanced */ + qh->wait_expired = 0; + qh->advance_jiffies = jiffies; + goto done; + } + ret = 0; + } + + /* The queue hasn't advanced; check for timeout */ + if (qh->wait_expired) + goto done; + + if (time_after(jiffies, qh->advance_jiffies + QH_WAIT_TIMEOUT)) { + + /* Detect the Intel bug and work around it */ + if (qh->post_td && qh_element(qh) == + cpu_to_le32(qh->post_td->dma_handle)) { + qh->element = qh->post_td->link; + qh->advance_jiffies = jiffies; + ret = 1; + goto done; + } + + qh->wait_expired = 1; + + /* If the current URB wants FSBR, unlink it temporarily + * so that we can safely set the next TD to interrupt on + * completion. That way we'll know as soon as the queue + * starts moving again. */ + if (urbp && urbp->fsbr && !(status & TD_CTRL_IOC)) + uhci_unlink_qh(uhci, qh); + + } else { + /* Unmoving but not-yet-expired queues keep FSBR alive */ + if (urbp) + uhci_urbp_wants_fsbr(uhci, urbp); } + +done: + return ret; } /* @@ -1363,14 +1498,13 @@ static void uhci_scan_schedule(struct uhci_hcd *uhci, struct pt_regs *regs) return; } uhci->scan_in_progress = 1; - rescan: +rescan: uhci->need_rescan = 0; + uhci->fsbr_is_wanted = 0; uhci_clear_next_interrupt(uhci); uhci_get_current_frame_number(uhci); - - if (uhci->frame_number + uhci->is_stopped != uhci->td_remove_age) - uhci_free_pending_tds(uhci); + uhci->cur_iso_frame = uhci->frame_number; /* Go through all the QH queues and process the URBs in each one */ for (i = 0; i < UHCI_NUM_SKELQH - 1; ++i) { @@ -1379,33 +1513,30 @@ static void uhci_scan_schedule(struct uhci_hcd *uhci, struct pt_regs *regs) while ((qh = uhci->next_qh) != uhci->skelqh[i]) { uhci->next_qh = list_entry(qh->node.next, struct uhci_qh, node); - uhci_scan_qh(uhci, qh, regs); + + if (uhci_advance_check(uhci, qh)) { + uhci_scan_qh(uhci, qh, regs); + if (qh->state == QH_STATE_ACTIVE) { + uhci_urbp_wants_fsbr(uhci, + list_entry(qh->queue.next, struct urb_priv, node)); + } + } } } + uhci->last_iso_frame = uhci->cur_iso_frame; if (uhci->need_rescan) goto rescan; uhci->scan_in_progress = 0; - /* If the controller is stopped, we can finish these off right now */ - if (uhci->is_stopped) - uhci_free_pending_tds(uhci); + if (uhci->fsbr_is_on && !uhci->fsbr_is_wanted && + !uhci->fsbr_expiring) { + uhci->fsbr_expiring = 1; + mod_timer(&uhci->fsbr_timer, jiffies + FSBR_OFF_DELAY); + } - if (list_empty(&uhci->td_remove_list) && - list_empty(&uhci->skel_unlink_qh->node)) + if (list_empty(&uhci->skel_unlink_qh->node)) uhci_clear_next_interrupt(uhci); else uhci_set_next_interrupt(uhci); } - -static void check_fsbr(struct uhci_hcd *uhci) -{ - /* For now, don't scan URBs for FSBR timeouts. - * Add it back in later... */ - - /* Really disable FSBR */ - if (!uhci->fsbr && uhci->fsbrtimeout && time_after_eq(jiffies, uhci->fsbrtimeout)) { - uhci->fsbrtimeout = 0; - uhci->skel_term_qh->link = UHCI_PTR_TERM; - } -} diff --git a/drivers/usb/image/microtek.c b/drivers/usb/image/microtek.c index 2a0e18a48..b2bafc37c 100644 --- a/drivers/usb/image/microtek.c +++ b/drivers/usb/image/microtek.c @@ -513,7 +513,7 @@ static void mts_do_sg (struct urb* transfer, struct pt_regs *regs) mts_transfer_cleanup(transfer); } - sg = context->srb->buffer; + sg = context->srb->request_buffer; context->fragment++; mts_int_submit_urb(transfer, context->data_pipe, @@ -549,19 +549,19 @@ mts_build_transfer_context( Scsi_Cmnd *srb, struct mts_desc* desc ) desc->context.fragment = 0; if (!srb->use_sg) { - if ( !srb->bufflen ){ + if ( !srb->request_bufflen ){ desc->context.data = NULL; desc->context.data_length = 0; return; } else { - desc->context.data = srb->buffer; - desc->context.data_length = srb->bufflen; + desc->context.data = srb->request_buffer; + desc->context.data_length = srb->request_bufflen; MTS_DEBUG("length = %d or %d\n", srb->request_bufflen, srb->bufflen); } } else { MTS_DEBUG("Using scatter/gather\n"); - sg = srb->buffer; + sg = srb->request_buffer; desc->context.data = page_address(sg[0].page) + sg[0].offset; desc->context.data_length = sg[0].length; } diff --git a/drivers/usb/input/acecad.c b/drivers/usb/input/acecad.c index df29b8078..18c10e150 100644 --- a/drivers/usb/input/acecad.c +++ b/drivers/usb/input/acecad.c @@ -27,11 +27,9 @@ #include #include -#include #include #include -#include -#include +#include /* * Version Information diff --git a/drivers/usb/input/aiptek.c b/drivers/usb/input/aiptek.c index a6693b0d1..b138dae2b 100644 --- a/drivers/usb/input/aiptek.c +++ b/drivers/usb/input/aiptek.c @@ -73,11 +73,9 @@ #include #include #include -#include #include #include -#include -#include +#include #include #include #include diff --git a/drivers/usb/input/appletouch.c b/drivers/usb/input/appletouch.c index a80dfb2f3..044faa07e 100644 --- a/drivers/usb/input/appletouch.c +++ b/drivers/usb/input/appletouch.c @@ -1,11 +1,13 @@ /* - * Apple USB Touchpad (for post-February 2005 PowerBooks) driver + * Apple USB Touchpad (for post-February 2005 PowerBooks and MacBooks) driver * * Copyright (C) 2001-2004 Greg Kroah-Hartman (greg@kroah.com) * Copyright (C) 2005 Johannes Berg (johannes@sipsolutions.net) * Copyright (C) 2005 Stelian Pop (stelian@popies.net) * Copyright (C) 2005 Frank Arnold (frank@scirocco-5v-turbo.de) * Copyright (C) 2005 Peter Osterlund (petero2@telia.com) + * Copyright (C) 2005 Michael Hanselmann (linux-kernel@hansmi.ch) + * Copyright (C) 2006 Nicolas Boichat (nicolas@boichat.ch) * * Thanks to Alex Harper for his inputs. * @@ -25,26 +27,28 @@ * */ -#include #include #include #include #include #include -#include -#include +#include /* Apple has powerbooks which have the keyboard with different Product IDs */ #define APPLE_VENDOR_ID 0x05AC -#define ATP_12INCH_ID1 0x030A -#define ATP_15INCH_ID1 0x020E -#define ATP_15INCH_ID2 0x020F -#define ATP_17INCH_ID1 0xFFFF /* XXX need a tester !!! */ -#define ATP_DRIVER_VERSION 0x0007 /* 00.07 */ +/* These names come from Info.plist in AppleUSBTrackpad.kext */ +#define GEYSER_ANSI_PRODUCT_ID 0x0214 +#define GEYSER_ISO_PRODUCT_ID 0x0215 +#define GEYSER_JIS_PRODUCT_ID 0x0216 + +/* MacBook devices */ +#define GEYSER3_ANSI_PRODUCT_ID 0x0217 +#define GEYSER3_ISO_PRODUCT_ID 0x0218 +#define GEYSER3_JIS_PRODUCT_ID 0x0219 #define ATP_DEVICE(prod) \ - .match_flags = USB_DEVICE_ID_MATCH_DEVICE | \ + .match_flags = USB_DEVICE_ID_MATCH_DEVICE | \ USB_DEVICE_ID_MATCH_INT_CLASS | \ USB_DEVICE_ID_MATCH_INT_PROTOCOL, \ .idVendor = APPLE_VENDOR_ID, \ @@ -54,20 +58,25 @@ /* table of devices that work with this driver */ static struct usb_device_id atp_table [] = { - { ATP_DEVICE(ATP_12INCH_ID1) }, - { ATP_DEVICE(ATP_15INCH_ID1) }, - { ATP_DEVICE(ATP_15INCH_ID2) }, -#if 0 - Disabled until someone gives us the real USB id and tests the driver - { ATP_DEVICE(ATP_17INCH_ID1) }, -#endif - { } /* Terminating entry */ + { ATP_DEVICE(0x020E) }, + { ATP_DEVICE(0x020F) }, + { ATP_DEVICE(0x030A) }, + { ATP_DEVICE(0x030B) }, + + /* PowerBooks Oct 2005 */ + { ATP_DEVICE(GEYSER_ANSI_PRODUCT_ID) }, + { ATP_DEVICE(GEYSER_ISO_PRODUCT_ID) }, + { ATP_DEVICE(GEYSER_JIS_PRODUCT_ID) }, + + { ATP_DEVICE(GEYSER3_ANSI_PRODUCT_ID) }, + { ATP_DEVICE(GEYSER3_ISO_PRODUCT_ID) }, + { ATP_DEVICE(GEYSER3_JIS_PRODUCT_ID) }, + + /* Terminating entry */ + { } }; MODULE_DEVICE_TABLE (usb, atp_table); -/* size of a USB urb transfer */ -#define ATP_DATASIZE 81 - /* * number of sensors. Note that only 16 instead of 26 X (horizontal) * sensors exist on 12" and 15" PowerBooks. All models have 16 Y @@ -86,9 +95,9 @@ MODULE_DEVICE_TABLE (usb, atp_table); * We try to keep the touchpad aspect ratio while still doing only simple * arithmetics. * The factors below give coordinates like: - * 0 <= x < 960 on 12" and 15" Powerbooks - * 0 <= x < 1600 on 17" Powerbooks - * 0 <= y < 646 + * 0 <= x < 960 on 12" and 15" Powerbooks + * 0 <= x < 1600 on 17" Powerbooks + * 0 <= y < 646 */ #define ATP_XFACT 64 #define ATP_YFACT 43 @@ -99,13 +108,21 @@ MODULE_DEVICE_TABLE (usb, atp_table); */ #define ATP_THRESHOLD 5 +/* MacBook Pro (Geyser 3) initialization constants */ +#define ATP_GEYSER3_MODE_READ_REQUEST_ID 1 +#define ATP_GEYSER3_MODE_WRITE_REQUEST_ID 9 +#define ATP_GEYSER3_MODE_REQUEST_VALUE 0x300 +#define ATP_GEYSER3_MODE_REQUEST_INDEX 0 +#define ATP_GEYSER3_MODE_VENDOR_VALUE 0x04 + /* Structure to hold all of our device specific stuff */ struct atp { + char phys[64]; struct usb_device * udev; /* usb device */ struct urb * urb; /* usb request block */ signed char * data; /* transferred data */ int open; /* non-zero if opened */ - struct input_dev input; /* input dev */ + struct input_dev *input; /* input dev */ int valid; /* are the sensors valid ? */ int x_old; /* last reported x/y, */ int y_old; /* used for smoothing */ @@ -115,6 +132,8 @@ struct atp { signed char xy_old[ATP_XSENSORS + ATP_YSENSORS]; /* accumulated sensors */ int xy_acc[ATP_XSENSORS + ATP_YSENSORS]; + int overflowwarn; /* overflow warning printed? */ + int datalen; /* size of an USB urb transfer */ }; #define dbg_dump(msg, tab) \ @@ -122,16 +141,16 @@ struct atp { int i; \ printk("appletouch: %s %lld", msg, (long long)jiffies); \ for (i = 0; i < ATP_XSENSORS + ATP_YSENSORS; i++) \ - printk("%02x ", tab[i]); \ - printk("\n"); \ + printk(" %02x", tab[i]); \ + printk("\n"); \ } -#define dprintk(format, a...) \ +#define dprintk(format, a...) \ do { \ if (debug) printk(format, ##a); \ } while (0) -MODULE_AUTHOR("Johannes Berg, Stelian Pop, Frank Arnold"); +MODULE_AUTHOR("Johannes Berg, Stelian Pop, Frank Arnold, Michael Hanselmann"); MODULE_DESCRIPTION("Apple PowerBooks USB touchpad driver"); MODULE_LICENSE("GPL"); @@ -139,6 +158,25 @@ static int debug = 1; module_param(debug, int, 0644); MODULE_PARM_DESC(debug, "Activate debugging output"); +/* Checks if the device a Geyser 2 (ANSI, ISO, JIS) */ +static inline int atp_is_geyser_2(struct atp *dev) +{ + u16 productId = le16_to_cpu(dev->udev->descriptor.idProduct); + + return (productId == GEYSER_ANSI_PRODUCT_ID) || + (productId == GEYSER_ISO_PRODUCT_ID) || + (productId == GEYSER_JIS_PRODUCT_ID); +} + +static inline int atp_is_geyser_3(struct atp *dev) +{ + u16 productId = le16_to_cpu(dev->udev->descriptor.idProduct); + + return (productId == GEYSER3_ANSI_PRODUCT_ID) || + (productId == GEYSER3_ISO_PRODUCT_ID) || + (productId == GEYSER3_JIS_PRODUCT_ID); +} + static int atp_calculate_abs(int *xy_sensors, int nb_sensors, int fact, int *z, int *fingers) { @@ -175,13 +213,20 @@ static inline void atp_report_fingers(struct input_dev *input, int fingers) static void atp_complete(struct urb* urb, struct pt_regs* regs) { int x, y, x_z, y_z, x_f, y_f; - int retval, i; + int retval, i, j; struct atp *dev = urb->context; switch (urb->status) { case 0: /* success */ break; + case -EOVERFLOW: + if(!dev->overflowwarn) { + printk("appletouch: OVERFLOW with data " + "length %d, actual length is %d\n", + dev->datalen, dev->urb->actual_length); + dev->overflowwarn = 1; + } case -ECONNRESET: case -ENOENT: case -ESHUTDOWN: @@ -196,23 +241,66 @@ static void atp_complete(struct urb* urb, struct pt_regs* regs) } /* drop incomplete datasets */ - if (dev->urb->actual_length != ATP_DATASIZE) { - dprintk("appletouch: incomplete data package.\n"); + if (dev->urb->actual_length != dev->datalen) { + dprintk("appletouch: incomplete data package" + " (first byte: %d, length: %d).\n", + dev->data[0], dev->urb->actual_length); goto exit; } /* reorder the sensors values */ - for (i = 0; i < 8; i++) { - /* X values */ - dev->xy_cur[i ] = dev->data[5 * i + 2]; - dev->xy_cur[i + 8] = dev->data[5 * i + 4]; - dev->xy_cur[i + 16] = dev->data[5 * i + 42]; - if (i < 2) - dev->xy_cur[i + 24] = dev->data[5 * i + 44]; - - /* Y values */ - dev->xy_cur[i + 26] = dev->data[5 * i + 1]; - dev->xy_cur[i + 34] = dev->data[5 * i + 3]; + if (atp_is_geyser_3(dev)) { + memset(dev->xy_cur, 0, sizeof(dev->xy_cur)); + + /* + * The values are laid out like this: + * -, Y1, Y2, -, Y3, Y4, -, ..., -, X1, X2, -, X3, X4, ... + * '-' is an unused value. + */ + + /* read X values */ + for (i = 0, j = 19; i < 20; i += 2, j += 3) { + dev->xy_cur[i] = dev->data[j + 1]; + dev->xy_cur[i + 1] = dev->data[j + 2]; + } + /* read Y values */ + for (i = 0, j = 1; i < 9; i += 2, j += 3) { + dev->xy_cur[ATP_XSENSORS + i] = dev->data[j + 1]; + dev->xy_cur[ATP_XSENSORS + i + 1] = dev->data[j + 2]; + } + } else if (atp_is_geyser_2(dev)) { + memset(dev->xy_cur, 0, sizeof(dev->xy_cur)); + + /* + * The values are laid out like this: + * Y1, Y2, -, Y3, Y4, -, ..., X1, X2, -, X3, X4, -, ... + * '-' is an unused value. + */ + + /* read X values */ + for (i = 0, j = 19; i < 20; i += 2, j += 3) { + dev->xy_cur[i] = dev->data[j]; + dev->xy_cur[i + 1] = dev->data[j + 1]; + } + + /* read Y values */ + for (i = 0, j = 1; i < 9; i += 2, j += 3) { + dev->xy_cur[ATP_XSENSORS + i] = dev->data[j]; + dev->xy_cur[ATP_XSENSORS + i + 1] = dev->data[j + 1]; + } + } else { + for (i = 0; i < 8; i++) { + /* X values */ + dev->xy_cur[i ] = dev->data[5 * i + 2]; + dev->xy_cur[i + 8] = dev->data[5 * i + 4]; + dev->xy_cur[i + 16] = dev->data[5 * i + 42]; + if (i < 2) + dev->xy_cur[i + 24] = dev->data[5 * i + 44]; + + /* Y values */ + dev->xy_cur[i + 26] = dev->data[5 * i + 1]; + dev->xy_cur[i + 34] = dev->data[5 * i + 3]; + } } dbg_dump("sample", dev->xy_cur); @@ -222,6 +310,29 @@ static void atp_complete(struct urb* urb, struct pt_regs* regs) dev->valid = 1; dev->x_old = dev->y_old = -1; memcpy(dev->xy_old, dev->xy_cur, sizeof(dev->xy_old)); + + if (atp_is_geyser_3(dev)) /* No 17" Macbooks (yet) */ + goto exit; + + /* 17" Powerbooks have extra X sensors */ + for (i = (atp_is_geyser_2(dev)?15:16); i < ATP_XSENSORS; i++) { + if (!dev->xy_cur[i]) continue; + + printk("appletouch: 17\" model detected.\n"); + if(atp_is_geyser_2(dev)) + input_set_abs_params(dev->input, ABS_X, 0, + (20 - 1) * + ATP_XFACT - 1, + ATP_FUZZ, 0); + else + input_set_abs_params(dev->input, ABS_X, 0, + (ATP_XSENSORS - 1) * + ATP_XFACT - 1, + ATP_FUZZ, 0); + + break; + } + goto exit; } @@ -256,12 +367,12 @@ static void atp_complete(struct urb* urb, struct pt_regs* regs) "Xz: %3d Yz: %3d\n", x, y, x_z, y_z); - input_report_key(&dev->input, BTN_TOUCH, 1); - input_report_abs(&dev->input, ABS_X, x); - input_report_abs(&dev->input, ABS_Y, y); - input_report_abs(&dev->input, ABS_PRESSURE, + input_report_key(dev->input, BTN_TOUCH, 1); + input_report_abs(dev->input, ABS_X, x); + input_report_abs(dev->input, ABS_Y, y); + input_report_abs(dev->input, ABS_PRESSURE, min(ATP_PRESSURE, x_z + y_z)); - atp_report_fingers(&dev->input, max(x_f, y_f)); + atp_report_fingers(dev->input, max(x_f, y_f)); } dev->x_old = x; dev->y_old = y; @@ -269,17 +380,18 @@ static void atp_complete(struct urb* urb, struct pt_regs* regs) else if (!x && !y) { dev->x_old = dev->y_old = -1; - input_report_key(&dev->input, BTN_TOUCH, 0); - input_report_abs(&dev->input, ABS_PRESSURE, 0); - atp_report_fingers(&dev->input, 0); + input_report_key(dev->input, BTN_TOUCH, 0); + input_report_abs(dev->input, ABS_PRESSURE, 0); + atp_report_fingers(dev->input, 0); /* reset the accumulator on release */ memset(dev->xy_acc, 0, sizeof(dev->xy_acc)); } - input_report_key(&dev->input, BTN_LEFT, !!dev->data[80]); + input_report_key(dev->input, BTN_LEFT, + !!dev->data[dev->datalen - 1]); - input_sync(&dev->input); + input_sync(dev->input); exit: retval = usb_submit_urb(dev->urb, GFP_ATOMIC); @@ -310,21 +422,14 @@ static void atp_close(struct input_dev *input) static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id) { - struct atp *dev = NULL; + struct atp *dev; + struct input_dev *input_dev; + struct usb_device *udev = interface_to_usbdev(iface); struct usb_host_interface *iface_desc; struct usb_endpoint_descriptor *endpoint; int int_in_endpointAddr = 0; int i, retval = -ENOMEM; - /* allocate memory for our device state and initialize it */ - dev = kmalloc(sizeof(struct atp), GFP_KERNEL); - if (dev == NULL) { - err("Out of memory"); - goto err_kmalloc; - } - memset(dev, 0, sizeof(struct atp)); - - dev->udev = interface_to_usbdev(iface); /* set up the endpoint information */ /* use only the first interrupt-in endpoint */ @@ -341,76 +446,146 @@ static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id } } if (!int_in_endpointAddr) { - retval = -EIO; err("Could not find int-in endpoint"); - goto err_endpoint; + return -EIO; } - /* save our data pointer in this interface device */ - usb_set_intfdata(iface, dev); + /* allocate memory for our device state and initialize it */ + dev = kzalloc(sizeof(struct atp), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!dev || !input_dev) { + err("Out of memory"); + goto err_free_devs; + } + + dev->udev = udev; + dev->input = input_dev; + dev->overflowwarn = 0; + if (atp_is_geyser_3(dev)) + dev->datalen = 64; + else if (atp_is_geyser_2(dev)) + dev->datalen = 64; + else + dev->datalen = 81; + + if (atp_is_geyser_3(dev)) { + /* + * By default Geyser 3 device sends standard USB HID mouse + * packets (Report ID 2). This code changes device mode, so it + * sends raw sensor reports (Report ID 5). + */ + char data[8]; + int size; + + size = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), + ATP_GEYSER3_MODE_READ_REQUEST_ID, + USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, + ATP_GEYSER3_MODE_REQUEST_VALUE, + ATP_GEYSER3_MODE_REQUEST_INDEX, &data, 8, 5000); + + if (size != 8) { + err("Could not do mode read request from device" + " (Geyser 3 mode)"); + goto err_free_devs; + } + + /* Apply the mode switch */ + data[0] = ATP_GEYSER3_MODE_VENDOR_VALUE; + + size = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), + ATP_GEYSER3_MODE_WRITE_REQUEST_ID, + USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, + ATP_GEYSER3_MODE_REQUEST_VALUE, + ATP_GEYSER3_MODE_REQUEST_INDEX, &data, 8, 5000); + + if (size != 8) { + err("Could not do mode write request to device" + " (Geyser 3 mode)"); + goto err_free_devs; + } + printk("appletouch Geyser 3 inited.\n"); + } dev->urb = usb_alloc_urb(0, GFP_KERNEL); if (!dev->urb) { retval = -ENOMEM; - goto err_usballoc; + goto err_free_devs; } - dev->data = usb_buffer_alloc(dev->udev, ATP_DATASIZE, GFP_KERNEL, + + dev->data = usb_buffer_alloc(dev->udev, dev->datalen, GFP_KERNEL, &dev->urb->transfer_dma); if (!dev->data) { retval = -ENOMEM; - goto err_usbbufalloc; + goto err_free_urb; } - usb_fill_int_urb(dev->urb, dev->udev, - usb_rcvintpipe(dev->udev, int_in_endpointAddr), - dev->data, ATP_DATASIZE, atp_complete, dev, 1); - - init_input_dev(&dev->input); - dev->input.name = "appletouch"; - dev->input.dev = &iface->dev; - dev->input.private = dev; - dev->input.open = atp_open; - dev->input.close = atp_close; - - dev->input.id.bustype = BUS_USB; - dev->input.id.vendor = id->idVendor; - dev->input.id.product = id->idProduct; - dev->input.id.version = ATP_DRIVER_VERSION; - - set_bit(EV_ABS, dev->input.evbit); - if (id->idProduct == ATP_17INCH_ID1) - input_set_abs_params(&dev->input, ABS_X, 0, - (ATP_XSENSORS - 1) * ATP_XFACT - 1, - ATP_FUZZ, 0); - else - /* 12" and 15" Powerbooks only have 16 x sensors */ - input_set_abs_params(&dev->input, ABS_X, 0, - (16 - 1) * ATP_XFACT - 1, - ATP_FUZZ, 0); - input_set_abs_params(&dev->input, ABS_Y, 0, - (ATP_YSENSORS - 1) * ATP_YFACT - 1, - ATP_FUZZ, 0); - input_set_abs_params(&dev->input, ABS_PRESSURE, 0, ATP_PRESSURE, 0, 0); - - set_bit(EV_KEY, dev->input.evbit); - set_bit(BTN_TOUCH, dev->input.keybit); - set_bit(BTN_TOOL_FINGER, dev->input.keybit); - set_bit(BTN_TOOL_DOUBLETAP, dev->input.keybit); - set_bit(BTN_TOOL_TRIPLETAP, dev->input.keybit); - set_bit(BTN_LEFT, dev->input.keybit); - - input_register_device(&dev->input); - - printk(KERN_INFO "input: appletouch connected\n"); + + usb_fill_int_urb(dev->urb, udev, + usb_rcvintpipe(udev, int_in_endpointAddr), + dev->data, dev->datalen, atp_complete, dev, 1); + + usb_make_path(udev, dev->phys, sizeof(dev->phys)); + strlcat(dev->phys, "/input0", sizeof(dev->phys)); + + input_dev->name = "appletouch"; + input_dev->phys = dev->phys; + usb_to_input_id(dev->udev, &input_dev->id); + input_dev->cdev.dev = &iface->dev; + + input_dev->private = dev; + input_dev->open = atp_open; + input_dev->close = atp_close; + + set_bit(EV_ABS, input_dev->evbit); + + if (atp_is_geyser_3(dev)) { + /* + * MacBook have 20 X sensors, 10 Y sensors + */ + input_set_abs_params(input_dev, ABS_X, 0, + ((20 - 1) * ATP_XFACT) - 1, ATP_FUZZ, 0); + input_set_abs_params(input_dev, ABS_Y, 0, + ((10 - 1) * ATP_YFACT) - 1, ATP_FUZZ, 0); + } else if (atp_is_geyser_2(dev)) { + /* + * Oct 2005 15" PowerBooks have 15 X sensors, 17" are detected + * later. + */ + input_set_abs_params(input_dev, ABS_X, 0, + ((15 - 1) * ATP_XFACT) - 1, ATP_FUZZ, 0); + input_set_abs_params(input_dev, ABS_Y, 0, + ((9 - 1) * ATP_YFACT) - 1, ATP_FUZZ, 0); + } else { + /* + * 12" and 15" Powerbooks only have 16 x sensors, + * 17" models are detected later. + */ + input_set_abs_params(input_dev, ABS_X, 0, + (16 - 1) * ATP_XFACT - 1, ATP_FUZZ, 0); + input_set_abs_params(input_dev, ABS_Y, 0, + (ATP_YSENSORS - 1) * ATP_YFACT - 1, ATP_FUZZ, 0); + } + input_set_abs_params(input_dev, ABS_PRESSURE, 0, ATP_PRESSURE, 0, 0); + + set_bit(EV_KEY, input_dev->evbit); + set_bit(BTN_TOUCH, input_dev->keybit); + set_bit(BTN_TOOL_FINGER, input_dev->keybit); + set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit); + set_bit(BTN_TOOL_TRIPLETAP, input_dev->keybit); + set_bit(BTN_LEFT, input_dev->keybit); + + input_register_device(dev->input); + + /* save our data pointer in this interface device */ + usb_set_intfdata(iface, dev); return 0; -err_usbbufalloc: + err_free_urb: usb_free_urb(dev->urb); -err_usballoc: + err_free_devs: usb_set_intfdata(iface, NULL); -err_endpoint: kfree(dev); -err_kmalloc: + input_free_device(input_dev); return retval; } @@ -421,10 +596,10 @@ static void atp_disconnect(struct usb_interface *iface) usb_set_intfdata(iface, NULL); if (dev) { usb_kill_urb(dev->urb); - input_unregister_device(&dev->input); - usb_free_urb(dev->urb); - usb_buffer_free(dev->udev, ATP_DATASIZE, + input_unregister_device(dev->input); + usb_buffer_free(dev->udev, dev->datalen, dev->data, dev->urb->transfer_dma); + usb_free_urb(dev->urb); kfree(dev); } printk(KERN_INFO "input: appletouch disconnected\n"); @@ -448,7 +623,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, diff --git a/drivers/usb/input/ati_remote.c b/drivers/usb/input/ati_remote.c index 99f986cb6..3719fcb04 100644 --- a/drivers/usb/input/ati_remote.c +++ b/drivers/usb/input/ati_remote.c @@ -85,16 +85,13 @@ * */ -#include #include #include #include #include #include #include -#include -#include -#include +#include #include #include @@ -114,14 +111,28 @@ #define NAME_BUFSIZE 80 /* size of product name, path buffers */ #define DATA_BUFSIZE 63 /* size of URB data buffers */ +/* + * Duplicate event filtering time. + * Sequential, identical KIND_FILTERED inputs with less than + * FILTER_TIME milliseconds between them are considered as repeat + * events. The hardware generates 5 events for the first keypress + * and we have to take this into account for an accurate repeat + * behaviour. + */ +#define FILTER_TIME 60 /* msec */ + static unsigned long channel_mask; -module_param(channel_mask, ulong, 0444); +module_param(channel_mask, ulong, 0644); MODULE_PARM_DESC(channel_mask, "Bitmask of remote control channels to ignore"); static int debug; -module_param(debug, int, 0444); +module_param(debug, int, 0644); MODULE_PARM_DESC(debug, "Enable extra debug messages and information"); +static int repeat_filter = FILTER_TIME; +module_param(repeat_filter, int, 0644); +MODULE_PARM_DESC(repeat_filter, "Repeat filter time, default = 60 msec"); + #define dbginfo(dev, format, arg...) do { if (debug) dev_info(dev , format , ## arg); } while (0) #undef err #define err(format, arg...) printk(KERN_ERR format , ## arg) @@ -146,19 +157,6 @@ MODULE_DEVICE_TABLE(usb, ati_remote_table); static char init1[] = { 0x01, 0x00, 0x20, 0x14 }; static char init2[] = { 0x01, 0x00, 0x20, 0x14, 0x20, 0x20, 0x20 }; -/* Acceleration curve for directional control pad */ -static const char accel[] = { 1, 2, 4, 6, 9, 13, 20 }; - -/* Duplicate event filtering time. - * Sequential, identical KIND_FILTERED inputs with less than - * FILTER_TIME jiffies between them are considered as repeat - * events. The hardware generates 5 events for the first keypress - * and we have to take this into account for an accurate repeat - * behaviour. - * (HZ / 20) == 50 ms and works well for me. - */ -#define FILTER_TIME (HZ / 20) - struct ati_remote { struct input_dev *idev; struct usb_device *udev; @@ -415,6 +413,43 @@ static int ati_remote_event_lookup(int rem, unsigned char d1, unsigned char d2) return -1; } +/* + * ati_remote_compute_accel + * + * Implements acceleration curve for directional control pad + * If elapsed time since last event is > 1/4 second, user "stopped", + * so reset acceleration. Otherwise, user is probably holding the control + * pad down, so we increase acceleration, ramping up over two seconds to + * a maximum speed. + */ +static int ati_remote_compute_accel(struct ati_remote *ati_remote) +{ + static const char accel[] = { 1, 2, 4, 6, 9, 13, 20 }; + unsigned long now = jiffies; + int acc; + + if (time_after(now, ati_remote->old_jiffies + msecs_to_jiffies(250))) { + acc = 1; + ati_remote->acc_jiffies = now; + } + else if (time_before(now, ati_remote->acc_jiffies + msecs_to_jiffies(125))) + acc = accel[0]; + else if (time_before(now, ati_remote->acc_jiffies + msecs_to_jiffies(250))) + acc = accel[1]; + else if (time_before(now, ati_remote->acc_jiffies + msecs_to_jiffies(500))) + acc = accel[2]; + else if (time_before(now, ati_remote->acc_jiffies + msecs_to_jiffies(1000))) + acc = accel[3]; + else if (time_before(now, ati_remote->acc_jiffies + msecs_to_jiffies(1500))) + acc = accel[4]; + else if (time_before(now, ati_remote->acc_jiffies + msecs_to_jiffies(2000))) + acc = accel[5]; + else + acc = accel[6]; + + return acc; +} + /* * ati_remote_report_input */ @@ -468,9 +503,9 @@ static void ati_remote_input_report(struct urb *urb, struct pt_regs *regs) if (ati_remote_tbl[index].kind == KIND_FILTERED) { /* Filter duplicate events which happen "too close" together. */ - if ((ati_remote->old_data[0] == data[1]) && - (ati_remote->old_data[1] == data[2]) && - time_before(jiffies, ati_remote->old_jiffies + FILTER_TIME)) { + if (ati_remote->old_data[0] == data[1] && + ati_remote->old_data[1] == data[2] && + time_before(jiffies, ati_remote->old_jiffies + msecs_to_jiffies(repeat_filter))) { ati_remote->repeat_count++; } else { ati_remote->repeat_count = 0; @@ -480,75 +515,61 @@ static void ati_remote_input_report(struct urb *urb, struct pt_regs *regs) ati_remote->old_data[1] = data[2]; ati_remote->old_jiffies = jiffies; - if ((ati_remote->repeat_count > 0) - && (ati_remote->repeat_count < 5)) + if (ati_remote->repeat_count > 0 && + ati_remote->repeat_count < 5) return; input_regs(dev, regs); input_event(dev, ati_remote_tbl[index].type, ati_remote_tbl[index].code, 1); + input_sync(dev); input_event(dev, ati_remote_tbl[index].type, ati_remote_tbl[index].code, 0); input_sync(dev); - return; - } + } else { - /* - * Other event kinds are from the directional control pad, and have an - * acceleration factor applied to them. Without this acceleration, the - * control pad is mostly unusable. - * - * If elapsed time since last event is > 1/4 second, user "stopped", - * so reset acceleration. Otherwise, user is probably holding the control - * pad down, so we increase acceleration, ramping up over two seconds to - * a maximum speed. The acceleration curve is #defined above. - */ - if (time_after(jiffies, ati_remote->old_jiffies + (HZ >> 2))) { - acc = 1; - ati_remote->acc_jiffies = jiffies; - } - 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); - switch (ati_remote_tbl[index].kind) { - case KIND_ACCEL: - input_event(dev, ati_remote_tbl[index].type, - ati_remote_tbl[index].code, - ati_remote_tbl[index].value * acc); - break; - case KIND_LU: - input_report_rel(dev, REL_X, -acc); - input_report_rel(dev, REL_Y, -acc); - break; - case KIND_RU: - input_report_rel(dev, REL_X, acc); - input_report_rel(dev, REL_Y, -acc); - break; - case KIND_LD: - input_report_rel(dev, REL_X, -acc); - input_report_rel(dev, REL_Y, acc); - break; - case KIND_RD: - input_report_rel(dev, REL_X, acc); - input_report_rel(dev, REL_Y, acc); - break; - default: - dev_dbg(&ati_remote->interface->dev, "ati_remote kind=%d\n", - ati_remote_tbl[index].kind); - } - input_sync(dev); + /* + * Other event kinds are from the directional control pad, and have an + * acceleration factor applied to them. Without this acceleration, the + * control pad is mostly unusable. + */ + acc = ati_remote_compute_accel(ati_remote); + + input_regs(dev, regs); + switch (ati_remote_tbl[index].kind) { + case KIND_ACCEL: + input_event(dev, ati_remote_tbl[index].type, + ati_remote_tbl[index].code, + ati_remote_tbl[index].value * acc); + break; + case KIND_LU: + input_report_rel(dev, REL_X, -acc); + input_report_rel(dev, REL_Y, -acc); + break; + case KIND_RU: + input_report_rel(dev, REL_X, acc); + input_report_rel(dev, REL_Y, -acc); + break; + case KIND_LD: + input_report_rel(dev, REL_X, -acc); + input_report_rel(dev, REL_Y, acc); + break; + case KIND_RD: + input_report_rel(dev, REL_X, acc); + input_report_rel(dev, REL_Y, acc); + break; + default: + dev_dbg(&ati_remote->interface->dev, "ati_remote kind=%d\n", + ati_remote_tbl[index].kind); + } + input_sync(dev); - ati_remote->old_jiffies = jiffies; - ati_remote->old_data[0] = data[1]; - ati_remote->old_data[1] = data[2]; + ati_remote->old_jiffies = jiffies; + ati_remote->old_data[0] = data[1]; + ati_remote->old_data[1] = data[2]; + } } /* diff --git a/drivers/usb/input/ati_remote2.c b/drivers/usb/input/ati_remote2.c index ab1a1ae24..ea71de81c 100644 --- a/drivers/usb/input/ati_remote2.c +++ b/drivers/usb/input/ati_remote2.c @@ -8,7 +8,7 @@ * as published by the Free Software Foundation. */ -#include +#include #define DRIVER_DESC "ATI/Philips USB RF remote driver" #define DRIVER_VERSION "0.1" diff --git a/drivers/usb/input/fixp-arith.h b/drivers/usb/input/fixp-arith.h index b44d398de..ed3d2da0c 100644 --- a/drivers/usb/input/fixp-arith.h +++ b/drivers/usb/input/fixp-arith.h @@ -2,8 +2,6 @@ #define _FIXP_ARITH_H /* - * $$ - * * Simplistic fixed-point arithmetics. * Hmm, I'm probably duplicating some code :( * @@ -31,20 +29,20 @@ #include -// The type representing fixed-point values +/* The type representing fixed-point values */ typedef s16 fixp_t; #define FRAC_N 8 #define FRAC_MASK ((1<>= 1; diff --git a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c index 435273e7c..a2c56b2de 100644 --- a/drivers/usb/input/hid-core.c +++ b/drivers/usb/input/hid-core.c @@ -944,21 +944,28 @@ static void hid_reset(void *_hid) dev_dbg(&hid->intf->dev, "resetting device\n"); rc = rc_lock = usb_lock_device_for_reset(hid->dev, hid->intf); if (rc_lock >= 0) { - rc = usb_reset_device(hid->dev); + rc = usb_reset_composite_device(hid->dev, hid->intf); if (rc_lock) usb_unlock_device(hid->dev); } clear_bit(HID_RESET_PENDING, &hid->iofl); - if (rc == 0) { - hid->retry_delay = 0; - if (hid_start_in(hid)) + switch (rc) { + case 0: + if (!test_bit(HID_IN_RUNNING, &hid->iofl)) hid_io_error(hid); - } else if (!(rc == -ENODEV || rc == -EHOSTUNREACH || rc == -EINTR)) + break; + default: err("can't reset device, %s-%s/input%d, status %d", hid->dev->bus->bus_name, hid->dev->devpath, hid->ifnum, rc); + /* FALLTHROUGH */ + case -EHOSTUNREACH: + case -ENODEV: + case -EINTR: + break; + } } /* Main I/O error handler */ @@ -1374,9 +1381,6 @@ void hid_close(struct hid_device *hid) #define USB_VENDOR_ID_PANJIT 0x134c -#define USB_VENDOR_ID_SILVERCREST 0x062a -#define USB_DEVICE_ID_SILVERCREST_KB 0x0201 - /* * Initialize all reports */ @@ -1407,17 +1411,54 @@ void hid_init_reports(struct hid_device *hid) warn("timeout initializing reports"); } +#define USB_VENDOR_ID_GTCO 0x078c +#define USB_DEVICE_ID_GTCO_90 0x0090 +#define USB_DEVICE_ID_GTCO_100 0x0100 +#define USB_DEVICE_ID_GTCO_101 0x0101 +#define USB_DEVICE_ID_GTCO_103 0x0103 +#define USB_DEVICE_ID_GTCO_104 0x0104 +#define USB_DEVICE_ID_GTCO_105 0x0105 +#define USB_DEVICE_ID_GTCO_106 0x0106 +#define USB_DEVICE_ID_GTCO_107 0x0107 +#define USB_DEVICE_ID_GTCO_108 0x0108 +#define USB_DEVICE_ID_GTCO_200 0x0200 +#define USB_DEVICE_ID_GTCO_201 0x0201 +#define USB_DEVICE_ID_GTCO_202 0x0202 +#define USB_DEVICE_ID_GTCO_203 0x0203 +#define USB_DEVICE_ID_GTCO_204 0x0204 +#define USB_DEVICE_ID_GTCO_205 0x0205 +#define USB_DEVICE_ID_GTCO_206 0x0206 +#define USB_DEVICE_ID_GTCO_207 0x0207 +#define USB_DEVICE_ID_GTCO_300 0x0300 +#define USB_DEVICE_ID_GTCO_301 0x0301 +#define USB_DEVICE_ID_GTCO_302 0x0302 +#define USB_DEVICE_ID_GTCO_303 0x0303 +#define USB_DEVICE_ID_GTCO_304 0x0304 +#define USB_DEVICE_ID_GTCO_305 0x0305 +#define USB_DEVICE_ID_GTCO_306 0x0306 +#define USB_DEVICE_ID_GTCO_307 0x0307 +#define USB_DEVICE_ID_GTCO_308 0x0308 +#define USB_DEVICE_ID_GTCO_309 0x0309 +#define USB_DEVICE_ID_GTCO_400 0x0400 +#define USB_DEVICE_ID_GTCO_401 0x0401 +#define USB_DEVICE_ID_GTCO_402 0x0402 +#define USB_DEVICE_ID_GTCO_403 0x0403 +#define USB_DEVICE_ID_GTCO_404 0x0404 +#define USB_DEVICE_ID_GTCO_405 0x0405 +#define USB_DEVICE_ID_GTCO_500 0x0500 +#define USB_DEVICE_ID_GTCO_501 0x0501 +#define USB_DEVICE_ID_GTCO_502 0x0502 +#define USB_DEVICE_ID_GTCO_503 0x0503 +#define USB_DEVICE_ID_GTCO_504 0x0504 +#define USB_DEVICE_ID_GTCO_1000 0x1000 +#define USB_DEVICE_ID_GTCO_1001 0x1001 +#define USB_DEVICE_ID_GTCO_1002 0x1002 +#define USB_DEVICE_ID_GTCO_1003 0x1003 +#define USB_DEVICE_ID_GTCO_1004 0x1004 +#define USB_DEVICE_ID_GTCO_1005 0x1005 +#define USB_DEVICE_ID_GTCO_1006 0x1006 + #define USB_VENDOR_ID_WACOM 0x056a -#define USB_DEVICE_ID_WACOM_PENPARTNER 0x0000 -#define USB_DEVICE_ID_WACOM_GRAPHIRE 0x0010 -#define USB_DEVICE_ID_WACOM_INTUOS 0x0020 -#define USB_DEVICE_ID_WACOM_PL 0x0030 -#define USB_DEVICE_ID_WACOM_INTUOS2 0x0040 -#define USB_DEVICE_ID_WACOM_VOLITO 0x0060 -#define USB_DEVICE_ID_WACOM_PTU 0x0003 -#define USB_DEVICE_ID_WACOM_INTUOS3 0x00B0 -#define USB_DEVICE_ID_WACOM_CINTIQ 0x003F -#define USB_DEVICE_ID_WACOM_DTF 0x00C0 #define USB_VENDOR_ID_ACECAD 0x0460 #define USB_DEVICE_ID_ACECAD_FLAIR 0x0004 @@ -1461,9 +1502,6 @@ void hid_init_reports(struct hid_device *hid) #define USB_VENDOR_ID_ONTRAK 0x0a07 #define USB_DEVICE_ID_ONTRAK_ADU100 0x0064 -#define USB_VENDOR_ID_TANGTOP 0x0d3d -#define USB_DEVICE_ID_TANGTOP_USBPS2 0x0001 - #define USB_VENDOR_ID_ESSENTIAL_REALITY 0x0d7f #define USB_DEVICE_ID_ESSENTIAL_REALITY_P5 0x0100 @@ -1506,6 +1544,9 @@ void hid_init_reports(struct hid_device *hid) #define USB_DEVICE_ID_4_PHIDGETSERVO_20 0x8104 #define USB_DEVICE_ID_DUAL_USB_JOYPAD 0x8866 +#define USB_VENDOR_ID_WISEGROUP_LTD 0x6677 +#define USB_DEVICE_ID_SMARTJOY_DUAL_PLUS 0x8802 + #define USB_VENDOR_ID_CODEMERCS 0x07c0 #define USB_DEVICE_ID_CODEMERCS_IOW40 0x1500 #define USB_DEVICE_ID_CODEMERCS_IOW24 0x1501 @@ -1520,12 +1561,6 @@ void hid_init_reports(struct hid_device *hid) #define USB_DEVICE_ID_MCC_PMD1024LS 0x0076 #define USB_DEVICE_ID_MCC_PMD1208LS 0x007a -#define USB_VENDOR_ID_CHICONY 0x04f2 -#define USB_DEVICE_ID_CHICONY_USBHUB_KB 0x0100 - -#define USB_VENDOR_ID_BTC 0x046e -#define USB_DEVICE_ID_BTC_KEYBOARD 0x5303 - #define USB_VENDOR_ID_VERNIER 0x08f7 #define USB_DEVICE_ID_VERNIER_LABPRO 0x0001 #define USB_DEVICE_ID_VERNIER_GOTEMP 0x0002 @@ -1549,20 +1584,13 @@ void hid_init_reports(struct hid_device *hid) #define USB_DEVICE_ID_LD_MACHINETEST 0x2040 #define USB_VENDOR_ID_APPLE 0x05ac -#define USB_DEVICE_ID_APPLE_POWERMOUSE 0x0304 +#define USB_DEVICE_ID_APPLE_MIGHTYMOUSE 0x0304 #define USB_VENDOR_ID_CHERRY 0x046a #define USB_DEVICE_ID_CHERRY_CYMOTION 0x0023 -#define USB_VENDOR_ID_HP 0x03f0 -#define USB_DEVICE_ID_HP_USBHUB_KB 0x020c - -#define USB_VENDOR_ID_IBM 0x04b3 -#define USB_DEVICE_ID_IBM_USBHUB_KB 0x3005 - -#define USB_VENDOR_ID_CREATIVELABS 0x062a -#define USB_DEVICE_ID_CREATIVELABS_SILVERCREST 0x0201 - +#define USB_VENDOR_ID_YEALINK 0x6993 +#define USB_DEVICE_ID_YEALINK_P1K_P4K_B2K 0xb001 /* * Alphabetically sorted blacklist by quirk type. */ @@ -1597,6 +1625,51 @@ static const struct hid_blacklist { { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_8_8_IF_KIT, HID_QUIRK_IGNORE }, { USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_POWERMATE, HID_QUIRK_IGNORE }, { USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_SOUNDKNOB, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_90, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_100, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_101, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_103, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_104, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_105, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_106, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_107, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_108, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_200, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_201, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_202, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_203, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_204, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_205, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_206, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_207, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_300, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_301, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_302, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_303, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_304, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_305, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_306, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_307, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_308, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_309, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_400, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_401, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_402, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_403, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_404, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_405, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_500, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_501, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_502, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_503, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_504, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1000, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1001, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1002, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1003, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1004, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1005, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1006, HID_QUIRK_IGNORE }, { USB_VENDOR_ID_KBGEAR, USB_DEVICE_ID_KBGEAR_JAMSTUDIO, HID_QUIRK_IGNORE }, { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY, HID_QUIRK_IGNORE }, { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY, HID_QUIRK_IGNORE }, @@ -1626,51 +1699,9 @@ static const struct hid_blacklist { { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP, HID_QUIRK_IGNORE }, { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP, HID_QUIRK_IGNORE }, { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_CYCLOPS, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PENPARTNER, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE + 1, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE + 2, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE + 3, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE + 4, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS + 1, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS + 2, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS + 3, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS + 4, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PL, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PL + 1, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PL + 2, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PL + 3, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PL + 4, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PL + 5, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PL + 7, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PL + 8, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PL + 9, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 1, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 2, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 3, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 4, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 5, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 7, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_VOLITO, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_VOLITO + 1, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_VOLITO + 2, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_VOLITO + 3, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_VOLITO + 4, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE + 5, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE + 6, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PTU, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 1, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 2, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 3, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 4, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 5, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_CINTIQ, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_DTF, HID_QUIRK_IGNORE }, - { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_DTF + 3, HID_QUIRK_IGNORE }, { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_4_PHIDGETSERVO_20, HID_QUIRK_IGNORE }, { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_1_PHIDGETSERVO_20, HID_QUIRK_IGNORE }, + { USB_VENDOR_ID_YEALINK, USB_DEVICE_ID_YEALINK_P1K_P4K_B2K, HID_QUIRK_IGNORE }, { USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_FLAIR, HID_QUIRK_IGNORE }, { USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_302, HID_QUIRK_IGNORE }, @@ -1680,16 +1711,10 @@ static const struct hid_blacklist { { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_2PORTKVM, HID_QUIRK_NOGET }, { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVM, HID_QUIRK_NOGET }, { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVMC, HID_QUIRK_NOGET }, - { USB_VENDOR_ID_BTC, USB_DEVICE_ID_BTC_KEYBOARD, HID_QUIRK_NOGET}, - { USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_USBHUB_KB, HID_QUIRK_NOGET}, - { USB_VENDOR_ID_CREATIVELABS, USB_DEVICE_ID_CREATIVELABS_SILVERCREST, HID_QUIRK_NOGET }, - { USB_VENDOR_ID_HP, USB_DEVICE_ID_HP_USBHUB_KB, HID_QUIRK_NOGET }, - { USB_VENDOR_ID_IBM, USB_DEVICE_ID_IBM_USBHUB_KB, HID_QUIRK_NOGET }, - { USB_VENDOR_ID_TANGTOP, USB_DEVICE_ID_TANGTOP_USBPS2, HID_QUIRK_NOGET }, { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT }, - { USB_VENDOR_ID_SILVERCREST, USB_DEVICE_ID_SILVERCREST_KB, HID_QUIRK_NOGET }, + { USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SMARTJOY_DUAL_PLUS, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT }, - { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_POWERMOUSE, HID_QUIRK_2WHEEL_POWERMOUSE }, + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE, HID_QUIRK_MIGHTYMOUSE | HID_QUIRK_INVERT_HWHEEL }, { USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU, HID_QUIRK_2WHEEL_MOUSE_HACK_7 }, { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE, HID_QUIRK_2WHEEL_MOUSE_HACK_5 }, @@ -1711,6 +1736,9 @@ static const struct hid_blacklist { { USB_VENDOR_ID_APPLE, 0x0214, HID_QUIRK_POWERBOOK_HAS_FN }, { USB_VENDOR_ID_APPLE, 0x0215, HID_QUIRK_POWERBOOK_HAS_FN }, { USB_VENDOR_ID_APPLE, 0x0216, HID_QUIRK_POWERBOOK_HAS_FN }, + { USB_VENDOR_ID_APPLE, 0x0217, HID_QUIRK_POWERBOOK_HAS_FN }, + { USB_VENDOR_ID_APPLE, 0x0218, HID_QUIRK_POWERBOOK_HAS_FN }, + { USB_VENDOR_ID_APPLE, 0x0219, HID_QUIRK_POWERBOOK_HAS_FN }, { USB_VENDOR_ID_APPLE, 0x030A, HID_QUIRK_POWERBOOK_HAS_FN }, { USB_VENDOR_ID_APPLE, 0x030B, HID_QUIRK_POWERBOOK_HAS_FN }, @@ -1789,11 +1817,23 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf) char *rdesc; int n, len, insize = 0; + /* Ignore all Wacom devices */ + if (dev->descriptor.idVendor == USB_VENDOR_ID_WACOM) + return NULL; + for (n = 0; hid_blacklist[n].idVendor; n++) if ((hid_blacklist[n].idVendor == le16_to_cpu(dev->descriptor.idVendor)) && (hid_blacklist[n].idProduct == le16_to_cpu(dev->descriptor.idProduct))) quirks = hid_blacklist[n].quirks; + /* Many keyboards and mice don't like to be polled for reports, + * so we will always set the HID_QUIRK_NOGET flag for them. */ + if (interface->desc.bInterfaceSubClass == USB_INTERFACE_SUBCLASS_BOOT) { + if (interface->desc.bInterfaceProtocol == USB_INTERFACE_PROTOCOL_KEYBOARD || + interface->desc.bInterfaceProtocol == USB_INTERFACE_PROTOCOL_MOUSE) + quirks |= HID_QUIRK_NOGET; + } + if (quirks & HID_QUIRK_IGNORE) return NULL; @@ -2080,11 +2120,29 @@ static int hid_resume(struct usb_interface *intf) int status; clear_bit(HID_SUSPENDED, &hid->iofl); + hid->retry_delay = 0; status = hid_start_in(hid); dev_dbg(&intf->dev, "resume status %d\n", status); return status; } +/* Treat USB reset pretty much the same as suspend/resume */ +static void hid_pre_reset(struct usb_interface *intf) +{ + /* FIXME: What if the interface is already suspended? */ + hid_suspend(intf, PMSG_ON); +} + +static void hid_post_reset(struct usb_interface *intf) +{ + struct usb_device *dev = interface_to_usbdev (intf); + + hid_set_idle(dev, intf->cur_altsetting->desc.bInterfaceNumber, 0, 0); + /* FIXME: Any more reinitialization needed? */ + + hid_resume(intf); +} + static struct usb_device_id hid_usb_ids [] = { { .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS, .bInterfaceClass = USB_INTERFACE_CLASS_HID }, @@ -2099,6 +2157,8 @@ static struct usb_driver hid_driver = { .disconnect = hid_disconnect, .suspend = hid_suspend, .resume = hid_resume, + .pre_reset = hid_pre_reset, + .post_reset = hid_post_reset, .id_table = hid_usb_ids, }; diff --git a/drivers/usb/input/hid-debug.h b/drivers/usb/input/hid-debug.h index 702c48c2f..f04d6d75c 100644 --- a/drivers/usb/input/hid-debug.h +++ b/drivers/usb/input/hid-debug.h @@ -563,7 +563,7 @@ static char *keys[KEY_MAX + 1] = { [KEY_VOLUMEUP] = "VolumeUp", [KEY_POWER] = "Power", [KEY_KPEQUAL] = "KPEqual", [KEY_KPPLUSMINUS] = "KPPlusMinus", [KEY_PAUSE] = "Pause", [KEY_KPCOMMA] = "KPComma", - [KEY_HANGUEL] = "Hanguel", [KEY_HANJA] = "Hanja", + [KEY_HANGUEL] = "Hangeul", [KEY_HANJA] = "Hanja", [KEY_YEN] = "Yen", [KEY_LEFTMETA] = "LeftMeta", [KEY_RIGHTMETA] = "RightMeta", [KEY_COMPOSE] = "Compose", [KEY_STOP] = "Stop", [KEY_AGAIN] = "Again", diff --git a/drivers/usb/input/hid-input.c b/drivers/usb/input/hid-input.c index 25bc85f8c..7208839f2 100644 --- a/drivers/usb/input/hid-input.c +++ b/drivers/usb/input/hid-input.c @@ -29,9 +29,7 @@ #include #include #include -#include -#include -#include +#include #undef DEBUG @@ -567,16 +565,14 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel break; } - set_bit(usage->type, input->evbit); - - while (usage->code <= max && test_and_set_bit(usage->code, bit)) - usage->code = find_next_zero_bit(bit, max + 1, usage->code); - - if (usage->code > max) - goto ignore; - - if (((device->quirks & (HID_QUIRK_2WHEEL_POWERMOUSE)) && (usage->hid == 0x00010032))) - map_rel(REL_HWHEEL); + if (device->quirks & HID_QUIRK_MIGHTYMOUSE) { + if (usage->hid == HID_GD_Z) + map_rel(REL_HWHEEL); + else if (usage->code == BTN_1) + map_key(BTN_2); + else if (usage->code == BTN_2) + map_key(BTN_1); + } if ((device->quirks & (HID_QUIRK_2WHEEL_MOUSE_HACK_7 | HID_QUIRK_2WHEEL_MOUSE_HACK_5)) && (usage->type == EV_REL) && (usage->code == REL_WHEEL)) @@ -586,6 +582,15 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel || ((device->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_7) && (usage->hid == 0x00090007))) goto ignore; + set_bit(usage->type, input->evbit); + + while (usage->code <= max && test_and_set_bit(usage->code, bit)) + usage->code = find_next_zero_bit(bit, max + 1, usage->code); + + if (usage->code > max) + goto ignore; + + if (usage->type == EV_ABS) { int a = field->logical_minimum; @@ -602,7 +607,8 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel } - if (usage->hat_min < usage->hat_max || usage->hat_dir) { + if (usage->type == EV_ABS && + (usage->hat_min < usage->hat_max || usage->hat_dir)) { int i; for (i = usage->code; i < usage->code + 2 && i <= max; i++) { input_set_abs_params(input, i, -1, 1, 0, 0); @@ -647,6 +653,11 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct return; } + if ((hid->quirks & HID_QUIRK_INVERT_HWHEEL) && (usage->code == REL_HWHEEL)) { + input_event(input, usage->type, usage->code, -value); + return; + } + if ((hid->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_ON) && (usage->code == REL_WHEEL)) { input_event(input, usage->type, REL_HWHEEL, value); return; diff --git a/drivers/usb/input/hid.h b/drivers/usb/input/hid.h index 9c62837b5..778e575de 100644 --- a/drivers/usb/input/hid.h +++ b/drivers/usb/input/hid.h @@ -40,6 +40,14 @@ #define USB_INTERFACE_CLASS_HID 3 +/* + * USB HID interface subclass and protocol codes + */ + +#define USB_INTERFACE_SUBCLASS_BOOT 1 +#define USB_INTERFACE_PROTOCOL_KEYBOARD 1 +#define USB_INTERFACE_PROTOCOL_MOUSE 2 + /* * HID class requests */ @@ -247,10 +255,11 @@ struct hid_item { #define HID_QUIRK_2WHEEL_MOUSE_HACK_7 0x00000080 #define HID_QUIRK_2WHEEL_MOUSE_HACK_5 0x00000100 #define HID_QUIRK_2WHEEL_MOUSE_HACK_ON 0x00000200 -#define HID_QUIRK_2WHEEL_POWERMOUSE 0x00000400 +#define HID_QUIRK_MIGHTYMOUSE 0x00000400 #define HID_QUIRK_CYMOTION 0x00000800 #define HID_QUIRK_POWERBOOK_HAS_FN 0x00001000 #define HID_QUIRK_POWERBOOK_FN_ON 0x00002000 +#define HID_QUIRK_INVERT_HWHEEL 0x00004000 /* * This is the global environment of the parser. This information is diff --git a/drivers/usb/input/hiddev.c b/drivers/usb/input/hiddev.c index c4670e1d4..f6b839c25 100644 --- a/drivers/usb/input/hiddev.c +++ b/drivers/usb/input/hiddev.c @@ -25,7 +25,6 @@ * e-mail - mail your message to Paul Stewart */ -#include #include #include #include @@ -50,7 +49,7 @@ struct hiddev { int open; wait_queue_head_t wait; struct hid_device *hid; - struct hiddev_list *list; + struct list_head list; }; struct hiddev_list { @@ -60,7 +59,7 @@ struct hiddev_list { unsigned flags; struct fasync_struct *fasync; struct hiddev *hiddev; - struct hiddev_list *next; + struct list_head node; }; static struct hiddev *hiddev_table[HIDDEV_MINORS]; @@ -74,12 +73,15 @@ static struct hiddev *hiddev_table[HIDDEV_MINORS]; static struct hid_report * hiddev_lookup_report(struct hid_device *hid, struct hiddev_report_info *rinfo) { - unsigned flags = rinfo->report_id & ~HID_REPORT_ID_MASK; + unsigned int flags = rinfo->report_id & ~HID_REPORT_ID_MASK; + unsigned int rid = rinfo->report_id & HID_REPORT_ID_MASK; struct hid_report_enum *report_enum; + struct hid_report *report; struct list_head *list; if (rinfo->report_type < HID_REPORT_TYPE_MIN || - rinfo->report_type > HID_REPORT_TYPE_MAX) return NULL; + rinfo->report_type > HID_REPORT_TYPE_MAX) + return NULL; report_enum = hid->report_enum + (rinfo->report_type - HID_REPORT_TYPE_MIN); @@ -89,21 +91,25 @@ hiddev_lookup_report(struct hid_device *hid, struct hiddev_report_info *rinfo) break; case HID_REPORT_ID_FIRST: - list = report_enum->report_list.next; - if (list == &report_enum->report_list) + if (list_empty(&report_enum->report_list)) return NULL; - rinfo->report_id = ((struct hid_report *) list)->id; + + list = report_enum->report_list.next; + report = list_entry(list, struct hid_report, list); + rinfo->report_id = report->id; break; case HID_REPORT_ID_NEXT: - list = (struct list_head *) - report_enum->report_id_hash[rinfo->report_id & HID_REPORT_ID_MASK]; - if (list == NULL) + report = report_enum->report_id_hash[rid]; + if (!report) return NULL; - list = list->next; + + list = report->list.next; if (list == &report_enum->report_list) return NULL; - rinfo->report_id = ((struct hid_report *) list)->id; + + report = list_entry(list, struct hid_report, list); + rinfo->report_id = report->id; break; default: @@ -126,12 +132,13 @@ hiddev_lookup_usage(struct hid_device *hid, struct hiddev_usage_ref *uref) struct hid_field *field; if (uref->report_type < HID_REPORT_TYPE_MIN || - uref->report_type > HID_REPORT_TYPE_MAX) return NULL; + uref->report_type > HID_REPORT_TYPE_MAX) + return NULL; report_enum = hid->report_enum + (uref->report_type - HID_REPORT_TYPE_MIN); - list_for_each_entry(report, &report_enum->report_list, list) + list_for_each_entry(report, &report_enum->report_list, list) { for (i = 0; i < report->maxfield; i++) { field = report->field[i]; for (j = 0; j < field->maxusage; j++) { @@ -143,6 +150,7 @@ hiddev_lookup_usage(struct hid_device *hid, struct hiddev_usage_ref *uref) } } } + } return NULL; } @@ -151,9 +159,9 @@ static void hiddev_send_event(struct hid_device *hid, struct hiddev_usage_ref *uref) { struct hiddev *hiddev = hid->hiddev; - struct hiddev_list *list = hiddev->list; + struct hiddev_list *list; - while (list) { + list_for_each_entry(list, &hiddev->list, node) { if (uref->field_index != HID_FIELD_INDEX_NONE || (list->flags & HIDDEV_FLAG_REPORT) != 0) { list->buffer[list->head] = *uref; @@ -161,8 +169,6 @@ static void hiddev_send_event(struct hid_device *hid, (HIDDEV_BUFFER_SIZE - 1); kill_fasync(&list->fasync, SIGIO, POLL_IN); } - - list = list->next; } wake_up_interruptible(&hiddev->wait); @@ -181,7 +187,7 @@ void hiddev_hid_event(struct hid_device *hid, struct hid_field *field, uref.report_type = (type == HID_INPUT_REPORT) ? HID_REPORT_TYPE_INPUT : ((type == HID_OUTPUT_REPORT) ? HID_REPORT_TYPE_OUTPUT : - ((type == HID_FEATURE_REPORT) ? HID_REPORT_TYPE_FEATURE:0)); + ((type == HID_FEATURE_REPORT) ? HID_REPORT_TYPE_FEATURE : 0)); uref.report_id = field->report->id; uref.field_index = field->index; uref.usage_index = (usage - field->usage); @@ -201,7 +207,7 @@ void hiddev_report_event(struct hid_device *hid, struct hid_report *report) uref.report_type = (type == HID_INPUT_REPORT) ? HID_REPORT_TYPE_INPUT : ((type == HID_OUTPUT_REPORT) ? HID_REPORT_TYPE_OUTPUT : - ((type == HID_FEATURE_REPORT) ? HID_REPORT_TYPE_FEATURE:0)); + ((type == HID_FEATURE_REPORT) ? HID_REPORT_TYPE_FEATURE : 0)); uref.report_id = report->id; uref.field_index = HID_FIELD_INDEX_NONE; @@ -214,7 +220,9 @@ static int hiddev_fasync(int fd, struct file *file, int on) { int retval; struct hiddev_list *list = file->private_data; + retval = fasync_helper(fd, file, on, &list->fasync); + return retval < 0 ? retval : 0; } @@ -225,14 +233,9 @@ static int hiddev_fasync(int fd, struct file *file, int on) static int hiddev_release(struct inode * inode, struct file * file) { struct hiddev_list *list = file->private_data; - struct hiddev_list **listptr; - listptr = &list->hiddev->list; hiddev_fasync(-1, file, 0); - - while (*listptr && (*listptr != list)) - listptr = &((*listptr)->next); - *listptr = (*listptr)->next; + list_del(&list->node); if (!--list->hiddev->open) { if (list->hiddev->exist) @@ -249,7 +252,8 @@ static int hiddev_release(struct inode * inode, struct file * file) /* * open file op */ -static int hiddev_open(struct inode * inode, struct file * file) { +static int hiddev_open(struct inode *inode, struct file *file) +{ struct hiddev_list *list; int i = iminor(inode) - HIDDEV_MINOR_BASE; @@ -261,9 +265,7 @@ static int hiddev_open(struct inode * inode, struct file * file) { return -ENOMEM; list->hiddev = hiddev_table[i]; - list->next = hiddev_table[i]->list; - hiddev_table[i]->list = list; - + list_add_tail(&list->node, &hiddev_table[i]->list); file->private_data = list; if (!list->hiddev->open++) @@ -363,6 +365,7 @@ static ssize_t hiddev_read(struct file * file, char __user * buffer, size_t coun static unsigned int hiddev_poll(struct file *file, poll_table *wait) { struct hiddev_list *list = file->private_data; + poll_wait(file, &list->hiddev->wait, wait); if (list->head != list->tail) return POLLIN | POLLRDNORM; @@ -383,7 +386,7 @@ static int hiddev_ioctl(struct inode *inode, struct file *file, unsigned int cmd struct hiddev_collection_info cinfo; struct hiddev_report_info rinfo; struct hiddev_field_info finfo; - struct hiddev_usage_ref_multi *uref_multi=NULL; + struct hiddev_usage_ref_multi *uref_multi = NULL; struct hiddev_usage_ref *uref; struct hiddev_devinfo dinfo; struct hid_report *report; @@ -765,15 +768,15 @@ int hiddev_connect(struct hid_device *hid) } init_waitqueue_head(&hiddev->wait); - - hiddev_table[hid->intf->minor - HIDDEV_MINOR_BASE] = hiddev; - + INIT_LIST_HEAD(&hiddev->list); hiddev->hid = hid; hiddev->exist = 1; hid->minor = hid->intf->minor; hid->hiddev = hiddev; + hiddev_table[hid->intf->minor - HIDDEV_MINOR_BASE] = hiddev; + return 0; } diff --git a/drivers/usb/input/itmtouch.c b/drivers/usb/input/itmtouch.c index 7618ae5c1..86acb5f19 100644 --- a/drivers/usb/input/itmtouch.c +++ b/drivers/usb/input/itmtouch.c @@ -39,14 +39,11 @@ * *****************************************************************************/ -#include #include #include -#include #include #include -#include -#include +#include /* only an 8 byte buffer necessary for a single packet */ #define ITM_BUFSIZE 8 diff --git a/drivers/usb/input/kbtab.c b/drivers/usb/input/kbtab.c index f6d5cead5..604ade356 100644 --- a/drivers/usb/input/kbtab.c +++ b/drivers/usb/input/kbtab.c @@ -1,12 +1,9 @@ #include #include -#include #include #include -#include -#include +#include #include -#include /* * Version Information diff --git a/drivers/usb/input/keyspan_remote.c b/drivers/usb/input/keyspan_remote.c index 3d911976f..4723b310f 100644 --- a/drivers/usb/input/keyspan_remote.c +++ b/drivers/usb/input/keyspan_remote.c @@ -11,16 +11,13 @@ * and Keyspan, Inc the manufacturers of the Keyspan USB DMR product. */ -#include #include #include #include #include #include #include -#include -#include -#include +#include #define DRIVER_VERSION "v0.1" #define DRIVER_AUTHOR "Michael Downey " diff --git a/drivers/usb/input/mtouchusb.c b/drivers/usb/input/mtouchusb.c index f018953a5..a9ccda881 100644 --- a/drivers/usb/input/mtouchusb.c +++ b/drivers/usb/input/mtouchusb.c @@ -39,14 +39,11 @@ * *****************************************************************************/ -#include #include #include -#include #include #include -#include -#include +#include #define MTOUCHUSB_MIN_XC 0x0 #define MTOUCHUSB_MAX_RAW_XC 0x4000 diff --git a/drivers/usb/input/pid.c b/drivers/usb/input/pid.c index d9d9f656b..299ec95b8 100644 --- a/drivers/usb/input/pid.c +++ b/drivers/usb/input/pid.c @@ -24,7 +24,6 @@ * e-mail - mail your message to */ -#include #include #include #include diff --git a/drivers/usb/input/powermate.c b/drivers/usb/input/powermate.c index fdf0f7880..b3c0d0c3e 100644 --- a/drivers/usb/input/powermate.c +++ b/drivers/usb/input/powermate.c @@ -30,12 +30,10 @@ #include #include -#include #include #include #include -#include -#include +#include #define POWERMATE_VENDOR 0x077d /* Griffin Technology, Inc. */ #define POWERMATE_PRODUCT_NEW 0x0410 /* Griffin PowerMate */ diff --git a/drivers/usb/input/touchkitusb.c b/drivers/usb/input/touchkitusb.c index a71f1bbd0..0149043ff 100644 --- a/drivers/usb/input/touchkitusb.c +++ b/drivers/usb/input/touchkitusb.c @@ -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 * Copyright (C) by Todd E. Johnson (mtouchusb.c) * * This program is free software; you can redistribute it and/or @@ -24,18 +24,11 @@ //#define DEBUG -#include #include #include -#include #include #include - -#if !defined(DEBUG) && defined(CONFIG_USB_DEBUG) -#define DEBUG -#endif -#include - +#include #define TOUCHKIT_MIN_XC 0x0 #define TOUCHKIT_MAX_XC 0x07ff @@ -45,15 +38,13 @@ #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 " @@ -66,25 +57,145 @@ 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; - int open; + struct input_dev *input; char name[128]; char phys[64]; }; static struct usb_device_id touchkit_devices[] = { {USB_DEVICE(0x3823, 0x0001)}, + {USB_DEVICE(0x0123, 0x0001)}, {USB_DEVICE(0x0eef, 0x0001)}, + {USB_DEVICE(0x0eef, 0x0002)}, {} }; +/* 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: @@ -108,20 +219,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); @@ -134,15 +232,10 @@ static int touchkit_open(struct input_dev *input) { struct touchkit_usb *touchkit = input->private; - if (touchkit->open++) - return 0; - touchkit->irq->dev = touchkit->udev; - if (usb_submit_urb(touchkit->irq, GFP_ATOMIC)) { - touchkit->open--; + if (usb_submit_urb(touchkit->irq, GFP_ATOMIC)) return -EIO; - } return 0; } @@ -151,8 +244,7 @@ static void touchkit_close(struct input_dev *input) { struct touchkit_usb *touchkit = input->private; - if (!--touchkit->open) - usb_kill_urb(touchkit->irq); + usb_kill_urb(touchkit->irq); } static int touchkit_alloc_buffers(struct usb_device *udev, @@ -178,90 +270,84 @@ static void touchkit_free_buffers(struct usb_device *udev, static int touchkit_probe(struct usb_interface *intf, const struct usb_device_id *id) { - int ret; struct touchkit_usb *touchkit; + struct input_dev *input_dev; struct usb_host_interface *interface; struct usb_endpoint_descriptor *endpoint; struct usb_device *udev = interface_to_usbdev(intf); - char path[64]; interface = intf->cur_altsetting; endpoint = &interface->endpoint[0].desc; - touchkit = kmalloc(sizeof(struct touchkit_usb), GFP_KERNEL); - if (!touchkit) - return -ENOMEM; - - memset(touchkit, 0, sizeof(struct touchkit_usb)); - touchkit->udev = udev; - - if (touchkit_alloc_buffers(udev, touchkit)) { - ret = -ENOMEM; + touchkit = kzalloc(sizeof(struct touchkit_usb), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!touchkit || !input_dev) goto out_free; - } - - touchkit->input.private = touchkit; - touchkit->input.open = touchkit_open; - touchkit->input.close = touchkit_close; - - usb_make_path(udev, path, 64); - sprintf(touchkit->phys, "%s/input0", path); - - touchkit->input.name = touchkit->name; - touchkit->input.phys = touchkit->phys; - touchkit->input.id.bustype = BUS_USB; - touchkit->input.id.vendor = le16_to_cpu(udev->descriptor.idVendor); - touchkit->input.id.product = le16_to_cpu(udev->descriptor.idProduct); - touchkit->input.id.version = le16_to_cpu(udev->descriptor.bcdDevice); - touchkit->input.dev = &intf->dev; - - touchkit->input.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); - touchkit->input.absbit[0] = BIT(ABS_X) | BIT(ABS_Y); - touchkit->input.keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); - - /* Used to Scale Compensated Data */ - touchkit->input.absmin[ABS_X] = TOUCHKIT_MIN_XC; - touchkit->input.absmax[ABS_X] = TOUCHKIT_MAX_XC; - touchkit->input.absfuzz[ABS_X] = TOUCHKIT_XC_FUZZ; - touchkit->input.absflat[ABS_X] = TOUCHKIT_XC_FLAT; - touchkit->input.absmin[ABS_Y] = TOUCHKIT_MIN_YC; - touchkit->input.absmax[ABS_Y] = TOUCHKIT_MAX_YC; - touchkit->input.absfuzz[ABS_Y] = TOUCHKIT_YC_FUZZ; - touchkit->input.absflat[ABS_Y] = TOUCHKIT_YC_FLAT; - if (udev->manufacturer) - strcat(touchkit->name, udev->manufacturer); - if (udev->product) - sprintf(touchkit->name, "%s %s", touchkit->name, udev->product); - - if (!strlen(touchkit->name)) - sprintf(touchkit->name, "USB Touchscreen %04x:%04x", - touchkit->input.id.vendor, touchkit->input.id.product); + if (touchkit_alloc_buffers(udev, touchkit)) + goto out_free; touchkit->irq = usb_alloc_urb(0, GFP_KERNEL); if (!touchkit->irq) { dbg("%s - usb_alloc_urb failed: touchkit->irq", __FUNCTION__); - ret = -ENOMEM; goto out_free_buffers; } + touchkit->udev = udev; + touchkit->input = input_dev; + + if (udev->manufacturer) + strlcpy(touchkit->name, udev->manufacturer, sizeof(touchkit->name)); + + if (udev->product) { + if (udev->manufacturer) + strlcat(touchkit->name, " ", sizeof(touchkit->name)); + strlcat(touchkit->name, udev->product, sizeof(touchkit->name)); + } + + if (!strlen(touchkit->name)) + snprintf(touchkit->name, sizeof(touchkit->name), + "USB Touchscreen %04x:%04x", + le16_to_cpu(udev->descriptor.idVendor), + le16_to_cpu(udev->descriptor.idProduct)); + + usb_make_path(udev, touchkit->phys, sizeof(touchkit->phys)); + strlcpy(touchkit->phys, "/input0", sizeof(touchkit->phys)); + + input_dev->name = touchkit->name; + input_dev->phys = touchkit->phys; + usb_to_input_id(udev, &input_dev->id); + input_dev->cdev.dev = &intf->dev; + input_dev->private = touchkit; + input_dev->open = touchkit_open; + input_dev->close = touchkit_close; + + input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); + input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); + input_set_abs_params(input_dev, ABS_X, TOUCHKIT_MIN_XC, TOUCHKIT_MAX_XC, + TOUCHKIT_XC_FUZZ, TOUCHKIT_XC_FLAT); + input_set_abs_params(input_dev, ABS_Y, TOUCHKIT_MIN_YC, TOUCHKIT_MAX_YC, + TOUCHKIT_YC_FUZZ, TOUCHKIT_YC_FLAT); + usb_fill_int_urb(touchkit->irq, touchkit->udev, - usb_rcvintpipe(touchkit->udev, 0x81), - touchkit->data, TOUCHKIT_REPORT_DATA_SIZE, - touchkit_irq, touchkit, endpoint->bInterval); + usb_rcvintpipe(touchkit->udev, 0x81), + touchkit->data, TOUCHKIT_REPORT_DATA_SIZE, + touchkit_irq, touchkit, endpoint->bInterval); - input_register_device(&touchkit->input); + touchkit->irq->transfer_dma = touchkit->data_dma; + touchkit->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; - printk(KERN_INFO "input: %s on %s\n", touchkit->name, path); - usb_set_intfdata(intf, touchkit); + input_register_device(touchkit->input); + usb_set_intfdata(intf, touchkit); return 0; out_free_buffers: touchkit_free_buffers(udev, touchkit); out_free: + input_free_device(input_dev); kfree(touchkit); - return ret; + return -ENOMEM; } static void touchkit_disconnect(struct usb_interface *intf) @@ -275,8 +361,8 @@ static void touchkit_disconnect(struct usb_interface *intf) dbg("%s - touchkit is initialized, cleaning up", __FUNCTION__); usb_set_intfdata(intf, NULL); - input_unregister_device(&touchkit->input); usb_kill_urb(touchkit->irq); + input_unregister_device(touchkit->input); usb_free_urb(touchkit->irq); touchkit_free_buffers(interface_to_usbdev(intf), touchkit); kfree(touchkit); @@ -285,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, diff --git a/drivers/usb/input/usbkbd.c b/drivers/usb/input/usbkbd.c index 2f3edc26c..5067a6ae6 100644 --- a/drivers/usb/input/usbkbd.c +++ b/drivers/usb/input/usbkbd.c @@ -29,10 +29,8 @@ #include #include #include -#include #include -#include -#include +#include /* * Version Information diff --git a/drivers/usb/input/usbmouse.c b/drivers/usb/input/usbmouse.c index af526135d..446935b67 100644 --- a/drivers/usb/input/usbmouse.c +++ b/drivers/usb/input/usbmouse.c @@ -28,11 +28,9 @@ #include #include -#include #include #include -#include -#include +#include /* * Version Information diff --git a/drivers/usb/input/usbtouchscreen.c b/drivers/usb/input/usbtouchscreen.c index e9a07c1e9..4094ef47d 100644 --- a/drivers/usb/input/usbtouchscreen.c +++ b/drivers/usb/input/usbtouchscreen.c @@ -32,14 +32,13 @@ //#define DEBUG -#include #include #include #include #include #include #include -#include +#include #define DRIVER_VERSION "v0.3" @@ -286,7 +285,7 @@ static int mtouch_init(struct usbtouch_usb *usbtouch) static int itm_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *press) { *x = ((pkt[0] & 0x1F) << 7) | (pkt[3] & 0x7F); - *x = ((pkt[1] & 0x1F) << 7) | (pkt[4] & 0x7F); + *y = ((pkt[1] & 0x1F) << 7) | (pkt[4] & 0x7F); *press = ((pkt[2] & 0x1F) << 7) | (pkt[5] & 0x7F); *touch = ~pkt[7] & 0x20; diff --git a/drivers/usb/input/wacom.c b/drivers/usb/input/wacom.c index cf84c6096..369461a70 100644 --- a/drivers/usb/input/wacom.c +++ b/drivers/usb/input/wacom.c @@ -69,13 +69,10 @@ #include #include -#include #include #include -#include -#include +#include #include -#include /* * Version Information diff --git a/drivers/usb/input/xpad.c b/drivers/usb/input/xpad.c index e278489a8..9889b1cda 100644 --- a/drivers/usb/input/xpad.c +++ b/drivers/usb/input/xpad.c @@ -54,15 +54,12 @@ * 2002-07-17 - 0.0.5 : simplified d-pad handling */ -#include #include -#include #include #include #include #include -#include -#include +#include #define DRIVER_VERSION "v0.0.5" #define DRIVER_AUTHOR "Marko Friedemann " diff --git a/drivers/usb/input/yealink.c b/drivers/usb/input/yealink.c index 37d2f0ba0..7b45fd3de 100644 --- a/drivers/usb/input/yealink.c +++ b/drivers/usb/input/yealink.c @@ -46,15 +46,12 @@ * 20050816 henk Merge 2.6.13-rc6 */ -#include #include -#include #include #include #include #include -#include -#include +#include #include "map_to_7segment.h" #include "yealink.h" @@ -813,12 +810,9 @@ static int usb_cleanup(struct yealink_dev *yld, int err) if (yld == NULL) return err; - if (yld->urb_irq) { - usb_kill_urb(yld->urb_irq); - usb_free_urb(yld->urb_irq); - } - if (yld->urb_ctl) - usb_free_urb(yld->urb_ctl); + usb_kill_urb(yld->urb_irq); /* parameter validation in core/urb */ + usb_kill_urb(yld->urb_ctl); /* parameter validation in core/urb */ + if (yld->idev) { if (err) input_free_device(yld->idev); @@ -834,6 +828,9 @@ static int usb_cleanup(struct yealink_dev *yld, int err) if (yld->irq_data) usb_buffer_free(yld->udev, USB_PKT_LEN, yld->irq_data, yld->irq_dma); + + usb_free_urb(yld->urb_irq); /* parameter validation in core/urb */ + usb_free_urb(yld->urb_ctl); /* parameter validation in core/urb */ kfree(yld); return err; } diff --git a/drivers/usb/misc/Kconfig b/drivers/usb/misc/Kconfig index 8ba6a701e..88928a4be 100644 --- a/drivers/usb/misc/Kconfig +++ b/drivers/usb/misc/Kconfig @@ -88,6 +88,20 @@ config USB_LED To compile this driver as a module, choose M here: the module will be called usbled. +config USB_CYPRESS_CY7C63 + tristate "Cypress CY7C63xxx USB driver support" + depends on USB + help + Say Y here if you want to connect a Cypress CY7C63xxx + micro controller to your computer's USB port. Currently this + driver supports the pre-programmed devices (incl. firmware) + by AK Modul-Bus Computer GmbH. + + Please see: http://www.ak-modul-bus.de/stat/mikrocontroller.html + + To compile this driver as a module, choose M here: the + module will be called cypress_cy7c63. + config USB_CYTHERM tristate "Cypress USB thermometer driver support" depends on USB @@ -137,6 +151,15 @@ config USB_IDMOUSE See also . +config USB_APPLEDISPLAY + tristate "Apple Cinema Display support" + depends on USB + select BACKLIGHT_LCD_SUPPORT + select BACKLIGHT_CLASS_DEVICE + help + Say Y here if you want to control the backlight of Apple Cinema + Displays over USB. This driver provides a sysfs interface. + source "drivers/usb/misc/sisusbvga/Kconfig" config USB_LD diff --git a/drivers/usb/misc/Makefile b/drivers/usb/misc/Makefile index 6c693bc68..2927260c5 100644 --- a/drivers/usb/misc/Makefile +++ b/drivers/usb/misc/Makefile @@ -4,6 +4,7 @@ # obj-$(CONFIG_USB_AUERSWALD) += auerswald.o +obj-$(CONFIG_USB_CYPRESS_CY7C63)+= cypress_cy7c63.o obj-$(CONFIG_USB_CYTHERM) += cytherm.o obj-$(CONFIG_USB_EMI26) += emi26.o obj-$(CONFIG_USB_EMI62) += emi62.o @@ -17,6 +18,7 @@ obj-$(CONFIG_USB_PHIDGETSERVO) += phidgetservo.o obj-$(CONFIG_USB_RIO500) += rio500.o obj-$(CONFIG_USB_TEST) += usbtest.o obj-$(CONFIG_USB_USS720) += uss720.o +obj-$(CONFIG_USB_APPLEDISPLAY) += appledisplay.o obj-$(CONFIG_USB_SISUSBVGA) += sisusbvga/ diff --git a/drivers/usb/misc/cytherm.c b/drivers/usb/misc/cytherm.c index a04204292..b20bec445 100644 --- a/drivers/usb/misc/cytherm.c +++ b/drivers/usb/misc/cytherm.c @@ -14,7 +14,6 @@ */ -#include #include #include #include diff --git a/drivers/usb/misc/idmouse.c b/drivers/usb/misc/idmouse.c index ce030d1f1..fcd69c52a 100644 --- a/drivers/usb/misc/idmouse.c +++ b/drivers/usb/misc/idmouse.c @@ -1,4 +1,4 @@ -/* Siemens ID Mouse driver v0.5 +/* Siemens ID Mouse driver v0.6 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -11,9 +11,11 @@ Derived from the USB Skeleton driver 1.1, Copyright (C) 2003 Greg Kroah-Hartman (greg@kroah.com) + Additional information provided by Martin Reising + + */ -#include #include #include #include @@ -22,32 +24,48 @@ #include #include #include +#include #include #include +/* image constants */ #define WIDTH 225 -#define HEIGHT 288 -#define HEADER "P5 225 288 255 " +#define HEIGHT 289 +#define HEADER "P5 225 289 255 " #define IMGSIZE ((WIDTH * HEIGHT) + sizeof(HEADER)-1) -/* Version Information */ -#define DRIVER_VERSION "0.5" +/* version information */ +#define DRIVER_VERSION "0.6" #define DRIVER_SHORT "idmouse" #define DRIVER_AUTHOR "Florian 'Floe' Echtler " #define DRIVER_DESC "Siemens ID Mouse FingerTIP Sensor Driver" -/* Siemens ID Mouse */ -#define USB_IDMOUSE_VENDOR_ID 0x0681 -#define USB_IDMOUSE_PRODUCT_ID 0x0005 - -/* we still need a minor number */ +/* minor number for misc USB devices */ #define USB_IDMOUSE_MINOR_BASE 132 +/* vendor and device IDs */ +#define ID_SIEMENS 0x0681 +#define ID_IDMOUSE 0x0005 +#define ID_CHERRY 0x0010 + +/* device ID table */ static struct usb_device_id idmouse_table[] = { - {USB_DEVICE(USB_IDMOUSE_VENDOR_ID, USB_IDMOUSE_PRODUCT_ID)}, - {} /* null entry at the end */ + {USB_DEVICE(ID_SIEMENS, ID_IDMOUSE)}, /* Siemens ID Mouse (Professional) */ + {USB_DEVICE(ID_SIEMENS, ID_CHERRY )}, /* Cherry FingerTIP ID Board */ + {} /* terminating null entry */ }; +/* sensor commands */ +#define FTIP_RESET 0x20 +#define FTIP_ACQUIRE 0x21 +#define FTIP_RELEASE 0x22 +#define FTIP_BLINK 0x23 /* LSB of value = blink pulse width */ +#define FTIP_SCROLL 0x24 + +#define ftip_command(dev, command, value, index) \ + usb_control_msg (dev->udev, usb_sndctrlpipe (dev->udev, 0), command, \ + USB_TYPE_VENDOR | USB_RECIP_ENDPOINT | USB_DIR_OUT, value, index, NULL, 0, 1000) + MODULE_DEVICE_TABLE(usb, idmouse_table); /* structure to hold all of our device specific stuff */ @@ -57,7 +75,8 @@ struct usb_idmouse { struct usb_interface *interface; /* the interface for this device */ unsigned char *bulk_in_buffer; /* the buffer to receive data */ - size_t bulk_in_size; /* the size of the receive buffer */ + size_t bulk_in_size; /* the maximum bulk packet size */ + size_t orig_bi_size; /* same as above, but reported by the device */ __u8 bulk_in_endpointAddr; /* the address of the bulk in endpoint */ int open; /* if the port is open or not */ @@ -86,25 +105,23 @@ static struct file_operations idmouse_fops = { .release = idmouse_release, }; -/* class driver information for devfs */ +/* class driver information */ static struct usb_class_driver idmouse_class = { - .name = "usb/idmouse%d", + .name = "idmouse%d", .fops = &idmouse_fops, - .mode = S_IFCHR | S_IRUSR | S_IRGRP | S_IROTH, /* filemode (char, 444) */ .minor_base = USB_IDMOUSE_MINOR_BASE, }; /* 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, .id_table = idmouse_table, }; -// prevent races between open() and disconnect() -static DECLARE_MUTEX(disconnect_sem); +/* prevent races between open() and disconnect() */ +static DEFINE_MUTEX(disconnect_mutex); static int idmouse_create_image(struct usb_idmouse *dev) { @@ -112,42 +129,34 @@ static int idmouse_create_image(struct usb_idmouse *dev) int bulk_read = 0; int result = 0; - if (dev->bulk_in_size < sizeof(HEADER)) - return -ENOMEM; - - memcpy(dev->bulk_in_buffer,HEADER,sizeof(HEADER)-1); + memcpy(dev->bulk_in_buffer, HEADER, sizeof(HEADER)-1); bytes_read += sizeof(HEADER)-1; - /* Dump the setup packets. Yes, they are uncommented, simply - because they were sniffed under Windows using SnoopyPro. - I _guess_ that 0x22 is a kind of reset command and 0x21 - means init.. - */ - result = usb_control_msg (dev->udev, usb_sndctrlpipe (dev->udev, 0), - 0x21, 0x42, 0x0001, 0x0002, NULL, 0, 1000); + /* reset the device and set a fast blink rate */ + result = ftip_command(dev, FTIP_RELEASE, 0, 0); if (result < 0) - return result; - result = usb_control_msg (dev->udev, usb_sndctrlpipe (dev->udev, 0), - 0x20, 0x42, 0x0001, 0x0002, NULL, 0, 1000); + goto reset; + result = ftip_command(dev, FTIP_BLINK, 1, 0); if (result < 0) - return result; - result = usb_control_msg (dev->udev, usb_sndctrlpipe (dev->udev, 0), - 0x22, 0x42, 0x0000, 0x0002, NULL, 0, 1000); - if (result < 0) - return result; + goto reset; - result = usb_control_msg (dev->udev, usb_sndctrlpipe (dev->udev, 0), - 0x21, 0x42, 0x0001, 0x0002, NULL, 0, 1000); + /* initialize the sensor - sending this command twice */ + /* significantly reduces the rate of failed reads */ + result = ftip_command(dev, FTIP_ACQUIRE, 0, 0); if (result < 0) - return result; - result = usb_control_msg (dev->udev, usb_sndctrlpipe (dev->udev, 0), - 0x20, 0x42, 0x0001, 0x0002, NULL, 0, 1000); + goto reset; + result = ftip_command(dev, FTIP_ACQUIRE, 0, 0); if (result < 0) - return result; - result = usb_control_msg (dev->udev, usb_sndctrlpipe (dev->udev, 0), - 0x20, 0x42, 0x0000, 0x0002, NULL, 0, 1000); + goto reset; + + /* start the readout - sending this command twice */ + /* presumably enables the high dynamic range mode */ + result = ftip_command(dev, FTIP_RESET, 0, 0); if (result < 0) - return result; + goto reset; + result = ftip_command(dev, FTIP_RESET, 0, 0); + if (result < 0) + goto reset; /* loop over a blocking bulk read to get data from the device */ while (bytes_read < IMGSIZE) { @@ -155,22 +164,40 @@ static int idmouse_create_image(struct usb_idmouse *dev) usb_rcvbulkpipe (dev->udev, dev->bulk_in_endpointAddr), dev->bulk_in_buffer + bytes_read, dev->bulk_in_size, &bulk_read, 5000); - if (result < 0) - return result; - if (signal_pending(current)) - return -EINTR; + if (result < 0) { + /* Maybe this error was caused by the increased packet size? */ + /* Reset to the original value and tell userspace to retry. */ + if (dev->bulk_in_size != dev->orig_bi_size) { + dev->bulk_in_size = dev->orig_bi_size; + result = -EAGAIN; + } + break; + } + if (signal_pending(current)) { + result = -EINTR; + break; + } bytes_read += bulk_read; } /* reset the device */ - result = usb_control_msg (dev->udev, usb_sndctrlpipe (dev->udev, 0), - 0x22, 0x42, 0x0000, 0x0002, NULL, 0, 1000); - if (result < 0) - return result; +reset: + ftip_command(dev, FTIP_RELEASE, 0, 0); - /* should be IMGSIZE == 64815 */ + /* check for valid image */ + /* right border should be black (0x00) */ + for (bytes_read = sizeof(HEADER)-1 + WIDTH-1; bytes_read < IMGSIZE; bytes_read += WIDTH) + if (dev->bulk_in_buffer[bytes_read] != 0x00) + return -EAGAIN; + + /* lower border should be white (0xFF) */ + for (bytes_read = IMGSIZE-WIDTH; bytes_read < IMGSIZE-1; bytes_read++) + if (dev->bulk_in_buffer[bytes_read] != 0xFF) + return -EAGAIN; + + /* should be IMGSIZE == 65040 */ dbg("read %d bytes fingerprint data", bytes_read); - return 0; + return result; } static inline void idmouse_delete(struct usb_idmouse *dev) @@ -186,18 +213,18 @@ static int idmouse_open(struct inode *inode, struct file *file) int result = 0; /* prevent disconnects */ - down(&disconnect_sem); + mutex_lock(&disconnect_mutex); /* get the interface from minor number and driver information */ interface = usb_find_interface (&idmouse_driver, iminor (inode)); if (!interface) { - up(&disconnect_sem); + mutex_unlock(&disconnect_mutex); return -ENODEV; } /* get the device information block from the interface */ dev = usb_get_intfdata(interface); if (!dev) { - up(&disconnect_sem); + mutex_unlock(&disconnect_mutex); return -ENODEV; } @@ -231,7 +258,7 @@ error: up(&dev->sem); /* unlock the disconnect semaphore */ - up(&disconnect_sem); + mutex_unlock(&disconnect_mutex); return result; } @@ -240,12 +267,12 @@ static int idmouse_release(struct inode *inode, struct file *file) struct usb_idmouse *dev; /* prevent a race condition with open() */ - down(&disconnect_sem); + mutex_lock(&disconnect_mutex); dev = (struct usb_idmouse *) file->private_data; if (dev == NULL) { - up(&disconnect_sem); + mutex_unlock(&disconnect_mutex); return -ENODEV; } @@ -255,7 +282,7 @@ static int idmouse_release(struct inode *inode, struct file *file) /* are we really open? */ if (dev->open <= 0) { up(&dev->sem); - up(&disconnect_sem); + mutex_unlock(&disconnect_mutex); return -ENODEV; } @@ -265,12 +292,12 @@ static int idmouse_release(struct inode *inode, struct file *file) /* the device was unplugged before the file was released */ up(&dev->sem); idmouse_delete(dev); - up(&disconnect_sem); + mutex_unlock(&disconnect_mutex); return 0; } up(&dev->sem); - up(&disconnect_sem); + mutex_unlock(&disconnect_mutex); return 0; } @@ -282,31 +309,18 @@ static ssize_t idmouse_read(struct file *file, char __user *buffer, size_t count dev = (struct usb_idmouse *) file->private_data; - // lock this object + /* lock this object */ down (&dev->sem); - // verify that the device wasn't unplugged + /* verify that the device wasn't unplugged */ if (!dev->present) { up (&dev->sem); return -ENODEV; } - if (*ppos >= IMGSIZE) { - up (&dev->sem); - return 0; - } - - if (count > IMGSIZE - *ppos) - count = IMGSIZE - *ppos; - - if (copy_to_user (buffer, dev->bulk_in_buffer + *ppos, count)) { - result = -EFAULT; - } else { - result = count; - *ppos += count; - } - - // unlock the device + result = simple_read_from_buffer(buffer, count, ppos, + dev->bulk_in_buffer, IMGSIZE); + /* unlock the device */ up(&dev->sem); return result; } @@ -318,7 +332,6 @@ static int idmouse_probe(struct usb_interface *interface, struct usb_idmouse *dev = NULL; struct usb_host_interface *iface_desc; struct usb_endpoint_descriptor *endpoint; - size_t buffer_size; int result; /* check if we have gotten the data or the hid interface */ @@ -327,10 +340,9 @@ static int idmouse_probe(struct usb_interface *interface, return -ENODEV; /* allocate memory for our device state and initialize it */ - dev = kmalloc(sizeof(*dev), GFP_KERNEL); + dev = kzalloc(sizeof(*dev), GFP_KERNEL); if (dev == NULL) return -ENOMEM; - memset(dev, 0x00, sizeof(*dev)); init_MUTEX(&dev->sem); dev->udev = udev; @@ -344,11 +356,11 @@ static int idmouse_probe(struct usb_interface *interface, USB_ENDPOINT_XFER_BULK)) { /* we found a bulk in endpoint */ - buffer_size = le16_to_cpu(endpoint->wMaxPacketSize); - dev->bulk_in_size = buffer_size; + dev->orig_bi_size = le16_to_cpu(endpoint->wMaxPacketSize); + dev->bulk_in_size = 0x200; /* works _much_ faster */ dev->bulk_in_endpointAddr = endpoint->bEndpointAddress; dev->bulk_in_buffer = - kmalloc(IMGSIZE + buffer_size, GFP_KERNEL); + kmalloc(IMGSIZE + dev->bulk_in_size, GFP_KERNEL); if (!dev->bulk_in_buffer) { err("Unable to allocate input buffer."); @@ -387,7 +399,7 @@ static void idmouse_disconnect(struct usb_interface *interface) struct usb_idmouse *dev; /* prevent races with open() */ - down(&disconnect_sem); + mutex_lock(&disconnect_mutex); /* get device structure */ dev = usb_get_intfdata(interface); @@ -409,7 +421,7 @@ static void idmouse_disconnect(struct usb_interface *interface) if (!dev->open) idmouse_delete(dev); - up(&disconnect_sem); + mutex_unlock(&disconnect_mutex); info("%s disconnected", DRIVER_DESC); } diff --git a/drivers/usb/misc/ldusb.c b/drivers/usb/misc/ldusb.c index 966acb474..f30ab1fbb 100644 --- a/drivers/usb/misc/ldusb.c +++ b/drivers/usb/misc/ldusb.c @@ -27,7 +27,6 @@ * V0.13 (mh) Added support for LD X-Ray and Machine Test System */ -#include #include #include #include diff --git a/drivers/usb/misc/legousbtower.c b/drivers/usb/misc/legousbtower.c index 779bcf037..7699d970e 100644 --- a/drivers/usb/misc/legousbtower.c +++ b/drivers/usb/misc/legousbtower.c @@ -75,7 +75,6 @@ * - move reset into open to clean out spurious data */ -#include #include #include #include diff --git a/drivers/usb/misc/phidgetkit.c b/drivers/usb/misc/phidgetkit.c index 997db5d8e..bfbbbfbb9 100644 --- a/drivers/usb/misc/phidgetkit.c +++ b/drivers/usb/misc/phidgetkit.c @@ -1,7 +1,8 @@ /* * USB PhidgetInterfaceKit driver 1.0 * - * Copyright (C) 2004 Sean Young + * Copyright (C) 2004, 2006 Sean Young + * Copyright (C) 2005 Daniel Saakes * Copyright (C) 2004 Greg Kroah-Hartman * * This program is free software; you can redistribute it and/or modify @@ -12,7 +13,6 @@ * This is a driver for the USB PhidgetInterfaceKit. */ -#include #include #include #include @@ -25,6 +25,7 @@ #define USB_VENDOR_ID_GLAB 0x06c2 #define USB_DEVICE_ID_INTERFACEKIT004 0x0040 +#define USB_DEVICE_ID_INTERFACEKIT01616 0x0044 #define USB_DEVICE_ID_INTERFACEKIT888 0x0045 #define USB_DEVICE_ID_INTERFACEKIT047 0x0051 #define USB_DEVICE_ID_INTERFACEKIT088 0x0053 @@ -32,7 +33,9 @@ #define USB_VENDOR_ID_WISEGROUP 0x0925 #define USB_DEVICE_ID_INTERFACEKIT884 0x8201 -#define MAX_INTERFACES 8 +#define MAX_INTERFACES 16 + +#define URB_INT_SIZE 8 struct driver_interfacekit { int sensors; @@ -52,19 +55,24 @@ ifkit(8, 8, 8, 0); ifkit(0, 4, 7, 1); ifkit(8, 8, 4, 0); ifkit(0, 8, 8, 1); +ifkit(0, 16, 16, 0); -struct phidget_interfacekit { +struct interfacekit { struct usb_device *udev; struct usb_interface *intf; struct driver_interfacekit *ifkit; - int outputs[MAX_INTERFACES]; - int inputs[MAX_INTERFACES]; - int sensors[MAX_INTERFACES]; + unsigned long outputs; + u8 inputs[MAX_INTERFACES]; + u16 sensors[MAX_INTERFACES]; u8 lcd_files_on; struct urb *irq; unsigned char *data; dma_addr_t data_dma; + + struct work_struct do_notify; + unsigned long input_events; + unsigned long sensor_events; }; static struct usb_device_id id_table[] = { @@ -76,33 +84,33 @@ static struct usb_device_id id_table[] = { .driver_info = (kernel_ulong_t)&ph_047}, {USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_INTERFACEKIT088), .driver_info = (kernel_ulong_t)&ph_088}, + {USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_INTERFACEKIT01616), + .driver_info = (kernel_ulong_t)&ph_01616}, {USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_INTERFACEKIT884), .driver_info = (kernel_ulong_t)&ph_884}, {} }; MODULE_DEVICE_TABLE(usb, id_table); -static int change_outputs(struct phidget_interfacekit *kit, int output_num, int enable) +static int change_outputs(struct interfacekit *kit, int output_num, int enable) { - unsigned char *buffer; + u8 *buffer; int retval; - int n; + + if (enable) + set_bit(output_num, &kit->outputs); + else + clear_bit(output_num, &kit->outputs); buffer = kzalloc(4, GFP_KERNEL); if (!buffer) { - dev_err(&kit->udev->dev, "%s - out of memory\n", - __FUNCTION__); + dev_err(&kit->udev->dev, "%s - out of memory\n", __FUNCTION__); return -ENOMEM; } + buffer[0] = (u8)kit->outputs; + buffer[1] = (u8)(kit->outputs >> 8); - kit->outputs[output_num] = enable; - for (n=0; n<8; n++) { - if (kit->outputs[n]) { - buffer[0] |= 1 << n; - } - } - - dev_dbg(&kit->udev->dev, "sending data: %02x\n", buffer[0]); + dev_dbg(&kit->udev->dev, "sending data: 0x%04x\n", (u16)kit->outputs); retval = usb_control_msg(kit->udev, usb_sndctrlpipe(kit->udev, 0), @@ -116,10 +124,10 @@ static int change_outputs(struct phidget_interfacekit *kit, int output_num, int return retval < 0 ? retval : 0; } -static int change_string(struct phidget_interfacekit *kit, const char *display, unsigned char row) +static int change_string(struct interfacekit *kit, const char *display, unsigned char row) { unsigned char *buffer; - unsigned char *form_buffer; + unsigned char *form_buffer; int retval = -ENOMEM; int i,j, len, buf_ptr; @@ -175,7 +183,7 @@ exit: static ssize_t lcd_line_##number(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ - struct phidget_interfacekit *kit = usb_get_intfdata(intf); \ + struct interfacekit *kit = usb_get_intfdata(intf); \ change_string(kit, buf, number - 1); \ return count; \ } \ @@ -186,7 +194,7 @@ set_lcd_line(2); static ssize_t set_backlight(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct usb_interface *intf = to_usb_interface(dev); - struct phidget_interfacekit *kit = usb_get_intfdata(intf); + struct interfacekit *kit = usb_get_intfdata(intf); int enabled; unsigned char *buffer; int retval = -ENOMEM; @@ -220,7 +228,7 @@ exit: } static DEVICE_ATTR(backlight, S_IWUGO, NULL, set_backlight); -static void remove_lcd_files(struct phidget_interfacekit *kit) +static void remove_lcd_files(struct interfacekit *kit) { if (kit->lcd_files_on) { dev_dbg(&kit->udev->dev, "Removing lcd files\n"); @@ -233,7 +241,7 @@ static void remove_lcd_files(struct phidget_interfacekit *kit) static ssize_t enable_lcd_files(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct usb_interface *intf = to_usb_interface(dev); - struct phidget_interfacekit *kit = usb_get_intfdata(intf); + struct interfacekit *kit = usb_get_intfdata(intf); int enable; if (kit->ifkit->has_lcd == 0) @@ -263,10 +271,10 @@ static DEVICE_ATTR(lcd, S_IWUGO, NULL, enable_lcd_files); static void interfacekit_irq(struct urb *urb, struct pt_regs *regs) { - struct phidget_interfacekit *kit = urb->context; + struct interfacekit *kit = urb->context; unsigned char *buffer = kit->data; + int i, level, sensor; int status; - int n; switch (urb->status) { case 0: /* success */ @@ -280,22 +288,63 @@ static void interfacekit_irq(struct urb *urb, struct pt_regs *regs) goto resubmit; } - for (n=0; n<8; n++) { - kit->inputs[n] = buffer[1] & (1 << n) ? 1 : 0; + /* digital inputs */ + if (kit->ifkit->inputs == 16) { + for (i=0; i < 8; i++) { + level = (buffer[0] >> i) & 1; + if (kit->inputs[i] != level) { + kit->inputs[i] = level; + set_bit(i, &kit->input_events); + } + level = (buffer[1] >> i) & 1; + if (kit->inputs[8 + i] != level) { + kit->inputs[8 + i] = level; + set_bit(8 + i, &kit->input_events); + } + } + } + else if (kit->ifkit->inputs == 8) { + for (i=0; i < 8; i++) { + level = (buffer[1] >> i) & 1; + if (kit->inputs[i] != level) { + kit->inputs[i] = level; + set_bit(i, &kit->input_events); + } + } } - if (buffer[0] & 1) { - kit->sensors[4] = buffer[2] + (buffer[3] & 0x0f) * 256; - kit->sensors[5] = buffer[4] + (buffer[3] & 0xf0) * 16; - kit->sensors[6] = buffer[5] + (buffer[6] & 0x0f) * 256; - kit->sensors[7] = buffer[7] + (buffer[6] & 0xf0) * 16; - } else { - kit->sensors[0] = buffer[2] + (buffer[3] & 0x0f) * 256; - kit->sensors[1] = buffer[4] + (buffer[3] & 0xf0) * 16; - kit->sensors[2] = buffer[5] + (buffer[6] & 0x0f) * 256; - kit->sensors[3] = buffer[7] + (buffer[6] & 0xf0) * 16; + /* analog inputs */ + if (kit->ifkit->sensors) { + sensor = (buffer[0] & 1) ? 4 : 0; + + level = buffer[2] + (buffer[3] & 0x0f) * 256; + if (level != kit->sensors[sensor]) { + kit->sensors[sensor] = level; + set_bit(sensor, &kit->sensor_events); + } + sensor++; + level = buffer[4] + (buffer[3] & 0xf0) * 16; + if (level != kit->sensors[sensor]) { + kit->sensors[sensor] = level; + set_bit(sensor, &kit->sensor_events); + } + sensor++; + level = buffer[5] + (buffer[6] & 0x0f) * 256; + if (level != kit->sensors[sensor]) { + kit->sensors[sensor] = level; + set_bit(sensor, &kit->sensor_events); + } + sensor++; + level = buffer[7] + (buffer[6] & 0xf0) * 16; + if (level != kit->sensors[sensor]) { + kit->sensors[sensor] = level; + set_bit(sensor, &kit->sensor_events); + } } + if (kit->input_events || kit->sensor_events) + schedule_work(&kit->do_notify); + resubmit: status = usb_submit_urb(urb, SLAB_ATOMIC); if (status) @@ -304,20 +353,40 @@ resubmit: kit->udev->devpath, status); } +static void do_notify(void *data) +{ + struct interfacekit *kit = data; + int i; + char sysfs_file[8]; + + for (i=0; iifkit->inputs; i++) { + if (test_and_clear_bit(i, &kit->input_events)) { + sprintf(sysfs_file, "input%d", i + 1); + sysfs_notify(&kit->intf->dev.kobj, NULL, sysfs_file); + } + } + + for (i=0; iifkit->sensors; i++) { + if (test_and_clear_bit(i, &kit->sensor_events)) { + sprintf(sysfs_file, "sensor%d", i + 1); + sysfs_notify(&kit->intf->dev.kobj, NULL, sysfs_file); + } + } +} + #define show_set_output(value) \ -static ssize_t set_output##value(struct device *dev, struct device_attribute *attr, const char *buf, \ +static ssize_t set_output##value(struct device *dev, struct device_attribute *attr, const char *buf, \ size_t count) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ - struct phidget_interfacekit *kit = usb_get_intfdata(intf); \ + struct interfacekit *kit = usb_get_intfdata(intf); \ int enabled; \ int retval; \ \ - if (sscanf(buf, "%d", &enabled) < 1) { \ + if (sscanf(buf, "%d", &enabled) < 1) \ return -EINVAL; \ - } \ \ - retval = change_outputs(kit, value - 1, enabled ? 1 : 0); \ + retval = change_outputs(kit, value - 1, enabled); \ \ return retval ? retval : count; \ } \ @@ -325,9 +394,9 @@ static ssize_t set_output##value(struct device *dev, struct device_attribute *at static ssize_t show_output##value(struct device *dev, struct device_attribute *attr, char *buf) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ - struct phidget_interfacekit *kit = usb_get_intfdata(intf); \ + struct interfacekit *kit = usb_get_intfdata(intf); \ \ - return sprintf(buf, "%d\n", kit->outputs[value - 1]); \ + return sprintf(buf, "%d\n", !!test_bit(value - 1, &kit->outputs));\ } \ static DEVICE_ATTR(output##value, S_IWUGO | S_IRUGO, \ show_output##value, set_output##value); @@ -338,15 +407,23 @@ show_set_output(4); show_set_output(5); show_set_output(6); show_set_output(7); -show_set_output(8); /* should be MAX_INTERFACES - 1 */ +show_set_output(8); +show_set_output(9); +show_set_output(10); +show_set_output(11); +show_set_output(12); +show_set_output(13); +show_set_output(14); +show_set_output(15); +show_set_output(16); #define show_input(value) \ static ssize_t show_input##value(struct device *dev, struct device_attribute *attr, char *buf) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ - struct phidget_interfacekit *kit = usb_get_intfdata(intf); \ + struct interfacekit *kit = usb_get_intfdata(intf); \ \ - return sprintf(buf, "%d\n", kit->inputs[value - 1]); \ + return sprintf(buf, "%d\n", (int)kit->inputs[value - 1]); \ } \ static DEVICE_ATTR(input##value, S_IRUGO, show_input##value, NULL); @@ -357,15 +434,23 @@ show_input(4); show_input(5); show_input(6); show_input(7); -show_input(8); /* should be MAX_INTERFACES - 1 */ +show_input(8); +show_input(9); +show_input(10); +show_input(11); +show_input(12); +show_input(13); +show_input(14); +show_input(15); +show_input(16); #define show_sensor(value) \ static ssize_t show_sensor##value(struct device *dev, struct device_attribute *attr, char *buf) \ { \ struct usb_interface *intf = to_usb_interface(dev); \ - struct phidget_interfacekit *kit = usb_get_intfdata(intf); \ + struct interfacekit *kit = usb_get_intfdata(intf); \ \ - return sprintf(buf, "%d\n", kit->sensors[value - 1]); \ + return sprintf(buf, "%d\n", (int)kit->sensors[value - 1]); \ } \ static DEVICE_ATTR(sensor##value, S_IRUGO, show_sensor##value, NULL); @@ -376,16 +461,16 @@ show_sensor(4); show_sensor(5); show_sensor(6); show_sensor(7); -show_sensor(8); /* should be MAX_INTERFACES - 1 */ +show_sensor(8); static int interfacekit_probe(struct usb_interface *intf, const struct usb_device_id *id) { struct usb_device *dev = interface_to_usbdev(intf); struct usb_host_interface *interface; struct usb_endpoint_descriptor *endpoint; - struct phidget_interfacekit *kit; + struct interfacekit *kit; struct driver_interfacekit *ifkit; - int pipe, maxp; + int pipe, maxp, rc = -ENOMEM; ifkit = (struct driver_interfacekit *)id->driver_info; if (!ifkit) @@ -405,29 +490,23 @@ static int interfacekit_probe(struct usb_interface *intf, const struct usb_devic maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe)); kit = kzalloc(sizeof(*kit), GFP_KERNEL); - if (kit == NULL) { - dev_err(&intf->dev, "%s - out of memory\n", __FUNCTION__); - return -ENOMEM; - } - kit->ifkit = ifkit; + if (!kit) + goto out; - kit->data = usb_buffer_alloc(dev, 8, SLAB_ATOMIC, &kit->data_dma); - if (!kit->data) { - kfree(kit); - return -ENOMEM; - } + kit->ifkit = ifkit; + kit->data = usb_buffer_alloc(dev, URB_INT_SIZE, SLAB_ATOMIC, &kit->data_dma); + if (!kit->data) + goto out; kit->irq = usb_alloc_urb(0, GFP_KERNEL); - if (!kit->irq) { - usb_buffer_free(dev, 8, kit->data, kit->data_dma); - kfree(kit); - return -ENOMEM; - } + if (!kit->irq) + goto out; kit->udev = usb_get_dev(dev); kit->intf = intf; + INIT_WORK(&kit->do_notify, do_notify, kit); usb_fill_int_urb(kit->irq, kit->udev, pipe, kit->data, - (maxp > 8 ? 8 : maxp), + maxp > URB_INT_SIZE ? URB_INT_SIZE : maxp, interfacekit_irq, kit, endpoint->bInterval); kit->irq->transfer_dma = kit->data_dma; kit->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; @@ -435,7 +514,8 @@ static int interfacekit_probe(struct usb_interface *intf, const struct usb_devic usb_set_intfdata(intf, kit); if (usb_submit_urb(kit->irq, GFP_KERNEL)) { - return -EIO; + rc = -EIO; + goto out; } if (ifkit->outputs >= 4) { @@ -444,12 +524,22 @@ static int interfacekit_probe(struct usb_interface *intf, const struct usb_devic device_create_file(&intf->dev, &dev_attr_output3); device_create_file(&intf->dev, &dev_attr_output4); } - if (ifkit->outputs == 8) { + if (ifkit->outputs >= 8) { device_create_file(&intf->dev, &dev_attr_output5); device_create_file(&intf->dev, &dev_attr_output6); device_create_file(&intf->dev, &dev_attr_output7); device_create_file(&intf->dev, &dev_attr_output8); } + if (ifkit->outputs == 16) { + device_create_file(&intf->dev, &dev_attr_output9); + device_create_file(&intf->dev, &dev_attr_output10); + device_create_file(&intf->dev, &dev_attr_output11); + device_create_file(&intf->dev, &dev_attr_output12); + device_create_file(&intf->dev, &dev_attr_output13); + device_create_file(&intf->dev, &dev_attr_output14); + device_create_file(&intf->dev, &dev_attr_output15); + device_create_file(&intf->dev, &dev_attr_output16); + } if (ifkit->inputs >= 4) { device_create_file(&intf->dev, &dev_attr_input1); @@ -457,12 +547,22 @@ static int interfacekit_probe(struct usb_interface *intf, const struct usb_devic device_create_file(&intf->dev, &dev_attr_input3); device_create_file(&intf->dev, &dev_attr_input4); } - if (ifkit->inputs == 8) { + if (ifkit->inputs >= 8) { device_create_file(&intf->dev, &dev_attr_input5); device_create_file(&intf->dev, &dev_attr_input6); device_create_file(&intf->dev, &dev_attr_input7); device_create_file(&intf->dev, &dev_attr_input8); } + if (ifkit->inputs == 16) { + device_create_file(&intf->dev, &dev_attr_input9); + device_create_file(&intf->dev, &dev_attr_input10); + device_create_file(&intf->dev, &dev_attr_input11); + device_create_file(&intf->dev, &dev_attr_input12); + device_create_file(&intf->dev, &dev_attr_input13); + device_create_file(&intf->dev, &dev_attr_input14); + device_create_file(&intf->dev, &dev_attr_input15); + device_create_file(&intf->dev, &dev_attr_input16); + } if (ifkit->sensors >= 4) { device_create_file(&intf->dev, &dev_attr_sensor1); @@ -475,9 +575,8 @@ static int interfacekit_probe(struct usb_interface *intf, const struct usb_devic device_create_file(&intf->dev, &dev_attr_sensor6); device_create_file(&intf->dev, &dev_attr_sensor7); } - if (ifkit->sensors == 8) { + if (ifkit->sensors == 8) device_create_file(&intf->dev, &dev_attr_sensor8); - } if (ifkit->has_lcd) device_create_file(&intf->dev, &dev_attr_lcd); @@ -486,29 +585,56 @@ static int interfacekit_probe(struct usb_interface *intf, const struct usb_devic ifkit->sensors, ifkit->inputs, ifkit->outputs); return 0; + +out: + if (kit) { + if (kit->irq) + usb_free_urb(kit->irq); + if (kit->data) + usb_buffer_free(dev, URB_INT_SIZE, kit->data, kit->data_dma); + kfree(kit); + } + + return rc; } static void interfacekit_disconnect(struct usb_interface *interface) { - struct phidget_interfacekit *kit; + struct interfacekit *kit; kit = usb_get_intfdata(interface); usb_set_intfdata(interface, NULL); if (!kit) return; + usb_kill_urb(kit->irq); + usb_free_urb(kit->irq); + usb_buffer_free(kit->udev, URB_INT_SIZE, kit->data, kit->data_dma); + + cancel_delayed_work(&kit->do_notify); + if (kit->ifkit->outputs >= 4) { device_remove_file(&interface->dev, &dev_attr_output1); device_remove_file(&interface->dev, &dev_attr_output2); device_remove_file(&interface->dev, &dev_attr_output3); device_remove_file(&interface->dev, &dev_attr_output4); } - if (kit->ifkit->outputs == 8) { + if (kit->ifkit->outputs >= 8) { device_remove_file(&interface->dev, &dev_attr_output5); device_remove_file(&interface->dev, &dev_attr_output6); device_remove_file(&interface->dev, &dev_attr_output7); device_remove_file(&interface->dev, &dev_attr_output8); } + if (kit->ifkit->outputs == 16) { + device_remove_file(&interface->dev, &dev_attr_output9); + device_remove_file(&interface->dev, &dev_attr_output10); + device_remove_file(&interface->dev, &dev_attr_output11); + device_remove_file(&interface->dev, &dev_attr_output12); + device_remove_file(&interface->dev, &dev_attr_output13); + device_remove_file(&interface->dev, &dev_attr_output14); + device_remove_file(&interface->dev, &dev_attr_output15); + device_remove_file(&interface->dev, &dev_attr_output16); + } if (kit->ifkit->inputs >= 4) { device_remove_file(&interface->dev, &dev_attr_input1); @@ -516,12 +642,22 @@ static void interfacekit_disconnect(struct usb_interface *interface) device_remove_file(&interface->dev, &dev_attr_input3); device_remove_file(&interface->dev, &dev_attr_input4); } - if (kit->ifkit->inputs == 8) { + if (kit->ifkit->inputs >= 8) { device_remove_file(&interface->dev, &dev_attr_input5); device_remove_file(&interface->dev, &dev_attr_input6); device_remove_file(&interface->dev, &dev_attr_input7); device_remove_file(&interface->dev, &dev_attr_input8); } + if (kit->ifkit->inputs == 16) { + device_remove_file(&interface->dev, &dev_attr_input9); + device_remove_file(&interface->dev, &dev_attr_input10); + device_remove_file(&interface->dev, &dev_attr_input11); + device_remove_file(&interface->dev, &dev_attr_input12); + device_remove_file(&interface->dev, &dev_attr_input13); + device_remove_file(&interface->dev, &dev_attr_input14); + device_remove_file(&interface->dev, &dev_attr_input15); + device_remove_file(&interface->dev, &dev_attr_input16); + } if (kit->ifkit->sensors >= 4) { device_remove_file(&interface->dev, &dev_attr_sensor1); @@ -534,19 +670,15 @@ static void interfacekit_disconnect(struct usb_interface *interface) device_remove_file(&interface->dev, &dev_attr_sensor6); device_remove_file(&interface->dev, &dev_attr_sensor7); } - if (kit->ifkit->sensors == 8) { + if (kit->ifkit->sensors == 8) device_remove_file(&interface->dev, &dev_attr_sensor8); - } + if (kit->ifkit->has_lcd) device_remove_file(&interface->dev, &dev_attr_lcd); dev_info(&interface->dev, "USB PhidgetInterfaceKit %d/%d/%d detached\n", kit->ifkit->sensors, kit->ifkit->inputs, kit->ifkit->outputs); - usb_kill_urb(kit->irq); - usb_free_urb(kit->irq); - usb_buffer_free(kit->udev, 8, kit->data, kit->data_dma); - usb_put_dev(kit->udev); kfree(kit); } diff --git a/drivers/usb/misc/phidgetservo.c b/drivers/usb/misc/phidgetservo.c index 4bd291502..c0df79c96 100644 --- a/drivers/usb/misc/phidgetservo.c +++ b/drivers/usb/misc/phidgetservo.c @@ -25,10 +25,6 @@ * */ -#include -#ifdef CONFIG_USB_DEBUG -#define DEBUG 1 -#endif #include #include #include @@ -207,7 +203,7 @@ change_position_v20(struct phidget_servo *servo, int servo_no, int degrees, } #define show_set(value) \ -static ssize_t set_servo##value (struct device *dev, \ +static ssize_t set_servo##value (struct device *dev, struct device_attribute *attr, \ const char *buf, size_t count) \ { \ int degrees, minutes, retval; \ @@ -233,7 +229,7 @@ static ssize_t set_servo##value (struct device *dev, \ return retval < 0 ? retval : count; \ } \ \ -static ssize_t show_servo##value (struct device *dev, char *buf) \ +static ssize_t show_servo##value (struct device *dev, struct device_attribute *attr, char *buf) \ { \ struct usb_interface *intf = to_usb_interface (dev); \ struct phidget_servo *servo = usb_get_intfdata (intf); \ @@ -255,12 +251,11 @@ servo_probe(struct usb_interface *interface, const struct usb_device_id *id) struct usb_device *udev = interface_to_usbdev(interface); struct phidget_servo *dev; - dev = kmalloc(sizeof (struct phidget_servo), GFP_KERNEL); + dev = kzalloc(sizeof (struct phidget_servo), GFP_KERNEL); if (dev == NULL) { dev_err(&interface->dev, "%s - out of memory\n", __FUNCTION__); return -ENOMEM; } - memset(dev, 0x00, sizeof (*dev)); dev->udev = usb_get_dev(udev); dev->type = id->driver_info; @@ -309,7 +304,6 @@ servo_disconnect(struct usb_interface *interface) } static struct usb_driver servo_driver = { - .owner = THIS_MODULE, .name = "phidgetservo", .probe = servo_probe, .disconnect = servo_disconnect, diff --git a/drivers/usb/misc/sisusbvga/sisusb.c b/drivers/usb/misc/sisusbvga/sisusb.c index 2fd12264f..a1d78ca68 100644 --- a/drivers/usb/misc/sisusbvga/sisusb.c +++ b/drivers/usb/misc/sisusbvga/sisusb.c @@ -1,6 +1,8 @@ /* * sisusb - usb kernel driver for SiS315(E) based USB2VGA dongles * + * Main part + * * Copyright (C) 2005 by Thomas Winischhofer, Vienna, Austria * * If distributed as part of the Linux kernel, this code is licensed under the @@ -34,8 +36,7 @@ * */ -#include -#include +#include #include #include #include @@ -48,16 +49,31 @@ #include #include #include +#include #include "sisusb.h" +#include "sisusb_init.h" + +#ifdef INCL_SISUSB_CON +#include +#endif #define SISUSB_DONTSYNC /* Forward declarations / clean-up routines */ +#ifdef INCL_SISUSB_CON +static int sisusb_first_vc = 0; +static int sisusb_last_vc = 0; +module_param_named(first, sisusb_first_vc, int, 0); +module_param_named(last, sisusb_last_vc, int, 0); +MODULE_PARM_DESC(first, "Number of first console to take over (1 - MAX_NR_CONSOLES)"); +MODULE_PARM_DESC(last, "Number of last console to take over (1 - MAX_NR_CONSOLES)"); +#endif + static struct usb_driver sisusb_driver; -static DECLARE_MUTEX(disconnect_sem); +DEFINE_MUTEX(disconnect_mutex); static void sisusb_free_buffers(struct sisusb_usb_data *sisusb) @@ -229,7 +245,7 @@ sisusb_bulkout_msg(struct sisusb_usb_data *sisusb, int index, unsigned int pipe, usb_fill_bulk_urb(urb, sisusb->sisusb_dev, pipe, data, len, sisusb_bulk_completeout, &sisusb->urbout_context[index]); - urb->transfer_flags |= (tflags | URB_ASYNC_UNLINK); + urb->transfer_flags |= tflags; urb->actual_length = 0; if ((urb->transfer_dma = transfer_dma)) @@ -295,7 +311,7 @@ sisusb_bulkin_msg(struct sisusb_usb_data *sisusb, unsigned int pipe, void *data, usb_fill_bulk_urb(urb, sisusb->sisusb_dev, pipe, data, len, sisusb_bulk_completein, sisusb); - urb->transfer_flags |= (tflags | URB_ASYNC_UNLINK); + urb->transfer_flags |= tflags; urb->actual_length = 0; if ((urb->transfer_dma = transfer_dma)) @@ -639,7 +655,10 @@ static int sisusb_send_bridge_packet(struct sisusb_usb_data *sisusb, int len, /* The following routines assume being used to transfer byte, word, * long etc. - * This means that they assume "data" in machine endianness format. + * This means that + * - the write routines expect "data" in machine endianness format. + * The data will be converted to leXX in sisusb_xxx_packet. + * - the read routines can expect read data in machine-endianess. */ static int sisusb_write_memio_byte(struct sisusb_usb_data *sisusb, int type, @@ -815,9 +834,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)) @@ -839,7 +855,7 @@ static int sisusb_write_mem_bulk(struct sisusb_usb_data *sisusb, u32 addr, if (get_user(swap16, (u16 __user *)userbuffer)) return -EFAULT; } else - swap16 = (kernbuffer[0] << 8) | kernbuffer[1]; + swap16 = *((u16 *)kernbuffer); ret = sisusb_write_memio_word(sisusb, SISUSB_TYPE_MEM, @@ -855,14 +871,25 @@ static int sisusb_write_mem_bulk(struct sisusb_usb_data *sisusb, u32 addr, if (userbuffer) { if (copy_from_user(&buf, userbuffer, 3)) return -EFAULT; - +#ifdef __BIG_ENDIAN swap32 = (buf[0] << 16) | (buf[1] << 8) | buf[2]; +#else + swap32 = (buf[2] << 16) | + (buf[1] << 8) | + buf[0]; +#endif } else +#ifdef __BIG_ENDIAN swap32 = (kernbuffer[0] << 16) | (kernbuffer[1] << 8) | kernbuffer[2]; +#else + swap32 = (kernbuffer[2] << 16) | + (kernbuffer[1] << 8) | + kernbuffer[0]; +#endif ret = sisusb_write_memio_24bit(sisusb, SISUSB_TYPE_MEM, @@ -879,10 +906,7 @@ static int sisusb_write_mem_bulk(struct sisusb_usb_data *sisusb, u32 addr, if (get_user(swap32, (u32 __user *)userbuffer)) return -EFAULT; } else - swap32 = (kernbuffer[0] << 24) | - (kernbuffer[1] << 16) | - (kernbuffer[2] << 8) | - kernbuffer[3]; + swap32 = *((u32 *)kernbuffer); ret = sisusb_write_memio_long(sisusb, SISUSB_TYPE_MEM, @@ -1005,6 +1029,10 @@ static int sisusb_write_mem_bulk(struct sisusb_usb_data *sisusb, u32 addr, return ret ? -EIO : 0; } +/* Remember: Read data in packet is in machine-endianess! So for + * byte, word, 24bit, long no endian correction is necessary. + */ + static int sisusb_read_memio_byte(struct sisusb_usb_data *sisusb, int type, u32 addr, u8 *data) { @@ -1161,9 +1189,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, @@ -1191,8 +1216,7 @@ static int sisusb_read_mem_bulk(struct sisusb_usb_data *sisusb, u32 addr, (u16 __user *)userbuffer)) return -EFAULT; } else { - kernbuffer[0] = swap16 >> 8; - kernbuffer[1] = swap16 & 0xff; + *((u16 *)kernbuffer) = swap16; } } return ret; @@ -1202,9 +1226,15 @@ static int sisusb_read_mem_bulk(struct sisusb_usb_data *sisusb, u32 addr, addr, &swap32); if (!ret) { (*bytes_read) += 3; +#ifdef __BIG_ENDIAN buf[0] = (swap32 >> 16) & 0xff; buf[1] = (swap32 >> 8) & 0xff; buf[2] = swap32 & 0xff; +#else + buf[2] = (swap32 >> 16) & 0xff; + buf[1] = (swap32 >> 8) & 0xff; + buf[0] = swap32 & 0xff; +#endif if (userbuffer) { if (copy_to_user(userbuffer, &buf[0], 3)) return -EFAULT; @@ -1228,10 +1258,7 @@ static int sisusb_read_mem_bulk(struct sisusb_usb_data *sisusb, u32 addr, userbuffer += 4; } else { - kernbuffer[0] = (swap32 >> 24) & 0xff; - kernbuffer[1] = (swap32 >> 16) & 0xff; - kernbuffer[2] = (swap32 >> 8) & 0xff; - kernbuffer[3] = swap32 & 0xff; + *((u32 *)kernbuffer) = swap32; kernbuffer += 4; } addr += 4; @@ -1289,7 +1316,21 @@ static int sisusb_read_mem_bulk(struct sisusb_usb_data *sisusb, u32 addr, /* High level: Gfx (indexed) register access */ -static int +#ifdef INCL_SISUSB_CON +int +sisusb_setreg(struct sisusb_usb_data *sisusb, int port, u8 data) +{ + return sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port, data); +} + +int +sisusb_getreg(struct sisusb_usb_data *sisusb, int port, u8 *data) +{ + return sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO, port, data); +} +#endif + +int sisusb_setidxreg(struct sisusb_usb_data *sisusb, int port, u8 index, u8 data) { int ret; @@ -1298,7 +1339,7 @@ sisusb_setidxreg(struct sisusb_usb_data *sisusb, int port, u8 index, u8 data) return ret; } -static int +int sisusb_getidxreg(struct sisusb_usb_data *sisusb, int port, u8 index, u8 *data) { int ret; @@ -1307,7 +1348,7 @@ sisusb_getidxreg(struct sisusb_usb_data *sisusb, int port, u8 index, u8 *data) return ret; } -static int +int sisusb_setidxregandor(struct sisusb_usb_data *sisusb, int port, u8 idx, u8 myand, u8 myor) { @@ -1336,18 +1377,87 @@ sisusb_setidxregmask(struct sisusb_usb_data *sisusb, int port, u8 idx, return ret; } -static int +int sisusb_setidxregor(struct sisusb_usb_data *sisusb, int port, u8 index, u8 myor) { return(sisusb_setidxregandor(sisusb, port, index, 0xff, myor)); } -static int +int sisusb_setidxregand(struct sisusb_usb_data *sisusb, int port, u8 idx, u8 myand) { return(sisusb_setidxregandor(sisusb, port, idx, myand, 0x00)); } +/* Write/read video ram */ + +#ifdef INCL_SISUSB_CON +int +sisusb_writeb(struct sisusb_usb_data *sisusb, u32 adr, u8 data) +{ + return(sisusb_write_memio_byte(sisusb, SISUSB_TYPE_MEM, adr, data)); +} + +int +sisusb_readb(struct sisusb_usb_data *sisusb, u32 adr, u8 *data) +{ + return(sisusb_read_memio_byte(sisusb, SISUSB_TYPE_MEM, adr, data)); +} + +#if 0 + +int +sisusb_writew(struct sisusb_usb_data *sisusb, u32 adr, u16 data) +{ + return(sisusb_write_memio_word(sisusb, SISUSB_TYPE_MEM, adr, data)); +} + +int +sisusb_readw(struct sisusb_usb_data *sisusb, u32 adr, u16 *data) +{ + return(sisusb_read_memio_word(sisusb, SISUSB_TYPE_MEM, adr, data)); +} + +#endif /* 0 */ + +int +sisusb_copy_memory(struct sisusb_usb_data *sisusb, char *src, + u32 dest, int length, size_t *bytes_written) +{ + return(sisusb_write_mem_bulk(sisusb, dest, src, length, NULL, 0, bytes_written)); +} + +#ifdef SISUSBENDIANTEST +int +sisusb_read_memory(struct sisusb_usb_data *sisusb, char *dest, + u32 src, int length, size_t *bytes_written) +{ + return(sisusb_read_mem_bulk(sisusb, src, dest, length, NULL, bytes_written)); +} +#endif +#endif + +#ifdef SISUSBENDIANTEST +static void +sisusb_testreadwrite(struct sisusb_usb_data *sisusb) +{ + static char srcbuffer[] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 }; + char destbuffer[10]; + size_t dummy; + int i,j; + + sisusb_copy_memory(sisusb, srcbuffer, sisusb->vrambase, 7, &dummy); + + for(i = 1; i <= 7; i++) { + printk(KERN_DEBUG "sisusb: rwtest %d bytes\n", i); + sisusb_read_memory(sisusb, destbuffer, sisusb->vrambase, i, &dummy); + for(j = 0; j < i; j++) { + printk(KERN_DEBUG "sisusb: rwtest read[%d] = %x\n", j, destbuffer[j]); + } + } +} +#endif + /* access pci config registers (reg numbers 0, 4, 8, etc) */ static int @@ -2270,6 +2380,129 @@ sisusb_init_gfxdevice(struct sisusb_usb_data *sisusb, int initscreen) return ret; } + +#ifdef INCL_SISUSB_CON + +/* Set up default text mode: + - Set text mode (0x03) + - Upload default font + - Upload user font (if available) +*/ + +int +sisusb_reset_text_mode(struct sisusb_usb_data *sisusb, int init) +{ + int ret = 0, slot = sisusb->font_slot, i; + const struct font_desc *myfont; + u8 *tempbuf; + u16 *tempbufb; + size_t written; + static const char bootstring[] = "SiSUSB VGA text console, (C) 2005 Thomas Winischhofer."; + static const char bootlogo[] = "(o_ //\\ V_/_"; + + /* sisusb->lock is down */ + + if (!sisusb->SiS_Pr) + return 1; + + sisusb->SiS_Pr->IOAddress = SISUSB_PCI_IOPORTBASE + 0x30; + sisusb->SiS_Pr->sisusb = (void *)sisusb; + + /* Set mode 0x03 */ + SiSUSBSetMode(sisusb->SiS_Pr, 0x03); + + if (!(myfont = find_font("VGA8x16"))) + return 1; + + if (!(tempbuf = vmalloc(8192))) + return 1; + + for (i = 0; i < 256; i++) + memcpy(tempbuf + (i * 32), myfont->data + (i * 16), 16); + + /* Upload default font */ + ret = sisusbcon_do_font_op(sisusb, 1, 0, tempbuf, 8192, 0, 1, NULL, 16, 0); + + vfree(tempbuf); + + /* Upload user font (and reset current slot) */ + if (sisusb->font_backup) { + ret |= sisusbcon_do_font_op(sisusb, 1, 2, sisusb->font_backup, + 8192, sisusb->font_backup_512, 1, NULL, + sisusb->font_backup_height, 0); + if (slot != 2) + sisusbcon_do_font_op(sisusb, 1, 0, NULL, 0, 0, 1, + NULL, 16, 0); + } + + if (init && !sisusb->scrbuf) { + + if ((tempbuf = vmalloc(8192))) { + + i = 4096; + tempbufb = (u16 *)tempbuf; + while (i--) + *(tempbufb++) = 0x0720; + + i = 0; + tempbufb = (u16 *)tempbuf; + while (bootlogo[i]) { + *(tempbufb++) = 0x0700 | bootlogo[i++]; + if (!(i % 4)) + tempbufb += 76; + } + + i = 0; + tempbufb = (u16 *)tempbuf + 6; + while (bootstring[i]) + *(tempbufb++) = 0x0700 | bootstring[i++]; + + ret |= sisusb_copy_memory(sisusb, tempbuf, + sisusb->vrambase, 8192, &written); + + vfree(tempbuf); + + } + + } else if (sisusb->scrbuf) { + + ret |= sisusb_copy_memory(sisusb, (char *)sisusb->scrbuf, + sisusb->vrambase, sisusb->scrbuf_size, &written); + + } + + if (sisusb->sisusb_cursor_size_from >= 0 && + sisusb->sisusb_cursor_size_to >= 0) { + sisusb_setidxreg(sisusb, SISCR, 0x0a, + sisusb->sisusb_cursor_size_from); + sisusb_setidxregandor(sisusb, SISCR, 0x0b, 0xe0, + sisusb->sisusb_cursor_size_to); + } else { + sisusb_setidxreg(sisusb, SISCR, 0x0a, 0x2d); + sisusb_setidxreg(sisusb, SISCR, 0x0b, 0x0e); + sisusb->sisusb_cursor_size_to = -1; + } + + slot = sisusb->sisusb_cursor_loc; + if(slot < 0) slot = 0; + + sisusb->sisusb_cursor_loc = -1; + sisusb->bad_cursor_pos = 1; + + sisusb_set_cursor(sisusb, slot); + + sisusb_setidxreg(sisusb, SISCR, 0x0c, (sisusb->cur_start_addr >> 8)); + sisusb_setidxreg(sisusb, SISCR, 0x0d, (sisusb->cur_start_addr & 0xff)); + + sisusb->textmodedestroyed = 0; + + /* sisusb->lock is down */ + + return ret; +} + +#endif + /* fops */ static int @@ -2279,39 +2512,39 @@ sisusb_open(struct inode *inode, struct file *file) struct usb_interface *interface; int subminor = iminor(inode); - down(&disconnect_sem); + mutex_lock(&disconnect_mutex); if (!(interface = usb_find_interface(&sisusb_driver, subminor))) { printk(KERN_ERR "sisusb[%d]: Failed to find interface\n", subminor); - up(&disconnect_sem); + mutex_unlock(&disconnect_mutex); return -ENODEV; } if (!(sisusb = usb_get_intfdata(interface))) { - up(&disconnect_sem); + mutex_unlock(&disconnect_mutex); return -ENODEV; } - down(&sisusb->lock); + mutex_lock(&sisusb->lock); if (!sisusb->present || !sisusb->ready) { - up(&sisusb->lock); - up(&disconnect_sem); + mutex_unlock(&sisusb->lock); + mutex_unlock(&disconnect_mutex); return -ENODEV; } if (sisusb->isopen) { - up(&sisusb->lock); - up(&disconnect_sem); + mutex_unlock(&sisusb->lock); + mutex_unlock(&disconnect_mutex); return -EBUSY; } if (!sisusb->devinit) { if (sisusb->sisusb_dev->speed == USB_SPEED_HIGH) { if (sisusb_init_gfxdevice(sisusb, 0)) { - up(&sisusb->lock); - up(&disconnect_sem); + mutex_unlock(&sisusb->lock); + mutex_unlock(&disconnect_mutex); printk(KERN_ERR "sisusbvga[%d]: Failed to initialize " "device\n", @@ -2319,8 +2552,8 @@ sisusb_open(struct inode *inode, struct file *file) return -EIO; } } else { - up(&sisusb->lock); - up(&disconnect_sem); + mutex_unlock(&sisusb->lock); + mutex_unlock(&disconnect_mutex); printk(KERN_ERR "sisusbvga[%d]: Device not attached to " "USB 2.0 hub\n", @@ -2329,23 +2562,21 @@ sisusb_open(struct inode *inode, struct file *file) } } - /* increment usage count for the device */ + /* Increment usage count for our sisusb */ kref_get(&sisusb->kref); sisusb->isopen = 1; file->private_data = sisusb; - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); - up(&disconnect_sem); - - printk(KERN_DEBUG "sisusbvga[%d]: opened", sisusb->minor); + mutex_unlock(&disconnect_mutex); return 0; } -static void +void sisusb_delete(struct kref *kref) { struct sisusb_usb_data *sisusb = to_sisusb_dev(kref); @@ -2359,6 +2590,9 @@ sisusb_delete(struct kref *kref) sisusb->sisusb_dev = NULL; sisusb_free_buffers(sisusb); sisusb_free_urbs(sisusb); +#ifdef INCL_SISUSB_CON + kfree(sisusb->SiS_Pr); +#endif kfree(sisusb); } @@ -2368,14 +2602,14 @@ sisusb_release(struct inode *inode, struct file *file) struct sisusb_usb_data *sisusb; int myminor; - down(&disconnect_sem); + mutex_lock(&disconnect_mutex); if (!(sisusb = (struct sisusb_usb_data *)file->private_data)) { - up(&disconnect_sem); + mutex_unlock(&disconnect_mutex); return -ENODEV; } - down(&sisusb->lock); + mutex_lock(&sisusb->lock); if (sisusb->present) { /* Wait for all URBs to finish if device still present */ @@ -2388,14 +2622,12 @@ sisusb_release(struct inode *inode, struct file *file) sisusb->isopen = 0; file->private_data = NULL; - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); /* decrement the usage count on our device */ kref_put(&sisusb->kref, sisusb_delete); - up(&disconnect_sem); - - printk(KERN_DEBUG "sisusbvga[%d]: released", myminor); + mutex_unlock(&disconnect_mutex); return 0; } @@ -2413,11 +2645,11 @@ sisusb_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) if (!(sisusb = (struct sisusb_usb_data *)file->private_data)) return -ENODEV; - down(&sisusb->lock); + mutex_lock(&sisusb->lock); /* Sanity check */ if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) { - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return -ENODEV; } @@ -2512,7 +2744,7 @@ sisusb_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) (*ppos) <= SISUSB_PCI_PSEUDO_PCIBASE + 0x5c) { if (count != 4) { - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return -EINVAL; } @@ -2536,7 +2768,7 @@ sisusb_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) (*ppos) += bytes_read; - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return errno ? errno : bytes_read; } @@ -2555,11 +2787,11 @@ sisusb_write(struct file *file, const char __user *buffer, size_t count, if (!(sisusb = (struct sisusb_usb_data *)file->private_data)) return -ENODEV; - down(&sisusb->lock); + mutex_lock(&sisusb->lock); /* Sanity check */ if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) { - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return -ENODEV; } @@ -2658,7 +2890,7 @@ sisusb_write(struct file *file, const char __user *buffer, size_t count, (*ppos) <= SISUSB_PCI_PSEUDO_PCIBASE + SISUSB_PCI_PCONFSIZE) { if (count != 4) { - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return -EINVAL; } @@ -2684,7 +2916,7 @@ sisusb_write(struct file *file, const char __user *buffer, size_t count, (*ppos) += bytes_written; - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return errno ? errno : bytes_written; } @@ -2698,11 +2930,11 @@ sisusb_lseek(struct file *file, loff_t offset, int orig) if (!(sisusb = (struct sisusb_usb_data *)file->private_data)) return -ENODEV; - down(&sisusb->lock); + mutex_lock(&sisusb->lock); /* Sanity check */ if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) { - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return -ENODEV; } @@ -2722,7 +2954,7 @@ sisusb_lseek(struct file *file, loff_t offset, int orig) ret = -EINVAL; } - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return ret; } @@ -2733,6 +2965,12 @@ sisusb_handle_command(struct sisusb_usb_data *sisusb, struct sisusb_command *y, int retval, port, length; u32 address; + /* All our commands require the device + * to be initialized. + */ + if (!sisusb->devinit) + return -ENODEV; + port = y->data3 - SISUSB_PCI_PSEUDO_IOPORTBASE + SISUSB_PCI_IOPORTBASE; @@ -2774,6 +3012,10 @@ sisusb_handle_command(struct sisusb_usb_data *sisusb, struct sisusb_command *y, break; case SUCMD_CLRSCR: + /* Gfx core must be initialized */ + if (!sisusb->gfxinit) + return -ENODEV; + length = (y->data0 << 16) | (y->data1 << 8) | y->data2; address = y->data3 - SISUSB_PCI_PSEUDO_MEMBASE + @@ -2781,11 +3023,61 @@ sisusb_handle_command(struct sisusb_usb_data *sisusb, struct sisusb_command *y, retval = sisusb_clear_vram(sisusb, address, length); break; + case SUCMD_HANDLETEXTMODE: + retval = 0; +#ifdef INCL_SISUSB_CON + /* Gfx core must be initialized, SiS_Pr must exist */ + if (!sisusb->gfxinit || !sisusb->SiS_Pr) + return -ENODEV; + + switch (y->data0) { + case 0: + retval = sisusb_reset_text_mode(sisusb, 0); + break; + case 1: + sisusb->textmodedestroyed = 1; + break; + } +#endif + break; + +#ifdef INCL_SISUSB_CON + case SUCMD_SETMODE: + /* Gfx core must be initialized, SiS_Pr must exist */ + if (!sisusb->gfxinit || !sisusb->SiS_Pr) + return -ENODEV; + + retval = 0; + + sisusb->SiS_Pr->IOAddress = SISUSB_PCI_IOPORTBASE + 0x30; + sisusb->SiS_Pr->sisusb = (void *)sisusb; + + if (SiSUSBSetMode(sisusb->SiS_Pr, y->data3)) + retval = -EINVAL; + + break; + + case SUCMD_SETVESAMODE: + /* Gfx core must be initialized, SiS_Pr must exist */ + if (!sisusb->gfxinit || !sisusb->SiS_Pr) + return -ENODEV; + + retval = 0; + + sisusb->SiS_Pr->IOAddress = SISUSB_PCI_IOPORTBASE + 0x30; + sisusb->SiS_Pr->sisusb = (void *)sisusb; + + if (SiSUSBSetVESAMode(sisusb->SiS_Pr, y->data3)) + retval = -EINVAL; + + break; +#endif + default: retval = -EINVAL; } - if(retval > 0) + if (retval > 0) retval = -EIO; return retval; @@ -2804,7 +3096,7 @@ sisusb_ioctl(struct inode *inode, struct file *file, unsigned int cmd, if (!(sisusb = (struct sisusb_usb_data *)file->private_data)) return -ENODEV; - down(&sisusb->lock); + mutex_lock(&sisusb->lock); /* Sanity check */ if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) { @@ -2835,6 +3127,11 @@ sisusb_ioctl(struct inode *inode, struct file *file, unsigned int cmd, x.sisusb_vramsize = sisusb->vramsize; x.sisusb_minor = sisusb->minor; x.sisusb_fbdevactive= 0; +#ifdef INCL_SISUSB_CON + x.sisusb_conactive = sisusb->haveconsole ? 1 : 0; +#else + x.sisusb_conactive = 0; +#endif if (copy_to_user((void __user *)arg, &x, sizeof(x))) retval = -EFAULT; @@ -2851,12 +3148,12 @@ sisusb_ioctl(struct inode *inode, struct file *file, unsigned int cmd, break; default: - retval = -EINVAL; + retval = -ENOTTY; break; } err_out: - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return retval; } @@ -2895,9 +3192,8 @@ static struct file_operations usb_sisusb_fops = { }; static struct usb_class_driver usb_sisusb_class = { - .name = "usb/sisusbvga%d", + .name = "sisusbvga%d", .fops = &usb_sisusb_fops, - .mode = S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP, .minor_base = SISUSB_MINOR }; @@ -2915,15 +3211,14 @@ static int sisusb_probe(struct usb_interface *intf, dev->devnum); /* Allocate memory for our private */ - if (!(sisusb = kmalloc(sizeof(*sisusb), GFP_KERNEL))) { + if (!(sisusb = kzalloc(sizeof(*sisusb), GFP_KERNEL))) { printk(KERN_ERR "sisusb: Failed to allocate memory for private data\n"); return -ENOMEM; } - memset(sisusb, 0, sizeof(*sisusb)); kref_init(&sisusb->kref); - init_MUTEX(&(sisusb->lock)); + mutex_init(&(sisusb->lock)); /* Register device */ if ((retval = usb_register_dev(intf, &usb_sisusb_class))) { @@ -2994,12 +3289,25 @@ static int sisusb_probe(struct usb_interface *intf, printk(KERN_INFO "sisusbvga[%d]: Allocated %d output buffers\n", sisusb->minor, sisusb->numobufs); +#ifdef INCL_SISUSB_CON + /* Allocate our SiS_Pr */ + if (!(sisusb->SiS_Pr = kmalloc(sizeof(struct SiS_Private), GFP_KERNEL))) { + printk(KERN_ERR + "sisusbvga[%d]: Failed to allocate SiS_Pr\n", + sisusb->minor); + } +#endif + /* Do remaining init stuff */ init_waitqueue_head(&sisusb->wait_q); usb_set_intfdata(intf, sisusb); + usb_get_dev(sisusb->sisusb_dev); + + sisusb->present = 1; + #ifdef SISUSB_OLD_CONFIG_COMPAT { int ret; @@ -3014,14 +3322,19 @@ static int sisusb_probe(struct usb_interface *intf, sisusb->minor); else sisusb->ioctl32registered = 1; - } #endif - sisusb->present = 1; - if (dev->speed == USB_SPEED_HIGH) { - if (sisusb_init_gfxdevice(sisusb, 1)) + int initscreen = 1; +#ifdef INCL_SISUSB_CON + if (sisusb_first_vc > 0 && + sisusb_last_vc > 0 && + sisusb_first_vc <= sisusb_last_vc && + sisusb_last_vc <= MAX_NR_CONSOLES) + initscreen = 0; +#endif + if (sisusb_init_gfxdevice(sisusb, initscreen)) printk(KERN_ERR "sisusbvga[%d]: Failed to early " "initialize device\n", @@ -3035,6 +3348,16 @@ static int sisusb_probe(struct usb_interface *intf, sisusb->ready = 1; +#ifdef SISUSBENDIANTEST + printk(KERN_DEBUG "sisusb: *** RWTEST ***\n"); + sisusb_testreadwrite(sisusb); + printk(KERN_DEBUG "sisusb: *** RWTEST END ***\n"); +#endif + +#ifdef INCL_SISUSB_CON + sisusb_console_init(sisusb, sisusb_first_vc, sisusb_last_vc); +#endif + return 0; error_4: @@ -3053,15 +3376,22 @@ static void sisusb_disconnect(struct usb_interface *intf) struct sisusb_usb_data *sisusb; int minor; - down(&disconnect_sem); - /* This should *not* happen */ - if (!(sisusb = usb_get_intfdata(intf))) { - up(&disconnect_sem); + if (!(sisusb = usb_get_intfdata(intf))) return; - } - down(&sisusb->lock); +#ifdef INCL_SISUSB_CON + sisusb_console_exit(sisusb); +#endif + + /* The above code doesn't need the disconnect + * semaphore to be down; its meaning is to + * protect all other routines from the disconnect + * case, not the other way round. + */ + mutex_lock(&disconnect_mutex); + + mutex_lock(&sisusb->lock); /* Wait for all URBs to complete and kill them in case (MUST do) */ if (!sisusb_wait_all_out_complete(sisusb)) @@ -3092,18 +3422,20 @@ static void sisusb_disconnect(struct usb_interface *intf) sisusb->present = 0; sisusb->ready = 0; - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); /* decrement our usage count */ kref_put(&sisusb->kref, sisusb_delete); - up(&disconnect_sem); + mutex_unlock(&disconnect_mutex); printk(KERN_INFO "sisusbvga[%d]: Disconnected\n", minor); } static struct usb_device_id sisusb_table [] = { { USB_DEVICE(0x0711, 0x0900) }, + { USB_DEVICE(0x0711, 0x0901) }, + { USB_DEVICE(0x0711, 0x0902) }, { USB_DEVICE(0x182d, 0x021c) }, { USB_DEVICE(0x182d, 0x0269) }, { } @@ -3112,7 +3444,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, @@ -3123,11 +3454,17 @@ static int __init usb_sisusb_init(void) { int retval; +#ifdef INCL_SISUSB_CON + sisusb_init_concode(); +#endif + if (!(retval = usb_register(&sisusb_driver))) { + printk(KERN_INFO "sisusb: Driver version %d.%d.%d\n", SISUSB_VERSION, SISUSB_REVISION, SISUSB_PATCHLEVEL); printk(KERN_INFO "sisusb: Copyright (C) 2005 Thomas Winischhofer\n"); + } return retval; @@ -3142,6 +3479,6 @@ module_init(usb_sisusb_init); module_exit(usb_sisusb_exit); MODULE_AUTHOR("Thomas Winischhofer "); -MODULE_DESCRIPTION("sisusb - Driver for Net2280/SiS315-based USB2VGA dongles"); +MODULE_DESCRIPTION("sisusbvga - Driver for Net2280/SiS315-based USB2VGA dongles"); MODULE_LICENSE("GPL"); diff --git a/drivers/usb/misc/sisusbvga/sisusb.h b/drivers/usb/misc/sisusbvga/sisusb.h index 1306d006a..8e1120a64 100644 --- a/drivers/usb/misc/sisusbvga/sisusb.h +++ b/drivers/usb/misc/sisusbvga/sisusb.h @@ -38,23 +38,37 @@ #define _SISUSB_H_ #ifdef CONFIG_COMPAT -#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,10) -#include -#define SISUSB_OLD_CONFIG_COMPAT -#else #define SISUSB_NEW_CONFIG_COMPAT #endif + +#include + +/* For older kernels, support for text consoles is by default + * off. To ensable text console support, change the following: + */ +#if 0 +#define CONFIG_USB_SISUSBVGA_CON #endif /* Version Information */ #define SISUSB_VERSION 0 #define SISUSB_REVISION 0 -#define SISUSB_PATCHLEVEL 7 +#define SISUSB_PATCHLEVEL 8 + +/* Include console and mode switching code? */ + +#ifdef CONFIG_USB_SISUSBVGA_CON +#define INCL_SISUSB_CON 1 +#endif + +#include +#include +#include "sisusb_struct.h" /* USB related */ -#define SISUSB_MINOR 133 /* FIXME */ +#define SISUSB_MINOR 133 /* official */ /* Size of the sisusb input/output buffers */ #define SISUSB_IBUF_SIZE 0x01000 @@ -102,7 +116,7 @@ struct sisusb_usb_data { struct usb_interface *interface; struct kref kref; wait_queue_head_t wait_q; /* for syncind and timeouts */ - struct semaphore lock; /* general race avoidance */ + struct mutex lock; /* general race avoidance */ unsigned int ifnum; /* interface number of the USB device */ int minor; /* minor (for logging clarity) */ int isopen; /* !=0 if open */ @@ -131,6 +145,26 @@ struct sisusb_usb_data { unsigned char gfxinit; /* graphics core initialized? */ unsigned short chipid, chipvendor; unsigned short chiprevision; +#ifdef INCL_SISUSB_CON + struct SiS_Private *SiS_Pr; + unsigned long scrbuf; + unsigned int scrbuf_size; + int haveconsole, con_first, con_last; + int havethisconsole[MAX_NR_CONSOLES]; + int textmodedestroyed; + unsigned int sisusb_num_columns; /* real number, not vt's idea */ + int cur_start_addr, con_rolled_over; + int sisusb_cursor_loc, bad_cursor_pos; + int sisusb_cursor_size_from; + int sisusb_cursor_size_to; + int current_font_height, current_font_512; + int font_backup_size, font_backup_height, font_backup_512; + char *font_backup; + int font_slot; + struct vc_data *sisusb_display_fg; + int is_gfx; + int con_blanked; +#endif }; #define to_sisusb_dev(d) container_of(d, struct sisusb_usb_data, kref) @@ -249,7 +283,9 @@ struct sisusb_info { __u32 sisusb_fbdevactive; /* != 0 if framebuffer device active */ - __u8 sisusb_reserved[32]; /* for future use */ + __u32 sisusb_conactive; /* != 0 if console driver active */ + + __u8 sisusb_reserved[28]; /* for future use */ }; struct sisusb_command { @@ -261,18 +297,24 @@ struct sisusb_command { __u32 data4; /* for future use */ }; -#define SUCMD_GET 0x01 /* for all: data0 = index, data3 = port */ -#define SUCMD_SET 0x02 /* data1 = value */ -#define SUCMD_SETOR 0x03 /* data1 = or */ -#define SUCMD_SETAND 0x04 /* data1 = and */ -#define SUCMD_SETANDOR 0x05 /* data1 = and, data2 = or */ -#define SUCMD_SETMASK 0x06 /* data1 = data, data2 = mask */ +#define SUCMD_GET 0x01 /* for all: data0 = index, data3 = port */ +#define SUCMD_SET 0x02 /* data1 = value */ +#define SUCMD_SETOR 0x03 /* data1 = or */ +#define SUCMD_SETAND 0x04 /* data1 = and */ +#define SUCMD_SETANDOR 0x05 /* data1 = and, data2 = or */ +#define SUCMD_SETMASK 0x06 /* data1 = data, data2 = mask */ -#define SUCMD_CLRSCR 0x07 /* data0:1:2 = length, data3 = address */ +#define SUCMD_CLRSCR 0x07 /* data0:1:2 = length, data3 = address */ + +#define SUCMD_HANDLETEXTMODE 0x08 /* Reset/destroy text mode */ + +#define SUCMD_SETMODE 0x09 /* Set a display mode (data3 = SiS mode) */ +#define SUCMD_SETVESAMODE 0x0a /* Set a display mode (data3 = VESA mode) */ #define SISUSB_COMMAND _IOWR(0xF3,0x3D,struct sisusb_command) -#define SISUSB_GET_CONFIG_SIZE _IOR(0xF3,0x3E,__u32) -#define SISUSB_GET_CONFIG _IOR(0xF3,0x3F,struct sisusb_info) +#define SISUSB_GET_CONFIG_SIZE _IOR(0xF3,0x3E,__u32) +#define SISUSB_GET_CONFIG _IOR(0xF3,0x3F,struct sisusb_info) + #endif /* SISUSB_H */ diff --git a/drivers/usb/misc/sisusbvga/sisusb_con.c b/drivers/usb/misc/sisusbvga/sisusb_con.c index be5c1a25a..bf26c3c56 100644 --- a/drivers/usb/misc/sisusbvga/sisusb_con.c +++ b/drivers/usb/misc/sisusbvga/sisusb_con.c @@ -47,7 +47,7 @@ * */ -#include +#include #include #include #include @@ -69,27 +69,9 @@ #include #include "sisusb.h" +#include "sisusb_init.h" #ifdef INCL_SISUSB_CON -extern int sisusb_setreg(struct sisusb_usb_data *, int, u8); -extern int sisusb_getreg(struct sisusb_usb_data *, int, u8 *); -extern int sisusb_setidxreg(struct sisusb_usb_data *, int, u8, u8); -extern int sisusb_getidxreg(struct sisusb_usb_data *, int, u8, u8 *); -extern int sisusb_setidxregor(struct sisusb_usb_data *, int, u8, u8); -extern int sisusb_setidxregand(struct sisusb_usb_data *, int, u8, u8); -extern int sisusb_setidxregandor(struct sisusb_usb_data *, int, u8, u8, u8); - -extern int sisusb_writeb(struct sisusb_usb_data *sisusb, u32 adr, u8 data); -extern int sisusb_readb(struct sisusb_usb_data *sisusb, u32 adr, u8 *data); -extern int sisusb_writew(struct sisusb_usb_data *sisusb, u32 adr, u16 data); -extern int sisusb_readw(struct sisusb_usb_data *sisusb, u32 adr, u16 *data); -extern int sisusb_copy_memory(struct sisusb_usb_data *sisusb, char *src, - u32 dest, int length, size_t *bytes_written); - -extern void sisusb_delete(struct kref *kref); -extern int sisusb_reset_text_mode(struct sisusb_usb_data *sisusb, int init); - -extern int SiSUSBSetMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo); #define sisusbcon_writew(val, addr) (*(addr) = (val)) #define sisusbcon_readw(addr) (*(addr)) @@ -102,8 +84,6 @@ static struct sisusb_usb_data *mysisusbs[MAX_NR_CONSOLES]; /* Forward declaration */ static const struct consw sisusb_con; -extern struct semaphore disconnect_sem; - static inline void sisusbcon_memsetw(u16 *s, u16 c, unsigned int count) { @@ -194,11 +174,11 @@ sisusb_get_sisusb_lock_and_check(unsigned short console) if (!(sisusb = sisusb_get_sisusb(console))) return NULL; - down(&sisusb->lock); + mutex_lock(&sisusb->lock); if (!sisusb_sisusb_valid(sisusb) || !sisusb->havethisconsole[console]) { - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return NULL; } @@ -236,18 +216,18 @@ sisusbcon_init(struct vc_data *c, int init) * are set up/restored. */ - down(&disconnect_sem); + mutex_lock(&disconnect_mutex); if (!(sisusb = sisusb_get_sisusb(c->vc_num))) { - up(&disconnect_sem); + mutex_unlock(&disconnect_mutex); return; } - down(&sisusb->lock); + mutex_lock(&sisusb->lock); if (!sisusb_sisusb_valid(sisusb)) { - up(&sisusb->lock); - up(&disconnect_sem); + mutex_unlock(&sisusb->lock); + mutex_unlock(&disconnect_mutex); return; } @@ -284,9 +264,9 @@ sisusbcon_init(struct vc_data *c, int init) if (!*c->vc_uni_pagedir_loc) con_set_default_unimap(c); - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); - up(&disconnect_sem); + mutex_unlock(&disconnect_mutex); if (init) { c->vc_cols = cols; @@ -306,14 +286,14 @@ sisusbcon_deinit(struct vc_data *c) * and others, ie not under our control. */ - down(&disconnect_sem); + mutex_lock(&disconnect_mutex); if (!(sisusb = sisusb_get_sisusb(c->vc_num))) { - up(&disconnect_sem); + mutex_unlock(&disconnect_mutex); return; } - down(&sisusb->lock); + mutex_lock(&sisusb->lock); /* Clear ourselves in mysisusbs */ mysisusbs[c->vc_num] = NULL; @@ -332,12 +312,12 @@ sisusbcon_deinit(struct vc_data *c) } } - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); /* decrement the usage count on our sisusb */ kref_put(&sisusb->kref, sisusb_delete); - up(&disconnect_sem); + mutex_unlock(&disconnect_mutex); } /* interface routine */ @@ -417,7 +397,7 @@ sisusbcon_putc(struct vc_data *c, int ch, int y, int x) #endif if (sisusb_is_inactive(c, sisusb)) { - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return; } @@ -425,7 +405,7 @@ sisusbcon_putc(struct vc_data *c, int ch, int y, int x) sisusb_copy_memory(sisusb, (char *)SISUSB_VADDR(x, y), (u32)SISUSB_HADDR(x, y), 2, &written); - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); } /* Interface routine */ @@ -453,14 +433,14 @@ sisusbcon_putcs(struct vc_data *c, const unsigned short *s, sisusbcon_writew(sisusbcon_readw(s++), dest++); if (sisusb_is_inactive(c, sisusb)) { - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return; } sisusb_copy_memory(sisusb, (char *)SISUSB_VADDR(x, y), (u32)SISUSB_HADDR(x, y), count * 2, &written); - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); } /* Interface routine */ @@ -504,7 +484,7 @@ sisusbcon_clear(struct vc_data *c, int y, int x, int height, int width) } if (sisusb_is_inactive(c, sisusb)) { - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return; } @@ -514,7 +494,7 @@ sisusbcon_clear(struct vc_data *c, int y, int x, int height, int width) sisusb_copy_memory(sisusb, (unsigned char *)SISUSB_VADDR(x, y), (u32)SISUSB_HADDR(x, y), length, &written); - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); } /* Interface routine */ @@ -576,7 +556,7 @@ sisusbcon_bmove(struct vc_data *c, int sy, int sx, #endif if (sisusb_is_inactive(c, sisusb)) { - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return; } @@ -586,7 +566,7 @@ sisusbcon_bmove(struct vc_data *c, int sy, int sx, sisusb_copy_memory(sisusb, (unsigned char *)SISUSB_VADDR(dx, dy), (u32)SISUSB_HADDR(dx, dy), length, &written); - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); } /* interface routine */ @@ -609,7 +589,7 @@ sisusbcon_switch(struct vc_data *c) /* Don't write to screen if in gfx mode */ if (sisusb_is_inactive(c, sisusb)) { - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return 0; } @@ -618,7 +598,7 @@ sisusbcon_switch(struct vc_data *c) * as origin. */ if (c->vc_origin == (unsigned long)c->vc_screenbuf) { - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); printk(KERN_DEBUG "sisusb: ASSERT ORIGIN != SCREENBUF!\n"); return 0; } @@ -635,7 +615,7 @@ sisusbcon_switch(struct vc_data *c) (u32)SISUSB_HADDR(0, 0), length, &written); - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return 0; } @@ -657,7 +637,7 @@ sisusbcon_save_screen(struct vc_data *c) /* sisusb->lock is down */ if (sisusb_is_inactive(c, sisusb)) { - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return; } @@ -669,7 +649,7 @@ sisusbcon_save_screen(struct vc_data *c) sisusbcon_memcpyw((u16 *)c->vc_screenbuf, (u16 *)c->vc_origin, length); - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); } /* interface routine */ @@ -690,7 +670,7 @@ sisusbcon_set_palette(struct vc_data *c, unsigned char *table) /* sisusb->lock is down */ if (sisusb_is_inactive(c, sisusb)) { - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return -EINVAL; } @@ -705,7 +685,7 @@ sisusbcon_set_palette(struct vc_data *c, unsigned char *table) break; } - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return 0; } @@ -728,7 +708,7 @@ sisusbcon_blank(struct vc_data *c, int blank, int mode_switch) sisusb->is_gfx = blank ? 1 : 0; if (sisusb_is_inactive(c, sisusb)) { - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return 0; } @@ -777,7 +757,7 @@ sisusbcon_blank(struct vc_data *c, int blank, int mode_switch) cr63 = 0x40; break; default: - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return -EINVAL; } @@ -788,7 +768,7 @@ sisusbcon_blank(struct vc_data *c, int blank, int mode_switch) } - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return ret; } @@ -809,7 +789,7 @@ sisusbcon_scrolldelta(struct vc_data *c, int lines) /* sisusb->lock is down */ if (sisusb_is_inactive(c, sisusb)) { - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return 0; } @@ -849,7 +829,7 @@ sisusbcon_scrolldelta(struct vc_data *c, int lines) sisusbcon_set_start_address(sisusb, c); - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return 1; } @@ -867,7 +847,7 @@ sisusbcon_cursor(struct vc_data *c, int mode) /* sisusb->lock is down */ if (sisusb_is_inactive(c, sisusb)) { - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return; } @@ -879,7 +859,7 @@ sisusbcon_cursor(struct vc_data *c, int mode) if (mode == CM_ERASE) { sisusb_setidxregor(sisusb, SISCR, 0x0a, 0x20); sisusb->sisusb_cursor_size_to = -1; - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return; } @@ -919,7 +899,7 @@ sisusbcon_cursor(struct vc_data *c, int mode) sisusb->sisusb_cursor_size_to = to; } - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); } static int @@ -961,7 +941,7 @@ sisusbcon_scroll_area(struct vc_data *c, struct sisusb_usb_data *sisusb, sisusb_copy_memory(sisusb, (char *)SISUSB_VADDR(0, t), (u32)SISUSB_HADDR(0, t), length, &written); - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return 1; } @@ -994,7 +974,7 @@ sisusbcon_scroll(struct vc_data *c, int t, int b, int dir, int lines) /* sisusb->lock is down */ if (sisusb_is_inactive(c, sisusb)) { - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return 0; } @@ -1084,7 +1064,7 @@ sisusbcon_scroll(struct vc_data *c, int t, int b, int dir, int lines) c->vc_pos = c->vc_pos - oldorigin + c->vc_origin; - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return 1; } @@ -1106,7 +1086,7 @@ sisusbcon_set_origin(struct vc_data *c) /* sisusb->lock is down */ if (sisusb_is_inactive(c, sisusb) || sisusb->con_blanked) { - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return 0; } @@ -1116,7 +1096,7 @@ sisusbcon_set_origin(struct vc_data *c) sisusb->con_rolled_over = 0; - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return 1; } @@ -1133,7 +1113,7 @@ sisusbcon_resize(struct vc_data *c, unsigned int newcols, unsigned int newrows) fh = sisusb->current_font_height; - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); /* We are quite unflexible as regards resizing. The vt code * handles sizes where the line length isn't equal the pitch @@ -1167,7 +1147,7 @@ sisusbcon_do_font_op(struct sisusb_usb_data *sisusb, int set, int slot, if ((slot != 0 && slot != 2) || !fh) { if (uplock) - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return -EINVAL; } @@ -1327,7 +1307,7 @@ sisusbcon_do_font_op(struct sisusb_usb_data *sisusb, int set, int slot, } if (uplock) - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); if (dorecalc && c) { int i, rows = c->vc_scan_lines / fh; @@ -1351,7 +1331,7 @@ sisusbcon_do_font_op(struct sisusb_usb_data *sisusb, int set, int slot, font_op_error: if (uplock) - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return -EIO; } @@ -1417,19 +1397,19 @@ sisusbcon_font_get(struct vc_data *c, struct console_font *font) font->charcount = 256; if (!font->data) { - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return 0; } if (!sisusb->font_backup) { - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return -ENODEV; } /* Copy 256 chars only, like vgacon */ memcpy(font->data, sisusb->font_backup, 256 * 32); - up(&sisusb->lock); + mutex_unlock(&sisusb->lock); return 0; } @@ -1486,7 +1466,7 @@ static int sisusbdummycon_dummy(void) #define SISUSBCONDUMMY (void *)sisusbdummycon_dummy -const struct consw sisusb_dummy_con = { +static const struct consw sisusb_dummy_con = { .owner = THIS_MODULE, .con_startup = sisusbdummycon_startup, .con_init = sisusbdummycon_init, @@ -1512,14 +1492,14 @@ sisusb_console_init(struct sisusb_usb_data *sisusb, int first, int last) { int i, ret, minor = sisusb->minor; - down(&disconnect_sem); + mutex_lock(&disconnect_mutex); - down(&sisusb->lock); + mutex_lock(&sisusb->lock); /* Erm.. that should not happen */ if (sisusb->haveconsole || !sisusb->SiS_Pr) { - up(&sisusb->lock); - up(&disconnect_sem); + mutex_unlock(&sisusb->lock); + mutex_unlock(&disconnect_mutex); return 1; } @@ -1529,15 +1509,15 @@ sisusb_console_init(struct sisusb_usb_data *sisusb, int first, int last) if (first > last || first > MAX_NR_CONSOLES || last > MAX_NR_CONSOLES) { - up(&sisusb->lock); - up(&disconnect_sem); + mutex_unlock(&sisusb->lock); + mutex_unlock(&disconnect_mutex); return 1; } /* If gfxcore not initialized or no consoles given, quit graciously */ if (!sisusb->gfxinit || first < 1 || last < 1) { - up(&sisusb->lock); - up(&disconnect_sem); + mutex_unlock(&sisusb->lock); + mutex_unlock(&disconnect_mutex); return 0; } @@ -1547,8 +1527,8 @@ sisusb_console_init(struct sisusb_usb_data *sisusb, int first, int last) /* Set up text mode (and upload default font) */ if (sisusb_reset_text_mode(sisusb, 1)) { - up(&sisusb->lock); - up(&disconnect_sem); + mutex_unlock(&sisusb->lock); + mutex_unlock(&disconnect_mutex); printk(KERN_ERR "sisusbvga[%d]: Failed to set up text mode\n", minor); @@ -1571,16 +1551,16 @@ sisusb_console_init(struct sisusb_usb_data *sisusb, int first, int last) /* Allocate screen buffer */ if (!(sisusb->scrbuf = (unsigned long)vmalloc(sisusb->scrbuf_size))) { - up(&sisusb->lock); - up(&disconnect_sem); + mutex_unlock(&sisusb->lock); + mutex_unlock(&disconnect_mutex); printk(KERN_ERR "sisusbvga[%d]: Failed to allocate screen buffer\n", minor); return 1; } - up(&sisusb->lock); - up(&disconnect_sem); + mutex_unlock(&sisusb->lock); + mutex_unlock(&disconnect_mutex); /* Now grab the desired console(s) */ ret = take_over_console(&sisusb_con, first - 1, last - 1, 0); diff --git a/drivers/usb/misc/sisusbvga/sisusb_init.c b/drivers/usb/misc/sisusbvga/sisusb_init.c index 044fa4482..9b30f8962 100644 --- a/drivers/usb/misc/sisusbvga/sisusb_init.c +++ b/drivers/usb/misc/sisusbvga/sisusb_init.c @@ -36,7 +36,6 @@ * */ -#include #include #include #include @@ -74,6 +73,7 @@ SiSUSB_InitPtr(struct SiS_Private *SiS_Pr) /* HELPER: Get ModeID */ /*********************************************/ +#if 0 unsigned short SiSUSB_GetModeID(int HDisplay, int VDisplay, int Depth) { @@ -157,6 +157,7 @@ SiSUSB_GetModeID(int HDisplay, int VDisplay, int Depth) return ModeIndex; } +#endif /* 0 */ /*********************************************/ /* HELPER: SetReg, GetReg */ @@ -233,7 +234,7 @@ SiS_DisplayOn(struct SiS_Private *SiS_Pr) /* HELPER: Init Port Addresses */ /*********************************************/ -void +static void SiSUSBRegInit(struct SiS_Private *SiS_Pr, unsigned long BaseAddr) { SiS_Pr->SiS_P3c4 = BaseAddr + 0x14; diff --git a/drivers/usb/misc/sisusbvga/sisusb_init.h b/drivers/usb/misc/sisusbvga/sisusb_init.h index 5b1157783..f05f83268 100644 --- a/drivers/usb/misc/sisusbvga/sisusb_init.h +++ b/drivers/usb/misc/sisusbvga/sisusb_init.h @@ -690,7 +690,7 @@ static const struct SiS_CRT1Table SiSUSB_CRT1Table[] = 0x41}} /* 0x54 */ }; -static struct SiS_VCLKData SiSUSB_VCLKData[] = +static const struct SiS_VCLKData SiSUSB_VCLKData[] = { { 0x1b,0xe1, 25}, /* 0x00 */ { 0x4e,0xe4, 28}, /* 0x01 */ @@ -808,8 +808,8 @@ static struct SiS_VCLKData SiSUSB_VCLKData[] = { 0x2b,0xc2, 35} /* 0x71 768@576@60 */ }; -void SiSUSBRegInit(struct SiS_Private *SiS_Pr, unsigned long BaseAddr); -unsigned short SiSUSB_GetModeID(int HDisplay, int VDisplay, int Depth); +extern struct mutex disconnect_mutex; + int SiSUSBSetMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo); int SiSUSBSetVESAMode(struct SiS_Private *SiS_Pr, unsigned short VModeNo); @@ -826,5 +826,19 @@ extern int sisusb_setidxregor(struct sisusb_usb_data *sisusb, int port, extern int sisusb_setidxregand(struct sisusb_usb_data *sisusb, int port, u8 idx, u8 myand); +void sisusb_delete(struct kref *kref); +int sisusb_writeb(struct sisusb_usb_data *sisusb, u32 adr, u8 data); +int sisusb_readb(struct sisusb_usb_data *sisusb, u32 adr, u8 *data); +int sisusb_copy_memory(struct sisusb_usb_data *sisusb, char *src, + u32 dest, int length, size_t *bytes_written); +int sisusb_reset_text_mode(struct sisusb_usb_data *sisusb, int init); +int sisusbcon_do_font_op(struct sisusb_usb_data *sisusb, int set, int slot, + u8 *arg, int cmapsz, int ch512, int dorecalc, + struct vc_data *c, int fh, int uplock); +void sisusb_set_cursor(struct sisusb_usb_data *sisusb, unsigned int location); +int sisusb_console_init(struct sisusb_usb_data *sisusb, int first, int last); +void sisusb_console_exit(struct sisusb_usb_data *sisusb); +void sisusb_init_concode(void); + #endif diff --git a/drivers/usb/misc/sisusbvga/sisusb_struct.h b/drivers/usb/misc/sisusbvga/sisusb_struct.h index 94edd4726..f325ecb29 100644 --- a/drivers/usb/misc/sisusbvga/sisusb_struct.h +++ b/drivers/usb/misc/sisusbvga/sisusb_struct.h @@ -161,7 +161,7 @@ struct SiS_Private const struct SiS_Ext *SiS_EModeIDTable; const struct SiS_Ext2 *SiS_RefIndex; const struct SiS_CRT1Table *SiS_CRT1Table; - struct SiS_VCLKData *SiS_VCLKData; + const struct SiS_VCLKData *SiS_VCLKData; const struct SiS_ModeResInfo *SiS_ModeResInfo; }; diff --git a/drivers/usb/misc/usblcd.c b/drivers/usb/misc/usblcd.c index c82c40228..e095772dd 100644 --- a/drivers/usb/misc/usblcd.c +++ b/drivers/usb/misc/usblcd.c @@ -200,10 +200,8 @@ static ssize_t lcd_write(struct file *file, const char __user * user_buffer, siz /* create a urb, and a buffer for it, and copy the data to the urb */ urb = usb_alloc_urb(0, GFP_KERNEL); - if (!urb) { - retval = -ENOMEM; - goto error; - } + if (!urb) + return -ENOMEM; buf = usb_buffer_alloc(dev->udev, count, GFP_KERNEL, &urb->transfer_dma); if (!buf) { diff --git a/drivers/usb/misc/usbled.c b/drivers/usb/misc/usbled.c index f44196413..0c5ee0ad6 100644 --- a/drivers/usb/misc/usbled.c +++ b/drivers/usb/misc/usbled.c @@ -9,7 +9,6 @@ * */ -#include #include #include #include diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c index ccc5e8238..983e104dd 100644 --- a/drivers/usb/misc/usbtest.c +++ b/drivers/usb/misc/usbtest.c @@ -1,4 +1,3 @@ -#include #include #include #include @@ -802,7 +801,9 @@ error: if (u == urb || !u->dev) continue; + spin_unlock(&ctx->lock); status = usb_unlink_urb (u); + spin_lock(&ctx->lock); switch (status) { case -EINPROGRESS: case -EBUSY: @@ -1241,11 +1242,12 @@ done: static int ctrl_out (struct usbtest_dev *dev, unsigned count, unsigned length, unsigned vary) { - unsigned i, j, len, retval; + unsigned i, j, len; + int retval; u8 *buf; char *what = "?"; struct usb_device *udev; - + if (length < 1 || length > 0xffff || vary >= length) return -EINVAL; @@ -1335,7 +1337,9 @@ struct iso_context { unsigned pending; spinlock_t lock; struct completion done; + int submit_error; unsigned long errors; + unsigned long packet_count; struct usbtest_dev *dev; }; @@ -1346,10 +1350,14 @@ static void iso_callback (struct urb *urb, struct pt_regs *regs) spin_lock(&ctx->lock); ctx->count--; + ctx->packet_count += urb->number_of_packets; if (urb->error_count > 0) ctx->errors += urb->error_count; + else if (urb->status != 0) + ctx->errors += urb->number_of_packets; - if (urb->status == 0 && ctx->count > (ctx->pending - 1)) { + if (urb->status == 0 && ctx->count > (ctx->pending - 1) + && !ctx->submit_error) { int status = usb_submit_urb (urb, GFP_ATOMIC); switch (status) { case 0: @@ -1360,6 +1368,8 @@ static void iso_callback (struct urb *urb, struct pt_regs *regs) status); /* FALLTHROUGH */ case -ENODEV: /* disconnected */ + case -ESHUTDOWN: /* endpoint disabled */ + ctx->submit_error = 1; break; } } @@ -1369,8 +1379,8 @@ static void iso_callback (struct urb *urb, struct pt_regs *regs) if (ctx->pending == 0) { if (ctx->errors) dev_dbg (&ctx->dev->intf->dev, - "iso test, %lu errors\n", - ctx->errors); + "iso test, %lu errors out of %lu\n", + ctx->errors, ctx->packet_count); complete (&ctx->done); } done: @@ -1431,15 +1441,14 @@ test_iso_queue (struct usbtest_dev *dev, struct usbtest_param *param, struct usb_device *udev; unsigned i; unsigned long packets = 0; - int status; + int status = 0; struct urb *urbs[10]; /* FIXME no limit */ if (param->sglen > 10) return -EDOM; + memset(&context, 0, sizeof context); context.count = param->iterations * param->sglen; - context.pending = param->sglen; - context.errors = 0; context.dev = dev; init_completion (&context.done); spin_lock_init (&context.lock); @@ -1471,6 +1480,7 @@ test_iso_queue (struct usbtest_dev *dev, struct usbtest_param *param, spin_lock_irq (&context.lock); for (i = 0; i < param->sglen; i++) { + ++context.pending; status = usb_submit_urb (urbs [i], SLAB_ATOMIC); if (status < 0) { ERROR (dev, "submit iso[%d], error %d\n", i, status); @@ -1481,12 +1491,26 @@ test_iso_queue (struct usbtest_dev *dev, struct usbtest_param *param, simple_free_urb (urbs [i]); context.pending--; + context.submit_error = 1; + break; } } spin_unlock_irq (&context.lock); wait_for_completion (&context.done); - return 0; + + /* + * Isochronous transfers are expected to fail sometimes. As an + * arbitrary limit, we will report an error if any submissions + * fail or if the transfer failure rate is > 10%. + */ + if (status != 0) + ; + else if (context.submit_error) + status = -EACCES; + else if (context.errors > context.packet_count / 10) + status = -EIO; + return status; fail: for (i = 0; i < param->sglen; i++) { diff --git a/drivers/usb/mon/mon_dma.c b/drivers/usb/mon/mon_dma.c index 0a1367b76..ddcfc01e7 100644 --- a/drivers/usb/mon/mon_dma.c +++ b/drivers/usb/mon/mon_dma.c @@ -13,7 +13,10 @@ #include /* Only needed for declarations in usb_mon.h */ #include "usb_mon.h" -#ifdef __i386__ /* CONFIG_ARCH_I386 does not exit */ +/* + * PC-compatibles, are, fortunately, sufficiently cache-coherent for this. + */ +#if defined(__i386__) || defined(__x86_64__) /* CONFIG_ARCH_I386 doesn't exit */ #define MON_HAS_UNMAP 1 #define phys_to_page(phys) pfn_to_page((phys) >> PAGE_SHIFT) diff --git a/drivers/usb/mon/mon_main.c b/drivers/usb/mon/mon_main.c index aa9d00808..275a66f83 100644 --- a/drivers/usb/mon/mon_main.c +++ b/drivers/usb/mon/mon_main.c @@ -2,6 +2,8 @@ * The USB Monitor, inspired by Dave Harding's USBMon. * * mon_main.c: Main file, module initiation and exit, registrations, etc. + * + * Copyright (C) 2005 Pete Zaitcev (zaitcev@redhat.com) */ #include @@ -9,6 +11,8 @@ #include #include #include +#include +#include #include "usb_mon.h" #include "../core/hcd.h" @@ -20,7 +24,7 @@ static void mon_dissolve(struct mon_bus *mbus, struct usb_bus *ubus); static void mon_bus_drop(struct kref *r); static void mon_bus_init(struct dentry *mondir, struct usb_bus *ubus); -DECLARE_MUTEX(mon_lock); +DEFINE_MUTEX(mon_lock); static struct dentry *mon_dir; /* /dbg/usbmon */ static LIST_HEAD(mon_buses); /* All buses we know: struct mon_bus */ @@ -93,6 +97,7 @@ static void mon_submit(struct usb_bus *ubus, struct urb *urb) if (mbus->nreaders == 0) goto out_locked; + mbus->cnt_events++; list_for_each (pos, &mbus->r_list) { r = list_entry(pos, struct mon_reader, r_link); r->rnf_submit(r->r_data, urb); @@ -109,20 +114,32 @@ out_unlocked: /* */ -static void mon_submit_error(struct usb_bus *ubus, struct urb *urb, int err) +static void mon_submit_error(struct usb_bus *ubus, struct urb *urb, int error) { struct mon_bus *mbus; + unsigned long flags; + struct list_head *pos; + struct mon_reader *r; mbus = ubus->mon_bus; if (mbus == NULL) goto out_unlocked; - /* - * XXX Capture the error code and the 'E' event. - */ + spin_lock_irqsave(&mbus->lock, flags); + if (mbus->nreaders == 0) + goto out_locked; + mbus->cnt_events++; + list_for_each (pos, &mbus->r_list) { + r = list_entry(pos, struct mon_reader, r_link); + r->rnf_error(r->r_data, urb, error); + } + + spin_unlock_irqrestore(&mbus->lock, flags); return; +out_locked: + spin_unlock_irqrestore(&mbus->lock, flags); out_unlocked: return; } @@ -148,6 +165,7 @@ static void mon_complete(struct usb_bus *ubus, struct urb *urb) } spin_lock_irqsave(&mbus->lock, flags); + mbus->cnt_events++; list_for_each (pos, &mbus->r_list) { r = list_entry(pos, struct mon_reader, r_link); r->rnf_complete(r->r_data, urb); @@ -159,7 +177,6 @@ static void mon_complete(struct usb_bus *ubus, struct urb *urb) /* * Stop monitoring. - * Obviously this must be well locked, so no need to play with mb's. */ static void mon_stop(struct mon_bus *mbus) { @@ -193,16 +210,33 @@ static void mon_bus_remove(struct usb_bus *ubus) { struct mon_bus *mbus = ubus->mon_bus; - down(&mon_lock); + mutex_lock(&mon_lock); list_del(&mbus->bus_link); debugfs_remove(mbus->dent_t); debugfs_remove(mbus->dent_s); mon_dissolve(mbus, ubus); kref_put(&mbus->ref, mon_bus_drop); - up(&mon_lock); + mutex_unlock(&mon_lock); } +static int mon_notify(struct notifier_block *self, unsigned long action, + void *dev) +{ + switch (action) { + case USB_BUS_ADD: + mon_bus_add(dev); + break; + case USB_BUS_REMOVE: + mon_bus_remove(dev); + } + return NOTIFY_OK; +} + +static struct notifier_block mon_nb = { + .notifier_call = mon_notify, +}; + /* * Ops */ @@ -210,8 +244,6 @@ static struct usb_mon_operations mon_ops_0 = { .urb_submit = mon_submit, .urb_submit_error = mon_submit_error, .urb_complete = mon_complete, - .bus_add = mon_bus_add, - .bus_remove = mon_bus_remove, }; /* @@ -258,9 +290,8 @@ static void mon_bus_init(struct dentry *mondir, struct usb_bus *ubus) char name[NAMESZ]; int rc; - if ((mbus = kmalloc(sizeof(struct mon_bus), GFP_KERNEL)) == NULL) + if ((mbus = kzalloc(sizeof(struct mon_bus), GFP_KERNEL)) == NULL) goto err_alloc; - memset(mbus, 0, sizeof(struct mon_bus)); kref_init(&mbus->ref); spin_lock_init(&mbus->lock); INIT_LIST_HEAD(&mbus->r_list); @@ -289,9 +320,9 @@ static void mon_bus_init(struct dentry *mondir, struct usb_bus *ubus) goto err_create_s; mbus->dent_s = d; - down(&mon_lock); + mutex_lock(&mon_lock); list_add_tail(&mbus->bus_link, &mon_buses); - up(&mon_lock); + mutex_unlock(&mon_lock); return; err_create_s: @@ -311,7 +342,7 @@ static int __init mon_init(void) mondir = debugfs_create_dir("usbmon", NULL); if (IS_ERR(mondir)) { - printk(KERN_NOTICE TAG ": debugs is not available\n"); + printk(KERN_NOTICE TAG ": debugfs is not available\n"); return -ENODEV; } if (mondir == NULL) { @@ -327,11 +358,13 @@ static int __init mon_init(void) } // MOD_INC_USE_COUNT(which_module?); - down(&usb_bus_list_lock); + usb_register_notify(&mon_nb); + + mutex_lock(&usb_bus_list_lock); list_for_each_entry (ubus, &usb_bus_list, bus_list) { mon_bus_init(mondir, ubus); } - up(&usb_bus_list_lock); + mutex_unlock(&usb_bus_list_lock); return 0; } @@ -340,9 +373,10 @@ static void __exit mon_exit(void) struct mon_bus *mbus; struct list_head *p; + usb_unregister_notify(&mon_nb); usb_mon_deregister(); - down(&mon_lock); + mutex_lock(&mon_lock); while (!list_empty(&mon_buses)) { p = mon_buses.next; mbus = list_entry(p, struct mon_bus, bus_link); @@ -366,7 +400,7 @@ static void __exit mon_exit(void) mon_dissolve(mbus, mbus->u_bus); kref_put(&mbus->ref, mon_bus_drop); } - up(&mon_lock); + mutex_unlock(&mon_lock); debugfs_remove(mon_dir); } diff --git a/drivers/usb/mon/mon_stat.c b/drivers/usb/mon/mon_stat.c index 6e4b165d0..86ad2b381 100644 --- a/drivers/usb/mon/mon_stat.c +++ b/drivers/usb/mon/mon_stat.c @@ -28,11 +28,11 @@ static int mon_stat_open(struct inode *inode, struct file *file) if ((sp = kmalloc(sizeof(struct snap), GFP_KERNEL)) == NULL) return -ENOMEM; - mbus = inode->u.generic_ip; + mbus = inode->i_private; sp->slen = snprintf(sp->str, STAT_BUF_SIZE, - "nreaders %d text_lost %u\n", - mbus->nreaders, mbus->cnt_text_lost); + "nreaders %d events %u text_lost %u\n", + mbus->nreaders, mbus->cnt_events, mbus->cnt_text_lost); file->private_data = sp; return 0; diff --git a/drivers/usb/mon/mon_text.c b/drivers/usb/mon/mon_text.c index 755a45704..2fd39b4fa 100644 --- a/drivers/usb/mon/mon_text.c +++ b/drivers/usb/mon/mon_text.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #include "usb_mon.h" @@ -18,12 +19,20 @@ */ #define DATA_MAX 32 +/* + * Defined by USB 2.0 clause 9.3, table 9.2. + */ +#define SETUP_MAX 8 + /* * This limit exists to prevent OOMs when the user process stops reading. + * If usbmon were available to unprivileged processes, it might be open + * to a local DoS. But we have to keep to root in order to prevent + * password sniffing from HID devices. */ -#define EVENT_MAX 25 +#define EVENT_MAX (2*PAGE_SIZE / sizeof(struct mon_event_text)) -#define PRINTF_DFL 120 +#define PRINTF_DFL 160 struct mon_event_text { struct list_head e_link; @@ -33,7 +42,9 @@ struct mon_event_text { unsigned int tstamp; int length; /* Depends on type: xfer length or act length */ int status; + char setup_flag; char data_flag; + unsigned char setup[SETUP_MAX]; unsigned char data[DATA_MAX]; }; @@ -47,13 +58,12 @@ struct mon_reader_text { wait_queue_head_t wait; int printf_size; char *printf_buf; - struct semaphore printf_lock; + struct mutex printf_lock; char slab_name[SLAB_NAME_SZ]; }; static void mon_text_ctor(void *, kmem_cache_t *, unsigned long); -static void mon_text_dtor(void *, kmem_cache_t *, unsigned long); /* * mon_text_submit @@ -64,48 +74,55 @@ static void mon_text_dtor(void *, kmem_cache_t *, unsigned long); * This is called with the whole mon_bus locked, so no additional lock. */ +static inline char mon_text_get_setup(struct mon_event_text *ep, + struct urb *urb, char ev_type) +{ + + if (!usb_pipecontrol(urb->pipe) || ev_type != 'S') + return '-'; + + if (urb->transfer_flags & URB_NO_SETUP_DMA_MAP) + return mon_dmapeek(ep->setup, urb->setup_dma, SETUP_MAX); + if (urb->setup_packet == NULL) + return 'Z'; /* '0' would be not as pretty. */ + + memcpy(ep->setup, urb->setup_packet, SETUP_MAX); + return 0; +} + static inline char mon_text_get_data(struct mon_event_text *ep, struct urb *urb, int len, char ev_type) { int pipe = urb->pipe; - unsigned char *data; + + if (len <= 0) + return 'L'; + if (len >= DATA_MAX) + len = DATA_MAX; + + if (usb_pipein(pipe)) { + if (ev_type == 'S') + return '<'; + } else { + if (ev_type == 'C') + return '>'; + } /* * The check to see if it's safe to poke at data has an enormous * number of corner cases, but it seems that the following is * more or less safe. * - * We do not even try to look transfer_buffer, because it can + * We do not even try to look at transfer_buffer, because it can * contain non-NULL garbage in case the upper level promised to * set DMA for the HCD. */ if (urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP) - return 'D'; + return mon_dmapeek(ep->data, urb->transfer_dma, len); - if (len <= 0) - return 'L'; - - if ((data = urb->transfer_buffer) == NULL) + if (urb->transfer_buffer == NULL) return 'Z'; /* '0' would be not as pretty. */ - /* - * Bulk is easy to shortcut reliably. - * XXX Control needs setup packet taken. - * 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 (len >= DATA_MAX) - len = DATA_MAX; memcpy(ep->data, urb->transfer_buffer, len); return 0; } @@ -144,6 +161,7 @@ static void mon_text_event(struct mon_reader_text *rp, struct urb *urb, /* Collecting status makes debugging sense for submits, too */ ep->status = urb->status; + ep->setup_flag = mon_text_get_setup(ep, urb, ev_type); ep->data_flag = mon_text_get_data(ep, urb, ep->length, ev_type); rp->nevents++; @@ -163,6 +181,32 @@ static void mon_text_complete(void *data, struct urb *urb) mon_text_event(rp, urb, 'C'); } +static void mon_text_error(void *data, struct urb *urb, int error) +{ + struct mon_reader_text *rp = data; + struct mon_event_text *ep; + + if (rp->nevents >= EVENT_MAX || + (ep = kmem_cache_alloc(rp->e_slab, SLAB_ATOMIC)) == NULL) { + rp->r.m_bus->cnt_text_lost++; + return; + } + + ep->type = 'E'; + ep->pipe = urb->pipe; + ep->id = (unsigned long) urb; + ep->tstamp = 0; + ep->length = 0; + ep->status = error; + + ep->setup_flag = '-'; + ep->data_flag = 'E'; + + rp->nevents++; + list_add_tail(&ep->e_link, &rp->e_list); + wake_up(&rp->wait); +} + /* * Fetch next event from the circular buffer. */ @@ -193,19 +237,18 @@ static int mon_text_open(struct inode *inode, struct file *file) struct mon_reader_text *rp; int rc; - down(&mon_lock); - mbus = inode->u.generic_ip; + mutex_lock(&mon_lock); + mbus = inode->i_private; ubus = mbus->u_bus; - rp = kmalloc(sizeof(struct mon_reader_text), GFP_KERNEL); + rp = kzalloc(sizeof(struct mon_reader_text), GFP_KERNEL); if (rp == NULL) { rc = -ENOMEM; goto err_alloc; } - memset(rp, 0, sizeof(struct mon_reader_text)); INIT_LIST_HEAD(&rp->e_list); init_waitqueue_head(&rp->wait); - init_MUTEX(&rp->printf_lock); + mutex_init(&rp->printf_lock); rp->printf_size = PRINTF_DFL; rp->printf_buf = kmalloc(rp->printf_size, GFP_KERNEL); @@ -217,13 +260,14 @@ static int mon_text_open(struct inode *inode, struct file *file) rp->r.m_bus = mbus; rp->r.r_data = rp; rp->r.rnf_submit = mon_text_submit; + rp->r.rnf_error = mon_text_error; rp->r.rnf_complete = mon_text_complete; snprintf(rp->slab_name, SLAB_NAME_SZ, "mon%dt_%lx", ubus->busnum, (long)rp); rp->e_slab = kmem_cache_create(rp->slab_name, sizeof(struct mon_event_text), sizeof(long), 0, - mon_text_ctor, mon_text_dtor); + mon_text_ctor, NULL); if (rp->e_slab == NULL) { rc = -ENOMEM; goto err_slab; @@ -232,7 +276,7 @@ static int mon_text_open(struct inode *inode, struct file *file) mon_reader_add(mbus, &rp->r); file->private_data = rp; - up(&mon_lock); + mutex_unlock(&mon_lock); return 0; // err_busy: @@ -242,7 +286,7 @@ err_slab: err_alloc_pr: kfree(rp); err_alloc: - up(&mon_lock); + mutex_unlock(&mon_lock); return rc; } @@ -286,7 +330,7 @@ static ssize_t mon_text_read(struct file *file, char __user *buf, set_current_state(TASK_RUNNING); remove_wait_queue(&rp->wait, &waita); - down(&rp->printf_lock); + mutex_lock(&rp->printf_lock); cnt = 0; pbuf = rp->printf_buf; limit = rp->printf_size; @@ -299,10 +343,25 @@ static ssize_t mon_text_read(struct file *file, char __user *buf, default: /* PIPE_BULK */ utype = 'B'; } cnt += snprintf(pbuf + cnt, limit - cnt, - "%lx %u %c %c%c:%03u:%02u %d %d", + "%lx %u %c %c%c:%03u:%02u", ep->id, ep->tstamp, ep->type, - utype, udir, usb_pipedevice(ep->pipe), usb_pipeendpoint(ep->pipe), - ep->status, ep->length); + utype, udir, usb_pipedevice(ep->pipe), usb_pipeendpoint(ep->pipe)); + + if (ep->setup_flag == 0) { /* Setup packet is present and captured */ + cnt += snprintf(pbuf + cnt, limit - cnt, + " s %02x %02x %04x %04x %04x", + ep->setup[0], + ep->setup[1], + (ep->setup[3] << 8) | ep->setup[2], + (ep->setup[5] << 8) | ep->setup[4], + (ep->setup[7] << 8) | ep->setup[6]); + } else if (ep->setup_flag != '-') { /* Unable to capture setup packet */ + cnt += snprintf(pbuf + cnt, limit - cnt, + " %c __ __ ____ ____ ____", ep->setup_flag); + } else { /* No setup for this kind of URB */ + cnt += snprintf(pbuf + cnt, limit - cnt, " %d", ep->status); + } + cnt += snprintf(pbuf + cnt, limit - cnt, " %d", ep->length); if ((data_len = ep->length) > 0) { if (ep->data_flag == 0) { @@ -328,7 +387,7 @@ static ssize_t mon_text_read(struct file *file, char __user *buf, if (copy_to_user(buf, rp->printf_buf, cnt)) cnt = -EFAULT; - up(&rp->printf_lock); + mutex_unlock(&rp->printf_lock); kmem_cache_free(rp->e_slab, ep); return cnt; } @@ -341,12 +400,12 @@ static int mon_text_release(struct inode *inode, struct file *file) struct list_head *p; struct mon_event_text *ep; - down(&mon_lock); - mbus = inode->u.generic_ip; + mutex_lock(&mon_lock); + mbus = inode->i_private; if (mbus->nreaders <= 0) { printk(KERN_ERR TAG ": consistency error on close\n"); - up(&mon_lock); + mutex_unlock(&mon_lock); return 0; } mon_reader_del(mbus, &rp->r); @@ -372,7 +431,7 @@ static int mon_text_release(struct inode *inode, struct file *file) kfree(rp->printf_buf); kfree(rp); - up(&mon_lock); + mutex_unlock(&mon_lock); return 0; } @@ -399,7 +458,3 @@ static void mon_text_ctor(void *mem, kmem_cache_t *slab, unsigned long sflags) memset(mem, 0xe5, sizeof(struct mon_event_text)); } -static void mon_text_dtor(void *mem, kmem_cache_t *slab, unsigned long sflags) -{ - ; -} diff --git a/drivers/usb/mon/usb_mon.h b/drivers/usb/mon/usb_mon.h index ed35c18a5..33678c24e 100644 --- a/drivers/usb/mon/usb_mon.h +++ b/drivers/usb/mon/usb_mon.h @@ -1,5 +1,7 @@ /* * The USB Monitor, inspired by Dave Harding's USBMon. + * + * Copyright (C) 2005 Pete Zaitcev (zaitcev@redhat.com) */ #ifndef __USB_MON_H @@ -25,6 +27,7 @@ struct mon_bus { struct kref ref; /* Under mon_lock */ /* Stats */ + unsigned int cnt_events; unsigned int cnt_text_lost; }; @@ -37,13 +40,18 @@ struct mon_reader { void *r_data; /* Use container_of instead? */ void (*rnf_submit)(void *data, struct urb *urb); + void (*rnf_error)(void *data, struct urb *urb, int error); void (*rnf_complete)(void *data, struct urb *urb); }; void mon_reader_add(struct mon_bus *mbus, struct mon_reader *r); void mon_reader_del(struct mon_bus *mbus, struct mon_reader *r); -extern struct semaphore mon_lock; +/* + */ +extern char mon_dmapeek(unsigned char *dst, dma_addr_t dma_addr, int len); + +extern struct mutex mon_lock; extern struct file_operations mon_fops_text; extern struct file_operations mon_fops_stat; diff --git a/drivers/usb/net/Kconfig b/drivers/usb/net/Kconfig index efd6ca7e4..054059632 100644 --- a/drivers/usb/net/Kconfig +++ b/drivers/usb/net/Kconfig @@ -301,21 +301,4 @@ config USB_NET_ZAURUS some cases CDC MDLM) protocol, not "g_ether". -config USB_ZD1201 - tristate "USB ZD1201 based Wireless device support" - depends on NET_RADIO - select FW_LOADER - ---help--- - Say Y if you want to use wireless LAN adapters based on the ZyDAS - ZD1201 chip. - - This driver makes the adapter appear as a normal Ethernet interface, - typically on wlan0. - - The zd1201 device requires external firmware to be loaded. - This can be found at http://linux-lc100020.sourceforge.net/ - - To compile this driver as a module, choose M here: the - module will be called zd1201. - endmenu diff --git a/drivers/usb/net/Makefile b/drivers/usb/net/Makefile index a21e6eaab..160f19dbd 100644 --- a/drivers/usb/net/Makefile +++ b/drivers/usb/net/Makefile @@ -15,7 +15,6 @@ obj-$(CONFIG_USB_NET_RNDIS_HOST) += rndis_host.o obj-$(CONFIG_USB_NET_CDC_SUBSET) += cdc_subset.o obj-$(CONFIG_USB_NET_ZAURUS) += zaurus.o obj-$(CONFIG_USB_USBNET) += usbnet.o -obj-$(CONFIG_USB_ZD1201) += zd1201.o ifeq ($(CONFIG_USB_DEBUG),y) EXTRA_CFLAGS += -DDEBUG diff --git a/drivers/usb/net/asix.c b/drivers/usb/net/asix.c index 12b599a0b..214ce21c1 100644 --- a/drivers/usb/net/asix.c +++ b/drivers/usb/net/asix.c @@ -1,7 +1,8 @@ /* * ASIX AX8817X based USB 2.0 Ethernet Devices - * Copyright (C) 2003-2005 David Hollis + * Copyright (C) 2003-2006 David Hollis * Copyright (C) 2005 Phil Chang + * Copyright (C) 2006 James Painter * Copyright (c) 2002-2003 TiVo Inc. * * This program is free software; you can redistribute it and/or modify @@ -22,7 +23,6 @@ // #define DEBUG // error path messages, extra info // #define VERBOSE // more; success messages -#include #include #include #include @@ -37,6 +37,9 @@ #include "usbnet.h" +#define DRIVER_VERSION "14-Jun-2006" +static const char driver_name [] = "asix"; + /* ASIX AX8817X based USB 2.0 Ethernet Devices */ #define AX_CMD_SET_SW_MII 0x06 @@ -47,23 +50,25 @@ #define AX_CMD_WRITE_EEPROM 0x0c #define AX_CMD_WRITE_ENABLE 0x0d #define AX_CMD_WRITE_DISABLE 0x0e +#define AX_CMD_READ_RX_CTL 0x0f #define AX_CMD_WRITE_RX_CTL 0x10 #define AX_CMD_READ_IPG012 0x11 #define AX_CMD_WRITE_IPG0 0x12 #define AX_CMD_WRITE_IPG1 0x13 +#define AX_CMD_READ_NODE_ID 0x13 #define AX_CMD_WRITE_IPG2 0x14 #define AX_CMD_WRITE_MULTI_FILTER 0x16 -#define AX_CMD_READ_NODE_ID 0x17 +#define AX88172_CMD_READ_NODE_ID 0x17 #define AX_CMD_READ_PHY_ID 0x19 #define AX_CMD_READ_MEDIUM_STATUS 0x1a #define AX_CMD_WRITE_MEDIUM_MODE 0x1b #define AX_CMD_READ_MONITOR_MODE 0x1c #define AX_CMD_WRITE_MONITOR_MODE 0x1d +#define AX_CMD_READ_GPIOS 0x1e #define AX_CMD_WRITE_GPIOS 0x1f #define AX_CMD_SW_RESET 0x20 #define AX_CMD_SW_PHY_STATUS 0x21 #define AX_CMD_SW_PHY_SELECT 0x22 -#define AX88772_CMD_READ_NODE_ID 0x13 #define AX_MONITOR_MODE 0x01 #define AX_MONITOR_LINK 0x02 @@ -71,15 +76,15 @@ #define AX_MONITOR_HSFS 0x10 /* AX88172 Medium Status Register values */ -#define AX_MEDIUM_FULL_DUPLEX 0x02 -#define AX_MEDIUM_TX_ABORT_ALLOW 0x04 -#define AX_MEDIUM_FLOW_CONTROL_EN 0x10 +#define AX88172_MEDIUM_FD 0x02 +#define AX88172_MEDIUM_TX 0x04 +#define AX88172_MEDIUM_FC 0x10 +#define AX88172_MEDIUM_DEFAULT \ + ( AX88172_MEDIUM_FD | AX88172_MEDIUM_TX | AX88172_MEDIUM_FC ) #define AX_MCAST_FILTER_SIZE 8 #define AX_MAX_MCAST 64 -#define AX_EEPROM_LEN 0x40 - #define AX_SWRESET_CLEAR 0x00 #define AX_SWRESET_RR 0x01 #define AX_SWRESET_RT 0x02 @@ -93,23 +98,78 @@ #define AX88772_IPG1_DEFAULT 0x0c #define AX88772_IPG2_DEFAULT 0x12 -#define AX88772_MEDIUM_FULL_DUPLEX 0x0002 -#define AX88772_MEDIUM_RESERVED 0x0004 -#define AX88772_MEDIUM_RX_FC_ENABLE 0x0010 -#define AX88772_MEDIUM_TX_FC_ENABLE 0x0020 -#define AX88772_MEDIUM_PAUSE_FORMAT 0x0080 -#define AX88772_MEDIUM_RX_ENABLE 0x0100 -#define AX88772_MEDIUM_100MB 0x0200 -#define AX88772_MEDIUM_DEFAULT \ - (AX88772_MEDIUM_FULL_DUPLEX | AX88772_MEDIUM_RX_FC_ENABLE | \ - AX88772_MEDIUM_TX_FC_ENABLE | AX88772_MEDIUM_100MB | \ - AX88772_MEDIUM_RESERVED | AX88772_MEDIUM_RX_ENABLE ) +/* AX88772 & AX88178 Medium Mode Register */ +#define AX_MEDIUM_PF 0x0080 +#define AX_MEDIUM_JFE 0x0040 +#define AX_MEDIUM_TFC 0x0020 +#define AX_MEDIUM_RFC 0x0010 +#define AX_MEDIUM_ENCK 0x0008 +#define AX_MEDIUM_AC 0x0004 +#define AX_MEDIUM_FD 0x0002 +#define AX_MEDIUM_GM 0x0001 +#define AX_MEDIUM_SM 0x1000 +#define AX_MEDIUM_SBP 0x0800 +#define AX_MEDIUM_PS 0x0200 +#define AX_MEDIUM_RE 0x0100 + +#define AX88178_MEDIUM_DEFAULT \ + (AX_MEDIUM_PS | AX_MEDIUM_FD | AX_MEDIUM_AC | \ + AX_MEDIUM_RFC | AX_MEDIUM_TFC | AX_MEDIUM_JFE | \ + AX_MEDIUM_RE ) -#define AX_EEPROM_MAGIC 0xdeadbeef +#define AX88772_MEDIUM_DEFAULT \ + (AX_MEDIUM_FD | AX_MEDIUM_RFC | \ + AX_MEDIUM_TFC | AX_MEDIUM_PS | \ + AX_MEDIUM_AC | AX_MEDIUM_RE ) + +/* AX88772 & AX88178 RX_CTL values */ +#define AX_RX_CTL_SO 0x0080 +#define AX_RX_CTL_AP 0x0020 +#define AX_RX_CTL_AM 0x0010 +#define AX_RX_CTL_AB 0x0008 +#define AX_RX_CTL_SEP 0x0004 +#define AX_RX_CTL_AMALL 0x0002 +#define AX_RX_CTL_PRO 0x0001 +#define AX_RX_CTL_MFB_2048 0x0000 +#define AX_RX_CTL_MFB_4096 0x0100 +#define AX_RX_CTL_MFB_8192 0x0200 +#define AX_RX_CTL_MFB_16384 0x0300 + +#define AX_DEFAULT_RX_CTL \ + (AX_RX_CTL_SO | AX_RX_CTL_AB ) + +/* GPIO 0 .. 2 toggles */ +#define AX_GPIO_GPO0EN 0x01 /* GPIO0 Output enable */ +#define AX_GPIO_GPO_0 0x02 /* GPIO0 Output value */ +#define AX_GPIO_GPO1EN 0x04 /* GPIO1 Output enable */ +#define AX_GPIO_GPO_1 0x08 /* GPIO1 Output value */ +#define AX_GPIO_GPO2EN 0x10 /* GPIO2 Output enable */ +#define AX_GPIO_GPO_2 0x20 /* GPIO2 Output value */ +#define AX_GPIO_RESERVED 0x40 /* Reserved */ +#define AX_GPIO_RSE 0x80 /* Reload serial EEPROM */ + +#define AX_EEPROM_MAGIC 0xdeadbeef +#define AX88172_EEPROM_LEN 0x40 +#define AX88772_EEPROM_LEN 0xff + +#define PHY_MODE_MARVELL 0x0000 +#define MII_MARVELL_LED_CTRL 0x0018 +#define MII_MARVELL_STATUS 0x001b +#define MII_MARVELL_CTRL 0x0014 + +#define MARVELL_LED_MANUAL 0x0019 + +#define MARVELL_STATUS_HWCFG 0x0004 + +#define MARVELL_CTRL_TXDELAY 0x0002 +#define MARVELL_CTRL_RXDELAY 0x0080 /* This structure cannot exceed sizeof(unsigned long [5]) AKA 20 bytes */ struct asix_data { u8 multi_filter[AX_MCAST_FILTER_SIZE]; + u8 phymode; + u8 ledmode; + u8 eeprom_len; }; struct ax88172_int_data { @@ -123,6 +183,8 @@ struct ax88172_int_data { static int asix_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, u16 size, void *data) { + devdbg(dev,"asix_read_cmd() cmd=0x%02x value=0x%04x index=0x%04x size=%d", + cmd, value, index, size); return usb_control_msg( dev->udev, usb_rcvctrlpipe(dev->udev, 0), @@ -138,6 +200,8 @@ static int asix_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, static int asix_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, u16 size, void *data) { + devdbg(dev,"asix_write_cmd() cmd=0x%02x value=0x%04x index=0x%04x size=%d", + cmd, value, index, size); return usb_control_msg( dev->udev, usb_sndctrlpipe(dev->udev, 0), @@ -162,12 +226,167 @@ static void asix_async_cmd_callback(struct urb *urb, struct pt_regs *regs) usb_free_urb(urb); } +static void +asix_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index, + u16 size, void *data) +{ + struct usb_ctrlrequest *req; + int status; + struct urb *urb; + + devdbg(dev,"asix_write_cmd_async() cmd=0x%02x value=0x%04x index=0x%04x size=%d", + cmd, value, index, size); + if ((urb = usb_alloc_urb(0, GFP_ATOMIC)) == NULL) { + deverr(dev, "Error allocating URB in write_cmd_async!"); + return; + } + + if ((req = kmalloc(sizeof(struct usb_ctrlrequest), GFP_ATOMIC)) == NULL) { + deverr(dev, "Failed to allocate memory for control request"); + usb_free_urb(urb); + return; + } + + req->bRequestType = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE; + req->bRequest = cmd; + req->wValue = value; + req->wIndex = index; + req->wLength = size; + + usb_fill_control_urb(urb, dev->udev, + usb_sndctrlpipe(dev->udev, 0), + (void *)req, data, size, + asix_async_cmd_callback, req); + + if((status = usb_submit_urb(urb, GFP_ATOMIC)) < 0) { + deverr(dev, "Error submitting the control message: status=%d", + status); + kfree(req); + usb_free_urb(urb); + } +} + +static int asix_rx_fixup(struct usbnet *dev, struct sk_buff *skb) +{ + u8 *head; + u32 header; + char *packet; + struct sk_buff *ax_skb; + u16 size; + + head = (u8 *) skb->data; + memcpy(&header, head, sizeof(header)); + le32_to_cpus(&header); + packet = head + sizeof(header); + + skb_pull(skb, 4); + + while (skb->len > 0) { + if ((short)(header & 0x0000ffff) != + ~((short)((header & 0xffff0000) >> 16))) { + deverr(dev,"asix_rx_fixup() Bad Header Length"); + } + /* get the packet length */ + size = (u16) (header & 0x0000ffff); + + if ((skb->len) - ((size + 1) & 0xfffe) == 0) + return 2; + if (size > ETH_FRAME_LEN) { + deverr(dev,"asix_rx_fixup() Bad RX Length %d", size); + return 0; + } + ax_skb = skb_clone(skb, GFP_ATOMIC); + if (ax_skb) { + ax_skb->len = size; + ax_skb->data = packet; + ax_skb->tail = packet + size; + usbnet_skb_return(dev, ax_skb); + } else { + return 0; + } + + skb_pull(skb, (size + 1) & 0xfffe); + + if (skb->len == 0) + break; + + head = (u8 *) skb->data; + memcpy(&header, head, sizeof(header)); + le32_to_cpus(&header); + packet = head + sizeof(header); + skb_pull(skb, 4); + } + + if (skb->len < 0) { + deverr(dev,"asix_rx_fixup() Bad SKB Length %d", skb->len); + return 0; + } + return 1; +} + +static struct sk_buff *asix_tx_fixup(struct usbnet *dev, struct sk_buff *skb, + gfp_t flags) +{ + int padlen; + int headroom = skb_headroom(skb); + int tailroom = skb_tailroom(skb); + u32 packet_len; + u32 padbytes = 0xffff0000; + + padlen = ((skb->len + 4) % 512) ? 0 : 4; + + if ((!skb_cloned(skb)) + && ((headroom + tailroom) >= (4 + padlen))) { + if ((headroom < 4) || (tailroom < padlen)) { + skb->data = memmove(skb->head + 4, skb->data, skb->len); + skb->tail = skb->data + skb->len; + } + } else { + struct sk_buff *skb2; + skb2 = skb_copy_expand(skb, 4, padlen, flags); + dev_kfree_skb_any(skb); + skb = skb2; + if (!skb) + return NULL; + } + + skb_push(skb, 4); + packet_len = (((skb->len - 4) ^ 0x0000ffff) << 16) + (skb->len - 4); + memcpy(skb->data, &packet_len, sizeof(packet_len)); + + if ((skb->len % 512) == 0) { + memcpy( skb->tail, &padbytes, sizeof(padbytes)); + skb_put(skb, sizeof(padbytes)); + } + return skb; +} + +static void asix_status(struct usbnet *dev, struct urb *urb) +{ + struct ax88172_int_data *event; + int link; + + if (urb->actual_length < 8) + return; + + event = urb->transfer_buffer; + link = event->link & 0x01; + if (netif_carrier_ok(dev->net) != link) { + if (link) { + netif_carrier_on(dev->net); + usbnet_defer_kevent (dev, EVENT_LINK_RESET ); + } else + netif_carrier_off(dev->net); + devdbg(dev, "Link Status is: %d", link); + } +} + static inline int asix_set_sw_mii(struct usbnet *dev) { int ret; ret = asix_write_cmd(dev, AX_CMD_SET_SW_MII, 0x0000, 0, 0, NULL); if (ret < 0) - devdbg(dev, "Failed to enable software MII access"); + deverr(dev, "Failed to enable software MII access"); return ret; } @@ -176,24 +395,27 @@ static inline int asix_set_hw_mii(struct usbnet *dev) int ret; ret = asix_write_cmd(dev, AX_CMD_SET_HW_MII, 0x0000, 0, 0, NULL); if (ret < 0) - devdbg(dev, "Failed to enable hardware MII access"); + deverr(dev, "Failed to enable hardware MII access"); return ret; } -static inline int asix_get_phyid(struct usbnet *dev) +static inline int asix_get_phy_addr(struct usbnet *dev) { int ret = 0; void *buf; + devdbg(dev, "asix_get_phy_addr()"); + buf = kmalloc(2, GFP_KERNEL); if (!buf) goto out1; if ((ret = asix_read_cmd(dev, AX_CMD_READ_PHY_ID, 0, 0, 2, buf)) < 2) { - devdbg(dev, "Error reading PHYID register: %02x", ret); + deverr(dev, "Error reading PHYID register: %02x", ret); goto out2; } + devdbg(dev, "asix_get_phy_addr() returning 0x%04x", *((u16 *)buf)); ret = *((u8 *)buf + 1); out2: kfree(buf); @@ -207,8 +429,29 @@ static int asix_sw_reset(struct usbnet *dev, u8 flags) ret = asix_write_cmd(dev, AX_CMD_SW_RESET, flags, 0, 0, NULL); if (ret < 0) - devdbg(dev,"Failed to send software reset: %02x", ret); + deverr(dev,"Failed to send software reset: %02x", ret); + + return ret; +} +static u16 asix_read_rx_ctl(struct usbnet *dev) +{ + u16 ret = 0; + void *buf; + + buf = kmalloc(2, GFP_KERNEL); + if (!buf) + goto out1; + + if ((ret = asix_read_cmd(dev, AX_CMD_READ_RX_CTL, + 0, 0, 2, buf)) < 2) { + deverr(dev, "Error reading RX_CTL register: %02x", ret); + goto out2; + } + ret = le16_to_cpu(*((u16 *)buf)); +out2: + kfree(buf); +out1: return ret; } @@ -216,82 +459,79 @@ static int asix_write_rx_ctl(struct usbnet *dev, u16 mode) { int ret; + devdbg(dev,"asix_write_rx_ctl() - mode = 0x%04x", mode); ret = asix_write_cmd(dev, AX_CMD_WRITE_RX_CTL, mode, 0, 0, NULL); if (ret < 0) - devdbg(dev, "Failed to write RX_CTL mode: %02x", ret); + deverr(dev, "Failed to write RX_CTL mode to 0x%04x: %02x", + mode, ret); return ret; } -static void asix_status(struct usbnet *dev, struct urb *urb) +static u16 asix_read_medium_status(struct usbnet *dev) { - struct ax88172_int_data *event; - int link; + u16 ret = 0; + void *buf; - if (urb->actual_length < 8) - return; + buf = kmalloc(2, GFP_KERNEL); + if (!buf) + goto out1; - event = urb->transfer_buffer; - link = event->link & 0x01; - if (netif_carrier_ok(dev->net) != link) { - if (link) { - netif_carrier_on(dev->net); - usbnet_defer_kevent (dev, EVENT_LINK_RESET ); - } else - netif_carrier_off(dev->net); - devdbg(dev, "Link Status is: %d", link); + if ((ret = asix_read_cmd(dev, AX_CMD_READ_MEDIUM_STATUS, + 0, 0, 2, buf)) < 2) { + deverr(dev, "Error reading Medium Status register: %02x", ret); + goto out2; } + ret = le16_to_cpu(*((u16 *)buf)); +out2: + kfree(buf); +out1: + return ret; } -static void -asix_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index, - u16 size, void *data) +static int asix_write_medium_mode(struct usbnet *dev, u16 mode) { - struct usb_ctrlrequest *req; - int status; - struct urb *urb; + int ret; - if ((urb = usb_alloc_urb(0, GFP_ATOMIC)) == NULL) { - devdbg(dev, "Error allocating URB in write_cmd_async!"); - return; - } + devdbg(dev,"asix_write_medium_mode() - mode = 0x%04x", mode); + ret = asix_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, mode, 0, 0, NULL); + if (ret < 0) + deverr(dev, "Failed to write Medium Mode mode to 0x%04x: %02x", + mode, ret); - if ((req = kmalloc(sizeof(struct usb_ctrlrequest), GFP_ATOMIC)) == NULL) { - deverr(dev, "Failed to allocate memory for control request"); - usb_free_urb(urb); - return; - } + return ret; +} - req->bRequestType = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE; - req->bRequest = cmd; - req->wValue = cpu_to_le16(value); - req->wIndex = cpu_to_le16(index); - req->wLength = cpu_to_le16(size); +static int asix_write_gpio(struct usbnet *dev, u16 value, int sleep) +{ + int ret; - usb_fill_control_urb(urb, dev->udev, - usb_sndctrlpipe(dev->udev, 0), - (void *)req, data, size, - asix_async_cmd_callback, req); + devdbg(dev,"asix_write_gpio() - value = 0x%04x", value); + ret = asix_write_cmd(dev, AX_CMD_WRITE_GPIOS, value, 0, 0, NULL); + if (ret < 0) + deverr(dev, "Failed to write GPIO value 0x%04x: %02x", + value, ret); - if((status = usb_submit_urb(urb, GFP_ATOMIC)) < 0) { - deverr(dev, "Error submitting the control message: status=%d", - status); - kfree(req); - usb_free_urb(urb); - } + if (sleep) + msleep(sleep); + + return ret; } +/* + * AX88772 & AX88178 have a 16-bit RX_CTL value + */ static void asix_set_multicast(struct net_device *net) { struct usbnet *dev = netdev_priv(net); struct asix_data *data = (struct asix_data *)&dev->data; - u8 rx_ctl = 0x8c; + u16 rx_ctl = AX_DEFAULT_RX_CTL; if (net->flags & IFF_PROMISC) { - rx_ctl |= 0x01; + rx_ctl |= AX_RX_CTL_PRO; } else if (net->flags & IFF_ALLMULTI || net->mc_count > AX_MAX_MCAST) { - rx_ctl |= 0x02; + rx_ctl |= AX_RX_CTL_AMALL; } else if (net->mc_count == 0) { /* just broadcast and directed */ } else { @@ -318,7 +558,7 @@ static void asix_set_multicast(struct net_device *net) asix_write_cmd_async(dev, AX_CMD_WRITE_MULTI_FILTER, 0, 0, AX_MCAST_FILTER_SIZE, data->multi_filter); - rx_ctl |= 0x10; + rx_ctl |= AX_RX_CTL_AM; } asix_write_cmd_async(dev, AX_CMD_WRITE_RX_CTL, rx_ctl, 0, 0, NULL); @@ -334,50 +574,43 @@ static int asix_mdio_read(struct net_device *netdev, int phy_id, int loc) (__u16)loc, 2, (u16 *)&res); asix_set_hw_mii(dev); - return res & 0xffff; -} + devdbg(dev, "asix_mdio_read() phy_id=0x%02x, loc=0x%02x, returns=0x%04x", phy_id, loc, le16_to_cpu(res & 0xffff)); -/* same as above, but converts resulting value to cpu byte order */ -static int asix_mdio_read_le(struct net_device *netdev, int phy_id, int loc) -{ - return le16_to_cpu(asix_mdio_read(netdev,phy_id, loc)); + return le16_to_cpu(res & 0xffff); } static void asix_mdio_write(struct net_device *netdev, int phy_id, int loc, int val) { struct usbnet *dev = netdev_priv(netdev); - u16 res = val; + u16 res = cpu_to_le16(val); + devdbg(dev, "asix_mdio_write() phy_id=0x%02x, loc=0x%02x, val=0x%04x", phy_id, loc, val); asix_set_sw_mii(dev); asix_write_cmd(dev, AX_CMD_WRITE_MII_REG, phy_id, (__u16)loc, 2, (u16 *)&res); asix_set_hw_mii(dev); } -/* same as above, but converts new value to le16 byte order before writing */ -static void -asix_mdio_write_le(struct net_device *netdev, int phy_id, int loc, int val) +/* Get the PHY Identifier from the PHYSID1 & PHYSID2 MII registers */ +static u32 asix_get_phyid(struct usbnet *dev) { - asix_mdio_write( netdev, phy_id, loc, cpu_to_le16(val) ); -} + int phy_reg; + u32 phy_id; -static int ax88172_link_reset(struct usbnet *dev) -{ - u16 lpa; - u16 adv; - u16 res; - u8 mode; + phy_reg = asix_mdio_read(dev->net, dev->mii.phy_id, MII_PHYSID1); + if (phy_reg < 0) + return 0; - mode = AX_MEDIUM_TX_ABORT_ALLOW | AX_MEDIUM_FLOW_CONTROL_EN; - lpa = asix_mdio_read_le(dev->net, dev->mii.phy_id, MII_LPA); - adv = asix_mdio_read_le(dev->net, dev->mii.phy_id, MII_ADVERTISE); - res = mii_nway_result(lpa|adv); - if (res & LPA_DUPLEX) - mode |= AX_MEDIUM_FULL_DUPLEX; - asix_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, mode, 0, 0, NULL); + phy_id = (phy_reg & 0xffff) << 16; - return 0; + phy_reg = asix_mdio_read(dev->net, dev->mii.phy_id, MII_PHYSID2); + if (phy_reg < 0) + return 0; + + phy_id |= (phy_reg & 0xffff); + + return phy_id; } static void @@ -424,7 +657,10 @@ asix_set_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo) static int asix_get_eeprom_len(struct net_device *net) { - return AX_EEPROM_LEN; + struct usbnet *dev = netdev_priv(net); + struct asix_data *data = (struct asix_data *)&dev->data; + + return data->eeprom_len; } static int asix_get_eeprom(struct net_device *net, @@ -454,9 +690,14 @@ static int asix_get_eeprom(struct net_device *net, static void asix_get_drvinfo (struct net_device *net, struct ethtool_drvinfo *info) { + struct usbnet *dev = netdev_priv(net); + struct asix_data *data = (struct asix_data *)&dev->data; + /* Inherit standard device info */ usbnet_get_drvinfo(net, info); - info->eedump_len = 0x3e; + strncpy (info->driver, driver_name, sizeof info->driver); + strncpy (info->version, DRIVER_VERSION, sizeof info->version); + info->eedump_len = data->eeprom_len; } static int asix_get_settings(struct net_device *net, struct ethtool_cmd *cmd) @@ -469,17 +710,44 @@ static int asix_get_settings(struct net_device *net, struct ethtool_cmd *cmd) static int asix_set_settings(struct net_device *net, struct ethtool_cmd *cmd) { struct usbnet *dev = netdev_priv(net); + int res = mii_ethtool_sset(&dev->mii,cmd); + + /* link speed/duplex might have changed */ + if (dev->driver_info->link_reset) + dev->driver_info->link_reset(dev); - return mii_ethtool_sset(&dev->mii,cmd); + return res; } -/* We need to override some ethtool_ops so we require our - own structure so we don't interfere with other usbnet - devices that may be connected at the same time. */ -static struct ethtool_ops ax88172_ethtool_ops = { - .get_drvinfo = asix_get_drvinfo, - .get_link = ethtool_op_get_link, - .get_msglevel = usbnet_get_msglevel, +static int asix_nway_reset(struct net_device *net) +{ + struct usbnet *dev = netdev_priv(net); + + return mii_nway_restart(&dev->mii); +} + +static u32 asix_get_link(struct net_device *net) +{ + struct usbnet *dev = netdev_priv(net); + + return mii_link_ok(&dev->mii); +} + +static int asix_ioctl (struct net_device *net, struct ifreq *rq, int cmd) +{ + struct usbnet *dev = netdev_priv(net); + + return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL); +} + +/* We need to override some ethtool_ops so we require our + own structure so we don't interfere with other usbnet + devices that may be connected at the same time. */ +static struct ethtool_ops ax88172_ethtool_ops = { + .get_drvinfo = asix_get_drvinfo, + .get_link = asix_get_link, + .nway_reset = asix_nway_reset, + .get_msglevel = usbnet_get_msglevel, .set_msglevel = usbnet_set_msglevel, .get_wol = asix_get_wol, .set_wol = asix_set_wol, @@ -489,11 +757,66 @@ static struct ethtool_ops ax88172_ethtool_ops = { .set_settings = asix_set_settings, }; -static int asix_ioctl (struct net_device *net, struct ifreq *rq, int cmd) +static void ax88172_set_multicast(struct net_device *net) { struct usbnet *dev = netdev_priv(net); + struct asix_data *data = (struct asix_data *)&dev->data; + u8 rx_ctl = 0x8c; - return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL); + if (net->flags & IFF_PROMISC) { + rx_ctl |= 0x01; + } else if (net->flags & IFF_ALLMULTI + || net->mc_count > AX_MAX_MCAST) { + rx_ctl |= 0x02; + } else if (net->mc_count == 0) { + /* just broadcast and directed */ + } else { + /* We use the 20 byte dev->data + * for our 8 byte filter buffer + * to avoid allocating memory that + * is tricky to free later */ + struct dev_mc_list *mc_list = net->mc_list; + u32 crc_bits; + int i; + + memset(data->multi_filter, 0, AX_MCAST_FILTER_SIZE); + + /* Build the multicast hash filter. */ + for (i = 0; i < net->mc_count; i++) { + crc_bits = + ether_crc(ETH_ALEN, + mc_list->dmi_addr) >> 26; + data->multi_filter[crc_bits >> 3] |= + 1 << (crc_bits & 7); + mc_list = mc_list->next; + } + + asix_write_cmd_async(dev, AX_CMD_WRITE_MULTI_FILTER, 0, 0, + AX_MCAST_FILTER_SIZE, data->multi_filter); + + rx_ctl |= 0x10; + } + + asix_write_cmd_async(dev, AX_CMD_WRITE_RX_CTL, rx_ctl, 0, 0, NULL); +} + +static int ax88172_link_reset(struct usbnet *dev) +{ + u8 mode; + struct ethtool_cmd ecmd; + + mii_check_media(&dev->mii, 1, 1); + mii_ethtool_gset(&dev->mii, &ecmd); + mode = AX88172_MEDIUM_DEFAULT; + + if (ecmd.duplex != DUPLEX_FULL) + mode |= ~AX88172_MEDIUM_FD; + + devdbg(dev, "ax88172_link_reset() speed: %d duplex: %d setting mode to 0x%04x", ecmd.speed, ecmd.duplex, mode); + + asix_write_medium_mode(dev, mode); + + return 0; } static int ax88172_bind(struct usbnet *dev, struct usb_interface *intf) @@ -502,6 +825,9 @@ static int ax88172_bind(struct usbnet *dev, struct usb_interface *intf) void *buf; int i; unsigned long gpio_bits = dev->driver_info->data; + struct asix_data *data = (struct asix_data *)&dev->data; + + data->eeprom_len = AX88172_EEPROM_LEN; usbnet_get_endpoints(dev,intf); @@ -520,12 +846,12 @@ static int ax88172_bind(struct usbnet *dev, struct usb_interface *intf) msleep(5); } - if ((ret = asix_write_rx_ctl(dev,0x80)) < 0) + if ((ret = asix_write_rx_ctl(dev, 0x80)) < 0) goto out2; /* Get the MAC address */ memset(buf, 0, ETH_ALEN); - if ((ret = asix_read_cmd(dev, AX_CMD_READ_NODE_ID, + if ((ret = asix_read_cmd(dev, AX88172_CMD_READ_NODE_ID, 0, 0, 6, buf)) < 0) { dbg("read AX_CMD_READ_NODE_ID failed: %d", ret); goto out2; @@ -538,14 +864,14 @@ static int ax88172_bind(struct usbnet *dev, struct usb_interface *intf) dev->mii.mdio_write = asix_mdio_write; dev->mii.phy_id_mask = 0x3f; dev->mii.reg_num_mask = 0x1f; - dev->mii.phy_id = asix_get_phyid(dev); + dev->mii.phy_id = asix_get_phy_addr(dev); dev->net->do_ioctl = asix_ioctl; - dev->net->set_multicast_list = asix_set_multicast; + dev->net->set_multicast_list = ax88172_set_multicast; dev->net->ethtool_ops = &ax88172_ethtool_ops; - asix_mdio_write_le(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET); - asix_mdio_write_le(dev->net, dev->mii.phy_id, MII_ADVERTISE, + asix_mdio_write(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET); + asix_mdio_write(dev->net, dev->mii.phy_id, MII_ADVERTISE, ADVERTISE_ALL | ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP); mii_nway_restart(&dev->mii); @@ -558,7 +884,8 @@ out1: static struct ethtool_ops ax88772_ethtool_ops = { .get_drvinfo = asix_get_drvinfo, - .get_link = ethtool_op_get_link, + .get_link = asix_get_link, + .nway_reset = asix_nway_reset, .get_msglevel = usbnet_get_msglevel, .set_msglevel = usbnet_set_msglevel, .get_wol = asix_get_wol, @@ -569,10 +896,37 @@ static struct ethtool_ops ax88772_ethtool_ops = { .set_settings = asix_set_settings, }; +static int ax88772_link_reset(struct usbnet *dev) +{ + u16 mode; + struct ethtool_cmd ecmd; + + mii_check_media(&dev->mii, 1, 1); + mii_ethtool_gset(&dev->mii, &ecmd); + mode = AX88772_MEDIUM_DEFAULT; + + if (ecmd.speed != SPEED_100) + mode &= ~AX_MEDIUM_PS; + + if (ecmd.duplex != DUPLEX_FULL) + mode &= ~AX_MEDIUM_FD; + + devdbg(dev, "ax88772_link_reset() speed: %d duplex: %d setting mode to 0x%04x", ecmd.speed, ecmd.duplex, mode); + + asix_write_medium_mode(dev, mode); + + return 0; +} + static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf) { int ret; void *buf; + u16 rx_ctl; + struct asix_data *data = (struct asix_data *)&dev->data; + u32 phyid; + + data->eeprom_len = AX88772_EEPROM_LEN; usbnet_get_endpoints(dev,intf); @@ -583,13 +937,12 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf) goto out1; } - if ((ret = asix_write_cmd(dev, AX_CMD_WRITE_GPIOS, - 0x00B0, 0, 0, buf)) < 0) + if ((ret = asix_write_gpio(dev, + AX_GPIO_RSE | AX_GPIO_GPO_2 | AX_GPIO_GPO2EN, 5)) < 0) goto out2; - msleep(5); if ((ret = asix_write_cmd(dev, AX_CMD_SW_PHY_SELECT, - 0x0001, 0, 0, buf)) < 0) { + 0x0000, 0, 0, buf)) < 0) { dbg("Select PHY #1 failed: %d", ret); goto out2; } @@ -606,36 +959,34 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf) goto out2; msleep(150); - if ((ret = asix_write_rx_ctl(dev, 0x00)) < 0) + rx_ctl = asix_read_rx_ctl(dev); + dbg("RX_CTL is 0x%04x after software reset", rx_ctl); + if ((ret = asix_write_rx_ctl(dev, 0x0000)) < 0) goto out2; + rx_ctl = asix_read_rx_ctl(dev); + dbg("RX_CTL is 0x%04x setting to 0x0000", rx_ctl); + /* Get the MAC address */ memset(buf, 0, ETH_ALEN); - if ((ret = asix_read_cmd(dev, AX88772_CMD_READ_NODE_ID, + if ((ret = asix_read_cmd(dev, AX_CMD_READ_NODE_ID, 0, 0, ETH_ALEN, buf)) < 0) { dbg("Failed to read MAC address: %d", ret); goto out2; } memcpy(dev->net->dev_addr, buf, ETH_ALEN); - if ((ret = asix_set_sw_mii(dev)) < 0) - goto out2; - - if (((ret = asix_read_cmd(dev, AX_CMD_READ_MII_REG, - 0x0010, 2, 2, buf)) < 0) - || (*((u16 *)buf) != 0x003b)) { - dbg("Read PHY register 2 must be 0x3b00: %d", ret); - goto out2; - } - /* Initialize MII structure */ dev->mii.dev = dev->net; dev->mii.mdio_read = asix_mdio_read; dev->mii.mdio_write = asix_mdio_write; - dev->mii.phy_id_mask = 0xff; - dev->mii.reg_num_mask = 0xff; + dev->mii.phy_id_mask = 0x1f; + dev->mii.reg_num_mask = 0x1f; dev->net->do_ioctl = asix_ioctl; - dev->mii.phy_id = asix_get_phyid(dev); + dev->mii.phy_id = asix_get_phy_addr(dev); + + phyid = asix_get_phyid(dev); + dbg("PHYID=0x%08x", phyid); if ((ret = asix_sw_reset(dev, AX_SWRESET_PRL)) < 0) goto out2; @@ -650,16 +1001,13 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf) dev->net->set_multicast_list = asix_set_multicast; dev->net->ethtool_ops = &ax88772_ethtool_ops; - asix_mdio_write_le(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET); - asix_mdio_write_le(dev->net, dev->mii.phy_id, MII_ADVERTISE, + asix_mdio_write(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET); + asix_mdio_write(dev->net, dev->mii.phy_id, MII_ADVERTISE, ADVERTISE_ALL | ADVERTISE_CSMA); mii_nway_restart(&dev->mii); - if ((ret = asix_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, - AX88772_MEDIUM_DEFAULT, 0, 0, buf)) < 0) { - dbg("Write medium mode register: %d", ret); + if ((ret = asix_write_medium_mode(dev, AX88772_MEDIUM_DEFAULT)) < 0) goto out2; - } if ((ret = asix_write_cmd(dev, AX_CMD_WRITE_IPG0, AX88772_IPG0_DEFAULT | AX88772_IPG1_DEFAULT, @@ -667,13 +1015,17 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf) dbg("Write IPG,IPG1,IPG2 failed: %d", ret); goto out2; } - if ((ret = asix_set_hw_mii(dev)) < 0) - goto out2; /* Set RX_CTL to default values with 2k buffer, and enable cactus */ - if ((ret = asix_write_rx_ctl(dev, 0x0088)) < 0) + if ((ret = asix_write_rx_ctl(dev, AX_DEFAULT_RX_CTL)) < 0) goto out2; + rx_ctl = asix_read_rx_ctl(dev); + dbg("RX_CTL is 0x%04x after all initializations", rx_ctl); + + rx_ctl = asix_read_medium_status(dev); + dbg("Medium Status is 0x%04x after all initializations", rx_ctl); + kfree(buf); /* Asix framing packs multiple eth frames into a 2K usb bulk transfer */ @@ -691,120 +1043,285 @@ out1: return ret; } -static int ax88772_rx_fixup(struct usbnet *dev, struct sk_buff *skb) +static struct ethtool_ops ax88178_ethtool_ops = { + .get_drvinfo = asix_get_drvinfo, + .get_link = asix_get_link, + .nway_reset = asix_nway_reset, + .get_msglevel = usbnet_get_msglevel, + .set_msglevel = usbnet_set_msglevel, + .get_wol = asix_get_wol, + .set_wol = asix_set_wol, + .get_eeprom_len = asix_get_eeprom_len, + .get_eeprom = asix_get_eeprom, + .get_settings = asix_get_settings, + .set_settings = asix_set_settings, +}; + +static int marvell_phy_init(struct usbnet *dev) { - u8 *head; - u32 header; - char *packet; - struct sk_buff *ax_skb; - u16 size; + struct asix_data *data = (struct asix_data *)&dev->data; + u16 reg; - head = (u8 *) skb->data; - memcpy(&header, head, sizeof(header)); - le32_to_cpus(&header); - packet = head + sizeof(header); + devdbg(dev,"marvell_phy_init()"); - skb_pull(skb, 4); + reg = asix_mdio_read(dev->net, dev->mii.phy_id, MII_MARVELL_STATUS); + devdbg(dev,"MII_MARVELL_STATUS = 0x%04x", reg); - while (skb->len > 0) { - if ((short)(header & 0x0000ffff) != - ~((short)((header & 0xffff0000) >> 16))) { - devdbg(dev,"header length data is error"); - } - /* get the packet length */ - size = (u16) (header & 0x0000ffff); + asix_mdio_write(dev->net, dev->mii.phy_id, MII_MARVELL_CTRL, + MARVELL_CTRL_RXDELAY | MARVELL_CTRL_TXDELAY); - if ((skb->len) - ((size + 1) & 0xfffe) == 0) - return 2; - if (size > ETH_FRAME_LEN) { - devdbg(dev,"invalid rx length %d", size); - return 0; - } - ax_skb = skb_clone(skb, GFP_ATOMIC); - if (ax_skb) { - ax_skb->len = size; - ax_skb->data = packet; - ax_skb->tail = packet + size; - usbnet_skb_return(dev, ax_skb); - } else { - return 0; - } + if (data->ledmode) { + reg = asix_mdio_read(dev->net, dev->mii.phy_id, + MII_MARVELL_LED_CTRL); + devdbg(dev,"MII_MARVELL_LED_CTRL (1) = 0x%04x", reg); - skb_pull(skb, (size + 1) & 0xfffe); + reg &= 0xf8ff; + reg |= (1 + 0x0100); + asix_mdio_write(dev->net, dev->mii.phy_id, + MII_MARVELL_LED_CTRL, reg); - if (skb->len == 0) - break; + reg = asix_mdio_read(dev->net, dev->mii.phy_id, + MII_MARVELL_LED_CTRL); + devdbg(dev,"MII_MARVELL_LED_CTRL (2) = 0x%04x", reg); + reg &= 0xfc0f; + } - head = (u8 *) skb->data; - memcpy(&header, head, sizeof(header)); - le32_to_cpus(&header); - packet = head + sizeof(header); - skb_pull(skb, 4); + return 0; +} + +static int marvell_led_status(struct usbnet *dev, u16 speed) +{ + u16 reg = asix_mdio_read(dev->net, dev->mii.phy_id, MARVELL_LED_MANUAL); + + devdbg(dev, "marvell_led_status() read 0x%04x", reg); + + /* Clear out the center LED bits - 0x03F0 */ + reg &= 0xfc0f; + + switch (speed) { + case SPEED_1000: + reg |= 0x03e0; + break; + case SPEED_100: + reg |= 0x03b0; + break; + default: + reg |= 0x02f0; } - if (skb->len < 0) { - devdbg(dev,"invalid rx length %d", skb->len); - return 0; + devdbg(dev, "marvell_led_status() writing 0x%04x", reg); + asix_mdio_write(dev->net, dev->mii.phy_id, MARVELL_LED_MANUAL, reg); + + return 0; +} + +static int ax88178_link_reset(struct usbnet *dev) +{ + u16 mode; + struct ethtool_cmd ecmd; + struct asix_data *data = (struct asix_data *)&dev->data; + + devdbg(dev,"ax88178_link_reset()"); + + mii_check_media(&dev->mii, 1, 1); + mii_ethtool_gset(&dev->mii, &ecmd); + mode = AX88178_MEDIUM_DEFAULT; + + if (ecmd.speed == SPEED_1000) + mode |= AX_MEDIUM_GM | AX_MEDIUM_ENCK; + else if (ecmd.speed == SPEED_100) + mode |= AX_MEDIUM_PS; + else + mode &= ~(AX_MEDIUM_PS | AX_MEDIUM_GM); + + if (ecmd.duplex == DUPLEX_FULL) + mode |= AX_MEDIUM_FD; + else + mode &= ~AX_MEDIUM_FD; + + devdbg(dev, "ax88178_link_reset() speed: %d duplex: %d setting mode to 0x%04x", ecmd.speed, ecmd.duplex, mode); + + asix_write_medium_mode(dev, mode); + + if (data->phymode == PHY_MODE_MARVELL && data->ledmode) + marvell_led_status(dev, ecmd.speed); + + return 0; +} + +static void ax88178_set_mfb(struct usbnet *dev) +{ + u16 mfb = AX_RX_CTL_MFB_16384; + u16 rxctl; + u16 medium; + int old_rx_urb_size = dev->rx_urb_size; + + if (dev->hard_mtu < 2048) { + dev->rx_urb_size = 2048; + mfb = AX_RX_CTL_MFB_2048; + } else if (dev->hard_mtu < 4096) { + dev->rx_urb_size = 4096; + mfb = AX_RX_CTL_MFB_4096; + } else if (dev->hard_mtu < 8192) { + dev->rx_urb_size = 8192; + mfb = AX_RX_CTL_MFB_8192; + } else if (dev->hard_mtu < 16384) { + dev->rx_urb_size = 16384; + mfb = AX_RX_CTL_MFB_16384; } - return 1; + + rxctl = asix_read_rx_ctl(dev); + asix_write_rx_ctl(dev, (rxctl & ~AX_RX_CTL_MFB_16384) | mfb); + + medium = asix_read_medium_status(dev); + if (dev->net->mtu > 1500) + medium |= AX_MEDIUM_JFE; + else + medium &= ~AX_MEDIUM_JFE; + asix_write_medium_mode(dev, medium); + + if (dev->rx_urb_size > old_rx_urb_size) + usbnet_unlink_rx_urbs(dev); } -static struct sk_buff *ax88772_tx_fixup(struct usbnet *dev, struct sk_buff *skb, - gfp_t flags) +static int ax88178_change_mtu(struct net_device *net, int new_mtu) { - int padlen; - int headroom = skb_headroom(skb); - int tailroom = skb_tailroom(skb); - u32 packet_len; - u32 padbytes = 0xffff0000; + struct usbnet *dev = netdev_priv(net); + int ll_mtu = new_mtu + net->hard_header_len + 4; - padlen = ((skb->len + 4) % 512) ? 0 : 4; + devdbg(dev, "ax88178_change_mtu() new_mtu=%d", new_mtu); - if ((!skb_cloned(skb)) - && ((headroom + tailroom) >= (4 + padlen))) { - if ((headroom < 4) || (tailroom < padlen)) { - skb->data = memmove(skb->head + 4, skb->data, skb->len); - skb->tail = skb->data + skb->len; - } + if (new_mtu <= 0 || ll_mtu > 16384) + return -EINVAL; + + if ((ll_mtu % dev->maxpacket) == 0) + return -EDOM; + + net->mtu = new_mtu; + dev->hard_mtu = net->mtu + net->hard_header_len; + ax88178_set_mfb(dev); + + return 0; +} + +static int ax88178_bind(struct usbnet *dev, struct usb_interface *intf) +{ + struct asix_data *data = (struct asix_data *)&dev->data; + int ret; + void *buf; + u16 eeprom; + int gpio0 = 0; + u32 phyid; + + usbnet_get_endpoints(dev,intf); + + buf = kmalloc(6, GFP_KERNEL); + if(!buf) { + dbg ("Cannot allocate memory for buffer"); + ret = -ENOMEM; + goto out1; + } + + eeprom = 0; + asix_read_cmd(dev, AX_CMD_READ_GPIOS, 0, 0, 1, &eeprom); + dbg("GPIO Status: 0x%04x", eeprom); + + asix_write_cmd(dev, AX_CMD_WRITE_ENABLE, 0, 0, 0, NULL); + asix_read_cmd(dev, AX_CMD_READ_EEPROM, 0x0017, 0, 2, &eeprom); + asix_write_cmd(dev, AX_CMD_WRITE_DISABLE, 0, 0, 0, NULL); + + dbg("EEPROM index 0x17 is 0x%04x", eeprom); + + if (eeprom == 0xffff) { + data->phymode = PHY_MODE_MARVELL; + data->ledmode = 0; + gpio0 = 1; } else { - struct sk_buff *skb2; - skb2 = skb_copy_expand(skb, 4, padlen, flags); - dev_kfree_skb_any(skb); - skb = skb2; - if (!skb) - return NULL; + data->phymode = eeprom & 7; + data->ledmode = eeprom >> 8; + gpio0 = (eeprom & 0x80) ? 0 : 1; } + dbg("GPIO0: %d, PhyMode: %d", gpio0, data->phymode); - skb_push(skb, 4); - packet_len = (((skb->len - 4) ^ 0x0000ffff) << 16) + (skb->len - 4); - memcpy(skb->data, &packet_len, sizeof(packet_len)); + asix_write_gpio(dev, AX_GPIO_RSE | AX_GPIO_GPO_1 | AX_GPIO_GPO1EN, 40); + if ((eeprom >> 8) != 1) { + asix_write_gpio(dev, 0x003c, 30); + asix_write_gpio(dev, 0x001c, 300); + asix_write_gpio(dev, 0x003c, 30); + } else { + dbg("gpio phymode == 1 path"); + asix_write_gpio(dev, AX_GPIO_GPO1EN, 30); + asix_write_gpio(dev, AX_GPIO_GPO1EN | AX_GPIO_GPO_1, 30); + } - if ((skb->len % 512) == 0) { - memcpy( skb->tail, &padbytes, sizeof(padbytes)); - skb_put(skb, sizeof(padbytes)); + asix_sw_reset(dev, 0); + msleep(150); + + asix_sw_reset(dev, AX_SWRESET_PRL | AX_SWRESET_IPPD); + msleep(150); + + asix_write_rx_ctl(dev, 0); + + /* Get the MAC address */ + memset(buf, 0, ETH_ALEN); + if ((ret = asix_read_cmd(dev, AX_CMD_READ_NODE_ID, + 0, 0, ETH_ALEN, buf)) < 0) { + dbg("Failed to read MAC address: %d", ret); + goto out2; } - return skb; -} + memcpy(dev->net->dev_addr, buf, ETH_ALEN); -static int ax88772_link_reset(struct usbnet *dev) -{ - u16 lpa; - u16 adv; - u16 res; - u16 mode; + /* Initialize MII structure */ + dev->mii.dev = dev->net; + dev->mii.mdio_read = asix_mdio_read; + dev->mii.mdio_write = asix_mdio_write; + dev->mii.phy_id_mask = 0x1f; + dev->mii.reg_num_mask = 0xff; + dev->mii.supports_gmii = 1; + dev->net->do_ioctl = asix_ioctl; + dev->mii.phy_id = asix_get_phy_addr(dev); + dev->net->set_multicast_list = asix_set_multicast; + dev->net->ethtool_ops = &ax88178_ethtool_ops; + dev->net->change_mtu = &ax88178_change_mtu; - mode = AX88772_MEDIUM_DEFAULT; - lpa = asix_mdio_read_le(dev->net, dev->mii.phy_id, MII_LPA); - adv = asix_mdio_read_le(dev->net, dev->mii.phy_id, MII_ADVERTISE); - res = mii_nway_result(lpa|adv); + phyid = asix_get_phyid(dev); + dbg("PHYID=0x%08x", phyid); - if ((res & LPA_DUPLEX) == 0) - mode &= ~AX88772_MEDIUM_FULL_DUPLEX; - if ((res & LPA_100) == 0) - mode &= ~AX88772_MEDIUM_100MB; - asix_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, mode, 0, 0, NULL); + if (data->phymode == PHY_MODE_MARVELL) { + marvell_phy_init(dev); + msleep(60); + } + + asix_mdio_write(dev->net, dev->mii.phy_id, MII_BMCR, + BMCR_RESET | BMCR_ANENABLE); + asix_mdio_write(dev->net, dev->mii.phy_id, MII_ADVERTISE, + ADVERTISE_ALL | ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP); + asix_mdio_write(dev->net, dev->mii.phy_id, MII_CTRL1000, + ADVERTISE_1000FULL); + + mii_nway_restart(&dev->mii); + + if ((ret = asix_write_medium_mode(dev, AX88178_MEDIUM_DEFAULT)) < 0) + goto out2; + + if ((ret = asix_write_rx_ctl(dev, AX_DEFAULT_RX_CTL)) < 0) + goto out2; + + kfree(buf); + + /* Asix framing packs multiple eth frames into a 2K usb bulk transfer */ + if (dev->driver_info->flags & FLAG_FRAMING_AX) { + /* hard_mtu is still the default - the device does not support + jumbo eth frames */ + dev->rx_urb_size = 2048; + } return 0; + +out2: + kfree(buf); +out1: + return ret; } static const struct driver_info ax8817x_info = { @@ -854,8 +1371,19 @@ static const struct driver_info ax88772_info = { .link_reset = ax88772_link_reset, .reset = ax88772_link_reset, .flags = FLAG_ETHER | FLAG_FRAMING_AX, - .rx_fixup = ax88772_rx_fixup, - .tx_fixup = ax88772_tx_fixup, + .rx_fixup = asix_rx_fixup, + .tx_fixup = asix_tx_fixup, +}; + +static const struct driver_info ax88178_info = { + .description = "ASIX AX88178 USB 2.0 Ethernet", + .bind = ax88178_bind, + .status = asix_status, + .link_reset = ax88178_link_reset, + .reset = ax88178_link_reset, + .flags = FLAG_ETHER | FLAG_FRAMING_AX, + .rx_fixup = asix_rx_fixup, + .tx_fixup = asix_tx_fixup, }; static const struct usb_device_id products [] = { @@ -911,6 +1439,10 @@ static const struct usb_device_id products [] = { // ASIX AX88772 10/100 USB_DEVICE (0x0b95, 0x7720), .driver_info = (unsigned long) &ax88772_info, +}, { + // ASIX AX88178 10/100/1000 + USB_DEVICE (0x0b95, 0x1780), + .driver_info = (unsigned long) &ax88178_info, }, { // Linksys USB200M Rev 2 USB_DEVICE (0x13b1, 0x0018), @@ -919,6 +1451,18 @@ static const struct usb_device_id products [] = { // 0Q0 cable ethernet USB_DEVICE (0x1557, 0x7720), .driver_info = (unsigned long) &ax88772_info, +}, { + // DLink DUB-E100 H/W Ver B1 + USB_DEVICE (0x07d1, 0x3c05), + .driver_info = (unsigned long) &ax88772_info, +}, { + // DLink DUB-E100 H/W Ver B1, bonus + USB_DEVICE (0x2001, 0x3c05), + .driver_info = (unsigned long) &ax88772_info, +}, { + // Linksys USB1000 + USB_DEVICE (0x1737, 0x0039), + .driver_info = (unsigned long) &ax88178_info, }, { }, // END }; diff --git a/drivers/usb/net/cdc_ether.c b/drivers/usb/net/cdc_ether.c index 63f1f3ba8..82ce0358d 100644 --- a/drivers/usb/net/cdc_ether.c +++ b/drivers/usb/net/cdc_ether.c @@ -20,7 +20,6 @@ // #define DEBUG // error path messages, extra info // #define VERBOSE // more; success messages -#include #include #include #include @@ -31,7 +30,7 @@ #include #include #include -#include +#include #include "usbnet.h" @@ -455,6 +454,18 @@ static const struct usb_device_id products [] = { .driver_info = 0, }, +/* Olympus has some models with a Zaurus-compatible option. + * R-1000 uses a FreeScale i.MXL cpu (ARMv4T) + */ +{ + .match_flags = USB_DEVICE_ID_MATCH_INT_INFO + | USB_DEVICE_ID_MATCH_DEVICE, + .idVendor = 0x07B4, + .idProduct = 0x0F02, /* R-1000 */ + ZAURUS_MASTER_INTERFACE, + .driver_info = 0, +}, + /* * WHITELIST!!! * diff --git a/drivers/usb/net/cdc_subset.c b/drivers/usb/net/cdc_subset.c index ec801e8bb..e2fae8585 100644 --- a/drivers/usb/net/cdc_subset.c +++ b/drivers/usb/net/cdc_subset.c @@ -17,7 +17,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include #include #include #include diff --git a/drivers/usb/net/gl620a.c b/drivers/usb/net/gl620a.c index faf1e86be..3155f25f1 100644 --- a/drivers/usb/net/gl620a.c +++ b/drivers/usb/net/gl620a.c @@ -21,7 +21,6 @@ // #define DEBUG // error path messages, extra info // #define VERBOSE // more; success messages -#include #include #include #include diff --git a/drivers/usb/net/net1080.c b/drivers/usb/net/net1080.c index 78e6a43b1..a9b6eeac3 100644 --- a/drivers/usb/net/net1080.c +++ b/drivers/usb/net/net1080.c @@ -20,7 +20,6 @@ // #define DEBUG // error path messages, extra info // #define VERBOSE // more; success messages -#include #include #include #include diff --git a/drivers/usb/net/pegasus.c b/drivers/usb/net/pegasus.c index 7683926a1..ab21f960d 100644 --- a/drivers/usb/net/pegasus.c +++ b/drivers/usb/net/pegasus.c @@ -163,6 +163,8 @@ static int get_registers(pegasus_t * pegasus, __u16 indx, __u16 size, /* using ATOMIC, we'd never wake up if we slept */ if ((ret = usb_submit_urb(pegasus->ctrl_urb, GFP_ATOMIC))) { + if (ret == -ENODEV) + netif_device_detach(pegasus->net); if (netif_msg_drv(pegasus)) dev_err(&pegasus->intf->dev, "%s, status %d\n", __FUNCTION__, ret); @@ -217,6 +219,8 @@ static int set_registers(pegasus_t * pegasus, __u16 indx, __u16 size, set_current_state(TASK_UNINTERRUPTIBLE); if ((ret = usb_submit_urb(pegasus->ctrl_urb, GFP_ATOMIC))) { + if (ret == -ENODEV) + netif_device_detach(pegasus->net); if (netif_msg_drv(pegasus)) dev_err(&pegasus->intf->dev, "%s, status %d\n", __FUNCTION__, ret); @@ -268,6 +272,8 @@ static int set_register(pegasus_t * pegasus, __u16 indx, __u8 data) set_current_state(TASK_UNINTERRUPTIBLE); if ((ret = usb_submit_urb(pegasus->ctrl_urb, GFP_ATOMIC))) { + if (ret == -ENODEV) + netif_device_detach(pegasus->net); if (netif_msg_drv(pegasus)) dev_err(&pegasus->intf->dev, "%s, status %d\n", __FUNCTION__, ret); @@ -298,10 +304,13 @@ static int update_eth_regs_async(pegasus_t * pegasus) (char *) &pegasus->dr, pegasus->eth_regs, 3, ctrl_callback, pegasus); - if ((ret = usb_submit_urb(pegasus->ctrl_urb, GFP_ATOMIC))) + if ((ret = usb_submit_urb(pegasus->ctrl_urb, GFP_ATOMIC))) { + if (ret == -ENODEV) + netif_device_detach(pegasus->net); if (netif_msg_drv(pegasus)) dev_err(&pegasus->intf->dev, "%s, status %d\n", __FUNCTION__, ret); + } return ret; } @@ -692,7 +701,10 @@ goon: usb_rcvbulkpipe(pegasus->usb, 1), pegasus->rx_skb->data, PEGASUS_MTU + 8, read_bulk_callback, pegasus); - if (usb_submit_urb(pegasus->rx_urb, GFP_ATOMIC)) { + rx_status = usb_submit_urb(pegasus->rx_urb, GFP_ATOMIC); + if (rx_status == -ENODEV) + netif_device_detach(pegasus->net); + else if (rx_status) { pegasus->flags |= PEGASUS_RX_URB_FAIL; goto tl_sched; } else { @@ -709,6 +721,7 @@ static void rx_fixup(unsigned long data) { pegasus_t *pegasus; unsigned long flags; + int status; pegasus = (pegasus_t *) data; if (pegasus->flags & PEGASUS_UNPLUG) @@ -734,7 +747,10 @@ static void rx_fixup(unsigned long data) pegasus->rx_skb->data, PEGASUS_MTU + 8, read_bulk_callback, pegasus); try_again: - if (usb_submit_urb(pegasus->rx_urb, GFP_ATOMIC)) { + status = usb_submit_urb(pegasus->rx_urb, GFP_ATOMIC); + if (status == -ENODEV) + netif_device_detach(pegasus->net); + else if (status) { pegasus->flags |= PEGASUS_RX_URB_FAIL; tasklet_schedule(&pegasus->rx_tl); } else { @@ -836,6 +852,8 @@ static void intr_callback(struct urb *urb, struct pt_regs *regs) } status = usb_submit_urb(urb, SLAB_ATOMIC); + if (status == -ENODEV) + netif_device_detach(pegasus->net); if (status && netif_msg_timer(pegasus)) printk(KERN_ERR "%s: can't resubmit interrupt urb, %d\n", net->name, status); @@ -874,6 +892,7 @@ static int pegasus_start_xmit(struct sk_buff *skb, struct net_device *net) /* cleanup should already have been scheduled */ break; case -ENODEV: /* disconnect() upcoming */ + netif_device_detach(pegasus->net); break; default: pegasus->stats.tx_errors++; @@ -999,6 +1018,8 @@ static int pegasus_open(struct net_device *net) pegasus->rx_skb->data, PEGASUS_MTU + 8, read_bulk_callback, pegasus); if ((res = usb_submit_urb(pegasus->rx_urb, GFP_KERNEL))) { + if (res == -ENODEV) + netif_device_detach(pegasus->net); if (netif_msg_ifup(pegasus)) pr_debug("%s: failed rx_urb, %d", net->name, res); goto exit; @@ -1009,6 +1030,8 @@ static int pegasus_open(struct net_device *net) pegasus->intr_buff, sizeof (pegasus->intr_buff), intr_callback, pegasus, pegasus->intr_interval); if ((res = usb_submit_urb(pegasus->intr_urb, GFP_KERNEL))) { + if (res == -ENODEV) + netif_device_detach(pegasus->net); if (netif_msg_ifup(pegasus)) pr_debug("%s: failed intr_urb, %d\n", net->name, res); usb_kill_urb(pegasus->rx_urb); diff --git a/drivers/usb/net/pegasus.h b/drivers/usb/net/pegasus.h index a54752ce1..006438069 100644 --- a/drivers/usb/net/pegasus.h +++ b/drivers/usb/net/pegasus.h @@ -131,6 +131,7 @@ struct usb_eth_dev { #define VENDOR_COREGA 0x07aa #define VENDOR_DLINK 0x2001 #define VENDOR_ELCON 0x0db7 +#define VENDOR_ELECOM 0x056e #define VENDOR_ELSA 0x05cc #define VENDOR_GIGABYTE 0x1044 #define VENDOR_HAWKING 0x0e66 @@ -233,6 +234,8 @@ PEGASUS_DEV( "D-Link DSB-650", VENDOR_DLINK, 0xabc1, DEFAULT_GPIO_RESET ) PEGASUS_DEV( "GOLDPFEIL USB Adapter", VENDOR_ELCON, 0x0002, DEFAULT_GPIO_RESET | PEGASUS_II | HAS_HOME_PNA ) +PEGASUS_DEV( "ELECOM USB Ethernet LD-USB20", VENDOR_ELECOM, 0x4010, + DEFAULT_GPIO_RESET | PEGASUS_II ) PEGASUS_DEV( "EasiDock Ethernet", VENDOR_MOBILITY, 0x0304, DEFAULT_GPIO_RESET ) PEGASUS_DEV( "Elsa Micolink USB2Ethernet", VENDOR_ELSA, 0x3000, diff --git a/drivers/usb/net/plusb.c b/drivers/usb/net/plusb.c index 4fe863389..5d17cdfc7 100644 --- a/drivers/usb/net/plusb.c +++ b/drivers/usb/net/plusb.c @@ -20,7 +20,6 @@ // #define DEBUG // error path messages, extra info // #define VERBOSE // more; success messages -#include #include #include #include diff --git a/drivers/usb/net/rndis_host.c b/drivers/usb/net/rndis_host.c index 94ddfe16f..c2a28d88e 100644 --- a/drivers/usb/net/rndis_host.c +++ b/drivers/usb/net/rndis_host.c @@ -20,7 +20,6 @@ // #define DEBUG // error path messages, extra info // #define VERBOSE // more; success messages -#include #include #include #include @@ -30,7 +29,7 @@ #include #include #include -#include +#include #include "usbnet.h" diff --git a/drivers/usb/net/rtl8150.c b/drivers/usb/net/rtl8150.c index 1bbbae283..a72685b96 100644 --- a/drivers/usb/net/rtl8150.c +++ b/drivers/usb/net/rtl8150.c @@ -6,7 +6,6 @@ * version 2 as published by the Free Software Foundation. */ -#include #include #include #include @@ -129,11 +128,13 @@ #define VENDOR_ID_MELCO 0x0411 #define VENDOR_ID_MICRONET 0x3980 #define VENDOR_ID_LONGSHINE 0x07b8 +#define VENDOR_ID_ZYXEL 0x0586 #define PRODUCT_ID_RTL8150 0x8150 #define PRODUCT_ID_LUAKTX 0x0012 #define PRODUCT_ID_LCS8138TX 0x401a #define PRODUCT_ID_SP128AR 0x0003 +#define PRODUCT_ID_PRESTIGE 0x401a #undef EEPROM_WRITE @@ -143,6 +144,7 @@ static struct usb_device_id rtl8150_table[] = { {USB_DEVICE(VENDOR_ID_MELCO, PRODUCT_ID_LUAKTX)}, {USB_DEVICE(VENDOR_ID_MICRONET, PRODUCT_ID_SP128AR)}, {USB_DEVICE(VENDOR_ID_LONGSHINE, PRODUCT_ID_LCS8138TX)}, + {USB_DEVICE(VENDOR_ID_ZYXEL, PRODUCT_ID_PRESTIGE)}, {} }; @@ -173,6 +175,8 @@ static inline struct sk_buff *pull_skb(rtl8150_t *); static void rtl8150_disconnect(struct usb_interface *intf); static int rtl8150_probe(struct usb_interface *intf, const struct usb_device_id *id); +static int rtl8150_suspend(struct usb_interface *intf, pm_message_t message); +static int rtl8150_resume(struct usb_interface *intf); static const char driver_name [] = "rtl8150"; @@ -181,6 +185,8 @@ static struct usb_driver rtl8150_driver = { .probe = rtl8150_probe, .disconnect = rtl8150_disconnect, .id_table = rtl8150_table, + .suspend = rtl8150_suspend, + .resume = rtl8150_resume }; /* @@ -236,9 +242,11 @@ static int async_set_registers(rtl8150_t * dev, u16 indx, u16 size) usb_fill_control_urb(dev->ctrl_urb, dev->udev, usb_sndctrlpipe(dev->udev, 0), (char *) &dev->dr, &dev->rx_creg, size, ctrl_callback, dev); - if ((ret = usb_submit_urb(dev->ctrl_urb, GFP_ATOMIC))) + if ((ret = usb_submit_urb(dev->ctrl_urb, GFP_ATOMIC))) { + if (ret == -ENODEV) + netif_device_detach(dev->netdev); err("control request submission failed: %d", ret); - else + } else set_bit(RX_REG_SET, &dev->flags); return ret; @@ -414,6 +422,7 @@ static void read_bulk_callback(struct urb *urb, struct pt_regs *regs) struct sk_buff *skb; struct net_device *netdev; u16 rx_stat; + int status; dev = urb->context; if (!dev) @@ -463,7 +472,10 @@ static void read_bulk_callback(struct urb *urb, struct pt_regs *regs) goon: usb_fill_bulk_urb(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1), dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev); - if (usb_submit_urb(dev->rx_urb, GFP_ATOMIC)) { + status = usb_submit_urb(dev->rx_urb, GFP_ATOMIC); + if (status == -ENODEV) + netif_device_detach(dev->netdev); + else if (status) { set_bit(RX_URB_FAIL, &dev->flags); goto resched; } else { @@ -479,6 +491,7 @@ static void rx_fixup(unsigned long data) { rtl8150_t *dev; struct sk_buff *skb; + int status; dev = (rtl8150_t *)data; @@ -497,10 +510,13 @@ static void rx_fixup(unsigned long data) usb_fill_bulk_urb(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1), dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev); try_again: - if (usb_submit_urb(dev->rx_urb, GFP_ATOMIC)) { + status = usb_submit_urb(dev->rx_urb, GFP_ATOMIC); + if (status == -ENODEV) { + netif_device_detach(dev->netdev); + } else if (status) { set_bit(RX_URB_FAIL, &dev->flags); goto tlsched; - } else { + } else { clear_bit(RX_URB_FAIL, &dev->flags); } @@ -572,12 +588,43 @@ static void intr_callback(struct urb *urb, struct pt_regs *regs) resubmit: status = usb_submit_urb (urb, SLAB_ATOMIC); - if (status) + if (status == -ENODEV) + netif_device_detach(dev->netdev); + else if (status) err ("can't resubmit intr, %s-%s/input0, status %d", dev->udev->bus->bus_name, dev->udev->devpath, status); } +static int rtl8150_suspend(struct usb_interface *intf, pm_message_t message) +{ + rtl8150_t *dev = usb_get_intfdata(intf); + + netif_device_detach(dev->netdev); + + if (netif_running(dev->netdev)) { + usb_kill_urb(dev->rx_urb); + usb_kill_urb(dev->intr_urb); + } + return 0; +} + +static int rtl8150_resume(struct usb_interface *intf) +{ + rtl8150_t *dev = usb_get_intfdata(intf); + + netif_device_attach(dev->netdev); + if (netif_running(dev->netdev)) { + dev->rx_urb->status = 0; + dev->rx_urb->actual_length = 0; + read_bulk_callback(dev->rx_urb, NULL); + + dev->intr_urb->status = 0; + dev->intr_urb->actual_length = 0; + intr_callback(dev->intr_urb, NULL); + } + return 0; +} /* ** @@ -688,9 +735,14 @@ static int rtl8150_start_xmit(struct sk_buff *skb, struct net_device *netdev) usb_fill_bulk_urb(dev->tx_urb, dev->udev, usb_sndbulkpipe(dev->udev, 2), skb->data, count, write_bulk_callback, dev); if ((res = usb_submit_urb(dev->tx_urb, GFP_ATOMIC))) { - warn("failed tx_urb %d\n", res); - dev->stats.tx_errors++; - netif_start_queue(netdev); + /* Can we get/handle EPIPE here? */ + if (res == -ENODEV) + netif_device_detach(dev->netdev); + else { + warn("failed tx_urb %d\n", res); + dev->stats.tx_errors++; + netif_start_queue(netdev); + } } else { dev->stats.tx_packets++; dev->stats.tx_bytes += skb->len; @@ -727,16 +779,25 @@ static int rtl8150_open(struct net_device *netdev) usb_fill_bulk_urb(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1), dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev); - if ((res = usb_submit_urb(dev->rx_urb, GFP_KERNEL))) + if ((res = usb_submit_urb(dev->rx_urb, GFP_KERNEL))) { + if (res == -ENODEV) + netif_device_detach(dev->netdev); warn("%s: rx_urb submit failed: %d", __FUNCTION__, res); + return res; + } usb_fill_int_urb(dev->intr_urb, dev->udev, usb_rcvintpipe(dev->udev, 3), dev->intr_buff, INTBUFSIZE, intr_callback, dev, dev->intr_interval); - if ((res = usb_submit_urb(dev->intr_urb, GFP_KERNEL))) + if ((res = usb_submit_urb(dev->intr_urb, GFP_KERNEL))) { + if (res == -ENODEV) + netif_device_detach(dev->netdev); warn("%s: intr_urb submit failed: %d", __FUNCTION__, res); - netif_start_queue(netdev); + usb_kill_urb(dev->rx_urb); + return res; + } enable_net_traffic(dev); set_carrier(netdev); + netif_start_queue(netdev); return res; } @@ -911,6 +972,7 @@ static void rtl8150_disconnect(struct usb_interface *intf) if (dev) { set_bit(RTL8150_UNPLUG, &dev->flags); tasklet_disable(&dev->tl); + tasklet_kill(&dev->tl); unregister_netdev(dev->netdev); unlink_all_urbs(dev); free_all_urbs(dev); diff --git a/drivers/usb/net/usbnet.c b/drivers/usb/net/usbnet.c index 362d6907c..179b820fc 100644 --- a/drivers/usb/net/usbnet.c +++ b/drivers/usb/net/usbnet.c @@ -33,7 +33,6 @@ // #define DEBUG // error path messages, extra info // #define VERBOSE // more; success messages -#include #include #include #include @@ -522,6 +521,18 @@ static int unlink_urbs (struct usbnet *dev, struct sk_buff_head *q) return count; } +// Flush all pending rx urbs +// minidrivers may need to do this when the MTU changes + +void usbnet_unlink_rx_urbs(struct usbnet *dev) +{ + if (netif_running(dev->net)) { + (void) unlink_urbs (dev, &dev->rxq); + tasklet_schedule(&dev->bh); + } +} +EXPORT_SYMBOL_GPL(usbnet_unlink_rx_urbs); + /*-------------------------------------------------------------------------*/ diff --git a/drivers/usb/net/usbnet.h b/drivers/usb/net/usbnet.h index 89fc4958e..c0746f045 100644 --- a/drivers/usb/net/usbnet.h +++ b/drivers/usb/net/usbnet.h @@ -166,6 +166,7 @@ struct skb_data { /* skb->cb is one of these */ extern int usbnet_get_endpoints(struct usbnet *, struct usb_interface *); extern void usbnet_defer_kevent (struct usbnet *, int); extern void usbnet_skb_return (struct usbnet *, struct sk_buff *); +extern void usbnet_unlink_rx_urbs(struct usbnet *); extern u32 usbnet_get_msglevel (struct net_device *); extern void usbnet_set_msglevel (struct net_device *, u32); diff --git a/drivers/usb/net/zaurus.c b/drivers/usb/net/zaurus.c index f7ac9d6b9..144566bda 100644 --- a/drivers/usb/net/zaurus.c +++ b/drivers/usb/net/zaurus.c @@ -20,7 +20,6 @@ // #define DEBUG // error path messages, extra info // #define VERBOSE // more; success messages -#include #include #include #include @@ -30,7 +29,7 @@ #include #include #include -#include +#include #include "usbnet.h" @@ -109,7 +108,7 @@ static const struct driver_info zaurus_sl5x00_info = { .check_connect = always_connected, .bind = zaurus_bind, .unbind = usbnet_cdc_unbind, - .tx_fixup = zaurus_tx_fixup, + .tx_fixup = zaurus_tx_fixup, }; #define ZAURUS_STRONGARM_INFO ((unsigned long)&zaurus_sl5x00_info) @@ -119,7 +118,7 @@ static const struct driver_info zaurus_pxa_info = { .check_connect = always_connected, .bind = zaurus_bind, .unbind = usbnet_cdc_unbind, - .tx_fixup = zaurus_tx_fixup, + .tx_fixup = zaurus_tx_fixup, }; #define ZAURUS_PXA_INFO ((unsigned long)&zaurus_pxa_info) @@ -129,7 +128,7 @@ static const struct driver_info olympus_mxl_info = { .check_connect = always_connected, .bind = zaurus_bind, .unbind = usbnet_cdc_unbind, - .tx_fixup = zaurus_tx_fixup, + .tx_fixup = zaurus_tx_fixup, }; #define OLYMPUS_MXL_INFO ((unsigned long)&olympus_mxl_info) @@ -228,6 +227,11 @@ bad_detail: detail->bDetailData[2]); goto bad_desc; } + + /* same extra framing as for non-BLAN mode */ + dev->net->hard_header_len += 6; + dev->rx_urb_size = dev->net->hard_header_len + + dev->net->mtu; break; } next_desc: @@ -258,7 +262,7 @@ static const struct driver_info bogus_mdlm_info = { .description = "pseudo-MDLM (BLAN) device", .flags = FLAG_FRAMING_Z, .check_connect = always_connected, - .tx_fixup = zaurus_tx_fixup, + .tx_fixup = zaurus_tx_fixup, .bind = blan_mdlm_bind, }; @@ -367,13 +371,13 @@ static struct usb_driver zaurus_driver = { static int __init zaurus_init(void) { - return usb_register(&zaurus_driver); + return usb_register(&zaurus_driver); } module_init(zaurus_init); static void __exit zaurus_exit(void) { - usb_deregister(&zaurus_driver); + usb_deregister(&zaurus_driver); } module_exit(zaurus_exit); diff --git a/drivers/usb/net/zd1201.c b/drivers/usb/net/zd1201.c deleted file mode 100644 index 341ae5f73..000000000 --- a/drivers/usb/net/zd1201.c +++ /dev/null @@ -1,1906 +0,0 @@ -/* - * Driver for ZyDAS zd1201 based wireless USB devices. - * - * Copyright (c) 2004, 2005 Jeroen Vreeken (pe1rxq@amsat.org) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * Parts of this driver have been derived from a wlan-ng version - * modified by ZyDAS. They also made documentation available, thanks! - * Copyright (C) 1999 AbsoluteValue Systems, Inc. All Rights Reserved. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "zd1201.h" - -static struct usb_device_id zd1201_table[] = { - {USB_DEVICE(0x0586, 0x3400)}, /* Peabird Wireless USB Adapter */ - {USB_DEVICE(0x0ace, 0x1201)}, /* ZyDAS ZD1201 Wireless USB Adapter */ - {USB_DEVICE(0x050d, 0x6051)}, /* Belkin F5D6051 usb adapter */ - {USB_DEVICE(0x0db0, 0x6823)}, /* MSI UB11B usb adapter */ - {} -}; - -static int ap = 0; /* Are we an AP or a normal station? */ - -#define ZD1201_VERSION "0.15" - -MODULE_AUTHOR("Jeroen Vreeken "); -MODULE_DESCRIPTION("Driver for ZyDAS ZD1201 based USB Wireless adapters"); -MODULE_VERSION(ZD1201_VERSION); -MODULE_LICENSE("GPL"); -module_param(ap, int, 0); -MODULE_PARM_DESC(ap, "If non-zero Access Point firmware will be loaded"); -MODULE_DEVICE_TABLE(usb, zd1201_table); - - -static int zd1201_fw_upload(struct usb_device *dev, int apfw) -{ - const struct firmware *fw_entry; - char* data; - unsigned long len; - int err; - unsigned char ret; - char *buf; - char *fwfile; - - if (apfw) - fwfile = "zd1201-ap.fw"; - else - fwfile = "zd1201.fw"; - - err = request_firmware(&fw_entry, fwfile, &dev->dev); - if (err) { - dev_err(&dev->dev, "Failed to load %s firmware file!\n", fwfile); - dev_err(&dev->dev, "Make sure the hotplug firmware loader is installed.\n"); - dev_err(&dev->dev, "Goto http://linux-lc100020.sourceforge.net for more info\n"); - return err; - } - - data = fw_entry->data; - len = fw_entry->size; - - buf = kmalloc(1024, GFP_ATOMIC); - if (!buf) - goto exit; - - while (len > 0) { - int translen = (len > 1024) ? 1024 : len; - memcpy(buf, data, translen); - - err = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 0, - USB_DIR_OUT | 0x40, 0, 0, buf, translen, - ZD1201_FW_TIMEOUT); - if (err < 0) - goto exit; - - len -= translen; - data += translen; - } - - err = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 0x2, - USB_DIR_OUT | 0x40, 0, 0, NULL, 0, ZD1201_FW_TIMEOUT); - if (err < 0) - goto exit; - - err = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 0x4, - USB_DIR_IN | 0x40, 0,0, &ret, sizeof(ret), ZD1201_FW_TIMEOUT); - if (err < 0) - goto exit; - - if (ret & 0x80) { - err = -EIO; - goto exit; - } - - err = 0; -exit: - kfree(buf); - release_firmware(fw_entry); - return err; -} - -static void zd1201_usbfree(struct urb *urb, struct pt_regs *regs) -{ - struct zd1201 *zd = urb->context; - - switch(urb->status) { - case -EILSEQ: - case -ENODEV: - case -ETIMEDOUT: - case -ENOENT: - case -EPIPE: - case -EOVERFLOW: - case -ESHUTDOWN: - dev_warn(&zd->usb->dev, "%s: urb failed: %d\n", - zd->dev->name, urb->status); - } - - kfree(urb->transfer_buffer); - usb_free_urb(urb); - return; -} - -/* cmdreq message: - u32 type - u16 cmd - u16 parm0 - u16 parm1 - u16 parm2 - u8 pad[4] - - total: 4 + 2 + 2 + 2 + 2 + 4 = 16 -*/ -static int zd1201_docmd(struct zd1201 *zd, int cmd, int parm0, - int parm1, int parm2) -{ - unsigned char *command; - int ret; - struct urb *urb; - - command = kmalloc(16, GFP_ATOMIC); - if (!command) - return -ENOMEM; - - *((__le32*)command) = cpu_to_le32(ZD1201_USB_CMDREQ); - *((__le16*)&command[4]) = cpu_to_le16(cmd); - *((__le16*)&command[6]) = cpu_to_le16(parm0); - *((__le16*)&command[8]) = cpu_to_le16(parm1); - *((__le16*)&command[10])= cpu_to_le16(parm2); - - urb = usb_alloc_urb(0, GFP_ATOMIC); - if (!urb) { - kfree(command); - return -ENOMEM; - } - usb_fill_bulk_urb(urb, zd->usb, usb_sndbulkpipe(zd->usb, zd->endp_out2), - command, 16, zd1201_usbfree, zd); - ret = usb_submit_urb(urb, GFP_ATOMIC); - if (ret) { - kfree(command); - usb_free_urb(urb); - } - - return ret; -} - -/* Callback after sending out a packet */ -static void zd1201_usbtx(struct urb *urb, struct pt_regs *regs) -{ - struct zd1201 *zd = urb->context; - netif_wake_queue(zd->dev); - return; -} - -/* Incoming data */ -static void zd1201_usbrx(struct urb *urb, struct pt_regs *regs) -{ - struct zd1201 *zd = urb->context; - int free = 0; - unsigned char *data = urb->transfer_buffer; - struct sk_buff *skb; - unsigned char type; - - if (!zd) { - free = 1; - goto exit; - } - - switch(urb->status) { - case -EILSEQ: - case -ENODEV: - case -ETIMEDOUT: - case -ENOENT: - case -EPIPE: - case -EOVERFLOW: - case -ESHUTDOWN: - dev_warn(&zd->usb->dev, "%s: rx urb failed: %d\n", - zd->dev->name, urb->status); - free = 1; - goto exit; - } - - if (urb->status != 0 || urb->actual_length == 0) - goto resubmit; - - type = data[0]; - if (type == ZD1201_PACKET_EVENTSTAT || type == ZD1201_PACKET_RESOURCE) { - memcpy(zd->rxdata, data, urb->actual_length); - zd->rxlen = urb->actual_length; - zd->rxdatas = 1; - wake_up(&zd->rxdataq); - } - /* Info frame */ - if (type == ZD1201_PACKET_INQUIRE) { - int i = 0; - unsigned short infotype, framelen, copylen; - framelen = le16_to_cpu(*(__le16*)&data[4]); - infotype = le16_to_cpu(*(__le16*)&data[6]); - - if (infotype == ZD1201_INF_LINKSTATUS) { - short linkstatus; - - linkstatus = le16_to_cpu(*(__le16*)&data[8]); - switch(linkstatus) { - case 1: - netif_carrier_on(zd->dev); - break; - case 2: - netif_carrier_off(zd->dev); - break; - case 3: - netif_carrier_off(zd->dev); - break; - case 4: - netif_carrier_on(zd->dev); - break; - default: - netif_carrier_off(zd->dev); - } - goto resubmit; - } - if (infotype == ZD1201_INF_ASSOCSTATUS) { - short status = le16_to_cpu(*(__le16*)(data+8)); - int event; - union iwreq_data wrqu; - - switch (status) { - case ZD1201_ASSOCSTATUS_STAASSOC: - case ZD1201_ASSOCSTATUS_REASSOC: - event = IWEVREGISTERED; - break; - case ZD1201_ASSOCSTATUS_DISASSOC: - case ZD1201_ASSOCSTATUS_ASSOCFAIL: - case ZD1201_ASSOCSTATUS_AUTHFAIL: - default: - event = IWEVEXPIRED; - } - memcpy(wrqu.addr.sa_data, data+10, ETH_ALEN); - wrqu.addr.sa_family = ARPHRD_ETHER; - - /* Send event to user space */ - wireless_send_event(zd->dev, event, &wrqu, NULL); - - goto resubmit; - } - if (infotype == ZD1201_INF_AUTHREQ) { - union iwreq_data wrqu; - - memcpy(wrqu.addr.sa_data, data+8, ETH_ALEN); - wrqu.addr.sa_family = ARPHRD_ETHER; - /* There isn't a event that trully fits this request. - We assume that userspace will be smart enough to - see a new station being expired and sends back a - authstation ioctl to authorize it. */ - wireless_send_event(zd->dev, IWEVEXPIRED, &wrqu, NULL); - goto resubmit; - } - /* Other infotypes are handled outside this handler */ - zd->rxlen = 0; - while (i < urb->actual_length) { - copylen = le16_to_cpu(*(__le16*)&data[i+2]); - /* Sanity check, sometimes we get junk */ - if (copylen+zd->rxlen > sizeof(zd->rxdata)) - break; - memcpy(zd->rxdata+zd->rxlen, data+i+4, copylen); - zd->rxlen += copylen; - i += 64; - } - if (i >= urb->actual_length) { - zd->rxdatas = 1; - wake_up(&zd->rxdataq); - } - goto resubmit; - } - /* Actual data */ - if (data[urb->actual_length-1] == ZD1201_PACKET_RXDATA) { - int datalen = urb->actual_length-1; - unsigned short len, fc, seq; - struct hlist_node *node; - - len = ntohs(*(__be16 *)&data[datalen-2]); - if (len>datalen) - len=datalen; - fc = le16_to_cpu(*(__le16 *)&data[datalen-16]); - seq = le16_to_cpu(*(__le16 *)&data[datalen-24]); - - if(zd->monitor) { - if (datalen < 24) - goto resubmit; - if (!(skb = dev_alloc_skb(datalen+24))) - goto resubmit; - - memcpy(skb_put(skb, 2), &data[datalen-16], 2); - memcpy(skb_put(skb, 2), &data[datalen-2], 2); - memcpy(skb_put(skb, 6), &data[datalen-14], 6); - memcpy(skb_put(skb, 6), &data[datalen-22], 6); - memcpy(skb_put(skb, 6), &data[datalen-8], 6); - memcpy(skb_put(skb, 2), &data[datalen-24], 2); - memcpy(skb_put(skb, len), data, len); - skb->dev = zd->dev; - skb->dev->last_rx = jiffies; - skb->protocol = eth_type_trans(skb, zd->dev); - zd->stats.rx_packets++; - zd->stats.rx_bytes += skb->len; - netif_rx(skb); - goto resubmit; - } - - if ((seq & IEEE802_11_SCTL_FRAG) || - (fc & IEEE802_11_FCTL_MOREFRAGS)) { - struct zd1201_frag *frag = NULL; - char *ptr; - - if (datalen<14) - goto resubmit; - if ((seq & IEEE802_11_SCTL_FRAG) == 0) { - frag = kmalloc(sizeof(struct zd1201_frag*), - GFP_ATOMIC); - if (!frag) - goto resubmit; - skb = dev_alloc_skb(IEEE802_11_DATA_LEN +14+2); - if (!skb) { - kfree(frag); - goto resubmit; - } - frag->skb = skb; - frag->seq = seq & IEEE802_11_SCTL_SEQ; - skb_reserve(skb, 2); - memcpy(skb_put(skb, 12), &data[datalen-14], 12); - memcpy(skb_put(skb, 2), &data[6], 2); - memcpy(skb_put(skb, len), data+8, len); - hlist_add_head(&frag->fnode, &zd->fraglist); - goto resubmit; - } - hlist_for_each_entry(frag, node, &zd->fraglist, fnode) - if(frag->seq == (seq&IEEE802_11_SCTL_SEQ)) - break; - if (!frag) - goto resubmit; - skb = frag->skb; - ptr = skb_put(skb, len); - if (ptr) - memcpy(ptr, data+8, len); - if (fc & IEEE802_11_FCTL_MOREFRAGS) - goto resubmit; - hlist_del_init(&frag->fnode); - kfree(frag); - /* Fallthrough */ - } else { - if (datalen<14) - goto resubmit; - skb = dev_alloc_skb(len + 14 + 2); - if (!skb) - goto resubmit; - skb_reserve(skb, 2); - memcpy(skb_put(skb, 12), &data[datalen-14], 12); - memcpy(skb_put(skb, 2), &data[6], 2); - memcpy(skb_put(skb, len), data+8, len); - } - skb->dev = zd->dev; - skb->dev->last_rx = jiffies; - skb->protocol = eth_type_trans(skb, zd->dev); - zd->stats.rx_packets++; - zd->stats.rx_bytes += skb->len; - netif_rx(skb); - } -resubmit: - memset(data, 0, ZD1201_RXSIZE); - - urb->status = 0; - urb->dev = zd->usb; - if(usb_submit_urb(urb, GFP_ATOMIC)) - free = 1; - -exit: - if (free) { - zd->rxlen = 0; - zd->rxdatas = 1; - wake_up(&zd->rxdataq); - kfree(urb->transfer_buffer); - } - return; -} - -static int zd1201_getconfig(struct zd1201 *zd, int rid, void *riddata, - unsigned int riddatalen) -{ - int err; - int i = 0; - int code; - int rid_fid; - int length; - unsigned char *pdata; - - zd->rxdatas = 0; - err = zd1201_docmd(zd, ZD1201_CMDCODE_ACCESS, rid, 0, 0); - if (err) - return err; - - wait_event_interruptible(zd->rxdataq, zd->rxdatas); - if (!zd->rxlen) - return -EIO; - - code = le16_to_cpu(*(__le16*)(&zd->rxdata[4])); - rid_fid = le16_to_cpu(*(__le16*)(&zd->rxdata[6])); - length = le16_to_cpu(*(__le16*)(&zd->rxdata[8])); - if (length > zd->rxlen) - length = zd->rxlen-6; - - /* If access bit is not on, then error */ - if ((code & ZD1201_ACCESSBIT) != ZD1201_ACCESSBIT || rid_fid != rid ) - return -EINVAL; - - /* Not enough buffer for allocating data */ - if (riddatalen != (length - 4)) { - dev_dbg(&zd->usb->dev, "riddatalen mismatches, expected=%u, (packet=%u) length=%u, rid=0x%04X, rid_fid=0x%04X\n", - riddatalen, zd->rxlen, length, rid, rid_fid); - return -ENODATA; - } - - zd->rxdatas = 0; - /* Issue SetRxRid commnd */ - err = zd1201_docmd(zd, ZD1201_CMDCODE_SETRXRID, rid, 0, length); - if (err) - return err; - - /* Receive RID record from resource packets */ - wait_event_interruptible(zd->rxdataq, zd->rxdatas); - if (!zd->rxlen) - return -EIO; - - if (zd->rxdata[zd->rxlen - 1] != ZD1201_PACKET_RESOURCE) { - dev_dbg(&zd->usb->dev, "Packet type mismatch: 0x%x not 0x3\n", - zd->rxdata[zd->rxlen-1]); - return -EINVAL; - } - - /* Set the data pointer and received data length */ - pdata = zd->rxdata; - length = zd->rxlen; - - do { - int actual_length; - - actual_length = (length > 64) ? 64 : length; - - if(pdata[0] != 0x3) { - dev_dbg(&zd->usb->dev, "Rx Resource packet type error: %02X\n", - pdata[0]); - return -EINVAL; - } - - if (actual_length != 64) { - /* Trim the last packet type byte */ - actual_length--; - } - - /* Skip the 4 bytes header (RID length and RID) */ - if(i == 0) { - pdata += 8; - actual_length -= 8; - } - else { - pdata += 4; - actual_length -= 4; - } - - memcpy(riddata, pdata, actual_length); - riddata += actual_length; - pdata += actual_length; - length -= 64; - i++; - } while (length > 0); - - return 0; -} - -/* - * resreq: - * byte type - * byte sequence - * u16 reserved - * byte data[12] - * total: 16 - */ -static int zd1201_setconfig(struct zd1201 *zd, int rid, void *buf, int len, int wait) -{ - int err; - unsigned char *request; - int reqlen; - char seq=0; - struct urb *urb; - unsigned int gfp_mask = wait ? GFP_NOIO : GFP_ATOMIC; - - len += 4; /* first 4 are for header */ - - zd->rxdatas = 0; - zd->rxlen = 0; - for (seq=0; len > 0; seq++) { - request = kmalloc(16, gfp_mask); - if (!request) - return -ENOMEM; - urb = usb_alloc_urb(0, gfp_mask); - if (!urb) { - kfree(request); - return -ENOMEM; - } - memset(request, 0, 16); - reqlen = len>12 ? 12 : len; - request[0] = ZD1201_USB_RESREQ; - request[1] = seq; - request[2] = 0; - request[3] = 0; - if (request[1] == 0) { - /* add header */ - *(__le16*)&request[4] = cpu_to_le16((len-2+1)/2); - *(__le16*)&request[6] = cpu_to_le16(rid); - memcpy(request+8, buf, reqlen-4); - buf += reqlen-4; - } else { - memcpy(request+4, buf, reqlen); - buf += reqlen; - } - - len -= reqlen; - - usb_fill_bulk_urb(urb, zd->usb, usb_sndbulkpipe(zd->usb, - zd->endp_out2), request, 16, zd1201_usbfree, zd); - err = usb_submit_urb(urb, gfp_mask); - if (err) - goto err; - } - - request = kmalloc(16, gfp_mask); - if (!request) - return -ENOMEM; - urb = usb_alloc_urb(0, gfp_mask); - if (!urb) { - kfree(request); - return -ENOMEM; - } - *((__le32*)request) = cpu_to_le32(ZD1201_USB_CMDREQ); - *((__le16*)&request[4]) = - cpu_to_le16(ZD1201_CMDCODE_ACCESS|ZD1201_ACCESSBIT); - *((__le16*)&request[6]) = cpu_to_le16(rid); - *((__le16*)&request[8]) = cpu_to_le16(0); - *((__le16*)&request[10]) = cpu_to_le16(0); - usb_fill_bulk_urb(urb, zd->usb, usb_sndbulkpipe(zd->usb, zd->endp_out2), - request, 16, zd1201_usbfree, zd); - err = usb_submit_urb(urb, gfp_mask); - if (err) - goto err; - - if (wait) { - wait_event_interruptible(zd->rxdataq, zd->rxdatas); - if (!zd->rxlen || le16_to_cpu(*(__le16*)&zd->rxdata[6]) != rid) { - dev_dbg(&zd->usb->dev, "wrong or no RID received\n"); - } - } - - return 0; -err: - kfree(request); - usb_free_urb(urb); - return err; -} - -static inline int zd1201_getconfig16(struct zd1201 *zd, int rid, short *val) -{ - int err; - __le16 zdval; - - err = zd1201_getconfig(zd, rid, &zdval, sizeof(__le16)); - if (err) - return err; - *val = le16_to_cpu(zdval); - return 0; -} - -static inline int zd1201_setconfig16(struct zd1201 *zd, int rid, short val) -{ - __le16 zdval = cpu_to_le16(val); - return (zd1201_setconfig(zd, rid, &zdval, sizeof(__le16), 1)); -} - -static int zd1201_drvr_start(struct zd1201 *zd) -{ - int err, i; - short max; - __le16 zdmax; - unsigned char *buffer; - - buffer = kmalloc(ZD1201_RXSIZE, GFP_KERNEL); - if (!buffer) - return -ENOMEM; - memset(buffer, 0, ZD1201_RXSIZE); - - usb_fill_bulk_urb(zd->rx_urb, zd->usb, - usb_rcvbulkpipe(zd->usb, zd->endp_in), buffer, ZD1201_RXSIZE, - zd1201_usbrx, zd); - - err = usb_submit_urb(zd->rx_urb, GFP_KERNEL); - if (err) - goto err_buffer; - - err = zd1201_docmd(zd, ZD1201_CMDCODE_INIT, 0, 0, 0); - if (err) - goto err_urb; - - err = zd1201_getconfig(zd, ZD1201_RID_CNFMAXTXBUFFERNUMBER, &zdmax, - sizeof(__le16)); - if (err) - goto err_urb; - - max = le16_to_cpu(zdmax); - for (i=0; irx_urb); - return err; -err_buffer: - kfree(buffer); - return err; -} - -/* Magic alert: The firmware doesn't seem to like the MAC state being - * toggled in promisc (aka monitor) mode. - * (It works a number of times, but will halt eventually) - * So we turn it of before disabling and on after enabling if needed. - */ -static int zd1201_enable(struct zd1201 *zd) -{ - int err; - - if (zd->mac_enabled) - return 0; - - err = zd1201_docmd(zd, ZD1201_CMDCODE_ENABLE, 0, 0, 0); - if (!err) - zd->mac_enabled = 1; - - if (zd->monitor) - err = zd1201_setconfig16(zd, ZD1201_RID_PROMISCUOUSMODE, 1); - - return err; -} - -static int zd1201_disable(struct zd1201 *zd) -{ - int err; - - if (!zd->mac_enabled) - return 0; - if (zd->monitor) { - err = zd1201_setconfig16(zd, ZD1201_RID_PROMISCUOUSMODE, 0); - if (err) - return err; - } - - err = zd1201_docmd(zd, ZD1201_CMDCODE_DISABLE, 0, 0, 0); - if (!err) - zd->mac_enabled = 0; - return err; -} - -static int zd1201_mac_reset(struct zd1201 *zd) -{ - if (!zd->mac_enabled) - return 0; - zd1201_disable(zd); - return zd1201_enable(zd); -} - -static int zd1201_join(struct zd1201 *zd, char *essid, int essidlen) -{ - int err, val; - char buf[IW_ESSID_MAX_SIZE+2]; - - err = zd1201_disable(zd); - if (err) - return err; - - val = ZD1201_CNFAUTHENTICATION_OPENSYSTEM; - val |= ZD1201_CNFAUTHENTICATION_SHAREDKEY; - err = zd1201_setconfig16(zd, ZD1201_RID_CNFAUTHENTICATION, val); - if (err) - return err; - - *(__le16 *)buf = cpu_to_le16(essidlen); - memcpy(buf+2, essid, essidlen); - if (!zd->ap) { /* Normal station */ - err = zd1201_setconfig(zd, ZD1201_RID_CNFDESIREDSSID, buf, - IW_ESSID_MAX_SIZE+2, 1); - if (err) - return err; - } else { /* AP */ - err = zd1201_setconfig(zd, ZD1201_RID_CNFOWNSSID, buf, - IW_ESSID_MAX_SIZE+2, 1); - if (err) - return err; - } - - err = zd1201_setconfig(zd, ZD1201_RID_CNFOWNMACADDR, - zd->dev->dev_addr, zd->dev->addr_len, 1); - if (err) - return err; - - err = zd1201_enable(zd); - if (err) - return err; - - msleep(100); - return 0; -} - -static int zd1201_net_open(struct net_device *dev) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - - /* Start MAC with wildcard if no essid set */ - if (!zd->mac_enabled) - zd1201_join(zd, zd->essid, zd->essidlen); - netif_start_queue(dev); - - return 0; -} - -static int zd1201_net_stop(struct net_device *dev) -{ - netif_stop_queue(dev); - - return 0; -} - -/* - RFC 1042 encapsulates Ethernet frames in 802.11 frames - by prefixing them with 0xaa, 0xaa, 0x03) followed by a SNAP OID of 0 - (0x00, 0x00, 0x00). Zd requires an additional padding, copy - of ethernet addresses, length of the standard RFC 1042 packet - and a command byte (which is nul for tx). - - tx frame (from Wlan NG): - RFC 1042: - llc 0xAA 0xAA 0x03 (802.2 LLC) - snap 0x00 0x00 0x00 (Ethernet encapsulated) - type 2 bytes, Ethernet type field - payload (minus eth header) - Zydas specific: - padding 1B if (skb->len+8+1)%64==0 - Eth MAC addr 12 bytes, Ethernet MAC addresses - length 2 bytes, RFC 1042 packet length - (llc+snap+type+payload) - zd 1 null byte, zd1201 packet type - */ -static int zd1201_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - unsigned char *txbuf = zd->txdata; - int txbuflen, pad = 0, err; - struct urb *urb = zd->tx_urb; - - if (!zd->mac_enabled || zd->monitor) { - zd->stats.tx_dropped++; - kfree_skb(skb); - return 0; - } - netif_stop_queue(dev); - - txbuflen = skb->len + 8 + 1; - if (txbuflen%64 == 0) { - pad = 1; - txbuflen++; - } - txbuf[0] = 0xAA; - txbuf[1] = 0xAA; - txbuf[2] = 0x03; - txbuf[3] = 0x00; /* rfc1042 */ - txbuf[4] = 0x00; - txbuf[5] = 0x00; - - memcpy(txbuf+6, skb->data+12, skb->len-12); - if (pad) - txbuf[skb->len-12+6]=0; - memcpy(txbuf+skb->len-12+6+pad, skb->data, 12); - *(__be16*)&txbuf[skb->len+6+pad] = htons(skb->len-12+6); - txbuf[txbuflen-1] = 0; - - usb_fill_bulk_urb(urb, zd->usb, usb_sndbulkpipe(zd->usb, zd->endp_out), - txbuf, txbuflen, zd1201_usbtx, zd); - - err = usb_submit_urb(zd->tx_urb, GFP_ATOMIC); - if (err) { - zd->stats.tx_errors++; - netif_start_queue(dev); - return err; - } - zd->stats.tx_packets++; - zd->stats.tx_bytes += skb->len; - dev->trans_start = jiffies; - kfree_skb(skb); - - return 0; -} - -static void zd1201_tx_timeout(struct net_device *dev) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - - if (!zd) - return; - dev_warn(&zd->usb->dev, "%s: TX timeout, shooting down urb\n", - dev->name); - zd->tx_urb->transfer_flags |= URB_ASYNC_UNLINK; - usb_unlink_urb(zd->tx_urb); - zd->stats.tx_errors++; - /* Restart the timeout to quiet the watchdog: */ - dev->trans_start = jiffies; -} - -static int zd1201_set_mac_address(struct net_device *dev, void *p) -{ - struct sockaddr *addr = p; - struct zd1201 *zd = (struct zd1201 *)dev->priv; - int err; - - if (!zd) - return -ENODEV; - - err = zd1201_setconfig(zd, ZD1201_RID_CNFOWNMACADDR, - addr->sa_data, dev->addr_len, 1); - if (err) - return err; - memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); - - return zd1201_mac_reset(zd); -} - -static struct net_device_stats *zd1201_get_stats(struct net_device *dev) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - - return &zd->stats; -} - -static struct iw_statistics *zd1201_get_wireless_stats(struct net_device *dev) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - - return &zd->iwstats; -} - -static void zd1201_set_multicast(struct net_device *dev) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - struct dev_mc_list *mc = dev->mc_list; - unsigned char reqbuf[ETH_ALEN*ZD1201_MAXMULTI]; - int i; - - if (dev->mc_count > ZD1201_MAXMULTI) - return; - - for (i=0; imc_count; i++) { - memcpy(reqbuf+i*ETH_ALEN, mc->dmi_addr, ETH_ALEN); - mc = mc->next; - } - zd1201_setconfig(zd, ZD1201_RID_CNFGROUPADDRESS, reqbuf, - dev->mc_count*ETH_ALEN, 0); - -} - -static int zd1201_config_commit(struct net_device *dev, - struct iw_request_info *info, struct iw_point *data, char *essid) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - - return zd1201_mac_reset(zd); -} - -static int zd1201_get_name(struct net_device *dev, - struct iw_request_info *info, char *name, char *extra) -{ - strcpy(name, "IEEE 802.11b"); - - return 0; -} - -static int zd1201_set_freq(struct net_device *dev, - struct iw_request_info *info, struct iw_freq *freq, char *extra) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - short channel = 0; - int err; - - if (freq->e == 0) - channel = freq->m; - else { - if (freq->m >= 2482) - channel = 14; - if (freq->m >= 2407) - channel = (freq->m-2407)/5; - } - - err = zd1201_setconfig16(zd, ZD1201_RID_CNFOWNCHANNEL, channel); - if (err) - return err; - - zd1201_mac_reset(zd); - - return 0; -} - -static int zd1201_get_freq(struct net_device *dev, - struct iw_request_info *info, struct iw_freq *freq, char *extra) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - short channel; - int err; - - err = zd1201_getconfig16(zd, ZD1201_RID_CNFOWNCHANNEL, &channel); - if (err) - return err; - freq->e = 0; - freq->m = channel; - - return 0; -} - -static int zd1201_set_mode(struct net_device *dev, - struct iw_request_info *info, __u32 *mode, char *extra) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - short porttype, monitor = 0; - unsigned char buffer[IW_ESSID_MAX_SIZE+2]; - int err; - - if (zd->ap) { - if (*mode != IW_MODE_MASTER) - return -EINVAL; - return 0; - } - - err = zd1201_setconfig16(zd, ZD1201_RID_PROMISCUOUSMODE, 0); - if (err) - return err; - zd->dev->type = ARPHRD_ETHER; - switch(*mode) { - case IW_MODE_MONITOR: - monitor = 1; - zd->dev->type = ARPHRD_IEEE80211; - /* Make sure we are no longer associated with by - setting an 'impossible' essid. - (otherwise we mess up firmware) - */ - zd1201_join(zd, "\0-*#\0", 5); - /* Put port in pIBSS */ - case 8: /* No pseudo-IBSS in wireless extensions (yet) */ - porttype = ZD1201_PORTTYPE_PSEUDOIBSS; - break; - case IW_MODE_ADHOC: - porttype = ZD1201_PORTTYPE_IBSS; - break; - case IW_MODE_INFRA: - porttype = ZD1201_PORTTYPE_BSS; - break; - default: - return -EINVAL; - } - - err = zd1201_setconfig16(zd, ZD1201_RID_CNFPORTTYPE, porttype); - if (err) - return err; - if (zd->monitor && !monitor) { - zd1201_disable(zd); - *(__le16 *)buffer = cpu_to_le16(zd->essidlen); - memcpy(buffer+2, zd->essid, zd->essidlen); - err = zd1201_setconfig(zd, ZD1201_RID_CNFDESIREDSSID, - buffer, IW_ESSID_MAX_SIZE+2, 1); - if (err) - return err; - } - zd->monitor=monitor; - /* If monitor mode is set we don't actually turn it on here since it - * is done during mac reset anyway (see zd1201_mac_enable). - */ - - zd1201_mac_reset(zd); - - return 0; -} - -static int zd1201_get_mode(struct net_device *dev, - struct iw_request_info *info, __u32 *mode, char *extra) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - short porttype; - int err; - - err = zd1201_getconfig16(zd, ZD1201_RID_CNFPORTTYPE, &porttype); - if (err) - return err; - switch(porttype) { - case ZD1201_PORTTYPE_IBSS: - *mode = IW_MODE_ADHOC; - break; - case ZD1201_PORTTYPE_BSS: - *mode = IW_MODE_INFRA; - break; - case ZD1201_PORTTYPE_WDS: - *mode = IW_MODE_REPEAT; - break; - case ZD1201_PORTTYPE_PSEUDOIBSS: - *mode = 8;/* No Pseudo-IBSS... */ - break; - case ZD1201_PORTTYPE_AP: - *mode = IW_MODE_MASTER; - break; - default: - dev_dbg(&zd->usb->dev, "Unknown porttype: %d\n", - porttype); - *mode = IW_MODE_AUTO; - } - if (zd->monitor) - *mode = IW_MODE_MONITOR; - - return 0; -} - -static int zd1201_get_range(struct net_device *dev, - struct iw_request_info *info, struct iw_point *wrq, char *extra) -{ - struct iw_range *range = (struct iw_range *)extra; - - wrq->length = sizeof(struct iw_range); - memset(range, 0, sizeof(struct iw_range)); - range->we_version_compiled = WIRELESS_EXT; - range->we_version_source = WIRELESS_EXT; - - range->max_qual.qual = 128; - range->max_qual.level = 128; - range->max_qual.noise = 128; - range->max_qual.updated = 7; - - range->encoding_size[0] = 5; - range->encoding_size[1] = 13; - range->num_encoding_sizes = 2; - range->max_encoding_tokens = ZD1201_NUMKEYS; - - range->num_bitrates = 4; - range->bitrate[0] = 1000000; - range->bitrate[1] = 2000000; - range->bitrate[2] = 5500000; - range->bitrate[3] = 11000000; - - range->min_rts = 0; - range->min_frag = ZD1201_FRAGMIN; - range->max_rts = ZD1201_RTSMAX; - range->min_frag = ZD1201_FRAGMAX; - - return 0; -} - -/* Little bit of magic here: we only get the quality if we poll - * for it, and we never get an actual request to trigger such - * a poll. Therefore we 'assume' that the user will soon ask for - * the stats after asking the bssid. - */ -static int zd1201_get_wap(struct net_device *dev, - struct iw_request_info *info, struct sockaddr *ap_addr, char *extra) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - unsigned char buffer[6]; - - if (!zd1201_getconfig(zd, ZD1201_RID_COMMSQUALITY, buffer, 6)) { - /* Unfortunately the quality and noise reported is useless. - they seem to be accumulators that increase until you - read them, unless we poll on a fixed interval we can't - use them - */ - /*zd->iwstats.qual.qual = le16_to_cpu(((__le16 *)buffer)[0]);*/ - zd->iwstats.qual.level = le16_to_cpu(((__le16 *)buffer)[1]); - /*zd->iwstats.qual.noise = le16_to_cpu(((__le16 *)buffer)[2]);*/ - zd->iwstats.qual.updated = 2; - } - - return zd1201_getconfig(zd,ZD1201_RID_CURRENTBSSID,ap_addr->sa_data,6); -} - -static int zd1201_set_scan(struct net_device *dev, - struct iw_request_info *info, struct iw_point *srq, char *extra) -{ - /* We do everything in get_scan */ - return 0; -} - -static int zd1201_get_scan(struct net_device *dev, - struct iw_request_info *info, struct iw_point *srq, char *extra) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - int err, i, j, enabled_save; - struct iw_event iwe; - char *cev = extra; - char *end_buf = extra + IW_SCAN_MAX_DATA; - - /* No scanning in AP mode */ - if (zd->ap) - return -EOPNOTSUPP; - - /* Scan doesn't seem to work if disabled */ - enabled_save = zd->mac_enabled; - zd1201_enable(zd); - - zd->rxdatas = 0; - err = zd1201_docmd(zd, ZD1201_CMDCODE_INQUIRE, - ZD1201_INQ_SCANRESULTS, 0, 0); - if (err) - return err; - - wait_event_interruptible(zd->rxdataq, zd->rxdatas); - if (!zd->rxlen) - return -EIO; - - if (le16_to_cpu(*(__le16*)&zd->rxdata[2]) != ZD1201_INQ_SCANRESULTS) - return -EIO; - - for(i=8; irxlen; i+=62) { - iwe.cmd = SIOCGIWAP; - iwe.u.ap_addr.sa_family = ARPHRD_ETHER; - memcpy(iwe.u.ap_addr.sa_data, zd->rxdata+i+6, 6); - cev = iwe_stream_add_event(cev, end_buf, &iwe, IW_EV_ADDR_LEN); - - iwe.cmd = SIOCGIWESSID; - iwe.u.data.length = zd->rxdata[i+16]; - iwe.u.data.flags = 1; - cev = iwe_stream_add_point(cev, end_buf, &iwe, zd->rxdata+i+18); - - iwe.cmd = SIOCGIWMODE; - if (zd->rxdata[i+14]&0x01) - iwe.u.mode = IW_MODE_MASTER; - else - iwe.u.mode = IW_MODE_ADHOC; - cev = iwe_stream_add_event(cev, end_buf, &iwe, IW_EV_UINT_LEN); - - iwe.cmd = SIOCGIWFREQ; - iwe.u.freq.m = zd->rxdata[i+0]; - iwe.u.freq.e = 0; - cev = iwe_stream_add_event(cev, end_buf, &iwe, IW_EV_FREQ_LEN); - - iwe.cmd = SIOCGIWRATE; - iwe.u.bitrate.fixed = 0; - iwe.u.bitrate.disabled = 0; - for (j=0; j<10; j++) if (zd->rxdata[i+50+j]) { - iwe.u.bitrate.value = (zd->rxdata[i+50+j]&0x7f)*500000; - cev=iwe_stream_add_event(cev, end_buf, &iwe, - IW_EV_PARAM_LEN); - } - - iwe.cmd = SIOCGIWENCODE; - iwe.u.data.length = 0; - if (zd->rxdata[i+14]&0x10) - iwe.u.data.flags = IW_ENCODE_ENABLED; - else - iwe.u.data.flags = IW_ENCODE_DISABLED; - cev = iwe_stream_add_point(cev, end_buf, &iwe, NULL); - - iwe.cmd = IWEVQUAL; - iwe.u.qual.qual = zd->rxdata[i+4]; - iwe.u.qual.noise= zd->rxdata[i+2]/10-100; - iwe.u.qual.level = (256+zd->rxdata[i+4]*100)/255-100; - iwe.u.qual.updated = 7; - cev = iwe_stream_add_event(cev, end_buf, &iwe, IW_EV_QUAL_LEN); - } - - if (!enabled_save) - zd1201_disable(zd); - - srq->length = cev - extra; - srq->flags = 0; - - return 0; -} - -static int zd1201_set_essid(struct net_device *dev, - struct iw_request_info *info, struct iw_point *data, char *essid) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - - if (data->length > IW_ESSID_MAX_SIZE) - return -EINVAL; - if (data->length < 1) - data->length = 1; - zd->essidlen = data->length-1; - memset(zd->essid, 0, IW_ESSID_MAX_SIZE+1); - memcpy(zd->essid, essid, data->length); - return zd1201_join(zd, zd->essid, zd->essidlen); -} - -static int zd1201_get_essid(struct net_device *dev, - struct iw_request_info *info, struct iw_point *data, char *essid) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - - memcpy(essid, zd->essid, zd->essidlen); - data->flags = 1; - data->length = zd->essidlen; - - return 0; -} - -static int zd1201_get_nick(struct net_device *dev, struct iw_request_info *info, - struct iw_point *data, char *nick) -{ - strcpy(nick, "zd1201"); - data->flags = 1; - data->length = strlen(nick); - return 0; -} - -static int zd1201_set_rate(struct net_device *dev, - struct iw_request_info *info, struct iw_param *rrq, char *extra) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - short rate; - int err; - - switch (rrq->value) { - case 1000000: - rate = ZD1201_RATEB1; - break; - case 2000000: - rate = ZD1201_RATEB2; - break; - case 5500000: - rate = ZD1201_RATEB5; - break; - case 11000000: - default: - rate = ZD1201_RATEB11; - break; - } - if (!rrq->fixed) { /* Also enable all lower bitrates */ - rate |= rate-1; - } - - err = zd1201_setconfig16(zd, ZD1201_RID_TXRATECNTL, rate); - if (err) - return err; - - return zd1201_mac_reset(zd); -} - -static int zd1201_get_rate(struct net_device *dev, - struct iw_request_info *info, struct iw_param *rrq, char *extra) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - short rate; - int err; - - err = zd1201_getconfig16(zd, ZD1201_RID_CURRENTTXRATE, &rate); - if (err) - return err; - - switch(rate) { - case 1: - rrq->value = 1000000; - break; - case 2: - rrq->value = 2000000; - break; - case 5: - rrq->value = 5500000; - break; - case 11: - rrq->value = 11000000; - break; - default: - rrq->value = 0; - } - rrq->fixed = 0; - rrq->disabled = 0; - - return 0; -} - -static int zd1201_set_rts(struct net_device *dev, struct iw_request_info *info, - struct iw_param *rts, char *extra) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - int err; - short val = rts->value; - - if (rts->disabled || !rts->fixed) - val = ZD1201_RTSMAX; - if (val > ZD1201_RTSMAX) - return -EINVAL; - if (val < 0) - return -EINVAL; - - err = zd1201_setconfig16(zd, ZD1201_RID_CNFRTSTHRESHOLD, val); - if (err) - return err; - return zd1201_mac_reset(zd); -} - -static int zd1201_get_rts(struct net_device *dev, struct iw_request_info *info, - struct iw_param *rts, char *extra) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - short rtst; - int err; - - err = zd1201_getconfig16(zd, ZD1201_RID_CNFRTSTHRESHOLD, &rtst); - if (err) - return err; - rts->value = rtst; - rts->disabled = (rts->value == ZD1201_RTSMAX); - rts->fixed = 1; - - return 0; -} - -static int zd1201_set_frag(struct net_device *dev, struct iw_request_info *info, - struct iw_param *frag, char *extra) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - int err; - short val = frag->value; - - if (frag->disabled || !frag->fixed) - val = ZD1201_FRAGMAX; - if (val > ZD1201_FRAGMAX) - return -EINVAL; - if (val < ZD1201_FRAGMIN) - return -EINVAL; - if (val & 1) - return -EINVAL; - err = zd1201_setconfig16(zd, ZD1201_RID_CNFFRAGTHRESHOLD, val); - if (err) - return err; - return zd1201_mac_reset(zd); -} - -static int zd1201_get_frag(struct net_device *dev, struct iw_request_info *info, - struct iw_param *frag, char *extra) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - short fragt; - int err; - - err = zd1201_getconfig16(zd, ZD1201_RID_CNFFRAGTHRESHOLD, &fragt); - if (err) - return err; - frag->value = fragt; - frag->disabled = (frag->value == ZD1201_FRAGMAX); - frag->fixed = 1; - - return 0; -} - -static int zd1201_set_retry(struct net_device *dev, - struct iw_request_info *info, struct iw_param *rrq, char *extra) -{ - return 0; -} - -static int zd1201_get_retry(struct net_device *dev, - struct iw_request_info *info, struct iw_param *rrq, char *extra) -{ - return 0; -} - -static int zd1201_set_encode(struct net_device *dev, - struct iw_request_info *info, struct iw_point *erq, char *key) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - short i; - int err, rid; - - if (erq->length > ZD1201_MAXKEYLEN) - return -EINVAL; - - i = (erq->flags & IW_ENCODE_INDEX)-1; - if (i == -1) { - err = zd1201_getconfig16(zd,ZD1201_RID_CNFDEFAULTKEYID,&i); - if (err) - return err; - } else { - err = zd1201_setconfig16(zd, ZD1201_RID_CNFDEFAULTKEYID, i); - if (err) - return err; - } - - if (i < 0 || i >= ZD1201_NUMKEYS) - return -EINVAL; - - rid = ZD1201_RID_CNFDEFAULTKEY0 + i; - err = zd1201_setconfig(zd, rid, key, erq->length, 1); - if (err) - return err; - zd->encode_keylen[i] = erq->length; - memcpy(zd->encode_keys[i], key, erq->length); - - i=0; - if (!(erq->flags & IW_ENCODE_DISABLED & IW_ENCODE_MODE)) { - i |= 0x01; - zd->encode_enabled = 1; - } else - zd->encode_enabled = 0; - if (erq->flags & IW_ENCODE_RESTRICTED & IW_ENCODE_MODE) { - i |= 0x02; - zd->encode_restricted = 1; - } else - zd->encode_restricted = 0; - err = zd1201_setconfig16(zd, ZD1201_RID_CNFWEBFLAGS, i); - if (err) - return err; - - if (zd->encode_enabled) - i = ZD1201_CNFAUTHENTICATION_SHAREDKEY; - else - i = ZD1201_CNFAUTHENTICATION_OPENSYSTEM; - err = zd1201_setconfig16(zd, ZD1201_RID_CNFAUTHENTICATION, i); - if (err) - return err; - - return zd1201_mac_reset(zd); -} - -static int zd1201_get_encode(struct net_device *dev, - struct iw_request_info *info, struct iw_point *erq, char *key) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - short i; - int err; - - if (zd->encode_enabled) - erq->flags = IW_ENCODE_ENABLED; - else - erq->flags = IW_ENCODE_DISABLED; - if (zd->encode_restricted) - erq->flags |= IW_ENCODE_RESTRICTED; - else - erq->flags |= IW_ENCODE_OPEN; - - i = (erq->flags & IW_ENCODE_INDEX) -1; - if (i == -1) { - err = zd1201_getconfig16(zd, ZD1201_RID_CNFDEFAULTKEYID, &i); - if (err) - return err; - } - if (i<0 || i>= ZD1201_NUMKEYS) - return -EINVAL; - - erq->flags |= i+1; - - erq->length = zd->encode_keylen[i]; - memcpy(key, zd->encode_keys[i], erq->length); - - return 0; -} - -static int zd1201_set_power(struct net_device *dev, - struct iw_request_info *info, struct iw_param *vwrq, char *extra) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - short enabled, duration, level; - int err; - - enabled = vwrq->disabled ? 0 : 1; - if (enabled) { - if (vwrq->flags & IW_POWER_PERIOD) { - duration = vwrq->value; - err = zd1201_setconfig16(zd, - ZD1201_RID_CNFMAXSLEEPDURATION, duration); - if (err) - return err; - goto out; - } - if (vwrq->flags & IW_POWER_TIMEOUT) { - err = zd1201_getconfig16(zd, - ZD1201_RID_CNFMAXSLEEPDURATION, &duration); - if (err) - return err; - level = vwrq->value * 4 / duration; - if (level > 4) - level = 4; - if (level < 0) - level = 0; - err = zd1201_setconfig16(zd, ZD1201_RID_CNFPMEPS, - level); - if (err) - return err; - goto out; - } - return -EINVAL; - } -out: - err = zd1201_setconfig16(zd, ZD1201_RID_CNFPMENABLED, enabled); - if (err) - return err; - - return 0; -} - -static int zd1201_get_power(struct net_device *dev, - struct iw_request_info *info, struct iw_param *vwrq, char *extra) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - short enabled, level, duration; - int err; - - err = zd1201_getconfig16(zd, ZD1201_RID_CNFPMENABLED, &enabled); - if (err) - return err; - err = zd1201_getconfig16(zd, ZD1201_RID_CNFPMEPS, &level); - if (err) - return err; - err = zd1201_getconfig16(zd, ZD1201_RID_CNFMAXSLEEPDURATION, &duration); - if (err) - return err; - vwrq->disabled = enabled ? 0 : 1; - if (vwrq->flags & IW_POWER_TYPE) { - if (vwrq->flags & IW_POWER_PERIOD) { - vwrq->value = duration; - vwrq->flags = IW_POWER_PERIOD; - } else { - vwrq->value = duration * level / 4; - vwrq->flags = IW_POWER_TIMEOUT; - } - } - if (vwrq->flags & IW_POWER_MODE) { - if (enabled && level) - vwrq->flags = IW_POWER_UNICAST_R; - else - vwrq->flags = IW_POWER_ALL_R; - } - - return 0; -} - - -static const iw_handler zd1201_iw_handler[] = -{ - (iw_handler) zd1201_config_commit, /* SIOCSIWCOMMIT */ - (iw_handler) zd1201_get_name, /* SIOCGIWNAME */ - (iw_handler) NULL, /* SIOCSIWNWID */ - (iw_handler) NULL, /* SIOCGIWNWID */ - (iw_handler) zd1201_set_freq, /* SIOCSIWFREQ */ - (iw_handler) zd1201_get_freq, /* SIOCGIWFREQ */ - (iw_handler) zd1201_set_mode, /* SIOCSIWMODE */ - (iw_handler) zd1201_get_mode, /* SIOCGIWMODE */ - (iw_handler) NULL, /* SIOCSIWSENS */ - (iw_handler) NULL, /* SIOCGIWSENS */ - (iw_handler) NULL, /* SIOCSIWRANGE */ - (iw_handler) zd1201_get_range, /* SIOCGIWRANGE */ - (iw_handler) NULL, /* SIOCSIWPRIV */ - (iw_handler) NULL, /* SIOCGIWPRIV */ - (iw_handler) NULL, /* SIOCSIWSTATS */ - (iw_handler) NULL, /* SIOCGIWSTATS */ - (iw_handler) NULL, /* SIOCSIWSPY */ - (iw_handler) NULL, /* SIOCGIWSPY */ - (iw_handler) NULL, /* -- hole -- */ - (iw_handler) NULL, /* -- hole -- */ - (iw_handler) NULL/*zd1201_set_wap*/, /* SIOCSIWAP */ - (iw_handler) zd1201_get_wap, /* SIOCGIWAP */ - (iw_handler) NULL, /* -- hole -- */ - (iw_handler) NULL, /* SIOCGIWAPLIST */ - (iw_handler) zd1201_set_scan, /* SIOCSIWSCAN */ - (iw_handler) zd1201_get_scan, /* SIOCGIWSCAN */ - (iw_handler) zd1201_set_essid, /* SIOCSIWESSID */ - (iw_handler) zd1201_get_essid, /* SIOCGIWESSID */ - (iw_handler) NULL, /* SIOCSIWNICKN */ - (iw_handler) zd1201_get_nick, /* SIOCGIWNICKN */ - (iw_handler) NULL, /* -- hole -- */ - (iw_handler) NULL, /* -- hole -- */ - (iw_handler) zd1201_set_rate, /* SIOCSIWRATE */ - (iw_handler) zd1201_get_rate, /* SIOCGIWRATE */ - (iw_handler) zd1201_set_rts, /* SIOCSIWRTS */ - (iw_handler) zd1201_get_rts, /* SIOCGIWRTS */ - (iw_handler) zd1201_set_frag, /* SIOCSIWFRAG */ - (iw_handler) zd1201_get_frag, /* SIOCGIWFRAG */ - (iw_handler) NULL, /* SIOCSIWTXPOW */ - (iw_handler) NULL, /* SIOCGIWTXPOW */ - (iw_handler) zd1201_set_retry, /* SIOCSIWRETRY */ - (iw_handler) zd1201_get_retry, /* SIOCGIWRETRY */ - (iw_handler) zd1201_set_encode, /* SIOCSIWENCODE */ - (iw_handler) zd1201_get_encode, /* SIOCGIWENCODE */ - (iw_handler) zd1201_set_power, /* SIOCSIWPOWER */ - (iw_handler) zd1201_get_power, /* SIOCGIWPOWER */ -}; - -static int zd1201_set_hostauth(struct net_device *dev, - struct iw_request_info *info, struct iw_param *rrq, char *extra) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - int err; - - if (!zd->ap) - return -EOPNOTSUPP; - - err = zd1201_setconfig16(zd, ZD1201_RID_CNFHOSTAUTH, rrq->value); - if (err) - return err; - return 0; -} - -static int zd1201_get_hostauth(struct net_device *dev, - struct iw_request_info *info, struct iw_param *rrq, char *extra) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - short hostauth; - int err; - - if (!zd->ap) - return -EOPNOTSUPP; - - err = zd1201_getconfig16(zd, ZD1201_RID_CNFHOSTAUTH, &hostauth); - if (err) - return err; - rrq->value = hostauth; - rrq->fixed = 1; - - return 0; -} - -static int zd1201_auth_sta(struct net_device *dev, - struct iw_request_info *info, struct sockaddr *sta, char *extra) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - unsigned char buffer[10]; - - if (!zd->ap) - return -EOPNOTSUPP; - - memcpy(buffer, sta->sa_data, ETH_ALEN); - *(short*)(buffer+6) = 0; /* 0==success, 1==failure */ - *(short*)(buffer+8) = 0; - - return zd1201_setconfig(zd, ZD1201_RID_AUTHENTICATESTA, buffer, 10, 1); -} - -static int zd1201_set_maxassoc(struct net_device *dev, - struct iw_request_info *info, struct iw_param *rrq, char *extra) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - int err; - - if (!zd->ap) - return -EOPNOTSUPP; - - err = zd1201_setconfig16(zd, ZD1201_RID_CNFMAXASSOCSTATIONS, rrq->value); - if (err) - return err; - return 0; -} - -static int zd1201_get_maxassoc(struct net_device *dev, - struct iw_request_info *info, struct iw_param *rrq, char *extra) -{ - struct zd1201 *zd = (struct zd1201 *)dev->priv; - short maxassoc; - int err; - - if (!zd->ap) - return -EOPNOTSUPP; - - err = zd1201_getconfig16(zd, ZD1201_RID_CNFMAXASSOCSTATIONS, &maxassoc); - if (err) - return err; - rrq->value = maxassoc; - rrq->fixed = 1; - - return 0; -} - -static const iw_handler zd1201_private_handler[] = { - (iw_handler) zd1201_set_hostauth, /* ZD1201SIWHOSTAUTH */ - (iw_handler) zd1201_get_hostauth, /* ZD1201GIWHOSTAUTH */ - (iw_handler) zd1201_auth_sta, /* ZD1201SIWAUTHSTA */ - (iw_handler) NULL, /* nothing to get */ - (iw_handler) zd1201_set_maxassoc, /* ZD1201SIMAXASSOC */ - (iw_handler) zd1201_get_maxassoc, /* ZD1201GIMAXASSOC */ -}; - -static const struct iw_priv_args zd1201_private_args[] = { - { ZD1201SIWHOSTAUTH, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, - 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, - IW_PRIV_TYPE_NONE, "authstation" }, - { ZD1201SIWMAXASSOC, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, - IW_PRIV_TYPE_NONE, "setmaxassoc" }, - { ZD1201GIWMAXASSOC, IW_PRIV_TYPE_NONE, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getmaxassoc" }, -}; - -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), - .standard = (iw_handler *)zd1201_iw_handler, - .private = (iw_handler *)zd1201_private_handler, - .private_args = (struct iw_priv_args *) zd1201_private_args, -}; - -static int zd1201_probe(struct usb_interface *interface, - const struct usb_device_id *id) -{ - struct zd1201 *zd; - struct usb_device *usb; - int i, err; - short porttype; - char buf[IW_ESSID_MAX_SIZE+2]; - - usb = interface_to_usbdev(interface); - - zd = kmalloc(sizeof(struct zd1201), GFP_KERNEL); - if (!zd) { - return -ENOMEM; - } - memset(zd, 0, sizeof(struct zd1201)); - zd->ap = ap; - zd->usb = usb; - zd->removed = 0; - init_waitqueue_head(&zd->rxdataq); - INIT_HLIST_HEAD(&zd->fraglist); - - err = zd1201_fw_upload(usb, zd->ap); - if (err) { - dev_err(&usb->dev, "zd1201 firmware upload failed: %d\n", err); - goto err_zd; - } - - zd->endp_in = 1; - zd->endp_out = 1; - zd->endp_out2 = 2; - zd->rx_urb = usb_alloc_urb(0, GFP_KERNEL); - zd->tx_urb = usb_alloc_urb(0, GFP_KERNEL); - if (!zd->rx_urb || !zd->tx_urb) - goto err_zd; - - for(i = 0; i<100; i++) - udelay(1000); - - err = zd1201_drvr_start(zd); - if (err) - goto err_zd; - - err = zd1201_setconfig16(zd, ZD1201_RID_CNFMAXDATALEN, 2312); - if (err) - goto err_start; - - err = zd1201_setconfig16(zd, ZD1201_RID_TXRATECNTL, - ZD1201_RATEB1 | ZD1201_RATEB2 | ZD1201_RATEB5 | ZD1201_RATEB11); - if (err) - goto err_start; - - zd->dev = alloc_etherdev(0); - if (!zd->dev) - goto err_start; - - zd->dev->priv = zd; - zd->dev->open = zd1201_net_open; - zd->dev->stop = zd1201_net_stop; - zd->dev->get_stats = zd1201_get_stats; - zd->dev->get_wireless_stats = zd1201_get_wireless_stats; - zd->dev->wireless_handlers = - (struct iw_handler_def *)&zd1201_iw_handlers; - zd->dev->hard_start_xmit = zd1201_hard_start_xmit; - zd->dev->watchdog_timeo = ZD1201_TX_TIMEOUT; - zd->dev->tx_timeout = zd1201_tx_timeout; - zd->dev->set_multicast_list = zd1201_set_multicast; - zd->dev->set_mac_address = zd1201_set_mac_address; - strcpy(zd->dev->name, "wlan%d"); - - err = zd1201_getconfig(zd, ZD1201_RID_CNFOWNMACADDR, - zd->dev->dev_addr, zd->dev->addr_len); - if (err) - goto err_net; - - /* Set wildcard essid to match zd->essid */ - *(__le16 *)buf = cpu_to_le16(0); - err = zd1201_setconfig(zd, ZD1201_RID_CNFDESIREDSSID, buf, - IW_ESSID_MAX_SIZE+2, 1); - if (err) - goto err_net; - - if (zd->ap) - porttype = ZD1201_PORTTYPE_AP; - else - porttype = ZD1201_PORTTYPE_BSS; - err = zd1201_setconfig16(zd, ZD1201_RID_CNFPORTTYPE, porttype); - if (err) - goto err_net; - - err = register_netdev(zd->dev); - if (err) - goto err_net; - dev_info(&usb->dev, "%s: ZD1201 USB Wireless interface\n", - zd->dev->name); - - usb_set_intfdata(interface, zd); - return 0; - -err_net: - free_netdev(zd->dev); -err_start: - /* Leave the device in reset state */ - zd1201_docmd(zd, ZD1201_CMDCODE_INIT, 0, 0, 0); -err_zd: - if (zd->tx_urb) - usb_free_urb(zd->tx_urb); - if (zd->rx_urb) - usb_free_urb(zd->rx_urb); - kfree(zd); - return err; -} - -static void zd1201_disconnect(struct usb_interface *interface) -{ - struct zd1201 *zd=(struct zd1201 *)usb_get_intfdata(interface); - struct hlist_node *node, *node2; - struct zd1201_frag *frag; - - if (!zd) - return; - usb_set_intfdata(interface, NULL); - if (zd->dev) { - unregister_netdev(zd->dev); - free_netdev(zd->dev); - } - - hlist_for_each_entry_safe(frag, node, node2, &zd->fraglist, fnode) { - hlist_del_init(&frag->fnode); - kfree_skb(frag->skb); - kfree(frag); - } - - if (zd->tx_urb) { - usb_kill_urb(zd->tx_urb); - usb_free_urb(zd->tx_urb); - } - if (zd->rx_urb) { - usb_kill_urb(zd->rx_urb); - usb_free_urb(zd->rx_urb); - } - kfree(zd); -} - -static struct usb_driver zd1201_usb = { - .owner = THIS_MODULE, - .name = "zd1201", - .probe = zd1201_probe, - .disconnect = zd1201_disconnect, - .id_table = zd1201_table, -}; - -static int __init zd1201_init(void) -{ - return usb_register(&zd1201_usb); -} - -static void __exit zd1201_cleanup(void) -{ - usb_deregister(&zd1201_usb); -} - -module_init(zd1201_init); -module_exit(zd1201_cleanup); diff --git a/drivers/usb/net/zd1201.h b/drivers/usb/net/zd1201.h deleted file mode 100644 index 1627c71e8..000000000 --- a/drivers/usb/net/zd1201.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (c) 2004, 2005 Jeroen Vreeken (pe1rxq@amsat.org) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * Parts of this driver have been derived from a wlan-ng version - * modified by ZyDAS. - * Copyright (C) 1999 AbsoluteValue Systems, Inc. All Rights Reserved. - */ - -#ifndef _INCLUDE_ZD1201_H_ -#define _INCLUDE_ZD1201_H_ - -#define ZD1201_NUMKEYS 4 -#define ZD1201_MAXKEYLEN 13 -#define ZD1201_MAXMULTI 16 -#define ZD1201_FRAGMAX 2500 -#define ZD1201_FRAGMIN 256 -#define ZD1201_RTSMAX 2500 - -#define ZD1201_RXSIZE 3000 - -struct zd1201 { - struct usb_device *usb; - int removed; - struct net_device *dev; - struct net_device_stats stats; - struct iw_statistics iwstats; - - int endp_in; - int endp_out; - int endp_out2; - struct urb *rx_urb; - struct urb *tx_urb; - - unsigned char rxdata[ZD1201_RXSIZE]; - int rxlen; - wait_queue_head_t rxdataq; - int rxdatas; - struct hlist_head fraglist; - unsigned char txdata[ZD1201_RXSIZE]; - - int ap; - char essid[IW_ESSID_MAX_SIZE+1]; - int essidlen; - int mac_enabled; - int monitor; - int encode_enabled; - int encode_restricted; - unsigned char encode_keys[ZD1201_NUMKEYS][ZD1201_MAXKEYLEN]; - int encode_keylen[ZD1201_NUMKEYS]; -}; - -struct zd1201_frag { - struct hlist_node fnode; - int seq; - struct sk_buff *skb; -}; - -#define ZD1201SIWHOSTAUTH SIOCIWFIRSTPRIV -#define ZD1201GIWHOSTAUTH ZD1201SIWHOSTAUTH+1 -#define ZD1201SIWAUTHSTA SIOCIWFIRSTPRIV+2 -#define ZD1201SIWMAXASSOC SIOCIWFIRSTPRIV+4 -#define ZD1201GIWMAXASSOC ZD1201SIWMAXASSOC+1 - -#define ZD1201_FW_TIMEOUT (1000) - -#define ZD1201_TX_TIMEOUT (2000) - -#define ZD1201_USB_CMDREQ 0 -#define ZD1201_USB_RESREQ 1 - -#define ZD1201_CMDCODE_INIT 0x00 -#define ZD1201_CMDCODE_ENABLE 0x01 -#define ZD1201_CMDCODE_DISABLE 0x02 -#define ZD1201_CMDCODE_ALLOC 0x0a -#define ZD1201_CMDCODE_INQUIRE 0x11 -#define ZD1201_CMDCODE_SETRXRID 0x17 -#define ZD1201_CMDCODE_ACCESS 0x21 - -#define ZD1201_PACKET_EVENTSTAT 0x0 -#define ZD1201_PACKET_RXDATA 0x1 -#define ZD1201_PACKET_INQUIRE 0x2 -#define ZD1201_PACKET_RESOURCE 0x3 - -#define ZD1201_ACCESSBIT 0x0100 - -#define ZD1201_RID_CNFPORTTYPE 0xfc00 -#define ZD1201_RID_CNFOWNMACADDR 0xfc01 -#define ZD1201_RID_CNFDESIREDSSID 0xfc02 -#define ZD1201_RID_CNFOWNCHANNEL 0xfc03 -#define ZD1201_RID_CNFOWNSSID 0xfc04 -#define ZD1201_RID_CNFMAXDATALEN 0xfc07 -#define ZD1201_RID_CNFPMENABLED 0xfc09 -#define ZD1201_RID_CNFPMEPS 0xfc0a -#define ZD1201_RID_CNFMAXSLEEPDURATION 0xfc0c -#define ZD1201_RID_CNFDEFAULTKEYID 0xfc23 -#define ZD1201_RID_CNFDEFAULTKEY0 0xfc24 -#define ZD1201_RID_CNFDEFAULTKEY1 0xfc25 -#define ZD1201_RID_CNFDEFAULTKEY2 0xfc26 -#define ZD1201_RID_CNFDEFAULTKEY3 0xfc27 -#define ZD1201_RID_CNFWEBFLAGS 0xfc28 -#define ZD1201_RID_CNFAUTHENTICATION 0xfc2a -#define ZD1201_RID_CNFMAXASSOCSTATIONS 0xfc2b -#define ZD1201_RID_CNFHOSTAUTH 0xfc2e -#define ZD1201_RID_CNFGROUPADDRESS 0xfc80 -#define ZD1201_RID_CNFFRAGTHRESHOLD 0xfc82 -#define ZD1201_RID_CNFRTSTHRESHOLD 0xfc83 -#define ZD1201_RID_TXRATECNTL 0xfc84 -#define ZD1201_RID_PROMISCUOUSMODE 0xfc85 -#define ZD1201_RID_CNFBASICRATES 0xfcb3 -#define ZD1201_RID_AUTHENTICATESTA 0xfce3 -#define ZD1201_RID_CURRENTBSSID 0xfd42 -#define ZD1201_RID_COMMSQUALITY 0xfd43 -#define ZD1201_RID_CURRENTTXRATE 0xfd44 -#define ZD1201_RID_CNFMAXTXBUFFERNUMBER 0xfda0 -#define ZD1201_RID_CURRENTCHANNEL 0xfdc1 - -#define ZD1201_INQ_SCANRESULTS 0xf101 - -#define ZD1201_INF_LINKSTATUS 0xf200 -#define ZD1201_INF_ASSOCSTATUS 0xf201 -#define ZD1201_INF_AUTHREQ 0xf202 - -#define ZD1201_ASSOCSTATUS_STAASSOC 0x1 -#define ZD1201_ASSOCSTATUS_REASSOC 0x2 -#define ZD1201_ASSOCSTATUS_DISASSOC 0x3 -#define ZD1201_ASSOCSTATUS_ASSOCFAIL 0x4 -#define ZD1201_ASSOCSTATUS_AUTHFAIL 0x5 - -#define ZD1201_PORTTYPE_IBSS 0 -#define ZD1201_PORTTYPE_BSS 1 -#define ZD1201_PORTTYPE_WDS 2 -#define ZD1201_PORTTYPE_PSEUDOIBSS 3 -#define ZD1201_PORTTYPE_AP 6 - -#define ZD1201_RATEB1 1 -#define ZD1201_RATEB2 2 -#define ZD1201_RATEB5 4 /* 5.5 really, but 5 is shorter :) */ -#define ZD1201_RATEB11 8 - -#define ZD1201_CNFAUTHENTICATION_OPENSYSTEM 0x0001 -#define ZD1201_CNFAUTHENTICATION_SHAREDKEY 0x0002 - -#endif /* _INCLUDE_ZD1201_H_ */ diff --git a/drivers/usb/serial/Kconfig b/drivers/usb/serial/Kconfig index 5c60be521..f5b9438c9 100644 --- a/drivers/usb/serial/Kconfig +++ b/drivers/usb/serial/Kconfig @@ -62,15 +62,6 @@ config USB_SERIAL_AIRPRIME To compile this driver as a module, choose M here: the module will be called airprime. -config USB_SERIAL_ANYDATA - tristate "USB AnyData CDMA Wireless Driver" - depends on USB_SERIAL - help - Say Y here if you want to use a AnyData CDMA device. - - To compile this driver as a module, choose M here: the - module will be called anydata. - config USB_SERIAL_ARK3116 tristate "USB ARK Micro 3116 USB Serial Driver (EXPERIMENTAL)" depends on USB_SERIAL && EXPERIMENTAL @@ -417,7 +408,7 @@ config USB_SERIAL_MCT_U232 Magic Control Technology Corp. (U232 is one of the model numbers). This driver also works with Sitecom U232-P25 and D-Link DU-H3SP USB - BAY devices. + BAY, Belkin F5U109, and Belkin F5U409 devices. To compile this driver as a module, choose M here: the module will be called mct_u232. @@ -456,6 +447,17 @@ config USB_SERIAL_SAFE_PADDED bool "USB Secure Encapsulated Driver - Padded" depends on USB_SERIAL_SAFE +config USB_SERIAL_SIERRAWIRELESS + tristate "USB Sierra Wireless Driver" + depends on USB_SERIAL + help + Say M here if you want to use a Sierra Wireless device (if + using an PC 5220 or AC580 please use the Airprime driver + instead). + + To compile this driver as a module, choose M here: the + module will be called sierra. + config USB_SERIAL_TI tristate "USB TI 3410/5052 Serial Driver" depends on USB_SERIAL @@ -491,16 +493,25 @@ config USB_SERIAL_XIRCOM module will be called keyspan_pda. config USB_SERIAL_OPTION - tristate "USB Option PCMCIA serial driver" - depends on USB_SERIAL && USB_OHCI_HCD && PCCARD + tristate "USB driver for GSM and CDMA modems" + depends on USB_SERIAL help - Say Y here if you want to use an Option card. This is a - GSM card, controlled by three serial ports which are connected - via an OHCI adapter located on a PC card. + Say Y here if you have a GSM or CDMA modem that's connected to USB. + + This driver also supports several PCMCIA cards which have a + built-in OHCI-USB adapter and an internally-connected GSM modem. + The USB bus on these cards is not accessible externally. + + Supported devices include (some of?) those made by: + Option, Huawei, Audiovox, Sierra Wireless, Novatel Wireless, or + Anydata. To compile this driver as a module, choose M here: the module will be called option. + If this driver doesn't recognize your device, + it might be accessible via the FTDI_SIO driver. + config USB_SERIAL_OMNINET tristate "USB ZyXEL omni.net LCD Plus Driver (EXPERIMENTAL)" depends on USB_SERIAL && EXPERIMENTAL diff --git a/drivers/usb/serial/Makefile b/drivers/usb/serial/Makefile index 5a0960fc9..8efed2ce1 100644 --- a/drivers/usb/serial/Makefile +++ b/drivers/usb/serial/Makefile @@ -12,7 +12,6 @@ usbserial-obj-$(CONFIG_USB_EZUSB) += ezusb.o usbserial-objs := usb-serial.o generic.o bus.o $(usbserial-obj-y) obj-$(CONFIG_USB_SERIAL_AIRPRIME) += airprime.o -obj-$(CONFIG_USB_SERIAL_ANYDATA) += anydata.o obj-$(CONFIG_USB_SERIAL_ARK3116) += ark3116.o obj-$(CONFIG_USB_SERIAL_BELKIN) += belkin_sa.o obj-$(CONFIG_USB_SERIAL_CP2101) += cp2101.o @@ -39,6 +38,7 @@ obj-$(CONFIG_USB_SERIAL_OMNINET) += omninet.o obj-$(CONFIG_USB_SERIAL_OPTION) += option.o obj-$(CONFIG_USB_SERIAL_PL2303) += pl2303.o obj-$(CONFIG_USB_SERIAL_SAFE) += safe_serial.o +obj-$(CONFIG_USB_SERIAL_SIERRAWIRELESS) += sierra.o obj-$(CONFIG_USB_SERIAL_TI) += ti_usb_3410_5052.o obj-$(CONFIG_USB_SERIAL_VISOR) += visor.o obj-$(CONFIG_USB_SERIAL_WHITEHEAT) += whiteheat.o diff --git a/drivers/usb/serial/airprime.c b/drivers/usb/serial/airprime.c index a4ce0008d..62082532a 100644 --- a/drivers/usb/serial/airprime.c +++ b/drivers/usb/serial/airprime.c @@ -13,25 +13,31 @@ #include #include #include -#include "usb-serial.h" +#include static struct usb_device_id id_table [] = { - { USB_DEVICE(0xf3d, 0x0112) }, + { USB_DEVICE(0x0c88, 0x17da) }, /* Kyocera Wireless KPC650/Passport */ + { USB_DEVICE(0xf3d, 0x0112) }, /* AirPrime CDMA Wireless PC Card */ + { USB_DEVICE(0x1410, 0x1110) }, /* Novatel Wireless Merlin CDMA */ + { USB_DEVICE(0x1199, 0x0112) }, /* Sierra Wireless Aircard 580 */ + { USB_DEVICE(0x1199, 0x0218) }, /* Sierra Wireless MC5720 */ { }, }; 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_device_type airprime_device = { - .owner = THIS_MODULE, - .name = "airprime", +static struct usb_serial_driver airprime_device = { + .driver = { + .owner = THIS_MODULE, + .name = "airprime", + }, .id_table = id_table, .num_interrupt_in = NUM_DONT_CARE, .num_bulk_in = NUM_DONT_CARE, diff --git a/drivers/usb/serial/anydata.c b/drivers/usb/serial/anydata.c deleted file mode 100644 index 343f6f228..000000000 --- a/drivers/usb/serial/anydata.c +++ /dev/null @@ -1,123 +0,0 @@ -/* - * AnyData CDMA Serial USB driver - * - * Copyright (C) 2005 Greg Kroah-Hartman - * - * 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 -#include -#include -#include -#include -#include "usb-serial.h" - -static struct usb_device_id id_table [] = { - { USB_DEVICE(0x16d5, 0x6501) }, /* AirData CDMA device */ - { }, -}; -MODULE_DEVICE_TABLE(usb, id_table); - -/* if overridden by the user, then use their value for the size of the - * read and write urbs */ -static int buffer_size; -static int debug; - -static struct usb_driver anydata_driver = { - .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) -{ - char *buffer; - int result = 0; - - dbg("%s - port %d", __FUNCTION__, port->number); - - if (buffer_size) { - /* override the default buffer sizes */ - buffer = kmalloc(buffer_size, GFP_KERNEL); - if (!buffer) { - dev_err(&port->dev, "%s - out of memory.\n", - __FUNCTION__); - return -ENOMEM; - } - kfree (port->read_urb->transfer_buffer); - port->read_urb->transfer_buffer = buffer; - port->read_urb->transfer_buffer_length = buffer_size; - - buffer = kmalloc(buffer_size, GFP_KERNEL); - if (!buffer) { - dev_err(&port->dev, "%s - out of memory.\n", - __FUNCTION__); - return -ENOMEM; - } - kfree (port->write_urb->transfer_buffer); - port->write_urb->transfer_buffer = buffer; - port->write_urb->transfer_buffer_length = buffer_size; - port->bulk_out_size = buffer_size; - } - - /* Start reading from the device */ - usb_fill_bulk_urb(port->read_urb, port->serial->dev, - usb_rcvbulkpipe(port->serial->dev, - port->bulk_in_endpointAddress), - port->read_urb->transfer_buffer, - port->read_urb->transfer_buffer_length, - usb_serial_generic_write_bulk_callback, port); - result = usb_submit_urb(port->read_urb, GFP_KERNEL); - if (result) - dev_err(&port->dev, - "%s - failed submitting read urb, error %d\n", - __FUNCTION__, result); - - return result; -} - -static struct usb_serial_driver anydata_device = { - .driver = { - .owner = THIS_MODULE, - .name = "anydata", - }, - .id_table = id_table, - .num_interrupt_in = NUM_DONT_CARE, - .num_bulk_in = NUM_DONT_CARE, - .num_bulk_out = NUM_DONT_CARE, - .num_ports = 1, - .open = anydata_open, -}; - -static int __init anydata_init(void) -{ - int retval; - - retval = usb_serial_register(&anydata_device); - if (retval) - return retval; - retval = usb_register(&anydata_driver); - if (retval) - usb_serial_deregister(&anydata_device); - return retval; -} - -static void __exit anydata_exit(void) -{ - usb_deregister(&anydata_driver); - usb_serial_deregister(&anydata_device); -} - -module_init(anydata_init); -module_exit(anydata_exit); -MODULE_LICENSE("GPL"); - -module_param(debug, bool, S_IRUGO | S_IWUSR); -MODULE_PARM_DESC(debug, "Debug enabled or not"); -module_param(buffer_size, int, 0); -MODULE_PARM_DESC(buffer_size, "Size of the transfer buffers"); diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c index 8dec79622..970d9ef0a 100644 --- a/drivers/usb/serial/ark3116.c +++ b/drivers/usb/serial/ark3116.c @@ -21,7 +21,7 @@ #include #include #include -#include "usb-serial.h" +#include static int debug; diff --git a/drivers/usb/serial/belkin_sa.c b/drivers/usb/serial/belkin_sa.c index 4144777ea..70ece9e01 100644 --- a/drivers/usb/serial/belkin_sa.c +++ b/drivers/usb/serial/belkin_sa.c @@ -63,7 +63,6 @@ * UsbSnoop on Windows2000 and from examining the other USB drivers. */ -#include #include #include #include @@ -75,7 +74,7 @@ #include #include #include -#include "usb-serial.h" +#include #include "belkin_sa.h" static int debug; diff --git a/drivers/usb/serial/bus.c b/drivers/usb/serial/bus.c index e9f9f4baf..6542f2204 100644 --- a/drivers/usb/serial/bus.c +++ b/drivers/usb/serial/bus.c @@ -8,13 +8,12 @@ * 2 as published by the Free Software Foundation. */ -#include #include #include #include #include #include -#include "usb-serial.h" +#include static int usb_serial_device_match (struct device *dev, struct device_driver *drv) { diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c index 8023bb727..3a9073dbf 100644 --- a/drivers/usb/serial/console.c +++ b/drivers/usb/serial/console.c @@ -11,18 +11,16 @@ * */ -#include #include #include #include #include #include #include +#include static int debug; -#include "usb-serial.h" - struct usbcons_info { int magic; int break_flag; @@ -202,7 +200,7 @@ static void usb_console_write(struct console *co, const char *buf, unsigned coun struct usb_serial *serial; int retval = -ENODEV; - if (!port) + if (!port || port->serial->dev->state == USB_STATE_NOTATTACHED) return; serial = port->serial; @@ -213,17 +211,38 @@ static void usb_console_write(struct console *co, const char *buf, unsigned coun if (!port->open_count) { dbg ("%s - port not opened", __FUNCTION__); - goto exit; + return; } - /* pass on to the driver specific version of this function if it is available */ - if (serial->type->write) - retval = serial->type->write(port, buf, count); - else - retval = usb_serial_generic_write(port, buf, count); - -exit: - dbg("%s - return value (if we had one): %d", __FUNCTION__, retval); + while (count) { + unsigned int i; + unsigned int lf; + /* search for LF so we can insert CR if necessary */ + for (i=0, lf=0 ; i < count ; i++) { + if (*(buf + i) == 10) { + lf = 1; + i++; + break; + } + } + /* pass on to the driver specific version of this function if it is available */ + if (serial->type->write) + retval = serial->type->write(port, buf, i); + else + retval = usb_serial_generic_write(port, buf, i); + dbg("%s - return value : %d", __FUNCTION__, retval); + if (lf) { + /* append CR after LF */ + unsigned char cr = 13; + if (serial->type->write) + retval = serial->type->write(port, &cr, 1); + else + retval = usb_serial_generic_write(port, &cr, 1); + dbg("%s - return value : %d", __FUNCTION__, retval); + } + buf += i; + count -= i; + } } static struct console usbcons = { @@ -234,6 +253,14 @@ static struct console usbcons = { .index = -1, }; +void usb_serial_console_disconnect(struct usb_serial *serial) +{ + if (serial && serial->port && serial->port[0] && serial->port[0] == usbcons_info.port) { + usb_serial_console_exit(); + usb_serial_put(serial); + } +} + void usb_serial_console_init (int serial_debug, int minor) { debug = serial_debug; @@ -259,6 +286,11 @@ void usb_serial_console_init (int serial_debug, int minor) void usb_serial_console_exit (void) { - unregister_console(&usbcons); + if (usbcons_info.port) { + unregister_console(&usbcons); + if (usbcons_info.port->open_count) + usbcons_info.port->open_count--; + usbcons_info.port = NULL; + } } diff --git a/drivers/usb/serial/cp2101.c b/drivers/usb/serial/cp2101.c index 4ace9964f..486c7411b 100644 --- a/drivers/usb/serial/cp2101.c +++ b/drivers/usb/serial/cp2101.c @@ -17,7 +17,6 @@ * */ -#include #include #include #include @@ -27,12 +26,12 @@ #include #include #include -#include "usb-serial.h" +#include /* * Version Information */ -#define DRIVER_VERSION "v0.04" +#define DRIVER_VERSION "v0.07" #define DRIVER_DESC "Silicon Labs CP2101/CP2102 RS232 serial adaptor driver" /* @@ -54,25 +53,37 @@ static void cp2101_shutdown(struct usb_serial*); static int debug; static struct usb_device_id id_table [] = { - { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ - { USB_DEVICE(0x10C4, 0x80CA) }, /* Degree Controls Inc */ - { USB_DEVICE(0x10AB, 0x10C5) }, /* Siemens MC60 Cable */ + { USB_DEVICE(0x0FCF, 0x1003) }, /* Dynastream ANT development board */ + { USB_DEVICE(0x10A6, 0xAA26) }, /* Knock-off DCU-11 cable */ + { USB_DEVICE(0x10AB, 0x10C5) }, /* Siemens MC60 Cable */ + { USB_DEVICE(0x10B5, 0xAC70) }, /* Nokia CA-42 USB */ + { USB_DEVICE(0x10C4, 0x803B) }, /* Pololu USB-serial converter */ + { USB_DEVICE(0x10C4, 0x8066) }, /* Argussoft In-System Programmer */ + { USB_DEVICE(0x10C4, 0x807A) }, /* Crumb128 board */ + { USB_DEVICE(0x10C4, 0x80CA) }, /* Degree Controls Inc */ + { USB_DEVICE(0x10C4, 0x80F6) }, /* Suunto sports instrument */ + { USB_DEVICE(0x10C4, 0x813D) }, /* Burnside Telecom Deskmobile */ + { USB_DEVICE(0x10C4, 0x815E) }, /* Helicomm IP-Link 1220-DVM */ + { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ + { USB_DEVICE(0x16D6, 0x0001) }, /* Jablotron serial interface */ { } /* Terminating Entry */ }; MODULE_DEVICE_TABLE (usb, id_table); static struct usb_driver cp2101_driver = { - .owner = THIS_MODULE, - .name = "CP2101", + .name = "cp2101", .probe = usb_serial_probe, .disconnect = usb_serial_disconnect, .id_table = id_table, + .no_dynamic_id = 1, }; -static struct usb_serial_device_type cp2101_device = { - .owner = THIS_MODULE, - .name = "CP2101", +static struct usb_serial_driver cp2101_device = { + .driver = { + .owner = THIS_MODULE, + .name = "cp2101", + }, .id_table = id_table, .num_interrupt_in = 0, .num_bulk_in = 0, @@ -159,9 +170,7 @@ static int cp2101_get_config(struct usb_serial_port* port, u8 request, /* Number of integers required to contain the array */ length = (((size - 1) | 3) + 1)/4; - buf = kmalloc (length * sizeof(u32), GFP_KERNEL); - memset(buf, 0, length * sizeof(u32)); - + buf = kcalloc(length, sizeof(u32), GFP_KERNEL); if (!buf) { dev_err(&port->dev, "%s - out of memory.\n", __FUNCTION__); return -ENOMEM; diff --git a/drivers/usb/serial/cyberjack.c b/drivers/usb/serial/cyberjack.c index 2357b1d10..d954ec34b 100644 --- a/drivers/usb/serial/cyberjack.c +++ b/drivers/usb/serial/cyberjack.c @@ -28,7 +28,6 @@ */ -#include #include #include #include @@ -40,7 +39,7 @@ #include #include #include -#include "usb-serial.h" +#include #define CYBERJACK_LOCAL_BUF_SIZE 32 @@ -215,14 +214,14 @@ static int cyberjack_write (struct usb_serial_port *port, const unsigned char *b return (0); } - spin_lock(&port->lock); + spin_lock_bh(&port->lock); if (port->write_urb_busy) { - spin_unlock(&port->lock); + spin_unlock_bh(&port->lock); dbg("%s - already writing", __FUNCTION__); return 0; } port->write_urb_busy = 1; - spin_unlock(&port->lock); + spin_unlock_bh(&port->lock); spin_lock_irqsave(&priv->lock, flags); @@ -469,7 +468,7 @@ static void cyberjack_write_bulk_callback (struct urb *urb, struct pt_regs *regs exit: spin_unlock(&priv->lock); - schedule_work(&port->work); + usb_serial_port_softint(port); } static int __init cyberjack_init (void) diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c index 7212fbe3b..ee70fddca 100644 --- a/drivers/usb/serial/cypress_m8.c +++ b/drivers/usb/serial/cypress_m8.c @@ -48,7 +48,6 @@ /* Code originates and was built up from ftdi_sio, belkin, pl2303 and others. */ -#include #include #include #include @@ -60,11 +59,11 @@ #include #include #include +#include #include #include #include -#include "usb-serial.h" #include "cypress_m8.h" @@ -824,7 +823,7 @@ send: priv->bytes_out += count; /* do not count the line control and size bytes */ spin_unlock_irqrestore(&priv->lock, flags); - schedule_work(&port->work); + usb_serial_port_softint(port); } /* cypress_send */ diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c index b3f776a90..9b225183f 100644 --- a/drivers/usb/serial/digi_acceleport.c +++ b/drivers/usb/serial/digi_acceleport.c @@ -233,7 +233,6 @@ * $Id: digi_acceleport.c,v 1.80.1.2 2000/11/02 05:45:08 root Exp $ */ -#include #include #include #include @@ -247,7 +246,7 @@ #include #include #include -#include "usb-serial.h" +#include /* Defines */ diff --git a/drivers/usb/serial/empeg.c b/drivers/usb/serial/empeg.c index 63f7c78a1..daafe405d 100644 --- a/drivers/usb/serial/empeg.c +++ b/drivers/usb/serial/empeg.c @@ -51,7 +51,6 @@ * */ -#include #include #include #include @@ -63,7 +62,7 @@ #include #include #include -#include "usb-serial.h" +#include static int debug; @@ -335,7 +334,7 @@ static void empeg_write_bulk_callback (struct urb *urb, struct pt_regs *regs) return; } - schedule_work(&port->work); + usb_serial_port_softint(port); } diff --git a/drivers/usb/serial/ezusb.c b/drivers/usb/serial/ezusb.c index 1e419c8d7..5169c2d15 100644 --- a/drivers/usb/serial/ezusb.c +++ b/drivers/usb/serial/ezusb.c @@ -8,7 +8,6 @@ * 2 as published by the Free Software Foundation. */ -#include #include #include #include @@ -16,7 +15,7 @@ #include #include #include -#include "usb-serial.h" +#include /* EZ-USB Control and Status Register. Bit 0 controls 8051 reset */ #define CPUCS_REG 0x7F92 diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index ad9ddecf1..c6115aa1b 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c @@ -245,7 +245,6 @@ /* to talk to the device */ /* Thanx to gkh and the rest of the usb dev group for all code I have assimilated :-) */ -#include #include #include #include @@ -258,7 +257,7 @@ #include #include #include -#include "usb-serial.h" +#include #include "ftdi_sio.h" /* @@ -307,6 +306,8 @@ static struct ftdi_sio_quirk ftdi_HE_TIRA1_quirk = { static struct usb_device_id id_table_combined [] = { + { USB_DEVICE(FTDI_VID, FTDI_AMC232_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) }, { USB_DEVICE(FTDI_VID, FTDI_ACTZWAVE_PID) }, { USB_DEVICE(FTDI_VID, FTDI_IRTRANS_PID) }, { USB_DEVICE(FTDI_VID, FTDI_IPLUS_PID) }, @@ -314,6 +315,7 @@ static struct usb_device_id id_table_combined [] = { { USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) }, { USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_PID) }, { USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) }, { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) }, { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) }, { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) }, @@ -337,6 +339,7 @@ static struct usb_device_id id_table_combined [] = { { USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) }, { USB_DEVICE(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID) }, { USB_DEVICE(FTDI_VID, FTDI_PIEGROUP_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_TNC_X_PID) }, { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2101_PID) }, { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2102_PID) }, { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2103_PID) }, @@ -500,6 +503,10 @@ static struct usb_device_id id_table_combined [] = { { USB_DEVICE(ICOM_ID1_VID, ICOM_ID1_PID) }, { USB_DEVICE(PAPOUCH_VID, PAPOUCH_TMU_PID) }, { USB_DEVICE(FTDI_VID, FTDI_ACG_HFDUAL_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_YEI_SERVOCENTER31_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_THORLABS_PID) }, + { USB_DEVICE(TESTO_VID, TESTO_USB_INTERFACE_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_GAMMA_SCOUT_PID) }, { }, /* Optional parameter entry */ { } /* Terminating entry */ }; @@ -548,6 +555,7 @@ struct ftdi_private { spinlock_t rx_lock; /* spinlock for receive state */ struct work_struct rx_work; int rx_processed; + unsigned long rx_bytes; __u16 interface; /* FT2232C port interface (0 for FT232/245) */ @@ -555,6 +563,7 @@ struct ftdi_private { int force_rtscts; /* if non-zero, force RTS-CTS to always be enabled */ spinlock_t tx_lock; /* spinlock for transmit state */ + unsigned long tx_bytes; unsigned long tx_outstanding_bytes; unsigned long tx_outstanding_urbs; }; @@ -1269,7 +1278,6 @@ static void ftdi_shutdown (struct usb_serial *serial) static int ftdi_open (struct usb_serial_port *port, struct file *filp) { /* ftdi_open */ - struct termios tmp_termios; struct usb_device *dev = port->serial->dev; struct ftdi_private *priv = usb_get_serial_port_data(port); unsigned long flags; @@ -1279,8 +1287,15 @@ static int ftdi_open (struct usb_serial_port *port, struct file *filp) dbg("%s", __FUNCTION__); + spin_lock_irqsave(&priv->tx_lock, flags); + priv->tx_bytes = 0; + spin_unlock_irqrestore(&priv->tx_lock, flags); + spin_lock_irqsave(&priv->rx_lock, flags); + priv->rx_bytes = 0; + spin_unlock_irqrestore(&priv->rx_lock, flags); - port->tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1 : 0; + if (port->tty) + port->tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1 : 0; /* No error checking for this (will get errors later anyway) */ /* See ftdi_sio.h for description of what is reset */ @@ -1294,7 +1309,8 @@ static int ftdi_open (struct usb_serial_port *port, struct file *filp) This is same behaviour as serial.c/rs_open() - Kuba */ /* ftdi_set_termios will send usb control messages */ - ftdi_set_termios(port, &tmp_termios); + if (port->tty) + ftdi_set_termios(port, NULL); /* FIXME: Flow control might be enabled, so it should be checked - we have no control of defaults! */ @@ -1465,6 +1481,7 @@ static int ftdi_write (struct usb_serial_port *port, spin_lock_irqsave(&priv->tx_lock, flags); ++priv->tx_outstanding_urbs; priv->tx_outstanding_bytes += count; + priv->tx_bytes += count; spin_unlock_irqrestore(&priv->tx_lock, flags); } @@ -1514,7 +1531,7 @@ static void ftdi_write_bulk_callback (struct urb *urb, struct pt_regs *regs) priv->tx_outstanding_bytes -= countback; spin_unlock_irqrestore(&priv->tx_lock, flags); - schedule_work(&port->work); + usb_serial_port_softint(port); } /* ftdi_write_bulk_callback */ @@ -1567,6 +1584,8 @@ static void ftdi_read_bulk_callback (struct urb *urb, struct pt_regs *regs) struct usb_serial_port *port = (struct usb_serial_port *)urb->context; struct tty_struct *tty; struct ftdi_private *priv; + unsigned long countread; + unsigned long flags; if (urb->number_of_packets > 0) { err("%s transfer_buffer_length %d actual_length %d number of packets %d",__FUNCTION__, @@ -1601,6 +1620,13 @@ static void ftdi_read_bulk_callback (struct urb *urb, struct pt_regs *regs) return; } + /* count data bytes, but not status bytes */ + countread = urb->actual_length; + countread -= 2 * ((countread + (PKTSZ - 1)) / PKTSZ); + spin_lock_irqsave(&priv->rx_lock, flags); + priv->rx_bytes += countread; + spin_unlock_irqrestore(&priv->rx_lock, flags); + ftdi_process_read(port); } /* ftdi_read_bulk_callback */ @@ -1925,7 +1951,7 @@ static void ftdi_set_termios (struct usb_serial_port *port, struct termios *old_ err("%s urb failed to set baudrate", __FUNCTION__); } /* Ensure RTS and DTR are raised when baudrate changed from 0 */ - if ((old_termios->c_cflag & CBAUD) == B0) { + if (!old_termios || (old_termios->c_cflag & CBAUD) == B0) { set_mctrl(port, TIOCM_DTR | TIOCM_RTS); } } diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h index d69a917e7..77299996f 100644 --- a/drivers/usb/serial/ftdi_sio.h +++ b/drivers/usb/serial/ftdi_sio.h @@ -32,10 +32,19 @@ #define FTDI_NF_RIC_PID 0x0001 /* Product Id */ +/* www.canusb.com Lawicel CANUSB device */ +#define FTDI_CANUSB_PID 0xFFA8 /* Product Id */ + +/* AlphaMicro Components AMC-232USB01 device */ +#define FTDI_AMC232_PID 0xFF00 /* Product Id */ + /* ACT Solutions HomePro ZWave interface (http://www.act-solutions.com/HomePro.htm) */ #define FTDI_ACTZWAVE_PID 0xF2D0 +/* www.starting-point-systems.com µChameleon device */ +#define FTDI_MICRO_CHAMELEON_PID 0xCAA0 /* Product Id */ + /* www.irtrans.de device */ #define FTDI_IRTRANS_PID 0xFC60 /* Product Id */ @@ -179,6 +188,10 @@ /* http://home.earthlink.net/~jrhees/USBUIRT/index.htm */ #define FTDI_USB_UIRT_PID 0xF850 /* Product Id */ +/* TNC-X USB-to-packet-radio adapter, versions prior to 3.0 (DLP module) */ + +#define FTDI_TNC_X_PID 0xEBE0 + /* * ELV USB devices submitted by Christian Abt of ELV (www.elv.de). * All of these devices use FTDI's vendor ID (0x0403). @@ -436,6 +449,29 @@ */ #define FTDI_ACG_HFDUAL_PID 0xDD20 /* HF Dual ISO Reader (RFID) */ +/* + * Yost Engineering, Inc. products (www.yostengineering.com). + * PID 0xE050 submitted by Aaron Prose. + */ +#define FTDI_YEI_SERVOCENTER31_PID 0xE050 /* YEI ServoCenter3.1 USB */ + +/* + * ThorLabs USB motor drivers + */ +#define FTDI_THORLABS_PID 0xfaf0 /* ThorLabs USB motor drivers */ + +/* + * Testo products (http://www.testo.com/) + * Submitted by Colin Leroy + */ +#define TESTO_VID 0x128D +#define TESTO_USB_INTERFACE_PID 0x0001 + +/* + * Gamma Scout (http://gamma-scout.com/). Submitted by rsc@runtux.com. + */ +#define FTDI_GAMMA_SCOUT_PID 0xD678 /* Gamma Scout online */ + /* Commands */ #define FTDI_SIO_RESET 0 /* Reset the port */ #define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */ diff --git a/drivers/usb/serial/funsoft.c b/drivers/usb/serial/funsoft.c index 803721b97..77b977206 100644 --- a/drivers/usb/serial/funsoft.c +++ b/drivers/usb/serial/funsoft.c @@ -13,7 +13,7 @@ #include #include #include -#include "usb-serial.h" +#include static struct usb_device_id id_table [] = { { USB_DEVICE(0x1404, 0xcddc) }, diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c index 2ef614d5c..727852634 100644 --- a/drivers/usb/serial/garmin_gps.c +++ b/drivers/usb/serial/garmin_gps.c @@ -23,7 +23,6 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA */ -#include #include #include #include @@ -36,6 +35,7 @@ #include #include #include +#include /* the mode to be set when the port ist opened */ static int initial_mode = 1; @@ -43,8 +43,6 @@ static int initial_mode = 1; /* debug flag */ static int debug = 0; -#include "usb-serial.h" - #define GARMIN_VENDOR_ID 0x091E /* @@ -222,11 +220,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, }; @@ -275,23 +273,14 @@ static void send_to_tty(struct usb_serial_port *port, char *data, unsigned int actual_length) { struct tty_struct *tty = port->tty; - int i; if (tty && actual_length) { usb_serial_debug_data(debug, &port->dev, __FUNCTION__, actual_length, data); - for (i = 0; i < actual_length ; ++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); - } - /* this doesn't actually push the data through unless - tty->low_latency is set */ - tty_insert_flip_char(tty, data[i], 0); - } + tty_buffer_request_room(tty, actual_length); + tty_insert_flip_string(tty, data, actual_length); tty_flip_buffer_push(tty); } } @@ -1021,7 +1010,7 @@ static void garmin_write_bulk_callback (struct urb *urb, struct pt_regs *regs) garmin_data_p->flags |= CLEAR_HALT_REQUIRED; } - schedule_work(&port->work); + usb_serial_port_softint(port); } @@ -1431,12 +1420,11 @@ static int garmin_attach (struct usb_serial *serial) dbg("%s", __FUNCTION__); - garmin_data_p = kmalloc (sizeof(struct garmin_data), GFP_KERNEL); + garmin_data_p = kzalloc(sizeof(struct garmin_data), GFP_KERNEL); if (garmin_data_p == NULL) { dev_err(&port->dev, "%s - Out of memory\n", __FUNCTION__); return -ENOMEM; } - memset (garmin_data_p, 0, sizeof(struct garmin_data)); init_timer(&garmin_data_p->timer); spin_lock_init(&garmin_data_p->lock); INIT_LIST_HEAD(&garmin_data_p->pktlist); @@ -1468,16 +1456,13 @@ static void garmin_shutdown (struct usb_serial *serial) } - - - - - /* All of the device info needed */ -static struct usb_serial_device_type garmin_device = { - .owner = THIS_MODULE, - .name = "Garmin GPS usb/tty", - .short_name = "garmin_gps", +static struct usb_serial_driver garmin_device = { + .driver = { + .owner = THIS_MODULE, + .name = "garmin_gps", + }, + .description = "Garmin GPS usb/tty", .id_table = id_table, .num_interrupt_in = 1, .num_bulk_in = 1, diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c index c62cc2876..21cbaa0fb 100644 --- a/drivers/usb/serial/generic.c +++ b/drivers/usb/serial/generic.c @@ -9,7 +9,6 @@ * */ -#include #include #include #include @@ -18,8 +17,8 @@ #include #include #include +#include #include -#include "usb-serial.h" static int debug; @@ -176,14 +175,14 @@ int usb_serial_generic_write(struct usb_serial_port *port, const unsigned char * /* only do something if we have a bulk out endpoint */ if (serial->num_bulk_out) { - spin_lock(&port->lock); + spin_lock_bh(&port->lock); if (port->write_urb_busy) { - spin_unlock(&port->lock); + spin_unlock_bh(&port->lock); dbg("%s - already writing", __FUNCTION__); return 0; } port->write_urb_busy = 1; - spin_unlock(&port->lock); + spin_unlock_bh(&port->lock); count = (count > port->bulk_out_size) ? port->bulk_out_size : count; @@ -286,6 +285,7 @@ void usb_serial_generic_read_bulk_callback (struct urb *urb, struct pt_regs *reg if (result) dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result); } +EXPORT_SYMBOL_GPL(usb_serial_generic_read_bulk_callback); void usb_serial_generic_write_bulk_callback (struct urb *urb, struct pt_regs *regs) { @@ -299,9 +299,7 @@ void usb_serial_generic_write_bulk_callback (struct urb *urb, struct pt_regs *re return; } - usb_serial_port_softint((void *)port); - - schedule_work(&port->work); + usb_serial_port_softint(port); } EXPORT_SYMBOL_GPL(usb_serial_generic_write_bulk_callback); diff --git a/drivers/usb/serial/hp4x.c b/drivers/usb/serial/hp4x.c index 64d55fbd2..ebcac701b 100644 --- a/drivers/usb/serial/hp4x.c +++ b/drivers/usb/serial/hp4x.c @@ -12,13 +12,12 @@ * See Documentation/usb/usb-serial.txt for more information on using this driver */ -#include #include #include #include #include #include -#include "usb-serial.h" +#include /* * Version Information @@ -37,16 +36,18 @@ static struct usb_device_id id_table [] = { MODULE_DEVICE_TABLE(usb, id_table); static struct usb_driver hp49gp_driver = { - .owner = THIS_MODULE, - .name = "HP4X", + .name = "hp4X", .probe = usb_serial_probe, .disconnect = usb_serial_disconnect, .id_table = id_table, + .no_dynamic_id = 1, }; -static struct usb_serial_device_type hp49gp_device = { - .owner = THIS_MODULE, - .name = "HP4X", +static struct usb_serial_driver hp49gp_device = { + .driver = { + .owner = THIS_MODULE, + .name = "hp4X", + }, .id_table = id_table, .num_interrupt_in = NUM_DONT_CARE, .num_bulk_in = NUM_DONT_CARE, diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c index b606c5968..c49976c3a 100644 --- a/drivers/usb/serial/io_edgeport.c +++ b/drivers/usb/serial/io_edgeport.c @@ -29,7 +29,6 @@ * */ -#include #include #include #include @@ -45,7 +44,7 @@ #include #include #include -#include "usb-serial.h" +#include #include "io_edgeport.h" #include "io_ionsp.h" /* info for the iosp messages */ #include "io_16654.h" /* 16654 UART defines */ @@ -142,7 +141,7 @@ struct edgeport_port { /* This structure holds all of the individual device information */ struct edgeport_serial { - char name[MAX_NAME_LEN+1]; /* string name of this device */ + char name[MAX_NAME_LEN+2]; /* string name of this device */ struct edge_manuf_descriptor manuf_descriptor; /* the manufacturer descriptor */ struct edge_boot_descriptor boot_descriptor; /* the boot firmware descriptor */ @@ -270,7 +269,7 @@ static void get_manufacturing_desc (struct edgeport_serial *edge_serial); static void get_boot_desc (struct edgeport_serial *edge_serial); static void load_application_firmware (struct edgeport_serial *edge_serial); -static void unicode_to_ascii (char *string, __le16 *unicode, int unicode_size); +static void unicode_to_ascii(char *string, int buflen, __le16 *unicode, int unicode_size); // ************************************************************************ @@ -373,7 +372,7 @@ static void update_edgeport_E2PROM (struct edgeport_serial *edge_serial) * Get string descriptor from device * * * ************************************************************************/ -static int get_string (struct usb_device *dev, int Id, char *string) +static int get_string (struct usb_device *dev, int Id, char *string, int buflen) { struct usb_string_descriptor StringDesc; struct usb_string_descriptor *pStringDesc; @@ -395,7 +394,7 @@ static int get_string (struct usb_device *dev, int Id, char *string) return 0; } - unicode_to_ascii(string, pStringDesc->wData, pStringDesc->bLength/2-1); + unicode_to_ascii(string, buflen, pStringDesc->wData, pStringDesc->bLength/2); kfree(pStringDesc); return strlen(string); @@ -2564,16 +2563,20 @@ static void change_port_settings (struct edgeport_port *edge_port, struct termio * ASCII range, but it's only for debugging... * NOTE: expects the unicode in LE format ****************************************************************************/ -static void unicode_to_ascii (char *string, __le16 *unicode, int unicode_size) +static void unicode_to_ascii(char *string, int buflen, __le16 *unicode, int unicode_size) { int i; - if (unicode_size <= 0) + if (buflen <= 0) /* never happens, but... */ return; + --buflen; /* space for nul */ - for (i = 0; i < unicode_size; ++i) + for (i = 0; i < unicode_size; i++) { + if (i >= buflen) + break; string[i] = (char)(le16_to_cpu(unicode[i])); - string[unicode_size] = 0x00; + } + string[i] = 0x00; } @@ -2603,11 +2606,17 @@ static void get_manufacturing_desc (struct edgeport_serial *edge_serial) dbg(" BoardRev: %d", edge_serial->manuf_descriptor.BoardRev); dbg(" NumPorts: %d", edge_serial->manuf_descriptor.NumPorts); dbg(" DescDate: %d/%d/%d", edge_serial->manuf_descriptor.DescDate[0], edge_serial->manuf_descriptor.DescDate[1], edge_serial->manuf_descriptor.DescDate[2]+1900); - unicode_to_ascii (string, edge_serial->manuf_descriptor.SerialNumber, edge_serial->manuf_descriptor.SerNumLength/2-1); + unicode_to_ascii(string, sizeof(string), + edge_serial->manuf_descriptor.SerialNumber, + edge_serial->manuf_descriptor.SerNumLength/2); dbg(" SerialNumber: %s", string); - unicode_to_ascii (string, edge_serial->manuf_descriptor.AssemblyNumber, edge_serial->manuf_descriptor.AssemblyNumLength/2-1); + unicode_to_ascii(string, sizeof(string), + edge_serial->manuf_descriptor.AssemblyNumber, + edge_serial->manuf_descriptor.AssemblyNumLength/2); dbg(" AssemblyNumber: %s", string); - unicode_to_ascii (string, edge_serial->manuf_descriptor.OemAssyNumber, edge_serial->manuf_descriptor.OemAssyNumLength/2-1); + unicode_to_ascii(string, sizeof(string), + edge_serial->manuf_descriptor.OemAssyNumber, + edge_serial->manuf_descriptor.OemAssyNumLength/2); dbg(" OemAssyNumber: %s", string); dbg(" UartType: %d", edge_serial->manuf_descriptor.UartType); dbg(" IonPid: %d", edge_serial->manuf_descriptor.IonPid); @@ -2720,7 +2729,7 @@ static int edge_startup (struct usb_serial *serial) struct edgeport_serial *edge_serial; struct edgeport_port *edge_port; struct usb_device *dev; - int i; + int i, j; dev = serial->dev; @@ -2735,11 +2744,11 @@ static int edge_startup (struct usb_serial *serial) usb_set_serial_data(serial, edge_serial); /* get the name for the device from the device */ - if ( (i = get_string(dev, dev->descriptor.iManufacturer, &edge_serial->name[0])) != 0) { - edge_serial->name[i-1] = ' '; - } - - get_string(dev, dev->descriptor.iProduct, &edge_serial->name[i]); + i = get_string(dev, dev->descriptor.iManufacturer, + &edge_serial->name[0], MAX_NAME_LEN+1); + edge_serial->name[i++] = ' '; + get_string(dev, dev->descriptor.iProduct, + &edge_serial->name[i], MAX_NAME_LEN+2 - i); dev_info(&serial->dev->dev, "%s detected\n", edge_serial->name); @@ -2784,6 +2793,10 @@ static int edge_startup (struct usb_serial *serial) edge_port = kmalloc (sizeof(struct edgeport_port), GFP_KERNEL); if (edge_port == NULL) { dev_err(&serial->dev->dev, "%s - Out of memory\n", __FUNCTION__); + for (j = 0; j < i; ++j) { + kfree (usb_get_serial_port_data(serial->port[j])); + usb_set_serial_port_data(serial->port[j], NULL); + } usb_set_serial_data(serial, NULL); kfree(edge_serial); return -ENOMEM; diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c index 8e1e22537..17c5b1d23 100644 --- a/drivers/usb/serial/io_ti.c +++ b/drivers/usb/serial/io_ti.c @@ -24,7 +24,6 @@ * */ -#include #include #include #include @@ -40,8 +39,8 @@ #include #include #include +#include -#include "usb-serial.h" #include "io_16654.h" #include "io_usbvend.h" #include "io_ti.h" diff --git a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c index 9a5c97989..9840bade7 100644 --- a/drivers/usb/serial/ipaq.c +++ b/drivers/usb/serial/ipaq.c @@ -44,7 +44,6 @@ * Thanks to info from Heath Robinson and Arieh Davidoff. */ -#include #include #include #include @@ -56,7 +55,7 @@ #include #include #include -#include "usb-serial.h" +#include #include "ipaq.h" #define KP_RETRIES 100 @@ -71,6 +70,8 @@ static __u16 product, vendor; static int debug; +static int connect_retries = KP_RETRIES; +static int initial_wait; /* Function prototypes for an ipaq */ static int ipaq_open (struct usb_serial_port *port, struct file *filp); @@ -249,6 +250,9 @@ static struct usb_device_id ipaq_id_table [] = { { USB_DEVICE(0x04C5, 0x1058) }, /* FUJITSU USB Sync */ { USB_DEVICE(0x04C5, 0x1079) }, /* FUJITSU USB Sync */ { USB_DEVICE(0x04DA, 0x2500) }, /* Panasonic USB Sync */ + { USB_DEVICE(0x04DD, 0x9102) }, /* SHARP WS003SH USB Modem */ + { USB_DEVICE(0x04DD, 0x9121) }, /* SHARP WS004SH USB Modem */ + { USB_DEVICE(0x04DD, 0x9123) }, /* SHARP WS007SH USB Modem */ { USB_DEVICE(0x04E8, 0x5F00) }, /* Samsung NEXiO USB Sync */ { USB_DEVICE(0x04E8, 0x5F01) }, /* Samsung NEXiO USB Sync */ { USB_DEVICE(0x04E8, 0x5F02) }, /* Samsung NEXiO USB Sync */ @@ -583,7 +587,7 @@ static int ipaq_open(struct usb_serial_port *port, struct file *filp) struct ipaq_private *priv; struct ipaq_packet *pkt; int i, result = 0; - int retries = KP_RETRIES; + int retries = connect_retries; dbg("%s - port %d", __FUNCTION__, port->number); @@ -647,16 +651,12 @@ static int ipaq_open(struct usb_serial_port *port, struct file *filp) port->read_urb->transfer_buffer_length = URBDATA_SIZE; port->bulk_out_size = port->write_urb->transfer_buffer_length = URBDATA_SIZE; + msleep(1000*initial_wait); /* Start reading from the device */ usb_fill_bulk_urb(port->read_urb, serial->dev, usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress), port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length, ipaq_read_bulk_callback, port); - result = usb_submit_urb(port->read_urb, GFP_KERNEL); - if (result) { - err("%s - failed submitting read urb, error %d", __FUNCTION__, result); - goto error; - } /* * Send out control message observed in win98 sniffs. Not sure what @@ -671,8 +671,14 @@ static int ipaq_open(struct usb_serial_port *port, struct file *filp) usb_sndctrlpipe(serial->dev, 0), 0x22, 0x21, 0x1, 0, NULL, 0, 100); if (result == 0) { + result = usb_submit_urb(port->read_urb, GFP_KERNEL); + if (result) { + err("%s - failed submitting read urb, error %d", __FUNCTION__, result); + goto error; + } return 0; } + msleep(1000); } err("%s - failed doing control urb, error %d", __FUNCTION__, result); goto error; @@ -855,6 +861,7 @@ static void ipaq_write_bulk_callback(struct urb *urb, struct pt_regs *regs) if (urb->status) { dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status); + return; } spin_lock_irqsave(&write_list_lock, flags); @@ -870,7 +877,7 @@ static void ipaq_write_bulk_callback(struct urb *urb, struct pt_regs *regs) spin_unlock_irqrestore(&write_list_lock, flags); } - schedule_work(&port->work); + usb_serial_port_softint(port); } static int ipaq_write_room(struct usb_serial_port *port) @@ -967,3 +974,9 @@ MODULE_PARM_DESC(vendor, "User specified USB idVendor"); module_param(product, ushort, 0); MODULE_PARM_DESC(product, "User specified USB idProduct"); + +module_param(connect_retries, int, S_IRUGO|S_IWUSR); +MODULE_PARM_DESC(connect_retries, "Maximum number of connect retries (one second each)"); + +module_param(initial_wait, int, S_IRUGO|S_IWUSR); +MODULE_PARM_DESC(initial_wait, "Time to wait before attempting a connection (in seconds)"); diff --git a/drivers/usb/serial/ipw.c b/drivers/usb/serial/ipw.c index e760a7024..812bc213a 100644 --- a/drivers/usb/serial/ipw.c +++ b/drivers/usb/serial/ipw.c @@ -46,8 +46,8 @@ #include #include #include +#include #include -#include "usb-serial.h" /* * Version Information @@ -373,10 +373,12 @@ static void ipw_write_bulk_callback(struct urb *urb, struct pt_regs *regs) dbg("%s", __FUNCTION__); + port->write_urb_busy = 0; + if (urb->status) dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status); - schedule_work(&port->work); + usb_serial_port_softint(port); } static int ipw_write(struct usb_serial_port *port, const unsigned char *buf, int count) @@ -392,14 +394,14 @@ static int ipw_write(struct usb_serial_port *port, const unsigned char *buf, int return 0; } - spin_lock(&port->lock); + spin_lock_bh(&port->lock); if (port->write_urb_busy) { - spin_unlock(&port->lock); + spin_unlock_bh(&port->lock); dbg("%s - already writing", __FUNCTION__); return 0; } port->write_urb_busy = 1; - spin_unlock(&port->lock); + spin_unlock_bh(&port->lock); count = min(count, port->bulk_out_size); memcpy(port->bulk_out_buffer, buf, count); diff --git a/drivers/usb/serial/ir-usb.c b/drivers/usb/serial/ir-usb.c index 426182ddc..1b348df38 100644 --- a/drivers/usb/serial/ir-usb.c +++ b/drivers/usb/serial/ir-usb.c @@ -46,7 +46,6 @@ * initial version released. */ -#include #include #include #include @@ -58,7 +57,7 @@ #include #include #include -#include "usb-serial.h" +#include /* * Version Information @@ -343,14 +342,14 @@ static int ir_write (struct usb_serial_port *port, const unsigned char *buf, int if (count == 0) return 0; - spin_lock(&port->lock); + spin_lock_bh(&port->lock); if (port->write_urb_busy) { - spin_unlock(&port->lock); + spin_unlock_bh(&port->lock); dbg("%s - already writing", __FUNCTION__); return 0; } port->write_urb_busy = 1; - spin_unlock(&port->lock); + spin_unlock_bh(&port->lock); transfer_buffer = port->write_urb->transfer_buffer; transfer_size = min(count, port->bulk_out_size - 1); @@ -408,7 +407,7 @@ static void ir_write_bulk_callback (struct urb *urb, struct pt_regs *regs) urb->actual_length, urb->transfer_buffer); - schedule_work(&port->work); + usb_serial_port_softint(port); } static void ir_read_bulk_callback (struct urb *urb, struct pt_regs *regs) @@ -453,8 +452,7 @@ static void ir_read_bulk_callback (struct urb *urb, struct pt_regs *regs) tty = port->tty; /* - * FIXME: must not do this in IRQ context, - * must honour TTY_DONT_FLIP + * FIXME: must not do this in IRQ context */ tty->ldisc.receive_buf( tty, diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c index 052b735c4..015ad6cc1 100644 --- a/drivers/usb/serial/keyspan.c +++ b/drivers/usb/serial/keyspan.c @@ -95,7 +95,6 @@ */ -#include #include #include #include @@ -108,7 +107,7 @@ #include #include #include -#include "usb-serial.h" +#include #include "keyspan.h" static int debug; @@ -481,7 +480,7 @@ static void usa2x_outdat_callback(struct urb *urb, struct pt_regs *regs) dbg ("%s - urb %d", __FUNCTION__, urb == p_priv->out_urbs[1]); if (port->open_count) - schedule_work(&port->work); + usb_serial_port_softint(port); } static void usa26_inack_callback(struct urb *urb, struct pt_regs *regs) diff --git a/drivers/usb/serial/keyspan_pda.c b/drivers/usb/serial/keyspan_pda.c index b0441c35f..59e777f1e 100644 --- a/drivers/usb/serial/keyspan_pda.c +++ b/drivers/usb/serial/keyspan_pda.c @@ -66,7 +66,6 @@ */ -#include #include #include #include @@ -79,6 +78,7 @@ #include #include #include +#include static int debug; @@ -108,8 +108,6 @@ struct ezusb_hex_record { #include "xircom_pgs_fw.h" #endif -#include "usb-serial.h" - /* * Version Information */ @@ -520,13 +518,13 @@ static int keyspan_pda_write(struct usb_serial_port *port, the TX urb is in-flight (wait until it completes) the device is full (wait until it says there is room) */ - spin_lock(&port->lock); + spin_lock_bh(&port->lock); if (port->write_urb_busy || priv->tx_throttled) { - spin_unlock(&port->lock); + spin_unlock_bh(&port->lock); return 0; } port->write_urb_busy = 1; - spin_unlock(&port->lock); + spin_unlock_bh(&port->lock); /* At this point the URB is in our control, nobody else can submit it again (the only sudden transition was the one from EINPROGRESS to diff --git a/drivers/usb/serial/kl5kusb105.c b/drivers/usb/serial/kl5kusb105.c index 78335a5f7..2a2f3e2da 100644 --- a/drivers/usb/serial/kl5kusb105.c +++ b/drivers/usb/serial/kl5kusb105.c @@ -45,7 +45,6 @@ */ -#include #include #include #include @@ -56,7 +55,7 @@ #include #include #include -#include "usb-serial.h" +#include #include "kl5kusb105.h" static int debug; @@ -569,8 +568,7 @@ static void klsi_105_write_bulk_callback ( struct urb *urb, struct pt_regs *regs return; } - /* from generic_write_bulk_callback */ - schedule_work(&port->work); + usb_serial_port_softint(port); } /* klsi_105_write_bulk_completion_callback */ diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c index 87dfcd89f..d50dce034 100644 --- a/drivers/usb/serial/kobil_sct.c +++ b/drivers/usb/serial/kobil_sct.c @@ -35,7 +35,6 @@ */ -#include #include #include #include @@ -47,8 +46,8 @@ #include #include #include +#include #include -#include "usb-serial.h" #include "kobil_sct.h" static int debug; diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c index 35bd29b6c..f4d4305c2 100644 --- a/drivers/usb/serial/mct_u232.c +++ b/drivers/usb/serial/mct_u232.c @@ -64,7 +64,6 @@ * (via linux-usb-devel). */ -#include #include #include #include @@ -76,7 +75,7 @@ #include #include #include -#include "usb-serial.h" +#include #include "mct_u232.h" /* diff --git a/drivers/usb/serial/navman.c b/drivers/usb/serial/navman.c index 7f5440810..ac3f8b5d2 100644 --- a/drivers/usb/serial/navman.c +++ b/drivers/usb/serial/navman.c @@ -14,7 +14,7 @@ #include #include #include -#include "usb-serial.h" +#include static int debug; diff --git a/drivers/usb/serial/omninet.c b/drivers/usb/serial/omninet.c index 238033a87..a764ff4e3 100644 --- a/drivers/usb/serial/omninet.c +++ b/drivers/usb/serial/omninet.c @@ -35,7 +35,6 @@ * */ -#include #include #include #include @@ -47,7 +46,7 @@ #include #include #include -#include "usb-serial.h" +#include static int debug; @@ -257,14 +256,14 @@ static int omninet_write (struct usb_serial_port *port, const unsigned char *buf return (0); } - spin_lock(&wport->lock); + spin_lock_bh(&wport->lock); if (wport->write_urb_busy) { - spin_unlock(&wport->lock); + spin_unlock_bh(&wport->lock); dbg("%s - already writing", __FUNCTION__); return 0; } wport->write_urb_busy = 1; - spin_unlock(&wport->lock); + spin_unlock_bh(&wport->lock); count = (count > OMNINET_BULKOUTSIZE) ? OMNINET_BULKOUTSIZE : count; @@ -320,7 +319,7 @@ static void omninet_write_bulk_callback (struct urb *urb, struct pt_regs *regs) return; } - schedule_work(&port->work); + usb_serial_port_softint(port); } diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index b722175f1..c856e6f40 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c @@ -1,5 +1,5 @@ /* - Option Card (PCMCIA to) USB to Serial Driver + USB Driver for GSM modems Copyright (C) 2005 Matthias Urlichs @@ -9,21 +9,29 @@ Portions copied from the Keyspan driver by Hugh Blemings - History: + History: see the git log. - 2005-05-19 v0.1 Initial version, based on incomplete docs - and analysis of misbehavior of the standard driver - 2005-05-20 v0.2 Extended the input buffer to avoid losing - random 64-byte chunks of data - 2005-05-21 v0.3 implemented chars_in_buffer() - turned on low_latency - simplified the code somewhat + Work sponsored by: Sigos GmbH, Germany + + This driver exists because the "normal" serial driver doesn't work too well + with GSM modems. Issues: + - data loss -- one single Receive URB is not nearly enough + - nonstandard flow (Option devices) control + - controlling the baud rate doesn't make sense + + This driver is named "option" because the most common device it's + used for is a PC-Card (with an internal OHCI-USB interface, behind + which the GSM interface sits), made by Option Inc. + + Some of the "one port" devices actually exhibit multiple USB instances + on the USB bus. This is not a bug, these ports are used for different + device features. */ -#define DRIVER_VERSION "v0.3" + +#define DRIVER_VERSION "v0.7.1" #define DRIVER_AUTHOR "Matthias Urlichs " -#define DRIVER_DESC "Option Card (PC-Card to) USB to Serial Driver" +#define DRIVER_DESC "USB Driver for GSM modems" -#include #include #include #include @@ -31,123 +39,157 @@ #include #include #include -#include "usb-serial.h" +#include /* Function prototypes */ -static int option_open (struct usb_serial_port *port, struct file *filp); -static void option_close (struct usb_serial_port *port, struct file *filp); -static int option_startup (struct usb_serial *serial); -static void option_shutdown (struct usb_serial *serial); -static void option_rx_throttle (struct usb_serial_port *port); -static void option_rx_unthrottle (struct usb_serial_port *port); -static int option_write_room (struct usb_serial_port *port); +static int option_open(struct usb_serial_port *port, struct file *filp); +static void option_close(struct usb_serial_port *port, struct file *filp); +static int option_startup(struct usb_serial *serial); +static void option_shutdown(struct usb_serial *serial); +static void option_rx_throttle(struct usb_serial_port *port); +static void option_rx_unthrottle(struct usb_serial_port *port); +static int option_write_room(struct usb_serial_port *port); static void option_instat_callback(struct urb *urb, struct pt_regs *regs); +static int option_write(struct usb_serial_port *port, + const unsigned char *buf, int count); -static int option_write (struct usb_serial_port *port, - const unsigned char *buf, int count); - -static int option_chars_in_buffer (struct usb_serial_port *port); -static int option_ioctl (struct usb_serial_port *port, struct file *file, - unsigned int cmd, unsigned long arg); -static void option_set_termios (struct usb_serial_port *port, - struct termios *old); -static void option_break_ctl (struct usb_serial_port *port, int break_state); -static int option_tiocmget (struct usb_serial_port *port, struct file *file); -static int option_tiocmset (struct usb_serial_port *port, struct file *file, - unsigned int set, unsigned int clear); -static int option_send_setup (struct usb_serial_port *port); +static int option_chars_in_buffer(struct usb_serial_port *port); +static int option_ioctl(struct usb_serial_port *port, struct file *file, + unsigned int cmd, unsigned long arg); +static void option_set_termios(struct usb_serial_port *port, + struct termios *old); +static void option_break_ctl(struct usb_serial_port *port, int break_state); +static int option_tiocmget(struct usb_serial_port *port, struct file *file); +static int option_tiocmset(struct usb_serial_port *port, struct file *file, + unsigned int set, unsigned int clear); +static int option_send_setup(struct usb_serial_port *port); /* Vendor and product IDs */ -#define OPTION_VENDOR_ID 0x0AF0 - -#define OPTION_PRODUCT_OLD 0x5000 -#define OPTION_PRODUCT_WLAN 0x6000 +#define OPTION_VENDOR_ID 0x0AF0 +#define HUAWEI_VENDOR_ID 0x12D1 +#define AUDIOVOX_VENDOR_ID 0x0F3D +#define NOVATELWIRELESS_VENDOR_ID 0x1410 +#define ANYDATA_VENDOR_ID 0x16d5 + +#define OPTION_PRODUCT_OLD 0x5000 +#define OPTION_PRODUCT_FUSION 0x6000 +#define OPTION_PRODUCT_FUSION2 0x6300 +#define OPTION_PRODUCT_COBRA 0x6500 +#define OPTION_PRODUCT_COBRA2 0x6600 +#define HUAWEI_PRODUCT_E600 0x1001 +#define AUDIOVOX_PRODUCT_AIRCARD 0x0112 +#define NOVATELWIRELESS_PRODUCT_U740 0x1400 +#define ANYDATA_PRODUCT_ID 0x6501 static struct usb_device_id option_ids[] = { { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_OLD) }, - { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_WLAN) }, + { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) }, + { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) }, + { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) }, + { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) }, + { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, + { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) }, + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) }, + { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ID) }, + { } /* Terminating entry */ +}; + +static struct usb_device_id option_ids1[] = { + { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_OLD) }, + { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) }, + { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) }, + { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) }, + { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) }, + { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, + { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) }, + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) }, + { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ID) }, { } /* Terminating entry */ }; MODULE_DEVICE_TABLE(usb, option_ids); static struct usb_driver option_driver = { - .owner = THIS_MODULE, .name = "option", .probe = usb_serial_probe, .disconnect = usb_serial_disconnect, .id_table = option_ids, + .no_dynamic_id = 1, }; -/* The card has three separate interfaces, wich the serial driver +/* The card has three separate interfaces, which the serial driver * recognizes separately, thus num_port=1. */ -static struct usb_serial_device_type option_3port_device = { - .owner = THIS_MODULE, - .name = "Option 3-port card", - .short_name = "option", - .id_table = option_ids, - .num_interrupt_in = NUM_DONT_CARE, - .num_bulk_in = NUM_DONT_CARE, - .num_bulk_out = NUM_DONT_CARE, - .num_ports = 1, /* 3 */ - .open = option_open, - .close = option_close, - .write = option_write, - .write_room = option_write_room, - .chars_in_buffer = option_chars_in_buffer, - .throttle = option_rx_throttle, - .unthrottle = option_rx_unthrottle, - .ioctl = option_ioctl, - .set_termios = option_set_termios, - .break_ctl = option_break_ctl, - .tiocmget = option_tiocmget, - .tiocmset = option_tiocmset, - .attach = option_startup, - .shutdown = option_shutdown, - .read_int_callback = option_instat_callback, + +static struct usb_serial_driver option_1port_device = { + .driver = { + .owner = THIS_MODULE, + .name = "option1", + }, + .description = "GSM modem (1-port)", + .id_table = option_ids1, + .num_interrupt_in = NUM_DONT_CARE, + .num_bulk_in = NUM_DONT_CARE, + .num_bulk_out = NUM_DONT_CARE, + .num_ports = 1, + .open = option_open, + .close = option_close, + .write = option_write, + .write_room = option_write_room, + .chars_in_buffer = option_chars_in_buffer, + .throttle = option_rx_throttle, + .unthrottle = option_rx_unthrottle, + .ioctl = option_ioctl, + .set_termios = option_set_termios, + .break_ctl = option_break_ctl, + .tiocmget = option_tiocmget, + .tiocmset = option_tiocmset, + .attach = option_startup, + .shutdown = option_shutdown, + .read_int_callback = option_instat_callback, }; +#ifdef CONFIG_USB_DEBUG static int debug; +#else +#define debug 0 +#endif /* per port private data */ -#define N_IN_URB 4 -#define N_OUT_URB 1 -#define IN_BUFLEN 1024 -#define OUT_BUFLEN 1024 +#define N_IN_URB 4 +#define N_OUT_URB 1 +#define IN_BUFLEN 4096 +#define OUT_BUFLEN 128 struct option_port_private { /* Input endpoints and buffer for this port */ - struct urb *in_urbs[N_IN_URB]; - char in_buffer[N_IN_URB][IN_BUFLEN]; + struct urb *in_urbs[N_IN_URB]; + char in_buffer[N_IN_URB][IN_BUFLEN]; /* Output endpoints and buffer for this port */ - struct urb *out_urbs[N_OUT_URB]; - char out_buffer[N_OUT_URB][OUT_BUFLEN]; + struct urb *out_urbs[N_OUT_URB]; + char out_buffer[N_OUT_URB][OUT_BUFLEN]; /* Settings for the port */ - int rts_state; /* Handshaking pins (outputs) */ - int dtr_state; - int cts_state; /* Handshaking pins (inputs) */ - int dsr_state; - int dcd_state; - int ri_state; - // int break_on; - - unsigned long tx_start_time[N_OUT_URB]; + int rts_state; /* Handshaking pins (outputs) */ + int dtr_state; + int cts_state; /* Handshaking pins (inputs) */ + int dsr_state; + int dcd_state; + int ri_state; + + unsigned long tx_start_time[N_OUT_URB]; }; - /* Functions used by new usb-serial code. */ -static int __init -option_init (void) +static int __init option_init(void) { int retval; - retval = usb_serial_register(&option_3port_device); + retval = usb_serial_register(&option_1port_device); if (retval) - goto failed_3port_device_register; + goto failed_1port_device_register; retval = usb_register(&option_driver); if (retval) goto failed_driver_register; @@ -157,57 +199,48 @@ option_init (void) return 0; failed_driver_register: - usb_serial_deregister (&option_3port_device); -failed_3port_device_register: + usb_serial_deregister (&option_1port_device); +failed_1port_device_register: return retval; } -static void __exit -option_exit (void) +static void __exit option_exit(void) { usb_deregister (&option_driver); - usb_serial_deregister (&option_3port_device); + usb_serial_deregister (&option_1port_device); } module_init(option_init); module_exit(option_exit); -static void -option_rx_throttle (struct usb_serial_port *port) +static void option_rx_throttle(struct usb_serial_port *port) { dbg("%s", __FUNCTION__); } - -static void -option_rx_unthrottle (struct usb_serial_port *port) +static void option_rx_unthrottle(struct usb_serial_port *port) { dbg("%s", __FUNCTION__); } - -static void -option_break_ctl (struct usb_serial_port *port, int break_state) +static void option_break_ctl(struct usb_serial_port *port, int break_state) { /* Unfortunately, I don't know how to send a break */ - dbg("%s", __FUNCTION__); + dbg("%s", __FUNCTION__); } - -static void -option_set_termios (struct usb_serial_port *port, - struct termios *old_termios) +static void option_set_termios(struct usb_serial_port *port, + struct termios *old_termios) { dbg("%s", __FUNCTION__); option_send_setup(port); } -static int -option_tiocmget(struct usb_serial_port *port, struct file *file) +static int option_tiocmget(struct usb_serial_port *port, struct file *file) { - unsigned int value; - struct option_port_private *portdata; + unsigned int value; + struct option_port_private *portdata; portdata = usb_get_serial_port_data(port); @@ -221,11 +254,10 @@ option_tiocmget(struct usb_serial_port *port, struct file *file) return value; } -static int -option_tiocmset (struct usb_serial_port *port, struct file *file, - unsigned int set, unsigned int clear) +static int option_tiocmset(struct usb_serial_port *port, struct file *file, + unsigned int set, unsigned int clear) { - struct option_port_private *portdata; + struct option_port_private *portdata; portdata = usb_get_serial_port_data(port); @@ -241,80 +273,58 @@ option_tiocmset (struct usb_serial_port *port, struct file *file, return option_send_setup(port); } -static int -option_ioctl (struct usb_serial_port *port, struct file *file, - unsigned int cmd, unsigned long arg) +static int option_ioctl(struct usb_serial_port *port, struct file *file, + unsigned int cmd, unsigned long arg) { return -ENOIOCTLCMD; } /* Write */ -static int -option_write(struct usb_serial_port *port, - const unsigned char *buf, int count) +static int option_write(struct usb_serial_port *port, + const unsigned char *buf, int count) { - struct option_port_private *portdata; - int i; - int left, todo; - struct urb *this_urb = NULL; /* spurious */ - int err; + struct option_port_private *portdata; + int i; + int left, todo; + struct urb *this_urb = NULL; /* spurious */ + int err; portdata = usb_get_serial_port_data(port); dbg("%s: write (%d chars)", __FUNCTION__, count); -#if 0 - spin_lock(&port->lock); - if (port->write_urb_busy) { - spin_unlock(&port->lock); - dbg("%s: already writing", __FUNCTION__); - return 0; - } - port->write_urb_busy = 1; - spin_unlock(&port->lock); -#endif - i = 0; left = count; - while (left>0) { + for (i=0; left > 0 && i < N_OUT_URB; i++) { todo = left; if (todo > OUT_BUFLEN) todo = OUT_BUFLEN; - for (;i < N_OUT_URB; i++) { - /* Check we have a valid urb/endpoint before we use it... */ - this_urb = portdata->out_urbs[i]; - if (this_urb->status != -EINPROGRESS) - break; - if (this_urb->transfer_flags & URB_ASYNC_UNLINK) - continue; - if (time_before(jiffies, portdata->tx_start_time[i] + 10 * HZ)) + this_urb = portdata->out_urbs[i]; + if (this_urb->status == -EINPROGRESS) { + if (time_before(jiffies, + portdata->tx_start_time[i] + 10 * HZ)) continue; - this_urb->transfer_flags |= URB_ASYNC_UNLINK; usb_unlink_urb(this_urb); + continue; } + if (this_urb->status != 0) + dbg("usb_write %p failed (err=%d)", + this_urb, this_urb->status); - if (i == N_OUT_URB) { - /* no bulk out free! */ - dbg("%s: no output urb -- left %d", __FUNCTION__,count-left); -#if 0 - port->write_urb_busy = 0; -#endif - return count-left; - } - - dbg("%s: endpoint %d buf %d", __FUNCTION__, usb_pipeendpoint(this_urb->pipe), i); + dbg("%s: endpoint %d buf %d", __FUNCTION__, + usb_pipeendpoint(this_urb->pipe), i); + /* send the data */ memcpy (this_urb->transfer_buffer, buf, todo); - - /* send the data out the bulk port */ this_urb->transfer_buffer_length = todo; - this_urb->transfer_flags &= ~URB_ASYNC_UNLINK; this_urb->dev = port->serial->dev; err = usb_submit_urb(this_urb, GFP_ATOMIC); if (err) { - dbg("usb_submit_urb %p (write bulk) failed (%d,, has %d)", this_urb, err, this_urb->status); + dbg("usb_submit_urb %p (write bulk) failed " + "(%d, has %d)", this_urb, + err, this_urb->status); continue; } portdata->tx_start_time[i] = jiffies; @@ -323,17 +333,13 @@ option_write(struct usb_serial_port *port, } count -= left; -#if 0 - port->write_urb_busy = 0; -#endif dbg("%s: wrote (did %d)", __FUNCTION__, count); return count; } -static void -option_indat_callback (struct urb *urb, struct pt_regs *regs) +static void option_indat_callback(struct urb *urb, struct pt_regs *regs) { - int i, err; + int err; int endpoint; struct usb_serial_port *port; struct tty_struct *tty; @@ -350,11 +356,8 @@ option_indat_callback (struct urb *urb, struct pt_regs *regs) } else { tty = port->tty; if (urb->actual_length) { - for (i = 0; i < urb->actual_length ; ++i) { - if (tty->flip.count >= TTY_FLIPBUF_SIZE) - tty_flip_buffer_push(tty); - tty_insert_flip_char(tty, data[i], 0); - } + tty_buffer_request_room(tty, urb->actual_length); + tty_insert_flip_string(tty, data, urb->actual_length); tty_flip_buffer_push(tty); } else { dbg("%s: empty read urb received", __FUNCTION__); @@ -364,14 +367,14 @@ option_indat_callback (struct urb *urb, struct pt_regs *regs) if (port->open_count && urb->status != -ESHUTDOWN) { err = usb_submit_urb(urb, GFP_ATOMIC); if (err) - printk(KERN_ERR "%s: resubmit read urb failed. (%d)", __FUNCTION__, err); + printk(KERN_ERR "%s: resubmit read urb failed. " + "(%d)", __FUNCTION__, err); } } return; } -static void -option_outdat_callback (struct urb *urb, struct pt_regs *regs) +static void option_outdat_callback(struct urb *urb, struct pt_regs *regs) { struct usb_serial_port *port; @@ -379,12 +382,10 @@ option_outdat_callback (struct urb *urb, struct pt_regs *regs) port = (struct usb_serial_port *) urb->context; - if (port->open_count) - schedule_work(&port->work); + usb_serial_port_softint(port); } -static void -option_instat_callback (struct urb *urb, struct pt_regs *regs) +static void option_instat_callback(struct urb *urb, struct pt_regs *regs) { int err; struct usb_serial_port *port = (struct usb_serial_port *) urb->context; @@ -402,10 +403,12 @@ option_instat_callback (struct urb *urb, struct pt_regs *regs) dbg("%s: NULL req_pkt\n", __FUNCTION__); return; } - if ((req_pkt->bRequestType == 0xA1) && (req_pkt->bRequest == 0x20)) { + if ((req_pkt->bRequestType == 0xA1) && + (req_pkt->bRequest == 0x20)) { int old_dcd_state; unsigned char signals = *((unsigned char *) - urb->transfer_buffer + sizeof(struct usb_ctrlrequest)); + urb->transfer_buffer + + sizeof(struct usb_ctrlrequest)); dbg("%s: signal x%x", __FUNCTION__, signals); @@ -415,12 +418,13 @@ option_instat_callback (struct urb *urb, struct pt_regs *regs) portdata->dsr_state = ((signals & 0x02) ? 1 : 0); portdata->ri_state = ((signals & 0x08) ? 1 : 0); - if (port->tty && !C_CLOCAL(port->tty) - && old_dcd_state && !portdata->dcd_state) { + if (port->tty && !C_CLOCAL(port->tty) && + old_dcd_state && !portdata->dcd_state) tty_hangup(port->tty); - } - } else - dbg("%s: type %x req %x", __FUNCTION__, req_pkt->bRequestType,req_pkt->bRequest); + } else { + dbg("%s: type %x req %x", __FUNCTION__, + req_pkt->bRequestType,req_pkt->bRequest); + } } else dbg("%s: error %d", __FUNCTION__, urb->status); @@ -429,13 +433,12 @@ option_instat_callback (struct urb *urb, struct pt_regs *regs) urb->dev = serial->dev; err = usb_submit_urb(urb, GFP_ATOMIC); if (err) - dbg("%s: resubmit intr urb failed. (%d)", __FUNCTION__, err); + dbg("%s: resubmit intr urb failed. (%d)", + __FUNCTION__, err); } } - -static int -option_write_room (struct usb_serial_port *port) +static int option_write_room(struct usb_serial_port *port) { struct option_port_private *portdata; int i; @@ -444,18 +447,17 @@ option_write_room (struct usb_serial_port *port) portdata = usb_get_serial_port_data(port); - for (i=0; i < N_OUT_URB; i++) + for (i=0; i < N_OUT_URB; i++) { this_urb = portdata->out_urbs[i]; if (this_urb && this_urb->status != -EINPROGRESS) data_len += OUT_BUFLEN; + } dbg("%s: %d", __FUNCTION__, data_len); return data_len; } - -static int -option_chars_in_buffer (struct usb_serial_port *port) +static int option_chars_in_buffer(struct usb_serial_port *port) { struct option_port_private *portdata; int i; @@ -464,23 +466,21 @@ option_chars_in_buffer (struct usb_serial_port *port) portdata = usb_get_serial_port_data(port); - for (i=0; i < N_OUT_URB; i++) + for (i=0; i < N_OUT_URB; i++) { this_urb = portdata->out_urbs[i]; if (this_urb && this_urb->status == -EINPROGRESS) data_len += this_urb->transfer_buffer_length; - + } dbg("%s: %d", __FUNCTION__, data_len); return data_len; } - -static int -option_open (struct usb_serial_port *port, struct file *filp) +static int option_open(struct usb_serial_port *port, struct file *filp) { - struct option_port_private *portdata; - struct usb_serial *serial = port->serial; - int i, err; - struct urb *urb; + struct option_port_private *portdata; + struct usb_serial *serial = port->serial; + int i, err; + struct urb *urb; portdata = usb_get_serial_port_data(port); @@ -496,17 +496,21 @@ option_open (struct usb_serial_port *port, struct file *filp) if (! urb) continue; if (urb->dev != serial->dev) { - dbg("%s: dev %p != %p", __FUNCTION__, urb->dev, serial->dev); + dbg("%s: dev %p != %p", __FUNCTION__, + urb->dev, serial->dev); continue; } - /* make sure endpoint data toggle is synchronized with the device */ - + /* + * make sure endpoint data toggle is synchronized with the + * device + */ usb_clear_halt(urb->dev, urb->pipe); err = usb_submit_urb(urb, GFP_KERNEL); if (err) { - dbg("%s: submit urb %d failed (%d) %d", __FUNCTION__, i, err, + dbg("%s: submit urb %d failed (%d) %d", + __FUNCTION__, i, err, urb->transfer_buffer_length); } } @@ -517,7 +521,8 @@ option_open (struct usb_serial_port *port, struct file *filp) if (! urb) continue; urb->dev = serial->dev; - /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), usb_pipeout(urb->pipe), 0); */ + /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), + usb_pipeout(urb->pipe), 0); */ } port->tty->low_latency = 1; @@ -527,21 +532,17 @@ option_open (struct usb_serial_port *port, struct file *filp) return (0); } -static inline void -stop_urb(struct urb *urb) +static inline void stop_urb(struct urb *urb) { - if (urb && urb->status == -EINPROGRESS) { - urb->transfer_flags &= ~URB_ASYNC_UNLINK; + if (urb && urb->status == -EINPROGRESS) usb_kill_urb(urb); - } } -static void -option_close(struct usb_serial_port *port, struct file *filp) +static void option_close(struct usb_serial_port *port, struct file *filp) { - int i; - struct usb_serial *serial = port->serial; - struct option_port_private *portdata; + int i; + struct usb_serial *serial = port->serial; + struct option_port_private *portdata; dbg("%s", __FUNCTION__); portdata = usb_get_serial_port_data(port); @@ -561,12 +562,10 @@ option_close(struct usb_serial_port *port, struct file *filp) port->tty = NULL; } - /* Helper functions used by option_setup_urbs */ -static struct urb * -option_setup_urb (struct usb_serial *serial, int endpoint, - int dir, void *ctx, char *buf, int len, - void (*callback)(struct urb *, struct pt_regs *regs)) +static struct urb *option_setup_urb(struct usb_serial *serial, int endpoint, + int dir, void *ctx, char *buf, int len, + void (*callback)(struct urb *, struct pt_regs *regs)) { struct urb *urb; @@ -588,36 +587,35 @@ option_setup_urb (struct usb_serial *serial, int endpoint, } /* Setup urbs */ -static void -option_setup_urbs(struct usb_serial *serial) +static void option_setup_urbs(struct usb_serial *serial) { - int j; - struct usb_serial_port *port; - struct option_port_private *portdata; + int i,j; + struct usb_serial_port *port; + struct option_port_private *portdata; dbg("%s", __FUNCTION__); - port = serial->port[0]; - portdata = usb_get_serial_port_data(port); + for (i = 0; i < serial->num_ports; i++) { + port = serial->port[i]; + portdata = usb_get_serial_port_data(port); /* Do indat endpoints first */ - for (j = 0; j <= N_IN_URB; ++j) { - portdata->in_urbs[j] = option_setup_urb (serial, - port->bulk_in_endpointAddress, USB_DIR_IN, port, - portdata->in_buffer[j], IN_BUFLEN, option_indat_callback); - } + for (j = 0; j < N_IN_URB; ++j) { + portdata->in_urbs[j] = option_setup_urb (serial, + port->bulk_in_endpointAddress, USB_DIR_IN, port, + portdata->in_buffer[j], IN_BUFLEN, option_indat_callback); + } - /* outdat endpoints */ - for (j = 0; j <= N_OUT_URB; ++j) { - portdata->out_urbs[j] = option_setup_urb (serial, - port->bulk_out_endpointAddress, USB_DIR_OUT, port, - portdata->out_buffer[j], OUT_BUFLEN, option_outdat_callback); + /* outdat endpoints */ + for (j = 0; j < N_OUT_URB; ++j) { + portdata->out_urbs[j] = option_setup_urb (serial, + port->bulk_out_endpointAddress, USB_DIR_OUT, port, + portdata->out_buffer[j], OUT_BUFLEN, option_outdat_callback); + } } } - -static int -option_send_setup(struct usb_serial_port *port) +static int option_send_setup(struct usb_serial_port *port) { struct usb_serial *serial = port->serial; struct option_port_private *portdata; @@ -633,32 +631,31 @@ option_send_setup(struct usb_serial_port *port) if (portdata->rts_state) val |= 0x02; - return usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), - 0x22,0x21,val,0,NULL,0,USB_CTRL_SET_TIMEOUT); + return usb_control_msg(serial->dev, + usb_rcvctrlpipe(serial->dev, 0), + 0x22,0x21,val,0,NULL,0,USB_CTRL_SET_TIMEOUT); } return 0; } - -static int -option_startup (struct usb_serial *serial) +static int option_startup(struct usb_serial *serial) { - int i, err; - struct usb_serial_port *port; - struct option_port_private *portdata; + int i, err; + struct usb_serial_port *port; + struct option_port_private *portdata; dbg("%s", __FUNCTION__); /* Now setup per port private data */ for (i = 0; i < serial->num_ports; i++) { port = serial->port[i]; - portdata = kmalloc(sizeof(struct option_port_private), GFP_KERNEL); + portdata = kzalloc(sizeof(*portdata), GFP_KERNEL); if (!portdata) { - dbg("%s: kmalloc for option_port_private (%d) failed!.", __FUNCTION__, i); + dbg("%s: kmalloc for option_port_private (%d) failed!.", + __FUNCTION__, i); return (1); } - memset(portdata, 0, sizeof(struct option_port_private)); usb_set_serial_port_data(port, portdata); @@ -666,7 +663,8 @@ option_startup (struct usb_serial *serial) continue; err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); if (err) - dbg("%s: submit irq_in urb failed %d", __FUNCTION__, err); + dbg("%s: submit irq_in urb failed %d", + __FUNCTION__, err); } option_setup_urbs(serial); @@ -674,12 +672,11 @@ option_startup (struct usb_serial *serial) return (0); } -static void -option_shutdown (struct usb_serial *serial) +static void option_shutdown(struct usb_serial *serial) { - int i, j; - struct usb_serial_port *port; - struct option_port_private *portdata; + int i, j; + struct usb_serial_port *port; + struct option_port_private *portdata; dbg("%s", __FUNCTION__); @@ -724,6 +721,8 @@ MODULE_DESCRIPTION(DRIVER_DESC); MODULE_VERSION(DRIVER_VERSION); MODULE_LICENSE("GPL"); +#ifdef CONFIG_USB_DEBUG module_param(debug, bool, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(debug, "Debug messages"); +#endif diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index c96714bb1..65e4d0469 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c @@ -14,7 +14,6 @@ * */ -#include #include #include #include @@ -28,7 +27,7 @@ #include #include #include -#include "usb-serial.h" +#include #include "pl2303.h" /* @@ -53,6 +52,7 @@ struct pl2303_buf { static struct usb_device_id id_table [] = { { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) }, { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) }, + { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_DCU11) }, { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) }, { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) }, { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) }, @@ -79,7 +79,8 @@ static struct usb_device_id id_table [] = { { USB_DEVICE(SAGEM_VENDOR_ID, SAGEM_PRODUCT_ID) }, { USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) }, { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) }, - { USB_DEVICE(OTI_VENDOR_ID, OTI_PRODUCT_ID) }, + { USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) }, + { USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) }, { } /* Terminating entry */ }; @@ -314,7 +315,7 @@ static void pl2303_send(struct usb_serial_port *port) // TODO: reschedule pl2303_send } - schedule_work(&port->work); + usb_serial_port_softint(port); } static int pl2303_write_room(struct usb_serial_port *port) @@ -600,7 +601,7 @@ static void pl2303_close (struct usb_serial_port *port, struct file *filp) unsigned int c_cflag; int bps; long timeout; - wait_queue_t wait; \ + wait_queue_t wait; dbg("%s - port %d", __FUNCTION__, port->number); diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h index 7f29e81d3..55195e76e 100644 --- a/drivers/usb/serial/pl2303.h +++ b/drivers/usb/serial/pl2303.h @@ -10,6 +10,7 @@ #define PL2303_VENDOR_ID 0x067b #define PL2303_PRODUCT_ID 0x2303 #define PL2303_PRODUCT_ID_RSAQ2 0x04bb +#define PL2303_PRODUCT_ID_DCU11 0x1234 #define PL2303_PRODUCT_ID_PHAROS 0xaaa0 #define PL2303_PRODUCT_ID_RSAQ3 0xaaa2 @@ -81,6 +82,10 @@ #define SPEEDDRAGON_VENDOR_ID 0x0e55 #define SPEEDDRAGON_PRODUCT_ID 0x110b -/* Ours Technology Inc DKU-5 clone, chipset: Prolific Technology Inc */ -#define OTI_VENDOR_ID 0x0ea0 -#define OTI_PRODUCT_ID 0x6858 +/* DATAPILOT Universal-2 Phone Cable */ +#define DATAPILOT_U2_VENDOR_ID 0x0731 +#define DATAPILOT_U2_PRODUCT_ID 0x2003 + +/* Belkin "F5U257" Serial Adapter */ +#define BELKIN_VENDOR_ID 0x050d +#define BELKIN_PRODUCT_ID 0x0257 diff --git a/drivers/usb/serial/safe_serial.c b/drivers/usb/serial/safe_serial.c index f0215f850..1e07dfad6 100644 --- a/drivers/usb/serial/safe_serial.c +++ b/drivers/usb/serial/safe_serial.c @@ -60,7 +60,6 @@ */ -#include #include #include #include @@ -72,7 +71,7 @@ #include #include #include -#include "usb-serial.h" +#include #ifndef CONFIG_USB_SAFE_PADDED @@ -299,14 +298,14 @@ static int safe_write (struct usb_serial_port *port, const unsigned char *buf, i dbg ("%s - write request of 0 bytes", __FUNCTION__); return (0); } - spin_lock(&port->lock); + spin_lock_bh(&port->lock); if (port->write_urb_busy) { - spin_unlock(&port->lock); + spin_unlock_bh(&port->lock); dbg("%s - already writing", __FUNCTION__); return 0; } port->write_urb_busy = 1; - spin_unlock(&port->lock); + spin_unlock_bh(&port->lock); packet_length = port->bulk_out_size; // get max packetsize diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c index 59c88de3e..ac9b8ee52 100644 --- a/drivers/usb/serial/ti_usb_3410_5052.c +++ b/drivers/usb/serial/ti_usb_3410_5052.c @@ -68,7 +68,6 @@ * fi */ -#include #include #include #include @@ -84,8 +83,8 @@ #include #include #include +#include -#include "usb-serial.h" #include "ti_usb_3410_5052.h" #include "ti_fw_3410.h" /* firmware image for 3410 */ #include "ti_fw_5052.h" /* firmware image for 5052 */ @@ -248,16 +247,19 @@ 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_device_type ti_1port_device = { - .owner = THIS_MODULE, - .name = "TI USB 3410 1 port adapter", +static struct usb_serial_driver ti_1port_device = { + .driver = { + .owner = THIS_MODULE, + .name = "ti_usb_3410_5052_1", + }, + .description = "TI USB 3410 1 port adapter", .id_table = ti_id_table_3410, .num_interrupt_in = 1, .num_bulk_in = 1, @@ -282,9 +284,12 @@ static struct usb_serial_device_type ti_1port_device = { .write_bulk_callback = ti_bulk_out_callback, }; -static struct usb_serial_device_type ti_2port_device = { - .owner = THIS_MODULE, - .name = "TI USB 5052 2 port adapter", +static struct usb_serial_driver ti_2port_device = { + .driver = { + .owner = THIS_MODULE, + .name = "ti_usb_3410_5052_2", + }, + .description = "TI USB 5052 2 port adapter", .id_table = ti_id_table_5052, .num_interrupt_in = 1, .num_bulk_in = 2, @@ -345,17 +350,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; iactconfig->desc.bConfigurationValue); /* create device structure */ - tdev = kmalloc(sizeof(struct ti_device), GFP_KERNEL); + tdev = kzalloc(sizeof(struct ti_device), GFP_KERNEL); if (tdev == NULL) { dev_err(&dev->dev, "%s - out of memory\n", __FUNCTION__); return -ENOMEM; } - memset(tdev, 0, sizeof(struct ti_device)); sema_init(&tdev->td_open_close_sem, 1); tdev->td_serial = serial; usb_set_serial_data(serial, tdev); @@ -1277,24 +1278,18 @@ static void ti_recv(struct device *dev, struct tty_struct *tty, int cnt; do { - if (tty->flip.count >= TTY_FLIPBUF_SIZE) { - tty_flip_buffer_push(tty); - if (tty->flip.count >= TTY_FLIPBUF_SIZE) { - dev_err(dev, "%s - dropping data, %d bytes lost\n", __FUNCTION__, length); - return; - } + cnt = tty_buffer_request_room(tty, length); + if (cnt < length) { + dev_err(dev, "%s - dropping data, %d bytes lost\n", __FUNCTION__, length - cnt); + if(cnt == 0) + break; } - cnt = min(length, TTY_FLIPBUF_SIZE - tty->flip.count); - memcpy(tty->flip.char_buf_ptr, data, cnt); - memset(tty->flip.flag_buf_ptr, 0, cnt); - tty->flip.char_buf_ptr += cnt; - tty->flip.flag_buf_ptr += cnt; - tty->flip.count += cnt; + tty_insert_flip_string(tty, data, cnt); + tty_flip_buffer_push(tty); data += cnt; length -= cnt; } while (length > 0); - tty_flip_buffer_push(tty); } diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 9c36f0ece..e06a41bd0 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c @@ -16,7 +16,6 @@ * */ -#include #include #include #include @@ -32,7 +31,7 @@ #include #include #include -#include "usb-serial.h" +#include #include "pl2303.h" /* @@ -41,6 +40,8 @@ #define DRIVER_AUTHOR "Greg Kroah-Hartman, greg@kroah.com, http://www.kroah.com/linux/" #define DRIVER_DESC "USB Serial Driver core" +static void port_free(struct usb_serial_port *port); + /* Driver structure we register with the USB core */ static struct usb_driver usb_serial_driver = { .name = "usbserial", @@ -147,18 +148,7 @@ static void destroy_serial(struct kref *kref) port = serial->port[i]; if (!port) continue; - usb_kill_urb(port->read_urb); - usb_free_urb(port->read_urb); - usb_kill_urb(port->write_urb); - usb_free_urb(port->write_urb); - usb_kill_urb(port->interrupt_in_urb); - usb_free_urb(port->interrupt_in_urb); - usb_kill_urb(port->interrupt_out_urb); - usb_free_urb(port->interrupt_out_urb); - kfree(port->bulk_in_buffer); - kfree(port->bulk_out_buffer); - kfree(port->interrupt_in_buffer); - kfree(port->interrupt_out_buffer); + port_free(port); } } @@ -168,6 +158,11 @@ static void destroy_serial(struct kref *kref) kfree (serial); } +void usb_serial_put(struct usb_serial *serial) +{ + kref_put(&serial->kref, destroy_serial); +} + /***************************************************************************** * Driver tty interface functions *****************************************************************************/ @@ -201,12 +196,12 @@ static int serial_open (struct tty_struct *tty, struct file * filp) ++port->open_count; - if (port->open_count == 1) { + /* set up our port structure making the tty driver + * remember our port object, and us it */ + tty->driver_data = port; + port->tty = tty; - /* set up our port structure making the tty driver - * remember our port object, and us it */ - tty->driver_data = port; - port->tty = tty; + if (port->open_count == 1) { /* lock this module before we call it * this may fail, which means we must bail out, @@ -230,9 +225,11 @@ bailout_module_put: module_put(serial->type->driver.owner); bailout_mutex_unlock: port->open_count = 0; + tty->driver_data = NULL; + port->tty = NULL; mutex_unlock(&port->mutex); bailout_kref_put: - kref_put(&serial->kref, destroy_serial); + usb_serial_put(serial); return retval; } @@ -268,7 +265,7 @@ static void serial_close(struct tty_struct *tty, struct file * filp) } mutex_unlock(&port->mutex); - kref_put(&port->serial->kref, destroy_serial); + usb_serial_put(port->serial); } static int serial_write (struct tty_struct * tty, const unsigned char *buf, int count) @@ -276,7 +273,7 @@ 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) + if (!port || port->serial->dev->state == USB_STATE_NOTATTACHED) goto exit; dbg("%s - port %d, %d byte(s)", __FUNCTION__, port->number, count); @@ -296,7 +293,7 @@ exit: static int serial_write_room (struct tty_struct *tty) { struct usb_serial_port *port = tty->driver_data; - int retval = -EINVAL; + int retval = -ENODEV; if (!port) goto exit; @@ -318,7 +315,7 @@ exit: static int serial_chars_in_buffer (struct tty_struct *tty) { struct usb_serial_port *port = tty->driver_data; - int retval = -EINVAL; + int retval = -ENODEV; if (!port) goto exit; @@ -467,13 +464,15 @@ static int serial_read_proc (char *page, char **start, off_t off, int count, int length += sprintf (page+length, " path:%s", tmp); length += sprintf (page+length, "\n"); - if ((length + begin) > (off + count)) + if ((length + begin) > (off + count)) { + usb_serial_put(serial); goto done; + } if ((length + begin) < off) { begin += length; length = 0; } - kref_put(&serial->kref, destroy_serial); + usb_serial_put(serial); } *eof = 1; done: @@ -488,19 +487,18 @@ static int serial_tiocmget (struct tty_struct *tty, struct file *file) struct usb_serial_port *port = tty->driver_data; if (!port) - goto exit; + return -ENODEV; dbg("%s - port %d", __FUNCTION__, port->number); if (!port->open_count) { dbg("%s - port not open", __FUNCTION__); - goto exit; + return -ENODEV; } if (port->serial->type->tiocmget) return port->serial->type->tiocmget(port, file); -exit: return -EINVAL; } @@ -510,23 +508,32 @@ static int serial_tiocmset (struct tty_struct *tty, struct file *file, struct usb_serial_port *port = tty->driver_data; if (!port) - goto exit; + return -ENODEV; dbg("%s - port %d", __FUNCTION__, port->number); if (!port->open_count) { dbg("%s - port not open", __FUNCTION__); - goto exit; + return -ENODEV; } if (port->serial->type->tiocmset) return port->serial->type->tiocmset(port, file, set, clear); -exit: return -EINVAL; } -void usb_serial_port_softint(void *private) +/* + * We would be calling tty_wakeup here, but unfortunately some line + * disciplines have an annoying habit of calling tty->write from + * the write wakeup callback (e.g. n_hdlc.c). + */ +void usb_serial_port_softint(struct usb_serial_port *port) +{ + schedule_work(&port->work); +} + +static void usb_serial_port_work(void *private) { struct usb_serial_port *port = private; struct tty_struct *tty; @@ -548,6 +555,11 @@ static void port_release(struct device *dev) struct usb_serial_port *port = to_usb_serial_port(dev); dbg ("%s - %s", __FUNCTION__, dev->bus_id); + port_free(port); +} + +static void port_free(struct usb_serial_port *port) +{ usb_kill_urb(port->read_urb); usb_free_urb(port->read_urb); usb_kill_urb(port->write_urb); @@ -560,6 +572,7 @@ static void port_release(struct device *dev) kfree(port->bulk_out_buffer); kfree(port->interrupt_in_buffer); kfree(port->interrupt_out_buffer); + flush_scheduled_work(); /* port->work */ kfree(port); } @@ -789,7 +802,7 @@ int usb_serial_probe(struct usb_interface *interface, port->serial = serial; spin_lock_init(&port->lock); mutex_init(&port->mutex); - INIT_WORK(&port->work, usb_serial_port_softint, port); + INIT_WORK(&port->work, usb_serial_port_work, port); serial->port[i] = port; } @@ -985,6 +998,7 @@ void usb_serial_disconnect(struct usb_interface *interface) struct device *dev = &interface->dev; struct usb_serial_port *port; + usb_serial_console_disconnect(serial); dbg ("%s", __FUNCTION__); usb_set_intfdata (interface, NULL); @@ -996,7 +1010,7 @@ void usb_serial_disconnect(struct usb_interface *interface) } /* let the last holder of this object * cause it to be cleaned up */ - kref_put(&serial->kref, destroy_serial); + usb_serial_put(serial); } dev_info(dev, "device disconnected\n"); } @@ -1041,13 +1055,12 @@ static int __init usb_serial_init(void) usb_serial_tty_driver->owner = THIS_MODULE; usb_serial_tty_driver->driver_name = "usbserial"; - usb_serial_tty_driver->devfs_name = "usb/tts/"; usb_serial_tty_driver->name = "ttyUSB"; usb_serial_tty_driver->major = SERIAL_TTY_MAJOR; usb_serial_tty_driver->minor_start = 0; usb_serial_tty_driver->type = TTY_DRIVER_TYPE_SERIAL; usb_serial_tty_driver->subtype = SERIAL_TYPE_NORMAL; - usb_serial_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS; + usb_serial_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV; usb_serial_tty_driver->init_termios = tty_std_termios; usb_serial_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; tty_set_operations(usb_serial_tty_driver, &serial_ops); diff --git a/drivers/usb/serial/usb-serial.h b/drivers/usb/serial/usb-serial.h deleted file mode 100644 index dc89d8710..000000000 --- a/drivers/usb/serial/usb-serial.h +++ /dev/null @@ -1,298 +0,0 @@ -/* - * USB Serial Converter driver - * - * Copyright (C) 1999 - 2005 - * Greg Kroah-Hartman (greg@kroah.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. - * - */ - - -#ifndef __LINUX_USB_SERIAL_H -#define __LINUX_USB_SERIAL_H - -#include -#include -#include - -#define SERIAL_TTY_MAJOR 188 /* Nice legal number now */ -#define SERIAL_TTY_MINORS 255 /* loads of devices :) */ - -#define MAX_NUM_PORTS 8 /* The maximum number of ports one device can grab at once */ - -/* parity check flag */ -#define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK)) - -/** - * usb_serial_port: structure for the specific ports of a device. - * @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. - * @mutex: mutex 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. - * @interrupt_in_endpointAddress: endpoint address for the interrupt in pipe - * for this port. - * @interrupt_out_buffer: pointer to the interrupt out buffer for this port. - * @interrupt_out_size: the size of the interrupt_out_buffer, in bytes. - * @interrupt_out_urb: pointer to the interrupt out struct urb for this port. - * @interrupt_out_endpointAddress: endpoint address for the interrupt out pipe - * for this port. - * @bulk_in_buffer: pointer to the bulk in buffer for this port. - * @read_urb: pointer to the bulk in struct urb for this port. - * @bulk_in_endpointAddress: endpoint address for the bulk in pipe for this - * port. - * @bulk_out_buffer: pointer to the bulk out buffer for this port. - * @bulk_out_size: the size of the bulk_out_buffer, in bytes. - * @write_urb: pointer to the bulk out struct urb for this port. - * @bulk_out_endpointAddress: endpoint address for the bulk out pipe for this - * port. - * @write_wait: a wait_queue_head_t used by the port. - * @work: work queue entry for the line discipline waking up. - * @open_count: number of times this port has been opened. - * - * This structure is used by the usb-serial core and drivers for the specific - * ports of a device. - */ -struct usb_serial_port { - struct usb_serial * serial; - struct tty_struct * tty; - spinlock_t lock; - struct mutex mutex; - unsigned char number; - - unsigned char * interrupt_in_buffer; - struct urb * interrupt_in_urb; - __u8 interrupt_in_endpointAddress; - - unsigned char * interrupt_out_buffer; - int interrupt_out_size; - struct urb * interrupt_out_urb; - __u8 interrupt_out_endpointAddress; - - unsigned char * bulk_in_buffer; - int bulk_in_size; - struct urb * read_urb; - __u8 bulk_in_endpointAddress; - - unsigned char * bulk_out_buffer; - int bulk_out_size; - struct urb * write_urb; - int write_urb_busy; - __u8 bulk_out_endpointAddress; - - wait_queue_head_t write_wait; - struct work_struct work; - int open_count; - struct device dev; -}; -#define to_usb_serial_port(d) container_of(d, struct usb_serial_port, dev) - -/* get and set the port private data pointer helper functions */ -static inline void *usb_get_serial_port_data (struct usb_serial_port *port) -{ - return dev_get_drvdata(&port->dev); -} - -static inline void usb_set_serial_port_data (struct usb_serial_port *port, void *data) -{ - dev_set_drvdata(&port->dev, data); -} - -/** - * usb_serial - structure used by the usb-serial core for a device - * @dev: pointer to the struct usb_device for this device - * @type: pointer to the struct usb_serial_driver for this device - * @interface: pointer to the struct usb_interface for this device - * @minor: the starting minor number for this device - * @num_ports: the number of ports this device has - * @num_interrupt_in: number of interrupt in endpoints we have - * @num_interrupt_out: number of interrupt out endpoints we have - * @num_bulk_in: number of bulk in endpoints we have - * @num_bulk_out: number of bulk out endpoints we have - * @port: array of struct usb_serial_port structures for the different ports. - * @private: place to put any driver specific information that is needed. The - * usb-serial driver is required to manage this data, the usb-serial core - * will not touch this. Use usb_get_serial_data() and - * usb_set_serial_data() to access this. - */ -struct usb_serial { - struct usb_device * dev; - struct usb_serial_driver * type; - struct usb_interface * interface; - unsigned char minor; - unsigned char num_ports; - unsigned char num_port_pointers; - char num_interrupt_in; - char num_interrupt_out; - char num_bulk_in; - char num_bulk_out; - struct usb_serial_port * port[MAX_NUM_PORTS]; - struct kref kref; - void * private; -}; -#define to_usb_serial(d) container_of(d, struct usb_serial, kref) - -#define NUM_DONT_CARE (-1) - -/* get and set the serial private data pointer helper functions */ -static inline void *usb_get_serial_data (struct usb_serial *serial) -{ - return serial->private; -} - -static inline void usb_set_serial_data (struct usb_serial *serial, void *data) -{ - serial->private = data; -} - -/** - * usb_serial_driver - describes a usb serial driver - * @description: pointer to a string that describes this driver. This string used - * in the syslog messages when a device is inserted or removed. - * @id_table: pointer to a list of usb_device_id structures that define all - * of the devices this structure can support. - * @num_interrupt_in: the number of interrupt in endpoints this device will - * have. - * @num_interrupt_out: the number of interrupt out endpoints this device will - * have. - * @num_bulk_in: the number of bulk in endpoints this device will have. - * @num_bulk_out: the number of bulk out endpoints this device will have. - * @num_ports: the number of different ports this device will have. - * @calc_num_ports: pointer to a function to determine how many ports this - * device has dynamically. It will be called after the probe() - * callback is called, but before attach() - * @probe: pointer to the driver's probe function. - * This will be called when the device is inserted into the system, - * but before the device has been fully initialized by the usb_serial - * subsystem. Use this function to download any firmware to the device, - * or any other early initialization that might be needed. - * Return 0 to continue on with the initialization sequence. Anything - * else will abort it. - * @attach: pointer to the driver's attach function. - * This will be called when the struct usb_serial structure is fully set - * set up. Do any local initialization of the device, or any private - * memory structure allocation at this point in time. - * @shutdown: pointer to the driver's shutdown function. This will be - * called when the device is removed from the system. - * - * This structure is defines a USB Serial driver. It provides all of - * the information that the USB serial core code needs. If the function - * pointers are defined, then the USB serial core code will call them when - * the corresponding tty port functions are called. If they are not - * called, the generic serial function will be used instead. - * - * The driver.owner field should be set to the module owner of this driver. - * The driver.name field should be set to the name of this driver (remember - * it will show up in sysfs, so it needs to be short and to the point. - * Useing the module name is a good idea.) - */ -struct usb_serial_driver { - const char *description; - const struct usb_device_id *id_table; - char num_interrupt_in; - char num_interrupt_out; - char num_bulk_in; - char num_bulk_out; - char num_ports; - - struct list_head driver_list; - struct device_driver driver; - - int (*probe) (struct usb_serial *serial, const struct usb_device_id *id); - int (*attach) (struct usb_serial *serial); - int (*calc_num_ports) (struct usb_serial *serial); - - void (*shutdown) (struct usb_serial *serial); - - int (*port_probe) (struct usb_serial_port *port); - int (*port_remove) (struct usb_serial_port *port); - - /* serial function calls */ - int (*open) (struct usb_serial_port *port, struct file * filp); - void (*close) (struct usb_serial_port *port, struct file * filp); - int (*write) (struct usb_serial_port *port, const unsigned char *buf, int count); - int (*write_room) (struct usb_serial_port *port); - int (*ioctl) (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg); - void (*set_termios) (struct usb_serial_port *port, struct termios * old); - void (*break_ctl) (struct usb_serial_port *port, int break_state); - int (*chars_in_buffer) (struct usb_serial_port *port); - void (*throttle) (struct usb_serial_port *port); - void (*unthrottle) (struct usb_serial_port *port); - int (*tiocmget) (struct usb_serial_port *port, struct file *file); - int (*tiocmset) (struct usb_serial_port *port, struct file *file, unsigned int set, unsigned int clear); - - void (*read_int_callback)(struct urb *urb, struct pt_regs *regs); - void (*write_int_callback)(struct urb *urb, struct pt_regs *regs); - void (*read_bulk_callback)(struct urb *urb, struct pt_regs *regs); - void (*write_bulk_callback)(struct urb *urb, struct pt_regs *regs); -}; -#define to_usb_serial_driver(d) container_of(d, struct usb_serial_driver, driver) - -extern int usb_serial_register(struct usb_serial_driver *driver); -extern void usb_serial_deregister(struct usb_serial_driver *driver); -extern void usb_serial_port_softint(void *private); - -extern int usb_serial_probe(struct usb_interface *iface, const struct usb_device_id *id); -extern void usb_serial_disconnect(struct usb_interface *iface); - -extern int ezusb_writememory (struct usb_serial *serial, int address, unsigned char *data, int length, __u8 bRequest); -extern int ezusb_set_reset (struct usb_serial *serial, unsigned char reset_bit); - -/* USB Serial console functions */ -#ifdef CONFIG_USB_SERIAL_CONSOLE -extern void usb_serial_console_init (int debug, int minor); -extern void usb_serial_console_exit (void); -#else -static inline void usb_serial_console_init (int debug, int minor) { } -static inline void usb_serial_console_exit (void) { } -#endif - -/* Functions needed by other parts of the usbserial core */ -extern struct usb_serial *usb_serial_get_by_index (unsigned int minor); -extern int usb_serial_generic_open (struct usb_serial_port *port, struct file *filp); -extern int usb_serial_generic_write (struct usb_serial_port *port, const unsigned char *buf, int count); -extern void usb_serial_generic_close (struct usb_serial_port *port, struct file *filp); -extern int usb_serial_generic_write_room (struct usb_serial_port *port); -extern int usb_serial_generic_chars_in_buffer (struct usb_serial_port *port); -extern void usb_serial_generic_read_bulk_callback (struct urb *urb, struct pt_regs *regs); -extern void usb_serial_generic_write_bulk_callback (struct urb *urb, struct pt_regs *regs); -extern void usb_serial_generic_shutdown (struct usb_serial *serial); -extern int usb_serial_generic_register (int debug); -extern void usb_serial_generic_deregister (void); - -extern int usb_serial_bus_register (struct usb_serial_driver *device); -extern void usb_serial_bus_deregister (struct usb_serial_driver *device); - -extern struct usb_serial_driver usb_serial_generic_device; -extern struct bus_type usb_serial_bus_type; -extern struct tty_driver *usb_serial_tty_driver; - -static inline void usb_serial_debug_data(int debug, - struct device *dev, - const char *function, int size, - const unsigned char *data) -{ - int i; - - if (debug) { - dev_printk(KERN_DEBUG, dev, "%s - length = %d, data = ", function, size); - for (i = 0; i < size; ++i) - printk ("%.2x ", data[i]); - printk ("\n"); - } -} - -/* Use our own dbg macro */ -#undef dbg -#define dbg(format, arg...) do { if (debug) printk(KERN_DEBUG "%s: " format "\n" , __FILE__ , ## arg); } while (0) - - - -#endif /* ifdef __LINUX_USB_SERIAL_H */ - diff --git a/drivers/usb/serial/visor.c b/drivers/usb/serial/visor.c index f5c3841d4..88949f788 100644 --- a/drivers/usb/serial/visor.c +++ b/drivers/usb/serial/visor.c @@ -13,7 +13,6 @@ * */ -#include #include #include #include @@ -26,7 +25,7 @@ #include #include #include -#include "usb-serial.h" +#include #include "visor.h" /* @@ -303,7 +302,6 @@ static int visor_open (struct usb_serial_port *port, struct file *filp) spin_lock_irqsave(&priv->lock, flags); priv->bytes_in = 0; priv->bytes_out = 0; - priv->outstanding_urbs = 0; priv->throttled = 0; spin_unlock_irqrestore(&priv->lock, flags); @@ -436,13 +434,25 @@ static int visor_write (struct usb_serial_port *port, const unsigned char *buf, static int visor_write_room (struct usb_serial_port *port) { + struct visor_private *priv = usb_get_serial_port_data(port); + unsigned long flags; + dbg("%s - port %d", __FUNCTION__, port->number); /* * We really can take anything the user throws at us * but let's pick a nice big number to tell the tty - * layer that we have lots of free space + * layer that we have lots of free space, unless we don't. */ + + spin_lock_irqsave(&priv->lock, flags); + if (priv->outstanding_urbs > URB_UPPER_LIMIT * 2 / 3) { + spin_unlock_irqrestore(&priv->lock, flags); + dbg("%s - write limit hit\n", __FUNCTION__); + return 0; + } + spin_unlock_irqrestore(&priv->lock, flags); + return 2048; } @@ -480,7 +490,7 @@ static void visor_write_bulk_callback (struct urb *urb, struct pt_regs *regs) --priv->outstanding_urbs; spin_unlock_irqrestore(&priv->lock, flags); - schedule_work(&port->work); + usb_serial_port_softint(port); } @@ -759,15 +769,22 @@ static int visor_calc_num_ports (struct usb_serial *serial) static int generic_startup(struct usb_serial *serial) { + struct usb_serial_port **ports = serial->port; struct visor_private *priv; int i; for (i = 0; i < serial->num_ports; ++i) { priv = kzalloc (sizeof(*priv), GFP_KERNEL); - if (!priv) + if (!priv) { + while (i-- != 0) { + priv = usb_get_serial_port_data(ports[i]); + usb_set_serial_port_data(ports[i], NULL); + kfree(priv); + } return -ENOMEM; + } spin_lock_init(&priv->lock); - usb_set_serial_port_data(serial->port[i], priv); + usb_set_serial_port_data(ports[i], priv); } return 0; } @@ -877,7 +894,18 @@ static int clie_5_attach (struct usb_serial *serial) static void visor_shutdown (struct usb_serial *serial) { + struct visor_private *priv; + int i; + dbg("%s", __FUNCTION__); + + for (i = 0; i < serial->num_ports; i++) { + priv = usb_get_serial_port_data(serial->port[i]); + if (priv) { + usb_set_serial_port_data(serial->port[i], NULL); + kfree(priv); + } + } } static int visor_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg) diff --git a/drivers/usb/serial/whiteheat.c b/drivers/usb/serial/whiteheat.c index 3ced09ca1..6e6c7934b 100644 --- a/drivers/usb/serial/whiteheat.c +++ b/drivers/usb/serial/whiteheat.c @@ -65,7 +65,6 @@ * */ -#include #include #include #include @@ -80,7 +79,7 @@ #include #include #include -#include "usb-serial.h" +#include #include "whiteheat_fw.h" /* firmware for the ConnectTech WhiteHEAT device */ #include "whiteheat.h" /* WhiteHEAT specific commands */ @@ -686,19 +685,16 @@ static void whiteheat_close(struct usb_serial_port *port, struct file * filp) wrap = list_entry(tmp, struct whiteheat_urb_wrap, list); urb = wrap->urb; usb_kill_urb(urb); - list_del(tmp); - list_add(tmp, &info->rx_urbs_free); - } - list_for_each_safe(tmp, tmp2, &info->rx_urb_q) { - list_del(tmp); - list_add(tmp, &info->rx_urbs_free); + list_move(tmp, &info->rx_urbs_free); } + list_for_each_safe(tmp, tmp2, &info->rx_urb_q) + list_move(tmp, &info->rx_urbs_free); + list_for_each_safe(tmp, tmp2, &info->tx_urbs_submitted) { wrap = list_entry(tmp, struct whiteheat_urb_wrap, list); urb = wrap->urb; usb_kill_urb(urb); - list_del(tmp); - list_add(tmp, &info->tx_urbs_free); + list_move(tmp, &info->tx_urbs_free); } spin_unlock_irqrestore(&info->lock, flags); @@ -1080,8 +1076,7 @@ static void whiteheat_write_callback(struct urb *urb, struct pt_regs *regs) err("%s - Not my urb!", __FUNCTION__); return; } - list_del(&wrap->list); - list_add(&wrap->list, &info->tx_urbs_free); + list_move(&wrap->list, &info->tx_urbs_free); spin_unlock(&info->lock); if (urb->status) { @@ -1089,9 +1084,7 @@ static void whiteheat_write_callback(struct urb *urb, struct pt_regs *regs) return; } - usb_serial_port_softint((void *)port); - - schedule_work(&port->work); + usb_serial_port_softint(port); } @@ -1373,8 +1366,7 @@ static int start_port_read(struct usb_serial_port *port) wrap = list_entry(tmp, struct whiteheat_urb_wrap, list); urb = wrap->urb; usb_kill_urb(urb); - list_del(tmp); - list_add(tmp, &info->rx_urbs_free); + list_move(tmp, &info->rx_urbs_free); } break; } diff --git a/drivers/usb/storage/debug.h b/drivers/usb/storage/debug.h index cd2096acc..77e244a8c 100644 --- a/drivers/usb/storage/debug.h +++ b/drivers/usb/storage/debug.h @@ -44,7 +44,6 @@ #ifndef _DEBUG_H_ #define _DEBUG_H_ -#include #include #define USB_STORAGE "usb-storage: " diff --git a/drivers/usb/storage/dpcm.c b/drivers/usb/storage/dpcm.c index 92b69e4c8..1628cb258 100644 --- a/drivers/usb/storage/dpcm.c +++ b/drivers/usb/storage/dpcm.c @@ -29,7 +29,6 @@ * 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include #include #include diff --git a/drivers/usb/storage/freecom.c b/drivers/usb/storage/freecom.c index 30e96050f..88aa59ab7 100644 --- a/drivers/usb/storage/freecom.c +++ b/drivers/usb/storage/freecom.c @@ -28,7 +28,6 @@ * (http://www.freecom.de/) */ -#include #include #include diff --git a/drivers/usb/storage/initializers.h b/drivers/usb/storage/initializers.h index f9907a5cf..927f77810 100644 --- a/drivers/usb/storage/initializers.h +++ b/drivers/usb/storage/initializers.h @@ -37,7 +37,6 @@ * 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include "usb.h" #include "transport.h" diff --git a/drivers/usb/storage/libusual.c b/drivers/usb/storage/libusual.c index b1ec4a718..38faca734 100644 --- a/drivers/usb/storage/libusual.c +++ b/drivers/usb/storage/libusual.c @@ -5,6 +5,7 @@ */ #include #include +#include #include #include #include @@ -13,6 +14,7 @@ */ #define USU_MOD_FL_THREAD 1 /* Thread is running */ #define USU_MOD_FL_PRESENT 2 /* The module is loaded */ +#define USU_MOD_FL_FAILED 4 /* The module failed to load */ struct mod_status { unsigned long fls; @@ -33,8 +35,12 @@ static DECLARE_MUTEX_LOCKED(usu_init_notify); static DECLARE_COMPLETION(usu_end_notify); static atomic_t total_threads = ATOMIC_INIT(0); +static int usu_kick(unsigned long type); static int usu_probe_thread(void *arg); +static struct class *usu_class; +static struct class_device *usu_class_device; + /* * The table. */ @@ -111,18 +117,44 @@ int usb_usual_check_type(const struct usb_device_id *id, int caller_type) } EXPORT_SYMBOL_GPL(usb_usual_check_type); +/* + */ +static int usu_uevent(struct class_device *class_dev, + char **envp, int num_envp, char *buffer, int buffer_size) +{ + unsigned long flags; + int i; + + for (i = 1; i < 3; i++) { + spin_lock_irqsave(&usu_lock, flags); + if (stat[i].fls & USU_MOD_FL_FAILED) { + stat[i].fls &= ~USU_MOD_FL_FAILED; + spin_unlock_irqrestore(&usu_lock, flags); + usu_kick(i); + } else { + spin_unlock_irqrestore(&usu_lock, flags); + } + } + return 0; +} + /* */ static int usu_probe(struct usb_interface *intf, const struct usb_device_id *id) { unsigned long type; - int rc; - unsigned long flags; type = USB_US_TYPE(id->driver_info); if (type == 0) type = atomic_read(&usu_bias); + return usu_kick(type); +} + +static int usu_kick(unsigned long type) +{ + int rc; + unsigned long flags; spin_lock_irqsave(&usu_lock, flags); if ((stat[type].fls & (USU_MOD_FL_THREAD|USU_MOD_FL_PRESENT)) != 0) { @@ -186,10 +218,14 @@ static int usu_probe_thread(void *arg) if (rc == 0 && (st->fls & USU_MOD_FL_PRESENT) == 0) { /* * This should not happen, but let us keep tabs on it. + * One common source of this a user who builds USB statically, + * then uses initrd, and has a USB device. When static devices + * are probed, request_module() calls a fake modprobe and fails. */ printk(KERN_NOTICE "libusual: " - "modprobe for %s succeeded, but module is not present\n", + "request for %s succeeded, but module is not present\n", bias_names[type]); + st->fls |= USU_MOD_FL_FAILED; } st->fls &= ~USU_MOD_FL_THREAD; spin_unlock_irqrestore(&usu_lock, flags); @@ -203,9 +239,27 @@ static int __init usb_usual_init(void) { int rc; + usu_class = class_create(THIS_MODULE, "libusual"); + if (IS_ERR(usu_class)) { + rc = PTR_ERR(usu_class_device); + goto err_class; + } + usu_class_device = class_device_create(usu_class, NULL, 0, NULL, "0"); + if (IS_ERR(usu_class_device)) { + rc = PTR_ERR(usu_class_device); + goto err_classdev; + } + usu_class_device->uevent = usu_uevent; + rc = usb_register(&usu_driver); up(&usu_init_notify); return rc; + + // class_device_destroy(usu_class, 0); +err_classdev: + class_destroy(usu_class); +err_class: + return rc; } static void __exit usb_usual_exit(void) @@ -221,6 +275,9 @@ static void __exit usb_usual_exit(void) wait_for_completion(&usu_end_notify); atomic_dec(&total_threads); } + + class_device_destroy(usu_class, 0); + class_destroy(usu_class); } /* diff --git a/drivers/usb/storage/onetouch.c b/drivers/usb/storage/onetouch.c index 55ee2d36d..313920d98 100644 --- a/drivers/usb/storage/onetouch.c +++ b/drivers/usb/storage/onetouch.c @@ -28,15 +28,13 @@ * */ -#include #include #include #include #include #include -#include #include -#include +#include #include "usb.h" #include "onetouch.h" #include "debug.h" diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c index 5f11e19ea..a4b7df9ff 100644 --- a/drivers/usb/storage/scsiglue.c +++ b/drivers/usb/storage/scsiglue.c @@ -112,13 +112,11 @@ static int slave_configure(struct scsi_device *sdev) if (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 - * 32 KB at a time. In practice people have found that 64 KB - * works okay and that's what Windows does. But we'll be - * conservative; people can always use the sysfs interface to - * increase max_sectors. */ - if (le16_to_cpu(us->pusb_dev->descriptor.idVendor) == USB_VENDOR_ID_GENESYS && + /* Many devices have trouble transfering more than 32KB at a time, + * while others have trouble with more than 64K. At this time we + * are limiting both to 32K (64 sectores). + */ + if ((us->flags & US_FL_MAX_SECTORS_64) && sdev->request_queue->max_sectors > 64) blk_queue_max_sectors(sdev->request_queue, 64); @@ -286,11 +284,7 @@ static int bus_reset(struct scsi_cmnd *srb) int result; US_DEBUGP("%s called\n", __FUNCTION__); - - mutex_lock(&(us->dev_mutex)); result = usb_stor_port_reset(us); - mutex_unlock(&us->dev_mutex); - return result < 0 ? FAILED : SUCCESS; } diff --git a/drivers/usb/storage/shuttle_usbat.c b/drivers/usb/storage/shuttle_usbat.c index f2bc5c9e2..8fcec01dc 100644 --- a/drivers/usb/storage/shuttle_usbat.c +++ b/drivers/usb/storage/shuttle_usbat.c @@ -131,28 +131,30 @@ static int usbat_write(struct us_data *us, * Convenience function to perform a bulk read */ static int usbat_bulk_read(struct us_data *us, - unsigned char *data, - unsigned int len) + unsigned char *data, + unsigned int len, + int use_sg) { if (len == 0) return USB_STOR_XFER_GOOD; US_DEBUGP("usbat_bulk_read: len = %d\n", len); - return usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe, data, len, NULL); + return usb_stor_bulk_transfer_sg(us, us->recv_bulk_pipe, data, len, use_sg, NULL); } /* * Convenience function to perform a bulk write */ static int usbat_bulk_write(struct us_data *us, - unsigned char *data, - unsigned int len) + unsigned char *data, + unsigned int len, + int use_sg) { if (len == 0) return USB_STOR_XFER_GOOD; US_DEBUGP("usbat_bulk_write: len = %d\n", len); - return usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe, data, len, NULL); + return usb_stor_bulk_transfer_sg(us, us->send_bulk_pipe, data, len, use_sg, NULL); } /* @@ -317,7 +319,8 @@ static int usbat_wait_not_busy(struct us_data *us, int minutes) */ static int usbat_read_block(struct us_data *us, unsigned char *content, - unsigned short len) + unsigned short len, + int use_sg) { int result; unsigned char *command = us->iobuf; @@ -338,7 +341,7 @@ static int usbat_read_block(struct us_data *us, if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_ERROR; - result = usbat_bulk_read(us, content, len); + result = usbat_bulk_read(us, content, len, use_sg); return (result == USB_STOR_XFER_GOOD ? USB_STOR_TRANSPORT_GOOD : USB_STOR_TRANSPORT_ERROR); } @@ -350,7 +353,8 @@ static int usbat_write_block(struct us_data *us, unsigned char access, unsigned char *content, unsigned short len, - int minutes) + int minutes, + int use_sg) { int result; unsigned char *command = us->iobuf; @@ -372,7 +376,7 @@ static int usbat_write_block(struct us_data *us, if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_ERROR; - result = usbat_bulk_write(us, content, len); + result = usbat_bulk_write(us, content, len, use_sg); if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_ERROR; @@ -465,7 +469,7 @@ static int usbat_hp8200e_rw_block_test(struct us_data *us, data[1+(j<<1)] = data_out[j]; } - result = usbat_bulk_write(us, data, num_registers*2); + result = usbat_bulk_write(us, data, num_registers*2, 0); if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_ERROR; @@ -583,7 +587,7 @@ static int usbat_multiple_write(struct us_data *us, } /* Send the data */ - result = usbat_bulk_write(us, data, num_registers*2); + result = usbat_bulk_write(us, data, num_registers*2, 0); if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_ERROR; @@ -606,8 +610,9 @@ static int usbat_multiple_write(struct us_data *us, * other related details) are defined beforehand with _set_shuttle_features(). */ static int usbat_read_blocks(struct us_data *us, - unsigned char *buffer, - int len) + unsigned char *buffer, + int len, + int use_sg) { int result; unsigned char *command = us->iobuf; @@ -627,7 +632,7 @@ static int usbat_read_blocks(struct us_data *us, return USB_STOR_TRANSPORT_FAILED; /* Read the blocks we just asked for */ - result = usbat_bulk_read(us, buffer, len); + result = usbat_bulk_read(us, buffer, len, use_sg); if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_FAILED; @@ -648,7 +653,8 @@ static int usbat_read_blocks(struct us_data *us, */ static int usbat_write_blocks(struct us_data *us, unsigned char *buffer, - int len) + int len, + int use_sg) { int result; unsigned char *command = us->iobuf; @@ -668,7 +674,7 @@ static int usbat_write_blocks(struct us_data *us, return USB_STOR_TRANSPORT_FAILED; /* Write the data */ - result = usbat_bulk_write(us, buffer, len); + result = usbat_bulk_write(us, buffer, len, use_sg); if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_FAILED; @@ -887,22 +893,28 @@ static int usbat_identify_device(struct us_data *us, * Set the transport function based on the device type */ static int usbat_set_transport(struct us_data *us, - struct usbat_info *info) + struct usbat_info *info, + int devicetype) { - int rc; - if (!info->devicetype) { - rc = usbat_identify_device(us, info); - if (rc != USB_STOR_TRANSPORT_GOOD) { - US_DEBUGP("usbat_set_transport: Could not identify device\n"); - return 1; - } - } + if (!info->devicetype) + info->devicetype = devicetype; - if (usbat_get_device_type(us) == USBAT_DEV_HP8200) + if (!info->devicetype) + usbat_identify_device(us, info); + + switch (info->devicetype) { + default: + return USB_STOR_TRANSPORT_ERROR; + + case USBAT_DEV_HP8200: us->transport = usbat_hp8200e_transport; - else if (usbat_get_device_type(us) == USBAT_DEV_FLASH) + break; + + case USBAT_DEV_FLASH: us->transport = usbat_flash_transport; + break; + } return 0; } @@ -947,7 +959,7 @@ static int usbat_flash_get_sector_count(struct us_data *us, msleep(100); /* Read the device identification data */ - rc = usbat_read_block(us, reply, 512); + rc = usbat_read_block(us, reply, 512, 0); if (rc != USB_STOR_TRANSPORT_GOOD) goto leave; @@ -1031,7 +1043,7 @@ static int usbat_flash_read_data(struct us_data *us, goto leave; /* Read the data we just requested */ - result = usbat_read_blocks(us, buffer, len); + result = usbat_read_blocks(us, buffer, len, 0); if (result != USB_STOR_TRANSPORT_GOOD) goto leave; @@ -1125,7 +1137,7 @@ static int usbat_flash_write_data(struct us_data *us, goto leave; /* Write the data */ - result = usbat_write_blocks(us, buffer, len); + result = usbat_write_blocks(us, buffer, len, 0); if (result != USB_STOR_TRANSPORT_GOOD) goto leave; @@ -1310,7 +1322,7 @@ static int usbat_select_and_test_registers(struct us_data *us) /* * Initialize the USBAT processor and the storage device */ -int init_usbat(struct us_data *us) +static int init_usbat(struct us_data *us, int devicetype) { int rc; struct usbat_info *info; @@ -1392,7 +1404,7 @@ int init_usbat(struct us_data *us) US_DEBUGP("INIT 9\n"); /* At this point, we need to detect which device we are using */ - if (usbat_set_transport(us, info)) + if (usbat_set_transport(us, info, devicetype)) return USB_STOR_TRANSPORT_ERROR; US_DEBUGP("INIT 10\n"); @@ -1503,10 +1515,10 @@ static int usbat_hp8200e_transport(struct scsi_cmnd *srb, struct us_data *us) * AT SPEED 4 IS UNRELIABLE!!! */ - if ( (result = usbat_write_block(us, + if ((result = usbat_write_block(us, USBAT_ATA, srb->cmnd, 12, - srb->cmnd[0]==GPCMD_BLANK ? 75 : 10)) != - USB_STOR_TRANSPORT_GOOD) { + (srb->cmnd[0]==GPCMD_BLANK ? 75 : 10), 0) != + USB_STOR_TRANSPORT_GOOD)) { return result; } @@ -1533,7 +1545,7 @@ static int usbat_hp8200e_transport(struct scsi_cmnd *srb, struct us_data *us) len = *status; - result = usbat_read_block(us, srb->request_buffer, len); + result = usbat_read_block(us, srb->request_buffer, len, srb->use_sg); /* Debug-print the first 32 bytes of the transfer */ @@ -1695,6 +1707,22 @@ static int usbat_flash_transport(struct scsi_cmnd * srb, struct us_data *us) return USB_STOR_TRANSPORT_FAILED; } +int init_usbat_cd(struct us_data *us) +{ + return init_usbat(us, USBAT_DEV_HP8200); +} + + +int init_usbat_flash(struct us_data *us) +{ + return init_usbat(us, USBAT_DEV_FLASH); +} + +int init_usbat_probe(struct us_data *us) +{ + return init_usbat(us, 0); +} + /* * Default transport function. Attempts to detect which transport function * should be called, makes it the new default, and calls it. @@ -1708,9 +1736,8 @@ int usbat_transport(struct scsi_cmnd *srb, struct us_data *us) { struct usbat_info *info = (struct usbat_info*) (us->extra); - if (usbat_set_transport(us, info)) + if (usbat_set_transport(us, info, 0)) return USB_STOR_TRANSPORT_ERROR; return us->transport(srb, us); } - diff --git a/drivers/usb/storage/shuttle_usbat.h b/drivers/usb/storage/shuttle_usbat.h index 25e7d8b34..3ddf143a1 100644 --- a/drivers/usb/storage/shuttle_usbat.h +++ b/drivers/usb/storage/shuttle_usbat.h @@ -106,7 +106,9 @@ #define USBAT_FEAT_ET2 0x01 extern int usbat_transport(struct scsi_cmnd *srb, struct us_data *us); -extern int init_usbat(struct us_data *us); +extern int init_usbat_cd(struct us_data *us); +extern int init_usbat_flash(struct us_data *us); +extern int init_usbat_probe(struct us_data *us); struct usbat_info { int devicetype; diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c index 7ca896a34..d6acc92a4 100644 --- a/drivers/usb/storage/transport.c +++ b/drivers/usb/storage/transport.c @@ -45,7 +45,6 @@ * 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include #include #include @@ -115,19 +114,6 @@ static void usb_stor_blocking_completion(struct urb *urb, struct pt_regs *regs) complete(urb_done_ptr); } - -/* This is the timeout handler which will cancel an URB when its timeout - * expires. - */ -static void timeout_handler(unsigned long us_) -{ - struct us_data *us = (struct us_data *) us_; - - if (test_and_clear_bit(US_FLIDX_URB_ACTIVE, &us->flags)) { - US_DEBUGP("Timeout -- cancelling URB\n"); - usb_unlink_urb(us->current_urb); - } -} /* This is the common part of the URB message submission code * @@ -138,7 +124,7 @@ static void timeout_handler(unsigned long us_) static int usb_stor_msg_common(struct us_data *us, int timeout) { struct completion urb_done; - struct timer_list to_timer; + long timeleft; int status; /* don't submit URBs during abort/disconnect processing */ @@ -185,22 +171,17 @@ static int usb_stor_msg_common(struct us_data *us, int timeout) } } - /* submit the timeout timer, if a timeout was requested */ - if (timeout > 0) { - init_timer(&to_timer); - to_timer.expires = jiffies + timeout; - to_timer.function = timeout_handler; - to_timer.data = (unsigned long) us; - add_timer(&to_timer); - } - /* wait for the completion of the URB */ - wait_for_completion(&urb_done); - clear_bit(US_FLIDX_URB_ACTIVE, &us->flags); + timeleft = wait_for_completion_interruptible_timeout( + &urb_done, timeout ? : MAX_SCHEDULE_TIMEOUT); - /* clean up the timeout timer */ - if (timeout > 0) - del_timer_sync(&to_timer); + clear_bit(US_FLIDX_URB_ACTIVE, &us->flags); + + if (timeleft <= 0) { + US_DEBUGP("%s -- cancelling URB\n", + timeleft == 0 ? "Timeout" : "Signal"); + usb_kill_urb(us->current_urb); + } /* return the URB status */ return us->current_urb->status; @@ -721,16 +702,19 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us) * device reset. */ Handle_Errors: - /* Let the SCSI layer know we are doing a reset, set the - * RESETTING bit, and clear the ABORTING bit so that the reset - * may proceed. */ + /* Set the RESETTING bit, and clear the ABORTING bit so that + * the reset may proceed. */ scsi_lock(us_to_host(us)); - usb_stor_report_bus_reset(us); set_bit(US_FLIDX_RESETTING, &us->flags); clear_bit(US_FLIDX_ABORTING, &us->flags); scsi_unlock(us_to_host(us)); + /* We must release the device lock because the pre_reset routine + * will want to acquire it. */ + mutex_unlock(&us->dev_mutex); result = usb_stor_port_reset(us); + mutex_lock(&us->dev_mutex); + if (result < 0) { scsi_lock(us_to_host(us)); usb_stor_report_device_reset(us); @@ -1214,31 +1198,30 @@ int usb_stor_Bulk_reset(struct us_data *us) 0, us->ifnum, NULL, 0); } -/* Issue a USB port reset to the device. But don't do anything if - * there's more than one interface in the device, so that other users - * are not affected. */ +/* Issue a USB port reset to the device. The caller must not hold + * us->dev_mutex. + */ int usb_stor_port_reset(struct us_data *us) { - int result, rc; + int result, rc_lock; - if (test_bit(US_FLIDX_DISCONNECTING, &us->flags)) { - result = -EIO; - US_DEBUGP("No reset during disconnect\n"); - } else if (us->pusb_dev->actconfig->desc.bNumInterfaces != 1) { - result = -EBUSY; - US_DEBUGP("Refusing to reset a multi-interface device\n"); - } else { - result = rc = - usb_lock_device_for_reset(us->pusb_dev, us->pusb_intf); - if (result < 0) { - US_DEBUGP("unable to lock device for reset: %d\n", - result); + result = rc_lock = + usb_lock_device_for_reset(us->pusb_dev, us->pusb_intf); + if (result < 0) + US_DEBUGP("unable to lock device for reset: %d\n", result); + else { + /* Were we disconnected while waiting for the lock? */ + if (test_bit(US_FLIDX_DISCONNECTING, &us->flags)) { + result = -EIO; + US_DEBUGP("No reset during disconnect\n"); } else { - result = usb_reset_device(us->pusb_dev); - if (rc) - usb_unlock_device(us->pusb_dev); - US_DEBUGP("usb_reset_device returns %d\n", result); + result = usb_reset_composite_device( + us->pusb_dev, us->pusb_intf); + US_DEBUGP("usb_reset_composite_device returns %d\n", + result); } + if (rc_lock) + usb_unlock_device(us->pusb_dev); } return result; } diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index a1a83029c..b130e170b 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h @@ -31,7 +31,6 @@ * the following thing for it to work: * The macro UNUSUAL_DEV() must be defined before this file is included */ -#include /* If you edit this file, please try to keep it sorted first by VendorID, * then by ProductID. @@ -78,12 +77,12 @@ UNUSUAL_DEV( 0x03f0, 0x0107, 0x0200, 0x0200, UNUSUAL_DEV( 0x03f0, 0x0207, 0x0001, 0x0001, "HP", "CD-Writer+ 8200e", - US_SC_8070, US_PR_USBAT, init_usbat, 0), + US_SC_8070, US_PR_USBAT, init_usbat_cd, 0), UNUSUAL_DEV( 0x03f0, 0x0307, 0x0001, 0x0001, "HP", "CD-Writer+ CD-4e", - US_SC_8070, US_PR_USBAT, init_usbat, 0), + US_SC_8070, US_PR_USBAT, init_usbat_cd, 0), #endif /* Reported by Sebastian Kapfer @@ -113,11 +112,18 @@ UNUSUAL_DEV( 0x0411, 0x001c, 0x0113, 0x0113, US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_INQUIRY ), +/* Submitted by Ernestas Vaiciukevicius */ +UNUSUAL_DEV( 0x0419, 0x0100, 0x0100, 0x0100, + "Samsung Info. Systems America, Inc.", + "MP3 Player", + US_SC_DEVICE, US_PR_DEVICE, NULL, + US_FL_IGNORE_RESIDUE ), + /* Reported by Orgad Shaneh */ UNUSUAL_DEV( 0x0419, 0xaace, 0x0100, 0x0100, "Samsung", "MP3 Player", US_SC_DEVICE, US_PR_DEVICE, NULL, - US_FL_IGNORE_RESIDUE), + US_FL_IGNORE_RESIDUE ), /* Reported by Christian Leber */ UNUSUAL_DEV( 0x0419, 0xaaf5, 0x0100, 0x0100, @@ -139,6 +145,36 @@ UNUSUAL_DEV( 0x0420, 0x0001, 0x0100, 0x0100, US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_IGNORE_RESIDUE ), +/* Reported by Mario Rettig */ +UNUSUAL_DEV( 0x0421, 0x042e, 0x0100, 0x0100, + "Nokia", + "Nokia 3250", + US_SC_DEVICE, US_PR_DEVICE, NULL, + US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ), + +/* Reported by Sumedha Swamy and + * Einar Th. Einarsson */ +UNUSUAL_DEV( 0x0421, 0x0444, 0x0100, 0x0100, + "Nokia", + "N91", + US_SC_DEVICE, US_PR_DEVICE, NULL, + US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ), + +/* Reported by Jiri Slaby and + * Rene C. Castberg */ +UNUSUAL_DEV( 0x0421, 0x0446, 0x0100, 0x0100, + "Nokia", + "N80", + US_SC_DEVICE, US_PR_DEVICE, NULL, + US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ), + +/* Reported by Matthew Bloch */ +UNUSUAL_DEV( 0x0421, 0x044e, 0x0100, 0x0100, + "Nokia", + "E61", + US_SC_DEVICE, US_PR_DEVICE, NULL, + US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ), + /* Reported by Olaf Hering from novell bug #105878 */ UNUSUAL_DEV( 0x0424, 0x0fdc, 0x0210, 0x0210, "SMSC", @@ -205,16 +241,6 @@ UNUSUAL_DEV( 0x0482, 0x0103, 0x0100, 0x0100, "Finecam S5", US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_INQUIRY), -/* Patch for Kyocera Finecam L3 - * Submitted by Michael Krauth - * and Alessandro Fracchetti - */ -UNUSUAL_DEV( 0x0482, 0x0105, 0x0100, 0x0100, - "Kyocera", - "Finecam L3", - US_SC_SCSI, US_PR_BULK, NULL, - US_FL_FIX_INQUIRY), - /* Reported by Paul Stewart * This entry is needed because the device reports Sub=ff */ UNUSUAL_DEV( 0x04a4, 0x0004, 0x0001, 0x0001, @@ -222,6 +248,14 @@ UNUSUAL_DEV( 0x04a4, 0x0004, 0x0001, 0x0001, "DVD-CAM DZ-MV100A Camcorder", US_SC_SCSI, US_PR_CB, NULL, US_FL_SINGLE_LUN), +/* Patch for Nikon coolpix 2000 + * Submitted by Fabien Cosse */ +UNUSUAL_DEV( 0x04b0, 0x0301, 0x0010, 0x0010, + "NIKON", + "NIKON DSC E2000", + US_SC_DEVICE, US_PR_DEVICE,NULL, + US_FL_NOT_LOCKABLE ), + /* Reported by Andreas Bockhold */ UNUSUAL_DEV( 0x04b0, 0x0405, 0x0100, 0x0100, "NIKON", @@ -229,13 +263,12 @@ 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 */ -UNUSUAL_DEV( 0x04b0, 0x0301, 0x0010, 0x0010, +/* Reported by Jamie Kitson */ +UNUSUAL_DEV( 0x04b0, 0x040d, 0x0100, 0x0100, "NIKON", - "NIKON DSC E2000", - US_SC_DEVICE, US_PR_DEVICE,NULL, - US_FL_NOT_LOCKABLE ), + "NIKON DSC D70s", + US_SC_DEVICE, US_PR_DEVICE, NULL, + US_FL_FIX_CAPACITY), /* BENQ DC5330 * Reported by Manuel Fombuena and @@ -399,7 +432,7 @@ UNUSUAL_DEV( 0x04fc, 0x80c2, 0x0100, 0x0100, UNUSUAL_DEV( 0x04e6, 0x1010, 0x0000, 0x9999, "Shuttle/SCM", "USBAT-02", - US_SC_SCSI, US_PR_USBAT, init_usbat, + US_SC_SCSI, US_PR_USBAT, init_usbat_flash, US_FL_SINGLE_LUN), #endif @@ -465,10 +498,11 @@ UNUSUAL_DEV( 0x054c, 0x0010, 0x0106, 0x0450, US_SC_SCSI, US_PR_DEVICE, NULL, US_FL_SINGLE_LUN | US_FL_NOT_LOCKABLE | US_FL_NO_WP_DETECT ), -/* This entry is needed because the device reports Sub=ff */ -UNUSUAL_DEV( 0x054c, 0x0010, 0x0500, 0x0600, +/* Submitted by Lars Jacob + * This entry is needed because the device reports Sub=ff */ +UNUSUAL_DEV( 0x054c, 0x0010, 0x0500, 0x0610, "Sony", - "DSC-T1/T5", + "DSC-T1/T5/H5", US_SC_8070, US_PR_DEVICE, NULL, US_FL_SINGLE_LUN ), @@ -555,6 +589,13 @@ UNUSUAL_DEV( 0x054c, 0x0099, 0x0000, 0x9999, US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_INQUIRY ), +/* floppy reports multiple luns */ +UNUSUAL_DEV( 0x055d, 0x2020, 0x0000, 0x0210, + "SAMSUNG", + "SFD-321U [FW 0C]", + US_SC_DEVICE, US_PR_DEVICE, NULL, + US_FL_SINGLE_LUN ), + UNUSUAL_DEV( 0x057b, 0x0000, 0x0000, 0x0299, "Y-E Data", @@ -590,18 +631,6 @@ UNUSUAL_DEV( 0x0595, 0x4343, 0x0000, 0x2210, "Digital Camera EX-20 DSC", US_SC_8070, US_PR_DEVICE, NULL, 0 ), -/* The entry was here before I took over, and had US_SC_RBC. It turns - * out that isn't needed. Additionally, Torsten Eriksson - * is able to use his device fine - * without this entry at all - but I don't suspect that will be true - * for all users (the protocol is likely needed), so is staying at - * this time. - Phil Dibowitz - */ -UNUSUAL_DEV( 0x059f, 0xa601, 0x0200, 0x0200, - "LaCie", - "USB Hard Disk", - US_SC_DEVICE, US_PR_CB, NULL, 0 ), - /* Submitted by Joel Bourquard * Some versions of this device need the SubClass and Protocol overrides * while others don't. @@ -700,18 +729,22 @@ UNUSUAL_DEV( 0x05dc, 0xb002, 0x0000, 0x0113, * They were originally reported by Alexander Oltu * and Peter Marks * respectively. + * + * US_FL_GO_SLOW and US_FL_MAX_SECTORS_64 added by Phil Dibowitz + * as these flags were made and hard-coded + * special-cases were pulled from scsiglue.c. */ UNUSUAL_DEV( 0x05e3, 0x0701, 0x0000, 0xffff, "Genesys Logic", "USB to IDE Optical", US_SC_DEVICE, US_PR_DEVICE, NULL, - US_FL_GO_SLOW ), + US_FL_GO_SLOW | US_FL_MAX_SECTORS_64 ), UNUSUAL_DEV( 0x05e3, 0x0702, 0x0000, 0xffff, "Genesys Logic", "USB to IDE Disk", US_SC_DEVICE, US_PR_DEVICE, NULL, - US_FL_GO_SLOW ), + US_FL_GO_SLOW | US_FL_MAX_SECTORS_64 ), /* Reported by Hanno Boeck * Taken from the Lycoris Kernel */ @@ -803,7 +836,7 @@ UNUSUAL_DEV( 0x0781, 0x0002, 0x0009, 0x0009, UNUSUAL_DEV( 0x0781, 0x0005, 0x0005, 0x0005, "Sandisk", "ImageMate SDDR-05b", - US_SC_SCSI, US_PR_USBAT, init_usbat, + US_SC_SCSI, US_PR_USBAT, init_usbat_flash, US_FL_SINGLE_LUN ), #endif @@ -1065,7 +1098,15 @@ UNUSUAL_DEV( 0x0a17, 0x006, 0x0000, 0xffff, "Optio S/S4", US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_INQUIRY ), - + +/* This is a virtual windows driver CD, which the zd1211rw driver automatically + * converts into a WLAN device. */ +UNUSUAL_DEV( 0x0ace, 0x2011, 0x0101, 0x0101, + "ZyXEL", + "G-220F USB-WLAN Install", + US_SC_DEVICE, US_PR_DEVICE, NULL, + US_FL_IGNORE_DEVICE ), + #ifdef CONFIG_USB_STORAGE_ISD200 UNUSUAL_DEV( 0x0bf6, 0xa001, 0x0100, 0x0110, "ATI", @@ -1188,6 +1229,24 @@ UNUSUAL_DEV( 0x0ea0, 0x6828, 0x0110, 0x0110, US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_IGNORE_RESIDUE ), +/* Reported by Benjamin Schiller + * It is also sold by Easylite as DJ 20 */ +UNUSUAL_DEV( 0x0ed1, 0x7636, 0x0103, 0x0103, + "Typhoon", + "My DJ 1820", + US_SC_DEVICE, US_PR_DEVICE, NULL, + US_FL_IGNORE_RESIDUE | US_FL_GO_SLOW | US_FL_MAX_SECTORS_64), + +/* David Kuehling : + * for MP3-Player AVOX WSX-300ER (bought in Japan). Reports lots of SCSI + * errors when trying to write. + */ +UNUSUAL_DEV( 0x0f19, 0x0105, 0x0100, 0x0100, + "C-MEX", + "A-VOX", + US_SC_DEVICE, US_PR_DEVICE, NULL, + US_FL_IGNORE_RESIDUE ), + /* Reported by Michael Stattmann */ UNUSUAL_DEV( 0x0fce, 0xd008, 0x0000, 0x0000, "Sony Ericsson", @@ -1195,11 +1254,18 @@ UNUSUAL_DEV( 0x0fce, 0xd008, 0x0000, 0x0000, US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_NO_WP_DETECT ), +/* Reported by Emmanuel Vasilakis */ +UNUSUAL_DEV( 0x0fce, 0xe031, 0x0000, 0x0000, + "Sony Ericsson", + "M600i", + US_SC_DEVICE, US_PR_DEVICE, NULL, + US_FL_FIX_CAPACITY ), + /* Reported by Kevin Cernekee * Tested on hardware version 1.10. * Entry is needed only for the initializer function override. */ -UNUSUAL_DEV( 0x1019, 0x0c55, 0x0000, 0x9999, +UNUSUAL_DEV( 0x1019, 0x0c55, 0x0110, 0x0110, "Desknote", "UCR-61S2B", US_SC_DEVICE, US_PR_DEVICE, usb_stor_ucr61s2b_init, @@ -1219,6 +1285,15 @@ UNUSUAL_DEV( 0x1370, 0x6828, 0x0110, 0x0110, US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_IGNORE_RESIDUE ), +/* patch submitted by Davide Perini + * and Renato Perini + */ +UNUSUAL_DEV( 0x22b8, 0x3010, 0x0001, 0x0001, + "Motorola", + "RAZR V3x", + US_SC_DEVICE, US_PR_DEVICE, NULL, + US_FL_FIX_CAPACITY | US_FL_IGNORE_RESIDUE ), + /* Reported by Radovan Garabik */ UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999, "MPIO", diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c index 0142fe82f..8d7bdcb59 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c @@ -47,7 +47,6 @@ * 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include #include #include @@ -56,6 +55,7 @@ #include #include #include +#include #include #include @@ -220,6 +220,37 @@ static int storage_resume(struct usb_interface *iface) #endif /* CONFIG_PM */ +/* + * The next two routines get called just before and just after + * a USB port reset, whether from this driver or a different one. + */ + +static void storage_pre_reset(struct usb_interface *iface) +{ + struct us_data *us = usb_get_intfdata(iface); + + US_DEBUGP("%s\n", __FUNCTION__); + + /* Make sure no command runs during the reset */ + mutex_lock(&us->dev_mutex); +} + +static void storage_post_reset(struct usb_interface *iface) +{ + struct us_data *us = usb_get_intfdata(iface); + + US_DEBUGP("%s\n", __FUNCTION__); + + /* Report the reset to the SCSI core */ + scsi_lock(us_to_host(us)); + usb_stor_report_bus_reset(us); + scsi_unlock(us_to_host(us)); + + /* FIXME: Notify the subdrivers that they need to reinitialize + * the device */ + mutex_unlock(&us->dev_mutex); +} + /* * fill_inquiry_response takes an unsigned char array (which must * be at least 36 characters) and populates the vendor name, @@ -343,8 +374,12 @@ static int usb_stor_control_thread(void * __us) /* lock access to the state */ scsi_lock(host); + /* did the command already complete because of a disconnect? */ + if (!us->srb) + ; /* nothing to do */ + /* indicate that the command is done */ - if (us->srb->result != DID_ABORT << 16) { + else if (us->srb->result != DID_ABORT << 16) { US_DEBUGP("scsi cmd done, result=0x%x\n", us->srb->result); us->srb->scsi_done(us->srb); @@ -448,7 +483,7 @@ static struct us_unusual_dev *find_unusual(const struct usb_device_id *id) } /* Get the unusual_devs entries and the string descriptors */ -static void get_device_info(struct us_data *us, const struct usb_device_id *id) +static int 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 = @@ -465,6 +500,11 @@ static void get_device_info(struct us_data *us, const struct usb_device_id *id) unusual_dev->useTransport; us->flags = USB_US_ORIG_FLAGS(id->driver_info); + if (us->flags & US_FL_IGNORE_DEVICE) { + printk(KERN_INFO USB_STORAGE "device ignored\n"); + return -ENODEV; + } + /* * This flag is only needed when we're in high-speed, so let's * disable it if we're in full-speed @@ -494,7 +534,8 @@ static void get_device_info(struct us_data *us, const struct usb_device_id *id) 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" + " has %s in unusual_devs.h (kernel" + " %s)\n" " Please send a copy of this message to " "\n", le16_to_cpu(ddesc->idVendor), @@ -502,8 +543,11 @@ static void get_device_info(struct us_data *us, const struct usb_device_id *id) le16_to_cpu(ddesc->bcdDevice), idesc->bInterfaceSubClass, idesc->bInterfaceProtocol, - msgs[msg]); + msgs[msg], + UTS_RELEASE); } + + return 0; } /* Get the transport settings */ @@ -806,32 +850,34 @@ static void dissociate_dev(struct us_data *us) * the host */ static void quiesce_and_remove_host(struct us_data *us) { + struct Scsi_Host *host = us_to_host(us); + /* Prevent new USB transfers, stop the current command, and * interrupt a SCSI-scan or device-reset delay */ + scsi_lock(host); set_bit(US_FLIDX_DISCONNECTING, &us->flags); + scsi_unlock(host); usb_stor_stop_transport(us); wake_up(&us->delay_wait); /* It doesn't matter if the SCSI-scanning thread is still running. * The thread will exit when it sees the DISCONNECTING flag. */ - /* Wait for the current command to finish, then remove the host */ - mutex_lock(&us->dev_mutex); - mutex_unlock(&us->dev_mutex); - /* queuecommand won't accept any new commands and the control * thread won't execute a previously-queued command. If there * is such a command pending, complete it with an error. */ + mutex_lock(&us->dev_mutex); if (us->srb) { us->srb->result = DID_NO_CONNECT << 16; - scsi_lock(us_to_host(us)); + scsi_lock(host); us->srb->scsi_done(us->srb); us->srb = NULL; - scsi_unlock(us_to_host(us)); + scsi_unlock(host); } + mutex_unlock(&us->dev_mutex); /* Now we own no commands so it's safe to remove the SCSI host */ - scsi_remove_host(us_to_host(us)); + scsi_remove_host(host); } /* Second stage of disconnect processing: deallocate all resources */ @@ -930,7 +976,9 @@ 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); + result = get_device_info(us, id); + if (result) + goto BadDevice; /* Get the transport, protocol, and pipe settings */ result = get_transport(us); @@ -1002,6 +1050,8 @@ static struct usb_driver usb_storage_driver = { .suspend = storage_suspend, .resume = storage_resume, #endif + .pre_reset = storage_pre_reset, + .post_reset = storage_post_reset, .id_table = storage_usb_ids, }; diff --git a/drivers/usb/storage/usb.h b/drivers/usb/storage/usb.h index 009fb0953..21f3ddbc9 100644 --- a/drivers/usb/storage/usb.h +++ b/drivers/usb/storage/usb.h @@ -160,10 +160,10 @@ struct us_data { }; /* Convert between us_data and the corresponding Scsi_Host */ -static struct Scsi_Host inline *us_to_host(struct us_data *us) { +static inline struct Scsi_Host *us_to_host(struct us_data *us) { return container_of((void *) us, struct Scsi_Host, hostdata); } -static struct us_data inline *host_to_us(struct Scsi_Host *host) { +static inline struct us_data *host_to_us(struct Scsi_Host *host) { return (struct us_data *) host->hostdata; } @@ -176,8 +176,4 @@ extern void fill_inquiry_response(struct us_data *us, #define scsi_unlock(host) spin_unlock_irq(host->host_lock) #define scsi_lock(host) spin_lock_irq(host->host_lock) - -/* Vendor ID list for devices that require special handling */ -#define USB_VENDOR_ID_GENESYS 0x05e3 /* Genesys Logic */ - #endif diff --git a/drivers/usb/usb-skeleton.c b/drivers/usb/usb-skeleton.c index 4de9fb56e..b36203979 100644 --- a/drivers/usb/usb-skeleton.c +++ b/drivers/usb/usb-skeleton.c @@ -13,7 +13,6 @@ * */ -#include #include #include #include diff --git a/drivers/video/68328fb.c b/drivers/video/68328fb.c index 78488bb41..0dda73da8 100644 --- a/drivers/video/68328fb.c +++ b/drivers/video/68328fb.c @@ -32,7 +32,6 @@ #include #include #include -#include #include #include #include diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index 2fd9ab7f4..702eb933c 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig @@ -4,6 +4,21 @@ menu "Graphics support" +config FIRMWARE_EDID + bool "Enable firmware EDID" + default y + ---help--- + This enables access to the EDID transferred from the firmware. + On the i386, this is from the Video BIOS. Enable this if DDC/I2C + transfers do not work for your driver and if you are using + nvidiafb, i810fb or savagefb. + + In general, choosing Y for this option is safe. If you + experience extremely long delays while booting before you get + something on your display, try setting this to N. Matrox cards in + combination with certain motherboards and monitors are known to + suffer from this problem. + config FB tristate "Support for frame buffer devices" ---help--- @@ -70,21 +85,12 @@ config FB_MACMODES depends on FB default n -config FB_FIRMWARE_EDID - bool "Enable firmware EDID" - depends on FB - default y - ---help--- - This enables access to the EDID transferred from the firmware. - On the i386, this is from the Video BIOS. Enable this if DDC/I2C - transfers do not work for your driver and if you are using - nvidiafb, i810fb or savagefb. - - In general, choosing Y for this option is safe. If you - experience extremely long delays while booting before you get - something on your display, try setting this to N. Matrox cards in - combination with certain motherboards and monitors are known to - suffer from this problem. +config FB_BACKLIGHT + bool + depends on FB + select BACKLIGHT_LCD_SUPPORT + select BACKLIGHT_CLASS_DEVICE + default n config FB_MODE_HELPERS bool "Enable Video Mode Handling Helpers" @@ -167,6 +173,69 @@ config FB_ARMCLCD here and read . The module will be called amba-clcd. +choice + + depends on FB_ARMCLCD && (ARCH_LH7A40X || ARCH_LH7952X) + prompt "LCD Panel" + default FB_ARMCLCD_SHARP_LQ035Q7DB02 + +config FB_ARMCLCD_SHARP_LQ035Q7DB02_HRTFT + bool "LogicPD LCD 3.5\" QVGA w/HRTFT IC" + help + This is an implementation of the Sharp LQ035Q7DB02, a 3.5" + color QVGA, HRTFT panel. The LogicPD device includes an + an integrated HRTFT controller IC. + The native resolution is 240x320. + +config FB_ARMCLCD_SHARP_LQ057Q3DC02 + bool "LogicPD LCD 5.7\" QVGA" + help + This is an implementation of the Sharp LQ057Q3DC02, a 5.7" + color QVGA, TFT panel. The LogicPD device includes an + The native resolution is 320x240. + +config FB_ARMCLCD_SHARP_LQ64D343 + bool "LogicPD LCD 6.4\" VGA" + help + This is an implementation of the Sharp LQ64D343, a 6.4" + color VGA, TFT panel. The LogicPD device includes an + The native resolution is 640x480. + +config FB_ARMCLCD_SHARP_LQ10D368 + bool "LogicPD LCD 10.4\" VGA" + help + This is an implementation of the Sharp LQ10D368, a 10.4" + color VGA, TFT panel. The LogicPD device includes an + The native resolution is 640x480. + + +config FB_ARMCLCD_SHARP_LQ121S1DG41 + bool "LogicPD LCD 12.1\" SVGA" + help + This is an implementation of the Sharp LQ121S1DG41, a 12.1" + color SVGA, TFT panel. The LogicPD device includes an + The native resolution is 800x600. + + This panel requires a clock rate may be an integer fraction + of the base LCDCLK frequency. The driver will select the + highest frequency available that is lower than the maximum + allowed. The panel may flicker if the clock rate is + slower than the recommended minimum. + +config FB_ARMCLCD_AUO_A070VW01_WIDE + bool "AU Optronics A070VW01 LCD 7.0\" WIDE" + help + This is an implementation of the AU Optronics, a 7.0" + WIDE Color. The native resolution is 234x480. + +config FB_ARMCLCD_HITACHI + bool "Hitachi Wide Screen 800x480" + help + This is an implementation of the Hitachi 800x480. + +endchoice + + config FB_ACORN bool "Acorn VIDC support" depends on (FB = y) && ARM && (ARCH_ACORN || ARCH_CLPS7500) @@ -353,7 +422,7 @@ config FB_OF config FB_CONTROL bool "Apple \"control\" display support" - depends on (FB = y) && PPC_PMAC + depends on (FB = y) && PPC_PMAC && PPC32 select FB_CFB_FILLRECT select FB_CFB_COPYAREA select FB_CFB_IMAGEBLIT @@ -364,7 +433,7 @@ config FB_CONTROL config FB_PLATINUM bool "Apple \"platinum\" display support" - depends on (FB = y) && PPC_PMAC + depends on (FB = y) && PPC_PMAC && PPC32 select FB_CFB_FILLRECT select FB_CFB_COPYAREA select FB_CFB_IMAGEBLIT @@ -375,7 +444,7 @@ config FB_PLATINUM config FB_VALKYRIE bool "Apple \"valkyrie\" display support" - depends on (FB = y) && (MAC || PPC_PMAC) + depends on (FB = y) && (MAC || (PPC_PMAC && PPC32)) select FB_CFB_FILLRECT select FB_CFB_COPYAREA select FB_CFB_IMAGEBLIT @@ -386,7 +455,7 @@ config FB_VALKYRIE config FB_CT65550 bool "Chips 65550 display support" - depends on (FB = y) && PPC + depends on (FB = y) && PPC32 select FB_CFB_FILLRECT select FB_CFB_COPYAREA select FB_CFB_IMAGEBLIT @@ -483,10 +552,14 @@ config FB_VESA You will get a boot time penguin logo at no additional cost. Please read . If unsure, say Y. -config VIDEO_SELECT - bool - depends on FB_VESA - default y +config FB_IMAC + bool "Intel-based Macintosh Framebuffer Support" + depends on (FB = y) && X86 && EFI + select FB_CFB_FILLRECT + select FB_CFB_COPYAREA + select FB_CFB_IMAGEBLIT + help + This is the frame buffer device driver for the Intel-based Macintosh config FB_HGA tristate "Hercules mono graphics support" @@ -510,12 +583,6 @@ config FB_HGA_ACCEL This will compile the Hercules mono graphics with acceleration functions. - -config VIDEO_SELECT - bool - depends on (FB = y) && X86 && !XEN - default y - config FB_SGIVW tristate "SGI Visual Workstation framebuffer support" depends on FB && X86_VISWS @@ -654,6 +721,14 @@ config FB_NVIDIA_I2C independently validate video mode parameters, you should say Y here. +config FB_NVIDIA_BACKLIGHT + bool "Support for backlight control" + depends on FB_NVIDIA && PMAC_BACKLIGHT + select FB_BACKLIGHT + default y + help + Say Y here if you want to control the backlight of your display. + config FB_RIVA tristate "nVidia Riva support" depends on FB && PCI @@ -692,6 +767,14 @@ config FB_RIVA_DEBUG of debugging informations to provide to the maintainer when something goes wrong. +config FB_RIVA_BACKLIGHT + bool "Support for backlight control" + depends on FB_RIVA && PMAC_BACKLIGHT + select FB_BACKLIGHT + default y + help + Say Y here if you want to control the backlight of your display. + config FB_I810 tristate "Intel 810/815 support (EXPERIMENTAL)" depends on FB && EXPERIMENTAL && PCI && X86_32 @@ -743,7 +826,7 @@ config FB_I810_I2C config FB_INTEL tristate "Intel 830M/845G/852GM/855GM/865G support (EXPERIMENTAL)" - depends on FB && EXPERIMENTAL && PCI && X86_32 + depends on FB && EXPERIMENTAL && PCI && X86 select AGP select AGP_INTEL select FB_MODE_HELPERS @@ -930,6 +1013,7 @@ config FB_RADEON There is a product page at http://apps.ati.com/ATIcompare/ + config FB_RADEON_I2C bool "DDC/I2C for ATI Radeon support" depends on FB_RADEON @@ -937,6 +1021,14 @@ config FB_RADEON_I2C help Say Y here if you want DDC/I2C support for your Radeon board. +config FB_RADEON_BACKLIGHT + bool "Support for backlight control" + depends on FB_RADEON && PMAC_BACKLIGHT + select FB_BACKLIGHT + default y + help + Say Y here if you want to control the backlight of your display. + config FB_RADEON_DEBUG bool "Lots of debug output from Radeon driver" depends on FB_RADEON @@ -961,6 +1053,14 @@ config FB_ATY128 To compile this driver as a module, choose M here: the module will be called aty128fb. +config FB_ATY128_BACKLIGHT + bool "Support for backlight control" + depends on FB_ATY128 && PMAC_BACKLIGHT + select FB_BACKLIGHT + default y + help + Say Y here if you want to control the backlight of your display. + config FB_ATY tristate "ATI Mach64 display support" if PCI || ATARI depends on FB && !SPARC32 @@ -1003,6 +1103,14 @@ config FB_ATY_GX is at . +config FB_ATY_BACKLIGHT + bool "Support for backlight control" + depends on FB_ATY && PMAC_BACKLIGHT + select FB_BACKLIGHT + default y + help + Say Y here if you want to control the backlight of your display. + config FB_S3TRIO bool "S3 Trio display support" depends on (FB = y) && PPC && BROKEN @@ -1402,6 +1510,26 @@ config FB_PXA_PARAMETERS describes the available parameters. +config FB_MBX + tristate "2700G LCD framebuffer support" + depends on FB && ARCH_PXA + select FB_CFB_FILLRECT + select FB_CFB_COPYAREA + select FB_CFB_IMAGEBLIT + ---help--- + Framebuffer driver for the Intel 2700G (Marathon) Graphics + Accelerator + +config FB_MBX_DEBUG + bool "Enable debugging info via debugfs" + depends on FB_MBX && DEBUG_FS + default n + ---help--- + Enable this if you want debugging information using the debug + filesystem (debugfs) + + If unsure, say N. + config FB_W100 tristate "W100 frame buffer support" depends on FB && PXA_SHARPSL @@ -1441,6 +1569,21 @@ config FB_S3C2410_DEBUG Turn on debugging messages. Note that you can set/unset at run time through sysfs +config FB_PNX4008_DUM + tristate "Display Update Module support on Philips PNX4008 board" + depends on FB && ARCH_PNX4008 + ---help--- + Say Y here to enable support for PNX4008 Display Update Module (DUM) + +config FB_PNX4008_DUM_RGB + tristate "RGB Framebuffer support on Philips PNX4008 board" + depends on FB_PNX4008_DUM + select FB_CFB_FILLRECT + select FB_CFB_COPYAREA + select FB_CFB_IMAGEBLIT + ---help--- + Say Y here to enable support for PNX4008 RGB Framebuffer + config FB_VIRTUAL tristate "Virtual Frame Buffer support (ONLY FOR TESTING!)" depends on FB @@ -1469,7 +1612,7 @@ if FB || SGI_NEWPORT_CONSOLE source "drivers/video/logo/Kconfig" endif -if FB && SYSFS +if SYSFS source "drivers/video/backlight/Kconfig" endif diff --git a/drivers/video/Makefile b/drivers/video/Makefile index 23de3b2c7..481c6c969 100644 --- a/drivers/video/Makefile +++ b/drivers/video/Makefile @@ -4,15 +4,16 @@ # Each configuration option enables a list of files. -obj-$(CONFIG_VT) += console/ -obj-$(CONFIG_LOGO) += logo/ -obj-$(CONFIG_SYSFS) += backlight/ - +obj-y += fb_notify.o obj-$(CONFIG_FB) += fb.o fb-y := fbmem.o fbmon.o fbcmap.o fbsysfs.o \ modedb.o fbcvt.o fb-objs := $(fb-y) +obj-$(CONFIG_VT) += console/ +obj-$(CONFIG_LOGO) += logo/ +obj-$(CONFIG_SYSFS) += backlight/ + obj-$(CONFIG_FB_CFB_FILLRECT) += cfbfillrect.o obj-$(CONFIG_FB_CFB_COPYAREA) += cfbcopyarea.o obj-$(CONFIG_FB_CFB_IMAGEBLIT) += cfbimgblt.o @@ -38,6 +39,7 @@ obj-$(CONFIG_FB_SIS) += sis/ obj-$(CONFIG_FB_KYRO) += kyro/ obj-$(CONFIG_FB_SAVAGE) += savage/ obj-$(CONFIG_FB_GEODE) += geode/ +obj-$(CONFIG_FB_MBX) += mbx/ obj-$(CONFIG_FB_I810) += vgastate.o obj-$(CONFIG_FB_NEOMAGIC) += neofb.o vgastate.o obj-$(CONFIG_FB_VIRGE) += virgefb.o @@ -94,9 +96,12 @@ obj-$(CONFIG_FB_TX3912) += tx3912fb.o obj-$(CONFIG_FB_S1D13XXX) += s1d13xxxfb.o obj-$(CONFIG_FB_IMX) += imxfb.o obj-$(CONFIG_FB_S3C2410) += s3c2410fb.o +obj-$(CONFIG_FB_PNX4008_DUM) += pnx4008/ +obj-$(CONFIG_FB_PNX4008_DUM_RGB) += pnx4008/ # Platform or fallback drivers go here obj-$(CONFIG_FB_VESA) += vesafb.o +obj-$(CONFIG_FB_IMAC) += imacfb.o obj-$(CONFIG_FB_VGA16) += vga16fb.o vgastate.o obj-$(CONFIG_FB_OF) += offb.o diff --git a/drivers/video/S3triofb.c b/drivers/video/S3triofb.c index 455fda990..afd146f5f 100644 --- a/drivers/video/S3triofb.c +++ b/drivers/video/S3triofb.c @@ -23,13 +23,11 @@ */ -#include #include #include #include #include #include -#include #include #include #include diff --git a/drivers/video/acornfb.c b/drivers/video/acornfb.c index 98baecccb..61a8bf159 100644 --- a/drivers/video/acornfb.c +++ b/drivers/video/acornfb.c @@ -17,7 +17,6 @@ * - Blanking 8bpp displays with VIDC */ -#include #include #include #include diff --git a/drivers/video/amifb.c b/drivers/video/amifb.c index 3033c72de..f1ba54f4f 100644 --- a/drivers/video/amifb.c +++ b/drivers/video/amifb.c @@ -45,10 +45,8 @@ #include #include #include -#include #include #include -#include #include #include #include diff --git a/drivers/video/arcfb.c b/drivers/video/arcfb.c index 466042808..70dd8115a 100644 --- a/drivers/video/arcfb.c +++ b/drivers/video/arcfb.c @@ -39,7 +39,6 @@ #include #include #include -#include #include #include #include @@ -561,7 +560,7 @@ static int __init arcfb_probe(struct platform_device *dev) platform_set_drvdata(dev, info); if (irq) { par->irq = irq; - if (request_irq(par->irq, &arcfb_interrupt, SA_SHIRQ, + if (request_irq(par->irq, &arcfb_interrupt, IRQF_SHARED, "arcfb", info)) { printk(KERN_INFO "arcfb: Failed req IRQ %d\n", par->irq); diff --git a/drivers/video/asiliantfb.c b/drivers/video/asiliantfb.c index f4729f4df..1fd22f460 100644 --- a/drivers/video/asiliantfb.c +++ b/drivers/video/asiliantfb.c @@ -29,13 +29,11 @@ * more details. */ -#include #include #include #include #include #include -#include #include #include #include @@ -106,7 +104,6 @@ static struct fb_ops asiliantfb_ops = { .fb_fillrect = cfb_fillrect, .fb_copyarea = cfb_copyarea, .fb_imageblit = cfb_imageblit, - .fb_cursor = soft_cursor, }; /* Calculate the ratios for the dot clocks without using a single long long @@ -323,32 +320,29 @@ static int asiliantfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, writeb(green, mmio_base + 0x791); writeb(blue, mmio_base + 0x791); - switch(p->var.bits_per_pixel) { - case 15: - if (regno < 16) { + if (regno < 16) { + switch(p->var.red.offset) { + case 10: /* RGB 555 */ ((u32 *)(p->pseudo_palette))[regno] = ((red & 0xf8) << 7) | ((green & 0xf8) << 2) | ((blue & 0xf8) >> 3); - } - break; - case 16: - if (regno < 16) { + break; + case 11: /* RGB 565 */ ((u32 *)(p->pseudo_palette))[regno] = ((red & 0xf8) << 8) | ((green & 0xfc) << 3) | ((blue & 0xf8) >> 3); - } - break; - case 24: - if (regno < 24) { + break; + case 16: /* RGB 888 */ ((u32 *)(p->pseudo_palette))[regno] = (red << 16) | (green << 8) | (blue); + break; } - break; } + return 0; } @@ -357,8 +351,6 @@ struct chips_init_reg { unsigned char data; }; -#define N_ELTS(x) (sizeof(x) / sizeof(x[0])) - static struct chips_init_reg chips_init_sr[] = { {0x00, 0x03}, /* Reset register */ @@ -464,22 +456,22 @@ static void __devinit chips_hw_init(struct fb_info *p) { int i; - for (i = 0; i < N_ELTS(chips_init_xr); ++i) + for (i = 0; i < ARRAY_SIZE(chips_init_xr); ++i) write_xr(chips_init_xr[i].addr, chips_init_xr[i].data); write_xr(0x81, 0x12); write_xr(0x82, 0x08); write_xr(0x20, 0x00); - for (i = 0; i < N_ELTS(chips_init_sr); ++i) + for (i = 0; i < ARRAY_SIZE(chips_init_sr); ++i) write_sr(chips_init_sr[i].addr, chips_init_sr[i].data); - for (i = 0; i < N_ELTS(chips_init_gr); ++i) + for (i = 0; i < ARRAY_SIZE(chips_init_gr); ++i) write_gr(chips_init_gr[i].addr, chips_init_gr[i].data); - for (i = 0; i < N_ELTS(chips_init_ar); ++i) + for (i = 0; i < ARRAY_SIZE(chips_init_ar); ++i) write_ar(chips_init_ar[i].addr, chips_init_ar[i].data); /* Enable video output in attribute index register */ writeb(0x20, mmio_base + 0x780); - for (i = 0; i < N_ELTS(chips_init_cr); ++i) + for (i = 0; i < ARRAY_SIZE(chips_init_cr); ++i) write_cr(chips_init_cr[i].addr, chips_init_cr[i].data); - for (i = 0; i < N_ELTS(chips_init_fr); ++i) + for (i = 0; i < ARRAY_SIZE(chips_init_fr); ++i) write_fr(chips_init_fr[i].addr, chips_init_fr[i].data); } @@ -550,7 +542,7 @@ asiliantfb_pci_init(struct pci_dev *dp, const struct pci_device_id *ent) if (!request_mem_region(addr, size, "asiliantfb")) return -EBUSY; - p = framebuffer_alloc(sizeof(u32) * 256, &dp->dev); + p = framebuffer_alloc(sizeof(u32) * 16, &dp->dev); if (!p) { release_mem_region(addr, size); return -ENOMEM; diff --git a/drivers/video/atafb.c b/drivers/video/atafb.c index e69ab65f7..5831893bf 100644 --- a/drivers/video/atafb.c +++ b/drivers/video/atafb.c @@ -53,7 +53,6 @@ #include #include #include -#include #include #include #include diff --git a/drivers/video/aty/Makefile b/drivers/video/aty/Makefile index 18521397a..a6cc0e9ec 100644 --- a/drivers/video/aty/Makefile +++ b/drivers/video/aty/Makefile @@ -10,5 +10,6 @@ atyfb-objs := $(atyfb-y) radeonfb-y := radeon_base.o radeon_pm.o radeon_monitor.o radeon_accel.o radeonfb-$(CONFIG_FB_RADEON_I2C) += radeon_i2c.o +radeonfb-$(CONFIG_FB_RADEON_BACKLIGHT) += radeon_backlight.o radeonfb-objs := $(radeonfb-y) diff --git a/drivers/video/aty/aty128fb.c b/drivers/video/aty/aty128fb.c index f7bbff4dd..276a21530 100644 --- a/drivers/video/aty/aty128fb.c +++ b/drivers/video/aty/aty128fb.c @@ -46,14 +46,12 @@ */ -#include #include #include #include #include #include #include -#include #include #include #include @@ -64,6 +62,7 @@ #include #include #include +#include #include #ifdef CONFIG_PPC_PMAC @@ -99,7 +98,7 @@ #ifndef CONFIG_PPC_PMAC /* default mode */ -static struct fb_var_screeninfo default_var __initdata = { +static struct fb_var_screeninfo default_var __devinitdata = { /* 640x480, 60 Hz, Non-Interlaced (25.175 MHz dotclock) */ 640, 480, 640, 480, 0, 0, 8, 0, {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0}, @@ -122,7 +121,7 @@ static struct fb_var_screeninfo default_var = { /* default modedb mode */ /* 640x480, 60 Hz, Non-Interlaced (25.172 MHz dotclock) */ -static struct fb_videomode defaultmode __initdata = { +static struct fb_videomode defaultmode __devinitdata = { .refresh = 60, .xres = 640, .yres = 480, @@ -334,7 +333,7 @@ static const struct aty128_meminfo sdr_sgram = static const struct aty128_meminfo ddr_sgram = { 4, 4, 3, 3, 2, 3, 1, 16, 31, 16, "64-bit DDR SGRAM" }; -static struct fb_fix_screeninfo aty128fb_fix __initdata = { +static struct fb_fix_screeninfo aty128fb_fix __devinitdata = { .id = "ATY Rage128", .type = FB_TYPE_PACKED_PIXELS, .visual = FB_VISUAL_PSEUDOCOLOR, @@ -344,15 +343,15 @@ static struct fb_fix_screeninfo aty128fb_fix __initdata = { .accel = FB_ACCEL_ATI_RAGE128, }; -static char *mode_option __initdata = NULL; +static char *mode_option __devinitdata = NULL; #ifdef CONFIG_PPC_PMAC -static int default_vmode __initdata = VMODE_1024_768_60; -static int default_cmode __initdata = CMODE_8; +static int default_vmode __devinitdata = VMODE_1024_768_60; +static int default_cmode __devinitdata = CMODE_8; #endif -static int default_crt_on __initdata = 0; -static int default_lcd_on __initdata = 1; +static int default_crt_on __devinitdata = 0; +static int default_lcd_on __devinitdata = 1; #ifdef CONFIG_MTRR static int mtrr = 1; @@ -444,9 +443,9 @@ static int aty128_encode_var(struct fb_var_screeninfo *var, static int aty128_decode_var(struct fb_var_screeninfo *var, struct aty128fb_par *par); #if 0 -static void __init aty128_get_pllinfo(struct aty128fb_par *par, +static void __devinit aty128_get_pllinfo(struct aty128fb_par *par, void __iomem *bios); -static void __init __iomem *aty128_map_ROM(struct pci_dev *pdev, const struct aty128fb_par *par); +static void __devinit __iomem *aty128_map_ROM(struct pci_dev *pdev, const struct aty128fb_par *par); #endif static void aty128_timings(struct aty128fb_par *par); static void aty128_init_engine(struct aty128fb_par *par); @@ -457,6 +456,10 @@ static void wait_for_fifo(u16 entries, struct aty128fb_par *par); static void wait_for_idle(struct aty128fb_par *par); static u32 depth_to_dst(u32 depth); +#ifdef CONFIG_FB_ATY128_BACKLIGHT +static void aty128_bl_set_power(struct fb_info *info, int power); +#endif + #define BIOS_IN8(v) (readb(bios + (v))) #define BIOS_IN16(v) (readb(bios + (v)) | \ (readb(bios + (v) + 1) << 8)) @@ -480,16 +483,6 @@ static struct fb_ops aty128fb_ops = { .fb_imageblit = cfb_imageblit, }; -#ifdef CONFIG_PMAC_BACKLIGHT -static int aty128_set_backlight_enable(int on, int level, void* data); -static int aty128_set_backlight_level(int level, void* data); - -static struct backlight_controller aty128_backlight_controller = { - aty128_set_backlight_enable, - aty128_set_backlight_level -}; -#endif /* CONFIG_PMAC_BACKLIGHT */ - /* * Functions to read from/write to the mmio registers * - endian conversions may possibly be avoided by @@ -582,7 +575,7 @@ static void aty_pll_writeupdate(const struct aty128fb_par *par) /* write to the scratch register to test r/w functionality */ -static int __init register_test(const struct aty128fb_par *par) +static int __devinit register_test(const struct aty128fb_par *par) { u32 val; int flag = 0; @@ -781,7 +774,7 @@ static u32 depth_to_dst(u32 depth) #ifndef __sparc__ -static void __iomem * __init aty128_map_ROM(const struct aty128fb_par *par, struct pci_dev *dev) +static void __iomem * __devinit aty128_map_ROM(const struct aty128fb_par *par, struct pci_dev *dev) { u16 dptr; u8 rom_type; @@ -865,7 +858,7 @@ static void __iomem * __init aty128_map_ROM(const struct aty128fb_par *par, stru return NULL; } -static void __init aty128_get_pllinfo(struct aty128fb_par *par, unsigned char __iomem *bios) +static void __devinit aty128_get_pllinfo(struct aty128fb_par *par, unsigned char __iomem *bios) { unsigned int bios_hdr; unsigned int bios_pll; @@ -912,7 +905,7 @@ static void __iomem * __devinit aty128_find_mem_vbios(struct aty128fb_par *par) #endif /* ndef(__sparc__) */ /* fill in known card constants if pll_block is not available */ -static void __init aty128_timings(struct aty128fb_par *par) +static void __devinit aty128_timings(struct aty128fb_par *par) { #ifdef CONFIG_PPC_OF /* instead of a table lookup, assume OF has properly @@ -1258,19 +1251,21 @@ static void aty128_set_crt_enable(struct aty128fb_par *par, int on) static void aty128_set_lcd_enable(struct aty128fb_par *par, int on) { u32 reg; +#ifdef CONFIG_FB_ATY128_BACKLIGHT + struct fb_info *info = pci_get_drvdata(par->pdev); +#endif if (on) { reg = aty_ld_le32(LVDS_GEN_CNTL); reg |= LVDS_ON | LVDS_EN | LVDS_BLON | LVDS_DIGION; reg &= ~LVDS_DISPLAY_DIS; aty_st_le32(LVDS_GEN_CNTL, reg); -#ifdef CONFIG_PMAC_BACKLIGHT - aty128_set_backlight_enable(get_backlight_enable(), - get_backlight_level(), par); +#ifdef CONFIG_FB_ATY128_BACKLIGHT + aty128_bl_set_power(info, FB_BLANK_UNBLANK); #endif } else { -#ifdef CONFIG_PMAC_BACKLIGHT - aty128_set_backlight_enable(0, 0, par); +#ifdef CONFIG_FB_ATY128_BACKLIGHT + aty128_bl_set_power(info, FB_BLANK_POWERDOWN); #endif reg = aty_ld_le32(LVDS_GEN_CNTL); reg |= LVDS_DISPLAY_DIS; @@ -1638,7 +1633,7 @@ static int aty128fb_sync(struct fb_info *info) } #ifndef MODULE -static int __init aty128fb_setup(char *options) +static int __devinit aty128fb_setup(char *options) { char *this_opt; @@ -1691,6 +1686,211 @@ static int __init aty128fb_setup(char *options) } #endif /* MODULE */ +/* Backlight */ +#ifdef CONFIG_FB_ATY128_BACKLIGHT +#define MAX_LEVEL 0xFF + +static struct backlight_properties aty128_bl_data; + +/* Call with fb_info->bl_mutex held */ +static int aty128_bl_get_level_brightness(struct aty128fb_par *par, + int level) +{ + struct fb_info *info = pci_get_drvdata(par->pdev); + int atylevel; + + /* Get and convert the value */ + atylevel = MAX_LEVEL - + (info->bl_curve[level] * FB_BACKLIGHT_MAX / MAX_LEVEL); + + if (atylevel < 0) + atylevel = 0; + else if (atylevel > MAX_LEVEL) + atylevel = MAX_LEVEL; + + return atylevel; +} + +/* We turn off the LCD completely instead of just dimming the backlight. + * This provides greater power saving and the display is useless without + * backlight anyway + */ +#define BACKLIGHT_LVDS_OFF +/* That one prevents proper CRT output with LCD off */ +#undef BACKLIGHT_DAC_OFF + +/* Call with fb_info->bl_mutex held */ +static int __aty128_bl_update_status(struct backlight_device *bd) +{ + struct aty128fb_par *par = class_get_devdata(&bd->class_dev); + unsigned int reg = aty_ld_le32(LVDS_GEN_CNTL); + int level; + + if (bd->props->power != FB_BLANK_UNBLANK || + bd->props->fb_blank != FB_BLANK_UNBLANK || + !par->lcd_on) + level = 0; + else + level = bd->props->brightness; + + reg |= LVDS_BL_MOD_EN | LVDS_BLON; + if (level > 0) { + reg |= LVDS_DIGION; + if (!(reg & LVDS_ON)) { + reg &= ~LVDS_BLON; + aty_st_le32(LVDS_GEN_CNTL, reg); + aty_ld_le32(LVDS_GEN_CNTL); + mdelay(10); + reg |= LVDS_BLON; + aty_st_le32(LVDS_GEN_CNTL, reg); + } + reg &= ~LVDS_BL_MOD_LEVEL_MASK; + reg |= (aty128_bl_get_level_brightness(par, level) << LVDS_BL_MOD_LEVEL_SHIFT); +#ifdef BACKLIGHT_LVDS_OFF + reg |= LVDS_ON | LVDS_EN; + reg &= ~LVDS_DISPLAY_DIS; +#endif + aty_st_le32(LVDS_GEN_CNTL, reg); +#ifdef BACKLIGHT_DAC_OFF + aty_st_le32(DAC_CNTL, aty_ld_le32(DAC_CNTL) & (~DAC_PDWN)); +#endif + } else { + reg &= ~LVDS_BL_MOD_LEVEL_MASK; + reg |= (aty128_bl_get_level_brightness(par, 0) << LVDS_BL_MOD_LEVEL_SHIFT); +#ifdef BACKLIGHT_LVDS_OFF + reg |= LVDS_DISPLAY_DIS; + aty_st_le32(LVDS_GEN_CNTL, reg); + aty_ld_le32(LVDS_GEN_CNTL); + udelay(10); + reg &= ~(LVDS_ON | LVDS_EN | LVDS_BLON | LVDS_DIGION); +#endif + aty_st_le32(LVDS_GEN_CNTL, reg); +#ifdef BACKLIGHT_DAC_OFF + aty_st_le32(DAC_CNTL, aty_ld_le32(DAC_CNTL) | DAC_PDWN); +#endif + } + + return 0; +} + +static int aty128_bl_update_status(struct backlight_device *bd) +{ + struct aty128fb_par *par = class_get_devdata(&bd->class_dev); + struct fb_info *info = pci_get_drvdata(par->pdev); + int ret; + + mutex_lock(&info->bl_mutex); + ret = __aty128_bl_update_status(bd); + mutex_unlock(&info->bl_mutex); + + return ret; +} + +static int aty128_bl_get_brightness(struct backlight_device *bd) +{ + return bd->props->brightness; +} + +static struct backlight_properties aty128_bl_data = { + .owner = THIS_MODULE, + .get_brightness = aty128_bl_get_brightness, + .update_status = aty128_bl_update_status, + .max_brightness = (FB_BACKLIGHT_LEVELS - 1), +}; + +static void aty128_bl_set_power(struct fb_info *info, int power) +{ + mutex_lock(&info->bl_mutex); + + if (info->bl_dev) { + down(&info->bl_dev->sem); + info->bl_dev->props->power = power; + __aty128_bl_update_status(info->bl_dev); + up(&info->bl_dev->sem); + } + + mutex_unlock(&info->bl_mutex); +} + +static void aty128_bl_init(struct aty128fb_par *par) +{ + struct fb_info *info = pci_get_drvdata(par->pdev); + struct backlight_device *bd; + char name[12]; + + /* Could be extended to Rage128Pro LVDS output too */ + if (par->chip_gen != rage_M3) + return; + +#ifdef CONFIG_PMAC_BACKLIGHT + if (!pmac_has_backlight_type("ati")) + return; +#endif + + snprintf(name, sizeof(name), "aty128bl%d", info->node); + + bd = backlight_device_register(name, par, &aty128_bl_data); + if (IS_ERR(bd)) { + info->bl_dev = NULL; + printk(KERN_WARNING "aty128: Backlight registration failed\n"); + goto error; + } + + mutex_lock(&info->bl_mutex); + info->bl_dev = bd; + fb_bl_default_curve(info, 0, + 63 * FB_BACKLIGHT_MAX / MAX_LEVEL, + 219 * FB_BACKLIGHT_MAX / MAX_LEVEL); + mutex_unlock(&info->bl_mutex); + + down(&bd->sem); + bd->props->brightness = aty128_bl_data.max_brightness; + bd->props->power = FB_BLANK_UNBLANK; + bd->props->update_status(bd); + up(&bd->sem); + +#ifdef CONFIG_PMAC_BACKLIGHT + mutex_lock(&pmac_backlight_mutex); + if (!pmac_backlight) + pmac_backlight = bd; + mutex_unlock(&pmac_backlight_mutex); +#endif + + printk("aty128: Backlight initialized (%s)\n", name); + + return; + +error: + return; +} + +static void aty128_bl_exit(struct aty128fb_par *par) +{ + struct fb_info *info = pci_get_drvdata(par->pdev); + +#ifdef CONFIG_PMAC_BACKLIGHT + mutex_lock(&pmac_backlight_mutex); +#endif + + mutex_lock(&info->bl_mutex); + if (info->bl_dev) { +#ifdef CONFIG_PMAC_BACKLIGHT + if (pmac_backlight == info->bl_dev) + pmac_backlight = NULL; +#endif + + backlight_device_unregister(info->bl_dev); + info->bl_dev = NULL; + + printk("aty128: Backlight unloaded\n"); + } + mutex_unlock(&info->bl_mutex); + +#ifdef CONFIG_PMAC_BACKLIGHT + mutex_unlock(&pmac_backlight_mutex); +#endif +} +#endif /* CONFIG_FB_ATY128_BACKLIGHT */ /* * Initialisation @@ -1708,7 +1908,7 @@ static void aty128_early_resume(void *data) } #endif /* CONFIG_PPC_PMAC */ -static int __init aty128_init(struct pci_dev *pdev, const struct pci_device_id *ent) +static int __devinit aty128_init(struct pci_dev *pdev, const struct pci_device_id *ent) { struct fb_info *info = pci_get_drvdata(pdev); struct aty128fb_par *par = info->par; @@ -1717,9 +1917,6 @@ static int __init aty128_init(struct pci_dev *pdev, const struct pci_device_id * u8 chip_rev; u32 dac; - if (!par->vram_size) /* may have already been probed */ - par->vram_size = aty_ld_le32(CONFIG_MEMSIZE) & 0x03FFFFFF; - /* Get the chip revision */ chip_rev = (aty_ld_le32(CONFIG_CNTL) >> 16) & 0x1F; @@ -1832,20 +2029,18 @@ static int __init aty128_init(struct pci_dev *pdev, const struct pci_device_id * aty128_init_engine(par); - if (register_framebuffer(info) < 0) - return 0; - -#ifdef CONFIG_PMAC_BACKLIGHT - /* Could be extended to Rage128Pro LVDS output too */ - if (par->chip_gen == rage_M3) - register_backlight_controller(&aty128_backlight_controller, par, "ati"); -#endif /* CONFIG_PMAC_BACKLIGHT */ - par->pm_reg = pci_find_capability(pdev, PCI_CAP_ID_PM); par->pdev = pdev; par->asleep = 0; par->lock_blank = 0; - + +#ifdef CONFIG_FB_ATY128_BACKLIGHT + aty128_bl_init(par); +#endif + + if (register_framebuffer(info) < 0) + return 0; + printk(KERN_INFO "fb%d: %s frame buffer device on %s\n", info->node, info->fix.id, video_card); @@ -1854,7 +2049,7 @@ static int __init aty128_init(struct pci_dev *pdev, const struct pci_device_id * #ifdef CONFIG_PCI /* register a card ++ajoshi */ -static int __init aty128_probe(struct pci_dev *pdev, const struct pci_device_id *ent) +static int __devinit aty128_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { unsigned long fb_addr, reg_addr; struct aty128fb_par *par; @@ -1895,7 +2090,6 @@ static int __init aty128_probe(struct pci_dev *pdev, const struct pci_device_id par = info->par; info->pseudo_palette = par->pseudo_palette; - info->fix = aty128fb_fix; /* Virtualize mmio region */ info->fix.mmio_start = reg_addr; @@ -1981,6 +2175,10 @@ static void __devexit aty128_remove(struct pci_dev *pdev) par = info->par; +#ifdef CONFIG_FB_ATY128_BACKLIGHT + aty128_bl_exit(par); +#endif + unregister_framebuffer(info); #ifdef CONFIG_MTRR if (par->mtrr.vram_valid) @@ -2011,10 +2209,10 @@ static int aty128fb_blank(int blank, struct fb_info *fb) if (par->lock_blank || par->asleep) return 0; -#ifdef CONFIG_PMAC_BACKLIGHT +#ifdef CONFIG_FB_ATY128_BACKLIGHT if (machine_is(powermac) && blank) - set_backlight_enable(0); -#endif /* CONFIG_PMAC_BACKLIGHT */ + aty128_bl_set_power(fb, FB_BLANK_POWERDOWN); +#endif if (blank & FB_BLANK_VSYNC_SUSPEND) state |= 2; @@ -2029,10 +2227,12 @@ static int aty128fb_blank(int blank, struct fb_info *fb) aty128_set_crt_enable(par, par->crt_on && !blank); aty128_set_lcd_enable(par, par->lcd_on && !blank); } -#ifdef CONFIG_PMAC_BACKLIGHT + +#ifdef CONFIG_FB_ATY128_BACKLIGHT if (machine_is(powermac) && !blank) - set_backlight_enable(1); -#endif /* CONFIG_PMAC_BACKLIGHT */ + aty128_bl_set_power(fb, FB_BLANK_UNBLANK); +#endif + return 0; } @@ -2138,73 +2338,6 @@ static int aty128fb_ioctl(struct fb_info *info, u_int cmd, u_long arg) return -EINVAL; } -#ifdef CONFIG_PMAC_BACKLIGHT -static int backlight_conv[] = { - 0xff, 0xc0, 0xb5, 0xaa, 0x9f, 0x94, 0x89, 0x7e, - 0x73, 0x68, 0x5d, 0x52, 0x47, 0x3c, 0x31, 0x24 -}; - -/* We turn off the LCD completely instead of just dimming the backlight. - * This provides greater power saving and the display is useless without - * backlight anyway - */ -#define BACKLIGHT_LVDS_OFF -/* That one prevents proper CRT output with LCD off */ -#undef BACKLIGHT_DAC_OFF - -static int aty128_set_backlight_enable(int on, int level, void *data) -{ - struct aty128fb_par *par = data; - unsigned int reg = aty_ld_le32(LVDS_GEN_CNTL); - - if (!par->lcd_on) - on = 0; - reg |= LVDS_BL_MOD_EN | LVDS_BLON; - if (on && level > BACKLIGHT_OFF) { - reg |= LVDS_DIGION; - if (!(reg & LVDS_ON)) { - reg &= ~LVDS_BLON; - aty_st_le32(LVDS_GEN_CNTL, reg); - (void)aty_ld_le32(LVDS_GEN_CNTL); - mdelay(10); - reg |= LVDS_BLON; - aty_st_le32(LVDS_GEN_CNTL, reg); - } - reg &= ~LVDS_BL_MOD_LEVEL_MASK; - reg |= (backlight_conv[level] << LVDS_BL_MOD_LEVEL_SHIFT); -#ifdef BACKLIGHT_LVDS_OFF - reg |= LVDS_ON | LVDS_EN; - reg &= ~LVDS_DISPLAY_DIS; -#endif - aty_st_le32(LVDS_GEN_CNTL, reg); -#ifdef BACKLIGHT_DAC_OFF - aty_st_le32(DAC_CNTL, aty_ld_le32(DAC_CNTL) & (~DAC_PDWN)); -#endif - } else { - reg &= ~LVDS_BL_MOD_LEVEL_MASK; - reg |= (backlight_conv[0] << LVDS_BL_MOD_LEVEL_SHIFT); -#ifdef BACKLIGHT_LVDS_OFF - reg |= LVDS_DISPLAY_DIS; - aty_st_le32(LVDS_GEN_CNTL, reg); - (void)aty_ld_le32(LVDS_GEN_CNTL); - udelay(10); - reg &= ~(LVDS_ON | LVDS_EN | LVDS_BLON | LVDS_DIGION); -#endif - aty_st_le32(LVDS_GEN_CNTL, reg); -#ifdef BACKLIGHT_DAC_OFF - aty_st_le32(DAC_CNTL, aty_ld_le32(DAC_CNTL) | DAC_PDWN); -#endif - } - - return 0; -} - -static int aty128_set_backlight_level(int level, void* data) -{ - return aty128_set_backlight_enable(1, level, data); -} -#endif /* CONFIG_PMAC_BACKLIGHT */ - #if 0 /* * Accelerated functions @@ -2428,7 +2561,7 @@ static int aty128_pci_resume(struct pci_dev *pdev) } -static int __init aty128fb_init(void) +static int __devinit aty128fb_init(void) { #ifndef MODULE char *option = NULL; diff --git a/drivers/video/aty/atyfb.h b/drivers/video/aty/atyfb.h index e9b7a64c1..55fb8b044 100644 --- a/drivers/video/aty/atyfb.h +++ b/drivers/video/aty/atyfb.h @@ -2,7 +2,6 @@ * ATI Frame Buffer Device Driver Core Definitions */ -#include #include #include /* @@ -151,6 +150,7 @@ struct atyfb_par { int lock_blank; unsigned long res_start; unsigned long res_size; + struct pci_dev *pdev; #ifdef __sparc__ struct pci_mmap_map *mmap_map; u8 mmaped; diff --git a/drivers/video/aty/atyfb_base.c b/drivers/video/aty/atyfb_base.c index d9d7d3c4c..19a71f045 100644 --- a/drivers/video/aty/atyfb_base.c +++ b/drivers/video/aty/atyfb_base.c @@ -49,7 +49,6 @@ ******************************************************************************/ -#include #include #include #include @@ -66,6 +65,7 @@ #include #include #include +#include #include #include @@ -315,12 +315,12 @@ static int vram; static int pll; static int mclk; static int xclk; -static int comp_sync __initdata = -1; +static int comp_sync __devinitdata = -1; static char *mode; #ifdef CONFIG_PPC -static int default_vmode __initdata = VMODE_CHOOSE; -static int default_cmode __initdata = CMODE_CHOOSE; +static int default_vmode __devinitdata = VMODE_CHOOSE; +static int default_cmode __devinitdata = CMODE_CHOOSE; module_param_named(vmode, default_vmode, int, 0); MODULE_PARM_DESC(vmode, "int: video mode for mac"); @@ -329,10 +329,10 @@ MODULE_PARM_DESC(cmode, "int: color mode for mac"); #endif #ifdef CONFIG_ATARI -static unsigned int mach64_count __initdata = 0; -static unsigned long phys_vmembase[FB_MAX] __initdata = { 0, }; -static unsigned long phys_size[FB_MAX] __initdata = { 0, }; -static unsigned long phys_guiregbase[FB_MAX] __initdata = { 0, }; +static unsigned int mach64_count __devinitdata = 0; +static unsigned long phys_vmembase[FB_MAX] __devinitdata = { 0, }; +static unsigned long phys_size[FB_MAX] __devinitdata = { 0, }; +static unsigned long phys_guiregbase[FB_MAX] __devinitdata = { 0, }; #endif /* top -> down is an evolution of mach64 chipset, any corrections? */ @@ -582,7 +582,7 @@ static u32 atyfb_get_pixclock(struct fb_var_screeninfo *var, struct atyfb_par *p * Apple monitor sense */ -static int __init read_aty_sense(const struct atyfb_par *par) +static int __devinit read_aty_sense(const struct atyfb_par *par) { int sense, i; @@ -1280,6 +1280,14 @@ static int atyfb_set_par(struct fb_info *info) par->accel_flags = var->accel_flags; /* hack */ + if (var->accel_flags) { + info->fbops->fb_sync = atyfb_sync; + info->flags &= ~FBINFO_HWACCEL_DISABLED; + } else { + info->fbops->fb_sync = NULL; + info->flags |= FBINFO_HWACCEL_DISABLED; + } + if (par->blitter_may_be_busy) wait_for_idle(par); @@ -1559,7 +1567,7 @@ static int aty_enable_irq(struct atyfb_par *par, int reenable) u32 int_cntl; if (!test_and_set_bit(0, &par->irq_flags)) { - if (request_irq(par->irq, aty_irq, SA_SHIRQ, "atyfb", par)) { + if (request_irq(par->irq, aty_irq, IRQF_SHARED, "atyfb", par)) { clear_bit(0, &par->irq_flags); return -EINVAL; } @@ -2115,47 +2123,171 @@ static int atyfb_pci_resume(struct pci_dev *pdev) #endif /* defined(CONFIG_PM) && defined(CONFIG_PCI) */ -#ifdef CONFIG_PMAC_BACKLIGHT +/* Backlight */ +#ifdef CONFIG_FB_ATY_BACKLIGHT +#define MAX_LEVEL 0xFF - /* - * LCD backlight control - */ +static struct backlight_properties aty_bl_data; -static int backlight_conv[] = { - 0x00, 0x3f, 0x4c, 0x59, 0x66, 0x73, 0x80, 0x8d, - 0x9a, 0xa7, 0xb4, 0xc1, 0xcf, 0xdc, 0xe9, 0xff -}; +/* Call with fb_info->bl_mutex held */ +static int aty_bl_get_level_brightness(struct atyfb_par *par, int level) +{ + struct fb_info *info = pci_get_drvdata(par->pdev); + int atylevel; + + /* Get and convert the value */ + atylevel = info->bl_curve[level] * FB_BACKLIGHT_MAX / MAX_LEVEL; + + if (atylevel < 0) + atylevel = 0; + else if (atylevel > MAX_LEVEL) + atylevel = MAX_LEVEL; -static int aty_set_backlight_enable(int on, int level, void *data) + return atylevel; +} + +/* Call with fb_info->bl_mutex held */ +static int __aty_bl_update_status(struct backlight_device *bd) { - struct fb_info *info = (struct fb_info *) data; - struct atyfb_par *par = (struct atyfb_par *) info->par; + struct atyfb_par *par = class_get_devdata(&bd->class_dev); unsigned int reg = aty_ld_lcd(LCD_MISC_CNTL, par); + int level; + + if (bd->props->power != FB_BLANK_UNBLANK || + bd->props->fb_blank != FB_BLANK_UNBLANK) + level = 0; + else + level = bd->props->brightness; reg |= (BLMOD_EN | BIASMOD_EN); - if (on && level > BACKLIGHT_OFF) { + if (level > 0) { reg &= ~BIAS_MOD_LEVEL_MASK; - reg |= (backlight_conv[level] << BIAS_MOD_LEVEL_SHIFT); + reg |= (aty_bl_get_level_brightness(par, level) << BIAS_MOD_LEVEL_SHIFT); } else { reg &= ~BIAS_MOD_LEVEL_MASK; - reg |= (backlight_conv[0] << BIAS_MOD_LEVEL_SHIFT); + reg |= (aty_bl_get_level_brightness(par, 0) << BIAS_MOD_LEVEL_SHIFT); } aty_st_lcd(LCD_MISC_CNTL, reg, par); + return 0; } -static int aty_set_backlight_level(int level, void *data) +static int aty_bl_update_status(struct backlight_device *bd) { - return aty_set_backlight_enable(1, level, data); + struct atyfb_par *par = class_get_devdata(&bd->class_dev); + struct fb_info *info = pci_get_drvdata(par->pdev); + int ret; + + mutex_lock(&info->bl_mutex); + ret = __aty_bl_update_status(bd); + mutex_unlock(&info->bl_mutex); + + return ret; } -static struct backlight_controller aty_backlight_controller = { - aty_set_backlight_enable, - aty_set_backlight_level +static int aty_bl_get_brightness(struct backlight_device *bd) +{ + return bd->props->brightness; +} + +static struct backlight_properties aty_bl_data = { + .owner = THIS_MODULE, + .get_brightness = aty_bl_get_brightness, + .update_status = aty_bl_update_status, + .max_brightness = (FB_BACKLIGHT_LEVELS - 1), }; -#endif /* CONFIG_PMAC_BACKLIGHT */ -static void __init aty_calc_mem_refresh(struct atyfb_par *par, int xclk) +static void aty_bl_set_power(struct fb_info *info, int power) +{ + mutex_lock(&info->bl_mutex); + + if (info->bl_dev) { + down(&info->bl_dev->sem); + info->bl_dev->props->power = power; + __aty_bl_update_status(info->bl_dev); + up(&info->bl_dev->sem); + } + + mutex_unlock(&info->bl_mutex); +} + +static void aty_bl_init(struct atyfb_par *par) +{ + struct fb_info *info = pci_get_drvdata(par->pdev); + struct backlight_device *bd; + char name[12]; + +#ifdef CONFIG_PMAC_BACKLIGHT + if (!pmac_has_backlight_type("ati")) + return; +#endif + + snprintf(name, sizeof(name), "atybl%d", info->node); + + bd = backlight_device_register(name, par, &aty_bl_data); + if (IS_ERR(bd)) { + info->bl_dev = NULL; + printk(KERN_WARNING "aty: Backlight registration failed\n"); + goto error; + } + + mutex_lock(&info->bl_mutex); + info->bl_dev = bd; + fb_bl_default_curve(info, 0, + 0x3F * FB_BACKLIGHT_MAX / MAX_LEVEL, + 0xFF * FB_BACKLIGHT_MAX / MAX_LEVEL); + mutex_unlock(&info->bl_mutex); + + down(&bd->sem); + bd->props->brightness = aty_bl_data.max_brightness; + bd->props->power = FB_BLANK_UNBLANK; + bd->props->update_status(bd); + up(&bd->sem); + +#ifdef CONFIG_PMAC_BACKLIGHT + mutex_lock(&pmac_backlight_mutex); + if (!pmac_backlight) + pmac_backlight = bd; + mutex_unlock(&pmac_backlight_mutex); +#endif + + printk("aty: Backlight initialized (%s)\n", name); + + return; + +error: + return; +} + +static void aty_bl_exit(struct atyfb_par *par) +{ + struct fb_info *info = pci_get_drvdata(par->pdev); + +#ifdef CONFIG_PMAC_BACKLIGHT + mutex_lock(&pmac_backlight_mutex); +#endif + + mutex_lock(&info->bl_mutex); + if (info->bl_dev) { +#ifdef CONFIG_PMAC_BACKLIGHT + if (pmac_backlight == info->bl_dev) + pmac_backlight = NULL; +#endif + + backlight_device_unregister(info->bl_dev); + + printk("aty: Backlight unloaded\n"); + } + mutex_unlock(&info->bl_mutex); + +#ifdef CONFIG_PMAC_BACKLIGHT + mutex_unlock(&pmac_backlight_mutex); +#endif +} + +#endif /* CONFIG_FB_ATY_BACKLIGHT */ + +static void __devinit aty_calc_mem_refresh(struct atyfb_par *par, int xclk) { const int ragepro_tbl[] = { 44, 50, 55, 66, 75, 80, 100 @@ -2215,7 +2347,7 @@ static int __devinit atyfb_get_timings_from_lcd(struct atyfb_par *par, } #endif /* defined(__i386__) && defined(CONFIG_FB_ATY_GENERIC_LCD) */ -static int __init aty_init(struct fb_info *info, const char *name) +static int __devinit aty_init(struct fb_info *info, const char *name) { struct atyfb_par *par = (struct atyfb_par *) info->par; const char *ramname = NULL, *xtal; @@ -2296,12 +2428,15 @@ static int __init aty_init(struct fb_info *info, const char *name) break; } switch (clk_type) { +#ifdef CONFIG_ATARI case CLK_ATI18818_1: par->pll_ops = &aty_pll_ati18818_1; break; +#else case CLK_IBMRGB514: par->pll_ops = &aty_pll_ibm514; break; +#endif #if 0 /* dead code */ case CLK_STG1703: par->pll_ops = &aty_pll_stg1703; @@ -2506,16 +2641,24 @@ static int __init aty_init(struct fb_info *info, const char *name) info->fbops = &atyfb_ops; info->pseudo_palette = pseudo_palette; - info->flags = FBINFO_FLAG_DEFAULT; + info->flags = FBINFO_DEFAULT | + FBINFO_HWACCEL_IMAGEBLIT | + FBINFO_HWACCEL_FILLRECT | + FBINFO_HWACCEL_COPYAREA | + FBINFO_HWACCEL_YPAN; #ifdef CONFIG_PMAC_BACKLIGHT if (M64_HAS(G3_PB_1_1) && machine_is_compatible("PowerBook1,1")) { /* these bits let the 101 powerbook wake up from sleep -- paulus */ aty_st_lcd(POWER_MANAGEMENT, aty_ld_lcd(POWER_MANAGEMENT, par) | (USE_F32KHZ | TRISTATE_MEM_EN), par); - } else if (M64_HAS(MOBIL_BUS)) - register_backlight_controller(&aty_backlight_controller, info, "ati"); -#endif /* CONFIG_PMAC_BACKLIGHT */ + } else +#endif + if (M64_HAS(MOBIL_BUS)) { +#ifdef CONFIG_FB_ATY_BACKLIGHT + aty_bl_init (par); +#endif + } memset(&var, 0, sizeof(var)); #ifdef CONFIG_PPC @@ -2631,7 +2774,7 @@ aty_init_exit: } #ifdef CONFIG_ATARI -static int __init store_video_par(char *video_str, unsigned char m64_num) +static int __devinit store_video_par(char *video_str, unsigned char m64_num) { char *p; unsigned long vmembase, size, guiregbase; @@ -2673,9 +2816,9 @@ static int atyfb_blank(int blank, struct fb_info *info) if (par->lock_blank || par->asleep) return 0; -#ifdef CONFIG_PMAC_BACKLIGHT +#ifdef CONFIG_FB_ATY_BACKLIGHT if (machine_is(powermac) && blank > FB_BLANK_NORMAL) - set_backlight_enable(0); + aty_bl_set_power(info, FB_BLANK_POWERDOWN); #elif defined(CONFIG_FB_ATY_GENERIC_LCD) if (par->lcd_table && blank > FB_BLANK_NORMAL && (aty_ld_lcd(LCD_GEN_CNTL, par) & LCD_ON)) { @@ -2705,9 +2848,9 @@ static int atyfb_blank(int blank, struct fb_info *info) } aty_st_le32(CRTC_GEN_CNTL, gen_cntl, par); -#ifdef CONFIG_PMAC_BACKLIGHT +#ifdef CONFIG_FB_ATY_BACKLIGHT if (machine_is(powermac) && blank <= FB_BLANK_NORMAL) - set_backlight_enable(1); + aty_bl_set_power(info, FB_BLANK_UNBLANK); #elif defined(CONFIG_FB_ATY_GENERIC_LCD) if (par->lcd_table && blank <= FB_BLANK_NORMAL && (aty_ld_lcd(LCD_GEN_CNTL, par) & LCD_ON)) { @@ -2966,7 +3109,7 @@ static int __devinit atyfb_setup_sparc(struct pci_dev *pdev, } pcp = pdev->sysdata; - if (node == pcp->prom_node) { + if (node == pcp->prom_node->node) { struct fb_var_screeninfo *var = &default_var; unsigned int N, P, Q, M, T, R; u32 v_total, h_total; @@ -3440,6 +3583,7 @@ static int __devinit atyfb_pci_probe(struct pci_dev *pdev, const struct pci_devi par->res_start = res_start; par->res_size = res_size; par->irq = pdev->irq; + par->pdev = pdev; /* Setup "info" structure */ #ifdef __sparc__ @@ -3571,6 +3715,11 @@ static void __devexit atyfb_remove(struct fb_info *info) aty_set_crtc(par, &saved_crtc); par->pll_ops->set_pll(info, &saved_pll); +#ifdef CONFIG_FB_ATY_BACKLIGHT + if (M64_HAS(MOBIL_BUS)) + aty_bl_exit(par); +#endif + unregister_framebuffer(info); #ifdef CONFIG_MTRR @@ -3640,7 +3789,7 @@ static struct pci_driver atyfb_driver = { #endif /* CONFIG_PCI */ #ifndef MODULE -static int __init atyfb_setup(char *options) +static int __devinit atyfb_setup(char *options) { char *this_opt; @@ -3712,7 +3861,7 @@ static int __init atyfb_setup(char *options) } #endif /* MODULE */ -static int __init atyfb_init(void) +static int __devinit atyfb_init(void) { #ifndef MODULE char *option = NULL; @@ -3722,7 +3871,9 @@ static int __init atyfb_init(void) atyfb_setup(option); #endif +#ifdef CONFIG_PCI pci_register_driver(&atyfb_driver); +#endif #ifdef CONFIG_ATARI atyfb_atari_probe(); #endif @@ -3731,7 +3882,9 @@ static int __init atyfb_init(void) static void __exit atyfb_exit(void) { +#ifdef CONFIG_PCI pci_unregister_driver(&atyfb_driver); +#endif } module_init(atyfb_init); diff --git a/drivers/video/aty/mach64_accel.c b/drivers/video/aty/mach64_accel.c index c98f4a442..1490e5e1c 100644 --- a/drivers/video/aty/mach64_accel.c +++ b/drivers/video/aty/mach64_accel.c @@ -200,8 +200,6 @@ void atyfb_copyarea(struct fb_info *info, const struct fb_copyarea *area) if (!area->width || !area->height) return; if (!par->accel_flags) { - if (par->blitter_may_be_busy) - wait_for_idle(par); cfb_copyarea(info, area); return; } @@ -248,8 +246,6 @@ void atyfb_fillrect(struct fb_info *info, const struct fb_fillrect *rect) if (!rect->width || !rect->height) return; if (!par->accel_flags) { - if (par->blitter_may_be_busy) - wait_for_idle(par); cfb_fillrect(info, rect); return; } @@ -288,14 +284,10 @@ void atyfb_imageblit(struct fb_info *info, const struct fb_image *image) return; if (!par->accel_flags || (image->depth != 1 && info->var.bits_per_pixel != image->depth)) { - if (par->blitter_may_be_busy) - wait_for_idle(par); - cfb_imageblit(info, image); return; } - wait_for_idle(par); pix_width = pix_width_save = aty_ld_le32(DP_PIX_WIDTH, par); host_cntl = aty_ld_le32(HOST_CNTL, par) | HOST_BYTE_ALIGN; @@ -425,8 +417,6 @@ void atyfb_imageblit(struct fb_info *info, const struct fb_image *image) } } - wait_for_idle(par); - /* restore pix_width */ wait_for_fifo(1, par); aty_st_le32(DP_PIX_WIDTH, pix_width_save, par); diff --git a/drivers/video/aty/mach64_cursor.c b/drivers/video/aty/mach64_cursor.c index ad8b7496f..2a7f381c3 100644 --- a/drivers/video/aty/mach64_cursor.c +++ b/drivers/video/aty/mach64_cursor.c @@ -66,11 +66,6 @@ static const u8 cursor_bits_lookup[16] = { 0x01, 0x41, 0x11, 0x51, 0x05, 0x45, 0x15, 0x55 }; -static const u8 cursor_mask_lookup[16] = { - 0xaa, 0x2a, 0x8a, 0x0a, 0xa2, 0x22, 0x82, 0x02, - 0xa8, 0x28, 0x88, 0x08, 0xa0, 0x20, 0x80, 0x00 -}; - static int atyfb_cursor(struct fb_info *info, struct fb_cursor *cursor) { struct atyfb_par *par = (struct atyfb_par *) info->par; @@ -130,13 +125,13 @@ static int atyfb_cursor(struct fb_info *info, struct fb_cursor *cursor) fg_idx = cursor->image.fg_color; bg_idx = cursor->image.bg_color; - fg = (info->cmap.red[fg_idx] << 24) | - (info->cmap.green[fg_idx] << 16) | - (info->cmap.blue[fg_idx] << 8) | 15; + fg = ((info->cmap.red[fg_idx] & 0xff) << 24) | + ((info->cmap.green[fg_idx] & 0xff) << 16) | + ((info->cmap.blue[fg_idx] & 0xff) << 8) | 0xff; - bg = (info->cmap.red[bg_idx] << 24) | - (info->cmap.green[bg_idx] << 16) | - (info->cmap.blue[bg_idx] << 8); + bg = ((info->cmap.red[bg_idx] & 0xff) << 24) | + ((info->cmap.green[bg_idx] & 0xff) << 16) | + ((info->cmap.blue[bg_idx] & 0xff) << 8); wait_for_fifo(2, par); aty_st_le32(CUR_CLR0, bg, par); @@ -166,19 +161,17 @@ static int atyfb_cursor(struct fb_info *info, struct fb_cursor *cursor) switch (cursor->rop) { case ROP_XOR: // Upper 4 bits of mask data - fb_writeb(cursor_mask_lookup[m >> 4 ] | - cursor_bits_lookup[(b ^ m) >> 4], dst++); + fb_writeb(cursor_bits_lookup[(b ^ m) >> 4], dst++); // Lower 4 bits of mask - fb_writeb(cursor_mask_lookup[m & 0x0f ] | - cursor_bits_lookup[(b ^ m) & 0x0f], dst++); + fb_writeb(cursor_bits_lookup[(b ^ m) & 0x0f], + dst++); break; case ROP_COPY: // Upper 4 bits of mask data - fb_writeb(cursor_mask_lookup[m >> 4 ] | - cursor_bits_lookup[(b & m) >> 4], dst++); + fb_writeb(cursor_bits_lookup[(b & m) >> 4], dst++); // Lower 4 bits of mask - fb_writeb(cursor_mask_lookup[m & 0x0f ] | - cursor_bits_lookup[(b & m) & 0x0f], dst++); + fb_writeb(cursor_bits_lookup[(b & m) & 0x0f], + dst++); break; } } @@ -194,7 +187,7 @@ static int atyfb_cursor(struct fb_info *info, struct fb_cursor *cursor) return 0; } -int __init aty_init_cursor(struct fb_info *info) +int __devinit aty_init_cursor(struct fb_info *info) { unsigned long addr; diff --git a/drivers/video/aty/radeon_base.c b/drivers/video/aty/radeon_base.c index 085cf8022..8e3400d5d 100644 --- a/drivers/video/aty/radeon_base.c +++ b/drivers/video/aty/radeon_base.c @@ -52,14 +52,12 @@ #define RADEON_VERSION "0.2.0" -#include #include #include #include #include #include #include -#include #include #include #include @@ -78,10 +76,6 @@ #include #include "../macmodes.h" -#ifdef CONFIG_PMAC_BACKLIGHT -#include -#endif - #ifdef CONFIG_BOOTX_TEXT #include #endif @@ -272,28 +266,13 @@ static int force_measure_pll = 0; #ifdef CONFIG_MTRR static int nomtrr = 0; #endif -#if defined(CONFIG_PM) && defined(CONFIG_X86) -int radeon_force_sleep = 0; -#endif +static int force_sleep; +static int ignore_devlist; /* * prototypes */ - -#ifdef CONFIG_PPC_OF - -#ifdef CONFIG_PMAC_BACKLIGHT -static int radeon_set_backlight_enable(int on, int level, void *data); -static int radeon_set_backlight_level(int level, void *data); -static struct backlight_controller radeon_backlight_controller = { - radeon_set_backlight_enable, - radeon_set_backlight_level -}; -#endif /* CONFIG_PMAC_BACKLIGHT */ - -#endif /* CONFIG_PPC_OF */ - static void radeon_unmap_ROM(struct radeonfb_info *rinfo, struct pci_dev *dev) { if (!rinfo->bios_seg) @@ -1916,116 +1895,6 @@ static int __devinit radeon_set_fbinfo (struct radeonfb_info *rinfo) return 0; } - -#ifdef CONFIG_PMAC_BACKLIGHT - -/* TODO: Dbl check these tables, we don't go up to full ON backlight - * in these, possibly because we noticed MacOS doesn't, but I'd prefer - * having some more official numbers from ATI - */ -static int backlight_conv_m6[] = { - 0xff, 0xc0, 0xb5, 0xaa, 0x9f, 0x94, 0x89, 0x7e, - 0x73, 0x68, 0x5d, 0x52, 0x47, 0x3c, 0x31, 0x24 -}; -static int backlight_conv_m7[] = { - 0x00, 0x3f, 0x4a, 0x55, 0x60, 0x6b, 0x76, 0x81, - 0x8c, 0x97, 0xa2, 0xad, 0xb8, 0xc3, 0xce, 0xd9 -}; - -#define BACKLIGHT_LVDS_OFF -#undef BACKLIGHT_DAC_OFF - -/* We turn off the LCD completely instead of just dimming the backlight. - * This provides some greater power saving and the display is useless - * without backlight anyway. - */ -static int radeon_set_backlight_enable(int on, int level, void *data) -{ - struct radeonfb_info *rinfo = (struct radeonfb_info *)data; - u32 lvds_gen_cntl, tmpPixclksCntl; - int* conv_table; - - if (rinfo->mon1_type != MT_LCD) - return 0; - - /* Pardon me for that hack... maybe some day we can figure - * out in what direction backlight should work on a given - * panel ? - */ - if ((rinfo->family == CHIP_FAMILY_RV200 || - rinfo->family == CHIP_FAMILY_RV250 || - rinfo->family == CHIP_FAMILY_RV280 || - rinfo->family == CHIP_FAMILY_RV350) && - !machine_is_compatible("PowerBook4,3") && - !machine_is_compatible("PowerBook6,3") && - !machine_is_compatible("PowerBook6,5")) - conv_table = backlight_conv_m7; - else - conv_table = backlight_conv_m6; - - del_timer_sync(&rinfo->lvds_timer); - radeon_engine_idle(); - - lvds_gen_cntl = INREG(LVDS_GEN_CNTL); - if (on && (level > BACKLIGHT_OFF)) { - lvds_gen_cntl &= ~LVDS_DISPLAY_DIS; - if (!(lvds_gen_cntl & LVDS_BLON) || !(lvds_gen_cntl & LVDS_ON)) { - lvds_gen_cntl |= (rinfo->init_state.lvds_gen_cntl & LVDS_DIGON); - lvds_gen_cntl |= LVDS_BLON | LVDS_EN; - OUTREG(LVDS_GEN_CNTL, lvds_gen_cntl); - lvds_gen_cntl &= ~LVDS_BL_MOD_LEVEL_MASK; - lvds_gen_cntl |= (conv_table[level] << - LVDS_BL_MOD_LEVEL_SHIFT); - lvds_gen_cntl |= LVDS_ON; - lvds_gen_cntl |= (rinfo->init_state.lvds_gen_cntl & LVDS_BL_MOD_EN); - rinfo->pending_lvds_gen_cntl = lvds_gen_cntl; - mod_timer(&rinfo->lvds_timer, - jiffies + msecs_to_jiffies(rinfo->panel_info.pwr_delay)); - } else { - lvds_gen_cntl &= ~LVDS_BL_MOD_LEVEL_MASK; - lvds_gen_cntl |= (conv_table[level] << - LVDS_BL_MOD_LEVEL_SHIFT); - OUTREG(LVDS_GEN_CNTL, lvds_gen_cntl); - } - rinfo->init_state.lvds_gen_cntl &= ~LVDS_STATE_MASK; - rinfo->init_state.lvds_gen_cntl |= rinfo->pending_lvds_gen_cntl - & LVDS_STATE_MASK; - } else { - /* Asic bug, when turning off LVDS_ON, we have to make sure - RADEON_PIXCLK_LVDS_ALWAYS_ON bit is off - */ - tmpPixclksCntl = INPLL(PIXCLKS_CNTL); - if (rinfo->is_mobility || rinfo->is_IGP) - OUTPLLP(PIXCLKS_CNTL, 0, ~PIXCLK_LVDS_ALWAYS_ONb); - lvds_gen_cntl &= ~(LVDS_BL_MOD_LEVEL_MASK | LVDS_BL_MOD_EN); - lvds_gen_cntl |= (conv_table[0] << - LVDS_BL_MOD_LEVEL_SHIFT); - lvds_gen_cntl |= LVDS_DISPLAY_DIS; - OUTREG(LVDS_GEN_CNTL, lvds_gen_cntl); - udelay(100); - lvds_gen_cntl &= ~(LVDS_ON | LVDS_EN); - OUTREG(LVDS_GEN_CNTL, lvds_gen_cntl); - lvds_gen_cntl &= ~(LVDS_DIGON); - rinfo->pending_lvds_gen_cntl = lvds_gen_cntl; - mod_timer(&rinfo->lvds_timer, - jiffies + msecs_to_jiffies(rinfo->panel_info.pwr_delay)); - if (rinfo->is_mobility || rinfo->is_IGP) - OUTPLL(PIXCLKS_CNTL, tmpPixclksCntl); - } - rinfo->init_state.lvds_gen_cntl &= ~LVDS_STATE_MASK; - rinfo->init_state.lvds_gen_cntl |= (lvds_gen_cntl & LVDS_STATE_MASK); - - return 0; -} - - -static int radeon_set_backlight_level(int level, void *data) -{ - return radeon_set_backlight_enable(1, level, data); -} -#endif /* CONFIG_PMAC_BACKLIGHT */ - - /* * This reconfigure the card's internal memory map. In theory, we'd like * to setup the card's memory at the same address as it's PCI bus address, @@ -2460,9 +2329,9 @@ static int __devinit radeonfb_pci_register (struct pci_dev *pdev, /* -2 is special: means ON on mobility chips and do not * change on others */ - radeonfb_pm_init(rinfo, rinfo->is_mobility ? 1 : -1); + radeonfb_pm_init(rinfo, rinfo->is_mobility ? 1 : -1, ignore_devlist, force_sleep); } else - radeonfb_pm_init(rinfo, default_dynclk); + radeonfb_pm_init(rinfo, default_dynclk, ignore_devlist, force_sleep); pci_set_drvdata(pdev, info); @@ -2480,14 +2349,7 @@ static int __devinit radeonfb_pci_register (struct pci_dev *pdev, MTRR_TYPE_WRCOMB, 1); #endif -#ifdef CONFIG_PMAC_BACKLIGHT - if (rinfo->mon1_type == MT_LCD) { - register_backlight_controller(&radeon_backlight_controller, - rinfo, "ati"); - register_backlight_controller(&radeon_backlight_controller, - rinfo, "mnca"); - } -#endif + radeonfb_bl_init(rinfo); printk ("radeonfb (%s): %s\n", pci_name(rinfo->pdev), rinfo->name); @@ -2517,7 +2379,6 @@ err_release_pci0: err_release_fb: framebuffer_release(info); err_disable: - pci_disable_device(pdev); err_out: return ret; } @@ -2531,7 +2392,8 @@ static void __devexit radeonfb_pci_unregister (struct pci_dev *pdev) if (!rinfo) return; - + + radeonfb_bl_exit(rinfo); radeonfb_pm_exit(rinfo); if (rinfo->mon1_EDID) @@ -2573,7 +2435,6 @@ static void __devexit radeonfb_pci_unregister (struct pci_dev *pdev) #endif fb_dealloc_cmap(&info->cmap); framebuffer_release(info); - pci_disable_device(pdev); } @@ -2619,8 +2480,10 @@ static int __init radeonfb_setup (char *options) } else if (!strncmp(this_opt, "ignore_edid", 11)) { ignore_edid = 1; #if defined(CONFIG_PM) && defined(CONFIG_X86) - } else if (!strncmp(this_opt, "force_sleep", 11)) { - radeon_force_sleep = 1; + } else if (!strncmp(this_opt, "force_sleep", 11)) { + force_sleep = 1; + } else if (!strncmp(this_opt, "ignore_devlist", 14)) { + ignore_devlist = 1; #endif } else mode_option = this_opt; @@ -2678,6 +2541,8 @@ MODULE_PARM_DESC(panel_yres, "int: set panel yres"); module_param(mode_option, charp, 0); MODULE_PARM_DESC(mode_option, "Specify resolution as \"x[-][@]\" "); #if defined(CONFIG_PM) && defined(CONFIG_X86) -module_param(radeon_force_sleep, int, 0); -MODULE_PARM_DESC(radeon_force_sleep, "bool: force ACPI sleep mode on untested machines"); +module_param(force_sleep, bool, 0); +MODULE_PARM_DESC(force_sleep, "bool: force D2 sleep mode on all hardware"); +module_param(ignore_devlist, bool, 0); +MODULE_PARM_DESC(ignore_devlist, "bool: ignore workarounds for bugs in specific laptops"); #endif diff --git a/drivers/video/aty/radeon_i2c.c b/drivers/video/aty/radeon_i2c.c index a9d0414e4..9aaca58c0 100644 --- a/drivers/video/aty/radeon_i2c.c +++ b/drivers/video/aty/radeon_i2c.c @@ -1,4 +1,3 @@ -#include #include #include #include diff --git a/drivers/video/aty/radeon_pm.c b/drivers/video/aty/radeon_pm.c index 459fda622..f31e606a2 100644 --- a/drivers/video/aty/radeon_pm.c +++ b/drivers/video/aty/radeon_pm.c @@ -25,25 +25,100 @@ #include #endif -/* For detecting supported PC laptops */ -#ifdef CONFIG_X86 -#include -#endif - #include "ati_ids.h" -#ifdef CONFIG_X86 -/* This array holds a list of supported PC laptops. - * Currently only few IBM models are tested. - * If you want to experiment, use dmidecode to find out - * vendor and product codes for Your laptop. +static void radeon_reinitialize_M10(struct radeonfb_info *rinfo); + +/* + * Workarounds for bugs in PC laptops: + * - enable D2 sleep in some IBM Thinkpads + * - special case for Samsung P35 + * + * Whitelist by subsystem vendor/device because + * its the subsystem vendor's fault! */ -static struct dmi_system_id __devinitdata radeonfb_dmi_table[] = { -#include "radeon_pm_whitelist.h" + +#if defined(CONFIG_PM) && defined(CONFIG_X86) +struct radeon_device_id { + const char *ident; /* (arbitrary) Name */ + const unsigned short subsystem_vendor; /* Subsystem Vendor ID */ + const unsigned short subsystem_device; /* Subsystem Device ID */ + const enum radeon_pm_mode pm_mode_modifier; /* modify pm_mode */ + const reinit_function_ptr new_reinit_func; /* changed reinit_func */ }; -extern int radeon_force_sleep; -#endif +#define BUGFIX(model, sv, sd, pm, fn) { \ + .ident = model, \ + .subsystem_vendor = sv, \ + .subsystem_device = sd, \ + .pm_mode_modifier = pm, \ + .new_reinit_func = fn \ +} + +static struct radeon_device_id radeon_workaround_list[] = { + BUGFIX("IBM Thinkpad R32", + PCI_VENDOR_ID_IBM, 0x1905, + radeon_pm_d2, NULL), + BUGFIX("IBM Thinkpad R40", + PCI_VENDOR_ID_IBM, 0x0526, + radeon_pm_d2, NULL), + BUGFIX("IBM Thinkpad R40", + PCI_VENDOR_ID_IBM, 0x0527, + radeon_pm_d2, NULL), + BUGFIX("IBM Thinkpad R50/R51/T40/T41", + PCI_VENDOR_ID_IBM, 0x0531, + radeon_pm_d2, NULL), + BUGFIX("IBM Thinkpad R51/T40/T41/T42", + PCI_VENDOR_ID_IBM, 0x0530, + radeon_pm_d2, NULL), + BUGFIX("IBM Thinkpad T30", + PCI_VENDOR_ID_IBM, 0x0517, + radeon_pm_d2, NULL), + BUGFIX("IBM Thinkpad T40p", + PCI_VENDOR_ID_IBM, 0x054d, + radeon_pm_d2, NULL), + BUGFIX("IBM Thinkpad T42", + PCI_VENDOR_ID_IBM, 0x0550, + radeon_pm_d2, NULL), + BUGFIX("IBM Thinkpad X31/X32", + PCI_VENDOR_ID_IBM, 0x052f, + radeon_pm_d2, NULL), + BUGFIX("Samsung P35", + PCI_VENDOR_ID_SAMSUNG, 0xc00c, + radeon_pm_off, radeon_reinitialize_M10), + { .ident = NULL } +}; + +static int radeon_apply_workarounds(struct radeonfb_info *rinfo) +{ + struct radeon_device_id *id; + + for (id = radeon_workaround_list; id->ident != NULL; id++ ) + if ((id->subsystem_vendor == rinfo->pdev->subsystem_vendor ) && + (id->subsystem_device == rinfo->pdev->subsystem_device )) { + + /* we found a device that requires workaround */ + printk(KERN_DEBUG "radeonfb: %s detected" + ", enabling workaround\n", id->ident); + + rinfo->pm_mode |= id->pm_mode_modifier; + + if (id->new_reinit_func != NULL) + rinfo->reinit_func = id->new_reinit_func; + + return 1; + } + return 0; /* not found */ +} + +#else /* defined(CONFIG_PM) && defined(CONFIG_X86) */ +static inline int radeon_apply_workarounds(struct radeonfb_info *rinfo) +{ + return 0; +} +#endif /* defined(CONFIG_PM) && defined(CONFIG_X86) */ + + static void radeon_pm_disable_dynamic_mode(struct radeonfb_info *rinfo) { @@ -876,18 +951,18 @@ static void radeon_pm_setup_for_suspend(struct radeonfb_info *rinfo) * now (until we get more info on how to compute the correct * value for various X86 bridges). */ - #ifdef CONFIG_PPC_PMAC - /* AGP PLL control */ - if (rinfo->family <= CHIP_FAMILY_RV280) { - OUTREG(BUS_CNTL1, INREG(BUS_CNTL1) | BUS_CNTL1__AGPCLK_VALID); - - OUTREG(BUS_CNTL1, - (INREG(BUS_CNTL1) & ~BUS_CNTL1__MOBILE_PLATFORM_SEL_MASK) - | (2<family <= CHIP_FAMILY_RV280) { + OUTREG(BUS_CNTL1, INREG(BUS_CNTL1) | BUS_CNTL1__AGPCLK_VALID); + OUTREG(BUS_CNTL1, + (INREG(BUS_CNTL1) & ~BUS_CNTL1__MOBILE_PLATFORM_SEL_MASK) + | (2<pm_reg = pci_find_capability(rinfo->pdev, PCI_CAP_ID_PM); @@ -2755,22 +2830,13 @@ void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk) } #if defined(CONFIG_PM) +#if defined(CONFIG_PPC_PMAC) /* Check if we can power manage on suspend/resume. We can do * D2 on M6, M7 and M9, and we can resume from D3 cold a few other * "Mac" cards, but that's all. We need more infos about what the * BIOS does tho. Right now, all this PM stuff is pmac-only for that * reason. --BenH */ - /* Special case for Samsung P35 laptops - */ - if ((rinfo->pdev->vendor == PCI_VENDOR_ID_ATI) && - (rinfo->pdev->device == PCI_CHIP_RV350_NP) && - (rinfo->pdev->subsystem_vendor == PCI_VENDOR_ID_SAMSUNG) && - (rinfo->pdev->subsystem_device == 0xc00c)) { - rinfo->reinit_func = radeon_reinitialize_M10; - rinfo->pm_mode |= radeon_pm_off; - } -#if defined(CONFIG_PPC_PMAC) if (machine_is(powermac) && rinfo->of_node) { if (rinfo->is_mobility && rinfo->pm_reg && rinfo->family <= CHIP_FAMILY_RV250) @@ -2817,28 +2883,17 @@ void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk) #endif /* defined(CONFIG_PPC_PMAC) */ #endif /* defined(CONFIG_PM) */ -/* The PM code also works on some PC laptops. - * Only a few models are actually tested so Your mileage may vary. - * We can do D2 on at least M7 and M9 on some IBM ThinkPad T41 models. - */ -#if defined(CONFIG_PM) && defined(CONFIG_X86) - if (radeon_force_sleep || dmi_check_system(radeonfb_dmi_table)) { - if (radeon_force_sleep) - printk("radeonfb: forcefully enabling sleep mode\n"); - else - printk("radeonfb: enabling sleep mode\n"); - - if (rinfo->is_mobility && rinfo->pm_reg && - rinfo->family <= CHIP_FAMILY_RV250) - rinfo->pm_mode |= radeon_pm_d2; + if (ignore_devlist) + printk(KERN_DEBUG + "radeonfb: skipping test for device workarounds\n"); + else + radeon_apply_workarounds(rinfo); - /* Power down TV DAC, that saves a significant amount of power, - * we'll have something better once we actually have some TVOut - * support - */ - OUTREG(TV_DAC_CNTL, INREG(TV_DAC_CNTL) | 0x07000000); + if (force_sleep) { + printk(KERN_DEBUG + "radeonfb: forcefully enabling D2 sleep mode\n"); + rinfo->pm_mode |= radeon_pm_d2; } -#endif /* defined(CONFIG_PM) && defined(CONFIG_X86) */ } void radeonfb_pm_exit(struct radeonfb_info *rinfo) diff --git a/drivers/video/aty/radeon_pm_whitelist.h b/drivers/video/aty/radeon_pm_whitelist.h deleted file mode 100644 index c484ee7f8..000000000 --- a/drivers/video/aty/radeon_pm_whitelist.h +++ /dev/null @@ -1,78 +0,0 @@ -#define E(_vendor, _product, _ident, _reporter) \ -{ /* _reporter */ \ - .ident = _ident, \ - .matches = { \ - DMI_MATCH(DMI_SYS_VENDOR, _vendor), \ - DMI_MATCH(DMI_PRODUCT_NAME, _product), \ - }, \ -} -E("IBM", "18297RG", "IBM ThinkPad R50", "Borschuk Oleg "), -E("IBM", "18299MG", "IBM ThinkPad R51", "Georges Herber "), -E("IBM", "1829EHG", "IBM ThinkPad R51", "Wouter Cloetens "), -E("IBM", "1829R6G", "IBM ThinkPad R51", "Sten Heinze"), -E("IBM", "1836Q6U", "IBM ThinkPad R51", "Eugene Pavlovsky"), -E("IBM", "236696G", "IBM ThinkPad T30", "Jakob Schiotz "), -E("IBM", "236697G", "IBM ThinkPad T30", "Stephan Groß "), -E("IBM", "2366JBG", "IBM ThinkPad T30", "Thomas M Steenholdt "), -E("IBM", "2366MU9", "IBM ThinkPad T30", "Phillip Jones "), -E("IBM", "2366QU5", "IBM ThinkPad T30", "ChazeFroy "), -/* brads's 2366QU8 works, but dmidecode shows bogus data */ -E("IBM", "2366QU8", "IBM ThinkPad T30", "Brad Smith "), -E("IBM", "23729CU", "IBM ThinkPad T40", "George Avrunin "), -E("IBM", "237314U", "IBM ThinkPad T40", "Dmitriy Zavin "), -E("IBM", "23731FG", "IBM ThinkPad T41", "Aivo Prykk "), -E("IBM", "237322G", "IBM ThinkPad T40", "Michele Lamarca "), -E("IBM", "237325G", "IBM ThinkPad T40", "Klaus Kurzmann "), -E("IBM", "23732FG", "IBM ThinkPad T41", "Antti Andreimann "), -E("IBM", "23733HM", "IBM ThinkPad T41", "Grahame Bowland "), -E("IBM", "23734G2", "IBM ThinkPad T40", "Antti P Miettinen "), -E("IBM", "23737JU", "IBM ThinkPad T41", "Matthew Saltzman "), -E("IBM", "23738CG", "IBM ThinkPad T40", "Pete Toscano "), -E("IBM", "237392G", "IBM ThinkPad T40", "Pete Toscano "), -E("IBM", "237394G", "IBM ThinkPad T40", "Manuel Carro "), -E("IBM", "237394U", "IBM ThinkPad T40", "Pete Toscano "), -E("IBM", "23739FU", "IBM ThinkPad T41", "Peter Jones "), -E("IBM", "23739HG", "IBM ThinkPad T41", "Chris Vanden Berghe "), -E("IBM", "23739HU", "IBM ThinkPad T41", "Ajay Ramaswamy "), -E("IBM", "2373BU7", "IBM ThinkPad T40", "Peter Jones "), -E("IBM", "2373F2G", "IBM ThinkPad T42", "Isaac Wilcox"), -E("IBM", "2373FWG", "IBM ThinkPad T42", "Jerome Poggi and Pete Toscano "), -E("IBM", "2373G1G", "IBM ThinkPad T40p", "Juerg Billeter "), -E("IBM", "2373G1U", "IBM ThinkPad T40p", "Bill Nottingham "), -E("IBM", "2373G3G", "IBM ThinkPad T40p", "Hartwig, Thomas "), -E("IBM", "2373GEU", "IBM ThinkPad T41p", "Eric Benson "), -E("IBM", "2373HU6", "IBM ThinkPad T41", "David Zeuthen "), -E("IBM", "2373JTU", "IBM ThinkPad T42", "Dwight Barkley "), -E("IBM", "2373MU4", "IBM ThinkPad T40", "Vernon Mauery "), -E("IBM", "2373RU1", "IBM ThinkPad T40", "Adam Glasgall "), -E("IBM", "2373TG5", "IBM ThinkPad T41", "Paul Ionescu "), -E("IBM", "2373XNX", "IBM ThinkPad T41", "Ajay Ramaswamy "), -E("IBM", "23746VU", "IBM ThinkPad T42", "Tim Hull "), -E("IBM", "2374CTO", "IBM ThinkPad T42", "Johannes Hansen"), -E("IBM", "2374ZEP", "IBM ThinkPad T42", "Johannes Hansen"), -E("IBM", "2378DEU", "IBM ThinkPad T41", "obi "), -E("IBM", "2378DLU", "IBM ThinkPad T41", "Paul Stanisci "), -E("IBM", "2378DUU", "IBM ThinkPad T42", "Austin Clements "), -E("IBM", "2378R2U", "IBM ThinkPad T42", "Ulrich Drepper "), -E("IBM", "2378RBF", "IBM ThinkPad T42", "Nicolas Dufresne "), -E("IBM", "2378RBU", "IBM ThinkPad T42", "Nicolas Dufresne "), -E("IBM", "2378XXE", "IBM ThinkPad T42", "Tom Marshall"), -E("IBM", "2379D6U", "IBM ThinkPad T41", "anonymous"), -E("IBM", "2379DJU", "IBM ThinkPad T41", "Volker Braun "), -E("IBM", "2658BQG", "IBM ThinkPad R32", "Frank Otto "), -E("IBM", "26725KU", "IBM ThinkPad X31", "Chris Lee "), -E("IBM", "2672A9U", "IBM ThinkPad X31", "Jeremy Katz "), -E("IBM", "2672JHG", "IBM ThinkPad X31", "Daniel P. Berrange "), -E("IBM", "2672RU3", "IBM ThinkPad X31", "Chris Blizzard "), - /* IBM ThinkPad X31 2672-XXH -> works, but doesn't fix the LCD - backlight on during S3 issue. */ -E("IBM", "2672XXH", "IBM ThinkPad X31", "Henrik Brix Andersen "), -E("IBM", "27223GG", "IBM ThinkPad R40", "Frank Schmitt "), -E("IBM", "27225MG", "IBM ThinkPad R40", "Nils Trebing "), -E("IBM", "27226YU", "IBM ThinkPad R40", "Rushi Bhatt"), -E("IBM", "2722B3G", "IBM ThinkPad R40", "Pete Toscano "), -E("IBM", "2722CDG", "IBM ThinkPad R40", "Meik Hellmund "), -{ }, -/* Negative reports: */ -/* E("IBM", "2373KUU", "IBM ThinkPad T42p", "Dax Kelson "), */ -#undef E diff --git a/drivers/video/aty/radeonfb.h b/drivers/video/aty/radeonfb.h index 217e00ab4..d5ff224a6 100644 --- a/drivers/video/aty/radeonfb.h +++ b/drivers/video/aty/radeonfb.h @@ -1,7 +1,6 @@ #ifndef __RADEONFB_H__ #define __RADEONFB_H__ -#include #include #include #include @@ -274,6 +273,8 @@ enum radeon_pm_mode { radeon_pm_off = 0x00000002, /* Can resume from D3 cold */ }; +typedef void (*reinit_function_ptr)(struct radeonfb_info *rinfo); + struct radeonfb_info { struct fb_info *info; @@ -339,7 +340,7 @@ struct radeonfb_info { int dynclk; int no_schedule; enum radeon_pm_mode pm_mode; - void (*reinit_func)(struct radeonfb_info *rinfo); + reinit_function_ptr reinit_func; /* Lock on register access */ spinlock_t reg_lock; @@ -382,7 +383,7 @@ struct radeonfb_info { /* Note about this function: we have some rare cases where we must not schedule, * this typically happen with our special "wake up early" hook which allows us to * wake up the graphic chip (and thus get the console back) before everything else - * on some machines that support that mecanism. At this point, interrupts are off + * on some machines that support that mechanism. At this point, interrupts are off * and scheduling is not permitted */ static inline void _radeon_msleep(struct radeonfb_info *rinfo, unsigned long ms) @@ -601,7 +602,7 @@ extern int radeon_probe_i2c_connector(struct radeonfb_info *rinfo, int conn, u8 /* PM Functions */ extern int radeonfb_pci_suspend(struct pci_dev *pdev, pm_message_t state); extern int radeonfb_pci_resume(struct pci_dev *pdev); -extern void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk); +extern void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk, int ignore_devlist, int force_sleep); extern void radeonfb_pm_exit(struct radeonfb_info *rinfo); /* Monitor probe functions */ @@ -625,4 +626,13 @@ extern int radeon_screen_blank(struct radeonfb_info *rinfo, int blank, int mode_ extern void radeon_write_mode (struct radeonfb_info *rinfo, struct radeon_regs *mode, int reg_only); +/* Backlight functions */ +#ifdef CONFIG_FB_RADEON_BACKLIGHT +extern void radeonfb_bl_init(struct radeonfb_info *rinfo); +extern void radeonfb_bl_exit(struct radeonfb_info *rinfo); +#else +static inline void radeonfb_bl_init(struct radeonfb_info *rinfo) {} +static inline void radeonfb_bl_exit(struct radeonfb_info *rinfo) {} +#endif + #endif /* __RADEONFB_H__ */ diff --git a/drivers/video/au1100fb.c b/drivers/video/au1100fb.c index cacd88cc8..f25d5d648 100644 --- a/drivers/video/au1100fb.c +++ b/drivers/video/au1100fb.c @@ -2,6 +2,13 @@ * BRIEF MODULE DESCRIPTION * Au1100 LCD Driver. * + * Rewritten for 2.6 by Embedded Alley Solutions + * , based on submissions by + * Karl Lessard + * + * + * PM support added by Rodolfo Giometti + * * Copyright 2002 MontaVista Software * Author: MontaVista Software, Inc. * ppopov@mvista.com or source@mvista.com @@ -33,298 +40,254 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 675 Mass Ave, Cambridge, MA 02139, USA. */ - #include #include #include #include #include -#include -#include -#include #include #include -#include +#include +#include +#include +#include -#include -#include -#include "au1100fb.h" +#include -#include

> parameter to , , - and . - Work sponsored by SGI. - v0.76 - 19991017 Richard Gooch - Allow multiple unregistrations. - Work sponsored by SGI. - v0.77 - 19991026 Richard Gooch - Added major and minor number to devfsd protocol. - Incremented devfsd protocol revision to 5. - Work sponsored by SGI. - v0.78 - 19991030 Richard Gooch - Support info pointer for all devfs entry types. - Added <> parameter to and - . - Work sponsored by SGI. - v0.79 - 19991031 Richard Gooch - Support "../" when searching devfs namespace. - Work sponsored by SGI. - v0.80 - 19991101 Richard Gooch - Created . - Work sponsored by SGI. - v0.81 - 19991103 Richard Gooch - Exported . - Work sponsored by SGI. - v0.82 - 19991104 Richard Gooch - Removed unused . - 19991105 Richard Gooch - Do not hide entries from devfsd or children. - Removed DEVFS_ FL_TTY_COMPAT flag. - Removed "nottycompat" boot option. - Removed . - Work sponsored by SGI. - v0.83 - 19991107 Richard Gooch - Added DEVFS_FL_WAIT flag. - Work sponsored by SGI. - v0.84 - 19991107 Richard Gooch - Support new "disc" naming scheme in . - Allow NULL fops in . - Work sponsored by SGI. - v0.85 - 19991110 Richard Gooch - Fall back to major table if NULL fops given to . - Work sponsored by SGI. - v0.86 - 19991204 Richard Gooch - Support fifos when unregistering. - Work sponsored by SGI. - v0.87 - 19991209 Richard Gooch - Removed obsolete DEVFS_ FL_COMPAT and DEVFS_ FL_TOLERANT flags. - Work sponsored by SGI. - v0.88 - 19991214 Richard Gooch - Removed kmod support. - Work sponsored by SGI. - v0.89 - 19991216 Richard Gooch - Improved debugging in . - Ensure dentries created by devfsd will be cleaned up. - Work sponsored by SGI. - v0.90 - 19991223 Richard Gooch - Created . - Work sponsored by SGI. - v0.91 - 20000203 Richard Gooch - Ported to kernel 2.3.42. - Removed . - Work sponsored by SGI. - v0.92 - 20000306 Richard Gooch - Added DEVFS_ FL_NO_PERSISTENCE flag. - Removed unnecessary call to in - . - Work sponsored by SGI. - v0.93 - 20000413 Richard Gooch - Set inode->i_size to correct size for symlinks. - 20000414 Richard Gooch - Only give lookup() method to directories to comply with new VFS - assumptions. - Work sponsored by SGI. - 20000415 Richard Gooch - Remove unnecessary tests in symlink methods. - Don't kill existing block ops in . - Work sponsored by SGI. - v0.94 - 20000424 Richard Gooch - Don't create missing directories in . - Work sponsored by SGI. - v0.95 - 20000430 Richard Gooch - Added CONFIG_DEVFS_MOUNT. - Work sponsored by SGI. - v0.96 - 20000608 Richard Gooch - Disabled multi-mount capability (use VFS bindings instead). - Work sponsored by SGI. - v0.97 - 20000610 Richard Gooch - Switched to FS_SINGLE to disable multi-mounts. - 20000612 Richard Gooch - Removed module support. - Removed multi-mount code. - Removed compatibility macros: VFS has changed too much. - Work sponsored by SGI. - v0.98 - 20000614 Richard Gooch - Merged devfs inode into devfs entry. - Work sponsored by SGI. - v0.99 - 20000619 Richard Gooch - Removed dead code in which used to call - . - Work sponsored by SGI. - v0.100 - 20000621 Richard Gooch - Changed interface to . - Work sponsored by SGI. - v0.101 - 20000622 Richard Gooch - Simplified interface to and . - Simplified interface to . - Work sponsored by SGI. - v0.102 - 20010519 Richard Gooch - Ensure terminates string for root entry. - Exported to modules. - 20010520 Richard Gooch - Make send events to devfsd. - Cleaned up option processing in . - 20010521 Richard Gooch - Fixed bugs in handling symlinks: could leak or cause Oops. - 20010522 Richard Gooch - Cleaned up directory handling by separating fops. - v0.103 - 20010601 Richard Gooch - Fixed handling of inverted options in . - v0.104 - 20010604 Richard Gooch - Adjusted to account for fix. - v0.105 - 20010617 Richard Gooch - Answered question posed by Al Viro and removed his comments. - Moved setting of registered flag after other fields are changed. - Fixed race between and . - Global VFS changes added bogus BKL to : removed. - Widened locking in and . - Replaced stack usage with kmalloc. - Simplified locking in and fixed memory leak. - v0.106 - 20010709 Richard Gooch - Removed broken devnum allocation and use . - Fixed old devnum leak by calling new . - v0.107 - 20010712 Richard Gooch - Fixed bug in which could hang boot process. - v0.108 - 20010730 Richard Gooch - Added DEVFSD_NOTIFY_DELETE event. - 20010801 Richard Gooch - Removed #include . - v0.109 - 20010807 Richard Gooch - Fixed inode table races by removing it and using - inode->u.generic_ip instead. - Moved into . - Moved into . - v0.110 - 20010808 Richard Gooch - Fixed race in for uni-processor. - v0.111 - 20010818 Richard Gooch - Removed remnant of multi-mount support in . - Removed unused DEVFS_FL_SHOW_UNREG flag. - v0.112 - 20010820 Richard Gooch - Removed nlink field from struct devfs_inode. - v0.113 - 20010823 Richard Gooch - Replaced BKL with global rwsem to protect symlink data (quick - and dirty hack). - v0.114 - 20010827 Richard Gooch - Replaced global rwsem for symlink with per-link refcount. - v0.115 - 20010919 Richard Gooch - Set inode->i_mapping->a_ops for block nodes in . - v0.116 - 20011008 Richard Gooch - Fixed overrun in by removing function (not needed). - 20011009 Richard Gooch - Fixed buffer underrun in . - 20011029 Richard Gooch - Fixed race in when setting event mask. - 20011114 Richard Gooch - First release of new locking code. - v1.0 - 20011117 Richard Gooch - Discard temporary buffer, now use "%s" for dentry names. - 20011118 Richard Gooch - Don't generate path in : use fake entry instead. - Use "existing" directory in <_devfs_make_parent_for_leaf>. - 20011122 Richard Gooch - Use slab cache rather than fixed buffer for devfsd events. - v1.1 - 20011125 Richard Gooch - Send DEVFSD_NOTIFY_REGISTERED events in . - 20011127 Richard Gooch - Fixed locking bug in due to typo. - Do not send CREATE, CHANGE, ASYNC_OPEN or DELETE events from - devfsd or children. - v1.2 - 20011202 Richard Gooch - Fixed bug in : was dereferencing freed pointer. - v1.3 - 20011203 Richard Gooch - Fixed bug in : was dereferencing freed pointer. - Added process group check for devfsd privileges. - v1.4 - 20011204 Richard Gooch - Use SLAB_ATOMIC in from . - v1.5 - 20011211 Richard Gooch - Return old entry in for 2.4.x kernels. - 20011212 Richard Gooch - Increment refcount on module in . - 20011215 Richard Gooch - Created and exported . - Increment refcount on module in . - Created . - v1.6 - 20011216 Richard Gooch - Added poisoning to . - Improved debugging messages. - v1.7 - 20011221 Richard Gooch - Corrected (made useful) debugging message in . - Moved in to - 20011224 Richard Gooch - Added magic number to guard against scribbling drivers. - 20011226 Richard Gooch - Only return old entry in if a directory. - Defined macros for error and debug messages. - v1.8 - 20020113 Richard Gooch - Fixed (rare, old) race in . - v1.9 - 20020120 Richard Gooch - Fixed deadlock bug in . - Tag VFS deletable in if handle ignored. - v1.10 - 20020129 Richard Gooch - Added KERN_* to remaining messages. - Cleaned up declaration of . - v1.11 - 20020219 Richard Gooch - Changed to allow later additions if not yet empty. - v1.12 - 20020406 Richard Gooch - Removed silently introduced calls to lock_kernel() and - unlock_kernel() due to recent VFS locking changes. BKL isn't - required in devfs. - v1.13 - 20020428 Richard Gooch - Removed 2.4.x compatibility code. - v1.14 - 20020510 Richard Gooch - Added BKL to because drivers still need it. - v1.15 - 20020512 Richard Gooch - Protected and - from changing directory contents. - v1.16 - 20020514 Richard Gooch - Minor cleanup of . - v1.17 - 20020721 Richard Gooch - Switched to ISO C structure field initialisers. - Switch to set_current_state() and move before add_wait_queue(). - 20020722 Richard Gooch - Fixed devfs entry leak in when *readdir fails. - v1.18 - 20020725 Richard Gooch - Created . - v1.19 - 20020728 Richard Gooch - Removed deprecated . - v1.20 - 20020820 Richard Gooch - Fixed module unload race in . - v1.21 - 20021013 Richard Gooch - Removed DEVFS_ FL_AUTO_OWNER. - Switched lingering structure field initialiser to ISO C. - Added locking when updating FCB flags. - v1.22 -*/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#define DEVFS_VERSION "2004-01-31" - -#define DEVFS_NAME "devfs" - -#define FIRST_INODE 1 - -#define STRING_LENGTH 256 -#define FAKE_BLOCK_SIZE 1024 -#define POISON_PTR ( *(void **) poison_array ) -#define MAGIC_VALUE 0x327db823 - -#ifndef TRUE -# define TRUE 1 -# define FALSE 0 -#endif - -#define MODE_DIR (S_IFDIR | S_IWUSR | S_IRUGO | S_IXUGO) - -#define DEBUG_NONE 0x0000000 -#define DEBUG_MODULE_LOAD 0x0000001 -#define DEBUG_REGISTER 0x0000002 -#define DEBUG_UNREGISTER 0x0000004 -#define DEBUG_FREE 0x0000008 -#define DEBUG_SET_FLAGS 0x0000010 -#define DEBUG_S_READ 0x0000100 /* Break */ -#define DEBUG_I_LOOKUP 0x0001000 /* Break */ -#define DEBUG_I_CREATE 0x0002000 -#define DEBUG_I_GET 0x0004000 -#define DEBUG_I_CHANGE 0x0008000 -#define DEBUG_I_UNLINK 0x0010000 -#define DEBUG_I_RLINK 0x0020000 -#define DEBUG_I_FLINK 0x0040000 -#define DEBUG_I_MKNOD 0x0080000 -#define DEBUG_F_READDIR 0x0100000 /* Break */ -#define DEBUG_D_DELETE 0x1000000 /* Break */ -#define DEBUG_D_RELEASE 0x2000000 -#define DEBUG_D_IPUT 0x4000000 -#define DEBUG_ALL 0xfffffff -#define DEBUG_DISABLED DEBUG_NONE - -#define OPTION_NONE 0x00 -#define OPTION_MOUNT 0x01 - -#define PRINTK(format, args...) \ - {printk (KERN_ERR "%s" format, __FUNCTION__ , ## args);} - -#define OOPS(format, args...) \ - {printk (KERN_CRIT "%s" format, __FUNCTION__ , ## args); \ - printk ("Forcing Oops\n"); \ - BUG();} - -#ifdef CONFIG_DEVFS_DEBUG -# define VERIFY_ENTRY(de) \ - {if ((de) && (de)->magic_number != MAGIC_VALUE) \ - OOPS ("(%p): bad magic value: %x\n", (de), (de)->magic_number);} -# define WRITE_ENTRY_MAGIC(de,magic) (de)->magic_number = (magic) -# define DPRINTK(flag, format, args...) \ - {if (devfs_debug & flag) \ - printk (KERN_INFO "%s" format, __FUNCTION__ , ## args);} -#else -# define VERIFY_ENTRY(de) -# define WRITE_ENTRY_MAGIC(de,magic) -# define DPRINTK(flag, format, args...) -#endif - -typedef struct devfs_entry *devfs_handle_t; - -struct directory_type { - rwlock_t lock; /* Lock for searching(R)/updating(W) */ - struct devfs_entry *first; - struct devfs_entry *last; - unsigned char no_more_additions:1; -}; - -struct symlink_type { - unsigned int length; /* Not including the NULL-termimator */ - char *linkname; /* This is NULL-terminated */ -}; - -struct devfs_inode { /* This structure is for "persistent" inode storage */ - struct dentry *dentry; - struct timespec atime; - struct timespec mtime; - struct timespec ctime; - unsigned int ino; /* Inode number as seen in the VFS */ - uid_t uid; - gid_t gid; -}; - -struct devfs_entry { -#ifdef CONFIG_DEVFS_DEBUG - unsigned int magic_number; -#endif - void *info; - atomic_t refcount; /* When this drops to zero, it's unused */ - union { - struct directory_type dir; - dev_t dev; - struct symlink_type symlink; - const char *name; /* Only used for (mode == 0) */ - } u; - struct devfs_entry *prev; /* Previous entry in the parent directory */ - struct devfs_entry *next; /* Next entry in the parent directory */ - struct devfs_entry *parent; /* The parent directory */ - struct devfs_inode inode; - umode_t mode; - unsigned short namelen; /* I think 64k+ filenames are a way off... */ - unsigned char vfs:1; /* Whether the VFS may delete the entry */ - char name[1]; /* This is just a dummy: the allocated array - is bigger. This is NULL-terminated */ -}; - -/* The root of the device tree */ -static struct devfs_entry *root_entry; - -struct devfsd_buf_entry { - struct devfs_entry *de; /* The name is generated with this */ - unsigned short type; /* The type of event */ - umode_t mode; - uid_t uid; - gid_t gid; - struct devfsd_buf_entry *next; -}; - -struct fs_info { /* This structure is for the mounted devfs */ - struct super_block *sb; - spinlock_t devfsd_buffer_lock; /* Lock when inserting/deleting events */ - struct devfsd_buf_entry *devfsd_first_event; - struct devfsd_buf_entry *devfsd_last_event; - volatile int devfsd_sleeping; - volatile struct task_struct *devfsd_task; - volatile pid_t devfsd_pgrp; - volatile struct file *devfsd_file; - struct devfsd_notify_struct *devfsd_info; - volatile unsigned long devfsd_event_mask; - atomic_t devfsd_overrun_count; - wait_queue_head_t devfsd_wait_queue; /* Wake devfsd on input */ - wait_queue_head_t revalidate_wait_queue; /* Wake when devfsd sleeps */ -}; - -static struct fs_info fs_info = {.devfsd_buffer_lock = SPIN_LOCK_UNLOCKED }; -static kmem_cache_t *devfsd_buf_cache; -#ifdef CONFIG_DEVFS_DEBUG -static unsigned int devfs_debug_init __initdata = DEBUG_NONE; -static unsigned int devfs_debug = DEBUG_NONE; -static DEFINE_SPINLOCK(stat_lock); -static unsigned int stat_num_entries; -static unsigned int stat_num_bytes; -#endif -static unsigned char poison_array[8] = - { 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a }; - -#ifdef CONFIG_DEVFS_MOUNT -static unsigned int boot_options = OPTION_MOUNT; -#else -static unsigned int boot_options = OPTION_NONE; -#endif - -/* Forward function declarations */ -static devfs_handle_t _devfs_walk_path(struct devfs_entry *dir, - const char *name, int namelen, - int traverse_symlink); -static ssize_t devfsd_read(struct file *file, char __user *buf, size_t len, - loff_t * ppos); -static int devfsd_ioctl(struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg); -static int devfsd_close(struct inode *inode, struct file *file); -#ifdef CONFIG_DEVFS_DEBUG -static ssize_t stat_read(struct file *file, char __user *buf, size_t len, - loff_t * ppos); -static const struct file_operations stat_fops = { - .open = nonseekable_open, - .read = stat_read, -}; -#endif - -/* Devfs daemon file operations */ -static const struct file_operations devfsd_fops = { - .open = nonseekable_open, - .read = devfsd_read, - .ioctl = devfsd_ioctl, - .release = devfsd_close, -}; - -/* Support functions follow */ - -/** - * devfs_get - Get a reference to a devfs entry. - * @de: The devfs entry. - */ - -static struct devfs_entry *devfs_get(struct devfs_entry *de) -{ - VERIFY_ENTRY(de); - if (de) - atomic_inc(&de->refcount); - return de; -} /* End Function devfs_get */ - -/** - * devfs_put - Put (release) a reference to a devfs entry. - * @de: The handle to the devfs entry. - */ - -static void devfs_put(devfs_handle_t de) -{ - if (!de) - return; - VERIFY_ENTRY(de); - if (de->info == POISON_PTR) - OOPS("(%p): poisoned pointer\n", de); - if (!atomic_dec_and_test(&de->refcount)) - return; - if (de == root_entry) - OOPS("(%p): root entry being freed\n", de); - DPRINTK(DEBUG_FREE, "(%s): de: %p, parent: %p \"%s\"\n", - de->name, de, de->parent, - de->parent ? de->parent->name : "no parent"); - if (S_ISLNK(de->mode)) - kfree(de->u.symlink.linkname); - WRITE_ENTRY_MAGIC(de, 0); -#ifdef CONFIG_DEVFS_DEBUG - spin_lock(&stat_lock); - --stat_num_entries; - stat_num_bytes -= sizeof *de + de->namelen; - if (S_ISLNK(de->mode)) - stat_num_bytes -= de->u.symlink.length + 1; - spin_unlock(&stat_lock); -#endif - de->info = POISON_PTR; - kfree(de); -} /* End Function devfs_put */ - -/** - * _devfs_search_dir - Search for a devfs entry in a directory. - * @dir: The directory to search. - * @name: The name of the entry to search for. - * @namelen: The number of characters in @name. - * - * Search for a devfs entry in a directory and returns a pointer to the entry - * on success, else %NULL. The directory must be locked already. - * An implicit devfs_get() is performed on the returned entry. - */ - -static struct devfs_entry *_devfs_search_dir(struct devfs_entry *dir, - const char *name, - unsigned int namelen) -{ - struct devfs_entry *curr; - - if (!S_ISDIR(dir->mode)) { - PRINTK("(%s): not a directory\n", dir->name); - return NULL; - } - for (curr = dir->u.dir.first; curr != NULL; curr = curr->next) { - if (curr->namelen != namelen) - continue; - if (memcmp(curr->name, name, namelen) == 0) - break; - /* Not found: try the next one */ - } - return devfs_get(curr); -} /* End Function _devfs_search_dir */ - -/** - * _devfs_alloc_entry - Allocate a devfs entry. - * @name: the name of the entry - * @namelen: the number of characters in @name - * @mode: the mode for the entry - * - * Allocate a devfs entry and returns a pointer to the entry on success, else - * %NULL. - */ - -static struct devfs_entry *_devfs_alloc_entry(const char *name, - unsigned int namelen, - umode_t mode) -{ - struct devfs_entry *new; - static unsigned long inode_counter = FIRST_INODE; - static DEFINE_SPINLOCK(counter_lock); - - if (name && (namelen < 1)) - namelen = strlen(name); - if ((new = kmalloc(sizeof *new + namelen, GFP_KERNEL)) == NULL) - return NULL; - memset(new, 0, sizeof *new + namelen); /* Will set '\0' on name */ - new->mode = mode; - if (S_ISDIR(mode)) - rwlock_init(&new->u.dir.lock); - atomic_set(&new->refcount, 1); - spin_lock(&counter_lock); - new->inode.ino = inode_counter++; - spin_unlock(&counter_lock); - if (name) - memcpy(new->name, name, namelen); - new->namelen = namelen; - WRITE_ENTRY_MAGIC(new, MAGIC_VALUE); -#ifdef CONFIG_DEVFS_DEBUG - spin_lock(&stat_lock); - ++stat_num_entries; - stat_num_bytes += sizeof *new + namelen; - spin_unlock(&stat_lock); -#endif - return new; -} /* End Function _devfs_alloc_entry */ - -/** - * _devfs_append_entry - Append a devfs entry to a directory's child list. - * @dir: The directory to add to. - * @de: The devfs entry to append. - * @old_de: If an existing entry exists, it will be written here. This may - * be %NULL. An implicit devfs_get() is performed on this entry. - * - * Append a devfs entry to a directory's list of children, checking first to - * see if an entry of the same name exists. The directory will be locked. - * The value 0 is returned on success, else a negative error code. - * On failure, an implicit devfs_put() is performed on %de. - */ - -static int _devfs_append_entry(devfs_handle_t dir, devfs_handle_t de, - devfs_handle_t * old_de) -{ - int retval; - - if (old_de) - *old_de = NULL; - if (!S_ISDIR(dir->mode)) { - PRINTK("(%s): dir: \"%s\" is not a directory\n", de->name, - dir->name); - devfs_put(de); - return -ENOTDIR; - } - write_lock(&dir->u.dir.lock); - if (dir->u.dir.no_more_additions) - retval = -ENOENT; - else { - struct devfs_entry *old; - - old = _devfs_search_dir(dir, de->name, de->namelen); - if (old_de) - *old_de = old; - else - devfs_put(old); - if (old == NULL) { - de->parent = dir; - de->prev = dir->u.dir.last; - /* Append to the directory's list of children */ - if (dir->u.dir.first == NULL) - dir->u.dir.first = de; - else - dir->u.dir.last->next = de; - dir->u.dir.last = de; - retval = 0; - } else - retval = -EEXIST; - } - write_unlock(&dir->u.dir.lock); - if (retval) - devfs_put(de); - return retval; -} /* End Function _devfs_append_entry */ - -/** - * _devfs_get_root_entry - Get the root devfs entry. - * - * Returns the root devfs entry on success, else %NULL. - * - * TODO it must be called asynchronously due to the fact - * that devfs is initialized relatively late. Proper way - * is to remove module_init from init_devfs_fs and manually - * call it early enough during system init - */ - -static struct devfs_entry *_devfs_get_root_entry(void) -{ - struct devfs_entry *new; - static DEFINE_SPINLOCK(root_lock); - - if (root_entry) - return root_entry; - - new = _devfs_alloc_entry(NULL, 0, MODE_DIR); - if (new == NULL) - return NULL; - - spin_lock(&root_lock); - if (root_entry) { - spin_unlock(&root_lock); - devfs_put(new); - return root_entry; - } - root_entry = new; - spin_unlock(&root_lock); - - return root_entry; -} /* End Function _devfs_get_root_entry */ - -/** - * _devfs_descend - Descend down a tree using the next component name. - * @dir: The directory to search. - * @name: The component name to search for. - * @namelen: The length of %name. - * @next_pos: The position of the next '/' or '\0' is written here. - * - * Descend into a directory, searching for a component. This function forms - * the core of a tree-walking algorithm. The directory will be locked. - * The devfs entry corresponding to the component is returned. If there is - * no matching entry, %NULL is returned. - * An implicit devfs_get() is performed on the returned entry. - */ - -static struct devfs_entry *_devfs_descend(struct devfs_entry *dir, - const char *name, int namelen, - int *next_pos) -{ - const char *stop, *ptr; - struct devfs_entry *entry; - - if ((namelen >= 3) && (strncmp(name, "../", 3) == 0)) { /* Special-case going to parent directory */ - *next_pos = 3; - return devfs_get(dir->parent); - } - stop = name + namelen; - /* Search for a possible '/' */ - for (ptr = name; (ptr < stop) && (*ptr != '/'); ++ptr) ; - *next_pos = ptr - name; - read_lock(&dir->u.dir.lock); - entry = _devfs_search_dir(dir, name, *next_pos); - read_unlock(&dir->u.dir.lock); - return entry; -} /* End Function _devfs_descend */ - -static devfs_handle_t _devfs_make_parent_for_leaf(struct devfs_entry *dir, - const char *name, - int namelen, int *leaf_pos) -{ - int next_pos = 0; - - if (dir == NULL) - dir = _devfs_get_root_entry(); - if (dir == NULL) - return NULL; - devfs_get(dir); - /* Search for possible trailing component and ignore it */ - for (--namelen; (namelen > 0) && (name[namelen] != '/'); --namelen) ; - *leaf_pos = (name[namelen] == '/') ? (namelen + 1) : 0; - for (; namelen > 0; name += next_pos, namelen -= next_pos) { - struct devfs_entry *de, *old = NULL; - - if ((de = - _devfs_descend(dir, name, namelen, &next_pos)) == NULL) { - de = _devfs_alloc_entry(name, next_pos, MODE_DIR); - devfs_get(de); - if (!de || _devfs_append_entry(dir, de, &old)) { - devfs_put(de); - if (!old || !S_ISDIR(old->mode)) { - devfs_put(old); - devfs_put(dir); - return NULL; - } - de = old; /* Use the existing directory */ - } - } - if (de == dir->parent) { - devfs_put(dir); - devfs_put(de); - return NULL; - } - devfs_put(dir); - dir = de; - if (name[next_pos] == '/') - ++next_pos; - } - return dir; -} /* End Function _devfs_make_parent_for_leaf */ - -static devfs_handle_t _devfs_prepare_leaf(devfs_handle_t * dir, - const char *name, umode_t mode) -{ - int namelen, leaf_pos; - struct devfs_entry *de; - - namelen = strlen(name); - if ((*dir = _devfs_make_parent_for_leaf(*dir, name, namelen, - &leaf_pos)) == NULL) { - PRINTK("(%s): could not create parent path\n", name); - return NULL; - } - if ((de = _devfs_alloc_entry(name + leaf_pos, namelen - leaf_pos, mode)) - == NULL) { - PRINTK("(%s): could not allocate entry\n", name); - devfs_put(*dir); - return NULL; - } - return de; -} /* End Function _devfs_prepare_leaf */ - -static devfs_handle_t _devfs_walk_path(struct devfs_entry *dir, - const char *name, int namelen, - int traverse_symlink) -{ - int next_pos = 0; - - if (dir == NULL) - dir = _devfs_get_root_entry(); - if (dir == NULL) - return NULL; - devfs_get(dir); - for (; namelen > 0; name += next_pos, namelen -= next_pos) { - struct devfs_entry *de, *link; - - if (!S_ISDIR(dir->mode)) { - devfs_put(dir); - return NULL; - } - - if ((de = - _devfs_descend(dir, name, namelen, &next_pos)) == NULL) { - devfs_put(dir); - return NULL; - } - if (S_ISLNK(de->mode) && traverse_symlink) { /* Need to follow the link: this is a stack chomper */ - /* FIXME what if it puts outside of mounted tree? */ - link = _devfs_walk_path(dir, de->u.symlink.linkname, - de->u.symlink.length, TRUE); - devfs_put(de); - if (!link) { - devfs_put(dir); - return NULL; - } - de = link; - } - devfs_put(dir); - dir = de; - if (name[next_pos] == '/') - ++next_pos; - } - return dir; -} /* End Function _devfs_walk_path */ - -/** - * _devfs_find_entry - Find a devfs entry. - * @dir: The handle to the parent devfs directory entry. If this is %NULL the - * name is relative to the root of the devfs. - * @name: The name of the entry. This may be %NULL. - * @traverse_symlink: If %TRUE then symbolic links are traversed. - * - * Returns the devfs_entry pointer on success, else %NULL. An implicit - * devfs_get() is performed. - */ - -static struct devfs_entry *_devfs_find_entry(devfs_handle_t dir, - const char *name, - int traverse_symlink) -{ - unsigned int namelen = strlen(name); - - if (name[0] == '/') { - /* Skip leading pathname component */ - if (namelen < 2) { - PRINTK("(%s): too short\n", name); - return NULL; - } - for (++name, --namelen; (*name != '/') && (namelen > 0); - ++name, --namelen) ; - if (namelen < 2) { - PRINTK("(%s): too short\n", name); - return NULL; - } - ++name; - --namelen; - } - return _devfs_walk_path(dir, name, namelen, traverse_symlink); -} /* End Function _devfs_find_entry */ - -static struct devfs_entry *get_devfs_entry_from_vfs_inode(struct inode *inode) -{ - if (inode == NULL) - return NULL; - VERIFY_ENTRY((struct devfs_entry *)inode->u.generic_ip); - return inode->u.generic_ip; -} /* End Function get_devfs_entry_from_vfs_inode */ - -/** - * free_dentry - Free the dentry for a device entry and invalidate inode. - * @de: The entry. - * - * This must only be called after the entry has been unhooked from its - * parent directory. - */ - -static void free_dentry(struct devfs_entry *de) -{ - struct dentry *dentry = de->inode.dentry; - - if (!dentry) - return; - spin_lock(&dcache_lock); - dget_locked(dentry); - spin_unlock(&dcache_lock); - /* Forcefully remove the inode */ - if (dentry->d_inode != NULL) - dentry->d_inode->i_nlink = 0; - d_drop(dentry); - dput(dentry); -} /* End Function free_dentry */ - -/** - * is_devfsd_or_child - Test if the current process is devfsd or one of its children. - * @fs_info: The filesystem information. - * - * Returns %TRUE if devfsd or child, else %FALSE. - */ - -static int is_devfsd_or_child(struct fs_info *fs_info) -{ - struct task_struct *p = current; - - if (p == fs_info->devfsd_task) - return (TRUE); - if (process_group(p) == fs_info->devfsd_pgrp) - return (TRUE); - read_lock(&tasklist_lock); - for (; p != &init_task; p = p->real_parent) { - if (p == fs_info->devfsd_task) { - read_unlock(&tasklist_lock); - return (TRUE); - } - } - read_unlock(&tasklist_lock); - return (FALSE); -} /* End Function is_devfsd_or_child */ - -/** - * devfsd_queue_empty - Test if devfsd has work pending in its event queue. - * @fs_info: The filesystem information. - * - * Returns %TRUE if the queue is empty, else %FALSE. - */ - -static inline int devfsd_queue_empty(struct fs_info *fs_info) -{ - return (fs_info->devfsd_last_event) ? FALSE : TRUE; -} /* End Function devfsd_queue_empty */ - -/** - * wait_for_devfsd_finished - Wait for devfsd to finish processing its event queue. - * @fs_info: The filesystem information. - * - * Returns %TRUE if no more waiting will be required, else %FALSE. - */ - -static int wait_for_devfsd_finished(struct fs_info *fs_info) -{ - DECLARE_WAITQUEUE(wait, current); - - if (fs_info->devfsd_task == NULL) - return (TRUE); - if (devfsd_queue_empty(fs_info) && fs_info->devfsd_sleeping) - return TRUE; - if (is_devfsd_or_child(fs_info)) - return (FALSE); - set_current_state(TASK_UNINTERRUPTIBLE); - add_wait_queue(&fs_info->revalidate_wait_queue, &wait); - if (!devfsd_queue_empty(fs_info) || !fs_info->devfsd_sleeping) - if (fs_info->devfsd_task) - schedule(); - remove_wait_queue(&fs_info->revalidate_wait_queue, &wait); - __set_current_state(TASK_RUNNING); - return (TRUE); -} /* End Function wait_for_devfsd_finished */ - -/** - * devfsd_notify_de - Notify the devfsd daemon of a change. - * @de: The devfs entry that has changed. This and all parent entries will - * have their reference counts incremented if the event was queued. - * @type: The type of change. - * @mode: The mode of the entry. - * @uid: The user ID. - * @gid: The group ID. - * @fs_info: The filesystem info. - * - * Returns %TRUE if an event was queued and devfsd woken up, else %FALSE. - */ - -static int devfsd_notify_de(struct devfs_entry *de, - unsigned short type, umode_t mode, - uid_t uid, gid_t gid, struct fs_info *fs_info) -{ - struct devfsd_buf_entry *entry; - struct devfs_entry *curr; - - if (!(fs_info->devfsd_event_mask & (1 << type))) - return (FALSE); - if ((entry = kmem_cache_alloc(devfsd_buf_cache, SLAB_KERNEL)) == NULL) { - atomic_inc(&fs_info->devfsd_overrun_count); - return (FALSE); - } - for (curr = de; curr != NULL; curr = curr->parent) - devfs_get(curr); - entry->de = de; - entry->type = type; - entry->mode = mode; - entry->uid = uid; - entry->gid = gid; - entry->next = NULL; - spin_lock(&fs_info->devfsd_buffer_lock); - if (!fs_info->devfsd_first_event) - fs_info->devfsd_first_event = entry; - if (fs_info->devfsd_last_event) - fs_info->devfsd_last_event->next = entry; - fs_info->devfsd_last_event = entry; - spin_unlock(&fs_info->devfsd_buffer_lock); - wake_up_interruptible(&fs_info->devfsd_wait_queue); - return (TRUE); -} /* End Function devfsd_notify_de */ - -/** - * devfsd_notify - Notify the devfsd daemon of a change. - * @de: The devfs entry that has changed. - * @type: The type of change event. - * @wait: If TRUE, the function waits for the daemon to finish processing - * the event. - */ - -static void devfsd_notify(struct devfs_entry *de, unsigned short type) -{ - devfsd_notify_de(de, type, de->mode, current->euid, - current->egid, &fs_info); -} - -static int devfs_mk_dev(dev_t dev, umode_t mode, const char *fmt, va_list args) -{ - struct devfs_entry *dir = NULL, *de; - char buf[64]; - int error, n; - - n = vsnprintf(buf, sizeof(buf), fmt, args); - if (n >= sizeof(buf) || !buf[0]) { - printk(KERN_WARNING "%s: invalid format string %s\n", - __FUNCTION__, fmt); - return -EINVAL; - } - - de = _devfs_prepare_leaf(&dir, buf, mode); - if (!de) { - printk(KERN_WARNING "%s: could not prepare leaf for %s\n", - __FUNCTION__, buf); - return -ENOMEM; /* could be more accurate... */ - } - - de->u.dev = dev; - - error = _devfs_append_entry(dir, de, NULL); - if (error) { - printk(KERN_WARNING "%s: could not append to parent for %s\n", - __FUNCTION__, buf); - goto out; - } - - devfsd_notify(de, DEVFSD_NOTIFY_REGISTERED); - out: - devfs_put(dir); - return error; -} - -int devfs_mk_bdev(dev_t dev, umode_t mode, const char *fmt, ...) -{ - va_list args; - - if (!S_ISBLK(mode)) { - printk(KERN_WARNING "%s: invalide mode (%u) for %s\n", - __FUNCTION__, mode, fmt); - return -EINVAL; - } - - va_start(args, fmt); - return devfs_mk_dev(dev, mode, fmt, args); -} - -EXPORT_SYMBOL(devfs_mk_bdev); - -int devfs_mk_cdev(dev_t dev, umode_t mode, const char *fmt, ...) -{ - va_list args; - - if (!S_ISCHR(mode)) { - printk(KERN_WARNING "%s: invalide mode (%u) for %s\n", - __FUNCTION__, mode, fmt); - return -EINVAL; - } - - va_start(args, fmt); - return devfs_mk_dev(dev, mode, fmt, args); -} - -EXPORT_SYMBOL(devfs_mk_cdev); - -/** - * _devfs_unhook - Unhook a device entry from its parents list - * @de: The entry to unhook. - * - * Returns %TRUE if the entry was unhooked, else %FALSE if it was - * previously unhooked. - * The caller must have a write lock on the parent directory. - */ - -static int _devfs_unhook(struct devfs_entry *de) -{ - struct devfs_entry *parent; - - if (!de || (de->prev == de)) - return FALSE; - parent = de->parent; - if (de->prev == NULL) - parent->u.dir.first = de->next; - else - de->prev->next = de->next; - if (de->next == NULL) - parent->u.dir.last = de->prev; - else - de->next->prev = de->prev; - de->prev = de; /* Indicate we're unhooked */ - de->next = NULL; /* Force early termination for */ - return TRUE; -} /* End Function _devfs_unhook */ - -/** - * _devfs_unregister - Unregister a device entry from its parent. - * @dir: The parent directory. - * @de: The entry to unregister. - * - * The caller must have a write lock on the parent directory, which is - * unlocked by this function. - */ - -static void _devfs_unregister(struct devfs_entry *dir, struct devfs_entry *de) -{ - int unhooked = _devfs_unhook(de); - - write_unlock(&dir->u.dir.lock); - if (!unhooked) - return; - devfs_get(dir); - devfsd_notify(de, DEVFSD_NOTIFY_UNREGISTERED); - free_dentry(de); - devfs_put(dir); - if (!S_ISDIR(de->mode)) - return; - while (TRUE) { /* Recursively unregister: this is a stack chomper */ - struct devfs_entry *child; - - write_lock(&de->u.dir.lock); - de->u.dir.no_more_additions = TRUE; - child = de->u.dir.first; - VERIFY_ENTRY(child); - _devfs_unregister(de, child); - if (!child) - break; - DPRINTK(DEBUG_UNREGISTER, "(%s): child: %p refcount: %d\n", - child->name, child, atomic_read(&child->refcount)); - devfs_put(child); - } -} /* End Function _devfs_unregister */ - -static int devfs_do_symlink(devfs_handle_t dir, const char *name, - const char *link, devfs_handle_t * handle) -{ - int err; - unsigned int linklength; - char *newlink; - struct devfs_entry *de; - - if (handle != NULL) - *handle = NULL; - if (name == NULL) { - PRINTK("(): NULL name pointer\n"); - return -EINVAL; - } - if (link == NULL) { - PRINTK("(%s): NULL link pointer\n", name); - return -EINVAL; - } - linklength = strlen(link); - if ((newlink = kmalloc(linklength + 1, GFP_KERNEL)) == NULL) - return -ENOMEM; - memcpy(newlink, link, linklength); - newlink[linklength] = '\0'; - if ((de = _devfs_prepare_leaf(&dir, name, S_IFLNK | S_IRUGO | S_IXUGO)) - == NULL) { - PRINTK("(%s): could not prepare leaf\n", name); - kfree(newlink); - return -ENOTDIR; - } - de->info = NULL; - de->u.symlink.linkname = newlink; - de->u.symlink.length = linklength; - if ((err = _devfs_append_entry(dir, de, NULL)) != 0) { - PRINTK("(%s): could not append to parent, err: %d\n", name, - err); - devfs_put(dir); - return err; - } - devfs_put(dir); -#ifdef CONFIG_DEVFS_DEBUG - spin_lock(&stat_lock); - stat_num_bytes += linklength + 1; - spin_unlock(&stat_lock); -#endif - if (handle != NULL) - *handle = de; - return 0; -} /* End Function devfs_do_symlink */ - -/** - * devfs_mk_symlink Create a symbolic link in the devfs namespace. - * @from: The name of the entry. - * @to: Name of the destination - * - * Returns 0 on success, else a negative error code is returned. - */ - -int devfs_mk_symlink(const char *from, const char *to) -{ - devfs_handle_t de; - int err; - - err = devfs_do_symlink(NULL, from, to, &de); - if (!err) { - de->vfs = TRUE; - devfsd_notify(de, DEVFSD_NOTIFY_REGISTERED); - } - - return err; -} - -/** - * devfs_mk_dir - Create a directory in the devfs namespace. - * new name is relative to the root of the devfs. - * @fmt: The name of the entry. - * - * Use of this function is optional. The devfs_register() function - * will automatically create intermediate directories as needed. This function - * is provided for efficiency reasons, as it provides a handle to a directory. - * On failure %NULL is returned. - */ - -int devfs_mk_dir(const char *fmt, ...) -{ - struct devfs_entry *dir = NULL, *de = NULL, *old; - char buf[64]; - va_list args; - int error, n; - - va_start(args, fmt); - n = vsnprintf(buf, 64, fmt, args); - if (n >= 64 || !buf[0]) { - printk(KERN_WARNING "%s: invalid argument.", __FUNCTION__); - return -EINVAL; - } - - de = _devfs_prepare_leaf(&dir, buf, MODE_DIR); - if (!de) { - PRINTK("(%s): could not prepare leaf\n", buf); - return -EINVAL; - } - - error = _devfs_append_entry(dir, de, &old); - if (error == -EEXIST && S_ISDIR(old->mode)) { - /* - * devfs_mk_dir() of an already-existing directory will - * return success. - */ - error = 0; - goto out_put; - } else if (error) { - PRINTK("(%s): could not append to dir: %p \"%s\"\n", - buf, dir, dir->name); - devfs_put(old); - goto out_put; - } - - devfsd_notify(de, DEVFSD_NOTIFY_REGISTERED); - - out_put: - devfs_put(dir); - return error; -} - -void devfs_remove(const char *fmt, ...) -{ - char buf[64]; - va_list args; - int n; - - va_start(args, fmt); - n = vsnprintf(buf, sizeof(buf), fmt, args); - if (n < sizeof(buf) && buf[0]) { - devfs_handle_t de = _devfs_find_entry(NULL, buf, 0); - - if (!de) { - printk(KERN_ERR "%s: %s not found, cannot remove\n", - __FUNCTION__, buf); - dump_stack(); - return; - } - - write_lock(&de->parent->u.dir.lock); - _devfs_unregister(de->parent, de); - devfs_put(de); - devfs_put(de); - } -} - -/** - * devfs_generate_path - Generate a pathname for an entry, relative to the devfs root. - * @de: The devfs entry. - * @path: The buffer to write the pathname to. The pathname and '\0' - * terminator will be written at the end of the buffer. - * @buflen: The length of the buffer. - * - * Returns the offset in the buffer where the pathname starts on success, - * else a negative error code. - */ - -static int devfs_generate_path(devfs_handle_t de, char *path, int buflen) -{ - int pos; -#define NAMEOF(de) ( (de)->mode ? (de)->name : (de)->u.name ) - - if (de == NULL) - return -EINVAL; - VERIFY_ENTRY(de); - if (de->namelen >= buflen) - return -ENAMETOOLONG; /* Must be first */ - path[buflen - 1] = '\0'; - if (de->parent == NULL) - return buflen - 1; /* Don't prepend root */ - pos = buflen - de->namelen - 1; - memcpy(path + pos, NAMEOF(de), de->namelen); - for (de = de->parent; de->parent != NULL; de = de->parent) { - if (pos - de->namelen - 1 < 0) - return -ENAMETOOLONG; - path[--pos] = '/'; - pos -= de->namelen; - memcpy(path + pos, NAMEOF(de), de->namelen); - } - return pos; -} /* End Function devfs_generate_path */ - -/** - * devfs_setup - Process kernel boot options. - * @str: The boot options after the "devfs=". - */ - -static int __init devfs_setup(char *str) -{ - static struct { - char *name; - unsigned int mask; - unsigned int *opt; - } devfs_options_tab[] __initdata = { -#ifdef CONFIG_DEVFS_DEBUG - { - "dall", DEBUG_ALL, &devfs_debug_init}, { - "dmod", DEBUG_MODULE_LOAD, &devfs_debug_init}, { - "dreg", DEBUG_REGISTER, &devfs_debug_init}, { - "dunreg", DEBUG_UNREGISTER, &devfs_debug_init}, { - "dfree", DEBUG_FREE, &devfs_debug_init}, { - "diget", DEBUG_I_GET, &devfs_debug_init}, { - "dchange", DEBUG_SET_FLAGS, &devfs_debug_init}, { - "dsread", DEBUG_S_READ, &devfs_debug_init}, { - "dichange", DEBUG_I_CHANGE, &devfs_debug_init}, { - "dimknod", DEBUG_I_MKNOD, &devfs_debug_init}, { - "dilookup", DEBUG_I_LOOKUP, &devfs_debug_init}, { - "diunlink", DEBUG_I_UNLINK, &devfs_debug_init}, -#endif /* CONFIG_DEVFS_DEBUG */ - { - "mount", OPTION_MOUNT, &boot_options}, { - NULL, 0, NULL} - }; - - while ((*str != '\0') && !isspace(*str)) { - int i, found = 0, invert = 0; - - if (strncmp(str, "no", 2) == 0) { - invert = 1; - str += 2; - } - for (i = 0; devfs_options_tab[i].name != NULL; i++) { - int len = strlen(devfs_options_tab[i].name); - - if (strncmp(str, devfs_options_tab[i].name, len) == 0) { - if (invert) - *devfs_options_tab[i].opt &= - ~devfs_options_tab[i].mask; - else - *devfs_options_tab[i].opt |= - devfs_options_tab[i].mask; - str += len; - found = 1; - break; - } - } - if (!found) - return 0; /* No match */ - if (*str != ',') - return 0; /* No more options */ - ++str; - } - return 1; -} /* End Function devfs_setup */ - -__setup("devfs=", devfs_setup); - -EXPORT_SYMBOL(devfs_mk_dir); -EXPORT_SYMBOL(devfs_remove); - -/** - * try_modload - Notify devfsd of an inode lookup by a non-devfsd process. - * @parent: The parent devfs entry. - * @fs_info: The filesystem info. - * @name: The device name. - * @namelen: The number of characters in @name. - * @buf: A working area that will be used. This must not go out of scope - * until devfsd is idle again. - * - * Returns 0 on success (event was queued), else a negative error code. - */ - -static int try_modload(struct devfs_entry *parent, struct fs_info *fs_info, - const char *name, unsigned namelen, - struct devfs_entry *buf) -{ - if (!(fs_info->devfsd_event_mask & (1 << DEVFSD_NOTIFY_LOOKUP))) - return -ENOENT; - if (is_devfsd_or_child(fs_info)) - return -ENOENT; - memset(buf, 0, sizeof *buf); - atomic_set(&buf->refcount, 1); - buf->parent = parent; - buf->namelen = namelen; - buf->u.name = name; - WRITE_ENTRY_MAGIC(buf, MAGIC_VALUE); - if (!devfsd_notify_de(buf, DEVFSD_NOTIFY_LOOKUP, 0, - current->euid, current->egid, fs_info)) - return -ENOENT; - /* Possible success: event has been queued */ - return 0; -} /* End Function try_modload */ - -/* Superblock operations follow */ - -static struct inode_operations devfs_iops; -static struct inode_operations devfs_dir_iops; -static const struct file_operations devfs_fops; -static const struct file_operations devfs_dir_fops; -static struct inode_operations devfs_symlink_iops; - -static int devfs_notify_change(struct dentry *dentry, struct iattr *iattr) -{ - int retval; - struct devfs_entry *de; - struct inode *inode = dentry->d_inode; - struct fs_info *fs_info = inode->i_sb->s_fs_info; - - de = get_devfs_entry_from_vfs_inode(inode); - if (de == NULL) - return -ENODEV; - retval = inode_change_ok(inode, iattr); - if (retval != 0) - return retval; - retval = inode_setattr(inode, iattr); - if (retval != 0) - return retval; - DPRINTK(DEBUG_I_CHANGE, "(%d): VFS inode: %p devfs_entry: %p\n", - (int)inode->i_ino, inode, de); - DPRINTK(DEBUG_I_CHANGE, "(): mode: 0%o uid: %d gid: %d\n", - (int)inode->i_mode, (int)inode->i_uid, (int)inode->i_gid); - /* Inode is not on hash chains, thus must save permissions here rather - than in a write_inode() method */ - de->mode = inode->i_mode; - de->inode.uid = inode->i_uid; - de->inode.gid = inode->i_gid; - de->inode.atime = inode->i_atime; - de->inode.mtime = inode->i_mtime; - de->inode.ctime = inode->i_ctime; - if ((iattr->ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID)) && - !is_devfsd_or_child(fs_info)) - devfsd_notify_de(de, DEVFSD_NOTIFY_CHANGE, inode->i_mode, - inode->i_uid, inode->i_gid, fs_info); - return 0; -} /* End Function devfs_notify_change */ - -static struct super_operations devfs_sops = { - .drop_inode = generic_delete_inode, - .statfs = simple_statfs, -}; - -/** - * _devfs_get_vfs_inode - Get a VFS inode. - * @sb: The super block. - * @de: The devfs inode. - * @dentry: The dentry to register with the devfs inode. - * - * Returns the inode on success, else %NULL. An implicit devfs_get() is - * performed if the inode is created. - */ - -static struct inode *_devfs_get_vfs_inode(struct super_block *sb, - struct devfs_entry *de, - struct dentry *dentry) -{ - struct inode *inode; - - if (de->prev == de) - return NULL; /* Quick check to see if unhooked */ - if ((inode = new_inode(sb)) == NULL) { - PRINTK("(%s): new_inode() failed, de: %p\n", de->name, de); - return NULL; - } - if (de->parent) { - read_lock(&de->parent->u.dir.lock); - if (de->prev != de) - de->inode.dentry = dentry; /* Not unhooked */ - read_unlock(&de->parent->u.dir.lock); - } else - de->inode.dentry = dentry; /* Root: no locking needed */ - if (de->inode.dentry != dentry) { /* Must have been unhooked */ - iput(inode); - return NULL; - } - /* FIXME where is devfs_put? */ - inode->u.generic_ip = devfs_get(de); - inode->i_ino = de->inode.ino; - DPRINTK(DEBUG_I_GET, "(%d): VFS inode: %p devfs_entry: %p\n", - (int)inode->i_ino, inode, de); - inode->i_blocks = 0; - inode->i_blksize = FAKE_BLOCK_SIZE; - inode->i_op = &devfs_iops; - inode->i_mode = de->mode; - if (S_ISDIR(de->mode)) { - inode->i_op = &devfs_dir_iops; - inode->i_fop = &devfs_dir_fops; - } else if (S_ISLNK(de->mode)) { - inode->i_op = &devfs_symlink_iops; - inode->i_size = de->u.symlink.length; - } else if (S_ISCHR(de->mode) || S_ISBLK(de->mode)) { - init_special_inode(inode, de->mode, de->u.dev); - } else if (S_ISFIFO(de->mode) || S_ISSOCK(de->mode)) { - init_special_inode(inode, de->mode, 0); - } else { - PRINTK("(%s): unknown mode %o de: %p\n", - de->name, de->mode, de); - iput(inode); - devfs_put(de); - return NULL; - } - - inode->i_uid = de->inode.uid; - inode->i_gid = de->inode.gid; - inode->i_atime = de->inode.atime; - inode->i_mtime = de->inode.mtime; - inode->i_ctime = de->inode.ctime; - DPRINTK(DEBUG_I_GET, "(): mode: 0%o uid: %d gid: %d\n", - (int)inode->i_mode, (int)inode->i_uid, (int)inode->i_gid); - return inode; -} /* End Function _devfs_get_vfs_inode */ - -/* File operations for device entries follow */ - -static int devfs_readdir(struct file *file, void *dirent, filldir_t filldir) -{ - int err, count; - int stored = 0; - struct fs_info *fs_info; - struct devfs_entry *parent, *de, *next = NULL; - struct inode *inode = file->f_dentry->d_inode; - - fs_info = inode->i_sb->s_fs_info; - parent = get_devfs_entry_from_vfs_inode(file->f_dentry->d_inode); - if ((long)file->f_pos < 0) - return -EINVAL; - DPRINTK(DEBUG_F_READDIR, "(%s): fs_info: %p pos: %ld\n", - parent->name, fs_info, (long)file->f_pos); - switch ((long)file->f_pos) { - case 0: - err = (*filldir) (dirent, "..", 2, file->f_pos, - parent_ino(file->f_dentry), DT_DIR); - if (err == -EINVAL) - break; - if (err < 0) - return err; - file->f_pos++; - ++stored; - /* Fall through */ - case 1: - err = - (*filldir) (dirent, ".", 1, file->f_pos, inode->i_ino, - DT_DIR); - if (err == -EINVAL) - break; - if (err < 0) - return err; - file->f_pos++; - ++stored; - /* Fall through */ - default: - /* Skip entries */ - count = file->f_pos - 2; - read_lock(&parent->u.dir.lock); - for (de = parent->u.dir.first; de && (count > 0); de = de->next) - --count; - devfs_get(de); - read_unlock(&parent->u.dir.lock); - /* Now add all remaining entries */ - while (de) { - err = (*filldir) (dirent, de->name, de->namelen, - file->f_pos, de->inode.ino, - de->mode >> 12); - if (err < 0) - devfs_put(de); - else { - file->f_pos++; - ++stored; - } - if (err == -EINVAL) - break; - if (err < 0) - return err; - read_lock(&parent->u.dir.lock); - next = devfs_get(de->next); - read_unlock(&parent->u.dir.lock); - devfs_put(de); - de = next; - } - break; - } - return stored; -} /* End Function devfs_readdir */ - -/* Open devfs specific special files */ -static int devfs_open(struct inode *inode, struct file *file) -{ - int err; - int minor = MINOR(inode->i_rdev); - struct file_operations *old_fops, *new_fops; - - switch (minor) { - case 0: /* /dev/.devfsd */ - new_fops = fops_get(&devfsd_fops); - break; -#ifdef CONFIG_DEVFS_DEBUG - case 1: /* /dev/.stat */ - new_fops = fops_get(&stat_fops); - break; -#endif - default: - return -ENODEV; - } - - if (new_fops == NULL) - return -ENODEV; - old_fops = file->f_op; - file->f_op = new_fops; - err = new_fops->open ? new_fops->open(inode, file) : 0; - if (err) { - file->f_op = old_fops; - fops_put(new_fops); - } else - fops_put(old_fops); - return err; -} /* End Function devfs_open */ - -static const struct file_operations devfs_fops = { - .open = devfs_open, -}; - -static const struct file_operations devfs_dir_fops = { - .read = generic_read_dir, - .readdir = devfs_readdir, -}; - -/* Dentry operations for device entries follow */ - -/** - * devfs_d_release - Callback for when a dentry is freed. - * @dentry: The dentry. - */ - -static void devfs_d_release(struct dentry *dentry) -{ - DPRINTK(DEBUG_D_RELEASE, "(%p): inode: %p\n", dentry, dentry->d_inode); -} /* End Function devfs_d_release */ - -/** - * devfs_d_iput - Callback for when a dentry loses its inode. - * @dentry: The dentry. - * @inode: The inode. - */ - -static void devfs_d_iput(struct dentry *dentry, struct inode *inode) -{ - struct devfs_entry *de; - - de = get_devfs_entry_from_vfs_inode(inode); - DPRINTK(DEBUG_D_IPUT, - "(%s): dentry: %p inode: %p de: %p de->dentry: %p\n", de->name, - dentry, inode, de, de->inode.dentry); - if (de->inode.dentry && (de->inode.dentry != dentry)) - OOPS("(%s): de: %p dentry: %p de->dentry: %p\n", - de->name, de, dentry, de->inode.dentry); - de->inode.dentry = NULL; - iput(inode); - devfs_put(de); -} /* End Function devfs_d_iput */ - -static int devfs_d_delete(struct dentry *dentry); - -static struct dentry_operations devfs_dops = { - .d_delete = devfs_d_delete, - .d_release = devfs_d_release, - .d_iput = devfs_d_iput, -}; - -static int devfs_d_revalidate_wait(struct dentry *dentry, struct nameidata *); - -static struct dentry_operations devfs_wait_dops = { - .d_delete = devfs_d_delete, - .d_release = devfs_d_release, - .d_iput = devfs_d_iput, - .d_revalidate = devfs_d_revalidate_wait, -}; - -/** - * devfs_d_delete - Callback for when all files for a dentry are closed. - * @dentry: The dentry. - */ - -static int devfs_d_delete(struct dentry *dentry) -{ - struct inode *inode = dentry->d_inode; - - if (dentry->d_op == &devfs_wait_dops) - dentry->d_op = &devfs_dops; - /* Unhash dentry if negative (has no inode) */ - if (inode == NULL) { - DPRINTK(DEBUG_D_DELETE, "(%p): dropping negative dentry\n", - dentry); - return 1; - } - return 0; -} /* End Function devfs_d_delete */ - -struct devfs_lookup_struct { - devfs_handle_t de; - wait_queue_head_t wait_queue; -}; - -/* XXX: this doesn't handle the case where we got a negative dentry - but a devfs entry has been registered in the meanwhile */ -static int devfs_d_revalidate_wait(struct dentry *dentry, struct nameidata *nd) -{ - struct inode *dir = dentry->d_parent->d_inode; - struct fs_info *fs_info = dir->i_sb->s_fs_info; - devfs_handle_t parent = get_devfs_entry_from_vfs_inode(dir); - struct devfs_lookup_struct *lookup_info = dentry->d_fsdata; - DECLARE_WAITQUEUE(wait, current); - int need_lock; - - /* - * FIXME HACK - * - * make sure that - * d_instantiate always runs under lock - * we release i_mutex lock before going to sleep - * - * unfortunately sometimes d_revalidate is called with - * and sometimes without i_mutex lock held. The following checks - * attempt to deduce when we need to add (and drop resp.) lock - * here. This relies on current (2.6.2) calling coventions: - * - * lookup_hash is always run under i_mutex and is passing NULL - * as nd - * - * open(...,O_CREATE,...) calls _lookup_hash under i_mutex - * and sets flags to LOOKUP_OPEN|LOOKUP_CREATE - * - * all other invocations of ->d_revalidate seem to happen - * outside of i_mutex - */ - need_lock = nd && - (!(nd->flags & LOOKUP_CREATE) || (nd->flags & LOOKUP_PARENT)); - - if (need_lock) - mutex_lock(&dir->i_mutex); - - if (is_devfsd_or_child(fs_info)) { - devfs_handle_t de = lookup_info->de; - struct inode *inode; - - DPRINTK(DEBUG_I_LOOKUP, - "(%s): dentry: %p inode: %p de: %p by: \"%s\"\n", - dentry->d_name.name, dentry, dentry->d_inode, de, - current->comm); - if (dentry->d_inode) - goto out; - if (de == NULL) { - read_lock(&parent->u.dir.lock); - de = _devfs_search_dir(parent, dentry->d_name.name, - dentry->d_name.len); - read_unlock(&parent->u.dir.lock); - if (de == NULL) - goto out; - lookup_info->de = de; - } - /* Create an inode, now that the driver information is available */ - inode = _devfs_get_vfs_inode(dir->i_sb, de, dentry); - if (!inode) - goto out; - DPRINTK(DEBUG_I_LOOKUP, - "(%s): new VFS inode(%u): %p de: %p by: \"%s\"\n", - de->name, de->inode.ino, inode, de, current->comm); - d_instantiate(dentry, inode); - goto out; - } - if (lookup_info == NULL) - goto out; /* Early termination */ - read_lock(&parent->u.dir.lock); - if (dentry->d_fsdata) { - set_current_state(TASK_UNINTERRUPTIBLE); - add_wait_queue(&lookup_info->wait_queue, &wait); - read_unlock(&parent->u.dir.lock); - /* at this point it is always (hopefully) locked */ - mutex_unlock(&dir->i_mutex); - schedule(); - mutex_lock(&dir->i_mutex); - /* - * This does not need nor should remove wait from wait_queue. - * Wait queue head is never reused - nothing is ever added to it - * after all waiters have been waked up and head itself disappears - * very soon after it. Moreover it is local variable on stack that - * is likely to have already disappeared so any reference to it - * at this point is buggy. - */ - - } else - read_unlock(&parent->u.dir.lock); - - out: - if (need_lock) - mutex_unlock(&dir->i_mutex); - return 1; -} /* End Function devfs_d_revalidate_wait */ - -/* Inode operations for device entries follow */ - -static struct dentry *devfs_lookup(struct inode *dir, struct dentry *dentry, - struct nameidata *nd) -{ - struct devfs_entry tmp; /* Must stay in scope until devfsd idle again */ - struct devfs_lookup_struct lookup_info; - struct fs_info *fs_info = dir->i_sb->s_fs_info; - struct devfs_entry *parent, *de; - struct inode *inode; - struct dentry *retval = NULL; - - /* Set up the dentry operations before anything else, to ensure cleaning - up on any error */ - dentry->d_op = &devfs_dops; - /* First try to get the devfs entry for this directory */ - parent = get_devfs_entry_from_vfs_inode(dir); - DPRINTK(DEBUG_I_LOOKUP, "(%s): dentry: %p parent: %p by: \"%s\"\n", - dentry->d_name.name, dentry, parent, current->comm); - if (parent == NULL) - return ERR_PTR(-ENOENT); - read_lock(&parent->u.dir.lock); - de = _devfs_search_dir(parent, dentry->d_name.name, dentry->d_name.len); - read_unlock(&parent->u.dir.lock); - lookup_info.de = de; - init_waitqueue_head(&lookup_info.wait_queue); - dentry->d_fsdata = &lookup_info; - if (de == NULL) { /* Try with devfsd. For any kind of failure, leave a negative dentry - so someone else can deal with it (in the case where the sysadmin - does a mknod()). It's important to do this before hashing the - dentry, so that the devfsd queue is filled before revalidates - can start */ - if (try_modload(parent, fs_info, dentry->d_name.name, dentry->d_name.len, &tmp) < 0) { /* Lookup event was not queued to devfsd */ - d_add(dentry, NULL); - return NULL; - } - } - dentry->d_op = &devfs_wait_dops; - d_add(dentry, NULL); /* Open the floodgates */ - /* Unlock directory semaphore, which will release any waiters. They - will get the hashed dentry, and may be forced to wait for - revalidation */ - mutex_unlock(&dir->i_mutex); - wait_for_devfsd_finished(fs_info); /* If I'm not devfsd, must wait */ - mutex_lock(&dir->i_mutex); /* Grab it again because them's the rules */ - de = lookup_info.de; - /* If someone else has been so kind as to make the inode, we go home - early */ - if (dentry->d_inode) - goto out; - if (de == NULL) { - read_lock(&parent->u.dir.lock); - de = _devfs_search_dir(parent, dentry->d_name.name, - dentry->d_name.len); - read_unlock(&parent->u.dir.lock); - if (de == NULL) - goto out; - /* OK, there's an entry now, but no VFS inode yet */ - } - /* Create an inode, now that the driver information is available */ - inode = _devfs_get_vfs_inode(dir->i_sb, de, dentry); - if (!inode) { - retval = ERR_PTR(-ENOMEM); - goto out; - } - DPRINTK(DEBUG_I_LOOKUP, - "(%s): new VFS inode(%u): %p de: %p by: \"%s\"\n", de->name, - de->inode.ino, inode, de, current->comm); - d_instantiate(dentry, inode); - out: - write_lock(&parent->u.dir.lock); - dentry->d_op = &devfs_dops; - dentry->d_fsdata = NULL; - wake_up(&lookup_info.wait_queue); - write_unlock(&parent->u.dir.lock); - devfs_put(de); - return retval; -} /* End Function devfs_lookup */ - -static int devfs_unlink(struct inode *dir, struct dentry *dentry) -{ - int unhooked; - struct devfs_entry *de; - struct inode *inode = dentry->d_inode; - struct fs_info *fs_info = dir->i_sb->s_fs_info; - - de = get_devfs_entry_from_vfs_inode(inode); - DPRINTK(DEBUG_I_UNLINK, "(%s): de: %p\n", dentry->d_name.name, de); - if (de == NULL) - return -ENOENT; - if (!de->vfs) - return -EPERM; - write_lock(&de->parent->u.dir.lock); - unhooked = _devfs_unhook(de); - write_unlock(&de->parent->u.dir.lock); - if (!unhooked) - return -ENOENT; - if (!is_devfsd_or_child(fs_info)) - devfsd_notify_de(de, DEVFSD_NOTIFY_DELETE, inode->i_mode, - inode->i_uid, inode->i_gid, fs_info); - free_dentry(de); - devfs_put(de); - return 0; -} /* End Function devfs_unlink */ - -static int devfs_symlink(struct inode *dir, struct dentry *dentry, - const char *symname) -{ - int err; - struct fs_info *fs_info = dir->i_sb->s_fs_info; - struct devfs_entry *parent, *de; - struct inode *inode; - - /* First try to get the devfs entry for this directory */ - parent = get_devfs_entry_from_vfs_inode(dir); - if (parent == NULL) - return -ENOENT; - err = devfs_do_symlink(parent, dentry->d_name.name, symname, &de); - DPRINTK(DEBUG_DISABLED, "(%s): errcode from : %d\n", - dentry->d_name.name, err); - if (err < 0) - return err; - de->vfs = TRUE; - de->inode.uid = current->euid; - de->inode.gid = current->egid; - de->inode.atime = CURRENT_TIME; - de->inode.mtime = CURRENT_TIME; - de->inode.ctime = CURRENT_TIME; - if ((inode = _devfs_get_vfs_inode(dir->i_sb, de, dentry)) == NULL) - return -ENOMEM; - DPRINTK(DEBUG_DISABLED, "(%s): new VFS inode(%u): %p dentry: %p\n", - dentry->d_name.name, de->inode.ino, inode, dentry); - d_instantiate(dentry, inode); - if (!is_devfsd_or_child(fs_info)) - devfsd_notify_de(de, DEVFSD_NOTIFY_CREATE, inode->i_mode, - inode->i_uid, inode->i_gid, fs_info); - return 0; -} /* End Function devfs_symlink */ - -static int devfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) -{ - int err; - struct fs_info *fs_info = dir->i_sb->s_fs_info; - struct devfs_entry *parent, *de; - struct inode *inode; - - mode = (mode & ~S_IFMT) | S_IFDIR; /* VFS doesn't pass S_IFMT part */ - parent = get_devfs_entry_from_vfs_inode(dir); - if (parent == NULL) - return -ENOENT; - de = _devfs_alloc_entry(dentry->d_name.name, dentry->d_name.len, mode); - if (!de) - return -ENOMEM; - de->vfs = TRUE; - if ((err = _devfs_append_entry(parent, de, NULL)) != 0) - return err; - de->inode.uid = current->euid; - de->inode.gid = current->egid; - de->inode.atime = CURRENT_TIME; - de->inode.mtime = CURRENT_TIME; - de->inode.ctime = CURRENT_TIME; - if ((inode = _devfs_get_vfs_inode(dir->i_sb, de, dentry)) == NULL) - return -ENOMEM; - DPRINTK(DEBUG_DISABLED, "(%s): new VFS inode(%u): %p dentry: %p\n", - dentry->d_name.name, de->inode.ino, inode, dentry); - d_instantiate(dentry, inode); - if (!is_devfsd_or_child(fs_info)) - devfsd_notify_de(de, DEVFSD_NOTIFY_CREATE, inode->i_mode, - inode->i_uid, inode->i_gid, fs_info); - return 0; -} /* End Function devfs_mkdir */ - -static int devfs_rmdir(struct inode *dir, struct dentry *dentry) -{ - int err = 0; - struct devfs_entry *de; - struct fs_info *fs_info = dir->i_sb->s_fs_info; - struct inode *inode = dentry->d_inode; - - if (dir->i_sb->s_fs_info != inode->i_sb->s_fs_info) - return -EINVAL; - de = get_devfs_entry_from_vfs_inode(inode); - if (de == NULL) - return -ENOENT; - if (!S_ISDIR(de->mode)) - return -ENOTDIR; - if (!de->vfs) - return -EPERM; - /* First ensure the directory is empty and will stay that way */ - write_lock(&de->u.dir.lock); - if (de->u.dir.first) - err = -ENOTEMPTY; - else - de->u.dir.no_more_additions = TRUE; - write_unlock(&de->u.dir.lock); - if (err) - return err; - /* Now unhook the directory from its parent */ - write_lock(&de->parent->u.dir.lock); - if (!_devfs_unhook(de)) - err = -ENOENT; - write_unlock(&de->parent->u.dir.lock); - if (err) - return err; - if (!is_devfsd_or_child(fs_info)) - devfsd_notify_de(de, DEVFSD_NOTIFY_DELETE, inode->i_mode, - inode->i_uid, inode->i_gid, fs_info); - free_dentry(de); - devfs_put(de); - return 0; -} /* End Function devfs_rmdir */ - -static int devfs_mknod(struct inode *dir, struct dentry *dentry, int mode, - dev_t rdev) -{ - int err; - struct fs_info *fs_info = dir->i_sb->s_fs_info; - struct devfs_entry *parent, *de; - struct inode *inode; - - DPRINTK(DEBUG_I_MKNOD, "(%s): mode: 0%o dev: %u:%u\n", - dentry->d_name.name, mode, MAJOR(rdev), MINOR(rdev)); - parent = get_devfs_entry_from_vfs_inode(dir); - if (parent == NULL) - return -ENOENT; - de = _devfs_alloc_entry(dentry->d_name.name, dentry->d_name.len, mode); - if (!de) - return -ENOMEM; - de->vfs = TRUE; - if (S_ISCHR(mode) || S_ISBLK(mode)) - de->u.dev = rdev; - if ((err = _devfs_append_entry(parent, de, NULL)) != 0) - return err; - de->inode.uid = current->euid; - de->inode.gid = current->egid; - de->inode.atime = CURRENT_TIME; - de->inode.mtime = CURRENT_TIME; - de->inode.ctime = CURRENT_TIME; - if ((inode = _devfs_get_vfs_inode(dir->i_sb, de, dentry)) == NULL) - return -ENOMEM; - DPRINTK(DEBUG_I_MKNOD, ": new VFS inode(%u): %p dentry: %p\n", - de->inode.ino, inode, dentry); - d_instantiate(dentry, inode); - if (!is_devfsd_or_child(fs_info)) - devfsd_notify_de(de, DEVFSD_NOTIFY_CREATE, inode->i_mode, - inode->i_uid, inode->i_gid, fs_info); - return 0; -} /* End Function devfs_mknod */ - -static void *devfs_follow_link(struct dentry *dentry, struct nameidata *nd) -{ - struct devfs_entry *p = get_devfs_entry_from_vfs_inode(dentry->d_inode); - nd_set_link(nd, p ? p->u.symlink.linkname : ERR_PTR(-ENODEV)); - return NULL; -} /* End Function devfs_follow_link */ - -static struct inode_operations devfs_iops = { - .setattr = devfs_notify_change, -}; - -static struct inode_operations devfs_dir_iops = { - .lookup = devfs_lookup, - .unlink = devfs_unlink, - .symlink = devfs_symlink, - .mkdir = devfs_mkdir, - .rmdir = devfs_rmdir, - .mknod = devfs_mknod, - .setattr = devfs_notify_change, -}; - -static struct inode_operations devfs_symlink_iops = { - .readlink = generic_readlink, - .follow_link = devfs_follow_link, - .setattr = devfs_notify_change, -}; - -static int devfs_fill_super(struct super_block *sb, void *data, int silent) -{ - struct inode *root_inode = NULL; - - if (_devfs_get_root_entry() == NULL) - goto out_no_root; - atomic_set(&fs_info.devfsd_overrun_count, 0); - init_waitqueue_head(&fs_info.devfsd_wait_queue); - init_waitqueue_head(&fs_info.revalidate_wait_queue); - fs_info.sb = sb; - sb->s_fs_info = &fs_info; - sb->s_blocksize = 1024; - sb->s_blocksize_bits = 10; - sb->s_magic = DEVFS_SUPER_MAGIC; - sb->s_op = &devfs_sops; - sb->s_time_gran = 1; - if ((root_inode = _devfs_get_vfs_inode(sb, root_entry, NULL)) == NULL) - goto out_no_root; - sb->s_root = d_alloc_root(root_inode); - if (!sb->s_root) - goto out_no_root; - DPRINTK(DEBUG_S_READ, "(): made devfs ptr: %p\n", sb->s_fs_info); - return 0; - - out_no_root: - PRINTK("(): get root inode failed\n"); - if (root_inode) - iput(root_inode); - return -EINVAL; -} /* End Function devfs_fill_super */ - -static struct super_block *devfs_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, - void *data) -{ - return get_sb_single(fs_type, flags, data, devfs_fill_super); -} - -static struct file_system_type devfs_fs_type = { - .name = DEVFS_NAME, - .get_sb = devfs_get_sb, - .kill_sb = kill_anon_super, -}; - -/* File operations for devfsd follow */ - -static ssize_t devfsd_read(struct file *file, char __user *buf, size_t len, - loff_t * ppos) -{ - int done = FALSE; - int ival; - loff_t pos, devname_offset, tlen, rpos; - devfs_handle_t de; - struct devfsd_buf_entry *entry; - struct fs_info *fs_info = file->f_dentry->d_inode->i_sb->s_fs_info; - struct devfsd_notify_struct *info = fs_info->devfsd_info; - DECLARE_WAITQUEUE(wait, current); - - /* Verify the task has grabbed the queue */ - if (fs_info->devfsd_task != current) - return -EPERM; - info->major = 0; - info->minor = 0; - /* Block for a new entry */ - set_current_state(TASK_INTERRUPTIBLE); - add_wait_queue(&fs_info->devfsd_wait_queue, &wait); - while (devfsd_queue_empty(fs_info)) { - fs_info->devfsd_sleeping = TRUE; - wake_up(&fs_info->revalidate_wait_queue); - schedule(); - fs_info->devfsd_sleeping = FALSE; - if (signal_pending(current)) { - remove_wait_queue(&fs_info->devfsd_wait_queue, &wait); - __set_current_state(TASK_RUNNING); - return -EINTR; - } - set_current_state(TASK_INTERRUPTIBLE); - } - remove_wait_queue(&fs_info->devfsd_wait_queue, &wait); - __set_current_state(TASK_RUNNING); - /* Now play with the data */ - ival = atomic_read(&fs_info->devfsd_overrun_count); - info->overrun_count = ival; - entry = fs_info->devfsd_first_event; - info->type = entry->type; - info->mode = entry->mode; - info->uid = entry->uid; - info->gid = entry->gid; - de = entry->de; - if (S_ISCHR(de->mode) || S_ISBLK(de->mode)) { - info->major = MAJOR(de->u.dev); - info->minor = MINOR(de->u.dev); - } - pos = devfs_generate_path(de, info->devname, DEVFS_PATHLEN); - if (pos < 0) - return pos; - info->namelen = DEVFS_PATHLEN - pos - 1; - if (info->mode == 0) - info->mode = de->mode; - devname_offset = info->devname - (char *)info; - rpos = *ppos; - if (rpos < devname_offset) { - /* Copy parts of the header */ - tlen = devname_offset - rpos; - if (tlen > len) - tlen = len; - if (copy_to_user(buf, (char *)info + rpos, tlen)) { - return -EFAULT; - } - rpos += tlen; - buf += tlen; - len -= tlen; - } - if ((rpos >= devname_offset) && (len > 0)) { - /* Copy the name */ - tlen = info->namelen + 1; - if (tlen > len) - tlen = len; - else - done = TRUE; - if (copy_to_user - (buf, info->devname + pos + rpos - devname_offset, tlen)) { - return -EFAULT; - } - rpos += tlen; - } - tlen = rpos - *ppos; - if (done) { - devfs_handle_t parent; - - spin_lock(&fs_info->devfsd_buffer_lock); - fs_info->devfsd_first_event = entry->next; - if (entry->next == NULL) - fs_info->devfsd_last_event = NULL; - spin_unlock(&fs_info->devfsd_buffer_lock); - for (; de != NULL; de = parent) { - parent = de->parent; - devfs_put(de); - } - kmem_cache_free(devfsd_buf_cache, entry); - if (ival > 0) - atomic_sub(ival, &fs_info->devfsd_overrun_count); - *ppos = 0; - } else - *ppos = rpos; - return tlen; -} /* End Function devfsd_read */ - -static int devfsd_ioctl(struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg) -{ - int ival; - struct fs_info *fs_info = inode->i_sb->s_fs_info; - - switch (cmd) { - case DEVFSDIOC_GET_PROTO_REV: - ival = DEVFSD_PROTOCOL_REVISION_KERNEL; - if (copy_to_user((void __user *)arg, &ival, sizeof ival)) - return -EFAULT; - break; - case DEVFSDIOC_SET_EVENT_MASK: - /* Ensure only one reader has access to the queue. This scheme will - work even if the global kernel lock were to be removed, because it - doesn't matter who gets in first, as long as only one gets it */ - if (fs_info->devfsd_task == NULL) { - static DEFINE_SPINLOCK(lock); - - if (!spin_trylock(&lock)) - return -EBUSY; - if (fs_info->devfsd_task != NULL) { /* We lost the race... */ - spin_unlock(&lock); - return -EBUSY; - } - fs_info->devfsd_task = current; - spin_unlock(&lock); - fs_info->devfsd_pgrp = - (process_group(current) == - current->pid) ? process_group(current) : 0; - fs_info->devfsd_file = file; - fs_info->devfsd_info = - kmalloc(sizeof *fs_info->devfsd_info, GFP_KERNEL); - if (!fs_info->devfsd_info) { - devfsd_close(inode, file); - return -ENOMEM; - } - } else if (fs_info->devfsd_task != current) - return -EBUSY; - fs_info->devfsd_event_mask = arg; /* Let the masses come forth */ - break; - case DEVFSDIOC_RELEASE_EVENT_QUEUE: - if (fs_info->devfsd_file != file) - return -EPERM; - return devfsd_close(inode, file); - /*break; */ -#ifdef CONFIG_DEVFS_DEBUG - case DEVFSDIOC_SET_DEBUG_MASK: - if (copy_from_user(&ival, (void __user *)arg, sizeof ival)) - return -EFAULT; - devfs_debug = ival; - break; -#endif - default: - return -ENOIOCTLCMD; - } - return 0; -} /* End Function devfsd_ioctl */ - -static int devfsd_close(struct inode *inode, struct file *file) -{ - struct devfsd_buf_entry *entry, *next; - struct fs_info *fs_info = inode->i_sb->s_fs_info; - - if (fs_info->devfsd_file != file) - return 0; - fs_info->devfsd_event_mask = 0; - fs_info->devfsd_file = NULL; - spin_lock(&fs_info->devfsd_buffer_lock); - entry = fs_info->devfsd_first_event; - fs_info->devfsd_first_event = NULL; - fs_info->devfsd_last_event = NULL; - kfree(fs_info->devfsd_info); - fs_info->devfsd_info = NULL; - spin_unlock(&fs_info->devfsd_buffer_lock); - fs_info->devfsd_pgrp = 0; - fs_info->devfsd_task = NULL; - wake_up(&fs_info->revalidate_wait_queue); - for (; entry; entry = next) { - next = entry->next; - kmem_cache_free(devfsd_buf_cache, entry); - } - return 0; -} /* End Function devfsd_close */ - -#ifdef CONFIG_DEVFS_DEBUG -static ssize_t stat_read(struct file *file, char __user *buf, size_t len, - loff_t * ppos) -{ - ssize_t num; - char txt[80]; - - num = sprintf(txt, "Number of entries: %u number of bytes: %u\n", - stat_num_entries, stat_num_bytes) + 1; - if (*ppos >= num) - return 0; - if (*ppos + len > num) - len = num - *ppos; - if (copy_to_user(buf, txt + *ppos, len)) - return -EFAULT; - *ppos += len; - return len; -} /* End Function stat_read */ -#endif - -static int __init init_devfs_fs(void) -{ - int err; - int major; - struct devfs_entry *devfsd; -#ifdef CONFIG_DEVFS_DEBUG - struct devfs_entry *stat; -#endif - - if (_devfs_get_root_entry() == NULL) - return -ENOMEM; - - printk(KERN_INFO "%s: %s Richard Gooch (rgooch@atnf.csiro.au)\n", - DEVFS_NAME, DEVFS_VERSION); - devfsd_buf_cache = kmem_cache_create("devfsd_event", - sizeof(struct devfsd_buf_entry), - 0, 0, NULL, NULL); - if (!devfsd_buf_cache) - OOPS("(): unable to allocate event slab\n"); -#ifdef CONFIG_DEVFS_DEBUG - devfs_debug = devfs_debug_init; - printk(KERN_INFO "%s: devfs_debug: 0x%0x\n", DEVFS_NAME, devfs_debug); -#endif - printk(KERN_INFO "%s: boot_options: 0x%0x\n", DEVFS_NAME, boot_options); - - /* register special device for devfsd communication */ - major = register_chrdev(0, "devfs", &devfs_fops); - if (major < 0) - return major; - - /* And create the entry for ".devfsd" */ - devfsd = _devfs_alloc_entry(".devfsd", 0, S_IFCHR | S_IRUSR | S_IWUSR); - if (devfsd == NULL) - return -ENOMEM; - devfsd->u.dev = MKDEV(major, 0); - _devfs_append_entry(root_entry, devfsd, NULL); - -#ifdef CONFIG_DEVFS_DEBUG - stat = _devfs_alloc_entry(".stat", 0, S_IFCHR | S_IRUGO); - if (stat == NULL) - return -ENOMEM; - stat->u.dev = MKDEV(major, 1); - _devfs_append_entry(root_entry, stat, NULL); -#endif - - err = register_filesystem(&devfs_fs_type); - return err; -} /* End Function init_devfs_fs */ - -void __init mount_devfs_fs(void) -{ - int err; - - if (!(boot_options & OPTION_MOUNT)) - return; - err = do_mount("none", "/dev", "devfs", 0, NULL); - if (err == 0) - printk(KERN_INFO "Mounted devfs on /dev\n"); - else - PRINTK("(): unable to mount devfs, err: %d\n", err); -} /* End Function mount_devfs_fs */ - -module_init(init_devfs_fs) diff --git a/fs/devfs/util.c b/fs/devfs/util.c deleted file mode 100644 index db06d388c..000000000 --- a/fs/devfs/util.c +++ /dev/null @@ -1,97 +0,0 @@ -/* devfs (Device FileSystem) utilities. - - Copyright (C) 1999-2002 Richard Gooch - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - Richard Gooch may be reached by email at rgooch@atnf.csiro.au - The postal address is: - Richard Gooch, c/o ATNF, P. O. Box 76, Epping, N.S.W., 2121, Australia. - - ChangeLog - - 19991031 Richard Gooch - Created. - 19991103 Richard Gooch - Created <_devfs_convert_name> and supported SCSI and IDE CD-ROMs - 20000203 Richard Gooch - Changed operations pointer type to void *. - 20000621 Richard Gooch - Changed interface to . - 20000622 Richard Gooch - Took account of interface change to . - Took account of interface change to . - 20010519 Richard Gooch - Documentation cleanup. - 20010709 Richard Gooch - Created and . - 20010710 Richard Gooch - Created . - 20010730 Richard Gooch - Documentation typo fix. - 20010806 Richard Gooch - Made and private. - 20010813 Richard Gooch - Fixed bug in : limited to 128 numbers - 20010818 Richard Gooch - Updated major masks up to Linus' "no new majors" proclamation. - Block: were 126 now 122 free, char: were 26 now 19 free. - 20020324 Richard Gooch - Fixed bug in : was clearing beyond - bitfield. - 20020326 Richard Gooch - Fixed bitfield data type for . - Made major bitfield type and initialiser 64 bit safe. - 20020413 Richard Gooch - Fixed shift warning on 64 bit machines. - 20020428 Richard Gooch - Copied and used macro for error messages from fs/devfs/base.c - 20021013 Richard Gooch - Documentation fix. - 20030101 Adam J. Richter - Eliminate DEVFS_SPECIAL_{CHR,BLK}. Use mode_t instead. - 20030106 Christoph Hellwig - Rewrite devfs_{,de}alloc_devnum to look like C code. -*/ -#include -#include -#include -#include -#include -#include -#include - -int devfs_register_tape(const char *name) -{ - char tname[32], dest[64]; - static unsigned int tape_counter; - unsigned int n = tape_counter++; - - sprintf(dest, "../%s", name); - sprintf(tname, "tapes/tape%u", n); - devfs_mk_symlink(tname, dest); - - return n; -} - -EXPORT_SYMBOL(devfs_register_tape); - -void devfs_unregister_tape(int num) -{ - if (num >= 0) - devfs_remove("tapes/tape%u", num); -} - -EXPORT_SYMBOL(devfs_unregister_tape); diff --git a/fs/devpts/inode.c b/fs/devpts/inode.c index 5fa365597..b44d79196 100644 --- a/fs/devpts/inode.c +++ b/fs/devpts/inode.c @@ -143,7 +143,6 @@ devpts_fill_super(struct super_block *s, void *data, int silent) inode->i_ino = 1; inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; inode->i_blocks = 0; - inode->i_blksize = 1024; inode->i_uid = inode->i_gid = 0; inode->i_mode = S_IFDIR | S_IRUGO | S_IXUGO | S_IWUSR; inode->i_op = &simple_dir_inode_operations; @@ -161,10 +160,10 @@ fail: return -ENOMEM; } -static struct super_block *devpts_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int devpts_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_single(fs_type, flags, data, devpts_fill_super); + return get_sb_single(fs_type, flags, data, devpts_fill_super, mnt); } static struct file_system_type devpts_fs_type = { @@ -203,14 +202,13 @@ int devpts_pty_new(struct tty_struct *tty) return -ENOMEM; inode->i_ino = number+2; - inode->i_blksize = 1024; inode->i_uid = config.setuid ? config.uid : current->fsuid; inode->i_gid = config.setgid ? config.gid : current->fsgid; inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; init_special_inode(inode, S_IFCHR|config.mode, device); inode->i_xid = vx_current_xid(); inode->i_op = &devpts_file_inode_operations; - inode->u.generic_ip = tty; + inode->i_private = tty; dentry = get_node(number); if (!IS_ERR(dentry) && !dentry->d_inode) @@ -229,7 +227,7 @@ struct tty_struct *devpts_get_tty(int number) tty = NULL; if (!IS_ERR(dentry)) { if (dentry->d_inode) - tty = dentry->d_inode->u.generic_ip; + tty = dentry->d_inode->i_private; dput(dentry); } diff --git a/fs/direct-io.c b/fs/direct-io.c index b05d1b218..5981e17f4 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -162,7 +162,7 @@ static int dio_refill_pages(struct dio *dio) NULL); /* vmas */ up_read(¤t->mm->mmap_sem); - if (ret < 0 && dio->blocks_available && (dio->rw == WRITE)) { + if (ret < 0 && dio->blocks_available && (dio->rw & WRITE)) { struct page *page = ZERO_PAGE(dio->curr_user_address); /* * A memory fault, but the filesystem has some outstanding @@ -220,7 +220,8 @@ static void dio_complete(struct dio *dio, loff_t offset, ssize_t bytes) if (dio->end_io && dio->result) dio->end_io(dio->iocb, offset, bytes, dio->map_bh.b_private); if (dio->lock_type == DIO_LOCKING) - up_read(&dio->inode->i_alloc_sem); + /* lockdep: non-owner release */ + up_read_non_owner(&dio->inode->i_alloc_sem); } /* @@ -535,7 +536,7 @@ static int get_more_blocks(struct dio *dio) map_bh->b_state = 0; map_bh->b_size = fs_count << dio->inode->i_blkbits; - create = dio->rw == WRITE; + create = dio->rw & WRITE; if (dio->lock_type == DIO_LOCKING) { if (dio->block_in_file < (i_size_read(dio->inode) >> dio->blkbits)) @@ -867,7 +868,7 @@ do_holes: loff_t i_size_aligned; /* AKPM: eargh, -ENOTBLK is a hack */ - if (dio->rw == WRITE) { + if (dio->rw & WRITE) { page_cache_release(page); return -ENOTBLK; } @@ -1045,7 +1046,7 @@ direct_io_worker(int rw, struct kiocb *iocb, struct inode *inode, } } /* end iovec loop */ - if (ret == -ENOTBLK && rw == WRITE) { + if (ret == -ENOTBLK && (rw & WRITE)) { /* * The remaining part of the request will be * be handled by buffered I/O when we return @@ -1089,7 +1090,7 @@ direct_io_worker(int rw, struct kiocb *iocb, struct inode *inode, if (dio->is_async) { int should_wait = 0; - if (dio->result < dio->size && rw == WRITE) { + if (dio->result < dio->size && (rw & WRITE)) { dio->waiter = current; should_wait = 1; } @@ -1142,7 +1143,7 @@ direct_io_worker(int rw, struct kiocb *iocb, struct inode *inode, ret = transferred; /* We could have also come here on an AIO file extend */ - if (!is_sync_kiocb(iocb) && rw == WRITE && + if (!is_sync_kiocb(iocb) && (rw & WRITE) && ret >= 0 && dio->result == dio->size) /* * For AIO writes where we have completed the @@ -1194,7 +1195,7 @@ __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, int acquire_i_mutex = 0; if (rw & WRITE) - current->flags |= PF_SYNCWRITE; + rw = WRITE_SYNC; if (bdev) bdev_blkbits = blksize_bits(bdev_hardsect_size(bdev)); @@ -1261,7 +1262,8 @@ __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, } if (dio_lock_type == DIO_LOCKING) - down_read(&inode->i_alloc_sem); + /* lockdep: not the owner will release it */ + down_read_non_owner(&inode->i_alloc_sem); } /* @@ -1270,7 +1272,7 @@ __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, * even for AIO, we need to wait for i/o to complete before * returning in this case. */ - dio->is_async = !is_sync_kiocb(iocb) && !((rw == WRITE) && + dio->is_async = !is_sync_kiocb(iocb) && !((rw & WRITE) && (end > i_size_read(inode))); retval = direct_io_worker(rw, iocb, inode, iov, offset, @@ -1284,8 +1286,6 @@ out: mutex_unlock(&inode->i_mutex); else if (acquire_i_mutex) mutex_lock(&inode->i_mutex); - if (rw & WRITE) - current->flags &= ~PF_SYNCWRITE; return retval; } EXPORT_SYMBOL(__blockdev_direct_IO); diff --git a/fs/dquot.c b/fs/dquot.c index 81d87a413..0122a2791 100644 --- a/fs/dquot.c +++ b/fs/dquot.c @@ -250,7 +250,7 @@ static inline struct dquot *find_dquot(unsigned int hashent, struct super_block /* Add a dquot to the tail of the free list */ static inline void put_dquot_last(struct dquot *dquot) { - list_add(&dquot->dq_free, free_dquots.prev); + list_add_tail(&dquot->dq_free, &free_dquots); dqstats.free_dquots++; } @@ -266,7 +266,7 @@ static inline void put_inuse(struct dquot *dquot) { /* We add to the back of inuse list so we don't have to restart * when traversing this list and we block */ - list_add(&dquot->dq_inuse, inuse_list.prev); + list_add_tail(&dquot->dq_inuse, &inuse_list); dqstats.allocated_dquots++; } diff --git a/fs/efs/inode.c b/fs/efs/inode.c index 180607f93..174696f9b 100644 --- a/fs/efs/inode.c +++ b/fs/efs/inode.c @@ -21,7 +21,7 @@ static sector_t _efs_bmap(struct address_space *mapping, sector_t block) { return generic_block_bmap(mapping,block,efs_get_block); } -static struct address_space_operations efs_aops = { +static const struct address_space_operations efs_aops = { .readpage = efs_readpage, .sync_page = block_sync_page, .bmap = _efs_bmap diff --git a/fs/efs/super.c b/fs/efs/super.c index dff623e3d..8ac2462ae 100644 --- a/fs/efs/super.c +++ b/fs/efs/super.c @@ -15,13 +15,13 @@ #include #include -static int efs_statfs(struct super_block *s, struct kstatfs *buf); +static int efs_statfs(struct dentry *dentry, struct kstatfs *buf); static int efs_fill_super(struct super_block *s, void *d, int silent); -static struct super_block *efs_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int efs_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_bdev(fs_type, flags, dev_name, data, efs_fill_super); + return get_sb_bdev(fs_type, flags, dev_name, data, efs_fill_super, mnt); } static struct file_system_type efs_fs_type = { @@ -322,8 +322,8 @@ out_no_fs: return -EINVAL; } -static int efs_statfs(struct super_block *s, struct kstatfs *buf) { - struct efs_sb_info *sb = SUPER_INFO(s); +static int efs_statfs(struct dentry *dentry, struct kstatfs *buf) { + struct efs_sb_info *sb = SUPER_INFO(dentry->d_sb); buf->f_type = EFS_SUPER_MAGIC; /* efs magic number */ buf->f_bsize = EFS_BLOCKSIZE; /* blocksize */ diff --git a/fs/efs/symlink.c b/fs/efs/symlink.c index 3d9a350e3..1d30d2ff4 100644 --- a/fs/efs/symlink.c +++ b/fs/efs/symlink.c @@ -22,7 +22,7 @@ static int efs_symlink_readpage(struct file *file, struct page *page) err = -ENAMETOOLONG; if (size > 2 * EFS_BLOCKSIZE) - goto fail; + goto fail_notlocked; lock_kernel(); /* read first 512 bytes of link target */ @@ -47,12 +47,13 @@ static int efs_symlink_readpage(struct file *file, struct page *page) return 0; fail: unlock_kernel(); +fail_notlocked: SetPageError(page); kunmap(page); unlock_page(page); return err; } -struct address_space_operations efs_symlink_aops = { +const struct address_space_operations efs_symlink_aops = { .readpage = efs_symlink_readpage }; diff --git a/fs/eventpoll.c b/fs/eventpoll.c index 1b4491cdd..8d544334b 100644 --- a/fs/eventpoll.c +++ b/fs/eventpoll.c @@ -1,6 +1,6 @@ /* * fs/eventpoll.c ( Efficent event polling implementation ) - * Copyright (C) 2001,...,2003 Davide Libenzi + * Copyright (C) 2001,...,2006 Davide Libenzi * * 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 @@ -120,7 +120,7 @@ struct epoll_filefd { */ struct wake_task_node { struct list_head llink; - task_t *task; + struct task_struct *task; wait_queue_head_t *wq; }; @@ -268,9 +268,9 @@ static int ep_poll(struct eventpoll *ep, struct epoll_event __user *events, int maxevents, long timeout); static int eventpollfs_delete_dentry(struct dentry *dentry); static struct inode *ep_eventpoll_inode(void); -static struct super_block *eventpollfs_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, - void *data); +static int eventpollfs_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, + void *data, struct vfsmount *mnt); /* * This semaphore is used to serialize ep_free() and eventpoll_release_file(). @@ -337,20 +337,20 @@ static inline int ep_cmp_ffd(struct epoll_filefd *p1, /* Special initialization for the rb-tree node to detect linkage */ static inline void ep_rb_initnode(struct rb_node *n) { - n->rb_parent = n; + rb_set_parent(n, n); } /* Removes a node from the rb-tree and marks it for a fast is-linked check */ static inline void ep_rb_erase(struct rb_node *n, struct rb_root *r) { rb_erase(n, r); - n->rb_parent = n; + rb_set_parent(n, n); } /* Fast check to verify that the item is linked to the main rb-tree */ static inline int ep_rb_linked(struct rb_node *n) { - return n->rb_parent != n; + return rb_parent(n) != n; } /* @@ -413,7 +413,7 @@ static void ep_poll_safewake(struct poll_safewake *psw, wait_queue_head_t *wq) { int wake_nests = 0; unsigned long flags; - task_t *this_task = current; + struct task_struct *this_task = current; struct list_head *lsthead = &psw->wake_task_list, *lnk; struct wake_task_node *tncur; struct wake_task_node tnode; @@ -1004,7 +1004,7 @@ static int ep_insert(struct eventpoll *ep, struct epoll_event *event, /* Notify waiting tasks that events are available */ if (waitqueue_active(&ep->wq)) - wake_up(&ep->wq); + __wake_up_locked(&ep->wq, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE); if (waitqueue_active(&ep->poll_wait)) pwake++; } @@ -1083,7 +1083,8 @@ static int ep_modify(struct eventpoll *ep, struct epitem *epi, struct epoll_even /* Notify waiting tasks that events are available */ if (waitqueue_active(&ep->wq)) - wake_up(&ep->wq); + __wake_up_locked(&ep->wq, TASK_UNINTERRUPTIBLE | + TASK_INTERRUPTIBLE); if (waitqueue_active(&ep->poll_wait)) pwake++; } @@ -1167,7 +1168,7 @@ static int ep_unlink(struct eventpoll *ep, struct epitem *epi) eexit_1: DNPRINTK(3, (KERN_INFO "[%p] eventpoll: ep_unlink(%p, %p) = %d\n", - current, ep, epi->file, error)); + current, ep, epi->ffd.file, error)); return error; } @@ -1235,7 +1236,7 @@ static int ep_poll_callback(wait_queue_t *wait, unsigned mode, int sync, void *k struct eventpoll *ep = epi->ep; DNPRINTK(3, (KERN_INFO "[%p] eventpoll: poll_callback(%p) epi=%p ep=%p\n", - current, epi->file, epi, ep)); + current, epi->ffd.file, epi, ep)); write_lock_irqsave(&ep->lock, flags); @@ -1260,7 +1261,8 @@ is_linked: * wait list. */ if (waitqueue_active(&ep->wq)) - wake_up(&ep->wq); + __wake_up_locked(&ep->wq, TASK_UNINTERRUPTIBLE | + TASK_INTERRUPTIBLE); if (waitqueue_active(&ep->poll_wait)) pwake++; @@ -1444,7 +1446,8 @@ static void ep_reinject_items(struct eventpoll *ep, struct list_head *txlist) * wait list. */ if (waitqueue_active(&ep->wq)) - wake_up(&ep->wq); + __wake_up_locked(&ep->wq, TASK_UNINTERRUPTIBLE | + TASK_INTERRUPTIBLE); if (waitqueue_active(&ep->poll_wait)) pwake++; } @@ -1516,7 +1519,7 @@ retry: * ep_poll_callback() when events will become available. */ init_waitqueue_entry(&wait, current); - add_wait_queue(&ep->wq, &wait); + __add_wait_queue(&ep->wq, &wait); for (;;) { /* @@ -1536,7 +1539,7 @@ retry: jtimeout = schedule_timeout(jtimeout); write_lock_irqsave(&ep->lock, flags); } - remove_wait_queue(&ep->wq, &wait); + __remove_wait_queue(&ep->wq, &wait); set_current_state(TASK_RUNNING); } @@ -1587,7 +1590,6 @@ static struct inode *ep_eventpoll_inode(void) inode->i_uid = current->fsuid; inode->i_gid = current->fsgid; inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; - inode->i_blksize = PAGE_SIZE; return inode; eexit_1: @@ -1595,11 +1597,12 @@ eexit_1: } -static struct super_block * +static int eventpollfs_get_sb(struct file_system_type *fs_type, int flags, - const char *dev_name, void *data) + const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_pseudo(fs_type, "eventpoll:", NULL, EVENTPOLLFS_MAGIC); + return get_sb_pseudo(fs_type, "eventpoll:", NULL, EVENTPOLLFS_MAGIC, + mnt); } diff --git a/fs/exec.c b/fs/exec.c index 5d358131a..c567e1a20 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -22,7 +22,6 @@ * formats. */ -#include #include #include #include @@ -42,13 +41,14 @@ #include #include #include -#include +#include #include #include #include #include #include #include +#include #include #include @@ -489,8 +489,6 @@ struct file *open_exec(const char *name) if (!(nd.mnt->mnt_flags & MNT_NOEXEC) && S_ISREG(inode->i_mode)) { int err = vfs_permission(&nd, MAY_EXEC); - if (!err && !(inode->i_mode & 0111)) - err = -EACCES; file = ERR_PTR(err); if (!err) { file = nameidata_to_filp(&nd, O_RDONLY); @@ -668,8 +666,6 @@ static int de_thread(struct task_struct *tsk) * and to assume its PID: */ if (!thread_group_leader(current)) { - struct dentry *proc_dentry1, *proc_dentry2; - /* * Wait for the thread group leader to be a zombie. * It should already be zombie at this point, most @@ -691,10 +687,6 @@ static int de_thread(struct task_struct *tsk) */ current->start_time = leader->start_time; - spin_lock(&leader->proc_lock); - spin_lock(¤t->proc_lock); - proc_dentry1 = proc_pid_unhash(current); - proc_dentry2 = proc_pid_unhash(leader); write_lock_irq(&tasklist_lock); BUG_ON(leader->tgid != current->tgid); @@ -715,7 +707,7 @@ static int de_thread(struct task_struct *tsk) attach_pid(current, PIDTYPE_PID, current->pid); attach_pid(current, PIDTYPE_PGID, current->signal->pgrp); attach_pid(current, PIDTYPE_SID, current->signal->session); - list_add_tail_rcu(¤t->tasks, &init_task.tasks); + list_replace_rcu(&leader->tasks, ¤t->tasks); current->group_leader = current; leader->group_leader = current; @@ -723,7 +715,6 @@ static int de_thread(struct task_struct *tsk) /* Reduce leader to a thread */ detach_pid(leader, PIDTYPE_PGID); detach_pid(leader, PIDTYPE_SID); - list_del_init(&leader->tasks); current->exit_signal = SIGCHLD; @@ -731,10 +722,6 @@ static int de_thread(struct task_struct *tsk) leader->exit_state = EXIT_DEAD; write_unlock_irq(&tasklist_lock); - spin_unlock(&leader->proc_lock); - spin_unlock(¤t->proc_lock); - proc_pid_flush(proc_dentry1); - proc_pid_flush(proc_dentry2); } /* @@ -767,7 +754,7 @@ no_thread_group: write_lock_irq(&tasklist_lock); spin_lock(&oldsighand->siglock); - spin_lock(&newsighand->siglock); + spin_lock_nested(&newsighand->siglock, SINGLE_DEPTH_NESTING); rcu_assign_pointer(current->sighand, newsighand); recalc_sigpending(); @@ -868,7 +855,6 @@ int flush_old_exec(struct linux_binprm * bprm) bprm->mm = NULL; /* We're using it now */ /* This is the point of no return */ - steal_locks(files); put_files_struct(files); current->sas_ss_sp = current->sas_ss_size = 0; @@ -937,12 +923,6 @@ int prepare_binprm(struct linux_binprm *bprm) int retval; mode = inode->i_mode; - /* - * Check execute perms again - if the caller has CAP_DAC_OVERRIDE, - * generic_permission lets a non-executable through - */ - if (!(mode & 0111)) /* with at least _one_ execute bit set */ - return -EACCES; if (bprm->file->f_op == NULL) return -EACCES; @@ -981,13 +961,7 @@ EXPORT_SYMBOL(prepare_binprm); static int unsafe_exec(struct task_struct *p) { - int unsafe = 0; - if (p->ptrace & PT_PTRACED) { - if (p->ptrace & PT_PTRACE_CAP) - unsafe |= LSM_UNSAFE_PTRACE_CAP; - else - unsafe |= LSM_UNSAFE_PTRACE; - } + int unsafe = tracehook_unsafe_exec(p); if (atomic_read(&p->fs->count) > 1 || atomic_read(&p->files->count) > 1 || atomic_read(&p->sighand->count) > 1) @@ -1088,6 +1062,11 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs) /* kernel module loader fixup */ /* so we don't try to load run modprobe in kernel space. */ set_fs(USER_DS); + + retval = audit_bprm(bprm); + if (retval) + return retval; + retval = -ENOENT; for (try=0; try<2; try++) { read_lock(&binfmt_lock); @@ -1107,6 +1086,7 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs) bprm->file = NULL; current->did_exec = 1; proc_exec_connector(current); + tracehook_report_exec(bprm, regs); return retval; } read_lock(&binfmt_lock); @@ -1377,67 +1357,102 @@ static void format_corename(char *corename, const char *pattern, long signr) *out_ptr = 0; } -static void zap_threads (struct mm_struct *mm) +static void zap_process(struct task_struct *start) { - struct task_struct *g, *p; - struct task_struct *tsk = current; - struct completion *vfork_done = tsk->vfork_done; - int traced = 0; + struct task_struct *t; - /* - * Make sure nobody is waiting for us to release the VM, - * otherwise we can deadlock when we wait on each other - */ - if (vfork_done) { - tsk->vfork_done = NULL; - complete(vfork_done); - } + start->signal->flags = SIGNAL_GROUP_EXIT; + start->signal->group_stop_count = 0; - read_lock(&tasklist_lock); - do_each_thread(g,p) - if (mm == p->mm && p != tsk) { - force_sig_specific(SIGKILL, p); - mm->core_waiters++; - if (unlikely(p->ptrace) && - unlikely(p->parent->mm == mm)) - traced = 1; + t = start; + do { + if (t != current && t->mm) { + t->mm->core_waiters++; + sigaddset(&t->pending.signal, SIGKILL); + signal_wake_up(t, 1); } - while_each_thread(g,p); + } while ((t = next_thread(t)) != start); +} - read_unlock(&tasklist_lock); +static inline int zap_threads(struct task_struct *tsk, struct mm_struct *mm, + int exit_code) +{ + struct task_struct *g, *p; + unsigned long flags; + int err = -EAGAIN; + + spin_lock_irq(&tsk->sighand->siglock); + if (!(tsk->signal->flags & SIGNAL_GROUP_EXIT)) { + tsk->signal->group_exit_code = exit_code; + zap_process(tsk); + err = 0; + } + spin_unlock_irq(&tsk->sighand->siglock); + if (err) + return err; - if (unlikely(traced)) { - /* - * We are zapping a thread and the thread it ptraces. - * If the tracee went into a ptrace stop for exit tracing, - * we could deadlock since the tracer is waiting for this - * coredump to finish. Detach them so they can both die. - */ - write_lock_irq(&tasklist_lock); - do_each_thread(g,p) { - if (mm == p->mm && p != tsk && - p->ptrace && p->parent->mm == mm) { - __ptrace_detach(p, 0); + if (atomic_read(&mm->mm_users) == mm->core_waiters + 1) + goto done; + + rcu_read_lock(); + for_each_process(g) { + if (g == tsk->group_leader) + continue; + + p = g; + do { + if (p->mm) { + if (p->mm == mm) { + /* + * p->sighand can't disappear, but + * may be changed by de_thread() + */ + lock_task_sighand(p, &flags); + zap_process(p); + unlock_task_sighand(p, &flags); + } + break; } - } while_each_thread(g,p); - write_unlock_irq(&tasklist_lock); + } while ((p = next_thread(p)) != g); } + rcu_read_unlock(); +done: + return mm->core_waiters; } -static void coredump_wait(struct mm_struct *mm) +static int coredump_wait(int exit_code) { - DECLARE_COMPLETION(startup_done); + struct task_struct *tsk = current; + struct mm_struct *mm = tsk->mm; + struct completion startup_done; + struct completion *vfork_done; int core_waiters; + init_completion(&mm->core_done); + init_completion(&startup_done); mm->core_startup_done = &startup_done; - zap_threads(mm); - core_waiters = mm->core_waiters; + core_waiters = zap_threads(tsk, mm, exit_code); up_write(&mm->mmap_sem); + if (unlikely(core_waiters < 0)) + goto fail; + + /* + * Make sure nobody is waiting for us to release the VM, + * otherwise we can deadlock when we wait on each other + */ + vfork_done = tsk->vfork_done; + if (vfork_done) { + tsk->vfork_done = NULL; + complete(vfork_done); + } + if (core_waiters) wait_for_completion(&startup_done); +fail: BUG_ON(mm->core_waiters); + return core_waiters; } int do_coredump(long signr, int exit_code, struct pt_regs * regs) @@ -1473,22 +1488,9 @@ int do_coredump(long signr, int exit_code, struct pt_regs * regs) } mm->dumpable = 0; - retval = -EAGAIN; - spin_lock_irq(¤t->sighand->siglock); - if (!(current->signal->flags & SIGNAL_GROUP_EXIT)) { - current->signal->flags = SIGNAL_GROUP_EXIT; - current->signal->group_exit_code = exit_code; - current->signal->group_stop_count = 0; - retval = 0; - } - spin_unlock_irq(¤t->sighand->siglock); - if (retval) { - up_write(&mm->mmap_sem); + retval = coredump_wait(exit_code); + if (retval < 0) goto fail; - } - - init_completion(&mm->core_done); - coredump_wait(mm); /* * Clear any false indication of pending signals that might diff --git a/fs/exportfs/expfs.c b/fs/exportfs/expfs.c index 4c3900935..93e77c3d2 100644 --- a/fs/exportfs/expfs.c +++ b/fs/exportfs/expfs.c @@ -315,7 +315,7 @@ struct getdents_callback { * the name matching the specified inode number. */ static int filldir_one(void * __buf, const char * name, int len, - loff_t pos, ino_t ino, unsigned int d_type) + loff_t pos, u64 ino, unsigned int d_type) { struct getdents_callback *buf = __buf; int result = 0; diff --git a/fs/ext2/Makefile b/fs/ext2/Makefile index c5d02da73..e0b2b43c1 100644 --- a/fs/ext2/Makefile +++ b/fs/ext2/Makefile @@ -4,7 +4,7 @@ obj-$(CONFIG_EXT2_FS) += ext2.o -ext2-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ +ext2-y := balloc.o dir.o file.o fsync.o ialloc.o inode.o \ ioctl.o namei.o super.o symlink.o ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o xattr_user.o xattr_trusted.o diff --git a/fs/ext2/balloc.c b/fs/ext2/balloc.c index 21cee4fa1..117ebb9ca 100644 --- a/fs/ext2/balloc.c +++ b/fs/ext2/balloc.c @@ -11,7 +11,6 @@ * David S. Miller (davem@caip.rutgers.edu), 1995 */ -#include #include "ext2.h" #include #include @@ -104,8 +103,8 @@ static int reserve_blocks(struct super_block *sb, int count) { struct ext2_sb_info *sbi = EXT2_SB(sb); struct ext2_super_block *es = sbi->s_es; - unsigned free_blocks; - unsigned root_blocks; + unsigned long free_blocks; + unsigned long root_blocks; free_blocks = percpu_counter_read_positive(&sbi->s_freeblocks_counter); root_blocks = le32_to_cpu(es->s_r_blocks_count); @@ -531,6 +530,25 @@ io_error: goto out_release; } +#ifdef EXT2FS_DEBUG + +static int nibblemap[] = {4, 3, 3, 2, 3, 2, 2, 1, 3, 2, 2, 1, 2, 1, 1, 0}; + +unsigned long ext2_count_free (struct buffer_head * map, unsigned int numchars) +{ + unsigned int i; + unsigned long sum = 0; + + if (!map) + return (0); + for (i = 0; i < numchars; i++) + sum += nibblemap[map->b_data[i] & 0xf] + + nibblemap[(map->b_data[i] >> 4) & 0xf]; + return (sum); +} + +#endif /* EXT2FS_DEBUG */ + unsigned long ext2_count_free_blocks (struct super_block * sb) { struct ext2_group_desc * desc; @@ -540,7 +558,6 @@ unsigned long ext2_count_free_blocks (struct super_block * sb) unsigned long bitmap_count, x; struct ext2_super_block *es; - lock_super (sb); es = EXT2_SB(sb)->s_es; desc_count = 0; bitmap_count = 0; @@ -564,7 +581,6 @@ unsigned long ext2_count_free_blocks (struct super_block * sb) printk("ext2_count_free_blocks: stored = %lu, computed = %lu, %lu\n", (long)le32_to_cpu(es->s_free_blocks_count), desc_count, bitmap_count); - unlock_super (sb); return bitmap_count; #else for (i = 0; i < EXT2_SB(sb)->s_groups_count; i++) { diff --git a/fs/ext2/bitmap.c b/fs/ext2/bitmap.c deleted file mode 100644 index e9983a0dd..000000000 --- a/fs/ext2/bitmap.c +++ /dev/null @@ -1,32 +0,0 @@ -/* - * linux/fs/ext2/bitmap.c - * - * Copyright (C) 1992, 1993, 1994, 1995 - * Remy Card (card@masi.ibp.fr) - * Laboratoire MASI - Institut Blaise Pascal - * Universite Pierre et Marie Curie (Paris VI) - */ - -#ifdef EXT2FS_DEBUG - -#include - -#include "ext2.h" - -static int nibblemap[] = {4, 3, 3, 2, 3, 2, 2, 1, 3, 2, 2, 1, 2, 1, 1, 0}; - -unsigned long ext2_count_free (struct buffer_head * map, unsigned int numchars) -{ - unsigned int i; - unsigned long sum = 0; - - if (!map) - return (0); - for (i = 0; i < numchars; i++) - sum += nibblemap[map->b_data[i] & 0xf] + - nibblemap[(map->b_data[i] >> 4) & 0xf]; - return (sum); -} - -#endif /* EXT2FS_DEBUG */ - diff --git a/fs/ext2/dir.c b/fs/ext2/dir.c index d672aa9f4..b0e7d9feb 100644 --- a/fs/ext2/dir.c +++ b/fs/ext2/dir.c @@ -112,7 +112,7 @@ static void ext2_check_page(struct page *page) if (offs != limit) goto Eend; out: - SetPageChecked(page); + SetPageFsMisc(page); return; /* Too bad, we had an error */ @@ -152,21 +152,20 @@ Eend: dir->i_ino, (page->index<inode)); fail: - SetPageChecked(page); + SetPageFsMisc(page); SetPageError(page); } static struct page * ext2_get_page(struct inode *dir, unsigned long n) { struct address_space *mapping = dir->i_mapping; - struct page *page = read_cache_page(mapping, n, - (filler_t*)mapping->a_ops->readpage, NULL); + struct page *page = read_mapping_page(mapping, n, NULL); if (!IS_ERR(page)) { wait_on_page_locked(page); kmap(page); if (!PageUptodate(page)) goto fail; - if (!PageChecked(page)) + if (!PageFsMisc(page)) ext2_check_page(page); if (PageError(page)) goto fail; @@ -400,8 +399,7 @@ ino_t ext2_inode_by_name(struct inode * dir, struct dentry *dentry) de = ext2_find_entry (dir, dentry, &page); if (de) { res = le32_to_cpu(de->inode); - kunmap(page); - page_cache_release(page); + ext2_put_page(page); } return res; } diff --git a/fs/ext2/ext2.h b/fs/ext2/ext2.h index a8ab31e33..c89e9177d 100644 --- a/fs/ext2/ext2.h +++ b/fs/ext2/ext2.h @@ -162,9 +162,9 @@ extern const struct file_operations ext2_file_operations; extern const struct file_operations ext2_xip_file_operations; /* inode.c */ -extern struct address_space_operations ext2_aops; -extern struct address_space_operations ext2_aops_xip; -extern struct address_space_operations ext2_nobh_aops; +extern const struct address_space_operations ext2_aops; +extern const struct address_space_operations ext2_aops_xip; +extern const struct address_space_operations ext2_nobh_aops; extern int ext2_sync_flags(struct inode *inode); /* namei.c */ diff --git a/fs/ext2/fsync.c b/fs/ext2/fsync.c index c9c2e5ffa..7806b9e81 100644 --- a/fs/ext2/fsync.c +++ b/fs/ext2/fsync.c @@ -24,7 +24,7 @@ #include "ext2.h" #include -#include /* for fsync_inode_buffers() */ +#include /* for sync_mapping_buffers() */ /* diff --git a/fs/ext2/ialloc.c b/fs/ext2/ialloc.c index 11e7d7a1c..8fb7f0062 100644 --- a/fs/ext2/ialloc.c +++ b/fs/ext2/ialloc.c @@ -12,7 +12,6 @@ * David S. Miller (davem@caip.rutgers.edu), 1995 */ -#include #include #include #include @@ -583,7 +582,6 @@ got: inode->i_mode = mode; inode->i_ino = ino; - inode->i_blksize = PAGE_SIZE; /* This is the optimal IO size (for stat), not the fs block size */ inode->i_blocks = 0; inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC; memset(ei->i_data, 0, sizeof(ei->i_data)); @@ -661,7 +659,6 @@ unsigned long ext2_count_free_inodes (struct super_block * sb) unsigned long bitmap_count = 0; struct buffer_head *bitmap_bh = NULL; - lock_super (sb); es = EXT2_SB(sb)->s_es; for (i = 0; i < EXT2_SB(sb)->s_groups_count; i++) { unsigned x; @@ -684,7 +681,6 @@ unsigned long ext2_count_free_inodes (struct super_block * sb) printk("ext2_count_free_inodes: stored = %lu, computed = %lu, %lu\n", percpu_counter_read(&EXT2_SB(sb)->s_freeinodes_counter), desc_count, bitmap_count); - unlock_super(sb); return desc_count; #else for (i = 0; i < EXT2_SB(sb)->s_groups_count; i++) { diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index c6a012874..2f0c404f0 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c @@ -685,7 +685,7 @@ ext2_writepages(struct address_space *mapping, struct writeback_control *wbc) return mpage_writepages(mapping, wbc, ext2_get_block); } -struct address_space_operations ext2_aops = { +const struct address_space_operations ext2_aops = { .readpage = ext2_readpage, .readpages = ext2_readpages, .writepage = ext2_writepage, @@ -698,12 +698,12 @@ struct address_space_operations ext2_aops = { .migratepage = buffer_migrate_page, }; -struct address_space_operations ext2_aops_xip = { +const struct address_space_operations ext2_aops_xip = { .bmap = ext2_bmap, .get_xip_page = ext2_get_xip_page, }; -struct address_space_operations ext2_nobh_aops = { +const struct address_space_operations ext2_nobh_aops = { .readpage = ext2_readpage, .readpages = ext2_readpages, .writepage = ext2_nobh_writepage, @@ -914,7 +914,7 @@ void ext2_truncate (struct inode * inode) return; if (ext2_inode_is_fast_symlink(inode)) return; - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) + if (IS_APPEND(inode) || IS_IXORUNLINK(inode)) return; ext2_discard_prealloc(inode); @@ -1145,7 +1145,6 @@ void ext2_read_inode (struct inode * inode) brelse (bh); goto bad_inode; } - inode->i_blksize = PAGE_SIZE; /* This is the optimal IO size (for stat), not the fs block size */ inode->i_blocks = le32_to_cpu(raw_inode->i_blocks); ei->i_flags = le32_to_cpu(raw_inode->i_flags); ei->i_faddr = le32_to_cpu(raw_inode->i_faddr); diff --git a/fs/ext2/super.c b/fs/ext2/super.c index 22993252e..6bd5bfda6 100644 --- a/fs/ext2/super.c +++ b/fs/ext2/super.c @@ -16,7 +16,6 @@ * David S. Miller (davem@caip.rutgers.edu), 1995 */ -#include #include #include #include @@ -39,7 +38,7 @@ static void ext2_sync_super(struct super_block *sb, struct ext2_super_block *es); static int ext2_remount (struct super_block * sb, int * flags, char * data); -static int ext2_statfs (struct super_block * sb, struct kstatfs * buf); +static int ext2_statfs (struct dentry * dentry, struct kstatfs * buf); void ext2_error (struct super_block * sb, const char * function, const char * fmt, ...) @@ -260,7 +259,7 @@ static struct dentry *ext2_get_dentry(struct super_block *sb, void *vobjp) struct inode *inode; struct dentry *result; - if (ino != EXT2_ROOT_INO && ino < EXT2_FIRST_INO(sb)) + if (ino < EXT2_FIRST_INO(sb) && ino != EXT2_ROOT_INO) return ERR_PTR(-ESTALE); if (ino > le32_to_cpu(EXT2_SB(sb)->s_es->s_inodes_count)) return ERR_PTR(-ESTALE); @@ -273,9 +272,8 @@ static struct dentry *ext2_get_dentry(struct super_block *sb, void *vobjp) inode = iget(sb, ino); if (inode == NULL) return ERR_PTR(-ENOMEM); - if (is_bad_inode(inode) - || (generation && inode->i_generation != generation) - ) { + if (is_bad_inode(inode) || + (generation && inode->i_generation != generation)) { /* we didn't find the right inode.. */ iput(inode); return ERR_PTR(-ESTALE); @@ -291,7 +289,6 @@ static struct dentry *ext2_get_dentry(struct super_block *sb, void *vobjp) return result; } - /* Yes, most of these are left as NULL!! * A NULL value implies the default, which works with ext2-like file * systems, but can be improved upon. @@ -825,7 +822,7 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent) if (EXT2_INODE_SIZE(sb) == 0) goto cantfind_ext2; sbi->s_inodes_per_block = sb->s_blocksize / EXT2_INODE_SIZE(sb); - if (sbi->s_inodes_per_block == 0) + if (sbi->s_inodes_per_block == 0 || sbi->s_inodes_per_group == 0) goto cantfind_ext2; sbi->s_itb_per_group = sbi->s_inodes_per_group / sbi->s_inodes_per_block; @@ -883,9 +880,6 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent) printk ("EXT2-fs: not enough memory\n"); goto failed_mount; } - percpu_counter_init(&sbi->s_freeblocks_counter); - percpu_counter_init(&sbi->s_freeinodes_counter); - percpu_counter_init(&sbi->s_dirs_counter); bgl_lock_init(&sbi->s_blockgroup_lock); sbi->s_debts = kmalloc(sbi->s_groups_count * sizeof(*sbi->s_debts), GFP_KERNEL); @@ -906,12 +900,18 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent) } if (!ext2_check_descriptors (sb)) { printk ("EXT2-fs: group descriptors corrupted!\n"); - db_count = i; goto failed_mount2; } sbi->s_gdb_count = db_count; get_random_bytes(&sbi->s_next_generation, sizeof(u32)); spin_lock_init(&sbi->s_next_gen_lock); + + percpu_counter_init(&sbi->s_freeblocks_counter, + ext2_count_free_blocks(sb)); + percpu_counter_init(&sbi->s_freeinodes_counter, + ext2_count_free_inodes(sb)); + percpu_counter_init(&sbi->s_dirs_counter, + ext2_count_dirs(sb)); /* * set up enough so that it can read an inode */ @@ -923,24 +923,18 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent) if (!sb->s_root) { iput(root); printk(KERN_ERR "EXT2-fs: get root inode failed\n"); - goto failed_mount2; + goto failed_mount3; } if (!S_ISDIR(root->i_mode) || !root->i_blocks || !root->i_size) { dput(sb->s_root); sb->s_root = NULL; printk(KERN_ERR "EXT2-fs: corrupt root inode, run e2fsck\n"); - goto failed_mount2; + goto failed_mount3; } if (EXT2_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_HAS_JOURNAL)) ext2_warning(sb, __FUNCTION__, "mounting ext3 filesystem as ext2"); ext2_setup_super (sb, es, sb->s_flags & MS_RDONLY); - percpu_counter_mod(&sbi->s_freeblocks_counter, - ext2_count_free_blocks(sb)); - percpu_counter_mod(&sbi->s_freeinodes_counter, - ext2_count_free_inodes(sb)); - percpu_counter_mod(&sbi->s_dirs_counter, - ext2_count_dirs(sb)); return 0; cantfind_ext2: @@ -948,7 +942,10 @@ cantfind_ext2: printk("VFS: Can't find an ext2 filesystem on dev %s.\n", sb->s_id); goto failed_mount; - +failed_mount3: + percpu_counter_destroy(&sbi->s_freeblocks_counter); + percpu_counter_destroy(&sbi->s_freeinodes_counter); + percpu_counter_destroy(&sbi->s_dirs_counter); failed_mount2: for (i = 0; i < db_count; i++) brelse(sbi->s_group_desc[i]); @@ -1094,8 +1091,9 @@ restore_opts: return err; } -static int ext2_statfs (struct super_block * sb, struct kstatfs * buf) +static int ext2_statfs (struct dentry * dentry, struct kstatfs * buf) { + struct super_block *sb = dentry->d_sb; struct ext2_sb_info *sbi = EXT2_SB(sb); unsigned long overhead; int i; @@ -1143,10 +1141,10 @@ static int ext2_statfs (struct super_block * sb, struct kstatfs * buf) return 0; } -static struct super_block *ext2_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int ext2_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_bdev(fs_type, flags, dev_name, data, ext2_fill_super); + return get_sb_bdev(fs_type, flags, dev_name, data, ext2_fill_super, mnt); } #ifdef CONFIG_QUOTA @@ -1211,7 +1209,7 @@ static ssize_t ext2_quota_write(struct super_block *sb, int type, struct buffer_head tmp_bh; struct buffer_head *bh; - mutex_lock(&inode->i_mutex); + mutex_lock_nested(&inode->i_mutex, I_MUTEX_QUOTA); while (towrite > 0) { tocopy = sb->s_blocksize - offset < towrite ? sb->s_blocksize - offset : towrite; diff --git a/fs/ext2/xattr.h b/fs/ext2/xattr.h index 67cfeb66e..bf8175b2c 100644 --- a/fs/ext2/xattr.h +++ b/fs/ext2/xattr.h @@ -6,7 +6,6 @@ (C) 2001 Andreas Gruenbacher, */ -#include #include #include diff --git a/fs/ext3/acl.h b/fs/ext3/acl.h index 92d50b53a..0d1e6279c 100644 --- a/fs/ext3/acl.h +++ b/fs/ext3/acl.h @@ -62,9 +62,6 @@ extern int ext3_permission (struct inode *, int, struct nameidata *); extern int ext3_acl_chmod (struct inode *); extern int ext3_init_acl (handle_t *, struct inode *, struct inode *); -extern int init_ext3_acl(void); -extern void exit_ext3_acl(void); - #else /* CONFIG_EXT3_FS_POSIX_ACL */ #include #define ext3_permission NULL diff --git a/fs/ext3/balloc.c b/fs/ext3/balloc.c index 794c389d4..537114b0e 100644 --- a/fs/ext3/balloc.c +++ b/fs/ext3/balloc.c @@ -11,7 +11,6 @@ * David S. Miller (davem@caip.rutgers.edu), 1995 */ -#include #include #include #include @@ -164,20 +163,19 @@ restart: #endif static int -goal_in_my_reservation(struct ext3_reserve_window *rsv, int goal, +goal_in_my_reservation(struct ext3_reserve_window *rsv, ext3_grpblk_t grp_goal, unsigned int group, struct super_block * sb) { - unsigned long group_first_block, group_last_block; + ext3_fsblk_t group_first_block, group_last_block; - group_first_block = le32_to_cpu(EXT3_SB(sb)->s_es->s_first_data_block) + - group * EXT3_BLOCKS_PER_GROUP(sb); - group_last_block = group_first_block + EXT3_BLOCKS_PER_GROUP(sb) - 1; + group_first_block = ext3_group_first_block_no(sb, group); + group_last_block = group_first_block + (EXT3_BLOCKS_PER_GROUP(sb) - 1); if ((rsv->_rsv_start > group_last_block) || (rsv->_rsv_end < group_first_block)) return 0; - if ((goal >= 0) && ((goal + group_first_block < rsv->_rsv_start) - || (goal + group_first_block > rsv->_rsv_end))) + if ((grp_goal >= 0) && ((grp_goal + group_first_block < rsv->_rsv_start) + || (grp_goal + group_first_block > rsv->_rsv_end))) return 0; return 1; } @@ -188,7 +186,7 @@ goal_in_my_reservation(struct ext3_reserve_window *rsv, int goal, * Returns NULL if there are no windows or if all windows start after the goal. */ static struct ext3_reserve_window_node * -search_reserve_window(struct rb_root *root, unsigned long goal) +search_reserve_window(struct rb_root *root, ext3_fsblk_t goal) { struct rb_node *n = root->rb_node; struct ext3_reserve_window_node *rsv; @@ -224,7 +222,7 @@ void ext3_rsv_window_add(struct super_block *sb, { struct rb_root *root = &EXT3_SB(sb)->s_rsv_window_root; struct rb_node *node = &rsv->rsv_node; - unsigned int start = rsv->rsv_start; + ext3_fsblk_t start = rsv->rsv_start; struct rb_node ** p = &root->rb_node; struct rb_node * parent = NULL; @@ -311,20 +309,20 @@ void ext3_discard_reservation(struct inode *inode) /* Free given blocks, update quota and i_blocks field */ void ext3_free_blocks_sb(handle_t *handle, struct super_block *sb, - unsigned long block, unsigned long count, - int *pdquot_freed_blocks) + ext3_fsblk_t block, unsigned long count, + unsigned long *pdquot_freed_blocks) { struct buffer_head *bitmap_bh = NULL; struct buffer_head *gd_bh; unsigned long block_group; - unsigned long bit; + ext3_grpblk_t bit; unsigned long i; unsigned long overflow; struct ext3_group_desc * desc; struct ext3_super_block * es; struct ext3_sb_info *sbi; int err = 0, ret; - unsigned group_freed; + ext3_grpblk_t group_freed; *pdquot_freed_blocks = 0; sbi = EXT3_SB(sb); @@ -334,7 +332,7 @@ void ext3_free_blocks_sb(handle_t *handle, struct super_block *sb, block + count > le32_to_cpu(es->s_blocks_count)) { ext3_error (sb, "ext3_free_blocks", "Freeing blocks not in datazone - " - "block = %lu, count = %lu", block, count); + "block = "E3FSBLK", count = %lu", block, count); goto error_return; } @@ -370,7 +368,7 @@ do_more: sbi->s_itb_per_group)) ext3_error (sb, "ext3_free_blocks", "Freeing blocks in system zones - " - "Block = %lu, count = %lu", + "Block = "E3FSBLK", count = %lu", block, count); /* @@ -454,7 +452,8 @@ do_more: bit + i, bitmap_bh->b_data)) { jbd_unlock_bh_state(bitmap_bh); ext3_error(sb, __FUNCTION__, - "bit already cleared for block %lu", block + i); + "bit already cleared for block "E3FSBLK, + block + i); jbd_lock_bh_state(bitmap_bh); BUFFER_TRACE(bitmap_bh, "bit already cleared"); } else { @@ -494,10 +493,10 @@ error_return: /* Free given blocks, update quota and i_blocks field */ void ext3_free_blocks(handle_t *handle, struct inode *inode, - unsigned long block, unsigned long count) + ext3_fsblk_t block, unsigned long count) { struct super_block * sb; - int dquot_freed_blocks; + unsigned long dquot_freed_blocks; sb = inode->i_sb; if (!sb) { @@ -528,7 +527,7 @@ void ext3_free_blocks(handle_t *handle, struct inode *inode, * data-writes at some point, and disable it for metadata allocations or * sync-data inodes. */ -static int ext3_test_allocatable(int nr, struct buffer_head *bh) +static int ext3_test_allocatable(ext3_grpblk_t nr, struct buffer_head *bh) { int ret; struct journal_head *jh = bh2jh(bh); @@ -545,11 +544,11 @@ static int ext3_test_allocatable(int nr, struct buffer_head *bh) return ret; } -static int -bitmap_search_next_usable_block(int start, struct buffer_head *bh, - int maxblocks) +static ext3_grpblk_t +bitmap_search_next_usable_block(ext3_grpblk_t start, struct buffer_head *bh, + ext3_grpblk_t maxblocks) { - int next; + ext3_grpblk_t next; struct journal_head *jh = bh2jh(bh); /* @@ -579,10 +578,11 @@ bitmap_search_next_usable_block(int start, struct buffer_head *bh, * the initial goal; then for a free byte somewhere in the bitmap; then * for any free bit in the bitmap. */ -static int -find_next_usable_block(int start, struct buffer_head *bh, int maxblocks) +static ext3_grpblk_t +find_next_usable_block(ext3_grpblk_t start, struct buffer_head *bh, + ext3_grpblk_t maxblocks) { - int here, next; + ext3_grpblk_t here, next; char *p, *r; if (start > 0) { @@ -594,7 +594,7 @@ find_next_usable_block(int start, struct buffer_head *bh, int maxblocks) * less than EXT3_BLOCKS_PER_GROUP. Aligning up to the * next 64-bit boundary is simple.. */ - int end_goal = (start + 63) & ~63; + ext3_grpblk_t end_goal = (start + 63) & ~63; if (end_goal > maxblocks) end_goal = maxblocks; here = ext3_find_next_zero_bit(bh->b_data, end_goal, start); @@ -631,7 +631,7 @@ find_next_usable_block(int start, struct buffer_head *bh, int maxblocks) * zero (failure). */ static inline int -claim_block(spinlock_t *lock, int block, struct buffer_head *bh) +claim_block(spinlock_t *lock, ext3_grpblk_t block, struct buffer_head *bh) { struct journal_head *jh = bh2jh(bh); int ret; @@ -654,19 +654,18 @@ claim_block(spinlock_t *lock, int block, struct buffer_head *bh) * new bitmap. In that case we must release write access to the old one via * ext3_journal_release_buffer(), else we'll run out of credits. */ -static int +static ext3_grpblk_t ext3_try_to_allocate(struct super_block *sb, handle_t *handle, int group, - struct buffer_head *bitmap_bh, int goal, + struct buffer_head *bitmap_bh, ext3_grpblk_t grp_goal, unsigned long *count, struct ext3_reserve_window *my_rsv) { - int group_first_block, start, end; + ext3_fsblk_t group_first_block; + ext3_grpblk_t start, end; unsigned long num = 0; /* we do allocation within the reservation window if we have a window */ if (my_rsv) { - group_first_block = - le32_to_cpu(EXT3_SB(sb)->s_es->s_first_data_block) + - group * EXT3_BLOCKS_PER_GROUP(sb); + group_first_block = ext3_group_first_block_no(sb, group); if (my_rsv->_rsv_start >= group_first_block) start = my_rsv->_rsv_start - group_first_block; else @@ -676,13 +675,13 @@ ext3_try_to_allocate(struct super_block *sb, handle_t *handle, int group, if (end > EXT3_BLOCKS_PER_GROUP(sb)) /* reservation window crosses group boundary */ end = EXT3_BLOCKS_PER_GROUP(sb); - if ((start <= goal) && (goal < end)) - start = goal; + if ((start <= grp_goal) && (grp_goal < end)) + start = grp_goal; else - goal = -1; + grp_goal = -1; } else { - if (goal > 0) - start = goal; + if (grp_goal > 0) + start = grp_goal; else start = 0; end = EXT3_BLOCKS_PER_GROUP(sb); @@ -691,43 +690,43 @@ ext3_try_to_allocate(struct super_block *sb, handle_t *handle, int group, BUG_ON(start > EXT3_BLOCKS_PER_GROUP(sb)); repeat: - if (goal < 0 || !ext3_test_allocatable(goal, bitmap_bh)) { - goal = find_next_usable_block(start, bitmap_bh, end); - if (goal < 0) + if (grp_goal < 0 || !ext3_test_allocatable(grp_goal, bitmap_bh)) { + grp_goal = find_next_usable_block(start, bitmap_bh, end); + if (grp_goal < 0) goto fail_access; if (!my_rsv) { int i; - for (i = 0; i < 7 && goal > start && - ext3_test_allocatable(goal - 1, + for (i = 0; i < 7 && grp_goal > start && + ext3_test_allocatable(grp_goal - 1, bitmap_bh); - i++, goal--) + i++, grp_goal--) ; } } - start = goal; + start = grp_goal; - if (!claim_block(sb_bgl_lock(EXT3_SB(sb), group), goal, bitmap_bh)) { + if (!claim_block(sb_bgl_lock(EXT3_SB(sb), group), grp_goal, bitmap_bh)) { /* * The block was allocated by another thread, or it was * allocated and then freed by another thread */ start++; - goal++; + grp_goal++; if (start >= end) goto fail_access; goto repeat; } num++; - goal++; - while (num < *count && goal < end - && ext3_test_allocatable(goal, bitmap_bh) - && claim_block(sb_bgl_lock(EXT3_SB(sb), group), goal, bitmap_bh)) { + grp_goal++; + while (num < *count && grp_goal < end + && ext3_test_allocatable(grp_goal, bitmap_bh) + && claim_block(sb_bgl_lock(EXT3_SB(sb), group), grp_goal, bitmap_bh)) { num++; - goal++; + grp_goal++; } *count = num; - return goal - num; + return grp_goal - num; fail_access: *count = num; return -1; @@ -769,12 +768,13 @@ fail_access: static int find_next_reservable_window( struct ext3_reserve_window_node *search_head, struct ext3_reserve_window_node *my_rsv, - struct super_block * sb, int start_block, - int last_block) + struct super_block * sb, + ext3_fsblk_t start_block, + ext3_fsblk_t last_block) { struct rb_node *next; struct ext3_reserve_window_node *rsv, *prev; - int cur; + ext3_fsblk_t cur; int size = my_rsv->rsv_goal_size; /* TODO: make the start of the reservation window byte-aligned */ @@ -876,10 +876,10 @@ static int find_next_reservable_window( * * @rsv: the reservation * - * @goal: The goal (group-relative). It is where the search for a + * @grp_goal: The goal (group-relative). It is where the search for a * free reservable space should start from. - * if we have a goal(goal >0 ), then start from there, - * no goal(goal = -1), we start from the first block + * if we have a grp_goal(grp_goal >0 ), then start from there, + * no grp_goal(grp_goal = -1), we start from the first block * of the group. * * @sb: the super block @@ -888,25 +888,24 @@ static int find_next_reservable_window( * */ static int alloc_new_reservation(struct ext3_reserve_window_node *my_rsv, - int goal, struct super_block *sb, + ext3_grpblk_t grp_goal, struct super_block *sb, unsigned int group, struct buffer_head *bitmap_bh) { struct ext3_reserve_window_node *search_head; - int group_first_block, group_end_block, start_block; - int first_free_block; + ext3_fsblk_t group_first_block, group_end_block, start_block; + ext3_grpblk_t first_free_block; struct rb_root *fs_rsv_root = &EXT3_SB(sb)->s_rsv_window_root; unsigned long size; int ret; spinlock_t *rsv_lock = &EXT3_SB(sb)->s_rsv_window_lock; - group_first_block = le32_to_cpu(EXT3_SB(sb)->s_es->s_first_data_block) + - group * EXT3_BLOCKS_PER_GROUP(sb); - group_end_block = group_first_block + EXT3_BLOCKS_PER_GROUP(sb) - 1; + group_first_block = ext3_group_first_block_no(sb, group); + group_end_block = group_first_block + (EXT3_BLOCKS_PER_GROUP(sb) - 1); - if (goal < 0) + if (grp_goal < 0) start_block = group_first_block; else - start_block = goal + group_first_block; + start_block = grp_goal + group_first_block; size = my_rsv->rsv_goal_size; @@ -1060,14 +1059,15 @@ static void try_to_extend_reservation(struct ext3_reserve_window_node *my_rsv, * sorted double linked list should be fast. * */ -static int +static ext3_grpblk_t ext3_try_to_allocate_with_rsv(struct super_block *sb, handle_t *handle, unsigned int group, struct buffer_head *bitmap_bh, - int goal, struct ext3_reserve_window_node * my_rsv, + ext3_grpblk_t grp_goal, + struct ext3_reserve_window_node * my_rsv, unsigned long *count, int *errp) { - unsigned long group_first_block; - int ret = 0; + ext3_fsblk_t group_first_block, group_last_block; + ext3_grpblk_t ret = 0; int fatal; unsigned long num = *count; @@ -1093,17 +1093,17 @@ ext3_try_to_allocate_with_rsv(struct super_block *sb, handle_t *handle, */ if (my_rsv == NULL ) { ret = ext3_try_to_allocate(sb, handle, group, bitmap_bh, - goal, count, NULL); + grp_goal, count, NULL); goto out; } /* - * goal is a group relative block number (if there is a goal) - * 0 < goal < EXT3_BLOCKS_PER_GROUP(sb) + * grp_goal is a group relative block number (if there is a goal) + * 0 < grp_goal < EXT3_BLOCKS_PER_GROUP(sb) * first block is a filesystem wide block number * first block is the block number of the first block in this group */ - group_first_block = le32_to_cpu(EXT3_SB(sb)->s_es->s_first_data_block) + - group * EXT3_BLOCKS_PER_GROUP(sb); + group_first_block = ext3_group_first_block_no(sb, group); + group_last_block = group_first_block + (EXT3_BLOCKS_PER_GROUP(sb) - 1); /* * Basically we will allocate a new block from inode's reservation @@ -1122,24 +1122,24 @@ ext3_try_to_allocate_with_rsv(struct super_block *sb, handle_t *handle, */ while (1) { if (rsv_is_empty(&my_rsv->rsv_window) || (ret < 0) || - !goal_in_my_reservation(&my_rsv->rsv_window, goal, group, sb)) { + !goal_in_my_reservation(&my_rsv->rsv_window, grp_goal, group, sb)) { if (my_rsv->rsv_goal_size < *count) my_rsv->rsv_goal_size = *count; - ret = alloc_new_reservation(my_rsv, goal, sb, + ret = alloc_new_reservation(my_rsv, grp_goal, sb, group, bitmap_bh); if (ret < 0) break; /* failed */ - if (!goal_in_my_reservation(&my_rsv->rsv_window, goal, group, sb)) - goal = -1; - } else if (goal > 0 && (my_rsv->rsv_end-goal+1) < *count) + if (!goal_in_my_reservation(&my_rsv->rsv_window, grp_goal, group, sb)) + grp_goal = -1; + } else if (grp_goal > 0 && (my_rsv->rsv_end-grp_goal+1) < *count) try_to_extend_reservation(my_rsv, sb, - *count-my_rsv->rsv_end + goal - 1); + *count-my_rsv->rsv_end + grp_goal - 1); - if ((my_rsv->rsv_start >= group_first_block + EXT3_BLOCKS_PER_GROUP(sb)) - || (my_rsv->rsv_end < group_first_block)) + if ((my_rsv->rsv_start > group_last_block) || + (my_rsv->rsv_end < group_first_block)) BUG(); - ret = ext3_try_to_allocate(sb, handle, group, bitmap_bh, goal, + ret = ext3_try_to_allocate(sb, handle, group, bitmap_bh, grp_goal, &num, &my_rsv->rsv_window); if (ret >= 0) { my_rsv->rsv_alloc_hit += num; @@ -1168,13 +1168,14 @@ out: static int ext3_has_free_blocks(struct super_block *sb) { struct ext3_sb_info *sbi = EXT3_SB(sb); - int free_blocks, root_blocks, cond; + ext3_fsblk_t free_blocks, root_blocks; + int cond; free_blocks = percpu_counter_read_positive(&sbi->s_freeblocks_counter); root_blocks = le32_to_cpu(sbi->s_es->s_r_blocks_count); vxdprintk(VXD_CBIT(dlim, 3), - "ext3_has_free_blocks(%p): free=%u, root=%u", + "ext3_has_free_blocks(%p): free=%lu, root=%lu", sb, free_blocks, root_blocks); DLIMIT_ADJUST_BLOCK(sb, vx_current_xid(), &free_blocks, &root_blocks); @@ -1185,7 +1186,7 @@ static int ext3_has_free_blocks(struct super_block *sb) (sbi->s_resgid == 0 || !in_group_p (sbi->s_resgid))); vxdprintk(VXD_CBIT(dlim, 3), - "ext3_has_free_blocks(%p): %u<%u+1, %c, %u!=%u r=%d", + "ext3_has_free_blocks(%p): %lu<%lu+1, %c, %u!=%u r=%d", sb, free_blocks, root_blocks, !capable(CAP_SYS_RESOURCE)?'1':'0', sbi->s_resuid, current->fsuid, cond?0:1); @@ -1217,19 +1218,20 @@ int ext3_should_retry_alloc(struct super_block *sb, int *retries) * bitmap, and then for any free bit if that fails. * This function also updates quota and i_blocks field. */ -int ext3_new_blocks(handle_t *handle, struct inode *inode, - unsigned long goal, unsigned long *count, int *errp) +ext3_fsblk_t ext3_new_blocks(handle_t *handle, struct inode *inode, + ext3_fsblk_t goal, unsigned long *count, int *errp) { struct buffer_head *bitmap_bh = NULL; struct buffer_head *gdp_bh; int group_no; int goal_group; - int ret_block; + ext3_grpblk_t grp_target_blk; /* blockgroup relative goal block */ + ext3_grpblk_t grp_alloc_blk; /* blockgroup-relative allocated block*/ + ext3_fsblk_t ret_block; /* filesyetem-wide allocated block */ int bgi; /* blockgroup iteration index */ - int target_block; int fatal = 0, err; int performed_allocation = 0; - int free_blocks; + ext3_grpblk_t free_blocks; /* number of free blocks in a group */ struct super_block *sb; struct ext3_group_desc *gdp; struct ext3_super_block *es; @@ -1288,12 +1290,12 @@ int ext3_new_blocks(handle_t *handle, struct inode *inode, goal = le32_to_cpu(es->s_first_data_block); group_no = (goal - le32_to_cpu(es->s_first_data_block)) / EXT3_BLOCKS_PER_GROUP(sb); + goal_group = group_no; +retry_alloc: gdp = ext3_get_group_desc(sb, group_no, &gdp_bh); if (!gdp) goto io_error; - goal_group = group_no; -retry: free_blocks = le16_to_cpu(gdp->bg_free_blocks_count); /* * if there is not enough free blocks to make a new resevation @@ -1304,16 +1306,17 @@ retry: my_rsv = NULL; if (free_blocks > 0) { - ret_block = ((goal - le32_to_cpu(es->s_first_data_block)) % + grp_target_blk = ((goal - le32_to_cpu(es->s_first_data_block)) % EXT3_BLOCKS_PER_GROUP(sb)); bitmap_bh = read_block_bitmap(sb, group_no); if (!bitmap_bh) goto io_error; - ret_block = ext3_try_to_allocate_with_rsv(sb, handle, group_no, - bitmap_bh, ret_block, my_rsv, &num, &fatal); + grp_alloc_blk = ext3_try_to_allocate_with_rsv(sb, handle, + group_no, bitmap_bh, grp_target_blk, + my_rsv, &num, &fatal); if (fatal) goto out; - if (ret_block >= 0) + if (grp_alloc_blk >= 0) goto allocated; } @@ -1346,11 +1349,15 @@ retry: bitmap_bh = read_block_bitmap(sb, group_no); if (!bitmap_bh) goto io_error; - ret_block = ext3_try_to_allocate_with_rsv(sb, handle, group_no, - bitmap_bh, -1, my_rsv, &num, &fatal); + /* + * try to allocate block(s) from this group, without a goal(-1). + */ + grp_alloc_blk = ext3_try_to_allocate_with_rsv(sb, handle, + group_no, bitmap_bh, -1, my_rsv, + &num, &fatal); if (fatal) goto out; - if (ret_block >= 0) + if (grp_alloc_blk >= 0) goto allocated; } /* @@ -1363,7 +1370,7 @@ retry: if (my_rsv) { my_rsv = NULL; group_no = goal_group; - goto retry; + goto retry_alloc; } /* No space left on the device */ *errp = -ENOSPC; @@ -1379,18 +1386,18 @@ allocated: if (fatal) goto out; - target_block = ret_block + group_no * EXT3_BLOCKS_PER_GROUP(sb) - + le32_to_cpu(es->s_first_data_block); + ret_block = grp_alloc_blk + ext3_group_first_block_no(sb, group_no); - if (in_range(le32_to_cpu(gdp->bg_block_bitmap), target_block, num) || - in_range(le32_to_cpu(gdp->bg_inode_bitmap), target_block, num) || - in_range(target_block, le32_to_cpu(gdp->bg_inode_table), + if (in_range(le32_to_cpu(gdp->bg_block_bitmap), ret_block, num) || + in_range(le32_to_cpu(gdp->bg_inode_bitmap), ret_block, num) || + in_range(ret_block, le32_to_cpu(gdp->bg_inode_table), EXT3_SB(sb)->s_itb_per_group) || - in_range(target_block + num - 1, le32_to_cpu(gdp->bg_inode_table), + in_range(ret_block + num - 1, le32_to_cpu(gdp->bg_inode_table), EXT3_SB(sb)->s_itb_per_group)) ext3_error(sb, "ext3_new_block", "Allocating block in system zone - " - "blocks from %u, length %lu", target_block, num); + "blocks from "E3FSBLK", length %lu", + ret_block, num); performed_allocation = 1; @@ -1399,7 +1406,7 @@ allocated: struct buffer_head *debug_bh; /* Record bitmap buffer state in the newly allocated block */ - debug_bh = sb_find_get_block(sb, target_block); + debug_bh = sb_find_get_block(sb, ret_block); if (debug_bh) { BUFFER_TRACE(debug_bh, "state when allocated"); BUFFER_TRACE2(debug_bh, bitmap_bh, "bitmap state"); @@ -1412,24 +1419,21 @@ allocated: int i; for (i = 0; i < num; i++) { - if (ext3_test_bit(ret_block, + if (ext3_test_bit(grp_alloc_blk+i, bh2jh(bitmap_bh)->b_committed_data)) { printk("%s: block was unexpectedly set in " "b_committed_data\n", __FUNCTION__); } } } - ext3_debug("found bit %d\n", ret_block); + ext3_debug("found bit %d\n", grp_alloc_blk); spin_unlock(sb_bgl_lock(sbi, group_no)); jbd_unlock_bh_state(bitmap_bh); #endif - /* ret_block was blockgroup-relative. Now it becomes fs-relative */ - ret_block = target_block; - if (ret_block + num - 1 >= le32_to_cpu(es->s_blocks_count)) { ext3_error(sb, "ext3_new_block", - "block(%d) >= blocks count(%d) - " + "block("E3FSBLK") >= blocks count(%d) - " "block_group = %d, es == %p ", ret_block, le32_to_cpu(es->s_blocks_count), group_no, es); goto out; @@ -1440,7 +1444,7 @@ allocated: * list of some description. We don't know in advance whether * the caller wants to use it as metadata or data. */ - ext3_debug("allocating block %d. Goal hits %d of %d.\n", + ext3_debug("allocating block %lu. Goal hits %d of %d.\n", ret_block, goal_hits, goal_attempts); spin_lock(sb_bgl_lock(sbi, group_no)); @@ -1483,23 +1487,24 @@ out_dlimit: return 0; } -int ext3_new_block(handle_t *handle, struct inode *inode, - unsigned long goal, int *errp) +ext3_fsblk_t ext3_new_block(handle_t *handle, struct inode *inode, + ext3_fsblk_t goal, int *errp) { unsigned long count = 1; return ext3_new_blocks(handle, inode, goal, &count, errp); } -unsigned long ext3_count_free_blocks(struct super_block *sb) +ext3_fsblk_t ext3_count_free_blocks(struct super_block *sb) { - unsigned long desc_count; + ext3_fsblk_t desc_count; struct ext3_group_desc *gdp; int i; unsigned long ngroups = EXT3_SB(sb)->s_groups_count; #ifdef EXT3FS_DEBUG struct ext3_super_block *es; - unsigned long bitmap_count, x; + ext3_fsblk_t bitmap_count; + unsigned long x; struct buffer_head *bitmap_bh = NULL; es = EXT3_SB(sb)->s_es; @@ -1524,8 +1529,10 @@ unsigned long ext3_count_free_blocks(struct super_block *sb) bitmap_count += x; } brelse(bitmap_bh); - printk("ext3_count_free_blocks: stored = %u, computed = %lu, %lu\n", - le32_to_cpu(es->s_free_blocks_count), desc_count, bitmap_count); + printk("ext3_count_free_blocks: stored = "E3FSBLK + ", computed = "E3FSBLK", "E3FSBLK"\n", + le32_to_cpu(es->s_free_blocks_count), + desc_count, bitmap_count); return bitmap_count; #else desc_count = 0; @@ -1542,7 +1549,7 @@ unsigned long ext3_count_free_blocks(struct super_block *sb) } static inline int -block_in_use(unsigned long block, struct super_block *sb, unsigned char *map) +block_in_use(ext3_fsblk_t block, struct super_block *sb, unsigned char *map) { return ext3_test_bit ((block - le32_to_cpu(EXT3_SB(sb)->s_es->s_first_data_block)) % diff --git a/fs/ext3/dir.c b/fs/ext3/dir.c index f37528ed2..f11d6ca46 100644 --- a/fs/ext3/dir.c +++ b/fs/ext3/dir.c @@ -151,6 +151,9 @@ static int ext3_readdir(struct file * filp, ext3_error (sb, "ext3_readdir", "directory #%lu contains a hole at offset %lu", inode->i_ino, (unsigned long)filp->f_pos); + /* corrupt size? Maybe no more blocks to read */ + if (filp->f_pos > inode->i_blocks << 9) + break; filp->f_pos += sb->s_blocksize - offset; continue; } @@ -284,7 +287,7 @@ static void free_rb_tree_fname(struct rb_root *root) * beginning of the loop and try to free the parent * node. */ - parent = n->rb_parent; + parent = rb_parent(n); fname = rb_entry(n, struct fname, rb_hash); while (fname) { struct fname * old = fname; diff --git a/fs/ext3/ialloc.c b/fs/ext3/ialloc.c index 17c75f53a..792f6df51 100644 --- a/fs/ext3/ialloc.c +++ b/fs/ext3/ialloc.c @@ -205,7 +205,7 @@ error_return: static int find_group_dir(struct super_block *sb, struct inode *parent) { int ngroups = EXT3_SB(sb)->s_groups_count; - int freei, avefreei; + unsigned int freei, avefreei; struct ext3_group_desc *desc, *best_desc = NULL; struct buffer_head *bh; int group, best_group = -1; @@ -264,10 +264,12 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent) struct ext3_super_block *es = sbi->s_es; int ngroups = sbi->s_groups_count; int inodes_per_group = EXT3_INODES_PER_GROUP(sb); - int freei, avefreei; - int freeb, avefreeb; - int blocks_per_dir, ndirs; - int max_debt, max_dirs, min_blocks, min_inodes; + unsigned int freei, avefreei; + ext3_fsblk_t freeb, avefreeb; + ext3_fsblk_t blocks_per_dir; + unsigned int ndirs; + int max_debt, max_dirs, min_inodes; + ext3_grpblk_t min_blocks; int group = -1, i; struct ext3_group_desc *desc; struct buffer_head *bh; @@ -310,7 +312,7 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent) min_inodes = avefreei - inodes_per_group / 4; min_blocks = avefreeb - EXT3_BLOCKS_PER_GROUP(sb) / 4; - max_debt = EXT3_BLOCKS_PER_GROUP(sb) / max(blocks_per_dir, BLOCK_COST); + max_debt = EXT3_BLOCKS_PER_GROUP(sb) / max(blocks_per_dir, (ext3_fsblk_t)BLOCK_COST); if (max_debt * INODE_COST > inodes_per_group) max_debt = inodes_per_group / INODE_COST; if (max_debt > 255) @@ -566,7 +568,6 @@ got: inode->i_ino = ino; /* This is the optimal IO size (for stat), not the fs block size */ - inode->i_blksize = PAGE_SIZE; inode->i_blocks = 0; inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC; diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c index 4ce217b6d..23d956ff0 100644 --- a/fs/ext3/inode.c +++ b/fs/ext3/inode.c @@ -63,7 +63,7 @@ static int ext3_inode_is_fast_symlink(struct inode *inode) * still needs to be revoked. */ int ext3_forget(handle_t *handle, int is_metadata, struct inode *inode, - struct buffer_head *bh, int blocknr) + struct buffer_head *bh, ext3_fsblk_t blocknr) { int err; @@ -408,13 +408,13 @@ no_block: * * Caller must make sure that @ind is valid and will stay that way. */ -static unsigned long ext3_find_near(struct inode *inode, Indirect *ind) +static ext3_fsblk_t ext3_find_near(struct inode *inode, Indirect *ind) { struct ext3_inode_info *ei = EXT3_I(inode); __le32 *start = ind->bh ? (__le32*) ind->bh->b_data : ei->i_data; __le32 *p; - unsigned long bg_start; - unsigned long colour; + ext3_fsblk_t bg_start; + ext3_grpblk_t colour; /* Try to find previous block */ for (p = ind->p - 1; p >= start; p--) { @@ -430,8 +430,7 @@ static unsigned long ext3_find_near(struct inode *inode, Indirect *ind) * It is going to be referred to from the inode itself? OK, just put it * into the same cylinder group then. */ - bg_start = (ei->i_block_group * EXT3_BLOCKS_PER_GROUP(inode->i_sb)) + - le32_to_cpu(EXT3_SB(inode->i_sb)->s_es->s_first_data_block); + bg_start = ext3_group_first_block_no(inode->i_sb, ei->i_block_group); colour = (current->pid % 16) * (EXT3_BLOCKS_PER_GROUP(inode->i_sb) / 16); return bg_start + colour; @@ -449,7 +448,7 @@ static unsigned long ext3_find_near(struct inode *inode, Indirect *ind) * stores it in *@goal and returns zero. */ -static unsigned long ext3_find_goal(struct inode *inode, long block, +static ext3_fsblk_t ext3_find_goal(struct inode *inode, long block, Indirect chain[4], Indirect *partial) { struct ext3_block_alloc_info *block_i; @@ -517,13 +516,13 @@ static int ext3_blks_to_allocate(Indirect *branch, int k, unsigned long blks, * direct blocks */ static int ext3_alloc_blocks(handle_t *handle, struct inode *inode, - unsigned long goal, int indirect_blks, int blks, - unsigned long long new_blocks[4], int *err) + ext3_fsblk_t goal, int indirect_blks, int blks, + ext3_fsblk_t new_blocks[4], int *err) { int target, i; unsigned long count = 0; int index = 0; - unsigned long current_block = 0; + ext3_fsblk_t current_block = 0; int ret = 0; /* @@ -593,7 +592,7 @@ failed_out: * as described above and return 0. */ static int ext3_alloc_branch(handle_t *handle, struct inode *inode, - int indirect_blks, int *blks, unsigned long goal, + int indirect_blks, int *blks, ext3_fsblk_t goal, int *offsets, Indirect *branch) { int blocksize = inode->i_sb->s_blocksize; @@ -601,8 +600,8 @@ static int ext3_alloc_branch(handle_t *handle, struct inode *inode, int err = 0; struct buffer_head *bh; int num; - unsigned long long new_blocks[4]; - unsigned long long current_block; + ext3_fsblk_t new_blocks[4]; + ext3_fsblk_t current_block; num = ext3_alloc_blocks(handle, inode, goal, indirect_blks, *blks, new_blocks, &err); @@ -689,7 +688,7 @@ static int ext3_splice_branch(handle_t *handle, struct inode *inode, int i; int err = 0; struct ext3_block_alloc_info *block_i; - unsigned long current_block; + ext3_fsblk_t current_block; block_i = EXT3_I(inode)->i_block_alloc_info; /* @@ -796,13 +795,13 @@ int ext3_get_blocks_handle(handle_t *handle, struct inode *inode, int offsets[4]; Indirect chain[4]; Indirect *partial; - unsigned long goal; + ext3_fsblk_t goal; int indirect_blks; int blocks_to_boundary = 0; int depth; struct ext3_inode_info *ei = EXT3_I(inode); int count = 0; - unsigned long first_block = 0; + ext3_fsblk_t first_block = 0; J_ASSERT(handle != NULL || create == 0); @@ -820,7 +819,7 @@ int ext3_get_blocks_handle(handle_t *handle, struct inode *inode, count++; /*map more blocks*/ while (count < maxblocks && count <= blocks_to_boundary) { - unsigned long blk; + ext3_fsblk_t blk; if (!verify_chain(chain, partial)) { /* @@ -927,7 +926,7 @@ int ext3_get_blocks_handle(handle_t *handle, struct inode *inode, set_buffer_new(bh_result); got_it: map_bh(bh_result, inode->i_sb, le32_to_cpu(chain[depth-1].key)); - if (blocks_to_boundary == 0) + if (count > blocks_to_boundary) set_buffer_boundary(bh_result); err = count; /* Clean up and exit */ @@ -1011,11 +1010,14 @@ struct buffer_head *ext3_getblk(handle_t *handle, struct inode *inode, buffer_trace_init(&dummy.b_history); err = ext3_get_blocks_handle(handle, inode, block, 1, &dummy, create, 1); - if (err == 1) { + /* + * ext3_get_blocks_handle() returns number of blocks + * mapped. 0 in case of a HOLE. + */ + if (err > 0) { + if (err > 1) + WARN_ON(1); err = 0; - } else if (err >= 0) { - WARN_ON(1); - err = -EIO; } *errp = err; if (!err && buffer_mapped(&dummy)) { @@ -1529,12 +1531,12 @@ static int ext3_journalled_writepage(struct page *page, goto no_write; } - if (!page_has_buffers(page) || PageChecked(page)) { + if (!page_has_buffers(page) || PageFsMisc(page)) { /* * It's mmapped pagecache. Add buffers and journal it. There * doesn't seem much point in redirtying the page here. */ - ClearPageChecked(page); + ClearPageFsMisc(page); ret = block_prepare_write(page, 0, PAGE_CACHE_SIZE, ext3_get_block); if (ret != 0) { @@ -1591,7 +1593,7 @@ static void ext3_invalidatepage(struct page *page, unsigned long offset) * If it's a full truncate we just forget about the pending dirtying */ if (offset == 0) - ClearPageChecked(page); + ClearPageFsMisc(page); journal_invalidatepage(journal, page, offset); } @@ -1600,7 +1602,7 @@ static int ext3_releasepage(struct page *page, gfp_t wait) { journal_t *journal = EXT3_JOURNAL(page->mapping->host); - WARN_ON(PageChecked(page)); + WARN_ON(PageFsMisc(page)); if (!page_has_buffers(page)) return 0; return journal_try_to_free_buffers(journal, page, wait); @@ -1696,11 +1698,11 @@ out: */ static int ext3_journalled_set_page_dirty(struct page *page) { - SetPageChecked(page); + SetPageFsMisc(page); return __set_page_dirty_nobuffers(page); } -static struct address_space_operations ext3_ordered_aops = { +static const struct address_space_operations ext3_ordered_aops = { .readpage = ext3_readpage, .readpages = ext3_readpages, .writepage = ext3_ordered_writepage, @@ -1714,7 +1716,7 @@ static struct address_space_operations ext3_ordered_aops = { .migratepage = buffer_migrate_page, }; -static struct address_space_operations ext3_writeback_aops = { +static const struct address_space_operations ext3_writeback_aops = { .readpage = ext3_readpage, .readpages = ext3_readpages, .writepage = ext3_writeback_writepage, @@ -1728,7 +1730,7 @@ static struct address_space_operations ext3_writeback_aops = { .migratepage = buffer_migrate_page, }; -static struct address_space_operations ext3_journalled_aops = { +static const struct address_space_operations ext3_journalled_aops = { .readpage = ext3_readpage, .readpages = ext3_readpages, .writepage = ext3_journalled_writepage, @@ -1760,7 +1762,7 @@ void ext3_set_aops(struct inode *inode) static int ext3_block_truncate_page(handle_t *handle, struct page *page, struct address_space *mapping, loff_t from) { - unsigned long index = from >> PAGE_CACHE_SHIFT; + ext3_fsblk_t index = from >> PAGE_CACHE_SHIFT; unsigned offset = from & (PAGE_CACHE_SIZE-1); unsigned blocksize, iblock, length, pos; struct inode *inode = mapping->host; @@ -1961,7 +1963,7 @@ no_top: * than `count' because there can be holes in there. */ static void ext3_clear_blocks(handle_t *handle, struct inode *inode, - struct buffer_head *bh, unsigned long block_to_free, + struct buffer_head *bh, ext3_fsblk_t block_to_free, unsigned long count, __le32 *first, __le32 *last) { __le32 *p; @@ -2023,12 +2025,12 @@ static void ext3_free_data(handle_t *handle, struct inode *inode, struct buffer_head *this_bh, __le32 *first, __le32 *last) { - unsigned long block_to_free = 0; /* Starting block # of a run */ + ext3_fsblk_t block_to_free = 0; /* Starting block # of a run */ unsigned long count = 0; /* Number of blocks in the run */ __le32 *block_to_free_p = NULL; /* Pointer into inode/ind corresponding to block_to_free */ - unsigned long nr; /* Current block # */ + ext3_fsblk_t nr; /* Current block # */ __le32 *p; /* Pointer into inode/ind for current block */ int err; @@ -2090,7 +2092,7 @@ static void ext3_free_branches(handle_t *handle, struct inode *inode, struct buffer_head *parent_bh, __le32 *first, __le32 *last, int depth) { - unsigned long nr; + ext3_fsblk_t nr; __le32 *p; if (is_handle_aborted(handle)) @@ -2114,7 +2116,7 @@ static void ext3_free_branches(handle_t *handle, struct inode *inode, */ if (!bh) { ext3_error(inode->i_sb, "ext3_free_branches", - "Read failure, inode=%ld, block=%ld", + "Read failure, inode=%lu, block="E3FSBLK, inode->i_ino, nr); continue; } @@ -2244,7 +2246,7 @@ void ext3_truncate(struct inode *inode) return; if (ext3_inode_is_fast_symlink(inode)) return; - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) + if (IS_APPEND(inode) || IS_IXORUNLINK(inode)) return; /* @@ -2395,11 +2397,12 @@ out_stop: ext3_journal_stop(handle); } -static unsigned long ext3_get_inode_block(struct super_block *sb, +static ext3_fsblk_t ext3_get_inode_block(struct super_block *sb, unsigned long ino, struct ext3_iloc *iloc) { unsigned long desc, group_desc, block_group; - unsigned long offset, block; + unsigned long offset; + ext3_fsblk_t block; struct buffer_head *bh; struct ext3_group_desc * gdp; @@ -2450,7 +2453,7 @@ static unsigned long ext3_get_inode_block(struct super_block *sb, static int __ext3_get_inode_loc(struct inode *inode, struct ext3_iloc *iloc, int in_mem) { - unsigned long block; + ext3_fsblk_t block; struct buffer_head *bh; block = ext3_get_inode_block(inode->i_sb, inode->i_ino, iloc); @@ -2461,7 +2464,8 @@ static int __ext3_get_inode_loc(struct inode *inode, if (!bh) { ext3_error (inode->i_sb, "ext3_get_inode_loc", "unable to read inode block - " - "inode=%lu, block=%lu", inode->i_ino, block); + "inode=%lu, block="E3FSBLK, + inode->i_ino, block); return -EIO; } if (!buffer_uptodate(bh)) { @@ -2542,7 +2546,7 @@ make_io: if (!buffer_uptodate(bh)) { ext3_error(inode->i_sb, "ext3_get_inode_loc", "unable to read inode block - " - "inode=%lu, block=%lu", + "inode=%lu, block="E3FSBLK, inode->i_ino, block); brelse(bh); return -EIO; @@ -2694,9 +2698,6 @@ void ext3_read_inode(struct inode * inode) * recovery code: that's fine, we're about to complete * the process of deleting those. */ } - inode->i_blksize = PAGE_SIZE; /* This is the optimal IO size - * (for stat), not the fs block - * size */ inode->i_blocks = le32_to_cpu(raw_inode->i_blocks); ei->i_flags = le32_to_cpu(raw_inode->i_flags); #ifdef EXT3_FRAGMENTS diff --git a/fs/ext3/ioctl.c b/fs/ext3/ioctl.c index c5e3ff45a..5f374c33a 100644 --- a/fs/ext3/ioctl.c +++ b/fs/ext3/ioctl.c @@ -211,7 +211,7 @@ flags_err: return 0; } case EXT3_IOC_GROUP_EXTEND: { - unsigned long n_blocks_count; + ext3_fsblk_t n_blocks_count; struct super_block *sb = inode->i_sb; int err; diff --git a/fs/ext3/namei.c b/fs/ext3/namei.c index 045f58812..38e74158e 100644 --- a/fs/ext3/namei.c +++ b/fs/ext3/namei.c @@ -552,6 +552,15 @@ static int htree_dirblock_to_tree(struct file *dir_file, dir->i_sb->s_blocksize - EXT3_DIR_REC_LEN(0)); for (; de < top; de = ext3_next_entry(de)) { + if (!ext3_check_dir_entry("htree_dirblock_to_tree", dir, de, bh, + (block<i_sb)) + +((char *)de - bh->b_data))) { + /* On error, skip the f_pos to the next block. */ + dir_file->f_pos = (dir_file->f_pos | + (dir->i_sb->s_blocksize - 1)) + 1; + brelse (bh); + return count; + } ext3fs_dirhash(de->name, de->name_len, hinfo); if ((hinfo->hash < start_hash) || ((hinfo->hash == start_hash) && @@ -1392,7 +1401,6 @@ static int ext3_add_entry (handle_t *handle, struct dentry *dentry, int dx_fallback=0; #endif unsigned blocksize; - unsigned nlen, rlen; u32 block, blocks; sb = dir->i_sb; @@ -1430,8 +1438,7 @@ static int ext3_add_entry (handle_t *handle, struct dentry *dentry, return retval; de = (struct ext3_dir_entry_2 *) bh->b_data; de->inode = 0; - de->rec_len = cpu_to_le16(rlen = blocksize); - nlen = 0; + de->rec_len = cpu_to_le16(blocksize); return add_dirent_to_buf(handle, dentry, inode, de, bh); } @@ -1923,8 +1930,8 @@ int ext3_orphan_add(handle_t *handle, struct inode *inode) if (!err) list_add(&EXT3_I(inode)->i_orphan, &EXT3_SB(sb)->s_orphan); - jbd_debug(4, "superblock will point to %ld\n", inode->i_ino); - jbd_debug(4, "orphan inode %ld will point to %d\n", + jbd_debug(4, "superblock will point to %lu\n", inode->i_ino); + jbd_debug(4, "orphan inode %lu will point to %d\n", inode->i_ino, NEXT_ORPHAN(inode)); out_unlock: unlock_super(sb); diff --git a/fs/ext3/resize.c b/fs/ext3/resize.c index 34b39e9a1..11ea0f854 100644 --- a/fs/ext3/resize.c +++ b/fs/ext3/resize.c @@ -8,7 +8,6 @@ * This could probably be made into a module, because it is not often in use. */ -#include #define EXT3FS_DEBUG @@ -28,16 +27,16 @@ static int verify_group_input(struct super_block *sb, { struct ext3_sb_info *sbi = EXT3_SB(sb); struct ext3_super_block *es = sbi->s_es; - unsigned start = le32_to_cpu(es->s_blocks_count); - unsigned end = start + input->blocks_count; + ext3_fsblk_t start = le32_to_cpu(es->s_blocks_count); + ext3_fsblk_t end = start + input->blocks_count; unsigned group = input->group; - unsigned itend = input->inode_table + sbi->s_itb_per_group; + ext3_fsblk_t itend = input->inode_table + sbi->s_itb_per_group; unsigned overhead = ext3_bg_has_super(sb, group) ? (1 + ext3_bg_num_gdb(sb, group) + le16_to_cpu(es->s_reserved_gdt_blocks)) : 0; - unsigned metaend = start + overhead; + ext3_fsblk_t metaend = start + overhead; struct buffer_head *bh = NULL; - int free_blocks_count; + ext3_grpblk_t free_blocks_count; int err = -EINVAL; input->free_blocks_count = free_blocks_count = @@ -64,7 +63,8 @@ static int verify_group_input(struct super_block *sb, ext3_warning(sb, __FUNCTION__, "Bad blocks count %u", input->blocks_count); else if (!(bh = sb_bread(sb, end - 1))) - ext3_warning(sb, __FUNCTION__, "Cannot read last block (%u)", + ext3_warning(sb, __FUNCTION__, + "Cannot read last block ("E3FSBLK")", end - 1); else if (outside(input->block_bitmap, start, end)) ext3_warning(sb, __FUNCTION__, @@ -77,7 +77,7 @@ static int verify_group_input(struct super_block *sb, else if (outside(input->inode_table, start, end) || outside(itend - 1, start, end)) ext3_warning(sb, __FUNCTION__, - "Inode table not in group (blocks %u-%u)", + "Inode table not in group (blocks %u-"E3FSBLK")", input->inode_table, itend - 1); else if (input->inode_bitmap == input->block_bitmap) ext3_warning(sb, __FUNCTION__, @@ -85,24 +85,27 @@ static int verify_group_input(struct super_block *sb, input->block_bitmap); else if (inside(input->block_bitmap, input->inode_table, itend)) ext3_warning(sb, __FUNCTION__, - "Block bitmap (%u) in inode table (%u-%u)", + "Block bitmap (%u) in inode table (%u-"E3FSBLK")", input->block_bitmap, input->inode_table, itend-1); else if (inside(input->inode_bitmap, input->inode_table, itend)) ext3_warning(sb, __FUNCTION__, - "Inode bitmap (%u) in inode table (%u-%u)", + "Inode bitmap (%u) in inode table (%u-"E3FSBLK")", input->inode_bitmap, input->inode_table, itend-1); else if (inside(input->block_bitmap, start, metaend)) ext3_warning(sb, __FUNCTION__, - "Block bitmap (%u) in GDT table (%u-%u)", + "Block bitmap (%u) in GDT table" + " ("E3FSBLK"-"E3FSBLK")", input->block_bitmap, start, metaend - 1); else if (inside(input->inode_bitmap, start, metaend)) ext3_warning(sb, __FUNCTION__, - "Inode bitmap (%u) in GDT table (%u-%u)", + "Inode bitmap (%u) in GDT table" + " ("E3FSBLK"-"E3FSBLK")", input->inode_bitmap, start, metaend - 1); else if (inside(input->inode_table, start, metaend) || inside(itend - 1, start, metaend)) ext3_warning(sb, __FUNCTION__, - "Inode table (%u-%u) overlaps GDT table (%u-%u)", + "Inode table (%u-"E3FSBLK") overlaps" + "GDT table ("E3FSBLK"-"E3FSBLK")", input->inode_table, itend - 1, start, metaend - 1); else err = 0; @@ -112,7 +115,7 @@ static int verify_group_input(struct super_block *sb, } static struct buffer_head *bclean(handle_t *handle, struct super_block *sb, - unsigned long blk) + ext3_fsblk_t blk) { struct buffer_head *bh; int err; @@ -163,15 +166,14 @@ static int setup_new_group_blocks(struct super_block *sb, struct ext3_new_group_data *input) { struct ext3_sb_info *sbi = EXT3_SB(sb); - unsigned long start = input->group * sbi->s_blocks_per_group + - le32_to_cpu(sbi->s_es->s_first_data_block); + ext3_fsblk_t start = ext3_group_first_block_no(sb, input->group); int reserved_gdb = ext3_bg_has_super(sb, input->group) ? le16_to_cpu(sbi->s_es->s_reserved_gdt_blocks) : 0; unsigned long gdblocks = ext3_bg_num_gdb(sb, input->group); struct buffer_head *bh; handle_t *handle; - unsigned long block; - int bit; + ext3_fsblk_t block; + ext3_grpblk_t bit; int i; int err = 0, err2; @@ -328,7 +330,7 @@ static unsigned ext3_list_backups(struct super_block *sb, unsigned *three, static int verify_reserved_gdb(struct super_block *sb, struct buffer_head *primary) { - const unsigned long blk = primary->b_blocknr; + const ext3_fsblk_t blk = primary->b_blocknr; const unsigned long end = EXT3_SB(sb)->s_groups_count; unsigned three = 1; unsigned five = 5; @@ -340,7 +342,8 @@ static int verify_reserved_gdb(struct super_block *sb, while ((grp = ext3_list_backups(sb, &three, &five, &seven)) < end) { if (le32_to_cpu(*p++) != grp * EXT3_BLOCKS_PER_GROUP(sb) + blk){ ext3_warning(sb, __FUNCTION__, - "reserved GDT %ld missing grp %d (%ld)", + "reserved GDT "E3FSBLK + " missing grp %d ("E3FSBLK")", blk, grp, grp * EXT3_BLOCKS_PER_GROUP(sb) + blk); return -EINVAL; @@ -372,7 +375,7 @@ static int add_new_gdb(handle_t *handle, struct inode *inode, struct super_block *sb = inode->i_sb; struct ext3_super_block *es = EXT3_SB(sb)->s_es; unsigned long gdb_num = input->group / EXT3_DESC_PER_BLOCK(sb); - unsigned long gdblock = EXT3_SB(sb)->s_sbh->b_blocknr + 1 + gdb_num; + ext3_fsblk_t gdblock = EXT3_SB(sb)->s_sbh->b_blocknr + 1 + gdb_num; struct buffer_head **o_group_desc, **n_group_desc; struct buffer_head *dind; int gdbackups; @@ -417,7 +420,7 @@ static int add_new_gdb(handle_t *handle, struct inode *inode, data = (__u32 *)dind->b_data; if (le32_to_cpu(data[gdb_num % EXT3_ADDR_PER_BLOCK(sb)]) != gdblock) { ext3_warning(sb, __FUNCTION__, - "new group %u GDT block %lu not reserved", + "new group %u GDT block "E3FSBLK" not reserved", input->group, gdblock); err = -EINVAL; goto exit_dind; @@ -515,7 +518,7 @@ static int reserve_backup_gdb(handle_t *handle, struct inode *inode, struct buffer_head **primary; struct buffer_head *dind; struct ext3_iloc iloc; - unsigned long blk; + ext3_fsblk_t blk; __u32 *data, *end; int gdbackups = 0; int res, i; @@ -540,7 +543,8 @@ static int reserve_backup_gdb(handle_t *handle, struct inode *inode, for (res = 0; res < reserved_gdb; res++, blk++) { if (le32_to_cpu(*data) != blk) { ext3_warning(sb, __FUNCTION__, - "reserved block %lu not at offset %ld", + "reserved block "E3FSBLK + " not at offset %ld", blk, (long)(data - (__u32 *)dind->b_data)); err = -EINVAL; goto exit_bh; @@ -726,6 +730,18 @@ int ext3_group_add(struct super_block *sb, struct ext3_new_group_data *input) return -EPERM; } + if (le32_to_cpu(es->s_blocks_count) + input->blocks_count < + le32_to_cpu(es->s_blocks_count)) { + ext3_warning(sb, __FUNCTION__, "blocks_count overflow\n"); + return -EINVAL; + } + + if (le32_to_cpu(es->s_inodes_count) + EXT3_INODES_PER_GROUP(sb) < + le32_to_cpu(es->s_inodes_count)) { + ext3_warning(sb, __FUNCTION__, "inodes_count overflow\n"); + return -EINVAL; + } + if (reserved_gdb || gdb_off == 0) { if (!EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_RESIZE_INODE)){ @@ -902,15 +918,16 @@ exit_put: * GDT blocks are reserved to grow to the desired size. */ int ext3_group_extend(struct super_block *sb, struct ext3_super_block *es, - unsigned long n_blocks_count) + ext3_fsblk_t n_blocks_count) { - unsigned long o_blocks_count; + ext3_fsblk_t o_blocks_count; unsigned long o_groups_count; - unsigned long last; - int add; + ext3_grpblk_t last; + ext3_grpblk_t add; struct buffer_head * bh; handle_t *handle; - int err, freed_blocks; + int err; + unsigned long freed_blocks; /* We don't need to worry about locking wrt other resizers just * yet: we're going to revalidate es->s_blocks_count after @@ -919,12 +936,22 @@ int ext3_group_extend(struct super_block *sb, struct ext3_super_block *es, o_groups_count = EXT3_SB(sb)->s_groups_count; if (test_opt(sb, DEBUG)) - printk(KERN_DEBUG "EXT3-fs: extending last group from %lu to %lu blocks\n", + printk(KERN_DEBUG "EXT3-fs: extending last group from "E3FSBLK" uto "E3FSBLK" blocks\n", o_blocks_count, n_blocks_count); if (n_blocks_count == 0 || n_blocks_count == o_blocks_count) return 0; + if (n_blocks_count > (sector_t)(~0ULL) >> (sb->s_blocksize_bits - 9)) { + printk(KERN_ERR "EXT3-fs: filesystem on %s:" + " too large to resize to %lu blocks safely\n", + sb->s_id, n_blocks_count); + if (sizeof(sector_t) < 8) + ext3_warning(sb, __FUNCTION__, + "CONFIG_LBD not enabled\n"); + return -EINVAL; + } + if (n_blocks_count < o_blocks_count) { ext3_warning(sb, __FUNCTION__, "can't shrink FS - resize aborted"); @@ -943,12 +970,18 @@ int ext3_group_extend(struct super_block *sb, struct ext3_super_block *es, add = EXT3_BLOCKS_PER_GROUP(sb) - last; + if (o_blocks_count + add < o_blocks_count) { + ext3_warning(sb, __FUNCTION__, "blocks_count overflow"); + return -EINVAL; + } + if (o_blocks_count + add > n_blocks_count) add = n_blocks_count - o_blocks_count; if (o_blocks_count + add < n_blocks_count) ext3_warning(sb, __FUNCTION__, - "will only finish group (%lu blocks, %u new)", + "will only finish group ("E3FSBLK + " blocks, %u new)", o_blocks_count + add, add); /* See if the device is actually as big as what was requested */ @@ -991,10 +1024,10 @@ int ext3_group_extend(struct super_block *sb, struct ext3_super_block *es, ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh); sb->s_dirt = 1; unlock_super(sb); - ext3_debug("freeing blocks %ld through %ld\n", o_blocks_count, + ext3_debug("freeing blocks %lu through "E3FSBLK"\n", o_blocks_count, o_blocks_count + add); ext3_free_blocks_sb(handle, sb, o_blocks_count, add, &freed_blocks); - ext3_debug("freed blocks %ld through %ld\n", o_blocks_count, + ext3_debug("freed blocks "E3FSBLK" through "E3FSBLK"\n", o_blocks_count, o_blocks_count + add); if ((err = ext3_journal_stop(handle))) goto exit_put; diff --git a/fs/ext3/super.c b/fs/ext3/super.c index ed22106c9..26425a5f1 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c @@ -16,7 +16,6 @@ * David S. Miller (davem@caip.rutgers.edu), 1995 */ -#include #include #include #include @@ -46,7 +45,7 @@ static int ext3_load_journal(struct super_block *, struct ext3_super_block *, unsigned long journal_devnum); static int ext3_create_journal(struct super_block *, struct ext3_super_block *, - int); + unsigned int); static void ext3_commit_super (struct super_block * sb, struct ext3_super_block * es, int sync); @@ -58,7 +57,7 @@ static int ext3_sync_fs(struct super_block *sb, int wait); static const char *ext3_decode_error(struct super_block * sb, int errno, char nbuf[16]); static int ext3_remount (struct super_block * sb, int * flags, char * data); -static int ext3_statfs (struct super_block * sb, struct kstatfs * buf); +static int ext3_statfs (struct dentry * dentry, struct kstatfs * buf); static void ext3_unlockfs(struct super_block *sb); static void ext3_write_super (struct super_block * sb); static void ext3_write_super_lockfs(struct super_block *sb); @@ -377,7 +376,7 @@ static void dump_orphan_list(struct super_block *sb, struct ext3_sb_info *sbi) list_for_each(l, &sbi->s_orphan) { struct inode *inode = orphan_list_entry(l); printk(KERN_ERR " " - "inode %s:%ld at %p: mode %o, nlink %d, next %d\n", + "inode %s:%lu at %p: mode %o, nlink %d, next %d\n", inode->i_sb->s_id, inode->i_ino, inode, inode->i_mode, inode->i_nlink, NEXT_ORPHAN(inode)); @@ -499,20 +498,21 @@ static void ext3_clear_inode(struct inode *inode) { struct ext3_block_alloc_info *rsv = EXT3_I(inode)->i_block_alloc_info; #ifdef CONFIG_EXT3_FS_POSIX_ACL - if (EXT3_I(inode)->i_acl && - EXT3_I(inode)->i_acl != EXT3_ACL_NOT_CACHED) { - posix_acl_release(EXT3_I(inode)->i_acl); - EXT3_I(inode)->i_acl = EXT3_ACL_NOT_CACHED; - } - if (EXT3_I(inode)->i_default_acl && - EXT3_I(inode)->i_default_acl != EXT3_ACL_NOT_CACHED) { - posix_acl_release(EXT3_I(inode)->i_default_acl); - EXT3_I(inode)->i_default_acl = EXT3_ACL_NOT_CACHED; - } + if (EXT3_I(inode)->i_acl && + EXT3_I(inode)->i_acl != EXT3_ACL_NOT_CACHED) { + posix_acl_release(EXT3_I(inode)->i_acl); + EXT3_I(inode)->i_acl = EXT3_ACL_NOT_CACHED; + } + if (EXT3_I(inode)->i_default_acl && + EXT3_I(inode)->i_default_acl != EXT3_ACL_NOT_CACHED) { + posix_acl_release(EXT3_I(inode)->i_default_acl); + EXT3_I(inode)->i_default_acl = EXT3_ACL_NOT_CACHED; + } #endif ext3_discard_reservation(inode); EXT3_I(inode)->i_block_alloc_info = NULL; - kfree(rsv); + if (unlikely(rsv)) + kfree(rsv); } static inline void ext3_show_quota_options(struct seq_file *seq, struct super_block *sb) @@ -554,6 +554,47 @@ static int ext3_show_options(struct seq_file *seq, struct vfsmount *vfs) return 0; } + +static struct dentry *ext3_get_dentry(struct super_block *sb, void *vobjp) +{ + __u32 *objp = vobjp; + unsigned long ino = objp[0]; + __u32 generation = objp[1]; + struct inode *inode; + struct dentry *result; + + if (ino < EXT3_FIRST_INO(sb) && ino != EXT3_ROOT_INO) + return ERR_PTR(-ESTALE); + if (ino > le32_to_cpu(EXT3_SB(sb)->s_es->s_inodes_count)) + return ERR_PTR(-ESTALE); + + /* iget isn't really right if the inode is currently unallocated!! + * + * ext3_read_inode will return a bad_inode if the inode had been + * deleted, so we should be safe. + * + * Currently we don't know the generation for parent directory, so + * a generation of 0 means "accept any" + */ + inode = iget(sb, ino); + if (inode == NULL) + return ERR_PTR(-ENOMEM); + if (is_bad_inode(inode) || + (generation && inode->i_generation != generation)) { + iput(inode); + return ERR_PTR(-ESTALE); + } + /* now to find a dentry. + * If possible, get a well-connected one + */ + result = d_alloc_anon(inode); + if (!result) { + iput(inode); + return ERR_PTR(-ENOMEM); + } + return result; +} + #ifdef CONFIG_QUOTA #define QTYPE2NAME(t) ((t)==USRQUOTA?"user":"group") #define QTYPE2MOPT(on, t) ((t)==USRQUOTA?((on)##USRJQUOTA):((on)##GRPJQUOTA)) @@ -620,45 +661,6 @@ static struct super_operations ext3_sops = { #endif }; -static struct dentry *ext3_get_dentry(struct super_block *sb, void *vobjp) -{ - __u32 *objp = vobjp; - unsigned long ino = objp[0]; - __u32 generation = objp[1]; - struct inode *inode; - struct dentry *result; - - if (ino != EXT3_ROOT_INO && ino < EXT3_FIRST_INO(sb)) - return ERR_PTR(-ESTALE); - if (ino > le32_to_cpu(EXT3_SB(sb)->s_es->s_inodes_count)) - return ERR_PTR(-ESTALE); - - /* iget isn't really right if the inode is currently unallocated!! - * ext3_read_inode currently does appropriate checks, but - * it might be "neater" to call ext3_get_inode first and check - * if the inode is valid..... - */ - inode = iget(sb, ino); - if (inode == NULL) - return ERR_PTR(-ENOMEM); - if (is_bad_inode(inode) - || (generation && inode->i_generation != generation) - ) { - /* we didn't find the right inode.. */ - iput(inode); - return ERR_PTR(-ESTALE); - } - /* now to find a dentry. - * If possible, get a well-connected one - */ - result = d_alloc_anon(inode); - if (!result) { - iput(inode); - return ERR_PTR(-ENOMEM); - } - return result; -} - static struct export_operations ext3_export_ops = { .get_parent = ext3_get_parent, .get_dentry = ext3_get_dentry, @@ -669,7 +671,7 @@ enum { Opt_resgid, Opt_resuid, Opt_sb, Opt_err_cont, Opt_err_panic, Opt_err_ro, Opt_nouid32, Opt_nocheck, Opt_debug, Opt_oldalloc, Opt_orlov, Opt_user_xattr, Opt_nouser_xattr, Opt_acl, Opt_noacl, - Opt_reservation, Opt_noreservation, Opt_noload, Opt_nobh, + Opt_reservation, Opt_noreservation, Opt_noload, Opt_nobh, Opt_bh, Opt_commit, Opt_journal_update, Opt_journal_inum, Opt_journal_dev, Opt_abort, Opt_data_journal, Opt_data_ordered, Opt_data_writeback, Opt_usrjquota, Opt_grpjquota, Opt_offusrjquota, Opt_offgrpjquota, @@ -705,6 +707,7 @@ static match_table_t tokens = { {Opt_noreservation, "noreservation"}, {Opt_noload, "noload"}, {Opt_nobh, "nobh"}, + {Opt_bh, "bh"}, {Opt_commit, "commit=%u"}, {Opt_journal_update, "journal=update"}, {Opt_journal_inum, "journal=%u"}, @@ -729,14 +732,15 @@ static match_table_t tokens = { {Opt_resize, "resize"}, }; -static unsigned long get_sb_block(void **data) +static ext3_fsblk_t get_sb_block(void **data) { - unsigned long sb_block; + ext3_fsblk_t sb_block; char *options = (char *) *data; if (!options || strncmp(options, "sb=", 3) != 0) return 1; /* Default location */ options += 3; + /*todo: use simple_strtoll with >32bit ext3 */ sb_block = simple_strtoul(options, &options, 0); if (*options && *options != ',') { printk("EXT3-fs: Invalid sb specification: %s\n", @@ -750,8 +754,8 @@ static unsigned long get_sb_block(void **data) } static int parse_options (char *options, struct super_block *sb, - unsigned long *inum, unsigned long *journal_devnum, - unsigned long *n_blocks_count, int is_remount) + unsigned int *inum, unsigned long *journal_devnum, + ext3_fsblk_t *n_blocks_count, int is_remount) { struct ext3_sb_info *sbi = EXT3_SB(sb); char * p; @@ -1058,6 +1062,9 @@ clear_qf_name: case Opt_nobh: set_opt(sbi->s_mount_opt, NOBH); break; + case Opt_bh: + clear_opt(sbi->s_mount_opt, NOBH); + break; default: printk (KERN_ERR "EXT3-fs: Unrecognized mount option \"%s\" " @@ -1173,7 +1180,8 @@ static int ext3_setup_super(struct super_block *sb, struct ext3_super_block *es, static int ext3_check_descriptors (struct super_block * sb) { struct ext3_sb_info *sbi = EXT3_SB(sb); - unsigned long block = le32_to_cpu(sbi->s_es->s_first_data_block); + ext3_fsblk_t first_block = le32_to_cpu(sbi->s_es->s_first_data_block); + ext3_fsblk_t last_block; struct ext3_group_desc * gdp = NULL; int desc_block = 0; int i; @@ -1182,12 +1190,17 @@ static int ext3_check_descriptors (struct super_block * sb) for (i = 0; i < sbi->s_groups_count; i++) { + if (i == sbi->s_groups_count - 1) + last_block = le32_to_cpu(sbi->s_es->s_blocks_count) - 1; + else + last_block = first_block + + (EXT3_BLOCKS_PER_GROUP(sb) - 1); + if ((i % EXT3_DESC_PER_BLOCK(sb)) == 0) gdp = (struct ext3_group_desc *) sbi->s_group_desc[desc_block++]->b_data; - if (le32_to_cpu(gdp->bg_block_bitmap) < block || - le32_to_cpu(gdp->bg_block_bitmap) >= - block + EXT3_BLOCKS_PER_GROUP(sb)) + if (le32_to_cpu(gdp->bg_block_bitmap) < first_block || + le32_to_cpu(gdp->bg_block_bitmap) > last_block) { ext3_error (sb, "ext3_check_descriptors", "Block bitmap for group %d" @@ -1196,9 +1209,8 @@ static int ext3_check_descriptors (struct super_block * sb) le32_to_cpu(gdp->bg_block_bitmap)); return 0; } - if (le32_to_cpu(gdp->bg_inode_bitmap) < block || - le32_to_cpu(gdp->bg_inode_bitmap) >= - block + EXT3_BLOCKS_PER_GROUP(sb)) + if (le32_to_cpu(gdp->bg_inode_bitmap) < first_block || + le32_to_cpu(gdp->bg_inode_bitmap) > last_block) { ext3_error (sb, "ext3_check_descriptors", "Inode bitmap for group %d" @@ -1207,9 +1219,9 @@ static int ext3_check_descriptors (struct super_block * sb) le32_to_cpu(gdp->bg_inode_bitmap)); return 0; } - if (le32_to_cpu(gdp->bg_inode_table) < block || - le32_to_cpu(gdp->bg_inode_table) + sbi->s_itb_per_group >= - block + EXT3_BLOCKS_PER_GROUP(sb)) + if (le32_to_cpu(gdp->bg_inode_table) < first_block || + le32_to_cpu(gdp->bg_inode_table) + sbi->s_itb_per_group > + last_block) { ext3_error (sb, "ext3_check_descriptors", "Inode table for group %d" @@ -1218,7 +1230,7 @@ static int ext3_check_descriptors (struct super_block * sb) le32_to_cpu(gdp->bg_inode_table)); return 0; } - block += EXT3_BLOCKS_PER_GROUP(sb); + first_block += EXT3_BLOCKS_PER_GROUP(sb); gdp++; } @@ -1300,17 +1312,17 @@ static void ext3_orphan_cleanup (struct super_block * sb, DQUOT_INIT(inode); if (inode->i_nlink) { printk(KERN_DEBUG - "%s: truncating inode %ld to %Ld bytes\n", + "%s: truncating inode %lu to %Ld bytes\n", __FUNCTION__, inode->i_ino, inode->i_size); - jbd_debug(2, "truncating inode %ld to %Ld bytes\n", + jbd_debug(2, "truncating inode %lu to %Ld bytes\n", inode->i_ino, inode->i_size); ext3_truncate(inode); nr_truncates++; } else { printk(KERN_DEBUG - "%s: deleting unreferenced inode %ld\n", + "%s: deleting unreferenced inode %lu\n", __FUNCTION__, inode->i_ino); - jbd_debug(2, "deleting unreferenced inode %ld\n", + jbd_debug(2, "deleting unreferenced inode %lu\n", inode->i_ino); nr_orphans++; } @@ -1360,15 +1372,14 @@ static loff_t ext3_max_size(int bits) return res; } -static unsigned long descriptor_loc(struct super_block *sb, - unsigned long logic_sb_block, +static ext3_fsblk_t descriptor_loc(struct super_block *sb, + ext3_fsblk_t logic_sb_block, int nr) { struct ext3_sb_info *sbi = EXT3_SB(sb); - unsigned long bg, first_data_block, first_meta_bg; + unsigned long bg, first_meta_bg; int has_super = 0; - first_data_block = le32_to_cpu(sbi->s_es->s_first_data_block); first_meta_bg = le32_to_cpu(sbi->s_es->s_first_meta_bg); if (!EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_META_BG) || @@ -1377,7 +1388,7 @@ static unsigned long descriptor_loc(struct super_block *sb, bg = sbi->s_desc_per_block * nr; if (ext3_bg_has_super(sb, bg)) has_super = 1; - return (first_data_block + has_super + (bg * sbi->s_blocks_per_group)); + return (has_super + ext3_group_first_block_no(sb, bg)); } @@ -1386,11 +1397,11 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent) struct buffer_head * bh; struct ext3_super_block *es = NULL; struct ext3_sb_info *sbi; - unsigned long block; - unsigned long sb_block = get_sb_block(&data); - unsigned long logic_sb_block; + ext3_fsblk_t block; + ext3_fsblk_t sb_block = get_sb_block(&data); + ext3_fsblk_t logic_sb_block; unsigned long offset = 0; - unsigned long journal_inum = 0; + unsigned int journal_inum = 0; unsigned long journal_devnum = 0; unsigned long def_mount_opts; struct inode *root; @@ -1613,12 +1624,21 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent) goto failed_mount; } + if (le32_to_cpu(es->s_blocks_count) > + (sector_t)(~0ULL) >> (sb->s_blocksize_bits - 9)) { + printk(KERN_ERR "EXT3-fs: filesystem on %s:" + " too large to mount safely\n", sb->s_id); + if (sizeof(sector_t) < 8) + printk(KERN_WARNING "EXT3-fs: CONFIG_LBD not " + "enabled\n"); + goto failed_mount; + } + if (EXT3_BLOCKS_PER_GROUP(sb) == 0) goto cantfind_ext3; - sbi->s_groups_count = (le32_to_cpu(es->s_blocks_count) - - le32_to_cpu(es->s_first_data_block) + - EXT3_BLOCKS_PER_GROUP(sb) - 1) / - EXT3_BLOCKS_PER_GROUP(sb); + sbi->s_groups_count = ((le32_to_cpu(es->s_blocks_count) - + le32_to_cpu(es->s_first_data_block) - 1) + / EXT3_BLOCKS_PER_GROUP(sb)) + 1; db_count = (sbi->s_groups_count + EXT3_DESC_PER_BLOCK(sb) - 1) / EXT3_DESC_PER_BLOCK(sb); sbi->s_group_desc = kmalloc(db_count * sizeof (struct buffer_head *), @@ -1628,9 +1648,6 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent) goto failed_mount; } - percpu_counter_init(&sbi->s_freeblocks_counter); - percpu_counter_init(&sbi->s_freeinodes_counter); - percpu_counter_init(&sbi->s_dirs_counter); bgl_lock_init(&sbi->s_blockgroup_lock); for (i = 0; i < db_count; i++) { @@ -1644,12 +1661,20 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent) } } if (!ext3_check_descriptors (sb)) { - printk (KERN_ERR "EXT3-fs: group descriptors corrupted !\n"); + printk(KERN_ERR "EXT3-fs: group descriptors corrupted!\n"); goto failed_mount2; } sbi->s_gdb_count = db_count; get_random_bytes(&sbi->s_next_generation, sizeof(u32)); spin_lock_init(&sbi->s_next_gen_lock); + + percpu_counter_init(&sbi->s_freeblocks_counter, + ext3_count_free_blocks(sb)); + percpu_counter_init(&sbi->s_freeinodes_counter, + ext3_count_free_inodes(sb)); + percpu_counter_init(&sbi->s_dirs_counter, + ext3_count_dirs(sb)); + /* per fileystem reservation list head & lock */ spin_lock_init(&sbi->s_rsv_window_lock); sbi->s_rsv_window_root = RB_ROOT; @@ -1688,16 +1713,16 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent) if (!test_opt(sb, NOLOAD) && EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_HAS_JOURNAL)) { if (ext3_load_journal(sb, es, journal_devnum)) - goto failed_mount2; + goto failed_mount3; } else if (journal_inum) { if (ext3_create_journal(sb, es, journal_inum)) - goto failed_mount2; + goto failed_mount3; } else { if (!silent) printk (KERN_ERR "ext3: No journal on filesystem on %s\n", sb->s_id); - goto failed_mount2; + goto failed_mount3; } /* We have now updated the journal if required, so we can @@ -1720,7 +1745,7 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent) (sbi->s_journal, 0, 0, JFS_FEATURE_INCOMPAT_REVOKE)) { printk(KERN_ERR "EXT3-fs: Journal does not support " "requested data journaling mode\n"); - goto failed_mount3; + goto failed_mount4; } default: break; @@ -1743,13 +1768,13 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent) if (!sb->s_root) { printk(KERN_ERR "EXT3-fs: get root inode failed\n"); iput(root); - goto failed_mount3; + goto failed_mount4; } if (!S_ISDIR(root->i_mode) || !root->i_blocks || !root->i_size) { dput(sb->s_root); sb->s_root = NULL; printk(KERN_ERR "EXT3-fs: corrupt root inode, run e2fsck\n"); - goto failed_mount3; + goto failed_mount4; } ext3_setup_super (sb, es, sb->s_flags & MS_RDONLY); @@ -1772,13 +1797,6 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent) test_opt(sb,DATA_FLAGS) == EXT3_MOUNT_ORDERED_DATA ? "ordered": "writeback"); - percpu_counter_mod(&sbi->s_freeblocks_counter, - ext3_count_free_blocks(sb)); - percpu_counter_mod(&sbi->s_freeinodes_counter, - ext3_count_free_inodes(sb)); - percpu_counter_mod(&sbi->s_dirs_counter, - ext3_count_dirs(sb)); - lock_kernel(); return 0; @@ -1788,8 +1806,12 @@ cantfind_ext3: sb->s_id); goto failed_mount; -failed_mount3: +failed_mount4: journal_destroy(sbi->s_journal); +failed_mount3: + percpu_counter_destroy(&sbi->s_freeblocks_counter); + percpu_counter_destroy(&sbi->s_freeinodes_counter); + percpu_counter_destroy(&sbi->s_dirs_counter); failed_mount2: for (i = 0; i < db_count; i++) brelse(sbi->s_group_desc[i]); @@ -1831,7 +1853,8 @@ static void ext3_init_journal_params(struct super_block *sb, journal_t *journal) spin_unlock(&journal->j_state_lock); } -static journal_t *ext3_get_journal(struct super_block *sb, int journal_inum) +static journal_t *ext3_get_journal(struct super_block *sb, + unsigned int journal_inum) { struct inode *journal_inode; journal_t *journal; @@ -1876,10 +1899,10 @@ static journal_t *ext3_get_dev_journal(struct super_block *sb, { struct buffer_head * bh; journal_t *journal; - int start; - int len; + ext3_fsblk_t start; + ext3_fsblk_t len; int hblock, blocksize; - unsigned long sb_block; + ext3_fsblk_t sb_block; unsigned long offset; struct ext3_super_block * es; struct block_device *bdev; @@ -1966,7 +1989,7 @@ static int ext3_load_journal(struct super_block *sb, unsigned long journal_devnum) { journal_t *journal; - int journal_inum = le32_to_cpu(es->s_journal_inum); + unsigned int journal_inum = le32_to_cpu(es->s_journal_inum); dev_t journal_dev; int err = 0; int really_read_only; @@ -2052,7 +2075,7 @@ static int ext3_load_journal(struct super_block *sb, static int ext3_create_journal(struct super_block * sb, struct ext3_super_block * es, - int journal_inum) + unsigned int journal_inum) { journal_t *journal; @@ -2065,7 +2088,7 @@ static int ext3_create_journal(struct super_block * sb, if (!(journal = ext3_get_journal(sb, journal_inum))) return -EINVAL; - printk(KERN_INFO "EXT3-fs: creating new journal on inode %d\n", + printk(KERN_INFO "EXT3-fs: creating new journal on inode %u\n", journal_inum); if (journal_create(journal)) { @@ -2252,7 +2275,7 @@ static int ext3_remount (struct super_block * sb, int * flags, char * data) { struct ext3_super_block * es; struct ext3_sb_info *sbi = EXT3_SB(sb); - unsigned long n_blocks_count = 0; + ext3_fsblk_t n_blocks_count = 0; unsigned long old_sb_flags; struct ext3_mount_options old_opts; int err; @@ -2373,11 +2396,12 @@ restore_opts: return err; } -static int ext3_statfs (struct super_block * sb, struct kstatfs * buf) +static int ext3_statfs (struct dentry * dentry, struct kstatfs * buf) { + struct super_block *sb = dentry->d_sb; struct ext3_sb_info *sbi = EXT3_SB(sb); struct ext3_super_block *es = sbi->s_es; - unsigned long overhead; + ext3_fsblk_t overhead; int i; if (test_opt (sb, MINIX_DF)) @@ -2652,7 +2676,7 @@ static ssize_t ext3_quota_write(struct super_block *sb, int type, struct buffer_head *bh; handle_t *handle = journal_current_handle(); - mutex_lock(&inode->i_mutex); + mutex_lock_nested(&inode->i_mutex, I_MUTEX_QUOTA); while (towrite > 0) { tocopy = sb->s_blocksize - offset < towrite ? sb->s_blocksize - offset : towrite; @@ -2701,10 +2725,10 @@ out: #endif -static struct super_block *ext3_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int ext3_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_bdev(fs_type, flags, dev_name, data, ext3_fill_super); + return get_sb_bdev(fs_type, flags, dev_name, data, ext3_fill_super, mnt); } static struct file_system_type ext3_fs_type = { diff --git a/fs/ext3/xattr.c b/fs/ext3/xattr.c index fac3f248b..74f20d39d 100644 --- a/fs/ext3/xattr.c +++ b/fs/ext3/xattr.c @@ -76,7 +76,7 @@ #ifdef EXT3_XATTR_DEBUG # define ea_idebug(inode, f...) do { \ - printk(KERN_DEBUG "inode %s:%ld: ", \ + printk(KERN_DEBUG "inode %s:%lu: ", \ inode->i_sb->s_id, inode->i_ino); \ printk(f); \ printk("\n"); \ @@ -226,7 +226,7 @@ ext3_xattr_block_get(struct inode *inode, int name_index, const char *name, error = -ENODATA; if (!EXT3_I(inode)->i_file_acl) goto cleanup; - ea_idebug(inode, "reading block %d", EXT3_I(inode)->i_file_acl); + ea_idebug(inode, "reading block %u", EXT3_I(inode)->i_file_acl); bh = sb_bread(inode->i_sb, EXT3_I(inode)->i_file_acl); if (!bh) goto cleanup; @@ -234,7 +234,7 @@ ext3_xattr_block_get(struct inode *inode, int name_index, const char *name, atomic_read(&(bh->b_count)), le32_to_cpu(BHDR(bh)->h_refcount)); if (ext3_xattr_check_block(bh)) { bad_block: ext3_error(inode->i_sb, __FUNCTION__, - "inode %ld: bad block %d", inode->i_ino, + "inode %lu: bad block "E3FSBLK, inode->i_ino, EXT3_I(inode)->i_file_acl); error = -EIO; goto cleanup; @@ -367,7 +367,7 @@ ext3_xattr_block_list(struct inode *inode, char *buffer, size_t buffer_size) error = 0; if (!EXT3_I(inode)->i_file_acl) goto cleanup; - ea_idebug(inode, "reading block %d", EXT3_I(inode)->i_file_acl); + ea_idebug(inode, "reading block %u", EXT3_I(inode)->i_file_acl); bh = sb_bread(inode->i_sb, EXT3_I(inode)->i_file_acl); error = -EIO; if (!bh) @@ -376,7 +376,7 @@ ext3_xattr_block_list(struct inode *inode, char *buffer, size_t buffer_size) atomic_read(&(bh->b_count)), le32_to_cpu(BHDR(bh)->h_refcount)); if (ext3_xattr_check_block(bh)) { ext3_error(inode->i_sb, __FUNCTION__, - "inode %ld: bad block %d", inode->i_ino, + "inode %lu: bad block "E3FSBLK, inode->i_ino, EXT3_I(inode)->i_file_acl); error = -EIO; goto cleanup; @@ -649,7 +649,7 @@ ext3_xattr_block_find(struct inode *inode, struct ext3_xattr_info *i, le32_to_cpu(BHDR(bs->bh)->h_refcount)); if (ext3_xattr_check_block(bs->bh)) { ext3_error(sb, __FUNCTION__, - "inode %ld: bad block %d", inode->i_ino, + "inode %lu: bad block "E3FSBLK, inode->i_ino, EXT3_I(inode)->i_file_acl); error = -EIO; goto cleanup; @@ -797,11 +797,12 @@ inserted: get_bh(new_bh); } else { /* We need to allocate a new block */ - int goal = le32_to_cpu( + ext3_fsblk_t goal = le32_to_cpu( EXT3_SB(sb)->s_es->s_first_data_block) + - EXT3_I(inode)->i_block_group * + (ext3_fsblk_t)EXT3_I(inode)->i_block_group * EXT3_BLOCKS_PER_GROUP(sb); - int block = ext3_new_block(handle, inode, goal, &error); + ext3_fsblk_t block = ext3_new_block(handle, inode, + goal, &error); if (error) goto cleanup; ea_idebug(inode, "creating block %d", block); @@ -854,7 +855,7 @@ cleanup_dlimit: bad_block: ext3_error(inode->i_sb, __FUNCTION__, - "inode %ld: bad block %d", inode->i_ino, + "inode %lu: bad block "E3FSBLK, inode->i_ino, EXT3_I(inode)->i_file_acl); goto cleanup; @@ -1083,14 +1084,14 @@ ext3_xattr_delete_inode(handle_t *handle, struct inode *inode) bh = sb_bread(inode->i_sb, EXT3_I(inode)->i_file_acl); if (!bh) { ext3_error(inode->i_sb, __FUNCTION__, - "inode %ld: block %d read error", inode->i_ino, + "inode %lu: block "E3FSBLK" read error", inode->i_ino, EXT3_I(inode)->i_file_acl); goto cleanup; } if (BHDR(bh)->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || BHDR(bh)->h_blocks != cpu_to_le32(1)) { ext3_error(inode->i_sb, __FUNCTION__, - "inode %ld: bad block %d", inode->i_ino, + "inode %lu: bad block "E3FSBLK, inode->i_ino, EXT3_I(inode)->i_file_acl); goto cleanup; } @@ -1217,11 +1218,11 @@ again: bh = sb_bread(inode->i_sb, ce->e_block); if (!bh) { ext3_error(inode->i_sb, __FUNCTION__, - "inode %ld: block %ld read error", + "inode %lu: block %lu read error", inode->i_ino, (unsigned long) ce->e_block); } else if (le32_to_cpu(BHDR(bh)->h_refcount) >= EXT3_XATTR_REFCOUNT_MAX) { - ea_idebug(inode, "block %ld refcount %d>=%d", + ea_idebug(inode, "block %lu refcount %d>=%d", (unsigned long) ce->e_block, le32_to_cpu(BHDR(bh)->h_refcount), EXT3_XATTR_REFCOUNT_MAX); diff --git a/fs/ext3/xattr.h b/fs/ext3/xattr.h index 2ceae38f3..6b1ae1c61 100644 --- a/fs/ext3/xattr.h +++ b/fs/ext3/xattr.h @@ -6,7 +6,6 @@ (C) 2001 Andreas Gruenbacher, */ -#include #include /* Magic value in attribute blocks */ diff --git a/fs/fat/dir.c b/fs/fat/dir.c index 698b85bb1..9e6eae903 100644 --- a/fs/fat/dir.c +++ b/fs/fat/dir.c @@ -647,7 +647,7 @@ static int fat_readdir(struct file *filp, void *dirent, filldir_t filldir) } static int fat_ioctl_filldir(void *__buf, const char *name, int name_len, - loff_t offset, ino_t ino, unsigned int d_type) + loff_t offset, u64 ino, unsigned int d_type) { struct fat_ioctl_filldir_callback *buf = __buf; struct dirent __user *d1 = buf->dirent; diff --git a/fs/fat/inode.c b/fs/fat/inode.c index 3c2cbd355..bb3bee034 100644 --- a/fs/fat/inode.c +++ b/fs/fat/inode.c @@ -196,7 +196,7 @@ static sector_t _fat_bmap(struct address_space *mapping, sector_t block) return generic_block_bmap(mapping, block, fat_get_block); } -static struct address_space_operations fat_aops = { +static const struct address_space_operations fat_aops = { .readpage = fat_readpage, .readpages = fat_readpages, .writepage = fat_writepage, @@ -375,8 +375,6 @@ static int fat_fill_inode(struct inode *inode, struct msdos_dir_entry *de) inode->i_flags |= S_IMMUTABLE; } MSDOS_I(inode)->i_attrs = de->attr & ATTR_UNUSED; - /* this is as close to the truth as we can get ... */ - inode->i_blksize = sbi->cluster_size; inode->i_blocks = ((inode->i_size + (sbi->cluster_size - 1)) & ~((loff_t)sbi->cluster_size - 1)) >> 9; inode->i_mtime.tv_sec = @@ -539,18 +537,18 @@ static int fat_remount(struct super_block *sb, int *flags, char *data) return 0; } -static int fat_statfs(struct super_block *sb, struct kstatfs *buf) +static int fat_statfs(struct dentry *dentry, struct kstatfs *buf) { - struct msdos_sb_info *sbi = MSDOS_SB(sb); + struct msdos_sb_info *sbi = MSDOS_SB(dentry->d_sb); /* If the count of free cluster is still unknown, counts it here. */ if (sbi->free_clusters == -1) { - int err = fat_count_free_clusters(sb); + int err = fat_count_free_clusters(dentry->d_sb); if (err) return err; } - buf->f_type = sb->s_magic; + buf->f_type = dentry->d_sb->s_magic; buf->f_bsize = sbi->cluster_size; buf->f_blocks = sbi->max_cluster - FAT_START_ENT; buf->f_bfree = sbi->free_clusters; @@ -1138,7 +1136,6 @@ static int fat_read_root(struct inode *inode) MSDOS_I(inode)->i_start = 0; inode->i_size = sbi->dir_entries * sizeof(struct msdos_dir_entry); } - inode->i_blksize = sbi->cluster_size; inode->i_blocks = ((inode->i_size + (sbi->cluster_size - 1)) & ~((loff_t)sbi->cluster_size - 1)) >> 9; MSDOS_I(inode)->i_logstart = 0; diff --git a/fs/fat/misc.c b/fs/fat/misc.c index 944652e9d..308f2b6b5 100644 --- a/fs/fat/misc.c +++ b/fs/fat/misc.c @@ -210,4 +210,3 @@ int fat_sync_bhs(struct buffer_head **bhs, int nr_bhs) return err; } -EXPORT_SYMBOL_GPL(fat_sync_bhs); diff --git a/fs/fcntl.c b/fs/fcntl.c index 921b556c5..3b9ab5fd5 100644 --- a/fs/fcntl.c +++ b/fs/fcntl.c @@ -538,6 +538,8 @@ int send_sigurg(struct fown_struct *fown) return ret; } +EXPORT_SYMBOL(send_sigurg); + static DEFINE_RWLOCK(fasync_lock); static kmem_cache_t *fasync_cache __read_mostly; diff --git a/fs/file.c b/fs/file.c index 4c2cacca4..b3c6b82e6 100644 --- a/fs/file.c +++ b/fs/file.c @@ -240,13 +240,9 @@ static struct fdtable *alloc_fdtable(int nr) if (!fdt) goto out; - nfds = 8 * L1_CACHE_BYTES; - /* Expand to the max in easy steps */ - while (nfds <= nr) { - nfds = nfds * 2; - if (nfds > NR_OPEN) - nfds = NR_OPEN; - } + nfds = max_t(int, 8 * L1_CACHE_BYTES, roundup_pow_of_two(nr + 1)); + if (nfds > NR_OPEN) + nfds = NR_OPEN; new_openset = alloc_fdset(nfds); new_execset = alloc_fdset(nfds); diff --git a/fs/file_table.c b/fs/file_table.c index 889491def..4a9072624 100644 --- a/fs/file_table.c +++ b/fs/file_table.c @@ -5,7 +5,6 @@ * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) */ -#include #include #include #include @@ -174,7 +173,7 @@ void fastcall __fput(struct file *file) if (file->f_op && file->f_op->release) file->f_op->release(inode, file); security_file_free(file); - if (unlikely(inode->i_cdev != NULL)) + if (unlikely(S_ISCHR(inode->i_mode) && inode->i_cdev != NULL)) cdev_put(inode->i_cdev); fops_put(file->f_op); if (file->f_mode & FMODE_WRITE) @@ -241,6 +240,7 @@ struct file fastcall *fget_light(unsigned int fd, int *fput_needed) return file; } +EXPORT_SYMBOL_GPL(fget_light); void put_filp(struct file *file) { @@ -308,5 +308,5 @@ void __init files_init(unsigned long mempages) if (files_stat.max_files < NR_FILE) files_stat.max_files = NR_FILE; files_defer_init(); - percpu_counter_init(&nr_files); + percpu_counter_init(&nr_files, 0); } diff --git a/fs/freevxfs/vxfs.h b/fs/freevxfs/vxfs.h index 583bd7808..c8a926526 100644 --- a/fs/freevxfs/vxfs.h +++ b/fs/freevxfs/vxfs.h @@ -159,11 +159,11 @@ struct vxfs_sb { * In core superblock filesystem private data for VxFS. */ struct vxfs_sb_info { - struct vxfs_sb *vsi_raw; /* raw (on disk) supeblock */ + struct vxfs_sb *vsi_raw; /* raw (on disk) superblock */ struct buffer_head *vsi_bp; /* buffer for raw superblock*/ struct inode *vsi_fship; /* fileset header inode */ struct inode *vsi_ilist; /* inode list inode */ - struct inode *vsi_stilist; /* structual inode list inode */ + struct inode *vsi_stilist; /* structural inode list inode */ u_long vsi_iext; /* initial inode list */ ino_t vsi_fshino; /* fileset header inode */ daddr_t vsi_oltext; /* OLT extent */ @@ -252,7 +252,7 @@ enum { * Get filesystem private data from VFS inode. */ #define VXFS_INO(ip) \ - ((struct vxfs_inode_info *)(ip)->u.generic_ip) + ((struct vxfs_inode_info *)(ip)->i_private) /* * Get filesystem private data from VFS superblock. diff --git a/fs/freevxfs/vxfs_fshead.c b/fs/freevxfs/vxfs_fshead.c index 6dee109ae..78948b4b1 100644 --- a/fs/freevxfs/vxfs_fshead.c +++ b/fs/freevxfs/vxfs_fshead.c @@ -112,7 +112,7 @@ vxfs_read_fshead(struct super_block *sbp) vip = vxfs_blkiget(sbp, infp->vsi_iext, infp->vsi_fshino); if (!vip) { - printk(KERN_ERR "vxfs: unabled to read fsh inode\n"); + printk(KERN_ERR "vxfs: unable to read fsh inode\n"); return -EINVAL; } if (!VXFS_ISFSH(vip)) { @@ -129,13 +129,13 @@ vxfs_read_fshead(struct super_block *sbp) infp->vsi_fship = vxfs_get_fake_inode(sbp, vip); if (!infp->vsi_fship) { - printk(KERN_ERR "vxfs: unabled to get fsh inode\n"); + printk(KERN_ERR "vxfs: unable to get fsh inode\n"); goto out_free_fship; } sfp = vxfs_getfsh(infp->vsi_fship, 0); if (!sfp) { - printk(KERN_ERR "vxfs: unabled to get structural fsh\n"); + printk(KERN_ERR "vxfs: unable to get structural fsh\n"); goto out_iput_fship; } @@ -145,7 +145,7 @@ vxfs_read_fshead(struct super_block *sbp) pfp = vxfs_getfsh(infp->vsi_fship, 1); if (!pfp) { - printk(KERN_ERR "vxfs: unabled to get primary fsh\n"); + printk(KERN_ERR "vxfs: unable to get primary fsh\n"); goto out_free_sfp; } @@ -159,7 +159,7 @@ vxfs_read_fshead(struct super_block *sbp) infp->vsi_stilist = vxfs_get_fake_inode(sbp, tip); if (!infp->vsi_stilist) { - printk(KERN_ERR "vxfs: unabled to get structual list inode\n"); + printk(KERN_ERR "vxfs: unable to get structural list inode\n"); kfree(tip); goto out_free_pfp; } @@ -174,7 +174,7 @@ vxfs_read_fshead(struct super_block *sbp) goto out_iput_stilist; infp->vsi_ilist = vxfs_get_fake_inode(sbp, tip); if (!infp->vsi_ilist) { - printk(KERN_ERR "vxfs: unabled to get inode list inode\n"); + printk(KERN_ERR "vxfs: unable to get inode list inode\n"); kfree(tip); goto out_iput_stilist; } diff --git a/fs/freevxfs/vxfs_immed.c b/fs/freevxfs/vxfs_immed.c index 6f5df1700..4e25f3fbe 100644 --- a/fs/freevxfs/vxfs_immed.c +++ b/fs/freevxfs/vxfs_immed.c @@ -56,7 +56,7 @@ struct inode_operations vxfs_immed_symlink_iops = { /* * Adress space operations for immed files and directories. */ -struct address_space_operations vxfs_immed_aops = { +const struct address_space_operations vxfs_immed_aops = { .readpage = vxfs_immed_readpage, }; diff --git a/fs/freevxfs/vxfs_inode.c b/fs/freevxfs/vxfs_inode.c index f544aae91..4786d51ad 100644 --- a/fs/freevxfs/vxfs_inode.c +++ b/fs/freevxfs/vxfs_inode.c @@ -41,8 +41,8 @@ #include "vxfs_extern.h" -extern struct address_space_operations vxfs_aops; -extern struct address_space_operations vxfs_immed_aops; +extern const struct address_space_operations vxfs_aops; +extern const struct address_space_operations vxfs_immed_aops; extern struct inode_operations vxfs_immed_symlink_iops; @@ -239,11 +239,10 @@ vxfs_iinit(struct inode *ip, struct vxfs_inode_info *vip) ip->i_ctime.tv_nsec = 0; ip->i_mtime.tv_nsec = 0; - ip->i_blksize = PAGE_SIZE; ip->i_blocks = vip->vii_blocks; ip->i_generation = vip->vii_gen; - ip->u.generic_ip = (void *)vip; + ip->i_private = vip; } @@ -295,7 +294,7 @@ vxfs_read_inode(struct inode *ip) { struct super_block *sbp = ip->i_sb; struct vxfs_inode_info *vip; - struct address_space_operations *aops; + const struct address_space_operations *aops; ino_t ino = ip->i_ino; if (!(vip = __vxfs_iget(ino, VXFS_SBI(sbp)->vsi_ilist))) @@ -338,5 +337,5 @@ vxfs_read_inode(struct inode *ip) void vxfs_clear_inode(struct inode *ip) { - kmem_cache_free(vxfs_inode_cachep, ip->u.generic_ip); + kmem_cache_free(vxfs_inode_cachep, ip->i_private); } diff --git a/fs/freevxfs/vxfs_lookup.c b/fs/freevxfs/vxfs_lookup.c index 29cce456c..43886fa00 100644 --- a/fs/freevxfs/vxfs_lookup.c +++ b/fs/freevxfs/vxfs_lookup.c @@ -246,6 +246,8 @@ vxfs_readdir(struct file *fp, void *retp, filldir_t filler) u_long page, npages, block, pblocks, nblocks, offset; loff_t pos; + lock_kernel(); + switch ((long)fp->f_pos) { case 0: if (filler(retp, ".", 1, fp->f_pos, ip->i_ino, DT_DIR) < 0) diff --git a/fs/freevxfs/vxfs_subr.c b/fs/freevxfs/vxfs_subr.c index 50aae7765..805bbb2e9 100644 --- a/fs/freevxfs/vxfs_subr.c +++ b/fs/freevxfs/vxfs_subr.c @@ -42,7 +42,7 @@ static int vxfs_readpage(struct file *, struct page *); static sector_t vxfs_bmap(struct address_space *, sector_t); -struct address_space_operations vxfs_aops = { +const struct address_space_operations vxfs_aops = { .readpage = vxfs_readpage, .bmap = vxfs_bmap, .sync_page = block_sync_page, @@ -71,15 +71,14 @@ vxfs_get_page(struct address_space *mapping, u_long n) { struct page * pp; - pp = read_cache_page(mapping, n, - (filler_t*)mapping->a_ops->readpage, NULL); + pp = read_mapping_page(mapping, n, NULL); if (!IS_ERR(pp)) { wait_on_page_locked(pp); kmap(pp); if (!PageUptodate(pp)) goto fail; - /** if (!PageChecked(pp)) **/ + /** if (!PageFsMisc(pp)) **/ /** vxfs_check_page(pp); **/ if (PageError(pp)) goto fail; diff --git a/fs/freevxfs/vxfs_super.c b/fs/freevxfs/vxfs_super.c index b44c916d2..b74b791fc 100644 --- a/fs/freevxfs/vxfs_super.c +++ b/fs/freevxfs/vxfs_super.c @@ -40,6 +40,7 @@ #include #include #include +#include #include "vxfs.h" #include "vxfs_extern.h" @@ -55,7 +56,7 @@ MODULE_ALIAS("vxfs"); /* makes mount -t vxfs autoload the module */ static void vxfs_put_super(struct super_block *); -static int vxfs_statfs(struct super_block *, struct kstatfs *); +static int vxfs_statfs(struct dentry *, struct kstatfs *); static int vxfs_remount(struct super_block *, int *, char *); static struct super_operations vxfs_super_ops = { @@ -90,12 +91,12 @@ vxfs_put_super(struct super_block *sbp) /** * vxfs_statfs - get filesystem information - * @sbp: VFS superblock + * @dentry: VFS dentry to locate superblock * @bufp: output buffer * * Description: * vxfs_statfs fills the statfs buffer @bufp with information - * about the filesystem described by @sbp. + * about the filesystem described by @dentry. * * Returns: * Zero. @@ -107,12 +108,12 @@ vxfs_put_super(struct super_block *sbp) * This is everything but complete... */ static int -vxfs_statfs(struct super_block *sbp, struct kstatfs *bufp) +vxfs_statfs(struct dentry *dentry, struct kstatfs *bufp) { - struct vxfs_sb_info *infp = VXFS_SBI(sbp); + struct vxfs_sb_info *infp = VXFS_SBI(dentry->d_sb); bufp->f_type = VXFS_SUPER_MAGIC; - bufp->f_bsize = sbp->s_blocksize; + bufp->f_bsize = dentry->d_sb->s_blocksize; bufp->f_blocks = infp->vsi_raw->vs_dsize; bufp->f_bfree = infp->vsi_raw->vs_free; bufp->f_bavail = 0; @@ -241,10 +242,11 @@ out: /* * The usual module blurb. */ -static struct super_block *vxfs_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int vxfs_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_bdev(fs_type, flags, dev_name, data, vxfs_fill_super); + return get_sb_bdev(fs_type, flags, dev_name, data, vxfs_fill_super, + mnt); } static struct file_system_type vxfs_fs_type = { diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index f3fbe2d03..892643dc9 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -461,9 +461,11 @@ void sync_inodes_sb(struct super_block *sb, int wait) { struct writeback_control wbc = { .sync_mode = wait ? WB_SYNC_ALL : WB_SYNC_HOLD, + .range_start = 0, + .range_end = LLONG_MAX, }; - unsigned long nr_dirty = read_page_state(nr_dirty); - unsigned long nr_unstable = read_page_state(nr_unstable); + unsigned long nr_dirty = global_page_state(NR_FILE_DIRTY); + unsigned long nr_unstable = global_page_state(NR_UNSTABLE_NFS); wbc.nr_to_write = nr_dirty + nr_unstable + (inodes_stat.nr_inodes - inodes_stat.nr_unused) + @@ -559,6 +561,8 @@ int write_inode_now(struct inode *inode, int sync) struct writeback_control wbc = { .nr_to_write = LONG_MAX, .sync_mode = WB_SYNC_ALL, + .range_start = 0, + .range_end = LLONG_MAX, }; if (!mapping_cap_writeback_dirty(inode->i_mapping)) @@ -619,7 +623,6 @@ int generic_osync_inode(struct inode *inode, struct address_space *mapping, int int need_write_inode_now = 0; int err2; - current->flags |= PF_SYNCWRITE; if (what & OSYNC_DATA) err = filemap_fdatawrite(mapping); if (what & (OSYNC_METADATA|OSYNC_DATA)) { @@ -632,7 +635,6 @@ int generic_osync_inode(struct inode *inode, struct address_space *mapping, int if (!err) err = err2; } - current->flags &= ~PF_SYNCWRITE; spin_lock(&inode_lock); if ((inode->i_state & I_DIRTY) && diff --git a/fs/fuse/Makefile b/fs/fuse/Makefile index c3e1f760c..72437065f 100644 --- a/fs/fuse/Makefile +++ b/fs/fuse/Makefile @@ -4,4 +4,4 @@ obj-$(CONFIG_FUSE_FS) += fuse.o -fuse-objs := dev.o dir.o file.o inode.o +fuse-objs := dev.o dir.o file.o inode.o control.o diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c index 104a62dad..1e2006caf 100644 --- a/fs/fuse/dev.c +++ b/fs/fuse/dev.c @@ -34,6 +34,7 @@ static void fuse_request_init(struct fuse_req *req) { memset(req, 0, sizeof(*req)); INIT_LIST_HEAD(&req->list); + INIT_LIST_HEAD(&req->intr_entry); init_waitqueue_head(&req->waitq); atomic_set(&req->count, 1); } @@ -64,18 +65,6 @@ static void restore_sigs(sigset_t *oldset) sigprocmask(SIG_SETMASK, oldset, NULL); } -/* - * Reset request, so that it can be reused - * - * The caller must be _very_ careful to make sure, that it is holding - * the only reference to req - */ -void fuse_reset_request(struct fuse_req *req) -{ - BUG_ON(atomic_read(&req->count) != 1); - fuse_request_init(req); -} - static void __fuse_get_request(struct fuse_req *req) { atomic_inc(&req->count); @@ -88,6 +77,13 @@ static void __fuse_put_request(struct fuse_req *req) atomic_dec(&req->count); } +static void fuse_req_init_context(struct fuse_req *req) +{ + req->in.h.uid = current->fsuid; + req->in.h.gid = current->fsgid; + req->in.h.pid = current->pid; +} + struct fuse_req *fuse_get_req(struct fuse_conn *fc) { struct fuse_req *req; @@ -103,14 +99,16 @@ struct fuse_req *fuse_get_req(struct fuse_conn *fc) if (intr) goto out; + err = -ENOTCONN; + if (!fc->connected) + goto out; + req = fuse_request_alloc(); err = -ENOMEM; if (!req) goto out; - req->in.h.uid = current->fsuid; - req->in.h.gid = current->fsgid; - req->in.h.pid = current->pid; + fuse_req_init_context(req); req->waiting = 1; return req; @@ -119,142 +117,183 @@ struct fuse_req *fuse_get_req(struct fuse_conn *fc) return ERR_PTR(err); } -void fuse_put_request(struct fuse_conn *fc, struct fuse_req *req) +/* + * Return request in fuse_file->reserved_req. However that may + * currently be in use. If that is the case, wait for it to become + * available. + */ +static struct fuse_req *get_reserved_req(struct fuse_conn *fc, + struct file *file) { - if (atomic_dec_and_test(&req->count)) { - if (req->waiting) - atomic_dec(&fc->num_waiting); - fuse_request_free(req); - } + struct fuse_req *req = NULL; + struct fuse_file *ff = file->private_data; + + do { + wait_event(fc->blocked_waitq, ff->reserved_req); + spin_lock(&fc->lock); + if (ff->reserved_req) { + req = ff->reserved_req; + ff->reserved_req = NULL; + get_file(file); + req->stolen_file = file; + } + spin_unlock(&fc->lock); + } while (!req); + + return req; } /* - * Called with sbput_sem held for read (request_end) or write - * (fuse_put_super). By the time fuse_put_super() is finished, all - * inodes belonging to background requests must be released, so the - * iputs have to be done within the locked region. + * Put stolen request back into fuse_file->reserved_req */ -void fuse_release_background(struct fuse_conn *fc, struct fuse_req *req) +static void put_reserved_req(struct fuse_conn *fc, struct fuse_req *req) { - iput(req->inode); - iput(req->inode2); + struct file *file = req->stolen_file; + struct fuse_file *ff = file->private_data; + spin_lock(&fc->lock); - list_del(&req->bg_entry); - if (fc->num_background == FUSE_MAX_BACKGROUND) { - fc->blocked = 0; - wake_up_all(&fc->blocked_waitq); - } - fc->num_background--; + fuse_request_init(req); + BUG_ON(ff->reserved_req); + ff->reserved_req = req; + wake_up(&fc->blocked_waitq); spin_unlock(&fc->lock); + fput(file); } /* - * This function is called when a request is finished. Either a reply - * has arrived or it was interrupted (and not yet sent) or some error - * occurred during communication with userspace, or the device file - * was closed. In case of a background request the reference to the - * stored objects are released. The requester thread is woken up (if - * still waiting), the 'end' callback is called if given, else the - * reference to the request is released + * Gets a requests for a file operation, always succeeds * - * Releasing extra reference for foreground requests must be done - * within the same locked region as setting state to finished. This - * is because fuse_reset_request() may be called after request is - * finished and it must be the sole possessor. If request is - * interrupted and put in the background, it will return with an error - * and hence never be reset and reused. + * This is used for sending the FLUSH request, which must get to + * userspace, due to POSIX locks which may need to be unlocked. * - * Called with fc->lock, unlocks it + * If allocation fails due to OOM, use the reserved request in + * fuse_file. + * + * This is very unlikely to deadlock accidentally, since the + * filesystem should not have it's own file open. If deadlock is + * intentional, it can still be broken by "aborting" the filesystem. */ -static void request_end(struct fuse_conn *fc, struct fuse_req *req) +struct fuse_req *fuse_get_req_nofail(struct fuse_conn *fc, struct file *file) { - list_del(&req->list); - req->state = FUSE_REQ_FINISHED; - if (!req->background) { - spin_unlock(&fc->lock); - wake_up(&req->waitq); - fuse_put_request(fc, req); - } else { - void (*end) (struct fuse_conn *, struct fuse_req *) = req->end; - req->end = NULL; - spin_unlock(&fc->lock); - down_read(&fc->sbput_sem); - if (fc->mounted) - fuse_release_background(fc, req); - up_read(&fc->sbput_sem); + struct fuse_req *req; - /* fput must go outside sbput_sem, otherwise it can deadlock */ - if (req->file) - fput(req->file); + atomic_inc(&fc->num_waiting); + wait_event(fc->blocked_waitq, !fc->blocked); + req = fuse_request_alloc(); + if (!req) + req = get_reserved_req(fc, file); - if (end) - end(fc, req); + fuse_req_init_context(req); + req->waiting = 1; + return req; +} + +void fuse_put_request(struct fuse_conn *fc, struct fuse_req *req) +{ + if (atomic_dec_and_test(&req->count)) { + if (req->waiting) + atomic_dec(&fc->num_waiting); + + if (req->stolen_file) + put_reserved_req(fc, req); else - fuse_put_request(fc, req); + fuse_request_free(req); } } /* - * Unfortunately request interruption not just solves the deadlock - * problem, it causes problems too. These stem from the fact, that an - * interrupted request is continued to be processed in userspace, - * while all the locks and object references (inode and file) held - * during the operation are released. - * - * To release the locks is exactly why there's a need to interrupt the - * request, so there's not a lot that can be done about this, except - * introduce additional locking in userspace. - * - * More important is to keep inode and file references until userspace - * has replied, otherwise FORGET and RELEASE could be sent while the - * inode/file is still used by the filesystem. - * - * For this reason the concept of "background" request is introduced. - * An interrupted request is backgrounded if it has been already sent - * to userspace. Backgrounding involves getting an extra reference to - * inode(s) or file used in the request, and adding the request to - * fc->background list. When a reply is received for a background - * request, the object references are released, and the request is - * removed from the list. If the filesystem is unmounted while there - * are still background requests, the list is walked and references - * are released as if a reply was received. + * This function is called when a request is finished. Either a reply + * has arrived or it was aborted (and not yet sent) or some error + * occurred during communication with userspace, or the device file + * was closed. The requester thread is woken up (if still waiting), + * the 'end' callback is called if given, else the reference to the + * request is released * - * There's one more use for a background request. The RELEASE message is - * always sent as background, since it doesn't return an error or - * data. + * Called with fc->lock, unlocks it */ -static void background_request(struct fuse_conn *fc, struct fuse_req *req) -{ - req->background = 1; - list_add(&req->bg_entry, &fc->background); - fc->num_background++; - if (fc->num_background == FUSE_MAX_BACKGROUND) - fc->blocked = 1; - if (req->inode) - req->inode = igrab(req->inode); - if (req->inode2) - req->inode2 = igrab(req->inode2); +static void request_end(struct fuse_conn *fc, struct fuse_req *req) +{ + void (*end) (struct fuse_conn *, struct fuse_req *) = req->end; + req->end = NULL; + list_del(&req->list); + list_del(&req->intr_entry); + req->state = FUSE_REQ_FINISHED; + if (req->background) { + if (fc->num_background == FUSE_MAX_BACKGROUND) { + fc->blocked = 0; + wake_up_all(&fc->blocked_waitq); + } + fc->num_background--; + } + spin_unlock(&fc->lock); + dput(req->dentry); + mntput(req->vfsmount); if (req->file) - get_file(req->file); + fput(req->file); + wake_up(&req->waitq); + if (end) + end(fc, req); + else + fuse_put_request(fc, req); } -/* Called with fc->lock held. Releases, and then reacquires it. */ -static void request_wait_answer(struct fuse_conn *fc, struct fuse_req *req) +static void wait_answer_interruptible(struct fuse_conn *fc, + struct fuse_req *req) { - sigset_t oldset; + if (signal_pending(current)) + return; spin_unlock(&fc->lock); - block_sigs(&oldset); wait_event_interruptible(req->waitq, req->state == FUSE_REQ_FINISHED); - restore_sigs(&oldset); spin_lock(&fc->lock); - if (req->state == FUSE_REQ_FINISHED && !req->interrupted) - return; +} + +static void queue_interrupt(struct fuse_conn *fc, struct fuse_req *req) +{ + list_add_tail(&req->intr_entry, &fc->interrupts); + wake_up(&fc->waitq); + kill_fasync(&fc->fasync, SIGIO, POLL_IN); +} + +/* Called with fc->lock held. Releases, and then reacquires it. */ +static void request_wait_answer(struct fuse_conn *fc, struct fuse_req *req) +{ + if (!fc->no_interrupt) { + /* Any signal may interrupt this */ + wait_answer_interruptible(fc, req); + + if (req->aborted) + goto aborted; + if (req->state == FUSE_REQ_FINISHED) + return; - if (!req->interrupted) { - req->out.h.error = -EINTR; req->interrupted = 1; + if (req->state == FUSE_REQ_SENT) + queue_interrupt(fc, req); + } + + if (req->force) { + spin_unlock(&fc->lock); + wait_event(req->waitq, req->state == FUSE_REQ_FINISHED); + spin_lock(&fc->lock); + } else { + sigset_t oldset; + + /* Only fatal signals may interrupt this */ + block_sigs(&oldset); + wait_answer_interruptible(fc, req); + restore_sigs(&oldset); } + + if (req->aborted) + goto aborted; + if (req->state == FUSE_REQ_FINISHED) + return; + + req->out.h.error = -EINTR; + req->aborted = 1; + + aborted: if (req->locked) { /* This is uninterruptible sleep, because data is being copied to/from the buffers of req. During @@ -268,8 +307,11 @@ static void request_wait_answer(struct fuse_conn *fc, struct fuse_req *req) if (req->state == FUSE_REQ_PENDING) { list_del(&req->list); __fuse_put_request(req); - } else if (req->state == FUSE_REQ_SENT) - background_request(fc, req); + } else if (req->state == FUSE_REQ_SENT) { + spin_unlock(&fc->lock); + wait_event(req->waitq, req->state == FUSE_REQ_FINISHED); + spin_lock(&fc->lock); + } } static unsigned len_args(unsigned numargs, struct fuse_arg *args) @@ -283,13 +325,19 @@ static unsigned len_args(unsigned numargs, struct fuse_arg *args) return nbytes; } +static u64 fuse_get_unique(struct fuse_conn *fc) + { + fc->reqctr++; + /* zero is special */ + if (fc->reqctr == 0) + fc->reqctr = 1; + + return fc->reqctr; +} + static void queue_request(struct fuse_conn *fc, struct fuse_req *req) { - fc->reqctr++; - /* zero is special */ - if (fc->reqctr == 0) - fc->reqctr = 1; - req->in.h.unique = fc->reqctr; + req->in.h.unique = fuse_get_unique(fc); req->in.h.len = sizeof(struct fuse_in_header) + len_args(req->in.numargs, (struct fuse_arg *) req->in.args); list_add_tail(&req->list, &fc->pending); @@ -302,9 +350,6 @@ static void queue_request(struct fuse_conn *fc, struct fuse_req *req) kill_fasync(&fc->fasync, SIGIO, POLL_IN); } -/* - * This can only be interrupted by a SIGKILL - */ void request_send(struct fuse_conn *fc, struct fuse_req *req) { req->isreply = 1; @@ -327,8 +372,12 @@ void request_send(struct fuse_conn *fc, struct fuse_req *req) static void request_send_nowait(struct fuse_conn *fc, struct fuse_req *req) { spin_lock(&fc->lock); - background_request(fc, req); if (fc->connected) { + req->background = 1; + fc->num_background++; + if (fc->num_background == FUSE_MAX_BACKGROUND) + fc->blocked = 1; + queue_request(fc, req); spin_unlock(&fc->lock); } else { @@ -352,14 +401,14 @@ void request_send_background(struct fuse_conn *fc, struct fuse_req *req) /* * Lock the request. Up to the next unlock_request() there mustn't be * anything that could cause a page-fault. If the request was already - * interrupted bail out. + * aborted bail out. */ static int lock_request(struct fuse_conn *fc, struct fuse_req *req) { int err = 0; if (req) { spin_lock(&fc->lock); - if (req->interrupted) + if (req->aborted) err = -ENOENT; else req->locked = 1; @@ -369,7 +418,7 @@ static int lock_request(struct fuse_conn *fc, struct fuse_req *req) } /* - * Unlock request. If it was interrupted during being locked, the + * Unlock request. If it was aborted during being locked, the * requester thread is currently waiting for it to be unlocked, so * wake it up. */ @@ -378,7 +427,7 @@ static void unlock_request(struct fuse_conn *fc, struct fuse_req *req) if (req) { spin_lock(&fc->lock); req->locked = 0; - if (req->interrupted) + if (req->aborted) wake_up(&req->waitq); spin_unlock(&fc->lock); } @@ -557,13 +606,18 @@ static int fuse_copy_args(struct fuse_copy_state *cs, unsigned numargs, return err; } +static int request_pending(struct fuse_conn *fc) +{ + return !list_empty(&fc->pending) || !list_empty(&fc->interrupts); +} + /* Wait until a request is available on the pending list */ static void request_wait(struct fuse_conn *fc) { DECLARE_WAITQUEUE(wait, current); add_wait_queue_exclusive(&fc->waitq, &wait); - while (fc->connected && list_empty(&fc->pending)) { + while (fc->connected && !request_pending(fc)) { set_current_state(TASK_INTERRUPTIBLE); if (signal_pending(current)) break; @@ -576,12 +630,51 @@ static void request_wait(struct fuse_conn *fc) remove_wait_queue(&fc->waitq, &wait); } +/* + * Transfer an interrupt request to userspace + * + * Unlike other requests this is assembled on demand, without a need + * to allocate a separate fuse_req structure. + * + * Called with fc->lock held, releases it + */ +static int fuse_read_interrupt(struct fuse_conn *fc, struct fuse_req *req, + const struct iovec *iov, unsigned long nr_segs) +{ + struct fuse_copy_state cs; + struct fuse_in_header ih; + struct fuse_interrupt_in arg; + unsigned reqsize = sizeof(ih) + sizeof(arg); + int err; + + list_del_init(&req->intr_entry); + req->intr_unique = fuse_get_unique(fc); + memset(&ih, 0, sizeof(ih)); + memset(&arg, 0, sizeof(arg)); + ih.len = reqsize; + ih.opcode = FUSE_INTERRUPT; + ih.unique = req->intr_unique; + arg.unique = req->in.h.unique; + + spin_unlock(&fc->lock); + if (iov_length(iov, nr_segs) < reqsize) + return -EINVAL; + + fuse_copy_init(&cs, fc, 1, NULL, iov, nr_segs); + err = fuse_copy_one(&cs, &ih, sizeof(ih)); + if (!err) + err = fuse_copy_one(&cs, &arg, sizeof(arg)); + fuse_copy_finish(&cs); + + return err ? err : reqsize; +} + /* * Read a single request into the userspace filesystem's buffer. This * function waits until a request is available, then removes it from * the pending list and copies request data to userspace buffer. If - * no reply is needed (FORGET) or request has been interrupted or - * there was an error during the copying then it's finished by calling + * no reply is needed (FORGET) or request has been aborted or there + * was an error during the copying then it's finished by calling * request_end(). Otherwise add it to the processing list, and set * the 'sent' flag. */ @@ -601,7 +694,7 @@ static ssize_t fuse_dev_readv(struct file *file, const struct iovec *iov, spin_lock(&fc->lock); err = -EAGAIN; if ((file->f_flags & O_NONBLOCK) && fc->connected && - list_empty(&fc->pending)) + !request_pending(fc)) goto err_unlock; request_wait(fc); @@ -609,9 +702,15 @@ static ssize_t fuse_dev_readv(struct file *file, const struct iovec *iov, if (!fc->connected) goto err_unlock; err = -ERESTARTSYS; - if (list_empty(&fc->pending)) + if (!request_pending(fc)) goto err_unlock; + if (!list_empty(&fc->interrupts)) { + req = list_entry(fc->interrupts.next, struct fuse_req, + intr_entry); + return fuse_read_interrupt(fc, req, iov, nr_segs); + } + req = list_entry(fc->pending.next, struct fuse_req, list); req->state = FUSE_REQ_READING; list_move(&req->list, &fc->io); @@ -636,10 +735,10 @@ static ssize_t fuse_dev_readv(struct file *file, const struct iovec *iov, fuse_copy_finish(&cs); spin_lock(&fc->lock); req->locked = 0; - if (!err && req->interrupted) + if (!err && req->aborted) err = -ENOENT; if (err) { - if (!req->interrupted) + if (!req->aborted) req->out.h.error = -EIO; request_end(fc, req); return err; @@ -649,6 +748,8 @@ static ssize_t fuse_dev_readv(struct file *file, const struct iovec *iov, else { req->state = FUSE_REQ_SENT; list_move_tail(&req->list, &fc->processing); + if (req->interrupted) + queue_interrupt(fc, req); spin_unlock(&fc->lock); } return reqsize; @@ -675,7 +776,7 @@ static struct fuse_req *request_find(struct fuse_conn *fc, u64 unique) list_for_each(entry, &fc->processing) { struct fuse_req *req; req = list_entry(entry, struct fuse_req, list); - if (req->in.h.unique == unique) + if (req->in.h.unique == unique || req->intr_unique == unique) return req; } return NULL; @@ -741,17 +842,33 @@ static ssize_t fuse_dev_writev(struct file *file, const struct iovec *iov, goto err_unlock; req = request_find(fc, oh.unique); - err = -EINVAL; if (!req) goto err_unlock; - if (req->interrupted) { + if (req->aborted) { spin_unlock(&fc->lock); fuse_copy_finish(&cs); spin_lock(&fc->lock); request_end(fc, req); return -ENOENT; } + /* Is it an interrupt reply? */ + if (req->intr_unique == oh.unique) { + err = -EINVAL; + if (nbytes != sizeof(struct fuse_out_header)) + goto err_unlock; + + if (oh.error == -ENOSYS) + fc->no_interrupt = 1; + else if (oh.error == -EAGAIN) + queue_interrupt(fc, req); + + spin_unlock(&fc->lock); + fuse_copy_finish(&cs); + return nbytes; + } + + req->state = FUSE_REQ_WRITING; list_move(&req->list, &fc->io); req->out.h = oh; req->locked = 1; @@ -764,9 +881,9 @@ static ssize_t fuse_dev_writev(struct file *file, const struct iovec *iov, spin_lock(&fc->lock); req->locked = 0; if (!err) { - if (req->interrupted) + if (req->aborted) err = -ENOENT; - } else if (!req->interrupted) + } else if (!req->aborted) req->out.h.error = -EIO; request_end(fc, req); @@ -800,7 +917,7 @@ static unsigned fuse_dev_poll(struct file *file, poll_table *wait) spin_lock(&fc->lock); if (!fc->connected) mask = POLLERR; - else if (!list_empty(&fc->pending)) + else if (request_pending(fc)) mask |= POLLIN | POLLRDNORM; spin_unlock(&fc->lock); @@ -826,7 +943,7 @@ static void end_requests(struct fuse_conn *fc, struct list_head *head) /* * Abort requests under I/O * - * The requests are set to interrupted and finished, and the request + * The requests are set to aborted and finished, and the request * waiter is woken up. This will make request_wait_answer() wait * until the request is unlocked and then return. * @@ -841,7 +958,7 @@ static void end_io_requests(struct fuse_conn *fc) list_entry(fc->io.next, struct fuse_req, list); void (*end) (struct fuse_conn *, struct fuse_req *) = req->end; - req->interrupted = 1; + req->aborted = 1; req->out.h.error = -ECONNABORTED; req->state = FUSE_REQ_FINISHED; list_del_init(&req->list); @@ -874,19 +991,20 @@ static void end_io_requests(struct fuse_conn *fc) * onto the pending list is prevented by req->connected being false. * * Progression of requests under I/O to the processing list is - * prevented by the req->interrupted flag being true for these - * requests. For this reason requests on the io list must be aborted - * first. + * prevented by the req->aborted flag being true for these requests. + * For this reason requests on the io list must be aborted first. */ void fuse_abort_conn(struct fuse_conn *fc) { spin_lock(&fc->lock); if (fc->connected) { fc->connected = 0; + fc->blocked = 0; end_io_requests(fc); end_requests(fc, &fc->pending); end_requests(fc, &fc->processing); wake_up_all(&fc->waitq); + wake_up_all(&fc->blocked_waitq); kill_fasync(&fc->fasync, SIGIO, POLL_IN); } spin_unlock(&fc->lock); @@ -902,7 +1020,7 @@ static int fuse_dev_release(struct inode *inode, struct file *file) end_requests(fc, &fc->processing); spin_unlock(&fc->lock); fasync_helper(-1, file, 0, &fc->fasync); - kobject_put(&fc->kobj); + fuse_conn_put(fc); } return 0; diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index 8d7546e83..5d7c726be 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -1,6 +1,6 @@ /* FUSE: Filesystem in Userspace - Copyright (C) 2001-2005 Miklos Szeredi + Copyright (C) 2001-2006 Miklos Szeredi This program can be distributed under the terms of the GNU GPL. See the file COPYING. @@ -14,6 +14,33 @@ #include #include +#if BITS_PER_LONG >= 64 +static inline void fuse_dentry_settime(struct dentry *entry, u64 time) +{ + entry->d_time = time; +} + +static inline u64 fuse_dentry_time(struct dentry *entry) +{ + return entry->d_time; +} +#else +/* + * On 32 bit archs store the high 32 bits of time in d_fsdata + */ +static void fuse_dentry_settime(struct dentry *entry, u64 time) +{ + entry->d_time = time; + entry->d_fsdata = (void *) (unsigned long) (time >> 32); +} + +static u64 fuse_dentry_time(struct dentry *entry) +{ + return (u64) entry->d_time + + ((u64) (unsigned long) entry->d_fsdata << 32); +} +#endif + /* * FUSE caches dentries and attributes with separate timeout. The * time in jiffies until the dentry/attributes are valid is stored in @@ -23,10 +50,13 @@ /* * Calculate the time in jiffies until a dentry/attributes are valid */ -static unsigned long time_to_jiffies(unsigned long sec, unsigned long nsec) +static u64 time_to_jiffies(unsigned long sec, unsigned long nsec) { - struct timespec ts = {sec, nsec}; - return jiffies + timespec_to_jiffies(&ts); + if (sec || nsec) { + struct timespec ts = {sec, nsec}; + return get_jiffies_64() + timespec_to_jiffies(&ts); + } else + return 0; } /* @@ -35,7 +65,8 @@ static unsigned long time_to_jiffies(unsigned long sec, unsigned long nsec) */ static void fuse_change_timeout(struct dentry *entry, struct fuse_entry_out *o) { - entry->d_time = time_to_jiffies(o->entry_valid, o->entry_valid_nsec); + fuse_dentry_settime(entry, + time_to_jiffies(o->entry_valid, o->entry_valid_nsec)); if (entry->d_inode) get_fuse_inode(entry->d_inode)->i_time = time_to_jiffies(o->attr_valid, o->attr_valid_nsec); @@ -47,7 +78,7 @@ static void fuse_change_timeout(struct dentry *entry, struct fuse_entry_out *o) */ void fuse_invalidate_attr(struct inode *inode) { - get_fuse_inode(inode)->i_time = jiffies - 1; + get_fuse_inode(inode)->i_time = 0; } /* @@ -60,7 +91,7 @@ void fuse_invalidate_attr(struct inode *inode) */ static void fuse_invalidate_entry_cache(struct dentry *entry) { - entry->d_time = jiffies - 1; + fuse_dentry_settime(entry, 0); } /* @@ -79,7 +110,6 @@ static void fuse_lookup_init(struct fuse_req *req, struct inode *dir, { req->in.h.opcode = FUSE_LOOKUP; req->in.h.nodeid = get_node_id(dir); - req->inode = dir; req->in.numargs = 1; req->in.args[0].size = entry->d_name.len + 1; req->in.args[0].value = entry->d_name.name; @@ -103,7 +133,7 @@ static int fuse_dentry_revalidate(struct dentry *entry, struct nameidata *nd) if (inode && is_bad_inode(inode)) return 0; - else if (time_after(jiffies, entry->d_time)) { + else if (fuse_dentry_time(entry) < get_jiffies_64()) { int err; struct fuse_entry_out outarg; struct fuse_conn *fc; @@ -224,6 +254,20 @@ static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry, return NULL; } +/* + * Synchronous release for the case when something goes wrong in CREATE_OPEN + */ +static void fuse_sync_release(struct fuse_conn *fc, struct fuse_file *ff, + u64 nodeid, int flags) +{ + struct fuse_req *req; + + req = fuse_release_fill(ff, nodeid, flags, FUSE_RELEASE); + req->force = 1; + request_send(fc, req); + fuse_put_request(fc, req); +} + /* * Atomic create+open operation * @@ -237,6 +281,7 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry, int mode, struct inode *inode; struct fuse_conn *fc = get_fuse_conn(dir); struct fuse_req *req; + struct fuse_req *forget_req; struct fuse_open_in inarg; struct fuse_open_out outopen; struct fuse_entry_out outentry; @@ -247,9 +292,14 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry, int mode, if (fc->no_create) return -ENOSYS; + forget_req = fuse_get_req(fc); + if (IS_ERR(forget_req)) + return PTR_ERR(forget_req); + req = fuse_get_req(fc); + err = PTR_ERR(req); if (IS_ERR(req)) - return PTR_ERR(req); + goto out_put_forget_req; err = -ENOMEM; ff = fuse_file_alloc(); @@ -262,7 +312,6 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry, int mode, inarg.mode = mode; req->in.h.opcode = FUSE_CREATE; req->in.h.nodeid = get_node_id(dir); - req->inode = dir; req->in.numargs = 2; req->in.args[0].size = sizeof(inarg); req->in.args[0].value = &inarg; @@ -285,25 +334,23 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry, int mode, if (!S_ISREG(outentry.attr.mode) || invalid_nodeid(outentry.nodeid)) goto out_free_ff; + fuse_put_request(fc, req); inode = fuse_iget(dir->i_sb, outentry.nodeid, outentry.generation, &outentry.attr); - err = -ENOMEM; if (!inode) { flags &= ~(O_CREAT | O_EXCL | O_TRUNC); ff->fh = outopen.fh; - /* Special release, with inode = NULL, this will - trigger a 'forget' request when the release is - complete */ - fuse_send_release(fc, ff, outentry.nodeid, NULL, flags, 0); - goto out_put_request; + fuse_sync_release(fc, ff, outentry.nodeid, flags); + fuse_send_forget(fc, forget_req, outentry.nodeid, 1); + return -ENOMEM; } - fuse_put_request(fc, req); + fuse_put_request(fc, forget_req); d_instantiate(entry, inode); fuse_change_timeout(entry, &outentry); file = lookup_instantiate_filp(nd, entry, generic_file_open); if (IS_ERR(file)) { ff->fh = outopen.fh; - fuse_send_release(fc, ff, outentry.nodeid, inode, flags, 0); + fuse_sync_release(fc, ff, outentry.nodeid, flags); return PTR_ERR(file); } fuse_finish_open(inode, file, ff, &outopen); @@ -313,6 +360,8 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry, int mode, fuse_file_free(ff); out_put_request: fuse_put_request(fc, req); + out_put_forget_req: + fuse_put_request(fc, forget_req); return err; } @@ -328,7 +377,6 @@ static int create_new_entry(struct fuse_conn *fc, struct fuse_req *req, int err; req->in.h.nodeid = get_node_id(dir); - req->inode = dir; req->out.numargs = 1; req->out.args[0].size = sizeof(outarg); req->out.args[0].value = &outarg; @@ -448,7 +496,6 @@ static int fuse_unlink(struct inode *dir, struct dentry *entry) req->in.h.opcode = FUSE_UNLINK; req->in.h.nodeid = get_node_id(dir); - req->inode = dir; req->in.numargs = 1; req->in.args[0].size = entry->d_name.len + 1; req->in.args[0].value = entry->d_name.name; @@ -480,7 +527,6 @@ static int fuse_rmdir(struct inode *dir, struct dentry *entry) req->in.h.opcode = FUSE_RMDIR; req->in.h.nodeid = get_node_id(dir); - req->inode = dir; req->in.numargs = 1; req->in.args[0].size = entry->d_name.len + 1; req->in.args[0].value = entry->d_name.name; @@ -510,8 +556,6 @@ static int fuse_rename(struct inode *olddir, struct dentry *oldent, inarg.newdir = get_node_id(newdir); req->in.h.opcode = FUSE_RENAME; req->in.h.nodeid = get_node_id(olddir); - req->inode = olddir; - req->inode2 = newdir; req->in.numargs = 3; req->in.args[0].size = sizeof(inarg); req->in.args[0].value = &inarg; @@ -558,7 +602,6 @@ static int fuse_link(struct dentry *entry, struct inode *newdir, memset(&inarg, 0, sizeof(inarg)); inarg.oldnodeid = get_node_id(inode); req->in.h.opcode = FUSE_LINK; - req->inode2 = inode; req->in.numargs = 2; req->in.args[0].size = sizeof(inarg); req->in.args[0].value = &inarg; @@ -587,7 +630,6 @@ int fuse_do_getattr(struct inode *inode) req->in.h.opcode = FUSE_GETATTR; req->in.h.nodeid = get_node_id(inode); - req->inode = inode; req->out.numargs = 1; req->out.args[0].size = sizeof(arg); req->out.args[0].value = &arg; @@ -655,7 +697,7 @@ static int fuse_revalidate(struct dentry *entry) if (!fuse_allow_task(fc, current)) return -EACCES; if (get_node_id(inode) != FUSE_ROOT_ID && - time_before_eq(jiffies, fi->i_time)) + fi->i_time >= get_jiffies_64()) return 0; return fuse_do_getattr(inode); @@ -679,7 +721,6 @@ static int fuse_access(struct inode *inode, int mask) inarg.mask = mask; req->in.h.opcode = FUSE_ACCESS; req->in.h.nodeid = get_node_id(inode); - req->inode = inode; req->in.numargs = 1; req->in.args[0].size = sizeof(inarg); req->in.args[0].value = &inarg; @@ -820,7 +861,6 @@ static char *read_link(struct dentry *dentry) } req->in.h.opcode = FUSE_READLINK; req->in.h.nodeid = get_node_id(inode); - req->inode = inode; req->out.argvar = 1; req->out.numargs = 1; req->out.args[0].size = PAGE_SIZE - 1; @@ -895,14 +935,30 @@ static void iattr_to_fattr(struct iattr *iattr, struct fuse_setattr_in *arg) } } +static void fuse_vmtruncate(struct inode *inode, loff_t offset) +{ + struct fuse_conn *fc = get_fuse_conn(inode); + int need_trunc; + + spin_lock(&fc->lock); + need_trunc = inode->i_size > offset; + i_size_write(inode, offset); + spin_unlock(&fc->lock); + + if (need_trunc) { + struct address_space *mapping = inode->i_mapping; + unmap_mapping_range(mapping, offset + PAGE_SIZE - 1, 0, 1); + truncate_inode_pages(mapping, offset); + } +} + /* * Set attributes, and at the same time refresh them. * * Truncation is slightly complicated, because the 'truncate' request * may fail, in which case we don't want to touch the mapping. - * vmtruncate() doesn't allow for this case. So do the rlimit - * checking by hand and call vmtruncate() only after the file has - * actually been truncated. + * vmtruncate() doesn't allow for this case, so do the rlimit checking + * and the actual truncation by hand. */ static int fuse_setattr(struct dentry *entry, struct iattr *attr) { @@ -939,7 +995,6 @@ static int fuse_setattr(struct dentry *entry, struct iattr *attr) iattr_to_fattr(attr, &inarg); req->in.h.opcode = FUSE_SETATTR; req->in.h.nodeid = get_node_id(inode); - req->inode = inode; req->in.numargs = 1; req->in.args[0].size = sizeof(inarg); req->in.args[0].value = &inarg; @@ -954,12 +1009,8 @@ static int fuse_setattr(struct dentry *entry, struct iattr *attr) make_bad_inode(inode); err = -EIO; } else { - if (is_truncate) { - loff_t origsize = i_size_read(inode); - i_size_write(inode, outarg.attr.size); - if (origsize > outarg.attr.size) - vmtruncate(inode, outarg.attr.size); - } + if (is_truncate) + fuse_vmtruncate(inode, outarg.attr.size); fuse_change_attributes(inode, &outarg.attr); fi->i_time = time_to_jiffies(outarg.attr_valid, outarg.attr_valid_nsec); @@ -1002,7 +1053,6 @@ static int fuse_setxattr(struct dentry *entry, const char *name, inarg.flags = flags; req->in.h.opcode = FUSE_SETXATTR; req->in.h.nodeid = get_node_id(inode); - req->inode = inode; req->in.numargs = 3; req->in.args[0].size = sizeof(inarg); req->in.args[0].value = &inarg; @@ -1041,7 +1091,6 @@ static ssize_t fuse_getxattr(struct dentry *entry, const char *name, inarg.size = size; req->in.h.opcode = FUSE_GETXATTR; req->in.h.nodeid = get_node_id(inode); - req->inode = inode; req->in.numargs = 2; req->in.args[0].size = sizeof(inarg); req->in.args[0].value = &inarg; @@ -1091,7 +1140,6 @@ static ssize_t fuse_listxattr(struct dentry *entry, char *list, size_t size) inarg.size = size; req->in.h.opcode = FUSE_LISTXATTR; req->in.h.nodeid = get_node_id(inode); - req->inode = inode; req->in.numargs = 1; req->in.args[0].size = sizeof(inarg); req->in.args[0].value = &inarg; @@ -1135,7 +1183,6 @@ static int fuse_removexattr(struct dentry *entry, const char *name) req->in.h.opcode = FUSE_REMOVEXATTR; req->in.h.nodeid = get_node_id(inode); - req->inode = inode; req->in.numargs = 1; req->in.args[0].size = strlen(name) + 1; req->in.args[0].value = name; diff --git a/fs/fuse/file.c b/fs/fuse/file.c index fc342cf7c..4e174c883 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c @@ -30,7 +30,6 @@ static int fuse_send_open(struct inode *inode, struct file *file, int isdir, inarg.flags = file->f_flags & ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC); req->in.h.opcode = isdir ? FUSE_OPENDIR : FUSE_OPEN; req->in.h.nodeid = get_node_id(inode); - req->inode = inode; req->in.numargs = 1; req->in.args[0].size = sizeof(inarg); req->in.args[0].value = &inarg; @@ -49,8 +48,8 @@ struct fuse_file *fuse_file_alloc(void) struct fuse_file *ff; ff = kmalloc(sizeof(struct fuse_file), GFP_KERNEL); if (ff) { - ff->release_req = fuse_request_alloc(); - if (!ff->release_req) { + ff->reserved_req = fuse_request_alloc(); + if (!ff->reserved_req) { kfree(ff); ff = NULL; } @@ -60,7 +59,7 @@ struct fuse_file *fuse_file_alloc(void) void fuse_file_free(struct fuse_file *ff) { - fuse_request_free(ff->release_req); + fuse_request_free(ff->reserved_req); kfree(ff); } @@ -113,37 +112,22 @@ int fuse_open_common(struct inode *inode, struct file *file, int isdir) return err; } -/* Special case for failed iget in CREATE */ -static void fuse_release_end(struct fuse_conn *fc, struct fuse_req *req) +struct fuse_req *fuse_release_fill(struct fuse_file *ff, u64 nodeid, int flags, + int opcode) { - /* If called from end_io_requests(), req has more than one - reference and fuse_reset_request() cannot work */ - if (fc->connected) { - u64 nodeid = req->in.h.nodeid; - fuse_reset_request(req); - fuse_send_forget(fc, req, nodeid, 1); - } else - fuse_put_request(fc, req); -} - -void fuse_send_release(struct fuse_conn *fc, struct fuse_file *ff, - u64 nodeid, struct inode *inode, int flags, int isdir) -{ - struct fuse_req * req = ff->release_req; + struct fuse_req *req = ff->reserved_req; struct fuse_release_in *inarg = &req->misc.release_in; inarg->fh = ff->fh; inarg->flags = flags; - req->in.h.opcode = isdir ? FUSE_RELEASEDIR : FUSE_RELEASE; + req->in.h.opcode = opcode; req->in.h.nodeid = nodeid; - req->inode = inode; req->in.numargs = 1; req->in.args[0].size = sizeof(struct fuse_release_in); req->in.args[0].value = inarg; - request_send_background(fc, req); - if (!inode) - req->end = fuse_release_end; kfree(ff); + + return req; } int fuse_release_common(struct inode *inode, struct file *file, int isdir) @@ -151,8 +135,15 @@ int fuse_release_common(struct inode *inode, struct file *file, int isdir) struct fuse_file *ff = file->private_data; if (ff) { struct fuse_conn *fc = get_fuse_conn(inode); - u64 nodeid = get_node_id(inode); - fuse_send_release(fc, ff, nodeid, inode, file->f_flags, isdir); + struct fuse_req *req; + + req = fuse_release_fill(ff, get_node_id(inode), file->f_flags, + isdir ? FUSE_RELEASEDIR : FUSE_RELEASE); + + /* Hold vfsmount and dentry until release is finished */ + req->vfsmount = mntget(file->f_vfsmnt); + req->dentry = dget(file->f_dentry); + request_send_background(fc, req); } /* Return value is ignored by VFS */ @@ -169,7 +160,29 @@ static int fuse_release(struct inode *inode, struct file *file) return fuse_release_common(inode, file, 0); } -static int fuse_flush(struct file *file) +/* + * Scramble the ID space with XTEA, so that the value of the files_struct + * pointer is not exposed to userspace. + */ +static u64 fuse_lock_owner_id(struct fuse_conn *fc, fl_owner_t id) +{ + u32 *k = fc->scramble_key; + u64 v = (unsigned long) id; + u32 v0 = v; + u32 v1 = v >> 32; + u32 sum = 0; + int i; + + for (i = 0; i < 32; i++) { + v0 += ((v1 << 4 ^ v1 >> 5) + v1) ^ (sum + k[sum & 3]); + sum += 0x9E3779B9; + v1 += ((v0 << 4 ^ v0 >> 5) + v0) ^ (sum + k[sum>>11 & 3]); + } + + return (u64) v0 + ((u64) v1 << 32); +} + +static int fuse_flush(struct file *file, fl_owner_t id) { struct inode *inode = file->f_dentry->d_inode; struct fuse_conn *fc = get_fuse_conn(inode); @@ -184,19 +197,16 @@ static int fuse_flush(struct file *file) if (fc->no_flush) return 0; - req = fuse_get_req(fc); - if (IS_ERR(req)) - return PTR_ERR(req); - + req = fuse_get_req_nofail(fc, file); memset(&inarg, 0, sizeof(inarg)); inarg.fh = ff->fh; + inarg.lock_owner = fuse_lock_owner_id(fc, id); req->in.h.opcode = FUSE_FLUSH; req->in.h.nodeid = get_node_id(inode); - req->inode = inode; - req->file = file; req->in.numargs = 1; req->in.args[0].size = sizeof(inarg); req->in.args[0].value = &inarg; + req->force = 1; request_send(fc, req); err = req->out.h.error; fuse_put_request(fc, req); @@ -232,8 +242,6 @@ int fuse_fsync_common(struct file *file, struct dentry *de, int datasync, inarg.fsync_flags = datasync ? 1 : 0; req->in.h.opcode = isdir ? FUSE_FSYNCDIR : FUSE_FSYNC; req->in.h.nodeid = get_node_id(inode); - req->inode = inode; - req->file = file; req->in.numargs = 1; req->in.args[0].size = sizeof(inarg); req->in.args[0].value = &inarg; @@ -266,8 +274,6 @@ void fuse_read_fill(struct fuse_req *req, struct file *file, inarg->size = count; req->in.h.opcode = opcode; req->in.h.nodeid = get_node_id(inode); - req->inode = inode; - req->file = file; req->in.numargs = 1; req->in.args[0].size = sizeof(struct fuse_read_in); req->in.args[0].value = inarg; @@ -342,6 +348,8 @@ static void fuse_send_readpages(struct fuse_req *req, struct file *file, req->out.page_zeroing = 1; fuse_read_fill(req, file, inode, pos, count, FUSE_READ); if (fc->async_read) { + get_file(file); + req->file = file; req->end = fuse_readpages_end; request_send_background(fc, req); } else { @@ -387,14 +395,16 @@ static int fuse_readpages(struct file *file, struct address_space *mapping, struct fuse_readpages_data data; int err; + err = -EIO; if (is_bad_inode(inode)) - return -EIO; + goto clean_pages_up; data.file = file; data.inode = inode; data.req = fuse_get_req(fc); + err = PTR_ERR(data.req); if (IS_ERR(data.req)) - return PTR_ERR(data.req); + goto clean_pages_up; err = read_cache_pages(mapping, pages, fuse_readpages_fill, &data); if (!err) { @@ -404,6 +414,10 @@ static int fuse_readpages(struct file *file, struct address_space *mapping, fuse_put_request(fc, data.req); } return err; + +clean_pages_up: + put_pages_list(pages); + return err; } static size_t fuse_send_write(struct fuse_req *req, struct file *file, @@ -420,8 +434,6 @@ static size_t fuse_send_write(struct fuse_req *req, struct file *file, inarg.size = count; req->in.h.opcode = FUSE_WRITE; req->in.h.nodeid = get_node_id(inode); - req->inode = inode; - req->file = file; req->in.argpages = 1; req->in.numargs = 2; req->in.args[0].size = sizeof(struct fuse_write_in); @@ -469,8 +481,10 @@ static int fuse_commit_write(struct file *file, struct page *page, err = -EIO; if (!err) { pos += count; - if (pos > i_size_read(inode)) + spin_lock(&fc->lock); + if (pos > inode->i_size) i_size_write(inode, pos); + spin_unlock(&fc->lock); if (offset == 0 && to == PAGE_CACHE_SIZE) { clear_page_dirty(page); @@ -574,8 +588,12 @@ static ssize_t fuse_direct_io(struct file *file, const char __user *buf, } fuse_put_request(fc, req); if (res > 0) { - if (write && pos > i_size_read(inode)) - i_size_write(inode, pos); + if (write) { + spin_lock(&fc->lock); + if (pos > inode->i_size) + i_size_write(inode, pos); + spin_unlock(&fc->lock); + } *ppos = pos; } fuse_invalidate_attr(inode); @@ -619,6 +637,126 @@ static int fuse_set_page_dirty(struct page *page) return 0; } +static int convert_fuse_file_lock(const struct fuse_file_lock *ffl, + struct file_lock *fl) +{ + switch (ffl->type) { + case F_UNLCK: + break; + + case F_RDLCK: + case F_WRLCK: + if (ffl->start > OFFSET_MAX || ffl->end > OFFSET_MAX || + ffl->end < ffl->start) + return -EIO; + + fl->fl_start = ffl->start; + fl->fl_end = ffl->end; + fl->fl_pid = ffl->pid; + break; + + default: + return -EIO; + } + fl->fl_type = ffl->type; + return 0; +} + +static void fuse_lk_fill(struct fuse_req *req, struct file *file, + const struct file_lock *fl, int opcode, pid_t pid) +{ + struct inode *inode = file->f_dentry->d_inode; + struct fuse_conn *fc = get_fuse_conn(inode); + struct fuse_file *ff = file->private_data; + struct fuse_lk_in *arg = &req->misc.lk_in; + + arg->fh = ff->fh; + arg->owner = fuse_lock_owner_id(fc, fl->fl_owner); + arg->lk.start = fl->fl_start; + arg->lk.end = fl->fl_end; + arg->lk.type = fl->fl_type; + arg->lk.pid = pid; + req->in.h.opcode = opcode; + req->in.h.nodeid = get_node_id(inode); + req->in.numargs = 1; + req->in.args[0].size = sizeof(*arg); + req->in.args[0].value = arg; +} + +static int fuse_getlk(struct file *file, struct file_lock *fl) +{ + struct inode *inode = file->f_dentry->d_inode; + struct fuse_conn *fc = get_fuse_conn(inode); + struct fuse_req *req; + struct fuse_lk_out outarg; + int err; + + req = fuse_get_req(fc); + if (IS_ERR(req)) + return PTR_ERR(req); + + fuse_lk_fill(req, file, fl, FUSE_GETLK, 0); + req->out.numargs = 1; + req->out.args[0].size = sizeof(outarg); + req->out.args[0].value = &outarg; + request_send(fc, req); + err = req->out.h.error; + fuse_put_request(fc, req); + if (!err) + err = convert_fuse_file_lock(&outarg.lk, fl); + + return err; +} + +static int fuse_setlk(struct file *file, struct file_lock *fl) +{ + struct inode *inode = file->f_dentry->d_inode; + struct fuse_conn *fc = get_fuse_conn(inode); + struct fuse_req *req; + int opcode = (fl->fl_flags & FL_SLEEP) ? FUSE_SETLKW : FUSE_SETLK; + pid_t pid = fl->fl_type != F_UNLCK ? current->tgid : 0; + int err; + + /* Unlock on close is handled by the flush method */ + if (fl->fl_flags & FL_CLOSE) + return 0; + + req = fuse_get_req(fc); + if (IS_ERR(req)) + return PTR_ERR(req); + + fuse_lk_fill(req, file, fl, opcode, pid); + request_send(fc, req); + err = req->out.h.error; + /* locking is restartable */ + if (err == -EINTR) + err = -ERESTARTSYS; + fuse_put_request(fc, req); + return err; +} + +static int fuse_file_lock(struct file *file, int cmd, struct file_lock *fl) +{ + struct inode *inode = file->f_dentry->d_inode; + struct fuse_conn *fc = get_fuse_conn(inode); + int err; + + if (cmd == F_GETLK) { + if (fc->no_lock) { + if (!posix_test_lock(file, fl, fl)) + fl->fl_type = F_UNLCK; + err = 0; + } else + err = fuse_getlk(file, fl); + } else { + if (fc->no_lock) + err = posix_lock_file_wait(file, fl); + else + err = fuse_setlk(file, fl); + } + return err; +} + static const struct file_operations fuse_file_operations = { .llseek = generic_file_llseek, .read = generic_file_read, @@ -628,6 +766,7 @@ static const struct file_operations fuse_file_operations = { .flush = fuse_flush, .release = fuse_release, .fsync = fuse_fsync, + .lock = fuse_file_lock, .sendfile = generic_file_sendfile, }; @@ -639,10 +778,11 @@ static const struct file_operations fuse_direct_io_file_operations = { .flush = fuse_flush, .release = fuse_release, .fsync = fuse_fsync, + .lock = fuse_file_lock, /* no mmap and sendfile */ }; -static struct address_space_operations fuse_file_aops = { +static const struct address_space_operations fuse_file_aops = { .readpage = fuse_readpage, .prepare_write = fuse_prepare_write, .commit_write = fuse_commit_write, diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index 0474202cb..69c7750d5 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h @@ -8,12 +8,13 @@ #include #include +#include #include #include #include #include #include -#include +#include /** Max number of pages that can be used in a single read request */ #define FUSE_MAX_PAGES_PER_REQ 32 @@ -24,6 +25,9 @@ /** It could be as large as PATH_MAX, but would that have any uses? */ #define FUSE_NAME_MAX 1024 +/** Number of dentries for each connection in the control filesystem */ +#define FUSE_CTL_NUM_DENTRIES 3 + /** If the FUSE_DEFAULT_PERMISSIONS flag is given, the filesystem module will check permissions based on the file mode. Otherwise no permission checking is done in the kernel */ @@ -33,6 +37,11 @@ doing the mount will be allowed to access the filesystem */ #define FUSE_ALLOW_OTHER (1 << 1) +/** List of active connections */ +extern struct list_head fuse_conn_list; + +/** Global mutex protecting fuse_conn_list and the control filesystem */ +extern struct mutex fuse_mutex; /** FUSE inode */ struct fuse_inode { @@ -50,13 +59,13 @@ struct fuse_inode { struct fuse_req *forget_req; /** Time in jiffies until the file attributes are valid */ - unsigned long i_time; + u64 i_time; }; /** FUSE specific file data */ struct fuse_file { /** Request reserved for flush and release */ - struct fuse_req *release_req; + struct fuse_req *reserved_req; /** File handle used by userspace */ u64 fh; @@ -122,6 +131,7 @@ enum fuse_req_state { FUSE_REQ_PENDING, FUSE_REQ_READING, FUSE_REQ_SENT, + FUSE_REQ_WRITING, FUSE_REQ_FINISHED }; @@ -135,12 +145,15 @@ struct fuse_req { fuse_conn */ struct list_head list; - /** Entry on the background list */ - struct list_head bg_entry; + /** Entry on the interrupts list */ + struct list_head intr_entry; /** refcount */ atomic_t count; + /** Unique ID for the interrupt request */ + u64 intr_unique; + /* * The following bitfields are either set once before the * request is queued or setting/clearing them is protected by @@ -150,12 +163,18 @@ struct fuse_req { /** True if the request has reply */ unsigned isreply:1; - /** The request was interrupted */ - unsigned interrupted:1; + /** Force sending of the request even if interrupted */ + unsigned force:1; + + /** The request was aborted */ + unsigned aborted:1; /** Request is sent in the background */ unsigned background:1; + /** The request has been interrupted */ + unsigned interrupted:1; + /** Data is being copied to/from the request */ unsigned locked:1; @@ -181,6 +200,7 @@ struct fuse_req { struct fuse_init_in init_in; struct fuse_init_out init_out; struct fuse_read_in read_in; + struct fuse_lk_in lk_in; } misc; /** page vector */ @@ -192,17 +212,20 @@ struct fuse_req { /** offset of data on first page */ unsigned page_offset; - /** Inode used in the request */ - struct inode *inode; - - /** Second inode used in the request (or NULL) */ - struct inode *inode2; - /** File used in the request (or NULL) */ struct file *file; + /** vfsmount used in release */ + struct vfsmount *vfsmount; + + /** dentry used in release */ + struct dentry *dentry; + /** Request completion callback */ void (*end)(struct fuse_conn *, struct fuse_req *); + + /** Request is stolen from fuse_file->reserved_req */ + struct file *stolen_file; }; /** @@ -216,6 +239,9 @@ struct fuse_conn { /** Lock protecting accessess to members of this structure */ spinlock_t lock; + /** Refcount */ + atomic_t count; + /** The user id for this mount */ uid_t user_id; @@ -243,13 +269,12 @@ struct fuse_conn { /** The list of requests under I/O */ struct list_head io; - /** Requests put in the background (RELEASE or any other - interrupted request) */ - struct list_head background; - /** Number of requests currently in the background */ unsigned num_background; + /** Pending interrupts */ + struct list_head interrupts; + /** Flag indicating if connection is blocked. This will be the case before the INIT reply is received, and if there are too many outstading backgrounds requests */ @@ -258,15 +283,9 @@ struct fuse_conn { /** waitq for blocked connection */ wait_queue_head_t blocked_waitq; - /** RW semaphore for exclusion with fuse_put_super() */ - struct rw_semaphore sbput_sem; - /** The next unique request id */ u64 reqctr; - /** Mount is active */ - unsigned mounted; - /** Connection established, cleared on umount, connection abort and device release */ unsigned connected; @@ -305,12 +324,18 @@ struct fuse_conn { /** Is removexattr not implemented by fs? */ unsigned no_removexattr : 1; + /** Are file locking primitives not implemented by fs? */ + unsigned no_lock : 1; + /** Is access not implemented by fs? */ unsigned no_access : 1; /** Is create not implemented by fs? */ unsigned no_create : 1; + /** Is interrupt not implemented by fs? */ + unsigned no_interrupt : 1; + /** The number of requests waiting for completion */ atomic_t num_waiting; @@ -320,11 +345,23 @@ struct fuse_conn { /** Backing dev info */ struct backing_dev_info bdi; - /** kobject */ - struct kobject kobj; + /** Entry on the fuse_conn_list */ + struct list_head entry; + + /** Unique ID */ + u64 id; + + /** Dentries in the control filesystem */ + struct dentry *ctl_dentry[FUSE_CTL_NUM_DENTRIES]; + + /** number of dentries used in the above array */ + int ctl_ndents; /** O_ASYNC requests */ struct fasync_struct *fasync; + + /** Key for lock owner ID scrambling */ + u32 scramble_key[4]; }; static inline struct fuse_conn *get_fuse_conn_super(struct super_block *sb) @@ -337,11 +374,6 @@ static inline struct fuse_conn *get_fuse_conn(struct inode *inode) return get_fuse_conn_super(inode->i_sb); } -static inline struct fuse_conn *get_fuse_conn_kobj(struct kobject *obj) -{ - return container_of(obj, struct fuse_conn, kobj); -} - static inline struct fuse_inode *get_fuse_inode(struct inode *inode) { return container_of(inode, struct fuse_inode, inode); @@ -383,12 +415,9 @@ void fuse_file_free(struct fuse_file *ff); void fuse_finish_open(struct inode *inode, struct file *file, struct fuse_file *ff, struct fuse_open_out *outarg); -/** - * Send a RELEASE request - */ -void fuse_send_release(struct fuse_conn *fc, struct fuse_file *ff, - u64 nodeid, struct inode *inode, int flags, int isdir); - +/** */ +struct fuse_req *fuse_release_fill(struct fuse_file *ff, u64 nodeid, int flags, + int opcode); /** * Send RELEASE or RELEASEDIR request */ @@ -435,6 +464,9 @@ int fuse_dev_init(void); */ void fuse_dev_cleanup(void); +int fuse_ctl_init(void); +void fuse_ctl_cleanup(void); + /** * Allocate a request */ @@ -446,14 +478,14 @@ struct fuse_req *fuse_request_alloc(void); void fuse_request_free(struct fuse_req *req); /** - * Reinitialize a request, the preallocated flag is left unmodified + * Get a request, may fail with -ENOMEM */ -void fuse_reset_request(struct fuse_req *req); +struct fuse_req *fuse_get_req(struct fuse_conn *fc); /** - * Reserve a preallocated request + * Gets a requests for a file operation, always succeeds */ -struct fuse_req *fuse_get_req(struct fuse_conn *fc); +struct fuse_req *fuse_get_req_nofail(struct fuse_conn *fc, struct file *file); /** * Decrement reference count of a request. If count goes to zero free @@ -476,11 +508,6 @@ void request_send_noreply(struct fuse_conn *fc, struct fuse_req *req); */ void request_send_background(struct fuse_conn *fc, struct fuse_req *req); -/** - * Release inodes and file associated with background request - */ -void fuse_release_background(struct fuse_conn *fc, struct fuse_req *req); - /* Abort all requests */ void fuse_abort_conn(struct fuse_conn *fc); @@ -493,3 +520,23 @@ int fuse_do_getattr(struct inode *inode); * Invalidate inode attributes */ void fuse_invalidate_attr(struct inode *inode); + +/** + * Acquire reference to fuse_conn + */ +struct fuse_conn *fuse_conn_get(struct fuse_conn *fc); + +/** + * Release reference to fuse_conn + */ +void fuse_conn_put(struct fuse_conn *fc); + +/** + * Add connection to control filesystem + */ +int fuse_ctl_add_conn(struct fuse_conn *fc); + +/** + * Remove connection from control filesystem + */ +void fuse_ctl_remove_conn(struct fuse_conn *fc); diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index 762702244..3407d2ee7 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c @@ -11,25 +11,20 @@ #include #include #include -#include #include #include #include #include #include +#include MODULE_AUTHOR("Miklos Szeredi "); MODULE_DESCRIPTION("Filesystem in Userspace"); MODULE_LICENSE("GPL"); static kmem_cache_t *fuse_inode_cachep; -static struct subsystem connections_subsys; - -struct fuse_conn_attr { - struct attribute attr; - ssize_t (*show)(struct fuse_conn *, char *); - ssize_t (*store)(struct fuse_conn *, const char *, size_t); -}; +struct list_head fuse_conn_list; +DEFINE_MUTEX(fuse_mutex); #define FUSE_SUPER_MAGIC 0x65735546 @@ -56,7 +51,7 @@ static struct inode *fuse_alloc_inode(struct super_block *sb) return NULL; fi = get_fuse_inode(inode); - fi->i_time = jiffies - 1; + fi->i_time = 0; fi->nodeid = 0; fi->nlookup = 0; fi->forget_req = fuse_request_alloc(); @@ -104,8 +99,17 @@ static void fuse_clear_inode(struct inode *inode) } } +static int fuse_remount_fs(struct super_block *sb, int *flags, char *data) +{ + if (*flags & MS_MANDLOCK) + return -EINVAL; + + return 0; +} + void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr) { + struct fuse_conn *fc = get_fuse_conn(inode); if (S_ISREG(inode->i_mode) && i_size_read(inode) != attr->size) invalidate_inode_pages(inode->i_mapping); @@ -114,8 +118,9 @@ void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr) inode->i_nlink = attr->nlink; inode->i_uid = attr->uid; inode->i_gid = attr->gid; + spin_lock(&fc->lock); i_size_write(inode, attr->size); - inode->i_blksize = PAGE_CACHE_SIZE; + spin_unlock(&fc->lock); inode->i_blocks = attr->blocks; inode->i_atime.tv_sec = attr->atime; inode->i_atime.tv_nsec = attr->atimensec; @@ -128,7 +133,7 @@ void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr) static void fuse_init_inode(struct inode *inode, struct fuse_attr *attr) { inode->i_mode = attr->mode & S_IFMT; - i_size_write(inode, attr->size); + inode->i_size = attr->size; if (S_ISREG(inode->i_mode)) { fuse_init_common(inode); fuse_init_file_inode(inode); @@ -195,31 +200,29 @@ struct inode *fuse_iget(struct super_block *sb, unsigned long nodeid, return inode; } -static void fuse_umount_begin(struct super_block *sb) +static void fuse_umount_begin(struct vfsmount *vfsmnt, int flags) { - fuse_abort_conn(get_fuse_conn_super(sb)); + if (flags & MNT_FORCE) + fuse_abort_conn(get_fuse_conn_super(vfsmnt->mnt_sb)); } static void fuse_put_super(struct super_block *sb) { struct fuse_conn *fc = get_fuse_conn_super(sb); - down_write(&fc->sbput_sem); - while (!list_empty(&fc->background)) - fuse_release_background(fc, - list_entry(fc->background.next, - struct fuse_req, bg_entry)); - spin_lock(&fc->lock); - fc->mounted = 0; fc->connected = 0; + fc->blocked = 0; spin_unlock(&fc->lock); - up_write(&fc->sbput_sem); /* Flush all readers on this fs */ kill_fasync(&fc->fasync, SIGIO, POLL_IN); wake_up_all(&fc->waitq); - kobject_del(&fc->kobj); - kobject_put(&fc->kobj); + wake_up_all(&fc->blocked_waitq); + mutex_lock(&fuse_mutex); + list_del(&fc->entry); + fuse_ctl_remove_conn(fc); + mutex_unlock(&fuse_mutex); + fuse_conn_put(fc); } static void convert_fuse_statfs(struct kstatfs *stbuf, struct fuse_kstatfs *attr) @@ -236,8 +239,9 @@ static void convert_fuse_statfs(struct kstatfs *stbuf, struct fuse_kstatfs *attr /* fsid is left zero */ } -static int fuse_statfs(struct super_block *sb, struct kstatfs *buf) +static int fuse_statfs(struct dentry *dentry, struct kstatfs *buf) { + struct super_block *sb = dentry->d_sb; struct fuse_conn *fc = get_fuse_conn_super(sb); struct fuse_req *req; struct fuse_statfs_out outarg; @@ -368,11 +372,6 @@ static int fuse_show_options(struct seq_file *m, struct vfsmount *mnt) return 0; } -static void fuse_conn_release(struct kobject *kobj) -{ - kfree(get_fuse_conn_kobj(kobj)); -} - static struct fuse_conn *new_conn(void) { struct fuse_conn *fc; @@ -380,24 +379,35 @@ static struct fuse_conn *new_conn(void) fc = kzalloc(sizeof(*fc), GFP_KERNEL); if (fc) { spin_lock_init(&fc->lock); + atomic_set(&fc->count, 1); init_waitqueue_head(&fc->waitq); init_waitqueue_head(&fc->blocked_waitq); INIT_LIST_HEAD(&fc->pending); INIT_LIST_HEAD(&fc->processing); INIT_LIST_HEAD(&fc->io); - INIT_LIST_HEAD(&fc->background); - init_rwsem(&fc->sbput_sem); - kobj_set_kset_s(fc, connections_subsys); - kobject_init(&fc->kobj); + INIT_LIST_HEAD(&fc->interrupts); atomic_set(&fc->num_waiting, 0); fc->bdi.ra_pages = (VM_MAX_READAHEAD * 1024) / PAGE_CACHE_SIZE; fc->bdi.unplug_io_fn = default_unplug_io_fn; fc->reqctr = 0; fc->blocked = 1; + get_random_bytes(&fc->scramble_key, sizeof(fc->scramble_key)); } return fc; } +void fuse_conn_put(struct fuse_conn *fc) +{ + if (atomic_dec_and_test(&fc->count)) + kfree(fc); +} + +struct fuse_conn *fuse_conn_get(struct fuse_conn *fc) +{ + atomic_inc(&fc->count); + return fc; +} + static struct inode *get_root_inode(struct super_block *sb, unsigned mode) { struct fuse_attr attr; @@ -413,6 +423,7 @@ static struct super_operations fuse_super_operations = { .destroy_inode = fuse_destroy_inode, .read_inode = fuse_read_inode, .clear_inode = fuse_clear_inode, + .remount_fs = fuse_remount_fs, .put_super = fuse_put_super, .umount_begin = fuse_umount_begin, .statfs = fuse_statfs, @@ -432,8 +443,12 @@ static void process_init_reply(struct fuse_conn *fc, struct fuse_req *req) ra_pages = arg->max_readahead / PAGE_CACHE_SIZE; if (arg->flags & FUSE_ASYNC_READ) fc->async_read = 1; - } else + if (!(arg->flags & FUSE_POSIX_LOCKS)) + fc->no_lock = 1; + } else { ra_pages = fc->max_read / PAGE_CACHE_SIZE; + fc->no_lock = 1; + } fc->bdi.ra_pages = min(fc->bdi.ra_pages, ra_pages); fc->minor = arg->minor; @@ -451,7 +466,7 @@ static void fuse_send_init(struct fuse_conn *fc, struct fuse_req *req) arg->major = FUSE_KERNEL_VERSION; arg->minor = FUSE_KERNEL_MINOR_VERSION; arg->max_readahead = fc->bdi.ra_pages * PAGE_CACHE_SIZE; - arg->flags |= FUSE_ASYNC_READ; + arg->flags |= FUSE_ASYNC_READ | FUSE_POSIX_LOCKS; req->in.h.opcode = FUSE_INIT; req->in.numargs = 1; req->in.args[0].size = sizeof(*arg); @@ -467,10 +482,9 @@ static void fuse_send_init(struct fuse_conn *fc, struct fuse_req *req) request_send_background(fc, req); } -static unsigned long long conn_id(void) +static u64 conn_id(void) { - /* BKL is held for ->get_sb() */ - static unsigned long long ctr = 1; + static u64 ctr = 1; return ctr++; } @@ -484,6 +498,9 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent) struct fuse_req *init_req; int err; + if (sb->s_flags & MS_MANDLOCK) + return -EINVAL; + if (!parse_fuse_opt((char *) data, &d)) return -EINVAL; @@ -527,25 +544,21 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent) if (!init_req) goto err_put_root; - err = kobject_set_name(&fc->kobj, "%llu", conn_id()); - if (err) - goto err_free_req; - - err = kobject_add(&fc->kobj); - if (err) - goto err_free_req; - - /* Setting file->private_data can't race with other mount() - instances, since BKL is held for ->get_sb() */ + mutex_lock(&fuse_mutex); err = -EINVAL; if (file->private_data) - goto err_kobject_del; + goto err_unlock; + + fc->id = conn_id(); + err = fuse_ctl_add_conn(fc); + if (err) + goto err_unlock; + list_add_tail(&fc->entry, &fuse_conn_list); sb->s_root = root_dentry; - fc->mounted = 1; fc->connected = 1; - kobject_get(&fc->kobj); - file->private_data = fc; + file->private_data = fuse_conn_get(fc); + mutex_unlock(&fuse_mutex); /* * atomic_dec_and_test() in fput() provides the necessary * memory barrier for file->private_data to be visible on all @@ -557,23 +570,22 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent) return 0; - err_kobject_del: - kobject_del(&fc->kobj); - err_free_req: + err_unlock: + mutex_unlock(&fuse_mutex); fuse_request_free(init_req); err_put_root: dput(root_dentry); err: fput(file); - kobject_put(&fc->kobj); + fuse_conn_put(fc); return err; } -static struct super_block *fuse_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, - void *raw_data) +static int fuse_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, + void *raw_data, struct vfsmount *mnt) { - return get_sb_nodev(fs_type, flags, raw_data, fuse_fill_super); + return get_sb_nodev(fs_type, flags, raw_data, fuse_fill_super, mnt); } static struct file_system_type fuse_fs_type = { @@ -583,68 +595,8 @@ static struct file_system_type fuse_fs_type = { .kill_sb = kill_anon_super, }; -static ssize_t fuse_conn_waiting_show(struct fuse_conn *fc, char *page) -{ - return sprintf(page, "%i\n", atomic_read(&fc->num_waiting)); -} - -static ssize_t fuse_conn_abort_store(struct fuse_conn *fc, const char *page, - size_t count) -{ - fuse_abort_conn(fc); - return count; -} - -static struct fuse_conn_attr fuse_conn_waiting = - __ATTR(waiting, 0400, fuse_conn_waiting_show, NULL); -static struct fuse_conn_attr fuse_conn_abort = - __ATTR(abort, 0600, NULL, fuse_conn_abort_store); - -static struct attribute *fuse_conn_attrs[] = { - &fuse_conn_waiting.attr, - &fuse_conn_abort.attr, - NULL, -}; - -static ssize_t fuse_conn_attr_show(struct kobject *kobj, - struct attribute *attr, - char *page) -{ - struct fuse_conn_attr *fca = - container_of(attr, struct fuse_conn_attr, attr); - - if (fca->show) - return fca->show(get_fuse_conn_kobj(kobj), page); - else - return -EACCES; -} - -static ssize_t fuse_conn_attr_store(struct kobject *kobj, - struct attribute *attr, - const char *page, size_t count) -{ - struct fuse_conn_attr *fca = - container_of(attr, struct fuse_conn_attr, attr); - - if (fca->store) - return fca->store(get_fuse_conn_kobj(kobj), page, count); - else - return -EACCES; -} - -static struct sysfs_ops fuse_conn_sysfs_ops = { - .show = &fuse_conn_attr_show, - .store = &fuse_conn_attr_store, -}; - -static struct kobj_type ktype_fuse_conn = { - .release = fuse_conn_release, - .sysfs_ops = &fuse_conn_sysfs_ops, - .default_attrs = fuse_conn_attrs, -}; - static decl_subsys(fuse, NULL, NULL); -static decl_subsys(connections, &ktype_fuse_conn, NULL); +static decl_subsys(connections, NULL, NULL); static void fuse_inode_init_once(void *foo, kmem_cache_t *cachep, unsigned long flags) @@ -718,6 +670,7 @@ static int __init fuse_init(void) printk("fuse init (API version %i.%i)\n", FUSE_KERNEL_VERSION, FUSE_KERNEL_MINOR_VERSION); + INIT_LIST_HEAD(&fuse_conn_list); res = fuse_fs_init(); if (res) goto err; @@ -730,8 +683,14 @@ static int __init fuse_init(void) if (res) goto err_dev_cleanup; + res = fuse_ctl_init(); + if (res) + goto err_sysfs_cleanup; + return 0; + err_sysfs_cleanup: + fuse_sysfs_cleanup(); err_dev_cleanup: fuse_dev_cleanup(); err_fs_cleanup: @@ -744,6 +703,7 @@ static void __exit fuse_exit(void) { printk(KERN_DEBUG "fuse exit\n"); + fuse_ctl_cleanup(); fuse_sysfs_cleanup(); fuse_fs_cleanup(); fuse_dev_cleanup(); diff --git a/fs/hfs/bnode.c b/fs/hfs/bnode.c index 1e44dcfe4..13231dd5c 100644 --- a/fs/hfs/bnode.c +++ b/fs/hfs/bnode.c @@ -280,7 +280,7 @@ static struct hfs_bnode *__hfs_bnode_create(struct hfs_btree *tree, u32 cnid) block = off >> PAGE_CACHE_SHIFT; node->page_offset = off & ~PAGE_CACHE_MASK; for (i = 0; i < tree->pages_per_bnode; i++) { - page = read_cache_page(mapping, block++, (filler_t *)mapping->a_ops->readpage, NULL); + page = read_mapping_page(mapping, block++, NULL); if (IS_ERR(page)) goto fail; if (PageError(page)) { diff --git a/fs/hfs/btree.c b/fs/hfs/btree.c index d20131ce4..400357994 100644 --- a/fs/hfs/btree.c +++ b/fs/hfs/btree.c @@ -59,7 +59,7 @@ struct hfs_btree *hfs_btree_open(struct super_block *sb, u32 id, btree_keycmp ke unlock_new_inode(tree->inode); mapping = tree->inode->i_mapping; - page = read_cache_page(mapping, 0, (filler_t *)mapping->a_ops->readpage, NULL); + page = read_mapping_page(mapping, 0, NULL); if (IS_ERR(page)) goto free_tree; diff --git a/fs/hfs/hfs_fs.h b/fs/hfs/hfs_fs.h index 3ed8663a8..735332dfd 100644 --- a/fs/hfs/hfs_fs.h +++ b/fs/hfs/hfs_fs.h @@ -182,8 +182,8 @@ extern void hfs_file_truncate(struct inode *); extern int hfs_get_block(struct inode *, sector_t, struct buffer_head *, int); /* inode.c */ -extern struct address_space_operations hfs_aops; -extern struct address_space_operations hfs_btree_aops; +extern const struct address_space_operations hfs_aops; +extern const struct address_space_operations hfs_btree_aops; extern struct inode *hfs_new_inode(struct inode *, struct qstr *, int); extern void hfs_inode_write_fork(struct inode *, struct hfs_extent *, __be32 *, __be32 *); diff --git a/fs/hfs/inode.c b/fs/hfs/inode.c index 2d4ced222..d05641c35 100644 --- a/fs/hfs/inode.c +++ b/fs/hfs/inode.c @@ -114,7 +114,7 @@ static int hfs_writepages(struct address_space *mapping, return mpage_writepages(mapping, wbc, hfs_get_block); } -struct address_space_operations hfs_btree_aops = { +const struct address_space_operations hfs_btree_aops = { .readpage = hfs_readpage, .writepage = hfs_writepage, .sync_page = block_sync_page, @@ -124,7 +124,7 @@ struct address_space_operations hfs_btree_aops = { .releasepage = hfs_releasepage, }; -struct address_space_operations hfs_aops = { +const struct address_space_operations hfs_aops = { .readpage = hfs_readpage, .writepage = hfs_writepage, .sync_page = block_sync_page, @@ -154,7 +154,6 @@ struct inode *hfs_new_inode(struct inode *dir, struct qstr *name, int mode) inode->i_gid = current->fsgid; inode->i_nlink = 1; inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC; - inode->i_blksize = HFS_SB(sb)->alloc_blksz; HFS_I(inode)->flags = 0; HFS_I(inode)->rsrc_inode = NULL; HFS_I(inode)->fs_blocks = 0; @@ -284,7 +283,6 @@ static int hfs_read_inode(struct inode *inode, void *data) inode->i_uid = hsb->s_uid; inode->i_gid = hsb->s_gid; inode->i_nlink = 1; - inode->i_blksize = HFS_SB(inode->i_sb)->alloc_blksz; if (idata->key) HFS_I(inode)->cat_key = *idata->key; diff --git a/fs/hfs/super.c b/fs/hfs/super.c index 1181d1161..34937ee83 100644 --- a/fs/hfs/super.c +++ b/fs/hfs/super.c @@ -12,7 +12,6 @@ * Based on the minix file system code, (C) 1991, 1992 by Linus Torvalds */ -#include #include #include #include @@ -80,8 +79,10 @@ static void hfs_put_super(struct super_block *sb) * * changed f_files/f_ffree to reflect the fs_ablock/free_ablocks. */ -static int hfs_statfs(struct super_block *sb, struct kstatfs *buf) +static int hfs_statfs(struct dentry *dentry, struct kstatfs *buf) { + struct super_block *sb = dentry->d_sb; + buf->f_type = HFS_SUPER_MAGIC; buf->f_bsize = sb->s_blocksize; buf->f_blocks = (u32)HFS_SB(sb)->fs_ablocks * HFS_SB(sb)->fs_div; @@ -413,10 +414,11 @@ bail: return res; } -static struct super_block *hfs_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int hfs_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, + struct vfsmount *mnt) { - return get_sb_bdev(fs_type, flags, dev_name, data, hfs_fill_super); + return get_sb_bdev(fs_type, flags, dev_name, data, hfs_fill_super, mnt); } static struct file_system_type hfs_fs_type = { diff --git a/fs/hfsplus/bitmap.c b/fs/hfsplus/bitmap.c index 9fb516323..d128a25b7 100644 --- a/fs/hfsplus/bitmap.c +++ b/fs/hfsplus/bitmap.c @@ -31,8 +31,7 @@ int hfsplus_block_allocate(struct super_block *sb, u32 size, u32 offset, u32 *ma dprint(DBG_BITMAP, "block_allocate: %u,%u,%u\n", size, offset, len); mutex_lock(&HFSPLUS_SB(sb).alloc_file->i_mutex); mapping = HFSPLUS_SB(sb).alloc_file->i_mapping; - page = read_cache_page(mapping, offset / PAGE_CACHE_BITS, - (filler_t *)mapping->a_ops->readpage, NULL); + page = read_mapping_page(mapping, offset / PAGE_CACHE_BITS, NULL); pptr = kmap(page); curr = pptr + (offset & (PAGE_CACHE_BITS - 1)) / 32; i = offset % 32; @@ -72,8 +71,8 @@ int hfsplus_block_allocate(struct super_block *sb, u32 size, u32 offset, u32 *ma offset += PAGE_CACHE_BITS; if (offset >= size) break; - page = read_cache_page(mapping, offset / PAGE_CACHE_BITS, - (filler_t *)mapping->a_ops->readpage, NULL); + page = read_mapping_page(mapping, offset / PAGE_CACHE_BITS, + NULL); curr = pptr = kmap(page); if ((size ^ offset) / PAGE_CACHE_BITS) end = pptr + PAGE_CACHE_BITS / 32; @@ -119,8 +118,8 @@ found: set_page_dirty(page); kunmap(page); offset += PAGE_CACHE_BITS; - page = read_cache_page(mapping, offset / PAGE_CACHE_BITS, - (filler_t *)mapping->a_ops->readpage, NULL); + page = read_mapping_page(mapping, offset / PAGE_CACHE_BITS, + NULL); pptr = kmap(page); curr = pptr; end = pptr + PAGE_CACHE_BITS / 32; @@ -167,7 +166,7 @@ int hfsplus_block_free(struct super_block *sb, u32 offset, u32 count) mutex_lock(&HFSPLUS_SB(sb).alloc_file->i_mutex); mapping = HFSPLUS_SB(sb).alloc_file->i_mapping; pnr = offset / PAGE_CACHE_BITS; - page = read_cache_page(mapping, pnr, (filler_t *)mapping->a_ops->readpage, NULL); + page = read_mapping_page(mapping, pnr, NULL); pptr = kmap(page); curr = pptr + (offset & (PAGE_CACHE_BITS - 1)) / 32; end = pptr + PAGE_CACHE_BITS / 32; @@ -199,7 +198,7 @@ int hfsplus_block_free(struct super_block *sb, u32 offset, u32 count) break; set_page_dirty(page); kunmap(page); - page = read_cache_page(mapping, ++pnr, (filler_t *)mapping->a_ops->readpage, NULL); + page = read_mapping_page(mapping, ++pnr, NULL); pptr = kmap(page); curr = pptr; end = pptr + PAGE_CACHE_BITS / 32; diff --git a/fs/hfsplus/bnode.c b/fs/hfsplus/bnode.c index 746abc9ec..77bf434da 100644 --- a/fs/hfsplus/bnode.c +++ b/fs/hfsplus/bnode.c @@ -440,7 +440,7 @@ static struct hfs_bnode *__hfs_bnode_create(struct hfs_btree *tree, u32 cnid) block = off >> PAGE_CACHE_SHIFT; node->page_offset = off & ~PAGE_CACHE_MASK; for (i = 0; i < tree->pages_per_bnode; block++, i++) { - page = read_cache_page(mapping, block, (filler_t *)mapping->a_ops->readpage, NULL); + page = read_mapping_page(mapping, block, NULL); if (IS_ERR(page)) goto fail; if (PageError(page)) { diff --git a/fs/hfsplus/btree.c b/fs/hfsplus/btree.c index effa89919..cfc852fdd 100644 --- a/fs/hfsplus/btree.c +++ b/fs/hfsplus/btree.c @@ -38,7 +38,7 @@ struct hfs_btree *hfs_btree_open(struct super_block *sb, u32 id) goto free_tree; mapping = tree->inode->i_mapping; - page = read_cache_page(mapping, 0, (filler_t *)mapping->a_ops->readpage, NULL); + page = read_mapping_page(mapping, 0, NULL); if (IS_ERR(page)) goto free_tree; diff --git a/fs/hfsplus/hfsplus_fs.h b/fs/hfsplus/hfsplus_fs.h index 7ae393637..8a1ca5ef7 100644 --- a/fs/hfsplus/hfsplus_fs.h +++ b/fs/hfsplus/hfsplus_fs.h @@ -323,8 +323,8 @@ int hfsplus_file_extend(struct inode *); void hfsplus_file_truncate(struct inode *); /* inode.c */ -extern struct address_space_operations hfsplus_aops; -extern struct address_space_operations hfsplus_btree_aops; +extern const struct address_space_operations hfsplus_aops; +extern const struct address_space_operations hfsplus_btree_aops; void hfsplus_inode_read_fork(struct inode *, struct hfsplus_fork_raw *); void hfsplus_inode_write_fork(struct inode *, struct hfsplus_fork_raw *); diff --git a/fs/hfsplus/inode.c b/fs/hfsplus/inode.c index acf66dba3..0eb1a6092 100644 --- a/fs/hfsplus/inode.c +++ b/fs/hfsplus/inode.c @@ -109,7 +109,7 @@ static int hfsplus_writepages(struct address_space *mapping, return mpage_writepages(mapping, wbc, hfsplus_get_block); } -struct address_space_operations hfsplus_btree_aops = { +const struct address_space_operations hfsplus_btree_aops = { .readpage = hfsplus_readpage, .writepage = hfsplus_writepage, .sync_page = block_sync_page, @@ -119,7 +119,7 @@ struct address_space_operations hfsplus_btree_aops = { .releasepage = hfsplus_releasepage, }; -struct address_space_operations hfsplus_aops = { +const struct address_space_operations hfsplus_aops = { .readpage = hfsplus_readpage, .writepage = hfsplus_writepage, .sync_page = block_sync_page, @@ -304,7 +304,6 @@ struct inode *hfsplus_new_inode(struct super_block *sb, int mode) inode->i_gid = current->fsgid; inode->i_nlink = 1; inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC; - inode->i_blksize = HFSPLUS_SB(sb).alloc_blksz; INIT_LIST_HEAD(&HFSPLUS_I(inode).open_dir_list); init_MUTEX(&HFSPLUS_I(inode).extents_lock); atomic_set(&HFSPLUS_I(inode).opencnt, 0); @@ -407,7 +406,6 @@ int hfsplus_cat_read_inode(struct inode *inode, struct hfs_find_data *fd) type = hfs_bnode_read_u16(fd->bnode, fd->entryoffset); HFSPLUS_I(inode).dev = 0; - inode->i_blksize = HFSPLUS_SB(inode->i_sb).alloc_blksz; if (type == HFSPLUS_FOLDER) { struct hfsplus_cat_folder *folder = &entry.folder; diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c index 7843f792a..d279d5924 100644 --- a/fs/hfsplus/super.c +++ b/fs/hfsplus/super.c @@ -7,7 +7,6 @@ * */ -#include #include #include #include @@ -212,8 +211,10 @@ static void hfsplus_put_super(struct super_block *sb) sb->s_fs_info = NULL; } -static int hfsplus_statfs(struct super_block *sb, struct kstatfs *buf) +static int hfsplus_statfs(struct dentry *dentry, struct kstatfs *buf) { + struct super_block *sb = dentry->d_sb; + buf->f_type = HFSPLUS_SUPER_MAGIC; buf->f_bsize = sb->s_blocksize; buf->f_blocks = HFSPLUS_SB(sb).total_blocks << HFSPLUS_SB(sb).fs_shift; @@ -450,10 +451,12 @@ static void hfsplus_destroy_inode(struct inode *inode) #define HFSPLUS_INODE_SIZE sizeof(struct hfsplus_inode_info) -static struct super_block *hfsplus_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int hfsplus_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, + struct vfsmount *mnt) { - return get_sb_bdev(fs_type, flags, dev_name, data, hfsplus_fill_super); + return get_sb_bdev(fs_type, flags, dev_name, data, hfsplus_fill_super, + mnt); } static struct file_system_type hfsplus_fs_type = { diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c index bf0f8e16e..322e876c3 100644 --- a/fs/hostfs/hostfs_kern.c +++ b/fs/hostfs/hostfs_kern.c @@ -54,7 +54,7 @@ static int append = 0; static struct inode_operations hostfs_iops; static struct inode_operations hostfs_dir_iops; -static struct address_space_operations hostfs_link_aops; +static const struct address_space_operations hostfs_link_aops; #ifndef MODULE static int __init hostfs_args(char *options, int *add) @@ -156,7 +156,6 @@ static int read_name(struct inode *ino, char *name) ino->i_mode = i_mode; ino->i_nlink = i_nlink; ino->i_size = i_size; - ino->i_blksize = i_blksize; ino->i_blocks = i_blocks; return(0); } @@ -239,7 +238,7 @@ static int read_inode(struct inode *ino) return(err); } -int hostfs_statfs(struct super_block *sb, struct kstatfs *sf) +int hostfs_statfs(struct dentry *dentry, struct kstatfs *sf) { /* do_statfs uses struct statfs64 internally, but the linux kernel * struct statfs still has 32-bit versions for most of these fields, @@ -252,7 +251,7 @@ int hostfs_statfs(struct super_block *sb, struct kstatfs *sf) long long f_files; long long f_ffree; - err = do_statfs(HOSTFS_I(sb->s_root->d_inode)->host_filename, + err = do_statfs(HOSTFS_I(dentry->d_sb->s_root->d_inode)->host_filename, &sf->f_bsize, &f_blocks, &f_bfree, &f_bavail, &f_files, &f_ffree, &sf->f_fsid, sizeof(sf->f_fsid), &sf->f_namelen, sf->f_spare); @@ -518,7 +517,7 @@ int hostfs_commit_write(struct file *file, struct page *page, unsigned from, return(err); } -static struct address_space_operations hostfs_aops = { +static const struct address_space_operations hostfs_aops = { .writepage = hostfs_writepage, .readpage = hostfs_readpage, .set_page_dirty = __set_page_dirty_nobuffers, @@ -935,7 +934,7 @@ int hostfs_link_readpage(struct file *file, struct page *page) return(err); } -static struct address_space_operations hostfs_link_aops = { +static const struct address_space_operations hostfs_link_aops = { .readpage = hostfs_link_readpage, }; @@ -993,11 +992,11 @@ static int hostfs_fill_sb_common(struct super_block *sb, void *d, int silent) return(err); } -static struct super_block *hostfs_read_sb(struct file_system_type *type, - int flags, const char *dev_name, - void *data) +static int hostfs_read_sb(struct file_system_type *type, + int flags, const char *dev_name, + void *data, struct vfsmount *mnt) { - return(get_sb_nodev(type, flags, data, hostfs_fill_sb_common)); + return get_sb_nodev(type, flags, data, hostfs_fill_sb_common, mnt); } static struct file_system_type hostfs_type = { diff --git a/fs/hpfs/file.c b/fs/hpfs/file.c index d3b9fffe4..d9eb19b7b 100644 --- a/fs/hpfs/file.c +++ b/fs/hpfs/file.c @@ -99,7 +99,7 @@ static sector_t _hpfs_bmap(struct address_space *mapping, sector_t block) { return generic_block_bmap(mapping,block,hpfs_get_block); } -struct address_space_operations hpfs_aops = { +const struct address_space_operations hpfs_aops = { .readpage = hpfs_readpage, .writepage = hpfs_writepage, .sync_page = block_sync_page, diff --git a/fs/hpfs/hpfs_fn.h b/fs/hpfs/hpfs_fn.h index 29b7a3e55..f687d54ed 100644 --- a/fs/hpfs/hpfs_fn.h +++ b/fs/hpfs/hpfs_fn.h @@ -268,7 +268,7 @@ void hpfs_set_ea(struct inode *, struct fnode *, char *, char *, int); int hpfs_file_fsync(struct file *, struct dentry *, int); extern const struct file_operations hpfs_file_ops; extern struct inode_operations hpfs_file_iops; -extern struct address_space_operations hpfs_aops; +extern const struct address_space_operations hpfs_aops; /* inode.c */ @@ -304,7 +304,7 @@ void hpfs_decide_conv(struct inode *, unsigned char *, unsigned); /* namei.c */ extern struct inode_operations hpfs_dir_iops; -extern struct address_space_operations hpfs_symlink_aops; +extern const struct address_space_operations hpfs_symlink_aops; static inline struct hpfs_inode_info *hpfs_i(struct inode *inode) { diff --git a/fs/hpfs/inode.c b/fs/hpfs/inode.c index 56f2c338c..bcf6ee36e 100644 --- a/fs/hpfs/inode.c +++ b/fs/hpfs/inode.c @@ -17,7 +17,6 @@ void hpfs_init_inode(struct inode *i) i->i_gid = hpfs_sb(sb)->sb_gid; i->i_mode = hpfs_sb(sb)->sb_mode; hpfs_inode->i_conv = hpfs_sb(sb)->sb_conv; - i->i_blksize = 512; i->i_size = -1; i->i_blocks = -1; diff --git a/fs/hpfs/namei.c b/fs/hpfs/namei.c index a03abb12c..59e7dc182 100644 --- a/fs/hpfs/namei.c +++ b/fs/hpfs/namei.c @@ -538,7 +538,7 @@ fail: return err; } -struct address_space_operations hpfs_symlink_aops = { +const struct address_space_operations hpfs_symlink_aops = { .readpage = hpfs_symlink_readpage }; diff --git a/fs/hpfs/super.c b/fs/hpfs/super.c index d72d8c87c..f798480a3 100644 --- a/fs/hpfs/super.c +++ b/fs/hpfs/super.c @@ -135,8 +135,9 @@ static unsigned count_bitmaps(struct super_block *s) return count; } -static int hpfs_statfs(struct super_block *s, struct kstatfs *buf) +static int hpfs_statfs(struct dentry *dentry, struct kstatfs *buf) { + struct super_block *s = dentry->d_sb; struct hpfs_sb_info *sbi = hpfs_sb(s); lock_kernel(); @@ -662,10 +663,11 @@ bail0: return -EINVAL; } -static struct super_block *hpfs_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int hpfs_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_bdev(fs_type, flags, dev_name, data, hpfs_fill_super); + return get_sb_bdev(fs_type, flags, dev_name, data, hpfs_fill_super, + mnt); } static struct file_system_type hpfs_fs_type = { diff --git a/fs/hppfs/hppfs_kern.c b/fs/hppfs/hppfs_kern.c index 5e6363be2..dcb6d2e98 100644 --- a/fs/hppfs/hppfs_kern.c +++ b/fs/hppfs/hppfs_kern.c @@ -152,7 +152,6 @@ static void hppfs_read_inode(struct inode *ino) ino->i_mode = proc_ino->i_mode; ino->i_nlink = proc_ino->i_nlink; ino->i_size = proc_ino->i_size; - ino->i_blksize = proc_ino->i_blksize; ino->i_blocks = proc_ino->i_blocks; } @@ -616,7 +615,7 @@ static const struct file_operations hppfs_dir_fops = { .fsync = hppfs_fsync, }; -static int hppfs_statfs(struct super_block *sb, struct kstatfs *sf) +static int hppfs_statfs(struct dentry *dentry, struct kstatfs *sf) { sf->f_blocks = 0; sf->f_bfree = 0; @@ -769,11 +768,11 @@ static int hppfs_fill_super(struct super_block *sb, void *d, int silent) return(err); } -static struct super_block *hppfs_read_super(struct file_system_type *type, - int flags, const char *dev_name, - void *data) +static int hppfs_read_super(struct file_system_type *type, + int flags, const char *dev_name, + void *data, struct vfsmount *mnt) { - return(get_sb_nodev(type, flags, data, hppfs_fill_super)); + return get_sb_nodev(type, flags, data, hppfs_fill_super, mnt); } static struct file_system_type hppfs_type = { diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 3a5b4e923..e025a31b4 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c @@ -34,7 +34,7 @@ #define HUGETLBFS_MAGIC 0x958458f6 static struct super_operations hugetlbfs_ops; -static struct address_space_operations hugetlbfs_aops; +static const struct address_space_operations hugetlbfs_aops; const struct file_operations hugetlbfs_file_operations; static struct inode_operations hugetlbfs_dir_inode_operations; static struct inode_operations hugetlbfs_inode_operations; @@ -59,7 +59,6 @@ static void huge_pagevec_release(struct pagevec *pvec) static int hugetlbfs_file_mmap(struct file *file, struct vm_area_struct *vma) { struct inode *inode = file->f_dentry->d_inode; - struct hugetlbfs_inode_info *info = HUGETLBFS_I(inode); loff_t len, vma_len; int ret; @@ -84,16 +83,15 @@ static int hugetlbfs_file_mmap(struct file *file, struct vm_area_struct *vma) ret = -ENOMEM; len = vma_len + ((loff_t)vma->vm_pgoff << PAGE_SHIFT); - if (!(vma->vm_flags & VM_WRITE) && len > inode->i_size) - goto out; - if (vma->vm_flags & VM_MAYSHARE) - if (hugetlb_extend_reservation(info, len >> HPAGE_SHIFT) != 0) - goto out; + if (vma->vm_flags & VM_MAYSHARE && + hugetlb_reserve_pages(inode, vma->vm_pgoff >> (HPAGE_SHIFT-PAGE_SHIFT), + len >> HPAGE_SHIFT)) + goto out; ret = 0; hugetlb_prefault_arch_hook(vma->vm_mm); - if (inode->i_size < len) + if (vma->vm_flags & VM_WRITE && inode->i_size < len) inode->i_size = len; out: mutex_unlock(&inode->i_mutex); @@ -195,12 +193,8 @@ static void truncate_hugepages(struct inode *inode, loff_t lstart) const pgoff_t start = lstart >> HPAGE_SHIFT; struct pagevec pvec; pgoff_t next; - int i; + int i, freed = 0; - hugetlb_truncate_reservation(HUGETLBFS_I(inode), - lstart >> HPAGE_SHIFT); - if (!mapping->nrpages) - return; pagevec_init(&pvec, 0); next = start; while (1) { @@ -221,10 +215,12 @@ static void truncate_hugepages(struct inode *inode, loff_t lstart) truncate_huge_page(page); unlock_page(page); hugetlb_put_quota(mapping); + freed++; } huge_pagevec_release(&pvec); } BUG_ON(!lstart && mapping->nrpages); + hugetlb_unreserve_pages(inode, start, freed); } static void hugetlbfs_delete_inode(struct inode *inode) @@ -361,11 +357,11 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb, uid_t uid, inode->i_mode = mode; inode->i_uid = uid; inode->i_gid = gid; - inode->i_blksize = HPAGE_SIZE; inode->i_blocks = 0; inode->i_mapping->a_ops = &hugetlbfs_aops; inode->i_mapping->backing_dev_info =&hugetlbfs_backing_dev_info; inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; + INIT_LIST_HEAD(&inode->i_mapping->private_list); info = HUGETLBFS_I(inode); mpol_shared_policy_init(&info->policy, MPOL_DEFAULT, NULL); switch (mode & S_IFMT) { @@ -467,9 +463,9 @@ static int hugetlbfs_set_page_dirty(struct page *page) return 0; } -static int hugetlbfs_statfs(struct super_block *sb, struct kstatfs *buf) +static int hugetlbfs_statfs(struct dentry *dentry, struct kstatfs *buf) { - struct hugetlbfs_sb_info *sbinfo = HUGETLBFS_SB(sb); + struct hugetlbfs_sb_info *sbinfo = HUGETLBFS_SB(dentry->d_sb); buf->f_type = HUGETLBFS_MAGIC; buf->f_bsize = HPAGE_SIZE; @@ -538,7 +534,6 @@ static struct inode *hugetlbfs_alloc_inode(struct super_block *sb) hugetlbfs_inc_free_inodes(sbinfo); return NULL; } - p->prereserved_hpages = 0; return &p->vfs_inode; } @@ -549,7 +544,7 @@ static void hugetlbfs_destroy_inode(struct inode *inode) kmem_cache_free(hugetlbfs_inode_cachep, HUGETLBFS_I(inode)); } -static struct address_space_operations hugetlbfs_aops = { +static const struct address_space_operations hugetlbfs_aops = { .readpage = hugetlbfs_readpage, .prepare_write = hugetlbfs_prepare_write, .commit_write = hugetlbfs_commit_write, @@ -723,10 +718,10 @@ void hugetlb_put_quota(struct address_space *mapping) } } -static struct super_block *hugetlbfs_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int hugetlbfs_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_nodev(fs_type, flags, data, hugetlbfs_fill_super); + return get_sb_nodev(fs_type, flags, data, hugetlbfs_fill_super, mnt); } static struct file_system_type hugetlbfs_fs_type = { @@ -781,8 +776,7 @@ struct file *hugetlb_zero_setup(size_t size) goto out_file; error = -ENOMEM; - if (hugetlb_extend_reservation(HUGETLBFS_I(inode), - size >> HPAGE_SHIFT) != 0) + if (hugetlb_reserve_pages(inode, 0, size >> HPAGE_SHIFT)) goto out_inode; d_instantiate(dentry, inode); diff --git a/fs/inode.c b/fs/inode.c index 79a986f5a..e5a4dc1c4 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -4,7 +4,6 @@ * (C) 1997 Linus Torvalds */ -#include #include #include #include @@ -102,7 +101,7 @@ static kmem_cache_t * inode_cachep __read_mostly; static struct inode *alloc_inode(struct super_block *sb) { - static struct address_space_operations empty_aops; + static const struct address_space_operations empty_aops; static struct inode_operations empty_iops; static const struct file_operations empty_fops; struct inode *inode; @@ -167,7 +166,7 @@ static struct inode *alloc_inode(struct super_block *sb) bdi = sb->s_bdev->bd_inode->i_mapping->backing_dev_info; mapping->backing_dev_info = bdi; } - memset(&inode->u, 0, sizeof(inode->u)); + inode->i_private = 0; inode->i_mapping = mapping; } return inode; @@ -260,9 +259,9 @@ void clear_inode(struct inode *inode) DQUOT_DROP(inode); if (inode->i_sb && inode->i_sb->s_op->clear_inode) inode->i_sb->s_op->clear_inode(inode); - if (inode->i_bdev) + if (S_ISBLK(inode->i_mode) && inode->i_bdev) bd_forget(inode); - if (inode->i_cdev) + if (S_ISCHR(inode->i_mode) && inode->i_cdev) cd_forget(inode); inode->i_state = I_CLEAR; } @@ -457,15 +456,14 @@ static void prune_icache(int nr_to_scan) nr_pruned++; } inodes_stat.nr_unused -= nr_pruned; + if (current_is_kswapd()) + __count_vm_events(KSWAPD_INODESTEAL, reap); + else + __count_vm_events(PGINODESTEAL, reap); spin_unlock(&inode_lock); dispose_list(&freeable); mutex_unlock(&iprune_mutex); - - if (current_is_kswapd()) - mod_page_state(kswapd_inodesteal, reap); - else - mod_page_state(pginodesteal, reap); } /* diff --git a/fs/inotify.c b/fs/inotify.c index 732ec4bd5..723836a1f 100644 --- a/fs/inotify.c +++ b/fs/inotify.c @@ -5,7 +5,10 @@ * John McCutchan * Robert Love * + * Kernel API added by: Amy Griffis + * * Copyright (C) 2005 John McCutchan + * Copyright 2006 Hewlett-Packard Development Company, L.P. * * 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 @@ -20,35 +23,17 @@ #include #include -#include #include #include #include #include -#include -#include -#include -#include #include #include #include #include -#include - -#include static atomic_t inotify_cookie; -static kmem_cache_t *watch_cachep __read_mostly; -static kmem_cache_t *event_cachep __read_mostly; - -static struct vfsmount *inotify_mnt __read_mostly; - -/* these are configurable via /proc/sys/fs/inotify/ */ -int inotify_max_user_instances __read_mostly; -int inotify_max_user_watches __read_mostly; -int inotify_max_queued_events __read_mostly; - /* * Lock ordering: * @@ -56,327 +41,108 @@ int inotify_max_queued_events __read_mostly; * iprune_mutex (synchronize shrink_icache_memory()) * inode_lock (protects the super_block->s_inodes list) * inode->inotify_mutex (protects inode->inotify_watches and watches->i_list) - * inotify_dev->mutex (protects inotify_device and watches->d_list) + * inotify_handle->mutex (protects inotify_handle and watches->h_list) + * + * The inode->inotify_mutex and inotify_handle->mutex and held during execution + * of a caller's event handler. Thus, the caller must not hold any locks + * taken in their event handler while calling any of the published inotify + * interfaces. */ /* - * Lifetimes of the three main data structures--inotify_device, inode, and + * Lifetimes of the three main data structures--inotify_handle, inode, and * inotify_watch--are managed by reference count. * - * inotify_device: Lifetime is from inotify_init() until release. Additional - * references can bump the count via get_inotify_dev() and drop the count via - * put_inotify_dev(). + * inotify_handle: Lifetime is from inotify_init() to inotify_destroy(). + * Additional references can bump the count via get_inotify_handle() and drop + * the count via put_inotify_handle(). * - * inotify_watch: Lifetime is from create_watch() to destory_watch(). - * Additional references can bump the count via get_inotify_watch() and drop - * the count via put_inotify_watch(). + * inotify_watch: for inotify's purposes, lifetime is from inotify_add_watch() + * to remove_watch_no_event(). Additional references can bump the count via + * get_inotify_watch() and drop the count via put_inotify_watch(). The caller + * is reponsible for the final put after receiving IN_IGNORED, or when using + * IN_ONESHOT after receiving the first event. Inotify does the final put if + * inotify_destroy() is called. * * inode: Pinned so long as the inode is associated with a watch, from - * create_watch() to put_inotify_watch(). + * inotify_add_watch() to the final put_inotify_watch(). */ /* - * struct inotify_device - represents an inotify instance + * struct inotify_handle - represents an inotify instance * * This structure is protected by the mutex 'mutex'. */ -struct inotify_device { - wait_queue_head_t wq; /* wait queue for i/o */ +struct inotify_handle { struct idr idr; /* idr mapping wd -> watch */ struct mutex mutex; /* protects this bad boy */ - struct list_head events; /* list of queued events */ struct list_head watches; /* list of watches */ atomic_t count; /* reference count */ - struct user_struct *user; /* user who opened this dev */ - unsigned int queue_size; /* size of the queue (bytes) */ - unsigned int event_count; /* number of pending events */ - unsigned int max_events; /* maximum number of events */ u32 last_wd; /* the last wd allocated */ + const struct inotify_operations *in_ops; /* inotify caller operations */ }; -/* - * struct inotify_kernel_event - An inotify event, originating from a watch and - * queued for user-space. A list of these is attached to each instance of the - * device. In read(), this list is walked and all events that can fit in the - * buffer are returned. - * - * Protected by dev->mutex of the device in which we are queued. - */ -struct inotify_kernel_event { - struct inotify_event event; /* the user-space event */ - struct list_head list; /* entry in inotify_device's list */ - char *name; /* filename, if any */ -}; - -/* - * struct inotify_watch - represents a watch request on a specific inode - * - * d_list is protected by dev->mutex of the associated watch->dev. - * i_list and mask are protected by inode->inotify_mutex of the associated inode. - * dev, inode, and wd are never written to once the watch is created. - */ -struct inotify_watch { - struct list_head d_list; /* entry in inotify_device's list */ - struct list_head i_list; /* entry in inode's list */ - atomic_t count; /* reference count */ - struct inotify_device *dev; /* associated device */ - struct inode *inode; /* associated inode */ - s32 wd; /* watch descriptor */ - u32 mask; /* event mask for this watch */ -}; - -#ifdef CONFIG_SYSCTL - -#include - -static int zero; - -ctl_table inotify_table[] = { - { - .ctl_name = INOTIFY_MAX_USER_INSTANCES, - .procname = "max_user_instances", - .data = &inotify_max_user_instances, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = &proc_dointvec_minmax, - .strategy = &sysctl_intvec, - .extra1 = &zero, - }, - { - .ctl_name = INOTIFY_MAX_USER_WATCHES, - .procname = "max_user_watches", - .data = &inotify_max_user_watches, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = &proc_dointvec_minmax, - .strategy = &sysctl_intvec, - .extra1 = &zero, - }, - { - .ctl_name = INOTIFY_MAX_QUEUED_EVENTS, - .procname = "max_queued_events", - .data = &inotify_max_queued_events, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = &proc_dointvec_minmax, - .strategy = &sysctl_intvec, - .extra1 = &zero - }, - { .ctl_name = 0 } -}; -#endif /* CONFIG_SYSCTL */ - -static inline void get_inotify_dev(struct inotify_device *dev) +static inline void get_inotify_handle(struct inotify_handle *ih) { - atomic_inc(&dev->count); + atomic_inc(&ih->count); } -static inline void put_inotify_dev(struct inotify_device *dev) +static inline void put_inotify_handle(struct inotify_handle *ih) { - if (atomic_dec_and_test(&dev->count)) { - atomic_dec(&dev->user->inotify_devs); - free_uid(dev->user); - idr_destroy(&dev->idr); - kfree(dev); + if (atomic_dec_and_test(&ih->count)) { + idr_destroy(&ih->idr); + kfree(ih); } } -static inline void get_inotify_watch(struct inotify_watch *watch) +/** + * get_inotify_watch - grab a reference to an inotify_watch + * @watch: watch to grab + */ +void get_inotify_watch(struct inotify_watch *watch) { atomic_inc(&watch->count); } +EXPORT_SYMBOL_GPL(get_inotify_watch); -/* +/** * put_inotify_watch - decrements the ref count on a given watch. cleans up - * the watch and its references if the count reaches zero. + * watch references if the count reaches zero. inotify_watch is freed by + * inotify callers via the destroy_watch() op. + * @watch: watch to release */ -static inline void put_inotify_watch(struct inotify_watch *watch) +void put_inotify_watch(struct inotify_watch *watch) { if (atomic_dec_and_test(&watch->count)) { - put_inotify_dev(watch->dev); - iput(watch->inode); - kmem_cache_free(watch_cachep, watch); - } -} - -/* - * kernel_event - create a new kernel event with the given parameters - * - * This function can sleep. - */ -static struct inotify_kernel_event * kernel_event(s32 wd, u32 mask, u32 cookie, - const char *name) -{ - struct inotify_kernel_event *kevent; - - kevent = kmem_cache_alloc(event_cachep, GFP_KERNEL); - if (unlikely(!kevent)) - return NULL; - - /* we hand this out to user-space, so zero it just in case */ - memset(&kevent->event, 0, sizeof(struct inotify_event)); - - kevent->event.wd = wd; - kevent->event.mask = mask; - kevent->event.cookie = cookie; - - INIT_LIST_HEAD(&kevent->list); - - if (name) { - size_t len, rem, event_size = sizeof(struct inotify_event); - - /* - * We need to pad the filename so as to properly align an - * array of inotify_event structures. Because the structure is - * small and the common case is a small filename, we just round - * up to the next multiple of the structure's sizeof. This is - * simple and safe for all architectures. - */ - len = strlen(name) + 1; - rem = event_size - len; - if (len > event_size) { - rem = event_size - (len % event_size); - if (len % event_size == 0) - rem = 0; - } - - kevent->name = kmalloc(len + rem, GFP_KERNEL); - if (unlikely(!kevent->name)) { - kmem_cache_free(event_cachep, kevent); - return NULL; - } - memcpy(kevent->name, name, len); - if (rem) - memset(kevent->name + len, 0, rem); - kevent->event.len = len + rem; - } else { - kevent->event.len = 0; - kevent->name = NULL; - } - - return kevent; -} - -/* - * inotify_dev_get_event - return the next event in the given dev's queue - * - * Caller must hold dev->mutex. - */ -static inline struct inotify_kernel_event * -inotify_dev_get_event(struct inotify_device *dev) -{ - return list_entry(dev->events.next, struct inotify_kernel_event, list); -} - -/* - * inotify_dev_queue_event - add a new event to the given device - * - * Caller must hold dev->mutex. Can sleep (calls kernel_event()). - */ -static void inotify_dev_queue_event(struct inotify_device *dev, - struct inotify_watch *watch, u32 mask, - u32 cookie, const char *name) -{ - struct inotify_kernel_event *kevent, *last; - - /* coalescing: drop this event if it is a dupe of the previous */ - last = inotify_dev_get_event(dev); - if (last && last->event.mask == mask && last->event.wd == watch->wd && - last->event.cookie == cookie) { - const char *lastname = last->name; - - if (!name && !lastname) - return; - if (name && lastname && !strcmp(lastname, name)) - return; - } - - /* the queue overflowed and we already sent the Q_OVERFLOW event */ - if (unlikely(dev->event_count > dev->max_events)) - return; - - /* if the queue overflows, we need to notify user space */ - if (unlikely(dev->event_count == dev->max_events)) - kevent = kernel_event(-1, IN_Q_OVERFLOW, cookie, NULL); - else - kevent = kernel_event(watch->wd, mask, cookie, name); - - if (unlikely(!kevent)) - return; - - /* queue the event and wake up anyone waiting */ - dev->event_count++; - dev->queue_size += sizeof(struct inotify_event) + kevent->event.len; - list_add_tail(&kevent->list, &dev->events); - wake_up_interruptible(&dev->wq); -} - -/* - * remove_kevent - cleans up and ultimately frees the given kevent - * - * Caller must hold dev->mutex. - */ -static void remove_kevent(struct inotify_device *dev, - struct inotify_kernel_event *kevent) -{ - list_del(&kevent->list); - - dev->event_count--; - dev->queue_size -= sizeof(struct inotify_event) + kevent->event.len; - - kfree(kevent->name); - kmem_cache_free(event_cachep, kevent); -} + struct inotify_handle *ih = watch->ih; -/* - * inotify_dev_event_dequeue - destroy an event on the given device - * - * Caller must hold dev->mutex. - */ -static void inotify_dev_event_dequeue(struct inotify_device *dev) -{ - if (!list_empty(&dev->events)) { - struct inotify_kernel_event *kevent; - kevent = inotify_dev_get_event(dev); - remove_kevent(dev, kevent); + iput(watch->inode); + ih->in_ops->destroy_watch(watch); + put_inotify_handle(ih); } } +EXPORT_SYMBOL_GPL(put_inotify_watch); /* - * inotify_dev_get_wd - returns the next WD for use by the given dev + * inotify_handle_get_wd - returns the next WD for use by the given handle * - * Callers must hold dev->mutex. This function can sleep. + * Callers must hold ih->mutex. This function can sleep. */ -static int inotify_dev_get_wd(struct inotify_device *dev, - struct inotify_watch *watch) +static int inotify_handle_get_wd(struct inotify_handle *ih, + struct inotify_watch *watch) { int ret; do { - if (unlikely(!idr_pre_get(&dev->idr, GFP_KERNEL))) + if (unlikely(!idr_pre_get(&ih->idr, GFP_KERNEL))) return -ENOSPC; - ret = idr_get_new_above(&dev->idr, watch, dev->last_wd+1, &watch->wd); + ret = idr_get_new_above(&ih->idr, watch, ih->last_wd+1, &watch->wd); } while (ret == -EAGAIN); - return ret; -} + if (likely(!ret)) + ih->last_wd = watch->wd; -/* - * 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, - unsigned flags) -{ - int error; - - error = __user_walk(dirname, flags, nd); - if (error) - return error; - /* you can only watch an inode if you have read permissions on it */ - error = vfs_permission(nd, MAY_READ); - if (error) - path_release(nd); - return error; + return ret; } /* @@ -422,67 +188,18 @@ static void set_dentry_child_flags(struct inode *inode, int watched) } /* - * create_watch - creates a watch on the given device. - * - * Callers must hold dev->mutex. Calls inotify_dev_get_wd() so may sleep. - * Both 'dev' and 'inode' (by way of nameidata) need to be pinned. - */ -static struct inotify_watch *create_watch(struct inotify_device *dev, - u32 mask, struct inode *inode) -{ - struct inotify_watch *watch; - int ret; - - if (atomic_read(&dev->user->inotify_watches) >= - inotify_max_user_watches) - return ERR_PTR(-ENOSPC); - - watch = kmem_cache_alloc(watch_cachep, GFP_KERNEL); - if (unlikely(!watch)) - return ERR_PTR(-ENOMEM); - - ret = inotify_dev_get_wd(dev, watch); - if (unlikely(ret)) { - kmem_cache_free(watch_cachep, watch); - return ERR_PTR(ret); - } - - dev->last_wd = watch->wd; - watch->mask = mask; - atomic_set(&watch->count, 0); - INIT_LIST_HEAD(&watch->d_list); - INIT_LIST_HEAD(&watch->i_list); - - /* save a reference to device and bump the count to make it official */ - get_inotify_dev(dev); - watch->dev = dev; - - /* - * Save a reference to the inode and bump the ref count to make it - * official. We hold a reference to nameidata, which makes this safe. - */ - watch->inode = igrab(inode); - - /* bump our own count, corresponding to our entry in dev->watches */ - get_inotify_watch(watch); - - atomic_inc(&dev->user->inotify_watches); - - return watch; -} - -/* - * inotify_find_dev - find the watch associated with the given inode and dev + * inotify_find_handle - find the watch associated with the given inode and + * handle * * Callers must hold inode->inotify_mutex. */ -static struct inotify_watch *inode_find_dev(struct inode *inode, - struct inotify_device *dev) +static struct inotify_watch *inode_find_handle(struct inode *inode, + struct inotify_handle *ih) { struct inotify_watch *watch; list_for_each_entry(watch, &inode->inotify_watches, i_list) { - if (watch->dev == dev) + if (watch->ih == ih) return watch; } @@ -490,40 +207,40 @@ static struct inotify_watch *inode_find_dev(struct inode *inode, } /* - * remove_watch_no_event - remove_watch() without the IN_IGNORED event. + * remove_watch_no_event - remove watch without the IN_IGNORED event. + * + * Callers must hold both inode->inotify_mutex and ih->mutex. */ static void remove_watch_no_event(struct inotify_watch *watch, - struct inotify_device *dev) + struct inotify_handle *ih) { list_del(&watch->i_list); - list_del(&watch->d_list); + list_del(&watch->h_list); if (!inotify_inode_watched(watch->inode)) set_dentry_child_flags(watch->inode, 0); - atomic_dec(&dev->user->inotify_watches); - idr_remove(&dev->idr, watch->wd); - put_inotify_watch(watch); + idr_remove(&ih->idr, watch->wd); } -/* - * remove_watch - Remove a watch from both the device and the inode. Sends - * the IN_IGNORED event to the given device signifying that the inode is no - * longer watched. - * - * Callers must hold both inode->inotify_mutex and dev->mutex. We drop a - * reference to the inode before returning. +/** + * inotify_remove_watch_locked - Remove a watch from both the handle and the + * inode. Sends the IN_IGNORED event signifying that the inode is no longer + * watched. May be invoked from a caller's event handler. + * @ih: inotify handle associated with watch + * @watch: watch to remove * - * The inode is not iput() so as to remain atomic. If the inode needs to be - * iput(), the call returns one. Otherwise, it returns zero. + * Callers must hold both inode->inotify_mutex and ih->mutex. */ -static void remove_watch(struct inotify_watch *watch,struct inotify_device *dev) +void inotify_remove_watch_locked(struct inotify_handle *ih, + struct inotify_watch *watch) { - inotify_dev_queue_event(dev, watch, IN_IGNORED, 0, NULL); - remove_watch_no_event(watch, dev); + remove_watch_no_event(watch, ih); + ih->in_ops->handle_event(watch, watch->wd, IN_IGNORED, 0, NULL, NULL); } +EXPORT_SYMBOL_GPL(inotify_remove_watch_locked); -/* Kernel API */ +/* Kernel API for producing events */ /* * inotify_d_instantiate - instantiate dcache entry for inode @@ -563,9 +280,10 @@ void inotify_d_move(struct dentry *entry) * @mask: event mask describing this event * @cookie: cookie for synchronization, or zero * @name: filename, if any + * @n_inode: inode associated with name */ void inotify_inode_queue_event(struct inode *inode, u32 mask, u32 cookie, - const char *name) + const char *name, struct inode *n_inode) { struct inotify_watch *watch, *next; @@ -576,14 +294,13 @@ void inotify_inode_queue_event(struct inode *inode, u32 mask, u32 cookie, list_for_each_entry_safe(watch, next, &inode->inotify_watches, i_list) { u32 watch_mask = watch->mask; if (watch_mask & mask) { - struct inotify_device *dev = watch->dev; - get_inotify_watch(watch); - mutex_lock(&dev->mutex); - inotify_dev_queue_event(dev, watch, mask, cookie, name); + struct inotify_handle *ih= watch->ih; + mutex_lock(&ih->mutex); if (watch_mask & IN_ONESHOT) - remove_watch_no_event(watch, dev); - mutex_unlock(&dev->mutex); - put_inotify_watch(watch); + remove_watch_no_event(watch, ih); + ih->in_ops->handle_event(watch, watch->wd, mask, cookie, + name, n_inode); + mutex_unlock(&ih->mutex); } } mutex_unlock(&inode->inotify_mutex); @@ -613,7 +330,8 @@ void inotify_dentry_parent_queue_event(struct dentry *dentry, u32 mask, if (inotify_inode_watched(inode)) { dget(parent); spin_unlock(&dentry->d_lock); - inotify_inode_queue_event(inode, mask, cookie, name); + inotify_inode_queue_event(inode, mask, cookie, name, + dentry->d_inode); dput(parent); } else spin_unlock(&dentry->d_lock); @@ -665,7 +383,7 @@ void inotify_unmount_inodes(struct list_head *list) need_iput_tmp = need_iput; need_iput = NULL; - /* In case the remove_watch() drops a reference. */ + /* In case inotify_remove_watch_locked() drops a reference. */ if (inode != need_iput_tmp) __iget(inode); else @@ -694,11 +412,12 @@ void inotify_unmount_inodes(struct list_head *list) mutex_lock(&inode->inotify_mutex); watches = &inode->inotify_watches; list_for_each_entry_safe(watch, next_w, watches, i_list) { - struct inotify_device *dev = watch->dev; - mutex_lock(&dev->mutex); - inotify_dev_queue_event(dev, watch, IN_UNMOUNT,0,NULL); - remove_watch(watch, dev); - mutex_unlock(&dev->mutex); + struct inotify_handle *ih= watch->ih; + mutex_lock(&ih->mutex); + ih->in_ops->handle_event(watch, watch->wd, IN_UNMOUNT, 0, + NULL, NULL); + inotify_remove_watch_locked(ih, watch); + mutex_unlock(&ih->mutex); } mutex_unlock(&inode->inotify_mutex); iput(inode); @@ -718,432 +437,292 @@ void inotify_inode_is_dead(struct inode *inode) mutex_lock(&inode->inotify_mutex); list_for_each_entry_safe(watch, next, &inode->inotify_watches, i_list) { - struct inotify_device *dev = watch->dev; - mutex_lock(&dev->mutex); - remove_watch(watch, dev); - mutex_unlock(&dev->mutex); + struct inotify_handle *ih = watch->ih; + mutex_lock(&ih->mutex); + inotify_remove_watch_locked(ih, watch); + mutex_unlock(&ih->mutex); } mutex_unlock(&inode->inotify_mutex); } EXPORT_SYMBOL_GPL(inotify_inode_is_dead); -/* Device Interface */ +/* Kernel Consumer API */ -static unsigned int inotify_poll(struct file *file, poll_table *wait) +/** + * inotify_init - allocate and initialize an inotify instance + * @ops: caller's inotify operations + */ +struct inotify_handle *inotify_init(const struct inotify_operations *ops) { - struct inotify_device *dev = file->private_data; - int ret = 0; + struct inotify_handle *ih; - poll_wait(file, &dev->wq, wait); - mutex_lock(&dev->mutex); - if (!list_empty(&dev->events)) - ret = POLLIN | POLLRDNORM; - mutex_unlock(&dev->mutex); + ih = kmalloc(sizeof(struct inotify_handle), GFP_KERNEL); + if (unlikely(!ih)) + return ERR_PTR(-ENOMEM); - return ret; + idr_init(&ih->idr); + INIT_LIST_HEAD(&ih->watches); + mutex_init(&ih->mutex); + ih->last_wd = 0; + ih->in_ops = ops; + atomic_set(&ih->count, 0); + get_inotify_handle(ih); + + return ih; } +EXPORT_SYMBOL_GPL(inotify_init); -static ssize_t inotify_read(struct file *file, char __user *buf, - size_t count, loff_t *pos) +/** + * inotify_init_watch - initialize an inotify watch + * @watch: watch to initialize + */ +void inotify_init_watch(struct inotify_watch *watch) { - size_t event_size = sizeof (struct inotify_event); - struct inotify_device *dev; - char __user *start; - int ret; - DEFINE_WAIT(wait); - - start = buf; - dev = file->private_data; - - while (1) { - int events; - - prepare_to_wait(&dev->wq, &wait, TASK_INTERRUPTIBLE); - - mutex_lock(&dev->mutex); - events = !list_empty(&dev->events); - mutex_unlock(&dev->mutex); - if (events) { - ret = 0; - break; - } - - if (file->f_flags & O_NONBLOCK) { - ret = -EAGAIN; - break; - } - - if (signal_pending(current)) { - ret = -EINTR; - break; - } - - schedule(); - } - - finish_wait(&dev->wq, &wait); - if (ret) - return ret; - - mutex_lock(&dev->mutex); - while (1) { - struct inotify_kernel_event *kevent; - - ret = buf - start; - if (list_empty(&dev->events)) - break; - - kevent = inotify_dev_get_event(dev); - if (event_size + kevent->event.len > count) - break; - - if (copy_to_user(buf, &kevent->event, event_size)) { - ret = -EFAULT; - break; - } - buf += event_size; - count -= event_size; - - if (kevent->name) { - if (copy_to_user(buf, kevent->name, kevent->event.len)){ - ret = -EFAULT; - break; - } - buf += kevent->event.len; - count -= kevent->event.len; - } - - remove_kevent(dev, kevent); - } - mutex_unlock(&dev->mutex); - - return ret; + INIT_LIST_HEAD(&watch->h_list); + INIT_LIST_HEAD(&watch->i_list); + atomic_set(&watch->count, 0); + get_inotify_watch(watch); /* initial get */ } +EXPORT_SYMBOL_GPL(inotify_init_watch); -static int inotify_release(struct inode *ignored, struct file *file) +/** + * inotify_destroy - clean up and destroy an inotify instance + * @ih: inotify handle + */ +void inotify_destroy(struct inotify_handle *ih) { - struct inotify_device *dev = file->private_data; - /* - * Destroy all of the watches on this device. Unfortunately, not very + * Destroy all of the watches for this handle. Unfortunately, not very * pretty. We cannot do a simple iteration over the list, because we * do not know the inode until we iterate to the watch. But we need to - * hold inode->inotify_mutex before dev->mutex. The following works. + * hold inode->inotify_mutex before ih->mutex. The following works. */ while (1) { struct inotify_watch *watch; struct list_head *watches; struct inode *inode; - mutex_lock(&dev->mutex); - watches = &dev->watches; + mutex_lock(&ih->mutex); + watches = &ih->watches; if (list_empty(watches)) { - mutex_unlock(&dev->mutex); + mutex_unlock(&ih->mutex); break; } - watch = list_entry(watches->next, struct inotify_watch, d_list); + watch = list_entry(watches->next, struct inotify_watch, h_list); get_inotify_watch(watch); - mutex_unlock(&dev->mutex); + mutex_unlock(&ih->mutex); inode = watch->inode; mutex_lock(&inode->inotify_mutex); - mutex_lock(&dev->mutex); + mutex_lock(&ih->mutex); /* make sure we didn't race with another list removal */ - if (likely(idr_find(&dev->idr, watch->wd))) - remove_watch_no_event(watch, dev); + if (likely(idr_find(&ih->idr, watch->wd))) { + remove_watch_no_event(watch, ih); + put_inotify_watch(watch); + } - mutex_unlock(&dev->mutex); + mutex_unlock(&ih->mutex); mutex_unlock(&inode->inotify_mutex); put_inotify_watch(watch); } - /* destroy all of the events on this device */ - mutex_lock(&dev->mutex); - while (!list_empty(&dev->events)) - inotify_dev_event_dequeue(dev); - mutex_unlock(&dev->mutex); - - /* free this device: the put matching the get in inotify_init() */ - put_inotify_dev(dev); - - return 0; + /* free this handle: the put matching the get in inotify_init() */ + put_inotify_handle(ih); } +EXPORT_SYMBOL_GPL(inotify_destroy); -/* - * inotify_ignore - remove a given wd from this inotify instance. +/** + * inotify_find_watch - find an existing watch for an (ih,inode) pair + * @ih: inotify handle + * @inode: inode to watch + * @watchp: pointer to existing inotify_watch * - * Can sleep. + * Caller must pin given inode (via nameidata). */ -static int inotify_ignore(struct inotify_device *dev, s32 wd) +s32 inotify_find_watch(struct inotify_handle *ih, struct inode *inode, + struct inotify_watch **watchp) { - struct inotify_watch *watch; - struct inode *inode; - - mutex_lock(&dev->mutex); - watch = idr_find(&dev->idr, wd); - if (unlikely(!watch)) { - mutex_unlock(&dev->mutex); - return -EINVAL; - } - get_inotify_watch(watch); - inode = watch->inode; - mutex_unlock(&dev->mutex); + struct inotify_watch *old; + int ret = -ENOENT; mutex_lock(&inode->inotify_mutex); - mutex_lock(&dev->mutex); + mutex_lock(&ih->mutex); - /* make sure that we did not race */ - if (likely(idr_find(&dev->idr, wd) == watch)) - remove_watch(watch, dev); + old = inode_find_handle(inode, ih); + if (unlikely(old)) { + get_inotify_watch(old); /* caller must put watch */ + *watchp = old; + ret = old->wd; + } - mutex_unlock(&dev->mutex); + mutex_unlock(&ih->mutex); mutex_unlock(&inode->inotify_mutex); - put_inotify_watch(watch); - return 0; + return ret; } +EXPORT_SYMBOL_GPL(inotify_find_watch); -static long inotify_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) +/** + * inotify_find_update_watch - find and update the mask of an existing watch + * @ih: inotify handle + * @inode: inode's watch to update + * @mask: mask of events to watch + * + * Caller must pin given inode (via nameidata). + */ +s32 inotify_find_update_watch(struct inotify_handle *ih, struct inode *inode, + u32 mask) { - struct inotify_device *dev; - void __user *p; - int ret = -ENOTTY; - - dev = file->private_data; - p = (void __user *) arg; - - switch (cmd) { - case FIONREAD: - ret = put_user(dev->queue_size, (int __user *) p); - break; - } - - return ret; -} + struct inotify_watch *old; + int mask_add = 0; + int ret; -static const struct file_operations inotify_fops = { - .poll = inotify_poll, - .read = inotify_read, - .release = inotify_release, - .unlocked_ioctl = inotify_ioctl, - .compat_ioctl = inotify_ioctl, -}; + if (mask & IN_MASK_ADD) + mask_add = 1; -asmlinkage long sys_inotify_init(void) -{ - struct inotify_device *dev; - struct user_struct *user; - struct file *filp; - int fd, ret; - - fd = get_unused_fd(); - if (fd < 0) - return fd; - - filp = get_empty_filp(); - if (!filp) { - ret = -ENFILE; - goto out_put_fd; - } + /* don't allow invalid bits: we don't want flags set */ + mask &= IN_ALL_EVENTS | IN_ONESHOT; + if (unlikely(!mask)) + return -EINVAL; - user = get_uid(current->user); - if (unlikely(atomic_read(&user->inotify_devs) >= - inotify_max_user_instances)) { - ret = -EMFILE; - goto out_free_uid; - } + mutex_lock(&inode->inotify_mutex); + mutex_lock(&ih->mutex); - dev = kmalloc(sizeof(struct inotify_device), GFP_KERNEL); - if (unlikely(!dev)) { - ret = -ENOMEM; - goto out_free_uid; + /* + * Handle the case of re-adding a watch on an (inode,ih) pair that we + * are already watching. We just update the mask and return its wd. + */ + old = inode_find_handle(inode, ih); + if (unlikely(!old)) { + ret = -ENOENT; + goto out; } - filp->f_op = &inotify_fops; - filp->f_vfsmnt = mntget(inotify_mnt); - filp->f_dentry = dget(inotify_mnt->mnt_root); - filp->f_mapping = filp->f_dentry->d_inode->i_mapping; - filp->f_mode = FMODE_READ; - filp->f_flags = O_RDONLY; - filp->private_data = dev; - - idr_init(&dev->idr); - INIT_LIST_HEAD(&dev->events); - INIT_LIST_HEAD(&dev->watches); - init_waitqueue_head(&dev->wq); - mutex_init(&dev->mutex); - dev->event_count = 0; - dev->queue_size = 0; - dev->max_events = inotify_max_queued_events; - dev->user = user; - dev->last_wd = 0; - atomic_set(&dev->count, 0); - - get_inotify_dev(dev); - atomic_inc(&user->inotify_devs); - fd_install(fd, filp); - - return fd; -out_free_uid: - free_uid(user); - put_filp(filp); -out_put_fd: - put_unused_fd(fd); + if (mask_add) + old->mask |= mask; + else + old->mask = mask; + ret = old->wd; +out: + mutex_unlock(&ih->mutex); + mutex_unlock(&inode->inotify_mutex); return ret; } +EXPORT_SYMBOL_GPL(inotify_find_update_watch); -asmlinkage long sys_inotify_add_watch(int fd, const char __user *path, u32 mask) +/** + * inotify_add_watch - add a watch to an inotify instance + * @ih: inotify handle + * @watch: caller allocated watch structure + * @inode: inode to watch + * @mask: mask of events to watch + * + * Caller must pin given inode (via nameidata). + * Caller must ensure it only calls inotify_add_watch() once per watch. + * Calls inotify_handle_get_wd() so may sleep. + */ +s32 inotify_add_watch(struct inotify_handle *ih, struct inotify_watch *watch, + struct inode *inode, u32 mask) { - struct inotify_watch *watch, *old; - struct inode *inode; - struct inotify_device *dev; - struct nameidata nd; - struct file *filp; - int ret, fput_needed; - int mask_add = 0; - unsigned flags = 0; - - filp = fget_light(fd, &fput_needed); - if (unlikely(!filp)) - return -EBADF; - - /* verify that this is indeed an inotify instance */ - if (unlikely(filp->f_op != &inotify_fops)) { - ret = -EINVAL; - goto fput_and_out; - } - - 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; + int ret = 0; - /* inode held in place by reference to nd; dev by fget on fd */ - inode = nd.dentry->d_inode; - dev = filp->private_data; + /* don't allow invalid bits: we don't want flags set */ + mask &= IN_ALL_EVENTS | IN_ONESHOT; + if (unlikely(!mask)) + return -EINVAL; + watch->mask = mask; mutex_lock(&inode->inotify_mutex); - mutex_lock(&dev->mutex); - - if (mask & IN_MASK_ADD) - mask_add = 1; + mutex_lock(&ih->mutex); - /* don't let user-space set invalid bits: we don't want flags set */ - mask &= IN_ALL_EVENTS | IN_ONESHOT; - if (unlikely(!mask)) { - ret = -EINVAL; + /* Initialize a new watch */ + ret = inotify_handle_get_wd(ih, watch); + if (unlikely(ret)) goto out; - } + ret = watch->wd; + + /* save a reference to handle and bump the count to make it official */ + get_inotify_handle(ih); + watch->ih = ih; /* - * Handle the case of re-adding a watch on an (inode,dev) pair that we - * are already watching. We just update the mask and return its wd. + * Save a reference to the inode and bump the ref count to make it + * official. We hold a reference to nameidata, which makes this safe. */ - old = inode_find_dev(inode, dev); - if (unlikely(old)) { - if (mask_add) - old->mask |= mask; - else - old->mask = mask; - ret = old->wd; - goto out; - } - - watch = create_watch(dev, mask, inode); - if (unlikely(IS_ERR(watch))) { - ret = PTR_ERR(watch); - goto out; - } + watch->inode = igrab(inode); if (!inotify_inode_watched(inode)) set_dentry_child_flags(inode, 1); - /* Add the watch to the device's and the inode's list */ - list_add(&watch->d_list, &dev->watches); + /* Add the watch to the handle's and the inode's list */ + list_add(&watch->h_list, &ih->watches); list_add(&watch->i_list, &inode->inotify_watches); - ret = watch->wd; out: - mutex_unlock(&dev->mutex); + mutex_unlock(&ih->mutex); mutex_unlock(&inode->inotify_mutex); - path_release(&nd); -fput_and_out: - fput_light(filp, fput_needed); return ret; } +EXPORT_SYMBOL_GPL(inotify_add_watch); -asmlinkage long sys_inotify_rm_watch(int fd, u32 wd) +/** + * inotify_rm_wd - remove a watch from an inotify instance + * @ih: inotify handle + * @wd: watch descriptor to remove + * + * Can sleep. + */ +int inotify_rm_wd(struct inotify_handle *ih, u32 wd) { - struct file *filp; - struct inotify_device *dev; - int ret, fput_needed; - - filp = fget_light(fd, &fput_needed); - if (unlikely(!filp)) - return -EBADF; + struct inotify_watch *watch; + struct inode *inode; - /* verify that this is indeed an inotify instance */ - if (unlikely(filp->f_op != &inotify_fops)) { - ret = -EINVAL; - goto out; + mutex_lock(&ih->mutex); + watch = idr_find(&ih->idr, wd); + if (unlikely(!watch)) { + mutex_unlock(&ih->mutex); + return -EINVAL; } + get_inotify_watch(watch); + inode = watch->inode; + mutex_unlock(&ih->mutex); - dev = filp->private_data; - ret = inotify_ignore(dev, wd); + mutex_lock(&inode->inotify_mutex); + mutex_lock(&ih->mutex); -out: - fput_light(filp, fput_needed); - return ret; + /* make sure that we did not race */ + if (likely(idr_find(&ih->idr, wd) == watch)) + inotify_remove_watch_locked(ih, watch); + + mutex_unlock(&ih->mutex); + mutex_unlock(&inode->inotify_mutex); + put_inotify_watch(watch); + + return 0; } +EXPORT_SYMBOL_GPL(inotify_rm_wd); -static struct super_block * -inotify_get_sb(struct file_system_type *fs_type, int flags, - const char *dev_name, void *data) +/** + * inotify_rm_watch - remove a watch from an inotify instance + * @ih: inotify handle + * @watch: watch to remove + * + * Can sleep. + */ +int inotify_rm_watch(struct inotify_handle *ih, + struct inotify_watch *watch) { - return get_sb_pseudo(fs_type, "inotify", NULL, 0xBAD1DEA); + return inotify_rm_wd(ih, watch->wd); } - -static struct file_system_type inotify_fs_type = { - .name = "inotifyfs", - .get_sb = inotify_get_sb, - .kill_sb = kill_anon_super, -}; +EXPORT_SYMBOL_GPL(inotify_rm_watch); /* - * inotify_setup - Our initialization function. Note that we cannnot return - * error because we have compiled-in VFS hooks. So an (unlikely) failure here - * must result in panic(). + * inotify_setup - core initialization function */ static int __init inotify_setup(void) { - int ret; - - ret = register_filesystem(&inotify_fs_type); - if (unlikely(ret)) - panic("inotify: register_filesystem returned %d!\n", ret); - - inotify_mnt = kern_mount(&inotify_fs_type); - if (IS_ERR(inotify_mnt)) - panic("inotify: kern_mount ret %ld!\n", PTR_ERR(inotify_mnt)); - - inotify_max_queued_events = 16384; - inotify_max_user_instances = 128; - inotify_max_user_watches = 8192; - atomic_set(&inotify_cookie, 0); - watch_cachep = kmem_cache_create("inotify_watch_cache", - sizeof(struct inotify_watch), - 0, SLAB_PANIC, NULL, NULL); - event_cachep = kmem_cache_create("inotify_event_cache", - sizeof(struct inotify_kernel_event), - 0, SLAB_PANIC, NULL, NULL); - return 0; } diff --git a/fs/ioctl.c b/fs/ioctl.c index 95ff6a5a4..44f6e4cc4 100644 --- a/fs/ioctl.c +++ b/fs/ioctl.c @@ -4,7 +4,6 @@ * Copyright (C) 1991, 1992 Linus Torvalds */ -#include #include #include #include diff --git a/fs/ioprio.c b/fs/ioprio.c index 66240ed9b..359fa7011 100644 --- a/fs/ioprio.c +++ b/fs/ioprio.c @@ -24,21 +24,29 @@ #include #include #include -#include +#include static int set_task_ioprio(struct task_struct *task, int ioprio) { + int err; struct io_context *ioc; if (task->uid != current->euid && task->uid != current->uid && !capable(CAP_SYS_NICE)) return -EPERM; + err = security_task_setioprio(task, ioprio); + if (err) + return err; + task_lock(task); task->ioprio = ioprio; ioc = task->io_context; + /* see wmb() in current_io_context() */ + smp_read_barrier_depends(); + if (ioc && ioc->set_ioprio) ioc->set_ioprio(ioc, ioprio); @@ -106,9 +114,9 @@ asmlinkage long sys_ioprio_set(int which, int who, int ioprio) continue; ret = set_task_ioprio(p, ioprio); if (ret) - break; + goto free_uid; } while_each_thread(g, p); - +free_uid: if (who) free_uid(user); break; @@ -120,11 +128,47 @@ asmlinkage long sys_ioprio_set(int which, int who, int ioprio) return ret; } +static int get_task_ioprio(struct task_struct *p) +{ + int ret; + + ret = security_task_getioprio(p); + if (ret) + goto out; + ret = p->ioprio; +out: + return ret; +} + +int ioprio_best(unsigned short aprio, unsigned short bprio) +{ + unsigned short aclass = IOPRIO_PRIO_CLASS(aprio); + unsigned short bclass = IOPRIO_PRIO_CLASS(bprio); + + if (!ioprio_valid(aprio)) + return bprio; + if (!ioprio_valid(bprio)) + return aprio; + + if (aclass == IOPRIO_CLASS_NONE) + aclass = IOPRIO_CLASS_BE; + if (bclass == IOPRIO_CLASS_NONE) + bclass = IOPRIO_CLASS_BE; + + if (aclass == bclass) + return min(aprio, bprio); + if (aclass > bclass) + return bprio; + else + return aprio; +} + asmlinkage long sys_ioprio_get(int which, int who) { struct task_struct *g, *p; struct user_struct *user; int ret = -ESRCH; + int tmpio; read_lock_irq(&tasklist_lock); switch (which) { @@ -134,16 +178,19 @@ asmlinkage long sys_ioprio_get(int which, int who) else p = find_task_by_pid(who); if (p) - ret = p->ioprio; + ret = get_task_ioprio(p); break; case IOPRIO_WHO_PGRP: if (!who) who = process_group(current); do_each_task_pid(who, PIDTYPE_PGID, p) { + tmpio = get_task_ioprio(p); + if (tmpio < 0) + continue; if (ret == -ESRCH) - ret = p->ioprio; + ret = tmpio; else - ret = ioprio_best(ret, p->ioprio); + ret = ioprio_best(ret, tmpio); } while_each_task_pid(who, PIDTYPE_PGID, p); break; case IOPRIO_WHO_USER: @@ -158,10 +205,13 @@ asmlinkage long sys_ioprio_get(int which, int who) do_each_thread(g, p) { if (p->uid != user->uid) continue; + tmpio = get_task_ioprio(p); + if (tmpio < 0) + continue; if (ret == -ESRCH) - ret = p->ioprio; + ret = tmpio; else - ret = ioprio_best(ret, p->ioprio); + ret = ioprio_best(ret, tmpio); } while_each_thread(g, p); if (who) diff --git a/fs/isofs/compress.c b/fs/isofs/compress.c index 4917315db..731816332 100644 --- a/fs/isofs/compress.c +++ b/fs/isofs/compress.c @@ -16,7 +16,6 @@ * Transparent decompression of files on an iso9660 filesystem */ -#include #include #include @@ -312,7 +311,7 @@ eio: return err; } -struct address_space_operations zisofs_aops = { +const struct address_space_operations zisofs_aops = { .readpage = zisofs_readpage, /* No sync_page operation supported? */ /* No bmap operation supported */ diff --git a/fs/isofs/dir.c b/fs/isofs/dir.c index 5440ea292..27e276987 100644 --- a/fs/isofs/dir.c +++ b/fs/isofs/dir.c @@ -10,7 +10,6 @@ * * isofs directory handling functions */ -#include #include #include "isofs.h" diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c index 70adbb98b..e5fbb035a 100644 --- a/fs/isofs/inode.c +++ b/fs/isofs/inode.c @@ -11,7 +11,6 @@ * 2004 Paul Serice - NFS Export Operations */ -#include #include #include @@ -56,7 +55,7 @@ static void isofs_put_super(struct super_block *sb) } static void isofs_read_inode(struct inode *); -static int isofs_statfs (struct super_block *, struct kstatfs *); +static int isofs_statfs (struct dentry *, struct kstatfs *); static kmem_cache_t *isofs_inode_cachep; @@ -901,8 +900,10 @@ out_freesbi: return -EINVAL; } -static int isofs_statfs (struct super_block *sb, struct kstatfs *buf) +static int isofs_statfs (struct dentry *dentry, struct kstatfs *buf) { + struct super_block *sb = dentry->d_sb; + buf->f_type = ISOFS_SUPER_MAGIC; buf->f_bsize = sb->s_blocksize; buf->f_blocks = (ISOFS_SB(sb)->s_nzones @@ -1052,7 +1053,7 @@ static sector_t _isofs_bmap(struct address_space *mapping, sector_t block) return generic_block_bmap(mapping,block,isofs_get_block); } -static struct address_space_operations isofs_aops = { +static const struct address_space_operations isofs_aops = { .readpage = isofs_readpage, .sync_page = block_sync_page, .bmap = _isofs_bmap @@ -1237,7 +1238,7 @@ static void isofs_read_inode(struct inode *inode) } inode->i_uid = sbi->s_uid; inode->i_gid = sbi->s_gid; - inode->i_blocks = inode->i_blksize = 0; + inode->i_blocks = 0; ei->i_format_parm[0] = 0; ei->i_format_parm[1] = 0; @@ -1293,7 +1294,6 @@ static void isofs_read_inode(struct inode *inode) isonum_711 (de->ext_attr_length)); /* Set the number of blocks for stat() - should be done before RR */ - inode->i_blksize = PAGE_CACHE_SIZE; /* For stat() only */ inode->i_blocks = (inode->i_size + 511) >> 9; /* @@ -1399,10 +1399,11 @@ struct inode *isofs_iget(struct super_block *sb, return inode; } -static struct super_block *isofs_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int isofs_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_bdev(fs_type, flags, dev_name, data, isofs_fill_super); + return get_sb_bdev(fs_type, flags, dev_name, data, isofs_fill_super, + mnt); } static struct file_system_type iso9660_fs_type = { diff --git a/fs/isofs/isofs.h b/fs/isofs/isofs.h index 9ce7b51fb..e6308c8b5 100644 --- a/fs/isofs/isofs.h +++ b/fs/isofs/isofs.h @@ -47,6 +47,8 @@ struct isofs_sb_info { unsigned char s_nosuid; unsigned char s_nodev; unsigned char s_nocompress; + unsigned char s_hide; + unsigned char s_showassoc; mode_t s_mode; gid_t s_gid; @@ -173,18 +175,6 @@ isofs_normalize_block_and_offset(struct iso_directory_record* de, } extern struct inode_operations isofs_dir_inode_operations; -extern struct file_operations isofs_dir_operations; -extern struct address_space_operations isofs_symlink_aops; +extern const struct file_operations isofs_dir_operations; +extern const struct address_space_operations isofs_symlink_aops; extern struct export_operations isofs_export_ops; - -/* The following macros are used to check for memory leaks. */ -#ifdef LEAK_CHECK -#define free_s leak_check_free_s -#define malloc leak_check_malloc -#define sb_bread leak_check_bread -#define brelse leak_check_brelse -extern void * leak_check_malloc(unsigned int size); -extern void leak_check_free_s(void * obj, int size); -extern struct buffer_head * leak_check_bread(struct super_block *sb, int block); -extern void leak_check_brelse(struct buffer_head * bh); -#endif /* LEAK_CHECK */ diff --git a/fs/isofs/namei.c b/fs/isofs/namei.c index e7ba0c30e..c04b3a14a 100644 --- a/fs/isofs/namei.c +++ b/fs/isofs/namei.c @@ -6,7 +6,6 @@ * (C) 1991 Linus Torvalds - minix filesystem */ -#include /* Joliet? */ #include #include "isofs.h" diff --git a/fs/isofs/rock.c b/fs/isofs/rock.c index 4326cb47f..f3a1db309 100644 --- a/fs/isofs/rock.c +++ b/fs/isofs/rock.c @@ -754,6 +754,6 @@ error: return -EIO; } -struct address_space_operations isofs_symlink_aops = { +const struct address_space_operations isofs_symlink_aops = { .readpage = rock_ridge_symlink_readpage }; diff --git a/fs/isofs/zisofs.h b/fs/isofs/zisofs.h index d78485d10..273795709 100644 --- a/fs/isofs/zisofs.h +++ b/fs/isofs/zisofs.h @@ -15,7 +15,7 @@ */ #ifdef CONFIG_ZISOFS -extern struct address_space_operations zisofs_aops; +extern const struct address_space_operations zisofs_aops; extern int __init zisofs_init(void); extern void zisofs_cleanup(void); #endif diff --git a/fs/jbd/checkpoint.c b/fs/jbd/checkpoint.c index 3f5102b06..47678a26c 100644 --- a/fs/jbd/checkpoint.c +++ b/fs/jbd/checkpoint.c @@ -24,29 +24,67 @@ #include /* - * Unlink a buffer from a transaction. + * Unlink a buffer from a transaction checkpoint list. * * Called with j_list_lock held. */ - -static inline void __buffer_unlink(struct journal_head *jh) +static inline void __buffer_unlink_first(struct journal_head *jh) { - transaction_t *transaction; - - transaction = jh->b_cp_transaction; - jh->b_cp_transaction = NULL; + transaction_t *transaction = jh->b_cp_transaction; jh->b_cpnext->b_cpprev = jh->b_cpprev; jh->b_cpprev->b_cpnext = jh->b_cpnext; - if (transaction->t_checkpoint_list == jh) + if (transaction->t_checkpoint_list == jh) { transaction->t_checkpoint_list = jh->b_cpnext; - if (transaction->t_checkpoint_list == jh) - transaction->t_checkpoint_list = NULL; + if (transaction->t_checkpoint_list == jh) + transaction->t_checkpoint_list = NULL; + } +} + +/* + * Unlink a buffer from a transaction checkpoint(io) list. + * + * Called with j_list_lock held. + */ +static inline void __buffer_unlink(struct journal_head *jh) +{ + transaction_t *transaction = jh->b_cp_transaction; + + __buffer_unlink_first(jh); + if (transaction->t_checkpoint_io_list == jh) { + transaction->t_checkpoint_io_list = jh->b_cpnext; + if (transaction->t_checkpoint_io_list == jh) + transaction->t_checkpoint_io_list = NULL; + } +} + +/* + * Move a buffer from the checkpoint list to the checkpoint io list + * + * Called with j_list_lock held + */ +static inline void __buffer_relink_io(struct journal_head *jh) +{ + transaction_t *transaction = jh->b_cp_transaction; + + __buffer_unlink_first(jh); + + if (!transaction->t_checkpoint_io_list) { + jh->b_cpnext = jh->b_cpprev = jh; + } else { + jh->b_cpnext = transaction->t_checkpoint_io_list; + jh->b_cpprev = transaction->t_checkpoint_io_list->b_cpprev; + jh->b_cpprev->b_cpnext = jh; + jh->b_cpnext->b_cpprev = jh; + } + transaction->t_checkpoint_io_list = jh; } /* * Try to release a checkpointed buffer from its transaction. - * Returns 1 if we released it. + * Returns 1 if we released it and 2 if we also released the + * whole transaction. + * * Requires j_list_lock * Called under jbd_lock_bh_state(jh2bh(jh)), and drops it */ @@ -57,12 +95,11 @@ static int __try_to_free_cp_buf(struct journal_head *jh) if (jh->b_jlist == BJ_None && !buffer_locked(bh) && !buffer_dirty(bh)) { JBUFFER_TRACE(jh, "remove from checkpoint list"); - __journal_remove_checkpoint(jh); + ret = __journal_remove_checkpoint(jh) + 1; jbd_unlock_bh_state(bh); journal_remove_journal_head(bh); BUFFER_TRACE(bh, "release"); __brelse(bh); - ret = 1; } else { jbd_unlock_bh_state(bh); } @@ -117,83 +154,54 @@ static void jbd_sync_bh(journal_t *journal, struct buffer_head *bh) } /* - * Clean up a transaction's checkpoint list. - * - * We wait for any pending IO to complete and make sure any clean - * buffers are removed from the transaction. - * - * Return 1 if we performed any actions which might have destroyed the - * checkpoint. (journal_remove_checkpoint() deletes the transaction when - * the last checkpoint buffer is cleansed) + * Clean up transaction's list of buffers submitted for io. + * We wait for any pending IO to complete and remove any clean + * buffers. Note that we take the buffers in the opposite ordering + * from the one in which they were submitted for IO. * * Called with j_list_lock held. */ -static int __cleanup_transaction(journal_t *journal, transaction_t *transaction) +static void __wait_cp_io(journal_t *journal, transaction_t *transaction) { - struct journal_head *jh, *next_jh, *last_jh; + struct journal_head *jh; struct buffer_head *bh; - int ret = 0; - - assert_spin_locked(&journal->j_list_lock); - jh = transaction->t_checkpoint_list; - if (!jh) - return 0; - - last_jh = jh->b_cpprev; - next_jh = jh; - do { - jh = next_jh; + tid_t this_tid; + int released = 0; + + this_tid = transaction->t_tid; +restart: + /* Did somebody clean up the transaction in the meanwhile? */ + if (journal->j_checkpoint_transactions != transaction || + transaction->t_tid != this_tid) + return; + while (!released && transaction->t_checkpoint_io_list) { + jh = transaction->t_checkpoint_io_list; bh = jh2bh(jh); + if (!jbd_trylock_bh_state(bh)) { + jbd_sync_bh(journal, bh); + spin_lock(&journal->j_list_lock); + goto restart; + } if (buffer_locked(bh)) { atomic_inc(&bh->b_count); spin_unlock(&journal->j_list_lock); + jbd_unlock_bh_state(bh); wait_on_buffer(bh); /* the journal_head may have gone by now */ BUFFER_TRACE(bh, "brelse"); __brelse(bh); - goto out_return_1; + spin_lock(&journal->j_list_lock); + goto restart; } - /* - * This is foul + * Now in whatever state the buffer currently is, we know that + * it has been written out and so we can drop it from the list */ - if (!jbd_trylock_bh_state(bh)) { - jbd_sync_bh(journal, bh); - goto out_return_1; - } - - if (jh->b_transaction != NULL) { - transaction_t *t = jh->b_transaction; - tid_t tid = t->t_tid; - - spin_unlock(&journal->j_list_lock); - jbd_unlock_bh_state(bh); - log_start_commit(journal, tid); - log_wait_commit(journal, tid); - goto out_return_1; - } - - /* - * AKPM: I think the buffer_jbddirty test is redundant - it - * shouldn't have NULL b_transaction? - */ - next_jh = jh->b_cpnext; - if (!buffer_dirty(bh) && !buffer_jbddirty(bh)) { - BUFFER_TRACE(bh, "remove from checkpoint"); - __journal_remove_checkpoint(jh); - jbd_unlock_bh_state(bh); - journal_remove_journal_head(bh); - __brelse(bh); - ret = 1; - } else { - jbd_unlock_bh_state(bh); - } - } while (jh != last_jh); - - return ret; -out_return_1: - spin_lock(&journal->j_list_lock); - return 1; + released = __journal_remove_checkpoint(jh); + jbd_unlock_bh_state(bh); + journal_remove_journal_head(bh); + __brelse(bh); + } } #define NR_BATCH 64 @@ -203,9 +211,7 @@ __flush_batch(journal_t *journal, struct buffer_head **bhs, int *batch_count) { int i; - spin_unlock(&journal->j_list_lock); ll_rw_block(SWRITE, *batch_count, bhs); - spin_lock(&journal->j_list_lock); for (i = 0; i < *batch_count; i++) { struct buffer_head *bh = bhs[i]; clear_buffer_jwrite(bh); @@ -221,19 +227,43 @@ __flush_batch(journal_t *journal, struct buffer_head **bhs, int *batch_count) * Return 1 if something happened which requires us to abort the current * scan of the checkpoint list. * - * Called with j_list_lock held. + * Called with j_list_lock held and drops it if 1 is returned * Called under jbd_lock_bh_state(jh2bh(jh)), and drops it */ -static int __flush_buffer(journal_t *journal, struct journal_head *jh, - struct buffer_head **bhs, int *batch_count, - int *drop_count) +static int __process_buffer(journal_t *journal, struct journal_head *jh, + struct buffer_head **bhs, int *batch_count) { struct buffer_head *bh = jh2bh(jh); int ret = 0; - if (buffer_dirty(bh) && !buffer_locked(bh) && jh->b_jlist == BJ_None) { - J_ASSERT_JH(jh, jh->b_transaction == NULL); + if (buffer_locked(bh)) { + atomic_inc(&bh->b_count); + spin_unlock(&journal->j_list_lock); + jbd_unlock_bh_state(bh); + wait_on_buffer(bh); + /* the journal_head may have gone by now */ + BUFFER_TRACE(bh, "brelse"); + __brelse(bh); + ret = 1; + } else if (jh->b_transaction != NULL) { + transaction_t *t = jh->b_transaction; + tid_t tid = t->t_tid; + spin_unlock(&journal->j_list_lock); + jbd_unlock_bh_state(bh); + log_start_commit(journal, tid); + log_wait_commit(journal, tid); + ret = 1; + } else if (!buffer_dirty(bh)) { + J_ASSERT_JH(jh, !buffer_jbddirty(bh)); + BUFFER_TRACE(bh, "remove from checkpoint"); + __journal_remove_checkpoint(jh); + spin_unlock(&journal->j_list_lock); + jbd_unlock_bh_state(bh); + journal_remove_journal_head(bh); + __brelse(bh); + ret = 1; + } else { /* * Important: we are about to write the buffer, and * possibly block, while still holding the journal lock. @@ -246,45 +276,30 @@ static int __flush_buffer(journal_t *journal, struct journal_head *jh, J_ASSERT_BH(bh, !buffer_jwrite(bh)); set_buffer_jwrite(bh); bhs[*batch_count] = bh; + __buffer_relink_io(jh); jbd_unlock_bh_state(bh); (*batch_count)++; if (*batch_count == NR_BATCH) { + spin_unlock(&journal->j_list_lock); __flush_batch(journal, bhs, batch_count); ret = 1; } - } else { - int last_buffer = 0; - if (jh->b_cpnext == jh) { - /* We may be about to drop the transaction. Tell the - * caller that the lists have changed. - */ - last_buffer = 1; - } - if (__try_to_free_cp_buf(jh)) { - (*drop_count)++; - ret = last_buffer; - } } return ret; } /* - * Perform an actual checkpoint. We don't write out only enough to - * satisfy the current blocked requests: rather we submit a reasonably - * sized chunk of the outstanding data to disk at once for - * efficiency. __log_wait_for_space() will retry if we didn't free enough. + * Perform an actual checkpoint. We take the first transaction on the + * list of transactions to be checkpointed and send all its buffers + * to disk. We submit larger chunks of data at once. * - * However, we _do_ take into account the amount requested so that once - * the IO has been queued, we can return as soon as enough of it has - * completed to disk. - * * The journal should be locked before calling this function. */ int log_do_checkpoint(journal_t *journal) { + transaction_t *transaction; + tid_t this_tid; int result; - int batch_count = 0; - struct buffer_head *bhs[NR_BATCH]; jbd_debug(1, "Start checkpoint\n"); @@ -299,79 +314,68 @@ int log_do_checkpoint(journal_t *journal) return result; /* - * OK, we need to start writing disk blocks. Try to free up a - * quarter of the log in a single checkpoint if we can. + * OK, we need to start writing disk blocks. Take one transaction + * and write it. */ + spin_lock(&journal->j_list_lock); + if (!journal->j_checkpoint_transactions) + goto out; + transaction = journal->j_checkpoint_transactions; + this_tid = transaction->t_tid; +restart: /* - * AKPM: check this code. I had a feeling a while back that it - * degenerates into a busy loop at unmount time. + * If someone cleaned up this transaction while we slept, we're + * done (maybe it's a new transaction, but it fell at the same + * address). */ - spin_lock(&journal->j_list_lock); - while (journal->j_checkpoint_transactions) { - transaction_t *transaction; - struct journal_head *jh, *last_jh, *next_jh; - int drop_count = 0; - int cleanup_ret, retry = 0; - tid_t this_tid; - - transaction = journal->j_checkpoint_transactions; - this_tid = transaction->t_tid; - jh = transaction->t_checkpoint_list; - last_jh = jh->b_cpprev; - next_jh = jh; - do { + if (journal->j_checkpoint_transactions == transaction && + transaction->t_tid == this_tid) { + int batch_count = 0; + struct buffer_head *bhs[NR_BATCH]; + struct journal_head *jh; + int retry = 0; + + while (!retry && transaction->t_checkpoint_list) { struct buffer_head *bh; - jh = next_jh; - next_jh = jh->b_cpnext; + jh = transaction->t_checkpoint_list; bh = jh2bh(jh); if (!jbd_trylock_bh_state(bh)) { jbd_sync_bh(journal, bh); - spin_lock(&journal->j_list_lock); retry = 1; break; } - retry = __flush_buffer(journal, jh, bhs, &batch_count, &drop_count); - if (cond_resched_lock(&journal->j_list_lock)) { + retry = __process_buffer(journal, jh, bhs,&batch_count); + if (!retry && lock_need_resched(&journal->j_list_lock)){ + spin_unlock(&journal->j_list_lock); retry = 1; break; } - } while (jh != last_jh && !retry); + } if (batch_count) { + if (!retry) { + spin_unlock(&journal->j_list_lock); + retry = 1; + } __flush_batch(journal, bhs, &batch_count); - retry = 1; } + if (retry) { + spin_lock(&journal->j_list_lock); + goto restart; + } /* - * If someone cleaned up this transaction while we slept, we're - * done - */ - if (journal->j_checkpoint_transactions != transaction) - break; - if (retry) - continue; - /* - * Maybe it's a new transaction, but it fell at the same - * address - */ - if (transaction->t_tid != this_tid) - continue; - /* - * We have walked the whole transaction list without - * finding anything to write to disk. We had better be - * able to make some progress or we are in trouble. + * Now we have cleaned up the first transaction's checkpoint + * list. Let's clean up the second one */ - cleanup_ret = __cleanup_transaction(journal, transaction); - J_ASSERT(drop_count != 0 || cleanup_ret != 0); - if (journal->j_checkpoint_transactions != transaction) - break; + __wait_cp_io(journal, transaction); } +out: spin_unlock(&journal->j_list_lock); result = cleanup_journal_tail(journal); if (result < 0) return result; - return 0; } @@ -455,6 +459,54 @@ int cleanup_journal_tail(journal_t *journal) /* Checkpoint list management */ +/* + * journal_clean_one_cp_list + * + * Find all the written-back checkpoint buffers in the given list and release them. + * + * Called with the journal locked. + * Called with j_list_lock held. + * Returns number of bufers reaped (for debug) + */ + +static int journal_clean_one_cp_list(struct journal_head *jh, int *released) +{ + struct journal_head *last_jh; + struct journal_head *next_jh = jh; + int ret, freed = 0; + + *released = 0; + if (!jh) + return 0; + + last_jh = jh->b_cpprev; + do { + jh = next_jh; + next_jh = jh->b_cpnext; + /* Use trylock because of the ranking */ + if (jbd_trylock_bh_state(jh2bh(jh))) { + ret = __try_to_free_cp_buf(jh); + if (ret) { + freed++; + if (ret == 2) { + *released = 1; + return freed; + } + } + } + /* + * This function only frees up some memory + * if possible so we dont have an obligation + * to finish processing. Bail out if preemption + * requested: + */ + if (need_resched()) + return freed; + } while (jh != last_jh); + + return freed; +} + /* * journal_clean_checkpoint_list * @@ -462,46 +514,44 @@ int cleanup_journal_tail(journal_t *journal) * * Called with the journal locked. * Called with j_list_lock held. - * Returns number of bufers reaped (for debug) + * Returns number of buffers reaped (for debug) */ int __journal_clean_checkpoint_list(journal_t *journal) { transaction_t *transaction, *last_transaction, *next_transaction; int ret = 0; + int released; transaction = journal->j_checkpoint_transactions; - if (transaction == 0) + if (!transaction) goto out; last_transaction = transaction->t_cpprev; next_transaction = transaction; do { - struct journal_head *jh; - transaction = next_transaction; next_transaction = transaction->t_cpnext; - jh = transaction->t_checkpoint_list; - if (jh) { - struct journal_head *last_jh = jh->b_cpprev; - struct journal_head *next_jh = jh; - - do { - jh = next_jh; - next_jh = jh->b_cpnext; - /* Use trylock because of the ranknig */ - if (jbd_trylock_bh_state(jh2bh(jh))) - ret += __try_to_free_cp_buf(jh); - /* - * This function only frees up some memory - * if possible so we dont have an obligation - * to finish processing. Bail out if preemption - * requested: - */ - if (need_resched()) - goto out; - } while (jh != last_jh); - } + ret += journal_clean_one_cp_list(transaction-> + t_checkpoint_list, &released); + /* + * This function only frees up some memory if possible so we + * dont have an obligation to finish processing. Bail out if + * preemption requested: + */ + if (need_resched()) + goto out; + if (released) + continue; + /* + * It is essential that we are as careful as in the case of + * t_checkpoint_list with removing the buffer from the list as + * we can possibly see not yet submitted buffers on io_list + */ + ret += journal_clean_one_cp_list(transaction-> + t_checkpoint_io_list, &released); + if (need_resched()) + goto out; } while (transaction != last_transaction); out: return ret; @@ -516,18 +566,22 @@ out: * buffer updates committed in that transaction have safely been stored * elsewhere on disk. To achieve this, all of the buffers in a * transaction need to be maintained on the transaction's checkpoint - * list until they have been rewritten, at which point this function is + * lists until they have been rewritten, at which point this function is * called to remove the buffer from the existing transaction's - * checkpoint list. + * checkpoint lists. + * + * The function returns 1 if it frees the transaction, 0 otherwise. * * This function is called with the journal locked. * This function is called with j_list_lock held. + * This function is called with jbd_lock_bh_state(jh2bh(jh)) */ -void __journal_remove_checkpoint(struct journal_head *jh) +int __journal_remove_checkpoint(struct journal_head *jh) { transaction_t *transaction; journal_t *journal; + int ret = 0; JBUFFER_TRACE(jh, "entry"); @@ -538,8 +592,10 @@ void __journal_remove_checkpoint(struct journal_head *jh) journal = transaction->t_journal; __buffer_unlink(jh); + jh->b_cp_transaction = NULL; - if (transaction->t_checkpoint_list != NULL) + if (transaction->t_checkpoint_list != NULL || + transaction->t_checkpoint_io_list != NULL) goto out; JBUFFER_TRACE(jh, "transaction has no more buffers"); @@ -565,8 +621,10 @@ void __journal_remove_checkpoint(struct journal_head *jh) /* Just in case anybody was waiting for more transactions to be checkpointed... */ wake_up(&journal->j_wait_logspace); + ret = 1; out: JBUFFER_TRACE(jh, "exit"); + return ret; } /* @@ -628,6 +686,7 @@ void __journal_drop_transaction(journal_t *journal, transaction_t *transaction) J_ASSERT(transaction->t_shadow_list == NULL); J_ASSERT(transaction->t_log_list == NULL); J_ASSERT(transaction->t_checkpoint_list == NULL); + J_ASSERT(transaction->t_checkpoint_io_list == NULL); J_ASSERT(transaction->t_updates == 0); J_ASSERT(journal->j_committing_transaction != transaction); J_ASSERT(journal->j_running_transaction != transaction); diff --git a/fs/jbd/commit.c b/fs/jbd/commit.c index 002ad2bbc..e998a60b9 100644 --- a/fs/jbd/commit.c +++ b/fs/jbd/commit.c @@ -160,6 +160,117 @@ static int journal_write_commit_record(journal_t *journal, return (ret == -EIO); } +void journal_do_submit_data(struct buffer_head **wbuf, int bufs) +{ + int i; + + for (i = 0; i < bufs; i++) { + wbuf[i]->b_end_io = end_buffer_write_sync; + /* We use-up our safety reference in submit_bh() */ + submit_bh(WRITE, wbuf[i]); + } +} + +/* + * Submit all the data buffers to disk + */ +static void journal_submit_data_buffers(journal_t *journal, + transaction_t *commit_transaction) +{ + struct journal_head *jh; + struct buffer_head *bh; + int locked; + int bufs = 0; + struct buffer_head **wbuf = journal->j_wbuf; + + /* + * Whenever we unlock the journal and sleep, things can get added + * onto ->t_sync_datalist, so we have to keep looping back to + * write_out_data until we *know* that the list is empty. + * + * Cleanup any flushed data buffers from the data list. Even in + * abort mode, we want to flush this out as soon as possible. + */ +write_out_data: + cond_resched(); + spin_lock(&journal->j_list_lock); + + while (commit_transaction->t_sync_datalist) { + jh = commit_transaction->t_sync_datalist; + bh = jh2bh(jh); + locked = 0; + + /* Get reference just to make sure buffer does not disappear + * when we are forced to drop various locks */ + get_bh(bh); + /* If the buffer is dirty, we need to submit IO and hence + * we need the buffer lock. We try to lock the buffer without + * blocking. If we fail, we need to drop j_list_lock and do + * blocking lock_buffer(). + */ + if (buffer_dirty(bh)) { + if (test_set_buffer_locked(bh)) { + BUFFER_TRACE(bh, "needs blocking lock"); + spin_unlock(&journal->j_list_lock); + /* Write out all data to prevent deadlocks */ + journal_do_submit_data(wbuf, bufs); + bufs = 0; + lock_buffer(bh); + spin_lock(&journal->j_list_lock); + } + locked = 1; + } + /* We have to get bh_state lock. Again out of order, sigh. */ + if (!inverted_lock(journal, bh)) { + jbd_lock_bh_state(bh); + spin_lock(&journal->j_list_lock); + } + /* Someone already cleaned up the buffer? */ + if (!buffer_jbd(bh) + || jh->b_transaction != commit_transaction + || jh->b_jlist != BJ_SyncData) { + jbd_unlock_bh_state(bh); + if (locked) + unlock_buffer(bh); + BUFFER_TRACE(bh, "already cleaned up"); + put_bh(bh); + continue; + } + if (locked && test_clear_buffer_dirty(bh)) { + BUFFER_TRACE(bh, "needs writeout, adding to array"); + wbuf[bufs++] = bh; + __journal_file_buffer(jh, commit_transaction, + BJ_Locked); + jbd_unlock_bh_state(bh); + if (bufs == journal->j_wbufsize) { + spin_unlock(&journal->j_list_lock); + journal_do_submit_data(wbuf, bufs); + bufs = 0; + goto write_out_data; + } + } + else { + BUFFER_TRACE(bh, "writeout complete: unfile"); + __journal_unfile_buffer(jh); + jbd_unlock_bh_state(bh); + if (locked) + unlock_buffer(bh); + journal_remove_journal_head(bh); + /* Once for our safety reference, once for + * journal_remove_journal_head() */ + put_bh(bh); + put_bh(bh); + } + + if (lock_need_resched(&journal->j_list_lock)) { + spin_unlock(&journal->j_list_lock); + goto write_out_data; + } + } + spin_unlock(&journal->j_list_lock); + journal_do_submit_data(wbuf, bufs); +} + /* * journal_commit_transaction * @@ -261,7 +372,7 @@ void journal_commit_transaction(journal_t *journal) struct buffer_head *bh = jh2bh(jh); jbd_lock_bh_state(bh); - kfree(jh->b_committed_data); + jbd_slab_free(jh->b_committed_data, bh->b_size); jh->b_committed_data = NULL; jbd_unlock_bh_state(bh); } @@ -313,80 +424,13 @@ void journal_commit_transaction(journal_t *journal) * Now start flushing things to disk, in the order they appear * on the transaction lists. Data blocks go first. */ - err = 0; - /* - * Whenever we unlock the journal and sleep, things can get added - * onto ->t_sync_datalist, so we have to keep looping back to - * write_out_data until we *know* that the list is empty. - */ - bufs = 0; - /* - * Cleanup any flushed data buffers from the data list. Even in - * abort mode, we want to flush this out as soon as possible. - */ -write_out_data: - cond_resched(); - spin_lock(&journal->j_list_lock); - - while (commit_transaction->t_sync_datalist) { - struct buffer_head *bh; - - jh = commit_transaction->t_sync_datalist; - commit_transaction->t_sync_datalist = jh->b_tnext; - bh = jh2bh(jh); - if (buffer_locked(bh)) { - BUFFER_TRACE(bh, "locked"); - if (!inverted_lock(journal, bh)) - goto write_out_data; - __journal_temp_unlink_buffer(jh); - __journal_file_buffer(jh, commit_transaction, - BJ_Locked); - jbd_unlock_bh_state(bh); - if (lock_need_resched(&journal->j_list_lock)) { - spin_unlock(&journal->j_list_lock); - goto write_out_data; - } - } else { - if (buffer_dirty(bh)) { - BUFFER_TRACE(bh, "start journal writeout"); - get_bh(bh); - wbuf[bufs++] = bh; - if (bufs == journal->j_wbufsize) { - jbd_debug(2, "submit %d writes\n", - bufs); - spin_unlock(&journal->j_list_lock); - ll_rw_block(SWRITE, bufs, wbuf); - journal_brelse_array(wbuf, bufs); - bufs = 0; - goto write_out_data; - } - } else { - BUFFER_TRACE(bh, "writeout complete: unfile"); - if (!inverted_lock(journal, bh)) - goto write_out_data; - __journal_unfile_buffer(jh); - jbd_unlock_bh_state(bh); - journal_remove_journal_head(bh); - put_bh(bh); - if (lock_need_resched(&journal->j_list_lock)) { - spin_unlock(&journal->j_list_lock); - goto write_out_data; - } - } - } - } - - if (bufs) { - spin_unlock(&journal->j_list_lock); - ll_rw_block(SWRITE, bufs, wbuf); - journal_brelse_array(wbuf, bufs); - spin_lock(&journal->j_list_lock); - } + journal_submit_data_buffers(journal, commit_transaction); /* * Wait for all previously submitted IO to complete. */ + spin_lock(&journal->j_list_lock); while (commit_transaction->t_locked_list) { struct buffer_head *bh; @@ -745,14 +789,14 @@ restart_loop: * Otherwise, we can just throw away the frozen data now. */ if (jh->b_committed_data) { - kfree(jh->b_committed_data); + jbd_slab_free(jh->b_committed_data, bh->b_size); jh->b_committed_data = NULL; if (jh->b_frozen_data) { jh->b_committed_data = jh->b_frozen_data; jh->b_frozen_data = NULL; } } else if (jh->b_frozen_data) { - kfree(jh->b_frozen_data); + jbd_slab_free(jh->b_frozen_data, bh->b_size); jh->b_frozen_data = NULL; } @@ -790,11 +834,22 @@ restart_loop: jbd_unlock_bh_state(bh); } else { J_ASSERT_BH(bh, !buffer_dirty(bh)); - J_ASSERT_JH(jh, jh->b_next_transaction == NULL); - __journal_unfile_buffer(jh); - jbd_unlock_bh_state(bh); - journal_remove_journal_head(bh); /* needs a brelse */ - release_buffer_page(bh); + /* The buffer on BJ_Forget list and not jbddirty means + * it has been freed by this transaction and hence it + * could not have been reallocated until this + * transaction has committed. *BUT* it could be + * reallocated once we have written all the data to + * disk and before we process the buffer on BJ_Forget + * list. */ + JBUFFER_TRACE(jh, "refile or unfile freed buffer"); + __journal_refile_buffer(jh); + if (!jh->b_transaction) { + jbd_unlock_bh_state(bh); + /* needs a brelse */ + journal_remove_journal_head(bh); + release_buffer_page(bh); + } else + jbd_unlock_bh_state(bh); } cond_resched_lock(&journal->j_list_lock); } diff --git a/fs/jbd/journal.c b/fs/jbd/journal.c index 7f96b5cb6..f66724ce4 100644 --- a/fs/jbd/journal.c +++ b/fs/jbd/journal.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -83,6 +84,7 @@ EXPORT_SYMBOL(journal_force_commit); static int journal_convert_superblock_v1(journal_t *, journal_superblock_t *); static void __journal_abort_soft (journal_t *journal, int errno); +static int journal_create_jbd_slab(size_t slab_size); /* * Helper function used to manage commit timeouts @@ -327,10 +329,10 @@ repeat: char *tmp; jbd_unlock_bh_state(bh_in); - tmp = jbd_rep_kmalloc(bh_in->b_size, GFP_NOFS); + tmp = jbd_slab_alloc(bh_in->b_size, GFP_NOFS); jbd_lock_bh_state(bh_in); if (jh_in->b_frozen_data) { - kfree(tmp); + jbd_slab_free(tmp, bh_in->b_size); goto repeat; } @@ -1068,17 +1070,17 @@ static int load_superblock(journal_t *journal) int journal_load(journal_t *journal) { int err; + journal_superblock_t *sb; err = load_superblock(journal); if (err) return err; + sb = journal->j_superblock; /* If this is a V2 superblock, then we have to check the * features flags on it. */ if (journal->j_format_version >= 2) { - journal_superblock_t *sb = journal->j_superblock; - if ((sb->s_feature_ro_compat & ~cpu_to_be32(JFS_KNOWN_ROCOMPAT_FEATURES)) || (sb->s_feature_incompat & @@ -1089,6 +1091,13 @@ int journal_load(journal_t *journal) } } + /* + * Create a slab for this blocksize + */ + err = journal_create_jbd_slab(cpu_to_be32(sb->s_blocksize)); + if (err) + return err; + /* Let the recovery code check whether it needs to recover any * data from the journal. */ if (journal_recover(journal)) @@ -1610,6 +1619,77 @@ void * __jbd_kmalloc (const char *where, size_t size, gfp_t flags, int retry) return kmalloc(size, flags | (retry ? __GFP_NOFAIL : 0)); } +/* + * jbd slab management: create 1k, 2k, 4k, 8k slabs as needed + * and allocate frozen and commit buffers from these slabs. + * + * Reason for doing this is to avoid, SLAB_DEBUG - since it could + * cause bh to cross page boundary. + */ + +#define JBD_MAX_SLABS 5 +#define JBD_SLAB_INDEX(size) (size >> 11) + +static kmem_cache_t *jbd_slab[JBD_MAX_SLABS]; +static const char *jbd_slab_names[JBD_MAX_SLABS] = { + "jbd_1k", "jbd_2k", "jbd_4k", NULL, "jbd_8k" +}; + +static void journal_destroy_jbd_slabs(void) +{ + int i; + + for (i = 0; i < JBD_MAX_SLABS; i++) { + if (jbd_slab[i]) + kmem_cache_destroy(jbd_slab[i]); + jbd_slab[i] = NULL; + } +} + +static int journal_create_jbd_slab(size_t slab_size) +{ + int i = JBD_SLAB_INDEX(slab_size); + + BUG_ON(i >= JBD_MAX_SLABS); + + /* + * Check if we already have a slab created for this size + */ + if (jbd_slab[i]) + return 0; + + /* + * Create a slab and force alignment to be same as slabsize - + * this will make sure that allocations won't cross the page + * boundary. + */ + jbd_slab[i] = kmem_cache_create(jbd_slab_names[i], + slab_size, slab_size, 0, NULL, NULL); + if (!jbd_slab[i]) { + printk(KERN_EMERG "JBD: no memory for jbd_slab cache\n"); + return -ENOMEM; + } + return 0; +} + +void * jbd_slab_alloc(size_t size, gfp_t flags) +{ + int idx; + + idx = JBD_SLAB_INDEX(size); + BUG_ON(jbd_slab[idx] == NULL); + return kmem_cache_alloc(jbd_slab[idx], flags | __GFP_NOFAIL); +} + +void jbd_slab_free(void *ptr, size_t size) +{ + int idx; + + idx = JBD_SLAB_INDEX(size); + BUG_ON(jbd_slab[idx] == NULL); + kmem_cache_free(jbd_slab[idx], ptr); +} + /* * Journal_head storage management */ @@ -1675,7 +1755,7 @@ static void journal_free_journal_head(struct journal_head *jh) { #ifdef CONFIG_JBD_DEBUG atomic_dec(&nr_journal_heads); - memset(jh, 0x5b, sizeof(*jh)); + memset(jh, JBD_POISON_FREE, sizeof(*jh)); #endif kmem_cache_free(journal_head_cache, jh); } @@ -1798,13 +1878,13 @@ static void __journal_remove_journal_head(struct buffer_head *bh) printk(KERN_WARNING "%s: freeing " "b_frozen_data\n", __FUNCTION__); - kfree(jh->b_frozen_data); + jbd_slab_free(jh->b_frozen_data, bh->b_size); } if (jh->b_committed_data) { printk(KERN_WARNING "%s: freeing " "b_committed_data\n", __FUNCTION__); - kfree(jh->b_committed_data); + jbd_slab_free(jh->b_committed_data, bh->b_size); } bh->b_private = NULL; jh->b_bh = NULL; /* debug, really */ @@ -1960,6 +2040,7 @@ static void journal_destroy_caches(void) journal_destroy_revoke_caches(); journal_destroy_journal_head_cache(); journal_destroy_handle_cache(); + journal_destroy_jbd_slabs(); } static int __init journal_init(void) diff --git a/fs/jbd/recovery.c b/fs/jbd/recovery.c index 80d7f53fd..de5bafb4e 100644 --- a/fs/jbd/recovery.c +++ b/fs/jbd/recovery.c @@ -531,6 +531,7 @@ static int do_one_pass(journal_t *journal, default: jbd_debug(3, "Unrecognised magic %d, end of scan.\n", blocktype); + brelse(bh); goto done; } } diff --git a/fs/jbd/transaction.c b/fs/jbd/transaction.c index c609f5034..3eb8be626 100644 --- a/fs/jbd/transaction.c +++ b/fs/jbd/transaction.c @@ -227,7 +227,8 @@ repeat_locked: spin_unlock(&transaction->t_handle_lock); spin_unlock(&journal->j_state_lock); out: - kfree(new_transaction); + if (unlikely(new_transaction)) /* It's usually NULL */ + kfree(new_transaction); return ret; } @@ -665,8 +666,9 @@ repeat: if (!frozen_buffer) { JBUFFER_TRACE(jh, "allocate memory for buffer"); jbd_unlock_bh_state(bh); - frozen_buffer = jbd_kmalloc(jh2bh(jh)->b_size, - GFP_NOFS); + frozen_buffer = + jbd_slab_alloc(jh2bh(jh)->b_size, + GFP_NOFS); if (!frozen_buffer) { printk(KERN_EMERG "%s: OOM for frozen_buffer\n", @@ -724,7 +726,8 @@ done: journal_cancel_revoke(handle, jh); out: - kfree(frozen_buffer); + if (unlikely(frozen_buffer)) /* It's usually NULL */ + jbd_slab_free(frozen_buffer, bh->b_size); JBUFFER_TRACE(jh, "exit"); return error; @@ -877,7 +880,7 @@ int journal_get_undo_access(handle_t *handle, struct buffer_head *bh) repeat: if (!jh->b_committed_data) { - committed_data = jbd_kmalloc(jh2bh(jh)->b_size, GFP_NOFS); + committed_data = jbd_slab_alloc(jh2bh(jh)->b_size, GFP_NOFS); if (!committed_data) { printk(KERN_EMERG "%s: No memory for committed data\n", __FUNCTION__); @@ -903,7 +906,8 @@ repeat: jbd_unlock_bh_state(bh); out: journal_put_journal_head(jh); - kfree(committed_data); + if (unlikely(committed_data)) + jbd_slab_free(committed_data, bh->b_size); return err; } @@ -963,6 +967,14 @@ int journal_dirty_data(handle_t *handle, struct buffer_head *bh) */ jbd_lock_bh_state(bh); spin_lock(&journal->j_list_lock); + + /* Now that we have bh_state locked, are we really still mapped? */ + if (!buffer_mapped(bh)) { + JBUFFER_TRACE(jh, "unmapped, bailing out"); + // printk("caught an unmapped buffer\n"); + goto no_journal; + } + if (jh->b_transaction) { JBUFFER_TRACE(jh, "has transaction"); if (jh->b_transaction != handle->h_transaction) { @@ -1024,6 +1036,11 @@ int journal_dirty_data(handle_t *handle, struct buffer_head *bh) sync_dirty_buffer(bh); jbd_lock_bh_state(bh); spin_lock(&journal->j_list_lock); + /* Since we dropped the lock... */ + if (!buffer_mapped(bh)) { + JBUFFER_TRACE(jh, "Got unmapped"); + goto no_journal; + } /* The buffer may become locked again at any time if it is redirtied */ } @@ -1747,6 +1764,7 @@ static int journal_unmap_buffer(journal_t *journal, struct buffer_head *bh) int ret; BUFFER_TRACE(bh, "entry"); + //J_ASSERT_BH(bh, PageLocked(bh->b_page)); /* * It is safe to proceed here without the j_list_lock because the @@ -1820,6 +1838,7 @@ static int journal_unmap_buffer(journal_t *journal, struct buffer_head *bh) } } else if (transaction == journal->j_committing_transaction) { if (jh->b_jlist == BJ_Locked) { + JBUFFER_TRACE(jh, "on committing BJ_Locked"); /* * The buffer is on the committing transaction's locked * list. We have the buffer locked, so I/O has @@ -1853,6 +1872,7 @@ static int journal_unmap_buffer(journal_t *journal, struct buffer_head *bh) * i_size already for this truncate so recovery will not * expose the disk blocks we are discarding here.) */ J_ASSERT_JH(jh, transaction == journal->j_running_transaction); + JBUFFER_TRACE(jh, "on running transaction"); may_free = __dispose_buffer(jh, transaction); } @@ -2038,7 +2058,8 @@ void __journal_refile_buffer(struct journal_head *jh) __journal_temp_unlink_buffer(jh); jh->b_transaction = jh->b_next_transaction; jh->b_next_transaction = NULL; - __journal_file_buffer(jh, jh->b_transaction, BJ_Metadata); + __journal_file_buffer(jh, jh->b_transaction, + was_dirty ? BJ_Metadata : BJ_Reserved); J_ASSERT_JH(jh, jh->b_transaction->t_state == T_RUNNING); if (was_dirty) diff --git a/fs/jffs/inode-v23.c b/fs/jffs/inode-v23.c index 020cc097c..61d63dea0 100644 --- a/fs/jffs/inode-v23.c +++ b/fs/jffs/inode-v23.c @@ -59,7 +59,7 @@ static const struct file_operations jffs_file_operations; static struct inode_operations jffs_file_inode_operations; static const struct file_operations jffs_dir_operations; static struct inode_operations jffs_dir_inode_operations; -static struct address_space_operations jffs_address_operations; +static const struct address_space_operations jffs_address_operations; kmem_cache_t *node_cache = NULL; kmem_cache_t *fm_cache = NULL; @@ -364,12 +364,11 @@ jffs_new_inode(const struct inode * dir, struct jffs_raw_inode *raw_inode, inode->i_ctime.tv_nsec = 0; inode->i_mtime.tv_nsec = 0; inode->i_atime.tv_nsec = 0; - inode->i_blksize = PAGE_SIZE; inode->i_blocks = (inode->i_size + 511) >> 9; f = jffs_find_file(c, raw_inode->ino); - inode->u.generic_ip = (void *)f; + inode->i_private = (void *)f; insert_inode_hash(inode); return inode; @@ -377,9 +376,9 @@ jffs_new_inode(const struct inode * dir, struct jffs_raw_inode *raw_inode, /* Get statistics of the file system. */ static int -jffs_statfs(struct super_block *sb, struct kstatfs *buf) +jffs_statfs(struct dentry *dentry, struct kstatfs *buf) { - struct jffs_control *c = (struct jffs_control *) sb->s_fs_info; + struct jffs_control *c = (struct jffs_control *) dentry->d_sb->s_fs_info; struct jffs_fmcontrol *fmc; lock_kernel(); @@ -442,7 +441,7 @@ jffs_rename(struct inode *old_dir, struct dentry *old_dentry, }); result = -ENOTDIR; - if (!(old_dir_f = (struct jffs_file *)old_dir->u.generic_ip)) { + if (!(old_dir_f = old_dir->i_private)) { D(printk("jffs_rename(): Old dir invalid.\n")); goto jffs_rename_end; } @@ -456,7 +455,7 @@ jffs_rename(struct inode *old_dir, struct dentry *old_dentry, /* Find the new directory. */ result = -ENOTDIR; - if (!(new_dir_f = (struct jffs_file *)new_dir->u.generic_ip)) { + if (!(new_dir_f = new_dir->i_private)) { D(printk("jffs_rename(): New dir invalid.\n")); goto jffs_rename_end; } @@ -593,7 +592,7 @@ jffs_readdir(struct file *filp, void *dirent, filldir_t filldir) } else { ddino = ((struct jffs_file *) - inode->u.generic_ip)->pino; + inode->i_private)->pino; } D3(printk("jffs_readdir(): \"..\" %u\n", ddino)); if (filldir(dirent, "..", 2, filp->f_pos, ddino, DT_DIR) < 0) { @@ -604,7 +603,7 @@ jffs_readdir(struct file *filp, void *dirent, filldir_t filldir) } filp->f_pos++; } - f = ((struct jffs_file *)inode->u.generic_ip)->children; + f = ((struct jffs_file *)inode->i_private)->children; j = 2; while(f && (f->deleted || j++ < filp->f_pos )) { @@ -668,7 +667,7 @@ jffs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd) } r = -EACCES; - if (!(d = (struct jffs_file *)dir->u.generic_ip)) { + if (!(d = (struct jffs_file *)dir->i_private)) { D(printk("jffs_lookup(): No such inode! (%lu)\n", dir->i_ino)); goto jffs_lookup_end; @@ -739,7 +738,7 @@ jffs_do_readpage_nolock(struct file *file, struct page *page) unsigned long read_len; int result; struct inode *inode = (struct inode*)page->mapping->host; - struct jffs_file *f = (struct jffs_file *)inode->u.generic_ip; + struct jffs_file *f = (struct jffs_file *)inode->i_private; struct jffs_control *c = (struct jffs_control *)inode->i_sb->s_fs_info; int r; loff_t offset; @@ -828,7 +827,7 @@ jffs_mkdir(struct inode *dir, struct dentry *dentry, int mode) }); lock_kernel(); - dir_f = (struct jffs_file *)dir->u.generic_ip; + dir_f = dir->i_private; ASSERT(if (!dir_f) { printk(KERN_ERR "jffs_mkdir(): No reference to a " @@ -972,7 +971,7 @@ jffs_remove(struct inode *dir, struct dentry *dentry, int type) kfree(_name); }); - dir_f = (struct jffs_file *) dir->u.generic_ip; + dir_f = dir->i_private; c = dir_f->c; result = -ENOENT; @@ -1082,7 +1081,7 @@ jffs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev) if (!old_valid_dev(rdev)) return -EINVAL; lock_kernel(); - dir_f = (struct jffs_file *)dir->u.generic_ip; + dir_f = dir->i_private; c = dir_f->c; D3(printk (KERN_NOTICE "mknod(): down biglock\n")); @@ -1186,7 +1185,7 @@ jffs_symlink(struct inode *dir, struct dentry *dentry, const char *symname) kfree(_symname); }); - dir_f = (struct jffs_file *)dir->u.generic_ip; + dir_f = dir->i_private; ASSERT(if (!dir_f) { printk(KERN_ERR "jffs_symlink(): No reference to a " "jffs_file struct in inode.\n"); @@ -1289,7 +1288,7 @@ jffs_create(struct inode *dir, struct dentry *dentry, int mode, kfree(s); }); - dir_f = (struct jffs_file *)dir->u.generic_ip; + dir_f = dir->i_private; ASSERT(if (!dir_f) { printk(KERN_ERR "jffs_create(): No reference to a " "jffs_file struct in inode.\n"); @@ -1403,9 +1402,9 @@ jffs_file_write(struct file *filp, const char *buf, size_t count, goto out_isem; } - if (!(f = (struct jffs_file *)inode->u.generic_ip)) { - D(printk("jffs_file_write(): inode->u.generic_ip = 0x%p\n", - inode->u.generic_ip)); + if (!(f = inode->i_private)) { + D(printk("jffs_file_write(): inode->i_private = 0x%p\n", + inode->i_private)); goto out_isem; } @@ -1614,7 +1613,7 @@ jffs_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, } /* jffs_ioctl() */ -static struct address_space_operations jffs_address_operations = { +static const struct address_space_operations jffs_address_operations = { .readpage = jffs_readpage, .prepare_write = jffs_prepare_write, .commit_write = jffs_commit_write, @@ -1693,7 +1692,7 @@ jffs_read_inode(struct inode *inode) mutex_unlock(&c->fmc->biglock); return; } - inode->u.generic_ip = (void *)f; + inode->i_private = f; inode->i_mode = f->mode; inode->i_nlink = f->nlink; inode->i_uid = f->uid; @@ -1706,7 +1705,6 @@ jffs_read_inode(struct inode *inode) inode->i_mtime.tv_nsec = inode->i_ctime.tv_nsec = 0; - inode->i_blksize = PAGE_SIZE; inode->i_blocks = (inode->i_size + 511) >> 9; if (S_ISREG(inode->i_mode)) { inode->i_op = &jffs_file_inode_operations; @@ -1748,7 +1746,7 @@ jffs_delete_inode(struct inode *inode) lock_kernel(); inode->i_size = 0; inode->i_blocks = 0; - inode->u.generic_ip = NULL; + inode->i_private = NULL; clear_inode(inode); if (inode->i_nlink == 0) { c = (struct jffs_control *) inode->i_sb->s_fs_info; @@ -1785,10 +1783,11 @@ static struct super_operations jffs_ops = .remount_fs = jffs_remount, }; -static struct super_block *jffs_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int jffs_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_bdev(fs_type, flags, dev_name, data, jffs_fill_super); + return get_sb_bdev(fs_type, flags, dev_name, data, jffs_fill_super, + mnt); } static struct file_system_type jffs_fs_type = { diff --git a/fs/jffs/intrep.c b/fs/jffs/intrep.c index 0ef207dfa..9000f1eff 100644 --- a/fs/jffs/intrep.c +++ b/fs/jffs/intrep.c @@ -55,7 +55,6 @@ * */ -#include #include #include #include @@ -247,7 +246,7 @@ flash_safe_read(struct mtd_info *mtd, loff_t from, D3(printk(KERN_NOTICE "flash_safe_read(%p, %08x, %p, %08x)\n", mtd, (unsigned int) from, buf, count)); - res = MTD_READ(mtd, from, count, &retlen, buf); + res = mtd->read(mtd, from, count, &retlen, buf); if (retlen != count) { panic("Didn't read all bytes in flash_safe_read(). Returned %d\n", res); } @@ -262,7 +261,7 @@ flash_read_u32(struct mtd_info *mtd, loff_t from) __u32 ret; int res; - res = MTD_READ(mtd, from, 4, &retlen, (unsigned char *)&ret); + res = mtd->read(mtd, from, 4, &retlen, (unsigned char *)&ret); if (retlen != 4) { printk("Didn't read all bytes in flash_read_u32(). Returned %d\n", res); return 0; @@ -282,7 +281,7 @@ flash_safe_write(struct mtd_info *mtd, loff_t to, D3(printk(KERN_NOTICE "flash_safe_write(%p, %08x, %p, %08x)\n", mtd, (unsigned int) to, buf, count)); - res = MTD_WRITE(mtd, to, count, &retlen, buf); + res = mtd->write(mtd, to, count, &retlen, buf); if (retlen != count) { printk("Didn't write all bytes in flash_safe_write(). Returned %d\n", res); } @@ -300,9 +299,9 @@ flash_safe_writev(struct mtd_info *mtd, const struct kvec *vecs, D3(printk(KERN_NOTICE "flash_safe_writev(%p, %08x, %p)\n", mtd, (unsigned int) to, vecs)); - + if (mtd->writev) { - res = MTD_WRITEV(mtd, vecs, iovec_cnt, to, &retlen); + res = mtd->writev(mtd, vecs, iovec_cnt, to, &retlen); return res ? res : retlen; } /* Not implemented writev. Repeatedly use write - on the not so @@ -312,7 +311,8 @@ flash_safe_writev(struct mtd_info *mtd, const struct kvec *vecs, retlen=0; for (i=0; !res && iwrite(mtd, to, vecs[i].iov_len, &retlen_a, + vecs[i].iov_base); if (retlen_a != vecs[i].iov_len) { printk("Didn't write all bytes in flash_safe_writev(). Returned %d\n", res); if (i != iovec_cnt-1) @@ -393,7 +393,7 @@ flash_erase_region(struct mtd_info *mtd, loff_t start, set_current_state(TASK_UNINTERRUPTIBLE); add_wait_queue(&wait_q, &wait); - if (MTD_ERASE(mtd, erase) < 0) { + if (mtd->erase(mtd, erase) < 0) { set_current_state(TASK_RUNNING); remove_wait_queue(&wait_q, &wait); kfree(erase); diff --git a/fs/jffs/jffs_fm.h b/fs/jffs/jffs_fm.h index c794d923d..9ee6ad29e 100644 --- a/fs/jffs/jffs_fm.h +++ b/fs/jffs/jffs_fm.h @@ -20,7 +20,6 @@ #ifndef __LINUX_JFFS_FM_H__ #define __LINUX_JFFS_FM_H__ -#include #include #include #include diff --git a/fs/jffs2/Makefile b/fs/jffs2/Makefile index 77dc5561a..7f28ee0bd 100644 --- a/fs/jffs2/Makefile +++ b/fs/jffs2/Makefile @@ -12,6 +12,9 @@ jffs2-y += symlink.o build.o erase.o background.o fs.o writev.o jffs2-y += super.o debug.o jffs2-$(CONFIG_JFFS2_FS_WRITEBUFFER) += wbuf.o +jffs2-$(CONFIG_JFFS2_FS_XATTR) += xattr.o xattr_trusted.o xattr_user.o +jffs2-$(CONFIG_JFFS2_FS_SECURITY) += security.o +jffs2-$(CONFIG_JFFS2_FS_POSIX_ACL) += acl.o jffs2-$(CONFIG_JFFS2_RUBIN) += compr_rubin.o jffs2-$(CONFIG_JFFS2_RTIME) += compr_rtime.o jffs2-$(CONFIG_JFFS2_ZLIB) += compr_zlib.o diff --git a/fs/jffs2/README.Locking b/fs/jffs2/README.Locking index b7943439b..c8f0bd64e 100644 --- a/fs/jffs2/README.Locking +++ b/fs/jffs2/README.Locking @@ -150,3 +150,24 @@ the buffer. Ordering constraints: Lock wbuf_sem last, after the alloc_sem or and f->sem. + + + c->xattr_sem + ------------ + +This read/write semaphore protects against concurrent access to the +xattr related objects which include stuff in superblock and ic->xref. +In read-only path, write-semaphore is too much exclusion. It's enough +by read-semaphore. But you must hold write-semaphore when updating, +creating or deleting any xattr related object. + +Once xattr_sem released, there would be no assurance for the existence +of those objects. Thus, a series of processes is often required to retry, +when updating such a object is necessary under holding read semaphore. +For example, do_jffs2_getxattr() holds read-semaphore to scan xref and +xdatum at first. But it retries this process with holding write-semaphore +after release read-semaphore, if it's necessary to load name/value pair +from medium. + +Ordering constraints: + Lock xattr_sem last, after the alloc_sem. diff --git a/fs/jffs2/build.c b/fs/jffs2/build.c index 70f7a896c..02826967a 100644 --- a/fs/jffs2/build.c +++ b/fs/jffs2/build.c @@ -160,6 +160,7 @@ static int jffs2_build_filesystem(struct jffs2_sb_info *c) ic->scan_dents = NULL; cond_resched(); } + jffs2_build_xattr_subsystem(c); c->flags &= ~JFFS2_SB_FLAG_BUILDING; dbg_fsbuild("FS build complete\n"); @@ -178,6 +179,7 @@ exit: jffs2_free_full_dirent(fd); } } + jffs2_clear_xattr_subsystem(c); } return ret; diff --git a/fs/jffs2/compr.c b/fs/jffs2/compr.c index e7944e665..7001ba26c 100644 --- a/fs/jffs2/compr.c +++ b/fs/jffs2/compr.c @@ -412,7 +412,7 @@ void jffs2_free_comprbuf(unsigned char *comprbuf, unsigned char *orig) kfree(comprbuf); } -int jffs2_compressors_init(void) +int __init jffs2_compressors_init(void) { /* Registering compressors */ #ifdef CONFIG_JFFS2_ZLIB diff --git a/fs/jffs2/compr.h b/fs/jffs2/compr.h index 89ceeed20..509b8b1c0 100644 --- a/fs/jffs2/compr.h +++ b/fs/jffs2/compr.h @@ -4,10 +4,10 @@ * Copyright (C) 2004 Ferenc Havasi , * University of Szeged, Hungary * - * For licensing information, see the file 'LICENCE' in the + * For licensing information, see the file 'LICENCE' in the * jffs2 directory. * - * $Id: compr.h,v 1.6 2004/07/16 15:17:57 dwmw2 Exp $ + * $Id: compr.h,v 1.9 2005/11/07 11:14:38 gleixner Exp $ * */ @@ -23,8 +23,8 @@ #include #include #include -#include -#include +#include "jffs2_fs_i.h" +#include "jffs2_fs_sb.h" #include "nodelist.h" #define JFFS2_RUBINMIPS_PRIORITY 10 @@ -103,13 +103,5 @@ void jffs2_rtime_exit(void); int jffs2_zlib_init(void); void jffs2_zlib_exit(void); #endif -#ifdef CONFIG_JFFS2_LZARI -int jffs2_lzari_init(void); -void jffs2_lzari_exit(void); -#endif -#ifdef CONFIG_JFFS2_LZO -int jffs2_lzo_init(void); -void jffs2_lzo_exit(void); -#endif #endif /* __JFFS2_COMPR_H__ */ diff --git a/fs/jffs2/compr_zlib.c b/fs/jffs2/compr_zlib.c index 5c63e0cdc..3681d0728 100644 --- a/fs/jffs2/compr_zlib.c +++ b/fs/jffs2/compr_zlib.c @@ -15,7 +15,6 @@ #error "The userspace support got too messy and was removed. Update your mkfs.jffs2" #endif -#include #include #include #include diff --git a/fs/jffs2/debug.c b/fs/jffs2/debug.c index 1fe17de71..72b4fc13a 100644 --- a/fs/jffs2/debug.c +++ b/fs/jffs2/debug.c @@ -192,13 +192,13 @@ __jffs2_dbg_acct_paranoia_check_nolock(struct jffs2_sb_info *c, else my_dirty_size += totlen; - if ((!ref2->next_phys) != (ref2 == jeb->last_node)) { - JFFS2_ERROR("node_ref for node at %#08x (mem %p) has next_phys at %#08x (mem %p), last_node is at %#08x (mem %p).\n", - ref_offset(ref2), ref2, ref_offset(ref2->next_phys), ref2->next_phys, - ref_offset(jeb->last_node), jeb->last_node); + if ((!ref_next(ref2)) != (ref2 == jeb->last_node)) { + JFFS2_ERROR("node_ref for node at %#08x (mem %p) has next at %#08x (mem %p), last_node is at %#08x (mem %p).\n", + ref_offset(ref2), ref2, ref_offset(ref_next(ref2)), ref_next(ref2), + ref_offset(jeb->last_node), jeb->last_node); goto error; } - ref2 = ref2->next_phys; + ref2 = ref_next(ref2); } if (my_used_size != jeb->used_size) { @@ -268,9 +268,9 @@ __jffs2_dbg_dump_node_refs_nolock(struct jffs2_sb_info *c, } printk(JFFS2_DBG); - for (ref = jeb->first_node; ; ref = ref->next_phys) { + for (ref = jeb->first_node; ; ref = ref_next(ref)) { printk("%#08x(%#x)", ref_offset(ref), ref->__totlen); - if (ref->next_phys) + if (ref_next(ref)) printk("->"); else break; diff --git a/fs/jffs2/debug.h b/fs/jffs2/debug.h index 162af6dfe..3daf3bca0 100644 --- a/fs/jffs2/debug.h +++ b/fs/jffs2/debug.h @@ -13,7 +13,6 @@ #ifndef _JFFS2_DEBUG_H_ #define _JFFS2_DEBUG_H_ -#include #ifndef CONFIG_JFFS2_FS_DEBUG #define CONFIG_JFFS2_FS_DEBUG 0 @@ -171,6 +170,12 @@ #define dbg_memalloc(fmt, ...) #endif +/* Watch the XATTR subsystem */ +#ifdef JFFS2_DBG_XATTR_MESSAGES +#define dbg_xattr(fmt, ...) JFFS2_DEBUG(fmt, ##__VA_ARGS__) +#else +#define dbg_xattr(fmt, ...) +#endif /* "Sanity" checks */ void diff --git a/fs/jffs2/dir.c b/fs/jffs2/dir.c index 8bc7a5018..edd8371fc 100644 --- a/fs/jffs2/dir.c +++ b/fs/jffs2/dir.c @@ -17,8 +17,8 @@ #include #include #include -#include -#include +#include "jffs2_fs_i.h" +#include "jffs2_fs_sb.h" #include #include "nodelist.h" @@ -57,7 +57,12 @@ struct inode_operations jffs2_dir_inode_operations = .rmdir = jffs2_rmdir, .mknod = jffs2_mknod, .rename = jffs2_rename, + .permission = jffs2_permission, .setattr = jffs2_setattr, + .setxattr = jffs2_setxattr, + .getxattr = jffs2_getxattr, + .listxattr = jffs2_listxattr, + .removexattr = jffs2_removexattr }; /***********************************************************************/ @@ -78,6 +83,9 @@ static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target, D1(printk(KERN_DEBUG "jffs2_lookup()\n")); + if (target->d_name.len > JFFS2_MAX_NAME_LEN) + return ERR_PTR(-ENAMETOOLONG); + dir_f = JFFS2_INODE_INFO(dir_i); c = JFFS2_SB_INFO(dir_i->i_sb); @@ -206,12 +214,15 @@ static int jffs2_create(struct inode *dir_i, struct dentry *dentry, int mode, ret = jffs2_do_create(c, dir_f, f, ri, dentry->d_name.name, dentry->d_name.len); - if (ret) { - make_bad_inode(inode); - iput(inode); - jffs2_free_raw_inode(ri); - return ret; - } + if (ret) + goto fail; + + ret = jffs2_init_security(inode, dir_i); + if (ret) + goto fail; + ret = jffs2_init_acl(inode, dir_i); + if (ret) + goto fail; dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(ri->ctime)); @@ -221,6 +232,12 @@ static int jffs2_create(struct inode *dir_i, struct dentry *dentry, int mode, D1(printk(KERN_DEBUG "jffs2_create: Created ino #%lu with mode %o, nlink %d(%d). nrpages %ld\n", inode->i_ino, inode->i_mode, inode->i_nlink, f->inocache->nlink, inode->i_mapping->nrpages)); return 0; + + fail: + make_bad_inode(inode); + iput(inode); + jffs2_free_raw_inode(ri); + return ret; } /***********************************************************************/ @@ -291,7 +308,7 @@ static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char struct jffs2_full_dnode *fn; struct jffs2_full_dirent *fd; int namelen; - uint32_t alloclen, phys_ofs; + uint32_t alloclen; int ret, targetlen = strlen(target); /* FIXME: If you care. We'd need to use frags for the target @@ -310,8 +327,8 @@ static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char * Just the node will do for now, though */ namelen = dentry->d_name.len; - ret = jffs2_reserve_space(c, sizeof(*ri) + targetlen, &phys_ofs, &alloclen, - ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE); + ret = jffs2_reserve_space(c, sizeof(*ri) + targetlen, &alloclen, + ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE); if (ret) { jffs2_free_raw_inode(ri); @@ -339,7 +356,7 @@ static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char ri->data_crc = cpu_to_je32(crc32(0, target, targetlen)); ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8)); - fn = jffs2_write_dnode(c, f, ri, target, targetlen, phys_ofs, ALLOC_NORMAL); + fn = jffs2_write_dnode(c, f, ri, target, targetlen, ALLOC_NORMAL); jffs2_free_raw_inode(ri); @@ -371,8 +388,20 @@ static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char up(&f->sem); jffs2_complete_reservation(c); - ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen, - ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen)); + + ret = jffs2_init_security(inode, dir_i); + if (ret) { + jffs2_clear_inode(inode); + return ret; + } + ret = jffs2_init_acl(inode, dir_i); + if (ret) { + jffs2_clear_inode(inode); + return ret; + } + + ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen, + ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen)); if (ret) { /* Eep. */ jffs2_clear_inode(inode); @@ -404,7 +433,7 @@ static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8)); rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen)); - fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, phys_ofs, ALLOC_NORMAL); + fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL); if (IS_ERR(fd)) { /* dirent failed to write. Delete the inode normally @@ -442,7 +471,7 @@ static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode) struct jffs2_full_dnode *fn; struct jffs2_full_dirent *fd; int namelen; - uint32_t alloclen, phys_ofs; + uint32_t alloclen; int ret; mode |= S_IFDIR; @@ -457,8 +486,8 @@ static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode) * Just the node will do for now, though */ namelen = dentry->d_name.len; - ret = jffs2_reserve_space(c, sizeof(*ri), &phys_ofs, &alloclen, ALLOC_NORMAL, - JFFS2_SUMMARY_INODE_SIZE); + ret = jffs2_reserve_space(c, sizeof(*ri), &alloclen, ALLOC_NORMAL, + JFFS2_SUMMARY_INODE_SIZE); if (ret) { jffs2_free_raw_inode(ri); @@ -483,7 +512,7 @@ static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode) ri->data_crc = cpu_to_je32(0); ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8)); - fn = jffs2_write_dnode(c, f, ri, NULL, 0, phys_ofs, ALLOC_NORMAL); + fn = jffs2_write_dnode(c, f, ri, NULL, 0, ALLOC_NORMAL); jffs2_free_raw_inode(ri); @@ -501,8 +530,20 @@ static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode) up(&f->sem); jffs2_complete_reservation(c); - ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen, - ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen)); + + ret = jffs2_init_security(inode, dir_i); + if (ret) { + jffs2_clear_inode(inode); + return ret; + } + ret = jffs2_init_acl(inode, dir_i); + if (ret) { + jffs2_clear_inode(inode); + return ret; + } + + ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen, + ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen)); if (ret) { /* Eep. */ jffs2_clear_inode(inode); @@ -534,7 +575,7 @@ static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode) rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8)); rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen)); - fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, phys_ofs, ALLOC_NORMAL); + fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL); if (IS_ERR(fd)) { /* dirent failed to write. Delete the inode normally @@ -588,12 +629,12 @@ static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, de struct jffs2_full_dnode *fn; struct jffs2_full_dirent *fd; int namelen; - jint16_t dev; + union jffs2_device_node dev; int devlen = 0; - uint32_t alloclen, phys_ofs; + uint32_t alloclen; int ret; - if (!old_valid_dev(rdev)) + if (!new_valid_dev(rdev)) return -EINVAL; ri = jffs2_alloc_raw_inode(); @@ -602,17 +643,15 @@ static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, de c = JFFS2_SB_INFO(dir_i->i_sb); - if (S_ISBLK(mode) || S_ISCHR(mode)) { - dev = cpu_to_je16(old_encode_dev(rdev)); - devlen = sizeof(dev); - } + if (S_ISBLK(mode) || S_ISCHR(mode)) + devlen = jffs2_encode_dev(&dev, rdev); /* Try to reserve enough space for both node and dirent. * Just the node will do for now, though */ namelen = dentry->d_name.len; - ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &phys_ofs, &alloclen, - ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE); + ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &alloclen, + ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE); if (ret) { jffs2_free_raw_inode(ri); @@ -639,7 +678,7 @@ static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, de ri->data_crc = cpu_to_je32(crc32(0, &dev, devlen)); ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8)); - fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, phys_ofs, ALLOC_NORMAL); + fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, ALLOC_NORMAL); jffs2_free_raw_inode(ri); @@ -657,8 +696,20 @@ static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, de up(&f->sem); jffs2_complete_reservation(c); - ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen, - ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen)); + + ret = jffs2_init_security(inode, dir_i); + if (ret) { + jffs2_clear_inode(inode); + return ret; + } + ret = jffs2_init_acl(inode, dir_i); + if (ret) { + jffs2_clear_inode(inode); + return ret; + } + + ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen, + ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen)); if (ret) { /* Eep. */ jffs2_clear_inode(inode); @@ -693,7 +744,7 @@ static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, de rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8)); rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen)); - fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, phys_ofs, ALLOC_NORMAL); + fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL); if (IS_ERR(fd)) { /* dirent failed to write. Delete the inode normally diff --git a/fs/jffs2/erase.c b/fs/jffs2/erase.c index dad68fdff..ad0121088 100644 --- a/fs/jffs2/erase.c +++ b/fs/jffs2/erase.c @@ -30,7 +30,6 @@ static void jffs2_erase_callback(struct erase_info *); #endif static void jffs2_erase_failed(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, uint32_t bad_offset); static void jffs2_erase_succeeded(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb); -static void jffs2_free_all_node_refs(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb); static void jffs2_mark_erased_block(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb); static void jffs2_erase_block(struct jffs2_sb_info *c, @@ -54,8 +53,7 @@ static void jffs2_erase_block(struct jffs2_sb_info *c, if (!instr) { printk(KERN_WARNING "kmalloc for struct erase_info in jffs2_erase_block failed. Refiling block for later\n"); spin_lock(&c->erase_completion_lock); - list_del(&jeb->list); - list_add(&jeb->list, &c->erase_pending_list); + list_move(&jeb->list, &c->erase_pending_list); c->erasing_size -= c->sector_size; c->dirty_size += c->sector_size; jeb->dirty_size = c->sector_size; @@ -87,8 +85,7 @@ static void jffs2_erase_block(struct jffs2_sb_info *c, /* Erase failed immediately. Refile it on the list */ D1(printk(KERN_DEBUG "Erase at 0x%08x failed: %d. Refiling on erase_pending_list\n", jeb->offset, ret)); spin_lock(&c->erase_completion_lock); - list_del(&jeb->list); - list_add(&jeb->list, &c->erase_pending_list); + list_move(&jeb->list, &c->erase_pending_list); c->erasing_size -= c->sector_size; c->dirty_size += c->sector_size; jeb->dirty_size = c->sector_size; @@ -136,7 +133,7 @@ void jffs2_erase_pending_blocks(struct jffs2_sb_info *c, int count) c->used_size -= jeb->used_size; c->dirty_size -= jeb->dirty_size; jeb->wasted_size = jeb->used_size = jeb->dirty_size = jeb->free_size = 0; - jffs2_free_all_node_refs(c, jeb); + jffs2_free_jeb_node_refs(c, jeb); list_add(&jeb->list, &c->erasing_list); spin_unlock(&c->erase_completion_lock); @@ -162,8 +159,7 @@ static void jffs2_erase_succeeded(struct jffs2_sb_info *c, struct jffs2_eraseblo { D1(printk(KERN_DEBUG "Erase completed successfully at 0x%08x\n", jeb->offset)); spin_lock(&c->erase_completion_lock); - list_del(&jeb->list); - list_add_tail(&jeb->list, &c->erase_complete_list); + list_move_tail(&jeb->list, &c->erase_complete_list); spin_unlock(&c->erase_completion_lock); /* Ensure that kupdated calls us again to mark them clean */ jffs2_erase_pending_trigger(c); @@ -179,8 +175,7 @@ static void jffs2_erase_failed(struct jffs2_sb_info *c, struct jffs2_eraseblock if (!jffs2_write_nand_badblock(c, jeb, bad_offset)) { /* We'd like to give this block another try. */ spin_lock(&c->erase_completion_lock); - list_del(&jeb->list); - list_add(&jeb->list, &c->erase_pending_list); + list_move(&jeb->list, &c->erase_pending_list); c->erasing_size -= c->sector_size; c->dirty_size += c->sector_size; jeb->dirty_size = c->sector_size; @@ -192,8 +187,7 @@ static void jffs2_erase_failed(struct jffs2_sb_info *c, struct jffs2_eraseblock spin_lock(&c->erase_completion_lock); c->erasing_size -= c->sector_size; c->bad_size += c->sector_size; - list_del(&jeb->list); - list_add(&jeb->list, &c->bad_list); + list_move(&jeb->list, &c->bad_list); c->nr_erasing_blocks--; spin_unlock(&c->erase_completion_lock); wake_up(&c->erase_wait); @@ -254,7 +248,8 @@ static inline void jffs2_remove_node_refs_from_ino_list(struct jffs2_sb_info *c, /* PARANOIA */ if (!ic) { - printk(KERN_WARNING "inode_cache not found in remove_node_refs()!!\n"); + JFFS2_WARNING("inode_cache/xattr_datum/xattr_ref" + " not found in remove_node_refs()!!\n"); return; } @@ -279,26 +274,42 @@ static inline void jffs2_remove_node_refs_from_ino_list(struct jffs2_sb_info *c, printk("\n"); }); - if (ic->nodes == (void *)ic && ic->nlink == 0) - jffs2_del_ino_cache(c, ic); + switch (ic->class) { +#ifdef CONFIG_JFFS2_FS_XATTR + case RAWNODE_CLASS_XATTR_DATUM: + jffs2_release_xattr_datum(c, (struct jffs2_xattr_datum *)ic); + break; + case RAWNODE_CLASS_XATTR_REF: + jffs2_release_xattr_ref(c, (struct jffs2_xattr_ref *)ic); + break; +#endif + default: + if (ic->nodes == (void *)ic && ic->nlink == 0) + jffs2_del_ino_cache(c, ic); + } } -static void jffs2_free_all_node_refs(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb) +void jffs2_free_jeb_node_refs(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb) { - struct jffs2_raw_node_ref *ref; + struct jffs2_raw_node_ref *block, *ref; D1(printk(KERN_DEBUG "Freeing all node refs for eraseblock offset 0x%08x\n", jeb->offset)); - while(jeb->first_node) { - ref = jeb->first_node; - jeb->first_node = ref->next_phys; - /* Remove from the inode-list */ - if (ref->next_in_ino) + block = ref = jeb->first_node; + + while (ref) { + if (ref->flash_offset == REF_LINK_NODE) { + ref = ref->next_in_ino; + jffs2_free_refblock(block); + block = ref; + continue; + } + if (ref->flash_offset != REF_EMPTY_NODE && ref->next_in_ino) jffs2_remove_node_refs_from_ino_list(c, ref, jeb); /* else it was a non-inode node or already removed, so don't bother */ - jffs2_free_raw_node_ref(ref); + ref++; } - jeb->last_node = NULL; + jeb->first_node = jeb->last_node = NULL; } static int jffs2_block_check_erase(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, uint32_t *bad_offset) @@ -351,7 +362,6 @@ fail: static void jffs2_mark_erased_block(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb) { - struct jffs2_raw_node_ref *marker_ref = NULL; size_t retlen; int ret; uint32_t bad_offset; @@ -373,12 +383,8 @@ static void jffs2_mark_erased_block(struct jffs2_sb_info *c, struct jffs2_eraseb goto filebad; } - jeb->first_node = jeb->last_node = NULL; + /* Everything else got zeroed before the erase */ jeb->free_size = c->sector_size; - jeb->used_size = 0; - jeb->dirty_size = 0; - jeb->wasted_size = 0; - } else { struct kvec vecs[1]; @@ -388,11 +394,7 @@ static void jffs2_mark_erased_block(struct jffs2_sb_info *c, struct jffs2_eraseb .totlen = cpu_to_je32(c->cleanmarker_size) }; - marker_ref = jffs2_alloc_raw_node_ref(); - if (!marker_ref) { - printk(KERN_WARNING "Failed to allocate raw node ref for clean marker. Refiling\n"); - goto refile; - } + jffs2_prealloc_raw_node_refs(c, jeb, 1); marker.hdr_crc = cpu_to_je32(crc32(0, &marker, sizeof(struct jffs2_unknown_node)-4)); @@ -408,21 +410,13 @@ static void jffs2_mark_erased_block(struct jffs2_sb_info *c, struct jffs2_eraseb printk(KERN_WARNING "Short write to newly-erased block at 0x%08x: Wanted %zd, got %zd\n", jeb->offset, sizeof(marker), retlen); - jffs2_free_raw_node_ref(marker_ref); goto filebad; } - marker_ref->next_in_ino = NULL; - marker_ref->next_phys = NULL; - marker_ref->flash_offset = jeb->offset | REF_NORMAL; - marker_ref->__totlen = c->cleanmarker_size; - - jeb->first_node = jeb->last_node = marker_ref; - - jeb->free_size = c->sector_size - c->cleanmarker_size; - jeb->used_size = c->cleanmarker_size; - jeb->dirty_size = 0; - jeb->wasted_size = 0; + /* Everything else got zeroed before the erase */ + jeb->free_size = c->sector_size; + /* FIXME Special case for cleanmarker in empty block */ + jffs2_link_node_ref(c, jeb, jeb->offset | REF_NORMAL, c->cleanmarker_size, NULL); } spin_lock(&c->erase_completion_lock); diff --git a/fs/jffs2/file.c b/fs/jffs2/file.c index 9f4171213..3ed6e3e12 100644 --- a/fs/jffs2/file.c +++ b/fs/jffs2/file.c @@ -54,10 +54,15 @@ const struct file_operations jffs2_file_operations = struct inode_operations jffs2_file_inode_operations = { - .setattr = jffs2_setattr + .permission = jffs2_permission, + .setattr = jffs2_setattr, + .setxattr = jffs2_setxattr, + .getxattr = jffs2_getxattr, + .listxattr = jffs2_listxattr, + .removexattr = jffs2_removexattr }; -struct address_space_operations jffs2_file_address_operations = +const struct address_space_operations jffs2_file_address_operations = { .readpage = jffs2_readpage, .prepare_write =jffs2_prepare_write, @@ -129,13 +134,13 @@ static int jffs2_prepare_write (struct file *filp, struct page *pg, struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb); struct jffs2_raw_inode ri; struct jffs2_full_dnode *fn; - uint32_t phys_ofs, alloc_len; + uint32_t alloc_len; D1(printk(KERN_DEBUG "Writing new hole frag 0x%x-0x%x between current EOF and new page\n", (unsigned int)inode->i_size, pageofs)); - ret = jffs2_reserve_space(c, sizeof(ri), &phys_ofs, &alloc_len, - ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE); + ret = jffs2_reserve_space(c, sizeof(ri), &alloc_len, + ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE); if (ret) return ret; @@ -161,7 +166,7 @@ static int jffs2_prepare_write (struct file *filp, struct page *pg, ri.node_crc = cpu_to_je32(crc32(0, &ri, sizeof(ri)-8)); ri.data_crc = cpu_to_je32(0); - fn = jffs2_write_dnode(c, f, &ri, NULL, 0, phys_ofs, ALLOC_NORMAL); + fn = jffs2_write_dnode(c, f, &ri, NULL, 0, ALLOC_NORMAL); if (IS_ERR(fn)) { ret = PTR_ERR(fn); @@ -215,12 +220,20 @@ static int jffs2_commit_write (struct file *filp, struct page *pg, D1(printk(KERN_DEBUG "jffs2_commit_write(): ino #%lu, page at 0x%lx, range %d-%d, flags %lx\n", inode->i_ino, pg->index << PAGE_CACHE_SHIFT, start, end, pg->flags)); - if (!start && end == PAGE_CACHE_SIZE) { - /* We need to avoid deadlock with page_cache_read() in - jffs2_garbage_collect_pass(). So we have to mark the - page up to date, to prevent page_cache_read() from - trying to re-lock it. */ - SetPageUptodate(pg); + if (end == PAGE_CACHE_SIZE) { + if (!start) { + /* We need to avoid deadlock with page_cache_read() in + jffs2_garbage_collect_pass(). So we have to mark the + page up to date, to prevent page_cache_read() from + trying to re-lock it. */ + SetPageUptodate(pg); + } else { + /* When writing out the end of a page, write out the + _whole_ page. This helps to reduce the number of + nodes in files which have many short writes, like + syslog files. */ + start = aligned_start = 0; + } } ri = jffs2_alloc_raw_inode(); diff --git a/fs/jffs2/fs.c b/fs/jffs2/fs.c index 09e5d10b8..72d9909d9 100644 --- a/fs/jffs2/fs.c +++ b/fs/jffs2/fs.c @@ -12,7 +12,6 @@ */ #include -#include #include #include #include @@ -33,11 +32,11 @@ static int jffs2_do_setattr (struct inode *inode, struct iattr *iattr) struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb); struct jffs2_raw_inode *ri; - unsigned short dev; + union jffs2_device_node dev; unsigned char *mdata = NULL; int mdatalen = 0; unsigned int ivalid; - uint32_t phys_ofs, alloclen; + uint32_t alloclen; int ret; D1(printk(KERN_DEBUG "jffs2_setattr(): ino #%lu\n", inode->i_ino)); ret = inode_change_ok(inode, iattr); @@ -51,20 +50,24 @@ static int jffs2_do_setattr (struct inode *inode, struct iattr *iattr) it out again with the appropriate data attached */ if (S_ISBLK(inode->i_mode) || S_ISCHR(inode->i_mode)) { /* For these, we don't actually need to read the old node */ - dev = old_encode_dev(inode->i_rdev); + mdatalen = jffs2_encode_dev(&dev, inode->i_rdev); mdata = (char *)&dev; - mdatalen = sizeof(dev); D1(printk(KERN_DEBUG "jffs2_setattr(): Writing %d bytes of kdev_t\n", mdatalen)); } else if (S_ISLNK(inode->i_mode)) { + down(&f->sem); mdatalen = f->metadata->size; mdata = kmalloc(f->metadata->size, GFP_USER); - if (!mdata) + if (!mdata) { + up(&f->sem); return -ENOMEM; + } ret = jffs2_read_dnode(c, f, f->metadata, mdata, 0, mdatalen); if (ret) { + up(&f->sem); kfree(mdata); return ret; } + up(&f->sem); D1(printk(KERN_DEBUG "jffs2_setattr(): Writing %d bytes of symlink target\n", mdatalen)); } @@ -75,8 +78,8 @@ static int jffs2_do_setattr (struct inode *inode, struct iattr *iattr) return -ENOMEM; } - ret = jffs2_reserve_space(c, sizeof(*ri) + mdatalen, &phys_ofs, &alloclen, - ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE); + ret = jffs2_reserve_space(c, sizeof(*ri) + mdatalen, &alloclen, + ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE); if (ret) { jffs2_free_raw_inode(ri); if (S_ISLNK(inode->i_mode & S_IFMT)) @@ -127,7 +130,7 @@ static int jffs2_do_setattr (struct inode *inode, struct iattr *iattr) else ri->data_crc = cpu_to_je32(0); - new_metadata = jffs2_write_dnode(c, f, ri, mdata, mdatalen, phys_ofs, ALLOC_NORMAL); + new_metadata = jffs2_write_dnode(c, f, ri, mdata, mdatalen, ALLOC_NORMAL); if (S_ISLNK(inode->i_mode)) kfree(mdata); @@ -180,12 +183,17 @@ static int jffs2_do_setattr (struct inode *inode, struct iattr *iattr) int jffs2_setattr(struct dentry *dentry, struct iattr *iattr) { - return jffs2_do_setattr(dentry->d_inode, iattr); + int rc; + + rc = jffs2_do_setattr(dentry->d_inode, iattr); + if (!rc && (iattr->ia_valid & ATTR_MODE)) + rc = jffs2_acl_chmod(dentry->d_inode); + return rc; } -int jffs2_statfs(struct super_block *sb, struct kstatfs *buf) +int jffs2_statfs(struct dentry *dentry, struct kstatfs *buf) { - struct jffs2_sb_info *c = JFFS2_SB_INFO(sb); + struct jffs2_sb_info *c = JFFS2_SB_INFO(dentry->d_sb); unsigned long avail; buf->f_type = JFFS2_SUPER_MAGIC; @@ -218,7 +226,6 @@ void jffs2_clear_inode (struct inode *inode) struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); D1(printk(KERN_DEBUG "jffs2_clear_inode(): ino #%lu mode %o\n", inode->i_ino, inode->i_mode)); - jffs2_do_clear_inode(c, f); } @@ -227,6 +234,8 @@ void jffs2_read_inode (struct inode *inode) struct jffs2_inode_info *f; struct jffs2_sb_info *c; struct jffs2_raw_inode latest_node; + union jffs2_device_node jdev; + dev_t rdev = 0; int ret; D1(printk(KERN_DEBUG "jffs2_read_inode(): inode->i_ino == %lu\n", inode->i_ino)); @@ -254,11 +263,9 @@ void jffs2_read_inode (struct inode *inode) inode->i_nlink = f->inocache->nlink; - inode->i_blksize = PAGE_SIZE; inode->i_blocks = (inode->i_size + 511) >> 9; switch (inode->i_mode & S_IFMT) { - jint16_t rdev; case S_IFLNK: inode->i_op = &jffs2_symlink_inode_operations; @@ -292,8 +299,16 @@ void jffs2_read_inode (struct inode *inode) case S_IFBLK: case S_IFCHR: /* Read the device numbers from the media */ + if (f->metadata->size != sizeof(jdev.old) && + f->metadata->size != sizeof(jdev.new)) { + printk(KERN_NOTICE "Device node has strange size %d\n", f->metadata->size); + up(&f->sem); + jffs2_do_clear_inode(c, f); + make_bad_inode(inode); + return; + } D1(printk(KERN_DEBUG "Reading device numbers from flash\n")); - if (jffs2_read_dnode(c, f, f->metadata, (char *)&rdev, 0, sizeof(rdev)) < 0) { + if (jffs2_read_dnode(c, f, f->metadata, (char *)&jdev, 0, f->metadata->size) < 0) { /* Eep */ printk(KERN_NOTICE "Read device numbers for inode %lu failed\n", (unsigned long)inode->i_ino); up(&f->sem); @@ -301,12 +316,15 @@ void jffs2_read_inode (struct inode *inode) make_bad_inode(inode); return; } + if (f->metadata->size == sizeof(jdev.old)) + rdev = old_decode_dev(je16_to_cpu(jdev.old)); + else + rdev = new_decode_dev(je32_to_cpu(jdev.new)); case S_IFSOCK: case S_IFIFO: inode->i_op = &jffs2_file_inode_operations; - init_special_inode(inode, inode->i_mode, - old_decode_dev((je16_to_cpu(rdev)))); + init_special_inode(inode, inode->i_mode, rdev); break; default: @@ -430,7 +448,6 @@ struct inode *jffs2_new_inode (struct inode *dir_i, int mode, struct jffs2_raw_i inode->i_atime = inode->i_ctime = inode->i_mtime = CURRENT_TIME_SEC; ri->atime = ri->mtime = ri->ctime = cpu_to_je32(I_SEC(inode->i_mtime)); - inode->i_blksize = PAGE_SIZE; inode->i_blocks = 0; inode->i_size = 0; @@ -492,6 +509,8 @@ int jffs2_do_fill_super(struct super_block *sb, void *data, int silent) } memset(c->inocache_list, 0, INOCACHE_HASHSIZE * sizeof(struct jffs2_inode_cache *)); + jffs2_init_xattr_subsystem(c); + if ((ret = jffs2_do_mount_fs(c))) goto out_inohash; @@ -526,6 +545,7 @@ int jffs2_do_fill_super(struct super_block *sb, void *data, int silent) else kfree(c->blocks); out_inohash: + jffs2_clear_xattr_subsystem(c); kfree(c->inocache_list); out_wbuf: jffs2_flash_cleanup(c); @@ -639,13 +659,6 @@ static int jffs2_flash_setup(struct jffs2_sb_info *c) { return ret; } - /* add setups for other bizarre flashes here... */ - if (jffs2_nor_ecc(c)) { - ret = jffs2_nor_ecc_flash_setup(c); - if (ret) - return ret; - } - /* and Dataflash */ if (jffs2_dataflash(c)) { ret = jffs2_dataflash_setup(c); @@ -669,11 +682,6 @@ void jffs2_flash_cleanup(struct jffs2_sb_info *c) { jffs2_nand_flash_cleanup(c); } - /* add cleanups for other bizarre flashes here... */ - if (jffs2_nor_ecc(c)) { - jffs2_nor_ecc_flash_cleanup(c); - } - /* and DataFlash */ if (jffs2_dataflash(c)) { jffs2_dataflash_cleanup(c); diff --git a/fs/jffs2/gc.c b/fs/jffs2/gc.c index f9ffece45..daff3341f 100644 --- a/fs/jffs2/gc.c +++ b/fs/jffs2/gc.c @@ -125,6 +125,7 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c) struct jffs2_eraseblock *jeb; struct jffs2_raw_node_ref *raw; int ret = 0, inum, nlink; + int xattr = 0; if (down_interruptible(&c->alloc_sem)) return -EINTR; @@ -138,7 +139,7 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c) the node CRCs etc. Do it now. */ /* checked_ino is protected by the alloc_sem */ - if (c->checked_ino > c->highest_ino) { + if (c->checked_ino > c->highest_ino && xattr) { printk(KERN_CRIT "Checked all inodes but still 0x%x bytes of unchecked space?\n", c->unchecked_size); jffs2_dbg_dump_block_lists_nolock(c); @@ -148,6 +149,9 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c) spin_unlock(&c->erase_completion_lock); + if (!xattr) + xattr = jffs2_verify_xattr(c); + spin_lock(&c->inocache_lock); ic = jffs2_get_ino_cache(c, c->checked_ino++); @@ -161,6 +165,7 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c) D1(printk(KERN_DEBUG "Skipping check of ino #%d with nlink zero\n", ic->ino)); spin_unlock(&c->inocache_lock); + jffs2_xattr_delete_inode(c, ic); continue; } switch(ic->state) { @@ -181,6 +186,10 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c) and trigger the BUG() above while we haven't yet finished checking all its nodes */ D1(printk(KERN_DEBUG "Waiting for ino #%u to finish reading\n", ic->ino)); + /* We need to come back again for the _same_ inode. We've + made no progress in this case, but that should be OK */ + c->checked_ino--; + up(&c->alloc_sem); sleep_on_spinunlock(&c->inocache_wq, &c->inocache_lock); return 0; @@ -231,7 +240,7 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c) while(ref_obsolete(raw)) { D1(printk(KERN_DEBUG "Node at 0x%08x is obsolete... skipping\n", ref_offset(raw))); - raw = raw->next_phys; + raw = ref_next(raw); if (unlikely(!raw)) { printk(KERN_WARNING "eep. End of raw list while still supposedly nodes to GC\n"); printk(KERN_WARNING "erase block at 0x%08x. free_size 0x%08x, dirty_size 0x%08x, used_size 0x%08x\n", @@ -248,16 +257,36 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c) if (!raw->next_in_ino) { /* Inode-less node. Clean marker, snapshot or something like that */ - /* FIXME: If it's something that needs to be copied, including something - we don't grok that has JFFS2_NODETYPE_RWCOMPAT_COPY, we should do so */ spin_unlock(&c->erase_completion_lock); - jffs2_mark_node_obsolete(c, raw); + if (ref_flags(raw) == REF_PRISTINE) { + /* It's an unknown node with JFFS2_FEATURE_RWCOMPAT_COPY */ + jffs2_garbage_collect_pristine(c, NULL, raw); + } else { + /* Just mark it obsolete */ + jffs2_mark_node_obsolete(c, raw); + } up(&c->alloc_sem); goto eraseit_lock; } ic = jffs2_raw_ref_to_ic(raw); +#ifdef CONFIG_JFFS2_FS_XATTR + /* When 'ic' refers xattr_datum/xattr_ref, this node is GCed as xattr. + * We can decide whether this node is inode or xattr by ic->class. */ + if (ic->class == RAWNODE_CLASS_XATTR_DATUM + || ic->class == RAWNODE_CLASS_XATTR_REF) { + spin_unlock(&c->erase_completion_lock); + + if (ic->class == RAWNODE_CLASS_XATTR_DATUM) { + ret = jffs2_garbage_collect_xattr_datum(c, (struct jffs2_xattr_datum *)ic, raw); + } else { + ret = jffs2_garbage_collect_xattr_ref(c, (struct jffs2_xattr_ref *)ic, raw); + } + goto release_sem; + } +#endif + /* We need to hold the inocache. Either the erase_completion_lock or the inocache_lock are sufficient; we trade down since the inocache_lock causes less contention. */ @@ -499,7 +528,6 @@ static int jffs2_garbage_collect_pristine(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *raw) { union jffs2_node_union *node; - struct jffs2_raw_node_ref *nraw; size_t retlen; int ret; uint32_t phys_ofs, alloclen; @@ -508,15 +536,16 @@ static int jffs2_garbage_collect_pristine(struct jffs2_sb_info *c, D1(printk(KERN_DEBUG "Going to GC REF_PRISTINE node at 0x%08x\n", ref_offset(raw))); - rawlen = ref_totlen(c, c->gcblock, raw); + alloclen = rawlen = ref_totlen(c, c->gcblock, raw); /* Ask for a small amount of space (or the totlen if smaller) because we don't want to force wastage of the end of a block if splitting would work. */ - ret = jffs2_reserve_space_gc(c, min_t(uint32_t, sizeof(struct jffs2_raw_inode) + - JFFS2_MIN_DATA_LEN, rawlen), &phys_ofs, &alloclen, rawlen); - /* this is not the exact summary size of it, - it is only an upper estimation */ + if (ic && alloclen > sizeof(struct jffs2_raw_inode) + JFFS2_MIN_DATA_LEN) + alloclen = sizeof(struct jffs2_raw_inode) + JFFS2_MIN_DATA_LEN; + + ret = jffs2_reserve_space_gc(c, alloclen, &alloclen, rawlen); + /* 'rawlen' is not the exact summary size; it is only an upper estimation */ if (ret) return ret; @@ -580,22 +609,17 @@ static int jffs2_garbage_collect_pristine(struct jffs2_sb_info *c, } break; default: - printk(KERN_WARNING "Unknown node type for REF_PRISTINE node at 0x%08x: 0x%04x\n", - ref_offset(raw), je16_to_cpu(node->u.nodetype)); - goto bail; - } - - nraw = jffs2_alloc_raw_node_ref(); - if (!nraw) { - ret = -ENOMEM; - goto out_node; + /* If it's inode-less, we don't _know_ what it is. Just copy it intact */ + if (ic) { + printk(KERN_WARNING "Unknown node type for REF_PRISTINE node at 0x%08x: 0x%04x\n", + ref_offset(raw), je16_to_cpu(node->u.nodetype)); + goto bail; + } } /* OK, all the CRCs are good; this node can just be copied as-is. */ retry: - nraw->flash_offset = phys_ofs; - nraw->__totlen = rawlen; - nraw->next_phys = NULL; + phys_ofs = write_ofs(c); ret = jffs2_flash_write(c, phys_ofs, rawlen, &retlen, (char *)node); @@ -603,17 +627,11 @@ static int jffs2_garbage_collect_pristine(struct jffs2_sb_info *c, printk(KERN_NOTICE "Write of %d bytes at 0x%08x failed. returned %d, retlen %zd\n", rawlen, phys_ofs, ret, retlen); if (retlen) { - /* Doesn't belong to any inode */ - nraw->next_in_ino = NULL; - - nraw->flash_offset |= REF_OBSOLETE; - jffs2_add_physical_node_ref(c, nraw); - jffs2_mark_node_obsolete(c, nraw); + jffs2_add_physical_node_ref(c, phys_ofs | REF_OBSOLETE, rawlen, NULL); } else { - printk(KERN_NOTICE "Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", nraw->flash_offset); - jffs2_free_raw_node_ref(nraw); + printk(KERN_NOTICE "Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", phys_ofs); } - if (!retried && (nraw = jffs2_alloc_raw_node_ref())) { + if (!retried) { /* Try to reallocate space and retry */ uint32_t dummy; struct jffs2_eraseblock *jeb = &c->blocks[phys_ofs / c->sector_size]; @@ -625,7 +643,7 @@ static int jffs2_garbage_collect_pristine(struct jffs2_sb_info *c, jffs2_dbg_acct_sanity_check(c,jeb); jffs2_dbg_acct_paranoia_check(c, jeb); - ret = jffs2_reserve_space_gc(c, rawlen, &phys_ofs, &dummy, rawlen); + ret = jffs2_reserve_space_gc(c, rawlen, &dummy, rawlen); /* this is not the exact summary size of it, it is only an upper estimation */ @@ -638,25 +656,13 @@ static int jffs2_garbage_collect_pristine(struct jffs2_sb_info *c, goto retry; } D1(printk(KERN_DEBUG "Failed to allocate space to retry failed write: %d!\n", ret)); - jffs2_free_raw_node_ref(nraw); } - jffs2_free_raw_node_ref(nraw); if (!ret) ret = -EIO; goto out_node; } - nraw->flash_offset |= REF_PRISTINE; - jffs2_add_physical_node_ref(c, nraw); - - /* Link into per-inode list. This is safe because of the ic - state being INO_STATE_GC. Note that if we're doing this - for an inode which is in-core, the 'nraw' pointer is then - going to be fetched from ic->nodes by our caller. */ - spin_lock(&c->erase_completion_lock); - nraw->next_in_ino = ic->nodes; - ic->nodes = nraw; - spin_unlock(&c->erase_completion_lock); + jffs2_add_physical_node_ref(c, phys_ofs | REF_PRISTINE, rawlen, ic); jffs2_mark_node_obsolete(c, raw); D1(printk(KERN_DEBUG "WHEEE! GC REF_PRISTINE node at 0x%08x succeeded\n", ref_offset(raw))); @@ -675,19 +681,16 @@ static int jffs2_garbage_collect_metadata(struct jffs2_sb_info *c, struct jffs2_ struct jffs2_full_dnode *new_fn; struct jffs2_raw_inode ri; struct jffs2_node_frag *last_frag; - jint16_t dev; + union jffs2_device_node dev; char *mdata = NULL, mdatalen = 0; - uint32_t alloclen, phys_ofs, ilen; + uint32_t alloclen, ilen; int ret; if (S_ISBLK(JFFS2_F_I_MODE(f)) || S_ISCHR(JFFS2_F_I_MODE(f)) ) { /* For these, we don't actually need to read the old node */ - /* FIXME: for minor or major > 255. */ - dev = cpu_to_je16(((JFFS2_F_I_RDEV_MAJ(f) << 8) | - JFFS2_F_I_RDEV_MIN(f))); + mdatalen = jffs2_encode_dev(&dev, JFFS2_F_I_RDEV(f)); mdata = (char *)&dev; - mdatalen = sizeof(dev); D1(printk(KERN_DEBUG "jffs2_garbage_collect_metadata(): Writing %d bytes of kdev_t\n", mdatalen)); } else if (S_ISLNK(JFFS2_F_I_MODE(f))) { mdatalen = fn->size; @@ -706,7 +709,7 @@ static int jffs2_garbage_collect_metadata(struct jffs2_sb_info *c, struct jffs2_ } - ret = jffs2_reserve_space_gc(c, sizeof(ri) + mdatalen, &phys_ofs, &alloclen, + ret = jffs2_reserve_space_gc(c, sizeof(ri) + mdatalen, &alloclen, JFFS2_SUMMARY_INODE_SIZE); if (ret) { printk(KERN_WARNING "jffs2_reserve_space_gc of %zd bytes for garbage_collect_metadata failed: %d\n", @@ -744,7 +747,7 @@ static int jffs2_garbage_collect_metadata(struct jffs2_sb_info *c, struct jffs2_ ri.node_crc = cpu_to_je32(crc32(0, &ri, sizeof(ri)-8)); ri.data_crc = cpu_to_je32(crc32(0, mdata, mdatalen)); - new_fn = jffs2_write_dnode(c, f, &ri, mdata, mdatalen, phys_ofs, ALLOC_GC); + new_fn = jffs2_write_dnode(c, f, &ri, mdata, mdatalen, ALLOC_GC); if (IS_ERR(new_fn)) { printk(KERN_WARNING "Error writing new dnode: %ld\n", PTR_ERR(new_fn)); @@ -765,7 +768,7 @@ static int jffs2_garbage_collect_dirent(struct jffs2_sb_info *c, struct jffs2_er { struct jffs2_full_dirent *new_fd; struct jffs2_raw_dirent rd; - uint32_t alloclen, phys_ofs; + uint32_t alloclen; int ret; rd.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); @@ -787,14 +790,14 @@ static int jffs2_garbage_collect_dirent(struct jffs2_sb_info *c, struct jffs2_er rd.node_crc = cpu_to_je32(crc32(0, &rd, sizeof(rd)-8)); rd.name_crc = cpu_to_je32(crc32(0, fd->name, rd.nsize)); - ret = jffs2_reserve_space_gc(c, sizeof(rd)+rd.nsize, &phys_ofs, &alloclen, + ret = jffs2_reserve_space_gc(c, sizeof(rd)+rd.nsize, &alloclen, JFFS2_SUMMARY_DIRENT_SIZE(rd.nsize)); if (ret) { printk(KERN_WARNING "jffs2_reserve_space_gc of %zd bytes for garbage_collect_dirent failed: %d\n", sizeof(rd)+rd.nsize, ret); return ret; } - new_fd = jffs2_write_dirent(c, f, &rd, fd->name, rd.nsize, phys_ofs, ALLOC_GC); + new_fd = jffs2_write_dirent(c, f, &rd, fd->name, rd.nsize, ALLOC_GC); if (IS_ERR(new_fd)) { printk(KERN_WARNING "jffs2_write_dirent in garbage_collect_dirent failed: %ld\n", PTR_ERR(new_fd)); @@ -922,7 +925,7 @@ static int jffs2_garbage_collect_hole(struct jffs2_sb_info *c, struct jffs2_eras struct jffs2_raw_inode ri; struct jffs2_node_frag *frag; struct jffs2_full_dnode *new_fn; - uint32_t alloclen, phys_ofs, ilen; + uint32_t alloclen, ilen; int ret; D1(printk(KERN_DEBUG "Writing replacement hole node for ino #%u from offset 0x%x to 0x%x\n", @@ -1001,14 +1004,14 @@ static int jffs2_garbage_collect_hole(struct jffs2_sb_info *c, struct jffs2_eras ri.data_crc = cpu_to_je32(0); ri.node_crc = cpu_to_je32(crc32(0, &ri, sizeof(ri)-8)); - ret = jffs2_reserve_space_gc(c, sizeof(ri), &phys_ofs, &alloclen, - JFFS2_SUMMARY_INODE_SIZE); + ret = jffs2_reserve_space_gc(c, sizeof(ri), &alloclen, + JFFS2_SUMMARY_INODE_SIZE); if (ret) { printk(KERN_WARNING "jffs2_reserve_space_gc of %zd bytes for garbage_collect_hole failed: %d\n", sizeof(ri), ret); return ret; } - new_fn = jffs2_write_dnode(c, f, &ri, NULL, 0, phys_ofs, ALLOC_GC); + new_fn = jffs2_write_dnode(c, f, &ri, NULL, 0, ALLOC_GC); if (IS_ERR(new_fn)) { printk(KERN_WARNING "Error writing new hole node: %ld\n", PTR_ERR(new_fn)); @@ -1070,7 +1073,7 @@ static int jffs2_garbage_collect_dnode(struct jffs2_sb_info *c, struct jffs2_era { struct jffs2_full_dnode *new_fn; struct jffs2_raw_inode ri; - uint32_t alloclen, phys_ofs, offset, orig_end, orig_start; + uint32_t alloclen, offset, orig_end, orig_start; int ret = 0; unsigned char *comprbuf = NULL, *writebuf; unsigned long pg; @@ -1227,7 +1230,7 @@ static int jffs2_garbage_collect_dnode(struct jffs2_sb_info *c, struct jffs2_era uint32_t cdatalen; uint16_t comprtype = JFFS2_COMPR_NONE; - ret = jffs2_reserve_space_gc(c, sizeof(ri) + JFFS2_MIN_DATA_LEN, &phys_ofs, + ret = jffs2_reserve_space_gc(c, sizeof(ri) + JFFS2_MIN_DATA_LEN, &alloclen, JFFS2_SUMMARY_INODE_SIZE); if (ret) { @@ -1264,7 +1267,7 @@ static int jffs2_garbage_collect_dnode(struct jffs2_sb_info *c, struct jffs2_era ri.node_crc = cpu_to_je32(crc32(0, &ri, sizeof(ri)-8)); ri.data_crc = cpu_to_je32(crc32(0, comprbuf, cdatalen)); - new_fn = jffs2_write_dnode(c, f, &ri, comprbuf, cdatalen, phys_ofs, ALLOC_GC); + new_fn = jffs2_write_dnode(c, f, &ri, comprbuf, cdatalen, ALLOC_GC); jffs2_free_comprbuf(comprbuf, writebuf); diff --git a/fs/jffs2/histo.h b/fs/jffs2/histo.h deleted file mode 100644 index 22a93a082..000000000 --- a/fs/jffs2/histo.h +++ /dev/null @@ -1,3 +0,0 @@ -/* This file provides the bit-probabilities for the input file */ -#define BIT_DIVIDER 629 -static int bits[9] = { 179,167,183,165,159,198,178,119,}; /* ia32 .so files */ diff --git a/fs/jffs2/malloc.c b/fs/jffs2/malloc.c index 036cbd11c..33f291005 100644 --- a/fs/jffs2/malloc.c +++ b/fs/jffs2/malloc.c @@ -26,6 +26,10 @@ static kmem_cache_t *tmp_dnode_info_slab; static kmem_cache_t *raw_node_ref_slab; static kmem_cache_t *node_frag_slab; static kmem_cache_t *inode_cache_slab; +#ifdef CONFIG_JFFS2_FS_XATTR +static kmem_cache_t *xattr_datum_cache; +static kmem_cache_t *xattr_ref_cache; +#endif int __init jffs2_create_slab_caches(void) { @@ -53,8 +57,8 @@ int __init jffs2_create_slab_caches(void) if (!tmp_dnode_info_slab) goto err; - raw_node_ref_slab = kmem_cache_create("jffs2_raw_node_ref", - sizeof(struct jffs2_raw_node_ref), + raw_node_ref_slab = kmem_cache_create("jffs2_refblock", + sizeof(struct jffs2_raw_node_ref) * (REFS_PER_BLOCK + 1), 0, 0, NULL, NULL); if (!raw_node_ref_slab) goto err; @@ -68,8 +72,24 @@ int __init jffs2_create_slab_caches(void) inode_cache_slab = kmem_cache_create("jffs2_inode_cache", sizeof(struct jffs2_inode_cache), 0, 0, NULL, NULL); - if (inode_cache_slab) - return 0; + if (!inode_cache_slab) + goto err; + +#ifdef CONFIG_JFFS2_FS_XATTR + xattr_datum_cache = kmem_cache_create("jffs2_xattr_datum", + sizeof(struct jffs2_xattr_datum), + 0, 0, NULL, NULL); + if (!xattr_datum_cache) + goto err; + + xattr_ref_cache = kmem_cache_create("jffs2_xattr_ref", + sizeof(struct jffs2_xattr_ref), + 0, 0, NULL, NULL); + if (!xattr_ref_cache) + goto err; +#endif + + return 0; err: jffs2_destroy_slab_caches(); return -ENOMEM; @@ -91,6 +111,12 @@ void jffs2_destroy_slab_caches(void) kmem_cache_destroy(node_frag_slab); if(inode_cache_slab) kmem_cache_destroy(inode_cache_slab); +#ifdef CONFIG_JFFS2_FS_XATTR + if (xattr_datum_cache) + kmem_cache_destroy(xattr_datum_cache); + if (xattr_ref_cache) + kmem_cache_destroy(xattr_ref_cache); +#endif } struct jffs2_full_dirent *jffs2_alloc_full_dirent(int namesize) @@ -164,15 +190,65 @@ void jffs2_free_tmp_dnode_info(struct jffs2_tmp_dnode_info *x) kmem_cache_free(tmp_dnode_info_slab, x); } -struct jffs2_raw_node_ref *jffs2_alloc_raw_node_ref(void) +static struct jffs2_raw_node_ref *jffs2_alloc_refblock(void) { struct jffs2_raw_node_ref *ret; + ret = kmem_cache_alloc(raw_node_ref_slab, GFP_KERNEL); - dbg_memalloc("%p\n", ret); + if (ret) { + int i = 0; + for (i=0; i < REFS_PER_BLOCK; i++) { + ret[i].flash_offset = REF_EMPTY_NODE; + ret[i].next_in_ino = NULL; + } + ret[i].flash_offset = REF_LINK_NODE; + ret[i].next_in_ino = NULL; + } return ret; } -void jffs2_free_raw_node_ref(struct jffs2_raw_node_ref *x) +int jffs2_prealloc_raw_node_refs(struct jffs2_sb_info *c, + struct jffs2_eraseblock *jeb, int nr) +{ + struct jffs2_raw_node_ref **p, *ref; + int i = nr; + + dbg_memalloc("%d\n", nr); + + p = &jeb->last_node; + ref = *p; + + dbg_memalloc("Reserving %d refs for block @0x%08x\n", nr, jeb->offset); + + /* If jeb->last_node is really a valid node then skip over it */ + if (ref && ref->flash_offset != REF_EMPTY_NODE) + ref++; + + while (i) { + if (!ref) { + dbg_memalloc("Allocating new refblock linked from %p\n", p); + ref = *p = jffs2_alloc_refblock(); + if (!ref) + return -ENOMEM; + } + if (ref->flash_offset == REF_LINK_NODE) { + p = &ref->next_in_ino; + ref = *p; + continue; + } + i--; + ref++; + } + jeb->allocated_refs = nr; + + dbg_memalloc("Reserved %d refs for block @0x%08x, last_node is %p (%08x,%p)\n", + nr, jeb->offset, jeb->last_node, jeb->last_node->flash_offset, + jeb->last_node->next_in_ino); + + return 0; +} + +void jffs2_free_refblock(struct jffs2_raw_node_ref *x) { dbg_memalloc("%p\n", x); kmem_cache_free(raw_node_ref_slab, x); @@ -205,3 +281,42 @@ void jffs2_free_inode_cache(struct jffs2_inode_cache *x) dbg_memalloc("%p\n", x); kmem_cache_free(inode_cache_slab, x); } + +#ifdef CONFIG_JFFS2_FS_XATTR +struct jffs2_xattr_datum *jffs2_alloc_xattr_datum(void) +{ + struct jffs2_xattr_datum *xd; + xd = kmem_cache_alloc(xattr_datum_cache, GFP_KERNEL); + dbg_memalloc("%p\n", xd); + + memset(xd, 0, sizeof(struct jffs2_xattr_datum)); + xd->class = RAWNODE_CLASS_XATTR_DATUM; + xd->node = (void *)xd; + INIT_LIST_HEAD(&xd->xindex); + return xd; +} + +void jffs2_free_xattr_datum(struct jffs2_xattr_datum *xd) +{ + dbg_memalloc("%p\n", xd); + kmem_cache_free(xattr_datum_cache, xd); +} + +struct jffs2_xattr_ref *jffs2_alloc_xattr_ref(void) +{ + struct jffs2_xattr_ref *ref; + ref = kmem_cache_alloc(xattr_ref_cache, GFP_KERNEL); + dbg_memalloc("%p\n", ref); + + memset(ref, 0, sizeof(struct jffs2_xattr_ref)); + ref->class = RAWNODE_CLASS_XATTR_REF; + ref->node = (void *)ref; + return ref; +} + +void jffs2_free_xattr_ref(struct jffs2_xattr_ref *ref) +{ + dbg_memalloc("%p\n", ref); + kmem_cache_free(xattr_ref_cache, ref); +} +#endif diff --git a/fs/jffs2/nodelist.c b/fs/jffs2/nodelist.c index 1d46677af..5a6b4d642 100644 --- a/fs/jffs2/nodelist.c +++ b/fs/jffs2/nodelist.c @@ -21,6 +21,9 @@ #include #include "nodelist.h" +static void jffs2_obsolete_node_frag(struct jffs2_sb_info *c, + struct jffs2_node_frag *this); + void jffs2_add_fd_to_list(struct jffs2_sb_info *c, struct jffs2_full_dirent *new, struct jffs2_full_dirent **list) { struct jffs2_full_dirent **prev = list; @@ -87,7 +90,8 @@ void jffs2_truncate_fragtree(struct jffs2_sb_info *c, struct rb_root *list, uint } } -void jffs2_obsolete_node_frag(struct jffs2_sb_info *c, struct jffs2_node_frag *this) +static void jffs2_obsolete_node_frag(struct jffs2_sb_info *c, + struct jffs2_node_frag *this) { if (this->node) { this->node->frags--; @@ -438,8 +442,7 @@ static int check_node_data(struct jffs2_sb_info *c, struct jffs2_tmp_dnode_info if (c->mtd->point) { err = c->mtd->point(c->mtd, ofs, len, &retlen, &buffer); if (!err && retlen < tn->csize) { - JFFS2_WARNING("MTD point returned len too short: %zu " - "instead of %u.\n", retlen, tn->csize); + JFFS2_WARNING("MTD point returned len too short: %zu instead of %u.\n", retlen, tn->csize); c->mtd->unpoint(c->mtd, buffer, ofs, len); } else if (err) JFFS2_WARNING("MTD point failed: error code %d.\n", err); @@ -462,8 +465,7 @@ static int check_node_data(struct jffs2_sb_info *c, struct jffs2_tmp_dnode_info } if (retlen != len) { - JFFS2_ERROR("short read at %#08x: %zd instead of %d.\n", - ofs, retlen, len); + JFFS2_ERROR("short read at %#08x: %zd instead of %d.\n", ofs, retlen, len); err = -EIO; goto free_out; } @@ -908,6 +910,9 @@ void jffs2_del_ino_cache(struct jffs2_sb_info *c, struct jffs2_inode_cache *old) { struct jffs2_inode_cache **prev; +#ifdef CONFIG_JFFS2_FS_XATTR + BUG_ON(old->xref); +#endif dbg_inocache("del %p (ino #%u)\n", old, old->ino); spin_lock(&c->inocache_lock); @@ -940,6 +945,7 @@ void jffs2_free_ino_caches(struct jffs2_sb_info *c) this = c->inocache_list[i]; while (this) { next = this->next; + jffs2_xattr_free_inode(c, this); jffs2_free_inode_cache(this); this = next; } @@ -954,9 +960,13 @@ void jffs2_free_raw_node_refs(struct jffs2_sb_info *c) for (i=0; inr_blocks; i++) { this = c->blocks[i].first_node; - while(this) { - next = this->next_phys; - jffs2_free_raw_node_ref(this); + while (this) { + if (this[REFS_PER_BLOCK].flash_offset == REF_LINK_NODE) + next = this[REFS_PER_BLOCK].next_in_ino; + else + next = NULL; + + jffs2_free_refblock(this); this = next; } c->blocks[i].first_node = c->blocks[i].last_node = NULL; @@ -1047,3 +1057,169 @@ void jffs2_kill_fragtree(struct rb_root *root, struct jffs2_sb_info *c) cond_resched(); } } + +struct jffs2_raw_node_ref *jffs2_link_node_ref(struct jffs2_sb_info *c, + struct jffs2_eraseblock *jeb, + uint32_t ofs, uint32_t len, + struct jffs2_inode_cache *ic) +{ + struct jffs2_raw_node_ref *ref; + + BUG_ON(!jeb->allocated_refs); + jeb->allocated_refs--; + + ref = jeb->last_node; + + dbg_noderef("Last node at %p is (%08x,%p)\n", ref, ref->flash_offset, + ref->next_in_ino); + + while (ref->flash_offset != REF_EMPTY_NODE) { + if (ref->flash_offset == REF_LINK_NODE) + ref = ref->next_in_ino; + else + ref++; + } + + dbg_noderef("New ref is %p (%08x becomes %08x,%p) len 0x%x\n", ref, + ref->flash_offset, ofs, ref->next_in_ino, len); + + ref->flash_offset = ofs; + + if (!jeb->first_node) { + jeb->first_node = ref; + BUG_ON(ref_offset(ref) != jeb->offset); + } else if (unlikely(ref_offset(ref) != jeb->offset + c->sector_size - jeb->free_size)) { + uint32_t last_len = ref_totlen(c, jeb, jeb->last_node); + + JFFS2_ERROR("Adding new ref %p at (0x%08x-0x%08x) not immediately after previous (0x%08x-0x%08x)\n", + ref, ref_offset(ref), ref_offset(ref)+len, + ref_offset(jeb->last_node), + ref_offset(jeb->last_node)+last_len); + BUG(); + } + jeb->last_node = ref; + + if (ic) { + ref->next_in_ino = ic->nodes; + ic->nodes = ref; + } else { + ref->next_in_ino = NULL; + } + + switch(ref_flags(ref)) { + case REF_UNCHECKED: + c->unchecked_size += len; + jeb->unchecked_size += len; + break; + + case REF_NORMAL: + case REF_PRISTINE: + c->used_size += len; + jeb->used_size += len; + break; + + case REF_OBSOLETE: + c->dirty_size += len; + jeb->dirty_size += len; + break; + } + c->free_size -= len; + jeb->free_size -= len; + +#ifdef TEST_TOTLEN + /* Set (and test) __totlen field... for now */ + ref->__totlen = len; + ref_totlen(c, jeb, ref); +#endif + return ref; +} + +/* No locking, no reservation of 'ref'. Do not use on a live file system */ +int jffs2_scan_dirty_space(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, + uint32_t size) +{ + if (!size) + return 0; + if (unlikely(size > jeb->free_size)) { + printk(KERN_CRIT "Dirty space 0x%x larger then free_size 0x%x (wasted 0x%x)\n", + size, jeb->free_size, jeb->wasted_size); + BUG(); + } + /* REF_EMPTY_NODE is !obsolete, so that works OK */ + if (jeb->last_node && ref_obsolete(jeb->last_node)) { +#ifdef TEST_TOTLEN + jeb->last_node->__totlen += size; +#endif + c->dirty_size += size; + c->free_size -= size; + jeb->dirty_size += size; + jeb->free_size -= size; + } else { + uint32_t ofs = jeb->offset + c->sector_size - jeb->free_size; + ofs |= REF_OBSOLETE; + + jffs2_link_node_ref(c, jeb, ofs, size, NULL); + } + + return 0; +} + +/* Calculate totlen from surrounding nodes or eraseblock */ +static inline uint32_t __ref_totlen(struct jffs2_sb_info *c, + struct jffs2_eraseblock *jeb, + struct jffs2_raw_node_ref *ref) +{ + uint32_t ref_end; + struct jffs2_raw_node_ref *next_ref = ref_next(ref); + + if (next_ref) + ref_end = ref_offset(next_ref); + else { + if (!jeb) + jeb = &c->blocks[ref->flash_offset / c->sector_size]; + + /* Last node in block. Use free_space */ + if (unlikely(ref != jeb->last_node)) { + printk(KERN_CRIT "ref %p @0x%08x is not jeb->last_node (%p @0x%08x)\n", + ref, ref_offset(ref), jeb->last_node, jeb->last_node?ref_offset(jeb->last_node):0); + BUG(); + } + ref_end = jeb->offset + c->sector_size - jeb->free_size; + } + return ref_end - ref_offset(ref); +} + +uint32_t __jffs2_ref_totlen(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, + struct jffs2_raw_node_ref *ref) +{ + uint32_t ret; + + ret = __ref_totlen(c, jeb, ref); + +#ifdef TEST_TOTLEN + if (unlikely(ret != ref->__totlen)) { + if (!jeb) + jeb = &c->blocks[ref->flash_offset / c->sector_size]; + + printk(KERN_CRIT "Totlen for ref at %p (0x%08x-0x%08x) miscalculated as 0x%x instead of %x\n", + ref, ref_offset(ref), ref_offset(ref)+ref->__totlen, + ret, ref->__totlen); + if (ref_next(ref)) { + printk(KERN_CRIT "next %p (0x%08x-0x%08x)\n", ref_next(ref), ref_offset(ref_next(ref)), + ref_offset(ref_next(ref))+ref->__totlen); + } else + printk(KERN_CRIT "No next ref. jeb->last_node is %p\n", jeb->last_node); + + printk(KERN_CRIT "jeb->wasted_size %x, dirty_size %x, used_size %x, free_size %x\n", jeb->wasted_size, jeb->dirty_size, jeb->used_size, jeb->free_size); + +#if defined(JFFS2_DBG_DUMPS) || defined(JFFS2_DBG_PARANOIA_CHECKS) + __jffs2_dbg_dump_node_refs_nolock(c, jeb); +#endif + + WARN_ON(1); + + ret = ref->__totlen; + } +#endif /* TEST_TOTLEN */ + return ret; +} diff --git a/fs/jffs2/nodelist.h b/fs/jffs2/nodelist.h index 23a67bb30..0ddfd7030 100644 --- a/fs/jffs2/nodelist.h +++ b/fs/jffs2/nodelist.h @@ -14,12 +14,13 @@ #ifndef __JFFS2_NODELIST_H__ #define __JFFS2_NODELIST_H__ -#include #include #include #include -#include -#include +#include "jffs2_fs_sb.h" +#include "jffs2_fs_i.h" +#include "xattr.h" +#include "acl.h" #include "summary.h" #ifdef __ECOS @@ -75,14 +76,50 @@ struct jffs2_raw_node_ref { struct jffs2_raw_node_ref *next_in_ino; /* Points to the next raw_node_ref - for this inode. If this is the last, it points to the inode_cache - for this inode instead. The inode_cache will have NULL in the first - word so you know when you've got there :) */ - struct jffs2_raw_node_ref *next_phys; + for this object. If this _is_ the last, it points to the inode_cache, + xattr_ref or xattr_datum instead. The common part of those structures + has NULL in the first word. See jffs2_raw_ref_to_ic() below */ uint32_t flash_offset; +#define TEST_TOTLEN +#ifdef TEST_TOTLEN uint32_t __totlen; /* This may die; use ref_totlen(c, jeb, ) below */ +#endif }; +#define REF_LINK_NODE ((int32_t)-1) +#define REF_EMPTY_NODE ((int32_t)-2) + +/* Use blocks of about 256 bytes */ +#define REFS_PER_BLOCK ((255/sizeof(struct jffs2_raw_node_ref))-1) + +static inline struct jffs2_raw_node_ref *ref_next(struct jffs2_raw_node_ref *ref) +{ + ref++; + + /* Link to another block of refs */ + if (ref->flash_offset == REF_LINK_NODE) { + ref = ref->next_in_ino; + if (!ref) + return ref; + } + + /* End of chain */ + if (ref->flash_offset == REF_EMPTY_NODE) + return NULL; + + return ref; +} + +static inline struct jffs2_inode_cache *jffs2_raw_ref_to_ic(struct jffs2_raw_node_ref *raw) +{ + while(raw->next_in_ino) + raw = raw->next_in_ino; + + /* NB. This can be a jffs2_xattr_datum or jffs2_xattr_ref and + not actually a jffs2_inode_cache. Check ->class */ + return ((struct jffs2_inode_cache *)raw); +} + /* flash_offset & 3 always has to be zero, because nodes are always aligned at 4 bytes. So we have a couple of extra bits to play with, which indicate the node's status; see below: */ @@ -95,6 +132,11 @@ struct jffs2_raw_node_ref #define ref_obsolete(ref) (((ref)->flash_offset & 3) == REF_OBSOLETE) #define mark_ref_normal(ref) do { (ref)->flash_offset = ref_offset(ref) | REF_NORMAL; } while(0) +/* NB: REF_PRISTINE for an inode-less node (ref->next_in_ino == NULL) indicates + it is an unknown node of type JFFS2_NODETYPE_RWCOMPAT_COPY, so it'll get + copied. If you need to do anything different to GC inode-less nodes, then + you need to modify gc.c accordingly. */ + /* For each inode in the filesystem, we need to keep a record of nlink, because it would be a PITA to scan the whole directory tree at read_inode() time to calculate it, and to keep sufficient information @@ -103,15 +145,27 @@ struct jffs2_raw_node_ref a pointer to the first physical node which is part of this inode, too. */ struct jffs2_inode_cache { + /* First part of structure is shared with other objects which + can terminate the raw node refs' next_in_ino list -- which + currently struct jffs2_xattr_datum and struct jffs2_xattr_ref. */ + struct jffs2_full_dirent *scan_dents; /* Used during scan to hold temporary lists of dirents, and later must be set to NULL to mark the end of the raw_node_ref->next_in_ino chain. */ - struct jffs2_inode_cache *next; struct jffs2_raw_node_ref *nodes; + uint8_t class; /* It's used for identification */ + + /* end of shared structure */ + + uint8_t flags; + uint16_t state; uint32_t ino; + struct jffs2_inode_cache *next; +#ifdef CONFIG_JFFS2_FS_XATTR + struct jffs2_xattr_ref *xref; +#endif int nlink; - int state; }; /* Inode states for 'state' above. We need the 'GC' state to prevent @@ -125,8 +179,16 @@ struct jffs2_inode_cache { #define INO_STATE_READING 5 /* In read_inode() */ #define INO_STATE_CLEARING 6 /* In clear_inode() */ +#define INO_FLAGS_XATTR_CHECKED 0x01 /* has no duplicate xattr_ref */ + +#define RAWNODE_CLASS_INODE_CACHE 0 +#define RAWNODE_CLASS_XATTR_DATUM 1 +#define RAWNODE_CLASS_XATTR_REF 2 + #define INOCACHE_HASHSIZE 128 +#define write_ofs(c) ((c)->nextblock->offset + (c)->sector_size - (c)->nextblock->free_size) + /* Larger representation of a raw node, kept in-core only when the struct inode for this particular ino is instantiated. @@ -192,6 +254,7 @@ struct jffs2_eraseblock uint32_t wasted_size; uint32_t free_size; /* Note that sector_size - free_size is the address of the first free space */ + uint32_t allocated_refs; struct jffs2_raw_node_ref *first_node; struct jffs2_raw_node_ref *last_node; @@ -203,57 +266,7 @@ static inline int jffs2_blocks_use_vmalloc(struct jffs2_sb_info *c) return ((c->flash_size / c->sector_size) * sizeof (struct jffs2_eraseblock)) > (128 * 1024); } -/* Calculate totlen from surrounding nodes or eraseblock */ -static inline uint32_t __ref_totlen(struct jffs2_sb_info *c, - struct jffs2_eraseblock *jeb, - struct jffs2_raw_node_ref *ref) -{ - uint32_t ref_end; - - if (ref->next_phys) - ref_end = ref_offset(ref->next_phys); - else { - if (!jeb) - jeb = &c->blocks[ref->flash_offset / c->sector_size]; - - /* Last node in block. Use free_space */ - BUG_ON(ref != jeb->last_node); - ref_end = jeb->offset + c->sector_size - jeb->free_size; - } - return ref_end - ref_offset(ref); -} - -static inline uint32_t ref_totlen(struct jffs2_sb_info *c, - struct jffs2_eraseblock *jeb, - struct jffs2_raw_node_ref *ref) -{ - uint32_t ret; - -#if CONFIG_JFFS2_FS_DEBUG > 0 - if (jeb && jeb != &c->blocks[ref->flash_offset / c->sector_size]) { - printk(KERN_CRIT "ref_totlen called with wrong block -- at 0x%08x instead of 0x%08x; ref 0x%08x\n", - jeb->offset, c->blocks[ref->flash_offset / c->sector_size].offset, ref_offset(ref)); - BUG(); - } -#endif - -#if 1 - ret = ref->__totlen; -#else - /* This doesn't actually work yet */ - ret = __ref_totlen(c, jeb, ref); - if (ret != ref->__totlen) { - printk(KERN_CRIT "Totlen for ref at %p (0x%08x-0x%08x) miscalculated as 0x%x instead of %x\n", - ref, ref_offset(ref), ref_offset(ref)+ref->__totlen, - ret, ref->__totlen); - if (!jeb) - jeb = &c->blocks[ref->flash_offset / c->sector_size]; - jffs2_dbg_dump_node_refs_nolock(c, jeb); - BUG(); - } -#endif - return ret; -} +#define ref_totlen(a, b, c) __jffs2_ref_totlen((a), (b), (c)) #define ALLOC_NORMAL 0 /* Normal allocation */ #define ALLOC_DELETION 1 /* Deletion node. Best to allow it */ @@ -268,13 +281,15 @@ static inline uint32_t ref_totlen(struct jffs2_sb_info *c, #define PAD(x) (((x)+3)&~3) -static inline struct jffs2_inode_cache *jffs2_raw_ref_to_ic(struct jffs2_raw_node_ref *raw) +static inline int jffs2_encode_dev(union jffs2_device_node *jdev, dev_t rdev) { - while(raw->next_in_ino) { - raw = raw->next_in_ino; + if (old_valid_dev(rdev)) { + jdev->old = cpu_to_je16(old_encode_dev(rdev)); + return sizeof(jdev->old); + } else { + jdev->new = cpu_to_je32(new_encode_dev(rdev)); + return sizeof(jdev->new); } - - return ((struct jffs2_inode_cache *)raw); } static inline struct jffs2_node_frag *frag_first(struct rb_root *root) @@ -299,7 +314,6 @@ static inline struct jffs2_node_frag *frag_last(struct rb_root *root) return rb_entry(node, struct jffs2_node_frag, rb); } -#define rb_parent(rb) ((rb)->rb_parent) #define frag_next(frag) rb_entry(rb_next(&(frag)->rb), struct jffs2_node_frag, rb) #define frag_prev(frag) rb_entry(rb_prev(&(frag)->rb), struct jffs2_node_frag, rb) #define frag_parent(frag) rb_entry(rb_parent(&(frag)->rb), struct jffs2_node_frag, rb) @@ -320,32 +334,47 @@ void jffs2_kill_fragtree(struct rb_root *root, struct jffs2_sb_info *c_delete); struct rb_node *rb_next(struct rb_node *); struct rb_node *rb_prev(struct rb_node *); void rb_replace_node(struct rb_node *victim, struct rb_node *new, struct rb_root *root); -void jffs2_obsolete_node_frag(struct jffs2_sb_info *c, struct jffs2_node_frag *this); int jffs2_add_full_dnode_to_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_full_dnode *fn); void jffs2_truncate_fragtree (struct jffs2_sb_info *c, struct rb_root *list, uint32_t size); int jffs2_add_older_frag_to_fragtree(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_tmp_dnode_info *tn); +struct jffs2_raw_node_ref *jffs2_link_node_ref(struct jffs2_sb_info *c, + struct jffs2_eraseblock *jeb, + uint32_t ofs, uint32_t len, + struct jffs2_inode_cache *ic); +extern uint32_t __jffs2_ref_totlen(struct jffs2_sb_info *c, + struct jffs2_eraseblock *jeb, + struct jffs2_raw_node_ref *ref); /* nodemgmt.c */ int jffs2_thread_should_wake(struct jffs2_sb_info *c); -int jffs2_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, uint32_t *ofs, +int jffs2_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, uint32_t *len, int prio, uint32_t sumsize); -int jffs2_reserve_space_gc(struct jffs2_sb_info *c, uint32_t minsize, uint32_t *ofs, +int jffs2_reserve_space_gc(struct jffs2_sb_info *c, uint32_t minsize, uint32_t *len, uint32_t sumsize); -int jffs2_add_physical_node_ref(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *new); +struct jffs2_raw_node_ref *jffs2_add_physical_node_ref(struct jffs2_sb_info *c, + uint32_t ofs, uint32_t len, + struct jffs2_inode_cache *ic); void jffs2_complete_reservation(struct jffs2_sb_info *c); void jffs2_mark_node_obsolete(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *raw); /* write.c */ int jffs2_do_new_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, uint32_t mode, struct jffs2_raw_inode *ri); -struct jffs2_full_dnode *jffs2_write_dnode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_raw_inode *ri, const unsigned char *data, uint32_t datalen, uint32_t flash_ofs, int alloc_mode); -struct jffs2_full_dirent *jffs2_write_dirent(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_raw_dirent *rd, const unsigned char *name, uint32_t namelen, uint32_t flash_ofs, int alloc_mode); +struct jffs2_full_dnode *jffs2_write_dnode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, + struct jffs2_raw_inode *ri, const unsigned char *data, + uint32_t datalen, int alloc_mode); +struct jffs2_full_dirent *jffs2_write_dirent(struct jffs2_sb_info *c, struct jffs2_inode_info *f, + struct jffs2_raw_dirent *rd, const unsigned char *name, + uint32_t namelen, int alloc_mode); int jffs2_write_inode_range(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_raw_inode *ri, unsigned char *buf, uint32_t offset, uint32_t writelen, uint32_t *retlen); -int jffs2_do_create(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, struct jffs2_inode_info *f, struct jffs2_raw_inode *ri, const char *name, int namelen); -int jffs2_do_unlink(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, const char *name, int namelen, struct jffs2_inode_info *dead_f, uint32_t time); -int jffs2_do_link (struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, uint32_t ino, uint8_t type, const char *name, int namelen, uint32_t time); +int jffs2_do_create(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, struct jffs2_inode_info *f, + struct jffs2_raw_inode *ri, const char *name, int namelen); +int jffs2_do_unlink(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, const char *name, + int namelen, struct jffs2_inode_info *dead_f, uint32_t time); +int jffs2_do_link(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, uint32_t ino, + uint8_t type, const char *name, int namelen, uint32_t time); /* readinode.c */ @@ -368,12 +397,19 @@ struct jffs2_raw_inode *jffs2_alloc_raw_inode(void); void jffs2_free_raw_inode(struct jffs2_raw_inode *); struct jffs2_tmp_dnode_info *jffs2_alloc_tmp_dnode_info(void); void jffs2_free_tmp_dnode_info(struct jffs2_tmp_dnode_info *); -struct jffs2_raw_node_ref *jffs2_alloc_raw_node_ref(void); -void jffs2_free_raw_node_ref(struct jffs2_raw_node_ref *); +int jffs2_prealloc_raw_node_refs(struct jffs2_sb_info *c, + struct jffs2_eraseblock *jeb, int nr); +void jffs2_free_refblock(struct jffs2_raw_node_ref *); struct jffs2_node_frag *jffs2_alloc_node_frag(void); void jffs2_free_node_frag(struct jffs2_node_frag *); struct jffs2_inode_cache *jffs2_alloc_inode_cache(void); void jffs2_free_inode_cache(struct jffs2_inode_cache *); +#ifdef CONFIG_JFFS2_FS_XATTR +struct jffs2_xattr_datum *jffs2_alloc_xattr_datum(void); +void jffs2_free_xattr_datum(struct jffs2_xattr_datum *); +struct jffs2_xattr_ref *jffs2_alloc_xattr_ref(void); +void jffs2_free_xattr_ref(struct jffs2_xattr_ref *); +#endif /* gc.c */ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c); @@ -389,16 +425,16 @@ char *jffs2_getlink(struct jffs2_sb_info *c, struct jffs2_inode_info *f); /* scan.c */ int jffs2_scan_medium(struct jffs2_sb_info *c); void jffs2_rotate_lists(struct jffs2_sb_info *c); -int jffs2_fill_scan_buf(struct jffs2_sb_info *c, void *buf, - uint32_t ofs, uint32_t len); struct jffs2_inode_cache *jffs2_scan_make_ino_cache(struct jffs2_sb_info *c, uint32_t ino); int jffs2_scan_classify_jeb(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb); +int jffs2_scan_dirty_space(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, uint32_t size); /* build.c */ int jffs2_do_mount_fs(struct jffs2_sb_info *c); /* erase.c */ void jffs2_erase_pending_blocks(struct jffs2_sb_info *c, int count); +void jffs2_free_jeb_node_refs(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb); #ifdef CONFIG_JFFS2_FS_WRITEBUFFER /* wbuf.c */ diff --git a/fs/jffs2/nodemgmt.c b/fs/jffs2/nodemgmt.c index 49127a1f0..d88376992 100644 --- a/fs/jffs2/nodemgmt.c +++ b/fs/jffs2/nodemgmt.c @@ -23,13 +23,12 @@ * jffs2_reserve_space - request physical space to write nodes to flash * @c: superblock info * @minsize: Minimum acceptable size of allocation - * @ofs: Returned value of node offset * @len: Returned value of allocation length * @prio: Allocation type - ALLOC_{NORMAL,DELETION} * * Requests a block of physical space on the flash. Returns zero for success - * and puts 'ofs' and 'len' into the appriopriate place, or returns -ENOSPC - * or other error if appropriate. + * and puts 'len' into the appropriate place, or returns -ENOSPC or other + * error if appropriate. Doesn't return len since that's * * If it returns zero, jffs2_reserve_space() also downs the per-filesystem * allocation semaphore, to prevent more than one allocation from being @@ -40,9 +39,9 @@ */ static int jffs2_do_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, - uint32_t *ofs, uint32_t *len, uint32_t sumsize); + uint32_t *len, uint32_t sumsize); -int jffs2_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, uint32_t *ofs, +int jffs2_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, uint32_t *len, int prio, uint32_t sumsize) { int ret = -EAGAIN; @@ -132,19 +131,21 @@ int jffs2_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, uint32_t *ofs spin_lock(&c->erase_completion_lock); } - ret = jffs2_do_reserve_space(c, minsize, ofs, len, sumsize); + ret = jffs2_do_reserve_space(c, minsize, len, sumsize); if (ret) { D1(printk(KERN_DEBUG "jffs2_reserve_space: ret is %d\n", ret)); } } spin_unlock(&c->erase_completion_lock); + if (!ret) + ret = jffs2_prealloc_raw_node_refs(c, c->nextblock, 1); if (ret) up(&c->alloc_sem); return ret; } -int jffs2_reserve_space_gc(struct jffs2_sb_info *c, uint32_t minsize, uint32_t *ofs, - uint32_t *len, uint32_t sumsize) +int jffs2_reserve_space_gc(struct jffs2_sb_info *c, uint32_t minsize, + uint32_t *len, uint32_t sumsize) { int ret = -EAGAIN; minsize = PAD(minsize); @@ -153,12 +154,15 @@ int jffs2_reserve_space_gc(struct jffs2_sb_info *c, uint32_t minsize, uint32_t * spin_lock(&c->erase_completion_lock); while(ret == -EAGAIN) { - ret = jffs2_do_reserve_space(c, minsize, ofs, len, sumsize); + ret = jffs2_do_reserve_space(c, minsize, len, sumsize); if (ret) { D1(printk(KERN_DEBUG "jffs2_reserve_space_gc: looping, ret is %d\n", ret)); } } spin_unlock(&c->erase_completion_lock); + if (!ret) + ret = jffs2_prealloc_raw_node_refs(c, c->nextblock, 1); + return ret; } @@ -207,8 +211,7 @@ static int jffs2_find_nextblock(struct jffs2_sb_info *c) struct jffs2_eraseblock *ejeb; ejeb = list_entry(c->erasable_list.next, struct jffs2_eraseblock, list); - list_del(&ejeb->list); - list_add_tail(&ejeb->list, &c->erase_pending_list); + list_move_tail(&ejeb->list, &c->erase_pending_list); c->nr_erasing_blocks++; jffs2_erase_pending_trigger(c); D1(printk(KERN_DEBUG "jffs2_find_nextblock: Triggering erase of erasable block at 0x%08x\n", @@ -259,10 +262,11 @@ static int jffs2_find_nextblock(struct jffs2_sb_info *c) } /* Called with alloc sem _and_ erase_completion_lock */ -static int jffs2_do_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, uint32_t *ofs, uint32_t *len, uint32_t sumsize) +static int jffs2_do_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, + uint32_t *len, uint32_t sumsize) { struct jffs2_eraseblock *jeb = c->nextblock; - uint32_t reserved_size; /* for summary information at the end of the jeb */ + uint32_t reserved_size; /* for summary information at the end of the jeb */ int ret; restart: @@ -312,6 +316,8 @@ static int jffs2_do_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, uin } } else { if (jeb && minsize > jeb->free_size) { + uint32_t waste; + /* Skip the end of this block and file it as having some dirty space */ /* If there's a pending write to it, flush now */ @@ -324,10 +330,26 @@ static int jffs2_do_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, uin goto restart; } - c->wasted_size += jeb->free_size; - c->free_size -= jeb->free_size; - jeb->wasted_size += jeb->free_size; - jeb->free_size = 0; + spin_unlock(&c->erase_completion_lock); + + ret = jffs2_prealloc_raw_node_refs(c, jeb, 1); + if (ret) + return ret; + /* Just lock it again and continue. Nothing much can change because + we hold c->alloc_sem anyway. In fact, it's not entirely clear why + we hold c->erase_completion_lock in the majority of this function... + but that's a question for another (more caffeine-rich) day. */ + spin_lock(&c->erase_completion_lock); + + waste = jeb->free_size; + jffs2_link_node_ref(c, jeb, + (jeb->offset + c->sector_size - waste) | REF_OBSOLETE, + waste, NULL); + /* FIXME: that made it count as dirty. Convert to wasted */ + jeb->dirty_size -= waste; + c->dirty_size -= waste; + jeb->wasted_size += waste; + c->wasted_size += waste; jffs2_close_nextblock(c, jeb); jeb = NULL; @@ -349,7 +371,6 @@ static int jffs2_do_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, uin } /* OK, jeb (==c->nextblock) is now pointing at a block which definitely has enough space */ - *ofs = jeb->offset + (c->sector_size - jeb->free_size); *len = jeb->free_size - reserved_size; if (c->cleanmarker_size && jeb->used_size == c->cleanmarker_size && @@ -365,7 +386,8 @@ static int jffs2_do_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, uin spin_lock(&c->erase_completion_lock); } - D1(printk(KERN_DEBUG "jffs2_do_reserve_space(): Giving 0x%x bytes at 0x%x\n", *len, *ofs)); + D1(printk(KERN_DEBUG "jffs2_do_reserve_space(): Giving 0x%x bytes at 0x%x\n", + *len, jeb->offset + (c->sector_size - jeb->free_size))); return 0; } @@ -374,7 +396,6 @@ static int jffs2_do_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, uin * @c: superblock info * @new: new node reference to add * @len: length of this physical node - * @dirty: dirty flag for new node * * Should only be used to report nodes for which space has been allocated * by jffs2_reserve_space. @@ -382,42 +403,30 @@ static int jffs2_do_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, uin * Must be called with the alloc_sem held. */ -int jffs2_add_physical_node_ref(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *new) +struct jffs2_raw_node_ref *jffs2_add_physical_node_ref(struct jffs2_sb_info *c, + uint32_t ofs, uint32_t len, + struct jffs2_inode_cache *ic) { struct jffs2_eraseblock *jeb; - uint32_t len; + struct jffs2_raw_node_ref *new; - jeb = &c->blocks[new->flash_offset / c->sector_size]; - len = ref_totlen(c, jeb, new); + jeb = &c->blocks[ofs / c->sector_size]; - D1(printk(KERN_DEBUG "jffs2_add_physical_node_ref(): Node at 0x%x(%d), size 0x%x\n", ref_offset(new), ref_flags(new), len)); + D1(printk(KERN_DEBUG "jffs2_add_physical_node_ref(): Node at 0x%x(%d), size 0x%x\n", + ofs & ~3, ofs & 3, len)); #if 1 - /* we could get some obsolete nodes after nextblock was refiled - in wbuf.c */ - if ((c->nextblock || !ref_obsolete(new)) - &&(jeb != c->nextblock || ref_offset(new) != jeb->offset + (c->sector_size - jeb->free_size))) { + /* Allow non-obsolete nodes only to be added at the end of c->nextblock, + if c->nextblock is set. Note that wbuf.c will file obsolete nodes + even after refiling c->nextblock */ + if ((c->nextblock || ((ofs & 3) != REF_OBSOLETE)) + && (jeb != c->nextblock || (ofs & ~3) != jeb->offset + (c->sector_size - jeb->free_size))) { printk(KERN_WARNING "argh. node added in wrong place\n"); - jffs2_free_raw_node_ref(new); - return -EINVAL; + return ERR_PTR(-EINVAL); } #endif spin_lock(&c->erase_completion_lock); - if (!jeb->first_node) - jeb->first_node = new; - if (jeb->last_node) - jeb->last_node->next_phys = new; - jeb->last_node = new; - - jeb->free_size -= len; - c->free_size -= len; - if (ref_obsolete(new)) { - jeb->dirty_size += len; - c->dirty_size += len; - } else { - jeb->used_size += len; - c->used_size += len; - } + new = jffs2_link_node_ref(c, jeb, ofs, len, ic); if (!jeb->free_size && !jeb->dirty_size && !ISDIRTY(jeb->wasted_size)) { /* If it lives on the dirty_list, jffs2_reserve_space will put it there */ @@ -438,7 +447,7 @@ int jffs2_add_physical_node_ref(struct jffs2_sb_info *c, struct jffs2_raw_node_r spin_unlock(&c->erase_completion_lock); - return 0; + return new; } @@ -470,8 +479,9 @@ void jffs2_mark_node_obsolete(struct jffs2_sb_info *c, struct jffs2_raw_node_ref struct jffs2_unknown_node n; int ret, addedsize; size_t retlen; + uint32_t freed_len; - if(!ref) { + if(unlikely(!ref)) { printk(KERN_NOTICE "EEEEEK. jffs2_mark_node_obsolete called with NULL node\n"); return; } @@ -499,32 +509,34 @@ void jffs2_mark_node_obsolete(struct jffs2_sb_info *c, struct jffs2_raw_node_ref spin_lock(&c->erase_completion_lock); + freed_len = ref_totlen(c, jeb, ref); + if (ref_flags(ref) == REF_UNCHECKED) { - D1(if (unlikely(jeb->unchecked_size < ref_totlen(c, jeb, ref))) { + D1(if (unlikely(jeb->unchecked_size < freed_len)) { printk(KERN_NOTICE "raw unchecked node of size 0x%08x freed from erase block %d at 0x%08x, but unchecked_size was already 0x%08x\n", - ref_totlen(c, jeb, ref), blocknr, ref->flash_offset, jeb->used_size); + freed_len, blocknr, ref->flash_offset, jeb->used_size); BUG(); }) - D1(printk(KERN_DEBUG "Obsoleting previously unchecked node at 0x%08x of len %x: ", ref_offset(ref), ref_totlen(c, jeb, ref))); - jeb->unchecked_size -= ref_totlen(c, jeb, ref); - c->unchecked_size -= ref_totlen(c, jeb, ref); + D1(printk(KERN_DEBUG "Obsoleting previously unchecked node at 0x%08x of len %x: ", ref_offset(ref), freed_len)); + jeb->unchecked_size -= freed_len; + c->unchecked_size -= freed_len; } else { - D1(if (unlikely(jeb->used_size < ref_totlen(c, jeb, ref))) { + D1(if (unlikely(jeb->used_size < freed_len)) { printk(KERN_NOTICE "raw node of size 0x%08x freed from erase block %d at 0x%08x, but used_size was already 0x%08x\n", - ref_totlen(c, jeb, ref), blocknr, ref->flash_offset, jeb->used_size); + freed_len, blocknr, ref->flash_offset, jeb->used_size); BUG(); }) - D1(printk(KERN_DEBUG "Obsoleting node at 0x%08x of len %#x: ", ref_offset(ref), ref_totlen(c, jeb, ref))); - jeb->used_size -= ref_totlen(c, jeb, ref); - c->used_size -= ref_totlen(c, jeb, ref); + D1(printk(KERN_DEBUG "Obsoleting node at 0x%08x of len %#x: ", ref_offset(ref), freed_len)); + jeb->used_size -= freed_len; + c->used_size -= freed_len; } // Take care, that wasted size is taken into concern - if ((jeb->dirty_size || ISDIRTY(jeb->wasted_size + ref_totlen(c, jeb, ref))) && jeb != c->nextblock) { - D1(printk(KERN_DEBUG "Dirtying\n")); - addedsize = ref_totlen(c, jeb, ref); - jeb->dirty_size += ref_totlen(c, jeb, ref); - c->dirty_size += ref_totlen(c, jeb, ref); + if ((jeb->dirty_size || ISDIRTY(jeb->wasted_size + freed_len)) && jeb != c->nextblock) { + D1(printk("Dirtying\n")); + addedsize = freed_len; + jeb->dirty_size += freed_len; + c->dirty_size += freed_len; /* Convert wasted space to dirty, if not a bad block */ if (jeb->wasted_size) { @@ -543,10 +555,10 @@ void jffs2_mark_node_obsolete(struct jffs2_sb_info *c, struct jffs2_raw_node_ref } } } else { - D1(printk(KERN_DEBUG "Wasting\n")); + D1(printk("Wasting\n")); addedsize = 0; - jeb->wasted_size += ref_totlen(c, jeb, ref); - c->wasted_size += ref_totlen(c, jeb, ref); + jeb->wasted_size += freed_len; + c->wasted_size += freed_len; } ref->flash_offset = ref_offset(ref) | REF_OBSOLETE; @@ -622,7 +634,7 @@ void jffs2_mark_node_obsolete(struct jffs2_sb_info *c, struct jffs2_raw_node_ref /* The erase_free_sem is locked, and has been since before we marked the node obsolete and potentially put its eraseblock onto the erase_pending_list. Thus, we know that the block hasn't _already_ been erased, and that 'ref' itself hasn't been freed yet - by jffs2_free_all_node_refs() in erase.c. Which is nice. */ + by jffs2_free_jeb_node_refs() in erase.c. Which is nice. */ D1(printk(KERN_DEBUG "obliterating obsoleted node at 0x%08x\n", ref_offset(ref))); ret = jffs2_flash_read(c, ref_offset(ref), sizeof(n), &retlen, (char *)&n); @@ -634,8 +646,8 @@ void jffs2_mark_node_obsolete(struct jffs2_sb_info *c, struct jffs2_raw_node_ref printk(KERN_WARNING "Short read from obsoleted node at 0x%08x: %zd\n", ref_offset(ref), retlen); goto out_erase_sem; } - if (PAD(je32_to_cpu(n.totlen)) != PAD(ref_totlen(c, jeb, ref))) { - printk(KERN_WARNING "Node totlen on flash (0x%08x) != totlen from node ref (0x%08x)\n", je32_to_cpu(n.totlen), ref_totlen(c, jeb, ref)); + if (PAD(je32_to_cpu(n.totlen)) != PAD(freed_len)) { + printk(KERN_WARNING "Node totlen on flash (0x%08x) != totlen from node ref (0x%08x)\n", je32_to_cpu(n.totlen), freed_len); goto out_erase_sem; } if (!(je16_to_cpu(n.nodetype) & JFFS2_NODE_ACCURATE)) { @@ -677,57 +689,23 @@ void jffs2_mark_node_obsolete(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *p = ref->next_in_ino; ref->next_in_ino = NULL; - if (ic->nodes == (void *)ic && ic->nlink == 0) - jffs2_del_ino_cache(c, ic); - - spin_unlock(&c->erase_completion_lock); - } - - - /* Merge with the next node in the physical list, if there is one - and if it's also obsolete and if it doesn't belong to any inode */ - if (ref->next_phys && ref_obsolete(ref->next_phys) && - !ref->next_phys->next_in_ino) { - struct jffs2_raw_node_ref *n = ref->next_phys; - - spin_lock(&c->erase_completion_lock); - - ref->__totlen += n->__totlen; - ref->next_phys = n->next_phys; - if (jeb->last_node == n) jeb->last_node = ref; - if (jeb->gc_node == n) { - /* gc will be happy continuing gc on this node */ - jeb->gc_node=ref; + switch (ic->class) { +#ifdef CONFIG_JFFS2_FS_XATTR + case RAWNODE_CLASS_XATTR_DATUM: + jffs2_release_xattr_datum(c, (struct jffs2_xattr_datum *)ic); + break; + case RAWNODE_CLASS_XATTR_REF: + jffs2_release_xattr_ref(c, (struct jffs2_xattr_ref *)ic); + break; +#endif + default: + if (ic->nodes == (void *)ic && ic->nlink == 0) + jffs2_del_ino_cache(c, ic); + break; } spin_unlock(&c->erase_completion_lock); - - jffs2_free_raw_node_ref(n); } - /* Also merge with the previous node in the list, if there is one - and that one is obsolete */ - if (ref != jeb->first_node ) { - struct jffs2_raw_node_ref *p = jeb->first_node; - - spin_lock(&c->erase_completion_lock); - - while (p->next_phys != ref) - p = p->next_phys; - - if (ref_obsolete(p) && !ref->next_in_ino) { - p->__totlen += ref->__totlen; - if (jeb->last_node == ref) { - jeb->last_node = p; - } - if (jeb->gc_node == ref) { - /* gc will be happy continuing gc on this node */ - jeb->gc_node=p; - } - p->next_phys = ref->next_phys; - jffs2_free_raw_node_ref(ref); - } - spin_unlock(&c->erase_completion_lock); - } out_erase_sem: up(&c->erase_free_sem); } diff --git a/fs/jffs2/os-linux.h b/fs/jffs2/os-linux.h index d307cf548..9f41fc01a 100644 --- a/fs/jffs2/os-linux.h +++ b/fs/jffs2/os-linux.h @@ -31,9 +31,7 @@ struct kvec; #define JFFS2_F_I_MODE(f) (OFNI_EDONI_2SFFJ(f)->i_mode) #define JFFS2_F_I_UID(f) (OFNI_EDONI_2SFFJ(f)->i_uid) #define JFFS2_F_I_GID(f) (OFNI_EDONI_2SFFJ(f)->i_gid) - -#define JFFS2_F_I_RDEV_MIN(f) (iminor(OFNI_EDONI_2SFFJ(f))) -#define JFFS2_F_I_RDEV_MAJ(f) (imajor(OFNI_EDONI_2SFFJ(f))) +#define JFFS2_F_I_RDEV(f) (OFNI_EDONI_2SFFJ(f)->i_rdev) #define ITIME(sec) ((struct timespec){sec, 0}) #define I_SEC(tv) ((tv).tv_sec) @@ -60,6 +58,10 @@ static inline void jffs2_init_inode_info(struct jffs2_inode_info *f) f->target = NULL; f->flags = 0; f->usercompr = 0; +#ifdef CONFIG_JFFS2_FS_POSIX_ACL + f->i_acl_access = JFFS2_ACL_NOT_CACHED; + f->i_acl_default = JFFS2_ACL_NOT_CACHED; +#endif } @@ -90,13 +92,10 @@ static inline void jffs2_init_inode_info(struct jffs2_inode_info *f) #define jffs2_flash_writev(a,b,c,d,e,f) jffs2_flash_direct_writev(a,b,c,d,e) #define jffs2_wbuf_timeout NULL #define jffs2_wbuf_process NULL -#define jffs2_nor_ecc(c) (0) #define jffs2_dataflash(c) (0) -#define jffs2_nor_wbuf_flash(c) (0) -#define jffs2_nor_ecc_flash_setup(c) (0) -#define jffs2_nor_ecc_flash_cleanup(c) do {} while (0) #define jffs2_dataflash_setup(c) (0) #define jffs2_dataflash_cleanup(c) do {} while (0) +#define jffs2_nor_wbuf_flash(c) (0) #define jffs2_nor_wbuf_flash_setup(c) (0) #define jffs2_nor_wbuf_flash_cleanup(c) do {} while (0) @@ -107,9 +106,7 @@ static inline void jffs2_init_inode_info(struct jffs2_inode_info *f) #ifdef CONFIG_JFFS2_SUMMARY #define jffs2_can_mark_obsolete(c) (0) #else -#define jffs2_can_mark_obsolete(c) \ - ((c->mtd->type == MTD_NORFLASH && !(c->mtd->flags & (MTD_ECC|MTD_PROGRAM_REGIONS))) || \ - c->mtd->type == MTD_RAM) +#define jffs2_can_mark_obsolete(c) (c->mtd->flags & (MTD_BIT_WRITEABLE)) #endif #define jffs2_cleanmarker_oob(c) (c->mtd->type == MTD_NANDFLASH) @@ -133,15 +130,11 @@ int jffs2_flush_wbuf_pad(struct jffs2_sb_info *c); int jffs2_nand_flash_setup(struct jffs2_sb_info *c); void jffs2_nand_flash_cleanup(struct jffs2_sb_info *c); -#define jffs2_nor_ecc(c) (c->mtd->type == MTD_NORFLASH && (c->mtd->flags & MTD_ECC)) -int jffs2_nor_ecc_flash_setup(struct jffs2_sb_info *c); -void jffs2_nor_ecc_flash_cleanup(struct jffs2_sb_info *c); - #define jffs2_dataflash(c) (c->mtd->type == MTD_DATAFLASH) int jffs2_dataflash_setup(struct jffs2_sb_info *c); void jffs2_dataflash_cleanup(struct jffs2_sb_info *c); -#define jffs2_nor_wbuf_flash(c) (c->mtd->type == MTD_NORFLASH && (c->mtd->flags & MTD_PROGRAM_REGIONS)) +#define jffs2_nor_wbuf_flash(c) (c->mtd->type == MTD_NORFLASH && ! (c->mtd->flags & MTD_BIT_WRITEABLE)) int jffs2_nor_wbuf_flash_setup(struct jffs2_sb_info *c); void jffs2_nor_wbuf_flash_cleanup(struct jffs2_sb_info *c); @@ -165,7 +158,7 @@ extern struct inode_operations jffs2_dir_inode_operations; /* file.c */ extern const struct file_operations jffs2_file_operations; extern struct inode_operations jffs2_file_inode_operations; -extern struct address_space_operations jffs2_file_address_operations; +extern const struct address_space_operations jffs2_file_address_operations; int jffs2_fsync(struct file *, struct dentry *, int); int jffs2_do_readpage_unlock (struct inode *inode, struct page *pg); @@ -182,7 +175,7 @@ void jffs2_clear_inode (struct inode *); void jffs2_dirty_inode(struct inode *inode); struct inode *jffs2_new_inode (struct inode *dir_i, int mode, struct jffs2_raw_inode *ri); -int jffs2_statfs (struct super_block *, struct kstatfs *); +int jffs2_statfs (struct dentry *, struct kstatfs *); void jffs2_write_super (struct super_block *); int jffs2_remount_fs (struct super_block *, int *, char *); int jffs2_do_fill_super(struct super_block *sb, void *data, int silent); diff --git a/fs/jffs2/readinode.c b/fs/jffs2/readinode.c index f1695642d..266423b27 100644 --- a/fs/jffs2/readinode.c +++ b/fs/jffs2/readinode.c @@ -66,7 +66,7 @@ static void jffs2_free_tmp_dnode_info_list(struct rb_root *list) jffs2_free_full_dnode(tn->fn); jffs2_free_tmp_dnode_info(tn); - this = this->rb_parent; + this = rb_parent(this); if (!this) break; @@ -116,19 +116,42 @@ static inline int read_direntry(struct jffs2_sb_info *c, struct jffs2_raw_node_r uint32_t *latest_mctime, uint32_t *mctime_ver) { struct jffs2_full_dirent *fd; + uint32_t crc; - /* The direntry nodes are checked during the flash scanning */ - BUG_ON(ref_flags(ref) == REF_UNCHECKED); /* Obsoleted. This cannot happen, surely? dwmw2 20020308 */ BUG_ON(ref_obsolete(ref)); - /* Sanity check */ - if (unlikely(PAD((rd->nsize + sizeof(*rd))) != PAD(je32_to_cpu(rd->totlen)))) { - JFFS2_ERROR("illegal nsize in node at %#08x: nsize %#02x, totlen %#04x\n", - ref_offset(ref), rd->nsize, je32_to_cpu(rd->totlen)); + crc = crc32(0, rd, sizeof(*rd) - 8); + if (unlikely(crc != je32_to_cpu(rd->node_crc))) { + JFFS2_NOTICE("header CRC failed on dirent node at %#08x: read %#08x, calculated %#08x\n", + ref_offset(ref), je32_to_cpu(rd->node_crc), crc); return 1; } + /* If we've never checked the CRCs on this node, check them now */ + if (ref_flags(ref) == REF_UNCHECKED) { + struct jffs2_eraseblock *jeb; + int len; + + /* Sanity check */ + if (unlikely(PAD((rd->nsize + sizeof(*rd))) != PAD(je32_to_cpu(rd->totlen)))) { + JFFS2_ERROR("illegal nsize in node at %#08x: nsize %#02x, totlen %#04x\n", + ref_offset(ref), rd->nsize, je32_to_cpu(rd->totlen)); + return 1; + } + + jeb = &c->blocks[ref->flash_offset / c->sector_size]; + len = ref_totlen(c, jeb, ref); + + spin_lock(&c->erase_completion_lock); + jeb->used_size += len; + jeb->unchecked_size -= len; + c->used_size += len; + c->unchecked_size -= len; + ref->flash_offset = ref_offset(ref) | REF_PRISTINE; + spin_unlock(&c->erase_completion_lock); + } + fd = jffs2_alloc_full_dirent(rd->nsize + 1); if (unlikely(!fd)) return -ENOMEM; @@ -198,13 +221,21 @@ static inline int read_dnode(struct jffs2_sb_info *c, struct jffs2_raw_node_ref struct jffs2_tmp_dnode_info *tn; uint32_t len, csize; int ret = 1; + uint32_t crc; /* Obsoleted. This cannot happen, surely? dwmw2 20020308 */ BUG_ON(ref_obsolete(ref)); + crc = crc32(0, rd, sizeof(*rd) - 8); + if (unlikely(crc != je32_to_cpu(rd->node_crc))) { + JFFS2_NOTICE("node CRC failed on dnode at %#08x: read %#08x, calculated %#08x\n", + ref_offset(ref), je32_to_cpu(rd->node_crc), crc); + return 1; + } + tn = jffs2_alloc_tmp_dnode_info(); if (!tn) { - JFFS2_ERROR("failed to allocate tn (%d bytes).\n", sizeof(*tn)); + JFFS2_ERROR("failed to allocate tn (%zu bytes).\n", sizeof(*tn)); return -ENOMEM; } @@ -213,14 +244,6 @@ static inline int read_dnode(struct jffs2_sb_info *c, struct jffs2_raw_node_ref /* If we've never checked the CRCs on this node, check them now */ if (ref_flags(ref) == REF_UNCHECKED) { - uint32_t crc; - - crc = crc32(0, rd, sizeof(*rd) - 8); - if (unlikely(crc != je32_to_cpu(rd->node_crc))) { - JFFS2_NOTICE("header CRC failed on node at %#08x: read %#08x, calculated %#08x\n", - ref_offset(ref), je32_to_cpu(rd->node_crc), crc); - goto free_out; - } /* Sanity checks */ if (unlikely(je32_to_cpu(rd->offset) > je32_to_cpu(rd->isize)) || @@ -343,7 +366,7 @@ free_out: * Helper function for jffs2_get_inode_nodes(). * It is called every time an unknown node is found. * - * Returns: 0 on succes; + * Returns: 0 on success; * 1 if the node should be marked obsolete; * negative error code on failure. */ @@ -354,37 +377,30 @@ static inline int read_unknown(struct jffs2_sb_info *c, struct jffs2_raw_node_re un->nodetype = cpu_to_je16(JFFS2_NODE_ACCURATE | je16_to_cpu(un->nodetype)); - if (crc32(0, un, sizeof(struct jffs2_unknown_node) - 4) != je32_to_cpu(un->hdr_crc)) { - /* Hmmm. This should have been caught at scan time. */ - JFFS2_NOTICE("node header CRC failed at %#08x. But it must have been OK earlier.\n", ref_offset(ref)); - jffs2_dbg_dump_node(c, ref_offset(ref)); - return 1; - } else { - switch(je16_to_cpu(un->nodetype) & JFFS2_COMPAT_MASK) { + switch(je16_to_cpu(un->nodetype) & JFFS2_COMPAT_MASK) { - case JFFS2_FEATURE_INCOMPAT: - JFFS2_ERROR("unknown INCOMPAT nodetype %#04X at %#08x\n", - je16_to_cpu(un->nodetype), ref_offset(ref)); - /* EEP */ - BUG(); - break; + case JFFS2_FEATURE_INCOMPAT: + JFFS2_ERROR("unknown INCOMPAT nodetype %#04X at %#08x\n", + je16_to_cpu(un->nodetype), ref_offset(ref)); + /* EEP */ + BUG(); + break; - case JFFS2_FEATURE_ROCOMPAT: - JFFS2_ERROR("unknown ROCOMPAT nodetype %#04X at %#08x\n", - je16_to_cpu(un->nodetype), ref_offset(ref)); - BUG_ON(!(c->flags & JFFS2_SB_FLAG_RO)); - break; + case JFFS2_FEATURE_ROCOMPAT: + JFFS2_ERROR("unknown ROCOMPAT nodetype %#04X at %#08x\n", + je16_to_cpu(un->nodetype), ref_offset(ref)); + BUG_ON(!(c->flags & JFFS2_SB_FLAG_RO)); + break; - case JFFS2_FEATURE_RWCOMPAT_COPY: - JFFS2_NOTICE("unknown RWCOMPAT_COPY nodetype %#04X at %#08x\n", - je16_to_cpu(un->nodetype), ref_offset(ref)); - break; + case JFFS2_FEATURE_RWCOMPAT_COPY: + JFFS2_NOTICE("unknown RWCOMPAT_COPY nodetype %#04X at %#08x\n", + je16_to_cpu(un->nodetype), ref_offset(ref)); + break; - case JFFS2_FEATURE_RWCOMPAT_DELETE: - JFFS2_NOTICE("unknown RWCOMPAT_DELETE nodetype %#04X at %#08x\n", - je16_to_cpu(un->nodetype), ref_offset(ref)); - return 1; - } + case JFFS2_FEATURE_RWCOMPAT_DELETE: + JFFS2_NOTICE("unknown RWCOMPAT_DELETE nodetype %#04X at %#08x\n", + je16_to_cpu(un->nodetype), ref_offset(ref)); + return 1; } return 0; @@ -434,7 +450,7 @@ static int read_more(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *ref, } if (retlen < len) { - JFFS2_ERROR("short read at %#08x: %d instead of %d.\n", + JFFS2_ERROR("short read at %#08x: %zu instead of %d.\n", offs, retlen, len); return -EIO; } @@ -542,13 +558,25 @@ static int jffs2_get_inode_nodes(struct jffs2_sb_info *c, struct jffs2_inode_inf } if (retlen < len) { - JFFS2_ERROR("short read at %#08x: %d instead of %d.\n", ref_offset(ref), retlen, len); + JFFS2_ERROR("short read at %#08x: %zu instead of %d.\n", ref_offset(ref), retlen, len); err = -EIO; goto free_out; } node = (union jffs2_node_union *)bufstart; + /* No need to mask in the valid bit; it shouldn't be invalid */ + if (je32_to_cpu(node->u.hdr_crc) != crc32(0, node, sizeof(node->u)-4)) { + JFFS2_NOTICE("Node header CRC failed at %#08x. {%04x,%04x,%08x,%08x}\n", + ref_offset(ref), je16_to_cpu(node->u.magic), + je16_to_cpu(node->u.nodetype), + je32_to_cpu(node->u.totlen), + je32_to_cpu(node->u.hdr_crc)); + jffs2_dbg_dump_node(c, ref_offset(ref)); + jffs2_mark_node_obsolete(c, ref); + goto cont; + } + switch (je16_to_cpu(node->u.nodetype)) { case JFFS2_NODETYPE_DIRENT: @@ -606,6 +634,7 @@ static int jffs2_get_inode_nodes(struct jffs2_sb_info *c, struct jffs2_inode_inf goto free_out; } + cont: spin_lock(&c->erase_completion_lock); } @@ -679,12 +708,12 @@ static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c, jffs2_mark_node_obsolete(c, fn->raw); BUG_ON(rb->rb_left); - if (rb->rb_parent && rb->rb_parent->rb_left == rb) { + if (rb_parent(rb) && rb_parent(rb)->rb_left == rb) { /* We were then left-hand child of our parent. We need * to move our own right-hand child into our place. */ repl_rb = rb->rb_right; if (repl_rb) - repl_rb->rb_parent = rb->rb_parent; + rb_set_parent(repl_rb, rb_parent(rb)); } else repl_rb = NULL; @@ -692,14 +721,14 @@ static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c, /* Remove the spent tn from the tree; don't bother rebalancing * but put our right-hand child in our own place. */ - if (tn->rb.rb_parent) { - if (tn->rb.rb_parent->rb_left == &tn->rb) - tn->rb.rb_parent->rb_left = repl_rb; - else if (tn->rb.rb_parent->rb_right == &tn->rb) - tn->rb.rb_parent->rb_right = repl_rb; + if (rb_parent(&tn->rb)) { + if (rb_parent(&tn->rb)->rb_left == &tn->rb) + rb_parent(&tn->rb)->rb_left = repl_rb; + else if (rb_parent(&tn->rb)->rb_right == &tn->rb) + rb_parent(&tn->rb)->rb_right = repl_rb; else BUG(); } else if (tn->rb.rb_right) - tn->rb.rb_right->rb_parent = NULL; + rb_set_parent(tn->rb.rb_right, NULL); jffs2_free_tmp_dnode_info(tn); if (ret) { @@ -939,6 +968,8 @@ void jffs2_do_clear_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f) struct jffs2_full_dirent *fd, *fds; int deleted; + jffs2_clear_acl(f); + jffs2_xattr_delete_inode(c, f->inocache); down(&f->sem); deleted = f->inocache && !f->inocache->nlink; diff --git a/fs/jffs2/scan.c b/fs/jffs2/scan.c index cf55b221f..e2413466d 100644 --- a/fs/jffs2/scan.c +++ b/fs/jffs2/scan.c @@ -65,6 +65,28 @@ static inline uint32_t EMPTY_SCAN_SIZE(uint32_t sector_size) { return DEFAULT_EMPTY_SCAN_SIZE; } +static int file_dirty(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb) +{ + int ret; + + if ((ret = jffs2_prealloc_raw_node_refs(c, jeb, 1))) + return ret; + if ((ret = jffs2_scan_dirty_space(c, jeb, jeb->free_size))) + return ret; + /* Turned wasted size into dirty, since we apparently + think it's recoverable now. */ + jeb->dirty_size += jeb->wasted_size; + c->dirty_size += jeb->wasted_size; + c->wasted_size -= jeb->wasted_size; + jeb->wasted_size = 0; + if (VERYDIRTY(c, jeb->dirty_size)) { + list_add(&jeb->list, &c->very_dirty_list); + } else { + list_add(&jeb->list, &c->dirty_list); + } + return 0; +} + int jffs2_scan_medium(struct jffs2_sb_info *c) { int i, ret; @@ -170,34 +192,20 @@ int jffs2_scan_medium(struct jffs2_sb_info *c) (!c->nextblock || c->nextblock->free_size < jeb->free_size)) { /* Better candidate for the next writes to go to */ if (c->nextblock) { - c->nextblock->dirty_size += c->nextblock->free_size + c->nextblock->wasted_size; - c->dirty_size += c->nextblock->free_size + c->nextblock->wasted_size; - c->free_size -= c->nextblock->free_size; - c->wasted_size -= c->nextblock->wasted_size; - c->nextblock->free_size = c->nextblock->wasted_size = 0; - if (VERYDIRTY(c, c->nextblock->dirty_size)) { - list_add(&c->nextblock->list, &c->very_dirty_list); - } else { - list_add(&c->nextblock->list, &c->dirty_list); - } + ret = file_dirty(c, c->nextblock); + if (ret) + return ret; /* deleting summary information of the old nextblock */ jffs2_sum_reset_collected(c->summary); } - /* update collected summary infromation for the current nextblock */ + /* update collected summary information for the current nextblock */ jffs2_sum_move_collected(c, s); D1(printk(KERN_DEBUG "jffs2_scan_medium(): new nextblock = 0x%08x\n", jeb->offset)); c->nextblock = jeb; } else { - jeb->dirty_size += jeb->free_size + jeb->wasted_size; - c->dirty_size += jeb->free_size + jeb->wasted_size; - c->free_size -= jeb->free_size; - c->wasted_size -= jeb->wasted_size; - jeb->free_size = jeb->wasted_size = 0; - if (VERYDIRTY(c, jeb->dirty_size)) { - list_add(&jeb->list, &c->very_dirty_list); - } else { - list_add(&jeb->list, &c->dirty_list); - } + ret = file_dirty(c, jeb); + if (ret) + return ret; } break; @@ -222,9 +230,6 @@ int jffs2_scan_medium(struct jffs2_sb_info *c) } } - if (jffs2_sum_active() && s) - kfree(s); - /* Nextblock dirty is always seen as wasted, because we cannot recycle it now */ if (c->nextblock && (c->nextblock->dirty_size)) { c->nextblock->wasted_size += c->nextblock->dirty_size; @@ -242,11 +247,8 @@ int jffs2_scan_medium(struct jffs2_sb_info *c) D1(printk(KERN_DEBUG "jffs2_scan_medium(): Skipping %d bytes in nextblock to ensure page alignment\n", skip)); - c->nextblock->wasted_size += skip; - c->wasted_size += skip; - - c->nextblock->free_size -= skip; - c->free_size -= skip; + jffs2_prealloc_raw_node_refs(c, c->nextblock, 1); + jffs2_scan_dirty_space(c, c->nextblock, skip); } #endif if (c->nr_erasing_blocks) { @@ -266,11 +268,14 @@ int jffs2_scan_medium(struct jffs2_sb_info *c) else c->mtd->unpoint(c->mtd, flashbuf, 0, c->mtd->size); #endif + if (s) + kfree(s); + return ret; } -int jffs2_fill_scan_buf (struct jffs2_sb_info *c, void *buf, - uint32_t ofs, uint32_t len) +static int jffs2_fill_scan_buf(struct jffs2_sb_info *c, void *buf, + uint32_t ofs, uint32_t len) { int ret; size_t retlen; @@ -290,7 +295,7 @@ int jffs2_fill_scan_buf (struct jffs2_sb_info *c, void *buf, int jffs2_scan_classify_jeb(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb) { if ((jeb->used_size + jeb->unchecked_size) == PAD(c->cleanmarker_size) && !jeb->dirty_size - && (!jeb->first_node || !jeb->first_node->next_phys) ) + && (!jeb->first_node || !ref_next(jeb->first_node)) ) return BLK_STATE_CLEANMARKER; /* move blocks with max 4 byte dirty space to cleanlist */ @@ -306,11 +311,126 @@ int jffs2_scan_classify_jeb(struct jffs2_sb_info *c, struct jffs2_eraseblock *je return BLK_STATE_ALLDIRTY; } +#ifdef CONFIG_JFFS2_FS_XATTR +static int jffs2_scan_xattr_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, + struct jffs2_raw_xattr *rx, uint32_t ofs, + struct jffs2_summary *s) +{ + struct jffs2_xattr_datum *xd; + uint32_t xid, version, totlen, crc; + int err; + + crc = crc32(0, rx, sizeof(struct jffs2_raw_xattr) - 4); + if (crc != je32_to_cpu(rx->node_crc)) { + JFFS2_WARNING("node CRC failed at %#08x, read=%#08x, calc=%#08x\n", + ofs, je32_to_cpu(rx->node_crc), crc); + if ((err = jffs2_scan_dirty_space(c, jeb, je32_to_cpu(rx->totlen)))) + return err; + return 0; + } + + xid = je32_to_cpu(rx->xid); + version = je32_to_cpu(rx->version); + + totlen = PAD(sizeof(struct jffs2_raw_xattr) + + rx->name_len + 1 + je16_to_cpu(rx->value_len)); + if (totlen != je32_to_cpu(rx->totlen)) { + JFFS2_WARNING("node length mismatch at %#08x, read=%u, calc=%u\n", + ofs, je32_to_cpu(rx->totlen), totlen); + if ((err = jffs2_scan_dirty_space(c, jeb, je32_to_cpu(rx->totlen)))) + return err; + return 0; + } + + xd = jffs2_setup_xattr_datum(c, xid, version); + if (IS_ERR(xd)) + return PTR_ERR(xd); + + if (xd->version > version) { + struct jffs2_raw_node_ref *raw + = jffs2_link_node_ref(c, jeb, ofs | REF_PRISTINE, totlen, NULL); + raw->next_in_ino = xd->node->next_in_ino; + xd->node->next_in_ino = raw; + } else { + xd->version = version; + xd->xprefix = rx->xprefix; + xd->name_len = rx->name_len; + xd->value_len = je16_to_cpu(rx->value_len); + xd->data_crc = je32_to_cpu(rx->data_crc); + + jffs2_link_node_ref(c, jeb, ofs | REF_PRISTINE, totlen, (void *)xd); + } + + if (jffs2_sum_active()) + jffs2_sum_add_xattr_mem(s, rx, ofs - jeb->offset); + dbg_xattr("scaning xdatum at %#08x (xid=%u, version=%u)\n", + ofs, xd->xid, xd->version); + return 0; +} + +static int jffs2_scan_xref_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, + struct jffs2_raw_xref *rr, uint32_t ofs, + struct jffs2_summary *s) +{ + struct jffs2_xattr_ref *ref; + uint32_t crc; + int err; + + crc = crc32(0, rr, sizeof(*rr) - 4); + if (crc != je32_to_cpu(rr->node_crc)) { + JFFS2_WARNING("node CRC failed at %#08x, read=%#08x, calc=%#08x\n", + ofs, je32_to_cpu(rr->node_crc), crc); + if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(rr->totlen))))) + return err; + return 0; + } + + if (PAD(sizeof(struct jffs2_raw_xref)) != je32_to_cpu(rr->totlen)) { + JFFS2_WARNING("node length mismatch at %#08x, read=%u, calc=%zd\n", + ofs, je32_to_cpu(rr->totlen), + PAD(sizeof(struct jffs2_raw_xref))); + if ((err = jffs2_scan_dirty_space(c, jeb, je32_to_cpu(rr->totlen)))) + return err; + return 0; + } + + ref = jffs2_alloc_xattr_ref(); + if (!ref) + return -ENOMEM; + + /* BEFORE jffs2_build_xattr_subsystem() called, + * and AFTER xattr_ref is marked as a dead xref, + * ref->xid is used to store 32bit xid, xd is not used + * ref->ino is used to store 32bit inode-number, ic is not used + * Thoes variables are declared as union, thus using those + * are exclusive. In a similar way, ref->next is temporarily + * used to chain all xattr_ref object. It's re-chained to + * jffs2_inode_cache in jffs2_build_xattr_subsystem() correctly. + */ + ref->ino = je32_to_cpu(rr->ino); + ref->xid = je32_to_cpu(rr->xid); + ref->xseqno = je32_to_cpu(rr->xseqno); + if (ref->xseqno > c->highest_xseqno) + c->highest_xseqno = (ref->xseqno & ~XREF_DELETE_MARKER); + ref->next = c->xref_temp; + c->xref_temp = ref; + + jffs2_link_node_ref(c, jeb, ofs | REF_PRISTINE, PAD(je32_to_cpu(rr->totlen)), (void *)ref); + + if (jffs2_sum_active()) + jffs2_sum_add_xref_mem(s, rr, ofs - jeb->offset); + dbg_xattr("scan xref at %#08x (xid=%u, ino=%u)\n", + ofs, ref->xid, ref->ino); + return 0; +} +#endif + +/* Called with 'buf_size == 0' if buf is in fact a pointer _directly_ into + the flash, XIP-style */ static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, - unsigned char *buf, uint32_t buf_size, struct jffs2_summary *s) { + unsigned char *buf, uint32_t buf_size, struct jffs2_summary *s) { struct jffs2_unknown_node *node; struct jffs2_unknown_node crcnode; - struct jffs2_sum_marker *sm; uint32_t ofs, prevofs; uint32_t hdr_crc, buf_ofs, buf_len; int err; @@ -344,44 +464,75 @@ static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblo #endif if (jffs2_sum_active()) { - sm = kmalloc(sizeof(struct jffs2_sum_marker), GFP_KERNEL); - if (!sm) { - return -ENOMEM; - } - - err = jffs2_fill_scan_buf(c, (unsigned char *) sm, jeb->offset + c->sector_size - - sizeof(struct jffs2_sum_marker), sizeof(struct jffs2_sum_marker)); - if (err) { - kfree(sm); - return err; - } - - if (je32_to_cpu(sm->magic) == JFFS2_SUM_MAGIC ) { - err = jffs2_sum_scan_sumnode(c, jeb, je32_to_cpu(sm->offset), &pseudo_random); - if (err) { - kfree(sm); + struct jffs2_sum_marker *sm; + void *sumptr = NULL; + uint32_t sumlen; + + if (!buf_size) { + /* XIP case. Just look, point at the summary if it's there */ + sm = (void *)buf + c->sector_size - sizeof(*sm); + if (je32_to_cpu(sm->magic) == JFFS2_SUM_MAGIC) { + sumptr = buf + je32_to_cpu(sm->offset); + sumlen = c->sector_size - je32_to_cpu(sm->offset); + } + } else { + /* If NAND flash, read a whole page of it. Else just the end */ + if (c->wbuf_pagesize) + buf_len = c->wbuf_pagesize; + else + buf_len = sizeof(*sm); + + /* Read as much as we want into the _end_ of the preallocated buffer */ + err = jffs2_fill_scan_buf(c, buf + buf_size - buf_len, + jeb->offset + c->sector_size - buf_len, + buf_len); + if (err) return err; + + sm = (void *)buf + buf_size - sizeof(*sm); + if (je32_to_cpu(sm->magic) == JFFS2_SUM_MAGIC) { + sumlen = c->sector_size - je32_to_cpu(sm->offset); + sumptr = buf + buf_size - sumlen; + + /* Now, make sure the summary itself is available */ + if (sumlen > buf_size) { + /* Need to kmalloc for this. */ + sumptr = kmalloc(sumlen, GFP_KERNEL); + if (!sumptr) + return -ENOMEM; + memcpy(sumptr + sumlen - buf_len, buf + buf_size - buf_len, buf_len); + } + if (buf_len < sumlen) { + /* Need to read more so that the entire summary node is present */ + err = jffs2_fill_scan_buf(c, sumptr, + jeb->offset + c->sector_size - sumlen, + sumlen - buf_len); + if (err) + return err; + } } + } - kfree(sm); + if (sumptr) { + err = jffs2_sum_scan_sumnode(c, jeb, sumptr, sumlen, &pseudo_random); - ofs = jeb->offset; - prevofs = jeb->offset - 1; + if (buf_size && sumlen > buf_size) + kfree(sumptr); + /* If it returns with a real error, bail. + If it returns positive, that's a block classification + (i.e. BLK_STATE_xxx) so return that too. + If it returns zero, fall through to full scan. */ + if (err) + return err; + } } buf_ofs = jeb->offset; if (!buf_size) { + /* This is the XIP case -- we're reading _directly_ from the flash chip */ buf_len = c->sector_size; - - if (jffs2_sum_active()) { - /* must reread because of summary test */ - err = jffs2_fill_scan_buf(c, buf, buf_ofs, buf_len); - if (err) - return err; - } - } else { buf_len = EMPTY_SCAN_SIZE(c->sector_size); err = jffs2_fill_scan_buf(c, buf, buf_ofs, buf_len); @@ -418,7 +569,10 @@ static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblo if (ofs) { D1(printk(KERN_DEBUG "Free space at %08x ends at %08x\n", jeb->offset, jeb->offset + ofs)); - DIRTY_SPACE(ofs); + if ((err = jffs2_prealloc_raw_node_refs(c, jeb, 1))) + return err; + if ((err = jffs2_scan_dirty_space(c, jeb, ofs))) + return err; } /* Now ofs is a complete physical flash offset as it always was... */ @@ -433,6 +587,11 @@ scan_more: jffs2_dbg_acct_paranoia_check_nolock(c, jeb); + /* Make sure there are node refs available for use */ + err = jffs2_prealloc_raw_node_refs(c, jeb, 2); + if (err) + return err; + cond_resched(); if (ofs & 3) { @@ -442,7 +601,8 @@ scan_more: } if (ofs == prevofs) { printk(KERN_WARNING "ofs 0x%08x has already been seen. Skipping\n", ofs); - DIRTY_SPACE(4); + if ((err = jffs2_scan_dirty_space(c, jeb, 4))) + return err; ofs += 4; continue; } @@ -451,7 +611,8 @@ scan_more: if (jeb->offset + c->sector_size < ofs + sizeof(*node)) { D1(printk(KERN_DEBUG "Fewer than %zd bytes left to end of block. (%x+%x<%x+%zx) Not reading\n", sizeof(struct jffs2_unknown_node), jeb->offset, c->sector_size, ofs, sizeof(*node))); - DIRTY_SPACE((jeb->offset + c->sector_size)-ofs); + if ((err = jffs2_scan_dirty_space(c, jeb, (jeb->offset + c->sector_size)-ofs))) + return err; break; } @@ -481,7 +642,8 @@ scan_more: if (*(uint32_t *)(&buf[inbuf_ofs]) != 0xffffffff) { printk(KERN_WARNING "Empty flash at 0x%08x ends at 0x%08x\n", empty_start, ofs); - DIRTY_SPACE(ofs-empty_start); + if ((err = jffs2_scan_dirty_space(c, jeb, ofs-empty_start))) + return err; goto scan_more; } @@ -494,7 +656,7 @@ scan_more: /* If we're only checking the beginning of a block with a cleanmarker, bail now */ if (buf_ofs == jeb->offset && jeb->used_size == PAD(c->cleanmarker_size) && - c->cleanmarker_size && !jeb->dirty_size && !jeb->first_node->next_phys) { + c->cleanmarker_size && !jeb->dirty_size && !ref_next(jeb->first_node)) { D1(printk(KERN_DEBUG "%d bytes at start of block seems clean... assuming all clean\n", EMPTY_SCAN_SIZE(c->sector_size))); return BLK_STATE_CLEANMARKER; } @@ -518,20 +680,23 @@ scan_more: if (ofs == jeb->offset && je16_to_cpu(node->magic) == KSAMTIB_CIGAM_2SFFJ) { printk(KERN_WARNING "Magic bitmask is backwards at offset 0x%08x. Wrong endian filesystem?\n", ofs); - DIRTY_SPACE(4); + if ((err = jffs2_scan_dirty_space(c, jeb, 4))) + return err; ofs += 4; continue; } if (je16_to_cpu(node->magic) == JFFS2_DIRTY_BITMASK) { D1(printk(KERN_DEBUG "Dirty bitmask at 0x%08x\n", ofs)); - DIRTY_SPACE(4); + if ((err = jffs2_scan_dirty_space(c, jeb, 4))) + return err; ofs += 4; continue; } if (je16_to_cpu(node->magic) == JFFS2_OLD_MAGIC_BITMASK) { printk(KERN_WARNING "Old JFFS2 bitmask found at 0x%08x\n", ofs); printk(KERN_WARNING "You cannot use older JFFS2 filesystems with newer kernels\n"); - DIRTY_SPACE(4); + if ((err = jffs2_scan_dirty_space(c, jeb, 4))) + return err; ofs += 4; continue; } @@ -540,7 +705,8 @@ scan_more: noisy_printk(&noise, "jffs2_scan_eraseblock(): Magic bitmask 0x%04x not found at 0x%08x: 0x%04x instead\n", JFFS2_MAGIC_BITMASK, ofs, je16_to_cpu(node->magic)); - DIRTY_SPACE(4); + if ((err = jffs2_scan_dirty_space(c, jeb, 4))) + return err; ofs += 4; continue; } @@ -557,7 +723,8 @@ scan_more: je32_to_cpu(node->totlen), je32_to_cpu(node->hdr_crc), hdr_crc); - DIRTY_SPACE(4); + if ((err = jffs2_scan_dirty_space(c, jeb, 4))) + return err; ofs += 4; continue; } @@ -568,7 +735,8 @@ scan_more: printk(KERN_WARNING "Node at 0x%08x with length 0x%08x would run over the end of the erase block\n", ofs, je32_to_cpu(node->totlen)); printk(KERN_WARNING "Perhaps the file system was created with the wrong erase size?\n"); - DIRTY_SPACE(4); + if ((err = jffs2_scan_dirty_space(c, jeb, 4))) + return err; ofs += 4; continue; } @@ -576,7 +744,8 @@ scan_more: if (!(je16_to_cpu(node->nodetype) & JFFS2_NODE_ACCURATE)) { /* Wheee. This is an obsoleted node */ D2(printk(KERN_DEBUG "Node at 0x%08x is obsolete. Skipping\n", ofs)); - DIRTY_SPACE(PAD(je32_to_cpu(node->totlen))); + if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(node->totlen))))) + return err; ofs += PAD(je32_to_cpu(node->totlen)); continue; } @@ -614,30 +783,59 @@ scan_more: ofs += PAD(je32_to_cpu(node->totlen)); break; +#ifdef CONFIG_JFFS2_FS_XATTR + case JFFS2_NODETYPE_XATTR: + if (buf_ofs + buf_len < ofs + je32_to_cpu(node->totlen)) { + buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs); + D1(printk(KERN_DEBUG "Fewer than %d bytes (xattr node)" + " left to end of buf. Reading 0x%x at 0x%08x\n", + je32_to_cpu(node->totlen), buf_len, ofs)); + err = jffs2_fill_scan_buf(c, buf, ofs, buf_len); + if (err) + return err; + buf_ofs = ofs; + node = (void *)buf; + } + err = jffs2_scan_xattr_node(c, jeb, (void *)node, ofs, s); + if (err) + return err; + ofs += PAD(je32_to_cpu(node->totlen)); + break; + case JFFS2_NODETYPE_XREF: + if (buf_ofs + buf_len < ofs + je32_to_cpu(node->totlen)) { + buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs); + D1(printk(KERN_DEBUG "Fewer than %d bytes (xref node)" + " left to end of buf. Reading 0x%x at 0x%08x\n", + je32_to_cpu(node->totlen), buf_len, ofs)); + err = jffs2_fill_scan_buf(c, buf, ofs, buf_len); + if (err) + return err; + buf_ofs = ofs; + node = (void *)buf; + } + err = jffs2_scan_xref_node(c, jeb, (void *)node, ofs, s); + if (err) + return err; + ofs += PAD(je32_to_cpu(node->totlen)); + break; +#endif /* CONFIG_JFFS2_FS_XATTR */ + case JFFS2_NODETYPE_CLEANMARKER: D1(printk(KERN_DEBUG "CLEANMARKER node found at 0x%08x\n", ofs)); if (je32_to_cpu(node->totlen) != c->cleanmarker_size) { printk(KERN_NOTICE "CLEANMARKER node found at 0x%08x has totlen 0x%x != normal 0x%x\n", ofs, je32_to_cpu(node->totlen), c->cleanmarker_size); - DIRTY_SPACE(PAD(sizeof(struct jffs2_unknown_node))); + if ((err = jffs2_scan_dirty_space(c, jeb, PAD(sizeof(struct jffs2_unknown_node))))) + return err; ofs += PAD(sizeof(struct jffs2_unknown_node)); } else if (jeb->first_node) { printk(KERN_NOTICE "CLEANMARKER node found at 0x%08x, not first node in block (0x%08x)\n", ofs, jeb->offset); - DIRTY_SPACE(PAD(sizeof(struct jffs2_unknown_node))); + if ((err = jffs2_scan_dirty_space(c, jeb, PAD(sizeof(struct jffs2_unknown_node))))) + return err; ofs += PAD(sizeof(struct jffs2_unknown_node)); } else { - struct jffs2_raw_node_ref *marker_ref = jffs2_alloc_raw_node_ref(); - if (!marker_ref) { - printk(KERN_NOTICE "Failed to allocate node ref for clean marker\n"); - return -ENOMEM; - } - marker_ref->next_in_ino = NULL; - marker_ref->next_phys = NULL; - marker_ref->flash_offset = ofs | REF_NORMAL; - marker_ref->__totlen = c->cleanmarker_size; - jeb->first_node = jeb->last_node = marker_ref; + jffs2_link_node_ref(c, jeb, ofs | REF_NORMAL, c->cleanmarker_size, NULL); - USED_SPACE(PAD(c->cleanmarker_size)); ofs += PAD(c->cleanmarker_size); } break; @@ -645,7 +843,8 @@ scan_more: case JFFS2_NODETYPE_PADDING: if (jffs2_sum_active()) jffs2_sum_add_padding_mem(s, je32_to_cpu(node->totlen)); - DIRTY_SPACE(PAD(je32_to_cpu(node->totlen))); + if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(node->totlen))))) + return err; ofs += PAD(je32_to_cpu(node->totlen)); break; @@ -656,7 +855,8 @@ scan_more: c->flags |= JFFS2_SB_FLAG_RO; if (!(jffs2_is_readonly(c))) return -EROFS; - DIRTY_SPACE(PAD(je32_to_cpu(node->totlen))); + if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(node->totlen))))) + return err; ofs += PAD(je32_to_cpu(node->totlen)); break; @@ -666,15 +866,21 @@ scan_more: case JFFS2_FEATURE_RWCOMPAT_DELETE: D1(printk(KERN_NOTICE "Unknown but compatible feature node (0x%04x) found at offset 0x%08x\n", je16_to_cpu(node->nodetype), ofs)); - DIRTY_SPACE(PAD(je32_to_cpu(node->totlen))); + if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(node->totlen))))) + return err; ofs += PAD(je32_to_cpu(node->totlen)); break; - case JFFS2_FEATURE_RWCOMPAT_COPY: + case JFFS2_FEATURE_RWCOMPAT_COPY: { D1(printk(KERN_NOTICE "Unknown but compatible feature node (0x%04x) found at offset 0x%08x\n", je16_to_cpu(node->nodetype), ofs)); - USED_SPACE(PAD(je32_to_cpu(node->totlen))); + + jffs2_link_node_ref(c, jeb, ofs | REF_PRISTINE, PAD(je32_to_cpu(node->totlen)), NULL); + + /* We can't summarise nodes we don't grok */ + jffs2_sum_disable_collecting(s); ofs += PAD(je32_to_cpu(node->totlen)); break; + } } } } @@ -687,9 +893,9 @@ scan_more: } } - D1(printk(KERN_DEBUG "Block at 0x%08x: free 0x%08x, dirty 0x%08x, unchecked 0x%08x, used 0x%08x\n", jeb->offset, - jeb->free_size, jeb->dirty_size, jeb->unchecked_size, jeb->used_size)); - + D1(printk(KERN_DEBUG "Block at 0x%08x: free 0x%08x, dirty 0x%08x, unchecked 0x%08x, used 0x%08x, wasted 0x%08x\n", + jeb->offset,jeb->free_size, jeb->dirty_size, jeb->unchecked_size, jeb->used_size, jeb->wasted_size)); + /* mark_node_obsolete can add to wasted !! */ if (jeb->wasted_size) { jeb->dirty_size += jeb->wasted_size; @@ -730,9 +936,9 @@ struct jffs2_inode_cache *jffs2_scan_make_ino_cache(struct jffs2_sb_info *c, uin static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, struct jffs2_raw_inode *ri, uint32_t ofs, struct jffs2_summary *s) { - struct jffs2_raw_node_ref *raw; struct jffs2_inode_cache *ic; uint32_t ino = je32_to_cpu(ri->ino); + int err; D1(printk(KERN_DEBUG "jffs2_scan_inode_node(): Node at 0x%08x\n", ofs)); @@ -745,12 +951,6 @@ static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_erasebloc Which means that the _full_ amount of time to get to proper write mode with GC operational may actually be _longer_ than before. Sucks to be me. */ - raw = jffs2_alloc_raw_node_ref(); - if (!raw) { - printk(KERN_NOTICE "jffs2_scan_inode_node(): allocation of node reference failed\n"); - return -ENOMEM; - } - ic = jffs2_get_ino_cache(c, ino); if (!ic) { /* Inocache get failed. Either we read a bogus ino# or it's just genuinely the @@ -762,30 +962,17 @@ static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_erasebloc printk(KERN_NOTICE "jffs2_scan_inode_node(): CRC failed on node at 0x%08x: Read 0x%08x, calculated 0x%08x\n", ofs, je32_to_cpu(ri->node_crc), crc); /* We believe totlen because the CRC on the node _header_ was OK, just the node itself failed. */ - DIRTY_SPACE(PAD(je32_to_cpu(ri->totlen))); - jffs2_free_raw_node_ref(raw); + if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(ri->totlen))))) + return err; return 0; } ic = jffs2_scan_make_ino_cache(c, ino); - if (!ic) { - jffs2_free_raw_node_ref(raw); + if (!ic) return -ENOMEM; - } } /* Wheee. It worked */ - - raw->flash_offset = ofs | REF_UNCHECKED; - raw->__totlen = PAD(je32_to_cpu(ri->totlen)); - raw->next_phys = NULL; - raw->next_in_ino = ic->nodes; - - ic->nodes = raw; - if (!jeb->first_node) - jeb->first_node = raw; - if (jeb->last_node) - jeb->last_node->next_phys = raw; - jeb->last_node = raw; + jffs2_link_node_ref(c, jeb, ofs | REF_UNCHECKED, PAD(je32_to_cpu(ri->totlen)), ic); D1(printk(KERN_DEBUG "Node is ino #%u, version %d. Range 0x%x-0x%x\n", je32_to_cpu(ri->ino), je32_to_cpu(ri->version), @@ -794,8 +981,6 @@ static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_erasebloc pseudo_random += je32_to_cpu(ri->version); - UNCHECKED_SPACE(PAD(je32_to_cpu(ri->totlen))); - if (jffs2_sum_active()) { jffs2_sum_add_inode_mem(s, ri, ofs - jeb->offset); } @@ -806,10 +991,10 @@ static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_erasebloc static int jffs2_scan_dirent_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, struct jffs2_raw_dirent *rd, uint32_t ofs, struct jffs2_summary *s) { - struct jffs2_raw_node_ref *raw; struct jffs2_full_dirent *fd; struct jffs2_inode_cache *ic; uint32_t crc; + int err; D1(printk(KERN_DEBUG "jffs2_scan_dirent_node(): Node at 0x%08x\n", ofs)); @@ -821,7 +1006,8 @@ static int jffs2_scan_dirent_node(struct jffs2_sb_info *c, struct jffs2_eraseblo printk(KERN_NOTICE "jffs2_scan_dirent_node(): Node CRC failed on node at 0x%08x: Read 0x%08x, calculated 0x%08x\n", ofs, je32_to_cpu(rd->node_crc), crc); /* We believe totlen because the CRC on the node _header_ was OK, just the node itself failed. */ - DIRTY_SPACE(PAD(je32_to_cpu(rd->totlen))); + if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(rd->totlen))))) + return err; return 0; } @@ -842,40 +1028,23 @@ static int jffs2_scan_dirent_node(struct jffs2_sb_info *c, struct jffs2_eraseblo jffs2_free_full_dirent(fd); /* FIXME: Why do we believe totlen? */ /* We believe totlen because the CRC on the node _header_ was OK, just the name failed. */ - DIRTY_SPACE(PAD(je32_to_cpu(rd->totlen))); + if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(rd->totlen))))) + return err; return 0; } - raw = jffs2_alloc_raw_node_ref(); - if (!raw) { - jffs2_free_full_dirent(fd); - printk(KERN_NOTICE "jffs2_scan_dirent_node(): allocation of node reference failed\n"); - return -ENOMEM; - } ic = jffs2_scan_make_ino_cache(c, je32_to_cpu(rd->pino)); if (!ic) { jffs2_free_full_dirent(fd); - jffs2_free_raw_node_ref(raw); return -ENOMEM; } - raw->__totlen = PAD(je32_to_cpu(rd->totlen)); - raw->flash_offset = ofs | REF_PRISTINE; - raw->next_phys = NULL; - raw->next_in_ino = ic->nodes; - ic->nodes = raw; - if (!jeb->first_node) - jeb->first_node = raw; - if (jeb->last_node) - jeb->last_node->next_phys = raw; - jeb->last_node = raw; + fd->raw = jffs2_link_node_ref(c, jeb, ofs | REF_PRISTINE, PAD(je32_to_cpu(rd->totlen)), ic); - fd->raw = raw; fd->next = NULL; fd->version = je32_to_cpu(rd->version); fd->ino = je32_to_cpu(rd->ino); fd->nhash = full_name_hash(fd->name, rd->nsize); fd->type = rd->type; - USED_SPACE(PAD(je32_to_cpu(rd->totlen))); jffs2_add_fd_to_list(c, fd, &ic->scan_dents); if (jffs2_sum_active()) { diff --git a/fs/jffs2/summary.c b/fs/jffs2/summary.c index fb9cec61f..e52cef526 100644 --- a/fs/jffs2/summary.c +++ b/fs/jffs2/summary.c @@ -5,6 +5,7 @@ * Zoltan Sogor , * Patrik Kluba , * University of Szeged, Hungary + * 2006 KaiGai Kohei * * For licensing information, see the file 'LICENCE' in this directory. * @@ -42,7 +43,7 @@ int jffs2_sum_init(struct jffs2_sb_info *c) return -ENOMEM; } - dbg_summary("returned succesfully\n"); + dbg_summary("returned successfully\n"); return 0; } @@ -81,6 +82,19 @@ static int jffs2_sum_add_mem(struct jffs2_summary *s, union jffs2_sum_mem *item) dbg_summary("dirent (%u) added to summary\n", je32_to_cpu(item->d.ino)); break; +#ifdef CONFIG_JFFS2_FS_XATTR + case JFFS2_NODETYPE_XATTR: + s->sum_size += JFFS2_SUMMARY_XATTR_SIZE; + s->sum_num++; + dbg_summary("xattr (xid=%u, version=%u) added to summary\n", + je32_to_cpu(item->x.xid), je32_to_cpu(item->x.version)); + break; + case JFFS2_NODETYPE_XREF: + s->sum_size += JFFS2_SUMMARY_XREF_SIZE; + s->sum_num++; + dbg_summary("xref added to summary\n"); + break; +#endif default: JFFS2_WARNING("UNKNOWN node type %u\n", je16_to_cpu(item->u.nodetype)); @@ -141,6 +155,40 @@ int jffs2_sum_add_dirent_mem(struct jffs2_summary *s, struct jffs2_raw_dirent *r return jffs2_sum_add_mem(s, (union jffs2_sum_mem *)temp); } +#ifdef CONFIG_JFFS2_FS_XATTR +int jffs2_sum_add_xattr_mem(struct jffs2_summary *s, struct jffs2_raw_xattr *rx, uint32_t ofs) +{ + struct jffs2_sum_xattr_mem *temp; + + temp = kmalloc(sizeof(struct jffs2_sum_xattr_mem), GFP_KERNEL); + if (!temp) + return -ENOMEM; + + temp->nodetype = rx->nodetype; + temp->xid = rx->xid; + temp->version = rx->version; + temp->offset = cpu_to_je32(ofs); + temp->totlen = rx->totlen; + temp->next = NULL; + + return jffs2_sum_add_mem(s, (union jffs2_sum_mem *)temp); +} + +int jffs2_sum_add_xref_mem(struct jffs2_summary *s, struct jffs2_raw_xref *rr, uint32_t ofs) +{ + struct jffs2_sum_xref_mem *temp; + + temp = kmalloc(sizeof(struct jffs2_sum_xref_mem), GFP_KERNEL); + if (!temp) + return -ENOMEM; + + temp->nodetype = rr->nodetype; + temp->offset = cpu_to_je32(ofs); + temp->next = NULL; + + return jffs2_sum_add_mem(s, (union jffs2_sum_mem *)temp); +} +#endif /* Cleanup every collected summary information */ static void jffs2_sum_clean_collected(struct jffs2_summary *s) @@ -204,6 +252,11 @@ int jffs2_sum_add_kvec(struct jffs2_sb_info *c, const struct kvec *invecs, union jffs2_node_union *node; struct jffs2_eraseblock *jeb; + if (c->summary->sum_size == JFFS2_SUMMARY_NOSUM_SIZE) { + dbg_summary("Summary is disabled for this jeb! Skipping summary info!\n"); + return 0; + } + node = invecs[0].iov_base; jeb = &c->blocks[ofs / c->sector_size]; ofs -= jeb->offset; @@ -259,7 +312,34 @@ int jffs2_sum_add_kvec(struct jffs2_sb_info *c, const struct kvec *invecs, return jffs2_sum_add_mem(c->summary, (union jffs2_sum_mem *)temp); } +#ifdef CONFIG_JFFS2_FS_XATTR + case JFFS2_NODETYPE_XATTR: { + struct jffs2_sum_xattr_mem *temp; + temp = kmalloc(sizeof(struct jffs2_sum_xattr_mem), GFP_KERNEL); + if (!temp) + goto no_mem; + + temp->nodetype = node->x.nodetype; + temp->xid = node->x.xid; + temp->version = node->x.version; + temp->totlen = node->x.totlen; + temp->offset = cpu_to_je32(ofs); + temp->next = NULL; + + return jffs2_sum_add_mem(c->summary, (union jffs2_sum_mem *)temp); + } + case JFFS2_NODETYPE_XREF: { + struct jffs2_sum_xref_mem *temp; + temp = kmalloc(sizeof(struct jffs2_sum_xref_mem), GFP_KERNEL); + if (!temp) + goto no_mem; + temp->nodetype = node->r.nodetype; + temp->offset = cpu_to_je32(ofs); + temp->next = NULL; + return jffs2_sum_add_mem(c->summary, (union jffs2_sum_mem *)temp); + } +#endif case JFFS2_NODETYPE_PADDING: dbg_summary("node PADDING\n"); c->summary->sum_padded += je32_to_cpu(node->u.totlen); @@ -288,23 +368,41 @@ no_mem: return -ENOMEM; } +static struct jffs2_raw_node_ref *sum_link_node_ref(struct jffs2_sb_info *c, + struct jffs2_eraseblock *jeb, + uint32_t ofs, uint32_t len, + struct jffs2_inode_cache *ic) +{ + /* If there was a gap, mark it dirty */ + if ((ofs & ~3) > c->sector_size - jeb->free_size) { + /* Ew. Summary doesn't actually tell us explicitly about dirty space */ + jffs2_scan_dirty_space(c, jeb, (ofs & ~3) - (c->sector_size - jeb->free_size)); + } + + return jffs2_link_node_ref(c, jeb, jeb->offset + ofs, len, ic); +} /* Process the stored summary information - helper function for jffs2_sum_scan_sumnode() */ static int jffs2_sum_process_sum_data(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, struct jffs2_raw_summary *summary, uint32_t *pseudo_random) { - struct jffs2_raw_node_ref *raw; struct jffs2_inode_cache *ic; struct jffs2_full_dirent *fd; void *sp; int i, ino; + int err; sp = summary->sum; for (i=0; isum_num); i++) { dbg_summary("processing summary index %d\n", i); + /* Make sure there's a spare ref for dirty space */ + err = jffs2_prealloc_raw_node_refs(c, jeb, 2); + if (err) + return err; + switch (je16_to_cpu(((struct jffs2_sum_unknown_flash *)sp)->nodetype)) { case JFFS2_NODETYPE_INODE: { struct jffs2_sum_inode_flash *spi; @@ -312,38 +410,20 @@ static int jffs2_sum_process_sum_data(struct jffs2_sb_info *c, struct jffs2_eras ino = je32_to_cpu(spi->inode); - dbg_summary("Inode at 0x%08x\n", - jeb->offset + je32_to_cpu(spi->offset)); - - raw = jffs2_alloc_raw_node_ref(); - if (!raw) { - JFFS2_NOTICE("allocation of node reference failed\n"); - kfree(summary); - return -ENOMEM; - } + dbg_summary("Inode at 0x%08x-0x%08x\n", + jeb->offset + je32_to_cpu(spi->offset), + jeb->offset + je32_to_cpu(spi->offset) + je32_to_cpu(spi->totlen)); ic = jffs2_scan_make_ino_cache(c, ino); if (!ic) { JFFS2_NOTICE("scan_make_ino_cache failed\n"); - jffs2_free_raw_node_ref(raw); - kfree(summary); return -ENOMEM; } - raw->flash_offset = (jeb->offset + je32_to_cpu(spi->offset)) | REF_UNCHECKED; - raw->__totlen = PAD(je32_to_cpu(spi->totlen)); - raw->next_phys = NULL; - raw->next_in_ino = ic->nodes; - - ic->nodes = raw; - if (!jeb->first_node) - jeb->first_node = raw; - if (jeb->last_node) - jeb->last_node->next_phys = raw; - jeb->last_node = raw; - *pseudo_random += je32_to_cpu(spi->version); + sum_link_node_ref(c, jeb, je32_to_cpu(spi->offset) | REF_UNCHECKED, + PAD(je32_to_cpu(spi->totlen)), ic); - UNCHECKED_SPACE(PAD(je32_to_cpu(spi->totlen))); + *pseudo_random += je32_to_cpu(spi->version); sp += JFFS2_SUMMARY_INODE_SIZE; @@ -354,52 +434,33 @@ static int jffs2_sum_process_sum_data(struct jffs2_sb_info *c, struct jffs2_eras struct jffs2_sum_dirent_flash *spd; spd = sp; - dbg_summary("Dirent at 0x%08x\n", - jeb->offset + je32_to_cpu(spd->offset)); + dbg_summary("Dirent at 0x%08x-0x%08x\n", + jeb->offset + je32_to_cpu(spd->offset), + jeb->offset + je32_to_cpu(spd->offset) + je32_to_cpu(spd->totlen)); + fd = jffs2_alloc_full_dirent(spd->nsize+1); - if (!fd) { - kfree(summary); + if (!fd) return -ENOMEM; - } memcpy(&fd->name, spd->name, spd->nsize); fd->name[spd->nsize] = 0; - raw = jffs2_alloc_raw_node_ref(); - if (!raw) { - jffs2_free_full_dirent(fd); - JFFS2_NOTICE("allocation of node reference failed\n"); - kfree(summary); - return -ENOMEM; - } - ic = jffs2_scan_make_ino_cache(c, je32_to_cpu(spd->pino)); if (!ic) { jffs2_free_full_dirent(fd); - jffs2_free_raw_node_ref(raw); - kfree(summary); return -ENOMEM; } - raw->__totlen = PAD(je32_to_cpu(spd->totlen)); - raw->flash_offset = (jeb->offset + je32_to_cpu(spd->offset)) | REF_PRISTINE; - raw->next_phys = NULL; - raw->next_in_ino = ic->nodes; - ic->nodes = raw; - if (!jeb->first_node) - jeb->first_node = raw; - if (jeb->last_node) - jeb->last_node->next_phys = raw; - jeb->last_node = raw; - - fd->raw = raw; + fd->raw = sum_link_node_ref(c, jeb, je32_to_cpu(spd->offset) | REF_UNCHECKED, + PAD(je32_to_cpu(spd->totlen)), ic); + fd->next = NULL; fd->version = je32_to_cpu(spd->version); fd->ino = je32_to_cpu(spd->ino); fd->nhash = full_name_hash(fd->name, spd->nsize); fd->type = spd->type; - USED_SPACE(PAD(je32_to_cpu(spd->totlen))); + jffs2_add_fd_to_list(c, fd, &ic->scan_dents); *pseudo_random += je32_to_cpu(spd->version); @@ -408,48 +469,100 @@ static int jffs2_sum_process_sum_data(struct jffs2_sb_info *c, struct jffs2_eras break; } +#ifdef CONFIG_JFFS2_FS_XATTR + case JFFS2_NODETYPE_XATTR: { + struct jffs2_xattr_datum *xd; + struct jffs2_sum_xattr_flash *spx; + + spx = (struct jffs2_sum_xattr_flash *)sp; + dbg_summary("xattr at %#08x-%#08x (xid=%u, version=%u)\n", + jeb->offset + je32_to_cpu(spx->offset), + jeb->offset + je32_to_cpu(spx->offset) + je32_to_cpu(spx->totlen), + je32_to_cpu(spx->xid), je32_to_cpu(spx->version)); + + xd = jffs2_setup_xattr_datum(c, je32_to_cpu(spx->xid), + je32_to_cpu(spx->version)); + if (IS_ERR(xd)) + return PTR_ERR(xd); + if (xd->version > je32_to_cpu(spx->version)) { + /* node is not the newest one */ + struct jffs2_raw_node_ref *raw + = sum_link_node_ref(c, jeb, je32_to_cpu(spx->offset) | REF_UNCHECKED, + PAD(je32_to_cpu(spx->totlen)), NULL); + raw->next_in_ino = xd->node->next_in_ino; + xd->node->next_in_ino = raw; + } else { + xd->version = je32_to_cpu(spx->version); + sum_link_node_ref(c, jeb, je32_to_cpu(spx->offset) | REF_UNCHECKED, + PAD(je32_to_cpu(spx->totlen)), (void *)xd); + } + *pseudo_random += je32_to_cpu(spx->xid); + sp += JFFS2_SUMMARY_XATTR_SIZE; + + break; + } + case JFFS2_NODETYPE_XREF: { + struct jffs2_xattr_ref *ref; + struct jffs2_sum_xref_flash *spr; + + spr = (struct jffs2_sum_xref_flash *)sp; + dbg_summary("xref at %#08x-%#08x\n", + jeb->offset + je32_to_cpu(spr->offset), + jeb->offset + je32_to_cpu(spr->offset) + + (uint32_t)PAD(sizeof(struct jffs2_raw_xref))); + + ref = jffs2_alloc_xattr_ref(); + if (!ref) { + JFFS2_NOTICE("allocation of xattr_datum failed\n"); + return -ENOMEM; + } + ref->next = c->xref_temp; + c->xref_temp = ref; + sum_link_node_ref(c, jeb, je32_to_cpu(spr->offset) | REF_UNCHECKED, + PAD(sizeof(struct jffs2_raw_xref)), (void *)ref); + + *pseudo_random += ref->node->flash_offset; + sp += JFFS2_SUMMARY_XREF_SIZE; + + break; + } +#endif default : { - JFFS2_WARNING("Unsupported node type found in summary! Exiting..."); - kfree(summary); - return -EIO; + uint16_t nodetype = je16_to_cpu(((struct jffs2_sum_unknown_flash *)sp)->nodetype); + JFFS2_WARNING("Unsupported node type %x found in summary! Exiting...\n", nodetype); + if ((nodetype & JFFS2_COMPAT_MASK) == JFFS2_FEATURE_INCOMPAT) + return -EIO; + + /* For compatible node types, just fall back to the full scan */ + c->wasted_size -= jeb->wasted_size; + c->free_size += c->sector_size - jeb->free_size; + c->used_size -= jeb->used_size; + c->dirty_size -= jeb->dirty_size; + jeb->wasted_size = jeb->used_size = jeb->dirty_size = 0; + jeb->free_size = c->sector_size; + + jffs2_free_jeb_node_refs(c, jeb); + return -ENOTRECOVERABLE; } } } - - kfree(summary); return 0; } /* Process the summary node - called from jffs2_scan_eraseblock() */ - int jffs2_sum_scan_sumnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, - uint32_t ofs, uint32_t *pseudo_random) + struct jffs2_raw_summary *summary, uint32_t sumsize, + uint32_t *pseudo_random) { struct jffs2_unknown_node crcnode; - struct jffs2_raw_node_ref *cache_ref; - struct jffs2_raw_summary *summary; - int ret, sumsize; + int ret, ofs; uint32_t crc; - sumsize = c->sector_size - ofs; - ofs += jeb->offset; + ofs = c->sector_size - sumsize; dbg_summary("summary found for 0x%08x at 0x%08x (0x%x bytes)\n", - jeb->offset, ofs, sumsize); - - summary = kmalloc(sumsize, GFP_KERNEL); - - if (!summary) { - return -ENOMEM; - } - - ret = jffs2_fill_scan_buf(c, (unsigned char *)summary, ofs, sumsize); - - if (ret) { - kfree(summary); - return ret; - } + jeb->offset, jeb->offset + ofs, sumsize); /* OK, now check for node validity and CRC */ crcnode.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); @@ -486,66 +599,49 @@ int jffs2_sum_scan_sumnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb dbg_summary("Summary : CLEANMARKER node \n"); + ret = jffs2_prealloc_raw_node_refs(c, jeb, 1); + if (ret) + return ret; + if (je32_to_cpu(summary->cln_mkr) != c->cleanmarker_size) { dbg_summary("CLEANMARKER node has totlen 0x%x != normal 0x%x\n", je32_to_cpu(summary->cln_mkr), c->cleanmarker_size); - UNCHECKED_SPACE(PAD(je32_to_cpu(summary->cln_mkr))); + if ((ret = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(summary->cln_mkr))))) + return ret; } else if (jeb->first_node) { dbg_summary("CLEANMARKER node not first node in block " "(0x%08x)\n", jeb->offset); - UNCHECKED_SPACE(PAD(je32_to_cpu(summary->cln_mkr))); + if ((ret = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(summary->cln_mkr))))) + return ret; } else { - struct jffs2_raw_node_ref *marker_ref = jffs2_alloc_raw_node_ref(); - - if (!marker_ref) { - JFFS2_NOTICE("Failed to allocate node ref for clean marker\n"); - kfree(summary); - return -ENOMEM; - } - - marker_ref->next_in_ino = NULL; - marker_ref->next_phys = NULL; - marker_ref->flash_offset = jeb->offset | REF_NORMAL; - marker_ref->__totlen = je32_to_cpu(summary->cln_mkr); - jeb->first_node = jeb->last_node = marker_ref; - - USED_SPACE( PAD(je32_to_cpu(summary->cln_mkr)) ); + jffs2_link_node_ref(c, jeb, jeb->offset | REF_NORMAL, + je32_to_cpu(summary->cln_mkr), NULL); } } - if (je32_to_cpu(summary->padded)) { - DIRTY_SPACE(je32_to_cpu(summary->padded)); - } - ret = jffs2_sum_process_sum_data(c, jeb, summary, pseudo_random); + /* -ENOTRECOVERABLE isn't a fatal error -- it means we should do a full + scan of this eraseblock. So return zero */ + if (ret == -ENOTRECOVERABLE) + return 0; if (ret) - return ret; + return ret; /* real error */ /* for PARANOIA_CHECK */ - cache_ref = jffs2_alloc_raw_node_ref(); - - if (!cache_ref) { - JFFS2_NOTICE("Failed to allocate node ref for cache\n"); - return -ENOMEM; - } - - cache_ref->next_in_ino = NULL; - cache_ref->next_phys = NULL; - cache_ref->flash_offset = ofs | REF_NORMAL; - cache_ref->__totlen = sumsize; - - if (!jeb->first_node) - jeb->first_node = cache_ref; - if (jeb->last_node) - jeb->last_node->next_phys = cache_ref; - jeb->last_node = cache_ref; + ret = jffs2_prealloc_raw_node_refs(c, jeb, 2); + if (ret) + return ret; - USED_SPACE(sumsize); + sum_link_node_ref(c, jeb, ofs | REF_NORMAL, sumsize, NULL); - jeb->wasted_size += jeb->free_size; - c->wasted_size += jeb->free_size; - c->free_size -= jeb->free_size; - jeb->free_size = 0; + if (unlikely(jeb->free_size)) { + JFFS2_WARNING("Free size 0x%x bytes in eraseblock @0x%08x with summary?\n", + jeb->free_size, jeb->offset); + jeb->wasted_size += jeb->free_size; + c->wasted_size += jeb->free_size; + c->free_size -= jeb->free_size; + jeb->free_size = 0; + } return jffs2_scan_classify_jeb(c, jeb); @@ -564,6 +660,7 @@ static int jffs2_sum_write_data(struct jffs2_sb_info *c, struct jffs2_eraseblock union jffs2_sum_mem *temp; struct jffs2_sum_marker *sm; struct kvec vecs[2]; + uint32_t sum_ofs; void *wpage; int ret; size_t retlen; @@ -581,16 +678,17 @@ static int jffs2_sum_write_data(struct jffs2_sb_info *c, struct jffs2_eraseblock wpage = c->summary->sum_buf; while (c->summary->sum_num) { + temp = c->summary->sum_list_head; - switch (je16_to_cpu(c->summary->sum_list_head->u.nodetype)) { + switch (je16_to_cpu(temp->u.nodetype)) { case JFFS2_NODETYPE_INODE: { struct jffs2_sum_inode_flash *sino_ptr = wpage; - sino_ptr->nodetype = c->summary->sum_list_head->i.nodetype; - sino_ptr->inode = c->summary->sum_list_head->i.inode; - sino_ptr->version = c->summary->sum_list_head->i.version; - sino_ptr->offset = c->summary->sum_list_head->i.offset; - sino_ptr->totlen = c->summary->sum_list_head->i.totlen; + sino_ptr->nodetype = temp->i.nodetype; + sino_ptr->inode = temp->i.inode; + sino_ptr->version = temp->i.version; + sino_ptr->offset = temp->i.offset; + sino_ptr->totlen = temp->i.totlen; wpage += JFFS2_SUMMARY_INODE_SIZE; @@ -600,30 +698,60 @@ static int jffs2_sum_write_data(struct jffs2_sb_info *c, struct jffs2_eraseblock case JFFS2_NODETYPE_DIRENT: { struct jffs2_sum_dirent_flash *sdrnt_ptr = wpage; - sdrnt_ptr->nodetype = c->summary->sum_list_head->d.nodetype; - sdrnt_ptr->totlen = c->summary->sum_list_head->d.totlen; - sdrnt_ptr->offset = c->summary->sum_list_head->d.offset; - sdrnt_ptr->pino = c->summary->sum_list_head->d.pino; - sdrnt_ptr->version = c->summary->sum_list_head->d.version; - sdrnt_ptr->ino = c->summary->sum_list_head->d.ino; - sdrnt_ptr->nsize = c->summary->sum_list_head->d.nsize; - sdrnt_ptr->type = c->summary->sum_list_head->d.type; + sdrnt_ptr->nodetype = temp->d.nodetype; + sdrnt_ptr->totlen = temp->d.totlen; + sdrnt_ptr->offset = temp->d.offset; + sdrnt_ptr->pino = temp->d.pino; + sdrnt_ptr->version = temp->d.version; + sdrnt_ptr->ino = temp->d.ino; + sdrnt_ptr->nsize = temp->d.nsize; + sdrnt_ptr->type = temp->d.type; - memcpy(sdrnt_ptr->name, c->summary->sum_list_head->d.name, - c->summary->sum_list_head->d.nsize); + memcpy(sdrnt_ptr->name, temp->d.name, + temp->d.nsize); - wpage += JFFS2_SUMMARY_DIRENT_SIZE(c->summary->sum_list_head->d.nsize); + wpage += JFFS2_SUMMARY_DIRENT_SIZE(temp->d.nsize); break; } +#ifdef CONFIG_JFFS2_FS_XATTR + case JFFS2_NODETYPE_XATTR: { + struct jffs2_sum_xattr_flash *sxattr_ptr = wpage; + + temp = c->summary->sum_list_head; + sxattr_ptr->nodetype = temp->x.nodetype; + sxattr_ptr->xid = temp->x.xid; + sxattr_ptr->version = temp->x.version; + sxattr_ptr->offset = temp->x.offset; + sxattr_ptr->totlen = temp->x.totlen; + + wpage += JFFS2_SUMMARY_XATTR_SIZE; + break; + } + case JFFS2_NODETYPE_XREF: { + struct jffs2_sum_xref_flash *sxref_ptr = wpage; + temp = c->summary->sum_list_head; + sxref_ptr->nodetype = temp->r.nodetype; + sxref_ptr->offset = temp->r.offset; + + wpage += JFFS2_SUMMARY_XREF_SIZE; + break; + } +#endif default : { - BUG(); /* unknown node in summary information */ + if ((je16_to_cpu(temp->u.nodetype) & JFFS2_COMPAT_MASK) + == JFFS2_FEATURE_RWCOMPAT_COPY) { + dbg_summary("Writing unknown RWCOMPAT_COPY node type %x\n", + je16_to_cpu(temp->u.nodetype)); + jffs2_sum_disable_collecting(c->summary); + } else { + BUG(); /* unknown node in summary information */ + } } } - temp = c->summary->sum_list_head; - c->summary->sum_list_head = c->summary->sum_list_head->u.next; + c->summary->sum_list_head = temp->u.next; kfree(temp); c->summary->sum_num--; @@ -645,25 +773,34 @@ static int jffs2_sum_write_data(struct jffs2_sb_info *c, struct jffs2_eraseblock vecs[1].iov_base = c->summary->sum_buf; vecs[1].iov_len = datasize; - dbg_summary("JFFS2: writing out data to flash to pos : 0x%08x\n", - jeb->offset + c->sector_size - jeb->free_size); + sum_ofs = jeb->offset + c->sector_size - jeb->free_size; - spin_unlock(&c->erase_completion_lock); - ret = jffs2_flash_writev(c, vecs, 2, jeb->offset + c->sector_size - - jeb->free_size, &retlen, 0); - spin_lock(&c->erase_completion_lock); + dbg_summary("JFFS2: writing out data to flash to pos : 0x%08x\n", + sum_ofs); + ret = jffs2_flash_writev(c, vecs, 2, sum_ofs, &retlen, 0); if (ret || (retlen != infosize)) { - JFFS2_WARNING("Write of %zd bytes at 0x%08x failed. returned %d, retlen %zd\n", - infosize, jeb->offset + c->sector_size - jeb->free_size, ret, retlen); + + JFFS2_WARNING("Write of %u bytes at 0x%08x failed. returned %d, retlen %zd\n", + infosize, sum_ofs, ret, retlen); + + if (retlen) { + /* Waste remaining space */ + spin_lock(&c->erase_completion_lock); + jffs2_link_node_ref(c, jeb, sum_ofs | REF_OBSOLETE, infosize, NULL); + spin_unlock(&c->erase_completion_lock); + } c->summary->sum_size = JFFS2_SUMMARY_NOSUM_SIZE; - WASTED_SPACE(infosize); - return 1; + return 0; } + spin_lock(&c->erase_completion_lock); + jffs2_link_node_ref(c, jeb, sum_ofs | REF_NORMAL, infosize, NULL); + spin_unlock(&c->erase_completion_lock); + return 0; } @@ -671,13 +808,16 @@ static int jffs2_sum_write_data(struct jffs2_sb_info *c, struct jffs2_eraseblock int jffs2_sum_write_sumnode(struct jffs2_sb_info *c) { - struct jffs2_raw_node_ref *summary_ref; - int datasize, infosize, padsize, ret; + int datasize, infosize, padsize; struct jffs2_eraseblock *jeb; + int ret; dbg_summary("called\n"); + spin_unlock(&c->erase_completion_lock); + jeb = c->nextblock; + jffs2_prealloc_raw_node_refs(c, jeb, 1); if (!c->summary->sum_num || !c->summary->sum_list_head) { JFFS2_WARNING("Empty summary info!!!\n"); @@ -696,35 +836,11 @@ int jffs2_sum_write_sumnode(struct jffs2_sb_info *c) jffs2_sum_disable_collecting(c->summary); JFFS2_WARNING("Not enough space for summary, padsize = %d\n", padsize); + spin_lock(&c->erase_completion_lock); return 0; } ret = jffs2_sum_write_data(c, jeb, infosize, datasize, padsize); - if (ret) - return 0; /* can't write out summary, block is marked as NOSUM_SIZE */ - - /* for ACCT_PARANOIA_CHECK */ - spin_unlock(&c->erase_completion_lock); - summary_ref = jffs2_alloc_raw_node_ref(); spin_lock(&c->erase_completion_lock); - - if (!summary_ref) { - JFFS2_NOTICE("Failed to allocate node ref for summary\n"); - return -ENOMEM; - } - - summary_ref->next_in_ino = NULL; - summary_ref->next_phys = NULL; - summary_ref->flash_offset = (jeb->offset + c->sector_size - jeb->free_size) | REF_NORMAL; - summary_ref->__totlen = infosize; - - if (!jeb->first_node) - jeb->first_node = summary_ref; - if (jeb->last_node) - jeb->last_node->next_phys = summary_ref; - jeb->last_node = summary_ref; - - USED_SPACE(infosize); - - return 0; + return ret; } diff --git a/fs/jffs2/summary.h b/fs/jffs2/summary.h index b7a678be1..6bf1f6aa4 100644 --- a/fs/jffs2/summary.h +++ b/fs/jffs2/summary.h @@ -18,23 +18,6 @@ #include #include -#define DIRTY_SPACE(x) do { typeof(x) _x = (x); \ - c->free_size -= _x; c->dirty_size += _x; \ - jeb->free_size -= _x ; jeb->dirty_size += _x; \ - }while(0) -#define USED_SPACE(x) do { typeof(x) _x = (x); \ - c->free_size -= _x; c->used_size += _x; \ - jeb->free_size -= _x ; jeb->used_size += _x; \ - }while(0) -#define WASTED_SPACE(x) do { typeof(x) _x = (x); \ - c->free_size -= _x; c->wasted_size += _x; \ - jeb->free_size -= _x ; jeb->wasted_size += _x; \ - }while(0) -#define UNCHECKED_SPACE(x) do { typeof(x) _x = (x); \ - c->free_size -= _x; c->unchecked_size += _x; \ - jeb->free_size -= _x ; jeb->unchecked_size += _x; \ - }while(0) - #define BLK_STATE_ALLFF 0 #define BLK_STATE_CLEAN 1 #define BLK_STATE_PARTDIRTY 2 @@ -45,6 +28,8 @@ #define JFFS2_SUMMARY_NOSUM_SIZE 0xffffffff #define JFFS2_SUMMARY_INODE_SIZE (sizeof(struct jffs2_sum_inode_flash)) #define JFFS2_SUMMARY_DIRENT_SIZE(x) (sizeof(struct jffs2_sum_dirent_flash) + (x)) +#define JFFS2_SUMMARY_XATTR_SIZE (sizeof(struct jffs2_sum_xattr_flash)) +#define JFFS2_SUMMARY_XREF_SIZE (sizeof(struct jffs2_sum_xref_flash)) /* Summary structures used on flash */ @@ -75,11 +60,28 @@ struct jffs2_sum_dirent_flash uint8_t name[0]; /* dirent name */ } __attribute__((packed)); +struct jffs2_sum_xattr_flash +{ + jint16_t nodetype; /* == JFFS2_NODETYPE_XATR */ + jint32_t xid; /* xattr identifier */ + jint32_t version; /* version number */ + jint32_t offset; /* offset on jeb */ + jint32_t totlen; /* node length */ +} __attribute__((packed)); + +struct jffs2_sum_xref_flash +{ + jint16_t nodetype; /* == JFFS2_NODETYPE_XREF */ + jint32_t offset; /* offset on jeb */ +} __attribute__((packed)); + union jffs2_sum_flash { struct jffs2_sum_unknown_flash u; struct jffs2_sum_inode_flash i; struct jffs2_sum_dirent_flash d; + struct jffs2_sum_xattr_flash x; + struct jffs2_sum_xref_flash r; }; /* Summary structures used in the memory */ @@ -114,11 +116,30 @@ struct jffs2_sum_dirent_mem uint8_t name[0]; /* dirent name */ } __attribute__((packed)); +struct jffs2_sum_xattr_mem +{ + union jffs2_sum_mem *next; + jint16_t nodetype; + jint32_t xid; + jint32_t version; + jint32_t offset; + jint32_t totlen; +} __attribute__((packed)); + +struct jffs2_sum_xref_mem +{ + union jffs2_sum_mem *next; + jint16_t nodetype; + jint32_t offset; +} __attribute__((packed)); + union jffs2_sum_mem { struct jffs2_sum_unknown_mem u; struct jffs2_sum_inode_mem i; struct jffs2_sum_dirent_mem d; + struct jffs2_sum_xattr_mem x; + struct jffs2_sum_xref_mem r; }; /* Summary related information stored in superblock */ @@ -159,8 +180,11 @@ int jffs2_sum_write_sumnode(struct jffs2_sb_info *c); int jffs2_sum_add_padding_mem(struct jffs2_summary *s, uint32_t size); int jffs2_sum_add_inode_mem(struct jffs2_summary *s, struct jffs2_raw_inode *ri, uint32_t ofs); int jffs2_sum_add_dirent_mem(struct jffs2_summary *s, struct jffs2_raw_dirent *rd, uint32_t ofs); +int jffs2_sum_add_xattr_mem(struct jffs2_summary *s, struct jffs2_raw_xattr *rx, uint32_t ofs); +int jffs2_sum_add_xref_mem(struct jffs2_summary *s, struct jffs2_raw_xref *rr, uint32_t ofs); int jffs2_sum_scan_sumnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, - uint32_t ofs, uint32_t *pseudo_random); + struct jffs2_raw_summary *summary, uint32_t sumlen, + uint32_t *pseudo_random); #else /* SUMMARY DISABLED */ @@ -176,7 +200,9 @@ int jffs2_sum_scan_sumnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb #define jffs2_sum_add_padding_mem(a,b) #define jffs2_sum_add_inode_mem(a,b,c) #define jffs2_sum_add_dirent_mem(a,b,c) -#define jffs2_sum_scan_sumnode(a,b,c,d) (0) +#define jffs2_sum_add_xattr_mem(a,b,c) +#define jffs2_sum_add_xref_mem(a,b,c) +#define jffs2_sum_scan_sumnode(a,b,c,d,e) (0) #endif /* CONFIG_JFFS2_SUMMARY */ diff --git a/fs/jffs2/super.c b/fs/jffs2/super.c index ffd8e84b2..68e395341 100644 --- a/fs/jffs2/super.c +++ b/fs/jffs2/super.c @@ -11,7 +11,6 @@ * */ -#include #include #include #include @@ -111,9 +110,10 @@ static int jffs2_sb_set(struct super_block *sb, void *data) return 0; } -static struct super_block *jffs2_get_sb_mtd(struct file_system_type *fs_type, - int flags, const char *dev_name, - void *data, struct mtd_info *mtd) +static int jffs2_get_sb_mtd(struct file_system_type *fs_type, + int flags, const char *dev_name, + void *data, struct mtd_info *mtd, + struct vfsmount *mnt) { struct super_block *sb; struct jffs2_sb_info *c; @@ -121,19 +121,20 @@ static struct super_block *jffs2_get_sb_mtd(struct file_system_type *fs_type, c = kmalloc(sizeof(*c), GFP_KERNEL); if (!c) - return ERR_PTR(-ENOMEM); + return -ENOMEM; memset(c, 0, sizeof(*c)); c->mtd = mtd; sb = sget(fs_type, jffs2_sb_compare, jffs2_sb_set, c); if (IS_ERR(sb)) - goto out_put; + goto out_error; if (sb->s_root) { /* New mountpoint for JFFS2 which is already mounted */ D1(printk(KERN_DEBUG "jffs2_get_sb_mtd(): Device %d (\"%s\") is already mounted\n", mtd->index, mtd->name)); + ret = simple_set_mnt(mnt, sb); goto out_put; } @@ -151,51 +152,57 @@ static struct super_block *jffs2_get_sb_mtd(struct file_system_type *fs_type, sb->s_op = &jffs2_super_operations; sb->s_flags = flags | MS_NOATIME; - + sb->s_xattr = jffs2_xattr_handlers; +#ifdef CONFIG_JFFS2_FS_POSIX_ACL + sb->s_flags |= MS_POSIXACL; +#endif ret = jffs2_do_fill_super(sb, data, flags & MS_SILENT ? 1 : 0); if (ret) { /* Failure case... */ up_write(&sb->s_umount); deactivate_super(sb); - return ERR_PTR(ret); + return ret; } sb->s_flags |= MS_ACTIVE; - return sb; + return simple_set_mnt(mnt, sb); +out_error: + ret = PTR_ERR(sb); out_put: kfree(c); put_mtd_device(mtd); - return sb; + return ret; } -static struct super_block *jffs2_get_sb_mtdnr(struct file_system_type *fs_type, - int flags, const char *dev_name, - void *data, int mtdnr) +static int jffs2_get_sb_mtdnr(struct file_system_type *fs_type, + int flags, const char *dev_name, + void *data, int mtdnr, + struct vfsmount *mnt) { struct mtd_info *mtd; mtd = get_mtd_device(NULL, mtdnr); if (!mtd) { D1(printk(KERN_DEBUG "jffs2: MTD device #%u doesn't appear to exist\n", mtdnr)); - return ERR_PTR(-EINVAL); + return -EINVAL; } - return jffs2_get_sb_mtd(fs_type, flags, dev_name, data, mtd); + return jffs2_get_sb_mtd(fs_type, flags, dev_name, data, mtd, mnt); } -static struct super_block *jffs2_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, - void *data) +static int jffs2_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, + void *data, struct vfsmount *mnt) { int err; struct nameidata nd; int mtdnr; if (!dev_name) - return ERR_PTR(-EINVAL); + return -EINVAL; D1(printk(KERN_DEBUG "jffs2_get_sb(): dev_name \"%s\"\n", dev_name)); @@ -217,7 +224,7 @@ static struct super_block *jffs2_get_sb(struct file_system_type *fs_type, mtd = get_mtd_device(NULL, mtdnr); if (mtd) { if (!strcmp(mtd->name, dev_name+4)) - return jffs2_get_sb_mtd(fs_type, flags, dev_name, data, mtd); + return jffs2_get_sb_mtd(fs_type, flags, dev_name, data, mtd, mnt); put_mtd_device(mtd); } } @@ -230,7 +237,7 @@ static struct super_block *jffs2_get_sb(struct file_system_type *fs_type, if (!*endptr) { /* It was a valid number */ D1(printk(KERN_DEBUG "jffs2_get_sb(): mtd%%d, mtdnr %d\n", mtdnr)); - return jffs2_get_sb_mtdnr(fs_type, flags, dev_name, data, mtdnr); + return jffs2_get_sb_mtdnr(fs_type, flags, dev_name, data, mtdnr, mnt); } } } @@ -244,7 +251,7 @@ static struct super_block *jffs2_get_sb(struct file_system_type *fs_type, err, nd.dentry->d_inode)); if (err) - return ERR_PTR(err); + return err; err = -EINVAL; @@ -266,11 +273,11 @@ static struct super_block *jffs2_get_sb(struct file_system_type *fs_type, mtdnr = iminor(nd.dentry->d_inode); path_release(&nd); - return jffs2_get_sb_mtdnr(fs_type, flags, dev_name, data, mtdnr); + return jffs2_get_sb_mtdnr(fs_type, flags, dev_name, data, mtdnr, mnt); out: path_release(&nd); - return ERR_PTR(err); + return err; } static void jffs2_put_super (struct super_block *sb) @@ -293,6 +300,7 @@ static void jffs2_put_super (struct super_block *sb) kfree(c->blocks); jffs2_flash_cleanup(c); kfree(c->inocache_list); + jffs2_clear_xattr_subsystem(c); if (c->mtd->sync) c->mtd->sync(c->mtd); @@ -320,6 +328,18 @@ static int __init init_jffs2_fs(void) { int ret; + /* Paranoia checks for on-medium structures. If we ask GCC + to pack them with __attribute__((packed)) then it _also_ + assumes that they're not aligned -- so it emits crappy + code on some architectures. Ideally we want an attribute + which means just 'no padding', without the alignment + thing. But GCC doesn't have that -- we have to just + hope the structs are the right sizes, instead. */ + BUG_ON(sizeof(struct jffs2_unknown_node) != 12); + BUG_ON(sizeof(struct jffs2_raw_dirent) != 40); + BUG_ON(sizeof(struct jffs2_raw_inode) != 68); + BUG_ON(sizeof(struct jffs2_raw_summary) != 32); + printk(KERN_INFO "JFFS2 version 2.2." #ifdef CONFIG_JFFS2_FS_WRITEBUFFER " (NAND)" @@ -327,7 +347,7 @@ static int __init init_jffs2_fs(void) #ifdef CONFIG_JFFS2_SUMMARY " (SUMMARY) " #endif - " (C) 2001-2003 Red Hat, Inc.\n"); + " (C) 2001-2006 Red Hat, Inc.\n"); jffs2_inode_cachep = kmem_cache_create("jffs2_i", sizeof(struct jffs2_inode_info), diff --git a/fs/jffs2/symlink.c b/fs/jffs2/symlink.c index d55754fe8..fc211b6e9 100644 --- a/fs/jffs2/symlink.c +++ b/fs/jffs2/symlink.c @@ -24,7 +24,12 @@ struct inode_operations jffs2_symlink_inode_operations = { .readlink = generic_readlink, .follow_link = jffs2_follow_link, - .setattr = jffs2_setattr + .permission = jffs2_permission, + .setattr = jffs2_setattr, + .setxattr = jffs2_setxattr, + .getxattr = jffs2_getxattr, + .listxattr = jffs2_listxattr, + .removexattr = jffs2_removexattr }; static void *jffs2_follow_link(struct dentry *dentry, struct nameidata *nd) diff --git a/fs/jffs2/wbuf.c b/fs/jffs2/wbuf.c index 4cebf0e57..b9b700730 100644 --- a/fs/jffs2/wbuf.c +++ b/fs/jffs2/wbuf.c @@ -156,69 +156,130 @@ static void jffs2_block_refile(struct jffs2_sb_info *c, struct jffs2_eraseblock jffs2_erase_pending_trigger(c); } - /* Adjust its size counts accordingly */ - c->wasted_size += jeb->free_size; - c->free_size -= jeb->free_size; - jeb->wasted_size += jeb->free_size; - jeb->free_size = 0; + if (!jffs2_prealloc_raw_node_refs(c, jeb, 1)) { + uint32_t oldfree = jeb->free_size; + + jffs2_link_node_ref(c, jeb, + (jeb->offset+c->sector_size-oldfree) | REF_OBSOLETE, + oldfree, NULL); + /* convert to wasted */ + c->wasted_size += oldfree; + jeb->wasted_size += oldfree; + c->dirty_size -= oldfree; + jeb->dirty_size -= oldfree; + } jffs2_dbg_dump_block_lists_nolock(c); jffs2_dbg_acct_sanity_check_nolock(c,jeb); jffs2_dbg_acct_paranoia_check_nolock(c, jeb); } +static struct jffs2_raw_node_ref **jffs2_incore_replace_raw(struct jffs2_sb_info *c, + struct jffs2_inode_info *f, + struct jffs2_raw_node_ref *raw, + union jffs2_node_union *node) +{ + struct jffs2_node_frag *frag; + struct jffs2_full_dirent *fd; + + dbg_noderef("incore_replace_raw: node at %p is {%04x,%04x}\n", + node, je16_to_cpu(node->u.magic), je16_to_cpu(node->u.nodetype)); + + BUG_ON(je16_to_cpu(node->u.magic) != 0x1985 && + je16_to_cpu(node->u.magic) != 0); + + switch (je16_to_cpu(node->u.nodetype)) { + case JFFS2_NODETYPE_INODE: + if (f->metadata && f->metadata->raw == raw) { + dbg_noderef("Will replace ->raw in f->metadata at %p\n", f->metadata); + return &f->metadata->raw; + } + frag = jffs2_lookup_node_frag(&f->fragtree, je32_to_cpu(node->i.offset)); + BUG_ON(!frag); + /* Find a frag which refers to the full_dnode we want to modify */ + while (!frag->node || frag->node->raw != raw) { + frag = frag_next(frag); + BUG_ON(!frag); + } + dbg_noderef("Will replace ->raw in full_dnode at %p\n", frag->node); + return &frag->node->raw; + + case JFFS2_NODETYPE_DIRENT: + for (fd = f->dents; fd; fd = fd->next) { + if (fd->raw == raw) { + dbg_noderef("Will replace ->raw in full_dirent at %p\n", fd); + return &fd->raw; + } + } + BUG(); + + default: + dbg_noderef("Don't care about replacing raw for nodetype %x\n", + je16_to_cpu(node->u.nodetype)); + break; + } + return NULL; +} + /* Recover from failure to write wbuf. Recover the nodes up to the * wbuf, not the one which we were starting to try to write. */ static void jffs2_wbuf_recover(struct jffs2_sb_info *c) { struct jffs2_eraseblock *jeb, *new_jeb; - struct jffs2_raw_node_ref **first_raw, **raw; + struct jffs2_raw_node_ref *raw, *next, *first_raw = NULL; size_t retlen; int ret; + int nr_refile = 0; unsigned char *buf; uint32_t start, end, ofs, len; - spin_lock(&c->erase_completion_lock); - jeb = &c->blocks[c->wbuf_ofs / c->sector_size]; + spin_lock(&c->erase_completion_lock); jffs2_block_refile(c, jeb, REFILE_NOTEMPTY); + spin_unlock(&c->erase_completion_lock); + + BUG_ON(!ref_obsolete(jeb->last_node)); /* Find the first node to be recovered, by skipping over every node which ends before the wbuf starts, or which is obsolete. */ - first_raw = &jeb->first_node; - while (*first_raw && - (ref_obsolete(*first_raw) || - (ref_offset(*first_raw)+ref_totlen(c, jeb, *first_raw)) < c->wbuf_ofs)) { - D1(printk(KERN_DEBUG "Skipping node at 0x%08x(%d)-0x%08x which is either before 0x%08x or obsolete\n", - ref_offset(*first_raw), ref_flags(*first_raw), - (ref_offset(*first_raw) + ref_totlen(c, jeb, *first_raw)), - c->wbuf_ofs)); - first_raw = &(*first_raw)->next_phys; + for (next = raw = jeb->first_node; next; raw = next) { + next = ref_next(raw); + + if (ref_obsolete(raw) || + (next && ref_offset(next) <= c->wbuf_ofs)) { + dbg_noderef("Skipping node at 0x%08x(%d)-0x%08x which is either before 0x%08x or obsolete\n", + ref_offset(raw), ref_flags(raw), + (ref_offset(raw) + ref_totlen(c, jeb, raw)), + c->wbuf_ofs); + continue; + } + dbg_noderef("First node to be recovered is at 0x%08x(%d)-0x%08x\n", + ref_offset(raw), ref_flags(raw), + (ref_offset(raw) + ref_totlen(c, jeb, raw))); + + first_raw = raw; + break; } - if (!*first_raw) { + if (!first_raw) { /* All nodes were obsolete. Nothing to recover. */ D1(printk(KERN_DEBUG "No non-obsolete nodes to be recovered. Just filing block bad\n")); - spin_unlock(&c->erase_completion_lock); + c->wbuf_len = 0; return; } - start = ref_offset(*first_raw); - end = ref_offset(*first_raw) + ref_totlen(c, jeb, *first_raw); - - /* Find the last node to be recovered */ - raw = first_raw; - while ((*raw)) { - if (!ref_obsolete(*raw)) - end = ref_offset(*raw) + ref_totlen(c, jeb, *raw); + start = ref_offset(first_raw); + end = ref_offset(jeb->last_node); + nr_refile = 1; - raw = &(*raw)->next_phys; - } - spin_unlock(&c->erase_completion_lock); + /* Count the number of refs which need to be copied */ + while ((raw = ref_next(raw)) != jeb->last_node) + nr_refile++; - D1(printk(KERN_DEBUG "wbuf recover %08x-%08x\n", start, end)); + dbg_noderef("wbuf recover %08x-%08x (%d bytes in %d nodes)\n", + start, end, end - start, nr_refile); buf = NULL; if (start < c->wbuf_ofs) { @@ -233,28 +294,37 @@ static void jffs2_wbuf_recover(struct jffs2_sb_info *c) } /* Do the read... */ - if (jffs2_cleanmarker_oob(c)) - ret = c->mtd->read_ecc(c->mtd, start, c->wbuf_ofs - start, &retlen, buf, NULL, c->oobinfo); - else - ret = c->mtd->read(c->mtd, start, c->wbuf_ofs - start, &retlen, buf); + ret = c->mtd->read(c->mtd, start, c->wbuf_ofs - start, &retlen, buf); - if (ret == -EBADMSG && retlen == c->wbuf_ofs - start) { - /* ECC recovered */ + /* ECC recovered ? */ + if ((ret == -EUCLEAN || ret == -EBADMSG) && + (retlen == c->wbuf_ofs - start)) ret = 0; - } + if (ret || retlen != c->wbuf_ofs - start) { printk(KERN_CRIT "Old data are already lost in wbuf recovery. Data loss ensues.\n"); kfree(buf); buf = NULL; read_failed: - first_raw = &(*first_raw)->next_phys; + first_raw = ref_next(first_raw); + nr_refile--; + while (first_raw && ref_obsolete(first_raw)) { + first_raw = ref_next(first_raw); + nr_refile--; + } + /* If this was the only node to be recovered, give up */ - if (!(*first_raw)) + if (!first_raw) { + c->wbuf_len = 0; return; + } /* It wasn't. Go on and try to recover nodes complete in the wbuf */ - start = ref_offset(*first_raw); + start = ref_offset(first_raw); + dbg_noderef("wbuf now recover %08x-%08x (%d bytes in %d nodes)\n", + start, end, end - start, nr_refile); + } else { /* Read succeeded. Copy the remaining data from the wbuf */ memcpy(buf + (c->wbuf_ofs - start), c->wbuf, end - c->wbuf_ofs); @@ -263,14 +333,23 @@ static void jffs2_wbuf_recover(struct jffs2_sb_info *c) /* OK... we're to rewrite (end-start) bytes of data from first_raw onwards. Either 'buf' contains the data, or we find it in the wbuf */ - /* ... and get an allocation of space from a shiny new block instead */ - ret = jffs2_reserve_space_gc(c, end-start, &ofs, &len, JFFS2_SUMMARY_NOSUM_SIZE); + ret = jffs2_reserve_space_gc(c, end-start, &len, JFFS2_SUMMARY_NOSUM_SIZE); if (ret) { printk(KERN_WARNING "Failed to allocate space for wbuf recovery. Data loss ensues.\n"); kfree(buf); return; } + + ret = jffs2_prealloc_raw_node_refs(c, c->nextblock, nr_refile); + if (ret) { + printk(KERN_WARNING "Failed to allocate node refs for wbuf recovery. Data loss ensues.\n"); + kfree(buf); + return; + } + + ofs = write_ofs(c); + if (end-start >= c->wbuf_pagesize) { /* Need to do another write immediately, but it's possible that this is just because the wbuf itself is completely @@ -288,36 +367,22 @@ static void jffs2_wbuf_recover(struct jffs2_sb_info *c) if (breakme++ == 20) { printk(KERN_NOTICE "Faking write error at 0x%08x\n", ofs); breakme = 0; - c->mtd->write_ecc(c->mtd, ofs, towrite, &retlen, - brokenbuf, NULL, c->oobinfo); + c->mtd->write(c->mtd, ofs, towrite, &retlen, + brokenbuf); ret = -EIO; } else #endif - if (jffs2_cleanmarker_oob(c)) - ret = c->mtd->write_ecc(c->mtd, ofs, towrite, &retlen, - rewrite_buf, NULL, c->oobinfo); - else - ret = c->mtd->write(c->mtd, ofs, towrite, &retlen, rewrite_buf); + ret = c->mtd->write(c->mtd, ofs, towrite, &retlen, + rewrite_buf); if (ret || retlen != towrite) { /* Argh. We tried. Really we did. */ printk(KERN_CRIT "Recovery of wbuf failed due to a second write error\n"); kfree(buf); - if (retlen) { - struct jffs2_raw_node_ref *raw2; - - raw2 = jffs2_alloc_raw_node_ref(); - if (!raw2) - return; + if (retlen) + jffs2_add_physical_node_ref(c, ofs | REF_OBSOLETE, ref_totlen(c, jeb, first_raw), NULL); - raw2->flash_offset = ofs | REF_OBSOLETE; - raw2->__totlen = ref_totlen(c, jeb, *first_raw); - raw2->next_phys = NULL; - raw2->next_in_ino = NULL; - - jffs2_add_physical_node_ref(c, raw2); - } return; } printk(KERN_NOTICE "Recovery of wbuf succeeded to %08x\n", ofs); @@ -326,12 +391,10 @@ static void jffs2_wbuf_recover(struct jffs2_sb_info *c) c->wbuf_ofs = ofs + towrite; memmove(c->wbuf, rewrite_buf + towrite, c->wbuf_len); /* Don't muck about with c->wbuf_inodes. False positives are harmless. */ - kfree(buf); } else { /* OK, now we're left with the dregs in whichever buffer we're using */ if (buf) { memcpy(c->wbuf, buf, end-start); - kfree(buf); } else { memmove(c->wbuf, c->wbuf + (start - c->wbuf_ofs), end - start); } @@ -343,62 +406,110 @@ static void jffs2_wbuf_recover(struct jffs2_sb_info *c) new_jeb = &c->blocks[ofs / c->sector_size]; spin_lock(&c->erase_completion_lock); - if (new_jeb->first_node) { - /* Odd, but possible with ST flash later maybe */ - new_jeb->last_node->next_phys = *first_raw; - } else { - new_jeb->first_node = *first_raw; - } - - raw = first_raw; - while (*raw) { - uint32_t rawlen = ref_totlen(c, jeb, *raw); + for (raw = first_raw; raw != jeb->last_node; raw = ref_next(raw)) { + uint32_t rawlen = ref_totlen(c, jeb, raw); + struct jffs2_inode_cache *ic; + struct jffs2_raw_node_ref *new_ref; + struct jffs2_raw_node_ref **adjust_ref = NULL; + struct jffs2_inode_info *f = NULL; D1(printk(KERN_DEBUG "Refiling block of %08x at %08x(%d) to %08x\n", - rawlen, ref_offset(*raw), ref_flags(*raw), ofs)); + rawlen, ref_offset(raw), ref_flags(raw), ofs)); + + ic = jffs2_raw_ref_to_ic(raw); + + /* Ick. This XATTR mess should be fixed shortly... */ + if (ic && ic->class == RAWNODE_CLASS_XATTR_DATUM) { + struct jffs2_xattr_datum *xd = (void *)ic; + BUG_ON(xd->node != raw); + adjust_ref = &xd->node; + raw->next_in_ino = NULL; + ic = NULL; + } else if (ic && ic->class == RAWNODE_CLASS_XATTR_REF) { + struct jffs2_xattr_datum *xr = (void *)ic; + BUG_ON(xr->node != raw); + adjust_ref = &xr->node; + raw->next_in_ino = NULL; + ic = NULL; + } else if (ic && ic->class == RAWNODE_CLASS_INODE_CACHE) { + struct jffs2_raw_node_ref **p = &ic->nodes; + + /* Remove the old node from the per-inode list */ + while (*p && *p != (void *)ic) { + if (*p == raw) { + (*p) = (raw->next_in_ino); + raw->next_in_ino = NULL; + break; + } + p = &((*p)->next_in_ino); + } - if (ref_obsolete(*raw)) { - /* Shouldn't really happen much */ - new_jeb->dirty_size += rawlen; - new_jeb->free_size -= rawlen; - c->dirty_size += rawlen; - } else { - new_jeb->used_size += rawlen; - new_jeb->free_size -= rawlen; + if (ic->state == INO_STATE_PRESENT && !ref_obsolete(raw)) { + /* If it's an in-core inode, then we have to adjust any + full_dirent or full_dnode structure to point to the + new version instead of the old */ + f = jffs2_gc_fetch_inode(c, ic->ino, ic->nlink); + if (IS_ERR(f)) { + /* Should never happen; it _must_ be present */ + JFFS2_ERROR("Failed to iget() ino #%u, err %ld\n", + ic->ino, PTR_ERR(f)); + BUG(); + } + /* We don't lock f->sem. There's a number of ways we could + end up in here with it already being locked, and nobody's + going to modify it on us anyway because we hold the + alloc_sem. We're only changing one ->raw pointer too, + which we can get away with without upsetting readers. */ + adjust_ref = jffs2_incore_replace_raw(c, f, raw, + (void *)(buf?:c->wbuf) + (ref_offset(raw) - start)); + } else if (unlikely(ic->state != INO_STATE_PRESENT && + ic->state != INO_STATE_CHECKEDABSENT && + ic->state != INO_STATE_GC)) { + JFFS2_ERROR("Inode #%u is in strange state %d!\n", ic->ino, ic->state); + BUG(); + } + } + + new_ref = jffs2_link_node_ref(c, new_jeb, ofs | ref_flags(raw), rawlen, ic); + + if (adjust_ref) { + BUG_ON(*adjust_ref != raw); + *adjust_ref = new_ref; + } + if (f) + jffs2_gc_release_inode(c, f); + + if (!ref_obsolete(raw)) { jeb->dirty_size += rawlen; jeb->used_size -= rawlen; c->dirty_size += rawlen; + c->used_size -= rawlen; + raw->flash_offset = ref_offset(raw) | REF_OBSOLETE; + BUG_ON(raw->next_in_ino); } - c->free_size -= rawlen; - (*raw)->flash_offset = ofs | ref_flags(*raw); ofs += rawlen; - new_jeb->last_node = *raw; - - raw = &(*raw)->next_phys; } + kfree(buf); + /* Fix up the original jeb now it's on the bad_list */ - *first_raw = NULL; - if (first_raw == &jeb->first_node) { - jeb->last_node = NULL; + if (first_raw == jeb->first_node) { D1(printk(KERN_DEBUG "Failing block at %08x is now empty. Moving to erase_pending_list\n", jeb->offset)); - list_del(&jeb->list); - list_add(&jeb->list, &c->erase_pending_list); + list_move(&jeb->list, &c->erase_pending_list); c->nr_erasing_blocks++; jffs2_erase_pending_trigger(c); } - else - jeb->last_node = container_of(first_raw, struct jffs2_raw_node_ref, next_phys); jffs2_dbg_acct_sanity_check_nolock(c, jeb); - jffs2_dbg_acct_paranoia_check_nolock(c, jeb); + jffs2_dbg_acct_paranoia_check_nolock(c, jeb); jffs2_dbg_acct_sanity_check_nolock(c, new_jeb); - jffs2_dbg_acct_paranoia_check_nolock(c, new_jeb); + jffs2_dbg_acct_paranoia_check_nolock(c, new_jeb); spin_unlock(&c->erase_completion_lock); - D1(printk(KERN_DEBUG "wbuf recovery completed OK\n")); + D1(printk(KERN_DEBUG "wbuf recovery completed OK. wbuf_ofs 0x%08x, len 0x%x\n", c->wbuf_ofs, c->wbuf_len)); + } /* Meaning of pad argument: @@ -412,6 +523,7 @@ static void jffs2_wbuf_recover(struct jffs2_sb_info *c) static int __jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad) { + struct jffs2_eraseblock *wbuf_jeb; int ret; size_t retlen; @@ -429,6 +541,10 @@ static int __jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad) if (!c->wbuf_len) /* already checked c->wbuf above */ return 0; + wbuf_jeb = &c->blocks[c->wbuf_ofs / c->sector_size]; + if (jffs2_prealloc_raw_node_refs(c, wbuf_jeb, c->nextblock->allocated_refs + 1)) + return -ENOMEM; + /* claim remaining space on the page this happens, if we have a change to a new block, or if fsync forces us to flush the writebuffer. @@ -458,15 +574,12 @@ static int __jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad) if (breakme++ == 20) { printk(KERN_NOTICE "Faking write error at 0x%08x\n", c->wbuf_ofs); breakme = 0; - c->mtd->write_ecc(c->mtd, c->wbuf_ofs, c->wbuf_pagesize, - &retlen, brokenbuf, NULL, c->oobinfo); + c->mtd->write(c->mtd, c->wbuf_ofs, c->wbuf_pagesize, &retlen, + brokenbuf); ret = -EIO; } else #endif - if (jffs2_cleanmarker_oob(c)) - ret = c->mtd->write_ecc(c->mtd, c->wbuf_ofs, c->wbuf_pagesize, &retlen, c->wbuf, NULL, c->oobinfo); - else ret = c->mtd->write(c->mtd, c->wbuf_ofs, c->wbuf_pagesize, &retlen, c->wbuf); if (ret || retlen != c->wbuf_pagesize) { @@ -483,32 +596,34 @@ static int __jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad) return ret; } - spin_lock(&c->erase_completion_lock); - /* Adjust free size of the block if we padded. */ if (pad) { - struct jffs2_eraseblock *jeb; - - jeb = &c->blocks[c->wbuf_ofs / c->sector_size]; + uint32_t waste = c->wbuf_pagesize - c->wbuf_len; D1(printk(KERN_DEBUG "jffs2_flush_wbuf() adjusting free_size of %sblock at %08x\n", - (jeb==c->nextblock)?"next":"", jeb->offset)); + (wbuf_jeb==c->nextblock)?"next":"", wbuf_jeb->offset)); /* wbuf_pagesize - wbuf_len is the amount of space that's to be padded. If there is less free space in the block than that, something screwed up */ - if (jeb->free_size < (c->wbuf_pagesize - c->wbuf_len)) { + if (wbuf_jeb->free_size < waste) { printk(KERN_CRIT "jffs2_flush_wbuf(): Accounting error. wbuf at 0x%08x has 0x%03x bytes, 0x%03x left.\n", - c->wbuf_ofs, c->wbuf_len, c->wbuf_pagesize-c->wbuf_len); + c->wbuf_ofs, c->wbuf_len, waste); printk(KERN_CRIT "jffs2_flush_wbuf(): But free_size for block at 0x%08x is only 0x%08x\n", - jeb->offset, jeb->free_size); + wbuf_jeb->offset, wbuf_jeb->free_size); BUG(); } - jeb->free_size -= (c->wbuf_pagesize - c->wbuf_len); - c->free_size -= (c->wbuf_pagesize - c->wbuf_len); - jeb->wasted_size += (c->wbuf_pagesize - c->wbuf_len); - c->wasted_size += (c->wbuf_pagesize - c->wbuf_len); - } + + spin_lock(&c->erase_completion_lock); + + jffs2_link_node_ref(c, wbuf_jeb, (c->wbuf_ofs + c->wbuf_len) | REF_OBSOLETE, waste, NULL); + /* FIXME: that made it count as dirty. Convert to wasted */ + wbuf_jeb->dirty_size -= waste; + c->dirty_size -= waste; + wbuf_jeb->wasted_size += waste; + c->wasted_size += waste; + } else + spin_lock(&c->erase_completion_lock); /* Stick any now-obsoleted blocks on the erase_pending_list */ jffs2_refile_wbuf_blocks(c); @@ -603,20 +718,30 @@ int jffs2_flush_wbuf_pad(struct jffs2_sb_info *c) return ret; } -int jffs2_flash_writev(struct jffs2_sb_info *c, const struct kvec *invecs, unsigned long count, loff_t to, size_t *retlen, uint32_t ino) + +static size_t jffs2_fill_wbuf(struct jffs2_sb_info *c, const uint8_t *buf, + size_t len) +{ + if (len && !c->wbuf_len && (len >= c->wbuf_pagesize)) + return 0; + + if (len > (c->wbuf_pagesize - c->wbuf_len)) + len = c->wbuf_pagesize - c->wbuf_len; + memcpy(c->wbuf + c->wbuf_len, buf, len); + c->wbuf_len += (uint32_t) len; + return len; +} + +int jffs2_flash_writev(struct jffs2_sb_info *c, const struct kvec *invecs, + unsigned long count, loff_t to, size_t *retlen, + uint32_t ino) { - struct kvec outvecs[3]; - uint32_t totlen = 0; - uint32_t split_ofs = 0; - uint32_t old_totlen; - int ret, splitvec = -1; - int invec, outvec; - size_t wbuf_retlen; - unsigned char *wbuf_ptr; - size_t donelen = 0; + struct jffs2_eraseblock *jeb; + size_t wbuf_retlen, donelen = 0; uint32_t outvec_to = to; + int ret, invec; - /* If not NAND flash, don't bother */ + /* If not writebuffered flash, don't bother */ if (!jffs2_is_writebuffered(c)) return jffs2_flash_direct_writev(c, invecs, count, to, retlen); @@ -629,34 +754,22 @@ int jffs2_flash_writev(struct jffs2_sb_info *c, const struct kvec *invecs, unsig memset(c->wbuf,0xff,c->wbuf_pagesize); } - /* Fixup the wbuf if we are moving to a new eraseblock. The checks below - fail for ECC'd NOR because cleanmarker == 16, so a block starts at - xxx0010. */ - if (jffs2_nor_ecc(c)) { - if (((c->wbuf_ofs % c->sector_size) == 0) && !c->wbuf_len) { - c->wbuf_ofs = PAGE_DIV(to); - c->wbuf_len = PAGE_MOD(to); - memset(c->wbuf,0xff,c->wbuf_pagesize); - } - } - - /* Sanity checks on target address. - It's permitted to write at PAD(c->wbuf_len+c->wbuf_ofs), - and it's permitted to write at the beginning of a new - erase block. Anything else, and you die. - New block starts at xxx000c (0-b = block header) - */ + /* + * Sanity checks on target address. It's permitted to write + * at PAD(c->wbuf_len+c->wbuf_ofs), and it's permitted to + * write at the beginning of a new erase block. Anything else, + * and you die. New block starts at xxx000c (0-b = block + * header) + */ if (SECTOR_ADDR(to) != SECTOR_ADDR(c->wbuf_ofs)) { /* It's a write to a new block */ if (c->wbuf_len) { - D1(printk(KERN_DEBUG "jffs2_flash_writev() to 0x%lx causes flush of wbuf at 0x%08x\n", (unsigned long)to, c->wbuf_ofs)); + D1(printk(KERN_DEBUG "jffs2_flash_writev() to 0x%lx " + "causes flush of wbuf at 0x%08x\n", + (unsigned long)to, c->wbuf_ofs)); ret = __jffs2_flush_wbuf(c, PAD_NOACCOUNT); - if (ret) { - /* the underlying layer has to check wbuf_len to do the cleanup */ - D1(printk(KERN_WARNING "jffs2_flush_wbuf() called from jffs2_flash_writev() failed %d\n", ret)); - *retlen = 0; - goto exit; - } + if (ret) + goto outerr; } /* set pointer to new block */ c->wbuf_ofs = PAGE_DIV(to); @@ -665,165 +778,70 @@ int jffs2_flash_writev(struct jffs2_sb_info *c, const struct kvec *invecs, unsig if (to != PAD(c->wbuf_ofs + c->wbuf_len)) { /* We're not writing immediately after the writebuffer. Bad. */ - printk(KERN_CRIT "jffs2_flash_writev(): Non-contiguous write to %08lx\n", (unsigned long)to); + printk(KERN_CRIT "jffs2_flash_writev(): Non-contiguous write " + "to %08lx\n", (unsigned long)to); if (c->wbuf_len) printk(KERN_CRIT "wbuf was previously %08x-%08x\n", - c->wbuf_ofs, c->wbuf_ofs+c->wbuf_len); + c->wbuf_ofs, c->wbuf_ofs+c->wbuf_len); BUG(); } - /* Note outvecs[3] above. We know count is never greater than 2 */ - if (count > 2) { - printk(KERN_CRIT "jffs2_flash_writev(): count is %ld\n", count); - BUG(); - } - - invec = 0; - outvec = 0; - - /* Fill writebuffer first, if already in use */ - if (c->wbuf_len) { - uint32_t invec_ofs = 0; - - /* adjust alignment offset */ - if (c->wbuf_len != PAGE_MOD(to)) { - c->wbuf_len = PAGE_MOD(to); - /* take care of alignment to next page */ - if (!c->wbuf_len) - c->wbuf_len = c->wbuf_pagesize; - } - - while(c->wbuf_len < c->wbuf_pagesize) { - uint32_t thislen; - - if (invec == count) - goto alldone; - - thislen = c->wbuf_pagesize - c->wbuf_len; - - if (thislen >= invecs[invec].iov_len) - thislen = invecs[invec].iov_len; - - invec_ofs = thislen; - - memcpy(c->wbuf + c->wbuf_len, invecs[invec].iov_base, thislen); - c->wbuf_len += thislen; - donelen += thislen; - /* Get next invec, if actual did not fill the buffer */ - if (c->wbuf_len < c->wbuf_pagesize) - invec++; - } - - /* write buffer is full, flush buffer */ - ret = __jffs2_flush_wbuf(c, NOPAD); - if (ret) { - /* the underlying layer has to check wbuf_len to do the cleanup */ - D1(printk(KERN_WARNING "jffs2_flush_wbuf() called from jffs2_flash_writev() failed %d\n", ret)); - /* Retlen zero to make sure our caller doesn't mark the space dirty. - We've already done everything that's necessary */ - *retlen = 0; - goto exit; - } - outvec_to += donelen; - c->wbuf_ofs = outvec_to; - - /* All invecs done ? */ - if (invec == count) - goto alldone; - - /* Set up the first outvec, containing the remainder of the - invec we partially used */ - if (invecs[invec].iov_len > invec_ofs) { - outvecs[0].iov_base = invecs[invec].iov_base+invec_ofs; - totlen = outvecs[0].iov_len = invecs[invec].iov_len-invec_ofs; - if (totlen > c->wbuf_pagesize) { - splitvec = outvec; - split_ofs = outvecs[0].iov_len - PAGE_MOD(totlen); - } - outvec++; - } - invec++; - } - - /* OK, now we've flushed the wbuf and the start of the bits - we have been asked to write, now to write the rest.... */ - - /* totlen holds the amount of data still to be written */ - old_totlen = totlen; - for ( ; invec < count; invec++,outvec++ ) { - outvecs[outvec].iov_base = invecs[invec].iov_base; - totlen += outvecs[outvec].iov_len = invecs[invec].iov_len; - if (PAGE_DIV(totlen) != PAGE_DIV(old_totlen)) { - splitvec = outvec; - split_ofs = outvecs[outvec].iov_len - PAGE_MOD(totlen); - old_totlen = totlen; + /* adjust alignment offset */ + if (c->wbuf_len != PAGE_MOD(to)) { + c->wbuf_len = PAGE_MOD(to); + /* take care of alignment to next page */ + if (!c->wbuf_len) { + c->wbuf_len = c->wbuf_pagesize; + ret = __jffs2_flush_wbuf(c, NOPAD); + if (ret) + goto outerr; } } - /* Now the outvecs array holds all the remaining data to write */ - /* Up to splitvec,split_ofs is to be written immediately. The rest - goes into the (now-empty) wbuf */ - - if (splitvec != -1) { - uint32_t remainder; - - remainder = outvecs[splitvec].iov_len - split_ofs; - outvecs[splitvec].iov_len = split_ofs; - - /* We did cross a page boundary, so we write some now */ - if (jffs2_cleanmarker_oob(c)) - ret = c->mtd->writev_ecc(c->mtd, outvecs, splitvec+1, outvec_to, &wbuf_retlen, NULL, c->oobinfo); - else - ret = jffs2_flash_direct_writev(c, outvecs, splitvec+1, outvec_to, &wbuf_retlen); + for (invec = 0; invec < count; invec++) { + int vlen = invecs[invec].iov_len; + uint8_t *v = invecs[invec].iov_base; - if (ret < 0 || wbuf_retlen != PAGE_DIV(totlen)) { - /* At this point we have no problem, - c->wbuf is empty. However refile nextblock to avoid - writing again to same address. - */ - struct jffs2_eraseblock *jeb; + wbuf_retlen = jffs2_fill_wbuf(c, v, vlen); - spin_lock(&c->erase_completion_lock); - - jeb = &c->blocks[outvec_to / c->sector_size]; - jffs2_block_refile(c, jeb, REFILE_ANYWAY); - - *retlen = 0; - spin_unlock(&c->erase_completion_lock); - goto exit; + if (c->wbuf_len == c->wbuf_pagesize) { + ret = __jffs2_flush_wbuf(c, NOPAD); + if (ret) + goto outerr; } - + vlen -= wbuf_retlen; + outvec_to += wbuf_retlen; donelen += wbuf_retlen; - c->wbuf_ofs = PAGE_DIV(outvec_to) + PAGE_DIV(totlen); - - if (remainder) { - outvecs[splitvec].iov_base += split_ofs; - outvecs[splitvec].iov_len = remainder; - } else { - splitvec++; + v += wbuf_retlen; + + if (vlen >= c->wbuf_pagesize) { + ret = c->mtd->write(c->mtd, outvec_to, PAGE_DIV(vlen), + &wbuf_retlen, v); + if (ret < 0 || wbuf_retlen != PAGE_DIV(vlen)) + goto outfile; + + vlen -= wbuf_retlen; + outvec_to += wbuf_retlen; + c->wbuf_ofs = outvec_to; + donelen += wbuf_retlen; + v += wbuf_retlen; } - } else { - splitvec = 0; - } - - /* Now splitvec points to the start of the bits we have to copy - into the wbuf */ - wbuf_ptr = c->wbuf; + wbuf_retlen = jffs2_fill_wbuf(c, v, vlen); + if (c->wbuf_len == c->wbuf_pagesize) { + ret = __jffs2_flush_wbuf(c, NOPAD); + if (ret) + goto outerr; + } - for ( ; splitvec < outvec; splitvec++) { - /* Don't copy the wbuf into itself */ - if (outvecs[splitvec].iov_base == c->wbuf) - continue; - memcpy(wbuf_ptr, outvecs[splitvec].iov_base, outvecs[splitvec].iov_len); - wbuf_ptr += outvecs[splitvec].iov_len; - donelen += outvecs[splitvec].iov_len; + outvec_to += wbuf_retlen; + donelen += wbuf_retlen; } - c->wbuf_len = wbuf_ptr - c->wbuf; - /* If there's a remainder in the wbuf and it's a non-GC write, - remember that the wbuf affects this ino */ -alldone: + /* + * If there's a remainder in the wbuf and it's a non-GC write, + * remember that the wbuf affects this ino + */ *retlen = donelen; if (jffs2_sum_active()) { @@ -836,8 +854,24 @@ alldone: jffs2_wbuf_dirties_inode(c, ino); ret = 0; + up_write(&c->wbuf_sem); + return ret; -exit: +outfile: + /* + * At this point we have no problem, c->wbuf is empty. However + * refile nextblock to avoid writing again to same address. + */ + + spin_lock(&c->erase_completion_lock); + + jeb = &c->blocks[outvec_to / c->sector_size]; + jffs2_block_refile(c, jeb, REFILE_ANYWAY); + + spin_unlock(&c->erase_completion_lock); + +outerr: + *retlen = 0; up_write(&c->wbuf_sem); return ret; } @@ -846,7 +880,8 @@ exit: * This is the entry for flash write. * Check, if we work on NAND FLASH, if so build an kvec and write it via vritev */ -int jffs2_flash_write(struct jffs2_sb_info *c, loff_t ofs, size_t len, size_t *retlen, const u_char *buf) +int jffs2_flash_write(struct jffs2_sb_info *c, loff_t ofs, size_t len, + size_t *retlen, const u_char *buf) { struct kvec vecs[1]; @@ -871,25 +906,23 @@ int jffs2_flash_read(struct jffs2_sb_info *c, loff_t ofs, size_t len, size_t *re /* Read flash */ down_read(&c->wbuf_sem); - if (jffs2_cleanmarker_oob(c)) - ret = c->mtd->read_ecc(c->mtd, ofs, len, retlen, buf, NULL, c->oobinfo); - else - ret = c->mtd->read(c->mtd, ofs, len, retlen, buf); - - if ( (ret == -EBADMSG) && (*retlen == len) ) { - printk(KERN_WARNING "mtd->read(0x%zx bytes from 0x%llx) returned ECC error\n", - len, ofs); + ret = c->mtd->read(c->mtd, ofs, len, retlen, buf); + + if ( (ret == -EBADMSG || ret == -EUCLEAN) && (*retlen == len) ) { + if (ret == -EBADMSG) + printk(KERN_WARNING "mtd->read(0x%zx bytes from 0x%llx)" + " returned ECC error\n", len, ofs); /* - * We have the raw data without ECC correction in the buffer, maybe - * we are lucky and all data or parts are correct. We check the node. - * If data are corrupted node check will sort it out. - * We keep this block, it will fail on write or erase and the we - * mark it bad. Or should we do that now? But we should give him a chance. - * Maybe we had a system crash or power loss before the ecc write or - * a erase was completed. + * We have the raw data without ECC correction in the buffer, + * maybe we are lucky and all data or parts are correct. We + * check the node. If data are corrupted node check will sort + * it out. We keep this block, it will fail on write or erase + * and the we mark it bad. Or should we do that now? But we + * should give him a chance. Maybe we had a system crash or + * power loss before the ecc write or a erase was completed. * So we return success. :) */ - ret = 0; + ret = 0; } /* if no writebuffer available or write buffer empty, return */ @@ -911,7 +944,7 @@ int jffs2_flash_read(struct jffs2_sb_info *c, loff_t ofs, size_t len, size_t *re orbf = (c->wbuf_ofs - ofs); /* offset in read buffer */ if (orbf > len) /* is write beyond write buffer ? */ goto exit; - lwbf = len - orbf; /* number of bytes to copy */ + lwbf = len - orbf; /* number of bytes to copy */ if (lwbf > c->wbuf_len) lwbf = c->wbuf_len; } @@ -923,158 +956,159 @@ exit: return ret; } +#define NR_OOB_SCAN_PAGES 4 + /* - * Check, if the out of band area is empty + * Check, if the out of band area is empty */ -int jffs2_check_oob_empty( struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, int mode) +int jffs2_check_oob_empty(struct jffs2_sb_info *c, + struct jffs2_eraseblock *jeb, int mode) { - unsigned char *buf; - int ret = 0; - int i,len,page; - size_t retlen; - int oob_size; - - /* allocate a buffer for all oob data in this sector */ - oob_size = c->mtd->oobsize; - len = 4 * oob_size; - buf = kmalloc(len, GFP_KERNEL); - if (!buf) { - printk(KERN_NOTICE "jffs2_check_oob_empty(): allocation of temporary data buffer for oob check failed\n"); - return -ENOMEM; - } - /* - * if mode = 0, we scan for a total empty oob area, else we have - * to take care of the cleanmarker in the first page of the block - */ - ret = jffs2_flash_read_oob(c, jeb->offset, len , &retlen, buf); + int i, page, ret; + int oobsize = c->mtd->oobsize; + struct mtd_oob_ops ops; + + ops.len = NR_OOB_SCAN_PAGES * oobsize; + ops.ooblen = oobsize; + ops.oobbuf = c->oobbuf; + ops.ooboffs = 0; + ops.datbuf = NULL; + ops.mode = MTD_OOB_PLACE; + + ret = c->mtd->read_oob(c->mtd, jeb->offset, &ops); if (ret) { - D1(printk(KERN_WARNING "jffs2_check_oob_empty(): Read OOB failed %d for block at %08x\n", ret, jeb->offset)); - goto out; + D1(printk(KERN_WARNING "jffs2_check_oob_empty(): Read OOB " + "failed %d for block at %08x\n", ret, jeb->offset)); + return ret; } - if (retlen < len) { - D1(printk(KERN_WARNING "jffs2_check_oob_empty(): Read OOB return short read " - "(%zd bytes not %d) for block at %08x\n", retlen, len, jeb->offset)); - ret = -EIO; - goto out; + if (ops.retlen < ops.len) { + D1(printk(KERN_WARNING "jffs2_check_oob_empty(): Read OOB " + "returned short read (%zd bytes not %d) for block " + "at %08x\n", ops.retlen, ops.len, jeb->offset)); + return -EIO; } /* Special check for first page */ - for(i = 0; i < oob_size ; i++) { + for(i = 0; i < oobsize ; i++) { /* Yeah, we know about the cleanmarker. */ if (mode && i >= c->fsdata_pos && i < c->fsdata_pos + c->fsdata_len) continue; - if (buf[i] != 0xFF) { - D2(printk(KERN_DEBUG "Found %02x at %x in OOB for %08x\n", - buf[i], i, jeb->offset)); - ret = 1; - goto out; + if (ops.oobbuf[i] != 0xFF) { + D2(printk(KERN_DEBUG "Found %02x at %x in OOB for " + "%08x\n", ops.oobbuf[i], i, jeb->offset)); + return 1; } } /* we know, we are aligned :) */ - for (page = oob_size; page < len; page += sizeof(long)) { - unsigned long dat = *(unsigned long *)(&buf[page]); - if(dat != -1) { - ret = 1; - goto out; - } + for (page = oobsize; page < ops.len; page += sizeof(long)) { + long dat = *(long *)(&ops.oobbuf[page]); + if(dat != -1) + return 1; } - -out: - kfree(buf); - - return ret; + return 0; } /* -* Scan for a valid cleanmarker and for bad blocks -* For virtual blocks (concatenated physical blocks) check the cleanmarker -* only in the first page of the first physical block, but scan for bad blocks in all -* physical blocks -*/ -int jffs2_check_nand_cleanmarker (struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb) + * Scan for a valid cleanmarker and for bad blocks + */ +int jffs2_check_nand_cleanmarker (struct jffs2_sb_info *c, + struct jffs2_eraseblock *jeb) { struct jffs2_unknown_node n; - unsigned char buf[2 * NAND_MAX_OOBSIZE]; - unsigned char *p; - int ret, i, cnt, retval = 0; - size_t retlen, offset; - int oob_size; - - offset = jeb->offset; - oob_size = c->mtd->oobsize; - - /* Loop through the physical blocks */ - for (cnt = 0; cnt < (c->sector_size / c->mtd->erasesize); cnt++) { - /* Check first if the block is bad. */ - if (c->mtd->block_isbad (c->mtd, offset)) { - D1 (printk (KERN_WARNING "jffs2_check_nand_cleanmarker(): Bad block at %08x\n", jeb->offset)); - return 2; - } - /* - * We read oob data from page 0 and 1 of the block. - * page 0 contains cleanmarker and badblock info - * page 1 contains failure count of this block - */ - ret = c->mtd->read_oob (c->mtd, offset, oob_size << 1, &retlen, buf); + struct mtd_oob_ops ops; + int oobsize = c->mtd->oobsize; + unsigned char *p,*b; + int i, ret; + size_t offset = jeb->offset; + + /* Check first if the block is bad. */ + if (c->mtd->block_isbad(c->mtd, offset)) { + D1 (printk(KERN_WARNING "jffs2_check_nand_cleanmarker()" + ": Bad block at %08x\n", jeb->offset)); + return 2; + } - if (ret) { - D1 (printk (KERN_WARNING "jffs2_check_nand_cleanmarker(): Read OOB failed %d for block at %08x\n", ret, jeb->offset)); - return ret; - } - if (retlen < (oob_size << 1)) { - D1 (printk (KERN_WARNING "jffs2_check_nand_cleanmarker(): Read OOB return short read (%zd bytes not %d) for block at %08x\n", retlen, oob_size << 1, jeb->offset)); - return -EIO; - } + ops.len = oobsize; + ops.ooblen = oobsize; + ops.oobbuf = c->oobbuf; + ops.ooboffs = 0; + ops.datbuf = NULL; + ops.mode = MTD_OOB_PLACE; - /* Check cleanmarker only on the first physical block */ - if (!cnt) { - n.magic = cpu_to_je16 (JFFS2_MAGIC_BITMASK); - n.nodetype = cpu_to_je16 (JFFS2_NODETYPE_CLEANMARKER); - n.totlen = cpu_to_je32 (8); - p = (unsigned char *) &n; + ret = c->mtd->read_oob(c->mtd, offset, &ops); + if (ret) { + D1 (printk(KERN_WARNING "jffs2_check_nand_cleanmarker(): " + "Read OOB failed %d for block at %08x\n", + ret, jeb->offset)); + return ret; + } - for (i = 0; i < c->fsdata_len; i++) { - if (buf[c->fsdata_pos + i] != p[i]) { - retval = 1; - } - } - D1(if (retval == 1) { - printk(KERN_WARNING "jffs2_check_nand_cleanmarker(): Cleanmarker node not detected in block at %08x\n", jeb->offset); - printk(KERN_WARNING "OOB at %08x was ", offset); - for (i=0; i < oob_size; i++) { - printk("%02x ", buf[i]); - } - printk("\n"); - }) - } - offset += c->mtd->erasesize; + if (ops.retlen < ops.len) { + D1 (printk (KERN_WARNING "jffs2_check_nand_cleanmarker(): " + "Read OOB return short read (%zd bytes not %d) " + "for block at %08x\n", ops.retlen, ops.len, + jeb->offset)); + return -EIO; } - return retval; + + n.magic = cpu_to_je16 (JFFS2_MAGIC_BITMASK); + n.nodetype = cpu_to_je16 (JFFS2_NODETYPE_CLEANMARKER); + n.totlen = cpu_to_je32 (8); + p = (unsigned char *) &n; + b = c->oobbuf + c->fsdata_pos; + + for (i = c->fsdata_len; i; i--) { + if (*b++ != *p++) + ret = 1; + } + + D1(if (ret == 1) { + printk(KERN_WARNING "jffs2_check_nand_cleanmarker(): " + "Cleanmarker node not detected in block at %08x\n", + offset); + printk(KERN_WARNING "OOB at %08zx was ", offset); + for (i=0; i < oobsize; i++) + printk("%02x ", c->oobbuf[i]); + printk("\n"); + }); + return ret; } -int jffs2_write_nand_cleanmarker(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb) +int jffs2_write_nand_cleanmarker(struct jffs2_sb_info *c, + struct jffs2_eraseblock *jeb) { - struct jffs2_unknown_node n; - int ret; - size_t retlen; + struct jffs2_unknown_node n; + int ret; + struct mtd_oob_ops ops; n.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); n.nodetype = cpu_to_je16(JFFS2_NODETYPE_CLEANMARKER); n.totlen = cpu_to_je32(8); - ret = jffs2_flash_write_oob(c, jeb->offset + c->fsdata_pos, c->fsdata_len, &retlen, (unsigned char *)&n); + ops.len = c->fsdata_len; + ops.ooblen = c->fsdata_len;; + ops.oobbuf = (uint8_t *)&n; + ops.ooboffs = c->fsdata_pos; + ops.datbuf = NULL; + ops.mode = MTD_OOB_PLACE; + + ret = c->mtd->write_oob(c->mtd, jeb->offset, &ops); if (ret) { - D1(printk(KERN_WARNING "jffs2_write_nand_cleanmarker(): Write failed for block at %08x: error %d\n", jeb->offset, ret)); + D1(printk(KERN_WARNING "jffs2_write_nand_cleanmarker(): " + "Write failed for block at %08x: error %d\n", + jeb->offset, ret)); return ret; } - if (retlen != c->fsdata_len) { - D1(printk(KERN_WARNING "jffs2_write_nand_cleanmarker(): Short write for block at %08x: %zd not %d\n", jeb->offset, retlen, c->fsdata_len)); - return ret; + if (ops.retlen != ops.len) { + D1(printk(KERN_WARNING "jffs2_write_nand_cleanmarker(): " + "Short write for block at %08x: %zd not %d\n", + jeb->offset, ops.retlen, ops.len)); + return -EIO; } return 0; } @@ -1108,18 +1142,9 @@ int jffs2_write_nand_badblock(struct jffs2_sb_info *c, struct jffs2_eraseblock * return 1; } -#define NAND_JFFS2_OOB16_FSDALEN 8 - -static struct nand_oobinfo jffs2_oobinfo_docecc = { - .useecc = MTD_NANDECC_PLACE, - .eccbytes = 6, - .eccpos = {0,1,2,3,4,5} -}; - - static int jffs2_nand_set_oobinfo(struct jffs2_sb_info *c) { - struct nand_oobinfo *oinfo = &c->mtd->oobinfo; + struct nand_ecclayout *oinfo = c->mtd->ecclayout; /* Do this only, if we have an oob buffer */ if (!c->mtd->oobsize) @@ -1129,33 +1154,23 @@ static int jffs2_nand_set_oobinfo(struct jffs2_sb_info *c) c->cleanmarker_size = 0; /* Should we use autoplacement ? */ - if (oinfo && oinfo->useecc == MTD_NANDECC_AUTOPLACE) { - D1(printk(KERN_DEBUG "JFFS2 using autoplace on NAND\n")); - /* Get the position of the free bytes */ - if (!oinfo->oobfree[0][1]) { - printk (KERN_WARNING "jffs2_nand_set_oobinfo(): Eeep. Autoplacement selected and no empty space in oob\n"); - return -ENOSPC; - } - c->fsdata_pos = oinfo->oobfree[0][0]; - c->fsdata_len = oinfo->oobfree[0][1]; - if (c->fsdata_len > 8) - c->fsdata_len = 8; - } else { - /* This is just a legacy fallback and should go away soon */ - switch(c->mtd->ecctype) { - case MTD_ECC_RS_DiskOnChip: - printk(KERN_WARNING "JFFS2 using DiskOnChip hardware ECC without autoplacement. Fix it!\n"); - c->oobinfo = &jffs2_oobinfo_docecc; - c->fsdata_pos = 6; - c->fsdata_len = NAND_JFFS2_OOB16_FSDALEN; - c->badblock_pos = 15; - break; + if (!oinfo) { + D1(printk(KERN_DEBUG "JFFS2 on NAND. No autoplacment info found\n")); + return -EINVAL; + } - default: - D1(printk(KERN_DEBUG "JFFS2 on NAND. No autoplacment info found\n")); - return -EINVAL; - } + D1(printk(KERN_DEBUG "JFFS2 using autoplace on NAND\n")); + /* Get the position of the free bytes */ + if (!oinfo->oobfree[0].length) { + printk (KERN_WARNING "jffs2_nand_set_oobinfo(): Eeep." + " Autoplacement selected and no empty space in oob\n"); + return -ENOSPC; } + c->fsdata_pos = oinfo->oobfree[0].offset; + c->fsdata_len = oinfo->oobfree[0].length; + if (c->fsdata_len > 8) + c->fsdata_len = 8; + return 0; } @@ -1165,13 +1180,17 @@ int jffs2_nand_flash_setup(struct jffs2_sb_info *c) /* Initialise write buffer */ init_rwsem(&c->wbuf_sem); - c->wbuf_pagesize = c->mtd->oobblock; + c->wbuf_pagesize = c->mtd->writesize; c->wbuf_ofs = 0xFFFFFFFF; c->wbuf = kmalloc(c->wbuf_pagesize, GFP_KERNEL); if (!c->wbuf) return -ENOMEM; + c->oobbuf = kmalloc(NR_OOB_SCAN_PAGES * c->mtd->oobsize, GFP_KERNEL); + if (!c->oobbuf) + return -ENOMEM; + res = jffs2_nand_set_oobinfo(c); #ifdef BREAKME @@ -1189,6 +1208,7 @@ int jffs2_nand_flash_setup(struct jffs2_sb_info *c) void jffs2_nand_flash_cleanup(struct jffs2_sb_info *c) { kfree(c->wbuf); + kfree(c->oobbuf); } int jffs2_dataflash_setup(struct jffs2_sb_info *c) { @@ -1236,33 +1256,14 @@ void jffs2_dataflash_cleanup(struct jffs2_sb_info *c) { kfree(c->wbuf); } -int jffs2_nor_ecc_flash_setup(struct jffs2_sb_info *c) { - /* Cleanmarker is actually larger on the flashes */ - c->cleanmarker_size = 16; - - /* Initialize write buffer */ - init_rwsem(&c->wbuf_sem); - c->wbuf_pagesize = c->mtd->eccsize; - c->wbuf_ofs = 0xFFFFFFFF; - - c->wbuf = kmalloc(c->wbuf_pagesize, GFP_KERNEL); - if (!c->wbuf) - return -ENOMEM; - - return 0; -} - -void jffs2_nor_ecc_flash_cleanup(struct jffs2_sb_info *c) { - kfree(c->wbuf); -} - int jffs2_nor_wbuf_flash_setup(struct jffs2_sb_info *c) { - /* Cleanmarker currently occupies a whole programming region */ - c->cleanmarker_size = MTD_PROGREGION_SIZE(c->mtd); + /* Cleanmarker currently occupies whole programming regions, + * either one or 2 for 8Byte STMicro flashes. */ + c->cleanmarker_size = max(16u, c->mtd->writesize); /* Initialize write buffer */ init_rwsem(&c->wbuf_sem); - c->wbuf_pagesize = MTD_PROGREGION_SIZE(c->mtd); + c->wbuf_pagesize = c->mtd->writesize; c->wbuf_ofs = 0xFFFFFFFF; c->wbuf = kmalloc(c->wbuf_pagesize, GFP_KERNEL); diff --git a/fs/jffs2/write.c b/fs/jffs2/write.c index 1342f0158..67176792e 100644 --- a/fs/jffs2/write.c +++ b/fs/jffs2/write.c @@ -37,7 +37,6 @@ int jffs2_do_new_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, uint f->inocache->nodes = (struct jffs2_raw_node_ref *)f->inocache; f->inocache->state = INO_STATE_PRESENT; - jffs2_add_ino_cache(c, f->inocache); D1(printk(KERN_DEBUG "jffs2_do_new_inode(): Assigned ino# %d\n", f->inocache->ino)); ri->ino = cpu_to_je32(f->inocache->ino); @@ -57,12 +56,14 @@ int jffs2_do_new_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, uint /* jffs2_write_dnode - given a raw_inode, allocate a full_dnode for it, write it to the flash, link it into the existing inode/fragment list */ -struct jffs2_full_dnode *jffs2_write_dnode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_raw_inode *ri, const unsigned char *data, uint32_t datalen, uint32_t flash_ofs, int alloc_mode) +struct jffs2_full_dnode *jffs2_write_dnode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, + struct jffs2_raw_inode *ri, const unsigned char *data, + uint32_t datalen, int alloc_mode) { - struct jffs2_raw_node_ref *raw; struct jffs2_full_dnode *fn; size_t retlen; + uint32_t flash_ofs; struct kvec vecs[2]; int ret; int retried = 0; @@ -78,34 +79,21 @@ struct jffs2_full_dnode *jffs2_write_dnode(struct jffs2_sb_info *c, struct jffs2 vecs[1].iov_base = (unsigned char *)data; vecs[1].iov_len = datalen; - jffs2_dbg_prewrite_paranoia_check(c, flash_ofs, vecs[0].iov_len + vecs[1].iov_len); - if (je32_to_cpu(ri->totlen) != sizeof(*ri) + datalen) { printk(KERN_WARNING "jffs2_write_dnode: ri->totlen (0x%08x) != sizeof(*ri) (0x%08zx) + datalen (0x%08x)\n", je32_to_cpu(ri->totlen), sizeof(*ri), datalen); } - raw = jffs2_alloc_raw_node_ref(); - if (!raw) - return ERR_PTR(-ENOMEM); fn = jffs2_alloc_full_dnode(); - if (!fn) { - jffs2_free_raw_node_ref(raw); + if (!fn) return ERR_PTR(-ENOMEM); - } - - fn->ofs = je32_to_cpu(ri->offset); - fn->size = je32_to_cpu(ri->dsize); - fn->frags = 0; /* check number of valid vecs */ if (!datalen || !data) cnt = 1; retry: - fn->raw = raw; + flash_ofs = write_ofs(c); - raw->flash_offset = flash_ofs; - raw->__totlen = PAD(sizeof(*ri)+datalen); - raw->next_phys = NULL; + jffs2_dbg_prewrite_paranoia_check(c, flash_ofs, vecs[0].iov_len + vecs[1].iov_len); if ((alloc_mode!=ALLOC_GC) && (je32_to_cpu(ri->version) < f->highest_version)) { BUG_ON(!retried); @@ -125,22 +113,16 @@ struct jffs2_full_dnode *jffs2_write_dnode(struct jffs2_sb_info *c, struct jffs2 /* Mark the space as dirtied */ if (retlen) { - /* Doesn't belong to any inode */ - raw->next_in_ino = NULL; - /* Don't change raw->size to match retlen. We may have written the node header already, and only the data will seem corrupted, in which case the scan would skip over any node we write before the original intended end of this node */ - raw->flash_offset |= REF_OBSOLETE; - jffs2_add_physical_node_ref(c, raw); - jffs2_mark_node_obsolete(c, raw); + jffs2_add_physical_node_ref(c, flash_ofs | REF_OBSOLETE, PAD(sizeof(*ri)+datalen), NULL); } else { - printk(KERN_NOTICE "Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", raw->flash_offset); - jffs2_free_raw_node_ref(raw); + printk(KERN_NOTICE "Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", flash_ofs); } - if (!retried && alloc_mode != ALLOC_NORETRY && (raw = jffs2_alloc_raw_node_ref())) { + if (!retried && alloc_mode != ALLOC_NORETRY) { /* Try to reallocate space and retry */ uint32_t dummy; struct jffs2_eraseblock *jeb = &c->blocks[flash_ofs / c->sector_size]; @@ -153,19 +135,20 @@ struct jffs2_full_dnode *jffs2_write_dnode(struct jffs2_sb_info *c, struct jffs2 jffs2_dbg_acct_paranoia_check(c, jeb); if (alloc_mode == ALLOC_GC) { - ret = jffs2_reserve_space_gc(c, sizeof(*ri) + datalen, &flash_ofs, - &dummy, JFFS2_SUMMARY_INODE_SIZE); + ret = jffs2_reserve_space_gc(c, sizeof(*ri) + datalen, &dummy, + JFFS2_SUMMARY_INODE_SIZE); } else { /* Locking pain */ up(&f->sem); jffs2_complete_reservation(c); - ret = jffs2_reserve_space(c, sizeof(*ri) + datalen, &flash_ofs, - &dummy, alloc_mode, JFFS2_SUMMARY_INODE_SIZE); + ret = jffs2_reserve_space(c, sizeof(*ri) + datalen, &dummy, + alloc_mode, JFFS2_SUMMARY_INODE_SIZE); down(&f->sem); } if (!ret) { + flash_ofs = write_ofs(c); D1(printk(KERN_DEBUG "Allocated space at 0x%08x to retry failed write.\n", flash_ofs)); jffs2_dbg_acct_sanity_check(c,jeb); @@ -174,7 +157,6 @@ struct jffs2_full_dnode *jffs2_write_dnode(struct jffs2_sb_info *c, struct jffs2 goto retry; } D1(printk(KERN_DEBUG "Failed to allocate space to retry failed write: %d!\n", ret)); - jffs2_free_raw_node_ref(raw); } /* Release the full_dnode which is now useless, and return */ jffs2_free_full_dnode(fn); @@ -188,20 +170,17 @@ struct jffs2_full_dnode *jffs2_write_dnode(struct jffs2_sb_info *c, struct jffs2 if ((je32_to_cpu(ri->dsize) >= PAGE_CACHE_SIZE) || ( ((je32_to_cpu(ri->offset)&(PAGE_CACHE_SIZE-1))==0) && (je32_to_cpu(ri->dsize)+je32_to_cpu(ri->offset) == je32_to_cpu(ri->isize)))) { - raw->flash_offset |= REF_PRISTINE; + flash_ofs |= REF_PRISTINE; } else { - raw->flash_offset |= REF_NORMAL; + flash_ofs |= REF_NORMAL; } - jffs2_add_physical_node_ref(c, raw); - - /* Link into per-inode list */ - spin_lock(&c->erase_completion_lock); - raw->next_in_ino = f->inocache->nodes; - f->inocache->nodes = raw; - spin_unlock(&c->erase_completion_lock); + fn->raw = jffs2_add_physical_node_ref(c, flash_ofs, PAD(sizeof(*ri)+datalen), f->inocache); + fn->ofs = je32_to_cpu(ri->offset); + fn->size = je32_to_cpu(ri->dsize); + fn->frags = 0; D1(printk(KERN_DEBUG "jffs2_write_dnode wrote node at 0x%08x(%d) with dsize 0x%x, csize 0x%x, node_crc 0x%08x, data_crc 0x%08x, totlen 0x%08x\n", - flash_ofs, ref_flags(raw), je32_to_cpu(ri->dsize), + flash_ofs & ~3, flash_ofs & 3, je32_to_cpu(ri->dsize), je32_to_cpu(ri->csize), je32_to_cpu(ri->node_crc), je32_to_cpu(ri->data_crc), je32_to_cpu(ri->totlen))); @@ -212,12 +191,14 @@ struct jffs2_full_dnode *jffs2_write_dnode(struct jffs2_sb_info *c, struct jffs2 return fn; } -struct jffs2_full_dirent *jffs2_write_dirent(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_raw_dirent *rd, const unsigned char *name, uint32_t namelen, uint32_t flash_ofs, int alloc_mode) +struct jffs2_full_dirent *jffs2_write_dirent(struct jffs2_sb_info *c, struct jffs2_inode_info *f, + struct jffs2_raw_dirent *rd, const unsigned char *name, + uint32_t namelen, int alloc_mode) { - struct jffs2_raw_node_ref *raw; struct jffs2_full_dirent *fd; size_t retlen; struct kvec vecs[2]; + uint32_t flash_ofs; int retried = 0; int ret; @@ -228,26 +209,16 @@ struct jffs2_full_dirent *jffs2_write_dirent(struct jffs2_sb_info *c, struct jff D1(if(je32_to_cpu(rd->hdr_crc) != crc32(0, rd, sizeof(struct jffs2_unknown_node)-4)) { printk(KERN_CRIT "Eep. CRC not correct in jffs2_write_dirent()\n"); BUG(); - } - ); + }); vecs[0].iov_base = rd; vecs[0].iov_len = sizeof(*rd); vecs[1].iov_base = (unsigned char *)name; vecs[1].iov_len = namelen; - jffs2_dbg_prewrite_paranoia_check(c, flash_ofs, vecs[0].iov_len + vecs[1].iov_len); - - raw = jffs2_alloc_raw_node_ref(); - - if (!raw) - return ERR_PTR(-ENOMEM); - fd = jffs2_alloc_full_dirent(namelen+1); - if (!fd) { - jffs2_free_raw_node_ref(raw); + if (!fd) return ERR_PTR(-ENOMEM); - } fd->version = je32_to_cpu(rd->version); fd->ino = je32_to_cpu(rd->ino); @@ -257,11 +228,9 @@ struct jffs2_full_dirent *jffs2_write_dirent(struct jffs2_sb_info *c, struct jff fd->name[namelen]=0; retry: - fd->raw = raw; + flash_ofs = write_ofs(c); - raw->flash_offset = flash_ofs; - raw->__totlen = PAD(sizeof(*rd)+namelen); - raw->next_phys = NULL; + jffs2_dbg_prewrite_paranoia_check(c, flash_ofs, vecs[0].iov_len + vecs[1].iov_len); if ((alloc_mode!=ALLOC_GC) && (je32_to_cpu(rd->version) < f->highest_version)) { BUG_ON(!retried); @@ -280,15 +249,11 @@ struct jffs2_full_dirent *jffs2_write_dirent(struct jffs2_sb_info *c, struct jff sizeof(*rd)+namelen, flash_ofs, ret, retlen); /* Mark the space as dirtied */ if (retlen) { - raw->next_in_ino = NULL; - raw->flash_offset |= REF_OBSOLETE; - jffs2_add_physical_node_ref(c, raw); - jffs2_mark_node_obsolete(c, raw); + jffs2_add_physical_node_ref(c, flash_ofs | REF_OBSOLETE, PAD(sizeof(*rd)+namelen), NULL); } else { - printk(KERN_NOTICE "Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", raw->flash_offset); - jffs2_free_raw_node_ref(raw); + printk(KERN_NOTICE "Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", flash_ofs); } - if (!retried && (raw = jffs2_alloc_raw_node_ref())) { + if (!retried) { /* Try to reallocate space and retry */ uint32_t dummy; struct jffs2_eraseblock *jeb = &c->blocks[flash_ofs / c->sector_size]; @@ -301,39 +266,33 @@ struct jffs2_full_dirent *jffs2_write_dirent(struct jffs2_sb_info *c, struct jff jffs2_dbg_acct_paranoia_check(c, jeb); if (alloc_mode == ALLOC_GC) { - ret = jffs2_reserve_space_gc(c, sizeof(*rd) + namelen, &flash_ofs, - &dummy, JFFS2_SUMMARY_DIRENT_SIZE(namelen)); + ret = jffs2_reserve_space_gc(c, sizeof(*rd) + namelen, &dummy, + JFFS2_SUMMARY_DIRENT_SIZE(namelen)); } else { /* Locking pain */ up(&f->sem); jffs2_complete_reservation(c); - ret = jffs2_reserve_space(c, sizeof(*rd) + namelen, &flash_ofs, - &dummy, alloc_mode, JFFS2_SUMMARY_DIRENT_SIZE(namelen)); + ret = jffs2_reserve_space(c, sizeof(*rd) + namelen, &dummy, + alloc_mode, JFFS2_SUMMARY_DIRENT_SIZE(namelen)); down(&f->sem); } if (!ret) { + flash_ofs = write_ofs(c); D1(printk(KERN_DEBUG "Allocated space at 0x%08x to retry failed write.\n", flash_ofs)); jffs2_dbg_acct_sanity_check(c,jeb); jffs2_dbg_acct_paranoia_check(c, jeb); goto retry; } D1(printk(KERN_DEBUG "Failed to allocate space to retry failed write: %d!\n", ret)); - jffs2_free_raw_node_ref(raw); } /* Release the full_dnode which is now useless, and return */ jffs2_free_full_dirent(fd); return ERR_PTR(ret?ret:-EIO); } /* Mark the space used */ - raw->flash_offset |= REF_PRISTINE; - jffs2_add_physical_node_ref(c, raw); - - spin_lock(&c->erase_completion_lock); - raw->next_in_ino = f->inocache->nodes; - f->inocache->nodes = raw; - spin_unlock(&c->erase_completion_lock); + fd->raw = jffs2_add_physical_node_ref(c, flash_ofs | REF_PRISTINE, PAD(sizeof(*rd)+namelen), f->inocache); if (retried) { jffs2_dbg_acct_sanity_check(c,NULL); @@ -359,14 +318,14 @@ int jffs2_write_inode_range(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_full_dnode *fn; unsigned char *comprbuf = NULL; uint16_t comprtype = JFFS2_COMPR_NONE; - uint32_t phys_ofs, alloclen; + uint32_t alloclen; uint32_t datalen, cdatalen; int retried = 0; retry: D2(printk(KERN_DEBUG "jffs2_commit_write() loop: 0x%x to write to 0x%x\n", writelen, offset)); - ret = jffs2_reserve_space(c, sizeof(*ri) + JFFS2_MIN_DATA_LEN, &phys_ofs, + ret = jffs2_reserve_space(c, sizeof(*ri) + JFFS2_MIN_DATA_LEN, &alloclen, ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE); if (ret) { D1(printk(KERN_DEBUG "jffs2_reserve_space returned %d\n", ret)); @@ -394,7 +353,7 @@ int jffs2_write_inode_range(struct jffs2_sb_info *c, struct jffs2_inode_info *f, ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8)); ri->data_crc = cpu_to_je32(crc32(0, comprbuf, cdatalen)); - fn = jffs2_write_dnode(c, f, ri, comprbuf, cdatalen, phys_ofs, ALLOC_NORETRY); + fn = jffs2_write_dnode(c, f, ri, comprbuf, cdatalen, ALLOC_NORETRY); jffs2_free_comprbuf(comprbuf, buf); @@ -448,13 +407,13 @@ int jffs2_do_create(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, str struct jffs2_raw_dirent *rd; struct jffs2_full_dnode *fn; struct jffs2_full_dirent *fd; - uint32_t alloclen, phys_ofs; + uint32_t alloclen; int ret; /* Try to reserve enough space for both node and dirent. * Just the node will do for now, though */ - ret = jffs2_reserve_space(c, sizeof(*ri), &phys_ofs, &alloclen, ALLOC_NORMAL, + ret = jffs2_reserve_space(c, sizeof(*ri), &alloclen, ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE); D1(printk(KERN_DEBUG "jffs2_do_create(): reserved 0x%x bytes\n", alloclen)); if (ret) { @@ -465,7 +424,7 @@ int jffs2_do_create(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, str ri->data_crc = cpu_to_je32(0); ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8)); - fn = jffs2_write_dnode(c, f, ri, NULL, 0, phys_ofs, ALLOC_NORMAL); + fn = jffs2_write_dnode(c, f, ri, NULL, 0, ALLOC_NORMAL); D1(printk(KERN_DEBUG "jffs2_do_create created file with mode 0x%x\n", jemode_to_cpu(ri->mode))); @@ -484,7 +443,7 @@ int jffs2_do_create(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, str up(&f->sem); jffs2_complete_reservation(c); - ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen, + ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen, ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen)); if (ret) { @@ -516,7 +475,7 @@ int jffs2_do_create(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, str rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8)); rd->name_crc = cpu_to_je32(crc32(0, name, namelen)); - fd = jffs2_write_dirent(c, dir_f, rd, name, namelen, phys_ofs, ALLOC_NORMAL); + fd = jffs2_write_dirent(c, dir_f, rd, name, namelen, ALLOC_NORMAL); jffs2_free_raw_dirent(rd); @@ -545,7 +504,7 @@ int jffs2_do_unlink(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, { struct jffs2_raw_dirent *rd; struct jffs2_full_dirent *fd; - uint32_t alloclen, phys_ofs; + uint32_t alloclen; int ret; if (1 /* alternative branch needs testing */ || @@ -556,7 +515,7 @@ int jffs2_do_unlink(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, if (!rd) return -ENOMEM; - ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen, + ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen, ALLOC_DELETION, JFFS2_SUMMARY_DIRENT_SIZE(namelen)); if (ret) { jffs2_free_raw_dirent(rd); @@ -580,7 +539,7 @@ int jffs2_do_unlink(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8)); rd->name_crc = cpu_to_je32(crc32(0, name, namelen)); - fd = jffs2_write_dirent(c, dir_f, rd, name, namelen, phys_ofs, ALLOC_DELETION); + fd = jffs2_write_dirent(c, dir_f, rd, name, namelen, ALLOC_DELETION); jffs2_free_raw_dirent(rd); @@ -659,14 +618,14 @@ int jffs2_do_link (struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, uint { struct jffs2_raw_dirent *rd; struct jffs2_full_dirent *fd; - uint32_t alloclen, phys_ofs; + uint32_t alloclen; int ret; rd = jffs2_alloc_raw_dirent(); if (!rd) return -ENOMEM; - ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen, + ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen, ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen)); if (ret) { jffs2_free_raw_dirent(rd); @@ -692,7 +651,7 @@ int jffs2_do_link (struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, uint rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8)); rd->name_crc = cpu_to_je32(crc32(0, name, namelen)); - fd = jffs2_write_dirent(c, dir_f, rd, name, namelen, phys_ofs, ALLOC_NORMAL); + fd = jffs2_write_dirent(c, dir_f, rd, name, namelen, ALLOC_NORMAL); jffs2_free_raw_dirent(rd); diff --git a/fs/jfs/inode.c b/fs/jfs/inode.c index 11d65d961..f8a1714ba 100644 --- a/fs/jfs/inode.c +++ b/fs/jfs/inode.c @@ -170,16 +170,15 @@ void jfs_dirty_inode(struct inode *inode) set_cflag(COMMIT_Dirty, inode); } -static int -jfs_get_blocks(struct inode *ip, sector_t lblock, unsigned long max_blocks, - struct buffer_head *bh_result, int create) +int jfs_get_block(struct inode *ip, sector_t lblock, + struct buffer_head *bh_result, int create) { s64 lblock64 = lblock; int rc = 0; xad_t xad; s64 xaddr; int xflag; - s32 xlen = max_blocks; + s32 xlen = bh_result->b_size >> ip->i_blkbits; /* * Take appropriate lock on inode @@ -190,7 +189,7 @@ jfs_get_blocks(struct inode *ip, sector_t lblock, unsigned long max_blocks, IREAD_LOCK(ip); if (((lblock64 << ip->i_sb->s_blocksize_bits) < ip->i_size) && - (!xtLookup(ip, lblock64, max_blocks, &xflag, &xaddr, &xlen, 0)) && + (!xtLookup(ip, lblock64, xlen, &xflag, &xaddr, &xlen, 0)) && xaddr) { if (xflag & XAD_NOTRECORDED) { if (!create) @@ -257,13 +256,6 @@ jfs_get_blocks(struct inode *ip, sector_t lblock, unsigned long max_blocks, return rc; } -static int jfs_get_block(struct inode *ip, sector_t lblock, - struct buffer_head *bh_result, int create) -{ - return jfs_get_blocks(ip, lblock, bh_result->b_size >> ip->i_blkbits, - bh_result, create); -} - static int jfs_writepage(struct page *page, struct writeback_control *wbc) { return nobh_writepage(page, jfs_get_block, wbc); @@ -307,7 +299,7 @@ static ssize_t jfs_direct_IO(int rw, struct kiocb *iocb, offset, nr_segs, jfs_get_block, NULL); } -struct address_space_operations jfs_aops = { +const struct address_space_operations jfs_aops = { .readpage = jfs_readpage, .readpages = jfs_readpages, .writepage = jfs_writepage, diff --git a/fs/jfs/jfs_extent.c b/fs/jfs/jfs_extent.c index 0ce43f3db..ecf3ac3d7 100644 --- a/fs/jfs/jfs_extent.c +++ b/fs/jfs/jfs_extent.c @@ -127,7 +127,7 @@ extAlloc(struct inode *ip, s64 xlen, s64 pno, xad_t * xp, boolean_t abnr) /* allocate the disk blocks for the extent. initially, extBalloc() * will try to allocate disk blocks for the requested size (xlen). - * if this fails (xlen contigious free blocks not avaliable), it'll + * if this fails (xlen contiguous free blocks not avaliable), it'll * try to allocate a smaller number of blocks (producing a smaller * extent), with this smaller number of blocks consisting of the * requested number of blocks rounded down to the next smaller @@ -486,7 +486,7 @@ int extRecord(struct inode *ip, xad_t * xp) int extFill(struct inode *ip, xad_t * xp) { int rc, nbperpage = JFS_SBI(ip->i_sb)->nbperpage; - s64 blkno = offsetXAD(xp) >> ip->i_blksize; + s64 blkno = offsetXAD(xp) >> ip->i_blkbits; // assert(ISSPARSE(ip)); @@ -511,7 +511,7 @@ int extFill(struct inode *ip, xad_t * xp) * * initially, we will try to allocate disk blocks for the * requested size (nblocks). if this fails (nblocks - * contigious free blocks not avaliable), we'll try to allocate + * contiguous free blocks not avaliable), we'll try to allocate * a smaller number of blocks (producing a smaller extent), with * this smaller number of blocks consisting of the requested * number of blocks rounded down to the next smaller power of 2 @@ -547,7 +547,7 @@ extBalloc(struct inode *ip, s64 hint, s64 * nblocks, s64 * blkno) /* get the number of blocks to initially attempt to allocate. * we'll first try the number of blocks requested unless this - * number is greater than the maximum number of contigious free + * number is greater than the maximum number of contiguous free * blocks in the map. in that case, we'll start off with the * maximum free. */ @@ -604,7 +604,7 @@ extBalloc(struct inode *ip, s64 hint, s64 * nblocks, s64 * blkno) * in place. if this fails, we'll try to move the extent * to a new set of blocks. if moving the extent, we initially * will try to allocate disk blocks for the requested size - * (nnew). if this fails (nnew contigious free blocks not + * (nnew). if this fails (new contiguous free blocks not * avaliable), we'll try to allocate a smaller number of * blocks (producing a smaller extent), with this smaller * number of blocks consisting of the requested number of diff --git a/fs/jfs/jfs_imap.c b/fs/jfs/jfs_imap.c index d88cf0b1b..361920334 100644 --- a/fs/jfs/jfs_imap.c +++ b/fs/jfs/jfs_imap.c @@ -319,7 +319,7 @@ int diRead(struct inode *ip) struct inomap *imap; int block_offset; int inodes_left; - uint pageno; + unsigned long pageno; int rel_inode; jfs_info("diRead: ino = %ld", ip->i_ino); @@ -607,7 +607,7 @@ int diWrite(tid_t tid, struct inode *ip) int block_offset; int inodes_left; struct metapage *mp; - uint pageno; + unsigned long pageno; int rel_inode; int dioffset; struct inode *ipimap; @@ -3122,7 +3122,6 @@ static int copy_from_dinode(struct dinode * dip, struct inode *ip) ip->i_mtime.tv_nsec = le32_to_cpu(dip->di_mtime.tv_nsec); ip->i_ctime.tv_sec = le32_to_cpu(dip->di_ctime.tv_sec); ip->i_ctime.tv_nsec = le32_to_cpu(dip->di_ctime.tv_nsec); - ip->i_blksize = ip->i_sb->s_blocksize; ip->i_blocks = LBLK2PBLK(ip->i_sb, le64_to_cpu(dip->di_nblocks)); ip->i_generation = le32_to_cpu(dip->di_gen); diff --git a/fs/jfs/jfs_inode.c b/fs/jfs/jfs_inode.c index 8512641bc..9ba919e87 100644 --- a/fs/jfs/jfs_inode.c +++ b/fs/jfs/jfs_inode.c @@ -164,7 +164,6 @@ struct inode *ialloc(struct inode *parent, umode_t mode) } jfs_inode->mode2 |= mode; - inode->i_blksize = sb->s_blocksize; inode->i_blocks = 0; inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; jfs_inode->otime = inode->i_ctime.tv_sec; diff --git a/fs/jfs/jfs_inode.h b/fs/jfs/jfs_inode.h index 5249ac5ea..ab6d106b5 100644 --- a/fs/jfs/jfs_inode.h +++ b/fs/jfs/jfs_inode.h @@ -33,8 +33,9 @@ extern void jfs_free_zero_link(struct inode *); extern struct dentry *jfs_get_parent(struct dentry *dentry); extern int jfs_sync_flags(struct inode *); extern void jfs_set_inode_flags(struct inode *); +extern int jfs_get_block(struct inode *, sector_t, struct buffer_head *, int); -extern struct address_space_operations jfs_aops; +extern const struct address_space_operations jfs_aops; extern struct inode_operations jfs_dir_inode_operations; extern const struct file_operations jfs_dir_operations; extern struct inode_operations jfs_file_inode_operations; diff --git a/fs/jfs/jfs_metapage.c b/fs/jfs/jfs_metapage.c index 2b220dd6b..f5afc129d 100644 --- a/fs/jfs/jfs_metapage.c +++ b/fs/jfs/jfs_metapage.c @@ -257,7 +257,7 @@ static sector_t metapage_get_blocks(struct inode *inode, sector_t lblock, int rc = 0; int xflag; s64 xaddr; - sector_t file_blocks = (inode->i_size + inode->i_blksize - 1) >> + sector_t file_blocks = (inode->i_size + inode->i_sb->s_blocksize - 1) >> inode->i_blkbits; if (lblock >= file_blocks) @@ -577,7 +577,7 @@ static void metapage_invalidatepage(struct page *page, unsigned long offset) metapage_releasepage(page, 0); } -struct address_space_operations jfs_metapage_aops = { +const struct address_space_operations jfs_metapage_aops = { .readpage = metapage_readpage, .writepage = metapage_writepage, .sync_page = block_sync_page, @@ -632,10 +632,9 @@ struct metapage *__get_metapage(struct inode *inode, unsigned long lblock, } SetPageUptodate(page); } else { - page = read_cache_page(mapping, page_index, - (filler_t *)mapping->a_ops->readpage, NULL); + page = read_mapping_page(mapping, page_index, NULL); if (IS_ERR(page) || !PageUptodate(page)) { - jfs_err("read_cache_page failed!"); + jfs_err("read_mapping_page failed!"); return NULL; } lock_page(page); diff --git a/fs/jfs/jfs_metapage.h b/fs/jfs/jfs_metapage.h index f0b7d3282..d17a3290f 100644 --- a/fs/jfs/jfs_metapage.h +++ b/fs/jfs/jfs_metapage.h @@ -139,7 +139,7 @@ static inline void metapage_homeok(struct metapage *mp) put_metapage(mp); } -extern struct address_space_operations jfs_metapage_aops; +extern const struct address_space_operations jfs_metapage_aops; /* * This routines invalidate all pages for an extent. diff --git a/fs/jfs/jfs_txnmgr.c b/fs/jfs/jfs_txnmgr.c index ac3d66948..efbb586be 100644 --- a/fs/jfs/jfs_txnmgr.c +++ b/fs/jfs/jfs_txnmgr.c @@ -842,7 +842,7 @@ struct tlock *txLock(tid_t tid, struct inode *ip, struct metapage * mp, TXN_UNLOCK(); release_metapage(mp); TXN_LOCK(); - xtid = tlck->tid; /* reaquire after dropping TXN_LOCK */ + xtid = tlck->tid; /* reacquire after dropping TXN_LOCK */ jfs_info("txLock: in waitLock, tid = %d, xtid = %d, lid = %d", tid, xtid, lid); @@ -2944,7 +2944,7 @@ int jfs_sync(void *arg) * Inode is being freed */ list_del_init(&jfs_ip->anon_inode_list); - } else if (! !mutex_trylock(&jfs_ip->commit_mutex)) { + } else if (mutex_trylock(&jfs_ip->commit_mutex)) { /* * inode will be removed from anonymous list * when it is committed diff --git a/fs/jfs/namei.c b/fs/jfs/namei.c index 2d7f32ab8..f743ee5ec 100644 --- a/fs/jfs/namei.c +++ b/fs/jfs/namei.c @@ -166,8 +166,8 @@ static int jfs_create(struct inode *dip, struct dentry *dentry, int mode, out3: txEnd(tid); - mutex_unlock(&JFS_IP(dip)->commit_mutex); mutex_unlock(&JFS_IP(ip)->commit_mutex); + mutex_unlock(&JFS_IP(dip)->commit_mutex); if (rc) { free_ea_wmap(ip); ip->i_nlink = 0; @@ -301,8 +301,8 @@ static int jfs_mkdir(struct inode *dip, struct dentry *dentry, int mode) out3: txEnd(tid); - mutex_unlock(&JFS_IP(dip)->commit_mutex); mutex_unlock(&JFS_IP(ip)->commit_mutex); + mutex_unlock(&JFS_IP(dip)->commit_mutex); if (rc) { free_ea_wmap(ip); ip->i_nlink = 0; @@ -385,8 +385,8 @@ static int jfs_rmdir(struct inode *dip, struct dentry *dentry) if (rc == -EIO) txAbort(tid, 1); txEnd(tid); - mutex_unlock(&JFS_IP(dip)->commit_mutex); mutex_unlock(&JFS_IP(ip)->commit_mutex); + mutex_unlock(&JFS_IP(dip)->commit_mutex); goto out2; } @@ -423,8 +423,8 @@ static int jfs_rmdir(struct inode *dip, struct dentry *dentry) txEnd(tid); - mutex_unlock(&JFS_IP(dip)->commit_mutex); mutex_unlock(&JFS_IP(ip)->commit_mutex); + mutex_unlock(&JFS_IP(dip)->commit_mutex); /* * Truncating the directory index table is not guaranteed. It @@ -504,8 +504,8 @@ static int jfs_unlink(struct inode *dip, struct dentry *dentry) if (rc == -EIO) txAbort(tid, 1); /* Marks FS Dirty */ txEnd(tid); - mutex_unlock(&JFS_IP(dip)->commit_mutex); mutex_unlock(&JFS_IP(ip)->commit_mutex); + mutex_unlock(&JFS_IP(dip)->commit_mutex); IWRITE_UNLOCK(ip); goto out1; } @@ -528,8 +528,8 @@ static int jfs_unlink(struct inode *dip, struct dentry *dentry) if ((new_size = commitZeroLink(tid, ip)) < 0) { txAbort(tid, 1); /* Marks FS Dirty */ txEnd(tid); - mutex_unlock(&JFS_IP(dip)->commit_mutex); mutex_unlock(&JFS_IP(ip)->commit_mutex); + mutex_unlock(&JFS_IP(dip)->commit_mutex); IWRITE_UNLOCK(ip); rc = new_size; goto out1; @@ -557,9 +557,8 @@ static int jfs_unlink(struct inode *dip, struct dentry *dentry) txEnd(tid); - mutex_unlock(&JFS_IP(dip)->commit_mutex); mutex_unlock(&JFS_IP(ip)->commit_mutex); - + mutex_unlock(&JFS_IP(dip)->commit_mutex); while (new_size && (rc == 0)) { tid = txBegin(dip->i_sb, 0); @@ -848,8 +847,8 @@ static int jfs_link(struct dentry *old_dentry, out: txEnd(tid); - mutex_unlock(&JFS_IP(dir)->commit_mutex); mutex_unlock(&JFS_IP(ip)->commit_mutex); + mutex_unlock(&JFS_IP(dir)->commit_mutex); jfs_info("jfs_link: rc:%d", rc); return rc; @@ -1038,8 +1037,8 @@ static int jfs_symlink(struct inode *dip, struct dentry *dentry, out3: txEnd(tid); - mutex_unlock(&JFS_IP(dip)->commit_mutex); mutex_unlock(&JFS_IP(ip)->commit_mutex); + mutex_unlock(&JFS_IP(dip)->commit_mutex); if (rc) { free_ea_wmap(ip); ip->i_nlink = 0; @@ -1161,10 +1160,11 @@ static int jfs_rename(struct inode *old_dir, struct dentry *old_dentry, if (S_ISDIR(new_ip->i_mode)) { new_ip->i_nlink--; if (new_ip->i_nlink) { - mutex_unlock(&JFS_IP(new_dir)->commit_mutex); - mutex_unlock(&JFS_IP(old_ip)->commit_mutex); + mutex_unlock(&JFS_IP(new_ip)->commit_mutex); if (old_dir != new_dir) mutex_unlock(&JFS_IP(old_dir)->commit_mutex); + mutex_unlock(&JFS_IP(old_ip)->commit_mutex); + mutex_unlock(&JFS_IP(new_dir)->commit_mutex); if (!S_ISDIR(old_ip->i_mode) && new_ip) IWRITE_UNLOCK(new_ip); jfs_error(new_ip->i_sb, @@ -1282,13 +1282,12 @@ static int jfs_rename(struct inode *old_dir, struct dentry *old_dentry, out4: txEnd(tid); - - mutex_unlock(&JFS_IP(new_dir)->commit_mutex); - mutex_unlock(&JFS_IP(old_ip)->commit_mutex); - if (old_dir != new_dir) - mutex_unlock(&JFS_IP(old_dir)->commit_mutex); if (new_ip) mutex_unlock(&JFS_IP(new_ip)->commit_mutex); + if (old_dir != new_dir) + mutex_unlock(&JFS_IP(old_dir)->commit_mutex); + mutex_unlock(&JFS_IP(old_ip)->commit_mutex); + mutex_unlock(&JFS_IP(new_dir)->commit_mutex); while (new_size && (rc == 0)) { tid = txBegin(new_ip->i_sb, 0); diff --git a/fs/jfs/super.c b/fs/jfs/super.c index 2d6c03d6d..b84a6ec0a 100644 --- a/fs/jfs/super.c +++ b/fs/jfs/super.c @@ -18,7 +18,6 @@ */ #include -#include #include #include #include @@ -27,6 +26,7 @@ #include #include #include +#include #include #include @@ -139,9 +139,9 @@ static void jfs_destroy_inode(struct inode *inode) kmem_cache_free(jfs_inode_cachep, ji); } -static int jfs_statfs(struct super_block *sb, struct kstatfs *buf) +static int jfs_statfs(struct dentry *dentry, struct kstatfs *buf) { - struct jfs_sb_info *sbi = JFS_SBI(sb); + struct jfs_sb_info *sbi = JFS_SBI(dentry->d_sb); s64 maxinodes; struct inomap *imap = JFS_IP(sbi->ipimap)->i_imap; @@ -301,7 +301,7 @@ static int parse_options(char *options, struct super_block *sb, s64 *newLVSize, break; } -#if defined(CONFIG_QUOTA) +#ifdef CONFIG_QUOTA case Opt_quota: case Opt_usrquota: *flag |= JFS_USRQUOTA; @@ -582,10 +582,11 @@ static void jfs_unlockfs(struct super_block *sb) } } -static struct super_block *jfs_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int jfs_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_bdev(fs_type, flags, dev_name, data, jfs_fill_super); + return get_sb_bdev(fs_type, flags, dev_name, data, jfs_fill_super, + mnt); } static int jfs_sync_fs(struct super_block *sb, int wait) @@ -614,7 +615,7 @@ static int jfs_show_options(struct seq_file *seq, struct vfsmount *vfs) if (sbi->flag & JFS_NOINTEGRITY) seq_puts(seq, ",nointegrity"); -#if defined(CONFIG_QUOTA) +#ifdef CONFIG_QUOTA if (sbi->flag & JFS_USRQUOTA) seq_puts(seq, ",usrquota"); @@ -625,6 +626,113 @@ static int jfs_show_options(struct seq_file *seq, struct vfsmount *vfs) return 0; } +#ifdef CONFIG_QUOTA + +/* Read data from quotafile - avoid pagecache and such because we cannot afford + * acquiring the locks... As quota files are never truncated and quota code + * itself serializes the operations (and noone else should touch the files) + * we don't have to be afraid of races */ +static ssize_t jfs_quota_read(struct super_block *sb, int type, char *data, + size_t len, loff_t off) +{ + struct inode *inode = sb_dqopt(sb)->files[type]; + sector_t blk = off >> sb->s_blocksize_bits; + int err = 0; + int offset = off & (sb->s_blocksize - 1); + int tocopy; + size_t toread; + struct buffer_head tmp_bh; + struct buffer_head *bh; + loff_t i_size = i_size_read(inode); + + if (off > i_size) + return 0; + if (off+len > i_size) + len = i_size-off; + toread = len; + while (toread > 0) { + tocopy = sb->s_blocksize - offset < toread ? + sb->s_blocksize - offset : toread; + + tmp_bh.b_state = 0; + tmp_bh.b_size = 1 << inode->i_blkbits; + err = jfs_get_block(inode, blk, &tmp_bh, 0); + if (err) + return err; + if (!buffer_mapped(&tmp_bh)) /* A hole? */ + memset(data, 0, tocopy); + else { + bh = sb_bread(sb, tmp_bh.b_blocknr); + if (!bh) + return -EIO; + memcpy(data, bh->b_data+offset, tocopy); + brelse(bh); + } + offset = 0; + toread -= tocopy; + data += tocopy; + blk++; + } + return len; +} + +/* Write to quotafile */ +static ssize_t jfs_quota_write(struct super_block *sb, int type, + const char *data, size_t len, loff_t off) +{ + struct inode *inode = sb_dqopt(sb)->files[type]; + sector_t blk = off >> sb->s_blocksize_bits; + int err = 0; + int offset = off & (sb->s_blocksize - 1); + int tocopy; + size_t towrite = len; + struct buffer_head tmp_bh; + struct buffer_head *bh; + + mutex_lock(&inode->i_mutex); + while (towrite > 0) { + tocopy = sb->s_blocksize - offset < towrite ? + sb->s_blocksize - offset : towrite; + + tmp_bh.b_state = 0; + tmp_bh.b_size = 1 << inode->i_blkbits; + err = jfs_get_block(inode, blk, &tmp_bh, 1); + if (err) + goto out; + if (offset || tocopy != sb->s_blocksize) + bh = sb_bread(sb, tmp_bh.b_blocknr); + else + bh = sb_getblk(sb, tmp_bh.b_blocknr); + if (!bh) { + err = -EIO; + goto out; + } + lock_buffer(bh); + memcpy(bh->b_data+offset, data, tocopy); + flush_dcache_page(bh->b_page); + set_buffer_uptodate(bh); + mark_buffer_dirty(bh); + unlock_buffer(bh); + brelse(bh); + offset = 0; + towrite -= tocopy; + data += tocopy; + blk++; + } +out: + if (len == towrite) + return err; + if (inode->i_size < off+len-towrite) + i_size_write(inode, off+len-towrite); + inode->i_version++; + inode->i_mtime = inode->i_ctime = CURRENT_TIME; + mark_inode_dirty(inode); + mutex_unlock(&inode->i_mutex); + return len - towrite; +} + +#endif + static struct super_operations jfs_super_operations = { .alloc_inode = jfs_alloc_inode, .destroy_inode = jfs_destroy_inode, @@ -638,7 +746,11 @@ static struct super_operations jfs_super_operations = { .unlockfs = jfs_unlockfs, .statfs = jfs_statfs, .remount_fs = jfs_remount, - .show_options = jfs_show_options + .show_options = jfs_show_options, +#ifdef CONFIG_QUOTA + .quota_read = jfs_quota_read, + .quota_write = jfs_quota_write, +#endif }; static struct export_operations jfs_export_operations = { diff --git a/fs/libfs.c b/fs/libfs.c index 26e627b59..16b38b189 100644 --- a/fs/libfs.c +++ b/fs/libfs.c @@ -20,9 +20,9 @@ int simple_getattr(struct vfsmount *mnt, struct dentry *dentry, return 0; } -int simple_statfs(struct super_block *sb, struct kstatfs *buf) +int simple_statfs(struct dentry *dentry, struct kstatfs *buf) { - buf->f_type = sb->s_magic; + buf->f_type = dentry->d_sb->s_magic; buf->f_bsize = PAGE_CACHE_SIZE; buf->f_namelen = NAME_MAX; return 0; @@ -150,10 +150,9 @@ static inline int do_dcache_readdir_filter(struct file * filp, /* fallthrough */ default: spin_lock(&dcache_lock); - if (filp->f_pos == 2) { - list_del(q); - list_add(q, &dentry->d_subdirs); - } + if (filp->f_pos == 2) + list_move(q, &dentry->d_subdirs); + for (p=q->next; p != &dentry->d_subdirs; p=p->next) { struct dentry *next; next = list_entry(p, struct dentry, d_u.d_child); @@ -167,8 +166,7 @@ static inline int do_dcache_readdir_filter(struct file * filp, return 0; spin_lock(&dcache_lock); /* next is still alive */ - list_del(q); - list_add(q, p); + list_move(q, p); p = q; filp->f_pos++; } @@ -211,9 +209,9 @@ struct inode_operations simple_dir_inode_operations = { * Common helper for pseudo-filesystems (sockfs, pipefs, bdev - stuff that * will never be mountable) */ -struct super_block * -get_sb_pseudo(struct file_system_type *fs_type, char *name, - struct super_operations *ops, unsigned long magic) +int get_sb_pseudo(struct file_system_type *fs_type, char *name, + struct super_operations *ops, unsigned long magic, + struct vfsmount *mnt) { struct super_block *s = sget(fs_type, NULL, set_anon_super, NULL); static struct super_operations default_ops = {.statfs = simple_statfs}; @@ -222,7 +220,7 @@ get_sb_pseudo(struct file_system_type *fs_type, char *name, struct qstr d_name = {.name = name, .len = strlen(name)}; if (IS_ERR(s)) - return s; + return PTR_ERR(s); s->s_flags = MS_NOUSER; s->s_maxbytes = ~0ULL; @@ -247,12 +245,12 @@ get_sb_pseudo(struct file_system_type *fs_type, char *name, d_instantiate(dentry, root); s->s_root = dentry; s->s_flags |= MS_ACTIVE; - return s; + return simple_set_mnt(mnt, s); Enomem: up_write(&s->s_umount); deactivate_super(s); - return ERR_PTR(-ENOMEM); + return -ENOMEM; } int simple_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry) @@ -400,7 +398,6 @@ int simple_fill_super(struct super_block *s, int magic, struct tree_descr *files return -ENOMEM; inode->i_mode = S_IFDIR | 0755; inode->i_uid = inode->i_gid = 0; - inode->i_blksize = PAGE_CACHE_SIZE; inode->i_blocks = 0; inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; inode->i_op = &simple_dir_inode_operations; @@ -422,7 +419,6 @@ int simple_fill_super(struct super_block *s, int magic, struct tree_descr *files goto out; inode->i_mode = S_IFREG | files->mode; inode->i_uid = inode->i_gid = 0; - inode->i_blksize = PAGE_CACHE_SIZE; inode->i_blocks = 0; inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; inode->i_fop = files->ops; @@ -439,13 +435,13 @@ out: static DEFINE_SPINLOCK(pin_fs_lock); -int simple_pin_fs(char *name, struct vfsmount **mount, int *count) +int simple_pin_fs(struct file_system_type *type, struct vfsmount **mount, int *count) { struct vfsmount *mnt = NULL; spin_lock(&pin_fs_lock); if (unlikely(!*mount)) { spin_unlock(&pin_fs_lock); - mnt = do_kern_mount(name, 0, name, NULL); + mnt = vfs_kern_mount(type, 0, type->name, NULL); if (IS_ERR(mnt)) return PTR_ERR(mnt); spin_lock(&pin_fs_lock); @@ -564,7 +560,7 @@ int simple_attr_open(struct inode *inode, struct file *file, attr->get = get; attr->set = set; - attr->data = inode->u.generic_ip; + attr->data = inode->i_private; attr->fmt = fmt; mutex_init(&attr->mutex); diff --git a/fs/lockd/clntlock.c b/fs/lockd/clntlock.c index bce744468..52774feab 100644 --- a/fs/lockd/clntlock.c +++ b/fs/lockd/clntlock.c @@ -147,11 +147,10 @@ u32 nlmclnt_grant(const struct sockaddr_in *addr, const struct nlm_lock *lock) * Someone has sent us an SM_NOTIFY. Ensure we bind to the new port number, * that we mark locks for reclaiming, and that we bump the pseudo NSM state. */ -static inline -void nlmclnt_prepare_reclaim(struct nlm_host *host, u32 newstate) +static void nlmclnt_prepare_reclaim(struct nlm_host *host) { + down_write(&host->h_rwsem); host->h_monitored = 0; - host->h_nsmstate = newstate; host->h_state++; host->h_nextrebind = 0; nlm_rebind_host(host); @@ -164,6 +163,13 @@ void nlmclnt_prepare_reclaim(struct nlm_host *host, u32 newstate) dprintk("NLM: reclaiming locks for host %s", host->h_name); } +static void nlmclnt_finish_reclaim(struct nlm_host *host) +{ + host->h_reclaiming = 0; + up_write(&host->h_rwsem); + dprintk("NLM: done reclaiming locks for host %s", host->h_name); +} + /* * Reclaim all locks on server host. We do this by spawning a separate * reclaimer thread. @@ -171,12 +177,10 @@ void nlmclnt_prepare_reclaim(struct nlm_host *host, u32 newstate) void nlmclnt_recovery(struct nlm_host *host, u32 newstate) { - if (host->h_reclaiming++) { - if (host->h_nsmstate == newstate) - return; - nlmclnt_prepare_reclaim(host, newstate); - } else { - nlmclnt_prepare_reclaim(host, newstate); + if (host->h_nsmstate == newstate) + return; + host->h_nsmstate = newstate; + if (!host->h_reclaiming++) { nlm_get_host(host); __module_get(THIS_MODULE); if (kernel_thread(reclaimer, host, CLONE_KERNEL) < 0) @@ -190,6 +194,7 @@ reclaimer(void *ptr) struct nlm_host *host = (struct nlm_host *) ptr; struct nlm_wait *block; struct file_lock *fl, *next; + u32 nsmstate; daemonize("%s-reclaim", host->h_name); allow_signal(SIGKILL); @@ -199,19 +204,25 @@ reclaimer(void *ptr) lock_kernel(); lockd_up(); + nlmclnt_prepare_reclaim(host); /* First, reclaim all locks that have been marked. */ restart: + nsmstate = host->h_nsmstate; list_for_each_entry_safe(fl, next, &host->h_reclaim, fl_u.nfs_fl.list) { list_del_init(&fl->fl_u.nfs_fl.list); if (signalled()) continue; - if (nlmclnt_reclaim(host, fl) == 0) - list_add_tail(&fl->fl_u.nfs_fl.list, &host->h_granted); - goto restart; + if (nlmclnt_reclaim(host, fl) != 0) + continue; + list_add_tail(&fl->fl_u.nfs_fl.list, &host->h_granted); + if (host->h_nsmstate != nsmstate) { + /* Argh! The server rebooted again! */ + list_splice_init(&host->h_granted, &host->h_reclaim); + goto restart; + } } - - host->h_reclaiming = 0; + nlmclnt_finish_reclaim(host); /* Now, wake up all processes that sleep on a blocked lock */ list_for_each_entry(block, &nlm_blocked, b_list) { diff --git a/fs/lockd/clntproc.c b/fs/lockd/clntproc.c index ece5c5a2f..7db2eea3f 100644 --- a/fs/lockd/clntproc.c +++ b/fs/lockd/clntproc.c @@ -6,7 +6,6 @@ * Copyright (C) 1996, Olaf Kirch */ -#include #include #include #include @@ -456,7 +455,7 @@ static void nlmclnt_locks_init_private(struct file_lock *fl, struct nlm_host *ho fl->fl_ops = &nlmclnt_lock_ops; } -static void do_vfs_lock(struct file_lock *fl) +static int do_vfs_lock(struct file_lock *fl) { int res = 0; switch (fl->fl_flags & (FL_POSIX|FL_FLOCK)) { @@ -469,9 +468,7 @@ static void do_vfs_lock(struct file_lock *fl) default: BUG(); } - if (res < 0) - printk(KERN_WARNING "%s: VFS is out of sync with lock manager!\n", - __FUNCTION__); + return res; } /* @@ -500,6 +497,7 @@ nlmclnt_lock(struct nlm_rqst *req, struct file_lock *fl) struct nlm_host *host = req->a_host; struct nlm_res *resp = &req->a_res; struct nlm_wait *block = NULL; + unsigned char fl_flags = fl->fl_flags; int status = -ENOLCK; if (!host->h_monitored && nsm_monitor(host) < 0) { @@ -507,9 +505,16 @@ nlmclnt_lock(struct nlm_rqst *req, struct file_lock *fl) host->h_name); goto out; } + fl->fl_flags |= FL_ACCESS; + status = do_vfs_lock(fl); + if (status < 0) + goto out; block = nlmclnt_prepare_block(host, fl); +again: for(;;) { + /* Reboot protection */ + fl->fl_u.nfs_fl.state = host->h_state; status = nlmclnt_call(req, NLMPROC_LOCK); if (status < 0) goto out_unblock; @@ -532,10 +537,17 @@ nlmclnt_lock(struct nlm_rqst *req, struct file_lock *fl) } if (resp->status == NLM_LCK_GRANTED) { - fl->fl_u.nfs_fl.state = host->h_state; - fl->fl_flags |= FL_SLEEP; + down_read(&host->h_rwsem); + /* Check whether or not the server has rebooted */ + if (fl->fl_u.nfs_fl.state != host->h_state) { + up_read(&host->h_rwsem); + goto again; + } /* Ensure the resulting lock will get added to granted list */ - do_vfs_lock(fl); + fl->fl_flags = fl_flags | FL_SLEEP; + if (do_vfs_lock(fl) < 0) + printk(KERN_WARNING "%s: VFS is out of sync with lock manager!\n", __FUNCTION__); + up_read(&host->h_rwsem); } status = nlm_stat_to_errno(resp->status); out_unblock: @@ -545,6 +557,7 @@ out_unblock: nlmclnt_cancel(host, req->a_args.block, fl); out: nlm_release_call(req); + fl->fl_flags = fl_flags; return status; } @@ -597,15 +610,22 @@ nlmclnt_reclaim(struct nlm_host *host, struct file_lock *fl) static int nlmclnt_unlock(struct nlm_rqst *req, struct file_lock *fl) { + struct nlm_host *host = req->a_host; struct nlm_res *resp = &req->a_res; - int status; + int status = 0; /* * Note: the server is supposed to either grant us the unlock * request, or to deny it with NLM_LCK_DENIED_GRACE_PERIOD. In either * case, we want to unlock. */ - do_vfs_lock(fl); + fl->fl_flags |= FL_EXISTS; + down_read(&host->h_rwsem); + if (do_vfs_lock(fl) == -ENOENT) { + up_read(&host->h_rwsem); + goto out; + } + up_read(&host->h_rwsem); if (req->a_flags & RPC_TASK_ASYNC) return nlm_async_call(req, NLMPROC_UNLOCK, &nlmclnt_unlock_ops); @@ -614,7 +634,6 @@ nlmclnt_unlock(struct nlm_rqst *req, struct file_lock *fl) if (status < 0) goto out; - status = 0; if (resp->status == NLM_LCK_GRANTED) goto out; diff --git a/fs/lockd/host.c b/fs/lockd/host.c index 729ac427d..38b0e8a1a 100644 --- a/fs/lockd/host.c +++ b/fs/lockd/host.c @@ -112,11 +112,12 @@ nlm_lookup_host(int server, struct sockaddr_in *sin, host->h_version = version; host->h_proto = proto; host->h_rpcclnt = NULL; - init_MUTEX(&host->h_sema); + mutex_init(&host->h_mutex); host->h_nextrebind = jiffies + NLM_HOST_REBIND; host->h_expires = jiffies + NLM_HOST_EXPIRE; atomic_set(&host->h_count, 1); init_waitqueue_head(&host->h_gracewait); + init_rwsem(&host->h_rwsem); host->h_state = 0; /* pseudo NSM state */ host->h_nsmstate = 0; /* real NSM state */ host->h_server = server; @@ -172,7 +173,7 @@ nlm_bind_host(struct nlm_host *host) (unsigned)ntohl(host->h_addr.sin_addr.s_addr)); /* Lock host handle */ - down(&host->h_sema); + mutex_lock(&host->h_mutex); /* If we've already created an RPC client, check whether * RPC rebind is required @@ -204,12 +205,12 @@ nlm_bind_host(struct nlm_host *host) host->h_rpcclnt = clnt; } - up(&host->h_sema); + mutex_unlock(&host->h_mutex); return clnt; forgetit: printk("lockd: couldn't create RPC handle for %s\n", host->h_name); - up(&host->h_sema); + mutex_unlock(&host->h_mutex); return NULL; } diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c index fdb941215..a945261fa 100644 --- a/fs/lockd/svc.c +++ b/fs/lockd/svc.c @@ -12,7 +12,6 @@ * Copyright (C) 1995, 1996 Olaf Kirch */ -#include #include #include #include diff --git a/fs/lockd/svclock.c b/fs/lockd/svclock.c index 3ef739120..c9d419703 100644 --- a/fs/lockd/svclock.c +++ b/fs/lockd/svclock.c @@ -20,7 +20,6 @@ * Copyright (C) 1996, Olaf Kirch */ -#include #include #include #include @@ -639,9 +638,6 @@ static void nlmsvc_grant_callback(struct rpc_task *task, void *data) if (task->tk_status < 0) { /* RPC error: Re-insert for retransmission */ timeout = 10 * HZ; - } else if (block->b_done) { - /* Block already removed, kill it for real */ - timeout = 0; } else { /* Call was successful, now wait for client callback */ timeout = 60 * HZ; @@ -710,13 +706,10 @@ nlmsvc_retry_blocked(void) break; if (time_after(block->b_when,jiffies)) break; - dprintk("nlmsvc_retry_blocked(%p, when=%ld, done=%d)\n", - block, block->b_when, block->b_done); + dprintk("nlmsvc_retry_blocked(%p, when=%ld)\n", + block, block->b_when); kref_get(&block->b_count); - if (block->b_done) - nlmsvc_unlink_block(block); - else - nlmsvc_grant_blocked(block); + nlmsvc_grant_blocked(block); nlmsvc_release_block(block); } diff --git a/fs/lockd/svcproc.c b/fs/lockd/svcproc.c index d210cf304..dbb66a3b5 100644 --- a/fs/lockd/svcproc.c +++ b/fs/lockd/svcproc.c @@ -7,7 +7,6 @@ * Copyright (C) 1996, Olaf Kirch */ -#include #include #include #include diff --git a/fs/lockd/svcsubs.c b/fs/lockd/svcsubs.c index a570e5c8a..01b4db9e5 100644 --- a/fs/lockd/svcsubs.c +++ b/fs/lockd/svcsubs.c @@ -6,7 +6,6 @@ * Copyright (C) 1996, Olaf Kirch */ -#include #include #include #include @@ -238,19 +237,22 @@ static int nlm_traverse_files(struct nlm_host *host, int action) { struct nlm_file *file, **fp; - int i; + int i, ret = 0; mutex_lock(&nlm_file_mutex); for (i = 0; i < FILE_NRHASH; i++) { fp = nlm_files + i; while ((file = *fp) != NULL) { + file->f_count++; + mutex_unlock(&nlm_file_mutex); + /* Traverse locks, blocks and shares of this file * and update file->f_locks count */ - if (nlm_inspect_file(host, file, action)) { - mutex_unlock(&nlm_file_mutex); - return 1; - } + if (nlm_inspect_file(host, file, action)) + ret = 1; + mutex_lock(&nlm_file_mutex); + file->f_count--; /* No more references to this file. Let go of it. */ if (!file->f_blocks && !file->f_locks && !file->f_shares && !file->f_count) { @@ -263,7 +265,7 @@ nlm_traverse_files(struct nlm_host *host, int action) } } mutex_unlock(&nlm_file_mutex); - return 0; + return ret; } /* diff --git a/fs/lockd/xdr.c b/fs/lockd/xdr.c index f22a37644..033ea4ac2 100644 --- a/fs/lockd/xdr.c +++ b/fs/lockd/xdr.c @@ -6,7 +6,6 @@ * Copyright (C) 1995, 1996 Olaf Kirch */ -#include #include #include #include diff --git a/fs/locks.c b/fs/locks.c index 718983409..af50ed20d 100644 --- a/fs/locks.c +++ b/fs/locks.c @@ -715,7 +715,7 @@ EXPORT_SYMBOL(posix_test_lock); * from a broken NFS client. But broken NFS clients have a lot more to * worry about than proper deadlock detection anyway... --okir */ -int posix_locks_deadlock(struct file_lock *caller_fl, +static int posix_locks_deadlock(struct file_lock *caller_fl, struct file_lock *block_fl) { struct list_head *tmp; @@ -734,11 +734,13 @@ next_task: return 0; } -EXPORT_SYMBOL(posix_locks_deadlock); - /* Try to create a FLOCK lock on filp. We always insert new FLOCK locks * at the head of the list, but that's secret knowledge known only to * flock_lock_file and posix_lock_file. + * + * Note that if called with an FL_EXISTS argument, the caller may determine + * whether or not a lock was successfully freed by testing the return + * value for -ENOENT. */ static int flock_lock_file(struct file *filp, struct file_lock *request) { @@ -749,6 +751,8 @@ static int flock_lock_file(struct file *filp, struct file_lock *request) int found = 0; lock_kernel(); + if (request->fl_flags & FL_ACCESS) + goto find_conflict; for_each_lock(inode, before) { struct file_lock *fl = *before; if (IS_POSIX(fl)) @@ -764,8 +768,11 @@ static int flock_lock_file(struct file *filp, struct file_lock *request) break; } - if (request->fl_type == F_UNLCK) + if (request->fl_type == F_UNLCK) { + if ((request->fl_flags & FL_EXISTS) && !found) + error = -ENOENT; goto out; + } error = -ENOMEM; new_fl = locks_alloc_lock(); @@ -778,6 +785,7 @@ static int flock_lock_file(struct file *filp, struct file_lock *request) if (found) cond_resched(); +find_conflict: for_each_lock(inode, before) { struct file_lock *fl = *before; if (IS_POSIX(fl)) @@ -791,6 +799,8 @@ static int flock_lock_file(struct file *filp, struct file_lock *request) locks_insert_block(fl, request); goto out; } + if (request->fl_flags & FL_ACCESS) + goto out; locks_copy_lock(new_fl, request); vx_locks_inc(new_fl); locks_insert_lock(&inode->i_flock, new_fl); @@ -808,7 +818,8 @@ static int __posix_lock_file_conf(struct inode *inode, struct file_lock *request struct file_lock *conflock, xid_t xid) { struct file_lock *fl; - struct file_lock *new_fl, *new_fl2; + struct file_lock *new_fl = NULL; + struct file_lock *new_fl2 = NULL; struct file_lock *left = NULL; struct file_lock *right = NULL; struct file_lock **before; @@ -817,13 +828,19 @@ static int __posix_lock_file_conf(struct inode *inode, struct file_lock *request /* * We may need two file_lock structures for this operation, * so we get them in advance to avoid races. + * + * In some cases we can be sure, that no new locks will be needed */ - new_fl = locks_alloc_lock(); - new_fl->fl_xid = xid; - vx_locks_inc(new_fl); - new_fl2 = locks_alloc_lock(); - new_fl2->fl_xid = xid; - vx_locks_inc(new_fl2); + if (!(request->fl_flags & FL_ACCESS) && + (request->fl_type != F_UNLCK || + request->fl_start != 0 || request->fl_end != OFFSET_MAX)) { + new_fl = locks_alloc_lock(); + new_fl->fl_xid = xid; + vx_locks_inc(new_fl); + new_fl2 = locks_alloc_lock(); + new_fl2->fl_xid = xid; + vx_locks_inc(new_fl2); + } lock_kernel(); if (request->fl_type != F_UNLCK) { @@ -852,14 +869,7 @@ static int __posix_lock_file_conf(struct inode *inode, struct file_lock *request if (request->fl_flags & FL_ACCESS) goto out; - error = -ENOLCK; /* "no luck" */ - if (!(new_fl && new_fl2)) - goto out; - /* - * We've allocated the new locks in advance, so there are no - * errors possible (and no blocking operations) from here on. - * * Find the first old lock with the same owner as the new lock. */ @@ -956,10 +966,28 @@ static int __posix_lock_file_conf(struct inode *inode, struct file_lock *request before = &fl->fl_next; } + /* + * The above code only modifies existing locks in case of + * merging or replacing. If new lock(s) need to be inserted + * all modifications are done bellow this, so it's safe yet to + * bail out. + */ + error = -ENOLCK; /* "no luck" */ + if (right && left == right && !new_fl2) + goto out; + error = 0; if (!added) { - if (request->fl_type == F_UNLCK) + if (request->fl_type == F_UNLCK) { + if (request->fl_flags & FL_EXISTS) + error = -ENOENT; goto out; + } + + if (!new_fl) { + error = -ENOLCK; + goto out; + } locks_copy_lock(new_fl, request); locks_insert_lock(before, new_fl); new_fl = NULL; @@ -1001,6 +1029,10 @@ static int __posix_lock_file_conf(struct inode *inode, struct file_lock *request * Add a POSIX style lock to a file. * We merge adjacent & overlapping locks whenever possible. * POSIX locks are sorted by owner task, then by starting address + * + * Note that if called with an FL_EXISTS argument, the caller may determine + * whether or not a lock was successfully freed by testing the return + * value for -ENOENT. */ int posix_lock_file(struct file *filp, struct file_lock *fl) { @@ -1909,19 +1941,18 @@ out: */ void locks_remove_posix(struct file *filp, fl_owner_t owner) { - struct file_lock lock, **before; + struct file_lock lock; /* * If there are no locks held on this file, we don't need to call * posix_lock_file(). Another process could be setting a lock on this * file at the same time, but we wouldn't remove that lock anyway. */ - before = &filp->f_dentry->d_inode->i_flock; - if (*before == NULL) + if (!filp->f_dentry->d_inode->i_flock) return; lock.fl_type = F_UNLCK; - lock.fl_flags = FL_POSIX; + lock.fl_flags = FL_POSIX | FL_CLOSE; lock.fl_start = 0; lock.fl_end = OFFSET_MAX; lock.fl_owner = owner; @@ -1930,25 +1961,11 @@ void locks_remove_posix(struct file *filp, fl_owner_t owner) lock.fl_ops = NULL; lock.fl_lmops = NULL; - if (filp->f_op && filp->f_op->lock != NULL) { + if (filp->f_op && filp->f_op->lock != NULL) filp->f_op->lock(filp, F_SETLK, &lock); - goto out; - } + else + posix_lock_file(filp, &lock); - /* Can't use posix_lock_file here; we need to remove it no matter - * which pid we have. - */ - lock_kernel(); - while (*before != NULL) { - struct file_lock *fl = *before; - if (IS_POSIX(fl) && posix_same_owner(fl, &lock)) { - locks_delete_lock(before); - continue; - } - before = &fl->fl_next; - } - unlock_kernel(); -out: if (lock.fl_ops && lock.fl_ops->fl_release_private) lock.fl_ops->fl_release_private(&lock); } @@ -2238,63 +2255,6 @@ int lock_may_write(struct inode *inode, loff_t start, unsigned long len) EXPORT_SYMBOL(lock_may_write); -static inline void __steal_locks(struct file *file, fl_owner_t from) -{ - struct inode *inode = file->f_dentry->d_inode; - struct file_lock *fl = inode->i_flock; - - while (fl) { - if (fl->fl_file == file && fl->fl_owner == from) - fl->fl_owner = current->files; - fl = fl->fl_next; - } -} - -/* When getting ready for executing a binary, we make sure that current - * has a files_struct on its own. Before dropping the old files_struct, - * we take over ownership of all locks for all file descriptors we own. - * Note that we may accidentally steal a lock for a file that a sibling - * has created since the unshare_files() call. - */ -void steal_locks(fl_owner_t from) -{ - struct files_struct *files = current->files; - int i, j; - struct fdtable *fdt; - - if (from == files) - return; - - lock_kernel(); - j = 0; - - /* - * We are not taking a ref to the file structures, so - * we need to acquire ->file_lock. - */ - spin_lock(&files->file_lock); - fdt = files_fdtable(files); - for (;;) { - unsigned long set; - i = j * __NFDBITS; - if (i >= fdt->max_fdset || i >= fdt->max_fds) - break; - set = fdt->open_fds->fds_bits[j++]; - while (set) { - if (set & 1) { - struct file *file = fdt->fd[i]; - if (file) - __steal_locks(file, from); - } - i++; - set >>= 1; - } - } - spin_unlock(&files->file_lock); - unlock_kernel(); -} -EXPORT_SYMBOL(steal_locks); - static int __init filelock_init(void) { filelock_cache = kmem_cache_create("file_lock_cache", diff --git a/fs/minix/bitmap.c b/fs/minix/bitmap.c index 4a6abc494..df6b1075b 100644 --- a/fs/minix/bitmap.c +++ b/fs/minix/bitmap.c @@ -254,7 +254,7 @@ struct inode * minix_new_inode(const struct inode * dir, int * error) inode->i_gid = (dir->i_mode & S_ISGID) ? dir->i_gid : current->fsgid; inode->i_ino = j; inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC; - inode->i_blocks = inode->i_blksize = 0; + inode->i_blocks = 0; memset(&minix_i(inode)->u, 0, sizeof(minix_i(inode)->u)); insert_inode_hash(inode); mark_inode_dirty(inode); diff --git a/fs/minix/dir.c b/fs/minix/dir.c index 69224d1fe..2b0a389d1 100644 --- a/fs/minix/dir.c +++ b/fs/minix/dir.c @@ -60,8 +60,7 @@ static int dir_commit_chunk(struct page *page, unsigned from, unsigned to) static struct page * dir_get_page(struct inode *dir, unsigned long n) { struct address_space *mapping = dir->i_mapping; - struct page *page = read_cache_page(mapping, n, - (filler_t*)mapping->a_ops->readpage, NULL); + struct page *page = read_mapping_page(mapping, n, NULL); if (!IS_ERR(page)) { wait_on_page_locked(page); kmap(page); diff --git a/fs/minix/inode.c b/fs/minix/inode.c index 2dcccf1d1..f8c7b026f 100644 --- a/fs/minix/inode.c +++ b/fs/minix/inode.c @@ -19,7 +19,7 @@ static void minix_read_inode(struct inode * inode); static int minix_write_inode(struct inode * inode, int wait); -static int minix_statfs(struct super_block *sb, struct kstatfs *buf); +static int minix_statfs(struct dentry *dentry, struct kstatfs *buf); static int minix_remount (struct super_block * sb, int * flags, char * data); static void minix_delete_inode(struct inode *inode) @@ -204,6 +204,8 @@ static int minix_fill_super(struct super_block *s, void *data, int silent) /* * Allocate the buffer map to keep the superblock small. */ + if (sbi->s_imap_blocks == 0 || sbi->s_zmap_blocks == 0) + goto out_illegal_sb; i = (sbi->s_imap_blocks + sbi->s_zmap_blocks) * sizeof(bh); map = kmalloc(i, GFP_KERNEL); if (!map) @@ -263,7 +265,7 @@ out_no_root: out_no_bitmap: printk("MINIX-fs: bad superblock or unable to read bitmaps\n"); - out_freemap: +out_freemap: for (i = 0; i < sbi->s_imap_blocks; i++) brelse(sbi->s_imap[i]); for (i = 0; i < sbi->s_zmap_blocks; i++) @@ -276,11 +278,16 @@ out_no_map: printk("MINIX-fs: can't allocate map\n"); goto out_release; +out_illegal_sb: + if (!silent) + printk("MINIX-fs: bad superblock\n"); + goto out_release; + out_no_fs: if (!silent) printk("VFS: Can't find a Minix or Minix V2 filesystem " "on device %s\n", s->s_id); - out_release: +out_release: brelse(bh); goto out; @@ -290,17 +297,17 @@ out_bad_hblock: out_bad_sb: printk("MINIX-fs: unable to read superblock\n"); - out: +out: s->s_fs_info = NULL; kfree(sbi); return -EINVAL; } -static int minix_statfs(struct super_block *sb, struct kstatfs *buf) +static int minix_statfs(struct dentry *dentry, struct kstatfs *buf) { - struct minix_sb_info *sbi = minix_sb(sb); - buf->f_type = sb->s_magic; - buf->f_bsize = sb->s_blocksize; + struct minix_sb_info *sbi = minix_sb(dentry->d_sb); + buf->f_type = dentry->d_sb->s_magic; + buf->f_bsize = dentry->d_sb->s_blocksize; buf->f_blocks = (sbi->s_nzones - sbi->s_firstdatazone) << sbi->s_log_zone_size; buf->f_bfree = minix_count_free_blocks(sbi); buf->f_bavail = buf->f_bfree; @@ -335,7 +342,7 @@ static sector_t minix_bmap(struct address_space *mapping, sector_t block) { return generic_block_bmap(mapping,block,minix_get_block); } -static struct address_space_operations minix_aops = { +static const struct address_space_operations minix_aops = { .readpage = minix_readpage, .writepage = minix_writepage, .sync_page = block_sync_page, @@ -392,7 +399,7 @@ static void V1_minix_read_inode(struct inode * inode) inode->i_mtime.tv_nsec = 0; inode->i_atime.tv_nsec = 0; inode->i_ctime.tv_nsec = 0; - inode->i_blocks = inode->i_blksize = 0; + inode->i_blocks = 0; for (i = 0; i < 9; i++) minix_inode->u.i1_data[i] = raw_inode->i_zone[i]; minix_set_inode(inode, old_decode_dev(raw_inode->i_zone[0])); @@ -425,7 +432,7 @@ static void V2_minix_read_inode(struct inode * inode) inode->i_mtime.tv_nsec = 0; inode->i_atime.tv_nsec = 0; inode->i_ctime.tv_nsec = 0; - inode->i_blocks = inode->i_blksize = 0; + inode->i_blocks = 0; for (i = 0; i < 10; i++) minix_inode->u.i2_data[i] = raw_inode->i_zone[i]; minix_set_inode(inode, old_decode_dev(raw_inode->i_zone[0])); @@ -559,10 +566,11 @@ void minix_truncate(struct inode * inode) V2_minix_truncate(inode); } -static struct super_block *minix_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int minix_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_bdev(fs_type, flags, dev_name, data, minix_fill_super); + return get_sb_bdev(fs_type, flags, dev_name, data, minix_fill_super, + mnt); } static struct file_system_type minix_fs_type = { diff --git a/fs/mpage.c b/fs/mpage.c index 9bf2eb30e..1e4598247 100644 --- a/fs/mpage.c +++ b/fs/mpage.c @@ -707,9 +707,9 @@ mpage_writepages(struct address_space *mapping, struct pagevec pvec; int nr_pages; pgoff_t index; - pgoff_t end = -1; /* Inclusive */ + pgoff_t end; /* Inclusive */ int scanned = 0; - int is_range = 0; + int range_whole = 0; if (wbc->nonblocking && bdi_write_congested(bdi)) { wbc->encountered_congestion = 1; @@ -721,16 +721,14 @@ mpage_writepages(struct address_space *mapping, writepage = mapping->a_ops->writepage; pagevec_init(&pvec, 0); - if (wbc->sync_mode == WB_SYNC_NONE) { + if (wbc->range_cyclic) { index = mapping->writeback_index; /* Start from prev offset */ + end = -1; } else { - index = 0; /* whole-file sweep */ - scanned = 1; - } - if (wbc->start || wbc->end) { - index = wbc->start >> PAGE_CACHE_SHIFT; - end = wbc->end >> PAGE_CACHE_SHIFT; - is_range = 1; + index = wbc->range_start >> PAGE_CACHE_SHIFT; + end = wbc->range_end >> PAGE_CACHE_SHIFT; + if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX) + range_whole = 1; scanned = 1; } retry: @@ -759,7 +757,7 @@ retry: continue; } - if (unlikely(is_range) && page->index > end) { + if (!wbc->range_cyclic && page->index > end) { done = 1; unlock_page(page); continue; @@ -810,7 +808,7 @@ retry: index = 0; goto retry; } - if (!is_range) + if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0)) mapping->writeback_index = index; if (bio) mpage_bio_submit(WRITE, bio); diff --git a/fs/msdos/namei.c b/fs/msdos/namei.c index 5b76ccd19..9e44158a7 100644 --- a/fs/msdos/namei.c +++ b/fs/msdos/namei.c @@ -661,11 +661,12 @@ static int msdos_fill_super(struct super_block *sb, void *data, int silent) return 0; } -static struct super_block *msdos_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, - void *data) +static int msdos_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, + void *data, struct vfsmount *mnt) { - return get_sb_bdev(fs_type, flags, dev_name, data, msdos_fill_super); + return get_sb_bdev(fs_type, flags, dev_name, data, msdos_fill_super, + mnt); } static struct file_system_type msdos_fs_type = { diff --git a/fs/namei.c b/fs/namei.c index 75649bf3e..9fe85185a 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -162,7 +162,7 @@ char * getname(const char __user * filename) #ifdef CONFIG_AUDITSYSCALL void putname(const char *name) { - if (unlikely(current->audit_context)) + if (unlikely(!audit_dummy_context())) audit_putname(name); else __putname(name); @@ -263,10 +263,10 @@ static inline int xid_permission(struct inode *inode, int mask, struct nameidata int permission(struct inode *inode, int mask, struct nameidata *nd) { + umode_t mode = inode->i_mode; int retval, submask; if (mask & MAY_WRITE) { - umode_t mode = inode->i_mode; /* * Nobody gets write access to a read-only fs. @@ -283,6 +283,13 @@ int permission(struct inode *inode, int mask, struct nameidata *nd) } + /* + * MAY_EXEC on regular files requires special handling: We override + * filesystem execute permissions if the mode bits aren't set. + */ + if ((mask & MAY_EXEC) && S_ISREG(mode) && !(mode & S_IXUGO)) + return -EACCES; + /* Ordinary permission routines do not understand MAY_APPEND. */ submask = mask & ~MAY_APPEND; if ((retval = xid_permission(inode, mask, nd))) @@ -403,6 +410,29 @@ void release_open_intent(struct nameidata *nd) fput(nd->intent.open.file); } +static inline struct dentry *do_revalidate(struct dentry *dentry, struct nameidata *nd) +{ + int status = dentry->d_op->d_revalidate(dentry, nd); + if (unlikely(status <= 0)) { + /* + * The dentry failed validation. + * If d_revalidate returned 0 attempt to invalidate + * the dentry otherwise d_revalidate is asking us + * to return a fail status. + */ + if (!status) { + if (!d_invalidate(dentry)) { + dput(dentry); + dentry = NULL; + } + } else { + dput(dentry); + dentry = ERR_PTR(status); + } + } + return dentry; +} + /* * Internal lookup() using the new generic dcache. * SMP-safe @@ -417,12 +447,9 @@ static struct dentry * cached_lookup(struct dentry * parent, struct qstr * name, if (!dentry) dentry = d_lookup(parent, name); - if (dentry && dentry->d_op && dentry->d_op->d_revalidate) { - if (!dentry->d_op->d_revalidate(dentry, nd) && !d_invalidate(dentry)) { - dput(dentry); - dentry = NULL; - } - } + if (dentry && dentry->d_op && dentry->d_op->d_revalidate) + dentry = do_revalidate(dentry, nd); + return dentry; } @@ -517,10 +544,9 @@ static struct dentry * real_lookup(struct dentry * parent, struct qstr * name, s */ mutex_unlock(&dir->i_mutex); if (result->d_op && result->d_op->d_revalidate) { - if (!result->d_op->d_revalidate(result, nd) && !d_invalidate(result)) { - dput(result); + result = do_revalidate(result, nd); + if (!result) result = ERR_PTR(-ENOENT); - } } return result; } @@ -833,12 +859,12 @@ need_lookup: need_revalidate: if (atomic) return -EWOULDBLOCKIO; - if (dentry->d_op->d_revalidate(dentry, nd)) - goto done; - if (d_invalidate(dentry)) - goto done; - dput(dentry); - goto need_lookup; + dentry = do_revalidate(dentry, nd); + if (!dentry) + goto need_lookup; + if (IS_ERR(dentry)) + goto fail; + goto done; fail: return PTR_ERR(dentry); @@ -1200,9 +1226,9 @@ static int fastcall do_path_lookup(int dfd, const char *name, retval = link_path_walk(name, nd); out: if (likely(retval == 0)) { - if (unlikely(current->audit_context && nd && nd->dentry && + if (unlikely(!audit_dummy_context() && nd && nd->dentry && nd->dentry->d_inode)) - audit_inode(name, nd->dentry->d_inode, flags); + audit_inode(name, nd->dentry->d_inode); } out_fail: return retval; @@ -1433,7 +1459,7 @@ static int may_delete(struct inode *dir, struct dentry *victim, return -ENOENT; BUG_ON(victim->d_parent->d_inode != dir); - audit_inode_child(victim->d_name.name, victim->d_inode, dir->i_ino); + audit_inode_child(victim->d_name.name, victim->d_inode, dir); error = permission(dir,MAY_WRITE | MAY_EXEC, nd); if (error) @@ -1501,7 +1527,7 @@ struct dentry *lock_rename(struct dentry *p1, struct dentry *p2) struct dentry *p; if (p1 == p2) { - mutex_lock(&p1->d_inode->i_mutex); + mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_PARENT); return NULL; } @@ -1509,22 +1535,22 @@ struct dentry *lock_rename(struct dentry *p1, struct dentry *p2) for (p = p1; p->d_parent != p; p = p->d_parent) { if (p->d_parent == p2) { - mutex_lock(&p2->d_inode->i_mutex); - mutex_lock(&p1->d_inode->i_mutex); + mutex_lock_nested(&p2->d_inode->i_mutex, I_MUTEX_PARENT); + mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_CHILD); return p; } } for (p = p2; p->d_parent != p; p = p->d_parent) { if (p->d_parent == p1) { - mutex_lock(&p1->d_inode->i_mutex); - mutex_lock(&p2->d_inode->i_mutex); + mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_PARENT); + mutex_lock_nested(&p2->d_inode->i_mutex, I_MUTEX_CHILD); return p; } } - mutex_lock(&p1->d_inode->i_mutex); - mutex_lock(&p2->d_inode->i_mutex); + mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_PARENT); + mutex_lock_nested(&p2->d_inode->i_mutex, I_MUTEX_CHILD); return NULL; } @@ -1738,6 +1764,7 @@ do_last: * It already exists. */ mutex_unlock(&dir->d_inode->i_mutex); + audit_inode_update(path.dentry->d_inode); error = -EEXIST; if (flag & O_EXCL) @@ -1748,6 +1775,7 @@ do_last: if (flag & O_NOFOLLOW) goto exit_dput; } + error = -ENOENT; if (!path.dentry->d_inode) goto exit_dput; @@ -1836,7 +1864,7 @@ struct dentry *lookup_create(struct nameidata *nd, int is_dir) { struct dentry *dentry = ERR_PTR(-EEXIST); - mutex_lock(&nd->dentry->d_inode->i_mutex); + mutex_lock_nested(&nd->dentry->d_inode->i_mutex, I_MUTEX_PARENT); /* * Yucky last component or no last component at all? * (foo/., foo/.., /////) @@ -1844,6 +1872,8 @@ struct dentry *lookup_create(struct nameidata *nd, int is_dir) if (nd->last_type != LAST_NORM) goto fail; nd->flags &= ~LOOKUP_PARENT; + nd->flags |= LOOKUP_CREATE; + nd->intent.open.flags = O_EXCL; /* * Do the final lookup. @@ -2098,7 +2128,7 @@ static long do_rmdir(int dfd, const char __user *pathname) error = -EBUSY; goto exit1; } - mutex_lock(&nd.dentry->d_inode->i_mutex); + mutex_lock_nested(&nd.dentry->d_inode->i_mutex, I_MUTEX_PARENT); dentry = lookup_hash(&nd); error = PTR_ERR(dentry); if (!IS_ERR(dentry)) { @@ -2173,7 +2203,7 @@ static long do_unlinkat(int dfd, const char __user *pathname) error = -EISDIR; if (nd.last_type != LAST_NORM) goto exit1; - mutex_lock(&nd.dentry->d_inode->i_mutex); + mutex_lock_nested(&nd.dentry->d_inode->i_mutex, I_MUTEX_PARENT); dentry = lookup_hash(&nd); error = PTR_ERR(dentry); if (!IS_ERR(dentry)) { @@ -2337,14 +2367,16 @@ asmlinkage long sys_linkat(int olddfd, const char __user *oldname, int error; char * to; - if (flags != 0) + if ((flags & ~AT_SYMLINK_FOLLOW) != 0) return -EINVAL; to = getname(newname); if (IS_ERR(to)) return PTR_ERR(to); - error = __user_walk_fd(olddfd, oldname, 0, &old_nd); + error = __user_walk_fd(olddfd, oldname, + flags & AT_SYMLINK_FOLLOW ? LOOKUP_FOLLOW : 0, + &old_nd); if (error) goto exit; error = do_path_lookup(newdfd, to, LOOKUP_PARENT, &nd); @@ -2680,8 +2712,7 @@ static char *page_getlink(struct dentry * dentry, struct page **ppage) { struct page * page; struct address_space *mapping = dentry->d_inode->i_mapping; - page = read_cache_page(mapping, 0, (filler_t *)mapping->a_ops->readpage, - NULL); + page = read_mapping_page(mapping, 0, NULL); if (IS_ERR(page)) goto sync_fail; wait_on_page_locked(page); diff --git a/fs/namespace.c b/fs/namespace.c index 03f43da1f..4bcb3ae8f 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -8,7 +8,6 @@ * Heavily rewritten. */ -#include #include #include #include @@ -88,6 +87,15 @@ struct vfsmount *alloc_vfsmnt(const char *name) return mnt; } +int simple_set_mnt(struct vfsmount *mnt, struct super_block *sb) +{ + mnt->mnt_sb = sb; + mnt->mnt_root = dget(sb->s_root); + return 0; +} + +EXPORT_SYMBOL(simple_set_mnt); + void free_vfsmnt(struct vfsmount *mnt) { kfree(mnt->mnt_devname); @@ -572,10 +580,8 @@ void umount_tree(struct vfsmount *mnt, int propagate, struct list_head *kill) { struct vfsmount *p; - for (p = mnt; p; p = next_mnt(p, mnt)) { - list_del(&p->mnt_hash); - list_add(&p->mnt_hash, kill); - } + for (p = mnt; p; p = next_mnt(p, mnt)) + list_move(&p->mnt_hash, kill); if (propagate) propagate_umount(kill); @@ -631,8 +637,8 @@ static int do_umount(struct vfsmount *mnt, int flags) */ lock_kernel(); - if ((flags & MNT_FORCE) && sb->s_op->umount_begin) - sb->s_op->umount_begin(sb); + if (sb->s_op->umount_begin) + sb->s_op->umount_begin(mnt, flags); unlock_kernel(); /* @@ -1226,6 +1232,40 @@ static void expire_mount(struct vfsmount *mnt, struct list_head *mounts, } } +/* + * go through the vfsmounts we've just consigned to the graveyard to + * - check that they're still dead + * - delete the vfsmount from the appropriate namespace under lock + * - dispose of the corpse + */ +static void expire_mount_list(struct list_head *graveyard, struct list_head *mounts) +{ + struct namespace *namespace; + struct vfsmount *mnt; + + while (!list_empty(graveyard)) { + LIST_HEAD(umounts); + mnt = list_entry(graveyard->next, struct vfsmount, mnt_expire); + list_del_init(&mnt->mnt_expire); + + /* don't do anything if the namespace is dead - all the + * vfsmounts from it are going away anyway */ + namespace = mnt->mnt_namespace; + if (!namespace || !namespace->root) + continue; + get_namespace(namespace); + + spin_unlock(&vfsmount_lock); + down_write(&namespace_sem); + expire_mount(mnt, mounts, &umounts); + up_write(&namespace_sem); + release_mounts(&umounts); + mntput(mnt); + put_namespace(namespace); + spin_lock(&vfsmount_lock); + } +} + /* * process a list of expirable mountpoints with the intent of discarding any * mountpoints that aren't in use and haven't been touched since last we came @@ -1233,7 +1273,6 @@ static void expire_mount(struct vfsmount *mnt, struct list_head *mounts, */ void mark_mounts_for_expiry(struct list_head *mounts) { - struct namespace *namespace; struct vfsmount *mnt, *next; LIST_HEAD(graveyard); @@ -1257,38 +1296,79 @@ void mark_mounts_for_expiry(struct list_head *mounts) list_move(&mnt->mnt_expire, &graveyard); } - /* - * go through the vfsmounts we've just consigned to the graveyard to - * - check that they're still dead - * - delete the vfsmount from the appropriate namespace under lock - * - dispose of the corpse - */ - while (!list_empty(&graveyard)) { - LIST_HEAD(umounts); - mnt = list_entry(graveyard.next, struct vfsmount, mnt_expire); - list_del_init(&mnt->mnt_expire); + expire_mount_list(&graveyard, mounts); - /* don't do anything if the namespace is dead - all the - * vfsmounts from it are going away anyway */ - namespace = mnt->mnt_namespace; - if (!namespace || !namespace->root) + spin_unlock(&vfsmount_lock); +} + +EXPORT_SYMBOL_GPL(mark_mounts_for_expiry); + +/* + * Ripoff of 'select_parent()' + * + * search the list of submounts for a given mountpoint, and move any + * shrinkable submounts to the 'graveyard' list. + */ +static int select_submounts(struct vfsmount *parent, struct list_head *graveyard) +{ + struct vfsmount *this_parent = parent; + struct list_head *next; + int found = 0; + +repeat: + next = this_parent->mnt_mounts.next; +resume: + while (next != &this_parent->mnt_mounts) { + struct list_head *tmp = next; + struct vfsmount *mnt = list_entry(tmp, struct vfsmount, mnt_child); + + next = tmp->next; + if (!(mnt->mnt_flags & MNT_SHRINKABLE)) continue; - get_namespace(namespace); + /* + * Descend a level if the d_mounts list is non-empty. + */ + if (!list_empty(&mnt->mnt_mounts)) { + this_parent = mnt; + goto repeat; + } - spin_unlock(&vfsmount_lock); - down_write(&namespace_sem); - expire_mount(mnt, mounts, &umounts); - up_write(&namespace_sem); - release_mounts(&umounts); - mntput(mnt); - put_namespace(namespace); - spin_lock(&vfsmount_lock); + if (!propagate_mount_busy(mnt, 1)) { + mntget(mnt); + list_move_tail(&mnt->mnt_expire, graveyard); + found++; + } } + /* + * All done at this level ... ascend and resume the search + */ + if (this_parent != parent) { + next = this_parent->mnt_child.next; + this_parent = this_parent->mnt_parent; + goto resume; + } + return found; +} + +/* + * process a list of expirable mountpoints with the intent of discarding any + * submounts of a specific parent mountpoint + */ +void shrink_submounts(struct vfsmount *mountpoint, struct list_head *mounts) +{ + LIST_HEAD(graveyard); + int found; + + spin_lock(&vfsmount_lock); + + /* extract submounts of 'mountpoint' from the expiration list */ + while ((found = select_submounts(mountpoint, &graveyard)) != 0) + expire_mount_list(&graveyard, mounts); spin_unlock(&vfsmount_lock); } -EXPORT_SYMBOL_GPL(mark_mounts_for_expiry); +EXPORT_SYMBOL_GPL(shrink_submounts); /* * Some copy_from_user() implementations do not return the exact number of diff --git a/fs/ncpfs/dir.c b/fs/ncpfs/dir.c index f0860c602..b4ee89250 100644 --- a/fs/ncpfs/dir.c +++ b/fs/ncpfs/dir.c @@ -10,7 +10,6 @@ * */ -#include #include #include diff --git a/fs/ncpfs/inode.c b/fs/ncpfs/inode.c index a1f3e972c..b76e57b75 100644 --- a/fs/ncpfs/inode.c +++ b/fs/ncpfs/inode.c @@ -9,7 +9,6 @@ * */ -#include #include #include @@ -39,7 +38,7 @@ static void ncp_delete_inode(struct inode *); static void ncp_put_super(struct super_block *); -static int ncp_statfs(struct super_block *, struct kstatfs *); +static int ncp_statfs(struct dentry *, struct kstatfs *); static kmem_cache_t * ncp_inode_cachep; @@ -105,7 +104,7 @@ static struct super_operations ncp_sops = extern struct dentry_operations ncp_root_dentry_operations; #if defined(CONFIG_NCPFS_EXTRAS) || defined(CONFIG_NCPFS_NFS_NS) -extern struct address_space_operations ncp_symlink_aops; +extern const struct address_space_operations ncp_symlink_aops; extern int ncp_symlink(struct inode*, struct dentry*, const char*); #endif @@ -225,7 +224,6 @@ static void ncp_set_attr(struct inode *inode, struct ncp_entry_info *nwinfo) inode->i_nlink = 1; inode->i_uid = server->m.uid; inode->i_gid = server->m.gid; - inode->i_blksize = NCP_BLOCK_SIZE; ncp_update_dates(inode, &nwinfo->i); ncp_update_inode(inode, nwinfo); @@ -724,13 +722,14 @@ static void ncp_put_super(struct super_block *sb) kfree(server); } -static int ncp_statfs(struct super_block *sb, struct kstatfs *buf) +static int ncp_statfs(struct dentry *dentry, struct kstatfs *buf) { struct dentry* d; struct inode* i; struct ncp_inode_info* ni; struct ncp_server* s; struct ncp_volume_info vi; + struct super_block *sb = dentry->d_sb; int err; __u8 dh; @@ -957,10 +956,10 @@ out: return result; } -static struct super_block *ncp_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int ncp_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_nodev(fs_type, flags, data, ncp_fill_super); + return get_sb_nodev(fs_type, flags, data, ncp_fill_super, mnt); } static struct file_system_type ncp_fs_type = { diff --git a/fs/ncpfs/ioctl.c b/fs/ncpfs/ioctl.c index eb3813ad1..42039fe06 100644 --- a/fs/ncpfs/ioctl.c +++ b/fs/ncpfs/ioctl.c @@ -7,7 +7,6 @@ * */ -#include #include #include diff --git a/fs/ncpfs/mmap.c b/fs/ncpfs/mmap.c index 52d60c3d8..e7d5a3097 100644 --- a/fs/ncpfs/mmap.c +++ b/fs/ncpfs/mmap.c @@ -93,7 +93,7 @@ static struct page* ncp_file_mmap_nopage(struct vm_area_struct *area, */ if (type) *type = VM_FAULT_MAJOR; - inc_page_state(pgmajfault); + count_vm_event(PGMAJFAULT); return page; } diff --git a/fs/ncpfs/ncplib_kernel.c b/fs/ncpfs/ncplib_kernel.c index d9ebf6439..551e0bac7 100644 --- a/fs/ncpfs/ncplib_kernel.c +++ b/fs/ncpfs/ncplib_kernel.c @@ -10,7 +10,6 @@ */ -#include #include "ncplib_kernel.h" diff --git a/fs/ncpfs/ncplib_kernel.h b/fs/ncpfs/ncplib_kernel.h index 799e5c2be..2441d1ab5 100644 --- a/fs/ncpfs/ncplib_kernel.h +++ b/fs/ncpfs/ncplib_kernel.h @@ -12,7 +12,6 @@ #ifndef _NCPLIB_H #define _NCPLIB_H -#include #include #include diff --git a/fs/ncpfs/ncpsign_kernel.c b/fs/ncpfs/ncpsign_kernel.c index a6ec90cd8..749a18d33 100644 --- a/fs/ncpfs/ncpsign_kernel.c +++ b/fs/ncpfs/ncpsign_kernel.c @@ -5,7 +5,6 @@ * */ -#include #ifdef CONFIG_NCPFS_PACKET_SIGNING diff --git a/fs/ncpfs/sock.c b/fs/ncpfs/sock.c index 8783eb7ec..11c2b252e 100644 --- a/fs/ncpfs/sock.c +++ b/fs/ncpfs/sock.c @@ -8,7 +8,6 @@ * */ -#include #include #include diff --git a/fs/ncpfs/symlink.c b/fs/ncpfs/symlink.c index e935f1b34..ca92c2406 100644 --- a/fs/ncpfs/symlink.c +++ b/fs/ncpfs/symlink.c @@ -20,7 +20,6 @@ * */ -#include #include @@ -99,7 +98,7 @@ fail: /* * symlinks can't do much... */ -struct address_space_operations ncp_symlink_aops = { +const struct address_space_operations ncp_symlink_aops = { .readpage = ncp_symlink_readpage, }; diff --git a/fs/nfs/Makefile b/fs/nfs/Makefile index ec61fd56a..2af6f22df 100644 --- a/fs/nfs/Makefile +++ b/fs/nfs/Makefile @@ -4,14 +4,17 @@ obj-$(CONFIG_NFS_FS) += nfs.o -nfs-y := dir.o file.o inode.o nfs2xdr.o pagelist.o \ - proc.o read.o symlink.o unlink.o write.o +nfs-y := client.o dir.o file.o getroot.o inode.o super.o nfs2xdr.o \ + pagelist.o proc.o read.o symlink.o unlink.o \ + write.o namespace.o nfs-$(CONFIG_ROOT_NFS) += nfsroot.o mount_clnt.o nfs-$(CONFIG_NFS_V3) += nfs3proc.o nfs3xdr.o nfs-$(CONFIG_NFS_V3_ACL) += nfs3acl.o nfs-$(CONFIG_NFS_V4) += nfs4proc.o nfs4xdr.o nfs4state.o nfs4renewd.o \ delegation.o idmap.o \ - callback.o callback_xdr.o callback_proc.o + callback.o callback_xdr.o callback_proc.o \ + nfs4namespace.o nfs-$(CONFIG_NFS_DIRECTIO) += direct.o nfs-$(CONFIG_SYSCTL) += sysctl.o +nfs-$(CONFIG_NFS_FSCACHE) += fscache.o nfs-objs := $(nfs-y) diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c index 90c95adc8..a3ee11364 100644 --- a/fs/nfs/callback.c +++ b/fs/nfs/callback.c @@ -6,7 +6,6 @@ * NFSv4 callback handling */ -#include #include #include #include @@ -20,6 +19,7 @@ #include "nfs4_fs.h" #include "callback.h" +#include "internal.h" #define NFSDBG_FACILITY NFSDBG_CALLBACK @@ -37,6 +37,21 @@ static struct svc_program nfs4_callback_program; unsigned int nfs_callback_set_tcpport; unsigned short nfs_callback_tcpport; +static const int nfs_set_port_min = 0; +static const int nfs_set_port_max = 65535; + +static int param_set_port(const char *val, struct kernel_param *kp) +{ + char *endp; + int num = simple_strtol(val, &endp, 0); + if (endp == val || *endp || num < nfs_set_port_min || num > nfs_set_port_max) + return -EINVAL; + *((int *)kp->arg) = num; + return 0; +} + +module_param_call(callback_tcpport, param_set_port, param_get_int, + &nfs_callback_set_tcpport, 0644); /* * This is the callback kernel thread. @@ -135,10 +150,8 @@ out_err: /* * Kill the server process if it is not already up. */ -int nfs_callback_down(void) +void nfs_callback_down(void) { - int ret = 0; - lock_kernel(); mutex_lock(&nfs_callback_mutex); nfs_callback_info.users--; @@ -150,20 +163,19 @@ int nfs_callback_down(void) } while (wait_for_completion_timeout(&nfs_callback_info.stopped, 5*HZ) == 0); mutex_unlock(&nfs_callback_mutex); unlock_kernel(); - return ret; } static int nfs_callback_authenticate(struct svc_rqst *rqstp) { - struct in_addr *addr = &rqstp->rq_addr.sin_addr; - struct nfs4_client *clp; + struct sockaddr_in *addr = &rqstp->rq_addr; + struct nfs_client *clp; /* Don't talk to strangers */ - clp = nfs4_find_client(addr); + clp = nfs_find_client(addr, 4); if (clp == NULL) return SVC_DROP; - dprintk("%s: %u.%u.%u.%u NFSv4 callback!\n", __FUNCTION__, NIPQUAD(addr)); - nfs4_put_client(clp); + dprintk("%s: %u.%u.%u.%u NFSv4 callback!\n", __FUNCTION__, NIPQUAD(addr->sin_addr)); + nfs_put_client(clp); switch (rqstp->rq_authop->flavour) { case RPC_AUTH_NULL: if (rqstp->rq_proc != CB_NULL) @@ -182,8 +194,6 @@ static int nfs_callback_authenticate(struct svc_rqst *rqstp) /* * Define NFS4 callback program */ -extern struct svc_version nfs4_callback_version1; - static struct svc_version *nfs4_callback_version[] = { [1] = &nfs4_callback_version1, }; diff --git a/fs/nfs/callback.h b/fs/nfs/callback.h index b252e7fe5..5676163d2 100644 --- a/fs/nfs/callback.h +++ b/fs/nfs/callback.h @@ -62,8 +62,13 @@ struct cb_recallargs { extern unsigned nfs4_callback_getattr(struct cb_getattrargs *args, struct cb_getattrres *res); extern unsigned nfs4_callback_recall(struct cb_recallargs *args, void *dummy); +#ifdef CONFIG_NFS_V4 extern int nfs_callback_up(void); -extern int nfs_callback_down(void); +extern void nfs_callback_down(void); +#else +#define nfs_callback_up() (0) +#define nfs_callback_down() do {} while(0) +#endif extern unsigned int nfs_callback_set_tcpport; extern unsigned short nfs_callback_tcpport; diff --git a/fs/nfs/callback_proc.c b/fs/nfs/callback_proc.c index 462cfceb5..97cf8f714 100644 --- a/fs/nfs/callback_proc.c +++ b/fs/nfs/callback_proc.c @@ -5,25 +5,25 @@ * * NFSv4 callback procedures */ -#include #include #include #include "nfs4_fs.h" #include "callback.h" #include "delegation.h" +#include "internal.h" #define NFSDBG_FACILITY NFSDBG_CALLBACK unsigned nfs4_callback_getattr(struct cb_getattrargs *args, struct cb_getattrres *res) { - struct nfs4_client *clp; + struct nfs_client *clp; struct nfs_delegation *delegation; struct nfs_inode *nfsi; struct inode *inode; res->bitmap[0] = res->bitmap[1] = 0; res->status = htonl(NFS4ERR_BADHANDLE); - clp = nfs4_find_client(&args->addr->sin_addr); + clp = nfs_find_client(args->addr, 4); if (clp == NULL) goto out; inode = nfs_delegation_find_inode(clp, &args->fh); @@ -49,7 +49,7 @@ out_iput: up_read(&nfsi->rwsem); iput(inode); out_putclient: - nfs4_put_client(clp); + nfs_put_client(clp); out: dprintk("%s: exit with status = %d\n", __FUNCTION__, ntohl(res->status)); return res->status; @@ -57,12 +57,12 @@ out: unsigned nfs4_callback_recall(struct cb_recallargs *args, void *dummy) { - struct nfs4_client *clp; + struct nfs_client *clp; struct inode *inode; unsigned res; res = htonl(NFS4ERR_BADHANDLE); - clp = nfs4_find_client(&args->addr->sin_addr); + clp = nfs_find_client(args->addr, 4); if (clp == NULL) goto out; inode = nfs_delegation_find_inode(clp, &args->fh); @@ -81,7 +81,7 @@ unsigned nfs4_callback_recall(struct cb_recallargs *args, void *dummy) } iput(inode); out_putclient: - nfs4_put_client(clp); + nfs_put_client(clp); out: dprintk("%s: exit with status = %d\n", __FUNCTION__, ntohl(res)); return res; diff --git a/fs/nfs/callback_xdr.c b/fs/nfs/callback_xdr.c index 05c38cf40..29f932192 100644 --- a/fs/nfs/callback_xdr.c +++ b/fs/nfs/callback_xdr.c @@ -5,7 +5,6 @@ * * NFSv4 callback encode/decode procedures */ -#include #include #include #include @@ -202,7 +201,7 @@ static unsigned decode_recall_args(struct svc_rqst *rqstp, struct xdr_stream *xd status = decode_fh(xdr, &args->fh); out: dprintk("%s: exit with status = %d\n", __FUNCTION__, status); - return 0; + return status; } static unsigned encode_string(struct xdr_stream *xdr, unsigned int len, const char *str) diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c index d3be923d4..57133678d 100644 --- a/fs/nfs/delegation.c +++ b/fs/nfs/delegation.c @@ -6,7 +6,6 @@ * NFS file delegation management * */ -#include #include #include #include @@ -19,6 +18,7 @@ #include "nfs4_fs.h" #include "delegation.h" +#include "internal.h" static struct nfs_delegation *nfs_alloc_delegation(void) { @@ -53,7 +53,7 @@ static int nfs_delegation_claim_locks(struct nfs_open_context *ctx, struct nfs4_ case -NFS4ERR_EXPIRED: /* kill_proc(fl->fl_pid, SIGLOST, 1); */ case -NFS4ERR_STALE_CLIENTID: - nfs4_schedule_state_recovery(NFS_SERVER(inode)->nfs4_state); + nfs4_schedule_state_recovery(NFS_SERVER(inode)->nfs_client); goto out_err; } } @@ -115,7 +115,7 @@ void nfs_inode_reclaim_delegation(struct inode *inode, struct rpc_cred *cred, st */ int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, struct nfs_openres *res) { - struct nfs4_client *clp = NFS_SERVER(inode)->nfs4_state; + struct nfs_client *clp = NFS_SERVER(inode)->nfs_client; struct nfs_inode *nfsi = NFS_I(inode); struct nfs_delegation *delegation; int status = 0; @@ -146,7 +146,7 @@ int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, struct sizeof(delegation->stateid)) != 0 || delegation->type != nfsi->delegation->type) { printk("%s: server %u.%u.%u.%u, handed out a duplicate delegation!\n", - __FUNCTION__, NIPQUAD(clp->cl_addr)); + __FUNCTION__, NIPQUAD(clp->cl_addr.sin_addr)); status = -EIO; } } @@ -177,7 +177,7 @@ static void nfs_msync_inode(struct inode *inode) */ int __nfs_inode_return_delegation(struct inode *inode) { - struct nfs4_client *clp = NFS_SERVER(inode)->nfs4_state; + struct nfs_client *clp = NFS_SERVER(inode)->nfs_client; struct nfs_inode *nfsi = NFS_I(inode); struct nfs_delegation *delegation; int res = 0; @@ -209,7 +209,7 @@ int __nfs_inode_return_delegation(struct inode *inode) */ void nfs_return_all_delegations(struct super_block *sb) { - struct nfs4_client *clp = NFS_SB(sb)->nfs4_state; + struct nfs_client *clp = NFS_SB(sb)->nfs_client; struct nfs_delegation *delegation; struct inode *inode; @@ -233,7 +233,7 @@ restart: int nfs_do_expire_all_delegations(void *ptr) { - struct nfs4_client *clp = ptr; + struct nfs_client *clp = ptr; struct nfs_delegation *delegation; struct inode *inode; @@ -255,11 +255,11 @@ restart: } out: spin_unlock(&clp->cl_lock); - nfs4_put_client(clp); + nfs_put_client(clp); module_put_and_exit(0); } -void nfs_expire_all_delegations(struct nfs4_client *clp) +void nfs_expire_all_delegations(struct nfs_client *clp) { struct task_struct *task; @@ -267,17 +267,17 @@ void nfs_expire_all_delegations(struct nfs4_client *clp) atomic_inc(&clp->cl_count); task = kthread_run(nfs_do_expire_all_delegations, clp, "%u.%u.%u.%u-delegreturn", - NIPQUAD(clp->cl_addr)); + NIPQUAD(clp->cl_addr.sin_addr)); if (!IS_ERR(task)) return; - nfs4_put_client(clp); + nfs_put_client(clp); module_put(THIS_MODULE); } /* * Return all delegations following an NFS4ERR_CB_PATH_DOWN error. */ -void nfs_handle_cb_pathdown(struct nfs4_client *clp) +void nfs_handle_cb_pathdown(struct nfs_client *clp) { struct nfs_delegation *delegation; struct inode *inode; @@ -300,7 +300,7 @@ restart: struct recall_threadargs { struct inode *inode; - struct nfs4_client *clp; + struct nfs_client *clp; const nfs4_stateid *stateid; struct completion started; @@ -311,7 +311,7 @@ static int recall_thread(void *data) { struct recall_threadargs *args = (struct recall_threadargs *)data; struct inode *inode = igrab(args->inode); - struct nfs4_client *clp = NFS_SERVER(inode)->nfs4_state; + struct nfs_client *clp = NFS_SERVER(inode)->nfs_client; struct nfs_inode *nfsi = NFS_I(inode); struct nfs_delegation *delegation; @@ -372,7 +372,7 @@ out_module_put: /* * Retrieve the inode associated with a delegation */ -struct inode *nfs_delegation_find_inode(struct nfs4_client *clp, const struct nfs_fh *fhandle) +struct inode *nfs_delegation_find_inode(struct nfs_client *clp, const struct nfs_fh *fhandle) { struct nfs_delegation *delegation; struct inode *res = NULL; @@ -390,7 +390,7 @@ struct inode *nfs_delegation_find_inode(struct nfs4_client *clp, const struct nf /* * Mark all delegations as needing to be reclaimed */ -void nfs_delegation_mark_reclaim(struct nfs4_client *clp) +void nfs_delegation_mark_reclaim(struct nfs_client *clp) { struct nfs_delegation *delegation; spin_lock(&clp->cl_lock); @@ -402,7 +402,7 @@ void nfs_delegation_mark_reclaim(struct nfs4_client *clp) /* * Reap all unclaimed delegations after reboot recovery is done */ -void nfs_delegation_reap_unclaimed(struct nfs4_client *clp) +void nfs_delegation_reap_unclaimed(struct nfs_client *clp) { struct nfs_delegation *delegation, *n; LIST_HEAD(head); @@ -424,7 +424,7 @@ void nfs_delegation_reap_unclaimed(struct nfs4_client *clp) int nfs4_copy_delegation_stateid(nfs4_stateid *dst, struct inode *inode) { - struct nfs4_client *clp = NFS_SERVER(inode)->nfs4_state; + struct nfs_client *clp = NFS_SERVER(inode)->nfs_client; struct nfs_inode *nfsi = NFS_I(inode); struct nfs_delegation *delegation; int res = 0; diff --git a/fs/nfs/delegation.h b/fs/nfs/delegation.h index 385869465..2cfd4b24c 100644 --- a/fs/nfs/delegation.h +++ b/fs/nfs/delegation.h @@ -29,13 +29,13 @@ void nfs_inode_reclaim_delegation(struct inode *inode, struct rpc_cred *cred, st int __nfs_inode_return_delegation(struct inode *inode); int nfs_async_inode_return_delegation(struct inode *inode, const nfs4_stateid *stateid); -struct inode *nfs_delegation_find_inode(struct nfs4_client *clp, const struct nfs_fh *fhandle); +struct inode *nfs_delegation_find_inode(struct nfs_client *clp, const struct nfs_fh *fhandle); void nfs_return_all_delegations(struct super_block *sb); -void nfs_expire_all_delegations(struct nfs4_client *clp); -void nfs_handle_cb_pathdown(struct nfs4_client *clp); +void nfs_expire_all_delegations(struct nfs_client *clp); +void nfs_handle_cb_pathdown(struct nfs_client *clp); -void nfs_delegation_mark_reclaim(struct nfs4_client *clp); -void nfs_delegation_reap_unclaimed(struct nfs4_client *clp); +void nfs_delegation_mark_reclaim(struct nfs_client *clp); +void nfs_delegation_reap_unclaimed(struct nfs_client *clp); /* NFSv4 delegation-related procedures */ int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid); diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index ff57cb4ce..8b454d67b 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c @@ -28,10 +28,10 @@ #include #include #include -#include #include #include #include +#include #include #include "nfs4_fs.h" @@ -398,7 +398,7 @@ int nfs_do_filldir(nfs_readdir_descriptor_t *desc, void *dirent, struct file *file = desc->file; struct nfs_entry *entry = desc->entry; struct dentry *dentry = NULL; - unsigned long fileid; + u64 fileid; int loop_count = 0, res; @@ -409,7 +409,7 @@ int nfs_do_filldir(nfs_readdir_descriptor_t *desc, void *dirent, unsigned d_type = DT_UNKNOWN; /* Note: entry->prev_cookie contains the cookie for * retrieving the current dirent on the server */ - fileid = nfs_fileid_to_ino_t(entry->ino); + fileid = entry->ino; /* Get a dentry if we have one */ if (dentry != NULL) @@ -419,7 +419,7 @@ int nfs_do_filldir(nfs_readdir_descriptor_t *desc, void *dirent, /* Use readdirplus info */ if (dentry != NULL && dentry->d_inode != NULL) { d_type = dt_type(dentry->d_inode); - fileid = dentry->d_inode->i_ino; + fileid = NFS_FILEID(dentry->d_inode); } res = filldir(dirent, entry->name, entry->len, @@ -530,7 +530,7 @@ static int nfs_readdir(struct file *filp, void *dirent, filldir_t filldir) lock_kernel(); - res = nfs_revalidate_inode(NFS_SERVER(inode), inode); + res = nfs_revalidate_mapping(inode, filp->f_mapping); if (res < 0) { unlock_kernel(); return res; @@ -692,7 +692,9 @@ int nfs_lookup_verify_inode(struct inode *inode, struct nameidata *nd) goto out_force; /* This is an open(2) */ if (nfs_lookup_check_intent(nd, LOOKUP_OPEN) != 0 && - !(server->flags & NFS_MOUNT_NOCTO)) + !(server->flags & NFS_MOUNT_NOCTO) && + (S_ISREG(inode->i_mode) || + S_ISDIR(inode->i_mode))) goto out_force; } return nfs_revalidate_inode(server, inode); @@ -870,6 +872,17 @@ int nfs_is_exclusive_create(struct inode *dir, struct nameidata *nd) return (nd->intent.open.flags & O_EXCL) != 0; } +static inline int nfs_reval_fsid(struct vfsmount *mnt, struct inode *dir, + struct nfs_fh *fh, struct nfs_fattr *fattr) +{ + struct nfs_server *server = NFS_SERVER(dir); + + if (!nfs_fsid_equal(&server->fsid, &fattr->fsid)) + /* Revalidate fsid on root dir */ + return __nfs_revalidate_inode(server, mnt->mnt_root->d_inode); + return 0; +} + static struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, struct nameidata *nd) { struct dentry *res; @@ -891,9 +904,15 @@ static struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, stru lock_kernel(); - /* If we're doing an exclusive create, optimize away the lookup */ - if (nfs_is_exclusive_create(dir, nd)) - goto no_entry; + /* + * If we're doing an exclusive create, optimize away the lookup + * but don't hash the dentry. + */ + if (nfs_is_exclusive_create(dir, nd)) { + d_instantiate(dentry, NULL); + res = NULL; + goto out_unlock; + } error = NFS_PROTO(dir)->lookup(dir, &dentry->d_name, &fhandle, &fattr); if (error == -ENOENT) @@ -902,13 +921,18 @@ static struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, stru res = ERR_PTR(error); goto out_unlock; } + error = nfs_reval_fsid(nd->mnt, dir, &fhandle, &fattr); + if (error < 0) { + res = ERR_PTR(error); + goto out_unlock; + } inode = nfs_fhget(dentry->d_sb, &fhandle, &fattr); res = (struct dentry *)inode; if (IS_ERR(res)) goto out_unlock; vx_propagate_xid(nd, inode); no_entry: - res = d_add_unique(dentry, inode); + res = d_materialise_unique(dentry, inode); if (res != NULL) dentry = res; nfs_renew_times(dentry); @@ -1103,11 +1127,13 @@ static struct dentry *nfs_readdir_lookup(nfs_readdir_descriptor_t *desc) dput(dentry); return NULL; } - alias = d_add_unique(dentry, inode); + + alias = d_materialise_unique(dentry, inode); if (alias != NULL) { dput(dentry); dentry = alias; } + nfs_renew_times(dentry); nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); return dentry; @@ -1133,7 +1159,7 @@ int nfs_instantiate(struct dentry *dentry, struct nfs_fh *fhandle, } if (!(fattr->valid & NFS_ATTR_FATTR)) { struct nfs_server *server = NFS_SB(dentry->d_sb); - error = server->rpc_ops->getattr(server, fhandle, fattr); + error = server->nfs_client->rpc_ops->getattr(server, fhandle, fattr); if (error < 0) goto out_err; } @@ -1142,6 +1168,8 @@ int nfs_instantiate(struct dentry *dentry, struct nfs_fh *fhandle, if (IS_ERR(inode)) goto out_err; d_instantiate(dentry, inode); + if (d_unhashed(dentry)) + d_rehash(dentry); return 0; out_err: d_drop(dentry); diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index 3c72b0c07..76ca1cbc3 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c @@ -38,7 +38,6 @@ * */ -#include #include #include #include @@ -68,25 +67,19 @@ struct nfs_direct_req { struct kref kref; /* release manager */ /* I/O parameters */ - struct list_head list, /* nfs_read/write_data structs */ - rewrite_list; /* saved nfs_write_data structs */ struct nfs_open_context *ctx; /* file open context info */ struct kiocb * iocb; /* controlling i/o request */ struct inode * inode; /* target file of i/o */ - unsigned long user_addr; /* location of user's buffer */ - size_t user_count; /* total bytes to move */ - loff_t pos; /* starting offset in file */ - struct page ** pages; /* pages in our buffer */ - unsigned int npages; /* count of pages */ /* completion state */ + atomic_t io_count; /* i/os we're waiting for */ spinlock_t lock; /* protect completion state */ - int outstanding; /* i/os we're waiting for */ ssize_t count, /* bytes actually processed */ error; /* any reported error */ struct completion completion; /* wait for i/o completion */ /* commit state */ + struct list_head rewrite_list; /* saved nfs_write_data structs */ struct nfs_write_data * commit_data; /* special write_data for commits */ int flags; #define NFS_ODIRECT_DO_COMMIT (1) /* an unstable reply was received */ @@ -94,8 +87,18 @@ struct nfs_direct_req { struct nfs_writeverf verf; /* unstable write verifier */ }; -static void nfs_direct_write_schedule(struct nfs_direct_req *dreq, int sync); static void nfs_direct_write_complete(struct nfs_direct_req *dreq, struct inode *inode); +static const struct rpc_call_ops nfs_write_direct_ops; + +static inline void get_dreq(struct nfs_direct_req *dreq) +{ + atomic_inc(&dreq->io_count); +} + +static inline int put_dreq(struct nfs_direct_req *dreq) +{ + return atomic_dec_and_test(&dreq->io_count); +} /** * nfs_direct_IO - NFS address space operation for direct I/O @@ -119,50 +122,21 @@ ssize_t nfs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, loff_ return -EINVAL; } -static void nfs_free_user_pages(struct page **pages, int npages, int do_dirty) +static void nfs_direct_dirty_pages(struct page **pages, int npages) { int i; for (i = 0; i < npages; i++) { struct page *page = pages[i]; - if (do_dirty && !PageCompound(page)) + if (!PageCompound(page)) set_page_dirty_lock(page); - page_cache_release(page); } - kfree(pages); } -static inline int nfs_get_user_pages(int rw, unsigned long user_addr, size_t size, struct page ***pages) +static void nfs_direct_release_pages(struct page **pages, int npages) { - int result = -ENOMEM; - unsigned long page_count; - size_t array_size; - - page_count = (user_addr + size + PAGE_SIZE - 1) >> PAGE_SHIFT; - page_count -= user_addr >> PAGE_SHIFT; - - array_size = (page_count * sizeof(struct page *)); - *pages = kmalloc(array_size, GFP_KERNEL); - if (*pages) { - down_read(¤t->mm->mmap_sem); - result = get_user_pages(current, current->mm, user_addr, - page_count, (rw == READ), 0, - *pages, NULL); - up_read(¤t->mm->mmap_sem); - if (result != page_count) { - /* - * If we got fewer pages than expected from - * get_user_pages(), the user buffer runs off the - * end of a mapping; return EFAULT. - */ - if (result >= 0) { - nfs_free_user_pages(*pages, result, 0); - result = -EFAULT; - } else - kfree(*pages); - *pages = NULL; - } - } - return result; + int i; + for (i = 0; i < npages; i++) + page_cache_release(pages[i]); } static inline struct nfs_direct_req *nfs_direct_req_alloc(void) @@ -174,13 +148,13 @@ static inline struct nfs_direct_req *nfs_direct_req_alloc(void) return NULL; kref_init(&dreq->kref); + kref_get(&dreq->kref); init_completion(&dreq->completion); - INIT_LIST_HEAD(&dreq->list); INIT_LIST_HEAD(&dreq->rewrite_list); dreq->iocb = NULL; dreq->ctx = NULL; spin_lock_init(&dreq->lock); - dreq->outstanding = 0; + atomic_set(&dreq->io_count, 0); dreq->count = 0; dreq->error = 0; dreq->flags = 0; @@ -221,18 +195,11 @@ out: } /* - * We must hold a reference to all the pages in this direct read request - * until the RPCs complete. This could be long *after* we are woken up in - * nfs_direct_wait (for instance, if someone hits ^C on a slow server). - * - * In addition, synchronous I/O uses a stack-allocated iocb. Thus we - * can't trust the iocb is still valid here if this is a synchronous - * request. If the waiter is woken prematurely, the iocb is long gone. + * Synchronous I/O uses a stack-allocated iocb. Thus we can't trust + * the iocb is still valid here if this is a synchronous request. */ static void nfs_direct_complete(struct nfs_direct_req *dreq) { - nfs_free_user_pages(dreq->pages, dreq->npages, 1); - if (dreq->iocb) { long res = (long) dreq->error; if (!res) @@ -245,48 +212,10 @@ static void nfs_direct_complete(struct nfs_direct_req *dreq) } /* - * Note we also set the number of requests we have in the dreq when we are - * done. This prevents races with I/O completion so we will always wait - * until all requests have been dispatched and completed. + * We must hold a reference to all the pages in this direct read request + * until the RPCs complete. This could be long *after* we are woken up in + * nfs_direct_wait (for instance, if someone hits ^C on a slow server). */ -static struct nfs_direct_req *nfs_direct_read_alloc(size_t nbytes, size_t rsize) -{ - struct list_head *list; - struct nfs_direct_req *dreq; - unsigned int rpages = (rsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; - - dreq = nfs_direct_req_alloc(); - if (!dreq) - return NULL; - - list = &dreq->list; - for(;;) { - struct nfs_read_data *data = nfs_readdata_alloc(rpages); - - if (unlikely(!data)) { - while (!list_empty(list)) { - data = list_entry(list->next, - struct nfs_read_data, pages); - list_del(&data->pages); - nfs_readdata_free(data); - } - kref_put(&dreq->kref, nfs_direct_req_release); - return NULL; - } - - INIT_LIST_HEAD(&data->pages); - list_add(&data->pages, list); - - data->req = (struct nfs_page *) dreq; - dreq->outstanding++; - if (nbytes <= rsize) - break; - nbytes -= rsize; - } - kref_get(&dreq->kref); - return dreq; -} - static void nfs_direct_read_result(struct rpc_task *task, void *calldata) { struct nfs_read_data *data = calldata; @@ -295,6 +224,9 @@ static void nfs_direct_read_result(struct rpc_task *task, void *calldata) if (nfs_readpage_result(task, data) != 0) return; + nfs_direct_dirty_pages(data->pagevec, data->npages); + nfs_direct_release_pages(data->pagevec, data->npages); + spin_lock(&dreq->lock); if (likely(task->tk_status >= 0)) @@ -302,13 +234,10 @@ static void nfs_direct_read_result(struct rpc_task *task, void *calldata) else dreq->error = task->tk_status; - if (--dreq->outstanding) { - spin_unlock(&dreq->lock); - return; - } - spin_unlock(&dreq->lock); - nfs_direct_complete(dreq); + + if (put_dreq(dreq)) + nfs_direct_complete(dreq); } static const struct rpc_call_ops nfs_read_direct_ops = { @@ -317,41 +246,56 @@ static const struct rpc_call_ops nfs_read_direct_ops = { }; /* - * For each nfs_read_data struct that was allocated on the list, dispatch - * an NFS READ operation + * For each rsize'd chunk of the user's buffer, dispatch an NFS READ + * operation. If nfs_readdata_alloc() or get_user_pages() fails, + * bail and stop sending more reads. Read length accounting is + * handled automatically by nfs_direct_read_result(). Otherwise, if + * no requests have been sent, just return an error. */ -static void nfs_direct_read_schedule(struct nfs_direct_req *dreq) +static ssize_t nfs_direct_read_schedule(struct nfs_direct_req *dreq, unsigned long user_addr, size_t count, loff_t pos) { struct nfs_open_context *ctx = dreq->ctx; struct inode *inode = ctx->dentry->d_inode; - struct list_head *list = &dreq->list; - struct page **pages = dreq->pages; - size_t count = dreq->user_count; - loff_t pos = dreq->pos; size_t rsize = NFS_SERVER(inode)->rsize; - unsigned int curpage, pgbase; + unsigned int pgbase; + int result; + ssize_t started = 0; + + get_dreq(dreq); - curpage = 0; - pgbase = dreq->user_addr & ~PAGE_MASK; do { struct nfs_read_data *data; size_t bytes; - bytes = rsize; - if (count < rsize) - bytes = count; + pgbase = user_addr & ~PAGE_MASK; + bytes = min(rsize,count); - BUG_ON(list_empty(list)); - data = list_entry(list->next, struct nfs_read_data, pages); - list_del_init(&data->pages); + result = -ENOMEM; + data = nfs_readdata_alloc(pgbase + bytes); + if (unlikely(!data)) + break; + + down_read(¤t->mm->mmap_sem); + result = get_user_pages(current, current->mm, user_addr, + data->npages, 1, 0, data->pagevec, NULL); + up_read(¤t->mm->mmap_sem); + if (unlikely(result < data->npages)) { + if (result > 0) + nfs_direct_release_pages(data->pagevec, result); + nfs_readdata_release(data); + break; + } + + get_dreq(dreq); + data->req = (struct nfs_page *) dreq; data->inode = inode; data->cred = ctx->cred; data->args.fh = NFS_FH(inode); data->args.context = ctx; data->args.offset = pos; data->args.pgbase = pgbase; - data->args.pages = &pages[curpage]; + data->args.pages = data->pagevec; data->args.count = bytes; data->res.fattr = &data->fattr; data->res.eof = 0; @@ -374,33 +318,37 @@ static void nfs_direct_read_schedule(struct nfs_direct_req *dreq) bytes, (unsigned long long)data->args.offset); + started += bytes; + user_addr += bytes; pos += bytes; + /* FIXME: Remove this unnecessary math from final patch */ pgbase += bytes; - curpage += pgbase >> PAGE_SHIFT; pgbase &= ~PAGE_MASK; + BUG_ON(pgbase != (user_addr & ~PAGE_MASK)); count -= bytes; } while (count != 0); - BUG_ON(!list_empty(list)); + + if (put_dreq(dreq)) + nfs_direct_complete(dreq); + + if (started) + return 0; + return result < 0 ? (ssize_t) result : -EFAULT; } -static ssize_t nfs_direct_read(struct kiocb *iocb, unsigned long user_addr, size_t count, loff_t pos, struct page **pages, unsigned int nr_pages) +static ssize_t nfs_direct_read(struct kiocb *iocb, unsigned long user_addr, size_t count, loff_t pos) { - ssize_t result; + ssize_t result = 0; sigset_t oldset; struct inode *inode = iocb->ki_filp->f_mapping->host; struct rpc_clnt *clnt = NFS_CLIENT(inode); struct nfs_direct_req *dreq; - dreq = nfs_direct_read_alloc(count, NFS_SERVER(inode)->rsize); + dreq = nfs_direct_req_alloc(); if (!dreq) return -ENOMEM; - dreq->user_addr = user_addr; - dreq->user_count = count; - dreq->pos = pos; - dreq->pages = pages; - dreq->npages = nr_pages; dreq->inode = inode; dreq->ctx = get_nfs_open_context((struct nfs_open_context *)iocb->ki_filp->private_data); if (!is_sync_kiocb(iocb)) @@ -408,8 +356,9 @@ static ssize_t nfs_direct_read(struct kiocb *iocb, unsigned long user_addr, size nfs_add_stats(inode, NFSIOS_DIRECTREADBYTES, count); rpc_clnt_sigmask(clnt, &oldset); - nfs_direct_read_schedule(dreq); - result = nfs_direct_wait(dreq); + result = nfs_direct_read_schedule(dreq, user_addr, count, pos); + if (!result) + result = nfs_direct_wait(dreq); rpc_clnt_sigunmask(clnt, &oldset); return result; @@ -417,10 +366,10 @@ static ssize_t nfs_direct_read(struct kiocb *iocb, unsigned long user_addr, size static void nfs_direct_free_writedata(struct nfs_direct_req *dreq) { - list_splice_init(&dreq->rewrite_list, &dreq->list); - while (!list_empty(&dreq->list)) { - struct nfs_write_data *data = list_entry(dreq->list.next, struct nfs_write_data, pages); + while (!list_empty(&dreq->rewrite_list)) { + struct nfs_write_data *data = list_entry(dreq->rewrite_list.next, struct nfs_write_data, pages); list_del(&data->pages); + nfs_direct_release_pages(data->pagevec, data->npages); nfs_writedata_release(data); } } @@ -428,14 +377,51 @@ static void nfs_direct_free_writedata(struct nfs_direct_req *dreq) #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4) static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq) { - struct list_head *pos; + struct inode *inode = dreq->inode; + struct list_head *p; + struct nfs_write_data *data; - list_splice_init(&dreq->rewrite_list, &dreq->list); - list_for_each(pos, &dreq->list) - dreq->outstanding++; dreq->count = 0; + get_dreq(dreq); + + list_for_each(p, &dreq->rewrite_list) { + data = list_entry(p, struct nfs_write_data, pages); + + get_dreq(dreq); - nfs_direct_write_schedule(dreq, FLUSH_STABLE); + /* + * Reset data->res. + */ + nfs_fattr_init(&data->fattr); + data->res.count = data->args.count; + memset(&data->verf, 0, sizeof(data->verf)); + + /* + * Reuse data->task; data->args should not have changed + * since the original request was sent. + */ + rpc_init_task(&data->task, NFS_CLIENT(inode), RPC_TASK_ASYNC, + &nfs_write_direct_ops, data); + NFS_PROTO(inode)->write_setup(data, FLUSH_STABLE); + + data->task.tk_priority = RPC_PRIORITY_NORMAL; + data->task.tk_cookie = (unsigned long) inode; + + /* + * We're called via an RPC callback, so BKL is already held. + */ + rpc_execute(&data->task); + + dprintk("NFS: %5u rescheduled direct write call (req %s/%Ld, %u bytes @ offset %Lu)\n", + data->task.tk_pid, + inode->i_sb->s_id, + (long long)NFS_FILEID(inode), + data->args.count, + (unsigned long long)data->args.offset); + } + + if (put_dreq(dreq)) + nfs_direct_write_complete(dreq, inode); } static void nfs_direct_commit_result(struct rpc_task *task, void *calldata) @@ -472,8 +458,8 @@ static void nfs_direct_commit_schedule(struct nfs_direct_req *dreq) data->cred = dreq->ctx->cred; data->args.fh = NFS_FH(data->inode); - data->args.offset = dreq->pos; - data->args.count = dreq->user_count; + data->args.offset = 0; + data->args.count = 0; data->res.count = 0; data->res.fattr = &data->fattr; data->res.verf = &data->verf; @@ -517,7 +503,7 @@ static void nfs_direct_write_complete(struct nfs_direct_req *dreq, struct inode static void nfs_alloc_commit_data(struct nfs_direct_req *dreq) { - dreq->commit_data = nfs_commit_alloc(0); + dreq->commit_data = nfs_commit_alloc(); if (dreq->commit_data != NULL) dreq->commit_data->req = (struct nfs_page *) dreq; } @@ -535,47 +521,6 @@ static void nfs_direct_write_complete(struct nfs_direct_req *dreq, struct inode } #endif -static struct nfs_direct_req *nfs_direct_write_alloc(size_t nbytes, size_t wsize) -{ - struct list_head *list; - struct nfs_direct_req *dreq; - unsigned int wpages = (wsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; - - dreq = nfs_direct_req_alloc(); - if (!dreq) - return NULL; - - list = &dreq->list; - for(;;) { - struct nfs_write_data *data = nfs_writedata_alloc(wpages); - - if (unlikely(!data)) { - while (!list_empty(list)) { - data = list_entry(list->next, - struct nfs_write_data, pages); - list_del(&data->pages); - nfs_writedata_free(data); - } - kref_put(&dreq->kref, nfs_direct_req_release); - return NULL; - } - - INIT_LIST_HEAD(&data->pages); - list_add(&data->pages, list); - - data->req = (struct nfs_page *) dreq; - dreq->outstanding++; - if (nbytes <= wsize) - break; - nbytes -= wsize; - } - - nfs_alloc_commit_data(dreq); - - kref_get(&dreq->kref); - return dreq; -} - static void nfs_direct_write_result(struct rpc_task *task, void *calldata) { struct nfs_write_data *data = calldata; @@ -605,8 +550,6 @@ static void nfs_direct_write_result(struct rpc_task *task, void *calldata) } } } - /* In case we have to resend */ - data->args.stable = NFS_FILE_SYNC; spin_unlock(&dreq->lock); } @@ -620,14 +563,8 @@ static void nfs_direct_write_release(void *calldata) struct nfs_write_data *data = calldata; struct nfs_direct_req *dreq = (struct nfs_direct_req *) data->req; - spin_lock(&dreq->lock); - if (--dreq->outstanding) { - spin_unlock(&dreq->lock); - return; - } - spin_unlock(&dreq->lock); - - nfs_direct_write_complete(dreq, data->inode); + if (put_dreq(dreq)) + nfs_direct_write_complete(dreq, data->inode); } static const struct rpc_call_ops nfs_write_direct_ops = { @@ -636,41 +573,58 @@ static const struct rpc_call_ops nfs_write_direct_ops = { }; /* - * For each nfs_write_data struct that was allocated on the list, dispatch - * an NFS WRITE operation + * For each wsize'd chunk of the user's buffer, dispatch an NFS WRITE + * operation. If nfs_writedata_alloc() or get_user_pages() fails, + * bail and stop sending more writes. Write length accounting is + * handled automatically by nfs_direct_write_result(). Otherwise, if + * no requests have been sent, just return an error. */ -static void nfs_direct_write_schedule(struct nfs_direct_req *dreq, int sync) +static ssize_t nfs_direct_write_schedule(struct nfs_direct_req *dreq, unsigned long user_addr, size_t count, loff_t pos, int sync) { struct nfs_open_context *ctx = dreq->ctx; struct inode *inode = ctx->dentry->d_inode; - struct list_head *list = &dreq->list; - struct page **pages = dreq->pages; - size_t count = dreq->user_count; - loff_t pos = dreq->pos; size_t wsize = NFS_SERVER(inode)->wsize; - unsigned int curpage, pgbase; + unsigned int pgbase; + int result; + ssize_t started = 0; + + get_dreq(dreq); - curpage = 0; - pgbase = dreq->user_addr & ~PAGE_MASK; do { struct nfs_write_data *data; size_t bytes; - bytes = wsize; - if (count < wsize) - bytes = count; + pgbase = user_addr & ~PAGE_MASK; + bytes = min(wsize,count); + + result = -ENOMEM; + data = nfs_writedata_alloc(pgbase + bytes); + if (unlikely(!data)) + break; + + down_read(¤t->mm->mmap_sem); + result = get_user_pages(current, current->mm, user_addr, + data->npages, 0, 0, data->pagevec, NULL); + up_read(¤t->mm->mmap_sem); + if (unlikely(result < data->npages)) { + if (result > 0) + nfs_direct_release_pages(data->pagevec, result); + nfs_writedata_release(data); + break; + } + + get_dreq(dreq); - BUG_ON(list_empty(list)); - data = list_entry(list->next, struct nfs_write_data, pages); list_move_tail(&data->pages, &dreq->rewrite_list); + data->req = (struct nfs_page *) dreq; data->inode = inode; data->cred = ctx->cred; data->args.fh = NFS_FH(inode); data->args.context = ctx; data->args.offset = pos; data->args.pgbase = pgbase; - data->args.pages = &pages[curpage]; + data->args.pages = data->pagevec; data->args.count = bytes; data->res.fattr = &data->fattr; data->res.count = bytes; @@ -694,19 +648,29 @@ static void nfs_direct_write_schedule(struct nfs_direct_req *dreq, int sync) bytes, (unsigned long long)data->args.offset); + started += bytes; + user_addr += bytes; pos += bytes; + + /* FIXME: Remove this useless math from the final patch */ pgbase += bytes; - curpage += pgbase >> PAGE_SHIFT; pgbase &= ~PAGE_MASK; + BUG_ON(pgbase != (user_addr & ~PAGE_MASK)); count -= bytes; } while (count != 0); - BUG_ON(!list_empty(list)); + + if (put_dreq(dreq)) + nfs_direct_write_complete(dreq, inode); + + if (started) + return 0; + return result < 0 ? (ssize_t) result : -EFAULT; } -static ssize_t nfs_direct_write(struct kiocb *iocb, unsigned long user_addr, size_t count, loff_t pos, struct page **pages, int nr_pages) +static ssize_t nfs_direct_write(struct kiocb *iocb, unsigned long user_addr, size_t count, loff_t pos) { - ssize_t result; + ssize_t result = 0; sigset_t oldset; struct inode *inode = iocb->ki_filp->f_mapping->host; struct rpc_clnt *clnt = NFS_CLIENT(inode); @@ -714,17 +678,14 @@ static ssize_t nfs_direct_write(struct kiocb *iocb, unsigned long user_addr, siz size_t wsize = NFS_SERVER(inode)->wsize; int sync = 0; - dreq = nfs_direct_write_alloc(count, wsize); + dreq = nfs_direct_req_alloc(); if (!dreq) return -ENOMEM; + nfs_alloc_commit_data(dreq); + if (dreq->commit_data == NULL || count < wsize) sync = FLUSH_STABLE; - dreq->user_addr = user_addr; - dreq->user_count = count; - dreq->pos = pos; - dreq->pages = pages; - dreq->npages = nr_pages; dreq->inode = inode; dreq->ctx = get_nfs_open_context((struct nfs_open_context *)iocb->ki_filp->private_data); if (!is_sync_kiocb(iocb)) @@ -735,8 +696,9 @@ static ssize_t nfs_direct_write(struct kiocb *iocb, unsigned long user_addr, siz nfs_begin_data_update(inode); rpc_clnt_sigmask(clnt, &oldset); - nfs_direct_write_schedule(dreq, sync); - result = nfs_direct_wait(dreq); + result = nfs_direct_write_schedule(dreq, user_addr, count, pos, sync); + if (!result) + result = nfs_direct_wait(dreq); rpc_clnt_sigunmask(clnt, &oldset); return result; @@ -766,8 +728,6 @@ static ssize_t nfs_direct_write(struct kiocb *iocb, unsigned long user_addr, siz ssize_t nfs_file_direct_read(struct kiocb *iocb, char __user *buf, size_t count, loff_t pos) { ssize_t retval = -EINVAL; - int page_count; - struct page **pages; struct file *file = iocb->ki_filp; struct address_space *mapping = file->f_mapping; @@ -789,14 +749,7 @@ ssize_t nfs_file_direct_read(struct kiocb *iocb, char __user *buf, size_t count, if (retval) goto out; - retval = nfs_get_user_pages(READ, (unsigned long) buf, - count, &pages); - if (retval < 0) - goto out; - page_count = retval; - - retval = nfs_direct_read(iocb, (unsigned long) buf, count, pos, - pages, page_count); + retval = nfs_direct_read(iocb, (unsigned long) buf, count, pos); if (retval > 0) iocb->ki_pos = pos + retval; @@ -832,8 +785,6 @@ out: ssize_t nfs_file_direct_write(struct kiocb *iocb, const char __user *buf, size_t count, loff_t pos) { ssize_t retval; - int page_count; - struct page **pages; struct file *file = iocb->ki_filp; struct address_space *mapping = file->f_mapping; @@ -861,14 +812,7 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, const char __user *buf, size_t if (retval) goto out; - retval = nfs_get_user_pages(WRITE, (unsigned long) buf, - count, &pages); - if (retval < 0) - goto out; - page_count = retval; - - retval = nfs_direct_write(iocb, (unsigned long) buf, count, - pos, pages, page_count); + retval = nfs_direct_write(iocb, (unsigned long) buf, count, pos); /* * XXX: nfs_end_data_update() already ensures this file's @@ -892,7 +836,7 @@ out: * nfs_init_directcache - create a slab cache for nfs_direct_req structures * */ -int nfs_init_directcache(void) +int __init nfs_init_directcache(void) { nfs_direct_cachep = kmem_cache_create("nfs_direct_cache", sizeof(struct nfs_direct_req), @@ -906,7 +850,7 @@ int nfs_init_directcache(void) } /** - * nfs_init_directcache - destroy the slab cache for nfs_direct_req structures + * nfs_destroy_directcache - destroy the slab cache for nfs_direct_req structures * */ void nfs_destroy_directcache(void) diff --git a/fs/nfs/file.c b/fs/nfs/file.c index fade02c15..453268663 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c @@ -27,12 +27,14 @@ #include #include #include +#include #include #include #include "delegation.h" #include "iostat.h" +#include "internal.h" #define NFSDBG_FACILITY NFSDBG_FILE @@ -43,7 +45,7 @@ static int nfs_file_mmap(struct file *, struct vm_area_struct *); static ssize_t nfs_file_sendfile(struct file *, loff_t *, size_t, read_actor_t, void *); static ssize_t nfs_file_read(struct kiocb *, char __user *, size_t, loff_t); static ssize_t nfs_file_write(struct kiocb *, const char __user *, size_t, loff_t); -static int nfs_file_flush(struct file *); +static int nfs_file_flush(struct file *, fl_owner_t id); static int nfs_fsync(struct file *, struct dentry *dentry, int datasync); static int nfs_check_flags(int flags); static int nfs_lock(struct file *filp, int cmd, struct file_lock *fl); @@ -111,7 +113,7 @@ nfs_file_open(struct inode *inode, struct file *filp) nfs_inc_stats(inode, NFSIOS_VFSOPEN); lock_kernel(); - res = NFS_SERVER(inode)->rpc_ops->file_open(inode, filp); + res = NFS_PROTO(inode)->file_open(inode, filp); unlock_kernel(); return res; } @@ -126,23 +128,6 @@ nfs_file_release(struct inode *inode, struct file *filp) return NFS_PROTO(inode)->file_release(inode, filp); } -/** - * nfs_revalidate_file - Revalidate the page cache & related metadata - * @inode - pointer to inode struct - * @file - pointer to file - */ -static int nfs_revalidate_file(struct inode *inode, struct file *filp) -{ - struct nfs_inode *nfsi = NFS_I(inode); - int retval = 0; - - if ((nfsi->cache_validity & (NFS_INO_REVAL_PAGECACHE|NFS_INO_INVALID_ATTR)) - || nfs_attribute_timeout(inode)) - retval = __nfs_revalidate_inode(NFS_SERVER(inode), inode); - nfs_revalidate_mapping(inode, filp->f_mapping); - return 0; -} - /** * nfs_revalidate_size - Revalidate the file size * @inode - pointer to inode struct @@ -188,7 +173,7 @@ static loff_t nfs_file_llseek(struct file *filp, loff_t offset, int origin) * */ static int -nfs_file_flush(struct file *file) +nfs_file_flush(struct file *file, fl_owner_t id) { struct nfs_open_context *ctx = (struct nfs_open_context *)file->private_data; struct inode *inode = file->f_dentry->d_inode; @@ -228,7 +213,7 @@ nfs_file_read(struct kiocb *iocb, char __user * buf, size_t count, loff_t pos) dentry->d_parent->d_name.name, dentry->d_name.name, (unsigned long) count, (unsigned long) pos); - result = nfs_revalidate_file(inode, iocb->ki_filp); + result = nfs_revalidate_mapping(inode, iocb->ki_filp->f_mapping); nfs_add_stats(inode, NFSIOS_NORMALREADBYTES, count); if (!result) result = generic_file_aio_read(iocb, buf, count, pos); @@ -247,7 +232,7 @@ nfs_file_sendfile(struct file *filp, loff_t *ppos, size_t count, dentry->d_parent->d_name.name, dentry->d_name.name, (unsigned long) count, (unsigned long long) *ppos); - res = nfs_revalidate_file(inode, filp); + res = nfs_revalidate_mapping(inode, filp->f_mapping); if (!res) res = generic_file_sendfile(filp, ppos, count, actor, target); return res; @@ -263,9 +248,13 @@ nfs_file_mmap(struct file * file, struct vm_area_struct * vma) dfprintk(VFS, "nfs: mmap(%s/%s)\n", dentry->d_parent->d_name.name, dentry->d_name.name); - status = nfs_revalidate_file(inode, file); + status = nfs_revalidate_mapping(inode, file->f_mapping); if (!status) status = generic_file_mmap(file, vma); + + if (status == 0) + nfs_fscache_install_vm_ops(inode, vma); + return status; } @@ -320,15 +309,48 @@ static int nfs_commit_write(struct file *file, struct page *page, unsigned offse static void nfs_invalidate_page(struct page *page, unsigned long offset) { - /* FIXME: we really should cancel any unstarted writes on this page */ + struct inode *inode = page->mapping->host; + + /* Cancel any unstarted writes on this page */ + if (offset == 0) + nfs_sync_inode_wait(inode, page->index, 1, FLUSH_INVALIDATE); + + nfs_fscache_invalidate_page(page, inode, offset); + + /* we can do this here as the bits are only set with the page lock + * held, and our caller is holding that */ + if (!page->private) + ClearPagePrivate(page); } static int nfs_release_page(struct page *page, gfp_t gfp) { - return !nfs_wb_page(page->mapping->host, page); + if (gfp & __GFP_FS) { + int error = nfs_wb_page(page->mapping->host, page); + + if (error == 0) { + nfs_fscache_release_page(page); + + /* may have been set due to either caching or writing */ + ClearPagePrivate(page); + } + + /* releasepage() returns true/false */ + return (error == 0) ? 1 : 0; + } + else + /* + * Avoid deadlock on nfs_wait_on_request(). + */ + return 0; } -struct address_space_operations nfs_file_aops = { +/* + * Since we use page->private for our own nefarious purposes when using + * fscache, we have to override extra address space ops to prevent fs/buffer.c + * from getting confused, even though we may not have asked its opinion + */ +const struct address_space_operations nfs_file_aops = { .readpage = nfs_readpage, .readpages = nfs_readpages, .set_page_dirty = __set_page_dirty_nobuffers, @@ -341,6 +363,9 @@ struct address_space_operations nfs_file_aops = { #ifdef CONFIG_NFS_DIRECTIO .direct_IO = nfs_direct_IO, #endif +#ifdef CONFIG_NFS_FSCACHE + .sync_page = block_sync_page, +#endif }; /* @@ -373,7 +398,6 @@ nfs_file_write(struct kiocb *iocb, const char __user *buf, size_t count, loff_t if (result) goto out; } - nfs_revalidate_mapping(inode, iocb->ki_filp->f_mapping); result = count; if (!count) diff --git a/fs/nfs/idmap.c b/fs/nfs/idmap.c index 3fab5b0cf..f96dfac7d 100644 --- a/fs/nfs/idmap.c +++ b/fs/nfs/idmap.c @@ -47,7 +47,6 @@ #include #include -#include #include #include @@ -58,6 +57,20 @@ /* Default cache timeout is 10 minutes */ unsigned int nfs_idmap_cache_timeout = 600 * HZ; +static int param_set_idmap_timeout(const char *val, struct kernel_param *kp) +{ + char *endp; + int num = simple_strtol(val, &endp, 0); + int jif = num * HZ; + if (endp == val || *endp || num < 0 || jif < num) + return -EINVAL; + *((int *)kp->arg) = jif; + return 0; +} + +module_param_call(idmap_cache_timeout, param_set_idmap_timeout, param_get_int, + &nfs_idmap_cache_timeout, 0644); + struct idmap_hashent { unsigned long ih_expires; __u32 ih_id; @@ -95,15 +108,16 @@ static struct rpc_pipe_ops idmap_upcall_ops = { .destroy_msg = idmap_pipe_destroy_msg, }; -void -nfs_idmap_new(struct nfs4_client *clp) +int +nfs_idmap_new(struct nfs_client *clp) { struct idmap *idmap; + int error; + + BUG_ON(clp->cl_idmap != NULL); - if (clp->cl_idmap != NULL) - return; if ((idmap = kzalloc(sizeof(*idmap), GFP_KERNEL)) == NULL) - return; + return -ENOMEM; snprintf(idmap->idmap_path, sizeof(idmap->idmap_path), "%s/idmap", clp->cl_rpcclient->cl_pathname); @@ -111,8 +125,9 @@ nfs_idmap_new(struct nfs4_client *clp) idmap->idmap_dentry = rpc_mkpipe(idmap->idmap_path, idmap, &idmap_upcall_ops, 0); if (IS_ERR(idmap->idmap_dentry)) { + error = PTR_ERR(idmap->idmap_dentry); kfree(idmap); - return; + return error; } mutex_init(&idmap->idmap_lock); @@ -122,18 +137,17 @@ nfs_idmap_new(struct nfs4_client *clp) idmap->idmap_group_hash.h_type = IDMAP_TYPE_GROUP; clp->cl_idmap = idmap; + return 0; } void -nfs_idmap_delete(struct nfs4_client *clp) +nfs_idmap_delete(struct nfs_client *clp) { struct idmap *idmap = clp->cl_idmap; if (!idmap) return; - dput(idmap->idmap_dentry); - idmap->idmap_dentry = NULL; - rpc_unlink(idmap->idmap_path); + rpc_unlink(idmap->idmap_dentry); clp->cl_idmap = NULL; kfree(idmap); } @@ -480,27 +494,27 @@ static unsigned int fnvhash32(const void *buf, size_t buflen) return (hash); } -int nfs_map_name_to_uid(struct nfs4_client *clp, const char *name, size_t namelen, __u32 *uid) +int nfs_map_name_to_uid(struct nfs_client *clp, const char *name, size_t namelen, __u32 *uid) { struct idmap *idmap = clp->cl_idmap; return nfs_idmap_id(idmap, &idmap->idmap_user_hash, name, namelen, uid); } -int nfs_map_group_to_gid(struct nfs4_client *clp, const char *name, size_t namelen, __u32 *uid) +int nfs_map_group_to_gid(struct nfs_client *clp, const char *name, size_t namelen, __u32 *uid) { struct idmap *idmap = clp->cl_idmap; return nfs_idmap_id(idmap, &idmap->idmap_group_hash, name, namelen, uid); } -int nfs_map_uid_to_name(struct nfs4_client *clp, __u32 uid, char *buf) +int nfs_map_uid_to_name(struct nfs_client *clp, __u32 uid, char *buf) { struct idmap *idmap = clp->cl_idmap; return nfs_idmap_name(idmap, &idmap->idmap_user_hash, uid, buf); } -int nfs_map_gid_to_group(struct nfs4_client *clp, __u32 uid, char *buf) +int nfs_map_gid_to_group(struct nfs_client *clp, __u32 uid, char *buf) { struct idmap *idmap = clp->cl_idmap; diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 64bae2207..2d8cf645f 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -13,7 +13,6 @@ * */ -#include #include #include @@ -36,6 +35,8 @@ #include #include #include +#include +#include #include #include @@ -45,98 +46,19 @@ #include "callback.h" #include "delegation.h" #include "iostat.h" +#include "internal.h" #define NFSDBG_FACILITY NFSDBG_VFS #define NFS_PARANOIA 1 -/* Maximum number of readahead requests - * FIXME: this should really be a sysctl so that users may tune it to suit - * their needs. People that do NFS over a slow network, might for - * instance want to reduce it to something closer to 1 for improved - * interactive response. - */ -#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 *); -static struct inode *nfs_alloc_inode(struct super_block *sb); -static void nfs_destroy_inode(struct inode *); -static int nfs_write_inode(struct inode *,int); -static void nfs_delete_inode(struct inode *); -static void nfs_clear_inode(struct inode *); -static void nfs_umount_begin(struct super_block *); -static int nfs_statfs(struct super_block *, struct kstatfs *); -static int nfs_show_options(struct seq_file *, struct vfsmount *); -static int nfs_show_stats(struct seq_file *, struct vfsmount *); static void nfs_zap_acl_cache(struct inode *); -static struct rpc_program nfs_program; - -static struct super_operations nfs_sops = { - .alloc_inode = nfs_alloc_inode, - .destroy_inode = nfs_destroy_inode, - .write_inode = nfs_write_inode, - .delete_inode = nfs_delete_inode, - .statfs = nfs_statfs, - .clear_inode = nfs_clear_inode, - .umount_begin = nfs_umount_begin, - .show_options = nfs_show_options, - .show_stats = nfs_show_stats, -}; - -/* - * RPC cruft for NFS - */ -static struct rpc_stat nfs_rpcstat = { - .program = &nfs_program -}; -static struct rpc_version * nfs_version[] = { - NULL, - NULL, - &nfs_version2, -#if defined(CONFIG_NFS_V3) - &nfs_version3, -#elif defined(CONFIG_NFS_V4) - NULL, -#endif -#if defined(CONFIG_NFS_V4) - &nfs_version4, -#endif -}; - -static struct rpc_program nfs_program = { - .name = "nfs", - .number = NFS_PROGRAM, - .nrvers = ARRAY_SIZE(nfs_version), - .version = nfs_version, - .stats = &nfs_rpcstat, - .pipe_dir_name = "/nfs", -}; - -#ifdef CONFIG_NFS_V3_ACL -static struct rpc_stat nfsacl_rpcstat = { &nfsacl_program }; -static struct rpc_version * nfsacl_version[] = { - [3] = &nfsacl_version3, -}; - -struct rpc_program nfsacl_program = { - .name = "nfsacl", - .number = NFS_ACL_PROGRAM, - .nrvers = ARRAY_SIZE(nfsacl_version), - .version = nfsacl_version, - .stats = &nfsacl_rpcstat, -}; -#endif /* CONFIG_NFS_V3_ACL */ - -static inline unsigned long -nfs_fattr_to_ino_t(struct nfs_fattr *fattr) -{ - return nfs_fileid_to_ino_t(fattr->fileid); -} +static kmem_cache_t * nfs_inode_cachep; -static int -nfs_write_inode(struct inode *inode, int sync) +int nfs_write_inode(struct inode *inode, int sync) { int flags = sync ? FLUSH_SYNC : 0; int ret; @@ -147,591 +69,23 @@ nfs_write_inode(struct inode *inode, int sync) return 0; } -static void -nfs_delete_inode(struct inode * inode) +void nfs_clear_inode(struct inode *inode) { - dprintk("NFS: delete_inode(%s/%ld)\n", inode->i_sb->s_id, inode->i_ino); - - truncate_inode_pages(&inode->i_data, 0); + struct nfs_inode *nfsi = NFS_I(inode); + struct rpc_cred *cred; - nfs_wb_all(inode); /* * The following should never happen... */ - if (nfs_have_writebacks(inode)) { - printk(KERN_ERR "nfs_delete_inode: inode %ld has pending RPC requests\n", inode->i_ino); - } - - clear_inode(inode); -} - -static void -nfs_clear_inode(struct inode *inode) -{ - struct nfs_inode *nfsi = NFS_I(inode); - struct rpc_cred *cred; - - nfs_wb_all(inode); + BUG_ON(nfs_have_writebacks(inode)); BUG_ON (!list_empty(&nfsi->open_files)); nfs_zap_acl_cache(inode); cred = nfsi->cache_access.cred; if (cred) put_rpccred(cred); - BUG_ON(atomic_read(&nfsi->data_updates) != 0); -} - -void -nfs_umount_begin(struct super_block *sb) -{ - struct rpc_clnt *rpc = NFS_SB(sb)->client; - - /* -EIO all pending I/O */ - if (!IS_ERR(rpc)) - rpc_killall_tasks(rpc); - rpc = NFS_SB(sb)->client_acl; - if (!IS_ERR(rpc)) - rpc_killall_tasks(rpc); -} - - -static inline unsigned long -nfs_block_bits(unsigned long bsize, unsigned char *nrbitsp) -{ - /* make sure blocksize is a power of two */ - if ((bsize & (bsize - 1)) || nrbitsp) { - unsigned char nrbits; - - for (nrbits = 31; nrbits && !(bsize & (1 << nrbits)); nrbits--) - ; - bsize = 1 << nrbits; - if (nrbitsp) - *nrbitsp = nrbits; - } - - return bsize; -} - -/* - * Calculate the number of 512byte blocks used. - */ -static inline unsigned long -nfs_calc_block_size(u64 tsize) -{ - loff_t used = (tsize + 511) >> 9; - return (used > ULONG_MAX) ? ULONG_MAX : used; -} - -/* - * Compute and set NFS server blocksize - */ -static inline unsigned long -nfs_block_size(unsigned long bsize, unsigned char *nrbitsp) -{ - if (bsize < NFS_MIN_FILE_IO_SIZE) - bsize = NFS_DEF_FILE_IO_SIZE; - else if (bsize >= NFS_MAX_FILE_IO_SIZE) - bsize = NFS_MAX_FILE_IO_SIZE; - - return nfs_block_bits(bsize, nrbitsp); -} - -/* - * Obtain the root inode of the file system. - */ -static struct inode * -nfs_get_root(struct super_block *sb, struct nfs_fh *rootfh, struct nfs_fsinfo *fsinfo) -{ - struct nfs_server *server = NFS_SB(sb); - int error; - - error = server->rpc_ops->getroot(server, rootfh, fsinfo); - if (error < 0) { - dprintk("nfs_get_root: getattr error = %d\n", -error); - return ERR_PTR(error); - } - - return nfs_fhget(sb, rootfh, fsinfo->fattr); -} - -/* - * Do NFS version-independent mount processing, and sanity checking - */ -static int -nfs_sb_init(struct super_block *sb, rpc_authflavor_t authflavor) -{ - struct nfs_server *server; - struct inode *root_inode; - struct nfs_fattr fattr; - struct nfs_fsinfo fsinfo = { - .fattr = &fattr, - }; - struct nfs_pathconf pathinfo = { - .fattr = &fattr, - }; - int no_root_error = 0; - unsigned long max_rpc_payload; - - /* We probably want something more informative here */ - snprintf(sb->s_id, sizeof(sb->s_id), "%x:%x", MAJOR(sb->s_dev), MINOR(sb->s_dev)); - - server = NFS_SB(sb); - - sb->s_magic = NFS_SUPER_MAGIC; - - server->io_stats = nfs_alloc_iostats(); - if (server->io_stats == NULL) - return -ENOMEM; - - root_inode = nfs_get_root(sb, &server->fh, &fsinfo); - /* Did getting the root inode fail? */ - if (IS_ERR(root_inode)) { - no_root_error = PTR_ERR(root_inode); - goto out_no_root; - } - sb->s_root = d_alloc_root(root_inode); - if (!sb->s_root) { - no_root_error = -ENOMEM; - goto out_no_root; - } - sb->s_root->d_op = server->rpc_ops->dentry_ops; - - /* mount time stamp, in seconds */ - server->mount_time = jiffies; - - /* Get some general file system info */ - if (server->namelen == 0 && - server->rpc_ops->pathconf(server, &server->fh, &pathinfo) >= 0) - server->namelen = pathinfo.max_namelen; - /* Work out a lot of parameters */ - if (server->rsize == 0) - server->rsize = nfs_block_size(fsinfo.rtpref, NULL); - if (server->wsize == 0) - server->wsize = nfs_block_size(fsinfo.wtpref, NULL); - - if (fsinfo.rtmax >= 512 && server->rsize > fsinfo.rtmax) - server->rsize = nfs_block_size(fsinfo.rtmax, NULL); - if (fsinfo.wtmax >= 512 && server->wsize > fsinfo.wtmax) - server->wsize = nfs_block_size(fsinfo.wtmax, NULL); - - max_rpc_payload = nfs_block_size(rpc_max_payload(server->client), NULL); - if (server->rsize > max_rpc_payload) - server->rsize = max_rpc_payload; - if (server->rsize > NFS_MAX_FILE_IO_SIZE) - server->rsize = NFS_MAX_FILE_IO_SIZE; - server->rpages = (server->rsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; - - if (server->wsize > max_rpc_payload) - server->wsize = max_rpc_payload; - if (server->wsize > NFS_MAX_FILE_IO_SIZE) - server->wsize = NFS_MAX_FILE_IO_SIZE; - server->wpages = (server->wsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; - - if (sb->s_blocksize == 0) - sb->s_blocksize = nfs_block_bits(server->wsize, - &sb->s_blocksize_bits); - server->wtmult = nfs_block_bits(fsinfo.wtmult, NULL); - - server->dtsize = nfs_block_size(fsinfo.dtpref, NULL); - if (server->dtsize > PAGE_CACHE_SIZE) - server->dtsize = PAGE_CACHE_SIZE; - if (server->dtsize > server->rsize) - server->dtsize = server->rsize; - - if (server->flags & NFS_MOUNT_NOAC) { - server->acregmin = server->acregmax = 0; - server->acdirmin = server->acdirmax = 0; - sb->s_flags |= MS_SYNCHRONOUS; - } - server->backing_dev_info.ra_pages = server->rpages * NFS_MAX_READAHEAD; - - if (server->flags & NFS_MOUNT_TAGXID) - sb->s_flags |= MS_TAGXID; - - sb->s_maxbytes = fsinfo.maxfilesize; - if (sb->s_maxbytes > MAX_LFS_FILESIZE) - sb->s_maxbytes = MAX_LFS_FILESIZE; - - server->client->cl_intr = (server->flags & NFS_MOUNT_INTR) ? 1 : 0; - server->client->cl_softrtry = (server->flags & NFS_MOUNT_SOFT) ? 1 : 0; - server->client->cl_tagxid = (server->flags & NFS_MOUNT_TAGXID) ? 1 : 0; - - /* We're airborne Set socket buffersize */ - rpc_setbufsize(server->client, server->wsize + 100, server->rsize + 100); - return 0; - /* Yargs. It didn't work out. */ -out_no_root: - dprintk("nfs_sb_init: get root inode failed: errno %d\n", -no_root_error); - if (!IS_ERR(root_inode)) - iput(root_inode); - return no_root_error; -} - -static void nfs_init_timeout_values(struct rpc_timeout *to, int proto, unsigned int timeo, unsigned int retrans) -{ - to->to_initval = timeo * HZ / 10; - to->to_retries = retrans; - if (!to->to_retries) - to->to_retries = 2; - - switch (proto) { - case IPPROTO_TCP: - if (!to->to_initval) - to->to_initval = 60 * HZ; - if (to->to_initval > NFS_MAX_TCP_TIMEOUT) - to->to_initval = NFS_MAX_TCP_TIMEOUT; - to->to_increment = to->to_initval; - to->to_maxval = to->to_initval + (to->to_increment * to->to_retries); - to->to_exponential = 0; - break; - case IPPROTO_UDP: - default: - if (!to->to_initval) - to->to_initval = 11 * HZ / 10; - if (to->to_initval > NFS_MAX_UDP_TIMEOUT) - to->to_initval = NFS_MAX_UDP_TIMEOUT; - to->to_maxval = NFS_MAX_UDP_TIMEOUT; - to->to_exponential = 1; - break; - } -} - -/* - * Create an RPC client handle. - */ -static struct rpc_clnt * -nfs_create_client(struct nfs_server *server, const struct nfs_mount_data *data) -{ - struct rpc_timeout timeparms; - struct rpc_xprt *xprt = NULL; - struct rpc_clnt *clnt = NULL; - int proto = (data->flags & NFS_MOUNT_TCP) ? IPPROTO_TCP : IPPROTO_UDP; - - nfs_init_timeout_values(&timeparms, proto, data->timeo, data->retrans); - - server->retrans_timeo = timeparms.to_initval; - server->retrans_count = timeparms.to_retries; - - /* create transport and client */ - xprt = xprt_create_proto(proto, &server->addr, &timeparms); - if (IS_ERR(xprt)) { - dprintk("%s: cannot create RPC transport. Error = %ld\n", - __FUNCTION__, PTR_ERR(xprt)); - return (struct rpc_clnt *)xprt; - } - clnt = rpc_create_client(xprt, server->hostname, &nfs_program, - server->rpc_ops->version, data->pseudoflavor); - if (IS_ERR(clnt)) { - dprintk("%s: cannot create RPC client. Error = %ld\n", - __FUNCTION__, PTR_ERR(xprt)); - goto out_fail; - } - - clnt->cl_intr = 1; - clnt->cl_softrtry = 1; - clnt->cl_tagxid = 1; - - return clnt; - -out_fail: - return clnt; -} - -/* - * The way this works is that the mount process passes a structure - * in the data argument which contains the server's IP address - * and the root file handle obtained from the server's mount - * daemon. We stash these away in the private superblock fields. - */ -static int -nfs_fill_super(struct super_block *sb, struct nfs_mount_data *data, int silent) -{ - struct nfs_server *server; - rpc_authflavor_t authflavor; - - server = NFS_SB(sb); - sb->s_blocksize_bits = 0; - sb->s_blocksize = 0; - if (data->bsize) - sb->s_blocksize = nfs_block_size(data->bsize, &sb->s_blocksize_bits); - if (data->rsize) - server->rsize = nfs_block_size(data->rsize, NULL); - if (data->wsize) - server->wsize = nfs_block_size(data->wsize, NULL); - server->flags = data->flags & NFS_MOUNT_FLAGMASK; - - server->acregmin = data->acregmin*HZ; - server->acregmax = data->acregmax*HZ; - server->acdirmin = data->acdirmin*HZ; - server->acdirmax = data->acdirmax*HZ; - - /* Start lockd here, before we might error out */ - if (!(server->flags & NFS_MOUNT_NONLM)) - lockd_up(); - - server->namelen = data->namlen; - server->hostname = kmalloc(strlen(data->hostname) + 1, GFP_KERNEL); - if (!server->hostname) - return -ENOMEM; - strcpy(server->hostname, data->hostname); - - /* Check NFS protocol revision and initialize RPC op vector - * and file handle pool. */ -#ifdef CONFIG_NFS_V3 - if (server->flags & NFS_MOUNT_VER3) { - server->rpc_ops = &nfs_v3_clientops; - server->caps |= NFS_CAP_READDIRPLUS; - } else { - server->rpc_ops = &nfs_v2_clientops; - } -#else - server->rpc_ops = &nfs_v2_clientops; -#endif - - /* Fill in pseudoflavor for mount version < 5 */ - if (!(data->flags & NFS_MOUNT_SECFLAVOUR)) - data->pseudoflavor = RPC_AUTH_UNIX; - authflavor = data->pseudoflavor; /* save for sb_init() */ - /* XXX maybe we want to add a server->pseudoflavor field */ - - /* Create RPC client handles */ - server->client = nfs_create_client(server, data); - if (IS_ERR(server->client)) - return PTR_ERR(server->client); - /* RFC 2623, sec 2.3.2 */ - if (authflavor != RPC_AUTH_UNIX) { - struct rpc_auth *auth; - - server->client_sys = rpc_clone_client(server->client); - if (IS_ERR(server->client_sys)) - return PTR_ERR(server->client_sys); - auth = rpcauth_create(RPC_AUTH_UNIX, server->client_sys); - if (IS_ERR(auth)) - return PTR_ERR(auth); - } else { - atomic_inc(&server->client->cl_count); - server->client_sys = server->client; - } - if (server->flags & NFS_MOUNT_VER3) { -#ifdef CONFIG_NFS_V3_ACL - if (!(server->flags & NFS_MOUNT_NOACL)) { - server->client_acl = rpc_bind_new_program(server->client, &nfsacl_program, 3); - /* No errors! Assume that Sun nfsacls are supported */ - if (!IS_ERR(server->client_acl)) - server->caps |= NFS_CAP_ACLS; - } -#else - server->flags &= ~NFS_MOUNT_NOACL; -#endif /* CONFIG_NFS_V3_ACL */ - /* - * The VFS shouldn't apply the umask to mode bits. We will - * do so ourselves when necessary. - */ - sb->s_flags |= MS_POSIXACL; - if (server->namelen == 0 || server->namelen > NFS3_MAXNAMLEN) - server->namelen = NFS3_MAXNAMLEN; - sb->s_time_gran = 1; - } else { - if (server->namelen == 0 || server->namelen > NFS2_MAXNAMLEN) - server->namelen = NFS2_MAXNAMLEN; - } - - sb->s_op = &nfs_sops; - return nfs_sb_init(sb, authflavor); -} - -static int -nfs_statfs(struct super_block *sb, struct kstatfs *buf) -{ - struct nfs_server *server = NFS_SB(sb); - unsigned char blockbits; - unsigned long blockres; - struct nfs_fh *rootfh = NFS_FH(sb->s_root->d_inode); - struct nfs_fattr fattr; - struct nfs_fsstat res = { - .fattr = &fattr, - }; - int error; - - lock_kernel(); - - error = server->rpc_ops->statfs(server, rootfh, &res); - buf->f_type = NFS_SUPER_MAGIC; - if (error < 0) - goto out_err; - - /* - * Current versions of glibc do not correctly handle the - * case where f_frsize != f_bsize. Eventually we want to - * report the value of wtmult in this field. - */ - buf->f_frsize = sb->s_blocksize; - - /* - * On most *nix systems, f_blocks, f_bfree, and f_bavail - * are reported in units of f_frsize. Linux hasn't had - * an f_frsize field in its statfs struct until recently, - * thus historically Linux's sys_statfs reports these - * fields in units of f_bsize. - */ - buf->f_bsize = sb->s_blocksize; - blockbits = sb->s_blocksize_bits; - blockres = (1 << blockbits) - 1; - buf->f_blocks = (res.tbytes + blockres) >> blockbits; - buf->f_bfree = (res.fbytes + blockres) >> blockbits; - buf->f_bavail = (res.abytes + blockres) >> blockbits; - - buf->f_files = res.tfiles; - buf->f_ffree = res.afiles; - - buf->f_namelen = server->namelen; - out: - unlock_kernel(); - return 0; - - out_err: - dprintk("%s: statfs error = %d\n", __FUNCTION__, -error); - buf->f_bsize = buf->f_blocks = buf->f_bfree = buf->f_bavail = -1; - goto out; -} - -static void nfs_show_mount_options(struct seq_file *m, struct nfs_server *nfss, int showdefaults) -{ - static struct proc_nfs_info { - int flag; - char *str; - char *nostr; - } nfs_info[] = { - { NFS_MOUNT_SOFT, ",soft", ",hard" }, - { NFS_MOUNT_INTR, ",intr", "" }, - { NFS_MOUNT_NOCTO, ",nocto", "" }, - { NFS_MOUNT_NOAC, ",noac", "" }, - { NFS_MOUNT_NONLM, ",nolock", "" }, - { NFS_MOUNT_NOACL, ",noacl", "" }, - { NFS_MOUNT_TAGXID, ",tagxid", "" }, - { 0, NULL, NULL } - }; - struct proc_nfs_info *nfs_infop; - char buf[12]; - char *proto; - - seq_printf(m, ",vers=%d", nfss->rpc_ops->version); - seq_printf(m, ",rsize=%d", nfss->rsize); - seq_printf(m, ",wsize=%d", nfss->wsize); - if (nfss->acregmin != 3*HZ || showdefaults) - seq_printf(m, ",acregmin=%d", nfss->acregmin/HZ); - if (nfss->acregmax != 60*HZ || showdefaults) - seq_printf(m, ",acregmax=%d", nfss->acregmax/HZ); - if (nfss->acdirmin != 30*HZ || showdefaults) - seq_printf(m, ",acdirmin=%d", nfss->acdirmin/HZ); - if (nfss->acdirmax != 60*HZ || showdefaults) - seq_printf(m, ",acdirmax=%d", nfss->acdirmax/HZ); - for (nfs_infop = nfs_info; nfs_infop->flag; nfs_infop++) { - if (nfss->flags & nfs_infop->flag) - seq_puts(m, nfs_infop->str); - else - seq_puts(m, nfs_infop->nostr); - } - switch (nfss->client->cl_xprt->prot) { - case IPPROTO_TCP: - proto = "tcp"; - break; - case IPPROTO_UDP: - proto = "udp"; - break; - default: - snprintf(buf, sizeof(buf), "%u", nfss->client->cl_xprt->prot); - proto = buf; - } - seq_printf(m, ",proto=%s", proto); - seq_printf(m, ",timeo=%lu", 10U * nfss->retrans_timeo / HZ); - seq_printf(m, ",retrans=%u", nfss->retrans_count); -} - -static int nfs_show_options(struct seq_file *m, struct vfsmount *mnt) -{ - struct nfs_server *nfss = NFS_SB(mnt->mnt_sb); - - nfs_show_mount_options(m, nfss, 0); - - seq_puts(m, ",addr="); - seq_escape(m, nfss->hostname, " \t\n\\"); - - return 0; -} - -static int nfs_show_stats(struct seq_file *m, struct vfsmount *mnt) -{ - int i, cpu; - struct nfs_server *nfss = NFS_SB(mnt->mnt_sb); - struct rpc_auth *auth = nfss->client->cl_auth; - struct nfs_iostats totals = { }; - - seq_printf(m, "statvers=%s", NFS_IOSTAT_VERS); - - /* - * Display all mount option settings - */ - seq_printf(m, "\n\topts:\t"); - seq_puts(m, mnt->mnt_sb->s_flags & MS_RDONLY ? "ro" : "rw"); - seq_puts(m, mnt->mnt_sb->s_flags & MS_SYNCHRONOUS ? ",sync" : ""); - seq_puts(m, mnt->mnt_sb->s_flags & MS_NOATIME ? ",noatime" : ""); - seq_puts(m, mnt->mnt_sb->s_flags & MS_NODIRATIME ? ",nodiratime" : ""); - nfs_show_mount_options(m, nfss, 1); - - seq_printf(m, "\n\tage:\t%lu", (jiffies - nfss->mount_time) / HZ); - - seq_printf(m, "\n\tcaps:\t"); - seq_printf(m, "caps=0x%x", nfss->caps); - seq_printf(m, ",wtmult=%d", nfss->wtmult); - seq_printf(m, ",dtsize=%d", nfss->dtsize); - seq_printf(m, ",bsize=%d", nfss->bsize); - seq_printf(m, ",namelen=%d", nfss->namelen); - -#ifdef CONFIG_NFS_V4 - if (nfss->rpc_ops->version == 4) { - seq_printf(m, "\n\tnfsv4:\t"); - seq_printf(m, "bm0=0x%x", nfss->attr_bitmask[0]); - seq_printf(m, ",bm1=0x%x", nfss->attr_bitmask[1]); - seq_printf(m, ",acl=0x%x", nfss->acl_bitmask); - } -#endif - - /* - * Display security flavor in effect for this mount - */ - seq_printf(m, "\n\tsec:\tflavor=%d", auth->au_ops->au_flavor); - if (auth->au_flavor) - seq_printf(m, ",pseudoflavor=%d", auth->au_flavor); - - /* - * Display superblock I/O counters - */ - for_each_possible_cpu(cpu) { - struct nfs_iostats *stats; - - preempt_disable(); - stats = per_cpu_ptr(nfss->io_stats, cpu); - - for (i = 0; i < __NFSIOS_COUNTSMAX; i++) - totals.events[i] += stats->events[i]; - for (i = 0; i < __NFSIOS_BYTESMAX; i++) - totals.bytes[i] += stats->bytes[i]; - - preempt_enable(); - } - - seq_printf(m, "\n\tevents:\t"); - for (i = 0; i < __NFSIOS_COUNTSMAX; i++) - seq_printf(m, "%lu ", totals.events[i]); - seq_printf(m, "\n\tbytes:\t"); - for (i = 0; i < __NFSIOS_BYTESMAX; i++) - seq_printf(m, "%Lu ", totals.bytes[i]); - seq_printf(m, "\n"); - - rpc_print_iostats(m, nfss->client); - - return 0; + nfs_fscache_release_fh_cookie(NFS_SERVER(inode), nfsi); + BUG_ON(atomic_read(&nfsi->data_updates) != 0); } /** @@ -777,6 +131,8 @@ void nfs_zap_caches(struct inode *inode) spin_lock(&inode->i_lock); nfs_zap_caches_locked(inode); spin_unlock(&inode->i_lock); + + nfs_fscache_zap_fh_cookie(NFS_SERVER(inode), NFS_I(inode)); } static void nfs_zap_acl_cache(struct inode *inode) @@ -855,6 +211,7 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr) }; struct inode *inode = ERR_PTR(-ENOENT); unsigned long hash; + int maycache = 1; if ((fattr->valid & NFS_ATTR_FATTR) == 0) goto out_no_inode; @@ -864,7 +221,9 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr) goto out_no_inode; } - hash = nfs_fattr_to_ino_t(fattr); + hash = fattr->fileid; + if (sizeof(hash) < sizeof(u64)) + hash ^= fattr->fileid >> (sizeof(u64) - sizeof(ino_t)) * 8; inode = iget5_locked(sb, hash, nfs_find_actor, nfs_init_locked, &desc); if (inode == NULL) { @@ -875,9 +234,10 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr) if (inode->i_state & I_NEW) { struct nfs_inode *nfsi = NFS_I(inode); - /* We set i_ino for the few things that still rely on it, - * such as stat(2) */ - inode->i_ino = hash; + /* We set i_ino for the few things that still rely on it, such + * as printing messages; stat and filldir use the fileid + * directly since i_ino may not be large enough */ + inode->i_ino = fattr->fileid; /* We can't support update_atime(), since the server will reset it */ inode->i_flags |= S_NOATIME|S_NOCMTIME; @@ -885,17 +245,26 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr) /* Why so? Because we want revalidate for devices/FIFOs, and * that's precisely what we have in nfs_file_inode_operations. */ - inode->i_op = NFS_SB(sb)->rpc_ops->file_inode_ops; + inode->i_op = NFS_SB(sb)->nfs_client->rpc_ops->file_inode_ops; if (S_ISREG(inode->i_mode)) { inode->i_fop = &nfs_file_operations; inode->i_data.a_ops = &nfs_file_aops; inode->i_data.backing_dev_info = &NFS_SB(sb)->backing_dev_info; } else if (S_ISDIR(inode->i_mode)) { - inode->i_op = NFS_SB(sb)->rpc_ops->dir_inode_ops; + inode->i_op = NFS_SB(sb)->nfs_client->rpc_ops->dir_inode_ops; inode->i_fop = &nfs_dir_operations; if (nfs_server_capable(inode, NFS_CAP_READDIRPLUS) && fattr->size <= NFS_LIMIT_READDIRPLUS) set_bit(NFS_INO_ADVISE_RDPLUS, &NFS_FLAGS(inode)); + /* Deal with crossing mountpoints */ + if (!nfs_fsid_equal(&NFS_SB(sb)->fsid, &fattr->fsid)) { + if (fattr->valid & NFS_ATTR_FATTR_V4_REFERRAL) + inode->i_op = &nfs_referral_inode_operations; + else + inode->i_op = &nfs_mountpoint_inode_operations; + inode->i_fop = NULL; + maycache = 0; + } } else if (S_ISLNK(inode->i_mode)) inode->i_op = &nfs_symlink_inode_operations; else @@ -919,16 +288,16 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr) * report the blocks in 512byte units */ inode->i_blocks = nfs_calc_block_size(fattr->du.nfs3.used); - inode->i_blksize = inode->i_sb->s_blocksize; } else { inode->i_blocks = fattr->du.nfs2.blocks; - inode->i_blksize = fattr->du.nfs2.blocksize; } nfsi->attrtimeo = NFS_MINATTRTIMEO(inode); nfsi->attrtimeo_timestamp = jiffies; memset(nfsi->cookieverf, 0, sizeof(nfsi->cookieverf)); nfsi->cache_access.cred = NULL; + nfs_fscache_get_fh_cookie(sb, nfsi, maycache); + unlock_new_inode(inode); } else nfs_refresh_inode(inode, fattr); @@ -1013,6 +382,7 @@ void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr) if ((attr->ia_valid & ATTR_SIZE) != 0) { nfs_inc_stats(inode, NFSIOS_SETATTRTRUNC); inode->i_size = attr->ia_size; + nfs_fscache_set_size(NFS_SERVER(inode), NFS_I(inode), inode->i_size); vmtruncate(inode, attr->ia_size); } } @@ -1078,8 +448,10 @@ int nfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) err = __nfs_revalidate_inode(NFS_SERVER(inode), inode); else err = nfs_revalidate_inode(NFS_SERVER(inode), inode); - if (!err) + if (!err) { generic_fillattr(inode, stat); + stat->ino = NFS_FILEID(inode); + } return err; } @@ -1195,6 +567,8 @@ int nfs_open(struct inode *inode, struct file *filp) ctx->mode = filp->f_mode; nfs_file_set_open_context(filp, ctx); put_nfs_open_context(ctx); + if ((filp->f_flags & O_ACCMODE) != O_RDONLY) + nfs_fscache_disable_fh_cookie(inode); return 0; } @@ -1218,6 +592,7 @@ __nfs_revalidate_inode(struct nfs_server *server, struct inode *inode) dfprintk(PAGECACHE, "NFS: revalidating (%s/%Ld)\n", inode->i_sb->s_id, (long long)NFS_FILEID(inode)); + nfs_inc_stats(inode, NFSIOS_INODEREVALIDATE); lock_kernel(); if (!inode || is_bad_inode(inode)) goto out_nowait; @@ -1231,7 +606,7 @@ __nfs_revalidate_inode(struct nfs_server *server, struct inode *inode) status = -ESTALE; /* Do we trust the cached ESTALE? */ if (NFS_ATTRTIMEO(inode) != 0) { - if (nfsi->cache_validity & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ATIME)) { + if (nfsi->cache_validity & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ATIME)) { /* no */ } else goto out; @@ -1262,8 +637,6 @@ __nfs_revalidate_inode(struct nfs_server *server, struct inode *inode) } spin_unlock(&inode->i_lock); - nfs_revalidate_mapping(inode, inode->i_mapping); - if (nfsi->cache_validity & NFS_INO_INVALID_ACL) nfs_zap_acl_cache(inode); @@ -1297,8 +670,7 @@ int nfs_attribute_timeout(struct inode *inode) */ int nfs_revalidate_inode(struct nfs_server *server, struct inode *inode) { - nfs_inc_stats(inode, NFSIOS_INODEREVALIDATE); - if (!(NFS_I(inode)->cache_validity & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA)) + if (!(NFS_I(inode)->cache_validity & NFS_INO_INVALID_ATTR) && !nfs_attribute_timeout(inode)) return NFS_STALE(inode) ? -ESTALE : 0; return __nfs_revalidate_inode(server, inode); @@ -1309,9 +681,16 @@ int nfs_revalidate_inode(struct nfs_server *server, struct inode *inode) * @inode - pointer to host inode * @mapping - pointer to mapping */ -void nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping) +int nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping) { struct nfs_inode *nfsi = NFS_I(inode); + int ret = 0; + + if (NFS_STALE(inode)) + ret = -ESTALE; + if ((nfsi->cache_validity & NFS_INO_REVAL_PAGECACHE) + || nfs_attribute_timeout(inode)) + ret = __nfs_revalidate_inode(NFS_SERVER(inode), inode); if (nfsi->cache_validity & NFS_INO_INVALID_DATA) { nfs_inc_stats(inode, NFSIOS_DATAINVALIDATE); @@ -1328,10 +707,13 @@ void nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping) } spin_unlock(&inode->i_lock); + nfs_fscache_renew_fh_cookie(NFS_SERVER(inode), nfsi); + dfprintk(PAGECACHE, "NFS: (%s/%Ld) data cache invalidated\n", inode->i_sb->s_id, (long long)NFS_FILEID(inode)); } + return ret; } /** @@ -1371,12 +753,6 @@ static void nfs_wcc_update_inode(struct inode *inode, struct nfs_fattr *fattr) { struct nfs_inode *nfsi = NFS_I(inode); - if ((fattr->valid & NFS_ATTR_PRE_CHANGE) != 0 - && nfsi->change_attr == fattr->pre_change_attr) { - nfsi->change_attr = fattr->change_attr; - nfsi->cache_change_attribute = jiffies; - } - /* If we have atomic WCC data, we may update some attributes */ if ((fattr->valid & NFS_ATTR_WCC) != 0) { if (timespec_equal(&inode->i_ctime, &fattr->pre_ctime)) { @@ -1413,9 +789,6 @@ static int nfs_check_inode_attributes(struct inode *inode, struct nfs_fattr *fat xid_t xid; - if ((fattr->valid & NFS_ATTR_FATTR) == 0) - return 0; - /* Has the inode gone and changed behind our back? */ if (nfsi->fileid != fattr->fileid || (inode->i_mode & S_IFMT) != (fattr->mode & S_IFMT)) { @@ -1428,20 +801,13 @@ static int nfs_check_inode_attributes(struct inode *inode, struct nfs_fattr *fat /* Do atomic weak cache consistency updates */ nfs_wcc_update_inode(inode, fattr); - if ((fattr->valid & NFS_ATTR_FATTR_V4) != 0) { - if (nfsi->change_attr == fattr->change_attr) - goto out; - nfsi->cache_validity |= NFS_INO_INVALID_ATTR; - if (!data_unstable) - nfsi->cache_validity |= NFS_INO_REVAL_PAGECACHE; - } + if ((fattr->valid & NFS_ATTR_FATTR_V4) != 0 && + nfsi->change_attr != fattr->change_attr) + nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE; /* Verify a few of the more important attributes */ - if (!timespec_equal(&inode->i_mtime, &fattr->mtime)) { - nfsi->cache_validity |= NFS_INO_INVALID_ATTR; - if (!data_unstable) - nfsi->cache_validity |= NFS_INO_REVAL_PAGECACHE; - } + if (!timespec_equal(&inode->i_mtime, &fattr->mtime)) + nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE; cur_size = i_size_read(inode); new_isize = nfs_size_to_loff_t(fattr->size); @@ -1463,7 +829,6 @@ static int nfs_check_inode_attributes(struct inode *inode, struct nfs_fattr *fat if (inode->i_nlink != fattr->nlink) nfsi->cache_validity |= NFS_INO_INVALID_ATTR; -out: if (!timespec_equal(&inode->i_atime, &fattr->atime)) nfsi->cache_validity |= NFS_INO_INVALID_ATIME; @@ -1489,7 +854,6 @@ int nfs_refresh_inode(struct inode *inode, struct nfs_fattr *fattr) if ((fattr->valid & NFS_ATTR_FATTR) == 0) return 0; spin_lock(&inode->i_lock); - nfsi->cache_validity &= ~NFS_INO_REVAL_PAGECACHE; if (time_after(fattr->time_start, nfsi->last_updated)) status = nfs_update_inode(inode, fattr); else @@ -1514,7 +878,7 @@ int nfs_post_op_update_inode(struct inode *inode, struct nfs_fattr *fattr) spin_lock(&inode->i_lock); if (unlikely((fattr->valid & NFS_ATTR_FATTR) == 0)) { - nfsi->cache_validity |= NFS_INO_INVALID_ATTR | NFS_INO_INVALID_ACCESS; + nfsi->cache_validity |= NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE; goto out; } status = nfs_update_inode(inode, fattr); @@ -1537,6 +901,7 @@ out: */ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr) { + struct nfs_server *server; struct nfs_inode *nfsi = NFS_I(inode); loff_t cur_isize, new_isize; unsigned int invalid = 0; @@ -1549,9 +914,6 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr) __FUNCTION__, inode->i_sb->s_id, inode->i_ino, atomic_read(&inode->i_count), fattr->valid); - if ((fattr->valid & NFS_ATTR_FATTR) == 0) - return 0; - if (nfsi->fileid != fattr->fileid) goto out_fileid; @@ -1561,6 +923,12 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr) if ((inode->i_mode & S_IFMT) != (fattr->mode & S_IFMT)) goto out_changed; + server = NFS_SERVER(inode); + /* Update the fsid if and only if this is the root directory */ + if (inode == inode->i_sb->s_root->d_inode + && !nfs_fsid_equal(&server->fsid, &fattr->fsid)) + server->fsid = fattr->fsid; + /* * Update the read time so we don't revalidate too often. */ @@ -1570,7 +938,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr) /* Are we racing with known updates of the metadata on the server? */ data_stable = nfs_verify_change_attribute(inode, fattr->time_start); if (data_stable) - nfsi->cache_validity &= ~(NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ATIME); + nfsi->cache_validity &= ~(NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE|NFS_INO_INVALID_ATIME); /* Do atomic weak cache consistency updates */ nfs_wcc_update_inode(inode, fattr); @@ -1585,11 +953,13 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr) if (data_stable) { inode->i_size = new_isize; invalid |= NFS_INO_INVALID_DATA; + nfs_fscache_set_size(NFS_SERVER(inode), nfsi, inode->i_size); } invalid |= NFS_INO_INVALID_ATTR; } else if (new_isize > cur_isize) { inode->i_size = new_isize; invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA; + nfs_fscache_set_size(NFS_SERVER(inode), nfsi, inode->i_size); } nfsi->cache_change_attribute = jiffies; dprintk("NFS: isize change on server for file %s/%ld\n", @@ -1634,21 +1004,17 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr) * report the blocks in 512byte units */ inode->i_blocks = nfs_calc_block_size(fattr->du.nfs3.used); - inode->i_blksize = inode->i_sb->s_blocksize; } else { inode->i_blocks = fattr->du.nfs2.blocks; - inode->i_blksize = fattr->du.nfs2.blocksize; } - if ((fattr->valid & NFS_ATTR_FATTR_V4)) { - if (nfsi->change_attr != fattr->change_attr) { - 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; - invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL; - nfsi->cache_change_attribute = jiffies; - } else - invalid &= ~(NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA); + if ((fattr->valid & NFS_ATTR_FATTR_V4) != 0 && + nfsi->change_attr != fattr->change_attr) { + 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; + invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL; + nfsi->cache_change_attribute = jiffies; } /* Update attrtimeo value if we're out of the unstable period */ @@ -1691,195 +1057,20 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr) out_fileid: printk(KERN_ERR "NFS: server %s error: fileid changed\n" "fsid %s: expected fileid 0x%Lx, got 0x%Lx\n", - NFS_SERVER(inode)->hostname, inode->i_sb->s_id, + NFS_SERVER(inode)->nfs_client->cl_hostname, inode->i_sb->s_id, (long long)nfsi->fileid, (long long)fattr->fileid); goto out_err; } -/* - * File system information - */ - -static int nfs_set_super(struct super_block *s, void *data) -{ - s->s_fs_info = data; - return set_anon_super(s, data); -} - -static int nfs_compare_super(struct super_block *sb, void *data) -{ - struct nfs_server *server = data; - struct nfs_server *old = NFS_SB(sb); - - if (old->addr.sin_addr.s_addr != server->addr.sin_addr.s_addr) - return 0; - if (old->addr.sin_port != server->addr.sin_port) - return 0; - return !nfs_compare_fh(&old->fh, &server->fh); -} - -static struct super_block *nfs_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *raw_data) -{ - int error; - struct nfs_server *server = NULL; - struct super_block *s; - struct nfs_fh *root; - struct nfs_mount_data *data = raw_data; - - s = ERR_PTR(-EINVAL); - if (data == NULL) { - dprintk("%s: missing data argument\n", __FUNCTION__); - goto out_err; - } - if (data->version <= 0 || data->version > NFS_MOUNT_VERSION) { - dprintk("%s: bad mount version\n", __FUNCTION__); - goto out_err; - } - switch (data->version) { - case 1: - data->namlen = 0; - case 2: - data->bsize = 0; - case 3: - if (data->flags & NFS_MOUNT_VER3) { - dprintk("%s: mount structure version %d does not support NFSv3\n", - __FUNCTION__, - data->version); - goto out_err; - } - data->root.size = NFS2_FHSIZE; - memcpy(data->root.data, data->old_root.data, NFS2_FHSIZE); - case 4: - if (data->flags & NFS_MOUNT_SECFLAVOUR) { - dprintk("%s: mount structure version %d does not support strong security\n", - __FUNCTION__, - data->version); - goto out_err; - } - case 5: - memset(data->context, 0, sizeof(data->context)); - } -#ifndef CONFIG_NFS_V3 - /* If NFSv3 is not compiled in, return -EPROTONOSUPPORT */ - s = ERR_PTR(-EPROTONOSUPPORT); - if (data->flags & NFS_MOUNT_VER3) { - dprintk("%s: NFSv3 not compiled into kernel\n", __FUNCTION__); - goto out_err; - } -#endif /* CONFIG_NFS_V3 */ - - s = ERR_PTR(-ENOMEM); - server = kzalloc(sizeof(struct nfs_server), GFP_KERNEL); - if (!server) - goto out_err; - /* Zero out the NFS state stuff */ - init_nfsv4_state(server); - server->client = server->client_sys = server->client_acl = ERR_PTR(-EINVAL); - - root = &server->fh; - if (data->flags & NFS_MOUNT_VER3) - root->size = data->root.size; - else - root->size = NFS2_FHSIZE; - s = ERR_PTR(-EINVAL); - if (root->size > sizeof(root->data)) { - dprintk("%s: invalid root filehandle\n", __FUNCTION__); - goto out_err; - } - memcpy(root->data, data->root.data, root->size); - - /* We now require that the mount process passes the remote address */ - memcpy(&server->addr, &data->addr, sizeof(server->addr)); - if (server->addr.sin_addr.s_addr == INADDR_ANY) { - dprintk("%s: mount program didn't pass remote address!\n", - __FUNCTION__); - goto out_err; - } - - /* Fire up rpciod if not yet running */ - s = ERR_PTR(rpciod_up()); - if (IS_ERR(s)) { - dprintk("%s: couldn't start rpciod! Error = %ld\n", - __FUNCTION__, PTR_ERR(s)); - goto out_err; - } - - s = sget(fs_type, nfs_compare_super, nfs_set_super, server); - if (IS_ERR(s) || s->s_root) - goto out_rpciod_down; - - s->s_flags = flags; - - error = nfs_fill_super(s, data, flags & MS_SILENT ? 1 : 0); - if (error) { - up_write(&s->s_umount); - deactivate_super(s); - return ERR_PTR(error); - } - s->s_flags |= MS_ACTIVE; - return s; -out_rpciod_down: - rpciod_down(); -out_err: - kfree(server); - return s; -} - -static void nfs_kill_super(struct super_block *s) -{ - struct nfs_server *server = NFS_SB(s); - - kill_anon_super(s); - - if (!IS_ERR(server->client)) - rpc_shutdown_client(server->client); - if (!IS_ERR(server->client_sys)) - rpc_shutdown_client(server->client_sys); - if (!IS_ERR(server->client_acl)) - rpc_shutdown_client(server->client_acl); - - if (!(server->flags & NFS_MOUNT_NONLM)) - lockd_down(); /* release rpc.lockd */ - - rpciod_down(); /* release rpciod */ - - nfs_free_iostats(server->io_stats); - kfree(server->hostname); - kfree(server); -} - -static struct file_system_type nfs_fs_type = { - .owner = THIS_MODULE, - .name = "nfs", - .get_sb = nfs_get_sb, - .kill_sb = nfs_kill_super, - .fs_flags = FS_ODD_RENAME|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, -}; #ifdef CONFIG_NFS_V4 -static void nfs4_clear_inode(struct inode *); - - -static struct super_operations nfs4_sops = { - .alloc_inode = nfs_alloc_inode, - .destroy_inode = nfs_destroy_inode, - .write_inode = nfs_write_inode, - .delete_inode = nfs_delete_inode, - .statfs = nfs_statfs, - .clear_inode = nfs4_clear_inode, - .umount_begin = nfs_umount_begin, - .show_options = nfs_show_options, - .show_stats = nfs_show_stats, -}; - /* * Clean out any remaining NFSv4 state that might be left over due * to open() calls that passed nfs_atomic_lookup, but failed to call * nfs_open(). */ -static void nfs4_clear_inode(struct inode *inode) +void nfs4_clear_inode(struct inode *inode) { struct nfs_inode *nfsi = NFS_I(inode); @@ -1903,357 +1094,9 @@ static void nfs4_clear_inode(struct inode *inode) nfs4_close_state(state, state->state); } } - - -static int nfs4_fill_super(struct super_block *sb, struct nfs4_mount_data *data, int silent) -{ - struct nfs_server *server; - struct nfs4_client *clp = NULL; - struct rpc_xprt *xprt = NULL; - struct rpc_clnt *clnt = NULL; - struct rpc_timeout timeparms; - rpc_authflavor_t authflavour; - int err = -EIO; - - sb->s_blocksize_bits = 0; - sb->s_blocksize = 0; - server = NFS_SB(sb); - if (data->rsize != 0) - server->rsize = nfs_block_size(data->rsize, NULL); - if (data->wsize != 0) - server->wsize = nfs_block_size(data->wsize, NULL); - server->flags = data->flags & NFS_MOUNT_FLAGMASK; - server->caps = NFS_CAP_ATOMIC_OPEN; - - server->acregmin = data->acregmin*HZ; - server->acregmax = data->acregmax*HZ; - server->acdirmin = data->acdirmin*HZ; - server->acdirmax = data->acdirmax*HZ; - - server->rpc_ops = &nfs_v4_clientops; - - nfs_init_timeout_values(&timeparms, data->proto, data->timeo, data->retrans); - - server->retrans_timeo = timeparms.to_initval; - server->retrans_count = timeparms.to_retries; - - clp = nfs4_get_client(&server->addr.sin_addr); - if (!clp) { - dprintk("%s: failed to create NFS4 client.\n", __FUNCTION__); - return -EIO; - } - - /* Now create transport and client */ - authflavour = RPC_AUTH_UNIX; - if (data->auth_flavourlen != 0) { - if (data->auth_flavourlen != 1) { - dprintk("%s: Invalid number of RPC auth flavours %d.\n", - __FUNCTION__, data->auth_flavourlen); - err = -EINVAL; - goto out_fail; - } - if (copy_from_user(&authflavour, data->auth_flavours, sizeof(authflavour))) { - err = -EFAULT; - goto out_fail; - } - } - - down_write(&clp->cl_sem); - if (IS_ERR(clp->cl_rpcclient)) { - xprt = xprt_create_proto(data->proto, &server->addr, &timeparms); - if (IS_ERR(xprt)) { - up_write(&clp->cl_sem); - err = PTR_ERR(xprt); - dprintk("%s: cannot create RPC transport. Error = %d\n", - __FUNCTION__, err); - goto out_fail; - } - clnt = rpc_create_client(xprt, server->hostname, &nfs_program, - server->rpc_ops->version, authflavour); - if (IS_ERR(clnt)) { - up_write(&clp->cl_sem); - err = PTR_ERR(clnt); - dprintk("%s: cannot create RPC client. Error = %d\n", - __FUNCTION__, err); - goto out_fail; - } - clnt->cl_intr = 1; - clnt->cl_softrtry = 1; - clp->cl_rpcclient = clnt; - memcpy(clp->cl_ipaddr, server->ip_addr, sizeof(clp->cl_ipaddr)); - nfs_idmap_new(clp); - } - list_add_tail(&server->nfs4_siblings, &clp->cl_superblocks); - clnt = rpc_clone_client(clp->cl_rpcclient); - if (!IS_ERR(clnt)) - server->nfs4_state = clp; - up_write(&clp->cl_sem); - clp = NULL; - - if (IS_ERR(clnt)) { - err = PTR_ERR(clnt); - dprintk("%s: cannot create RPC client. Error = %d\n", - __FUNCTION__, err); - return err; - } - - server->client = clnt; - - if (server->nfs4_state->cl_idmap == NULL) { - dprintk("%s: failed to create idmapper.\n", __FUNCTION__); - return -ENOMEM; - } - - if (clnt->cl_auth->au_flavor != authflavour) { - struct rpc_auth *auth; - - auth = rpcauth_create(authflavour, clnt); - if (IS_ERR(auth)) { - dprintk("%s: couldn't create credcache!\n", __FUNCTION__); - return PTR_ERR(auth); - } - } - - sb->s_time_gran = 1; - - sb->s_op = &nfs4_sops; - err = nfs_sb_init(sb, authflavour); - if (err == 0) - return 0; -out_fail: - if (clp) - nfs4_put_client(clp); - return err; -} - -static int nfs4_compare_super(struct super_block *sb, void *data) -{ - struct nfs_server *server = data; - struct nfs_server *old = NFS_SB(sb); - - if (strcmp(server->hostname, old->hostname) != 0) - return 0; - if (strcmp(server->mnt_path, old->mnt_path) != 0) - return 0; - return 1; -} - -static void * -nfs_copy_user_string(char *dst, struct nfs_string *src, int maxlen) -{ - void *p = NULL; - - if (!src->len) - return ERR_PTR(-EINVAL); - if (src->len < maxlen) - maxlen = src->len; - if (dst == NULL) { - p = dst = kmalloc(maxlen + 1, GFP_KERNEL); - if (p == NULL) - return ERR_PTR(-ENOMEM); - } - if (copy_from_user(dst, src->data, maxlen)) { - kfree(p); - return ERR_PTR(-EFAULT); - } - dst[maxlen] = '\0'; - return dst; -} - -static struct super_block *nfs4_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *raw_data) -{ - int error; - struct nfs_server *server; - struct super_block *s; - struct nfs4_mount_data *data = raw_data; - void *p; - - if (data == NULL) { - dprintk("%s: missing data argument\n", __FUNCTION__); - return ERR_PTR(-EINVAL); - } - if (data->version <= 0 || data->version > NFS4_MOUNT_VERSION) { - dprintk("%s: bad mount version\n", __FUNCTION__); - return ERR_PTR(-EINVAL); - } - - server = kzalloc(sizeof(struct nfs_server), GFP_KERNEL); - if (!server) - return ERR_PTR(-ENOMEM); - /* Zero out the NFS state stuff */ - init_nfsv4_state(server); - server->client = server->client_sys = server->client_acl = ERR_PTR(-EINVAL); - - p = nfs_copy_user_string(NULL, &data->hostname, 256); - if (IS_ERR(p)) - goto out_err; - server->hostname = p; - - p = nfs_copy_user_string(NULL, &data->mnt_path, 1024); - if (IS_ERR(p)) - goto out_err; - server->mnt_path = p; - - p = nfs_copy_user_string(server->ip_addr, &data->client_addr, - sizeof(server->ip_addr) - 1); - if (IS_ERR(p)) - goto out_err; - - /* We now require that the mount process passes the remote address */ - if (data->host_addrlen != sizeof(server->addr)) { - s = ERR_PTR(-EINVAL); - goto out_free; - } - if (copy_from_user(&server->addr, data->host_addr, sizeof(server->addr))) { - s = ERR_PTR(-EFAULT); - goto out_free; - } - if (server->addr.sin_family != AF_INET || - server->addr.sin_addr.s_addr == INADDR_ANY) { - dprintk("%s: mount program didn't pass remote IP address!\n", - __FUNCTION__); - s = ERR_PTR(-EINVAL); - goto out_free; - } - - /* Fire up rpciod if not yet running */ - s = ERR_PTR(rpciod_up()); - if (IS_ERR(s)) { - dprintk("%s: couldn't start rpciod! Error = %ld\n", - __FUNCTION__, PTR_ERR(s)); - goto out_free; - } - - s = sget(fs_type, nfs4_compare_super, nfs_set_super, server); - - if (IS_ERR(s) || s->s_root) - goto out_free; - - s->s_flags = flags; - - error = nfs4_fill_super(s, data, flags & MS_SILENT ? 1 : 0); - if (error) { - up_write(&s->s_umount); - deactivate_super(s); - return ERR_PTR(error); - } - s->s_flags |= MS_ACTIVE; - return s; -out_err: - s = (struct super_block *)p; -out_free: - kfree(server->mnt_path); - kfree(server->hostname); - kfree(server); - return s; -} - -static void nfs4_kill_super(struct super_block *sb) -{ - struct nfs_server *server = NFS_SB(sb); - - nfs_return_all_delegations(sb); - kill_anon_super(sb); - - nfs4_renewd_prepare_shutdown(server); - - if (server->client != NULL && !IS_ERR(server->client)) - rpc_shutdown_client(server->client); - - destroy_nfsv4_state(server); - - rpciod_down(); - - nfs_free_iostats(server->io_stats); - kfree(server->hostname); - kfree(server); -} - -static struct file_system_type nfs4_fs_type = { - .owner = THIS_MODULE, - .name = "nfs4", - .get_sb = nfs4_get_sb, - .kill_sb = nfs4_kill_super, - .fs_flags = FS_ODD_RENAME|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, -}; - -static const int nfs_set_port_min = 0; -static const int nfs_set_port_max = 65535; -static int param_set_port(const char *val, struct kernel_param *kp) -{ - char *endp; - int num = simple_strtol(val, &endp, 0); - if (endp == val || *endp || num < nfs_set_port_min || num > nfs_set_port_max) - return -EINVAL; - *((int *)kp->arg) = num; - return 0; -} - -module_param_call(callback_tcpport, param_set_port, param_get_int, - &nfs_callback_set_tcpport, 0644); - -static int param_set_idmap_timeout(const char *val, struct kernel_param *kp) -{ - char *endp; - int num = simple_strtol(val, &endp, 0); - int jif = num * HZ; - if (endp == val || *endp || num < 0 || jif < num) - return -EINVAL; - *((int *)kp->arg) = jif; - return 0; -} - -module_param_call(idmap_cache_timeout, param_set_idmap_timeout, param_get_int, - &nfs_idmap_cache_timeout, 0644); - -#define nfs4_init_once(nfsi) \ - do { \ - INIT_LIST_HEAD(&(nfsi)->open_states); \ - nfsi->delegation = NULL; \ - nfsi->delegation_state = 0; \ - init_rwsem(&nfsi->rwsem); \ - } while(0) - -static inline int register_nfs4fs(void) -{ - int ret; - - ret = nfs_register_sysctl(); - if (ret != 0) - return ret; - ret = register_filesystem(&nfs4_fs_type); - if (ret != 0) - nfs_unregister_sysctl(); - return ret; -} - -static inline void unregister_nfs4fs(void) -{ - unregister_filesystem(&nfs4_fs_type); - nfs_unregister_sysctl(); -} -#else -#define nfs4_init_once(nfsi) \ - do { } while (0) -#define register_nfs4fs() (0) -#define unregister_nfs4fs() #endif -extern int nfs_init_nfspagecache(void); -extern void nfs_destroy_nfspagecache(void); -extern int nfs_init_readpagecache(void); -extern void nfs_destroy_readpagecache(void); -extern int nfs_init_writepagecache(void); -extern void nfs_destroy_writepagecache(void); -#ifdef CONFIG_NFS_DIRECTIO -extern int nfs_init_directcache(void); -extern void nfs_destroy_directcache(void); -#endif - -static kmem_cache_t * nfs_inode_cachep; - -static struct inode *nfs_alloc_inode(struct super_block *sb) +struct inode *nfs_alloc_inode(struct super_block *sb) { struct nfs_inode *nfsi; nfsi = (struct nfs_inode *)kmem_cache_alloc(nfs_inode_cachep, SLAB_KERNEL); @@ -2272,11 +1115,21 @@ static struct inode *nfs_alloc_inode(struct super_block *sb) return &nfsi->vfs_inode; } -static void nfs_destroy_inode(struct inode *inode) +void nfs_destroy_inode(struct inode *inode) { kmem_cache_free(nfs_inode_cachep, NFS_I(inode)); } +static inline void nfs4_init_once(struct nfs_inode *nfsi) +{ +#ifdef CONFIG_NFS_V4 + INIT_LIST_HEAD(&nfsi->open_states); + nfsi->delegation = NULL; + nfsi->delegation_state = 0; + init_rwsem(&nfsi->rwsem); +#endif +} + static void init_once(void * foo, kmem_cache_t * cachep, unsigned long flags) { struct nfs_inode *nfsi = (struct nfs_inode *) foo; @@ -2297,7 +1150,7 @@ static void init_once(void * foo, kmem_cache_t * cachep, unsigned long flags) } } -static int nfs_init_inodecache(void) +static int __init nfs_init_inodecache(void) { nfs_inode_cachep = kmem_cache_create("nfs_inode_cache", sizeof(struct nfs_inode), @@ -2323,6 +1176,14 @@ static int __init init_nfs_fs(void) { int err; + err = nfs_fscache_register(); + if (err < 0) + goto out6; + + err = nfs_fs_proc_init(); + if (err) + goto out5; + err = nfs_init_nfspagecache(); if (err) goto out4; @@ -2339,29 +1200,22 @@ static int __init init_nfs_fs(void) if (err) goto out1; -#ifdef CONFIG_NFS_DIRECTIO err = nfs_init_directcache(); if (err) goto out0; -#endif #ifdef CONFIG_PROC_FS rpc_proc_register(&nfs_rpcstat); #endif - err = register_filesystem(&nfs_fs_type); - if (err) - goto out; - if ((err = register_nfs4fs()) != 0) + if ((err = register_nfs_fs()) != 0) goto out; return 0; out: #ifdef CONFIG_PROC_FS rpc_proc_unregister("nfs"); #endif -#ifdef CONFIG_NFS_DIRECTIO nfs_destroy_directcache(); out0: -#endif nfs_destroy_writepagecache(); out1: nfs_destroy_readpagecache(); @@ -2370,23 +1224,26 @@ out2: out3: nfs_destroy_nfspagecache(); out4: + nfs_fs_proc_exit(); +out5: + nfs_fscache_unregister(); +out6: return err; } static void __exit exit_nfs_fs(void) { -#ifdef CONFIG_NFS_DIRECTIO nfs_destroy_directcache(); -#endif nfs_destroy_writepagecache(); nfs_destroy_readpagecache(); nfs_destroy_inodecache(); nfs_destroy_nfspagecache(); + nfs_fscache_unregister(); #ifdef CONFIG_PROC_FS rpc_proc_unregister("nfs"); #endif - unregister_filesystem(&nfs_fs_type); - unregister_nfs4fs(); + unregister_nfs_fs(); + nfs_fs_proc_exit(); } /* Not quite true; I just maintain it */ diff --git a/fs/nfs/nfs2xdr.c b/fs/nfs/nfs2xdr.c index f0015fa87..67391eef6 100644 --- a/fs/nfs/nfs2xdr.c +++ b/fs/nfs/nfs2xdr.c @@ -23,12 +23,11 @@ #include #include #include +#include "internal.h" #define NFSDBG_FACILITY NFSDBG_XDR /* #define NFS_PARANOIA 1 */ -extern int nfs_stat_to_errno(int stat); - /* Mapping from NFS error code to "errno" error code. */ #define errno_NFSERR_IO EIO @@ -131,7 +130,8 @@ xdr_decode_fattr(u32 *p, struct nfs_fattr *fattr) fattr->du.nfs2.blocksize = ntohl(*p++); rdev = ntohl(*p++); fattr->du.nfs2.blocks = ntohl(*p++); - fattr->fsid_u.nfs3 = ntohl(*p++); + fattr->fsid.major = ntohl(*p++); + fattr->fsid.minor = 0; fattr->fileid = ntohl(*p++); p = xdr_decode_time(p, &fattr->atime); p = xdr_decode_time(p, &fattr->mtime); diff --git a/fs/nfs/nfs3acl.c b/fs/nfs/nfs3acl.c index 33287879b..7322da4d2 100644 --- a/fs/nfs/nfs3acl.c +++ b/fs/nfs/nfs3acl.c @@ -172,8 +172,10 @@ static void nfs3_cache_acls(struct inode *inode, struct posix_acl *acl, inode->i_ino, acl, dfacl); spin_lock(&inode->i_lock); __nfs3_forget_cached_acls(NFS_I(inode)); - nfsi->acl_access = posix_acl_dup(acl); - nfsi->acl_default = posix_acl_dup(dfacl); + if (!IS_ERR(acl)) + nfsi->acl_access = posix_acl_dup(acl); + if (!IS_ERR(dfacl)) + nfsi->acl_default = posix_acl_dup(dfacl); spin_unlock(&inode->i_lock); } @@ -254,7 +256,9 @@ struct posix_acl *nfs3_proc_getacl(struct inode *inode, int type) res.acl_access = NULL; } } - nfs3_cache_acls(inode, res.acl_access, res.acl_default); + nfs3_cache_acls(inode, + (res.mask & NFS_ACL) ? res.acl_access : ERR_PTR(-EINVAL), + (res.mask & NFS_DFACL) ? res.acl_default : ERR_PTR(-EINVAL)); switch(type) { case ACL_TYPE_ACCESS: @@ -329,6 +333,7 @@ static int nfs3_proc_setacls(struct inode *inode, struct posix_acl *acl, switch (status) { case 0: status = nfs_refresh_inode(inode, &fattr); + nfs3_cache_acls(inode, acl, dfacl); break; case -EPFNOSUPPORT: case -EPROTONOSUPPORT: diff --git a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c index cf186f0d2..9e8258ece 100644 --- a/fs/nfs/nfs3proc.c +++ b/fs/nfs/nfs3proc.c @@ -20,11 +20,10 @@ #include #include "iostat.h" +#include "internal.h" #define NFSDBG_FACILITY NFSDBG_PROC -extern struct rpc_procinfo nfs3_procedures[]; - /* A wrapper to handle the EJUKEBOX error message */ static int nfs3_rpc_wrapper(struct rpc_clnt *clnt, struct rpc_message *msg, int flags) @@ -82,7 +81,7 @@ do_proc_get_root(struct rpc_clnt *client, struct nfs_fh *fhandle, } /* - * Bare-bones access to getattr: this is for nfs_read_super. + * Bare-bones access to getattr: this is for nfs_get_root/nfs_get_sb */ static int nfs3_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle, @@ -91,8 +90,8 @@ nfs3_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle, int status; status = do_proc_get_root(server->client, fhandle, info); - if (status && server->client_sys != server->client) - status = do_proc_get_root(server->client_sys, fhandle, info); + if (status && server->nfs_client->cl_rpcclient != server->client) + status = do_proc_get_root(server->nfs_client->cl_rpcclient, fhandle, info); return status; } @@ -786,7 +785,7 @@ nfs3_proc_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, dprintk("NFS call fsinfo\n"); nfs_fattr_init(info->fattr); - status = rpc_call_sync(server->client_sys, &msg, 0); + status = rpc_call_sync(server->nfs_client->cl_rpcclient, &msg, 0); dprintk("NFS reply fsinfo: %d\n", status); return status; } @@ -809,8 +808,6 @@ nfs3_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle, return status; } -extern u32 *nfs3_decode_dirent(u32 *, struct nfs_entry *, int); - static int nfs3_read_done(struct rpc_task *task, struct nfs_read_data *data) { if (nfs3_async_handle_jukebox(task, data->inode)) @@ -889,7 +886,7 @@ nfs3_proc_lock(struct file *filp, int cmd, struct file_lock *fl) return nlmclnt_proc(filp->f_dentry->d_inode, cmd, fl); } -struct nfs_rpc_ops nfs_v3_clientops = { +const struct nfs_rpc_ops nfs_v3_clientops = { .version = 3, /* protocol version */ .dentry_ops = &nfs_dentry_operations, .dir_inode_ops = &nfs3_dir_inode_operations, diff --git a/fs/nfs/nfs3xdr.c b/fs/nfs/nfs3xdr.c index 884969461..442d8c4bb 100644 --- a/fs/nfs/nfs3xdr.c +++ b/fs/nfs/nfs3xdr.c @@ -23,14 +23,13 @@ #include #include #include +#include "internal.h" #define NFSDBG_FACILITY NFSDBG_XDR /* Mapping from NFS error code to "errno" error code. */ #define errno_NFSERR_IO EIO -extern int nfs_stat_to_errno(int); - /* * Declare the space requirements for NFS arguments and replies as * number of 32bit-words @@ -167,7 +166,8 @@ xdr_decode_fattr(u32 *p, struct nfs_fattr *fattr) if (MAJOR(fattr->rdev) != major || MINOR(fattr->rdev) != minor) fattr->rdev = 0; - p = xdr_decode_hyper(p, &fattr->fsid_u.nfs3); + p = xdr_decode_hyper(p, &fattr->fsid.major); + fattr->fsid.minor = 0; p = xdr_decode_hyper(p, &fattr->fileid); p = xdr_decode_time3(p, &fattr->atime); p = xdr_decode_time3(p, &fattr->mtime); diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h index 0f5e4e7cd..61095fe4b 100644 --- a/fs/nfs/nfs4_fs.h +++ b/fs/nfs/nfs4_fs.h @@ -42,55 +42,6 @@ enum nfs4_client_state { NFS4CLNT_LEASE_EXPIRED, }; -/* - * The nfs4_client identifies our client state to the server. - */ -struct nfs4_client { - struct list_head cl_servers; /* Global list of servers */ - struct in_addr cl_addr; /* Server identifier */ - u64 cl_clientid; /* constant */ - nfs4_verifier cl_confirm; - unsigned long cl_state; - - u32 cl_lockowner_id; - - /* - * The following rwsem ensures exclusive access to the server - * while we recover the state following a lease expiration. - */ - struct rw_semaphore cl_sem; - - struct list_head cl_delegations; - struct list_head cl_state_owners; - struct list_head cl_unused; - int cl_nunused; - spinlock_t cl_lock; - atomic_t cl_count; - - struct rpc_clnt * cl_rpcclient; - - struct list_head cl_superblocks; /* List of nfs_server structs */ - - unsigned long cl_lease_time; - unsigned long cl_last_renewal; - struct work_struct cl_renewd; - struct work_struct cl_recoverd; - - struct rpc_wait_queue cl_rpcwaitq; - - /* used for the setclientid verifier */ - struct timespec cl_boot_time; - - /* idmapper */ - struct idmap * cl_idmap; - - /* Our own IP address, as a null-terminated string. - * This is used to generate the clientid, and the callback address. - */ - char cl_ipaddr[16]; - unsigned char cl_id_uniquifier; -}; - /* * struct rpc_sequence ensures that RPC calls are sent in the exact * order that they appear on the list. @@ -127,7 +78,7 @@ static inline void nfs_confirm_seqid(struct nfs_seqid_counter *seqid, int status struct nfs4_state_owner { spinlock_t so_lock; struct list_head so_list; /* per-clientid list of state_owners */ - struct nfs4_client *so_client; + struct nfs_client *so_client; u32 so_id; /* 32-bit identifier, unique */ atomic_t so_count; @@ -210,13 +161,16 @@ extern ssize_t nfs4_listxattr(struct dentry *, char *, size_t); /* nfs4proc.c */ extern int nfs4_map_errors(int err); -extern int nfs4_proc_setclientid(struct nfs4_client *, u32, unsigned short, struct rpc_cred *); -extern int nfs4_proc_setclientid_confirm(struct nfs4_client *, struct rpc_cred *); -extern int nfs4_proc_async_renew(struct nfs4_client *, struct rpc_cred *); -extern int nfs4_proc_renew(struct nfs4_client *, struct rpc_cred *); +extern int nfs4_proc_setclientid(struct nfs_client *, u32, unsigned short, struct rpc_cred *); +extern int nfs4_proc_setclientid_confirm(struct nfs_client *, struct rpc_cred *); +extern int nfs4_proc_async_renew(struct nfs_client *, struct rpc_cred *); +extern int nfs4_proc_renew(struct nfs_client *, struct rpc_cred *); extern int nfs4_do_close(struct inode *inode, struct nfs4_state *state); extern struct dentry *nfs4_atomic_open(struct inode *, struct dentry *, struct nameidata *); extern int nfs4_open_revalidate(struct inode *, struct dentry *, int, struct nameidata *); +extern int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle); +extern int nfs4_proc_fs_locations(struct inode *dir, struct dentry *dentry, + struct nfs4_fs_locations *fs_locations, struct page *page); extern struct nfs4_state_recovery_ops nfs4_reboot_recovery_ops; extern struct nfs4_state_recovery_ops nfs4_network_partition_recovery_ops; @@ -225,21 +179,17 @@ extern const u32 nfs4_fattr_bitmap[2]; extern const u32 nfs4_statfs_bitmap[2]; extern const u32 nfs4_pathconf_bitmap[2]; extern const u32 nfs4_fsinfo_bitmap[2]; +extern const u32 nfs4_fs_locations_bitmap[2]; /* nfs4renewd.c */ -extern void nfs4_schedule_state_renewal(struct nfs4_client *); +extern void nfs4_schedule_state_renewal(struct nfs_client *); extern void nfs4_renewd_prepare_shutdown(struct nfs_server *); -extern void nfs4_kill_renewd(struct nfs4_client *); +extern void nfs4_kill_renewd(struct nfs_client *); extern void nfs4_renew_state(void *); /* nfs4state.c */ -extern void init_nfsv4_state(struct nfs_server *); -extern void destroy_nfsv4_state(struct nfs_server *); -extern struct nfs4_client *nfs4_get_client(struct in_addr *); -extern void nfs4_put_client(struct nfs4_client *clp); -extern struct nfs4_client *nfs4_find_client(struct in_addr *); -struct rpc_cred *nfs4_get_renew_cred(struct nfs4_client *clp); -extern u32 nfs4_alloc_lockowner_id(struct nfs4_client *); +struct rpc_cred *nfs4_get_renew_cred(struct nfs_client *clp); +extern u32 nfs4_alloc_lockowner_id(struct nfs_client *); extern struct nfs4_state_owner * nfs4_get_state_owner(struct nfs_server *, struct rpc_cred *); extern void nfs4_put_state_owner(struct nfs4_state_owner *); @@ -248,7 +198,7 @@ extern struct nfs4_state * nfs4_get_open_state(struct inode *, struct nfs4_state extern void nfs4_put_open_state(struct nfs4_state *); extern void nfs4_close_state(struct nfs4_state *, mode_t); extern void nfs4_state_set_mode_locked(struct nfs4_state *, mode_t); -extern void nfs4_schedule_state_recovery(struct nfs4_client *); +extern void nfs4_schedule_state_recovery(struct nfs_client *); extern void nfs4_put_lock_state(struct nfs4_lock_state *lsp); extern int nfs4_set_lock_state(struct nfs4_state *state, struct file_lock *fl); extern void nfs4_copy_stateid(nfs4_stateid *, struct nfs4_state *, fl_owner_t); @@ -272,10 +222,6 @@ extern struct svc_version nfs4_callback_version1; #else -#define init_nfsv4_state(server) do { } while (0) -#define destroy_nfsv4_state(server) do { } while (0) -#define nfs4_put_state_owner(inode, owner) do { } while (0) -#define nfs4_put_open_state(state) do { } while (0) #define nfs4_close_state(a, b) do { } while (0) #endif /* CONFIG_NFS_V4 */ diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index d86c0db7b..a825547e8 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -64,9 +64,7 @@ static int nfs4_do_fsinfo(struct nfs_server *, struct nfs_fh *, struct nfs_fsinf static int nfs4_async_handle_error(struct rpc_task *, const struct nfs_server *); static int _nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry); static int nfs4_handle_exception(const struct nfs_server *server, int errorcode, struct nfs4_exception *exception); -static int nfs4_wait_clnt_recover(struct rpc_clnt *clnt, struct nfs4_client *clp); -extern u32 *nfs4_decode_dirent(u32 *p, struct nfs_entry *entry, int plus); -extern struct rpc_procinfo nfs4_procedures[]; +static int nfs4_wait_clnt_recover(struct rpc_clnt *clnt, struct nfs_client *clp); /* Prevent leaks of NFSv4 errors into userland */ int nfs4_map_errors(int err) @@ -121,6 +119,25 @@ const u32 nfs4_fsinfo_bitmap[2] = { FATTR4_WORD0_MAXFILESIZE 0 }; +const u32 nfs4_fs_locations_bitmap[2] = { + FATTR4_WORD0_TYPE + | FATTR4_WORD0_CHANGE + | FATTR4_WORD0_SIZE + | FATTR4_WORD0_FSID + | FATTR4_WORD0_FILEID + | FATTR4_WORD0_FS_LOCATIONS, + FATTR4_WORD1_MODE + | FATTR4_WORD1_NUMLINKS + | FATTR4_WORD1_OWNER + | FATTR4_WORD1_OWNER_GROUP + | FATTR4_WORD1_RAWDEV + | FATTR4_WORD1_SPACE_USED + | FATTR4_WORD1_TIME_ACCESS + | FATTR4_WORD1_TIME_METADATA + | FATTR4_WORD1_TIME_MODIFY + | FATTR4_WORD1_MOUNTED_ON_FILEID +}; + static void nfs4_setup_readdir(u64 cookie, u32 *verifier, struct dentry *dentry, struct nfs4_readdir_arg *readdir) { @@ -178,22 +195,22 @@ static void nfs4_setup_readdir(u64 cookie, u32 *verifier, struct dentry *dentry, static void renew_lease(const struct nfs_server *server, unsigned long timestamp) { - struct nfs4_client *clp = server->nfs4_state; + struct nfs_client *clp = server->nfs_client; spin_lock(&clp->cl_lock); if (time_before(clp->cl_last_renewal,timestamp)) clp->cl_last_renewal = timestamp; spin_unlock(&clp->cl_lock); } -static void update_changeattr(struct inode *inode, struct nfs4_change_info *cinfo) +static void update_changeattr(struct inode *dir, struct nfs4_change_info *cinfo) { - struct nfs_inode *nfsi = NFS_I(inode); + struct nfs_inode *nfsi = NFS_I(dir); - spin_lock(&inode->i_lock); - nfsi->cache_validity |= NFS_INO_INVALID_ATTR; + spin_lock(&dir->i_lock); + nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE|NFS_INO_INVALID_DATA; if (cinfo->before == nfsi->change_attr && cinfo->atomic) nfsi->change_attr = cinfo->after; - spin_unlock(&inode->i_lock); + spin_unlock(&dir->i_lock); } struct nfs4_opendata { @@ -235,7 +252,7 @@ static struct nfs4_opendata *nfs4_opendata_alloc(struct dentry *dentry, atomic_inc(&sp->so_count); p->o_arg.fh = NFS_FH(dir); p->o_arg.open_flags = flags, - p->o_arg.clientid = server->nfs4_state->cl_clientid; + p->o_arg.clientid = server->nfs_client->cl_clientid; p->o_arg.id = sp->so_id; p->o_arg.name = &dentry->d_name; p->o_arg.server = server; @@ -533,7 +550,7 @@ int nfs4_open_delegation_recall(struct dentry *dentry, struct nfs4_state *state) case -NFS4ERR_STALE_STATEID: case -NFS4ERR_EXPIRED: /* Don't recall a delegation if it was lost */ - nfs4_schedule_state_recovery(server->nfs4_state); + nfs4_schedule_state_recovery(server->nfs_client); return err; } err = nfs4_handle_exception(server, err, &exception); @@ -741,7 +758,7 @@ static int _nfs4_proc_open(struct nfs4_opendata *data) } nfs_confirm_seqid(&data->owner->so_seqid, 0); if (!(o_res->f_attr->valid & NFS_ATTR_FATTR)) - return server->rpc_ops->getattr(server, &o_res->fh, o_res->f_attr); + return server->nfs_client->rpc_ops->getattr(server, &o_res->fh, o_res->f_attr); return 0; } @@ -775,7 +792,7 @@ out: int nfs4_recover_expired_lease(struct nfs_server *server) { - struct nfs4_client *clp = server->nfs4_state; + struct nfs_client *clp = server->nfs_client; if (test_and_clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) nfs4_schedule_state_recovery(clp); @@ -850,7 +867,7 @@ static int _nfs4_open_delegated(struct inode *inode, int flags, struct rpc_cred { struct nfs_delegation *delegation; struct nfs_server *server = NFS_SERVER(inode); - struct nfs4_client *clp = server->nfs4_state; + struct nfs_client *clp = server->nfs_client; struct nfs_inode *nfsi = NFS_I(inode); struct nfs4_state_owner *sp = NULL; struct nfs4_state *state = NULL; @@ -936,7 +953,7 @@ static int _nfs4_do_open(struct inode *dir, struct dentry *dentry, int flags, st struct nfs4_state_owner *sp; struct nfs4_state *state = NULL; struct nfs_server *server = NFS_SERVER(dir); - struct nfs4_client *clp = server->nfs4_state; + struct nfs_client *clp = server->nfs_client; struct nfs4_opendata *opendata; int status; @@ -953,7 +970,7 @@ static int _nfs4_do_open(struct inode *dir, struct dentry *dentry, int flags, st status = -ENOMEM; opendata = nfs4_opendata_alloc(dentry, sp, flags, sattr); if (opendata == NULL) - goto err_put_state_owner; + goto err_release_rwsem; status = _nfs4_proc_open(opendata); if (status != 0) @@ -972,11 +989,11 @@ static int _nfs4_do_open(struct inode *dir, struct dentry *dentry, int flags, st return 0; err_opendata_free: nfs4_opendata_free(opendata); +err_release_rwsem: + up_read(&clp->cl_sem); err_put_state_owner: nfs4_put_state_owner(sp); out_err: - /* Note: clp->cl_sem must be released before nfs4_put_open_state()! */ - up_read(&clp->cl_sem); *res = NULL; return status; } @@ -1116,7 +1133,7 @@ static void nfs4_close_done(struct rpc_task *task, void *data) break; case -NFS4ERR_STALE_STATEID: case -NFS4ERR_EXPIRED: - nfs4_schedule_state_recovery(server->nfs4_state); + nfs4_schedule_state_recovery(server->nfs_client); break; default: if (nfs4_async_handle_error(task, server) == -EAGAIN) { @@ -1251,7 +1268,7 @@ nfs4_atomic_open(struct inode *dir, struct dentry *dentry, struct nameidata *nd) BUG_ON(nd->intent.open.flags & O_CREAT); } - cred = rpcauth_lookupcred(NFS_SERVER(dir)->client->cl_auth, 0); + cred = rpcauth_lookupcred(NFS_CLIENT(dir)->cl_auth, 0); if (IS_ERR(cred)) return (struct dentry *)cred; state = nfs4_do_open(dir, dentry, nd->intent.open.flags, &attr, cred); @@ -1274,7 +1291,7 @@ nfs4_open_revalidate(struct inode *dir, struct dentry *dentry, int openflags, st struct rpc_cred *cred; struct nfs4_state *state; - cred = rpcauth_lookupcred(NFS_SERVER(dir)->client->cl_auth, 0); + cred = rpcauth_lookupcred(NFS_CLIENT(dir)->cl_auth, 0); if (IS_ERR(cred)) return PTR_ERR(cred); state = nfs4_open_delegated(dentry->d_inode, openflags, cred); @@ -1331,7 +1348,7 @@ static int _nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *f return status; } -static int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle) +int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle) { struct nfs4_exception exception = { }; int err; @@ -1376,73 +1393,66 @@ static int nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle, return err; } +/* + * get the file handle for the "/" directory on the server + */ static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle, - struct nfs_fsinfo *info) + struct nfs_fsinfo *info) { - struct nfs_fattr * fattr = info->fattr; - unsigned char * p; - struct qstr q; - struct nfs4_lookup_arg args = { - .dir_fh = fhandle, - .name = &q, - .bitmask = nfs4_fattr_bitmap, - }; - struct nfs4_lookup_res res = { - .server = server, - .fattr = fattr, - .fh = fhandle, - }; - struct rpc_message msg = { - .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP], - .rpc_argp = &args, - .rpc_resp = &res, - }; int status; - /* - * Now we do a separate LOOKUP for each component of the mount path. - * The LOOKUPs are done separately so that we can conveniently - * catch an ERR_WRONGSEC if it occurs along the way... - */ status = nfs4_lookup_root(server, fhandle, info); - if (status) - goto out; - - p = server->mnt_path; - for (;;) { - struct nfs4_exception exception = { }; - - while (*p == '/') - p++; - if (!*p) - break; - q.name = p; - while (*p && (*p != '/')) - p++; - q.len = p - q.name; - - do { - nfs_fattr_init(fattr); - status = nfs4_handle_exception(server, - rpc_call_sync(server->client, &msg, 0), - &exception); - } while (exception.retry); - if (status == 0) - continue; - if (status == -ENOENT) { - printk(KERN_NOTICE "NFS: mount path %s does not exist!\n", server->mnt_path); - printk(KERN_NOTICE "NFS: suggestion: try mounting '/' instead.\n"); - } - break; - } if (status == 0) status = nfs4_server_capabilities(server, fhandle); if (status == 0) status = nfs4_do_fsinfo(server, fhandle, info); -out: return nfs4_map_errors(status); } +/* + * Get locations and (maybe) other attributes of a referral. + * Note that we'll actually follow the referral later when + * we detect fsid mismatch in inode revalidation + */ +static int nfs4_get_referral(struct inode *dir, struct qstr *name, struct nfs_fattr *fattr, struct nfs_fh *fhandle) +{ + int status = -ENOMEM; + struct page *page = NULL; + struct nfs4_fs_locations *locations = NULL; + struct dentry dentry = {}; + + page = alloc_page(GFP_KERNEL); + if (page == NULL) + goto out; + locations = kmalloc(sizeof(struct nfs4_fs_locations), GFP_KERNEL); + if (locations == NULL) + goto out; + + dentry.d_name.name = name->name; + dentry.d_name.len = name->len; + status = nfs4_proc_fs_locations(dir, &dentry, locations, page); + if (status != 0) + goto out; + /* Make sure server returned a different fsid for the referral */ + if (nfs_fsid_equal(&NFS_SERVER(dir)->fsid, &locations->fattr.fsid)) { + dprintk("%s: server did not return a different fsid for a referral at %s\n", __FUNCTION__, name->name); + status = -EIO; + goto out; + } + + memcpy(fattr, &locations->fattr, sizeof(struct nfs_fattr)); + fattr->valid |= NFS_ATTR_FATTR_V4_REFERRAL; + if (!fattr->mode) + fattr->mode = S_IFDIR; + memset(fhandle, 0, sizeof(struct nfs_fh)); +out: + if (page) + __free_page(page); + if (locations) + kfree(locations); + return status; +} + static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr) { struct nfs4_getattr_arg args = { @@ -1504,7 +1514,7 @@ nfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr, nfs_fattr_init(fattr); - cred = rpcauth_lookupcred(NFS_SERVER(inode)->client->cl_auth, 0); + cred = rpcauth_lookupcred(NFS_CLIENT(inode)->cl_auth, 0); if (IS_ERR(cred)) return PTR_ERR(cred); @@ -1522,6 +1532,52 @@ nfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr, return status; } +static int _nfs4_proc_lookupfh(struct nfs_server *server, struct nfs_fh *dirfh, + struct qstr *name, struct nfs_fh *fhandle, + struct nfs_fattr *fattr) +{ + int status; + struct nfs4_lookup_arg args = { + .bitmask = server->attr_bitmask, + .dir_fh = dirfh, + .name = name, + }; + struct nfs4_lookup_res res = { + .server = server, + .fattr = fattr, + .fh = fhandle, + }; + struct rpc_message msg = { + .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP], + .rpc_argp = &args, + .rpc_resp = &res, + }; + + nfs_fattr_init(fattr); + + dprintk("NFS call lookupfh %s\n", name->name); + status = rpc_call_sync(server->client, &msg, 0); + dprintk("NFS reply lookupfh: %d\n", status); + if (status == -NFS4ERR_MOVED) + status = -EREMOTE; + return status; +} + +static int nfs4_proc_lookupfh(struct nfs_server *server, struct nfs_fh *dirfh, + struct qstr *name, struct nfs_fh *fhandle, + struct nfs_fattr *fattr) +{ + struct nfs4_exception exception = { }; + int err; + do { + err = nfs4_handle_exception(server, + _nfs4_proc_lookupfh(server, dirfh, name, + fhandle, fattr), + &exception); + } while (exception.retry); + return err; +} + static int _nfs4_proc_lookup(struct inode *dir, struct qstr *name, struct nfs_fh *fhandle, struct nfs_fattr *fattr) { @@ -1547,6 +1603,8 @@ static int _nfs4_proc_lookup(struct inode *dir, struct qstr *name, dprintk("NFS call lookup %s\n", name->name); status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0); + if (status == -NFS4ERR_MOVED) + status = nfs4_get_referral(dir, name, fattr, fhandle); dprintk("NFS reply lookup: %d\n", status); return status; } @@ -1818,7 +1876,7 @@ nfs4_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr, struct rpc_cred *cred; int status = 0; - cred = rpcauth_lookupcred(NFS_SERVER(dir)->client->cl_auth, 0); + cred = rpcauth_lookupcred(NFS_CLIENT(dir)->cl_auth, 0); if (IS_ERR(cred)) { status = PTR_ERR(cred); goto out; @@ -2008,7 +2066,7 @@ static int _nfs4_proc_link(struct inode *inode, struct inode *dir, struct qstr * if (!status) { update_changeattr(dir, &res.cinfo); nfs_post_op_update_inode(dir, res.dir_attr); - nfs_refresh_inode(inode, res.fattr); + nfs_post_op_update_inode(inode, res.fattr); } return status; @@ -2458,7 +2516,7 @@ static void nfs4_proc_commit_setup(struct nfs_write_data *data, int how) */ static void nfs4_renew_done(struct rpc_task *task, void *data) { - struct nfs4_client *clp = (struct nfs4_client *)task->tk_msg.rpc_argp; + struct nfs_client *clp = (struct nfs_client *)task->tk_msg.rpc_argp; unsigned long timestamp = (unsigned long)data; if (task->tk_status < 0) { @@ -2480,7 +2538,7 @@ static const struct rpc_call_ops nfs4_renew_ops = { .rpc_call_done = nfs4_renew_done, }; -int nfs4_proc_async_renew(struct nfs4_client *clp, struct rpc_cred *cred) +int nfs4_proc_async_renew(struct nfs_client *clp, struct rpc_cred *cred) { struct rpc_message msg = { .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENEW], @@ -2492,7 +2550,7 @@ int nfs4_proc_async_renew(struct nfs4_client *clp, struct rpc_cred *cred) &nfs4_renew_ops, (void *)jiffies); } -int nfs4_proc_renew(struct nfs4_client *clp, struct rpc_cred *cred) +int nfs4_proc_renew(struct nfs_client *clp, struct rpc_cred *cred) { struct rpc_message msg = { .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENEW], @@ -2605,7 +2663,7 @@ out: nfs4_set_cached_acl(inode, acl); } -static inline ssize_t nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen) +static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen) { struct page *pages[NFS4ACL_MAXPAGES]; struct nfs_getaclargs args = { @@ -2658,6 +2716,19 @@ out_free: return ret; } +static ssize_t nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen) +{ + struct nfs4_exception exception = { }; + ssize_t ret; + do { + ret = __nfs4_get_acl_uncached(inode, buf, buflen); + if (ret >= 0) + break; + ret = nfs4_handle_exception(NFS_SERVER(inode), ret, &exception); + } while (exception.retry); + return ret; +} + static ssize_t nfs4_proc_get_acl(struct inode *inode, void *buf, size_t buflen) { struct nfs_server *server = NFS_SERVER(inode); @@ -2674,7 +2745,7 @@ static ssize_t nfs4_proc_get_acl(struct inode *inode, void *buf, size_t buflen) return nfs4_get_acl_uncached(inode, buf, buflen); } -static int nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t buflen) +static int __nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t buflen) { struct nfs_server *server = NFS_SERVER(inode); struct page *pages[NFS4ACL_MAXPAGES]; @@ -2694,16 +2765,28 @@ static int nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t buflen return -EOPNOTSUPP; nfs_inode_return_delegation(inode); buf_to_pages(buf, buflen, arg.acl_pages, &arg.acl_pgbase); - ret = rpc_call_sync(NFS_SERVER(inode)->client, &msg, 0); + ret = rpc_call_sync(NFS_CLIENT(inode), &msg, 0); if (ret == 0) nfs4_write_cached_acl(inode, buf, buflen); return ret; } +static int nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t buflen) +{ + struct nfs4_exception exception = { }; + int err; + do { + err = nfs4_handle_exception(NFS_SERVER(inode), + __nfs4_proc_set_acl(inode, buf, buflen), + &exception); + } while (exception.retry); + return err; +} + static int nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server) { - struct nfs4_client *clp = server->nfs4_state; + struct nfs_client *clp = server->nfs_client; if (!clp || task->tk_status >= 0) return 0; @@ -2740,7 +2823,7 @@ static int nfs4_wait_bit_interruptible(void *word) return 0; } -static int nfs4_wait_clnt_recover(struct rpc_clnt *clnt, struct nfs4_client *clp) +static int nfs4_wait_clnt_recover(struct rpc_clnt *clnt, struct nfs_client *clp) { sigset_t oldset; int res; @@ -2783,7 +2866,7 @@ static int nfs4_delay(struct rpc_clnt *clnt, long *timeout) */ int nfs4_handle_exception(const struct nfs_server *server, int errorcode, struct nfs4_exception *exception) { - struct nfs4_client *clp = server->nfs4_state; + struct nfs_client *clp = server->nfs_client; int ret = errorcode; exception->retry = 0; @@ -2810,7 +2893,7 @@ int nfs4_handle_exception(const struct nfs_server *server, int errorcode, struct return nfs4_map_errors(ret); } -int nfs4_proc_setclientid(struct nfs4_client *clp, u32 program, unsigned short port, struct rpc_cred *cred) +int nfs4_proc_setclientid(struct nfs_client *clp, u32 program, unsigned short port, struct rpc_cred *cred) { nfs4_verifier sc_verifier; struct nfs4_setclientid setclientid = { @@ -2834,7 +2917,7 @@ int nfs4_proc_setclientid(struct nfs4_client *clp, u32 program, unsigned short p for(;;) { setclientid.sc_name_len = scnprintf(setclientid.sc_name, sizeof(setclientid.sc_name), "%s/%u.%u.%u.%u %s %u", - clp->cl_ipaddr, NIPQUAD(clp->cl_addr.s_addr), + clp->cl_ipaddr, NIPQUAD(clp->cl_addr.sin_addr), cred->cr_ops->cr_name, clp->cl_id_uniquifier); setclientid.sc_netid_len = scnprintf(setclientid.sc_netid, @@ -2857,7 +2940,7 @@ int nfs4_proc_setclientid(struct nfs4_client *clp, u32 program, unsigned short p return status; } -static int _nfs4_proc_setclientid_confirm(struct nfs4_client *clp, struct rpc_cred *cred) +static int _nfs4_proc_setclientid_confirm(struct nfs_client *clp, struct rpc_cred *cred) { struct nfs_fsinfo fsinfo; struct rpc_message msg = { @@ -2881,7 +2964,7 @@ static int _nfs4_proc_setclientid_confirm(struct nfs4_client *clp, struct rpc_cr return status; } -int nfs4_proc_setclientid_confirm(struct nfs4_client *clp, struct rpc_cred *cred) +int nfs4_proc_setclientid_confirm(struct nfs_client *clp, struct rpc_cred *cred) { long timeout; int err; @@ -2989,7 +3072,7 @@ int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4 switch (err) { case -NFS4ERR_STALE_STATEID: case -NFS4ERR_EXPIRED: - nfs4_schedule_state_recovery(server->nfs4_state); + nfs4_schedule_state_recovery(server->nfs_client); case 0: return 0; } @@ -3018,7 +3101,7 @@ static int _nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock { struct inode *inode = state->inode; struct nfs_server *server = NFS_SERVER(inode); - struct nfs4_client *clp = server->nfs4_state; + struct nfs_client *clp = server->nfs_client; struct nfs_lockt_args arg = { .fh = NFS_FH(inode), .fl = request, @@ -3081,9 +3164,6 @@ static int do_vfs_lock(struct file *file, struct file_lock *fl) default: BUG(); } - if (res < 0) - printk(KERN_WARNING "%s: VFS is out of sync with lock manager!\n", - __FUNCTION__); return res; } @@ -3146,7 +3226,7 @@ static void nfs4_locku_done(struct rpc_task *task, void *data) break; case -NFS4ERR_STALE_STATEID: case -NFS4ERR_EXPIRED: - nfs4_schedule_state_recovery(calldata->server->nfs4_state); + nfs4_schedule_state_recovery(calldata->server->nfs_client); break; default: if (nfs4_async_handle_error(task, calldata->server) == -EAGAIN) { @@ -3195,8 +3275,6 @@ static struct rpc_task *nfs4_do_unlck(struct file_lock *fl, return ERR_PTR(-ENOMEM); } - /* Unlock _before_ we do the RPC call */ - do_vfs_lock(fl->fl_file, fl); return rpc_run_task(NFS_CLIENT(lsp->ls_state->inode), RPC_TASK_ASYNC, &nfs4_locku_ops, data); } @@ -3207,30 +3285,28 @@ static int nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock * struct rpc_task *task; int status = 0; - /* Is this a delegated lock? */ - if (test_bit(NFS_DELEGATED_STATE, &state->flags)) - goto out_unlock; - /* Is this open_owner holding any locks on the server? */ - if (test_bit(LK_STATE_IN_USE, &state->flags) == 0) - goto out_unlock; - status = nfs4_set_lock_state(state, request); + /* Unlock _before_ we do the RPC call */ + request->fl_flags |= FL_EXISTS; + if (do_vfs_lock(request->fl_file, request) == -ENOENT) + goto out; if (status != 0) - goto out_unlock; + goto out; + /* Is this a delegated lock? */ + if (test_bit(NFS_DELEGATED_STATE, &state->flags)) + goto out; lsp = request->fl_u.nfs4_fl.owner; - status = -ENOMEM; seqid = nfs_alloc_seqid(&lsp->ls_seqid); + status = -ENOMEM; if (seqid == NULL) - goto out_unlock; + goto out; task = nfs4_do_unlck(request, request->fl_file->private_data, lsp, seqid); status = PTR_ERR(task); if (IS_ERR(task)) - goto out_unlock; + goto out; status = nfs4_wait_for_completion_rpc_task(task); rpc_release_task(task); - return status; -out_unlock: - do_vfs_lock(request->fl_file, request); +out: return status; } @@ -3262,7 +3338,7 @@ static struct nfs4_lockdata *nfs4_alloc_lockdata(struct file_lock *fl, if (p->arg.lock_seqid == NULL) goto out_free; p->arg.lock_stateid = &lsp->ls_stateid; - p->arg.lock_owner.clientid = server->nfs4_state->cl_clientid; + p->arg.lock_owner.clientid = server->nfs_client->cl_clientid; p->arg.lock_owner.id = lsp->ls_id; p->lsp = lsp; atomic_inc(&lsp->ls_count); @@ -3398,10 +3474,10 @@ static int nfs4_lock_reclaim(struct nfs4_state *state, struct file_lock *request struct nfs4_exception exception = { }; int err; - /* Cache the lock if possible... */ - if (test_bit(NFS_DELEGATED_STATE, &state->flags)) - return 0; do { + /* Cache the lock if possible... */ + if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0) + return 0; err = _nfs4_do_setlk(state, F_SETLK, request, 1); if (err != -NFS4ERR_DELAY) break; @@ -3420,6 +3496,8 @@ static int nfs4_lock_expired(struct nfs4_state *state, struct file_lock *request if (err != 0) return err; do { + if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0) + return 0; err = _nfs4_do_setlk(state, F_SETLK, request, 0); if (err != -NFS4ERR_DELAY) break; @@ -3430,30 +3508,43 @@ static int nfs4_lock_expired(struct nfs4_state *state, struct file_lock *request static int _nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock *request) { - struct nfs4_client *clp = state->owner->so_client; + struct nfs_client *clp = state->owner->so_client; + unsigned char fl_flags = request->fl_flags; int status; /* Is this a delegated open? */ - 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)) - return status; - } - down_read(&clp->cl_sem); status = nfs4_set_lock_state(state, request); if (status != 0) goto out; + request->fl_flags |= FL_ACCESS; + status = do_vfs_lock(request->fl_file, request); + if (status < 0) + goto out; + down_read(&clp->cl_sem); + if (test_bit(NFS_DELEGATED_STATE, &state->flags)) { + struct nfs_inode *nfsi = NFS_I(state->inode); + /* Yes: cache locks! */ + down_read(&nfsi->rwsem); + /* ...but avoid races with delegation recall... */ + if (test_bit(NFS_DELEGATED_STATE, &state->flags)) { + request->fl_flags = fl_flags & ~FL_SLEEP; + status = do_vfs_lock(request->fl_file, request); + up_read(&nfsi->rwsem); + goto out_unlock; + } + up_read(&nfsi->rwsem); + } status = _nfs4_do_setlk(state, cmd, request, 0); if (status != 0) - goto out; + goto out_unlock; /* Note: we always want to sleep here! */ - request->fl_flags |= FL_SLEEP; + request->fl_flags = fl_flags | FL_SLEEP; if (do_vfs_lock(request->fl_file, request) < 0) printk(KERN_WARNING "%s: VFS is out of sync with lock manager!\n", __FUNCTION__); -out: +out_unlock: up_read(&clp->cl_sem); +out: + request->fl_flags = fl_flags; return status; } @@ -3570,6 +3661,36 @@ ssize_t nfs4_listxattr(struct dentry *dentry, char *buf, size_t buflen) return len; } +int nfs4_proc_fs_locations(struct inode *dir, struct dentry *dentry, + struct nfs4_fs_locations *fs_locations, struct page *page) +{ + struct nfs_server *server = NFS_SERVER(dir); + u32 bitmask[2] = { + [0] = FATTR4_WORD0_FSID | FATTR4_WORD0_FS_LOCATIONS, + [1] = FATTR4_WORD1_MOUNTED_ON_FILEID, + }; + struct nfs4_fs_locations_arg args = { + .dir_fh = NFS_FH(dir), + .name = &dentry->d_name, + .page = page, + .bitmask = bitmask, + }; + struct rpc_message msg = { + .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FS_LOCATIONS], + .rpc_argp = &args, + .rpc_resp = fs_locations, + }; + int status; + + dprintk("%s: start\n", __FUNCTION__); + fs_locations->fattr.valid = 0; + fs_locations->server = server; + fs_locations->nlocations = 0; + status = rpc_call_sync(server->client, &msg, 0); + dprintk("%s: returned status = %d\n", __FUNCTION__, status); + return status; +} + struct nfs4_state_recovery_ops nfs4_reboot_recovery_ops = { .recover_open = nfs4_open_reclaim, .recover_lock = nfs4_lock_reclaim, @@ -3589,7 +3710,7 @@ static struct inode_operations nfs4_file_inode_operations = { .listxattr = nfs4_listxattr, }; -struct nfs_rpc_ops nfs_v4_clientops = { +const struct nfs_rpc_ops nfs_v4_clientops = { .version = 4, /* protocol version */ .dentry_ops = &nfs4_dentry_operations, .dir_inode_ops = &nfs4_dir_inode_operations, @@ -3597,6 +3718,7 @@ struct nfs_rpc_ops nfs_v4_clientops = { .getroot = nfs4_proc_get_root, .getattr = nfs4_proc_getattr, .setattr = nfs4_proc_setattr, + .lookupfh = nfs4_proc_lookupfh, .lookup = nfs4_proc_lookup, .access = nfs4_proc_access, .readlink = nfs4_proc_readlink, @@ -3617,6 +3739,7 @@ struct nfs_rpc_ops nfs_v4_clientops = { .statfs = nfs4_proc_statfs, .fsinfo = nfs4_proc_fsinfo, .pathconf = nfs4_proc_pathconf, + .set_capabilities = nfs4_server_capabilities, .decode_dirent = nfs4_decode_dirent, .read_setup = nfs4_proc_read_setup, .read_done = nfs4_read_done, diff --git a/fs/nfs/nfs4renewd.c b/fs/nfs/nfs4renewd.c index 5d764d8e6..7b6df1852 100644 --- a/fs/nfs/nfs4renewd.c +++ b/fs/nfs/nfs4renewd.c @@ -61,7 +61,7 @@ void nfs4_renew_state(void *data) { - struct nfs4_client *clp = (struct nfs4_client *)data; + struct nfs_client *clp = (struct nfs_client *)data; struct rpc_cred *cred; long lease, timeout; unsigned long last, now; @@ -108,7 +108,7 @@ out: /* Must be called with clp->cl_sem locked for writes */ void -nfs4_schedule_state_renewal(struct nfs4_client *clp) +nfs4_schedule_state_renewal(struct nfs_client *clp) { long timeout; @@ -121,32 +121,20 @@ nfs4_schedule_state_renewal(struct nfs4_client *clp) __FUNCTION__, (timeout + HZ - 1) / HZ); cancel_delayed_work(&clp->cl_renewd); schedule_delayed_work(&clp->cl_renewd, timeout); + set_bit(NFS_CS_RENEWD, &clp->cl_res_state); spin_unlock(&clp->cl_lock); } void nfs4_renewd_prepare_shutdown(struct nfs_server *server) { - struct nfs4_client *clp = server->nfs4_state; - - if (!clp) - return; flush_scheduled_work(); - down_write(&clp->cl_sem); - if (!list_empty(&server->nfs4_siblings)) - list_del_init(&server->nfs4_siblings); - up_write(&clp->cl_sem); } -/* Must be called with clp->cl_sem locked for writes */ void -nfs4_kill_renewd(struct nfs4_client *clp) +nfs4_kill_renewd(struct nfs_client *clp) { down_read(&clp->cl_sem); - if (!list_empty(&clp->cl_superblocks)) { - up_read(&clp->cl_sem); - return; - } cancel_delayed_work(&clp->cl_renewd); up_read(&clp->cl_sem); flush_scheduled_work(); diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index 96e5b82c1..5fffbdfa9 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c @@ -38,7 +38,6 @@ * subsequent patch. */ -#include #include #include #include @@ -51,149 +50,15 @@ #include "nfs4_fs.h" #include "callback.h" #include "delegation.h" +#include "internal.h" #define OPENOWNER_POOL_SIZE 8 const nfs4_stateid zero_stateid; -static DEFINE_SPINLOCK(state_spinlock); static LIST_HEAD(nfs4_clientid_list); -void -init_nfsv4_state(struct nfs_server *server) -{ - server->nfs4_state = NULL; - INIT_LIST_HEAD(&server->nfs4_siblings); -} - -void -destroy_nfsv4_state(struct nfs_server *server) -{ - kfree(server->mnt_path); - server->mnt_path = NULL; - if (server->nfs4_state) { - nfs4_put_client(server->nfs4_state); - server->nfs4_state = NULL; - } -} - -/* - * nfs4_get_client(): returns an empty client structure - * nfs4_put_client(): drops reference to client structure - * - * Since these are allocated/deallocated very rarely, we don't - * bother putting them in a slab cache... - */ -static struct nfs4_client * -nfs4_alloc_client(struct in_addr *addr) -{ - struct nfs4_client *clp; - - if (nfs_callback_up() < 0) - return NULL; - if ((clp = kzalloc(sizeof(*clp), GFP_KERNEL)) == NULL) { - nfs_callback_down(); - return NULL; - } - memcpy(&clp->cl_addr, addr, sizeof(clp->cl_addr)); - init_rwsem(&clp->cl_sem); - INIT_LIST_HEAD(&clp->cl_delegations); - INIT_LIST_HEAD(&clp->cl_state_owners); - INIT_LIST_HEAD(&clp->cl_unused); - spin_lock_init(&clp->cl_lock); - atomic_set(&clp->cl_count, 1); - INIT_WORK(&clp->cl_renewd, nfs4_renew_state, clp); - INIT_LIST_HEAD(&clp->cl_superblocks); - rpc_init_wait_queue(&clp->cl_rpcwaitq, "NFS4 client"); - clp->cl_rpcclient = ERR_PTR(-EINVAL); - clp->cl_boot_time = CURRENT_TIME; - clp->cl_state = 1 << NFS4CLNT_LEASE_EXPIRED; - return clp; -} - -static void -nfs4_free_client(struct nfs4_client *clp) -{ - struct nfs4_state_owner *sp; - - while (!list_empty(&clp->cl_unused)) { - sp = list_entry(clp->cl_unused.next, - struct nfs4_state_owner, - so_list); - list_del(&sp->so_list); - kfree(sp); - } - BUG_ON(!list_empty(&clp->cl_state_owners)); - nfs_idmap_delete(clp); - if (!IS_ERR(clp->cl_rpcclient)) - rpc_shutdown_client(clp->cl_rpcclient); - kfree(clp); - nfs_callback_down(); -} - -static struct nfs4_client *__nfs4_find_client(struct in_addr *addr) -{ - struct nfs4_client *clp; - list_for_each_entry(clp, &nfs4_clientid_list, cl_servers) { - if (memcmp(&clp->cl_addr, addr, sizeof(clp->cl_addr)) == 0) { - atomic_inc(&clp->cl_count); - return clp; - } - } - return NULL; -} - -struct nfs4_client *nfs4_find_client(struct in_addr *addr) -{ - struct nfs4_client *clp; - spin_lock(&state_spinlock); - clp = __nfs4_find_client(addr); - spin_unlock(&state_spinlock); - return clp; -} - -struct nfs4_client * -nfs4_get_client(struct in_addr *addr) -{ - struct nfs4_client *clp, *new = NULL; - - spin_lock(&state_spinlock); - for (;;) { - clp = __nfs4_find_client(addr); - if (clp != NULL) - break; - clp = new; - if (clp != NULL) { - list_add(&clp->cl_servers, &nfs4_clientid_list); - new = NULL; - break; - } - spin_unlock(&state_spinlock); - new = nfs4_alloc_client(addr); - spin_lock(&state_spinlock); - if (new == NULL) - break; - } - spin_unlock(&state_spinlock); - if (new) - nfs4_free_client(new); - return clp; -} - -void -nfs4_put_client(struct nfs4_client *clp) -{ - if (!atomic_dec_and_lock(&clp->cl_count, &state_spinlock)) - return; - list_del(&clp->cl_servers); - spin_unlock(&state_spinlock); - BUG_ON(!list_empty(&clp->cl_superblocks)); - rpc_wake_up(&clp->cl_rpcwaitq); - nfs4_kill_renewd(clp); - nfs4_free_client(clp); -} - -static int nfs4_init_client(struct nfs4_client *clp, struct rpc_cred *cred) +static int nfs4_init_client(struct nfs_client *clp, struct rpc_cred *cred) { int status = nfs4_proc_setclientid(clp, NFS4_CALLBACK, nfs_callback_tcpport, cred); @@ -205,13 +70,13 @@ static int nfs4_init_client(struct nfs4_client *clp, struct rpc_cred *cred) } u32 -nfs4_alloc_lockowner_id(struct nfs4_client *clp) +nfs4_alloc_lockowner_id(struct nfs_client *clp) { return clp->cl_lockowner_id ++; } static struct nfs4_state_owner * -nfs4_client_grab_unused(struct nfs4_client *clp, struct rpc_cred *cred) +nfs4_client_grab_unused(struct nfs_client *clp, struct rpc_cred *cred) { struct nfs4_state_owner *sp = NULL; @@ -225,7 +90,7 @@ nfs4_client_grab_unused(struct nfs4_client *clp, struct rpc_cred *cred) return sp; } -struct rpc_cred *nfs4_get_renew_cred(struct nfs4_client *clp) +struct rpc_cred *nfs4_get_renew_cred(struct nfs_client *clp) { struct nfs4_state_owner *sp; struct rpc_cred *cred = NULL; @@ -239,7 +104,7 @@ struct rpc_cred *nfs4_get_renew_cred(struct nfs4_client *clp) return cred; } -struct rpc_cred *nfs4_get_setclientid_cred(struct nfs4_client *clp) +struct rpc_cred *nfs4_get_setclientid_cred(struct nfs_client *clp) { struct nfs4_state_owner *sp; @@ -252,7 +117,7 @@ struct rpc_cred *nfs4_get_setclientid_cred(struct nfs4_client *clp) } static struct nfs4_state_owner * -nfs4_find_state_owner(struct nfs4_client *clp, struct rpc_cred *cred) +nfs4_find_state_owner(struct nfs_client *clp, struct rpc_cred *cred) { struct nfs4_state_owner *sp, *res = NULL; @@ -295,7 +160,7 @@ nfs4_alloc_state_owner(void) void nfs4_drop_state_owner(struct nfs4_state_owner *sp) { - struct nfs4_client *clp = sp->so_client; + struct nfs_client *clp = sp->so_client; spin_lock(&clp->cl_lock); list_del_init(&sp->so_list); spin_unlock(&clp->cl_lock); @@ -307,7 +172,7 @@ nfs4_drop_state_owner(struct nfs4_state_owner *sp) */ struct nfs4_state_owner *nfs4_get_state_owner(struct nfs_server *server, struct rpc_cred *cred) { - struct nfs4_client *clp = server->nfs4_state; + struct nfs_client *clp = server->nfs_client; struct nfs4_state_owner *sp, *new; get_rpccred(cred); @@ -338,7 +203,7 @@ struct nfs4_state_owner *nfs4_get_state_owner(struct nfs_server *server, struct */ void nfs4_put_state_owner(struct nfs4_state_owner *sp) { - struct nfs4_client *clp = sp->so_client; + struct nfs_client *clp = sp->so_client; struct rpc_cred *cred = sp->so_cred; if (!atomic_dec_and_lock(&sp->so_count, &clp->cl_lock)) @@ -541,7 +406,7 @@ __nfs4_find_lock_state(struct nfs4_state *state, fl_owner_t fl_owner) static struct nfs4_lock_state *nfs4_alloc_lock_state(struct nfs4_state *state, fl_owner_t fl_owner) { struct nfs4_lock_state *lsp; - struct nfs4_client *clp = state->owner->so_client; + struct nfs_client *clp = state->owner->so_client; lsp = kzalloc(sizeof(*lsp), GFP_KERNEL); if (lsp == NULL) @@ -753,7 +618,7 @@ out: static int reclaimer(void *); -static inline void nfs4_clear_recover_bit(struct nfs4_client *clp) +static inline void nfs4_clear_recover_bit(struct nfs_client *clp) { smp_mb__before_clear_bit(); clear_bit(NFS4CLNT_STATE_RECOVER, &clp->cl_state); @@ -765,25 +630,25 @@ static inline void nfs4_clear_recover_bit(struct nfs4_client *clp) /* * State recovery routine */ -static void nfs4_recover_state(struct nfs4_client *clp) +static void nfs4_recover_state(struct nfs_client *clp) { struct task_struct *task; __module_get(THIS_MODULE); atomic_inc(&clp->cl_count); task = kthread_run(reclaimer, clp, "%u.%u.%u.%u-reclaim", - NIPQUAD(clp->cl_addr)); + NIPQUAD(clp->cl_addr.sin_addr)); if (!IS_ERR(task)) return; nfs4_clear_recover_bit(clp); - nfs4_put_client(clp); + nfs_put_client(clp); module_put(THIS_MODULE); } /* * Schedule a state recovery attempt */ -void nfs4_schedule_state_recovery(struct nfs4_client *clp) +void nfs4_schedule_state_recovery(struct nfs_client *clp) { if (!clp) return; @@ -880,7 +745,7 @@ out_err: return status; } -static void nfs4_state_mark_reclaim(struct nfs4_client *clp) +static void nfs4_state_mark_reclaim(struct nfs_client *clp) { struct nfs4_state_owner *sp; struct nfs4_state *state; @@ -904,7 +769,7 @@ static void nfs4_state_mark_reclaim(struct nfs4_client *clp) static int reclaimer(void *ptr) { - struct nfs4_client *clp = ptr; + struct nfs_client *clp = ptr; struct nfs4_state_owner *sp; struct nfs4_state_recovery_ops *ops; struct rpc_cred *cred; @@ -971,12 +836,12 @@ out: if (status == -NFS4ERR_CB_PATH_DOWN) nfs_handle_cb_pathdown(clp); nfs4_clear_recover_bit(clp); - nfs4_put_client(clp); + nfs_put_client(clp); module_put_and_exit(0); return 0; out_error: printk(KERN_WARNING "Error: state recovery failed on NFSv4 server %u.%u.%u.%u with error %d\n", - NIPQUAD(clp->cl_addr.s_addr), -status); + NIPQUAD(clp->cl_addr.sin_addr), -status); set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state); goto out; } diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index 7c5d70efe..99926067e 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c @@ -58,7 +58,7 @@ /* Mapping from NFS error code to "errno" error code. */ #define errno_NFSERR_IO EIO -static int nfs_stat_to_errno(int); +static int nfs4_stat_to_errno(int); /* NFSv4 COMPOUND tags are only wanted for debugging purposes */ #ifdef DEBUG @@ -411,6 +411,15 @@ static int nfs_stat_to_errno(int); #define NFS4_dec_setacl_sz (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ op_decode_hdr_maxsz + nfs4_fattr_bitmap_maxsz) +#define NFS4_enc_fs_locations_sz \ + (compound_encode_hdr_maxsz + \ + encode_putfh_maxsz + \ + encode_getattr_maxsz) +#define NFS4_dec_fs_locations_sz \ + (compound_decode_hdr_maxsz + \ + decode_putfh_maxsz + \ + op_decode_hdr_maxsz + \ + nfs4_fattr_bitmap_maxsz) static struct { unsigned int mode; @@ -520,7 +529,7 @@ static int encode_attrs(struct xdr_stream *xdr, const struct iattr *iap, const s if (iap->ia_valid & ATTR_MODE) len += 4; if (iap->ia_valid & ATTR_UID) { - owner_namelen = nfs_map_uid_to_name(server->nfs4_state, iap->ia_uid, owner_name); + owner_namelen = nfs_map_uid_to_name(server->nfs_client, iap->ia_uid, owner_name); if (owner_namelen < 0) { printk(KERN_WARNING "nfs: couldn't resolve uid %d to string\n", iap->ia_uid); @@ -532,7 +541,7 @@ static int encode_attrs(struct xdr_stream *xdr, const struct iattr *iap, const s len += 4 + (XDR_QUADLEN(owner_namelen) << 2); } if (iap->ia_valid & ATTR_GID) { - owner_grouplen = nfs_map_gid_to_group(server->nfs4_state, iap->ia_gid, owner_group); + owner_grouplen = nfs_map_gid_to_group(server->nfs_client, iap->ia_gid, owner_group); if (owner_grouplen < 0) { printk(KERN_WARNING "nfs4: couldn't resolve gid %d to string\n", iap->ia_gid); @@ -722,6 +731,13 @@ static int encode_fsinfo(struct xdr_stream *xdr, const u32* bitmask) bitmask[1] & nfs4_fsinfo_bitmap[1]); } +static int encode_fs_locations(struct xdr_stream *xdr, const u32* bitmask) +{ + return encode_getattr_two(xdr, + bitmask[0] & nfs4_fs_locations_bitmap[0], + bitmask[1] & nfs4_fs_locations_bitmap[1]); +} + static int encode_getfh(struct xdr_stream *xdr) { uint32_t *p; @@ -1144,7 +1160,7 @@ static int encode_rename(struct xdr_stream *xdr, const struct qstr *oldname, con return 0; } -static int encode_renew(struct xdr_stream *xdr, const struct nfs4_client *client_stateid) +static int encode_renew(struct xdr_stream *xdr, const struct nfs_client *client_stateid) { uint32_t *p; @@ -1230,7 +1246,7 @@ static int encode_setclientid(struct xdr_stream *xdr, const struct nfs4_setclien return 0; } -static int encode_setclientid_confirm(struct xdr_stream *xdr, const struct nfs4_client *client_state) +static int encode_setclientid_confirm(struct xdr_stream *xdr, const struct nfs_client *client_state) { uint32_t *p; @@ -1929,7 +1945,7 @@ static int nfs4_xdr_enc_server_caps(struct rpc_rqst *req, uint32_t *p, const str /* * a RENEW request */ -static int nfs4_xdr_enc_renew(struct rpc_rqst *req, uint32_t *p, struct nfs4_client *clp) +static int nfs4_xdr_enc_renew(struct rpc_rqst *req, uint32_t *p, struct nfs_client *clp) { struct xdr_stream xdr; struct compound_hdr hdr = { @@ -1959,7 +1975,7 @@ static int nfs4_xdr_enc_setclientid(struct rpc_rqst *req, uint32_t *p, struct nf /* * a SETCLIENTID_CONFIRM request */ -static int nfs4_xdr_enc_setclientid_confirm(struct rpc_rqst *req, uint32_t *p, struct nfs4_client *clp) +static int nfs4_xdr_enc_setclientid_confirm(struct rpc_rqst *req, uint32_t *p, struct nfs_client *clp) { struct xdr_stream xdr; struct compound_hdr hdr = { @@ -2002,6 +2018,38 @@ out: return status; } +/* + * Encode FS_LOCATIONS request + */ +static int nfs4_xdr_enc_fs_locations(struct rpc_rqst *req, uint32_t *p, struct nfs4_fs_locations_arg *args) +{ + struct xdr_stream xdr; + struct compound_hdr hdr = { + .nops = 3, + }; + struct rpc_auth *auth = req->rq_task->tk_auth; + int replen; + int status; + + xdr_init_encode(&xdr, &req->rq_snd_buf, p); + encode_compound_hdr(&xdr, &hdr); + if ((status = encode_putfh(&xdr, args->dir_fh)) != 0) + goto out; + if ((status = encode_lookup(&xdr, args->name)) != 0) + goto out; + if ((status = encode_fs_locations(&xdr, args->bitmask)) != 0) + goto out; + /* set up reply + * toplevel_status + OP_PUTFH + status + * + OP_LOOKUP + status + OP_GETATTR + status = 7 + */ + replen = (RPC_REPHDRSIZE + auth->au_rslack + 7) << 2; + xdr_inline_pages(&req->rq_rcv_buf, replen, &args->page, + 0, PAGE_SIZE); +out: + return status; +} + /* * START OF "GENERIC" DECODE ROUTINES. * These may look a little ugly since they are imported from a "generic" @@ -2036,7 +2084,7 @@ out: } \ } while (0) -static int decode_opaque_inline(struct xdr_stream *xdr, uint32_t *len, char **string) +static int decode_opaque_inline(struct xdr_stream *xdr, unsigned int *len, char **string) { uint32_t *p; @@ -2079,15 +2127,15 @@ static int decode_op_hdr(struct xdr_stream *xdr, enum nfs_opnum4 expected) } READ32(nfserr); if (nfserr != NFS_OK) - return -nfs_stat_to_errno(nfserr); + return -nfs4_stat_to_errno(nfserr); return 0; } /* Dummy routine */ -static int decode_ace(struct xdr_stream *xdr, void *ace, struct nfs4_client *clp) +static int decode_ace(struct xdr_stream *xdr, void *ace, struct nfs_client *clp) { uint32_t *p; - uint32_t strlen; + unsigned int strlen; char *str; READ_BUF(12); @@ -2217,7 +2265,7 @@ static int decode_attr_symlink_support(struct xdr_stream *xdr, uint32_t *bitmap, return 0; } -static int decode_attr_fsid(struct xdr_stream *xdr, uint32_t *bitmap, struct nfs4_fsid *fsid) +static int decode_attr_fsid(struct xdr_stream *xdr, uint32_t *bitmap, struct nfs_fsid *fsid) { uint32_t *p; @@ -2285,6 +2333,22 @@ static int decode_attr_fileid(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t return 0; } +static int decode_attr_mounted_on_fileid(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *fileid) +{ + uint32_t *p; + + *fileid = 0; + if (unlikely(bitmap[1] & (FATTR4_WORD1_MOUNTED_ON_FILEID - 1U))) + return -EIO; + if (likely(bitmap[1] & FATTR4_WORD1_MOUNTED_ON_FILEID)) { + READ_BUF(8); + READ64(*fileid); + bitmap[1] &= ~FATTR4_WORD1_MOUNTED_ON_FILEID; + } + dprintk("%s: fileid=%Lu\n", __FUNCTION__, (unsigned long long)*fileid); + return 0; +} + static int decode_attr_files_avail(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res) { uint32_t *p; @@ -2336,6 +2400,116 @@ static int decode_attr_files_total(struct xdr_stream *xdr, uint32_t *bitmap, uin return status; } +static int decode_pathname(struct xdr_stream *xdr, struct nfs4_pathname *path) +{ + int n; + uint32_t *p; + int status = 0; + + READ_BUF(4); + READ32(n); + if (n < 0) + goto out_eio; + if (n == 0) + goto root_path; + dprintk("path "); + path->ncomponents = 0; + while (path->ncomponents < n) { + struct nfs4_string *component = &path->components[path->ncomponents]; + status = decode_opaque_inline(xdr, &component->len, &component->data); + if (unlikely(status != 0)) + goto out_eio; + if (path->ncomponents != n) + dprintk("/"); + dprintk("%s", component->data); + if (path->ncomponents < NFS4_PATHNAME_MAXCOMPONENTS) + path->ncomponents++; + else { + dprintk("cannot parse %d components in path\n", n); + goto out_eio; + } + } +out: + dprintk("\n"); + return status; +root_path: +/* a root pathname is sent as a zero component4 */ + path->ncomponents = 1; + path->components[0].len=0; + path->components[0].data=NULL; + dprintk("path /\n"); + goto out; +out_eio: + dprintk(" status %d", status); + status = -EIO; + goto out; +} + +static int decode_attr_fs_locations(struct xdr_stream *xdr, uint32_t *bitmap, struct nfs4_fs_locations *res) +{ + int n; + uint32_t *p; + int status = -EIO; + + if (unlikely(bitmap[0] & (FATTR4_WORD0_FS_LOCATIONS -1U))) + goto out; + status = 0; + if (unlikely(!(bitmap[0] & FATTR4_WORD0_FS_LOCATIONS))) + goto out; + dprintk("%s: fsroot ", __FUNCTION__); + status = decode_pathname(xdr, &res->fs_path); + if (unlikely(status != 0)) + goto out; + READ_BUF(4); + READ32(n); + if (n <= 0) + goto out_eio; + res->nlocations = 0; + while (res->nlocations < n) { + int m; + struct nfs4_fs_location *loc = &res->locations[res->nlocations]; + + READ_BUF(4); + READ32(m); + if (m <= 0) + goto out_eio; + + loc->nservers = 0; + dprintk("%s: servers ", __FUNCTION__); + while (loc->nservers < m) { + struct nfs4_string *server = &loc->servers[loc->nservers]; + status = decode_opaque_inline(xdr, &server->len, &server->data); + if (unlikely(status != 0)) + goto out_eio; + dprintk("%s ", server->data); + if (loc->nservers < NFS4_FS_LOCATION_MAXSERVERS) + loc->nservers++; + else { + int i; + dprintk("%s: using first %d of %d servers returned for location %d\n", __FUNCTION__, NFS4_FS_LOCATION_MAXSERVERS, m, res->nlocations); + for (i = loc->nservers; i < m; i++) { + int len; + char *data; + status = decode_opaque_inline(xdr, &len, &data); + if (unlikely(status != 0)) + goto out_eio; + } + } + } + status = decode_pathname(xdr, &loc->rootpath); + if (unlikely(status != 0)) + goto out_eio; + if (res->nlocations < NFS4_FS_LOCATIONS_MAXENTRIES) + res->nlocations++; + } +out: + dprintk("%s: fs_locations done, error = %d\n", __FUNCTION__, status); + return status; +out_eio: + status = -EIO; + goto out; +} + static int decode_attr_maxfilesize(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res) { uint32_t *p; @@ -2462,7 +2636,7 @@ static int decode_attr_nlink(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t return 0; } -static int decode_attr_owner(struct xdr_stream *xdr, uint32_t *bitmap, struct nfs4_client *clp, int32_t *uid) +static int decode_attr_owner(struct xdr_stream *xdr, uint32_t *bitmap, struct nfs_client *clp, int32_t *uid) { uint32_t len, *p; @@ -2486,7 +2660,7 @@ static int decode_attr_owner(struct xdr_stream *xdr, uint32_t *bitmap, struct nf return 0; } -static int decode_attr_group(struct xdr_stream *xdr, uint32_t *bitmap, struct nfs4_client *clp, int32_t *gid) +static int decode_attr_group(struct xdr_stream *xdr, uint32_t *bitmap, struct nfs_client *clp, int32_t *gid) { uint32_t len, *p; @@ -2841,6 +3015,7 @@ static int decode_getfattr(struct xdr_stream *xdr, struct nfs_fattr *fattr, cons bitmap[2] = {0}, type; int status, fmode = 0; + uint64_t fileid; if ((status = decode_op_hdr(xdr, OP_GETATTR)) != 0) goto xdr_error; @@ -2863,18 +3038,22 @@ static int decode_getfattr(struct xdr_stream *xdr, struct nfs_fattr *fattr, cons goto xdr_error; if ((status = decode_attr_size(xdr, bitmap, &fattr->size)) != 0) goto xdr_error; - if ((status = decode_attr_fsid(xdr, bitmap, &fattr->fsid_u.nfs4)) != 0) + if ((status = decode_attr_fsid(xdr, bitmap, &fattr->fsid)) != 0) goto xdr_error; if ((status = decode_attr_fileid(xdr, bitmap, &fattr->fileid)) != 0) goto xdr_error; + if ((status = decode_attr_fs_locations(xdr, bitmap, container_of(fattr, + struct nfs4_fs_locations, + fattr))) != 0) + goto xdr_error; if ((status = decode_attr_mode(xdr, bitmap, &fattr->mode)) != 0) goto xdr_error; fattr->mode |= fmode; if ((status = decode_attr_nlink(xdr, bitmap, &fattr->nlink)) != 0) goto xdr_error; - if ((status = decode_attr_owner(xdr, bitmap, server->nfs4_state, &fattr->uid)) != 0) + if ((status = decode_attr_owner(xdr, bitmap, server->nfs_client, &fattr->uid)) != 0) goto xdr_error; - if ((status = decode_attr_group(xdr, bitmap, server->nfs4_state, &fattr->gid)) != 0) + if ((status = decode_attr_group(xdr, bitmap, server->nfs_client, &fattr->gid)) != 0) goto xdr_error; if ((status = decode_attr_rdev(xdr, bitmap, &fattr->rdev)) != 0) goto xdr_error; @@ -2886,6 +3065,10 @@ static int decode_getfattr(struct xdr_stream *xdr, struct nfs_fattr *fattr, cons goto xdr_error; if ((status = decode_attr_time_modify(xdr, bitmap, &fattr->mtime)) != 0) goto xdr_error; + if ((status = decode_attr_mounted_on_fileid(xdr, bitmap, &fileid)) != 0) + goto xdr_error; + if (fattr->fileid == 0 && fileid != 0) + fattr->fileid = fileid; if ((status = verify_attr_len(xdr, savep, attrlen)) == 0) fattr->valid = NFS_ATTR_FATTR | NFS_ATTR_FATTR_V3 | NFS_ATTR_FATTR_V4; xdr_error: @@ -3071,7 +3254,7 @@ static int decode_delegation(struct xdr_stream *xdr, struct nfs_openres *res) if (decode_space_limit(xdr, &res->maxsize) < 0) return -EIO; } - return decode_ace(xdr, NULL, res->server->nfs4_state); + return decode_ace(xdr, NULL, res->server->nfs_client); } static int decode_open(struct xdr_stream *xdr, struct nfs_openres *res) @@ -3172,7 +3355,7 @@ static int decode_readdir(struct xdr_stream *xdr, struct rpc_rqst *req, struct n struct kvec *iov = rcvbuf->head; unsigned int nr, pglen = rcvbuf->page_len; uint32_t *end, *entry, *p, *kaddr; - uint32_t len, attrlen; + uint32_t len, attrlen, xlen; int hdrlen, recvd, status; status = decode_op_hdr(xdr, OP_READDIR); @@ -3194,10 +3377,10 @@ static int decode_readdir(struct xdr_stream *xdr, struct rpc_rqst *req, struct n BUG_ON(pglen + readdir->pgbase > PAGE_CACHE_SIZE); kaddr = p = (uint32_t *) kmap_atomic(page, KM_USER0); - end = (uint32_t *) ((char *)p + pglen + readdir->pgbase); + end = p + ((pglen + readdir->pgbase) >> 2); entry = p; for (nr = 0; *p++; nr++) { - if (p + 3 > end) + if (end - p < 3) goto short_pkt; dprintk("cookie = %Lu, ", *((unsigned long long *)p)); p += 2; /* cookie */ @@ -3206,18 +3389,19 @@ static int decode_readdir(struct xdr_stream *xdr, struct rpc_rqst *req, struct n printk(KERN_WARNING "NFS: giant filename in readdir (len 0x%x)\n", len); goto err_unmap; } - dprintk("filename = %*s\n", len, (char *)p); - p += XDR_QUADLEN(len); - if (p + 1 > end) + xlen = XDR_QUADLEN(len); + if (end - p < xlen + 1) goto short_pkt; + dprintk("filename = %*s\n", len, (char *)p); + p += xlen; len = ntohl(*p++); /* bitmap length */ - p += len; - if (p + 1 > end) + if (end - p < len + 1) goto short_pkt; + p += len; attrlen = XDR_QUADLEN(ntohl(*p++)); - p += attrlen; /* attributes */ - if (p + 2 > end) + if (end - p < attrlen + 2) goto short_pkt; + p += attrlen; /* attributes */ entry = p; } if (!nr && (entry[0] != 0 || entry[1] == 0)) @@ -3350,8 +3534,7 @@ static int decode_getacl(struct xdr_stream *xdr, struct rpc_rqst *req, attrlen, recvd); return -EINVAL; } - if (attrlen <= *acl_len) - xdr_read_pages(xdr, attrlen); + xdr_read_pages(xdr, attrlen); *acl_len = attrlen; } else status = -EOPNOTSUPP; @@ -3382,7 +3565,7 @@ static int decode_setattr(struct xdr_stream *xdr, struct nfs_setattrres *res) return 0; } -static int decode_setclientid(struct xdr_stream *xdr, struct nfs4_client *clp) +static int decode_setclientid(struct xdr_stream *xdr, struct nfs_client *clp) { uint32_t *p; uint32_t opnum; @@ -3415,7 +3598,7 @@ static int decode_setclientid(struct xdr_stream *xdr, struct nfs4_client *clp) READ_BUF(len); return -NFSERR_CLID_INUSE; } else - return -nfs_stat_to_errno(nfserr); + return -nfs4_stat_to_errno(nfserr); return 0; } @@ -4073,7 +4256,7 @@ static int nfs4_xdr_dec_fsinfo(struct rpc_rqst *req, uint32_t *p, struct nfs_fsi if (!status) status = decode_fsinfo(&xdr, fsinfo); if (!status) - status = -nfs_stat_to_errno(hdr.status); + status = -nfs4_stat_to_errno(hdr.status); return status; } @@ -4152,7 +4335,7 @@ static int nfs4_xdr_dec_renew(struct rpc_rqst *rqstp, uint32_t *p, void *dummy) * a SETCLIENTID request */ static int nfs4_xdr_dec_setclientid(struct rpc_rqst *req, uint32_t *p, - struct nfs4_client *clp) + struct nfs_client *clp) { struct xdr_stream xdr; struct compound_hdr hdr; @@ -4163,7 +4346,7 @@ static int nfs4_xdr_dec_setclientid(struct rpc_rqst *req, uint32_t *p, if (!status) status = decode_setclientid(&xdr, clp); if (!status) - status = -nfs_stat_to_errno(hdr.status); + status = -nfs4_stat_to_errno(hdr.status); return status; } @@ -4185,7 +4368,7 @@ static int nfs4_xdr_dec_setclientid_confirm(struct rpc_rqst *req, uint32_t *p, s if (!status) status = decode_fsinfo(&xdr, fsinfo); if (!status) - status = -nfs_stat_to_errno(hdr.status); + status = -nfs4_stat_to_errno(hdr.status); return status; } @@ -4211,6 +4394,29 @@ out: return status; } +/* + * FS_LOCATIONS request + */ +static int nfs4_xdr_dec_fs_locations(struct rpc_rqst *req, uint32_t *p, struct nfs4_fs_locations *res) +{ + struct xdr_stream xdr; + struct compound_hdr hdr; + int status; + + xdr_init_decode(&xdr, &req->rq_rcv_buf, p); + status = decode_compound_hdr(&xdr, &hdr); + if (status != 0) + goto out; + if ((status = decode_putfh(&xdr)) != 0) + goto out; + if ((status = decode_lookup(&xdr)) != 0) + goto out; + xdr_enter_page(&xdr, PAGE_SIZE); + status = decode_getfattr(&xdr, &res->fattr, res->server); +out: + return status; +} + uint32_t *nfs4_decode_dirent(uint32_t *p, struct nfs_entry *entry, int plus) { uint32_t bitmap[2] = {0}; @@ -4315,7 +4521,7 @@ static struct { * This one is used jointly by NFSv2 and NFSv3. */ static int -nfs_stat_to_errno(int stat) +nfs4_stat_to_errno(int stat) { int i; for (i = 0; nfs_errtbl[i].stat != -1; i++) { @@ -4382,6 +4588,7 @@ struct rpc_procinfo nfs4_procedures[] = { PROC(DELEGRETURN, enc_delegreturn, dec_delegreturn), PROC(GETACL, enc_getacl, dec_getacl), PROC(SETACL, enc_setacl, dec_setacl), + PROC(FS_LOCATIONS, enc_fs_locations, dec_fs_locations), }; struct rpc_version nfs_version4 = { diff --git a/fs/nfs/nfsroot.c b/fs/nfs/nfsroot.c index a12c6a845..2d18b43ac 100644 --- a/fs/nfs/nfsroot.c +++ b/fs/nfs/nfsroot.c @@ -69,7 +69,6 @@ * Fabian Frederick: Option parser rebuilt (using parser lib) */ -#include #include #include #include diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c index 106aca388..c45f724f1 100644 --- a/fs/nfs/pagelist.c +++ b/fs/nfs/pagelist.c @@ -9,7 +9,6 @@ * */ -#include #include #include #include @@ -18,6 +17,7 @@ #include #include #include +#include "internal.h" #define NFS_PARANOIA 1 @@ -85,7 +85,7 @@ nfs_create_request(struct nfs_open_context *ctx, struct inode *inode, atomic_set(&req->wb_complete, 0); req->wb_index = page->index; page_cache_get(page); - BUG_ON(PagePrivate(page)); + BUG_ON(PageNfsWriting(page)); BUG_ON(!PageLocked(page)); BUG_ON(page->mapping->host != inode); req->wb_offset = offset; @@ -315,6 +315,7 @@ nfs_scan_lock_dirty(struct nfs_inode *nfsi, struct list_head *dst, req->wb_index, NFS_PAGE_TAG_DIRTY); nfs_list_remove_request(req); nfs_list_add_request(req, dst); + dec_zone_page_state(req->wb_page, NR_FILE_DIRTY); res++; } } @@ -325,6 +326,7 @@ out: /** * nfs_scan_list - Scan a list for matching requests + * @nfsi: NFS inode * @head: One of the NFS inode request lists * @dst: Destination list * @idx_start: lower bound of page->index to scan @@ -336,14 +338,15 @@ out: * The requests are *not* checked to ensure that they form a contiguous set. * You must be holding the inode's req_lock when calling this function */ -int -nfs_scan_list(struct list_head *head, struct list_head *dst, - unsigned long idx_start, unsigned int npages) +int nfs_scan_list(struct nfs_inode *nfsi, struct list_head *head, + struct list_head *dst, unsigned long idx_start, + unsigned int npages) { - struct list_head *pos, *tmp; - struct nfs_page *req; - unsigned long idx_end; - int res; + struct nfs_page *pgvec[NFS_SCAN_MAXENTRIES]; + struct nfs_page *req; + unsigned long idx_end; + int found, i; + int res; res = 0; if (npages == 0) @@ -351,25 +354,32 @@ nfs_scan_list(struct list_head *head, struct list_head *dst, else idx_end = idx_start + npages - 1; - list_for_each_safe(pos, tmp, head) { - - req = nfs_list_entry(pos); - - if (req->wb_index < idx_start) - continue; - if (req->wb_index > idx_end) + for (;;) { + found = radix_tree_gang_lookup(&nfsi->nfs_page_tree, + (void **)&pgvec[0], idx_start, + NFS_SCAN_MAXENTRIES); + if (found <= 0) break; + for (i = 0; i < found; i++) { + req = pgvec[i]; + if (req->wb_index > idx_end) + goto out; + idx_start = req->wb_index + 1; + if (req->wb_list_head != head) + continue; + if (nfs_set_page_writeback_locked(req)) { + nfs_list_remove_request(req); + nfs_list_add_request(req, dst); + res++; + } + } - if (!nfs_set_page_writeback_locked(req)) - continue; - nfs_list_remove_request(req); - nfs_list_add_request(req, dst); - res++; } +out: return res; } -int nfs_init_nfspagecache(void) +int __init nfs_init_nfspagecache(void) { nfs_page_cachep = kmem_cache_create("nfs_page", sizeof(struct nfs_page), diff --git a/fs/nfs/proc.c b/fs/nfs/proc.c index 9dd85cac2..5a8b9407e 100644 --- a/fs/nfs/proc.c +++ b/fs/nfs/proc.c @@ -44,11 +44,10 @@ #include #include #include +#include "internal.h" #define NFSDBG_FACILITY NFSDBG_PROC -extern struct rpc_procinfo nfs_procedures[]; - /* * Bare-bones access to getattr: this is for nfs_read_super. */ @@ -67,14 +66,14 @@ nfs_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle, dprintk("%s: call getattr\n", __FUNCTION__); nfs_fattr_init(fattr); - status = rpc_call_sync(server->client_sys, &msg, 0); + status = rpc_call_sync(server->nfs_client->cl_rpcclient, &msg, 0); dprintk("%s: reply getattr: %d\n", __FUNCTION__, status); if (status) return status; dprintk("%s: call statfs\n", __FUNCTION__); msg.rpc_proc = &nfs_procedures[NFSPROC_STATFS]; msg.rpc_resp = &fsinfo; - status = rpc_call_sync(server->client_sys, &msg, 0); + status = rpc_call_sync(server->nfs_client->cl_rpcclient, &msg, 0); dprintk("%s: reply statfs: %d\n", __FUNCTION__, status); if (status) return status; @@ -611,8 +610,6 @@ nfs_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle, return 0; } -extern u32 * nfs_decode_dirent(u32 *, struct nfs_entry *, int); - static int nfs_read_done(struct rpc_task *task, struct nfs_read_data *data) { if (task->tk_status >= 0) { @@ -674,7 +671,7 @@ nfs_proc_lock(struct file *filp, int cmd, struct file_lock *fl) } -struct nfs_rpc_ops nfs_v2_clientops = { +const struct nfs_rpc_ops nfs_v2_clientops = { .version = 2, /* protocol version */ .dentry_ops = &nfs_dentry_operations, .dir_inode_ops = &nfs_dir_inode_operations, diff --git a/fs/nfs/read.c b/fs/nfs/read.c index 624ca7146..30115bd49 100644 --- a/fs/nfs/read.c +++ b/fs/nfs/read.c @@ -15,7 +15,6 @@ * within the RPC code when root squashing is suspected. */ -#include #include #include #include @@ -27,11 +26,13 @@ #include #include #include +#include #include #include #include "iostat.h" +#include "internal.h" #define NFSDBG_FACILITY NFSDBG_PAGECACHE @@ -44,21 +45,20 @@ static mempool_t *nfs_rdata_mempool; #define MIN_POOL_READ (32) -struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount) +struct nfs_read_data *nfs_readdata_alloc(size_t len) { + unsigned int pagecount = (len + PAGE_SIZE - 1) >> PAGE_SHIFT; struct nfs_read_data *p = mempool_alloc(nfs_rdata_mempool, SLAB_NOFS); if (p) { memset(p, 0, sizeof(*p)); INIT_LIST_HEAD(&p->pages); - if (pagecount < NFS_PAGEVEC_SIZE) - p->pagevec = &p->page_array[0]; + p->npages = pagecount; + if (pagecount <= ARRAY_SIZE(p->page_array)) + p->pagevec = p->page_array; else { - size_t size = ++pagecount * sizeof(struct page *); - p->pagevec = kmalloc(size, GFP_NOFS); - if (p->pagevec) { - memset(p->pagevec, 0, size); - } else { + p->pagevec = kcalloc(pagecount, sizeof(struct page *), GFP_NOFS); + if (!p->pagevec) { mempool_free(p, nfs_rdata_mempool); p = NULL; } @@ -67,7 +67,7 @@ struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount) return p; } -void nfs_readdata_free(struct nfs_read_data *p) +static void nfs_readdata_free(struct nfs_read_data *p) { if (p && (p->pagevec != &p->page_array[0])) kfree(p->pagevec); @@ -104,6 +104,35 @@ int nfs_return_empty_page(struct page *page) return 0; } +static void nfs_readpage_truncate_uninitialised_page(struct nfs_read_data *data) +{ + unsigned int remainder = data->args.count - data->res.count; + unsigned int base = data->args.pgbase + data->res.count; + unsigned int pglen; + struct page **pages; + + if (data->res.eof == 0 || remainder == 0) + return; + /* + * Note: "remainder" can never be negative, since we check for + * this in the XDR code. + */ + pages = &data->args.pages[base >> PAGE_CACHE_SHIFT]; + base &= ~PAGE_CACHE_MASK; + pglen = PAGE_CACHE_SIZE - base; + for (;;) { + if (remainder <= pglen) { + memclear_highpage_flush(*pages, base, remainder); + break; + } + memclear_highpage_flush(*pages, base, pglen); + pages++; + remainder -= pglen; + pglen = PAGE_CACHE_SIZE; + base = 0; + } +} + /* * Read a page synchronously. */ @@ -115,7 +144,7 @@ static int nfs_readpage_sync(struct nfs_open_context *ctx, struct inode *inode, int result; struct nfs_read_data *rdata; - rdata = nfs_readdata_alloc(1); + rdata = nfs_readdata_alloc(count); if (!rdata) return -ENOMEM; @@ -144,7 +173,7 @@ static int nfs_readpage_sync(struct nfs_open_context *ctx, struct inode *inode, rdata->args.offset = page_offset(page) + rdata->args.pgbase; dprintk("NFS: nfs_proc_read(%s, (%s/%Ld), %Lu, %u)\n", - NFS_SERVER(inode)->hostname, + NFS_SERVER(inode)->nfs_client->cl_hostname, inode->i_sb->s_id, (long long)NFS_FILEID(inode), (unsigned long long)rdata->args.pgbase, @@ -177,20 +206,25 @@ static int nfs_readpage_sync(struct nfs_open_context *ctx, struct inode *inode, NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ATIME; spin_unlock(&inode->i_lock); - if (count) - memclear_highpage_flush(page, rdata->args.pgbase, count); - SetPageUptodate(page); - if (PageError(page)) - ClearPageError(page); + if (rdata->res.eof || rdata->res.count == rdata->args.count) { + SetPageUptodate(page); + if (rdata->res.eof && count != 0) + memclear_highpage_flush(page, rdata->args.pgbase, count); + } result = 0; + nfs_readpage_to_fscache(inode, page, 1); + unlock_page(page); + + return result; + io_error: unlock_page(page); nfs_readdata_free(rdata); return result; } -static int nfs_readpage_async(struct nfs_open_context *ctx, struct inode *inode, +int nfs_readpage_async(struct nfs_open_context *ctx, struct inode *inode, struct page *page) { LIST_HEAD(one_request); @@ -215,6 +249,11 @@ static int nfs_readpage_async(struct nfs_open_context *ctx, struct inode *inode, static void nfs_readpage_release(struct nfs_page *req) { + struct inode *d_inode = req->wb_context->dentry->d_inode; + + if (PageUptodate(req->wb_page)) + nfs_readpage_to_fscache(d_inode, req->wb_page, 0); + unlock_page(req->wb_page); dprintk("NFS: read done (%s/%Ld %d@%Ld)\n", @@ -313,25 +352,25 @@ static int nfs_pagein_multi(struct list_head *head, struct inode *inode) struct nfs_page *req = nfs_list_entry(head->next); struct page *page = req->wb_page; struct nfs_read_data *data; - unsigned int rsize = NFS_SERVER(inode)->rsize; - unsigned int nbytes, offset; + size_t rsize = NFS_SERVER(inode)->rsize, nbytes; + unsigned int offset; int requests = 0; LIST_HEAD(list); nfs_list_remove_request(req); nbytes = req->wb_bytes; - for(;;) { - data = nfs_readdata_alloc(1); + do { + size_t len = min(nbytes,rsize); + + data = nfs_readdata_alloc(len); if (!data) goto out_bad; INIT_LIST_HEAD(&data->pages); list_add(&data->pages, &list); requests++; - if (nbytes <= rsize) - break; - nbytes -= rsize; - } + nbytes -= len; + } while(nbytes != 0); atomic_set(&req->wb_complete, requests); ClearPageError(page); @@ -379,7 +418,7 @@ static int nfs_pagein_one(struct list_head *head, struct inode *inode) if (NFS_SERVER(inode)->rsize < PAGE_CACHE_SIZE) return nfs_pagein_multi(head, inode); - data = nfs_readdata_alloc(NFS_SERVER(inode)->rpages); + data = nfs_readdata_alloc(NFS_SERVER(inode)->rsize); if (!data) goto out_bad; @@ -436,20 +475,12 @@ static void nfs_readpage_result_partial(struct rpc_task *task, void *calldata) struct nfs_page *req = data->req; struct page *page = req->wb_page; + if (likely(task->tk_status >= 0)) + nfs_readpage_truncate_uninitialised_page(data); + else + SetPageError(page); if (nfs_readpage_result(task, data) != 0) return; - if (task->tk_status >= 0) { - unsigned int request = data->args.count; - unsigned int result = data->res.count; - - if (result < request) { - memclear_highpage_flush(page, - data->args.pgbase + result, - request - result); - } - } else - SetPageError(page); - if (atomic_dec_and_test(&req->wb_complete)) { if (!PageError(page)) SetPageUptodate(page); @@ -462,6 +493,40 @@ static const struct rpc_call_ops nfs_read_partial_ops = { .rpc_release = nfs_readdata_release, }; +static void nfs_readpage_set_pages_uptodate(struct nfs_read_data *data) +{ + unsigned int count = data->res.count; + unsigned int base = data->args.pgbase; + struct page **pages; + + if (data->res.eof) + count = data->args.count; + if (unlikely(count == 0)) + return; + pages = &data->args.pages[base >> PAGE_CACHE_SHIFT]; + base &= ~PAGE_CACHE_MASK; + count += base; + for (;count >= PAGE_CACHE_SIZE; count -= PAGE_CACHE_SIZE, pages++) + SetPageUptodate(*pages); + if (count != 0) + SetPageUptodate(*pages); +} + +static void nfs_readpage_set_pages_error(struct nfs_read_data *data) +{ + unsigned int count = data->args.count; + unsigned int base = data->args.pgbase; + struct page **pages; + + pages = &data->args.pages[base >> PAGE_CACHE_SHIFT]; + base &= ~PAGE_CACHE_MASK; + count += base; + for (;count >= PAGE_CACHE_SIZE; count -= PAGE_CACHE_SIZE, pages++) + SetPageError(*pages); + if (count != 0) + SetPageError(*pages); +} + /* * This is the callback from RPC telling us whether a reply was * received or some error occurred (timeout or socket shutdown). @@ -469,27 +534,24 @@ static const struct rpc_call_ops nfs_read_partial_ops = { static void nfs_readpage_result_full(struct rpc_task *task, void *calldata) { struct nfs_read_data *data = calldata; - unsigned int count = data->res.count; + /* + * Note: nfs_readpage_result may change the values of + * data->args. In the multi-page case, we therefore need + * to ensure that we call the next nfs_readpage_set_page_uptodate() + * first in the multi-page case. + */ + if (likely(task->tk_status >= 0)) { + nfs_readpage_truncate_uninitialised_page(data); + nfs_readpage_set_pages_uptodate(data); + } else + nfs_readpage_set_pages_error(data); if (nfs_readpage_result(task, data) != 0) return; while (!list_empty(&data->pages)) { struct nfs_page *req = nfs_list_entry(data->pages.next); - struct page *page = req->wb_page; - nfs_list_remove_request(req); - if (task->tk_status >= 0) { - if (count < PAGE_CACHE_SIZE) { - if (count < req->wb_bytes) - memclear_highpage_flush(page, - req->wb_pgbase + count, - req->wb_bytes - count); - count = 0; - } else - count -= PAGE_CACHE_SIZE; - SetPageUptodate(page); - } else - SetPageError(page); + nfs_list_remove_request(req); nfs_readpage_release(req); } } @@ -574,6 +636,10 @@ int nfs_readpage(struct file *file, struct page *page) ctx = get_nfs_open_context((struct nfs_open_context *) file->private_data); if (!IS_SYNC(inode)) { + error = nfs_readpage_from_fscache(ctx, inode, page); + if (error == 0) + goto out; + error = nfs_readpage_async(ctx, inode, page); goto out; } @@ -604,6 +670,7 @@ readpage_async_filler(void *data, struct page *page) unsigned int len; nfs_wb_page(inode, page); + len = nfs_page_length(inode, page); if (len == 0) return nfs_return_empty_page(page); @@ -643,6 +710,17 @@ int nfs_readpages(struct file *filp, struct address_space *mapping, } else desc.ctx = get_nfs_open_context((struct nfs_open_context *) filp->private_data); + + /* attempt to read as many of the pages as possible from the cache + * - this returns -ENOBUFS immediately if the cookie is negative + */ + ret = nfs_readpages_from_fscache(desc.ctx, inode, mapping, + pages, &nr_pages); + if (ret == 0) { + put_nfs_open_context(desc.ctx); + return ret; /* all read */ + } + ret = read_cache_pages(mapping, pages, readpage_async_filler, &desc); if (!list_empty(&head)) { int err = nfs_pagein_list(&head, server->rpages); @@ -654,7 +732,7 @@ int nfs_readpages(struct file *filp, struct address_space *mapping, return ret; } -int nfs_init_readpagecache(void) +int __init nfs_init_readpagecache(void) { nfs_rdata_cachep = kmem_cache_create("nfs_read_data", sizeof(struct nfs_read_data), diff --git a/fs/nfs/symlink.c b/fs/nfs/symlink.c index 18dc95b0b..600bbe630 100644 --- a/fs/nfs/symlink.c +++ b/fs/nfs/symlink.c @@ -52,7 +52,7 @@ static void *nfs_follow_link(struct dentry *dentry, struct nameidata *nd) { struct inode *inode = dentry->d_inode; struct page *page; - void *err = ERR_PTR(nfs_revalidate_inode(NFS_SERVER(inode), inode)); + void *err = ERR_PTR(nfs_revalidate_mapping(inode, inode->i_mapping)); if (err) goto read_failed; page = read_cache_page(&inode->i_data, 0, @@ -75,22 +75,13 @@ read_failed: return NULL; } -static void nfs_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie) -{ - if (cookie) { - struct page *page = cookie; - kunmap(page); - page_cache_release(page); - } -} - /* * symlinks can't do much... */ struct inode_operations nfs_symlink_inode_operations = { .readlink = generic_readlink, .follow_link = nfs_follow_link, - .put_link = nfs_put_link, + .put_link = page_put_link, .getattr = nfs_getattr, .setattr = nfs_setattr, }; diff --git a/fs/nfs/sysctl.c b/fs/nfs/sysctl.c index 4c486eb86..7a25a6d16 100644 --- a/fs/nfs/sysctl.c +++ b/fs/nfs/sysctl.c @@ -3,7 +3,6 @@ * * Sysctl interface to NFS parameters */ -#include #include #include #include @@ -12,8 +11,10 @@ #include #include #include +#include #include "callback.h" +#include "internal.h" static const int nfs_set_port_min = 0; static const int nfs_set_port_max = 65535; @@ -45,6 +46,57 @@ static ctl_table nfs_cb_sysctls[] = { .proc_handler = &proc_dointvec_jiffies, .strategy = &sysctl_jiffies, }, +#endif + { + .ctl_name = CTL_UNNUMBERED, + .procname = "nfs_mountpoint_timeout", + .data = &nfs_mountpoint_expiry_timeout, + .maxlen = sizeof(nfs_mountpoint_expiry_timeout), + .mode = 0644, + .proc_handler = &proc_dointvec_jiffies, + .strategy = &sysctl_jiffies, + }, +#ifdef CONFIG_NFS_FSCACHE + { + .ctl_name = CTL_UNNUMBERED, + .procname = "fscache_from_error", + .data = &nfs_fscache_from_error, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + }, + { + .ctl_name = CTL_UNNUMBERED, + .procname = "fscache_to_error", + .data = &nfs_fscache_to_error, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + }, + { + .ctl_name = CTL_UNNUMBERED, + .procname = "fscache_uncache_page", + .data = &nfs_fscache_uncache_page, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + }, + { + .ctl_name = CTL_UNNUMBERED, + .procname = "fscache_to_pages", + .data = &nfs_fscache_to_pages, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec_minmax, + }, + { + .ctl_name = CTL_UNNUMBERED, + .procname = "fscache_from_pages", + .data = &nfs_fscache_from_pages, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + }, #endif { .ctl_name = 0 } }; diff --git a/fs/nfs/write.c b/fs/nfs/write.c index 4cfada2cc..24de4f3c5 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c @@ -46,7 +46,6 @@ * Copyright (C) 1996, 1997, Olaf Kirch */ -#include #include #include #include @@ -64,6 +63,7 @@ #include "delegation.h" #include "iostat.h" +#include "internal.h" #define NFSDBG_FACILITY NFSDBG_PAGECACHE @@ -91,23 +91,13 @@ static mempool_t *nfs_commit_mempool; static DECLARE_WAIT_QUEUE_HEAD(nfs_write_congestion); -struct nfs_write_data *nfs_commit_alloc(unsigned int pagecount) +struct nfs_write_data *nfs_commit_alloc(void) { struct nfs_write_data *p = mempool_alloc(nfs_commit_mempool, SLAB_NOFS); if (p) { memset(p, 0, sizeof(*p)); INIT_LIST_HEAD(&p->pages); - if (pagecount < NFS_PAGEVEC_SIZE) - p->pagevec = &p->page_array[0]; - else { - size_t size = ++pagecount * sizeof(struct page *); - p->pagevec = kzalloc(size, GFP_NOFS); - if (!p->pagevec) { - mempool_free(p, nfs_commit_mempool); - p = NULL; - } - } } return p; } @@ -119,21 +109,20 @@ void nfs_commit_free(struct nfs_write_data *p) mempool_free(p, nfs_commit_mempool); } -struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount) +struct nfs_write_data *nfs_writedata_alloc(size_t len) { + unsigned int pagecount = (len + PAGE_SIZE - 1) >> PAGE_SHIFT; struct nfs_write_data *p = mempool_alloc(nfs_wdata_mempool, SLAB_NOFS); if (p) { memset(p, 0, sizeof(*p)); INIT_LIST_HEAD(&p->pages); - if (pagecount < NFS_PAGEVEC_SIZE) - p->pagevec = &p->page_array[0]; + p->npages = pagecount; + if (pagecount <= ARRAY_SIZE(p->page_array)) + p->pagevec = p->page_array; else { - size_t size = ++pagecount * sizeof(struct page *); - p->pagevec = kmalloc(size, GFP_NOFS); - if (p->pagevec) { - memset(p->pagevec, 0, size); - } else { + p->pagevec = kcalloc(pagecount, sizeof(struct page *), GFP_NOFS); + if (!p->pagevec) { mempool_free(p, nfs_wdata_mempool); p = NULL; } @@ -142,7 +131,7 @@ struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount) return p; } -void nfs_writedata_free(struct nfs_write_data *p) +static void nfs_writedata_free(struct nfs_write_data *p) { if (p && (p->pagevec != &p->page_array[0])) kfree(p->pagevec); @@ -168,6 +157,9 @@ static void nfs_grow_file(struct page *page, unsigned int offset, unsigned int c return; nfs_inc_stats(inode, NFSIOS_EXTENDWRITE); i_size_write(inode, end); +#ifdef FSCACHE_WRITE_SUPPORT + nfs_set_fscsize(NFS_SERVER(inode), NFS_I(inode), end); +#endif } /* We can set the PG_uptodate flag if we see that a write request @@ -213,7 +205,7 @@ static int nfs_writepage_sync(struct nfs_open_context *ctx, struct inode *inode, int result, written = 0; struct nfs_write_data *wdata; - wdata = nfs_writedata_alloc(1); + wdata = nfs_writedata_alloc(wsize); if (!wdata) return -ENOMEM; @@ -347,6 +339,9 @@ do_it: err = -EBADF; goto out; } + + nfs_writepage_to_fscache(inode, page); + lock_kernel(); if (!IS_SYNC(inode) && inode_referenced) { err = nfs_writepage_async(ctx, inode, page, 0, offset); @@ -429,7 +424,7 @@ static int nfs_inode_add_request(struct inode *inode, struct nfs_page *req) if (nfs_have_delegation(inode, FMODE_WRITE)) nfsi->change_attr++; } - SetPagePrivate(req->wb_page); + SetPageNfsWriting(req->wb_page); nfsi->npages++; atomic_inc(&req->wb_count); return 0; @@ -446,7 +441,7 @@ static void nfs_inode_remove_request(struct nfs_page *req) BUG_ON (!NFS_WBACK_BUSY(req)); spin_lock(&nfsi->req_lock); - ClearPagePrivate(req->wb_page); + ClearPageNfsWriting(req->wb_page); radix_tree_delete(&nfsi->nfs_page_tree, req->wb_index); nfsi->npages--; if (!nfsi->npages) { @@ -501,7 +496,7 @@ nfs_mark_request_dirty(struct nfs_page *req) nfs_list_add_request(req, &nfsi->dirty); nfsi->ndirty++; spin_unlock(&nfsi->req_lock); - inc_page_state(nr_dirty); + inc_zone_page_state(req->wb_page, NR_FILE_DIRTY); mark_inode_dirty(inode); } @@ -529,7 +524,7 @@ nfs_mark_request_commit(struct nfs_page *req) nfs_list_add_request(req, &nfsi->commit); nfsi->ncommit++; spin_unlock(&nfsi->req_lock); - inc_page_state(nr_unstable); + inc_zone_page_state(req->wb_page, NR_UNSTABLE_NFS); mark_inode_dirty(inode); } #endif @@ -583,6 +578,30 @@ static int nfs_wait_on_requests(struct inode *inode, unsigned long idx_start, un return ret; } +static void nfs_cancel_dirty_list(struct list_head *head) +{ + struct nfs_page *req; + while(!list_empty(head)) { + req = nfs_list_entry(head->next); + nfs_list_remove_request(req); + nfs_inode_remove_request(req); + nfs_clear_page_writeback(req); + } +} + +static void nfs_cancel_commit_list(struct list_head *head) +{ + struct nfs_page *req; + + while(!list_empty(head)) { + req = nfs_list_entry(head->next); + nfs_list_remove_request(req); + nfs_inode_remove_request(req); + dec_zone_page_state(req->wb_page, NR_UNSTABLE_NFS); + nfs_clear_page_writeback(req); + } +} + /* * nfs_scan_dirty - Scan an inode for dirty requests * @inode: NFS inode to scan @@ -602,7 +621,6 @@ nfs_scan_dirty(struct inode *inode, struct list_head *dst, unsigned long idx_sta if (nfsi->ndirty != 0) { res = nfs_scan_lock_dirty(nfsi, dst, idx_start, npages); nfsi->ndirty -= res; - sub_page_state(nr_dirty,res); if ((nfsi->ndirty == 0) != list_empty(&nfsi->dirty)) printk(KERN_ERR "NFS: desynchronized value of nfs_i.ndirty.\n"); } @@ -627,7 +645,7 @@ nfs_scan_commit(struct inode *inode, struct list_head *dst, unsigned long idx_st int res = 0; if (nfsi->ncommit != 0) { - res = nfs_scan_list(&nfsi->commit, dst, idx_start, npages); + res = nfs_scan_list(nfsi, &nfsi->commit, dst, idx_start, npages); nfsi->ncommit -= res; if ((nfsi->ncommit == 0) != list_empty(&nfsi->commit)) printk(KERN_ERR "NFS: desynchronized value of nfs_i.ncommit.\n"); @@ -981,24 +999,24 @@ static int nfs_flush_multi(struct inode *inode, struct list_head *head, int how) struct nfs_page *req = nfs_list_entry(head->next); struct page *page = req->wb_page; struct nfs_write_data *data; - unsigned int wsize = NFS_SERVER(inode)->wsize; - unsigned int nbytes, offset; + size_t wsize = NFS_SERVER(inode)->wsize, nbytes; + unsigned int offset; int requests = 0; LIST_HEAD(list); nfs_list_remove_request(req); nbytes = req->wb_bytes; - for (;;) { - data = nfs_writedata_alloc(1); + do { + size_t len = min(nbytes, wsize); + + data = nfs_writedata_alloc(len); if (!data) goto out_bad; list_add(&data->pages, &list); requests++; - if (nbytes <= wsize) - break; - nbytes -= wsize; - } + nbytes -= len; + } while (nbytes != 0); atomic_set(&req->wb_complete, requests); ClearPageError(page); @@ -1052,7 +1070,7 @@ static int nfs_flush_one(struct inode *inode, struct list_head *head, int how) struct nfs_write_data *data; unsigned int count; - data = nfs_writedata_alloc(NFS_SERVER(inode)->wpages); + data = nfs_writedata_alloc(NFS_SERVER(inode)->wsize); if (!data) goto out_bad; @@ -1262,7 +1280,7 @@ int nfs_writeback_done(struct rpc_task *task, struct nfs_write_data *data) if (time_before(complain, jiffies)) { dprintk("NFS: faulty NFS server %s:" " (committed = %d) != (stable = %d)\n", - NFS_SERVER(data->inode)->hostname, + NFS_SERVER(data->inode)->nfs_client->cl_hostname, resp->verf->committed, argp->stable); complain = jiffies + 300 * HZ; } @@ -1360,7 +1378,7 @@ nfs_commit_list(struct inode *inode, struct list_head *head, int how) struct nfs_write_data *data; struct nfs_page *req; - data = nfs_commit_alloc(NFS_SERVER(inode)->wpages); + data = nfs_commit_alloc(); if (!data) goto out_bad; @@ -1375,6 +1393,7 @@ nfs_commit_list(struct inode *inode, struct list_head *head, int how) req = nfs_list_entry(head->next); nfs_list_remove_request(req); nfs_mark_request_commit(req); + dec_zone_page_state(req->wb_page, NR_UNSTABLE_NFS); nfs_clear_page_writeback(req); } return -ENOMEM; @@ -1387,7 +1406,6 @@ static void nfs_commit_done(struct rpc_task *task, void *calldata) { struct nfs_write_data *data = calldata; struct nfs_page *req; - int res = 0; dprintk("NFS: %4d nfs_commit_done (status %d)\n", task->tk_pid, task->tk_status); @@ -1399,6 +1417,7 @@ static void nfs_commit_done(struct rpc_task *task, void *calldata) while (!list_empty(&data->pages)) { req = nfs_list_entry(data->pages.next); nfs_list_remove_request(req); + dec_zone_page_state(req->wb_page, NR_UNSTABLE_NFS); dprintk("NFS: commit (%s/%Ld %d@%Ld)", req->wb_context->dentry->d_inode->i_sb->s_id, @@ -1425,9 +1444,7 @@ static void nfs_commit_done(struct rpc_task *task, void *calldata) nfs_mark_request_dirty(req); next: nfs_clear_page_writeback(req); - res++; } - sub_page_state(nr_unstable,res); } static const struct rpc_call_ops nfs_commit_ops = { @@ -1495,15 +1512,25 @@ int nfs_sync_inode_wait(struct inode *inode, unsigned long idx_start, pages = nfs_scan_dirty(inode, &head, idx_start, npages); if (pages != 0) { spin_unlock(&nfsi->req_lock); - ret = nfs_flush_list(inode, &head, pages, how); + if (how & FLUSH_INVALIDATE) + nfs_cancel_dirty_list(&head); + else + ret = nfs_flush_list(inode, &head, pages, how); spin_lock(&nfsi->req_lock); continue; } if (nocommit) break; - pages = nfs_scan_commit(inode, &head, 0, 0); + pages = nfs_scan_commit(inode, &head, idx_start, npages); if (pages == 0) break; + if (how & FLUSH_INVALIDATE) { + spin_unlock(&nfsi->req_lock); + nfs_cancel_commit_list(&head); + spin_lock(&nfsi->req_lock); + continue; + } + pages += nfs_scan_commit(inode, &head, 0, 0); spin_unlock(&nfsi->req_lock); ret = nfs_commit_list(inode, &head, how); spin_lock(&nfsi->req_lock); @@ -1512,7 +1539,7 @@ int nfs_sync_inode_wait(struct inode *inode, unsigned long idx_start, return ret; } -int nfs_init_writepagecache(void) +int __init nfs_init_writepagecache(void) { nfs_wdata_cachep = kmem_cache_create("nfs_write_data", sizeof(struct nfs_write_data), diff --git a/fs/nfsctl.c b/fs/nfsctl.c index a5a18d4ac..c043136a8 100644 --- a/fs/nfsctl.c +++ b/fs/nfsctl.c @@ -4,7 +4,6 @@ * This should eventually move to userland. * */ -#include #include #include #include diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c index 3eec30000..01bc68c62 100644 --- a/fs/nfsd/export.c +++ b/fs/nfsd/export.c @@ -126,7 +126,7 @@ static int expkey_parse(struct cache_detail *cd, char *mesg, int mlen) if (*ep) goto out; dprintk("found fsidtype %d\n", fsidtype); - if (fsidtype > 2) + if (key_len(fsidtype)==0) /* invalid type */ goto out; if ((len=qword_get(&mesg, buf, PAGE_SIZE)) <= 0) goto out; diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c index 1a55dfcb7..54b37b1d2 100644 --- a/fs/nfsd/nfs4callback.c +++ b/fs/nfsd/nfs4callback.c @@ -33,7 +33,6 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include #include #include #include @@ -53,8 +52,7 @@ #define NFSPROC4_CB_COMPOUND 1 /* declarations */ -static void nfs4_cb_null(struct rpc_task *task); -extern spinlock_t recall_lock; +static const struct rpc_call_ops nfs4_cb_null_ops; /* Index of predefined Linux callback client operations */ @@ -327,16 +325,18 @@ out: .p_encode = (kxdrproc_t) nfs4_xdr_##argtype, \ .p_decode = (kxdrproc_t) nfs4_xdr_##restype, \ .p_bufsiz = MAX(NFS4_##argtype##_sz,NFS4_##restype##_sz) << 2, \ + .p_statidx = NFSPROC4_CB_##call, \ + .p_name = #proc, \ } -struct rpc_procinfo nfs4_cb_procedures[] = { +static struct rpc_procinfo nfs4_cb_procedures[] = { PROC(CB_NULL, NULL, enc_cb_null, dec_cb_null), PROC(CB_RECALL, COMPOUND, enc_cb_recall, dec_cb_recall), }; -struct rpc_version nfs_cb_version4 = { +static struct rpc_version nfs_cb_version4 = { .number = 1, - .nrprocs = sizeof(nfs4_cb_procedures)/sizeof(nfs4_cb_procedures[0]), + .nrprocs = ARRAY_SIZE(nfs4_cb_procedures), .procs = nfs4_cb_procedures }; @@ -348,7 +348,7 @@ static struct rpc_version * nfs_cb_version[] = { /* * Use the SETCLIENTID credential */ -struct rpc_cred * +static struct rpc_cred * nfsd4_lookupcred(struct nfs4_client *clp, int taskflags) { struct auth_cred acred; @@ -387,9 +387,7 @@ nfsd4_probe_callback(struct nfs4_client *clp) char hostname[32]; int status; - dprintk("NFSD: probe_callback. cb_parsed %d cb_set %d\n", - cb->cb_parsed, atomic_read(&cb->cb_set)); - if (!cb->cb_parsed || atomic_read(&cb->cb_set)) + if (atomic_read(&cb->cb_set)) return; /* Initialize address */ @@ -414,7 +412,7 @@ nfsd4_probe_callback(struct nfs4_client *clp) /* Initialize rpc_program */ program->name = "nfs4_cb"; program->number = cb->cb_prog; - program->nrvers = sizeof(nfs_cb_version)/sizeof(nfs_cb_version[0]); + program->nrvers = ARRAY_SIZE(nfs_cb_version); program->version = nfs_cb_version; program->stats = stat; @@ -427,14 +425,13 @@ nfsd4_probe_callback(struct nfs4_client *clp) * XXX AUTH_UNIX only - need AUTH_GSS.... */ sprintf(hostname, "%u.%u.%u.%u", NIPQUAD(addr.sin_addr.s_addr)); - clnt = rpc_create_client(xprt, hostname, program, 1, RPC_AUTH_UNIX); + clnt = rpc_new_client(xprt, hostname, program, 1, RPC_AUTH_UNIX); if (IS_ERR(clnt)) { dprintk("NFSD: couldn't create callback client\n"); - goto out_xprt; + goto out_err; } clnt->cl_intr = 0; clnt->cl_softrtry = 1; - clnt->cl_chatty = 1; /* Kick rpciod, put the call on the wire. */ @@ -443,14 +440,15 @@ nfsd4_probe_callback(struct nfs4_client *clp) goto out_clnt; } - /* the task holds a reference to the nfs4_client struct */ cb->cb_client = clnt; + + /* the task holds a reference to the nfs4_client struct */ atomic_inc(&clp->cl_count); msg.rpc_cred = nfsd4_lookupcred(clp,0); if (IS_ERR(msg.rpc_cred)) goto out_rpciod; - status = rpc_call_async(clnt, &msg, RPC_TASK_ASYNC, nfs4_cb_null, NULL); + status = rpc_call_async(clnt, &msg, RPC_TASK_ASYNC, &nfs4_cb_null_ops, NULL); put_rpccred(msg.rpc_cred); if (status != 0) { @@ -462,19 +460,16 @@ nfsd4_probe_callback(struct nfs4_client *clp) out_rpciod: atomic_dec(&clp->cl_count); rpciod_down(); + cb->cb_client = NULL; out_clnt: rpc_shutdown_client(clnt); - goto out_err; -out_xprt: - xprt_destroy(xprt); out_err: dprintk("NFSD: warning: no callback path to client %.*s\n", (int)clp->cl_name.len, clp->cl_name.data); - cb->cb_client = NULL; } static void -nfs4_cb_null(struct rpc_task *task) +nfs4_cb_null(struct rpc_task *task, void *dummy) { struct nfs4_client *clp = (struct nfs4_client *)task->tk_msg.rpc_argp; struct nfs4_callback *cb = &clp->cl_callback; @@ -493,6 +488,10 @@ out: put_nfs4_client(clp); } +static const struct rpc_call_ops nfs4_cb_null_ops = { + .rpc_call_done = nfs4_cb_null, +}; + /* * called with dp->dl_count inc'ed. * nfs4_lock_state() may or may not have been called. diff --git a/fs/nfsd/nfs4idmap.c b/fs/nfsd/nfs4idmap.c index 4b6aa60df..bea6b9478 100644 --- a/fs/nfsd/nfs4idmap.c +++ b/fs/nfsd/nfs4idmap.c @@ -34,7 +34,6 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include #include #include diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c index b0e095ea0..ee4eff27a 100644 --- a/fs/nfsd/nfs4proc.c +++ b/fs/nfsd/nfs4proc.c @@ -721,6 +721,12 @@ nfsd4_proc_null(struct svc_rqst *rqstp, void *argp, void *resp) return nfs_ok; } +static inline void nfsd4_increment_op_stats(u32 opnum) +{ + if (opnum >= FIRST_NFS4_OP && opnum <= LAST_NFS4_OP) + nfsdstats.nfs4_opcount[opnum]++; +} + /* * COMPOUND call. @@ -930,6 +936,8 @@ encode_op: /* XXX Ugh, we need to get rid of this kind of special case: */ if (op->opnum == OP_READ && op->u.read.rd_filp) fput(op->u.read.rd_filp); + + nfsd4_increment_op_stats(op->opnum); } out: diff --git a/fs/nfsd/nfs4recover.c b/fs/nfsd/nfs4recover.c index a725cd17b..b32c87b4d 100644 --- a/fs/nfsd/nfs4recover.c +++ b/fs/nfsd/nfs4recover.c @@ -183,7 +183,7 @@ struct dentry_list_arg { static int nfsd4_build_dentrylist(void *arg, const char *name, int namlen, - loff_t offset, ino_t ino, unsigned int d_type) + loff_t offset, u64 ino, unsigned int d_type) { struct dentry_list_arg *dla = arg; struct list_head *dentries = &dla->dentries; diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index e11b9cdfc..e280ad4f6 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -123,7 +123,7 @@ static void release_stateid(struct nfs4_stateid *stp, int flags); */ /* recall_lock protects the del_recall_lru */ -static spinlock_t recall_lock = SPIN_LOCK_UNLOCKED; +static DEFINE_SPINLOCK(recall_lock); static struct list_head del_recall_lru; static void @@ -529,8 +529,7 @@ move_to_confirmed(struct nfs4_client *clp) dprintk("NFSD: move_to_confirm nfs4_client %p\n", clp); list_del_init(&clp->cl_strhash); - list_del_init(&clp->cl_idhash); - list_add(&clp->cl_idhash, &conf_id_hashtbl[idhashval]); + list_move(&clp->cl_idhash, &conf_id_hashtbl[idhashval]); strhashval = clientstr_hashval(clp->cl_recdir); list_add(&clp->cl_strhash, &conf_str_hashtbl[strhashval]); renew_client(clp); @@ -1238,8 +1237,15 @@ find_file(struct inode *ino) return NULL; } -#define TEST_ACCESS(x) ((x > 0 || x < 4)?1:0) -#define TEST_DENY(x) ((x >= 0 || x < 5)?1:0) +static int access_valid(u32 x) +{ + return (x > 0 && x < 4); +} + +static int deny_valid(u32 x) +{ + return (x >= 0 && x < 5); +} static void set_access(unsigned int *access, unsigned long bmap) { @@ -1746,7 +1752,8 @@ nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nf int status; status = nfserr_inval; - if (!TEST_ACCESS(open->op_share_access) || !TEST_DENY(open->op_share_deny)) + if (!access_valid(open->op_share_access) + || !deny_valid(open->op_share_deny)) goto out; /* * Lookup file; if found, lookup stateid and check open request, @@ -1783,10 +1790,10 @@ nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nf } else { /* Stateid was not found, this is a new OPEN */ int flags = 0; + if (open->op_share_access & NFS4_SHARE_ACCESS_READ) + flags |= MAY_READ; if (open->op_share_access & NFS4_SHARE_ACCESS_WRITE) - flags = MAY_WRITE; - else - flags = MAY_READ; + flags |= MAY_WRITE; status = nfs4_new_open(rqstp, &stp, dp, current_fh, flags); if (status) goto out; @@ -2071,16 +2078,12 @@ nfs4_preprocess_stateid_op(struct svc_fh *current_fh, stateid_t *stateid, int fl if (!stateid->si_fileid) { /* delegation stateid */ if(!(dp = find_delegation_stateid(ino, stateid))) { dprintk("NFSD: delegation stateid not found\n"); - if (nfs4_in_grace()) - status = nfserr_grace; goto out; } stidp = &dp->dl_stateid; } else { /* open or lock stateid */ if (!(stp = find_stateid(stateid, flags))) { dprintk("NFSD: open or lock stateid not found\n"); - if (nfs4_in_grace()) - status = nfserr_grace; goto out; } if ((flags & CHECK_FH) && nfs4_check_fh(current_fh, stp)) @@ -2253,8 +2256,9 @@ nfsd4_open_confirm(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfs (int)current_fh->fh_dentry->d_name.len, current_fh->fh_dentry->d_name.name); - if ((status = fh_verify(rqstp, current_fh, S_IFREG, 0))) - goto out; + status = fh_verify(rqstp, current_fh, S_IFREG, 0); + if (status) + return status; nfs4_lock_state(); @@ -2321,7 +2325,8 @@ nfsd4_open_downgrade(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct n (int)current_fh->fh_dentry->d_name.len, current_fh->fh_dentry->d_name.name); - if (!TEST_ACCESS(od->od_share_access) || !TEST_DENY(od->od_share_deny)) + if (!access_valid(od->od_share_access) + || !deny_valid(od->od_share_deny)) return nfserr_inval; nfs4_lock_state(); diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index 67d68009e..9dc858744 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c @@ -1311,7 +1311,7 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp, if ((bmval0 & (FATTR4_WORD0_FILES_FREE | FATTR4_WORD0_FILES_TOTAL)) || (bmval1 & (FATTR4_WORD1_SPACE_AVAIL | FATTR4_WORD1_SPACE_FREE | FATTR4_WORD1_SPACE_TOTAL))) { - status = vfs_statfs(dentry->d_inode->i_sb, &statfs); + status = vfs_statfs(dentry, &statfs); if (status) goto out_nfserr; } diff --git a/fs/nfsd/nfscache.c b/fs/nfsd/nfscache.c index d852ebb53..fdf7cf3df 100644 --- a/fs/nfsd/nfscache.c +++ b/fs/nfsd/nfscache.c @@ -103,8 +103,7 @@ nfsd_cache_shutdown(void) static void lru_put_end(struct svc_cacherep *rp) { - list_del(&rp->c_lru); - list_add_tail(&rp->c_lru, &lru_head); + list_move_tail(&rp->c_lru, &lru_head); } /* diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c index 8fd615fd6..42165e5ec 100644 --- a/fs/nfsd/nfsctl.c +++ b/fs/nfsd/nfsctl.c @@ -6,7 +6,6 @@ * Copyright (C) 1995, 1996 Olaf Kirch */ -#include #include #include @@ -553,10 +552,10 @@ static int nfsd_fill_super(struct super_block * sb, void * data, int silent) return simple_fill_super(sb, 0x6e667364, nfsd_files); } -static struct super_block *nfsd_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int nfsd_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_single(fs_type, flags, data, nfsd_fill_super); + return get_sb_single(fs_type, flags, data, nfsd_fill_super, mnt); } static struct file_system_type nfsd_fs_type = { diff --git a/fs/nfsd/nfsfh.c b/fs/nfsd/nfsfh.c index 3f2ec2e6d..501d83884 100644 --- a/fs/nfsd/nfsfh.c +++ b/fs/nfsd/nfsfh.c @@ -188,11 +188,9 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access) } /* Set user creds for this exportpoint */ - error = nfsd_setuser(rqstp, exp); - if (error) { - error = nfserrno(error); + error = nfserrno(nfsd_setuser(rqstp, exp)); + if (error) goto out; - } /* * Look up the dentry using the NFS file handle. @@ -248,9 +246,18 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access) dprintk("nfsd: fh_verify - just checking\n"); dentry = fhp->fh_dentry; exp = fhp->fh_export; + /* Set user creds for this exportpoint; necessary even + * in the "just checking" case because this may be a + * filehandle that was created by fh_compose, and that + * is about to be used in another nfsv4 compound + * operation */ + error = nfserrno(nfsd_setuser(rqstp, exp)); + if (error) + goto out; } cache_get(&exp->h); + error = nfsd_mode_check(rqstp, dentry->d_inode->i_mode, type); if (error) goto out; @@ -312,8 +319,8 @@ int fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, struct svc_fh *ref_fh) { /* ref_fh is a reference file handle. - * if it is non-null, then we should compose a filehandle which is - * of the same version, where possible. + * if it is non-null and for the same filesystem, then we should compose + * a filehandle which is of the same version, where possible. * Currently, that means that if ref_fh->fh_handle.fh_version == 0xca * Then create a 32byte filehandle using nfs_fhbase_old * @@ -332,7 +339,7 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, st parent->d_name.name, dentry->d_name.name, (inode ? inode->i_ino : 0)); - if (ref_fh) { + if (ref_fh && ref_fh->fh_export == exp) { ref_fh_version = ref_fh->fh_handle.fh_version; if (ref_fh_version == 0xca) ref_fh_fsid_type = 0; @@ -461,7 +468,7 @@ fh_update(struct svc_fh *fhp) } else { int size; if (fhp->fh_handle.fh_fileid_type != 0) - goto out_uptodate; + goto out; datap = fhp->fh_handle.fh_auth+ fhp->fh_handle.fh_size/4 -1; size = (fhp->fh_maxsize - fhp->fh_handle.fh_size)/4; @@ -481,10 +488,6 @@ out_negative: printk(KERN_ERR "fh_update: %s/%s still negative!\n", dentry->d_parent->d_name.name, dentry->d_name.name); goto out; -out_uptodate: - printk(KERN_ERR "fh_update: %s/%s already up-to-date!\n", - dentry->d_parent->d_name.name, dentry->d_name.name); - goto out; } /* diff --git a/fs/nfsd/nfsproc.c b/fs/nfsd/nfsproc.c index 06cd0db0f..4e06810b6 100644 --- a/fs/nfsd/nfsproc.c +++ b/fs/nfsd/nfsproc.c @@ -225,7 +225,7 @@ nfsd_proc_create(struct svc_rqst *rqstp, struct nfsd_createargs *argp, nfserr = nfserr_exist; if (isdotent(argp->name, argp->len)) goto done; - fh_lock(dirfhp); + fh_lock_nested(dirfhp, I_MUTEX_PARENT); dchild = lookup_one_len(argp->name, dirfhp->fh_dentry, argp->len); if (IS_ERR(dchild)) { nfserr = nfserrno(PTR_ERR(dchild)); diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c index f7997ebcd..509d27b0d 100644 --- a/fs/nfsd/nfssvc.c +++ b/fs/nfsd/nfssvc.c @@ -8,7 +8,6 @@ * Copyright (C) 1995, 1996, 1997 Olaf Kirch */ -#include #include #include diff --git a/fs/nfsd/stats.c b/fs/nfsd/stats.c index 57265d563..71944cddf 100644 --- a/fs/nfsd/stats.c +++ b/fs/nfsd/stats.c @@ -72,6 +72,16 @@ static int nfsd_proc_show(struct seq_file *seq, void *v) /* show my rpc info */ svc_seq_show(seq, &nfsd_svcstats); +#ifdef CONFIG_NFSD_V4 + /* Show count for individual nfsv4 operations */ + /* Writing operation numbers 0 1 2 also for maintaining uniformity */ + seq_printf(seq,"proc4ops %u", LAST_NFS4_OP + 1); + for (i = 0; i <= LAST_NFS4_OP; i++) + seq_printf(seq, " %u", nfsdstats.nfs4_opcount[i]); + + seq_putc(seq, '\n'); +#endif + return 0; } diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 95645569f..98a6df852 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -16,7 +16,6 @@ * Zerocpy NFS support (C) 2002 Hirokazu Takahashi */ -#include #include #include #include @@ -673,7 +672,10 @@ nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, goto out_nfserr; if (access & MAY_WRITE) { - flags = O_WRONLY|O_LARGEFILE; + if (access & MAY_READ) + flags = O_RDWR|O_LARGEFILE; + else + flags = O_WRONLY|O_LARGEFILE; DQUOT_INIT(inode); } @@ -834,7 +836,7 @@ nfsd_vfs_read(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file, if (ra && ra->p_set) file->f_ra = ra->p_ra; - if (file->f_op->sendfile) { + if (file->f_op->sendfile && rqstp->rq_sendfile_ok) { svc_pushback_unused_pages(rqstp); err = file->f_op->sendfile(file, &offset, *count, nfsd_read_actor, rqstp); @@ -1112,7 +1114,7 @@ nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp, */ if (!resfhp->fh_dentry) { /* called from nfsd_proc_mkdir, or possibly nfsd3_proc_create */ - fh_lock(fhp); + fh_lock_nested(fhp, I_MUTEX_PARENT); dchild = lookup_one_len(fname, dentry, flen); err = PTR_ERR(dchild); if (IS_ERR(dchild)) @@ -1238,7 +1240,7 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp, err = nfserr_notdir; if(!dirp->i_op || !dirp->i_op->lookup) goto out; - fh_lock(fhp); + fh_lock_nested(fhp, I_MUTEX_PARENT); /* * Compose the response file handle. @@ -1494,7 +1496,7 @@ nfsd_link(struct svc_rqst *rqstp, struct svc_fh *ffhp, if (isdotent(name, len)) goto out; - fh_lock(ffhp); + fh_lock_nested(ffhp, I_MUTEX_PARENT); ddir = ffhp->fh_dentry; dirp = ddir->d_inode; @@ -1519,14 +1521,15 @@ nfsd_link(struct svc_rqst *rqstp, struct svc_fh *ffhp, err = nfserrno(err); } - fh_unlock(ffhp); dput(dnew); +out_unlock: + fh_unlock(ffhp); out: return err; out_nfserr: err = nfserrno(err); - goto out; + goto out_unlock; } /* @@ -1555,7 +1558,7 @@ nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, char *fname, int flen, tdir = tdentry->d_inode; err = (rqstp->rq_vers == 2) ? nfserr_acces : nfserr_xdev; - if (fdir->i_sb != tdir->i_sb) + if (ffhp->fh_export != tfhp->fh_export) goto out; err = nfserr_perm; @@ -1643,7 +1646,7 @@ nfsd_unlink(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, if (err) goto out; - fh_lock(fhp); + fh_lock_nested(fhp, I_MUTEX_PARENT); dentry = fhp->fh_dentry; dirp = dentry->d_inode; @@ -1739,7 +1742,7 @@ int nfsd_statfs(struct svc_rqst *rqstp, struct svc_fh *fhp, struct kstatfs *stat) { int err = fh_verify(rqstp, fhp, 0, MAY_NOP); - if (!err && vfs_statfs(fhp->fh_dentry->d_inode->i_sb,stat)) + if (!err && vfs_statfs(fhp->fh_dentry,stat)) err = nfserr_io; return err; } diff --git a/fs/nls/nls_base.c b/fs/nls/nls_base.c index a912debcd..9de6b495f 100644 --- a/fs/nls/nls_base.c +++ b/fs/nls/nls_base.c @@ -10,7 +10,6 @@ #include #include -#include #include #include #include diff --git a/fs/ntfs/aops.c b/fs/ntfs/aops.c index 580412d33..bc579bfdf 100644 --- a/fs/ntfs/aops.c +++ b/fs/ntfs/aops.c @@ -1544,7 +1544,7 @@ err_out: /** * ntfs_aops - general address space operations for inodes and attributes */ -struct address_space_operations ntfs_aops = { +const struct address_space_operations ntfs_aops = { .readpage = ntfs_readpage, /* Fill page with data. */ .sync_page = block_sync_page, /* Currently, just unplugs the disk request queue. */ @@ -1560,7 +1560,7 @@ struct address_space_operations ntfs_aops = { * ntfs_mst_aops - general address space operations for mst protecteed inodes * and attributes */ -struct address_space_operations ntfs_mst_aops = { +const struct address_space_operations ntfs_mst_aops = { .readpage = ntfs_readpage, /* Fill page with data. */ .sync_page = block_sync_page, /* Currently, just unplugs the disk request queue. */ diff --git a/fs/ntfs/aops.h b/fs/ntfs/aops.h index 3b74e66ca..325ce261a 100644 --- a/fs/ntfs/aops.h +++ b/fs/ntfs/aops.h @@ -86,8 +86,7 @@ static inline void ntfs_unmap_page(struct page *page) static inline struct page *ntfs_map_page(struct address_space *mapping, unsigned long index) { - struct page *page = read_cache_page(mapping, index, - (filler_t*)mapping->a_ops->readpage, NULL); + struct page *page = read_mapping_page(mapping, index, NULL); if (!IS_ERR(page)) { wait_on_page_locked(page); diff --git a/fs/ntfs/attrib.c b/fs/ntfs/attrib.c index 1663f5c3c..6708e1d68 100644 --- a/fs/ntfs/attrib.c +++ b/fs/ntfs/attrib.c @@ -2529,8 +2529,7 @@ int ntfs_attr_set(ntfs_inode *ni, const s64 ofs, const s64 cnt, const u8 val) end >>= PAGE_CACHE_SHIFT; /* If there is a first partial page, need to do it the slow way. */ if (start_ofs) { - page = read_cache_page(mapping, idx, - (filler_t*)mapping->a_ops->readpage, NULL); + page = read_mapping_page(mapping, idx, NULL); if (IS_ERR(page)) { ntfs_error(vol->sb, "Failed to read first partial " "page (sync error, index 0x%lx).", idx); @@ -2600,8 +2599,7 @@ int ntfs_attr_set(ntfs_inode *ni, const s64 ofs, const s64 cnt, const u8 val) } /* If there is a last partial page, need to do it the slow way. */ if (end_ofs) { - page = read_cache_page(mapping, idx, - (filler_t*)mapping->a_ops->readpage, NULL); + page = read_mapping_page(mapping, idx, NULL); if (IS_ERR(page)) { ntfs_error(vol->sb, "Failed to read last partial page " "(sync error, index 0x%lx).", idx); diff --git a/fs/ntfs/file.c b/fs/ntfs/file.c index 36e1e136b..2e42c2dca 100644 --- a/fs/ntfs/file.c +++ b/fs/ntfs/file.c @@ -231,8 +231,7 @@ do_non_resident_extend: * Read the page. If the page is not present, this will zero * the uninitialized regions for us. */ - page = read_cache_page(mapping, index, - (filler_t*)mapping->a_ops->readpage, NULL); + page = read_mapping_page(mapping, index, NULL); if (IS_ERR(page)) { err = PTR_ERR(page); goto init_err_out; @@ -1359,7 +1358,7 @@ err_out: goto out; } -static size_t __ntfs_copy_from_user_iovec(char *vaddr, +static size_t __ntfs_copy_from_user_iovec_inatomic(char *vaddr, const struct iovec *iov, size_t iov_ofs, size_t bytes) { size_t total = 0; @@ -1377,10 +1376,6 @@ static size_t __ntfs_copy_from_user_iovec(char *vaddr, bytes -= len; vaddr += len; if (unlikely(left)) { - /* - * Zero the rest of the target like __copy_from_user(). - */ - memset(vaddr, 0, bytes); total -= left; break; } @@ -1421,11 +1416,13 @@ static inline void ntfs_set_next_iovec(const struct iovec **iovp, * pages (out to offset + bytes), to emulate ntfs_copy_from_user()'s * single-segment behaviour. * - * We call the same helper (__ntfs_copy_from_user_iovec()) both when atomic and - * when not atomic. This is ok because __ntfs_copy_from_user_iovec() calls - * __copy_from_user_inatomic() and it is ok to call this when non-atomic. In - * fact, the only difference between __copy_from_user_inatomic() and - * __copy_from_user() is that the latter calls might_sleep(). And on many + * We call the same helper (__ntfs_copy_from_user_iovec_inatomic()) both + * when atomic and when not atomic. This is ok because + * __ntfs_copy_from_user_iovec_inatomic() calls __copy_from_user_inatomic() + * and it is ok to call this when non-atomic. + * Infact, the only difference between __copy_from_user_inatomic() and + * __copy_from_user() is that the latter calls might_sleep() and the former + * should not zero the tail of the buffer on error. And on many * architectures __copy_from_user_inatomic() is just defined to * __copy_from_user() so it makes no difference at all on those architectures. */ @@ -1442,14 +1439,18 @@ static inline size_t ntfs_copy_from_user_iovec(struct page **pages, if (len > bytes) len = bytes; kaddr = kmap_atomic(*pages, KM_USER0); - copied = __ntfs_copy_from_user_iovec(kaddr + ofs, + copied = __ntfs_copy_from_user_iovec_inatomic(kaddr + ofs, *iov, *iov_ofs, len); kunmap_atomic(kaddr, KM_USER0); if (unlikely(copied != len)) { /* Do it the slow way. */ kaddr = kmap(*pages); - copied = __ntfs_copy_from_user_iovec(kaddr + ofs, + copied = __ntfs_copy_from_user_iovec_inatomic(kaddr + ofs, *iov, *iov_ofs, len); + /* + * Zero the rest of the target like __copy_from_user(). + */ + memset(kaddr + ofs + copied, 0, len - copied); kunmap(*pages); if (unlikely(copied != len)) goto err_out; diff --git a/fs/ntfs/inode.c b/fs/ntfs/inode.c index 4c86b7e1d..6d44ceabc 100644 --- a/fs/ntfs/inode.c +++ b/fs/ntfs/inode.c @@ -367,6 +367,12 @@ static void ntfs_destroy_extent_inode(ntfs_inode *ni) kmem_cache_free(ntfs_inode_cache, ni); } +/* + * The attribute runlist lock has separate locking rules from the + * normal runlist lock, so split the two lock-classes: + */ +static struct lock_class_key attr_list_rl_lock_class; + /** * __ntfs_init_inode - initialize ntfs specific part of an inode * @sb: super block of mounted volume @@ -394,6 +400,8 @@ void __ntfs_init_inode(struct super_block *sb, ntfs_inode *ni) ni->attr_list_size = 0; ni->attr_list = NULL; ntfs_init_runlist(&ni->attr_list_rl); + lockdep_set_class(&ni->attr_list_rl.lock, + &attr_list_rl_lock_class); ni->itype.index.bmp_ino = NULL; ni->itype.index.block_size = 0; ni->itype.index.vcn_size = 0; @@ -405,6 +413,13 @@ void __ntfs_init_inode(struct super_block *sb, ntfs_inode *ni) ni->ext.base_ntfs_ino = NULL; } +/* + * Extent inodes get MFT-mapped in a nested way, while the base inode + * is still mapped. Teach this nesting to the lock validator by creating + * a separate class for nested inode's mrec_lock's: + */ +static struct lock_class_key extent_inode_mrec_lock_key; + inline ntfs_inode *ntfs_new_extent_inode(struct super_block *sb, unsigned long mft_no) { @@ -413,6 +428,7 @@ inline ntfs_inode *ntfs_new_extent_inode(struct super_block *sb, ntfs_debug("Entering."); if (likely(ni != NULL)) { __ntfs_init_inode(sb, ni); + lockdep_set_class(&ni->mrec_lock, &extent_inode_mrec_lock_key); ni->mft_no = mft_no; ni->type = AT_UNUSED; ni->name = NULL; @@ -540,8 +556,6 @@ static int ntfs_read_locked_inode(struct inode *vi) /* Setup the generic vfs inode parts now. */ - /* This is the optimal IO size (for stat), not the fs block size. */ - vi->i_blksize = PAGE_CACHE_SIZE; /* * This is for checking whether an inode has changed w.r.t. a file so * that the file can be updated if necessary (compare with f_version). @@ -1218,7 +1232,6 @@ static int ntfs_read_locked_attr_inode(struct inode *base_vi, struct inode *vi) base_ni = NTFS_I(base_vi); /* Just mirror the values from the base inode. */ - vi->i_blksize = base_vi->i_blksize; vi->i_version = base_vi->i_version; vi->i_uid = base_vi->i_uid; vi->i_gid = base_vi->i_gid; @@ -1488,7 +1501,6 @@ static int ntfs_read_locked_index_inode(struct inode *base_vi, struct inode *vi) ni = NTFS_I(vi); base_ni = NTFS_I(base_vi); /* Just mirror the values from the base inode. */ - vi->i_blksize = base_vi->i_blksize; vi->i_version = base_vi->i_version; vi->i_uid = base_vi->i_uid; vi->i_gid = base_vi->i_gid; @@ -1722,6 +1734,15 @@ err_out: return err; } +/* + * The MFT inode has special locking, so teach the lock validator + * about this by splitting off the locking rules of the MFT from + * the locking rules of other inodes. The MFT inode can never be + * accessed from the VFS side (or even internally), only by the + * map_mft functions. + */ +static struct lock_class_key mft_ni_runlist_lock_key, mft_ni_mrec_lock_key; + /** * ntfs_read_inode_mount - special read_inode for mount time use only * @vi: inode to read @@ -2148,6 +2169,14 @@ int ntfs_read_inode_mount(struct inode *vi) ntfs_attr_put_search_ctx(ctx); ntfs_debug("Done."); ntfs_free(m); + + /* + * Split the locking rules of the MFT inode from the + * locking rules of other inodes: + */ + lockdep_set_class(&ni->runlist.lock, &mft_ni_runlist_lock_key); + lockdep_set_class(&ni->mrec_lock, &mft_ni_mrec_lock_key); + return 0; em_put_err_out: diff --git a/fs/ntfs/mft.c b/fs/ntfs/mft.c index 2438c00ec..abce25836 100644 --- a/fs/ntfs/mft.c +++ b/fs/ntfs/mft.c @@ -2637,11 +2637,6 @@ mft_rec_already_initialized: goto undo_mftbmp_alloc; } vi->i_ino = bit; - /* - * This is the optimal IO size (for stat), not the fs block - * size. - */ - vi->i_blksize = PAGE_CACHE_SIZE; /* * This is for checking whether an inode has changed w.r.t. a * file so that the file can be updated if necessary (compare diff --git a/fs/ntfs/ntfs.h b/fs/ntfs/ntfs.h index bf7b3d7c0..ddd3d5030 100644 --- a/fs/ntfs/ntfs.h +++ b/fs/ntfs/ntfs.h @@ -57,8 +57,8 @@ extern struct kmem_cache *ntfs_attr_ctx_cache; extern struct kmem_cache *ntfs_index_ctx_cache; /* The various operations structs defined throughout the driver files. */ -extern struct address_space_operations ntfs_aops; -extern struct address_space_operations ntfs_mst_aops; +extern const struct address_space_operations ntfs_aops; +extern const struct address_space_operations ntfs_mst_aops; extern const struct file_operations ntfs_file_ops; extern struct inode_operations ntfs_file_inode_ops; diff --git a/fs/ntfs/super.c b/fs/ntfs/super.c index 27833f6df..74e0ee8fc 100644 --- a/fs/ntfs/super.c +++ b/fs/ntfs/super.c @@ -1724,6 +1724,14 @@ upcase_failed: return FALSE; } +/* + * The lcn and mft bitmap inodes are NTFS-internal inodes with + * their own special locking rules: + */ +static struct lock_class_key + lcnbmp_runlist_lock_key, lcnbmp_mrec_lock_key, + mftbmp_runlist_lock_key, mftbmp_mrec_lock_key; + /** * load_system_files - open the system files using normal functions * @vol: ntfs super block describing device whose system files to load @@ -1780,6 +1788,10 @@ static BOOL load_system_files(ntfs_volume *vol) ntfs_error(sb, "Failed to load $MFT/$BITMAP attribute."); goto iput_mirr_err_out; } + lockdep_set_class(&NTFS_I(vol->mftbmp_ino)->runlist.lock, + &mftbmp_runlist_lock_key); + lockdep_set_class(&NTFS_I(vol->mftbmp_ino)->mrec_lock, + &mftbmp_mrec_lock_key); /* Read upcase table and setup @vol->upcase and @vol->upcase_len. */ if (!load_and_init_upcase(vol)) goto iput_mftbmp_err_out; @@ -1802,6 +1814,11 @@ static BOOL load_system_files(ntfs_volume *vol) iput(vol->lcnbmp_ino); goto bitmap_failed; } + lockdep_set_class(&NTFS_I(vol->lcnbmp_ino)->runlist.lock, + &lcnbmp_runlist_lock_key); + lockdep_set_class(&NTFS_I(vol->lcnbmp_ino)->mrec_lock, + &lcnbmp_mrec_lock_key); + NInoSetSparseDisabled(NTFS_I(vol->lcnbmp_ino)); if ((vol->nr_clusters + 7) >> 3 > i_size_read(vol->lcnbmp_ino)) { iput(vol->lcnbmp_ino); @@ -2601,10 +2618,10 @@ static unsigned long __get_nr_free_mft_records(ntfs_volume *vol, /** * ntfs_statfs - return information about mounted NTFS volume - * @sb: super block of mounted volume + * @dentry: dentry from mounted volume * @sfs: statfs structure in which to return the information * - * Return information about the mounted NTFS volume @sb in the statfs structure + * Return information about the mounted NTFS volume @dentry in the statfs structure * pointed to by @sfs (this is initialized with zeros before ntfs_statfs is * called). We interpret the values to be correct of the moment in time at * which we are called. Most values are variable otherwise and this isn't just @@ -2617,8 +2634,9 @@ static unsigned long __get_nr_free_mft_records(ntfs_volume *vol, * * Return 0 on success or -errno on error. */ -static int ntfs_statfs(struct super_block *sb, struct kstatfs *sfs) +static int ntfs_statfs(struct dentry *dentry, struct kstatfs *sfs) { + struct super_block *sb = dentry->d_sb; s64 size; ntfs_volume *vol = NTFS_SB(sb); ntfs_inode *mft_ni = NTFS_I(vol->mft_ino); @@ -2742,6 +2760,17 @@ static int ntfs_fill_super(struct super_block *sb, void *opt, const int silent) struct inode *tmp_ino; int blocksize, result; + /* + * We do a pretty difficult piece of bootstrap by reading the + * MFT (and other metadata) from disk into memory. We'll only + * release this metadata during umount, so the locking patterns + * observed during bootstrap do not count. So turn off the + * observation of locking patterns (strictly for this context + * only) while mounting NTFS. [The validator is still active + * otherwise, even for this context: it will for example record + * lock class registrations.] + */ + lockdep_off(); ntfs_debug("Entering."); #ifndef NTFS_RW sb->s_flags |= MS_RDONLY; @@ -2753,6 +2782,7 @@ static int ntfs_fill_super(struct super_block *sb, void *opt, const int silent) if (!silent) ntfs_error(sb, "Allocation of NTFS volume structure " "failed. Aborting mount..."); + lockdep_on(); return -ENOMEM; } /* Initialize ntfs_volume structure. */ @@ -2939,6 +2969,7 @@ static int ntfs_fill_super(struct super_block *sb, void *opt, const int silent) mutex_unlock(&ntfs_lock); sb->s_export_op = &ntfs_export_ops; lock_kernel(); + lockdep_on(); return 0; } ntfs_error(sb, "Failed to allocate root directory."); @@ -3058,6 +3089,7 @@ err_out_now: sb->s_fs_info = NULL; kfree(vol); ntfs_debug("Failed, returning -EINVAL."); + lockdep_on(); return -EINVAL; } @@ -3093,10 +3125,11 @@ struct kmem_cache *ntfs_index_ctx_cache; /* Driver wide mutex. */ DEFINE_MUTEX(ntfs_lock); -static struct super_block *ntfs_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int ntfs_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_bdev(fs_type, flags, dev_name, data, ntfs_fill_super); + return get_sb_bdev(fs_type, flags, dev_name, data, ntfs_fill_super, + mnt); } static struct file_system_type ntfs_fs_type = { diff --git a/fs/ntfs/sysctl.h b/fs/ntfs/sysctl.h index c8064cae8..beda5bf96 100644 --- a/fs/ntfs/sysctl.h +++ b/fs/ntfs/sysctl.h @@ -24,7 +24,6 @@ #ifndef _LINUX_NTFS_SYSCTL_H #define _LINUX_NTFS_SYSCTL_H -#include #if defined(DEBUG) && defined(CONFIG_SYSCTL) diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 47152bf9a..f1d1c342c 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c @@ -558,16 +558,9 @@ static int ocfs2_direct_IO_get_blocks(struct inode *inode, sector_t iblock, u64 vbo_max; /* file offset, max_blocks from iblock */ u64 p_blkno; int contig_blocks; - unsigned char blocksize_bits; + unsigned char blocksize_bits = inode->i_sb->s_blocksize_bits; unsigned long max_blocks = bh_result->b_size >> inode->i_blkbits; - if (!inode || !bh_result) { - mlog(ML_ERROR, "inode or bh_result is null\n"); - return -EIO; - } - - blocksize_bits = inode->i_sb->s_blocksize_bits; - /* This function won't even be called if the request isn't all * nicely aligned and of the right size, so there's no need * for us to check any of that. */ @@ -666,7 +659,7 @@ out: return ret; } -struct address_space_operations ocfs2_aops = { +const struct address_space_operations ocfs2_aops = { .readpage = ocfs2_readpage, .writepage = ocfs2_writepage, .prepare_write = ocfs2_prepare_write, diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c index 21f38accd..504595d6c 100644 --- a/fs/ocfs2/cluster/heartbeat.c +++ b/fs/ocfs2/cluster/heartbeat.c @@ -54,7 +54,7 @@ static DECLARE_RWSEM(o2hb_callback_sem); * multiple hb threads are watching multiple regions. A node is live * whenever any of the threads sees activity from the node in its region. */ -static spinlock_t o2hb_live_lock = SPIN_LOCK_UNLOCKED; +static DEFINE_SPINLOCK(o2hb_live_lock); static struct list_head o2hb_live_slots[O2NM_MAX_NODES]; static unsigned long o2hb_live_node_bitmap[BITS_TO_LONGS(O2NM_MAX_NODES)]; static LIST_HEAD(o2hb_node_events); @@ -517,6 +517,7 @@ static inline void o2hb_prepare_block(struct o2hb_region *reg, hb_block->hb_seq = cpu_to_le64(cputime); hb_block->hb_node = node_num; hb_block->hb_generation = cpu_to_le64(generation); + hb_block->hb_dead_ms = cpu_to_le32(o2hb_dead_threshold * O2HB_REGION_TIMEOUT_MS); /* This step must always happen last! */ hb_block->hb_cksum = cpu_to_le32(o2hb_compute_block_crc_le(reg, @@ -645,6 +646,8 @@ static int o2hb_check_slot(struct o2hb_region *reg, struct o2nm_node *node; struct o2hb_disk_heartbeat_block *hb_block = reg->hr_tmp_block; u64 cputime; + unsigned int dead_ms = o2hb_dead_threshold * O2HB_REGION_TIMEOUT_MS; + unsigned int slot_dead_ms; memcpy(hb_block, slot->ds_raw_block, reg->hr_block_bytes); @@ -733,6 +736,23 @@ fire_callbacks: &o2hb_live_slots[slot->ds_node_num]); slot->ds_equal_samples = 0; + + /* We want to be sure that all nodes agree on the + * number of milliseconds before a node will be + * considered dead. The self-fencing timeout is + * computed from this value, and a discrepancy might + * result in heartbeat calling a node dead when it + * hasn't self-fenced yet. */ + slot_dead_ms = le32_to_cpu(hb_block->hb_dead_ms); + if (slot_dead_ms && slot_dead_ms != dead_ms) { + /* TODO: Perhaps we can fail the region here. */ + mlog(ML_ERROR, "Node %d on device %s has a dead count " + "of %u ms, but our count is %u ms.\n" + "Please double check your configuration values " + "for 'O2CB_HEARTBEAT_THRESHOLD'\n", + slot->ds_node_num, reg->hr_dev_name, slot_dead_ms, + dead_ms); + } goto out; } diff --git a/fs/ocfs2/cluster/masklog.h b/fs/ocfs2/cluster/masklog.h index 73edad782..a42628ba9 100644 --- a/fs/ocfs2/cluster/masklog.h +++ b/fs/ocfs2/cluster/masklog.h @@ -123,6 +123,17 @@ #define MLOG_MASK_PREFIX 0 #endif +/* + * When logging is disabled, force the bit test to 0 for anything other + * than errors and notices, allowing gcc to remove the code completely. + * When enabled, allow all masks. + */ +#if defined(CONFIG_OCFS2_DEBUG_MASKLOG) +#define ML_ALLOWED_BITS ~0 +#else +#define ML_ALLOWED_BITS (ML_ERROR|ML_NOTICE) +#endif + #define MLOG_MAX_BITS 64 struct mlog_bits { @@ -187,7 +198,8 @@ extern struct mlog_bits mlog_and_bits, mlog_not_bits; #define mlog(mask, fmt, args...) do { \ u64 __m = MLOG_MASK_PREFIX | (mask); \ - if (__mlog_test_u64(__m, mlog_and_bits) && \ + if ((__m & ML_ALLOWED_BITS) && \ + __mlog_test_u64(__m, mlog_and_bits) && \ !__mlog_test_u64(__m, mlog_not_bits)) { \ if (__m & ML_ERROR) \ __mlog_printk(KERN_ERR, "ERROR: "fmt , ##args); \ @@ -204,6 +216,7 @@ extern struct mlog_bits mlog_and_bits, mlog_not_bits; mlog(ML_ERROR, "status = %lld\n", (long long)_st); \ } while (0) +#if defined(CONFIG_OCFS2_DEBUG_MASKLOG) #define mlog_entry(fmt, args...) do { \ mlog(ML_ENTRY, "ENTRY:" fmt , ##args); \ } while (0) @@ -247,6 +260,13 @@ extern struct mlog_bits mlog_and_bits, mlog_not_bits; #define mlog_exit_void() do { \ mlog(ML_EXIT, "EXIT\n"); \ } while (0) +#else +#define mlog_entry(...) do { } while (0) +#define mlog_entry_void(...) do { } while (0) +#define mlog_exit(...) do { } while (0) +#define mlog_exit_ptr(...) do { } while (0) +#define mlog_exit_void(...) do { } while (0) +#endif /* defined(CONFIG_OCFS2_DEBUG_MASKLOG) */ #define mlog_bug_on_msg(cond, fmt, args...) do { \ if (cond) { \ diff --git a/fs/ocfs2/cluster/ocfs2_heartbeat.h b/fs/ocfs2/cluster/ocfs2_heartbeat.h index 94096069c..3f4151da9 100644 --- a/fs/ocfs2/cluster/ocfs2_heartbeat.h +++ b/fs/ocfs2/cluster/ocfs2_heartbeat.h @@ -32,6 +32,7 @@ struct o2hb_disk_heartbeat_block { __u8 hb_pad1[3]; __le32 hb_cksum; __le64 hb_generation; + __le32 hb_dead_ms; }; #endif /* _OCFS2_HEARTBEAT_H */ diff --git a/fs/ocfs2/cluster/tcp.c b/fs/ocfs2/cluster/tcp.c index 0f60cc0d3..b650efa8c 100644 --- a/fs/ocfs2/cluster/tcp.c +++ b/fs/ocfs2/cluster/tcp.c @@ -108,7 +108,7 @@ ##args); \ } while (0) -static rwlock_t o2net_handler_lock = RW_LOCK_UNLOCKED; +static DEFINE_RWLOCK(o2net_handler_lock); static struct rb_root o2net_handler_tree = RB_ROOT; static struct o2net_node o2net_nodes[O2NM_MAX_NODES]; @@ -396,8 +396,8 @@ static void o2net_set_nn_state(struct o2net_node *nn, } if (was_valid && !valid) { - mlog(ML_NOTICE, "no longer connected to " SC_NODEF_FMT "\n", - SC_NODEF_ARGS(old_sc)); + printk(KERN_INFO "o2net: no longer connected to " + SC_NODEF_FMT "\n", SC_NODEF_ARGS(old_sc)); o2net_complete_nodes_nsw(nn); } @@ -409,10 +409,10 @@ static void o2net_set_nn_state(struct o2net_node *nn, * the only way to start connecting again is to down * heartbeat and bring it back up. */ cancel_delayed_work(&nn->nn_connect_expired); - mlog(ML_NOTICE, "%s " SC_NODEF_FMT "\n", - o2nm_this_node() > sc->sc_node->nd_num ? - "connected to" : "accepted connection from", - SC_NODEF_ARGS(sc)); + printk(KERN_INFO "o2net: %s " SC_NODEF_FMT "\n", + o2nm_this_node() > sc->sc_node->nd_num ? + "connected to" : "accepted connection from", + SC_NODEF_ARGS(sc)); } /* trigger the connecting worker func as long as we're not valid, @@ -1280,7 +1280,7 @@ static void o2net_idle_timer(unsigned long data) do_gettimeofday(&now); - mlog(ML_NOTICE, "connection to " SC_NODEF_FMT " has been idle for 10 " + printk(KERN_INFO "o2net: connection to " SC_NODEF_FMT " has been idle for 10 " "seconds, shutting it down.\n", SC_NODEF_ARGS(sc)); mlog(ML_NOTICE, "here are some times that might help debug the " "situation: (tmr %ld.%ld now %ld.%ld dr %ld.%ld adv " diff --git a/fs/ocfs2/dir.c b/fs/ocfs2/dir.c index ae47f4507..3d494d1a5 100644 --- a/fs/ocfs2/dir.c +++ b/fs/ocfs2/dir.c @@ -213,11 +213,9 @@ int ocfs2_find_files_on_disk(const char *name, struct ocfs2_dir_entry **dirent) { int status = -ENOENT; - struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); - mlog_entry("(osb=%p, parent=%llu, name='%.*s', blkno=%p, inode=%p)\n", - osb, (unsigned long long)OCFS2_I(inode)->ip_blkno, - namelen, name, blkno, inode); + mlog_entry("(name=%.*s, blkno=%p, inode=%p, dirent_bh=%p, dirent=%p)\n", + namelen, name, blkno, inode, dirent_bh, dirent); *dirent_bh = ocfs2_find_entry(name, namelen, inode, dirent); if (!*dirent_bh || !*dirent) { diff --git a/fs/ocfs2/dlm/dlmast.c b/fs/ocfs2/dlm/dlmast.c index 355593dd8..42775e2bb 100644 --- a/fs/ocfs2/dlm/dlmast.c +++ b/fs/ocfs2/dlm/dlmast.c @@ -197,12 +197,14 @@ static void dlm_update_lvb(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, lock->ml.node == dlm->node_num ? "master" : "remote"); memcpy(lksb->lvb, res->lvb, DLM_LVB_LEN); - } else if (lksb->flags & DLM_LKSB_PUT_LVB) { - mlog(0, "setting lvb from lockres for %s node\n", - lock->ml.node == dlm->node_num ? "master" : - "remote"); - memcpy(res->lvb, lksb->lvb, DLM_LVB_LEN); } + /* Do nothing for lvb put requests - they should be done in + * place when the lock is downconverted - otherwise we risk + * racing gets and puts which could result in old lvb data + * being propagated. We leave the put flag set and clear it + * here. In the future we might want to clear it at the time + * the put is actually done. + */ spin_unlock(&res->spinlock); } @@ -381,8 +383,7 @@ do_ast: ret = DLM_NORMAL; if (past->type == DLM_AST) { /* do not alter lock refcount. switching lists. */ - list_del_init(&lock->list); - list_add_tail(&lock->list, &res->granted); + list_move_tail(&lock->list, &res->granted); mlog(0, "ast: adding to granted list... type=%d, " "convert_type=%d\n", lock->ml.type, lock->ml.convert_type); if (lock->ml.convert_type != LKM_IVMODE) { diff --git a/fs/ocfs2/dlm/dlmcommon.h b/fs/ocfs2/dlm/dlmcommon.h index 88cc43df1..14530ee7e 100644 --- a/fs/ocfs2/dlm/dlmcommon.h +++ b/fs/ocfs2/dlm/dlmcommon.h @@ -37,7 +37,17 @@ #define DLM_THREAD_SHUFFLE_INTERVAL 5 // flush everything every 5 passes #define DLM_THREAD_MS 200 // flush at least every 200 ms -#define DLM_HASH_BUCKETS (PAGE_SIZE / sizeof(struct hlist_head)) +#define DLM_HASH_SIZE_DEFAULT (1 << 14) +#if DLM_HASH_SIZE_DEFAULT < PAGE_SIZE +# define DLM_HASH_PAGES 1 +#else +# define DLM_HASH_PAGES (DLM_HASH_SIZE_DEFAULT / PAGE_SIZE) +#endif +#define DLM_BUCKETS_PER_PAGE (PAGE_SIZE / sizeof(struct hlist_head)) +#define DLM_HASH_BUCKETS (DLM_HASH_PAGES * DLM_BUCKETS_PER_PAGE) + +/* Intended to make it easier for us to switch out hash functions */ +#define dlm_lockid_hash(_n, _l) full_name_hash(_n, _l) enum dlm_ast_type { DLM_AST = 0, @@ -61,7 +71,8 @@ static inline int dlm_is_recovery_lock(const char *lock_name, int name_len) return 0; } -#define DLM_RECO_STATE_ACTIVE 0x0001 +#define DLM_RECO_STATE_ACTIVE 0x0001 +#define DLM_RECO_STATE_FINALIZE 0x0002 struct dlm_recovery_ctxt { @@ -85,7 +96,7 @@ enum dlm_ctxt_state { struct dlm_ctxt { struct list_head list; - struct hlist_head *lockres_hash; + struct hlist_head **lockres_hash; struct list_head dirty_list; struct list_head purge_list; struct list_head pending_asts; @@ -120,6 +131,7 @@ struct dlm_ctxt struct o2hb_callback_func dlm_hb_down; struct task_struct *dlm_thread_task; struct task_struct *dlm_reco_thread_task; + struct workqueue_struct *dlm_worker; wait_queue_head_t dlm_thread_wq; wait_queue_head_t dlm_reco_thread_wq; wait_queue_head_t ast_wq; @@ -132,6 +144,11 @@ struct dlm_ctxt struct list_head dlm_eviction_callbacks; }; +static inline struct hlist_head *dlm_lockres_hash(struct dlm_ctxt *dlm, unsigned i) +{ + return dlm->lockres_hash[(i / DLM_BUCKETS_PER_PAGE) % DLM_HASH_PAGES] + (i % DLM_BUCKETS_PER_PAGE); +} + /* these keventd work queue items are for less-frequently * called functions that cannot be directly called from the * net message handlers for some reason, usually because @@ -216,20 +233,29 @@ struct dlm_lock_resource /* WARNING: Please see the comment in dlm_init_lockres before * adding fields here. */ struct hlist_node hash_node; + struct qstr lockname; struct kref refs; - /* please keep these next 3 in this order - * some funcs want to iterate over all lists */ + /* + * Please keep granted, converting, and blocked in this order, + * as some funcs want to iterate over all lists. + * + * All four lists are protected by the hash's reference. + */ struct list_head granted; struct list_head converting; struct list_head blocked; + struct list_head purge; + /* + * These two lists require you to hold an additional reference + * while they are on the list. + */ struct list_head dirty; struct list_head recovering; // dlm_recovery_ctxt.resources list /* unused lock resources have their last_used stamped and are * put on a list for the dlm thread to run. */ - struct list_head purge; unsigned long last_used; unsigned migration_pending:1; @@ -238,7 +264,6 @@ struct dlm_lock_resource wait_queue_head_t wq; u8 owner; //node which owns the lock resource, or unknown u16 state; - struct qstr lockname; char lvb[DLM_LVB_LEN]; }; @@ -300,6 +325,15 @@ enum dlm_lockres_list { DLM_BLOCKED_LIST }; +static inline int dlm_lvb_is_empty(char *lvb) +{ + int i; + for (i=0; irefs); +} void dlm_lockres_put(struct dlm_lock_resource *res); void __dlm_unhash_lockres(struct dlm_lock_resource *res); void __dlm_insert_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res); struct dlm_lock_resource * __dlm_lookup_lockres(struct dlm_ctxt *dlm, const char *name, - unsigned int len); + unsigned int len, + unsigned int hash); struct dlm_lock_resource * dlm_lookup_lockres(struct dlm_ctxt *dlm, const char *name, unsigned int len); @@ -780,8 +822,6 @@ int dlm_begin_reco_handler(struct o2net_msg *msg, u32 len, void *data); int dlm_finalize_reco_handler(struct o2net_msg *msg, u32 len, void *data); int dlm_do_master_requery(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, u8 nodenum, u8 *real_master); -int dlm_lockres_master_requery(struct dlm_ctxt *dlm, - struct dlm_lock_resource *res, u8 *real_master); int dlm_dispatch_assert_master(struct dlm_ctxt *dlm, @@ -819,6 +859,7 @@ void dlm_clean_master_list(struct dlm_ctxt *dlm, u8 dead_node); int dlm_lock_basts_flushed(struct dlm_ctxt *dlm, struct dlm_lock *lock); +int __dlm_lockres_unused(struct dlm_lock_resource *res); static inline const char * dlm_lock_mode_name(int mode) { diff --git a/fs/ocfs2/dlm/dlmconvert.c b/fs/ocfs2/dlm/dlmconvert.c index 8285228d9..c764dc8e4 100644 --- a/fs/ocfs2/dlm/dlmconvert.c +++ b/fs/ocfs2/dlm/dlmconvert.c @@ -214,6 +214,9 @@ grant: if (lock->ml.node == dlm->node_num) mlog(0, "doing in-place convert for nonlocal lock\n"); lock->ml.type = type; + if (lock->lksb->flags & DLM_LKSB_PUT_LVB) + memcpy(res->lvb, lock->lksb->lvb, DLM_LVB_LEN); + status = DLM_NORMAL; *call_ast = 1; goto unlock_exit; @@ -231,8 +234,7 @@ switch_queues: lock->ml.convert_type = type; /* do not alter lock refcount. switching lists. */ - list_del_init(&lock->list); - list_add_tail(&lock->list, &res->converting); + list_move_tail(&lock->list, &res->converting); unlock_exit: spin_unlock(&lock->spinlock); @@ -248,8 +250,7 @@ void dlm_revert_pending_convert(struct dlm_lock_resource *res, struct dlm_lock *lock) { /* do not alter lock refcount. switching lists. */ - list_del_init(&lock->list); - list_add_tail(&lock->list, &res->granted); + list_move_tail(&lock->list, &res->granted); lock->ml.convert_type = LKM_IVMODE; lock->lksb->flags &= ~(DLM_LKSB_GET_LVB|DLM_LKSB_PUT_LVB); } @@ -294,8 +295,7 @@ enum dlm_status dlmconvert_remote(struct dlm_ctxt *dlm, res->state |= DLM_LOCK_RES_IN_PROGRESS; /* move lock to local convert queue */ /* do not alter lock refcount. switching lists. */ - list_del_init(&lock->list); - list_add_tail(&lock->list, &res->converting); + list_move_tail(&lock->list, &res->converting); lock->convert_pending = 1; lock->ml.convert_type = type; @@ -464,6 +464,12 @@ int dlm_convert_lock_handler(struct o2net_msg *msg, u32 len, void *data) } spin_lock(&res->spinlock); + status = __dlm_lockres_state_to_status(res); + if (status != DLM_NORMAL) { + spin_unlock(&res->spinlock); + dlm_error(status); + goto leave; + } list_for_each(iter, &res->granted) { lock = list_entry(iter, struct dlm_lock, list); if (lock->ml.cookie == cnv->cookie && @@ -473,6 +479,21 @@ int dlm_convert_lock_handler(struct o2net_msg *msg, u32 len, void *data) } lock = NULL; } + if (!lock) { + __dlm_print_one_lock_resource(res); + list_for_each(iter, &res->granted) { + lock = list_entry(iter, struct dlm_lock, list); + if (lock->ml.node == cnv->node_idx) { + mlog(ML_ERROR, "There is something here " + "for node %u, lock->ml.cookie=%llu, " + "cnv->cookie=%llu\n", cnv->node_idx, + (unsigned long long)lock->ml.cookie, + (unsigned long long)cnv->cookie); + break; + } + } + lock = NULL; + } spin_unlock(&res->spinlock); if (!lock) { status = DLM_IVLOCKID; diff --git a/fs/ocfs2/dlm/dlmdebug.c b/fs/ocfs2/dlm/dlmdebug.c index c7eae5d33..3f6c8d88f 100644 --- a/fs/ocfs2/dlm/dlmdebug.c +++ b/fs/ocfs2/dlm/dlmdebug.c @@ -37,10 +37,8 @@ #include "dlmapi.h" #include "dlmcommon.h" -#include "dlmdebug.h" #include "dlmdomain.h" -#include "dlmdebug.h" #define MLOG_MASK_PREFIX ML_DLM #include "cluster/masklog.h" @@ -120,6 +118,7 @@ void dlm_print_one_lock(struct dlm_lock *lockid) } EXPORT_SYMBOL_GPL(dlm_print_one_lock); +#if 0 void dlm_dump_lock_resources(struct dlm_ctxt *dlm) { struct dlm_lock_resource *res; @@ -136,12 +135,13 @@ void dlm_dump_lock_resources(struct dlm_ctxt *dlm) spin_lock(&dlm->spinlock); for (i=0; ilockres_hash[i]); + bucket = dlm_lockres_hash(dlm, i); hlist_for_each_entry(res, iter, bucket, hash_node) dlm_print_one_lock_resource(res); } spin_unlock(&dlm->spinlock); } +#endif /* 0 */ static const char *dlm_errnames[] = { [DLM_NORMAL] = "DLM_NORMAL", diff --git a/fs/ocfs2/dlm/dlmdebug.h b/fs/ocfs2/dlm/dlmdebug.h deleted file mode 100644 index 6858510c3..000000000 --- a/fs/ocfs2/dlm/dlmdebug.h +++ /dev/null @@ -1,30 +0,0 @@ -/* -*- mode: c; c-basic-offset: 8; -*- - * vim: noexpandtab sw=8 ts=8 sts=0: - * - * dlmdebug.h - * - * Copyright (C) 2004 Oracle. 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 021110-1307, USA. - * - */ - -#ifndef DLMDEBUG_H -#define DLMDEBUG_H - -void dlm_dump_lock_resources(struct dlm_ctxt *dlm); - -#endif diff --git a/fs/ocfs2/dlm/dlmdomain.c b/fs/ocfs2/dlm/dlmdomain.c index 8f3a9e310..8d1065f8b 100644 --- a/fs/ocfs2/dlm/dlmdomain.c +++ b/fs/ocfs2/dlm/dlmdomain.c @@ -41,7 +41,6 @@ #include "dlmapi.h" #include "dlmcommon.h" -#include "dlmdebug.h" #include "dlmdomain.h" #include "dlmver.h" @@ -49,6 +48,33 @@ #define MLOG_MASK_PREFIX (ML_DLM|ML_DLM_DOMAIN) #include "cluster/masklog.h" +static void dlm_free_pagevec(void **vec, int pages) +{ + while (pages--) + free_page((unsigned long)vec[pages]); + kfree(vec); +} + +static void **dlm_alloc_pagevec(int pages) +{ + void **vec = kmalloc(pages * sizeof(void *), GFP_KERNEL); + int i; + + if (!vec) + return NULL; + + for (i = 0; i < pages; i++) + if (!(vec[i] = (void *)__get_free_page(GFP_KERNEL))) + goto out_free; + + mlog(0, "Allocated DLM hash pagevec; %d pages (%lu expected), %lu buckets per page\n", + pages, DLM_HASH_PAGES, (unsigned long)DLM_BUCKETS_PER_PAGE); + return vec; +out_free: + dlm_free_pagevec(vec, i); + return NULL; +} + /* * * spinlock lock ordering: if multiple locks are needed, obey this ordering: @@ -62,7 +88,7 @@ * */ -spinlock_t dlm_domain_lock = SPIN_LOCK_UNLOCKED; +DEFINE_SPINLOCK(dlm_domain_lock); LIST_HEAD(dlm_domains); static DECLARE_WAIT_QUEUE_HEAD(dlm_domain_events); @@ -90,8 +116,7 @@ void __dlm_insert_lockres(struct dlm_ctxt *dlm, assert_spin_locked(&dlm->spinlock); q = &res->lockname; - q->hash = full_name_hash(q->name, q->len); - bucket = &(dlm->lockres_hash[q->hash % DLM_HASH_BUCKETS]); + bucket = dlm_lockres_hash(dlm, q->hash); /* get a reference for our hashtable */ dlm_lockres_get(res); @@ -100,34 +125,32 @@ void __dlm_insert_lockres(struct dlm_ctxt *dlm, } struct dlm_lock_resource * __dlm_lookup_lockres(struct dlm_ctxt *dlm, - const char *name, - unsigned int len) + const char *name, + unsigned int len, + unsigned int hash) { - unsigned int hash; - struct hlist_node *iter; - struct dlm_lock_resource *tmpres=NULL; struct hlist_head *bucket; + struct hlist_node *list; mlog_entry("%.*s\n", len, name); assert_spin_locked(&dlm->spinlock); - hash = full_name_hash(name, len); - - bucket = &(dlm->lockres_hash[hash % DLM_HASH_BUCKETS]); - - /* check for pre-existing lock */ - hlist_for_each(iter, bucket) { - tmpres = hlist_entry(iter, struct dlm_lock_resource, hash_node); - if (tmpres->lockname.len == len && - memcmp(tmpres->lockname.name, name, len) == 0) { - dlm_lockres_get(tmpres); - break; - } + bucket = dlm_lockres_hash(dlm, hash); - tmpres = NULL; + hlist_for_each(list, bucket) { + struct dlm_lock_resource *res = hlist_entry(list, + struct dlm_lock_resource, hash_node); + if (res->lockname.name[0] != name[0]) + continue; + if (unlikely(res->lockname.len != len)) + continue; + if (memcmp(res->lockname.name + 1, name + 1, len - 1)) + continue; + dlm_lockres_get(res); + return res; } - return tmpres; + return NULL; } struct dlm_lock_resource * dlm_lookup_lockres(struct dlm_ctxt *dlm, @@ -135,9 +158,10 @@ struct dlm_lock_resource * dlm_lookup_lockres(struct dlm_ctxt *dlm, unsigned int len) { struct dlm_lock_resource *res; + unsigned int hash = dlm_lockid_hash(name, len); spin_lock(&dlm->spinlock); - res = __dlm_lookup_lockres(dlm, name, len); + res = __dlm_lookup_lockres(dlm, name, len, hash); spin_unlock(&dlm->spinlock); return res; } @@ -194,7 +218,7 @@ static int dlm_wait_on_domain_helper(const char *domain) static void dlm_free_ctxt_mem(struct dlm_ctxt *dlm) { if (dlm->lockres_hash) - free_page((unsigned long) dlm->lockres_hash); + dlm_free_pagevec((void **)dlm->lockres_hash, DLM_HASH_PAGES); if (dlm->name) kfree(dlm->name); @@ -278,11 +302,21 @@ int dlm_domain_fully_joined(struct dlm_ctxt *dlm) return ret; } +static void dlm_destroy_dlm_worker(struct dlm_ctxt *dlm) +{ + if (dlm->dlm_worker) { + flush_workqueue(dlm->dlm_worker); + destroy_workqueue(dlm->dlm_worker); + dlm->dlm_worker = NULL; + } +} + static void dlm_complete_dlm_shutdown(struct dlm_ctxt *dlm) { dlm_unregister_domain_handlers(dlm); dlm_complete_thread(dlm); dlm_complete_recovery_thread(dlm); + dlm_destroy_dlm_worker(dlm); /* We've left the domain. Now we can take ourselves out of the * list and allow the kref stuff to help us free the @@ -304,8 +338,8 @@ static void dlm_migrate_all_locks(struct dlm_ctxt *dlm) restart: spin_lock(&dlm->spinlock); for (i = 0; i < DLM_HASH_BUCKETS; i++) { - while (!hlist_empty(&dlm->lockres_hash[i])) { - res = hlist_entry(dlm->lockres_hash[i].first, + while (!hlist_empty(dlm_lockres_hash(dlm, i))) { + res = hlist_entry(dlm_lockres_hash(dlm, i)->first, struct dlm_lock_resource, hash_node); /* need reference when manually grabbing lockres */ dlm_lockres_get(res); @@ -374,12 +408,13 @@ static void __dlm_print_nodes(struct dlm_ctxt *dlm) assert_spin_locked(&dlm->spinlock); - mlog(ML_NOTICE, "Nodes in my domain (\"%s\"):\n", dlm->name); + printk(KERN_INFO "ocfs2_dlm: Nodes in domain (\"%s\"): ", dlm->name); while ((node = find_next_bit(dlm->domain_map, O2NM_MAX_NODES, node + 1)) < O2NM_MAX_NODES) { - mlog(ML_NOTICE, " node %d\n", node); + printk("%d ", node); } + printk("\n"); } static int dlm_exit_domain_handler(struct o2net_msg *msg, u32 len, void *data) @@ -395,7 +430,7 @@ static int dlm_exit_domain_handler(struct o2net_msg *msg, u32 len, void *data) node = exit_msg->node_idx; - mlog(0, "Node %u leaves domain %s\n", node, dlm->name); + printk(KERN_INFO "ocfs2_dlm: Node %u leaves domain %s\n", node, dlm->name); spin_lock(&dlm->spinlock); clear_bit(node, dlm->domain_map); @@ -644,6 +679,8 @@ static int dlm_assert_joined_handler(struct o2net_msg *msg, u32 len, void *data) set_bit(assert->node_idx, dlm->domain_map); __dlm_set_joining_node(dlm, DLM_LOCK_RES_OWNER_UNKNOWN); + printk(KERN_INFO "ocfs2_dlm: Node %u joins domain %s\n", + assert->node_idx, dlm->name); __dlm_print_nodes(dlm); /* notify anything attached to the heartbeat events */ @@ -1126,6 +1163,13 @@ static int dlm_join_domain(struct dlm_ctxt *dlm) goto bail; } + dlm->dlm_worker = create_singlethread_workqueue("dlm_wq"); + if (!dlm->dlm_worker) { + status = -ENOMEM; + mlog_errno(status); + goto bail; + } + do { unsigned int backoff; status = dlm_try_to_join_domain(dlm); @@ -1166,6 +1210,7 @@ bail: dlm_unregister_domain_handlers(dlm); dlm_complete_thread(dlm); dlm_complete_recovery_thread(dlm); + dlm_destroy_dlm_worker(dlm); } return status; @@ -1191,7 +1236,7 @@ static struct dlm_ctxt *dlm_alloc_ctxt(const char *domain, goto leave; } - dlm->lockres_hash = (struct hlist_head *) __get_free_page(GFP_KERNEL); + dlm->lockres_hash = (struct hlist_head **)dlm_alloc_pagevec(DLM_HASH_PAGES); if (!dlm->lockres_hash) { mlog_errno(-ENOMEM); kfree(dlm->name); @@ -1200,8 +1245,8 @@ static struct dlm_ctxt *dlm_alloc_ctxt(const char *domain, goto leave; } - for (i=0; ilockres_hash[i]); + for (i = 0; i < DLM_HASH_BUCKETS; i++) + INIT_HLIST_HEAD(dlm_lockres_hash(dlm, i)); strcpy(dlm->name, domain); dlm->key = key; @@ -1231,6 +1276,7 @@ static struct dlm_ctxt *dlm_alloc_ctxt(const char *domain, dlm->dlm_thread_task = NULL; dlm->dlm_reco_thread_task = NULL; + dlm->dlm_worker = NULL; init_waitqueue_head(&dlm->dlm_thread_wq); init_waitqueue_head(&dlm->dlm_reco_thread_wq); init_waitqueue_head(&dlm->reco.event); diff --git a/fs/ocfs2/dlm/dlmfs.c b/fs/ocfs2/dlm/dlmfs.c index 7e88e24b3..856c97110 100644 --- a/fs/ocfs2/dlm/dlmfs.c +++ b/fs/ocfs2/dlm/dlmfs.c @@ -116,7 +116,7 @@ static int dlmfs_file_open(struct inode *inode, * doesn't make sense for LVB writes. */ file->f_flags &= ~O_APPEND; - fp = kmalloc(sizeof(*fp), GFP_KERNEL); + fp = kmalloc(sizeof(*fp), GFP_NOFS); if (!fp) { status = -ENOMEM; goto bail; @@ -196,7 +196,7 @@ static ssize_t dlmfs_file_read(struct file *filp, else readlen = count - *ppos; - lvb_buf = kmalloc(readlen, GFP_KERNEL); + lvb_buf = kmalloc(readlen, GFP_NOFS); if (!lvb_buf) return -ENOMEM; @@ -240,7 +240,7 @@ static ssize_t dlmfs_file_write(struct file *filp, else writelen = count - *ppos; - lvb_buf = kmalloc(writelen, GFP_KERNEL); + lvb_buf = kmalloc(writelen, GFP_NOFS); if (!lvb_buf) return -ENOMEM; @@ -335,7 +335,6 @@ static struct inode *dlmfs_get_root_inode(struct super_block *sb) inode->i_mode = mode; inode->i_uid = current->fsuid; inode->i_gid = current->fsgid; - inode->i_blksize = PAGE_CACHE_SIZE; inode->i_blocks = 0; inode->i_mapping->backing_dev_info = &dlmfs_backing_dev_info; inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; @@ -362,7 +361,6 @@ static struct inode *dlmfs_get_inode(struct inode *parent, inode->i_mode = mode; inode->i_uid = current->fsuid; inode->i_gid = current->fsgid; - inode->i_blksize = PAGE_CACHE_SIZE; inode->i_blocks = 0; inode->i_mapping->backing_dev_info = &dlmfs_backing_dev_info; inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; @@ -574,10 +572,10 @@ static struct inode_operations dlmfs_file_inode_operations = { .getattr = simple_getattr, }; -static struct super_block *dlmfs_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int dlmfs_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_nodev(fs_type, flags, data, dlmfs_fill_super); + return get_sb_nodev(fs_type, flags, data, dlmfs_fill_super, mnt); } static struct file_system_type dlmfs_fs_type = { diff --git a/fs/ocfs2/dlm/dlmlock.c b/fs/ocfs2/dlm/dlmlock.c index 6fea28318..5ca57ec65 100644 --- a/fs/ocfs2/dlm/dlmlock.c +++ b/fs/ocfs2/dlm/dlmlock.c @@ -53,7 +53,7 @@ #define MLOG_MASK_PREFIX ML_DLM #include "cluster/masklog.h" -static spinlock_t dlm_cookie_lock = SPIN_LOCK_UNLOCKED; +static DEFINE_SPINLOCK(dlm_cookie_lock); static u64 dlm_next_cookie = 1; static enum dlm_status dlm_send_remote_lock_request(struct dlm_ctxt *dlm, @@ -201,6 +201,7 @@ static enum dlm_status dlmlock_remote(struct dlm_ctxt *dlm, struct dlm_lock *lock, int flags) { enum dlm_status status = DLM_DENIED; + int lockres_changed = 1; mlog_entry("type=%d\n", lock->ml.type); mlog(0, "lockres %.*s, flags = 0x%x\n", res->lockname.len, @@ -226,8 +227,25 @@ static enum dlm_status dlmlock_remote(struct dlm_ctxt *dlm, res->state &= ~DLM_LOCK_RES_IN_PROGRESS; lock->lock_pending = 0; if (status != DLM_NORMAL) { - if (status != DLM_NOTQUEUED) + if (status == DLM_RECOVERING && + dlm_is_recovery_lock(res->lockname.name, + res->lockname.len)) { + /* recovery lock was mastered by dead node. + * we need to have calc_usage shoot down this + * lockres and completely remaster it. */ + mlog(0, "%s: recovery lock was owned by " + "dead node %u, remaster it now.\n", + dlm->name, res->owner); + } else if (status != DLM_NOTQUEUED) { + /* + * DO NOT call calc_usage, as this would unhash + * the remote lockres before we ever get to use + * it. treat as if we never made any change to + * the lockres. + */ + lockres_changed = 0; dlm_error(status); + } dlm_revert_pending_lock(res, lock); dlm_lock_put(lock); } else if (dlm_is_recovery_lock(res->lockname.name, @@ -239,12 +257,12 @@ static enum dlm_status dlmlock_remote(struct dlm_ctxt *dlm, mlog(0, "%s: $RECOVERY lock for this node (%u) is " "mastered by %u; got lock, manually granting (no ast)\n", dlm->name, dlm->node_num, res->owner); - list_del_init(&lock->list); - list_add_tail(&lock->list, &res->granted); + list_move_tail(&lock->list, &res->granted); } spin_unlock(&res->spinlock); - dlm_lockres_calc_usage(dlm, res); + if (lockres_changed) + dlm_lockres_calc_usage(dlm, res); wake_up(&res->wq); return status; @@ -281,6 +299,14 @@ static enum dlm_status dlm_send_remote_lock_request(struct dlm_ctxt *dlm, if (tmpret >= 0) { // successfully sent and received ret = status; // this is already a dlm_status + if (ret == DLM_REJECTED) { + mlog(ML_ERROR, "%s:%.*s: BUG. this is a stale lockres " + "no longer owned by %u. that node is coming back " + "up currently.\n", dlm->name, create.namelen, + create.name, res->owner); + dlm_print_one_lock_resource(res); + BUG(); + } } else { mlog_errno(tmpret); if (dlm_is_host_down(tmpret)) { @@ -382,13 +408,13 @@ struct dlm_lock * dlm_new_lock(int type, u8 node, u64 cookie, struct dlm_lock *lock; int kernel_allocated = 0; - lock = kcalloc(1, sizeof(*lock), GFP_KERNEL); + lock = kcalloc(1, sizeof(*lock), GFP_NOFS); if (!lock) return NULL; if (!lksb) { /* zero memory only if kernel-allocated */ - lksb = kcalloc(1, sizeof(*lksb), GFP_KERNEL); + lksb = kcalloc(1, sizeof(*lksb), GFP_NOFS); if (!lksb) { kfree(lock); return NULL; @@ -429,11 +455,16 @@ int dlm_create_lock_handler(struct o2net_msg *msg, u32 len, void *data) if (!dlm_grab(dlm)) return DLM_REJECTED; - mlog_bug_on_msg(!dlm_domain_fully_joined(dlm), - "Domain %s not fully joined!\n", dlm->name); - name = create->name; namelen = create->namelen; + status = DLM_REJECTED; + if (!dlm_domain_fully_joined(dlm)) { + mlog(ML_ERROR, "Domain %s not fully joined, but node %u is " + "sending a create_lock message for lock %.*s!\n", + dlm->name, create->node_idx, namelen, name); + dlm_error(status); + goto leave; + } status = DLM_IVBUFLEN; if (namelen > DLM_LOCKID_NAME_MAX) { @@ -669,18 +700,22 @@ retry_lock: msleep(100); /* no waiting for dlm_reco_thread */ if (recovery) { - if (status == DLM_RECOVERING) { - mlog(0, "%s: got RECOVERING " - "for $REOCVERY lock, master " - "was %u\n", dlm->name, - res->owner); - dlm_wait_for_node_death(dlm, res->owner, - DLM_NODE_DEATH_WAIT_MAX); - } + if (status != DLM_RECOVERING) + goto retry_lock; + + mlog(0, "%s: got RECOVERING " + "for $RECOVERY lock, master " + "was %u\n", dlm->name, + res->owner); + /* wait to see the node go down, then + * drop down and allow the lockres to + * get cleaned up. need to remaster. */ + dlm_wait_for_node_death(dlm, res->owner, + DLM_NODE_DEATH_WAIT_MAX); } else { dlm_wait_for_recovery(dlm); + goto retry_lock; } - goto retry_lock; } if (status != DLM_NORMAL) { diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c index 940be4c13..9503240ef 100644 --- a/fs/ocfs2/dlm/dlmmaster.c +++ b/fs/ocfs2/dlm/dlmmaster.c @@ -47,7 +47,6 @@ #include "dlmapi.h" #include "dlmcommon.h" -#include "dlmdebug.h" #include "dlmdomain.h" #define MLOG_MASK_PREFIX (ML_DLM|ML_DLM_MASTER) @@ -74,6 +73,7 @@ struct dlm_master_list_entry wait_queue_head_t wq; atomic_t woken; struct kref mle_refs; + int inuse; unsigned long maybe_map[BITS_TO_LONGS(O2NM_MAX_NODES)]; unsigned long vote_map[BITS_TO_LONGS(O2NM_MAX_NODES)]; unsigned long response_map[BITS_TO_LONGS(O2NM_MAX_NODES)]; @@ -127,18 +127,30 @@ static inline int dlm_mle_equal(struct dlm_ctxt *dlm, return 1; } -#if 0 -/* Code here is included but defined out as it aids debugging */ +#define dlm_print_nodemap(m) _dlm_print_nodemap(m,#m) +static void _dlm_print_nodemap(unsigned long *map, const char *mapname) +{ + int i; + printk("%s=[ ", mapname); + for (i=0; imaybe_map, + *vote = mle->vote_map, + *resp = mle->response_map, + *node = mle->node_map; k = &mle->mle_refs; if (mle->type == DLM_MLE_BLOCK) @@ -159,18 +171,29 @@ void dlm_print_one_mle(struct dlm_master_list_entry *mle) name = mle->u.res->lockname.name; } - mlog(ML_NOTICE, " #%3d: %3s %3d %3u %3u %c (%d)%.*s\n", - i, type, refs, master, mle->new_master, attached, - namelen, namelen, name); + mlog(ML_NOTICE, "%.*s: %3s refs=%3d mas=%3u new=%3u evt=%c inuse=%d ", + namelen, name, type, refs, master, mle->new_master, attached, + mle->inuse); + dlm_print_nodemap(maybe); + printk(", "); + dlm_print_nodemap(vote); + printk(", "); + dlm_print_nodemap(resp); + printk(", "); + dlm_print_nodemap(node); + printk(", "); + printk("\n"); } +#if 0 +/* Code here is included but defined out as it aids debugging */ + static void dlm_dump_mles(struct dlm_ctxt *dlm) { struct dlm_master_list_entry *mle; struct list_head *iter; mlog(ML_NOTICE, "dumping all mles for domain %s:\n", dlm->name); - mlog(ML_NOTICE, " ####: type refs owner new events? lockname nodemap votemap respmap maybemap\n"); spin_lock(&dlm->master_lock); list_for_each(iter, &dlm->master_list) { mle = list_entry(iter, struct dlm_master_list_entry, list); @@ -314,6 +337,31 @@ static inline void dlm_mle_detach_hb_events(struct dlm_ctxt *dlm, spin_unlock(&dlm->spinlock); } +static void dlm_get_mle_inuse(struct dlm_master_list_entry *mle) +{ + struct dlm_ctxt *dlm; + dlm = mle->dlm; + + assert_spin_locked(&dlm->spinlock); + assert_spin_locked(&dlm->master_lock); + mle->inuse++; + kref_get(&mle->mle_refs); +} + +static void dlm_put_mle_inuse(struct dlm_master_list_entry *mle) +{ + struct dlm_ctxt *dlm; + dlm = mle->dlm; + + spin_lock(&dlm->spinlock); + spin_lock(&dlm->master_lock); + mle->inuse--; + __dlm_put_mle(mle); + spin_unlock(&dlm->master_lock); + spin_unlock(&dlm->spinlock); + +} + /* remove from list and free */ static void __dlm_put_mle(struct dlm_master_list_entry *mle) { @@ -322,9 +370,14 @@ static void __dlm_put_mle(struct dlm_master_list_entry *mle) assert_spin_locked(&dlm->spinlock); assert_spin_locked(&dlm->master_lock); - BUG_ON(!atomic_read(&mle->mle_refs.refcount)); - - kref_put(&mle->mle_refs, dlm_mle_release); + if (!atomic_read(&mle->mle_refs.refcount)) { + /* this may or may not crash, but who cares. + * it's a BUG. */ + mlog(ML_ERROR, "bad mle: %p\n", mle); + dlm_print_one_mle(mle); + BUG(); + } else + kref_put(&mle->mle_refs, dlm_mle_release); } @@ -367,6 +420,7 @@ static void dlm_init_mle(struct dlm_master_list_entry *mle, memset(mle->response_map, 0, sizeof(mle->response_map)); mle->master = O2NM_MAX_NODES; mle->new_master = O2NM_MAX_NODES; + mle->inuse = 0; if (mle->type == DLM_MLE_MASTER) { BUG_ON(!res); @@ -564,6 +618,28 @@ static void dlm_lockres_release(struct kref *kref) mlog(0, "destroying lockres %.*s\n", res->lockname.len, res->lockname.name); + if (!hlist_unhashed(&res->hash_node) || + !list_empty(&res->granted) || + !list_empty(&res->converting) || + !list_empty(&res->blocked) || + !list_empty(&res->dirty) || + !list_empty(&res->recovering) || + !list_empty(&res->purge)) { + mlog(ML_ERROR, + "Going to BUG for resource %.*s." + " We're on a list! [%c%c%c%c%c%c%c]\n", + res->lockname.len, res->lockname.name, + !hlist_unhashed(&res->hash_node) ? 'H' : ' ', + !list_empty(&res->granted) ? 'G' : ' ', + !list_empty(&res->converting) ? 'C' : ' ', + !list_empty(&res->blocked) ? 'B' : ' ', + !list_empty(&res->dirty) ? 'D' : ' ', + !list_empty(&res->recovering) ? 'R' : ' ', + !list_empty(&res->purge) ? 'P' : ' '); + + dlm_print_one_lock_resource(res); + } + /* By the time we're ready to blow this guy away, we shouldn't * be on any lists. */ BUG_ON(!hlist_unhashed(&res->hash_node)); @@ -579,11 +655,6 @@ static void dlm_lockres_release(struct kref *kref) kfree(res); } -void dlm_lockres_get(struct dlm_lock_resource *res) -{ - kref_get(&res->refs); -} - void dlm_lockres_put(struct dlm_lock_resource *res) { kref_put(&res->refs, dlm_lockres_release); @@ -603,7 +674,7 @@ static void dlm_init_lockres(struct dlm_ctxt *dlm, memcpy(qname, name, namelen); res->lockname.len = namelen; - res->lockname.hash = full_name_hash(name, namelen); + res->lockname.hash = dlm_lockid_hash(name, namelen); init_waitqueue_head(&res->wq); spin_lock_init(&res->spinlock); @@ -637,11 +708,11 @@ struct dlm_lock_resource *dlm_new_lockres(struct dlm_ctxt *dlm, { struct dlm_lock_resource *res; - res = kmalloc(sizeof(struct dlm_lock_resource), GFP_KERNEL); + res = kmalloc(sizeof(struct dlm_lock_resource), GFP_NOFS); if (!res) return NULL; - res->lockname.name = kmalloc(namelen, GFP_KERNEL); + res->lockname.name = kmalloc(namelen, GFP_NOFS); if (!res->lockname.name) { kfree(res); return NULL; @@ -677,19 +748,20 @@ struct dlm_lock_resource * dlm_get_lock_resource(struct dlm_ctxt *dlm, int blocked = 0; int ret, nodenum; struct dlm_node_iter iter; - unsigned int namelen; + unsigned int namelen, hash; int tries = 0; int bit, wait_on_recovery = 0; BUG_ON(!lockid); namelen = strlen(lockid); + hash = dlm_lockid_hash(lockid, namelen); mlog(0, "get lockres %s (len %d)\n", lockid, namelen); lookup: spin_lock(&dlm->spinlock); - tmpres = __dlm_lookup_lockres(dlm, lockid, namelen); + tmpres = __dlm_lookup_lockres(dlm, lockid, namelen, hash); if (tmpres) { spin_unlock(&dlm->spinlock); mlog(0, "found in hash!\n"); @@ -704,7 +776,7 @@ lookup: mlog(0, "allocating a new resource\n"); /* nothing found and we need to allocate one. */ alloc_mle = (struct dlm_master_list_entry *) - kmem_cache_alloc(dlm_mle_cache, GFP_KERNEL); + kmem_cache_alloc(dlm_mle_cache, GFP_NOFS); if (!alloc_mle) goto leave; res = dlm_new_lockres(dlm, lockid, namelen); @@ -790,10 +862,11 @@ lookup: * if so, the creator of the BLOCK may try to put the last * ref at this time in the assert master handler, so we * need an extra one to keep from a bad ptr deref. */ - dlm_get_mle(mle); + dlm_get_mle_inuse(mle); spin_unlock(&dlm->master_lock); spin_unlock(&dlm->spinlock); +redo_request: while (wait_on_recovery) { /* any cluster changes that occurred after dropping the * dlm spinlock would be detectable be a change on the mle, @@ -812,7 +885,7 @@ lookup: } dlm_kick_recovery_thread(dlm); - msleep(100); + msleep(1000); dlm_wait_for_recovery(dlm); spin_lock(&dlm->spinlock); @@ -825,13 +898,15 @@ lookup: } else wait_on_recovery = 0; spin_unlock(&dlm->spinlock); + + if (wait_on_recovery) + dlm_wait_for_node_recovery(dlm, bit, 10000); } /* must wait for lock to be mastered elsewhere */ if (blocked) goto wait; -redo_request: ret = -EINVAL; dlm_node_iter_init(mle->vote_map, &iter); while ((nodenum = dlm_node_iter_next(&iter)) >= 0) { @@ -856,6 +931,7 @@ wait: /* keep going until the response map includes all nodes */ ret = dlm_wait_for_lock_mastery(dlm, res, mle, &blocked); if (ret < 0) { + wait_on_recovery = 1; mlog(0, "%s:%.*s: node map changed, redo the " "master request now, blocked=%d\n", dlm->name, res->lockname.len, @@ -866,7 +942,7 @@ wait: dlm->name, res->lockname.len, res->lockname.name, blocked); dlm_print_one_lock_resource(res); - /* dlm_print_one_mle(mle); */ + dlm_print_one_mle(mle); tries = 0; } goto redo_request; @@ -880,7 +956,7 @@ wait: dlm_mle_detach_hb_events(dlm, mle); dlm_put_mle(mle); /* put the extra ref */ - dlm_put_mle(mle); + dlm_put_mle_inuse(mle); wake_waiters: spin_lock(&res->spinlock); @@ -921,12 +997,14 @@ recheck: spin_unlock(&res->spinlock); /* this will cause the master to re-assert across * the whole cluster, freeing up mles */ - ret = dlm_do_master_request(mle, res->owner); - if (ret < 0) { - /* give recovery a chance to run */ - mlog(ML_ERROR, "link to %u went down?: %d\n", res->owner, ret); - msleep(500); - goto recheck; + if (res->owner != dlm->node_num) { + ret = dlm_do_master_request(mle, res->owner); + if (ret < 0) { + /* give recovery a chance to run */ + mlog(ML_ERROR, "link to %u went down?: %d\n", res->owner, ret); + msleep(500); + goto recheck; + } } ret = 0; goto leave; @@ -962,6 +1040,12 @@ recheck: "rechecking now\n", dlm->name, res->lockname.len, res->lockname.name); goto recheck; + } else { + if (!voting_done) { + mlog(0, "map not changed and voting not done " + "for %s:%.*s\n", dlm->name, res->lockname.len, + res->lockname.name); + } } if (m != O2NM_MAX_NODES) { @@ -1129,18 +1213,6 @@ static int dlm_restart_lock_mastery(struct dlm_ctxt *dlm, set_bit(node, mle->vote_map); } else { mlog(ML_ERROR, "node down! %d\n", node); - - /* if the node wasn't involved in mastery skip it, - * but clear it out from the maps so that it will - * not affect mastery of this lockres */ - clear_bit(node, mle->response_map); - clear_bit(node, mle->vote_map); - if (!test_bit(node, mle->maybe_map)) - goto next; - - /* if we're already blocked on lock mastery, and the - * dead node wasn't the expected master, or there is - * another node in the maybe_map, keep waiting */ if (blocked) { int lowest = find_next_bit(mle->maybe_map, O2NM_MAX_NODES, 0); @@ -1148,54 +1220,53 @@ static int dlm_restart_lock_mastery(struct dlm_ctxt *dlm, /* act like it was never there */ clear_bit(node, mle->maybe_map); - if (node != lowest) - goto next; - - mlog(ML_ERROR, "expected master %u died while " - "this node was blocked waiting on it!\n", - node); - lowest = find_next_bit(mle->maybe_map, - O2NM_MAX_NODES, - lowest+1); - if (lowest < O2NM_MAX_NODES) { - mlog(0, "still blocked. waiting " - "on %u now\n", lowest); - goto next; + if (node == lowest) { + mlog(0, "expected master %u died" + " while this node was blocked " + "waiting on it!\n", node); + lowest = find_next_bit(mle->maybe_map, + O2NM_MAX_NODES, + lowest+1); + if (lowest < O2NM_MAX_NODES) { + mlog(0, "%s:%.*s:still " + "blocked. waiting on %u " + "now\n", dlm->name, + res->lockname.len, + res->lockname.name, + lowest); + } else { + /* mle is an MLE_BLOCK, but + * there is now nothing left to + * block on. we need to return + * all the way back out and try + * again with an MLE_MASTER. + * dlm_do_local_recovery_cleanup + * has already run, so the mle + * refcount is ok */ + mlog(0, "%s:%.*s: no " + "longer blocking. try to " + "master this here\n", + dlm->name, + res->lockname.len, + res->lockname.name); + mle->type = DLM_MLE_MASTER; + mle->u.res = res; + } } - - /* mle is an MLE_BLOCK, but there is now - * nothing left to block on. we need to return - * all the way back out and try again with - * an MLE_MASTER. dlm_do_local_recovery_cleanup - * has already run, so the mle refcount is ok */ - mlog(0, "no longer blocking. we can " - "try to master this here\n"); - mle->type = DLM_MLE_MASTER; - memset(mle->maybe_map, 0, - sizeof(mle->maybe_map)); - memset(mle->response_map, 0, - sizeof(mle->maybe_map)); - memcpy(mle->vote_map, mle->node_map, - sizeof(mle->node_map)); - mle->u.res = res; - set_bit(dlm->node_num, mle->maybe_map); - - ret = -EAGAIN; - goto next; } - clear_bit(node, mle->maybe_map); - if (node > dlm->node_num) - goto next; - - mlog(0, "dead node in map!\n"); - /* yuck. go back and re-contact all nodes - * in the vote_map, removing this node. */ - memset(mle->response_map, 0, - sizeof(mle->response_map)); + /* now blank out everything, as if we had never + * contacted anyone */ + memset(mle->maybe_map, 0, sizeof(mle->maybe_map)); + memset(mle->response_map, 0, sizeof(mle->response_map)); + /* reset the vote_map to the current node_map */ + memcpy(mle->vote_map, mle->node_map, + sizeof(mle->node_map)); + /* put myself into the maybe map */ + if (mle->type != DLM_MLE_BLOCK) + set_bit(dlm->node_num, mle->maybe_map); } ret = -EAGAIN; -next: node = dlm_bitmap_diff_iter_next(&bdi, &sc); } return ret; @@ -1316,7 +1387,7 @@ int dlm_master_request_handler(struct o2net_msg *msg, u32 len, void *data) struct dlm_master_request *request = (struct dlm_master_request *) msg->buf; struct dlm_master_list_entry *mle = NULL, *tmpmle = NULL; char *name; - unsigned int namelen; + unsigned int namelen, hash; int found, ret; int set_maybe; int dispatch_assert = 0; @@ -1331,6 +1402,7 @@ int dlm_master_request_handler(struct o2net_msg *msg, u32 len, void *data) name = request->name; namelen = request->namelen; + hash = dlm_lockid_hash(name, namelen); if (namelen > DLM_LOCKID_NAME_MAX) { response = DLM_IVBUFLEN; @@ -1339,7 +1411,7 @@ int dlm_master_request_handler(struct o2net_msg *msg, u32 len, void *data) way_up_top: spin_lock(&dlm->spinlock); - res = __dlm_lookup_lockres(dlm, name, namelen); + res = __dlm_lookup_lockres(dlm, name, namelen, hash); if (res) { spin_unlock(&dlm->spinlock); @@ -1459,21 +1531,18 @@ way_up_top: spin_unlock(&dlm->spinlock); mle = (struct dlm_master_list_entry *) - kmem_cache_alloc(dlm_mle_cache, GFP_KERNEL); + kmem_cache_alloc(dlm_mle_cache, GFP_NOFS); if (!mle) { response = DLM_MASTER_RESP_ERROR; mlog_errno(-ENOMEM); goto send_response; } - spin_lock(&dlm->spinlock); - dlm_init_mle(mle, DLM_MLE_BLOCK, dlm, NULL, - name, namelen); - spin_unlock(&dlm->spinlock); goto way_up_top; } // mlog(0, "this is second time thru, already allocated, " // "add the block.\n"); + dlm_init_mle(mle, DLM_MLE_BLOCK, dlm, NULL, name, namelen); set_bit(request->node_idx, mle->maybe_map); list_add(&mle->list, &dlm->master_list); response = DLM_MASTER_RESP_NO; @@ -1556,6 +1625,8 @@ again: dlm_node_iter_init(nodemap, &iter); while ((to = dlm_node_iter_next(&iter)) >= 0) { int r = 0; + struct dlm_master_list_entry *mle = NULL; + mlog(0, "sending assert master to %d (%.*s)\n", to, namelen, lockname); memset(&assert, 0, sizeof(assert)); @@ -1567,20 +1638,28 @@ again: tmpret = o2net_send_message(DLM_ASSERT_MASTER_MSG, dlm->key, &assert, sizeof(assert), to, &r); if (tmpret < 0) { - mlog(ML_ERROR, "assert_master returned %d!\n", tmpret); + mlog(0, "assert_master returned %d!\n", tmpret); if (!dlm_is_host_down(tmpret)) { - mlog(ML_ERROR, "unhandled error!\n"); + mlog(ML_ERROR, "unhandled error=%d!\n", tmpret); BUG(); } /* a node died. finish out the rest of the nodes. */ - mlog(ML_ERROR, "link to %d went down!\n", to); + mlog(0, "link to %d went down!\n", to); /* any nonzero status return will do */ ret = tmpret; } else if (r < 0) { /* ok, something horribly messed. kill thyself. */ mlog(ML_ERROR,"during assert master of %.*s to %u, " "got %d.\n", namelen, lockname, to, r); - dlm_dump_lock_resources(dlm); + spin_lock(&dlm->spinlock); + spin_lock(&dlm->master_lock); + if (dlm_find_mle(dlm, &mle, (char *)lockname, + namelen)) { + dlm_print_one_mle(mle); + __dlm_put_mle(mle); + } + spin_unlock(&dlm->master_lock); + spin_unlock(&dlm->spinlock); BUG(); } else if (r == EAGAIN) { mlog(0, "%.*s: node %u create mles on other " @@ -1612,7 +1691,7 @@ int dlm_assert_master_handler(struct o2net_msg *msg, u32 len, void *data) struct dlm_assert_master *assert = (struct dlm_assert_master *)msg->buf; struct dlm_lock_resource *res = NULL; char *name; - unsigned int namelen; + unsigned int namelen, hash; u32 flags; int master_request = 0; int ret = 0; @@ -1622,6 +1701,7 @@ int dlm_assert_master_handler(struct o2net_msg *msg, u32 len, void *data) name = assert->name; namelen = assert->namelen; + hash = dlm_lockid_hash(name, namelen); flags = be32_to_cpu(assert->flags); if (namelen > DLM_LOCKID_NAME_MAX) { @@ -1646,7 +1726,7 @@ int dlm_assert_master_handler(struct o2net_msg *msg, u32 len, void *data) if (bit >= O2NM_MAX_NODES) { /* not necessarily an error, though less likely. * could be master just re-asserting. */ - mlog(ML_ERROR, "no bits set in the maybe_map, but %u " + mlog(0, "no bits set in the maybe_map, but %u " "is asserting! (%.*s)\n", assert->node_idx, namelen, name); } else if (bit != assert->node_idx) { @@ -1658,19 +1738,36 @@ int dlm_assert_master_handler(struct o2net_msg *msg, u32 len, void *data) * number winning the mastery will respond * YES to mastery requests, but this node * had no way of knowing. let it pass. */ - mlog(ML_ERROR, "%u is the lowest node, " + mlog(0, "%u is the lowest node, " "%u is asserting. (%.*s) %u must " "have begun after %u won.\n", bit, assert->node_idx, namelen, name, bit, assert->node_idx); } } + if (mle->type == DLM_MLE_MIGRATION) { + if (flags & DLM_ASSERT_MASTER_MLE_CLEANUP) { + mlog(0, "%s:%.*s: got cleanup assert" + " from %u for migration\n", + dlm->name, namelen, name, + assert->node_idx); + } else if (!(flags & DLM_ASSERT_MASTER_FINISH_MIGRATION)) { + mlog(0, "%s:%.*s: got unrelated assert" + " from %u for migration, ignoring\n", + dlm->name, namelen, name, + assert->node_idx); + __dlm_put_mle(mle); + spin_unlock(&dlm->master_lock); + spin_unlock(&dlm->spinlock); + goto done; + } + } } spin_unlock(&dlm->master_lock); /* ok everything checks out with the MLE * now check to see if there is a lockres */ - res = __dlm_lookup_lockres(dlm, name, namelen); + res = __dlm_lookup_lockres(dlm, name, namelen, hash); if (res) { spin_lock(&res->spinlock); if (res->state & DLM_LOCK_RES_RECOVERING) { @@ -1679,7 +1776,8 @@ int dlm_assert_master_handler(struct o2net_msg *msg, u32 len, void *data) goto kill; } if (!mle) { - if (res->owner != assert->node_idx) { + if (res->owner != DLM_LOCK_RES_OWNER_UNKNOWN && + res->owner != assert->node_idx) { mlog(ML_ERROR, "assert_master from " "%u, but current owner is " "%u! (%.*s)\n", @@ -1732,6 +1830,7 @@ ok: if (mle) { int extra_ref = 0; int nn = -1; + int rr, err = 0; spin_lock(&mle->spinlock); if (mle->type == DLM_MLE_BLOCK || mle->type == DLM_MLE_MIGRATION) @@ -1751,27 +1850,64 @@ ok: wake_up(&mle->wq); spin_unlock(&mle->spinlock); - if (mle->type == DLM_MLE_MIGRATION && res) { - mlog(0, "finishing off migration of lockres %.*s, " - "from %u to %u\n", - res->lockname.len, res->lockname.name, - dlm->node_num, mle->new_master); + if (res) { spin_lock(&res->spinlock); - res->state &= ~DLM_LOCK_RES_MIGRATING; - dlm_change_lockres_owner(dlm, res, mle->new_master); - BUG_ON(res->state & DLM_LOCK_RES_DIRTY); + if (mle->type == DLM_MLE_MIGRATION) { + mlog(0, "finishing off migration of lockres %.*s, " + "from %u to %u\n", + res->lockname.len, res->lockname.name, + dlm->node_num, mle->new_master); + res->state &= ~DLM_LOCK_RES_MIGRATING; + dlm_change_lockres_owner(dlm, res, mle->new_master); + BUG_ON(res->state & DLM_LOCK_RES_DIRTY); + } else { + dlm_change_lockres_owner(dlm, res, mle->master); + } spin_unlock(&res->spinlock); } - /* master is known, detach if not already detached */ - dlm_mle_detach_hb_events(dlm, mle); - dlm_put_mle(mle); - + + /* master is known, detach if not already detached. + * ensures that only one assert_master call will happen + * on this mle. */ + spin_lock(&dlm->spinlock); + spin_lock(&dlm->master_lock); + + rr = atomic_read(&mle->mle_refs.refcount); + if (mle->inuse > 0) { + if (extra_ref && rr < 3) + err = 1; + else if (!extra_ref && rr < 2) + err = 1; + } else { + if (extra_ref && rr < 2) + err = 1; + else if (!extra_ref && rr < 1) + err = 1; + } + if (err) { + mlog(ML_ERROR, "%s:%.*s: got assert master from %u " + "that will mess up this node, refs=%d, extra=%d, " + "inuse=%d\n", dlm->name, namelen, name, + assert->node_idx, rr, extra_ref, mle->inuse); + dlm_print_one_mle(mle); + } + list_del_init(&mle->list); + __dlm_mle_detach_hb_events(dlm, mle); + __dlm_put_mle(mle); if (extra_ref) { /* the assert master message now balances the extra * ref given by the master / migration request message. * if this is the last put, it will be removed * from the list. */ - dlm_put_mle(mle); + __dlm_put_mle(mle); + } + spin_unlock(&dlm->master_lock); + spin_unlock(&dlm->spinlock); + } else if (res) { + if (res->owner != assert->node_idx) { + mlog(0, "assert_master from %u, but current " + "owner is %u (%.*s), no mle\n", assert->node_idx, + res->owner, namelen, name); } } @@ -1788,12 +1924,12 @@ done: kill: /* kill the caller! */ + mlog(ML_ERROR, "Bad message received from another node. Dumping state " + "and killing the other node now! This node is OK and can continue.\n"); + __dlm_print_one_lock_resource(res); spin_unlock(&res->spinlock); spin_unlock(&dlm->spinlock); dlm_lockres_put(res); - mlog(ML_ERROR, "Bad message received from another node. Dumping state " - "and killing the other node now! This node is OK and can continue.\n"); - dlm_dump_lock_resources(dlm); dlm_put(dlm); return -EINVAL; } @@ -1803,7 +1939,7 @@ int dlm_dispatch_assert_master(struct dlm_ctxt *dlm, int ignore_higher, u8 request_from, u32 flags) { struct dlm_work_item *item; - item = kcalloc(1, sizeof(*item), GFP_KERNEL); + item = kcalloc(1, sizeof(*item), GFP_NOFS); if (!item) return -ENOMEM; @@ -1825,7 +1961,7 @@ int dlm_dispatch_assert_master(struct dlm_ctxt *dlm, list_add_tail(&item->list, &dlm->work_list); spin_unlock(&dlm->work_lock); - schedule_work(&dlm->dispatched_work); + queue_work(dlm->dlm_worker, &dlm->dispatched_work); return 0; } @@ -1866,6 +2002,23 @@ static void dlm_assert_master_worker(struct dlm_work_item *item, void *data) } } + /* + * If we're migrating this lock to someone else, we are no + * longer allowed to assert out own mastery. OTOH, we need to + * prevent migration from starting while we're still asserting + * our dominance. The reserved ast delays migration. + */ + spin_lock(&res->spinlock); + if (res->state & DLM_LOCK_RES_MIGRATING) { + mlog(0, "Someone asked us to assert mastery, but we're " + "in the middle of migration. Skipping assert, " + "the new master will handle that.\n"); + spin_unlock(&res->spinlock); + goto put; + } else + __dlm_lockres_reserve_ast(res); + spin_unlock(&res->spinlock); + /* this call now finishes out the nodemap * even if one or more nodes die */ mlog(0, "worker about to master %.*s here, this=%u\n", @@ -1875,9 +2028,14 @@ static void dlm_assert_master_worker(struct dlm_work_item *item, void *data) nodemap, flags); if (ret < 0) { /* no need to restart, we are done */ - mlog_errno(ret); + if (!dlm_is_host_down(ret)) + mlog_errno(ret); } + /* Ok, we've asserted ourselves. Let's let migration start. */ + dlm_lockres_release_ast(dlm, res); + +put: dlm_lockres_put(res); mlog(0, "finished with dlm_assert_master_worker\n"); @@ -1916,6 +2074,7 @@ static int dlm_pre_master_reco_lockres(struct dlm_ctxt *dlm, BUG(); /* host is down, so answer for that node would be * DLM_LOCK_RES_OWNER_UNKNOWN. continue. */ + ret = 0; } if (master != DLM_LOCK_RES_OWNER_UNKNOWN) { @@ -2016,14 +2175,14 @@ int dlm_migrate_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, */ ret = -ENOMEM; - mres = (struct dlm_migratable_lockres *) __get_free_page(GFP_KERNEL); + mres = (struct dlm_migratable_lockres *) __get_free_page(GFP_NOFS); if (!mres) { mlog_errno(ret); goto leave; } mle = (struct dlm_master_list_entry *) kmem_cache_alloc(dlm_mle_cache, - GFP_KERNEL); + GFP_NOFS); if (!mle) { mlog_errno(ret); goto leave; @@ -2117,7 +2276,7 @@ fail: * take both dlm->spinlock and dlm->master_lock */ spin_lock(&dlm->spinlock); spin_lock(&dlm->master_lock); - dlm_get_mle(mle); + dlm_get_mle_inuse(mle); spin_unlock(&dlm->master_lock); spin_unlock(&dlm->spinlock); @@ -2134,7 +2293,10 @@ fail: /* migration failed, detach and clean up mle */ dlm_mle_detach_hb_events(dlm, mle); dlm_put_mle(mle); - dlm_put_mle(mle); + dlm_put_mle_inuse(mle); + spin_lock(&res->spinlock); + res->state &= ~DLM_LOCK_RES_MIGRATING; + spin_unlock(&res->spinlock); goto leave; } @@ -2164,8 +2326,8 @@ fail: /* avoid hang during shutdown when migrating lockres * to a node which also goes down */ if (dlm_is_node_dead(dlm, target)) { - mlog(0, "%s:%.*s: expected migration target %u " - "is no longer up. restarting.\n", + mlog(0, "%s:%.*s: expected migration " + "target %u is no longer up, restarting\n", dlm->name, res->lockname.len, res->lockname.name, target); ret = -ERESTARTSYS; @@ -2175,7 +2337,10 @@ fail: /* migration failed, detach and clean up mle */ dlm_mle_detach_hb_events(dlm, mle); dlm_put_mle(mle); - dlm_put_mle(mle); + dlm_put_mle_inuse(mle); + spin_lock(&res->spinlock); + res->state &= ~DLM_LOCK_RES_MIGRATING; + spin_unlock(&res->spinlock); goto leave; } /* TODO: if node died: stop, clean up, return error */ @@ -2191,7 +2356,7 @@ fail: /* master is known, detach if not already detached */ dlm_mle_detach_hb_events(dlm, mle); - dlm_put_mle(mle); + dlm_put_mle_inuse(mle); ret = 0; dlm_lockres_calc_usage(dlm, res); @@ -2210,7 +2375,6 @@ leave: mlog(0, "returning %d\n", ret); return ret; } -EXPORT_SYMBOL_GPL(dlm_migrate_lockres); int dlm_lock_basts_flushed(struct dlm_ctxt *dlm, struct dlm_lock *lock) { @@ -2462,7 +2626,7 @@ int dlm_migrate_request_handler(struct o2net_msg *msg, u32 len, void *data) struct dlm_migrate_request *migrate = (struct dlm_migrate_request *) msg->buf; struct dlm_master_list_entry *mle = NULL, *oldmle = NULL; const char *name; - unsigned int namelen; + unsigned int namelen, hash; int ret = 0; if (!dlm_grab(dlm)) @@ -2470,10 +2634,11 @@ int dlm_migrate_request_handler(struct o2net_msg *msg, u32 len, void *data) name = migrate->name; namelen = migrate->namelen; + hash = dlm_lockid_hash(name, namelen); /* preallocate.. if this fails, abort */ mle = (struct dlm_master_list_entry *) kmem_cache_alloc(dlm_mle_cache, - GFP_KERNEL); + GFP_NOFS); if (!mle) { ret = -ENOMEM; @@ -2482,7 +2647,7 @@ int dlm_migrate_request_handler(struct o2net_msg *msg, u32 len, void *data) /* check for pre-existing lock */ spin_lock(&dlm->spinlock); - res = __dlm_lookup_lockres(dlm, name, namelen); + res = __dlm_lookup_lockres(dlm, name, namelen, hash); spin_lock(&dlm->master_lock); if (res) { @@ -2580,6 +2745,7 @@ static int dlm_add_migration_mle(struct dlm_ctxt *dlm, /* remove it from the list so that only one * mle will be found */ list_del_init(&tmp->list); + __dlm_mle_detach_hb_events(dlm, mle); } spin_unlock(&tmp->spinlock); } @@ -2601,6 +2767,7 @@ void dlm_clean_master_list(struct dlm_ctxt *dlm, u8 dead_node) struct list_head *iter, *iter2; struct dlm_master_list_entry *mle; struct dlm_lock_resource *res; + unsigned int hash; mlog_entry("dlm=%s, dead node=%u\n", dlm->name, dead_node); top: @@ -2640,7 +2807,7 @@ top: * may result in the mle being unlinked and * freed, but there may still be a process * waiting in the dlmlock path which is fine. */ - mlog(ML_ERROR, "node %u was expected master\n", + mlog(0, "node %u was expected master\n", dead_node); atomic_set(&mle->woken, 1); spin_unlock(&mle->spinlock); @@ -2673,19 +2840,21 @@ top: /* remove from the list early. NOTE: unlinking * list_head while in list_for_each_safe */ + __dlm_mle_detach_hb_events(dlm, mle); spin_lock(&mle->spinlock); list_del_init(&mle->list); atomic_set(&mle->woken, 1); spin_unlock(&mle->spinlock); wake_up(&mle->wq); - mlog(0, "node %u died during migration from " - "%u to %u!\n", dead_node, + mlog(0, "%s: node %u died during migration from " + "%u to %u!\n", dlm->name, dead_node, mle->master, mle->new_master); /* if there is a lockres associated with this * mle, find it and set its owner to UNKNOWN */ + hash = dlm_lockid_hash(mle->u.name.name, mle->u.name.len); res = __dlm_lookup_lockres(dlm, mle->u.name.name, - mle->u.name.len); + mle->u.name.len, hash); if (res) { /* unfortunately if we hit this rare case, our * lock ordering is messed. we need to drop diff --git a/fs/ocfs2/dlm/dlmrecovery.c b/fs/ocfs2/dlm/dlmrecovery.c index 805cbabac..594745fab 100644 --- a/fs/ocfs2/dlm/dlmrecovery.c +++ b/fs/ocfs2/dlm/dlmrecovery.c @@ -95,11 +95,14 @@ static void dlm_reco_unlock_ast(void *astdata, enum dlm_status st); static void dlm_request_all_locks_worker(struct dlm_work_item *item, void *data); static void dlm_mig_lockres_worker(struct dlm_work_item *item, void *data); +static int dlm_lockres_master_requery(struct dlm_ctxt *dlm, + struct dlm_lock_resource *res, + u8 *real_master); static u64 dlm_get_next_mig_cookie(void); -static spinlock_t dlm_reco_state_lock = SPIN_LOCK_UNLOCKED; -static spinlock_t dlm_mig_cookie_lock = SPIN_LOCK_UNLOCKED; +static DEFINE_SPINLOCK(dlm_reco_state_lock); +static DEFINE_SPINLOCK(dlm_mig_cookie_lock); static u64 dlm_mig_cookie = 1; static u64 dlm_get_next_mig_cookie(void) @@ -115,12 +118,37 @@ static u64 dlm_get_next_mig_cookie(void) return c; } +static inline void dlm_set_reco_dead_node(struct dlm_ctxt *dlm, + u8 dead_node) +{ + assert_spin_locked(&dlm->spinlock); + if (dlm->reco.dead_node != dead_node) + mlog(0, "%s: changing dead_node from %u to %u\n", + dlm->name, dlm->reco.dead_node, dead_node); + dlm->reco.dead_node = dead_node; +} + +static inline void dlm_set_reco_master(struct dlm_ctxt *dlm, + u8 master) +{ + assert_spin_locked(&dlm->spinlock); + mlog(0, "%s: changing new_master from %u to %u\n", + dlm->name, dlm->reco.new_master, master); + dlm->reco.new_master = master; +} + +static inline void __dlm_reset_recovery(struct dlm_ctxt *dlm) +{ + assert_spin_locked(&dlm->spinlock); + clear_bit(dlm->reco.dead_node, dlm->recovery_map); + dlm_set_reco_dead_node(dlm, O2NM_INVALID_NODE_NUM); + dlm_set_reco_master(dlm, O2NM_INVALID_NODE_NUM); +} + static inline void dlm_reset_recovery(struct dlm_ctxt *dlm) { spin_lock(&dlm->spinlock); - clear_bit(dlm->reco.dead_node, dlm->recovery_map); - dlm->reco.dead_node = O2NM_INVALID_NODE_NUM; - dlm->reco.new_master = O2NM_INVALID_NODE_NUM; + __dlm_reset_recovery(dlm); spin_unlock(&dlm->spinlock); } @@ -132,11 +160,20 @@ void dlm_dispatch_work(void *data) struct list_head *iter, *iter2; struct dlm_work_item *item; dlm_workfunc_t *workfunc; + int tot=0; + + if (!dlm_joined(dlm)) + return; spin_lock(&dlm->work_lock); list_splice_init(&dlm->work_list, &tmp_list); spin_unlock(&dlm->work_lock); + list_for_each_safe(iter, iter2, &tmp_list) { + tot++; + } + mlog(0, "%s: work thread has %d work items\n", dlm->name, tot); + list_for_each_safe(iter, iter2, &tmp_list) { item = list_entry(iter, struct dlm_work_item, list); workfunc = item->func; @@ -220,6 +257,52 @@ void dlm_complete_recovery_thread(struct dlm_ctxt *dlm) * */ +static void dlm_print_reco_node_status(struct dlm_ctxt *dlm) +{ + struct dlm_reco_node_data *ndata; + struct dlm_lock_resource *res; + + mlog(ML_NOTICE, "%s(%d): recovery info, state=%s, dead=%u, master=%u\n", + dlm->name, dlm->dlm_reco_thread_task->pid, + dlm->reco.state & DLM_RECO_STATE_ACTIVE ? "ACTIVE" : "inactive", + dlm->reco.dead_node, dlm->reco.new_master); + + list_for_each_entry(ndata, &dlm->reco.node_data, list) { + char *st = "unknown"; + switch (ndata->state) { + case DLM_RECO_NODE_DATA_INIT: + st = "init"; + break; + case DLM_RECO_NODE_DATA_REQUESTING: + st = "requesting"; + break; + case DLM_RECO_NODE_DATA_DEAD: + st = "dead"; + break; + case DLM_RECO_NODE_DATA_RECEIVING: + st = "receiving"; + break; + case DLM_RECO_NODE_DATA_REQUESTED: + st = "requested"; + break; + case DLM_RECO_NODE_DATA_DONE: + st = "done"; + break; + case DLM_RECO_NODE_DATA_FINALIZE_SENT: + st = "finalize-sent"; + break; + default: + st = "bad"; + break; + } + mlog(ML_NOTICE, "%s: reco state, node %u, state=%s\n", + dlm->name, ndata->node_num, st); + } + list_for_each_entry(res, &dlm->reco.resources, recovering) { + mlog(ML_NOTICE, "%s: lockres %.*s on recovering list\n", + dlm->name, res->lockname.len, res->lockname.name); + } +} #define DLM_RECO_THREAD_TIMEOUT_MS (5 * 1000) @@ -267,11 +350,23 @@ int dlm_is_node_dead(struct dlm_ctxt *dlm, u8 node) { int dead; spin_lock(&dlm->spinlock); - dead = test_bit(node, dlm->domain_map); + dead = !test_bit(node, dlm->domain_map); spin_unlock(&dlm->spinlock); return dead; } +/* returns true if node is no longer in the domain + * could be dead or just not joined */ +static int dlm_is_node_recovered(struct dlm_ctxt *dlm, u8 node) +{ + int recovered; + spin_lock(&dlm->spinlock); + recovered = !test_bit(node, dlm->recovery_map); + spin_unlock(&dlm->spinlock); + return recovered; +} + + int dlm_wait_for_node_death(struct dlm_ctxt *dlm, u8 node, int timeout) { if (timeout) { @@ -290,6 +385,24 @@ int dlm_wait_for_node_death(struct dlm_ctxt *dlm, u8 node, int timeout) return 0; } +int dlm_wait_for_node_recovery(struct dlm_ctxt *dlm, u8 node, int timeout) +{ + if (timeout) { + mlog(0, "%s: waiting %dms for notification of " + "recovery of node %u\n", dlm->name, timeout, node); + wait_event_timeout(dlm->dlm_reco_thread_wq, + dlm_is_node_recovered(dlm, node), + msecs_to_jiffies(timeout)); + } else { + mlog(0, "%s: waiting indefinitely for notification " + "of recovery of node %u\n", dlm->name, node); + wait_event(dlm->dlm_reco_thread_wq, + dlm_is_node_recovered(dlm, node)); + } + /* for now, return 0 */ + return 0; +} + /* callers of the top-level api calls (dlmlock/dlmunlock) should * block on the dlm->reco.event when recovery is in progress. * the dlm recovery thread will set this state when it begins @@ -308,6 +421,13 @@ static int dlm_in_recovery(struct dlm_ctxt *dlm) void dlm_wait_for_recovery(struct dlm_ctxt *dlm) { + if (dlm_in_recovery(dlm)) { + mlog(0, "%s: reco thread %d in recovery: " + "state=%d, master=%u, dead=%u\n", + dlm->name, dlm->dlm_reco_thread_task->pid, + dlm->reco.state, dlm->reco.new_master, + dlm->reco.dead_node); + } wait_event(dlm->reco.event, !dlm_in_recovery(dlm)); } @@ -341,7 +461,7 @@ static int dlm_do_recovery(struct dlm_ctxt *dlm) mlog(0, "new master %u died while recovering %u!\n", dlm->reco.new_master, dlm->reco.dead_node); /* unset the new_master, leave dead_node */ - dlm->reco.new_master = O2NM_INVALID_NODE_NUM; + dlm_set_reco_master(dlm, O2NM_INVALID_NODE_NUM); } /* select a target to recover */ @@ -350,14 +470,14 @@ static int dlm_do_recovery(struct dlm_ctxt *dlm) bit = find_next_bit (dlm->recovery_map, O2NM_MAX_NODES+1, 0); if (bit >= O2NM_MAX_NODES || bit < 0) - dlm->reco.dead_node = O2NM_INVALID_NODE_NUM; + dlm_set_reco_dead_node(dlm, O2NM_INVALID_NODE_NUM); else - dlm->reco.dead_node = bit; + dlm_set_reco_dead_node(dlm, bit); } else if (!test_bit(dlm->reco.dead_node, dlm->recovery_map)) { /* BUG? */ mlog(ML_ERROR, "dead_node %u no longer in recovery map!\n", dlm->reco.dead_node); - dlm->reco.dead_node = O2NM_INVALID_NODE_NUM; + dlm_set_reco_dead_node(dlm, O2NM_INVALID_NODE_NUM); } if (dlm->reco.dead_node == O2NM_INVALID_NODE_NUM) { @@ -366,7 +486,8 @@ static int dlm_do_recovery(struct dlm_ctxt *dlm) /* return to main thread loop and sleep. */ return 0; } - mlog(0, "recovery thread found node %u in the recovery map!\n", + mlog(0, "%s(%d):recovery thread found node %u in the recovery map!\n", + dlm->name, dlm->dlm_reco_thread_task->pid, dlm->reco.dead_node); spin_unlock(&dlm->spinlock); @@ -389,8 +510,8 @@ static int dlm_do_recovery(struct dlm_ctxt *dlm) } mlog(0, "another node will master this recovery session.\n"); } - mlog(0, "dlm=%s, new_master=%u, this node=%u, dead_node=%u\n", - dlm->name, dlm->reco.new_master, + mlog(0, "dlm=%s (%d), new_master=%u, this node=%u, dead_node=%u\n", + dlm->name, dlm->dlm_reco_thread_task->pid, dlm->reco.new_master, dlm->node_num, dlm->reco.dead_node); /* it is safe to start everything back up here @@ -402,11 +523,13 @@ static int dlm_do_recovery(struct dlm_ctxt *dlm) return 0; master_here: - mlog(0, "mastering recovery of %s:%u here(this=%u)!\n", + mlog(0, "(%d) mastering recovery of %s:%u here(this=%u)!\n", + dlm->dlm_reco_thread_task->pid, dlm->name, dlm->reco.dead_node, dlm->node_num); status = dlm_remaster_locks(dlm, dlm->reco.dead_node); if (status < 0) { + /* we should never hit this anymore */ mlog(ML_ERROR, "error %d remastering locks for node %u, " "retrying.\n", status, dlm->reco.dead_node); /* yield a bit to allow any final network messages @@ -433,9 +556,16 @@ static int dlm_remaster_locks(struct dlm_ctxt *dlm, u8 dead_node) int destroy = 0; int pass = 0; - status = dlm_init_recovery_area(dlm, dead_node); - if (status < 0) - goto leave; + do { + /* we have become recovery master. there is no escaping + * this, so just keep trying until we get it. */ + status = dlm_init_recovery_area(dlm, dead_node); + if (status < 0) { + mlog(ML_ERROR, "%s: failed to alloc recovery area, " + "retrying\n", dlm->name); + msleep(1000); + } + } while (status != 0); /* safe to access the node data list without a lock, since this * process is the only one to change the list */ @@ -452,16 +582,36 @@ static int dlm_remaster_locks(struct dlm_ctxt *dlm, u8 dead_node) continue; } - status = dlm_request_all_locks(dlm, ndata->node_num, dead_node); - if (status < 0) { - mlog_errno(status); - if (dlm_is_host_down(status)) - ndata->state = DLM_RECO_NODE_DATA_DEAD; - else { - destroy = 1; - goto leave; + do { + status = dlm_request_all_locks(dlm, ndata->node_num, + dead_node); + if (status < 0) { + mlog_errno(status); + if (dlm_is_host_down(status)) { + /* node died, ignore it for recovery */ + status = 0; + ndata->state = DLM_RECO_NODE_DATA_DEAD; + /* wait for the domain map to catch up + * with the network state. */ + wait_event_timeout(dlm->dlm_reco_thread_wq, + dlm_is_node_dead(dlm, + ndata->node_num), + msecs_to_jiffies(1000)); + mlog(0, "waited 1 sec for %u, " + "dead? %s\n", ndata->node_num, + dlm_is_node_dead(dlm, ndata->node_num) ? + "yes" : "no"); + } else { + /* -ENOMEM on the other node */ + mlog(0, "%s: node %u returned " + "%d during recovery, retrying " + "after a short wait\n", + dlm->name, ndata->node_num, + status); + msleep(100); + } } - } + } while (status != 0); switch (ndata->state) { case DLM_RECO_NODE_DATA_INIT: @@ -473,10 +623,9 @@ static int dlm_remaster_locks(struct dlm_ctxt *dlm, u8 dead_node) mlog(0, "node %u died after requesting " "recovery info for node %u\n", ndata->node_num, dead_node); - // start all over - destroy = 1; - status = -EAGAIN; - goto leave; + /* fine. don't need this node's info. + * continue without it. */ + break; case DLM_RECO_NODE_DATA_REQUESTING: ndata->state = DLM_RECO_NODE_DATA_REQUESTED; mlog(0, "now receiving recovery data from " @@ -520,35 +669,26 @@ static int dlm_remaster_locks(struct dlm_ctxt *dlm, u8 dead_node) BUG(); break; case DLM_RECO_NODE_DATA_DEAD: - mlog(ML_NOTICE, "node %u died after " + mlog(0, "node %u died after " "requesting recovery info for " "node %u\n", ndata->node_num, dead_node); - spin_unlock(&dlm_reco_state_lock); - // start all over - destroy = 1; - status = -EAGAIN; - /* instead of spinning like crazy here, - * wait for the domain map to catch up - * with the network state. otherwise this - * can be hit hundreds of times before - * the node is really seen as dead. */ - wait_event_timeout(dlm->dlm_reco_thread_wq, - dlm_is_node_dead(dlm, - ndata->node_num), - msecs_to_jiffies(1000)); - mlog(0, "waited 1 sec for %u, " - "dead? %s\n", ndata->node_num, - dlm_is_node_dead(dlm, ndata->node_num) ? - "yes" : "no"); - goto leave; + break; case DLM_RECO_NODE_DATA_RECEIVING: case DLM_RECO_NODE_DATA_REQUESTED: + mlog(0, "%s: node %u still in state %s\n", + dlm->name, ndata->node_num, + ndata->state==DLM_RECO_NODE_DATA_RECEIVING ? + "receiving" : "requested"); all_nodes_done = 0; break; case DLM_RECO_NODE_DATA_DONE: + mlog(0, "%s: node %u state is done\n", + dlm->name, ndata->node_num); break; case DLM_RECO_NODE_DATA_FINALIZE_SENT: + mlog(0, "%s: node %u state is finalize\n", + dlm->name, ndata->node_num); break; } } @@ -578,7 +718,7 @@ static int dlm_remaster_locks(struct dlm_ctxt *dlm, u8 dead_node) jiffies, dlm->reco.dead_node, dlm->node_num, dlm->reco.new_master); destroy = 1; - status = ret; + status = 0; /* rescan everything marked dirty along the way */ dlm_kick_thread(dlm, NULL); break; @@ -591,7 +731,6 @@ static int dlm_remaster_locks(struct dlm_ctxt *dlm, u8 dead_node) } -leave: if (destroy) dlm_destroy_recovery_area(dlm, dead_node); @@ -617,7 +756,7 @@ static int dlm_init_recovery_area(struct dlm_ctxt *dlm, u8 dead_node) } BUG_ON(num == dead_node); - ndata = kcalloc(1, sizeof(*ndata), GFP_KERNEL); + ndata = kcalloc(1, sizeof(*ndata), GFP_NOFS); if (!ndata) { dlm_destroy_recovery_area(dlm, dead_node); return -ENOMEM; @@ -691,16 +830,25 @@ int dlm_request_all_locks_handler(struct o2net_msg *msg, u32 len, void *data) if (!dlm_grab(dlm)) return -EINVAL; + if (lr->dead_node != dlm->reco.dead_node) { + mlog(ML_ERROR, "%s: node %u sent dead_node=%u, but local " + "dead_node is %u\n", dlm->name, lr->node_idx, + lr->dead_node, dlm->reco.dead_node); + dlm_print_reco_node_status(dlm); + /* this is a hack */ + dlm_put(dlm); + return -ENOMEM; + } BUG_ON(lr->dead_node != dlm->reco.dead_node); - item = kcalloc(1, sizeof(*item), GFP_KERNEL); + item = kcalloc(1, sizeof(*item), GFP_NOFS); if (!item) { dlm_put(dlm); return -ENOMEM; } /* this will get freed by dlm_request_all_locks_worker */ - buf = (char *) __get_free_page(GFP_KERNEL); + buf = (char *) __get_free_page(GFP_NOFS); if (!buf) { kfree(item); dlm_put(dlm); @@ -715,7 +863,7 @@ int dlm_request_all_locks_handler(struct o2net_msg *msg, u32 len, void *data) spin_lock(&dlm->work_lock); list_add_tail(&item->list, &dlm->work_list); spin_unlock(&dlm->work_lock); - schedule_work(&dlm->dispatched_work); + queue_work(dlm->dlm_worker, &dlm->dispatched_work); dlm_put(dlm); return 0; @@ -730,32 +878,34 @@ static void dlm_request_all_locks_worker(struct dlm_work_item *item, void *data) struct list_head *iter; int ret; u8 dead_node, reco_master; + int skip_all_done = 0; dlm = item->dlm; dead_node = item->u.ral.dead_node; reco_master = item->u.ral.reco_master; mres = (struct dlm_migratable_lockres *)data; + mlog(0, "%s: recovery worker started, dead=%u, master=%u\n", + dlm->name, dead_node, reco_master); + if (dead_node != dlm->reco.dead_node || reco_master != dlm->reco.new_master) { - /* show extra debug info if the recovery state is messed */ - mlog(ML_ERROR, "%s: bad reco state: reco(dead=%u, master=%u), " - "request(dead=%u, master=%u)\n", - dlm->name, dlm->reco.dead_node, dlm->reco.new_master, - dead_node, reco_master); - mlog(ML_ERROR, "%s: name=%.*s master=%u locks=%u/%u flags=%u " - "entry[0]={c=%u:%llu,l=%u,f=%u,t=%d,ct=%d,hb=%d,n=%u}\n", - dlm->name, mres->lockname_len, mres->lockname, mres->master, - mres->num_locks, mres->total_locks, mres->flags, - dlm_get_lock_cookie_node(mres->ml[0].cookie), - dlm_get_lock_cookie_seq(mres->ml[0].cookie), - mres->ml[0].list, mres->ml[0].flags, - mres->ml[0].type, mres->ml[0].convert_type, - mres->ml[0].highest_blocked, mres->ml[0].node); - BUG(); + /* worker could have been created before the recovery master + * died. if so, do not continue, but do not error. */ + if (dlm->reco.new_master == O2NM_INVALID_NODE_NUM) { + mlog(ML_NOTICE, "%s: will not send recovery state, " + "recovery master %u died, thread=(dead=%u,mas=%u)" + " current=(dead=%u,mas=%u)\n", dlm->name, + reco_master, dead_node, reco_master, + dlm->reco.dead_node, dlm->reco.new_master); + } else { + mlog(ML_NOTICE, "%s: reco state invalid: reco(dead=%u, " + "master=%u), request(dead=%u, master=%u)\n", + dlm->name, dlm->reco.dead_node, + dlm->reco.new_master, dead_node, reco_master); + } + goto leave; } - BUG_ON(dead_node != dlm->reco.dead_node); - BUG_ON(reco_master != dlm->reco.new_master); /* lock resources should have already been moved to the * dlm->reco.resources list. now move items from that list @@ -766,12 +916,20 @@ static void dlm_request_all_locks_worker(struct dlm_work_item *item, void *data) dlm_move_reco_locks_to_list(dlm, &resources, dead_node); /* now we can begin blasting lockreses without the dlm lock */ + + /* any errors returned will be due to the new_master dying, + * the dlm_reco_thread should detect this */ list_for_each(iter, &resources) { res = list_entry (iter, struct dlm_lock_resource, recovering); ret = dlm_send_one_lockres(dlm, res, mres, reco_master, DLM_MRES_RECOVERY); - if (ret < 0) - mlog_errno(ret); + if (ret < 0) { + mlog(ML_ERROR, "%s: node %u went down while sending " + "recovery state for dead node %u, ret=%d\n", dlm->name, + reco_master, dead_node, ret); + skip_all_done = 1; + break; + } } /* move the resources back to the list */ @@ -779,10 +937,15 @@ static void dlm_request_all_locks_worker(struct dlm_work_item *item, void *data) list_splice_init(&resources, &dlm->reco.resources); spin_unlock(&dlm->spinlock); - ret = dlm_send_all_done_msg(dlm, dead_node, reco_master); - if (ret < 0) - mlog_errno(ret); - + if (!skip_all_done) { + ret = dlm_send_all_done_msg(dlm, dead_node, reco_master); + if (ret < 0) { + mlog(ML_ERROR, "%s: node %u went down while sending " + "recovery all-done for dead node %u, ret=%d\n", + dlm->name, reco_master, dead_node, ret); + } + } +leave: free_page((unsigned long)data); } @@ -801,8 +964,14 @@ static int dlm_send_all_done_msg(struct dlm_ctxt *dlm, u8 dead_node, u8 send_to) ret = o2net_send_message(DLM_RECO_DATA_DONE_MSG, dlm->key, &done_msg, sizeof(done_msg), send_to, &tmpret); - /* negative status is ignored by the caller */ - if (ret >= 0) + if (ret < 0) { + if (!dlm_is_host_down(ret)) { + mlog_errno(ret); + mlog(ML_ERROR, "%s: unknown error sending data-done " + "to %u\n", dlm->name, send_to); + BUG(); + } + } else ret = tmpret; return ret; } @@ -822,7 +991,11 @@ int dlm_reco_data_done_handler(struct o2net_msg *msg, u32 len, void *data) mlog(0, "got DATA DONE: dead_node=%u, reco.dead_node=%u, " "node_idx=%u, this node=%u\n", done->dead_node, dlm->reco.dead_node, done->node_idx, dlm->node_num); - BUG_ON(done->dead_node != dlm->reco.dead_node); + + mlog_bug_on_msg((done->dead_node != dlm->reco.dead_node), + "Got DATA DONE: dead_node=%u, reco.dead_node=%u, " + "node_idx=%u, this node=%u\n", done->dead_node, + dlm->reco.dead_node, done->node_idx, dlm->node_num); spin_lock(&dlm_reco_state_lock); list_for_each(iter, &dlm->reco.node_data) { @@ -905,13 +1078,11 @@ static void dlm_move_reco_locks_to_list(struct dlm_ctxt *dlm, mlog(0, "found lockres owned by dead node while " "doing recovery for node %u. sending it.\n", dead_node); - list_del_init(&res->recovering); - list_add_tail(&res->recovering, list); + list_move_tail(&res->recovering, list); } else if (res->owner == DLM_LOCK_RES_OWNER_UNKNOWN) { mlog(0, "found UNKNOWN owner while doing recovery " "for node %u. sending it.\n", dead_node); - list_del_init(&res->recovering); - list_add_tail(&res->recovering, list); + list_move_tail(&res->recovering, list); } } spin_unlock(&dlm->spinlock); @@ -1023,8 +1194,9 @@ static int dlm_add_lock_to_array(struct dlm_lock *lock, ml->type == LKM_PRMODE) { /* if it is already set, this had better be a PR * and it has to match */ - if (mres->lvb[0] && (ml->type == LKM_EXMODE || - memcmp(mres->lvb, lock->lksb->lvb, DLM_LVB_LEN))) { + if (!dlm_lvb_is_empty(mres->lvb) && + (ml->type == LKM_EXMODE || + memcmp(mres->lvb, lock->lksb->lvb, DLM_LVB_LEN))) { mlog(ML_ERROR, "mismatched lvbs!\n"); __dlm_print_one_lock_resource(lock->lockres); BUG(); @@ -1083,22 +1255,25 @@ int dlm_send_one_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, * we must send it immediately. */ ret = dlm_send_mig_lockres_msg(dlm, mres, send_to, res, total_locks); - if (ret < 0) { - // TODO - mlog(ML_ERROR, "dlm_send_mig_lockres_msg " - "returned %d, TODO\n", ret); - BUG(); - } + if (ret < 0) + goto error; } } /* flush any remaining locks */ ret = dlm_send_mig_lockres_msg(dlm, mres, send_to, res, total_locks); - if (ret < 0) { - // TODO - mlog(ML_ERROR, "dlm_send_mig_lockres_msg returned %d, " - "TODO\n", ret); + if (ret < 0) + goto error; + return ret; + +error: + mlog(ML_ERROR, "%s: dlm_send_mig_lockres_msg returned %d\n", + dlm->name, ret); + if (!dlm_is_host_down(ret)) BUG(); - } + mlog(0, "%s: node %u went down while sending %s " + "lockres %.*s\n", dlm->name, send_to, + flags & DLM_MRES_RECOVERY ? "recovery" : "migration", + res->lockname.len, res->lockname.name); return ret; } @@ -1146,8 +1321,8 @@ int dlm_mig_lockres_handler(struct o2net_msg *msg, u32 len, void *data) mlog(0, "all done flag. all lockres data received!\n"); ret = -ENOMEM; - buf = kmalloc(be16_to_cpu(msg->data_len), GFP_KERNEL); - item = kcalloc(1, sizeof(*item), GFP_KERNEL); + buf = kmalloc(be16_to_cpu(msg->data_len), GFP_NOFS); + item = kcalloc(1, sizeof(*item), GFP_NOFS); if (!buf || !item) goto leave; @@ -1238,7 +1413,7 @@ int dlm_mig_lockres_handler(struct o2net_msg *msg, u32 len, void *data) spin_lock(&dlm->work_lock); list_add_tail(&item->list, &dlm->work_list); spin_unlock(&dlm->work_lock); - schedule_work(&dlm->dispatched_work); + queue_work(dlm->dlm_worker, &dlm->dispatched_work); leave: dlm_put(dlm); @@ -1312,8 +1487,9 @@ leave: -int dlm_lockres_master_requery(struct dlm_ctxt *dlm, - struct dlm_lock_resource *res, u8 *real_master) +static int dlm_lockres_master_requery(struct dlm_ctxt *dlm, + struct dlm_lock_resource *res, + u8 *real_master) { struct dlm_node_iter iter; int nodenum; @@ -1406,6 +1582,7 @@ int dlm_master_requery_handler(struct o2net_msg *msg, u32 len, void *data) struct dlm_ctxt *dlm = data; struct dlm_master_requery *req = (struct dlm_master_requery *)msg->buf; struct dlm_lock_resource *res = NULL; + unsigned int hash; int master = DLM_LOCK_RES_OWNER_UNKNOWN; u32 flags = DLM_ASSERT_MASTER_REQUERY; @@ -1415,8 +1592,10 @@ int dlm_master_requery_handler(struct o2net_msg *msg, u32 len, void *data) return master; } + hash = dlm_lockid_hash(req->name, req->namelen); + spin_lock(&dlm->spinlock); - res = __dlm_lookup_lockres(dlm, req->name, req->namelen); + res = __dlm_lookup_lockres(dlm, req->name, req->namelen, hash); if (res) { spin_lock(&res->spinlock); master = res->owner; @@ -1483,7 +1662,7 @@ static int dlm_process_recovery_data(struct dlm_ctxt *dlm, struct dlm_lock *newlock = NULL; struct dlm_lockstatus *lksb = NULL; int ret = 0; - int i; + int i, bad; struct list_head *iter; struct dlm_lock *lock = NULL; @@ -1529,8 +1708,7 @@ static int dlm_process_recovery_data(struct dlm_ctxt *dlm, /* move the lock to its proper place */ /* do not alter lock refcount. switching lists. */ - list_del_init(&lock->list); - list_add_tail(&lock->list, queue); + list_move_tail(&lock->list, queue); spin_unlock(&res->spinlock); mlog(0, "just reordered a local lock!\n"); @@ -1553,28 +1731,48 @@ static int dlm_process_recovery_data(struct dlm_ctxt *dlm, } lksb->flags |= (ml->flags & (DLM_LKSB_PUT_LVB|DLM_LKSB_GET_LVB)); - - if (mres->lvb[0]) { + + if (ml->type == LKM_NLMODE) + goto skip_lvb; + + if (!dlm_lvb_is_empty(mres->lvb)) { if (lksb->flags & DLM_LKSB_PUT_LVB) { /* other node was trying to update * lvb when node died. recreate the * lksb with the updated lvb. */ memcpy(lksb->lvb, mres->lvb, DLM_LVB_LEN); + /* the lock resource lvb update must happen + * NOW, before the spinlock is dropped. + * we no longer wait for the AST to update + * the lvb. */ + memcpy(res->lvb, mres->lvb, DLM_LVB_LEN); } else { /* otherwise, the node is sending its * most recent valid lvb info */ BUG_ON(ml->type != LKM_EXMODE && ml->type != LKM_PRMODE); - if (res->lvb[0] && (ml->type == LKM_EXMODE || - memcmp(res->lvb, mres->lvb, DLM_LVB_LEN))) { - mlog(ML_ERROR, "received bad lvb!\n"); - __dlm_print_one_lock_resource(res); - BUG(); + if (!dlm_lvb_is_empty(res->lvb) && + (ml->type == LKM_EXMODE || + memcmp(res->lvb, mres->lvb, DLM_LVB_LEN))) { + int i; + mlog(ML_ERROR, "%s:%.*s: received bad " + "lvb! type=%d\n", dlm->name, + res->lockname.len, + res->lockname.name, ml->type); + printk("lockres lvb=["); + for (i=0; ilvb[i]); + printk("]\nmigrated lvb=["); + for (i=0; ilvb[i]); + printk("]\n"); + dlm_print_one_lock_resource(res); + BUG(); } memcpy(res->lvb, mres->lvb, DLM_LVB_LEN); } } - +skip_lvb: /* NOTE: * wrt lock queue ordering and recovery: @@ -1592,9 +1790,33 @@ static int dlm_process_recovery_data(struct dlm_ctxt *dlm, * relative to each other, but clearly *not* * preserved relative to locks from other nodes. */ + bad = 0; spin_lock(&res->spinlock); - dlm_lock_get(newlock); - list_add_tail(&newlock->list, queue); + list_for_each_entry(lock, queue, list) { + if (lock->ml.cookie == ml->cookie) { + u64 c = lock->ml.cookie; + mlog(ML_ERROR, "%s:%.*s: %u:%llu: lock already " + "exists on this lockres!\n", dlm->name, + res->lockname.len, res->lockname.name, + dlm_get_lock_cookie_node(c), + dlm_get_lock_cookie_seq(c)); + + mlog(ML_NOTICE, "sent lock: type=%d, conv=%d, " + "node=%u, cookie=%u:%llu, queue=%d\n", + ml->type, ml->convert_type, ml->node, + dlm_get_lock_cookie_node(ml->cookie), + dlm_get_lock_cookie_seq(ml->cookie), + ml->list); + + __dlm_print_one_lock_resource(res); + bad = 1; + break; + } + } + if (!bad) { + dlm_lock_get(newlock); + list_add_tail(&newlock->list, queue); + } spin_unlock(&res->spinlock); } mlog(0, "done running all the locks\n"); @@ -1618,8 +1840,14 @@ void dlm_move_lockres_to_recovery_list(struct dlm_ctxt *dlm, struct dlm_lock *lock; res->state |= DLM_LOCK_RES_RECOVERING; - if (!list_empty(&res->recovering)) + if (!list_empty(&res->recovering)) { + mlog(0, + "Recovering res %s:%.*s, is already on recovery list!\n", + dlm->name, res->lockname.len, res->lockname.name); list_del_init(&res->recovering); + } + /* We need to hold a reference while on the recovery list */ + dlm_lockres_get(res); list_add_tail(&res->recovering, &dlm->reco.resources); /* find any pending locks and put them back on proper list */ @@ -1708,9 +1936,11 @@ static void dlm_finish_local_lockres_recovery(struct dlm_ctxt *dlm, spin_lock(&res->spinlock); dlm_change_lockres_owner(dlm, res, new_master); res->state &= ~DLM_LOCK_RES_RECOVERING; - __dlm_dirty_lockres(dlm, res); + if (!__dlm_lockres_unused(res)) + __dlm_dirty_lockres(dlm, res); spin_unlock(&res->spinlock); wake_up(&res->wq); + dlm_lockres_put(res); } } @@ -1719,7 +1949,7 @@ static void dlm_finish_local_lockres_recovery(struct dlm_ctxt *dlm, * the RECOVERING state and set the owner * if necessary */ for (i = 0; i < DLM_HASH_BUCKETS; i++) { - bucket = &(dlm->lockres_hash[i]); + bucket = dlm_lockres_hash(dlm, i); hlist_for_each_entry(res, hash_iter, bucket, hash_node) { if (res->state & DLM_LOCK_RES_RECOVERING) { if (res->owner == dead_node) { @@ -1743,11 +1973,13 @@ static void dlm_finish_local_lockres_recovery(struct dlm_ctxt *dlm, dlm->name, res->lockname.len, res->lockname.name, res->owner); list_del_init(&res->recovering); + dlm_lockres_put(res); } spin_lock(&res->spinlock); dlm_change_lockres_owner(dlm, res, new_master); res->state &= ~DLM_LOCK_RES_RECOVERING; - __dlm_dirty_lockres(dlm, res); + if (!__dlm_lockres_unused(res)) + __dlm_dirty_lockres(dlm, res); spin_unlock(&res->spinlock); wake_up(&res->wq); } @@ -1884,7 +2116,7 @@ static void dlm_do_local_recovery_cleanup(struct dlm_ctxt *dlm, u8 dead_node) * need to be fired as a result. */ for (i = 0; i < DLM_HASH_BUCKETS; i++) { - bucket = &(dlm->lockres_hash[i]); + bucket = dlm_lockres_hash(dlm, i); hlist_for_each_entry(res, iter, bucket, hash_node) { /* always prune any $RECOVERY entries for dead nodes, * otherwise hangs can occur during later recovery */ @@ -1924,6 +2156,20 @@ static void __dlm_hb_node_down(struct dlm_ctxt *dlm, int idx) { assert_spin_locked(&dlm->spinlock); + if (dlm->reco.new_master == idx) { + mlog(0, "%s: recovery master %d just died\n", + dlm->name, idx); + if (dlm->reco.state & DLM_RECO_STATE_FINALIZE) { + /* finalize1 was reached, so it is safe to clear + * the new_master and dead_node. that recovery + * is complete. */ + mlog(0, "%s: dead master %d had reached " + "finalize1 state, clearing\n", dlm->name, idx); + dlm->reco.state &= ~DLM_RECO_STATE_FINALIZE; + __dlm_reset_recovery(dlm); + } + } + /* check to see if the node is already considered dead */ if (!test_bit(idx, dlm->live_nodes_map)) { mlog(0, "for domain %s, node %d is already dead. " @@ -2087,7 +2333,7 @@ again: /* set the new_master to this node */ spin_lock(&dlm->spinlock); - dlm->reco.new_master = dlm->node_num; + dlm_set_reco_master(dlm, dlm->node_num); spin_unlock(&dlm->spinlock); } @@ -2125,6 +2371,10 @@ again: mlog(0, "%s: reco master %u is ready to recover %u\n", dlm->name, dlm->reco.new_master, dlm->reco.dead_node); status = -EEXIST; + } else if (ret == DLM_RECOVERING) { + mlog(0, "dlm=%s dlmlock says master node died (this=%u)\n", + dlm->name, dlm->node_num); + goto again; } else { struct dlm_lock_resource *res; @@ -2156,7 +2406,7 @@ static int dlm_send_begin_reco_message(struct dlm_ctxt *dlm, u8 dead_node) mlog_entry("%u\n", dead_node); - mlog(0, "dead node is %u\n", dead_node); + mlog(0, "%s: dead node is %u\n", dlm->name, dead_node); spin_lock(&dlm->spinlock); dlm_node_iter_init(dlm->domain_map, &iter); @@ -2214,6 +2464,14 @@ retry: * another ENOMEM */ msleep(100); goto retry; + } else if (ret == EAGAIN) { + mlog(0, "%s: trying to start recovery of node " + "%u, but node %u is waiting for last recovery " + "to complete, backoff for a bit\n", dlm->name, + dead_node, nodenum); + /* TODO Look into replacing msleep with cond_resched() */ + msleep(100); + goto retry; } } @@ -2229,8 +2487,20 @@ int dlm_begin_reco_handler(struct o2net_msg *msg, u32 len, void *data) if (!dlm_grab(dlm)) return 0; - mlog(0, "node %u wants to recover node %u\n", - br->node_idx, br->dead_node); + spin_lock(&dlm->spinlock); + if (dlm->reco.state & DLM_RECO_STATE_FINALIZE) { + mlog(0, "%s: node %u wants to recover node %u (%u:%u) " + "but this node is in finalize state, waiting on finalize2\n", + dlm->name, br->node_idx, br->dead_node, + dlm->reco.dead_node, dlm->reco.new_master); + spin_unlock(&dlm->spinlock); + return EAGAIN; + } + spin_unlock(&dlm->spinlock); + + mlog(0, "%s: node %u wants to recover node %u (%u:%u)\n", + dlm->name, br->node_idx, br->dead_node, + dlm->reco.dead_node, dlm->reco.new_master); dlm_fire_domain_eviction_callbacks(dlm, br->dead_node); @@ -2252,8 +2522,8 @@ int dlm_begin_reco_handler(struct o2net_msg *msg, u32 len, void *data) "node %u changing it to %u\n", dlm->name, dlm->reco.dead_node, br->node_idx, br->dead_node); } - dlm->reco.new_master = br->node_idx; - dlm->reco.dead_node = br->dead_node; + dlm_set_reco_master(dlm, br->node_idx); + dlm_set_reco_dead_node(dlm, br->dead_node); if (!test_bit(br->dead_node, dlm->recovery_map)) { mlog(0, "recovery master %u sees %u as dead, but this " "node has not yet. marking %u as dead\n", @@ -2272,10 +2542,16 @@ int dlm_begin_reco_handler(struct o2net_msg *msg, u32 len, void *data) spin_unlock(&dlm->spinlock); dlm_kick_recovery_thread(dlm); + + mlog(0, "%s: recovery started by node %u, for %u (%u:%u)\n", + dlm->name, br->node_idx, br->dead_node, + dlm->reco.dead_node, dlm->reco.new_master); + dlm_put(dlm); return 0; } +#define DLM_FINALIZE_STAGE2 0x01 static int dlm_send_finalize_reco_message(struct dlm_ctxt *dlm) { int ret = 0; @@ -2283,25 +2559,31 @@ static int dlm_send_finalize_reco_message(struct dlm_ctxt *dlm) struct dlm_node_iter iter; int nodenum; int status; + int stage = 1; - mlog(0, "finishing recovery for node %s:%u\n", - dlm->name, dlm->reco.dead_node); + mlog(0, "finishing recovery for node %s:%u, " + "stage %d\n", dlm->name, dlm->reco.dead_node, stage); spin_lock(&dlm->spinlock); dlm_node_iter_init(dlm->domain_map, &iter); spin_unlock(&dlm->spinlock); +stage2: memset(&fr, 0, sizeof(fr)); fr.node_idx = dlm->node_num; fr.dead_node = dlm->reco.dead_node; + if (stage == 2) + fr.flags |= DLM_FINALIZE_STAGE2; while ((nodenum = dlm_node_iter_next(&iter)) >= 0) { if (nodenum == dlm->node_num) continue; ret = o2net_send_message(DLM_FINALIZE_RECO_MSG, dlm->key, &fr, sizeof(fr), nodenum, &status); - if (ret >= 0) { + if (ret >= 0) ret = status; + if (ret < 0) { + mlog_errno(ret); if (dlm_is_host_down(ret)) { /* this has no effect on this recovery * session, so set the status to zero to @@ -2309,13 +2591,17 @@ static int dlm_send_finalize_reco_message(struct dlm_ctxt *dlm) mlog(ML_ERROR, "node %u went down after this " "node finished recovery.\n", nodenum); ret = 0; + continue; } - } - if (ret < 0) { - mlog_errno(ret); break; } } + if (stage == 1) { + /* reset the node_iter back to the top and send finalize2 */ + iter.curnode = -1; + stage = 2; + goto stage2; + } return ret; } @@ -2324,14 +2610,19 @@ int dlm_finalize_reco_handler(struct o2net_msg *msg, u32 len, void *data) { struct dlm_ctxt *dlm = data; struct dlm_finalize_reco *fr = (struct dlm_finalize_reco *)msg->buf; + int stage = 1; /* ok to return 0, domain has gone away */ if (!dlm_grab(dlm)) return 0; - mlog(0, "node %u finalizing recovery of node %u\n", - fr->node_idx, fr->dead_node); + if (fr->flags & DLM_FINALIZE_STAGE2) + stage = 2; + mlog(0, "%s: node %u finalizing recovery stage%d of " + "node %u (%u:%u)\n", dlm->name, fr->node_idx, stage, + fr->dead_node, dlm->reco.dead_node, dlm->reco.new_master); + spin_lock(&dlm->spinlock); if (dlm->reco.new_master != fr->node_idx) { @@ -2347,13 +2638,41 @@ int dlm_finalize_reco_handler(struct o2net_msg *msg, u32 len, void *data) BUG(); } - dlm_finish_local_lockres_recovery(dlm, fr->dead_node, fr->node_idx); - - spin_unlock(&dlm->spinlock); + switch (stage) { + case 1: + dlm_finish_local_lockres_recovery(dlm, fr->dead_node, fr->node_idx); + if (dlm->reco.state & DLM_RECO_STATE_FINALIZE) { + mlog(ML_ERROR, "%s: received finalize1 from " + "new master %u for dead node %u, but " + "this node has already received it!\n", + dlm->name, fr->node_idx, fr->dead_node); + dlm_print_reco_node_status(dlm); + BUG(); + } + dlm->reco.state |= DLM_RECO_STATE_FINALIZE; + spin_unlock(&dlm->spinlock); + break; + case 2: + if (!(dlm->reco.state & DLM_RECO_STATE_FINALIZE)) { + mlog(ML_ERROR, "%s: received finalize2 from " + "new master %u for dead node %u, but " + "this node did not have finalize1!\n", + dlm->name, fr->node_idx, fr->dead_node); + dlm_print_reco_node_status(dlm); + BUG(); + } + dlm->reco.state &= ~DLM_RECO_STATE_FINALIZE; + spin_unlock(&dlm->spinlock); + dlm_reset_recovery(dlm); + dlm_kick_recovery_thread(dlm); + break; + default: + BUG(); + } - dlm_reset_recovery(dlm); + mlog(0, "%s: recovery done, reco master was %u, dead now %u, master now %u\n", + dlm->name, fr->node_idx, dlm->reco.dead_node, dlm->reco.new_master); - dlm_kick_recovery_thread(dlm); dlm_put(dlm); return 0; } diff --git a/fs/ocfs2/dlm/dlmthread.c b/fs/ocfs2/dlm/dlmthread.c index 5be9d14f1..0c822f3ff 100644 --- a/fs/ocfs2/dlm/dlmthread.c +++ b/fs/ocfs2/dlm/dlmthread.c @@ -39,6 +39,7 @@ #include #include #include +#include #include "cluster/heartbeat.h" @@ -53,6 +54,8 @@ #include "cluster/masklog.h" static int dlm_thread(void *data); +static void dlm_purge_lockres_now(struct dlm_ctxt *dlm, + struct dlm_lock_resource *lockres); static void dlm_flush_asts(struct dlm_ctxt *dlm); @@ -80,7 +83,7 @@ repeat: } -static int __dlm_lockres_unused(struct dlm_lock_resource *res) +int __dlm_lockres_unused(struct dlm_lock_resource *res) { if (list_empty(&res->granted) && list_empty(&res->converting) && @@ -103,6 +106,20 @@ void __dlm_lockres_calc_usage(struct dlm_ctxt *dlm, assert_spin_locked(&res->spinlock); if (__dlm_lockres_unused(res)){ + /* For now, just keep any resource we master */ + if (res->owner == dlm->node_num) + { + if (!list_empty(&res->purge)) { + mlog(0, "we master %s:%.*s, but it is on " + "the purge list. Removing\n", + dlm->name, res->lockname.len, + res->lockname.name); + list_del_init(&res->purge); + dlm->purge_count--; + } + return; + } + if (list_empty(&res->purge)) { mlog(0, "putting lockres %.*s from purge list\n", res->lockname.len, res->lockname.name); @@ -110,10 +127,23 @@ void __dlm_lockres_calc_usage(struct dlm_ctxt *dlm, res->last_used = jiffies; list_add_tail(&res->purge, &dlm->purge_list); dlm->purge_count++; + + /* if this node is not the owner, there is + * no way to keep track of who the owner could be. + * unhash it to avoid serious problems. */ + if (res->owner != dlm->node_num) { + mlog(0, "%s:%.*s: doing immediate " + "purge of lockres owned by %u\n", + dlm->name, res->lockname.len, + res->lockname.name, res->owner); + + dlm_purge_lockres_now(dlm, res); + } } } else if (!list_empty(&res->purge)) { - mlog(0, "removing lockres %.*s from purge list\n", - res->lockname.len, res->lockname.name); + mlog(0, "removing lockres %.*s from purge list, " + "owner=%u\n", res->lockname.len, res->lockname.name, + res->owner); list_del_init(&res->purge); dlm->purge_count--; @@ -165,6 +195,7 @@ again: } else if (ret < 0) { mlog(ML_NOTICE, "lockres %.*s: migrate failed, retrying\n", lockres->lockname.len, lockres->lockname.name); + msleep(100); goto again; } @@ -178,6 +209,24 @@ finish: __dlm_unhash_lockres(lockres); } +/* make an unused lockres go away immediately. + * as soon as the dlm spinlock is dropped, this lockres + * will not be found. kfree still happens on last put. */ +static void dlm_purge_lockres_now(struct dlm_ctxt *dlm, + struct dlm_lock_resource *lockres) +{ + assert_spin_locked(&dlm->spinlock); + assert_spin_locked(&lockres->spinlock); + + BUG_ON(!__dlm_lockres_unused(lockres)); + + if (!list_empty(&lockres->purge)) { + list_del_init(&lockres->purge); + dlm->purge_count--; + } + __dlm_unhash_lockres(lockres); +} + static void dlm_run_purge_list(struct dlm_ctxt *dlm, int purge_now) { @@ -318,8 +367,7 @@ converting: target->ml.type = target->ml.convert_type; target->ml.convert_type = LKM_IVMODE; - list_del_init(&target->list); - list_add_tail(&target->list, &res->granted); + list_move_tail(&target->list, &res->granted); BUG_ON(!target->lksb); target->lksb->status = DLM_NORMAL; @@ -380,8 +428,7 @@ blocked: target->ml.type, target->ml.node); // target->ml.type is already correct - list_del_init(&target->list); - list_add_tail(&target->list, &res->granted); + list_move_tail(&target->list, &res->granted); BUG_ON(!target->lksb); target->lksb->status = DLM_NORMAL; @@ -422,6 +469,8 @@ void __dlm_dirty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) /* don't shuffle secondary queues */ if ((res->owner == dlm->node_num) && !(res->state & DLM_LOCK_RES_DIRTY)) { + /* ref for dirty_list */ + dlm_lockres_get(res); list_add_tail(&res->dirty, &dlm->dirty_list); res->state |= DLM_LOCK_RES_DIRTY; } @@ -606,6 +655,8 @@ static int dlm_thread(void *data) list_del_init(&res->dirty); spin_unlock(&res->spinlock); spin_unlock(&dlm->spinlock); + /* Drop dirty_list ref */ + dlm_lockres_put(res); /* lockres can be re-dirtied/re-added to the * dirty_list in this gap, but that is ok */ @@ -642,8 +693,9 @@ static int dlm_thread(void *data) * spinlock and do NOT have the dlm lock. * safe to reserve/queue asts and run the lists. */ - mlog(0, "calling dlm_shuffle_lists with dlm=%p, " - "res=%p\n", dlm, res); + mlog(0, "calling dlm_shuffle_lists with dlm=%s, " + "res=%.*s\n", dlm->name, + res->lockname.len, res->lockname.name); /* called while holding lockres lock */ dlm_shuffle_lists(dlm, res); @@ -657,6 +709,8 @@ in_progress: /* if the lock was in-progress, stick * it on the back of the list */ if (delay) { + /* ref for dirty_list */ + dlm_lockres_get(res); spin_lock(&res->spinlock); list_add_tail(&res->dirty, &dlm->dirty_list); res->state |= DLM_LOCK_RES_DIRTY; @@ -677,7 +731,7 @@ in_progress: /* yield and continue right away if there is more work to do */ if (!n) { - yield(); + cond_resched(); continue; } diff --git a/fs/ocfs2/dlm/dlmunlock.c b/fs/ocfs2/dlm/dlmunlock.c index 7b1a27542..37be4b2e0 100644 --- a/fs/ocfs2/dlm/dlmunlock.c +++ b/fs/ocfs2/dlm/dlmunlock.c @@ -155,7 +155,7 @@ static enum dlm_status dlmunlock_common(struct dlm_ctxt *dlm, else status = dlm_get_unlock_actions(dlm, res, lock, lksb, &actions); - if (status != DLM_NORMAL) + if (status != DLM_NORMAL && (status != DLM_CANCELGRANT || !master_node)) goto leave; /* By now this has been masked out of cancel requests. */ @@ -183,8 +183,7 @@ static enum dlm_status dlmunlock_common(struct dlm_ctxt *dlm, spin_lock(&lock->spinlock); /* if the master told us the lock was already granted, * let the ast handle all of these actions */ - if (status == DLM_NORMAL && - lksb->status == DLM_CANCELGRANT) { + if (status == DLM_CANCELGRANT) { actions &= ~(DLM_UNLOCK_REMOVE_LOCK| DLM_UNLOCK_REGRANT_LOCK| DLM_UNLOCK_CLEAR_CONVERT_TYPE); @@ -271,8 +270,7 @@ void dlm_commit_pending_unlock(struct dlm_lock_resource *res, void dlm_commit_pending_cancel(struct dlm_lock_resource *res, struct dlm_lock *lock) { - list_del_init(&lock->list); - list_add_tail(&lock->list, &res->granted); + list_move_tail(&lock->list, &res->granted); lock->ml.convert_type = LKM_IVMODE; } @@ -319,6 +317,16 @@ static enum dlm_status dlm_send_remote_unlock_request(struct dlm_ctxt *dlm, mlog_entry("%.*s\n", res->lockname.len, res->lockname.name); + if (owner == dlm->node_num) { + /* ended up trying to contact ourself. this means + * that the lockres had been remote but became local + * via a migration. just retry it, now as local */ + mlog(0, "%s:%.*s: this node became the master due to a " + "migration, re-evaluate now\n", dlm->name, + res->lockname.len, res->lockname.name); + return DLM_FORWARD; + } + memset(&unlock, 0, sizeof(unlock)); unlock.node_idx = dlm->node_num; unlock.flags = cpu_to_be32(flags); @@ -340,14 +348,9 @@ static enum dlm_status dlm_send_remote_unlock_request(struct dlm_ctxt *dlm, vec, veclen, owner, &status); if (tmpret >= 0) { // successfully sent and received - if (status == DLM_CANCELGRANT) - ret = DLM_NORMAL; - else if (status == DLM_FORWARD) { + if (status == DLM_FORWARD) mlog(0, "master was in-progress. retry\n"); - ret = DLM_FORWARD; - } else - ret = status; - lksb->status = status; + ret = status; } else { mlog_errno(tmpret); if (dlm_is_host_down(tmpret)) { @@ -363,7 +366,6 @@ static enum dlm_status dlm_send_remote_unlock_request(struct dlm_ctxt *dlm, /* something bad. this will BUG in ocfs2 */ ret = dlm_err_to_dlm_status(tmpret); } - lksb->status = ret; } return ret; @@ -474,6 +476,10 @@ int dlm_unlock_lock_handler(struct o2net_msg *msg, u32 len, void *data) /* lock was found on queue */ lksb = lock->lksb; + if (flags & (LKM_VALBLK|LKM_PUT_LVB) && + lock->ml.type != LKM_EXMODE) + flags &= ~(LKM_VALBLK|LKM_PUT_LVB); + /* unlockast only called on originating node */ if (flags & LKM_PUT_LVB) { lksb->flags |= DLM_LKSB_PUT_LVB; @@ -498,11 +504,8 @@ not_found: "cookie=%u:%llu\n", dlm_get_lock_cookie_node(unlock->cookie), dlm_get_lock_cookie_seq(unlock->cookie)); - else { - /* send the lksb->status back to the other node */ - status = lksb->status; + else dlm_lock_put(lock); - } leave: if (res) @@ -524,26 +527,22 @@ static enum dlm_status dlm_get_cancel_actions(struct dlm_ctxt *dlm, if (dlm_lock_on_list(&res->blocked, lock)) { /* cancel this outright */ - lksb->status = DLM_NORMAL; status = DLM_NORMAL; *actions = (DLM_UNLOCK_CALL_AST | DLM_UNLOCK_REMOVE_LOCK); } else if (dlm_lock_on_list(&res->converting, lock)) { /* cancel the request, put back on granted */ - lksb->status = DLM_NORMAL; status = DLM_NORMAL; *actions = (DLM_UNLOCK_CALL_AST | DLM_UNLOCK_REMOVE_LOCK | DLM_UNLOCK_REGRANT_LOCK | DLM_UNLOCK_CLEAR_CONVERT_TYPE); } else if (dlm_lock_on_list(&res->granted, lock)) { - /* too late, already granted. DLM_CANCELGRANT */ - lksb->status = DLM_CANCELGRANT; - status = DLM_NORMAL; + /* too late, already granted. */ + status = DLM_CANCELGRANT; *actions = DLM_UNLOCK_CALL_AST; } else { mlog(ML_ERROR, "lock to cancel is not on any list!\n"); - lksb->status = DLM_IVLOCKID; status = DLM_IVLOCKID; *actions = 0; } @@ -560,13 +559,11 @@ static enum dlm_status dlm_get_unlock_actions(struct dlm_ctxt *dlm, /* unlock request */ if (!dlm_lock_on_list(&res->granted, lock)) { - lksb->status = DLM_DENIED; status = DLM_DENIED; dlm_error(status); *actions = 0; } else { /* unlock granted lock */ - lksb->status = DLM_NORMAL; status = DLM_NORMAL; *actions = (DLM_UNLOCK_FREE_LOCK | DLM_UNLOCK_CALL_AST | @@ -623,6 +620,8 @@ retry: spin_lock(&res->spinlock); is_master = (res->owner == dlm->node_num); + if (flags & LKM_VALBLK && lock->ml.type != LKM_EXMODE) + flags &= ~LKM_VALBLK; spin_unlock(&res->spinlock); if (is_master) { @@ -656,7 +655,7 @@ retry: } if (call_ast) { - mlog(0, "calling unlockast(%p, %d)\n", data, lksb->status); + mlog(0, "calling unlockast(%p, %d)\n", data, status); if (is_master) { /* it is possible that there is one last bast * pending. make sure it is flushed, then @@ -668,9 +667,12 @@ retry: wait_event(dlm->ast_wq, dlm_lock_basts_flushed(dlm, lock)); } - (*unlockast)(data, lksb->status); + (*unlockast)(data, status); } + if (status == DLM_CANCELGRANT) + status = DLM_NORMAL; + if (status == DLM_NORMAL) { mlog(0, "kicking the thread\n"); dlm_kick_thread(dlm, res); diff --git a/fs/ocfs2/dlm/userdlm.c b/fs/ocfs2/dlm/userdlm.c index 74ca4e5f9..e641b084b 100644 --- a/fs/ocfs2/dlm/userdlm.c +++ b/fs/ocfs2/dlm/userdlm.c @@ -672,7 +672,7 @@ struct dlm_ctxt *user_dlm_register_context(struct qstr *name) u32 dlm_key; char *domain; - domain = kmalloc(name->len + 1, GFP_KERNEL); + domain = kmalloc(name->len + 1, GFP_NOFS); if (!domain) { mlog_errno(-ENOMEM); return ERR_PTR(-ENOMEM); diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c index 64cd52860..1869d233f 100644 --- a/fs/ocfs2/dlmglue.c +++ b/fs/ocfs2/dlmglue.c @@ -242,7 +242,7 @@ static void ocfs2_build_lock_name(enum ocfs2_lock_type type, mlog_exit_void(); } -static spinlock_t ocfs2_dlm_tracking_lock = SPIN_LOCK_UNLOCKED; +static DEFINE_SPINLOCK(ocfs2_dlm_tracking_lock); static void ocfs2_add_lockres_tracking(struct ocfs2_lock_res *res, struct ocfs2_dlm_debug *dlm_debug) @@ -1995,7 +1995,7 @@ static int ocfs2_dlm_debug_open(struct inode *inode, struct file *file) mlog_errno(ret); goto out; } - osb = (struct ocfs2_super *) inode->u.generic_ip; + osb = inode->i_private; ocfs2_get_dlm_debug(osb->osb_dlm_debug); priv->p_dlm_debug = osb->osb_dlm_debug; INIT_LIST_HEAD(&priv->p_iter_res.l_debug_list); @@ -2071,8 +2071,7 @@ int ocfs2_dlm_init(struct ocfs2_super *osb) } /* launch vote thread */ - osb->vote_task = kthread_run(ocfs2_vote_thread, osb, "ocfs2vote-%d", - osb->osb_id); + osb->vote_task = kthread_run(ocfs2_vote_thread, osb, "ocfs2vote"); if (IS_ERR(osb->vote_task)) { status = PTR_ERR(osb->vote_task); osb->vote_task = NULL; diff --git a/fs/ocfs2/extent_map.c b/fs/ocfs2/extent_map.c index 1a5c69071..fcd4475d1 100644 --- a/fs/ocfs2/extent_map.c +++ b/fs/ocfs2/extent_map.c @@ -298,7 +298,7 @@ static int ocfs2_extent_map_find_leaf(struct inode *inode, ret = ocfs2_extent_map_insert(inode, rec, le16_to_cpu(el->l_tree_depth)); - if (ret) { + if (ret && (ret != -EEXIST)) { mlog_errno(ret); goto out_free; } @@ -427,6 +427,11 @@ static int ocfs2_extent_map_insert_entry(struct ocfs2_extent_map *em, /* * Simple rule: on any return code other than -EAGAIN, anything left * in the insert_context will be freed. + * + * Simple rule #2: A return code of -EEXIST from this function or + * its calls to ocfs2_extent_map_insert_entry() signifies that another + * thread beat us to the insert. It is not an actual error, but it + * tells the caller we have no more work to do. */ static int ocfs2_extent_map_try_insert(struct inode *inode, struct ocfs2_extent_rec *rec, @@ -448,22 +453,32 @@ static int ocfs2_extent_map_try_insert(struct inode *inode, goto out_unlock; } + /* Since insert_entry failed, the map MUST have old_ent */ old_ent = ocfs2_extent_map_lookup(em, le32_to_cpu(rec->e_cpos), - le32_to_cpu(rec->e_clusters), NULL, - NULL); + le32_to_cpu(rec->e_clusters), + NULL, NULL); BUG_ON(!old_ent); - ret = -EEXIST; - if (old_ent->e_tree_depth < tree_depth) + if (old_ent->e_tree_depth < tree_depth) { + /* Another thread beat us to the lower tree_depth */ + ret = -EEXIST; goto out_unlock; + } if (old_ent->e_tree_depth == tree_depth) { + /* + * Another thread beat us to this tree_depth. + * Let's make sure we agree with that thread (the + * extent_rec should be identical). + */ if (!memcmp(rec, &old_ent->e_rec, sizeof(struct ocfs2_extent_rec))) ret = 0; + else + /* FIXME: Should this be ESRCH/EBADR??? */ + ret = -EEXIST; - /* FIXME: Should this be ESRCH/EBADR??? */ goto out_unlock; } @@ -599,7 +614,7 @@ static int ocfs2_extent_map_insert(struct inode *inode, tree_depth, &ctxt); } while (ret == -EAGAIN); - if (ret < 0) + if ((ret < 0) && (ret != -EEXIST)) mlog_errno(ret); if (ctxt.left_ent) diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c index 327a5b7b8..fa3a6dc0c 100644 --- a/fs/ocfs2/inode.c +++ b/fs/ocfs2/inode.c @@ -251,7 +251,6 @@ int ocfs2_populate_inode(struct inode *inode, struct ocfs2_dinode *fe, inode->i_mode = le16_to_cpu(fe->i_mode); inode->i_uid = le32_to_cpu(fe->i_uid); inode->i_gid = le32_to_cpu(fe->i_gid); - inode->i_blksize = (u32)osb->s_clustersize; /* Fast symlinks will have i_size but no allocated clusters. */ if (S_ISLNK(inode->i_mode) && !fe->i_clusters) @@ -1164,8 +1163,6 @@ leave: void ocfs2_refresh_inode(struct inode *inode, struct ocfs2_dinode *fe) { - struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); - spin_lock(&OCFS2_I(inode)->ip_lock); OCFS2_I(inode)->ip_clusters = le32_to_cpu(fe->i_clusters); @@ -1174,7 +1171,6 @@ void ocfs2_refresh_inode(struct inode *inode, inode->i_uid = le32_to_cpu(fe->i_uid); inode->i_gid = le32_to_cpu(fe->i_gid); inode->i_mode = le16_to_cpu(fe->i_mode); - inode->i_blksize = (u32) osb->s_clustersize; if (S_ISLNK(inode->i_mode) && le32_to_cpu(fe->i_clusters) == 0) inode->i_blocks = 0; else diff --git a/fs/ocfs2/inode.h b/fs/ocfs2/inode.h index 84c507961..35140f6cf 100644 --- a/fs/ocfs2/inode.h +++ b/fs/ocfs2/inode.h @@ -114,7 +114,7 @@ static inline struct ocfs2_inode_info *OCFS2_I(struct inode *inode) extern kmem_cache_t *ocfs2_inode_cache; -extern struct address_space_operations ocfs2_aops; +extern const struct address_space_operations ocfs2_aops; struct buffer_head *ocfs2_bread(struct inode *inode, int block, int *err, int reada); diff --git a/fs/ocfs2/journal.c b/fs/ocfs2/journal.c index eebc3cfa6..f92bf1dd3 100644 --- a/fs/ocfs2/journal.c +++ b/fs/ocfs2/journal.c @@ -49,7 +49,7 @@ #include "buffer_head_io.h" -spinlock_t trans_inc_lock = SPIN_LOCK_UNLOCKED; +DEFINE_SPINLOCK(trans_inc_lock); static int ocfs2_force_read_journal(struct inode *inode); static int ocfs2_recover_node(struct ocfs2_super *osb, @@ -222,8 +222,7 @@ void ocfs2_handle_add_inode(struct ocfs2_journal_handle *handle, BUG_ON(!list_empty(&OCFS2_I(inode)->ip_handle_list)); OCFS2_I(inode)->ip_handle = handle; - list_del(&(OCFS2_I(inode)->ip_handle_list)); - list_add_tail(&(OCFS2_I(inode)->ip_handle_list), &(handle->inode_list)); + list_move_tail(&(OCFS2_I(inode)->ip_handle_list), &(handle->inode_list)); } static void ocfs2_handle_unlock_inodes(struct ocfs2_journal_handle *handle) @@ -785,8 +784,7 @@ int ocfs2_journal_load(struct ocfs2_journal *journal) } /* Launch the commit thread */ - osb->commit_task = kthread_run(ocfs2_commit_thread, osb, "ocfs2cmt-%d", - osb->osb_id); + osb->commit_task = kthread_run(ocfs2_commit_thread, osb, "ocfs2cmt"); if (IS_ERR(osb->commit_task)) { status = PTR_ERR(osb->commit_task); osb->commit_task = NULL; @@ -1119,7 +1117,7 @@ void ocfs2_recovery_thread(struct ocfs2_super *osb, int node_num) goto out; osb->recovery_thread_task = kthread_run(__ocfs2_recovery_thread, osb, - "ocfs2rec-%d", osb->osb_id); + "ocfs2rec"); if (IS_ERR(osb->recovery_thread_task)) { mlog_errno((int)PTR_ERR(osb->recovery_thread_task)); osb->recovery_thread_task = NULL; diff --git a/fs/ocfs2/localalloc.c b/fs/ocfs2/localalloc.c index 0d1973ea3..1f17a4d08 100644 --- a/fs/ocfs2/localalloc.c +++ b/fs/ocfs2/localalloc.c @@ -840,6 +840,12 @@ static int ocfs2_local_alloc_new_window(struct ocfs2_super *osb, mlog(0, "Allocating %u clusters for a new window.\n", ocfs2_local_alloc_window_bits(osb)); + + /* Instruct the allocation code to try the most recently used + * cluster group. We'll re-record the group used this pass + * below. */ + ac->ac_last_group = osb->la_last_gd; + /* we used the generic suballoc reserve function, but we set * everything up nicely, so there's no reason why we can't use * the more specific cluster api to claim bits. */ @@ -852,6 +858,8 @@ static int ocfs2_local_alloc_new_window(struct ocfs2_super *osb, goto bail; } + osb->la_last_gd = ac->ac_last_group; + la->la_bm_off = cpu_to_le32(cluster_off); alloc->id1.bitmap1.i_total = cpu_to_le32(cluster_count); /* just in case... In the future when we find space ourselves, diff --git a/fs/ocfs2/mmap.c b/fs/ocfs2/mmap.c index 843cf9dde..83934e33e 100644 --- a/fs/ocfs2/mmap.c +++ b/fs/ocfs2/mmap.c @@ -46,12 +46,12 @@ static struct page *ocfs2_nopage(struct vm_area_struct * area, unsigned long address, int *type) { - struct inode *inode = area->vm_file->f_dentry->d_inode; struct page *page = NOPAGE_SIGBUS; sigset_t blocked, oldset; int ret; - mlog_entry("(inode %lu, address %lu)\n", inode->i_ino, address); + mlog_entry("(area=%p, address=%lu, type=%p)\n", area, address, + type); /* The best way to deal with signals in this path is * to block them upfront, rather than allowing the diff --git a/fs/ocfs2/ocfs2.h b/fs/ocfs2/ocfs2.h index da1093039..0462a7f4e 100644 --- a/fs/ocfs2/ocfs2.h +++ b/fs/ocfs2/ocfs2.h @@ -184,7 +184,6 @@ struct ocfs2_journal; struct ocfs2_journal_handle; struct ocfs2_super { - u32 osb_id; /* id used by the proc interface */ struct task_struct *commit_task; struct super_block *sb; struct inode *root_inode; @@ -198,7 +197,6 @@ struct ocfs2_super struct ocfs2_node_map recovery_map; struct ocfs2_node_map umount_map; - u32 num_clusters; u64 root_blkno; u64 system_dir_blkno; u64 bitmap_blkno; @@ -222,13 +220,11 @@ struct ocfs2_super unsigned long s_mount_opt; u16 max_slots; - u16 num_nodes; s16 node_num; s16 slot_num; int s_sectsize_bits; int s_clustersize; int s_clustersize_bits; - struct proc_dir_entry *proc_sub_dir; /* points to /proc/fs/ocfs2/ */ atomic_t vol_state; struct mutex recovery_lock; @@ -240,6 +236,7 @@ struct ocfs2_super enum ocfs2_local_alloc_state local_alloc_state; struct buffer_head *local_alloc_bh; + u64 la_last_gd; /* Next two fields are for local node slot recovery during * mount. */ @@ -294,7 +291,6 @@ struct ocfs2_super }; #define OCFS2_SB(sb) ((struct ocfs2_super *)(sb)->s_fs_info) -#define OCFS2_MAX_OSB_ID 65536 static inline int ocfs2_should_order_data(struct inode *inode) { diff --git a/fs/ocfs2/slot_map.c b/fs/ocfs2/slot_map.c index 871627961..aa6f5aade 100644 --- a/fs/ocfs2/slot_map.c +++ b/fs/ocfs2/slot_map.c @@ -264,7 +264,7 @@ int ocfs2_find_slot(struct ocfs2_super *osb) osb->slot_num = slot; spin_unlock(&si->si_lock); - mlog(ML_NOTICE, "taking node slot %d\n", osb->slot_num); + mlog(0, "taking node slot %d\n", osb->slot_num); status = ocfs2_update_disk_slots(osb, si); if (status < 0) diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c index 195523090..9d91e66f5 100644 --- a/fs/ocfs2/suballoc.c +++ b/fs/ocfs2/suballoc.c @@ -70,12 +70,6 @@ static int ocfs2_block_group_search(struct inode *inode, struct buffer_head *group_bh, u32 bits_wanted, u32 min_bits, u16 *bit_off, u16 *bits_found); -static int ocfs2_search_chain(struct ocfs2_alloc_context *ac, - u32 bits_wanted, - u32 min_bits, - u16 *bit_off, - unsigned int *num_bits, - u64 *bg_blkno); static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb, struct ocfs2_alloc_context *ac, u32 bits_wanted, @@ -85,11 +79,6 @@ static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb, u64 *bg_blkno); static int ocfs2_test_bg_bit_allocatable(struct buffer_head *bg_bh, int nr); -static int ocfs2_block_group_find_clear_bits(struct ocfs2_super *osb, - struct buffer_head *bg_bh, - unsigned int bits_wanted, - u16 *bit_off, - u16 *bits_found); static inline int ocfs2_block_group_set_bits(struct ocfs2_journal_handle *handle, struct inode *alloc_inode, struct ocfs2_group_desc *bg, @@ -143,6 +132,64 @@ static u32 ocfs2_bits_per_group(struct ocfs2_chain_list *cl) return (u32)le16_to_cpu(cl->cl_cpg) * (u32)le16_to_cpu(cl->cl_bpc); } +/* somewhat more expensive than our other checks, so use sparingly. */ +static int ocfs2_check_group_descriptor(struct super_block *sb, + struct ocfs2_dinode *di, + struct ocfs2_group_desc *gd) +{ + unsigned int max_bits; + + if (!OCFS2_IS_VALID_GROUP_DESC(gd)) { + OCFS2_RO_ON_INVALID_GROUP_DESC(sb, gd); + return -EIO; + } + + if (di->i_blkno != gd->bg_parent_dinode) { + ocfs2_error(sb, "Group descriptor # %llu has bad parent " + "pointer (%llu, expected %llu)", + (unsigned long long)le64_to_cpu(gd->bg_blkno), + (unsigned long long)le64_to_cpu(gd->bg_parent_dinode), + (unsigned long long)le64_to_cpu(di->i_blkno)); + return -EIO; + } + + max_bits = le16_to_cpu(di->id2.i_chain.cl_cpg) * le16_to_cpu(di->id2.i_chain.cl_bpc); + if (le16_to_cpu(gd->bg_bits) > max_bits) { + ocfs2_error(sb, "Group descriptor # %llu has bit count of %u", + (unsigned long long)le64_to_cpu(gd->bg_blkno), + le16_to_cpu(gd->bg_bits)); + return -EIO; + } + + if (le16_to_cpu(gd->bg_chain) >= + le16_to_cpu(di->id2.i_chain.cl_next_free_rec)) { + ocfs2_error(sb, "Group descriptor # %llu has bad chain %u", + (unsigned long long)le64_to_cpu(gd->bg_blkno), + le16_to_cpu(gd->bg_chain)); + return -EIO; + } + + if (le16_to_cpu(gd->bg_free_bits_count) > le16_to_cpu(gd->bg_bits)) { + ocfs2_error(sb, "Group descriptor # %llu has bit count %u but " + "claims that %u are free", + (unsigned long long)le64_to_cpu(gd->bg_blkno), + le16_to_cpu(gd->bg_bits), + le16_to_cpu(gd->bg_free_bits_count)); + return -EIO; + } + + if (le16_to_cpu(gd->bg_bits) > (8 * le16_to_cpu(gd->bg_size))) { + ocfs2_error(sb, "Group descriptor # %llu has bit count %u but " + "max bitmap bits of %u", + (unsigned long long)le64_to_cpu(gd->bg_blkno), + le16_to_cpu(gd->bg_bits), + 8 * le16_to_cpu(gd->bg_size)); + return -EIO; + } + + return 0; +} + static int ocfs2_block_group_fill(struct ocfs2_journal_handle *handle, struct inode *alloc_inode, struct buffer_head *bg_bh, @@ -663,6 +710,7 @@ static int ocfs2_test_bg_bit_allocatable(struct buffer_head *bg_bh, static int ocfs2_block_group_find_clear_bits(struct ocfs2_super *osb, struct buffer_head *bg_bh, unsigned int bits_wanted, + unsigned int total_bits, u16 *bit_off, u16 *bits_found) { @@ -679,10 +727,8 @@ static int ocfs2_block_group_find_clear_bits(struct ocfs2_super *osb, found = start = best_offset = best_size = 0; bitmap = bg->bg_bitmap; - while((offset = ocfs2_find_next_zero_bit(bitmap, - le16_to_cpu(bg->bg_bits), - start)) != -1) { - if (offset == le16_to_cpu(bg->bg_bits)) + while((offset = ocfs2_find_next_zero_bit(bitmap, total_bits, start)) != -1) { + if (offset == total_bits) break; if (!ocfs2_test_bg_bit_allocatable(bg_bh, offset)) { @@ -911,14 +957,35 @@ static int ocfs2_cluster_group_search(struct inode *inode, { int search = -ENOSPC; int ret; - struct ocfs2_group_desc *bg = (struct ocfs2_group_desc *) group_bh->b_data; + struct ocfs2_group_desc *gd = (struct ocfs2_group_desc *) group_bh->b_data; u16 tmp_off, tmp_found; + unsigned int max_bits, gd_cluster_off; BUG_ON(!ocfs2_is_cluster_bitmap(inode)); - if (bg->bg_free_bits_count) { + if (gd->bg_free_bits_count) { + max_bits = le16_to_cpu(gd->bg_bits); + + /* Tail groups in cluster bitmaps which aren't cpg + * aligned are prone to partial extention by a failed + * fs resize. If the file system resize never got to + * update the dinode cluster count, then we don't want + * to trust any clusters past it, regardless of what + * the group descriptor says. */ + gd_cluster_off = ocfs2_blocks_to_clusters(inode->i_sb, + le64_to_cpu(gd->bg_blkno)); + if ((gd_cluster_off + max_bits) > + OCFS2_I(inode)->ip_clusters) { + max_bits = OCFS2_I(inode)->ip_clusters - gd_cluster_off; + mlog(0, "Desc %llu, bg_bits %u, clusters %u, use %u\n", + (unsigned long long)le64_to_cpu(gd->bg_blkno), + le16_to_cpu(gd->bg_bits), + OCFS2_I(inode)->ip_clusters, max_bits); + } + ret = ocfs2_block_group_find_clear_bits(OCFS2_SB(inode->i_sb), group_bh, bits_wanted, + max_bits, &tmp_off, &tmp_found); if (ret) return ret; @@ -951,17 +1018,109 @@ static int ocfs2_block_group_search(struct inode *inode, if (bg->bg_free_bits_count) ret = ocfs2_block_group_find_clear_bits(OCFS2_SB(inode->i_sb), group_bh, bits_wanted, + le16_to_cpu(bg->bg_bits), bit_off, bits_found); return ret; } +static int ocfs2_alloc_dinode_update_counts(struct inode *inode, + struct ocfs2_journal_handle *handle, + struct buffer_head *di_bh, + u32 num_bits, + u16 chain) +{ + int ret; + u32 tmp_used; + struct ocfs2_dinode *di = (struct ocfs2_dinode *) di_bh->b_data; + struct ocfs2_chain_list *cl = (struct ocfs2_chain_list *) &di->id2.i_chain; + + ret = ocfs2_journal_access(handle, inode, di_bh, + OCFS2_JOURNAL_ACCESS_WRITE); + if (ret < 0) { + mlog_errno(ret); + goto out; + } + + tmp_used = le32_to_cpu(di->id1.bitmap1.i_used); + di->id1.bitmap1.i_used = cpu_to_le32(num_bits + tmp_used); + le32_add_cpu(&cl->cl_recs[chain].c_free, -num_bits); + + ret = ocfs2_journal_dirty(handle, di_bh); + if (ret < 0) + mlog_errno(ret); + +out: + return ret; +} + +static int ocfs2_search_one_group(struct ocfs2_alloc_context *ac, + u32 bits_wanted, + u32 min_bits, + u16 *bit_off, + unsigned int *num_bits, + u64 gd_blkno, + u16 *bits_left) +{ + int ret; + u16 found; + struct buffer_head *group_bh = NULL; + struct ocfs2_group_desc *gd; + struct inode *alloc_inode = ac->ac_inode; + struct ocfs2_journal_handle *handle = ac->ac_handle; + + ret = ocfs2_read_block(OCFS2_SB(alloc_inode->i_sb), gd_blkno, + &group_bh, OCFS2_BH_CACHED, alloc_inode); + if (ret < 0) { + mlog_errno(ret); + return ret; + } + + gd = (struct ocfs2_group_desc *) group_bh->b_data; + if (!OCFS2_IS_VALID_GROUP_DESC(gd)) { + OCFS2_RO_ON_INVALID_GROUP_DESC(alloc_inode->i_sb, gd); + ret = -EIO; + goto out; + } + + ret = ac->ac_group_search(alloc_inode, group_bh, bits_wanted, min_bits, + bit_off, &found); + if (ret < 0) { + if (ret != -ENOSPC) + mlog_errno(ret); + goto out; + } + + *num_bits = found; + + ret = ocfs2_alloc_dinode_update_counts(alloc_inode, handle, ac->ac_bh, + *num_bits, + le16_to_cpu(gd->bg_chain)); + if (ret < 0) { + mlog_errno(ret); + goto out; + } + + ret = ocfs2_block_group_set_bits(handle, alloc_inode, gd, group_bh, + *bit_off, *num_bits); + if (ret < 0) + mlog_errno(ret); + + *bits_left = le16_to_cpu(gd->bg_free_bits_count); + +out: + brelse(group_bh); + + return ret; +} + static int ocfs2_search_chain(struct ocfs2_alloc_context *ac, u32 bits_wanted, u32 min_bits, u16 *bit_off, unsigned int *num_bits, - u64 *bg_blkno) + u64 *bg_blkno, + u16 *bits_left) { int status; u16 chain, tmp_bits; @@ -988,9 +1147,9 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac, goto bail; } bg = (struct ocfs2_group_desc *) group_bh->b_data; - if (!OCFS2_IS_VALID_GROUP_DESC(bg)) { - OCFS2_RO_ON_INVALID_GROUP_DESC(alloc_inode->i_sb, bg); - status = -EIO; + status = ocfs2_check_group_descriptor(alloc_inode->i_sb, fe, bg); + if (status) { + mlog_errno(status); goto bail; } @@ -1018,9 +1177,9 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac, goto bail; } bg = (struct ocfs2_group_desc *) group_bh->b_data; - if (!OCFS2_IS_VALID_GROUP_DESC(bg)) { - OCFS2_RO_ON_INVALID_GROUP_DESC(alloc_inode->i_sb, bg); - status = -EIO; + status = ocfs2_check_group_descriptor(alloc_inode->i_sb, fe, bg); + if (status) { + mlog_errno(status); goto bail; } } @@ -1099,6 +1258,7 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac, (unsigned long long)fe->i_blkno); *bg_blkno = le64_to_cpu(bg->bg_blkno); + *bits_left = le16_to_cpu(bg->bg_free_bits_count); bail: if (group_bh) brelse(group_bh); @@ -1120,6 +1280,8 @@ static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb, { int status; u16 victim, i; + u16 bits_left = 0; + u64 hint_blkno = ac->ac_last_group; struct ocfs2_chain_list *cl; struct ocfs2_dinode *fe; @@ -1146,6 +1308,28 @@ static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb, goto bail; } + if (hint_blkno) { + /* Attempt to short-circuit the usual search mechanism + * by jumping straight to the most recently used + * allocation group. This helps us mantain some + * contiguousness across allocations. */ + status = ocfs2_search_one_group(ac, bits_wanted, min_bits, + bit_off, num_bits, + hint_blkno, &bits_left); + if (!status) { + /* Be careful to update *bg_blkno here as the + * caller is expecting it to be filled in, and + * ocfs2_search_one_group() won't do that for + * us. */ + *bg_blkno = hint_blkno; + goto set_hint; + } + if (status < 0 && status != -ENOSPC) { + mlog_errno(status); + goto bail; + } + } + cl = (struct ocfs2_chain_list *) &fe->id2.i_chain; victim = ocfs2_find_victim_chain(cl); @@ -1153,9 +1337,9 @@ static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb, ac->ac_allow_chain_relink = 1; status = ocfs2_search_chain(ac, bits_wanted, min_bits, bit_off, - num_bits, bg_blkno); + num_bits, bg_blkno, &bits_left); if (!status) - goto bail; + goto set_hint; if (status < 0 && status != -ENOSPC) { mlog_errno(status); goto bail; @@ -1177,8 +1361,8 @@ static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb, ac->ac_chain = i; status = ocfs2_search_chain(ac, bits_wanted, min_bits, - bit_off, num_bits, - bg_blkno); + bit_off, num_bits, bg_blkno, + &bits_left); if (!status) break; if (status < 0 && status != -ENOSPC) { @@ -1186,8 +1370,19 @@ static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb, goto bail; } } -bail: +set_hint: + if (status != -ENOSPC) { + /* If the next search of this group is not likely to + * yield a suitable extent, then we reset the last + * group hint so as to not waste a disk read */ + if (bits_left < min_bits) + ac->ac_last_group = 0; + else + ac->ac_last_group = *bg_blkno; + } + +bail: mlog_exit(status); return status; } @@ -1341,7 +1536,7 @@ int ocfs2_claim_clusters(struct ocfs2_super *osb, { int status; unsigned int bits_wanted = ac->ac_bits_wanted - ac->ac_bits_given; - u64 bg_blkno; + u64 bg_blkno = 0; u16 bg_bit_off; mlog_entry_void(); @@ -1494,9 +1689,9 @@ static int ocfs2_free_suballoc_bits(struct ocfs2_journal_handle *handle, } group = (struct ocfs2_group_desc *) group_bh->b_data; - if (!OCFS2_IS_VALID_GROUP_DESC(group)) { - OCFS2_RO_ON_INVALID_GROUP_DESC(alloc_inode->i_sb, group); - status = -EIO; + status = ocfs2_check_group_descriptor(alloc_inode->i_sb, fe, group); + if (status) { + mlog_errno(status); goto bail; } BUG_ON((count + start_bit) > le16_to_cpu(group->bg_bits)); diff --git a/fs/ocfs2/suballoc.h b/fs/ocfs2/suballoc.h index a76c82a7c..c787838d1 100644 --- a/fs/ocfs2/suballoc.h +++ b/fs/ocfs2/suballoc.h @@ -49,6 +49,8 @@ struct ocfs2_alloc_context { u16 ac_chain; int ac_allow_chain_relink; group_search_t *ac_group_search; + + u64 ac_last_group; }; void ocfs2_free_alloc_context(struct ocfs2_alloc_context *ac); diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index 949b3dac3..d17e33e66 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c @@ -68,13 +68,6 @@ #include "buffer_head_io.h" -/* - * Globals - */ -static spinlock_t ocfs2_globals_lock = SPIN_LOCK_UNLOCKED; - -static u32 osb_id; /* Keeps track of next available OSB Id */ - static kmem_cache_t *ocfs2_inode_cachep = NULL; kmem_cache_t *ocfs2_lock_cache = NULL; @@ -100,7 +93,7 @@ static int ocfs2_initialize_mem_caches(void); static void ocfs2_free_mem_caches(void); static void ocfs2_delete_osb(struct ocfs2_super *osb); -static int ocfs2_statfs(struct super_block *sb, struct kstatfs *buf); +static int ocfs2_statfs(struct dentry *dentry, struct kstatfs *buf); static int ocfs2_sync_fs(struct super_block *sb, int wait); @@ -642,10 +635,9 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) ocfs2_complete_mount_recovery(osb); - printk("ocfs2: Mounting device (%u,%u) on (node %d, slot %d) with %s " - "data mode.\n", - MAJOR(sb->s_dev), MINOR(sb->s_dev), osb->node_num, - osb->slot_num, + printk(KERN_INFO "ocfs2: Mounting device (%s) on (node %d, slot %d) " + "with %s data mode.\n", + osb->dev_str, osb->node_num, osb->slot_num, osb->s_mount_opt & OCFS2_MOUNT_DATA_WRITEBACK ? "writeback" : "ordered"); @@ -672,12 +664,14 @@ read_super_error: return status; } -static struct super_block *ocfs2_get_sb(struct file_system_type *fs_type, - int flags, - const char *dev_name, - void *data) +static int ocfs2_get_sb(struct file_system_type *fs_type, + int flags, + const char *dev_name, + void *data, + struct vfsmount *mnt) { - return get_sb_bdev(fs_type, flags, dev_name, data, ocfs2_fill_super); + return get_sb_bdev(fs_type, flags, dev_name, data, ocfs2_fill_super, + mnt); } static struct file_system_type ocfs2_fs_type = { @@ -798,10 +792,6 @@ static int __init ocfs2_init(void) goto leave; } - spin_lock(&ocfs2_globals_lock); - osb_id = 0; - spin_unlock(&ocfs2_globals_lock); - ocfs2_debugfs_root = debugfs_create_dir("ocfs2", NULL); if (!ocfs2_debugfs_root) { status = -EFAULT; @@ -855,7 +845,7 @@ static void ocfs2_put_super(struct super_block *sb) mlog_exit_void(); } -static int ocfs2_statfs(struct super_block *sb, struct kstatfs *buf) +static int ocfs2_statfs(struct dentry *dentry, struct kstatfs *buf) { struct ocfs2_super *osb; u32 numbits, freebits; @@ -864,9 +854,9 @@ static int ocfs2_statfs(struct super_block *sb, struct kstatfs *buf) struct buffer_head *bh = NULL; struct inode *inode = NULL; - mlog_entry("(%p, %p)\n", sb, buf); + mlog_entry("(%p, %p)\n", dentry->d_sb, buf); - osb = OCFS2_SB(sb); + osb = OCFS2_SB(dentry->d_sb); inode = ocfs2_get_system_file_inode(osb, GLOBAL_BITMAP_SYSTEM_INODE, @@ -889,7 +879,7 @@ static int ocfs2_statfs(struct super_block *sb, struct kstatfs *buf) freebits = numbits - le32_to_cpu(bm_lock->id1.bitmap1.i_used); buf->f_type = OCFS2_SUPER_MAGIC; - buf->f_bsize = sb->s_blocksize; + buf->f_bsize = dentry->d_sb->s_blocksize; buf->f_namelen = OCFS2_MAX_FILENAME_LEN; buf->f_blocks = ((sector_t) numbits) * (osb->s_clustersize >> osb->sb->s_blocksize_bits); @@ -1018,7 +1008,7 @@ static int ocfs2_fill_local_node_info(struct ocfs2_super *osb) goto bail; } - mlog(ML_NOTICE, "I am node %d\n", osb->node_num); + mlog(0, "I am node %d\n", osb->node_num); status = 0; bail: @@ -1189,8 +1179,8 @@ static void ocfs2_dismount_volume(struct super_block *sb, int mnt_err) atomic_set(&osb->vol_state, VOLUME_DISMOUNTED); - printk("ocfs2: Unmounting device (%u,%u) on (node %d)\n", - MAJOR(osb->sb->s_dev), MINOR(osb->sb->s_dev), osb->node_num); + printk(KERN_INFO "ocfs2: Unmounting device (%s) on (node %d)\n", + osb->dev_str, osb->node_num); ocfs2_delete_osb(osb); kfree(osb); @@ -1210,8 +1200,6 @@ static int ocfs2_setup_osb_uuid(struct ocfs2_super *osb, const unsigned char *uu if (osb->uuid_str == NULL) return -ENOMEM; - memcpy(osb->uuid, uuid, OCFS2_VOL_UUID_LEN); - for (i = 0, ptr = osb->uuid_str; i < OCFS2_VOL_UUID_LEN; i++) { /* print with null */ ret = snprintf(ptr, 3, "%02X", uuid[i]); @@ -1309,13 +1297,6 @@ static int ocfs2_initialize_super(struct super_block *sb, goto bail; } - osb->uuid = kmalloc(OCFS2_VOL_UUID_LEN, GFP_KERNEL); - if (!osb->uuid) { - mlog(ML_ERROR, "unable to alloc uuid\n"); - status = -ENOMEM; - goto bail; - } - di = (struct ocfs2_dinode *)bh->b_data; osb->max_slots = le16_to_cpu(di->id2.i_super.s_max_slots); @@ -1325,7 +1306,7 @@ static int ocfs2_initialize_super(struct super_block *sb, status = -EINVAL; goto bail; } - mlog(ML_NOTICE, "max_slots for this device: %u\n", osb->max_slots); + mlog(0, "max_slots for this device: %u\n", osb->max_slots); init_waitqueue_head(&osb->osb_wipe_event); osb->osb_orphan_wipes = kcalloc(osb->max_slots, @@ -1416,7 +1397,7 @@ static int ocfs2_initialize_super(struct super_block *sb, goto bail; } - memcpy(&uuid_net_key, &osb->uuid[i], sizeof(osb->net_key)); + memcpy(&uuid_net_key, di->id2.i_super.s_uuid, sizeof(uuid_net_key)); osb->net_key = le32_to_cpu(uuid_net_key); strncpy(osb->vol_label, di->id2.i_super.s_label, 63); @@ -1461,8 +1442,13 @@ static int ocfs2_initialize_super(struct super_block *sb, osb->bitmap_blkno = OCFS2_I(inode)->ip_blkno; + /* We don't have a cluster lock on the bitmap here because + * we're only interested in static information and the extra + * complexity at mount time isn't worht it. Don't pass the + * inode in to the read function though as we don't want it to + * be put in the cache. */ status = ocfs2_read_block(osb, osb->bitmap_blkno, &bitmap_bh, 0, - inode); + NULL); iput(inode); if (status < 0) { mlog_errno(status); @@ -1471,7 +1457,6 @@ static int ocfs2_initialize_super(struct super_block *sb, di = (struct ocfs2_dinode *) bitmap_bh->b_data; osb->bitmap_cpg = le16_to_cpu(di->id2.i_chain.cl_cpg); - osb->num_clusters = le32_to_cpu(di->id1.bitmap1.i_total); brelse(bitmap_bh); mlog(0, "cluster bitmap inode: %llu, clusters per group: %u\n", (unsigned long long)osb->bitmap_blkno, osb->bitmap_cpg); @@ -1482,18 +1467,6 @@ static int ocfs2_initialize_super(struct super_block *sb, goto bail; } - /* Link this osb onto the global linked list of all osb structures. */ - /* The Global Link List is mainted for the whole driver . */ - spin_lock(&ocfs2_globals_lock); - osb->osb_id = osb_id; - if (osb_id < OCFS2_MAX_OSB_ID) - osb_id++; - else { - mlog(ML_ERROR, "Too many volumes mounted\n"); - status = -ENOMEM; - } - spin_unlock(&ocfs2_globals_lock); - bail: mlog_exit(status); return status; diff --git a/fs/ocfs2/symlink.c b/fs/ocfs2/symlink.c index f6986bd79..c0f68aa6c 100644 --- a/fs/ocfs2/symlink.c +++ b/fs/ocfs2/symlink.c @@ -64,8 +64,7 @@ static char *ocfs2_page_getlink(struct dentry * dentry, { struct page * page; struct address_space *mapping = dentry->d_inode->i_mapping; - page = read_cache_page(mapping, 0, - (filler_t *)mapping->a_ops->readpage, NULL); + page = read_mapping_page(mapping, 0, NULL); if (IS_ERR(page)) goto sync_fail; wait_on_page_locked(page); @@ -155,7 +154,7 @@ static void *ocfs2_follow_link(struct dentry *dentry, } status = vfs_follow_link(nd, link); - if (status) + if (status && status != -ENOENT) mlog_errno(status); bail: if (page) { diff --git a/fs/ocfs2/vote.c b/fs/ocfs2/vote.c index ee42765a8..cf70fe207 100644 --- a/fs/ocfs2/vote.c +++ b/fs/ocfs2/vote.c @@ -988,9 +988,7 @@ int ocfs2_request_mount_vote(struct ocfs2_super *osb) } bail: - if (request) - kfree(request); - + kfree(request); return status; } @@ -1021,9 +1019,7 @@ int ocfs2_request_umount_vote(struct ocfs2_super *osb) } bail: - if (request) - kfree(request); - + kfree(request); return status; } diff --git a/fs/open.c b/fs/open.c index 672c45f8b..e866a79eb 100644 --- a/fs/open.c +++ b/fs/open.c @@ -34,18 +34,20 @@ #include -int vfs_statfs(struct super_block *sb, struct kstatfs *buf) +int vfs_statfs(struct dentry *dentry, struct kstatfs *buf) { int retval = -ENODEV; - if (sb) { + if (dentry) { + struct super_block *sb = dentry->d_sb; + retval = -ENOSYS; if (sb->s_op->statfs) { memset(buf, 0, sizeof(*buf)); - retval = security_sb_statfs(sb); + retval = security_sb_statfs(dentry); if (retval) return retval; - retval = sb->s_op->statfs(sb, buf); + retval = sb->s_op->statfs(dentry, buf); if (retval == 0 && buf->f_frsize == 0) buf->f_frsize = buf->f_bsize; } @@ -57,12 +59,12 @@ int vfs_statfs(struct super_block *sb, struct kstatfs *buf) EXPORT_SYMBOL(vfs_statfs); -static int vfs_statfs_native(struct super_block *sb, struct statfs *buf) +static int vfs_statfs_native(struct dentry *dentry, struct statfs *buf) { struct kstatfs st; int retval; - retval = vfs_statfs(sb, &st); + retval = vfs_statfs(dentry, &st); if (retval) return retval; @@ -100,12 +102,12 @@ static int vfs_statfs_native(struct super_block *sb, struct statfs *buf) return 0; } -static int vfs_statfs64(struct super_block *sb, struct statfs64 *buf) +static int vfs_statfs64(struct dentry *dentry, struct statfs64 *buf) { struct kstatfs st; int retval; - retval = vfs_statfs(sb, &st); + retval = vfs_statfs(dentry, &st); if (retval) return retval; @@ -135,7 +137,7 @@ asmlinkage long sys_statfs(const char __user * path, struct statfs __user * buf) error = user_path_walk(path, &nd); if (!error) { struct statfs tmp; - error = vfs_statfs_native(nd.dentry->d_inode->i_sb, &tmp); + error = vfs_statfs_native(nd.dentry, &tmp); if (!error && copy_to_user(buf, &tmp, sizeof(tmp))) error = -EFAULT; path_release(&nd); @@ -154,7 +156,7 @@ asmlinkage long sys_statfs64(const char __user *path, size_t sz, struct statfs64 error = user_path_walk(path, &nd); if (!error) { struct statfs64 tmp; - error = vfs_statfs64(nd.dentry->d_inode->i_sb, &tmp); + error = vfs_statfs64(nd.dentry, &tmp); if (!error && copy_to_user(buf, &tmp, sizeof(tmp))) error = -EFAULT; path_release(&nd); @@ -173,7 +175,7 @@ asmlinkage long sys_fstatfs(unsigned int fd, struct statfs __user * buf) file = fget(fd); if (!file) goto out; - error = vfs_statfs_native(file->f_dentry->d_inode->i_sb, &tmp); + error = vfs_statfs_native(file->f_dentry, &tmp); if (!error && copy_to_user(buf, &tmp, sizeof(tmp))) error = -EFAULT; fput(file); @@ -194,7 +196,7 @@ asmlinkage long sys_fstatfs64(unsigned int fd, size_t sz, struct statfs64 __user file = fget(fd); if (!file) goto out; - error = vfs_statfs64(file->f_dentry->d_inode->i_sb, &tmp); + error = vfs_statfs64(file->f_dentry, &tmp); if (!error && copy_to_user(buf, &tmp, sizeof(tmp))) error = -EFAULT; fput(file); @@ -327,7 +329,7 @@ static long do_sys_ftruncate(unsigned int fd, loff_t length, int small) error = locks_verify_truncate(inode, file, length); if (!error) - error = do_truncate(dentry, length, 0, file); + error = do_truncate(dentry, length, ATTR_MTIME|ATTR_CTIME, file); out_putf: fput(file); out: @@ -643,7 +645,7 @@ asmlinkage long sys_fchmod(unsigned int fd, mode_t mode) dentry = file->f_dentry; inode = dentry->d_inode; - audit_inode(NULL, inode, 0); + audit_inode(NULL, inode); err = -EROFS; if (IS_RDONLY(inode) || MNT_IS_RDONLY(file->f_vfsmnt)) @@ -797,7 +799,7 @@ asmlinkage long sys_fchown(unsigned int fd, uid_t user, gid_t group) if (file) { struct dentry * dentry; dentry = file->f_dentry; - audit_inode(NULL, dentry->d_inode, 0); + audit_inode(NULL, dentry->d_inode); error = chown_common(dentry, file->f_vfsmnt, user, group); fput(file); } @@ -1164,7 +1166,7 @@ int filp_close(struct file *filp, fl_owner_t id) } if (filp->f_op && filp->f_op->flush) - retval = filp->f_op->flush(filp); + retval = filp->f_op->flush(filp, id); dnotify_flush(filp, id); locks_remove_posix(filp, id); diff --git a/fs/openpromfs/inode.c b/fs/openpromfs/inode.c index 0f14276a2..93a56bd4a 100644 --- a/fs/openpromfs/inode.c +++ b/fs/openpromfs/inode.c @@ -1,5 +1,4 @@ -/* $Id: inode.c,v 1.15 2001/11/12 09:43:39 davem Exp $ - * openpromfs.c: /proc/openprom handling routines +/* inode.c: /proc/openprom handling routines * * Copyright (C) 1996-1999 Jakub Jelinek (jakub@redhat.com) * Copyright (C) 1998 Eddie C. Dost (ecd@skynet.be) @@ -12,756 +11,245 @@ #include #include #include -#include +#include #include #include +#include #include -#define ALIASES_NNODES 64 - -typedef struct { - u16 parent; - u16 next; - u16 child; - u16 first_prop; - u32 node; -} openpromfs_node; - -typedef struct { -#define OPP_STRING 0x10 -#define OPP_STRINGLIST 0x20 -#define OPP_BINARY 0x40 -#define OPP_HEXSTRING 0x80 -#define OPP_DIRTY 0x01 -#define OPP_QUOTED 0x02 -#define OPP_NOTQUOTED 0x04 -#define OPP_ASCIIZ 0x08 - u32 flag; - u32 alloclen; - u32 len; - char *value; - char name[8]; -} openprom_property; - -static openpromfs_node *nodes; -static int alloced; -static u16 last_node; -static u16 first_prop; -static u16 options = 0xffff; -static u16 aliases = 0xffff; -static int aliases_nodes; -static char *alias_names [ALIASES_NNODES]; - -#define OPENPROM_ROOT_INO 16 -#define OPENPROM_FIRST_INO OPENPROM_ROOT_INO -#define NODE(ino) nodes[ino - OPENPROM_FIRST_INO] -#define NODE2INO(node) (node + OPENPROM_FIRST_INO) -#define NODEP2INO(no) (no + OPENPROM_FIRST_INO + last_node) - -static int openpromfs_create (struct inode *, struct dentry *, int, struct nameidata *); -static int openpromfs_readdir(struct file *, void *, filldir_t); -static struct dentry *openpromfs_lookup(struct inode *, struct dentry *dentry, struct nameidata *nd); -static int openpromfs_unlink (struct inode *, struct dentry *dentry); +static DEFINE_MUTEX(op_mutex); + +#define OPENPROM_ROOT_INO 0 + +enum op_inode_type { + op_inode_node, + op_inode_prop, +}; + +union op_inode_data { + struct device_node *node; + struct property *prop; +}; -static ssize_t nodenum_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) +struct op_inode_info { + struct inode vfs_inode; + enum op_inode_type type; + union op_inode_data u; +}; + +static inline struct op_inode_info *OP_I(struct inode *inode) { - struct inode *inode = file->f_dentry->d_inode; - char buffer[10]; - - if (count < 0 || !inode->u.generic_ip) - return -EINVAL; - sprintf (buffer, "%8.8x\n", (u32)(long)(inode->u.generic_ip)); - if (file->f_pos >= 9) - return 0; - if (count > 9 - file->f_pos) - count = 9 - file->f_pos; - if (copy_to_user(buf, buffer + file->f_pos, count)) - return -EFAULT; - *ppos += count; - return count; + return container_of(inode, struct op_inode_info, vfs_inode); } -static ssize_t property_read(struct file *filp, char __user *buf, - size_t count, loff_t *ppos) +static int is_string(unsigned char *p, int len) { - struct inode *inode = filp->f_dentry->d_inode; - int i, j, k; - u32 node; - char *p, *s; - u32 *q; - openprom_property *op; - char buffer[64]; - - if (!filp->private_data) { - node = nodes[(u16)((long)inode->u.generic_ip)].node; - i = ((u32)(long)inode->u.generic_ip) >> 16; - if ((u16)((long)inode->u.generic_ip) == aliases) { - if (i >= aliases_nodes) - p = NULL; - else - p = alias_names [i]; - } else - for (p = prom_firstprop (node, buffer); - i && p && *p; - p = prom_nextprop (node, p, buffer), i--) - /* nothing */ ; - if (!p || !*p) - return -EIO; - i = prom_getproplen (node, p); - if (i < 0) { - if ((u16)((long)inode->u.generic_ip) == aliases) - i = 0; - else - return -EIO; - } - k = i; - if (i < 64) i = 64; - filp->private_data = kmalloc (sizeof (openprom_property) - + (j = strlen (p)) + 2 * i, - GFP_KERNEL); - if (!filp->private_data) - return -ENOMEM; - op = (openprom_property *)filp->private_data; - op->flag = 0; - op->alloclen = 2 * i; - strcpy (op->name, p); - op->value = (char *)(((unsigned long)(op->name + j + 4)) & ~3); - op->len = k; - if (k && prom_getproperty (node, p, op->value, i) < 0) - return -EIO; - op->value [k] = 0; - if (k) { - for (s = NULL, p = op->value; p < op->value + k; p++) { - if ((*p >= ' ' && *p <= '~') || *p == '\n') { - op->flag |= OPP_STRING; - s = p; - continue; - } - if (p > op->value && !*p && s == p - 1) { - if (p < op->value + k - 1) - op->flag |= OPP_STRINGLIST; - else - op->flag |= OPP_ASCIIZ; - continue; - } - if (k == 1 && !*p) { - op->flag |= (OPP_STRING|OPP_ASCIIZ); - break; - } - op->flag &= ~(OPP_STRING|OPP_STRINGLIST); - if (k & 3) - op->flag |= OPP_HEXSTRING; - else - op->flag |= OPP_BINARY; - break; - } - if (op->flag & OPP_STRINGLIST) - op->flag &= ~(OPP_STRING); - if (op->flag & OPP_ASCIIZ) - op->len--; - } - } else - op = (openprom_property *)filp->private_data; - if (!count || !(op->len || (op->flag & OPP_ASCIIZ))) - return 0; - if (*ppos >= 0xffffff || count >= 0xffffff) - return -EINVAL; - if (op->flag & OPP_STRINGLIST) { - for (k = 0, p = op->value; p < op->value + op->len; p++) - if (!*p) - k++; - i = op->len + 4 * k + 3; - } else if (op->flag & OPP_STRING) { - i = op->len + 3; - } else if (op->flag & OPP_BINARY) { - i = (op->len * 9) >> 2; - } else { - i = (op->len << 1) + 1; - } - k = *ppos; - if (k >= i) return 0; - if (count > i - k) count = i - k; - if (op->flag & OPP_STRING) { - if (!k) { - if (put_user('\'', buf)) - return -EFAULT; - k++; - count--; - } + int i; - if (k + count >= i - 2) - j = i - 2 - k; - else - j = count; - - if (j >= 0) { - if (copy_to_user(buf + k - *ppos, - op->value + k - 1, j)) - return -EFAULT; - count -= j; - k += j; - } + for (i = 0; i < len; i++) { + unsigned char val = p[i]; - if (count) { - if (put_user('\'', &buf [k++ - *ppos])) - return -EFAULT; - } - if (count > 1) { - if (put_user('\n', &buf [k++ - *ppos])) - return -EFAULT; - } - } else if (op->flag & OPP_STRINGLIST) { - char *tmp; - - tmp = kmalloc (i, GFP_KERNEL); - if (!tmp) - return -ENOMEM; - - s = tmp; - *s++ = '\''; - for (p = op->value; p < op->value + op->len; p++) { - if (!*p) { - strcpy(s, "' + '"); - s += 5; - continue; - } - *s++ = *p; - } - strcpy(s, "'\n"); - - if (copy_to_user(buf, tmp + k, count)) - return -EFAULT; - - kfree(tmp); - k += count; - - } else if (op->flag & OPP_BINARY) { - char buffer[10]; - u32 *first, *last; - int first_off, last_cnt; - - first = ((u32 *)op->value) + k / 9; - first_off = k % 9; - last = ((u32 *)op->value) + (k + count - 1) / 9; - last_cnt = (k + count) % 9; - if (!last_cnt) last_cnt = 9; - - if (first == last) { - sprintf (buffer, "%08x.", *first); - if (copy_to_user(buf, buffer + first_off, - last_cnt - first_off)) - return -EFAULT; - buf += last_cnt - first_off; - } else { - for (q = first; q <= last; q++) { - sprintf (buffer, "%08x.", *q); - if (q == first) { - if (copy_to_user(buf, buffer + first_off, - 9 - first_off)) - return -EFAULT; - buf += 9 - first_off; - } else if (q == last) { - if (copy_to_user(buf, buffer, last_cnt)) - return -EFAULT; - buf += last_cnt; - } else { - if (copy_to_user(buf, buffer, 9)) - return -EFAULT; - buf += 9; - } - } - } + if ((i && !val) || + (val >= ' ' && val <= '~')) + continue; - if (last == (u32 *)(op->value + op->len - 4) && last_cnt == 9) { - if (put_user('\n', (buf - 1))) - return -EFAULT; - } + return 0; + } - k += count; + return 1; +} - } else if (op->flag & OPP_HEXSTRING) { - char buffer[3]; +static int property_show(struct seq_file *f, void *v) +{ + struct property *prop = f->private; + void *pval; + int len; - if ((k < i - 1) && (k & 1)) { - sprintf (buffer, "%02x", - (unsigned char) *(op->value + (k >> 1)) & 0xff); - if (put_user(buffer[1], &buf[k++ - *ppos])) - return -EFAULT; - count--; - } + len = prop->length; + pval = prop->value; - for (; (count > 1) && (k < i - 1); k += 2) { - sprintf (buffer, "%02x", - (unsigned char) *(op->value + (k >> 1)) & 0xff); - if (copy_to_user(buf + k - *ppos, buffer, 2)) - return -EFAULT; - count -= 2; - } + if (is_string(pval, len)) { + while (len > 0) { + int n = strlen(pval); - if (count && (k < i - 1)) { - sprintf (buffer, "%02x", - (unsigned char) *(op->value + (k >> 1)) & 0xff); - if (put_user(buffer[0], &buf[k++ - *ppos])) - return -EFAULT; - count--; - } + seq_printf(f, "%s", (char *) pval); - if (count) { - if (put_user('\n', &buf [k++ - *ppos])) - return -EFAULT; - } - } - count = k - *ppos; - *ppos = k; - return count; -} + /* Skip over the NULL byte too. */ + pval += n + 1; + len -= n + 1; -static ssize_t property_write(struct file *filp, const char __user *buf, - size_t count, loff_t *ppos) -{ - int i, j, k; - char *p; - u32 *q; - void *b; - openprom_property *op; - - if (*ppos >= 0xffffff || count >= 0xffffff) - return -EINVAL; - if (!filp->private_data) { - i = property_read (filp, NULL, 0, NULL); - if (i) - return i; - } - k = *ppos; - op = (openprom_property *)filp->private_data; - if (!(op->flag & OPP_STRING)) { - u32 *first, *last; - int first_off, last_cnt; - u32 mask, mask2; - char tmp [9]; - int forcelen = 0; - - j = k % 9; - for (i = 0; i < count; i++, j++) { - if (j == 9) j = 0; - if (!j) { - char ctmp; - if (get_user(ctmp, &buf[i])) - return -EFAULT; - if (ctmp != '.') { - if (ctmp != '\n') { - if (op->flag & OPP_BINARY) - return -EINVAL; - else - goto write_try_string; - } else { - count = i + 1; - forcelen = 1; - break; - } - } - } else { - char ctmp; - if (get_user(ctmp, &buf[i])) - return -EFAULT; - if (ctmp < '0' || - (ctmp > '9' && ctmp < 'A') || - (ctmp > 'F' && ctmp < 'a') || - ctmp > 'f') { - if (op->flag & OPP_BINARY) - return -EINVAL; - else - goto write_try_string; - } - } - } - op->flag |= OPP_BINARY; - tmp [8] = 0; - i = ((count + k + 8) / 9) << 2; - if (op->alloclen <= i) { - b = kmalloc (sizeof (openprom_property) + 2 * i, - GFP_KERNEL); - if (!b) - return -ENOMEM; - memcpy (b, filp->private_data, - sizeof (openprom_property) - + strlen (op->name) + op->alloclen); - memset (((char *)b) + sizeof (openprom_property) - + strlen (op->name) + op->alloclen, - 0, 2 * i - op->alloclen); - op = (openprom_property *)b; - op->alloclen = 2*i; - b = filp->private_data; - filp->private_data = (void *)op; - kfree (b); + if (len > 0) + seq_printf(f, " + "); } - first = ((u32 *)op->value) + (k / 9); - first_off = k % 9; - last = (u32 *)(op->value + i); - last_cnt = (k + count) % 9; - if (first + 1 == last) { - memset (tmp, '0', 8); - if (copy_from_user(tmp + first_off, buf, - (count + first_off > 8) ? - 8 - first_off : count)) - return -EFAULT; - mask = 0xffffffff; - mask2 = 0xffffffff; - for (j = 0; j < first_off; j++) - mask >>= 1; - for (j = 8 - count - first_off; j > 0; j--) - mask2 <<= 1; - mask &= mask2; - if (mask) { - *first &= ~mask; - *first |= simple_strtoul (tmp, NULL, 16); - op->flag |= OPP_DIRTY; + } else { + if (len & 3) { + while (len) { + len--; + if (len) + seq_printf(f, "%02x.", + *(unsigned char *) pval); + else + seq_printf(f, "%02x", + *(unsigned char *) pval); + pval++; } } else { - op->flag |= OPP_DIRTY; - for (q = first; q < last; q++) { - if (q == first) { - if (first_off < 8) { - memset (tmp, '0', 8); - if (copy_from_user(tmp + first_off, - buf, - 8 - first_off)) - return -EFAULT; - mask = 0xffffffff; - for (j = 0; j < first_off; j++) - mask >>= 1; - *q &= ~mask; - *q |= simple_strtoul (tmp,NULL,16); - } - buf += 9; - } else if ((q == last - 1) && last_cnt - && (last_cnt < 8)) { - memset (tmp, '0', 8); - if (copy_from_user(tmp, buf, last_cnt)) - return -EFAULT; - mask = 0xffffffff; - for (j = 0; j < 8 - last_cnt; j++) - mask <<= 1; - *q &= ~mask; - *q |= simple_strtoul (tmp, NULL, 16); - buf += last_cnt; - } else { - char tchars[17]; /* XXX yuck... */ - - if (copy_from_user(tchars, buf, 16)) - return -EFAULT; - *q = simple_strtoul (tchars, NULL, 16); - buf += 9; - } - } - } - if (!forcelen) { - if (op->len < i) - op->len = i; - } else - op->len = i; - *ppos += count; - } -write_try_string: - if (!(op->flag & OPP_BINARY)) { - if (!(op->flag & (OPP_QUOTED | OPP_NOTQUOTED))) { - char ctmp; - - /* No way, if somebody starts writing from the middle, - * we don't know whether he uses quotes around or not - */ - if (k > 0) - return -EINVAL; - if (get_user(ctmp, buf)) - return -EFAULT; - if (ctmp == '\'') { - op->flag |= OPP_QUOTED; - buf++; - count--; - (*ppos)++; - if (!count) { - op->flag |= OPP_STRING; - return 1; - } - } else - op->flag |= OPP_NOTQUOTED; - } - op->flag |= OPP_STRING; - if (op->alloclen <= count + *ppos) { - b = kmalloc (sizeof (openprom_property) - + 2 * (count + *ppos), GFP_KERNEL); - if (!b) - return -ENOMEM; - memcpy (b, filp->private_data, - sizeof (openprom_property) - + strlen (op->name) + op->alloclen); - memset (((char *)b) + sizeof (openprom_property) - + strlen (op->name) + op->alloclen, - 0, 2*(count - *ppos) - op->alloclen); - op = (openprom_property *)b; - op->alloclen = 2*(count + *ppos); - b = filp->private_data; - filp->private_data = (void *)op; - kfree (b); - } - p = op->value + *ppos - ((op->flag & OPP_QUOTED) ? 1 : 0); - if (copy_from_user(p, buf, count)) - return -EFAULT; - op->flag |= OPP_DIRTY; - for (i = 0; i < count; i++, p++) - if (*p == '\n') { - *p = 0; - break; + while (len >= 4) { + len -= 4; + + if (len) + seq_printf(f, "%08x.", + *(unsigned int *) pval); + else + seq_printf(f, "%08x", + *(unsigned int *) pval); + pval += 4; } - if (i < count) { - op->len = p - op->value; - *ppos += i + 1; - if ((p > op->value) && (op->flag & OPP_QUOTED) - && (*(p - 1) == '\'')) - op->len--; - } else { - if (p - op->value > op->len) - op->len = p - op->value; - *ppos += count; } } - return *ppos - k; + seq_printf(f, "\n"); + + return 0; } -int property_release (struct inode *inode, struct file *filp) +static void *property_start(struct seq_file *f, loff_t *pos) { - openprom_property *op = (openprom_property *)filp->private_data; - int error; - u32 node; - - if (!op) - return 0; - lock_kernel(); - node = nodes[(u16)((long)inode->u.generic_ip)].node; - if ((u16)((long)inode->u.generic_ip) == aliases) { - if ((op->flag & OPP_DIRTY) && (op->flag & OPP_STRING)) { - char *p = op->name; - int i = (op->value - op->name) - strlen (op->name) - 1; - op->value [op->len] = 0; - *(op->value - 1) = ' '; - if (i) { - for (p = op->value - i - 2; p >= op->name; p--) - p[i] = *p; - p = op->name + i; - } - memcpy (p - 8, "nvalias ", 8); - prom_feval (p - 8); - } - } else if (op->flag & OPP_DIRTY) { - if (op->flag & OPP_STRING) { - op->value [op->len] = 0; - error = prom_setprop (node, op->name, - op->value, op->len + 1); - if (error <= 0) - printk (KERN_WARNING "openpromfs: " - "Couldn't write property %s\n", - op->name); - } else if ((op->flag & OPP_BINARY) || !op->len) { - error = prom_setprop (node, op->name, - op->value, op->len); - if (error <= 0) - printk (KERN_WARNING "openpromfs: " - "Couldn't write property %s\n", - op->name); - } else { - printk (KERN_WARNING "openpromfs: " - "Unknown property type of %s\n", - op->name); - } + if (*pos == 0) + return pos; + return NULL; +} + +static void *property_next(struct seq_file *f, void *v, loff_t *pos) +{ + (*pos)++; + return NULL; +} + +static void property_stop(struct seq_file *f, void *v) +{ + /* Nothing to do */ +} + +static struct seq_operations property_op = { + .start = property_start, + .next = property_next, + .stop = property_stop, + .show = property_show +}; + +static int property_open(struct inode *inode, struct file *file) +{ + struct op_inode_info *oi = OP_I(inode); + int ret; + + BUG_ON(oi->type != op_inode_prop); + + ret = seq_open(file, &property_op); + if (!ret) { + struct seq_file *m = file->private_data; + m->private = oi->u.prop; } - unlock_kernel(); - kfree (filp->private_data); - return 0; + return ret; } static const struct file_operations openpromfs_prop_ops = { - .read = property_read, - .write = property_write, - .release = property_release, + .open = property_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, }; -static const struct file_operations openpromfs_nodenum_ops = { - .read = nodenum_read, -}; +static int openpromfs_readdir(struct file *, void *, filldir_t); static const struct file_operations openprom_operations = { .read = generic_read_dir, .readdir = openpromfs_readdir, }; -static struct inode_operations openprom_alias_inode_operations = { - .create = openpromfs_create, - .lookup = openpromfs_lookup, - .unlink = openpromfs_unlink, -}; +static struct dentry *openpromfs_lookup(struct inode *, struct dentry *, struct nameidata *); static struct inode_operations openprom_inode_operations = { .lookup = openpromfs_lookup, }; -static int lookup_children(u16 n, const char * name, int len) -{ - int ret; - u16 node; - for (; n != 0xffff; n = nodes[n].next) { - node = nodes[n].child; - if (node != 0xffff) { - char buffer[128]; - int i; - char *p; - - while (node != 0xffff) { - if (prom_getname (nodes[node].node, - buffer, 128) >= 0) { - i = strlen (buffer); - if ((len == i) - && !strncmp (buffer, name, len)) - return NODE2INO(node); - p = strchr (buffer, '@'); - if (p && (len == p - buffer) - && !strncmp (buffer, name, len)) - return NODE2INO(node); - } - node = nodes[node].next; - } - } else - continue; - ret = lookup_children (nodes[n].child, name, len); - if (ret) return ret; - } - return 0; -} - -static struct dentry *openpromfs_lookup(struct inode * dir, struct dentry *dentry, struct nameidata *nd) +static struct dentry *openpromfs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd) { - int ino = 0; -#define OPFSL_DIR 0 -#define OPFSL_PROPERTY 1 -#define OPFSL_NODENUM 2 - int type = 0; - char buffer[128]; - char *p; + struct op_inode_info *ent_oi, *oi = OP_I(dir); + struct device_node *dp, *child; + struct property *prop; + enum op_inode_type ent_type; + union op_inode_data ent_data; const char *name; - u32 n; - u16 dirnode; - unsigned int len; - int i; struct inode *inode; - char buffer2[64]; + unsigned int ino; + int len; - inode = NULL; + BUG_ON(oi->type != op_inode_node); + + dp = oi->u.node; + name = dentry->d_name.name; len = dentry->d_name.len; - lock_kernel(); - if (name [0] == '.' && len == 5 && !strncmp (name + 1, "node", 4)) { - ino = NODEP2INO(NODE(dir->i_ino).first_prop); - type = OPFSL_NODENUM; - } - if (!ino) { - u16 node = NODE(dir->i_ino).child; - while (node != 0xffff) { - if (prom_getname (nodes[node].node, buffer, 128) >= 0) { - i = strlen (buffer); - if (len == i && !strncmp (buffer, name, len)) { - ino = NODE2INO(node); - type = OPFSL_DIR; - break; - } - p = strchr (buffer, '@'); - if (p && (len == p - buffer) - && !strncmp (buffer, name, len)) { - ino = NODE2INO(node); - type = OPFSL_DIR; - break; - } - } - node = nodes[node].next; - } - } - n = NODE(dir->i_ino).node; - dirnode = dir->i_ino - OPENPROM_FIRST_INO; - if (!ino) { - int j = NODEP2INO(NODE(dir->i_ino).first_prop); - if (dirnode != aliases) { - for (p = prom_firstprop (n, buffer2); - p && *p; - p = prom_nextprop (n, p, buffer2)) { - j++; - if ((len == strlen (p)) - && !strncmp (p, name, len)) { - ino = j; - type = OPFSL_PROPERTY; - break; - } - } - } else { - int k; - for (k = 0; k < aliases_nodes; k++) { - j++; - if (alias_names [k] - && (len == strlen (alias_names [k])) - && !strncmp (alias_names [k], name, len)) { - ino = j; - type = OPFSL_PROPERTY; - break; - } - } + + mutex_lock(&op_mutex); + + child = dp->child; + while (child) { + int n = strlen(child->path_component_name); + + if (len == n && + !strncmp(child->path_component_name, name, len)) { + ent_type = op_inode_node; + ent_data.node = child; + ino = child->unique_id; + goto found; } + child = child->sibling; } - if (!ino) { - ino = lookup_children (NODE(dir->i_ino).child, name, len); - if (ino) - type = OPFSL_DIR; - else { - unlock_kernel(); - return ERR_PTR(-ENOENT); + + prop = dp->properties; + while (prop) { + int n = strlen(prop->name); + + if (len == n && !strncmp(prop->name, name, len)) { + ent_type = op_inode_prop; + ent_data.prop = prop; + ino = prop->unique_id; + goto found; } + + prop = prop->next; } - inode = iget (dir->i_sb, ino); - unlock_kernel(); + + mutex_unlock(&op_mutex); + return ERR_PTR(-ENOENT); + +found: + inode = iget(dir->i_sb, ino); + mutex_unlock(&op_mutex); if (!inode) return ERR_PTR(-EINVAL); - switch (type) { - case OPFSL_DIR: + ent_oi = OP_I(inode); + ent_oi->type = ent_type; + ent_oi->u = ent_data; + + switch (ent_type) { + case op_inode_node: inode->i_mode = S_IFDIR | S_IRUGO | S_IXUGO; - if (ino == OPENPROM_FIRST_INO + aliases) { - inode->i_mode |= S_IWUSR; - inode->i_op = &openprom_alias_inode_operations; - } else - inode->i_op = &openprom_inode_operations; + inode->i_op = &openprom_inode_operations; inode->i_fop = &openprom_operations; inode->i_nlink = 2; break; - case OPFSL_NODENUM: - inode->i_mode = S_IFREG | S_IRUGO; - inode->i_fop = &openpromfs_nodenum_ops; - inode->i_nlink = 1; - inode->u.generic_ip = (void *)(long)(n); - break; - case OPFSL_PROPERTY: - if ((dirnode == options) && (len == 17) - && !strncmp (name, "security-password", 17)) + case op_inode_prop: + if (!strcmp(dp->name, "options") && (len == 17) && + !strncmp (name, "security-password", 17)) inode->i_mode = S_IFREG | S_IRUSR | S_IWUSR; - else { + else inode->i_mode = S_IFREG | S_IRUGO; - if (dirnode == options || dirnode == aliases) { - if (len != 4 || strncmp (name, "name", 4)) - inode->i_mode |= S_IWUSR; - } - } inode->i_fop = &openpromfs_prop_ops; inode->i_nlink = 1; - if (inode->i_size < 0) - inode->i_size = 0; - inode->u.generic_ip = (void *)(long)(((u16)dirnode) | - (((u16)(ino - NODEP2INO(NODE(dir->i_ino).first_prop) - 1)) << 16)); + inode->i_size = ent_oi->u.prop->length; break; } @@ -775,237 +263,89 @@ static struct dentry *openpromfs_lookup(struct inode * dir, struct dentry *dentr static int openpromfs_readdir(struct file * filp, void * dirent, filldir_t filldir) { struct inode *inode = filp->f_dentry->d_inode; + struct op_inode_info *oi = OP_I(inode); + struct device_node *dp = oi->u.node; + struct device_node *child; + struct property *prop; unsigned int ino; - u32 n; - int i, j; - char buffer[128]; - u16 node; - char *p; - char buffer2[64]; - - lock_kernel(); + int i; + + mutex_lock(&op_mutex); ino = inode->i_ino; i = filp->f_pos; switch (i) { case 0: - if (filldir(dirent, ".", 1, i, ino, DT_DIR) < 0) goto out; + if (filldir(dirent, ".", 1, i, ino, DT_DIR) < 0) + goto out; i++; filp->f_pos++; /* fall thru */ case 1: - if (filldir(dirent, "..", 2, i, - (NODE(ino).parent == 0xffff) ? - OPENPROM_ROOT_INO : NODE2INO(NODE(ino).parent), DT_DIR) < 0) + if (filldir(dirent, "..", 2, i, + (dp->parent == NULL ? + OPENPROM_ROOT_INO : + dp->parent->unique_id), DT_DIR) < 0) goto out; i++; filp->f_pos++; /* fall thru */ default: i -= 2; - node = NODE(ino).child; - while (i && node != 0xffff) { - node = nodes[node].next; + + /* First, the children nodes as directories. */ + child = dp->child; + while (i && child) { + child = child->sibling; i--; } - while (node != 0xffff) { - if (prom_getname (nodes[node].node, buffer, 128) < 0) - goto out; - if (filldir(dirent, buffer, strlen(buffer), - filp->f_pos, NODE2INO(node), DT_DIR) < 0) + while (child) { + if (filldir(dirent, + child->path_component_name, + strlen(child->path_component_name), + filp->f_pos, child->unique_id, DT_DIR) < 0) goto out; + filp->f_pos++; - node = nodes[node].next; + child = child->sibling; } - j = NODEP2INO(NODE(ino).first_prop); - if (!i) { - if (filldir(dirent, ".node", 5, filp->f_pos, j, DT_REG) < 0) + + /* Next, the properties as files. */ + prop = dp->properties; + while (i && prop) { + prop = prop->next; + i--; + } + while (prop) { + if (filldir(dirent, prop->name, strlen(prop->name), + filp->f_pos, prop->unique_id, DT_REG) < 0) goto out; + filp->f_pos++; - } else - i--; - n = NODE(ino).node; - if (ino == OPENPROM_FIRST_INO + aliases) { - for (j++; i < aliases_nodes; i++, j++) { - if (alias_names [i]) { - if (filldir (dirent, alias_names [i], - strlen (alias_names [i]), - filp->f_pos, j, DT_REG) < 0) goto out; - filp->f_pos++; - } - } - } else { - for (p = prom_firstprop (n, buffer2); - p && *p; - p = prom_nextprop (n, p, buffer2)) { - j++; - if (i) i--; - else { - if (filldir(dirent, p, strlen(p), - filp->f_pos, j, DT_REG) < 0) - goto out; - filp->f_pos++; - } - } + prop = prop->next; } } out: - unlock_kernel(); - return 0; -} - -static int openpromfs_create (struct inode *dir, struct dentry *dentry, int mode, - struct nameidata *nd) -{ - char *p; - struct inode *inode; - - if (!dir) - return -ENOENT; - if (dentry->d_name.len > 256) - return -EINVAL; - p = kmalloc (dentry->d_name.len + 1, GFP_KERNEL); - if (!p) - return -ENOMEM; - strncpy (p, dentry->d_name.name, dentry->d_name.len); - p [dentry->d_name.len] = 0; - lock_kernel(); - if (aliases_nodes == ALIASES_NNODES) { - kfree(p); - unlock_kernel(); - return -EIO; - } - alias_names [aliases_nodes++] = p; - inode = iget (dir->i_sb, - NODEP2INO(NODE(dir->i_ino).first_prop) + aliases_nodes); - if (!inode) { - unlock_kernel(); - return -EINVAL; - } - inode->i_mode = S_IFREG | S_IRUGO | S_IWUSR; - inode->i_fop = &openpromfs_prop_ops; - inode->i_nlink = 1; - if (inode->i_size < 0) inode->i_size = 0; - inode->u.generic_ip = (void *)(long)(((u16)aliases) | - (((u16)(aliases_nodes - 1)) << 16)); - unlock_kernel(); - d_instantiate(dentry, inode); + mutex_unlock(&op_mutex); return 0; } -static int openpromfs_unlink (struct inode *dir, struct dentry *dentry) -{ - unsigned int len; - char *p; - const char *name; - int i; - - name = dentry->d_name.name; - len = dentry->d_name.len; - lock_kernel(); - for (i = 0; i < aliases_nodes; i++) - if ((strlen (alias_names [i]) == len) - && !strncmp (name, alias_names[i], len)) { - char buffer[512]; - - p = alias_names [i]; - alias_names [i] = NULL; - kfree (p); - strcpy (buffer, "nvunalias "); - memcpy (buffer + 10, name, len); - buffer [10 + len] = 0; - prom_feval (buffer); - } - unlock_kernel(); - return 0; -} +static kmem_cache_t *op_inode_cachep; -/* {{{ init section */ -static int __init check_space (u16 n) +static struct inode *openprom_alloc_inode(struct super_block *sb) { - unsigned long pages; + struct op_inode_info *oi; - if ((1 << alloced) * PAGE_SIZE < (n + 2) * sizeof(openpromfs_node)) { - pages = __get_free_pages (GFP_KERNEL, alloced + 1); - if (!pages) - return -1; + oi = kmem_cache_alloc(op_inode_cachep, SLAB_KERNEL); + if (!oi) + return NULL; - if (nodes) { - memcpy ((char *)pages, (char *)nodes, - (1 << alloced) * PAGE_SIZE); - free_pages ((unsigned long)nodes, alloced); - } - alloced++; - nodes = (openpromfs_node *)pages; - } - return 0; + return &oi->vfs_inode; } -static u16 __init get_nodes (u16 parent, u32 node) +static void openprom_destroy_inode(struct inode *inode) { - char *p; - u16 n = last_node++, i; - char buffer[64]; - - if (check_space (n) < 0) - return 0xffff; - nodes[n].parent = parent; - nodes[n].node = node; - nodes[n].next = 0xffff; - nodes[n].child = 0xffff; - nodes[n].first_prop = first_prop++; - if (!parent) { - char buffer[8]; - int j; - - if ((j = prom_getproperty (node, "name", buffer, 8)) >= 0) { - buffer[j] = 0; - if (!strcmp (buffer, "options")) - options = n; - else if (!strcmp (buffer, "aliases")) - aliases = n; - } - } - if (n != aliases) - for (p = prom_firstprop (node, buffer); - p && p != (char *)-1 && *p; - p = prom_nextprop (node, p, buffer)) - first_prop++; - else { - char *q; - for (p = prom_firstprop (node, buffer); - p && p != (char *)-1 && *p; - p = prom_nextprop (node, p, buffer)) { - if (aliases_nodes == ALIASES_NNODES) - break; - for (i = 0; i < aliases_nodes; i++) - if (!strcmp (p, alias_names [i])) - break; - if (i < aliases_nodes) - continue; - q = kmalloc (strlen (p) + 1, GFP_KERNEL); - if (!q) - return 0xffff; - strcpy (q, p); - alias_names [aliases_nodes++] = q; - } - first_prop += ALIASES_NNODES; - } - node = prom_getchild (node); - if (node) { - parent = get_nodes (n, node); - if (parent == 0xffff) - return 0xffff; - nodes[n].child = parent; - while ((node = prom_getsibling (node)) != 0) { - i = get_nodes (n, node); - if (i == 0xffff) - return 0xffff; - nodes[parent].next = i; - parent = i; - } - } - return n; + kmem_cache_free(op_inode_cachep, OP_I(inode)); } static void openprom_read_inode(struct inode * inode) @@ -1025,6 +365,8 @@ static int openprom_remount(struct super_block *sb, int *flags, char *data) } static struct super_operations openprom_sops = { + .alloc_inode = openprom_alloc_inode, + .destroy_inode = openprom_destroy_inode, .read_inode = openprom_read_inode, .statfs = simple_statfs, .remount_fs = openprom_remount, @@ -1032,7 +374,8 @@ static struct super_operations openprom_sops = { static int openprom_fill_super(struct super_block *s, void *data, int silent) { - struct inode * root_inode; + struct inode *root_inode; + struct op_inode_info *oi; s->s_flags |= MS_NOATIME; s->s_blocksize = 1024; @@ -1043,6 +386,11 @@ static int openprom_fill_super(struct super_block *s, void *data, int silent) root_inode = iget(s, OPENPROM_ROOT_INO); if (!root_inode) goto out_no_root; + + oi = OP_I(root_inode); + oi->type = op_inode_node; + oi->u.node = of_find_node_by_path("/"); + s->s_root = d_alloc_root(root_inode); if (!s->s_root) goto out_no_root; @@ -1054,10 +402,10 @@ out_no_root: return -ENOMEM; } -static struct super_block *openprom_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int openprom_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_single(fs_type, flags, data, openprom_fill_super); + return get_sb_single(fs_type, flags, data, openprom_fill_super, mnt); } static struct file_system_type openprom_fs_type = { @@ -1067,29 +415,39 @@ static struct file_system_type openprom_fs_type = { .kill_sb = kill_anon_super, }; +static void op_inode_init_once(void *data, kmem_cache_t * cachep, unsigned long flags) +{ + struct op_inode_info *oi = (struct op_inode_info *) data; + + if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) == + SLAB_CTOR_CONSTRUCTOR) + inode_init_once(&oi->vfs_inode); +} + static int __init init_openprom_fs(void) { - nodes = (openpromfs_node *)__get_free_pages(GFP_KERNEL, 0); - if (!nodes) { - printk (KERN_WARNING "openpromfs: can't get free page\n"); - return -EIO; - } - if (get_nodes (0xffff, prom_root_node) == 0xffff) { - printk (KERN_WARNING "openpromfs: couldn't setup tree\n"); - return -EIO; - } - nodes[last_node].first_prop = first_prop; - return register_filesystem(&openprom_fs_type); + int err; + + op_inode_cachep = kmem_cache_create("op_inode_cache", + sizeof(struct op_inode_info), + 0, + (SLAB_RECLAIM_ACCOUNT | + SLAB_MEM_SPREAD), + op_inode_init_once, NULL); + if (!op_inode_cachep) + return -ENOMEM; + + err = register_filesystem(&openprom_fs_type); + if (err) + kmem_cache_destroy(op_inode_cachep); + + return err; } static void __exit exit_openprom_fs(void) { - int i; unregister_filesystem(&openprom_fs_type); - free_pages ((unsigned long)nodes, alloced); - for (i = 0; i < aliases_nodes; i++) - kfree (alias_names [i]); - nodes = NULL; + kmem_cache_destroy(op_inode_cachep); } module_init(init_openprom_fs) diff --git a/fs/partitions/Kconfig b/fs/partitions/Kconfig index c9a478099..e478f1941 100644 --- a/fs/partitions/Kconfig +++ b/fs/partitions/Kconfig @@ -99,7 +99,7 @@ config IBM_PARTITION config MAC_PARTITION bool "Macintosh partition map support" if PARTITION_ADVANCED - default y if MAC + default y if (MAC || PPC_PMAC) help Say Y here if you would like to use hard disks under Linux which were partitioned on a Macintosh. diff --git a/fs/partitions/Makefile b/fs/partitions/Makefile index 42c7d3878..d713ce6b3 100644 --- a/fs/partitions/Makefile +++ b/fs/partitions/Makefile @@ -4,7 +4,6 @@ obj-y := check.o -obj-$(CONFIG_DEVFS_FS) += devfs.o obj-$(CONFIG_ACORN_PARTITION) += acorn.o obj-$(CONFIG_AMIGA_PARTITION) += amiga.o obj-$(CONFIG_ATARI_PARTITION) += atari.o diff --git a/fs/partitions/acorn.c b/fs/partitions/acorn.c index c05085710..1bc9f372c 100644 --- a/fs/partitions/acorn.c +++ b/fs/partitions/acorn.c @@ -12,7 +12,6 @@ * every single manufacturer of SCSI and IDE cards created their own * method. */ -#include #include #include diff --git a/fs/partitions/check.c b/fs/partitions/check.c index 7ef1f094d..51c6a748d 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c @@ -18,10 +18,8 @@ #include #include #include -#include #include "check.h" -#include "devfs.h" #include "acorn.h" #include "amiga.h" @@ -161,18 +159,11 @@ check_partition(struct gendisk *hd, struct block_device *bdev) if (!state) return NULL; -#ifdef CONFIG_DEVFS_FS - if (hd->devfs_name[0] != '\0') { - printk(KERN_INFO " /dev/%s:", hd->devfs_name); + disk_name(hd, 0, state->name); + printk(KERN_INFO " %s:", state->name); + if (isdigit(state->name[strlen(state->name)-1])) sprintf(state->name, "p"); - } -#endif - else { - disk_name(hd, 0, state->name); - printk(KERN_INFO " %s:", state->name); - if (isdigit(state->name[strlen(state->name)-1])) - sprintf(state->name, "p"); - } + state->limit = hd->minors; i = res = 0; while (!res && check_part[i]) { @@ -328,7 +319,7 @@ void delete_partition(struct gendisk *disk, int part) p->nr_sects = 0; p->ios[0] = p->ios[1] = 0; p->sectors[0] = p->sectors[1] = 0; - devfs_remove("%s/part%d", disk->devfs_name, part); + sysfs_remove_link(&p->kobj, "subsystem"); if (p->holder_dir) kobject_unregister(p->holder_dir); kobject_uevent(&p->kobj, KOBJ_REMOVE); @@ -348,10 +339,7 @@ void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len) p->start_sect = start; p->nr_sects = len; p->partno = part; - - devfs_mk_bdev(MKDEV(disk->major, disk->first_minor + part), - S_IFBLK|S_IRUSR|S_IWUSR, - "%s/part%d", disk->devfs_name, part); + p->policy = disk->policy; if (isdigit(disk->kobj.name[strlen(disk->kobj.name)-1])) snprintf(p->kobj.name,KOBJ_NAME_LEN,"%sp%d",disk->kobj.name,part); @@ -363,6 +351,7 @@ void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len) kobject_add(&p->kobj); if (!disk->part_uevent_suppress) kobject_uevent(&p->kobj, KOBJ_ADD); + sysfs_create_link(&p->kobj, &block_subsys.kset.kobj, "subsystem"); partition_sysfs_add_subdir(p); disk->part[part-1] = p; } @@ -398,6 +387,7 @@ static void disk_sysfs_symlinks(struct gendisk *disk) kfree(disk_name); } } + sysfs_create_link(&disk->kobj, &block_subsys.kset.kobj, "subsystem"); } /* Not exported, helper to add_disk(). */ @@ -420,14 +410,8 @@ void register_disk(struct gendisk *disk) disk_sysfs_add_subdirs(disk); /* No minors to use for partitions */ - if (disk->minors == 1) { - if (disk->devfs_name[0] != '\0') - devfs_add_disk(disk); + if (disk->minors == 1) goto exit; - } - - /* always add handle for the whole disk */ - devfs_add_partitioned(disk); /* No such device (e.g., media were just removed) */ if (!get_capacity(disk)) @@ -481,6 +465,10 @@ int rescan_partitions(struct gendisk *disk, struct block_device *bdev) sector_t from = state->parts[p].from; if (!size) continue; + if (from + size > get_capacity(disk)) { + printk(" %s: p%d exceeds device capacity\n", + disk->disk_name, p); + } add_partition(disk, p, from, size); #ifdef CONFIG_BLK_DEV_MD if (state->parts[p].flags) @@ -496,8 +484,8 @@ unsigned char *read_dev_sector(struct block_device *bdev, sector_t n, Sector *p) struct address_space *mapping = bdev->bd_inode->i_mapping; struct page *page; - page = read_cache_page(mapping, (pgoff_t)(n >> (PAGE_CACHE_SHIFT-9)), - (filler_t *)mapping->a_ops->readpage, NULL); + page = read_mapping_page(mapping, (pgoff_t)(n >> (PAGE_CACHE_SHIFT-9)), + NULL); if (!IS_ERR(page)) { wait_on_page_locked(page); if (!PageUptodate(page)) @@ -531,8 +519,6 @@ void del_gendisk(struct gendisk *disk) disk_stat_set_all(disk, 0); disk->stamp = 0; - devfs_remove_disk(disk); - kobject_uevent(&disk->kobj, KOBJ_REMOVE); if (disk->holder_dir) kobject_unregister(disk->holder_dir); @@ -548,5 +534,6 @@ void del_gendisk(struct gendisk *disk) put_device(disk->driverfs_dev); disk->driverfs_dev = NULL; } + sysfs_remove_link(&disk->kobj, "subsystem"); kobject_del(&disk->kobj); } diff --git a/fs/partitions/devfs.c b/fs/partitions/devfs.c deleted file mode 100644 index 3f0a780c9..000000000 --- a/fs/partitions/devfs.c +++ /dev/null @@ -1,130 +0,0 @@ -/* - * This tries to keep block devices away from devfs as much as possible. - */ -#include -#include -#include -#include -#include -#include - - -struct unique_numspace { - u32 num_free; /* Num free in bits */ - u32 length; /* Array length in bytes */ - unsigned long *bits; - struct semaphore mutex; -}; - -static DEFINE_MUTEX(numspace_mutex); - -static int expand_numspace(struct unique_numspace *s) -{ - u32 length; - void *bits; - - if (s->length < 16) - length = 16; - else - length = s->length << 1; - - bits = vmalloc(length); - if (!bits) - return -ENOMEM; - if (s->bits) { - memcpy(bits, s->bits, s->length); - vfree(s->bits); - } - - s->num_free = (length - s->length) << 3; - s->bits = bits; - memset(bits + s->length, 0, length - s->length); - s->length = length; - - return 0; -} - -static int alloc_unique_number(struct unique_numspace *s) -{ - int rval = 0; - - mutex_lock(&numspace_mutex); - if (s->num_free < 1) - rval = expand_numspace(s); - if (!rval) { - rval = find_first_zero_bit(s->bits, s->length << 3); - --s->num_free; - __set_bit(rval, s->bits); - } - mutex_unlock(&numspace_mutex); - - return rval; -} - -static void dealloc_unique_number(struct unique_numspace *s, int number) -{ - int old_val; - - if (number >= 0) { - mutex_lock(&numspace_mutex); - old_val = __test_and_clear_bit(number, s->bits); - if (old_val) - ++s->num_free; - mutex_unlock(&numspace_mutex); - } -} - -static struct unique_numspace disc_numspace; -static struct unique_numspace cdrom_numspace; - -void devfs_add_partitioned(struct gendisk *disk) -{ - char dirname[64], symlink[16]; - - devfs_mk_dir(disk->devfs_name); - devfs_mk_bdev(MKDEV(disk->major, disk->first_minor), - S_IFBLK|S_IRUSR|S_IWUSR, - "%s/disc", disk->devfs_name); - - disk->number = alloc_unique_number(&disc_numspace); - - sprintf(symlink, "discs/disc%d", disk->number); - sprintf(dirname, "../%s", disk->devfs_name); - devfs_mk_symlink(symlink, dirname); - -} - -void devfs_add_disk(struct gendisk *disk) -{ - devfs_mk_bdev(MKDEV(disk->major, disk->first_minor), - (disk->flags & GENHD_FL_CD) ? - S_IFBLK|S_IRUGO|S_IWUGO : - S_IFBLK|S_IRUSR|S_IWUSR, - "%s", disk->devfs_name); - - if (disk->flags & GENHD_FL_CD) { - char dirname[64], symlink[16]; - - disk->number = alloc_unique_number(&cdrom_numspace); - - sprintf(symlink, "cdroms/cdrom%d", disk->number); - sprintf(dirname, "../%s", disk->devfs_name); - devfs_mk_symlink(symlink, dirname); - } -} - -void devfs_remove_disk(struct gendisk *disk) -{ - if (disk->minors != 1) { - devfs_remove("discs/disc%d", disk->number); - dealloc_unique_number(&disc_numspace, disk->number); - devfs_remove("%s/disc", disk->devfs_name); - } - if (disk->flags & GENHD_FL_CD) { - devfs_remove("cdroms/cdrom%d", disk->number); - dealloc_unique_number(&cdrom_numspace, disk->number); - } - devfs_remove(disk->devfs_name); -} - - diff --git a/fs/partitions/devfs.h b/fs/partitions/devfs.h deleted file mode 100644 index 176118b4e..000000000 --- a/fs/partitions/devfs.h +++ /dev/null @@ -1,10 +0,0 @@ - -#ifdef CONFIG_DEVFS_FS -void devfs_add_disk(struct gendisk *dev); -void devfs_add_partitioned(struct gendisk *dev); -void devfs_remove_disk(struct gendisk *dev); -#else -# define devfs_add_disk(disk) do { } while (0) -# define devfs_add_partitioned(disk) do { } while (0) -# define devfs_remove_disk(disk) do { } while (0) -#endif diff --git a/fs/partitions/efi.c b/fs/partitions/efi.c index 0f5b017ae..63730282a 100644 --- a/fs/partitions/efi.c +++ b/fs/partitions/efi.c @@ -91,7 +91,6 @@ * - Code works, detects all the partitions. * ************************************************************/ -#include #include #include "check.h" #include "efi.h" diff --git a/fs/partitions/efi.h b/fs/partitions/efi.h index c44fb0561..2cc89d047 100644 --- a/fs/partitions/efi.h +++ b/fs/partitions/efi.h @@ -26,7 +26,6 @@ #define FS_PART_EFI_H_INCLUDED #include -#include #include #include #include diff --git a/fs/partitions/ibm.c b/fs/partitions/ibm.c index 830c55d86..d352a7381 100644 --- a/fs/partitions/ibm.c +++ b/fs/partitions/ibm.c @@ -6,7 +6,6 @@ * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 */ -#include #include #include #include diff --git a/fs/partitions/mac.c b/fs/partitions/mac.c index 813292f21..c0871002d 100644 --- a/fs/partitions/mac.c +++ b/fs/partitions/mac.c @@ -6,7 +6,6 @@ * Re-organised Feb 1998 Russell King */ -#include #include #include "check.h" #include "mac.h" diff --git a/fs/partitions/msdos.c b/fs/partitions/msdos.c index 9935d2541..8f12587c3 100644 --- a/fs/partitions/msdos.c +++ b/fs/partitions/msdos.c @@ -19,7 +19,6 @@ * Re-organised Feb 1998 Russell King */ -#include #include "check.h" #include "msdos.h" diff --git a/fs/partitions/sun.c b/fs/partitions/sun.c index abe91ca03..0a5927c80 100644 --- a/fs/partitions/sun.c +++ b/fs/partitions/sun.c @@ -74,7 +74,7 @@ int sun_partition(struct parsed_partitions *state, struct block_device *bdev) spc = be16_to_cpu(label->ntrks) * be16_to_cpu(label->nsect); for (i = 0; i < 8; i++, p++) { unsigned long st_sector; - int num_sectors; + unsigned int num_sectors; st_sector = be32_to_cpu(p->start_cylinder) * spc; num_sectors = be32_to_cpu(p->num_sectors); diff --git a/fs/pipe.c b/fs/pipe.c index 359fe9018..ed0d780ed 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -879,7 +879,6 @@ static struct inode * get_pipe_inode(void) inode->i_uid = current->fsuid; inode->i_gid = current->fsgid; inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; - inode->i_blksize = PAGE_SIZE; return inode; @@ -981,12 +980,11 @@ EXPORT_SYMBOL_GPL(do_pipe); * any operations on the root directory. However, we need a non-trivial * d_name - pipe: will go nicely and kill the special-casing in procfs. */ - -static struct super_block * -pipefs_get_sb(struct file_system_type *fs_type, int flags, - const char *dev_name, void *data) +static int pipefs_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, + struct vfsmount *mnt) { - return get_sb_pseudo(fs_type, "pipe:", NULL, PIPEFS_MAGIC); + return get_sb_pseudo(fs_type, "pipe:", NULL, PIPEFS_MAGIC, mnt); } static struct file_system_type pipe_fs_type = { diff --git a/fs/pnode.c b/fs/pnode.c index 37b568ed0..da42ee61c 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -53,8 +53,7 @@ static int do_make_slave(struct vfsmount *mnt) if (master) { list_for_each_entry(slave_mnt, &mnt->mnt_slave_list, mnt_slave) slave_mnt->mnt_master = master; - list_del(&mnt->mnt_slave); - list_add(&mnt->mnt_slave, &master->mnt_slave_list); + list_move(&mnt->mnt_slave, &master->mnt_slave_list); list_splice(&mnt->mnt_slave_list, master->mnt_slave_list.prev); INIT_LIST_HEAD(&mnt->mnt_slave_list); } else { @@ -283,10 +282,8 @@ static void __propagate_umount(struct vfsmount *mnt) * umount the child only if the child has no * other children */ - if (child && list_empty(&child->mnt_mounts)) { - list_del(&child->mnt_hash); - list_add_tail(&child->mnt_hash, &mnt->mnt_hash); - } + if (child && list_empty(&child->mnt_mounts)) + list_move_tail(&child->mnt_hash, &mnt->mnt_hash); } } diff --git a/fs/proc/array.c b/fs/proc/array.c index dc4d1d0aa..715194f0a 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c @@ -52,7 +52,6 @@ * : base.c too. */ -#include #include #include #include @@ -74,10 +73,11 @@ #include #include #include +#include #include +#include #include #include -#include #include #include @@ -164,16 +164,21 @@ static inline const char * get_task_state(struct task_struct *tsk) static inline char * task_state(struct task_struct *p, char *buffer) { + struct task_struct *tracer; + pid_t tracer_pid, pid, ptgid, tgid; struct group_info *group_info; int g; struct fdtable *fdt = NULL; - pid_t pid, ptgid, tppid, tgid; + + rcu_read_lock(); + tracer = tracehook_tracer_task(p); + tracer_pid = tracer == NULL ? 0 : vx_map_pid(tracer->pid); + rcu_read_unlock(); read_lock(&tasklist_lock); tgid = vx_map_tgid(p->tgid); pid = vx_map_pid(p->pid); - ptgid = vx_map_pid(p->group_leader->real_parent->tgid); - tppid = vx_map_pid(p->parent->pid); + ptgid = vx_map_pid(p->group_leader->parent->tgid); buffer += sprintf(buffer, "State:\t%s\n" "SleepAVG:\t%lu%%\n" @@ -186,7 +191,7 @@ static inline char * task_state(struct task_struct *p, char *buffer) get_task_state(p), (p->sleep_avg/1024)*100/(1020000000/1024), tgid, pid, (pid > 1) ? ptgid : 0, - pid_alive(p) && p->ptrace ? tppid : 0, + tracer_pid, p->uid, p->euid, p->suid, p->fsuid, p->gid, p->egid, p->sgid, p->fsgid); read_unlock(&tasklist_lock); @@ -444,7 +449,7 @@ static int do_task_stat(struct task_struct *task, char * buffer, int whole) } pid = vx_info_map_pid(task->vx_info, pid_alive(task) ? task->pid : 0); ppid = (!(pid > 1)) ? 0 : vx_info_map_tgid(task->vx_info, - task->group_leader->real_parent->tgid); + task->group_leader->parent->tgid); pgid = vx_info_map_pid(task->vx_info, pgid); read_unlock(&tasklist_lock); @@ -487,7 +492,7 @@ static int do_task_stat(struct task_struct *task, char * buffer, int whole) res = sprintf(buffer,"%d (%s) %c %d %d %d %d %d %lu %lu \ %lu %lu %lu %lu %lu %ld %ld %ld %ld %d 0 %llu %lu %ld %lu %lu %lu %lu %lu \ -%lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu %lu\n", +%lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu %lu %llu\n", pid, tcomm, state, @@ -531,7 +536,8 @@ static int do_task_stat(struct task_struct *task, char * buffer, int whole) task->exit_signal, task_cpu(task), task->rt_priority, - task->policy); + task->policy, + (unsigned long long)delayacct_blkio_ticks(task)); if(mm) mmput(mm); return res; diff --git a/fs/proc/base.c b/fs/proc/base.c index f6e0c6274..b7a5972f6 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -49,7 +49,6 @@ #include -#include #include #include #include @@ -68,14 +67,26 @@ #include #include #include +#include #include #include #include #include -#include +#include #include + #include "internal.h" +/* NOTE: + * Implementing inode permission operations in /proc is almost + * certainly an error. Permission checks need to happen during + * each system call not at open time. The reason is that most of + * what we wish to check for permissions in /proc varies at runtime. + * + * The classic example of a problem is opening file descriptors + * in /proc for a task before it execs a suid executable. + */ + /* * For hysterical raisins we keep the same inumbers as in the old procfs. * Feel free to change the macro below - just keep the range distinct from @@ -123,6 +134,8 @@ enum pid_directory_inos { PROC_TGID_ATTR_PREV, PROC_TGID_ATTR_EXEC, PROC_TGID_ATTR_FSCREATE, + PROC_TGID_ATTR_KEYCREATE, + PROC_TGID_ATTR_SOCKCREATE, #endif PROC_TGID_VX_INFO, PROC_TGID_IP_INFO, @@ -166,6 +179,8 @@ enum pid_directory_inos { PROC_TID_ATTR_PREV, PROC_TID_ATTR_EXEC, PROC_TID_ATTR_FSCREATE, + PROC_TID_ATTR_KEYCREATE, + PROC_TID_ATTR_SOCKCREATE, #endif PROC_TID_VX_INFO, PROC_TID_IP_INFO, @@ -179,6 +194,9 @@ enum pid_directory_inos { PROC_TID_FD_DIR = 0x8000, /* 0x8000-0xffff */ }; +/* Worst case buffer size needed for holding an integer. */ +#define PROC_NUMBUF 10 + struct pid_entry { int type; int len; @@ -285,6 +303,8 @@ static struct pid_entry tgid_attr_stuff[] = { E(PROC_TGID_ATTR_PREV, "prev", S_IFREG|S_IRUGO), E(PROC_TGID_ATTR_EXEC, "exec", S_IFREG|S_IRUGO|S_IWUGO), E(PROC_TGID_ATTR_FSCREATE, "fscreate", S_IFREG|S_IRUGO|S_IWUGO), + E(PROC_TGID_ATTR_KEYCREATE, "keycreate", S_IFREG|S_IRUGO|S_IWUGO), + E(PROC_TGID_ATTR_SOCKCREATE, "sockcreate", S_IFREG|S_IRUGO|S_IWUGO), {0,0,NULL,0} }; static struct pid_entry tid_attr_stuff[] = { @@ -292,6 +312,8 @@ static struct pid_entry tid_attr_stuff[] = { E(PROC_TID_ATTR_PREV, "prev", S_IFREG|S_IRUGO), E(PROC_TID_ATTR_EXEC, "exec", S_IFREG|S_IRUGO|S_IWUGO), E(PROC_TID_ATTR_FSCREATE, "fscreate", S_IFREG|S_IRUGO|S_IWUGO), + E(PROC_TID_ATTR_KEYCREATE, "keycreate", S_IFREG|S_IRUGO|S_IWUGO), + E(PROC_TID_ATTR_SOCKCREATE, "sockcreate", S_IFREG|S_IRUGO|S_IWUGO), {0,0,NULL,0} }; #endif @@ -300,12 +322,15 @@ static struct pid_entry tid_attr_stuff[] = { static int proc_fd_link(struct inode *inode, struct dentry **dentry, struct vfsmount **mnt) { - struct task_struct *task = proc_task(inode); - struct files_struct *files; + struct task_struct *task = get_proc_task(inode); + struct files_struct *files = NULL; struct file *file; - int fd = proc_type(inode) - PROC_TID_FD_DIR; + int fd = proc_fd(inode); - files = get_files_struct(task); + if (task) { + files = get_files_struct(task); + put_task_struct(task); + } if (files) { /* * We are not taking a ref to the file structure, so we must @@ -337,29 +362,33 @@ static struct fs_struct *get_fs_struct(struct task_struct *task) return fs; } -static int proc_cwd_link(struct inode *inode, struct dentry **dentry, struct vfsmount **mnt) +static int get_nr_threads(struct task_struct *tsk) { - struct fs_struct *fs = get_fs_struct(proc_task(inode)); - int result = -ENOENT; - if (fs) { - read_lock(&fs->lock); - *mnt = mntget(fs->pwdmnt); - *dentry = dget(fs->pwd); - read_unlock(&fs->lock); - result = 0; - put_fs_struct(fs); + /* Must be called with the rcu_read_lock held */ + unsigned long flags; + int count = 0; + + if (lock_task_sighand(tsk, &flags)) { + count = atomic_read(&tsk->signal->count); + unlock_task_sighand(tsk, &flags); } - return result; + return count; } -static int proc_root_link(struct inode *inode, struct dentry **dentry, struct vfsmount **mnt) +static int proc_cwd_link(struct inode *inode, struct dentry **dentry, struct vfsmount **mnt) { - struct fs_struct *fs = get_fs_struct(proc_task(inode)); + struct task_struct *task = get_proc_task(inode); + struct fs_struct *fs = NULL; int result = -ENOENT; + + if (task) { + fs = get_fs_struct(task); + put_task_struct(task); + } if (fs) { read_lock(&fs->lock); - *mnt = mntget(fs->rootmnt); - *dentry = dget(fs->root); + *mnt = mntget(fs->pwdmnt); + *dentry = dget(fs->pwd); read_unlock(&fs->lock); result = 0; put_fs_struct(fs); @@ -367,42 +396,16 @@ static int proc_root_link(struct inode *inode, struct dentry **dentry, struct vf return result; } - -/* Same as proc_root_link, but this addionally tries to get fs from other - * threads in the group */ -static int proc_task_root_link(struct inode *inode, struct dentry **dentry, - struct vfsmount **mnt) +static int proc_root_link(struct inode *inode, struct dentry **dentry, struct vfsmount **mnt) { - struct fs_struct *fs; + struct task_struct *task = get_proc_task(inode); + struct fs_struct *fs = NULL; int result = -ENOENT; - struct task_struct *leader = proc_task(inode); - task_lock(leader); - fs = leader->fs; - if (fs) { - atomic_inc(&fs->count); - task_unlock(leader); - } else { - /* Try to get fs from other threads */ - task_unlock(leader); - read_lock(&tasklist_lock); - if (pid_alive(leader)) { - struct task_struct *task = leader; - - while ((task = next_thread(task)) != leader) { - task_lock(task); - fs = task->fs; - if (fs) { - atomic_inc(&fs->count); - task_unlock(task); - break; - } - task_unlock(task); - } - } - read_unlock(&tasklist_lock); + if (task) { + fs = get_fs_struct(task); + put_task_struct(task); } - if (fs) { read_lock(&fs->lock); *mnt = mntget(fs->rootmnt); @@ -414,14 +417,6 @@ static int proc_task_root_link(struct inode *inode, struct dentry **dentry, return result; } - -#define MAY_PTRACE(task) \ - (task == current || \ - (task->parent == current && \ - (task->ptrace & PT_PTRACED) && \ - (task->state == TASK_STOPPED || task->state == TASK_TRACED) && \ - security_ptrace(current,task) == 0)) - struct mm_struct *mm_for_maps(struct task_struct *task) { struct mm_struct *mm = get_task_mm(task); @@ -431,7 +426,7 @@ struct mm_struct *mm_for_maps(struct task_struct *task) task_lock(task); if (task->mm != mm) goto out; - if (task->mm != current->mm && __ptrace_may_attach(task)) + if (task->mm != current->mm && __ptrace_may_attach(task) < 0) goto out; task_unlock(task); return mm; @@ -565,70 +560,20 @@ static int proc_oom_score(struct task_struct *task, char *buffer) /************************************************************************/ /* permission checks */ - -/* If the process being read is separated by chroot from the reading process, - * don't let the reader access the threads. - * - * note: this does dput(root) and mntput(vfsmnt) on exit. - */ -static int proc_check_chroot(struct dentry *root, struct vfsmount *vfsmnt) +static int proc_fd_access_allowed(struct inode *inode) { - struct dentry *de, *base; - struct vfsmount *our_vfsmnt, *mnt; - int res = 0; - - /* context admin override */ - if (capable(CAP_CONTEXT)) - goto override; - - read_lock(¤t->fs->lock); - our_vfsmnt = mntget(current->fs->rootmnt); - base = dget(current->fs->root); - read_unlock(¤t->fs->lock); - - spin_lock(&vfsmount_lock); - de = root; - mnt = vfsmnt; - - while (mnt != our_vfsmnt) { - if (mnt == mnt->mnt_parent) - goto out; - de = mnt->mnt_mountpoint; - mnt = mnt->mnt_parent; + struct task_struct *task; + int allowed = 0; + /* Allow access to a task's file descriptors if it is us or we + * may use ptrace attach to the process and find out that + * information. + */ + task = get_proc_task(inode); + if (task) { + allowed = ptrace_may_attach(task); + put_task_struct(task); } - - if (!is_subdir(de, base)) - goto out; - spin_unlock(&vfsmount_lock); - -exit: - dput(base); - mntput(our_vfsmnt); -override: - dput(root); - mntput(vfsmnt); - return res; -out: - spin_unlock(&vfsmount_lock); - res = -EACCES; - goto exit; -} - -static int proc_check_root(struct inode *inode) -{ - struct dentry *root; - struct vfsmount *vfsmnt; - - if (proc_root_link(inode, &root, &vfsmnt)) /* Ewww... */ - return -ENOENT; - return proc_check_chroot(root, vfsmnt); -} - -static int proc_permission(struct inode *inode, int mask, struct nameidata *nd) -{ - if (generic_permission(inode, mask, NULL) != 0) - return -EACCES; - return proc_check_root(inode); + return allowed; } static int proc_setattr(struct dentry *dentry, struct iattr *attr) @@ -652,81 +597,6 @@ static struct inode_operations proc_def_inode_operations = { .setattr = proc_setattr, }; -static int proc_task_permission(struct inode *inode, int mask, struct nameidata *nd) -{ - struct dentry *root; - struct vfsmount *vfsmnt; - - if (generic_permission(inode, mask, NULL) != 0) - return -EACCES; - - if (proc_task_root_link(inode, &root, &vfsmnt)) - return -ENOENT; - - return proc_check_chroot(root, vfsmnt); -} - -extern struct seq_operations proc_pid_maps_op; -static int maps_open(struct inode *inode, struct file *file) -{ - struct task_struct *task = proc_task(inode); - int ret = seq_open(file, &proc_pid_maps_op); - if (!ret) { - struct seq_file *m = file->private_data; - m->private = task; - } - return ret; -} - -static struct file_operations proc_maps_operations = { - .open = maps_open, - .read = seq_read, - .llseek = seq_lseek, - .release = seq_release, -}; - -#ifdef CONFIG_NUMA -extern struct seq_operations proc_pid_numa_maps_op; -static int numa_maps_open(struct inode *inode, struct file *file) -{ - struct task_struct *task = proc_task(inode); - int ret = seq_open(file, &proc_pid_numa_maps_op); - if (!ret) { - struct seq_file *m = file->private_data; - m->private = task; - } - return ret; -} - -static struct file_operations proc_numa_maps_operations = { - .open = numa_maps_open, - .read = seq_read, - .llseek = seq_lseek, - .release = seq_release, -}; -#endif - -#ifdef CONFIG_MMU -extern struct seq_operations proc_pid_smaps_op; -static int smaps_open(struct inode *inode, struct file *file) -{ - struct task_struct *task = proc_task(inode); - int ret = seq_open(file, &proc_pid_smaps_op); - if (!ret) { - struct seq_file *m = file->private_data; - m->private = task; - } - return ret; -} - -static struct file_operations proc_smaps_operations = { - .open = smaps_open, - .read = seq_read, - .llseek = seq_lseek, - .release = seq_release, -}; -#endif - extern struct seq_operations mounts_op; struct proc_mounts { struct seq_file m; @@ -735,16 +605,19 @@ struct proc_mounts { static int mounts_open(struct inode *inode, struct file *file) { - struct task_struct *task = proc_task(inode); - struct namespace *namespace; + struct task_struct *task = get_proc_task(inode); + struct namespace *namespace = NULL; struct proc_mounts *p; int ret = -EINVAL; - task_lock(task); - namespace = task->namespace; - if (namespace) - get_namespace(namespace); - task_unlock(task); + if (task) { + task_lock(task); + namespace = task->namespace; + if (namespace) + get_namespace(namespace); + task_unlock(task); + put_task_struct(task); + } if (namespace) { ret = -ENOMEM; @@ -801,17 +674,21 @@ static struct file_operations proc_mounts_operations = { extern struct seq_operations mountstats_op; static int mountstats_open(struct inode *inode, struct file *file) { - struct task_struct *task = proc_task(inode); int ret = seq_open(file, &mountstats_op); if (!ret) { struct seq_file *m = file->private_data; - struct namespace *namespace; - task_lock(task); - namespace = task->namespace; - if (namespace) - get_namespace(namespace); - task_unlock(task); + struct namespace *namespace = NULL; + struct task_struct *task = get_proc_task(inode); + + if (task) { + task_lock(task); + namespace = task->namespace; + if (namespace) + get_namespace(namespace); + task_unlock(task); + put_task_struct(task); + } if (namespace) m->private = namespace; @@ -838,18 +715,27 @@ static ssize_t proc_info_read(struct file * file, char __user * buf, struct inode * inode = file->f_dentry->d_inode; unsigned long page; ssize_t length; - struct task_struct *task = proc_task(inode); + struct task_struct *task = get_proc_task(inode); + + length = -ESRCH; + if (!task) + goto out_no_task; if (count > PROC_BLOCK_SIZE) count = PROC_BLOCK_SIZE; + + length = -ENOMEM; if (!(page = __get_free_page(GFP_KERNEL))) - return -ENOMEM; + goto out; length = PROC_I(inode)->op.proc_read(task, (char*)page); if (length >= 0) length = simple_read_from_buffer(buf, count, ppos, (char *)page, length); free_page(page); +out: + put_task_struct(task); +out_no_task: return length; } @@ -866,13 +752,17 @@ static int mem_open(struct inode* inode, struct file* file) static ssize_t mem_read(struct file * file, char __user * buf, size_t count, loff_t *ppos) { - struct task_struct *task = proc_task(file->f_dentry->d_inode); + struct task_struct *task = get_proc_task(file->f_dentry->d_inode); char *page; unsigned long src = *ppos; int ret = -ESRCH; struct mm_struct *mm; - if (!MAY_PTRACE(task) || !ptrace_may_attach(task)) + if (!task) + goto out_no_task; + + if (!tracehook_allow_access_process_vm(task) + || !ptrace_may_attach(task)) goto out; ret = -ENOMEM; @@ -898,7 +788,8 @@ static ssize_t mem_read(struct file * file, char __user * buf, this_len = (count > PAGE_SIZE) ? PAGE_SIZE : count; retval = access_process_vm(task, src, page, this_len, 0); - if (!retval || !MAY_PTRACE(task) || !ptrace_may_attach(task)) { + if (!retval || !tracehook_allow_access_process_vm(task) + || !ptrace_may_attach(task)) { if (!ret) ret = -EIO; break; @@ -921,6 +812,8 @@ out_put: out_free: free_page((unsigned long) page); out: + put_task_struct(task); +out_no_task: return ret; } @@ -933,15 +826,21 @@ static ssize_t mem_write(struct file * file, const char * buf, { int copied = 0; char *page; - struct task_struct *task = proc_task(file->f_dentry->d_inode); + struct task_struct *task = get_proc_task(file->f_dentry->d_inode); unsigned long dst = *ppos; - if (!MAY_PTRACE(task) || !ptrace_may_attach(task)) - return -ESRCH; + copied = -ESRCH; + if (!task) + goto out_no_task; + if (!tracehook_allow_access_process_vm(task) + || !ptrace_may_attach(task)) + goto out; + + copied = -ENOMEM; page = (char *)__get_free_page(GFP_USER); if (!page) - return -ENOMEM; + goto out; while (count > 0) { int this_len, retval; @@ -964,6 +863,9 @@ static ssize_t mem_write(struct file * file, const char * buf, } *ppos = dst; free_page((unsigned long) page); +out: + put_task_struct(task); +out_no_task: return copied; } #endif @@ -994,13 +896,18 @@ static struct file_operations proc_mem_operations = { static ssize_t oom_adjust_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { - struct task_struct *task = proc_task(file->f_dentry->d_inode); - char buffer[8]; + struct task_struct *task = get_proc_task(file->f_dentry->d_inode); + char buffer[PROC_NUMBUF]; size_t len; - int oom_adjust = task->oomkilladj; + int oom_adjust; loff_t __ppos = *ppos; - len = sprintf(buffer, "%i\n", oom_adjust); + if (!task) + return -ESRCH; + oom_adjust = task->oomkilladj; + put_task_struct(task); + + len = snprintf(buffer, sizeof(buffer), "%i\n", oom_adjust); if (__ppos >= len) return 0; if (count > len-__ppos) @@ -1014,15 +921,15 @@ static ssize_t oom_adjust_read(struct file *file, char __user *buf, static ssize_t oom_adjust_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { - struct task_struct *task = proc_task(file->f_dentry->d_inode); - char buffer[8], *end; + struct task_struct *task; + char buffer[PROC_NUMBUF], *end; int oom_adjust; if (!capable(CAP_SYS_RESOURCE)) return -EPERM; - memset(buffer, 0, 8); - if (count > 6) - count = 6; + memset(buffer, 0, sizeof(buffer)); + if (count > sizeof(buffer) - 1) + count = sizeof(buffer) - 1; if (copy_from_user(buffer, buf, count)) return -EFAULT; oom_adjust = simple_strtol(buffer, &end, 0); @@ -1030,7 +937,11 @@ static ssize_t oom_adjust_write(struct file *file, const char __user *buf, return -EINVAL; if (*end == '\n') end++; + task = get_proc_task(file->f_dentry->d_inode); + if (!task) + return -ESRCH; task->oomkilladj = oom_adjust; + put_task_struct(task); if (end - buffer == 0) return -EIO; return end - buffer; @@ -1041,23 +952,21 @@ static struct file_operations proc_oom_adjust_operations = { .write = oom_adjust_write, }; -static struct inode_operations proc_mem_inode_operations = { - .permission = proc_permission, - .setattr = proc_setattr, -}; - #ifdef CONFIG_AUDITSYSCALL #define TMPBUFLEN 21 static ssize_t proc_loginuid_read(struct file * file, char __user * buf, size_t count, loff_t *ppos) { struct inode * inode = file->f_dentry->d_inode; - struct task_struct *task = proc_task(inode); + struct task_struct *task = get_proc_task(inode); ssize_t length; char tmpbuf[TMPBUFLEN]; + if (!task) + return -ESRCH; length = scnprintf(tmpbuf, TMPBUFLEN, "%u", audit_get_loginuid(task->audit_context)); + put_task_struct(task); return simple_read_from_buffer(buf, count, ppos, tmpbuf, length); } @@ -1067,17 +976,16 @@ static ssize_t proc_loginuid_write(struct file * file, const char __user * buf, struct inode * inode = file->f_dentry->d_inode; char *page, *tmp; ssize_t length; - struct task_struct *task = proc_task(inode); uid_t loginuid; if (!capable(CAP_AUDIT_CONTROL)) return -EPERM; - if (current != task) + if (current != pid_task(proc_pid(inode), PIDTYPE_PID)) return -EPERM; - if (count > PAGE_SIZE) - count = PAGE_SIZE; + if (count >= PAGE_SIZE) + count = PAGE_SIZE - 1; if (*ppos != 0) { /* No partial writes. */ @@ -1090,13 +998,14 @@ static ssize_t proc_loginuid_write(struct file * file, const char __user * buf, if (copy_from_user(page, buf, count)) goto out_free_page; + page[count] = '\0'; loginuid = simple_strtoul(page, &tmp, 10); if (tmp == page) { length = -EINVAL; goto out_free_page; } - length = audit_set_loginuid(task, loginuid); + length = audit_set_loginuid(current, loginuid); if (likely(length == 0)) length = count; @@ -1115,13 +1024,16 @@ static struct file_operations proc_loginuid_operations = { static ssize_t seccomp_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { - struct task_struct *tsk = proc_task(file->f_dentry->d_inode); + struct task_struct *tsk = get_proc_task(file->f_dentry->d_inode); char __buf[20]; loff_t __ppos = *ppos; size_t len; + if (!tsk) + return -ESRCH; /* no need to print the trailing zero, so use only len */ len = sprintf(__buf, "%u\n", tsk->seccomp.mode); + put_task_struct(tsk); if (__ppos >= len) return 0; if (count > len - __ppos) @@ -1135,29 +1047,43 @@ static ssize_t seccomp_read(struct file *file, char __user *buf, static ssize_t seccomp_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { - struct task_struct *tsk = proc_task(file->f_dentry->d_inode); + struct task_struct *tsk = get_proc_task(file->f_dentry->d_inode); char __buf[20], *end; unsigned int seccomp_mode; + ssize_t result; + + result = -ESRCH; + if (!tsk) + goto out_no_task; /* can set it only once to be even more secure */ + result = -EPERM; if (unlikely(tsk->seccomp.mode)) - return -EPERM; + goto out; + result = -EFAULT; memset(__buf, 0, sizeof(__buf)); count = min(count, sizeof(__buf) - 1); if (copy_from_user(__buf, buf, count)) - return -EFAULT; + goto out; + seccomp_mode = simple_strtoul(__buf, &end, 0); if (*end == '\n') end++; + result = -EINVAL; if (seccomp_mode && seccomp_mode <= NR_SECCOMP_MODES) { tsk->seccomp.mode = seccomp_mode; set_tsk_thread_flag(tsk, TIF_SECCOMP); } else - return -EINVAL; + goto out; + result = -EIO; if (unlikely(!(end - __buf))) - return -EIO; - return end - __buf; + goto out; + result = end - __buf; +out: + put_task_struct(tsk); +out_no_task: + return result; } static struct file_operations proc_seccomp_operations = { @@ -1174,10 +1100,8 @@ static void *proc_pid_follow_link(struct dentry *dentry, struct nameidata *nd) /* We don't need a base pointer in the /proc filesystem */ path_release(nd); - if (current->fsuid != inode->i_uid && !capable(CAP_DAC_OVERRIDE)) - goto out; - error = proc_check_root(inode); - if (error) + /* Are we allowed to snoop on the tasks file descriptors? */ + if (!proc_fd_access_allowed(inode)) goto out; error = PROC_I(inode)->op.proc_get_link(inode, &nd->dentry, &nd->mnt); @@ -1219,12 +1143,8 @@ static int proc_pid_readlink(struct dentry * dentry, char __user * buffer, int b struct dentry *de; struct vfsmount *mnt = NULL; - lock_kernel(); - - if (current->fsuid != inode->i_uid && !capable(CAP_DAC_OVERRIDE)) - goto out; - error = proc_check_root(inode); - if (error) + /* Are we allowed to snoop on the tasks file descriptors? */ + if (!proc_fd_access_allowed(inode)) goto out; error = PROC_I(inode)->op.proc_get_link(inode, &de, &mnt); @@ -1235,7 +1155,6 @@ static int proc_pid_readlink(struct dentry * dentry, char __user * buffer, int b dput(de); mntput(mnt); out: - unlock_kernel(); return error; } @@ -1245,21 +1164,20 @@ static struct inode_operations proc_pid_link_inode_operations = { .setattr = proc_setattr, }; -#define NUMBUF 10 - static int proc_readfd(struct file * filp, void * dirent, filldir_t filldir) { - struct inode *inode = filp->f_dentry->d_inode; - struct task_struct *p = proc_task(inode); + struct dentry *dentry = filp->f_dentry; + struct inode *inode = dentry->d_inode; + struct task_struct *p = get_proc_task(inode); unsigned int fd, tid, ino; int retval; - char buf[NUMBUF]; + char buf[PROC_NUMBUF]; struct files_struct * files; struct fdtable *fdt; retval = -ENOENT; - if (!pid_alive(p)) - goto out; + if (!p) + goto out_no_task; retval = 0; tid = p->pid; @@ -1270,7 +1188,7 @@ static int proc_readfd(struct file * filp, void * dirent, filldir_t filldir) goto out; filp->f_pos++; case 1: - ino = fake_ino(tid, PROC_TID_INO); + ino = parent_ino(dentry); if (filldir(dirent, "..", 2, 1, ino, DT_DIR) < 0) goto out; filp->f_pos++; @@ -1289,7 +1207,7 @@ static int proc_readfd(struct file * filp, void * dirent, filldir_t filldir) continue; rcu_read_unlock(); - j = NUMBUF; + j = PROC_NUMBUF; i = fd; do { j--; @@ -1298,7 +1216,7 @@ static int proc_readfd(struct file * filp, void * dirent, filldir_t filldir) } while (i); ino = fake_ino(tid, PROC_TID_FD_DIR + fd); - if (filldir(dirent, buf+j, NUMBUF-j, fd+2, ino, DT_LNK) < 0) { + if (filldir(dirent, buf+j, PROC_NUMBUF-j, fd+2, ino, DT_LNK) < 0) { rcu_read_lock(); break; } @@ -1308,6 +1226,8 @@ static int proc_readfd(struct file * filp, void * dirent, filldir_t filldir) put_files_struct(files); } out: + put_task_struct(p); +out_no_task: return retval; } @@ -1319,16 +1239,18 @@ static int proc_pident_readdir(struct file *filp, int pid; struct dentry *dentry = filp->f_dentry; struct inode *inode = dentry->d_inode; + struct task_struct *task = get_proc_task(inode); struct pid_entry *p; ino_t ino; int ret, hide; ret = -ENOENT; - if (!pid_alive(proc_task(inode))) + if (!task) goto out; ret = 0; - pid = proc_task(inode)->pid; + pid = task->pid; + put_task_struct(task); i = filp->f_pos; switch (i) { case 0: @@ -1420,23 +1342,20 @@ static struct inode *proc_pid_make_inode(struct super_block * sb, struct task_st /* Common stuff */ ei = PROC_I(inode); - ei->task = NULL; inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; inode->i_ino = fake_ino(task->pid, ino); inode->i_op = &proc_def_inode_operations; - if (!pid_alive(task)) - goto out_unlock; - /* * grab the reference to task. */ - get_task_struct(task); - ei->task = task; - ei->type = ino; + ei->pid = get_pid(task->pids[PIDTYPE_PID].pid); + if (!ei->pid) + goto out_unlock; + inode->i_uid = 0; inode->i_gid = 0; - if (ino == PROC_TGID_INO || ino == PROC_TID_INO || task_dumpable(task)) { + if (task_dumpable(task)) { inode->i_uid = task->euid; inode->i_gid = task->egid; } @@ -1447,7 +1366,6 @@ out: return inode; out_unlock: - ei->pde = NULL; iput(inode); return NULL; } @@ -1461,18 +1379,29 @@ out_unlock: * * Rewrite the inode's ownerships here because the owning task may have * performed a setuid(), etc. + * + * Before the /proc/pid/status file was created the only way to read + * the effective uid of a /process was to stat /proc/pid. Reading + * /proc/pid/status is slow enough that procps and other packages + * kept stating /proc/pid. To keep the rules in /proc simple I have + * made this apply to all per process world readable and executable + * directories. */ static int pid_revalidate(struct dentry *dentry, struct nameidata *nd) { struct inode *inode = dentry->d_inode; - struct task_struct *task = proc_task(inode); + struct task_struct *task = get_proc_task(inode); + int ret = 0; - if (!vx_check(vx_task_xid(task), VX_IDENT)) - goto out_drop; - /* discard wrong fakeinit */ + if (task) { + int pid = (inode->i_ino >> 16) & 0xFFFF; - if (pid_alive(task)) { - if (proc_type(inode) == PROC_TGID_INO || proc_type(inode) == PROC_TID_INO || task_dumpable(task)) { + if (!proc_pid_visible(task, pid)) + goto out_drop; + + ret = 1; + if ((inode->i_mode == (S_IFDIR|S_IRUGO|S_IXUGO)) || + task_dumpable(task)) { inode->i_uid = task->euid; inode->i_gid = task->egid; } else { @@ -1481,61 +1410,79 @@ static int pid_revalidate(struct dentry *dentry, struct nameidata *nd) } inode->i_mode &= ~(S_ISUID | S_ISGID); security_task_to_inode(task, inode); - return 1; + goto out_put; } out_drop: d_drop(dentry); +out_put: + if (task) + put_task_struct(task); + return ret; +} + +static int pid_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) +{ + struct inode *inode = dentry->d_inode; + struct task_struct *task; + generic_fillattr(inode, stat); + + rcu_read_lock(); + stat->uid = 0; + stat->gid = 0; + task = pid_task(proc_pid(inode), PIDTYPE_PID); + if (task) { + if ((inode->i_mode == (S_IFDIR|S_IRUGO|S_IXUGO)) || + task_dumpable(task)) { + stat->uid = task->euid; + stat->gid = task->egid; + } + } + rcu_read_unlock(); return 0; } static int tid_fd_revalidate(struct dentry *dentry, struct nameidata *nd) { struct inode *inode = dentry->d_inode; - struct task_struct *task = proc_task(inode); - int fd = proc_type(inode) - PROC_TID_FD_DIR; + struct task_struct *task = get_proc_task(inode); + int fd = proc_fd(inode); struct files_struct *files; - files = get_files_struct(task); - if (files) { - rcu_read_lock(); - if (fcheck_files(files, fd)) { + if (task) { + files = get_files_struct(task); + if (files) { + rcu_read_lock(); + if (fcheck_files(files, fd)) { + rcu_read_unlock(); + put_files_struct(files); + if (task_dumpable(task)) { + inode->i_uid = task->euid; + inode->i_gid = task->egid; + } else { + inode->i_uid = 0; + inode->i_gid = 0; + } + inode->i_mode &= ~(S_ISUID | S_ISGID); + security_task_to_inode(task, inode); + put_task_struct(task); + return 1; + } rcu_read_unlock(); put_files_struct(files); - if (task_dumpable(task)) { - inode->i_uid = task->euid; - inode->i_gid = task->egid; - } else { - inode->i_uid = 0; - inode->i_gid = 0; - } - inode->i_mode &= ~(S_ISUID | S_ISGID); - security_task_to_inode(task, inode); - return 1; } - rcu_read_unlock(); - put_files_struct(files); + put_task_struct(task); } d_drop(dentry); return 0; } -static void pid_base_iput(struct dentry *dentry, struct inode *inode) -{ - struct task_struct *task = proc_task(inode); - spin_lock(&task->proc_lock); - if (task->proc_dentry == dentry) - task->proc_dentry = NULL; - spin_unlock(&task->proc_lock); - iput(inode); -} - static int pid_delete_dentry(struct dentry * dentry) { /* Is the task we represent dead? * If so, then don't put the dentry on the lru list, * kill it immediately. */ - return !pid_alive(proc_task(dentry->d_inode)); + return !proc_pid(dentry->d_inode)->tasks[PIDTYPE_PID].first; } static struct dentry_operations tid_fd_dentry_operations = @@ -1550,13 +1497,6 @@ static struct dentry_operations pid_dentry_operations = .d_delete = pid_delete_dentry, }; -static struct dentry_operations pid_base_dentry_operations = -{ - .d_revalidate = pid_revalidate, - .d_iput = pid_base_iput, - .d_delete = pid_delete_dentry, -}; - /* Lookups */ static unsigned name_to_int(struct dentry *dentry) @@ -1584,22 +1524,24 @@ out: /* SMP-safe */ static struct dentry *proc_lookupfd(struct inode * dir, struct dentry * dentry, struct nameidata *nd) { - struct task_struct *task = proc_task(dir); + struct task_struct *task = get_proc_task(dir); unsigned fd = name_to_int(dentry); + struct dentry *result = ERR_PTR(-ENOENT); struct file * file; struct files_struct * files; struct inode *inode; struct proc_inode *ei; + if (!task) + goto out_no_task; if (fd == ~0U) goto out; - if (!pid_alive(task)) - goto out; inode = proc_pid_make_inode(dir->i_sb, task, PROC_TID_FD_DIR+fd); if (!inode) goto out; ei = PROC_I(inode); + ei->fd = fd; files = get_files_struct(task); if (!files) goto out_unlock; @@ -1624,19 +1566,25 @@ static struct dentry *proc_lookupfd(struct inode * dir, struct dentry * dentry, ei->op.proc_get_link = proc_fd_link; dentry->d_op = &tid_fd_dentry_operations; d_add(dentry, inode); - return NULL; + /* Close the race of the process dying before we return the dentry */ + if (tid_fd_revalidate(dentry, NULL)) + result = NULL; +out: + put_task_struct(task); +out_no_task: + return result; out_unlock2: spin_unlock(&files->file_lock); put_files_struct(files); out_unlock: iput(inode); -out: - return ERR_PTR(-ENOENT); + goto out; } static int proc_task_readdir(struct file * filp, void * dirent, filldir_t filldir); static struct dentry *proc_task_lookup(struct inode *dir, struct dentry * dentry, struct nameidata *nd); +static int proc_task_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat); static struct file_operations proc_fd_operations = { .read = generic_read_dir, @@ -1653,13 +1601,12 @@ static struct file_operations proc_task_operations = { */ static struct inode_operations proc_fd_inode_operations = { .lookup = proc_lookupfd, - .permission = proc_permission, .setattr = proc_setattr, }; static struct inode_operations proc_task_inode_operations = { .lookup = proc_task_lookup, - .permission = proc_task_permission, + .getattr = proc_task_getattr, .setattr = proc_setattr, }; @@ -1670,12 +1617,17 @@ static ssize_t proc_pid_attr_read(struct file * file, char __user * buf, struct inode * inode = file->f_dentry->d_inode; unsigned long page; ssize_t length; - struct task_struct *task = proc_task(inode); + struct task_struct *task = get_proc_task(inode); + + length = -ESRCH; + if (!task) + goto out_no_task; if (count > PAGE_SIZE) count = PAGE_SIZE; + length = -ENOMEM; if (!(page = __get_free_page(GFP_KERNEL))) - return -ENOMEM; + goto out; length = security_getprocattr(task, (char*)file->f_dentry->d_name.name, @@ -1683,6 +1635,9 @@ static ssize_t proc_pid_attr_read(struct file * file, char __user * buf, if (length >= 0) length = simple_read_from_buffer(buf, count, ppos, (char *)page, length); free_page(page); +out: + put_task_struct(task); +out_no_task: return length; } @@ -1692,26 +1647,36 @@ static ssize_t proc_pid_attr_write(struct file * file, const char __user * buf, struct inode * inode = file->f_dentry->d_inode; char *page; ssize_t length; - struct task_struct *task = proc_task(inode); + struct task_struct *task = get_proc_task(inode); + length = -ESRCH; + if (!task) + goto out_no_task; if (count > PAGE_SIZE) count = PAGE_SIZE; - if (*ppos != 0) { - /* No partial writes. */ - return -EINVAL; - } + + /* No partial writes. */ + length = -EINVAL; + if (*ppos != 0) + goto out; + + length = -ENOMEM; page = (char*)__get_free_page(GFP_USER); if (!page) - return -ENOMEM; + goto out; + length = -EFAULT; if (copy_from_user(page, buf, count)) - goto out; + goto out_free; length = security_setprocattr(task, (char*)file->f_dentry->d_name.name, (void*)page, count); -out: +out_free: free_page((unsigned long) page); +out: + put_task_struct(task); +out_no_task: return length; } @@ -1729,24 +1694,22 @@ static struct inode_operations proc_tgid_attr_inode_operations; extern int proc_pid_vx_info(struct task_struct *, char *); extern int proc_pid_nx_info(struct task_struct *, char *); -static int get_tid_list(int index, unsigned int *tids, struct inode *dir); - /* SMP-safe */ static struct dentry *proc_pident_lookup(struct inode *dir, struct dentry *dentry, struct pid_entry *ents) { struct inode *inode; - int error; - struct task_struct *task = proc_task(dir); + struct dentry *error; + struct task_struct *task = get_proc_task(dir); struct pid_entry *p; struct proc_inode *ei; - error = -ENOENT; + error = ERR_PTR(-ENOENT); inode = NULL; - if (!pid_alive(task)) - goto out; + if (!task) + goto out_no_task; for (p = ents; p->name; p++) { if (p->len != dentry->d_name.len) @@ -1757,7 +1720,18 @@ static struct dentry *proc_pident_lookup(struct inode *dir, if (!p->name) goto out; - error = -EINVAL; + switch(p->type) { + case PROC_TID_VX_INFO: + case PROC_TGID_VX_INFO: + case PROC_TID_IP_INFO: + case PROC_TGID_IP_INFO: + if (task_vx_flags(task, VXF_INFO_HIDE, 0)) + goto out; + default: + break; + } + + error = ERR_PTR(-EINVAL); inode = proc_pid_make_inode(dir->i_sb, task, p->type); if (!inode) goto out; @@ -1770,7 +1744,7 @@ static struct dentry *proc_pident_lookup(struct inode *dir, */ switch(p->type) { case PROC_TGID_TASK: - inode->i_nlink = 2 + get_tid_list(2, NULL, dir); + inode->i_nlink = 2; inode->i_op = &proc_task_inode_operations; inode->i_fop = &proc_task_operations; break; @@ -1840,7 +1814,6 @@ static struct dentry *proc_pident_lookup(struct inode *dir, #endif case PROC_TID_MEM: case PROC_TGID_MEM: - inode->i_op = &proc_mem_inode_operations; inode->i_fop = &proc_mem_operations; break; #ifdef CONFIG_SECCOMP @@ -1882,6 +1855,10 @@ static struct dentry *proc_pident_lookup(struct inode *dir, case PROC_TGID_ATTR_EXEC: case PROC_TID_ATTR_FSCREATE: case PROC_TGID_ATTR_FSCREATE: + case PROC_TID_ATTR_KEYCREATE: + case PROC_TGID_ATTR_KEYCREATE: + case PROC_TID_ATTR_SOCKCREATE: + case PROC_TGID_ATTR_SOCKCREATE: inode->i_fop = &proc_pid_attr_operations; break; #endif @@ -1922,33 +1899,29 @@ static struct dentry *proc_pident_lookup(struct inode *dir, #endif case PROC_TID_VX_INFO: case PROC_TGID_VX_INFO: - if (task_vx_flags(task, VXF_INFO_HIDE, 0)) - goto out_noent; inode->i_fop = &proc_info_file_operations; ei->op.proc_read = proc_pid_vx_info; break; case PROC_TID_IP_INFO: case PROC_TGID_IP_INFO: - if (task_vx_flags(task, VXF_INFO_HIDE, 0)) - goto out_noent; inode->i_fop = &proc_info_file_operations; ei->op.proc_read = proc_pid_nx_info; break; default: printk("procfs: impossible type (%d)",p->type); - error = -EINVAL; - goto out_put; + iput(inode); + error = ERR_PTR(-EINVAL); + goto out; } dentry->d_op = &pid_dentry_operations; d_add(dentry, inode); - return NULL; - -out_noent: - error=-ENOENT; -out_put: - iput(inode); + /* Close the race of the process dying before we return the dentry */ + if (pid_revalidate(dentry, NULL)) + error = NULL; out: - return ERR_PTR(error); + put_task_struct(task); +out_no_task: + return error; } static struct dentry *proc_tgid_base_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd){ @@ -1971,11 +1944,13 @@ static struct file_operations proc_tid_base_operations = { static struct inode_operations proc_tgid_base_inode_operations = { .lookup = proc_tgid_base_lookup, + .getattr = pid_getattr, .setattr = proc_setattr, }; static struct inode_operations proc_tid_base_inode_operations = { .lookup = proc_tid_base_lookup, + .getattr = pid_getattr, .setattr = proc_setattr, }; @@ -2018,11 +1993,13 @@ static struct dentry *proc_tid_attr_lookup(struct inode *dir, static struct inode_operations proc_tgid_attr_inode_operations = { .lookup = proc_tgid_attr_lookup, + .getattr = pid_getattr, .setattr = proc_setattr, }; static struct inode_operations proc_tid_attr_inode_operations = { .lookup = proc_tid_attr_lookup, + .getattr = pid_getattr, .setattr = proc_setattr, }; #endif @@ -2033,14 +2010,14 @@ static struct inode_operations proc_tid_attr_inode_operations = { static int proc_self_readlink(struct dentry *dentry, char __user *buffer, int buflen) { - char tmp[30]; + char tmp[PROC_NUMBUF]; sprintf(tmp, "%d", vx_map_tgid(current->tgid)); return vfs_readlink(dentry,buffer,buflen,tmp); } static void *proc_self_follow_link(struct dentry *dentry, struct nameidata *nd) { - char tmp[30]; + char tmp[PROC_NUMBUF]; sprintf(tmp, "%d", vx_map_tgid(current->tgid)); return ERR_PTR(vfs_follow_link(nd,tmp)); } @@ -2048,85 +2025,83 @@ static void *proc_self_follow_link(struct dentry *dentry, struct nameidata *nd) static struct inode_operations proc_self_inode_operations = { .readlink = proc_self_readlink, .follow_link = proc_self_follow_link, - .setattr = proc_setattr, }; /** - * proc_pid_unhash - Unhash /proc/@pid entry from the dcache. - * @p: task that should be flushed. + * proc_flush_task - Remove dcache entries for @task from the /proc dcache. + * + * @task: task that should be flushed. * - * Drops the /proc/@pid dcache entry from the hash chains. + * Looks in the dcache for + * /proc/@pid + * /proc/@tgid/task/@pid + * if either directory is present flushes it and all of it'ts children + * from the dcache. * - * Dropping /proc/@pid entries and detach_pid must be synchroneous, - * otherwise e.g. /proc/@pid/exe might point to the wrong executable, - * if the pid value is immediately reused. This is enforced by - * - caller must acquire spin_lock(p->proc_lock) - * - must be called before detach_pid() - * - proc_pid_lookup acquires proc_lock, and checks that - * the target is not dead by looking at the attach count - * of PIDTYPE_PID. + * It is safe and reasonable to cache /proc entries for a task until + * that task exits. After that they just clog up the dcache with + * useless entries, possibly causing useful dcache entries to be + * flushed instead. This routine is proved to flush those useless + * dcache entries at process exit time. + * + * NOTE: This routine is just an optimization so it does not guarantee + * that no dcache entries will exist at process exit time it + * just makes it very unlikely that any will persist. */ - -struct dentry *proc_pid_unhash(struct task_struct *p) +void proc_flush_task(struct task_struct *task) { - struct dentry *proc_dentry; + struct dentry *dentry, *leader, *dir; + char buf[PROC_NUMBUF]; + struct qstr name; + + name.name = buf; + name.len = snprintf(buf, sizeof(buf), "%d", task->pid); + dentry = d_hash_and_lookup(proc_mnt->mnt_root, &name); + if (dentry) { + shrink_dcache_parent(dentry); + d_drop(dentry); + dput(dentry); + } - proc_dentry = p->proc_dentry; - if (proc_dentry != NULL) { + if (thread_group_leader(task)) + goto out; - spin_lock(&dcache_lock); - spin_lock(&proc_dentry->d_lock); - if (!d_unhashed(proc_dentry)) { - dget_locked(proc_dentry); - __d_drop(proc_dentry); - spin_unlock(&proc_dentry->d_lock); - } else { - spin_unlock(&proc_dentry->d_lock); - proc_dentry = NULL; - } - spin_unlock(&dcache_lock); - } - return proc_dentry; -} + name.name = buf; + name.len = snprintf(buf, sizeof(buf), "%d", task->tgid); + leader = d_hash_and_lookup(proc_mnt->mnt_root, &name); + if (!leader) + goto out; -/** - * proc_pid_flush - recover memory used by stale /proc/@pid/x entries - * @proc_dentry: directoy to prune. - * - * Shrink the /proc directory that was used by the just killed thread. - */ - -void proc_pid_flush(struct dentry *proc_dentry) -{ - might_sleep(); - if(proc_dentry != NULL) { - shrink_dcache_parent(proc_dentry); - dput(proc_dentry); + name.name = "task"; + name.len = strlen(name.name); + dir = d_hash_and_lookup(leader, &name); + if (!dir) + goto out_put_leader; + + name.name = buf; + name.len = snprintf(buf, sizeof(buf), "%d", task->pid); + dentry = d_hash_and_lookup(dir, &name); + if (dentry) { + shrink_dcache_parent(dentry); + d_drop(dentry); + dput(dentry); } -} - -#define VXF_FAKE_INIT (VXF_INFO_INIT|VXF_STATE_INIT) -static inline int proc_pid_visible(struct task_struct *task, int pid) -{ - if ((pid == 1) && - !vx_flags(VXF_FAKE_INIT, VXF_FAKE_INIT)) - goto visible; - if (vx_check(vx_task_xid(task), VX_WATCH|VX_IDENT)) - goto visible; - return 0; -visible: - return 1; + dput(dir); +out_put_leader: + dput(leader); +out: + return; } /* SMP-safe */ struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, struct nameidata *nd) { + struct dentry *result = ERR_PTR(-ENOENT); struct task_struct *task; struct inode *inode; struct proc_inode *ei; unsigned tgid; - int died; if (dentry->d_name.len == 4 && !memcmp(dentry->d_name.name,"self",4)) { inode = new_inode(dir->i_sb); @@ -2147,21 +2122,17 @@ struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, struct if (tgid == ~0U) goto out; - read_lock(&tasklist_lock); - task = find_task_by_pid(tgid); + rcu_read_lock(); + task = find_proc_task_by_pid(tgid); if (task) get_task_struct(task); - read_unlock(&tasklist_lock); + rcu_read_unlock(); if (!task) goto out; - /* check for context visibility */ - if (!proc_pid_visible(task, tgid)) - goto out_drop_task; - inode = proc_pid_make_inode(dir->i_sb, task, PROC_TGID_INO); if (!inode) - goto out_drop_task; + goto out_put_task; inode->i_mode = S_IFDIR|S_IRUGO|S_IXUGO; inode->i_op = &proc_tgid_base_inode_operations; @@ -2173,62 +2144,52 @@ struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, struct inode->i_nlink = 4; #endif - dentry->d_op = &pid_base_dentry_operations; + dentry->d_op = &pid_dentry_operations; - died = 0; d_add(dentry, inode); - spin_lock(&task->proc_lock); - task->proc_dentry = dentry; - if (!pid_alive(task)) { - dentry = proc_pid_unhash(task); - died = 1; - } - spin_unlock(&task->proc_lock); + /* Close the race of the process dying before we return the dentry */ + if (pid_revalidate(dentry, NULL)) + result = NULL; - put_task_struct(task); - if (died) { - proc_pid_flush(dentry); - goto out; - } - return NULL; -out_drop_task: +out_put_task: put_task_struct(task); out: - return ERR_PTR(-ENOENT); + return result; } /* SMP-safe */ static struct dentry *proc_task_lookup(struct inode *dir, struct dentry * dentry, struct nameidata *nd) { + struct dentry *result = ERR_PTR(-ENOENT); struct task_struct *task; - struct task_struct *leader = proc_task(dir); + struct task_struct *leader = get_proc_task(dir); struct inode *inode; unsigned tid; + if (!leader) + goto out_no_task; + tid = name_to_int(dentry); if (tid == ~0U) goto out; if (vx_current_initpid(tid)) goto out; - read_lock(&tasklist_lock); - task = find_task_by_pid(tid); + rcu_read_lock(); + task = find_proc_task_by_pid(tid); if (task) get_task_struct(task); - read_unlock(&tasklist_lock); + rcu_read_unlock(); if (!task) goto out; if (leader->tgid != task->tgid) goto out_drop_task; - /* check for context visibility */ - if (!proc_pid_visible(task, tid)) - goto out_drop_task; - inode = proc_pid_make_inode(dir->i_sb, task, PROC_TID_INO); + + if (!inode) goto out_drop_task; - inode->i_mode = S_IFDIR|S_IRUGO|S_IXUGO; inode->i_op = &proc_tid_base_inode_operations; inode->i_fop = &proc_tid_base_operations; @@ -2239,108 +2200,95 @@ static struct dentry *proc_task_lookup(struct inode *dir, struct dentry * dentry inode->i_nlink = 3; #endif - dentry->d_op = &pid_base_dentry_operations; + dentry->d_op = &pid_dentry_operations; d_add(dentry, inode); + /* Close the race of the process dying before we return the dentry */ + if (pid_revalidate(dentry, NULL)) + result = NULL; - put_task_struct(task); - return NULL; out_drop_task: put_task_struct(task); out: - return ERR_PTR(-ENOENT); + put_task_struct(leader); +out_no_task: + return result; } -#define PROC_NUMBUF 10 -#define PROC_MAXPIDS 20 - /* - * Get a few tgid's to return for filldir - we need to hold the - * tasklist lock while doing this, and we must release it before - * we actually do the filldir itself, so we use a temp buffer.. + * Find the first tgid to return to user space. + * + * Usually this is just whatever follows &init_task, but if the users + * buffer was too small to hold the full list or there was a seek into + * the middle of the directory we have more work to do. + * + * In the case of a short read we start with find_task_by_pid. + * + * In the case of a seek we start with &init_task and walk nr + * threads past it. */ -static int get_tgid_list(int index, unsigned long version, unsigned int *tgids) -{ - struct task_struct *p; - int nr_tgids = 0; - - index--; - read_lock(&tasklist_lock); - p = NULL; - if (version) { - p = find_task_by_real_pid(version); - if (p && !thread_group_leader(p)) - p = NULL; +static struct task_struct *first_tgid(int tgid, unsigned int nr) +{ + struct task_struct *pos; + rcu_read_lock(); + if (tgid && nr) { + pos = find_proc_task_by_pid(tgid); + if (pos && thread_group_leader(pos)) + goto found; } + /* If nr exceeds the number of processes get out quickly */ + pos = NULL; + if (nr && nr >= nr_processes()) + goto done; - if (p) - index = 0; - else - p = next_task(&init_task); - - for ( ; p != &init_task; p = next_task(p)) { - int tgid = p->pid; - - if (!pid_alive(p)) - continue; - /* check for context visibility */ - if (!proc_pid_visible(p, tgid)) - continue; - if (--index >= 0) - continue; - tgids[nr_tgids] = vx_map_tgid(tgid); - nr_tgids++; - if (nr_tgids >= PROC_MAXPIDS) - break; + /* If we haven't found our starting place yet start with + * the init_task and walk nr tasks forward. + */ + for (pos = next_task(&init_task); nr > 0; --nr) { + pos = next_task(pos); + if (pos == &init_task) { + pos = NULL; + goto done; + } } - read_unlock(&tasklist_lock); - return nr_tgids; +found: + get_task_struct(pos); +done: + rcu_read_unlock(); + return pos; } /* - * Get a few tid's to return for filldir - we need to hold the - * tasklist lock while doing this, and we must release it before - * we actually do the filldir itself, so we use a temp buffer.. + * Find the next task in the task list. + * Return NULL if we loop or there is any error. + * + * The reference to the input task_struct is released. */ -static int get_tid_list(int index, unsigned int *tids, struct inode *dir) -{ - struct task_struct *leader_task = proc_task(dir); - struct task_struct *task = leader_task; - int nr_tids = 0; - - index -= 2; - read_lock(&tasklist_lock); - /* - * The starting point task (leader_task) might be an already - * unlinked task, which cannot be used to access the task-list - * via next_thread(). - */ - if (pid_alive(task)) do { - int tid = task->pid; - - /* check for context visibility */ - if (!proc_pid_visible(task, tid)) - continue; - if (--index >= 0) - continue; - if (tids != NULL) - tids[nr_tids] = vx_map_pid(tid); - nr_tids++; - if (nr_tids >= PROC_MAXPIDS) - break; - } while ((task = next_thread(task)) != leader_task); - read_unlock(&tasklist_lock); - return nr_tids; +static struct task_struct *next_tgid(struct task_struct *start) +{ + struct task_struct *pos; + rcu_read_lock(); + pos = start; + if (pid_alive(start)) + pos = next_task(start); + if (pid_alive(pos) && (pos != &init_task)) { + get_task_struct(pos); + goto done; + } + pos = NULL; +done: + rcu_read_unlock(); + put_task_struct(start); + return pos; } /* for the /proc/ directory itself, after non-process stuff has been done */ int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir) { - unsigned int tgid_array[PROC_MAXPIDS]; char buf[PROC_NUMBUF]; unsigned int nr = filp->f_pos - FIRST_PROCESS_ENTRY; - unsigned int nr_tgids, i; - int next_tgid; + struct task_struct *task; + int tgid; if (!nr) { ino_t ino = fake_ino(0,PROC_TGID_INO); @@ -2349,66 +2297,119 @@ int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir) filp->f_pos++; nr++; } + nr -= 1; /* f_version caches the tgid value that the last readdir call couldn't * return. lseek aka telldir automagically resets f_version to 0. */ - next_tgid = filp->f_version; + tgid = filp->f_version; filp->f_version = 0; - for (;;) { - nr_tgids = get_tgid_list(nr, next_tgid, tgid_array); - if (!nr_tgids) { - /* no more entries ! */ + for (task = first_tgid(tgid, nr); + task; + task = next_tgid(task), filp->f_pos++) { + int len; + ino_t ino; + tgid = vx_map_tgid(task->pid); + if (!proc_pid_visible(task, tgid)) + continue; + + len = snprintf(buf, sizeof(buf), "%d", tgid); + ino = fake_ino(tgid, PROC_TGID_INO); + if (filldir(dirent, buf, len, filp->f_pos, ino, DT_DIR) < 0) { + /* returning this tgid failed, save it as the first + * pid for the next readir call */ + filp->f_version = tgid; + put_task_struct(task); break; } - next_tgid = 0; + } + return 0; +} - /* do not use the last found pid, reserve it for next_tgid */ - if (nr_tgids == PROC_MAXPIDS) { - nr_tgids--; - next_tgid = tgid_array[nr_tgids]; - } +/* + * Find the first tid of a thread group to return to user space. + * + * Usually this is just the thread group leader, but if the users + * buffer was too small or there was a seek into the middle of the + * directory we have more work todo. + * + * In the case of a short read we start with find_task_by_pid. + * + * In the case of a seek we start with the leader and walk nr + * threads past it. + */ +static struct task_struct *first_tid(struct task_struct *leader, + int tid, int nr) +{ + struct task_struct *pos; - for (i=0;i 0)) { + pos = find_proc_task_by_pid(tid); + if (pos && (pos->group_leader == leader)) + goto found; + } - do - buf[--j] = '0' + (tgid % 10); - while ((tgid /= 10) != 0); + /* If nr exceeds the number of threads there is nothing todo */ + pos = NULL; + if (nr && nr >= get_nr_threads(leader)) + goto out; - if (filldir(dirent, buf+j, PROC_NUMBUF-j, filp->f_pos, ino, DT_DIR) < 0) { - /* returning this tgid failed, save it as the first - * pid for the next readir call */ - filp->f_version = tgid_array[i]; - goto out; - } - filp->f_pos++; - nr++; + /* If we haven't found our starting place yet start + * with the leader and walk nr threads forward. + */ + for (pos = leader; nr > 0; --nr) { + pos = next_thread(pos); + if (pos == leader) { + pos = NULL; + goto out; } } +found: + get_task_struct(pos); out: - return 0; + rcu_read_unlock(); + return pos; +} + +/* + * Find the next thread in the thread list. + * Return NULL if there is an error or no next thread. + * + * The reference to the input task_struct is released. + */ +static struct task_struct *next_tid(struct task_struct *start) +{ + struct task_struct *pos = NULL; + rcu_read_lock(); + if (pid_alive(start)) { + pos = next_thread(start); + if (thread_group_leader(pos)) + pos = NULL; + else + get_task_struct(pos); + } + rcu_read_unlock(); + put_task_struct(start); + return pos; } /* for the /proc/TGID/task/ directories */ static int proc_task_readdir(struct file * filp, void * dirent, filldir_t filldir) { - unsigned int tid_array[PROC_MAXPIDS]; char buf[PROC_NUMBUF]; - unsigned int nr_tids, i; struct dentry *dentry = filp->f_dentry; struct inode *inode = dentry->d_inode; - struct task_struct *task = proc_task(inode); + struct task_struct *leader = get_proc_task(inode); + struct task_struct *task; int retval = -ENOENT; ino_t ino; + int tid; unsigned long pos = filp->f_pos; /* avoiding "long long" filp->f_pos */ - if (!vx_check(vx_task_xid(task), VX_WATCH|VX_IDENT)) - goto out; - if (!pid_alive(task)) - goto out; + if (!leader) + goto out_no_task; retval = 0; switch (pos) { @@ -2426,24 +2427,48 @@ static int proc_task_readdir(struct file * filp, void * dirent, filldir_t filldi /* fall through */ } - nr_tids = get_tid_list(pos, tid_array, inode); - inode->i_nlink = pos + nr_tids; - - for (i = 0; i < nr_tids; i++) { - unsigned long j = PROC_NUMBUF; - int tid = tid_array[i]; - - ino = fake_ino(tid,PROC_TID_INO); - - do - buf[--j] = '0' + (tid % 10); - while ((tid /= 10) != 0); + /* f_version caches the tgid value that the last readdir call couldn't + * return. lseek aka telldir automagically resets f_version to 0. + */ + tid = filp->f_version; + filp->f_version = 0; + for (task = first_tid(leader, tid, pos - 2); + task; + task = next_tid(task), pos++) { + int len; + tid = vx_map_pid(task->pid); + if (!proc_pid_visible(task, tid)) + continue; - if (filldir(dirent, buf+j, PROC_NUMBUF-j, pos, ino, DT_DIR) < 0) + len = snprintf(buf, sizeof(buf), "%d", tid); + ino = fake_ino(tid, PROC_TID_INO); + if (filldir(dirent, buf, len, pos, ino, DT_DIR < 0)) { + /* returning this tgid failed, save it as the first + * pid for the next readir call */ + filp->f_version = tid; + put_task_struct(task); break; - pos++; + } } out: filp->f_pos = pos; + put_task_struct(leader); +out_no_task: return retval; } + +static int proc_task_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) +{ + struct inode *inode = dentry->d_inode; + struct task_struct *p = get_proc_task(inode); + generic_fillattr(inode, stat); + + if (p) { + rcu_read_lock(); + stat->nlink += get_nr_threads(p); + rcu_read_unlock(); + put_task_struct(p); + } + + return 0; +} diff --git a/fs/proc/inode.c b/fs/proc/inode.c index 2120c8090..b1f53f47a 100644 --- a/fs/proc/inode.c +++ b/fs/proc/inode.c @@ -58,14 +58,11 @@ static void de_put(struct proc_dir_entry *de) static void proc_delete_inode(struct inode *inode) { struct proc_dir_entry *de; - struct task_struct *tsk; truncate_inode_pages(&inode->i_data, 0); - /* Let go of any associated process */ - tsk = PROC_I(inode)->task; - if (tsk) - put_task_struct(tsk); + /* Stop tracking associated processes */ + put_pid(PROC_I(inode)->pid); /* Let go of any associated proc directory entry */ de = PROC_I(inode)->pde; @@ -94,8 +91,8 @@ static struct inode *proc_alloc_inode(struct super_block *sb) ei = (struct proc_inode *)kmem_cache_alloc(proc_inode_cachep, SLAB_KERNEL); if (!ei) return NULL; - ei->task = NULL; - ei->type = 0; + ei->pid = NULL; + ei->fd = 0; ei->op.proc_get_link = NULL; ei->pde = NULL; inode = &ei->vfs_inode; @@ -197,7 +194,7 @@ int proc_fill_super(struct super_block *s, void *data, int silent) { struct inode * root_inode; - s->s_flags |= MS_NODIRATIME; + s->s_flags |= MS_NODIRATIME | MS_NOSUID | MS_NOEXEC; s->s_blocksize = 1024; s->s_blocksize_bits = 10; s->s_magic = PROC_SUPER_MAGIC; diff --git a/fs/proc/internal.h b/fs/proc/internal.h index 3e55198f9..d370ce7f9 100644 --- a/fs/proc/internal.h +++ b/fs/proc/internal.h @@ -10,12 +10,15 @@ */ #include +#include struct vmalloc_info { unsigned long used; unsigned long largest_chunk; }; +extern struct mm_struct *mm_for_maps(struct task_struct *); + #ifdef CONFIG_MMU #define VMALLOC_TOTAL (VMALLOC_END - VMALLOC_START) extern void get_vmalloc_info(struct vmalloc_info *vmi); @@ -30,19 +33,37 @@ do { \ #endif -extern void create_seq_entry(char *name, mode_t mode, struct file_operations *f); +extern void create_seq_entry(char *name, mode_t mode, const struct file_operations *f); extern int proc_exe_link(struct inode *, struct dentry **, struct vfsmount **); extern int proc_tid_stat(struct task_struct *, char *); extern int proc_tgid_stat(struct task_struct *, char *); extern int proc_pid_status(struct task_struct *, char *); extern int proc_pid_statm(struct task_struct *, char *); -static inline struct task_struct *proc_task(struct inode *inode) +extern struct file_operations proc_maps_operations; +extern struct file_operations proc_numa_maps_operations; +extern struct file_operations proc_smaps_operations; + +extern struct file_operations proc_maps_operations; +extern struct file_operations proc_numa_maps_operations; +extern struct file_operations proc_smaps_operations; + + +void free_proc_entry(struct proc_dir_entry *de); + +int proc_init_inodecache(void); + +static inline struct pid *proc_pid(struct inode *inode) +{ + return PROC_I(inode)->pid; +} + +static inline struct task_struct *get_proc_task(struct inode *inode) { - return PROC_I(inode)->task; + return vx_get_proc_task(inode, proc_pid(inode)); } -static inline int proc_type(struct inode *inode) +static inline int proc_fd(struct inode *inode) { - return PROC_I(inode)->type; + return PROC_I(inode)->fd; } diff --git a/fs/proc/kcore.c b/fs/proc/kcore.c index 5c08a9c55..150d9c5f1 100644 --- a/fs/proc/kcore.c +++ b/fs/proc/kcore.c @@ -9,7 +9,6 @@ * Safe accesses to vmalloc/direct-mapped discontiguous areas, Kanoj Sarcar */ -#include #include #include #include @@ -43,8 +42,6 @@ const struct file_operations proc_kcore_operations = { #define kc_offset_to_vaddr(o) ((o) + PAGE_OFFSET) #endif -#define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) - /* An ELF note in memory */ struct memelfnote { @@ -385,7 +382,7 @@ read_kcore(struct file *file, char __user *buffer, size_t buflen, loff_t *fpos) */ if (n) { if (clear_user(buffer + tsz - n, - tsz - n)) + n)) return -EFAULT; } } else { diff --git a/fs/proc/proc_misc.c b/fs/proc/proc_misc.c index 16271a10a..f8eebe6c7 100644 --- a/fs/proc/proc_misc.c +++ b/fs/proc/proc_misc.c @@ -26,7 +26,6 @@ #include #include #include -#include #include #include #include @@ -53,8 +52,6 @@ #include #include "internal.h" -#include - #define LOAD_INT(x) ((x) >> FSHIFT) #define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1-1)) * 100) /* @@ -140,7 +137,6 @@ static int meminfo_read_proc(char *page, char **start, off_t off, { struct sysinfo i; int len; - struct page_state ps; unsigned long inactive; unsigned long active; unsigned long free; @@ -149,7 +145,6 @@ static int meminfo_read_proc(char *page, char **start, off_t off, struct vmalloc_info vmi; long cached; - get_page_state(&ps); get_zone_counts(&active, &inactive, &free); /* @@ -162,7 +157,8 @@ static int meminfo_read_proc(char *page, char **start, off_t off, allowed = ((totalram_pages - hugetlb_total_pages()) * sysctl_overcommit_ratio / 100) + total_swap_pages; - cached = get_page_cache_size() - total_swapcache_pages - i.bufferram; + cached = global_page_state(NR_FILE_PAGES) - + total_swapcache_pages - i.bufferram; if (cached < 0 || vx_flags(VXF_VIRT_MEM, 0)) cached = 0; @@ -187,11 +183,14 @@ static int meminfo_read_proc(char *page, char **start, off_t off, "SwapFree: %8lu kB\n" "Dirty: %8lu kB\n" "Writeback: %8lu kB\n" + "AnonPages: %8lu kB\n" "Mapped: %8lu kB\n" "Slab: %8lu kB\n" + "PageTables: %8lu kB\n" + "NFS_Unstable: %8lu kB\n" + "Bounce: %8lu kB\n" "CommitLimit: %8lu kB\n" "Committed_AS: %8lu kB\n" - "PageTables: %8lu kB\n" "VmallocTotal: %8lu kB\n" "VmallocUsed: %8lu kB\n" "VmallocChunk: %8lu kB\n", @@ -208,13 +207,16 @@ static int meminfo_read_proc(char *page, char **start, off_t off, K(i.freeram-i.freehigh), K(i.totalswap), K(i.freeswap), - K(ps.nr_dirty), - K(ps.nr_writeback), - K(ps.nr_mapped), - K(ps.nr_slab), + K(global_page_state(NR_FILE_DIRTY)), + K(global_page_state(NR_WRITEBACK)), + K(global_page_state(NR_ANON_PAGES)), + K(global_page_state(NR_FILE_MAPPED)), + K(global_page_state(NR_SLAB)), + K(global_page_state(NR_PAGETABLE)), + K(global_page_state(NR_UNSTABLE_NFS)), + K(global_page_state(NR_BOUNCE)), K(allowed), K(committed), - K(ps.nr_page_table_pages), (unsigned long)VMALLOC_TOTAL >> 10, vmi.used >> 10, vmi.largest_chunk >> 10 diff --git a/fs/proc/root.c b/fs/proc/root.c index 307ba7be0..0aa9fc57d 100644 --- a/fs/proc/root.c +++ b/fs/proc/root.c @@ -12,7 +12,6 @@ #include #include #include -#include #include #include #include @@ -29,10 +28,10 @@ struct proc_dir_entry *proc_virtual; extern void proc_vx_init(void); -static struct super_block *proc_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int proc_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_single(fs_type, flags, data, proc_fill_super); + return get_sb_single(fs_type, flags, data, proc_fill_super, mnt); } static struct file_system_type proc_fs_type = { diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 34fbee766..cdfef5698 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -85,9 +85,13 @@ int proc_exe_link(struct inode *inode, struct dentry **dentry, struct vfsmount * { struct vm_area_struct * vma; int result = -ENOENT; - struct task_struct *task = proc_task(inode); - struct mm_struct * mm = get_task_mm(task); + struct task_struct *task = get_proc_task(inode); + struct mm_struct * mm = NULL; + if (task) { + mm = get_task_mm(task); + put_task_struct(task); + } if (!mm) goto out; down_read(&mm->mmap_sem); @@ -128,9 +132,18 @@ struct mem_size_stats unsigned long private_dirty; }; +__attribute__((weak)) const char *arch_vma_name(struct vm_area_struct *vma) +{ + return NULL; +} + static int show_map_internal(struct seq_file *m, void *v, struct mem_size_stats *mss) { - struct task_struct *task = m->private; + struct proc_maps_private *priv = m->private; + struct task_struct *task = priv->task; +#ifdef __i386__ + struct mm_struct *tmm = get_task_mm(task); +#endif struct vm_area_struct *vma = v; struct mm_struct *mm = vma->vm_mm; struct file *file = vma->vm_file; @@ -152,14 +165,18 @@ static int show_map_internal(struct seq_file *m, void *v, struct mem_size_stats flags & VM_WRITE ? 'w' : '-', (flags & VM_EXEC #ifdef __i386__ - || (!nx_enabled && - (vma->vm_start < task->mm->context.exec_limit)) + || (!nx_enabled && tmm && + (vma->vm_start < tmm->context.exec_limit)) #endif ) ? 'x' : '-', flags & VM_MAYSHARE ? 's' : 'p', vma->vm_pgoff << PAGE_SHIFT, MAJOR(dev), MINOR(dev), ino, &len); +#ifdef __i386__ + if (tmm) + mmput(tmm); +#endif /* * Print the dentry name for named mappings, and a @@ -169,26 +186,23 @@ static int show_map_internal(struct seq_file *m, void *v, struct mem_size_stats pad_len_spaces(m, len); seq_path(m, file->f_vfsmnt, file->f_dentry, "\n"); } else { - if (mm) { - if (vma->vm_end == mm->brk) { - pad_len_spaces(m, len); - seq_puts(m, "[heap]"); - } else if (vma->vm_start <= mm->start_stack && - vma->vm_end >= mm->start_stack) { - - pad_len_spaces(m, len); - seq_puts(m, "[stack]"); + const char *name = arch_vma_name(vma); + if (!name) { + if (mm) { + if (vma->vm_start <= mm->start_brk && + vma->vm_end >= mm->brk) { + name = "[heap]"; + } else if (vma->vm_start <= mm->start_stack && + vma->vm_end >= mm->start_stack) { + name = "[stack]"; } -#ifdef __i386__ - else if (vma->vm_start == - (unsigned long)mm->context.vdso) { - pad_len_spaces(m, len); - seq_puts(m, "[vdso]"); + } else { + name = "[vdso]"; } -#endif - } else { + } + if (name) { pad_len_spaces(m, len); - seq_puts(m, "[vdso]"); + seq_puts(m, name); } } seq_putc(m, '\n'); @@ -315,12 +329,16 @@ static int show_smap(struct seq_file *m, void *v) static void *m_start(struct seq_file *m, loff_t *pos) { - struct task_struct *task = m->private; + struct proc_maps_private *priv = m->private; unsigned long last_addr = m->version; struct mm_struct *mm; - struct vm_area_struct *vma, *tail_vma; + struct vm_area_struct *vma, *tail_vma = NULL; loff_t l = *pos; + /* Clear the per syscall fields in priv */ + priv->task = NULL; + priv->tail_vma = NULL; + /* * We remember last_addr rather than next_addr to hit with * mmap_cache most of the time. We have zero last_addr at @@ -331,11 +349,15 @@ static void *m_start(struct seq_file *m, loff_t *pos) if (last_addr == -1UL) return NULL; - mm = mm_for_maps(task); + priv->task = get_pid_task(priv->pid, PIDTYPE_PID); + if (!priv->task) + return NULL; + + mm = mm_for_maps(priv->task); if (!mm) return NULL; - tail_vma = get_gate_vma(task); + priv->tail_vma = tail_vma = get_gate_vma(priv->task); /* Start with last addr hint */ if (last_addr && (vma = find_vma(mm, last_addr))) { @@ -369,11 +391,9 @@ out: return tail_vma; } -static void m_stop(struct seq_file *m, void *v) +static void vma_stop(struct proc_maps_private *priv, struct vm_area_struct *vma) { - struct task_struct *task = m->private; - struct vm_area_struct *vma = v; - if (vma && vma != get_gate_vma(task)) { + if (vma && vma != priv->tail_vma) { struct mm_struct *mm = vma->vm_mm; up_read(&mm->mmap_sem); mmput(mm); @@ -382,38 +402,103 @@ static void m_stop(struct seq_file *m, void *v) static void *m_next(struct seq_file *m, void *v, loff_t *pos) { - struct task_struct *task = m->private; + struct proc_maps_private *priv = m->private; struct vm_area_struct *vma = v; - struct vm_area_struct *tail_vma = get_gate_vma(task); + struct vm_area_struct *tail_vma = priv->tail_vma; (*pos)++; if (vma && (vma != tail_vma) && vma->vm_next) return vma->vm_next; - m_stop(m, v); + vma_stop(priv, vma); return (vma != tail_vma)? tail_vma: NULL; } -struct seq_operations proc_pid_maps_op = { +static void m_stop(struct seq_file *m, void *v) +{ + struct proc_maps_private *priv = m->private; + struct vm_area_struct *vma = v; + + vma_stop(priv, vma); + if (priv->task) + put_task_struct(priv->task); +} + +static struct seq_operations proc_pid_maps_op = { .start = m_start, .next = m_next, .stop = m_stop, .show = show_map }; -struct seq_operations proc_pid_smaps_op = { +static struct seq_operations proc_pid_smaps_op = { .start = m_start, .next = m_next, .stop = m_stop, .show = show_smap }; +static int do_maps_open(struct inode *inode, struct file *file, + struct seq_operations *ops) +{ + struct proc_maps_private *priv; + int ret = -ENOMEM; + priv = kzalloc(sizeof(*priv), GFP_KERNEL); + if (priv) { + priv->pid = proc_pid(inode); + ret = seq_open(file, ops); + if (!ret) { + struct seq_file *m = file->private_data; + m->private = priv; + } else { + kfree(priv); + } + } + return ret; +} + +static int maps_open(struct inode *inode, struct file *file) +{ + return do_maps_open(inode, file, &proc_pid_maps_op); +} + +struct file_operations proc_maps_operations = { + .open = maps_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release_private, +}; + #ifdef CONFIG_NUMA extern int show_numa_map(struct seq_file *m, void *v); -struct seq_operations proc_pid_numa_maps_op = { +static struct seq_operations proc_pid_numa_maps_op = { .start = m_start, .next = m_next, .stop = m_stop, .show = show_numa_map }; + +static int numa_maps_open(struct inode *inode, struct file *file) +{ + return do_maps_open(inode, file, &proc_pid_numa_maps_op); +} + +struct file_operations proc_numa_maps_operations = { + .open = numa_maps_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release_private, +}; #endif + +static int smaps_open(struct inode *inode, struct file *file) +{ + return do_maps_open(inode, file, &proc_pid_smaps_op); +} + +struct file_operations proc_smaps_operations = { + .open = smaps_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release_private, +}; diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c index 8f68827ed..4616ed50f 100644 --- a/fs/proc/task_nommu.c +++ b/fs/proc/task_nommu.c @@ -107,7 +107,7 @@ int proc_exe_link(struct inode *inode, struct dentry **dentry, struct vfsmount * { struct vm_list_struct *vml; struct vm_area_struct *vma; - struct task_struct *task = proc_task(inode); + struct task_struct *task = get_proc_task(inode); struct mm_struct *mm = get_task_mm(task); int result = -ENOENT; @@ -156,9 +156,28 @@ static void *m_next(struct seq_file *m, void *v, loff_t *pos) { return NULL; } -struct seq_operations proc_pid_maps_op = { +static struct seq_operations proc_pid_maps_op = { .start = m_start, .next = m_next, .stop = m_stop, .show = show_map }; + +static int maps_open(struct inode *inode, struct file *file) +{ + int ret; + ret = seq_open(file, &proc_pid_maps_op); + if (!ret) { + struct seq_file *m = file->private_data; + m->private = NULL; + } + return ret; +} + +struct file_operations proc_maps_operations = { + .open = maps_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, +}; + diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c index 20d4b2237..d96050728 100644 --- a/fs/proc/vmcore.c +++ b/fs/proc/vmcore.c @@ -7,7 +7,6 @@ * */ -#include #include #include #include diff --git a/fs/qnx4/bitmap.c b/fs/qnx4/bitmap.c index 46efbf52c..8425cf6e9 100644 --- a/fs/qnx4/bitmap.c +++ b/fs/qnx4/bitmap.c @@ -13,7 +13,6 @@ * 28-06-1998 by Frank Denis : qnx4_free_inode (to be fixed) . */ -#include #include #include #include diff --git a/fs/qnx4/dir.c b/fs/qnx4/dir.c index 9031948fe..0d7103fa0 100644 --- a/fs/qnx4/dir.c +++ b/fs/qnx4/dir.c @@ -11,7 +11,6 @@ * 20-06-1998 by Frank Denis : Linux 2.1.99+ & dcache support. */ -#include #include #include #include diff --git a/fs/qnx4/fsync.c b/fs/qnx4/fsync.c index df5bc75d5..aa3b19544 100644 --- a/fs/qnx4/fsync.c +++ b/fs/qnx4/fsync.c @@ -10,7 +10,6 @@ * 24-03-1998 by Richard Frowijn : first release. */ -#include #include #include #include diff --git a/fs/qnx4/inode.c b/fs/qnx4/inode.c index 2ecd46f85..3b2546971 100644 --- a/fs/qnx4/inode.c +++ b/fs/qnx4/inode.c @@ -12,7 +12,6 @@ * 30-06-1998 by Frank Denis : first step to write inodes. */ -#include #include #include #include @@ -128,7 +127,7 @@ static struct inode *qnx4_alloc_inode(struct super_block *sb); static void qnx4_destroy_inode(struct inode *inode); static void qnx4_read_inode(struct inode *); static int qnx4_remount(struct super_block *sb, int *flags, char *data); -static int qnx4_statfs(struct super_block *, struct kstatfs *); +static int qnx4_statfs(struct dentry *, struct kstatfs *); static struct super_operations qnx4_sops = { @@ -282,8 +281,10 @@ unsigned long qnx4_block_map( struct inode *inode, long iblock ) return block; } -static int qnx4_statfs(struct super_block *sb, struct kstatfs *buf) +static int qnx4_statfs(struct dentry *dentry, struct kstatfs *buf) { + struct super_block *sb = dentry->d_sb; + lock_kernel(); buf->f_type = sb->s_magic; @@ -448,7 +449,7 @@ static sector_t qnx4_bmap(struct address_space *mapping, sector_t block) { return generic_block_bmap(mapping,block,qnx4_get_block); } -static struct address_space_operations qnx4_aops = { +static const struct address_space_operations qnx4_aops = { .readpage = qnx4_readpage, .writepage = qnx4_writepage, .sync_page = block_sync_page, @@ -496,7 +497,6 @@ static void qnx4_read_inode(struct inode *inode) inode->i_ctime.tv_sec = le32_to_cpu(raw_inode->di_ctime); inode->i_ctime.tv_nsec = 0; inode->i_blocks = le32_to_cpu(raw_inode->di_first_xtnt.xtnt_size); - inode->i_blksize = QNX4_DIR_ENTRY_SIZE; memcpy(qnx4_inode, raw_inode, QNX4_DIR_ENTRY_SIZE); if (S_ISREG(inode->i_mode)) { @@ -561,10 +561,11 @@ static void destroy_inodecache(void) "qnx4_inode_cache: not all structures were freed\n"); } -static struct super_block *qnx4_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int qnx4_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_bdev(fs_type, flags, dev_name, data, qnx4_fill_super); + return get_sb_bdev(fs_type, flags, dev_name, data, qnx4_fill_super, + mnt); } static struct file_system_type qnx4_fs_type = { diff --git a/fs/qnx4/namei.c b/fs/qnx4/namei.c index 4af4951d7..c3d83f671 100644 --- a/fs/qnx4/namei.c +++ b/fs/qnx4/namei.c @@ -12,7 +12,6 @@ * 04-07-1998 by Frank Denis : first step for rmdir/unlink. */ -#include #include #include #include diff --git a/fs/qnx4/truncate.c b/fs/qnx4/truncate.c index 86563ec01..6437c1c3d 100644 --- a/fs/qnx4/truncate.c +++ b/fs/qnx4/truncate.c @@ -10,7 +10,6 @@ * 30-06-1998 by Frank DENIS : ugly filler. */ -#include #include #include #include diff --git a/fs/ramfs/file-mmu.c b/fs/ramfs/file-mmu.c index 00a933eb8..86f14cacf 100644 --- a/fs/ramfs/file-mmu.c +++ b/fs/ramfs/file-mmu.c @@ -26,7 +26,7 @@ #include -struct address_space_operations ramfs_aops = { +const struct address_space_operations ramfs_aops = { .readpage = simple_readpage, .prepare_write = simple_prepare_write, .commit_write = simple_commit_write diff --git a/fs/ramfs/file-nommu.c b/fs/ramfs/file-nommu.c index f443a84b9..677139b48 100644 --- a/fs/ramfs/file-nommu.c +++ b/fs/ramfs/file-nommu.c @@ -27,7 +27,7 @@ static int ramfs_nommu_setattr(struct dentry *, struct iattr *); -struct address_space_operations ramfs_aops = { +const struct address_space_operations ramfs_aops = { .readpage = simple_readpage, .prepare_write = simple_prepare_write, .commit_write = simple_commit_write @@ -283,9 +283,9 @@ unsigned long ramfs_nommu_get_unmapped_area(struct file *file, /*****************************************************************************/ /* - * set up a mapping + * set up a mapping for shared memory segments */ int ramfs_nommu_mmap(struct file *file, struct vm_area_struct *vma) { - return 0; + return vma->vm_flags & VM_SHARED ? 0 : -ENOSYS; } diff --git a/fs/ramfs/inode.c b/fs/ramfs/inode.c index 14bd2246f..bc0e51662 100644 --- a/fs/ramfs/inode.c +++ b/fs/ramfs/inode.c @@ -58,7 +58,6 @@ struct inode *ramfs_get_inode(struct super_block *sb, int mode, dev_t dev) inode->i_mode = mode; inode->i_uid = current->fsuid; inode->i_gid = current->fsgid; - inode->i_blksize = PAGE_CACHE_SIZE; inode->i_blocks = 0; inode->i_mapping->a_ops = &ramfs_aops; inode->i_mapping->backing_dev_info = &ramfs_backing_dev_info; @@ -185,16 +184,17 @@ static int ramfs_fill_super(struct super_block * sb, void * data, int silent) return 0; } -struct super_block *ramfs_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +int ramfs_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_nodev(fs_type, flags, data, ramfs_fill_super); + return get_sb_nodev(fs_type, flags, data, ramfs_fill_super, mnt); } -static struct super_block *rootfs_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int rootfs_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_nodev(fs_type, flags|MS_NOUSER, data, ramfs_fill_super); + return get_sb_nodev(fs_type, flags|MS_NOUSER, data, ramfs_fill_super, + mnt); } static struct file_system_type ramfs_fs_type = { diff --git a/fs/ramfs/internal.h b/fs/ramfs/internal.h index 313237631..c2bb58e74 100644 --- a/fs/ramfs/internal.h +++ b/fs/ramfs/internal.h @@ -10,6 +10,6 @@ */ -extern struct address_space_operations ramfs_aops; +extern const struct address_space_operations ramfs_aops; extern const struct file_operations ramfs_file_operations; extern struct inode_operations ramfs_file_inode_operations; diff --git a/fs/read_write.c b/fs/read_write.c index c71dd10e5..c5b80d98d 100644 --- a/fs/read_write.c +++ b/fs/read_write.c @@ -438,7 +438,7 @@ unsigned long iov_shorten(struct iovec *iov, unsigned long nr_segs, size_t to) return seg; } -EXPORT_SYMBOL(iov_shorten); +EXPORT_UNUSED_SYMBOL(iov_shorten); /* June 2006 */ /* A write operation does a read from user space and vice versa */ #define vrfy_dir(type) ((type) == READ ? VERIFY_WRITE : VERIFY_READ) diff --git a/fs/readdir.c b/fs/readdir.c index b6109329b..bff3ee58e 100644 --- a/fs/readdir.c +++ b/fs/readdir.c @@ -69,20 +69,24 @@ struct readdir_callback { }; static int fillonedir(void * __buf, const char * name, int namlen, loff_t offset, - ino_t ino, unsigned int d_type) + u64 ino, unsigned int d_type) { struct readdir_callback * buf = (struct readdir_callback *) __buf; struct old_linux_dirent __user * dirent; + unsigned long d_ino; if (buf->result) return -EINVAL; + d_ino = ino; + if (sizeof(d_ino) < sizeof(ino) && d_ino != ino) + return -EOVERFLOW; buf->result++; dirent = buf->dirent; if (!access_ok(VERIFY_WRITE, dirent, (unsigned long)(dirent->d_name + namlen + 1) - (unsigned long)dirent)) goto efault; - if ( __put_user(ino, &dirent->d_ino) || + if ( __put_user(d_ino, &dirent->d_ino) || __put_user(offset, &dirent->d_offset) || __put_user(namlen, &dirent->d_namlen) || __copy_to_user(dirent->d_name, name, namlen) || @@ -138,22 +142,26 @@ struct getdents_callback { }; static int filldir(void * __buf, const char * name, int namlen, loff_t offset, - ino_t ino, unsigned int d_type) + u64 ino, unsigned int d_type) { struct linux_dirent __user * dirent; struct getdents_callback * buf = (struct getdents_callback *) __buf; + unsigned long d_ino; int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 2); buf->error = -EINVAL; /* only used if we fail.. */ if (reclen > buf->count) return -EINVAL; + d_ino = ino; + if (sizeof(d_ino) < sizeof(ino) && d_ino != ino) + return -EOVERFLOW; dirent = buf->previous; if (dirent) { if (__put_user(offset, &dirent->d_off)) goto efault; } dirent = buf->current_dir; - if (__put_user(ino, &dirent->d_ino)) + if (__put_user(d_ino, &dirent->d_ino)) goto efault; if (__put_user(reclen, &dirent->d_reclen)) goto efault; @@ -222,7 +230,7 @@ struct getdents_callback64 { }; static int filldir64(void * __buf, const char * name, int namlen, loff_t offset, - ino_t ino, unsigned int d_type) + u64 ino, unsigned int d_type) { struct linux_dirent64 __user *dirent; struct getdents_callback64 * buf = (struct getdents_callback64 *) __buf; diff --git a/fs/reiserfs/bitmap.c b/fs/reiserfs/bitmap.c index 3e5f39f43..3d239f448 100644 --- a/fs/reiserfs/bitmap.c +++ b/fs/reiserfs/bitmap.c @@ -3,7 +3,6 @@ */ /* Reiserfs block (de)allocator, bitmap-based. */ -#include #include #include #include diff --git a/fs/reiserfs/dir.c b/fs/reiserfs/dir.c index 973c819f8..9aabcc0cc 100644 --- a/fs/reiserfs/dir.c +++ b/fs/reiserfs/dir.c @@ -2,7 +2,6 @@ * Copyright 2000 by Hans Reiser, licensing governed by reiserfs/README */ -#include #include #include #include diff --git a/fs/reiserfs/do_balan.c b/fs/reiserfs/do_balan.c index b2264ba3c..fba304e64 100644 --- a/fs/reiserfs/do_balan.c +++ b/fs/reiserfs/do_balan.c @@ -15,7 +15,6 @@ ** **/ -#include #include #include #include diff --git a/fs/reiserfs/file.c b/fs/reiserfs/file.c index 0eea8b468..4127ad1f4 100644 --- a/fs/reiserfs/file.c +++ b/fs/reiserfs/file.c @@ -48,8 +48,8 @@ static int reiserfs_file_release(struct inode *inode, struct file *filp) return 0; } - reiserfs_write_lock(inode->i_sb); mutex_lock(&inode->i_mutex); + reiserfs_write_lock(inode->i_sb); /* freeing preallocation only involves relogging blocks that * are already in the current transaction. preallocation gets * freed at the end of each transaction, so it is impossible for @@ -860,8 +860,12 @@ static int reiserfs_submit_file_region_for_write(struct reiserfs_transaction_han // this sets the proper flags for O_SYNC to trigger a commit mark_inode_dirty(inode); reiserfs_write_unlock(inode->i_sb); - } else + } else { + reiserfs_write_lock(inode->i_sb); + reiserfs_update_inode_transaction(inode); mark_inode_dirty(inode); + reiserfs_write_unlock(inode->i_sb); + } sd_update = 1; } @@ -1560,12 +1564,6 @@ static ssize_t reiserfs_file_write(struct file *file, /* the file we are going t return res; } -static ssize_t reiserfs_aio_write(struct kiocb *iocb, const char __user * buf, - size_t count, loff_t pos) -{ - return generic_file_aio_write(iocb, buf, count, pos); -} - const struct file_operations reiserfs_file_operations = { .read = generic_file_read, .write = reiserfs_file_write, @@ -1575,7 +1573,7 @@ const struct file_operations reiserfs_file_operations = { .fsync = reiserfs_sync_file, .sendfile = generic_file_sendfile, .aio_read = generic_file_aio_read, - .aio_write = reiserfs_aio_write, + .aio_write = generic_file_aio_write, .splice_read = generic_file_splice_read, .splice_write = generic_file_splice_write, }; diff --git a/fs/reiserfs/fix_node.c b/fs/reiserfs/fix_node.c index 5600d3d60..6d0e554da 100644 --- a/fs/reiserfs/fix_node.c +++ b/fs/reiserfs/fix_node.c @@ -34,7 +34,6 @@ ** **/ -#include #include #include #include diff --git a/fs/reiserfs/ibalance.c b/fs/reiserfs/ibalance.c index 6c5a726fd..de391a82b 100644 --- a/fs/reiserfs/ibalance.c +++ b/fs/reiserfs/ibalance.c @@ -2,7 +2,6 @@ * Copyright 2000 by Hans Reiser, licensing governed by reiserfs/README */ -#include #include #include #include diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index 5375e5ffd..52a9e2a3a 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c @@ -2,7 +2,6 @@ * Copyright 2000 by Hans Reiser, licensing governed by reiserfs/README */ -#include #include #include #include @@ -20,8 +19,6 @@ #include #include -extern int reiserfs_default_io_size; /* default io size devuned in super.c */ - static int reiserfs_commit_write(struct file *f, struct page *page, unsigned from, unsigned to); static int reiserfs_prepare_write(struct file *f, struct page *page, @@ -42,14 +39,10 @@ void reiserfs_delete_inode(struct inode *inode) /* The = 0 happens when we abort creating a new inode for some reason like lack of space.. */ if (!(inode->i_state & I_NEW) && INODE_PKEY(inode)->k_objectid != 0) { /* also handles bad_inode case */ - mutex_lock(&inode->i_mutex); - reiserfs_delete_xattrs(inode); - if (journal_begin(&th, inode->i_sb, jbegin_count)) { - mutex_unlock(&inode->i_mutex); + if (journal_begin(&th, inode->i_sb, jbegin_count)) goto out; - } reiserfs_update_inode_transaction(inode); err = reiserfs_delete_object(&th, inode); @@ -61,12 +54,8 @@ void reiserfs_delete_inode(struct inode *inode) DQUOT_FREE_INODE(inode); DLIMIT_FREE_INODE(inode); - if (journal_end(&th, inode->i_sb, jbegin_count)) { - mutex_unlock(&inode->i_mutex); + if (journal_end(&th, inode->i_sb, jbegin_count)) goto out; - } - - mutex_unlock(&inode->i_mutex); /* check return value from reiserfs_delete_object after * ending the transaction @@ -1136,7 +1125,6 @@ static void init_inode(struct inode *inode, struct path *path) ih = PATH_PITEM_HEAD(path); copy_key(INODE_PKEY(inode), &(ih->ih_key)); - inode->i_blksize = reiserfs_default_io_size; INIT_LIST_HEAD(&(REISERFS_I(inode)->i_prealloc_list)); REISERFS_I(inode)->i_flags = 0; @@ -1903,7 +1891,6 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th, } // these do not go to on-disk stat data inode->i_ino = le32_to_cpu(ih.ih_key.k_objectid); - inode->i_blksize = reiserfs_default_io_size; // store in in-core inode the key of stat data and version all // object items will have (directory items will have old offset @@ -2369,10 +2356,11 @@ static int reiserfs_write_full_page(struct page *page, unsigned long end_index = inode->i_size >> PAGE_CACHE_SHIFT; int error = 0; unsigned long block; + sector_t last_block; struct buffer_head *head, *bh; int partial = 0; int nr = 0; - int checked = PageChecked(page); + int checked = PageFsMisc(page); struct reiserfs_transaction_handle th; struct super_block *s = inode->i_sb; int bh_per_page = PAGE_CACHE_SIZE / s->s_blocksize; @@ -2416,10 +2404,19 @@ static int reiserfs_write_full_page(struct page *page, } bh = head; block = page->index << (PAGE_CACHE_SHIFT - s->s_blocksize_bits); + last_block = (i_size_read(inode) - 1) >> inode->i_blkbits; /* first map all the buffers, logging any direct items we find */ do { - if ((checked || buffer_dirty(bh)) && (!buffer_mapped(bh) || - (buffer_mapped(bh) + if (block > last_block) { + /* + * This can happen when the block size is less than + * the page size. The corresponding bytes in the page + * were zero filled above + */ + clear_buffer_dirty(bh); + set_buffer_uptodate(bh); + } else if ((checked || buffer_dirty(bh)) && + (!buffer_mapped(bh) || (buffer_mapped(bh) && bh->b_blocknr == 0))) { /* not mapped yet, or it points to a direct item, search @@ -2441,7 +2438,7 @@ static int reiserfs_write_full_page(struct page *page, * blocks we're going to log */ if (checked) { - ClearPageChecked(page); + ClearPageFsMisc(page); reiserfs_write_lock(s); error = journal_begin(&th, s, bh_per_page + 1); if (error) { @@ -2838,7 +2835,7 @@ static void reiserfs_invalidatepage(struct page *page, unsigned long offset) BUG_ON(!PageLocked(page)); if (offset == 0) - ClearPageChecked(page); + ClearPageFsMisc(page); if (!page_has_buffers(page)) goto out; @@ -2879,7 +2876,7 @@ static int reiserfs_set_page_dirty(struct page *page) { struct inode *inode = page->mapping->host; if (reiserfs_file_data_log(inode)) { - SetPageChecked(page); + SetPageFsMisc(page); return __set_page_dirty_nobuffers(page); } return __set_page_dirty_buffers(page); @@ -2902,7 +2899,7 @@ static int reiserfs_releasepage(struct page *page, gfp_t unused_gfp_flags) struct buffer_head *bh; int ret = 1; - WARN_ON(PageChecked(page)); + WARN_ON(PageFsMisc(page)); spin_lock(&j->j_dirty_buffers_lock); head = page_buffers(page); bh = head; @@ -2985,6 +2982,11 @@ int reiserfs_setattr(struct dentry *dentry, struct iattr *attr) } if (error) goto out; + /* + * file size is changed, ctime and mtime are + * to be updated + */ + attr->ia_valid |= (ATTR_MTIME | ATTR_CTIME); } } @@ -3053,7 +3055,7 @@ int reiserfs_setattr(struct dentry *dentry, struct iattr *attr) return error; } -struct address_space_operations reiserfs_address_space_operations = { +const struct address_space_operations reiserfs_address_space_operations = { .writepage = reiserfs_writepage, .readpage = reiserfs_readpage, .readpages = reiserfs_readpages, diff --git a/fs/reiserfs/ioctl.c b/fs/reiserfs/ioctl.c index e2dbca076..f2872cc9b 100644 --- a/fs/reiserfs/ioctl.c +++ b/fs/reiserfs/ioctl.c @@ -125,12 +125,12 @@ static int reiserfs_unpack(struct inode *inode, struct file *filp) if (REISERFS_I(inode)->i_flags & i_nopack_mask) { return 0; } - reiserfs_write_lock(inode->i_sb); /* we need to make sure nobody is changing the file size beneath ** us */ mutex_lock(&inode->i_mutex); + reiserfs_write_lock(inode->i_sb); write_from = inode->i_size & (blocksize - 1); /* if we are on a block boundary, we are already unpacked. */ diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c index 1b73529b8..9b3672d69 100644 --- a/fs/reiserfs/journal.c +++ b/fs/reiserfs/journal.c @@ -34,7 +34,6 @@ ** from within kupdate, it will ignore the immediate flag */ -#include #include #include @@ -834,8 +833,7 @@ static int write_ordered_buffers(spinlock_t * lock, get_bh(bh); if (test_set_buffer_locked(bh)) { if (!buffer_dirty(bh)) { - list_del_init(&jh->list); - list_add(&jh->list, &tmp); + list_move(&jh->list, &tmp); goto loop_next; } spin_unlock(lock); @@ -855,8 +853,7 @@ static int write_ordered_buffers(spinlock_t * lock, ret = -EIO; } if (buffer_dirty(bh)) { - list_del_init(&jh->list); - list_add(&jh->list, &tmp); + list_move(&jh->list, &tmp); add_to_chunk(&chunk, bh, lock, write_ordered_chunk); } else { reiserfs_free_jh(bh); diff --git a/fs/reiserfs/lbalance.c b/fs/reiserfs/lbalance.c index 2533c1f64..281f8061a 100644 --- a/fs/reiserfs/lbalance.c +++ b/fs/reiserfs/lbalance.c @@ -2,7 +2,6 @@ * Copyright 2000 by Hans Reiser, licensing governed by reiserfs/README */ -#include #include #include #include diff --git a/fs/reiserfs/namei.c b/fs/reiserfs/namei.c index 6faa29eeb..002ff2102 100644 --- a/fs/reiserfs/namei.c +++ b/fs/reiserfs/namei.c @@ -11,7 +11,6 @@ * NO WARRANTY */ -#include #include #include #include diff --git a/fs/reiserfs/objectid.c b/fs/reiserfs/objectid.c index f62590aa9..65feba4de 100644 --- a/fs/reiserfs/objectid.c +++ b/fs/reiserfs/objectid.c @@ -2,7 +2,6 @@ * Copyright 2000 by Hans Reiser, licensing governed by reiserfs/README */ -#include #include #include #include diff --git a/fs/reiserfs/prints.c b/fs/reiserfs/prints.c index 27bd3a1df..bc808a91e 100644 --- a/fs/reiserfs/prints.c +++ b/fs/reiserfs/prints.c @@ -2,7 +2,6 @@ * Copyright 2000 by Hans Reiser, licensing governed by reiserfs/README */ -#include #include #include #include diff --git a/fs/reiserfs/procfs.c b/fs/reiserfs/procfs.c index 731688e1c..c533ec1bc 100644 --- a/fs/reiserfs/procfs.c +++ b/fs/reiserfs/procfs.c @@ -10,7 +10,6 @@ /* $Id: procfs.c,v 1.1.8.2 2001/07/15 17:08:42 god Exp $ */ -#include #include #include #include @@ -493,9 +492,17 @@ static void add_file(struct super_block *sb, char *name, int reiserfs_proc_info_init(struct super_block *sb) { + char b[BDEVNAME_SIZE]; + char *s; + + /* Some block devices use /'s */ + strlcpy(b, reiserfs_bdevname(sb), BDEVNAME_SIZE); + s = strchr(b, '/'); + if (s) + *s = '!'; + spin_lock_init(&__PINFO(sb).lock); - REISERFS_SB(sb)->procdir = - proc_mkdir(reiserfs_bdevname(sb), proc_info_root); + REISERFS_SB(sb)->procdir = proc_mkdir(b, proc_info_root); if (REISERFS_SB(sb)->procdir) { REISERFS_SB(sb)->procdir->owner = THIS_MODULE; REISERFS_SB(sb)->procdir->data = sb; @@ -509,13 +516,22 @@ int reiserfs_proc_info_init(struct super_block *sb) return 0; } reiserfs_warning(sb, "reiserfs: cannot create /proc/%s/%s", - proc_info_root_name, reiserfs_bdevname(sb)); + proc_info_root_name, b); return 1; } int reiserfs_proc_info_done(struct super_block *sb) { struct proc_dir_entry *de = REISERFS_SB(sb)->procdir; + char b[BDEVNAME_SIZE]; + char *s; + + /* Some block devices use /'s */ + strlcpy(b, reiserfs_bdevname(sb), BDEVNAME_SIZE); + s = strchr(b, '/'); + if (s) + *s = '!'; + if (de) { remove_proc_entry("journal", de); remove_proc_entry("oidmap", de); @@ -529,7 +545,7 @@ int reiserfs_proc_info_done(struct super_block *sb) __PINFO(sb).exiting = 1; spin_unlock(&__PINFO(sb).lock); if (proc_info_root) { - remove_proc_entry(reiserfs_bdevname(sb), proc_info_root); + remove_proc_entry(b, proc_info_root); REISERFS_SB(sb)->procdir = NULL; } return 0; diff --git a/fs/reiserfs/stree.c b/fs/reiserfs/stree.c index 8357de4ab..da05a72e3 100644 --- a/fs/reiserfs/stree.c +++ b/fs/reiserfs/stree.c @@ -49,7 +49,6 @@ * reiserfs_insert_item */ -#include #include #include #include diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index bb275eb7b..c5868981c 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c @@ -11,7 +11,6 @@ * NO WARRANTY */ -#include #include #include #include @@ -60,7 +59,7 @@ static int is_any_reiserfs_magic_string(struct reiserfs_super_block *rs) } static int reiserfs_remount(struct super_block *s, int *flags, char *data); -static int reiserfs_statfs(struct super_block *s, struct kstatfs *buf); +static int reiserfs_statfs(struct dentry *dentry, struct kstatfs *buf); static int reiserfs_sync_fs(struct super_block *s, int wait) { @@ -431,22 +430,29 @@ int remove_save_link(struct inode *inode, int truncate) return journal_end(&th, inode->i_sb, JOURNAL_PER_BALANCE_CNT); } +static void reiserfs_kill_sb(struct super_block *s) +{ + if (REISERFS_SB(s)) { + if (REISERFS_SB(s)->xattr_root) { + d_invalidate(REISERFS_SB(s)->xattr_root); + dput(REISERFS_SB(s)->xattr_root); + REISERFS_SB(s)->xattr_root = NULL; + } + if (REISERFS_SB(s)->priv_root) { + d_invalidate(REISERFS_SB(s)->priv_root); + dput(REISERFS_SB(s)->priv_root); + REISERFS_SB(s)->priv_root = NULL; + } + kill_block_super(s); + } +} + static void reiserfs_put_super(struct super_block *s) { int i; struct reiserfs_transaction_handle th; th.t_trans_id = 0; - if (REISERFS_SB(s)->xattr_root) { - d_invalidate(REISERFS_SB(s)->xattr_root); - dput(REISERFS_SB(s)->xattr_root); - } - - if (REISERFS_SB(s)->priv_root) { - d_invalidate(REISERFS_SB(s)->priv_root); - dput(REISERFS_SB(s)->priv_root); - } - /* change file system state to current state if it was mounted with read-write permissions */ if (!(s->s_flags & MS_RDONLY)) { if (!journal_begin(&th, s, 10)) { @@ -1951,15 +1957,15 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent) return errval; } -static int reiserfs_statfs(struct super_block *s, struct kstatfs *buf) +static int reiserfs_statfs(struct dentry *dentry, struct kstatfs *buf) { - struct reiserfs_super_block *rs = SB_DISK_SUPER_BLOCK(s); + struct reiserfs_super_block *rs = SB_DISK_SUPER_BLOCK(dentry->d_sb); buf->f_namelen = (REISERFS_MAX_NAME(s->s_blocksize)); buf->f_bfree = sb_free_blocks(rs); buf->f_bavail = buf->f_bfree; buf->f_blocks = sb_block_count(rs) - sb_bmap_nr(rs) - 1; - buf->f_bsize = s->s_blocksize; + buf->f_bsize = dentry->d_sb->s_blocksize; /* changed to accommodate gcc folks. */ buf->f_type = REISERFS_SUPER_MAGIC; return 0; @@ -2217,7 +2223,7 @@ static ssize_t reiserfs_quota_write(struct super_block *sb, int type, size_t towrite = len; struct buffer_head tmp_bh, *bh; - mutex_lock(&inode->i_mutex); + mutex_lock_nested(&inode->i_mutex, I_MUTEX_QUOTA); while (towrite > 0) { tocopy = sb->s_blocksize - offset < towrite ? sb->s_blocksize - offset : towrite; @@ -2262,11 +2268,12 @@ static ssize_t reiserfs_quota_write(struct super_block *sb, int type, #endif -static struct super_block *get_super_block(struct file_system_type *fs_type, - int flags, const char *dev_name, - void *data) +static int get_super_block(struct file_system_type *fs_type, + int flags, const char *dev_name, + void *data, struct vfsmount *mnt) { - return get_sb_bdev(fs_type, flags, dev_name, data, reiserfs_fill_super); + return get_sb_bdev(fs_type, flags, dev_name, data, reiserfs_fill_super, + mnt); } static int __init init_reiserfs_fs(void) @@ -2313,7 +2320,7 @@ struct file_system_type reiserfs_fs_type = { .owner = THIS_MODULE, .name = "reiserfs", .get_sb = get_super_block, - .kill_sb = kill_block_super, + .kill_sb = reiserfs_kill_sb, .fs_flags = FS_REQUIRES_DEV, }; diff --git a/fs/reiserfs/tail_conversion.c b/fs/reiserfs/tail_conversion.c index 196e971c0..36f108fc1 100644 --- a/fs/reiserfs/tail_conversion.c +++ b/fs/reiserfs/tail_conversion.c @@ -2,7 +2,6 @@ * Copyright 1999 Hans Reiser, see reiserfs/README for licensing and copyright details */ -#include #include #include #include diff --git a/fs/reiserfs/xattr.c b/fs/reiserfs/xattr.c index b99819abf..1243010cc 100644 --- a/fs/reiserfs/xattr.c +++ b/fs/reiserfs/xattr.c @@ -425,7 +425,7 @@ int xattr_readdir(struct file *file, filldir_t filler, void *buf) int res = -ENOTDIR; if (!file->f_op || !file->f_op->readdir) goto out; - mutex_lock(&inode->i_mutex); + mutex_lock_nested(&inode->i_mutex, I_MUTEX_XATTR); // down(&inode->i_zombie); res = -ENOENT; if (!IS_DEADDIR(inode)) { @@ -453,8 +453,7 @@ static struct page *reiserfs_get_page(struct inode *dir, unsigned long n) /* We can deadlock if we try to free dentries, and an unlink/rmdir has just occured - GFP_NOFS avoids this */ mapping_set_gfp_mask(mapping, GFP_NOFS); - page = read_cache_page(mapping, n, - (filler_t *) mapping->a_ops->readpage, NULL); + page = read_mapping_page(mapping, n, NULL); if (!IS_ERR(page)) { wait_on_page_locked(page); kmap(page); @@ -775,7 +774,7 @@ int reiserfs_xattr_del(struct inode *inode, const char *name) static int reiserfs_delete_xattrs_filler(void *buf, const char *name, int namelen, - loff_t offset, ino_t ino, unsigned int d_type) + loff_t offset, u64 ino, unsigned int d_type) { struct dentry *xadir = (struct dentry *)buf; @@ -853,7 +852,7 @@ struct reiserfs_chown_buf { /* XXX: If there is a better way to do this, I'd love to hear about it */ static int reiserfs_chown_xattrs_filler(void *buf, const char *name, int namelen, - loff_t offset, ino_t ino, unsigned int d_type) + loff_t offset, u64 ino, unsigned int d_type) { struct reiserfs_chown_buf *chown_buf = (struct reiserfs_chown_buf *)buf; struct dentry *xafile, *xadir = chown_buf->xadir; @@ -1038,7 +1037,7 @@ struct reiserfs_listxattr_buf { static int reiserfs_listxattr_filler(void *buf, const char *name, int namelen, - loff_t offset, ino_t ino, unsigned int d_type) + loff_t offset, u64 ino, unsigned int d_type) { struct reiserfs_listxattr_buf *b = (struct reiserfs_listxattr_buf *)buf; int len = 0; diff --git a/fs/romfs/inode.c b/fs/romfs/inode.c index 9b9eda7b3..22eed61eb 100644 --- a/fs/romfs/inode.c +++ b/fs/romfs/inode.c @@ -179,12 +179,12 @@ outnobh: /* That's simple too. */ static int -romfs_statfs(struct super_block *sb, struct kstatfs *buf) +romfs_statfs(struct dentry *dentry, struct kstatfs *buf) { buf->f_type = ROMFS_MAGIC; buf->f_bsize = ROMBSIZE; buf->f_bfree = buf->f_bavail = buf->f_ffree; - buf->f_blocks = (romfs_maxsize(sb)+ROMBSIZE-1)>>ROMBSBITS; + buf->f_blocks = (romfs_maxsize(dentry->d_sb)+ROMBSIZE-1)>>ROMBSBITS; buf->f_namelen = ROMFS_MAXFN; return 0; } @@ -459,7 +459,7 @@ err_out: /* Mapping from our types to the kernel */ -static struct address_space_operations romfs_aops = { +static const struct address_space_operations romfs_aops = { .readpage = romfs_readpage }; @@ -607,10 +607,11 @@ static struct super_operations romfs_ops = { .remount_fs = romfs_remount, }; -static struct super_block *romfs_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int romfs_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_bdev(fs_type, flags, dev_name, data, romfs_fill_super); + return get_sb_bdev(fs_type, flags, dev_name, data, romfs_fill_super, + mnt); } static struct file_system_type romfs_fs_type = { diff --git a/fs/select.c b/fs/select.c index 8cd6dc31f..33b72ba0f 100644 --- a/fs/select.c +++ b/fs/select.c @@ -23,7 +23,6 @@ #include #include #include -#include #include @@ -66,8 +65,7 @@ EXPORT_SYMBOL(poll_initwait); static void free_poll_entry(struct poll_table_entry *entry) { - if (remove_wait_queue(entry->wait_address,&entry->wait) < 0) - print_symbol("bad poll-entry for %s", (unsigned long) entry->filp->f_op->poll); + remove_wait_queue(entry->wait_address,&entry->wait); fput(entry->filp); } @@ -548,37 +546,38 @@ struct poll_list { #define POLLFD_PER_PAGE ((PAGE_SIZE-sizeof(struct poll_list)) / sizeof(struct pollfd)) -static void do_pollfd(unsigned int num, struct pollfd * fdpage, - poll_table ** pwait, int *count) +/* + * Fish for pollable events on the pollfd->fd file descriptor. We're only + * interested in events matching the pollfd->events mask, and the result + * matching that mask is both recorded in pollfd->revents and returned. The + * pwait poll_table will be used by the fd-provided poll handler for waiting, + * if non-NULL. + */ +static inline unsigned int do_pollfd(struct pollfd *pollfd, poll_table *pwait) { - int i; - - for (i = 0; i < num; i++) { - int fd; - unsigned int mask; - struct pollfd *fdp; - - mask = 0; - fdp = fdpage+i; - fd = fdp->fd; - if (fd >= 0) { - int fput_needed; - struct file * file = fget_light(fd, &fput_needed); - mask = POLLNVAL; - if (file != NULL) { - mask = DEFAULT_POLLMASK; - if (file->f_op && file->f_op->poll) - mask = file->f_op->poll(file, *pwait); - mask &= fdp->events | POLLERR | POLLHUP; - fput_light(file, fput_needed); - } - if (mask) { - *pwait = NULL; - (*count)++; - } + unsigned int mask; + int fd; + + mask = 0; + fd = pollfd->fd; + if (fd >= 0) { + int fput_needed; + struct file * file; + + file = fget_light(fd, &fput_needed); + mask = POLLNVAL; + if (file != NULL) { + mask = DEFAULT_POLLMASK; + if (file->f_op && file->f_op->poll) + mask = file->f_op->poll(file, pwait); + /* Mask out unneeded events. */ + mask &= pollfd->events | POLLERR | POLLHUP; + fput_light(file, fput_needed); } - fdp->revents = mask; } + pollfd->revents = mask; + + return mask; } static int do_poll(unsigned int nfds, struct poll_list *list, @@ -596,11 +595,29 @@ static int do_poll(unsigned int nfds, struct poll_list *list, long __timeout; set_current_state(TASK_INTERRUPTIBLE); - walk = list; - while(walk != NULL) { - do_pollfd( walk->len, walk->entries, &pt, &count); - walk = walk->next; + for (walk = list; walk != NULL; walk = walk->next) { + struct pollfd * pfd, * pfd_end; + + pfd = walk->entries; + pfd_end = pfd + walk->len; + for (; pfd != pfd_end; pfd++) { + /* + * Fish for events. If we found one, record it + * and kill the poll_table, so we don't + * needlessly register any other waiters after + * this. They'll get immediately deregistered + * when we break out and return. + */ + if (do_pollfd(pfd, pt)) { + count++; + pt = NULL; + } + } } + /* + * All waiters have already been registered, so don't provide + * a poll_table to them on the next loop iteration. + */ pt = NULL; if (count || !*timeout || signal_pending(current)) break; @@ -729,9 +746,9 @@ out_fds: asmlinkage long sys_poll(struct pollfd __user *ufds, unsigned int nfds, long timeout_msecs) { - s64 timeout_jiffies = 0; + s64 timeout_jiffies; - if (timeout_msecs) { + if (timeout_msecs > 0) { #if HZ > 1000 /* We can only overflow if HZ > 1000 */ if (timeout_msecs / 1000 > (s64)0x7fffffffffffffffULL / (s64)HZ) @@ -739,6 +756,9 @@ asmlinkage long sys_poll(struct pollfd __user *ufds, unsigned int nfds, else #endif timeout_jiffies = msecs_to_jiffies(timeout_msecs); + } else { + /* Infinite (< 0) or no (0) timeout */ + timeout_jiffies = timeout_msecs; } return do_sys_poll(ufds, nfds, &timeout_jiffies); diff --git a/fs/smbfs/file.c b/fs/smbfs/file.c index ed9a24d19..dae67048b 100644 --- a/fs/smbfs/file.c +++ b/fs/smbfs/file.c @@ -306,7 +306,7 @@ static int smb_commit_write(struct file *file, struct page *page, return status; } -struct address_space_operations smb_file_aops = { +const struct address_space_operations smb_file_aops = { .readpage = smb_readpage, .writepage = smb_writepage, .prepare_write = smb_prepare_write, diff --git a/fs/smbfs/inode.c b/fs/smbfs/inode.c index fdeabc0a3..3c5c3d852 100644 --- a/fs/smbfs/inode.c +++ b/fs/smbfs/inode.c @@ -7,7 +7,6 @@ * Please add a note about your changes to smbfs in the ChangeLog file. */ -#include #include #include #include @@ -48,7 +47,7 @@ static void smb_delete_inode(struct inode *); static void smb_put_super(struct super_block *); -static int smb_statfs(struct super_block *, struct kstatfs *); +static int smb_statfs(struct dentry *, struct kstatfs *); static int smb_show_options(struct seq_file *, struct vfsmount *); static kmem_cache_t *smb_inode_cachep; @@ -168,7 +167,6 @@ smb_get_inode_attr(struct inode *inode, struct smb_fattr *fattr) fattr->f_mtime = inode->i_mtime; fattr->f_ctime = inode->i_ctime; fattr->f_atime = inode->i_atime; - fattr->f_blksize= inode->i_blksize; fattr->f_blocks = inode->i_blocks; fattr->attr = SMB_I(inode)->attr; @@ -202,7 +200,6 @@ smb_set_inode_attr(struct inode *inode, struct smb_fattr *fattr) inode->i_uid = fattr->f_uid; inode->i_gid = fattr->f_gid; inode->i_ctime = fattr->f_ctime; - inode->i_blksize= fattr->f_blksize; inode->i_blocks = fattr->f_blocks; inode->i_size = fattr->f_size; inode->i_mtime = fattr->f_mtime; @@ -641,13 +638,13 @@ out_no_server: } static int -smb_statfs(struct super_block *sb, struct kstatfs *buf) +smb_statfs(struct dentry *dentry, struct kstatfs *buf) { int result; lock_kernel(); - result = smb_proc_dskattr(sb, buf); + result = smb_proc_dskattr(dentry, buf); unlock_kernel(); @@ -782,10 +779,10 @@ out: return error; } -static struct super_block *smb_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int smb_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_nodev(fs_type, flags, data, smb_fill_super); + return get_sb_nodev(fs_type, flags, data, smb_fill_super, mnt); } static struct file_system_type smb_fs_type = { diff --git a/fs/smbfs/proc.c b/fs/smbfs/proc.c index b1b878b81..40e174db9 100644 --- a/fs/smbfs/proc.c +++ b/fs/smbfs/proc.c @@ -1826,7 +1826,6 @@ smb_init_dirent(struct smb_sb_info *server, struct smb_fattr *fattr) fattr->f_nlink = 1; fattr->f_uid = server->mnt->uid; fattr->f_gid = server->mnt->gid; - fattr->f_blksize = SMB_ST_BLKSIZE; fattr->f_unix = 0; } @@ -3226,9 +3225,9 @@ smb_proc_settime(struct dentry *dentry, struct smb_fattr *fattr) } int -smb_proc_dskattr(struct super_block *sb, struct kstatfs *attr) +smb_proc_dskattr(struct dentry *dentry, struct kstatfs *attr) { - struct smb_sb_info *server = SMB_SB(sb); + struct smb_sb_info *server = SMB_SB(dentry->d_sb); int result; char *p; long unit; diff --git a/fs/smbfs/proto.h b/fs/smbfs/proto.h index 47664597e..34fb462b2 100644 --- a/fs/smbfs/proto.h +++ b/fs/smbfs/proto.h @@ -29,7 +29,7 @@ extern int smb_proc_getattr(struct dentry *dir, struct smb_fattr *fattr); extern int smb_proc_setattr(struct dentry *dir, struct smb_fattr *fattr); extern int smb_proc_setattr_unix(struct dentry *d, struct iattr *attr, unsigned int major, unsigned int minor); extern int smb_proc_settime(struct dentry *dentry, struct smb_fattr *fattr); -extern int smb_proc_dskattr(struct super_block *sb, struct kstatfs *attr); +extern int smb_proc_dskattr(struct dentry *dentry, struct kstatfs *attr); extern int smb_proc_read_link(struct smb_sb_info *server, struct dentry *d, char *buffer, int len); extern int smb_proc_symlink(struct smb_sb_info *server, struct dentry *d, const char *oldpath); extern int smb_proc_link(struct smb_sb_info *server, struct dentry *dentry, struct dentry *new_dentry); @@ -63,7 +63,7 @@ extern int smb_revalidate_inode(struct dentry *dentry); extern int smb_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat); extern int smb_notify_change(struct dentry *dentry, struct iattr *attr); /* file.c */ -extern struct address_space_operations smb_file_aops; +extern const struct address_space_operations smb_file_aops; extern const struct file_operations smb_file_operations; extern struct inode_operations smb_file_inode_operations; /* ioctl.c */ diff --git a/fs/smbfs/request.c b/fs/smbfs/request.c index c71dd2760..c8e96195b 100644 --- a/fs/smbfs/request.c +++ b/fs/smbfs/request.c @@ -400,8 +400,7 @@ static int smb_request_send_req(struct smb_request *req) if (!(req->rq_flags & SMB_REQ_TRANSMITTED)) goto out; - list_del_init(&req->rq_queue); - list_add_tail(&req->rq_queue, &server->recvq); + list_move_tail(&req->rq_queue, &server->recvq); result = 1; out: return result; @@ -435,8 +434,7 @@ int smb_request_send_server(struct smb_sb_info *server) result = smb_request_send_req(req); if (result < 0) { server->conn_error = result; - list_del_init(&req->rq_queue); - list_add(&req->rq_queue, &server->xmitq); + list_move(&req->rq_queue, &server->xmitq); result = -EIO; goto out; } diff --git a/fs/smbfs/smbiod.c b/fs/smbfs/smbiod.c index 481a97a42..e67540441 100644 --- a/fs/smbfs/smbiod.c +++ b/fs/smbfs/smbiod.c @@ -5,7 +5,6 @@ * Copyright (C) 2001, Urban Widmark */ -#include #include #include @@ -20,6 +19,7 @@ #include #include #include +#include #include #include @@ -40,7 +40,7 @@ enum smbiod_state { }; static enum smbiod_state smbiod_state = SMBIOD_DEAD; -static pid_t smbiod_pid; +static struct task_struct *smbiod_thread; static DECLARE_WAIT_QUEUE_HEAD(smbiod_wait); static LIST_HEAD(smb_servers); static DEFINE_SPINLOCK(servers_lock); @@ -67,20 +67,29 @@ void smbiod_wake_up(void) */ static int smbiod_start(void) { - pid_t pid; + struct task_struct *tsk; + int err = 0; + if (smbiod_state != SMBIOD_DEAD) return 0; smbiod_state = SMBIOD_STARTING; __module_get(THIS_MODULE); spin_unlock(&servers_lock); - pid = kernel_thread(smbiod, NULL, 0); - if (pid < 0) + tsk = kthread_run(smbiod, NULL, "smbiod"); + if (IS_ERR(tsk)) { + err = PTR_ERR(tsk); module_put(THIS_MODULE); + } spin_lock(&servers_lock); - smbiod_state = pid < 0 ? SMBIOD_DEAD : SMBIOD_RUNNING; - smbiod_pid = pid; - return pid; + if (err < 0) { + smbiod_state = SMBIOD_DEAD; + smbiod_thread = NULL; + } else { + smbiod_state = SMBIOD_RUNNING; + smbiod_thread = tsk; + } + return err; } /* @@ -183,8 +192,7 @@ int smbiod_retry(struct smb_sb_info *server) if (req->rq_flags & SMB_REQ_RETRY) { /* must move the request to the xmitq */ VERBOSE("retrying request %p on recvq\n", req); - list_del(&req->rq_queue); - list_add(&req->rq_queue, &server->xmitq); + list_move(&req->rq_queue, &server->xmitq); continue; } #endif @@ -290,8 +298,6 @@ out: */ static int smbiod(void *unused) { - daemonize("smbiod"); - allow_signal(SIGKILL); VERBOSE("SMB Kernel thread starting (%d) ...\n", current->pid); diff --git a/fs/splice.c b/fs/splice.c index 8fef6672b..4eed2f6c8 100644 --- a/fs/splice.c +++ b/fs/splice.c @@ -55,31 +55,43 @@ static int page_cache_pipe_buf_steal(struct pipe_inode_info *pipe, struct pipe_buffer *buf) { struct page *page = buf->page; - struct address_space *mapping = page_mapping(page); + struct address_space *mapping; lock_page(page); - WARN_ON(!PageUptodate(page)); + mapping = page_mapping(page); + if (mapping) { + WARN_ON(!PageUptodate(page)); - /* - * At least for ext2 with nobh option, we need to wait on writeback - * completing on this page, since we'll remove it from the pagecache. - * Otherwise truncate wont wait on the page, allowing the disk - * blocks to be reused by someone else before we actually wrote our - * data to them. fs corruption ensues. - */ - wait_on_page_writeback(page); + /* + * At least for ext2 with nobh option, we need to wait on + * writeback completing on this page, since we'll remove it + * from the pagecache. Otherwise truncate wont wait on the + * page, allowing the disk blocks to be reused by someone else + * before we actually wrote our data to them. fs corruption + * ensues. + */ + wait_on_page_writeback(page); - if (PagePrivate(page)) - try_to_release_page(page, mapping_gfp_mask(mapping)); + if (PagePrivate(page)) + try_to_release_page(page, mapping_gfp_mask(mapping)); - if (!remove_mapping(mapping, page)) { - unlock_page(page); - return 1; + /* + * If we succeeded in removing the mapping, set LRU flag + * and return good. + */ + if (remove_mapping(mapping, page)) { + buf->flags |= PIPE_BUF_FLAG_LRU; + return 0; + } } - buf->flags |= PIPE_BUF_FLAG_LRU; - return 0; + /* + * Raced with truncate or failed to remove page from current + * address space, unlock and return failure. + */ + unlock_page(page); + return 1; } static void page_cache_pipe_buf_release(struct pipe_inode_info *pipe, @@ -595,7 +607,7 @@ find_page: ret = -ENOMEM; page = page_cache_alloc_cold(mapping); if (unlikely(!page)) - goto out_nomem; + goto out_ret; /* * This will also lock the page @@ -654,7 +666,7 @@ find_page: if (sd->pos + this_len > isize) vmtruncate(mapping->host, isize); - goto out; + goto out_ret; } if (buf->page != page) { @@ -686,7 +698,7 @@ find_page: out: page_cache_release(page); unlock_page(page); -out_nomem: +out_ret: return ret; } @@ -1389,11 +1401,11 @@ static int link_pipe(struct pipe_inode_info *ipipe, * could deadlock (one doing tee from A -> B, the other from B -> A). */ if (ipipe->inode < opipe->inode) { - mutex_lock(&ipipe->inode->i_mutex); - mutex_lock(&opipe->inode->i_mutex); + mutex_lock_nested(&ipipe->inode->i_mutex, I_MUTEX_PARENT); + mutex_lock_nested(&opipe->inode->i_mutex, I_MUTEX_CHILD); } else { - mutex_lock(&opipe->inode->i_mutex); - mutex_lock(&ipipe->inode->i_mutex); + mutex_lock_nested(&opipe->inode->i_mutex, I_MUTEX_PARENT); + mutex_lock_nested(&ipipe->inode->i_mutex, I_MUTEX_CHILD); } do { diff --git a/fs/squashfs/Makefile b/fs/squashfs/Makefile index 842001b2b..1bc7b0609 100644 --- a/fs/squashfs/Makefile +++ b/fs/squashfs/Makefile @@ -3,5 +3,5 @@ # obj-$(CONFIG_SQUASHFS) += squashfs.o - -squashfs-objs := inode.o +squashfs-y += inode.o +squashfs-y += squashfs2_0.o diff --git a/fs/squashfs/inode.c b/fs/squashfs/inode.c index f8b806d91..2348368d5 100644 --- a/fs/squashfs/inode.c +++ b/fs/squashfs/inode.c @@ -1,7 +1,8 @@ /* * Squashfs - a compressed read only filesystem for Linux * - * Copyright (c) 2002, 2003, 2004, 2005 Phillip Lougher + * Copyright (c) 2002, 2003, 2004, 2005, 2006 + * Phillip Lougher * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -20,13 +21,12 @@ * inode.c */ -#define SQUASHFS_1_0_COMPATIBILITY - #include #include #include #include #include +#include #include #include #include @@ -36,56 +36,32 @@ #include #include #include -#include #include -#include -#include #include #include +#include +#include -#ifdef SQUASHFS_TRACE -#define TRACE(s, args...) printk(KERN_NOTICE "SQUASHFS: "s, ## args) -#else -#define TRACE(s, args...) {} -#endif - -#define ERROR(s, args...) printk(KERN_ERR "SQUASHFS error: "s, ## args) - -#define SERROR(s, args...) if(!silent) printk(KERN_ERR "SQUASHFS error: "s, ## args) -#define WARNING(s, args...) printk(KERN_WARNING "SQUASHFS: "s, ## args) +#include "squashfs.h" static void squashfs_put_super(struct super_block *); -static int squashfs_statfs(struct super_block *, struct kstatfs *); +static int squashfs_statfs(struct dentry *, struct kstatfs *); static int squashfs_symlink_readpage(struct file *file, struct page *page); static int squashfs_readpage(struct file *file, struct page *page); static int squashfs_readpage4K(struct file *file, struct page *page); static int squashfs_readdir(struct file *, void *, filldir_t); -static struct dentry *squashfs_lookup(struct inode *, struct dentry *, struct nameidata *); -static unsigned int read_data(struct super_block *s, char *buffer, - unsigned int index, unsigned int length, unsigned int *next_index); -static int squashfs_get_cached_block(struct super_block *s, char *buffer, - unsigned int block, unsigned int offset, int length, - unsigned int *next_block, unsigned int *next_offset); -static struct inode *squashfs_iget(struct super_block *s, squashfs_inode inode); -static unsigned int read_blocklist(struct inode *inode, int index, int readahead_blks, - char *block_list, unsigned short **block_p, unsigned int *bsize); -static void squashfs_put_super(struct super_block *s); -static struct super_block *squashfs_get_sb(struct file_system_type *, int, const char *, void *); static struct inode *squashfs_alloc_inode(struct super_block *sb); static void squashfs_destroy_inode(struct inode *inode); static int init_inodecache(void); static void destroy_inodecache(void); - -#ifdef SQUASHFS_1_0_COMPATIBILITY -static int squashfs_readpage_lessthan4K(struct file *file, struct page *page); -static struct inode *squashfs_iget_1(struct super_block *s, squashfs_inode inode); -static unsigned int read_blocklist_1(struct inode *inode, int index, int readahead_blks, - char *block_list, unsigned short **block_p, unsigned int *bsize); -#endif - -DECLARE_MUTEX(read_data_mutex); - -static z_stream stream; +static struct dentry *squashfs_lookup(struct inode *, struct dentry *, + struct nameidata *); +static struct inode *squashfs_iget(struct super_block *s, squashfs_inode_t inode); +static long long read_blocklist(struct inode *inode, int index, + int readahead_blks, char *block_list, + unsigned short **block_p, unsigned int *bsize); +static int squashfs_get_sb(struct file_system_type *, int, + const char *, void *, struct vfsmount *); static struct file_system_type squashfs_fs_type = { .owner = THIS_MODULE, @@ -93,7 +69,7 @@ static struct file_system_type squashfs_fs_type = { .get_sb = squashfs_get_sb, .kill_sb = kill_block_super, .fs_flags = FS_REQUIRES_DEV - }; +}; static unsigned char squashfs_filetype_table[] = { DT_UNKNOWN, DT_DIR, DT_REG, DT_LNK, DT_BLK, DT_CHR, DT_FIFO, DT_SOCK @@ -106,44 +82,32 @@ static struct super_operations squashfs_ops = { .put_super = squashfs_put_super, }; -static struct address_space_operations squashfs_symlink_aops = { +SQSH_EXTERN struct address_space_operations squashfs_symlink_aops = { .readpage = squashfs_symlink_readpage }; -static struct address_space_operations squashfs_aops = { +SQSH_EXTERN struct address_space_operations squashfs_aops = { .readpage = squashfs_readpage }; -static struct address_space_operations squashfs_aops_4K = { +SQSH_EXTERN struct address_space_operations squashfs_aops_4K = { .readpage = squashfs_readpage4K }; -#ifdef SQUASHFS_1_0_COMPATIBILITY -static struct address_space_operations squashfs_aops_lessthan4K = { - .readpage = squashfs_readpage_lessthan4K -}; -#endif - static struct file_operations squashfs_dir_ops = { .read = generic_read_dir, .readdir = squashfs_readdir }; -static struct inode_operations squashfs_dir_inode_ops = { +SQSH_EXTERN struct inode_operations squashfs_dir_inode_ops = { .lookup = squashfs_lookup }; -static inline struct squashfs_inode_info *SQUASHFS_I(struct inode *inode) -{ - return list_entry(inode, struct squashfs_inode_info, vfs_inode); -} - - static struct buffer_head *get_block_length(struct super_block *s, int *cur_index, int *offset, int *c_byte) { - squashfs_sb_info *msblk = s->s_fs_info; + struct squashfs_sb_info *msblk = s->s_fs_info; unsigned short temp; struct buffer_head *bh; @@ -184,7 +148,7 @@ static struct buffer_head *get_block_length(struct super_block *s, *offset += 2; } - if (SQUASHFS_CHECK_DATA(msblk->sBlk.flags)) { + if (SQUASHFS_CHECK_DATA(msblk->sblk.flags)) { if (*offset == msblk->devblksize) { brelse(bh); if (!(bh = sb_bread(s, ++(*cur_index)))) @@ -207,58 +171,66 @@ out: } -static unsigned int read_data(struct super_block *s, char *buffer, - unsigned int index, unsigned int length, unsigned int *next_index) +SQSH_EXTERN unsigned int squashfs_read_data(struct super_block *s, char *buffer, + long long index, unsigned int length, + long long *next_index) { - squashfs_sb_info *msBlk = (squashfs_sb_info *)s->s_fs_info; - struct buffer_head *bh[((SQUASHFS_FILE_MAX_SIZE - 1) >> msBlk->devblksize_log2) + 2]; - unsigned int offset = index & ((1 << msBlk->devblksize_log2) - 1); - unsigned int cur_index = index >> msBlk->devblksize_log2; + struct squashfs_sb_info *msblk = s->s_fs_info; + struct buffer_head *bh[((SQUASHFS_FILE_MAX_SIZE - 1) >> + msblk->devblksize_log2) + 2]; + unsigned int offset = index & ((1 << msblk->devblksize_log2) - 1); + unsigned int cur_index = index >> msblk->devblksize_log2; int bytes, avail_bytes, b = 0, k; char *c_buffer; unsigned int compressed; unsigned int c_byte = length; - if(c_byte) { - bytes = msBlk->devblksize - offset; + if (c_byte) { + bytes = msblk->devblksize - offset; compressed = SQUASHFS_COMPRESSED_BLOCK(c_byte); - c_buffer = compressed ? msBlk->read_data : buffer; + c_buffer = compressed ? msblk->read_data : buffer; c_byte = SQUASHFS_COMPRESSED_SIZE_BLOCK(c_byte); - TRACE("Block @ 0x%x, %scompressed size %d\n", index, compressed ? "" : "un", (unsigned int) c_byte); + TRACE("Block @ 0x%llx, %scompressed size %d\n", index, compressed + ? "" : "un", (unsigned int) c_byte); - if(!(bh[0] = sb_getblk(s, cur_index))) + if (!(bh[0] = sb_getblk(s, cur_index))) goto block_release; - for(b = 1; bytes < c_byte; b++) { - if(!(bh[b] = sb_getblk(s, ++cur_index))) + + for (b = 1; bytes < c_byte; b++) { + if (!(bh[b] = sb_getblk(s, ++cur_index))) goto block_release; - bytes += msBlk->devblksize; + bytes += msblk->devblksize; } ll_rw_block(READ, b, bh); } else { - if(!(bh[0] = get_block_length(s, &cur_index, &offset, &c_byte))) + if (!(bh[0] = get_block_length(s, &cur_index, &offset, + &c_byte))) goto read_failure; - bytes = msBlk->devblksize - offset; + bytes = msblk->devblksize - offset; compressed = SQUASHFS_COMPRESSED(c_byte); - c_buffer = compressed ? msBlk->read_data : buffer; + c_buffer = compressed ? msblk->read_data : buffer; c_byte = SQUASHFS_COMPRESSED_SIZE(c_byte); - TRACE("Block @ 0x%x, %scompressed size %d\n", index, compressed ? "" : "un", (unsigned int) c_byte); + TRACE("Block @ 0x%llx, %scompressed size %d\n", index, compressed + ? "" : "un", (unsigned int) c_byte); - for(b = 1; bytes < c_byte; b++) { - if(!(bh[b] = sb_getblk(s, ++cur_index))) + for (b = 1; bytes < c_byte; b++) { + if (!(bh[b] = sb_getblk(s, ++cur_index))) goto block_release; - bytes += msBlk->devblksize; + bytes += msblk->devblksize; } ll_rw_block(READ, b - 1, bh + 1); } - if(compressed) - down(&read_data_mutex); + if (compressed) + down(&msblk->read_data_mutex); - for(bytes = 0, k = 0; k < b; k++) { - avail_bytes = (c_byte - bytes) > (msBlk->devblksize - offset) ? msBlk->devblksize - offset : c_byte - bytes; + for (bytes = 0, k = 0; k < b; k++) { + avail_bytes = (c_byte - bytes) > (msblk->devblksize - offset) ? + msblk->devblksize - offset : + c_byte - bytes; wait_on_buffer(bh[k]); if (!buffer_uptodate(bh[k])) goto block_release; @@ -271,30 +243,36 @@ static unsigned int read_data(struct super_block *s, char *buffer, /* * uncompress block */ - if(compressed) { + if (compressed) { int zlib_err; - stream.next_in = c_buffer; - stream.avail_in = c_byte; - stream.next_out = buffer; - stream.avail_out = msBlk->read_size; - if(((zlib_err = zlib_inflateInit(&stream)) != Z_OK) || - ((zlib_err = zlib_inflate(&stream, Z_FINISH)) != Z_STREAM_END) || - ((zlib_err = zlib_inflateEnd(&stream)) != Z_OK)) { - ERROR("zlib_fs returned unexpected result 0x%x\n", zlib_err); + msblk->stream.next_in = c_buffer; + msblk->stream.avail_in = c_byte; + msblk->stream.next_out = buffer; + msblk->stream.avail_out = msblk->read_size; + + if (((zlib_err = zlib_inflateInit(&msblk->stream)) != Z_OK) || + ((zlib_err = zlib_inflate(&msblk->stream, Z_FINISH)) + != Z_STREAM_END) || ((zlib_err = + zlib_inflateEnd(&msblk->stream)) != Z_OK)) { + ERROR("zlib_fs returned unexpected result 0x%x\n", + zlib_err); bytes = 0; } else - bytes = stream.total_out; - up(&read_data_mutex); + bytes = msblk->stream.total_out; + + up(&msblk->read_data_mutex); } - if(next_index) - *next_index = index + c_byte + (length ? 0 : (SQUASHFS_CHECK_DATA(msBlk->sBlk.flags) ? 3 : 2)); - + if (next_index) + *next_index = index + c_byte + (length ? 0 : + (SQUASHFS_CHECK_DATA(msblk->sblk.flags) + ? 3 : 2)); return bytes; block_release: - while(--b >= 0) brelse(bh[b]); + while (--b >= 0) + brelse(bh[b]); read_failure: ERROR("sb_bread failed reading block 0x%x\n", cur_index); @@ -302,820 +280,889 @@ read_failure: } -static int squashfs_get_cached_block(struct super_block *s, char *buffer, - unsigned int block, unsigned int offset, int length, - unsigned int *next_block, unsigned int *next_offset) +SQSH_EXTERN int squashfs_get_cached_block(struct super_block *s, char *buffer, + long long block, unsigned int offset, + int length, long long *next_block, + unsigned int *next_offset) { - squashfs_sb_info *msBlk = (squashfs_sb_info *)s->s_fs_info; + struct squashfs_sb_info *msblk = s->s_fs_info; int n, i, bytes, return_length = length; - unsigned int next_index; + long long next_index; - TRACE("Entered squashfs_get_cached_block [%x:%x]\n", block, offset); + TRACE("Entered squashfs_get_cached_block [%llx:%x]\n", block, offset); - for(;;) { - for(i = 0; i < SQUASHFS_CACHED_BLKS; i++) - if(msBlk->block_cache[i].block == block) + while ( 1 ) { + for (i = 0; i < SQUASHFS_CACHED_BLKS; i++) + if (msblk->block_cache[i].block == block) break; - down(&msBlk->block_cache_mutex); - if(i == SQUASHFS_CACHED_BLKS) { + down(&msblk->block_cache_mutex); + + if (i == SQUASHFS_CACHED_BLKS) { /* read inode header block */ - for(i = msBlk->next_cache, n = SQUASHFS_CACHED_BLKS; n ; n --, i = (i + 1) % SQUASHFS_CACHED_BLKS) - if(msBlk->block_cache[i].block != SQUASHFS_USED_BLK) + for (i = msblk->next_cache, n = SQUASHFS_CACHED_BLKS; + n ; n --, i = (i + 1) % + SQUASHFS_CACHED_BLKS) + if (msblk->block_cache[i].block != + SQUASHFS_USED_BLK) break; - if(n == 0) { + + if (n == 0) { wait_queue_t wait; init_waitqueue_entry(&wait, current); - add_wait_queue(&msBlk->waitq, &wait); - up(&msBlk->block_cache_mutex); + add_wait_queue(&msblk->waitq, &wait); set_current_state(TASK_UNINTERRUPTIBLE); + up(&msblk->block_cache_mutex); schedule(); set_current_state(TASK_RUNNING); - remove_wait_queue(&msBlk->waitq, &wait); + remove_wait_queue(&msblk->waitq, &wait); continue; } - msBlk->next_cache = (i + 1) % SQUASHFS_CACHED_BLKS; - - if(msBlk->block_cache[i].block == SQUASHFS_INVALID_BLK) { - if(!(msBlk->block_cache[i].data = (unsigned char *) - kmalloc(SQUASHFS_METADATA_SIZE, GFP_KERNEL))) { - ERROR("Failed to allocate cache block\n"); - up(&msBlk->block_cache_mutex); - return 0; + msblk->next_cache = (i + 1) % SQUASHFS_CACHED_BLKS; + + if (msblk->block_cache[i].block == + SQUASHFS_INVALID_BLK) { + if (!(msblk->block_cache[i].data = + kmalloc(SQUASHFS_METADATA_SIZE, + GFP_KERNEL))) { + ERROR("Failed to allocate cache" + "block\n"); + up(&msblk->block_cache_mutex); + goto out; } } - msBlk->block_cache[i].block = SQUASHFS_USED_BLK; - up(&msBlk->block_cache_mutex); - if(!(msBlk->block_cache[i].length = read_data(s, msBlk->block_cache[i].data, block, 0, - &next_index))) { - ERROR("Unable to read cache block [%x:%x]\n", block, offset); - return 0; + msblk->block_cache[i].block = SQUASHFS_USED_BLK; + up(&msblk->block_cache_mutex); + + if (!(msblk->block_cache[i].length = + squashfs_read_data(s, + msblk->block_cache[i].data, + block, 0, &next_index))) { + ERROR("Unable to read cache block [%llx:%x]\n", + block, offset); + goto out; } - down(&msBlk->block_cache_mutex); - wake_up(&msBlk->waitq); - msBlk->block_cache[i].block = block; - msBlk->block_cache[i].next_index = next_index; - TRACE("Read cache block [%x:%x]\n", block, offset); + + down(&msblk->block_cache_mutex); + wake_up(&msblk->waitq); + msblk->block_cache[i].block = block; + msblk->block_cache[i].next_index = next_index; + TRACE("Read cache block [%llx:%x]\n", block, offset); } - if(msBlk->block_cache[i].block != block) { - up(&msBlk->block_cache_mutex); + if (msblk->block_cache[i].block != block) { + up(&msblk->block_cache_mutex); continue; } - if((bytes = msBlk->block_cache[i].length - offset) >= length) { - if(buffer) - memcpy(buffer, msBlk->block_cache[i].data + offset, length); - if(msBlk->block_cache[i].length - offset == length) { - *next_block = msBlk->block_cache[i].next_index; + if ((bytes = msblk->block_cache[i].length - offset) >= length) { + if (buffer) + memcpy(buffer, msblk->block_cache[i].data + + offset, length); + if (msblk->block_cache[i].length - offset == length) { + *next_block = msblk->block_cache[i].next_index; *next_offset = 0; } else { *next_block = block; *next_offset = offset + length; } - - up(&msBlk->block_cache_mutex); - return return_length; + up(&msblk->block_cache_mutex); + goto finish; } else { - if(buffer) { - memcpy(buffer, msBlk->block_cache[i].data + offset, bytes); + if (buffer) { + memcpy(buffer, msblk->block_cache[i].data + + offset, bytes); buffer += bytes; } - block = msBlk->block_cache[i].next_index; - up(&msBlk->block_cache_mutex); + block = msblk->block_cache[i].next_index; + up(&msblk->block_cache_mutex); length -= bytes; offset = 0; } } + +finish: + return return_length; +out: + return 0; } -static int get_fragment_location(struct super_block *s, unsigned int fragment, unsigned int *fragment_start_block, unsigned int *fragment_size) +static int get_fragment_location(struct super_block *s, unsigned int fragment, + long long *fragment_start_block, + unsigned int *fragment_size) { - squashfs_sb_info *msBlk = (squashfs_sb_info *)s->s_fs_info; - unsigned int start_block = msBlk->fragment_index[SQUASHFS_FRAGMENT_INDEX(fragment)]; + struct squashfs_sb_info *msblk = s->s_fs_info; + long long start_block = + msblk->fragment_index[SQUASHFS_FRAGMENT_INDEX(fragment)]; int offset = SQUASHFS_FRAGMENT_INDEX_OFFSET(fragment); - squashfs_fragment_entry fragment_entry; + struct squashfs_fragment_entry fragment_entry; - if(msBlk->swap) { - squashfs_fragment_entry sfragment_entry; + if (msblk->swap) { + struct squashfs_fragment_entry sfragment_entry; - if(!squashfs_get_cached_block(s, (char *) &sfragment_entry, start_block, offset, - sizeof(sfragment_entry), &start_block, &offset)) - return 0; + if (!squashfs_get_cached_block(s, (char *) &sfragment_entry, + start_block, offset, + sizeof(sfragment_entry), &start_block, + &offset)) + goto out; SQUASHFS_SWAP_FRAGMENT_ENTRY(&fragment_entry, &sfragment_entry); } else - if(!squashfs_get_cached_block(s, (char *) &fragment_entry, start_block, offset, - sizeof(fragment_entry), &start_block, &offset)) - return 0; + if (!squashfs_get_cached_block(s, (char *) &fragment_entry, + start_block, offset, + sizeof(fragment_entry), &start_block, + &offset)) + goto out; *fragment_start_block = fragment_entry.start_block; *fragment_size = fragment_entry.size; return 1; + +out: + return 0; } -void release_cached_fragment(squashfs_sb_info *msBlk, struct squashfs_fragment_cache *fragment) +SQSH_EXTERN void release_cached_fragment(struct squashfs_sb_info *msblk, struct + squashfs_fragment_cache *fragment) { - down(&msBlk->fragment_mutex); + down(&msblk->fragment_mutex); fragment->locked --; - wake_up(&msBlk->fragment_wait_queue); - up(&msBlk->fragment_mutex); + wake_up(&msblk->fragment_wait_queue); + up(&msblk->fragment_mutex); } -struct squashfs_fragment_cache *get_cached_fragment(struct super_block *s, unsigned int start_block, int length) +SQSH_EXTERN struct squashfs_fragment_cache *get_cached_fragment(struct super_block + *s, long long start_block, + int length) { int i, n; - squashfs_sb_info *msBlk = (squashfs_sb_info *)s->s_fs_info; + struct squashfs_sb_info *msblk = s->s_fs_info; + + while ( 1 ) { + down(&msblk->fragment_mutex); + + for (i = 0; i < SQUASHFS_CACHED_FRAGMENTS && + msblk->fragment[i].block != start_block; i++); - for(;;) { - down(&msBlk->fragment_mutex); - for(i = 0; i < SQUASHFS_CACHED_FRAGMENTS && msBlk->fragment[i].block != start_block; i++); - if(i == SQUASHFS_CACHED_FRAGMENTS) { - for(i = msBlk->next_fragment, n = SQUASHFS_CACHED_FRAGMENTS; - n && msBlk->fragment[i].locked; n--, i = (i + 1) % SQUASHFS_CACHED_FRAGMENTS); + if (i == SQUASHFS_CACHED_FRAGMENTS) { + for (i = msblk->next_fragment, n = + SQUASHFS_CACHED_FRAGMENTS; n && + msblk->fragment[i].locked; n--, i = (i + 1) % + SQUASHFS_CACHED_FRAGMENTS); - if(n == 0) { + if (n == 0) { wait_queue_t wait; init_waitqueue_entry(&wait, current); - add_wait_queue(&msBlk->fragment_wait_queue, &wait); - up(&msBlk->fragment_mutex); + add_wait_queue(&msblk->fragment_wait_queue, + &wait); set_current_state(TASK_UNINTERRUPTIBLE); + up(&msblk->fragment_mutex); schedule(); set_current_state(TASK_RUNNING); - remove_wait_queue(&msBlk->fragment_wait_queue, &wait); + remove_wait_queue(&msblk->fragment_wait_queue, + &wait); continue; } - msBlk->next_fragment = (msBlk->next_fragment + 1) % SQUASHFS_CACHED_FRAGMENTS; + msblk->next_fragment = (msblk->next_fragment + 1) % + SQUASHFS_CACHED_FRAGMENTS; - if(msBlk->fragment[i].data == NULL) - if(!(msBlk->fragment[i].data = (unsigned char *) - SQUASHFS_ALLOC(SQUASHFS_FILE_MAX_SIZE))) { - ERROR("Failed to allocate fragment cache block\n"); - up(&msBlk->fragment_mutex); - return NULL; + if (msblk->fragment[i].data == NULL) + if (!(msblk->fragment[i].data = SQUASHFS_ALLOC + (SQUASHFS_FILE_MAX_SIZE))) { + ERROR("Failed to allocate fragment " + "cache block\n"); + up(&msblk->fragment_mutex); + goto out; } - msBlk->fragment[i].block = SQUASHFS_INVALID_BLK; - msBlk->fragment[i].locked = 1; - up(&msBlk->fragment_mutex); - if(!(msBlk->fragment[i].length = read_data(s, msBlk->fragment[i].data, start_block, length, - NULL))) { - ERROR("Unable to read fragment cache block [%x]\n", start_block); - msBlk->fragment[i].locked = 0; - return NULL; - } - msBlk->fragment[i].block = start_block; - TRACE("New fragment %d, start block %d, locked %d\n", i, msBlk->fragment[i].block, msBlk->fragment[i].locked); - return &msBlk->fragment[i]; - } - - msBlk->fragment[i].locked ++; - up(&msBlk->fragment_mutex); - - TRACE("Got fragment %d, start block %d, locked %d\n", i, msBlk->fragment[i].block, msBlk->fragment[i].locked); - return &msBlk->fragment[i]; - } -} - - -#ifdef SQUASHFS_1_0_COMPATIBILITY -static struct inode *squashfs_iget_1(struct super_block *s, squashfs_inode inode) -{ - struct inode *i = new_inode(s); - squashfs_sb_info *msBlk = (squashfs_sb_info *)s->s_fs_info; - squashfs_super_block *sBlk = &msBlk->sBlk; - unsigned int block = SQUASHFS_INODE_BLK(inode) + sBlk->inode_table_start; - unsigned int offset = SQUASHFS_INODE_OFFSET(inode); - unsigned int next_block, next_offset; - squashfs_base_inode_header_1 inodeb; - - TRACE("Entered squashfs_iget_1\n"); + msblk->fragment[i].block = SQUASHFS_INVALID_BLK; + msblk->fragment[i].locked = 1; + up(&msblk->fragment_mutex); - if(msBlk->swap) { - squashfs_base_inode_header_1 sinodeb; - - if(!squashfs_get_cached_block(s, (char *) &sinodeb, block, offset, - sizeof(sinodeb), &next_block, &next_offset)) - goto failed_read; - SQUASHFS_SWAP_BASE_INODE_HEADER_1(&inodeb, &sinodeb, sizeof(sinodeb)); - } else - if(!squashfs_get_cached_block(s, (char *) &inodeb, block, offset, - sizeof(inodeb), &next_block, &next_offset)) - goto failed_read; - - i->i_nlink = 1; - - i->i_mtime.tv_sec = sBlk->mkfs_time; - i->i_atime.tv_sec = sBlk->mkfs_time; - i->i_ctime.tv_sec = sBlk->mkfs_time; - - if(inodeb.inode_type != SQUASHFS_IPC_TYPE) - i->i_uid = msBlk->uid[((inodeb.inode_type - 1) / SQUASHFS_TYPES) * 16 + inodeb.uid]; - i->i_ino = SQUASHFS_MK_VFS_INODE(block - sBlk->inode_table_start, offset); - - i->i_mode = inodeb.mode; - - switch(inodeb.inode_type == SQUASHFS_IPC_TYPE ? SQUASHFS_IPC_TYPE : (inodeb.inode_type - 1) % SQUASHFS_TYPES + 1) { - case SQUASHFS_FILE_TYPE: { - squashfs_reg_inode_header_1 inodep; - - if(msBlk->swap) { - squashfs_reg_inode_header_1 sinodep; - - if(!squashfs_get_cached_block(s, (char *) &sinodep, block, offset, sizeof(sinodep), - &next_block, &next_offset)) - goto failed_read; - SQUASHFS_SWAP_REG_INODE_HEADER_1(&inodep, &sinodep); - } else - if(!squashfs_get_cached_block(s, (char *) &inodep, block, offset, sizeof(inodep), - &next_block, &next_offset)) - goto failed_read; - - i->i_size = inodep.file_size; - i->i_fop = &generic_ro_fops; - if(sBlk->block_size > 4096) - i->i_data.a_ops = &squashfs_aops; - else if(sBlk->block_size == 4096) - i->i_data.a_ops = &squashfs_aops_4K; - else - i->i_data.a_ops = &squashfs_aops_lessthan4K; - i->i_mode |= S_IFREG; - i->i_mtime.tv_sec = inodep.mtime; - i->i_atime.tv_sec = inodep.mtime; - i->i_ctime.tv_sec = inodep.mtime; - i->i_blocks = ((i->i_size - 1) >> 9) + 1; - i->i_blksize = PAGE_CACHE_SIZE; - SQUASHFS_I(i)->u.s1.fragment_start_block = SQUASHFS_INVALID_BLK; - SQUASHFS_I(i)->u.s1.fragment_offset = 0; - SQUASHFS_I(i)->start_block = inodep.start_block; - SQUASHFS_I(i)->block_list_start = next_block; - SQUASHFS_I(i)->offset = next_offset; - TRACE("File inode %x:%x, start_block %x, block_list_start %x, offset %x\n", - SQUASHFS_INODE_BLK(inode), offset, inodep.start_block, next_block, next_offset); - break; - } - case SQUASHFS_DIR_TYPE: { - squashfs_dir_inode_header_1 inodep; - - if(msBlk->swap) { - squashfs_dir_inode_header_1 sinodep; - - if(!squashfs_get_cached_block(s, (char *) &sinodep, block, offset, sizeof(sinodep), - &next_block, &next_offset)) - goto failed_read; - SQUASHFS_SWAP_DIR_INODE_HEADER_1(&inodep, &sinodep); - } else - if(!squashfs_get_cached_block(s, (char *) &inodep, block, offset, sizeof(inodep), - &next_block, &next_offset)) - goto failed_read; + if (!(msblk->fragment[i].length = squashfs_read_data(s, + msblk->fragment[i].data, + start_block, length, NULL))) { + ERROR("Unable to read fragment cache block " + "[%llx]\n", start_block); + msblk->fragment[i].locked = 0; + goto out; + } - i->i_size = inodep.file_size; - i->i_op = &squashfs_dir_inode_ops; - i->i_fop = &squashfs_dir_ops; - i->i_mode |= S_IFDIR; - i->i_mtime.tv_sec = inodep.mtime; - i->i_atime.tv_sec = inodep.mtime; - i->i_ctime.tv_sec = inodep.mtime; - SQUASHFS_I(i)->start_block = inodep.start_block; - SQUASHFS_I(i)->offset = inodep.offset; - SQUASHFS_I(i)->u.s2.directory_index_count = 0; - TRACE("Directory inode %x:%x, start_block %x, offset %x\n", SQUASHFS_INODE_BLK(inode), offset, - inodep.start_block, inodep.offset); + msblk->fragment[i].block = start_block; + TRACE("New fragment %d, start block %lld, locked %d\n", + i, msblk->fragment[i].block, + msblk->fragment[i].locked); break; } - case SQUASHFS_SYMLINK_TYPE: { - squashfs_symlink_inode_header_1 inodep; - - if(msBlk->swap) { - squashfs_symlink_inode_header_1 sinodep; - - if(!squashfs_get_cached_block(s, (char *) &sinodep, block, offset, sizeof(sinodep), - &next_block, &next_offset)) - goto failed_read; - SQUASHFS_SWAP_SYMLINK_INODE_HEADER_1(&inodep, &sinodep); - } else - if(!squashfs_get_cached_block(s, (char *) &inodep, block, offset, sizeof(inodep), - &next_block, &next_offset)) - goto failed_read; - - i->i_size = inodep.symlink_size; - i->i_op = &page_symlink_inode_operations; - i->i_data.a_ops = &squashfs_symlink_aops; - i->i_mode |= S_IFLNK; - SQUASHFS_I(i)->start_block = next_block; - SQUASHFS_I(i)->offset = next_offset; - TRACE("Symbolic link inode %x:%x, start_block %x, offset %x\n", - SQUASHFS_INODE_BLK(inode), offset, next_block, next_offset); - break; - } - case SQUASHFS_BLKDEV_TYPE: - case SQUASHFS_CHRDEV_TYPE: { - squashfs_dev_inode_header_1 inodep; - if(msBlk->swap) { - squashfs_dev_inode_header_1 sinodep; + msblk->fragment[i].locked++; + up(&msblk->fragment_mutex); + TRACE("Got fragment %d, start block %lld, locked %d\n", i, + msblk->fragment[i].block, + msblk->fragment[i].locked); + break; + } - if(!squashfs_get_cached_block(s, (char *) &sinodep, block, offset, sizeof(sinodep), - &next_block, &next_offset)) - goto failed_read; - SQUASHFS_SWAP_DEV_INODE_HEADER_1(&inodep, &sinodep); - } else - if(!squashfs_get_cached_block(s, (char *) &inodep, block, offset, sizeof(inodep), - &next_block, &next_offset)) - goto failed_read; + return &msblk->fragment[i]; - i->i_size = 0; - i->i_mode |= (inodeb.inode_type == SQUASHFS_CHRDEV_TYPE) ? S_IFCHR : S_IFBLK; - init_special_inode(i, i->i_mode, old_decode_dev(inodep.rdev)); - TRACE("Device inode %x:%x, rdev %x\n", SQUASHFS_INODE_BLK(inode), offset, inodep.rdev); - break; - } - case SQUASHFS_IPC_TYPE: { - squashfs_ipc_inode_header_1 inodep; +out: + return NULL; +} - if(msBlk->swap) { - squashfs_ipc_inode_header_1 sinodep; - if(!squashfs_get_cached_block(s, (char *) &sinodep, block, offset, sizeof(sinodep), - &next_block, &next_offset)) - goto failed_read; - SQUASHFS_SWAP_IPC_INODE_HEADER_1(&inodep, &sinodep); - } else - if(!squashfs_get_cached_block(s, (char *) &inodep, block, offset, sizeof(inodep), - &next_block, &next_offset)) - goto failed_read; +static struct inode *squashfs_new_inode(struct super_block *s, + struct squashfs_base_inode_header *inodeb) +{ + struct squashfs_sb_info *msblk = s->s_fs_info; + struct inode *i = new_inode(s); - i->i_size = 0; - i->i_mode |= (inodep.type == SQUASHFS_FIFO_TYPE) ? S_IFIFO : S_IFSOCK; - i->i_uid = msBlk->uid[inodep.offset * 16 + inodeb.uid]; - init_special_inode(i, i->i_mode, 0); - break; - } - default: - ERROR("Unknown inode type %d in squashfs_iget!\n", inodeb.inode_type); - goto failed_read1; + if (i) { + i->i_ino = inodeb->inode_number; + i->i_mtime.tv_sec = inodeb->mtime; + i->i_atime.tv_sec = inodeb->mtime; + i->i_ctime.tv_sec = inodeb->mtime; + i->i_uid = msblk->uid[inodeb->uid]; + i->i_mode = inodeb->mode; + i->i_size = 0; + if (inodeb->guid == SQUASHFS_GUIDS) + i->i_gid = i->i_uid; + else + i->i_gid = msblk->guid[inodeb->guid]; } - - if(inodeb.guid == 15) - i->i_gid = i->i_uid; - else - i->i_gid = msBlk->guid[inodeb.guid]; - insert_inode_hash(i); return i; - -failed_read: - ERROR("Unable to read inode [%x:%x]\n", block, offset); - -failed_read1: - return NULL; } -#endif -static struct inode *squashfs_iget(struct super_block *s, squashfs_inode inode) +static struct inode *squashfs_iget(struct super_block *s, squashfs_inode_t inode) { - struct inode *i = new_inode(s); - squashfs_sb_info *msBlk = (squashfs_sb_info *)s->s_fs_info; - squashfs_super_block *sBlk = &msBlk->sBlk; - unsigned int block = SQUASHFS_INODE_BLK(inode) + sBlk->inode_table_start; + struct inode *i; + struct squashfs_sb_info *msblk = s->s_fs_info; + struct squashfs_super_block *sblk = &msblk->sblk; + long long block = SQUASHFS_INODE_BLK(inode) + + sblk->inode_table_start; unsigned int offset = SQUASHFS_INODE_OFFSET(inode); - unsigned int next_block, next_offset; - squashfs_base_inode_header inodeb; + long long next_block; + unsigned int next_offset; + union squashfs_inode_header id, sid; + struct squashfs_base_inode_header *inodeb = &id.base, + *sinodeb = &sid.base; TRACE("Entered squashfs_iget\n"); - if(msBlk->swap) { - squashfs_base_inode_header sinodeb; - - if(!squashfs_get_cached_block(s, (char *) &sinodeb, block, offset, - sizeof(sinodeb), &next_block, &next_offset)) + if (msblk->swap) { + if (!squashfs_get_cached_block(s, (char *) sinodeb, block, + offset, sizeof(*sinodeb), &next_block, + &next_offset)) goto failed_read; - SQUASHFS_SWAP_BASE_INODE_HEADER(&inodeb, &sinodeb, sizeof(sinodeb)); + SQUASHFS_SWAP_BASE_INODE_HEADER(inodeb, sinodeb, + sizeof(*sinodeb)); } else - if(!squashfs_get_cached_block(s, (char *) &inodeb, block, offset, - sizeof(inodeb), &next_block, &next_offset)) + if (!squashfs_get_cached_block(s, (char *) inodeb, block, + offset, sizeof(*inodeb), &next_block, + &next_offset)) goto failed_read; - i->i_nlink = 1; - - i->i_mtime.tv_sec = sBlk->mkfs_time; - i->i_atime.tv_sec = sBlk->mkfs_time; - i->i_ctime.tv_sec = sBlk->mkfs_time; - - i->i_uid = msBlk->uid[inodeb.uid]; - i->i_ino = SQUASHFS_MK_VFS_INODE(block - sBlk->inode_table_start, offset); - - i->i_mode = inodeb.mode; - - switch(inodeb.inode_type) { + switch(inodeb->inode_type) { case SQUASHFS_FILE_TYPE: { - squashfs_reg_inode_header inodep; - - if(msBlk->swap) { - squashfs_reg_inode_header sinodep; - - if(!squashfs_get_cached_block(s, (char *) &sinodep, block, offset, sizeof(sinodep), - &next_block, &next_offset)) + unsigned int frag_size; + long long frag_blk; + struct squashfs_reg_inode_header *inodep = &id.reg; + struct squashfs_reg_inode_header *sinodep = &sid.reg; + + if (msblk->swap) { + if (!squashfs_get_cached_block(s, (char *) + sinodep, block, offset, + sizeof(*sinodep), &next_block, + &next_offset)) goto failed_read; - SQUASHFS_SWAP_REG_INODE_HEADER(&inodep, &sinodep); + SQUASHFS_SWAP_REG_INODE_HEADER(inodep, sinodep); } else - if(!squashfs_get_cached_block(s, (char *) &inodep, block, offset, sizeof(inodep), - &next_block, &next_offset)) + if (!squashfs_get_cached_block(s, (char *) + inodep, block, offset, + sizeof(*inodep), &next_block, + &next_offset)) goto failed_read; - SQUASHFS_I(i)->u.s1.fragment_start_block = SQUASHFS_INVALID_BLK; - if(inodep.fragment != SQUASHFS_INVALID_BLK && !get_fragment_location(s, inodep.fragment, - &SQUASHFS_I(i)->u.s1.fragment_start_block, &SQUASHFS_I(i)->u.s1.fragment_size)) + frag_blk = SQUASHFS_INVALID_BLK; + if (inodep->fragment != SQUASHFS_INVALID_FRAG && + !get_fragment_location(s, + inodep->fragment, &frag_blk, &frag_size)) goto failed_read; + + if((i = squashfs_new_inode(s, inodeb)) == NULL) + goto failed_read1; - SQUASHFS_I(i)->u.s1.fragment_offset = inodep.offset; - i->i_size = inodep.file_size; + i->i_nlink = 1; + i->i_size = inodep->file_size; i->i_fop = &generic_ro_fops; - if(sBlk->block_size > 4096) + i->i_mode |= S_IFREG; + i->i_blocks = ((i->i_size - 1) >> 9) + 1; + SQUASHFS_I(i)->u.s1.fragment_start_block = frag_blk; + SQUASHFS_I(i)->u.s1.fragment_size = frag_size; + SQUASHFS_I(i)->u.s1.fragment_offset = inodep->offset; + SQUASHFS_I(i)->start_block = inodep->start_block; + SQUASHFS_I(i)->u.s1.block_list_start = next_block; + SQUASHFS_I(i)->offset = next_offset; + if (sblk->block_size > 4096) i->i_data.a_ops = &squashfs_aops; else i->i_data.a_ops = &squashfs_aops_4K; + + TRACE("File inode %x:%x, start_block %llx, " + "block_list_start %llx, offset %x\n", + SQUASHFS_INODE_BLK(inode), offset, + inodep->start_block, next_block, + next_offset); + break; + } + case SQUASHFS_LREG_TYPE: { + unsigned int frag_size; + long long frag_blk; + struct squashfs_lreg_inode_header *inodep = &id.lreg; + struct squashfs_lreg_inode_header *sinodep = &sid.lreg; + + if (msblk->swap) { + if (!squashfs_get_cached_block(s, (char *) + sinodep, block, offset, + sizeof(*sinodep), &next_block, + &next_offset)) + goto failed_read; + SQUASHFS_SWAP_LREG_INODE_HEADER(inodep, sinodep); + } else + if (!squashfs_get_cached_block(s, (char *) + inodep, block, offset, + sizeof(*inodep), &next_block, + &next_offset)) + goto failed_read; + + frag_blk = SQUASHFS_INVALID_BLK; + if (inodep->fragment != SQUASHFS_INVALID_FRAG && + !get_fragment_location(s, + inodep->fragment, &frag_blk, &frag_size)) + goto failed_read; + + if((i = squashfs_new_inode(s, inodeb)) == NULL) + goto failed_read1; + + i->i_nlink = inodep->nlink; + i->i_size = inodep->file_size; + i->i_fop = &generic_ro_fops; i->i_mode |= S_IFREG; - i->i_mtime.tv_sec = inodep.mtime; - i->i_atime.tv_sec = inodep.mtime; - i->i_ctime.tv_sec = inodep.mtime; i->i_blocks = ((i->i_size - 1) >> 9) + 1; - i->i_blksize = PAGE_CACHE_SIZE; - SQUASHFS_I(i)->start_block = inodep.start_block; - SQUASHFS_I(i)->block_list_start = next_block; + SQUASHFS_I(i)->u.s1.fragment_start_block = frag_blk; + SQUASHFS_I(i)->u.s1.fragment_size = frag_size; + SQUASHFS_I(i)->u.s1.fragment_offset = inodep->offset; + SQUASHFS_I(i)->start_block = inodep->start_block; + SQUASHFS_I(i)->u.s1.block_list_start = next_block; SQUASHFS_I(i)->offset = next_offset; - TRACE("File inode %x:%x, start_block %x, block_list_start %x, offset %x\n", - SQUASHFS_INODE_BLK(inode), offset, inodep.start_block, next_block, next_offset); + if (sblk->block_size > 4096) + i->i_data.a_ops = &squashfs_aops; + else + i->i_data.a_ops = &squashfs_aops_4K; + + TRACE("File inode %x:%x, start_block %llx, " + "block_list_start %llx, offset %x\n", + SQUASHFS_INODE_BLK(inode), offset, + inodep->start_block, next_block, + next_offset); break; } case SQUASHFS_DIR_TYPE: { - squashfs_dir_inode_header inodep; - - if(msBlk->swap) { - squashfs_dir_inode_header sinodep; - - if(!squashfs_get_cached_block(s, (char *) &sinodep, block, offset, sizeof(sinodep), - &next_block, &next_offset)) + struct squashfs_dir_inode_header *inodep = &id.dir; + struct squashfs_dir_inode_header *sinodep = &sid.dir; + + if (msblk->swap) { + if (!squashfs_get_cached_block(s, (char *) + sinodep, block, offset, + sizeof(*sinodep), &next_block, + &next_offset)) goto failed_read; - SQUASHFS_SWAP_DIR_INODE_HEADER(&inodep, &sinodep); + SQUASHFS_SWAP_DIR_INODE_HEADER(inodep, sinodep); } else - if(!squashfs_get_cached_block(s, (char *) &inodep, block, offset, sizeof(inodep), - &next_block, &next_offset)) + if (!squashfs_get_cached_block(s, (char *) + inodep, block, offset, + sizeof(*inodep), &next_block, + &next_offset)) goto failed_read; - i->i_size = inodep.file_size; + if((i = squashfs_new_inode(s, inodeb)) == NULL) + goto failed_read1; + + i->i_nlink = inodep->nlink; + i->i_size = inodep->file_size; i->i_op = &squashfs_dir_inode_ops; i->i_fop = &squashfs_dir_ops; i->i_mode |= S_IFDIR; - i->i_mtime.tv_sec = inodep.mtime; - i->i_atime.tv_sec = inodep.mtime; - i->i_ctime.tv_sec = inodep.mtime; - SQUASHFS_I(i)->start_block = inodep.start_block; - SQUASHFS_I(i)->offset = inodep.offset; + SQUASHFS_I(i)->start_block = inodep->start_block; + SQUASHFS_I(i)->offset = inodep->offset; SQUASHFS_I(i)->u.s2.directory_index_count = 0; - TRACE("Directory inode %x:%x, start_block %x, offset %x\n", SQUASHFS_INODE_BLK(inode), offset, - inodep.start_block, inodep.offset); + SQUASHFS_I(i)->u.s2.parent_inode = inodep->parent_inode; + + TRACE("Directory inode %x:%x, start_block %x, offset " + "%x\n", SQUASHFS_INODE_BLK(inode), + offset, inodep->start_block, + inodep->offset); break; } case SQUASHFS_LDIR_TYPE: { - squashfs_ldir_inode_header inodep; - - if(msBlk->swap) { - squashfs_ldir_inode_header sinodep; - - if(!squashfs_get_cached_block(s, (char *) &sinodep, block, offset, sizeof(sinodep), - &next_block, &next_offset)) + struct squashfs_ldir_inode_header *inodep = &id.ldir; + struct squashfs_ldir_inode_header *sinodep = &sid.ldir; + + if (msblk->swap) { + if (!squashfs_get_cached_block(s, (char *) + sinodep, block, offset, + sizeof(*sinodep), &next_block, + &next_offset)) goto failed_read; - SQUASHFS_SWAP_LDIR_INODE_HEADER(&inodep, &sinodep); + SQUASHFS_SWAP_LDIR_INODE_HEADER(inodep, + sinodep); } else - if(!squashfs_get_cached_block(s, (char *) &inodep, block, offset, sizeof(inodep), - &next_block, &next_offset)) + if (!squashfs_get_cached_block(s, (char *) + inodep, block, offset, + sizeof(*inodep), &next_block, + &next_offset)) goto failed_read; - i->i_size = inodep.file_size; + if((i = squashfs_new_inode(s, inodeb)) == NULL) + goto failed_read1; + + i->i_nlink = inodep->nlink; + i->i_size = inodep->file_size; i->i_op = &squashfs_dir_inode_ops; i->i_fop = &squashfs_dir_ops; i->i_mode |= S_IFDIR; - i->i_mtime.tv_sec = inodep.mtime; - i->i_atime.tv_sec = inodep.mtime; - i->i_ctime.tv_sec = inodep.mtime; - SQUASHFS_I(i)->start_block = inodep.start_block; - SQUASHFS_I(i)->offset = inodep.offset; + SQUASHFS_I(i)->start_block = inodep->start_block; + SQUASHFS_I(i)->offset = inodep->offset; SQUASHFS_I(i)->u.s2.directory_index_start = next_block; - SQUASHFS_I(i)->u.s2.directory_index_offset = next_offset; - SQUASHFS_I(i)->u.s2.directory_index_count = inodep.i_count; - TRACE("Long directory inode %x:%x, start_block %x, offset %x\n", SQUASHFS_INODE_BLK(inode), offset, - inodep.start_block, inodep.offset); + SQUASHFS_I(i)->u.s2.directory_index_offset = + next_offset; + SQUASHFS_I(i)->u.s2.directory_index_count = + inodep->i_count; + SQUASHFS_I(i)->u.s2.parent_inode = inodep->parent_inode; + + TRACE("Long directory inode %x:%x, start_block %x, " + "offset %x\n", + SQUASHFS_INODE_BLK(inode), offset, + inodep->start_block, inodep->offset); break; } case SQUASHFS_SYMLINK_TYPE: { - squashfs_symlink_inode_header inodep; + struct squashfs_symlink_inode_header *inodep = + &id.symlink; + struct squashfs_symlink_inode_header *sinodep = + &sid.symlink; - if(msBlk->swap) { - squashfs_symlink_inode_header sinodep; - - if(!squashfs_get_cached_block(s, (char *) &sinodep, block, offset, sizeof(sinodep), - &next_block, &next_offset)) + if (msblk->swap) { + if (!squashfs_get_cached_block(s, (char *) + sinodep, block, offset, + sizeof(*sinodep), &next_block, + &next_offset)) goto failed_read; - SQUASHFS_SWAP_SYMLINK_INODE_HEADER(&inodep, &sinodep); + SQUASHFS_SWAP_SYMLINK_INODE_HEADER(inodep, + sinodep); } else - if(!squashfs_get_cached_block(s, (char *) &inodep, block, offset, sizeof(inodep), - &next_block, &next_offset)) + if (!squashfs_get_cached_block(s, (char *) + inodep, block, offset, + sizeof(*inodep), &next_block, + &next_offset)) goto failed_read; - i->i_size = inodep.symlink_size; + if((i = squashfs_new_inode(s, inodeb)) == NULL) + goto failed_read1; + + i->i_nlink = inodep->nlink; + i->i_size = inodep->symlink_size; i->i_op = &page_symlink_inode_operations; i->i_data.a_ops = &squashfs_symlink_aops; i->i_mode |= S_IFLNK; SQUASHFS_I(i)->start_block = next_block; SQUASHFS_I(i)->offset = next_offset; - TRACE("Symbolic link inode %x:%x, start_block %x, offset %x\n", - SQUASHFS_INODE_BLK(inode), offset, next_block, next_offset); + + TRACE("Symbolic link inode %x:%x, start_block %llx, " + "offset %x\n", + SQUASHFS_INODE_BLK(inode), offset, + next_block, next_offset); break; } case SQUASHFS_BLKDEV_TYPE: case SQUASHFS_CHRDEV_TYPE: { - squashfs_dev_inode_header inodep; - - if(msBlk->swap) { - squashfs_dev_inode_header sinodep; - - if(!squashfs_get_cached_block(s, (char *) &sinodep, block, offset, sizeof(sinodep), - &next_block, &next_offset)) + struct squashfs_dev_inode_header *inodep = &id.dev; + struct squashfs_dev_inode_header *sinodep = &sid.dev; + + if (msblk->swap) { + if (!squashfs_get_cached_block(s, (char *) + sinodep, block, offset, + sizeof(*sinodep), &next_block, + &next_offset)) goto failed_read; - SQUASHFS_SWAP_DEV_INODE_HEADER(&inodep, &sinodep); + SQUASHFS_SWAP_DEV_INODE_HEADER(inodep, sinodep); } else - if(!squashfs_get_cached_block(s, (char *) &inodep, block, offset, sizeof(inodep), - &next_block, &next_offset)) + if (!squashfs_get_cached_block(s, (char *) + inodep, block, offset, + sizeof(*inodep), &next_block, + &next_offset)) goto failed_read; - i->i_size = 0; - i->i_mode |= (inodeb.inode_type == SQUASHFS_CHRDEV_TYPE) ? S_IFCHR : S_IFBLK; - init_special_inode(i, i->i_mode, old_decode_dev(inodep.rdev)); - TRACE("Device inode %x:%x, rdev %x\n", SQUASHFS_INODE_BLK(inode), offset, inodep.rdev); + if ((i = squashfs_new_inode(s, inodeb)) == NULL) + goto failed_read1; + + i->i_nlink = inodep->nlink; + i->i_mode |= (inodeb->inode_type == + SQUASHFS_CHRDEV_TYPE) ? S_IFCHR : + S_IFBLK; + init_special_inode(i, i->i_mode, + old_decode_dev(inodep->rdev)); + + TRACE("Device inode %x:%x, rdev %x\n", + SQUASHFS_INODE_BLK(inode), offset, + inodep->rdev); break; } case SQUASHFS_FIFO_TYPE: case SQUASHFS_SOCKET_TYPE: { - i->i_size = 0; - i->i_mode |= (inodeb.inode_type == SQUASHFS_FIFO_TYPE) ? S_IFIFO : S_IFSOCK; + struct squashfs_ipc_inode_header *inodep = &id.ipc; + struct squashfs_ipc_inode_header *sinodep = &sid.ipc; + + if (msblk->swap) { + if (!squashfs_get_cached_block(s, (char *) + sinodep, block, offset, + sizeof(*sinodep), &next_block, + &next_offset)) + goto failed_read; + SQUASHFS_SWAP_IPC_INODE_HEADER(inodep, sinodep); + } else + if (!squashfs_get_cached_block(s, (char *) + inodep, block, offset, + sizeof(*inodep), &next_block, + &next_offset)) + goto failed_read; + + if ((i = squashfs_new_inode(s, inodeb)) == NULL) + goto failed_read1; + + i->i_nlink = inodep->nlink; + i->i_mode |= (inodeb->inode_type == SQUASHFS_FIFO_TYPE) + ? S_IFIFO : S_IFSOCK; init_special_inode(i, i->i_mode, 0); break; } default: - ERROR("Unknown inode type %d in squashfs_iget!\n", inodeb.inode_type); - goto failed_read1; + ERROR("Unknown inode type %d in squashfs_iget!\n", + inodeb->inode_type); + goto failed_read1; } - if(inodeb.guid == SQUASHFS_GUIDS) - i->i_gid = i->i_uid; - else - i->i_gid = msBlk->guid[inodeb.guid]; - insert_inode_hash(i); return i; failed_read: - ERROR("Unable to read inode [%x:%x]\n", block, offset); + ERROR("Unable to read inode [%llx:%x]\n", block, offset); failed_read1: return NULL; } -static int squashfs_fill_super(struct super_block *s, - void *data, int silent) +static int read_fragment_index_table(struct super_block *s) +{ + struct squashfs_sb_info *msblk = s->s_fs_info; + struct squashfs_super_block *sblk = &msblk->sblk; + + /* Allocate fragment index table */ + if (!(msblk->fragment_index = kmalloc(SQUASHFS_FRAGMENT_INDEX_BYTES + (sblk->fragments), GFP_KERNEL))) { + ERROR("Failed to allocate uid/gid table\n"); + return 0; + } + + if (SQUASHFS_FRAGMENT_INDEX_BYTES(sblk->fragments) && + !squashfs_read_data(s, (char *) + msblk->fragment_index, + sblk->fragment_table_start, + SQUASHFS_FRAGMENT_INDEX_BYTES + (sblk->fragments) | + SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) { + ERROR("unable to read fragment index table\n"); + return 0; + } + + if (msblk->swap) { + int i; + long long fragment; + + for (i = 0; i < SQUASHFS_FRAGMENT_INDEXES(sblk->fragments); + i++) { + SQUASHFS_SWAP_FRAGMENT_INDEXES((&fragment), + &msblk->fragment_index[i], 1); + msblk->fragment_index[i] = fragment; + } + } + + return 1; +} + + +static int supported_squashfs_filesystem(struct squashfs_sb_info *msblk, int silent) +{ + struct squashfs_super_block *sblk = &msblk->sblk; + + msblk->iget = squashfs_iget; + msblk->read_blocklist = read_blocklist; + msblk->read_fragment_index_table = read_fragment_index_table; + + if (sblk->s_major == 1) { + if (!squashfs_1_0_supported(msblk)) { + SERROR("Major/Minor mismatch, Squashfs 1.0 filesystems " + "are unsupported\n"); + SERROR("Please recompile with " + "Squashfs 1.0 support enabled\n"); + return 0; + } + } else if (sblk->s_major == 2) { + if (!squashfs_2_0_supported(msblk)) { + SERROR("Major/Minor mismatch, Squashfs 2.0 filesystems " + "are unsupported\n"); + SERROR("Please recompile with " + "Squashfs 2.0 support enabled\n"); + return 0; + } + } else if(sblk->s_major != SQUASHFS_MAJOR || sblk->s_minor > + SQUASHFS_MINOR) { + SERROR("Major/Minor mismatch, trying to mount newer %d.%d " + "filesystem\n", sblk->s_major, sblk->s_minor); + SERROR("Please update your kernel\n"); + return 0; + } + + return 1; +} + + +static int squashfs_fill_super(struct super_block *s, void *data, int silent) { - squashfs_sb_info *msBlk; - squashfs_super_block *sBlk; + struct squashfs_sb_info *msblk; + struct squashfs_super_block *sblk; int i; char b[BDEVNAME_SIZE]; + struct inode *root; TRACE("Entered squashfs_read_superblock\n"); - if(!(s->s_fs_info = (void *) kmalloc(sizeof(squashfs_sb_info), GFP_KERNEL))) { + if (!(s->s_fs_info = kmalloc(sizeof(struct squashfs_sb_info), + GFP_KERNEL))) { ERROR("Failed to allocate superblock\n"); - return -ENOMEM; + goto failure; + } + memset(s->s_fs_info, 0, sizeof(struct squashfs_sb_info)); + msblk = s->s_fs_info; + if (!(msblk->stream.workspace = vmalloc(zlib_inflate_workspacesize()))) { + ERROR("Failed to allocate zlib workspace\n"); + goto failure; } - msBlk = (squashfs_sb_info *) s->s_fs_info; - sBlk = &msBlk->sBlk; + sblk = &msblk->sblk; - msBlk->devblksize = sb_min_blocksize(s, BLOCK_SIZE); - msBlk->devblksize_log2 = ffz(~msBlk->devblksize); - - init_MUTEX(&msBlk->read_page_mutex); - init_MUTEX(&msBlk->block_cache_mutex); - init_MUTEX(&msBlk->fragment_mutex); + msblk->devblksize = sb_min_blocksize(s, BLOCK_SIZE); + msblk->devblksize_log2 = ffz(~msblk->devblksize); + + init_MUTEX(&msblk->read_data_mutex); + init_MUTEX(&msblk->read_page_mutex); + init_MUTEX(&msblk->block_cache_mutex); + init_MUTEX(&msblk->fragment_mutex); + init_MUTEX(&msblk->meta_index_mutex); - init_waitqueue_head(&msBlk->waitq); - init_waitqueue_head(&msBlk->fragment_wait_queue); + init_waitqueue_head(&msblk->waitq); + init_waitqueue_head(&msblk->fragment_wait_queue); - if(!read_data(s, (char *) sBlk, SQUASHFS_START, sizeof(squashfs_super_block) | SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) { + if (!squashfs_read_data(s, (char *) sblk, SQUASHFS_START, + sizeof(struct squashfs_super_block) | + SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) { SERROR("unable to read superblock\n"); goto failed_mount; } /* Check it is a SQUASHFS superblock */ - msBlk->swap = 0; - if((s->s_magic = sBlk->s_magic) != SQUASHFS_MAGIC) { - if(sBlk->s_magic == SQUASHFS_MAGIC_SWAP) { - squashfs_super_block sblk; - WARNING("Mounting a different endian SQUASHFS filesystem on %s\n", bdevname(s->s_bdev, b)); - SQUASHFS_SWAP_SUPER_BLOCK(&sblk, sBlk); - memcpy(sBlk, &sblk, sizeof(squashfs_super_block)); - msBlk->swap = 1; + msblk->swap = 0; + if ((s->s_magic = sblk->s_magic) != SQUASHFS_MAGIC) { + if (sblk->s_magic == SQUASHFS_MAGIC_SWAP) { + struct squashfs_super_block ssblk; + + WARNING("Mounting a different endian SQUASHFS " + "filesystem on %s\n", bdevname(s->s_bdev, b)); + + SQUASHFS_SWAP_SUPER_BLOCK(&ssblk, sblk); + memcpy(sblk, &ssblk, sizeof(struct squashfs_super_block)); + msblk->swap = 1; } else { - SERROR("Can't find a SQUASHFS superblock on %s\n", bdevname(s->s_bdev, b)); + SERROR("Can't find a SQUASHFS superblock on %s\n", + bdevname(s->s_bdev, b)); goto failed_mount; } } /* Check the MAJOR & MINOR versions */ -#ifdef SQUASHFS_1_0_COMPATIBILITY - if((sBlk->s_major != 1) && (sBlk->s_major != 2 || sBlk->s_minor > SQUASHFS_MINOR)) { - SERROR("Major/Minor mismatch, filesystem is (%d:%d), I support (1 : x) or (2 : <= %d)\n", - sBlk->s_major, sBlk->s_minor, SQUASHFS_MINOR); + if(!supported_squashfs_filesystem(msblk, silent)) goto failed_mount; - } - if(sBlk->s_major == 1) - sBlk->block_size = sBlk->block_size_1; -#else - if(sBlk->s_major != SQUASHFS_MAJOR || sBlk->s_minor > SQUASHFS_MINOR) { - SERROR("Major/Minor mismatch, filesystem is (%d:%d), I support (%d: <= %d)\n", - sBlk->s_major, sBlk->s_minor, SQUASHFS_MAJOR, SQUASHFS_MINOR); - goto failed_mount; - } -#endif TRACE("Found valid superblock on %s\n", bdevname(s->s_bdev, b)); - TRACE("Inodes are %scompressed\n", SQUASHFS_UNCOMPRESSED_INODES(sBlk->flags) ? "un" : ""); - TRACE("Data is %scompressed\n", SQUASHFS_UNCOMPRESSED_DATA(sBlk->flags) ? "un" : ""); - TRACE("Check data is %s present in the filesystem\n", SQUASHFS_CHECK_DATA(sBlk->flags) ? "" : "not"); - TRACE("Filesystem size %d bytes\n", sBlk->bytes_used); - TRACE("Block size %d\n", sBlk->block_size); - TRACE("Number of inodes %d\n", sBlk->inodes); - if(sBlk->s_major > 1) - TRACE("Number of fragments %d\n", sBlk->fragments); - TRACE("Number of uids %d\n", sBlk->no_uids); - TRACE("Number of gids %d\n", sBlk->no_guids); - TRACE("sBlk->inode_table_start %x\n", sBlk->inode_table_start); - TRACE("sBlk->directory_table_start %x\n", sBlk->directory_table_start); - if(sBlk->s_major > 1) - TRACE("sBlk->fragment_table_start %x\n", sBlk->fragment_table_start); - TRACE("sBlk->uid_start %x\n", sBlk->uid_start); + TRACE("Inodes are %scompressed\n", + SQUASHFS_UNCOMPRESSED_INODES + (sblk->flags) ? "un" : ""); + TRACE("Data is %scompressed\n", + SQUASHFS_UNCOMPRESSED_DATA(sblk->flags) + ? "un" : ""); + TRACE("Check data is %s present in the filesystem\n", + SQUASHFS_CHECK_DATA(sblk->flags) ? + "" : "not"); + TRACE("Filesystem size %lld bytes\n", sblk->bytes_used); + TRACE("Block size %d\n", sblk->block_size); + TRACE("Number of inodes %d\n", sblk->inodes); + if (sblk->s_major > 1) + TRACE("Number of fragments %d\n", sblk->fragments); + TRACE("Number of uids %d\n", sblk->no_uids); + TRACE("Number of gids %d\n", sblk->no_guids); + TRACE("sblk->inode_table_start %llx\n", sblk->inode_table_start); + TRACE("sblk->directory_table_start %llx\n", sblk->directory_table_start); + if (sblk->s_major > 1) + TRACE("sblk->fragment_table_start %llx\n", + sblk->fragment_table_start); + TRACE("sblk->uid_start %llx\n", sblk->uid_start); s->s_flags |= MS_RDONLY; s->s_op = &squashfs_ops; /* Init inode_table block pointer array */ - if(!(msBlk->block_cache = (squashfs_cache *) kmalloc(sizeof(squashfs_cache) * SQUASHFS_CACHED_BLKS, GFP_KERNEL))) { + if (!(msblk->block_cache = kmalloc(sizeof(struct squashfs_cache) * + SQUASHFS_CACHED_BLKS, GFP_KERNEL))) { ERROR("Failed to allocate block cache\n"); goto failed_mount; } - for(i = 0; i < SQUASHFS_CACHED_BLKS; i++) - msBlk->block_cache[i].block = SQUASHFS_INVALID_BLK; + for (i = 0; i < SQUASHFS_CACHED_BLKS; i++) + msblk->block_cache[i].block = SQUASHFS_INVALID_BLK; - msBlk->next_cache = 0; + msblk->next_cache = 0; /* Allocate read_data block */ - msBlk->read_size = (sBlk->block_size < SQUASHFS_METADATA_SIZE) ? SQUASHFS_METADATA_SIZE : sBlk->block_size; - if(!(msBlk->read_data = (char *) kmalloc(msBlk->read_size, GFP_KERNEL))) { + msblk->read_size = (sblk->block_size < SQUASHFS_METADATA_SIZE) ? + SQUASHFS_METADATA_SIZE : + sblk->block_size; + + if (!(msblk->read_data = kmalloc(msblk->read_size, GFP_KERNEL))) { ERROR("Failed to allocate read_data block\n"); - goto failed_mount1; + goto failed_mount; } /* Allocate read_page block */ - if(sBlk->block_size > PAGE_CACHE_SIZE) { - if(!(msBlk->read_page = (char *) kmalloc(sBlk->block_size, GFP_KERNEL))) { - ERROR("Failed to allocate read_page block\n"); - goto failed_mount2; - } - } else - msBlk->read_page = NULL; + if (!(msblk->read_page = kmalloc(sblk->block_size, GFP_KERNEL))) { + ERROR("Failed to allocate read_page block\n"); + goto failed_mount; + } /* Allocate uid and gid tables */ - if(!(msBlk->uid = (squashfs_uid *) kmalloc((sBlk->no_uids + - sBlk->no_guids) * sizeof(squashfs_uid), GFP_KERNEL))) { + if (!(msblk->uid = kmalloc((sblk->no_uids + sblk->no_guids) * + sizeof(unsigned int), GFP_KERNEL))) { ERROR("Failed to allocate uid/gid table\n"); - goto failed_mount3; + goto failed_mount; } - msBlk->guid = msBlk->uid + sBlk->no_uids; + msblk->guid = msblk->uid + sblk->no_uids; - if(msBlk->swap) { - squashfs_uid suid[sBlk->no_uids + sBlk->no_guids]; - - if(!read_data(s, (char *) &suid, sBlk->uid_start, ((sBlk->no_uids + sBlk->no_guids) * - sizeof(squashfs_uid)) | SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) { - SERROR("unable to read uid/gid table\n"); - goto failed_mount4; + if (msblk->swap) { + unsigned int suid[sblk->no_uids + sblk->no_guids]; + + if (!squashfs_read_data(s, (char *) &suid, sblk->uid_start, + ((sblk->no_uids + sblk->no_guids) * + sizeof(unsigned int)) | + SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) { + ERROR("unable to read uid/gid table\n"); + goto failed_mount; } - SQUASHFS_SWAP_DATA(msBlk->uid, suid, (sBlk->no_uids + sBlk->no_guids), (sizeof(squashfs_uid) * 8)); + + SQUASHFS_SWAP_DATA(msblk->uid, suid, (sblk->no_uids + + sblk->no_guids), (sizeof(unsigned int) * 8)); } else - if(!read_data(s, (char *) msBlk->uid, sBlk->uid_start, ((sBlk->no_uids + sBlk->no_guids) * - sizeof(squashfs_uid)) | SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) { - SERROR("unable to read uid/gid table\n"); - goto failed_mount4; + if (!squashfs_read_data(s, (char *) msblk->uid, sblk->uid_start, + ((sblk->no_uids + sblk->no_guids) * + sizeof(unsigned int)) | + SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) { + ERROR("unable to read uid/gid table\n"); + goto failed_mount; } -#ifdef SQUASHFS_1_0_COMPATIBILITY - if(sBlk->s_major == 1) { - msBlk->iget = squashfs_iget_1; - msBlk->read_blocklist = read_blocklist_1; - msBlk->fragment = NULL; - msBlk->fragment_index = NULL; + if (sblk->s_major == 1 && squashfs_1_0_supported(msblk)) goto allocate_root; - } -#endif - msBlk->iget = squashfs_iget; - msBlk->read_blocklist = read_blocklist; - if(!(msBlk->fragment = (struct squashfs_fragment_cache *) kmalloc(sizeof(struct squashfs_fragment_cache) * SQUASHFS_CACHED_FRAGMENTS, GFP_KERNEL))) { + if (!(msblk->fragment = kmalloc(sizeof(struct squashfs_fragment_cache) * + SQUASHFS_CACHED_FRAGMENTS, GFP_KERNEL))) { ERROR("Failed to allocate fragment block cache\n"); - goto failed_mount4; + goto failed_mount; } - for(i = 0; i < SQUASHFS_CACHED_FRAGMENTS; i++) { - msBlk->fragment[i].locked = 0; - msBlk->fragment[i].block = SQUASHFS_INVALID_BLK; - msBlk->fragment[i].data = NULL; + for (i = 0; i < SQUASHFS_CACHED_FRAGMENTS; i++) { + msblk->fragment[i].locked = 0; + msblk->fragment[i].block = SQUASHFS_INVALID_BLK; + msblk->fragment[i].data = NULL; } - msBlk->next_fragment = 0; + msblk->next_fragment = 0; /* Allocate fragment index table */ - if(!(msBlk->fragment_index = (squashfs_fragment_index *) kmalloc(SQUASHFS_FRAGMENT_INDEX_BYTES(sBlk->fragments), GFP_KERNEL))) { - ERROR("Failed to allocate uid/gid table\n"); - goto failed_mount5; - } - - if(SQUASHFS_FRAGMENT_INDEX_BYTES(sBlk->fragments) && - !read_data(s, (char *) msBlk->fragment_index, sBlk->fragment_table_start, - SQUASHFS_FRAGMENT_INDEX_BYTES(sBlk->fragments) | SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) { - SERROR("unable to read fragment index table\n"); - goto failed_mount6; - } - - if(msBlk->swap) { - int i; - squashfs_fragment_index fragment; - - for(i = 0; i < SQUASHFS_FRAGMENT_INDEXES(sBlk->fragments); i++) { - SQUASHFS_SWAP_FRAGMENT_INDEXES((&fragment), &msBlk->fragment_index[i], 1); - msBlk->fragment_index[i] = fragment; - } - } + if (msblk->read_fragment_index_table(s) == 0) + goto failed_mount; -#ifdef SQUASHFS_1_0_COMPATIBILITY allocate_root: -#endif - if(!(s->s_root = d_alloc_root((msBlk->iget)(s, sBlk->root_inode)))) { + if ((root = (msblk->iget)(s, sblk->root_inode)) == NULL) + goto failed_mount; + + if ((s->s_root = d_alloc_root(root)) == NULL) { ERROR("Root inode create failed\n"); - goto failed_mount5; + iput(root); + goto failed_mount; } TRACE("Leaving squashfs_read_super\n"); return 0; -failed_mount6: - kfree(msBlk->fragment_index); -failed_mount5: - kfree(msBlk->fragment); -failed_mount4: - kfree(msBlk->uid); -failed_mount3: - kfree(msBlk->read_page); -failed_mount2: - kfree(msBlk->read_data); -failed_mount1: - kfree(msBlk->block_cache); failed_mount: + kfree(msblk->fragment_index); + kfree(msblk->fragment); + kfree(msblk->uid); + kfree(msblk->read_page); + kfree(msblk->read_data); + kfree(msblk->block_cache); + kfree(msblk->fragment_index_2); + vfree(msblk->stream.workspace); kfree(s->s_fs_info); s->s_fs_info = NULL; return -EINVAL; + +failure: + return -ENOMEM; } -static int squashfs_statfs(struct super_block *s, struct kstatfs *buf) +static int squashfs_statfs(struct dentry *s, struct kstatfs *buf) { - squashfs_super_block *sBlk = &((squashfs_sb_info *)s->s_fs_info)->sBlk; + struct squashfs_sb_info *msblk = s->d_sb->s_fs_info; + struct squashfs_super_block *sblk = &msblk->sblk; TRACE("Entered squashfs_statfs\n"); + buf->f_type = SQUASHFS_MAGIC; - buf->f_bsize = sBlk->block_size; - buf->f_blocks = ((sBlk->bytes_used - 1) >> sBlk->block_log) + 1; + buf->f_bsize = sblk->block_size; + buf->f_blocks = ((sblk->bytes_used - 1) >> sblk->block_log) + 1; buf->f_bfree = buf->f_bavail = 0; - buf->f_files = sBlk->inodes; + buf->f_files = sblk->inodes; buf->f_ffree = 0; buf->f_namelen = SQUASHFS_NAME_LEN; + return 0; } @@ -1124,35 +1171,41 @@ static int squashfs_symlink_readpage(struct file *file, struct page *page) { struct inode *inode = page->mapping->host; int index = page->index << PAGE_CACHE_SHIFT, length, bytes; - unsigned int block = SQUASHFS_I(inode)->start_block; + long long block = SQUASHFS_I(inode)->start_block; int offset = SQUASHFS_I(inode)->offset; void *pageaddr = kmap(page); - TRACE("Entered squashfs_symlink_readpage, page index %d, start block %x, offset %x\n", - page->index, SQUASHFS_I(inode)->start_block, SQUASHFS_I(inode)->offset); - - for(length = 0; length < index; length += bytes) { - if(!(bytes = squashfs_get_cached_block(inode->i_sb, NULL, block, offset, - PAGE_CACHE_SIZE, &block, &offset))) { - ERROR("Unable to read symbolic link [%x:%x]\n", block, offset); + TRACE("Entered squashfs_symlink_readpage, page index %ld, start block " + "%llx, offset %x\n", page->index, + SQUASHFS_I(inode)->start_block, + SQUASHFS_I(inode)->offset); + + for (length = 0; length < index; length += bytes) { + if (!(bytes = squashfs_get_cached_block(inode->i_sb, NULL, + block, offset, PAGE_CACHE_SIZE, &block, + &offset))) { + ERROR("Unable to read symbolic link [%llx:%x]\n", block, + offset); goto skip_read; } } - if(length != index) { + if (length != index) { ERROR("(squashfs_symlink_readpage) length != index\n"); bytes = 0; goto skip_read; } - bytes = (inode->i_size - length) > PAGE_CACHE_SIZE ? PAGE_CACHE_SIZE : inode->i_size - length; - if(!(bytes = squashfs_get_cached_block(inode->i_sb, pageaddr, block, offset, bytes, &block, &offset))) - ERROR("Unable to read symbolic link [%x:%x]\n", block, offset); + bytes = (i_size_read(inode) - length) > PAGE_CACHE_SIZE ? PAGE_CACHE_SIZE : + i_size_read(inode) - length; + + if (!(bytes = squashfs_get_cached_block(inode->i_sb, pageaddr, block, + offset, bytes, &block, &offset))) + ERROR("Unable to read symbolic link [%llx:%x]\n", block, offset); skip_read: memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes); kunmap(page); - flush_dcache_page(page); SetPageUptodate(page); unlock_page(page); @@ -1160,158 +1213,363 @@ skip_read: } -#define SIZE 256 +struct meta_index *locate_meta_index(struct inode *inode, int index, int offset) +{ + struct meta_index *meta = NULL; + struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info; + int i; + + down(&msblk->meta_index_mutex); + + TRACE("locate_meta_index: index %d, offset %d\n", index, offset); + + if(msblk->meta_index == NULL) + goto not_allocated; + + for (i = 0; i < SQUASHFS_META_NUMBER; i ++) + if (msblk->meta_index[i].inode_number == inode->i_ino && + msblk->meta_index[i].offset >= offset && + msblk->meta_index[i].offset <= index && + msblk->meta_index[i].locked == 0) { + TRACE("locate_meta_index: entry %d, offset %d\n", i, + msblk->meta_index[i].offset); + meta = &msblk->meta_index[i]; + offset = meta->offset; + } + + if (meta) + meta->locked = 1; + +not_allocated: + up(&msblk->meta_index_mutex); -#ifdef SQUASHFS_1_0_COMPATIBILITY -static unsigned int read_blocklist_1(struct inode *inode, int index, int readahead_blks, - char *block_list, unsigned short **block_p, unsigned int *bsize) + return meta; +} + + +struct meta_index *empty_meta_index(struct inode *inode, int offset, int skip) { - squashfs_sb_info *msBlk = (squashfs_sb_info *)inode->i_sb->s_fs_info; - unsigned short *block_listp; - int i = 0; - int block_ptr = SQUASHFS_I(inode)->block_list_start; - int offset = SQUASHFS_I(inode)->offset; - unsigned int block = SQUASHFS_I(inode)->start_block; + struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info; + struct meta_index *meta = NULL; + int i; - for(;;) { - int blocks = (index + readahead_blks - i); - if(blocks > (SIZE >> 1)) { - if((index - i) <= (SIZE >> 1)) - blocks = index - i; - else - blocks = SIZE >> 1; + down(&msblk->meta_index_mutex); + + TRACE("empty_meta_index: offset %d, skip %d\n", offset, skip); + + if(msblk->meta_index == NULL) { + if (!(msblk->meta_index = kmalloc(sizeof(struct meta_index) * + SQUASHFS_META_NUMBER, GFP_KERNEL))) { + ERROR("Failed to allocate meta_index\n"); + goto failed; + } + for(i = 0; i < SQUASHFS_META_NUMBER; i++) { + msblk->meta_index[i].inode_number = 0; + msblk->meta_index[i].locked = 0; } + msblk->next_meta_index = 0; + } - if(msBlk->swap) { - unsigned char sblock_list[SIZE]; - if(!squashfs_get_cached_block(inode->i_sb, (char *) sblock_list, block_ptr, offset, blocks << 1, &block_ptr, &offset)) { - ERROR("Unable to read block list [%d:%x]\n", block_ptr, offset); - return 0; - } - SQUASHFS_SWAP_SHORTS(((unsigned short *)block_list), ((unsigned short *)sblock_list), blocks); - } else - if(!squashfs_get_cached_block(inode->i_sb, (char *) block_list, block_ptr, offset, blocks << 1, &block_ptr, &offset)) { - ERROR("Unable to read block list [%d:%x]\n", block_ptr, offset); - return 0; - } - for(block_listp = (unsigned short *) block_list; i < index && blocks; i ++, block_listp ++, blocks --) - block += SQUASHFS_COMPRESSED_SIZE(*block_listp); - if(blocks >= readahead_blks) - break; + for(i = SQUASHFS_META_NUMBER; i && + msblk->meta_index[msblk->next_meta_index].locked; i --) + msblk->next_meta_index = (msblk->next_meta_index + 1) % + SQUASHFS_META_NUMBER; + + if(i == 0) { + TRACE("empty_meta_index: failed!\n"); + goto failed; } - if(bsize) - *bsize = SQUASHFS_COMPRESSED_SIZE(*block_listp) | (!SQUASHFS_COMPRESSED(*block_listp) ? SQUASHFS_COMPRESSED_BIT_BLOCK : 0); - else - *block_p = block_listp; - return block; + TRACE("empty_meta_index: returned meta entry %d, %p\n", + msblk->next_meta_index, + &msblk->meta_index[msblk->next_meta_index]); + + meta = &msblk->meta_index[msblk->next_meta_index]; + msblk->next_meta_index = (msblk->next_meta_index + 1) % + SQUASHFS_META_NUMBER; + + meta->inode_number = inode->i_ino; + meta->offset = offset; + meta->skip = skip; + meta->entries = 0; + meta->locked = 1; + +failed: + up(&msblk->meta_index_mutex); + return meta; } -#endif -static unsigned int read_blocklist(struct inode *inode, int index, int readahead_blks, - char *block_list, unsigned short **block_p, unsigned int *bsize) +void release_meta_index(struct inode *inode, struct meta_index *meta) { - squashfs_sb_info *msBlk = (squashfs_sb_info *)inode->i_sb->s_fs_info; + meta->locked = 0; +} + + +static int read_block_index(struct super_block *s, int blocks, char *block_list, + long long *start_block, int *offset) +{ + struct squashfs_sb_info *msblk = s->s_fs_info; unsigned int *block_listp; - int i = 0; - int block_ptr = SQUASHFS_I(inode)->block_list_start; - int offset = SQUASHFS_I(inode)->offset; - unsigned int block = SQUASHFS_I(inode)->start_block; + int block = 0; + + if (msblk->swap) { + char sblock_list[blocks << 2]; + + if (!squashfs_get_cached_block(s, sblock_list, *start_block, + *offset, blocks << 2, start_block, offset)) { + ERROR("Unable to read block list [%llx:%x]\n", + *start_block, *offset); + goto failure; + } + SQUASHFS_SWAP_INTS(((unsigned int *)block_list), + ((unsigned int *)sblock_list), blocks); + } else + if (!squashfs_get_cached_block(s, block_list, *start_block, + *offset, blocks << 2, start_block, offset)) { + ERROR("Unable to read block list [%llx:%x]\n", + *start_block, *offset); + goto failure; + } - for(;;) { - int blocks = (index + readahead_blks - i); - if(blocks > (SIZE >> 2)) { - if((index - i) <= (SIZE >> 2)) - blocks = index - i; - else - blocks = SIZE >> 2; + for (block_listp = (unsigned int *) block_list; blocks; + block_listp++, blocks --) + block += SQUASHFS_COMPRESSED_SIZE_BLOCK(*block_listp); + + return block; + +failure: + return -1; +} + + +#define SIZE 256 + +static inline int calculate_skip(int blocks) { + int skip = (blocks - 1) / ((SQUASHFS_SLOTS * SQUASHFS_META_ENTRIES + 1) * SQUASHFS_META_INDEXES); + return skip >= 7 ? 7 : skip + 1; +} + + +static int get_meta_index(struct inode *inode, int index, + long long *index_block, int *index_offset, + long long *data_block, char *block_list) +{ + struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info; + struct squashfs_super_block *sblk = &msblk->sblk; + int skip = calculate_skip(i_size_read(inode) >> sblk->block_log); + int offset = 0; + struct meta_index *meta; + struct meta_entry *meta_entry; + long long cur_index_block = SQUASHFS_I(inode)->u.s1.block_list_start; + int cur_offset = SQUASHFS_I(inode)->offset; + long long cur_data_block = SQUASHFS_I(inode)->start_block; + int i; + + index /= SQUASHFS_META_INDEXES * skip; + + while ( offset < index ) { + meta = locate_meta_index(inode, index, offset + 1); + + if (meta == NULL) { + if ((meta = empty_meta_index(inode, offset + 1, + skip)) == NULL) + goto all_done; + } else { + offset = index < meta->offset + meta->entries ? index : + meta->offset + meta->entries - 1; + meta_entry = &meta->meta_entry[offset - meta->offset]; + cur_index_block = meta_entry->index_block + sblk->inode_table_start; + cur_offset = meta_entry->offset; + cur_data_block = meta_entry->data_block; + TRACE("get_meta_index: offset %d, meta->offset %d, " + "meta->entries %d\n", offset, meta->offset, + meta->entries); + TRACE("get_meta_index: index_block 0x%llx, offset 0x%x" + " data_block 0x%llx\n", cur_index_block, + cur_offset, cur_data_block); } - if(msBlk->swap) { - unsigned char sblock_list[SIZE]; - if(!squashfs_get_cached_block(inode->i_sb, (char *) sblock_list, block_ptr, offset, blocks << 2, &block_ptr, &offset)) { - ERROR("Unable to read block list [%d:%x]\n", block_ptr, offset); - return 0; - } - SQUASHFS_SWAP_INTS(((unsigned int *)block_list), ((unsigned int *)sblock_list), blocks); - } else - if(!squashfs_get_cached_block(inode->i_sb, (char *) block_list, block_ptr, offset, blocks << 2, &block_ptr, &offset)) { - ERROR("Unable to read block list [%d:%x]\n", block_ptr, offset); - return 0; + for (i = meta->offset + meta->entries; i <= index && + i < meta->offset + SQUASHFS_META_ENTRIES; i++) { + int blocks = skip * SQUASHFS_META_INDEXES; + + while (blocks) { + int block = blocks > (SIZE >> 2) ? (SIZE >> 2) : + blocks; + int res = read_block_index(inode->i_sb, block, + block_list, &cur_index_block, + &cur_offset); + + if (res == -1) + goto failed; + + cur_data_block += res; + blocks -= block; } - for(block_listp = (unsigned int *) block_list; i < index && blocks; i ++, block_listp ++, blocks --) - block += SQUASHFS_COMPRESSED_SIZE_BLOCK(*block_listp); - if(blocks >= readahead_blks) - break; + + meta_entry = &meta->meta_entry[i - meta->offset]; + meta_entry->index_block = cur_index_block - sblk->inode_table_start; + meta_entry->offset = cur_offset; + meta_entry->data_block = cur_data_block; + meta->entries ++; + offset ++; + } + + TRACE("get_meta_index: meta->offset %d, meta->entries %d\n", + meta->offset, meta->entries); + + release_meta_index(inode, meta); } - *bsize = *block_listp; +all_done: + *index_block = cur_index_block; + *index_offset = cur_offset; + *data_block = cur_data_block; + + return offset * SQUASHFS_META_INDEXES * skip; + +failed: + release_meta_index(inode, meta); + return -1; +} + + +static long long read_blocklist(struct inode *inode, int index, + int readahead_blks, char *block_list, + unsigned short **block_p, unsigned int *bsize) +{ + long long block_ptr; + int offset; + long long block; + int res = get_meta_index(inode, index, &block_ptr, &offset, &block, + block_list); + + TRACE("read_blocklist: res %d, index %d, block_ptr 0x%llx, offset" + " 0x%x, block 0x%llx\n", res, index, block_ptr, offset, + block); + + if(res == -1) + goto failure; + + index -= res; + + while ( index ) { + int blocks = index > (SIZE >> 2) ? (SIZE >> 2) : index; + int res = read_block_index(inode->i_sb, blocks, block_list, + &block_ptr, &offset); + if (res == -1) + goto failure; + block += res; + index -= blocks; + } + + if (read_block_index(inode->i_sb, 1, block_list, + &block_ptr, &offset) == -1) + goto failure; + *bsize = *((unsigned int *) block_list); + return block; + +failure: + return 0; } static int squashfs_readpage(struct file *file, struct page *page) { struct inode *inode = page->mapping->host; - squashfs_sb_info *msBlk = (squashfs_sb_info *)inode->i_sb->s_fs_info; - squashfs_super_block *sBlk = &msBlk->sBlk; - unsigned char block_list[SIZE]; - unsigned int bsize, block, i = 0, bytes = 0, byte_offset = 0; - int index = page->index >> (sBlk->block_log - PAGE_CACHE_SHIFT); - void *pageaddr = kmap(page); + struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info; + struct squashfs_super_block *sblk = &msblk->sblk; + unsigned char *block_list; + long long block; + unsigned int bsize, i = 0, bytes = 0, byte_offset = 0; + int index = page->index >> (sblk->block_log - PAGE_CACHE_SHIFT); + void *pageaddr; struct squashfs_fragment_cache *fragment = NULL; - char *data_ptr = msBlk->read_page; + char *data_ptr = msblk->read_page; - int mask = (1 << (sBlk->block_log - PAGE_CACHE_SHIFT)) - 1; + int mask = (1 << (sblk->block_log - PAGE_CACHE_SHIFT)) - 1; int start_index = page->index & ~mask; int end_index = start_index | mask; - TRACE("Entered squashfs_readpage, page index %x, start block %x\n", (unsigned int) page->index, - SQUASHFS_I(inode)->start_block); + TRACE("Entered squashfs_readpage, page index %lx, start block %llx\n", + page->index, + SQUASHFS_I(inode)->start_block); - if(page->index >= ((inode->i_size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT)) { + if (!(block_list = kmalloc(SIZE, GFP_KERNEL))) { + ERROR("Failed to allocate block_list\n"); goto skip_read; } - if(SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK || index < (inode->i_size >> sBlk->block_log)) { - if((block = (msBlk->read_blocklist)(inode, index, 1, block_list, NULL, &bsize)) == 0) + if (page->index >= ((i_size_read(inode) + PAGE_CACHE_SIZE - 1) >> + PAGE_CACHE_SHIFT)) + goto skip_read; + + if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK + || index < (i_size_read(inode) >> + sblk->block_log)) { + if ((block = (msblk->read_blocklist)(inode, index, 1, + block_list, NULL, &bsize)) == 0) goto skip_read; - down(&msBlk->read_page_mutex); - if(!(bytes = read_data(inode->i_sb, msBlk->read_page, block, bsize, NULL))) { - ERROR("Unable to read page, block %x, size %x\n", block, bsize); - up(&msBlk->read_page_mutex); + down(&msblk->read_page_mutex); + + if (!(bytes = squashfs_read_data(inode->i_sb, msblk->read_page, + block, bsize, NULL))) { + ERROR("Unable to read page, block %llx, size %x\n", block, + bsize); + up(&msblk->read_page_mutex); goto skip_read; } } else { - if((fragment = get_cached_fragment(inode->i_sb, SQUASHFS_I(inode)->u.s1.fragment_start_block, SQUASHFS_I(inode)->u.s1.fragment_size)) == NULL) { - ERROR("Unable to read page, block %x, size %x\n", SQUASHFS_I(inode)->u.s1.fragment_start_block, (int) SQUASHFS_I(inode)->u.s1.fragment_size); + if ((fragment = get_cached_fragment(inode->i_sb, + SQUASHFS_I(inode)-> + u.s1.fragment_start_block, + SQUASHFS_I(inode)->u.s1.fragment_size)) + == NULL) { + ERROR("Unable to read page, block %llx, size %x\n", + SQUASHFS_I(inode)-> + u.s1.fragment_start_block, + (int) SQUASHFS_I(inode)-> + u.s1.fragment_size); goto skip_read; } - bytes = SQUASHFS_I(inode)->u.s1.fragment_offset + (inode->i_size & (sBlk->block_size - 1)); + bytes = SQUASHFS_I(inode)->u.s1.fragment_offset + + (i_size_read(inode) & (sblk->block_size + - 1)); byte_offset = SQUASHFS_I(inode)->u.s1.fragment_offset; data_ptr = fragment->data; } - for(i = start_index; i <= end_index && byte_offset < bytes; i++, byte_offset += PAGE_CACHE_SIZE) { + for (i = start_index; i <= end_index && byte_offset < bytes; + i++, byte_offset += PAGE_CACHE_SIZE) { struct page *push_page; - int available_bytes = (bytes - byte_offset) > PAGE_CACHE_SIZE ? PAGE_CACHE_SIZE : bytes - byte_offset; - - TRACE("bytes %d, i %d, byte_offset %d, available_bytes %d\n", bytes, i, byte_offset, available_bytes); - - if(i == page->index) { - memcpy(pageaddr, data_ptr + byte_offset, available_bytes); - memset(pageaddr + available_bytes, 0, PAGE_CACHE_SIZE - available_bytes); - kunmap(page); + int available_bytes = (bytes - byte_offset) > PAGE_CACHE_SIZE ? + PAGE_CACHE_SIZE : bytes - byte_offset; + + TRACE("bytes %d, i %d, byte_offset %d, available_bytes %d\n", + bytes, i, byte_offset, available_bytes); + + if (i == page->index) { + pageaddr = kmap_atomic(page, KM_USER0); + memcpy(pageaddr, data_ptr + byte_offset, + available_bytes); + memset(pageaddr + available_bytes, 0, + PAGE_CACHE_SIZE - available_bytes); + kunmap_atomic(pageaddr, KM_USER0); flush_dcache_page(page); SetPageUptodate(page); unlock_page(page); - } else if((push_page = grab_cache_page_nowait(page->mapping, i))) { - void *pageaddr = kmap(push_page); - memcpy(pageaddr, data_ptr + byte_offset, available_bytes); - memset(pageaddr + available_bytes, 0, PAGE_CACHE_SIZE - available_bytes); - kunmap(push_page); + } else if ((push_page = + grab_cache_page_nowait(page->mapping, i))) { + pageaddr = kmap_atomic(push_page, KM_USER0); + + memcpy(pageaddr, data_ptr + byte_offset, + available_bytes); + memset(pageaddr + available_bytes, 0, + PAGE_CACHE_SIZE - available_bytes); + kunmap_atomic(pageaddr, KM_USER0); flush_dcache_page(push_page); SetPageUptodate(push_page); unlock_page(push_page); @@ -1319,20 +1577,25 @@ static int squashfs_readpage(struct file *file, struct page *page) } } - if(SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK || index < (inode->i_size >> sBlk->block_log)) - up(&msBlk->read_page_mutex); + if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK + || index < (i_size_read(inode) >> + sblk->block_log)) + up(&msblk->read_page_mutex); else - release_cached_fragment(msBlk, fragment); + release_cached_fragment(msblk, fragment); + kfree(block_list); return 0; skip_read: + pageaddr = kmap_atomic(page, KM_USER0); memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes); - kunmap(page); + kunmap_atomic(pageaddr, KM_USER0); flush_dcache_page(page); SetPageUptodate(page); unlock_page(page); + kfree(block_list); return 0; } @@ -1340,332 +1603,421 @@ skip_read: static int squashfs_readpage4K(struct file *file, struct page *page) { struct inode *inode = page->mapping->host; - squashfs_sb_info *msBlk = (squashfs_sb_info *)inode->i_sb->s_fs_info; - squashfs_super_block *sBlk = &msBlk->sBlk; - unsigned char block_list[SIZE]; - unsigned int bsize, block, bytes = 0; - void *pageaddr = kmap(page); + struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info; + struct squashfs_super_block *sblk = &msblk->sblk; + unsigned char *block_list; + long long block; + unsigned int bsize, bytes = 0; + void *pageaddr; - TRACE("Entered squashfs_readpage4K, page index %x, start block %x\n", (unsigned int) page->index, - SQUASHFS_I(inode)->start_block); - - if(page->index >= ((inode->i_size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT)) { + TRACE("Entered squashfs_readpage4K, page index %lx, start block %llx\n", + page->index, + SQUASHFS_I(inode)->start_block); + + if (page->index >= ((i_size_read(inode) + PAGE_CACHE_SIZE - 1) >> + PAGE_CACHE_SHIFT)) { + pageaddr = kmap_atomic(page, KM_USER0); + block_list = NULL; goto skip_read; } - if(SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK || page->index < (inode->i_size >> sBlk->block_log)) { - block = (msBlk->read_blocklist)(inode, page->index, 1, block_list, NULL, &bsize); + if (!(block_list = kmalloc(SIZE, GFP_KERNEL))) { + ERROR("Failed to allocate block_list\n"); + pageaddr = kmap_atomic(page, KM_USER0); + block_list = NULL; + goto skip_read; + } - if(!(bytes = read_data(inode->i_sb, pageaddr, block, bsize, NULL))) - ERROR("Unable to read page, block %x, size %x\n", block, bsize); + if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK + || page->index < (i_size_read(inode) >> + sblk->block_log)) { + block = (msblk->read_blocklist)(inode, page->index, 1, + block_list, NULL, &bsize); + + down(&msblk->read_page_mutex); + bytes = squashfs_read_data(inode->i_sb, msblk->read_page, block, + bsize, NULL); + pageaddr = kmap_atomic(page, KM_USER0); + if (bytes) + memcpy(pageaddr, msblk->read_page, bytes); + else + ERROR("Unable to read page, block %llx, size %x\n", + block, bsize); + up(&msblk->read_page_mutex); } else { - struct squashfs_fragment_cache *fragment; - - if((fragment = get_cached_fragment(inode->i_sb, SQUASHFS_I(inode)->u.s1.fragment_start_block, SQUASHFS_I(inode)->u.s1.fragment_size)) == NULL) - ERROR("Unable to read page, block %x, size %x\n", SQUASHFS_I(inode)->u.s1.fragment_start_block, (int) SQUASHFS_I(inode)->u.s1.fragment_size); - else { - bytes = inode->i_size & (sBlk->block_size - 1); - memcpy(pageaddr, fragment->data + SQUASHFS_I(inode)->u.s1.fragment_offset, bytes); - release_cached_fragment(msBlk, fragment); - } + struct squashfs_fragment_cache *fragment = + get_cached_fragment(inode->i_sb, + SQUASHFS_I(inode)-> + u.s1.fragment_start_block, + SQUASHFS_I(inode)-> u.s1.fragment_size); + pageaddr = kmap_atomic(page, KM_USER0); + if (fragment) { + bytes = i_size_read(inode) & (sblk->block_size - 1); + memcpy(pageaddr, fragment->data + SQUASHFS_I(inode)-> + u.s1.fragment_offset, bytes); + release_cached_fragment(msblk, fragment); + } else + ERROR("Unable to read page, block %llx, size %x\n", + SQUASHFS_I(inode)-> + u.s1.fragment_start_block, (int) + SQUASHFS_I(inode)-> u.s1.fragment_size); } skip_read: memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes); - kunmap(page); - flush_dcache_page(page); - SetPageUptodate(page); - unlock_page(page); - - return 0; -} - - -#ifdef SQUASHFS_1_0_COMPATIBILITY -static int squashfs_readpage_lessthan4K(struct file *file, struct page *page) -{ - struct inode *inode = page->mapping->host; - squashfs_sb_info *msBlk = (squashfs_sb_info *)inode->i_sb->s_fs_info; - squashfs_super_block *sBlk = &msBlk->sBlk; - unsigned char block_list[SIZE]; - unsigned short *block_listp, block, bytes = 0; - int index = page->index << (PAGE_CACHE_SHIFT - sBlk->block_log); - int file_blocks = ((inode->i_size - 1) >> sBlk->block_log) + 1; - int readahead_blks = 1 << (PAGE_CACHE_SHIFT - sBlk->block_log); - void *pageaddr = kmap(page); - - int i_end = index + (1 << (PAGE_CACHE_SHIFT - sBlk->block_log)); - int byte; - - TRACE("Entered squashfs_readpage_lessthan4K, page index %x, start block %x\n", (unsigned int) page->index, - SQUASHFS_I(inode)->start_block); - - block = read_blocklist_1(inode, index, readahead_blks, block_list, &block_listp, NULL); - - if(i_end > file_blocks) - i_end = file_blocks; - - while(index < i_end) { - int c_byte = !SQUASHFS_COMPRESSED(*block_listp) ? SQUASHFS_COMPRESSED_SIZE(*block_listp) | SQUASHFS_COMPRESSED_BIT_BLOCK : *block_listp; - if(!(byte = read_data(inode->i_sb, pageaddr, block, c_byte, NULL))) { - ERROR("Unable to read page, block %x, size %x\n", block, *block_listp); - goto skip_read; - } - block += SQUASHFS_COMPRESSED_SIZE(*block_listp); - pageaddr += byte; - bytes += byte; - index ++; - block_listp ++; - } - -skip_read: - memset(pageaddr, 0, PAGE_CACHE_SIZE - bytes); - kunmap(page); + kunmap_atomic(pageaddr, KM_USER0); flush_dcache_page(page); SetPageUptodate(page); unlock_page(page); + kfree(block_list); return 0; } -#endif -static int get_dir_index_using_offset(struct super_block *s, unsigned int *next_block, - unsigned int *next_offset, unsigned int index_start, unsigned int index_offset, - int i_count, long long f_pos) +static int get_dir_index_using_offset(struct super_block *s, long long + *next_block, unsigned int *next_offset, + long long index_start, + unsigned int index_offset, int i_count, + long long f_pos) { - squashfs_sb_info *msBlk = (squashfs_sb_info *)s->s_fs_info; - squashfs_super_block *sBlk = &msBlk->sBlk; + struct squashfs_sb_info *msblk = s->s_fs_info; + struct squashfs_super_block *sblk = &msblk->sblk; int i, length = 0; - squashfs_dir_index index; + struct squashfs_dir_index index; - TRACE("Entered get_dir_index_using_offset, i_count %d, f_pos %d\n", i_count, (unsigned int) f_pos); + TRACE("Entered get_dir_index_using_offset, i_count %d, f_pos %d\n", + i_count, (unsigned int) f_pos); - if(f_pos == 0) - return 0; + f_pos =- 3; + if (f_pos == 0) + goto finish; - for(i = 0; i < i_count; i++) { - if(msBlk->swap) { - squashfs_dir_index sindex; - squashfs_get_cached_block(s, (char *) &sindex, index_start, index_offset, - sizeof(sindex), &index_start, &index_offset); + for (i = 0; i < i_count; i++) { + if (msblk->swap) { + struct squashfs_dir_index sindex; + squashfs_get_cached_block(s, (char *) &sindex, + index_start, index_offset, + sizeof(sindex), &index_start, + &index_offset); SQUASHFS_SWAP_DIR_INDEX(&index, &sindex); } else - squashfs_get_cached_block(s, (char *) &index, index_start, index_offset, - sizeof(index), &index_start, &index_offset); + squashfs_get_cached_block(s, (char *) &index, + index_start, index_offset, + sizeof(index), &index_start, + &index_offset); - if(index.index > f_pos) + if (index.index > f_pos) break; squashfs_get_cached_block(s, NULL, index_start, index_offset, - index.size + 1, &index_start, &index_offset); + index.size + 1, &index_start, + &index_offset); length = index.index; - *next_block = index.start_block + sBlk->directory_table_start; + *next_block = index.start_block + sblk->directory_table_start; } *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE; - return length; + +finish: + return length + 3; } -static int get_dir_index_using_name(struct super_block *s, unsigned int *next_block, - unsigned int *next_offset, unsigned int index_start, unsigned int index_offset, - int i_count, const char *name, int size) +static int get_dir_index_using_name(struct super_block *s, long long + *next_block, unsigned int *next_offset, + long long index_start, + unsigned int index_offset, int i_count, + const char *name, int size) { - squashfs_sb_info *msBlk = (squashfs_sb_info *)s->s_fs_info; - squashfs_super_block *sBlk = &msBlk->sBlk; + struct squashfs_sb_info *msblk = s->s_fs_info; + struct squashfs_super_block *sblk = &msblk->sblk; int i, length = 0; - char buffer[sizeof(squashfs_dir_index) + SQUASHFS_NAME_LEN + 1]; - squashfs_dir_index *index = (squashfs_dir_index *) buffer; - char str[SQUASHFS_NAME_LEN + 1]; + struct squashfs_dir_index *index; + char *str; TRACE("Entered get_dir_index_using_name, i_count %d\n", i_count); + if (!(str = kmalloc(sizeof(struct squashfs_dir_index) + + (SQUASHFS_NAME_LEN + 1) * 2, GFP_KERNEL))) { + ERROR("Failed to allocate squashfs_dir_index\n"); + goto failure; + } + + index = (struct squashfs_dir_index *) (str + SQUASHFS_NAME_LEN + 1); strncpy(str, name, size); str[size] = '\0'; - for(i = 0; i < i_count; i++) { - if(msBlk->swap) { - squashfs_dir_index sindex; - squashfs_get_cached_block(s, (char *) &sindex, index_start, index_offset, - sizeof(sindex), &index_start, &index_offset); + for (i = 0; i < i_count; i++) { + if (msblk->swap) { + struct squashfs_dir_index sindex; + squashfs_get_cached_block(s, (char *) &sindex, + index_start, index_offset, + sizeof(sindex), &index_start, + &index_offset); SQUASHFS_SWAP_DIR_INDEX(index, &sindex); } else - squashfs_get_cached_block(s, (char *) index, index_start, index_offset, - sizeof(squashfs_dir_index), &index_start, &index_offset); + squashfs_get_cached_block(s, (char *) index, + index_start, index_offset, + sizeof(struct squashfs_dir_index), + &index_start, &index_offset); - squashfs_get_cached_block(s, index->name, index_start, index_offset, - index->size + 1, &index_start, &index_offset); + squashfs_get_cached_block(s, index->name, index_start, + index_offset, index->size + 1, + &index_start, &index_offset); index->name[index->size + 1] = '\0'; - if(strcmp(index->name, str) > 0) + if (strcmp(index->name, str) > 0) break; length = index->index; - *next_block = index->start_block + sBlk->directory_table_start; + *next_block = index->start_block + sblk->directory_table_start; } *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE; - return length; + kfree(str); +failure: + return length + 3; } static int squashfs_readdir(struct file *file, void *dirent, filldir_t filldir) { struct inode *i = file->f_dentry->d_inode; - squashfs_sb_info *msBlk = (squashfs_sb_info *)i->i_sb->s_fs_info; - squashfs_super_block *sBlk = &msBlk->sBlk; - int next_block = SQUASHFS_I(i)->start_block + sBlk->directory_table_start, next_offset = - SQUASHFS_I(i)->offset, length = 0, dirs_read = 0, dir_count; - squashfs_dir_header dirh; - char buffer[sizeof(squashfs_dir_entry) + SQUASHFS_NAME_LEN + 1]; - squashfs_dir_entry *dire = (squashfs_dir_entry *) buffer; + struct squashfs_sb_info *msblk = i->i_sb->s_fs_info; + struct squashfs_super_block *sblk = &msblk->sblk; + long long next_block = SQUASHFS_I(i)->start_block + + sblk->directory_table_start; + int next_offset = SQUASHFS_I(i)->offset, length = 0, + dir_count; + struct squashfs_dir_header dirh; + struct squashfs_dir_entry *dire; + + TRACE("Entered squashfs_readdir [%llx:%x]\n", next_block, next_offset); + + if (!(dire = kmalloc(sizeof(struct squashfs_dir_entry) + + SQUASHFS_NAME_LEN + 1, GFP_KERNEL))) { + ERROR("Failed to allocate squashfs_dir_entry\n"); + goto finish; + } - TRACE("Entered squashfs_readdir [%x:%x]\n", next_block, next_offset); + while(file->f_pos < 3) { + char *name; + int size, i_ino; - lock_kernel(); + if(file->f_pos == 0) { + name = "."; + size = 1; + i_ino = i->i_ino; + } else { + name = ".."; + size = 2; + i_ino = SQUASHFS_I(i)->u.s2.parent_inode; + } + TRACE("Calling filldir(%x, %s, %d, %d, %d, %d)\n", + (unsigned int) dirent, name, size, (int) + file->f_pos, i_ino, + squashfs_filetype_table[1]); + + if (filldir(dirent, name, size, + file->f_pos, i_ino, + squashfs_filetype_table[1]) < 0) { + TRACE("Filldir returned less than 0\n"); + goto finish; + } + file->f_pos += size; + } - length = get_dir_index_using_offset(i->i_sb, &next_block, &next_offset, SQUASHFS_I(i)->u.s2.directory_index_start, - SQUASHFS_I(i)->u.s2.directory_index_offset, SQUASHFS_I(i)->u.s2.directory_index_count, file->f_pos); + length = get_dir_index_using_offset(i->i_sb, &next_block, &next_offset, + SQUASHFS_I(i)->u.s2.directory_index_start, + SQUASHFS_I(i)->u.s2.directory_index_offset, + SQUASHFS_I(i)->u.s2.directory_index_count, + file->f_pos); - while(length < i->i_size) { + while (length < i_size_read(i)) { /* read directory header */ - if(msBlk->swap) { - squashfs_dir_header sdirh; - if(!squashfs_get_cached_block(i->i_sb, (char *) &sdirh, next_block, - next_offset, sizeof(sdirh), &next_block, &next_offset)) + if (msblk->swap) { + struct squashfs_dir_header sdirh; + + if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh, + next_block, next_offset, sizeof(sdirh), + &next_block, &next_offset)) goto failed_read; + length += sizeof(sdirh); SQUASHFS_SWAP_DIR_HEADER(&dirh, &sdirh); } else { - if(!squashfs_get_cached_block(i->i_sb, (char *) &dirh, next_block, - next_offset, sizeof(dirh), &next_block, &next_offset)) + if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh, + next_block, next_offset, sizeof(dirh), + &next_block, &next_offset)) goto failed_read; + length += sizeof(dirh); } dir_count = dirh.count + 1; - while(dir_count--) { - if(msBlk->swap) { - squashfs_dir_entry sdire; - if(!squashfs_get_cached_block(i->i_sb, (char *) &sdire, next_block, - next_offset, sizeof(sdire), &next_block, &next_offset)) + while (dir_count--) { + if (msblk->swap) { + struct squashfs_dir_entry sdire; + if (!squashfs_get_cached_block(i->i_sb, (char *) + &sdire, next_block, next_offset, + sizeof(sdire), &next_block, + &next_offset)) goto failed_read; + length += sizeof(sdire); SQUASHFS_SWAP_DIR_ENTRY(dire, &sdire); } else { - if(!squashfs_get_cached_block(i->i_sb, (char *) dire, next_block, - next_offset, sizeof(*dire), &next_block, &next_offset)) + if (!squashfs_get_cached_block(i->i_sb, (char *) + dire, next_block, next_offset, + sizeof(*dire), &next_block, + &next_offset)) goto failed_read; + length += sizeof(*dire); } - if(!squashfs_get_cached_block(i->i_sb, dire->name, next_block, - next_offset, dire->size + 1, &next_block, &next_offset)) + if (!squashfs_get_cached_block(i->i_sb, dire->name, + next_block, next_offset, + dire->size + 1, &next_block, + &next_offset)) goto failed_read; + length += dire->size + 1; - if(file->f_pos >= length) + if (file->f_pos >= length) continue; dire->name[dire->size + 1] = '\0'; - TRACE("Calling filldir(%x, %s, %d, %d, %x:%x, %d)\n", (unsigned int) dirent, - dire->name, dire->size + 1, (int) file->f_pos, - dirh.start_block, dire->offset, squashfs_filetype_table[dire->type]); - - if(filldir(dirent, dire->name, dire->size + 1, file->f_pos, SQUASHFS_MK_VFS_INODE(dirh.start_block, - dire->offset), squashfs_filetype_table[dire->type]) < 0) { + TRACE("Calling filldir(%x, %s, %d, %d, %x:%x, %d, %d)\n", + (unsigned int) dirent, dire->name, + dire->size + 1, (int) file->f_pos, + dirh.start_block, dire->offset, + dirh.inode_number + dire->inode_number, + squashfs_filetype_table[dire->type]); + + if (filldir(dirent, dire->name, dire->size + 1, + file->f_pos, + dirh.inode_number + dire->inode_number, + squashfs_filetype_table[dire->type]) + < 0) { TRACE("Filldir returned less than 0\n"); - unlock_kernel(); - return dirs_read; + goto finish; } - file->f_pos = length; - dirs_read ++; } } - unlock_kernel(); - return dirs_read; +finish: + kfree(dire); + return 0; failed_read: - unlock_kernel(); - ERROR("Unable to read directory block [%x:%x]\n", next_block, next_offset); + ERROR("Unable to read directory block [%llx:%x]\n", next_block, + next_offset); return 0; } -static struct dentry *squashfs_lookup(struct inode *i, struct dentry *dentry, struct nameidata *nd) +static struct dentry *squashfs_lookup(struct inode *i, struct dentry *dentry, + struct nameidata *nd) { - const unsigned char *name =dentry->d_name.name; + const unsigned char *name = dentry->d_name.name; int len = dentry->d_name.len; struct inode *inode = NULL; - squashfs_sb_info *msBlk = (squashfs_sb_info *)i->i_sb->s_fs_info; - squashfs_super_block *sBlk = &msBlk->sBlk; - int next_block = SQUASHFS_I(i)->start_block + sBlk->directory_table_start, next_offset = - SQUASHFS_I(i)->offset, length = 0, dir_count; - squashfs_dir_header dirh; - char buffer[sizeof(squashfs_dir_entry) + SQUASHFS_NAME_LEN]; - squashfs_dir_entry *dire = (squashfs_dir_entry *) buffer; - int squashfs_2_1 = sBlk->s_major == 2 && sBlk->s_minor == 1; - - TRACE("Entered squashfs_lookup [%x:%x]\n", next_block, next_offset); + struct squashfs_sb_info *msblk = i->i_sb->s_fs_info; + struct squashfs_super_block *sblk = &msblk->sblk; + long long next_block = SQUASHFS_I(i)->start_block + + sblk->directory_table_start; + int next_offset = SQUASHFS_I(i)->offset, length = 0, + dir_count; + struct squashfs_dir_header dirh; + struct squashfs_dir_entry *dire; + + TRACE("Entered squashfs_lookup [%llx:%x]\n", next_block, next_offset); + + if (!(dire = kmalloc(sizeof(struct squashfs_dir_entry) + + SQUASHFS_NAME_LEN + 1, GFP_KERNEL))) { + ERROR("Failed to allocate squashfs_dir_entry\n"); + goto exit_loop; + } - lock_kernel(); + if (len > SQUASHFS_NAME_LEN) + goto exit_loop; - length = get_dir_index_using_name(i->i_sb, &next_block, &next_offset, SQUASHFS_I(i)->u.s2.directory_index_start, - SQUASHFS_I(i)->u.s2.directory_index_offset, SQUASHFS_I(i)->u.s2.directory_index_count, name, len); + length = get_dir_index_using_name(i->i_sb, &next_block, &next_offset, + SQUASHFS_I(i)->u.s2.directory_index_start, + SQUASHFS_I(i)->u.s2.directory_index_offset, + SQUASHFS_I(i)->u.s2.directory_index_count, name, + len); - while(length < i->i_size) { + while (length < i_size_read(i)) { /* read directory header */ - if(msBlk->swap) { - squashfs_dir_header sdirh; - if(!squashfs_get_cached_block(i->i_sb, (char *) &sdirh, next_block, next_offset, - sizeof(sdirh), &next_block, &next_offset)) + if (msblk->swap) { + struct squashfs_dir_header sdirh; + if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh, + next_block, next_offset, sizeof(sdirh), + &next_block, &next_offset)) goto failed_read; + length += sizeof(sdirh); SQUASHFS_SWAP_DIR_HEADER(&dirh, &sdirh); } else { - if(!squashfs_get_cached_block(i->i_sb, (char *) &dirh, next_block, next_offset, - sizeof(dirh), &next_block, &next_offset)) + if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh, + next_block, next_offset, sizeof(dirh), + &next_block, &next_offset)) goto failed_read; + length += sizeof(dirh); } dir_count = dirh.count + 1; - while(dir_count--) { - if(msBlk->swap) { - squashfs_dir_entry sdire; - if(!squashfs_get_cached_block(i->i_sb, (char *) &sdire, - next_block,next_offset, sizeof(sdire), &next_block, &next_offset)) + while (dir_count--) { + if (msblk->swap) { + struct squashfs_dir_entry sdire; + if (!squashfs_get_cached_block(i->i_sb, (char *) + &sdire, next_block,next_offset, + sizeof(sdire), &next_block, + &next_offset)) goto failed_read; + length += sizeof(sdire); SQUASHFS_SWAP_DIR_ENTRY(dire, &sdire); } else { - if(!squashfs_get_cached_block(i->i_sb, (char *) dire, - next_block,next_offset, sizeof(*dire), &next_block, &next_offset)) + if (!squashfs_get_cached_block(i->i_sb, (char *) + dire, next_block,next_offset, + sizeof(*dire), &next_block, + &next_offset)) goto failed_read; + length += sizeof(*dire); } - if(!squashfs_get_cached_block(i->i_sb, dire->name, - next_block, next_offset, dire->size + 1, &next_block, &next_offset)) + if (!squashfs_get_cached_block(i->i_sb, dire->name, + next_block, next_offset, dire->size + 1, + &next_block, &next_offset)) goto failed_read; + length += dire->size + 1; - if(squashfs_2_1 && name[0] < dire->name[0]) + if (name[0] < dire->name[0]) goto exit_loop; - if((len == dire->size + 1) && !strncmp(name, dire->name, len)) { - squashfs_inode ino = SQUASHFS_MKINODE(dirh.start_block, dire->offset); + if ((len == dire->size + 1) && !strncmp(name, + dire->name, len)) { + squashfs_inode_t ino = + SQUASHFS_MKINODE(dirh.start_block, + dire->offset); - TRACE("calling squashfs_iget for directory entry %s, inode %x:%x\n", - name, dirh.start_block, dire->offset); + TRACE("calling squashfs_iget for directory " + "entry %s, inode %x:%x, %d\n", name, + dirh.start_block, dire->offset, + dirh.inode_number + dire->inode_number); - inode = (msBlk->iget)(i->i_sb, ino); + inode = (msblk->iget)(i->i_sb, ino); goto exit_loop; } @@ -1673,12 +2025,13 @@ static struct dentry *squashfs_lookup(struct inode *i, struct dentry *dentry, st } exit_loop: + kfree(dire); d_add(dentry, inode); - unlock_kernel(); return ERR_PTR(0); failed_read: - ERROR("Unable to read directory block [%x:%x]\n", next_block, next_offset); + ERROR("Unable to read directory block [%llx:%x]\n", next_block, + next_offset); goto exit_loop; } @@ -1687,62 +2040,57 @@ static void squashfs_put_super(struct super_block *s) { int i; - if(s->s_fs_info) { - squashfs_sb_info *sbi = (squashfs_sb_info *) s->s_fs_info; - if(sbi->block_cache) { - for(i = 0; i < SQUASHFS_CACHED_BLKS; i++) - if(sbi->block_cache[i].block != SQUASHFS_INVALID_BLK) + if (s->s_fs_info) { + struct squashfs_sb_info *sbi = s->s_fs_info; + if (sbi->block_cache) + for (i = 0; i < SQUASHFS_CACHED_BLKS; i++) + if (sbi->block_cache[i].block != + SQUASHFS_INVALID_BLK) kfree(sbi->block_cache[i].data); - kfree(sbi->block_cache); - } - if(sbi->read_data) kfree(sbi->read_data); - if(sbi->read_page) kfree(sbi->read_page); - if(sbi->uid) kfree(sbi->uid); - if(sbi->fragment) { - for(i = 0; i < SQUASHFS_CACHED_FRAGMENTS; i++) - if(sbi->fragment[i].data != NULL) - SQUASHFS_FREE(sbi->fragment[i].data); - kfree(sbi->fragment); - } - if(sbi->fragment_index) kfree(sbi->fragment_index); + if (sbi->fragment) + for (i = 0; i < SQUASHFS_CACHED_FRAGMENTS; i++) + SQUASHFS_FREE(sbi->fragment[i].data); + kfree(sbi->fragment); + kfree(sbi->block_cache); + kfree(sbi->read_data); + kfree(sbi->read_page); + kfree(sbi->uid); + kfree(sbi->fragment_index); + kfree(sbi->fragment_index_2); + kfree(sbi->meta_index); + vfree(sbi->stream.workspace); kfree(s->s_fs_info); s->s_fs_info = NULL; } } -static struct super_block *squashfs_get_sb(struct file_system_type *fs_type, int flags, const char *dev_name, void *data) +static int squashfs_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_bdev(fs_type, flags, dev_name, data, squashfs_fill_super); + return get_sb_bdev(fs_type, flags, dev_name, data, squashfs_fill_super, mnt); } static int __init init_squashfs_fs(void) { int err = init_inodecache(); - if(err) - return err; - - printk(KERN_INFO "Squashfs 2.2-r2 (released 2005/09/08) (C) 2002-2005 Phillip Lougher\n"); + if (err) + goto out; - if(!(stream.workspace = (char *) vmalloc(zlib_inflate_workspacesize()))) { - ERROR("Failed to allocate zlib workspace\n"); - destroy_inodecache(); - return -ENOMEM; - } + printk(KERN_INFO "squashfs: version 3.1 (2006/08/09) " + "Phillip Lougher\n"); - if((err = register_filesystem(&squashfs_fs_type))) { - vfree(stream.workspace); + if ((err = register_filesystem(&squashfs_fs_type))) destroy_inodecache(); - } +out: return err; } static void __exit exit_squashfs_fs(void) { - vfree(stream.workspace); unregister_filesystem(&squashfs_fs_type); destroy_inodecache(); } @@ -1754,7 +2102,7 @@ static kmem_cache_t * squashfs_inode_cachep; static struct inode *squashfs_alloc_inode(struct super_block *sb) { struct squashfs_inode_info *ei; - ei = (struct squashfs_inode_info *)kmem_cache_alloc(squashfs_inode_cachep, SLAB_KERNEL); + ei = kmem_cache_alloc(squashfs_inode_cachep, SLAB_KERNEL); if (!ei) return NULL; return &ei->vfs_inode; @@ -1769,20 +2117,20 @@ static void squashfs_destroy_inode(struct inode *inode) static void init_once(void * foo, kmem_cache_t * cachep, unsigned long flags) { - struct squashfs_inode_info *ei = (struct squashfs_inode_info *) foo; + struct squashfs_inode_info *ei = foo; if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) == - SLAB_CTOR_CONSTRUCTOR) + SLAB_CTOR_CONSTRUCTOR) inode_init_once(&ei->vfs_inode); } -static int init_inodecache(void) +static int __init init_inodecache(void) { squashfs_inode_cachep = kmem_cache_create("squashfs_inode_cache", - sizeof(struct squashfs_inode_info), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, - init_once, NULL); + sizeof(struct squashfs_inode_info), + 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + init_once, NULL); if (squashfs_inode_cachep == NULL) return -ENOMEM; return 0; @@ -1792,12 +2140,13 @@ static int init_inodecache(void) static void destroy_inodecache(void) { if (kmem_cache_destroy(squashfs_inode_cachep)) - printk(KERN_INFO "squashfs_inode_cache: not all structures were freed\n"); + printk(KERN_INFO "squashfs_inode_cache: not all structures " + "were freed\n"); } module_init(init_squashfs_fs); module_exit(exit_squashfs_fs); MODULE_DESCRIPTION("squashfs, a compressed read-only filesystem"); -MODULE_AUTHOR("Phillip Lougher "); +MODULE_AUTHOR("Phillip Lougher "); MODULE_LICENSE("GPL"); diff --git a/fs/stat.c b/fs/stat.c index b8babca88..c592ee599 100644 --- a/fs/stat.c +++ b/fs/stat.c @@ -4,7 +4,6 @@ * Copyright (C) 1991, 1992 Linus Torvalds */ -#include #include #include #include @@ -15,6 +14,7 @@ #include #include #include +#include #include #include @@ -34,7 +34,7 @@ void generic_fillattr(struct inode *inode, struct kstat *stat) stat->ctime = inode->i_ctime; stat->size = i_size_read(inode); stat->blocks = inode->i_blocks; - stat->blksize = inode->i_blksize; + stat->blksize = PAGE_CACHE_SIZE; } EXPORT_SYMBOL(generic_fillattr); @@ -141,6 +141,8 @@ static int cp_old_stat(struct kstat *stat, struct __old_kernel_stat __user * sta memset(&tmp, 0, sizeof(struct __old_kernel_stat)); tmp.st_dev = old_encode_dev(stat->dev); tmp.st_ino = stat->ino; + if (sizeof(tmp.st_ino) < sizeof(stat->ino) && tmp.st_ino != stat->ino) + return -EOVERFLOW; tmp.st_mode = stat->mode; tmp.st_nlink = stat->nlink; if (tmp.st_nlink != stat->nlink) @@ -211,6 +213,8 @@ static int cp_new_stat(struct kstat *stat, struct stat __user *statbuf) tmp.st_dev = new_encode_dev(stat->dev); #endif tmp.st_ino = stat->ino; + if (sizeof(tmp.st_ino) < sizeof(stat->ino) && tmp.st_ino != stat->ino) + return -EOVERFLOW; tmp.st_mode = stat->mode; tmp.st_nlink = stat->nlink; if (tmp.st_nlink != stat->nlink) @@ -348,6 +352,8 @@ static long cp_new_stat64(struct kstat *stat, struct stat64 __user *statbuf) tmp.st_rdev = huge_encode_dev(stat->rdev); #endif tmp.st_ino = stat->ino; + if (sizeof(tmp.st_ino) < sizeof(stat->ino) && tmp.st_ino != stat->ino) + return -EOVERFLOW; #ifdef STAT64_HAS_BROKEN_ST_INO tmp.__st_ino = stat->ino; #endif diff --git a/fs/super.c b/fs/super.c index d32503631..d3c66fb31 100644 --- a/fs/super.c +++ b/fs/super.c @@ -20,7 +20,6 @@ * Heavily rewritten for 'one fs - one tree' dcache architecture. AV, Mar 2000 */ -#include #include #include #include @@ -52,11 +51,12 @@ DEFINE_SPINLOCK(sb_lock); /** * alloc_super - create new superblock + * @type: filesystem type superblock should belong to * * Allocates and initializes a new &struct super_block. alloc_super() * returns a pointer new superblock or %NULL if allocation had failed. */ -static struct super_block *alloc_super(void) +static struct super_block *alloc_super(struct file_system_type *type) { struct super_block *s = kzalloc(sizeof(struct super_block), GFP_USER); static struct super_operations default_op; @@ -75,6 +75,13 @@ static struct super_block *alloc_super(void) INIT_LIST_HEAD(&s->s_inodes); init_rwsem(&s->s_umount); mutex_init(&s->s_lock); + lockdep_set_class(&s->s_umount, &type->s_umount_key); + /* + * The locking rules for s_lock are up to the + * filesystem. For example ext3fs has different + * lock ordering than usbfs: + */ + lockdep_set_class(&s->s_lock, &type->s_lock_key); down_write(&s->s_umount); s->s_count = S_BIAS; atomic_set(&s->s_active, 1); @@ -224,17 +231,17 @@ static int grab_super(struct super_block *s) * that need destruction out of superblock, call generic_shutdown_super() * and release aforementioned objects. Note: dentries and inodes _are_ * taken care of and do not need specific handling. + * + * Upon calling this function, the filesystem may no longer alter or + * rearrange the set of dentries belonging to this super_block, nor may it + * change the attachments of dentries to inodes. */ void generic_shutdown_super(struct super_block *sb) { - struct dentry *root = sb->s_root; struct super_operations *sop = sb->s_op; - if (root) { - sb->s_root = NULL; - shrink_dcache_parent(root); - shrink_dcache_anon(&sb->s_anon); - dput(root); + if (sb->s_root) { + shrink_dcache_for_umount(sb); fsync_super(sb); lock_super(sb); sb->s_flags &= ~MS_ACTIVE; @@ -298,7 +305,7 @@ retry: } if (!s) { spin_unlock(&sb_lock); - s = alloc_super(); + s = alloc_super(type); if (!s) return ERR_PTR(-ENOMEM); goto retry; @@ -488,7 +495,7 @@ asmlinkage long sys_ustat(unsigned dev, struct ustat __user * ubuf) s = user_get_super(new_decode_dev(dev)); if (s == NULL) goto out; - err = vfs_statfs(s, &sbuf); + err = vfs_statfs(s->s_root, &sbuf); drop_super(s); if (err) goto out; @@ -678,9 +685,10 @@ static void bdev_uevent(struct block_device *bdev, enum kobject_action action) } } -struct super_block *get_sb_bdev(struct file_system_type *fs_type, +int get_sb_bdev(struct file_system_type *fs_type, int flags, const char *dev_name, void *data, - int (*fill_super)(struct super_block *, void *, int)) + int (*fill_super)(struct super_block *, void *, int), + struct vfsmount *mnt) { struct block_device *bdev; struct super_block *s; @@ -688,7 +696,7 @@ struct super_block *get_sb_bdev(struct file_system_type *fs_type, bdev = open_bdev_excl(dev_name, flags, fs_type); if (IS_ERR(bdev)) - return (struct super_block *)bdev; + return PTR_ERR(bdev); /* * once the super is inserted into the list by sget, s_umount @@ -699,15 +707,17 @@ struct super_block *get_sb_bdev(struct file_system_type *fs_type, s = sget(fs_type, test_bdev_super, set_bdev_super, bdev); mutex_unlock(&bdev->bd_mount_mutex); if (IS_ERR(s)) - goto out; + goto error_s; if (s->s_root) { if ((flags ^ s->s_flags) & MS_RDONLY) { up_write(&s->s_umount); deactivate_super(s); - s = ERR_PTR(-EBUSY); + error = -EBUSY; + goto error_bdev; } - goto out; + + close_bdev_excl(bdev); } else { char b[BDEVNAME_SIZE]; @@ -718,18 +728,21 @@ struct super_block *get_sb_bdev(struct file_system_type *fs_type, if (error) { up_write(&s->s_umount); deactivate_super(s); - s = ERR_PTR(error); - } else { - s->s_flags |= MS_ACTIVE; - bdev_uevent(bdev, KOBJ_MOUNT); + goto error; } + + s->s_flags |= MS_ACTIVE; + bdev_uevent(bdev, KOBJ_MOUNT); } - return s; + return simple_set_mnt(mnt, s); -out: +error_s: + error = PTR_ERR(s); +error_bdev: close_bdev_excl(bdev); - return s; +error: + return error; } EXPORT_SYMBOL(get_sb_bdev); @@ -746,15 +759,16 @@ void kill_block_super(struct super_block *sb) EXPORT_SYMBOL(kill_block_super); -struct super_block *get_sb_nodev(struct file_system_type *fs_type, +int get_sb_nodev(struct file_system_type *fs_type, int flags, void *data, - int (*fill_super)(struct super_block *, void *, int)) + int (*fill_super)(struct super_block *, void *, int), + struct vfsmount *mnt) { int error; struct super_block *s = sget(fs_type, NULL, set_anon_super, NULL); if (IS_ERR(s)) - return s; + return PTR_ERR(s); s->s_flags = flags; @@ -762,10 +776,10 @@ struct super_block *get_sb_nodev(struct file_system_type *fs_type, if (error) { up_write(&s->s_umount); deactivate_super(s); - return ERR_PTR(error); + return error; } s->s_flags |= MS_ACTIVE; - return s; + return simple_set_mnt(mnt, s); } EXPORT_SYMBOL(get_sb_nodev); @@ -775,107 +789,116 @@ static int compare_single(struct super_block *s, void *p) return 1; } -struct super_block *get_sb_single(struct file_system_type *fs_type, +int get_sb_single(struct file_system_type *fs_type, int flags, void *data, - int (*fill_super)(struct super_block *, void *, int)) + int (*fill_super)(struct super_block *, void *, int), + struct vfsmount *mnt) { struct super_block *s; int error; s = sget(fs_type, compare_single, set_anon_super, NULL); if (IS_ERR(s)) - return s; + return PTR_ERR(s); if (!s->s_root) { s->s_flags = flags; error = fill_super(s, data, flags & MS_SILENT ? 1 : 0); if (error) { up_write(&s->s_umount); deactivate_super(s); - return ERR_PTR(error); + return error; } s->s_flags |= MS_ACTIVE; } do_remount_sb(s, flags, data, 0); - return s; + return simple_set_mnt(mnt, s); } EXPORT_SYMBOL(get_sb_single); struct vfsmount * -do_kern_mount(const char *fstype, int flags, const char *name, void *data) +vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void *data) { - struct file_system_type *type = get_fs_type(fstype); - struct super_block *sb; struct vfsmount *mnt; - int error; + struct super_block *sb; char *secdata = NULL; + int error; if (!type) return ERR_PTR(-ENODEV); - sb = ERR_PTR(-EPERM); - if ((type->fs_flags & FS_BINARY_MOUNTDATA) && - !vx_capable(CAP_SYS_ADMIN, VXC_BINARY_MOUNT)) - goto out; - - sb = ERR_PTR(-ENOMEM); + error = -ENOMEM; mnt = alloc_vfsmnt(name); if (!mnt) goto out; if (data) { secdata = alloc_secdata(); - if (!secdata) { - sb = ERR_PTR(-ENOMEM); + if (!secdata) goto out_mnt; - } error = security_sb_copy_data(type, data, secdata); - if (error) { - sb = ERR_PTR(error); + if (error) goto out_free_secdata; - } } - sb = type->get_sb(type, flags, name, data); - if (IS_ERR(sb)) + error = type->get_sb(type, flags, name, data, mnt); + if (error < 0) goto out_free_secdata; + sb = mnt->mnt_sb; error = -EPERM; if (!capable(CAP_SYS_ADMIN) && !sb->s_bdev && (sb->s_magic != PROC_SUPER_MAGIC) && (sb->s_magic != DEVPTS_SUPER_MAGIC)) goto out_sb; - error = security_sb_kern_mount(sb, secdata); + error = security_sb_kern_mount(sb, secdata); if (error) goto out_sb; - mnt->mnt_sb = sb; - mnt->mnt_root = dget(sb->s_root); - mnt->mnt_mountpoint = sb->s_root; + + mnt->mnt_mountpoint = mnt->mnt_root; mnt->mnt_parent = mnt; - up_write(&sb->s_umount); + up_write(&mnt->mnt_sb->s_umount); free_secdata(secdata); - put_filesystem(type); return mnt; out_sb: - up_write(&sb->s_umount); - deactivate_super(sb); - sb = ERR_PTR(error); + dput(mnt->mnt_root); + up_write(&mnt->mnt_sb->s_umount); + deactivate_super(mnt->mnt_sb); out_free_secdata: free_secdata(secdata); out_mnt: free_vfsmnt(mnt); out: - put_filesystem(type); - return (struct vfsmount *)sb; + return ERR_PTR(error); } -EXPORT_SYMBOL_GPL(do_kern_mount); +EXPORT_SYMBOL_GPL(vfs_kern_mount); + +struct vfsmount * +do_kern_mount(const char *fstype, int flags, const char *name, void *data) +{ + struct file_system_type *type = get_fs_type(fstype); + struct vfsmount *mnt; + + if (!type) + return ERR_PTR(-ENODEV); + + mnt = ERR_PTR(-EPERM); + if ((type->fs_flags & FS_BINARY_MOUNTDATA) && + !vx_capable(CAP_SYS_ADMIN, VXC_BINARY_MOUNT)) + goto out_put; + + mnt = vfs_kern_mount(type, flags, name, data); +out_put: + put_filesystem(type); + return mnt; +} struct vfsmount *kern_mount(struct file_system_type *type) { - return do_kern_mount(type->name, 0, type->name, NULL); + return vfs_kern_mount(type, 0, type->name, NULL); } EXPORT_SYMBOL(kern_mount); diff --git a/fs/sync.c b/fs/sync.c index aab5ffe77..955aef04d 100644 --- a/fs/sync.c +++ b/fs/sync.c @@ -100,7 +100,7 @@ asmlinkage long sys_sync_file_range(int fd, loff_t offset, loff_t nbytes, } if (nbytes == 0) - endbyte = -1; + endbyte = LLONG_MAX; else endbyte--; /* inclusive */ diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c index 610b5bdbe..61c42430c 100644 --- a/fs/sysfs/dir.c +++ b/fs/sysfs/dir.c @@ -430,10 +430,9 @@ static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir) i++; /* fallthrough */ default: - if (filp->f_pos == 2) { - list_del(q); - list_add(q, &parent_sd->s_children); - } + if (filp->f_pos == 2) + list_move(q, &parent_sd->s_children); + for (p=q->next; p!= &parent_sd->s_children; p=p->next) { struct sysfs_dirent *next; const char * name; @@ -455,8 +454,7 @@ static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir) dt_type(next)) < 0) return 0; - list_del(q); - list_add(q, p); + list_move(q, p); p = q; filp->f_pos++; } diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c index da0b930e8..222910ee8 100644 --- a/fs/sysfs/file.c +++ b/fs/sysfs/file.c @@ -490,11 +490,6 @@ int sysfs_update_file(struct kobject * kobj, const struct attribute * attr) (victim->d_parent->d_inode == dir->d_inode)) { victim->d_inode->i_mtime = CURRENT_TIME; fsnotify_modify(victim); - - /** - * Drop reference from initial sysfs_get_dentry(). - */ - dput(victim); res = 0; } else d_drop(victim); diff --git a/fs/sysfs/inode.c b/fs/sysfs/inode.c index f0b347bd1..44ea5a03a 100644 --- a/fs/sysfs/inode.c +++ b/fs/sysfs/inode.c @@ -16,7 +16,7 @@ extern struct super_block * sysfs_sb; -static struct address_space_operations sysfs_aops = { +static const struct address_space_operations sysfs_aops = { .readpage = simple_readpage, .prepare_write = simple_prepare_write, .commit_write = simple_commit_write @@ -109,15 +109,26 @@ static inline void set_inode_attr(struct inode * inode, struct iattr * iattr) inode->i_ctime = iattr->ia_ctime; } + +/* + * sysfs has a different i_mutex lock order behavior for i_mutex than other + * filesystems; sysfs i_mutex is called in many places with subsystem locks + * held. At the same time, many of the VFS locking rules do not apply to + * sysfs at all (cross directory rename for example). To untangle this mess + * (which gives false positives in lockdep), we're giving sysfs inodes their + * own class for i_mutex. + */ +static struct lock_class_key sysfs_inode_imutex_key; + struct inode * sysfs_new_inode(mode_t mode, struct sysfs_dirent * sd) { struct inode * inode = new_inode(sysfs_sb); if (inode) { - inode->i_blksize = PAGE_CACHE_SIZE; inode->i_blocks = 0; inode->i_mapping->a_ops = &sysfs_aops; inode->i_mapping->backing_dev_info = &sysfs_backing_dev_info; inode->i_op = &sysfs_inode_operations; + lockdep_set_class(&inode->i_mutex, &sysfs_inode_imutex_key); if (sd->s_iattr) { /* sysfs_dirent has non-default attributes diff --git a/fs/sysfs/mount.c b/fs/sysfs/mount.c index ea01b08fb..19662d00a 100644 --- a/fs/sysfs/mount.c +++ b/fs/sysfs/mount.c @@ -64,10 +64,10 @@ static int sysfs_fill_super(struct super_block *sb, void *data, int silent) return 0; } -static struct super_block *sysfs_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int sysfs_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_single(fs_type, flags, data, sysfs_fill_super); + return get_sb_single(fs_type, flags, data, sysfs_fill_super, mnt); } static struct file_system_type sysfs_fs_type = { diff --git a/fs/sysv/dir.c b/fs/sysv/dir.c index d7074341e..f2bef962d 100644 --- a/fs/sysv/dir.c +++ b/fs/sysv/dir.c @@ -53,8 +53,7 @@ static int dir_commit_chunk(struct page *page, unsigned from, unsigned to) static struct page * dir_get_page(struct inode *dir, unsigned long n) { struct address_space *mapping = dir->i_mapping; - struct page *page = read_cache_page(mapping, n, - (filler_t*)mapping->a_ops->readpage, NULL); + struct page *page = read_mapping_page(mapping, n, NULL); if (!IS_ERR(page)) { wait_on_page_locked(page); kmap(page); diff --git a/fs/sysv/ialloc.c b/fs/sysv/ialloc.c index 9b585d108..115ab0d6f 100644 --- a/fs/sysv/ialloc.c +++ b/fs/sysv/ialloc.c @@ -170,7 +170,7 @@ struct inode * sysv_new_inode(const struct inode * dir, mode_t mode) inode->i_uid = current->fsuid; inode->i_ino = fs16_to_cpu(sbi, ino); inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC; - inode->i_blocks = inode->i_blksize = 0; + inode->i_blocks = 0; memset(SYSV_I(inode)->i_data, 0, sizeof(SYSV_I(inode)->i_data)); SYSV_I(inode)->i_dir_start_lookup = 0; insert_inode_hash(inode); diff --git a/fs/sysv/inode.c b/fs/sysv/inode.c index 3ff89cc58..d63c5e48b 100644 --- a/fs/sysv/inode.c +++ b/fs/sysv/inode.c @@ -85,8 +85,9 @@ static void sysv_put_super(struct super_block *sb) kfree(sbi); } -static int sysv_statfs(struct super_block *sb, struct kstatfs *buf) +static int sysv_statfs(struct dentry *dentry, struct kstatfs *buf) { + struct super_block *sb = dentry->d_sb; struct sysv_sb_info *sbi = SYSV_SB(sb); buf->f_type = sb->s_magic; @@ -200,7 +201,7 @@ static void sysv_read_inode(struct inode *inode) inode->i_ctime.tv_nsec = 0; inode->i_atime.tv_nsec = 0; inode->i_mtime.tv_nsec = 0; - inode->i_blocks = inode->i_blksize = 0; + inode->i_blocks = 0; si = SYSV_I(inode); for (block = 0; block < 10+1+1+1; block++) diff --git a/fs/sysv/itree.c b/fs/sysv/itree.c index 86f5f8d43..f2bcccd1d 100644 --- a/fs/sysv/itree.c +++ b/fs/sysv/itree.c @@ -465,7 +465,7 @@ static sector_t sysv_bmap(struct address_space *mapping, sector_t block) { return generic_block_bmap(mapping,block,get_block); } -struct address_space_operations sysv_aops = { +const struct address_space_operations sysv_aops = { .readpage = sysv_readpage, .writepage = sysv_writepage, .sync_page = block_sync_page, diff --git a/fs/sysv/super.c b/fs/sysv/super.c index e92b991e6..876639b93 100644 --- a/fs/sysv/super.c +++ b/fs/sysv/super.c @@ -506,16 +506,17 @@ failed: /* Every kernel module contains stuff like this. */ -static struct super_block *sysv_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int sysv_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_bdev(fs_type, flags, dev_name, data, sysv_fill_super); + return get_sb_bdev(fs_type, flags, dev_name, data, sysv_fill_super, + mnt); } -static struct super_block *v7_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int v7_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_bdev(fs_type, flags, dev_name, data, v7_fill_super); + return get_sb_bdev(fs_type, flags, dev_name, data, v7_fill_super, mnt); } static struct file_system_type sysv_fs_type = { diff --git a/fs/sysv/sysv.h b/fs/sysv/sysv.h index 393a480e4..9dcc82120 100644 --- a/fs/sysv/sysv.h +++ b/fs/sysv/sysv.h @@ -161,7 +161,7 @@ extern struct inode_operations sysv_dir_inode_operations; extern struct inode_operations sysv_fast_symlink_inode_operations; extern const struct file_operations sysv_file_operations; extern const struct file_operations sysv_dir_operations; -extern struct address_space_operations sysv_aops; +extern const struct address_space_operations sysv_aops; extern struct super_operations sysv_sops; extern struct dentry_operations sysv_dentry_operations; diff --git a/fs/udf/file.c b/fs/udf/file.c index e34b00e30..a59e5f33d 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c @@ -95,7 +95,7 @@ static int udf_adinicb_commit_write(struct file *file, struct page *page, unsign return 0; } -struct address_space_operations udf_adinicb_aops = { +const struct address_space_operations udf_adinicb_aops = { .readpage = udf_adinicb_readpage, .writepage = udf_adinicb_writepage, .sync_page = block_sync_page, diff --git a/fs/udf/ialloc.c b/fs/udf/ialloc.c index 3873c672c..d954d266c 100644 --- a/fs/udf/ialloc.c +++ b/fs/udf/ialloc.c @@ -75,6 +75,12 @@ struct inode * udf_new_inode (struct inode *dir, int mode, int * err) } *err = -ENOSPC; + UDF_I_UNIQUE(inode) = 0; + UDF_I_LENEXTENTS(inode) = 0; + UDF_I_NEXT_ALLOC_BLOCK(inode) = 0; + UDF_I_NEXT_ALLOC_GOAL(inode) = 0; + UDF_I_STRAT4096(inode) = 0; + block = udf_new_block(dir->i_sb, NULL, UDF_I_LOCATION(dir).partitionReferenceNum, start, err); if (*err) @@ -84,11 +90,6 @@ struct inode * udf_new_inode (struct inode *dir, int mode, int * err) } mutex_lock(&sbi->s_alloc_mutex); - UDF_I_UNIQUE(inode) = 0; - UDF_I_LENEXTENTS(inode) = 0; - UDF_I_NEXT_ALLOC_BLOCK(inode) = 0; - UDF_I_NEXT_ALLOC_GOAL(inode) = 0; - UDF_I_STRAT4096(inode) = 0; if (UDF_SB_LVIDBH(sb)) { struct logicalVolHeaderDesc *lvhd; @@ -120,7 +121,6 @@ struct inode * udf_new_inode (struct inode *dir, int mode, int * err) UDF_I_LOCATION(inode).logicalBlockNum = block; UDF_I_LOCATION(inode).partitionReferenceNum = UDF_I_LOCATION(dir).partitionReferenceNum; inode->i_ino = udf_get_lb_pblock(sb, UDF_I_LOCATION(inode), 0); - inode->i_blksize = PAGE_SIZE; inode->i_blocks = 0; UDF_I_LENEATTR(inode) = 0; UDF_I_LENALLOC(inode) = 0; diff --git a/fs/udf/inode.c b/fs/udf/inode.c index 2983afd5e..b223b32db 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c @@ -132,7 +132,7 @@ static sector_t udf_bmap(struct address_space *mapping, sector_t block) return generic_block_bmap(mapping,block,udf_get_block); } -struct address_space_operations udf_aops = { +const struct address_space_operations udf_aops = { .readpage = udf_readpage, .writepage = udf_writepage, .sync_page = block_sync_page, @@ -916,8 +916,6 @@ __udf_read_inode(struct inode *inode) * i_nlink = 1 * i_op = NULL; */ - inode->i_blksize = PAGE_SIZE; - bh = udf_read_ptagged(inode->i_sb, UDF_I_LOCATION(inode), 0, &ident); if (!bh) diff --git a/fs/udf/super.c b/fs/udf/super.c index 73fc0d8ae..fcce1a21a 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c @@ -40,7 +40,6 @@ #include "udfdecl.h" -#include #include #include #include @@ -91,13 +90,13 @@ static void udf_load_partdesc(struct super_block *, struct buffer_head *); static void udf_open_lvid(struct super_block *); static void udf_close_lvid(struct super_block *); static unsigned int udf_count_free(struct super_block *); -static int udf_statfs(struct super_block *, struct kstatfs *); +static int udf_statfs(struct dentry *, struct kstatfs *); /* UDF filesystem type */ -static struct super_block *udf_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int udf_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_bdev(fs_type, flags, dev_name, data, udf_fill_super); + return get_sb_bdev(fs_type, flags, dev_name, data, udf_fill_super, mnt); } static struct file_system_type udf_fstype = { @@ -116,6 +115,13 @@ static struct inode *udf_alloc_inode(struct super_block *sb) ei = (struct udf_inode_info *)kmem_cache_alloc(udf_inode_cachep, SLAB_KERNEL); if (!ei) return NULL; + + ei->i_unique = 0; + ei->i_lenExtents = 0; + ei->i_next_alloc_block = 0; + ei->i_next_alloc_goal = 0; + ei->i_strat4096 = 0; + return &ei->vfs_inode; } @@ -1779,8 +1785,10 @@ udf_put_super(struct super_block *sb) * Written, tested, and released. */ static int -udf_statfs(struct super_block *sb, struct kstatfs *buf) +udf_statfs(struct dentry *dentry, struct kstatfs *buf) { + struct super_block *sb = dentry->d_sb; + buf->f_type = UDF_SUPER_MAGIC; buf->f_bsize = sb->s_blocksize; buf->f_blocks = UDF_SB_PARTLEN(sb, UDF_SB_PARTITION(sb)); diff --git a/fs/udf/symlink.c b/fs/udf/symlink.c index 674bb40ed..ba068a786 100644 --- a/fs/udf/symlink.c +++ b/fs/udf/symlink.c @@ -113,6 +113,6 @@ out: /* * symlinks can't do much... */ -struct address_space_operations udf_symlink_aops = { +const struct address_space_operations udf_symlink_aops = { .readpage = udf_symlink_filler, }; diff --git a/fs/udf/udfdecl.h b/fs/udf/udfdecl.h index 023e19ba5..1033b7cf2 100644 --- a/fs/udf/udfdecl.h +++ b/fs/udf/udfdecl.h @@ -6,7 +6,6 @@ #include "osta_udf.h" #include -#include #include #include #include @@ -47,9 +46,9 @@ extern struct inode_operations udf_dir_inode_operations; extern const struct file_operations udf_dir_operations; extern struct inode_operations udf_file_inode_operations; extern const struct file_operations udf_file_operations; -extern struct address_space_operations udf_aops; -extern struct address_space_operations udf_adinicb_aops; -extern struct address_space_operations udf_symlink_aops; +extern const struct address_space_operations udf_aops; +extern const struct address_space_operations udf_adinicb_aops; +extern const struct address_space_operations udf_symlink_aops; struct udf_fileident_bh { diff --git a/fs/ufs/balloc.c b/fs/ufs/balloc.c index 3ada9dcf5..b82381475 100644 --- a/fs/ufs/balloc.c +++ b/fs/ufs/balloc.c @@ -21,14 +21,6 @@ #include "swab.h" #include "util.h" -#undef UFS_BALLOC_DEBUG - -#ifdef UFS_BALLOC_DEBUG -#define UFSD(x) printk("(%s, %d), %s:", __FILE__, __LINE__, __FUNCTION__); printk x; -#else -#define UFSD(x) -#endif - static unsigned ufs_add_fragments (struct inode *, unsigned, unsigned, unsigned, int *); static unsigned ufs_alloc_fragments (struct inode *, unsigned, unsigned, unsigned, int *); static unsigned ufs_alloccg_block (struct inode *, struct ufs_cg_private_info *, unsigned, int *); @@ -39,7 +31,8 @@ static void ufs_clusteracct(struct super_block *, struct ufs_cg_private_info *, /* * Free 'count' fragments from fragment number 'fragment' */ -void ufs_free_fragments (struct inode * inode, unsigned fragment, unsigned count) { +void ufs_free_fragments(struct inode *inode, unsigned fragment, unsigned count) +{ struct super_block * sb; struct ufs_sb_private_info * uspi; struct ufs_super_block_first * usb1; @@ -51,7 +44,7 @@ void ufs_free_fragments (struct inode * inode, unsigned fragment, unsigned count uspi = UFS_SB(sb)->s_uspi; usb1 = ubh_get_usb_first(uspi); - UFSD(("ENTER, fragment %u, count %u\n", fragment, count)) + UFSD("ENTER, fragment %u, count %u\n", fragment, count); if (ufs_fragnum(fragment) + count > uspi->s_fpg) ufs_error (sb, "ufs_free_fragments", "internal error"); @@ -68,7 +61,7 @@ void ufs_free_fragments (struct inode * inode, unsigned fragment, unsigned count ucpi = ufs_load_cylinder (sb, cgno); if (!ucpi) goto failed; - ucg = ubh_get_ucg (UCPI_UBH); + ucg = ubh_get_ucg (UCPI_UBH(ucpi)); if (!ufs_cg_chkmagic(sb, ucg)) { ufs_panic (sb, "ufs_free_fragments", "internal error, bad magic number on cg %u", cgno); goto failed; @@ -76,11 +69,11 @@ void ufs_free_fragments (struct inode * inode, unsigned fragment, unsigned count end_bit = bit + count; bbase = ufs_blknum (bit); - blkmap = ubh_blkmap (UCPI_UBH, ucpi->c_freeoff, bbase); + blkmap = ubh_blkmap (UCPI_UBH(ucpi), ucpi->c_freeoff, bbase); ufs_fragacct (sb, blkmap, ucg->cg_frsum, -1); for (i = bit; i < end_bit; i++) { - if (ubh_isclr (UCPI_UBH, ucpi->c_freeoff, i)) - ubh_setbit (UCPI_UBH, ucpi->c_freeoff, i); + if (ubh_isclr (UCPI_UBH(ucpi), ucpi->c_freeoff, i)) + ubh_setbit (UCPI_UBH(ucpi), ucpi->c_freeoff, i); else ufs_error (sb, "ufs_free_fragments", "bit already cleared for fragment %u", i); @@ -90,51 +83,52 @@ void ufs_free_fragments (struct inode * inode, unsigned fragment, unsigned count fs32_add(sb, &ucg->cg_cs.cs_nffree, count); - fs32_add(sb, &usb1->fs_cstotal.cs_nffree, count); + uspi->cs_total.cs_nffree += count; fs32_add(sb, &UFS_SB(sb)->fs_cs(cgno).cs_nffree, count); - blkmap = ubh_blkmap (UCPI_UBH, ucpi->c_freeoff, bbase); + blkmap = ubh_blkmap (UCPI_UBH(ucpi), ucpi->c_freeoff, bbase); ufs_fragacct(sb, blkmap, ucg->cg_frsum, 1); /* * Trying to reassemble free fragments into block */ blkno = ufs_fragstoblks (bbase); - if (ubh_isblockset(UCPI_UBH, ucpi->c_freeoff, blkno)) { + if (ubh_isblockset(UCPI_UBH(ucpi), ucpi->c_freeoff, blkno)) { fs32_sub(sb, &ucg->cg_cs.cs_nffree, uspi->s_fpb); - fs32_sub(sb, &usb1->fs_cstotal.cs_nffree, uspi->s_fpb); + uspi->cs_total.cs_nffree -= uspi->s_fpb; fs32_sub(sb, &UFS_SB(sb)->fs_cs(cgno).cs_nffree, uspi->s_fpb); if ((UFS_SB(sb)->s_flags & UFS_CG_MASK) == UFS_CG_44BSD) ufs_clusteracct (sb, ucpi, blkno, 1); fs32_add(sb, &ucg->cg_cs.cs_nbfree, 1); - fs32_add(sb, &usb1->fs_cstotal.cs_nbfree, 1); + uspi->cs_total.cs_nbfree++; fs32_add(sb, &UFS_SB(sb)->fs_cs(cgno).cs_nbfree, 1); cylno = ufs_cbtocylno (bbase); fs16_add(sb, &ubh_cg_blks(ucpi, cylno, ufs_cbtorpos(bbase)), 1); fs32_add(sb, &ubh_cg_blktot(ucpi, cylno), 1); } - ubh_mark_buffer_dirty (USPI_UBH); - ubh_mark_buffer_dirty (UCPI_UBH); + ubh_mark_buffer_dirty (USPI_UBH(uspi)); + ubh_mark_buffer_dirty (UCPI_UBH(ucpi)); if (sb->s_flags & MS_SYNCHRONOUS) { - ubh_ll_rw_block (SWRITE, 1, (struct ufs_buffer_head **)&ucpi); - ubh_wait_on_buffer (UCPI_UBH); + ubh_ll_rw_block(SWRITE, UCPI_UBH(ucpi)); + ubh_wait_on_buffer (UCPI_UBH(ucpi)); } sb->s_dirt = 1; unlock_super (sb); - UFSD(("EXIT\n")) + UFSD("EXIT\n"); return; failed: unlock_super (sb); - UFSD(("EXIT (FAILED)\n")) + UFSD("EXIT (FAILED)\n"); return; } /* * Free 'count' fragments from fragment number 'fragment' (free whole blocks) */ -void ufs_free_blocks (struct inode * inode, unsigned fragment, unsigned count) { +void ufs_free_blocks(struct inode *inode, unsigned fragment, unsigned count) +{ struct super_block * sb; struct ufs_sb_private_info * uspi; struct ufs_super_block_first * usb1; @@ -146,7 +140,7 @@ void ufs_free_blocks (struct inode * inode, unsigned fragment, unsigned count) { uspi = UFS_SB(sb)->s_uspi; usb1 = ubh_get_usb_first(uspi); - UFSD(("ENTER, fragment %u, count %u\n", fragment, count)) + UFSD("ENTER, fragment %u, count %u\n", fragment, count); if ((fragment & uspi->s_fpbmask) || (count & uspi->s_fpbmask)) { ufs_error (sb, "ufs_free_blocks", "internal error, " @@ -162,7 +156,7 @@ do_more: bit = ufs_dtogd (fragment); if (cgno >= uspi->s_ncg) { ufs_panic (sb, "ufs_free_blocks", "freeing blocks are outside device"); - goto failed; + goto failed_unlock; } end_bit = bit + count; if (end_bit > uspi->s_fpg) { @@ -173,36 +167,36 @@ do_more: ucpi = ufs_load_cylinder (sb, cgno); if (!ucpi) - goto failed; - ucg = ubh_get_ucg (UCPI_UBH); + goto failed_unlock; + ucg = ubh_get_ucg (UCPI_UBH(ucpi)); if (!ufs_cg_chkmagic(sb, ucg)) { ufs_panic (sb, "ufs_free_blocks", "internal error, bad magic number on cg %u", cgno); - goto failed; + goto failed_unlock; } for (i = bit; i < end_bit; i += uspi->s_fpb) { blkno = ufs_fragstoblks(i); - if (ubh_isblockset(UCPI_UBH, ucpi->c_freeoff, blkno)) { + if (ubh_isblockset(UCPI_UBH(ucpi), ucpi->c_freeoff, blkno)) { ufs_error(sb, "ufs_free_blocks", "freeing free fragment"); } - ubh_setblock(UCPI_UBH, ucpi->c_freeoff, blkno); + ubh_setblock(UCPI_UBH(ucpi), ucpi->c_freeoff, blkno); if ((UFS_SB(sb)->s_flags & UFS_CG_MASK) == UFS_CG_44BSD) ufs_clusteracct (sb, ucpi, blkno, 1); DQUOT_FREE_BLOCK(inode, uspi->s_fpb); fs32_add(sb, &ucg->cg_cs.cs_nbfree, 1); - fs32_add(sb, &usb1->fs_cstotal.cs_nbfree, 1); + uspi->cs_total.cs_nbfree++; fs32_add(sb, &UFS_SB(sb)->fs_cs(cgno).cs_nbfree, 1); cylno = ufs_cbtocylno(i); fs16_add(sb, &ubh_cg_blks(ucpi, cylno, ufs_cbtorpos(i)), 1); fs32_add(sb, &ubh_cg_blktot(ucpi, cylno), 1); } - ubh_mark_buffer_dirty (USPI_UBH); - ubh_mark_buffer_dirty (UCPI_UBH); + ubh_mark_buffer_dirty (USPI_UBH(uspi)); + ubh_mark_buffer_dirty (UCPI_UBH(ucpi)); if (sb->s_flags & MS_SYNCHRONOUS) { - ubh_ll_rw_block (SWRITE, 1, (struct ufs_buffer_head **)&ucpi); - ubh_wait_on_buffer (UCPI_UBH); + ubh_ll_rw_block(SWRITE, UCPI_UBH(ucpi)); + ubh_wait_on_buffer (UCPI_UBH(ucpi)); } if (overflow) { @@ -213,38 +207,83 @@ do_more: sb->s_dirt = 1; unlock_super (sb); - UFSD(("EXIT\n")) + UFSD("EXIT\n"); return; -failed: +failed_unlock: unlock_super (sb); - UFSD(("EXIT (FAILED)\n")) +failed: + UFSD("EXIT (FAILED)\n"); return; } +/* + * Modify inode page cache in such way: + * have - blocks with b_blocknr equal to oldb...oldb+count-1 + * get - blocks with b_blocknr equal to newb...newb+count-1 + * also we suppose that oldb...oldb+count-1 blocks + * situated at the end of file. + * + * We can come here from ufs_writepage or ufs_prepare_write, + * locked_page is argument of these functions, so we already lock it. + */ +static void ufs_change_blocknr(struct inode *inode, unsigned int baseblk, + unsigned int count, unsigned int oldb, + unsigned int newb, struct page *locked_page) +{ + unsigned int blk_per_page = 1 << (PAGE_CACHE_SHIFT - inode->i_blkbits); + struct address_space *mapping = inode->i_mapping; + pgoff_t index, cur_index = locked_page->index; + unsigned int i, j; + struct page *page; + struct buffer_head *head, *bh; + + UFSD("ENTER, ino %lu, count %u, oldb %u, newb %u\n", + inode->i_ino, count, oldb, newb); + + BUG_ON(!PageLocked(locked_page)); + + for (i = 0; i < count; i += blk_per_page) { + index = (baseblk+i) >> (PAGE_CACHE_SHIFT - inode->i_blkbits); + + if (likely(cur_index != index)) { + page = ufs_get_locked_page(mapping, index); + if (!page || IS_ERR(page)) /* it was truncated or EIO */ + continue; + } else + page = locked_page; + + j = i; + head = page_buffers(page); + bh = head; + do { + if (likely(bh->b_blocknr == j + oldb && j < count)) { + unmap_underlying_metadata(bh->b_bdev, + bh->b_blocknr); + bh->b_blocknr = newb + j++; + mark_buffer_dirty(bh); + } + bh = bh->b_this_page; + } while (bh != head); -#define NULLIFY_FRAGMENTS \ - for (i = oldcount; i < newcount; i++) { \ - bh = sb_getblk(sb, result + i); \ - memset (bh->b_data, 0, sb->s_blocksize); \ - set_buffer_uptodate(bh); \ - mark_buffer_dirty (bh); \ - if (IS_SYNC(inode)) \ - sync_dirty_buffer(bh); \ - brelse (bh); \ - } + set_page_dirty(page); + + if (likely(cur_index != index)) + ufs_put_locked_page(page); + } + UFSD("EXIT\n"); +} -unsigned ufs_new_fragments (struct inode * inode, __fs32 * p, unsigned fragment, - unsigned goal, unsigned count, int * err ) +unsigned ufs_new_fragments(struct inode * inode, __fs32 * p, unsigned fragment, + unsigned goal, unsigned count, int * err, struct page *locked_page) { struct super_block * sb; struct ufs_sb_private_info * uspi; struct ufs_super_block_first * usb1; - struct buffer_head * bh; - unsigned cgno, oldcount, newcount, tmp, request, i, result; + unsigned cgno, oldcount, newcount, tmp, request, result; - UFSD(("ENTER, ino %lu, fragment %u, goal %u, count %u\n", inode->i_ino, fragment, goal, count)) + UFSD("ENTER, ino %lu, fragment %u, goal %u, count %u\n", inode->i_ino, fragment, goal, count); sb = inode->i_sb; uspi = UFS_SB(sb)->s_uspi; @@ -273,14 +312,14 @@ unsigned ufs_new_fragments (struct inode * inode, __fs32 * p, unsigned fragment, return (unsigned)-1; } if (fragment < UFS_I(inode)->i_lastfrag) { - UFSD(("EXIT (ALREADY ALLOCATED)\n")) + UFSD("EXIT (ALREADY ALLOCATED)\n"); unlock_super (sb); return 0; } } else { if (tmp) { - UFSD(("EXIT (ALREADY ALLOCATED)\n")) + UFSD("EXIT (ALREADY ALLOCATED)\n"); unlock_super(sb); return 0; } @@ -289,9 +328,9 @@ unsigned ufs_new_fragments (struct inode * inode, __fs32 * p, unsigned fragment, /* * There is not enough space for user on the device */ - if (!capable(CAP_SYS_RESOURCE) && ufs_freespace(usb1, UFS_MINFREE) <= 0) { + if (!capable(CAP_SYS_RESOURCE) && ufs_freespace(uspi, UFS_MINFREE) <= 0) { unlock_super (sb); - UFSD(("EXIT (FAILED)\n")) + UFSD("EXIT (FAILED)\n"); return 0; } @@ -310,12 +349,10 @@ unsigned ufs_new_fragments (struct inode * inode, __fs32 * p, unsigned fragment, if (result) { *p = cpu_to_fs32(sb, result); *err = 0; - inode->i_blocks += count << uspi->s_nspfshift; UFS_I(inode)->i_lastfrag = max_t(u32, UFS_I(inode)->i_lastfrag, fragment + count); - NULLIFY_FRAGMENTS } unlock_super(sb); - UFSD(("EXIT, result %u\n", result)) + UFSD("EXIT, result %u\n", result); return result; } @@ -325,11 +362,9 @@ unsigned ufs_new_fragments (struct inode * inode, __fs32 * p, unsigned fragment, result = ufs_add_fragments (inode, tmp, oldcount, newcount, err); if (result) { *err = 0; - inode->i_blocks += count << uspi->s_nspfshift; UFS_I(inode)->i_lastfrag = max_t(u32, UFS_I(inode)->i_lastfrag, fragment + count); - NULLIFY_FRAGMENTS unlock_super(sb); - UFSD(("EXIT, result %u\n", result)) + UFSD("EXIT, result %u\n", result); return result; } @@ -339,8 +374,8 @@ unsigned ufs_new_fragments (struct inode * inode, __fs32 * p, unsigned fragment, switch (fs32_to_cpu(sb, usb1->fs_optim)) { case UFS_OPTSPACE: request = newcount; - if (uspi->s_minfree < 5 || fs32_to_cpu(sb, usb1->fs_cstotal.cs_nffree) - > uspi->s_dsize * uspi->s_minfree / (2 * 100) ) + if (uspi->s_minfree < 5 || uspi->cs_total.cs_nffree + > uspi->s_dsize * uspi->s_minfree / (2 * 100)) break; usb1->fs_optim = cpu_to_fs32(sb, UFS_OPTTIME); break; @@ -349,7 +384,7 @@ unsigned ufs_new_fragments (struct inode * inode, __fs32 * p, unsigned fragment, case UFS_OPTTIME: request = uspi->s_fpb; - if (fs32_to_cpu(sb, usb1->fs_cstotal.cs_nffree) < uspi->s_dsize * + if (uspi->cs_total.cs_nffree < uspi->s_dsize * (uspi->s_minfree - 2) / 100) break; usb1->fs_optim = cpu_to_fs32(sb, UFS_OPTTIME); @@ -357,39 +392,22 @@ unsigned ufs_new_fragments (struct inode * inode, __fs32 * p, unsigned fragment, } result = ufs_alloc_fragments (inode, cgno, goal, request, err); if (result) { - for (i = 0; i < oldcount; i++) { - bh = sb_bread(sb, tmp + i); - if(bh) - { - clear_buffer_dirty(bh); - bh->b_blocknr = result + i; - mark_buffer_dirty (bh); - if (IS_SYNC(inode)) - sync_dirty_buffer(bh); - brelse (bh); - } - else - { - printk(KERN_ERR "ufs_new_fragments: bread fail\n"); - unlock_super(sb); - return 0; - } - } + ufs_change_blocknr(inode, fragment - oldcount, oldcount, tmp, + result, locked_page); + *p = cpu_to_fs32(sb, result); *err = 0; - inode->i_blocks += count << uspi->s_nspfshift; UFS_I(inode)->i_lastfrag = max_t(u32, UFS_I(inode)->i_lastfrag, fragment + count); - NULLIFY_FRAGMENTS unlock_super(sb); if (newcount < request) ufs_free_fragments (inode, result + newcount, request - newcount); ufs_free_fragments (inode, tmp, oldcount); - UFSD(("EXIT, result %u\n", result)) + UFSD("EXIT, result %u\n", result); return result; } unlock_super(sb); - UFSD(("EXIT (FAILED)\n")) + UFSD("EXIT (FAILED)\n"); return 0; } @@ -404,7 +422,7 @@ ufs_add_fragments (struct inode * inode, unsigned fragment, struct ufs_cylinder_group * ucg; unsigned cgno, fragno, fragoff, count, fragsize, i; - UFSD(("ENTER, fragment %u, oldcount %u, newcount %u\n", fragment, oldcount, newcount)) + UFSD("ENTER, fragment %u, oldcount %u, newcount %u\n", fragment, oldcount, newcount); sb = inode->i_sb; uspi = UFS_SB(sb)->s_uspi; @@ -419,7 +437,7 @@ ufs_add_fragments (struct inode * inode, unsigned fragment, ucpi = ufs_load_cylinder (sb, cgno); if (!ucpi) return 0; - ucg = ubh_get_ucg (UCPI_UBH); + ucg = ubh_get_ucg (UCPI_UBH(ucpi)); if (!ufs_cg_chkmagic(sb, ucg)) { ufs_panic (sb, "ufs_add_fragments", "internal error, bad magic number on cg %u", cgno); @@ -429,14 +447,14 @@ ufs_add_fragments (struct inode * inode, unsigned fragment, fragno = ufs_dtogd (fragment); fragoff = ufs_fragnum (fragno); for (i = oldcount; i < newcount; i++) - if (ubh_isclr (UCPI_UBH, ucpi->c_freeoff, fragno + i)) + if (ubh_isclr (UCPI_UBH(ucpi), ucpi->c_freeoff, fragno + i)) return 0; /* * Block can be extended */ ucg->cg_time = cpu_to_fs32(sb, get_seconds()); for (i = newcount; i < (uspi->s_fpb - fragoff); i++) - if (ubh_isclr (UCPI_UBH, ucpi->c_freeoff, fragno + i)) + if (ubh_isclr (UCPI_UBH(ucpi), ucpi->c_freeoff, fragno + i)) break; fragsize = i - oldcount; if (!fs32_to_cpu(sb, ucg->cg_frsum[fragsize])) @@ -446,7 +464,7 @@ ufs_add_fragments (struct inode * inode, unsigned fragment, if (fragsize != count) fs32_add(sb, &ucg->cg_frsum[fragsize - count], 1); for (i = oldcount; i < newcount; i++) - ubh_clrbit (UCPI_UBH, ucpi->c_freeoff, fragno + i); + ubh_clrbit (UCPI_UBH(ucpi), ucpi->c_freeoff, fragno + i); if(DQUOT_ALLOC_BLOCK(inode, count)) { *err = -EDQUOT; return 0; @@ -454,17 +472,17 @@ ufs_add_fragments (struct inode * inode, unsigned fragment, fs32_sub(sb, &ucg->cg_cs.cs_nffree, count); fs32_sub(sb, &UFS_SB(sb)->fs_cs(cgno).cs_nffree, count); - fs32_sub(sb, &usb1->fs_cstotal.cs_nffree, count); + uspi->cs_total.cs_nffree -= count; - ubh_mark_buffer_dirty (USPI_UBH); - ubh_mark_buffer_dirty (UCPI_UBH); + ubh_mark_buffer_dirty (USPI_UBH(uspi)); + ubh_mark_buffer_dirty (UCPI_UBH(ucpi)); if (sb->s_flags & MS_SYNCHRONOUS) { - ubh_ll_rw_block (SWRITE, 1, (struct ufs_buffer_head **)&ucpi); - ubh_wait_on_buffer (UCPI_UBH); + ubh_ll_rw_block(SWRITE, UCPI_UBH(ucpi)); + ubh_wait_on_buffer (UCPI_UBH(ucpi)); } sb->s_dirt = 1; - UFSD(("EXIT, fragment %u\n", fragment)) + UFSD("EXIT, fragment %u\n", fragment); return fragment; } @@ -487,7 +505,7 @@ static unsigned ufs_alloc_fragments (struct inode * inode, unsigned cgno, struct ufs_cylinder_group * ucg; unsigned oldcg, i, j, k, result, allocsize; - UFSD(("ENTER, ino %lu, cgno %u, goal %u, count %u\n", inode->i_ino, cgno, goal, count)) + UFSD("ENTER, ino %lu, cgno %u, goal %u, count %u\n", inode->i_ino, cgno, goal, count); sb = inode->i_sb; uspi = UFS_SB(sb)->s_uspi; @@ -521,14 +539,14 @@ static unsigned ufs_alloc_fragments (struct inode * inode, unsigned cgno, UFS_TEST_FREE_SPACE_CG } - UFSD(("EXIT (FAILED)\n")) + UFSD("EXIT (FAILED)\n"); return 0; cg_found: ucpi = ufs_load_cylinder (sb, cgno); if (!ucpi) return 0; - ucg = ubh_get_ucg (UCPI_UBH); + ucg = ubh_get_ucg (UCPI_UBH(ucpi)); if (!ufs_cg_chkmagic(sb, ucg)) ufs_panic (sb, "ufs_alloc_fragments", "internal error, bad magic number on cg %u", cgno); @@ -551,12 +569,12 @@ cg_found: return 0; goal = ufs_dtogd (result); for (i = count; i < uspi->s_fpb; i++) - ubh_setbit (UCPI_UBH, ucpi->c_freeoff, goal + i); + ubh_setbit (UCPI_UBH(ucpi), ucpi->c_freeoff, goal + i); i = uspi->s_fpb - count; DQUOT_FREE_BLOCK(inode, i); fs32_add(sb, &ucg->cg_cs.cs_nffree, i); - fs32_add(sb, &usb1->fs_cstotal.cs_nffree, i); + uspi->cs_total.cs_nffree += i; fs32_add(sb, &UFS_SB(sb)->fs_cs(cgno).cs_nffree, i); fs32_add(sb, &ucg->cg_frsum[i], 1); goto succed; @@ -570,10 +588,10 @@ cg_found: return 0; } for (i = 0; i < count; i++) - ubh_clrbit (UCPI_UBH, ucpi->c_freeoff, result + i); + ubh_clrbit (UCPI_UBH(ucpi), ucpi->c_freeoff, result + i); fs32_sub(sb, &ucg->cg_cs.cs_nffree, count); - fs32_sub(sb, &usb1->fs_cstotal.cs_nffree, count); + uspi->cs_total.cs_nffree -= count; fs32_sub(sb, &UFS_SB(sb)->fs_cs(cgno).cs_nffree, count); fs32_sub(sb, &ucg->cg_frsum[allocsize], 1); @@ -581,16 +599,16 @@ cg_found: fs32_add(sb, &ucg->cg_frsum[allocsize - count], 1); succed: - ubh_mark_buffer_dirty (USPI_UBH); - ubh_mark_buffer_dirty (UCPI_UBH); + ubh_mark_buffer_dirty (USPI_UBH(uspi)); + ubh_mark_buffer_dirty (UCPI_UBH(ucpi)); if (sb->s_flags & MS_SYNCHRONOUS) { - ubh_ll_rw_block (SWRITE, 1, (struct ufs_buffer_head **)&ucpi); - ubh_wait_on_buffer (UCPI_UBH); + ubh_ll_rw_block(SWRITE, UCPI_UBH(ucpi)); + ubh_wait_on_buffer (UCPI_UBH(ucpi)); } sb->s_dirt = 1; result += cgno * uspi->s_fpg; - UFSD(("EXIT3, result %u\n", result)) + UFSD("EXIT3, result %u\n", result); return result; } @@ -603,12 +621,12 @@ static unsigned ufs_alloccg_block (struct inode * inode, struct ufs_cylinder_group * ucg; unsigned result, cylno, blkno; - UFSD(("ENTER, goal %u\n", goal)) + UFSD("ENTER, goal %u\n", goal); sb = inode->i_sb; uspi = UFS_SB(sb)->s_uspi; usb1 = ubh_get_usb_first(uspi); - ucg = ubh_get_ucg(UCPI_UBH); + ucg = ubh_get_ucg(UCPI_UBH(ucpi)); if (goal == 0) { goal = ucpi->c_rotor; @@ -620,7 +638,7 @@ static unsigned ufs_alloccg_block (struct inode * inode, /* * If the requested block is available, use it. */ - if (ubh_isblockset(UCPI_UBH, ucpi->c_freeoff, ufs_fragstoblks(goal))) { + if (ubh_isblockset(UCPI_UBH(ucpi), ucpi->c_freeoff, ufs_fragstoblks(goal))) { result = goal; goto gotit; } @@ -632,7 +650,7 @@ norot: ucpi->c_rotor = result; gotit: blkno = ufs_fragstoblks(result); - ubh_clrblock (UCPI_UBH, ucpi->c_freeoff, blkno); + ubh_clrblock (UCPI_UBH(ucpi), ucpi->c_freeoff, blkno); if ((UFS_SB(sb)->s_flags & UFS_CG_MASK) == UFS_CG_44BSD) ufs_clusteracct (sb, ucpi, blkno, -1); if(DQUOT_ALLOC_BLOCK(inode, uspi->s_fpb)) { @@ -641,31 +659,76 @@ gotit: } fs32_sub(sb, &ucg->cg_cs.cs_nbfree, 1); - fs32_sub(sb, &usb1->fs_cstotal.cs_nbfree, 1); + uspi->cs_total.cs_nbfree--; fs32_sub(sb, &UFS_SB(sb)->fs_cs(ucpi->c_cgx).cs_nbfree, 1); cylno = ufs_cbtocylno(result); fs16_sub(sb, &ubh_cg_blks(ucpi, cylno, ufs_cbtorpos(result)), 1); fs32_sub(sb, &ubh_cg_blktot(ucpi, cylno), 1); - UFSD(("EXIT, result %u\n", result)) + UFSD("EXIT, result %u\n", result); return result; } -static unsigned ufs_bitmap_search (struct super_block * sb, - struct ufs_cg_private_info * ucpi, unsigned goal, unsigned count) +static unsigned ubh_scanc(struct ufs_sb_private_info *uspi, + struct ufs_buffer_head *ubh, + unsigned begin, unsigned size, + unsigned char *table, unsigned char mask) { - struct ufs_sb_private_info * uspi; - struct ufs_super_block_first * usb1; - struct ufs_cylinder_group * ucg; - unsigned start, length, location, result; - unsigned possition, fragsize, blockmap, mask; - - UFSD(("ENTER, cg %u, goal %u, count %u\n", ucpi->c_cgx, goal, count)) + unsigned rest, offset; + unsigned char *cp; + + + offset = begin & ~uspi->s_fmask; + begin >>= uspi->s_fshift; + for (;;) { + if ((offset + size) < uspi->s_fsize) + rest = size; + else + rest = uspi->s_fsize - offset; + size -= rest; + cp = ubh->bh[begin]->b_data + offset; + while ((table[*cp++] & mask) == 0 && --rest) + ; + if (rest || !size) + break; + begin++; + offset = 0; + } + return (size + rest); +} + +/* + * Find a block of the specified size in the specified cylinder group. + * @sp: pointer to super block + * @ucpi: pointer to cylinder group info + * @goal: near which block we want find new one + * @count: specified size + */ +static unsigned ufs_bitmap_search(struct super_block *sb, + struct ufs_cg_private_info *ucpi, + unsigned goal, unsigned count) +{ + /* + * Bit patterns for identifying fragments in the block map + * used as ((map & mask_arr) == want_arr) + */ + static const int mask_arr[9] = { + 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff, 0x1ff, 0x3ff + }; + static const int want_arr[9] = { + 0x0, 0x2, 0x6, 0xe, 0x1e, 0x3e, 0x7e, 0xfe, 0x1fe + }; + struct ufs_sb_private_info *uspi = UFS_SB(sb)->s_uspi; + struct ufs_super_block_first *usb1; + struct ufs_cylinder_group *ucg; + unsigned start, length, loc, result; + unsigned pos, want, blockmap, mask, end; + + UFSD("ENTER, cg %u, goal %u, count %u\n", ucpi->c_cgx, goal, count); - uspi = UFS_SB(sb)->s_uspi; usb1 = ubh_get_usb_first (uspi); - ucg = ubh_get_ucg(UCPI_UBH); + ucg = ubh_get_ucg(UCPI_UBH(ucpi)); if (goal) start = ufs_dtogd(goal) >> 3; @@ -673,53 +736,50 @@ static unsigned ufs_bitmap_search (struct super_block * sb, start = ucpi->c_frotor >> 3; length = ((uspi->s_fpg + 7) >> 3) - start; - location = ubh_scanc(UCPI_UBH, ucpi->c_freeoff + start, length, + loc = ubh_scanc(uspi, UCPI_UBH(ucpi), ucpi->c_freeoff + start, length, (uspi->s_fpb == 8) ? ufs_fragtable_8fpb : ufs_fragtable_other, 1 << (count - 1 + (uspi->s_fpb & 7))); - if (location == 0) { + if (loc == 0) { length = start + 1; - location = ubh_scanc(UCPI_UBH, ucpi->c_freeoff, length, - (uspi->s_fpb == 8) ? ufs_fragtable_8fpb : ufs_fragtable_other, - 1 << (count - 1 + (uspi->s_fpb & 7))); - if (location == 0) { - ufs_error (sb, "ufs_bitmap_search", - "bitmap corrupted on cg %u, start %u, length %u, count %u, freeoff %u\n", - ucpi->c_cgx, start, length, count, ucpi->c_freeoff); + loc = ubh_scanc(uspi, UCPI_UBH(ucpi), ucpi->c_freeoff, length, + (uspi->s_fpb == 8) ? ufs_fragtable_8fpb : + ufs_fragtable_other, + 1 << (count - 1 + (uspi->s_fpb & 7))); + if (loc == 0) { + ufs_error(sb, "ufs_bitmap_search", + "bitmap corrupted on cg %u, start %u," + " length %u, count %u, freeoff %u\n", + ucpi->c_cgx, start, length, count, + ucpi->c_freeoff); return (unsigned)-1; } start = 0; } - result = (start + length - location) << 3; + result = (start + length - loc) << 3; ucpi->c_frotor = result; /* * found the byte in the map */ - blockmap = ubh_blkmap(UCPI_UBH, ucpi->c_freeoff, result); - fragsize = 0; - for (possition = 0, mask = 1; possition < 8; possition++, mask <<= 1) { - if (blockmap & mask) { - if (!(possition & uspi->s_fpbmask)) - fragsize = 1; - else - fragsize++; - } - else { - if (fragsize == count) { - result += possition - count; - UFSD(("EXIT, result %u\n", result)) - return result; - } - fragsize = 0; - } - } - if (fragsize == count) { - result += possition - count; - UFSD(("EXIT, result %u\n", result)) - return result; - } - ufs_error (sb, "ufs_bitmap_search", "block not in map on cg %u\n", ucpi->c_cgx); - UFSD(("EXIT (FAILED)\n")) + + for (end = result + 8; result < end; result += uspi->s_fpb) { + blockmap = ubh_blkmap(UCPI_UBH(ucpi), ucpi->c_freeoff, result); + blockmap <<= 1; + mask = mask_arr[count]; + want = want_arr[count]; + for (pos = 0; pos <= uspi->s_fpb - count; pos++) { + if ((blockmap & mask) == want) { + UFSD("EXIT, result %u\n", result); + return result + pos; + } + mask <<= 1; + want <<= 1; + } + } + + ufs_error(sb, "ufs_bitmap_search", "block not in map on cg %u\n", + ucpi->c_cgx); + UFSD("EXIT (FAILED)\n"); return (unsigned)-1; } @@ -734,9 +794,9 @@ static void ufs_clusteracct(struct super_block * sb, return; if (cnt > 0) - ubh_setbit(UCPI_UBH, ucpi->c_clusteroff, blkno); + ubh_setbit(UCPI_UBH(ucpi), ucpi->c_clusteroff, blkno); else - ubh_clrbit(UCPI_UBH, ucpi->c_clusteroff, blkno); + ubh_clrbit(UCPI_UBH(ucpi), ucpi->c_clusteroff, blkno); /* * Find the size of the cluster going forward. @@ -745,7 +805,7 @@ static void ufs_clusteracct(struct super_block * sb, end = start + uspi->s_contigsumsize; if ( end >= ucpi->c_nclusterblks) end = ucpi->c_nclusterblks; - i = ubh_find_next_zero_bit (UCPI_UBH, ucpi->c_clusteroff, end, start); + i = ubh_find_next_zero_bit (UCPI_UBH(ucpi), ucpi->c_clusteroff, end, start); if (i > end) i = end; forw = i - start; @@ -757,7 +817,7 @@ static void ufs_clusteracct(struct super_block * sb, end = start - uspi->s_contigsumsize; if (end < 0 ) end = -1; - i = ubh_find_last_zero_bit (UCPI_UBH, ucpi->c_clusteroff, start, end); + i = ubh_find_last_zero_bit (UCPI_UBH(ucpi), ucpi->c_clusteroff, start, end); if ( i < end) i = end; back = start - i; @@ -769,11 +829,11 @@ static void ufs_clusteracct(struct super_block * sb, i = back + forw + 1; if (i > uspi->s_contigsumsize) i = uspi->s_contigsumsize; - fs32_add(sb, (__fs32*)ubh_get_addr(UCPI_UBH, ucpi->c_clustersumoff + (i << 2)), cnt); + fs32_add(sb, (__fs32*)ubh_get_addr(UCPI_UBH(ucpi), ucpi->c_clustersumoff + (i << 2)), cnt); if (back > 0) - fs32_sub(sb, (__fs32*)ubh_get_addr(UCPI_UBH, ucpi->c_clustersumoff + (back << 2)), cnt); + fs32_sub(sb, (__fs32*)ubh_get_addr(UCPI_UBH(ucpi), ucpi->c_clustersumoff + (back << 2)), cnt); if (forw > 0) - fs32_sub(sb, (__fs32*)ubh_get_addr(UCPI_UBH, ucpi->c_clustersumoff + (forw << 2)), cnt); + fs32_sub(sb, (__fs32*)ubh_get_addr(UCPI_UBH(ucpi), ucpi->c_clustersumoff + (forw << 2)), cnt); } diff --git a/fs/ufs/cylinder.c b/fs/ufs/cylinder.c index 14abb8b83..09c39e5e6 100644 --- a/fs/ufs/cylinder.c +++ b/fs/ufs/cylinder.c @@ -20,15 +20,6 @@ #include "swab.h" #include "util.h" -#undef UFS_CYLINDER_DEBUG - -#ifdef UFS_CYLINDER_DEBUG -#define UFSD(x) printk("(%s, %d), %s:", __FILE__, __LINE__, __FUNCTION__); printk x; -#else -#define UFSD(x) -#endif - - /* * Read cylinder group into cache. The memory space for ufs_cg_private_info * structure is already allocated during ufs_read_super. @@ -42,19 +33,19 @@ static void ufs_read_cylinder (struct super_block * sb, struct ufs_cylinder_group * ucg; unsigned i, j; - UFSD(("ENTER, cgno %u, bitmap_nr %u\n", cgno, bitmap_nr)) + UFSD("ENTER, cgno %u, bitmap_nr %u\n", cgno, bitmap_nr); uspi = sbi->s_uspi; ucpi = sbi->s_ucpi[bitmap_nr]; ucg = (struct ufs_cylinder_group *)sbi->s_ucg[cgno]->b_data; - UCPI_UBH->fragment = ufs_cgcmin(cgno); - UCPI_UBH->count = uspi->s_cgsize >> sb->s_blocksize_bits; + UCPI_UBH(ucpi)->fragment = ufs_cgcmin(cgno); + UCPI_UBH(ucpi)->count = uspi->s_cgsize >> sb->s_blocksize_bits; /* * We have already the first fragment of cylinder group block in buffer */ - UCPI_UBH->bh[0] = sbi->s_ucg[cgno]; - for (i = 1; i < UCPI_UBH->count; i++) - if (!(UCPI_UBH->bh[i] = sb_bread(sb, UCPI_UBH->fragment + i))) + UCPI_UBH(ucpi)->bh[0] = sbi->s_ucg[cgno]; + for (i = 1; i < UCPI_UBH(ucpi)->count; i++) + if (!(UCPI_UBH(ucpi)->bh[i] = sb_bread(sb, UCPI_UBH(ucpi)->fragment + i))) goto failed; sbi->s_cgno[bitmap_nr] = cgno; @@ -73,7 +64,7 @@ static void ufs_read_cylinder (struct super_block * sb, ucpi->c_clustersumoff = fs32_to_cpu(sb, ucg->cg_u.cg_44.cg_clustersumoff); ucpi->c_clusteroff = fs32_to_cpu(sb, ucg->cg_u.cg_44.cg_clusteroff); ucpi->c_nclusterblks = fs32_to_cpu(sb, ucg->cg_u.cg_44.cg_nclusterblks); - UFSD(("EXIT\n")) + UFSD("EXIT\n"); return; failed: @@ -95,15 +86,15 @@ void ufs_put_cylinder (struct super_block * sb, unsigned bitmap_nr) struct ufs_cylinder_group * ucg; unsigned i; - UFSD(("ENTER, bitmap_nr %u\n", bitmap_nr)) + UFSD("ENTER, bitmap_nr %u\n", bitmap_nr); uspi = sbi->s_uspi; if (sbi->s_cgno[bitmap_nr] == UFS_CGNO_EMPTY) { - UFSD(("EXIT\n")) + UFSD("EXIT\n"); return; } ucpi = sbi->s_ucpi[bitmap_nr]; - ucg = ubh_get_ucg(UCPI_UBH); + ucg = ubh_get_ucg(UCPI_UBH(ucpi)); if (uspi->s_ncg > UFS_MAX_GROUP_LOADED && bitmap_nr >= sbi->s_cg_loaded) { ufs_panic (sb, "ufs_put_cylinder", "internal error"); @@ -116,13 +107,13 @@ void ufs_put_cylinder (struct super_block * sb, unsigned bitmap_nr) ucg->cg_rotor = cpu_to_fs32(sb, ucpi->c_rotor); ucg->cg_frotor = cpu_to_fs32(sb, ucpi->c_frotor); ucg->cg_irotor = cpu_to_fs32(sb, ucpi->c_irotor); - ubh_mark_buffer_dirty (UCPI_UBH); - for (i = 1; i < UCPI_UBH->count; i++) { - brelse (UCPI_UBH->bh[i]); + ubh_mark_buffer_dirty (UCPI_UBH(ucpi)); + for (i = 1; i < UCPI_UBH(ucpi)->count; i++) { + brelse (UCPI_UBH(ucpi)->bh[i]); } sbi->s_cgno[bitmap_nr] = UFS_CGNO_EMPTY; - UFSD(("EXIT\n")) + UFSD("EXIT\n"); } /* @@ -139,7 +130,7 @@ struct ufs_cg_private_info * ufs_load_cylinder ( struct ufs_cg_private_info * ucpi; unsigned cg, i, j; - UFSD(("ENTER, cgno %u\n", cgno)) + UFSD("ENTER, cgno %u\n", cgno); uspi = sbi->s_uspi; if (cgno >= uspi->s_ncg) { @@ -150,7 +141,7 @@ struct ufs_cg_private_info * ufs_load_cylinder ( * Cylinder group number cg it in cache and it was last used */ if (sbi->s_cgno[0] == cgno) { - UFSD(("EXIT\n")) + UFSD("EXIT\n"); return sbi->s_ucpi[0]; } /* @@ -160,16 +151,16 @@ struct ufs_cg_private_info * ufs_load_cylinder ( if (sbi->s_cgno[cgno] != UFS_CGNO_EMPTY) { if (sbi->s_cgno[cgno] != cgno) { ufs_panic (sb, "ufs_load_cylinder", "internal error, wrong number of cg in cache"); - UFSD(("EXIT (FAILED)\n")) + UFSD("EXIT (FAILED)\n"); return NULL; } else { - UFSD(("EXIT\n")) + UFSD("EXIT\n"); return sbi->s_ucpi[cgno]; } } else { ufs_read_cylinder (sb, cgno, cgno); - UFSD(("EXIT\n")) + UFSD("EXIT\n"); return sbi->s_ucpi[cgno]; } } @@ -204,6 +195,6 @@ struct ufs_cg_private_info * ufs_load_cylinder ( sbi->s_ucpi[0] = ucpi; ufs_read_cylinder (sb, cgno, 0); } - UFSD(("EXIT\n")) + UFSD("EXIT\n"); return sbi->s_ucpi[0]; } diff --git a/fs/ufs/dir.c b/fs/ufs/dir.c index 1a561202d..e04327cb8 100644 --- a/fs/ufs/dir.c +++ b/fs/ufs/dir.c @@ -11,31 +11,20 @@ * 4.4BSD (FreeBSD) support added on February 1st 1998 by * Niels Kristian Bech Jensen partially based * on code by Martin von Loewis . + * + * Migration to usage of "page cache" on May 2006 by + * Evgeniy Dushistov based on ext2 code base. */ #include #include #include #include -#include #include #include "swab.h" #include "util.h" -#undef UFS_DIR_DEBUG - -#ifdef UFS_DIR_DEBUG -#define UFSD(x) printk("(%s, %d), %s: ", __FILE__, __LINE__, __FUNCTION__); printk x; -#else -#define UFSD(x) -#endif - -static int -ufs_check_dir_entry (const char *, struct inode *, struct ufs_dir_entry *, - struct buffer_head *, unsigned long); - - /* * NOTE! unlike strncmp, ufs_match returns 1 for success, 0 for failure. * @@ -51,495 +40,541 @@ static inline int ufs_match(struct super_block *sb, int len, return !memcmp(name, de->d_name, len); } -/* - * This is blatantly stolen from ext2fs - */ -static int -ufs_readdir (struct file * filp, void * dirent, filldir_t filldir) +static int ufs_commit_chunk(struct page *page, unsigned from, unsigned to) { - struct inode *inode = filp->f_dentry->d_inode; - int error = 0; - unsigned long offset, lblk; - int i, stored; - struct buffer_head * bh; - struct ufs_dir_entry * de; - struct super_block * sb; - int de_reclen; - unsigned flags; - u64 blk= 0L; - - lock_kernel(); - - sb = inode->i_sb; - flags = UFS_SB(sb)->s_flags; - - UFSD(("ENTER, ino %lu f_pos %lu\n", inode->i_ino, (unsigned long) filp->f_pos)) - - stored = 0; - bh = NULL; - offset = filp->f_pos & (sb->s_blocksize - 1); - - while (!error && !stored && filp->f_pos < inode->i_size) { - lblk = (filp->f_pos) >> sb->s_blocksize_bits; - blk = ufs_frag_map(inode, lblk); - if (!blk || !(bh = sb_bread(sb, blk))) { - /* XXX - error - skip to the next block */ - printk("ufs_readdir: " - "dir inode %lu has a hole at offset %lu\n", - inode->i_ino, (unsigned long int)filp->f_pos); - filp->f_pos += sb->s_blocksize - offset; - continue; - } - -revalidate: - /* If the dir block has changed since the last call to - * readdir(2), then we might be pointing to an invalid - * dirent right now. Scan from the start of the block - * to make sure. */ - if (filp->f_version != inode->i_version) { - for (i = 0; i < sb->s_blocksize && i < offset; ) { - de = (struct ufs_dir_entry *)(bh->b_data + i); - /* It's too expensive to do a full - * dirent test each time round this - * loop, but we do have to test at - * least that it is non-zero. A - * failure will be detected in the - * dirent test below. */ - de_reclen = fs16_to_cpu(sb, de->d_reclen); - if (de_reclen < 1) - break; - i += de_reclen; - } - offset = i; - filp->f_pos = (filp->f_pos & ~(sb->s_blocksize - 1)) - | offset; - filp->f_version = inode->i_version; - } + struct inode *dir = page->mapping->host; + int err = 0; + dir->i_version++; + page->mapping->a_ops->commit_write(NULL, page, from, to); + if (IS_DIRSYNC(dir)) + err = write_one_page(page, 1); + else + unlock_page(page); + return err; +} - while (!error && filp->f_pos < inode->i_size - && offset < sb->s_blocksize) { - de = (struct ufs_dir_entry *) (bh->b_data + offset); - /* XXX - put in a real ufs_check_dir_entry() */ - if ((de->d_reclen == 0) || (ufs_get_de_namlen(sb, de) == 0)) { - filp->f_pos = (filp->f_pos & - (sb->s_blocksize - 1)) + - sb->s_blocksize; - brelse(bh); - unlock_kernel(); - return stored; - } - if (!ufs_check_dir_entry ("ufs_readdir", inode, de, - bh, offset)) { - /* On error, skip the f_pos to the - next block. */ - filp->f_pos = (filp->f_pos | - (sb->s_blocksize - 1)) + - 1; - brelse (bh); - unlock_kernel(); - return stored; - } - offset += fs16_to_cpu(sb, de->d_reclen); - if (de->d_ino) { - /* We might block in the next section - * if the data destination is - * currently swapped out. So, use a - * version stamp to detect whether or - * not the directory has been modified - * during the copy operation. */ - unsigned long version = filp->f_version; - unsigned char d_type = DT_UNKNOWN; +static inline void ufs_put_page(struct page *page) +{ + kunmap(page); + page_cache_release(page); +} - UFSD(("filldir(%s,%u)\n", de->d_name, - fs32_to_cpu(sb, de->d_ino))) - UFSD(("namlen %u\n", ufs_get_de_namlen(sb, de))) +static inline unsigned long ufs_dir_pages(struct inode *inode) +{ + return (inode->i_size+PAGE_CACHE_SIZE-1)>>PAGE_CACHE_SHIFT; +} - if ((flags & UFS_DE_MASK) == UFS_DE_44BSD) - d_type = de->d_u.d_44.d_type; - error = filldir(dirent, de->d_name, - ufs_get_de_namlen(sb, de), filp->f_pos, - fs32_to_cpu(sb, de->d_ino), d_type); - if (error) - break; - if (version != filp->f_version) - goto revalidate; - stored ++; - } - filp->f_pos += fs16_to_cpu(sb, de->d_reclen); - } - offset = 0; - brelse (bh); +ino_t ufs_inode_by_name(struct inode *dir, struct dentry *dentry) +{ + ino_t res = 0; + struct ufs_dir_entry *de; + struct page *page; + + de = ufs_find_entry(dir, dentry, &page); + if (de) { + res = fs32_to_cpu(dir->i_sb, de->d_ino); + ufs_put_page(page); } - unlock_kernel(); - return 0; + return res; } -/* - * define how far ahead to read directories while searching them. - */ -#define NAMEI_RA_CHUNKS 2 -#define NAMEI_RA_BLOCKS 4 -#define NAMEI_RA_SIZE (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS) -#define NAMEI_RA_INDEX(c,b) (((c) * NAMEI_RA_BLOCKS) + (b)) -/* - * ufs_find_entry() - * - * finds an entry in the specified directory with the wanted name. It - * returns the cache buffer in which the entry was found, and the entry - * itself (as a parameter - res_bh). It does NOT read the inode of the - * entry - you'll have to do that yourself if you want to. - */ -struct ufs_dir_entry * ufs_find_entry (struct dentry *dentry, - struct buffer_head ** res_bh) +/* Releases the page */ +void ufs_set_link(struct inode *dir, struct ufs_dir_entry *de, + struct page *page, struct inode *inode) { - struct super_block * sb; - struct buffer_head * bh_use[NAMEI_RA_SIZE]; - struct buffer_head * bh_read[NAMEI_RA_SIZE]; - unsigned long offset; - int block, toread, i, err; - struct inode *dir = dentry->d_parent->d_inode; - const char *name = dentry->d_name.name; - int namelen = dentry->d_name.len; + unsigned from = (char *) de - (char *) page_address(page); + unsigned to = from + fs16_to_cpu(dir->i_sb, de->d_reclen); + int err; - UFSD(("ENTER, dir_ino %lu, name %s, namlen %u\n", dir->i_ino, name, namelen)) - - *res_bh = NULL; - - sb = dir->i_sb; - - if (namelen > UFS_MAXNAMLEN) - return NULL; + lock_page(page); + err = page->mapping->a_ops->prepare_write(NULL, page, from, to); + BUG_ON(err); + de->d_ino = cpu_to_fs32(dir->i_sb, inode->i_ino); + ufs_set_de_type(dir->i_sb, de, inode->i_mode); + err = ufs_commit_chunk(page, from, to); + ufs_put_page(page); + dir->i_mtime = dir->i_ctime = CURRENT_TIME_SEC; + mark_inode_dirty(dir); +} - memset (bh_use, 0, sizeof (bh_use)); - toread = 0; - for (block = 0; block < NAMEI_RA_SIZE; ++block) { - struct buffer_head * bh; - if ((block << sb->s_blocksize_bits) >= dir->i_size) - break; - bh = ufs_getfrag (dir, block, 0, &err); - bh_use[block] = bh; - if (bh && !buffer_uptodate(bh)) - bh_read[toread++] = bh; +static void ufs_check_page(struct page *page) +{ + struct inode *dir = page->mapping->host; + struct super_block *sb = dir->i_sb; + char *kaddr = page_address(page); + unsigned offs, rec_len; + unsigned limit = PAGE_CACHE_SIZE; + struct ufs_dir_entry *p; + char *error; + + if ((dir->i_size >> PAGE_CACHE_SHIFT) == page->index) { + limit = dir->i_size & ~PAGE_CACHE_MASK; + if (limit & (UFS_SECTOR_SIZE - 1)) + goto Ebadsize; + if (!limit) + goto out; } + for (offs = 0; offs <= limit - UFS_DIR_REC_LEN(1); offs += rec_len) { + p = (struct ufs_dir_entry *)(kaddr + offs); + rec_len = fs16_to_cpu(sb, p->d_reclen); + + if (rec_len < UFS_DIR_REC_LEN(1)) + goto Eshort; + if (rec_len & 3) + goto Ealign; + if (rec_len < UFS_DIR_REC_LEN(ufs_get_de_namlen(sb, p))) + goto Enamelen; + if (((offs + rec_len - 1) ^ offs) & ~(UFS_SECTOR_SIZE-1)) + goto Espan; + if (fs32_to_cpu(sb, p->d_ino) > (UFS_SB(sb)->s_uspi->s_ipg * + UFS_SB(sb)->s_uspi->s_ncg)) + goto Einumber; + } + if (offs != limit) + goto Eend; +out: + SetPageFsMisc(page); + return; + + /* Too bad, we had an error */ + +Ebadsize: + ufs_error(sb, "ufs_check_page", + "size of directory #%lu is not a multiple of chunk size", + dir->i_ino + ); + goto fail; +Eshort: + error = "rec_len is smaller than minimal"; + goto bad_entry; +Ealign: + error = "unaligned directory entry"; + goto bad_entry; +Enamelen: + error = "rec_len is too small for name_len"; + goto bad_entry; +Espan: + error = "directory entry across blocks"; + goto bad_entry; +Einumber: + error = "inode out of bounds"; +bad_entry: + ufs_error (sb, "ufs_check_page", "bad entry in directory #%lu: %s - " + "offset=%lu, rec_len=%d, name_len=%d", + dir->i_ino, error, (page->index<i_ino, (page->index<i_size; block++) { - struct buffer_head * bh; - struct ufs_dir_entry * de; - char * dlimit; - - if ((block % NAMEI_RA_BLOCKS) == 0 && toread) { - ll_rw_block (READ, toread, bh_read); - toread = 0; - } - bh = bh_use[block % NAMEI_RA_SIZE]; - if (!bh) { - ufs_error (sb, "ufs_find_entry", - "directory #%lu contains a hole at offset %lu", - dir->i_ino, offset); - offset += sb->s_blocksize; - continue; - } - wait_on_buffer (bh); - if (!buffer_uptodate(bh)) { - /* - * read error: all bets are off - */ - break; - } - - de = (struct ufs_dir_entry *) bh->b_data; - dlimit = bh->b_data + sb->s_blocksize; - while ((char *) de < dlimit && offset < dir->i_size) { - /* this code is executed quadratically often */ - /* do minimal checking by hand */ - int de_len; - - if ((char *) de + namelen <= dlimit && - ufs_match(sb, namelen, name, de)) { - /* found a match - - just to be sure, do a full check */ - if (!ufs_check_dir_entry("ufs_find_entry", - dir, de, bh, offset)) - goto failed; - for (i = 0; i < NAMEI_RA_SIZE; ++i) { - if (bh_use[i] != bh) - brelse (bh_use[i]); - } - *res_bh = bh; - return de; - } - /* prevent looping on a bad block */ - de_len = fs16_to_cpu(sb, de->d_reclen); - if (de_len <= 0) - goto failed; - offset += de_len; - de = (struct ufs_dir_entry *) ((char *) de + de_len); - } - - brelse (bh); - if (((block + NAMEI_RA_SIZE) << sb->s_blocksize_bits ) >= - dir->i_size) - bh = NULL; - else - bh = ufs_getfrag (dir, block + NAMEI_RA_SIZE, 0, &err); - bh_use[block % NAMEI_RA_SIZE] = bh; - if (bh && !buffer_uptodate(bh)) - bh_read[toread++] = bh; +static struct page *ufs_get_page(struct inode *dir, unsigned long n) +{ + struct address_space *mapping = dir->i_mapping; + struct page *page = read_cache_page(mapping, n, + (filler_t*)mapping->a_ops->readpage, NULL); + if (!IS_ERR(page)) { + wait_on_page_locked(page); + kmap(page); + if (!PageUptodate(page)) + goto fail; + if (!PageFsMisc(page)) + ufs_check_page(page); + if (PageError(page)) + goto fail; } + return page; -failed: - for (i = 0; i < NAMEI_RA_SIZE; ++i) brelse (bh_use[i]); - UFSD(("EXIT\n")) - return NULL; +fail: + ufs_put_page(page); + return ERR_PTR(-EIO); } -static int -ufs_check_dir_entry (const char *function, struct inode *dir, - struct ufs_dir_entry *de, struct buffer_head *bh, - unsigned long offset) +/* + * Return the offset into page `page_nr' of the last valid + * byte in that page, plus one. + */ +static unsigned +ufs_last_byte(struct inode *inode, unsigned long page_nr) { - struct super_block *sb = dir->i_sb; - const char *error_msg = NULL; - int rlen = fs16_to_cpu(sb, de->d_reclen); - - if (rlen < UFS_DIR_REC_LEN(1)) - error_msg = "reclen is smaller than minimal"; - else if (rlen % 4 != 0) - error_msg = "reclen % 4 != 0"; - else if (rlen < UFS_DIR_REC_LEN(ufs_get_de_namlen(sb, de))) - error_msg = "reclen is too small for namlen"; - else if (((char *) de - bh->b_data) + rlen > dir->i_sb->s_blocksize) - error_msg = "directory entry across blocks"; - else if (fs32_to_cpu(sb, de->d_ino) > (UFS_SB(sb)->s_uspi->s_ipg * - UFS_SB(sb)->s_uspi->s_ncg)) - error_msg = "inode out of bounds"; - - if (error_msg != NULL) - ufs_error (sb, function, "bad entry in directory #%lu, size %Lu: %s - " - "offset=%lu, inode=%lu, reclen=%d, namlen=%d", - dir->i_ino, dir->i_size, error_msg, offset, - (unsigned long)fs32_to_cpu(sb, de->d_ino), - rlen, ufs_get_de_namlen(sb, de)); - - return (error_msg == NULL ? 1 : 0); + unsigned last_byte = inode->i_size; + + last_byte -= page_nr << PAGE_CACHE_SHIFT; + if (last_byte > PAGE_CACHE_SIZE) + last_byte = PAGE_CACHE_SIZE; + return last_byte; } -struct ufs_dir_entry *ufs_dotdot(struct inode *dir, struct buffer_head **p) +static inline struct ufs_dir_entry * +ufs_next_entry(struct super_block *sb, struct ufs_dir_entry *p) { - int err; - struct buffer_head *bh = ufs_bread (dir, 0, 0, &err); - struct ufs_dir_entry *res = NULL; - - if (bh) { - res = (struct ufs_dir_entry *) bh->b_data; - res = (struct ufs_dir_entry *)((char *)res + - fs16_to_cpu(dir->i_sb, res->d_reclen)); - } - *p = bh; - return res; + return (struct ufs_dir_entry *)((char *)p + + fs16_to_cpu(sb, p->d_reclen)); } -ino_t ufs_inode_by_name(struct inode * dir, struct dentry *dentry) + +struct ufs_dir_entry *ufs_dotdot(struct inode *dir, struct page **p) { - ino_t res = 0; - struct ufs_dir_entry * de; - struct buffer_head *bh; + struct page *page = ufs_get_page(dir, 0); + struct ufs_dir_entry *de = NULL; - de = ufs_find_entry (dentry, &bh); - if (de) { - res = fs32_to_cpu(dir->i_sb, de->d_ino); - brelse(bh); + if (!IS_ERR(page)) { + de = ufs_next_entry(dir->i_sb, + (struct ufs_dir_entry *)page_address(page)); + *p = page; } - return res; + return de; } -void ufs_set_link(struct inode *dir, struct ufs_dir_entry *de, - struct buffer_head *bh, struct inode *inode) +/* + * ufs_find_entry() + * + * finds an entry in the specified directory with the wanted name. It + * returns the page in which the entry was found, and the entry itself + * (as a parameter - res_dir). Page is returned mapped and unlocked. + * Entry is guaranteed to be valid. + */ +struct ufs_dir_entry *ufs_find_entry(struct inode *dir, struct dentry *dentry, + struct page **res_page) { - dir->i_version++; - de->d_ino = cpu_to_fs32(dir->i_sb, inode->i_ino); - mark_buffer_dirty(bh); - if (IS_DIRSYNC(dir)) - sync_dirty_buffer(bh); - brelse (bh); + struct super_block *sb = dir->i_sb; + const char *name = dentry->d_name.name; + int namelen = dentry->d_name.len; + unsigned reclen = UFS_DIR_REC_LEN(namelen); + unsigned long start, n; + unsigned long npages = ufs_dir_pages(dir); + struct page *page = NULL; + struct ufs_inode_info *ui = UFS_I(dir); + struct ufs_dir_entry *de; + + UFSD("ENTER, dir_ino %lu, name %s, namlen %u\n", dir->i_ino, name, namelen); + + if (npages == 0 || namelen > UFS_MAXNAMLEN) + goto out; + + /* OFFSET_CACHE */ + *res_page = NULL; + + start = ui->i_dir_start_lookup; + + if (start >= npages) + start = 0; + n = start; + do { + char *kaddr; + page = ufs_get_page(dir, n); + if (!IS_ERR(page)) { + kaddr = page_address(page); + de = (struct ufs_dir_entry *) kaddr; + kaddr += ufs_last_byte(dir, n) - reclen; + while ((char *) de <= kaddr) { + if (de->d_reclen == 0) { + ufs_error(dir->i_sb, __FUNCTION__, + "zero-length directory entry"); + ufs_put_page(page); + goto out; + } + if (ufs_match(sb, namelen, name, de)) + goto found; + de = ufs_next_entry(sb, de); + } + ufs_put_page(page); + } + if (++n >= npages) + n = 0; + } while (n != start); +out: + return NULL; + +found: + *res_page = page; + ui->i_dir_start_lookup = n; + return de; } /* - * ufs_add_entry() - * - * adds a file entry to the specified directory, using the same - * semantics as ufs_find_entry(). It returns NULL if it failed. + * Parent is locked. */ int ufs_add_link(struct dentry *dentry, struct inode *inode) { - struct super_block * sb; - struct ufs_sb_private_info * uspi; - unsigned long offset; - unsigned fragoff; - unsigned short rec_len; - struct buffer_head * bh; - struct ufs_dir_entry * de, * de1; struct inode *dir = dentry->d_parent->d_inode; const char *name = dentry->d_name.name; int namelen = dentry->d_name.len; + struct super_block *sb = dir->i_sb; + unsigned reclen = UFS_DIR_REC_LEN(namelen); + unsigned short rec_len, name_len; + struct page *page = NULL; + struct ufs_dir_entry *de; + unsigned long npages = ufs_dir_pages(dir); + unsigned long n; + char *kaddr; + unsigned from, to; int err; - UFSD(("ENTER, name %s, namelen %u\n", name, namelen)) - - sb = dir->i_sb; - uspi = UFS_SB(sb)->s_uspi; - - if (!namelen) - return -EINVAL; - bh = ufs_bread (dir, 0, 0, &err); - if (!bh) - return err; - rec_len = UFS_DIR_REC_LEN(namelen); - offset = 0; - de = (struct ufs_dir_entry *) bh->b_data; - while (1) { - if ((char *)de >= UFS_SECTOR_SIZE + bh->b_data) { - fragoff = offset & ~uspi->s_fmask; - if (fragoff != 0 && fragoff != UFS_SECTOR_SIZE) - ufs_error (sb, "ufs_add_entry", "internal error" - " fragoff %u", fragoff); - if (!fragoff) { - brelse (bh); - bh = ufs_bread (dir, offset >> sb->s_blocksize_bits, 1, &err); - if (!bh) - return err; - } - if (dir->i_size <= offset) { - if (dir->i_size == 0) { - brelse(bh); - return -ENOENT; - } - de = (struct ufs_dir_entry *) (bh->b_data + fragoff); - de->d_ino = 0; + UFSD("ENTER, name %s, namelen %u\n", name, namelen); + + /* + * We take care of directory expansion in the same loop. + * This code plays outside i_size, so it locks the page + * to protect that region. + */ + for (n = 0; n <= npages; n++) { + char *dir_end; + + page = ufs_get_page(dir, n); + err = PTR_ERR(page); + if (IS_ERR(page)) + goto out; + lock_page(page); + kaddr = page_address(page); + dir_end = kaddr + ufs_last_byte(dir, n); + de = (struct ufs_dir_entry *)kaddr; + kaddr += PAGE_CACHE_SIZE - reclen; + while ((char *)de <= kaddr) { + if ((char *)de == dir_end) { + /* We hit i_size */ + name_len = 0; + rec_len = UFS_SECTOR_SIZE; de->d_reclen = cpu_to_fs16(sb, UFS_SECTOR_SIZE); - ufs_set_de_namlen(sb, de, 0); - dir->i_size = offset + UFS_SECTOR_SIZE; - mark_inode_dirty(dir); - } else { - de = (struct ufs_dir_entry *) bh->b_data; + de->d_ino = 0; + goto got_it; } + if (de->d_reclen == 0) { + ufs_error(dir->i_sb, __FUNCTION__, + "zero-length directory entry"); + err = -EIO; + goto out_unlock; + } + err = -EEXIST; + if (ufs_match(sb, namelen, name, de)) + goto out_unlock; + name_len = UFS_DIR_REC_LEN(ufs_get_de_namlen(sb, de)); + rec_len = fs16_to_cpu(sb, de->d_reclen); + if (!de->d_ino && rec_len >= reclen) + goto got_it; + if (rec_len >= name_len + reclen) + goto got_it; + de = (struct ufs_dir_entry *) ((char *) de + rec_len); } - if (!ufs_check_dir_entry ("ufs_add_entry", dir, de, bh, offset)) { - brelse (bh); - return -ENOENT; - } - if (ufs_match(sb, namelen, name, de)) { - brelse (bh); - return -EEXIST; - } - if (de->d_ino == 0 && fs16_to_cpu(sb, de->d_reclen) >= rec_len) - break; - - if (fs16_to_cpu(sb, de->d_reclen) >= - UFS_DIR_REC_LEN(ufs_get_de_namlen(sb, de)) + rec_len) - break; - offset += fs16_to_cpu(sb, de->d_reclen); - de = (struct ufs_dir_entry *) ((char *) de + fs16_to_cpu(sb, de->d_reclen)); + unlock_page(page); + ufs_put_page(page); } - + BUG(); + return -EINVAL; + +got_it: + from = (char*)de - (char*)page_address(page); + to = from + rec_len; + err = page->mapping->a_ops->prepare_write(NULL, page, from, to); + if (err) + goto out_unlock; if (de->d_ino) { - de1 = (struct ufs_dir_entry *) ((char *) de + - UFS_DIR_REC_LEN(ufs_get_de_namlen(sb, de))); - de1->d_reclen = - cpu_to_fs16(sb, fs16_to_cpu(sb, de->d_reclen) - - UFS_DIR_REC_LEN(ufs_get_de_namlen(sb, de))); - de->d_reclen = - cpu_to_fs16(sb, UFS_DIR_REC_LEN(ufs_get_de_namlen(sb, de))); + struct ufs_dir_entry *de1 = + (struct ufs_dir_entry *) ((char *) de + name_len); + de1->d_reclen = cpu_to_fs16(sb, rec_len - name_len); + de->d_reclen = cpu_to_fs16(sb, name_len); + de = de1; } - de->d_ino = 0; + ufs_set_de_namlen(sb, de, namelen); - memcpy (de->d_name, name, namelen + 1); + memcpy(de->d_name, name, namelen + 1); de->d_ino = cpu_to_fs32(sb, inode->i_ino); ufs_set_de_type(sb, de, inode->i_mode); - mark_buffer_dirty(bh); - if (IS_DIRSYNC(dir)) - sync_dirty_buffer(bh); - brelse (bh); + + err = ufs_commit_chunk(page, from, to); dir->i_mtime = dir->i_ctime = CURRENT_TIME_SEC; - dir->i_version++; + mark_inode_dirty(dir); + /* OFFSET_CACHE */ +out_put: + ufs_put_page(page); +out: + return err; +out_unlock: + unlock_page(page); + goto out_put; +} - UFSD(("EXIT\n")) +static inline unsigned +ufs_validate_entry(struct super_block *sb, char *base, + unsigned offset, unsigned mask) +{ + struct ufs_dir_entry *de = (struct ufs_dir_entry*)(base + offset); + struct ufs_dir_entry *p = (struct ufs_dir_entry*)(base + (offset&mask)); + while ((char*)p < (char*)de) { + if (p->d_reclen == 0) + break; + p = ufs_next_entry(sb, p); + } + return (char *)p - base; +} + + +/* + * This is blatantly stolen from ext2fs + */ +static int +ufs_readdir(struct file *filp, void *dirent, filldir_t filldir) +{ + loff_t pos = filp->f_pos; + struct inode *inode = filp->f_dentry->d_inode; + struct super_block *sb = inode->i_sb; + unsigned int offset = pos & ~PAGE_CACHE_MASK; + unsigned long n = pos >> PAGE_CACHE_SHIFT; + unsigned long npages = ufs_dir_pages(inode); + unsigned chunk_mask = ~(UFS_SECTOR_SIZE - 1); + int need_revalidate = filp->f_version != inode->i_version; + unsigned flags = UFS_SB(sb)->s_flags; + + UFSD("BEGIN\n"); + + if (pos > inode->i_size - UFS_DIR_REC_LEN(1)) + return 0; + + for ( ; n < npages; n++, offset = 0) { + char *kaddr, *limit; + struct ufs_dir_entry *de; + + struct page *page = ufs_get_page(inode, n); + + if (IS_ERR(page)) { + ufs_error(sb, __FUNCTION__, + "bad page in #%lu", + inode->i_ino); + filp->f_pos += PAGE_CACHE_SIZE - offset; + return -EIO; + } + kaddr = page_address(page); + if (unlikely(need_revalidate)) { + if (offset) { + offset = ufs_validate_entry(sb, kaddr, offset, chunk_mask); + filp->f_pos = (n<f_version = inode->i_version; + need_revalidate = 0; + } + de = (struct ufs_dir_entry *)(kaddr+offset); + limit = kaddr + ufs_last_byte(inode, n) - UFS_DIR_REC_LEN(1); + for ( ;(char*)de <= limit; de = ufs_next_entry(sb, de)) { + if (de->d_reclen == 0) { + ufs_error(sb, __FUNCTION__, + "zero-length directory entry"); + ufs_put_page(page); + return -EIO; + } + if (de->d_ino) { + int over; + unsigned char d_type = DT_UNKNOWN; + + offset = (char *)de - kaddr; + + UFSD("filldir(%s,%u)\n", de->d_name, + fs32_to_cpu(sb, de->d_ino)); + UFSD("namlen %u\n", ufs_get_de_namlen(sb, de)); + + if ((flags & UFS_DE_MASK) == UFS_DE_44BSD) + d_type = de->d_u.d_44.d_type; + + over = filldir(dirent, de->d_name, + ufs_get_de_namlen(sb, de), + (n<d_ino), d_type); + if (over) { + ufs_put_page(page); + return 0; + } + } + filp->f_pos += fs16_to_cpu(sb, de->d_reclen); + } + ufs_put_page(page); + } return 0; } + /* * ufs_delete_entry deletes a directory entry by merging it with the * previous entry. */ -int ufs_delete_entry (struct inode * inode, struct ufs_dir_entry * dir, - struct buffer_head * bh ) - +int ufs_delete_entry(struct inode *inode, struct ufs_dir_entry *dir, + struct page * page) { - struct super_block * sb; - struct ufs_dir_entry * de, * pde; - unsigned i; - - UFSD(("ENTER\n")) + struct super_block *sb = inode->i_sb; + struct address_space *mapping = page->mapping; + char *kaddr = page_address(page); + unsigned from = ((char*)dir - kaddr) & ~(UFS_SECTOR_SIZE - 1); + unsigned to = ((char*)dir - kaddr) + fs16_to_cpu(sb, dir->d_reclen); + struct ufs_dir_entry *pde = NULL; + struct ufs_dir_entry *de = (struct ufs_dir_entry *) (kaddr + from); + int err; - sb = inode->i_sb; - i = 0; - pde = NULL; - de = (struct ufs_dir_entry *) bh->b_data; - - UFSD(("ino %u, reclen %u, namlen %u, name %s\n", - fs32_to_cpu(sb, de->d_ino), - fs16_to_cpu(sb, de->d_reclen), - ufs_get_de_namlen(sb, de), de->d_name)) - - while (i < bh->b_size) { - if (!ufs_check_dir_entry ("ufs_delete_entry", inode, de, bh, i)) { - brelse(bh); - return -EIO; - } - if (de == dir) { - if (pde) - fs16_add(sb, &pde->d_reclen, - fs16_to_cpu(sb, dir->d_reclen)); - dir->d_ino = 0; - inode->i_version++; - inode->i_ctime = inode->i_mtime = CURRENT_TIME_SEC; - mark_inode_dirty(inode); - mark_buffer_dirty(bh); - if (IS_DIRSYNC(inode)) - sync_dirty_buffer(bh); - brelse(bh); - UFSD(("EXIT\n")) - return 0; + UFSD("ENTER\n"); + + UFSD("ino %u, reclen %u, namlen %u, name %s\n", + fs32_to_cpu(sb, de->d_ino), + fs16_to_cpu(sb, de->d_reclen), + ufs_get_de_namlen(sb, de), de->d_name); + + while ((char*)de < (char*)dir) { + if (de->d_reclen == 0) { + ufs_error(inode->i_sb, __FUNCTION__, + "zero-length directory entry"); + err = -EIO; + goto out; } - i += fs16_to_cpu(sb, de->d_reclen); - if (i == UFS_SECTOR_SIZE) pde = NULL; - else pde = de; - de = (struct ufs_dir_entry *) - ((char *) de + fs16_to_cpu(sb, de->d_reclen)); - if (i == UFS_SECTOR_SIZE && de->d_reclen == 0) - break; + pde = de; + de = ufs_next_entry(sb, de); } - UFSD(("EXIT\n")) - brelse(bh); - return -ENOENT; + if (pde) + from = (char*)pde - (char*)page_address(page); + lock_page(page); + err = mapping->a_ops->prepare_write(NULL, page, from, to); + BUG_ON(err); + if (pde) + pde->d_reclen = cpu_to_fs16(sb, to-from); + dir->d_ino = 0; + err = ufs_commit_chunk(page, from, to); + inode->i_ctime = inode->i_mtime = CURRENT_TIME_SEC; + mark_inode_dirty(inode); +out: + ufs_put_page(page); + UFSD("EXIT\n"); + return err; } int ufs_make_empty(struct inode * inode, struct inode *dir) { struct super_block * sb = dir->i_sb; - struct buffer_head * dir_block; + struct address_space *mapping = inode->i_mapping; + struct page *page = grab_cache_page(mapping, 0); struct ufs_dir_entry * de; + char *base; int err; - dir_block = ufs_bread (inode, 0, 1, &err); - if (!dir_block) - return err; + if (!page) + return -ENOMEM; + kmap(page); + err = mapping->a_ops->prepare_write(NULL, page, 0, UFS_SECTOR_SIZE); + if (err) { + unlock_page(page); + goto fail; + } + + + base = (char*)page_address(page); + memset(base, 0, PAGE_CACHE_SIZE); + + de = (struct ufs_dir_entry *) base; - inode->i_blocks = sb->s_blocksize / UFS_SECTOR_SIZE; - de = (struct ufs_dir_entry *) dir_block->b_data; de->d_ino = cpu_to_fs32(sb, inode->i_ino); ufs_set_de_type(sb, de, inode->i_mode); ufs_set_de_namlen(sb, de, 1); @@ -552,72 +587,65 @@ int ufs_make_empty(struct inode * inode, struct inode *dir) de->d_reclen = cpu_to_fs16(sb, UFS_SECTOR_SIZE - UFS_DIR_REC_LEN(1)); ufs_set_de_namlen(sb, de, 2); strcpy (de->d_name, ".."); - mark_buffer_dirty(dir_block); - brelse (dir_block); - mark_inode_dirty(inode); - return 0; + + err = ufs_commit_chunk(page, 0, UFS_SECTOR_SIZE); +fail: + kunmap(page); + page_cache_release(page); + return err; } /* * routine to check that the specified directory is empty (for rmdir) */ -int ufs_empty_dir (struct inode * inode) +int ufs_empty_dir(struct inode * inode) { - struct super_block * sb; - unsigned long offset; - struct buffer_head * bh; - struct ufs_dir_entry * de, * de1; - int err; - - sb = inode->i_sb; - - if (inode->i_size < UFS_DIR_REC_LEN(1) + UFS_DIR_REC_LEN(2) || - !(bh = ufs_bread (inode, 0, 0, &err))) { - ufs_warning (inode->i_sb, "empty_dir", - "bad directory (dir #%lu) - no data block", - inode->i_ino); - return 1; - } - de = (struct ufs_dir_entry *) bh->b_data; - de1 = (struct ufs_dir_entry *) - ((char *)de + fs16_to_cpu(sb, de->d_reclen)); - if (fs32_to_cpu(sb, de->d_ino) != inode->i_ino || de1->d_ino == 0 || - strcmp (".", de->d_name) || strcmp ("..", de1->d_name)) { - ufs_warning (inode->i_sb, "empty_dir", - "bad directory (dir #%lu) - no `.' or `..'", - inode->i_ino); - return 1; - } - offset = fs16_to_cpu(sb, de->d_reclen) + fs16_to_cpu(sb, de1->d_reclen); - de = (struct ufs_dir_entry *) - ((char *)de1 + fs16_to_cpu(sb, de1->d_reclen)); - while (offset < inode->i_size ) { - if (!bh || (void *) de >= (void *) (bh->b_data + sb->s_blocksize)) { - brelse (bh); - bh = ufs_bread (inode, offset >> sb->s_blocksize_bits, 1, &err); - if (!bh) { - ufs_error (sb, "empty_dir", - "directory #%lu contains a hole at offset %lu", - inode->i_ino, offset); - offset += sb->s_blocksize; - continue; + struct super_block *sb = inode->i_sb; + struct page *page = NULL; + unsigned long i, npages = ufs_dir_pages(inode); + + for (i = 0; i < npages; i++) { + char *kaddr; + struct ufs_dir_entry *de; + page = ufs_get_page(inode, i); + + if (IS_ERR(page)) + continue; + + kaddr = page_address(page); + de = (struct ufs_dir_entry *)kaddr; + kaddr += ufs_last_byte(inode, i) - UFS_DIR_REC_LEN(1); + + while ((char *)de <= kaddr) { + if (de->d_reclen == 0) { + ufs_error(inode->i_sb, __FUNCTION__, + "zero-length directory entry: " + "kaddr=%p, de=%p\n", kaddr, de); + goto not_empty; } - de = (struct ufs_dir_entry *) bh->b_data; - } - if (!ufs_check_dir_entry ("empty_dir", inode, de, bh, offset)) { - brelse (bh); - return 1; - } - if (de->d_ino) { - brelse (bh); - return 0; + if (de->d_ino) { + u16 namelen=ufs_get_de_namlen(sb, de); + /* check for . and .. */ + if (de->d_name[0] != '.') + goto not_empty; + if (namelen > 2) + goto not_empty; + if (namelen < 2) { + if (inode->i_ino != + fs32_to_cpu(sb, de->d_ino)) + goto not_empty; + } else if (de->d_name[1] != '.') + goto not_empty; + } + de = ufs_next_entry(sb, de); } - offset += fs16_to_cpu(sb, de->d_reclen); - de = (struct ufs_dir_entry *) - ((char *)de + fs16_to_cpu(sb, de->d_reclen)); + ufs_put_page(page); } - brelse (bh); return 1; + +not_empty: + ufs_put_page(page); + return 0; } const struct file_operations ufs_dir_operations = { diff --git a/fs/ufs/file.c b/fs/ufs/file.c index 312fd3f86..a9c6e5f04 100644 --- a/fs/ufs/file.c +++ b/fs/ufs/file.c @@ -25,6 +25,26 @@ #include #include +#include /* for sync_mapping_buffers() */ + +static int ufs_sync_file(struct file *file, struct dentry *dentry, int datasync) +{ + struct inode *inode = dentry->d_inode; + int err; + int ret; + + ret = sync_mapping_buffers(inode->i_mapping); + if (!(inode->i_state & I_DIRTY)) + return ret; + if (datasync && !(inode->i_state & I_DIRTY_DATASYNC)) + return ret; + + err = ufs_sync_inode(inode); + if (ret == 0) + ret = err; + return ret; +} + /* * We have mostly NULL's here: the current defaults are ok for @@ -37,9 +57,6 @@ const struct file_operations ufs_file_operations = { .write = generic_file_write, .mmap = generic_file_mmap, .open = generic_file_open, + .fsync = ufs_sync_file, .sendfile = generic_file_sendfile, }; - -struct inode_operations ufs_file_inode_operations = { - .truncate = ufs_truncate, -}; diff --git a/fs/ufs/ialloc.c b/fs/ufs/ialloc.c index c7a47ed4f..2ad1259c6 100644 --- a/fs/ufs/ialloc.c +++ b/fs/ufs/ialloc.c @@ -34,14 +34,6 @@ #include "swab.h" #include "util.h" -#undef UFS_IALLOC_DEBUG - -#ifdef UFS_IALLOC_DEBUG -#define UFSD(x) printk("(%s, %d), %s: ", __FILE__, __LINE__, __FUNCTION__); printk x; -#else -#define UFSD(x) -#endif - /* * NOTE! When we get the inode, we're the only people * that have access to it, and as such there are no @@ -68,7 +60,7 @@ void ufs_free_inode (struct inode * inode) int is_directory; unsigned ino, cg, bit; - UFSD(("ENTER, ino %lu\n", inode->i_ino)) + UFSD("ENTER, ino %lu\n", inode->i_ino); sb = inode->i_sb; uspi = UFS_SB(sb)->s_uspi; @@ -91,7 +83,7 @@ void ufs_free_inode (struct inode * inode) unlock_super (sb); return; } - ucg = ubh_get_ucg(UCPI_UBH); + ucg = ubh_get_ucg(UCPI_UBH(ucpi)); if (!ufs_cg_chkmagic(sb, ucg)) ufs_panic (sb, "ufs_free_fragments", "internal error, bad cg magic number"); @@ -104,33 +96,33 @@ void ufs_free_inode (struct inode * inode) clear_inode (inode); - if (ubh_isclr (UCPI_UBH, ucpi->c_iusedoff, bit)) + if (ubh_isclr (UCPI_UBH(ucpi), ucpi->c_iusedoff, bit)) ufs_error(sb, "ufs_free_inode", "bit already cleared for inode %u", ino); else { - ubh_clrbit (UCPI_UBH, ucpi->c_iusedoff, bit); + ubh_clrbit (UCPI_UBH(ucpi), ucpi->c_iusedoff, bit); if (ino < ucpi->c_irotor) ucpi->c_irotor = ino; fs32_add(sb, &ucg->cg_cs.cs_nifree, 1); - fs32_add(sb, &usb1->fs_cstotal.cs_nifree, 1); + uspi->cs_total.cs_nifree++; fs32_add(sb, &UFS_SB(sb)->fs_cs(cg).cs_nifree, 1); if (is_directory) { fs32_sub(sb, &ucg->cg_cs.cs_ndir, 1); - fs32_sub(sb, &usb1->fs_cstotal.cs_ndir, 1); + uspi->cs_total.cs_ndir--; fs32_sub(sb, &UFS_SB(sb)->fs_cs(cg).cs_ndir, 1); } } - ubh_mark_buffer_dirty (USPI_UBH); - ubh_mark_buffer_dirty (UCPI_UBH); + ubh_mark_buffer_dirty (USPI_UBH(uspi)); + ubh_mark_buffer_dirty (UCPI_UBH(ucpi)); if (sb->s_flags & MS_SYNCHRONOUS) { - ubh_ll_rw_block (SWRITE, 1, (struct ufs_buffer_head **) &ucpi); - ubh_wait_on_buffer (UCPI_UBH); + ubh_ll_rw_block(SWRITE, UCPI_UBH(ucpi)); + ubh_wait_on_buffer (UCPI_UBH(ucpi)); } sb->s_dirt = 1; unlock_super (sb); - UFSD(("EXIT\n")) + UFSD("EXIT\n"); } /* @@ -155,7 +147,7 @@ struct inode * ufs_new_inode(struct inode * dir, int mode) unsigned cg, bit, i, j, start; struct ufs_inode_info *ufsi; - UFSD(("ENTER\n")) + UFSD("ENTER\n"); /* Cannot create files in a deleted directory */ if (!dir || !dir->i_nlink) @@ -213,43 +205,43 @@ cg_found: ucpi = ufs_load_cylinder (sb, cg); if (!ucpi) goto failed; - ucg = ubh_get_ucg(UCPI_UBH); + ucg = ubh_get_ucg(UCPI_UBH(ucpi)); if (!ufs_cg_chkmagic(sb, ucg)) ufs_panic (sb, "ufs_new_inode", "internal error, bad cg magic number"); start = ucpi->c_irotor; - bit = ubh_find_next_zero_bit (UCPI_UBH, ucpi->c_iusedoff, uspi->s_ipg, start); + bit = ubh_find_next_zero_bit (UCPI_UBH(ucpi), ucpi->c_iusedoff, uspi->s_ipg, start); if (!(bit < uspi->s_ipg)) { - bit = ubh_find_first_zero_bit (UCPI_UBH, ucpi->c_iusedoff, start); + bit = ubh_find_first_zero_bit (UCPI_UBH(ucpi), ucpi->c_iusedoff, start); if (!(bit < start)) { ufs_error (sb, "ufs_new_inode", "cylinder group %u corrupted - error in inode bitmap\n", cg); goto failed; } } - UFSD(("start = %u, bit = %u, ipg = %u\n", start, bit, uspi->s_ipg)) - if (ubh_isclr (UCPI_UBH, ucpi->c_iusedoff, bit)) - ubh_setbit (UCPI_UBH, ucpi->c_iusedoff, bit); + UFSD("start = %u, bit = %u, ipg = %u\n", start, bit, uspi->s_ipg); + if (ubh_isclr (UCPI_UBH(ucpi), ucpi->c_iusedoff, bit)) + ubh_setbit (UCPI_UBH(ucpi), ucpi->c_iusedoff, bit); else { ufs_panic (sb, "ufs_new_inode", "internal error"); goto failed; } fs32_sub(sb, &ucg->cg_cs.cs_nifree, 1); - fs32_sub(sb, &usb1->fs_cstotal.cs_nifree, 1); + uspi->cs_total.cs_nifree--; fs32_sub(sb, &sbi->fs_cs(cg).cs_nifree, 1); if (S_ISDIR(mode)) { fs32_add(sb, &ucg->cg_cs.cs_ndir, 1); - fs32_add(sb, &usb1->fs_cstotal.cs_ndir, 1); + uspi->cs_total.cs_ndir++; fs32_add(sb, &sbi->fs_cs(cg).cs_ndir, 1); } - ubh_mark_buffer_dirty (USPI_UBH); - ubh_mark_buffer_dirty (UCPI_UBH); + ubh_mark_buffer_dirty (USPI_UBH(uspi)); + ubh_mark_buffer_dirty (UCPI_UBH(ucpi)); if (sb->s_flags & MS_SYNCHRONOUS) { - ubh_ll_rw_block (SWRITE, 1, (struct ufs_buffer_head **) &ucpi); - ubh_wait_on_buffer (UCPI_UBH); + ubh_ll_rw_block(SWRITE, UCPI_UBH(ucpi)); + ubh_wait_on_buffer (UCPI_UBH(ucpi)); } sb->s_dirt = 1; @@ -263,7 +255,6 @@ cg_found: inode->i_gid = current->fsgid; inode->i_ino = cg * uspi->s_ipg + bit; - inode->i_blksize = PAGE_SIZE; /* This is the optimal IO size (for stat), not the fs block size */ inode->i_blocks = 0; inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC; ufsi->i_flags = UFS_I(dir)->i_flags; @@ -272,6 +263,7 @@ cg_found: ufsi->i_shadow = 0; ufsi->i_osync = 0; ufsi->i_oeftflag = 0; + ufsi->i_dir_start_lookup = 0; memset(&ufsi->i_u1, 0, sizeof(ufsi->i_u1)); insert_inode_hash(inode); @@ -287,14 +279,14 @@ cg_found: return ERR_PTR(-EDQUOT); } - UFSD(("allocating inode %lu\n", inode->i_ino)) - UFSD(("EXIT\n")) + UFSD("allocating inode %lu\n", inode->i_ino); + UFSD("EXIT\n"); return inode; failed: unlock_super (sb); make_bad_inode(inode); iput (inode); - UFSD(("EXIT (FAILED)\n")) + UFSD("EXIT (FAILED)\n"); return ERR_PTR(-ENOSPC); } diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c index 3c3f62ce2..ee1eaa6f4 100644 --- a/fs/ufs/inode.c +++ b/fs/ufs/inode.c @@ -41,14 +41,7 @@ #include "swab.h" #include "util.h" -#undef UFS_INODE_DEBUG -#undef UFS_INODE_DEBUG_MORE - -#ifdef UFS_INODE_DEBUG -#define UFSD(x) printk("(%s, %d), %s: ", __FILE__, __LINE__, __FUNCTION__); printk x; -#else -#define UFSD(x) -#endif +static u64 ufs_frag_map(struct inode *inode, sector_t frag); static int ufs_block_to_path(struct inode *inode, sector_t i_block, sector_t offsets[4]) { @@ -61,7 +54,7 @@ static int ufs_block_to_path(struct inode *inode, sector_t i_block, sector_t off int n = 0; - UFSD(("ptrs=uspi->s_apb = %d,double_blocks=%ld \n",ptrs,double_blocks)); + UFSD("ptrs=uspi->s_apb = %d,double_blocks=%ld \n",ptrs,double_blocks); if (i_block < 0) { ufs_warning(inode->i_sb, "ufs_block_to_path", "block < 0"); } else if (i_block < direct_blocks) { @@ -89,7 +82,7 @@ static int ufs_block_to_path(struct inode *inode, sector_t i_block, sector_t off * the begining of the filesystem. */ -u64 ufs_frag_map(struct inode *inode, sector_t frag) +static u64 ufs_frag_map(struct inode *inode, sector_t frag) { struct ufs_inode_info *ufsi = UFS_I(inode); struct super_block *sb = inode->i_sb; @@ -104,8 +97,10 @@ u64 ufs_frag_map(struct inode *inode, sector_t frag) unsigned flags = UFS_SB(sb)->s_flags; u64 temp = 0L; - UFSD((": frag = %llu depth = %d\n", (unsigned long long)frag, depth)); - UFSD((": uspi->s_fpbshift = %d ,uspi->s_apbmask = %x, mask=%llx\n",uspi->s_fpbshift,uspi->s_apbmask,mask)); + UFSD(": frag = %llu depth = %d\n", (unsigned long long)frag, depth); + UFSD(": uspi->s_fpbshift = %d ,uspi->s_apbmask = %x, mask=%llx\n", + uspi->s_fpbshift, uspi->s_apbmask, + (unsigned long long)mask); if (depth == 0) return 0; @@ -161,26 +156,66 @@ out: return ret; } -static struct buffer_head * ufs_inode_getfrag (struct inode *inode, - unsigned int fragment, unsigned int new_fragment, - unsigned int required, int *err, int metadata, long *phys, int *new) +static void ufs_clear_frag(struct inode *inode, struct buffer_head *bh) +{ + lock_buffer(bh); + memset(bh->b_data, 0, inode->i_sb->s_blocksize); + set_buffer_uptodate(bh); + mark_buffer_dirty(bh); + unlock_buffer(bh); + if (IS_SYNC(inode)) + sync_dirty_buffer(bh); +} + +static struct buffer_head * +ufs_clear_frags(struct inode *inode, sector_t beg, + unsigned int n, sector_t want) +{ + struct buffer_head *res = NULL, *bh; + sector_t end = beg + n; + + for (; beg < end; ++beg) { + bh = sb_getblk(inode->i_sb, beg); + ufs_clear_frag(inode, bh); + if (want != beg) + brelse(bh); + else + res = bh; + } + BUG_ON(!res); + return res; +} + +/** + * ufs_inode_getfrag() - allocate new fragment(s) + * @inode - pointer to inode + * @fragment - number of `fragment' which hold pointer + * to new allocated fragment(s) + * @new_fragment - number of new allocated fragment(s) + * @required - how many fragment(s) we require + * @err - we set it if something wrong + * @phys - pointer to where we save physical number of new allocated fragments, + * NULL if we allocate not data(indirect blocks for example). + * @new - we set it if we allocate new block + * @locked_page - for ufs_new_fragments() + */ +static struct buffer_head * +ufs_inode_getfrag(struct inode *inode, unsigned int fragment, + sector_t new_fragment, unsigned int required, int *err, + long *phys, int *new, struct page *locked_page) { struct ufs_inode_info *ufsi = UFS_I(inode); - struct super_block * sb; - struct ufs_sb_private_info * uspi; + struct super_block *sb = inode->i_sb; + struct ufs_sb_private_info *uspi = UFS_SB(sb)->s_uspi; struct buffer_head * result; unsigned block, blockoff, lastfrag, lastblock, lastblockoff; unsigned tmp, goal; __fs32 * p, * p2; - unsigned flags = 0; - UFSD(("ENTER, ino %lu, fragment %u, new_fragment %u, required %u\n", - inode->i_ino, fragment, new_fragment, required)) + UFSD("ENTER, ino %lu, fragment %u, new_fragment %llu, required %u, " + "metadata %d\n", inode->i_ino, fragment, + (unsigned long long)new_fragment, required, !phys); - sb = inode->i_sb; - uspi = UFS_SB(sb)->s_uspi; - - flags = UFS_SB(sb)->s_flags; /* TODO : to be done for write support if ( (flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) goto ufs2; @@ -195,16 +230,16 @@ repeat: tmp = fs32_to_cpu(sb, *p); lastfrag = ufsi->i_lastfrag; if (tmp && fragment < lastfrag) { - if (metadata) { + if (!phys) { result = sb_getblk(sb, uspi->s_sbbase + tmp + blockoff); if (tmp == fs32_to_cpu(sb, *p)) { - UFSD(("EXIT, result %u\n", tmp + blockoff)) + UFSD("EXIT, result %u\n", tmp + blockoff); return result; } brelse (result); goto repeat; } else { - *phys = tmp; + *phys = tmp + blockoff; return NULL; } } @@ -221,7 +256,8 @@ repeat: if (lastblockoff) { p2 = ufsi->i_u1.i_data + lastblock; tmp = ufs_new_fragments (inode, p2, lastfrag, - fs32_to_cpu(sb, *p2), uspi->s_fpb - lastblockoff, err); + fs32_to_cpu(sb, *p2), uspi->s_fpb - lastblockoff, + err, locked_page); if (!tmp) { if (lastfrag != ufsi->i_lastfrag) goto repeat; @@ -231,25 +267,31 @@ repeat: lastfrag = ufsi->i_lastfrag; } - goal = fs32_to_cpu(sb, ufsi->i_u1.i_data[lastblock]) + uspi->s_fpb; + tmp = fs32_to_cpu(sb, ufsi->i_u1.i_data[lastblock]); + if (tmp) + goal = tmp + uspi->s_fpb; tmp = ufs_new_fragments (inode, p, fragment - blockoff, - goal, required + blockoff, err); + goal, required + blockoff, + err, locked_page); } /* * We will extend last allocated block */ else if (lastblock == block) { - tmp = ufs_new_fragments (inode, p, fragment - (blockoff - lastblockoff), - fs32_to_cpu(sb, *p), required + (blockoff - lastblockoff), err); - } + tmp = ufs_new_fragments(inode, p, fragment - (blockoff - lastblockoff), + fs32_to_cpu(sb, *p), required + (blockoff - lastblockoff), + err, locked_page); + } else /* (lastblock > block) */ { /* * We will allocate new block before last allocated block */ - else /* (lastblock > block) */ { - if (lastblock && (tmp = fs32_to_cpu(sb, ufsi->i_u1.i_data[lastblock-1]))) - goal = tmp + uspi->s_fpb; - tmp = ufs_new_fragments (inode, p, fragment - blockoff, - goal, uspi->s_fpb, err); + if (block) { + tmp = fs32_to_cpu(sb, ufsi->i_u1.i_data[block-1]); + if (tmp) + goal = tmp + uspi->s_fpb; + } + tmp = ufs_new_fragments(inode, p, fragment - blockoff, + goal, uspi->s_fpb, err, locked_page); } if (!tmp) { if ((!blockoff && *p) || @@ -259,14 +301,10 @@ repeat: return NULL; } - /* The nullification of framgents done in ufs/balloc.c is - * something I don't have the stomache to move into here right - * now. -DaveM - */ - if (metadata) { - result = sb_getblk(inode->i_sb, tmp + blockoff); + if (!phys) { + result = ufs_clear_frags(inode, tmp, required, tmp + blockoff); } else { - *phys = tmp; + *phys = tmp + blockoff; result = NULL; *err = 0; *new = 1; @@ -276,7 +314,7 @@ repeat: if (IS_SYNC(inode)) ufs_sync_inode (inode); mark_inode_dirty(inode); - UFSD(("EXIT, result %u\n", tmp + blockoff)) + UFSD("EXIT, result %u\n", tmp + blockoff); return result; /* This part : To be implemented .... @@ -295,22 +333,35 @@ repeat2: */ } -static struct buffer_head * ufs_block_getfrag (struct inode *inode, - struct buffer_head *bh, unsigned int fragment, unsigned int new_fragment, - unsigned int blocksize, int * err, int metadata, long *phys, int *new) +/** + * ufs_inode_getblock() - allocate new block + * @inode - pointer to inode + * @bh - pointer to block which hold "pointer" to new allocated block + * @fragment - number of `fragment' which hold pointer + * to new allocated block + * @new_fragment - number of new allocated fragment + * (block will hold this fragment and also uspi->s_fpb-1) + * @err - see ufs_inode_getfrag() + * @phys - see ufs_inode_getfrag() + * @new - see ufs_inode_getfrag() + * @locked_page - see ufs_inode_getfrag() + */ +static struct buffer_head * +ufs_inode_getblock(struct inode *inode, struct buffer_head *bh, + unsigned int fragment, sector_t new_fragment, int *err, + long *phys, int *new, struct page *locked_page) { - struct super_block * sb; - struct ufs_sb_private_info * uspi; + struct super_block *sb = inode->i_sb; + struct ufs_sb_private_info *uspi = UFS_SB(sb)->s_uspi; struct buffer_head * result; unsigned tmp, goal, block, blockoff; __fs32 * p; - sb = inode->i_sb; - uspi = UFS_SB(sb)->s_uspi; block = ufs_fragstoblks (fragment); blockoff = ufs_fragnum (fragment); - UFSD(("ENTER, ino %lu, fragment %u, new_fragment %u\n", inode->i_ino, fragment, new_fragment)) + UFSD("ENTER, ino %lu, fragment %u, new_fragment %llu, metadata %d\n", + inode->i_ino, fragment, (unsigned long long)new_fragment, !phys); result = NULL; if (!bh) @@ -326,37 +377,36 @@ static struct buffer_head * ufs_block_getfrag (struct inode *inode, repeat: tmp = fs32_to_cpu(sb, *p); if (tmp) { - if (metadata) { + if (!phys) { result = sb_getblk(sb, uspi->s_sbbase + tmp + blockoff); if (tmp == fs32_to_cpu(sb, *p)) goto out; brelse (result); goto repeat; } else { - *phys = tmp; + *phys = tmp + blockoff; goto out; } } - if (block && (tmp = fs32_to_cpu(sb, ((__fs32*)bh->b_data)[block-1]) + uspi->s_fpb)) + if (block && (tmp = fs32_to_cpu(sb, ((__fs32*)bh->b_data)[block-1]))) goal = tmp + uspi->s_fpb; else goal = bh->b_blocknr + uspi->s_fpb; - tmp = ufs_new_fragments (inode, p, ufs_blknum(new_fragment), goal, uspi->s_fpb, err); + tmp = ufs_new_fragments(inode, p, ufs_blknum(new_fragment), goal, + uspi->s_fpb, err, locked_page); if (!tmp) { if (fs32_to_cpu(sb, *p)) goto repeat; goto out; } - /* The nullification of framgents done in ufs/balloc.c is - * something I don't have the stomache to move into here right - * now. -DaveM - */ - if (metadata) { - result = sb_getblk(sb, tmp + blockoff); + + if (!phys) { + result = ufs_clear_frags(inode, tmp, uspi->s_fpb, + tmp + blockoff); } else { - *phys = tmp; + *phys = tmp + blockoff; *new = 1; } @@ -365,18 +415,19 @@ repeat: sync_dirty_buffer(bh); inode->i_ctime = CURRENT_TIME_SEC; mark_inode_dirty(inode); - UFSD(("result %u\n", tmp + blockoff)); + UFSD("result %u\n", tmp + blockoff); out: brelse (bh); - UFSD(("EXIT\n")); + UFSD("EXIT\n"); return result; } -/* - * This function gets the block which contains the fragment. +/** + * ufs_getfrag_bloc() - `get_block_t' function, interface between UFS and + * readpage, writepage and so on */ -int ufs_getfrag_block (struct inode *inode, sector_t fragment, struct buffer_head *bh_result, int create) +int ufs_getfrag_block(struct inode *inode, sector_t fragment, struct buffer_head *bh_result, int create) { struct super_block * sb = inode->i_sb; struct ufs_sb_private_info * uspi = UFS_SB(sb)->s_uspi; @@ -387,7 +438,7 @@ int ufs_getfrag_block (struct inode *inode, sector_t fragment, struct buffer_hea if (!create) { phys64 = ufs_frag_map(inode, fragment); - UFSD(("phys64 = %llu \n",phys64)); + UFSD("phys64 = %llu\n", (unsigned long long)phys64); if (phys64) map_bh(bh_result, sb, phys64); return 0; @@ -402,7 +453,7 @@ int ufs_getfrag_block (struct inode *inode, sector_t fragment, struct buffer_hea lock_kernel(); - UFSD(("ENTER, ino %lu, fragment %llu\n", inode->i_ino, (unsigned long long)fragment)) + UFSD("ENTER, ino %lu, fragment %llu\n", inode->i_ino, (unsigned long long)fragment); if (fragment < 0) goto abort_negative; if (fragment > @@ -418,15 +469,15 @@ int ufs_getfrag_block (struct inode *inode, sector_t fragment, struct buffer_hea * it much more readable: */ #define GET_INODE_DATABLOCK(x) \ - ufs_inode_getfrag(inode, x, fragment, 1, &err, 0, &phys, &new) + ufs_inode_getfrag(inode, x, fragment, 1, &err, &phys, &new, bh_result->b_page) #define GET_INODE_PTR(x) \ - ufs_inode_getfrag(inode, x, fragment, uspi->s_fpb, &err, 1, NULL, NULL) + ufs_inode_getfrag(inode, x, fragment, uspi->s_fpb, &err, NULL, NULL, bh_result->b_page) #define GET_INDIRECT_DATABLOCK(x) \ - ufs_block_getfrag(inode, bh, x, fragment, sb->s_blocksize, \ - &err, 0, &phys, &new); + ufs_inode_getblock(inode, bh, x, fragment, \ + &err, &phys, &new, bh_result->b_page); #define GET_INDIRECT_PTR(x) \ - ufs_block_getfrag(inode, bh, x, fragment, sb->s_blocksize, \ - &err, 1, NULL, NULL); + ufs_inode_getblock(inode, bh, x, fragment, \ + &err, NULL, NULL, bh_result->b_page); if (ptr < UFS_NDIR_FRAGMENT) { bh = GET_INODE_DATABLOCK(ptr); @@ -474,8 +525,9 @@ abort_too_big: goto abort; } -struct buffer_head *ufs_getfrag(struct inode *inode, unsigned int fragment, - int create, int *err) +static struct buffer_head *ufs_getfrag(struct inode *inode, + unsigned int fragment, + int create, int *err) { struct buffer_head dummy; int error; @@ -502,7 +554,7 @@ struct buffer_head * ufs_bread (struct inode * inode, unsigned fragment, { struct buffer_head * bh; - UFSD(("ENTER, ino %lu, fragment %u\n", inode->i_ino, fragment)) + UFSD("ENTER, ino %lu, fragment %u\n", inode->i_ino, fragment); bh = ufs_getfrag (inode, fragment, create, err); if (!bh || buffer_uptodate(bh)) return bh; @@ -531,7 +583,7 @@ static sector_t ufs_bmap(struct address_space *mapping, sector_t block) { return generic_block_bmap(mapping,block,ufs_getfrag_block); } -struct address_space_operations ufs_aops = { +const struct address_space_operations ufs_aops = { .readpage = ufs_readpage, .writepage = ufs_writepage, .sync_page = block_sync_page, @@ -540,39 +592,34 @@ struct address_space_operations ufs_aops = { .bmap = ufs_bmap }; -void ufs_read_inode (struct inode * inode) +static void ufs_set_inode_ops(struct inode *inode) +{ + if (S_ISREG(inode->i_mode)) { + inode->i_op = &ufs_file_inode_operations; + inode->i_fop = &ufs_file_operations; + inode->i_mapping->a_ops = &ufs_aops; + } else if (S_ISDIR(inode->i_mode)) { + inode->i_op = &ufs_dir_inode_operations; + inode->i_fop = &ufs_dir_operations; + inode->i_mapping->a_ops = &ufs_aops; + } else if (S_ISLNK(inode->i_mode)) { + if (!inode->i_blocks) + inode->i_op = &ufs_fast_symlink_inode_operations; + else { + inode->i_op = &page_symlink_inode_operations; + inode->i_mapping->a_ops = &ufs_aops; + } + } else + init_special_inode(inode, inode->i_mode, + ufs_get_inode_dev(inode->i_sb, UFS_I(inode))); +} + +static void ufs1_read_inode(struct inode *inode, struct ufs_inode *ufs_inode) { struct ufs_inode_info *ufsi = UFS_I(inode); - struct super_block * sb; - struct ufs_sb_private_info * uspi; - struct ufs_inode * ufs_inode; - struct ufs2_inode *ufs2_inode; - struct buffer_head * bh; + struct super_block *sb = inode->i_sb; mode_t mode; unsigned i; - unsigned flags; - - UFSD(("ENTER, ino %lu\n", inode->i_ino)) - - sb = inode->i_sb; - uspi = UFS_SB(sb)->s_uspi; - flags = UFS_SB(sb)->s_flags; - - if (inode->i_ino < UFS_ROOTINO || - inode->i_ino > (uspi->s_ncg * uspi->s_ipg)) { - ufs_warning (sb, "ufs_read_inode", "bad inode number (%lu)\n", inode->i_ino); - goto bad_inode; - } - - bh = sb_bread(sb, uspi->s_sbbase + ufs_inotofsba(inode->i_ino)); - if (!bh) { - ufs_warning (sb, "ufs_read_inode", "unable to read inode %lu\n", inode->i_ino); - goto bad_inode; - } - if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) - goto ufs2_inode; - - ufs_inode = (struct ufs_inode *) (bh->b_data + sizeof(struct ufs_inode) * ufs_inotofsbo(inode->i_ino)); /* * Copy data to the in-core inode. @@ -596,56 +643,29 @@ void ufs_read_inode (struct inode * inode) inode->i_atime.tv_nsec = 0; inode->i_ctime.tv_nsec = 0; inode->i_blocks = fs32_to_cpu(sb, ufs_inode->ui_blocks); - inode->i_blksize = PAGE_SIZE; /* This is the optimal IO size (for stat) */ - inode->i_version++; ufsi->i_flags = fs32_to_cpu(sb, ufs_inode->ui_flags); ufsi->i_gen = fs32_to_cpu(sb, ufs_inode->ui_gen); ufsi->i_shadow = fs32_to_cpu(sb, ufs_inode->ui_u3.ui_sun.ui_shadow); ufsi->i_oeftflag = fs32_to_cpu(sb, ufs_inode->ui_u3.ui_sun.ui_oeftflag); - ufsi->i_lastfrag = (inode->i_size + uspi->s_fsize - 1) >> uspi->s_fshift; + if (S_ISCHR(mode) || S_ISBLK(mode) || inode->i_blocks) { for (i = 0; i < (UFS_NDADDR + UFS_NINDIR); i++) ufsi->i_u1.i_data[i] = ufs_inode->ui_u2.ui_addr.ui_db[i]; - } - else { + } else { for (i = 0; i < (UFS_NDADDR + UFS_NINDIR) * 4; i++) ufsi->i_u1.i_symlink[i] = ufs_inode->ui_u2.ui_symlink[i]; } - ufsi->i_osync = 0; - - if (S_ISREG(inode->i_mode)) { - inode->i_op = &ufs_file_inode_operations; - inode->i_fop = &ufs_file_operations; - inode->i_mapping->a_ops = &ufs_aops; - } else if (S_ISDIR(inode->i_mode)) { - inode->i_op = &ufs_dir_inode_operations; - inode->i_fop = &ufs_dir_operations; - } else if (S_ISLNK(inode->i_mode)) { - if (!inode->i_blocks) - inode->i_op = &ufs_fast_symlink_inode_operations; - else { - inode->i_op = &page_symlink_inode_operations; - inode->i_mapping->a_ops = &ufs_aops; - } - } else - init_special_inode(inode, inode->i_mode, - ufs_get_inode_dev(sb, ufsi)); - - brelse (bh); - - UFSD(("EXIT\n")) - return; - -bad_inode: - make_bad_inode(inode); - return; - -ufs2_inode : - UFSD(("Reading ufs2 inode, ino %lu\n", inode->i_ino)) +} - ufs2_inode = (struct ufs2_inode *)(bh->b_data + sizeof(struct ufs2_inode) * ufs_inotofsbo(inode->i_ino)); +static void ufs2_read_inode(struct inode *inode, struct ufs2_inode *ufs2_inode) +{ + struct ufs_inode_info *ufsi = UFS_I(inode); + struct super_block *sb = inode->i_sb; + mode_t mode; + unsigned i; + UFSD("Reading ufs2 inode, ino %lu\n", inode->i_ino); /* * Copy data to the in-core inode. */ @@ -668,50 +688,74 @@ ufs2_inode : inode->i_atime.tv_nsec = 0; inode->i_ctime.tv_nsec = 0; inode->i_blocks = fs64_to_cpu(sb, ufs2_inode->ui_blocks); - inode->i_blksize = PAGE_SIZE; /*This is the optimal IO size(for stat)*/ - - inode->i_version++; ufsi->i_flags = fs32_to_cpu(sb, ufs2_inode->ui_flags); ufsi->i_gen = fs32_to_cpu(sb, ufs2_inode->ui_gen); /* ufsi->i_shadow = fs32_to_cpu(sb, ufs_inode->ui_u3.ui_sun.ui_shadow); ufsi->i_oeftflag = fs32_to_cpu(sb, ufs_inode->ui_u3.ui_sun.ui_oeftflag); */ - ufsi->i_lastfrag= (inode->i_size + uspi->s_fsize- 1) >> uspi->s_fshift; if (S_ISCHR(mode) || S_ISBLK(mode) || inode->i_blocks) { for (i = 0; i < (UFS_NDADDR + UFS_NINDIR); i++) ufsi->i_u1.u2_i_data[i] = ufs2_inode->ui_u2.ui_addr.ui_db[i]; - } - else { + } else { for (i = 0; i < (UFS_NDADDR + UFS_NINDIR) * 4; i++) ufsi->i_u1.i_symlink[i] = ufs2_inode->ui_u2.ui_symlink[i]; } +} + +void ufs_read_inode(struct inode * inode) +{ + struct ufs_inode_info *ufsi = UFS_I(inode); + struct super_block * sb; + struct ufs_sb_private_info * uspi; + struct buffer_head * bh; + + UFSD("ENTER, ino %lu\n", inode->i_ino); + + sb = inode->i_sb; + uspi = UFS_SB(sb)->s_uspi; + + if (inode->i_ino < UFS_ROOTINO || + inode->i_ino > (uspi->s_ncg * uspi->s_ipg)) { + ufs_warning(sb, "ufs_read_inode", "bad inode number (%lu)\n", + inode->i_ino); + goto bad_inode; + } + + bh = sb_bread(sb, uspi->s_sbbase + ufs_inotofsba(inode->i_ino)); + if (!bh) { + ufs_warning(sb, "ufs_read_inode", "unable to read inode %lu\n", + inode->i_ino); + goto bad_inode; + } + if ((UFS_SB(sb)->s_flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) { + struct ufs2_inode *ufs2_inode = (struct ufs2_inode *)bh->b_data; + + ufs2_read_inode(inode, + ufs2_inode + ufs_inotofsbo(inode->i_ino)); + } else { + struct ufs_inode *ufs_inode = (struct ufs_inode *)bh->b_data; + + ufs1_read_inode(inode, ufs_inode + ufs_inotofsbo(inode->i_ino)); + } + + inode->i_version++; + ufsi->i_lastfrag = + (inode->i_size + uspi->s_fsize - 1) >> uspi->s_fshift; + ufsi->i_dir_start_lookup = 0; ufsi->i_osync = 0; - if (S_ISREG(inode->i_mode)) { - inode->i_op = &ufs_file_inode_operations; - inode->i_fop = &ufs_file_operations; - inode->i_mapping->a_ops = &ufs_aops; - } else if (S_ISDIR(inode->i_mode)) { - inode->i_op = &ufs_dir_inode_operations; - inode->i_fop = &ufs_dir_operations; - } else if (S_ISLNK(inode->i_mode)) { - if (!inode->i_blocks) - inode->i_op = &ufs_fast_symlink_inode_operations; - else { - inode->i_op = &page_symlink_inode_operations; - inode->i_mapping->a_ops = &ufs_aops; - } - } else /* TODO : here ...*/ - init_special_inode(inode, inode->i_mode, - ufs_get_inode_dev(sb, ufsi)); + ufs_set_inode_ops(inode); brelse(bh); - UFSD(("EXIT\n")) + UFSD("EXIT\n"); return; + +bad_inode: + make_bad_inode(inode); } static int ufs_update_inode(struct inode * inode, int do_sync) @@ -724,7 +768,7 @@ static int ufs_update_inode(struct inode * inode, int do_sync) unsigned i; unsigned flags; - UFSD(("ENTER, ino %lu\n", inode->i_ino)) + UFSD("ENTER, ino %lu\n", inode->i_ino); sb = inode->i_sb; uspi = UFS_SB(sb)->s_uspi; @@ -785,7 +829,7 @@ static int ufs_update_inode(struct inode * inode, int do_sync) sync_dirty_buffer(bh); brelse (bh); - UFSD(("EXIT\n")) + UFSD("EXIT\n"); return 0; } @@ -805,14 +849,17 @@ int ufs_sync_inode (struct inode *inode) void ufs_delete_inode (struct inode * inode) { + loff_t old_i_size; + truncate_inode_pages(&inode->i_data, 0); /*UFS_I(inode)->i_dtime = CURRENT_TIME;*/ lock_kernel(); mark_inode_dirty(inode); ufs_update_inode(inode, IS_SYNC(inode)); + old_i_size = inode->i_size; inode->i_size = 0; - if (inode->i_blocks) - ufs_truncate (inode); + if (inode->i_blocks && ufs_truncate(inode, old_i_size)) + ufs_warning(inode->i_sb, __FUNCTION__, "ufs_truncate failed\n"); ufs_free_inode (inode); unlock_kernel(); } diff --git a/fs/ufs/namei.c b/fs/ufs/namei.c index 8d5f98a01..d344b411e 100644 --- a/fs/ufs/namei.c +++ b/fs/ufs/namei.c @@ -1,6 +1,9 @@ /* * linux/fs/ufs/namei.c * + * Migration to usage of "page cache" on May 2006 by + * Evgeniy Dushistov based on ext2 code base. + * * Copyright (C) 1998 * Daniel Pirkl * Charles University, Faculty of Mathematics and Physics @@ -28,21 +31,9 @@ #include #include #include -#include #include "swab.h" /* will go away - see comment in mknod() */ #include "util.h" -/* -#undef UFS_NAMEI_DEBUG -*/ -#define UFS_NAMEI_DEBUG - -#ifdef UFS_NAMEI_DEBUG -#define UFSD(x) printk("(%s, %d), %s: ", __FILE__, __LINE__, __FUNCTION__); printk x; -#else -#define UFSD(x) -#endif - static inline int ufs_add_nondir(struct dentry *dentry, struct inode *inode) { int err = ufs_add_link(dentry, inode); @@ -88,8 +79,13 @@ static struct dentry *ufs_lookup(struct inode * dir, struct dentry *dentry, stru static int ufs_create (struct inode * dir, struct dentry * dentry, int mode, struct nameidata *nd) { - struct inode * inode = ufs_new_inode(dir, mode); - int err = PTR_ERR(inode); + struct inode *inode; + int err; + + UFSD("BEGIN\n"); + inode = ufs_new_inode(dir, mode); + err = PTR_ERR(inode); + if (!IS_ERR(inode)) { inode->i_op = &ufs_file_inode_operations; inode->i_fop = &ufs_file_operations; @@ -99,6 +95,7 @@ static int ufs_create (struct inode * dir, struct dentry * dentry, int mode, err = ufs_add_nondir(dentry, inode); unlock_kernel(); } + UFSD("END: err=%d\n", err); return err; } @@ -132,7 +129,7 @@ static int ufs_symlink (struct inode * dir, struct dentry * dentry, struct inode * inode; if (l > sb->s_blocksize) - goto out; + goto out_notlocked; lock_kernel(); inode = ufs_new_inode(dir, S_IFLNK | S_IRWXUGO); @@ -158,6 +155,7 @@ static int ufs_symlink (struct inode * dir, struct dentry * dentry, err = ufs_add_nondir(dentry, inode); out: unlock_kernel(); +out_notlocked: return err; out_fail: @@ -205,6 +203,7 @@ static int ufs_mkdir(struct inode * dir, struct dentry * dentry, int mode) inode->i_op = &ufs_dir_inode_operations; inode->i_fop = &ufs_dir_operations; + inode->i_mapping->a_ops = &ufs_aops; inode_inc_link_count(inode); @@ -231,19 +230,18 @@ out_dir: goto out; } -static int ufs_unlink(struct inode * dir, struct dentry *dentry) +static int ufs_unlink(struct inode *dir, struct dentry *dentry) { struct inode * inode = dentry->d_inode; - struct buffer_head * bh; - struct ufs_dir_entry * de; + struct ufs_dir_entry *de; + struct page *page; int err = -ENOENT; - lock_kernel(); - de = ufs_find_entry (dentry, &bh); + de = ufs_find_entry(dir, dentry, &page); if (!de) goto out; - err = ufs_delete_entry (dir, de, bh); + err = ufs_delete_entry(dir, de, page); if (err) goto out; @@ -251,7 +249,6 @@ static int ufs_unlink(struct inode * dir, struct dentry *dentry) inode_dec_link_count(inode); err = 0; out: - unlock_kernel(); return err; } @@ -273,42 +270,42 @@ static int ufs_rmdir (struct inode * dir, struct dentry *dentry) return err; } -static int ufs_rename (struct inode * old_dir, struct dentry * old_dentry, - struct inode * new_dir, struct dentry * new_dentry ) +static int ufs_rename(struct inode *old_dir, struct dentry *old_dentry, + struct inode *new_dir, struct dentry *new_dentry) { struct inode *old_inode = old_dentry->d_inode; struct inode *new_inode = new_dentry->d_inode; - struct buffer_head *dir_bh = NULL; - struct ufs_dir_entry *dir_de = NULL; - struct buffer_head *old_bh; + struct page *dir_page = NULL; + struct ufs_dir_entry * dir_de = NULL; + struct page *old_page; struct ufs_dir_entry *old_de; int err = -ENOENT; - lock_kernel(); - old_de = ufs_find_entry (old_dentry, &old_bh); + old_de = ufs_find_entry(old_dir, old_dentry, &old_page); if (!old_de) goto out; if (S_ISDIR(old_inode->i_mode)) { err = -EIO; - dir_de = ufs_dotdot(old_inode, &dir_bh); + dir_de = ufs_dotdot(old_inode, &dir_page); if (!dir_de) goto out_old; } if (new_inode) { - struct buffer_head *new_bh; + struct page *new_page; struct ufs_dir_entry *new_de; err = -ENOTEMPTY; - if (dir_de && !ufs_empty_dir (new_inode)) + if (dir_de && !ufs_empty_dir(new_inode)) goto out_dir; + err = -ENOENT; - new_de = ufs_find_entry (new_dentry, &new_bh); + new_de = ufs_find_entry(new_dir, new_dentry, &new_page); if (!new_de) goto out_dir; inode_inc_link_count(old_inode); - ufs_set_link(new_dir, new_de, new_bh, old_inode); + ufs_set_link(new_dir, new_de, new_page, old_inode); new_inode->i_ctime = CURRENT_TIME_SEC; if (dir_de) new_inode->i_nlink--; @@ -329,24 +326,32 @@ static int ufs_rename (struct inode * old_dir, struct dentry * old_dentry, inode_inc_link_count(new_dir); } - ufs_delete_entry (old_dir, old_de, old_bh); + /* + * Like most other Unix systems, set the ctime for inodes on a + * rename. + * inode_dec_link_count() will mark the inode dirty. + */ + old_inode->i_ctime = CURRENT_TIME_SEC; + ufs_delete_entry(old_dir, old_de, old_page); inode_dec_link_count(old_inode); if (dir_de) { - ufs_set_link(old_inode, dir_de, dir_bh, new_dir); + ufs_set_link(old_inode, dir_de, dir_page, new_dir); inode_dec_link_count(old_dir); } - unlock_kernel(); return 0; + out_dir: - if (dir_de) - brelse(dir_bh); + if (dir_de) { + kunmap(dir_page); + page_cache_release(dir_page); + } out_old: - brelse (old_bh); + kunmap(old_page); + page_cache_release(old_page); out: - unlock_kernel(); return err; } diff --git a/fs/ufs/super.c b/fs/ufs/super.c index db98a4c71..992ee0b87 100644 --- a/fs/ufs/super.c +++ b/fs/ufs/super.c @@ -64,7 +64,6 @@ */ -#include #include #include @@ -90,95 +89,84 @@ #include "swab.h" #include "util.h" -#undef UFS_SUPER_DEBUG -#undef UFS_SUPER_DEBUG_MORE - - -#undef UFS_SUPER_DEBUG_MORE -#ifdef UFS_SUPER_DEBUG -#define UFSD(x) printk("(%s, %d), %s: ", __FILE__, __LINE__, __FUNCTION__); printk x; -#else -#define UFSD(x) -#endif - -#ifdef UFS_SUPER_DEBUG_MORE +#ifdef CONFIG_UFS_DEBUG /* * Print contents of ufs_super_block, useful for debugging */ -void ufs_print_super_stuff(struct super_block *sb, - struct ufs_super_block_first * usb1, - struct ufs_super_block_second * usb2, - struct ufs_super_block_third * usb3) +static void ufs_print_super_stuff(struct super_block *sb, unsigned flags, + struct ufs_super_block_first *usb1, + struct ufs_super_block_second *usb2, + struct ufs_super_block_third *usb3) { printk("ufs_print_super_stuff\n"); - printk("size of usb: %u\n", sizeof(struct ufs_super_block)); - printk(" magic: 0x%x\n", fs32_to_cpu(sb, usb3->fs_magic)); - printk(" sblkno: %u\n", fs32_to_cpu(sb, usb1->fs_sblkno)); - printk(" cblkno: %u\n", fs32_to_cpu(sb, usb1->fs_cblkno)); - printk(" iblkno: %u\n", fs32_to_cpu(sb, usb1->fs_iblkno)); - printk(" dblkno: %u\n", fs32_to_cpu(sb, usb1->fs_dblkno)); - printk(" cgoffset: %u\n", fs32_to_cpu(sb, usb1->fs_cgoffset)); - printk(" ~cgmask: 0x%x\n", ~fs32_to_cpu(sb, usb1->fs_cgmask)); - printk(" size: %u\n", fs32_to_cpu(sb, usb1->fs_size)); - printk(" dsize: %u\n", fs32_to_cpu(sb, usb1->fs_dsize)); - printk(" ncg: %u\n", fs32_to_cpu(sb, usb1->fs_ncg)); - printk(" bsize: %u\n", fs32_to_cpu(sb, usb1->fs_bsize)); - printk(" fsize: %u\n", fs32_to_cpu(sb, usb1->fs_fsize)); - printk(" frag: %u\n", fs32_to_cpu(sb, usb1->fs_frag)); - printk(" fragshift: %u\n", fs32_to_cpu(sb, usb1->fs_fragshift)); - printk(" ~fmask: %u\n", ~fs32_to_cpu(sb, usb1->fs_fmask)); - printk(" fshift: %u\n", fs32_to_cpu(sb, usb1->fs_fshift)); - printk(" sbsize: %u\n", fs32_to_cpu(sb, usb1->fs_sbsize)); - printk(" spc: %u\n", fs32_to_cpu(sb, usb1->fs_spc)); - printk(" cpg: %u\n", fs32_to_cpu(sb, usb1->fs_cpg)); - printk(" ipg: %u\n", fs32_to_cpu(sb, usb1->fs_ipg)); - printk(" fpg: %u\n", fs32_to_cpu(sb, usb1->fs_fpg)); - printk(" csaddr: %u\n", fs32_to_cpu(sb, usb1->fs_csaddr)); - printk(" cssize: %u\n", fs32_to_cpu(sb, usb1->fs_cssize)); - printk(" cgsize: %u\n", fs32_to_cpu(sb, usb1->fs_cgsize)); - printk(" fstodb: %u\n", fs32_to_cpu(sb, usb1->fs_fsbtodb)); - printk(" contigsumsize: %d\n", fs32_to_cpu(sb, usb3->fs_u2.fs_44.fs_contigsumsize)); - printk(" postblformat: %u\n", fs32_to_cpu(sb, usb3->fs_postblformat)); - printk(" nrpos: %u\n", fs32_to_cpu(sb, usb3->fs_nrpos)); - printk(" ndir %u\n", fs32_to_cpu(sb, usb1->fs_cstotal.cs_ndir)); - printk(" nifree %u\n", fs32_to_cpu(sb, usb1->fs_cstotal.cs_nifree)); - printk(" nbfree %u\n", fs32_to_cpu(sb, usb1->fs_cstotal.cs_nbfree)); - printk(" nffree %u\n", fs32_to_cpu(sb, usb1->fs_cstotal.cs_nffree)); - printk("\n"); -} - -/* - * Print contents of ufs2 ufs_super_block, useful for debugging - */ -void ufs2_print_super_stuff( - struct super_block *sb, - struct ufs_super_block *usb) -{ - printk("ufs_print_super_stuff\n"); - printk("size of usb: %u\n", sizeof(struct ufs_super_block)); - printk(" magic: 0x%x\n", fs32_to_cpu(sb, usb->fs_magic)); - printk(" fs_size: %u\n",fs64_to_cpu(sb, usb->fs_u11.fs_u2.fs_size)); - printk(" fs_dsize: %u\n",fs64_to_cpu(sb, usb->fs_u11.fs_u2.fs_dsize)); - printk(" bsize: %u\n", fs32_to_cpu(usb, usb->fs_bsize)); - printk(" fsize: %u\n", fs32_to_cpu(usb, usb->fs_fsize)); - printk(" fs_volname: %s\n", usb->fs_u11.fs_u2.fs_volname); - printk(" fs_fsmnt: %s\n", usb->fs_u11.fs_u2.fs_fsmnt); - printk(" fs_sblockloc: %u\n",fs64_to_cpu(sb, - usb->fs_u11.fs_u2.fs_sblockloc)); - printk(" cs_ndir(No of dirs): %u\n",fs64_to_cpu(sb, - usb->fs_u11.fs_u2.fs_cstotal.cs_ndir)); - printk(" cs_nbfree(No of free blocks): %u\n",fs64_to_cpu(sb, - usb->fs_u11.fs_u2.fs_cstotal.cs_nbfree)); + printk(" magic: 0x%x\n", fs32_to_cpu(sb, usb3->fs_magic)); + if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) { + printk(" fs_size: %llu\n", (unsigned long long) + fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_size)); + printk(" fs_dsize: %llu\n", (unsigned long long) + fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_dsize)); + printk(" bsize: %u\n", + fs32_to_cpu(sb, usb1->fs_bsize)); + printk(" fsize: %u\n", + fs32_to_cpu(sb, usb1->fs_fsize)); + printk(" fs_volname: %s\n", usb2->fs_un.fs_u2.fs_volname); + printk(" fs_sblockloc: %llu\n", (unsigned long long) + fs64_to_cpu(sb, usb2->fs_un.fs_u2.fs_sblockloc)); + printk(" cs_ndir(No of dirs): %llu\n", (unsigned long long) + fs64_to_cpu(sb, usb2->fs_un.fs_u2.cs_ndir)); + printk(" cs_nbfree(No of free blocks): %llu\n", + (unsigned long long) + fs64_to_cpu(sb, usb2->fs_un.fs_u2.cs_nbfree)); + } else { + printk(" sblkno: %u\n", fs32_to_cpu(sb, usb1->fs_sblkno)); + printk(" cblkno: %u\n", fs32_to_cpu(sb, usb1->fs_cblkno)); + printk(" iblkno: %u\n", fs32_to_cpu(sb, usb1->fs_iblkno)); + printk(" dblkno: %u\n", fs32_to_cpu(sb, usb1->fs_dblkno)); + printk(" cgoffset: %u\n", + fs32_to_cpu(sb, usb1->fs_cgoffset)); + printk(" ~cgmask: 0x%x\n", + ~fs32_to_cpu(sb, usb1->fs_cgmask)); + printk(" size: %u\n", fs32_to_cpu(sb, usb1->fs_size)); + printk(" dsize: %u\n", fs32_to_cpu(sb, usb1->fs_dsize)); + printk(" ncg: %u\n", fs32_to_cpu(sb, usb1->fs_ncg)); + printk(" bsize: %u\n", fs32_to_cpu(sb, usb1->fs_bsize)); + printk(" fsize: %u\n", fs32_to_cpu(sb, usb1->fs_fsize)); + printk(" frag: %u\n", fs32_to_cpu(sb, usb1->fs_frag)); + printk(" fragshift: %u\n", + fs32_to_cpu(sb, usb1->fs_fragshift)); + printk(" ~fmask: %u\n", ~fs32_to_cpu(sb, usb1->fs_fmask)); + printk(" fshift: %u\n", fs32_to_cpu(sb, usb1->fs_fshift)); + printk(" sbsize: %u\n", fs32_to_cpu(sb, usb1->fs_sbsize)); + printk(" spc: %u\n", fs32_to_cpu(sb, usb1->fs_spc)); + printk(" cpg: %u\n", fs32_to_cpu(sb, usb1->fs_cpg)); + printk(" ipg: %u\n", fs32_to_cpu(sb, usb1->fs_ipg)); + printk(" fpg: %u\n", fs32_to_cpu(sb, usb1->fs_fpg)); + printk(" csaddr: %u\n", fs32_to_cpu(sb, usb1->fs_csaddr)); + printk(" cssize: %u\n", fs32_to_cpu(sb, usb1->fs_cssize)); + printk(" cgsize: %u\n", fs32_to_cpu(sb, usb1->fs_cgsize)); + printk(" fstodb: %u\n", + fs32_to_cpu(sb, usb1->fs_fsbtodb)); + printk(" nrpos: %u\n", fs32_to_cpu(sb, usb3->fs_nrpos)); + printk(" ndir %u\n", + fs32_to_cpu(sb, usb1->fs_cstotal.cs_ndir)); + printk(" nifree %u\n", + fs32_to_cpu(sb, usb1->fs_cstotal.cs_nifree)); + printk(" nbfree %u\n", + fs32_to_cpu(sb, usb1->fs_cstotal.cs_nbfree)); + printk(" nffree %u\n", + fs32_to_cpu(sb, usb1->fs_cstotal.cs_nffree)); + } printk("\n"); } /* * Print contents of ufs_cylinder_group, useful for debugging */ -void ufs_print_cylinder_stuff(struct super_block *sb, struct ufs_cylinder_group *cg) +static void ufs_print_cylinder_stuff(struct super_block *sb, + struct ufs_cylinder_group *cg) { printk("\nufs_print_cylinder_stuff\n"); - printk("size of ucg: %u\n", sizeof(struct ufs_cylinder_group)); + printk("size of ucg: %zu\n", sizeof(struct ufs_cylinder_group)); printk(" magic: %x\n", fs32_to_cpu(sb, cg->cg_magic)); printk(" time: %u\n", fs32_to_cpu(sb, cg->cg_time)); printk(" cgx: %u\n", fs32_to_cpu(sb, cg->cg_cgx)); @@ -202,12 +190,18 @@ void ufs_print_cylinder_stuff(struct super_block *sb, struct ufs_cylinder_group printk(" iuseoff: %u\n", fs32_to_cpu(sb, cg->cg_iusedoff)); printk(" freeoff: %u\n", fs32_to_cpu(sb, cg->cg_freeoff)); printk(" nextfreeoff: %u\n", fs32_to_cpu(sb, cg->cg_nextfreeoff)); - printk(" clustersumoff %u\n", fs32_to_cpu(sb, cg->cg_u.cg_44.cg_clustersumoff)); - printk(" clusteroff %u\n", fs32_to_cpu(sb, cg->cg_u.cg_44.cg_clusteroff)); - printk(" nclusterblks %u\n", fs32_to_cpu(sb, cg->cg_u.cg_44.cg_nclusterblks)); + printk(" clustersumoff %u\n", + fs32_to_cpu(sb, cg->cg_u.cg_44.cg_clustersumoff)); + printk(" clusteroff %u\n", + fs32_to_cpu(sb, cg->cg_u.cg_44.cg_clusteroff)); + printk(" nclusterblks %u\n", + fs32_to_cpu(sb, cg->cg_u.cg_44.cg_nclusterblks)); printk("\n"); } -#endif /* UFS_SUPER_DEBUG_MORE */ +#else +# define ufs_print_super_stuff(sb, flags, usb1, usb2, usb3) /**/ +# define ufs_print_cylinder_stuff(sb, cg) /**/ +#endif /* CONFIG_UFS_DEBUG */ static struct super_operations ufs_super_ops; @@ -225,7 +219,7 @@ void ufs_error (struct super_block * sb, const char * function, if (!(sb->s_flags & MS_RDONLY)) { usb1->fs_clean = UFS_FSBAD; - ubh_mark_buffer_dirty(USPI_UBH); + ubh_mark_buffer_dirty(USPI_UBH(uspi)); sb->s_dirt = 1; sb->s_flags |= MS_RDONLY; } @@ -257,7 +251,7 @@ void ufs_panic (struct super_block * sb, const char * function, if (!(sb->s_flags & MS_RDONLY)) { usb1->fs_clean = UFS_FSBAD; - ubh_mark_buffer_dirty(USPI_UBH); + ubh_mark_buffer_dirty(USPI_UBH(uspi)); sb->s_dirt = 1; } va_start (args, fmt); @@ -309,7 +303,7 @@ static int ufs_parse_options (char * options, unsigned * mount_options) { char * p; - UFSD(("ENTER\n")) + UFSD("ENTER\n"); if (!options) return 1; @@ -385,28 +379,58 @@ static int ufs_parse_options (char * options, unsigned * mount_options) return 1; } +/* + * Diffrent types of UFS hold fs_cstotal in different + * places, and use diffrent data structure for it. + * To make things simplier we just copy fs_cstotal to ufs_sb_private_info + */ +static void ufs_setup_cstotal(struct super_block *sb) +{ + struct ufs_sb_info *sbi = UFS_SB(sb); + struct ufs_sb_private_info *uspi = sbi->s_uspi; + struct ufs_super_block_first *usb1; + struct ufs_super_block_second *usb2; + struct ufs_super_block_third *usb3; + unsigned mtype = sbi->s_mount_opt & UFS_MOUNT_UFSTYPE; + + UFSD("ENTER, mtype=%u\n", mtype); + usb1 = ubh_get_usb_first(uspi); + usb2 = ubh_get_usb_second(uspi); + usb3 = ubh_get_usb_third(uspi); + + if ((mtype == UFS_MOUNT_UFSTYPE_44BSD && + (usb1->fs_flags & UFS_FLAGS_UPDATED)) || + mtype == UFS_MOUNT_UFSTYPE_UFS2) { + /*we have statistic in different place, then usual*/ + uspi->cs_total.cs_ndir = fs64_to_cpu(sb, usb2->fs_un.fs_u2.cs_ndir); + uspi->cs_total.cs_nbfree = fs64_to_cpu(sb, usb2->fs_un.fs_u2.cs_nbfree); + uspi->cs_total.cs_nifree = fs64_to_cpu(sb, usb3->fs_un1.fs_u2.cs_nifree); + uspi->cs_total.cs_nffree = fs64_to_cpu(sb, usb3->fs_un1.fs_u2.cs_nffree); + } else { + uspi->cs_total.cs_ndir = fs32_to_cpu(sb, usb1->fs_cstotal.cs_ndir); + uspi->cs_total.cs_nbfree = fs32_to_cpu(sb, usb1->fs_cstotal.cs_nbfree); + uspi->cs_total.cs_nifree = fs32_to_cpu(sb, usb1->fs_cstotal.cs_nifree); + uspi->cs_total.cs_nffree = fs32_to_cpu(sb, usb1->fs_cstotal.cs_nffree); + } + UFSD("EXIT\n"); +} + /* * Read on-disk structures associated with cylinder groups */ -static int ufs_read_cylinder_structures (struct super_block *sb) +static int ufs_read_cylinder_structures(struct super_block *sb) { - struct ufs_sb_info * sbi = UFS_SB(sb); - struct ufs_sb_private_info * uspi; - struct ufs_super_block *usb; + struct ufs_sb_info *sbi = UFS_SB(sb); + struct ufs_sb_private_info *uspi = sbi->s_uspi; + unsigned flags = sbi->s_flags; struct ufs_buffer_head * ubh; unsigned char * base, * space; unsigned size, blks, i; - unsigned flags = 0; - - UFSD(("ENTER\n")) - - uspi = sbi->s_uspi; + struct ufs_super_block_third *usb3; - usb = (struct ufs_super_block *) - ((struct ufs_buffer_head *)uspi)->bh[0]->b_data; + UFSD("ENTER\n"); - flags = UFS_SB(sb)->s_flags; - + usb3 = ubh_get_usb_third(uspi); /* * Read cs structures from (usually) first data block * on the device. @@ -424,7 +448,7 @@ static int ufs_read_cylinder_structures (struct super_block *sb) if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) ubh = ubh_bread(sb, - fs64_to_cpu(sb, usb->fs_u11.fs_u2.fs_csaddr) + i, size); + fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_csaddr) + i, size); else ubh = ubh_bread(sb, uspi->s_csaddr + i, size); @@ -451,14 +475,13 @@ static int ufs_read_cylinder_structures (struct super_block *sb) sbi->s_cgno[i] = UFS_CGNO_EMPTY; } for (i = 0; i < uspi->s_ncg; i++) { - UFSD(("read cg %u\n", i)) + UFSD("read cg %u\n", i); if (!(sbi->s_ucg[i] = sb_bread(sb, ufs_cgcmin(i)))) goto failed; if (!ufs_cg_chkmagic (sb, (struct ufs_cylinder_group *) sbi->s_ucg[i]->b_data)) goto failed; -#ifdef UFS_SUPER_DEBUG_MORE + ufs_print_cylinder_stuff(sb, (struct ufs_cylinder_group *) sbi->s_ucg[i]->b_data); -#endif } for (i = 0; i < UFS_MAX_GROUP_LOADED; i++) { if (!(sbi->s_ucpi[i] = kmalloc (sizeof(struct ufs_cg_private_info), GFP_KERNEL))) @@ -466,7 +489,7 @@ static int ufs_read_cylinder_structures (struct super_block *sb) sbi->s_cgno[i] = UFS_CGNO_EMPTY; } sbi->s_cg_loaded = 0; - UFSD(("EXIT\n")) + UFSD("EXIT\n"); return 1; failed: @@ -479,26 +502,69 @@ failed: for (i = 0; i < UFS_MAX_GROUP_LOADED; i++) kfree (sbi->s_ucpi[i]); } - UFSD(("EXIT (FAILED)\n")) + UFSD("EXIT (FAILED)\n"); return 0; } /* - * Put on-disk structures associated with cylinder groups and - * write them back to disk + * Sync our internal copy of fs_cstotal with disk */ -static void ufs_put_cylinder_structures (struct super_block *sb) +static void ufs_put_cstotal(struct super_block *sb) { - struct ufs_sb_info * sbi = UFS_SB(sb); - struct ufs_sb_private_info * uspi; + unsigned mtype = UFS_SB(sb)->s_mount_opt & UFS_MOUNT_UFSTYPE; + struct ufs_sb_private_info *uspi = UFS_SB(sb)->s_uspi; + struct ufs_super_block_first *usb1; + struct ufs_super_block_second *usb2; + struct ufs_super_block_third *usb3; + + UFSD("ENTER\n"); + usb1 = ubh_get_usb_first(uspi); + usb2 = ubh_get_usb_second(uspi); + usb3 = ubh_get_usb_third(uspi); + + if ((mtype == UFS_MOUNT_UFSTYPE_44BSD && + (usb1->fs_flags & UFS_FLAGS_UPDATED)) || + mtype == UFS_MOUNT_UFSTYPE_UFS2) { + /*we have statistic in different place, then usual*/ + usb2->fs_un.fs_u2.cs_ndir = + cpu_to_fs64(sb, uspi->cs_total.cs_ndir); + usb2->fs_un.fs_u2.cs_nbfree = + cpu_to_fs64(sb, uspi->cs_total.cs_nbfree); + usb3->fs_un1.fs_u2.cs_nifree = + cpu_to_fs64(sb, uspi->cs_total.cs_nifree); + usb3->fs_un1.fs_u2.cs_nffree = + cpu_to_fs64(sb, uspi->cs_total.cs_nffree); + } else { + usb1->fs_cstotal.cs_ndir = + cpu_to_fs32(sb, uspi->cs_total.cs_ndir); + usb1->fs_cstotal.cs_nbfree = + cpu_to_fs32(sb, uspi->cs_total.cs_nbfree); + usb1->fs_cstotal.cs_nifree = + cpu_to_fs32(sb, uspi->cs_total.cs_nifree); + usb1->fs_cstotal.cs_nffree = + cpu_to_fs32(sb, uspi->cs_total.cs_nffree); + } + ubh_mark_buffer_dirty(USPI_UBH(uspi)); + UFSD("EXIT\n"); +} + +/** + * ufs_put_super_internal() - put on-disk intrenal structures + * @sb: pointer to super_block structure + * Put on-disk structures associated with cylinder groups + * and write them back to disk, also update cs_total on disk + */ +static void ufs_put_super_internal(struct super_block *sb) +{ + struct ufs_sb_info *sbi = UFS_SB(sb); + struct ufs_sb_private_info *uspi = sbi->s_uspi; struct ufs_buffer_head * ubh; unsigned char * base, * space; unsigned blks, size, i; - - UFSD(("ENTER\n")) - - uspi = sbi->s_uspi; + + UFSD("ENTER\n"); + ufs_put_cstotal(sb); size = uspi->s_cssize; blks = (size + uspi->s_fsize - 1) >> uspi->s_fshift; base = space = (char*) sbi->s_csp; @@ -523,7 +589,7 @@ static void ufs_put_cylinder_structures (struct super_block *sb) brelse (sbi->s_ucg[i]); kfree (sbi->s_ucg); kfree (base); - UFSD(("EXIT\n")) + UFSD("EXIT\n"); } static int ufs_fill_super(struct super_block *sb, void *data, int silent) @@ -533,7 +599,6 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) struct ufs_super_block_first * usb1; struct ufs_super_block_second * usb2; struct ufs_super_block_third * usb3; - struct ufs_super_block *usb; struct ufs_buffer_head * ubh; struct inode *inode; unsigned block_size, super_block_size; @@ -544,7 +609,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) ubh = NULL; flags = 0; - UFSD(("ENTER\n")) + UFSD("ENTER\n"); sbi = kmalloc(sizeof(struct ufs_sb_info), GFP_KERNEL); if (!sbi) @@ -552,7 +617,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) sb->s_fs_info = sbi; memset(sbi, 0, sizeof(struct ufs_sb_info)); - UFSD(("flag %u\n", (int)(sb->s_flags & MS_RDONLY))) + UFSD("flag %u\n", (int)(sb->s_flags & MS_RDONLY)); #ifndef CONFIG_UFS_FS_WRITE if (!(sb->s_flags & MS_RDONLY)) { @@ -593,7 +658,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) the rules */ switch (sbi->s_mount_opt & UFS_MOUNT_UFSTYPE) { case UFS_MOUNT_UFSTYPE_44BSD: - UFSD(("ufstype=44bsd\n")) + UFSD("ufstype=44bsd\n"); uspi->s_fsize = block_size = 512; uspi->s_fmask = ~(512 - 1); uspi->s_fshift = 9; @@ -602,7 +667,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) flags |= UFS_DE_44BSD | UFS_UID_44BSD | UFS_ST_44BSD | UFS_CG_44BSD; break; case UFS_MOUNT_UFSTYPE_UFS2: - UFSD(("ufstype=ufs2\n")); + UFSD("ufstype=ufs2\n"); super_block_offset=SBLOCK_UFS2; uspi->s_fsize = block_size = 512; uspi->s_fmask = ~(512 - 1); @@ -617,7 +682,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) break; case UFS_MOUNT_UFSTYPE_SUN: - UFSD(("ufstype=sun\n")) + UFSD("ufstype=sun\n"); uspi->s_fsize = block_size = 1024; uspi->s_fmask = ~(1024 - 1); uspi->s_fshift = 10; @@ -628,7 +693,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) break; case UFS_MOUNT_UFSTYPE_SUNx86: - UFSD(("ufstype=sunx86\n")) + UFSD("ufstype=sunx86\n"); uspi->s_fsize = block_size = 1024; uspi->s_fmask = ~(1024 - 1); uspi->s_fshift = 10; @@ -639,7 +704,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) break; case UFS_MOUNT_UFSTYPE_OLD: - UFSD(("ufstype=old\n")) + UFSD("ufstype=old\n"); uspi->s_fsize = block_size = 1024; uspi->s_fmask = ~(1024 - 1); uspi->s_fshift = 10; @@ -654,7 +719,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) break; case UFS_MOUNT_UFSTYPE_NEXTSTEP: - UFSD(("ufstype=nextstep\n")) + UFSD("ufstype=nextstep\n"); uspi->s_fsize = block_size = 1024; uspi->s_fmask = ~(1024 - 1); uspi->s_fshift = 10; @@ -669,7 +734,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) break; case UFS_MOUNT_UFSTYPE_NEXTSTEP_CD: - UFSD(("ufstype=nextstep-cd\n")) + UFSD("ufstype=nextstep-cd\n"); uspi->s_fsize = block_size = 2048; uspi->s_fmask = ~(2048 - 1); uspi->s_fshift = 11; @@ -684,7 +749,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) break; case UFS_MOUNT_UFSTYPE_OPENSTEP: - UFSD(("ufstype=openstep\n")) + UFSD("ufstype=openstep\n"); uspi->s_fsize = block_size = 1024; uspi->s_fmask = ~(1024 - 1); uspi->s_fshift = 10; @@ -699,7 +764,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) break; case UFS_MOUNT_UFSTYPE_HP: - UFSD(("ufstype=hp\n")) + UFSD("ufstype=hp\n"); uspi->s_fsize = block_size = 1024; uspi->s_fmask = ~(1024 - 1); uspi->s_fshift = 10; @@ -737,8 +802,6 @@ again: usb1 = ubh_get_usb_first(uspi); usb2 = ubh_get_usb_second(uspi); usb3 = ubh_get_usb_third(uspi); - usb = (struct ufs_super_block *) - ((struct ufs_buffer_head *)uspi)->bh[0]->b_data ; /* * Check ufs magic number @@ -820,16 +883,12 @@ magic_found: ubh = NULL; block_size = uspi->s_fsize; super_block_size = uspi->s_sbsize; - UFSD(("another value of block_size or super_block_size %u, %u\n", block_size, super_block_size)) + UFSD("another value of block_size or super_block_size %u, %u\n", block_size, super_block_size); goto again; } -#ifdef UFS_SUPER_DEBUG_MORE - if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) - ufs2_print_super_stuff(sb,usb); - else - ufs_print_super_stuff(sb, usb1, usb2, usb3); -#endif + + ufs_print_super_stuff(sb, flags, usb1, usb2, usb3); /* * Check, if file system was correctly unmounted. @@ -842,13 +901,13 @@ magic_found: (ufs_get_fs_state(sb, usb1, usb3) == (UFS_FSOK - fs32_to_cpu(sb, usb1->fs_time))))) { switch(usb1->fs_clean) { case UFS_FSCLEAN: - UFSD(("fs is clean\n")) + UFSD("fs is clean\n"); break; case UFS_FSSTABLE: - UFSD(("fs is stable\n")) + UFSD("fs is stable\n"); break; case UFS_FSOSF1: - UFSD(("fs is DEC OSF/1\n")) + UFSD("fs is DEC OSF/1\n"); break; case UFS_FSACTIVE: printk("ufs_read_super: fs is active\n"); @@ -863,8 +922,7 @@ magic_found: sb->s_flags |= MS_RDONLY; break; } - } - else { + } else { printk("ufs_read_super: fs needs fsck\n"); sb->s_flags |= MS_RDONLY; } @@ -884,10 +942,9 @@ magic_found: uspi->s_cgmask = fs32_to_cpu(sb, usb1->fs_cgmask); if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) { - uspi->s_u2_size = fs64_to_cpu(sb, usb->fs_u11.fs_u2.fs_size); - uspi->s_u2_dsize = fs64_to_cpu(sb, usb->fs_u11.fs_u2.fs_dsize); - } - else { + uspi->s_u2_size = fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_size); + uspi->s_u2_dsize = fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_dsize); + } else { uspi->s_size = fs32_to_cpu(sb, usb1->fs_size); uspi->s_dsize = fs32_to_cpu(sb, usb1->fs_dsize); } @@ -901,8 +958,8 @@ magic_found: uspi->s_fmask = fs32_to_cpu(sb, usb1->fs_fmask); uspi->s_bshift = fs32_to_cpu(sb, usb1->fs_bshift); uspi->s_fshift = fs32_to_cpu(sb, usb1->fs_fshift); - UFSD(("uspi->s_bshift = %d,uspi->s_fshift = %d", uspi->s_bshift, - uspi->s_fshift)); + UFSD("uspi->s_bshift = %d,uspi->s_fshift = %d", uspi->s_bshift, + uspi->s_fshift); uspi->s_fpbshift = fs32_to_cpu(sb, usb1->fs_fragshift); uspi->s_fsbtodb = fs32_to_cpu(sb, usb1->fs_fsbtodb); /* s_sbsize already set */ @@ -922,8 +979,8 @@ magic_found: uspi->s_spc = fs32_to_cpu(sb, usb1->fs_spc); uspi->s_ipg = fs32_to_cpu(sb, usb1->fs_ipg); uspi->s_fpg = fs32_to_cpu(sb, usb1->fs_fpg); - uspi->s_cpc = fs32_to_cpu(sb, usb2->fs_cpc); - uspi->s_contigsumsize = fs32_to_cpu(sb, usb3->fs_u2.fs_44.fs_contigsumsize); + uspi->s_cpc = fs32_to_cpu(sb, usb2->fs_un.fs_u1.fs_cpc); + uspi->s_contigsumsize = fs32_to_cpu(sb, usb3->fs_un2.fs_44.fs_contigsumsize); uspi->s_qbmask = ufs_get_fs_qbmask(sb, usb3); uspi->s_qfmask = ufs_get_fs_qfmask(sb, usb3); uspi->s_postblformat = fs32_to_cpu(sb, usb3->fs_postblformat); @@ -935,12 +992,11 @@ magic_found: * Compute another frequently used values */ uspi->s_fpbmask = uspi->s_fpb - 1; - if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) { + if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) uspi->s_apbshift = uspi->s_bshift - 3; - } - else { + else uspi->s_apbshift = uspi->s_bshift - 2; - } + uspi->s_2apbshift = uspi->s_apbshift * 2; uspi->s_3apbshift = uspi->s_apbshift * 3; uspi->s_apb = 1 << uspi->s_apbshift; @@ -956,7 +1012,7 @@ magic_found: if ((sbi->s_mount_opt & UFS_MOUNT_UFSTYPE) == UFS_MOUNT_UFSTYPE_44BSD) uspi->s_maxsymlinklen = - fs32_to_cpu(sb, usb3->fs_u2.fs_44.fs_maxsymlinklen); + fs32_to_cpu(sb, usb3->fs_un2.fs_44.fs_maxsymlinklen); sbi->s_flags = flags; @@ -967,7 +1023,7 @@ magic_found: if (!sb->s_root) goto dalloc_failed; - + ufs_setup_cstotal(sb); /* * Read cylinder group structures */ @@ -975,7 +1031,7 @@ magic_found: if (!ufs_read_cylinder_structures(sb)) goto failed; - UFSD(("EXIT\n")) + UFSD("EXIT\n"); return 0; dalloc_failed: @@ -986,15 +1042,16 @@ failed: kfree (uspi); kfree(sbi); sb->s_fs_info = NULL; - UFSD(("EXIT (FAILED)\n")) + UFSD("EXIT (FAILED)\n"); return -EINVAL; failed_nomem: - UFSD(("EXIT (NOMEM)\n")) + UFSD("EXIT (NOMEM)\n"); return -ENOMEM; } -static void ufs_write_super (struct super_block *sb) { +static void ufs_write_super(struct super_block *sb) +{ struct ufs_sb_private_info * uspi; struct ufs_super_block_first * usb1; struct ufs_super_block_third * usb3; @@ -1002,7 +1059,7 @@ static void ufs_write_super (struct super_block *sb) { lock_kernel(); - UFSD(("ENTER\n")) + UFSD("ENTER\n"); flags = UFS_SB(sb)->s_flags; uspi = UFS_SB(sb)->s_uspi; usb1 = ubh_get_usb_first(uspi); @@ -1014,26 +1071,27 @@ static void ufs_write_super (struct super_block *sb) { || (flags & UFS_ST_MASK) == UFS_ST_SUNx86) ufs_set_fs_state(sb, usb1, usb3, UFS_FSOK - fs32_to_cpu(sb, usb1->fs_time)); - ubh_mark_buffer_dirty (USPI_UBH); + ufs_put_cstotal(sb); } sb->s_dirt = 0; - UFSD(("EXIT\n")) + UFSD("EXIT\n"); unlock_kernel(); } -static void ufs_put_super (struct super_block *sb) +static void ufs_put_super(struct super_block *sb) { struct ufs_sb_info * sbi = UFS_SB(sb); - UFSD(("ENTER\n")) + UFSD("ENTER\n"); if (!(sb->s_flags & MS_RDONLY)) - ufs_put_cylinder_structures (sb); + ufs_put_super_internal(sb); ubh_brelse_uspi (sbi->s_uspi); kfree (sbi->s_uspi); kfree (sbi); sb->s_fs_info = NULL; + UFSD("EXIT\n"); return; } @@ -1062,8 +1120,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) return -EINVAL; if (!(new_mount_opt & UFS_MOUNT_UFSTYPE)) { new_mount_opt |= ufstype; - } - else if ((new_mount_opt & UFS_MOUNT_UFSTYPE) != ufstype) { + } else if ((new_mount_opt & UFS_MOUNT_UFSTYPE) != ufstype) { printk("ufstype can't be changed during remount\n"); return -EINVAL; } @@ -1077,20 +1134,19 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) * fs was mouted as rw, remounting ro */ if (*mount_flags & MS_RDONLY) { - ufs_put_cylinder_structures(sb); + ufs_put_super_internal(sb); usb1->fs_time = cpu_to_fs32(sb, get_seconds()); if ((flags & UFS_ST_MASK) == UFS_ST_SUN || (flags & UFS_ST_MASK) == UFS_ST_SUNx86) ufs_set_fs_state(sb, usb1, usb3, UFS_FSOK - fs32_to_cpu(sb, usb1->fs_time)); - ubh_mark_buffer_dirty (USPI_UBH); + ubh_mark_buffer_dirty (USPI_UBH(uspi)); sb->s_dirt = 0; sb->s_flags |= MS_RDONLY; - } + } else { /* * fs was mounted as ro, remounting rw */ - else { #ifndef CONFIG_UFS_FS_WRITE printk("ufs was compiled with read-only support, " "can't be mounted as read-write\n"); @@ -1102,7 +1158,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) printk("this ufstype is read-only supported\n"); return -EINVAL; } - if (!ufs_read_cylinder_structures (sb)) { + if (!ufs_read_cylinder_structures(sb)) { printk("failed during remounting\n"); return -EPERM; } @@ -1113,36 +1169,31 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) return 0; } -static int ufs_statfs (struct super_block *sb, struct kstatfs *buf) +static int ufs_statfs(struct dentry *dentry, struct kstatfs *buf) { - struct ufs_sb_private_info * uspi; - struct ufs_super_block_first * usb1; - struct ufs_super_block * usb; - unsigned flags = 0; + struct super_block *sb = dentry->d_sb; + struct ufs_sb_private_info *uspi= UFS_SB(sb)->s_uspi; + unsigned flags = UFS_SB(sb)->s_flags; + struct ufs_super_block_first *usb1; + struct ufs_super_block_second *usb2; + struct ufs_super_block_third *usb3; lock_kernel(); - uspi = UFS_SB(sb)->s_uspi; - usb1 = ubh_get_usb_first (uspi); - usb = (struct ufs_super_block *) - ((struct ufs_buffer_head *)uspi)->bh[0]->b_data ; + usb1 = ubh_get_usb_first(uspi); + usb2 = ubh_get_usb_second(uspi); + usb3 = ubh_get_usb_third(uspi); - flags = UFS_SB(sb)->s_flags; if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) { buf->f_type = UFS2_MAGIC; - buf->f_blocks = fs64_to_cpu(sb, usb->fs_u11.fs_u2.fs_dsize); - buf->f_bfree = ufs_blkstofrags(fs64_to_cpu(sb, usb->fs_u11.fs_u2.fs_cstotal.cs_nbfree)) + - fs64_to_cpu(sb, usb->fs_u11.fs_u2.fs_cstotal.cs_nffree); - buf->f_ffree = fs64_to_cpu(sb, - usb->fs_u11.fs_u2.fs_cstotal.cs_nifree); - } - else { + buf->f_blocks = fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_dsize); + } else { buf->f_type = UFS_MAGIC; buf->f_blocks = uspi->s_dsize; - buf->f_bfree = ufs_blkstofrags(fs32_to_cpu(sb, usb1->fs_cstotal.cs_nbfree)) + - fs32_to_cpu(sb, usb1->fs_cstotal.cs_nffree); - buf->f_ffree = fs32_to_cpu(sb, usb1->fs_cstotal.cs_nifree); } + buf->f_bfree = ufs_blkstofrags(uspi->cs_total.cs_nbfree) + + uspi->cs_total.cs_nffree; + buf->f_ffree = uspi->cs_total.cs_nifree; buf->f_bsize = sb->s_blocksize; buf->f_bavail = (buf->f_bfree > (((long)buf->f_blocks / 100) * uspi->s_minfree)) ? (buf->f_bfree - (((long)buf->f_blocks / 100) * uspi->s_minfree)) : 0; @@ -1275,7 +1326,7 @@ static ssize_t ufs_quota_write(struct super_block *sb, int type, size_t towrite = len; struct buffer_head *bh; - mutex_lock(&inode->i_mutex); + mutex_lock_nested(&inode->i_mutex, I_MUTEX_QUOTA); while (towrite > 0) { tocopy = sb->s_blocksize - offset < towrite ? sb->s_blocksize - offset : towrite; @@ -1311,10 +1362,10 @@ out: #endif -static struct super_block *ufs_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int ufs_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_bdev(fs_type, flags, dev_name, data, ufs_fill_super); + return get_sb_bdev(fs_type, flags, dev_name, data, ufs_fill_super, mnt); } static struct file_system_type ufs_fs_type = { diff --git a/fs/ufs/truncate.c b/fs/ufs/truncate.c index 02e86291e..ea11d04c4 100644 --- a/fs/ufs/truncate.c +++ b/fs/ufs/truncate.c @@ -49,14 +49,6 @@ #include "swab.h" #include "util.h" -#undef UFS_TRUNCATE_DEBUG - -#ifdef UFS_TRUNCATE_DEBUG -#define UFSD(x) printk("(%s, %d), %s: ", __FILE__, __LINE__, __FUNCTION__); printk x; -#else -#define UFSD(x) -#endif - /* * Secure deletion currently doesn't work. It interacts very badly * with buffers shared with memory mappings, and for that reason @@ -82,7 +74,7 @@ static int ufs_trunc_direct (struct inode * inode) unsigned i, tmp; int retry; - UFSD(("ENTER\n")) + UFSD("ENTER\n"); sb = inode->i_sb; uspi = UFS_SB(sb)->s_uspi; @@ -105,7 +97,7 @@ static int ufs_trunc_direct (struct inode * inode) block2 = ufs_fragstoblks (frag3); } - UFSD(("frag1 %u, frag2 %u, block1 %u, block2 %u, frag3 %u, frag4 %u\n", frag1, frag2, block1, block2, frag3, frag4)) + UFSD("frag1 %u, frag2 %u, block1 %u, block2 %u, frag3 %u, frag4 %u\n", frag1, frag2, block1, block2, frag3, frag4); if (frag1 >= frag2) goto next1; @@ -120,9 +112,8 @@ static int ufs_trunc_direct (struct inode * inode) frag1 = ufs_fragnum (frag1); frag2 = ufs_fragnum (frag2); - inode->i_blocks -= (frag2-frag1) << uspi->s_nspfshift; - mark_inode_dirty(inode); ufs_free_fragments (inode, tmp + frag1, frag2 - frag1); + mark_inode_dirty(inode); frag_to_free = tmp + frag1; next1: @@ -136,8 +127,7 @@ next1: continue; *p = 0; - inode->i_blocks -= uspi->s_nspb; - mark_inode_dirty(inode); + if (free_count == 0) { frag_to_free = tmp; free_count = uspi->s_fpb; @@ -148,6 +138,7 @@ next1: frag_to_free = tmp; free_count = uspi->s_fpb; } + mark_inode_dirty(inode); } if (free_count > 0) @@ -166,12 +157,12 @@ next1: frag4 = ufs_fragnum (frag4); *p = 0; - inode->i_blocks -= frag4 << uspi->s_nspfshift; - mark_inode_dirty(inode); + ufs_free_fragments (inode, tmp, frag4); + mark_inode_dirty(inode); next3: - UFSD(("EXIT\n")) + UFSD("EXIT\n"); return retry; } @@ -186,7 +177,7 @@ static int ufs_trunc_indirect (struct inode * inode, unsigned offset, __fs32 *p) unsigned frag_to_free, free_count; int retry; - UFSD(("ENTER\n")) + UFSD("ENTER\n"); sb = inode->i_sb; uspi = UFS_SB(sb)->s_uspi; @@ -227,7 +218,7 @@ static int ufs_trunc_indirect (struct inode * inode, unsigned offset, __fs32 *p) frag_to_free = tmp; free_count = uspi->s_fpb; } - inode->i_blocks -= uspi->s_nspb; + mark_inode_dirty(inode); } @@ -238,26 +229,21 @@ static int ufs_trunc_indirect (struct inode * inode, unsigned offset, __fs32 *p) if (*ubh_get_addr32(ind_ubh,i)) break; if (i >= uspi->s_apb) { - if (ubh_max_bcount(ind_ubh) != 1) { - retry = 1; - } - else { - tmp = fs32_to_cpu(sb, *p); - *p = 0; - inode->i_blocks -= uspi->s_nspb; - mark_inode_dirty(inode); - ufs_free_blocks (inode, tmp, uspi->s_fpb); - ubh_bforget(ind_ubh); - ind_ubh = NULL; - } + tmp = fs32_to_cpu(sb, *p); + *p = 0; + + ufs_free_blocks (inode, tmp, uspi->s_fpb); + mark_inode_dirty(inode); + ubh_bforget(ind_ubh); + ind_ubh = NULL; } if (IS_SYNC(inode) && ind_ubh && ubh_buffer_dirty(ind_ubh)) { - ubh_ll_rw_block (SWRITE, 1, &ind_ubh); + ubh_ll_rw_block(SWRITE, ind_ubh); ubh_wait_on_buffer (ind_ubh); } ubh_brelse (ind_ubh); - UFSD(("EXIT\n")) + UFSD("EXIT\n"); return retry; } @@ -271,7 +257,7 @@ static int ufs_trunc_dindirect (struct inode *inode, unsigned offset, __fs32 *p) __fs32 * dind; int retry = 0; - UFSD(("ENTER\n")) + UFSD("ENTER\n"); sb = inode->i_sb; uspi = UFS_SB(sb)->s_uspi; @@ -306,25 +292,21 @@ static int ufs_trunc_dindirect (struct inode *inode, unsigned offset, __fs32 *p) if (*ubh_get_addr32 (dind_bh, i)) break; if (i >= uspi->s_apb) { - if (ubh_max_bcount(dind_bh) != 1) - retry = 1; - else { - tmp = fs32_to_cpu(sb, *p); - *p = 0; - inode->i_blocks -= uspi->s_nspb; - mark_inode_dirty(inode); - ufs_free_blocks (inode, tmp, uspi->s_fpb); - ubh_bforget(dind_bh); - dind_bh = NULL; - } + tmp = fs32_to_cpu(sb, *p); + *p = 0; + + ufs_free_blocks(inode, tmp, uspi->s_fpb); + mark_inode_dirty(inode); + ubh_bforget(dind_bh); + dind_bh = NULL; } if (IS_SYNC(inode) && dind_bh && ubh_buffer_dirty(dind_bh)) { - ubh_ll_rw_block (SWRITE, 1, &dind_bh); + ubh_ll_rw_block(SWRITE, dind_bh); ubh_wait_on_buffer (dind_bh); } ubh_brelse (dind_bh); - UFSD(("EXIT\n")) + UFSD("EXIT\n"); return retry; } @@ -339,7 +321,7 @@ static int ufs_trunc_tindirect (struct inode * inode) __fs32 * tind, * p; int retry; - UFSD(("ENTER\n")) + UFSD("ENTER\n"); sb = inode->i_sb; uspi = UFS_SB(sb)->s_uspi; @@ -370,45 +352,100 @@ static int ufs_trunc_tindirect (struct inode * inode) if (*ubh_get_addr32 (tind_bh, i)) break; if (i >= uspi->s_apb) { - if (ubh_max_bcount(tind_bh) != 1) - retry = 1; - else { - tmp = fs32_to_cpu(sb, *p); - *p = 0; - inode->i_blocks -= uspi->s_nspb; - mark_inode_dirty(inode); - ufs_free_blocks (inode, tmp, uspi->s_fpb); - ubh_bforget(tind_bh); - tind_bh = NULL; - } + tmp = fs32_to_cpu(sb, *p); + *p = 0; + + ufs_free_blocks(inode, tmp, uspi->s_fpb); + mark_inode_dirty(inode); + ubh_bforget(tind_bh); + tind_bh = NULL; } if (IS_SYNC(inode) && tind_bh && ubh_buffer_dirty(tind_bh)) { - ubh_ll_rw_block (SWRITE, 1, &tind_bh); + ubh_ll_rw_block(SWRITE, tind_bh); ubh_wait_on_buffer (tind_bh); } ubh_brelse (tind_bh); - UFSD(("EXIT\n")) + UFSD("EXIT\n"); return retry; } - -void ufs_truncate (struct inode * inode) + +static int ufs_alloc_lastblock(struct inode *inode) +{ + int err = 0; + struct address_space *mapping = inode->i_mapping; + struct ufs_sb_private_info *uspi = UFS_SB(inode->i_sb)->s_uspi; + unsigned lastfrag, i, end; + struct page *lastpage; + struct buffer_head *bh; + + lastfrag = (i_size_read(inode) + uspi->s_fsize - 1) >> uspi->s_fshift; + + if (!lastfrag) + goto out; + + lastfrag--; + + lastpage = ufs_get_locked_page(mapping, lastfrag >> + (PAGE_CACHE_SHIFT - inode->i_blkbits)); + if (IS_ERR(lastpage)) { + err = -EIO; + goto out; + } + + end = lastfrag & ((1 << (PAGE_CACHE_SHIFT - inode->i_blkbits)) - 1); + bh = page_buffers(lastpage); + for (i = 0; i < end; ++i) + bh = bh->b_this_page; + + + err = ufs_getfrag_block(inode, lastfrag, bh, 1); + + if (unlikely(err)) + goto out_unlock; + + if (buffer_new(bh)) { + clear_buffer_new(bh); + unmap_underlying_metadata(bh->b_bdev, + bh->b_blocknr); + /* + * we do not zeroize fragment, because of + * if it maped to hole, it already contains zeroes + */ + set_buffer_uptodate(bh); + mark_buffer_dirty(bh); + set_page_dirty(lastpage); + } + +out_unlock: + ufs_put_locked_page(lastpage); +out: + return err; +} + +int ufs_truncate(struct inode *inode, loff_t old_i_size) { struct ufs_inode_info *ufsi = UFS_I(inode); - struct super_block * sb; - struct ufs_sb_private_info * uspi; - int retry; + struct super_block *sb = inode->i_sb; + struct ufs_sb_private_info *uspi = UFS_SB(sb)->s_uspi; + int retry, err = 0; - UFSD(("ENTER\n")) - sb = inode->i_sb; - uspi = UFS_SB(sb)->s_uspi; + UFSD("ENTER\n"); - if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))) - return; + if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || + S_ISLNK(inode->i_mode))) + return -EINVAL; if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) - return; + return -EPERM; + + err = ufs_alloc_lastblock(inode); + + if (err) { + i_size_write(inode, old_i_size); + goto out; + } - block_truncate_page(inode->i_mapping, inode->i_size, ufs_getfrag_block); + block_truncate_page(inode->i_mapping, inode->i_size, ufs_getfrag_block); lock_kernel(); while (1) { @@ -430,5 +467,41 @@ void ufs_truncate (struct inode * inode) ufsi->i_lastfrag = DIRECT_FRAGMENT; unlock_kernel(); mark_inode_dirty(inode); - UFSD(("EXIT\n")) +out: + UFSD("EXIT: err %d\n", err); + return err; +} + + +/* + * We don't define our `inode->i_op->truncate', and call it here, + * because of: + * - there is no way to know old size + * - there is no way inform user about error, if it happens in `truncate' + */ +static int ufs_setattr(struct dentry *dentry, struct iattr *attr) +{ + struct inode *inode = dentry->d_inode; + unsigned int ia_valid = attr->ia_valid; + int error; + + error = inode_change_ok(inode, attr); + if (error) + return error; + + if (ia_valid & ATTR_SIZE && + attr->ia_size != i_size_read(inode)) { + loff_t old_i_size = inode->i_size; + error = vmtruncate(inode, attr->ia_size); + if (error) + return error; + error = ufs_truncate(inode, old_i_size); + if (error) + return error; + } + return inode_setattr(inode, attr); } + +struct inode_operations ufs_file_inode_operations = { + .setattr = ufs_setattr, +}; diff --git a/fs/ufs/util.c b/fs/ufs/util.c index 59acc8f07..22f820a9b 100644 --- a/fs/ufs/util.c +++ b/fs/ufs/util.c @@ -14,15 +14,6 @@ #include "swab.h" #include "util.h" -#undef UFS_UTILS_DEBUG - -#ifdef UFS_UTILS_DEBUG -#define UFSD(x) printk("(%s, %d), %s: ", __FILE__, __LINE__, __FUNCTION__); printk x; -#else -#define UFSD(x) -#endif - - struct ufs_buffer_head * _ubh_bread_ (struct ufs_sb_private_info * uspi, struct super_block *sb, u64 fragment, u64 size) { @@ -63,17 +54,17 @@ struct ufs_buffer_head * ubh_bread_uspi (struct ufs_sb_private_info * uspi, count = size >> uspi->s_fshift; if (count <= 0 || count > UFS_MAXFRAG) return NULL; - USPI_UBH->fragment = fragment; - USPI_UBH->count = count; + USPI_UBH(uspi)->fragment = fragment; + USPI_UBH(uspi)->count = count; for (i = 0; i < count; i++) - if (!(USPI_UBH->bh[i] = sb_bread(sb, fragment + i))) + if (!(USPI_UBH(uspi)->bh[i] = sb_bread(sb, fragment + i))) goto failed; for (; i < UFS_MAXFRAG; i++) - USPI_UBH->bh[i] = NULL; - return USPI_UBH; + USPI_UBH(uspi)->bh[i] = NULL; + return USPI_UBH(uspi); failed: for (j = 0; j < i; j++) - brelse (USPI_UBH->bh[j]); + brelse (USPI_UBH(uspi)->bh[j]); return NULL; } @@ -90,11 +81,11 @@ void ubh_brelse (struct ufs_buffer_head * ubh) void ubh_brelse_uspi (struct ufs_sb_private_info * uspi) { unsigned i; - if (!USPI_UBH) + if (!USPI_UBH(uspi)) return; - for ( i = 0; i < USPI_UBH->count; i++ ) { - brelse (USPI_UBH->bh[i]); - USPI_UBH->bh[i] = NULL; + for ( i = 0; i < USPI_UBH(uspi)->count; i++ ) { + brelse (USPI_UBH(uspi)->bh[i]); + USPI_UBH(uspi)->bh[i] = NULL; } } @@ -121,13 +112,12 @@ void ubh_mark_buffer_uptodate (struct ufs_buffer_head * ubh, int flag) } } -void ubh_ll_rw_block (int rw, unsigned nr, struct ufs_buffer_head * ubh[]) +void ubh_ll_rw_block(int rw, struct ufs_buffer_head *ubh) { - unsigned i; if (!ubh) return; - for ( i = 0; i < nr; i++ ) - ll_rw_block (rw, ubh[i]->count, ubh[i]->bh); + + ll_rw_block(rw, ubh->count, ubh->bh); } void ubh_wait_on_buffer (struct ufs_buffer_head * ubh) @@ -139,18 +129,6 @@ void ubh_wait_on_buffer (struct ufs_buffer_head * ubh) wait_on_buffer (ubh->bh[i]); } -unsigned ubh_max_bcount (struct ufs_buffer_head * ubh) -{ - unsigned i; - unsigned max = 0; - if (!ubh) - return 0; - for ( i = 0; i < ubh->count; i++ ) - if ( atomic_read(&ubh->bh[i]->b_count) > max ) - max = atomic_read(&ubh->bh[i]->b_count); - return max; -} - void ubh_bforget (struct ufs_buffer_head * ubh) { unsigned i; @@ -255,3 +233,58 @@ ufs_set_inode_dev(struct super_block *sb, struct ufs_inode_info *ufsi, dev_t dev else ufsi->i_u1.i_data[0] = fs32; } + +/** + * ufs_get_locked_page() - locate, pin and lock a pagecache page, if not exist + * read it from disk. + * @mapping: the address_space to search + * @index: the page index + * + * Locates the desired pagecache page, if not exist we'll read it, + * locks it, increments its reference + * count and returns its address. + * + */ + +struct page *ufs_get_locked_page(struct address_space *mapping, + pgoff_t index) +{ + struct page *page; + + page = find_lock_page(mapping, index); + if (!page) { + page = read_cache_page(mapping, index, + (filler_t*)mapping->a_ops->readpage, + NULL); + + if (IS_ERR(page)) { + printk(KERN_ERR "ufs_change_blocknr: " + "read_cache_page error: ino %lu, index: %lu\n", + mapping->host->i_ino, index); + goto out; + } + + lock_page(page); + + if (unlikely(page->mapping == NULL)) { + /* Truncate got there first */ + unlock_page(page); + page_cache_release(page); + page = NULL; + goto out; + } + + if (!PageUptodate(page) || PageError(page)) { + unlock_page(page); + page_cache_release(page); + + printk(KERN_ERR "ufs_change_blocknr: " + "can not read page: ino %lu, index: %lu\n", + mapping->host->i_ino, index); + + page = ERR_PTR(-EIO); + } + } +out: + return page; +} diff --git a/fs/ufs/util.h b/fs/ufs/util.h index 48d6d9bcc..28fce6c23 100644 --- a/fs/ufs/util.h +++ b/fs/ufs/util.h @@ -17,10 +17,16 @@ #define in_range(b,first,len) ((b)>=(first)&&(b)<(first)+(len)) /* - * macros used for retyping + * functions used for retyping */ -#define UCPI_UBH ((struct ufs_buffer_head *)ucpi) -#define USPI_UBH ((struct ufs_buffer_head *)uspi) +static inline struct ufs_buffer_head *UCPI_UBH(struct ufs_cg_private_info *cpi) +{ + return &cpi->c_ubh; +} +static inline struct ufs_buffer_head *USPI_UBH(struct ufs_sb_private_info *spi) +{ + return &spi->s_ubh; +} @@ -33,12 +39,12 @@ ufs_get_fs_state(struct super_block *sb, struct ufs_super_block_first *usb1, { switch (UFS_SB(sb)->s_flags & UFS_ST_MASK) { case UFS_ST_SUN: - return fs32_to_cpu(sb, usb3->fs_u2.fs_sun.fs_state); + return fs32_to_cpu(sb, usb3->fs_un2.fs_sun.fs_state); case UFS_ST_SUNx86: return fs32_to_cpu(sb, usb1->fs_u1.fs_sunx86.fs_state); case UFS_ST_44BSD: default: - return fs32_to_cpu(sb, usb3->fs_u2.fs_44.fs_state); + return fs32_to_cpu(sb, usb3->fs_un2.fs_44.fs_state); } } @@ -48,13 +54,13 @@ ufs_set_fs_state(struct super_block *sb, struct ufs_super_block_first *usb1, { switch (UFS_SB(sb)->s_flags & UFS_ST_MASK) { case UFS_ST_SUN: - usb3->fs_u2.fs_sun.fs_state = cpu_to_fs32(sb, value); + usb3->fs_un2.fs_sun.fs_state = cpu_to_fs32(sb, value); break; case UFS_ST_SUNx86: usb1->fs_u1.fs_sunx86.fs_state = cpu_to_fs32(sb, value); break; case UFS_ST_44BSD: - usb3->fs_u2.fs_44.fs_state = cpu_to_fs32(sb, value); + usb3->fs_un2.fs_44.fs_state = cpu_to_fs32(sb, value); break; } } @@ -64,7 +70,7 @@ ufs_get_fs_npsect(struct super_block *sb, struct ufs_super_block_first *usb1, struct ufs_super_block_third *usb3) { if ((UFS_SB(sb)->s_flags & UFS_ST_MASK) == UFS_ST_SUNx86) - return fs32_to_cpu(sb, usb3->fs_u2.fs_sunx86.fs_npsect); + return fs32_to_cpu(sb, usb3->fs_un2.fs_sunx86.fs_npsect); else return fs32_to_cpu(sb, usb1->fs_u1.fs_sun.fs_npsect); } @@ -76,16 +82,16 @@ ufs_get_fs_qbmask(struct super_block *sb, struct ufs_super_block_third *usb3) switch (UFS_SB(sb)->s_flags & UFS_ST_MASK) { case UFS_ST_SUN: - ((__fs32 *)&tmp)[0] = usb3->fs_u2.fs_sun.fs_qbmask[0]; - ((__fs32 *)&tmp)[1] = usb3->fs_u2.fs_sun.fs_qbmask[1]; + ((__fs32 *)&tmp)[0] = usb3->fs_un2.fs_sun.fs_qbmask[0]; + ((__fs32 *)&tmp)[1] = usb3->fs_un2.fs_sun.fs_qbmask[1]; break; case UFS_ST_SUNx86: - ((__fs32 *)&tmp)[0] = usb3->fs_u2.fs_sunx86.fs_qbmask[0]; - ((__fs32 *)&tmp)[1] = usb3->fs_u2.fs_sunx86.fs_qbmask[1]; + ((__fs32 *)&tmp)[0] = usb3->fs_un2.fs_sunx86.fs_qbmask[0]; + ((__fs32 *)&tmp)[1] = usb3->fs_un2.fs_sunx86.fs_qbmask[1]; break; case UFS_ST_44BSD: - ((__fs32 *)&tmp)[0] = usb3->fs_u2.fs_44.fs_qbmask[0]; - ((__fs32 *)&tmp)[1] = usb3->fs_u2.fs_44.fs_qbmask[1]; + ((__fs32 *)&tmp)[0] = usb3->fs_un2.fs_44.fs_qbmask[0]; + ((__fs32 *)&tmp)[1] = usb3->fs_un2.fs_44.fs_qbmask[1]; break; } @@ -99,16 +105,16 @@ ufs_get_fs_qfmask(struct super_block *sb, struct ufs_super_block_third *usb3) switch (UFS_SB(sb)->s_flags & UFS_ST_MASK) { case UFS_ST_SUN: - ((__fs32 *)&tmp)[0] = usb3->fs_u2.fs_sun.fs_qfmask[0]; - ((__fs32 *)&tmp)[1] = usb3->fs_u2.fs_sun.fs_qfmask[1]; + ((__fs32 *)&tmp)[0] = usb3->fs_un2.fs_sun.fs_qfmask[0]; + ((__fs32 *)&tmp)[1] = usb3->fs_un2.fs_sun.fs_qfmask[1]; break; case UFS_ST_SUNx86: - ((__fs32 *)&tmp)[0] = usb3->fs_u2.fs_sunx86.fs_qfmask[0]; - ((__fs32 *)&tmp)[1] = usb3->fs_u2.fs_sunx86.fs_qfmask[1]; + ((__fs32 *)&tmp)[0] = usb3->fs_un2.fs_sunx86.fs_qfmask[0]; + ((__fs32 *)&tmp)[1] = usb3->fs_un2.fs_sunx86.fs_qfmask[1]; break; case UFS_ST_44BSD: - ((__fs32 *)&tmp)[0] = usb3->fs_u2.fs_44.fs_qfmask[0]; - ((__fs32 *)&tmp)[1] = usb3->fs_u2.fs_44.fs_qfmask[1]; + ((__fs32 *)&tmp)[0] = usb3->fs_un2.fs_44.fs_qfmask[0]; + ((__fs32 *)&tmp)[1] = usb3->fs_un2.fs_44.fs_qfmask[1]; break; } @@ -236,9 +242,8 @@ extern void ubh_brelse (struct ufs_buffer_head *); extern void ubh_brelse_uspi (struct ufs_sb_private_info *); extern void ubh_mark_buffer_dirty (struct ufs_buffer_head *); extern void ubh_mark_buffer_uptodate (struct ufs_buffer_head *, int); -extern void ubh_ll_rw_block (int, unsigned, struct ufs_buffer_head **); +extern void ubh_ll_rw_block(int, struct ufs_buffer_head *); extern void ubh_wait_on_buffer (struct ufs_buffer_head *); -extern unsigned ubh_max_bcount (struct ufs_buffer_head *); extern void ubh_bforget (struct ufs_buffer_head *); extern int ubh_buffer_dirty (struct ufs_buffer_head *); #define ubh_ubhcpymem(mem,ubh,size) _ubh_ubhcpymem_(uspi,mem,ubh,size) @@ -246,6 +251,14 @@ extern void _ubh_ubhcpymem_(struct ufs_sb_private_info *, unsigned char *, struc #define ubh_memcpyubh(ubh,mem,size) _ubh_memcpyubh_(uspi,ubh,mem,size) extern void _ubh_memcpyubh_(struct ufs_sb_private_info *, struct ufs_buffer_head *, unsigned char *, unsigned); +/* This functions works with cache pages*/ +extern struct page *ufs_get_locked_page(struct address_space *mapping, + pgoff_t index); +static inline void ufs_put_locked_page(struct page *page) +{ + unlock_page(page); + page_cache_release(page); +} /* @@ -297,40 +310,26 @@ static inline void *get_usb_offset(struct ufs_sb_private_info *uspi, #define ubh_blkmap(ubh,begin,bit) \ ((*ubh_get_addr(ubh, (begin) + ((bit) >> 3)) >> ((bit) & 7)) & (0xff >> (UFS_MAXFRAG - uspi->s_fpb))) - -/* - * Macros for access to superblock array structures - */ -#define ubh_postbl(ubh,cylno,i) \ - ((uspi->s_postblformat != UFS_DYNAMICPOSTBLFMT) \ - ? (*(__s16*)(ubh_get_addr(ubh, \ - (unsigned)(&((struct ufs_super_block *)0)->fs_opostbl) \ - + (((cylno) * 16 + (i)) << 1) ) )) \ - : (*(__s16*)(ubh_get_addr(ubh, \ - uspi->s_postbloff + (((cylno) * uspi->s_nrpos + (i)) << 1) )))) - -#define ubh_rotbl(ubh,i) \ - ((uspi->s_postblformat != UFS_DYNAMICPOSTBLFMT) \ - ? (*(__u8*)(ubh_get_addr(ubh, \ - (unsigned)(&((struct ufs_super_block *)0)->fs_space) + (i)))) \ - : (*(__u8*)(ubh_get_addr(ubh, uspi->s_rotbloff + (i))))) - /* * Determine the number of available frags given a * percentage to hold in reserve. */ -#define ufs_freespace(usb, percentreserved) \ - (ufs_blkstofrags(fs32_to_cpu(sb, (usb)->fs_cstotal.cs_nbfree)) + \ - fs32_to_cpu(sb, (usb)->fs_cstotal.cs_nffree) - (uspi->s_dsize * (percentreserved) / 100)) +static inline u64 +ufs_freespace(struct ufs_sb_private_info *uspi, int percentreserved) +{ + return ufs_blkstofrags(uspi->cs_total.cs_nbfree) + + uspi->cs_total.cs_nffree - + (uspi->s_dsize * (percentreserved) / 100); +} /* * Macros to access cylinder group array structures */ #define ubh_cg_blktot(ucpi,cylno) \ - (*((__fs32*)ubh_get_addr(UCPI_UBH, (ucpi)->c_btotoff + ((cylno) << 2)))) + (*((__fs32*)ubh_get_addr(UCPI_UBH(ucpi), (ucpi)->c_btotoff + ((cylno) << 2)))) #define ubh_cg_blks(ucpi,cylno,rpos) \ - (*((__fs16*)ubh_get_addr(UCPI_UBH, \ + (*((__fs16*)ubh_get_addr(UCPI_UBH(ucpi), \ (ucpi)->c_boff + (((cylno) * uspi->s_nrpos + (rpos)) << 1 )))) /* @@ -508,29 +507,3 @@ static inline void ufs_fragacct (struct super_block * sb, unsigned blockmap, if (fragsize > 0 && fragsize < uspi->s_fpb) fs32_add(sb, &fraglist[fragsize], cnt); } - -#define ubh_scanc(ubh,begin,size,table,mask) _ubh_scanc_(uspi,ubh,begin,size,table,mask) -static inline unsigned _ubh_scanc_(struct ufs_sb_private_info * uspi, struct ufs_buffer_head * ubh, - unsigned begin, unsigned size, unsigned char * table, unsigned char mask) -{ - unsigned rest, offset; - unsigned char * cp; - - - offset = begin & ~uspi->s_fmask; - begin >>= uspi->s_fshift; - for (;;) { - if ((offset + size) < uspi->s_fsize) - rest = size; - else - rest = uspi->s_fsize - offset; - size -= rest; - cp = ubh->bh[begin]->b_data + offset; - while ((table[*cp++] & mask) == 0 && --rest); - if (rest || !size) - break; - begin++; - offset = 0; - } - return (size + rest); -} diff --git a/fs/vfat/namei.c b/fs/vfat/namei.c index a56cec3be..9a8f48bae 100644 --- a/fs/vfat/namei.c +++ b/fs/vfat/namei.c @@ -1023,11 +1023,12 @@ static int vfat_fill_super(struct super_block *sb, void *data, int silent) return 0; } -static struct super_block *vfat_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, - void *data) +static int vfat_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, + void *data, struct vfsmount *mnt) { - return get_sb_bdev(fs_type, flags, dev_name, data, vfat_fill_super); + return get_sb_bdev(fs_type, flags, dev_name, data, vfat_fill_super, + mnt); } static struct file_system_type vfat_fs_type = { diff --git a/fs/xattr.c b/fs/xattr.c index 1940c63f1..1422a01e2 100644 --- a/fs/xattr.c +++ b/fs/xattr.c @@ -246,7 +246,7 @@ sys_fsetxattr(int fd, char __user *name, void __user *value, if (!f) return error; dentry = f->f_dentry; - audit_inode(NULL, dentry->d_inode, 0); + audit_inode(NULL, dentry->d_inode); error = setxattr(dentry, name, value, size, flags, f->f_vfsmnt); fput(f); return error; @@ -476,7 +476,7 @@ sys_fremovexattr(int fd, char __user *name) if (!f) return error; dentry = f->f_dentry; - audit_inode(NULL, dentry->d_inode, 0); + audit_inode(NULL, dentry->d_inode); error = removexattr(dentry, name, f->f_vfsmnt); fput(f); return error; diff --git a/fs/xfs/Kconfig b/fs/xfs/Kconfig index c92306f0f..26b364c9d 100644 --- a/fs/xfs/Kconfig +++ b/fs/xfs/Kconfig @@ -1,8 +1,5 @@ -menu "XFS support" - config XFS_FS tristate "XFS filesystem support" - select EXPORTFS if NFSD!=n help XFS is a high performance journaling filesystem which originated on the SGI IRIX platform. It is completely multi-threaded, can @@ -20,29 +17,8 @@ config XFS_FS system of your root partition is compiled as a module, you'll need to use an initial ramdisk (initrd) to boot. -config XFS_EXPORT - bool - default y if XFS_FS && EXPORTFS - -config XFS_RT - bool "Realtime support (EXPERIMENTAL)" - depends on XFS_FS && EXPERIMENTAL - help - If you say Y here you will be able to mount and use XFS filesystems - which contain a realtime subvolume. The realtime subvolume is a - separate area of disk space where only file data is stored. The - realtime subvolume is designed to provide very deterministic - data rates suitable for media streaming applications. - - See the xfs man page in section 5 for a bit more information. - - This feature is unsupported at this time, is not yet fully - functional, and may cause serious problems. - - If unsure, say N. - config XFS_QUOTA - bool "Quota support" + bool "XFS Quota support" depends on XFS_FS help If you say Y here, you will be able to set limits for disk usage on @@ -59,7 +35,7 @@ config XFS_QUOTA they are completely independent subsystems. config XFS_SECURITY - bool "Security Label support" + bool "XFS Security Label support" depends on XFS_FS help Security labels support alternative access control models @@ -71,7 +47,7 @@ config XFS_SECURITY extended attributes for inode security labels, say N. config XFS_POSIX_ACL - bool "POSIX ACL support" + bool "XFS POSIX ACL support" depends on XFS_FS help POSIX Access Control Lists (ACLs) support permissions for users and @@ -82,4 +58,20 @@ config XFS_POSIX_ACL If you don't know what Access Control Lists are, say N. -endmenu +config XFS_RT + bool "XFS Realtime subvolume support" + depends on XFS_FS + help + If you say Y here you will be able to mount and use XFS filesystems + which contain a realtime subvolume. The realtime subvolume is a + separate area of disk space where only file data is stored. It was + originally designed to provide deterministic data rates suitable + for media streaming applications, but is also useful as a generic + mechanism for ensuring data and metadata/log I/Os are completely + separated. Regular file I/Os are isolated to a separate device + from all other requests, and this can be done quite transparently + to applications via the inherit-realtime directory inode flag. + + See the xfs man page in section 5 for additional information. + + If unsure, say N. diff --git a/fs/xfs/Makefile-linux-2.6 b/fs/xfs/Makefile-linux-2.6 index 5d73eaa19..9e7f85986 100644 --- a/fs/xfs/Makefile-linux-2.6 +++ b/fs/xfs/Makefile-linux-2.6 @@ -59,7 +59,6 @@ xfs-$(CONFIG_XFS_POSIX_ACL) += xfs_acl.o xfs-$(CONFIG_PROC_FS) += $(XFS_LINUX)/xfs_stats.o xfs-$(CONFIG_SYSCTL) += $(XFS_LINUX)/xfs_sysctl.o xfs-$(CONFIG_COMPAT) += $(XFS_LINUX)/xfs_ioctl32.o -xfs-$(CONFIG_XFS_EXPORT) += $(XFS_LINUX)/xfs_export.o xfs-y += xfs_alloc.o \ @@ -73,14 +72,12 @@ xfs-y += xfs_alloc.o \ xfs_btree.o \ xfs_buf_item.o \ xfs_da_btree.o \ - xfs_dir.o \ xfs_dir2.o \ xfs_dir2_block.o \ xfs_dir2_data.o \ xfs_dir2_leaf.o \ xfs_dir2_node.o \ xfs_dir2_sf.o \ - xfs_dir_leaf.o \ xfs_error.o \ xfs_extfree_item.o \ xfs_fsops.o \ @@ -117,6 +114,7 @@ xfs-y += $(addprefix $(XFS_LINUX)/, \ kmem.o \ xfs_aops.o \ xfs_buf.o \ + xfs_export.o \ xfs_file.o \ xfs_fs_subr.o \ xfs_globals.o \ diff --git a/fs/xfs/linux-2.6/kmem.h b/fs/xfs/linux-2.6/kmem.h index 1397b669b..939bd84bc 100644 --- a/fs/xfs/linux-2.6/kmem.h +++ b/fs/xfs/linux-2.6/kmem.h @@ -1,33 +1,19 @@ /* - * Copyright (c) 2000-2004 Silicon Graphics, Inc. All Rights Reserved. + * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * All Rights Reserved. * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as + * 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. * - * This program is distributed in the hope that it would be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * This program is distributed in the hope that it would 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. * - * Further, this software is distributed without any warranty that it is - * free of the rightful claim of any third person regarding infringement - * or the like. Any license provided herein, whether implied or - * otherwise, applies only to this software file. Patent licenses, if - * any, provided herein do not apply to combinations of this program with - * other software, or any other product whatsoever. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston MA 02111-1307, USA. - * - * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, - * Mountain View, CA 94043, or: - * - * http://www.sgi.com - * - * For further information regarding this notice, see: - * - * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef __XFS_SUPPORT_KMEM_H__ #define __XFS_SUPPORT_KMEM_H__ @@ -37,119 +23,102 @@ #include /* - * memory management routines + * General memory allocation interfaces */ -#define KM_SLEEP 0x0001 -#define KM_NOSLEEP 0x0002 -#define KM_NOFS 0x0004 -#define KM_MAYFAIL 0x0008 - -#define kmem_zone kmem_cache_s -#define kmem_zone_t kmem_cache_t - -typedef unsigned long xfs_pflags_t; - -#define PFLAGS_TEST_NOIO() (current->flags & PF_NOIO) -#define PFLAGS_TEST_FSTRANS() (current->flags & PF_FSTRANS) -#define PFLAGS_SET_NOIO() do { \ - current->flags |= PF_NOIO; \ -} while (0) +#define KM_SLEEP 0x0001u +#define KM_NOSLEEP 0x0002u +#define KM_NOFS 0x0004u +#define KM_MAYFAIL 0x0008u -#define PFLAGS_CLEAR_NOIO() do { \ - current->flags &= ~PF_NOIO; \ -} while (0) - -/* these could be nested, so we save state */ -#define PFLAGS_SET_FSTRANS(STATEP) do { \ - *(STATEP) = current->flags; \ - current->flags |= PF_FSTRANS; \ -} while (0) - -#define PFLAGS_CLEAR_FSTRANS(STATEP) do { \ - *(STATEP) = current->flags; \ - current->flags &= ~PF_FSTRANS; \ -} while (0) - -/* Restore the PF_FSTRANS state to what was saved in STATEP */ -#define PFLAGS_RESTORE_FSTRANS(STATEP) do { \ - current->flags = ((current->flags & ~PF_FSTRANS) | \ - (*(STATEP) & PF_FSTRANS)); \ -} while (0) - -#define PFLAGS_DUP(OSTATEP, NSTATEP) do { \ - *(NSTATEP) = *(OSTATEP); \ -} while (0) - -static __inline unsigned int kmem_flags_convert(int flags) +/* + * We use a special process flag to avoid recursive callbacks into + * the filesystem during transactions. We will also issue our own + * warnings, so we explicitly skip any generic ones (silly of us). + */ +static inline gfp_t +kmem_flags_convert(unsigned int __nocast flags) { - int lflags = __GFP_NOWARN; /* we'll report problems, if need be */ + gfp_t lflags; -#ifdef DEBUG - if (unlikely(flags & ~(KM_SLEEP|KM_NOSLEEP|KM_NOFS|KM_MAYFAIL))) { - printk(KERN_WARNING - "XFS: memory allocation with wrong flags (%x)\n", flags); - BUG(); - } -#endif + BUG_ON(flags & ~(KM_SLEEP|KM_NOSLEEP|KM_NOFS|KM_MAYFAIL)); if (flags & KM_NOSLEEP) { - lflags |= GFP_ATOMIC; + lflags = GFP_ATOMIC | __GFP_NOWARN; } else { - lflags |= GFP_KERNEL; - - /* avoid recusive callbacks to filesystem during transactions */ - if (PFLAGS_TEST_FSTRANS() || (flags & KM_NOFS)) + lflags = GFP_KERNEL | __GFP_NOWARN; + if ((current->flags & PF_FSTRANS) || (flags & KM_NOFS)) lflags &= ~__GFP_FS; } - - return lflags; + return lflags; } -static __inline kmem_zone_t * +extern void *kmem_alloc(size_t, unsigned int __nocast); +extern void *kmem_realloc(void *, size_t, size_t, unsigned int __nocast); +extern void *kmem_zalloc(size_t, unsigned int __nocast); +extern void kmem_free(void *, size_t); + +/* + * Zone interfaces + */ + +#define KM_ZONE_HWALIGN SLAB_HWCACHE_ALIGN +#define KM_ZONE_RECLAIM SLAB_RECLAIM_ACCOUNT +#define KM_ZONE_SPREAD SLAB_MEM_SPREAD + +#define kmem_zone kmem_cache +#define kmem_zone_t struct kmem_cache + +static inline kmem_zone_t * kmem_zone_init(int size, char *zone_name) { return kmem_cache_create(zone_name, size, 0, 0, NULL, NULL); } -static __inline void +static inline kmem_zone_t * +kmem_zone_init_flags(int size, char *zone_name, unsigned long flags, + void (*construct)(void *, kmem_zone_t *, unsigned long)) +{ + return kmem_cache_create(zone_name, size, 0, flags, construct, NULL); +} + +static inline void kmem_zone_free(kmem_zone_t *zone, void *ptr) { kmem_cache_free(zone, ptr); } -static __inline void +static inline void kmem_zone_destroy(kmem_zone_t *zone) { if (zone && kmem_cache_destroy(zone)) BUG(); } -extern void *kmem_zone_zalloc(kmem_zone_t *, int); -extern void *kmem_zone_alloc(kmem_zone_t *, int); +extern void *kmem_zone_alloc(kmem_zone_t *, unsigned int __nocast); +extern void *kmem_zone_zalloc(kmem_zone_t *, unsigned int __nocast); -extern void *kmem_alloc(size_t, int); -extern void *kmem_realloc(void *, size_t, size_t, int); -extern void *kmem_zalloc(size_t, int); -extern void kmem_free(void *, size_t); +/* + * Low memory cache shrinkers + */ typedef struct shrinker *kmem_shaker_t; -typedef int (*kmem_shake_func_t)(int, unsigned int); +typedef int (*kmem_shake_func_t)(int, gfp_t); -static __inline kmem_shaker_t +static inline kmem_shaker_t kmem_shake_register(kmem_shake_func_t sfunc) { return set_shrinker(DEFAULT_SEEKS, sfunc); } -static __inline void +static inline void kmem_shake_deregister(kmem_shaker_t shrinker) { remove_shrinker(shrinker); } -static __inline int -kmem_shake_allow(unsigned int gfp_mask) +static inline int +kmem_shake_allow(gfp_t gfp_mask) { return (gfp_mask & __GFP_WAIT); } diff --git a/fs/xfs/linux-2.6/mrlock.h b/fs/xfs/linux-2.6/mrlock.h index d2c11a098..32e1ce0f0 100644 --- a/fs/xfs/linux-2.6/mrlock.h +++ b/fs/xfs/linux-2.6/mrlock.h @@ -1,33 +1,19 @@ /* - * Copyright (c) 2000-2004 Silicon Graphics, Inc. All Rights Reserved. + * Copyright (c) 2000-2006 Silicon Graphics, Inc. + * All Rights Reserved. * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as + * 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. * - * This program is distributed in the hope that it would be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * This program is distributed in the hope that it would 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. * - * Further, this software is distributed without any warranty that it is - * free of the rightful claim of any third person regarding infringement - * or the like. Any license provided herein, whether implied or - * otherwise, applies only to this software file. Patent licenses, if - * any, provided herein do not apply to combinations of this program with - * other software, or any other product whatsoever. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston MA 02111-1307, USA. - * - * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, - * Mountain View, CA 94043, or: - * - * http://www.sgi.com - * - * For further information regarding this notice, see: - * - * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef __XFS_SUPPORT_MRLOCK_H__ #define __XFS_SUPPORT_MRLOCK_H__ @@ -42,7 +28,7 @@ typedef struct { } mrlock_t; #define mrinit(mrp, name) \ - ( (mrp)->mr_writer = 0, init_rwsem(&(mrp)->mr_lock) ) + do { (mrp)->mr_writer = 0; init_rwsem(&(mrp)->mr_lock); } while (0) #define mrlock_init(mrp, t,n,s) mrinit(mrp, n) #define mrfree(mrp) do { } while (0) #define mraccess(mrp) mraccessf(mrp, 0) @@ -93,7 +79,7 @@ static inline void mrdemote(mrlock_t *mrp) * Debug-only routine, without some platform-specific asm code, we can * now only answer requests regarding whether we hold the lock for write * (reader state is outside our visibility, we only track writer state). - * Note: means !ismrlocked would give false positivies, so don't do that. + * Note: means !ismrlocked would give false positives, so don't do that. */ static inline int ismrlocked(mrlock_t *mrp, int type) { diff --git a/fs/xfs/linux-2.6/sema.h b/fs/xfs/linux-2.6/sema.h index 30b67b4e1..b25090094 100644 --- a/fs/xfs/linux-2.6/sema.h +++ b/fs/xfs/linux-2.6/sema.h @@ -1,33 +1,19 @@ /* - * Copyright (c) 2000-2002 Silicon Graphics, Inc. All Rights Reserved. + * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc. + * All Rights Reserved. * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as + * 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. * - * This program is distributed in the hope that it would be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * This program is distributed in the hope that it would 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. * - * Further, this software is distributed without any warranty that it is - * free of the rightful claim of any third person regarding infringement - * or the like. Any license provided herein, whether implied or - * otherwise, applies only to this software file. Patent licenses, if - * any, provided herein do not apply to combinations of this program with - * other software, or any other product whatsoever. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston MA 02111-1307, USA. - * - * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, - * Mountain View, CA 94043, or: - * - * http://www.sgi.com - * - * For further information regarding this notice, see: - * - * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef __XFS_SUPPORT_SEMA_H__ #define __XFS_SUPPORT_SEMA_H__ @@ -48,20 +34,21 @@ typedef struct semaphore sema_t; #define initnsema(sp, val, name) sema_init(sp, val) #define psema(sp, b) down(sp) #define vsema(sp) up(sp) -#define valusema(sp) (atomic_read(&(sp)->count)) -#define freesema(sema) +#define freesema(sema) do { } while (0) + +static inline int issemalocked(sema_t *sp) +{ + return down_trylock(sp) || (up(sp), 0); +} /* * Map cpsema (try to get the sema) to down_trylock. We need to switch * the return values since cpsema returns 1 (acquired) 0 (failed) and * down_trylock returns the reverse 0 (acquired) 1 (failed). */ - -#define cpsema(sp) (down_trylock(sp) ? 0 : 1) - -/* - * Didn't do cvsema(sp). Not sure how to map this to up/down/... - * It does a vsema if the values is < 0 other wise nothing. - */ +static inline int cpsema(sema_t *sp) +{ + return down_trylock(sp) ? 0 : 1; +} #endif /* __XFS_SUPPORT_SEMA_H__ */ diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c index 93ce257cd..34dcb43a7 100644 --- a/fs/xfs/linux-2.6/xfs_aops.c +++ b/fs/xfs/linux-2.6/xfs_aops.c @@ -1,40 +1,26 @@ /* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. All Rights Reserved. + * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * All Rights Reserved. * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as + * 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. * - * This program is distributed in the hope that it would be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * This program is distributed in the hope that it would 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. * - * Further, this software is distributed without any warranty that it is - * free of the rightful claim of any third person regarding infringement - * or the like. Any license provided herein, whether implied or - * otherwise, applies only to this software file. Patent licenses, if - * any, provided herein do not apply to combinations of this program with - * other software, or any other product whatsoever. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston MA 02111-1307, USA. - * - * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, - * Mountain View, CA 94043, or: - * - * http://www.sgi.com - * - * For further information regarding this notice, see: - * - * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - #include "xfs.h" -#include "xfs_inum.h" +#include "xfs_bit.h" #include "xfs_log.h" +#include "xfs_inum.h" #include "xfs_sb.h" -#include "xfs_dir.h" +#include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_trans.h" #include "xfs_dmapi.h" @@ -42,22 +28,42 @@ #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_alloc.h" -#include "xfs_btree.h" -#include "xfs_attr_sf.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" +#include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" +#include "xfs_alloc.h" +#include "xfs_btree.h" #include "xfs_error.h" #include "xfs_rw.h" #include "xfs_iomap.h" #include +#include #include -STATIC void xfs_count_page_state(struct page *, int *, int *, int *); -STATIC void xfs_convert_page(struct inode *, struct page *, xfs_iomap_t *, - struct writeback_control *wbc, void *, int, int); +STATIC void +xfs_count_page_state( + struct page *page, + int *delalloc, + int *unmapped, + int *unwritten) +{ + struct buffer_head *bh, *head; + + *delalloc = *unmapped = *unwritten = 0; + + bh = head = page_buffers(page); + do { + if (buffer_uptodate(bh) && !buffer_mapped(bh)) + (*unmapped) = 1; + else if (buffer_unwritten(bh) && !buffer_delay(bh)) + clear_buffer_unwritten(bh); + else if (buffer_unwritten(bh)) + (*unwritten) = 1; + else if (buffer_delay(bh)) + (*delalloc) = 1; + } while ((bh = bh->b_this_page) != head); +} #if defined(XFS_RW_TRACE) void @@ -68,17 +74,15 @@ xfs_page_trace( int mask) { xfs_inode_t *ip; - bhv_desc_t *bdp; - vnode_t *vp = LINVFS_GET_VP(inode); + bhv_vnode_t *vp = vn_from_inode(inode); loff_t isize = i_size_read(inode); - loff_t offset = (loff_t)page->index << PAGE_CACHE_SHIFT; + loff_t offset = page_offset(page); int delalloc = -1, unmapped = -1, unwritten = -1; if (page_has_buffers(page)) xfs_count_page_state(page, &delalloc, &unmapped, &unwritten); - bdp = vn_bhv_lookup(VN_BHV_HEAD(vp), &xfs_vnodeops); - ip = XFS_BHVTOI(bdp); + ip = xfs_vtoi(vp); if (!ip->i_rwtrace) return; @@ -97,72 +101,132 @@ xfs_page_trace( (void *)((unsigned long)delalloc), (void *)((unsigned long)unmapped), (void *)((unsigned long)unwritten), - (void *)NULL, + (void *)((unsigned long)current_pid()), (void *)NULL); } #else #define xfs_page_trace(tag, inode, page, mask) #endif -void -linvfs_unwritten_done( - struct buffer_head *bh, - int uptodate) +/* + * Schedule IO completion handling on a xfsdatad if this was + * the final hold on this ioend. + */ +STATIC void +xfs_finish_ioend( + xfs_ioend_t *ioend) { - xfs_buf_t *pb = (xfs_buf_t *)bh->b_private; + if (atomic_dec_and_test(&ioend->io_remaining)) + queue_work(xfsdatad_workqueue, &ioend->io_work); +} - ASSERT(buffer_unwritten(bh)); - bh->b_end_io = NULL; - clear_buffer_unwritten(bh); - if (!uptodate) - pagebuf_ioerror(pb, EIO); - if (atomic_dec_and_test(&pb->pb_io_remaining) == 1) { - pagebuf_iodone(pb, 1, 1); +/* + * We're now finished for good with this ioend structure. + * Update the page state via the associated buffer_heads, + * release holds on the inode and bio, and finally free + * up memory. Do not use the ioend after this. + */ +STATIC void +xfs_destroy_ioend( + xfs_ioend_t *ioend) +{ + struct buffer_head *bh, *next; + + for (bh = ioend->io_buffer_head; bh; bh = next) { + next = bh->b_private; + bh->b_end_io(bh, !ioend->io_error); } - end_buffer_async_write(bh, uptodate); + if (unlikely(ioend->io_error)) + vn_ioerror(ioend->io_vnode, ioend->io_error, __FILE__,__LINE__); + vn_iowake(ioend->io_vnode); + mempool_free(ioend, xfs_ioend_pool); } /* - * Issue transactions to convert a buffer range from unwritten - * to written extents (buffered IO). + * Buffered IO write completion for delayed allocate extents. + * TODO: Update ondisk isize now that we know the file data + * has been flushed (i.e. the notorious "NULL file" problem). */ STATIC void -linvfs_unwritten_convert( - xfs_buf_t *bp) +xfs_end_bio_delalloc( + void *data) { - vnode_t *vp = XFS_BUF_FSPRIVATE(bp, vnode_t *); - int error; + xfs_ioend_t *ioend = data; + + xfs_destroy_ioend(ioend); +} + +/* + * Buffered IO write completion for regular, written extents. + */ +STATIC void +xfs_end_bio_written( + void *data) +{ + xfs_ioend_t *ioend = data; - BUG_ON(atomic_read(&bp->pb_hold) < 1); - VOP_BMAP(vp, XFS_BUF_OFFSET(bp), XFS_BUF_SIZE(bp), - BMAPI_UNWRITTEN, NULL, NULL, error); - XFS_BUF_SET_FSPRIVATE(bp, NULL); - XFS_BUF_CLR_IODONE_FUNC(bp); - XFS_BUF_UNDATAIO(bp); - iput(LINVFS_GET_IP(vp)); - pagebuf_iodone(bp, 0, 0); + xfs_destroy_ioend(ioend); } /* + * IO write completion for unwritten extents. + * * Issue transactions to convert a buffer range from unwritten - * to written extents (direct IO). + * to written extents. */ STATIC void -linvfs_unwritten_convert_direct( - struct inode *inode, - loff_t offset, - ssize_t size, - void *private) +xfs_end_bio_unwritten( + void *data) +{ + xfs_ioend_t *ioend = data; + bhv_vnode_t *vp = ioend->io_vnode; + xfs_off_t offset = ioend->io_offset; + size_t size = ioend->io_size; + + if (likely(!ioend->io_error)) + bhv_vop_bmap(vp, offset, size, BMAPI_UNWRITTEN, NULL, NULL); + xfs_destroy_ioend(ioend); +} + +/* + * Allocate and initialise an IO completion structure. + * We need to track unwritten extent write completion here initially. + * We'll need to extend this for updating the ondisk inode size later + * (vs. incore size). + */ +STATIC xfs_ioend_t * +xfs_alloc_ioend( + struct inode *inode, + unsigned int type) { - ASSERT(!private || inode == (struct inode *)private); + xfs_ioend_t *ioend; - /* private indicates an unwritten extent lay beneath this IO */ - if (private && size > 0) { - vnode_t *vp = LINVFS_GET_VP(inode); - int error; + ioend = mempool_alloc(xfs_ioend_pool, GFP_NOFS); - VOP_BMAP(vp, offset, size, BMAPI_UNWRITTEN, NULL, NULL, error); - } + /* + * Set the count to 1 initially, which will prevent an I/O + * completion callback from happening before we have started + * all the I/O from calling the completion routine too early. + */ + atomic_set(&ioend->io_remaining, 1); + ioend->io_error = 0; + ioend->io_list = NULL; + ioend->io_type = type; + ioend->io_vnode = vn_from_inode(inode); + ioend->io_buffer_head = NULL; + ioend->io_buffer_tail = NULL; + atomic_inc(&ioend->io_vnode->v_iocount); + ioend->io_offset = 0; + ioend->io_size = 0; + + if (type == IOMAP_UNWRITTEN) + INIT_WORK(&ioend->io_work, xfs_end_bio_unwritten, ioend); + else if (type == IOMAP_DELAY) + INIT_WORK(&ioend->io_work, xfs_end_bio_delalloc, ioend); + else + INIT_WORK(&ioend->io_work, xfs_end_bio_written, ioend); + + return ioend; } STATIC int @@ -173,147 +237,299 @@ xfs_map_blocks( xfs_iomap_t *mapp, int flags) { - vnode_t *vp = LINVFS_GET_VP(inode); + bhv_vnode_t *vp = vn_from_inode(inode); int error, nmaps = 1; - VOP_BMAP(vp, offset, count, flags, mapp, &nmaps, error); + error = bhv_vop_bmap(vp, offset, count, flags, mapp, &nmaps); if (!error && (flags & (BMAPI_WRITE|BMAPI_ALLOCATE))) VMODIFY(vp); return -error; } +STATIC inline int +xfs_iomap_valid( + xfs_iomap_t *iomapp, + loff_t offset) +{ + return offset >= iomapp->iomap_offset && + offset < iomapp->iomap_offset + iomapp->iomap_bsize; +} + /* - * Finds the corresponding mapping in block @map array of the - * given @offset within a @page. + * BIO completion handler for buffered IO. */ -STATIC xfs_iomap_t * -xfs_offset_to_map( - struct page *page, - xfs_iomap_t *iomapp, - unsigned long offset) +STATIC int +xfs_end_bio( + struct bio *bio, + unsigned int bytes_done, + int error) { - loff_t full_offset; /* offset from start of file */ + xfs_ioend_t *ioend = bio->bi_private; + + if (bio->bi_size) + return 1; - ASSERT(offset < PAGE_CACHE_SIZE); + ASSERT(atomic_read(&bio->bi_cnt) >= 1); + ioend->io_error = test_bit(BIO_UPTODATE, &bio->bi_flags) ? 0 : error; - full_offset = page->index; /* NB: using 64bit number */ - full_offset <<= PAGE_CACHE_SHIFT; /* offset from file start */ - full_offset += offset; /* offset from page start */ + /* Toss bio and pass work off to an xfsdatad thread */ + bio->bi_private = NULL; + bio->bi_end_io = NULL; + bio_put(bio); - if (full_offset < iomapp->iomap_offset) - return NULL; - if (iomapp->iomap_offset + (iomapp->iomap_bsize -1) >= full_offset) - return iomapp; - return NULL; + xfs_finish_ioend(ioend); + return 0; } STATIC void -xfs_map_at_offset( - struct page *page, - struct buffer_head *bh, - unsigned long offset, - int block_bits, - xfs_iomap_t *iomapp) +xfs_submit_ioend_bio( + xfs_ioend_t *ioend, + struct bio *bio) { - xfs_daddr_t bn; - loff_t delta; - int sector_shift; + atomic_inc(&ioend->io_remaining); - ASSERT(!(iomapp->iomap_flags & IOMAP_HOLE)); - ASSERT(!(iomapp->iomap_flags & IOMAP_DELAY)); - ASSERT(iomapp->iomap_bn != IOMAP_DADDR_NULL); + bio->bi_private = ioend; + bio->bi_end_io = xfs_end_bio; - delta = page->index; - delta <<= PAGE_CACHE_SHIFT; - delta += offset; - delta -= iomapp->iomap_offset; - delta >>= block_bits; + submit_bio(WRITE, bio); + ASSERT(!bio_flagged(bio, BIO_EOPNOTSUPP)); + bio_put(bio); +} - sector_shift = block_bits - BBSHIFT; - bn = iomapp->iomap_bn >> sector_shift; - bn += delta; - BUG_ON(!bn && !(iomapp->iomap_flags & IOMAP_REALTIME)); - ASSERT((bn << sector_shift) >= iomapp->iomap_bn); +STATIC struct bio * +xfs_alloc_ioend_bio( + struct buffer_head *bh) +{ + struct bio *bio; + int nvecs = bio_get_nr_vecs(bh->b_bdev); - lock_buffer(bh); - bh->b_blocknr = bn; - bh->b_bdev = iomapp->iomap_target->pbr_bdev; - set_buffer_mapped(bh); - clear_buffer_delay(bh); + do { + bio = bio_alloc(GFP_NOIO, nvecs); + nvecs >>= 1; + } while (!bio); + + ASSERT(bio->bi_private == NULL); + bio->bi_sector = bh->b_blocknr * (bh->b_size >> 9); + bio->bi_bdev = bh->b_bdev; + bio_get(bio); + return bio; +} + +STATIC void +xfs_start_buffer_writeback( + struct buffer_head *bh) +{ + ASSERT(buffer_mapped(bh)); + ASSERT(buffer_locked(bh)); + ASSERT(!buffer_delay(bh)); + ASSERT(!buffer_unwritten(bh)); + + mark_buffer_async_write(bh); + set_buffer_uptodate(bh); + clear_buffer_dirty(bh); +} + +STATIC void +xfs_start_page_writeback( + struct page *page, + struct writeback_control *wbc, + int clear_dirty, + int buffers) +{ + ASSERT(PageLocked(page)); + ASSERT(!PageWriteback(page)); + set_page_writeback(page); + if (clear_dirty) + clear_page_dirty(page); + unlock_page(page); + if (!buffers) { + end_page_writeback(page); + wbc->pages_skipped++; /* We didn't write this page */ + } +} + +static inline int bio_add_buffer(struct bio *bio, struct buffer_head *bh) +{ + return bio_add_page(bio, bh->b_page, bh->b_size, bh_offset(bh)); } /* - * Look for a page at index which is unlocked and contains our - * unwritten extent flagged buffers at its head. Returns page - * locked and with an extra reference count, and length of the - * unwritten extent component on this page that we can write, - * in units of filesystem blocks. + * Submit all of the bios for all of the ioends we have saved up, covering the + * initial writepage page and also any probed pages. + * + * Because we may have multiple ioends spanning a page, we need to start + * writeback on all the buffers before we submit them for I/O. If we mark the + * buffers as we got, then we can end up with a page that only has buffers + * marked async write and I/O complete on can occur before we mark the other + * buffers async write. + * + * The end result of this is that we trip a bug in end_page_writeback() because + * we call it twice for the one page as the code in end_buffer_async_write() + * assumes that all buffers on the page are started at the same time. + * + * The fix is two passes across the ioend list - one to start writeback on the + * buffer_heads, and then submit them for I/O on the second pass. */ -STATIC struct page * -xfs_probe_unwritten_page( - struct address_space *mapping, - pgoff_t index, - xfs_iomap_t *iomapp, - xfs_buf_t *pb, - unsigned long max_offset, - unsigned long *fsbs, - unsigned int bbits) +STATIC void +xfs_submit_ioend( + xfs_ioend_t *ioend) { - struct page *page; + xfs_ioend_t *head = ioend; + xfs_ioend_t *next; + struct buffer_head *bh; + struct bio *bio; + sector_t lastblock = 0; - page = find_trylock_page(mapping, index); - if (!page) - return NULL; - if (PageWriteback(page)) - goto out; + /* Pass 1 - start writeback */ + do { + next = ioend->io_list; + for (bh = ioend->io_buffer_head; bh; bh = bh->b_private) { + xfs_start_buffer_writeback(bh); + } + } while ((ioend = next) != NULL); - if (page->mapping && page_has_buffers(page)) { - struct buffer_head *bh, *head; - unsigned long p_offset = 0; + /* Pass 2 - submit I/O */ + ioend = head; + do { + next = ioend->io_list; + bio = NULL; - *fsbs = 0; - bh = head = page_buffers(page); + for (bh = ioend->io_buffer_head; bh; bh = bh->b_private) { + + if (!bio) { + retry: + bio = xfs_alloc_ioend_bio(bh); + } else if (bh->b_blocknr != lastblock + 1) { + xfs_submit_ioend_bio(ioend, bio); + goto retry; + } + + if (bio_add_buffer(bio, bh) != bh->b_size) { + xfs_submit_ioend_bio(ioend, bio); + goto retry; + } + + lastblock = bh->b_blocknr; + } + if (bio) + xfs_submit_ioend_bio(ioend, bio); + xfs_finish_ioend(ioend); + } while ((ioend = next) != NULL); +} + +/* + * Cancel submission of all buffer_heads so far in this endio. + * Toss the endio too. Only ever called for the initial page + * in a writepage request, so only ever one page. + */ +STATIC void +xfs_cancel_ioend( + xfs_ioend_t *ioend) +{ + xfs_ioend_t *next; + struct buffer_head *bh, *next_bh; + + do { + next = ioend->io_list; + bh = ioend->io_buffer_head; do { - if (!buffer_unwritten(bh) || !buffer_uptodate(bh)) - break; - if (!xfs_offset_to_map(page, iomapp, p_offset)) - break; - if (p_offset >= max_offset) - break; - xfs_map_at_offset(page, bh, p_offset, bbits, iomapp); - set_buffer_unwritten_io(bh); - bh->b_private = pb; - p_offset += bh->b_size; - (*fsbs)++; - } while ((bh = bh->b_this_page) != head); + next_bh = bh->b_private; + clear_buffer_async_write(bh); + unlock_buffer(bh); + } while ((bh = next_bh) != NULL); + + vn_iowake(ioend->io_vnode); + mempool_free(ioend, xfs_ioend_pool); + } while ((ioend = next) != NULL); +} - if (p_offset) - return page; +/* + * Test to see if we've been building up a completion structure for + * earlier buffers -- if so, we try to append to this ioend if we + * can, otherwise we finish off any current ioend and start another. + * Return true if we've finished the given ioend. + */ +STATIC void +xfs_add_to_ioend( + struct inode *inode, + struct buffer_head *bh, + xfs_off_t offset, + unsigned int type, + xfs_ioend_t **result, + int need_ioend) +{ + xfs_ioend_t *ioend = *result; + + if (!ioend || need_ioend || type != ioend->io_type) { + xfs_ioend_t *previous = *result; + + ioend = xfs_alloc_ioend(inode, type); + ioend->io_offset = offset; + ioend->io_buffer_head = bh; + ioend->io_buffer_tail = bh; + if (previous) + previous->io_list = ioend; + *result = ioend; + } else { + ioend->io_buffer_tail->b_private = bh; + ioend->io_buffer_tail = bh; } -out: - unlock_page(page); - return NULL; + bh->b_private = NULL; + ioend->io_size += bh->b_size; +} + +STATIC void +xfs_map_buffer( + struct buffer_head *bh, + xfs_iomap_t *mp, + xfs_off_t offset, + uint block_bits) +{ + sector_t bn; + + ASSERT(mp->iomap_bn != IOMAP_DADDR_NULL); + + bn = (mp->iomap_bn >> (block_bits - BBSHIFT)) + + ((offset - mp->iomap_offset) >> block_bits); + + ASSERT(bn || (mp->iomap_flags & IOMAP_REALTIME)); + + bh->b_blocknr = bn; + set_buffer_mapped(bh); +} + +STATIC void +xfs_map_at_offset( + struct buffer_head *bh, + loff_t offset, + int block_bits, + xfs_iomap_t *iomapp) +{ + ASSERT(!(iomapp->iomap_flags & IOMAP_HOLE)); + ASSERT(!(iomapp->iomap_flags & IOMAP_DELAY)); + + lock_buffer(bh); + xfs_map_buffer(bh, iomapp, offset, block_bits); + bh->b_bdev = iomapp->iomap_target->bt_bdev; + set_buffer_mapped(bh); + clear_buffer_delay(bh); + clear_buffer_unwritten(bh); } /* - * Look for a page at index which is unlocked and not mapped - * yet - clustering for mmap write case. + * Look for a page at index that is suitable for clustering. */ STATIC unsigned int -xfs_probe_unmapped_page( - struct address_space *mapping, - pgoff_t index, - unsigned int pg_offset) +xfs_probe_page( + struct page *page, + unsigned int pg_offset, + int mapped) { - struct page *page; int ret = 0; - page = find_trylock_page(mapping, index); - if (!page) - return 0; if (PageWriteback(page)) - goto out; + return 0; if (page->mapping && PageDirty(page)) { if (page_has_buffers(page)) { @@ -321,79 +537,101 @@ xfs_probe_unmapped_page( bh = head = page_buffers(page); do { - if (buffer_mapped(bh) || !buffer_uptodate(bh)) + if (!buffer_uptodate(bh)) + break; + if (mapped != buffer_mapped(bh)) break; ret += bh->b_size; if (ret >= pg_offset) break; } while ((bh = bh->b_this_page) != head); } else - ret = PAGE_CACHE_SIZE; + ret = mapped ? 0 : PAGE_CACHE_SIZE; } -out: - unlock_page(page); return ret; } -STATIC unsigned int -xfs_probe_unmapped_cluster( +STATIC size_t +xfs_probe_cluster( struct inode *inode, struct page *startpage, struct buffer_head *bh, - struct buffer_head *head) + struct buffer_head *head, + int mapped) { + struct pagevec pvec; pgoff_t tindex, tlast, tloff; - unsigned int pg_offset, len, total = 0; - struct address_space *mapping = inode->i_mapping; + size_t total = 0; + int done = 0, i; /* First sum forwards in this page */ do { - if (buffer_mapped(bh)) - break; + if (!buffer_uptodate(bh) || (mapped != buffer_mapped(bh))) + return total; total += bh->b_size; } while ((bh = bh->b_this_page) != head); - /* If we reached the end of the page, sum forwards in - * following pages. - */ - if (bh == head) { - tlast = i_size_read(inode) >> PAGE_CACHE_SHIFT; - /* Prune this back to avoid pathological behavior */ - tloff = min(tlast, startpage->index + 64); - for (tindex = startpage->index + 1; tindex < tloff; tindex++) { - len = xfs_probe_unmapped_page(mapping, tindex, - PAGE_CACHE_SIZE); - if (!len) - return total; + /* if we reached the end of the page, sum forwards in following pages */ + tlast = i_size_read(inode) >> PAGE_CACHE_SHIFT; + tindex = startpage->index + 1; + + /* Prune this back to avoid pathological behavior */ + tloff = min(tlast, startpage->index + 64); + + pagevec_init(&pvec, 0); + while (!done && tindex <= tloff) { + unsigned len = min_t(pgoff_t, PAGEVEC_SIZE, tlast - tindex + 1); + + if (!pagevec_lookup(&pvec, inode->i_mapping, tindex, len)) + break; + + for (i = 0; i < pagevec_count(&pvec); i++) { + struct page *page = pvec.pages[i]; + size_t pg_offset, len = 0; + + if (tindex == tlast) { + pg_offset = + i_size_read(inode) & (PAGE_CACHE_SIZE - 1); + if (!pg_offset) { + done = 1; + break; + } + } else + pg_offset = PAGE_CACHE_SIZE; + + if (page->index == tindex && !TestSetPageLocked(page)) { + len = xfs_probe_page(page, pg_offset, mapped); + unlock_page(page); + } + + if (!len) { + done = 1; + break; + } + total += len; + tindex++; } - if (tindex == tlast && - (pg_offset = i_size_read(inode) & (PAGE_CACHE_SIZE - 1))) { - total += xfs_probe_unmapped_page(mapping, - tindex, pg_offset); - } + + pagevec_release(&pvec); + cond_resched(); } + return total; } /* - * Probe for a given page (index) in the inode and test if it is delayed - * and without unwritten buffers. Returns page locked and with an extra - * reference count. + * Test if a given page is suitable for writing as part of an unwritten + * or delayed allocate extent. */ -STATIC struct page * -xfs_probe_delalloc_page( - struct inode *inode, - pgoff_t index) +STATIC int +xfs_is_delayed_page( + struct page *page, + unsigned int type) { - struct page *page; - - page = find_trylock_page(inode->i_mapping, index); - if (!page) - return NULL; if (PageWriteback(page)) - goto out; + return 0; if (page->mapping && page_has_buffers(page)) { struct buffer_head *bh, *head; @@ -401,274 +639,157 @@ xfs_probe_delalloc_page( bh = head = page_buffers(page); do { - if (buffer_unwritten(bh)) { - acceptable = 0; + if (buffer_unwritten(bh)) + acceptable = (type == IOMAP_UNWRITTEN); + else if (buffer_delay(bh)) + acceptable = (type == IOMAP_DELAY); + else if (buffer_dirty(bh) && buffer_mapped(bh)) + acceptable = (type == 0); + else break; - } else if (buffer_delay(bh)) { - acceptable = 1; - } } while ((bh = bh->b_this_page) != head); if (acceptable) - return page; + return 1; } -out: - unlock_page(page); - return NULL; + return 0; } +/* + * Allocate & map buffers for page given the extent map. Write it out. + * except for the original page of a writepage, this is called on + * delalloc/unwritten pages only, for the original page it is possible + * that the page has no mapping at all. + */ STATIC int -xfs_map_unwritten( +xfs_convert_page( struct inode *inode, - struct page *start_page, - struct buffer_head *head, - struct buffer_head *curr, - unsigned long p_offset, - int block_bits, - xfs_iomap_t *iomapp, + struct page *page, + loff_t tindex, + xfs_iomap_t *mp, + xfs_ioend_t **ioendp, struct writeback_control *wbc, int startio, int all_bh) { - struct buffer_head *bh = curr; - xfs_iomap_t *tmp; - xfs_buf_t *pb; - loff_t offset, size; - unsigned long nblocks = 0; - - offset = start_page->index; - offset <<= PAGE_CACHE_SHIFT; - offset += p_offset; - - /* get an "empty" pagebuf to manage IO completion - * Proper values will be set before returning */ - pb = pagebuf_lookup(iomapp->iomap_target, 0, 0, 0); - if (!pb) - return -EAGAIN; - - /* Take a reference to the inode to prevent it from - * being reclaimed while we have outstanding unwritten - * extent IO on it. - */ - if ((igrab(inode)) != inode) { - pagebuf_free(pb); - return -EAGAIN; - } + struct buffer_head *bh, *head; + xfs_off_t end_offset; + unsigned long p_offset; + unsigned int type; + int bbits = inode->i_blkbits; + int len, page_dirty; + int count = 0, done = 0, uptodate = 1; + xfs_off_t offset = page_offset(page); - /* Set the count to 1 initially, this will stop an I/O - * completion callout which happens before we have started - * all the I/O from calling pagebuf_iodone too early. - */ - atomic_set(&pb->pb_io_remaining, 1); + if (page->index != tindex) + goto fail; + if (TestSetPageLocked(page)) + goto fail; + if (PageWriteback(page)) + goto fail_unlock_page; + if (page->mapping != inode->i_mapping) + goto fail_unlock_page; + if (!xfs_is_delayed_page(page, (*ioendp)->io_type)) + goto fail_unlock_page; - /* First map forwards in the page consecutive buffers - * covering this unwritten extent + /* + * page_dirty is initially a count of buffers on the page before + * EOF and is decremented as we move each into a cleanable state. + * + * Derivation: + * + * End offset is the highest offset that this page should represent. + * If we are on the last page, (end_offset & (PAGE_CACHE_SIZE - 1)) + * will evaluate non-zero and be less than PAGE_CACHE_SIZE and + * hence give us the correct page_dirty count. On any other page, + * it will be zero and in that case we need page_dirty to be the + * count of buffers on the page. */ - do { - if (!buffer_unwritten(bh)) - break; - tmp = xfs_offset_to_map(start_page, iomapp, p_offset); - if (!tmp) - break; - xfs_map_at_offset(start_page, bh, p_offset, block_bits, iomapp); - set_buffer_unwritten_io(bh); - bh->b_private = pb; - p_offset += bh->b_size; - nblocks++; - } while ((bh = bh->b_this_page) != head); - - atomic_add(nblocks, &pb->pb_io_remaining); + end_offset = min_t(unsigned long long, + (xfs_off_t)(page->index + 1) << PAGE_CACHE_SHIFT, + i_size_read(inode)); - /* If we reached the end of the page, map forwards in any - * following pages which are also covered by this extent. - */ - if (bh == head) { - struct address_space *mapping = inode->i_mapping; - pgoff_t tindex, tloff, tlast; - unsigned long bs; - unsigned int pg_offset, bbits = inode->i_blkbits; - struct page *page; - - tlast = i_size_read(inode) >> PAGE_CACHE_SHIFT; - tloff = (iomapp->iomap_offset + iomapp->iomap_bsize) >> PAGE_CACHE_SHIFT; - tloff = min(tlast, tloff); - for (tindex = start_page->index + 1; tindex < tloff; tindex++) { - page = xfs_probe_unwritten_page(mapping, - tindex, iomapp, pb, - PAGE_CACHE_SIZE, &bs, bbits); - if (!page) - break; - nblocks += bs; - atomic_add(bs, &pb->pb_io_remaining); - xfs_convert_page(inode, page, iomapp, wbc, pb, - startio, all_bh); - /* stop if converting the next page might add - * enough blocks that the corresponding byte - * count won't fit in our ulong page buf length */ - if (nblocks >= ((ULONG_MAX - PAGE_SIZE) >> block_bits)) - goto enough; - } + len = 1 << inode->i_blkbits; + p_offset = min_t(unsigned long, end_offset & (PAGE_CACHE_SIZE - 1), + PAGE_CACHE_SIZE); + p_offset = p_offset ? roundup(p_offset, len) : PAGE_CACHE_SIZE; + page_dirty = p_offset / len; - if (tindex == tlast && - (pg_offset = (i_size_read(inode) & (PAGE_CACHE_SIZE - 1)))) { - page = xfs_probe_unwritten_page(mapping, - tindex, iomapp, pb, - pg_offset, &bs, bbits); - if (page) { - nblocks += bs; - atomic_add(bs, &pb->pb_io_remaining); - xfs_convert_page(inode, page, iomapp, wbc, pb, - startio, all_bh); - if (nblocks >= ((ULONG_MAX - PAGE_SIZE) >> block_bits)) - goto enough; - } + bh = head = page_buffers(page); + do { + if (offset >= end_offset) + break; + if (!buffer_uptodate(bh)) + uptodate = 0; + if (!(PageUptodate(page) || buffer_uptodate(bh))) { + done = 1; + continue; } - } - -enough: - size = nblocks; /* NB: using 64bit number here */ - size <<= block_bits; /* convert fsb's to byte range */ - - XFS_BUF_DATAIO(pb); - XFS_BUF_ASYNC(pb); - XFS_BUF_SET_SIZE(pb, size); - XFS_BUF_SET_COUNT(pb, size); - XFS_BUF_SET_OFFSET(pb, offset); - XFS_BUF_SET_FSPRIVATE(pb, LINVFS_GET_VP(inode)); - XFS_BUF_SET_IODONE_FUNC(pb, linvfs_unwritten_convert); - - if (atomic_dec_and_test(&pb->pb_io_remaining) == 1) { - pagebuf_iodone(pb, 1, 1); - } - - return 0; -} -STATIC void -xfs_submit_page( - struct page *page, - struct writeback_control *wbc, - struct buffer_head *bh_arr[], - int bh_count, - int probed_page, - int clear_dirty) -{ - struct buffer_head *bh; - int i; - - BUG_ON(PageWriteback(page)); - if (bh_count) - set_page_writeback(page); - if (clear_dirty) - clear_page_dirty(page); - unlock_page(page); - - if (bh_count) { - for (i = 0; i < bh_count; i++) { - bh = bh_arr[i]; - mark_buffer_async_write(bh); + if (buffer_unwritten(bh) || buffer_delay(bh)) { if (buffer_unwritten(bh)) - set_buffer_unwritten_io(bh); - set_buffer_uptodate(bh); - clear_buffer_dirty(bh); - } + type = IOMAP_UNWRITTEN; + else + type = IOMAP_DELAY; - for (i = 0; i < bh_count; i++) - submit_bh(WRITE, bh_arr[i]); - - if (probed_page && clear_dirty) - wbc->nr_to_write--; /* Wrote an "extra" page */ - } -} - -/* - * Allocate & map buffers for page given the extent map. Write it out. - * except for the original page of a writepage, this is called on - * delalloc/unwritten pages only, for the original page it is possible - * that the page has no mapping at all. - */ -STATIC void -xfs_convert_page( - struct inode *inode, - struct page *page, - xfs_iomap_t *iomapp, - struct writeback_control *wbc, - void *private, - int startio, - int all_bh) -{ - struct buffer_head *bh_arr[MAX_BUF_PER_PAGE], *bh, *head; - xfs_iomap_t *mp = iomapp, *tmp; - unsigned long offset, end_offset; - int index = 0; - int bbits = inode->i_blkbits; - int len, page_dirty; - - end_offset = (i_size_read(inode) & (PAGE_CACHE_SIZE - 1)); + if (!xfs_iomap_valid(mp, offset)) { + done = 1; + continue; + } - /* - * page_dirty is initially a count of buffers on the page before - * EOF and is decrememted as we move each into a cleanable state. - */ - len = 1 << inode->i_blkbits; - end_offset = max(end_offset, PAGE_CACHE_SIZE); - end_offset = roundup(end_offset, len); - page_dirty = end_offset / len; + ASSERT(!(mp->iomap_flags & IOMAP_HOLE)); + ASSERT(!(mp->iomap_flags & IOMAP_DELAY)); - offset = 0; - bh = head = page_buffers(page); - do { - if (offset >= end_offset) - break; - if (!(PageUptodate(page) || buffer_uptodate(bh))) - continue; - if (buffer_mapped(bh) && all_bh && - !(buffer_unwritten(bh) || buffer_delay(bh))) { + xfs_map_at_offset(bh, offset, bbits, mp); if (startio) { + xfs_add_to_ioend(inode, bh, offset, + type, ioendp, done); + } else { + set_buffer_dirty(bh); + unlock_buffer(bh); + mark_buffer_dirty(bh); + } + page_dirty--; + count++; + } else { + type = 0; + if (buffer_mapped(bh) && all_bh && startio) { lock_buffer(bh); - bh_arr[index++] = bh; + xfs_add_to_ioend(inode, bh, offset, + type, ioendp, done); + count++; page_dirty--; + } else { + done = 1; } - continue; } - tmp = xfs_offset_to_map(page, mp, offset); - if (!tmp) - continue; - ASSERT(!(tmp->iomap_flags & IOMAP_HOLE)); - ASSERT(!(tmp->iomap_flags & IOMAP_DELAY)); + } while (offset += len, (bh = bh->b_this_page) != head); - /* If this is a new unwritten extent buffer (i.e. one - * that we haven't passed in private data for, we must - * now map this buffer too. - */ - if (buffer_unwritten(bh) && !bh->b_end_io) { - ASSERT(tmp->iomap_flags & IOMAP_UNWRITTEN); - xfs_map_unwritten(inode, page, head, bh, offset, - bbits, tmp, wbc, startio, all_bh); - } else if (! (buffer_unwritten(bh) && buffer_locked(bh))) { - xfs_map_at_offset(page, bh, offset, bbits, tmp); - if (buffer_unwritten(bh)) { - set_buffer_unwritten_io(bh); - bh->b_private = private; - ASSERT(private); + if (uptodate && bh == head) + SetPageUptodate(page); + + if (startio) { + if (count) { + struct backing_dev_info *bdi; + + bdi = inode->i_mapping->backing_dev_info; + wbc->nr_to_write--; + if (bdi_write_congested(bdi)) { + wbc->encountered_congestion = 1; + done = 1; + } else if (wbc->nr_to_write <= 0) { + done = 1; } } - if (startio) { - bh_arr[index++] = bh; - } else { - set_buffer_dirty(bh); - unlock_buffer(bh); - mark_buffer_dirty(bh); - } - page_dirty--; - } while (offset += len, (bh = bh->b_this_page) != head); - - if (startio && index) { - xfs_submit_page(page, wbc, bh_arr, index, 1, !page_dirty); - } else { - unlock_page(page); + xfs_start_page_writeback(page, wbc, !page_dirty, count); } + + return done; + fail_unlock_page: + unlock_page(page); + fail: + return 1; } /* @@ -680,19 +801,31 @@ xfs_cluster_write( struct inode *inode, pgoff_t tindex, xfs_iomap_t *iomapp, + xfs_ioend_t **ioendp, struct writeback_control *wbc, int startio, int all_bh, pgoff_t tlast) { - struct page *page; + struct pagevec pvec; + int done = 0, i; - for (; tindex <= tlast; tindex++) { - page = xfs_probe_delalloc_page(inode, tindex); - if (!page) + pagevec_init(&pvec, 0); + while (!done && tindex <= tlast) { + unsigned len = min_t(pgoff_t, PAGEVEC_SIZE, tlast - tindex + 1); + + if (!pagevec_lookup(&pvec, inode->i_mapping, tindex, len)) break; - xfs_convert_page(inode, page, iomapp, wbc, NULL, - startio, all_bh); + + for (i = 0; i < pagevec_count(&pvec); i++) { + done = xfs_convert_page(inode, pvec.pages[i], tindex++, + iomapp, ioendp, wbc, startio, all_bh); + if (done) + break; + } + + pagevec_release(&pvec); + cond_resched(); } } @@ -705,7 +838,7 @@ xfs_cluster_write( * page if possible. * The bh->b_state's cannot know if any of the blocks or which block for * that matter are dirty due to mmap writes, and therefore bh uptodate is - * only vaild if the page itself isn't completely uptodate. Some layers + * only valid if the page itself isn't completely uptodate. Some layers * may clear the page dirty flag prior to calling write page, under the * assumption the entire page will be written out; by not writing out the * whole page the page can be reused before all valid dirty data is @@ -723,18 +856,24 @@ xfs_page_state_convert( int startio, int unmapped) /* also implies page uptodate */ { - struct buffer_head *bh_arr[MAX_BUF_PER_PAGE], *bh, *head; - xfs_iomap_t *iomp, iomap; + struct buffer_head *bh, *head; + xfs_iomap_t iomap; + xfs_ioend_t *ioend = NULL, *iohead = NULL; loff_t offset; unsigned long p_offset = 0; + unsigned int type; __uint64_t end_offset; pgoff_t end_index, last_index, tlast; - int len, err, i, cnt = 0, uptodate = 1; - int flags; - int page_dirty; + ssize_t size, len; + int flags, err, iomap_valid = 0, uptodate = 1; + int page_dirty, count = 0; + int trylock = 0; + int all_bh = unmapped; - /* wait for other IO threads? */ - flags = (startio && wbc->sync_mode != WB_SYNC_NONE) ? 0 : BMAPI_TRYLOCK; + if (startio) { + if (wbc->sync_mode == WB_SYNC_NONE && wbc->nonblocking) + trylock |= BMAPI_TRYLOCK; + } /* Is this page beyond the end of the file? */ offset = i_size_read(inode); @@ -743,166 +882,177 @@ xfs_page_state_convert( if (page->index >= end_index) { if ((page->index >= end_index + 1) || !(i_size_read(inode) & (PAGE_CACHE_SIZE - 1))) { - err = -EIO; - goto error; + if (startio) + unlock_page(page); + return 0; } } - end_offset = min_t(unsigned long long, - (loff_t)(page->index + 1) << PAGE_CACHE_SHIFT, offset); - offset = (loff_t)page->index << PAGE_CACHE_SHIFT; - /* * page_dirty is initially a count of buffers on the page before - * EOF and is decrememted as we move each into a cleanable state. - */ + * EOF and is decremented as we move each into a cleanable state. + * + * Derivation: + * + * End offset is the highest offset that this page should represent. + * If we are on the last page, (end_offset & (PAGE_CACHE_SIZE - 1)) + * will evaluate non-zero and be less than PAGE_CACHE_SIZE and + * hence give us the correct page_dirty count. On any other page, + * it will be zero and in that case we need page_dirty to be the + * count of buffers on the page. + */ + end_offset = min_t(unsigned long long, + (xfs_off_t)(page->index + 1) << PAGE_CACHE_SHIFT, offset); len = 1 << inode->i_blkbits; - p_offset = max(p_offset, PAGE_CACHE_SIZE); - p_offset = roundup(p_offset, len); + p_offset = min_t(unsigned long, end_offset & (PAGE_CACHE_SIZE - 1), + PAGE_CACHE_SIZE); + p_offset = p_offset ? roundup(p_offset, len) : PAGE_CACHE_SIZE; page_dirty = p_offset / len; - iomp = NULL; - p_offset = 0; bh = head = page_buffers(page); + offset = page_offset(page); + flags = -1; + type = 0; + + /* TODO: cleanup count and page_dirty */ do { if (offset >= end_offset) break; if (!buffer_uptodate(bh)) uptodate = 0; - if (!(PageUptodate(page) || buffer_uptodate(bh)) && !startio) + if (!(PageUptodate(page) || buffer_uptodate(bh)) && !startio) { + /* + * the iomap is actually still valid, but the ioend + * isn't. shouldn't happen too often. + */ + iomap_valid = 0; continue; - - if (iomp) { - iomp = xfs_offset_to_map(page, &iomap, p_offset); } + if (iomap_valid) + iomap_valid = xfs_iomap_valid(&iomap, offset); + /* * First case, map an unwritten extent and prepare for * extent state conversion transaction on completion. - */ - if (buffer_unwritten(bh)) { - if (!startio) - continue; - if (!iomp) { - err = xfs_map_blocks(inode, offset, len, &iomap, - BMAPI_READ|BMAPI_IGNSTATE); - if (err) { - goto error; - } - iomp = xfs_offset_to_map(page, &iomap, - p_offset); + * + * Second case, allocate space for a delalloc buffer. + * We can return EAGAIN here in the release page case. + * + * Third case, an unmapped buffer was found, and we are + * in a path where we need to write the whole page out. + */ + if (buffer_unwritten(bh) || buffer_delay(bh) || + ((buffer_uptodate(bh) || PageUptodate(page)) && + !buffer_mapped(bh) && (unmapped || startio))) { + /* + * Make sure we don't use a read-only iomap + */ + if (flags == BMAPI_READ) + iomap_valid = 0; + + if (buffer_unwritten(bh)) { + type = IOMAP_UNWRITTEN; + flags = BMAPI_WRITE | BMAPI_IGNSTATE; + } else if (buffer_delay(bh)) { + type = IOMAP_DELAY; + flags = BMAPI_ALLOCATE | trylock; + } else { + type = IOMAP_NEW; + flags = BMAPI_WRITE | BMAPI_MMAP; } - if (iomp) { - if (!bh->b_end_io) { - err = xfs_map_unwritten(inode, page, - head, bh, p_offset, - inode->i_blkbits, iomp, - wbc, startio, unmapped); - if (err) { - goto error; - } + + if (!iomap_valid) { + if (type == IOMAP_NEW) { + size = xfs_probe_cluster(inode, + page, bh, head, 0); } else { - set_bit(BH_Lock, &bh->b_state); + size = len; } - BUG_ON(!buffer_locked(bh)); - bh_arr[cnt++] = bh; - page_dirty--; - } - /* - * Second case, allocate space for a delalloc buffer. - * We can return EAGAIN here in the release page case. - */ - } else if (buffer_delay(bh)) { - if (!iomp) { - err = xfs_map_blocks(inode, offset, len, &iomap, - BMAPI_ALLOCATE | flags); - if (err) { + + err = xfs_map_blocks(inode, offset, size, + &iomap, flags); + if (err) goto error; - } - iomp = xfs_offset_to_map(page, &iomap, - p_offset); + iomap_valid = xfs_iomap_valid(&iomap, offset); } - if (iomp) { - xfs_map_at_offset(page, bh, p_offset, - inode->i_blkbits, iomp); + if (iomap_valid) { + xfs_map_at_offset(bh, offset, + inode->i_blkbits, &iomap); if (startio) { - bh_arr[cnt++] = bh; + xfs_add_to_ioend(inode, bh, offset, + type, &ioend, + !iomap_valid); } else { set_buffer_dirty(bh); unlock_buffer(bh); mark_buffer_dirty(bh); } page_dirty--; + count++; + } + } else if (buffer_uptodate(bh) && startio) { + /* + * we got here because the buffer is already mapped. + * That means it must already have extents allocated + * underneath it. Map the extent by reading it. + */ + if (!iomap_valid || type != 0) { + flags = BMAPI_READ; + size = xfs_probe_cluster(inode, page, bh, + head, 1); + err = xfs_map_blocks(inode, offset, size, + &iomap, flags); + if (err) + goto error; + iomap_valid = xfs_iomap_valid(&iomap, offset); } - } else if ((buffer_uptodate(bh) || PageUptodate(page)) && - (unmapped || startio)) { - if (!buffer_mapped(bh)) { - int size; - - /* - * Getting here implies an unmapped buffer - * was found, and we are in a path where we - * need to write the whole page out. - */ - if (!iomp) { - size = xfs_probe_unmapped_cluster( - inode, page, bh, head); - err = xfs_map_blocks(inode, offset, - size, &iomap, - BMAPI_WRITE|BMAPI_MMAP); - if (err) { - goto error; - } - iomp = xfs_offset_to_map(page, &iomap, - p_offset); - } - if (iomp) { - xfs_map_at_offset(page, - bh, p_offset, - inode->i_blkbits, iomp); - if (startio) { - bh_arr[cnt++] = bh; - } else { - set_buffer_dirty(bh); - unlock_buffer(bh); - mark_buffer_dirty(bh); - } - page_dirty--; - } - } else if (startio) { - if (buffer_uptodate(bh) && - !test_and_set_bit(BH_Lock, &bh->b_state)) { - bh_arr[cnt++] = bh; - page_dirty--; - } + type = 0; + if (!test_and_set_bit(BH_Lock, &bh->b_state)) { + ASSERT(buffer_mapped(bh)); + if (iomap_valid) + all_bh = 1; + xfs_add_to_ioend(inode, bh, offset, type, + &ioend, !iomap_valid); + page_dirty--; + count++; + } else { + iomap_valid = 0; } + } else if ((buffer_uptodate(bh) || PageUptodate(page)) && + (unmapped || startio)) { + iomap_valid = 0; } - } while (offset += len, p_offset += len, - ((bh = bh->b_this_page) != head)); + + if (!iohead) + iohead = ioend; + + } while (offset += len, ((bh = bh->b_this_page) != head)); if (uptodate && bh == head) SetPageUptodate(page); - if (startio) { - xfs_submit_page(page, wbc, bh_arr, cnt, 0, !page_dirty); - } + if (startio) + xfs_start_page_writeback(page, wbc, 1, count); - if (iomp) { - offset = (iomp->iomap_offset + iomp->iomap_bsize - 1) >> + if (ioend && iomap_valid) { + offset = (iomap.iomap_offset + iomap.iomap_bsize - 1) >> PAGE_CACHE_SHIFT; tlast = min_t(pgoff_t, offset, last_index); - xfs_cluster_write(inode, page->index + 1, iomp, wbc, - startio, unmapped, tlast); + xfs_cluster_write(inode, page->index + 1, &iomap, &ioend, + wbc, startio, all_bh, tlast); } + if (iohead) + xfs_submit_ioend(iohead); + return page_dirty; error: - for (i = 0; i < cnt; i++) { - unlock_buffer(bh_arr[i]); - } + if (iohead) + xfs_cancel_ioend(iohead); /* * If it's delalloc and we have nowhere to put it, @@ -910,210 +1060,13 @@ error: * us to try again. */ if (err != -EAGAIN) { - if (!unmapped) { + if (!unmapped) block_invalidatepage(page, 0); - } ClearPageUptodate(page); } return err; } -STATIC int -__linvfs_get_block( - struct inode *inode, - sector_t iblock, - unsigned long blocks, - struct buffer_head *bh_result, - int create, - int direct, - bmapi_flags_t flags) -{ - vnode_t *vp = LINVFS_GET_VP(inode); - xfs_iomap_t iomap; - int retpbbm = 1; - int error; - ssize_t size; - loff_t offset = (loff_t)iblock << inode->i_blkbits; - - if (blocks) - size = blocks << inode->i_blkbits; - else - size = 1 << inode->i_blkbits; - - VOP_BMAP(vp, offset, size, - create ? flags : BMAPI_READ, &iomap, &retpbbm, error); - if (error) - return -error; - - if (retpbbm == 0) - return 0; - - if (iomap.iomap_bn != IOMAP_DADDR_NULL) { - xfs_daddr_t bn; - loff_t delta; - - /* For unwritten extents do not report a disk address on - * the read case (treat as if we're reading into a hole). - */ - if (create || !(iomap.iomap_flags & IOMAP_UNWRITTEN)) { - delta = offset - iomap.iomap_offset; - delta >>= inode->i_blkbits; - - bn = iomap.iomap_bn >> (inode->i_blkbits - BBSHIFT); - bn += delta; - BUG_ON(!bn && !(iomap.iomap_flags & IOMAP_REALTIME)); - bh_result->b_blocknr = bn; - set_buffer_mapped(bh_result); - } - if (create && (iomap.iomap_flags & IOMAP_UNWRITTEN)) { - if (direct) - bh_result->b_private = inode; - set_buffer_unwritten(bh_result); - set_buffer_delay(bh_result); - } - } - - /* If this is a realtime file, data might be on a new device */ - bh_result->b_bdev = iomap.iomap_target->pbr_bdev; - - /* If we previously allocated a block out beyond eof and - * we are now coming back to use it then we will need to - * flag it as new even if it has a disk address. - */ - if (create && - ((!buffer_mapped(bh_result) && !buffer_uptodate(bh_result)) || - (offset >= i_size_read(inode)) || (iomap.iomap_flags & IOMAP_NEW))) { - set_buffer_new(bh_result); - } - - if (iomap.iomap_flags & IOMAP_DELAY) { - BUG_ON(direct); - if (create) { - set_buffer_uptodate(bh_result); - set_buffer_mapped(bh_result); - set_buffer_delay(bh_result); - } - } - - if (blocks) { - bh_result->b_size = (ssize_t)min( - (loff_t)(iomap.iomap_bsize - iomap.iomap_delta), - (loff_t)(blocks << inode->i_blkbits)); - } - - return 0; -} - -int -linvfs_get_block( - struct inode *inode, - sector_t iblock, - struct buffer_head *bh_result, - int create) -{ - return __linvfs_get_block(inode, iblock, 0, bh_result, - create, 0, BMAPI_WRITE); -} - -STATIC int -linvfs_get_blocks_direct( - struct inode *inode, - sector_t iblock, - unsigned long max_blocks, - struct buffer_head *bh_result, - int create) -{ - return __linvfs_get_block(inode, iblock, max_blocks, bh_result, - create, 1, BMAPI_WRITE|BMAPI_DIRECT); -} - -STATIC ssize_t -linvfs_direct_IO( - int rw, - struct kiocb *iocb, - const struct iovec *iov, - loff_t offset, - unsigned long nr_segs) -{ - struct file *file = iocb->ki_filp; - struct inode *inode = file->f_mapping->host; - vnode_t *vp = LINVFS_GET_VP(inode); - xfs_iomap_t iomap; - int maps = 1; - int error; - - VOP_BMAP(vp, offset, 0, BMAPI_DEVICE, &iomap, &maps, error); - if (error) - return -error; - - return blockdev_direct_IO_own_locking(rw, iocb, inode, - iomap.iomap_target->pbr_bdev, - iov, offset, nr_segs, - linvfs_get_blocks_direct, - linvfs_unwritten_convert_direct); -} - - -STATIC sector_t -linvfs_bmap( - struct address_space *mapping, - sector_t block) -{ - struct inode *inode = (struct inode *)mapping->host; - vnode_t *vp = LINVFS_GET_VP(inode); - int error; - - vn_trace_entry(vp, "linvfs_bmap", (inst_t *)__return_address); - - VOP_RWLOCK(vp, VRWLOCK_READ); - VOP_FLUSH_PAGES(vp, (xfs_off_t)0, -1, 0, FI_REMAPF, error); - VOP_RWUNLOCK(vp, VRWLOCK_READ); - return generic_block_bmap(mapping, block, linvfs_get_block); -} - -STATIC int -linvfs_readpage( - struct file *unused, - struct page *page) -{ - return mpage_readpage(page, linvfs_get_block); -} - -STATIC int -linvfs_readpages( - struct file *unused, - struct address_space *mapping, - struct list_head *pages, - unsigned nr_pages) -{ - return mpage_readpages(mapping, pages, nr_pages, linvfs_get_block); -} - -STATIC void -xfs_count_page_state( - struct page *page, - int *delalloc, - int *unmapped, - int *unwritten) -{ - struct buffer_head *bh, *head; - - *delalloc = *unmapped = *unwritten = 0; - - bh = head = page_buffers(page); - do { - if (buffer_uptodate(bh) && !buffer_mapped(bh)) - (*unmapped) = 1; - else if (buffer_unwritten(bh) && !buffer_delay(bh)) - clear_buffer_unwritten(bh); - else if (buffer_unwritten(bh)) - (*unwritten) = 1; - else if (buffer_delay(bh)) - (*delalloc) = 1; - } while ((bh = bh->b_this_page) != head); -} - - /* * writepage: Called from one of two places: * @@ -1135,7 +1088,7 @@ xfs_count_page_state( */ STATIC int -linvfs_writepage( +xfs_vm_writepage( struct page *page, struct writeback_control *wbc) { @@ -1170,7 +1123,7 @@ linvfs_writepage( * then mark the page dirty again and leave the page * as is. */ - if (PFLAGS_TEST_FSTRANS() && need_trans) + if (current_test_flags(PF_FSTRANS) && need_trans) goto out_fail; /* @@ -1201,6 +1154,18 @@ out_unlock: return error; } +STATIC int +xfs_vm_writepages( + struct address_space *mapping, + struct writeback_control *wbc) +{ + struct bhv_vnode *vp = vn_from_inode(mapping->host); + + if (VN_TRUNC(vp)) + VUNTRUNCATE(vp); + return generic_writepages(mapping, wbc); +} + /* * Called to move a page into cleanable state - and from there * to be released. Possibly the page is already clean. We always @@ -1221,9 +1186,9 @@ out_unlock: * free them and we should come back later via writepage. */ STATIC int -linvfs_release_page( +xfs_vm_releasepage( struct page *page, - int gfp_mask) + gfp_t gfp_mask) { struct inode *inode = page->mapping->host; int dirty, delalloc, unmapped, unwritten; @@ -1234,6 +1199,9 @@ linvfs_release_page( xfs_page_trace(XFS_RELEASEPAGE_ENTER, inode, page, gfp_mask); + if (!page_has_buffers(page)) + return 0; + xfs_count_page_state(page, &delalloc, &unmapped, &unwritten); if (!delalloc && !unwritten) goto free_buffers; @@ -1244,7 +1212,7 @@ linvfs_release_page( /* If we are already inside a transaction or the thread cannot * do I/O, we cannot release this page. */ - if (PFLAGS_TEST_FSTRANS()) + if (current_test_flags(PF_FSTRANS)) return 0; /* @@ -1263,23 +1231,248 @@ free_buffers: } STATIC int -linvfs_prepare_write( +__xfs_get_blocks( + struct inode *inode, + sector_t iblock, + struct buffer_head *bh_result, + int create, + int direct, + bmapi_flags_t flags) +{ + bhv_vnode_t *vp = vn_from_inode(inode); + xfs_iomap_t iomap; + xfs_off_t offset; + ssize_t size; + int niomap = 1; + int error; + + offset = (xfs_off_t)iblock << inode->i_blkbits; + ASSERT(bh_result->b_size >= (1 << inode->i_blkbits)); + size = bh_result->b_size; + error = bhv_vop_bmap(vp, offset, size, + create ? flags : BMAPI_READ, &iomap, &niomap); + if (error) + return -error; + if (niomap == 0) + return 0; + + if (iomap.iomap_bn != IOMAP_DADDR_NULL) { + /* + * For unwritten extents do not report a disk address on + * the read case (treat as if we're reading into a hole). + */ + if (create || !(iomap.iomap_flags & IOMAP_UNWRITTEN)) { + xfs_map_buffer(bh_result, &iomap, offset, + inode->i_blkbits); + } + if (create && (iomap.iomap_flags & IOMAP_UNWRITTEN)) { + if (direct) + bh_result->b_private = inode; + set_buffer_unwritten(bh_result); + set_buffer_delay(bh_result); + } + } + + /* + * If this is a realtime file, data may be on a different device. + * to that pointed to from the buffer_head b_bdev currently. + */ + bh_result->b_bdev = iomap.iomap_target->bt_bdev; + + /* + * If we previously allocated a block out beyond eof and we are + * now coming back to use it then we will need to flag it as new + * even if it has a disk address. + */ + if (create && + ((!buffer_mapped(bh_result) && !buffer_uptodate(bh_result)) || + (offset >= i_size_read(inode)) || (iomap.iomap_flags & IOMAP_NEW))) + set_buffer_new(bh_result); + + if (iomap.iomap_flags & IOMAP_DELAY) { + BUG_ON(direct); + if (create) { + set_buffer_uptodate(bh_result); + set_buffer_mapped(bh_result); + set_buffer_delay(bh_result); + } + } + + if (direct || size > (1 << inode->i_blkbits)) { + ASSERT(iomap.iomap_bsize - iomap.iomap_delta > 0); + offset = min_t(xfs_off_t, + iomap.iomap_bsize - iomap.iomap_delta, size); + bh_result->b_size = (ssize_t)min_t(xfs_off_t, LONG_MAX, offset); + } + + return 0; +} + +int +xfs_get_blocks( + struct inode *inode, + sector_t iblock, + struct buffer_head *bh_result, + int create) +{ + return __xfs_get_blocks(inode, iblock, + bh_result, create, 0, BMAPI_WRITE); +} + +STATIC int +xfs_get_blocks_direct( + struct inode *inode, + sector_t iblock, + struct buffer_head *bh_result, + int create) +{ + return __xfs_get_blocks(inode, iblock, + bh_result, create, 1, BMAPI_WRITE|BMAPI_DIRECT); +} + +STATIC void +xfs_end_io_direct( + struct kiocb *iocb, + loff_t offset, + ssize_t size, + void *private) +{ + xfs_ioend_t *ioend = iocb->private; + + /* + * Non-NULL private data means we need to issue a transaction to + * convert a range from unwritten to written extents. This needs + * to happen from process context but aio+dio I/O completion + * happens from irq context so we need to defer it to a workqueue. + * This is not necessary for synchronous direct I/O, but we do + * it anyway to keep the code uniform and simpler. + * + * The core direct I/O code might be changed to always call the + * completion handler in the future, in which case all this can + * go away. + */ + if (private && size > 0) { + ioend->io_offset = offset; + ioend->io_size = size; + xfs_finish_ioend(ioend); + } else { + ASSERT(size >= 0); + xfs_destroy_ioend(ioend); + } + + /* + * blockdev_direct_IO can return an error even after the I/O + * completion handler was called. Thus we need to protect + * against double-freeing. + */ + iocb->private = NULL; +} + +STATIC ssize_t +xfs_vm_direct_IO( + int rw, + struct kiocb *iocb, + const struct iovec *iov, + loff_t offset, + unsigned long nr_segs) +{ + struct file *file = iocb->ki_filp; + struct inode *inode = file->f_mapping->host; + bhv_vnode_t *vp = vn_from_inode(inode); + xfs_iomap_t iomap; + int maps = 1; + int error; + ssize_t ret; + + error = bhv_vop_bmap(vp, offset, 0, BMAPI_DEVICE, &iomap, &maps); + if (error) + return -error; + + iocb->private = xfs_alloc_ioend(inode, IOMAP_UNWRITTEN); + + if (rw == WRITE) { + ret = blockdev_direct_IO_own_locking(rw, iocb, inode, + iomap.iomap_target->bt_bdev, + iov, offset, nr_segs, + xfs_get_blocks_direct, + xfs_end_io_direct); + } else { + ret = blockdev_direct_IO_no_locking(rw, iocb, inode, + iomap.iomap_target->bt_bdev, + iov, offset, nr_segs, + xfs_get_blocks_direct, + xfs_end_io_direct); + } + + if (unlikely(ret <= 0 && iocb->private)) + xfs_destroy_ioend(iocb->private); + return ret; +} + +STATIC int +xfs_vm_prepare_write( struct file *file, struct page *page, unsigned int from, unsigned int to) { - return block_prepare_write(page, from, to, linvfs_get_block); + return block_prepare_write(page, from, to, xfs_get_blocks); +} + +STATIC sector_t +xfs_vm_bmap( + struct address_space *mapping, + sector_t block) +{ + struct inode *inode = (struct inode *)mapping->host; + bhv_vnode_t *vp = vn_from_inode(inode); + + vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address); + bhv_vop_rwlock(vp, VRWLOCK_READ); + bhv_vop_flush_pages(vp, (xfs_off_t)0, -1, 0, FI_REMAPF); + bhv_vop_rwunlock(vp, VRWLOCK_READ); + return generic_block_bmap(mapping, block, xfs_get_blocks); +} + +STATIC int +xfs_vm_readpage( + struct file *unused, + struct page *page) +{ + return mpage_readpage(page, xfs_get_blocks); +} + +STATIC int +xfs_vm_readpages( + struct file *unused, + struct address_space *mapping, + struct list_head *pages, + unsigned nr_pages) +{ + return mpage_readpages(mapping, pages, nr_pages, xfs_get_blocks); +} + +STATIC void +xfs_vm_invalidatepage( + struct page *page, + unsigned long offset) +{ + xfs_page_trace(XFS_INVALIDPAGE_ENTER, + page->mapping->host, page, offset); + block_invalidatepage(page, offset); } -struct address_space_operations linvfs_aops = { - .readpage = linvfs_readpage, - .readpages = linvfs_readpages, - .writepage = linvfs_writepage, +const struct address_space_operations xfs_address_space_operations = { + .readpage = xfs_vm_readpage, + .readpages = xfs_vm_readpages, + .writepage = xfs_vm_writepage, + .writepages = xfs_vm_writepages, .sync_page = block_sync_page, - .releasepage = linvfs_release_page, - .prepare_write = linvfs_prepare_write, + .releasepage = xfs_vm_releasepage, + .invalidatepage = xfs_vm_invalidatepage, + .prepare_write = xfs_vm_prepare_write, .commit_write = generic_commit_write, - .bmap = linvfs_bmap, - .direct_IO = linvfs_direct_IO, + .bmap = xfs_vm_bmap, + .direct_IO = xfs_vm_direct_IO, + .migratepage = buffer_migrate_page, }; diff --git a/fs/xfs/linux-2.6/xfs_aops.h b/fs/xfs/linux-2.6/xfs_aops.h index 60716543c..2244e516b 100644 --- a/fs/xfs/linux-2.6/xfs_aops.h +++ b/fs/xfs/linux-2.6/xfs_aops.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005 Silicon Graphics, Inc. + * Copyright (c) 2005-2006 Silicon Graphics, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -30,9 +30,9 @@ typedef void (*xfs_ioend_func_t)(void *); typedef struct xfs_ioend { struct xfs_ioend *io_list; /* next ioend in chain */ unsigned int io_type; /* delalloc / unwritten */ - unsigned int io_uptodate; /* I/O status register */ + int io_error; /* I/O error code */ atomic_t io_remaining; /* hold count */ - struct vnode *io_vnode; /* file being written to */ + struct bhv_vnode *io_vnode; /* file being written to */ struct buffer_head *io_buffer_head;/* buffer linked list head */ struct buffer_head *io_buffer_tail;/* buffer linked list tail */ size_t io_size; /* size of the extent */ @@ -40,7 +40,7 @@ typedef struct xfs_ioend { struct work_struct io_work; /* xfsdatad work queue */ } xfs_ioend_t; -extern struct address_space_operations xfs_address_space_operations; +extern const struct address_space_operations xfs_address_space_operations; extern int xfs_get_blocks(struct inode *, sector_t, struct buffer_head *, int); -#endif /* __XFS_IOPS_H__ */ +#endif /* __XFS_AOPS_H__ */ diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 997963e53..2af528dcf 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -1,46 +1,20 @@ /* - * Copyright (c) 2000-2004 Silicon Graphics, Inc. All Rights Reserved. + * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * All Rights Reserved. * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as + * 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. * - * This program is distributed in the hope that it would be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * This program is distributed in the hope that it would 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. * - * Further, this software is distributed without any warranty that it is - * free of the rightful claim of any third person regarding infringement - * or the like. Any license provided herein, whether implied or - * otherwise, applies only to this software file. Patent licenses, if - * any, provided herein do not apply to combinations of this program with - * other software, or any other product whatsoever. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston MA 02111-1307, USA. - * - * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, - * Mountain View, CA 94043, or: - * - * http://www.sgi.com - * - * For further information regarding this notice, see: - * - * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - -/* - * The xfs_buf.c code provides an abstract buffer cache model on top - * of the Linux page cache. Cached metadata blocks for a file system - * are hashed to the inode for the block device. xfs_buf.c assembles - * buffers (xfs_buf_t) on demand to aggregate such cached pages for I/O. - * - * Written by Steve Lord, Jim Mostek, Russell Cattelan - * and Rajagopal Ananthanarayanan ("ananth") at SGI. - * - */ - #include #include #include @@ -54,91 +28,81 @@ #include #include #include - +#include +#include #include "xfs_linux.h" -/* - * File wide globals - */ - -STATIC kmem_cache_t *pagebuf_cache; -STATIC kmem_shaker_t pagebuf_shake; -STATIC int pagebuf_daemon_wakeup(int, unsigned int); -STATIC void pagebuf_delwri_queue(xfs_buf_t *, int); -STATIC struct workqueue_struct *pagebuf_logio_workqueue; -STATIC struct workqueue_struct *pagebuf_dataio_workqueue; +STATIC kmem_zone_t *xfs_buf_zone; +STATIC kmem_shaker_t xfs_buf_shake; +STATIC int xfsbufd(void *); +STATIC int xfsbufd_wakeup(int, gfp_t); +STATIC void xfs_buf_delwri_queue(xfs_buf_t *, int); -/* - * Pagebuf debugging - */ +STATIC struct workqueue_struct *xfslogd_workqueue; +struct workqueue_struct *xfsdatad_workqueue; -#ifdef PAGEBUF_TRACE +#ifdef XFS_BUF_TRACE void -pagebuf_trace( - xfs_buf_t *pb, +xfs_buf_trace( + xfs_buf_t *bp, char *id, void *data, void *ra) { - ktrace_enter(pagebuf_trace_buf, - pb, id, - (void *)(unsigned long)pb->pb_flags, - (void *)(unsigned long)pb->pb_hold.counter, - (void *)(unsigned long)pb->pb_sema.count.counter, + ktrace_enter(xfs_buf_trace_buf, + bp, id, + (void *)(unsigned long)bp->b_flags, + (void *)(unsigned long)bp->b_hold.counter, + (void *)(unsigned long)bp->b_sema.count.counter, (void *)current, data, ra, - (void *)(unsigned long)((pb->pb_file_offset>>32) & 0xffffffff), - (void *)(unsigned long)(pb->pb_file_offset & 0xffffffff), - (void *)(unsigned long)pb->pb_buffer_length, + (void *)(unsigned long)((bp->b_file_offset>>32) & 0xffffffff), + (void *)(unsigned long)(bp->b_file_offset & 0xffffffff), + (void *)(unsigned long)bp->b_buffer_length, NULL, NULL, NULL, NULL, NULL); } -ktrace_t *pagebuf_trace_buf; -#define PAGEBUF_TRACE_SIZE 4096 -#define PB_TRACE(pb, id, data) \ - pagebuf_trace(pb, id, (void *)data, (void *)__builtin_return_address(0)) +ktrace_t *xfs_buf_trace_buf; +#define XFS_BUF_TRACE_SIZE 4096 +#define XB_TRACE(bp, id, data) \ + xfs_buf_trace(bp, id, (void *)data, (void *)__builtin_return_address(0)) #else -#define PB_TRACE(pb, id, data) do { } while (0) +#define XB_TRACE(bp, id, data) do { } while (0) #endif -#ifdef PAGEBUF_LOCK_TRACKING -# define PB_SET_OWNER(pb) ((pb)->pb_last_holder = current->pid) -# define PB_CLEAR_OWNER(pb) ((pb)->pb_last_holder = -1) -# define PB_GET_OWNER(pb) ((pb)->pb_last_holder) +#ifdef XFS_BUF_LOCK_TRACKING +# define XB_SET_OWNER(bp) ((bp)->b_last_holder = current->pid) +# define XB_CLEAR_OWNER(bp) ((bp)->b_last_holder = -1) +# define XB_GET_OWNER(bp) ((bp)->b_last_holder) #else -# define PB_SET_OWNER(pb) do { } while (0) -# define PB_CLEAR_OWNER(pb) do { } while (0) -# define PB_GET_OWNER(pb) do { } while (0) +# define XB_SET_OWNER(bp) do { } while (0) +# define XB_CLEAR_OWNER(bp) do { } while (0) +# define XB_GET_OWNER(bp) do { } while (0) #endif -/* - * Pagebuf allocation / freeing. - */ - -#define pb_to_gfp(flags) \ - ((((flags) & PBF_READ_AHEAD) ? __GFP_NORETRY : \ - ((flags) & PBF_DONT_BLOCK) ? GFP_NOFS : GFP_KERNEL) | __GFP_NOWARN) +#define xb_to_gfp(flags) \ + ((((flags) & XBF_READ_AHEAD) ? __GFP_NORETRY : \ + ((flags) & XBF_DONT_BLOCK) ? GFP_NOFS : GFP_KERNEL) | __GFP_NOWARN) -#define pb_to_km(flags) \ - (((flags) & PBF_DONT_BLOCK) ? KM_NOFS : KM_SLEEP) +#define xb_to_km(flags) \ + (((flags) & XBF_DONT_BLOCK) ? KM_NOFS : KM_SLEEP) - -#define pagebuf_allocate(flags) \ - kmem_zone_alloc(pagebuf_cache, pb_to_km(flags)) -#define pagebuf_deallocate(pb) \ - kmem_zone_free(pagebuf_cache, (pb)); +#define xfs_buf_allocate(flags) \ + kmem_zone_alloc(xfs_buf_zone, xb_to_km(flags)) +#define xfs_buf_deallocate(bp) \ + kmem_zone_free(xfs_buf_zone, (bp)); /* - * Page Region interfaces. + * Page Region interfaces. * - * For pages in filesystems where the blocksize is smaller than the - * pagesize, we use the page->private field (long) to hold a bitmap - * of uptodate regions within the page. + * For pages in filesystems where the blocksize is smaller than the + * pagesize, we use the page->private field (long) to hold a bitmap + * of uptodate regions within the page. * - * Each such region is "bytes per page / bits per long" bytes long. + * Each such region is "bytes per page / bits per long" bytes long. * - * NBPPR == number-of-bytes-per-page-region - * BTOPR == bytes-to-page-region (rounded up) - * BTOPRT == bytes-to-page-region-truncated (rounded down) + * NBPPR == number-of-bytes-per-page-region + * BTOPR == bytes-to-page-region (rounded up) + * BTOPRT == bytes-to-page-region-truncated (rounded down) */ #if (BITS_PER_LONG == 32) #define PRSHIFT (PAGE_CACHE_SHIFT - 5) /* (32 == 1<<5) */ @@ -179,8 +143,9 @@ set_page_region( size_t offset, size_t length) { - page->private |= page_region_mask(offset, length); - if (page->private == ~0UL) + set_page_private(page, + page_private(page) | page_region_mask(offset, length)); + if (page_private(page) == ~0UL) SetPageUptodate(page); } @@ -192,11 +157,11 @@ test_page_region( { unsigned long mask = page_region_mask(offset, length); - return (mask && (page->private & mask) == mask); + return (mask && (page_private(page) & mask) == mask); } /* - * Mapping of multi-page buffers into contiguous virtual space + * Mapping of multi-page buffers into contiguous virtual space */ typedef struct a_list { @@ -209,7 +174,7 @@ STATIC int as_list_len; STATIC DEFINE_SPINLOCK(as_lock); /* - * Try to batch vunmaps because they are costly. + * Try to batch vunmaps because they are costly. */ STATIC void free_address( @@ -217,7 +182,7 @@ free_address( { a_list_t *aentry; - aentry = kmalloc(sizeof(a_list_t), GFP_ATOMIC & ~__GFP_HIGH); + aentry = kmalloc(sizeof(a_list_t), GFP_NOWAIT); if (likely(aentry)) { spin_lock(&as_lock); aentry->next = as_free_head; @@ -252,83 +217,83 @@ purge_addresses(void) } /* - * Internal pagebuf object manipulation + * Internal xfs_buf_t object manipulation */ STATIC void -_pagebuf_initialize( - xfs_buf_t *pb, +_xfs_buf_initialize( + xfs_buf_t *bp, xfs_buftarg_t *target, - loff_t range_base, + xfs_off_t range_base, size_t range_length, - page_buf_flags_t flags) + xfs_buf_flags_t flags) { /* - * We don't want certain flags to appear in pb->pb_flags. + * We don't want certain flags to appear in b_flags. */ - flags &= ~(PBF_LOCK|PBF_MAPPED|PBF_DONT_BLOCK|PBF_READ_AHEAD); - - memset(pb, 0, sizeof(xfs_buf_t)); - atomic_set(&pb->pb_hold, 1); - init_MUTEX_LOCKED(&pb->pb_iodonesema); - INIT_LIST_HEAD(&pb->pb_list); - INIT_LIST_HEAD(&pb->pb_hash_list); - init_MUTEX_LOCKED(&pb->pb_sema); /* held, no waiters */ - PB_SET_OWNER(pb); - pb->pb_target = target; - pb->pb_file_offset = range_base; + flags &= ~(XBF_LOCK|XBF_MAPPED|XBF_DONT_BLOCK|XBF_READ_AHEAD); + + memset(bp, 0, sizeof(xfs_buf_t)); + atomic_set(&bp->b_hold, 1); + init_MUTEX_LOCKED(&bp->b_iodonesema); + INIT_LIST_HEAD(&bp->b_list); + INIT_LIST_HEAD(&bp->b_hash_list); + init_MUTEX_LOCKED(&bp->b_sema); /* held, no waiters */ + XB_SET_OWNER(bp); + bp->b_target = target; + bp->b_file_offset = range_base; /* * Set buffer_length and count_desired to the same value initially. * I/O routines should use count_desired, which will be the same in * most cases but may be reset (e.g. XFS recovery). */ - pb->pb_buffer_length = pb->pb_count_desired = range_length; - pb->pb_flags = flags | PBF_NONE; - pb->pb_bn = XFS_BUF_DADDR_NULL; - atomic_set(&pb->pb_pin_count, 0); - init_waitqueue_head(&pb->pb_waiters); - - XFS_STATS_INC(pb_create); - PB_TRACE(pb, "initialize", target); + bp->b_buffer_length = bp->b_count_desired = range_length; + bp->b_flags = flags; + bp->b_bn = XFS_BUF_DADDR_NULL; + atomic_set(&bp->b_pin_count, 0); + init_waitqueue_head(&bp->b_waiters); + + XFS_STATS_INC(xb_create); + XB_TRACE(bp, "initialize", target); } /* - * Allocate a page array capable of holding a specified number - * of pages, and point the page buf at it. + * Allocate a page array capable of holding a specified number + * of pages, and point the page buf at it. */ STATIC int -_pagebuf_get_pages( - xfs_buf_t *pb, +_xfs_buf_get_pages( + xfs_buf_t *bp, int page_count, - page_buf_flags_t flags) + xfs_buf_flags_t flags) { /* Make sure that we have a page list */ - if (pb->pb_pages == NULL) { - pb->pb_offset = page_buf_poff(pb->pb_file_offset); - pb->pb_page_count = page_count; - if (page_count <= PB_PAGES) { - pb->pb_pages = pb->pb_page_array; + if (bp->b_pages == NULL) { + bp->b_offset = xfs_buf_poff(bp->b_file_offset); + bp->b_page_count = page_count; + if (page_count <= XB_PAGES) { + bp->b_pages = bp->b_page_array; } else { - pb->pb_pages = kmem_alloc(sizeof(struct page *) * - page_count, pb_to_km(flags)); - if (pb->pb_pages == NULL) + bp->b_pages = kmem_alloc(sizeof(struct page *) * + page_count, xb_to_km(flags)); + if (bp->b_pages == NULL) return -ENOMEM; } - memset(pb->pb_pages, 0, sizeof(struct page *) * page_count); + memset(bp->b_pages, 0, sizeof(struct page *) * page_count); } return 0; } /* - * Frees pb_pages if it was malloced. + * Frees b_pages if it was allocated. */ STATIC void -_pagebuf_free_pages( +_xfs_buf_free_pages( xfs_buf_t *bp) { - if (bp->pb_pages != bp->pb_page_array) { - kmem_free(bp->pb_pages, - bp->pb_page_count * sizeof(struct page *)); + if (bp->b_pages != bp->b_page_array) { + kmem_free(bp->b_pages, + bp->b_page_count * sizeof(struct page *)); } } @@ -336,79 +301,79 @@ _pagebuf_free_pages( * Releases the specified buffer. * * The modification state of any associated pages is left unchanged. - * The buffer most not be on any hash - use pagebuf_rele instead for + * The buffer most not be on any hash - use xfs_buf_rele instead for * hashed and refcounted buffers */ void -pagebuf_free( +xfs_buf_free( xfs_buf_t *bp) { - PB_TRACE(bp, "free", 0); + XB_TRACE(bp, "free", 0); - ASSERT(list_empty(&bp->pb_hash_list)); + ASSERT(list_empty(&bp->b_hash_list)); - if (bp->pb_flags & _PBF_PAGE_CACHE) { + if (bp->b_flags & _XBF_PAGE_CACHE) { uint i; - if ((bp->pb_flags & PBF_MAPPED) && (bp->pb_page_count > 1)) - free_address(bp->pb_addr - bp->pb_offset); + if ((bp->b_flags & XBF_MAPPED) && (bp->b_page_count > 1)) + free_address(bp->b_addr - bp->b_offset); - for (i = 0; i < bp->pb_page_count; i++) - page_cache_release(bp->pb_pages[i]); - _pagebuf_free_pages(bp); - } else if (bp->pb_flags & _PBF_KMEM_ALLOC) { + for (i = 0; i < bp->b_page_count; i++) + page_cache_release(bp->b_pages[i]); + _xfs_buf_free_pages(bp); + } else if (bp->b_flags & _XBF_KMEM_ALLOC) { /* - * XXX(hch): bp->pb_count_desired might be incorrect (see - * pagebuf_associate_memory for details), but fortunately + * XXX(hch): bp->b_count_desired might be incorrect (see + * xfs_buf_associate_memory for details), but fortunately * the Linux version of kmem_free ignores the len argument.. */ - kmem_free(bp->pb_addr, bp->pb_count_desired); - _pagebuf_free_pages(bp); + kmem_free(bp->b_addr, bp->b_count_desired); + _xfs_buf_free_pages(bp); } - pagebuf_deallocate(bp); + xfs_buf_deallocate(bp); } /* * Finds all pages for buffer in question and builds it's page list. */ STATIC int -_pagebuf_lookup_pages( +_xfs_buf_lookup_pages( xfs_buf_t *bp, uint flags) { - struct address_space *mapping = bp->pb_target->pbr_mapping; - size_t blocksize = bp->pb_target->pbr_bsize; - size_t size = bp->pb_count_desired; + struct address_space *mapping = bp->b_target->bt_mapping; + size_t blocksize = bp->b_target->bt_bsize; + size_t size = bp->b_count_desired; size_t nbytes, offset; - int gfp_mask = pb_to_gfp(flags); + gfp_t gfp_mask = xb_to_gfp(flags); unsigned short page_count, i; pgoff_t first; - loff_t end; + xfs_off_t end; int error; - end = bp->pb_file_offset + bp->pb_buffer_length; - page_count = page_buf_btoc(end) - page_buf_btoct(bp->pb_file_offset); + end = bp->b_file_offset + bp->b_buffer_length; + page_count = xfs_buf_btoc(end) - xfs_buf_btoct(bp->b_file_offset); - error = _pagebuf_get_pages(bp, page_count, flags); + error = _xfs_buf_get_pages(bp, page_count, flags); if (unlikely(error)) return error; - bp->pb_flags |= _PBF_PAGE_CACHE; + bp->b_flags |= _XBF_PAGE_CACHE; - offset = bp->pb_offset; - first = bp->pb_file_offset >> PAGE_CACHE_SHIFT; + offset = bp->b_offset; + first = bp->b_file_offset >> PAGE_CACHE_SHIFT; - for (i = 0; i < bp->pb_page_count; i++) { + for (i = 0; i < bp->b_page_count; i++) { struct page *page; uint retries = 0; retry: page = find_or_create_page(mapping, first + i, gfp_mask); if (unlikely(page == NULL)) { - if (flags & PBF_READ_AHEAD) { - bp->pb_page_count = i; - for (i = 0; i < bp->pb_page_count; i++) - unlock_page(bp->pb_pages[i]); + if (flags & XBF_READ_AHEAD) { + bp->b_page_count = i; + for (i = 0; i < bp->b_page_count; i++) + unlock_page(bp->b_pages[i]); return -ENOMEM; } @@ -424,13 +389,13 @@ _pagebuf_lookup_pages( "deadlock in %s (mode:0x%x)\n", __FUNCTION__, gfp_mask); - XFS_STATS_INC(pb_page_retries); - pagebuf_daemon_wakeup(0, gfp_mask); + XFS_STATS_INC(xb_page_retries); + xfsbufd_wakeup(0, gfp_mask); blk_congestion_wait(WRITE, HZ/50); goto retry; } - XFS_STATS_INC(pb_page_found); + XFS_STATS_INC(xb_page_found); nbytes = min_t(size_t, size, PAGE_CACHE_SIZE - offset); size -= nbytes; @@ -438,33 +403,27 @@ _pagebuf_lookup_pages( if (!PageUptodate(page)) { page_count--; if (blocksize >= PAGE_CACHE_SIZE) { - if (flags & PBF_READ) - bp->pb_locked = 1; + if (flags & XBF_READ) + bp->b_locked = 1; } else if (!PagePrivate(page)) { if (test_page_region(page, offset, nbytes)) page_count++; } } - bp->pb_pages[i] = page; + bp->b_pages[i] = page; offset = 0; } - if (!bp->pb_locked) { - for (i = 0; i < bp->pb_page_count; i++) - unlock_page(bp->pb_pages[i]); + if (!bp->b_locked) { + for (i = 0; i < bp->b_page_count; i++) + unlock_page(bp->b_pages[i]); } - if (page_count) { - /* if we have any uptodate pages, mark that in the buffer */ - bp->pb_flags &= ~PBF_NONE; + if (page_count == bp->b_page_count) + bp->b_flags |= XBF_DONE; - /* if some pages aren't uptodate, mark that in the buffer */ - if (page_count != bp->pb_page_count) - bp->pb_flags |= PBF_PARTIAL; - } - - PB_TRACE(bp, "lookup_pages", (long)page_count); + XB_TRACE(bp, "lookup_pages", (long)page_count); return error; } @@ -472,23 +431,23 @@ _pagebuf_lookup_pages( * Map buffer into kernel address-space if nessecary. */ STATIC int -_pagebuf_map_pages( +_xfs_buf_map_pages( xfs_buf_t *bp, uint flags) { /* A single page buffer is always mappable */ - if (bp->pb_page_count == 1) { - bp->pb_addr = page_address(bp->pb_pages[0]) + bp->pb_offset; - bp->pb_flags |= PBF_MAPPED; - } else if (flags & PBF_MAPPED) { + if (bp->b_page_count == 1) { + bp->b_addr = page_address(bp->b_pages[0]) + bp->b_offset; + bp->b_flags |= XBF_MAPPED; + } else if (flags & XBF_MAPPED) { if (as_list_len > 64) purge_addresses(); - bp->pb_addr = vmap(bp->pb_pages, bp->pb_page_count, - VM_MAP, PAGE_KERNEL); - if (unlikely(bp->pb_addr == NULL)) + bp->b_addr = vmap(bp->b_pages, bp->b_page_count, + VM_MAP, PAGE_KERNEL); + if (unlikely(bp->b_addr == NULL)) return -ENOMEM; - bp->pb_addr += bp->pb_offset; - bp->pb_flags |= PBF_MAPPED; + bp->b_addr += bp->b_offset; + bp->b_flags |= XBF_MAPPED; } return 0; @@ -499,9 +458,7 @@ _pagebuf_map_pages( */ /* - * _pagebuf_find - * - * Looks up, and creates if absent, a lockable buffer for + * Look up, and creates if absent, a lockable buffer for * a given range of an inode. The buffer is returned * locked. If other overlapping buffers exist, they are * released before the new buffer is created and locked, @@ -509,55 +466,55 @@ _pagebuf_map_pages( * are unlocked. No I/O is implied by this call. */ xfs_buf_t * -_pagebuf_find( +_xfs_buf_find( xfs_buftarg_t *btp, /* block device target */ - loff_t ioff, /* starting offset of range */ + xfs_off_t ioff, /* starting offset of range */ size_t isize, /* length of range */ - page_buf_flags_t flags, /* PBF_TRYLOCK */ - xfs_buf_t *new_pb)/* newly allocated buffer */ + xfs_buf_flags_t flags, + xfs_buf_t *new_bp) { - loff_t range_base; + xfs_off_t range_base; size_t range_length; xfs_bufhash_t *hash; - xfs_buf_t *pb, *n; + xfs_buf_t *bp, *n; range_base = (ioff << BBSHIFT); range_length = (isize << BBSHIFT); /* Check for IOs smaller than the sector size / not sector aligned */ - ASSERT(!(range_length < (1 << btp->pbr_sshift))); - ASSERT(!(range_base & (loff_t)btp->pbr_smask)); + ASSERT(!(range_length < (1 << btp->bt_sshift))); + ASSERT(!(range_base & (xfs_off_t)btp->bt_smask)); hash = &btp->bt_hash[hash_long((unsigned long)ioff, btp->bt_hashshift)]; spin_lock(&hash->bh_lock); - list_for_each_entry_safe(pb, n, &hash->bh_list, pb_hash_list) { - ASSERT(btp == pb->pb_target); - if (pb->pb_file_offset == range_base && - pb->pb_buffer_length == range_length) { + list_for_each_entry_safe(bp, n, &hash->bh_list, b_hash_list) { + ASSERT(btp == bp->b_target); + if (bp->b_file_offset == range_base && + bp->b_buffer_length == range_length) { /* - * If we look at something bring it to the + * If we look at something, bring it to the * front of the list for next time. */ - atomic_inc(&pb->pb_hold); - list_move(&pb->pb_hash_list, &hash->bh_list); + atomic_inc(&bp->b_hold); + list_move(&bp->b_hash_list, &hash->bh_list); goto found; } } /* No match found */ - if (new_pb) { - _pagebuf_initialize(new_pb, btp, range_base, + if (new_bp) { + _xfs_buf_initialize(new_bp, btp, range_base, range_length, flags); - new_pb->pb_hash = hash; - list_add(&new_pb->pb_hash_list, &hash->bh_list); + new_bp->b_hash = hash; + list_add(&new_bp->b_hash_list, &hash->bh_list); } else { - XFS_STATS_INC(pb_miss_locked); + XFS_STATS_INC(xb_miss_locked); } spin_unlock(&hash->bh_lock); - return new_pb; + return new_bp; found: spin_unlock(&hash->bh_lock); @@ -566,72 +523,72 @@ found: * if this does not work then we need to drop the * spinlock and do a hard attempt on the semaphore. */ - if (down_trylock(&pb->pb_sema)) { - if (!(flags & PBF_TRYLOCK)) { + if (down_trylock(&bp->b_sema)) { + if (!(flags & XBF_TRYLOCK)) { /* wait for buffer ownership */ - PB_TRACE(pb, "get_lock", 0); - pagebuf_lock(pb); - XFS_STATS_INC(pb_get_locked_waited); + XB_TRACE(bp, "get_lock", 0); + xfs_buf_lock(bp); + XFS_STATS_INC(xb_get_locked_waited); } else { /* We asked for a trylock and failed, no need * to look at file offset and length here, we - * know that this pagebuf at least overlaps our - * pagebuf and is locked, therefore our buffer - * either does not exist, or is this buffer + * know that this buffer at least overlaps our + * buffer and is locked, therefore our buffer + * either does not exist, or is this buffer. */ - - pagebuf_rele(pb); - XFS_STATS_INC(pb_busy_locked); - return (NULL); + xfs_buf_rele(bp); + XFS_STATS_INC(xb_busy_locked); + return NULL; } } else { /* trylock worked */ - PB_SET_OWNER(pb); + XB_SET_OWNER(bp); } - if (pb->pb_flags & PBF_STALE) - pb->pb_flags &= PBF_MAPPED; - PB_TRACE(pb, "got_lock", 0); - XFS_STATS_INC(pb_get_locked); - return (pb); + if (bp->b_flags & XBF_STALE) { + ASSERT((bp->b_flags & _XBF_DELWRI_Q) == 0); + bp->b_flags &= XBF_MAPPED; + } + XB_TRACE(bp, "got_lock", 0); + XFS_STATS_INC(xb_get_locked); + return bp; } /* - * xfs_buf_get_flags assembles a buffer covering the specified range. - * + * Assembles a buffer covering the specified range. * Storage in memory for all portions of the buffer will be allocated, * although backing storage may not be. */ xfs_buf_t * -xfs_buf_get_flags( /* allocate a buffer */ +xfs_buf_get_flags( xfs_buftarg_t *target,/* target for buffer */ - loff_t ioff, /* starting offset of range */ + xfs_off_t ioff, /* starting offset of range */ size_t isize, /* length of range */ - page_buf_flags_t flags) /* PBF_TRYLOCK */ + xfs_buf_flags_t flags) { - xfs_buf_t *pb, *new_pb; + xfs_buf_t *bp, *new_bp; int error = 0, i; - new_pb = pagebuf_allocate(flags); - if (unlikely(!new_pb)) + new_bp = xfs_buf_allocate(flags); + if (unlikely(!new_bp)) return NULL; - pb = _pagebuf_find(target, ioff, isize, flags, new_pb); - if (pb == new_pb) { - error = _pagebuf_lookup_pages(pb, flags); + bp = _xfs_buf_find(target, ioff, isize, flags, new_bp); + if (bp == new_bp) { + error = _xfs_buf_lookup_pages(bp, flags); if (error) goto no_buffer; } else { - pagebuf_deallocate(new_pb); - if (unlikely(pb == NULL)) + xfs_buf_deallocate(new_bp); + if (unlikely(bp == NULL)) return NULL; } - for (i = 0; i < pb->pb_page_count; i++) - mark_page_accessed(pb->pb_pages[i]); + for (i = 0; i < bp->b_page_count; i++) + mark_page_accessed(bp->b_pages[i]); - if (!(pb->pb_flags & PBF_MAPPED)) { - error = _pagebuf_map_pages(pb, flags); + if (!(bp->b_flags & XBF_MAPPED)) { + error = _xfs_buf_map_pages(bp, flags); if (unlikely(error)) { printk(KERN_WARNING "%s: failed to map pages\n", __FUNCTION__); @@ -639,116 +596,97 @@ xfs_buf_get_flags( /* allocate a buffer */ } } - XFS_STATS_INC(pb_get); + XFS_STATS_INC(xb_get); /* * Always fill in the block number now, the mapped cases can do * their own overlay of this later. */ - pb->pb_bn = ioff; - pb->pb_count_desired = pb->pb_buffer_length; + bp->b_bn = ioff; + bp->b_count_desired = bp->b_buffer_length; - PB_TRACE(pb, "get", (unsigned long)flags); - return pb; + XB_TRACE(bp, "get", (unsigned long)flags); + return bp; no_buffer: - if (flags & (PBF_LOCK | PBF_TRYLOCK)) - pagebuf_unlock(pb); - pagebuf_rele(pb); + if (flags & (XBF_LOCK | XBF_TRYLOCK)) + xfs_buf_unlock(bp); + xfs_buf_rele(bp); return NULL; } xfs_buf_t * xfs_buf_read_flags( xfs_buftarg_t *target, - loff_t ioff, + xfs_off_t ioff, size_t isize, - page_buf_flags_t flags) + xfs_buf_flags_t flags) { - xfs_buf_t *pb; - - flags |= PBF_READ; - - pb = xfs_buf_get_flags(target, ioff, isize, flags); - if (pb) { - if (PBF_NOT_DONE(pb)) { - PB_TRACE(pb, "read", (unsigned long)flags); - XFS_STATS_INC(pb_get_read); - pagebuf_iostart(pb, flags); - } else if (flags & PBF_ASYNC) { - PB_TRACE(pb, "read_async", (unsigned long)flags); + xfs_buf_t *bp; + + flags |= XBF_READ; + + bp = xfs_buf_get_flags(target, ioff, isize, flags); + if (bp) { + if (!XFS_BUF_ISDONE(bp)) { + XB_TRACE(bp, "read", (unsigned long)flags); + XFS_STATS_INC(xb_get_read); + xfs_buf_iostart(bp, flags); + } else if (flags & XBF_ASYNC) { + XB_TRACE(bp, "read_async", (unsigned long)flags); /* * Read ahead call which is already satisfied, * drop the buffer */ goto no_buffer; } else { - PB_TRACE(pb, "read_done", (unsigned long)flags); + XB_TRACE(bp, "read_done", (unsigned long)flags); /* We do not want read in the flags */ - pb->pb_flags &= ~PBF_READ; + bp->b_flags &= ~XBF_READ; } } - return pb; + return bp; no_buffer: - if (flags & (PBF_LOCK | PBF_TRYLOCK)) - pagebuf_unlock(pb); - pagebuf_rele(pb); + if (flags & (XBF_LOCK | XBF_TRYLOCK)) + xfs_buf_unlock(bp); + xfs_buf_rele(bp); return NULL; } /* - * Create a skeletal pagebuf (no pages associated with it). - */ -xfs_buf_t * -pagebuf_lookup( - xfs_buftarg_t *target, - loff_t ioff, - size_t isize, - page_buf_flags_t flags) -{ - xfs_buf_t *pb; - - pb = pagebuf_allocate(flags); - if (pb) { - _pagebuf_initialize(pb, target, ioff, isize, flags); - } - return pb; -} - -/* - * If we are not low on memory then do the readahead in a deadlock - * safe manner. + * If we are not low on memory then do the readahead in a deadlock + * safe manner. */ void -pagebuf_readahead( +xfs_buf_readahead( xfs_buftarg_t *target, - loff_t ioff, + xfs_off_t ioff, size_t isize, - page_buf_flags_t flags) + xfs_buf_flags_t flags) { struct backing_dev_info *bdi; - bdi = target->pbr_mapping->backing_dev_info; + bdi = target->bt_mapping->backing_dev_info; if (bdi_read_congested(bdi)) return; - flags |= (PBF_TRYLOCK|PBF_ASYNC|PBF_READ_AHEAD); + flags |= (XBF_TRYLOCK|XBF_ASYNC|XBF_READ_AHEAD); xfs_buf_read_flags(target, ioff, isize, flags); } xfs_buf_t * -pagebuf_get_empty( +xfs_buf_get_empty( size_t len, xfs_buftarg_t *target) { - xfs_buf_t *pb; + xfs_buf_t *bp; - pb = pagebuf_allocate(0); - if (pb) - _pagebuf_initialize(pb, target, 0, len, 0); - return pb; + bp = xfs_buf_allocate(0); + if (bp) + _xfs_buf_initialize(bp, target, 0, len, 0); + return bp; } static inline struct page * @@ -764,8 +702,8 @@ mem_to_page( } int -pagebuf_associate_memory( - xfs_buf_t *pb, +xfs_buf_associate_memory( + xfs_buf_t *bp, void *mem, size_t len) { @@ -782,40 +720,40 @@ pagebuf_associate_memory( page_count++; /* Free any previous set of page pointers */ - if (pb->pb_pages) - _pagebuf_free_pages(pb); + if (bp->b_pages) + _xfs_buf_free_pages(bp); - pb->pb_pages = NULL; - pb->pb_addr = mem; + bp->b_pages = NULL; + bp->b_addr = mem; - rval = _pagebuf_get_pages(pb, page_count, 0); + rval = _xfs_buf_get_pages(bp, page_count, 0); if (rval) return rval; - pb->pb_offset = offset; + bp->b_offset = offset; ptr = (size_t) mem & PAGE_CACHE_MASK; end = PAGE_CACHE_ALIGN((size_t) mem + len); end_cur = end; /* set up first page */ - pb->pb_pages[0] = mem_to_page(mem); + bp->b_pages[0] = mem_to_page(mem); ptr += PAGE_CACHE_SIZE; - pb->pb_page_count = ++i; + bp->b_page_count = ++i; while (ptr < end) { - pb->pb_pages[i] = mem_to_page((void *)ptr); - pb->pb_page_count = ++i; + bp->b_pages[i] = mem_to_page((void *)ptr); + bp->b_page_count = ++i; ptr += PAGE_CACHE_SIZE; } - pb->pb_locked = 0; + bp->b_locked = 0; - pb->pb_count_desired = pb->pb_buffer_length = len; - pb->pb_flags |= PBF_MAPPED; + bp->b_count_desired = bp->b_buffer_length = len; + bp->b_flags |= XBF_MAPPED; return 0; } xfs_buf_t * -pagebuf_get_no_daddr( +xfs_buf_get_noaddr( size_t len, xfs_buftarg_t *target) { @@ -824,10 +762,10 @@ pagebuf_get_no_daddr( void *data; int error; - bp = pagebuf_allocate(0); + bp = xfs_buf_allocate(0); if (unlikely(bp == NULL)) goto fail; - _pagebuf_initialize(bp, target, 0, len, PBF_FORCEIO); + _xfs_buf_initialize(bp, target, 0, len, 0); try_again: data = kmem_alloc(malloc_len, KM_SLEEP | KM_MAYFAIL); @@ -836,98 +774,80 @@ pagebuf_get_no_daddr( /* check whether alignment matches.. */ if ((__psunsigned_t)data != - ((__psunsigned_t)data & ~target->pbr_smask)) { + ((__psunsigned_t)data & ~target->bt_smask)) { /* .. else double the size and try again */ kmem_free(data, malloc_len); malloc_len <<= 1; goto try_again; } - error = pagebuf_associate_memory(bp, data, len); + error = xfs_buf_associate_memory(bp, data, len); if (error) goto fail_free_mem; - bp->pb_flags |= _PBF_KMEM_ALLOC; + bp->b_flags |= _XBF_KMEM_ALLOC; - pagebuf_unlock(bp); + xfs_buf_unlock(bp); - PB_TRACE(bp, "no_daddr", data); + XB_TRACE(bp, "no_daddr", data); return bp; fail_free_mem: kmem_free(data, malloc_len); fail_free_buf: - pagebuf_free(bp); + xfs_buf_free(bp); fail: return NULL; } /* - * pagebuf_hold - * * Increment reference count on buffer, to hold the buffer concurrently * with another thread which may release (free) the buffer asynchronously. - * * Must hold the buffer already to call this function. */ void -pagebuf_hold( - xfs_buf_t *pb) +xfs_buf_hold( + xfs_buf_t *bp) { - atomic_inc(&pb->pb_hold); - PB_TRACE(pb, "hold", 0); + atomic_inc(&bp->b_hold); + XB_TRACE(bp, "hold", 0); } /* - * pagebuf_rele - * - * pagebuf_rele releases a hold on the specified buffer. If the - * the hold count is 1, pagebuf_rele calls pagebuf_free. + * Releases a hold on the specified buffer. If the + * the hold count is 1, calls xfs_buf_free. */ void -pagebuf_rele( - xfs_buf_t *pb) +xfs_buf_rele( + xfs_buf_t *bp) { - xfs_bufhash_t *hash = pb->pb_hash; + xfs_bufhash_t *hash = bp->b_hash; - PB_TRACE(pb, "rele", pb->pb_relse); + XB_TRACE(bp, "rele", bp->b_relse); - /* - * pagebuf_lookup buffers are not hashed, not delayed write, - * and don't have their own release routines. Special case. - */ if (unlikely(!hash)) { - ASSERT(!pb->pb_relse); - if (atomic_dec_and_test(&pb->pb_hold)) - xfs_buf_free(pb); + ASSERT(!bp->b_relse); + if (atomic_dec_and_test(&bp->b_hold)) + xfs_buf_free(bp); return; } - if (atomic_dec_and_lock(&pb->pb_hold, &hash->bh_lock)) { - int do_free = 1; - - if (pb->pb_relse) { - atomic_inc(&pb->pb_hold); + if (atomic_dec_and_lock(&bp->b_hold, &hash->bh_lock)) { + if (bp->b_relse) { + atomic_inc(&bp->b_hold); spin_unlock(&hash->bh_lock); - (*(pb->pb_relse)) (pb); - spin_lock(&hash->bh_lock); - do_free = 0; - } - - if (pb->pb_flags & PBF_DELWRI) { - pb->pb_flags |= PBF_ASYNC; - atomic_inc(&pb->pb_hold); - pagebuf_delwri_queue(pb, 0); - do_free = 0; - } else if (pb->pb_flags & PBF_FS_MANAGED) { - do_free = 0; - } - - if (do_free) { - list_del_init(&pb->pb_hash_list); + (*(bp->b_relse)) (bp); + } else if (bp->b_flags & XBF_FS_MANAGED) { spin_unlock(&hash->bh_lock); - pagebuf_free(pb); } else { + ASSERT(!(bp->b_flags & (XBF_DELWRI|_XBF_DELWRI_Q))); + list_del_init(&bp->b_hash_list); spin_unlock(&hash->bh_lock); + xfs_buf_free(bp); } + } else { + /* + * Catch reference count leaks + */ + ASSERT(atomic_read(&bp->b_hold) >= 0); } } @@ -943,157 +863,122 @@ pagebuf_rele( */ /* - * pagebuf_cond_lock - * - * pagebuf_cond_lock locks a buffer object, if it is not already locked. - * Note that this in no way - * locks the underlying pages, so it is only useful for synchronizing - * concurrent use of page buffer objects, not for synchronizing independent - * access to the underlying pages. + * Locks a buffer object, if it is not already locked. + * Note that this in no way locks the underlying pages, so it is only + * useful for synchronizing concurrent use of buffer objects, not for + * synchronizing independent access to the underlying pages. */ int -pagebuf_cond_lock( /* lock buffer, if not locked */ - /* returns -EBUSY if locked) */ - xfs_buf_t *pb) +xfs_buf_cond_lock( + xfs_buf_t *bp) { int locked; - locked = down_trylock(&pb->pb_sema) == 0; + locked = down_trylock(&bp->b_sema) == 0; if (locked) { - PB_SET_OWNER(pb); + XB_SET_OWNER(bp); } - PB_TRACE(pb, "cond_lock", (long)locked); - return(locked ? 0 : -EBUSY); + XB_TRACE(bp, "cond_lock", (long)locked); + return locked ? 0 : -EBUSY; } #if defined(DEBUG) || defined(XFS_BLI_TRACE) -/* - * pagebuf_lock_value - * - * Return lock value for a pagebuf - */ int -pagebuf_lock_value( - xfs_buf_t *pb) +xfs_buf_lock_value( + xfs_buf_t *bp) { - return(atomic_read(&pb->pb_sema.count)); + return atomic_read(&bp->b_sema.count); } #endif /* - * pagebuf_lock - * - * pagebuf_lock locks a buffer object. Note that this in no way - * locks the underlying pages, so it is only useful for synchronizing - * concurrent use of page buffer objects, not for synchronizing independent - * access to the underlying pages. + * Locks a buffer object. + * Note that this in no way locks the underlying pages, so it is only + * useful for synchronizing concurrent use of buffer objects, not for + * synchronizing independent access to the underlying pages. */ -int -pagebuf_lock( - xfs_buf_t *pb) +void +xfs_buf_lock( + xfs_buf_t *bp) { - PB_TRACE(pb, "lock", 0); - if (atomic_read(&pb->pb_io_remaining)) - blk_run_address_space(pb->pb_target->pbr_mapping); - down(&pb->pb_sema); - PB_SET_OWNER(pb); - PB_TRACE(pb, "locked", 0); - return 0; + XB_TRACE(bp, "lock", 0); + if (atomic_read(&bp->b_io_remaining)) + blk_run_address_space(bp->b_target->bt_mapping); + down(&bp->b_sema); + XB_SET_OWNER(bp); + XB_TRACE(bp, "locked", 0); } /* - * pagebuf_unlock - * - * pagebuf_unlock releases the lock on the buffer object created by - * pagebuf_lock or pagebuf_cond_lock (not any - * pinning of underlying pages created by pagebuf_pin). + * Releases the lock on the buffer object. + * If the buffer is marked delwri but is not queued, do so before we + * unlock the buffer as we need to set flags correctly. We also need to + * take a reference for the delwri queue because the unlocker is going to + * drop their's and they don't know we just queued it. */ void -pagebuf_unlock( /* unlock buffer */ - xfs_buf_t *pb) /* buffer to unlock */ +xfs_buf_unlock( + xfs_buf_t *bp) { - PB_CLEAR_OWNER(pb); - up(&pb->pb_sema); - PB_TRACE(pb, "unlock", 0); + if ((bp->b_flags & (XBF_DELWRI|_XBF_DELWRI_Q)) == XBF_DELWRI) { + atomic_inc(&bp->b_hold); + bp->b_flags |= XBF_ASYNC; + xfs_buf_delwri_queue(bp, 0); + } + + XB_CLEAR_OWNER(bp); + up(&bp->b_sema); + XB_TRACE(bp, "unlock", 0); } /* * Pinning Buffer Storage in Memory - */ - -/* - * pagebuf_pin - * - * pagebuf_pin locks all of the memory represented by a buffer in - * memory. Multiple calls to pagebuf_pin and pagebuf_unpin, for - * the same or different buffers affecting a given page, will - * properly count the number of outstanding "pin" requests. The - * buffer may be released after the pagebuf_pin and a different - * buffer used when calling pagebuf_unpin, if desired. - * pagebuf_pin should be used by the file system when it wants be - * assured that no attempt will be made to force the affected - * memory to disk. It does not assure that a given logical page - * will not be moved to a different physical page. + * Ensure that no attempt to force a buffer to disk will succeed. */ void -pagebuf_pin( - xfs_buf_t *pb) +xfs_buf_pin( + xfs_buf_t *bp) { - atomic_inc(&pb->pb_pin_count); - PB_TRACE(pb, "pin", (long)pb->pb_pin_count.counter); + atomic_inc(&bp->b_pin_count); + XB_TRACE(bp, "pin", (long)bp->b_pin_count.counter); } -/* - * pagebuf_unpin - * - * pagebuf_unpin reverses the locking of memory performed by - * pagebuf_pin. Note that both functions affected the logical - * pages associated with the buffer, not the buffer itself. - */ void -pagebuf_unpin( - xfs_buf_t *pb) +xfs_buf_unpin( + xfs_buf_t *bp) { - if (atomic_dec_and_test(&pb->pb_pin_count)) { - wake_up_all(&pb->pb_waiters); - } - PB_TRACE(pb, "unpin", (long)pb->pb_pin_count.counter); + if (atomic_dec_and_test(&bp->b_pin_count)) + wake_up_all(&bp->b_waiters); + XB_TRACE(bp, "unpin", (long)bp->b_pin_count.counter); } int -pagebuf_ispin( - xfs_buf_t *pb) +xfs_buf_ispin( + xfs_buf_t *bp) { - return atomic_read(&pb->pb_pin_count); + return atomic_read(&bp->b_pin_count); } -/* - * pagebuf_wait_unpin - * - * pagebuf_wait_unpin waits until all of the memory associated - * with the buffer is not longer locked in memory. It returns - * immediately if none of the affected pages are locked. - */ -static inline void -_pagebuf_wait_unpin( - xfs_buf_t *pb) +STATIC void +xfs_buf_wait_unpin( + xfs_buf_t *bp) { DECLARE_WAITQUEUE (wait, current); - if (atomic_read(&pb->pb_pin_count) == 0) + if (atomic_read(&bp->b_pin_count) == 0) return; - add_wait_queue(&pb->pb_waiters, &wait); + add_wait_queue(&bp->b_waiters, &wait); for (;;) { set_current_state(TASK_UNINTERRUPTIBLE); - if (atomic_read(&pb->pb_pin_count) == 0) + if (atomic_read(&bp->b_pin_count) == 0) break; - if (atomic_read(&pb->pb_io_remaining)) - blk_run_address_space(pb->pb_target->pbr_mapping); + if (atomic_read(&bp->b_io_remaining)) + blk_run_address_space(bp->b_target->bt_mapping); schedule(); } - remove_wait_queue(&pb->pb_waiters, &wait); + remove_wait_queue(&bp->b_waiters, &wait); set_current_state(TASK_RUNNING); } @@ -1101,234 +986,216 @@ _pagebuf_wait_unpin( * Buffer Utility Routines */ -/* - * pagebuf_iodone - * - * pagebuf_iodone marks a buffer for which I/O is in progress - * done with respect to that I/O. The pb_iodone routine, if - * present, will be called as a side-effect. - */ STATIC void -pagebuf_iodone_work( +xfs_buf_iodone_work( void *v) { xfs_buf_t *bp = (xfs_buf_t *)v; - if (bp->pb_iodone) - (*(bp->pb_iodone))(bp); - else if (bp->pb_flags & PBF_ASYNC) + if (bp->b_iodone) + (*(bp->b_iodone))(bp); + else if (bp->b_flags & XBF_ASYNC) xfs_buf_relse(bp); } void -pagebuf_iodone( - xfs_buf_t *pb, - int dataio, +xfs_buf_ioend( + xfs_buf_t *bp, int schedule) { - pb->pb_flags &= ~(PBF_READ | PBF_WRITE); - if (pb->pb_error == 0) { - pb->pb_flags &= ~(PBF_PARTIAL | PBF_NONE); - } + bp->b_flags &= ~(XBF_READ | XBF_WRITE); + if (bp->b_error == 0) + bp->b_flags |= XBF_DONE; - PB_TRACE(pb, "iodone", pb->pb_iodone); + XB_TRACE(bp, "iodone", bp->b_iodone); - if ((pb->pb_iodone) || (pb->pb_flags & PBF_ASYNC)) { + if ((bp->b_iodone) || (bp->b_flags & XBF_ASYNC)) { if (schedule) { - INIT_WORK(&pb->pb_iodone_work, pagebuf_iodone_work, pb); - queue_work(dataio ? pagebuf_dataio_workqueue : - pagebuf_logio_workqueue, &pb->pb_iodone_work); + INIT_WORK(&bp->b_iodone_work, xfs_buf_iodone_work, bp); + queue_work(xfslogd_workqueue, &bp->b_iodone_work); } else { - pagebuf_iodone_work(pb); + xfs_buf_iodone_work(bp); } } else { - up(&pb->pb_iodonesema); + up(&bp->b_iodonesema); } } -/* - * pagebuf_ioerror - * - * pagebuf_ioerror sets the error code for a buffer. - */ void -pagebuf_ioerror( /* mark/clear buffer error flag */ - xfs_buf_t *pb, /* buffer to mark */ - int error) /* error to store (0 if none) */ +xfs_buf_ioerror( + xfs_buf_t *bp, + int error) { ASSERT(error >= 0 && error <= 0xffff); - pb->pb_error = (unsigned short)error; - PB_TRACE(pb, "ioerror", (unsigned long)error); + bp->b_error = (unsigned short)error; + XB_TRACE(bp, "ioerror", (unsigned long)error); } /* - * pagebuf_iostart - * - * pagebuf_iostart initiates I/O on a buffer, based on the flags supplied. - * If necessary, it will arrange for any disk space allocation required, - * and it will break up the request if the block mappings require it. - * The pb_iodone routine in the buffer supplied will only be called + * Initiate I/O on a buffer, based on the flags supplied. + * The b_iodone routine in the buffer supplied will only be called * when all of the subsidiary I/O requests, if any, have been completed. - * pagebuf_iostart calls the pagebuf_ioinitiate routine or - * pagebuf_iorequest, if the former routine is not defined, to start - * the I/O on a given low-level request. */ int -pagebuf_iostart( /* start I/O on a buffer */ - xfs_buf_t *pb, /* buffer to start */ - page_buf_flags_t flags) /* PBF_LOCK, PBF_ASYNC, PBF_READ, */ - /* PBF_WRITE, PBF_DELWRI, */ - /* PBF_DONT_BLOCK */ +xfs_buf_iostart( + xfs_buf_t *bp, + xfs_buf_flags_t flags) { int status = 0; - PB_TRACE(pb, "iostart", (unsigned long)flags); + XB_TRACE(bp, "iostart", (unsigned long)flags); - if (flags & PBF_DELWRI) { - pb->pb_flags &= ~(PBF_READ | PBF_WRITE | PBF_ASYNC); - pb->pb_flags |= flags & (PBF_DELWRI | PBF_ASYNC); - pagebuf_delwri_queue(pb, 1); + if (flags & XBF_DELWRI) { + bp->b_flags &= ~(XBF_READ | XBF_WRITE | XBF_ASYNC); + bp->b_flags |= flags & (XBF_DELWRI | XBF_ASYNC); + xfs_buf_delwri_queue(bp, 1); return status; } - pb->pb_flags &= ~(PBF_READ | PBF_WRITE | PBF_ASYNC | PBF_DELWRI | \ - PBF_READ_AHEAD | _PBF_RUN_QUEUES); - pb->pb_flags |= flags & (PBF_READ | PBF_WRITE | PBF_ASYNC | \ - PBF_READ_AHEAD | _PBF_RUN_QUEUES); + bp->b_flags &= ~(XBF_READ | XBF_WRITE | XBF_ASYNC | XBF_DELWRI | \ + XBF_READ_AHEAD | _XBF_RUN_QUEUES); + bp->b_flags |= flags & (XBF_READ | XBF_WRITE | XBF_ASYNC | \ + XBF_READ_AHEAD | _XBF_RUN_QUEUES); - BUG_ON(pb->pb_bn == XFS_BUF_DADDR_NULL); + BUG_ON(bp->b_bn == XFS_BUF_DADDR_NULL); /* For writes allow an alternate strategy routine to precede * the actual I/O request (which may not be issued at all in * a shutdown situation, for example). */ - status = (flags & PBF_WRITE) ? - pagebuf_iostrategy(pb) : pagebuf_iorequest(pb); + status = (flags & XBF_WRITE) ? + xfs_buf_iostrategy(bp) : xfs_buf_iorequest(bp); /* Wait for I/O if we are not an async request. * Note: async I/O request completion will release the buffer, * and that can already be done by this point. So using the * buffer pointer from here on, after async I/O, is invalid. */ - if (!status && !(flags & PBF_ASYNC)) - status = pagebuf_iowait(pb); + if (!status && !(flags & XBF_ASYNC)) + status = xfs_buf_iowait(bp); return status; } -/* - * Helper routine for pagebuf_iorequest - */ - STATIC __inline__ int -_pagebuf_iolocked( - xfs_buf_t *pb) +_xfs_buf_iolocked( + xfs_buf_t *bp) { - ASSERT(pb->pb_flags & (PBF_READ|PBF_WRITE)); - if (pb->pb_flags & PBF_READ) - return pb->pb_locked; + ASSERT(bp->b_flags & (XBF_READ | XBF_WRITE)); + if (bp->b_flags & XBF_READ) + return bp->b_locked; return 0; } STATIC __inline__ void -_pagebuf_iodone( - xfs_buf_t *pb, +_xfs_buf_ioend( + xfs_buf_t *bp, int schedule) { - if (atomic_dec_and_test(&pb->pb_io_remaining) == 1) { - pb->pb_locked = 0; - pagebuf_iodone(pb, (pb->pb_flags & PBF_FS_DATAIOD), schedule); + if (atomic_dec_and_test(&bp->b_io_remaining) == 1) { + bp->b_locked = 0; + xfs_buf_ioend(bp, schedule); } } STATIC int -bio_end_io_pagebuf( +xfs_buf_bio_end_io( struct bio *bio, unsigned int bytes_done, int error) { - xfs_buf_t *pb = (xfs_buf_t *)bio->bi_private; - unsigned int i, blocksize = pb->pb_target->pbr_bsize; - struct bio_vec *bvec = bio->bi_io_vec; + xfs_buf_t *bp = (xfs_buf_t *)bio->bi_private; + unsigned int blocksize = bp->b_target->bt_bsize; + struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1; if (bio->bi_size) return 1; if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) - pb->pb_error = EIO; + bp->b_error = EIO; - for (i = 0; i < bio->bi_vcnt; i++, bvec++) { + do { struct page *page = bvec->bv_page; - if (pb->pb_error) { + if (unlikely(bp->b_error)) { + if (bp->b_flags & XBF_READ) + ClearPageUptodate(page); SetPageError(page); - } else if (blocksize == PAGE_CACHE_SIZE) { + } else if (blocksize >= PAGE_CACHE_SIZE) { SetPageUptodate(page); } else if (!PagePrivate(page) && - (pb->pb_flags & _PBF_PAGE_CACHE)) { + (bp->b_flags & _XBF_PAGE_CACHE)) { set_page_region(page, bvec->bv_offset, bvec->bv_len); } - if (_pagebuf_iolocked(pb)) { + if (--bvec >= bio->bi_io_vec) + prefetchw(&bvec->bv_page->flags); + + if (_xfs_buf_iolocked(bp)) { unlock_page(page); } - } + } while (bvec >= bio->bi_io_vec); - _pagebuf_iodone(pb, 1); + _xfs_buf_ioend(bp, 1); bio_put(bio); return 0; } STATIC void -_pagebuf_ioapply( - xfs_buf_t *pb) +_xfs_buf_ioapply( + xfs_buf_t *bp) { int i, rw, map_i, total_nr_pages, nr_pages; struct bio *bio; - int offset = pb->pb_offset; - int size = pb->pb_count_desired; - sector_t sector = pb->pb_bn; - unsigned int blocksize = pb->pb_target->pbr_bsize; - int locking = _pagebuf_iolocked(pb); + int offset = bp->b_offset; + int size = bp->b_count_desired; + sector_t sector = bp->b_bn; + unsigned int blocksize = bp->b_target->bt_bsize; + int locking = _xfs_buf_iolocked(bp); - total_nr_pages = pb->pb_page_count; + total_nr_pages = bp->b_page_count; map_i = 0; - if (pb->pb_flags & _PBF_RUN_QUEUES) { - pb->pb_flags &= ~_PBF_RUN_QUEUES; - rw = (pb->pb_flags & PBF_READ) ? READ_SYNC : WRITE_SYNC; + if (bp->b_flags & _XBF_RUN_QUEUES) { + bp->b_flags &= ~_XBF_RUN_QUEUES; + rw = (bp->b_flags & XBF_READ) ? READ_SYNC : WRITE_SYNC; } else { - rw = (pb->pb_flags & PBF_READ) ? READ : WRITE; + rw = (bp->b_flags & XBF_READ) ? READ : WRITE; } - /* Special code path for reading a sub page size pagebuf in -- + if (bp->b_flags & XBF_ORDERED) { + ASSERT(!(bp->b_flags & XBF_READ)); + rw = WRITE_BARRIER; + } + + /* Special code path for reading a sub page size buffer in -- * we populate up the whole page, and hence the other metadata * in the same page. This optimization is only valid when the - * filesystem block size and the page size are equal. + * filesystem block size is not smaller than the page size. */ - if ((pb->pb_buffer_length < PAGE_CACHE_SIZE) && - (pb->pb_flags & PBF_READ) && locking && - (blocksize == PAGE_CACHE_SIZE)) { + if ((bp->b_buffer_length < PAGE_CACHE_SIZE) && + (bp->b_flags & XBF_READ) && locking && + (blocksize >= PAGE_CACHE_SIZE)) { bio = bio_alloc(GFP_NOIO, 1); - bio->bi_bdev = pb->pb_target->pbr_bdev; + bio->bi_bdev = bp->b_target->bt_bdev; bio->bi_sector = sector - (offset >> BBSHIFT); - bio->bi_end_io = bio_end_io_pagebuf; - bio->bi_private = pb; + bio->bi_end_io = xfs_buf_bio_end_io; + bio->bi_private = bp; - bio_add_page(bio, pb->pb_pages[0], PAGE_CACHE_SIZE, 0); + bio_add_page(bio, bp->b_pages[0], PAGE_CACHE_SIZE, 0); size = 0; - atomic_inc(&pb->pb_io_remaining); + atomic_inc(&bp->b_io_remaining); goto submit_io; } /* Lock down the pages which we need to for the request */ - if (locking && (pb->pb_flags & PBF_WRITE) && (pb->pb_locked == 0)) { + if (locking && (bp->b_flags & XBF_WRITE) && (bp->b_locked == 0)) { for (i = 0; size; i++) { int nbytes = PAGE_CACHE_SIZE - offset; - struct page *page = pb->pb_pages[i]; + struct page *page = bp->b_pages[i]; if (nbytes > size) nbytes = size; @@ -1338,30 +1205,30 @@ _pagebuf_ioapply( size -= nbytes; offset = 0; } - offset = pb->pb_offset; - size = pb->pb_count_desired; + offset = bp->b_offset; + size = bp->b_count_desired; } next_chunk: - atomic_inc(&pb->pb_io_remaining); + atomic_inc(&bp->b_io_remaining); nr_pages = BIO_MAX_SECTORS >> (PAGE_SHIFT - BBSHIFT); if (nr_pages > total_nr_pages) nr_pages = total_nr_pages; bio = bio_alloc(GFP_NOIO, nr_pages); - bio->bi_bdev = pb->pb_target->pbr_bdev; + bio->bi_bdev = bp->b_target->bt_bdev; bio->bi_sector = sector; - bio->bi_end_io = bio_end_io_pagebuf; - bio->bi_private = pb; + bio->bi_end_io = xfs_buf_bio_end_io; + bio->bi_private = bp; for (; size && nr_pages; nr_pages--, map_i++) { - int nbytes = PAGE_CACHE_SIZE - offset; + int rbytes, nbytes = PAGE_CACHE_SIZE - offset; if (nbytes > size) nbytes = size; - if (bio_add_page(bio, pb->pb_pages[map_i], - nbytes, offset) < nbytes) + rbytes = bio_add_page(bio, bp->b_pages[map_i], nbytes, offset); + if (rbytes < nbytes) break; offset = 0; @@ -1377,107 +1244,102 @@ submit_io: goto next_chunk; } else { bio_put(bio); - pagebuf_ioerror(pb, EIO); + xfs_buf_ioerror(bp, EIO); } } -/* - * pagebuf_iorequest -- the core I/O request routine. - */ int -pagebuf_iorequest( /* start real I/O */ - xfs_buf_t *pb) /* buffer to convey to device */ +xfs_buf_iorequest( + xfs_buf_t *bp) { - PB_TRACE(pb, "iorequest", 0); + XB_TRACE(bp, "iorequest", 0); - if (pb->pb_flags & PBF_DELWRI) { - pagebuf_delwri_queue(pb, 1); + if (bp->b_flags & XBF_DELWRI) { + xfs_buf_delwri_queue(bp, 1); return 0; } - if (pb->pb_flags & PBF_WRITE) { - _pagebuf_wait_unpin(pb); + if (bp->b_flags & XBF_WRITE) { + xfs_buf_wait_unpin(bp); } - pagebuf_hold(pb); + xfs_buf_hold(bp); /* Set the count to 1 initially, this will stop an I/O * completion callout which happens before we have started - * all the I/O from calling pagebuf_iodone too early. + * all the I/O from calling xfs_buf_ioend too early. */ - atomic_set(&pb->pb_io_remaining, 1); - _pagebuf_ioapply(pb); - _pagebuf_iodone(pb, 0); + atomic_set(&bp->b_io_remaining, 1); + _xfs_buf_ioapply(bp); + _xfs_buf_ioend(bp, 0); - pagebuf_rele(pb); + xfs_buf_rele(bp); return 0; } /* - * pagebuf_iowait - * - * pagebuf_iowait waits for I/O to complete on the buffer supplied. - * It returns immediately if no I/O is pending. In any case, it returns - * the error code, if any, or 0 if there is no error. + * Waits for I/O to complete on the buffer supplied. + * It returns immediately if no I/O is pending. + * It returns the I/O error code, if any, or 0 if there was no error. */ int -pagebuf_iowait( - xfs_buf_t *pb) +xfs_buf_iowait( + xfs_buf_t *bp) { - PB_TRACE(pb, "iowait", 0); - if (atomic_read(&pb->pb_io_remaining)) - blk_run_address_space(pb->pb_target->pbr_mapping); - down(&pb->pb_iodonesema); - PB_TRACE(pb, "iowaited", (long)pb->pb_error); - return pb->pb_error; + XB_TRACE(bp, "iowait", 0); + if (atomic_read(&bp->b_io_remaining)) + blk_run_address_space(bp->b_target->bt_mapping); + down(&bp->b_iodonesema); + XB_TRACE(bp, "iowaited", (long)bp->b_error); + return bp->b_error; } -caddr_t -pagebuf_offset( - xfs_buf_t *pb, +xfs_caddr_t +xfs_buf_offset( + xfs_buf_t *bp, size_t offset) { struct page *page; - offset += pb->pb_offset; + if (bp->b_flags & XBF_MAPPED) + return XFS_BUF_PTR(bp) + offset; - page = pb->pb_pages[offset >> PAGE_CACHE_SHIFT]; - return (caddr_t) page_address(page) + (offset & (PAGE_CACHE_SIZE - 1)); + offset += bp->b_offset; + page = bp->b_pages[offset >> PAGE_CACHE_SHIFT]; + return (xfs_caddr_t)page_address(page) + (offset & (PAGE_CACHE_SIZE-1)); } /* - * pagebuf_iomove - * * Move data into or out of a buffer. */ void -pagebuf_iomove( - xfs_buf_t *pb, /* buffer to process */ +xfs_buf_iomove( + xfs_buf_t *bp, /* buffer to process */ size_t boff, /* starting buffer offset */ size_t bsize, /* length to copy */ caddr_t data, /* data address */ - page_buf_rw_t mode) /* read/write flag */ + xfs_buf_rw_t mode) /* read/write/zero flag */ { size_t bend, cpoff, csize; struct page *page; bend = boff + bsize; while (boff < bend) { - page = pb->pb_pages[page_buf_btoct(boff + pb->pb_offset)]; - cpoff = page_buf_poff(boff + pb->pb_offset); + page = bp->b_pages[xfs_buf_btoct(boff + bp->b_offset)]; + cpoff = xfs_buf_poff(boff + bp->b_offset); csize = min_t(size_t, - PAGE_CACHE_SIZE-cpoff, pb->pb_count_desired-boff); + PAGE_CACHE_SIZE-cpoff, bp->b_count_desired-boff); ASSERT(((csize + cpoff) <= PAGE_CACHE_SIZE)); switch (mode) { - case PBRW_ZERO: + case XBRW_ZERO: memset(page_address(page) + cpoff, 0, csize); break; - case PBRW_READ: + case XBRW_READ: memcpy(data, page_address(page) + cpoff, csize); break; - case PBRW_WRITE: + case XBRW_WRITE: memcpy(page_address(page) + cpoff, data, csize); } @@ -1487,12 +1349,12 @@ pagebuf_iomove( } /* - * Handling of buftargs. + * Handling of buffer targets (buftargs). */ /* - * Wait for any bufs with callbacks that have been submitted but - * have not yet returned... walk the hash list for the target. + * Wait for any bufs with callbacks that have been submitted but + * have not yet returned... walk the hash list for the target. */ void xfs_wait_buftarg( @@ -1506,10 +1368,15 @@ xfs_wait_buftarg( hash = &btp->bt_hash[i]; again: spin_lock(&hash->bh_lock); - list_for_each_entry_safe(bp, n, &hash->bh_list, pb_hash_list) { - ASSERT(btp == bp->pb_target); - if (!(bp->pb_flags & PBF_FS_MANAGED)) { + list_for_each_entry_safe(bp, n, &hash->bh_list, b_hash_list) { + ASSERT(btp == bp->b_target); + if (!(bp->b_flags & XBF_FS_MANAGED)) { spin_unlock(&hash->bh_lock); + /* + * Catch superblock reference count leaks + * immediately + */ + BUG_ON(bp->b_bn == 0); delay(100); goto again; } @@ -1519,9 +1386,9 @@ again: } /* - * Allocate buffer hash table for a given target. - * For devices containing metadata (i.e. not the log/realtime devices) - * we need to allocate a much larger hash table. + * Allocate buffer hash table for a given target. + * For devices containing metadata (i.e. not the log/realtime devices) + * we need to allocate a much larger hash table. */ STATIC void xfs_alloc_bufhash( @@ -1544,11 +1411,34 @@ STATIC void xfs_free_bufhash( xfs_buftarg_t *btp) { - kmem_free(btp->bt_hash, - (1 << btp->bt_hashshift) * sizeof(xfs_bufhash_t)); + kmem_free(btp->bt_hash, (1<bt_hashshift) * sizeof(xfs_bufhash_t)); btp->bt_hash = NULL; } +/* + * buftarg list for delwrite queue processing + */ +STATIC LIST_HEAD(xfs_buftarg_list); +STATIC DEFINE_SPINLOCK(xfs_buftarg_lock); + +STATIC void +xfs_register_buftarg( + xfs_buftarg_t *btp) +{ + spin_lock(&xfs_buftarg_lock); + list_add(&btp->bt_list, &xfs_buftarg_list); + spin_unlock(&xfs_buftarg_lock); +} + +STATIC void +xfs_unregister_buftarg( + xfs_buftarg_t *btp) +{ + spin_lock(&xfs_buftarg_lock); + list_del(&btp->bt_list); + spin_unlock(&xfs_buftarg_lock); +} + void xfs_free_buftarg( xfs_buftarg_t *btp, @@ -1556,20 +1446,17 @@ xfs_free_buftarg( { xfs_flush_buftarg(btp, 1); if (external) - xfs_blkdev_put(btp->pbr_bdev); + xfs_blkdev_put(btp->bt_bdev); xfs_free_bufhash(btp); - iput(btp->pbr_mapping->host); - kmem_free(btp, sizeof(*btp)); -} + iput(btp->bt_mapping->host); -void -xfs_incore_relse( - xfs_buftarg_t *btp, - int delwri_only, - int wait) -{ - invalidate_bdev(btp->pbr_bdev, 1); - truncate_inode_pages(btp->pbr_mapping, 0LL); + /* Unregister the buftarg first so that we don't get a + * wakeup finding a non-existent task + */ + xfs_unregister_buftarg(btp); + kthread_stop(btp->bt_task); + + kmem_free(btp, sizeof(*btp)); } STATIC int @@ -1579,11 +1466,11 @@ xfs_setsize_buftarg_flags( unsigned int sectorsize, int verbose) { - btp->pbr_bsize = blocksize; - btp->pbr_sshift = ffs(sectorsize) - 1; - btp->pbr_smask = sectorsize - 1; + btp->bt_bsize = blocksize; + btp->bt_sshift = ffs(sectorsize) - 1; + btp->bt_smask = sectorsize - 1; - if (set_blocksize(btp->pbr_bdev, sectorsize)) { + if (set_blocksize(btp->bt_bdev, sectorsize)) { printk(KERN_WARNING "XFS: Cannot set_blocksize to %u on device %s\n", sectorsize, XFS_BUFTARG_NAME(btp)); @@ -1603,10 +1490,10 @@ xfs_setsize_buftarg_flags( } /* -* When allocating the initial buffer target we have not yet -* read in the superblock, so don't know what sized sectors -* are being used is at this early stage. Play safe. -*/ + * When allocating the initial buffer target we have not yet + * read in the superblock, so don't know what sized sectors + * are being used is at this early stage. Play safe. + */ STATIC int xfs_setsize_buftarg_early( xfs_buftarg_t *btp, @@ -1633,8 +1520,9 @@ xfs_mapping_buftarg( struct backing_dev_info *bdi; struct inode *inode; struct address_space *mapping; - static struct address_space_operations mapping_aops = { + static const struct address_space_operations mapping_aops = { .sync_page = block_sync_page, + .migratepage = fail_migrate_page, }; inode = new_inode(bdev->bd_inode->i_sb); @@ -1654,10 +1542,30 @@ xfs_mapping_buftarg( mapping->a_ops = &mapping_aops; mapping->backing_dev_info = bdi; mapping_set_gfp_mask(mapping, GFP_NOFS); - btp->pbr_mapping = mapping; + btp->bt_mapping = mapping; return 0; } +STATIC int +xfs_alloc_delwrite_queue( + xfs_buftarg_t *btp) +{ + int error = 0; + + INIT_LIST_HEAD(&btp->bt_list); + INIT_LIST_HEAD(&btp->bt_delwrite_queue); + spinlock_init(&btp->bt_delwrite_lock, "delwri_lock"); + btp->bt_flags = 0; + btp->bt_task = kthread_run(xfsbufd, btp, "xfsbufd"); + if (IS_ERR(btp->bt_task)) { + error = PTR_ERR(btp->bt_task); + goto out_error; + } + xfs_register_buftarg(btp); +out_error: + return error; +} + xfs_buftarg_t * xfs_alloc_buftarg( struct block_device *bdev, @@ -1667,12 +1575,14 @@ xfs_alloc_buftarg( btp = kmem_zalloc(sizeof(*btp), KM_SLEEP); - btp->pbr_dev = bdev->bd_dev; - btp->pbr_bdev = bdev; + btp->bt_dev = bdev->bd_dev; + btp->bt_bdev = bdev; if (xfs_setsize_buftarg_early(btp, bdev)) goto error; if (xfs_mapping_buftarg(btp, bdev)) goto error; + if (xfs_alloc_delwrite_queue(btp)) + goto error; xfs_alloc_bufhash(btp, external); return btp; @@ -1683,157 +1593,154 @@ error: /* - * Pagebuf delayed write buffer handling + * Delayed write buffer handling */ - -STATIC LIST_HEAD(pbd_delwrite_queue); -STATIC DEFINE_SPINLOCK(pbd_delwrite_lock); - STATIC void -pagebuf_delwri_queue( - xfs_buf_t *pb, +xfs_buf_delwri_queue( + xfs_buf_t *bp, int unlock) { - PB_TRACE(pb, "delwri_q", (long)unlock); - ASSERT(pb->pb_flags & PBF_DELWRI); + struct list_head *dwq = &bp->b_target->bt_delwrite_queue; + spinlock_t *dwlk = &bp->b_target->bt_delwrite_lock; + + XB_TRACE(bp, "delwri_q", (long)unlock); + ASSERT((bp->b_flags&(XBF_DELWRI|XBF_ASYNC)) == (XBF_DELWRI|XBF_ASYNC)); - spin_lock(&pbd_delwrite_lock); + spin_lock(dwlk); /* If already in the queue, dequeue and place at tail */ - if (!list_empty(&pb->pb_list)) { - if (unlock) { - atomic_dec(&pb->pb_hold); - } - list_del(&pb->pb_list); + if (!list_empty(&bp->b_list)) { + ASSERT(bp->b_flags & _XBF_DELWRI_Q); + if (unlock) + atomic_dec(&bp->b_hold); + list_del(&bp->b_list); } - list_add_tail(&pb->pb_list, &pbd_delwrite_queue); - pb->pb_queuetime = jiffies; - spin_unlock(&pbd_delwrite_lock); + bp->b_flags |= _XBF_DELWRI_Q; + list_add_tail(&bp->b_list, dwq); + bp->b_queuetime = jiffies; + spin_unlock(dwlk); if (unlock) - pagebuf_unlock(pb); + xfs_buf_unlock(bp); } void -pagebuf_delwri_dequeue( - xfs_buf_t *pb) +xfs_buf_delwri_dequeue( + xfs_buf_t *bp) { + spinlock_t *dwlk = &bp->b_target->bt_delwrite_lock; int dequeued = 0; - spin_lock(&pbd_delwrite_lock); - if ((pb->pb_flags & PBF_DELWRI) && !list_empty(&pb->pb_list)) { - list_del_init(&pb->pb_list); + spin_lock(dwlk); + if ((bp->b_flags & XBF_DELWRI) && !list_empty(&bp->b_list)) { + ASSERT(bp->b_flags & _XBF_DELWRI_Q); + list_del_init(&bp->b_list); dequeued = 1; } - pb->pb_flags &= ~PBF_DELWRI; - spin_unlock(&pbd_delwrite_lock); + bp->b_flags &= ~(XBF_DELWRI|_XBF_DELWRI_Q); + spin_unlock(dwlk); if (dequeued) - pagebuf_rele(pb); + xfs_buf_rele(bp); - PB_TRACE(pb, "delwri_dq", (long)dequeued); + XB_TRACE(bp, "delwri_dq", (long)dequeued); } STATIC void -pagebuf_runall_queues( +xfs_buf_runall_queues( struct workqueue_struct *queue) { flush_workqueue(queue); } -/* Defines for pagebuf daemon */ -STATIC DECLARE_COMPLETION(pagebuf_daemon_done); -STATIC struct task_struct *pagebuf_daemon_task; -STATIC int pagebuf_daemon_active; -STATIC int force_flush; -STATIC int force_sleep; - STATIC int -pagebuf_daemon_wakeup( +xfsbufd_wakeup( int priority, - unsigned int mask) + gfp_t mask) { - if (force_sleep) - return 0; - force_flush = 1; - barrier(); - wake_up_process(pagebuf_daemon_task); + xfs_buftarg_t *btp; + + spin_lock(&xfs_buftarg_lock); + list_for_each_entry(btp, &xfs_buftarg_list, bt_list) { + if (test_bit(XBT_FORCE_SLEEP, &btp->bt_flags)) + continue; + set_bit(XBT_FORCE_FLUSH, &btp->bt_flags); + wake_up_process(btp->bt_task); + } + spin_unlock(&xfs_buftarg_lock); return 0; } STATIC int -pagebuf_daemon( +xfsbufd( void *data) { struct list_head tmp; unsigned long age; - xfs_buftarg_t *target; - xfs_buf_t *pb, *n; + xfs_buftarg_t *target = (xfs_buftarg_t *)data; + xfs_buf_t *bp, *n; + struct list_head *dwq = &target->bt_delwrite_queue; + spinlock_t *dwlk = &target->bt_delwrite_lock; - /* Set up the thread */ - daemonize("xfsbufd"); current->flags |= PF_MEMALLOC; - pagebuf_daemon_task = current; - pagebuf_daemon_active = 1; - barrier(); - INIT_LIST_HEAD(&tmp); do { - if (unlikely(current->flags & PF_FREEZE)) { - force_sleep = 1; - refrigerator(PF_FREEZE); + if (unlikely(freezing(current))) { + set_bit(XBT_FORCE_SLEEP, &target->bt_flags); + refrigerator(); } else { - force_sleep = 0; + clear_bit(XBT_FORCE_SLEEP, &target->bt_flags); } - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout((xfs_buf_timer_centisecs * HZ) / 100); + schedule_timeout_interruptible( + xfs_buf_timer_centisecs * msecs_to_jiffies(10)); - age = (xfs_buf_age_centisecs * HZ) / 100; - spin_lock(&pbd_delwrite_lock); - list_for_each_entry_safe(pb, n, &pbd_delwrite_queue, pb_list) { - PB_TRACE(pb, "walkq1", (long)pagebuf_ispin(pb)); - ASSERT(pb->pb_flags & PBF_DELWRI); + age = xfs_buf_age_centisecs * msecs_to_jiffies(10); + spin_lock(dwlk); + list_for_each_entry_safe(bp, n, dwq, b_list) { + XB_TRACE(bp, "walkq1", (long)xfs_buf_ispin(bp)); + ASSERT(bp->b_flags & XBF_DELWRI); - if (!pagebuf_ispin(pb) && !pagebuf_cond_lock(pb)) { - if (!force_flush && + if (!xfs_buf_ispin(bp) && !xfs_buf_cond_lock(bp)) { + if (!test_bit(XBT_FORCE_FLUSH, + &target->bt_flags) && time_before(jiffies, - pb->pb_queuetime + age)) { - pagebuf_unlock(pb); + bp->b_queuetime + age)) { + xfs_buf_unlock(bp); break; } - pb->pb_flags &= ~PBF_DELWRI; - pb->pb_flags |= PBF_WRITE; - list_move(&pb->pb_list, &tmp); + bp->b_flags &= ~(XBF_DELWRI|_XBF_DELWRI_Q); + bp->b_flags |= XBF_WRITE; + list_move(&bp->b_list, &tmp); } } - spin_unlock(&pbd_delwrite_lock); + spin_unlock(dwlk); while (!list_empty(&tmp)) { - pb = list_entry(tmp.next, xfs_buf_t, pb_list); - target = pb->pb_target; + bp = list_entry(tmp.next, xfs_buf_t, b_list); + ASSERT(target == bp->b_target); - list_del_init(&pb->pb_list); - pagebuf_iostrategy(pb); + list_del_init(&bp->b_list); + xfs_buf_iostrategy(bp); - blk_run_address_space(target->pbr_mapping); + blk_run_address_space(target->bt_mapping); } if (as_list_len > 0) purge_addresses(); - force_flush = 0; - } while (pagebuf_daemon_active); + clear_bit(XBT_FORCE_FLUSH, &target->bt_flags); + } while (!kthread_should_stop()); - complete_and_exit(&pagebuf_daemon_done, 0); + return 0; } /* - * Go through all incore buffers, and release buffers if they belong to - * the given device. This is used in filesystem error handling to - * preserve the consistency of its metadata. + * Go through all incore buffers, and release buffers if they belong to + * the given device. This is used in filesystem error handling to + * preserve the consistency of its metadata. */ int xfs_flush_buftarg( @@ -1841,147 +1748,108 @@ xfs_flush_buftarg( int wait) { struct list_head tmp; - xfs_buf_t *pb, *n; + xfs_buf_t *bp, *n; int pincount = 0; + struct list_head *dwq = &target->bt_delwrite_queue; + spinlock_t *dwlk = &target->bt_delwrite_lock; - pagebuf_runall_queues(pagebuf_dataio_workqueue); - pagebuf_runall_queues(pagebuf_logio_workqueue); + xfs_buf_runall_queues(xfsdatad_workqueue); + xfs_buf_runall_queues(xfslogd_workqueue); INIT_LIST_HEAD(&tmp); - spin_lock(&pbd_delwrite_lock); - list_for_each_entry_safe(pb, n, &pbd_delwrite_queue, pb_list) { - - if (pb->pb_target != target) - continue; - - ASSERT(pb->pb_flags & PBF_DELWRI); - PB_TRACE(pb, "walkq2", (long)pagebuf_ispin(pb)); - if (pagebuf_ispin(pb)) { + spin_lock(dwlk); + list_for_each_entry_safe(bp, n, dwq, b_list) { + ASSERT(bp->b_target == target); + ASSERT(bp->b_flags & (XBF_DELWRI | _XBF_DELWRI_Q)); + XB_TRACE(bp, "walkq2", (long)xfs_buf_ispin(bp)); + if (xfs_buf_ispin(bp)) { pincount++; continue; } - pb->pb_flags &= ~PBF_DELWRI; - pb->pb_flags |= PBF_WRITE; - list_move(&pb->pb_list, &tmp); + list_move(&bp->b_list, &tmp); } - spin_unlock(&pbd_delwrite_lock); + spin_unlock(dwlk); /* * Dropped the delayed write list lock, now walk the temporary list */ - list_for_each_entry_safe(pb, n, &tmp, pb_list) { + list_for_each_entry_safe(bp, n, &tmp, b_list) { + xfs_buf_lock(bp); + bp->b_flags &= ~(XBF_DELWRI|_XBF_DELWRI_Q); + bp->b_flags |= XBF_WRITE; if (wait) - pb->pb_flags &= ~PBF_ASYNC; + bp->b_flags &= ~XBF_ASYNC; else - list_del_init(&pb->pb_list); + list_del_init(&bp->b_list); - pagebuf_lock(pb); - pagebuf_iostrategy(pb); + xfs_buf_iostrategy(bp); } /* * Remaining list items must be flushed before returning */ while (!list_empty(&tmp)) { - pb = list_entry(tmp.next, xfs_buf_t, pb_list); + bp = list_entry(tmp.next, xfs_buf_t, b_list); - list_del_init(&pb->pb_list); - xfs_iowait(pb); - xfs_buf_relse(pb); + list_del_init(&bp->b_list); + xfs_iowait(bp); + xfs_buf_relse(bp); } if (wait) - blk_run_address_space(target->pbr_mapping); + blk_run_address_space(target->bt_mapping); return pincount; } -STATIC int -pagebuf_daemon_start(void) +int __init +xfs_buf_init(void) { - int rval; - - pagebuf_logio_workqueue = create_workqueue("xfslogd"); - if (!pagebuf_logio_workqueue) - return -ENOMEM; - - pagebuf_dataio_workqueue = create_workqueue("xfsdatad"); - if (!pagebuf_dataio_workqueue) { - destroy_workqueue(pagebuf_logio_workqueue); - return -ENOMEM; - } - - rval = kernel_thread(pagebuf_daemon, NULL, CLONE_FS|CLONE_FILES); - if (rval < 0) { - destroy_workqueue(pagebuf_logio_workqueue); - destroy_workqueue(pagebuf_dataio_workqueue); - } +#ifdef XFS_BUF_TRACE + xfs_buf_trace_buf = ktrace_alloc(XFS_BUF_TRACE_SIZE, KM_SLEEP); +#endif - return rval; -} + xfs_buf_zone = kmem_zone_init_flags(sizeof(xfs_buf_t), "xfs_buf", + KM_ZONE_HWALIGN, NULL); + if (!xfs_buf_zone) + goto out_free_trace_buf; -/* - * pagebuf_daemon_stop - * - * Note: do not mark as __exit, it is called from pagebuf_terminate. - */ -STATIC void -pagebuf_daemon_stop(void) -{ - pagebuf_daemon_active = 0; - barrier(); - wait_for_completion(&pagebuf_daemon_done); + xfslogd_workqueue = create_workqueue("xfslogd"); + if (!xfslogd_workqueue) + goto out_free_buf_zone; - destroy_workqueue(pagebuf_logio_workqueue); - destroy_workqueue(pagebuf_dataio_workqueue); -} + xfsdatad_workqueue = create_workqueue("xfsdatad"); + if (!xfsdatad_workqueue) + goto out_destroy_xfslogd_workqueue; -/* - * Initialization and Termination - */ + xfs_buf_shake = kmem_shake_register(xfsbufd_wakeup); + if (!xfs_buf_shake) + goto out_destroy_xfsdatad_workqueue; -int __init -pagebuf_init(void) -{ - pagebuf_cache = kmem_cache_create("xfs_buf_t", sizeof(xfs_buf_t), 0, - SLAB_HWCACHE_ALIGN, NULL, NULL); - if (pagebuf_cache == NULL) { - printk("XFS: couldn't init xfs_buf_t cache\n"); - pagebuf_terminate(); - return -ENOMEM; - } + return 0; -#ifdef PAGEBUF_TRACE - pagebuf_trace_buf = ktrace_alloc(PAGEBUF_TRACE_SIZE, KM_SLEEP); + out_destroy_xfsdatad_workqueue: + destroy_workqueue(xfsdatad_workqueue); + out_destroy_xfslogd_workqueue: + destroy_workqueue(xfslogd_workqueue); + out_free_buf_zone: + kmem_zone_destroy(xfs_buf_zone); + out_free_trace_buf: +#ifdef XFS_BUF_TRACE + ktrace_free(xfs_buf_trace_buf); #endif - - pagebuf_daemon_start(); - - pagebuf_shake = kmem_shake_register(pagebuf_daemon_wakeup); - if (pagebuf_shake == NULL) { - pagebuf_terminate(); - return -ENOMEM; - } - - return 0; + return -ENOMEM; } - -/* - * pagebuf_terminate. - * - * Note: do not mark as __exit, this is also called from the __init code. - */ void -pagebuf_terminate(void) +xfs_buf_terminate(void) { - pagebuf_daemon_stop(); - -#ifdef PAGEBUF_TRACE - ktrace_free(pagebuf_trace_buf); + kmem_shake_deregister(xfs_buf_shake); + destroy_workqueue(xfsdatad_workqueue); + destroy_workqueue(xfslogd_workqueue); + kmem_zone_destroy(xfs_buf_zone); +#ifdef XFS_BUF_TRACE + ktrace_free(xfs_buf_trace_buf); #endif - - kmem_zone_destroy(pagebuf_cache); - kmem_shake_deregister(pagebuf_shake); } diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h index 74deed8e6..7858703ed 100644 --- a/fs/xfs/linux-2.6/xfs_buf.h +++ b/fs/xfs/linux-2.6/xfs_buf.h @@ -1,43 +1,23 @@ /* - * Copyright (c) 2000-2004 Silicon Graphics, Inc. All Rights Reserved. + * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * All Rights Reserved. * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as + * 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. * - * This program is distributed in the hope that it would be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * This program is distributed in the hope that it would 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. * - * Further, this software is distributed without any warranty that it is - * free of the rightful claim of any third person regarding infringement - * or the like. Any license provided herein, whether implied or - * otherwise, applies only to this software file. Patent licenses, if - * any, provided herein do not apply to combinations of this program with - * other software, or any other product whatsoever. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston MA 02111-1307, USA. - * - * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, - * Mountain View, CA 94043, or: - * - * http://www.sgi.com - * - * For further information regarding this notice, see: - * - * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ - */ - -/* - * Written by Steve Lord, Jim Mostek, Russell Cattelan at SGI + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - #ifndef __XFS_BUF_H__ #define __XFS_BUF_H__ -#include #include #include #include @@ -51,49 +31,47 @@ * Base types */ -#define XFS_BUF_DADDR_NULL ((xfs_daddr_t) (-1LL)) - -#define page_buf_ctob(pp) ((pp) * PAGE_CACHE_SIZE) -#define page_buf_btoc(dd) (((dd) + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT) -#define page_buf_btoct(dd) ((dd) >> PAGE_CACHE_SHIFT) -#define page_buf_poff(aa) ((aa) & ~PAGE_CACHE_MASK) - -typedef enum page_buf_rw_e { - PBRW_READ = 1, /* transfer into target memory */ - PBRW_WRITE = 2, /* transfer from target memory */ - PBRW_ZERO = 3 /* Zero target memory */ -} page_buf_rw_t; - - -typedef enum page_buf_flags_e { /* pb_flags values */ - PBF_READ = (1 << 0), /* buffer intended for reading from device */ - PBF_WRITE = (1 << 1), /* buffer intended for writing to device */ - PBF_MAPPED = (1 << 2), /* buffer mapped (pb_addr valid) */ - PBF_PARTIAL = (1 << 3), /* buffer partially read */ - PBF_ASYNC = (1 << 4), /* initiator will not wait for completion */ - PBF_NONE = (1 << 5), /* buffer not read at all */ - PBF_DELWRI = (1 << 6), /* buffer has dirty pages */ - PBF_STALE = (1 << 7), /* buffer has been staled, do not find it */ - PBF_FS_MANAGED = (1 << 8), /* filesystem controls freeing memory */ - PBF_FS_DATAIOD = (1 << 9), /* schedule IO completion on fs datad */ - PBF_FORCEIO = (1 << 10), /* ignore any cache state */ - PBF_FLUSH = (1 << 11), /* flush disk write cache */ - PBF_READ_AHEAD = (1 << 12), /* asynchronous read-ahead */ +#define XFS_BUF_DADDR_NULL ((xfs_daddr_t) (-1LL)) + +#define xfs_buf_ctob(pp) ((pp) * PAGE_CACHE_SIZE) +#define xfs_buf_btoc(dd) (((dd) + PAGE_CACHE_SIZE-1) >> PAGE_CACHE_SHIFT) +#define xfs_buf_btoct(dd) ((dd) >> PAGE_CACHE_SHIFT) +#define xfs_buf_poff(aa) ((aa) & ~PAGE_CACHE_MASK) + +typedef enum { + XBRW_READ = 1, /* transfer into target memory */ + XBRW_WRITE = 2, /* transfer from target memory */ + XBRW_ZERO = 3, /* Zero target memory */ +} xfs_buf_rw_t; + +typedef enum { + XBF_READ = (1 << 0), /* buffer intended for reading from device */ + XBF_WRITE = (1 << 1), /* buffer intended for writing to device */ + XBF_MAPPED = (1 << 2), /* buffer mapped (b_addr valid) */ + XBF_ASYNC = (1 << 4), /* initiator will not wait for completion */ + XBF_DONE = (1 << 5), /* all pages in the buffer uptodate */ + XBF_DELWRI = (1 << 6), /* buffer has dirty pages */ + XBF_STALE = (1 << 7), /* buffer has been staled, do not find it */ + XBF_FS_MANAGED = (1 << 8), /* filesystem controls freeing memory */ + XBF_ORDERED = (1 << 11), /* use ordered writes */ + XBF_READ_AHEAD = (1 << 12), /* asynchronous read-ahead */ /* flags used only as arguments to access routines */ - PBF_LOCK = (1 << 14), /* lock requested */ - PBF_TRYLOCK = (1 << 15), /* lock requested, but do not wait */ - PBF_DONT_BLOCK = (1 << 16), /* do not block in current thread */ + XBF_LOCK = (1 << 14), /* lock requested */ + XBF_TRYLOCK = (1 << 15), /* lock requested, but do not wait */ + XBF_DONT_BLOCK = (1 << 16), /* do not block in current thread */ /* flags used only internally */ - _PBF_PAGE_CACHE = (1 << 17),/* backed by pagecache */ - _PBF_KMEM_ALLOC = (1 << 18),/* backed by kmem_alloc() */ - _PBF_RUN_QUEUES = (1 << 19),/* run block device task queue */ -} page_buf_flags_t; + _XBF_PAGE_CACHE = (1 << 17),/* backed by pagecache */ + _XBF_KMEM_ALLOC = (1 << 18),/* backed by kmem_alloc() */ + _XBF_RUN_QUEUES = (1 << 19),/* run block device task queue */ + _XBF_DELWRI_Q = (1 << 21), /* buffer on delwri queue */ +} xfs_buf_flags_t; -#define PBF_UPDATE (PBF_READ | PBF_WRITE) -#define PBF_NOT_DONE(pb) (((pb)->pb_flags & (PBF_PARTIAL|PBF_NONE)) != 0) -#define PBF_DONE(pb) (((pb)->pb_flags & (PBF_PARTIAL|PBF_NONE)) == 0) +typedef enum { + XBT_FORCE_SLEEP = (0 << 1), + XBT_FORCE_FLUSH = (1 << 1), +} xfs_buftarg_flags_t; typedef struct xfs_bufhash { struct list_head bh_list; @@ -101,491 +79,350 @@ typedef struct xfs_bufhash { } xfs_bufhash_t; typedef struct xfs_buftarg { - dev_t pbr_dev; - struct block_device *pbr_bdev; - struct address_space *pbr_mapping; - unsigned int pbr_bsize; - unsigned int pbr_sshift; - size_t pbr_smask; - - /* per-device buffer hash table */ + dev_t bt_dev; + struct block_device *bt_bdev; + struct address_space *bt_mapping; + unsigned int bt_bsize; + unsigned int bt_sshift; + size_t bt_smask; + + /* per device buffer hash table */ uint bt_hashmask; uint bt_hashshift; xfs_bufhash_t *bt_hash; + + /* per device delwri queue */ + struct task_struct *bt_task; + struct list_head bt_list; + struct list_head bt_delwrite_queue; + spinlock_t bt_delwrite_lock; + unsigned long bt_flags; } xfs_buftarg_t; /* - * xfs_buf_t: Buffer structure for page cache-based buffers + * xfs_buf_t: Buffer structure for pagecache-based buffers + * + * This buffer structure is used by the pagecache buffer management routines + * to refer to an assembly of pages forming a logical buffer. * - * This buffer structure is used by the page cache buffer management routines - * to refer to an assembly of pages forming a logical buffer. The actual I/O - * is performed with buffer_head structures, as required by drivers. - * - * The buffer structure is used on temporary basis only, and discarded when - * released. The real data storage is recorded in the page cache. Metadata is + * The buffer structure is used on a temporary basis only, and discarded when + * released. The real data storage is recorded in the pagecache. Buffers are * hashed to the block device on which the file system resides. */ struct xfs_buf; +typedef void (*xfs_buf_iodone_t)(struct xfs_buf *); +typedef void (*xfs_buf_relse_t)(struct xfs_buf *); +typedef int (*xfs_buf_bdstrat_t)(struct xfs_buf *); -/* call-back function on I/O completion */ -typedef void (*page_buf_iodone_t)(struct xfs_buf *); -/* call-back function on I/O completion */ -typedef void (*page_buf_relse_t)(struct xfs_buf *); -/* pre-write function */ -typedef int (*page_buf_bdstrat_t)(struct xfs_buf *); - -#define PB_PAGES 2 +#define XB_PAGES 2 typedef struct xfs_buf { - struct semaphore pb_sema; /* semaphore for lockables */ - unsigned long pb_queuetime; /* time buffer was queued */ - atomic_t pb_pin_count; /* pin count */ - wait_queue_head_t pb_waiters; /* unpin waiters */ - struct list_head pb_list; - page_buf_flags_t pb_flags; /* status flags */ - struct list_head pb_hash_list; /* hash table list */ - xfs_bufhash_t *pb_hash; /* hash table list start */ - xfs_buftarg_t *pb_target; /* buffer target (device) */ - atomic_t pb_hold; /* reference count */ - xfs_daddr_t pb_bn; /* block number for I/O */ - loff_t pb_file_offset; /* offset in file */ - size_t pb_buffer_length; /* size of buffer in bytes */ - size_t pb_count_desired; /* desired transfer size */ - void *pb_addr; /* virtual address of buffer */ - struct work_struct pb_iodone_work; - atomic_t pb_io_remaining;/* #outstanding I/O requests */ - page_buf_iodone_t pb_iodone; /* I/O completion function */ - page_buf_relse_t pb_relse; /* releasing function */ - page_buf_bdstrat_t pb_strat; /* pre-write function */ - struct semaphore pb_iodonesema; /* Semaphore for I/O waiters */ - void *pb_fspriv; - void *pb_fspriv2; - void *pb_fspriv3; - unsigned short pb_error; /* error code on I/O */ - unsigned short pb_locked; /* page array is locked */ - unsigned int pb_page_count; /* size of page array */ - unsigned int pb_offset; /* page offset in first page */ - struct page **pb_pages; /* array of page pointers */ - struct page *pb_page_array[PB_PAGES]; /* inline pages */ -#ifdef PAGEBUF_LOCK_TRACKING - int pb_last_holder; + struct semaphore b_sema; /* semaphore for lockables */ + unsigned long b_queuetime; /* time buffer was queued */ + atomic_t b_pin_count; /* pin count */ + wait_queue_head_t b_waiters; /* unpin waiters */ + struct list_head b_list; + xfs_buf_flags_t b_flags; /* status flags */ + struct list_head b_hash_list; /* hash table list */ + xfs_bufhash_t *b_hash; /* hash table list start */ + xfs_buftarg_t *b_target; /* buffer target (device) */ + atomic_t b_hold; /* reference count */ + xfs_daddr_t b_bn; /* block number for I/O */ + xfs_off_t b_file_offset; /* offset in file */ + size_t b_buffer_length;/* size of buffer in bytes */ + size_t b_count_desired;/* desired transfer size */ + void *b_addr; /* virtual address of buffer */ + struct work_struct b_iodone_work; + atomic_t b_io_remaining; /* #outstanding I/O requests */ + xfs_buf_iodone_t b_iodone; /* I/O completion function */ + xfs_buf_relse_t b_relse; /* releasing function */ + xfs_buf_bdstrat_t b_strat; /* pre-write function */ + struct semaphore b_iodonesema; /* Semaphore for I/O waiters */ + void *b_fspriv; + void *b_fspriv2; + void *b_fspriv3; + unsigned short b_error; /* error code on I/O */ + unsigned short b_locked; /* page array is locked */ + unsigned int b_page_count; /* size of page array */ + unsigned int b_offset; /* page offset in first page */ + struct page **b_pages; /* array of page pointers */ + struct page *b_page_array[XB_PAGES]; /* inline pages */ +#ifdef XFS_BUF_LOCK_TRACKING + int b_last_holder; #endif } xfs_buf_t; /* Finding and Reading Buffers */ - -extern xfs_buf_t *_pagebuf_find( /* find buffer for block if */ - /* the block is in memory */ - xfs_buftarg_t *, /* inode for block */ - loff_t, /* starting offset of range */ - size_t, /* length of range */ - page_buf_flags_t, /* PBF_LOCK */ - xfs_buf_t *); /* newly allocated buffer */ - +extern xfs_buf_t *_xfs_buf_find(xfs_buftarg_t *, xfs_off_t, size_t, + xfs_buf_flags_t, xfs_buf_t *); #define xfs_incore(buftarg,blkno,len,lockit) \ - _pagebuf_find(buftarg, blkno ,len, lockit, NULL) - -extern xfs_buf_t *xfs_buf_get_flags( /* allocate a buffer */ - xfs_buftarg_t *, /* inode for buffer */ - loff_t, /* starting offset of range */ - size_t, /* length of range */ - page_buf_flags_t); /* PBF_LOCK, PBF_READ, */ - /* PBF_ASYNC */ + _xfs_buf_find(buftarg, blkno ,len, lockit, NULL) +extern xfs_buf_t *xfs_buf_get_flags(xfs_buftarg_t *, xfs_off_t, size_t, + xfs_buf_flags_t); #define xfs_buf_get(target, blkno, len, flags) \ - xfs_buf_get_flags((target), (blkno), (len), PBF_LOCK | PBF_MAPPED) - -extern xfs_buf_t *xfs_buf_read_flags( /* allocate and read a buffer */ - xfs_buftarg_t *, /* inode for buffer */ - loff_t, /* starting offset of range */ - size_t, /* length of range */ - page_buf_flags_t); /* PBF_LOCK, PBF_ASYNC */ + xfs_buf_get_flags((target), (blkno), (len), XBF_LOCK | XBF_MAPPED) +extern xfs_buf_t *xfs_buf_read_flags(xfs_buftarg_t *, xfs_off_t, size_t, + xfs_buf_flags_t); #define xfs_buf_read(target, blkno, len, flags) \ - xfs_buf_read_flags((target), (blkno), (len), PBF_LOCK | PBF_MAPPED) - -extern xfs_buf_t *pagebuf_lookup( - xfs_buftarg_t *, - loff_t, /* starting offset of range */ - size_t, /* length of range */ - page_buf_flags_t); /* PBF_READ, PBF_WRITE, */ - /* PBF_FORCEIO, */ - -extern xfs_buf_t *pagebuf_get_empty( /* allocate pagebuf struct with */ - /* no memory or disk address */ - size_t len, - xfs_buftarg_t *); /* mount point "fake" inode */ - -extern xfs_buf_t *pagebuf_get_no_daddr(/* allocate pagebuf struct */ - /* without disk address */ - size_t len, - xfs_buftarg_t *); /* mount point "fake" inode */ - -extern int pagebuf_associate_memory( - xfs_buf_t *, - void *, - size_t); - -extern void pagebuf_hold( /* increment reference count */ - xfs_buf_t *); /* buffer to hold */ - -extern void pagebuf_readahead( /* read ahead into cache */ - xfs_buftarg_t *, /* target for buffer (or NULL) */ - loff_t, /* starting offset of range */ - size_t, /* length of range */ - page_buf_flags_t); /* additional read flags */ - -/* Releasing Buffers */ + xfs_buf_read_flags((target), (blkno), (len), XBF_LOCK | XBF_MAPPED) -extern void pagebuf_free( /* deallocate a buffer */ - xfs_buf_t *); /* buffer to deallocate */ +extern xfs_buf_t *xfs_buf_get_empty(size_t, xfs_buftarg_t *); +extern xfs_buf_t *xfs_buf_get_noaddr(size_t, xfs_buftarg_t *); +extern int xfs_buf_associate_memory(xfs_buf_t *, void *, size_t); +extern void xfs_buf_hold(xfs_buf_t *); +extern void xfs_buf_readahead(xfs_buftarg_t *, xfs_off_t, size_t, + xfs_buf_flags_t); -extern void pagebuf_rele( /* release hold on a buffer */ - xfs_buf_t *); /* buffer to release */ +/* Releasing Buffers */ +extern void xfs_buf_free(xfs_buf_t *); +extern void xfs_buf_rele(xfs_buf_t *); /* Locking and Unlocking Buffers */ - -extern int pagebuf_cond_lock( /* lock buffer, if not locked */ - /* (returns -EBUSY if locked) */ - xfs_buf_t *); /* buffer to lock */ - -extern int pagebuf_lock_value( /* return count on lock */ - xfs_buf_t *); /* buffer to check */ - -extern int pagebuf_lock( /* lock buffer */ - xfs_buf_t *); /* buffer to lock */ - -extern void pagebuf_unlock( /* unlock buffer */ - xfs_buf_t *); /* buffer to unlock */ +extern int xfs_buf_cond_lock(xfs_buf_t *); +extern int xfs_buf_lock_value(xfs_buf_t *); +extern void xfs_buf_lock(xfs_buf_t *); +extern void xfs_buf_unlock(xfs_buf_t *); /* Buffer Read and Write Routines */ - -extern void pagebuf_iodone( /* mark buffer I/O complete */ - xfs_buf_t *, /* buffer to mark */ - int, /* use data/log helper thread. */ - int); /* run completion locally, or in - * a helper thread. */ - -extern void pagebuf_ioerror( /* mark buffer in error (or not) */ - xfs_buf_t *, /* buffer to mark */ - int); /* error to store (0 if none) */ - -extern int pagebuf_iostart( /* start I/O on a buffer */ - xfs_buf_t *, /* buffer to start */ - page_buf_flags_t); /* PBF_LOCK, PBF_ASYNC, */ - /* PBF_READ, PBF_WRITE, */ - /* PBF_DELWRI */ - -extern int pagebuf_iorequest( /* start real I/O */ - xfs_buf_t *); /* buffer to convey to device */ - -extern int pagebuf_iowait( /* wait for buffer I/O done */ - xfs_buf_t *); /* buffer to wait on */ - -extern void pagebuf_iomove( /* move data in/out of pagebuf */ - xfs_buf_t *, /* buffer to manipulate */ - size_t, /* starting buffer offset */ - size_t, /* length in buffer */ - caddr_t, /* data pointer */ - page_buf_rw_t); /* direction */ - -static inline int pagebuf_iostrategy(xfs_buf_t *pb) +extern void xfs_buf_ioend(xfs_buf_t *, int); +extern void xfs_buf_ioerror(xfs_buf_t *, int); +extern int xfs_buf_iostart(xfs_buf_t *, xfs_buf_flags_t); +extern int xfs_buf_iorequest(xfs_buf_t *); +extern int xfs_buf_iowait(xfs_buf_t *); +extern void xfs_buf_iomove(xfs_buf_t *, size_t, size_t, xfs_caddr_t, + xfs_buf_rw_t); + +static inline int xfs_buf_iostrategy(xfs_buf_t *bp) { - return pb->pb_strat ? pb->pb_strat(pb) : pagebuf_iorequest(pb); + return bp->b_strat ? bp->b_strat(bp) : xfs_buf_iorequest(bp); } -static inline int pagebuf_geterror(xfs_buf_t *pb) +static inline int xfs_buf_geterror(xfs_buf_t *bp) { - return pb ? pb->pb_error : ENOMEM; + return bp ? bp->b_error : ENOMEM; } /* Buffer Utility Routines */ - -extern caddr_t pagebuf_offset( /* pointer at offset in buffer */ - xfs_buf_t *, /* buffer to offset into */ - size_t); /* offset */ +extern xfs_caddr_t xfs_buf_offset(xfs_buf_t *, size_t); /* Pinning Buffer Storage in Memory */ - -extern void pagebuf_pin( /* pin buffer in memory */ - xfs_buf_t *); /* buffer to pin */ - -extern void pagebuf_unpin( /* unpin buffered data */ - xfs_buf_t *); /* buffer to unpin */ - -extern int pagebuf_ispin( /* check if buffer is pinned */ - xfs_buf_t *); /* buffer to check */ +extern void xfs_buf_pin(xfs_buf_t *); +extern void xfs_buf_unpin(xfs_buf_t *); +extern int xfs_buf_ispin(xfs_buf_t *); /* Delayed Write Buffer Routines */ - -extern void pagebuf_delwri_dequeue(xfs_buf_t *); +extern void xfs_buf_delwri_dequeue(xfs_buf_t *); /* Buffer Daemon Setup Routines */ +extern int xfs_buf_init(void); +extern void xfs_buf_terminate(void); -extern int pagebuf_init(void); -extern void pagebuf_terminate(void); - - -#ifdef PAGEBUF_TRACE -extern ktrace_t *pagebuf_trace_buf; -extern void pagebuf_trace( - xfs_buf_t *, /* buffer being traced */ - char *, /* description of operation */ - void *, /* arbitrary diagnostic value */ - void *); /* return address */ +#ifdef XFS_BUF_TRACE +extern ktrace_t *xfs_buf_trace_buf; +extern void xfs_buf_trace(xfs_buf_t *, char *, void *, void *); #else -# define pagebuf_trace(pb, id, ptr, ra) do { } while (0) +#define xfs_buf_trace(bp,id,ptr,ra) do { } while (0) #endif -#define pagebuf_target_name(target) \ - ({ char __b[BDEVNAME_SIZE]; bdevname((target)->pbr_bdev, __b); __b; }) +#define xfs_buf_target_name(target) \ + ({ char __b[BDEVNAME_SIZE]; bdevname((target)->bt_bdev, __b); __b; }) +#define XFS_B_ASYNC XBF_ASYNC +#define XFS_B_DELWRI XBF_DELWRI +#define XFS_B_READ XBF_READ +#define XFS_B_WRITE XBF_WRITE +#define XFS_B_STALE XBF_STALE +#define XFS_BUF_TRYLOCK XBF_TRYLOCK +#define XFS_INCORE_TRYLOCK XBF_TRYLOCK +#define XFS_BUF_LOCK XBF_LOCK +#define XFS_BUF_MAPPED XBF_MAPPED +#define BUF_BUSY XBF_DONT_BLOCK -/* These are just for xfs_syncsub... it sets an internal variable - * then passes it to VOP_FLUSH_PAGES or adds the flags to a newly gotten buf_t - */ -#define XFS_B_ASYNC PBF_ASYNC -#define XFS_B_DELWRI PBF_DELWRI -#define XFS_B_READ PBF_READ -#define XFS_B_WRITE PBF_WRITE -#define XFS_B_STALE PBF_STALE - -#define XFS_BUF_TRYLOCK PBF_TRYLOCK -#define XFS_INCORE_TRYLOCK PBF_TRYLOCK -#define XFS_BUF_LOCK PBF_LOCK -#define XFS_BUF_MAPPED PBF_MAPPED - -#define BUF_BUSY PBF_DONT_BLOCK - -#define XFS_BUF_BFLAGS(x) ((x)->pb_flags) -#define XFS_BUF_ZEROFLAGS(x) \ - ((x)->pb_flags &= ~(PBF_READ|PBF_WRITE|PBF_ASYNC|PBF_DELWRI)) - -#define XFS_BUF_STALE(x) ((x)->pb_flags |= XFS_B_STALE) -#define XFS_BUF_UNSTALE(x) ((x)->pb_flags &= ~XFS_B_STALE) -#define XFS_BUF_ISSTALE(x) ((x)->pb_flags & XFS_B_STALE) -#define XFS_BUF_SUPER_STALE(x) do { \ - XFS_BUF_STALE(x); \ - pagebuf_delwri_dequeue(x); \ - XFS_BUF_DONE(x); \ - } while (0) +#define XFS_BUF_BFLAGS(bp) ((bp)->b_flags) +#define XFS_BUF_ZEROFLAGS(bp) ((bp)->b_flags &= \ + ~(XBF_READ|XBF_WRITE|XBF_ASYNC|XBF_DELWRI|XBF_ORDERED)) -#define XFS_BUF_MANAGE PBF_FS_MANAGED -#define XFS_BUF_UNMANAGE(x) ((x)->pb_flags &= ~PBF_FS_MANAGED) - -#define XFS_BUF_DELAYWRITE(x) ((x)->pb_flags |= PBF_DELWRI) -#define XFS_BUF_UNDELAYWRITE(x) pagebuf_delwri_dequeue(x) -#define XFS_BUF_ISDELAYWRITE(x) ((x)->pb_flags & PBF_DELWRI) - -#define XFS_BUF_ERROR(x,no) pagebuf_ioerror(x,no) -#define XFS_BUF_GETERROR(x) pagebuf_geterror(x) -#define XFS_BUF_ISERROR(x) (pagebuf_geterror(x)?1:0) - -#define XFS_BUF_DONE(x) ((x)->pb_flags &= ~(PBF_PARTIAL|PBF_NONE)) -#define XFS_BUF_UNDONE(x) ((x)->pb_flags |= PBF_PARTIAL|PBF_NONE) -#define XFS_BUF_ISDONE(x) (!(PBF_NOT_DONE(x))) - -#define XFS_BUF_BUSY(x) ((x)->pb_flags |= PBF_FORCEIO) -#define XFS_BUF_UNBUSY(x) ((x)->pb_flags &= ~PBF_FORCEIO) -#define XFS_BUF_ISBUSY(x) (1) - -#define XFS_BUF_ASYNC(x) ((x)->pb_flags |= PBF_ASYNC) -#define XFS_BUF_UNASYNC(x) ((x)->pb_flags &= ~PBF_ASYNC) -#define XFS_BUF_ISASYNC(x) ((x)->pb_flags & PBF_ASYNC) - -#define XFS_BUF_FLUSH(x) ((x)->pb_flags |= PBF_FLUSH) -#define XFS_BUF_UNFLUSH(x) ((x)->pb_flags &= ~PBF_FLUSH) -#define XFS_BUF_ISFLUSH(x) ((x)->pb_flags & PBF_FLUSH) - -#define XFS_BUF_SHUT(x) printk("XFS_BUF_SHUT not implemented yet\n") -#define XFS_BUF_UNSHUT(x) printk("XFS_BUF_UNSHUT not implemented yet\n") -#define XFS_BUF_ISSHUT(x) (0) - -#define XFS_BUF_HOLD(x) pagebuf_hold(x) -#define XFS_BUF_READ(x) ((x)->pb_flags |= PBF_READ) -#define XFS_BUF_UNREAD(x) ((x)->pb_flags &= ~PBF_READ) -#define XFS_BUF_ISREAD(x) ((x)->pb_flags & PBF_READ) - -#define XFS_BUF_WRITE(x) ((x)->pb_flags |= PBF_WRITE) -#define XFS_BUF_UNWRITE(x) ((x)->pb_flags &= ~PBF_WRITE) -#define XFS_BUF_ISWRITE(x) ((x)->pb_flags & PBF_WRITE) - -#define XFS_BUF_ISUNINITIAL(x) (0) -#define XFS_BUF_UNUNINITIAL(x) (0) - -#define XFS_BUF_BP_ISMAPPED(bp) 1 - -#define XFS_BUF_DATAIO(x) ((x)->pb_flags |= PBF_FS_DATAIOD) -#define XFS_BUF_UNDATAIO(x) ((x)->pb_flags &= ~PBF_FS_DATAIOD) - -#define XFS_BUF_IODONE_FUNC(buf) (buf)->pb_iodone -#define XFS_BUF_SET_IODONE_FUNC(buf, func) \ - (buf)->pb_iodone = (func) -#define XFS_BUF_CLR_IODONE_FUNC(buf) \ - (buf)->pb_iodone = NULL -#define XFS_BUF_SET_BDSTRAT_FUNC(buf, func) \ - (buf)->pb_strat = (func) -#define XFS_BUF_CLR_BDSTRAT_FUNC(buf) \ - (buf)->pb_strat = NULL - -#define XFS_BUF_FSPRIVATE(buf, type) \ - ((type)(buf)->pb_fspriv) -#define XFS_BUF_SET_FSPRIVATE(buf, value) \ - (buf)->pb_fspriv = (void *)(value) -#define XFS_BUF_FSPRIVATE2(buf, type) \ - ((type)(buf)->pb_fspriv2) -#define XFS_BUF_SET_FSPRIVATE2(buf, value) \ - (buf)->pb_fspriv2 = (void *)(value) -#define XFS_BUF_FSPRIVATE3(buf, type) \ - ((type)(buf)->pb_fspriv3) -#define XFS_BUF_SET_FSPRIVATE3(buf, value) \ - (buf)->pb_fspriv3 = (void *)(value) -#define XFS_BUF_SET_START(buf) - -#define XFS_BUF_SET_BRELSE_FUNC(buf, value) \ - (buf)->pb_relse = (value) - -#define XFS_BUF_PTR(bp) (xfs_caddr_t)((bp)->pb_addr) - -extern inline xfs_caddr_t xfs_buf_offset(xfs_buf_t *bp, size_t offset) -{ - if (bp->pb_flags & PBF_MAPPED) - return XFS_BUF_PTR(bp) + offset; - return (xfs_caddr_t) pagebuf_offset(bp, offset); -} +#define XFS_BUF_STALE(bp) ((bp)->b_flags |= XFS_B_STALE) +#define XFS_BUF_UNSTALE(bp) ((bp)->b_flags &= ~XFS_B_STALE) +#define XFS_BUF_ISSTALE(bp) ((bp)->b_flags & XFS_B_STALE) +#define XFS_BUF_SUPER_STALE(bp) do { \ + XFS_BUF_STALE(bp); \ + xfs_buf_delwri_dequeue(bp); \ + XFS_BUF_DONE(bp); \ + } while (0) -#define XFS_BUF_SET_PTR(bp, val, count) \ - pagebuf_associate_memory(bp, val, count) -#define XFS_BUF_ADDR(bp) ((bp)->pb_bn) -#define XFS_BUF_SET_ADDR(bp, blk) \ - ((bp)->pb_bn = (xfs_daddr_t)(blk)) -#define XFS_BUF_OFFSET(bp) ((bp)->pb_file_offset) -#define XFS_BUF_SET_OFFSET(bp, off) \ - ((bp)->pb_file_offset = (off)) -#define XFS_BUF_COUNT(bp) ((bp)->pb_count_desired) -#define XFS_BUF_SET_COUNT(bp, cnt) \ - ((bp)->pb_count_desired = (cnt)) -#define XFS_BUF_SIZE(bp) ((bp)->pb_buffer_length) -#define XFS_BUF_SET_SIZE(bp, cnt) \ - ((bp)->pb_buffer_length = (cnt)) -#define XFS_BUF_SET_VTYPE_REF(bp, type, ref) -#define XFS_BUF_SET_VTYPE(bp, type) -#define XFS_BUF_SET_REF(bp, ref) - -#define XFS_BUF_ISPINNED(bp) pagebuf_ispin(bp) - -#define XFS_BUF_VALUSEMA(bp) pagebuf_lock_value(bp) -#define XFS_BUF_CPSEMA(bp) (pagebuf_cond_lock(bp) == 0) -#define XFS_BUF_VSEMA(bp) pagebuf_unlock(bp) -#define XFS_BUF_PSEMA(bp,x) pagebuf_lock(bp) -#define XFS_BUF_V_IODONESEMA(bp) up(&bp->pb_iodonesema); - -/* setup the buffer target from a buftarg structure */ -#define XFS_BUF_SET_TARGET(bp, target) \ - (bp)->pb_target = (target) -#define XFS_BUF_TARGET(bp) ((bp)->pb_target) -#define XFS_BUFTARG_NAME(target) \ - pagebuf_target_name(target) - -#define XFS_BUF_SET_VTYPE_REF(bp, type, ref) -#define XFS_BUF_SET_VTYPE(bp, type) -#define XFS_BUF_SET_REF(bp, ref) - -static inline int xfs_bawrite(void *mp, xfs_buf_t *bp) +#define XFS_BUF_MANAGE XBF_FS_MANAGED +#define XFS_BUF_UNMANAGE(bp) ((bp)->b_flags &= ~XBF_FS_MANAGED) + +#define XFS_BUF_DELAYWRITE(bp) ((bp)->b_flags |= XBF_DELWRI) +#define XFS_BUF_UNDELAYWRITE(bp) xfs_buf_delwri_dequeue(bp) +#define XFS_BUF_ISDELAYWRITE(bp) ((bp)->b_flags & XBF_DELWRI) + +#define XFS_BUF_ERROR(bp,no) xfs_buf_ioerror(bp,no) +#define XFS_BUF_GETERROR(bp) xfs_buf_geterror(bp) +#define XFS_BUF_ISERROR(bp) (xfs_buf_geterror(bp) ? 1 : 0) + +#define XFS_BUF_DONE(bp) ((bp)->b_flags |= XBF_DONE) +#define XFS_BUF_UNDONE(bp) ((bp)->b_flags &= ~XBF_DONE) +#define XFS_BUF_ISDONE(bp) ((bp)->b_flags & XBF_DONE) + +#define XFS_BUF_BUSY(bp) do { } while (0) +#define XFS_BUF_UNBUSY(bp) do { } while (0) +#define XFS_BUF_ISBUSY(bp) (1) + +#define XFS_BUF_ASYNC(bp) ((bp)->b_flags |= XBF_ASYNC) +#define XFS_BUF_UNASYNC(bp) ((bp)->b_flags &= ~XBF_ASYNC) +#define XFS_BUF_ISASYNC(bp) ((bp)->b_flags & XBF_ASYNC) + +#define XFS_BUF_ORDERED(bp) ((bp)->b_flags |= XBF_ORDERED) +#define XFS_BUF_UNORDERED(bp) ((bp)->b_flags &= ~XBF_ORDERED) +#define XFS_BUF_ISORDERED(bp) ((bp)->b_flags & XBF_ORDERED) + +#define XFS_BUF_SHUT(bp) do { } while (0) +#define XFS_BUF_UNSHUT(bp) do { } while (0) +#define XFS_BUF_ISSHUT(bp) (0) + +#define XFS_BUF_HOLD(bp) xfs_buf_hold(bp) +#define XFS_BUF_READ(bp) ((bp)->b_flags |= XBF_READ) +#define XFS_BUF_UNREAD(bp) ((bp)->b_flags &= ~XBF_READ) +#define XFS_BUF_ISREAD(bp) ((bp)->b_flags & XBF_READ) + +#define XFS_BUF_WRITE(bp) ((bp)->b_flags |= XBF_WRITE) +#define XFS_BUF_UNWRITE(bp) ((bp)->b_flags &= ~XBF_WRITE) +#define XFS_BUF_ISWRITE(bp) ((bp)->b_flags & XBF_WRITE) + +#define XFS_BUF_ISUNINITIAL(bp) (0) +#define XFS_BUF_UNUNINITIAL(bp) (0) + +#define XFS_BUF_BP_ISMAPPED(bp) (1) + +#define XFS_BUF_IODONE_FUNC(bp) ((bp)->b_iodone) +#define XFS_BUF_SET_IODONE_FUNC(bp, func) ((bp)->b_iodone = (func)) +#define XFS_BUF_CLR_IODONE_FUNC(bp) ((bp)->b_iodone = NULL) +#define XFS_BUF_SET_BDSTRAT_FUNC(bp, func) ((bp)->b_strat = (func)) +#define XFS_BUF_CLR_BDSTRAT_FUNC(bp) ((bp)->b_strat = NULL) + +#define XFS_BUF_FSPRIVATE(bp, type) ((type)(bp)->b_fspriv) +#define XFS_BUF_SET_FSPRIVATE(bp, val) ((bp)->b_fspriv = (void*)(val)) +#define XFS_BUF_FSPRIVATE2(bp, type) ((type)(bp)->b_fspriv2) +#define XFS_BUF_SET_FSPRIVATE2(bp, val) ((bp)->b_fspriv2 = (void*)(val)) +#define XFS_BUF_FSPRIVATE3(bp, type) ((type)(bp)->b_fspriv3) +#define XFS_BUF_SET_FSPRIVATE3(bp, val) ((bp)->b_fspriv3 = (void*)(val)) +#define XFS_BUF_SET_START(bp) do { } while (0) +#define XFS_BUF_SET_BRELSE_FUNC(bp, func) ((bp)->b_relse = (func)) + +#define XFS_BUF_PTR(bp) (xfs_caddr_t)((bp)->b_addr) +#define XFS_BUF_SET_PTR(bp, val, cnt) xfs_buf_associate_memory(bp, val, cnt) +#define XFS_BUF_ADDR(bp) ((bp)->b_bn) +#define XFS_BUF_SET_ADDR(bp, bno) ((bp)->b_bn = (xfs_daddr_t)(bno)) +#define XFS_BUF_OFFSET(bp) ((bp)->b_file_offset) +#define XFS_BUF_SET_OFFSET(bp, off) ((bp)->b_file_offset = (off)) +#define XFS_BUF_COUNT(bp) ((bp)->b_count_desired) +#define XFS_BUF_SET_COUNT(bp, cnt) ((bp)->b_count_desired = (cnt)) +#define XFS_BUF_SIZE(bp) ((bp)->b_buffer_length) +#define XFS_BUF_SET_SIZE(bp, cnt) ((bp)->b_buffer_length = (cnt)) + +#define XFS_BUF_SET_VTYPE_REF(bp, type, ref) do { } while (0) +#define XFS_BUF_SET_VTYPE(bp, type) do { } while (0) +#define XFS_BUF_SET_REF(bp, ref) do { } while (0) + +#define XFS_BUF_ISPINNED(bp) xfs_buf_ispin(bp) + +#define XFS_BUF_VALUSEMA(bp) xfs_buf_lock_value(bp) +#define XFS_BUF_CPSEMA(bp) (xfs_buf_cond_lock(bp) == 0) +#define XFS_BUF_VSEMA(bp) xfs_buf_unlock(bp) +#define XFS_BUF_PSEMA(bp,x) xfs_buf_lock(bp) +#define XFS_BUF_V_IODONESEMA(bp) up(&bp->b_iodonesema); + +#define XFS_BUF_SET_TARGET(bp, target) ((bp)->b_target = (target)) +#define XFS_BUF_TARGET(bp) ((bp)->b_target) +#define XFS_BUFTARG_NAME(target) xfs_buf_target_name(target) + +static inline int xfs_bawrite(void *mp, xfs_buf_t *bp) { - bp->pb_fspriv3 = mp; - bp->pb_strat = xfs_bdstrat_cb; - pagebuf_delwri_dequeue(bp); - return pagebuf_iostart(bp, PBF_WRITE | PBF_ASYNC | _PBF_RUN_QUEUES); + bp->b_fspriv3 = mp; + bp->b_strat = xfs_bdstrat_cb; + xfs_buf_delwri_dequeue(bp); + return xfs_buf_iostart(bp, XBF_WRITE | XBF_ASYNC | _XBF_RUN_QUEUES); } -static inline void xfs_buf_relse(xfs_buf_t *bp) +static inline void xfs_buf_relse(xfs_buf_t *bp) { - if (!bp->pb_relse) - pagebuf_unlock(bp); - pagebuf_rele(bp); + if (!bp->b_relse) + xfs_buf_unlock(bp); + xfs_buf_rele(bp); } -#define xfs_bpin(bp) pagebuf_pin(bp) -#define xfs_bunpin(bp) pagebuf_unpin(bp) +#define xfs_bpin(bp) xfs_buf_pin(bp) +#define xfs_bunpin(bp) xfs_buf_unpin(bp) #define xfs_buftrace(id, bp) \ - pagebuf_trace(bp, id, NULL, (void *)__builtin_return_address(0)) + xfs_buf_trace(bp, id, NULL, (void *)__builtin_return_address(0)) -#define xfs_biodone(pb) \ - pagebuf_iodone(pb, (pb->pb_flags & PBF_FS_DATAIOD), 0) +#define xfs_biodone(bp) xfs_buf_ioend(bp, 0) -#define xfs_biomove(pb, off, len, data, rw) \ - pagebuf_iomove((pb), (off), (len), (data), \ - ((rw) == XFS_B_WRITE) ? PBRW_WRITE : PBRW_READ) +#define xfs_biomove(bp, off, len, data, rw) \ + xfs_buf_iomove((bp), (off), (len), (data), \ + ((rw) == XFS_B_WRITE) ? XBRW_WRITE : XBRW_READ) -#define xfs_biozero(pb, off, len) \ - pagebuf_iomove((pb), (off), (len), NULL, PBRW_ZERO) +#define xfs_biozero(bp, off, len) \ + xfs_buf_iomove((bp), (off), (len), NULL, XBRW_ZERO) -static inline int XFS_bwrite(xfs_buf_t *pb) +static inline int XFS_bwrite(xfs_buf_t *bp) { - int iowait = (pb->pb_flags & PBF_ASYNC) == 0; + int iowait = (bp->b_flags & XBF_ASYNC) == 0; int error = 0; if (!iowait) - pb->pb_flags |= _PBF_RUN_QUEUES; + bp->b_flags |= _XBF_RUN_QUEUES; - pagebuf_delwri_dequeue(pb); - pagebuf_iostrategy(pb); + xfs_buf_delwri_dequeue(bp); + xfs_buf_iostrategy(bp); if (iowait) { - error = pagebuf_iowait(pb); - xfs_buf_relse(pb); + error = xfs_buf_iowait(bp); + xfs_buf_relse(bp); } return error; } -#define XFS_bdwrite(pb) \ - pagebuf_iostart(pb, PBF_DELWRI | PBF_ASYNC) +#define XFS_bdwrite(bp) xfs_buf_iostart(bp, XBF_DELWRI | XBF_ASYNC) static inline int xfs_bdwrite(void *mp, xfs_buf_t *bp) { - bp->pb_strat = xfs_bdstrat_cb; - bp->pb_fspriv3 = mp; - - return pagebuf_iostart(bp, PBF_DELWRI | PBF_ASYNC); + bp->b_strat = xfs_bdstrat_cb; + bp->b_fspriv3 = mp; + return xfs_buf_iostart(bp, XBF_DELWRI | XBF_ASYNC); } -#define XFS_bdstrat(bp) pagebuf_iorequest(bp) +#define XFS_bdstrat(bp) xfs_buf_iorequest(bp) -#define xfs_iowait(pb) pagebuf_iowait(pb) +#define xfs_iowait(bp) xfs_buf_iowait(bp) #define xfs_baread(target, rablkno, ralen) \ - pagebuf_readahead((target), (rablkno), (ralen), PBF_DONT_BLOCK) - -#define xfs_buf_get_empty(len, target) pagebuf_get_empty((len), (target)) -#define xfs_buf_get_noaddr(len, target) pagebuf_get_no_daddr((len), (target)) -#define xfs_buf_free(bp) pagebuf_free(bp) + xfs_buf_readahead((target), (rablkno), (ralen), XBF_DONT_BLOCK) /* * Handling of buftargs. */ - extern xfs_buftarg_t *xfs_alloc_buftarg(struct block_device *, int); extern void xfs_free_buftarg(xfs_buftarg_t *, int); extern void xfs_wait_buftarg(xfs_buftarg_t *); extern int xfs_setsize_buftarg(xfs_buftarg_t *, unsigned int, unsigned int); -extern void xfs_incore_relse(xfs_buftarg_t *, int, int); extern int xfs_flush_buftarg(xfs_buftarg_t *, int); -#define xfs_getsize_buftarg(buftarg) \ - block_size((buftarg)->pbr_bdev) -#define xfs_readonly_buftarg(buftarg) \ - bdev_read_only((buftarg)->pbr_bdev) -#define xfs_binval(buftarg) \ - xfs_flush_buftarg(buftarg, 1) -#define XFS_bflush(buftarg) \ - xfs_flush_buftarg(buftarg, 1) +#define xfs_getsize_buftarg(buftarg) block_size((buftarg)->bt_bdev) +#define xfs_readonly_buftarg(buftarg) bdev_read_only((buftarg)->bt_bdev) + +#define xfs_binval(buftarg) xfs_flush_buftarg(buftarg, 1) +#define XFS_bflush(buftarg) xfs_flush_buftarg(buftarg, 1) #endif /* __XFS_BUF_H__ */ diff --git a/fs/xfs/linux-2.6/xfs_export.c b/fs/xfs/linux-2.6/xfs_export.c index f372a1a5e..5fb75d915 100644 --- a/fs/xfs/linux-2.6/xfs_export.c +++ b/fs/xfs/linux-2.6/xfs_export.c @@ -1,47 +1,33 @@ /* - * Copyright (c) 2004-2005 Silicon Graphics, Inc. All Rights Reserved. + * Copyright (c) 2004-2005 Silicon Graphics, Inc. + * All Rights Reserved. * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as + * 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. * - * This program is distributed in the hope that it would be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * This program is distributed in the hope that it would 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. * - * Further, this software is distributed without any warranty that it is - * free of the rightful claim of any third person regarding infringement - * or the like. Any license provided herein, whether implied or - * otherwise, applies only to this software file. Patent licenses, if - * any, provided herein do not apply to combinations of this program with - * other software, or any other product whatsoever. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston MA 02111-1307, USA. - * - * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, - * Mountain View, CA 94043, or: - * - * http://www.sgi.com - * - * For further information regarding this notice, see: - * - * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - #include "xfs.h" #include "xfs_types.h" #include "xfs_dmapi.h" #include "xfs_log.h" #include "xfs_trans.h" #include "xfs_sb.h" -#include "xfs_dir.h" #include "xfs_mount.h" #include "xfs_export.h" +STATIC struct dentry dotdot = { .d_name.name = "..", .d_name.len = 2, }; + /* - * XFS encode and decodes the fileid portion of NFS filehandles + * XFS encodes and decodes the fileid portion of NFS filehandles * itself instead of letting the generic NFS code do it. This * allows filesystems with 64 bit inode numbers to be exported. * @@ -51,9 +37,8 @@ * remains in that code. */ - STATIC struct dentry * -linvfs_decode_fh( +xfs_fs_decode_fh( struct super_block *sb, __u32 *fh, int fh_len, @@ -92,14 +77,14 @@ linvfs_decode_fh( p = xfs_fileid_decode_fid2(p, &pfid, is64); parent = &pfid; } - + fh = (__u32 *)&ifid; - return find_exported_dentry(sb, fh, parent, acceptable, context); + return sb->s_export_op->find_exported_dentry(sb, fh, parent, acceptable, context); } STATIC int -linvfs_encode_fh( +xfs_fs_encode_fh( struct dentry *dentry, __u32 *fh, int *max_len, @@ -111,10 +96,9 @@ linvfs_encode_fh( int len; int is64 = 0; #if XFS_BIG_INUMS - vfs_t *vfs = LINVFS_GET_VFS(inode->i_sb); - xfs_mount_t *mp = XFS_VFSTOM(vfs); - - if (!(mp->m_flags & XFS_MOUNT_32BITINOOPT)) { + bhv_vfs_t *vfs = vfs_from_sb(inode->i_sb); + + if (!(vfs->vfs_flag & VFS_32BITINODES)) { /* filesystem may contain 64bit inode numbers */ is64 = XFS_FILEID_TYPE_64FLAG; } @@ -147,21 +131,21 @@ linvfs_encode_fh( } STATIC struct dentry * -linvfs_get_dentry( +xfs_fs_get_dentry( struct super_block *sb, void *data) { - vnode_t *vp; + bhv_vnode_t *vp; struct inode *inode; struct dentry *result; - vfs_t *vfsp = LINVFS_GET_VFS(sb); + bhv_vfs_t *vfsp = vfs_from_sb(sb); int error; - VFS_VGET(vfsp, &vp, (fid_t *)data, error); + error = bhv_vfs_vget(vfsp, &vp, (fid_t *)data); if (error || vp == NULL) return ERR_PTR(-ESTALE) ; - inode = LINVFS_GET_IP(vp); + inode = vn_to_inode(vp); result = d_alloc_anon(inode); if (!result) { iput(inode); @@ -171,25 +155,20 @@ linvfs_get_dentry( } STATIC struct dentry * -linvfs_get_parent( +xfs_fs_get_parent( struct dentry *child) { int error; - vnode_t *vp, *cvp; + bhv_vnode_t *vp, *cvp; struct dentry *parent; - struct dentry dotdot; - - dotdot.d_name.name = ".."; - dotdot.d_name.len = 2; - dotdot.d_inode = NULL; cvp = NULL; - vp = LINVFS_GET_VP(child->d_inode); - VOP_LOOKUP(vp, &dotdot, &cvp, 0, NULL, NULL, error); + vp = vn_from_inode(child->d_inode); + error = bhv_vop_lookup(vp, &dotdot, &cvp, 0, NULL, NULL); if (unlikely(error)) return ERR_PTR(-error); - parent = d_alloc_anon(LINVFS_GET_IP(cvp)); + parent = d_alloc_anon(vn_to_inode(cvp)); if (unlikely(!parent)) { VN_RELE(cvp); return ERR_PTR(-ENOMEM); @@ -197,9 +176,9 @@ linvfs_get_parent( return parent; } -struct export_operations linvfs_export_ops = { - .decode_fh = linvfs_decode_fh, - .encode_fh = linvfs_encode_fh, - .get_parent = linvfs_get_parent, - .get_dentry = linvfs_get_dentry, +struct export_operations xfs_export_operations = { + .decode_fh = xfs_fs_decode_fh, + .encode_fh = xfs_fs_encode_fh, + .get_parent = xfs_fs_get_parent, + .get_dentry = xfs_fs_get_dentry, }; diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index 24fa3b101..3d4f6dff2 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -1,40 +1,26 @@ /* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. All Rights Reserved. + * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * All Rights Reserved. * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as + * 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. * - * This program is distributed in the hope that it would be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * This program is distributed in the hope that it would 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. * - * Further, this software is distributed without any warranty that it is - * free of the rightful claim of any third person regarding infringement - * or the like. Any license provided herein, whether implied or - * otherwise, applies only to this software file. Patent licenses, if - * any, provided herein do not apply to combinations of this program with - * other software, or any other product whatsoever. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston MA 02111-1307, USA. - * - * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, - * Mountain View, CA 94043, or: - * - * http://www.sgi.com - * - * For further information regarding this notice, see: - * - * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - #include "xfs.h" -#include "xfs_inum.h" +#include "xfs_bit.h" #include "xfs_log.h" +#include "xfs_inum.h" #include "xfs_sb.h" -#include "xfs_dir.h" +#include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_trans.h" #include "xfs_dmapi.h" @@ -45,7 +31,6 @@ #include "xfs_alloc.h" #include "xfs_btree.h" #include "xfs_attr_sf.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" @@ -56,11 +41,13 @@ #include #include -static struct vm_operations_struct linvfs_file_vm_ops; - +static struct vm_operations_struct xfs_file_vm_ops; +#ifdef CONFIG_XFS_DMAPI +static struct vm_operations_struct xfs_dmapi_file_vm_ops; +#endif STATIC inline ssize_t -__linvfs_read( +__xfs_file_read( struct kiocb *iocb, char __user *buf, int ioflags, @@ -69,41 +56,36 @@ __linvfs_read( { struct iovec iov = {buf, count}; struct file *file = iocb->ki_filp; - vnode_t *vp = LINVFS_GET_VP(file->f_dentry->d_inode); - ssize_t rval; + bhv_vnode_t *vp = vn_from_inode(file->f_dentry->d_inode); BUG_ON(iocb->ki_pos != pos); - if (unlikely(file->f_flags & O_DIRECT)) ioflags |= IO_ISDIRECT; - VOP_READ(vp, iocb, &iov, 1, &iocb->ki_pos, ioflags, NULL, rval); - return rval; + return bhv_vop_read(vp, iocb, &iov, 1, &iocb->ki_pos, ioflags, NULL); } - STATIC ssize_t -linvfs_aio_read( +xfs_file_aio_read( struct kiocb *iocb, char __user *buf, size_t count, loff_t pos) { - return __linvfs_read(iocb, buf, IO_ISAIO, count, pos); + return __xfs_file_read(iocb, buf, IO_ISAIO, count, pos); } STATIC ssize_t -linvfs_aio_read_invis( +xfs_file_aio_read_invis( struct kiocb *iocb, char __user *buf, size_t count, loff_t pos) { - return __linvfs_read(iocb, buf, IO_ISAIO|IO_INVIS, count, pos); + return __xfs_file_read(iocb, buf, IO_ISAIO|IO_INVIS, count, pos); } - STATIC inline ssize_t -__linvfs_write( +__xfs_file_write( struct kiocb *iocb, const char __user *buf, int ioflags, @@ -113,41 +95,36 @@ __linvfs_write( struct iovec iov = {(void __user *)buf, count}; struct file *file = iocb->ki_filp; struct inode *inode = file->f_mapping->host; - vnode_t *vp = LINVFS_GET_VP(inode); - ssize_t rval; + bhv_vnode_t *vp = vn_from_inode(inode); BUG_ON(iocb->ki_pos != pos); if (unlikely(file->f_flags & O_DIRECT)) ioflags |= IO_ISDIRECT; - - VOP_WRITE(vp, iocb, &iov, 1, &iocb->ki_pos, ioflags, NULL, rval); - return rval; + return bhv_vop_write(vp, iocb, &iov, 1, &iocb->ki_pos, ioflags, NULL); } - STATIC ssize_t -linvfs_aio_write( +xfs_file_aio_write( struct kiocb *iocb, const char __user *buf, size_t count, loff_t pos) { - return __linvfs_write(iocb, buf, IO_ISAIO, count, pos); + return __xfs_file_write(iocb, buf, IO_ISAIO, count, pos); } STATIC ssize_t -linvfs_aio_write_invis( +xfs_file_aio_write_invis( struct kiocb *iocb, const char __user *buf, size_t count, loff_t pos) { - return __linvfs_write(iocb, buf, IO_ISAIO|IO_INVIS, count, pos); + return __xfs_file_write(iocb, buf, IO_ISAIO|IO_INVIS, count, pos); } - STATIC inline ssize_t -__linvfs_readv( +__xfs_file_readv( struct file *file, const struct iovec *iov, int ioflags, @@ -155,8 +132,8 @@ __linvfs_readv( loff_t *ppos) { struct inode *inode = file->f_mapping->host; - vnode_t *vp = LINVFS_GET_VP(inode); - struct kiocb kiocb; + bhv_vnode_t *vp = vn_from_inode(inode); + struct kiocb kiocb; ssize_t rval; init_sync_kiocb(&kiocb, file); @@ -164,35 +141,35 @@ __linvfs_readv( if (unlikely(file->f_flags & O_DIRECT)) ioflags |= IO_ISDIRECT; - VOP_READ(vp, &kiocb, iov, nr_segs, &kiocb.ki_pos, ioflags, NULL, rval); + rval = bhv_vop_read(vp, &kiocb, iov, nr_segs, + &kiocb.ki_pos, ioflags, NULL); *ppos = kiocb.ki_pos; return rval; } STATIC ssize_t -linvfs_readv( +xfs_file_readv( struct file *file, const struct iovec *iov, unsigned long nr_segs, loff_t *ppos) { - return __linvfs_readv(file, iov, 0, nr_segs, ppos); + return __xfs_file_readv(file, iov, 0, nr_segs, ppos); } STATIC ssize_t -linvfs_readv_invis( +xfs_file_readv_invis( struct file *file, const struct iovec *iov, unsigned long nr_segs, loff_t *ppos) { - return __linvfs_readv(file, iov, IO_INVIS, nr_segs, ppos); + return __xfs_file_readv(file, iov, IO_INVIS, nr_segs, ppos); } - STATIC inline ssize_t -__linvfs_writev( +__xfs_file_writev( struct file *file, const struct iovec *iov, int ioflags, @@ -200,8 +177,8 @@ __linvfs_writev( loff_t *ppos) { struct inode *inode = file->f_mapping->host; - vnode_t *vp = LINVFS_GET_VP(inode); - struct kiocb kiocb; + bhv_vnode_t *vp = vn_from_inode(inode); + struct kiocb kiocb; ssize_t rval; init_sync_kiocb(&kiocb, file); @@ -209,114 +186,179 @@ __linvfs_writev( if (unlikely(file->f_flags & O_DIRECT)) ioflags |= IO_ISDIRECT; - VOP_WRITE(vp, &kiocb, iov, nr_segs, &kiocb.ki_pos, ioflags, NULL, rval); + rval = bhv_vop_write(vp, &kiocb, iov, nr_segs, + &kiocb.ki_pos, ioflags, NULL); *ppos = kiocb.ki_pos; return rval; } - STATIC ssize_t -linvfs_writev( +xfs_file_writev( struct file *file, const struct iovec *iov, unsigned long nr_segs, loff_t *ppos) { - return __linvfs_writev(file, iov, 0, nr_segs, ppos); + return __xfs_file_writev(file, iov, 0, nr_segs, ppos); } STATIC ssize_t -linvfs_writev_invis( +xfs_file_writev_invis( struct file *file, const struct iovec *iov, unsigned long nr_segs, loff_t *ppos) { - return __linvfs_writev(file, iov, IO_INVIS, nr_segs, ppos); + return __xfs_file_writev(file, iov, IO_INVIS, nr_segs, ppos); } STATIC ssize_t -linvfs_sendfile( +xfs_file_sendfile( struct file *filp, - loff_t *ppos, + loff_t *pos, size_t count, read_actor_t actor, void *target) { - vnode_t *vp = LINVFS_GET_VP(filp->f_dentry->d_inode); - ssize_t rval; + return bhv_vop_sendfile(vn_from_inode(filp->f_dentry->d_inode), + filp, pos, 0, count, actor, target, NULL); +} - VOP_SENDFILE(vp, filp, ppos, 0, count, actor, target, NULL, rval); - return rval; +STATIC ssize_t +xfs_file_sendfile_invis( + struct file *filp, + loff_t *pos, + size_t count, + read_actor_t actor, + void *target) +{ + return bhv_vop_sendfile(vn_from_inode(filp->f_dentry->d_inode), + filp, pos, IO_INVIS, count, actor, target, NULL); +} + +STATIC ssize_t +xfs_file_splice_read( + struct file *infilp, + loff_t *ppos, + struct pipe_inode_info *pipe, + size_t len, + unsigned int flags) +{ + return bhv_vop_splice_read(vn_from_inode(infilp->f_dentry->d_inode), + infilp, ppos, pipe, len, flags, 0, NULL); +} + +STATIC ssize_t +xfs_file_splice_read_invis( + struct file *infilp, + loff_t *ppos, + struct pipe_inode_info *pipe, + size_t len, + unsigned int flags) +{ + return bhv_vop_splice_read(vn_from_inode(infilp->f_dentry->d_inode), + infilp, ppos, pipe, len, flags, IO_INVIS, + NULL); } +STATIC ssize_t +xfs_file_splice_write( + struct pipe_inode_info *pipe, + struct file *outfilp, + loff_t *ppos, + size_t len, + unsigned int flags) +{ + return bhv_vop_splice_write(vn_from_inode(outfilp->f_dentry->d_inode), + pipe, outfilp, ppos, len, flags, 0, NULL); +} + +STATIC ssize_t +xfs_file_splice_write_invis( + struct pipe_inode_info *pipe, + struct file *outfilp, + loff_t *ppos, + size_t len, + unsigned int flags) +{ + return bhv_vop_splice_write(vn_from_inode(outfilp->f_dentry->d_inode), + pipe, outfilp, ppos, len, flags, IO_INVIS, + NULL); +} STATIC int -linvfs_open( +xfs_file_open( struct inode *inode, struct file *filp) { - vnode_t *vp = LINVFS_GET_VP(inode); - int error; - if (!(filp->f_flags & O_LARGEFILE) && i_size_read(inode) > MAX_NON_LFS) return -EFBIG; - - ASSERT(vp); - VOP_OPEN(vp, NULL, error); - return -error; + return -bhv_vop_open(vn_from_inode(inode), NULL); } +STATIC int +xfs_file_close( + struct file *filp, + fl_owner_t id) +{ + return -bhv_vop_close(vn_from_inode(filp->f_dentry->d_inode), 0, + file_count(filp) > 1 ? L_FALSE : L_TRUE, NULL); +} STATIC int -linvfs_release( +xfs_file_release( struct inode *inode, struct file *filp) { - vnode_t *vp = LINVFS_GET_VP(inode); - int error = 0; + bhv_vnode_t *vp = vn_from_inode(inode); if (vp) - VOP_RELEASE(vp, error); - return -error; + return -bhv_vop_release(vp); + return 0; } - STATIC int -linvfs_fsync( +xfs_file_fsync( struct file *filp, struct dentry *dentry, int datasync) { - struct inode *inode = dentry->d_inode; - vnode_t *vp = LINVFS_GET_VP(inode); - int error; + bhv_vnode_t *vp = vn_from_inode(dentry->d_inode); int flags = FSYNC_WAIT; if (datasync) flags |= FSYNC_DATA; - - ASSERT(vp); - VOP_FSYNC(vp, flags, NULL, (xfs_off_t)0, (xfs_off_t)-1, error); - return -error; + if (VN_TRUNC(vp)) + VUNTRUNCATE(vp); + return -bhv_vop_fsync(vp, flags, NULL, (xfs_off_t)0, (xfs_off_t)-1); } -/* - * linvfs_readdir maps to VOP_READDIR(). - * We need to build a uio, cred, ... - */ +#ifdef CONFIG_XFS_DMAPI +STATIC struct page * +xfs_vm_nopage( + struct vm_area_struct *area, + unsigned long address, + int *type) +{ + struct inode *inode = area->vm_file->f_dentry->d_inode; + bhv_vnode_t *vp = vn_from_inode(inode); -#define nextdp(dp) ((struct xfs_dirent *)((char *)(dp) + (dp)->d_reclen)) + ASSERT_ALWAYS(vp->v_vfsp->vfs_flag & VFS_DMI); + if (XFS_SEND_MMAP(XFS_VFSTOM(vp->v_vfsp), area, 0)) + return NULL; + return filemap_nopage(area, address, type); +} +#endif /* CONFIG_XFS_DMAPI */ STATIC int -linvfs_readdir( +xfs_file_readdir( struct file *filp, void *dirent, filldir_t filldir) { int error = 0; - vnode_t *vp; + bhv_vnode_t *vp = vn_from_inode(filp->f_dentry->d_inode); uio_t uio; iovec_t iov; int eof = 0; @@ -326,9 +368,6 @@ linvfs_readdir( xfs_off_t start_offset, curr_offset; xfs_dirent_t *dbp = NULL; - vp = LINVFS_GET_VP(filp->f_dentry->d_inode); - ASSERT(vp); - /* Try fairly hard to get memory */ do { if ((read_buf = (caddr_t)kmalloc(rlen, GFP_KERNEL))) @@ -354,7 +393,7 @@ linvfs_readdir( start_offset = uio.uio_offset; - VOP_READDIR(vp, &uio, NULL, &eof, error); + error = bhv_vop_readdir(vp, &uio, NULL, &eof); if ((uio.uio_offset == start_offset) || error) { size = 0; break; @@ -373,7 +412,7 @@ linvfs_readdir( } size -= dbp->d_reclen; curr_offset = (loff_t)dbp->d_off /* & 0x7fffffff */; - dbp = nextdp(dbp); + dbp = (xfs_dirent_t *)((char *)dbp + dbp->d_reclen); } } done: @@ -388,45 +427,33 @@ done: return -error; } - STATIC int -linvfs_file_mmap( +xfs_file_mmap( struct file *filp, struct vm_area_struct *vma) { - struct inode *ip = filp->f_dentry->d_inode; - vnode_t *vp = LINVFS_GET_VP(ip); - vattr_t va = { .va_mask = XFS_AT_UPDATIME }; - int error; - - if (vp->v_vfsp->vfs_flag & VFS_DMI) { - xfs_mount_t *mp = XFS_VFSTOM(vp->v_vfsp); - - error = -XFS_SEND_MMAP(mp, vma, 0); - if (error) - return error; - } + vma->vm_ops = &xfs_file_vm_ops; - vma->vm_ops = &linvfs_file_vm_ops; +#ifdef CONFIG_XFS_DMAPI + if (vn_from_inode(filp->f_dentry->d_inode)->v_vfsp->vfs_flag & VFS_DMI) + vma->vm_ops = &xfs_dmapi_file_vm_ops; +#endif /* CONFIG_XFS_DMAPI */ - VOP_SETATTR(vp, &va, XFS_AT_UPDATIME, NULL, error); - if (!error) - vn_revalidate(vp); /* update Linux inode flags */ + file_accessed(filp); return 0; } - STATIC long -linvfs_ioctl( +xfs_file_ioctl( struct file *filp, unsigned int cmd, - unsigned long arg) + unsigned long p) { int error; - struct inode *inode = filp->f_dentry->d_inode; - vnode_t *vp = LINVFS_GET_VP(inode); + struct inode *inode = filp->f_dentry->d_inode; + bhv_vnode_t *vp = vn_from_inode(inode); - VOP_IOCTL(vp, inode, filp, 0, cmd, (void __user *)arg, error); + error = bhv_vop_ioctl(vp, inode, filp, 0, cmd, (void __user *)p); VMODIFY(vp); /* NOTE: some of the ioctl's return positive #'s as a @@ -439,17 +466,16 @@ linvfs_ioctl( } STATIC long -linvfs_ioctl_invis( +xfs_file_ioctl_invis( struct file *filp, unsigned int cmd, - unsigned long arg) + unsigned long p) { int error; - struct inode *inode = filp->f_dentry->d_inode; - vnode_t *vp = LINVFS_GET_VP(inode); + struct inode *inode = filp->f_dentry->d_inode; + bhv_vnode_t *vp = vn_from_inode(inode); - ASSERT(vp); - VOP_IOCTL(vp, inode, filp, IO_INVIS, cmd, (void __user *)arg, error); + error = bhv_vop_ioctl(vp, inode, filp, IO_INVIS, cmd, (void __user *)p); VMODIFY(vp); /* NOTE: some of the ioctl's return positive #'s as a @@ -461,13 +487,14 @@ linvfs_ioctl_invis( return error; } +#ifdef CONFIG_XFS_DMAPI #ifdef HAVE_VMOP_MPROTECT STATIC int -linvfs_mprotect( +xfs_vm_mprotect( struct vm_area_struct *vma, unsigned int newflags) { - vnode_t *vp = LINVFS_GET_VP(vma->vm_file->f_dentry->d_inode); + bhv_vnode_t *vp = vn_from_inode(vma->vm_file->f_dentry->d_inode); int error = 0; if (vp->v_vfsp->vfs_flag & VFS_DMI) { @@ -481,6 +508,7 @@ linvfs_mprotect( return error; } #endif /* HAVE_VMOP_MPROTECT */ +#endif /* CONFIG_XFS_DMAPI */ #ifdef HAVE_FOP_OPEN_EXEC /* If the user is attempting to execute a file that is offline then @@ -489,127 +517,94 @@ linvfs_mprotect( * it back online. */ STATIC int -linvfs_open_exec( +xfs_file_open_exec( struct inode *inode) { - vnode_t *vp = LINVFS_GET_VP(inode); - xfs_mount_t *mp = XFS_VFSTOM(vp->v_vfsp); - int error = 0; - bhv_desc_t *bdp; - xfs_inode_t *ip; + bhv_vnode_t *vp = vn_from_inode(inode); - if (vp->v_vfsp->vfs_flag & VFS_DMI) { - bdp = vn_bhv_lookup(VN_BHV_HEAD(vp), &xfs_vnodeops); - if (!bdp) { - error = -EINVAL; - goto open_exec_out; - } - ip = XFS_BHVTOI(bdp); - if (DM_EVENT_ENABLED(vp->v_vfsp, ip, DM_EVENT_READ)) { - error = -XFS_SEND_DATA(mp, DM_EVENT_READ, vp, + if (unlikely(vp->v_vfsp->vfs_flag & VFS_DMI)) { + xfs_mount_t *mp = XFS_VFSTOM(vp->v_vfsp); + xfs_inode_t *ip = xfs_vtoi(vp); + + if (!ip) + return -EINVAL; + if (DM_EVENT_ENABLED(vp->v_vfsp, ip, DM_EVENT_READ)) + return -XFS_SEND_DATA(mp, DM_EVENT_READ, vp, 0, 0, 0, NULL); - } } -open_exec_out: - return error; + return 0; } #endif /* HAVE_FOP_OPEN_EXEC */ -/* - * Temporary workaround to the AIO direct IO write problem. - * This code can go and we can revert to do_sync_write once - * the writepage(s) rework is merged. - */ -STATIC ssize_t -linvfs_write( - struct file *filp, - const char __user *buf, - size_t len, - loff_t *ppos) -{ - struct kiocb kiocb; - ssize_t ret; - - init_sync_kiocb(&kiocb, filp); - kiocb.ki_pos = *ppos; - ret = __linvfs_write(&kiocb, buf, 0, len, kiocb.ki_pos); - *ppos = kiocb.ki_pos; - return ret; -} -STATIC ssize_t -linvfs_write_invis( - struct file *filp, - const char __user *buf, - size_t len, - loff_t *ppos) -{ - struct kiocb kiocb; - ssize_t ret; - - init_sync_kiocb(&kiocb, filp); - kiocb.ki_pos = *ppos; - ret = __linvfs_write(&kiocb, buf, IO_INVIS, len, kiocb.ki_pos); - *ppos = kiocb.ki_pos; - return ret; -} - - -struct file_operations linvfs_file_operations = { +const struct file_operations xfs_file_operations = { .llseek = generic_file_llseek, .read = do_sync_read, - .write = linvfs_write, - .readv = linvfs_readv, - .writev = linvfs_writev, - .aio_read = linvfs_aio_read, - .aio_write = linvfs_aio_write, - .sendfile = linvfs_sendfile, - .unlocked_ioctl = linvfs_ioctl, + .write = do_sync_write, + .readv = xfs_file_readv, + .writev = xfs_file_writev, + .aio_read = xfs_file_aio_read, + .aio_write = xfs_file_aio_write, + .sendfile = xfs_file_sendfile, + .splice_read = xfs_file_splice_read, + .splice_write = xfs_file_splice_write, + .unlocked_ioctl = xfs_file_ioctl, #ifdef CONFIG_COMPAT - .compat_ioctl = linvfs_compat_ioctl, + .compat_ioctl = xfs_file_compat_ioctl, #endif - .mmap = linvfs_file_mmap, - .open = linvfs_open, - .release = linvfs_release, - .fsync = linvfs_fsync, + .mmap = xfs_file_mmap, + .open = xfs_file_open, + .flush = xfs_file_close, + .release = xfs_file_release, + .fsync = xfs_file_fsync, #ifdef HAVE_FOP_OPEN_EXEC - .open_exec = linvfs_open_exec, + .open_exec = xfs_file_open_exec, #endif }; -struct file_operations linvfs_invis_file_operations = { +const struct file_operations xfs_invis_file_operations = { .llseek = generic_file_llseek, .read = do_sync_read, - .write = linvfs_write_invis, - .readv = linvfs_readv_invis, - .writev = linvfs_writev_invis, - .aio_read = linvfs_aio_read_invis, - .aio_write = linvfs_aio_write_invis, - .sendfile = linvfs_sendfile, - .unlocked_ioctl = linvfs_ioctl_invis, + .write = do_sync_write, + .readv = xfs_file_readv_invis, + .writev = xfs_file_writev_invis, + .aio_read = xfs_file_aio_read_invis, + .aio_write = xfs_file_aio_write_invis, + .sendfile = xfs_file_sendfile_invis, + .splice_read = xfs_file_splice_read_invis, + .splice_write = xfs_file_splice_write_invis, + .unlocked_ioctl = xfs_file_ioctl_invis, #ifdef CONFIG_COMPAT - .compat_ioctl = linvfs_compat_invis_ioctl, + .compat_ioctl = xfs_file_compat_invis_ioctl, #endif - .mmap = linvfs_file_mmap, - .open = linvfs_open, - .release = linvfs_release, - .fsync = linvfs_fsync, + .mmap = xfs_file_mmap, + .open = xfs_file_open, + .flush = xfs_file_close, + .release = xfs_file_release, + .fsync = xfs_file_fsync, }; -struct file_operations linvfs_dir_operations = { +const struct file_operations xfs_dir_file_operations = { .read = generic_read_dir, - .readdir = linvfs_readdir, - .unlocked_ioctl = linvfs_ioctl, + .readdir = xfs_file_readdir, + .unlocked_ioctl = xfs_file_ioctl, #ifdef CONFIG_COMPAT - .compat_ioctl = linvfs_compat_ioctl, + .compat_ioctl = xfs_file_compat_ioctl, #endif - .fsync = linvfs_fsync, + .fsync = xfs_file_fsync, }; -static struct vm_operations_struct linvfs_file_vm_ops = { +static struct vm_operations_struct xfs_file_vm_ops = { .nopage = filemap_nopage, .populate = filemap_populate, +}; + +#ifdef CONFIG_XFS_DMAPI +static struct vm_operations_struct xfs_dmapi_file_vm_ops = { + .nopage = xfs_vm_nopage, + .populate = filemap_populate, #ifdef HAVE_VMOP_MPROTECT - .mprotect = linvfs_mprotect, + .mprotect = xfs_vm_mprotect, #endif }; +#endif /* CONFIG_XFS_DMAPI */ diff --git a/fs/xfs/linux-2.6/xfs_fs_subr.c b/fs/xfs/linux-2.6/xfs_fs_subr.c index 05ebd30ec..dc0562828 100644 --- a/fs/xfs/linux-2.6/xfs_fs_subr.c +++ b/fs/xfs/linux-2.6/xfs_fs_subr.c @@ -1,68 +1,26 @@ /* - * Copyright (c) 2000-2002 Silicon Graphics, Inc. All Rights Reserved. + * Copyright (c) 2000-2002,2005-2006 Silicon Graphics, Inc. + * All Rights Reserved. * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as + * 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. * - * This program is distributed in the hope that it would be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * This program is distributed in the hope that it would 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. * - * Further, this software is distributed without any warranty that it is - * free of the rightful claim of any third person regarding infringement - * or the like. Any license provided herein, whether implied or - * otherwise, applies only to this software file. Patent licenses, if - * any, provided herein do not apply to combinations of this program with - * other software, or any other product whatsoever. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston MA 02111-1307, USA. - * - * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, - * Mountain View, CA 94043, or: - * - * http://www.sgi.com - * - * For further information regarding this notice, see: - * - * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - #include "xfs.h" -/* - * Stub for no-op vnode operations that return error status. - */ -int -fs_noerr(void) -{ - return 0; -} - -/* - * Operation unsupported under this file system. - */ -int -fs_nosys(void) -{ - return ENOSYS; -} - -/* - * Stub for inactive, strategy, and read/write lock/unlock. Does nothing. - */ -/* ARGSUSED */ -void -fs_noval(void) -{ -} +int fs_noerr(void) { return 0; } +int fs_nosys(void) { return ENOSYS; } +void fs_noval(void) { return; } -/* - * vnode pcache layer for vnode_tosspages. - * 'last' parameter unused but left in for IRIX compatibility - */ void fs_tosspages( bhv_desc_t *bdp, @@ -70,18 +28,13 @@ fs_tosspages( xfs_off_t last, int fiopt) { - vnode_t *vp = BHV_TO_VNODE(bdp); - struct inode *ip = LINVFS_GET_IP(vp); + bhv_vnode_t *vp = BHV_TO_VNODE(bdp); + struct inode *ip = vn_to_inode(vp); if (VN_CACHED(vp)) truncate_inode_pages(ip->i_mapping, first); } - -/* - * vnode pcache layer for vnode_flushinval_pages. - * 'last' parameter unused but left in for IRIX compatibility - */ void fs_flushinval_pages( bhv_desc_t *bdp, @@ -89,21 +42,17 @@ fs_flushinval_pages( xfs_off_t last, int fiopt) { - vnode_t *vp = BHV_TO_VNODE(bdp); - struct inode *ip = LINVFS_GET_IP(vp); + bhv_vnode_t *vp = BHV_TO_VNODE(bdp); + struct inode *ip = vn_to_inode(vp); if (VN_CACHED(vp)) { - filemap_fdatawrite(ip->i_mapping); - filemap_fdatawait(ip->i_mapping); - + if (VN_TRUNC(vp)) + VUNTRUNCATE(vp); + filemap_write_and_wait(ip->i_mapping); truncate_inode_pages(ip->i_mapping, first); } } -/* - * vnode pcache layer for vnode_flush_pages. - * 'last' parameter unused but left in for IRIX compatibility - */ int fs_flush_pages( bhv_desc_t *bdp, @@ -112,13 +61,16 @@ fs_flush_pages( uint64_t flags, int fiopt) { - vnode_t *vp = BHV_TO_VNODE(bdp); - struct inode *ip = LINVFS_GET_IP(vp); + bhv_vnode_t *vp = BHV_TO_VNODE(bdp); + struct inode *ip = vn_to_inode(vp); - if (VN_CACHED(vp)) { + if (VN_DIRTY(vp)) { + if (VN_TRUNC(vp)) + VUNTRUNCATE(vp); filemap_fdatawrite(ip->i_mapping); + if (flags & XFS_B_ASYNC) + return 0; filemap_fdatawait(ip->i_mapping); } - return 0; } diff --git a/fs/xfs/linux-2.6/xfs_globals.c b/fs/xfs/linux-2.6/xfs_globals.c index a6da5b4fd..6c162c3dd 100644 --- a/fs/xfs/linux-2.6/xfs_globals.c +++ b/fs/xfs/linux-2.6/xfs_globals.c @@ -1,40 +1,20 @@ /* - * Copyright (c) 2000-2004 Silicon Graphics, Inc. All Rights Reserved. + * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * All Rights Reserved. * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as + * 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. * - * This program is distributed in the hope that it would be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * This program is distributed in the hope that it would 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. * - * Further, this software is distributed without any warranty that it is - * free of the rightful claim of any third person regarding infringement - * or the like. Any license provided herein, whether implied or - * otherwise, applies only to this software file. Patent licenses, if - * any, provided herein do not apply to combinations of this program with - * other software, or any other product whatsoever. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston MA 02111-1307, USA. - * - * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, - * Mountain View, CA 94043, or: - * - * http://www.sgi.com - * - * For further information regarding this notice, see: - * - * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - -/* - * This file contains globals needed by XFS that were normally defined - * somewhere else in IRIX. - */ - #include "xfs.h" #include "xfs_cred.h" #include "xfs_sysctl.h" @@ -65,6 +45,7 @@ xfs_param_t xfs_params = { .xfs_buf_age = { 1*100, 15*100, 7200*100}, .inherit_nosym = { 0, 0, 1 }, .rotorstep = { 1, 1, 255 }, + .inherit_nodfrg = { 0, 1, 1 }, }; /* diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c index 1d6ff3d5f..4bbd09217 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c @@ -23,7 +23,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_dmapi.h" @@ -31,7 +30,6 @@ #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_attr_sf.h" #include "xfs_dir2_sf.h" #include "xfs_dinode.h" @@ -78,7 +76,7 @@ xfs_find_handle( xfs_handle_t handle; xfs_fsop_handlereq_t hreq; struct inode *inode; - struct vnode *vp; + bhv_vnode_t *vp; if (copy_from_user(&hreq, arg, sizeof(hreq))) return -XFS_ERROR(EFAULT); @@ -192,7 +190,7 @@ xfs_vget_fsop_handlereq( xfs_mount_t *mp, struct inode *parinode, /* parent inode pointer */ xfs_fsop_handlereq_t *hreq, - vnode_t **vp, + bhv_vnode_t **vp, struct inode **inode) { void __user *hanp; @@ -202,7 +200,7 @@ xfs_vget_fsop_handlereq( xfs_handle_t handle; xfs_inode_t *ip; struct inode *inodep; - vnode_t *vpp; + bhv_vnode_t *vpp; xfs_ino_t ino; __u32 igen; int error; @@ -277,7 +275,7 @@ xfs_open_by_handle( struct file *filp; struct inode *inode; struct dentry *dentry; - vnode_t *vp; + bhv_vnode_t *vp; xfs_fsop_handlereq_t hreq; if (!capable(CAP_SYS_ADMIN)) @@ -362,7 +360,7 @@ xfs_readlink_by_handle( struct uio auio; struct inode *inode; xfs_fsop_handlereq_t hreq; - vnode_t *vp; + bhv_vnode_t *vp; __u32 olen; if (!capable(CAP_SYS_ADMIN)) @@ -393,9 +391,11 @@ xfs_readlink_by_handle( auio.uio_segflg = UIO_USERSPACE; auio.uio_resid = olen; - VOP_READLINK(vp, &auio, IO_INVIS, NULL, error); - + error = bhv_vop_readlink(vp, &auio, IO_INVIS, NULL); VN_RELE(vp); + if (error) + return -error; + return (olen - auio.uio_resid); } @@ -411,7 +411,7 @@ xfs_fssetdm_by_handle( xfs_fsop_setdm_handlereq_t dmhreq; struct inode *inode; bhv_desc_t *bdp; - vnode_t *vp; + bhv_vnode_t *vp; if (!capable(CAP_MKNOD)) return -XFS_ERROR(EPERM); @@ -452,7 +452,7 @@ xfs_attrlist_by_handle( attrlist_cursor_kern_t *cursor; xfs_fsop_attrlist_handlereq_t al_hreq; struct inode *inode; - vnode_t *vp; + bhv_vnode_t *vp; char *kbuf; if (!capable(CAP_SYS_ADMIN)) @@ -472,8 +472,8 @@ xfs_attrlist_by_handle( goto out_vn_rele; cursor = (attrlist_cursor_kern_t *)&al_hreq.pos; - VOP_ATTR_LIST(vp, kbuf, al_hreq.buflen, al_hreq.flags, - cursor, NULL, error); + error = bhv_vop_attr_list(vp, kbuf, al_hreq.buflen, al_hreq.flags, + cursor, NULL); if (error) goto out_kfree; @@ -490,7 +490,7 @@ xfs_attrlist_by_handle( STATIC int xfs_attrmulti_attr_get( - struct vnode *vp, + bhv_vnode_t *vp, char *name, char __user *ubuf, __uint32_t *len, @@ -505,7 +505,7 @@ xfs_attrmulti_attr_get( if (!kbuf) return ENOMEM; - VOP_ATTR_GET(vp, name, kbuf, len, flags, NULL, error); + error = bhv_vop_attr_get(vp, name, kbuf, len, flags, NULL); if (error) goto out_kfree; @@ -519,7 +519,7 @@ xfs_attrmulti_attr_get( STATIC int xfs_attrmulti_attr_set( - struct vnode *vp, + bhv_vnode_t *vp, char *name, const char __user *ubuf, __uint32_t len, @@ -542,7 +542,7 @@ xfs_attrmulti_attr_set( if (copy_from_user(kbuf, ubuf, len)) goto out_kfree; - VOP_ATTR_SET(vp, name, kbuf, len, flags, NULL, error); + error = bhv_vop_attr_set(vp, name, kbuf, len, flags, NULL); out_kfree: kfree(kbuf); @@ -551,20 +551,15 @@ xfs_attrmulti_attr_set( STATIC int xfs_attrmulti_attr_remove( - struct vnode *vp, + bhv_vnode_t *vp, char *name, __uint32_t flags) { - int error; - - if (IS_RDONLY(&vp->v_inode)) return -EROFS; if (IS_IMMUTABLE(&vp->v_inode) || IS_APPEND(&vp->v_inode)) return EPERM; - - VOP_ATTR_REMOVE(vp, name, flags, NULL, error); - return error; + return bhv_vop_attr_remove(vp, name, flags, NULL); } STATIC int @@ -578,7 +573,7 @@ xfs_attrmulti_by_handle( xfs_attr_multiop_t *ops; xfs_fsop_attrmulti_handlereq_t am_hreq; struct inode *inode; - vnode_t *vp; + bhv_vnode_t *vp; unsigned int i, size; char *attr_name; @@ -658,7 +653,7 @@ xfs_attrmulti_by_handle( STATIC int xfs_ioc_space( bhv_desc_t *bdp, - vnode_t *vp, + bhv_vnode_t *vp, struct file *filp, int flags, unsigned int cmd, @@ -682,7 +677,7 @@ xfs_ioc_fsgeometry( STATIC int xfs_ioc_xattr( - vnode_t *vp, + bhv_vnode_t *vp, xfs_inode_t *ip, struct file *filp, unsigned int cmd, @@ -711,7 +706,7 @@ xfs_ioctl( void __user *arg) { int error; - vnode_t *vp; + bhv_vnode_t *vp; xfs_inode_t *ip; xfs_mount_t *mp; @@ -962,7 +957,7 @@ xfs_ioctl( STATIC int xfs_ioc_space( bhv_desc_t *bdp, - vnode_t *vp, + bhv_vnode_t *vp, struct file *filp, int ioflags, unsigned int cmd, @@ -1159,14 +1154,14 @@ xfs_di2lxflags( STATIC int xfs_ioc_xattr( - vnode_t *vp, + bhv_vnode_t *vp, xfs_inode_t *ip, struct file *filp, unsigned int cmd, void __user *arg) { struct fsxattr fa; - struct vattr *vattr; + struct bhv_vattr *vattr; int error = 0; int attr_flags; unsigned int flags; @@ -1179,7 +1174,7 @@ xfs_ioc_xattr( case XFS_IOC_FSGETXATTR: { vattr->va_mask = XFS_AT_XFLAGS | XFS_AT_EXTSIZE | \ XFS_AT_NEXTENTS | XFS_AT_PROJID; - VOP_GETATTR(vp, vattr, 0, NULL, error); + error = bhv_vop_getattr(vp, vattr, 0, NULL); if (unlikely(error)) { error = -error; break; @@ -1212,7 +1207,7 @@ xfs_ioc_xattr( vattr->va_extsize = fa.fsx_extsize; vattr->va_projid = fa.fsx_projid; - VOP_SETATTR(vp, vattr, attr_flags, NULL, error); + error = bhv_vop_setattr(vp, vattr, attr_flags, NULL); if (likely(!error)) __vn_revalidate(vp, vattr); /* update flags */ error = -error; @@ -1222,7 +1217,7 @@ xfs_ioc_xattr( case XFS_IOC_FSGETXATTRA: { vattr->va_mask = XFS_AT_XFLAGS | XFS_AT_EXTSIZE | \ XFS_AT_ANEXTENTS | XFS_AT_PROJID; - VOP_GETATTR(vp, vattr, 0, NULL, error); + error = bhv_vop_getattr(vp, vattr, 0, NULL); if (unlikely(error)) { error = -error; break; @@ -1268,7 +1263,7 @@ xfs_ioc_xattr( vattr->va_xflags = xfs_merge_ioc_xflags(flags, xfs_ip2xflags(ip)); - VOP_SETATTR(vp, vattr, attr_flags, NULL, error); + error = bhv_vop_setattr(vp, vattr, attr_flags, NULL); if (likely(!error)) __vn_revalidate(vp, vattr); /* update flags */ error = -error; diff --git a/fs/xfs/linux-2.6/xfs_ioctl32.c b/fs/xfs/linux-2.6/xfs_ioctl32.c index 251bfe451..270db0f38 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl32.c +++ b/fs/xfs/linux-2.6/xfs_ioctl32.c @@ -15,7 +15,6 @@ * along with this program; if not, write the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include #include #include #include @@ -114,7 +113,7 @@ xfs_compat_ioctl( unsigned long arg) { struct inode *inode = file->f_dentry->d_inode; - vnode_t *vp = vn_from_inode(inode); + bhv_vnode_t *vp = vn_from_inode(inode); int error; switch (cmd) { @@ -193,7 +192,7 @@ xfs_compat_ioctl( return -ENOIOCTLCMD; } - VOP_IOCTL(vp, inode, file, mode, cmd, (void __user *)arg, error); + error = bhv_vop_ioctl(vp, inode, file, mode, cmd, (void __user *)arg); VMODIFY(vp); return error; diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c index a9a289b25..1e7ec5df3 100644 --- a/fs/xfs/linux-2.6/xfs_iops.c +++ b/fs/xfs/linux-2.6/xfs_iops.c @@ -23,7 +23,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_dmapi.h" @@ -32,7 +31,6 @@ #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -62,7 +60,7 @@ */ xfs_inode_t * xfs_vtoi( - struct vnode *vp) + bhv_vnode_t *vp) { bhv_desc_t *bdp; @@ -81,7 +79,7 @@ void xfs_synchronize_atime( xfs_inode_t *ip) { - vnode_t *vp; + bhv_vnode_t *vp; vp = XFS_ITOV_NULL(ip); if (vp) { @@ -201,14 +199,10 @@ xfs_ichgtime_fast( STATIC void xfs_validate_fields( struct inode *ip, - struct vattr *vattr) + bhv_vattr_t *vattr) { - vnode_t *vp = vn_from_inode(ip); - int error; - vattr->va_mask = XFS_AT_NLINK|XFS_AT_SIZE|XFS_AT_NBLOCKS; - VOP_GETATTR(vp, vattr, ATTR_LAZY, NULL, error); - if (likely(!error)) { + if (!bhv_vop_getattr(vn_from_inode(ip), vattr, ATTR_LAZY, NULL)) { ip->i_nlink = vattr->va_nlink; ip->i_blocks = vattr->va_nblocks; @@ -226,7 +220,7 @@ xfs_validate_fields( */ STATIC int xfs_init_security( - struct vnode *vp, + bhv_vnode_t *vp, struct inode *dir) { struct inode *ip = vn_to_inode(vp); @@ -242,7 +236,7 @@ xfs_init_security( return -error; } - VOP_ATTR_SET(vp, name, value, length, ATTR_SECURE, NULL, error); + error = bhv_vop_attr_set(vp, name, value, length, ATTR_SECURE, NULL); if (!error) VMODIFY(vp); @@ -265,13 +259,12 @@ xfs_has_fs_struct(struct task_struct *task) STATIC inline void xfs_cleanup_inode( - vnode_t *dvp, - vnode_t *vp, + bhv_vnode_t *dvp, + bhv_vnode_t *vp, struct dentry *dentry, int mode) { struct dentry teardown = {}; - int error; /* Oh, the horror. * If we can't add the ACL or we fail in @@ -282,9 +275,9 @@ xfs_cleanup_inode( teardown.d_name = dentry->d_name; if (S_ISDIR(mode)) - VOP_RMDIR(dvp, &teardown, NULL, error); + bhv_vop_rmdir(dvp, &teardown, NULL); else - VOP_REMOVE(dvp, &teardown, NULL, error); + bhv_vop_remove(dvp, &teardown, NULL); VN_RELE(vp); } @@ -296,8 +289,8 @@ xfs_vn_mknod( dev_t rdev) { struct inode *ip; - vattr_t vattr = { 0 }; - vnode_t *vp = NULL, *dvp = vn_from_inode(dir); + bhv_vattr_t vattr = { 0 }; + bhv_vnode_t *vp = NULL, *dvp = vn_from_inode(dir); xfs_acl_t *default_acl = NULL; attrexists_t test_default_acl = _ACL_DEFAULT_EXISTS; int error; @@ -331,10 +324,10 @@ xfs_vn_mknod( vattr.va_mask |= XFS_AT_RDEV; /*FALLTHROUGH*/ case S_IFREG: - VOP_CREATE(dvp, dentry, &vattr, &vp, NULL, error); + error = bhv_vop_create(dvp, dentry, &vattr, &vp, NULL); break; case S_IFDIR: - VOP_MKDIR(dvp, dentry, &vattr, &vp, NULL, error); + error = bhv_vop_mkdir(dvp, dentry, &vattr, &vp, NULL); break; default: error = EINVAL; @@ -397,14 +390,14 @@ xfs_vn_lookup( struct dentry *dentry, struct nameidata *nd) { - struct vnode *vp = vn_from_inode(dir), *cvp; + bhv_vnode_t *vp = vn_from_inode(dir), *cvp; int error; if (dentry->d_name.len >= MAXNAMELEN) return ERR_PTR(-ENAMETOOLONG); - VOP_LOOKUP(vp, dentry, &cvp, 0, NULL, NULL, error); - if (error) { + error = bhv_vop_lookup(vp, dentry, &cvp, 0, NULL, NULL); + if (unlikely(error)) { if (unlikely(error != ENOENT)) return ERR_PTR(-error); d_add(dentry, NULL); @@ -422,22 +415,21 @@ xfs_vn_link( struct dentry *dentry) { struct inode *ip; /* inode of guy being linked to */ - vnode_t *tdvp; /* target directory for new name/link */ - vnode_t *vp; /* vp of name being linked */ - vattr_t vattr; + bhv_vnode_t *tdvp; /* target directory for new name/link */ + bhv_vnode_t *vp; /* vp of name being linked */ + bhv_vattr_t vattr; int error; ip = old_dentry->d_inode; /* inode being linked to */ - if (S_ISDIR(ip->i_mode)) - return -EPERM; - tdvp = vn_from_inode(dir); vp = vn_from_inode(ip); - VOP_LINK(tdvp, vp, dentry, NULL, error); - if (likely(!error)) { + VN_HOLD(vp); + error = bhv_vop_link(tdvp, vp, dentry, NULL); + if (unlikely(error)) { + VN_RELE(vp); + } else { VMODIFY(tdvp); - VN_HOLD(vp); xfs_validate_fields(ip, &vattr); d_instantiate(dentry, ip); } @@ -450,14 +442,14 @@ xfs_vn_unlink( struct dentry *dentry) { struct inode *inode; - vnode_t *dvp; /* directory containing name to remove */ - vattr_t vattr; + bhv_vnode_t *dvp; /* directory containing name to remove */ + bhv_vattr_t vattr; int error; inode = dentry->d_inode; dvp = vn_from_inode(dir); - VOP_REMOVE(dvp, dentry, NULL, error); + error = bhv_vop_remove(dvp, dentry, NULL); if (likely(!error)) { xfs_validate_fields(dir, &vattr); /* size needs update */ xfs_validate_fields(inode, &vattr); @@ -472,27 +464,26 @@ xfs_vn_symlink( const char *symname) { struct inode *ip; - vattr_t vattr = { 0 }; - vnode_t *dvp; /* directory containing name of symlink */ - vnode_t *cvp; /* used to lookup symlink to put in dentry */ + bhv_vattr_t va = { 0 }; + bhv_vnode_t *dvp; /* directory containing name of symlink */ + bhv_vnode_t *cvp; /* used to lookup symlink to put in dentry */ int error; dvp = vn_from_inode(dir); cvp = NULL; - vattr.va_mode = S_IFLNK | + va.va_mode = S_IFLNK | (irix_symlink_mode ? 0777 & ~current->fs->umask : S_IRWXUGO); - vattr.va_mask = XFS_AT_TYPE|XFS_AT_MODE; + va.va_mask = XFS_AT_TYPE|XFS_AT_MODE; - error = 0; - VOP_SYMLINK(dvp, dentry, &vattr, (char *)symname, &cvp, NULL, error); + error = bhv_vop_symlink(dvp, dentry, &va, (char *)symname, &cvp, NULL); if (likely(!error && cvp)) { error = xfs_init_security(cvp, dir); if (likely(!error)) { ip = vn_to_inode(cvp); d_instantiate(dentry, ip); - xfs_validate_fields(dir, &vattr); - xfs_validate_fields(ip, &vattr); + xfs_validate_fields(dir, &va); + xfs_validate_fields(ip, &va); } else { xfs_cleanup_inode(dvp, cvp, dentry, 0); } @@ -506,11 +497,11 @@ xfs_vn_rmdir( struct dentry *dentry) { struct inode *inode = dentry->d_inode; - vnode_t *dvp = vn_from_inode(dir); - vattr_t vattr; + bhv_vnode_t *dvp = vn_from_inode(dir); + bhv_vattr_t vattr; int error; - VOP_RMDIR(dvp, dentry, NULL, error); + error = bhv_vop_rmdir(dvp, dentry, NULL); if (likely(!error)) { xfs_validate_fields(inode, &vattr); xfs_validate_fields(dir, &vattr); @@ -526,15 +517,15 @@ xfs_vn_rename( struct dentry *ndentry) { struct inode *new_inode = ndentry->d_inode; - vnode_t *fvp; /* from directory */ - vnode_t *tvp; /* target directory */ - vattr_t vattr; + bhv_vnode_t *fvp; /* from directory */ + bhv_vnode_t *tvp; /* target directory */ + bhv_vattr_t vattr; int error; fvp = vn_from_inode(odir); tvp = vn_from_inode(ndir); - VOP_RENAME(fvp, odentry, tvp, ndentry, NULL, error); + error = bhv_vop_rename(fvp, odentry, tvp, ndentry, NULL); if (likely(!error)) { if (new_inode) xfs_validate_fields(new_inode, &vattr); @@ -555,7 +546,7 @@ xfs_vn_follow_link( struct dentry *dentry, struct nameidata *nd) { - vnode_t *vp; + bhv_vnode_t *vp; uio_t *uio; iovec_t iov; int error; @@ -588,8 +579,8 @@ xfs_vn_follow_link( uio->uio_resid = MAXPATHLEN; uio->uio_iovcnt = 1; - VOP_READLINK(vp, uio, 0, NULL, error); - if (error) { + error = bhv_vop_readlink(vp, uio, 0, NULL); + if (unlikely(error)) { kfree(link); link = ERR_PTR(-error); } else { @@ -620,12 +611,7 @@ xfs_vn_permission( int mode, struct nameidata *nd) { - vnode_t *vp = vn_from_inode(inode); - int error; - - mode <<= 6; /* convert from linux to vnode access bits */ - VOP_ACCESS(vp, mode, NULL, error); - return -error; + return -bhv_vop_access(vn_from_inode(inode), mode << 6, NULL); } #else #define xfs_vn_permission NULL @@ -638,14 +624,29 @@ xfs_vn_getattr( struct kstat *stat) { struct inode *inode = dentry->d_inode; - vnode_t *vp = vn_from_inode(inode); - int error = 0; + bhv_vnode_t *vp = vn_from_inode(inode); + bhv_vattr_t vattr = { .va_mask = XFS_AT_STAT }; + int error; - if (unlikely(vp->v_flag & VMODIFIED)) - error = vn_revalidate(vp); - if (!error) - generic_fillattr(inode, stat); - return 0; + error = bhv_vop_getattr(vp, &vattr, ATTR_LAZY, NULL); + if (likely(!error)) { + stat->size = i_size_read(inode); + stat->dev = inode->i_sb->s_dev; + stat->rdev = (vattr.va_rdev == 0) ? 0 : + MKDEV(sysv_major(vattr.va_rdev) & 0x1ff, + sysv_minor(vattr.va_rdev)); + stat->mode = vattr.va_mode; + stat->nlink = vattr.va_nlink; + stat->uid = vattr.va_uid; + stat->gid = vattr.va_gid; + stat->ino = vattr.va_nodeid; + stat->atime = vattr.va_atime; + stat->mtime = vattr.va_mtime; + stat->ctime = vattr.va_ctime; + stat->blocks = vattr.va_nblocks; + stat->blksize = vattr.va_blocksize; + } + return -error; } STATIC int @@ -655,8 +656,8 @@ xfs_vn_setattr( { struct inode *inode = dentry->d_inode; unsigned int ia_valid = attr->ia_valid; - vnode_t *vp = vn_from_inode(inode); - vattr_t vattr = { 0 }; + bhv_vnode_t *vp = vn_from_inode(inode); + bhv_vattr_t vattr = { 0 }; int flags = 0; int error; @@ -707,7 +708,7 @@ xfs_vn_setattr( flags |= ATTR_NONBLOCK; #endif - VOP_SETATTR(vp, &vattr, flags, NULL, error); + error = bhv_vop_setattr(vp, &vattr, flags, NULL); if (likely(!error)) __vn_revalidate(vp, &vattr); return -error; @@ -724,15 +725,16 @@ STATIC int xfs_vn_sync_flags(struct inode *inode) { unsigned int oldflags, newflags; - vattr_t vattr; int flags = 0; int error; - vnode_t *vp = vn_from_inode(inode); + bhv_vattr_t vattr; + bhv_vnode_t *vp = vn_from_inode(inode); - memset(&vattr, 0, sizeof(vattr_t)); + memset(&vattr, 0, sizeof vattr); vattr.va_mask = XFS_AT_XFLAGS; - VOP_GETATTR(vp, &vattr, 0, NULL, error); + error = bhv_vop_getattr(vp, &vattr, 0, NULL); + if (error) return error; oldflags = vattr.va_xflags; @@ -749,7 +751,7 @@ xfs_vn_sync_flags(struct inode *inode) if (oldflags ^ newflags) { vattr.va_xflags = newflags; vattr.va_mask |= XFS_AT_XFLAGS; - VOP_SETATTR(vp, &vattr, flags, NULL, error); + error = bhv_vop_setattr(vp, &vattr, flags, NULL); } vn_revalidate(vp); return error; @@ -763,7 +765,7 @@ xfs_vn_setxattr( size_t size, int flags) { - vnode_t *vp = vn_from_inode(dentry->d_inode); + bhv_vnode_t *vp = vn_from_inode(dentry->d_inode); char *attr = (char *)name; attrnames_t *namesp; int xflags = 0; @@ -793,7 +795,7 @@ xfs_vn_getxattr( void *data, size_t size) { - vnode_t *vp = vn_from_inode(dentry->d_inode); + bhv_vnode_t *vp = vn_from_inode(dentry->d_inode); char *attr = (char *)name; attrnames_t *namesp; int xflags = 0; @@ -822,7 +824,7 @@ xfs_vn_listxattr( char *data, size_t size) { - vnode_t *vp = vn_from_inode(dentry->d_inode); + bhv_vnode_t *vp = vn_from_inode(dentry->d_inode); int error, xflags = ATTR_KERNAMELS; ssize_t result; @@ -841,7 +843,7 @@ xfs_vn_removexattr( struct dentry *dentry, const char *name) { - vnode_t *vp = vn_from_inode(dentry->d_inode); + bhv_vnode_t *vp = vn_from_inode(dentry->d_inode); char *attr = (char *)name; attrnames_t *namesp; int xflags = 0; diff --git a/fs/xfs/linux-2.6/xfs_linux.h b/fs/xfs/linux-2.6/xfs_linux.h index 39e014c94..bf9f7b6e3 100644 --- a/fs/xfs/linux-2.6/xfs_linux.h +++ b/fs/xfs/linux-2.6/xfs_linux.h @@ -19,7 +19,6 @@ #define __XFS_LINUX__ #include -#include /* * Some types are conditional depending on the target system. @@ -134,15 +133,20 @@ BUFFER_FNS(PrivateStart, unwritten); #define xfs_buf_age_centisecs xfs_params.xfs_buf_age.val #define xfs_inherit_nosymlinks xfs_params.inherit_nosym.val #define xfs_rotorstep xfs_params.rotorstep.val +#define xfs_inherit_nodefrag xfs_params.inherit_nodfrg.val -#ifndef raw_smp_processor_id -#define raw_smp_processor_id() smp_processor_id() -#endif -#define current_cpu() raw_smp_processor_id() +#define current_cpu() (raw_smp_processor_id()) #define current_pid() (current->pid) #define current_fsuid(cred) (current->fsuid) #define current_fsgid(cred) (current->fsgid) #define current_fsxid(cred,vp) (vx_current_fsxid(vn_to_inode(vp)->i_sb)) +#define current_test_flags(f) (current->flags & (f)) +#define current_set_flags_nested(sp, f) \ + (*(sp) = current->flags, current->flags |= (f)) +#define current_clear_flags_nested(sp, f) \ + (*(sp) = current->flags, current->flags &= ~(f)) +#define current_restore_flags_nested(sp, f) \ + (current->flags = ((current->flags & ~(f)) | (*(sp) & (f)))) #define NBPP PAGE_SIZE #define DPPSHFT (PAGE_SHIFT - 9) @@ -188,25 +192,9 @@ BUFFER_FNS(PrivateStart, unwritten); /* bytes to clicks */ #define btoc(x) (((__psunsigned_t)(x)+(NBPC-1))>>BPCSHIFT) -#ifndef ENOATTR #define ENOATTR ENODATA /* Attribute not found */ -#endif - -/* Note: EWRONGFS never visible outside the kernel */ -#define EWRONGFS EINVAL /* Mount with wrong filesystem type */ - -/* - * XXX EFSCORRUPTED needs a real value in errno.h. asm-i386/errno.h won't - * return codes out of its known range in errno. - * XXX Also note: needs to be < 1000 and fairly unique on Linux (mustn't - * conflict with any code we use already or any code a driver may use) - * XXX Some options (currently we do #2): - * 1/ New error code ["Filesystem is corrupted", _after_ glibc updated] - * 2/ 990 ["Unknown error 990"] - * 3/ EUCLEAN ["Structure needs cleaning"] - * 4/ Convert EFSCORRUPTED to EIO [just prior to return into userspace] - */ -#define EFSCORRUPTED 990 /* Filesystem is corrupted */ +#define EWRONGFS EINVAL /* Mount with wrong filesystem type */ +#define EFSCORRUPTED EUCLEAN /* Filesystem is corrupted */ #define SYNCHRONIZE() barrier() #define __return_address __builtin_return_address(0) @@ -228,7 +216,6 @@ BUFFER_FNS(PrivateStart, unwritten); #define MIN(a,b) (min(a,b)) #define MAX(a,b) (max(a,b)) #define howmany(x, y) (((x)+((y)-1))/(y)) -#define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) /* * Various platform dependent calls that don't fit anywhere else diff --git a/fs/xfs/linux-2.6/xfs_lrw.c b/fs/xfs/linux-2.6/xfs_lrw.c index 67efe3308..ee788b1cb 100644 --- a/fs/xfs/linux-2.6/xfs_lrw.c +++ b/fs/xfs/linux-2.6/xfs_lrw.c @@ -23,7 +23,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_dmapi.h" @@ -32,7 +31,6 @@ #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -206,7 +204,7 @@ xfs_read( xfs_fsize_t n; xfs_inode_t *ip; xfs_mount_t *mp; - vnode_t *vp; + bhv_vnode_t *vp; unsigned long seg; ip = XFS_BHVTOI(bdp); @@ -258,7 +256,7 @@ xfs_read( if (DM_EVENT_ENABLED(vp->v_vfsp, ip, DM_EVENT_READ) && !(ioflags & IO_INVIS)) { - vrwlock_t locktype = VRWLOCK_READ; + bhv_vrwlock_t locktype = VRWLOCK_READ; int dmflags = FILP_DELAY_FLAG(file) | DM_SEM_FLAG_RD(ioflags); ret = -XFS_SEND_DATA(mp, DM_EVENT_READ, @@ -266,14 +264,19 @@ xfs_read( dmflags, &locktype); if (ret) { xfs_iunlock(ip, XFS_IOLOCK_SHARED); - goto unlock_mutex; + if (unlikely(ioflags & IO_ISDIRECT)) + mutex_unlock(&inode->i_mutex); + return ret; } } if (unlikely((ioflags & IO_ISDIRECT) && VN_CACHED(vp))) - VOP_FLUSHINVAL_PAGES(vp, ctooff(offtoct(*offset)), + bhv_vop_flushinval_pages(vp, ctooff(offtoct(*offset)), -1, FI_REMAPF_LOCKED); + if (unlikely(ioflags & IO_ISDIRECT)) + mutex_unlock(&inode->i_mutex); + xfs_rw_enter_trace(XFS_READ_ENTER, &ip->i_iocore, (void *)iovp, segs, *offset, ioflags); ret = __generic_file_aio_read(iocb, iovp, segs, offset); @@ -283,10 +286,6 @@ xfs_read( XFS_STATS_ADD(xs_read_bytes, ret); xfs_iunlock(ip, XFS_IOLOCK_SHARED); - -unlock_mutex: - if (unlikely(ioflags & IO_ISDIRECT)) - mutex_unlock(&inode->i_mutex); return ret; } @@ -313,7 +312,7 @@ xfs_sendfile( if (DM_EVENT_ENABLED(BHV_TO_VNODE(bdp)->v_vfsp, ip, DM_EVENT_READ) && (!(ioflags & IO_INVIS))) { - vrwlock_t locktype = VRWLOCK_READ; + bhv_vrwlock_t locktype = VRWLOCK_READ; int error; error = XFS_SEND_DATA(mp, DM_EVENT_READ, BHV_TO_VNODE(bdp), @@ -357,7 +356,7 @@ xfs_splice_read( if (DM_EVENT_ENABLED(BHV_TO_VNODE(bdp)->v_vfsp, ip, DM_EVENT_READ) && (!(ioflags & IO_INVIS))) { - vrwlock_t locktype = VRWLOCK_READ; + bhv_vrwlock_t locktype = VRWLOCK_READ; int error; error = XFS_SEND_DATA(mp, DM_EVENT_READ, BHV_TO_VNODE(bdp), @@ -392,6 +391,8 @@ xfs_splice_write( xfs_inode_t *ip = XFS_BHVTOI(bdp); xfs_mount_t *mp = ip->i_mount; ssize_t ret; + struct inode *inode = outfilp->f_mapping->host; + xfs_fsize_t isize; XFS_STATS_INC(xs_write_calls); if (XFS_FORCED_SHUTDOWN(ip->i_mount)) @@ -401,7 +402,7 @@ xfs_splice_write( if (DM_EVENT_ENABLED(BHV_TO_VNODE(bdp)->v_vfsp, ip, DM_EVENT_WRITE) && (!(ioflags & IO_INVIS))) { - vrwlock_t locktype = VRWLOCK_WRITE; + bhv_vrwlock_t locktype = VRWLOCK_WRITE; int error; error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, BHV_TO_VNODE(bdp), @@ -418,6 +419,20 @@ xfs_splice_write( if (ret > 0) XFS_STATS_ADD(xs_write_bytes, ret); + isize = i_size_read(inode); + if (unlikely(ret < 0 && ret != -EFAULT && *ppos > isize)) + *ppos = isize; + + if (*ppos > ip->i_d.di_size) { + xfs_ilock(ip, XFS_ILOCK_EXCL); + if (*ppos > ip->i_d.di_size) { + ip->i_d.di_size = *ppos; + i_size_write(inode, *ppos); + ip->i_update_core = 1; + ip->i_update_size = 1; + } + xfs_iunlock(ip, XFS_ILOCK_EXCL); + } xfs_iunlock(ip, XFS_IOLOCK_EXCL); return ret; } @@ -458,7 +473,7 @@ xfs_zero_last_block( last_fsb = XFS_B_TO_FSBT(mp, isize); nimaps = 1; error = XFS_BMAPI(mp, NULL, io, last_fsb, 1, 0, NULL, 0, &imap, - &nimaps, NULL); + &nimaps, NULL, NULL); if (error) { return error; } @@ -499,7 +514,7 @@ xfs_zero_last_block( int /* error (positive) */ xfs_zero_eof( - vnode_t *vp, + bhv_vnode_t *vp, xfs_iocore_t *io, xfs_off_t offset, /* starting I/O offset */ xfs_fsize_t isize, /* current inode size */ @@ -510,7 +525,6 @@ xfs_zero_eof( xfs_fileoff_t end_zero_fsb; xfs_fileoff_t zero_count_fsb; xfs_fileoff_t last_fsb; - xfs_extlen_t buf_len_fsb; xfs_mount_t *mp = io->io_mount; int nimaps; int error = 0; @@ -556,7 +570,7 @@ xfs_zero_eof( nimaps = 1; zero_count_fsb = end_zero_fsb - start_zero_fsb + 1; error = XFS_BMAPI(mp, NULL, io, start_zero_fsb, zero_count_fsb, - 0, NULL, 0, &imap, &nimaps, NULL); + 0, NULL, 0, &imap, &nimaps, NULL, NULL); if (error) { ASSERT(ismrlocked(io->io_lock, MR_UPDATE)); ASSERT(ismrlocked(io->io_iolock, MR_UPDATE)); @@ -579,16 +593,7 @@ xfs_zero_eof( } /* - * There are blocks in the range requested. - * Zero them a single write at a time. We actually - * don't zero the entire range returned if it is - * too big and simply loop around to get the rest. - * That is not the most efficient thing to do, but it - * is simple and this path should not be exercised often. - */ - buf_len_fsb = XFS_FILBLKS_MIN(imap.br_blockcount, - mp->m_writeio_blocks << 8); - /* + * There are blocks we need to zero. * Drop the inode lock while we're doing the I/O. * We'll still have the iolock to protect us. */ @@ -596,14 +601,13 @@ xfs_zero_eof( error = xfs_iozero(ip, XFS_FSB_TO_B(mp, start_zero_fsb), - XFS_FSB_TO_B(mp, buf_len_fsb), + XFS_FSB_TO_B(mp, imap.br_blockcount), end_size); - if (error) { goto out_lock; } - start_zero_fsb = imap.br_startoff + buf_len_fsb; + start_zero_fsb = imap.br_startoff + imap.br_blockcount; ASSERT(start_zero_fsb <= (end_zero_fsb + 1)); XFS_ILOCK(mp, io, XFS_ILOCK_EXCL|XFS_EXTSIZE_RD); @@ -637,11 +641,11 @@ xfs_write( ssize_t ret = 0, error = 0; xfs_fsize_t isize, new_size; xfs_iocore_t *io; - vnode_t *vp; + bhv_vnode_t *vp; unsigned long seg; int iolock; int eventsent = 0; - vrwlock_t locktype; + bhv_vrwlock_t locktype; size_t ocount = 0, count; loff_t pos; int need_i_mutex = 1, need_flush = 0; @@ -679,11 +683,11 @@ xfs_write( io = &xip->i_iocore; mp = io->io_mount; + vfs_wait_for_freeze(vp->v_vfsp, SB_FREEZE_WRITE); + if (XFS_FORCED_SHUTDOWN(mp)) return -EIO; - fs_check_frozen(vp->v_vfsp, SB_FREEZE_WRITE); - if (ioflags & IO_ISDIRECT) { xfs_buftarg_t *target = (xip->i_d.di_flags & XFS_DIFLAG_REALTIME) ? @@ -814,7 +818,7 @@ retry: if (need_flush) { xfs_inval_cached_trace(io, pos, -1, ctooff(offtoct(pos)), -1); - VOP_FLUSHINVAL_PAGES(vp, ctooff(offtoct(pos)), + bhv_vop_flushinval_pages(vp, ctooff(offtoct(pos)), -1, FI_REMAPF_LOCKED); } @@ -903,79 +907,9 @@ retry: /* Handle various SYNC-type writes */ if ((file->f_flags & O_SYNC) || IS_SYNC(inode)) { - /* - * If we're treating this as O_DSYNC and we have not updated the - * size, force the log. - */ - if (!(mp->m_flags & XFS_MOUNT_OSYNCISOSYNC) && - !(xip->i_update_size)) { - xfs_inode_log_item_t *iip = xip->i_itemp; - - /* - * If an allocation transaction occurred - * without extending the size, then we have to force - * the log up the proper point to ensure that the - * allocation is permanent. We can't count on - * the fact that buffered writes lock out direct I/O - * writes - the direct I/O write could have extended - * the size nontransactionally, then finished before - * we started. xfs_write_file will think that the file - * didn't grow but the update isn't safe unless the - * size change is logged. - * - * Force the log if we've committed a transaction - * against the inode or if someone else has and - * the commit record hasn't gone to disk (e.g. - * the inode is pinned). This guarantees that - * all changes affecting the inode are permanent - * when we return. - */ - if (iip && iip->ili_last_lsn) { - xfs_log_force(mp, iip->ili_last_lsn, - XFS_LOG_FORCE | XFS_LOG_SYNC); - } else if (xfs_ipincount(xip) > 0) { - xfs_log_force(mp, (xfs_lsn_t)0, - XFS_LOG_FORCE | XFS_LOG_SYNC); - } - - } else { - xfs_trans_t *tp; - - /* - * O_SYNC or O_DSYNC _with_ a size update are handled - * the same way. - * - * If the write was synchronous then we need to make - * sure that the inode modification time is permanent. - * We'll have updated the timestamp above, so here - * we use a synchronous transaction to log the inode. - * It's not fast, but it's necessary. - * - * If this a dsync write and the size got changed - * non-transactionally, then we need to ensure that - * the size change gets logged in a synchronous - * transaction. - */ - - tp = xfs_trans_alloc(mp, XFS_TRANS_WRITE_SYNC); - if ((error = xfs_trans_reserve(tp, 0, - XFS_SWRITE_LOG_RES(mp), - 0, 0, 0))) { - /* Transaction reserve failed */ - xfs_trans_cancel(tp, 0); - } else { - /* Transaction reserve successful */ - xfs_ilock(xip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, xip, XFS_ILOCK_EXCL); - xfs_trans_ihold(tp, xip); - xfs_trans_log_inode(tp, xip, XFS_ILOG_CORE); - xfs_trans_set_sync(tp); - error = xfs_trans_commit(tp, 0, NULL); - xfs_iunlock(xip, XFS_ILOCK_EXCL); - } - if (error) - goto out_unlock_internal; - } + error = xfs_write_sync_logforce(mp, xip); + if (error) + goto out_unlock_internal; xfs_rwunlock(bdp, locktype); if (need_i_mutex) diff --git a/fs/xfs/linux-2.6/xfs_lrw.h b/fs/xfs/linux-2.6/xfs_lrw.h index d723e3525..c77e62efb 100644 --- a/fs/xfs/linux-2.6/xfs_lrw.h +++ b/fs/xfs/linux-2.6/xfs_lrw.h @@ -1,39 +1,25 @@ /* - * Copyright (c) 2000-2003 Silicon Graphics, Inc. All Rights Reserved. + * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * All Rights Reserved. * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as + * 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. * - * This program is distributed in the hope that it would be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * This program is distributed in the hope that it would 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. * - * Further, this software is distributed without any warranty that it is - * free of the rightful claim of any third person regarding infringement - * or the like. Any license provided herein, whether implied or - * otherwise, applies only to this software file. Patent licenses, if - * any, provided herein do not apply to combinations of this program with - * other software, or any other product whatsoever. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston MA 02111-1307, USA. - * - * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, - * Mountain View, CA 94043, or: - * - * http://www.sgi.com - * - * For further information regarding this notice, see: - * - * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef __XFS_LRW_H__ #define __XFS_LRW_H__ -struct vnode; struct bhv_desc; +struct bhv_vnode; struct xfs_mount; struct xfs_iocore; struct xfs_inode; @@ -63,16 +49,19 @@ struct xfs_iomap; #define XFS_CTRUNC4 14 #define XFS_CTRUNC5 15 #define XFS_CTRUNC6 16 -#define XFS_BUNMAPI 17 +#define XFS_BUNMAP 17 #define XFS_INVAL_CACHED 18 #define XFS_DIORD_ENTER 19 #define XFS_DIOWR_ENTER 20 #define XFS_SENDFILE_ENTER 21 #define XFS_WRITEPAGE_ENTER 22 #define XFS_RELEASEPAGE_ENTER 23 -#define XFS_IOMAP_ALLOC_ENTER 24 -#define XFS_IOMAP_ALLOC_MAP 25 -#define XFS_IOMAP_UNWRITTEN 26 +#define XFS_INVALIDPAGE_ENTER 24 +#define XFS_IOMAP_ALLOC_ENTER 25 +#define XFS_IOMAP_ALLOC_MAP 26 +#define XFS_IOMAP_UNWRITTEN 27 +#define XFS_SPLICE_READ_ENTER 28 +#define XFS_SPLICE_WRITE_ENTER 29 extern void xfs_rw_enter_trace(int, struct xfs_iocore *, void *, size_t, loff_t, int); extern void xfs_inval_cached_trace(struct xfs_iocore *, @@ -91,11 +80,10 @@ extern int xfs_bmap(struct bhv_desc *, xfs_off_t, ssize_t, int, struct xfs_iomap *, int *); extern int xfsbdstrat(struct xfs_mount *, struct xfs_buf *); extern int xfs_bdstrat_cb(struct xfs_buf *); +extern int xfs_dev_is_read_only(struct xfs_mount *, char *); -extern int xfs_zero_eof(struct vnode *, struct xfs_iocore *, xfs_off_t, +extern int xfs_zero_eof(struct bhv_vnode *, struct xfs_iocore *, xfs_off_t, xfs_fsize_t, xfs_fsize_t); -extern void xfs_inval_cached_pages(struct vnode *, struct xfs_iocore *, - xfs_off_t, int, int); extern ssize_t xfs_read(struct bhv_desc *, struct kiocb *, const struct iovec *, unsigned int, loff_t *, int, struct cred *); @@ -105,12 +93,11 @@ extern ssize_t xfs_write(struct bhv_desc *, struct kiocb *, extern ssize_t xfs_sendfile(struct bhv_desc *, struct file *, loff_t *, int, size_t, read_actor_t, void *, struct cred *); - -extern int xfs_dev_is_read_only(struct xfs_mount *, char *); - -#define XFS_FSB_TO_DB_IO(io,fsb) \ - (((io)->io_flags & XFS_IOCORE_RT) ? \ - XFS_FSB_TO_BB((io)->io_mount, (fsb)) : \ - XFS_FSB_TO_DADDR((io)->io_mount, (fsb))) +extern ssize_t xfs_splice_read(struct bhv_desc *, struct file *, loff_t *, + struct pipe_inode_info *, size_t, int, int, + struct cred *); +extern ssize_t xfs_splice_write(struct bhv_desc *, struct pipe_inode_info *, + struct file *, loff_t *, size_t, int, int, + struct cred *); #endif /* __XFS_LRW_H__ */ diff --git a/fs/xfs/linux-2.6/xfs_stats.c b/fs/xfs/linux-2.6/xfs_stats.c index aaf5ddba4..e480b6102 100644 --- a/fs/xfs/linux-2.6/xfs_stats.c +++ b/fs/xfs/linux-2.6/xfs_stats.c @@ -1,35 +1,20 @@ /* - * Copyright (c) 2000-2003 Silicon Graphics, Inc. All Rights Reserved. + * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * All Rights Reserved. * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as + * 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. * - * This program is distributed in the hope that it would be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * This program is distributed in the hope that it would 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. * - * Further, this software is distributed without any warranty that it is - * free of the rightful claim of any third person regarding infringement - * or the like. Any license provided herein, whether implied or - * otherwise, applies only to this software file. Patent licenses, if - * any, provided herein do not apply to combinations of this program with - * other software, or any other product whatsoever. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston MA 02111-1307, USA. - * - * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, - * Mountain View, CA 94043, or: - * - * http://www.sgi.com - * - * For further information regarding this notice, see: - * - * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - #include "xfs.h" #include @@ -49,7 +34,7 @@ xfs_read_xfsstats( __uint64_t xs_write_bytes = 0; __uint64_t xs_read_bytes = 0; - static struct xstats_entry { + static const struct xstats_entry { char *desc; int endpoint; } xstats[] = { @@ -71,24 +56,21 @@ xfs_read_xfsstats( }; /* Loop over all stats groups */ - for (i=j=len = 0; i < sizeof(xstats)/sizeof(struct xstats_entry); i++) { + for (i=j=len = 0; i < ARRAY_SIZE(xstats); i++) { len += sprintf(buffer + len, xstats[i].desc); /* inner loop does each group */ while (j < xstats[i].endpoint) { val = 0; /* sum over all cpus */ - for (c = 0; c < NR_CPUS; c++) { - if (!cpu_possible(c)) continue; + for_each_possible_cpu(c) val += *(((__u32*)&per_cpu(xfsstats, c) + j)); - } len += sprintf(buffer + len, " %u", val); j++; } buffer[len++] = '\n'; } /* extra precision counters */ - for (i = 0; i < NR_CPUS; i++) { - if (!cpu_possible(i)) continue; + for_each_possible_cpu(i) { xs_xstrat_bytes += per_cpu(xfsstats, i).xs_xstrat_bytes; xs_write_bytes += per_cpu(xfsstats, i).xs_write_bytes; xs_read_bytes += per_cpu(xfsstats, i).xs_read_bytes; diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 4a79c7f2d..49c220dab 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2006 Silicon Graphics, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -23,7 +23,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_dmapi.h" @@ -32,7 +31,6 @@ #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -151,7 +149,7 @@ xfs_set_inodeops( STATIC __inline__ void xfs_revalidate_inode( xfs_mount_t *mp, - vnode_t *vp, + bhv_vnode_t *vp, xfs_inode_t *ip) { struct inode *inode = vn_to_inode(vp); @@ -174,7 +172,6 @@ xfs_revalidate_inode( break; } - inode->i_blksize = xfs_preferred_iosize(mp); inode->i_generation = ip->i_d.di_gen; i_size_write(inode, ip->i_d.di_size); inode->i_blocks = @@ -215,7 +212,7 @@ xfs_revalidate_inode( void xfs_initialize_vnode( bhv_desc_t *bdp, - vnode_t *vp, + bhv_vnode_t *vp, bhv_desc_t *inode_bhv, int unlock) { @@ -325,6 +322,13 @@ xfs_mountfs_check_barriers(xfs_mount_t *mp) return; } + if (xfs_readonly_buftarg(mp->m_ddev_targp)) { + xfs_fs_cmn_err(CE_NOTE, mp, + "Disabling barriers, underlying device is readonly"); + mp->m_flags &= ~XFS_MOUNT_BARRIER; + return; + } + error = xfs_barrier_test(mp); if (error) { xfs_fs_cmn_err(CE_NOTE, mp, @@ -345,7 +349,7 @@ STATIC struct inode * xfs_fs_alloc_inode( struct super_block *sb) { - vnode_t *vp; + bhv_vnode_t *vp; vp = kmem_zone_alloc(xfs_vnode_zone, KM_SLEEP); if (unlikely(!vp)) @@ -368,13 +372,13 @@ xfs_fs_inode_init_once( { if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) == SLAB_CTOR_CONSTRUCTOR) - inode_init_once(vn_to_inode((vnode_t *)vnode)); + inode_init_once(vn_to_inode((bhv_vnode_t *)vnode)); } STATIC int xfs_init_zones(void) { - xfs_vnode_zone = kmem_zone_init_flags(sizeof(vnode_t), "xfs_vnode_t", + xfs_vnode_zone = kmem_zone_init_flags(sizeof(bhv_vnode_t), "xfs_vnode", KM_ZONE_HWALIGN | KM_ZONE_RECLAIM | KM_ZONE_SPREAD, xfs_fs_inode_init_once); @@ -418,22 +422,17 @@ xfs_fs_write_inode( struct inode *inode, int sync) { - vnode_t *vp = vn_from_inode(inode); + bhv_vnode_t *vp = vn_from_inode(inode); int error = 0, flags = FLUSH_INODE; if (vp) { vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address); if (sync) flags |= FLUSH_SYNC; - VOP_IFLUSH(vp, flags, error); - if (error == EAGAIN) { - if (sync) - VOP_IFLUSH(vp, flags | FLUSH_LOG, error); - else - error = 0; - } + error = bhv_vop_iflush(vp, flags); + if (error == EAGAIN) + error = sync? bhv_vop_iflush(vp, flags | FLUSH_LOG) : 0; } - return -error; } @@ -441,8 +440,7 @@ STATIC void xfs_fs_clear_inode( struct inode *inode) { - vnode_t *vp = vn_from_inode(inode); - int error, cache; + bhv_vnode_t *vp = vn_from_inode(inode); vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address); @@ -455,20 +453,18 @@ xfs_fs_clear_inode( * This can happen because xfs_iget_core calls xfs_idestroy if we * find an inode with di_mode == 0 but without IGET_CREATE set. */ - if (vp->v_fbhv) - VOP_INACTIVE(vp, NULL, cache); + if (VNHEAD(vp)) + bhv_vop_inactive(vp, NULL); VN_LOCK(vp); vp->v_flag &= ~VMODIFIED; VN_UNLOCK(vp, 0); - if (vp->v_fbhv) { - VOP_RECLAIM(vp, error); - if (error) - panic("vn_purge: cannot reclaim"); - } + if (VNHEAD(vp)) + if (bhv_vop_reclaim(vp)) + panic("%s: cannot reclaim 0x%p\n", __FUNCTION__, vp); - ASSERT(vp->v_fbhv == NULL); + ASSERT(VNHEAD(vp) == NULL); #ifdef XFS_VNODE_TRACE ktrace_free(vp->v_trace); @@ -484,13 +480,13 @@ xfs_fs_clear_inode( */ STATIC void xfs_syncd_queue_work( - struct vfs *vfs, + struct bhv_vfs *vfs, void *data, - void (*syncer)(vfs_t *, void *)) + void (*syncer)(bhv_vfs_t *, void *)) { - vfs_sync_work_t *work; + struct bhv_vfs_sync_work *work; - work = kmem_alloc(sizeof(struct vfs_sync_work), KM_SLEEP); + work = kmem_alloc(sizeof(struct bhv_vfs_sync_work), KM_SLEEP); INIT_LIST_HEAD(&work->w_list); work->w_syncer = syncer; work->w_data = data; @@ -509,7 +505,7 @@ xfs_syncd_queue_work( */ STATIC void xfs_flush_inode_work( - vfs_t *vfs, + bhv_vfs_t *vfs, void *inode) { filemap_flush(((struct inode *)inode)->i_mapping); @@ -521,7 +517,7 @@ xfs_flush_inode( xfs_inode_t *ip) { struct inode *inode = vn_to_inode(XFS_ITOV(ip)); - struct vfs *vfs = XFS_MTOVFS(ip->i_mount); + struct bhv_vfs *vfs = XFS_MTOVFS(ip->i_mount); igrab(inode); xfs_syncd_queue_work(vfs, inode, xfs_flush_inode_work); @@ -534,7 +530,7 @@ xfs_flush_inode( */ STATIC void xfs_flush_device_work( - vfs_t *vfs, + bhv_vfs_t *vfs, void *inode) { sync_blockdev(vfs->vfs_super->s_bdev); @@ -546,7 +542,7 @@ xfs_flush_device( xfs_inode_t *ip) { struct inode *inode = vn_to_inode(XFS_ITOV(ip)); - struct vfs *vfs = XFS_MTOVFS(ip->i_mount); + struct bhv_vfs *vfs = XFS_MTOVFS(ip->i_mount); igrab(inode); xfs_syncd_queue_work(vfs, inode, xfs_flush_device_work); @@ -554,16 +550,16 @@ xfs_flush_device( xfs_log_force(ip->i_mount, (xfs_lsn_t)0, XFS_LOG_FORCE|XFS_LOG_SYNC); } -#define SYNCD_FLAGS (SYNC_FSDATA|SYNC_BDFLUSH|SYNC_ATTR|SYNC_REFCACHE) STATIC void vfs_sync_worker( - vfs_t *vfsp, + bhv_vfs_t *vfsp, void *unused) { int error; if (!(vfsp->vfs_flag & VFS_RDONLY)) - VFS_SYNC(vfsp, SYNCD_FLAGS, NULL, error); + error = bhv_vfs_sync(vfsp, SYNC_FSDATA | SYNC_BDFLUSH | \ + SYNC_ATTR | SYNC_REFCACHE, NULL); vfsp->vfs_sync_seq++; wmb(); wake_up(&vfsp->vfs_wait_single_sync_task); @@ -574,8 +570,8 @@ xfssyncd( void *arg) { long timeleft; - vfs_t *vfsp = (vfs_t *) arg; - struct vfs_sync_work *work, *n; + bhv_vfs_t *vfsp = (bhv_vfs_t *) arg; + bhv_vfs_sync_work_t *work, *n; LIST_HEAD (tmp); timeleft = xfs_syncd_centisecs * msecs_to_jiffies(10); @@ -609,7 +605,7 @@ xfssyncd( list_del(&work->w_list); if (work == &vfsp->vfs_sync_work) continue; - kmem_free(work, sizeof(struct vfs_sync_work)); + kmem_free(work, sizeof(struct bhv_vfs_sync_work)); } } @@ -618,7 +614,7 @@ xfssyncd( STATIC int xfs_fs_start_syncd( - vfs_t *vfsp) + bhv_vfs_t *vfsp) { vfsp->vfs_sync_work.w_syncer = vfs_sync_worker; vfsp->vfs_sync_work.w_vfs = vfsp; @@ -630,7 +626,7 @@ xfs_fs_start_syncd( STATIC void xfs_fs_stop_syncd( - vfs_t *vfsp) + bhv_vfs_t *vfsp) { kthread_stop(vfsp->vfs_sync_task); } @@ -639,35 +635,26 @@ STATIC void xfs_fs_put_super( struct super_block *sb) { - vfs_t *vfsp = vfs_from_sb(sb); + bhv_vfs_t *vfsp = vfs_from_sb(sb); int error; xfs_fs_stop_syncd(vfsp); - VFS_SYNC(vfsp, SYNC_ATTR|SYNC_DELWRI, NULL, error); - if (!error) - VFS_UNMOUNT(vfsp, 0, NULL, error); + bhv_vfs_sync(vfsp, SYNC_ATTR | SYNC_DELWRI, NULL); + error = bhv_vfs_unmount(vfsp, 0, NULL); if (error) { - printk("XFS unmount got error %d\n", error); - printk("%s: vfsp/0x%p left dangling!\n", __FUNCTION__, vfsp); - return; + printk("XFS: unmount got error=%d\n", error); + printk("%s: vfs=0x%p left dangling!\n", __FUNCTION__, vfsp); + } else { + vfs_deallocate(vfsp); } - - vfs_deallocate(vfsp); } STATIC void xfs_fs_write_super( struct super_block *sb) { - vfs_t *vfsp = vfs_from_sb(sb); - int error; - - if (sb->s_flags & MS_RDONLY) { - sb->s_dirt = 0; /* paranoia */ - return; - } - /* Push the log and superblock a little */ - VFS_SYNC(vfsp, SYNC_FSDATA, NULL, error); + if (!(sb->s_flags & MS_RDONLY)) + bhv_vfs_sync(vfs_from_sb(sb), SYNC_FSDATA, NULL); sb->s_dirt = 0; } @@ -676,16 +663,16 @@ xfs_fs_sync_super( struct super_block *sb, int wait) { - vfs_t *vfsp = vfs_from_sb(sb); - int error; - int flags = SYNC_FSDATA; + bhv_vfs_t *vfsp = vfs_from_sb(sb); + int error; + int flags; if (unlikely(sb->s_frozen == SB_FREEZE_WRITE)) flags = SYNC_QUIESCE; else flags = SYNC_FSDATA | (wait ? SYNC_WAIT : 0); - VFS_SYNC(vfsp, flags, NULL, error); + error = bhv_vfs_sync(vfsp, flags, NULL); sb->s_dirt = 0; if (unlikely(laptop_mode)) { @@ -712,14 +699,11 @@ xfs_fs_sync_super( STATIC int xfs_fs_statfs( - struct super_block *sb, + struct dentry *dentry, struct kstatfs *statp) { - vfs_t *vfsp = vfs_from_sb(sb); - int error; - - VFS_STATVFS(vfsp, statp, NULL, error); - return -error; + return -bhv_vfs_statvfs(vfs_from_sb(dentry->d_sb), statp, + vn_from_inode(dentry->d_inode)); } STATIC int @@ -728,11 +712,11 @@ xfs_fs_remount( int *flags, char *options) { - vfs_t *vfsp = vfs_from_sb(sb); + bhv_vfs_t *vfsp = vfs_from_sb(sb); struct xfs_mount_args *args = xfs_args_allocate(sb, 0); int error; - VFS_PARSEARGS(vfsp, options, args, 1, error); + error = bhv_vfs_parseargs(vfsp, options, args, 1); if ((args->flags2 & XFSMNT2_TAGXID) && !(sb->s_flags & MS_TAGXID)) { printk("XFS: %s: tagxid not permitted on remount.\n", @@ -740,7 +724,7 @@ xfs_fs_remount( error = EINVAL; } if (!error) - VFS_MNTUPDATE(vfsp, flags, args, error); + error = bhv_vfs_mntupdate(vfsp, flags, args); kmem_free(args, sizeof(*args)); return -error; } @@ -749,7 +733,7 @@ STATIC void xfs_fs_lockfs( struct super_block *sb) { - VFS_FREEZE(vfs_from_sb(sb)); + bhv_vfs_freeze(vfs_from_sb(sb)); } STATIC int @@ -757,11 +741,7 @@ xfs_fs_show_options( struct seq_file *m, struct vfsmount *mnt) { - struct vfs *vfsp = vfs_from_sb(mnt->mnt_sb); - int error; - - VFS_SHOWARGS(vfsp, m, error); - return error; + return -bhv_vfs_showargs(vfs_from_sb(mnt->mnt_sb), m); } STATIC int @@ -769,11 +749,7 @@ xfs_fs_quotasync( struct super_block *sb, int type) { - struct vfs *vfsp = vfs_from_sb(sb); - int error; - - VFS_QUOTACTL(vfsp, Q_XQUOTASYNC, 0, (caddr_t)NULL, error); - return -error; + return -bhv_vfs_quotactl(vfs_from_sb(sb), Q_XQUOTASYNC, 0, NULL); } STATIC int @@ -781,11 +757,7 @@ xfs_fs_getxstate( struct super_block *sb, struct fs_quota_stat *fqs) { - struct vfs *vfsp = vfs_from_sb(sb); - int error; - - VFS_QUOTACTL(vfsp, Q_XGETQSTAT, 0, (caddr_t)fqs, error); - return -error; + return -bhv_vfs_quotactl(vfs_from_sb(sb), Q_XGETQSTAT, 0, (caddr_t)fqs); } STATIC int @@ -794,11 +766,7 @@ xfs_fs_setxstate( unsigned int flags, int op) { - struct vfs *vfsp = vfs_from_sb(sb); - int error; - - VFS_QUOTACTL(vfsp, op, 0, (caddr_t)&flags, error); - return -error; + return -bhv_vfs_quotactl(vfs_from_sb(sb), op, 0, (caddr_t)&flags); } STATIC int @@ -808,13 +776,10 @@ xfs_fs_getxquota( qid_t id, struct fs_disk_quota *fdq) { - struct vfs *vfsp = vfs_from_sb(sb); - int error, getmode; - - getmode = (type == USRQUOTA) ? Q_XGETQUOTA : - ((type == GRPQUOTA) ? Q_XGETGQUOTA : Q_XGETPQUOTA); - VFS_QUOTACTL(vfsp, getmode, id, (caddr_t)fdq, error); - return -error; + return -bhv_vfs_quotactl(vfs_from_sb(sb), + (type == USRQUOTA) ? Q_XGETQUOTA : + ((type == GRPQUOTA) ? Q_XGETGQUOTA : + Q_XGETPQUOTA), id, (caddr_t)fdq); } STATIC int @@ -824,13 +789,10 @@ xfs_fs_setxquota( qid_t id, struct fs_disk_quota *fdq) { - struct vfs *vfsp = vfs_from_sb(sb); - int error, setmode; - - setmode = (type == USRQUOTA) ? Q_XSETQLIM : - ((type == GRPQUOTA) ? Q_XSETGQLIM : Q_XSETPQLIM); - VFS_QUOTACTL(vfsp, setmode, id, (caddr_t)fdq, error); - return -error; + return -bhv_vfs_quotactl(vfs_from_sb(sb), + (type == USRQUOTA) ? Q_XSETQLIM : + ((type == GRPQUOTA) ? Q_XSETGQLIM : + Q_XSETPQLIM), id, (caddr_t)fdq); } STATIC int @@ -839,34 +801,32 @@ xfs_fs_fill_super( void *data, int silent) { - vnode_t *rootvp; - struct vfs *vfsp = vfs_allocate(sb); + struct bhv_vnode *rootvp; + struct bhv_vfs *vfsp = vfs_allocate(sb); struct xfs_mount_args *args = xfs_args_allocate(sb, silent); struct kstatfs statvfs; - int error, error2; + int error; bhv_insert_all_vfsops(vfsp); - VFS_PARSEARGS(vfsp, (char *)data, args, 0, error); + error = bhv_vfs_parseargs(vfsp, (char *)data, args, 0); if (error) { bhv_remove_all_vfsops(vfsp, 1); goto fail_vfsop; } sb_min_blocksize(sb, BBSIZE); -#ifdef CONFIG_XFS_EXPORT sb->s_export_op = &xfs_export_operations; -#endif sb->s_qcop = &xfs_quotactl_operations; sb->s_op = &xfs_super_operations; - VFS_MOUNT(vfsp, args, NULL, error); + error = bhv_vfs_mount(vfsp, args, NULL); if (error) { bhv_remove_all_vfsops(vfsp, 1); goto fail_vfsop; } - VFS_STATVFS(vfsp, &statvfs, NULL, error); + error = bhv_vfs_statvfs(vfsp, &statvfs, NULL); if (error) goto fail_unmount; @@ -878,7 +838,7 @@ xfs_fs_fill_super( sb->s_time_gran = 1; set_posix_acl_flag(sb); - VFS_ROOT(vfsp, &rootvp, error); + error = bhv_vfs_root(vfsp, &rootvp); if (error) goto fail_unmount; @@ -907,7 +867,7 @@ fail_vnrele: } fail_unmount: - VFS_UNMOUNT(vfsp, 0, NULL, error2); + bhv_vfs_unmount(vfsp, 0, NULL); fail_vfsop: vfs_deallocate(vfsp); @@ -915,14 +875,16 @@ fail_vfsop: return -error; } -STATIC struct super_block * +STATIC int xfs_fs_get_sb( struct file_system_type *fs_type, int flags, const char *dev_name, - void *data) + void *data, + struct vfsmount *mnt) { - return get_sb_bdev(fs_type, flags, dev_name, data, xfs_fs_fill_super); + return get_sb_bdev(fs_type, flags, dev_name, data, xfs_fs_fill_super, + mnt); } STATIC struct super_operations xfs_super_operations = { diff --git a/fs/xfs/linux-2.6/xfs_super.h b/fs/xfs/linux-2.6/xfs_super.h index ec7e0035c..33dd1ca13 100644 --- a/fs/xfs/linux-2.6/xfs_super.h +++ b/fs/xfs/linux-2.6/xfs_super.h @@ -1,33 +1,19 @@ /* - * Copyright (c) 2000-2004 Silicon Graphics, Inc. All Rights Reserved. + * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * All Rights Reserved. * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as + * 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. * - * This program is distributed in the hope that it would be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * This program is distributed in the hope that it would 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. * - * Further, this software is distributed without any warranty that it is - * free of the rightful claim of any third person regarding infringement - * or the like. Any license provided herein, whether implied or - * otherwise, applies only to this software file. Patent licenses, if - * any, provided herein do not apply to combinations of this program with - * other software, or any other product whatsoever. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston MA 02111-1307, USA. - * - * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, - * Mountain View, CA 94043, or: - * - * http://www.sgi.com - * - * For further information regarding this notice, see: - * - * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef __XFS_SUPER_H__ #define __XFS_SUPER_H__ @@ -112,11 +98,6 @@ extern void xfs_qm_exit(void); XFS_DMAPI_STRING \ XFS_DBG_STRING /* DBG must be last */ -#define LINVFS_GET_VFS(s) \ - (vfs_t *)((s)->s_fs_info) -#define LINVFS_SET_VFS(s, vfsp) \ - ((s)->s_fs_info = vfsp) - struct xfs_inode; struct xfs_mount; struct xfs_buftarg; @@ -124,7 +105,7 @@ struct block_device; extern __uint64_t xfs_max_file_offset(unsigned int); -extern void xfs_initialize_vnode(bhv_desc_t *, vnode_t *, bhv_desc_t *, int); +extern void xfs_initialize_vnode(bhv_desc_t *, bhv_vnode_t *, bhv_desc_t *, int); extern void xfs_flush_inode(struct xfs_inode *); extern void xfs_flush_device(struct xfs_inode *); @@ -132,7 +113,8 @@ extern void xfs_flush_device(struct xfs_inode *); extern int xfs_blkdev_get(struct xfs_mount *, const char *, struct block_device **); extern void xfs_blkdev_put(struct block_device *); +extern void xfs_blkdev_issue_flush(struct xfs_buftarg *); -extern struct export_operations linvfs_export_ops; +extern struct export_operations xfs_export_operations; #endif /* __XFS_SUPER_H__ */ diff --git a/fs/xfs/linux-2.6/xfs_sysctl.c b/fs/xfs/linux-2.6/xfs_sysctl.c index f464bfac4..95ac0bede 100644 --- a/fs/xfs/linux-2.6/xfs_sysctl.c +++ b/fs/xfs/linux-2.6/xfs_sysctl.c @@ -38,7 +38,7 @@ xfs_stats_clear_proc_handler( if (!ret && write && *valp) { printk("XFS Clearing xfsstats\n"); - for_each_cpu(c) { + for_each_possible_cpu(c) { preempt_disable(); /* save vn_active, it's a universal truth! */ vn_active = per_cpu(xfsstats, c).vn_active; @@ -120,6 +120,11 @@ STATIC ctl_table xfs_table[] = { NULL, &sysctl_intvec, NULL, &xfs_params.rotorstep.min, &xfs_params.rotorstep.max}, + {XFS_INHERIT_NODFRG, "inherit_nodefrag", &xfs_params.inherit_nodfrg.val, + sizeof(int), 0644, NULL, &proc_dointvec_minmax, + NULL, &sysctl_intvec, NULL, + &xfs_params.inherit_nodfrg.min, &xfs_params.inherit_nodfrg.max}, + /* please keep this the last entry */ #ifdef CONFIG_PROC_FS {XFS_STATS_CLEAR, "stats_clear", &xfs_params.stats_clear.val, diff --git a/fs/xfs/linux-2.6/xfs_sysctl.h b/fs/xfs/linux-2.6/xfs_sysctl.h index a39a95020..a631fb8cc 100644 --- a/fs/xfs/linux-2.6/xfs_sysctl.h +++ b/fs/xfs/linux-2.6/xfs_sysctl.h @@ -1,35 +1,20 @@ /* - * Copyright (c) 2001-2004 Silicon Graphics, Inc. All Rights Reserved. + * Copyright (c) 2001-2005 Silicon Graphics, Inc. + * All Rights Reserved. * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as + * 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. * - * This program is distributed in the hope that it would be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * This program is distributed in the hope that it would 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. * - * Further, this software is distributed without any warranty that it is - * free of the rightful claim of any third person regarding infringement - * or the like. Any license provided herein, whether implied or - * otherwise, applies only to this software file. Patent licenses, if - * any, provided herein do not apply to combinations of this program with - * other software, or any other product whatsoever. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston MA 02111-1307, USA. - * - * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, - * Mountain View, CA 94043, or: - * - * http://www.sgi.com - * - * For further information regarding this notice, see: - * - * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - #ifndef __XFS_SYSCTL_H__ #define __XFS_SYSCTL_H__ @@ -61,6 +46,7 @@ typedef struct xfs_param { xfs_sysctl_val_t xfs_buf_age; /* Metadata buffer age before flush. */ xfs_sysctl_val_t inherit_nosym; /* Inherit the "nosymlinks" flag. */ xfs_sysctl_val_t rotorstep; /* inode32 AG rotoring control knob */ + xfs_sysctl_val_t inherit_nodfrg;/* Inherit the "nodefrag" inode flag. */ } xfs_param_t; /* @@ -99,6 +85,7 @@ enum { /* XFS_IO_BYPASS = 18 */ XFS_INHERIT_NOSYM = 19, XFS_ROTORSTEP = 20, + XFS_INHERIT_NODFRG = 21, }; extern xfs_param_t xfs_params; diff --git a/fs/xfs/linux-2.6/xfs_vfs.c b/fs/xfs/linux-2.6/xfs_vfs.c index 669c61644..6145e8bd0 100644 --- a/fs/xfs/linux-2.6/xfs_vfs.c +++ b/fs/xfs/linux-2.6/xfs_vfs.c @@ -1,45 +1,28 @@ /* - * Copyright (c) 2000-2004 Silicon Graphics, Inc. All Rights Reserved. + * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * All Rights Reserved. * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as + * 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. * - * This program is distributed in the hope that it would be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * This program is distributed in the hope that it would 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. * - * Further, this software is distributed without any warranty that it is - * free of the rightful claim of any third person regarding infringement - * or the like. Any license provided herein, whether implied or - * otherwise, applies only to this software file. Patent licenses, if - * any, provided herein do not apply to combinations of this program with - * other software, or any other product whatsoever. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston MA 02111-1307, USA. - * - * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, - * Mountain View, CA 94043, or: - * - * http://www.sgi.com - * - * For further information regarding this notice, see: - * - * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - #include "xfs.h" #include "xfs_fs.h" -#include "xfs_macros.h" #include "xfs_inum.h" #include "xfs_log.h" #include "xfs_clnt.h" #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_imap.h" #include "xfs_alloc.h" @@ -120,7 +103,7 @@ vfs_mntupdate( int vfs_root( struct bhv_desc *bdp, - struct vnode **vpp) + struct bhv_vnode **vpp) { struct bhv_desc *next = bdp; @@ -133,15 +116,15 @@ vfs_root( int vfs_statvfs( struct bhv_desc *bdp, - xfs_statfs_t *sp, - struct vnode *vp) + bhv_statvfs_t *statp, + struct bhv_vnode *vp) { struct bhv_desc *next = bdp; ASSERT(next); while (! (bhvtovfsops(next))->vfs_statvfs) next = BHV_NEXT(next); - return ((*bhvtovfsops(next)->vfs_statvfs)(next, sp, vp)); + return ((*bhvtovfsops(next)->vfs_statvfs)(next, statp, vp)); } int @@ -161,7 +144,7 @@ vfs_sync( int vfs_vget( struct bhv_desc *bdp, - struct vnode **vpp, + struct bhv_vnode **vpp, struct fid *fidp) { struct bhv_desc *next = bdp; @@ -203,7 +186,7 @@ vfs_quotactl( void vfs_init_vnode( struct bhv_desc *bdp, - struct vnode *vp, + struct bhv_vnode *vp, struct bhv_desc *bp, int unlock) { @@ -242,32 +225,46 @@ vfs_freeze( ((*bhvtovfsops(next)->vfs_freeze)(next)); } -vfs_t * -vfs_allocate( void ) +bhv_vfs_t * +vfs_allocate( + struct super_block *sb) { - struct vfs *vfsp; + struct bhv_vfs *vfsp; - vfsp = kmem_zalloc(sizeof(vfs_t), KM_SLEEP); + vfsp = kmem_zalloc(sizeof(bhv_vfs_t), KM_SLEEP); bhv_head_init(VFS_BHVHEAD(vfsp), "vfs"); INIT_LIST_HEAD(&vfsp->vfs_sync_list); spin_lock_init(&vfsp->vfs_sync_lock); - init_waitqueue_head(&vfsp->vfs_wait_sync_task); init_waitqueue_head(&vfsp->vfs_wait_single_sync_task); + + vfsp->vfs_super = sb; + sb->s_fs_info = vfsp; + + if (sb->s_flags & MS_RDONLY) + vfsp->vfs_flag |= VFS_RDONLY; + return vfsp; } +bhv_vfs_t * +vfs_from_sb( + struct super_block *sb) +{ + return (bhv_vfs_t *)sb->s_fs_info; +} + void vfs_deallocate( - struct vfs *vfsp) + struct bhv_vfs *vfsp) { bhv_head_destroy(VFS_BHVHEAD(vfsp)); - kmem_free(vfsp, sizeof(vfs_t)); + kmem_free(vfsp, sizeof(bhv_vfs_t)); } void vfs_insertops( - struct vfs *vfsp, - struct bhv_vfsops *vfsops) + struct bhv_vfs *vfsp, + struct bhv_module_vfsops *vfsops) { struct bhv_desc *bdp; @@ -278,9 +275,9 @@ vfs_insertops( void vfs_insertbhv( - struct vfs *vfsp, + struct bhv_vfs *vfsp, struct bhv_desc *bdp, - struct vfsops *vfsops, + struct bhv_vfsops *vfsops, void *mount) { bhv_desc_init(bdp, mount, vfsp, vfsops); @@ -289,7 +286,7 @@ vfs_insertbhv( void bhv_remove_vfsops( - struct vfs *vfsp, + struct bhv_vfs *vfsp, int pos) { struct bhv_desc *bhv; @@ -303,7 +300,7 @@ bhv_remove_vfsops( void bhv_remove_all_vfsops( - struct vfs *vfsp, + struct bhv_vfs *vfsp, int freebase) { struct xfs_mount *mp; @@ -312,14 +309,14 @@ bhv_remove_all_vfsops( bhv_remove_vfsops(vfsp, VFS_POSITION_DM); if (!freebase) return; - mp = XFS_BHVTOM(bhv_lookup(VFS_BHVHEAD(vfsp), &xfs_vfsops)); + mp = XFS_VFSTOM(vfsp); VFS_REMOVEBHV(vfsp, &mp->m_bhv); xfs_mount_free(mp, 0); } void bhv_insert_all_vfsops( - struct vfs *vfsp) + struct bhv_vfs *vfsp) { struct xfs_mount *mp; diff --git a/fs/xfs/linux-2.6/xfs_vfs.h b/fs/xfs/linux-2.6/xfs_vfs.h index 764939915..91fc2c4b3 100644 --- a/fs/xfs/linux-2.6/xfs_vfs.h +++ b/fs/xfs/linux-2.6/xfs_vfs.h @@ -1,33 +1,19 @@ /* - * Copyright (c) 2000-2004 Silicon Graphics, Inc. All Rights Reserved. + * Copyright (c) 2000-2006 Silicon Graphics, Inc. + * All Rights Reserved. * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as + * 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. * - * This program is distributed in the hope that it would be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * This program is distributed in the hope that it would 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. * - * Further, this software is distributed without any warranty that it is - * free of the rightful claim of any third person regarding infringement - * or the like. Any license provided herein, whether implied or - * otherwise, applies only to this software file. Patent licenses, if - * any, provided herein do not apply to combinations of this program with - * other software, or any other product whatsoever. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston MA 02111-1307, USA. - * - * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, - * Mountain View, CA 94043, or: - * - * http://www.sgi.com - * - * For further information regarding this notice, see: - * - * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef __XFS_VFS_H__ #define __XFS_VFS_H__ @@ -35,43 +21,40 @@ #include #include "xfs_fs.h" +struct bhv_vfs; +struct bhv_vnode; + struct fid; -struct vfs; struct cred; -struct vnode; -struct kstatfs; struct seq_file; struct super_block; struct xfs_mount_args; -typedef struct kstatfs xfs_statfs_t; +typedef struct kstatfs bhv_statvfs_t; -typedef struct vfs_sync_work { +typedef struct bhv_vfs_sync_work { struct list_head w_list; - struct vfs *w_vfs; + struct bhv_vfs *w_vfs; void *w_data; /* syncer routine argument */ - void (*w_syncer)(struct vfs *, void *); -} vfs_sync_work_t; + void (*w_syncer)(struct bhv_vfs *, void *); +} bhv_vfs_sync_work_t; -typedef struct vfs { +typedef struct bhv_vfs { u_int vfs_flag; /* flags */ xfs_fsid_t vfs_fsid; /* file system ID */ xfs_fsid_t *vfs_altfsid; /* An ID fixed for life of FS */ bhv_head_t vfs_bh; /* head of vfs behavior chain */ struct super_block *vfs_super; /* generic superblock pointer */ struct task_struct *vfs_sync_task; /* generalised sync thread */ - vfs_sync_work_t vfs_sync_work; /* work item for VFS_SYNC */ + bhv_vfs_sync_work_t vfs_sync_work; /* work item for VFS_SYNC */ struct list_head vfs_sync_list; /* sync thread work item list */ spinlock_t vfs_sync_lock; /* work item list lock */ - int vfs_sync_seq; /* sync thread generation no. */ + int vfs_sync_seq; /* sync thread generation no. */ wait_queue_head_t vfs_wait_single_sync_task; - wait_queue_head_t vfs_wait_sync_task; -} vfs_t; +} bhv_vfs_t; -#define vfs_fbhv vfs_bh.bh_first /* 1st on vfs behavior chain */ - -#define bhvtovfs(bdp) ( (struct vfs *)BHV_VOBJ(bdp) ) -#define bhvtovfsops(bdp) ( (struct vfsops *)BHV_OPS(bdp) ) +#define bhvtovfs(bdp) ( (struct bhv_vfs *)BHV_VOBJ(bdp) ) +#define bhvtovfsops(bdp) ( (struct bhv_vfsops *)BHV_OPS(bdp) ) #define VFS_BHVHEAD(vfs) ( &(vfs)->vfs_bh ) #define VFS_REMOVEBHV(vfs, bdp) ( bhv_remove(VFS_BHVHEAD(vfs), bdp) ) @@ -86,7 +69,7 @@ typedef enum { VFS_BHV_QM, /* quota manager */ VFS_BHV_IO, /* IO path */ VFS_BHV_END /* housekeeping end-of-range */ -} vfs_bhv_t; +} bhv_vfs_type_t; #define VFS_POSITION_XFS (BHV_POSITION_BASE) #define VFS_POSITION_DM (VFS_POSITION_BASE+10) @@ -97,7 +80,8 @@ typedef enum { #define VFS_GRPID 0x0002 /* group-ID assigned from directory */ #define VFS_DMI 0x0004 /* filesystem has the DMI enabled */ #define VFS_UMOUNT 0x0008 /* unmount in progress */ -#define VFS_END 0x0008 /* max flag */ +#define VFS_32BITINODES 0x0010 /* do not use inums above 32 bits */ +#define VFS_END 0x0010 /* max flag */ #define SYNC_ATTR 0x0001 /* sync attributes */ #define SYNC_CLOSE 0x0002 /* close file system down */ @@ -107,6 +91,14 @@ typedef enum { #define SYNC_FSDATA 0x0020 /* flush fs data (e.g. superblocks) */ #define SYNC_REFCACHE 0x0040 /* prune some of the nfs ref cache */ #define SYNC_REMOUNT 0x0080 /* remount readonly, no dummy LRs */ +#define SYNC_QUIESCE 0x0100 /* quiesce fileystem for a snapshot */ + +#define SHUTDOWN_META_IO_ERROR 0x0001 /* write attempt to metadata failed */ +#define SHUTDOWN_LOG_IO_ERROR 0x0002 /* write attempt to the log failed */ +#define SHUTDOWN_FORCE_UMOUNT 0x0004 /* shutdown from a forced unmount */ +#define SHUTDOWN_CORRUPT_INCORE 0x0008 /* corrupt in-memory data structures */ +#define SHUTDOWN_REMOTE_REQ 0x0010 /* shutdown came from remote cell */ +#define SHUTDOWN_DEVICE_REQ 0x0020 /* failed all paths to the device */ typedef int (*vfs_mount_t)(bhv_desc_t *, struct xfs_mount_args *, struct cred *); @@ -116,18 +108,19 @@ typedef int (*vfs_showargs_t)(bhv_desc_t *, struct seq_file *); typedef int (*vfs_unmount_t)(bhv_desc_t *, int, struct cred *); typedef int (*vfs_mntupdate_t)(bhv_desc_t *, int *, struct xfs_mount_args *); -typedef int (*vfs_root_t)(bhv_desc_t *, struct vnode **); -typedef int (*vfs_statvfs_t)(bhv_desc_t *, xfs_statfs_t *, struct vnode *); +typedef int (*vfs_root_t)(bhv_desc_t *, struct bhv_vnode **); +typedef int (*vfs_statvfs_t)(bhv_desc_t *, bhv_statvfs_t *, + struct bhv_vnode *); typedef int (*vfs_sync_t)(bhv_desc_t *, int, struct cred *); -typedef int (*vfs_vget_t)(bhv_desc_t *, struct vnode **, struct fid *); +typedef int (*vfs_vget_t)(bhv_desc_t *, struct bhv_vnode **, struct fid *); typedef int (*vfs_dmapiops_t)(bhv_desc_t *, caddr_t); typedef int (*vfs_quotactl_t)(bhv_desc_t *, int, int, caddr_t); typedef void (*vfs_init_vnode_t)(bhv_desc_t *, - struct vnode *, bhv_desc_t *, int); + struct bhv_vnode *, bhv_desc_t *, int); typedef void (*vfs_force_shutdown_t)(bhv_desc_t *, int, char *, int); typedef void (*vfs_freeze_t)(bhv_desc_t *); -typedef struct vfsops { +typedef struct bhv_vfsops { bhv_position_t vf_position; /* behavior chain position */ vfs_mount_t vfs_mount; /* mount file system */ vfs_parseargs_t vfs_parseargs; /* parse mount options */ @@ -143,81 +136,82 @@ typedef struct vfsops { vfs_init_vnode_t vfs_init_vnode; /* initialize a new vnode */ vfs_force_shutdown_t vfs_force_shutdown; /* crash and burn */ vfs_freeze_t vfs_freeze; /* freeze fs for snapshot */ -} vfsops_t; +} bhv_vfsops_t; /* - * VFS's. Operates on vfs structure pointers (starts at bhv head). + * Virtual filesystem operations, operating from head bhv. */ -#define VHEAD(v) ((v)->vfs_fbhv) -#define VFS_MOUNT(v, ma,cr, rv) ((rv) = vfs_mount(VHEAD(v), ma,cr)) -#define VFS_PARSEARGS(v, o,ma,f, rv) ((rv) = vfs_parseargs(VHEAD(v), o,ma,f)) -#define VFS_SHOWARGS(v, m, rv) ((rv) = vfs_showargs(VHEAD(v), m)) -#define VFS_UNMOUNT(v, f, cr, rv) ((rv) = vfs_unmount(VHEAD(v), f,cr)) -#define VFS_MNTUPDATE(v, fl, args, rv) ((rv) = vfs_mntupdate(VHEAD(v), fl, args)) -#define VFS_ROOT(v, vpp, rv) ((rv) = vfs_root(VHEAD(v), vpp)) -#define VFS_STATVFS(v, sp,vp, rv) ((rv) = vfs_statvfs(VHEAD(v), sp,vp)) -#define VFS_SYNC(v, flag,cr, rv) ((rv) = vfs_sync(VHEAD(v), flag,cr)) -#define VFS_VGET(v, vpp,fidp, rv) ((rv) = vfs_vget(VHEAD(v), vpp,fidp)) -#define VFS_DMAPIOPS(v, p, rv) ((rv) = vfs_dmapiops(VHEAD(v), p)) -#define VFS_QUOTACTL(v, c,id,p, rv) ((rv) = vfs_quotactl(VHEAD(v), c,id,p)) -#define VFS_INIT_VNODE(v, vp,b,ul) ( vfs_init_vnode(VHEAD(v), vp,b,ul) ) -#define VFS_FORCE_SHUTDOWN(v, fl,f,l) ( vfs_force_shutdown(VHEAD(v), fl,f,l) ) -#define VFS_FREEZE(v) ( vfs_freeze(VHEAD(v)) ) +#define VFSHEAD(v) ((v)->vfs_bh.bh_first) +#define bhv_vfs_mount(v, ma,cr) vfs_mount(VFSHEAD(v), ma,cr) +#define bhv_vfs_parseargs(v, o,ma,f) vfs_parseargs(VFSHEAD(v), o,ma,f) +#define bhv_vfs_showargs(v, m) vfs_showargs(VFSHEAD(v), m) +#define bhv_vfs_unmount(v, f,cr) vfs_unmount(VFSHEAD(v), f,cr) +#define bhv_vfs_mntupdate(v, fl,args) vfs_mntupdate(VFSHEAD(v), fl,args) +#define bhv_vfs_root(v, vpp) vfs_root(VFSHEAD(v), vpp) +#define bhv_vfs_statvfs(v, sp,vp) vfs_statvfs(VFSHEAD(v), sp,vp) +#define bhv_vfs_sync(v, flag,cr) vfs_sync(VFSHEAD(v), flag,cr) +#define bhv_vfs_vget(v, vpp,fidp) vfs_vget(VFSHEAD(v), vpp,fidp) +#define bhv_vfs_dmapiops(v, p) vfs_dmapiops(VFSHEAD(v), p) +#define bhv_vfs_quotactl(v, c,id,p) vfs_quotactl(VFSHEAD(v), c,id,p) +#define bhv_vfs_init_vnode(v, vp,b,ul) vfs_init_vnode(VFSHEAD(v), vp,b,ul) +#define bhv_vfs_force_shutdown(v,u,f,l) vfs_force_shutdown(VFSHEAD(v), u,f,l) +#define bhv_vfs_freeze(v) vfs_freeze(VFSHEAD(v)) /* - * PVFS's. Operates on behavior descriptor pointers. + * Virtual filesystem operations, operating from next bhv. */ -#define PVFS_MOUNT(b, ma,cr, rv) ((rv) = vfs_mount(b, ma,cr)) -#define PVFS_PARSEARGS(b, o,ma,f, rv) ((rv) = vfs_parseargs(b, o,ma,f)) -#define PVFS_SHOWARGS(b, m, rv) ((rv) = vfs_showargs(b, m)) -#define PVFS_UNMOUNT(b, f,cr, rv) ((rv) = vfs_unmount(b, f,cr)) -#define PVFS_MNTUPDATE(b, fl, args, rv) ((rv) = vfs_mntupdate(b, fl, args)) -#define PVFS_ROOT(b, vpp, rv) ((rv) = vfs_root(b, vpp)) -#define PVFS_STATVFS(b, sp,vp, rv) ((rv) = vfs_statvfs(b, sp,vp)) -#define PVFS_SYNC(b, flag,cr, rv) ((rv) = vfs_sync(b, flag,cr)) -#define PVFS_VGET(b, vpp,fidp, rv) ((rv) = vfs_vget(b, vpp,fidp)) -#define PVFS_DMAPIOPS(b, p, rv) ((rv) = vfs_dmapiops(b, p)) -#define PVFS_QUOTACTL(b, c,id,p, rv) ((rv) = vfs_quotactl(b, c,id,p)) -#define PVFS_INIT_VNODE(b, vp,b2,ul) ( vfs_init_vnode(b, vp,b2,ul) ) -#define PVFS_FORCE_SHUTDOWN(b, fl,f,l) ( vfs_force_shutdown(b, fl,f,l) ) -#define PVFS_FREEZE(b) ( vfs_freeze(b) ) +#define bhv_next_vfs_mount(b, ma,cr) vfs_mount(b, ma,cr) +#define bhv_next_vfs_parseargs(b, o,ma,f) vfs_parseargs(b, o,ma,f) +#define bhv_next_vfs_showargs(b, m) vfs_showargs(b, m) +#define bhv_next_vfs_unmount(b, f,cr) vfs_unmount(b, f,cr) +#define bhv_next_vfs_mntupdate(b, fl,args) vfs_mntupdate(b, fl, args) +#define bhv_next_vfs_root(b, vpp) vfs_root(b, vpp) +#define bhv_next_vfs_statvfs(b, sp,vp) vfs_statvfs(b, sp,vp) +#define bhv_next_vfs_sync(b, flag,cr) vfs_sync(b, flag,cr) +#define bhv_next_vfs_vget(b, vpp,fidp) vfs_vget(b, vpp,fidp) +#define bhv_next_vfs_dmapiops(b, p) vfs_dmapiops(b, p) +#define bhv_next_vfs_quotactl(b, c,id,p) vfs_quotactl(b, c,id,p) +#define bhv_next_vfs_init_vnode(b, vp,b2,ul) vfs_init_vnode(b, vp,b2,ul) +#define bhv_next_force_shutdown(b, fl,f,l) vfs_force_shutdown(b, fl,f,l) +#define bhv_next_vfs_freeze(b) vfs_freeze(b) extern int vfs_mount(bhv_desc_t *, struct xfs_mount_args *, struct cred *); extern int vfs_parseargs(bhv_desc_t *, char *, struct xfs_mount_args *, int); extern int vfs_showargs(bhv_desc_t *, struct seq_file *); extern int vfs_unmount(bhv_desc_t *, int, struct cred *); extern int vfs_mntupdate(bhv_desc_t *, int *, struct xfs_mount_args *); -extern int vfs_root(bhv_desc_t *, struct vnode **); -extern int vfs_statvfs(bhv_desc_t *, xfs_statfs_t *, struct vnode *); +extern int vfs_root(bhv_desc_t *, struct bhv_vnode **); +extern int vfs_statvfs(bhv_desc_t *, bhv_statvfs_t *, struct bhv_vnode *); extern int vfs_sync(bhv_desc_t *, int, struct cred *); -extern int vfs_vget(bhv_desc_t *, struct vnode **, struct fid *); +extern int vfs_vget(bhv_desc_t *, struct bhv_vnode **, struct fid *); extern int vfs_dmapiops(bhv_desc_t *, caddr_t); extern int vfs_quotactl(bhv_desc_t *, int, int, caddr_t); -extern void vfs_init_vnode(bhv_desc_t *, struct vnode *, bhv_desc_t *, int); +extern void vfs_init_vnode(bhv_desc_t *, struct bhv_vnode *, bhv_desc_t *, int); extern void vfs_force_shutdown(bhv_desc_t *, int, char *, int); extern void vfs_freeze(bhv_desc_t *); -typedef struct bhv_vfsops { - struct vfsops bhv_common; +#define vfs_test_for_freeze(vfs) ((vfs)->vfs_super->s_frozen) +#define vfs_wait_for_freeze(vfs,l) vfs_check_frozen((vfs)->vfs_super, (l)) + +typedef struct bhv_module_vfsops { + struct bhv_vfsops bhv_common; void * bhv_custom; -} bhv_vfsops_t; +} bhv_module_vfsops_t; -#define vfs_bhv_lookup(v, id) ( bhv_lookup_range(&(v)->vfs_bh, (id), (id)) ) -#define vfs_bhv_custom(b) ( ((bhv_vfsops_t *)BHV_OPS(b))->bhv_custom ) -#define vfs_bhv_set_custom(b,o) ( (b)->bhv_custom = (void *)(o)) -#define vfs_bhv_clr_custom(b) ( (b)->bhv_custom = NULL ) +#define vfs_bhv_lookup(v, id) (bhv_lookup_range(&(v)->vfs_bh, (id), (id))) +#define vfs_bhv_custom(b) (((bhv_module_vfsops_t*)BHV_OPS(b))->bhv_custom) +#define vfs_bhv_set_custom(b,o) ((b)->bhv_custom = (void *)(o)) +#define vfs_bhv_clr_custom(b) ((b)->bhv_custom = NULL) -extern vfs_t *vfs_allocate(void); -extern void vfs_deallocate(vfs_t *); -extern void vfs_insertops(vfs_t *, bhv_vfsops_t *); -extern void vfs_insertbhv(vfs_t *, bhv_desc_t *, vfsops_t *, void *); +extern bhv_vfs_t *vfs_allocate(struct super_block *); +extern bhv_vfs_t *vfs_from_sb(struct super_block *); +extern void vfs_deallocate(bhv_vfs_t *); +extern void vfs_insertbhv(bhv_vfs_t *, bhv_desc_t *, bhv_vfsops_t *, void *); -extern void bhv_insert_all_vfsops(struct vfs *); -extern void bhv_remove_all_vfsops(struct vfs *, int); -extern void bhv_remove_vfsops(struct vfs *, int); +extern void vfs_insertops(bhv_vfs_t *, bhv_module_vfsops_t *); -#define fs_frozen(vfsp) ((vfsp)->vfs_super->s_frozen) -#define fs_check_frozen(vfsp, level) \ - vfs_check_frozen(vfsp->vfs_super, level); +extern void bhv_insert_all_vfsops(struct bhv_vfs *); +extern void bhv_remove_all_vfsops(struct bhv_vfs *, int); +extern void bhv_remove_vfsops(struct bhv_vfs *, int); #endif /* __XFS_VFS_H__ */ diff --git a/fs/xfs/linux-2.6/xfs_vnode.c b/fs/xfs/linux-2.6/xfs_vnode.c index ef2207580..e41cf3d79 100644 --- a/fs/xfs/linux-2.6/xfs_vnode.c +++ b/fs/xfs/linux-2.6/xfs_vnode.c @@ -39,7 +39,7 @@ vn_init(void) void vn_iowait( - struct vnode *vp) + bhv_vnode_t *vp) { wait_queue_head_t *wq = vptosync(vp); @@ -48,17 +48,33 @@ vn_iowait( void vn_iowake( - struct vnode *vp) + bhv_vnode_t *vp) { if (atomic_dec_and_test(&vp->v_iocount)) wake_up(vptosync(vp)); } -struct vnode * +/* + * Volume managers supporting multiple paths can send back ENODEV when the + * final path disappears. In this case continuing to fill the page cache + * with dirty data which cannot be written out is evil, so prevent that. + */ +void +vn_ioerror( + bhv_vnode_t *vp, + int error, + char *f, + int l) +{ + if (unlikely(error == -ENODEV)) + bhv_vfs_force_shutdown(vp->v_vfsp, SHUTDOWN_DEVICE_REQ, f, l); +} + +bhv_vnode_t * vn_initialize( struct inode *inode) { - struct vnode *vp = vn_from_inode(inode); + bhv_vnode_t *vp = vn_from_inode(inode); XFS_STATS_INC(vn_active); XFS_STATS_INC(vn_alloc); @@ -94,8 +110,8 @@ vn_initialize( */ void vn_revalidate_core( - struct vnode *vp, - vattr_t *vap) + bhv_vnode_t *vp, + bhv_vattr_t *vap) { struct inode *inode = vn_to_inode(vp); @@ -107,7 +123,6 @@ vn_revalidate_core( inode->i_blocks = vap->va_nblocks; inode->i_mtime = vap->va_mtime; inode->i_ctime = vap->va_ctime; - inode->i_blksize = vap->va_blocksize; if (vap->va_xflags & XFS_XFLAG_IMMUTABLE) inode->i_flags |= S_IMMUTABLE; else @@ -139,14 +154,14 @@ vn_revalidate_core( */ int __vn_revalidate( - struct vnode *vp, - struct vattr *vattr) + bhv_vnode_t *vp, + bhv_vattr_t *vattr) { int error; vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address); vattr->va_mask = XFS_AT_STAT | XFS_AT_XFLAGS; - VOP_GETATTR(vp, vattr, 0, NULL, error); + error = bhv_vop_getattr(vp, vattr, 0, NULL); if (likely(!error)) { vn_revalidate_core(vp, vattr); VUNMODIFY(vp); @@ -156,9 +171,9 @@ __vn_revalidate( int vn_revalidate( - struct vnode *vp) + bhv_vnode_t *vp) { - vattr_t vattr; + bhv_vattr_t vattr; return __vn_revalidate(vp, &vattr); } @@ -166,9 +181,9 @@ vn_revalidate( /* * Add a reference to a referenced vnode. */ -struct vnode * +bhv_vnode_t * vn_hold( - struct vnode *vp) + bhv_vnode_t *vp) { struct inode *inode; @@ -201,31 +216,31 @@ vn_hold( * Vnode tracing code. */ void -vn_trace_entry(vnode_t *vp, const char *func, inst_t *ra) +vn_trace_entry(bhv_vnode_t *vp, const char *func, inst_t *ra) { KTRACE_ENTER(vp, VNODE_KTRACE_ENTRY, func, 0, ra); } void -vn_trace_exit(vnode_t *vp, const char *func, inst_t *ra) +vn_trace_exit(bhv_vnode_t *vp, const char *func, inst_t *ra) { KTRACE_ENTER(vp, VNODE_KTRACE_EXIT, func, 0, ra); } void -vn_trace_hold(vnode_t *vp, char *file, int line, inst_t *ra) +vn_trace_hold(bhv_vnode_t *vp, char *file, int line, inst_t *ra) { KTRACE_ENTER(vp, VNODE_KTRACE_HOLD, file, line, ra); } void -vn_trace_ref(vnode_t *vp, char *file, int line, inst_t *ra) +vn_trace_ref(bhv_vnode_t *vp, char *file, int line, inst_t *ra) { KTRACE_ENTER(vp, VNODE_KTRACE_REF, file, line, ra); } void -vn_trace_rele(vnode_t *vp, char *file, int line, inst_t *ra) +vn_trace_rele(bhv_vnode_t *vp, char *file, int line, inst_t *ra) { KTRACE_ENTER(vp, VNODE_KTRACE_RELE, file, line, ra); } diff --git a/fs/xfs/linux-2.6/xfs_vnode.h b/fs/xfs/linux-2.6/xfs_vnode.h index 2848cd300..035b16385 100644 --- a/fs/xfs/linux-2.6/xfs_vnode.h +++ b/fs/xfs/linux-2.6/xfs_vnode.h @@ -14,57 +14,35 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, write the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * Portions Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * 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, 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. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. */ #ifndef __XFS_VNODE_H__ #define __XFS_VNODE_H__ struct uio; struct file; -struct vattr; +struct bhv_vfs; +struct bhv_vattr; struct xfs_iomap; struct attrlist_cursor_kern; +typedef struct dentry bhv_vname_t; +typedef __u64 bhv_vnumber_t; -typedef xfs_ino_t vnumber_t; -typedef struct dentry vname_t; -typedef bhv_head_t vn_bhv_head_t; +typedef enum bhv_vflags { + VMODIFIED = 0x08, /* XFS inode state possibly differs */ + /* to the Linux inode state. */ + VTRUNCATED = 0x40, /* truncated down so flush-on-close */ +} bhv_vflags_t; /* * MP locking protocols: * v_flag, v_vfsp VN_LOCK/VN_UNLOCK */ -typedef struct vnode { - __u32 v_flag; /* vnode flags (see below) */ - struct vfs *v_vfsp; /* ptr to containing VFS */ - vnumber_t v_number; /* in-core vnode number */ - vn_bhv_head_t v_bh; /* behavior head */ +typedef struct bhv_vnode { + bhv_vflags_t v_flag; /* vnode flags (see above) */ + bhv_vfs_t *v_vfsp; /* ptr to containing VFS */ + bhv_vnumber_t v_number; /* in-core vnode number */ + bhv_head_t v_bh; /* behavior head */ spinlock_t v_lock; /* VN_LOCK/VN_UNLOCK */ atomic_t v_iocount; /* outstanding I/O count */ #ifdef XFS_VNODE_TRACE @@ -72,7 +50,7 @@ typedef struct vnode { #endif struct inode v_inode; /* Linux inode */ /* inode MUST be last */ -} vnode_t; +} bhv_vnode_t; #define VN_ISLNK(vp) S_ISLNK((vp)->v_inode.i_mode) #define VN_ISREG(vp) S_ISREG((vp)->v_inode.i_mode) @@ -80,9 +58,6 @@ typedef struct vnode { #define VN_ISCHR(vp) S_ISCHR((vp)->v_inode.i_mode) #define VN_ISBLK(vp) S_ISBLK((vp)->v_inode.i_mode) -#define v_fbhv v_bh.bh_first /* first behavior */ -#define v_fops v_bh.bh_first->bd_ops /* first behavior ops */ - #define VNODE_POSITION_BASE BHV_POSITION_BASE /* chain bottom */ #define VNODE_POSITION_TOP BHV_POSITION_TOP /* chain top */ #define VNODE_POSITION_INVALID BHV_POSITION_INVALID /* invalid pos. num */ @@ -104,8 +79,8 @@ typedef enum { /* * Macros for dealing with the behavior descriptor inside of the vnode. */ -#define BHV_TO_VNODE(bdp) ((vnode_t *)BHV_VOBJ(bdp)) -#define BHV_TO_VNODE_NULL(bdp) ((vnode_t *)BHV_VOBJNULL(bdp)) +#define BHV_TO_VNODE(bdp) ((bhv_vnode_t *)BHV_VOBJ(bdp)) +#define BHV_TO_VNODE_NULL(bdp) ((bhv_vnode_t *)BHV_VOBJNULL(bdp)) #define VN_BHV_HEAD(vp) ((bhv_head_t *)(&((vp)->v_bh))) #define vn_bhv_head_init(bhp,name) bhv_head_init(bhp,name) @@ -116,35 +91,29 @@ typedef enum { /* * Vnode to Linux inode mapping. */ -static inline struct vnode *vn_from_inode(struct inode *inode) +static inline struct bhv_vnode *vn_from_inode(struct inode *inode) { - return (vnode_t *)list_entry(inode, vnode_t, v_inode); + return container_of(inode, bhv_vnode_t, v_inode); } -static inline struct inode *vn_to_inode(struct vnode *vnode) +static inline struct inode *vn_to_inode(struct bhv_vnode *vnode) { return &vnode->v_inode; } /* - * Vnode flags. - */ -#define VMODIFIED 0x8 /* XFS inode state possibly differs */ - /* to the Linux inode state. */ - -/* - * Values for the VOP_RWLOCK and VOP_RWUNLOCK flags parameter. + * Values for the vop_rwlock/rwunlock flags parameter. */ -typedef enum vrwlock { +typedef enum bhv_vrwlock { VRWLOCK_NONE, VRWLOCK_READ, VRWLOCK_WRITE, VRWLOCK_WRITE_DIRECT, VRWLOCK_TRY_READ, VRWLOCK_TRY_WRITE -} vrwlock_t; +} bhv_vrwlock_t; /* - * Return values for VOP_INACTIVE. A return value of + * Return values for bhv_vop_inactive. A return value of * VN_INACTIVE_NOCACHE implies that the file system behavior * has disassociated its state and bhv_desc_t from the vnode. */ @@ -152,18 +121,20 @@ typedef enum vrwlock { #define VN_INACTIVE_NOCACHE 1 /* - * Values for the cmd code given to VOP_VNODE_CHANGE. + * Values for the cmd code given to vop_vnode_change. */ -typedef enum vchange { +typedef enum bhv_vchange { VCHANGE_FLAGS_FRLOCKS = 0, VCHANGE_FLAGS_ENF_LOCKING = 1, VCHANGE_FLAGS_TRUNCATED = 2, VCHANGE_FLAGS_PAGE_DIRTY = 3, VCHANGE_FLAGS_IOEXCL_COUNT = 4 -} vchange_t; +} bhv_vchange_t; +typedef enum { L_FALSE, L_TRUE } lastclose_t; typedef int (*vop_open_t)(bhv_desc_t *, struct cred *); +typedef int (*vop_close_t)(bhv_desc_t *, int, lastclose_t, struct cred *); typedef ssize_t (*vop_read_t)(bhv_desc_t *, struct kiocb *, const struct iovec *, unsigned int, loff_t *, int, struct cred *); @@ -181,27 +152,27 @@ typedef ssize_t (*vop_splice_write_t)(bhv_desc_t *, struct pipe_inode_info *, struct cred *); typedef int (*vop_ioctl_t)(bhv_desc_t *, struct inode *, struct file *, int, unsigned int, void __user *); -typedef int (*vop_getattr_t)(bhv_desc_t *, struct vattr *, int, +typedef int (*vop_getattr_t)(bhv_desc_t *, struct bhv_vattr *, int, struct cred *); -typedef int (*vop_setattr_t)(bhv_desc_t *, struct vattr *, int, +typedef int (*vop_setattr_t)(bhv_desc_t *, struct bhv_vattr *, int, struct cred *); typedef int (*vop_access_t)(bhv_desc_t *, int, struct cred *); -typedef int (*vop_lookup_t)(bhv_desc_t *, vname_t *, vnode_t **, - int, vnode_t *, struct cred *); -typedef int (*vop_create_t)(bhv_desc_t *, vname_t *, struct vattr *, - vnode_t **, struct cred *); -typedef int (*vop_remove_t)(bhv_desc_t *, vname_t *, struct cred *); -typedef int (*vop_link_t)(bhv_desc_t *, vnode_t *, vname_t *, - struct cred *); -typedef int (*vop_rename_t)(bhv_desc_t *, vname_t *, vnode_t *, vname_t *, +typedef int (*vop_lookup_t)(bhv_desc_t *, bhv_vname_t *, bhv_vnode_t **, + int, bhv_vnode_t *, struct cred *); +typedef int (*vop_create_t)(bhv_desc_t *, bhv_vname_t *, struct bhv_vattr *, + bhv_vnode_t **, struct cred *); +typedef int (*vop_remove_t)(bhv_desc_t *, bhv_vname_t *, struct cred *); +typedef int (*vop_link_t)(bhv_desc_t *, bhv_vnode_t *, bhv_vname_t *, struct cred *); -typedef int (*vop_mkdir_t)(bhv_desc_t *, vname_t *, struct vattr *, - vnode_t **, struct cred *); -typedef int (*vop_rmdir_t)(bhv_desc_t *, vname_t *, struct cred *); +typedef int (*vop_rename_t)(bhv_desc_t *, bhv_vname_t *, bhv_vnode_t *, + bhv_vname_t *, struct cred *); +typedef int (*vop_mkdir_t)(bhv_desc_t *, bhv_vname_t *, struct bhv_vattr *, + bhv_vnode_t **, struct cred *); +typedef int (*vop_rmdir_t)(bhv_desc_t *, bhv_vname_t *, struct cred *); typedef int (*vop_readdir_t)(bhv_desc_t *, struct uio *, struct cred *, int *); -typedef int (*vop_symlink_t)(bhv_desc_t *, vname_t *, struct vattr *, - char *, vnode_t **, struct cred *); +typedef int (*vop_symlink_t)(bhv_desc_t *, bhv_vname_t *, struct bhv_vattr*, + char *, bhv_vnode_t **, struct cred *); typedef int (*vop_readlink_t)(bhv_desc_t *, struct uio *, int, struct cred *); typedef int (*vop_fsync_t)(bhv_desc_t *, int, struct cred *, @@ -209,8 +180,8 @@ typedef int (*vop_fsync_t)(bhv_desc_t *, int, struct cred *, typedef int (*vop_inactive_t)(bhv_desc_t *, struct cred *); typedef int (*vop_fid2_t)(bhv_desc_t *, struct fid *); typedef int (*vop_release_t)(bhv_desc_t *); -typedef int (*vop_rwlock_t)(bhv_desc_t *, vrwlock_t); -typedef void (*vop_rwunlock_t)(bhv_desc_t *, vrwlock_t); +typedef int (*vop_rwlock_t)(bhv_desc_t *, bhv_vrwlock_t); +typedef void (*vop_rwunlock_t)(bhv_desc_t *, bhv_vrwlock_t); typedef int (*vop_bmap_t)(bhv_desc_t *, xfs_off_t, ssize_t, int, struct xfs_iomap *, int *); typedef int (*vop_reclaim_t)(bhv_desc_t *); @@ -222,8 +193,8 @@ typedef int (*vop_attr_remove_t)(bhv_desc_t *, const char *, int, struct cred *); typedef int (*vop_attr_list_t)(bhv_desc_t *, char *, int, int, struct attrlist_cursor_kern *, struct cred *); -typedef void (*vop_link_removed_t)(bhv_desc_t *, vnode_t *, int); -typedef void (*vop_vnode_change_t)(bhv_desc_t *, vchange_t, __psint_t); +typedef void (*vop_link_removed_t)(bhv_desc_t *, bhv_vnode_t *, int); +typedef void (*vop_vnode_change_t)(bhv_desc_t *, bhv_vchange_t, __psint_t); typedef void (*vop_ptossvp_t)(bhv_desc_t *, xfs_off_t, xfs_off_t, int); typedef void (*vop_pflushinvalvp_t)(bhv_desc_t *, xfs_off_t, xfs_off_t, int); typedef int (*vop_pflushvp_t)(bhv_desc_t *, xfs_off_t, xfs_off_t, @@ -231,9 +202,10 @@ typedef int (*vop_pflushvp_t)(bhv_desc_t *, xfs_off_t, xfs_off_t, typedef int (*vop_iflush_t)(bhv_desc_t *, int); -typedef struct vnodeops { +typedef struct bhv_vnodeops { bhv_position_t vn_position; /* position within behavior chain */ vop_open_t vop_open; + vop_close_t vop_close; vop_read_t vop_read; vop_write_t vop_write; vop_sendfile_t vop_sendfile; @@ -271,103 +243,80 @@ typedef struct vnodeops { vop_pflushvp_t vop_flush_pages; vop_release_t vop_release; vop_iflush_t vop_iflush; -} vnodeops_t; +} bhv_vnodeops_t; /* - * VOP's. - */ -#define _VOP_(op, vp) (*((vnodeops_t *)(vp)->v_fops)->op) - -#define VOP_READ(vp,file,iov,segs,offset,ioflags,cr,rv) \ - rv = _VOP_(vop_read, vp)((vp)->v_fbhv,file,iov,segs,offset,ioflags,cr) -#define VOP_WRITE(vp,file,iov,segs,offset,ioflags,cr,rv) \ - rv = _VOP_(vop_write, vp)((vp)->v_fbhv,file,iov,segs,offset,ioflags,cr) -#define VOP_SENDFILE(vp,f,off,ioflags,cnt,act,targ,cr,rv) \ - rv = _VOP_(vop_sendfile, vp)((vp)->v_fbhv,f,off,ioflags,cnt,act,targ,cr) -#define VOP_SPLICE_READ(vp,f,o,pipe,cnt,fl,iofl,cr,rv) \ - rv = _VOP_(vop_splice_read, vp)((vp)->v_fbhv,f,o,pipe,cnt,fl,iofl,cr) -#define VOP_SPLICE_WRITE(vp,f,o,pipe,cnt,fl,iofl,cr,rv) \ - rv = _VOP_(vop_splice_write, vp)((vp)->v_fbhv,f,o,pipe,cnt,fl,iofl,cr) -#define VOP_BMAP(vp,of,sz,rw,b,n,rv) \ - rv = _VOP_(vop_bmap, vp)((vp)->v_fbhv,of,sz,rw,b,n) -#define VOP_OPEN(vp, cr, rv) \ - rv = _VOP_(vop_open, vp)((vp)->v_fbhv, cr) -#define VOP_GETATTR(vp, vap, f, cr, rv) \ - rv = _VOP_(vop_getattr, vp)((vp)->v_fbhv, vap, f, cr) -#define VOP_SETATTR(vp, vap, f, cr, rv) \ - rv = _VOP_(vop_setattr, vp)((vp)->v_fbhv, vap, f, cr) -#define VOP_ACCESS(vp, mode, cr, rv) \ - rv = _VOP_(vop_access, vp)((vp)->v_fbhv, mode, cr) -#define VOP_LOOKUP(vp,d,vpp,f,rdir,cr,rv) \ - rv = _VOP_(vop_lookup, vp)((vp)->v_fbhv,d,vpp,f,rdir,cr) -#define VOP_CREATE(dvp,d,vap,vpp,cr,rv) \ - rv = _VOP_(vop_create, dvp)((dvp)->v_fbhv,d,vap,vpp,cr) -#define VOP_REMOVE(dvp,d,cr,rv) \ - rv = _VOP_(vop_remove, dvp)((dvp)->v_fbhv,d,cr) -#define VOP_LINK(tdvp,fvp,d,cr,rv) \ - rv = _VOP_(vop_link, tdvp)((tdvp)->v_fbhv,fvp,d,cr) -#define VOP_RENAME(fvp,fnm,tdvp,tnm,cr,rv) \ - rv = _VOP_(vop_rename, fvp)((fvp)->v_fbhv,fnm,tdvp,tnm,cr) -#define VOP_MKDIR(dp,d,vap,vpp,cr,rv) \ - rv = _VOP_(vop_mkdir, dp)((dp)->v_fbhv,d,vap,vpp,cr) -#define VOP_RMDIR(dp,d,cr,rv) \ - rv = _VOP_(vop_rmdir, dp)((dp)->v_fbhv,d,cr) -#define VOP_READDIR(vp,uiop,cr,eofp,rv) \ - rv = _VOP_(vop_readdir, vp)((vp)->v_fbhv,uiop,cr,eofp) -#define VOP_SYMLINK(dvp,d,vap,tnm,vpp,cr,rv) \ - rv = _VOP_(vop_symlink, dvp) ((dvp)->v_fbhv,d,vap,tnm,vpp,cr) -#define VOP_READLINK(vp,uiop,fl,cr,rv) \ - rv = _VOP_(vop_readlink, vp)((vp)->v_fbhv,uiop,fl,cr) -#define VOP_FSYNC(vp,f,cr,b,e,rv) \ - rv = _VOP_(vop_fsync, vp)((vp)->v_fbhv,f,cr,b,e) -#define VOP_INACTIVE(vp, cr, rv) \ - rv = _VOP_(vop_inactive, vp)((vp)->v_fbhv, cr) -#define VOP_RELEASE(vp, rv) \ - rv = _VOP_(vop_release, vp)((vp)->v_fbhv) -#define VOP_FID2(vp, fidp, rv) \ - rv = _VOP_(vop_fid2, vp)((vp)->v_fbhv, fidp) -#define VOP_RWLOCK(vp,i) \ - (void)_VOP_(vop_rwlock, vp)((vp)->v_fbhv, i) -#define VOP_RWLOCK_TRY(vp,i) \ - _VOP_(vop_rwlock, vp)((vp)->v_fbhv, i) -#define VOP_RWUNLOCK(vp,i) \ - (void)_VOP_(vop_rwunlock, vp)((vp)->v_fbhv, i) -#define VOP_FRLOCK(vp,c,fl,flags,offset,fr,rv) \ - rv = _VOP_(vop_frlock, vp)((vp)->v_fbhv,c,fl,flags,offset,fr) -#define VOP_RECLAIM(vp, rv) \ - rv = _VOP_(vop_reclaim, vp)((vp)->v_fbhv) -#define VOP_ATTR_GET(vp, name, val, vallenp, fl, cred, rv) \ - rv = _VOP_(vop_attr_get, vp)((vp)->v_fbhv,name,val,vallenp,fl,cred) -#define VOP_ATTR_SET(vp, name, val, vallen, fl, cred, rv) \ - rv = _VOP_(vop_attr_set, vp)((vp)->v_fbhv,name,val,vallen,fl,cred) -#define VOP_ATTR_REMOVE(vp, name, flags, cred, rv) \ - rv = _VOP_(vop_attr_remove, vp)((vp)->v_fbhv,name,flags,cred) -#define VOP_ATTR_LIST(vp, buf, buflen, fl, cursor, cred, rv) \ - rv = _VOP_(vop_attr_list, vp)((vp)->v_fbhv,buf,buflen,fl,cursor,cred) -#define VOP_LINK_REMOVED(vp, dvp, linkzero) \ - (void)_VOP_(vop_link_removed, vp)((vp)->v_fbhv, dvp, linkzero) -#define VOP_VNODE_CHANGE(vp, cmd, val) \ - (void)_VOP_(vop_vnode_change, vp)((vp)->v_fbhv,cmd,val) -/* - * These are page cache functions that now go thru VOPs. - * 'last' parameter is unused and left in for IRIX compatibility + * Virtual node operations, operating from head bhv. */ -#define VOP_TOSS_PAGES(vp, first, last, fiopt) \ - _VOP_(vop_tosspages, vp)((vp)->v_fbhv,first, last, fiopt) -/* - * 'last' parameter is unused and left in for IRIX compatibility - */ -#define VOP_FLUSHINVAL_PAGES(vp, first, last, fiopt) \ - _VOP_(vop_flushinval_pages, vp)((vp)->v_fbhv,first,last,fiopt) -/* - * 'last' parameter is unused and left in for IRIX compatibility - */ -#define VOP_FLUSH_PAGES(vp, first, last, flags, fiopt, rv) \ - rv = _VOP_(vop_flush_pages, vp)((vp)->v_fbhv,first,last,flags,fiopt) -#define VOP_IOCTL(vp, inode, filp, fl, cmd, arg, rv) \ - rv = _VOP_(vop_ioctl, vp)((vp)->v_fbhv,inode,filp,fl,cmd,arg) -#define VOP_IFLUSH(vp, flags, rv) \ - rv = _VOP_(vop_iflush, vp)((vp)->v_fbhv, flags) +#define VNHEAD(vp) ((vp)->v_bh.bh_first) +#define VOP(op, vp) (*((bhv_vnodeops_t *)VNHEAD(vp)->bd_ops)->op) +#define bhv_vop_open(vp, cr) VOP(vop_open, vp)(VNHEAD(vp),cr) +#define bhv_vop_close(vp, f,last,cr) VOP(vop_close, vp)(VNHEAD(vp),f,last,cr) +#define bhv_vop_read(vp,file,iov,segs,offset,ioflags,cr) \ + VOP(vop_read, vp)(VNHEAD(vp),file,iov,segs,offset,ioflags,cr) +#define bhv_vop_write(vp,file,iov,segs,offset,ioflags,cr) \ + VOP(vop_write, vp)(VNHEAD(vp),file,iov,segs,offset,ioflags,cr) +#define bhv_vop_sendfile(vp,f,off,ioflags,cnt,act,targ,cr) \ + VOP(vop_sendfile, vp)(VNHEAD(vp),f,off,ioflags,cnt,act,targ,cr) +#define bhv_vop_splice_read(vp,f,o,pipe,cnt,fl,iofl,cr) \ + VOP(vop_splice_read, vp)(VNHEAD(vp),f,o,pipe,cnt,fl,iofl,cr) +#define bhv_vop_splice_write(vp,f,o,pipe,cnt,fl,iofl,cr) \ + VOP(vop_splice_write, vp)(VNHEAD(vp),f,o,pipe,cnt,fl,iofl,cr) +#define bhv_vop_bmap(vp,of,sz,rw,b,n) \ + VOP(vop_bmap, vp)(VNHEAD(vp),of,sz,rw,b,n) +#define bhv_vop_getattr(vp, vap,f,cr) \ + VOP(vop_getattr, vp)(VNHEAD(vp), vap,f,cr) +#define bhv_vop_setattr(vp, vap,f,cr) \ + VOP(vop_setattr, vp)(VNHEAD(vp), vap,f,cr) +#define bhv_vop_access(vp, mode,cr) VOP(vop_access, vp)(VNHEAD(vp), mode,cr) +#define bhv_vop_lookup(vp,d,vpp,f,rdir,cr) \ + VOP(vop_lookup, vp)(VNHEAD(vp),d,vpp,f,rdir,cr) +#define bhv_vop_create(dvp,d,vap,vpp,cr) \ + VOP(vop_create, dvp)(VNHEAD(dvp),d,vap,vpp,cr) +#define bhv_vop_remove(dvp,d,cr) VOP(vop_remove, dvp)(VNHEAD(dvp),d,cr) +#define bhv_vop_link(dvp,fvp,d,cr) VOP(vop_link, dvp)(VNHEAD(dvp),fvp,d,cr) +#define bhv_vop_rename(fvp,fnm,tdvp,tnm,cr) \ + VOP(vop_rename, fvp)(VNHEAD(fvp),fnm,tdvp,tnm,cr) +#define bhv_vop_mkdir(dp,d,vap,vpp,cr) \ + VOP(vop_mkdir, dp)(VNHEAD(dp),d,vap,vpp,cr) +#define bhv_vop_rmdir(dp,d,cr) VOP(vop_rmdir, dp)(VNHEAD(dp),d,cr) +#define bhv_vop_readdir(vp,uiop,cr,eofp) \ + VOP(vop_readdir, vp)(VNHEAD(vp),uiop,cr,eofp) +#define bhv_vop_symlink(dvp,d,vap,tnm,vpp,cr) \ + VOP(vop_symlink, dvp)(VNHEAD(dvp),d,vap,tnm,vpp,cr) +#define bhv_vop_readlink(vp,uiop,fl,cr) \ + VOP(vop_readlink, vp)(VNHEAD(vp),uiop,fl,cr) +#define bhv_vop_fsync(vp,f,cr,b,e) VOP(vop_fsync, vp)(VNHEAD(vp),f,cr,b,e) +#define bhv_vop_inactive(vp,cr) VOP(vop_inactive, vp)(VNHEAD(vp),cr) +#define bhv_vop_release(vp) VOP(vop_release, vp)(VNHEAD(vp)) +#define bhv_vop_fid2(vp,fidp) VOP(vop_fid2, vp)(VNHEAD(vp),fidp) +#define bhv_vop_rwlock(vp,i) VOP(vop_rwlock, vp)(VNHEAD(vp),i) +#define bhv_vop_rwlock_try(vp,i) VOP(vop_rwlock, vp)(VNHEAD(vp),i) +#define bhv_vop_rwunlock(vp,i) VOP(vop_rwunlock, vp)(VNHEAD(vp),i) +#define bhv_vop_frlock(vp,c,fl,flags,offset,fr) \ + VOP(vop_frlock, vp)(VNHEAD(vp),c,fl,flags,offset,fr) +#define bhv_vop_reclaim(vp) VOP(vop_reclaim, vp)(VNHEAD(vp)) +#define bhv_vop_attr_get(vp, name, val, vallenp, fl, cred) \ + VOP(vop_attr_get, vp)(VNHEAD(vp),name,val,vallenp,fl,cred) +#define bhv_vop_attr_set(vp, name, val, vallen, fl, cred) \ + VOP(vop_attr_set, vp)(VNHEAD(vp),name,val,vallen,fl,cred) +#define bhv_vop_attr_remove(vp, name, flags, cred) \ + VOP(vop_attr_remove, vp)(VNHEAD(vp),name,flags,cred) +#define bhv_vop_attr_list(vp, buf, buflen, fl, cursor, cred) \ + VOP(vop_attr_list, vp)(VNHEAD(vp),buf,buflen,fl,cursor,cred) +#define bhv_vop_link_removed(vp, dvp, linkzero) \ + VOP(vop_link_removed, vp)(VNHEAD(vp), dvp, linkzero) +#define bhv_vop_vnode_change(vp, cmd, val) \ + VOP(vop_vnode_change, vp)(VNHEAD(vp), cmd, val) +#define bhv_vop_toss_pages(vp, first, last, fiopt) \ + VOP(vop_tosspages, vp)(VNHEAD(vp), first, last, fiopt) +#define bhv_vop_flushinval_pages(vp, first, last, fiopt) \ + VOP(vop_flushinval_pages, vp)(VNHEAD(vp),first,last,fiopt) +#define bhv_vop_flush_pages(vp, first, last, flags, fiopt) \ + VOP(vop_flush_pages, vp)(VNHEAD(vp),first,last,flags,fiopt) +#define bhv_vop_ioctl(vp, inode, filp, fl, cmd, arg) \ + VOP(vop_ioctl, vp)(VNHEAD(vp),inode,filp,fl,cmd,arg) +#define bhv_vop_iflush(vp, flags) VOP(vop_iflush, vp)(VNHEAD(vp), flags) /* * Flags for read/write calls - same values as IRIX @@ -377,7 +326,7 @@ typedef struct vnodeops { #define IO_INVIS 0x00020 /* don't update inode timestamps */ /* - * Flags for VOP_IFLUSH call + * Flags for vop_iflush call */ #define FLUSH_SYNC 1 /* wait for flush to complete */ #define FLUSH_INODE 2 /* flush the inode itself */ @@ -385,8 +334,7 @@ typedef struct vnodeops { * this inode out to disk */ /* - * Flush/Invalidate options for VOP_TOSS_PAGES, VOP_FLUSHINVAL_PAGES and - * VOP_FLUSH_PAGES. + * Flush/Invalidate options for vop_toss/flush/flushinval_pages. */ #define FI_NONE 0 /* none */ #define FI_REMAPF 1 /* Do a remapf prior to the operation */ @@ -398,7 +346,7 @@ typedef struct vnodeops { * Vnode attributes. va_mask indicates those attributes the caller * wants to set or extract. */ -typedef struct vattr { +typedef struct bhv_vattr { int va_mask; /* bit-mask of attributes present */ mode_t va_mode; /* file access mode and type */ xfs_nlink_t va_nlink; /* number of references to file */ @@ -419,7 +367,7 @@ typedef struct vattr { u_long va_nextents; /* number of extents in file */ u_long va_anextents; /* number of attr extents in file */ prid_t va_projid; /* project id */ -} vattr_t; +} bhv_vattr_t; /* * setattr or getattr attributes @@ -495,29 +443,17 @@ typedef struct vattr { (VN_ISREG(vp) && ((mode) & (VSGID|(VEXEC>>3))) == VSGID) extern void vn_init(void); -extern vnode_t *vn_initialize(struct inode *); - -/* - * vnode_map structures _must_ match vn_epoch and vnode structure sizes. - */ -typedef struct vnode_map { - vfs_t *v_vfsp; - vnumber_t v_number; /* in-core vnode number */ - xfs_ino_t v_ino; /* inode # */ -} vmap_t; - -#define VMAP(vp, vmap) {(vmap).v_vfsp = (vp)->v_vfsp, \ - (vmap).v_number = (vp)->v_number, \ - (vmap).v_ino = (vp)->v_inode.i_ino; } +extern bhv_vnode_t *vn_initialize(struct inode *); +extern int vn_revalidate(struct bhv_vnode *); +extern int __vn_revalidate(struct bhv_vnode *, bhv_vattr_t *); +extern void vn_revalidate_core(struct bhv_vnode *, bhv_vattr_t *); -extern int vn_revalidate(struct vnode *); -extern int __vn_revalidate(struct vnode *, vattr_t *); -extern void vn_revalidate_core(struct vnode *, vattr_t *); +extern void vn_iowait(struct bhv_vnode *vp); +extern void vn_iowake(struct bhv_vnode *vp); -extern void vn_iowait(struct vnode *vp); -extern void vn_iowake(struct vnode *vp); +extern void vn_ioerror(struct bhv_vnode *vp, int error, char *f, int l); -static inline int vn_count(struct vnode *vp) +static inline int vn_count(struct bhv_vnode *vp) { return atomic_read(&vn_to_inode(vp)->i_count); } @@ -525,7 +461,7 @@ static inline int vn_count(struct vnode *vp) /* * Vnode reference counting functions (and macros for compatibility). */ -extern vnode_t *vn_hold(struct vnode *); +extern bhv_vnode_t *vn_hold(struct bhv_vnode *); #if defined(XFS_VNODE_TRACE) #define VN_HOLD(vp) \ @@ -539,7 +475,7 @@ extern vnode_t *vn_hold(struct vnode *); #define VN_RELE(vp) (iput(vn_to_inode(vp))) #endif -static inline struct vnode *vn_grab(struct vnode *vp) +static inline struct bhv_vnode *vn_grab(struct bhv_vnode *vp) { struct inode *inode = igrab(vn_to_inode(vp)); return inode ? vn_from_inode(inode) : NULL; @@ -557,32 +493,39 @@ static inline struct vnode *vn_grab(struct vnode *vp) */ #define VN_LOCK(vp) mutex_spinlock(&(vp)->v_lock) #define VN_UNLOCK(vp, s) mutex_spinunlock(&(vp)->v_lock, s) -#define VN_FLAGSET(vp,b) vn_flagset(vp,b) -#define VN_FLAGCLR(vp,b) vn_flagclr(vp,b) -static __inline__ void vn_flagset(struct vnode *vp, uint flag) +static __inline__ void vn_flagset(struct bhv_vnode *vp, uint flag) { spin_lock(&vp->v_lock); vp->v_flag |= flag; spin_unlock(&vp->v_lock); } -static __inline__ void vn_flagclr(struct vnode *vp, uint flag) +static __inline__ uint vn_flagclr(struct bhv_vnode *vp, uint flag) { + uint cleared; + spin_lock(&vp->v_lock); + cleared = (vp->v_flag & flag); vp->v_flag &= ~flag; spin_unlock(&vp->v_lock); + return cleared; } +#define VMODIFY(vp) vn_flagset(vp, VMODIFIED) +#define VUNMODIFY(vp) vn_flagclr(vp, VMODIFIED) +#define VTRUNCATE(vp) vn_flagset(vp, VTRUNCATED) +#define VUNTRUNCATE(vp) vn_flagclr(vp, VTRUNCATED) + /* * Dealing with bad inodes */ -static inline void vn_mark_bad(struct vnode *vp) +static inline void vn_mark_bad(struct bhv_vnode *vp) { make_bad_inode(vn_to_inode(vp)); } -static inline int VN_BAD(struct vnode *vp) +static inline int VN_BAD(struct bhv_vnode *vp) { return is_bad_inode(vn_to_inode(vp)); } @@ -590,18 +533,18 @@ static inline int VN_BAD(struct vnode *vp) /* * Extracting atime values in various formats */ -static inline void vn_atime_to_bstime(struct vnode *vp, xfs_bstime_t *bs_atime) +static inline void vn_atime_to_bstime(bhv_vnode_t *vp, xfs_bstime_t *bs_atime) { bs_atime->tv_sec = vp->v_inode.i_atime.tv_sec; bs_atime->tv_nsec = vp->v_inode.i_atime.tv_nsec; } -static inline void vn_atime_to_timespec(struct vnode *vp, struct timespec *ts) +static inline void vn_atime_to_timespec(bhv_vnode_t *vp, struct timespec *ts) { *ts = vp->v_inode.i_atime; } -static inline void vn_atime_to_time_t(struct vnode *vp, time_t *tt) +static inline void vn_atime_to_time_t(bhv_vnode_t *vp, time_t *tt) { *tt = vp->v_inode.i_atime.tv_sec; } @@ -613,11 +556,10 @@ static inline void vn_atime_to_time_t(struct vnode *vp, time_t *tt) #define VN_CACHED(vp) (vn_to_inode(vp)->i_mapping->nrpages) #define VN_DIRTY(vp) mapping_tagged(vn_to_inode(vp)->i_mapping, \ PAGECACHE_TAG_DIRTY) -#define VMODIFY(vp) VN_FLAGSET(vp, VMODIFIED) -#define VUNMODIFY(vp) VN_FLAGCLR(vp, VMODIFIED) +#define VN_TRUNC(vp) ((vp)->v_flag & VTRUNCATED) /* - * Flags to VOP_SETATTR/VOP_GETATTR. + * Flags to vop_setattr/getattr. */ #define ATTR_UTIME 0x01 /* non-default utime(2) request */ #define ATTR_DMI 0x08 /* invocation from a DMI function */ @@ -627,7 +569,7 @@ static inline void vn_atime_to_time_t(struct vnode *vp, time_t *tt) #define ATTR_NOSIZETOK 0x400 /* Don't get the SIZE token */ /* - * Flags to VOP_FSYNC and VOP_RECLAIM. + * Flags to vop_fsync/reclaim. */ #define FSYNC_NOWAIT 0 /* asynchronous flush */ #define FSYNC_WAIT 0x1 /* synchronous fsync or forced reclaim */ @@ -646,11 +588,11 @@ static inline void vn_atime_to_time_t(struct vnode *vp, time_t *tt) #define VNODE_KTRACE_REF 4 #define VNODE_KTRACE_RELE 5 -extern void vn_trace_entry(struct vnode *, const char *, inst_t *); -extern void vn_trace_exit(struct vnode *, const char *, inst_t *); -extern void vn_trace_hold(struct vnode *, char *, int, inst_t *); -extern void vn_trace_ref(struct vnode *, char *, int, inst_t *); -extern void vn_trace_rele(struct vnode *, char *, int, inst_t *); +extern void vn_trace_entry(struct bhv_vnode *, const char *, inst_t *); +extern void vn_trace_exit(struct bhv_vnode *, const char *, inst_t *); +extern void vn_trace_hold(struct bhv_vnode *, char *, int, inst_t *); +extern void vn_trace_ref(struct bhv_vnode *, char *, int, inst_t *); +extern void vn_trace_rele(struct bhv_vnode *, char *, int, inst_t *); #define VN_TRACE(vp) \ vn_trace_ref(vp, __FILE__, __LINE__, (inst_t *)__return_address) diff --git a/fs/xfs/quota/xfs_dquot.c b/fs/xfs/quota/xfs_dquot.c index 772ac4832..3aa771531 100644 --- a/fs/xfs/quota/xfs_dquot.c +++ b/fs/xfs/quota/xfs_dquot.c @@ -23,7 +23,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_dmapi.h" @@ -32,7 +31,6 @@ #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -444,7 +442,7 @@ xfs_qm_dqalloc( XFS_BMAPI_METADATA | XFS_BMAPI_WRITE, &firstblock, XFS_QM_DQALLOC_SPACE_RES(mp), - &map, &nmaps, &flist))) { + &map, &nmaps, &flist, NULL))) { goto error0; } ASSERT(map.br_blockcount == XFS_DQUOT_CLUSTER_SIZE_FSB); @@ -559,7 +557,7 @@ xfs_qm_dqtobp( error = xfs_bmapi(NULL, quotip, dqp->q_fileoffset, XFS_DQUOT_CLUSTER_SIZE_FSB, XFS_BMAPI_METADATA, - NULL, 0, &map, &nmaps, NULL); + NULL, 0, &map, &nmaps, NULL, NULL); xfs_iunlock(quotip, XFS_ILOCK_SHARED); if (error) @@ -1261,7 +1259,7 @@ xfs_qm_dqflush( if (xfs_qm_dqcheck(&dqp->q_core, be32_to_cpu(ddqp->d_id), 0, XFS_QMOPT_DOWARN, "dqflush (incore copy)")) { - xfs_force_shutdown(dqp->q_mount, XFS_CORRUPT_INCORE); + xfs_force_shutdown(dqp->q_mount, SHUTDOWN_CORRUPT_INCORE); return XFS_ERROR(EIO); } diff --git a/fs/xfs/quota/xfs_dquot.h b/fs/xfs/quota/xfs_dquot.h index c0c629663..78d3ab95c 100644 --- a/fs/xfs/quota/xfs_dquot.h +++ b/fs/xfs/quota/xfs_dquot.h @@ -119,7 +119,7 @@ XFS_DQ_IS_LOCKED(xfs_dquot_t *dqp) */ #define xfs_dqflock(dqp) { psema(&((dqp)->q_flock), PINOD | PRECALC);\ (dqp)->dq_flags |= XFS_DQ_FLOCKED; } -#define xfs_dqfunlock(dqp) { ASSERT(valusema(&((dqp)->q_flock)) <= 0); \ +#define xfs_dqfunlock(dqp) { ASSERT(issemalocked(&((dqp)->q_flock))); \ vsema(&((dqp)->q_flock)); \ (dqp)->dq_flags &= ~(XFS_DQ_FLOCKED); } @@ -128,7 +128,7 @@ XFS_DQ_IS_LOCKED(xfs_dquot_t *dqp) #define XFS_DQ_PINUNLOCK(dqp, s) mutex_spinunlock( \ &(XFS_DQ_TO_QINF(dqp)->qi_pinlock), s) -#define XFS_DQ_IS_FLUSH_LOCKED(dqp) (valusema(&((dqp)->q_flock)) <= 0) +#define XFS_DQ_IS_FLUSH_LOCKED(dqp) (issemalocked(&((dqp)->q_flock))) #define XFS_DQ_IS_ON_FREELIST(dqp) ((dqp)->dq_flnext != (dqp)) #define XFS_DQ_IS_DIRTY(dqp) ((dqp)->dq_flags & XFS_DQ_DIRTY) #define XFS_QM_ISUDQ(dqp) ((dqp)->dq_flags & XFS_DQ_USER) diff --git a/fs/xfs/quota/xfs_dquot_item.c b/fs/xfs/quota/xfs_dquot_item.c index 546f48af8..5b2dcc58b 100644 --- a/fs/xfs/quota/xfs_dquot_item.c +++ b/fs/xfs/quota/xfs_dquot_item.c @@ -23,7 +23,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_dmapi.h" @@ -32,7 +31,6 @@ #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -248,7 +246,7 @@ xfs_qm_dquot_logitem_pushbuf( * inode flush completed and the inode was taken off the AIL. * So, just get out. */ - if ((valusema(&(dqp->q_flock)) > 0) || + if (!issemalocked(&(dqp->q_flock)) || ((qip->qli_item.li_flags & XFS_LI_IN_AIL) == 0)) { qip->qli_pushbuf_flag = 0; xfs_dqunlock(dqp); @@ -261,7 +259,7 @@ xfs_qm_dquot_logitem_pushbuf( if (bp != NULL) { if (XFS_BUF_ISDELAYWRITE(bp)) { dopush = ((qip->qli_item.li_flags & XFS_LI_IN_AIL) && - (valusema(&(dqp->q_flock)) <= 0)); + issemalocked(&(dqp->q_flock))); qip->qli_pushbuf_flag = 0; xfs_dqunlock(dqp); diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c index 7fb5eca9b..e23e45535 100644 --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c @@ -24,7 +24,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_dmapi.h" @@ -33,7 +32,6 @@ #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -1603,7 +1601,7 @@ xfs_qm_dqiterate( maxlblkcnt - lblkno, XFS_BMAPI_METADATA, NULL, - 0, map, &nmaps, NULL); + 0, map, &nmaps, NULL, NULL); xfs_iunlock(qip, XFS_ILOCK_SHARED); if (error) break; @@ -1905,9 +1903,7 @@ xfs_qm_quotacheck( */ if ((error = xfs_bulkstat(mp, &lastino, &count, xfs_qm_dqusage_adjust, NULL, - structsz, NULL, - BULKSTAT_FG_IGET|BULKSTAT_FG_VFSLOCKED, - &done))) + structsz, NULL, BULKSTAT_FG_IGET, &done))) break; } while (! done); diff --git a/fs/xfs/quota/xfs_qm_bhv.c b/fs/xfs/quota/xfs_qm_bhv.c index 6838b36d9..db8872be8 100644 --- a/fs/xfs/quota/xfs_qm_bhv.c +++ b/fs/xfs/quota/xfs_qm_bhv.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2006 Silicon Graphics, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -24,7 +24,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_dmapi.h" @@ -33,7 +32,6 @@ #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -129,7 +127,7 @@ xfs_qm_parseargs( return XFS_ERROR(EINVAL); } - PVFS_PARSEARGS(BHV_NEXT(bhv), options, args, update, error); + error = bhv_next_vfs_parseargs(BHV_NEXT(bhv), options, args, update); if (!error && !referenced) bhv_remove_vfsops(bhvtovfs(bhv), VFS_POSITION_QM); return error; @@ -140,9 +138,8 @@ xfs_qm_showargs( struct bhv_desc *bhv, struct seq_file *m) { - struct vfs *vfsp = bhvtovfs(bhv); + struct bhv_vfs *vfsp = bhvtovfs(bhv); struct xfs_mount *mp = XFS_VFSTOM(vfsp); - int error; if (mp->m_qflags & XFS_UQUOTA_ACCT) { (mp->m_qflags & XFS_UQUOTA_ENFD) ? @@ -165,8 +162,7 @@ xfs_qm_showargs( if (!(mp->m_qflags & XFS_ALL_QUOTA_ACCT)) seq_puts(m, "," MNTOPT_NOQUOTA); - PVFS_SHOWARGS(BHV_NEXT(bhv), m, error); - return error; + return bhv_next_vfs_showargs(BHV_NEXT(bhv), m); } STATIC int @@ -175,14 +171,74 @@ xfs_qm_mount( struct xfs_mount_args *args, struct cred *cr) { - struct vfs *vfsp = bhvtovfs(bhv); + struct bhv_vfs *vfsp = bhvtovfs(bhv); struct xfs_mount *mp = XFS_VFSTOM(vfsp); - int error; if (args->flags & (XFSMNT_UQUOTA | XFSMNT_GQUOTA | XFSMNT_PQUOTA)) xfs_qm_mount_quotainit(mp, args->flags); - PVFS_MOUNT(BHV_NEXT(bhv), args, cr, error); - return error; + return bhv_next_vfs_mount(BHV_NEXT(bhv), args, cr); +} + +/* + * Directory tree accounting is implemented using project quotas, where + * the project identifier is inherited from parent directories. + * A statvfs (df, etc.) of a directory that is using project quota should + * return a statvfs of the project, not the entire filesystem. + * This makes such trees appear as if they are filesystems in themselves. + */ +STATIC int +xfs_qm_statvfs( + struct bhv_desc *bhv, + bhv_statvfs_t *statp, + struct bhv_vnode *vnode) +{ + xfs_mount_t *mp; + xfs_inode_t *ip; + xfs_dquot_t *dqp; + xfs_disk_dquot_t *dp; + __uint64_t limit; + int error; + + error = bhv_next_vfs_statvfs(BHV_NEXT(bhv), statp, vnode); + if (error || !vnode) + return error; + + mp = xfs_vfstom(bhvtovfs(bhv)); + ip = xfs_vtoi(vnode); + + if (!(ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT)) + return 0; + if (!(mp->m_qflags & XFS_PQUOTA_ACCT)) + return 0; + if (!(mp->m_qflags & XFS_OQUOTA_ENFD)) + return 0; + + if (xfs_qm_dqget(mp, NULL, ip->i_d.di_projid, XFS_DQ_PROJ, 0, &dqp)) + return 0; + dp = &dqp->q_core; + + limit = dp->d_blk_softlimit ? + be64_to_cpu(dp->d_blk_softlimit) : + be64_to_cpu(dp->d_blk_hardlimit); + if (limit && statp->f_blocks > limit) { + statp->f_blocks = limit; + statp->f_bfree = + (statp->f_blocks > be64_to_cpu(dp->d_bcount)) ? + (statp->f_blocks - be64_to_cpu(dp->d_bcount)) : 0; + } + + limit = dp->d_ino_softlimit ? + be64_to_cpu(dp->d_ino_softlimit) : + be64_to_cpu(dp->d_ino_hardlimit); + if (limit && statp->f_files > limit) { + statp->f_files = limit; + statp->f_ffree = + (statp->f_files > be64_to_cpu(dp->d_icount)) ? + (statp->f_ffree - be64_to_cpu(dp->d_icount)) : 0; + } + + xfs_qm_dqput(dqp); + return 0; } STATIC int @@ -191,7 +247,7 @@ xfs_qm_syncall( int flags, cred_t *credp) { - struct vfs *vfsp = bhvtovfs(bhv); + struct bhv_vfs *vfsp = bhvtovfs(bhv); struct xfs_mount *mp = XFS_VFSTOM(vfsp); int error; @@ -210,8 +266,7 @@ xfs_qm_syncall( } } } - PVFS_SYNC(BHV_NEXT(bhv), flags, credp, error); - return error; + return bhv_next_vfs_sync(BHV_NEXT(bhv), flags, credp); } STATIC int @@ -346,11 +401,12 @@ STATIC struct xfs_qmops xfs_qmcore_xfs = { .xfs_dqtrxops = &xfs_trans_dquot_ops, }; -struct bhv_vfsops xfs_qmops = { { +struct bhv_module_vfsops xfs_qmops = { { BHV_IDENTITY_INIT(VFS_BHV_QM, VFS_POSITION_QM), .vfs_parseargs = xfs_qm_parseargs, .vfs_showargs = xfs_qm_showargs, .vfs_mount = xfs_qm_mount, + .vfs_statvfs = xfs_qm_statvfs, .vfs_sync = xfs_qm_syncall, .vfs_quotactl = xfs_qm_quotactl, }, }; diff --git a/fs/xfs/quota/xfs_qm_stats.c b/fs/xfs/quota/xfs_qm_stats.c index 0570f7733..6f858fb81 100644 --- a/fs/xfs/quota/xfs_qm_stats.c +++ b/fs/xfs/quota/xfs_qm_stats.c @@ -23,7 +23,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_dmapi.h" @@ -32,7 +31,6 @@ #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" diff --git a/fs/xfs/quota/xfs_qm_syscalls.c b/fs/xfs/quota/xfs_qm_syscalls.c index 2d68f5cf4..87603ee94 100644 --- a/fs/xfs/quota/xfs_qm_syscalls.c +++ b/fs/xfs/quota/xfs_qm_syscalls.c @@ -26,7 +26,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_dmapi.h" @@ -35,7 +34,6 @@ #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -91,8 +89,8 @@ xfs_qm_quotactl( xfs_caddr_t addr) { xfs_mount_t *mp; + bhv_vfs_t *vfsp; int error; - struct vfs *vfsp; vfsp = bhvtovfs(bdp); mp = XFS_VFSTOM(vfsp); @@ -1035,7 +1033,7 @@ xfs_qm_dqrele_all_inodes( { xfs_inode_t *ip, *topino; uint ireclaims; - vnode_t *vp; + bhv_vnode_t *vp; boolean_t vnode_refd; ASSERT(mp->m_quotainfo); diff --git a/fs/xfs/quota/xfs_trans_dquot.c b/fs/xfs/quota/xfs_trans_dquot.c index 9168918db..0242e9666 100644 --- a/fs/xfs/quota/xfs_trans_dquot.c +++ b/fs/xfs/quota/xfs_trans_dquot.c @@ -23,7 +23,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_dmapi.h" @@ -33,7 +32,6 @@ #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" #include "xfs_attr_sf.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" diff --git a/fs/xfs/support/debug.c b/fs/xfs/support/debug.c index b08b3d934..36fbeccdc 100644 --- a/fs/xfs/support/debug.c +++ b/fs/xfs/support/debug.c @@ -47,7 +47,7 @@ cmn_err(register int level, char *fmt, ...) va_start(ap, fmt); if (*fmt == '!') fp++; len = vsprintf(message, fp, ap); - if (message[len-1] != '\n') + if (level != CE_DEBUG && message[len-1] != '\n') strcat(message, "\n"); printk("%s%s", err_level[level], message); va_end(ap); @@ -68,7 +68,7 @@ icmn_err(register int level, char *fmt, va_list ap) level = XFS_MAX_ERR_LEVEL; spin_lock_irqsave(&xfs_err_lock,flags); len = vsprintf(message, fmt, ap); - if (message[len-1] != '\n') + if (level != CE_DEBUG && message[len-1] != '\n') strcat(message, "\n"); spin_unlock_irqrestore(&xfs_err_lock,flags); printk("%s%s", err_level[level], message); diff --git a/fs/xfs/support/debug.h b/fs/xfs/support/debug.h index e3bf58112..4f54dca66 100644 --- a/fs/xfs/support/debug.h +++ b/fs/xfs/support/debug.h @@ -33,9 +33,6 @@ extern void cmn_err(int, char *, ...) __attribute__ ((format (printf, 2, 3))); extern void assfail(char *expr, char *f, int l); -#define prdev(fmt,targ,args...) \ - printk("Device %s - " fmt "\n", XFS_BUFTARG_NAME(targ), ## args) - #define ASSERT_ALWAYS(expr) \ (unlikely((expr) != 0) ? (void)0 : assfail(#expr, __FILE__, __LINE__)) diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c index 2539af34e..4b0cb474b 100644 --- a/fs/xfs/xfs_acl.c +++ b/fs/xfs/xfs_acl.c @@ -21,12 +21,10 @@ #include "xfs_bit.h" #include "xfs_inum.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -39,15 +37,15 @@ #include #include -STATIC int xfs_acl_setmode(vnode_t *, xfs_acl_t *, int *); +STATIC int xfs_acl_setmode(bhv_vnode_t *, xfs_acl_t *, int *); STATIC void xfs_acl_filter_mode(mode_t, xfs_acl_t *); STATIC void xfs_acl_get_endian(xfs_acl_t *); STATIC int xfs_acl_access(uid_t, gid_t, xfs_acl_t *, mode_t, cred_t *); STATIC int xfs_acl_invalid(xfs_acl_t *); STATIC void xfs_acl_sync_mode(mode_t, xfs_acl_t *); -STATIC void xfs_acl_get_attr(vnode_t *, xfs_acl_t *, int, int, int *); -STATIC void xfs_acl_set_attr(vnode_t *, xfs_acl_t *, int, int *); -STATIC int xfs_acl_allow_set(vnode_t *, int); +STATIC void xfs_acl_get_attr(bhv_vnode_t *, xfs_acl_t *, int, int, int *); +STATIC void xfs_acl_set_attr(bhv_vnode_t *, xfs_acl_t *, int, int *); +STATIC int xfs_acl_allow_set(bhv_vnode_t *, int); kmem_zone_t *xfs_acl_zone; @@ -57,7 +55,7 @@ kmem_zone_t *xfs_acl_zone; */ int xfs_acl_vhasacl_access( - vnode_t *vp) + bhv_vnode_t *vp) { int error; @@ -70,7 +68,7 @@ xfs_acl_vhasacl_access( */ int xfs_acl_vhasacl_default( - vnode_t *vp) + bhv_vnode_t *vp) { int error; @@ -209,7 +207,7 @@ posix_acl_xfs_to_xattr( int xfs_acl_vget( - vnode_t *vp, + bhv_vnode_t *vp, void *acl, size_t size, int kind) @@ -241,10 +239,10 @@ xfs_acl_vget( goto out; } if (kind == _ACL_TYPE_ACCESS) { - vattr_t va; + bhv_vattr_t va; va.va_mask = XFS_AT_MODE; - VOP_GETATTR(vp, &va, 0, sys_cred, error); + error = bhv_vop_getattr(vp, &va, 0, sys_cred); if (error) goto out; xfs_acl_sync_mode(va.va_mode, xfs_acl); @@ -260,7 +258,7 @@ out: int xfs_acl_vremove( - vnode_t *vp, + bhv_vnode_t *vp, int kind) { int error; @@ -268,9 +266,9 @@ xfs_acl_vremove( VN_HOLD(vp); error = xfs_acl_allow_set(vp, kind); if (!error) { - VOP_ATTR_REMOVE(vp, kind == _ACL_TYPE_DEFAULT? - SGI_ACL_DEFAULT: SGI_ACL_FILE, - ATTR_ROOT, sys_cred, error); + error = bhv_vop_attr_remove(vp, kind == _ACL_TYPE_DEFAULT? + SGI_ACL_DEFAULT: SGI_ACL_FILE, + ATTR_ROOT, sys_cred); if (error == ENOATTR) error = 0; /* 'scool */ } @@ -280,7 +278,7 @@ xfs_acl_vremove( int xfs_acl_vset( - vnode_t *vp, + bhv_vnode_t *vp, void *acl, size_t size, int kind) @@ -370,10 +368,10 @@ xfs_acl_iaccess( STATIC int xfs_acl_allow_set( - vnode_t *vp, + bhv_vnode_t *vp, int kind) { - vattr_t va; + bhv_vattr_t va; int error; if (vp->v_inode.i_flags & (S_IMMUTABLE|S_APPEND)) @@ -383,7 +381,7 @@ xfs_acl_allow_set( if (vp->v_vfsp->vfs_flag & VFS_RDONLY) return EROFS; va.va_mask = XFS_AT_UID; - VOP_GETATTR(vp, &va, 0, NULL, error); + error = bhv_vop_getattr(vp, &va, 0, NULL); if (error) return error; if (va.va_uid != current->fsuid && !capable(CAP_FOWNER)) @@ -606,7 +604,7 @@ xfs_acl_get_endian( */ STATIC void xfs_acl_get_attr( - vnode_t *vp, + bhv_vnode_t *vp, xfs_acl_t *aclp, int kind, int flags, @@ -616,9 +614,9 @@ xfs_acl_get_attr( ASSERT((flags & ATTR_KERNOVAL) ? (aclp == NULL) : 1); flags |= ATTR_ROOT; - VOP_ATTR_GET(vp, - kind == _ACL_TYPE_ACCESS ? SGI_ACL_FILE : SGI_ACL_DEFAULT, - (char *)aclp, &len, flags, sys_cred, *error); + *error = bhv_vop_attr_get(vp, kind == _ACL_TYPE_ACCESS ? + SGI_ACL_FILE : SGI_ACL_DEFAULT, + (char *)aclp, &len, flags, sys_cred); if (*error || (flags & ATTR_KERNOVAL)) return; xfs_acl_get_endian(aclp); @@ -629,7 +627,7 @@ xfs_acl_get_attr( */ STATIC void xfs_acl_set_attr( - vnode_t *vp, + bhv_vnode_t *vp, xfs_acl_t *aclp, int kind, int *error) @@ -654,19 +652,19 @@ xfs_acl_set_attr( INT_SET(newace->ae_perm, ARCH_CONVERT, ace->ae_perm); } INT_SET(newacl->acl_cnt, ARCH_CONVERT, aclp->acl_cnt); - VOP_ATTR_SET(vp, - kind == _ACL_TYPE_ACCESS ? SGI_ACL_FILE: SGI_ACL_DEFAULT, - (char *)newacl, len, ATTR_ROOT, sys_cred, *error); + *error = bhv_vop_attr_set(vp, kind == _ACL_TYPE_ACCESS ? + SGI_ACL_FILE: SGI_ACL_DEFAULT, + (char *)newacl, len, ATTR_ROOT, sys_cred); _ACL_FREE(newacl); } int xfs_acl_vtoacl( - vnode_t *vp, + bhv_vnode_t *vp, xfs_acl_t *access_acl, xfs_acl_t *default_acl) { - vattr_t va; + bhv_vattr_t va; int error = 0; if (access_acl) { @@ -678,7 +676,7 @@ xfs_acl_vtoacl( if (!error) { /* Got the ACL, need the mode... */ va.va_mask = XFS_AT_MODE; - VOP_GETATTR(vp, &va, 0, sys_cred, error); + error = bhv_vop_getattr(vp, &va, 0, sys_cred); } if (error) @@ -701,8 +699,8 @@ xfs_acl_vtoacl( */ int xfs_acl_inherit( - vnode_t *vp, - vattr_t *vap, + bhv_vnode_t *vp, + bhv_vattr_t *vap, xfs_acl_t *pdaclp) { xfs_acl_t *cacl; @@ -757,11 +755,11 @@ xfs_acl_inherit( */ STATIC int xfs_acl_setmode( - vnode_t *vp, + bhv_vnode_t *vp, xfs_acl_t *acl, int *basicperms) { - vattr_t va; + bhv_vattr_t va; xfs_acl_entry_t *ap; xfs_acl_entry_t *gap = NULL; int i, error, nomask = 1; @@ -776,7 +774,7 @@ xfs_acl_setmode( * mode. The m:: bits take precedence over the g:: bits. */ va.va_mask = XFS_AT_MODE; - VOP_GETATTR(vp, &va, 0, sys_cred, error); + error = bhv_vop_getattr(vp, &va, 0, sys_cred); if (error) return error; @@ -810,8 +808,7 @@ xfs_acl_setmode( if (gap && nomask) va.va_mode |= gap->ae_perm << 3; - VOP_SETATTR(vp, &va, 0, sys_cred, error); - return error; + return bhv_vop_setattr(vp, &va, 0, sys_cred); } /* diff --git a/fs/xfs/xfs_acl.h b/fs/xfs/xfs_acl.h index 538d0d65b..f853cf1a6 100644 --- a/fs/xfs/xfs_acl.h +++ b/fs/xfs/xfs_acl.h @@ -50,7 +50,7 @@ typedef struct xfs_acl { #ifdef CONFIG_XFS_POSIX_ACL struct vattr; -struct vnode; +struct bhv_vnode; struct xfs_inode; extern struct kmem_zone *xfs_acl_zone; @@ -58,14 +58,14 @@ extern struct kmem_zone *xfs_acl_zone; (zone) = kmem_zone_init(sizeof(xfs_acl_t), (name)) #define xfs_acl_zone_destroy(zone) kmem_zone_destroy(zone) -extern int xfs_acl_inherit(struct vnode *, struct vattr *, xfs_acl_t *); +extern int xfs_acl_inherit(struct bhv_vnode *, struct bhv_vattr *, xfs_acl_t *); extern int xfs_acl_iaccess(struct xfs_inode *, mode_t, cred_t *); -extern int xfs_acl_vtoacl(struct vnode *, xfs_acl_t *, xfs_acl_t *); -extern int xfs_acl_vhasacl_access(struct vnode *); -extern int xfs_acl_vhasacl_default(struct vnode *); -extern int xfs_acl_vset(struct vnode *, void *, size_t, int); -extern int xfs_acl_vget(struct vnode *, void *, size_t, int); -extern int xfs_acl_vremove(struct vnode *vp, int); +extern int xfs_acl_vtoacl(struct bhv_vnode *, xfs_acl_t *, xfs_acl_t *); +extern int xfs_acl_vhasacl_access(struct bhv_vnode *); +extern int xfs_acl_vhasacl_default(struct bhv_vnode *); +extern int xfs_acl_vset(struct bhv_vnode *, void *, size_t, int); +extern int xfs_acl_vget(struct bhv_vnode *, void *, size_t, int); +extern int xfs_acl_vremove(struct bhv_vnode *, int); #define _ACL_TYPE_ACCESS 1 #define _ACL_TYPE_DEFAULT 2 diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index 855822628..d2bbcd882 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -24,14 +24,12 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -1837,40 +1835,47 @@ xfs_alloc_fix_freelist( &agbp))) return error; if (!pag->pagf_init) { + ASSERT(flags & XFS_ALLOC_FLAG_TRYLOCK); + ASSERT(!(flags & XFS_ALLOC_FLAG_FREEING)); args->agbp = NULL; return 0; } } else agbp = NULL; - /* If this is a metadata preferred pag and we are user data + /* + * If this is a metadata preferred pag and we are user data * then try somewhere else if we are not being asked to * try harder at this point */ - if (pag->pagf_metadata && args->userdata && flags) { + if (pag->pagf_metadata && args->userdata && + (flags & XFS_ALLOC_FLAG_TRYLOCK)) { + ASSERT(!(flags & XFS_ALLOC_FLAG_FREEING)); args->agbp = NULL; return 0; } - need = XFS_MIN_FREELIST_PAG(pag, mp); - delta = need > pag->pagf_flcount ? need - pag->pagf_flcount : 0; - /* - * If it looks like there isn't a long enough extent, or enough - * total blocks, reject it. - */ - longest = (pag->pagf_longest > delta) ? - (pag->pagf_longest - delta) : - (pag->pagf_flcount > 0 || pag->pagf_longest > 0); - if (args->minlen + args->alignment + args->minalignslop - 1 > longest || - (args->minleft && - (int)(pag->pagf_freeblks + pag->pagf_flcount - - need - args->total) < - (int)args->minleft)) { - if (agbp) - xfs_trans_brelse(tp, agbp); - args->agbp = NULL; - return 0; + if (!(flags & XFS_ALLOC_FLAG_FREEING)) { + need = XFS_MIN_FREELIST_PAG(pag, mp); + delta = need > pag->pagf_flcount ? need - pag->pagf_flcount : 0; + /* + * If it looks like there isn't a long enough extent, or enough + * total blocks, reject it. + */ + longest = (pag->pagf_longest > delta) ? + (pag->pagf_longest - delta) : + (pag->pagf_flcount > 0 || pag->pagf_longest > 0); + if ((args->minlen + args->alignment + args->minalignslop - 1) > + longest || + ((int)(pag->pagf_freeblks + pag->pagf_flcount - + need - args->total) < (int)args->minleft)) { + if (agbp) + xfs_trans_brelse(tp, agbp); + args->agbp = NULL; + return 0; + } } + /* * Get the a.g. freespace buffer. * Can fail if we're not blocking on locks, and it's held. @@ -1880,6 +1885,8 @@ xfs_alloc_fix_freelist( &agbp))) return error; if (agbp == NULL) { + ASSERT(flags & XFS_ALLOC_FLAG_TRYLOCK); + ASSERT(!(flags & XFS_ALLOC_FLAG_FREEING)); args->agbp = NULL; return 0; } @@ -1889,22 +1896,24 @@ xfs_alloc_fix_freelist( */ agf = XFS_BUF_TO_AGF(agbp); need = XFS_MIN_FREELIST(agf, mp); - delta = need > be32_to_cpu(agf->agf_flcount) ? - (need - be32_to_cpu(agf->agf_flcount)) : 0; /* * If there isn't enough total or single-extent, reject it. */ - longest = be32_to_cpu(agf->agf_longest); - longest = (longest > delta) ? (longest - delta) : - (be32_to_cpu(agf->agf_flcount) > 0 || longest > 0); - if (args->minlen + args->alignment + args->minalignslop - 1 > longest || - (args->minleft && - (int)(be32_to_cpu(agf->agf_freeblks) + - be32_to_cpu(agf->agf_flcount) - need - args->total) < - (int)args->minleft)) { - xfs_trans_brelse(tp, agbp); - args->agbp = NULL; - return 0; + if (!(flags & XFS_ALLOC_FLAG_FREEING)) { + delta = need > be32_to_cpu(agf->agf_flcount) ? + (need - be32_to_cpu(agf->agf_flcount)) : 0; + longest = be32_to_cpu(agf->agf_longest); + longest = (longest > delta) ? (longest - delta) : + (be32_to_cpu(agf->agf_flcount) > 0 || longest > 0); + if ((args->minlen + args->alignment + args->minalignslop - 1) > + longest || + ((int)(be32_to_cpu(agf->agf_freeblks) + + be32_to_cpu(agf->agf_flcount) - need - args->total) < + (int)args->minleft)) { + xfs_trans_brelse(tp, agbp); + args->agbp = NULL; + return 0; + } } /* * Make the freelist shorter if it's too long. @@ -1951,8 +1960,13 @@ xfs_alloc_fix_freelist( * the restrictions correctly. Can happen for free calls * on a completely full ag. */ - if (targs.agbno == NULLAGBLOCK) - break; + if (targs.agbno == NULLAGBLOCK) { + if (flags & XFS_ALLOC_FLAG_FREEING) + break; + xfs_trans_brelse(tp, agflbp); + args->agbp = NULL; + return 0; + } /* * Put each allocated block on the list. */ @@ -2360,8 +2374,19 @@ xfs_alloc_vextent( if (args->agno == sagno && type == XFS_ALLOCTYPE_START_BNO) args->type = XFS_ALLOCTYPE_THIS_AG; - if (++(args->agno) == mp->m_sb.sb_agcount) - args->agno = 0; + /* + * For the first allocation, we can try any AG to get + * space. However, if we already have allocated a + * block, we don't want to try AGs whose number is below + * sagno. Otherwise, we may end up with out-of-order + * locking of AGF, which might cause deadlock. + */ + if (++(args->agno) == mp->m_sb.sb_agcount) { + if (args->firstblock != NULLFSBLOCK) + args->agno = sagno; + else + args->agno = 0; + } /* * Reached the starting a.g., must either be done * or switch to non-trylock mode. @@ -2427,31 +2452,26 @@ xfs_free_extent( xfs_fsblock_t bno, /* starting block number of extent */ xfs_extlen_t len) /* length of extent */ { -#ifdef DEBUG - xfs_agf_t *agf; /* a.g. freespace header */ -#endif - xfs_alloc_arg_t args; /* allocation argument structure */ + xfs_alloc_arg_t args; int error; ASSERT(len != 0); + memset(&args, 0, sizeof(xfs_alloc_arg_t)); args.tp = tp; args.mp = tp->t_mountp; args.agno = XFS_FSB_TO_AGNO(args.mp, bno); ASSERT(args.agno < args.mp->m_sb.sb_agcount); args.agbno = XFS_FSB_TO_AGBNO(args.mp, bno); - args.alignment = 1; - args.minlen = args.minleft = args.minalignslop = 0; down_read(&args.mp->m_peraglock); args.pag = &args.mp->m_perag[args.agno]; - if ((error = xfs_alloc_fix_freelist(&args, 0))) + if ((error = xfs_alloc_fix_freelist(&args, XFS_ALLOC_FLAG_FREEING))) goto error0; #ifdef DEBUG ASSERT(args.agbp != NULL); - agf = XFS_BUF_TO_AGF(args.agbp); - ASSERT(args.agbno + len <= be32_to_cpu(agf->agf_length)); + ASSERT((args.agbno + len) <= + be32_to_cpu(XFS_BUF_TO_AGF(args.agbp)->agf_length)); #endif - error = xfs_free_ag_extent(tp, args.agbp, args.agno, args.agbno, - len, 0); + error = xfs_free_ag_extent(tp, args.agbp, args.agno, args.agbno, len, 0); error0: up_read(&args.mp->m_peraglock); return error; diff --git a/fs/xfs/xfs_alloc.h b/fs/xfs/xfs_alloc.h index 2d1f8928b..5a4256120 100644 --- a/fs/xfs/xfs_alloc.h +++ b/fs/xfs/xfs_alloc.h @@ -41,6 +41,27 @@ typedef enum xfs_alloctype * Flags for xfs_alloc_fix_freelist. */ #define XFS_ALLOC_FLAG_TRYLOCK 0x00000001 /* use trylock for buffer locking */ +#define XFS_ALLOC_FLAG_FREEING 0x00000002 /* indicate caller is freeing extents*/ + +/* + * In order to avoid ENOSPC-related deadlock caused by + * out-of-order locking of AGF buffer (PV 947395), we place + * constraints on the relationship among actual allocations for + * data blocks, freelist blocks, and potential file data bmap + * btree blocks. However, these restrictions may result in no + * actual space allocated for a delayed extent, for example, a data + * block in a certain AG is allocated but there is no additional + * block for the additional bmap btree block due to a split of the + * bmap btree of the file. The result of this may lead to an + * infinite loop in xfssyncd when the file gets flushed to disk and + * all delayed extents need to be actually allocated. To get around + * this, we explicitly set aside a few blocks which will not be + * reserved in delayed allocation. Considering the minimum number of + * needed freelist blocks is 4 fsbs _per AG_, a potential split of file's bmap + * btree requires 1 fsb, so we set the number of set-aside blocks + * to 4 + 4*agcount. + */ +#define XFS_ALLOC_SET_ASIDE(mp) (4 + ((mp)->m_sb.sb_agcount * 4)) /* * Argument structure for xfs_alloc routines. @@ -70,6 +91,7 @@ typedef struct xfs_alloc_arg { char wasfromfl; /* set if allocation is from freelist */ char isfl; /* set if is freelist blocks - !acctg */ char userdata; /* set if this is user data */ + xfs_fsblock_t firstblock; /* io first block allocated */ } xfs_alloc_arg_t; /* diff --git a/fs/xfs/xfs_alloc_btree.c b/fs/xfs/xfs_alloc_btree.c index a1d92da86..7446556e8 100644 --- a/fs/xfs/xfs_alloc_btree.c +++ b/fs/xfs/xfs_alloc_btree.c @@ -24,14 +24,12 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index b6e1e02bb..1a2101043 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -27,7 +27,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" @@ -35,7 +34,6 @@ #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -1910,7 +1908,7 @@ xfs_attr_rmtval_get(xfs_da_args_t *args) error = xfs_bmapi(args->trans, args->dp, (xfs_fileoff_t)lblkno, args->rmtblkcnt, XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, - NULL, 0, map, &nmap, NULL); + NULL, 0, map, &nmap, NULL, NULL); if (error) return(error); ASSERT(nmap >= 1); @@ -1988,7 +1986,7 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA | XFS_BMAPI_WRITE, args->firstblock, args->total, &map, &nmap, - args->flist); + args->flist, NULL); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, *args->firstblock, &committed); @@ -2039,7 +2037,8 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) error = xfs_bmapi(NULL, dp, (xfs_fileoff_t)lblkno, args->rmtblkcnt, XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, - args->firstblock, 0, &map, &nmap, NULL); + args->firstblock, 0, &map, &nmap, + NULL, NULL); if (error) { return(error); } @@ -2104,7 +2103,7 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args) args->rmtblkcnt, XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, args->firstblock, 0, &map, &nmap, - args->flist); + args->flist, NULL); if (error) { return(error); } @@ -2142,7 +2141,8 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args) XFS_BMAP_INIT(args->flist, args->firstblock); error = xfs_bunmapi(args->trans, args->dp, lblkno, blkcnt, XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, - 1, args->firstblock, args->flist, &done); + 1, args->firstblock, args->flist, + NULL, &done); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, *args->firstblock, &committed); @@ -2322,56 +2322,56 @@ xfs_attr_trace_enter(int type, char *where, STATIC int posix_acl_access_set( - vnode_t *vp, char *name, void *data, size_t size, int xflags) + bhv_vnode_t *vp, char *name, void *data, size_t size, int xflags) { return xfs_acl_vset(vp, data, size, _ACL_TYPE_ACCESS); } STATIC int posix_acl_access_remove( - struct vnode *vp, char *name, int xflags) + bhv_vnode_t *vp, char *name, int xflags) { return xfs_acl_vremove(vp, _ACL_TYPE_ACCESS); } STATIC int posix_acl_access_get( - vnode_t *vp, char *name, void *data, size_t size, int xflags) + bhv_vnode_t *vp, char *name, void *data, size_t size, int xflags) { return xfs_acl_vget(vp, data, size, _ACL_TYPE_ACCESS); } STATIC int posix_acl_access_exists( - vnode_t *vp) + bhv_vnode_t *vp) { return xfs_acl_vhasacl_access(vp); } STATIC int posix_acl_default_set( - vnode_t *vp, char *name, void *data, size_t size, int xflags) + bhv_vnode_t *vp, char *name, void *data, size_t size, int xflags) { return xfs_acl_vset(vp, data, size, _ACL_TYPE_DEFAULT); } STATIC int posix_acl_default_get( - vnode_t *vp, char *name, void *data, size_t size, int xflags) + bhv_vnode_t *vp, char *name, void *data, size_t size, int xflags) { return xfs_acl_vget(vp, data, size, _ACL_TYPE_DEFAULT); } STATIC int posix_acl_default_remove( - struct vnode *vp, char *name, int xflags) + bhv_vnode_t *vp, char *name, int xflags) { return xfs_acl_vremove(vp, _ACL_TYPE_DEFAULT); } STATIC int posix_acl_default_exists( - vnode_t *vp) + bhv_vnode_t *vp) { return xfs_acl_vhasacl_default(vp); } @@ -2404,21 +2404,18 @@ STATIC struct attrnames *attr_system_names[] = STATIC int attr_generic_set( - struct vnode *vp, char *name, void *data, size_t size, int xflags) + bhv_vnode_t *vp, char *name, void *data, size_t size, int xflags) { - int error; - - VOP_ATTR_SET(vp, name, data, size, xflags, NULL, error); - return -error; + return -bhv_vop_attr_set(vp, name, data, size, xflags, NULL); } STATIC int attr_generic_get( - struct vnode *vp, char *name, void *data, size_t size, int xflags) + bhv_vnode_t *vp, char *name, void *data, size_t size, int xflags) { int error, asize = size; - VOP_ATTR_GET(vp, name, data, &asize, xflags, NULL, error); + error = bhv_vop_attr_get(vp, name, data, &asize, xflags, NULL); if (!error) return asize; return -error; @@ -2426,12 +2423,9 @@ attr_generic_get( STATIC int attr_generic_remove( - struct vnode *vp, char *name, int xflags) + bhv_vnode_t *vp, char *name, int xflags) { - int error; - - VOP_ATTR_REMOVE(vp, name, xflags, NULL, error); - return -error; + return -bhv_vop_attr_remove(vp, name, xflags, NULL); } STATIC int @@ -2459,7 +2453,7 @@ attr_generic_listadd( STATIC int attr_system_list( - struct vnode *vp, + bhv_vnode_t *vp, void *data, size_t size, ssize_t *result) @@ -2481,12 +2475,12 @@ attr_system_list( int attr_generic_list( - struct vnode *vp, void *data, size_t size, int xflags, ssize_t *result) + bhv_vnode_t *vp, void *data, size_t size, int xflags, ssize_t *result) { attrlist_cursor_kern_t cursor = { 0 }; int error; - VOP_ATTR_LIST(vp, data, size, xflags, &cursor, NULL, error); + error = bhv_vop_attr_list(vp, data, size, xflags, &cursor, NULL); if (error > 0) return -error; *result = -error; @@ -2514,7 +2508,7 @@ attr_lookup_namespace( */ STATIC int attr_user_capable( - struct vnode *vp, + bhv_vnode_t *vp, cred_t *cred) { struct inode *inode = vn_to_inode(vp); @@ -2532,7 +2526,7 @@ attr_user_capable( STATIC int attr_trusted_capable( - struct vnode *vp, + bhv_vnode_t *vp, cred_t *cred) { struct inode *inode = vn_to_inode(vp); @@ -2546,7 +2540,7 @@ attr_trusted_capable( STATIC int attr_secure_capable( - struct vnode *vp, + bhv_vnode_t *vp, cred_t *cred) { return -ENOSECURITY; @@ -2554,7 +2548,7 @@ attr_secure_capable( STATIC int attr_system_set( - struct vnode *vp, char *name, void *data, size_t size, int xflags) + bhv_vnode_t *vp, char *name, void *data, size_t size, int xflags) { attrnames_t *namesp; int error; @@ -2573,7 +2567,7 @@ attr_system_set( STATIC int attr_system_get( - struct vnode *vp, char *name, void *data, size_t size, int xflags) + bhv_vnode_t *vp, char *name, void *data, size_t size, int xflags) { attrnames_t *namesp; @@ -2585,7 +2579,7 @@ attr_system_get( STATIC int attr_system_remove( - struct vnode *vp, char *name, int xflags) + bhv_vnode_t *vp, char *name, int xflags) { attrnames_t *namesp; diff --git a/fs/xfs/xfs_attr.h b/fs/xfs/xfs_attr.h index b2c7b9fcd..981633f6c 100644 --- a/fs/xfs/xfs_attr.h +++ b/fs/xfs/xfs_attr.h @@ -36,13 +36,13 @@ *========================================================================*/ struct cred; -struct vnode; +struct bhv_vnode; -typedef int (*attrset_t)(struct vnode *, char *, void *, size_t, int); -typedef int (*attrget_t)(struct vnode *, char *, void *, size_t, int); -typedef int (*attrremove_t)(struct vnode *, char *, int); -typedef int (*attrexists_t)(struct vnode *); -typedef int (*attrcapable_t)(struct vnode *, struct cred *); +typedef int (*attrset_t)(struct bhv_vnode *, char *, void *, size_t, int); +typedef int (*attrget_t)(struct bhv_vnode *, char *, void *, size_t, int); +typedef int (*attrremove_t)(struct bhv_vnode *, char *, int); +typedef int (*attrexists_t)(struct bhv_vnode *); +typedef int (*attrcapable_t)(struct bhv_vnode *, struct cred *); typedef struct attrnames { char * attr_name; @@ -63,7 +63,7 @@ extern struct attrnames attr_trusted; extern struct attrnames *attr_namespaces[ATTR_NAMECOUNT]; extern attrnames_t *attr_lookup_namespace(char *, attrnames_t **, int); -extern int attr_generic_list(struct vnode *, void *, size_t, int, ssize_t *); +extern int attr_generic_list(struct bhv_vnode *, void *, size_t, int, ssize_t *); #define ATTR_DONTFOLLOW 0x0001 /* -- unused, from IRIX -- */ #define ATTR_ROOT 0x0002 /* use attrs in root (trusted) namespace */ diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index 9462be86a..9455051f0 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -24,7 +24,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" @@ -34,7 +33,6 @@ #include "xfs_ialloc_btree.h" #include "xfs_alloc.h" #include "xfs_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -2990,7 +2988,7 @@ xfs_attr_leaf_freextent(xfs_trans_t **trans, xfs_inode_t *dp, nmap = 1; error = xfs_bmapi(*trans, dp, (xfs_fileoff_t)tblkno, tblkcnt, XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, - NULL, 0, &map, &nmap, NULL); + NULL, 0, &map, &nmap, NULL, NULL); if (error) { return(error); } diff --git a/fs/xfs/xfs_behavior.h b/fs/xfs/xfs_behavior.h index 1d8ff1032..6e6e56fb3 100644 --- a/fs/xfs/xfs_behavior.h +++ b/fs/xfs/xfs_behavior.h @@ -78,15 +78,12 @@ * */ -struct bhv_head_lock; - /* * Behavior head. Head of the chain of behaviors. * Contained within each virtualized object data structure. */ typedef struct bhv_head { struct bhv_desc *bh_first; /* first behavior in chain */ - struct bhv_head_lock *bh_lockp; /* pointer to lock info struct */ } bhv_head_t; /* diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 26939d364..bf46fae30 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2006 Silicon Graphics, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -24,13 +24,11 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -40,13 +38,15 @@ #include "xfs_mount.h" #include "xfs_ialloc.h" #include "xfs_itable.h" +#include "xfs_dir2_data.h" +#include "xfs_dir2_leaf.h" +#include "xfs_dir2_block.h" #include "xfs_inode_item.h" #include "xfs_extfree_item.h" #include "xfs_alloc.h" #include "xfs_bmap.h" #include "xfs_rtalloc.h" #include "xfs_error.h" -#include "xfs_dir_leaf.h" #include "xfs_attr_leaf.h" #include "xfs_rw.h" #include "xfs_quota.h" @@ -101,6 +101,7 @@ xfs_bmap_add_extent( xfs_fsblock_t *first, /* pointer to firstblock variable */ xfs_bmap_free_t *flist, /* list of extents to be freed */ int *logflagsp, /* inode logging flags */ + xfs_extdelta_t *delta, /* Change made to incore extents */ int whichfork, /* data or attr fork */ int rsvd); /* OK to allocate reserved blocks */ @@ -118,6 +119,7 @@ xfs_bmap_add_extent_delay_real( xfs_fsblock_t *first, /* pointer to firstblock variable */ xfs_bmap_free_t *flist, /* list of extents to be freed */ int *logflagsp, /* inode logging flags */ + xfs_extdelta_t *delta, /* Change made to incore extents */ int rsvd); /* OK to allocate reserved blocks */ /* @@ -131,6 +133,7 @@ xfs_bmap_add_extent_hole_delay( xfs_btree_cur_t *cur, /* if null, not a btree */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ int *logflagsp,/* inode logging flags */ + xfs_extdelta_t *delta, /* Change made to incore extents */ int rsvd); /* OK to allocate reserved blocks */ /* @@ -144,6 +147,7 @@ xfs_bmap_add_extent_hole_real( xfs_btree_cur_t *cur, /* if null, not a btree */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ int *logflagsp, /* inode logging flags */ + xfs_extdelta_t *delta, /* Change made to incore extents */ int whichfork); /* data or attr fork */ /* @@ -156,7 +160,8 @@ xfs_bmap_add_extent_unwritten_real( xfs_extnum_t idx, /* extent number to update/insert */ xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ - int *logflagsp); /* inode logging flags */ + int *logflagsp, /* inode logging flags */ + xfs_extdelta_t *delta); /* Change made to incore extents */ /* * xfs_bmap_alloc is called by xfs_bmapi to allocate an extent for a file. @@ -203,6 +208,7 @@ xfs_bmap_del_extent( xfs_btree_cur_t *cur, /* if null, not a btree */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ int *logflagsp,/* inode logging flags */ + xfs_extdelta_t *delta, /* Change made to incore extents */ int whichfork, /* data or attr fork */ int rsvd); /* OK to allocate reserved blocks */ @@ -510,7 +516,7 @@ xfs_bmap_add_attrfork_local( dargs.total = mp->m_dirblkfsbs; dargs.whichfork = XFS_DATA_FORK; dargs.trans = tp; - error = XFS_DIR_SHORTFORM_TO_SINGLE(mp, &dargs); + error = xfs_dir2_sf_to_block(&dargs); } else error = xfs_bmap_local_to_extents(tp, ip, firstblock, 1, flags, XFS_DATA_FORK); @@ -530,6 +536,7 @@ xfs_bmap_add_extent( xfs_fsblock_t *first, /* pointer to firstblock variable */ xfs_bmap_free_t *flist, /* list of extents to be freed */ int *logflagsp, /* inode logging flags */ + xfs_extdelta_t *delta, /* Change made to incore extents */ int whichfork, /* data or attr fork */ int rsvd) /* OK to use reserved data blocks */ { @@ -567,6 +574,15 @@ xfs_bmap_add_extent( logflags = XFS_ILOG_CORE | XFS_ILOG_FEXT(whichfork); } else logflags = 0; + /* DELTA: single new extent */ + if (delta) { + if (delta->xed_startoff > new->br_startoff) + delta->xed_startoff = new->br_startoff; + if (delta->xed_blockcount < + new->br_startoff + new->br_blockcount) + delta->xed_blockcount = new->br_startoff + + new->br_blockcount; + } } /* * Any kind of new delayed allocation goes here. @@ -576,7 +592,7 @@ xfs_bmap_add_extent( ASSERT((cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL) == 0); if ((error = xfs_bmap_add_extent_hole_delay(ip, idx, cur, new, - &logflags, rsvd))) + &logflags, delta, rsvd))) goto done; } /* @@ -587,7 +603,7 @@ xfs_bmap_add_extent( ASSERT((cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL) == 0); if ((error = xfs_bmap_add_extent_hole_real(ip, idx, cur, new, - &logflags, whichfork))) + &logflags, delta, whichfork))) goto done; } else { xfs_bmbt_irec_t prev; /* old extent at offset idx */ @@ -612,17 +628,17 @@ xfs_bmap_add_extent( XFS_BTCUR_BPRV_WASDEL); if ((error = xfs_bmap_add_extent_delay_real(ip, idx, &cur, new, &da_new, first, flist, - &logflags, rsvd))) + &logflags, delta, rsvd))) goto done; } else if (new->br_state == XFS_EXT_NORM) { ASSERT(new->br_state == XFS_EXT_NORM); if ((error = xfs_bmap_add_extent_unwritten_real( - ip, idx, &cur, new, &logflags))) + ip, idx, &cur, new, &logflags, delta))) goto done; } else { ASSERT(new->br_state == XFS_EXT_UNWRITTEN); if ((error = xfs_bmap_add_extent_unwritten_real( - ip, idx, &cur, new, &logflags))) + ip, idx, &cur, new, &logflags, delta))) goto done; } ASSERT(*curp == cur || *curp == NULL); @@ -635,7 +651,7 @@ xfs_bmap_add_extent( ASSERT((cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL) == 0); if ((error = xfs_bmap_add_extent_hole_real(ip, idx, cur, - new, &logflags, whichfork))) + new, &logflags, delta, whichfork))) goto done; } } @@ -700,6 +716,7 @@ xfs_bmap_add_extent_delay_real( xfs_fsblock_t *first, /* pointer to firstblock variable */ xfs_bmap_free_t *flist, /* list of extents to be freed */ int *logflagsp, /* inode logging flags */ + xfs_extdelta_t *delta, /* Change made to incore extents */ int rsvd) /* OK to use reserved data block allocation */ { xfs_btree_cur_t *cur; /* btree cursor */ @@ -716,8 +733,8 @@ xfs_bmap_add_extent_delay_real( /* left is 0, right is 1, prev is 2 */ int rval=0; /* return value (logging flags) */ int state = 0;/* state bits, accessed thru macros */ - xfs_filblks_t temp; /* value for dnew calculations */ - xfs_filblks_t temp2; /* value for dnew calculations */ + xfs_filblks_t temp=0; /* value for dnew calculations */ + xfs_filblks_t temp2=0;/* value for dnew calculations */ int tmp_rval; /* partial logging flags */ enum { /* bit number definitions for state */ LEFT_CONTIG, RIGHT_CONTIG, @@ -839,6 +856,11 @@ xfs_bmap_add_extent_delay_real( goto done; } *dnew = 0; + /* DELTA: Three in-core extents are replaced by one. */ + temp = LEFT.br_startoff; + temp2 = LEFT.br_blockcount + + PREV.br_blockcount + + RIGHT.br_blockcount; break; case MASK3(LEFT_FILLING, RIGHT_FILLING, LEFT_CONTIG): @@ -872,6 +894,10 @@ xfs_bmap_add_extent_delay_real( goto done; } *dnew = 0; + /* DELTA: Two in-core extents are replaced by one. */ + temp = LEFT.br_startoff; + temp2 = LEFT.br_blockcount + + PREV.br_blockcount; break; case MASK3(LEFT_FILLING, RIGHT_FILLING, RIGHT_CONTIG): @@ -906,6 +932,10 @@ xfs_bmap_add_extent_delay_real( goto done; } *dnew = 0; + /* DELTA: Two in-core extents are replaced by one. */ + temp = PREV.br_startoff; + temp2 = PREV.br_blockcount + + RIGHT.br_blockcount; break; case MASK2(LEFT_FILLING, RIGHT_FILLING): @@ -936,6 +966,9 @@ xfs_bmap_add_extent_delay_real( ASSERT(i == 1); } *dnew = 0; + /* DELTA: The in-core extent described by new changed type. */ + temp = new->br_startoff; + temp2 = new->br_blockcount; break; case MASK2(LEFT_FILLING, LEFT_CONTIG): @@ -978,6 +1011,10 @@ xfs_bmap_add_extent_delay_real( xfs_bmap_trace_post_update(fname, "LF|LC", ip, idx, XFS_DATA_FORK); *dnew = temp; + /* DELTA: The boundary between two in-core extents moved. */ + temp = LEFT.br_startoff; + temp2 = LEFT.br_blockcount + + PREV.br_blockcount; break; case MASK(LEFT_FILLING): @@ -1025,6 +1062,9 @@ xfs_bmap_add_extent_delay_real( xfs_bmap_trace_post_update(fname, "LF", ip, idx + 1, XFS_DATA_FORK); *dnew = temp; + /* DELTA: One in-core extent is split in two. */ + temp = PREV.br_startoff; + temp2 = PREV.br_blockcount; break; case MASK2(RIGHT_FILLING, RIGHT_CONTIG): @@ -1067,6 +1107,10 @@ xfs_bmap_add_extent_delay_real( xfs_bmap_trace_post_update(fname, "RF|RC", ip, idx, XFS_DATA_FORK); *dnew = temp; + /* DELTA: The boundary between two in-core extents moved. */ + temp = PREV.br_startoff; + temp2 = PREV.br_blockcount + + RIGHT.br_blockcount; break; case MASK(RIGHT_FILLING): @@ -1112,6 +1156,9 @@ xfs_bmap_add_extent_delay_real( xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp)); xfs_bmap_trace_post_update(fname, "RF", ip, idx, XFS_DATA_FORK); *dnew = temp; + /* DELTA: One in-core extent is split in two. */ + temp = PREV.br_startoff; + temp2 = PREV.br_blockcount; break; case 0: @@ -1194,6 +1241,9 @@ xfs_bmap_add_extent_delay_real( xfs_bmap_trace_post_update(fname, "0", ip, idx + 2, XFS_DATA_FORK); *dnew = temp + temp2; + /* DELTA: One in-core extent is split in three. */ + temp = PREV.br_startoff; + temp2 = PREV.br_blockcount; break; case MASK3(LEFT_FILLING, LEFT_CONTIG, RIGHT_CONTIG): @@ -1209,6 +1259,13 @@ xfs_bmap_add_extent_delay_real( ASSERT(0); } *curp = cur; + if (delta) { + temp2 += temp; + if (delta->xed_startoff > temp) + delta->xed_startoff = temp; + if (delta->xed_blockcount < temp2) + delta->xed_blockcount = temp2; + } done: *logflagsp = rval; return error; @@ -1235,7 +1292,8 @@ xfs_bmap_add_extent_unwritten_real( xfs_extnum_t idx, /* extent number to update/insert */ xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ - int *logflagsp) /* inode logging flags */ + int *logflagsp, /* inode logging flags */ + xfs_extdelta_t *delta) /* Change made to incore extents */ { xfs_btree_cur_t *cur; /* btree cursor */ xfs_bmbt_rec_t *ep; /* extent entry for idx */ @@ -1252,6 +1310,8 @@ xfs_bmap_add_extent_unwritten_real( /* left is 0, right is 1, prev is 2 */ int rval=0; /* return value (logging flags) */ int state = 0;/* state bits, accessed thru macros */ + xfs_filblks_t temp=0; + xfs_filblks_t temp2=0; enum { /* bit number definitions for state */ LEFT_CONTIG, RIGHT_CONTIG, LEFT_FILLING, RIGHT_FILLING, @@ -1380,6 +1440,11 @@ xfs_bmap_add_extent_unwritten_real( RIGHT.br_blockcount, LEFT.br_state))) goto done; } + /* DELTA: Three in-core extents are replaced by one. */ + temp = LEFT.br_startoff; + temp2 = LEFT.br_blockcount + + PREV.br_blockcount + + RIGHT.br_blockcount; break; case MASK3(LEFT_FILLING, RIGHT_FILLING, LEFT_CONTIG): @@ -1419,6 +1484,10 @@ xfs_bmap_add_extent_unwritten_real( LEFT.br_state))) goto done; } + /* DELTA: Two in-core extents are replaced by one. */ + temp = LEFT.br_startoff; + temp2 = LEFT.br_blockcount + + PREV.br_blockcount; break; case MASK3(LEFT_FILLING, RIGHT_FILLING, RIGHT_CONTIG): @@ -1459,6 +1528,10 @@ xfs_bmap_add_extent_unwritten_real( newext))) goto done; } + /* DELTA: Two in-core extents are replaced by one. */ + temp = PREV.br_startoff; + temp2 = PREV.br_blockcount + + RIGHT.br_blockcount; break; case MASK2(LEFT_FILLING, RIGHT_FILLING): @@ -1487,6 +1560,9 @@ xfs_bmap_add_extent_unwritten_real( newext))) goto done; } + /* DELTA: The in-core extent described by new changed type. */ + temp = new->br_startoff; + temp2 = new->br_blockcount; break; case MASK2(LEFT_FILLING, LEFT_CONTIG): @@ -1534,6 +1610,10 @@ xfs_bmap_add_extent_unwritten_real( LEFT.br_state)) goto done; } + /* DELTA: The boundary between two in-core extents moved. */ + temp = LEFT.br_startoff; + temp2 = LEFT.br_blockcount + + PREV.br_blockcount; break; case MASK(LEFT_FILLING): @@ -1574,6 +1654,9 @@ xfs_bmap_add_extent_unwritten_real( goto done; ASSERT(i == 1); } + /* DELTA: One in-core extent is split in two. */ + temp = PREV.br_startoff; + temp2 = PREV.br_blockcount; break; case MASK2(RIGHT_FILLING, RIGHT_CONTIG): @@ -1617,6 +1700,10 @@ xfs_bmap_add_extent_unwritten_real( newext))) goto done; } + /* DELTA: The boundary between two in-core extents moved. */ + temp = PREV.br_startoff; + temp2 = PREV.br_blockcount + + RIGHT.br_blockcount; break; case MASK(RIGHT_FILLING): @@ -1657,6 +1744,9 @@ xfs_bmap_add_extent_unwritten_real( goto done; ASSERT(i == 1); } + /* DELTA: One in-core extent is split in two. */ + temp = PREV.br_startoff; + temp2 = PREV.br_blockcount; break; case 0: @@ -1710,6 +1800,9 @@ xfs_bmap_add_extent_unwritten_real( goto done; ASSERT(i == 1); } + /* DELTA: One in-core extent is split in three. */ + temp = PREV.br_startoff; + temp2 = PREV.br_blockcount; break; case MASK3(LEFT_FILLING, LEFT_CONTIG, RIGHT_CONTIG): @@ -1725,6 +1818,13 @@ xfs_bmap_add_extent_unwritten_real( ASSERT(0); } *curp = cur; + if (delta) { + temp2 += temp; + if (delta->xed_startoff > temp) + delta->xed_startoff = temp; + if (delta->xed_blockcount < temp2) + delta->xed_blockcount = temp2; + } done: *logflagsp = rval; return error; @@ -1753,6 +1853,7 @@ xfs_bmap_add_extent_hole_delay( xfs_btree_cur_t *cur, /* if null, not a btree */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ int *logflagsp, /* inode logging flags */ + xfs_extdelta_t *delta, /* Change made to incore extents */ int rsvd) /* OK to allocate reserved blocks */ { xfs_bmbt_rec_t *ep; /* extent record for idx */ @@ -1765,7 +1866,8 @@ xfs_bmap_add_extent_hole_delay( xfs_filblks_t oldlen=0; /* old indirect size */ xfs_bmbt_irec_t right; /* right neighbor extent entry */ int state; /* state bits, accessed thru macros */ - xfs_filblks_t temp; /* temp for indirect calculations */ + xfs_filblks_t temp=0; /* temp for indirect calculations */ + xfs_filblks_t temp2=0; enum { /* bit number definitions for state */ LEFT_CONTIG, RIGHT_CONTIG, LEFT_DELAY, RIGHT_DELAY, @@ -1844,6 +1946,9 @@ xfs_bmap_add_extent_hole_delay( XFS_DATA_FORK); xfs_iext_remove(ifp, idx, 1); ip->i_df.if_lastex = idx - 1; + /* DELTA: Two in-core extents were replaced by one. */ + temp2 = temp; + temp = left.br_startoff; break; case MASK(LEFT_CONTIG): @@ -1864,6 +1969,9 @@ xfs_bmap_add_extent_hole_delay( xfs_bmap_trace_post_update(fname, "LC", ip, idx - 1, XFS_DATA_FORK); ip->i_df.if_lastex = idx - 1; + /* DELTA: One in-core extent grew into a hole. */ + temp2 = temp; + temp = left.br_startoff; break; case MASK(RIGHT_CONTIG): @@ -1881,6 +1989,9 @@ xfs_bmap_add_extent_hole_delay( NULLSTARTBLOCK((int)newlen), temp, right.br_state); xfs_bmap_trace_post_update(fname, "RC", ip, idx, XFS_DATA_FORK); ip->i_df.if_lastex = idx; + /* DELTA: One in-core extent grew into a hole. */ + temp2 = temp; + temp = new->br_startoff; break; case 0: @@ -1894,6 +2005,9 @@ xfs_bmap_add_extent_hole_delay( XFS_DATA_FORK); xfs_iext_insert(ifp, idx, 1, new); ip->i_df.if_lastex = idx; + /* DELTA: A new in-core extent was added in a hole. */ + temp2 = new->br_blockcount; + temp = new->br_startoff; break; } if (oldlen != newlen) { @@ -1904,6 +2018,13 @@ xfs_bmap_add_extent_hole_delay( * Nothing to do for disk quota accounting here. */ } + if (delta) { + temp2 += temp; + if (delta->xed_startoff > temp) + delta->xed_startoff = temp; + if (delta->xed_blockcount < temp2) + delta->xed_blockcount = temp2; + } *logflagsp = 0; return 0; #undef MASK @@ -1925,6 +2046,7 @@ xfs_bmap_add_extent_hole_real( xfs_btree_cur_t *cur, /* if null, not a btree */ xfs_bmbt_irec_t *new, /* new data to add to file extents */ int *logflagsp, /* inode logging flags */ + xfs_extdelta_t *delta, /* Change made to incore extents */ int whichfork) /* data or attr fork */ { xfs_bmbt_rec_t *ep; /* pointer to extent entry ins. point */ @@ -1936,7 +2058,10 @@ xfs_bmap_add_extent_hole_real( xfs_ifork_t *ifp; /* inode fork pointer */ xfs_bmbt_irec_t left; /* left neighbor extent entry */ xfs_bmbt_irec_t right; /* right neighbor extent entry */ + int rval=0; /* return value (logging flags) */ int state; /* state bits, accessed thru macros */ + xfs_filblks_t temp=0; + xfs_filblks_t temp2=0; enum { /* bit number definitions for state */ LEFT_CONTIG, RIGHT_CONTIG, LEFT_DELAY, RIGHT_DELAY, @@ -1993,6 +2118,7 @@ xfs_bmap_add_extent_hole_real( left.br_blockcount + new->br_blockcount + right.br_blockcount <= MAXEXTLEN)); + error = 0; /* * Select which case we're in here, and implement it. */ @@ -2018,25 +2144,35 @@ xfs_bmap_add_extent_hole_real( XFS_IFORK_NEXT_SET(ip, whichfork, XFS_IFORK_NEXTENTS(ip, whichfork) - 1); if (cur == NULL) { - *logflagsp = XFS_ILOG_CORE | XFS_ILOG_FEXT(whichfork); - return 0; + rval = XFS_ILOG_CORE | XFS_ILOG_FEXT(whichfork); + } else { + rval = XFS_ILOG_CORE; + if ((error = xfs_bmbt_lookup_eq(cur, + right.br_startoff, + right.br_startblock, + right.br_blockcount, &i))) + goto done; + ASSERT(i == 1); + if ((error = xfs_bmbt_delete(cur, &i))) + goto done; + ASSERT(i == 1); + if ((error = xfs_bmbt_decrement(cur, 0, &i))) + goto done; + ASSERT(i == 1); + if ((error = xfs_bmbt_update(cur, left.br_startoff, + left.br_startblock, + left.br_blockcount + + new->br_blockcount + + right.br_blockcount, + left.br_state))) + goto done; } - *logflagsp = XFS_ILOG_CORE; - if ((error = xfs_bmbt_lookup_eq(cur, right.br_startoff, - right.br_startblock, right.br_blockcount, &i))) - return error; - ASSERT(i == 1); - if ((error = xfs_bmbt_delete(cur, &i))) - return error; - ASSERT(i == 1); - if ((error = xfs_bmbt_decrement(cur, 0, &i))) - return error; - ASSERT(i == 1); - error = xfs_bmbt_update(cur, left.br_startoff, - left.br_startblock, - left.br_blockcount + new->br_blockcount + - right.br_blockcount, left.br_state); - return error; + /* DELTA: Two in-core extents were replaced by one. */ + temp = left.br_startoff; + temp2 = left.br_blockcount + + new->br_blockcount + + right.br_blockcount; + break; case MASK(LEFT_CONTIG): /* @@ -2050,19 +2186,27 @@ xfs_bmap_add_extent_hole_real( xfs_bmap_trace_post_update(fname, "LC", ip, idx - 1, whichfork); ifp->if_lastex = idx - 1; if (cur == NULL) { - *logflagsp = XFS_ILOG_FEXT(whichfork); - return 0; + rval = XFS_ILOG_FEXT(whichfork); + } else { + rval = 0; + if ((error = xfs_bmbt_lookup_eq(cur, + left.br_startoff, + left.br_startblock, + left.br_blockcount, &i))) + goto done; + ASSERT(i == 1); + if ((error = xfs_bmbt_update(cur, left.br_startoff, + left.br_startblock, + left.br_blockcount + + new->br_blockcount, + left.br_state))) + goto done; } - *logflagsp = 0; - if ((error = xfs_bmbt_lookup_eq(cur, left.br_startoff, - left.br_startblock, left.br_blockcount, &i))) - return error; - ASSERT(i == 1); - error = xfs_bmbt_update(cur, left.br_startoff, - left.br_startblock, - left.br_blockcount + new->br_blockcount, - left.br_state); - return error; + /* DELTA: One in-core extent grew. */ + temp = left.br_startoff; + temp2 = left.br_blockcount + + new->br_blockcount; + break; case MASK(RIGHT_CONTIG): /* @@ -2077,19 +2221,27 @@ xfs_bmap_add_extent_hole_real( xfs_bmap_trace_post_update(fname, "RC", ip, idx, whichfork); ifp->if_lastex = idx; if (cur == NULL) { - *logflagsp = XFS_ILOG_FEXT(whichfork); - return 0; + rval = XFS_ILOG_FEXT(whichfork); + } else { + rval = 0; + if ((error = xfs_bmbt_lookup_eq(cur, + right.br_startoff, + right.br_startblock, + right.br_blockcount, &i))) + goto done; + ASSERT(i == 1); + if ((error = xfs_bmbt_update(cur, new->br_startoff, + new->br_startblock, + new->br_blockcount + + right.br_blockcount, + right.br_state))) + goto done; } - *logflagsp = 0; - if ((error = xfs_bmbt_lookup_eq(cur, right.br_startoff, - right.br_startblock, right.br_blockcount, &i))) - return error; - ASSERT(i == 1); - error = xfs_bmbt_update(cur, new->br_startoff, - new->br_startblock, - new->br_blockcount + right.br_blockcount, - right.br_state); - return error; + /* DELTA: One in-core extent grew. */ + temp = new->br_startoff; + temp2 = new->br_blockcount + + right.br_blockcount; + break; case 0: /* @@ -2104,29 +2256,41 @@ xfs_bmap_add_extent_hole_real( XFS_IFORK_NEXT_SET(ip, whichfork, XFS_IFORK_NEXTENTS(ip, whichfork) + 1); if (cur == NULL) { - *logflagsp = XFS_ILOG_CORE | XFS_ILOG_FEXT(whichfork); - return 0; + rval = XFS_ILOG_CORE | XFS_ILOG_FEXT(whichfork); + } else { + rval = XFS_ILOG_CORE; + if ((error = xfs_bmbt_lookup_eq(cur, + new->br_startoff, + new->br_startblock, + new->br_blockcount, &i))) + goto done; + ASSERT(i == 0); + cur->bc_rec.b.br_state = new->br_state; + if ((error = xfs_bmbt_insert(cur, &i))) + goto done; + ASSERT(i == 1); } - *logflagsp = XFS_ILOG_CORE; - if ((error = xfs_bmbt_lookup_eq(cur, new->br_startoff, - new->br_startblock, new->br_blockcount, &i))) - return error; - ASSERT(i == 0); - cur->bc_rec.b.br_state = new->br_state; - if ((error = xfs_bmbt_insert(cur, &i))) - return error; - ASSERT(i == 1); - return 0; + /* DELTA: A new extent was added in a hole. */ + temp = new->br_startoff; + temp2 = new->br_blockcount; + break; + } + if (delta) { + temp2 += temp; + if (delta->xed_startoff > temp) + delta->xed_startoff = temp; + if (delta->xed_blockcount < temp2) + delta->xed_blockcount = temp2; } +done: + *logflagsp = rval; + return error; #undef MASK #undef MASK2 #undef STATE_SET #undef STATE_TEST #undef STATE_SET_TEST #undef SWITCH_STATE - /* NOTREACHED */ - ASSERT(0); - return 0; /* keep gcc quite */ } /* @@ -2598,6 +2762,7 @@ xfs_bmap_btalloc( args.mp = mp; args.fsbno = ap->rval; args.maxlen = MIN(ap->alen, mp->m_sb.sb_agblocks); + args.firstblock = ap->firstblock; blen = 0; if (nullfb) { args.type = XFS_ALLOCTYPE_START_BNO; @@ -2657,7 +2822,7 @@ xfs_bmap_btalloc( else args.minlen = ap->alen; } else if (ap->low) { - args.type = XFS_ALLOCTYPE_FIRST_AG; + args.type = XFS_ALLOCTYPE_START_BNO; args.total = args.minlen = ap->minlen; } else { args.type = XFS_ALLOCTYPE_NEAR_BNO; @@ -2669,7 +2834,7 @@ xfs_bmap_btalloc( args.prod = ap->ip->i_d.di_extsize; if ((args.mod = (xfs_extlen_t)do_mod(ap->off, args.prod))) args.mod = (xfs_extlen_t)(args.prod - args.mod); - } else if (unlikely(mp->m_sb.sb_blocksize >= NBPP)) { + } else if (mp->m_sb.sb_blocksize >= NBPP) { args.prod = 1; args.mod = 0; } else { @@ -2885,6 +3050,7 @@ xfs_bmap_del_extent( xfs_btree_cur_t *cur, /* if null, not a btree */ xfs_bmbt_irec_t *del, /* data to remove from extents */ int *logflagsp, /* inode logging flags */ + xfs_extdelta_t *delta, /* Change made to incore extents */ int whichfork, /* data or attr fork */ int rsvd) /* OK to allocate reserved blocks */ { @@ -3193,6 +3359,14 @@ xfs_bmap_del_extent( if (da_old > da_new) xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, (int)(da_old - da_new), rsvd); + if (delta) { + /* DELTA: report the original extent. */ + if (delta->xed_startoff > got.br_startoff) + delta->xed_startoff = got.br_startoff; + if (delta->xed_blockcount < got.br_startoff+got.br_blockcount) + delta->xed_blockcount = got.br_startoff + + got.br_blockcount; + } done: *logflagsp = flags; return error; @@ -3279,6 +3453,7 @@ xfs_bmap_extents_to_btree( XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_BTREE); args.tp = tp; args.mp = mp; + args.firstblock = *firstblock; if (*firstblock == NULLFSBLOCK) { args.type = XFS_ALLOCTYPE_START_BNO; args.fsbno = XFS_INO_TO_FSB(mp, ip->i_ino); @@ -3414,6 +3589,7 @@ xfs_bmap_local_to_extents( args.tp = tp; args.mp = ip->i_mount; + args.firstblock = *firstblock; ASSERT((ifp->if_flags & (XFS_IFINLINE|XFS_IFEXTENTS|XFS_IFEXTIREC)) == XFS_IFINLINE); /* @@ -3753,7 +3929,7 @@ xfs_bunmap_trace( if (ip->i_rwtrace == NULL) return; ktrace_enter(ip->i_rwtrace, - (void *)(__psint_t)XFS_BUNMAPI, + (void *)(__psint_t)XFS_BUNMAP, (void *)ip, (void *)(__psint_t)((ip->i_d.di_size >> 32) & 0xffffffff), (void *)(__psint_t)(ip->i_d.di_size & 0xffffffff), @@ -4087,8 +4263,8 @@ xfs_bmap_finish( if (!XFS_FORCED_SHUTDOWN(mp)) xfs_force_shutdown(mp, (error == EFSCORRUPTED) ? - XFS_CORRUPT_INCORE : - XFS_METADATA_IO_ERROR); + SHUTDOWN_CORRUPT_INCORE : + SHUTDOWN_META_IO_ERROR); return error; } xfs_trans_log_efd_extent(ntp, efd, free->xbfi_startblock, @@ -4538,7 +4714,8 @@ xfs_bmapi( xfs_extlen_t total, /* total blocks needed */ xfs_bmbt_irec_t *mval, /* output: map values */ int *nmap, /* i/o: mval size/count */ - xfs_bmap_free_t *flist) /* i/o: list extents to free */ + xfs_bmap_free_t *flist, /* i/o: list extents to free */ + xfs_extdelta_t *delta) /* o: change made to incore extents */ { xfs_fsblock_t abno; /* allocated block number */ xfs_extlen_t alen; /* allocated extent length */ @@ -4650,6 +4827,10 @@ xfs_bmapi( end = bno + len; obno = bno; bma.ip = NULL; + if (delta) { + delta->xed_startoff = NULLFILEOFF; + delta->xed_blockcount = 0; + } while (bno < end && n < *nmap) { /* * Reading past eof, act as though there's a hole @@ -4812,7 +4993,7 @@ xfs_bmapi( bma.firstblock = *firstblock; bma.alen = alen; bma.off = aoff; - bma.conv = (flags & XFS_BMAPI_CONVERT); + bma.conv = !!(flags & XFS_BMAPI_CONVERT); bma.wasdel = wasdelay; bma.minlen = minlen; bma.low = flist->xbf_low; @@ -4886,8 +5067,8 @@ xfs_bmapi( got.br_state = XFS_EXT_UNWRITTEN; } error = xfs_bmap_add_extent(ip, lastx, &cur, &got, - firstblock, flist, &tmp_logflags, whichfork, - (flags & XFS_BMAPI_RSVBLOCKS)); + firstblock, flist, &tmp_logflags, delta, + whichfork, (flags & XFS_BMAPI_RSVBLOCKS)); logflags |= tmp_logflags; if (error) goto error0; @@ -4983,8 +5164,8 @@ xfs_bmapi( } mval->br_state = XFS_EXT_NORM; error = xfs_bmap_add_extent(ip, lastx, &cur, mval, - firstblock, flist, &tmp_logflags, whichfork, - (flags & XFS_BMAPI_RSVBLOCKS)); + firstblock, flist, &tmp_logflags, delta, + whichfork, (flags & XFS_BMAPI_RSVBLOCKS)); logflags |= tmp_logflags; if (error) goto error0; @@ -5073,7 +5254,14 @@ xfs_bmapi( ASSERT(XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE || XFS_IFORK_NEXTENTS(ip, whichfork) > ifp->if_ext_max); error = 0; - + if (delta && delta->xed_startoff != NULLFILEOFF) { + /* A change was actually made. + * Note that delta->xed_blockount is an offset at this + * point and needs to be converted to a block count. + */ + ASSERT(delta->xed_blockcount > delta->xed_startoff); + delta->xed_blockcount -= delta->xed_startoff; + } error0: /* * Log everything. Do this after conversion, there's no point in @@ -5185,6 +5373,8 @@ xfs_bunmapi( xfs_fsblock_t *firstblock, /* first allocated block controls a.g. for allocs */ xfs_bmap_free_t *flist, /* i/o: list extents to free */ + xfs_extdelta_t *delta, /* o: change made to incore + extents */ int *done) /* set if not done yet */ { xfs_btree_cur_t *cur; /* bmap btree cursor */ @@ -5242,6 +5432,10 @@ xfs_bunmapi( bno = start + len - 1; ep = xfs_bmap_search_extents(ip, bno, whichfork, &eof, &lastx, &got, &prev); + if (delta) { + delta->xed_startoff = NULLFILEOFF; + delta->xed_blockcount = 0; + } /* * Check to see if the given block number is past the end of the * file, back up to the last block if so... @@ -5340,7 +5534,8 @@ xfs_bunmapi( } del.br_state = XFS_EXT_UNWRITTEN; error = xfs_bmap_add_extent(ip, lastx, &cur, &del, - firstblock, flist, &logflags, XFS_DATA_FORK, 0); + firstblock, flist, &logflags, delta, + XFS_DATA_FORK, 0); if (error) goto error0; goto nodelete; @@ -5394,7 +5589,7 @@ xfs_bunmapi( prev.br_state = XFS_EXT_UNWRITTEN; error = xfs_bmap_add_extent(ip, lastx - 1, &cur, &prev, firstblock, flist, &logflags, - XFS_DATA_FORK, 0); + delta, XFS_DATA_FORK, 0); if (error) goto error0; goto nodelete; @@ -5403,7 +5598,7 @@ xfs_bunmapi( del.br_state = XFS_EXT_UNWRITTEN; error = xfs_bmap_add_extent(ip, lastx, &cur, &del, firstblock, flist, &logflags, - XFS_DATA_FORK, 0); + delta, XFS_DATA_FORK, 0); if (error) goto error0; goto nodelete; @@ -5456,7 +5651,7 @@ xfs_bunmapi( goto error0; } error = xfs_bmap_del_extent(ip, tp, lastx, flist, cur, &del, - &tmp_logflags, whichfork, rsvd); + &tmp_logflags, delta, whichfork, rsvd); logflags |= tmp_logflags; if (error) goto error0; @@ -5513,6 +5708,14 @@ nodelete: ASSERT(ifp->if_ext_max == XFS_IFORK_SIZE(ip, whichfork) / (uint)sizeof(xfs_bmbt_rec_t)); error = 0; + if (delta && delta->xed_startoff != NULLFILEOFF) { + /* A change was actually made. + * Note that delta->xed_blockount is an offset at this + * point and needs to be converted to a block count. + */ + ASSERT(delta->xed_blockcount > delta->xed_startoff); + delta->xed_blockcount -= delta->xed_startoff; + } error0: /* * Log everything. Do this after conversion, there's no point in @@ -5556,7 +5759,7 @@ xfs_getbmap( __int64_t fixlen; /* length for -1 case */ int i; /* extent number */ xfs_inode_t *ip; /* xfs incore inode pointer */ - vnode_t *vp; /* corresponding vnode */ + bhv_vnode_t *vp; /* corresponding vnode */ int lock; /* lock state */ xfs_bmbt_irec_t *map; /* buffer for user's data */ xfs_mount_t *mp; /* file system mount point */ @@ -5653,7 +5856,7 @@ xfs_getbmap( if (whichfork == XFS_DATA_FORK && ip->i_delayed_blks) { /* xfs_fsize_t last_byte = xfs_file_last_byte(ip); */ - VOP_FLUSH_PAGES(vp, (xfs_off_t)0, -1, 0, FI_REMAPF, error); + error = bhv_vop_flush_pages(vp, (xfs_off_t)0, -1, 0, FI_REMAPF); } ASSERT(whichfork == XFS_ATTR_FORK || ip->i_delayed_blks == 0); @@ -5689,7 +5892,8 @@ xfs_getbmap( nmap = (nexleft > subnex) ? subnex : nexleft; error = xfs_bmapi(NULL, ip, XFS_BB_TO_FSBT(mp, bmv->bmv_offset), XFS_BB_TO_FSB(mp, bmv->bmv_length), - bmapi_flags, NULL, 0, map, &nmap, NULL); + bmapi_flags, NULL, 0, map, &nmap, + NULL, NULL); if (error) goto unlock_and_return; ASSERT(nmap <= subnex); diff --git a/fs/xfs/xfs_bmap.h b/fs/xfs/xfs_bmap.h index 8e0d73d9c..80e93409b 100644 --- a/fs/xfs/xfs_bmap.h +++ b/fs/xfs/xfs_bmap.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2006 Silicon Graphics, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,6 +25,20 @@ struct xfs_inode; struct xfs_mount; struct xfs_trans; +/* + * DELTA: describe a change to the in-core extent list. + * + * Internally the use of xed_blockount is somewhat funky. + * xed_blockcount contains an offset much of the time because this + * makes merging changes easier. (xfs_fileoff_t and xfs_filblks_t are + * the same underlying type). + */ +typedef struct xfs_extdelta +{ + xfs_fileoff_t xed_startoff; /* offset of range */ + xfs_filblks_t xed_blockcount; /* blocks in range */ +} xfs_extdelta_t; + /* * List of extents to be free "later". * The list is kept sorted on xbf_startblock. @@ -275,7 +289,9 @@ xfs_bmapi( xfs_extlen_t total, /* total blocks needed */ struct xfs_bmbt_irec *mval, /* output: map values */ int *nmap, /* i/o: mval size/count */ - xfs_bmap_free_t *flist); /* i/o: list extents to free */ + xfs_bmap_free_t *flist, /* i/o: list extents to free */ + xfs_extdelta_t *delta); /* o: change made to incore + extents */ /* * Map file blocks to filesystem blocks, simple version. @@ -309,6 +325,8 @@ xfs_bunmapi( xfs_fsblock_t *firstblock, /* first allocated block controls a.g. for allocs */ xfs_bmap_free_t *flist, /* i/o: list extents to free */ + xfs_extdelta_t *delta, /* o: change made to incore + extents */ int *done); /* set if not done yet */ /* diff --git a/fs/xfs/xfs_bmap_btree.c b/fs/xfs/xfs_bmap_btree.c index bea44709a..18fb7385d 100644 --- a/fs/xfs/xfs_bmap_btree.c +++ b/fs/xfs/xfs_bmap_btree.c @@ -24,14 +24,12 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -1569,12 +1567,11 @@ xfs_bmbt_split( lbno = XFS_DADDR_TO_FSB(args.mp, XFS_BUF_ADDR(lbp)); left = XFS_BUF_TO_BMBT_BLOCK(lbp); args.fsbno = cur->bc_private.b.firstblock; + args.firstblock = args.fsbno; if (args.fsbno == NULLFSBLOCK) { args.fsbno = lbno; args.type = XFS_ALLOCTYPE_START_BNO; - } else if (cur->bc_private.b.flist->xbf_low) - args.type = XFS_ALLOCTYPE_FIRST_AG; - else + } else args.type = XFS_ALLOCTYPE_NEAR_BNO; args.mod = args.minleft = args.alignment = args.total = args.isfl = args.userdata = args.minalignslop = 0; @@ -2356,6 +2353,7 @@ xfs_bmbt_newroot( args.userdata = args.minalignslop = 0; args.minlen = args.maxlen = args.prod = 1; args.wasdel = cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL; + args.firstblock = args.fsbno; if (args.fsbno == NULLFSBLOCK) { #ifdef DEBUG if ((error = xfs_btree_check_lptr(cur, INT_GET(*pp, ARCH_CONVERT), level))) { @@ -2365,9 +2363,7 @@ xfs_bmbt_newroot( #endif args.fsbno = INT_GET(*pp, ARCH_CONVERT); args.type = XFS_ALLOCTYPE_START_BNO; - } else if (args.wasdel) - args.type = XFS_ALLOCTYPE_FIRST_AG; - else + } else args.type = XFS_ALLOCTYPE_NEAR_BNO; if ((error = xfs_alloc_vextent(&args))) { XFS_BMBT_TRACE_CURSOR(cur, ERROR); diff --git a/fs/xfs/xfs_btree.c b/fs/xfs/xfs_btree.c index 52d5d095f..ee2255bd6 100644 --- a/fs/xfs/xfs_btree.c +++ b/fs/xfs/xfs_btree.c @@ -24,14 +24,12 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 5fed15682..a4aa53974 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -23,7 +23,6 @@ #include "xfs_inum.h" #include "xfs_trans.h" #include "xfs_sb.h" -#include "xfs_dir.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_buf_item.h" @@ -1030,9 +1029,9 @@ xfs_buf_iodone_callbacks( if ((XFS_BUF_TARGET(bp) != lasttarg) || (time_after(jiffies, (lasttime + 5*HZ)))) { lasttime = jiffies; - prdev("XFS write error in file system meta-data " - "block 0x%llx in %s", - XFS_BUF_TARGET(bp), + cmn_err(CE_ALERT, "Device %s, XFS metadata write error" + " block 0x%llx in %s", + XFS_BUFTARG_NAME(XFS_BUF_TARGET(bp)), (__uint64_t)XFS_BUF_ADDR(bp), mp->m_fsname); } lasttarg = XFS_BUF_TARGET(bp); @@ -1108,7 +1107,7 @@ xfs_buf_error_relse( XFS_BUF_ERROR(bp,0); xfs_buftrace("BUF_ERROR_RELSE", bp); if (! XFS_FORCED_SHUTDOWN(mp)) - xfs_force_shutdown(mp, XFS_METADATA_IO_ERROR); + xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); /* * We have to unpin the pinned buffers so do the * callbacks. diff --git a/fs/xfs/xfs_cap.h b/fs/xfs/xfs_cap.h index d0035c6e9..7a0e482dd 100644 --- a/fs/xfs/xfs_cap.h +++ b/fs/xfs/xfs_cap.h @@ -49,12 +49,12 @@ typedef struct xfs_cap_set { #include -struct vnode; +struct bhv_vnode; -extern int xfs_cap_vhascap(struct vnode *); -extern int xfs_cap_vset(struct vnode *, void *, size_t); -extern int xfs_cap_vget(struct vnode *, void *, size_t); -extern int xfs_cap_vremove(struct vnode *vp); +extern int xfs_cap_vhascap(struct bhv_vnode *); +extern int xfs_cap_vset(struct bhv_vnode *, void *, size_t); +extern int xfs_cap_vget(struct bhv_vnode *, void *, size_t); +extern int xfs_cap_vremove(struct bhv_vnode *); #define _CAP_EXISTS xfs_cap_vhascap diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 8988b9051..32ab61d17 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -24,7 +24,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" @@ -32,7 +31,6 @@ #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -43,7 +41,6 @@ #include "xfs_bmap.h" #include "xfs_attr.h" #include "xfs_attr_leaf.h" -#include "xfs_dir_leaf.h" #include "xfs_dir2_data.h" #include "xfs_dir2_leaf.h" #include "xfs_dir2_block.h" @@ -159,7 +156,7 @@ xfs_da_split(xfs_da_state_t *state) max = state->path.active - 1; ASSERT((max >= 0) && (max < XFS_DA_NODE_MAXDEPTH)); ASSERT(state->path.blk[max].magic == XFS_ATTR_LEAF_MAGIC || - state->path.blk[max].magic == XFS_DIRX_LEAF_MAGIC(state->mp)); + state->path.blk[max].magic == XFS_DIR2_LEAFN_MAGIC); addblk = &state->path.blk[max]; /* initial dummy value */ for (i = max; (i >= 0) && addblk; state->path.active--, i--) { @@ -199,38 +196,7 @@ xfs_da_split(xfs_da_state_t *state) return(error); /* GROT: attr inconsistent */ addblk = newblk; break; - case XFS_DIR_LEAF_MAGIC: - ASSERT(XFS_DIR_IS_V1(state->mp)); - error = xfs_dir_leaf_split(state, oldblk, newblk); - if ((error != 0) && (error != ENOSPC)) { - return(error); /* GROT: dir is inconsistent */ - } - if (!error) { - addblk = newblk; - break; - } - /* - * Entry wouldn't fit, split the leaf again. - */ - state->extravalid = 1; - if (state->inleaf) { - state->extraafter = 0; /* before newblk */ - error = xfs_dir_leaf_split(state, oldblk, - &state->extrablk); - if (error) - return(error); /* GROT: dir incon. */ - addblk = newblk; - } else { - state->extraafter = 1; /* after newblk */ - error = xfs_dir_leaf_split(state, newblk, - &state->extrablk); - if (error) - return(error); /* GROT: dir incon. */ - addblk = newblk; - } - break; case XFS_DIR2_LEAFN_MAGIC: - ASSERT(XFS_DIR_IS_V2(state->mp)); error = xfs_dir2_leafn_split(state, oldblk, newblk); if (error) return error; @@ -363,7 +329,6 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, size = (int)((char *)&oldroot->btree[be16_to_cpu(oldroot->hdr.count)] - (char *)oldroot); } else { - ASSERT(XFS_DIR_IS_V2(mp)); ASSERT(be16_to_cpu(oldroot->hdr.info.magic) == XFS_DIR2_LEAFN_MAGIC); leaf = (xfs_dir2_leaf_t *)oldroot; size = (int)((char *)&leaf->ents[be16_to_cpu(leaf->hdr.count)] - @@ -379,8 +344,7 @@ xfs_da_root_split(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, * Set up the new root node. */ error = xfs_da_node_create(args, - args->whichfork == XFS_DATA_FORK && - XFS_DIR_IS_V2(mp) ? mp->m_dirleafblk : 0, + (args->whichfork == XFS_DATA_FORK) ? mp->m_dirleafblk : 0, be16_to_cpu(node->hdr.level) + 1, &bp, args->whichfork); if (error) return(error); @@ -427,10 +391,9 @@ xfs_da_node_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, ASSERT(be16_to_cpu(node->hdr.info.magic) == XFS_DA_NODE_MAGIC); /* - * With V2 the extra block is data or freespace. + * With V2 dirs the extra block is data or freespace. */ - useextra = state->extravalid && (XFS_DIR_IS_V1(state->mp) || - state->args->whichfork == XFS_ATTR_FORK); + useextra = state->extravalid && state->args->whichfork == XFS_ATTR_FORK; newcount = 1 + useextra; /* * Do we have to split the node? @@ -624,7 +587,7 @@ xfs_da_node_add(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, ASSERT(be16_to_cpu(node->hdr.info.magic) == XFS_DA_NODE_MAGIC); ASSERT((oldblk->index >= 0) && (oldblk->index <= be16_to_cpu(node->hdr.count))); ASSERT(newblk->blkno != 0); - if (state->args->whichfork == XFS_DATA_FORK && XFS_DIR_IS_V2(mp)) + if (state->args->whichfork == XFS_DATA_FORK) ASSERT(newblk->blkno >= mp->m_dirleafblk && newblk->blkno < mp->m_dirfreeblk); @@ -670,7 +633,7 @@ xfs_da_join(xfs_da_state_t *state) save_blk = &state->altpath.blk[ state->path.active-1 ]; ASSERT(state->path.blk[0].magic == XFS_DA_NODE_MAGIC); ASSERT(drop_blk->magic == XFS_ATTR_LEAF_MAGIC || - drop_blk->magic == XFS_DIRX_LEAF_MAGIC(state->mp)); + drop_blk->magic == XFS_DIR2_LEAFN_MAGIC); /* * Walk back up the tree joining/deallocating as necessary. @@ -693,17 +656,7 @@ xfs_da_join(xfs_da_state_t *state) return(0); xfs_attr_leaf_unbalance(state, drop_blk, save_blk); break; - case XFS_DIR_LEAF_MAGIC: - ASSERT(XFS_DIR_IS_V1(state->mp)); - error = xfs_dir_leaf_toosmall(state, &action); - if (error) - return(error); - if (action == 0) - return(0); - xfs_dir_leaf_unbalance(state, drop_blk, save_blk); - break; case XFS_DIR2_LEAFN_MAGIC: - ASSERT(XFS_DIR_IS_V2(state->mp)); error = xfs_dir2_leafn_toosmall(state, &action); if (error) return error; @@ -790,7 +743,7 @@ xfs_da_root_join(xfs_da_state_t *state, xfs_da_state_blk_t *root_blk) ASSERT(bp != NULL); blkinfo = bp->data; if (be16_to_cpu(oldroot->hdr.level) == 1) { - ASSERT(be16_to_cpu(blkinfo->magic) == XFS_DIRX_LEAF_MAGIC(state->mp) || + ASSERT(be16_to_cpu(blkinfo->magic) == XFS_DIR2_LEAFN_MAGIC || be16_to_cpu(blkinfo->magic) == XFS_ATTR_LEAF_MAGIC); } else { ASSERT(be16_to_cpu(blkinfo->magic) == XFS_DA_NODE_MAGIC); @@ -951,14 +904,7 @@ xfs_da_fixhashpath(xfs_da_state_t *state, xfs_da_state_path_t *path) if (count == 0) return; break; - case XFS_DIR_LEAF_MAGIC: - ASSERT(XFS_DIR_IS_V1(state->mp)); - lasthash = xfs_dir_leaf_lasthash(blk->bp, &count); - if (count == 0) - return; - break; case XFS_DIR2_LEAFN_MAGIC: - ASSERT(XFS_DIR_IS_V2(state->mp)); lasthash = xfs_dir2_leafn_lasthash(blk->bp, &count); if (count == 0) return; @@ -1117,10 +1063,7 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result) * Descend thru the B-tree searching each level for the right * node to use, until the right hashval is found. */ - if (args->whichfork == XFS_DATA_FORK && XFS_DIR_IS_V2(state->mp)) - blkno = state->mp->m_dirleafblk; - else - blkno = 0; + blkno = (args->whichfork == XFS_DATA_FORK)? state->mp->m_dirleafblk : 0; for (blk = &state->path.blk[0], state->path.active = 1; state->path.active <= XFS_DA_NODE_MAXDEPTH; blk++, state->path.active++) { @@ -1137,7 +1080,7 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result) } curr = blk->bp->data; ASSERT(be16_to_cpu(curr->magic) == XFS_DA_NODE_MAGIC || - be16_to_cpu(curr->magic) == XFS_DIRX_LEAF_MAGIC(state->mp) || + be16_to_cpu(curr->magic) == XFS_DIR2_LEAFN_MAGIC || be16_to_cpu(curr->magic) == XFS_ATTR_LEAF_MAGIC); /* @@ -1190,16 +1133,10 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result) blk->index = probe; blkno = be32_to_cpu(btree->before); } - } - else if (be16_to_cpu(curr->magic) == XFS_ATTR_LEAF_MAGIC) { + } else if (be16_to_cpu(curr->magic) == XFS_ATTR_LEAF_MAGIC) { blk->hashval = xfs_attr_leaf_lasthash(blk->bp, NULL); break; - } - else if (be16_to_cpu(curr->magic) == XFS_DIR_LEAF_MAGIC) { - blk->hashval = xfs_dir_leaf_lasthash(blk->bp, NULL); - break; - } - else if (be16_to_cpu(curr->magic) == XFS_DIR2_LEAFN_MAGIC) { + } else if (be16_to_cpu(curr->magic) == XFS_DIR2_LEAFN_MAGIC) { blk->hashval = xfs_dir2_leafn_lasthash(blk->bp, NULL); break; } @@ -1212,12 +1149,7 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result) * next leaf and keep searching. */ for (;;) { - if (blk->magic == XFS_DIR_LEAF_MAGIC) { - ASSERT(XFS_DIR_IS_V1(state->mp)); - retval = xfs_dir_leaf_lookup_int(blk->bp, args, - &blk->index); - } else if (blk->magic == XFS_DIR2_LEAFN_MAGIC) { - ASSERT(XFS_DIR_IS_V2(state->mp)); + if (blk->magic == XFS_DIR2_LEAFN_MAGIC) { retval = xfs_dir2_leafn_lookup_int(blk->bp, args, &blk->index, state); } @@ -1270,7 +1202,7 @@ xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, old_info = old_blk->bp->data; new_info = new_blk->bp->data; ASSERT(old_blk->magic == XFS_DA_NODE_MAGIC || - old_blk->magic == XFS_DIRX_LEAF_MAGIC(state->mp) || + old_blk->magic == XFS_DIR2_LEAFN_MAGIC || old_blk->magic == XFS_ATTR_LEAF_MAGIC); ASSERT(old_blk->magic == be16_to_cpu(old_info->magic)); ASSERT(new_blk->magic == be16_to_cpu(new_info->magic)); @@ -1280,12 +1212,7 @@ xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, case XFS_ATTR_LEAF_MAGIC: before = xfs_attr_leaf_order(old_blk->bp, new_blk->bp); break; - case XFS_DIR_LEAF_MAGIC: - ASSERT(XFS_DIR_IS_V1(state->mp)); - before = xfs_dir_leaf_order(old_blk->bp, new_blk->bp); - break; case XFS_DIR2_LEAFN_MAGIC: - ASSERT(XFS_DIR_IS_V2(state->mp)); before = xfs_dir2_leafn_order(old_blk->bp, new_blk->bp); break; case XFS_DA_NODE_MAGIC: @@ -1404,7 +1331,7 @@ xfs_da_blk_unlink(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, save_info = save_blk->bp->data; drop_info = drop_blk->bp->data; ASSERT(save_blk->magic == XFS_DA_NODE_MAGIC || - save_blk->magic == XFS_DIRX_LEAF_MAGIC(state->mp) || + save_blk->magic == XFS_DIR2_LEAFN_MAGIC || save_blk->magic == XFS_ATTR_LEAF_MAGIC); ASSERT(save_blk->magic == be16_to_cpu(save_info->magic)); ASSERT(drop_blk->magic == be16_to_cpu(drop_info->magic)); @@ -1529,7 +1456,7 @@ xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path, ASSERT(blk->bp != NULL); info = blk->bp->data; ASSERT(be16_to_cpu(info->magic) == XFS_DA_NODE_MAGIC || - be16_to_cpu(info->magic) == XFS_DIRX_LEAF_MAGIC(state->mp) || + be16_to_cpu(info->magic) == XFS_DIR2_LEAFN_MAGIC || be16_to_cpu(info->magic) == XFS_ATTR_LEAF_MAGIC); blk->magic = be16_to_cpu(info->magic); if (blk->magic == XFS_DA_NODE_MAGIC) { @@ -1548,20 +1475,13 @@ xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path, blk->hashval = xfs_attr_leaf_lasthash(blk->bp, NULL); break; - case XFS_DIR_LEAF_MAGIC: - ASSERT(XFS_DIR_IS_V1(state->mp)); - blk->hashval = xfs_dir_leaf_lasthash(blk->bp, - NULL); - break; case XFS_DIR2_LEAFN_MAGIC: - ASSERT(XFS_DIR_IS_V2(state->mp)); blk->hashval = xfs_dir2_leafn_lasthash(blk->bp, NULL); break; default: ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC || - blk->magic == - XFS_DIRX_LEAF_MAGIC(state->mp)); + blk->magic == XFS_DIR2_LEAFN_MAGIC); break; } } @@ -1620,7 +1540,6 @@ xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t *new_blkno) xfs_bmbt_irec_t *mapp; xfs_inode_t *dp; int nmap, error, w, count, c, got, i, mapi; - xfs_fsize_t size; xfs_trans_t *tp; xfs_mount_t *mp; @@ -1631,7 +1550,7 @@ xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t *new_blkno) /* * For new directories adjust the file offset and block count. */ - if (w == XFS_DATA_FORK && XFS_DIR_IS_V2(mp)) { + if (w == XFS_DATA_FORK) { bno = mp->m_dirleafblk; count = mp->m_dirblkfsbs; } else { @@ -1641,10 +1560,9 @@ xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t *new_blkno) /* * Find a spot in the file space to put the new block. */ - if ((error = xfs_bmap_first_unused(tp, dp, count, &bno, w))) { + if ((error = xfs_bmap_first_unused(tp, dp, count, &bno, w))) return error; - } - if (w == XFS_DATA_FORK && XFS_DIR_IS_V2(mp)) + if (w == XFS_DATA_FORK) ASSERT(bno >= mp->m_dirleafblk && bno < mp->m_dirfreeblk); /* * Try mapping it in one filesystem block. @@ -1655,7 +1573,7 @@ xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t *new_blkno) XFS_BMAPI_AFLAG(w)|XFS_BMAPI_WRITE|XFS_BMAPI_METADATA| XFS_BMAPI_CONTIG, args->firstblock, args->total, &map, &nmap, - args->flist))) { + args->flist, NULL))) { return error; } ASSERT(nmap <= 1); @@ -1676,7 +1594,8 @@ xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t *new_blkno) XFS_BMAPI_AFLAG(w)|XFS_BMAPI_WRITE| XFS_BMAPI_METADATA, args->firstblock, args->total, - &mapp[mapi], &nmap, args->flist))) { + &mapp[mapi], &nmap, args->flist, + NULL))) { kmem_free(mapp, sizeof(*mapp) * count); return error; } @@ -1705,19 +1624,6 @@ xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t *new_blkno) if (mapp != &map) kmem_free(mapp, sizeof(*mapp) * count); *new_blkno = (xfs_dablk_t)bno; - /* - * For version 1 directories, adjust the file size if it changed. - */ - if (w == XFS_DATA_FORK && XFS_DIR_IS_V1(mp)) { - ASSERT(mapi == 1); - if ((error = xfs_bmap_last_offset(tp, dp, &bno, w))) - return error; - size = XFS_FSB_TO_B(mp, bno); - if (size != dp->i_d.di_size) { - dp->i_d.di_size = size; - xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); - } - } return 0; } @@ -1742,7 +1648,6 @@ xfs_da_swap_lastblock(xfs_da_args_t *args, xfs_dablk_t *dead_blknop, int error, w, entno, level, dead_level; xfs_da_blkinfo_t *dead_info, *sib_info; xfs_da_intnode_t *par_node, *dead_node; - xfs_dir_leafblock_t *dead_leaf; xfs_dir2_leaf_t *dead_leaf2; xfs_dahash_t dead_hash; @@ -1753,11 +1658,8 @@ xfs_da_swap_lastblock(xfs_da_args_t *args, xfs_dablk_t *dead_blknop, w = args->whichfork; ASSERT(w == XFS_DATA_FORK); mp = ip->i_mount; - if (XFS_DIR_IS_V2(mp)) { - lastoff = mp->m_dirfreeblk; - error = xfs_bmap_last_before(tp, ip, &lastoff, w); - } else - error = xfs_bmap_last_offset(tp, ip, &lastoff, w); + lastoff = mp->m_dirfreeblk; + error = xfs_bmap_last_before(tp, ip, &lastoff, w); if (error) return error; if (unlikely(lastoff == 0)) { @@ -1780,14 +1682,7 @@ xfs_da_swap_lastblock(xfs_da_args_t *args, xfs_dablk_t *dead_blknop, /* * Get values from the moved block. */ - if (be16_to_cpu(dead_info->magic) == XFS_DIR_LEAF_MAGIC) { - ASSERT(XFS_DIR_IS_V1(mp)); - dead_leaf = (xfs_dir_leafblock_t *)dead_info; - dead_level = 0; - dead_hash = - INT_GET(dead_leaf->entries[INT_GET(dead_leaf->hdr.count, ARCH_CONVERT) - 1].hashval, ARCH_CONVERT); - } else if (be16_to_cpu(dead_info->magic) == XFS_DIR2_LEAFN_MAGIC) { - ASSERT(XFS_DIR_IS_V2(mp)); + if (be16_to_cpu(dead_info->magic) == XFS_DIR2_LEAFN_MAGIC) { dead_leaf2 = (xfs_dir2_leaf_t *)dead_info; dead_level = 0; dead_hash = be32_to_cpu(dead_leaf2->ents[be16_to_cpu(dead_leaf2->hdr.count) - 1].hashval); @@ -1842,7 +1737,7 @@ xfs_da_swap_lastblock(xfs_da_args_t *args, xfs_dablk_t *dead_blknop, xfs_da_buf_done(sib_buf); sib_buf = NULL; } - par_blkno = XFS_DIR_IS_V1(mp) ? 0 : mp->m_dirleafblk; + par_blkno = mp->m_dirleafblk; level = -1; /* * Walk down the tree looking for the parent of the moved block. @@ -1941,8 +1836,6 @@ xfs_da_shrink_inode(xfs_da_args_t *args, xfs_dablk_t dead_blkno, { xfs_inode_t *dp; int done, error, w, count; - xfs_fileoff_t bno; - xfs_fsize_t size; xfs_trans_t *tp; xfs_mount_t *mp; @@ -1950,7 +1843,7 @@ xfs_da_shrink_inode(xfs_da_args_t *args, xfs_dablk_t dead_blkno, w = args->whichfork; tp = args->trans; mp = dp->i_mount; - if (w == XFS_DATA_FORK && XFS_DIR_IS_V2(mp)) + if (w == XFS_DATA_FORK) count = mp->m_dirblkfsbs; else count = 1; @@ -1961,34 +1854,17 @@ xfs_da_shrink_inode(xfs_da_args_t *args, xfs_dablk_t dead_blkno, */ if ((error = xfs_bunmapi(tp, dp, dead_blkno, count, XFS_BMAPI_AFLAG(w)|XFS_BMAPI_METADATA, - 0, args->firstblock, args->flist, + 0, args->firstblock, args->flist, NULL, &done)) == ENOSPC) { if (w != XFS_DATA_FORK) - goto done; + break; if ((error = xfs_da_swap_lastblock(args, &dead_blkno, &dead_buf))) - goto done; - } else if (error) - goto done; - else + break; + } else { break; - } - ASSERT(done); - xfs_da_binval(tp, dead_buf); - /* - * Adjust the directory size for version 1. - */ - if (w == XFS_DATA_FORK && XFS_DIR_IS_V1(mp)) { - if ((error = xfs_bmap_last_offset(tp, dp, &bno, w))) - return error; - size = XFS_FSB_TO_B(dp->i_mount, bno); - if (size != dp->i_d.di_size) { - dp->i_d.di_size = size; - xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); } } - return 0; -done: xfs_da_binval(tp, dead_buf); return error; } @@ -2049,10 +1925,7 @@ xfs_da_do_buf( xfs_dabuf_t *rbp; mp = dp->i_mount; - if (whichfork == XFS_DATA_FORK && XFS_DIR_IS_V2(mp)) - nfsb = mp->m_dirblkfsbs; - else - nfsb = 1; + nfsb = (whichfork == XFS_DATA_FORK) ? mp->m_dirblkfsbs : 1; mappedbno = *mappedbnop; /* * Caller doesn't have a mapping. -2 means don't complain @@ -2086,7 +1959,7 @@ xfs_da_do_buf( nfsb, XFS_BMAPI_METADATA | XFS_BMAPI_AFLAG(whichfork), - NULL, 0, mapp, &nmap, NULL))) + NULL, 0, mapp, &nmap, NULL, NULL))) goto exit0; } } else { @@ -2198,7 +2071,6 @@ xfs_da_do_buf( magic1 = be32_to_cpu(data->hdr.magic); if (unlikely( XFS_TEST_ERROR((magic != XFS_DA_NODE_MAGIC) && - (magic != XFS_DIR_LEAF_MAGIC) && (magic != XFS_ATTR_LEAF_MAGIC) && (magic != XFS_DIR2_LEAF1_MAGIC) && (magic != XFS_DIR2_LEAFN_MAGIC) && diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index 243a730d5..4ab865ec8 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -36,14 +36,10 @@ struct zone; * level in the Btree, and to identify which type of block this is. */ #define XFS_DA_NODE_MAGIC 0xfebe /* magic number: non-leaf blocks */ -#define XFS_DIR_LEAF_MAGIC 0xfeeb /* magic number: directory leaf blks */ #define XFS_ATTR_LEAF_MAGIC 0xfbee /* magic number: attribute leaf blks */ #define XFS_DIR2_LEAF1_MAGIC 0xd2f1 /* magic number: v2 dirlf single blks */ #define XFS_DIR2_LEAFN_MAGIC 0xd2ff /* magic number: v2 dirlf multi blks */ -#define XFS_DIRX_LEAF_MAGIC(mp) \ - (XFS_DIR_IS_V1(mp) ? XFS_DIR_LEAF_MAGIC : XFS_DIR2_LEAFN_MAGIC) - typedef struct xfs_da_blkinfo { __be32 forw; /* previous block in list */ __be32 back; /* following block in list */ diff --git a/fs/xfs/xfs_dfrag.c b/fs/xfs/xfs_dfrag.c index 4968a6358..80562b60f 100644 --- a/fs/xfs/xfs_dfrag.c +++ b/fs/xfs/xfs_dfrag.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2006 Silicon Graphics, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -24,14 +24,12 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -54,24 +52,14 @@ xfs_swapext( xfs_swapext_t __user *sxu) { xfs_swapext_t *sxp; - xfs_inode_t *ip=NULL, *tip=NULL, *ips[2]; - xfs_trans_t *tp; + xfs_inode_t *ip=NULL, *tip=NULL; xfs_mount_t *mp; - xfs_bstat_t *sbp; struct file *fp = NULL, *tfp = NULL; - vnode_t *vp, *tvp; - static uint lock_flags = XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL; - int ilf_fields, tilf_fields; + bhv_vnode_t *vp, *tvp; int error = 0; - xfs_ifork_t *tempifp, *ifp, *tifp; - __uint64_t tmp; - int aforkblks = 0; - int taforkblks = 0; - char locked = 0; sxp = kmem_alloc(sizeof(xfs_swapext_t), KM_MAYFAIL); - tempifp = kmem_alloc(sizeof(xfs_ifork_t), KM_MAYFAIL); - if (!sxp || !tempifp) { + if (!sxp) { error = XFS_ERROR(ENOMEM); goto error0; } @@ -118,14 +106,56 @@ xfs_swapext( mp = ip->i_mount; - sbp = &sxp->sx_stat; - if (XFS_FORCED_SHUTDOWN(mp)) { error = XFS_ERROR(EIO); goto error0; } - locked = 1; + error = XFS_SWAP_EXTENTS(mp, &ip->i_iocore, &tip->i_iocore, sxp); + + error0: + if (fp != NULL) + fput(fp); + if (tfp != NULL) + fput(tfp); + + if (sxp != NULL) + kmem_free(sxp, sizeof(xfs_swapext_t)); + + return error; +} + +int +xfs_swap_extents( + xfs_inode_t *ip, + xfs_inode_t *tip, + xfs_swapext_t *sxp) +{ + xfs_mount_t *mp; + xfs_inode_t *ips[2]; + xfs_trans_t *tp; + xfs_bstat_t *sbp = &sxp->sx_stat; + bhv_vnode_t *vp, *tvp; + xfs_ifork_t *tempifp, *ifp, *tifp; + int ilf_fields, tilf_fields; + static uint lock_flags = XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL; + int error = 0; + int aforkblks = 0; + int taforkblks = 0; + __uint64_t tmp; + char locked = 0; + + mp = ip->i_mount; + + tempifp = kmem_alloc(sizeof(xfs_ifork_t), KM_MAYFAIL); + if (!tempifp) { + error = XFS_ERROR(ENOMEM); + goto error0; + } + + sbp = &sxp->sx_stat; + vp = XFS_ITOV(ip); + tvp = XFS_ITOV(tip); /* Lock in i_ino order */ if (ip->i_ino < tip->i_ino) { @@ -137,6 +167,7 @@ xfs_swapext( } xfs_lock_inodes(ips, 2, 0, lock_flags); + locked = 1; /* Check permissions */ error = xfs_iaccess(ip, S_IWUSR, NULL); @@ -169,7 +200,7 @@ xfs_swapext( if (VN_CACHED(tvp) != 0) { xfs_inval_cached_trace(&tip->i_iocore, 0, -1, 0, -1); - VOP_FLUSHINVAL_PAGES(tvp, 0, -1, FI_REMAPF_LOCKED); + bhv_vop_flushinval_pages(tvp, 0, -1, FI_REMAPF_LOCKED); } /* Verify O_DIRECT for ftmp */ @@ -214,7 +245,7 @@ xfs_swapext( /* We need to fail if the file is memory mapped. Once we have tossed * all existing pages, the page fault will have no option * but to go to the filesystem for pages. By making the page fault call - * VOP_READ (or write in the case of autogrow) they block on the iolock + * vop_read (or write in the case of autogrow) they block on the iolock * until we have switched the extents. */ if (VN_MAPPED(vp)) { @@ -233,7 +264,7 @@ xfs_swapext( * fields change. */ - VOP_TOSS_PAGES(vp, 0, -1, FI_REMAPF); + bhv_vop_toss_pages(vp, 0, -1, FI_REMAPF); tp = xfs_trans_alloc(mp, XFS_TRANS_SWAPEXT); if ((error = xfs_trans_reserve(tp, 0, @@ -360,16 +391,7 @@ xfs_swapext( xfs_iunlock(ip, lock_flags); xfs_iunlock(tip, lock_flags); } - - if (fp != NULL) - fput(fp); - if (tfp != NULL) - fput(tfp); - - if (sxp != NULL) - kmem_free(sxp, sizeof(xfs_swapext_t)); if (tempifp != NULL) kmem_free(tempifp, sizeof(xfs_ifork_t)); - return error; } diff --git a/fs/xfs/xfs_dfrag.h b/fs/xfs/xfs_dfrag.h index f678559ab..da178205b 100644 --- a/fs/xfs/xfs_dfrag.h +++ b/fs/xfs/xfs_dfrag.h @@ -48,6 +48,9 @@ typedef struct xfs_swapext */ int xfs_swapext(struct xfs_swapext __user *sx); +int xfs_swap_extents(struct xfs_inode *ip, struct xfs_inode *tip, + struct xfs_swapext *sxp); + #endif /* __KERNEL__ */ #endif /* __XFS_DFRAG_H__ */ diff --git a/fs/xfs/xfs_dinode.h b/fs/xfs/xfs_dinode.h index a70e0b375..1dcc5b7cb 100644 --- a/fs/xfs/xfs_dinode.h +++ b/fs/xfs/xfs_dinode.h @@ -86,7 +86,6 @@ typedef struct xfs_dinode union { xfs_bmdr_block_t di_bmbt; /* btree root block */ xfs_bmbt_rec_32_t di_bmx[1]; /* extent list */ - xfs_dir_shortform_t di_dirsf; /* shortform directory */ xfs_dir2_sf_t di_dir2sf; /* shortform directory v2 */ char di_c[1]; /* local contents */ xfs_dev_t di_dev; /* device for S_IFCHR/S_IFBLK */ @@ -258,8 +257,9 @@ typedef enum xfs_dinode_fmt #define XFS_DIFLAG_NOSYMLINKS_BIT 10 /* disallow symlink creation */ #define XFS_DIFLAG_EXTSIZE_BIT 11 /* inode extent size allocator hint */ #define XFS_DIFLAG_EXTSZINHERIT_BIT 12 /* inherit inode extent size */ -#define XFS_DIFLAG_BARRIER_BIT 13 /* chroot() barrier */ -#define XFS_DIFLAG_IUNLINK_BIT 14 /* immutable unlink */ +#define XFS_DIFLAG_NODEFRAG_BIT 13 /* do not reorganize/defragment */ +#define XFS_DIFLAG_BARRIER_BIT 14 /* chroot() barrier */ +#define XFS_DIFLAG_IUNLINK_BIT 15 /* immutable unlink */ #define XFS_DIFLAG_REALTIME (1 << XFS_DIFLAG_REALTIME_BIT) #define XFS_DIFLAG_PREALLOC (1 << XFS_DIFLAG_PREALLOC_BIT) @@ -274,6 +274,7 @@ typedef enum xfs_dinode_fmt #define XFS_DIFLAG_NOSYMLINKS (1 << XFS_DIFLAG_NOSYMLINKS_BIT) #define XFS_DIFLAG_EXTSIZE (1 << XFS_DIFLAG_EXTSIZE_BIT) #define XFS_DIFLAG_EXTSZINHERIT (1 << XFS_DIFLAG_EXTSZINHERIT_BIT) +#define XFS_DIFLAG_NODEFRAG (1 << XFS_DIFLAG_NODEFRAG_BIT) #define XFS_DIFLAG_BARRIER (1 << XFS_DIFLAG_BARRIER_BIT) #define XFS_DIFLAG_IUNLINK (1 << XFS_DIFLAG_IUNLINK_BIT) @@ -282,6 +283,7 @@ typedef enum xfs_dinode_fmt XFS_DIFLAG_IMMUTABLE | XFS_DIFLAG_APPEND | XFS_DIFLAG_SYNC | \ XFS_DIFLAG_NOATIME | XFS_DIFLAG_NODUMP | XFS_DIFLAG_RTINHERIT | \ XFS_DIFLAG_PROJINHERIT | XFS_DIFLAG_NOSYMLINKS | XFS_DIFLAG_EXTSIZE | \ - XFS_DIFLAG_EXTSZINHERIT | XFS_DIFLAG_BARRIER | XFS_DIFLAG_IUNLINK) + XFS_DIFLAG_EXTSZINHERIT | XFS_DIFLAG_NODEFRAG | XFS_DIFLAG_BARRIER | \ + XFS_DIFLAG_IUNLINK) #endif /* __XFS_DINODE_H__ */ diff --git a/fs/xfs/xfs_dir.c b/fs/xfs/xfs_dir.c deleted file mode 100644 index 9cc702a83..000000000 --- a/fs/xfs/xfs_dir.c +++ /dev/null @@ -1,1217 +0,0 @@ -/* - * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would 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 the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include "xfs.h" -#include "xfs_fs.h" -#include "xfs_types.h" -#include "xfs_log.h" -#include "xfs_inum.h" -#include "xfs_trans.h" -#include "xfs_sb.h" -#include "xfs_dir.h" -#include "xfs_dir2.h" -#include "xfs_dmapi.h" -#include "xfs_mount.h" -#include "xfs_da_btree.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_alloc.h" -#include "xfs_btree.h" -#include "xfs_dir_sf.h" -#include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" -#include "xfs_dinode.h" -#include "xfs_inode.h" -#include "xfs_bmap.h" -#include "xfs_dir_leaf.h" -#include "xfs_error.h" - -/* - * xfs_dir.c - * - * Provide the external interfaces to manage directories. - */ - -/*======================================================================== - * Function prototypes for the kernel. - *========================================================================*/ - -/* - * Functions for the dirops interfaces. - */ -static void xfs_dir_mount(struct xfs_mount *mp); - -static int xfs_dir_isempty(struct xfs_inode *dp); - -static int xfs_dir_init(struct xfs_trans *trans, - struct xfs_inode *dir, - struct xfs_inode *parent_dir); - -static int xfs_dir_createname(struct xfs_trans *trans, - struct xfs_inode *dp, - char *name_string, - int name_len, - xfs_ino_t inode_number, - xfs_fsblock_t *firstblock, - xfs_bmap_free_t *flist, - xfs_extlen_t total); - -static int xfs_dir_lookup(struct xfs_trans *tp, - struct xfs_inode *dp, - char *name_string, - int name_length, - xfs_ino_t *inode_number); - -static int xfs_dir_removename(struct xfs_trans *trans, - struct xfs_inode *dp, - char *name_string, - int name_length, - xfs_ino_t ino, - xfs_fsblock_t *firstblock, - xfs_bmap_free_t *flist, - xfs_extlen_t total); - -static int xfs_dir_getdents(struct xfs_trans *tp, - struct xfs_inode *dp, - struct uio *uiop, - int *eofp); - -static int xfs_dir_replace(struct xfs_trans *tp, - struct xfs_inode *dp, - char *name_string, - int name_length, - xfs_ino_t inode_number, - xfs_fsblock_t *firstblock, - xfs_bmap_free_t *flist, - xfs_extlen_t total); - -static int xfs_dir_canenter(struct xfs_trans *tp, - struct xfs_inode *dp, - char *name_string, - int name_length); - -static int xfs_dir_shortform_validate_ondisk(xfs_mount_t *mp, - xfs_dinode_t *dip); - -xfs_dirops_t xfsv1_dirops = { - .xd_mount = xfs_dir_mount, - .xd_isempty = xfs_dir_isempty, - .xd_init = xfs_dir_init, - .xd_createname = xfs_dir_createname, - .xd_lookup = xfs_dir_lookup, - .xd_removename = xfs_dir_removename, - .xd_getdents = xfs_dir_getdents, - .xd_replace = xfs_dir_replace, - .xd_canenter = xfs_dir_canenter, - .xd_shortform_validate_ondisk = xfs_dir_shortform_validate_ondisk, - .xd_shortform_to_single = xfs_dir_shortform_to_leaf, -}; - -/* - * Internal routines when dirsize == XFS_LBSIZE(mp). - */ -STATIC int xfs_dir_leaf_lookup(xfs_da_args_t *args); -STATIC int xfs_dir_leaf_removename(xfs_da_args_t *args, int *number_entries, - int *total_namebytes); -STATIC int xfs_dir_leaf_getdents(xfs_trans_t *trans, xfs_inode_t *dp, - uio_t *uio, int *eofp, - xfs_dirent_t *dbp, - xfs_dir_put_t put); -STATIC int xfs_dir_leaf_replace(xfs_da_args_t *args); - -/* - * Internal routines when dirsize > XFS_LBSIZE(mp). - */ -STATIC int xfs_dir_node_addname(xfs_da_args_t *args); -STATIC int xfs_dir_node_lookup(xfs_da_args_t *args); -STATIC int xfs_dir_node_removename(xfs_da_args_t *args); -STATIC int xfs_dir_node_getdents(xfs_trans_t *trans, xfs_inode_t *dp, - uio_t *uio, int *eofp, - xfs_dirent_t *dbp, - xfs_dir_put_t put); -STATIC int xfs_dir_node_replace(xfs_da_args_t *args); - -#if defined(XFS_DIR_TRACE) -ktrace_t *xfs_dir_trace_buf; -#endif - - -/*======================================================================== - * Overall external interface routines. - *========================================================================*/ - -xfs_dahash_t xfs_dir_hash_dot, xfs_dir_hash_dotdot; - -/* - * One-time startup routine called from xfs_init(). - */ -void -xfs_dir_startup(void) -{ - xfs_dir_hash_dot = xfs_da_hashname(".", 1); - xfs_dir_hash_dotdot = xfs_da_hashname("..", 2); -} - -/* - * Initialize directory-related fields in the mount structure. - */ -static void -xfs_dir_mount(xfs_mount_t *mp) -{ - uint shortcount, leafcount, count; - - mp->m_dirversion = 1; - if (!(mp->m_flags & XFS_MOUNT_ATTR2)) { - shortcount = (mp->m_attroffset - - (uint)sizeof(xfs_dir_sf_hdr_t)) / - (uint)sizeof(xfs_dir_sf_entry_t); - leafcount = (XFS_LBSIZE(mp) - - (uint)sizeof(xfs_dir_leaf_hdr_t)) / - ((uint)sizeof(xfs_dir_leaf_entry_t) + - (uint)sizeof(xfs_dir_leaf_name_t)); - } else { - shortcount = (XFS_BMDR_SPACE_CALC(MINABTPTRS) - - (uint)sizeof(xfs_dir_sf_hdr_t)) / - (uint)sizeof(xfs_dir_sf_entry_t); - leafcount = (XFS_LBSIZE(mp) - - (uint)sizeof(xfs_dir_leaf_hdr_t)) / - ((uint)sizeof(xfs_dir_leaf_entry_t) + - (uint)sizeof(xfs_dir_leaf_name_t)); - } - count = shortcount > leafcount ? shortcount : leafcount; - mp->m_dircook_elog = xfs_da_log2_roundup(count + 1); - ASSERT(mp->m_dircook_elog <= mp->m_sb.sb_blocklog); - mp->m_dir_node_ents = mp->m_attr_node_ents = - (XFS_LBSIZE(mp) - (uint)sizeof(xfs_da_node_hdr_t)) / - (uint)sizeof(xfs_da_node_entry_t); - mp->m_dir_magicpct = (XFS_LBSIZE(mp) * 37) / 100; - mp->m_dirblksize = mp->m_sb.sb_blocksize; - mp->m_dirblkfsbs = 1; -} - -/* - * Return 1 if directory contains only "." and "..". - */ -static int -xfs_dir_isempty(xfs_inode_t *dp) -{ - xfs_dir_sf_hdr_t *hdr; - - ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); - if (dp->i_d.di_size == 0) - return(1); - if (dp->i_d.di_size > XFS_IFORK_DSIZE(dp)) - return(0); - hdr = (xfs_dir_sf_hdr_t *)dp->i_df.if_u1.if_data; - return(hdr->count == 0); -} - -/* - * Initialize a directory with its "." and ".." entries. - */ -static int -xfs_dir_init(xfs_trans_t *trans, xfs_inode_t *dir, xfs_inode_t *parent_dir) -{ - xfs_da_args_t args; - int error; - - memset((char *)&args, 0, sizeof(args)); - args.dp = dir; - args.trans = trans; - - ASSERT((dir->i_d.di_mode & S_IFMT) == S_IFDIR); - if ((error = xfs_dir_ino_validate(trans->t_mountp, parent_dir->i_ino))) - return error; - - return(xfs_dir_shortform_create(&args, parent_dir->i_ino)); -} - -/* - * Generic handler routine to add a name to a directory. - * Transitions directory from shortform to Btree as necessary. - */ -static int /* error */ -xfs_dir_createname(xfs_trans_t *trans, xfs_inode_t *dp, char *name, - int namelen, xfs_ino_t inum, xfs_fsblock_t *firstblock, - xfs_bmap_free_t *flist, xfs_extlen_t total) -{ - xfs_da_args_t args; - int retval, newsize, done; - - ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); - - if ((retval = xfs_dir_ino_validate(trans->t_mountp, inum))) - return (retval); - - XFS_STATS_INC(xs_dir_create); - /* - * Fill in the arg structure for this request. - */ - args.name = name; - args.namelen = namelen; - args.hashval = xfs_da_hashname(name, namelen); - args.inumber = inum; - args.dp = dp; - args.firstblock = firstblock; - args.flist = flist; - args.total = total; - args.whichfork = XFS_DATA_FORK; - args.trans = trans; - args.justcheck = 0; - args.addname = args.oknoent = 1; - - /* - * Decide on what work routines to call based on the inode size. - */ - done = 0; - if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) { - newsize = XFS_DIR_SF_ENTSIZE_BYNAME(args.namelen); - if ((dp->i_d.di_size + newsize) <= XFS_IFORK_DSIZE(dp)) { - retval = xfs_dir_shortform_addname(&args); - done = 1; - } else { - if (total == 0) - return XFS_ERROR(ENOSPC); - retval = xfs_dir_shortform_to_leaf(&args); - done = retval != 0; - } - } - if (!done && xfs_bmap_one_block(dp, XFS_DATA_FORK)) { - retval = xfs_dir_leaf_addname(&args); - done = retval != ENOSPC; - if (!done) { - if (total == 0) - return XFS_ERROR(ENOSPC); - retval = xfs_dir_leaf_to_node(&args); - done = retval != 0; - } - } - if (!done) { - retval = xfs_dir_node_addname(&args); - } - return(retval); -} - -/* - * Generic handler routine to check if a name can be added to a directory, - * without adding any blocks to the directory. - */ -static int /* error */ -xfs_dir_canenter(xfs_trans_t *trans, xfs_inode_t *dp, char *name, int namelen) -{ - xfs_da_args_t args; - int retval, newsize; - - ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); - /* - * Fill in the arg structure for this request. - */ - args.name = name; - args.namelen = namelen; - args.hashval = xfs_da_hashname(name, namelen); - args.inumber = 0; - args.dp = dp; - args.firstblock = NULL; - args.flist = NULL; - args.total = 0; - args.whichfork = XFS_DATA_FORK; - args.trans = trans; - args.justcheck = args.addname = args.oknoent = 1; - - /* - * Decide on what work routines to call based on the inode size. - */ - if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) { - newsize = XFS_DIR_SF_ENTSIZE_BYNAME(args.namelen); - if ((dp->i_d.di_size + newsize) <= XFS_IFORK_DSIZE(dp)) - retval = 0; - else - retval = XFS_ERROR(ENOSPC); - } else if (xfs_bmap_one_block(dp, XFS_DATA_FORK)) { - retval = xfs_dir_leaf_addname(&args); - } else { - retval = xfs_dir_node_addname(&args); - } - return(retval); -} - -/* - * Generic handler routine to remove a name from a directory. - * Transitions directory from Btree to shortform as necessary. - */ -static int /* error */ -xfs_dir_removename(xfs_trans_t *trans, xfs_inode_t *dp, char *name, - int namelen, xfs_ino_t ino, xfs_fsblock_t *firstblock, - xfs_bmap_free_t *flist, xfs_extlen_t total) -{ - xfs_da_args_t args; - int count, totallen, newsize, retval; - - ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); - XFS_STATS_INC(xs_dir_remove); - /* - * Fill in the arg structure for this request. - */ - args.name = name; - args.namelen = namelen; - args.hashval = xfs_da_hashname(name, namelen); - args.inumber = ino; - args.dp = dp; - args.firstblock = firstblock; - args.flist = flist; - args.total = total; - args.whichfork = XFS_DATA_FORK; - args.trans = trans; - args.justcheck = args.addname = args.oknoent = 0; - - /* - * Decide on what work routines to call based on the inode size. - */ - if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) { - retval = xfs_dir_shortform_removename(&args); - } else if (xfs_bmap_one_block(dp, XFS_DATA_FORK)) { - retval = xfs_dir_leaf_removename(&args, &count, &totallen); - if (retval == 0) { - newsize = XFS_DIR_SF_ALLFIT(count, totallen); - if (newsize <= XFS_IFORK_DSIZE(dp)) { - retval = xfs_dir_leaf_to_shortform(&args); - } - } - } else { - retval = xfs_dir_node_removename(&args); - } - return(retval); -} - -static int /* error */ -xfs_dir_lookup(xfs_trans_t *trans, xfs_inode_t *dp, char *name, int namelen, - xfs_ino_t *inum) -{ - xfs_da_args_t args; - int retval; - - ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); - - XFS_STATS_INC(xs_dir_lookup); - /* - * Fill in the arg structure for this request. - */ - args.name = name; - args.namelen = namelen; - args.hashval = xfs_da_hashname(name, namelen); - args.inumber = 0; - args.dp = dp; - args.firstblock = NULL; - args.flist = NULL; - args.total = 0; - args.whichfork = XFS_DATA_FORK; - args.trans = trans; - args.justcheck = args.addname = 0; - args.oknoent = 1; - - /* - * Decide on what work routines to call based on the inode size. - */ - if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) { - retval = xfs_dir_shortform_lookup(&args); - } else if (xfs_bmap_one_block(dp, XFS_DATA_FORK)) { - retval = xfs_dir_leaf_lookup(&args); - } else { - retval = xfs_dir_node_lookup(&args); - } - if (retval == EEXIST) - retval = 0; - *inum = args.inumber; - return(retval); -} - -/* - * Implement readdir. - */ -static int /* error */ -xfs_dir_getdents(xfs_trans_t *trans, xfs_inode_t *dp, uio_t *uio, int *eofp) -{ - xfs_dirent_t *dbp; - int alignment, retval; - xfs_dir_put_t put; - - XFS_STATS_INC(xs_dir_getdents); - ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); - - /* - * If our caller has given us a single contiguous memory buffer, - * just work directly within that buffer. If it's in user memory, - * lock it down first. - */ - alignment = sizeof(xfs_off_t) - 1; - if ((uio->uio_iovcnt == 1) && - (((__psint_t)uio->uio_iov[0].iov_base & alignment) == 0) && - ((uio->uio_iov[0].iov_len & alignment) == 0)) { - dbp = NULL; - put = xfs_dir_put_dirent64_direct; - } else { - dbp = kmem_alloc(sizeof(*dbp) + MAXNAMELEN, KM_SLEEP); - put = xfs_dir_put_dirent64_uio; - } - - /* - * Decide on what work routines to call based on the inode size. - */ - *eofp = 0; - - if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) { - retval = xfs_dir_shortform_getdents(dp, uio, eofp, dbp, put); - } else if (xfs_bmap_one_block(dp, XFS_DATA_FORK)) { - retval = xfs_dir_leaf_getdents(trans, dp, uio, eofp, dbp, put); - } else { - retval = xfs_dir_node_getdents(trans, dp, uio, eofp, dbp, put); - } - if (dbp != NULL) - kmem_free(dbp, sizeof(*dbp) + MAXNAMELEN); - - return(retval); -} - -static int /* error */ -xfs_dir_replace(xfs_trans_t *trans, xfs_inode_t *dp, char *name, int namelen, - xfs_ino_t inum, xfs_fsblock_t *firstblock, - xfs_bmap_free_t *flist, xfs_extlen_t total) -{ - xfs_da_args_t args; - int retval; - - ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); - - if ((retval = xfs_dir_ino_validate(trans->t_mountp, inum))) - return retval; - - /* - * Fill in the arg structure for this request. - */ - args.name = name; - args.namelen = namelen; - args.hashval = xfs_da_hashname(name, namelen); - args.inumber = inum; - args.dp = dp; - args.firstblock = firstblock; - args.flist = flist; - args.total = total; - args.whichfork = XFS_DATA_FORK; - args.trans = trans; - args.justcheck = args.addname = args.oknoent = 0; - - /* - * Decide on what work routines to call based on the inode size. - */ - if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) { - retval = xfs_dir_shortform_replace(&args); - } else if (xfs_bmap_one_block(dp, XFS_DATA_FORK)) { - retval = xfs_dir_leaf_replace(&args); - } else { - retval = xfs_dir_node_replace(&args); - } - - return(retval); -} - -static int -xfs_dir_shortform_validate_ondisk(xfs_mount_t *mp, xfs_dinode_t *dp) -{ - xfs_ino_t ino; - int namelen_sum; - int count; - xfs_dir_shortform_t *sf; - xfs_dir_sf_entry_t *sfe; - int i; - - - - if ((INT_GET(dp->di_core.di_mode, ARCH_CONVERT) & S_IFMT) != S_IFDIR) { - return 0; - } - if (INT_GET(dp->di_core.di_format, ARCH_CONVERT) != XFS_DINODE_FMT_LOCAL) { - return 0; - } - if (INT_GET(dp->di_core.di_size, ARCH_CONVERT) < sizeof(sf->hdr)) { - xfs_fs_cmn_err(CE_WARN, mp, "Invalid shortform size: dp 0x%p", - dp); - return 1; - } - sf = (xfs_dir_shortform_t *)(&dp->di_u.di_dirsf); - ino = XFS_GET_DIR_INO8(sf->hdr.parent); - if (xfs_dir_ino_validate(mp, ino)) - return 1; - - count = sf->hdr.count; - if ((count < 0) || ((count * 10) > XFS_LITINO(mp))) { - xfs_fs_cmn_err(CE_WARN, mp, - "Invalid shortform count: dp 0x%p", dp); - return(1); - } - - if (count == 0) { - return 0; - } - - namelen_sum = 0; - sfe = &sf->list[0]; - for (i = sf->hdr.count - 1; i >= 0; i--) { - ino = XFS_GET_DIR_INO8(sfe->inumber); - xfs_dir_ino_validate(mp, ino); - if (sfe->namelen >= XFS_LITINO(mp)) { - xfs_fs_cmn_err(CE_WARN, mp, - "Invalid shortform namelen: dp 0x%p", dp); - return 1; - } - namelen_sum += sfe->namelen; - sfe = XFS_DIR_SF_NEXTENTRY(sfe); - } - if (namelen_sum >= XFS_LITINO(mp)) { - xfs_fs_cmn_err(CE_WARN, mp, - "Invalid shortform namelen: dp 0x%p", dp); - return 1; - } - - return 0; -} - -/*======================================================================== - * External routines when dirsize == XFS_LBSIZE(dp->i_mount). - *========================================================================*/ - -/* - * Add a name to the leaf directory structure - * This is the external routine. - */ -int -xfs_dir_leaf_addname(xfs_da_args_t *args) -{ - int index, retval; - xfs_dabuf_t *bp; - - retval = xfs_da_read_buf(args->trans, args->dp, 0, -1, &bp, - XFS_DATA_FORK); - if (retval) - return(retval); - ASSERT(bp != NULL); - - retval = xfs_dir_leaf_lookup_int(bp, args, &index); - if (retval == ENOENT) - retval = xfs_dir_leaf_add(bp, args, index); - xfs_da_buf_done(bp); - return(retval); -} - -/* - * Remove a name from the leaf directory structure - * This is the external routine. - */ -STATIC int -xfs_dir_leaf_removename(xfs_da_args_t *args, int *count, int *totallen) -{ - xfs_dir_leafblock_t *leaf; - int index, retval; - xfs_dabuf_t *bp; - - retval = xfs_da_read_buf(args->trans, args->dp, 0, -1, &bp, - XFS_DATA_FORK); - if (retval) - return(retval); - ASSERT(bp != NULL); - leaf = bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_DIR_LEAF_MAGIC); - retval = xfs_dir_leaf_lookup_int(bp, args, &index); - if (retval == EEXIST) { - (void)xfs_dir_leaf_remove(args->trans, bp, index); - *count = INT_GET(leaf->hdr.count, ARCH_CONVERT); - *totallen = INT_GET(leaf->hdr.namebytes, ARCH_CONVERT); - retval = 0; - } - xfs_da_buf_done(bp); - return(retval); -} - -/* - * Look up a name in a leaf directory structure. - * This is the external routine. - */ -STATIC int -xfs_dir_leaf_lookup(xfs_da_args_t *args) -{ - int index, retval; - xfs_dabuf_t *bp; - - retval = xfs_da_read_buf(args->trans, args->dp, 0, -1, &bp, - XFS_DATA_FORK); - if (retval) - return(retval); - ASSERT(bp != NULL); - retval = xfs_dir_leaf_lookup_int(bp, args, &index); - xfs_da_brelse(args->trans, bp); - return(retval); -} - -/* - * Copy out directory entries for getdents(), for leaf directories. - */ -STATIC int -xfs_dir_leaf_getdents(xfs_trans_t *trans, xfs_inode_t *dp, uio_t *uio, - int *eofp, xfs_dirent_t *dbp, xfs_dir_put_t put) -{ - xfs_dabuf_t *bp; - int retval, eob; - - retval = xfs_da_read_buf(dp->i_transp, dp, 0, -1, &bp, XFS_DATA_FORK); - if (retval) - return(retval); - ASSERT(bp != NULL); - retval = xfs_dir_leaf_getdents_int(bp, dp, 0, uio, &eob, dbp, put, -1); - xfs_da_brelse(trans, bp); - *eofp = (eob == 0); - return(retval); -} - -/* - * Look up a name in a leaf directory structure, replace the inode number. - * This is the external routine. - */ -STATIC int -xfs_dir_leaf_replace(xfs_da_args_t *args) -{ - int index, retval; - xfs_dabuf_t *bp; - xfs_ino_t inum; - xfs_dir_leafblock_t *leaf; - xfs_dir_leaf_entry_t *entry; - xfs_dir_leaf_name_t *namest; - - inum = args->inumber; - retval = xfs_da_read_buf(args->trans, args->dp, 0, -1, &bp, - XFS_DATA_FORK); - if (retval) - return(retval); - ASSERT(bp != NULL); - retval = xfs_dir_leaf_lookup_int(bp, args, &index); - if (retval == EEXIST) { - leaf = bp->data; - entry = &leaf->entries[index]; - namest = XFS_DIR_LEAF_NAMESTRUCT(leaf, INT_GET(entry->nameidx, ARCH_CONVERT)); - /* XXX - replace assert? */ - XFS_DIR_SF_PUT_DIRINO(&inum, &namest->inumber); - xfs_da_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, namest, sizeof(namest->inumber))); - xfs_da_buf_done(bp); - retval = 0; - } else - xfs_da_brelse(args->trans, bp); - return(retval); -} - - -/*======================================================================== - * External routines when dirsize > XFS_LBSIZE(mp). - *========================================================================*/ - -/* - * Add a name to a Btree-format directory. - * - * This will involve walking down the Btree, and may involve splitting - * leaf nodes and even splitting intermediate nodes up to and including - * the root node (a special case of an intermediate node). - */ -STATIC int -xfs_dir_node_addname(xfs_da_args_t *args) -{ - xfs_da_state_t *state; - xfs_da_state_blk_t *blk; - int retval, error; - - /* - * Fill in bucket of arguments/results/context to carry around. - */ - state = xfs_da_state_alloc(); - state->args = args; - state->mp = args->dp->i_mount; - state->blocksize = state->mp->m_sb.sb_blocksize; - state->node_ents = state->mp->m_dir_node_ents; - - /* - * Search to see if name already exists, and get back a pointer - * to where it should go. - */ - error = xfs_da_node_lookup_int(state, &retval); - if (error) - retval = error; - if (retval != ENOENT) - goto error; - blk = &state->path.blk[ state->path.active-1 ]; - ASSERT(blk->magic == XFS_DIR_LEAF_MAGIC); - retval = xfs_dir_leaf_add(blk->bp, args, blk->index); - if (retval == 0) { - /* - * Addition succeeded, update Btree hashvals. - */ - if (!args->justcheck) - xfs_da_fixhashpath(state, &state->path); - } else { - /* - * Addition failed, split as many Btree elements as required. - */ - if (args->total == 0) { - ASSERT(retval == ENOSPC); - goto error; - } - retval = xfs_da_split(state); - } -error: - xfs_da_state_free(state); - - return(retval); -} - -/* - * Remove a name from a B-tree directory. - * - * This will involve walking down the Btree, and may involve joining - * leaf nodes and even joining intermediate nodes up to and including - * the root node (a special case of an intermediate node). - */ -STATIC int -xfs_dir_node_removename(xfs_da_args_t *args) -{ - xfs_da_state_t *state; - xfs_da_state_blk_t *blk; - int retval, error; - - state = xfs_da_state_alloc(); - state->args = args; - state->mp = args->dp->i_mount; - state->blocksize = state->mp->m_sb.sb_blocksize; - state->node_ents = state->mp->m_dir_node_ents; - - /* - * Search to see if name exists, and get back a pointer to it. - */ - error = xfs_da_node_lookup_int(state, &retval); - if (error) - retval = error; - if (retval != EEXIST) { - xfs_da_state_free(state); - return(retval); - } - - /* - * Remove the name and update the hashvals in the tree. - */ - blk = &state->path.blk[ state->path.active-1 ]; - ASSERT(blk->magic == XFS_DIR_LEAF_MAGIC); - retval = xfs_dir_leaf_remove(args->trans, blk->bp, blk->index); - xfs_da_fixhashpath(state, &state->path); - - /* - * Check to see if the tree needs to be collapsed. - */ - error = 0; - if (retval) { - error = xfs_da_join(state); - } - - xfs_da_state_free(state); - if (error) - return(error); - return(0); -} - -/* - * Look up a filename in a int directory. - * Use an internal routine to actually do all the work. - */ -STATIC int -xfs_dir_node_lookup(xfs_da_args_t *args) -{ - xfs_da_state_t *state; - int retval, error, i; - - state = xfs_da_state_alloc(); - state->args = args; - state->mp = args->dp->i_mount; - state->blocksize = state->mp->m_sb.sb_blocksize; - state->node_ents = state->mp->m_dir_node_ents; - - /* - * Search to see if name exists, - * and get back a pointer to it. - */ - error = xfs_da_node_lookup_int(state, &retval); - if (error) { - retval = error; - } - - /* - * If not in a transaction, we have to release all the buffers. - */ - for (i = 0; i < state->path.active; i++) { - xfs_da_brelse(args->trans, state->path.blk[i].bp); - state->path.blk[i].bp = NULL; - } - - xfs_da_state_free(state); - return(retval); -} - -STATIC int -xfs_dir_node_getdents(xfs_trans_t *trans, xfs_inode_t *dp, uio_t *uio, - int *eofp, xfs_dirent_t *dbp, xfs_dir_put_t put) -{ - xfs_da_intnode_t *node; - xfs_da_node_entry_t *btree; - xfs_dir_leafblock_t *leaf = NULL; - xfs_dablk_t bno, nextbno; - xfs_dahash_t cookhash; - xfs_mount_t *mp; - int error, eob, i; - xfs_dabuf_t *bp; - xfs_daddr_t nextda; - - /* - * Pick up our context. - */ - mp = dp->i_mount; - bp = NULL; - bno = XFS_DA_COOKIE_BNO(mp, uio->uio_offset); - cookhash = XFS_DA_COOKIE_HASH(mp, uio->uio_offset); - - xfs_dir_trace_g_du("node: start", dp, uio); - - /* - * Re-find our place, even if we're confused about what our place is. - * - * First we check the block number from the magic cookie, it is a - * cache of where we ended last time. If we find a leaf block, and - * the starting hashval in that block is less than our desired - * hashval, then we run with it. - */ - if (bno > 0) { - error = xfs_da_read_buf(trans, dp, bno, -2, &bp, XFS_DATA_FORK); - if ((error != 0) && (error != EFSCORRUPTED)) - return(error); - if (bp) - leaf = bp->data; - if (bp && be16_to_cpu(leaf->hdr.info.magic) != XFS_DIR_LEAF_MAGIC) { - xfs_dir_trace_g_dub("node: block not a leaf", - dp, uio, bno); - xfs_da_brelse(trans, bp); - bp = NULL; - } - if (bp && INT_GET(leaf->entries[0].hashval, ARCH_CONVERT) > cookhash) { - xfs_dir_trace_g_dub("node: leaf hash too large", - dp, uio, bno); - xfs_da_brelse(trans, bp); - bp = NULL; - } - if (bp && - cookhash > INT_GET(leaf->entries[INT_GET(leaf->hdr.count, ARCH_CONVERT) - 1].hashval, ARCH_CONVERT)) { - xfs_dir_trace_g_dub("node: leaf hash too small", - dp, uio, bno); - xfs_da_brelse(trans, bp); - bp = NULL; - } - } - - /* - * If we did not find a leaf block from the blockno in the cookie, - * or we there was no blockno in the cookie (eg: first time thru), - * the we start at the top of the Btree and re-find our hashval. - */ - if (bp == NULL) { - xfs_dir_trace_g_du("node: start at root" , dp, uio); - bno = 0; - for (;;) { - error = xfs_da_read_buf(trans, dp, bno, -1, &bp, - XFS_DATA_FORK); - if (error) - return(error); - if (bp == NULL) - return(XFS_ERROR(EFSCORRUPTED)); - node = bp->data; - if (be16_to_cpu(node->hdr.info.magic) != XFS_DA_NODE_MAGIC) - break; - btree = &node->btree[0]; - xfs_dir_trace_g_dun("node: node detail", dp, uio, node); - for (i = 0; i < be16_to_cpu(node->hdr.count); btree++, i++) { - if (be32_to_cpu(btree->hashval) >= cookhash) { - bno = be32_to_cpu(btree->before); - break; - } - } - if (i == be16_to_cpu(node->hdr.count)) { - xfs_da_brelse(trans, bp); - xfs_dir_trace_g_du("node: hash beyond EOF", - dp, uio); - uio->uio_offset = XFS_DA_MAKE_COOKIE(mp, 0, 0, - XFS_DA_MAXHASH); - *eofp = 1; - return(0); - } - xfs_dir_trace_g_dub("node: going to block", - dp, uio, bno); - xfs_da_brelse(trans, bp); - } - } - ASSERT(cookhash != XFS_DA_MAXHASH); - - /* - * We've dropped down to the (first) leaf block that contains the - * hashval we are interested in. Continue rolling upward thru the - * leaf blocks until we fill up our buffer. - */ - for (;;) { - leaf = bp->data; - if (unlikely(be16_to_cpu(leaf->hdr.info.magic) != XFS_DIR_LEAF_MAGIC)) { - xfs_dir_trace_g_dul("node: not a leaf", dp, uio, leaf); - xfs_da_brelse(trans, bp); - XFS_CORRUPTION_ERROR("xfs_dir_node_getdents(1)", - XFS_ERRLEVEL_LOW, mp, leaf); - return XFS_ERROR(EFSCORRUPTED); - } - xfs_dir_trace_g_dul("node: leaf detail", dp, uio, leaf); - if ((nextbno = be32_to_cpu(leaf->hdr.info.forw))) { - nextda = xfs_da_reada_buf(trans, dp, nextbno, - XFS_DATA_FORK); - } else - nextda = -1; - error = xfs_dir_leaf_getdents_int(bp, dp, bno, uio, &eob, dbp, - put, nextda); - xfs_da_brelse(trans, bp); - bno = nextbno; - if (eob) { - xfs_dir_trace_g_dub("node: E-O-B", dp, uio, bno); - *eofp = 0; - return(error); - } - if (bno == 0) - break; - error = xfs_da_read_buf(trans, dp, bno, nextda, &bp, - XFS_DATA_FORK); - if (error) - return(error); - if (unlikely(bp == NULL)) { - XFS_ERROR_REPORT("xfs_dir_node_getdents(2)", - XFS_ERRLEVEL_LOW, mp); - return(XFS_ERROR(EFSCORRUPTED)); - } - } - *eofp = 1; - xfs_dir_trace_g_du("node: E-O-F", dp, uio); - return(0); -} - -/* - * Look up a filename in an int directory, replace the inode number. - * Use an internal routine to actually do the lookup. - */ -STATIC int -xfs_dir_node_replace(xfs_da_args_t *args) -{ - xfs_da_state_t *state; - xfs_da_state_blk_t *blk; - xfs_dir_leafblock_t *leaf; - xfs_dir_leaf_entry_t *entry; - xfs_dir_leaf_name_t *namest; - xfs_ino_t inum; - int retval, error, i; - xfs_dabuf_t *bp; - - state = xfs_da_state_alloc(); - state->args = args; - state->mp = args->dp->i_mount; - state->blocksize = state->mp->m_sb.sb_blocksize; - state->node_ents = state->mp->m_dir_node_ents; - inum = args->inumber; - - /* - * Search to see if name exists, - * and get back a pointer to it. - */ - error = xfs_da_node_lookup_int(state, &retval); - if (error) { - retval = error; - } - - if (retval == EEXIST) { - blk = &state->path.blk[state->path.active - 1]; - ASSERT(blk->magic == XFS_DIR_LEAF_MAGIC); - bp = blk->bp; - leaf = bp->data; - entry = &leaf->entries[blk->index]; - namest = XFS_DIR_LEAF_NAMESTRUCT(leaf, INT_GET(entry->nameidx, ARCH_CONVERT)); - /* XXX - replace assert ? */ - XFS_DIR_SF_PUT_DIRINO(&inum, &namest->inumber); - xfs_da_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, namest, sizeof(namest->inumber))); - xfs_da_buf_done(bp); - blk->bp = NULL; - retval = 0; - } else { - i = state->path.active - 1; - xfs_da_brelse(args->trans, state->path.blk[i].bp); - state->path.blk[i].bp = NULL; - } - for (i = 0; i < state->path.active - 1; i++) { - xfs_da_brelse(args->trans, state->path.blk[i].bp); - state->path.blk[i].bp = NULL; - } - - xfs_da_state_free(state); - return(retval); -} - -#if defined(XFS_DIR_TRACE) -/* - * Add a trace buffer entry for an inode and a uio. - */ -void -xfs_dir_trace_g_du(char *where, xfs_inode_t *dp, uio_t *uio) -{ - xfs_dir_trace_enter(XFS_DIR_KTRACE_G_DU, where, - (void *)dp, (void *)dp->i_mount, - (void *)((unsigned long)(uio->uio_offset >> 32)), - (void *)((unsigned long)(uio->uio_offset & 0xFFFFFFFF)), - (void *)(unsigned long)uio->uio_resid, - NULL, NULL, NULL, NULL, NULL, NULL, NULL); -} - -/* - * Add a trace buffer entry for an inode and a uio. - */ -void -xfs_dir_trace_g_dub(char *where, xfs_inode_t *dp, uio_t *uio, xfs_dablk_t bno) -{ - xfs_dir_trace_enter(XFS_DIR_KTRACE_G_DUB, where, - (void *)dp, (void *)dp->i_mount, - (void *)((unsigned long)(uio->uio_offset >> 32)), - (void *)((unsigned long)(uio->uio_offset & 0xFFFFFFFF)), - (void *)(unsigned long)uio->uio_resid, - (void *)(unsigned long)bno, - NULL, NULL, NULL, NULL, NULL, NULL); -} - -/* - * Add a trace buffer entry for an inode and a uio. - */ -void -xfs_dir_trace_g_dun(char *where, xfs_inode_t *dp, uio_t *uio, - xfs_da_intnode_t *node) -{ - int last = be16_to_cpu(node->hdr.count) - 1; - - xfs_dir_trace_enter(XFS_DIR_KTRACE_G_DUN, where, - (void *)dp, (void *)dp->i_mount, - (void *)((unsigned long)(uio->uio_offset >> 32)), - (void *)((unsigned long)(uio->uio_offset & 0xFFFFFFFF)), - (void *)(unsigned long)uio->uio_resid, - (void *)(unsigned long)be32_to_cpu(node->hdr.info.forw), - (void *)(unsigned long) - be16_to_cpu(node->hdr.count), - (void *)(unsigned long) - be32_to_cpu(node->btree[0].hashval), - (void *)(unsigned long) - be32_to_cpu(node->btree[last].hashval), - NULL, NULL, NULL); -} - -/* - * Add a trace buffer entry for an inode and a uio. - */ -void -xfs_dir_trace_g_dul(char *where, xfs_inode_t *dp, uio_t *uio, - xfs_dir_leafblock_t *leaf) -{ - int last = INT_GET(leaf->hdr.count, ARCH_CONVERT) - 1; - - xfs_dir_trace_enter(XFS_DIR_KTRACE_G_DUL, where, - (void *)dp, (void *)dp->i_mount, - (void *)((unsigned long)(uio->uio_offset >> 32)), - (void *)((unsigned long)(uio->uio_offset & 0xFFFFFFFF)), - (void *)(unsigned long)uio->uio_resid, - (void *)(unsigned long)be32_to_cpu(leaf->hdr.info.forw), - (void *)(unsigned long) - INT_GET(leaf->hdr.count, ARCH_CONVERT), - (void *)(unsigned long) - INT_GET(leaf->entries[0].hashval, ARCH_CONVERT), - (void *)(unsigned long) - INT_GET(leaf->entries[last].hashval, ARCH_CONVERT), - NULL, NULL, NULL); -} - -/* - * Add a trace buffer entry for an inode and a uio. - */ -void -xfs_dir_trace_g_due(char *where, xfs_inode_t *dp, uio_t *uio, - xfs_dir_leaf_entry_t *entry) -{ - xfs_dir_trace_enter(XFS_DIR_KTRACE_G_DUE, where, - (void *)dp, (void *)dp->i_mount, - (void *)((unsigned long)(uio->uio_offset >> 32)), - (void *)((unsigned long)(uio->uio_offset & 0xFFFFFFFF)), - (void *)(unsigned long)uio->uio_resid, - (void *)(unsigned long) - INT_GET(entry->hashval, ARCH_CONVERT), - NULL, NULL, NULL, NULL, NULL, NULL); -} - -/* - * Add a trace buffer entry for an inode and a uio. - */ -void -xfs_dir_trace_g_duc(char *where, xfs_inode_t *dp, uio_t *uio, xfs_off_t cookie) -{ - xfs_dir_trace_enter(XFS_DIR_KTRACE_G_DUC, where, - (void *)dp, (void *)dp->i_mount, - (void *)((unsigned long)(uio->uio_offset >> 32)), - (void *)((unsigned long)(uio->uio_offset & 0xFFFFFFFF)), - (void *)(unsigned long)uio->uio_resid, - (void *)((unsigned long)(cookie >> 32)), - (void *)((unsigned long)(cookie & 0xFFFFFFFF)), - NULL, NULL, NULL, NULL, NULL); -} - -/* - * Add a trace buffer entry for the arguments given to the routine, - * generic form. - */ -void -xfs_dir_trace_enter(int type, char *where, - void * a0, void * a1, - void * a2, void * a3, - void * a4, void * a5, - void * a6, void * a7, - void * a8, void * a9, - void * a10, void * a11) -{ - ASSERT(xfs_dir_trace_buf); - ktrace_enter(xfs_dir_trace_buf, (void *)(unsigned long)type, - (void *)where, - (void *)a0, (void *)a1, (void *)a2, - (void *)a3, (void *)a4, (void *)a5, - (void *)a6, (void *)a7, (void *)a8, - (void *)a9, (void *)a10, (void *)a11, - NULL, NULL); -} -#endif /* XFS_DIR_TRACE */ diff --git a/fs/xfs/xfs_dir.h b/fs/xfs/xfs_dir.h deleted file mode 100644 index 8cc8afb9f..000000000 --- a/fs/xfs/xfs_dir.h +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (c) 2000,2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would 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 the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_DIR_H__ -#define __XFS_DIR_H__ - -/* - * Large directories are structured around Btrees where all the data - * elements are in the leaf nodes. Filenames are hashed into an int, - * then that int is used as the index into the Btree. Since the hashval - * of a filename may not be unique, we may have duplicate keys. The - * internal links in the Btree are logical block offsets into the file. - * - * Small directories use a different format and are packed as tightly - * as possible so as to fit into the literal area of the inode. - */ - -/*======================================================================== - * Function prototypes for the kernel. - *========================================================================*/ - -struct uio; -struct xfs_bmap_free; -struct xfs_da_args; -struct xfs_dinode; -struct xfs_inode; -struct xfs_mount; -struct xfs_trans; - -/* - * Directory function types. - * Put in structures (xfs_dirops_t) for v1 and v2 directories. - */ -typedef void (*xfs_dir_mount_t)(struct xfs_mount *mp); -typedef int (*xfs_dir_isempty_t)(struct xfs_inode *dp); -typedef int (*xfs_dir_init_t)(struct xfs_trans *tp, - struct xfs_inode *dp, - struct xfs_inode *pdp); -typedef int (*xfs_dir_createname_t)(struct xfs_trans *tp, - struct xfs_inode *dp, - char *name, - int namelen, - xfs_ino_t inum, - xfs_fsblock_t *first, - struct xfs_bmap_free *flist, - xfs_extlen_t total); -typedef int (*xfs_dir_lookup_t)(struct xfs_trans *tp, - struct xfs_inode *dp, - char *name, - int namelen, - xfs_ino_t *inum); -typedef int (*xfs_dir_removename_t)(struct xfs_trans *tp, - struct xfs_inode *dp, - char *name, - int namelen, - xfs_ino_t ino, - xfs_fsblock_t *first, - struct xfs_bmap_free *flist, - xfs_extlen_t total); -typedef int (*xfs_dir_getdents_t)(struct xfs_trans *tp, - struct xfs_inode *dp, - struct uio *uio, - int *eofp); -typedef int (*xfs_dir_replace_t)(struct xfs_trans *tp, - struct xfs_inode *dp, - char *name, - int namelen, - xfs_ino_t inum, - xfs_fsblock_t *first, - struct xfs_bmap_free *flist, - xfs_extlen_t total); -typedef int (*xfs_dir_canenter_t)(struct xfs_trans *tp, - struct xfs_inode *dp, - char *name, - int namelen); -typedef int (*xfs_dir_shortform_validate_ondisk_t)(struct xfs_mount *mp, - struct xfs_dinode *dip); -typedef int (*xfs_dir_shortform_to_single_t)(struct xfs_da_args *args); - -typedef struct xfs_dirops { - xfs_dir_mount_t xd_mount; - xfs_dir_isempty_t xd_isempty; - xfs_dir_init_t xd_init; - xfs_dir_createname_t xd_createname; - xfs_dir_lookup_t xd_lookup; - xfs_dir_removename_t xd_removename; - xfs_dir_getdents_t xd_getdents; - xfs_dir_replace_t xd_replace; - xfs_dir_canenter_t xd_canenter; - xfs_dir_shortform_validate_ondisk_t xd_shortform_validate_ondisk; - xfs_dir_shortform_to_single_t xd_shortform_to_single; -} xfs_dirops_t; - -/* - * Overall external interface routines. - */ -void xfs_dir_startup(void); /* called exactly once */ - -#define XFS_DIR_MOUNT(mp) \ - ((mp)->m_dirops.xd_mount(mp)) -#define XFS_DIR_ISEMPTY(mp,dp) \ - ((mp)->m_dirops.xd_isempty(dp)) -#define XFS_DIR_INIT(mp,tp,dp,pdp) \ - ((mp)->m_dirops.xd_init(tp,dp,pdp)) -#define XFS_DIR_CREATENAME(mp,tp,dp,name,namelen,inum,first,flist,total) \ - ((mp)->m_dirops.xd_createname(tp,dp,name,namelen,inum,first,flist,\ - total)) -#define XFS_DIR_LOOKUP(mp,tp,dp,name,namelen,inum) \ - ((mp)->m_dirops.xd_lookup(tp,dp,name,namelen,inum)) -#define XFS_DIR_REMOVENAME(mp,tp,dp,name,namelen,ino,first,flist,total) \ - ((mp)->m_dirops.xd_removename(tp,dp,name,namelen,ino,first,flist,total)) -#define XFS_DIR_GETDENTS(mp,tp,dp,uio,eofp) \ - ((mp)->m_dirops.xd_getdents(tp,dp,uio,eofp)) -#define XFS_DIR_REPLACE(mp,tp,dp,name,namelen,inum,first,flist,total) \ - ((mp)->m_dirops.xd_replace(tp,dp,name,namelen,inum,first,flist,total)) -#define XFS_DIR_CANENTER(mp,tp,dp,name,namelen) \ - ((mp)->m_dirops.xd_canenter(tp,dp,name,namelen)) -#define XFS_DIR_SHORTFORM_VALIDATE_ONDISK(mp,dip) \ - ((mp)->m_dirops.xd_shortform_validate_ondisk(mp,dip)) -#define XFS_DIR_SHORTFORM_TO_SINGLE(mp,args) \ - ((mp)->m_dirops.xd_shortform_to_single(args)) - -#define XFS_DIR_IS_V1(mp) ((mp)->m_dirversion == 1) -#define XFS_DIR_IS_V2(mp) ((mp)->m_dirversion == 2) -extern xfs_dirops_t xfsv1_dirops; -extern xfs_dirops_t xfsv2_dirops; - -#endif /* __XFS_DIR_H__ */ diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 022c8398a..8edbe1adb 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -24,21 +24,18 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" #include "xfs_bmap.h" -#include "xfs_dir_leaf.h" #include "xfs_dir2_data.h" #include "xfs_dir2_leaf.h" #include "xfs_dir2_block.h" @@ -46,69 +43,14 @@ #include "xfs_dir2_trace.h" #include "xfs_error.h" -/* - * Declarations for interface routines. - */ -static void xfs_dir2_mount(xfs_mount_t *mp); -static int xfs_dir2_isempty(xfs_inode_t *dp); -static int xfs_dir2_init(xfs_trans_t *tp, xfs_inode_t *dp, - xfs_inode_t *pdp); -static int xfs_dir2_createname(xfs_trans_t *tp, xfs_inode_t *dp, - char *name, int namelen, xfs_ino_t inum, - xfs_fsblock_t *first, - xfs_bmap_free_t *flist, xfs_extlen_t total); -static int xfs_dir2_lookup(xfs_trans_t *tp, xfs_inode_t *dp, char *name, - int namelen, xfs_ino_t *inum); -static int xfs_dir2_removename(xfs_trans_t *tp, xfs_inode_t *dp, - char *name, int namelen, xfs_ino_t ino, - xfs_fsblock_t *first, - xfs_bmap_free_t *flist, xfs_extlen_t total); -static int xfs_dir2_getdents(xfs_trans_t *tp, xfs_inode_t *dp, uio_t *uio, - int *eofp); -static int xfs_dir2_replace(xfs_trans_t *tp, xfs_inode_t *dp, char *name, - int namelen, xfs_ino_t inum, - xfs_fsblock_t *first, xfs_bmap_free_t *flist, - xfs_extlen_t total); -static int xfs_dir2_canenter(xfs_trans_t *tp, xfs_inode_t *dp, char *name, - int namelen); -static int xfs_dir2_shortform_validate_ondisk(xfs_mount_t *mp, - xfs_dinode_t *dip); - -/* - * Utility routine declarations. - */ static int xfs_dir2_put_dirent64_direct(xfs_dir2_put_args_t *pa); static int xfs_dir2_put_dirent64_uio(xfs_dir2_put_args_t *pa); -/* - * Directory operations vector. - */ -xfs_dirops_t xfsv2_dirops = { - .xd_mount = xfs_dir2_mount, - .xd_isempty = xfs_dir2_isempty, - .xd_init = xfs_dir2_init, - .xd_createname = xfs_dir2_createname, - .xd_lookup = xfs_dir2_lookup, - .xd_removename = xfs_dir2_removename, - .xd_getdents = xfs_dir2_getdents, - .xd_replace = xfs_dir2_replace, - .xd_canenter = xfs_dir2_canenter, - .xd_shortform_validate_ondisk = xfs_dir2_shortform_validate_ondisk, - .xd_shortform_to_single = xfs_dir2_sf_to_block, -}; - -/* - * Interface routines. - */ - -/* - * Initialize directory-related fields in the mount structure. - */ -static void -xfs_dir2_mount( - xfs_mount_t *mp) /* filesystem mount point */ +void +xfs_dir_mount( + xfs_mount_t *mp) { - mp->m_dirversion = 2; + ASSERT(XFS_SB_VERSION_HASDIRV2(&mp->m_sb)); ASSERT((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) <= XFS_MAX_BLOCKSIZE); mp->m_dirblksize = 1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog); @@ -128,73 +70,99 @@ xfs_dir2_mount( /* * Return 1 if directory contains only "." and "..". */ -static int /* return code */ -xfs_dir2_isempty( - xfs_inode_t *dp) /* incore inode structure */ +int +xfs_dir_isempty( + xfs_inode_t *dp) { - xfs_dir2_sf_t *sfp; /* shortform directory structure */ + xfs_dir2_sf_t *sfp; ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); - /* - * Might happen during shutdown. - */ - if (dp->i_d.di_size == 0) { + if (dp->i_d.di_size == 0) /* might happen during shutdown. */ return 1; - } if (dp->i_d.di_size > XFS_IFORK_DSIZE(dp)) return 0; sfp = (xfs_dir2_sf_t *)dp->i_df.if_u1.if_data; return !sfp->hdr.count; } +/* + * Validate a given inode number. + */ +int +xfs_dir_ino_validate( + xfs_mount_t *mp, + xfs_ino_t ino) +{ + xfs_agblock_t agblkno; + xfs_agino_t agino; + xfs_agnumber_t agno; + int ino_ok; + int ioff; + + agno = XFS_INO_TO_AGNO(mp, ino); + agblkno = XFS_INO_TO_AGBNO(mp, ino); + ioff = XFS_INO_TO_OFFSET(mp, ino); + agino = XFS_OFFBNO_TO_AGINO(mp, agblkno, ioff); + ino_ok = + agno < mp->m_sb.sb_agcount && + agblkno < mp->m_sb.sb_agblocks && + agblkno != 0 && + ioff < (1 << mp->m_sb.sb_inopblog) && + XFS_AGINO_TO_INO(mp, agno, agino) == ino; + if (unlikely(XFS_TEST_ERROR(!ino_ok, mp, XFS_ERRTAG_DIR_INO_VALIDATE, + XFS_RANDOM_DIR_INO_VALIDATE))) { + xfs_fs_cmn_err(CE_WARN, mp, "Invalid inode number 0x%Lx", + (unsigned long long) ino); + XFS_ERROR_REPORT("xfs_dir_ino_validate", XFS_ERRLEVEL_LOW, mp); + return XFS_ERROR(EFSCORRUPTED); + } + return 0; +} + /* * Initialize a directory with its "." and ".." entries. */ -static int /* error */ -xfs_dir2_init( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *dp, /* incore directory inode */ - xfs_inode_t *pdp) /* incore parent directory inode */ +int +xfs_dir_init( + xfs_trans_t *tp, + xfs_inode_t *dp, + xfs_inode_t *pdp) { - xfs_da_args_t args; /* operation arguments */ - int error; /* error return value */ + xfs_da_args_t args; + int error; memset((char *)&args, 0, sizeof(args)); args.dp = dp; args.trans = tp; ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); - if ((error = xfs_dir_ino_validate(tp->t_mountp, pdp->i_ino))) { + if ((error = xfs_dir_ino_validate(tp->t_mountp, pdp->i_ino))) return error; - } return xfs_dir2_sf_create(&args, pdp->i_ino); } /* Enter a name in a directory. */ -static int /* error */ -xfs_dir2_createname( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *dp, /* incore directory inode */ - char *name, /* new entry name */ - int namelen, /* new entry name length */ +int +xfs_dir_createname( + xfs_trans_t *tp, + xfs_inode_t *dp, + char *name, + int namelen, xfs_ino_t inum, /* new entry inode number */ xfs_fsblock_t *first, /* bmap's firstblock */ xfs_bmap_free_t *flist, /* bmap's freeblock list */ xfs_extlen_t total) /* bmap's total block count */ { - xfs_da_args_t args; /* operation arguments */ - int rval; /* return value */ + xfs_da_args_t args; + int rval; int v; /* type-checking value */ ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); - if ((rval = xfs_dir_ino_validate(tp->t_mountp, inum))) { + if ((rval = xfs_dir_ino_validate(tp->t_mountp, inum))) return rval; - } XFS_STATS_INC(xs_dir_create); - /* - * Fill in the arg structure for this request. - */ + args.name = name; args.namelen = namelen; args.hashval = xfs_da_hashname(name, namelen); @@ -207,18 +175,16 @@ xfs_dir2_createname( args.trans = tp; args.justcheck = 0; args.addname = args.oknoent = 1; - /* - * Decide on what work routines to call based on the inode size. - */ + if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) rval = xfs_dir2_sf_addname(&args); - else if ((rval = xfs_dir2_isblock(tp, dp, &v))) { + else if ((rval = xfs_dir2_isblock(tp, dp, &v))) return rval; - } else if (v) + else if (v) rval = xfs_dir2_block_addname(&args); - else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) { + else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) return rval; - } else if (v) + else if (v) rval = xfs_dir2_leaf_addname(&args); else rval = xfs_dir2_node_addname(&args); @@ -228,24 +194,21 @@ xfs_dir2_createname( /* * Lookup a name in a directory, give back the inode number. */ -static int /* error */ -xfs_dir2_lookup( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *dp, /* incore directory inode */ - char *name, /* lookup name */ - int namelen, /* lookup name length */ +int +xfs_dir_lookup( + xfs_trans_t *tp, + xfs_inode_t *dp, + char *name, + int namelen, xfs_ino_t *inum) /* out: inode number */ { - xfs_da_args_t args; /* operation arguments */ - int rval; /* return value */ + xfs_da_args_t args; + int rval; int v; /* type-checking value */ ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); XFS_STATS_INC(xs_dir_lookup); - /* - * Fill in the arg structure for this request. - */ args.name = name; args.namelen = namelen; args.hashval = xfs_da_hashname(name, namelen); @@ -258,18 +221,16 @@ xfs_dir2_lookup( args.trans = tp; args.justcheck = args.addname = 0; args.oknoent = 1; - /* - * Decide on what work routines to call based on the inode size. - */ + if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) rval = xfs_dir2_sf_lookup(&args); - else if ((rval = xfs_dir2_isblock(tp, dp, &v))) { + else if ((rval = xfs_dir2_isblock(tp, dp, &v))) return rval; - } else if (v) + else if (v) rval = xfs_dir2_block_lookup(&args); - else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) { + else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) return rval; - } else if (v) + else if (v) rval = xfs_dir2_leaf_lookup(&args); else rval = xfs_dir2_node_lookup(&args); @@ -283,26 +244,24 @@ xfs_dir2_lookup( /* * Remove an entry from a directory. */ -static int /* error */ -xfs_dir2_removename( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *dp, /* incore directory inode */ - char *name, /* name of entry to remove */ - int namelen, /* name length of entry to remove */ - xfs_ino_t ino, /* inode number of entry to remove */ +int +xfs_dir_removename( + xfs_trans_t *tp, + xfs_inode_t *dp, + char *name, + int namelen, + xfs_ino_t ino, xfs_fsblock_t *first, /* bmap's firstblock */ xfs_bmap_free_t *flist, /* bmap's freeblock list */ xfs_extlen_t total) /* bmap's total block count */ { - xfs_da_args_t args; /* operation arguments */ - int rval; /* return value */ + xfs_da_args_t args; + int rval; int v; /* type-checking value */ ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); XFS_STATS_INC(xs_dir_remove); - /* - * Fill in the arg structure for this request. - */ + args.name = name; args.namelen = namelen; args.hashval = xfs_da_hashname(name, namelen); @@ -314,18 +273,16 @@ xfs_dir2_removename( args.whichfork = XFS_DATA_FORK; args.trans = tp; args.justcheck = args.addname = args.oknoent = 0; - /* - * Decide on what work routines to call based on the inode size. - */ + if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) rval = xfs_dir2_sf_removename(&args); - else if ((rval = xfs_dir2_isblock(tp, dp, &v))) { + else if ((rval = xfs_dir2_isblock(tp, dp, &v))) return rval; - } else if (v) + else if (v) rval = xfs_dir2_block_removename(&args); - else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) { + else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) return rval; - } else if (v) + else if (v) rval = xfs_dir2_leaf_removename(&args); else rval = xfs_dir2_node_removename(&args); @@ -335,10 +292,10 @@ xfs_dir2_removename( /* * Read a directory. */ -static int /* error */ -xfs_dir2_getdents( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *dp, /* incore directory inode */ +int +xfs_dir_getdents( + xfs_trans_t *tp, + xfs_inode_t *dp, uio_t *uio, /* caller's buffer control */ int *eofp) /* out: eof reached */ { @@ -367,14 +324,11 @@ xfs_dir2_getdents( } *eofp = 0; - /* - * Decide on what work routines to call based on the inode size. - */ if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) rval = xfs_dir2_sf_getdents(dp, uio, eofp, dbp, put); - else if ((rval = xfs_dir2_isblock(tp, dp, &v))) { + else if ((rval = xfs_dir2_isblock(tp, dp, &v))) ; - } else if (v) + else if (v) rval = xfs_dir2_block_getdents(tp, dp, uio, eofp, dbp, put); else rval = xfs_dir2_leaf_getdents(tp, dp, uio, eofp, dbp, put); @@ -386,29 +340,26 @@ xfs_dir2_getdents( /* * Replace the inode number of a directory entry. */ -static int /* error */ -xfs_dir2_replace( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *dp, /* incore directory inode */ +int +xfs_dir_replace( + xfs_trans_t *tp, + xfs_inode_t *dp, char *name, /* name of entry to replace */ - int namelen, /* name length of entry to replace */ + int namelen, xfs_ino_t inum, /* new inode number */ xfs_fsblock_t *first, /* bmap's firstblock */ xfs_bmap_free_t *flist, /* bmap's freeblock list */ xfs_extlen_t total) /* bmap's total block count */ { - xfs_da_args_t args; /* operation arguments */ - int rval; /* return value */ + xfs_da_args_t args; + int rval; int v; /* type-checking value */ ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); - if ((rval = xfs_dir_ino_validate(tp->t_mountp, inum))) { + if ((rval = xfs_dir_ino_validate(tp->t_mountp, inum))) return rval; - } - /* - * Fill in the arg structure for this request. - */ + args.name = name; args.namelen = namelen; args.hashval = xfs_da_hashname(name, namelen); @@ -420,18 +371,16 @@ xfs_dir2_replace( args.whichfork = XFS_DATA_FORK; args.trans = tp; args.justcheck = args.addname = args.oknoent = 0; - /* - * Decide on what work routines to call based on the inode size. - */ + if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) rval = xfs_dir2_sf_replace(&args); - else if ((rval = xfs_dir2_isblock(tp, dp, &v))) { + else if ((rval = xfs_dir2_isblock(tp, dp, &v))) return rval; - } else if (v) + else if (v) rval = xfs_dir2_block_replace(&args); - else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) { + else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) return rval; - } else if (v) + else if (v) rval = xfs_dir2_leaf_replace(&args); else rval = xfs_dir2_node_replace(&args); @@ -441,21 +390,19 @@ xfs_dir2_replace( /* * See if this entry can be added to the directory without allocating space. */ -static int /* error */ -xfs_dir2_canenter( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *dp, /* incore directory inode */ +int +xfs_dir_canenter( + xfs_trans_t *tp, + xfs_inode_t *dp, char *name, /* name of entry to add */ - int namelen) /* name length of entry to add */ + int namelen) { - xfs_da_args_t args; /* operation arguments */ - int rval; /* return value */ + xfs_da_args_t args; + int rval; int v; /* type-checking value */ ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); - /* - * Fill in the arg structure for this request. - */ + args.name = name; args.namelen = namelen; args.hashval = xfs_da_hashname(name, namelen); @@ -467,37 +414,22 @@ xfs_dir2_canenter( args.whichfork = XFS_DATA_FORK; args.trans = tp; args.justcheck = args.addname = args.oknoent = 1; - /* - * Decide on what work routines to call based on the inode size. - */ + if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) rval = xfs_dir2_sf_addname(&args); - else if ((rval = xfs_dir2_isblock(tp, dp, &v))) { + else if ((rval = xfs_dir2_isblock(tp, dp, &v))) return rval; - } else if (v) + else if (v) rval = xfs_dir2_block_addname(&args); - else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) { + else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) return rval; - } else if (v) + else if (v) rval = xfs_dir2_leaf_addname(&args); else rval = xfs_dir2_node_addname(&args); return rval; } -/* - * Dummy routine for shortform inode validation. - * Can't really do this. - */ -/* ARGSUSED */ -static int /* error */ -xfs_dir2_shortform_validate_ondisk( - xfs_mount_t *mp, /* filesystem mount point */ - xfs_dinode_t *dip) /* ondisk inode */ -{ - return 0; -} - /* * Utility routines. */ @@ -507,24 +439,24 @@ xfs_dir2_shortform_validate_ondisk( * This routine is for data and free blocks, not leaf/node blocks * which are handled by xfs_da_grow_inode. */ -int /* error */ +int xfs_dir2_grow_inode( - xfs_da_args_t *args, /* operation arguments */ + xfs_da_args_t *args, int space, /* v2 dir's space XFS_DIR2_xxx_SPACE */ xfs_dir2_db_t *dbp) /* out: block number added */ { xfs_fileoff_t bno; /* directory offset of new block */ int count; /* count of filesystem blocks */ xfs_inode_t *dp; /* incore directory inode */ - int error; /* error return value */ + int error; int got; /* blocks actually mapped */ - int i; /* temp mapping index */ + int i; xfs_bmbt_irec_t map; /* single structure for bmap */ int mapi; /* mapping index */ xfs_bmbt_irec_t *mapp; /* bmap mapping structure(s) */ - xfs_mount_t *mp; /* filesystem mount point */ + xfs_mount_t *mp; int nmap; /* number of bmap entries */ - xfs_trans_t *tp; /* transaction pointer */ + xfs_trans_t *tp; xfs_dir2_trace_args_s("grow_inode", args, space); dp = args->dp; @@ -538,9 +470,8 @@ xfs_dir2_grow_inode( /* * Find the first hole for our block. */ - if ((error = xfs_bmap_first_unused(tp, dp, count, &bno, XFS_DATA_FORK))) { + if ((error = xfs_bmap_first_unused(tp, dp, count, &bno, XFS_DATA_FORK))) return error; - } nmap = 1; ASSERT(args->firstblock != NULL); /* @@ -549,13 +480,9 @@ xfs_dir2_grow_inode( if ((error = xfs_bmapi(tp, dp, bno, count, XFS_BMAPI_WRITE|XFS_BMAPI_METADATA|XFS_BMAPI_CONTIG, args->firstblock, args->total, &map, &nmap, - args->flist))) { + args->flist, NULL))) return error; - } ASSERT(nmap <= 1); - /* - * Got it in 1. - */ if (nmap == 1) { mapp = ↦ mapi = 1; @@ -585,7 +512,8 @@ xfs_dir2_grow_inode( if ((error = xfs_bmapi(tp, dp, b, c, XFS_BMAPI_WRITE|XFS_BMAPI_METADATA, args->firstblock, args->total, - &mapp[mapi], &nmap, args->flist))) { + &mapp[mapi], &nmap, args->flist, + NULL))) { kmem_free(mapp, sizeof(*mapp) * count); return error; } @@ -645,20 +573,19 @@ xfs_dir2_grow_inode( /* * See if the directory is a single-block form directory. */ -int /* error */ +int xfs_dir2_isblock( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *dp, /* incore directory inode */ + xfs_trans_t *tp, + xfs_inode_t *dp, int *vp) /* out: 1 is block, 0 is not block */ { xfs_fileoff_t last; /* last file offset */ - xfs_mount_t *mp; /* filesystem mount point */ - int rval; /* return value */ + xfs_mount_t *mp; + int rval; mp = dp->i_mount; - if ((rval = xfs_bmap_last_offset(tp, dp, &last, XFS_DATA_FORK))) { + if ((rval = xfs_bmap_last_offset(tp, dp, &last, XFS_DATA_FORK))) return rval; - } rval = XFS_FSB_TO_B(mp, last) == mp->m_dirblksize; ASSERT(rval == 0 || dp->i_d.di_size == mp->m_dirblksize); *vp = rval; @@ -668,20 +595,19 @@ xfs_dir2_isblock( /* * See if the directory is a single-leaf form directory. */ -int /* error */ +int xfs_dir2_isleaf( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *dp, /* incore directory inode */ + xfs_trans_t *tp, + xfs_inode_t *dp, int *vp) /* out: 1 is leaf, 0 is not leaf */ { xfs_fileoff_t last; /* last file offset */ - xfs_mount_t *mp; /* filesystem mount point */ - int rval; /* return value */ + xfs_mount_t *mp; + int rval; mp = dp->i_mount; - if ((rval = xfs_bmap_last_offset(tp, dp, &last, XFS_DATA_FORK))) { + if ((rval = xfs_bmap_last_offset(tp, dp, &last, XFS_DATA_FORK))) return rval; - } *vp = last == mp->m_dirleafblk + (1 << mp->m_sb.sb_dirblklog); return 0; } @@ -689,9 +615,9 @@ xfs_dir2_isleaf( /* * Getdents put routine for 64-bit ABI, direct form. */ -static int /* error */ +static int xfs_dir2_put_dirent64_direct( - xfs_dir2_put_args_t *pa) /* argument bundle */ + xfs_dir2_put_args_t *pa) { xfs_dirent_t *idbp; /* dirent pointer */ iovec_t *iovp; /* io vector */ @@ -726,9 +652,9 @@ xfs_dir2_put_dirent64_direct( /* * Getdents put routine for 64-bit ABI, uio form. */ -static int /* error */ +static int xfs_dir2_put_dirent64_uio( - xfs_dir2_put_args_t *pa) /* argument bundle */ + xfs_dir2_put_args_t *pa) { xfs_dirent_t *idbp; /* dirent pointer */ int namelen; /* entry name length */ @@ -764,17 +690,17 @@ xfs_dir2_put_dirent64_uio( */ int xfs_dir2_shrink_inode( - xfs_da_args_t *args, /* operation arguments */ - xfs_dir2_db_t db, /* directory block number */ - xfs_dabuf_t *bp) /* block's buffer */ + xfs_da_args_t *args, + xfs_dir2_db_t db, + xfs_dabuf_t *bp) { xfs_fileoff_t bno; /* directory file offset */ xfs_dablk_t da; /* directory file offset */ int done; /* bunmap is finished */ - xfs_inode_t *dp; /* incore directory inode */ - int error; /* error return value */ - xfs_mount_t *mp; /* filesystem mount point */ - xfs_trans_t *tp; /* transaction pointer */ + xfs_inode_t *dp; + int error; + xfs_mount_t *mp; + xfs_trans_t *tp; xfs_dir2_trace_args_db("shrink_inode", args, db, bp); dp = args->dp; @@ -786,7 +712,7 @@ xfs_dir2_shrink_inode( */ if ((error = xfs_bunmapi(tp, dp, da, mp->m_dirblkfsbs, XFS_BMAPI_METADATA, 0, args->firstblock, args->flist, - &done))) { + NULL, &done))) { /* * ENOSPC actually can happen if we're in a removename with * no space reservation, and the resulting block removal diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index 7dd364b1e..86560b6f7 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h @@ -22,7 +22,9 @@ struct uio; struct xfs_dabuf; struct xfs_da_args; struct xfs_dir2_put_args; +struct xfs_bmap_free; struct xfs_inode; +struct xfs_mount; struct xfs_trans; /* @@ -73,7 +75,35 @@ typedef struct xfs_dir2_put_args { } xfs_dir2_put_args_t; /* - * Other interfaces used by the rest of the dir v2 code. + * Generic directory interface routines + */ +extern void xfs_dir_startup(void); +extern void xfs_dir_mount(struct xfs_mount *mp); +extern int xfs_dir_isempty(struct xfs_inode *dp); +extern int xfs_dir_init(struct xfs_trans *tp, struct xfs_inode *dp, + struct xfs_inode *pdp); +extern int xfs_dir_createname(struct xfs_trans *tp, struct xfs_inode *dp, + char *name, int namelen, xfs_ino_t inum, + xfs_fsblock_t *first, + struct xfs_bmap_free *flist, xfs_extlen_t tot); +extern int xfs_dir_lookup(struct xfs_trans *tp, struct xfs_inode *dp, + char *name, int namelen, xfs_ino_t *inum); +extern int xfs_dir_removename(struct xfs_trans *tp, struct xfs_inode *dp, + char *name, int namelen, xfs_ino_t ino, + xfs_fsblock_t *first, + struct xfs_bmap_free *flist, xfs_extlen_t tot); +extern int xfs_dir_getdents(struct xfs_trans *tp, struct xfs_inode *dp, + uio_t *uio, int *eofp); +extern int xfs_dir_replace(struct xfs_trans *tp, struct xfs_inode *dp, + char *name, int namelen, xfs_ino_t inum, + xfs_fsblock_t *first, + struct xfs_bmap_free *flist, xfs_extlen_t tot); +extern int xfs_dir_canenter(struct xfs_trans *tp, struct xfs_inode *dp, + char *name, int namelen); +extern int xfs_dir_ino_validate(struct xfs_mount *mp, xfs_ino_t ino); + +/* + * Utility routines for v2 directories. */ extern int xfs_dir2_grow_inode(struct xfs_da_args *args, int space, xfs_dir2_db_t *dbp); diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 972ded595..9d7438bba 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -22,19 +22,16 @@ #include "xfs_inum.h" #include "xfs_trans.h" #include "xfs_sb.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" -#include "xfs_dir_leaf.h" #include "xfs_dir2_data.h" #include "xfs_dir2_leaf.h" #include "xfs_dir2_block.h" @@ -51,6 +48,18 @@ static int xfs_dir2_block_lookup_int(xfs_da_args_t *args, xfs_dabuf_t **bpp, int *entno); static int xfs_dir2_block_sort(const void *a, const void *b); +static xfs_dahash_t xfs_dir_hash_dot, xfs_dir_hash_dotdot; + +/* + * One-time startup routine called from xfs_init(). + */ +void +xfs_dir_startup(void) +{ + xfs_dir_hash_dot = xfs_da_hashname(".", 1); + xfs_dir_hash_dotdot = xfs_da_hashname("..", 2); +} + /* * Add an entry to a block directory. */ @@ -400,7 +409,7 @@ xfs_dir2_block_addname( /* * Create the new data entry. */ - INT_SET(dep->inumber, ARCH_CONVERT, args->inumber); + dep->inumber = cpu_to_be64(args->inumber); dep->namelen = args->namelen; memcpy(dep->name, args->name, args->namelen); tagp = XFS_DIR2_DATA_ENTRY_TAG_P(dep); @@ -508,7 +517,7 @@ xfs_dir2_block_getdents( p.cook = XFS_DIR2_DB_OFF_TO_DATAPTR(mp, mp->m_dirdatablk, ptr - (char *)block); - p.ino = INT_GET(dep->inumber, ARCH_CONVERT); + p.ino = be64_to_cpu(dep->inumber); #if XFS_BIG_INUMS p.ino += mp->m_inoadd; #endif @@ -626,7 +635,7 @@ xfs_dir2_block_lookup( /* * Fill in inode number, release the block. */ - args->inumber = INT_GET(dep->inumber, ARCH_CONVERT); + args->inumber = be64_to_cpu(dep->inumber); xfs_da_brelse(args->trans, bp); return XFS_ERROR(EEXIST); } @@ -844,11 +853,11 @@ xfs_dir2_block_replace( */ dep = (xfs_dir2_data_entry_t *) ((char *)block + XFS_DIR2_DATAPTR_TO_OFF(mp, be32_to_cpu(blp[ent].address))); - ASSERT(INT_GET(dep->inumber, ARCH_CONVERT) != args->inumber); + ASSERT(be64_to_cpu(dep->inumber) != args->inumber); /* * Change the inode number to the new value. */ - INT_SET(dep->inumber, ARCH_CONVERT, args->inumber); + dep->inumber = cpu_to_be64(args->inumber); xfs_dir2_data_log_entry(args->trans, bp, dep); xfs_dir2_data_check(dp, bp); xfs_da_buf_done(bp); @@ -1130,7 +1139,7 @@ xfs_dir2_sf_to_block( */ dep = (xfs_dir2_data_entry_t *) ((char *)block + XFS_DIR2_DATA_DOT_OFFSET); - INT_SET(dep->inumber, ARCH_CONVERT, dp->i_ino); + dep->inumber = cpu_to_be64(dp->i_ino); dep->namelen = 1; dep->name[0] = '.'; tagp = XFS_DIR2_DATA_ENTRY_TAG_P(dep); @@ -1144,7 +1153,7 @@ xfs_dir2_sf_to_block( */ dep = (xfs_dir2_data_entry_t *) ((char *)block + XFS_DIR2_DATA_DOTDOT_OFFSET); - INT_SET(dep->inumber, ARCH_CONVERT, XFS_DIR2_SF_GET_INUMBER(sfp, &sfp->hdr.parent)); + dep->inumber = cpu_to_be64(XFS_DIR2_SF_GET_INUMBER(sfp, &sfp->hdr.parent)); dep->namelen = 2; dep->name[0] = dep->name[1] = '.'; tagp = XFS_DIR2_DATA_ENTRY_TAG_P(dep); @@ -1193,7 +1202,7 @@ xfs_dir2_sf_to_block( * Copy a real entry. */ dep = (xfs_dir2_data_entry_t *)((char *)block + newoffset); - INT_SET(dep->inumber, ARCH_CONVERT, XFS_DIR2_SF_GET_INUMBER(sfp, + dep->inumber = cpu_to_be64(XFS_DIR2_SF_GET_INUMBER(sfp, XFS_DIR2_SF_INUMBERP(sfep))); dep->namelen = sfep->namelen; memcpy(dep->name, sfep->name, dep->namelen); diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index bb3d03ff0..f7c799217 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -22,18 +22,15 @@ #include "xfs_inum.h" #include "xfs_trans.h" #include "xfs_sb.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" -#include "xfs_dir_leaf.h" #include "xfs_dir2_data.h" #include "xfs_dir2_leaf.h" #include "xfs_dir2_block.h" @@ -133,7 +130,7 @@ xfs_dir2_data_check( */ dep = (xfs_dir2_data_entry_t *)p; ASSERT(dep->namelen != 0); - ASSERT(xfs_dir_ino_validate(mp, INT_GET(dep->inumber, ARCH_CONVERT)) == 0); + ASSERT(xfs_dir_ino_validate(mp, be64_to_cpu(dep->inumber)) == 0); ASSERT(be16_to_cpu(*XFS_DIR2_DATA_ENTRY_TAG_P(dep)) == (char *)dep - (char *)d); count++; diff --git a/fs/xfs/xfs_dir2_data.h b/fs/xfs/xfs_dir2_data.h index 0847cbb53..a6ae2d21c 100644 --- a/fs/xfs/xfs_dir2_data.h +++ b/fs/xfs/xfs_dir2_data.h @@ -85,11 +85,11 @@ typedef struct xfs_dir2_data_hdr { * Tag appears as the last 2 bytes. */ typedef struct xfs_dir2_data_entry { - xfs_ino_t inumber; /* inode number */ - __uint8_t namelen; /* name length */ - __uint8_t name[1]; /* name bytes, no null */ + __be64 inumber; /* inode number */ + __u8 namelen; /* name length */ + __u8 name[1]; /* name bytes, no null */ /* variable offset */ - xfs_dir2_data_off_t tag; /* starting offset of us */ + __be16 tag; /* starting offset of us */ } xfs_dir2_data_entry_t; /* diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index 0f5e2f2ce..b1cf1fbf4 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -24,14 +24,12 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_attr_sf.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" @@ -407,7 +405,7 @@ xfs_dir2_leaf_addname( * Initialize our new entry (at last). */ dep = (xfs_dir2_data_entry_t *)dup; - INT_SET(dep->inumber, ARCH_CONVERT, args->inumber); + dep->inumber = cpu_to_be64(args->inumber); dep->namelen = args->namelen; memcpy(dep->name, args->name, dep->namelen); tagp = XFS_DIR2_DATA_ENTRY_TAG_P(dep); @@ -884,7 +882,7 @@ xfs_dir2_leaf_getdents( XFS_DIR2_BYTE_TO_DA(mp, XFS_DIR2_LEAF_OFFSET) - map_off, XFS_BMAPI_METADATA, NULL, 0, - &map[map_valid], &nmap, NULL); + &map[map_valid], &nmap, NULL, NULL); /* * Don't know if we should ignore this or * try to return an error. @@ -1098,7 +1096,7 @@ xfs_dir2_leaf_getdents( p->cook = XFS_DIR2_BYTE_TO_DATAPTR(mp, curoff + length); - p->ino = INT_GET(dep->inumber, ARCH_CONVERT); + p->ino = be64_to_cpu(dep->inumber); #if XFS_BIG_INUMS p->ino += mp->m_inoadd; #endif @@ -1319,7 +1317,7 @@ xfs_dir2_leaf_lookup( /* * Return the found inode number. */ - args->inumber = INT_GET(dep->inumber, ARCH_CONVERT); + args->inumber = be64_to_cpu(dep->inumber); xfs_da_brelse(tp, dbp); xfs_da_brelse(tp, lbp); return XFS_ERROR(EEXIST); @@ -1606,11 +1604,11 @@ xfs_dir2_leaf_replace( dep = (xfs_dir2_data_entry_t *) ((char *)dbp->data + XFS_DIR2_DATAPTR_TO_OFF(dp->i_mount, be32_to_cpu(lep->address))); - ASSERT(args->inumber != INT_GET(dep->inumber, ARCH_CONVERT)); + ASSERT(args->inumber != be64_to_cpu(dep->inumber)); /* * Put the new inode number in, log it. */ - INT_SET(dep->inumber, ARCH_CONVERT, args->inumber); + dep->inumber = cpu_to_be64(args->inumber); tp = args->trans; xfs_dir2_data_log_entry(tp, dbp, dep); xfs_da_buf_done(dbp); diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 0655cc3cb..9ca71719b 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -22,13 +22,11 @@ #include "xfs_inum.h" #include "xfs_trans.h" #include "xfs_sb.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -505,7 +503,6 @@ xfs_dir2_leafn_lookup_int( XFS_DATA_FORK))) { return error; } - curfdb = newfdb; free = curbp->data; ASSERT(be32_to_cpu(free->hdr.magic) == XFS_DIR2_FREE_MAGIC); @@ -527,8 +524,11 @@ xfs_dir2_leafn_lookup_int( if (unlikely(be16_to_cpu(free->bests[fi]) == NULLDATAOFF)) { XFS_ERROR_REPORT("xfs_dir2_leafn_lookup_int", XFS_ERRLEVEL_LOW, mp); + if (curfdb != newfdb) + xfs_da_brelse(tp, curbp); return XFS_ERROR(EFSCORRUPTED); } + curfdb = newfdb; if (be16_to_cpu(free->bests[fi]) >= length) { *indexp = index; state->extravalid = 1; @@ -580,7 +580,7 @@ xfs_dir2_leafn_lookup_int( if (dep->namelen == args->namelen && dep->name[0] == args->name[0] && memcmp(dep->name, args->name, args->namelen) == 0) { - args->inumber = INT_GET(dep->inumber, ARCH_CONVERT); + args->inumber = be64_to_cpu(dep->inumber); *indexp = index; state->extravalid = 1; state->extrablk.bp = curbp; @@ -1695,7 +1695,7 @@ xfs_dir2_node_addname_int( * Fill in the new entry and log it. */ dep = (xfs_dir2_data_entry_t *)dup; - INT_SET(dep->inumber, ARCH_CONVERT, args->inumber); + dep->inumber = cpu_to_be64(args->inumber); dep->namelen = args->namelen; memcpy(dep->name, args->name, dep->namelen); tagp = XFS_DIR2_DATA_ENTRY_TAG_P(dep); @@ -1905,11 +1905,11 @@ xfs_dir2_node_replace( dep = (xfs_dir2_data_entry_t *) ((char *)data + XFS_DIR2_DATAPTR_TO_OFF(state->mp, be32_to_cpu(lep->address))); - ASSERT(inum != INT_GET(dep->inumber, ARCH_CONVERT)); + ASSERT(inum != be64_to_cpu(dep->inumber)); /* * Fill in the new inode number and log the entry. */ - INT_SET(dep->inumber, ARCH_CONVERT, inum); + dep->inumber = cpu_to_be64(inum); xfs_dir2_data_log_entry(args->trans, state->extrablk.bp, dep); rval = 0; } diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index d98a41d1f..0cd77b17b 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -22,19 +22,16 @@ #include "xfs_inum.h" #include "xfs_trans.h" #include "xfs_sb.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" -#include "xfs_dir_leaf.h" #include "xfs_error.h" #include "xfs_dir2_data.h" #include "xfs_dir2_leaf.h" @@ -117,13 +114,13 @@ xfs_dir2_block_sfsize( dep->name[0] == '.' && dep->name[1] == '.'; #if XFS_BIG_INUMS if (!isdot) - i8count += INT_GET(dep->inumber, ARCH_CONVERT) > XFS_DIR2_MAX_SHORT_INUM; + i8count += be64_to_cpu(dep->inumber) > XFS_DIR2_MAX_SHORT_INUM; #endif if (!isdot && !isdotdot) { count++; namelen += dep->namelen; } else if (isdotdot) - parent = INT_GET(dep->inumber, ARCH_CONVERT); + parent = be64_to_cpu(dep->inumber); /* * Calculate the new size, see if we should give up yet. */ @@ -229,13 +226,13 @@ xfs_dir2_block_to_sf( * Skip . */ if (dep->namelen == 1 && dep->name[0] == '.') - ASSERT(INT_GET(dep->inumber, ARCH_CONVERT) == dp->i_ino); + ASSERT(be64_to_cpu(dep->inumber) == dp->i_ino); /* * Skip .., but make sure the inode number is right. */ else if (dep->namelen == 2 && dep->name[0] == '.' && dep->name[1] == '.') - ASSERT(INT_GET(dep->inumber, ARCH_CONVERT) == + ASSERT(be64_to_cpu(dep->inumber) == XFS_DIR2_SF_GET_INUMBER(sfp, &sfp->hdr.parent)); /* * Normal entry, copy it into shortform. @@ -246,7 +243,7 @@ xfs_dir2_block_to_sf( (xfs_dir2_data_aoff_t) ((char *)dep - (char *)block)); memcpy(sfep->name, dep->name, dep->namelen); - temp=INT_GET(dep->inumber, ARCH_CONVERT); + temp = be64_to_cpu(dep->inumber); XFS_DIR2_SF_PUT_INUMBER(sfp, &temp, XFS_DIR2_SF_INUMBERP(sfep)); sfep = XFS_DIR2_SF_NEXTENTRY(sfp, sfep); diff --git a/fs/xfs/xfs_dir2_trace.c b/fs/xfs/xfs_dir2_trace.c index c626943b4..f3fb2ffd6 100644 --- a/fs/xfs/xfs_dir2_trace.c +++ b/fs/xfs/xfs_dir2_trace.c @@ -19,11 +19,9 @@ #include "xfs_fs.h" #include "xfs_types.h" #include "xfs_inum.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" diff --git a/fs/xfs/xfs_dir_leaf.c b/fs/xfs/xfs_dir_leaf.c deleted file mode 100644 index 6d7118692..000000000 --- a/fs/xfs/xfs_dir_leaf.c +++ /dev/null @@ -1,2213 +0,0 @@ -/* - * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. - * 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. - * - * This program is distributed in the hope that it would 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 the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include "xfs.h" -#include "xfs_fs.h" -#include "xfs_types.h" -#include "xfs_log.h" -#include "xfs_inum.h" -#include "xfs_trans.h" -#include "xfs_sb.h" -#include "xfs_dir.h" -#include "xfs_dir2.h" -#include "xfs_dmapi.h" -#include "xfs_mount.h" -#include "xfs_da_btree.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" -#include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" -#include "xfs_dinode.h" -#include "xfs_inode.h" -#include "xfs_inode_item.h" -#include "xfs_alloc.h" -#include "xfs_btree.h" -#include "xfs_bmap.h" -#include "xfs_dir_leaf.h" -#include "xfs_error.h" - -/* - * xfs_dir_leaf.c - * - * Routines to implement leaf blocks of directories as Btrees of hashed names. - */ - -/*======================================================================== - * Function prototypes for the kernel. - *========================================================================*/ - -/* - * Routines used for growing the Btree. - */ -STATIC void xfs_dir_leaf_add_work(xfs_dabuf_t *leaf_buffer, xfs_da_args_t *args, - int insertion_index, - int freemap_index); -STATIC int xfs_dir_leaf_compact(xfs_trans_t *trans, xfs_dabuf_t *leaf_buffer, - int musthave, int justcheck); -STATIC void xfs_dir_leaf_rebalance(xfs_da_state_t *state, - xfs_da_state_blk_t *blk1, - xfs_da_state_blk_t *blk2); -STATIC int xfs_dir_leaf_figure_balance(xfs_da_state_t *state, - xfs_da_state_blk_t *leaf_blk_1, - xfs_da_state_blk_t *leaf_blk_2, - int *number_entries_in_blk1, - int *number_namebytes_in_blk1); - -STATIC int xfs_dir_leaf_create(struct xfs_da_args *args, - xfs_dablk_t which_block, - struct xfs_dabuf **bpp); - -/* - * Utility routines. - */ -STATIC void xfs_dir_leaf_moveents(xfs_dir_leafblock_t *src_leaf, - int src_start, - xfs_dir_leafblock_t *dst_leaf, - int dst_start, int move_count, - xfs_mount_t *mp); - - -/*======================================================================== - * External routines when dirsize < XFS_IFORK_DSIZE(dp). - *========================================================================*/ - - -/* - * Validate a given inode number. - */ -int -xfs_dir_ino_validate(xfs_mount_t *mp, xfs_ino_t ino) -{ - xfs_agblock_t agblkno; - xfs_agino_t agino; - xfs_agnumber_t agno; - int ino_ok; - int ioff; - - agno = XFS_INO_TO_AGNO(mp, ino); - agblkno = XFS_INO_TO_AGBNO(mp, ino); - ioff = XFS_INO_TO_OFFSET(mp, ino); - agino = XFS_OFFBNO_TO_AGINO(mp, agblkno, ioff); - ino_ok = - agno < mp->m_sb.sb_agcount && - agblkno < mp->m_sb.sb_agblocks && - agblkno != 0 && - ioff < (1 << mp->m_sb.sb_inopblog) && - XFS_AGINO_TO_INO(mp, agno, agino) == ino; - if (unlikely(XFS_TEST_ERROR(!ino_ok, mp, XFS_ERRTAG_DIR_INO_VALIDATE, - XFS_RANDOM_DIR_INO_VALIDATE))) { - xfs_fs_cmn_err(CE_WARN, mp, "Invalid inode number 0x%Lx", - (unsigned long long) ino); - XFS_ERROR_REPORT("xfs_dir_ino_validate", XFS_ERRLEVEL_LOW, mp); - return XFS_ERROR(EFSCORRUPTED); - } - return 0; -} - -/* - * Create the initial contents of a shortform directory. - */ -int -xfs_dir_shortform_create(xfs_da_args_t *args, xfs_ino_t parent) -{ - xfs_dir_sf_hdr_t *hdr; - xfs_inode_t *dp; - - dp = args->dp; - ASSERT(dp != NULL); - ASSERT(dp->i_d.di_size == 0); - if (dp->i_d.di_format == XFS_DINODE_FMT_EXTENTS) { - dp->i_df.if_flags &= ~XFS_IFEXTENTS; /* just in case */ - dp->i_d.di_format = XFS_DINODE_FMT_LOCAL; - xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE); - dp->i_df.if_flags |= XFS_IFINLINE; - } - ASSERT(dp->i_df.if_flags & XFS_IFINLINE); - ASSERT(dp->i_df.if_bytes == 0); - xfs_idata_realloc(dp, sizeof(*hdr), XFS_DATA_FORK); - hdr = (xfs_dir_sf_hdr_t *)dp->i_df.if_u1.if_data; - XFS_DIR_SF_PUT_DIRINO(&parent, &hdr->parent); - - hdr->count = 0; - dp->i_d.di_size = sizeof(*hdr); - xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_DDATA); - return 0; -} - -/* - * Add a name to the shortform directory structure. - * Overflow from the inode has already been checked for. - */ -int -xfs_dir_shortform_addname(xfs_da_args_t *args) -{ - xfs_dir_shortform_t *sf; - xfs_dir_sf_entry_t *sfe; - int i, offset, size; - xfs_inode_t *dp; - - dp = args->dp; - ASSERT(dp->i_df.if_flags & XFS_IFINLINE); - /* - * Catch the case where the conversion from shortform to leaf - * failed part way through. - */ - if (dp->i_d.di_size < sizeof(xfs_dir_sf_hdr_t)) { - ASSERT(XFS_FORCED_SHUTDOWN(dp->i_mount)); - return XFS_ERROR(EIO); - } - ASSERT(dp->i_df.if_bytes == dp->i_d.di_size); - ASSERT(dp->i_df.if_u1.if_data != NULL); - sf = (xfs_dir_shortform_t *)dp->i_df.if_u1.if_data; - sfe = &sf->list[0]; - for (i = sf->hdr.count-1; i >= 0; i--) { - if (sfe->namelen == args->namelen && - args->name[0] == sfe->name[0] && - memcmp(args->name, sfe->name, args->namelen) == 0) - return XFS_ERROR(EEXIST); - sfe = XFS_DIR_SF_NEXTENTRY(sfe); - } - - offset = (int)((char *)sfe - (char *)sf); - size = XFS_DIR_SF_ENTSIZE_BYNAME(args->namelen); - xfs_idata_realloc(dp, size, XFS_DATA_FORK); - sf = (xfs_dir_shortform_t *)dp->i_df.if_u1.if_data; - sfe = (xfs_dir_sf_entry_t *)((char *)sf + offset); - - XFS_DIR_SF_PUT_DIRINO(&args->inumber, &sfe->inumber); - sfe->namelen = args->namelen; - memcpy(sfe->name, args->name, sfe->namelen); - sf->hdr.count++; - - dp->i_d.di_size += size; - xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_DDATA); - - return 0; -} - -/* - * Remove a name from the shortform directory structure. - */ -int -xfs_dir_shortform_removename(xfs_da_args_t *args) -{ - xfs_dir_shortform_t *sf; - xfs_dir_sf_entry_t *sfe; - int base, size = 0, i; - xfs_inode_t *dp; - - dp = args->dp; - ASSERT(dp->i_df.if_flags & XFS_IFINLINE); - /* - * Catch the case where the conversion from shortform to leaf - * failed part way through. - */ - if (dp->i_d.di_size < sizeof(xfs_dir_sf_hdr_t)) { - ASSERT(XFS_FORCED_SHUTDOWN(dp->i_mount)); - return XFS_ERROR(EIO); - } - ASSERT(dp->i_df.if_bytes == dp->i_d.di_size); - ASSERT(dp->i_df.if_u1.if_data != NULL); - base = sizeof(xfs_dir_sf_hdr_t); - sf = (xfs_dir_shortform_t *)dp->i_df.if_u1.if_data; - sfe = &sf->list[0]; - for (i = sf->hdr.count-1; i >= 0; i--) { - size = XFS_DIR_SF_ENTSIZE_BYENTRY(sfe); - if (sfe->namelen == args->namelen && - sfe->name[0] == args->name[0] && - memcmp(sfe->name, args->name, args->namelen) == 0) - break; - base += size; - sfe = XFS_DIR_SF_NEXTENTRY(sfe); - } - if (i < 0) { - ASSERT(args->oknoent); - return XFS_ERROR(ENOENT); - } - - if ((base + size) != dp->i_d.di_size) { - memmove(&((char *)sf)[base], &((char *)sf)[base+size], - dp->i_d.di_size - (base+size)); - } - sf->hdr.count--; - - xfs_idata_realloc(dp, -size, XFS_DATA_FORK); - dp->i_d.di_size -= size; - xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_DDATA); - - return 0; -} - -/* - * Look up a name in a shortform directory structure. - */ -int -xfs_dir_shortform_lookup(xfs_da_args_t *args) -{ - xfs_dir_shortform_t *sf; - xfs_dir_sf_entry_t *sfe; - int i; - xfs_inode_t *dp; - - dp = args->dp; - ASSERT(dp->i_df.if_flags & XFS_IFINLINE); - /* - * Catch the case where the conversion from shortform to leaf - * failed part way through. - */ - if (dp->i_d.di_size < sizeof(xfs_dir_sf_hdr_t)) { - ASSERT(XFS_FORCED_SHUTDOWN(dp->i_mount)); - return XFS_ERROR(EIO); - } - ASSERT(dp->i_df.if_bytes == dp->i_d.di_size); - ASSERT(dp->i_df.if_u1.if_data != NULL); - sf = (xfs_dir_shortform_t *)dp->i_df.if_u1.if_data; - if (args->namelen == 2 && - args->name[0] == '.' && args->name[1] == '.') { - XFS_DIR_SF_GET_DIRINO(&sf->hdr.parent, &args->inumber); - return(XFS_ERROR(EEXIST)); - } - if (args->namelen == 1 && args->name[0] == '.') { - args->inumber = dp->i_ino; - return(XFS_ERROR(EEXIST)); - } - sfe = &sf->list[0]; - for (i = sf->hdr.count-1; i >= 0; i--) { - if (sfe->namelen == args->namelen && - sfe->name[0] == args->name[0] && - memcmp(args->name, sfe->name, args->namelen) == 0) { - XFS_DIR_SF_GET_DIRINO(&sfe->inumber, &args->inumber); - return(XFS_ERROR(EEXIST)); - } - sfe = XFS_DIR_SF_NEXTENTRY(sfe); - } - ASSERT(args->oknoent); - return(XFS_ERROR(ENOENT)); -} - -/* - * Convert from using the shortform to the leaf. - */ -int -xfs_dir_shortform_to_leaf(xfs_da_args_t *iargs) -{ - xfs_inode_t *dp; - xfs_dir_shortform_t *sf; - xfs_dir_sf_entry_t *sfe; - xfs_da_args_t args; - xfs_ino_t inumber; - char *tmpbuffer; - int retval, i, size; - xfs_dablk_t blkno; - xfs_dabuf_t *bp; - - dp = iargs->dp; - /* - * Catch the case where the conversion from shortform to leaf - * failed part way through. - */ - if (dp->i_d.di_size < sizeof(xfs_dir_sf_hdr_t)) { - ASSERT(XFS_FORCED_SHUTDOWN(dp->i_mount)); - return XFS_ERROR(EIO); - } - ASSERT(dp->i_df.if_bytes == dp->i_d.di_size); - ASSERT(dp->i_df.if_u1.if_data != NULL); - size = dp->i_df.if_bytes; - tmpbuffer = kmem_alloc(size, KM_SLEEP); - ASSERT(tmpbuffer != NULL); - - memcpy(tmpbuffer, dp->i_df.if_u1.if_data, size); - - sf = (xfs_dir_shortform_t *)tmpbuffer; - XFS_DIR_SF_GET_DIRINO(&sf->hdr.parent, &inumber); - - xfs_idata_realloc(dp, -size, XFS_DATA_FORK); - dp->i_d.di_size = 0; - xfs_trans_log_inode(iargs->trans, dp, XFS_ILOG_CORE); - retval = xfs_da_grow_inode(iargs, &blkno); - if (retval) - goto out; - - ASSERT(blkno == 0); - retval = xfs_dir_leaf_create(iargs, blkno, &bp); - if (retval) - goto out; - xfs_da_buf_done(bp); - - args.name = "."; - args.namelen = 1; - args.hashval = xfs_dir_hash_dot; - args.inumber = dp->i_ino; - args.dp = dp; - args.firstblock = iargs->firstblock; - args.flist = iargs->flist; - args.total = iargs->total; - args.whichfork = XFS_DATA_FORK; - args.trans = iargs->trans; - args.justcheck = 0; - args.addname = args.oknoent = 1; - retval = xfs_dir_leaf_addname(&args); - if (retval) - goto out; - - args.name = ".."; - args.namelen = 2; - args.hashval = xfs_dir_hash_dotdot; - args.inumber = inumber; - retval = xfs_dir_leaf_addname(&args); - if (retval) - goto out; - - sfe = &sf->list[0]; - for (i = 0; i < sf->hdr.count; i++) { - args.name = (char *)(sfe->name); - args.namelen = sfe->namelen; - args.hashval = xfs_da_hashname((char *)(sfe->name), - sfe->namelen); - XFS_DIR_SF_GET_DIRINO(&sfe->inumber, &args.inumber); - retval = xfs_dir_leaf_addname(&args); - if (retval) - goto out; - sfe = XFS_DIR_SF_NEXTENTRY(sfe); - } - retval = 0; - -out: - kmem_free(tmpbuffer, size); - return retval; -} - -STATIC int -xfs_dir_shortform_compare(const void *a, const void *b) -{ - xfs_dir_sf_sort_t *sa, *sb; - - sa = (xfs_dir_sf_sort_t *)a; - sb = (xfs_dir_sf_sort_t *)b; - if (sa->hash < sb->hash) - return -1; - else if (sa->hash > sb->hash) - return 1; - else - return sa->entno - sb->entno; -} - -/* - * Copy out directory entries for getdents(), for shortform directories. - */ -/*ARGSUSED*/ -int -xfs_dir_shortform_getdents(xfs_inode_t *dp, uio_t *uio, int *eofp, - xfs_dirent_t *dbp, xfs_dir_put_t put) -{ - xfs_dir_shortform_t *sf; - xfs_dir_sf_entry_t *sfe; - int retval, i, sbsize, nsbuf, lastresid=0, want_entno; - xfs_mount_t *mp; - xfs_dahash_t cookhash, hash; - xfs_dir_put_args_t p; - xfs_dir_sf_sort_t *sbuf, *sbp; - - mp = dp->i_mount; - sf = (xfs_dir_shortform_t *)dp->i_df.if_u1.if_data; - cookhash = XFS_DA_COOKIE_HASH(mp, uio->uio_offset); - want_entno = XFS_DA_COOKIE_ENTRY(mp, uio->uio_offset); - nsbuf = sf->hdr.count + 2; - sbsize = (nsbuf + 1) * sizeof(*sbuf); - sbp = sbuf = kmem_alloc(sbsize, KM_SLEEP); - - xfs_dir_trace_g_du("sf: start", dp, uio); - - /* - * Collect all the entries into the buffer. - * Entry 0 is . - */ - sbp->entno = 0; - sbp->seqno = 0; - sbp->hash = xfs_dir_hash_dot; - sbp->ino = dp->i_ino; - sbp->name = "."; - sbp->namelen = 1; - sbp++; - - /* - * Entry 1 is .. - */ - sbp->entno = 1; - sbp->seqno = 0; - sbp->hash = xfs_dir_hash_dotdot; - sbp->ino = XFS_GET_DIR_INO8(sf->hdr.parent); - sbp->name = ".."; - sbp->namelen = 2; - sbp++; - - /* - * Scan the directory data for the rest of the entries. - */ - for (i = 0, sfe = &sf->list[0]; i < sf->hdr.count; i++) { - - if (unlikely( - ((char *)sfe < (char *)sf) || - ((char *)sfe >= ((char *)sf + dp->i_df.if_bytes)))) { - xfs_dir_trace_g_du("sf: corrupted", dp, uio); - XFS_CORRUPTION_ERROR("xfs_dir_shortform_getdents", - XFS_ERRLEVEL_LOW, mp, sfe); - kmem_free(sbuf, sbsize); - return XFS_ERROR(EFSCORRUPTED); - } - - sbp->entno = i + 2; - sbp->seqno = 0; - sbp->hash = xfs_da_hashname((char *)sfe->name, sfe->namelen); - sbp->ino = XFS_GET_DIR_INO8(sfe->inumber); - sbp->name = (char *)sfe->name; - sbp->namelen = sfe->namelen; - sfe = XFS_DIR_SF_NEXTENTRY(sfe); - sbp++; - } - - /* - * Sort the entries on hash then entno. - */ - xfs_sort(sbuf, nsbuf, sizeof(*sbuf), xfs_dir_shortform_compare); - /* - * Stuff in last entry. - */ - sbp->entno = nsbuf; - sbp->hash = XFS_DA_MAXHASH; - sbp->seqno = 0; - /* - * Figure out the sequence numbers in case there's a hash duplicate. - */ - for (hash = sbuf->hash, sbp = sbuf + 1; - sbp < &sbuf[nsbuf + 1]; sbp++) { - if (sbp->hash == hash) - sbp->seqno = sbp[-1].seqno + 1; - else - hash = sbp->hash; - } - - /* - * Set up put routine. - */ - p.dbp = dbp; - p.put = put; - p.uio = uio; - - /* - * Find our place. - */ - for (sbp = sbuf; sbp < &sbuf[nsbuf + 1]; sbp++) { - if (sbp->hash > cookhash || - (sbp->hash == cookhash && sbp->seqno >= want_entno)) - break; - } - - /* - * Did we fail to find anything? We stop at the last entry, - * the one we put maxhash into. - */ - if (sbp == &sbuf[nsbuf]) { - kmem_free(sbuf, sbsize); - xfs_dir_trace_g_du("sf: hash beyond end", dp, uio); - uio->uio_offset = XFS_DA_MAKE_COOKIE(mp, 0, 0, XFS_DA_MAXHASH); - *eofp = 1; - return 0; - } - - /* - * Loop putting entries into the user buffer. - */ - while (sbp < &sbuf[nsbuf]) { - /* - * Save the first resid in a run of equal-hashval entries - * so that we can back them out if they don't all fit. - */ - if (sbp->seqno == 0 || sbp == sbuf) - lastresid = uio->uio_resid; - XFS_PUT_COOKIE(p.cook, mp, 0, sbp[1].seqno, sbp[1].hash); - p.ino = sbp->ino; -#if XFS_BIG_INUMS - p.ino += mp->m_inoadd; -#endif - p.name = sbp->name; - p.namelen = sbp->namelen; - retval = p.put(&p); - if (!p.done) { - uio->uio_offset = - XFS_DA_MAKE_COOKIE(mp, 0, 0, sbp->hash); - kmem_free(sbuf, sbsize); - uio->uio_resid = lastresid; - xfs_dir_trace_g_du("sf: E-O-B", dp, uio); - return retval; - } - sbp++; - } - kmem_free(sbuf, sbsize); - uio->uio_offset = p.cook.o; - *eofp = 1; - xfs_dir_trace_g_du("sf: E-O-F", dp, uio); - return 0; -} - -/* - * Look up a name in a shortform directory structure, replace the inode number. - */ -int -xfs_dir_shortform_replace(xfs_da_args_t *args) -{ - xfs_dir_shortform_t *sf; - xfs_dir_sf_entry_t *sfe; - xfs_inode_t *dp; - int i; - - dp = args->dp; - ASSERT(dp->i_df.if_flags & XFS_IFINLINE); - /* - * Catch the case where the conversion from shortform to leaf - * failed part way through. - */ - if (dp->i_d.di_size < sizeof(xfs_dir_sf_hdr_t)) { - ASSERT(XFS_FORCED_SHUTDOWN(dp->i_mount)); - return XFS_ERROR(EIO); - } - ASSERT(dp->i_df.if_bytes == dp->i_d.di_size); - ASSERT(dp->i_df.if_u1.if_data != NULL); - sf = (xfs_dir_shortform_t *)dp->i_df.if_u1.if_data; - if (args->namelen == 2 && - args->name[0] == '.' && args->name[1] == '.') { - /* XXX - replace assert? */ - XFS_DIR_SF_PUT_DIRINO(&args->inumber, &sf->hdr.parent); - xfs_trans_log_inode(args->trans, dp, XFS_ILOG_DDATA); - return 0; - } - ASSERT(args->namelen != 1 || args->name[0] != '.'); - sfe = &sf->list[0]; - for (i = sf->hdr.count-1; i >= 0; i--) { - if (sfe->namelen == args->namelen && - sfe->name[0] == args->name[0] && - memcmp(args->name, sfe->name, args->namelen) == 0) { - ASSERT(memcmp((char *)&args->inumber, - (char *)&sfe->inumber, sizeof(xfs_ino_t))); - XFS_DIR_SF_PUT_DIRINO(&args->inumber, &sfe->inumber); - xfs_trans_log_inode(args->trans, dp, XFS_ILOG_DDATA); - return 0; - } - sfe = XFS_DIR_SF_NEXTENTRY(sfe); - } - ASSERT(args->oknoent); - return XFS_ERROR(ENOENT); -} - -/* - * Convert a leaf directory to shortform structure - */ -int -xfs_dir_leaf_to_shortform(xfs_da_args_t *iargs) -{ - xfs_dir_leafblock_t *leaf; - xfs_dir_leaf_hdr_t *hdr; - xfs_dir_leaf_entry_t *entry; - xfs_dir_leaf_name_t *namest; - xfs_da_args_t args; - xfs_inode_t *dp; - xfs_ino_t parent = 0; - char *tmpbuffer; - int retval, i; - xfs_dabuf_t *bp; - - dp = iargs->dp; - tmpbuffer = kmem_alloc(XFS_LBSIZE(dp->i_mount), KM_SLEEP); - ASSERT(tmpbuffer != NULL); - - retval = xfs_da_read_buf(iargs->trans, iargs->dp, 0, -1, &bp, - XFS_DATA_FORK); - if (retval) - goto out; - ASSERT(bp != NULL); - memcpy(tmpbuffer, bp->data, XFS_LBSIZE(dp->i_mount)); - leaf = (xfs_dir_leafblock_t *)tmpbuffer; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_DIR_LEAF_MAGIC); - memset(bp->data, 0, XFS_LBSIZE(dp->i_mount)); - - /* - * Find and special case the parent inode number - */ - hdr = &leaf->hdr; - entry = &leaf->entries[0]; - for (i = INT_GET(hdr->count, ARCH_CONVERT)-1; i >= 0; entry++, i--) { - namest = XFS_DIR_LEAF_NAMESTRUCT(leaf, INT_GET(entry->nameidx, ARCH_CONVERT)); - if ((entry->namelen == 2) && - (namest->name[0] == '.') && - (namest->name[1] == '.')) { - XFS_DIR_SF_GET_DIRINO(&namest->inumber, &parent); - entry->nameidx = 0; - } else if ((entry->namelen == 1) && (namest->name[0] == '.')) { - entry->nameidx = 0; - } - } - retval = xfs_da_shrink_inode(iargs, 0, bp); - if (retval) - goto out; - retval = xfs_dir_shortform_create(iargs, parent); - if (retval) - goto out; - - /* - * Copy the rest of the filenames - */ - entry = &leaf->entries[0]; - args.dp = dp; - args.firstblock = iargs->firstblock; - args.flist = iargs->flist; - args.total = iargs->total; - args.whichfork = XFS_DATA_FORK; - args.trans = iargs->trans; - args.justcheck = 0; - args.addname = args.oknoent = 1; - for (i = 0; i < INT_GET(hdr->count, ARCH_CONVERT); entry++, i++) { - if (!entry->nameidx) - continue; - namest = XFS_DIR_LEAF_NAMESTRUCT(leaf, INT_GET(entry->nameidx, ARCH_CONVERT)); - args.name = (char *)(namest->name); - args.namelen = entry->namelen; - args.hashval = INT_GET(entry->hashval, ARCH_CONVERT); - XFS_DIR_SF_GET_DIRINO(&namest->inumber, &args.inumber); - xfs_dir_shortform_addname(&args); - } - -out: - kmem_free(tmpbuffer, XFS_LBSIZE(dp->i_mount)); - return retval; -} - -/* - * Convert from using a single leaf to a root node and a leaf. - */ -int -xfs_dir_leaf_to_node(xfs_da_args_t *args) -{ - xfs_dir_leafblock_t *leaf; - xfs_da_intnode_t *node; - xfs_inode_t *dp; - xfs_dabuf_t *bp1, *bp2; - xfs_dablk_t blkno; - int retval; - - dp = args->dp; - retval = xfs_da_grow_inode(args, &blkno); - ASSERT(blkno == 1); - if (retval) - return retval; - retval = xfs_da_read_buf(args->trans, args->dp, 0, -1, &bp1, - XFS_DATA_FORK); - if (retval) - return retval; - ASSERT(bp1 != NULL); - retval = xfs_da_get_buf(args->trans, args->dp, 1, -1, &bp2, - XFS_DATA_FORK); - if (retval) { - xfs_da_buf_done(bp1); - return retval; - } - ASSERT(bp2 != NULL); - memcpy(bp2->data, bp1->data, XFS_LBSIZE(dp->i_mount)); - xfs_da_buf_done(bp1); - xfs_da_log_buf(args->trans, bp2, 0, XFS_LBSIZE(dp->i_mount) - 1); - - /* - * Set up the new root node. - */ - retval = xfs_da_node_create(args, 0, 1, &bp1, XFS_DATA_FORK); - if (retval) { - xfs_da_buf_done(bp2); - return retval; - } - node = bp1->data; - leaf = bp2->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_DIR_LEAF_MAGIC); - node->btree[0].hashval = cpu_to_be32( - INT_GET(leaf->entries[ - INT_GET(leaf->hdr.count, ARCH_CONVERT)-1].hashval, ARCH_CONVERT)); - xfs_da_buf_done(bp2); - node->btree[0].before = cpu_to_be32(blkno); - node->hdr.count = cpu_to_be16(1); - xfs_da_log_buf(args->trans, bp1, - XFS_DA_LOGRANGE(node, &node->btree[0], sizeof(node->btree[0]))); - xfs_da_buf_done(bp1); - - return retval; -} - - -/*======================================================================== - * Routines used for growing the Btree. - *========================================================================*/ - -/* - * Create the initial contents of a leaf directory - * or a leaf in a node directory. - */ -STATIC int -xfs_dir_leaf_create(xfs_da_args_t *args, xfs_dablk_t blkno, xfs_dabuf_t **bpp) -{ - xfs_dir_leafblock_t *leaf; - xfs_dir_leaf_hdr_t *hdr; - xfs_inode_t *dp; - xfs_dabuf_t *bp; - int retval; - - dp = args->dp; - ASSERT(dp != NULL); - retval = xfs_da_get_buf(args->trans, dp, blkno, -1, &bp, XFS_DATA_FORK); - if (retval) - return retval; - ASSERT(bp != NULL); - leaf = bp->data; - memset((char *)leaf, 0, XFS_LBSIZE(dp->i_mount)); - hdr = &leaf->hdr; - hdr->info.magic = cpu_to_be16(XFS_DIR_LEAF_MAGIC); - INT_SET(hdr->firstused, ARCH_CONVERT, XFS_LBSIZE(dp->i_mount)); - if (!hdr->firstused) - INT_SET(hdr->firstused, ARCH_CONVERT, XFS_LBSIZE(dp->i_mount) - 1); - INT_SET(hdr->freemap[0].base, ARCH_CONVERT, sizeof(xfs_dir_leaf_hdr_t)); - INT_SET(hdr->freemap[0].size, ARCH_CONVERT, INT_GET(hdr->firstused, ARCH_CONVERT) - INT_GET(hdr->freemap[0].base, ARCH_CONVERT)); - - xfs_da_log_buf(args->trans, bp, 0, XFS_LBSIZE(dp->i_mount) - 1); - - *bpp = bp; - return 0; -} - -/* - * Split the leaf node, rebalance, then add the new entry. - */ -int -xfs_dir_leaf_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk, - xfs_da_state_blk_t *newblk) -{ - xfs_dablk_t blkno; - xfs_da_args_t *args; - int error; - - /* - * Allocate space for a new leaf node. - */ - args = state->args; - ASSERT(args != NULL); - ASSERT(oldblk->magic == XFS_DIR_LEAF_MAGIC); - error = xfs_da_grow_inode(args, &blkno); - if (error) - return error; - error = xfs_dir_leaf_create(args, blkno, &newblk->bp); - if (error) - return error; - newblk->blkno = blkno; - newblk->magic = XFS_DIR_LEAF_MAGIC; - - /* - * Rebalance the entries across the two leaves. - */ - xfs_dir_leaf_rebalance(state, oldblk, newblk); - error = xfs_da_blk_link(state, oldblk, newblk); - if (error) - return error; - - /* - * Insert the new entry in the correct block. - */ - if (state->inleaf) { - error = xfs_dir_leaf_add(oldblk->bp, args, oldblk->index); - } else { - error = xfs_dir_leaf_add(newblk->bp, args, newblk->index); - } - - /* - * Update last hashval in each block since we added the name. - */ - oldblk->hashval = xfs_dir_leaf_lasthash(oldblk->bp, NULL); - newblk->hashval = xfs_dir_leaf_lasthash(newblk->bp, NULL); - return error; -} - -/* - * Add a name to the leaf directory structure. - * - * Must take into account fragmented leaves and leaves where spacemap has - * lost some freespace information (ie: holes). - */ -int -xfs_dir_leaf_add(xfs_dabuf_t *bp, xfs_da_args_t *args, int index) -{ - xfs_dir_leafblock_t *leaf; - xfs_dir_leaf_hdr_t *hdr; - xfs_dir_leaf_map_t *map; - int tablesize, entsize, sum, i, tmp, error; - - leaf = bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_DIR_LEAF_MAGIC); - ASSERT((index >= 0) && (index <= INT_GET(leaf->hdr.count, ARCH_CONVERT))); - hdr = &leaf->hdr; - entsize = XFS_DIR_LEAF_ENTSIZE_BYNAME(args->namelen); - - /* - * Search through freemap for first-fit on new name length. - * (may need to figure in size of entry struct too) - */ - tablesize = (INT_GET(hdr->count, ARCH_CONVERT) + 1) * (uint)sizeof(xfs_dir_leaf_entry_t) - + (uint)sizeof(xfs_dir_leaf_hdr_t); - map = &hdr->freemap[XFS_DIR_LEAF_MAPSIZE-1]; - for (sum = 0, i = XFS_DIR_LEAF_MAPSIZE-1; i >= 0; map--, i--) { - if (tablesize > INT_GET(hdr->firstused, ARCH_CONVERT)) { - sum += INT_GET(map->size, ARCH_CONVERT); - continue; - } - if (!map->size) - continue; /* no space in this map */ - tmp = entsize; - if (INT_GET(map->base, ARCH_CONVERT) < INT_GET(hdr->firstused, ARCH_CONVERT)) - tmp += (uint)sizeof(xfs_dir_leaf_entry_t); - if (INT_GET(map->size, ARCH_CONVERT) >= tmp) { - if (!args->justcheck) - xfs_dir_leaf_add_work(bp, args, index, i); - return 0; - } - sum += INT_GET(map->size, ARCH_CONVERT); - } - - /* - * If there are no holes in the address space of the block, - * and we don't have enough freespace, then compaction will do us - * no good and we should just give up. - */ - if (!hdr->holes && (sum < entsize)) - return XFS_ERROR(ENOSPC); - - /* - * Compact the entries to coalesce free space. - * Pass the justcheck flag so the checking pass can return - * an error, without changing anything, if it won't fit. - */ - error = xfs_dir_leaf_compact(args->trans, bp, - args->total == 0 ? - entsize + - (uint)sizeof(xfs_dir_leaf_entry_t) : 0, - args->justcheck); - if (error) - return error; - /* - * After compaction, the block is guaranteed to have only one - * free region, in freemap[0]. If it is not big enough, give up. - */ - if (INT_GET(hdr->freemap[0].size, ARCH_CONVERT) < - (entsize + (uint)sizeof(xfs_dir_leaf_entry_t))) - return XFS_ERROR(ENOSPC); - - if (!args->justcheck) - xfs_dir_leaf_add_work(bp, args, index, 0); - return 0; -} - -/* - * Add a name to a leaf directory structure. - */ -STATIC void -xfs_dir_leaf_add_work(xfs_dabuf_t *bp, xfs_da_args_t *args, int index, - int mapindex) -{ - xfs_dir_leafblock_t *leaf; - xfs_dir_leaf_hdr_t *hdr; - xfs_dir_leaf_entry_t *entry; - xfs_dir_leaf_name_t *namest; - xfs_dir_leaf_map_t *map; - /* REFERENCED */ - xfs_mount_t *mp; - int tmp, i; - - leaf = bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_DIR_LEAF_MAGIC); - hdr = &leaf->hdr; - ASSERT((mapindex >= 0) && (mapindex < XFS_DIR_LEAF_MAPSIZE)); - ASSERT((index >= 0) && (index <= INT_GET(hdr->count, ARCH_CONVERT))); - - /* - * Force open some space in the entry array and fill it in. - */ - entry = &leaf->entries[index]; - if (index < INT_GET(hdr->count, ARCH_CONVERT)) { - tmp = INT_GET(hdr->count, ARCH_CONVERT) - index; - tmp *= (uint)sizeof(xfs_dir_leaf_entry_t); - memmove(entry + 1, entry, tmp); - xfs_da_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, entry, tmp + (uint)sizeof(*entry))); - } - INT_MOD(hdr->count, ARCH_CONVERT, +1); - - /* - * Allocate space for the new string (at the end of the run). - */ - map = &hdr->freemap[mapindex]; - mp = args->trans->t_mountp; - ASSERT(INT_GET(map->base, ARCH_CONVERT) < XFS_LBSIZE(mp)); - ASSERT(INT_GET(map->size, ARCH_CONVERT) >= XFS_DIR_LEAF_ENTSIZE_BYNAME(args->namelen)); - ASSERT(INT_GET(map->size, ARCH_CONVERT) < XFS_LBSIZE(mp)); - INT_MOD(map->size, ARCH_CONVERT, -(XFS_DIR_LEAF_ENTSIZE_BYNAME(args->namelen))); - INT_SET(entry->nameidx, ARCH_CONVERT, INT_GET(map->base, ARCH_CONVERT) + INT_GET(map->size, ARCH_CONVERT)); - INT_SET(entry->hashval, ARCH_CONVERT, args->hashval); - entry->namelen = args->namelen; - xfs_da_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry))); - - /* - * Copy the string and inode number into the new space. - */ - namest = XFS_DIR_LEAF_NAMESTRUCT(leaf, INT_GET(entry->nameidx, ARCH_CONVERT)); - XFS_DIR_SF_PUT_DIRINO(&args->inumber, &namest->inumber); - memcpy(namest->name, args->name, args->namelen); - xfs_da_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, namest, XFS_DIR_LEAF_ENTSIZE_BYENTRY(entry))); - - /* - * Update the control info for this leaf node - */ - if (INT_GET(entry->nameidx, ARCH_CONVERT) < INT_GET(hdr->firstused, ARCH_CONVERT)) - INT_COPY(hdr->firstused, entry->nameidx, ARCH_CONVERT); - ASSERT(INT_GET(hdr->firstused, ARCH_CONVERT) >= ((INT_GET(hdr->count, ARCH_CONVERT)*sizeof(*entry))+sizeof(*hdr))); - tmp = (INT_GET(hdr->count, ARCH_CONVERT)-1) * (uint)sizeof(xfs_dir_leaf_entry_t) - + (uint)sizeof(xfs_dir_leaf_hdr_t); - map = &hdr->freemap[0]; - for (i = 0; i < XFS_DIR_LEAF_MAPSIZE; map++, i++) { - if (INT_GET(map->base, ARCH_CONVERT) == tmp) { - INT_MOD(map->base, ARCH_CONVERT, (uint)sizeof(xfs_dir_leaf_entry_t)); - INT_MOD(map->size, ARCH_CONVERT, -((uint)sizeof(xfs_dir_leaf_entry_t))); - } - } - INT_MOD(hdr->namebytes, ARCH_CONVERT, args->namelen); - xfs_da_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, hdr, sizeof(*hdr))); -} - -/* - * Garbage collect a leaf directory block by copying it to a new buffer. - */ -STATIC int -xfs_dir_leaf_compact(xfs_trans_t *trans, xfs_dabuf_t *bp, int musthave, - int justcheck) -{ - xfs_dir_leafblock_t *leaf_s, *leaf_d; - xfs_dir_leaf_hdr_t *hdr_s, *hdr_d; - xfs_mount_t *mp; - char *tmpbuffer; - char *tmpbuffer2=NULL; - int rval; - int lbsize; - - mp = trans->t_mountp; - lbsize = XFS_LBSIZE(mp); - tmpbuffer = kmem_alloc(lbsize, KM_SLEEP); - ASSERT(tmpbuffer != NULL); - memcpy(tmpbuffer, bp->data, lbsize); - - /* - * Make a second copy in case xfs_dir_leaf_moveents() - * below destroys the original. - */ - if (musthave || justcheck) { - tmpbuffer2 = kmem_alloc(lbsize, KM_SLEEP); - memcpy(tmpbuffer2, bp->data, lbsize); - } - memset(bp->data, 0, lbsize); - - /* - * Copy basic information - */ - leaf_s = (xfs_dir_leafblock_t *)tmpbuffer; - leaf_d = bp->data; - hdr_s = &leaf_s->hdr; - hdr_d = &leaf_d->hdr; - hdr_d->info = hdr_s->info; /* struct copy */ - INT_SET(hdr_d->firstused, ARCH_CONVERT, lbsize); - if (!hdr_d->firstused) - INT_SET(hdr_d->firstused, ARCH_CONVERT, lbsize - 1); - hdr_d->namebytes = 0; - hdr_d->count = 0; - hdr_d->holes = 0; - INT_SET(hdr_d->freemap[0].base, ARCH_CONVERT, sizeof(xfs_dir_leaf_hdr_t)); - INT_SET(hdr_d->freemap[0].size, ARCH_CONVERT, INT_GET(hdr_d->firstused, ARCH_CONVERT) - INT_GET(hdr_d->freemap[0].base, ARCH_CONVERT)); - - /* - * Copy all entry's in the same (sorted) order, - * but allocate filenames packed and in sequence. - * This changes the source (leaf_s) as well. - */ - xfs_dir_leaf_moveents(leaf_s, 0, leaf_d, 0, (int)INT_GET(hdr_s->count, ARCH_CONVERT), mp); - - if (musthave && INT_GET(hdr_d->freemap[0].size, ARCH_CONVERT) < musthave) - rval = XFS_ERROR(ENOSPC); - else - rval = 0; - - if (justcheck || rval == ENOSPC) { - ASSERT(tmpbuffer2); - memcpy(bp->data, tmpbuffer2, lbsize); - } else { - xfs_da_log_buf(trans, bp, 0, lbsize - 1); - } - - kmem_free(tmpbuffer, lbsize); - if (musthave || justcheck) - kmem_free(tmpbuffer2, lbsize); - return rval; -} - -/* - * Redistribute the directory entries between two leaf nodes, - * taking into account the size of the new entry. - * - * NOTE: if new block is empty, then it will get the upper half of old block. - */ -STATIC void -xfs_dir_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, - xfs_da_state_blk_t *blk2) -{ - xfs_da_state_blk_t *tmp_blk; - xfs_dir_leafblock_t *leaf1, *leaf2; - xfs_dir_leaf_hdr_t *hdr1, *hdr2; - int count, totallen, max, space, swap; - - /* - * Set up environment. - */ - ASSERT(blk1->magic == XFS_DIR_LEAF_MAGIC); - ASSERT(blk2->magic == XFS_DIR_LEAF_MAGIC); - leaf1 = blk1->bp->data; - leaf2 = blk2->bp->data; - ASSERT(be16_to_cpu(leaf1->hdr.info.magic) == XFS_DIR_LEAF_MAGIC); - ASSERT(be16_to_cpu(leaf2->hdr.info.magic) == XFS_DIR_LEAF_MAGIC); - - /* - * Check ordering of blocks, reverse if it makes things simpler. - */ - swap = 0; - if (xfs_dir_leaf_order(blk1->bp, blk2->bp)) { - tmp_blk = blk1; - blk1 = blk2; - blk2 = tmp_blk; - leaf1 = blk1->bp->data; - leaf2 = blk2->bp->data; - swap = 1; - } - hdr1 = &leaf1->hdr; - hdr2 = &leaf2->hdr; - - /* - * Examine entries until we reduce the absolute difference in - * byte usage between the two blocks to a minimum. Then get - * the direction to copy and the number of elements to move. - */ - state->inleaf = xfs_dir_leaf_figure_balance(state, blk1, blk2, - &count, &totallen); - if (swap) - state->inleaf = !state->inleaf; - - /* - * Move any entries required from leaf to leaf: - */ - if (count < INT_GET(hdr1->count, ARCH_CONVERT)) { - /* - * Figure the total bytes to be added to the destination leaf. - */ - count = INT_GET(hdr1->count, ARCH_CONVERT) - count; /* number entries being moved */ - space = INT_GET(hdr1->namebytes, ARCH_CONVERT) - totallen; - space += count * ((uint)sizeof(xfs_dir_leaf_name_t)-1); - space += count * (uint)sizeof(xfs_dir_leaf_entry_t); - - /* - * leaf2 is the destination, compact it if it looks tight. - */ - max = INT_GET(hdr2->firstused, ARCH_CONVERT) - (uint)sizeof(xfs_dir_leaf_hdr_t); - max -= INT_GET(hdr2->count, ARCH_CONVERT) * (uint)sizeof(xfs_dir_leaf_entry_t); - if (space > max) { - xfs_dir_leaf_compact(state->args->trans, blk2->bp, - 0, 0); - } - - /* - * Move high entries from leaf1 to low end of leaf2. - */ - xfs_dir_leaf_moveents(leaf1, INT_GET(hdr1->count, ARCH_CONVERT) - count, - leaf2, 0, count, state->mp); - - xfs_da_log_buf(state->args->trans, blk1->bp, 0, - state->blocksize-1); - xfs_da_log_buf(state->args->trans, blk2->bp, 0, - state->blocksize-1); - - } else if (count > INT_GET(hdr1->count, ARCH_CONVERT)) { - /* - * Figure the total bytes to be added to the destination leaf. - */ - count -= INT_GET(hdr1->count, ARCH_CONVERT); /* number entries being moved */ - space = totallen - INT_GET(hdr1->namebytes, ARCH_CONVERT); - space += count * ((uint)sizeof(xfs_dir_leaf_name_t)-1); - space += count * (uint)sizeof(xfs_dir_leaf_entry_t); - - /* - * leaf1 is the destination, compact it if it looks tight. - */ - max = INT_GET(hdr1->firstused, ARCH_CONVERT) - (uint)sizeof(xfs_dir_leaf_hdr_t); - max -= INT_GET(hdr1->count, ARCH_CONVERT) * (uint)sizeof(xfs_dir_leaf_entry_t); - if (space > max) { - xfs_dir_leaf_compact(state->args->trans, blk1->bp, - 0, 0); - } - - /* - * Move low entries from leaf2 to high end of leaf1. - */ - xfs_dir_leaf_moveents(leaf2, 0, leaf1, (int)INT_GET(hdr1->count, ARCH_CONVERT), - count, state->mp); - - xfs_da_log_buf(state->args->trans, blk1->bp, 0, - state->blocksize-1); - xfs_da_log_buf(state->args->trans, blk2->bp, 0, - state->blocksize-1); - } - - /* - * Copy out last hashval in each block for B-tree code. - */ - blk1->hashval = INT_GET(leaf1->entries[ INT_GET(leaf1->hdr.count, ARCH_CONVERT)-1 ].hashval, ARCH_CONVERT); - blk2->hashval = INT_GET(leaf2->entries[ INT_GET(leaf2->hdr.count, ARCH_CONVERT)-1 ].hashval, ARCH_CONVERT); - - /* - * Adjust the expected index for insertion. - * GROT: this doesn't work unless blk2 was originally empty. - */ - if (!state->inleaf) { - blk2->index = blk1->index - INT_GET(leaf1->hdr.count, ARCH_CONVERT); - } -} - -/* - * Examine entries until we reduce the absolute difference in - * byte usage between the two blocks to a minimum. - * GROT: Is this really necessary? With other than a 512 byte blocksize, - * GROT: there will always be enough room in either block for a new entry. - * GROT: Do a double-split for this case? - */ -STATIC int -xfs_dir_leaf_figure_balance(xfs_da_state_t *state, - xfs_da_state_blk_t *blk1, - xfs_da_state_blk_t *blk2, - int *countarg, int *namebytesarg) -{ - xfs_dir_leafblock_t *leaf1, *leaf2; - xfs_dir_leaf_hdr_t *hdr1, *hdr2; - xfs_dir_leaf_entry_t *entry; - int count, max, totallen, half; - int lastdelta, foundit, tmp; - - /* - * Set up environment. - */ - leaf1 = blk1->bp->data; - leaf2 = blk2->bp->data; - hdr1 = &leaf1->hdr; - hdr2 = &leaf2->hdr; - foundit = 0; - totallen = 0; - - /* - * Examine entries until we reduce the absolute difference in - * byte usage between the two blocks to a minimum. - */ - max = INT_GET(hdr1->count, ARCH_CONVERT) + INT_GET(hdr2->count, ARCH_CONVERT); - half = (max+1) * (uint)(sizeof(*entry)+sizeof(xfs_dir_leaf_entry_t)-1); - half += INT_GET(hdr1->namebytes, ARCH_CONVERT) + INT_GET(hdr2->namebytes, ARCH_CONVERT) + state->args->namelen; - half /= 2; - lastdelta = state->blocksize; - entry = &leaf1->entries[0]; - for (count = 0; count < max; entry++, count++) { - -#define XFS_DIR_ABS(A) (((A) < 0) ? -(A) : (A)) - /* - * The new entry is in the first block, account for it. - */ - if (count == blk1->index) { - tmp = totallen + (uint)sizeof(*entry) - + XFS_DIR_LEAF_ENTSIZE_BYNAME(state->args->namelen); - if (XFS_DIR_ABS(half - tmp) > lastdelta) - break; - lastdelta = XFS_DIR_ABS(half - tmp); - totallen = tmp; - foundit = 1; - } - - /* - * Wrap around into the second block if necessary. - */ - if (count == INT_GET(hdr1->count, ARCH_CONVERT)) { - leaf1 = leaf2; - entry = &leaf1->entries[0]; - } - - /* - * Figure out if next leaf entry would be too much. - */ - tmp = totallen + (uint)sizeof(*entry) - + XFS_DIR_LEAF_ENTSIZE_BYENTRY(entry); - if (XFS_DIR_ABS(half - tmp) > lastdelta) - break; - lastdelta = XFS_DIR_ABS(half - tmp); - totallen = tmp; -#undef XFS_DIR_ABS - } - - /* - * Calculate the number of namebytes that will end up in lower block. - * If new entry not in lower block, fix up the count. - */ - totallen -= - count * (uint)(sizeof(*entry)+sizeof(xfs_dir_leaf_entry_t)-1); - if (foundit) { - totallen -= (sizeof(*entry)+sizeof(xfs_dir_leaf_entry_t)-1) + - state->args->namelen; - } - - *countarg = count; - *namebytesarg = totallen; - return foundit; -} - -/*======================================================================== - * Routines used for shrinking the Btree. - *========================================================================*/ - -/* - * Check a leaf block and its neighbors to see if the block should be - * collapsed into one or the other neighbor. Always keep the block - * with the smaller block number. - * If the current block is over 50% full, don't try to join it, return 0. - * If the block is empty, fill in the state structure and return 2. - * If it can be collapsed, fill in the state structure and return 1. - * If nothing can be done, return 0. - */ -int -xfs_dir_leaf_toosmall(xfs_da_state_t *state, int *action) -{ - xfs_dir_leafblock_t *leaf; - xfs_da_state_blk_t *blk; - xfs_da_blkinfo_t *info; - int count, bytes, forward, error, retval, i; - xfs_dablk_t blkno; - xfs_dabuf_t *bp; - - /* - * Check for the degenerate case of the block being over 50% full. - * If so, it's not worth even looking to see if we might be able - * to coalesce with a sibling. - */ - blk = &state->path.blk[ state->path.active-1 ]; - info = blk->bp->data; - ASSERT(be16_to_cpu(info->magic) == XFS_DIR_LEAF_MAGIC); - leaf = (xfs_dir_leafblock_t *)info; - count = INT_GET(leaf->hdr.count, ARCH_CONVERT); - bytes = (uint)sizeof(xfs_dir_leaf_hdr_t) + - count * (uint)sizeof(xfs_dir_leaf_entry_t) + - count * ((uint)sizeof(xfs_dir_leaf_name_t)-1) + - INT_GET(leaf->hdr.namebytes, ARCH_CONVERT); - if (bytes > (state->blocksize >> 1)) { - *action = 0; /* blk over 50%, don't try to join */ - return 0; - } - - /* - * Check for the degenerate case of the block being empty. - * If the block is empty, we'll simply delete it, no need to - * coalesce it with a sibling block. We choose (arbitrarily) - * to merge with the forward block unless it is NULL. - */ - if (count == 0) { - /* - * Make altpath point to the block we want to keep and - * path point to the block we want to drop (this one). - */ - forward = (info->forw != 0); - memcpy(&state->altpath, &state->path, sizeof(state->path)); - error = xfs_da_path_shift(state, &state->altpath, forward, - 0, &retval); - if (error) - return error; - if (retval) { - *action = 0; - } else { - *action = 2; - } - return 0; - } - - /* - * Examine each sibling block to see if we can coalesce with - * at least 25% free space to spare. We need to figure out - * whether to merge with the forward or the backward block. - * We prefer coalescing with the lower numbered sibling so as - * to shrink a directory over time. - */ - forward = (be32_to_cpu(info->forw) < be32_to_cpu(info->back)); /* start with smaller blk num */ - for (i = 0; i < 2; forward = !forward, i++) { - if (forward) - blkno = be32_to_cpu(info->forw); - else - blkno = be32_to_cpu(info->back); - if (blkno == 0) - continue; - error = xfs_da_read_buf(state->args->trans, state->args->dp, - blkno, -1, &bp, - XFS_DATA_FORK); - if (error) - return error; - ASSERT(bp != NULL); - - leaf = (xfs_dir_leafblock_t *)info; - count = INT_GET(leaf->hdr.count, ARCH_CONVERT); - bytes = state->blocksize - (state->blocksize>>2); - bytes -= INT_GET(leaf->hdr.namebytes, ARCH_CONVERT); - leaf = bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_DIR_LEAF_MAGIC); - count += INT_GET(leaf->hdr.count, ARCH_CONVERT); - bytes -= INT_GET(leaf->hdr.namebytes, ARCH_CONVERT); - bytes -= count * ((uint)sizeof(xfs_dir_leaf_name_t) - 1); - bytes -= count * (uint)sizeof(xfs_dir_leaf_entry_t); - bytes -= (uint)sizeof(xfs_dir_leaf_hdr_t); - if (bytes >= 0) - break; /* fits with at least 25% to spare */ - - xfs_da_brelse(state->args->trans, bp); - } - if (i >= 2) { - *action = 0; - return 0; - } - xfs_da_buf_done(bp); - - /* - * Make altpath point to the block we want to keep (the lower - * numbered block) and path point to the block we want to drop. - */ - memcpy(&state->altpath, &state->path, sizeof(state->path)); - if (blkno < blk->blkno) { - error = xfs_da_path_shift(state, &state->altpath, forward, - 0, &retval); - } else { - error = xfs_da_path_shift(state, &state->path, forward, - 0, &retval); - } - if (error) - return error; - if (retval) { - *action = 0; - } else { - *action = 1; - } - return 0; -} - -/* - * Remove a name from the leaf directory structure. - * - * Return 1 if leaf is less than 37% full, 0 if >= 37% full. - * If two leaves are 37% full, when combined they will leave 25% free. - */ -int -xfs_dir_leaf_remove(xfs_trans_t *trans, xfs_dabuf_t *bp, int index) -{ - xfs_dir_leafblock_t *leaf; - xfs_dir_leaf_hdr_t *hdr; - xfs_dir_leaf_map_t *map; - xfs_dir_leaf_entry_t *entry; - xfs_dir_leaf_name_t *namest; - int before, after, smallest, entsize; - int tablesize, tmp, i; - xfs_mount_t *mp; - - leaf = bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_DIR_LEAF_MAGIC); - hdr = &leaf->hdr; - mp = trans->t_mountp; - ASSERT((INT_GET(hdr->count, ARCH_CONVERT) > 0) && (INT_GET(hdr->count, ARCH_CONVERT) < (XFS_LBSIZE(mp)/8))); - ASSERT((index >= 0) && (index < INT_GET(hdr->count, ARCH_CONVERT))); - ASSERT(INT_GET(hdr->firstused, ARCH_CONVERT) >= ((INT_GET(hdr->count, ARCH_CONVERT)*sizeof(*entry))+sizeof(*hdr))); - entry = &leaf->entries[index]; - ASSERT(INT_GET(entry->nameidx, ARCH_CONVERT) >= INT_GET(hdr->firstused, ARCH_CONVERT)); - ASSERT(INT_GET(entry->nameidx, ARCH_CONVERT) < XFS_LBSIZE(mp)); - - /* - * Scan through free region table: - * check for adjacency of free'd entry with an existing one, - * find smallest free region in case we need to replace it, - * adjust any map that borders the entry table, - */ - tablesize = INT_GET(hdr->count, ARCH_CONVERT) * (uint)sizeof(xfs_dir_leaf_entry_t) - + (uint)sizeof(xfs_dir_leaf_hdr_t); - map = &hdr->freemap[0]; - tmp = INT_GET(map->size, ARCH_CONVERT); - before = after = -1; - smallest = XFS_DIR_LEAF_MAPSIZE - 1; - entsize = XFS_DIR_LEAF_ENTSIZE_BYENTRY(entry); - for (i = 0; i < XFS_DIR_LEAF_MAPSIZE; map++, i++) { - ASSERT(INT_GET(map->base, ARCH_CONVERT) < XFS_LBSIZE(mp)); - ASSERT(INT_GET(map->size, ARCH_CONVERT) < XFS_LBSIZE(mp)); - if (INT_GET(map->base, ARCH_CONVERT) == tablesize) { - INT_MOD(map->base, ARCH_CONVERT, -((uint)sizeof(xfs_dir_leaf_entry_t))); - INT_MOD(map->size, ARCH_CONVERT, (uint)sizeof(xfs_dir_leaf_entry_t)); - } - - if ((INT_GET(map->base, ARCH_CONVERT) + INT_GET(map->size, ARCH_CONVERT)) == INT_GET(entry->nameidx, ARCH_CONVERT)) { - before = i; - } else if (INT_GET(map->base, ARCH_CONVERT) == (INT_GET(entry->nameidx, ARCH_CONVERT) + entsize)) { - after = i; - } else if (INT_GET(map->size, ARCH_CONVERT) < tmp) { - tmp = INT_GET(map->size, ARCH_CONVERT); - smallest = i; - } - } - - /* - * Coalesce adjacent freemap regions, - * or replace the smallest region. - */ - if ((before >= 0) || (after >= 0)) { - if ((before >= 0) && (after >= 0)) { - map = &hdr->freemap[before]; - INT_MOD(map->size, ARCH_CONVERT, entsize); - INT_MOD(map->size, ARCH_CONVERT, INT_GET(hdr->freemap[after].size, ARCH_CONVERT)); - hdr->freemap[after].base = 0; - hdr->freemap[after].size = 0; - } else if (before >= 0) { - map = &hdr->freemap[before]; - INT_MOD(map->size, ARCH_CONVERT, entsize); - } else { - map = &hdr->freemap[after]; - INT_COPY(map->base, entry->nameidx, ARCH_CONVERT); - INT_MOD(map->size, ARCH_CONVERT, entsize); - } - } else { - /* - * Replace smallest region (if it is smaller than free'd entry) - */ - map = &hdr->freemap[smallest]; - if (INT_GET(map->size, ARCH_CONVERT) < entsize) { - INT_COPY(map->base, entry->nameidx, ARCH_CONVERT); - INT_SET(map->size, ARCH_CONVERT, entsize); - } - } - - /* - * Did we remove the first entry? - */ - if (INT_GET(entry->nameidx, ARCH_CONVERT) == INT_GET(hdr->firstused, ARCH_CONVERT)) - smallest = 1; - else - smallest = 0; - - /* - * Compress the remaining entries and zero out the removed stuff. - */ - namest = XFS_DIR_LEAF_NAMESTRUCT(leaf, INT_GET(entry->nameidx, ARCH_CONVERT)); - memset((char *)namest, 0, entsize); - xfs_da_log_buf(trans, bp, XFS_DA_LOGRANGE(leaf, namest, entsize)); - - INT_MOD(hdr->namebytes, ARCH_CONVERT, -(entry->namelen)); - tmp = (INT_GET(hdr->count, ARCH_CONVERT) - index) * (uint)sizeof(xfs_dir_leaf_entry_t); - memmove(entry, entry + 1, tmp); - INT_MOD(hdr->count, ARCH_CONVERT, -1); - xfs_da_log_buf(trans, bp, - XFS_DA_LOGRANGE(leaf, entry, tmp + (uint)sizeof(*entry))); - entry = &leaf->entries[INT_GET(hdr->count, ARCH_CONVERT)]; - memset((char *)entry, 0, sizeof(xfs_dir_leaf_entry_t)); - - /* - * If we removed the first entry, re-find the first used byte - * in the name area. Note that if the entry was the "firstused", - * then we don't have a "hole" in our block resulting from - * removing the name. - */ - if (smallest) { - tmp = XFS_LBSIZE(mp); - entry = &leaf->entries[0]; - for (i = INT_GET(hdr->count, ARCH_CONVERT)-1; i >= 0; entry++, i--) { - ASSERT(INT_GET(entry->nameidx, ARCH_CONVERT) >= INT_GET(hdr->firstused, ARCH_CONVERT)); - ASSERT(INT_GET(entry->nameidx, ARCH_CONVERT) < XFS_LBSIZE(mp)); - if (INT_GET(entry->nameidx, ARCH_CONVERT) < tmp) - tmp = INT_GET(entry->nameidx, ARCH_CONVERT); - } - INT_SET(hdr->firstused, ARCH_CONVERT, tmp); - if (!hdr->firstused) - INT_SET(hdr->firstused, ARCH_CONVERT, tmp - 1); - } else { - hdr->holes = 1; /* mark as needing compaction */ - } - - xfs_da_log_buf(trans, bp, XFS_DA_LOGRANGE(leaf, hdr, sizeof(*hdr))); - - /* - * Check if leaf is less than 50% full, caller may want to - * "join" the leaf with a sibling if so. - */ - tmp = (uint)sizeof(xfs_dir_leaf_hdr_t); - tmp += INT_GET(leaf->hdr.count, ARCH_CONVERT) * (uint)sizeof(xfs_dir_leaf_entry_t); - tmp += INT_GET(leaf->hdr.count, ARCH_CONVERT) * ((uint)sizeof(xfs_dir_leaf_name_t) - 1); - tmp += INT_GET(leaf->hdr.namebytes, ARCH_CONVERT); - if (tmp < mp->m_dir_magicpct) - return 1; /* leaf is < 37% full */ - return 0; -} - -/* - * Move all the directory entries from drop_leaf into save_leaf. - */ -void -xfs_dir_leaf_unbalance(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk, - xfs_da_state_blk_t *save_blk) -{ - xfs_dir_leafblock_t *drop_leaf, *save_leaf, *tmp_leaf; - xfs_dir_leaf_hdr_t *drop_hdr, *save_hdr, *tmp_hdr; - xfs_mount_t *mp; - char *tmpbuffer; - - /* - * Set up environment. - */ - mp = state->mp; - ASSERT(drop_blk->magic == XFS_DIR_LEAF_MAGIC); - ASSERT(save_blk->magic == XFS_DIR_LEAF_MAGIC); - drop_leaf = drop_blk->bp->data; - save_leaf = save_blk->bp->data; - ASSERT(be16_to_cpu(drop_leaf->hdr.info.magic) == XFS_DIR_LEAF_MAGIC); - ASSERT(be16_to_cpu(save_leaf->hdr.info.magic) == XFS_DIR_LEAF_MAGIC); - drop_hdr = &drop_leaf->hdr; - save_hdr = &save_leaf->hdr; - - /* - * Save last hashval from dying block for later Btree fixup. - */ - drop_blk->hashval = INT_GET(drop_leaf->entries[ drop_leaf->hdr.count-1 ].hashval, ARCH_CONVERT); - - /* - * Check if we need a temp buffer, or can we do it in place. - * Note that we don't check "leaf" for holes because we will - * always be dropping it, toosmall() decided that for us already. - */ - if (save_hdr->holes == 0) { - /* - * dest leaf has no holes, so we add there. May need - * to make some room in the entry array. - */ - if (xfs_dir_leaf_order(save_blk->bp, drop_blk->bp)) { - xfs_dir_leaf_moveents(drop_leaf, 0, save_leaf, 0, - (int)INT_GET(drop_hdr->count, ARCH_CONVERT), mp); - } else { - xfs_dir_leaf_moveents(drop_leaf, 0, - save_leaf, INT_GET(save_hdr->count, ARCH_CONVERT), - (int)INT_GET(drop_hdr->count, ARCH_CONVERT), mp); - } - } else { - /* - * Destination has holes, so we make a temporary copy - * of the leaf and add them both to that. - */ - tmpbuffer = kmem_alloc(state->blocksize, KM_SLEEP); - ASSERT(tmpbuffer != NULL); - memset(tmpbuffer, 0, state->blocksize); - tmp_leaf = (xfs_dir_leafblock_t *)tmpbuffer; - tmp_hdr = &tmp_leaf->hdr; - tmp_hdr->info = save_hdr->info; /* struct copy */ - tmp_hdr->count = 0; - INT_SET(tmp_hdr->firstused, ARCH_CONVERT, state->blocksize); - if (!tmp_hdr->firstused) - INT_SET(tmp_hdr->firstused, ARCH_CONVERT, state->blocksize - 1); - tmp_hdr->namebytes = 0; - if (xfs_dir_leaf_order(save_blk->bp, drop_blk->bp)) { - xfs_dir_leaf_moveents(drop_leaf, 0, tmp_leaf, 0, - (int)INT_GET(drop_hdr->count, ARCH_CONVERT), mp); - xfs_dir_leaf_moveents(save_leaf, 0, - tmp_leaf, INT_GET(tmp_leaf->hdr.count, ARCH_CONVERT), - (int)INT_GET(save_hdr->count, ARCH_CONVERT), mp); - } else { - xfs_dir_leaf_moveents(save_leaf, 0, tmp_leaf, 0, - (int)INT_GET(save_hdr->count, ARCH_CONVERT), mp); - xfs_dir_leaf_moveents(drop_leaf, 0, - tmp_leaf, INT_GET(tmp_leaf->hdr.count, ARCH_CONVERT), - (int)INT_GET(drop_hdr->count, ARCH_CONVERT), mp); - } - memcpy(save_leaf, tmp_leaf, state->blocksize); - kmem_free(tmpbuffer, state->blocksize); - } - - xfs_da_log_buf(state->args->trans, save_blk->bp, 0, - state->blocksize - 1); - - /* - * Copy out last hashval in each block for B-tree code. - */ - save_blk->hashval = INT_GET(save_leaf->entries[ INT_GET(save_leaf->hdr.count, ARCH_CONVERT)-1 ].hashval, ARCH_CONVERT); -} - -/*======================================================================== - * Routines used for finding things in the Btree. - *========================================================================*/ - -/* - * Look up a name in a leaf directory structure. - * This is the internal routine, it uses the caller's buffer. - * - * Note that duplicate keys are allowed, but only check within the - * current leaf node. The Btree code must check in adjacent leaf nodes. - * - * Return in *index the index into the entry[] array of either the found - * entry, or where the entry should have been (insert before that entry). - * - * Don't change the args->inumber unless we find the filename. - */ -int -xfs_dir_leaf_lookup_int(xfs_dabuf_t *bp, xfs_da_args_t *args, int *index) -{ - xfs_dir_leafblock_t *leaf; - xfs_dir_leaf_entry_t *entry; - xfs_dir_leaf_name_t *namest; - int probe, span; - xfs_dahash_t hashval; - - leaf = bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_DIR_LEAF_MAGIC); - ASSERT(INT_GET(leaf->hdr.count, ARCH_CONVERT) < (XFS_LBSIZE(args->dp->i_mount)/8)); - - /* - * Binary search. (note: small blocks will skip this loop) - */ - hashval = args->hashval; - probe = span = INT_GET(leaf->hdr.count, ARCH_CONVERT) / 2; - for (entry = &leaf->entries[probe]; span > 4; - entry = &leaf->entries[probe]) { - span /= 2; - if (INT_GET(entry->hashval, ARCH_CONVERT) < hashval) - probe += span; - else if (INT_GET(entry->hashval, ARCH_CONVERT) > hashval) - probe -= span; - else - break; - } - ASSERT((probe >= 0) && \ - ((!leaf->hdr.count) || (probe < INT_GET(leaf->hdr.count, ARCH_CONVERT)))); - ASSERT((span <= 4) || (INT_GET(entry->hashval, ARCH_CONVERT) == hashval)); - - /* - * Since we may have duplicate hashval's, find the first matching - * hashval in the leaf. - */ - while ((probe > 0) && (INT_GET(entry->hashval, ARCH_CONVERT) >= hashval)) { - entry--; - probe--; - } - while ((probe < INT_GET(leaf->hdr.count, ARCH_CONVERT)) && (INT_GET(entry->hashval, ARCH_CONVERT) < hashval)) { - entry++; - probe++; - } - if ((probe == INT_GET(leaf->hdr.count, ARCH_CONVERT)) || (INT_GET(entry->hashval, ARCH_CONVERT) != hashval)) { - *index = probe; - ASSERT(args->oknoent); - return XFS_ERROR(ENOENT); - } - - /* - * Duplicate keys may be present, so search all of them for a match. - */ - while ((probe < INT_GET(leaf->hdr.count, ARCH_CONVERT)) && (INT_GET(entry->hashval, ARCH_CONVERT) == hashval)) { - namest = XFS_DIR_LEAF_NAMESTRUCT(leaf, INT_GET(entry->nameidx, ARCH_CONVERT)); - if (entry->namelen == args->namelen && - namest->name[0] == args->name[0] && - memcmp(args->name, namest->name, args->namelen) == 0) { - XFS_DIR_SF_GET_DIRINO(&namest->inumber, &args->inumber); - *index = probe; - return XFS_ERROR(EEXIST); - } - entry++; - probe++; - } - *index = probe; - ASSERT(probe == INT_GET(leaf->hdr.count, ARCH_CONVERT) || args->oknoent); - return XFS_ERROR(ENOENT); -} - -/*======================================================================== - * Utility routines. - *========================================================================*/ - -/* - * Move the indicated entries from one leaf to another. - * NOTE: this routine modifies both source and destination leaves. - */ -/* ARGSUSED */ -STATIC void -xfs_dir_leaf_moveents(xfs_dir_leafblock_t *leaf_s, int start_s, - xfs_dir_leafblock_t *leaf_d, int start_d, - int count, xfs_mount_t *mp) -{ - xfs_dir_leaf_hdr_t *hdr_s, *hdr_d; - xfs_dir_leaf_entry_t *entry_s, *entry_d; - int tmp, i; - - /* - * Check for nothing to do. - */ - if (count == 0) - return; - - /* - * Set up environment. - */ - ASSERT(be16_to_cpu(leaf_s->hdr.info.magic) == XFS_DIR_LEAF_MAGIC); - ASSERT(be16_to_cpu(leaf_d->hdr.info.magic) == XFS_DIR_LEAF_MAGIC); - hdr_s = &leaf_s->hdr; - hdr_d = &leaf_d->hdr; - ASSERT((INT_GET(hdr_s->count, ARCH_CONVERT) > 0) && (INT_GET(hdr_s->count, ARCH_CONVERT) < (XFS_LBSIZE(mp)/8))); - ASSERT(INT_GET(hdr_s->firstused, ARCH_CONVERT) >= - ((INT_GET(hdr_s->count, ARCH_CONVERT)*sizeof(*entry_s))+sizeof(*hdr_s))); - ASSERT(INT_GET(hdr_d->count, ARCH_CONVERT) < (XFS_LBSIZE(mp)/8)); - ASSERT(INT_GET(hdr_d->firstused, ARCH_CONVERT) >= - ((INT_GET(hdr_d->count, ARCH_CONVERT)*sizeof(*entry_d))+sizeof(*hdr_d))); - - ASSERT(start_s < INT_GET(hdr_s->count, ARCH_CONVERT)); - ASSERT(start_d <= INT_GET(hdr_d->count, ARCH_CONVERT)); - ASSERT(count <= INT_GET(hdr_s->count, ARCH_CONVERT)); - - /* - * Move the entries in the destination leaf up to make a hole? - */ - if (start_d < INT_GET(hdr_d->count, ARCH_CONVERT)) { - tmp = INT_GET(hdr_d->count, ARCH_CONVERT) - start_d; - tmp *= (uint)sizeof(xfs_dir_leaf_entry_t); - entry_s = &leaf_d->entries[start_d]; - entry_d = &leaf_d->entries[start_d + count]; - memcpy(entry_d, entry_s, tmp); - } - - /* - * Copy all entry's in the same (sorted) order, - * but allocate filenames packed and in sequence. - */ - entry_s = &leaf_s->entries[start_s]; - entry_d = &leaf_d->entries[start_d]; - for (i = 0; i < count; entry_s++, entry_d++, i++) { - ASSERT(INT_GET(entry_s->nameidx, ARCH_CONVERT) >= INT_GET(hdr_s->firstused, ARCH_CONVERT)); - tmp = XFS_DIR_LEAF_ENTSIZE_BYENTRY(entry_s); - INT_MOD(hdr_d->firstused, ARCH_CONVERT, -(tmp)); - entry_d->hashval = entry_s->hashval; /* INT_: direct copy */ - INT_COPY(entry_d->nameidx, hdr_d->firstused, ARCH_CONVERT); - entry_d->namelen = entry_s->namelen; - ASSERT(INT_GET(entry_d->nameidx, ARCH_CONVERT) + tmp <= XFS_LBSIZE(mp)); - memcpy(XFS_DIR_LEAF_NAMESTRUCT(leaf_d, INT_GET(entry_d->nameidx, ARCH_CONVERT)), - XFS_DIR_LEAF_NAMESTRUCT(leaf_s, INT_GET(entry_s->nameidx, ARCH_CONVERT)), tmp); - ASSERT(INT_GET(entry_s->nameidx, ARCH_CONVERT) + tmp <= XFS_LBSIZE(mp)); - memset((char *)XFS_DIR_LEAF_NAMESTRUCT(leaf_s, INT_GET(entry_s->nameidx, ARCH_CONVERT)), - 0, tmp); - INT_MOD(hdr_s->namebytes, ARCH_CONVERT, -(entry_d->namelen)); - INT_MOD(hdr_d->namebytes, ARCH_CONVERT, entry_d->namelen); - INT_MOD(hdr_s->count, ARCH_CONVERT, -1); - INT_MOD(hdr_d->count, ARCH_CONVERT, +1); - tmp = INT_GET(hdr_d->count, ARCH_CONVERT) * (uint)sizeof(xfs_dir_leaf_entry_t) - + (uint)sizeof(xfs_dir_leaf_hdr_t); - ASSERT(INT_GET(hdr_d->firstused, ARCH_CONVERT) >= tmp); - - } - - /* - * Zero out the entries we just copied. - */ - if (start_s == INT_GET(hdr_s->count, ARCH_CONVERT)) { - tmp = count * (uint)sizeof(xfs_dir_leaf_entry_t); - entry_s = &leaf_s->entries[start_s]; - ASSERT((char *)entry_s + tmp <= (char *)leaf_s + XFS_LBSIZE(mp)); - memset((char *)entry_s, 0, tmp); - } else { - /* - * Move the remaining entries down to fill the hole, - * then zero the entries at the top. - */ - tmp = INT_GET(hdr_s->count, ARCH_CONVERT) - count; - tmp *= (uint)sizeof(xfs_dir_leaf_entry_t); - entry_s = &leaf_s->entries[start_s + count]; - entry_d = &leaf_s->entries[start_s]; - memcpy(entry_d, entry_s, tmp); - - tmp = count * (uint)sizeof(xfs_dir_leaf_entry_t); - entry_s = &leaf_s->entries[INT_GET(hdr_s->count, ARCH_CONVERT)]; - ASSERT((char *)entry_s + tmp <= (char *)leaf_s + XFS_LBSIZE(mp)); - memset((char *)entry_s, 0, tmp); - } - - /* - * Fill in the freemap information - */ - INT_SET(hdr_d->freemap[0].base, ARCH_CONVERT, (uint)sizeof(xfs_dir_leaf_hdr_t)); - INT_MOD(hdr_d->freemap[0].base, ARCH_CONVERT, INT_GET(hdr_d->count, ARCH_CONVERT) * (uint)sizeof(xfs_dir_leaf_entry_t)); - INT_SET(hdr_d->freemap[0].size, ARCH_CONVERT, INT_GET(hdr_d->firstused, ARCH_CONVERT) - INT_GET(hdr_d->freemap[0].base, ARCH_CONVERT)); - INT_SET(hdr_d->freemap[1].base, ARCH_CONVERT, (hdr_d->freemap[2].base = 0)); - INT_SET(hdr_d->freemap[1].size, ARCH_CONVERT, (hdr_d->freemap[2].size = 0)); - hdr_s->holes = 1; /* leaf may not be compact */ -} - -/* - * Compare two leaf blocks "order". - */ -int -xfs_dir_leaf_order(xfs_dabuf_t *leaf1_bp, xfs_dabuf_t *leaf2_bp) -{ - xfs_dir_leafblock_t *leaf1, *leaf2; - - leaf1 = leaf1_bp->data; - leaf2 = leaf2_bp->data; - ASSERT((be16_to_cpu(leaf1->hdr.info.magic) == XFS_DIR_LEAF_MAGIC) && - (be16_to_cpu(leaf2->hdr.info.magic) == XFS_DIR_LEAF_MAGIC)); - if ((INT_GET(leaf1->hdr.count, ARCH_CONVERT) > 0) && (INT_GET(leaf2->hdr.count, ARCH_CONVERT) > 0) && - ((INT_GET(leaf2->entries[ 0 ].hashval, ARCH_CONVERT) < - INT_GET(leaf1->entries[ 0 ].hashval, ARCH_CONVERT)) || - (INT_GET(leaf2->entries[ INT_GET(leaf2->hdr.count, ARCH_CONVERT)-1 ].hashval, ARCH_CONVERT) < - INT_GET(leaf1->entries[ INT_GET(leaf1->hdr.count, ARCH_CONVERT)-1 ].hashval, ARCH_CONVERT)))) { - return 1; - } - return 0; -} - -/* - * Pick up the last hashvalue from a leaf block. - */ -xfs_dahash_t -xfs_dir_leaf_lasthash(xfs_dabuf_t *bp, int *count) -{ - xfs_dir_leafblock_t *leaf; - - leaf = bp->data; - ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_DIR_LEAF_MAGIC); - if (count) - *count = INT_GET(leaf->hdr.count, ARCH_CONVERT); - if (!leaf->hdr.count) - return(0); - return(INT_GET(leaf->entries[ INT_GET(leaf->hdr.count, ARCH_CONVERT)-1 ].hashval, ARCH_CONVERT)); -} - -/* - * Copy out directory entries for getdents(), for leaf directories. - */ -int -xfs_dir_leaf_getdents_int( - xfs_dabuf_t *bp, - xfs_inode_t *dp, - xfs_dablk_t bno, - uio_t *uio, - int *eobp, - xfs_dirent_t *dbp, - xfs_dir_put_t put, - xfs_daddr_t nextda) -{ - xfs_dir_leafblock_t *leaf; - xfs_dir_leaf_entry_t *entry; - xfs_dir_leaf_name_t *namest; - int entno, want_entno, i, nextentno; - xfs_mount_t *mp; - xfs_dahash_t cookhash; - xfs_dahash_t nexthash = 0; -#if (BITS_PER_LONG == 32) - xfs_dahash_t lasthash = XFS_DA_MAXHASH; -#endif - xfs_dir_put_args_t p; - - mp = dp->i_mount; - leaf = bp->data; - if (be16_to_cpu(leaf->hdr.info.magic) != XFS_DIR_LEAF_MAGIC) { - *eobp = 1; - return XFS_ERROR(ENOENT); /* XXX wrong code */ - } - - want_entno = XFS_DA_COOKIE_ENTRY(mp, uio->uio_offset); - - cookhash = XFS_DA_COOKIE_HASH(mp, uio->uio_offset); - - xfs_dir_trace_g_dul("leaf: start", dp, uio, leaf); - - /* - * Re-find our place. - */ - for (i = entno = 0, entry = &leaf->entries[0]; - i < INT_GET(leaf->hdr.count, ARCH_CONVERT); - entry++, i++) { - - namest = XFS_DIR_LEAF_NAMESTRUCT(leaf, - INT_GET(entry->nameidx, ARCH_CONVERT)); - - if (unlikely( - ((char *)namest < (char *)leaf) || - ((char *)namest >= (char *)leaf + XFS_LBSIZE(mp)))) { - XFS_CORRUPTION_ERROR("xfs_dir_leaf_getdents_int(1)", - XFS_ERRLEVEL_LOW, mp, leaf); - xfs_dir_trace_g_du("leaf: corrupted", dp, uio); - return XFS_ERROR(EFSCORRUPTED); - } - if (INT_GET(entry->hashval, ARCH_CONVERT) >= cookhash) { - if ( entno < want_entno - && INT_GET(entry->hashval, ARCH_CONVERT) - == cookhash) { - /* - * Trying to get to a particular offset in a - * run of equal-hashval entries. - */ - entno++; - } else if ( want_entno > 0 - && entno == want_entno - && INT_GET(entry->hashval, ARCH_CONVERT) - == cookhash) { - break; - } else { - entno = 0; - break; - } - } - } - - if (i == INT_GET(leaf->hdr.count, ARCH_CONVERT)) { - xfs_dir_trace_g_du("leaf: hash not found", dp, uio); - if (!leaf->hdr.info.forw) - uio->uio_offset = - XFS_DA_MAKE_COOKIE(mp, 0, 0, XFS_DA_MAXHASH); - /* - * Don't set uio_offset if there's another block: - * the node code will be setting uio_offset anyway. - */ - *eobp = 0; - return 0; - } - xfs_dir_trace_g_due("leaf: hash found", dp, uio, entry); - - p.dbp = dbp; - p.put = put; - p.uio = uio; - - /* - * We're synchronized, start copying entries out to the user. - */ - for (; entno >= 0 && i < INT_GET(leaf->hdr.count, ARCH_CONVERT); - entry++, i++, (entno = nextentno)) { - int lastresid=0, retval; - xfs_dircook_t lastoffset; - xfs_dahash_t thishash; - - /* - * Check for a damaged directory leaf block and pick up - * the inode number from this entry. - */ - namest = XFS_DIR_LEAF_NAMESTRUCT(leaf, - INT_GET(entry->nameidx, ARCH_CONVERT)); - - if (unlikely( - ((char *)namest < (char *)leaf) || - ((char *)namest >= (char *)leaf + XFS_LBSIZE(mp)))) { - XFS_CORRUPTION_ERROR("xfs_dir_leaf_getdents_int(2)", - XFS_ERRLEVEL_LOW, mp, leaf); - xfs_dir_trace_g_du("leaf: corrupted", dp, uio); - return XFS_ERROR(EFSCORRUPTED); - } - - xfs_dir_trace_g_duc("leaf: middle cookie ", - dp, uio, p.cook.o); - - if (i < (INT_GET(leaf->hdr.count, ARCH_CONVERT) - 1)) { - nexthash = INT_GET(entry[1].hashval, ARCH_CONVERT); - - if (nexthash == INT_GET(entry->hashval, ARCH_CONVERT)) - nextentno = entno + 1; - else - nextentno = 0; - XFS_PUT_COOKIE(p.cook, mp, bno, nextentno, nexthash); - xfs_dir_trace_g_duc("leaf: middle cookie ", - dp, uio, p.cook.o); - - } else if ((thishash = be32_to_cpu(leaf->hdr.info.forw))) { - xfs_dabuf_t *bp2; - xfs_dir_leafblock_t *leaf2; - - ASSERT(nextda != -1); - - retval = xfs_da_read_buf(dp->i_transp, dp, thishash, - nextda, &bp2, XFS_DATA_FORK); - if (retval) - return retval; - - ASSERT(bp2 != NULL); - - leaf2 = bp2->data; - - if (unlikely( - (be16_to_cpu(leaf2->hdr.info.magic) - != XFS_DIR_LEAF_MAGIC) - || (be32_to_cpu(leaf2->hdr.info.back) - != bno))) { /* GROT */ - XFS_CORRUPTION_ERROR("xfs_dir_leaf_getdents_int(3)", - XFS_ERRLEVEL_LOW, mp, - leaf2); - xfs_da_brelse(dp->i_transp, bp2); - - return XFS_ERROR(EFSCORRUPTED); - } - - nexthash = INT_GET(leaf2->entries[0].hashval, - ARCH_CONVERT); - nextentno = -1; - XFS_PUT_COOKIE(p.cook, mp, thishash, 0, nexthash); - xfs_da_brelse(dp->i_transp, bp2); - xfs_dir_trace_g_duc("leaf: next blk cookie", - dp, uio, p.cook.o); - } else { - nextentno = -1; - XFS_PUT_COOKIE(p.cook, mp, 0, 0, XFS_DA_MAXHASH); - } - - /* - * Save off the cookie so we can fall back should the - * 'put' into the outgoing buffer fails. To handle a run - * of equal-hashvals, the off_t structure on 64bit - * builds has entno built into the cookie to ID the - * entry. On 32bit builds, we only have space for the - * hashval so we can't ID specific entries within a group - * of same hashval entries. For this, lastoffset is set - * to the first in the run of equal hashvals so we don't - * include any entries unless we can include all entries - * that share the same hashval. Hopefully the buffer - * provided is big enough to handle it (see pv763517). - */ -#if (BITS_PER_LONG == 32) - if ((thishash = INT_GET(entry->hashval, ARCH_CONVERT)) - != lasthash) { - XFS_PUT_COOKIE(lastoffset, mp, bno, entno, thishash); - lastresid = uio->uio_resid; - lasthash = thishash; - } else { - xfs_dir_trace_g_duc("leaf: DUP COOKIES, skipped", - dp, uio, p.cook.o); - } -#else - thishash = INT_GET(entry->hashval, ARCH_CONVERT); - XFS_PUT_COOKIE(lastoffset, mp, bno, entno, thishash); - lastresid = uio->uio_resid; -#endif /* BITS_PER_LONG == 32 */ - - /* - * Put the current entry into the outgoing buffer. If we fail - * then restore the UIO to the first entry in the current - * run of equal-hashval entries (probably one 1 entry long). - */ - p.ino = XFS_GET_DIR_INO8(namest->inumber); -#if XFS_BIG_INUMS - p.ino += mp->m_inoadd; -#endif - p.name = (char *)namest->name; - p.namelen = entry->namelen; - - retval = p.put(&p); - - if (!p.done) { - uio->uio_offset = lastoffset.o; - uio->uio_resid = lastresid; - - *eobp = 1; - - xfs_dir_trace_g_du("leaf: E-O-B", dp, uio); - - return retval; - } - } - - uio->uio_offset = p.cook.o; - - *eobp = 0; - - xfs_dir_trace_g_du("leaf: E-O-F", dp, uio); - - return 0; -} - -/* - * Format a dirent64 structure and copy it out the the user's buffer. - */ -int -xfs_dir_put_dirent64_direct(xfs_dir_put_args_t *pa) -{ - iovec_t *iovp; - int reclen, namelen; - xfs_dirent_t *idbp; - uio_t *uio; - - namelen = pa->namelen; - reclen = DIRENTSIZE(namelen); - uio = pa->uio; - if (reclen > uio->uio_resid) { - pa->done = 0; - return 0; - } - iovp = uio->uio_iov; - idbp = (xfs_dirent_t *)iovp->iov_base; - iovp->iov_base = (char *)idbp + reclen; - iovp->iov_len -= reclen; - uio->uio_resid -= reclen; - idbp->d_reclen = reclen; - idbp->d_ino = pa->ino; - idbp->d_off = pa->cook.o; - idbp->d_name[namelen] = '\0'; - pa->done = 1; - memcpy(idbp->d_name, pa->name, namelen); - return 0; -} - -/* - * Format a dirent64 structure and copy it out the the user's buffer. - */ -int -xfs_dir_put_dirent64_uio(xfs_dir_put_args_t *pa) -{ - int retval, reclen, namelen; - xfs_dirent_t *idbp; - uio_t *uio; - - namelen = pa->namelen; - reclen = DIRENTSIZE(namelen); - uio = pa->uio; - if (reclen > uio->uio_resid) { - pa->done = 0; - return 0; - } - idbp = pa->dbp; - idbp->d_reclen = reclen; - idbp->d_ino = pa->ino; - idbp->d_off = pa->cook.o; - idbp->d_name[namelen] = '\0'; - memcpy(idbp->d_name, pa->name, namelen); - retval = uio_read((caddr_t)idbp, reclen, uio); - pa->done = (retval == 0); - return retval; -} diff --git a/fs/xfs/xfs_dir_leaf.h b/fs/xfs/xfs_dir_leaf.h deleted file mode 100644 index eb8cd9a46..000000000 --- a/fs/xfs/xfs_dir_leaf.h +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would 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 the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_DIR_LEAF_H__ -#define __XFS_DIR_LEAF_H__ - -/* - * Directory layout, internal structure, access macros, etc. - * - * Large directories are structured around Btrees where all the data - * elements are in the leaf nodes. Filenames are hashed into an int, - * then that int is used as the index into the Btree. Since the hashval - * of a filename may not be unique, we may have duplicate keys. The - * internal links in the Btree are logical block offsets into the file. - */ - -struct uio; -struct xfs_bmap_free; -struct xfs_dabuf; -struct xfs_da_args; -struct xfs_da_state; -struct xfs_da_state_blk; -struct xfs_dir_put_args; -struct xfs_inode; -struct xfs_mount; -struct xfs_trans; - -/*======================================================================== - * Directory Structure when equal to XFS_LBSIZE(mp) bytes. - *========================================================================*/ - -/* - * This is the structure of the leaf nodes in the Btree. - * - * Struct leaf_entry's are packed from the top. Names grow from the bottom - * but are not packed. The freemap contains run-length-encoded entries - * for the free bytes after the leaf_entry's, but only the N largest such, - * smaller runs are dropped. When the freemap doesn't show enough space - * for an allocation, we compact the namelist area and try again. If we - * still don't have enough space, then we have to split the block. - * - * Since we have duplicate hash keys, for each key that matches, compare - * the actual string. The root and intermediate node search always takes - * the first-in-the-block key match found, so we should only have to work - * "forw"ard. If none matches, continue with the "forw"ard leaf nodes - * until the hash key changes or the filename is found. - * - * The parent directory and the self-pointer are explicitly represented - * (ie: there are entries for "." and ".."). - * - * Note that the count being a __uint16_t limits us to something like a - * blocksize of 1.3MB in the face of worst case (short) filenames. - */ -#define XFS_DIR_LEAF_MAPSIZE 3 /* how many freespace slots */ - -typedef struct xfs_dir_leaf_map { /* RLE map of free bytes */ - __uint16_t base; /* base of free region */ - __uint16_t size; /* run length of free region */ -} xfs_dir_leaf_map_t; - -typedef struct xfs_dir_leaf_hdr { /* constant-structure header block */ - xfs_da_blkinfo_t info; /* block type, links, etc. */ - __uint16_t count; /* count of active leaf_entry's */ - __uint16_t namebytes; /* num bytes of name strings stored */ - __uint16_t firstused; /* first used byte in name area */ - __uint8_t holes; /* != 0 if blk needs compaction */ - __uint8_t pad1; - xfs_dir_leaf_map_t freemap[XFS_DIR_LEAF_MAPSIZE]; -} xfs_dir_leaf_hdr_t; - -typedef struct xfs_dir_leaf_entry { /* sorted on key, not name */ - xfs_dahash_t hashval; /* hash value of name */ - __uint16_t nameidx; /* index into buffer of name */ - __uint8_t namelen; /* length of name string */ - __uint8_t pad2; -} xfs_dir_leaf_entry_t; - -typedef struct xfs_dir_leaf_name { - xfs_dir_ino_t inumber; /* inode number for this key */ - __uint8_t name[1]; /* name string itself */ -} xfs_dir_leaf_name_t; - -typedef struct xfs_dir_leafblock { - xfs_dir_leaf_hdr_t hdr; /* constant-structure header block */ - xfs_dir_leaf_entry_t entries[1]; /* var sized array */ - xfs_dir_leaf_name_t namelist[1]; /* grows from bottom of buf */ -} xfs_dir_leafblock_t; - -/* - * Length of name for which a 512-byte block filesystem - * can get a double split. - */ -#define XFS_DIR_LEAF_CAN_DOUBLE_SPLIT_LEN \ - (512 - (uint)sizeof(xfs_dir_leaf_hdr_t) - \ - (uint)sizeof(xfs_dir_leaf_entry_t) * 2 - \ - (uint)sizeof(xfs_dir_leaf_name_t) * 2 - (MAXNAMELEN - 2) + 1 + 1) - -typedef int (*xfs_dir_put_t)(struct xfs_dir_put_args *pa); - -typedef union { - xfs_off_t o; /* offset (cookie) */ - /* - * Watch the order here (endian-ness dependent). - */ - struct { -#ifndef XFS_NATIVE_HOST - xfs_dahash_t h; /* hash value */ - __uint32_t be; /* block and entry */ -#else - __uint32_t be; /* block and entry */ - xfs_dahash_t h; /* hash value */ -#endif /* XFS_NATIVE_HOST */ - } s; -} xfs_dircook_t; - -#define XFS_PUT_COOKIE(c,mp,bno,entry,hash) \ - ((c).s.be = XFS_DA_MAKE_BNOENTRY(mp, bno, entry), (c).s.h = (hash)) - -typedef struct xfs_dir_put_args { - xfs_dircook_t cook; /* cookie of (next) entry */ - xfs_intino_t ino; /* inode number */ - struct xfs_dirent *dbp; /* buffer pointer */ - char *name; /* directory entry name */ - int namelen; /* length of name */ - int done; /* output: set if value was stored */ - xfs_dir_put_t put; /* put function ptr (i/o) */ - struct uio *uio; /* uio control structure */ -} xfs_dir_put_args_t; - -#define XFS_DIR_LEAF_ENTSIZE_BYNAME(len) \ - xfs_dir_leaf_entsize_byname(len) -static inline int xfs_dir_leaf_entsize_byname(int len) -{ - return (uint)sizeof(xfs_dir_leaf_name_t)-1 + len; -} - -#define XFS_DIR_LEAF_ENTSIZE_BYENTRY(entry) \ - xfs_dir_leaf_entsize_byentry(entry) -static inline int xfs_dir_leaf_entsize_byentry(xfs_dir_leaf_entry_t *entry) -{ - return (uint)sizeof(xfs_dir_leaf_name_t)-1 + (entry)->namelen; -} - -#define XFS_DIR_LEAF_NAMESTRUCT(leafp,offset) \ - xfs_dir_leaf_namestruct(leafp,offset) -static inline xfs_dir_leaf_name_t * -xfs_dir_leaf_namestruct(xfs_dir_leafblock_t *leafp, int offset) -{ - return (xfs_dir_leaf_name_t *)&((char *)(leafp))[offset]; -} - -/*======================================================================== - * Function prototypes for the kernel. - *========================================================================*/ - -/* - * Internal routines when dirsize < XFS_LITINO(mp). - */ -int xfs_dir_shortform_create(struct xfs_da_args *args, xfs_ino_t parent); -int xfs_dir_shortform_addname(struct xfs_da_args *args); -int xfs_dir_shortform_lookup(struct xfs_da_args *args); -int xfs_dir_shortform_to_leaf(struct xfs_da_args *args); -int xfs_dir_shortform_removename(struct xfs_da_args *args); -int xfs_dir_shortform_getdents(struct xfs_inode *dp, struct uio *uio, int *eofp, - struct xfs_dirent *dbp, xfs_dir_put_t put); -int xfs_dir_shortform_replace(struct xfs_da_args *args); - -/* - * Internal routines when dirsize == XFS_LBSIZE(mp). - */ -int xfs_dir_leaf_to_node(struct xfs_da_args *args); -int xfs_dir_leaf_to_shortform(struct xfs_da_args *args); - -/* - * Routines used for growing the Btree. - */ -int xfs_dir_leaf_split(struct xfs_da_state *state, - struct xfs_da_state_blk *oldblk, - struct xfs_da_state_blk *newblk); -int xfs_dir_leaf_add(struct xfs_dabuf *leaf_buffer, - struct xfs_da_args *args, int insertion_index); -int xfs_dir_leaf_addname(struct xfs_da_args *args); -int xfs_dir_leaf_lookup_int(struct xfs_dabuf *leaf_buffer, - struct xfs_da_args *args, - int *index_found_at); -int xfs_dir_leaf_remove(struct xfs_trans *trans, - struct xfs_dabuf *leaf_buffer, - int index_to_remove); -int xfs_dir_leaf_getdents_int(struct xfs_dabuf *bp, struct xfs_inode *dp, - xfs_dablk_t bno, struct uio *uio, - int *eobp, struct xfs_dirent *dbp, - xfs_dir_put_t put, xfs_daddr_t nextda); - -/* - * Routines used for shrinking the Btree. - */ -int xfs_dir_leaf_toosmall(struct xfs_da_state *state, int *retval); -void xfs_dir_leaf_unbalance(struct xfs_da_state *state, - struct xfs_da_state_blk *drop_blk, - struct xfs_da_state_blk *save_blk); - -/* - * Utility routines. - */ -uint xfs_dir_leaf_lasthash(struct xfs_dabuf *bp, int *count); -int xfs_dir_leaf_order(struct xfs_dabuf *leaf1_bp, - struct xfs_dabuf *leaf2_bp); -int xfs_dir_put_dirent64_direct(xfs_dir_put_args_t *pa); -int xfs_dir_put_dirent64_uio(xfs_dir_put_args_t *pa); -int xfs_dir_ino_validate(struct xfs_mount *mp, xfs_ino_t ino); - -/* - * Global data. - */ -extern xfs_dahash_t xfs_dir_hash_dot, xfs_dir_hash_dotdot; - -#endif /* __XFS_DIR_LEAF_H__ */ diff --git a/fs/xfs/xfs_dir_sf.h b/fs/xfs/xfs_dir_sf.h deleted file mode 100644 index 5b20b4d3f..000000000 --- a/fs/xfs/xfs_dir_sf.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright (c) 2000,2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would 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 the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_DIR_SF_H__ -#define __XFS_DIR_SF_H__ - -/* - * Directory layout when stored internal to an inode. - * - * Small directories are packed as tightly as possible so as to - * fit into the literal area of the inode. - */ - -typedef struct { __uint8_t i[sizeof(xfs_ino_t)]; } xfs_dir_ino_t; - -/* - * The parent directory has a dedicated field, and the self-pointer must - * be calculated on the fly. - * - * Entries are packed toward the top as tight as possible. The header - * and the elements much be memcpy'd out into a work area to get correct - * alignment for the inode number fields. - */ -typedef struct xfs_dir_sf_hdr { /* constant-structure header block */ - xfs_dir_ino_t parent; /* parent dir inode number */ - __uint8_t count; /* count of active entries */ -} xfs_dir_sf_hdr_t; - -typedef struct xfs_dir_sf_entry { - xfs_dir_ino_t inumber; /* referenced inode number */ - __uint8_t namelen; /* actual length of name (no NULL) */ - __uint8_t name[1]; /* name */ -} xfs_dir_sf_entry_t; - -typedef struct xfs_dir_shortform { - xfs_dir_sf_hdr_t hdr; - xfs_dir_sf_entry_t list[1]; /* variable sized array */ -} xfs_dir_shortform_t; - -/* - * We generate this then sort it, so that readdirs are returned in - * hash-order. Else seekdir won't work. - */ -typedef struct xfs_dir_sf_sort { - __uint8_t entno; /* .=0, ..=1, else entry# + 2 */ - __uint8_t seqno; /* sequence # with same hash value */ - __uint8_t namelen; /* length of name value (no null) */ - xfs_dahash_t hash; /* this entry's hash value */ - xfs_intino_t ino; /* this entry's inode number */ - char *name; /* name value, pointer into buffer */ -} xfs_dir_sf_sort_t; - -#define XFS_DIR_SF_GET_DIRINO(from,to) xfs_dir_sf_get_dirino(from, to) -static inline void xfs_dir_sf_get_dirino(xfs_dir_ino_t *from, xfs_ino_t *to) -{ - *(to) = XFS_GET_DIR_INO8(*from); -} - -#define XFS_DIR_SF_PUT_DIRINO(from,to) xfs_dir_sf_put_dirino(from, to) -static inline void xfs_dir_sf_put_dirino(xfs_ino_t *from, xfs_dir_ino_t *to) -{ - XFS_PUT_DIR_INO8(*(from), *(to)); -} - -#define XFS_DIR_SF_ENTSIZE_BYNAME(len) xfs_dir_sf_entsize_byname(len) -static inline int xfs_dir_sf_entsize_byname(int len) -{ - return (uint)sizeof(xfs_dir_sf_entry_t)-1 + (len); -} - -#define XFS_DIR_SF_ENTSIZE_BYENTRY(sfep) xfs_dir_sf_entsize_byentry(sfep) -static inline int xfs_dir_sf_entsize_byentry(xfs_dir_sf_entry_t *sfep) -{ - return (uint)sizeof(xfs_dir_sf_entry_t)-1 + (sfep)->namelen; -} - -#define XFS_DIR_SF_NEXTENTRY(sfep) xfs_dir_sf_nextentry(sfep) -static inline xfs_dir_sf_entry_t *xfs_dir_sf_nextentry(xfs_dir_sf_entry_t *sfep) -{ - return (xfs_dir_sf_entry_t *) \ - ((char *)(sfep) + XFS_DIR_SF_ENTSIZE_BYENTRY(sfep)); -} - -#define XFS_DIR_SF_ALLFIT(count,totallen) \ - xfs_dir_sf_allfit(count,totallen) -static inline int xfs_dir_sf_allfit(int count, int totallen) -{ - return ((uint)sizeof(xfs_dir_sf_hdr_t) + \ - ((uint)sizeof(xfs_dir_sf_entry_t)-1)*(count) + (totallen)); -} - -#if defined(XFS_DIR_TRACE) - -/* - * Kernel tracing support for directories. - */ -struct uio; -struct xfs_inode; -struct xfs_da_intnode; -struct xfs_dinode; -struct xfs_dir_leafblock; -struct xfs_dir_leaf_entry; - -#define XFS_DIR_TRACE_SIZE 4096 /* size of global trace buffer */ -extern ktrace_t *xfs_dir_trace_buf; - -/* - * Trace record types. - */ -#define XFS_DIR_KTRACE_G_DU 1 /* dp, uio */ -#define XFS_DIR_KTRACE_G_DUB 2 /* dp, uio, bno */ -#define XFS_DIR_KTRACE_G_DUN 3 /* dp, uio, node */ -#define XFS_DIR_KTRACE_G_DUL 4 /* dp, uio, leaf */ -#define XFS_DIR_KTRACE_G_DUE 5 /* dp, uio, leaf entry */ -#define XFS_DIR_KTRACE_G_DUC 6 /* dp, uio, cookie */ - -void xfs_dir_trace_g_du(char *where, struct xfs_inode *dp, struct uio *uio); -void xfs_dir_trace_g_dub(char *where, struct xfs_inode *dp, struct uio *uio, - xfs_dablk_t bno); -void xfs_dir_trace_g_dun(char *where, struct xfs_inode *dp, struct uio *uio, - struct xfs_da_intnode *node); -void xfs_dir_trace_g_dul(char *where, struct xfs_inode *dp, struct uio *uio, - struct xfs_dir_leafblock *leaf); -void xfs_dir_trace_g_due(char *where, struct xfs_inode *dp, struct uio *uio, - struct xfs_dir_leaf_entry *entry); -void xfs_dir_trace_g_duc(char *where, struct xfs_inode *dp, struct uio *uio, - xfs_off_t cookie); -void xfs_dir_trace_enter(int type, char *where, - void *a0, void *a1, void *a2, void *a3, - void *a4, void *a5, void *a6, void *a7, - void *a8, void *a9, void *a10, void *a11); -#else -#define xfs_dir_trace_g_du(w,d,u) -#define xfs_dir_trace_g_dub(w,d,u,b) -#define xfs_dir_trace_g_dun(w,d,u,n) -#define xfs_dir_trace_g_dul(w,d,u,l) -#define xfs_dir_trace_g_due(w,d,u,e) -#define xfs_dir_trace_g_duc(w,d,u,c) -#endif /* DEBUG */ - -#endif /* __XFS_DIR_SF_H__ */ diff --git a/fs/xfs/xfs_dmapi.h b/fs/xfs/xfs_dmapi.h index 00b1540f8..4e7865ad6 100644 --- a/fs/xfs/xfs_dmapi.h +++ b/fs/xfs/xfs_dmapi.h @@ -189,6 +189,6 @@ typedef enum { #define AT_DELAY_FLAG(f) ((f&ATTR_NONBLOCK) ? DM_FLAGS_NDELAY : 0) -extern struct bhv_vfsops xfs_dmops; +extern struct bhv_module_vfsops xfs_dmops; #endif /* __XFS_DMAPI_H__ */ diff --git a/fs/xfs/xfs_dmops.c b/fs/xfs/xfs_dmops.c index 629795b3b..1e4a35ddf 100644 --- a/fs/xfs/xfs_dmops.c +++ b/fs/xfs/xfs_dmops.c @@ -23,7 +23,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c index 2a21c5024..b95681b03 100644 --- a/fs/xfs/xfs_error.c +++ b/fs/xfs/xfs_error.c @@ -22,12 +22,10 @@ #include "xfs_inum.h" #include "xfs_trans.h" #include "xfs_sb.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index f19282ec8..6cf6d8769 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -23,7 +23,6 @@ #include "xfs_trans.h" #include "xfs_buf_item.h" #include "xfs_sb.h" -#include "xfs_dir.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_trans_priv.h" @@ -293,6 +292,62 @@ xfs_efi_init(xfs_mount_t *mp, return (efip); } +/* + * Copy an EFI format buffer from the given buf, and into the destination + * EFI format structure. + * The given buffer can be in 32 bit or 64 bit form (which has different padding), + * one of which will be the native format for this kernel. + * It will handle the conversion of formats if necessary. + */ +int +xfs_efi_copy_format(xfs_log_iovec_t *buf, xfs_efi_log_format_t *dst_efi_fmt) +{ + xfs_efi_log_format_t *src_efi_fmt = (xfs_efi_log_format_t *)buf->i_addr; + uint i; + uint len = sizeof(xfs_efi_log_format_t) + + (src_efi_fmt->efi_nextents - 1) * sizeof(xfs_extent_t); + uint len32 = sizeof(xfs_efi_log_format_32_t) + + (src_efi_fmt->efi_nextents - 1) * sizeof(xfs_extent_32_t); + uint len64 = sizeof(xfs_efi_log_format_64_t) + + (src_efi_fmt->efi_nextents - 1) * sizeof(xfs_extent_64_t); + + if (buf->i_len == len) { + memcpy((char *)dst_efi_fmt, (char*)src_efi_fmt, len); + return 0; + } else if (buf->i_len == len32) { + xfs_efi_log_format_32_t *src_efi_fmt_32 = + (xfs_efi_log_format_32_t *)buf->i_addr; + + dst_efi_fmt->efi_type = src_efi_fmt_32->efi_type; + dst_efi_fmt->efi_size = src_efi_fmt_32->efi_size; + dst_efi_fmt->efi_nextents = src_efi_fmt_32->efi_nextents; + dst_efi_fmt->efi_id = src_efi_fmt_32->efi_id; + for (i = 0; i < dst_efi_fmt->efi_nextents; i++) { + dst_efi_fmt->efi_extents[i].ext_start = + src_efi_fmt_32->efi_extents[i].ext_start; + dst_efi_fmt->efi_extents[i].ext_len = + src_efi_fmt_32->efi_extents[i].ext_len; + } + return 0; + } else if (buf->i_len == len64) { + xfs_efi_log_format_64_t *src_efi_fmt_64 = + (xfs_efi_log_format_64_t *)buf->i_addr; + + dst_efi_fmt->efi_type = src_efi_fmt_64->efi_type; + dst_efi_fmt->efi_size = src_efi_fmt_64->efi_size; + dst_efi_fmt->efi_nextents = src_efi_fmt_64->efi_nextents; + dst_efi_fmt->efi_id = src_efi_fmt_64->efi_id; + for (i = 0; i < dst_efi_fmt->efi_nextents; i++) { + dst_efi_fmt->efi_extents[i].ext_start = + src_efi_fmt_64->efi_extents[i].ext_start; + dst_efi_fmt->efi_extents[i].ext_len = + src_efi_fmt_64->efi_extents[i].ext_len; + } + return 0; + } + return EFSCORRUPTED; +} + /* * This is called by the efd item code below to release references to * the given efi item. Each efd calls this with the number of diff --git a/fs/xfs/xfs_extfree_item.h b/fs/xfs/xfs_extfree_item.h index 5bf681708..0ea45edaa 100644 --- a/fs/xfs/xfs_extfree_item.h +++ b/fs/xfs/xfs_extfree_item.h @@ -26,6 +26,24 @@ typedef struct xfs_extent { xfs_extlen_t ext_len; } xfs_extent_t; +/* + * Since an xfs_extent_t has types (start:64, len: 32) + * there are different alignments on 32 bit and 64 bit kernels. + * So we provide the different variants for use by a + * conversion routine. + */ + +typedef struct xfs_extent_32 { + xfs_dfsbno_t ext_start; + xfs_extlen_t ext_len; +} __attribute__((packed)) xfs_extent_32_t; + +typedef struct xfs_extent_64 { + xfs_dfsbno_t ext_start; + xfs_extlen_t ext_len; + __uint32_t ext_pad; +} xfs_extent_64_t; + /* * This is the structure used to lay out an efi log item in the * log. The efi_extents field is a variable size array whose @@ -39,6 +57,22 @@ typedef struct xfs_efi_log_format { xfs_extent_t efi_extents[1]; /* array of extents to free */ } xfs_efi_log_format_t; +typedef struct xfs_efi_log_format_32 { + unsigned short efi_type; /* efi log item type */ + unsigned short efi_size; /* size of this item */ + uint efi_nextents; /* # extents to free */ + __uint64_t efi_id; /* efi identifier */ + xfs_extent_32_t efi_extents[1]; /* array of extents to free */ +} __attribute__((packed)) xfs_efi_log_format_32_t; + +typedef struct xfs_efi_log_format_64 { + unsigned short efi_type; /* efi log item type */ + unsigned short efi_size; /* size of this item */ + uint efi_nextents; /* # extents to free */ + __uint64_t efi_id; /* efi identifier */ + xfs_extent_64_t efi_extents[1]; /* array of extents to free */ +} xfs_efi_log_format_64_t; + /* * This is the structure used to lay out an efd log item in the * log. The efd_extents array is a variable size array whose @@ -52,6 +86,22 @@ typedef struct xfs_efd_log_format { xfs_extent_t efd_extents[1]; /* array of extents freed */ } xfs_efd_log_format_t; +typedef struct xfs_efd_log_format_32 { + unsigned short efd_type; /* efd log item type */ + unsigned short efd_size; /* size of this item */ + uint efd_nextents; /* # of extents freed */ + __uint64_t efd_efi_id; /* id of corresponding efi */ + xfs_extent_32_t efd_extents[1]; /* array of extents freed */ +} __attribute__((packed)) xfs_efd_log_format_32_t; + +typedef struct xfs_efd_log_format_64 { + unsigned short efd_type; /* efd log item type */ + unsigned short efd_size; /* size of this item */ + uint efd_nextents; /* # of extents freed */ + __uint64_t efd_efi_id; /* id of corresponding efi */ + xfs_extent_64_t efd_extents[1]; /* array of extents freed */ +} xfs_efd_log_format_64_t; + #ifdef __KERNEL__ @@ -103,7 +153,8 @@ extern struct kmem_zone *xfs_efd_zone; xfs_efi_log_item_t *xfs_efi_init(struct xfs_mount *, uint); xfs_efd_log_item_t *xfs_efd_init(struct xfs_mount *, xfs_efi_log_item_t *, uint); - +int xfs_efi_copy_format(xfs_log_iovec_t *buf, + xfs_efi_log_format_t *dst_efi_fmt); void xfs_efi_item_free(xfs_efi_log_item_t *); #endif /* __KERNEL__ */ diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h index 5354048c2..29b164e4a 100644 --- a/fs/xfs/xfs_fs.h +++ b/fs/xfs/xfs_fs.h @@ -67,6 +67,7 @@ struct fsxattr { #define XFS_XFLAG_NOSYMLINKS 0x00000400 /* disallow symlink creation */ #define XFS_XFLAG_EXTSIZE 0x00000800 /* extent size allocator hint */ #define XFS_XFLAG_EXTSZINHERIT 0x00001000 /* inherit inode extent size */ +#define XFS_XFLAG_NODEFRAG 0x00002000 /* do not defragment */ #define XFS_XFLAG_BARRIER 0x00004000 /* chroot() barrier */ #define XFS_XFLAG_IUNLINK 0x00008000 /* immutable unlink */ #define XFS_XFLAG_HASATTR 0x80000000 /* no DIFLAG for this */ @@ -74,9 +75,9 @@ struct fsxattr { /* * Structure for XFS_IOC_GETBMAP. * On input, fill in bmv_offset and bmv_length of the first structure - * to indicate the area of interest in the file, and bmv_entry with the - * number of array elements given. The first structure is updated on - * return to give the offset and length for the next call. + * to indicate the area of interest in the file, and bmv_entries with + * the number of array elements given back. The first structure is + * updated on return to give the offset and length for the next call. */ #ifndef HAVE_GETBMAP struct getbmap { diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index dfa3527b2..c064e72ad 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -24,14 +24,12 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -464,7 +462,7 @@ xfs_fs_counts( xfs_icsb_sync_counters_lazy(mp); s = XFS_SB_LOCK(mp); - cnt->freedata = mp->m_sb.sb_fdblocks; + cnt->freedata = mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); cnt->freertx = mp->m_sb.sb_frextents; cnt->freeino = mp->m_sb.sb_ifree; cnt->allocino = mp->m_sb.sb_icount; @@ -521,15 +519,19 @@ xfs_reserve_blocks( } mp->m_resblks = request; } else { + __int64_t free; + + free = mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); delta = request - mp->m_resblks; - lcounter = mp->m_sb.sb_fdblocks - delta; + lcounter = free - delta; if (lcounter < 0) { /* We can't satisfy the request, just get what we can */ - mp->m_resblks += mp->m_sb.sb_fdblocks; - mp->m_resblks_avail += mp->m_sb.sb_fdblocks; - mp->m_sb.sb_fdblocks = 0; + mp->m_resblks += free; + mp->m_resblks_avail += free; + mp->m_sb.sb_fdblocks = XFS_ALLOC_SET_ASIDE(mp); } else { - mp->m_sb.sb_fdblocks = lcounter; + mp->m_sb.sb_fdblocks = + lcounter + XFS_ALLOC_SET_ASIDE(mp); mp->m_resblks = request; mp->m_resblks_avail += delta; } @@ -542,14 +544,13 @@ xfs_reserve_blocks( } void -xfs_fs_log_dummy(xfs_mount_t *mp) +xfs_fs_log_dummy( + xfs_mount_t *mp) { - xfs_trans_t *tp; - xfs_inode_t *ip; - + xfs_trans_t *tp; + xfs_inode_t *ip; tp = _xfs_trans_alloc(mp, XFS_TRANS_DUMMY1); - atomic_inc(&mp->m_active_trans); if (xfs_trans_reserve(tp, 0, XFS_ICHANGE_LOG_RES(mp), 0, 0, 0)) { xfs_trans_cancel(tp, 0); return; @@ -574,21 +575,22 @@ xfs_fs_goingdown( { switch (inflags) { case XFS_FSOP_GOING_FLAGS_DEFAULT: { - struct vfs *vfsp = XFS_MTOVFS(mp); + struct bhv_vfs *vfsp = XFS_MTOVFS(mp); struct super_block *sb = freeze_bdev(vfsp->vfs_super->s_bdev); if (sb && !IS_ERR(sb)) { - xfs_force_shutdown(mp, XFS_FORCE_UMOUNT); + xfs_force_shutdown(mp, SHUTDOWN_FORCE_UMOUNT); thaw_bdev(sb->s_bdev, sb); } break; } case XFS_FSOP_GOING_FLAGS_LOGFLUSH: - xfs_force_shutdown(mp, XFS_FORCE_UMOUNT); + xfs_force_shutdown(mp, SHUTDOWN_FORCE_UMOUNT); break; case XFS_FSOP_GOING_FLAGS_NOLOGFLUSH: - xfs_force_shutdown(mp, XFS_FORCE_UMOUNT|XFS_LOG_IO_ERROR); + xfs_force_shutdown(mp, + SHUTDOWN_FORCE_UMOUNT | SHUTDOWN_LOG_IO_ERROR); break; default: return XFS_ERROR(EINVAL); diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index deddbd03c..33164a85a 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -24,14 +24,12 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -1174,6 +1172,9 @@ xfs_dilocate( if (agno >= mp->m_sb.sb_agcount || agbno >= mp->m_sb.sb_agblocks || ino != XFS_AGINO_TO_INO(mp, agno, agino)) { #ifdef DEBUG + /* no diagnostics for bulkstat, ino comes from userspace */ + if (flags & XFS_IMAP_BULKSTAT) + return XFS_ERROR(EINVAL); if (agno >= mp->m_sb.sb_agcount) { xfs_fs_cmn_err(CE_ALERT, mp, "xfs_dilocate: agno (%d) >= " diff --git a/fs/xfs/xfs_ialloc_btree.c b/fs/xfs/xfs_ialloc_btree.c index 60c656834..616eeeb69 100644 --- a/fs/xfs/xfs_ialloc_btree.c +++ b/fs/xfs/xfs_ialloc_btree.c @@ -24,14 +24,12 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index b53854325..b905e538f 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c @@ -24,14 +24,12 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -186,7 +184,7 @@ xfs_ihash_promote( */ STATIC int xfs_iget_core( - vnode_t *vp, + bhv_vnode_t *vp, xfs_mount_t *mp, xfs_trans_t *tp, xfs_ino_t ino, @@ -198,7 +196,7 @@ xfs_iget_core( xfs_ihash_t *ih; xfs_inode_t *ip; xfs_inode_t *iq; - vnode_t *inode_vp; + bhv_vnode_t *inode_vp; ulong version; int error; /* REFERENCED */ @@ -468,7 +466,7 @@ finish_inode: * If we have a real type for an on-disk inode, we can set ops(&unlock) * now. If it's a new inode being created, xfs_ialloc will handle it. */ - VFS_INIT_VNODE(XFS_MTOVFS(mp), vp, XFS_ITOBHV(ip), 1); + bhv_vfs_init_vnode(XFS_MTOVFS(mp), vp, XFS_ITOBHV(ip), 1); return 0; } @@ -489,7 +487,7 @@ xfs_iget( xfs_daddr_t bno) { struct inode *inode; - vnode_t *vp = NULL; + bhv_vnode_t *vp = NULL; int error; XFS_STATS_INC(xs_ig_attempts); @@ -543,7 +541,7 @@ retry: void xfs_inode_lock_init( xfs_inode_t *ip, - vnode_t *vp) + bhv_vnode_t *vp) { mrlock_init(&ip->i_lock, MRLOCK_ALLOW_EQUAL_PRI|MRLOCK_BARRIER, "xfsino", (long)vp->v_number); @@ -603,12 +601,10 @@ void xfs_iput(xfs_inode_t *ip, uint lock_flags) { - vnode_t *vp = XFS_ITOV(ip); + bhv_vnode_t *vp = XFS_ITOV(ip); vn_trace_entry(vp, "xfs_iput", (inst_t *)__return_address); - xfs_iunlock(ip, lock_flags); - VN_RELE(vp); } @@ -619,7 +615,7 @@ void xfs_iput_new(xfs_inode_t *ip, uint lock_flags) { - vnode_t *vp = XFS_ITOV(ip); + bhv_vnode_t *vp = XFS_ITOV(ip); struct inode *inode = vn_to_inode(vp); vn_trace_entry(vp, "xfs_iput_new", (inst_t *)__return_address); @@ -645,7 +641,7 @@ xfs_iput_new(xfs_inode_t *ip, void xfs_ireclaim(xfs_inode_t *ip) { - vnode_t *vp; + bhv_vnode_t *vp; /* * Remove from old hash list and mount list. @@ -680,6 +676,8 @@ xfs_ireclaim(xfs_inode_t *ip) vn_bhv_remove(VN_BHV_HEAD(vp), XFS_ITOBHV(ip)); } + xfs_iunlock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); + /* * Free all memory associated with the inode. */ @@ -1033,6 +1031,6 @@ xfs_iflock_nowait(xfs_inode_t *ip) void xfs_ifunlock(xfs_inode_t *ip) { - ASSERT(valusema(&(ip->i_flock)) <= 0); + ASSERT(issemalocked(&(ip->i_flock))); vsema(&(ip->i_flock)); } diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 33f589f5e..7b5dfd116 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2006 Silicon Graphics, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -26,14 +26,12 @@ #include "xfs_trans_priv.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -257,13 +255,11 @@ xfs_itobp( xfs_daddr_t bno, uint imap_flags) { + xfs_imap_t imap; xfs_buf_t *bp; int error; - xfs_imap_t imap; -#ifdef __KERNEL__ int i; int ni; -#endif if (ip->i_blkno == (xfs_daddr_t)0) { /* @@ -320,7 +316,6 @@ xfs_itobp( */ error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, imap.im_blkno, (int)imap.im_len, XFS_BUF_LOCK, &bp); - if (error) { #ifdef DEBUG xfs_fs_cmn_err(CE_ALERT, mp, "xfs_itobp: " @@ -331,17 +326,20 @@ xfs_itobp( #endif /* DEBUG */ return error; } -#ifdef __KERNEL__ + /* * Validate the magic number and version of every inode in the buffer * (if DEBUG kernel) or the first inode in the buffer, otherwise. + * No validation is done here in userspace (xfs_repair). */ -#ifdef DEBUG - ni = (imap_flags & XFS_IMAP_BULKSTAT) ? 0 : - (BBTOB(imap.im_len) >> mp->m_sb.sb_inodelog); -#else - ni = (imap_flags & XFS_IMAP_BULKSTAT) ? 0 : 1; +#if !defined(__KERNEL__) + ni = 0; +#elif defined(DEBUG) + ni = BBTOB(imap.im_len) >> mp->m_sb.sb_inodelog; +#else /* usual case */ + ni = 1; #endif + for (i = 0; i < ni; i++) { int di_ok; xfs_dinode_t *dip; @@ -350,11 +348,18 @@ xfs_itobp( (i << mp->m_sb.sb_inodelog)); di_ok = INT_GET(dip->di_core.di_magic, ARCH_CONVERT) == XFS_DINODE_MAGIC && XFS_DINODE_GOOD_VERSION(INT_GET(dip->di_core.di_version, ARCH_CONVERT)); - if (unlikely(XFS_TEST_ERROR(!di_ok, mp, XFS_ERRTAG_ITOBP_INOTOBP, - XFS_RANDOM_ITOBP_INOTOBP))) { + if (unlikely(XFS_TEST_ERROR(!di_ok, mp, + XFS_ERRTAG_ITOBP_INOTOBP, + XFS_RANDOM_ITOBP_INOTOBP))) { + if (imap_flags & XFS_IMAP_BULKSTAT) { + xfs_trans_brelse(tp, bp); + return XFS_ERROR(EINVAL); + } #ifdef DEBUG - prdev("bad inode magic/vsn daddr %lld #%d (magic=%x)", - mp->m_ddev_targp, + cmn_err(CE_ALERT, + "Device %s - bad inode magic/vsn " + "daddr %lld #%d (magic=%x)", + XFS_BUFTARG_NAME(mp->m_ddev_targp), (unsigned long long)imap.im_blkno, i, INT_GET(dip->di_core.di_magic, ARCH_CONVERT)); #endif @@ -364,7 +369,6 @@ xfs_itobp( return XFS_ERROR(EFSCORRUPTED); } } -#endif /* __KERNEL__ */ xfs_inobp_check(mp, bp); @@ -798,7 +802,6 @@ xfs_xlate_dinode_core( STATIC uint _xfs_dic2xflags( - xfs_dinode_core_t *dic, __uint16_t di_flags) { uint flags = 0; @@ -832,6 +835,8 @@ _xfs_dic2xflags( flags |= XFS_XFLAG_EXTSIZE; if (di_flags & XFS_DIFLAG_EXTSZINHERIT) flags |= XFS_XFLAG_EXTSZINHERIT; + if (di_flags & XFS_DIFLAG_NODEFRAG) + flags |= XFS_XFLAG_NODEFRAG; } return flags; @@ -843,16 +848,16 @@ xfs_ip2xflags( { xfs_dinode_core_t *dic = &ip->i_d; - return _xfs_dic2xflags(dic, dic->di_flags) | - (XFS_CFORK_Q(dic) ? XFS_XFLAG_HASATTR : 0); + return _xfs_dic2xflags(dic->di_flags) | + (XFS_CFORK_Q(dic) ? XFS_XFLAG_HASATTR : 0); } uint xfs_dic2xflags( xfs_dinode_core_t *dic) { - return _xfs_dic2xflags(dic, INT_GET(dic->di_flags, ARCH_CONVERT)) | - (XFS_CFORK_Q_DISK(dic) ? XFS_XFLAG_HASATTR : 0); + return _xfs_dic2xflags(INT_GET(dic->di_flags, ARCH_CONVERT)) | + (XFS_CFORK_Q_DISK(dic) ? XFS_XFLAG_HASATTR : 0); } /* @@ -1103,7 +1108,7 @@ xfs_ialloc( { xfs_ino_t ino; xfs_inode_t *ip; - vnode_t *vp; + bhv_vnode_t *vp; uint flags; int error; @@ -1242,6 +1247,9 @@ xfs_ialloc( di_flags |= XFS_DIFLAG_NOSYMLINKS; if (pip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) di_flags |= XFS_DIFLAG_PROJINHERIT; + if ((pip->i_d.di_flags & XFS_DIFLAG_NODEFRAG) && + xfs_inherit_nodefrag) + di_flags |= XFS_DIFLAG_NODEFRAG; ip->i_d.di_flags |= di_flags; } /* FALLTHROUGH */ @@ -1265,8 +1273,8 @@ xfs_ialloc( */ xfs_trans_log_inode(tp, ip, flags); - /* now that we have an i_mode we can set Linux inode ops (& unlock) */ - VFS_INIT_VNODE(XFS_MTOVFS(tp->t_mountp), vp, XFS_ITOBHV(ip), 1); + /* now that we have an i_mode we can setup inode ops and unlock */ + bhv_vfs_init_vnode(XFS_MTOVFS(tp->t_mountp), vp, XFS_ITOBHV(ip), 1); *ipp = ip; return 0; @@ -1306,7 +1314,7 @@ xfs_isize_check( (xfs_ufsize_t)XFS_MAXIOFFSET(mp)) - map_first), XFS_BMAPI_ENTIRE, NULL, 0, imaps, &nimaps, - NULL)) + NULL, NULL)) return; ASSERT(nimaps == 1); ASSERT(imaps[0].br_startblock == HOLESTARTBLOCK); @@ -1442,7 +1450,7 @@ xfs_itruncate_start( xfs_fsize_t last_byte; xfs_off_t toss_start; xfs_mount_t *mp; - vnode_t *vp; + bhv_vnode_t *vp; ASSERT(ismrlocked(&ip->i_iolock, MR_UPDATE) != 0); ASSERT((new_size == 0) || (new_size <= ip->i_d.di_size)); @@ -1455,9 +1463,9 @@ xfs_itruncate_start( vn_iowait(vp); /* wait for the completion of any pending DIOs */ /* - * Call VOP_TOSS_PAGES() or VOP_FLUSHINVAL_PAGES() to get rid of pages and buffers + * Call toss_pages or flushinval_pages to get rid of pages * overlapping the region being removed. We have to use - * the less efficient VOP_FLUSHINVAL_PAGES() in the case that the + * the less efficient flushinval_pages in the case that the * caller may not be able to finish the truncate without * dropping the inode's I/O lock. Make sure * to catch any pages brought in by buffers overlapping @@ -1466,10 +1474,10 @@ xfs_itruncate_start( * so that we don't toss things on the same block as * new_size but before it. * - * Before calling VOP_TOSS_PAGES() or VOP_FLUSHINVAL_PAGES(), make sure to + * Before calling toss_page or flushinval_pages, make sure to * call remapf() over the same region if the file is mapped. * This frees up mapped file references to the pages in the - * given range and for the VOP_FLUSHINVAL_PAGES() case it ensures + * given range and for the flushinval_pages case it ensures * that we get the latest mapped changes flushed out. */ toss_start = XFS_B_TO_FSB(mp, (xfs_ufsize_t)new_size); @@ -1487,9 +1495,9 @@ xfs_itruncate_start( last_byte); if (last_byte > toss_start) { if (flags & XFS_ITRUNC_DEFINITE) { - VOP_TOSS_PAGES(vp, toss_start, -1, FI_REMAPF_LOCKED); + bhv_vop_toss_pages(vp, toss_start, -1, FI_REMAPF_LOCKED); } else { - VOP_FLUSHINVAL_PAGES(vp, toss_start, -1, FI_REMAPF_LOCKED); + bhv_vop_flushinval_pages(vp, toss_start, -1, FI_REMAPF_LOCKED); } } @@ -1687,12 +1695,13 @@ xfs_itruncate_finish( * runs. */ XFS_BMAP_INIT(&free_list, &first_block); - error = xfs_bunmapi(ntp, ip, first_unmap_block, - unmap_len, + error = XFS_BUNMAPI(mp, ntp, &ip->i_iocore, + first_unmap_block, unmap_len, XFS_BMAPI_AFLAG(fork) | (sync ? 0 : XFS_BMAPI_ASYNC), XFS_ITRUNC_MAX_EXTENTS, - &first_block, &free_list, &done); + &first_block, &free_list, + NULL, &done); if (error) { /* * If the bunmapi call encounters an error, @@ -1976,9 +1985,9 @@ xfs_iunlink_remove( xfs_agino_t agino; xfs_agino_t next_agino; xfs_buf_t *last_ibp; - xfs_dinode_t *last_dip; + xfs_dinode_t *last_dip = NULL; short bucket_index; - int offset, last_offset; + int offset, last_offset = 0; int error; int agi_ok; @@ -2766,13 +2775,14 @@ xfs_iunpin( * the inode to become unpinned. */ if (!(ip->i_flags & (XFS_IRECLAIM|XFS_IRECLAIMABLE))) { - vnode_t *vp = XFS_ITOV_NULL(ip); + bhv_vnode_t *vp = XFS_ITOV_NULL(ip); /* make sync come back and flush this inode */ if (vp) { struct inode *inode = vn_to_inode(vp); - if (!(inode->i_state & I_NEW)) + if (!(inode->i_state & + (I_NEW|I_FREEING|I_CLEAR))) mark_inode_dirty_sync(inode); } } @@ -2937,13 +2947,6 @@ xfs_iflush_fork( ASSERT(ifp->if_bytes <= XFS_IFORK_SIZE(ip, whichfork)); memcpy(cp, ifp->if_u1.if_data, ifp->if_bytes); } - if (whichfork == XFS_DATA_FORK) { - if (unlikely(XFS_DIR_SHORTFORM_VALIDATE_ONDISK(mp, dip))) { - XFS_ERROR_REPORT("xfs_iflush_fork", - XFS_ERRLEVEL_LOW, mp); - return XFS_ERROR(EFSCORRUPTED); - } - } break; case XFS_DINODE_FMT_EXTENTS: @@ -3027,7 +3030,7 @@ xfs_iflush( XFS_STATS_INC(xs_iflush_count); ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE|MR_ACCESS)); - ASSERT(valusema(&ip->i_flock) <= 0); + ASSERT(issemalocked(&(ip->i_flock))); ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE || ip->i_d.di_nextents > ip->i_df.if_ext_max); @@ -3220,7 +3223,7 @@ xfs_iflush( corrupt_out: xfs_buf_relse(bp); - xfs_force_shutdown(mp, XFS_CORRUPT_INCORE); + xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); xfs_iflush_abort(ip); /* * Unlocks the flush lock @@ -3242,7 +3245,7 @@ cluster_corrupt_out: xfs_buf_relse(bp); } - xfs_force_shutdown(mp, XFS_CORRUPT_INCORE); + xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); if(!bufwasdelwri) { /* @@ -3285,7 +3288,7 @@ xfs_iflush_int( SPLDECL(s); ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE|MR_ACCESS)); - ASSERT(valusema(&ip->i_flock) <= 0); + ASSERT(issemalocked(&(ip->i_flock))); ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE || ip->i_d.di_nextents > ip->i_df.if_ext_max); @@ -3525,7 +3528,7 @@ xfs_iflush_all( xfs_mount_t *mp) { xfs_inode_t *ip; - vnode_t *vp; + bhv_vnode_t *vp; again: XFS_MOUNT_ILOCK(mp); @@ -4201,7 +4204,7 @@ xfs_iext_direct_to_inline( */ memcpy(ifp->if_u2.if_inline_ext, ifp->if_u1.if_extents, nextents * sizeof(xfs_bmbt_rec_t)); - kmem_free(ifp->if_u1.if_extents, KM_SLEEP); + kmem_free(ifp->if_u1.if_extents, ifp->if_real_bytes); ifp->if_u1.if_extents = ifp->if_u2.if_inline_ext; ifp->if_real_bytes = 0; } diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 3b544db17..d10b76ed1 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -102,9 +102,9 @@ typedef struct xfs_ifork { #ifdef __KERNEL__ struct bhv_desc; +struct bhv_vnode; struct cred; struct ktrace; -struct vnode; struct xfs_buf; struct xfs_bmap_free; struct xfs_bmbt_irec; @@ -400,7 +400,7 @@ void xfs_chash_init(struct xfs_mount *); void xfs_chash_free(struct xfs_mount *); xfs_inode_t *xfs_inode_incore(struct xfs_mount *, xfs_ino_t, struct xfs_trans *); -void xfs_inode_lock_init(xfs_inode_t *, struct vnode *); +void xfs_inode_lock_init(xfs_inode_t *, struct bhv_vnode *); int xfs_iget(struct xfs_mount *, struct xfs_trans *, xfs_ino_t, uint, uint, xfs_inode_t **, xfs_daddr_t); void xfs_iput(xfs_inode_t *, uint); @@ -461,7 +461,7 @@ void xfs_ichgtime(xfs_inode_t *, int); xfs_fsize_t xfs_file_last_byte(xfs_inode_t *); void xfs_lock_inodes(xfs_inode_t **, int, int, uint); -xfs_inode_t *xfs_vtoi(struct vnode *vp); +xfs_inode_t *xfs_vtoi(struct bhv_vnode *vp); void xfs_synchronize_atime(xfs_inode_t *); @@ -509,7 +509,6 @@ extern struct kmem_zone *xfs_chashlist_zone; extern struct kmem_zone *xfs_ifork_zone; extern struct kmem_zone *xfs_inode_zone; extern struct kmem_zone *xfs_ili_zone; -extern struct vnodeops xfs_vnodeops; #endif /* __KERNEL__ */ diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index 7497a481b..f8e80d8e7 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -25,7 +25,6 @@ #include "xfs_buf_item.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" @@ -33,7 +32,6 @@ #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -794,7 +792,7 @@ xfs_inode_item_pushbuf( * inode flush completed and the inode was taken off the AIL. * So, just get out. */ - if ((valusema(&(ip->i_flock)) > 0) || + if (!issemalocked(&(ip->i_flock)) || ((iip->ili_item.li_flags & XFS_LI_IN_AIL) == 0)) { iip->ili_pushbuf_flag = 0; xfs_iunlock(ip, XFS_ILOCK_SHARED); @@ -816,7 +814,7 @@ xfs_inode_item_pushbuf( * If not, we can flush it async. */ dopush = ((iip->ili_item.li_flags & XFS_LI_IN_AIL) && - (valusema(&(ip->i_flock)) <= 0)); + issemalocked(&(ip->i_flock))); iip->ili_pushbuf_flag = 0; xfs_iunlock(ip, XFS_ILOCK_SHARED); xfs_buftrace("INODE ITEM PUSH", bp); @@ -864,7 +862,7 @@ xfs_inode_item_push( ip = iip->ili_inode; ASSERT(ismrlocked(&(ip->i_lock), MR_ACCESS)); - ASSERT(valusema(&(ip->i_flock)) <= 0); + ASSERT(issemalocked(&(ip->i_flock))); /* * Since we were able to lock the inode's flush lock and * we found it on the AIL, the inode must be dirty. This @@ -1084,3 +1082,52 @@ xfs_istale_done( { xfs_iflush_abort(iip->ili_inode); } + +/* + * convert an xfs_inode_log_format struct from either 32 or 64 bit versions + * (which can have different field alignments) to the native version + */ +int +xfs_inode_item_format_convert( + xfs_log_iovec_t *buf, + xfs_inode_log_format_t *in_f) +{ + if (buf->i_len == sizeof(xfs_inode_log_format_32_t)) { + xfs_inode_log_format_32_t *in_f32; + + in_f32 = (xfs_inode_log_format_32_t *)buf->i_addr; + in_f->ilf_type = in_f32->ilf_type; + in_f->ilf_size = in_f32->ilf_size; + in_f->ilf_fields = in_f32->ilf_fields; + in_f->ilf_asize = in_f32->ilf_asize; + in_f->ilf_dsize = in_f32->ilf_dsize; + in_f->ilf_ino = in_f32->ilf_ino; + /* copy biggest field of ilf_u */ + memcpy(in_f->ilf_u.ilfu_uuid.__u_bits, + in_f32->ilf_u.ilfu_uuid.__u_bits, + sizeof(uuid_t)); + in_f->ilf_blkno = in_f32->ilf_blkno; + in_f->ilf_len = in_f32->ilf_len; + in_f->ilf_boffset = in_f32->ilf_boffset; + return 0; + } else if (buf->i_len == sizeof(xfs_inode_log_format_64_t)){ + xfs_inode_log_format_64_t *in_f64; + + in_f64 = (xfs_inode_log_format_64_t *)buf->i_addr; + in_f->ilf_type = in_f64->ilf_type; + in_f->ilf_size = in_f64->ilf_size; + in_f->ilf_fields = in_f64->ilf_fields; + in_f->ilf_asize = in_f64->ilf_asize; + in_f->ilf_dsize = in_f64->ilf_dsize; + in_f->ilf_ino = in_f64->ilf_ino; + /* copy biggest field of ilf_u */ + memcpy(in_f->ilf_u.ilfu_uuid.__u_bits, + in_f64->ilf_u.ilfu_uuid.__u_bits, + sizeof(uuid_t)); + in_f->ilf_blkno = in_f64->ilf_blkno; + in_f->ilf_len = in_f64->ilf_len; + in_f->ilf_boffset = in_f64->ilf_boffset; + return 0; + } + return EFSCORRUPTED; +} diff --git a/fs/xfs/xfs_inode_item.h b/fs/xfs/xfs_inode_item.h index c5dbf93b6..5db6cd1b4 100644 --- a/fs/xfs/xfs_inode_item.h +++ b/fs/xfs/xfs_inode_item.h @@ -23,25 +23,6 @@ * log. The size of the inline data/extents/b-tree root to be logged * (if any) is indicated in the ilf_dsize field. Changes to this structure * must be added on to the end. - * - * Convention for naming inode log item versions : The current version - * is always named XFS_LI_INODE. When an inode log item gets superseded, - * add the latest version of IRIX that will generate logs with that item - * to the version name. - * - * -Version 1 of this structure (XFS_LI_5_3_INODE) included up to the first - * union (ilf_u) field. This was released with IRIX 5.3-XFS. - * -Version 2 of this structure (XFS_LI_6_1_INODE) is currently the entire - * structure. This was released with IRIX 6.0.1-XFS and IRIX 6.1. - * -Version 3 of this structure (XFS_LI_INODE) is the same as version 2 - * so a new structure definition wasn't necessary. However, we had - * to add a new type because the inode cluster size changed from 4K - * to 8K and the version number had to be rev'ved to keep older kernels - * from trying to recover logs with the 8K buffers in them. The logging - * code can handle recovery on different-sized clusters now so hopefully - * this'll be the last time we need to change the inode log item just - * for a change in the inode cluster size. This new version was - * released with IRIX 6.2. */ typedef struct xfs_inode_log_format { unsigned short ilf_type; /* inode log item type */ @@ -59,18 +40,38 @@ typedef struct xfs_inode_log_format { int ilf_boffset; /* off of inode in buffer */ } xfs_inode_log_format_t; -/* Initial version shipped with IRIX 5.3-XFS */ -typedef struct xfs_inode_log_format_v1 { - unsigned short ilf_type; /* inode log item type */ - unsigned short ilf_size; /* size of this item */ - uint ilf_fields; /* flags for fields logged */ - uint ilf_dsize; /* size of data/ext/root */ - xfs_ino_t ilf_ino; /* inode number */ +typedef struct xfs_inode_log_format_32 { + unsigned short ilf_type; /* 16: inode log item type */ + unsigned short ilf_size; /* 16: size of this item */ + uint ilf_fields; /* 32: flags for fields logged */ + ushort ilf_asize; /* 32: size of attr d/ext/root */ + ushort ilf_dsize; /* 32: size of data/ext/root */ + xfs_ino_t ilf_ino; /* 64: inode number */ union { - xfs_dev_t ilfu_rdev; /* rdev value for dev inode*/ - uuid_t ilfu_uuid; /* mount point value */ + xfs_dev_t ilfu_rdev; /* 32: rdev value for dev inode*/ + uuid_t ilfu_uuid; /* 128: mount point value */ + } ilf_u; + __int64_t ilf_blkno; /* 64: blkno of inode buffer */ + int ilf_len; /* 32: len of inode buffer */ + int ilf_boffset; /* 32: off of inode in buffer */ +} __attribute__((packed)) xfs_inode_log_format_32_t; + +typedef struct xfs_inode_log_format_64 { + unsigned short ilf_type; /* 16: inode log item type */ + unsigned short ilf_size; /* 16: size of this item */ + uint ilf_fields; /* 32: flags for fields logged */ + ushort ilf_asize; /* 32: size of attr d/ext/root */ + ushort ilf_dsize; /* 32: size of data/ext/root */ + __uint32_t ilf_pad; /* 32: pad for 64 bit boundary */ + xfs_ino_t ilf_ino; /* 64: inode number */ + union { + xfs_dev_t ilfu_rdev; /* 32: rdev value for dev inode*/ + uuid_t ilfu_uuid; /* 128: mount point value */ } ilf_u; -} xfs_inode_log_format_t_v1; + __int64_t ilf_blkno; /* 64: blkno of inode buffer */ + int ilf_len; /* 32: len of inode buffer */ + int ilf_boffset; /* 32: off of inode in buffer */ +} xfs_inode_log_format_64_t; /* * Flags for xfs_trans_log_inode flags field. @@ -172,6 +173,8 @@ extern void xfs_inode_item_destroy(struct xfs_inode *); extern void xfs_iflush_done(struct xfs_buf *, xfs_inode_log_item_t *); extern void xfs_istale_done(struct xfs_buf *, xfs_inode_log_item_t *); extern void xfs_iflush_abort(struct xfs_inode *); +extern int xfs_inode_item_format_convert(xfs_log_iovec_t *, + xfs_inode_log_format_t *); #endif /* __KERNEL__ */ diff --git a/fs/xfs/xfs_iocore.c b/fs/xfs/xfs_iocore.c index a07815661..06d710c9c 100644 --- a/fs/xfs/xfs_iocore.c +++ b/fs/xfs/xfs_iocore.c @@ -24,14 +24,13 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" +#include "xfs_dfrag.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -58,7 +57,7 @@ xfs_size_fn( STATIC int xfs_ioinit( - struct vfs *vfsp, + struct bhv_vfs *vfsp, struct xfs_mount_args *mntargs, int flags) { @@ -68,6 +67,7 @@ xfs_ioinit( xfs_ioops_t xfs_iocore_xfs = { .xfs_ioinit = (xfs_ioinit_t) xfs_ioinit, .xfs_bmapi_func = (xfs_bmapi_t) xfs_bmapi, + .xfs_bunmapi_func = (xfs_bunmapi_t) xfs_bunmapi, .xfs_bmap_eof_func = (xfs_bmap_eof_t) xfs_bmap_eof, .xfs_iomap_write_direct = (xfs_iomap_write_direct_t) xfs_iomap_write_direct, @@ -84,6 +84,7 @@ xfs_ioops_t xfs_iocore_xfs = { .xfs_unlock = (xfs_unlk_t) xfs_iunlock, .xfs_size_func = (xfs_size_t) xfs_size_fn, .xfs_iodone = (xfs_iodone_t) fs_noerr, + .xfs_swap_extents_func = (xfs_swap_extents_t) xfs_swap_extents, }; void diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index d5dfedcb8..f1949c16d 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2006 Silicon Graphics, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -23,7 +23,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_dmapi.h" @@ -32,7 +31,6 @@ #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -252,7 +250,7 @@ xfs_iomap( error = XFS_BMAPI(mp, NULL, io, offset_fsb, (xfs_filblks_t)(end_fsb - offset_fsb), bmapi_flags, NULL, 0, &imap, - &nimaps, NULL); + &nimaps, NULL, NULL); if (error) goto out; @@ -519,8 +517,8 @@ xfs_iomap_write_direct( */ XFS_BMAP_INIT(&free_list, &firstfsb); nimaps = 1; - error = xfs_bmapi(tp, ip, offset_fsb, count_fsb, - bmapi_flag, &firstfsb, 0, &imap, &nimaps, &free_list); + error = XFS_BMAPI(mp, tp, io, offset_fsb, count_fsb, bmapi_flag, + &firstfsb, 0, &imap, &nimaps, &free_list, NULL); if (error) goto error0; @@ -610,8 +608,8 @@ xfs_iomap_eof_want_preallocate( while (count_fsb > 0) { imaps = nimaps; firstblock = NULLFSBLOCK; - error = XFS_BMAPI(mp, NULL, io, start_fsb, count_fsb, - 0, &firstblock, 0, imap, &imaps, NULL); + error = XFS_BMAPI(mp, NULL, io, start_fsb, count_fsb, 0, + &firstblock, 0, imap, &imaps, NULL, NULL); if (error) return error; for (n = 0; n < imaps; n++) { @@ -695,11 +693,11 @@ retry: nimaps = XFS_WRITE_IMAPS; firstblock = NULLFSBLOCK; - error = xfs_bmapi(NULL, ip, offset_fsb, + error = XFS_BMAPI(mp, NULL, io, offset_fsb, (xfs_filblks_t)(last_fsb - offset_fsb), XFS_BMAPI_DELAY | XFS_BMAPI_WRITE | XFS_BMAPI_ENTIRE, &firstblock, 1, imap, - &nimaps, NULL); + &nimaps, NULL, NULL); if (error && (error != ENOSPC)) return XFS_ERROR(error); @@ -832,9 +830,9 @@ xfs_iomap_write_allocate( } /* Go get the actual blocks */ - error = xfs_bmapi(tp, ip, map_start_fsb, count_fsb, + error = XFS_BMAPI(mp, tp, io, map_start_fsb, count_fsb, XFS_BMAPI_WRITE, &first_block, 1, - imap, &nimaps, &free_list); + imap, &nimaps, &free_list, NULL); if (error) goto trans_cancel; @@ -955,9 +953,9 @@ xfs_iomap_write_unwritten( */ XFS_BMAP_INIT(&free_list, &firstfsb); nimaps = 1; - error = xfs_bmapi(tp, ip, offset_fsb, count_fsb, + error = XFS_BMAPI(mp, tp, io, offset_fsb, count_fsb, XFS_BMAPI_WRITE|XFS_BMAPI_CONVERT, &firstfsb, - 1, &imap, &nimaps, &free_list); + 1, &imap, &nimaps, &free_list, NULL); if (error) goto error_on_bmapi_transaction; diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index c4df708a3..7d44fdb75 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -24,14 +24,12 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -41,11 +39,6 @@ #include "xfs_error.h" #include "xfs_btree.h" -#ifndef HAVE_USERACC -#define useracc(ubuffer, size, flags, foo) (0) -#define unuseracc(ubuffer, size, flags) -#endif - STATIC int xfs_bulkstat_one_iget( xfs_mount_t *mp, /* mount point for filesystem */ @@ -56,7 +49,7 @@ xfs_bulkstat_one_iget( { xfs_dinode_core_t *dic; /* dinode core info pointer */ xfs_inode_t *ip; /* incore inode pointer */ - vnode_t *vp; + bhv_vnode_t *vp; int error; error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_SHARED, &ip, bno); @@ -337,15 +330,6 @@ xfs_bulkstat( (XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog); nimask = ~(nicluster - 1); nbcluster = nicluster >> mp->m_sb.sb_inopblog; - /* - * Lock down the user's buffer. If a buffer was not sent, as in the case - * disk quota code calls here, we skip this. - */ - if (ubuffer && - (error = useracc(ubuffer, ubcount * statstruct_size, - (B_READ|B_PHYS), NULL))) { - return error; - } /* * Allocate a page-sized buffer for inode btree records. * We could try allocating something smaller, but for normal @@ -652,8 +636,6 @@ xfs_bulkstat( * Done, we're either out of filesystem or space to put the data. */ kmem_free(irbuf, NBPC); - if (ubuffer) - unuseracc(ubuffer, ubcount * statstruct_size, (B_READ|B_PHYS)); *ubcountp = ubelem; if (agno >= mp->m_sb.sb_agcount) { /* diff --git a/fs/xfs/xfs_itable.h b/fs/xfs/xfs_itable.h index 11eb4e1b1..be5f12e07 100644 --- a/fs/xfs/xfs_itable.h +++ b/fs/xfs/xfs_itable.h @@ -45,7 +45,6 @@ typedef int (*bulkstat_one_pf)(struct xfs_mount *mp, */ #define BULKSTAT_FG_IGET 0x1 /* Go through the buffer cache */ #define BULKSTAT_FG_QUICK 0x2 /* No iget, walk the dinode cluster */ -#define BULKSTAT_FG_VFSLOCKED 0x4 /* Already have vfs lock */ /* * Return stat information in bulk (by-inode) for the filesystem. diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 32e841d2f..21ac1a67e 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -24,7 +24,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" @@ -36,7 +35,6 @@ #include "xfs_ialloc_btree.h" #include "xfs_log_recover.h" #include "xfs_trans_priv.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -402,7 +400,7 @@ xfs_log_release_iclog(xfs_mount_t *mp, xlog_in_core_t *iclog = (xlog_in_core_t *)iclog_hndl; if (xlog_state_release_iclog(log, iclog)) { - xfs_force_shutdown(mp, XFS_LOG_IO_ERROR); + xfs_force_shutdown(mp, SHUTDOWN_LOG_IO_ERROR); return EIO; } @@ -498,9 +496,8 @@ xfs_log_mount(xfs_mount_t *mp, * just worked. */ if (!(mp->m_flags & XFS_MOUNT_NORECOVERY)) { - int error; - vfs_t *vfsp = XFS_MTOVFS(mp); - int readonly = (vfsp->vfs_flag & VFS_RDONLY); + bhv_vfs_t *vfsp = XFS_MTOVFS(mp); + int error, readonly = (vfsp->vfs_flag & VFS_RDONLY); if (readonly) vfsp->vfs_flag &= ~VFS_RDONLY; @@ -726,7 +723,7 @@ xfs_log_write(xfs_mount_t * mp, return XFS_ERROR(EIO); if ((error = xlog_write(mp, reg, nentries, tic, start_lsn, NULL, 0))) { - xfs_force_shutdown(mp, XFS_LOG_IO_ERROR); + xfs_force_shutdown(mp, SHUTDOWN_LOG_IO_ERROR); } return error; } /* xfs_log_write */ @@ -816,9 +813,9 @@ xfs_log_need_covered(xfs_mount_t *mp) SPLDECL(s); int needed = 0, gen; xlog_t *log = mp->m_log; - vfs_t *vfsp = XFS_MTOVFS(mp); + bhv_vfs_t *vfsp = XFS_MTOVFS(mp); - if (fs_frozen(vfsp) || XFS_FORCED_SHUTDOWN(mp) || + if (vfs_test_for_freeze(vfsp) || XFS_FORCED_SHUTDOWN(mp) || (vfsp->vfs_flag & VFS_RDONLY)) return 0; @@ -956,7 +953,7 @@ xlog_iodone(xfs_buf_t *bp) XFS_ERRTAG_IODONE_IOERR, XFS_RANDOM_IODONE_IOERR)) { xfs_ioerror_alert("xlog_iodone", l->l_mp, bp, XFS_BUF_ADDR(bp)); XFS_BUF_STALE(bp); - xfs_force_shutdown(l->l_mp, XFS_LOG_IO_ERROR); + xfs_force_shutdown(l->l_mp, SHUTDOWN_LOG_IO_ERROR); /* * This flag will be propagated to the trans-committed * callback routines to let them know that the log-commit @@ -1261,7 +1258,7 @@ xlog_commit_record(xfs_mount_t *mp, ASSERT_ALWAYS(iclog); if ((error = xlog_write(mp, reg, 1, ticket, commitlsnp, iclog, XLOG_COMMIT_TRANS))) { - xfs_force_shutdown(mp, XFS_LOG_IO_ERROR); + xfs_force_shutdown(mp, SHUTDOWN_LOG_IO_ERROR); } return error; } /* xlog_commit_record */ @@ -1416,7 +1413,7 @@ xlog_sync(xlog_t *log, ops = iclog->ic_header.h_num_logops; INT_SET(iclog->ic_header.h_num_logops, ARCH_CONVERT, ops); - bp = iclog->ic_bp; + bp = iclog->ic_bp; ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) == (unsigned long)1); XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)2); XFS_BUF_SET_ADDR(bp, BLOCK_LSN(INT_GET(iclog->ic_header.h_lsn, ARCH_CONVERT))); @@ -1433,15 +1430,14 @@ xlog_sync(xlog_t *log, } XFS_BUF_SET_PTR(bp, (xfs_caddr_t) &(iclog->ic_header), count); XFS_BUF_SET_FSPRIVATE(bp, iclog); /* save for later */ + XFS_BUF_ZEROFLAGS(bp); XFS_BUF_BUSY(bp); XFS_BUF_ASYNC(bp); /* * Do an ordered write for the log block. - * - * It may not be needed to flush the first split block in the log wrap - * case, but do it anyways to be safe -AK + * Its unnecessary to flush the first split block in the log wrap case. */ - if (log->l_mp->m_flags & XFS_MOUNT_BARRIER) + if (!split && (log->l_mp->m_flags & XFS_MOUNT_BARRIER)) XFS_BUF_ORDERED(bp); ASSERT(XFS_BUF_ADDR(bp) <= log->l_logBBsize-1); @@ -1463,7 +1459,7 @@ xlog_sync(xlog_t *log, return error; } if (split) { - bp = iclog->ic_log->l_xbuf; + bp = iclog->ic_log->l_xbuf; ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) == (unsigned long)1); XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)2); @@ -1471,6 +1467,7 @@ xlog_sync(xlog_t *log, XFS_BUF_SET_PTR(bp, (xfs_caddr_t)((__psint_t)&(iclog->ic_header)+ (__psint_t)count), split); XFS_BUF_SET_FSPRIVATE(bp, iclog); + XFS_BUF_ZEROFLAGS(bp); XFS_BUF_BUSY(bp); XFS_BUF_ASYNC(bp); if (log->l_mp->m_flags & XFS_MOUNT_BARRIER) @@ -1743,10 +1740,10 @@ xlog_write(xfs_mount_t * mp, xlog_in_core_t **commit_iclog, uint flags) { - xlog_t *log = mp->m_log; + xlog_t *log = mp->m_log; xlog_ticket_t *ticket = (xlog_ticket_t *)tic; + xlog_in_core_t *iclog = NULL; /* ptr to current in-core log */ xlog_op_header_t *logop_head; /* ptr to log operation header */ - xlog_in_core_t *iclog; /* ptr to current in-core log */ __psint_t ptr; /* copy address into data region */ int len; /* # xlog_write() bytes 2 still copy */ int index; /* region index currently copying */ @@ -1790,7 +1787,7 @@ xlog_write(xfs_mount_t * mp, xfs_cmn_err(XFS_PTAG_LOGRES, CE_ALERT, mp, "xfs_log_write: reservation ran out. Need to up reservation"); /* If we did not panic, shutdown the filesystem */ - xfs_force_shutdown(mp, XFS_CORRUPT_INCORE); + xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); #endif } else ticket->t_curr_res -= len; diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 1f0016b0b..3cb678e3a 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2006 Silicon Graphics, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -24,7 +24,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" @@ -32,7 +31,6 @@ #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -193,14 +191,14 @@ xlog_header_check_dump( { int b; - printk("%s: SB : uuid = ", __FUNCTION__); + cmn_err(CE_DEBUG, "%s: SB : uuid = ", __FUNCTION__); for (b = 0; b < 16; b++) - printk("%02x",((unsigned char *)&mp->m_sb.sb_uuid)[b]); - printk(", fmt = %d\n", XLOG_FMT); - printk(" log : uuid = "); + cmn_err(CE_DEBUG, "%02x", ((uchar_t *)&mp->m_sb.sb_uuid)[b]); + cmn_err(CE_DEBUG, ", fmt = %d\n", XLOG_FMT); + cmn_err(CE_DEBUG, " log : uuid = "); for (b = 0; b < 16; b++) - printk("%02x",((unsigned char *)&head->h_fs_uuid)[b]); - printk(", fmt = %d\n", INT_GET(head->h_fmt, ARCH_CONVERT)); + cmn_err(CE_DEBUG, "%02x",((uchar_t *)&head->h_fs_uuid)[b]); + cmn_err(CE_DEBUG, ", fmt = %d\n", INT_GET(head->h_fmt, ARCH_CONVERT)); } #else #define xlog_header_check_dump(mp, head) @@ -282,7 +280,7 @@ xlog_recover_iodone( mp = XFS_BUF_FSPRIVATE(bp, xfs_mount_t *); xfs_ioerror_alert("xlog_recover_iodone", mp, bp, XFS_BUF_ADDR(bp)); - xfs_force_shutdown(mp, XFS_METADATA_IO_ERROR); + xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); } XFS_BUF_SET_FSPRIVATE(bp, NULL); XFS_BUF_CLR_IODONE_FUNC(bp); @@ -992,6 +990,8 @@ xlog_find_zeroed( xfs_daddr_t num_scan_bblks; int error, log_bbnum = log->l_logBBsize; + *blk_no = 0; + /* check totally zeroed log */ bp = xlog_get_bp(log, 1); if (!bp) @@ -1889,7 +1889,7 @@ xlog_recover_do_inode_buffer( buffer_nextp = (xfs_agino_t *)xfs_buf_offset(bp, next_unlinked_offset); - INT_SET(*buffer_nextp, ARCH_CONVERT, *logged_nextp); + *buffer_nextp = *logged_nextp; } return 0; @@ -2292,12 +2292,22 @@ xlog_recover_do_inode_trans( int attr_index; uint fields; xfs_dinode_core_t *dicp; + int need_free = 0; if (pass == XLOG_RECOVER_PASS1) { return 0; } - in_f = (xfs_inode_log_format_t *)item->ri_buf[0].i_addr; + if (item->ri_buf[0].i_len == sizeof(xfs_inode_log_format_t)) { + in_f = (xfs_inode_log_format_t *)item->ri_buf[0].i_addr; + } else { + in_f = (xfs_inode_log_format_t *)kmem_alloc( + sizeof(xfs_inode_log_format_t), KM_SLEEP); + need_free = 1; + error = xfs_inode_item_format_convert(&item->ri_buf[0], in_f); + if (error) + goto error; + } ino = in_f->ilf_ino; mp = log->l_mp; if (ITEM_TYPE(item) == XFS_LI_INODE) { @@ -2323,8 +2333,10 @@ xlog_recover_do_inode_trans( * Inode buffers can be freed, look out for it, * and do not replay the inode. */ - if (xlog_check_buffer_cancelled(log, imap.im_blkno, imap.im_len, 0)) - return 0; + if (xlog_check_buffer_cancelled(log, imap.im_blkno, imap.im_len, 0)) { + error = 0; + goto error; + } bp = xfs_buf_read_flags(mp->m_ddev_targp, imap.im_blkno, imap.im_len, XFS_BUF_LOCK); @@ -2333,7 +2345,7 @@ xlog_recover_do_inode_trans( bp, imap.im_blkno); error = XFS_BUF_GETERROR(bp); xfs_buf_relse(bp); - return error; + goto error; } error = 0; ASSERT(in_f->ilf_fields & XFS_ILOG_CORE); @@ -2350,7 +2362,8 @@ xlog_recover_do_inode_trans( dip, bp, ino); XFS_ERROR_REPORT("xlog_recover_do_inode_trans(1)", XFS_ERRLEVEL_LOW, mp); - return XFS_ERROR(EFSCORRUPTED); + error = EFSCORRUPTED; + goto error; } dicp = (xfs_dinode_core_t*)(item->ri_buf[1].i_addr); if (unlikely(dicp->di_magic != XFS_DINODE_MAGIC)) { @@ -2360,7 +2373,8 @@ xlog_recover_do_inode_trans( item, ino); XFS_ERROR_REPORT("xlog_recover_do_inode_trans(2)", XFS_ERRLEVEL_LOW, mp); - return XFS_ERROR(EFSCORRUPTED); + error = EFSCORRUPTED; + goto error; } /* Skip replay when the on disk inode is newer than the log one */ @@ -2376,7 +2390,8 @@ xlog_recover_do_inode_trans( /* do nothing */ } else { xfs_buf_relse(bp); - return 0; + error = 0; + goto error; } } /* Take the opportunity to reset the flush iteration count */ @@ -2391,7 +2406,8 @@ xlog_recover_do_inode_trans( xfs_fs_cmn_err(CE_ALERT, mp, "xfs_inode_recover: Bad regular inode log record, rec ptr 0x%p, ino ptr = 0x%p, ino bp = 0x%p, ino %Ld", item, dip, bp, ino); - return XFS_ERROR(EFSCORRUPTED); + error = EFSCORRUPTED; + goto error; } } else if (unlikely((dicp->di_mode & S_IFMT) == S_IFDIR)) { if ((dicp->di_format != XFS_DINODE_FMT_EXTENTS) && @@ -2403,7 +2419,8 @@ xlog_recover_do_inode_trans( xfs_fs_cmn_err(CE_ALERT, mp, "xfs_inode_recover: Bad dir inode log record, rec ptr 0x%p, ino ptr = 0x%p, ino bp = 0x%p, ino %Ld", item, dip, bp, ino); - return XFS_ERROR(EFSCORRUPTED); + error = EFSCORRUPTED; + goto error; } } if (unlikely(dicp->di_nextents + dicp->di_anextents > dicp->di_nblocks)){ @@ -2415,7 +2432,8 @@ xlog_recover_do_inode_trans( item, dip, bp, ino, dicp->di_nextents + dicp->di_anextents, dicp->di_nblocks); - return XFS_ERROR(EFSCORRUPTED); + error = EFSCORRUPTED; + goto error; } if (unlikely(dicp->di_forkoff > mp->m_sb.sb_inodesize)) { XFS_CORRUPTION_ERROR("xlog_recover_do_inode_trans(6)", @@ -2424,7 +2442,8 @@ xlog_recover_do_inode_trans( xfs_fs_cmn_err(CE_ALERT, mp, "xfs_inode_recover: Bad inode log rec ptr 0x%p, dino ptr 0x%p, dino bp 0x%p, ino %Ld, forkoff 0x%x", item, dip, bp, ino, dicp->di_forkoff); - return XFS_ERROR(EFSCORRUPTED); + error = EFSCORRUPTED; + goto error; } if (unlikely(item->ri_buf[1].i_len > sizeof(xfs_dinode_core_t))) { XFS_CORRUPTION_ERROR("xlog_recover_do_inode_trans(7)", @@ -2433,7 +2452,8 @@ xlog_recover_do_inode_trans( xfs_fs_cmn_err(CE_ALERT, mp, "xfs_inode_recover: Bad inode log record length %d, rec ptr 0x%p", item->ri_buf[1].i_len, item); - return XFS_ERROR(EFSCORRUPTED); + error = EFSCORRUPTED; + goto error; } /* The core is in in-core format */ @@ -2521,7 +2541,8 @@ xlog_recover_do_inode_trans( xlog_warn("XFS: xlog_recover_do_inode_trans: Invalid flag"); ASSERT(0); xfs_buf_relse(bp); - return XFS_ERROR(EIO); + error = EIO; + goto error; } } @@ -2537,7 +2558,10 @@ write_inode_buffer: error = xfs_bwrite(mp, bp); } - return (error); +error: + if (need_free) + kmem_free(in_f, sizeof(*in_f)); + return XFS_ERROR(error); } /* @@ -2674,32 +2698,32 @@ xlog_recover_do_dquot_trans( * structure into it, and adds the efi to the AIL with the given * LSN. */ -STATIC void +STATIC int xlog_recover_do_efi_trans( xlog_t *log, xlog_recover_item_t *item, xfs_lsn_t lsn, int pass) { + int error; xfs_mount_t *mp; xfs_efi_log_item_t *efip; xfs_efi_log_format_t *efi_formatp; SPLDECL(s); if (pass == XLOG_RECOVER_PASS1) { - return; + return 0; } efi_formatp = (xfs_efi_log_format_t *)item->ri_buf[0].i_addr; - ASSERT(item->ri_buf[0].i_len == - (sizeof(xfs_efi_log_format_t) + - ((efi_formatp->efi_nextents - 1) * sizeof(xfs_extent_t)))); mp = log->l_mp; efip = xfs_efi_init(mp, efi_formatp->efi_nextents); - memcpy((char *)&(efip->efi_format), (char *)efi_formatp, - sizeof(xfs_efi_log_format_t) + - ((efi_formatp->efi_nextents - 1) * sizeof(xfs_extent_t))); + if ((error = xfs_efi_copy_format(&(item->ri_buf[0]), + &(efip->efi_format)))) { + xfs_efi_item_free(efip); + return error; + } efip->efi_next_extent = efi_formatp->efi_nextents; efip->efi_flags |= XFS_EFI_COMMITTED; @@ -2708,6 +2732,7 @@ xlog_recover_do_efi_trans( * xfs_trans_update_ail() drops the AIL lock. */ xfs_trans_update_ail(mp, (xfs_log_item_t *)efip, lsn, s); + return 0; } @@ -2738,9 +2763,10 @@ xlog_recover_do_efd_trans( } efd_formatp = (xfs_efd_log_format_t *)item->ri_buf[0].i_addr; - ASSERT(item->ri_buf[0].i_len == - (sizeof(xfs_efd_log_format_t) + - ((efd_formatp->efd_nextents - 1) * sizeof(xfs_extent_t)))); + ASSERT((item->ri_buf[0].i_len == (sizeof(xfs_efd_log_format_32_t) + + ((efd_formatp->efd_nextents - 1) * sizeof(xfs_extent_32_t)))) || + (item->ri_buf[0].i_len == (sizeof(xfs_efd_log_format_64_t) + + ((efd_formatp->efd_nextents - 1) * sizeof(xfs_extent_64_t))))); efi_id = efd_formatp->efd_efi_id; /* @@ -2810,15 +2836,14 @@ xlog_recover_do_trans( if ((error = xlog_recover_do_buffer_trans(log, item, pass))) break; - } else if ((ITEM_TYPE(item) == XFS_LI_INODE) || - (ITEM_TYPE(item) == XFS_LI_6_1_INODE) || - (ITEM_TYPE(item) == XFS_LI_5_3_INODE)) { + } else if ((ITEM_TYPE(item) == XFS_LI_INODE)) { if ((error = xlog_recover_do_inode_trans(log, item, pass))) break; } else if (ITEM_TYPE(item) == XFS_LI_EFI) { - xlog_recover_do_efi_trans(log, item, trans->r_lsn, - pass); + if ((error = xlog_recover_do_efi_trans(log, item, trans->r_lsn, + pass))) + break; } else if (ITEM_TYPE(item) == XFS_LI_EFD) { xlog_recover_do_efd_trans(log, item, pass); } else if (ITEM_TYPE(item) == XFS_LI_DQUOT) { @@ -3419,13 +3444,13 @@ xlog_unpack_data_checksum( if (rhead->h_chksum || ((log->l_flags & XLOG_CHKSUM_MISMATCH) == 0)) { cmn_err(CE_DEBUG, - "XFS: LogR chksum mismatch: was (0x%x) is (0x%x)", + "XFS: LogR chksum mismatch: was (0x%x) is (0x%x)\n", INT_GET(rhead->h_chksum, ARCH_CONVERT), chksum); cmn_err(CE_DEBUG, "XFS: Disregard message if filesystem was created with non-DEBUG kernel"); if (XFS_SB_VERSION_HASLOGV2(&log->l_mp->m_sb)) { cmn_err(CE_DEBUG, - "XFS: LogR this is a LogV2 filesystem"); + "XFS: LogR this is a LogV2 filesystem\n"); } log->l_flags |= XLOG_CHKSUM_MISMATCH; } @@ -3798,7 +3823,7 @@ xlog_do_log_recovery( error = xlog_do_recovery_pass(log, head_blk, tail_blk, XLOG_RECOVER_PASS2); #ifdef DEBUG - { + if (!error) { int i; for (i = 0; i < XLOG_BC_TABLE_SIZE; i++) @@ -3974,7 +3999,7 @@ xlog_recover_finish( log->l_flags &= ~XLOG_RECOVERY_NEEDED; } else { cmn_err(CE_DEBUG, - "!Ending clean XFS mount for filesystem: %s", + "!Ending clean XFS mount for filesystem: %s\n", log->l_mp->m_fsname); } return 0; diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index c0b1c2906..9dfae18d9 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -24,14 +24,12 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -196,7 +194,7 @@ xfs_mount_free( kmem_free(mp->m_logname, strlen(mp->m_logname) + 1); if (remove_bhv) { - struct vfs *vfsp = XFS_MTOVFS(mp); + struct bhv_vfs *vfsp = XFS_MTOVFS(mp); bhv_remove_all_vfsops(vfsp, 0); VFS_REMOVEBHV(vfsp, &mp->m_bhv); @@ -337,7 +335,7 @@ xfs_mount_validate_sb( xfs_agnumber_t xfs_initialize_perag( - struct vfs *vfs, + bhv_vfs_t *vfs, xfs_mount_t *mp, xfs_agnumber_t agcount) { @@ -651,14 +649,14 @@ xfs_mount_common(xfs_mount_t *mp, xfs_sb_t *sbp) */ int xfs_mountfs( - vfs_t *vfsp, + bhv_vfs_t *vfsp, xfs_mount_t *mp, int mfsi_flags) { xfs_buf_t *bp; xfs_sb_t *sbp = &(mp->m_sb); xfs_inode_t *rip; - vnode_t *rvp = NULL; + bhv_vnode_t *rvp = NULL; int readio_log, writeio_log; xfs_daddr_t d; __uint64_t ret64; @@ -934,18 +932,7 @@ xfs_mountfs( vfsp->vfs_altfsid = (xfs_fsid_t *)mp->m_fixedfsid; mp->m_dmevmask = 0; /* not persistent; set after each mount */ - /* - * Select the right directory manager. - */ - mp->m_dirops = - XFS_SB_VERSION_HASDIRV2(&mp->m_sb) ? - xfsv2_dirops : - xfsv1_dirops; - - /* - * Initialize directory manager's entries. - */ - XFS_DIR_MOUNT(mp); + xfs_dir_mount(mp); /* * Initialize the attribute manager's entries. @@ -1006,8 +993,9 @@ xfs_mountfs( if (unlikely((rip->i_d.di_mode & S_IFMT) != S_IFDIR)) { cmn_err(CE_WARN, "XFS: corrupted root inode"); - prdev("Root inode %llu is not a directory", - mp->m_ddev_targp, (unsigned long long)rip->i_ino); + cmn_err(CE_WARN, "Device %s - root %llu is not a directory", + XFS_BUFTARG_NAME(mp->m_ddev_targp), + (unsigned long long)rip->i_ino); xfs_iunlock(rip, XFS_ILOCK_EXCL); XFS_ERROR_REPORT("xfs_mountfs_int(2)", XFS_ERRLEVEL_LOW, mp); @@ -1094,7 +1082,7 @@ xfs_mountfs( int xfs_unmountfs(xfs_mount_t *mp, struct cred *cr) { - struct vfs *vfsp = XFS_MTOVFS(mp); + struct bhv_vfs *vfsp = XFS_MTOVFS(mp); #if defined(DEBUG) || defined(INDUCE_IO_ERROR) int64_t fsid; #endif @@ -1254,6 +1242,8 @@ xfs_mod_sb(xfs_trans_t *tp, __int64_t fields) xfs_trans_log_buf(tp, bp, first, last); } + + /* * xfs_mod_incore_sb_unlocked() is a utility routine common used to apply * a delta to a specified field in the in-core superblock. Simply @@ -1298,7 +1288,8 @@ xfs_mod_incore_sb_unlocked(xfs_mount_t *mp, xfs_sb_field_t field, return 0; case XFS_SBS_FDBLOCKS: - lcounter = (long long)mp->m_sb.sb_fdblocks; + lcounter = (long long) + mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); res_used = (long long)(mp->m_resblks - mp->m_resblks_avail); if (delta > 0) { /* Putting blocks back */ @@ -1332,7 +1323,7 @@ xfs_mod_incore_sb_unlocked(xfs_mount_t *mp, xfs_sb_field_t field, } } - mp->m_sb.sb_fdblocks = lcounter; + mp->m_sb.sb_fdblocks = lcounter + XFS_ALLOC_SET_ASIDE(mp); return 0; case XFS_SBS_FREXTENTS: lcounter = (long long)mp->m_sb.sb_frextents; @@ -1713,15 +1704,14 @@ xfs_mount_log_sbunit( * is present to prevent thrashing). */ +#ifdef CONFIG_HOTPLUG_CPU /* * hot-plug CPU notifier support. * - * We cannot use the hotcpu_register() function because it does - * not allow notifier instances. We need a notifier per filesystem - * as we need to be able to identify the filesystem to balance - * the counters out. This is achieved by having a notifier block - * embedded in the xfs_mount_t and doing pointer magic to get the - * mount pointer from the notifier block address. + * We need a notifier per filesystem as we need to be able to identify + * the filesystem to balance the counters out. This is achieved by + * having a notifier block embedded in the xfs_mount_t and doing pointer + * magic to get the mount pointer from the notifier block address. */ STATIC int xfs_icsb_cpu_notify( @@ -1771,6 +1761,7 @@ xfs_icsb_cpu_notify( return NOTIFY_OK; } +#endif /* CONFIG_HOTPLUG_CPU */ int xfs_icsb_init_counters( @@ -1783,9 +1774,11 @@ xfs_icsb_init_counters( if (mp->m_sb_cnts == NULL) return -ENOMEM; +#ifdef CONFIG_HOTPLUG_CPU mp->m_icsb_notifier.notifier_call = xfs_icsb_cpu_notify; mp->m_icsb_notifier.priority = 0; - register_cpu_notifier(&mp->m_icsb_notifier); + register_hotcpu_notifier(&mp->m_icsb_notifier); +#endif /* CONFIG_HOTPLUG_CPU */ for_each_online_cpu(i) { cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); @@ -1804,7 +1797,7 @@ xfs_icsb_destroy_counters( xfs_mount_t *mp) { if (mp->m_sb_cnts) { - unregister_cpu_notifier(&mp->m_icsb_notifier); + unregister_hotcpu_notifier(&mp->m_icsb_notifier); free_percpu(mp->m_sb_cnts); } } @@ -2011,14 +2004,15 @@ xfs_icsb_sync_counters_lazy( * when we get near ENOSPC. */ #define XFS_ICSB_INO_CNTR_REENABLE 64 -#define XFS_ICSB_FDBLK_CNTR_REENABLE 512 +#define XFS_ICSB_FDBLK_CNTR_REENABLE(mp) \ + (512 + XFS_ALLOC_SET_ASIDE(mp)) STATIC void xfs_icsb_balance_counter( xfs_mount_t *mp, xfs_sb_field_t field, int flags) { - uint64_t count, resid = 0; + uint64_t count, resid; int weight = num_online_cpus(); int s; @@ -2045,11 +2039,12 @@ xfs_icsb_balance_counter( case XFS_SBS_FDBLOCKS: count = mp->m_sb.sb_fdblocks; resid = do_div(count, weight); - if (count < XFS_ICSB_FDBLK_CNTR_REENABLE) + if (count < XFS_ICSB_FDBLK_CNTR_REENABLE(mp)) goto out; break; default: BUG(); + count = resid = 0; /* quiet, gcc */ break; } @@ -2099,11 +2094,11 @@ again: case XFS_SBS_FDBLOCKS: BUG_ON((mp->m_resblks - mp->m_resblks_avail) != 0); - lcounter = icsbp->icsb_fdblocks; + lcounter = icsbp->icsb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); lcounter += delta; if (unlikely(lcounter < 0)) goto slow_path; - icsbp->icsb_fdblocks = lcounter; + icsbp->icsb_fdblocks = lcounter + XFS_ALLOC_SET_ASIDE(mp); break; default: BUG(); diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 5e8189714..60d48507c 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -53,8 +53,8 @@ typedef struct xfs_trans_reservations { #else struct cred; struct log; -struct vfs; -struct vnode; +struct bhv_vfs; +struct bhv_vnode; struct xfs_mount_args; struct xfs_ihash; struct xfs_chash; @@ -63,9 +63,11 @@ struct xfs_perag; struct xfs_iocore; struct xfs_bmbt_irec; struct xfs_bmap_free; +struct xfs_extdelta; +struct xfs_swapext; -extern struct vfsops xfs_vfsops; -extern struct vnodeops xfs_vnodeops; +extern struct bhv_vfsops xfs_vfsops; +extern struct bhv_vnodeops xfs_vnodeops; #define AIL_LOCK_T lock_t #define AIL_LOCKINIT(x,y) spinlock_init(x,y) @@ -78,15 +80,15 @@ extern struct vnodeops xfs_vnodeops; * Prototypes and functions for the Data Migration subsystem. */ -typedef int (*xfs_send_data_t)(int, struct vnode *, - xfs_off_t, size_t, int, vrwlock_t *); +typedef int (*xfs_send_data_t)(int, struct bhv_vnode *, + xfs_off_t, size_t, int, bhv_vrwlock_t *); typedef int (*xfs_send_mmap_t)(struct vm_area_struct *, uint); -typedef int (*xfs_send_destroy_t)(struct vnode *, dm_right_t); -typedef int (*xfs_send_namesp_t)(dm_eventtype_t, struct vfs *, - struct vnode *, - dm_right_t, struct vnode *, dm_right_t, +typedef int (*xfs_send_destroy_t)(struct bhv_vnode *, dm_right_t); +typedef int (*xfs_send_namesp_t)(dm_eventtype_t, struct bhv_vfs *, + struct bhv_vnode *, + dm_right_t, struct bhv_vnode *, dm_right_t, char *, char *, mode_t, int, int); -typedef void (*xfs_send_unmount_t)(struct vfs *, struct vnode *, +typedef void (*xfs_send_unmount_t)(struct bhv_vfs *, struct bhv_vnode *, dm_right_t, mode_t, int, int); typedef struct xfs_dmops { @@ -188,13 +190,18 @@ typedef struct xfs_qmops { * Prototypes and functions for I/O core modularization. */ -typedef int (*xfs_ioinit_t)(struct vfs *, +typedef int (*xfs_ioinit_t)(struct bhv_vfs *, struct xfs_mount_args *, int); typedef int (*xfs_bmapi_t)(struct xfs_trans *, void *, xfs_fileoff_t, xfs_filblks_t, int, xfs_fsblock_t *, xfs_extlen_t, struct xfs_bmbt_irec *, int *, - struct xfs_bmap_free *); + struct xfs_bmap_free *, struct xfs_extdelta *); +typedef int (*xfs_bunmapi_t)(struct xfs_trans *, + void *, xfs_fileoff_t, + xfs_filblks_t, int, xfs_extnum_t, + xfs_fsblock_t *, struct xfs_bmap_free *, + struct xfs_extdelta *, int *); typedef int (*xfs_bmap_eof_t)(void *, xfs_fileoff_t, int, int *); typedef int (*xfs_iomap_write_direct_t)( void *, xfs_off_t, size_t, int, @@ -213,11 +220,14 @@ typedef void (*xfs_lock_demote_t)(void *, uint); typedef int (*xfs_lock_nowait_t)(void *, uint); typedef void (*xfs_unlk_t)(void *, unsigned int); typedef xfs_fsize_t (*xfs_size_t)(void *); -typedef xfs_fsize_t (*xfs_iodone_t)(struct vfs *); +typedef xfs_fsize_t (*xfs_iodone_t)(struct bhv_vfs *); +typedef int (*xfs_swap_extents_t)(void *, void *, + struct xfs_swapext*); typedef struct xfs_ioops { xfs_ioinit_t xfs_ioinit; xfs_bmapi_t xfs_bmapi_func; + xfs_bunmapi_t xfs_bunmapi_func; xfs_bmap_eof_t xfs_bmap_eof_func; xfs_iomap_write_direct_t xfs_iomap_write_direct; xfs_iomap_write_delay_t xfs_iomap_write_delay; @@ -230,13 +240,17 @@ typedef struct xfs_ioops { xfs_unlk_t xfs_unlock; xfs_size_t xfs_size_func; xfs_iodone_t xfs_iodone; + xfs_swap_extents_t xfs_swap_extents_func; } xfs_ioops_t; #define XFS_IOINIT(vfsp, args, flags) \ (*(mp)->m_io_ops.xfs_ioinit)(vfsp, args, flags) -#define XFS_BMAPI(mp, trans,io,bno,len,f,first,tot,mval,nmap,flist) \ +#define XFS_BMAPI(mp, trans,io,bno,len,f,first,tot,mval,nmap,flist,delta) \ (*(mp)->m_io_ops.xfs_bmapi_func) \ - (trans,(io)->io_obj,bno,len,f,first,tot,mval,nmap,flist) + (trans,(io)->io_obj,bno,len,f,first,tot,mval,nmap,flist,delta) +#define XFS_BUNMAPI(mp, trans,io,bno,len,f,nexts,first,flist,delta,done) \ + (*(mp)->m_io_ops.xfs_bunmapi_func) \ + (trans,(io)->io_obj,bno,len,f,nexts,first,flist,delta,done) #define XFS_BMAP_EOF(mp, io, endoff, whichfork, eof) \ (*(mp)->m_io_ops.xfs_bmap_eof_func) \ ((io)->io_obj, endoff, whichfork, eof) @@ -266,6 +280,9 @@ typedef struct xfs_ioops { (*(mp)->m_io_ops.xfs_size_func)((io)->io_obj) #define XFS_IODONE(vfsp) \ (*(mp)->m_io_ops.xfs_iodone)(vfsp) +#define XFS_SWAP_EXTENTS(mp, io, tio, sxp) \ + (*(mp)->m_io_ops.xfs_swap_extents_func) \ + ((io)->io_obj, (tio)->io_obj, sxp) #ifdef HAVE_PERCPU_SB @@ -386,8 +403,6 @@ typedef struct xfs_mount { __uint8_t m_inode_quiesce;/* call quiesce on new inodes. field governed by m_ilock */ __uint8_t m_sectbb_log; /* sectlog - BBSHIFT */ - __uint8_t m_dirversion; /* 1 or 2 */ - xfs_dirops_t m_dirops; /* table of dir funcs */ int m_dirblksize; /* directory block sz--bytes */ int m_dirblkfsbs; /* directory block sz--fsbs */ xfs_dablk_t m_dirdatablk; /* blockno of dir data v2 */ @@ -495,16 +510,7 @@ xfs_preferred_iosize(xfs_mount_t *mp) #define XFS_FORCED_SHUTDOWN(mp) ((mp)->m_flags & XFS_MOUNT_FS_SHUTDOWN) #define xfs_force_shutdown(m,f) \ - VFS_FORCE_SHUTDOWN((XFS_MTOVFS(m)), f, __FILE__, __LINE__) - -/* - * Flags sent to xfs_force_shutdown. - */ -#define XFS_METADATA_IO_ERROR 0x1 -#define XFS_LOG_IO_ERROR 0x2 -#define XFS_FORCE_UMOUNT 0x4 -#define XFS_CORRUPT_INCORE 0x8 /* Corrupt in-memory data structures */ -#define XFS_SHUTDOWN_REMOTE_REQ 0x10 /* Shutdown came from remote cell */ + bhv_vfs_force_shutdown((XFS_MTOVFS(m)), f, __FILE__, __LINE__) /* * Flags for xfs_mountfs @@ -522,7 +528,7 @@ xfs_preferred_iosize(xfs_mount_t *mp) * Macros for getting from mount to vfs and back. */ #define XFS_MTOVFS(mp) xfs_mtovfs(mp) -static inline struct vfs *xfs_mtovfs(xfs_mount_t *mp) +static inline struct bhv_vfs *xfs_mtovfs(xfs_mount_t *mp) { return bhvtovfs(&mp->m_bhv); } @@ -534,7 +540,7 @@ static inline xfs_mount_t *xfs_bhvtom(bhv_desc_t *bdp) } #define XFS_VFSTOM(vfs) xfs_vfstom(vfs) -static inline xfs_mount_t *xfs_vfstom(vfs_t *vfs) +static inline xfs_mount_t *xfs_vfstom(bhv_vfs_t *vfs) { return XFS_BHVTOM(bhv_lookup(VFS_BHVHEAD(vfs), &xfs_vfsops)); } @@ -572,7 +578,7 @@ typedef struct xfs_mod_sb { extern xfs_mount_t *xfs_mount_init(void); extern void xfs_mod_sb(xfs_trans_t *, __int64_t); extern void xfs_mount_free(xfs_mount_t *mp, int remove_bhv); -extern int xfs_mountfs(struct vfs *, xfs_mount_t *mp, int); +extern int xfs_mountfs(struct bhv_vfs *, xfs_mount_t *mp, int); extern void xfs_mountfs_check_barriers(xfs_mount_t *mp); extern int xfs_unmountfs(xfs_mount_t *, struct cred *); @@ -590,7 +596,7 @@ extern void xfs_freesb(xfs_mount_t *); extern void xfs_do_force_shutdown(bhv_desc_t *, int, char *, int); extern int xfs_syncsub(xfs_mount_t *, int, int, int *); extern int xfs_sync_inodes(xfs_mount_t *, int, int, int *); -extern xfs_agnumber_t xfs_initialize_perag(struct vfs *, xfs_mount_t *, +extern xfs_agnumber_t xfs_initialize_perag(struct bhv_vfs *, xfs_mount_t *, xfs_agnumber_t); extern void xfs_xlatesb(void *, struct xfs_sb *, int, __int64_t); diff --git a/fs/xfs/xfs_qmops.c b/fs/xfs/xfs_qmops.c index 1408a32ee..320d63ff9 100644 --- a/fs/xfs/xfs_qmops.c +++ b/fs/xfs/xfs_qmops.c @@ -23,7 +23,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" diff --git a/fs/xfs/xfs_quota.h b/fs/xfs/xfs_quota.h index 7fbef974b..acb853b33 100644 --- a/fs/xfs/xfs_quota.h +++ b/fs/xfs/xfs_quota.h @@ -365,7 +365,7 @@ typedef struct xfs_dqtrxops { extern int xfs_qm_dqcheck(xfs_disk_dquot_t *, xfs_dqid_t, uint, uint, char *); extern int xfs_mount_reset_sbqflags(struct xfs_mount *); -extern struct bhv_vfsops xfs_qmops; +extern struct bhv_module_vfsops xfs_qmops; #endif /* __KERNEL__ */ diff --git a/fs/xfs/xfs_rename.c b/fs/xfs/xfs_rename.c index 1f148762e..d98171dea 100644 --- a/fs/xfs/xfs_rename.c +++ b/fs/xfs/xfs_rename.c @@ -22,13 +22,11 @@ #include "xfs_inum.h" #include "xfs_trans.h" #include "xfs_sb.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -40,7 +38,6 @@ #include "xfs_refcache.h" #include "xfs_utils.h" #include "xfs_trans_space.h" -#include "xfs_dir_leaf.h" /* @@ -87,8 +84,8 @@ STATIC int xfs_lock_for_rename( xfs_inode_t *dp1, /* old (source) directory inode */ xfs_inode_t *dp2, /* new (target) directory inode */ - vname_t *vname1,/* old entry name */ - vname_t *vname2,/* new entry name */ + bhv_vname_t *vname1,/* old entry name */ + bhv_vname_t *vname2,/* new entry name */ xfs_inode_t **ipp1, /* inode of old entry */ xfs_inode_t **ipp2, /* inode of new entry, if it already exists, NULL otherwise. */ @@ -225,9 +222,9 @@ xfs_lock_for_rename( int xfs_rename( bhv_desc_t *src_dir_bdp, - vname_t *src_vname, - vnode_t *target_dir_vp, - vname_t *target_vname, + bhv_vname_t *src_vname, + bhv_vnode_t *target_dir_vp, + bhv_vname_t *target_vname, cred_t *credp) { xfs_trans_t *tp; @@ -242,7 +239,7 @@ xfs_rename( int committed; xfs_inode_t *inodes[4]; int target_ip_dropped = 0; /* dropped target_ip link? */ - vnode_t *src_dir_vp; + bhv_vnode_t *src_dir_vp; int spaceres; int target_link_zero = 0; int num_inodes; @@ -398,34 +395,29 @@ xfs_rename( * fit before actually inserting it. */ if (spaceres == 0 && - (error = XFS_DIR_CANENTER(mp, tp, target_dp, target_name, - target_namelen))) { + (error = xfs_dir_canenter(tp, target_dp, target_name, + target_namelen))) goto error_return; - } /* * If target does not exist and the rename crosses * directories, adjust the target directory link count * to account for the ".." reference from the new entry. */ - error = XFS_DIR_CREATENAME(mp, tp, target_dp, target_name, + error = xfs_dir_createname(tp, target_dp, target_name, target_namelen, src_ip->i_ino, &first_block, &free_list, spaceres); - if (error == ENOSPC) { + if (error == ENOSPC) goto error_return; - } - if (error) { + if (error) goto abort_return; - } xfs_ichgtime(target_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); if (new_parent && src_is_directory) { error = xfs_bumplink(tp, target_dp); - if (error) { + if (error) goto abort_return; - } } } else { /* target_ip != NULL */ - /* * If target exists and it's a directory, check that both * target and source are directories and that target can be @@ -435,7 +427,7 @@ xfs_rename( /* * Make sure target dir is empty. */ - if (!(XFS_DIR_ISEMPTY(target_ip->i_mount, target_ip)) || + if (!(xfs_dir_isempty(target_ip)) || (target_ip->i_d.di_nlink > 2)) { error = XFS_ERROR(EEXIST); goto error_return; @@ -451,12 +443,11 @@ xfs_rename( * In case there is already an entry with the same * name at the destination directory, remove it first. */ - error = XFS_DIR_REPLACE(mp, tp, target_dp, target_name, - target_namelen, src_ip->i_ino, &first_block, - &free_list, spaceres); - if (error) { + error = xfs_dir_replace(tp, target_dp, target_name, + target_namelen, src_ip->i_ino, + &first_block, &free_list, spaceres); + if (error) goto abort_return; - } xfs_ichgtime(target_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); /* @@ -464,9 +455,8 @@ xfs_rename( * dir no longer points to it. */ error = xfs_droplink(tp, target_ip); - if (error) { + if (error) goto abort_return; - } target_ip_dropped = 1; if (src_is_directory) { @@ -474,9 +464,8 @@ xfs_rename( * Drop the link from the old "." entry. */ error = xfs_droplink(tp, target_ip); - if (error) { + if (error) goto abort_return; - } } /* Do this test while we still hold the locks */ @@ -488,18 +477,15 @@ xfs_rename( * Remove the source. */ if (new_parent && src_is_directory) { - /* * Rewrite the ".." entry to point to the new * directory. */ - error = XFS_DIR_REPLACE(mp, tp, src_ip, "..", 2, - target_dp->i_ino, &first_block, - &free_list, spaceres); + error = xfs_dir_replace(tp, src_ip, "..", 2, target_dp->i_ino, + &first_block, &free_list, spaceres); ASSERT(error != EEXIST); - if (error) { + if (error) goto abort_return; - } xfs_ichgtime(src_ip, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); } else { @@ -527,16 +513,14 @@ xfs_rename( * entry that's moved no longer points to it. */ error = xfs_droplink(tp, src_dp); - if (error) { + if (error) goto abort_return; - } } - error = XFS_DIR_REMOVENAME(mp, tp, src_dp, src_name, src_namelen, + error = xfs_dir_removename(tp, src_dp, src_name, src_namelen, src_ip->i_ino, &first_block, &free_list, spaceres); - if (error) { + if (error) goto abort_return; - } xfs_ichgtime(src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); /* @@ -609,7 +593,7 @@ xfs_rename( * Let interposed file systems know about removed links. */ if (target_ip_dropped) { - VOP_LINK_REMOVED(XFS_ITOV(target_ip), target_dir_vp, + bhv_vop_link_removed(XFS_ITOV(target_ip), target_dir_vp, target_link_zero); IRELE(target_ip); } diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index 5b413946b..5a0b67895 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -24,14 +24,12 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -141,7 +139,7 @@ xfs_growfs_rt_alloc( cancelflags |= XFS_TRANS_ABORT; error = xfs_bmapi(tp, ip, oblocks, nblocks - oblocks, XFS_BMAPI_WRITE | XFS_BMAPI_METADATA, &firstblock, - resblks, &map, &nmap, &flist); + resblks, &map, &nmap, &flist, NULL); if (!error && nmap < 1) error = XFS_ERROR(ENOSPC); if (error) @@ -1931,7 +1929,7 @@ xfs_growfs_rt( /* * Initial error checking. */ - if (mp->m_rtdev_targp || mp->m_rbmip == NULL || + if (mp->m_rtdev_targp == NULL || mp->m_rbmip == NULL || (nrblocks = in->newblocks) <= sbp->sb_rblocks || (sbp->sb_rblocks && (in->extsize != sbp->sb_rextsize))) return XFS_ERROR(EINVAL); @@ -2404,10 +2402,10 @@ xfs_rtprint_range( { xfs_extlen_t i; /* block number in the extent */ - printk("%Ld: ", (long long)start); + cmn_err(CE_DEBUG, "%Ld: ", (long long)start); for (i = 0; i < len; i++) - printk("%d", xfs_rtcheck_bit(mp, tp, start + i, 1)); - printk("\n"); + cmn_err(CE_DEBUG, "%d", xfs_rtcheck_bit(mp, tp, start + i, 1)); + cmn_err(CE_DEBUG, "\n"); } /* @@ -2431,17 +2429,17 @@ xfs_rtprint_summary( (void)xfs_rtget_summary(mp, tp, l, i, &sumbp, &sb, &c); if (c) { if (!p) { - printk("%Ld-%Ld:", 1LL << l, + cmn_err(CE_DEBUG, "%Ld-%Ld:", 1LL << l, XFS_RTMIN((1LL << l) + ((1LL << l) - 1LL), mp->m_sb.sb_rextents)); p = 1; } - printk(" %Ld:%d", (long long)i, c); + cmn_err(CE_DEBUG, " %Ld:%d", (long long)i, c); } } if (p) - printk("\n"); + cmn_err(CE_DEBUG, "\n"); } if (sumbp) xfs_trans_brelse(tp, sumbp); diff --git a/fs/xfs/xfs_rw.c b/fs/xfs/xfs_rw.c index a59c102cf..defb2feba 100644 --- a/fs/xfs/xfs_rw.c +++ b/fs/xfs/xfs_rw.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2006 Silicon Graphics, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -24,14 +24,12 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -91,6 +89,90 @@ xfs_write_clear_setuid( return 0; } +/* + * Handle logging requirements of various synchronous types of write. + */ +int +xfs_write_sync_logforce( + xfs_mount_t *mp, + xfs_inode_t *ip) +{ + int error = 0; + + /* + * If we're treating this as O_DSYNC and we have not updated the + * size, force the log. + */ + if (!(mp->m_flags & XFS_MOUNT_OSYNCISOSYNC) && + !(ip->i_update_size)) { + xfs_inode_log_item_t *iip = ip->i_itemp; + + /* + * If an allocation transaction occurred + * without extending the size, then we have to force + * the log up the proper point to ensure that the + * allocation is permanent. We can't count on + * the fact that buffered writes lock out direct I/O + * writes - the direct I/O write could have extended + * the size nontransactionally, then finished before + * we started. xfs_write_file will think that the file + * didn't grow but the update isn't safe unless the + * size change is logged. + * + * Force the log if we've committed a transaction + * against the inode or if someone else has and + * the commit record hasn't gone to disk (e.g. + * the inode is pinned). This guarantees that + * all changes affecting the inode are permanent + * when we return. + */ + if (iip && iip->ili_last_lsn) { + xfs_log_force(mp, iip->ili_last_lsn, + XFS_LOG_FORCE | XFS_LOG_SYNC); + } else if (xfs_ipincount(ip) > 0) { + xfs_log_force(mp, (xfs_lsn_t)0, + XFS_LOG_FORCE | XFS_LOG_SYNC); + } + + } else { + xfs_trans_t *tp; + + /* + * O_SYNC or O_DSYNC _with_ a size update are handled + * the same way. + * + * If the write was synchronous then we need to make + * sure that the inode modification time is permanent. + * We'll have updated the timestamp above, so here + * we use a synchronous transaction to log the inode. + * It's not fast, but it's necessary. + * + * If this a dsync write and the size got changed + * non-transactionally, then we need to ensure that + * the size change gets logged in a synchronous + * transaction. + */ + tp = xfs_trans_alloc(mp, XFS_TRANS_WRITE_SYNC); + if ((error = xfs_trans_reserve(tp, 0, + XFS_SWRITE_LOG_RES(mp), + 0, 0, 0))) { + /* Transaction reserve failed */ + xfs_trans_cancel(tp, 0); + } else { + /* Transaction reserve successful */ + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); + xfs_trans_ihold(tp, ip); + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + xfs_trans_set_sync(tp); + error = xfs_trans_commit(tp, 0, NULL); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + } + } + + return error; +} + /* * Force a shutdown of the filesystem instantly while keeping * the filesystem consistent. We don't do an unmount here; just shutdown @@ -109,12 +191,12 @@ xfs_do_force_shutdown( xfs_mount_t *mp; mp = XFS_BHVTOM(bdp); - logerror = flags & XFS_LOG_IO_ERROR; + logerror = flags & SHUTDOWN_LOG_IO_ERROR; - if (!(flags & XFS_FORCE_UMOUNT)) { - cmn_err(CE_NOTE, - "xfs_force_shutdown(%s,0x%x) called from line %d of file %s. Return address = 0x%p", - mp->m_fsname,flags,lnnum,fname,__return_address); + if (!(flags & SHUTDOWN_FORCE_UMOUNT)) { + cmn_err(CE_NOTE, "xfs_force_shutdown(%s,0x%x) called from " + "line %d of file %s. Return address = 0x%p", + mp->m_fsname, flags, lnnum, fname, __return_address); } /* * No need to duplicate efforts. @@ -125,33 +207,37 @@ xfs_do_force_shutdown( /* * This flags XFS_MOUNT_FS_SHUTDOWN, makes sure that we don't * queue up anybody new on the log reservations, and wakes up - * everybody who's sleeping on log reservations and tells - * them the bad news. + * everybody who's sleeping on log reservations to tell them + * the bad news. */ if (xfs_log_force_umount(mp, logerror)) return; - if (flags & XFS_CORRUPT_INCORE) { + if (flags & SHUTDOWN_CORRUPT_INCORE) { xfs_cmn_err(XFS_PTAG_SHUTDOWN_CORRUPT, CE_ALERT, mp, "Corruption of in-memory data detected. Shutting down filesystem: %s", mp->m_fsname); if (XFS_ERRLEVEL_HIGH <= xfs_error_level) { xfs_stack_trace(); } - } else if (!(flags & XFS_FORCE_UMOUNT)) { + } else if (!(flags & SHUTDOWN_FORCE_UMOUNT)) { if (logerror) { xfs_cmn_err(XFS_PTAG_SHUTDOWN_LOGERROR, CE_ALERT, mp, - "Log I/O Error Detected. Shutting down filesystem: %s", + "Log I/O Error Detected. Shutting down filesystem: %s", + mp->m_fsname); + } else if (flags & SHUTDOWN_DEVICE_REQ) { + xfs_cmn_err(XFS_PTAG_SHUTDOWN_IOERROR, CE_ALERT, mp, + "All device paths lost. Shutting down filesystem: %s", mp->m_fsname); - } else if (!(flags & XFS_SHUTDOWN_REMOTE_REQ)) { + } else if (!(flags & SHUTDOWN_REMOTE_REQ)) { xfs_cmn_err(XFS_PTAG_SHUTDOWN_IOERROR, CE_ALERT, mp, - "I/O Error Detected. Shutting down filesystem: %s", + "I/O Error Detected. Shutting down filesystem: %s", mp->m_fsname); } } - if (!(flags & XFS_FORCE_UMOUNT)) { - cmn_err(CE_ALERT, - "Please umount the filesystem, and rectify the problem(s)"); + if (!(flags & SHUTDOWN_FORCE_UMOUNT)) { + cmn_err(CE_ALERT, "Please umount the filesystem, " + "and rectify the problem(s)"); } } @@ -335,7 +421,7 @@ xfs_bwrite( * from bwrite and we could be tracing a buffer that has * been reused. */ - xfs_force_shutdown(mp, XFS_METADATA_IO_ERROR); + xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); } return (error); } diff --git a/fs/xfs/xfs_rw.h b/fs/xfs/xfs_rw.h index e63795644..188b296ff 100644 --- a/fs/xfs/xfs_rw.h +++ b/fs/xfs/xfs_rw.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2006 Silicon Graphics, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -75,6 +75,7 @@ xfs_fsb_to_db_io(struct xfs_iocore *io, xfs_fsblock_t fsb) * Prototypes for functions in xfs_rw.c. */ extern int xfs_write_clear_setuid(struct xfs_inode *ip); +extern int xfs_write_sync_logforce(struct xfs_mount *mp, struct xfs_inode *ip); extern int xfs_bwrite(struct xfs_mount *mp, struct xfs_buf *bp); extern int xfs_bioerror(struct xfs_buf *bp); extern int xfs_bioerror_relse(struct xfs_buf *bp); @@ -87,9 +88,10 @@ extern void xfs_ioerror_alert(char *func, struct xfs_mount *mp, /* * Prototypes for functions in xfs_vnodeops.c. */ -extern int xfs_rwlock(bhv_desc_t *bdp, vrwlock_t write_lock); -extern void xfs_rwunlock(bhv_desc_t *bdp, vrwlock_t write_lock); -extern int xfs_setattr(bhv_desc_t *bdp, vattr_t *vap, int flags, cred_t *credp); +extern int xfs_rwlock(bhv_desc_t *bdp, bhv_vrwlock_t write_lock); +extern void xfs_rwunlock(bhv_desc_t *bdp, bhv_vrwlock_t write_lock); +extern int xfs_setattr(bhv_desc_t *, bhv_vattr_t *vap, int flags, + cred_t *credp); extern int xfs_change_file_space(bhv_desc_t *bdp, int cmd, xfs_flock64_t *bf, xfs_off_t offset, cred_t *credp, int flags); extern int xfs_set_dmattrs(bhv_desc_t *bdp, u_int evmask, u_int16_t state, diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 8d056cef5..ee2721e0d 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -24,7 +24,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" @@ -33,7 +32,6 @@ #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -236,11 +234,8 @@ xfs_trans_alloc( xfs_mount_t *mp, uint type) { - fs_check_frozen(XFS_MTOVFS(mp), SB_FREEZE_TRANS); - atomic_inc(&mp->m_active_trans); - - return (_xfs_trans_alloc(mp, type)); - + vfs_wait_for_freeze(XFS_MTOVFS(mp), SB_FREEZE_TRANS); + return _xfs_trans_alloc(mp, type); } xfs_trans_t * @@ -250,12 +245,9 @@ _xfs_trans_alloc( { xfs_trans_t *tp; - ASSERT(xfs_trans_zone != NULL); - tp = kmem_zone_zalloc(xfs_trans_zone, KM_SLEEP); + atomic_inc(&mp->m_active_trans); - /* - * Initialize the transaction structure. - */ + tp = kmem_zone_zalloc(xfs_trans_zone, KM_SLEEP); tp->t_magic = XFS_TRANS_MAGIC; tp->t_type = type; tp->t_mountp = mp; @@ -263,8 +255,7 @@ _xfs_trans_alloc( tp->t_busy_free = XFS_LBC_NUM_SLOTS; XFS_LIC_INIT(&(tp->t_items)); XFS_LBC_INIT(&(tp->t_busy)); - - return (tp); + return tp; } /* @@ -303,7 +294,7 @@ xfs_trans_dup( tp->t_blk_res = tp->t_blk_res_used; ntp->t_rtx_res = tp->t_rtx_res - tp->t_rtx_res_used; tp->t_rtx_res = tp->t_rtx_res_used; - PFLAGS_DUP(&tp->t_pflags, &ntp->t_pflags); + ntp->t_pflags = tp->t_pflags; XFS_TRANS_DUP_DQINFO(tp->t_mountp, tp, ntp); @@ -335,14 +326,11 @@ xfs_trans_reserve( uint logcount) { int log_flags; - int error; - int rsvd; - - error = 0; - rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0; + int error = 0; + int rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0; /* Mark this thread as being in a transaction */ - PFLAGS_SET_FSTRANS(&tp->t_pflags); + current_set_flags_nested(&tp->t_pflags, PF_FSTRANS); /* * Attempt to reserve the needed disk blocks by decrementing @@ -353,7 +341,7 @@ xfs_trans_reserve( error = xfs_mod_incore_sb(tp->t_mountp, XFS_SBS_FDBLOCKS, -blocks, rsvd); if (error != 0) { - PFLAGS_RESTORE_FSTRANS(&tp->t_pflags); + current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); return (XFS_ERROR(ENOSPC)); } tp->t_blk_res += blocks; @@ -426,9 +414,9 @@ undo_blocks: tp->t_blk_res = 0; } - PFLAGS_RESTORE_FSTRANS(&tp->t_pflags); + current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); - return (error); + return error; } @@ -819,7 +807,7 @@ shut_us_down: if (commit_lsn == -1 && !shutdown) shutdown = XFS_ERROR(EIO); } - PFLAGS_RESTORE_FSTRANS(&tp->t_pflags); + current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); xfs_trans_free_items(tp, shutdown? XFS_TRANS_ABORT : 0); xfs_trans_free_busy(tp); xfs_trans_free(tp); @@ -846,7 +834,7 @@ shut_us_down: */ nvec = xfs_trans_count_vecs(tp); if (nvec == 0) { - xfs_force_shutdown(mp, XFS_LOG_IO_ERROR); + xfs_force_shutdown(mp, SHUTDOWN_LOG_IO_ERROR); goto shut_us_down; } else if (nvec <= XFS_TRANS_LOGVEC_COUNT) { log_vector = log_vector_fast; @@ -884,7 +872,7 @@ shut_us_down: * had pinned, clean up, free trans structure, and return error. */ if (error || commit_lsn == -1) { - PFLAGS_RESTORE_FSTRANS(&tp->t_pflags); + current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); xfs_trans_uncommit(tp, flags|XFS_TRANS_ABORT); return XFS_ERROR(EIO); } @@ -926,7 +914,7 @@ shut_us_down: /* * Mark this thread as no longer being in a transaction */ - PFLAGS_RESTORE_FSTRANS(&tp->t_pflags); + current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); /* * Once all the items of the transaction have been copied @@ -1148,7 +1136,7 @@ xfs_trans_cancel( */ if ((tp->t_flags & XFS_TRANS_DIRTY) && !XFS_FORCED_SHUTDOWN(mp)) { XFS_ERROR_REPORT("xfs_trans_cancel", XFS_ERRLEVEL_LOW, mp); - xfs_force_shutdown(mp, XFS_CORRUPT_INCORE); + xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); } #ifdef DEBUG if (!(flags & XFS_TRANS_ABORT)) { @@ -1182,7 +1170,7 @@ xfs_trans_cancel( } /* mark this thread as no longer being in a transaction */ - PFLAGS_RESTORE_FSTRANS(&tp->t_pflags); + current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); xfs_trans_free_items(tp, flags); xfs_trans_free_busy(tp); diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 100d9a4b3..9dc88b380 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -338,8 +338,6 @@ typedef void (*xfs_trans_callback_t)(struct xfs_trans *, void *); typedef struct xfs_trans { unsigned int t_magic; /* magic number */ xfs_log_callback_t t_logcb; /* log callback struct */ - struct xfs_trans *t_forw; /* async list pointers */ - struct xfs_trans *t_back; /* async list pointers */ unsigned int t_type; /* transaction type */ unsigned int t_log_res; /* amt of log space resvd */ unsigned int t_log_count; /* count for perm log res */ @@ -364,9 +362,11 @@ typedef struct xfs_trans { long t_res_fdblocks_delta; /* on-disk only chg */ long t_frextents_delta;/* superblock freextents chg*/ long t_res_frextents_delta; /* on-disk only chg */ +#ifdef DEBUG long t_ag_freeblks_delta; /* debugging counter */ long t_ag_flist_delta; /* debugging counter */ long t_ag_btree_delta; /* debugging counter */ +#endif long t_dblocks_delta;/* superblock dblocks change */ long t_agcount_delta;/* superblock agcount change */ long t_imaxpct_delta;/* superblock imaxpct change */ @@ -805,12 +805,9 @@ typedef struct xfs_trans { ((mp)->m_sb.sb_inodesize + \ (mp)->m_sb.sb_sectsize * 2 + \ (mp)->m_dirblksize + \ - (XFS_DIR_IS_V1(mp) ? 0 : \ - XFS_FSB_TO_B(mp, (XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1))) + \ + XFS_FSB_TO_B(mp, (XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1)) + \ XFS_ALLOCFREE_LOG_RES(mp, 1) + \ - (128 * (4 + \ - (XFS_DIR_IS_V1(mp) ? 0 : \ - XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1) + \ + (128 * (4 + (XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1) + \ XFS_ALLOCFREE_LOG_COUNT(mp, 1)))) #define XFS_ADDAFORK_LOG_RES(mp) ((mp)->m_reservations.tr_addafork) diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index 19ab24af1..558c87ff0 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c @@ -22,7 +22,6 @@ #include "xfs_inum.h" #include "xfs_trans.h" #include "xfs_sb.h" -#include "xfs_dir.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_trans_priv.h" @@ -363,9 +362,10 @@ xfs_trans_delete_ail( AIL_UNLOCK(mp, s); else { xfs_cmn_err(XFS_PTAG_AILDELETE, CE_ALERT, mp, - "xfs_trans_delete_ail: attempting to delete a log item that is not in the AIL"); + "%s: attempting to delete a log item that is not in the AIL", + __FUNCTION__); AIL_UNLOCK(mp, s); - xfs_force_shutdown(mp, XFS_CORRUPT_INCORE); + xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); } } } diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index c74c31ebc..60b6b8980 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -24,14 +24,12 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -320,7 +318,7 @@ xfs_trans_read_buf( if (xfs_error_target == target) { if (((xfs_req_num++) % xfs_error_mod) == 0) { xfs_buf_relse(bp); - printk("Returning error!\n"); + cmn_err(CE_DEBUG, "Returning error!\n"); return XFS_ERROR(EIO); } } @@ -369,7 +367,7 @@ xfs_trans_read_buf( */ if (tp->t_flags & XFS_TRANS_DIRTY) xfs_force_shutdown(tp->t_mountp, - XFS_METADATA_IO_ERROR); + SHUTDOWN_META_IO_ERROR); return error; } } @@ -414,7 +412,7 @@ xfs_trans_read_buf( xfs_ioerror_alert("xfs_trans_read_buf", mp, bp, blkno); if (tp->t_flags & XFS_TRANS_DIRTY) - xfs_force_shutdown(tp->t_mountp, XFS_METADATA_IO_ERROR); + xfs_force_shutdown(tp->t_mountp, SHUTDOWN_META_IO_ERROR); xfs_buf_relse(bp); return error; } @@ -423,9 +421,9 @@ xfs_trans_read_buf( if (xfs_error_target == target) { if (((xfs_req_num++) % xfs_error_mod) == 0) { xfs_force_shutdown(tp->t_mountp, - XFS_METADATA_IO_ERROR); + SHUTDOWN_META_IO_ERROR); xfs_buf_relse(bp); - printk("Returning error in trans!\n"); + cmn_err(CE_DEBUG, "Returning trans error!\n"); return XFS_ERROR(EIO); } } diff --git a/fs/xfs/xfs_trans_extfree.c b/fs/xfs/xfs_trans_extfree.c index 7d7d627f2..b290270dd 100644 --- a/fs/xfs/xfs_trans_extfree.c +++ b/fs/xfs/xfs_trans_extfree.c @@ -22,7 +22,6 @@ #include "xfs_inum.h" #include "xfs_trans.h" #include "xfs_sb.h" -#include "xfs_dir.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_trans_priv.h" diff --git a/fs/xfs/xfs_trans_inode.c b/fs/xfs/xfs_trans_inode.c index 7c5894d59..b8db1d5cd 100644 --- a/fs/xfs/xfs_trans_inode.c +++ b/fs/xfs/xfs_trans_inode.c @@ -24,14 +24,12 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" diff --git a/fs/xfs/xfs_trans_item.c b/fs/xfs/xfs_trans_item.c index 1117d600d..2912aac07 100644 --- a/fs/xfs/xfs_trans_item.c +++ b/fs/xfs/xfs_trans_item.c @@ -493,7 +493,7 @@ xfs_trans_add_busy(xfs_trans_t *tp, xfs_agnumber_t ag, xfs_extlen_t idx) break; } else { /* out-of-order vacancy */ - printk("OOO vacancy lbcp 0x%p\n", lbcp); + cmn_err(CE_DEBUG, "OOO vacancy lbcp 0x%p\n", lbcp); ASSERT(0); } } diff --git a/fs/xfs/xfs_trans_space.h b/fs/xfs/xfs_trans_space.h index 7fe3792b1..4ea2e5074 100644 --- a/fs/xfs/xfs_trans_space.h +++ b/fs/xfs/xfs_trans_space.h @@ -30,8 +30,7 @@ XFS_EXTENTADD_SPACE_RES(mp,w)) #define XFS_DAENTER_1B(mp,w) ((w) == XFS_DATA_FORK ? (mp)->m_dirblkfsbs : 1) #define XFS_DAENTER_DBS(mp,w) \ - (XFS_DA_NODE_MAXDEPTH + \ - ((XFS_DIR_IS_V2(mp) && (w) == XFS_DATA_FORK) ? 2 : 0)) + (XFS_DA_NODE_MAXDEPTH + (((w) == XFS_DATA_FORK) ? 2 : 0)) #define XFS_DAENTER_BLOCKS(mp,w) \ (XFS_DAENTER_1B(mp,w) * XFS_DAENTER_DBS(mp,w)) #define XFS_DAENTER_BMAP1B(mp,w) \ @@ -41,10 +40,7 @@ #define XFS_DAENTER_SPACE_RES(mp,w) \ (XFS_DAENTER_BLOCKS(mp,w) + XFS_DAENTER_BMAPS(mp,w)) #define XFS_DAREMOVE_SPACE_RES(mp,w) XFS_DAENTER_BMAPS(mp,w) -#define XFS_DIRENTER_MAX_SPLIT(mp,nl) \ - (((mp)->m_sb.sb_blocksize == 512 && \ - XFS_DIR_IS_V1(mp) && \ - (nl) >= XFS_DIR_LEAF_CAN_DOUBLE_SPLIT_LEN) ? 2 : 1) +#define XFS_DIRENTER_MAX_SPLIT(mp,nl) 1 #define XFS_DIRENTER_SPACE_RES(mp,nl) \ (XFS_DAENTER_SPACE_RES(mp, XFS_DATA_FORK) * \ XFS_DIRENTER_MAX_SPLIT(mp,nl)) @@ -57,8 +53,7 @@ * Space reservation values for various transactions. */ #define XFS_ADDAFORK_SPACE_RES(mp) \ - ((mp)->m_dirblkfsbs + \ - (XFS_DIR_IS_V1(mp) ? 0 : XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK))) + ((mp)->m_dirblkfsbs + XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK)) #define XFS_ATTRRM_SPACE_RES(mp) \ XFS_DAREMOVE_SPACE_RES(mp, XFS_ATTR_FORK) /* This macro is not used - see inline code in xfs_attr_set */ diff --git a/fs/xfs/xfs_utils.c b/fs/xfs/xfs_utils.c index 34654ec6a..9014d7e44 100644 --- a/fs/xfs/xfs_utils.c +++ b/fs/xfs/xfs_utils.c @@ -24,12 +24,10 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -51,10 +49,10 @@ */ int xfs_get_dir_entry( - vname_t *dentry, + bhv_vname_t *dentry, xfs_inode_t **ipp) { - vnode_t *vp; + bhv_vnode_t *vp; vp = VNAME_TO_VNODE(dentry); @@ -69,11 +67,11 @@ int xfs_dir_lookup_int( bhv_desc_t *dir_bdp, uint lock_mode, - vname_t *dentry, + bhv_vname_t *dentry, xfs_ino_t *inum, xfs_inode_t **ipp) { - vnode_t *dir_vp; + bhv_vnode_t *dir_vp; xfs_inode_t *dp; int error; @@ -82,8 +80,7 @@ xfs_dir_lookup_int( dp = XFS_BHVTOI(dir_bdp); - error = XFS_DIR_LOOKUP(dp->i_mount, NULL, dp, - VNAME(dentry), VNAMELEN(dentry), inum); + error = xfs_dir_lookup(NULL, dp, VNAME(dentry), VNAMELEN(dentry), inum); if (!error) { /* * Unlock the directory. We do this because we can't diff --git a/fs/xfs/xfs_utils.h b/fs/xfs/xfs_utils.h index 472661a3b..fe953e98a 100644 --- a/fs/xfs/xfs_utils.h +++ b/fs/xfs/xfs_utils.h @@ -23,9 +23,10 @@ #define ITRACE(ip) vn_trace_ref(XFS_ITOV(ip), __FILE__, __LINE__, \ (inst_t *)__return_address) -extern int xfs_rename (bhv_desc_t *, vname_t *, vnode_t *, vname_t *, cred_t *); -extern int xfs_get_dir_entry (vname_t *, xfs_inode_t **); -extern int xfs_dir_lookup_int (bhv_desc_t *, uint, vname_t *, xfs_ino_t *, +extern int xfs_rename (bhv_desc_t *, bhv_vname_t *, bhv_vnode_t *, + bhv_vname_t *, cred_t *); +extern int xfs_get_dir_entry (bhv_vname_t *, xfs_inode_t **); +extern int xfs_dir_lookup_int (bhv_desc_t *, uint, bhv_vname_t *, xfs_ino_t *, xfs_inode_t **); extern int xfs_truncate_file (xfs_mount_t *, xfs_inode_t *); extern int xfs_dir_ialloc (xfs_trans_t **, xfs_inode_t *, mode_t, xfs_nlink_t, diff --git a/fs/xfs/xfs_vfsops.c b/fs/xfs/xfs_vfsops.c index 0cbe00591..ec8787d3c 100644 --- a/fs/xfs/xfs_vfsops.c +++ b/fs/xfs/xfs_vfsops.c @@ -24,7 +24,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" @@ -32,7 +31,6 @@ #include "xfs_bmap_btree.h" #include "xfs_ialloc_btree.h" #include "xfs_alloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -131,9 +129,6 @@ xfs_init(void) #ifdef XFS_BMBT_TRACE xfs_bmbt_trace_buf = ktrace_alloc(XFS_BMBT_TRACE_SIZE, KM_SLEEP); #endif -#ifdef XFS_DIR_TRACE - xfs_dir_trace_buf = ktrace_alloc(XFS_DIR_TRACE_SIZE, KM_SLEEP); -#endif #ifdef XFS_ATTR_TRACE xfs_attr_trace_buf = ktrace_alloc(XFS_ATTR_TRACE_SIZE, KM_SLEEP); #endif @@ -177,9 +172,6 @@ xfs_cleanup(void) #ifdef XFS_ATTR_TRACE ktrace_free(xfs_attr_trace_buf); #endif -#ifdef XFS_DIR_TRACE - ktrace_free(xfs_dir_trace_buf); -#endif #ifdef XFS_BMBT_TRACE ktrace_free(xfs_bmbt_trace_buf); #endif @@ -212,7 +204,7 @@ xfs_cleanup(void) */ STATIC int xfs_start_flags( - struct vfs *vfs, + struct bhv_vfs *vfs, struct xfs_mount_args *ap, struct xfs_mount *mp) { @@ -339,7 +331,7 @@ xfs_start_flags( */ STATIC int xfs_finish_flags( - struct vfs *vfs, + struct bhv_vfs *vfs, struct xfs_mount_args *ap, struct xfs_mount *mp) { @@ -427,7 +419,7 @@ xfs_mount( struct xfs_mount_args *args, cred_t *credp) { - struct vfs *vfsp = bhvtovfs(bhvp); + struct bhv_vfs *vfsp = bhvtovfs(bhvp); struct bhv_desc *p; struct xfs_mount *mp = XFS_BHVTOM(bhvp); struct block_device *ddev, *logdev, *rtdev; @@ -527,7 +519,7 @@ xfs_mount( if (error) goto error2; - if ((mp->m_flags & XFS_MOUNT_BARRIER) && !(vfsp->vfs_flag & VFS_RDONLY)) + if (mp->m_flags & XFS_MOUNT_BARRIER) xfs_mountfs_check_barriers(mp); error = XFS_IOINIT(vfsp, args, flags); @@ -556,10 +548,10 @@ xfs_unmount( int flags, cred_t *credp) { - struct vfs *vfsp = bhvtovfs(bdp); + bhv_vfs_t *vfsp = bhvtovfs(bdp); xfs_mount_t *mp = XFS_BHVTOM(bdp); xfs_inode_t *rip; - vnode_t *rvp; + bhv_vnode_t *rvp; int unmount_event_wanted = 0; int unmount_event_flags = 0; int xfs_unmountfs_needed = 0; @@ -669,9 +661,8 @@ xfs_mntupdate( int *flags, struct xfs_mount_args *args) { - struct vfs *vfsp = bhvtovfs(bdp); + bhv_vfs_t *vfsp = bhvtovfs(bdp); xfs_mount_t *mp = XFS_BHVTOM(bdp); - int error; if (!(*flags & MS_RDONLY)) { /* rw/ro -> rw */ if (vfsp->vfs_flag & VFS_RDONLY) @@ -683,7 +674,7 @@ xfs_mntupdate( mp->m_flags &= ~XFS_MOUNT_BARRIER; } } else if (!(vfsp->vfs_flag & VFS_RDONLY)) { /* rw -> ro */ - VFS_SYNC(vfsp, SYNC_FSDATA|SYNC_BDFLUSH|SYNC_ATTR, NULL, error); + bhv_vfs_sync(vfsp, SYNC_FSDATA|SYNC_BDFLUSH|SYNC_ATTR, NULL); xfs_quiesce_fs(mp); xfs_log_unmount_write(mp); xfs_unmountfs_writesb(mp); @@ -706,7 +697,7 @@ xfs_unmount_flush( xfs_inode_t *rip = mp->m_rootip; xfs_inode_t *rbmip; xfs_inode_t *rsumip = NULL; - vnode_t *rvp = XFS_ITOV(rip); + bhv_vnode_t *rvp = XFS_ITOV(rip); int error; xfs_ilock(rip, XFS_ILOCK_EXCL); @@ -785,9 +776,9 @@ fscorrupt_out2: STATIC int xfs_root( bhv_desc_t *bdp, - vnode_t **vpp) + bhv_vnode_t **vpp) { - vnode_t *vp; + bhv_vnode_t *vp; vp = XFS_ITOV((XFS_BHVTOM(bdp))->m_rootip); VN_HOLD(vp); @@ -805,8 +796,8 @@ xfs_root( STATIC int xfs_statvfs( bhv_desc_t *bdp, - xfs_statfs_t *statp, - vnode_t *vp) + bhv_statvfs_t *statp, + bhv_vnode_t *vp) { __uint64_t fakeinos; xfs_extlen_t lsize; @@ -824,7 +815,8 @@ xfs_statvfs( statp->f_bsize = sbp->sb_blocksize; lsize = sbp->sb_logstart ? sbp->sb_logblocks : 0; statp->f_blocks = sbp->sb_dblocks - lsize; - statp->f_bfree = statp->f_bavail = sbp->sb_fdblocks; + statp->f_bfree = statp->f_bavail = + sbp->sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); fakeinos = statp->f_bfree << sbp->sb_inopblog; #if XFS_BIG_INUMS fakeinos += mp->m_inoadd; @@ -904,7 +896,7 @@ xfs_sync( /* * xfs sync routine for internal use * - * This routine supports all of the flags defined for the generic VFS_SYNC + * This routine supports all of the flags defined for the generic vfs_sync * interface as explained above under xfs_sync. In the interests of not * changing interfaces within the 6.5 family, additional internally- * required functions are specified within a separate xflags parameter, @@ -921,7 +913,7 @@ xfs_sync_inodes( xfs_inode_t *ip = NULL; xfs_inode_t *ip_next; xfs_buf_t *bp; - vnode_t *vp = NULL; + bhv_vnode_t *vp = NULL; int error; int last_error; uint64_t fflag; @@ -1160,9 +1152,9 @@ xfs_sync_inodes( xfs_iunlock(ip, XFS_ILOCK_SHARED); if (XFS_FORCED_SHUTDOWN(mp)) { - VOP_TOSS_PAGES(vp, 0, -1, FI_REMAPF); + bhv_vop_toss_pages(vp, 0, -1, FI_REMAPF); } else { - VOP_FLUSHINVAL_PAGES(vp, 0, -1, FI_REMAPF); + bhv_vop_flushinval_pages(vp, 0, -1, FI_REMAPF); } xfs_ilock(ip, XFS_ILOCK_SHARED); @@ -1182,8 +1174,8 @@ xfs_sync_inodes( * across calls to the buffer cache. */ xfs_iunlock(ip, XFS_ILOCK_SHARED); - VOP_FLUSH_PAGES(vp, (xfs_off_t)0, -1, - fflag, FI_NONE, error); + error = bhv_vop_flush_pages(vp, (xfs_off_t)0, + -1, fflag, FI_NONE); xfs_ilock(ip, XFS_ILOCK_SHARED); } @@ -1235,9 +1227,7 @@ xfs_sync_inodes( * marker and free it. */ XFS_MOUNT_ILOCK(mp); - IPOINTER_REMOVE(ip, mp); - XFS_MOUNT_IUNLOCK(mp); ASSERT(!(lock_flags & @@ -1425,7 +1415,7 @@ xfs_sync_inodes( /* * xfs sync routine for internal use * - * This routine supports all of the flags defined for the generic VFS_SYNC + * This routine supports all of the flags defined for the generic vfs_sync * interface as explained above under xfs_sync. In the interests of not * changing interfaces within the 6.5 family, additional internally- * required functions are specified within a separate xflags parameter, @@ -1578,7 +1568,7 @@ xfs_syncsub( STATIC int xfs_vget( bhv_desc_t *bdp, - vnode_t **vpp, + bhv_vnode_t **vpp, fid_t *fidp) { xfs_mount_t *mp = XFS_BHVTOM(bdp); @@ -1662,10 +1652,10 @@ xfs_vget( #define MNTOPT_TAGXID "tagxid" /* context xid tagging for inodes */ STATIC unsigned long -suffix_strtoul(const char *cp, char **endp, unsigned int base) +suffix_strtoul(char *s, char **endp, unsigned int base) { int last, shift_left_factor = 0; - char *value = (char *)cp; + char *value = s; last = strlen(value) - 1; if (value[last] == 'K' || value[last] == 'k') { @@ -1681,7 +1671,7 @@ suffix_strtoul(const char *cp, char **endp, unsigned int base) value[last] = '\0'; } - return simple_strtoul(cp, endp, base) << shift_left_factor; + return simple_strtoul((const char *)s, endp, base) << shift_left_factor; } STATIC int @@ -1691,7 +1681,7 @@ xfs_parseargs( struct xfs_mount_args *args, int update) { - struct vfs *vfsp = bhvtovfs(bhv); + bhv_vfs_t *vfsp = bhvtovfs(bhv); char *this_char, *value, *eov; int dsunit, dswidth, vol_dsunit, vol_dswidth; int iosize; @@ -1713,42 +1703,48 @@ xfs_parseargs( if (!strcmp(this_char, MNTOPT_LOGBUFS)) { if (!value || !*value) { - printk("XFS: %s option requires an argument\n", + cmn_err(CE_WARN, + "XFS: %s option requires an argument", this_char); return EINVAL; } args->logbufs = simple_strtoul(value, &eov, 10); } else if (!strcmp(this_char, MNTOPT_LOGBSIZE)) { if (!value || !*value) { - printk("XFS: %s option requires an argument\n", + cmn_err(CE_WARN, + "XFS: %s option requires an argument", this_char); return EINVAL; } args->logbufsize = suffix_strtoul(value, &eov, 10); } else if (!strcmp(this_char, MNTOPT_LOGDEV)) { if (!value || !*value) { - printk("XFS: %s option requires an argument\n", + cmn_err(CE_WARN, + "XFS: %s option requires an argument", this_char); return EINVAL; } strncpy(args->logname, value, MAXNAMELEN); } else if (!strcmp(this_char, MNTOPT_MTPT)) { if (!value || !*value) { - printk("XFS: %s option requires an argument\n", + cmn_err(CE_WARN, + "XFS: %s option requires an argument", this_char); return EINVAL; } strncpy(args->mtpt, value, MAXNAMELEN); } else if (!strcmp(this_char, MNTOPT_RTDEV)) { if (!value || !*value) { - printk("XFS: %s option requires an argument\n", + cmn_err(CE_WARN, + "XFS: %s option requires an argument", this_char); return EINVAL; } strncpy(args->rtname, value, MAXNAMELEN); } else if (!strcmp(this_char, MNTOPT_BIOSIZE)) { if (!value || !*value) { - printk("XFS: %s option requires an argument\n", + cmn_err(CE_WARN, + "XFS: %s option requires an argument", this_char); return EINVAL; } @@ -1757,7 +1753,8 @@ xfs_parseargs( args->iosizelog = (uint8_t) iosize; } else if (!strcmp(this_char, MNTOPT_ALLOCSIZE)) { if (!value || !*value) { - printk("XFS: %s option requires an argument\n", + cmn_err(CE_WARN, + "XFS: %s option requires an argument", this_char); return EINVAL; } @@ -1766,7 +1763,8 @@ xfs_parseargs( args->iosizelog = ffs(iosize) - 1; } else if (!strcmp(this_char, MNTOPT_IHASHSIZE)) { if (!value || !*value) { - printk("XFS: %s option requires an argument\n", + cmn_err(CE_WARN, + "XFS: %s option requires an argument", this_char); return EINVAL; } @@ -1787,7 +1785,8 @@ xfs_parseargs( } else if (!strcmp(this_char, MNTOPT_INO64)) { args->flags |= XFSMNT_INO64; #if !XFS_BIG_INUMS - printk("XFS: %s option not allowed on this system\n", + cmn_err(CE_WARN, + "XFS: %s option not allowed on this system", this_char); return EINVAL; #endif @@ -1797,14 +1796,16 @@ xfs_parseargs( args->flags |= XFSMNT_SWALLOC; } else if (!strcmp(this_char, MNTOPT_SUNIT)) { if (!value || !*value) { - printk("XFS: %s option requires an argument\n", + cmn_err(CE_WARN, + "XFS: %s option requires an argument", this_char); return EINVAL; } dsunit = simple_strtoul(value, &eov, 10); } else if (!strcmp(this_char, MNTOPT_SWIDTH)) { if (!value || !*value) { - printk("XFS: %s option requires an argument\n", + cmn_err(CE_WARN, + "XFS: %s option requires an argument", this_char); return EINVAL; } @@ -1812,7 +1813,8 @@ xfs_parseargs( } else if (!strcmp(this_char, MNTOPT_64BITINODE)) { args->flags &= ~XFSMNT_32BITINODES; #if !XFS_BIG_INUMS - printk("XFS: %s option not allowed on this system\n", + cmn_err(CE_WARN, + "XFS: %s option not allowed on this system", this_char); return EINVAL; #endif @@ -1840,36 +1842,41 @@ xfs_parseargs( #endif } else if (!strcmp(this_char, "osyncisdsync")) { /* no-op, this is now the default */ -printk("XFS: osyncisdsync is now the default, option is deprecated.\n"); + cmn_err(CE_WARN, + "XFS: osyncisdsync is now the default, option is deprecated."); } else if (!strcmp(this_char, "irixsgid")) { -printk("XFS: irixsgid is now a sysctl(2) variable, option is deprecated.\n"); + cmn_err(CE_WARN, + "XFS: irixsgid is now a sysctl(2) variable, option is deprecated."); } else { - printk("XFS: unknown mount option [%s].\n", this_char); + cmn_err(CE_WARN, + "XFS: unknown mount option [%s].", this_char); return EINVAL; } } if (args->flags & XFSMNT_NORECOVERY) { if ((vfsp->vfs_flag & VFS_RDONLY) == 0) { - printk("XFS: no-recovery mounts must be read-only.\n"); + cmn_err(CE_WARN, + "XFS: no-recovery mounts must be read-only."); return EINVAL; } } if ((args->flags & XFSMNT_NOALIGN) && (dsunit || dswidth)) { - printk( - "XFS: sunit and swidth options incompatible with the noalign option\n"); + cmn_err(CE_WARN, + "XFS: sunit and swidth options incompatible with the noalign option"); return EINVAL; } if ((dsunit && !dswidth) || (!dsunit && dswidth)) { - printk("XFS: sunit and swidth must be specified together\n"); + cmn_err(CE_WARN, + "XFS: sunit and swidth must be specified together"); return EINVAL; } if (dsunit && (dswidth % dsunit != 0)) { - printk( - "XFS: stripe width (%d) must be a multiple of the stripe unit (%d)\n", + cmn_err(CE_WARN, + "XFS: stripe width (%d) must be a multiple of the stripe unit (%d)", dswidth, dsunit); return EINVAL; } @@ -1916,7 +1923,7 @@ xfs_showargs( }; struct proc_xfs_info *xfs_infop; struct xfs_mount *mp = XFS_BHVTOM(bhv); - struct vfs *vfsp = XFS_MTOVFS(mp); + struct bhv_vfs *vfsp = XFS_MTOVFS(mp); for (xfs_infop = xfs_info; xfs_infop->flag; xfs_infop++) { if (mp->m_flags & xfs_infop->flag) @@ -1976,7 +1983,7 @@ xfs_freeze( } -vfsops_t xfs_vfsops = { +bhv_vfsops_t xfs_vfsops = { BHV_IDENTITY_INIT(VFS_BHV_XFS,VFS_POSITION_XFS), .vfs_parseargs = xfs_parseargs, .vfs_showargs = xfs_showargs, diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 8abbe3573..7151482fc 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2006 Silicon Graphics, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -16,8 +16,6 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include - #include "xfs.h" #include "xfs_fs.h" #include "xfs_types.h" @@ -27,7 +25,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_dmapi.h" #include "xfs_mount.h" @@ -35,13 +32,11 @@ #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" -#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" -#include "xfs_dir_leaf.h" #include "xfs_itable.h" #include "xfs_btree.h" #include "xfs_ialloc.h" @@ -58,32 +53,14 @@ #include "xfs_log_priv.h" #include "xfs_mac.h" - -/* - * The maximum pathlen is 1024 bytes. Since the minimum file system - * blocksize is 512 bytes, we can get a max of 2 extents back from - * bmapi. - */ -#define SYMLINK_MAPS 2 - -/* - * For xfs, we check that the file isn't too big to be opened by this kernel. - * No other open action is required for regular files. Devices are handled - * through the specfs file system, pipes through fifofs. Device and - * fifo vnodes are "wrapped" by specfs and fifofs vnodes, respectively, - * when a new vnode is first looked up or created. - */ STATIC int xfs_open( bhv_desc_t *bdp, cred_t *credp) { int mode; - vnode_t *vp; - xfs_inode_t *ip; - - vp = BHV_TO_VNODE(bdp); - ip = XFS_BHVTOI(bdp); + bhv_vnode_t *vp = BHV_TO_VNODE(bdp); + xfs_inode_t *ip = XFS_BHVTOI(bdp); if (XFS_FORCED_SHUTDOWN(ip->i_mount)) return XFS_ERROR(EIO); @@ -101,6 +78,35 @@ xfs_open( return 0; } +STATIC int +xfs_close( + bhv_desc_t *bdp, + int flags, + lastclose_t lastclose, + cred_t *credp) +{ + bhv_vnode_t *vp = BHV_TO_VNODE(bdp); + xfs_inode_t *ip = XFS_BHVTOI(bdp); + + if (XFS_FORCED_SHUTDOWN(ip->i_mount)) + return XFS_ERROR(EIO); + + if (lastclose != L_TRUE || !VN_ISREG(vp)) + return 0; + + /* + * If we previously truncated this file and removed old data in + * the process, we want to initiate "early" writeout on the last + * close. This is an attempt to combat the notorious NULL files + * problem which is particularly noticable from a truncate down, + * buffered (re-)write (delalloc), followed by a crash. What we + * are effectively doing here is significantly reducing the time + * window where we'd otherwise be exposed to that problem. + */ + if (VUNTRUNCATE(vp) && VN_DIRTY(vp) && ip->i_delayed_blks > 0) + return bhv_vop_flush_pages(vp, 0, -1, XFS_B_ASYNC, FI_NONE); + return 0; +} /* * xfs_getattr @@ -108,13 +114,13 @@ xfs_open( STATIC int xfs_getattr( bhv_desc_t *bdp, - vattr_t *vap, + bhv_vattr_t *vap, int flags, cred_t *credp) { xfs_inode_t *ip; xfs_mount_t *mp; - vnode_t *vp; + bhv_vnode_t *vp; vp = BHV_TO_VNODE(bdp); vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address); @@ -242,7 +248,7 @@ xfs_getattr( int xfs_setattr( bhv_desc_t *bdp, - vattr_t *vap, + bhv_vattr_t *vap, int flags, cred_t *credp) { @@ -257,7 +263,7 @@ xfs_setattr( gid_t gid=0, igid=0; xid_t xid=0, ixid=0; int timeflags = 0; - vnode_t *vp; + bhv_vnode_t *vp; xfs_prid_t projid=0, iprojid=0; int mandlock_before, mandlock_after; struct xfs_dquot *udqp, *gdqp, *olddquot1, *olddquot2; @@ -350,7 +356,6 @@ xfs_setattr( */ tp = NULL; lock_flags = XFS_ILOCK_EXCL; - ASSERT(flags & ATTR_NOLOCK ? flags & ATTR_DMI : 1); if (flags & ATTR_NOLOCK) need_iolock = 0; if (!(mask & XFS_AT_SIZE)) { @@ -674,9 +679,17 @@ xfs_setattr( ((ip->i_d.di_nlink != 0 || !(mp->m_flags & XFS_MOUNT_WSYNC)) ? 1 : 0)); - if (code) { + if (code) goto abort_return; - } + /* + * Truncated "down", so we're removing references + * to old data here - if we now delay flushing for + * a long time, we expose ourselves unduly to the + * notorious NULL files problem. So, we mark this + * vnode and flush it when the file is closed, and + * do not wait the usual (long) time for writeout. + */ + VTRUNCATE(vp); } /* * Have to do this even if the file's size doesn't change. @@ -818,6 +831,8 @@ xfs_setattr( di_flags |= XFS_DIFLAG_NODUMP; if (vap->va_xflags & XFS_XFLAG_PROJINHERIT) di_flags |= XFS_DIFLAG_PROJINHERIT; + if (vap->va_xflags & XFS_XFLAG_NODEFRAG) + di_flags |= XFS_DIFLAG_NODEFRAG; if ((ip->i_d.di_mode & S_IFMT) == S_IFDIR) { if (vap->va_xflags & XFS_XFLAG_RTINHERIT) di_flags |= XFS_DIFLAG_RTINHERIT; @@ -887,7 +902,7 @@ xfs_setattr( */ mandlock_after = MANDLOCK(vp, ip->i_d.di_mode); if (mandlock_before != mandlock_after) { - VOP_VNODE_CHANGE(vp, VCHANGE_FLAGS_ENF_LOCKING, + bhv_vop_vnode_change(vp, VCHANGE_FLAGS_ENF_LOCKING, mandlock_after); } @@ -953,6 +968,13 @@ xfs_access( } +/* + * The maximum pathlen is 1024 bytes. Since the minimum file system + * blocksize is 512 bytes, we can get a max of 2 extents back from + * bmapi. + */ +#define SYMLINK_MAPS 2 + /* * xfs_readlink * @@ -968,7 +990,7 @@ xfs_readlink( int count; xfs_off_t offset; int pathlen; - vnode_t *vp; + bhv_vnode_t *vp; int error = 0; xfs_mount_t *mp; int nmaps; @@ -1018,7 +1040,7 @@ xfs_readlink( nmaps = SYMLINK_MAPS; error = xfs_bmapi(NULL, ip, 0, XFS_B_TO_FSB(mp, pathlen), - 0, NULL, 0, mval, &nmaps, NULL); + 0, NULL, 0, mval, &nmaps, NULL, NULL); if (error) { goto error_return; @@ -1226,8 +1248,8 @@ xfs_inactive_free_eofblocks( nimaps = 1; xfs_ilock(ip, XFS_ILOCK_SHARED); - error = xfs_bmapi(NULL, ip, end_fsb, map_len, 0, - NULL, 0, &imap, &nimaps, NULL); + error = XFS_BMAPI(mp, NULL, &ip->i_iocore, end_fsb, map_len, 0, + NULL, 0, &imap, &nimaps, NULL, NULL); xfs_iunlock(ip, XFS_ILOCK_SHARED); if (!error && (nimaps != 0) && @@ -1356,7 +1378,7 @@ xfs_inactive_symlink_rmt( nmaps = ARRAY_SIZE(mval); if ((error = xfs_bmapi(tp, ip, 0, XFS_B_TO_FSB(mp, size), XFS_BMAPI_METADATA, &first_block, 0, mval, &nmaps, - &free_list))) + &free_list, NULL))) goto error0; /* * Invalidate the block(s). @@ -1371,7 +1393,7 @@ xfs_inactive_symlink_rmt( * Unmap the dead block(s) to the free_list. */ if ((error = xfs_bunmapi(tp, ip, 0, size, XFS_BMAPI_METADATA, nmaps, - &first_block, &free_list, &done))) + &first_block, &free_list, NULL, &done))) goto error1; ASSERT(done); /* @@ -1487,9 +1509,6 @@ xfs_inactive_symlink_local( return 0; } -/* - * - */ STATIC int xfs_inactive_attrs( xfs_inode_t *ip, @@ -1542,16 +1561,16 @@ xfs_release( bhv_desc_t *bdp) { xfs_inode_t *ip; - vnode_t *vp; + bhv_vnode_t *vp; xfs_mount_t *mp; int error; vp = BHV_TO_VNODE(bdp); ip = XFS_BHVTOI(bdp); + mp = ip->i_mount; - if (!VN_ISREG(vp) || (ip->i_d.di_mode == 0)) { + if (!VN_ISREG(vp) || (ip->i_d.di_mode == 0)) return 0; - } /* If this is a read-only mount, don't do this (would generate I/O) */ if (vp->v_vfsp->vfs_flag & VFS_RDONLY) @@ -1563,8 +1582,6 @@ xfs_release( return 0; #endif - mp = ip->i_mount; - if (ip->i_d.di_nlink != 0) { if ((((ip->i_d.di_mode & S_IFMT) == S_IFREG) && ((ip->i_d.di_size > 0) || (VN_CACHED(vp) > 0 || @@ -1597,8 +1614,8 @@ xfs_inactive( cred_t *credp) { xfs_inode_t *ip; - vnode_t *vp; - xfs_bmap_free_t free_list; + bhv_vnode_t *vp; + xfs_bmap_free_t free_list; xfs_fsblock_t first_block; int committed; xfs_trans_t *tp; @@ -1778,7 +1795,7 @@ xfs_inactive( cmn_err(CE_NOTE, "xfs_inactive: xfs_ifree() returned an error = %d on %s", error, mp->m_fsname); - xfs_force_shutdown(mp, XFS_METADATA_IO_ERROR); + xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); } xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT); } else { @@ -1813,17 +1830,17 @@ xfs_inactive( STATIC int xfs_lookup( bhv_desc_t *dir_bdp, - vname_t *dentry, - vnode_t **vpp, + bhv_vname_t *dentry, + bhv_vnode_t **vpp, int flags, - vnode_t *rdir, + bhv_vnode_t *rdir, cred_t *credp) { xfs_inode_t *dp, *ip; xfs_ino_t e_inum; int error; uint lock_mode; - vnode_t *dir_vp; + bhv_vnode_t *dir_vp; dir_vp = BHV_TO_VNODE(dir_bdp); vn_trace_entry(dir_vp, __FUNCTION__, (inst_t *)__return_address); @@ -1850,15 +1867,15 @@ xfs_lookup( STATIC int xfs_create( bhv_desc_t *dir_bdp, - vname_t *dentry, - vattr_t *vap, - vnode_t **vpp, + bhv_vname_t *dentry, + bhv_vattr_t *vap, + bhv_vnode_t **vpp, cred_t *credp) { char *name = VNAME(dentry); - vnode_t *dir_vp; + bhv_vnode_t *dir_vp; xfs_inode_t *dp, *ip; - vnode_t *vp=NULL; + bhv_vnode_t *vp = NULL; xfs_trans_t *tp; xfs_mount_t *mp; xfs_dev_t rdev; @@ -1956,8 +1973,7 @@ xfs_create( if (error) goto error_return; - if (resblks == 0 && - (error = XFS_DIR_CANENTER(mp, tp, dp, name, namelen))) + if (resblks == 0 && (error = xfs_dir_canenter(tp, dp, name, namelen))) goto error_return; rdev = (vap->va_mask & XFS_AT_RDEV) ? vap->va_rdev : 0; error = xfs_dir_ialloc(&tp, dp, vap->va_mode, 1, @@ -1988,9 +2004,9 @@ xfs_create( xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); dp_joined_to_trans = B_TRUE; - error = XFS_DIR_CREATENAME(mp, tp, dp, name, namelen, ip->i_ino, - &first_block, &free_list, - resblks ? resblks - XFS_IALLOC_SPACE_RES(mp) : 0); + error = xfs_dir_createname(tp, dp, name, namelen, ip->i_ino, + &first_block, &free_list, resblks ? + resblks - XFS_IALLOC_SPACE_RES(mp) : 0); if (error) { ASSERT(error != ENOSPC); goto abort_return; @@ -2044,7 +2060,7 @@ xfs_create( * Propagate the fact that the vnode changed after the * xfs_inode locks have been released. */ - VOP_VNODE_CHANGE(vp, VCHANGE_FLAGS_TRUNCATED, 3); + bhv_vop_vnode_change(vp, VCHANGE_FLAGS_TRUNCATED, 3); *vpp = vp; @@ -2125,7 +2141,7 @@ int xfs_rm_attempts; STATIC int xfs_lock_dir_and_entry( xfs_inode_t *dp, - vname_t *dentry, + bhv_vname_t *dentry, xfs_inode_t *ip) /* inode of entry 'name' */ { int attempts; @@ -2339,10 +2355,10 @@ int remove_which_error_return = 0; STATIC int xfs_remove( bhv_desc_t *dir_bdp, - vname_t *dentry, + bhv_vname_t *dentry, cred_t *credp) { - vnode_t *dir_vp; + bhv_vnode_t *dir_vp; char *name = VNAME(dentry); xfs_inode_t *dp, *ip; xfs_trans_t *tp = NULL; @@ -2466,8 +2482,8 @@ xfs_remove( * Entry must exist since we did a lookup in xfs_lock_dir_and_entry. */ XFS_BMAP_INIT(&free_list, &first_block); - error = XFS_DIR_REMOVENAME(mp, tp, dp, name, namelen, ip->i_ino, - &first_block, &free_list, 0); + error = xfs_dir_removename(tp, dp, name, namelen, ip->i_ino, + &first_block, &free_list, 0); if (error) { ASSERT(error != ENOENT); REMOVE_DEBUG_TRACE(__LINE__); @@ -2529,7 +2545,7 @@ xfs_remove( /* * Let interposed file systems know about removed links. */ - VOP_LINK_REMOVED(XFS_ITOV(ip), dir_vp, link_zero); + bhv_vop_link_removed(XFS_ITOV(ip), dir_vp, link_zero); IRELE(ip); @@ -2582,8 +2598,8 @@ xfs_remove( STATIC int xfs_link( bhv_desc_t *target_dir_bdp, - vnode_t *src_vp, - vname_t *dentry, + bhv_vnode_t *src_vp, + bhv_vname_t *dentry, cred_t *credp) { xfs_inode_t *tdp, *sip; @@ -2595,7 +2611,7 @@ xfs_link( xfs_fsblock_t first_block; int cancel_flags; int committed; - vnode_t *target_dir_vp; + bhv_vnode_t *target_dir_vp; int resblks; char *target_name = VNAME(dentry); int target_namelen; @@ -2605,8 +2621,7 @@ xfs_link( vn_trace_entry(src_vp, __FUNCTION__, (inst_t *)__return_address); target_namelen = VNAMELEN(dentry); - if (VN_ISDIR(src_vp)) - return XFS_ERROR(EPERM); + ASSERT(!VN_ISDIR(src_vp)); sip = xfs_vtoi(src_vp); tdp = XFS_BHVTOI(target_dir_bdp); @@ -2686,13 +2701,12 @@ xfs_link( } if (resblks == 0 && - (error = XFS_DIR_CANENTER(mp, tp, tdp, target_name, - target_namelen))) + (error = xfs_dir_canenter(tp, tdp, target_name, target_namelen))) goto error_return; XFS_BMAP_INIT(&free_list, &first_block); - error = XFS_DIR_CREATENAME(mp, tp, tdp, target_name, target_namelen, + error = xfs_dir_createname(tp, tdp, target_name, target_namelen, sip->i_ino, &first_block, &free_list, resblks); if (error) @@ -2702,9 +2716,8 @@ xfs_link( xfs_trans_log_inode(tp, tdp, XFS_ILOG_CORE); error = xfs_bumplink(tp, sip); - if (error) { + if (error) goto abort_return; - } /* * If this is a synchronous mount, make sure that the @@ -2722,9 +2735,8 @@ xfs_link( } error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES, NULL); - if (error) { + if (error) goto std_return; - } /* Fall through to std_return with error = 0. */ std_return: @@ -2745,6 +2757,8 @@ std_return: xfs_trans_cancel(tp, cancel_flags); goto std_return; } + + /* * xfs_mkdir * @@ -2752,15 +2766,15 @@ std_return: STATIC int xfs_mkdir( bhv_desc_t *dir_bdp, - vname_t *dentry, - vattr_t *vap, - vnode_t **vpp, + bhv_vname_t *dentry, + bhv_vattr_t *vap, + bhv_vnode_t **vpp, cred_t *credp) { char *dir_name = VNAME(dentry); xfs_inode_t *dp; xfs_inode_t *cdp; /* inode of created dir */ - vnode_t *cvp; /* vnode of created dir */ + bhv_vnode_t *cvp; /* vnode of created dir */ xfs_trans_t *tp; xfs_mount_t *mp; int cancel_flags; @@ -2768,7 +2782,7 @@ xfs_mkdir( int committed; xfs_bmap_free_t free_list; xfs_fsblock_t first_block; - vnode_t *dir_vp; + bhv_vnode_t *dir_vp; boolean_t dp_joined_to_trans; boolean_t created = B_FALSE; int dm_event_sent = 0; @@ -2858,7 +2872,7 @@ xfs_mkdir( goto error_return; if (resblks == 0 && - (error = XFS_DIR_CANENTER(mp, tp, dp, dir_name, dir_namelen))) + (error = xfs_dir_canenter(tp, dp, dir_name, dir_namelen))) goto error_return; /* * create the directory inode. @@ -2885,9 +2899,9 @@ xfs_mkdir( XFS_BMAP_INIT(&free_list, &first_block); - error = XFS_DIR_CREATENAME(mp, tp, dp, dir_name, dir_namelen, - cdp->i_ino, &first_block, &free_list, - resblks ? resblks - XFS_IALLOC_SPACE_RES(mp) : 0); + error = xfs_dir_createname(tp, dp, dir_name, dir_namelen, cdp->i_ino, + &first_block, &free_list, resblks ? + resblks - XFS_IALLOC_SPACE_RES(mp) : 0); if (error) { ASSERT(error != ENOSPC); goto error1; @@ -2901,16 +2915,14 @@ xfs_mkdir( */ dp->i_gen++; - error = XFS_DIR_INIT(mp, tp, cdp, dp); - if (error) { + error = xfs_dir_init(tp, cdp, dp); + if (error) goto error2; - } cdp->i_gen = 1; error = xfs_bumplink(tp, dp); - if (error) { + if (error) goto error2; - } cvp = XFS_ITOV(cdp); @@ -2987,7 +2999,7 @@ std_return: STATIC int xfs_rmdir( bhv_desc_t *dir_bdp, - vname_t *dentry, + bhv_vname_t *dentry, cred_t *credp) { char *name = VNAME(dentry); @@ -3000,7 +3012,7 @@ xfs_rmdir( xfs_fsblock_t first_block; int cancel_flags; int committed; - vnode_t *dir_vp; + bhv_vnode_t *dir_vp; int dm_di_mode = 0; int last_cdp_link; int namelen; @@ -3119,16 +3131,15 @@ xfs_rmdir( error = XFS_ERROR(ENOTEMPTY); goto error_return; } - if (!XFS_DIR_ISEMPTY(mp, cdp)) { + if (!xfs_dir_isempty(cdp)) { error = XFS_ERROR(ENOTEMPTY); goto error_return; } - error = XFS_DIR_REMOVENAME(mp, tp, dp, name, namelen, cdp->i_ino, - &first_block, &free_list, resblks); - if (error) { + error = xfs_dir_removename(tp, dp, name, namelen, cdp->i_ino, + &first_block, &free_list, resblks); + if (error) goto error1; - } xfs_ichgtime(dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); @@ -3199,7 +3210,7 @@ xfs_rmdir( /* * Let interposed file systems know about removed links. */ - VOP_LINK_REMOVED(XFS_ITOV(cdp), dir_vp, last_cdp_link); + bhv_vop_link_removed(XFS_ITOV(cdp), dir_vp, last_cdp_link); IRELE(cdp); @@ -3227,8 +3238,6 @@ xfs_rmdir( /* - * xfs_readdir - * * Read dp's entries starting at uiop->uio_offset and translate them into * bufsize bytes worth of struct dirents starting at bufbase. */ @@ -3248,28 +3257,23 @@ xfs_readdir( (inst_t *)__return_address); dp = XFS_BHVTOI(dir_bdp); - if (XFS_FORCED_SHUTDOWN(dp->i_mount)) { + if (XFS_FORCED_SHUTDOWN(dp->i_mount)) return XFS_ERROR(EIO); - } lock_mode = xfs_ilock_map_shared(dp); - error = XFS_DIR_GETDENTS(dp->i_mount, tp, dp, uiop, eofp); + error = xfs_dir_getdents(tp, dp, uiop, eofp); xfs_iunlock_map_shared(dp, lock_mode); return error; } -/* - * xfs_symlink - * - */ STATIC int xfs_symlink( bhv_desc_t *dir_bdp, - vname_t *dentry, - vattr_t *vap, + bhv_vname_t *dentry, + bhv_vattr_t *vap, char *target_path, - vnode_t **vpp, + bhv_vnode_t **vpp, cred_t *credp) { xfs_trans_t *tp; @@ -3281,7 +3285,7 @@ xfs_symlink( xfs_bmap_free_t free_list; xfs_fsblock_t first_block; boolean_t dp_joined_to_trans; - vnode_t *dir_vp; + bhv_vnode_t *dir_vp; uint cancel_flags; int committed; xfs_fileoff_t first_fsb; @@ -3326,7 +3330,7 @@ xfs_symlink( int len, total; char *path; - for(total = 0, path = target_path; total < pathlen;) { + for (total = 0, path = target_path; total < pathlen;) { /* * Skip any slashes. */ @@ -3420,7 +3424,7 @@ xfs_symlink( * Check for ability to enter directory entry, if no space reserved. */ if (resblks == 0 && - (error = XFS_DIR_CANENTER(mp, tp, dp, link_name, link_namelen))) + (error = xfs_dir_canenter(tp, dp, link_name, link_namelen))) goto error_return; /* * Initialize the bmap freelist prior to calling either @@ -3475,7 +3479,7 @@ xfs_symlink( error = xfs_bmapi(tp, ip, first_fsb, fs_blocks, XFS_BMAPI_WRITE | XFS_BMAPI_METADATA, &first_block, resblks, mval, &nmaps, - &free_list); + &free_list, NULL); if (error) { goto error1; } @@ -3507,11 +3511,10 @@ xfs_symlink( /* * Create the directory entry for the symlink. */ - error = XFS_DIR_CREATENAME(mp, tp, dp, link_name, link_namelen, - ip->i_ino, &first_block, &free_list, resblks); - if (error) { + error = xfs_dir_createname(tp, dp, link_name, link_namelen, ip->i_ino, + &first_block, &free_list, resblks); + if (error) goto error1; - } xfs_ichgtime(dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); @@ -3559,7 +3562,7 @@ std_return: } if (!error) { - vnode_t *vp; + bhv_vnode_t *vp; ASSERT(ip); vp = XFS_ITOV(ip); @@ -3624,10 +3627,10 @@ xfs_fid2( int xfs_rwlock( bhv_desc_t *bdp, - vrwlock_t locktype) + bhv_vrwlock_t locktype) { xfs_inode_t *ip; - vnode_t *vp; + bhv_vnode_t *vp; vp = BHV_TO_VNODE(bdp); if (VN_ISDIR(vp)) @@ -3655,10 +3658,10 @@ xfs_rwlock( void xfs_rwunlock( bhv_desc_t *bdp, - vrwlock_t locktype) + bhv_vrwlock_t locktype) { xfs_inode_t *ip; - vnode_t *vp; + bhv_vnode_t *vp; vp = BHV_TO_VNODE(bdp); if (VN_ISDIR(vp)) @@ -3762,7 +3765,6 @@ xfs_inode_flush( return error; } - int xfs_set_dmattrs ( bhv_desc_t *bdp, @@ -3803,16 +3805,12 @@ xfs_set_dmattrs ( return error; } - -/* - * xfs_reclaim - */ STATIC int xfs_reclaim( bhv_desc_t *bdp) { xfs_inode_t *ip; - vnode_t *vp; + bhv_vnode_t *vp; vp = BHV_TO_VNODE(bdp); ip = XFS_BHVTOI(bdp); @@ -3867,7 +3865,7 @@ xfs_finish_reclaim( int sync_mode) { xfs_ihash_t *ih = ip->i_hash; - vnode_t *vp = XFS_ITOV_NULL(ip); + bhv_vnode_t *vp = XFS_ITOV_NULL(ip); int error; if (vp && VN_BAD(vp)) @@ -4134,10 +4132,10 @@ retry: * Issue the xfs_bmapi() call to allocate the blocks */ XFS_BMAP_INIT(&free_list, &firstfsb); - error = xfs_bmapi(tp, ip, startoffset_fsb, + error = XFS_BMAPI(mp, tp, &ip->i_iocore, startoffset_fsb, allocatesize_fsb, bmapi_flag, &firstfsb, 0, imapp, &nimaps, - &free_list); + &free_list, NULL); if (error) { goto error0; } @@ -4217,8 +4215,8 @@ xfs_zero_remaining_bytes( for (offset = startoff; offset <= endoff; offset = lastoffset + 1) { offset_fsb = XFS_B_TO_FSBT(mp, offset); nimap = 1; - error = xfs_bmapi(NULL, ip, offset_fsb, 1, 0, NULL, 0, &imap, - &nimap, NULL); + error = XFS_BMAPI(mp, NULL, &ip->i_iocore, offset_fsb, 1, 0, + NULL, 0, &imap, &nimap, NULL, NULL); if (error || nimap < 1) break; ASSERT(imap.br_blockcount >= 1); @@ -4277,7 +4275,7 @@ xfs_free_file_space( xfs_off_t len, int attr_flags) { - vnode_t *vp; + bhv_vnode_t *vp; int committed; int done; xfs_off_t end_dmi_offset; @@ -4326,7 +4324,6 @@ xfs_free_file_space( return error; } - ASSERT(attr_flags & ATTR_NOLOCK ? attr_flags & ATTR_DMI : 1); if (attr_flags & ATTR_NOLOCK) need_iolock = 0; if (need_iolock) { @@ -4344,7 +4341,7 @@ xfs_free_file_space( if (VN_CACHED(vp) != 0) { xfs_inval_cached_trace(&ip->i_iocore, ioffset, -1, ctooff(offtoct(ioffset)), -1); - VOP_FLUSHINVAL_PAGES(vp, ctooff(offtoct(ioffset)), + bhv_vop_flushinval_pages(vp, ctooff(offtoct(ioffset)), -1, FI_REMAPF_LOCKED); } @@ -4356,8 +4353,8 @@ xfs_free_file_space( */ if (rt && !XFS_SB_VERSION_HASEXTFLGBIT(&mp->m_sb)) { nimap = 1; - error = xfs_bmapi(NULL, ip, startoffset_fsb, 1, 0, NULL, 0, - &imap, &nimap, NULL); + error = XFS_BMAPI(mp, NULL, &ip->i_iocore, startoffset_fsb, + 1, 0, NULL, 0, &imap, &nimap, NULL, NULL); if (error) goto out_unlock_iolock; ASSERT(nimap == 0 || nimap == 1); @@ -4371,8 +4368,8 @@ xfs_free_file_space( startoffset_fsb += mp->m_sb.sb_rextsize - mod; } nimap = 1; - error = xfs_bmapi(NULL, ip, endoffset_fsb - 1, 1, 0, NULL, 0, - &imap, &nimap, NULL); + error = XFS_BMAPI(mp, NULL, &ip->i_iocore, endoffset_fsb - 1, + 1, 0, NULL, 0, &imap, &nimap, NULL, NULL); if (error) goto out_unlock_iolock; ASSERT(nimap == 0 || nimap == 1); @@ -4444,9 +4441,9 @@ xfs_free_file_space( * issue the bunmapi() call to free the blocks */ XFS_BMAP_INIT(&free_list, &firstfsb); - error = xfs_bunmapi(tp, ip, startoffset_fsb, + error = XFS_BUNMAPI(mp, tp, &ip->i_iocore, startoffset_fsb, endoffset_fsb - startoffset_fsb, - 0, 2, &firstfsb, &free_list, &done); + 0, 2, &firstfsb, &free_list, NULL, &done); if (error) { goto error0; } @@ -4506,8 +4503,8 @@ xfs_change_file_space( xfs_off_t startoffset; xfs_off_t llen; xfs_trans_t *tp; - vattr_t va; - vnode_t *vp; + bhv_vattr_t va; + bhv_vnode_t *vp; vp = BHV_TO_VNODE(bdp); vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address); @@ -4660,9 +4657,10 @@ xfs_change_file_space( return error; } -vnodeops_t xfs_vnodeops = { +bhv_vnodeops_t xfs_vnodeops = { BHV_IDENTITY_INIT(VN_BHV_XFS,VNODE_POSITION_XFS), .vop_open = xfs_open, + .vop_close = xfs_close, .vop_read = xfs_read, #ifdef HAVE_SENDFILE .vop_sendfile = xfs_sendfile, diff --git a/include/acpi/acconfig.h b/include/acpi/acconfig.h index e27dc8f29..9e6c23c36 100644 --- a/include/acpi/acconfig.h +++ b/include/acpi/acconfig.h @@ -63,7 +63,7 @@ /* Current ACPICA subsystem version in YYYYMMDD format */ -#define ACPI_CA_VERSION 0x20060127 +#define ACPI_CA_VERSION 0x20060707 /* * OS name, used for the _OS object. The _OS object is essentially obsolete, @@ -81,6 +81,7 @@ #define ACPI_MAX_PARSE_CACHE_DEPTH 96 /* Parse tree objects */ #define ACPI_MAX_EXTPARSE_CACHE_DEPTH 96 /* Parse tree objects */ #define ACPI_MAX_OBJECT_CACHE_DEPTH 96 /* Interpreter operand objects */ +#define ACPI_MAX_NAMESPACE_CACHE_DEPTH 96 /* Namespace objects */ /* * Should the subsystem abort the loading of an ACPI table if the @@ -102,9 +103,9 @@ #define ACPI_MAX_SEMAPHORE_COUNT 256 -/* Max reference count (for debug only) */ +/* Maximum object reference count (detects object deletion issues) */ -#define ACPI_MAX_REFERENCE_COUNT 0x400 +#define ACPI_MAX_REFERENCE_COUNT 0x800 /* Size of cached memory mapping for system memory operation region */ @@ -171,12 +172,7 @@ /* Array sizes. Used for range checking also */ -#define ACPI_NUM_ACCESS_TYPES 6 -#define ACPI_NUM_UPDATE_RULES 3 -#define ACPI_NUM_LOCK_RULES 2 -#define ACPI_NUM_MATCH_OPS 6 -#define ACPI_NUM_OPCODES 256 -#define ACPI_NUM_FIELD_NAMES 2 +#define ACPI_MAX_MATCH_OPCODE 5 /* RSDP checksums */ @@ -187,10 +183,6 @@ #define ACPI_SMBUS_BUFFER_SIZE 34 -/* Number of strings associated with the _OSI reserved method */ - -#define ACPI_NUM_OSI_STRINGS 10 - /****************************************************************************** * * ACPI AML Debugger diff --git a/include/acpi/acdisasm.h b/include/acpi/acdisasm.h index 11a8fe39c..9a7d6921f 100644 --- a/include/acpi/acdisasm.h +++ b/include/acpi/acdisasm.h @@ -50,26 +50,72 @@ #define BLOCK_PAREN 1 #define BLOCK_BRACE 2 #define BLOCK_COMMA_LIST 4 +#define ACPI_DEFAULT_RESNAME *(u32 *) "__RD" struct acpi_external_list { char *path; + char *internal_path; struct acpi_external_list *next; + u32 value; + u16 length; + u8 type; }; extern struct acpi_external_list *acpi_gbl_external_list; -/* Strings used for decoding flags to ASL keywords */ +typedef const struct acpi_dmtable_info { + u8 opcode; + u8 offset; + char *name; + +} acpi_dmtable_info; + +/* + * Values for Opcode above. + * Note: 0-7 must not change, used as a flag shift value + */ +#define ACPI_DMT_FLAG0 0 +#define ACPI_DMT_FLAG1 1 +#define ACPI_DMT_FLAG2 2 +#define ACPI_DMT_FLAG3 3 +#define ACPI_DMT_FLAG4 4 +#define ACPI_DMT_FLAG5 5 +#define ACPI_DMT_FLAG6 6 +#define ACPI_DMT_FLAG7 7 +#define ACPI_DMT_FLAGS0 8 +#define ACPI_DMT_FLAGS2 9 +#define ACPI_DMT_UINT8 10 +#define ACPI_DMT_UINT16 11 +#define ACPI_DMT_UINT24 12 +#define ACPI_DMT_UINT32 13 +#define ACPI_DMT_UINT56 14 +#define ACPI_DMT_UINT64 15 +#define ACPI_DMT_STRING 16 +#define ACPI_DMT_NAME4 17 +#define ACPI_DMT_NAME6 18 +#define ACPI_DMT_NAME8 19 +#define ACPI_DMT_CHKSUM 20 +#define ACPI_DMT_SPACEID 21 +#define ACPI_DMT_GAS 22 +#define ACPI_DMT_MADT 23 +#define ACPI_DMT_SRAT 24 +#define ACPI_DMT_EXIT 25 -extern const char *acpi_gbl_word_decode[4]; -extern const char *acpi_gbl_irq_decode[2]; -extern const char *acpi_gbl_lock_rule[ACPI_NUM_LOCK_RULES]; -extern const char *acpi_gbl_access_types[ACPI_NUM_ACCESS_TYPES]; -extern const char *acpi_gbl_update_rules[ACPI_NUM_UPDATE_RULES]; -extern const char *acpi_gbl_match_ops[ACPI_NUM_MATCH_OPS]; +typedef +void (*ACPI_TABLE_HANDLER) (struct acpi_table_header * table); + +struct acpi_dmtable_data { + char *signature; + struct acpi_dmtable_info *table_info; + ACPI_TABLE_HANDLER table_handler; +}; struct acpi_op_walk_info { u32 level; + u32 last_level; + u32 count; u32 bit_offset; + u32 flags; struct acpi_walk_state *walk_state; }; @@ -77,6 +123,100 @@ typedef acpi_status(*asl_walk_callback) (union acpi_parse_object * op, u32 level, void *context); +struct acpi_resource_tag { + u32 bit_index; + char *tag; +}; + +/* Strings used for decoding flags to ASL keywords */ + +extern const char *acpi_gbl_word_decode[]; +extern const char *acpi_gbl_irq_decode[]; +extern const char *acpi_gbl_lock_rule[]; +extern const char *acpi_gbl_access_types[]; +extern const char *acpi_gbl_update_rules[]; +extern const char *acpi_gbl_match_ops[]; + +extern struct acpi_dmtable_info acpi_dm_table_info_asf0[]; +extern struct acpi_dmtable_info acpi_dm_table_info_asf1[]; +extern struct acpi_dmtable_info acpi_dm_table_info_asf2[]; +extern struct acpi_dmtable_info acpi_dm_table_info_asf3[]; +extern struct acpi_dmtable_info acpi_dm_table_info_asf4[]; +extern struct acpi_dmtable_info acpi_dm_table_info_asf_hdr[]; +extern struct acpi_dmtable_info acpi_dm_table_info_boot[]; +extern struct acpi_dmtable_info acpi_dm_table_info_cpep[]; +extern struct acpi_dmtable_info acpi_dm_table_info_cpep0[]; +extern struct acpi_dmtable_info acpi_dm_table_info_dbgp[]; +extern struct acpi_dmtable_info acpi_dm_table_info_ecdt[]; +extern struct acpi_dmtable_info acpi_dm_table_info_facs[]; +extern struct acpi_dmtable_info acpi_dm_table_info_fadt1[]; +extern struct acpi_dmtable_info acpi_dm_table_info_fadt2[]; +extern struct acpi_dmtable_info acpi_dm_table_info_gas[]; +extern struct acpi_dmtable_info acpi_dm_table_info_header[]; +extern struct acpi_dmtable_info acpi_dm_table_info_hpet[]; +extern struct acpi_dmtable_info acpi_dm_table_info_madt[]; +extern struct acpi_dmtable_info acpi_dm_table_info_madt0[]; +extern struct acpi_dmtable_info acpi_dm_table_info_madt1[]; +extern struct acpi_dmtable_info acpi_dm_table_info_madt2[]; +extern struct acpi_dmtable_info acpi_dm_table_info_madt3[]; +extern struct acpi_dmtable_info acpi_dm_table_info_madt4[]; +extern struct acpi_dmtable_info acpi_dm_table_info_madt5[]; +extern struct acpi_dmtable_info acpi_dm_table_info_madt6[]; +extern struct acpi_dmtable_info acpi_dm_table_info_madt7[]; +extern struct acpi_dmtable_info acpi_dm_table_info_madt8[]; +extern struct acpi_dmtable_info acpi_dm_table_info_madt_hdr[]; +extern struct acpi_dmtable_info acpi_dm_table_info_mcfg[]; +extern struct acpi_dmtable_info acpi_dm_table_info_mcfg0[]; +extern struct acpi_dmtable_info acpi_dm_table_info_rsdp1[]; +extern struct acpi_dmtable_info acpi_dm_table_info_rsdp2[]; +extern struct acpi_dmtable_info acpi_dm_table_info_sbst[]; +extern struct acpi_dmtable_info acpi_dm_table_info_slit[]; +extern struct acpi_dmtable_info acpi_dm_table_info_spcr[]; +extern struct acpi_dmtable_info acpi_dm_table_info_spmi[]; +extern struct acpi_dmtable_info acpi_dm_table_info_srat[]; +extern struct acpi_dmtable_info acpi_dm_table_info_srat0[]; +extern struct acpi_dmtable_info acpi_dm_table_info_srat1[]; +extern struct acpi_dmtable_info acpi_dm_table_info_tcpa[]; +extern struct acpi_dmtable_info acpi_dm_table_info_wdrt[]; + +/* + * dmtable + */ +void acpi_dm_dump_data_table(struct acpi_table_header *table); + +void +acpi_dm_dump_table(u32 table_length, + u32 table_offset, + void *table, + u32 sub_table_length, struct acpi_dmtable_info *info); + +void acpi_dm_line_header(u32 offset, u32 byte_length, char *name); + +void acpi_dm_line_header2(u32 offset, u32 byte_length, char *name, u32 value); + +/* + * dmtbdump + */ +void acpi_dm_dump_asf(struct acpi_table_header *table); + +void acpi_dm_dump_cpep(struct acpi_table_header *table); + +void acpi_dm_dump_fadt(struct acpi_table_header *table); + +void acpi_dm_dump_srat(struct acpi_table_header *table); + +void acpi_dm_dump_mcfg(struct acpi_table_header *table); + +void acpi_dm_dump_madt(struct acpi_table_header *table); + +u32 acpi_dm_dump_rsdp(struct acpi_table_header *table); + +void acpi_dm_dump_rsdt(struct acpi_table_header *table); + +void acpi_dm_dump_slit(struct acpi_table_header *table); + +void acpi_dm_dump_xsdt(struct acpi_table_header *table); + /* * dmwalk */ @@ -84,6 +224,11 @@ void acpi_dm_disassemble(struct acpi_walk_state *walk_state, union acpi_parse_object *origin, u32 num_opcodes); +void +acpi_dm_walk_parse_tree(union acpi_parse_object *op, + asl_walk_callback descending_callback, + asl_walk_callback ascending_callback, void *context); + /* * dmopcode */ @@ -166,6 +311,7 @@ void acpi_dm_dump_integer64(u64 value, char *name); void acpi_dm_resource_template(struct acpi_op_walk_info *info, + union acpi_parse_object *op, u8 * byte_data, u32 byte_count); u8 acpi_dm_is_resource_template(union acpi_parse_object *op); @@ -176,6 +322,8 @@ void acpi_dm_bit_list(u16 mask); void acpi_dm_decode_attribute(u8 attribute); +void acpi_dm_descriptor_name(void); + /* * dmresrcl */ @@ -248,6 +396,15 @@ acpi_dm_vendor_small_descriptor(union aml_resource *resource, /* * dmutils */ -void acpi_dm_add_to_external_list(char *path); +void acpi_dm_add_to_external_list(char *path, u8 type, u32 value); + +/* + * dmrestag + */ +void acpi_dm_find_resources(union acpi_parse_object *root); + +void +acpi_dm_check_resource_reference(union acpi_parse_object *op, + struct acpi_walk_state *walk_state); #endif /* __ACDISASM_H__ */ diff --git a/include/acpi/acdispat.h b/include/acpi/acdispat.h index c41a926ff..a22fe9cf8 100644 --- a/include/acpi/acdispat.h +++ b/include/acpi/acdispat.h @@ -194,12 +194,14 @@ acpi_status acpi_ds_restart_control_method(struct acpi_walk_state *walk_state, union acpi_operand_object *return_desc); -void acpi_ds_terminate_control_method(struct acpi_walk_state *walk_state); +void +acpi_ds_terminate_control_method(union acpi_operand_object *method_desc, + struct acpi_walk_state *walk_state); acpi_status acpi_ds_begin_method_execution(struct acpi_namespace_node *method_node, union acpi_operand_object *obj_desc, - struct acpi_namespace_node *calling_method_node); + struct acpi_walk_state *walk_state); acpi_status acpi_ds_method_error(acpi_status status, struct acpi_walk_state *walk_state); @@ -302,7 +304,7 @@ acpi_ds_init_aml_walk(struct acpi_walk_state *walk_state, struct acpi_namespace_node *method_node, u8 * aml_start, u32 aml_length, - struct acpi_parameter_info *info, u8 pass_number); + struct acpi_evaluate_info *info, u8 pass_number); acpi_status acpi_ds_obj_stack_pop_and_delete(u32 pop_count, diff --git a/include/acpi/acevents.h b/include/acpi/acevents.h index f2717be4f..234142828 100644 --- a/include/acpi/acevents.h +++ b/include/acpi/acevents.h @@ -93,7 +93,7 @@ struct acpi_gpe_event_info *acpi_ev_get_gpe_event_info(acpi_handle gpe_device, */ u8 acpi_ev_valid_gpe_event(struct acpi_gpe_event_info *gpe_event_info); -acpi_status acpi_ev_walk_gpe_list(ACPI_GPE_CALLBACK gpe_walk_callback); +acpi_status acpi_ev_walk_gpe_list(acpi_gpe_callback gpe_walk_callback); acpi_status acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info, @@ -138,7 +138,7 @@ acpi_status acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj, u32 function, acpi_physical_address address, - u32 bit_width, void *value); + u32 bit_width, acpi_integer * value); acpi_status acpi_ev_attach_region(union acpi_operand_object *handler_obj, diff --git a/include/acpi/acexcep.h b/include/acpi/acexcep.h index dc768aa58..797ca1ea5 100644 --- a/include/acpi/acexcep.h +++ b/include/acpi/acexcep.h @@ -160,8 +160,9 @@ #define AE_AML_BAD_RESOURCE_VALUE (acpi_status) (0x001F | AE_CODE_AML) #define AE_AML_CIRCULAR_REFERENCE (acpi_status) (0x0020 | AE_CODE_AML) #define AE_AML_BAD_RESOURCE_LENGTH (acpi_status) (0x0021 | AE_CODE_AML) +#define AE_AML_ILLEGAL_ADDRESS (acpi_status) (0x0022 | AE_CODE_AML) -#define AE_CODE_AML_MAX 0x0021 +#define AE_CODE_AML_MAX 0x0022 /* * Internal exceptions used for control @@ -275,7 +276,8 @@ char const *acpi_gbl_exception_names_aml[] = { "AE_AML_NO_RESOURCE_END_TAG", "AE_AML_BAD_RESOURCE_VALUE", "AE_AML_CIRCULAR_REFERENCE", - "AE_AML_BAD_RESOURCE_LENGTH" + "AE_AML_BAD_RESOURCE_LENGTH", + "AE_AML_ILLEGAL_ADDRESS" }; char const *acpi_gbl_exception_names_ctrl[] = { diff --git a/include/acpi/acglobal.h b/include/acpi/acglobal.h index 734cc77bf..06972e663 100644 --- a/include/acpi/acglobal.h +++ b/include/acpi/acglobal.h @@ -107,6 +107,7 @@ ACPI_EXTERN u32 acpi_gbl_trace_flags; * 3) Allow access to uninitialized locals/args (auto-init to integer 0) * 4) Allow ANY object type to be a source operand for the Store() operator * 5) Allow unresolved references (invalid target name) in package objects + * 6) Enable warning messages for behavior that is not ACPI spec compliant */ ACPI_EXTERN u8 ACPI_INIT_GLOBAL(acpi_gbl_enable_interpreter_slack, FALSE); @@ -114,7 +115,7 @@ ACPI_EXTERN u8 ACPI_INIT_GLOBAL(acpi_gbl_enable_interpreter_slack, FALSE); * Automatically serialize ALL control methods? Default is FALSE, meaning * to use the Serialized/not_serialized method flags on a per method basis. * Only change this if the ASL code is poorly written and cannot handle - * reentrancy even though methods are marked "not_serialized". + * reentrancy even though methods are marked "NotSerialized". */ ACPI_EXTERN u8 ACPI_INIT_GLOBAL(acpi_gbl_all_methods_serialized, FALSE); @@ -149,10 +150,10 @@ ACPI_EXTERN u8 ACPI_INIT_GLOBAL(acpi_gbl_leave_wake_gpes_disabled, TRUE); ACPI_EXTERN u32 acpi_gbl_table_flags; ACPI_EXTERN u32 acpi_gbl_rsdt_table_count; ACPI_EXTERN struct rsdp_descriptor *acpi_gbl_RSDP; -ACPI_EXTERN XSDT_DESCRIPTOR *acpi_gbl_XSDT; -ACPI_EXTERN FADT_DESCRIPTOR *acpi_gbl_FADT; +ACPI_EXTERN struct xsdt_descriptor *acpi_gbl_XSDT; +ACPI_EXTERN struct fadt_descriptor *acpi_gbl_FADT; ACPI_EXTERN struct acpi_table_header *acpi_gbl_DSDT; -ACPI_EXTERN FACS_DESCRIPTOR *acpi_gbl_FACS; +ACPI_EXTERN struct facs_descriptor *acpi_gbl_FACS; ACPI_EXTERN struct acpi_common_facs acpi_gbl_common_fACS; /* * Since there may be multiple SSDTs and PSDTs, a single pointer is not @@ -177,15 +178,35 @@ ACPI_EXTERN u8 acpi_gbl_integer_nybble_width; /* * ACPI Table info arrays */ -extern struct acpi_table_list acpi_gbl_table_lists[NUM_ACPI_TABLE_TYPES]; -extern struct acpi_table_support acpi_gbl_table_data[NUM_ACPI_TABLE_TYPES]; +extern struct acpi_table_list acpi_gbl_table_lists[ACPI_TABLE_ID_MAX + 1]; +extern struct acpi_table_support acpi_gbl_table_data[ACPI_TABLE_ID_MAX + 1]; + +/***************************************************************************** + * + * Mutual exlusion within ACPICA subsystem + * + ****************************************************************************/ /* * Predefined mutex objects. This array contains the * actual OS mutex handles, indexed by the local ACPI_MUTEX_HANDLEs. * (The table maps local handles to the real OS handles) */ -ACPI_EXTERN struct acpi_mutex_info acpi_gbl_mutex_info[NUM_MUTEX]; +ACPI_EXTERN struct acpi_mutex_info acpi_gbl_mutex_info[ACPI_NUM_MUTEX]; + +/* + * Global lock semaphore works in conjunction with the actual HW global lock + */ +ACPI_EXTERN acpi_semaphore acpi_gbl_global_lock_semaphore; + +/* + * Spinlocks are used for interfaces that can be possibly called at + * interrupt level + */ +ACPI_EXTERN spinlock_t _acpi_gbl_gpe_lock; /* For GPE data structs and registers */ +ACPI_EXTERN spinlock_t _acpi_gbl_hardware_lock; /* For ACPI H/W except GPE registers */ +#define acpi_gbl_gpe_lock &_acpi_gbl_gpe_lock +#define acpi_gbl_hardware_lock &_acpi_gbl_hardware_lock /***************************************************************************** * @@ -203,6 +224,7 @@ ACPI_EXTERN struct acpi_memory_list *acpi_gbl_ns_node_list; /* Object caches */ +ACPI_EXTERN acpi_cache_t *acpi_gbl_namespace_cache; ACPI_EXTERN acpi_cache_t *acpi_gbl_state_cache; ACPI_EXTERN acpi_cache_t *acpi_gbl_ps_node_cache; ACPI_EXTERN acpi_cache_t *acpi_gbl_ps_node_ext_cache; @@ -215,7 +237,6 @@ ACPI_EXTERN struct acpi_object_notify_handler acpi_gbl_system_notify; ACPI_EXTERN acpi_exception_handler acpi_gbl_exception_handler; ACPI_EXTERN acpi_init_handler acpi_gbl_init_handler; ACPI_EXTERN struct acpi_walk_state *acpi_gbl_breakpoint_walk; -ACPI_EXTERN acpi_handle acpi_gbl_global_lock_semaphore; /* Misc */ @@ -244,7 +265,6 @@ extern const char *acpi_gbl_sleep_state_names[ACPI_S_STATE_COUNT]; extern const char *acpi_gbl_highest_dstate_names[4]; extern const struct acpi_opcode_info acpi_gbl_aml_op_info[AML_NUM_OPCODES]; extern const char *acpi_gbl_region_types[ACPI_NUM_PREDEFINED_REGIONS]; -extern const char *acpi_gbl_valid_osi_strings[ACPI_NUM_OSI_STRINGS]; /***************************************************************************** * @@ -289,14 +309,6 @@ ACPI_EXTERN struct acpi_thread_state *acpi_gbl_current_walk_list; ACPI_EXTERN u8 acpi_gbl_cm_single_step; -/***************************************************************************** - * - * Parser globals - * - ****************************************************************************/ - -ACPI_EXTERN union acpi_parse_object *acpi_gbl_parsed_namespace_root; - /***************************************************************************** * * Hardware globals @@ -321,7 +333,6 @@ ACPI_EXTERN struct acpi_fixed_event_handler ACPI_EXTERN struct acpi_gpe_xrupt_info *acpi_gbl_gpe_xrupt_list_head; ACPI_EXTERN struct acpi_gpe_block_info *acpi_gbl_gpe_fadt_blocks[ACPI_MAX_GPE_BLOCKS]; -ACPI_EXTERN acpi_handle acpi_gbl_gpe_lock; /***************************************************************************** * diff --git a/include/acpi/acinterp.h b/include/acpi/acinterp.h index 9f22cfcb6..91586d0d5 100644 --- a/include/acpi/acinterp.h +++ b/include/acpi/acinterp.h @@ -53,10 +53,14 @@ #define ACPI_EXD_TABLE_SIZE(name) (sizeof(name) / sizeof (struct acpi_exdump_info)) /* - * If possible, pack the following structure to byte alignment, since we - * don't care about performance for debug output + * If possible, pack the following structures to byte alignment, since we + * don't care about performance for debug output. Two cases where we cannot + * pack the structures: + * + * 1) Hardware does not support misaligned memory transfers + * 2) Compiler does not support pointers within packed structures */ -#ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED +#if (!defined(ACPI_MISALIGNMENT_NOT_SUPPORTED) && !defined(ACPI_PACKED_POINTERS_NOT_SUPPORTED)) #pragma pack(1) #endif @@ -287,7 +291,10 @@ acpi_ex_system_wait_event(union acpi_operand_object *time, acpi_status acpi_ex_system_reset_event(union acpi_operand_object *obj_desc); -acpi_status acpi_ex_system_wait_semaphore(acpi_handle semaphore, u16 timeout); +acpi_status +acpi_ex_system_wait_semaphore(acpi_semaphore semaphore, u16 timeout); + +acpi_status acpi_ex_system_wait_mutex(acpi_mutex mutex, u16 timeout); /* * exoparg1 - ACPI AML execution, 1 operand diff --git a/include/acpi/aclocal.h b/include/acpi/aclocal.h index 8361820d2..a4d0e73d5 100644 --- a/include/acpi/aclocal.h +++ b/include/acpi/aclocal.h @@ -44,10 +44,14 @@ #ifndef __ACLOCAL_H__ #define __ACLOCAL_H__ +/* acpisrc:struct_defs -- for acpisrc conversion */ + #define ACPI_WAIT_FOREVER 0xFFFF /* u16, as per ACPI spec */ +#define ACPI_DO_NOT_WAIT 0 +#define ACPI_SERIALIZED 0xFF -typedef void *acpi_mutex; typedef u32 acpi_mutex_handle; +#define ACPI_GLOBAL_LOCK (acpi_semaphore) (-1) /* Total number of aml opcodes defined */ @@ -69,52 +73,53 @@ union acpi_parse_object; * Predefined handles for the mutex objects used within the subsystem * All mutex objects are automatically created by acpi_ut_mutex_initialize. * - * The acquire/release ordering protocol is implied via this list. Mutexes + * The acquire/release ordering protocol is implied via this list. Mutexes * with a lower value must be acquired before mutexes with a higher value. * - * NOTE: any changes here must be reflected in the acpi_gbl_mutex_names table also! + * NOTE: any changes here must be reflected in the acpi_gbl_mutex_names + * table below also! */ -#define ACPI_MTX_EXECUTE 0 -#define ACPI_MTX_INTERPRETER 1 -#define ACPI_MTX_PARSER 2 -#define ACPI_MTX_DISPATCHER 3 -#define ACPI_MTX_TABLES 4 -#define ACPI_MTX_OP_REGIONS 5 -#define ACPI_MTX_NAMESPACE 6 -#define ACPI_MTX_EVENTS 7 -#define ACPI_MTX_HARDWARE 8 -#define ACPI_MTX_CACHES 9 -#define ACPI_MTX_MEMORY 10 -#define ACPI_MTX_DEBUG_CMD_COMPLETE 11 -#define ACPI_MTX_DEBUG_CMD_READY 12 - -#define MAX_MUTEX 12 -#define NUM_MUTEX MAX_MUTEX+1 +#define ACPI_MTX_INTERPRETER 0 /* AML Interpreter, main lock */ +#define ACPI_MTX_TABLES 1 /* Data for ACPI tables */ +#define ACPI_MTX_NAMESPACE 2 /* ACPI Namespace */ +#define ACPI_MTX_EVENTS 3 /* Data for ACPI events */ +#define ACPI_MTX_CACHES 4 /* Internal caches, general purposes */ +#define ACPI_MTX_MEMORY 5 /* Debug memory tracking lists */ +#define ACPI_MTX_DEBUG_CMD_COMPLETE 6 /* AML debugger */ +#define ACPI_MTX_DEBUG_CMD_READY 7 /* AML debugger */ + +#define ACPI_MAX_MUTEX 7 +#define ACPI_NUM_MUTEX ACPI_MAX_MUTEX+1 #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) #ifdef DEFINE_ACPI_GLOBALS -/* Names for the mutexes used in the subsystem */ +/* Debug names for the mutexes above */ -static char *acpi_gbl_mutex_names[] = { - "ACPI_MTX_Execute", +static char *acpi_gbl_mutex_names[ACPI_NUM_MUTEX] = { "ACPI_MTX_Interpreter", - "ACPI_MTX_Parser", - "ACPI_MTX_Dispatcher", "ACPI_MTX_Tables", - "ACPI_MTX_op_regions", "ACPI_MTX_Namespace", "ACPI_MTX_Events", - "ACPI_MTX_Hardware", "ACPI_MTX_Caches", "ACPI_MTX_Memory", - "ACPI_MTX_debug_cmd_complete", - "ACPI_MTX_debug_cmd_ready", + "ACPI_MTX_CommandComplete", + "ACPI_MTX_CommandReady" }; #endif #endif +/* + * Predefined handles for spinlocks used within the subsystem. + * These spinlocks are created by acpi_ut_mutex_initialize + */ +#define ACPI_LOCK_GPES 0 +#define ACPI_LOCK_HARDWARE 1 + +#define ACPI_MAX_LOCK 1 +#define ACPI_NUM_LOCK ACPI_MAX_LOCK+1 + /* Owner IDs are used to track namespace nodes for selective deletion */ typedef u8 acpi_owner_id; @@ -122,14 +127,14 @@ typedef u8 acpi_owner_id; /* This Thread ID means that the mutex is not in use (unlocked) */ -#define ACPI_MUTEX_NOT_ACQUIRED (u32) -1 +#define ACPI_MUTEX_NOT_ACQUIRED (acpi_thread_id) 0 /* Table for the global mutexes */ struct acpi_mutex_info { acpi_mutex mutex; u32 use_count; - u32 thread_id; + acpi_thread_id thread_id; }; /* Lock flag parameter for various interfaces */ @@ -144,6 +149,8 @@ struct acpi_mutex_info { #define ACPI_FIELD_DWORD_GRANULARITY 4 #define ACPI_FIELD_QWORD_GRANULARITY 8 +#define ACPI_ENTRY_NOT_FOUND NULL + /***************************************************************************** * * Namespace typedefs and structs @@ -158,49 +165,55 @@ typedef enum { ACPI_IMODE_EXECUTE = 0x0E } acpi_interpreter_mode; -/* - * The Node describes a named object that appears in the AML - * An acpi_node is used to store Nodes. - * - * data_type is used to differentiate between internal descriptors, and MUST - * be the first byte in this structure. - */ union acpi_name_union { u32 integer; char ascii[4]; }; +/* + * The Namespace Node describes a named object that appears in the AML. + * descriptor_type is used to differentiate between internal descriptors. + * + * The node is optimized for both 32-bit and 64-bit platforms: + * 20 bytes for the 32-bit case, 32 bytes for the 64-bit case. + * + * Note: The descriptor_type and Type fields must appear in the identical + * position in both the struct acpi_namespace_node and union acpi_operand_object + * structures. + */ struct acpi_namespace_node { - u8 descriptor; /* Used to differentiate object descriptor types */ - u8 type; /* Type associated with this name */ - u16 reference_count; /* Current count of references and children */ + union acpi_operand_object *object; /* Interpreter object */ + u8 descriptor_type; /* Differentiate object descriptor types */ + u8 type; /* ACPI Type associated with this name */ + u8 flags; /* Miscellaneous flags */ + acpi_owner_id owner_id; /* Node creator */ union acpi_name_union name; /* ACPI Name, always 4 chars per ACPI spec */ - union acpi_operand_object *object; /* Pointer to attached ACPI object (optional) */ struct acpi_namespace_node *child; /* First child */ - struct acpi_namespace_node *peer; /* Next peer */ - u8 owner_id; /* Who created this node */ - u8 flags; - - /* Fields used by the ASL compiler only */ + struct acpi_namespace_node *peer; /* Peer. Parent if ANOBJ_END_OF_PEER_LIST set */ -#ifdef ACPI_ASL_COMPILER - u32 value; + /* + * The following fields are used by the ASL compiler and disassembler only + */ +#ifdef ACPI_LARGE_NAMESPACE_NODE union acpi_parse_object *op; + u32 value; + u32 length; #endif }; -#define ACPI_ENTRY_NOT_FOUND NULL +/* Namespace Node flags */ -/* Node flags */ +#define ANOBJ_END_OF_PEER_LIST 0x01 /* End-of-list, Peer field points to parent */ +#define ANOBJ_RESERVED 0x02 /* Available for future use */ +#define ANOBJ_METHOD_ARG 0x04 /* Node is a method argument */ +#define ANOBJ_METHOD_LOCAL 0x08 /* Node is a method local */ +#define ANOBJ_SUBTREE_HAS_INI 0x10 /* Used to optimize device initialization */ -#define ANOBJ_RESERVED 0x01 -#define ANOBJ_END_OF_PEER_LIST 0x02 -#define ANOBJ_DATA_WIDTH_32 0x04 /* Parent table is 64-bits */ -#define ANOBJ_METHOD_ARG 0x08 -#define ANOBJ_METHOD_LOCAL 0x10 -#define ANOBJ_METHOD_NO_RETVAL 0x20 -#define ANOBJ_METHOD_SOME_NO_RETVAL 0x40 -#define ANOBJ_IS_BIT_OFFSET 0x80 +#define ANOBJ_IS_EXTERNAL 0x08 /* i_aSL only: This object created via External() */ +#define ANOBJ_METHOD_NO_RETVAL 0x10 /* i_aSL only: Method has no return value */ +#define ANOBJ_METHOD_SOME_NO_RETVAL 0x20 /* i_aSL only: Method has at least one return value */ +#define ANOBJ_IS_BIT_OFFSET 0x40 /* i_aSL only: Reference is a bit offset */ +#define ANOBJ_IS_REFERENCED 0x80 /* i_aSL only: Object was referenced */ /* * ACPI Table Descriptor. One per ACPI table @@ -212,8 +225,8 @@ struct acpi_table_desc { struct acpi_table_header *pointer; u8 *aml_start; u64 physical_address; - u32 aml_length; acpi_size length; + u32 aml_length; acpi_owner_id owner_id; u8 type; u8 allocation; @@ -276,6 +289,9 @@ struct acpi_create_field_info { u8 field_type; }; +typedef +acpi_status(*ACPI_INTERNAL_METHOD) (struct acpi_walk_state * walk_state); + /* * Bitmapped ACPI types. Used internally only */ @@ -377,7 +393,7 @@ struct acpi_gpe_walk_info { struct acpi_gpe_block_info *gpe_block; }; -typedef acpi_status(*ACPI_GPE_CALLBACK) (struct acpi_gpe_xrupt_info * +typedef acpi_status(*acpi_gpe_callback) (struct acpi_gpe_xrupt_info * gpe_xrupt_info, struct acpi_gpe_block_info * gpe_block); @@ -416,13 +432,14 @@ struct acpi_field_info { #define ACPI_CONTROL_PREDICATE_FALSE 0xC3 #define ACPI_CONTROL_PREDICATE_TRUE 0xC4 -#define ACPI_STATE_COMMON /* Two 32-bit fields and a pointer */\ - u8 data_type; /* To differentiate various internal objs */\ - u8 flags; \ - u16 value; \ - u16 state; \ - u16 reserved; \ - void *next; +#define ACPI_STATE_COMMON \ + void *next; \ + u8 descriptor_type; /* To differentiate various internal objs */\ + u8 flags; \ + u16 value; \ + u16 state; + + /* There are 2 bytes available here until the next natural alignment boundary */ struct acpi_common_state { ACPI_STATE_COMMON}; @@ -438,12 +455,12 @@ struct acpi_update_state { * Pkg state - used to traverse nested package structures */ struct acpi_pkg_state { - ACPI_STATE_COMMON union acpi_operand_object *source_object; + ACPI_STATE_COMMON u16 index; + union acpi_operand_object *source_object; union acpi_operand_object *dest_object; struct acpi_walk_state *walk_state; void *this_target_obj; u32 num_packages; - u16 index; }; /* @@ -451,10 +468,10 @@ struct acpi_pkg_state { * Allows nesting of these constructs */ struct acpi_control_state { - ACPI_STATE_COMMON union acpi_parse_object *predicate_op; + ACPI_STATE_COMMON u16 opcode; + union acpi_parse_object *predicate_op; u8 *aml_predicate_start; /* Start of if/while predicate */ u8 *package_end; /* End of if/while block */ - u16 opcode; }; /* @@ -465,11 +482,11 @@ struct acpi_scope_state { }; struct acpi_pscope_state { - ACPI_STATE_COMMON union acpi_parse_object *op; /* Current op being parsed */ + ACPI_STATE_COMMON u32 arg_count; /* Number of fixed arguments */ + union acpi_parse_object *op; /* Current op being parsed */ u8 *arg_end; /* Current argument end */ u8 *pkg_end; /* Current package end */ u32 arg_list; /* Next argument to parse */ - u32 arg_count; /* Number of fixed arguments */ }; /* @@ -477,10 +494,10 @@ struct acpi_pscope_state { * states are created when there are nested control methods executing. */ struct acpi_thread_state { - ACPI_STATE_COMMON struct acpi_walk_state *walk_state_list; /* Head of list of walk_states for this thread */ + ACPI_STATE_COMMON u8 current_sync_level; /* Mutex Sync (nested acquire) level */ + struct acpi_walk_state *walk_state_list; /* Head of list of walk_states for this thread */ union acpi_operand_object *acquired_mutex_list; /* List of all currently acquired mutexes */ - u32 thread_id; /* Running thread ID */ - u8 current_sync_level; /* Mutex Sync (nested acquire) level */ + acpi_thread_id thread_id; /* Running thread ID */ }; /* @@ -488,10 +505,9 @@ struct acpi_thread_state { * AML arguments */ struct acpi_result_values { - ACPI_STATE_COMMON - union acpi_operand_object *obj_desc[ACPI_OBJ_NUM_OPERANDS]; - u8 num_results; + ACPI_STATE_COMMON u8 num_results; u8 last_insert; + union acpi_operand_object *obj_desc[ACPI_OBJ_NUM_OPERANDS]; }; typedef @@ -546,7 +562,7 @@ struct acpi_opcode_info { #endif u32 parse_args; /* Grammar/Parse time arguments */ u32 runtime_args; /* Interpret time arguments */ - u32 flags; /* Misc flags */ + u16 flags; /* Misc flags */ u8 object_type; /* Corresponding internal object type */ u8 class; /* Opcode class */ u8 type; /* Opcode type */ @@ -563,29 +579,31 @@ union acpi_parse_value { }; #define ACPI_PARSE_COMMON \ - u8 data_type; /* To differentiate various internal objs */\ - u8 flags; /* Type of Op */\ - u16 aml_opcode; /* AML opcode */\ - u32 aml_offset; /* Offset of declaration in AML */\ - union acpi_parse_object *parent; /* Parent op */\ - union acpi_parse_object *next; /* Next op */\ + union acpi_parse_object *parent; /* Parent op */\ + u8 descriptor_type; /* To differentiate various internal objs */\ + u8 flags; /* Type of Op */\ + u16 aml_opcode; /* AML opcode */\ + u32 aml_offset; /* Offset of declaration in AML */\ + union acpi_parse_object *next; /* Next op */\ + struct acpi_namespace_node *node; /* For use by interpreter */\ + union acpi_parse_value value; /* Value or args associated with the opcode */\ ACPI_DISASM_ONLY_MEMBERS (\ - u8 disasm_flags; /* Used during AML disassembly */\ - u8 disasm_opcode; /* Subtype used for disassembly */\ - char aml_op_name[16]) /* Op name (debug only) */\ - /* NON-DEBUG members below: */\ - struct acpi_namespace_node *node; /* For use by interpreter */\ - union acpi_parse_value value; /* Value or args associated with the opcode */ - -#define ACPI_DASM_BUFFER 0x00 -#define ACPI_DASM_RESOURCE 0x01 -#define ACPI_DASM_STRING 0x02 -#define ACPI_DASM_UNICODE 0x03 -#define ACPI_DASM_EISAID 0x04 -#define ACPI_DASM_MATCHOP 0x05 + u8 disasm_flags; /* Used during AML disassembly */\ + u8 disasm_opcode; /* Subtype used for disassembly */\ + char aml_op_name[16]) /* Op name (debug only) */ + +#define ACPI_DASM_BUFFER 0x00 +#define ACPI_DASM_RESOURCE 0x01 +#define ACPI_DASM_STRING 0x02 +#define ACPI_DASM_UNICODE 0x03 +#define ACPI_DASM_EISAID 0x04 +#define ACPI_DASM_MATCHOP 0x05 +#define ACPI_DASM_LNOT_PREFIX 0x06 +#define ACPI_DASM_LNOT_SUFFIX 0x07 +#define ACPI_DASM_IGNORE 0x08 /* - * generic operation (for example: If, While, Store) + * Generic operation (for example: If, While, Store) */ struct acpi_parse_obj_common { ACPI_PARSE_COMMON}; @@ -601,7 +619,7 @@ struct acpi_parse_obj_named { u32 name; /* 4-byte name or zero if no name */ }; -/* The parse node is the fundamental element of the parse tree */ +/* This version is used by the i_aSL compiler only */ #define ACPI_MAX_PARSEOP_NAME 20 @@ -643,7 +661,6 @@ union acpi_parse_object { * method. */ struct acpi_parse_state { - u32 aml_size; u8 *aml_start; /* First AML byte */ u8 *aml; /* Next AML byte */ u8 *aml_end; /* (last + 1) AML byte */ @@ -653,22 +670,23 @@ struct acpi_parse_state { struct acpi_namespace_node *start_node; union acpi_generic_state *scope; /* Current scope */ union acpi_parse_object *start_scope; + u32 aml_size; }; /* Parse object flags */ -#define ACPI_PARSEOP_GENERIC 0x01 -#define ACPI_PARSEOP_NAMED 0x02 -#define ACPI_PARSEOP_DEFERRED 0x04 -#define ACPI_PARSEOP_BYTELIST 0x08 -#define ACPI_PARSEOP_IN_CACHE 0x80 +#define ACPI_PARSEOP_GENERIC 0x01 +#define ACPI_PARSEOP_NAMED 0x02 +#define ACPI_PARSEOP_DEFERRED 0x04 +#define ACPI_PARSEOP_BYTELIST 0x08 +#define ACPI_PARSEOP_IN_CACHE 0x80 /* Parse object disasm_flags */ -#define ACPI_PARSEOP_IGNORE 0x01 -#define ACPI_PARSEOP_PARAMLIST 0x02 -#define ACPI_PARSEOP_EMPTY_TERMLIST 0x04 -#define ACPI_PARSEOP_SPECIAL 0x10 +#define ACPI_PARSEOP_IGNORE 0x01 +#define ACPI_PARSEOP_PARAMLIST 0x02 +#define ACPI_PARSEOP_EMPTY_TERMLIST 0x04 +#define ACPI_PARSEOP_SPECIAL 0x10 /***************************************************************************** * @@ -676,8 +694,8 @@ struct acpi_parse_state { * ****************************************************************************/ -#define PCI_ROOT_HID_STRING "PNP0A03" -#define PCI_EXPRESS_ROOT_HID_STRING "PNP0A08" +#define PCI_ROOT_HID_STRING "PNP0A03" +#define PCI_EXPRESS_ROOT_HID_STRING "PNP0A08" struct acpi_bit_register_info { u8 parent_register; @@ -685,6 +703,13 @@ struct acpi_bit_register_info { u16 access_bit_mask; }; +/* + * Some ACPI registers have bits that must be ignored -- meaning that they + * must be preserved. + */ +#define ACPI_PM1_STATUS_PRESERVED_BITS 0x0800 /* Bit 11 */ +#define ACPI_PM1_CONTROL_PRESERVED_BITS 0x0201 /* Bit 9, Bit 0 (SCI_EN) */ + /* * Register IDs * These are the full ACPI registers @@ -710,13 +735,14 @@ struct acpi_bit_register_info { #define ACPI_BITMASK_PCIEXP_WAKE_STATUS 0x4000 /* ACPI 3.0 */ #define ACPI_BITMASK_WAKE_STATUS 0x8000 -#define ACPI_BITMASK_ALL_FIXED_STATUS (ACPI_BITMASK_TIMER_STATUS | \ - ACPI_BITMASK_BUS_MASTER_STATUS | \ - ACPI_BITMASK_GLOBAL_LOCK_STATUS | \ - ACPI_BITMASK_POWER_BUTTON_STATUS | \ - ACPI_BITMASK_SLEEP_BUTTON_STATUS | \ - ACPI_BITMASK_RT_CLOCK_STATUS | \ - ACPI_BITMASK_WAKE_STATUS) +#define ACPI_BITMASK_ALL_FIXED_STATUS (\ + ACPI_BITMASK_TIMER_STATUS | \ + ACPI_BITMASK_BUS_MASTER_STATUS | \ + ACPI_BITMASK_GLOBAL_LOCK_STATUS | \ + ACPI_BITMASK_POWER_BUTTON_STATUS | \ + ACPI_BITMASK_SLEEP_BUTTON_STATUS | \ + ACPI_BITMASK_RT_CLOCK_STATUS | \ + ACPI_BITMASK_WAKE_STATUS) #define ACPI_BITMASK_TIMER_ENABLE 0x0001 #define ACPI_BITMASK_GLOBAL_LOCK_ENABLE 0x0020 @@ -820,7 +846,7 @@ struct acpi_bit_register_info { * ****************************************************************************/ -#define ACPI_ASCII_ZERO 0x30 +#define ACPI_ASCII_ZERO 0x30 /***************************************************************************** * @@ -842,9 +868,9 @@ struct acpi_integrity_info { u32 objects; }; -#define ACPI_DB_REDIRECTABLE_OUTPUT 0x01 -#define ACPI_DB_CONSOLE_OUTPUT 0x02 -#define ACPI_DB_DUPLICATE_OUTPUT 0x03 +#define ACPI_DB_REDIRECTABLE_OUTPUT 0x01 +#define ACPI_DB_CONSOLE_OUTPUT 0x02 +#define ACPI_DB_DUPLICATE_OUTPUT 0x03 /***************************************************************************** * @@ -854,18 +880,18 @@ struct acpi_integrity_info { /* Entry for a memory allocation (debug only) */ -#define ACPI_MEM_MALLOC 0 -#define ACPI_MEM_CALLOC 1 -#define ACPI_MAX_MODULE_NAME 16 +#define ACPI_MEM_MALLOC 0 +#define ACPI_MEM_CALLOC 1 +#define ACPI_MAX_MODULE_NAME 16 #define ACPI_COMMON_DEBUG_MEM_HEADER \ - struct acpi_debug_mem_block *previous; \ - struct acpi_debug_mem_block *next; \ - u32 size; \ - u32 component; \ - u32 line; \ - char module[ACPI_MAX_MODULE_NAME]; \ - u8 alloc_type; + struct acpi_debug_mem_block *previous; \ + struct acpi_debug_mem_block *next; \ + u32 size; \ + u32 component; \ + u32 line; \ + char module[ACPI_MAX_MODULE_NAME]; \ + u8 alloc_type; struct acpi_debug_mem_header { ACPI_COMMON_DEBUG_MEM_HEADER}; diff --git a/include/acpi/acmacros.h b/include/acpi/acmacros.h index f2be2a881..192fa095a 100644 --- a/include/acpi/acmacros.h +++ b/include/acpi/acmacros.h @@ -56,6 +56,10 @@ #define ACPI_CLEAR_BIT(target,bit) ((target) &= ~(bit)) #define ACPI_MIN(a,b) (((a)<(b))?(a):(b)) +/* Size calculation */ + +#define ACPI_ARRAY_LENGTH(x) (sizeof(x) / sizeof((x)[0])) + #if ACPI_MACHINE_WIDTH == 16 /* @@ -99,7 +103,7 @@ * printf() format helpers */ -/* Split 64-bit integer into two 32-bit values. Use with %8.8X%8.8X */ +/* Split 64-bit integer into two 32-bit values. Use with %8.8_x%8.8_x */ #define ACPI_FORMAT_UINT64(i) ACPI_HIDWORD(i),ACPI_LODWORD(i) @@ -130,7 +134,6 @@ #define ACPI_TO_POINTER(i) ACPI_ADD_PTR (void,(void *) NULL,(acpi_native_uint) i) #define ACPI_TO_INTEGER(p) ACPI_PTR_DIFF (p,(void *) NULL) #define ACPI_OFFSET(d,f) (acpi_size) ACPI_PTR_DIFF (&(((d *)0)->f),(void *) NULL) -#define ACPI_FADT_OFFSET(f) ACPI_OFFSET (FADT_DESCRIPTOR, f) #if ACPI_MACHINE_WIDTH == 16 #define ACPI_STORE_POINTER(d,s) ACPI_MOVE_32_TO_32(d,s) @@ -141,6 +144,12 @@ #define ACPI_PTR_TO_PHYSADDR(i) ACPI_TO_INTEGER(i) #endif +#ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED +#define ACPI_COMPARE_NAME(a,b) (*ACPI_CAST_PTR (u32,(a)) == *ACPI_CAST_PTR (u32,(b))) +#else +#define ACPI_COMPARE_NAME(a,b) (!ACPI_STRNCMP (ACPI_CAST_PTR (char,(a)), ACPI_CAST_PTR (char,(b)), ACPI_NAME_SIZE)) +#endif + /* * Macros for moving data around to/from buffers that are possibly unaligned. * If the hardware supports the transfer of unaligned data, just do the store. @@ -341,29 +350,33 @@ /* * Rounding macros (Power of two boundaries only) */ -#define ACPI_ROUND_DOWN(value,boundary) (((acpi_native_uint)(value)) & \ +#define ACPI_ROUND_DOWN(value,boundary) (((acpi_native_uint)(value)) & \ (~(((acpi_native_uint) boundary)-1))) -#define ACPI_ROUND_UP(value,boundary) ((((acpi_native_uint)(value)) + \ +#define ACPI_ROUND_UP(value,boundary) ((((acpi_native_uint)(value)) + \ (((acpi_native_uint) boundary)-1)) & \ (~(((acpi_native_uint) boundary)-1))) -#define ACPI_ROUND_DOWN_TO_32_BITS(a) ACPI_ROUND_DOWN(a,4) -#define ACPI_ROUND_DOWN_TO_64_BITS(a) ACPI_ROUND_DOWN(a,8) -#define ACPI_ROUND_DOWN_TO_NATIVE_WORD(a) ACPI_ROUND_DOWN(a,ALIGNED_ADDRESS_BOUNDARY) +/* Note: sizeof(acpi_native_uint) evaluates to either 2, 4, or 8 */ + +#define ACPI_ROUND_DOWN_TO_32BIT(a) ACPI_ROUND_DOWN(a,4) +#define ACPI_ROUND_DOWN_TO_64BIT(a) ACPI_ROUND_DOWN(a,8) +#define ACPI_ROUND_DOWN_TO_NATIVE_WORD(a) ACPI_ROUND_DOWN(a,sizeof(acpi_native_uint)) -#define ACPI_ROUND_UP_to_32_bITS(a) ACPI_ROUND_UP(a,4) -#define ACPI_ROUND_UP_to_64_bITS(a) ACPI_ROUND_UP(a,8) -#define ACPI_ROUND_UP_TO_NATIVE_WORD(a) ACPI_ROUND_UP(a,ALIGNED_ADDRESS_BOUNDARY) +#define ACPI_ROUND_UP_TO_32BIT(a) ACPI_ROUND_UP(a,4) +#define ACPI_ROUND_UP_TO_64BIT(a) ACPI_ROUND_UP(a,8) +#define ACPI_ROUND_UP_TO_NATIVE_WORD(a) ACPI_ROUND_UP(a,sizeof(acpi_native_uint)) -#define ACPI_ROUND_BITS_UP_TO_BYTES(a) ACPI_DIV_8((a) + 7) -#define ACPI_ROUND_BITS_DOWN_TO_BYTES(a) ACPI_DIV_8((a)) +#define ACPI_ROUND_BITS_UP_TO_BYTES(a) ACPI_DIV_8((a) + 7) +#define ACPI_ROUND_BITS_DOWN_TO_BYTES(a) ACPI_DIV_8((a)) -#define ACPI_ROUND_UP_TO_1K(a) (((a) + 1023) >> 10) +#define ACPI_ROUND_UP_TO_1K(a) (((a) + 1023) >> 10) /* Generic (non-power-of-two) rounding */ -#define ACPI_ROUND_UP_TO(value,boundary) (((value) + ((boundary)-1)) / (boundary)) +#define ACPI_ROUND_UP_TO(value,boundary) (((value) + ((boundary)-1)) / (boundary)) + +#define ACPI_IS_MISALIGNED(value) (((acpi_native_uint)value) & (sizeof(acpi_native_uint)-1)) /* * Bitmask creation @@ -371,16 +384,18 @@ * MASK_BITS_ABOVE creates a mask starting AT the position and above * MASK_BITS_BELOW creates a mask starting one bit BELOW the position */ -#define ACPI_MASK_BITS_ABOVE(position) (~((ACPI_INTEGER_MAX) << ((u32) (position)))) -#define ACPI_MASK_BITS_BELOW(position) ((ACPI_INTEGER_MAX) << ((u32) (position))) +#define ACPI_MASK_BITS_ABOVE(position) (~((ACPI_INTEGER_MAX) << ((u32) (position)))) +#define ACPI_MASK_BITS_BELOW(position) ((ACPI_INTEGER_MAX) << ((u32) (position))) -#define ACPI_IS_OCTAL_DIGIT(d) (((char)(d) >= '0') && ((char)(d) <= '7')) +#define ACPI_IS_OCTAL_DIGIT(d) (((char)(d) >= '0') && ((char)(d) <= '7')) /* Bitfields within ACPI registers */ #define ACPI_REGISTER_PREPARE_BITS(val, pos, mask) ((val << pos) & mask) #define ACPI_REGISTER_INSERT_VALUE(reg, pos, mask, val) reg = (reg & (~(mask))) | ACPI_REGISTER_PREPARE_BITS(val, pos, mask) +#define ACPI_INSERT_BITS(target, mask, source) target = ((target & (~(mask))) | (source & mask)) + /* Generate a UUID */ #define ACPI_INIT_UUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \ @@ -396,8 +411,8 @@ * * The "Descriptor" field is the first field in both structures. */ -#define ACPI_GET_DESCRIPTOR_TYPE(d) (((union acpi_descriptor *)(void *)(d))->descriptor_id) -#define ACPI_SET_DESCRIPTOR_TYPE(d,t) (((union acpi_descriptor *)(void *)(d))->descriptor_id = t) +#define ACPI_GET_DESCRIPTOR_TYPE(d) (((union acpi_descriptor *)(void *)(d))->common.descriptor_type) +#define ACPI_SET_DESCRIPTOR_TYPE(d,t) (((union acpi_descriptor *)(void *)(d))->common.descriptor_type = t) /* Macro to test the object type */ @@ -486,7 +501,6 @@ #define ACPI_ERROR(plist) #define ACPI_ERROR_NAMESPACE(s,e) #define ACPI_ERROR_METHOD(s,n,p,e) - #endif /* @@ -514,12 +528,12 @@ #define ACPI_GET_FUNCTION_NAME _acpi_function_name /* * The Name parameter should be the procedure name as a quoted string. - * This is declared as a local string ("my_function_name") so that it can + * This is declared as a local string ("MyFunctionName") so that it can * be also used by the function exit macros below. * Note: (const char) is used to be compatible with the debug interfaces * and macros such as __FUNCTION__. */ -#define ACPI_FUNCTION_NAME(name) const char *_acpi_function_name = name; +#define ACPI_FUNCTION_NAME(name) const char *_acpi_function_name = #name; #else /* Compiler supports __FUNCTION__ (or equivalent) -- Ignore this macro */ @@ -528,13 +542,13 @@ #endif #define ACPI_FUNCTION_TRACE(a) ACPI_FUNCTION_NAME(a) \ - acpi_ut_trace(ACPI_DEBUG_PARAMETERS) + acpi_ut_trace(ACPI_DEBUG_PARAMETERS) #define ACPI_FUNCTION_TRACE_PTR(a,b) ACPI_FUNCTION_NAME(a) \ - acpi_ut_trace_ptr(ACPI_DEBUG_PARAMETERS,(void *)b) + acpi_ut_trace_ptr(ACPI_DEBUG_PARAMETERS,(void *)b) #define ACPI_FUNCTION_TRACE_U32(a,b) ACPI_FUNCTION_NAME(a) \ - acpi_ut_trace_u32(ACPI_DEBUG_PARAMETERS,(u32)b) + acpi_ut_trace_u32(ACPI_DEBUG_PARAMETERS,(u32)b) #define ACPI_FUNCTION_TRACE_STR(a,b) ACPI_FUNCTION_NAME(a) \ - acpi_ut_trace_str(ACPI_DEBUG_PARAMETERS,(char *)b) + acpi_ut_trace_str(ACPI_DEBUG_PARAMETERS,(char *)b) #define ACPI_FUNCTION_ENTRY() acpi_ut_track_stack_ptr() @@ -543,7 +557,7 @@ * WARNING: These macros include a return statement. This is usually considered * bad form, but having a separate exit macro is very ugly and difficult to maintain. * One of the FUNCTION_TRACE macros above must be used in conjunction with these macros - * so that "_acpi_function_name" is defined. + * so that "_AcpiFunctionName" is defined. * * Note: the DO_WHILE0 macro is used to prevent some compilers from complaining * about these constructs. @@ -654,6 +668,7 @@ #define ACPI_DUMP_STACK_ENTRY(a) #define ACPI_DUMP_OPERANDS(a,b,c,d,e) #define ACPI_DUMP_ENTRY(a,b) +#define ACPI_DUMP_TABLES(a,b) #define ACPI_DUMP_PATHNAME(a,b,c,d) #define ACPI_DUMP_RESOURCE_LIST(a) #define ACPI_DUMP_BUFFER(a,b) @@ -709,19 +724,25 @@ /* Memory allocation */ -#define ACPI_MEM_ALLOCATE(a) acpi_ut_allocate((acpi_size)(a),_COMPONENT,_acpi_module_name,__LINE__) -#define ACPI_MEM_CALLOCATE(a) acpi_ut_callocate((acpi_size)(a), _COMPONENT,_acpi_module_name,__LINE__) -#define ACPI_MEM_FREE(a) acpi_os_free(a) +#ifndef ACPI_ALLOCATE +#define ACPI_ALLOCATE(a) acpi_ut_allocate((acpi_size)(a),_COMPONENT,_acpi_module_name,__LINE__) +#endif +#ifndef ACPI_ALLOCATE_ZEROED +#define ACPI_ALLOCATE_ZEROED(a) acpi_ut_allocate_zeroed((acpi_size)(a), _COMPONENT,_acpi_module_name,__LINE__) +#endif +#ifndef ACPI_FREE +#define ACPI_FREE(a) acpio_os_free(a) +#endif #define ACPI_MEM_TRACKING(a) #else /* Memory allocation */ -#define ACPI_MEM_ALLOCATE(a) acpi_ut_allocate_and_track((acpi_size)(a),_COMPONENT,_acpi_module_name,__LINE__) -#define ACPI_MEM_CALLOCATE(a) acpi_ut_callocate_and_track((acpi_size)(a), _COMPONENT,_acpi_module_name,__LINE__) -#define ACPI_MEM_FREE(a) acpi_ut_free_and_track(a,_COMPONENT,_acpi_module_name,__LINE__) -#define ACPI_MEM_TRACKING(a) a +#define ACPI_ALLOCATE(a) acpi_ut_allocate_and_track((acpi_size)(a),_COMPONENT,_acpi_module_name,__LINE__) +#define ACPI_ALLOCATE_ZEROED(a) acpi_ut_allocate_zeroed_and_track((acpi_size)(a), _COMPONENT,_acpi_module_name,__LINE__) +#define ACPI_FREE(a) acpi_ut_free_and_track(a,_COMPONENT,_acpi_module_name,__LINE__) +#define ACPI_MEM_TRACKING(a) a #endif /* ACPI_DBG_TRACK_ALLOCATIONS */ diff --git a/include/acpi/acnamesp.h b/include/acpi/acnamesp.h index b667a804f..83b52f9f8 100644 --- a/include/acpi/acnamesp.h +++ b/include/acpi/acnamesp.h @@ -63,6 +63,8 @@ #define ACPI_NS_DONT_OPEN_SCOPE 0x02 #define ACPI_NS_NO_PEER_SEARCH 0x04 #define ACPI_NS_ERROR_IF_FOUND 0x08 +#define ACPI_NS_PREFIX_IS_SCOPE 0x10 +#define ACPI_NS_EXTERNAL 0x20 #define ACPI_NS_WALK_UNLOCK TRUE #define ACPI_NS_WALK_NO_UNLOCK FALSE @@ -171,19 +173,17 @@ acpi_ns_dump_objects(acpi_object_type type, /* * nseval - Namespace evaluation functions */ -acpi_status acpi_ns_evaluate_by_handle(struct acpi_parameter_info *info); - -acpi_status -acpi_ns_evaluate_by_name(char *pathname, struct acpi_parameter_info *info); - -acpi_status -acpi_ns_evaluate_relative(char *pathname, struct acpi_parameter_info *info); +acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info); /* * nsnames - Name and Scope manipulation */ u32 acpi_ns_opens_scope(acpi_object_type type); +void +acpi_ns_build_external_path(struct acpi_namespace_node *node, + acpi_size size, char *name_buffer); + char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node); char *acpi_ns_name_of_current_scope(struct acpi_walk_state *walk_state); @@ -196,9 +196,9 @@ u8 acpi_ns_pattern_match(struct acpi_namespace_node *obj_node, char *search_for); acpi_status -acpi_ns_get_node_by_path(char *external_pathname, - struct acpi_namespace_node *in_prefix_node, - u32 flags, struct acpi_namespace_node **out_node); +acpi_ns_get_node(struct acpi_namespace_node *prefix_node, + char *external_pathname, + u32 flags, struct acpi_namespace_node **out_node); acpi_size acpi_ns_get_pathname_length(struct acpi_namespace_node *node); @@ -241,10 +241,10 @@ acpi_ns_search_and_enter(u32 entry_name, u32 flags, struct acpi_namespace_node **ret_node); acpi_status -acpi_ns_search_node(u32 entry_name, - struct acpi_namespace_node *node, - acpi_object_type type, - struct acpi_namespace_node **ret_node); +acpi_ns_search_one_scope(u32 entry_name, + struct acpi_namespace_node *node, + acpi_object_type type, + struct acpi_namespace_node **ret_node); void acpi_ns_install_node(struct acpi_walk_state *walk_state, diff --git a/include/acpi/acobject.h b/include/acpi/acobject.h index d130cfed8..8fdee3111 100644 --- a/include/acpi/acobject.h +++ b/include/acpi/acobject.h @@ -1,7 +1,7 @@ /****************************************************************************** * - * Name: acobject.h - Definition of union acpi_operand_object (Internal object only) + * Name: acobject.h - Definition of union acpi_operand_object (Internal object only) * *****************************************************************************/ @@ -45,10 +45,12 @@ #ifndef _ACOBJECT_H #define _ACOBJECT_H +/* acpisrc:struct_defs -- for acpisrc conversion */ + /* - * The union acpi_operand_object is used to pass AML operands from the dispatcher + * The union acpi_operand_object is used to pass AML operands from the dispatcher * to the interpreter, and to keep track of the various handlers such as - * address space handlers and notify handlers. The object is a constant + * address space handlers and notify handlers. The object is a constant * size in order to allow it to be cached and reused. */ @@ -61,17 +63,25 @@ /* * Common area for all objects. * - * data_type is used to differentiate between internal descriptors, and MUST - * be the first byte in this structure. + * descriptor_type is used to differentiate between internal descriptors, and + * must be in the same place across all descriptors + * + * Note: The descriptor_type and Type fields must appear in the identical + * position in both the struct acpi_namespace_node and union acpi_operand_object + * structures. */ -#define ACPI_OBJECT_COMMON_HEADER /* SIZE/ALIGNMENT: 32 bits, one ptr plus trailing 8-bit flag */\ - u8 descriptor; /* To differentiate various internal objs */\ - u8 type; /* acpi_object_type */\ - u16 reference_count; /* For object deletion management */\ - union acpi_operand_object *next_object; /* Objects linked to parent NS node */\ - u8 flags; - -/* Values for flag byte above */ +#define ACPI_OBJECT_COMMON_HEADER \ + union acpi_operand_object *next_object; /* Objects linked to parent NS node */\ + u8 descriptor_type; /* To differentiate various internal objs */\ + u8 type; /* acpi_object_type */\ + u16 reference_count; /* For object deletion management */\ + u8 flags; + /* + * Note: There are 3 bytes available here before the + * next natural alignment boundary (for both 32/64 cases) + */ + +/* Values for Flag byte above */ #define AOPOBJ_AML_CONSTANT 0x01 #define AOPOBJ_STATIC_POINTER 0x02 @@ -79,36 +89,7 @@ #define AOPOBJ_OBJECT_INITIALIZED 0x08 #define AOPOBJ_SETUP_COMPLETE 0x10 #define AOPOBJ_SINGLE_DATUM 0x20 - -/* - * Common bitfield for the field objects - * "Field Datum" -- a datum from the actual field object - * "Buffer Datum" -- a datum from a user buffer, read from or to be written to the field - */ -#define ACPI_COMMON_FIELD_INFO /* SIZE/ALIGNMENT: 24 bits + three 32-bit values */\ - u8 field_flags; /* Access, update, and lock bits */\ - u8 attribute; /* From access_as keyword */\ - u8 access_byte_width; /* Read/Write size in bytes */\ - u32 bit_length; /* Length of field in bits */\ - u32 base_byte_offset; /* Byte offset within containing object */\ - u8 start_field_bit_offset;/* Bit offset within first field datum (0-63) */\ - u8 access_bit_width; /* Read/Write size in bits (8-64) */\ - u32 value; /* Value to store into the Bank or Index register */\ - struct acpi_namespace_node *node; /* Link back to parent node */ - -/* - * Fields common to both Strings and Buffers - */ -#define ACPI_COMMON_BUFFER_INFO \ - u32 length; - -/* - * Common fields for objects that support ASL notifications - */ -#define ACPI_COMMON_NOTIFY_INFO \ - union acpi_operand_object *system_notify; /* Handler for system notifies */\ - union acpi_operand_object *device_notify; /* Handler for driver notifies */\ - union acpi_operand_object *handler; /* Handler for Address space */ +#define AOPOBJ_INVALID 0x40 /* Used if host OS won't allow an op_region address */ /****************************************************************************** * @@ -125,25 +106,31 @@ struct acpi_object_integer { /* * Note: The String and Buffer object must be identical through the Pointer - * element. There is code that depends on this. + * and length elements. There is code that depends on this. + * + * Fields common to both Strings and Buffers */ +#define ACPI_COMMON_BUFFER_INFO(_type) \ + _type *pointer; \ + u32 length; + struct acpi_object_string { /* Null terminated, ASCII characters only */ - ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_BUFFER_INFO char *pointer; /* String in AML stream or allocated string */ + ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_BUFFER_INFO(char) /* String in AML stream or allocated string */ }; struct acpi_object_buffer { - ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_BUFFER_INFO u8 * pointer; /* Buffer in AML stream or allocated buffer */ - struct acpi_namespace_node *node; /* Link back to parent node */ - u8 *aml_start; + ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_BUFFER_INFO(u8) /* Buffer in AML stream or allocated buffer */ u32 aml_length; + u8 *aml_start; + struct acpi_namespace_node *node; /* Link back to parent node */ }; struct acpi_object_package { - ACPI_OBJECT_COMMON_HEADER u32 count; /* # of elements in package */ - u32 aml_length; - u8 *aml_start; - struct acpi_namespace_node *node; /* Link back to parent node */ + ACPI_OBJECT_COMMON_HEADER struct acpi_namespace_node *node; /* Link back to parent node */ union acpi_operand_object **elements; /* Array of pointers to acpi_objects */ + u8 *aml_start; + u32 aml_length; + u32 count; /* # of elements in package */ }; /****************************************************************************** @@ -153,31 +140,14 @@ struct acpi_object_package { *****************************************************************************/ struct acpi_object_event { - ACPI_OBJECT_COMMON_HEADER void *semaphore; -}; - -#define ACPI_INFINITE_CONCURRENCY 0xFF - -typedef -acpi_status(*ACPI_INTERNAL_METHOD) (struct acpi_walk_state * walk_state); - -struct acpi_object_method { - ACPI_OBJECT_COMMON_HEADER u8 method_flags; - u8 param_count; - u32 aml_length; - void *semaphore; - u8 *aml_start; - ACPI_INTERNAL_METHOD implementation; - u8 concurrency; - u8 thread_count; - acpi_owner_id owner_id; + ACPI_OBJECT_COMMON_HEADER acpi_semaphore os_semaphore; /* Actual OS synchronization object */ }; struct acpi_object_mutex { ACPI_OBJECT_COMMON_HEADER u8 sync_level; /* 0-15, specified in Mutex() call */ u16 acquisition_depth; /* Allow multiple Acquires, same thread */ struct acpi_thread_state *owner_thread; /* Current owner of the mutex */ - void *semaphore; /* Actual OS synchronization object */ + acpi_mutex os_mutex; /* Actual OS synchronization object */ union acpi_operand_object *prev; /* Link for list of acquired mutexes */ union acpi_operand_object *next; /* Link for list of acquired mutexes */ struct acpi_namespace_node *node; /* Containing namespace node */ @@ -186,11 +156,23 @@ struct acpi_object_mutex { struct acpi_object_region { ACPI_OBJECT_COMMON_HEADER u8 space_id; - union acpi_operand_object *handler; /* Handler for region access */ struct acpi_namespace_node *node; /* Containing namespace node */ + union acpi_operand_object *handler; /* Handler for region access */ union acpi_operand_object *next; - u32 length; acpi_physical_address address; + u32 length; +}; + +struct acpi_object_method { + ACPI_OBJECT_COMMON_HEADER u8 method_flags; + u8 param_count; + u8 sync_level; + union acpi_operand_object *mutex; + u8 *aml_start; + ACPI_INTERNAL_METHOD implementation; + u32 aml_length; + u8 thread_count; + acpi_owner_id owner_id; }; /****************************************************************************** @@ -199,6 +181,14 @@ struct acpi_object_region { * *****************************************************************************/ +/* + * Common fields for objects that support ASL notifications + */ +#define ACPI_COMMON_NOTIFY_INFO \ + union acpi_operand_object *system_notify; /* Handler for system notifies */\ + union acpi_operand_object *device_notify; /* Handler for driver notifies */\ + union acpi_operand_object *handler; /* Handler for Address space */ + struct acpi_object_notify_common { /* COMMON NOTIFY for POWER, PROCESSOR, DEVICE, and THERMAL */ ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_NOTIFY_INFO}; @@ -213,9 +203,9 @@ struct acpi_object_power_resource { }; struct acpi_object_processor { - ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_NOTIFY_INFO u32 proc_id; - u32 length; - acpi_io_address address; + ACPI_OBJECT_COMMON_HEADER u8 proc_id; + u8 length; + ACPI_COMMON_NOTIFY_INFO acpi_io_address address; }; struct acpi_object_thermal_zone { @@ -227,9 +217,24 @@ ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_NOTIFY_INFO}; * *****************************************************************************/ +/* + * Common bitfield for the field objects + * "Field Datum" -- a datum from the actual field object + * "Buffer Datum" -- a datum from a user buffer, read from or to be written to the field + */ +#define ACPI_COMMON_FIELD_INFO \ + u8 field_flags; /* Access, update, and lock bits */\ + u8 attribute; /* From access_as keyword */\ + u8 access_byte_width; /* Read/Write size in bytes */\ + struct acpi_namespace_node *node; /* Link back to parent node */\ + u32 bit_length; /* Length of field in bits */\ + u32 base_byte_offset; /* Byte offset within containing object */\ + u32 value; /* Value to store into the Bank or Index register */\ + u8 start_field_bit_offset;/* Bit offset within first field datum (0-63) */\ + u8 access_bit_width; /* Read/Write size in bits (8-64) */ + struct acpi_object_field_common { /* COMMON FIELD (for BUFFER, REGION, BANK, and INDEX fields) */ - ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO union acpi_operand_object *region_obj; /* Containing Operation Region object */ - /* (REGION/BANK fields only) */ + ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO union acpi_operand_object *region_obj; /* Parent Operation Region object (REGION/BANK fields only) */ }; struct acpi_object_region_field { @@ -244,7 +249,7 @@ struct acpi_object_bank_field { struct acpi_object_index_field { ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO /* - * No "region_obj" pointer needed since the Index and Data registers + * No "RegionObj" pointer needed since the Index and Data registers * are each field definitions unto themselves. */ union acpi_operand_object *index_obj; /* Index register */ @@ -269,13 +274,9 @@ struct acpi_object_notify_handler { void *context; }; -/* Flags for address handler */ - -#define ACPI_ADDR_HANDLER_DEFAULT_INSTALLED 0x1 - struct acpi_object_addr_handler { ACPI_OBJECT_COMMON_HEADER u8 space_id; - u16 hflags; + u8 handler_flags; acpi_adr_space_handler handler; struct acpi_namespace_node *node; /* Parent device */ void *context; @@ -284,6 +285,10 @@ struct acpi_object_addr_handler { union acpi_operand_object *next; }; +/* Flags for address handler (handler_flags) */ + +#define ACPI_ADDR_HANDLER_DEFAULT_INSTALLED 0x01 + /****************************************************************************** * * Special internal objects @@ -297,10 +302,10 @@ struct acpi_object_addr_handler { struct acpi_object_reference { ACPI_OBJECT_COMMON_HEADER u8 target_type; /* Used for index_op */ u16 opcode; - u32 offset; /* Used for arg_op, local_op, and index_op */ - void *object; /* name_op=>HANDLE to obj, index_op=>union acpi_operand_object */ + void *object; /* name_op=>HANDLE to obj, index_op=>union acpi_operand_object */ struct acpi_namespace_node *node; union acpi_operand_object **where; + u32 offset; /* Used for arg_op, local_op, and index_op */ }; /* @@ -311,12 +316,10 @@ struct acpi_object_reference { * Currently: Region and field_unit types */ struct acpi_object_extra { - ACPI_OBJECT_COMMON_HEADER u8 byte_fill1; - u16 word_fill1; - u32 aml_length; - u8 *aml_start; - struct acpi_namespace_node *method_REG; /* _REG method for this region (if any) */ + ACPI_OBJECT_COMMON_HEADER struct acpi_namespace_node *method_REG; /* _REG method for this region (if any) */ void *region_context; /* Region-specific data */ + u8 *aml_start; + u32 aml_length; }; /* Additional data that can be attached to namespace nodes */ @@ -391,8 +394,13 @@ union acpi_operand_object { #define ACPI_DESC_TYPE_NAMED 0x0F #define ACPI_DESC_TYPE_MAX 0x0F +struct acpi_common_descriptor { + void *common_pointer; + u8 descriptor_type; /* To differentiate various internal objs */ +}; + union acpi_descriptor { - u8 descriptor_id; /* To differentiate various internal objs */ + struct acpi_common_descriptor common; union acpi_operand_object object; struct acpi_namespace_node node; union acpi_parse_object op; diff --git a/include/acpi/acopcode.h b/include/acpi/acopcode.h index e6d78bd9e..7659a46bc 100644 --- a/include/acpi/acopcode.h +++ b/include/acpi/acopcode.h @@ -94,7 +94,7 @@ #define ARGP_CONCAT_RES_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) #define ARGP_COND_REF_OF_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_SUPERNAME) #define ARGP_CONTINUE_OP ARG_NONE -#define ARGP_COPY_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_SIMPLENAME) +#define ARGP_COPY_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_SIMPLENAME) #define ARGP_CREATE_BIT_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) #define ARGP_CREATE_BYTE_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) #define ARGP_CREATE_DWORD_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) diff --git a/include/acpi/acoutput.h b/include/acpi/acoutput.h index 7785d481d..8d5039d0b 100644 --- a/include/acpi/acoutput.h +++ b/include/acpi/acoutput.h @@ -50,7 +50,7 @@ * component basis and a per-exception-type basis. */ -/* Component IDs are used in the global "debug_layer" */ +/* Component IDs are used in the global "DebugLayer" */ #define ACPI_UTILITIES 0x00000001 #define ACPI_HARDWARE 0x00000002 @@ -121,7 +121,7 @@ #define ACPI_LV_INTERRUPTS 0x08000000 #define ACPI_LV_VERBOSITY3 0x0F000000 | ACPI_LV_VERBOSITY2 -/* Exceptionally verbose output -- also used in the global "debug_level" */ +/* Exceptionally verbose output -- also used in the global "DebugLevel" */ #define ACPI_LV_AML_DISASSEMBLE 0x10000000 #define ACPI_LV_VERBOSE_INFO 0x20000000 @@ -135,7 +135,7 @@ */ #define ACPI_DEBUG_LEVEL(dl) (u32) dl,ACPI_DEBUG_PARAMETERS -/* Exception level -- used in the global "debug_level" */ +/* Exception level -- used in the global "DebugLevel" */ #define ACPI_DB_INIT ACPI_DEBUG_LEVEL (ACPI_LV_INIT) #define ACPI_DB_DEBUG_OBJECT ACPI_DEBUG_LEVEL (ACPI_LV_DEBUG_OBJECT) @@ -144,13 +144,13 @@ /* * These two levels are essentially obsolete, all instances in the - * ACPICA core code have been replaced by REPORT_ERROR and REPORT_WARNING + * ACPICA core code have been replaced by ACPI_ERROR and ACPI_WARNING * (Kept here because some drivers may still use them) */ #define ACPI_DB_ERROR ACPI_DEBUG_LEVEL (ACPI_LV_ERROR) #define ACPI_DB_WARN ACPI_DEBUG_LEVEL (ACPI_LV_WARN) -/* Trace level -- also used in the global "debug_level" */ +/* Trace level -- also used in the global "DebugLevel" */ #define ACPI_DB_INIT_NAMES ACPI_DEBUG_LEVEL (ACPI_LV_INIT_NAMES) #define ACPI_DB_THREADS ACPI_DEBUG_LEVEL (ACPI_LV_THREADS) diff --git a/include/acpi/acparser.h b/include/acpi/acparser.h index 5a1ff484a..9d49d3c41 100644 --- a/include/acpi/acparser.h +++ b/include/acpi/acparser.h @@ -46,7 +46,7 @@ #define OP_HAS_RETURN_VALUE 1 -/* variable # arguments */ +/* Variable number of arguments. This field must be 32 bits */ #define ACPI_VAR_ARGS ACPI_UINT32_MAX @@ -71,7 +71,7 @@ /* * psxface - Parser external interfaces */ -acpi_status acpi_ps_execute_method(struct acpi_parameter_info *info); +acpi_status acpi_ps_execute_method(struct acpi_evaluate_info *info); /* * psargs - Parse AML opcode arguments diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h index 6dca3d542..f338e40bd 100644 --- a/include/acpi/acpi_bus.h +++ b/include/acpi/acpi_bus.h @@ -26,7 +26,7 @@ #ifndef __ACPI_BUS_H__ #define __ACPI_BUS_H__ -#include +#include #include @@ -59,7 +59,7 @@ acpi_evaluate_reference(acpi_handle handle, #define ACPI_BUS_FILE_ROOT "acpi" extern struct proc_dir_entry *acpi_root_dir; -extern FADT_DESCRIPTOR acpi_fadt; +extern struct fadt_descriptor acpi_fadt; enum acpi_bus_removal_type { ACPI_BUS_REMOVAL_NORMAL = 0, @@ -169,7 +169,8 @@ struct acpi_device_flags { u32 power_manageable:1; u32 performance_manageable:1; u32 wake_capable:1; /* Wakeup(_PRW) supported? */ - u32 reserved:20; + u32 force_power_state:1; + u32 reserved:19; }; /* File System */ @@ -296,6 +297,7 @@ struct acpi_device { struct acpi_driver *driver; void *driver_data; struct kobject kobj; + struct device dev; }; #define acpi_driver_data(d) ((d)->driver_data) @@ -327,12 +329,12 @@ int acpi_bus_set_power(acpi_handle handle, int state); int acpi_bus_generate_event(struct acpi_device *device, u8 type, int data); int acpi_bus_receive_event(struct acpi_bus_event *event); int acpi_bus_register_driver(struct acpi_driver *driver); -int acpi_bus_unregister_driver(struct acpi_driver *driver); +void acpi_bus_unregister_driver(struct acpi_driver *driver); int acpi_bus_add(struct acpi_device **child, struct acpi_device *parent, acpi_handle handle, int type); int acpi_bus_trim(struct acpi_device *start, int rmdevice); int acpi_bus_start(struct acpi_device *device); - +acpi_status acpi_bus_get_ejd(acpi_handle handle, acpi_handle *ejd); int acpi_match_ids(struct acpi_device *device, char *ids); int acpi_create_dir(struct acpi_device *); void acpi_remove_dir(struct acpi_device *); diff --git a/include/acpi/acpi_drivers.h b/include/acpi/acpi_drivers.h index b425f9bb6..6a5bdcefe 100644 --- a/include/acpi/acpi_drivers.h +++ b/include/acpi/acpi_drivers.h @@ -110,4 +110,21 @@ int acpi_processor_set_thermal_limit(acpi_handle handle, int type); extern int acpi_specific_hotkey_enabled; +/*-------------------------------------------------------------------------- + Dock Station + -------------------------------------------------------------------------- */ +#if defined(CONFIG_ACPI_DOCK) || defined(CONFIG_ACPI_DOCK_MODULE) +extern int is_dock_device(acpi_handle handle); +extern int register_dock_notifier(struct notifier_block *nb); +extern void unregister_dock_notifier(struct notifier_block *nb); +extern int register_hotplug_dock_device(acpi_handle handle, + acpi_notify_handler handler, void *context); +extern void unregister_hotplug_dock_device(acpi_handle handle); +#else +#define is_dock_device(h) (0) +#define register_dock_notifier(nb) (-ENODEV) +#define unregister_dock_notifier(nb) do { } while(0) +#define register_hotplug_dock_device(h1, h2, c) (-ENODEV) +#define unregister_hotplug_dock_device(h) do { } while(0) +#endif #endif /*__ACPI_DRIVERS_H__*/ diff --git a/include/acpi/acpiosxf.h b/include/acpi/acpiosxf.h index 970e9a637..0cd63bce0 100644 --- a/include/acpi/acpiosxf.h +++ b/include/acpi/acpiosxf.h @@ -50,12 +50,16 @@ #include "platform/acenv.h" #include "actypes.h" -/* Priorities for acpi_os_queue_for_execution */ +/* Types for acpi_os_execute */ -#define OSD_PRIORITY_GPE 1 -#define OSD_PRIORITY_HIGH 2 -#define OSD_PRIORITY_MED 3 -#define OSD_PRIORITY_LO 4 +typedef enum { + OSL_GLOBAL_LOCK_HANDLER, + OSL_NOTIFY_HANDLER, + OSL_GPE_HANDLER, + OSL_DEBUGGER_THREAD, + OSL_EC_POLL_HANDLER, + OSL_EC_BURST_HANDLER +} acpi_execute_type; #define ACPI_NO_UNIT_LIMIT ((u32) -1) #define ACPI_MUTEX_SEM 1 @@ -92,33 +96,53 @@ acpi_os_table_override(struct acpi_table_header *existing_table, struct acpi_table_header **new_table); /* - * Synchronization primitives + * Spinlock primitives + */ +acpi_status acpi_os_create_lock(acpi_spinlock * out_handle); + +void acpi_os_delete_lock(acpi_spinlock handle); + +acpi_cpu_flags acpi_os_acquire_lock(acpi_spinlock handle); + +void acpi_os_release_lock(acpi_spinlock handle, acpi_cpu_flags flags); + +/* + * Semaphore primitives */ acpi_status acpi_os_create_semaphore(u32 max_units, - u32 initial_units, acpi_handle * out_handle); + u32 initial_units, acpi_semaphore * out_handle); -acpi_status acpi_os_delete_semaphore(acpi_handle handle); +acpi_status acpi_os_delete_semaphore(acpi_semaphore handle); -acpi_status acpi_os_wait_semaphore(acpi_handle handle, u32 units, u16 timeout); +acpi_status +acpi_os_wait_semaphore(acpi_semaphore handle, u32 units, u16 timeout); + +acpi_status acpi_os_signal_semaphore(acpi_semaphore handle, u32 units); + +/* + * Mutex primitives + */ +acpi_status acpi_os_create_mutex(acpi_mutex * out_handle); -acpi_status acpi_os_signal_semaphore(acpi_handle handle, u32 units); +void acpi_os_delete_mutex(acpi_mutex handle); -acpi_status acpi_os_create_lock(acpi_handle * out_handle); +acpi_status acpi_os_acquire_mutex(acpi_mutex handle, u16 timeout); -void acpi_os_delete_lock(acpi_handle handle); +void acpi_os_release_mutex(acpi_mutex handle); -acpi_cpu_flags acpi_os_acquire_lock(acpi_handle handle); +/* Temporary macros for Mutex* interfaces, map to existing semaphore xfaces */ -void acpi_os_release_lock(acpi_handle handle, acpi_cpu_flags flags); +#define acpi_os_create_mutex(out_handle) acpi_os_create_semaphore (1, 1, out_handle) +#define acpi_os_delete_mutex(handle) (void) acpi_os_delete_semaphore (handle) +#define acpi_os_acquire_mutex(handle,time) acpi_os_wait_semaphore (handle, 1, time) +#define acpi_os_release_mutex(handle) (void) acpi_os_signal_semaphore (handle, 1) /* * Memory allocation and mapping */ void *acpi_os_allocate(acpi_size size); -void acpi_os_free(void *memory); - acpi_status acpi_os_map_memory(acpi_physical_address physical_address, acpi_size size, void __iomem ** logical_address); @@ -161,13 +185,11 @@ acpi_os_remove_interrupt_handler(u32 gsi, acpi_osd_handler service_routine); /* * Threads and Scheduling */ -u32 acpi_os_get_thread_id(void); +acpi_thread_id acpi_os_get_thread_id(void); acpi_status -acpi_os_queue_for_execution(u32 priority, - acpi_osd_exec_callback function, void *context); - -void acpi_os_wait_events_complete(void *context); +acpi_os_execute(acpi_execute_type type, + acpi_osd_exec_callback function, void *context); void acpi_os_wait_events_complete(void *context); @@ -214,6 +236,12 @@ acpi_os_derive_pci_id(acpi_handle rhandle, /* * Miscellaneous */ +acpi_status acpi_os_validate_interface(char *interface); + +acpi_status +acpi_os_validate_address(u8 space_id, + acpi_physical_address address, acpi_size length); + u8 acpi_os_readable(void *pointer, acpi_size length); #ifdef ACPI_FUTURE_USAGE @@ -255,11 +283,4 @@ char *acpi_os_get_next_filename(void *dir_handle); void acpi_os_close_directory(void *dir_handle); -/* - * Debug - */ -void -acpi_os_dbg_assert(void *failed_assertion, - void *file_name, u32 line_number, char *message); - #endif /* __ACPIOSXF_H__ */ diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h index 66cf2ecef..049e9aa1b 100644 --- a/include/acpi/acpixf.h +++ b/include/acpi/acpixf.h @@ -268,7 +268,7 @@ acpi_status acpi_remove_gpe_block(acpi_handle gpe_device); * Resource interfaces */ typedef -acpi_status(*ACPI_WALK_RESOURCE_CALLBACK) (struct acpi_resource * resource, +acpi_status(*acpi_walk_resource_callback) (struct acpi_resource * resource, void *context); acpi_status @@ -290,7 +290,7 @@ acpi_get_possible_resources(acpi_handle device_handle, acpi_status acpi_walk_resources(acpi_handle device_handle, char *name, - ACPI_WALK_RESOURCE_CALLBACK user_function, void *context); + acpi_walk_resource_callback user_function, void *context); acpi_status acpi_set_current_resources(acpi_handle device_handle, diff --git a/include/acpi/acresrc.h b/include/acpi/acresrc.h index fa02e8083..80a3b3357 100644 --- a/include/acpi/acresrc.h +++ b/include/acpi/acresrc.h @@ -50,9 +50,13 @@ /* * If possible, pack the following structures to byte alignment, since we - * don't care about performance for debug output + * don't care about performance for debug output. Two cases where we cannot + * pack the structures: + * + * 1) Hardware does not support misaligned memory transfers + * 2) Compiler does not support pointers within packed structures */ -#ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED +#if (!defined(ACPI_MISALIGNMENT_NOT_SUPPORTED) && !defined(ACPI_PACKED_POINTERS_NOT_SUPPORTED)) #pragma pack(1) #endif @@ -164,23 +168,26 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, /* * rsutils */ + acpi_status -acpi_rs_get_prt_method_data(acpi_handle handle, struct acpi_buffer *ret_buffer); +acpi_rs_get_prt_method_data(struct acpi_namespace_node *node, + struct acpi_buffer *ret_buffer); acpi_status -acpi_rs_get_crs_method_data(acpi_handle handle, struct acpi_buffer *ret_buffer); +acpi_rs_get_crs_method_data(struct acpi_namespace_node *node, + struct acpi_buffer *ret_buffer); -#ifdef ACPI_FUTURE_USAGE acpi_status -acpi_rs_get_prs_method_data(acpi_handle handle, struct acpi_buffer *ret_buffer); -#endif /* ACPI_FUTURE_USAGE */ +acpi_rs_get_prs_method_data(struct acpi_namespace_node *node, + struct acpi_buffer *ret_buffer); acpi_status acpi_rs_get_method_data(acpi_handle handle, char *path, struct acpi_buffer *ret_buffer); acpi_status -acpi_rs_set_srs_method_data(acpi_handle handle, struct acpi_buffer *ret_buffer); +acpi_rs_set_srs_method_data(struct acpi_namespace_node *node, + struct acpi_buffer *ret_buffer); /* * rscalc @@ -198,8 +205,9 @@ acpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object, acpi_size * buffer_size_needed); acpi_status -acpi_rs_convert_aml_to_resources(u8 * aml_buffer, - u32 aml_buffer_length, u8 * output_buffer); +acpi_rs_convert_aml_to_resources(u8 * aml, + u32 length, + u32 offset, u8 resource_index, void **context); acpi_status acpi_rs_convert_resources_to_aml(struct acpi_resource *resource, diff --git a/include/acpi/acstruct.h b/include/acpi/acstruct.h index d8c1c2cda..5e8095f0f 100644 --- a/include/acpi/acstruct.h +++ b/include/acpi/acstruct.h @@ -44,6 +44,8 @@ #ifndef __ACSTRUCT_H__ #define __ACSTRUCT_H__ +/* acpisrc:struct_defs -- for acpisrc conversion */ + /***************************************************************************** * * Tree walking typedefs and structs @@ -51,67 +53,76 @@ ****************************************************************************/ /* - * Walk state - current state of a parse tree walk. Used for both a leisurely stroll through - * the tree (for whatever reason), and for control method execution. + * Walk state - current state of a parse tree walk. Used for both a leisurely + * stroll through the tree (for whatever reason), and for control method + * execution. */ #define ACPI_NEXT_OP_DOWNWARD 1 #define ACPI_NEXT_OP_UPWARD 2 +/* + * Groups of definitions for walk_type used for different implementations of + * walkers (never simultaneously) - flags for interpreter: + */ #define ACPI_WALK_NON_METHOD 0 -#define ACPI_WALK_METHOD 1 -#define ACPI_WALK_METHOD_RESTART 2 -#define ACPI_WALK_CONST_REQUIRED 3 -#define ACPI_WALK_CONST_OPTIONAL 4 +#define ACPI_WALK_METHOD 0x01 +#define ACPI_WALK_METHOD_RESTART 0x02 + +/* Flags for i_aSL compiler only */ + +#define ACPI_WALK_CONST_REQUIRED 0x10 +#define ACPI_WALK_CONST_OPTIONAL 0x20 struct acpi_walk_state { - u8 data_type; /* To differentiate various internal objs MUST BE FIRST! */ + struct acpi_walk_state *next; /* Next walk_state in list */ + u8 descriptor_type; /* To differentiate various internal objs */ u8 walk_type; - acpi_owner_id owner_id; /* Owner of objects created during the walk */ - u8 last_predicate; /* Result of last predicate */ - u8 current_result; /* */ + u16 opcode; /* Current AML opcode */ u8 next_op_info; /* Info about next_op */ u8 num_operands; /* Stack pointer for Operands[] array */ + acpi_owner_id owner_id; /* Owner of objects created during the walk */ + u8 last_predicate; /* Result of last predicate */ + u8 current_result; u8 return_used; - u16 opcode; /* Current AML opcode */ u8 scope_depth; u8 pass_number; /* Parse pass during table load */ - u32 arg_count; /* push for fixed or var args */ u32 aml_offset; u32 arg_types; u32 method_breakpoint; /* For single stepping */ u32 user_breakpoint; /* User AML breakpoint */ u32 parse_flags; + + struct acpi_parse_state parser_state; /* Current state of parser */ u32 prev_arg_types; + u32 arg_count; /* push for fixed or var args */ - u8 *aml_last_while; struct acpi_namespace_node arguments[ACPI_METHOD_NUM_ARGS]; /* Control method arguments */ + struct acpi_namespace_node local_variables[ACPI_METHOD_NUM_LOCALS]; /* Control method locals */ + union acpi_operand_object *operands[ACPI_OBJ_NUM_OPERANDS + 1]; /* Operands passed to the interpreter (+1 for NULL terminator) */ + union acpi_operand_object **params; + + u8 *aml_last_while; union acpi_operand_object **caller_return_desc; union acpi_generic_state *control_state; /* List of control states (nested IFs) */ struct acpi_namespace_node *deferred_node; /* Used when executing deferred opcodes */ struct acpi_gpe_event_info *gpe_event_info; /* Info for GPE (_Lxx/_Exx methods only */ union acpi_operand_object *implicit_return_obj; - struct acpi_namespace_node local_variables[ACPI_METHOD_NUM_LOCALS]; /* Control method locals */ struct acpi_namespace_node *method_call_node; /* Called method Node */ union acpi_parse_object *method_call_op; /* method_call Op if running a method */ union acpi_operand_object *method_desc; /* Method descriptor if running a method */ struct acpi_namespace_node *method_node; /* Method node if running a method. */ union acpi_parse_object *op; /* Current parser op */ - union acpi_operand_object *operands[ACPI_OBJ_NUM_OPERANDS + 1]; /* Operands passed to the interpreter (+1 for NULL terminator) */ const struct acpi_opcode_info *op_info; /* Info on current opcode */ union acpi_parse_object *origin; /* Start of walk [Obsolete] */ - union acpi_operand_object **params; - struct acpi_parse_state parser_state; /* Current state of parser */ union acpi_operand_object *result_obj; union acpi_generic_state *results; /* Stack of accumulated results */ union acpi_operand_object *return_desc; /* Return object, if any */ union acpi_generic_state *scope_info; /* Stack of nested scopes */ - union acpi_parse_object *prev_op; /* Last op that was processed */ union acpi_parse_object *next_op; /* next op to be processed */ + struct acpi_thread_state *thread; acpi_parse_downwards descending_callback; acpi_parse_upwards ascending_callback; - struct acpi_thread_state *thread; - struct acpi_walk_state *next; /* Next walk_state in list */ }; /* Info used by acpi_ps_init_objects */ @@ -131,32 +142,6 @@ struct acpi_init_walk_info { struct acpi_table_desc *table_desc; }; -/* Info used by acpi_ns_initialize_devices */ - -struct acpi_device_walk_info { - u16 device_count; - u16 num_STA; - u16 num_INI; - struct acpi_table_desc *table_desc; -}; - -/* TBD: [Restructure] Merge with struct above */ - -struct acpi_walk_info { - u32 debug_level; - u32 count; - acpi_owner_id owner_id; - u8 display_type; -}; - -/* Display Types */ - -#define ACPI_DISPLAY_SUMMARY (u8) 0 -#define ACPI_DISPLAY_OBJECTS (u8) 1 -#define ACPI_DISPLAY_MASK (u8) 1 - -#define ACPI_DISPLAY_SHORT (u8) 2 - struct acpi_get_devices_info { acpi_walk_callback user_function; void *context; @@ -189,16 +174,21 @@ union acpi_aml_operands { } mid; }; -/* Internal method parameter list */ - -struct acpi_parameter_info { - struct acpi_namespace_node *node; +/* + * Structure used to pass object evaluation parameters. + * Purpose is to reduce CPU stack use. + */ +struct acpi_evaluate_info { + struct acpi_namespace_node *prefix_node; + char *pathname; union acpi_operand_object *obj_desc; union acpi_operand_object **parameters; + struct acpi_namespace_node *resolved_node; union acpi_operand_object *return_object; u8 pass_number; u8 parameter_type; u8 return_object_type; + u8 flags; }; /* Types for parameter_type above */ @@ -206,4 +196,35 @@ struct acpi_parameter_info { #define ACPI_PARAM_ARGS 0 #define ACPI_PARAM_GPE 1 +/* Values for Flags above */ + +#define ACPI_IGNORE_RETURN_VALUE 1 + +/* Info used by acpi_ns_initialize_devices */ + +struct acpi_device_walk_info { + u16 device_count; + u16 num_STA; + u16 num_INI; + struct acpi_table_desc *table_desc; + struct acpi_evaluate_info *evaluate_info; +}; + +/* TBD: [Restructure] Merge with struct above */ + +struct acpi_walk_info { + u32 debug_level; + u32 count; + acpi_owner_id owner_id; + u8 display_type; +}; + +/* Display Types */ + +#define ACPI_DISPLAY_SUMMARY (u8) 0 +#define ACPI_DISPLAY_OBJECTS (u8) 1 +#define ACPI_DISPLAY_MASK (u8) 1 + +#define ACPI_DISPLAY_SHORT (u8) 2 + #endif diff --git a/include/acpi/actables.h b/include/acpi/actables.h index 30a47542e..4dbaf02fe 100644 --- a/include/acpi/actables.h +++ b/include/acpi/actables.h @@ -136,7 +136,11 @@ acpi_status acpi_tb_is_table_installed(struct acpi_table_desc *new_table_desc); acpi_status acpi_tb_verify_table_checksum(struct acpi_table_header *table_header); -u8 acpi_tb_generate_checksum(void *buffer, u32 length); +u8 acpi_tb_sum_table(void *buffer, u32 length); + +u8 acpi_tb_generate_checksum(struct acpi_table_header *table); + +void acpi_tb_set_checksum(struct acpi_table_header *table); acpi_status acpi_tb_validate_table_header(struct acpi_table_header *table_header); diff --git a/include/acpi/actbl.h b/include/acpi/actbl.h index ed53f842d..b125ceed9 100644 --- a/include/acpi/actbl.h +++ b/include/acpi/actbl.h @@ -1,6 +1,6 @@ /****************************************************************************** * - * Name: actbl.h - Table data structures defined in ACPI specification + * Name: actbl.h - Basic ACPI Table Definitions * *****************************************************************************/ @@ -45,66 +45,45 @@ #define __ACTBL_H__ /* - * Note about bitfields: The u8 type is used for bitfields in ACPI tables. - * This is the only type that is even remotely portable. Anything else is not - * portable, so do not use any other bitfield types. - */ - -/* - * Values for description table header signatures + * Values for description table header signatures. Useful because they make + * it more difficult to inadvertently type in the wrong signature. */ -#define RSDP_NAME "RSDP" -#define RSDP_SIG "RSD PTR " /* RSDT Pointer signature */ -#define APIC_SIG "APIC" /* Multiple APIC Description Table */ #define DSDT_SIG "DSDT" /* Differentiated System Description Table */ #define FADT_SIG "FACP" /* Fixed ACPI Description Table */ #define FACS_SIG "FACS" /* Firmware ACPI Control Structure */ #define PSDT_SIG "PSDT" /* Persistent System Description Table */ +#define RSDP_SIG "RSD PTR " /* Root System Description Pointer */ #define RSDT_SIG "RSDT" /* Root System Description Table */ #define XSDT_SIG "XSDT" /* Extended System Description Table */ #define SSDT_SIG "SSDT" /* Secondary System Description Table */ -#define SBST_SIG "SBST" /* Smart Battery Specification Table */ -#define SPIC_SIG "SPIC" /* IOSAPIC table */ -#define BOOT_SIG "BOOT" /* Boot table */ - -#define GL_OWNED 0x02 /* Ownership of global lock is bit 1 */ +#define RSDP_NAME "RSDP" /* - * Common table types. The base code can remain - * constant if the underlying tables are changed + * All tables and structures must be byte-packed to match the ACPI + * specification, since the tables are provided by the system BIOS */ -#define RSDT_DESCRIPTOR struct rsdt_descriptor_rev2 -#define XSDT_DESCRIPTOR struct xsdt_descriptor_rev2 -#define FACS_DESCRIPTOR struct facs_descriptor_rev2 -#define FADT_DESCRIPTOR struct fadt_descriptor_rev2 - #pragma pack(1) /* - * ACPI Version-independent tables + * These are the ACPI tables that are directly consumed by the subsystem. + * + * The RSDP and FACS do not use the common ACPI table header. All other ACPI + * tables use the header. * - * NOTE: The tables that are specific to ACPI versions (1.0, 2.0, etc.) - * are in separate files. + * Note about bitfields: The u8 type is used for bitfields in ACPI tables. + * This is the only type that is even remotely portable. Anything else is not + * portable, so do not use any other bitfield types. */ -struct rsdp_descriptor { /* Root System Descriptor Pointer */ - char signature[8]; /* ACPI signature, contains "RSD PTR " */ - u8 checksum; /* ACPI 1.0 checksum */ - char oem_id[6]; /* OEM identification */ - u8 revision; /* Must be (0) for ACPI 1.0 or (2) for ACPI 2.0+ */ - u32 rsdt_physical_address; /* 32-bit physical address of the RSDT */ - u32 length; /* XSDT Length in bytes, including header */ - u64 xsdt_physical_address; /* 64-bit physical address of the XSDT */ - u8 extended_checksum; /* Checksum of entire table (ACPI 2.0) */ - char reserved[3]; /* Reserved, must be zero */ -}; -struct acpi_common_facs { /* Common FACS for internal use */ - u32 *global_lock; - u64 *firmware_waking_vector; - u8 vector_width; -}; +/******************************************************************************* + * + * ACPI Table Header. This common header is used by all tables except the + * RSDP and FACS. The define is used for direct inclusion of header into + * other ACPI tables + * + ******************************************************************************/ -#define ACPI_TABLE_HEADER_DEF /* ACPI common table header */ \ +#define ACPI_TABLE_HEADER_DEF \ char signature[4]; /* ASCII table signature */\ u32 length; /* Length of table in bytes, including this header */\ u8 revision; /* ACPI Specification minor version # */\ @@ -112,153 +91,238 @@ struct acpi_common_facs { /* Common FACS for internal use */ char oem_id[6]; /* ASCII OEM identification */\ char oem_table_id[8]; /* ASCII OEM table identification */\ u32 oem_revision; /* OEM revision number */\ - char asl_compiler_id [4]; /* ASCII ASL compiler vendor ID */\ + char asl_compiler_id[4]; /* ASCII ASL compiler vendor ID */\ u32 asl_compiler_revision; /* ASL compiler version */ -struct acpi_table_header { /* ACPI common table header */ +struct acpi_table_header { ACPI_TABLE_HEADER_DEF}; /* - * MADT values and structures + * GAS - Generic Address Structure (ACPI 2.0+) */ +struct acpi_generic_address { + u8 address_space_id; /* Address space where struct or register exists */ + u8 register_bit_width; /* Size in bits of given register */ + u8 register_bit_offset; /* Bit offset within the register */ + u8 access_width; /* Minimum Access size (ACPI 3.0) */ + u64 address; /* 64-bit address of struct or register */ +}; -/* Values for MADT PCATCompat */ +/******************************************************************************* + * + * RSDP - Root System Description Pointer (Signature is "RSD PTR ") + * + ******************************************************************************/ + +struct rsdp_descriptor { + char signature[8]; /* ACPI signature, contains "RSD PTR " */ + u8 checksum; /* ACPI 1.0 checksum */ + char oem_id[6]; /* OEM identification */ + u8 revision; /* Must be (0) for ACPI 1.0 or (2) for ACPI 2.0+ */ + u32 rsdt_physical_address; /* 32-bit physical address of the RSDT */ + u32 length; /* Table length in bytes, including header (ACPI 2.0+) */ + u64 xsdt_physical_address; /* 64-bit physical address of the XSDT (ACPI 2.0+) */ + u8 extended_checksum; /* Checksum of entire table (ACPI 2.0+) */ + u8 reserved[3]; /* Reserved, must be zero */ +}; -#define DUAL_PIC 0 -#define MULTIPLE_APIC 1 +#define ACPI_RSDP_REV0_SIZE 20 /* Size of original ACPI 1.0 RSDP */ -/* Master MADT */ +/******************************************************************************* + * + * RSDT/XSDT - Root System Description Tables + * + ******************************************************************************/ -struct multiple_apic_table { - ACPI_TABLE_HEADER_DEF /* ACPI common table header */ - u32 local_apic_address; /* Physical address of local APIC */ +struct rsdt_descriptor { + ACPI_TABLE_HEADER_DEF u32 table_offset_entry[1]; /* Array of pointers to ACPI tables */ +}; + +struct xsdt_descriptor { + ACPI_TABLE_HEADER_DEF u64 table_offset_entry[1]; /* Array of pointers to ACPI tables */ +}; + +/******************************************************************************* + * + * FACS - Firmware ACPI Control Structure (FACS) + * + ******************************************************************************/ + +struct facs_descriptor { + char signature[4]; /* ASCII table signature */ + u32 length; /* Length of structure, in bytes */ + u32 hardware_signature; /* Hardware configuration signature */ + u32 firmware_waking_vector; /* 32-bit physical address of the Firmware Waking Vector */ + u32 global_lock; /* Global Lock for shared hardware resources */ /* Flags (32 bits) */ - u8 PCATcompat:1; /* 00: System also has dual 8259s */ + u8 S4bios_f:1; /* 00: S4BIOS support is present */ u8:7; /* 01-07: Reserved, must be zero */ u8 reserved1[3]; /* 08-31: Reserved, must be zero */ -}; -/* Values for Type in APIC_HEADER_DEF */ + u64 xfirmware_waking_vector; /* 64-bit version of the Firmware Waking Vector (ACPI 2.0+) */ + u8 version; /* Version of this table (ACPI 2.0+) */ + u8 reserved[31]; /* Reserved, must be zero */ +}; -#define APIC_PROCESSOR 0 -#define APIC_IO 1 -#define APIC_XRUPT_OVERRIDE 2 -#define APIC_NMI 3 -#define APIC_LOCAL_NMI 4 -#define APIC_ADDRESS_OVERRIDE 5 -#define APIC_IO_SAPIC 6 -#define APIC_LOCAL_SAPIC 7 -#define APIC_XRUPT_SOURCE 8 -#define APIC_RESERVED 9 /* 9 and greater are reserved */ +#define ACPI_GLOCK_PENDING 0x01 /* 00: Pending global lock ownership */ +#define ACPI_GLOCK_OWNED 0x02 /* 01: Global lock is owned */ /* - * MADT sub-structures (Follow MULTIPLE_APIC_DESCRIPTION_TABLE) + * Common FACS - This is a version-independent FACS structure used for internal use only */ -#define APIC_HEADER_DEF /* Common APIC sub-structure header */\ - u8 type; \ - u8 length; - -struct apic_header { -APIC_HEADER_DEF}; - -/* Values for MPS INTI flags */ - -#define POLARITY_CONFORMS 0 -#define POLARITY_ACTIVE_HIGH 1 -#define POLARITY_RESERVED 2 -#define POLARITY_ACTIVE_LOW 3 - -#define TRIGGER_CONFORMS 0 -#define TRIGGER_EDGE 1 -#define TRIGGER_RESERVED 2 -#define TRIGGER_LEVEL 3 - -/* Common flag definitions (16 bits each) */ - -#define MPS_INTI_FLAGS \ - u8 polarity : 2; /* 00-01: Polarity of APIC I/O input signals */\ - u8 trigger_mode : 2; /* 02-03: Trigger mode of APIC input signals */\ - u8 : 4; /* 04-07: Reserved, must be zero */\ - u8 reserved1; /* 08-15: Reserved, must be zero */ - -#define LOCAL_APIC_FLAGS \ - u8 processor_enabled: 1; /* 00: Processor is usable if set */\ - u8 : 7; /* 01-07: Reserved, must be zero */\ - u8 reserved2; /* 08-15: Reserved, must be zero */ - -/* Sub-structures for MADT */ - -struct madt_processor_apic { - APIC_HEADER_DEF u8 processor_id; /* ACPI processor id */ - u8 local_apic_id; /* Processor's local APIC id */ - LOCAL_APIC_FLAGS}; - -struct madt_io_apic { - APIC_HEADER_DEF u8 io_apic_id; /* I/O APIC ID */ - u8 reserved; /* Reserved - must be zero */ - u32 address; /* APIC physical address */ - u32 interrupt; /* Global system interrupt where INTI - * lines start */ +struct acpi_common_facs { + u32 *global_lock; + u64 *firmware_waking_vector; + u8 vector_width; }; -struct madt_interrupt_override { - APIC_HEADER_DEF u8 bus; /* 0 - ISA */ - u8 source; /* Interrupt source (IRQ) */ - u32 interrupt; /* Global system interrupt */ - MPS_INTI_FLAGS}; +/******************************************************************************* + * + * FADT - Fixed ACPI Description Table (Signature "FACP") + * + ******************************************************************************/ + +/* Fields common to all versions of the FADT */ + +#define ACPI_FADT_COMMON \ + ACPI_TABLE_HEADER_DEF \ + u32 V1_firmware_ctrl; /* 32-bit physical address of FACS */ \ + u32 V1_dsdt; /* 32-bit physical address of DSDT */ \ + u8 reserved1; /* System Interrupt Model isn't used in ACPI 2.0*/ \ + u8 prefer_PM_profile; /* Conveys preferred power management profile to OSPM. */ \ + u16 sci_int; /* System vector of SCI interrupt */ \ + u32 smi_cmd; /* Port address of SMI command port */ \ + u8 acpi_enable; /* Value to write to smi_cmd to enable ACPI */ \ + u8 acpi_disable; /* Value to write to smi_cmd to disable ACPI */ \ + u8 S4bios_req; /* Value to write to SMI CMD to enter S4BIOS state */ \ + u8 pstate_cnt; /* Processor performance state control*/ \ + u32 V1_pm1a_evt_blk; /* Port address of Power Mgt 1a Event Reg Blk */ \ + u32 V1_pm1b_evt_blk; /* Port address of Power Mgt 1b Event Reg Blk */ \ + u32 V1_pm1a_cnt_blk; /* Port address of Power Mgt 1a Control Reg Blk */ \ + u32 V1_pm1b_cnt_blk; /* Port address of Power Mgt 1b Control Reg Blk */ \ + u32 V1_pm2_cnt_blk; /* Port address of Power Mgt 2 Control Reg Blk */ \ + u32 V1_pm_tmr_blk; /* Port address of Power Mgt Timer Ctrl Reg Blk */ \ + u32 V1_gpe0_blk; /* Port addr of General Purpose acpi_event 0 Reg Blk */ \ + u32 V1_gpe1_blk; /* Port addr of General Purpose acpi_event 1 Reg Blk */ \ + u8 pm1_evt_len; /* Byte Length of ports at pm1_x_evt_blk */ \ + u8 pm1_cnt_len; /* Byte Length of ports at pm1_x_cnt_blk */ \ + u8 pm2_cnt_len; /* Byte Length of ports at pm2_cnt_blk */ \ + u8 pm_tm_len; /* Byte Length of ports at pm_tm_blk */ \ + u8 gpe0_blk_len; /* Byte Length of ports at gpe0_blk */ \ + u8 gpe1_blk_len; /* Byte Length of ports at gpe1_blk */ \ + u8 gpe1_base; /* Offset in gpe model where gpe1 events start */ \ + u8 cst_cnt; /* Support for the _CST object and C States change notification.*/ \ + u16 plvl2_lat; /* Worst case HW latency to enter/exit C2 state */ \ + u16 plvl3_lat; /* Worst case HW latency to enter/exit C3 state */ \ + u16 flush_size; /* Processor's memory cache line width, in bytes */ \ + u16 flush_stride; /* Number of flush strides that need to be read */ \ + u8 duty_offset; /* Processor's duty cycle index in processor's P_CNT reg*/ \ + u8 duty_width; /* Processor's duty cycle value bit width in P_CNT register.*/ \ + u8 day_alrm; /* Index to day-of-month alarm in RTC CMOS RAM */ \ + u8 mon_alrm; /* Index to month-of-year alarm in RTC CMOS RAM */ \ + u8 century; /* Index to century in RTC CMOS RAM */ \ + u16 iapc_boot_arch; /* IA-PC Boot Architecture Flags. See Table 5-10 for description*/ \ + u8 reserved2; /* Reserved, must be zero */ -struct madt_nmi_source { - APIC_HEADER_DEF MPS_INTI_FLAGS u32 interrupt; /* Global system interrupt */ +/* + * ACPI 2.0+ FADT + */ +struct fadt_descriptor { + ACPI_FADT_COMMON + /* Flags (32 bits) */ + u8 wb_invd:1; /* 00: The wbinvd instruction works properly */ + u8 wb_invd_flush:1; /* 01: The wbinvd flushes but does not invalidate */ + u8 proc_c1:1; /* 02: All processors support C1 state */ + u8 plvl2_up:1; /* 03: C2 state works on MP system */ + u8 pwr_button:1; /* 04: Power button is handled as a generic feature */ + u8 sleep_button:1; /* 05: Sleep button is handled as a generic feature, or not present */ + u8 fixed_rTC:1; /* 06: RTC wakeup stat not in fixed register space */ + u8 rtcs4:1; /* 07: RTC wakeup stat not possible from S4 */ + u8 tmr_val_ext:1; /* 08: tmr_val is 32 bits 0=24-bits */ + u8 dock_cap:1; /* 09: Docking supported */ + u8 reset_reg_sup:1; /* 10: System reset via the FADT RESET_REG supported */ + u8 sealed_case:1; /* 11: No internal expansion capabilities and case is sealed */ + u8 headless:1; /* 12: No local video capabilities or local input devices */ + u8 cpu_sw_sleep:1; /* 13: Must execute native instruction after writing SLP_TYPx register */ + + u8 pci_exp_wak:1; /* 14: System supports PCIEXP_WAKE (STS/EN) bits (ACPI 3.0) */ + u8 use_platform_clock:1; /* 15: OSPM should use platform-provided timer (ACPI 3.0) */ + u8 S4rtc_sts_valid:1; /* 16: Contents of RTC_STS valid after S4 wake (ACPI 3.0) */ + u8 remote_power_on_capable:1; /* 17: System is compatible with remote power on (ACPI 3.0) */ + u8 force_apic_cluster_model:1; /* 18: All local APICs must use cluster model (ACPI 3.0) */ + u8 force_apic_physical_destination_mode:1; /* 19: All local x_aPICs must use physical dest mode (ACPI 3.0) */ + u8:4; /* 20-23: Reserved, must be zero */ + u8 reserved3; /* 24-31: Reserved, must be zero */ + + struct acpi_generic_address reset_register; /* Reset register address in GAS format */ + u8 reset_value; /* Value to write to the reset_register port to reset the system */ + u8 reserved4[3]; /* These three bytes must be zero */ + u64 xfirmware_ctrl; /* 64-bit physical address of FACS */ + u64 Xdsdt; /* 64-bit physical address of DSDT */ + struct acpi_generic_address xpm1a_evt_blk; /* Extended Power Mgt 1a acpi_event Reg Blk address */ + struct acpi_generic_address xpm1b_evt_blk; /* Extended Power Mgt 1b acpi_event Reg Blk address */ + struct acpi_generic_address xpm1a_cnt_blk; /* Extended Power Mgt 1a Control Reg Blk address */ + struct acpi_generic_address xpm1b_cnt_blk; /* Extended Power Mgt 1b Control Reg Blk address */ + struct acpi_generic_address xpm2_cnt_blk; /* Extended Power Mgt 2 Control Reg Blk address */ + struct acpi_generic_address xpm_tmr_blk; /* Extended Power Mgt Timer Ctrl Reg Blk address */ + struct acpi_generic_address xgpe0_blk; /* Extended General Purpose acpi_event 0 Reg Blk address */ + struct acpi_generic_address xgpe1_blk; /* Extended General Purpose acpi_event 1 Reg Blk address */ }; -struct madt_local_apic_nmi { - APIC_HEADER_DEF u8 processor_id; /* ACPI processor id */ - MPS_INTI_FLAGS u8 lint; /* LINTn to which NMI is connected */ +/* + * "Down-revved" ACPI 2.0 FADT descriptor + * Defined here to allow compiler to generate the length of the struct + */ +struct fadt_descriptor_rev2_minus { + ACPI_FADT_COMMON u32 flags; + struct acpi_generic_address reset_register; /* Reset register address in GAS format */ + u8 reset_value; /* Value to write to the reset_register port to reset the system. */ + u8 reserved7[3]; /* Reserved, must be zero */ }; -struct madt_address_override { - APIC_HEADER_DEF u16 reserved; /* Reserved, must be zero */ - u64 address; /* APIC physical address */ +/* + * ACPI 1.0 FADT + * Defined here to allow compiler to generate the length of the struct + */ +struct fadt_descriptor_rev1 { + ACPI_FADT_COMMON u32 flags; }; -struct madt_io_sapic { - APIC_HEADER_DEF u8 io_sapic_id; /* I/O SAPIC ID */ - u8 reserved; /* Reserved, must be zero */ - u32 interrupt_base; /* Glocal interrupt for SAPIC start */ - u64 address; /* SAPIC physical address */ -}; +/* FADT: Prefered Power Management Profiles */ -struct madt_local_sapic { - APIC_HEADER_DEF u8 processor_id; /* ACPI processor id */ - u8 local_sapic_id; /* SAPIC ID */ - u8 local_sapic_eid; /* SAPIC EID */ - u8 reserved[3]; /* Reserved, must be zero */ - LOCAL_APIC_FLAGS u32 processor_uID; /* Numeric UID - ACPI 3.0 */ - char processor_uIDstring[1]; /* String UID - ACPI 3.0 */ -}; +#define PM_UNSPECIFIED 0 +#define PM_DESKTOP 1 +#define PM_MOBILE 2 +#define PM_WORKSTATION 3 +#define PM_ENTERPRISE_SERVER 4 +#define PM_SOHO_SERVER 5 +#define PM_APPLIANCE_PC 6 -struct madt_interrupt_source { - APIC_HEADER_DEF MPS_INTI_FLAGS u8 interrupt_type; /* 1=PMI, 2=INIT, 3=corrected */ - u8 processor_id; /* Processor ID */ - u8 processor_eid; /* Processor EID */ - u8 io_sapic_vector; /* Vector value for PMI interrupts */ - u32 interrupt; /* Global system interrupt */ - u32 flags; /* Interrupt Source Flags */ -}; +/* FADT: Boot Arch Flags */ -/* - * Smart Battery - */ -struct smart_battery_table { - ACPI_TABLE_HEADER_DEF u32 warning_level; - u32 low_level; - u32 critical_level; -}; +#define BAF_LEGACY_DEVICES 0x0001 +#define BAF_8042_KEYBOARD_CONTROLLER 0x0002 + +#define FADT2_REVISION_ID 3 +#define FADT2_MINUS_REVISION_ID 2 + +/* Reset to default packing */ #pragma pack() +/* + * This macro is temporary until the table bitfield flag definitions + * are removed and replaced by a Flags field. + */ +#define ACPI_FLAG_OFFSET(d,f,o) (u8) (ACPI_OFFSET (d,f) + \ + sizeof(((d *)0)->f) + o) +/* + * Get the remaining ACPI tables + */ +#include "actbl1.h" + /* * ACPI Table information. We save the table address, length, * and type of memory allocation (mapped or allocated) for each @@ -290,27 +354,17 @@ struct acpi_table_support { u8 flags; }; -/* - * Get the ACPI version-specific tables - */ -#include "actbl1.h" /* Acpi 1.0 table definitions */ -#include "actbl2.h" /* Acpi 2.0 table definitions */ - extern u8 acpi_fadt_is_v1; /* is set to 1 if FADT is revision 1, * needed for certain workarounds */ +/* Macros used to generate offsets to specific table fields */ -#pragma pack(1) -/* - * High performance timer - */ -struct hpet_table { - ACPI_TABLE_HEADER_DEF u32 hardware_id; - struct acpi_generic_address base_address; - u8 hpet_number; - u16 clock_tick; - u8 attributes; -}; +#define ACPI_FACS_OFFSET(f) (u8) ACPI_OFFSET (struct facs_descriptor,f) +#define ACPI_FADT_OFFSET(f) (u8) ACPI_OFFSET (struct fadt_descriptor, f) +#define ACPI_GAS_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_generic_address,f) +#define ACPI_HDR_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_table_header,f) +#define ACPI_RSDP_OFFSET(f) (u8) ACPI_OFFSET (struct rsdp_descriptor,f) -#pragma pack() +#define ACPI_FADT_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (struct fadt_descriptor,f,o) +#define ACPI_FACS_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (struct facs_descriptor,f,o) #endif /* __ACTBL_H__ */ diff --git a/include/acpi/actbl1.h b/include/acpi/actbl1.h index cd428d57a..745a6445a 100644 --- a/include/acpi/actbl1.h +++ b/include/acpi/actbl1.h @@ -1,6 +1,6 @@ /****************************************************************************** * - * Name: actbl1.h - ACPI 1.0 tables + * Name: actbl1.h - Additional ACPI table definitions * *****************************************************************************/ @@ -44,92 +44,599 @@ #ifndef __ACTBL1_H__ #define __ACTBL1_H__ +/******************************************************************************* + * + * Additional ACPI Tables + * + * These tables are not consumed directly by the ACPICA subsystem, but are + * included here to support device drivers and the AML disassembler. + * + ******************************************************************************/ + +/* + * Values for description table header signatures. Useful because they make + * it more difficult to inadvertently type in the wrong signature. + */ +#define ACPI_SIG_ASF "ASF!" /* Alert Standard Format table */ +#define ACPI_SIG_BOOT "BOOT" /* Simple Boot Flag Table */ +#define ACPI_SIG_CPEP "CPEP" /* Corrected Platform Error Polling table */ +#define ACPI_SIG_DBGP "DBGP" /* Debug Port table */ +#define ACPI_SIG_ECDT "ECDT" /* Embedded Controller Boot Resources Table */ +#define ACPI_SIG_HPET "HPET" /* High Precision Event Timer table */ +#define ACPI_SIG_MADT "APIC" /* Multiple APIC Description Table */ +#define ACPI_SIG_MCFG "MCFG" /* PCI Memory Mapped Configuration table */ +#define ACPI_SIG_SBST "SBST" /* Smart Battery Specification Table */ +#define ACPI_SIG_SLIT "SLIT" /* System Locality Distance Information Table */ +#define ACPI_SIG_SPCR "SPCR" /* Serial Port Console Redirection table */ +#define ACPI_SIG_SPMI "SPMI" /* Server Platform Management Interface table */ +#define ACPI_SIG_SRAT "SRAT" /* System Resource Affinity Table */ +#define ACPI_SIG_TCPA "TCPA" /* Trusted Computing Platform Alliance table */ +#define ACPI_SIG_WDRT "WDRT" /* Watchdog Resource Table */ + +/* Legacy names */ + +#define APIC_SIG "APIC" /* Multiple APIC Description Table */ +#define BOOT_SIG "BOOT" /* Simple Boot Flag Table */ +#define SBST_SIG "SBST" /* Smart Battery Specification Table */ + +/* + * All tables must be byte-packed to match the ACPI specification, since + * the tables are provided by the system BIOS. + */ #pragma pack(1) /* - * ACPI 1.0 Root System Description Table (RSDT) + * Note about bitfields: The u8 type is used for bitfields in ACPI tables. + * This is the only type that is even remotely portable. Anything else is not + * portable, so do not use any other bitfield types. */ -struct rsdt_descriptor_rev1 { - ACPI_TABLE_HEADER_DEF /* ACPI common table header */ - u32 table_offset_entry[1]; /* Array of pointers to ACPI tables */ -}; + +/******************************************************************************* + * + * ASF - Alert Standard Format table (Signature "ASF!") + * + ******************************************************************************/ + +struct acpi_table_asf { +ACPI_TABLE_HEADER_DEF}; + +#define ACPI_ASF_HEADER_DEF \ + u8 type; \ + u8 reserved; \ + u16 length; + +struct acpi_asf_header { +ACPI_ASF_HEADER_DEF}; + +/* Values for Type field */ + +#define ASF_INFO 0 +#define ASF_ALERT 1 +#define ASF_CONTROL 2 +#define ASF_BOOT 3 +#define ASF_ADDRESS 4 +#define ASF_RESERVED 5 /* - * ACPI 1.0 Firmware ACPI Control Structure (FACS) + * ASF subtables */ -struct facs_descriptor_rev1 { - char signature[4]; /* ASCII table signature */ - u32 length; /* Length of structure in bytes */ - u32 hardware_signature; /* Hardware configuration signature */ - u32 firmware_waking_vector; /* ACPI OS waking vector */ - u32 global_lock; /* Global Lock */ + +/* 0: ASF Information */ + +struct acpi_asf_info { + ACPI_ASF_HEADER_DEF u8 min_reset_value; + u8 min_poll_interval; + u16 system_id; + u32 mfg_id; + u8 flags; + u8 reserved2[3]; +}; + +/* 1: ASF Alerts */ + +struct acpi_asf_alert { + ACPI_ASF_HEADER_DEF u8 assert_mask; + u8 deassert_mask; + u8 alerts; + u8 data_length; + u8 array[1]; +}; + +/* 2: ASF Remote Control */ + +struct acpi_asf_remote { + ACPI_ASF_HEADER_DEF u8 controls; + u8 data_length; + u16 reserved2; + u8 array[1]; +}; + +/* 3: ASF RMCP Boot Options */ + +struct acpi_asf_rmcp { + ACPI_ASF_HEADER_DEF u8 capabilities[7]; + u8 completion_code; + u32 enterprise_id; + u8 command; + u16 parameter; + u16 boot_options; + u16 oem_parameters; +}; + +/* 4: ASF Address */ + +struct acpi_asf_address { + ACPI_ASF_HEADER_DEF u8 eprom_address; + u8 devices; + u8 smbus_addresses[1]; +}; + +/******************************************************************************* + * + * BOOT - Simple Boot Flag Table + * + ******************************************************************************/ + +struct acpi_table_boot { + ACPI_TABLE_HEADER_DEF u8 cmos_index; /* Index in CMOS RAM for the boot register */ + u8 reserved[3]; +}; + +/******************************************************************************* + * + * CPEP - Corrected Platform Error Polling table + * + ******************************************************************************/ + +struct acpi_table_cpep { + ACPI_TABLE_HEADER_DEF u64 reserved; +}; + +/* Subtable */ + +struct acpi_cpep_polling { + u8 type; + u8 length; + u8 processor_id; /* Processor ID */ + u8 processor_eid; /* Processor EID */ + u32 polling_interval; /* Polling interval (msec) */ +}; + +/******************************************************************************* + * + * DBGP - Debug Port table + * + ******************************************************************************/ + +struct acpi_table_dbgp { + ACPI_TABLE_HEADER_DEF u8 interface_type; /* 0=full 16550, 1=subset of 16550 */ + u8 reserved[3]; + struct acpi_generic_address debug_port; +}; + +/******************************************************************************* + * + * ECDT - Embedded Controller Boot Resources Table + * + ******************************************************************************/ + +struct ec_boot_resources { + ACPI_TABLE_HEADER_DEF struct acpi_generic_address ec_control; /* Address of EC command/status register */ + struct acpi_generic_address ec_data; /* Address of EC data register */ + u32 uid; /* Unique ID - must be same as the EC _UID method */ + u8 gpe_bit; /* The GPE for the EC */ + u8 ec_id[1]; /* Full namepath of the EC in the ACPI namespace */ +}; + +/******************************************************************************* + * + * HPET - High Precision Event Timer table + * + ******************************************************************************/ + +struct acpi_hpet_table { + ACPI_TABLE_HEADER_DEF u32 hardware_id; /* Hardware ID of event timer block */ + struct acpi_generic_address base_address; /* Address of event timer block */ + u8 hpet_number; /* HPET sequence number */ + u16 clock_tick; /* Main counter min tick, periodic mode */ + u8 attributes; +}; + +#if 0 /* HPET flags to be converted to macros */ +struct { /* Flags (8 bits) */ + u8 page_protect:1; /* 00: No page protection */ + u8 page_protect4:1; /* 01: 4_kB page protected */ + u8 page_protect64:1; /* 02: 64_kB page protected */ + u8:5; /* 03-07: Reserved, must be zero */ +} flags; +#endif + +/******************************************************************************* + * + * MADT - Multiple APIC Description Table + * + ******************************************************************************/ + +struct multiple_apic_table { + ACPI_TABLE_HEADER_DEF u32 local_apic_address; /* Physical address of local APIC */ /* Flags (32 bits) */ - u8 S4bios_f:1; /* 00: S4BIOS support is present */ + u8 PCATcompat:1; /* 00: System also has dual 8259s */ u8:7; /* 01-07: Reserved, must be zero */ u8 reserved1[3]; /* 08-31: Reserved, must be zero */ - - u8 reserved2[40]; /* Reserved, must be zero */ }; +/* Values for MADT PCATCompat */ + +#define DUAL_PIC 0 +#define MULTIPLE_APIC 1 + +/* Common MADT Sub-table header */ + +#define APIC_HEADER_DEF \ + u8 type; \ + u8 length; + +struct apic_header { +APIC_HEADER_DEF}; + +/* Values for Type in struct apic_header */ + +#define APIC_PROCESSOR 0 +#define APIC_IO 1 +#define APIC_XRUPT_OVERRIDE 2 +#define APIC_NMI 3 +#define APIC_LOCAL_NMI 4 +#define APIC_ADDRESS_OVERRIDE 5 +#define APIC_IO_SAPIC 6 +#define APIC_LOCAL_SAPIC 7 +#define APIC_XRUPT_SOURCE 8 +#define APIC_RESERVED 9 /* 9 and greater are reserved */ + +/* Flag definitions for MADT sub-tables */ + +#define ACPI_MADT_IFLAGS /* INTI flags (16 bits) */ \ + u8 polarity : 2; /* 00-01: Polarity of APIC I/O input signals */\ + u8 trigger_mode : 2; /* 02-03: Trigger mode of APIC input signals */\ + u8 : 4; /* 04-07: Reserved, must be zero */\ + u8 reserved1; /* 08-15: Reserved, must be zero */ + +#define ACPI_MADT_LFLAGS /* Local Sapic flags (32 bits) */ \ + u8 processor_enabled: 1; /* 00: Processor is usable if set */\ + u8 : 7; /* 01-07: Reserved, must be zero */\ + u8 reserved2[3]; /* 08-31: Reserved, must be zero */ + +/* Values for MPS INTI flags */ + +#define POLARITY_CONFORMS 0 +#define POLARITY_ACTIVE_HIGH 1 +#define POLARITY_RESERVED 2 +#define POLARITY_ACTIVE_LOW 3 + +#define TRIGGER_CONFORMS 0 +#define TRIGGER_EDGE 1 +#define TRIGGER_RESERVED 2 +#define TRIGGER_LEVEL 3 + /* - * ACPI 1.0 Fixed ACPI Description Table (FADT) + * MADT Sub-tables, correspond to Type in struct apic_header */ -struct fadt_descriptor_rev1 { - ACPI_TABLE_HEADER_DEF /* ACPI common table header */ - u32 firmware_ctrl; /* Physical address of FACS */ - u32 dsdt; /* Physical address of DSDT */ - u8 model; /* System Interrupt Model */ - u8 reserved1; /* Reserved, must be zero */ - u16 sci_int; /* System vector of SCI interrupt */ - u32 smi_cmd; /* Port address of SMI command port */ - u8 acpi_enable; /* Value to write to smi_cmd to enable ACPI */ - u8 acpi_disable; /* Value to write to smi_cmd to disable ACPI */ - u8 S4bios_req; /* Value to write to SMI CMD to enter S4BIOS state */ - u8 reserved2; /* Reserved, must be zero */ - u32 pm1a_evt_blk; /* Port address of Power Mgt 1a acpi_event Reg Blk */ - u32 pm1b_evt_blk; /* Port address of Power Mgt 1b acpi_event Reg Blk */ - u32 pm1a_cnt_blk; /* Port address of Power Mgt 1a Control Reg Blk */ - u32 pm1b_cnt_blk; /* Port address of Power Mgt 1b Control Reg Blk */ - u32 pm2_cnt_blk; /* Port address of Power Mgt 2 Control Reg Blk */ - u32 pm_tmr_blk; /* Port address of Power Mgt Timer Ctrl Reg Blk */ - u32 gpe0_blk; /* Port addr of General Purpose acpi_event 0 Reg Blk */ - u32 gpe1_blk; /* Port addr of General Purpose acpi_event 1 Reg Blk */ - u8 pm1_evt_len; /* Byte length of ports at pm1_x_evt_blk */ - u8 pm1_cnt_len; /* Byte length of ports at pm1_x_cnt_blk */ - u8 pm2_cnt_len; /* Byte Length of ports at pm2_cnt_blk */ - u8 pm_tm_len; /* Byte Length of ports at pm_tm_blk */ - u8 gpe0_blk_len; /* Byte Length of ports at gpe0_blk */ - u8 gpe1_blk_len; /* Byte Length of ports at gpe1_blk */ - u8 gpe1_base; /* Offset in gpe model where gpe1 events start */ - u8 reserved3; /* Reserved, must be zero */ - u16 plvl2_lat; /* Worst case HW latency to enter/exit C2 state */ - u16 plvl3_lat; /* Worst case HW latency to enter/exit C3 state */ - u16 flush_size; /* Size of area read to flush caches */ - u16 flush_stride; /* Stride used in flushing caches */ - u8 duty_offset; /* Bit location of duty cycle field in p_cnt reg */ - u8 duty_width; /* Bit width of duty cycle field in p_cnt reg */ - u8 day_alrm; /* Index to day-of-month alarm in RTC CMOS RAM */ - u8 mon_alrm; /* Index to month-of-year alarm in RTC CMOS RAM */ - u8 century; /* Index to century in RTC CMOS RAM */ - u8 reserved4[3]; /* Reserved, must be zero */ + +/* 0: processor APIC */ + +struct madt_processor_apic { + APIC_HEADER_DEF u8 processor_id; /* ACPI processor id */ + u8 local_apic_id; /* Processor's local APIC id */ + ACPI_MADT_LFLAGS}; + +/* 1: IO APIC */ + +struct madt_io_apic { + APIC_HEADER_DEF u8 io_apic_id; /* I/O APIC ID */ + u8 reserved; /* Reserved - must be zero */ + u32 address; /* APIC physical address */ + u32 interrupt; /* Global system interrupt where INTI lines start */ +}; + +/* 2: Interrupt Override */ + +struct madt_interrupt_override { + APIC_HEADER_DEF u8 bus; /* 0 - ISA */ + u8 source; /* Interrupt source (IRQ) */ + u32 interrupt; /* Global system interrupt */ + ACPI_MADT_IFLAGS}; + +/* 3: NMI Sources */ + +struct madt_nmi_source { + APIC_HEADER_DEF ACPI_MADT_IFLAGS u32 interrupt; /* Global system interrupt */ +}; + +/* 4: Local APIC NMI */ + +struct madt_local_apic_nmi { + APIC_HEADER_DEF u8 processor_id; /* ACPI processor id */ + ACPI_MADT_IFLAGS u8 lint; /* LINTn to which NMI is connected */ +}; + +/* 5: Address Override */ + +struct madt_address_override { + APIC_HEADER_DEF u16 reserved; /* Reserved, must be zero */ + u64 address; /* APIC physical address */ +}; + +/* 6: I/O Sapic */ + +struct madt_io_sapic { + APIC_HEADER_DEF u8 io_sapic_id; /* I/O SAPIC ID */ + u8 reserved; /* Reserved, must be zero */ + u32 interrupt_base; /* Glocal interrupt for SAPIC start */ + u64 address; /* SAPIC physical address */ +}; + +/* 7: Local Sapic */ + +struct madt_local_sapic { + APIC_HEADER_DEF u8 processor_id; /* ACPI processor id */ + u8 local_sapic_id; /* SAPIC ID */ + u8 local_sapic_eid; /* SAPIC EID */ + u8 reserved[3]; /* Reserved, must be zero */ + ACPI_MADT_LFLAGS u32 processor_uID; /* Numeric UID - ACPI 3.0 */ + char processor_uIDstring[1]; /* String UID - ACPI 3.0 */ +}; + +/* 8: Platform Interrupt Source */ + +struct madt_interrupt_source { + APIC_HEADER_DEF ACPI_MADT_IFLAGS u8 interrupt_type; /* 1=PMI, 2=INIT, 3=corrected */ + u8 processor_id; /* Processor ID */ + u8 processor_eid; /* Processor EID */ + u8 io_sapic_vector; /* Vector value for PMI interrupts */ + u32 interrupt; /* Global system interrupt */ + u32 flags; /* Interrupt Source Flags */ +}; + +#ifdef DUPLICATE_DEFINITION_WITH_LINUX_ACPI_H +/******************************************************************************* + * + * MCFG - PCI Memory Mapped Configuration table and sub-table + * + ******************************************************************************/ + +struct acpi_table_mcfg { + ACPI_TABLE_HEADER_DEF u8 reserved[8]; +}; + +struct acpi_mcfg_allocation { + u64 base_address; /* Base address, processor-relative */ + u16 pci_segment; /* PCI segment group number */ + u8 start_bus_number; /* Starting PCI Bus number */ + u8 end_bus_number; /* Final PCI Bus number */ + u32 reserved; +}; +#endif + +/******************************************************************************* + * + * SBST - Smart Battery Specification Table + * + ******************************************************************************/ + +struct smart_battery_table { + ACPI_TABLE_HEADER_DEF u32 warning_level; + u32 low_level; + u32 critical_level; +}; + +/******************************************************************************* + * + * SLIT - System Locality Distance Information Table + * + ******************************************************************************/ + +struct system_locality_info { + ACPI_TABLE_HEADER_DEF u64 locality_count; + u8 entry[1][1]; +}; + +/******************************************************************************* + * + * SPCR - Serial Port Console Redirection table + * + ******************************************************************************/ + +struct acpi_table_spcr { + ACPI_TABLE_HEADER_DEF u8 interface_type; /* 0=full 16550, 1=subset of 16550 */ + u8 reserved[3]; + struct acpi_generic_address serial_port; + u8 interrupt_type; + u8 pc_interrupt; + u32 interrupt; + u8 baud_rate; + u8 parity; + u8 stop_bits; + u8 flow_control; + u8 terminal_type; + u8 reserved2; + u16 pci_device_id; + u16 pci_vendor_id; + u8 pci_bus; + u8 pci_device; + u8 pci_function; + u32 pci_flags; + u8 pci_segment; + u32 reserved3; +}; + +/******************************************************************************* + * + * SPMI - Server Platform Management Interface table + * + ******************************************************************************/ + +struct acpi_table_spmi { + ACPI_TABLE_HEADER_DEF u8 reserved; + u8 interface_type; + u16 spec_revision; /* Version of IPMI */ + u8 interrupt_type; + u8 gpe_number; /* GPE assigned */ + u8 reserved2; + u8 pci_device_flag; + u32 interrupt; + struct acpi_generic_address ipmi_register; + u8 pci_segment; + u8 pci_bus; + u8 pci_device; + u8 pci_function; +}; + +/******************************************************************************* + * + * SRAT - System Resource Affinity Table + * + ******************************************************************************/ + +struct system_resource_affinity { + ACPI_TABLE_HEADER_DEF u32 reserved1; /* Must be value '1' */ + u64 reserved2; /* Reserved, must be zero */ +}; + +/* SRAT common sub-table header */ + +#define SRAT_SUBTABLE_HEADER \ + u8 type; \ + u8 length; + +/* Values for Type above */ + +#define SRAT_CPU_AFFINITY 0 +#define SRAT_MEMORY_AFFINITY 1 +#define SRAT_RESERVED 2 + +/* SRAT sub-tables */ + +struct static_resource_alloc { + SRAT_SUBTABLE_HEADER u8 proximity_domain_lo; + u8 apic_id; + + /* Flags (32 bits) */ + + u8 enabled:1; /* 00: Use affinity structure */ + u8:7; /* 01-07: Reserved, must be zero */ + u8 reserved3[3]; /* 08-31: Reserved, must be zero */ + + u8 local_sapic_eid; + u8 proximity_domain_hi[3]; + u32 reserved4; /* Reserved, must be zero */ +}; + +struct memory_affinity { + SRAT_SUBTABLE_HEADER u32 proximity_domain; + u16 reserved3; + u64 base_address; + u64 address_length; + u32 reserved4; /* Flags (32 bits) */ - u8 wb_invd:1; /* 00: The wbinvd instruction works properly */ - u8 wb_invd_flush:1; /* 01: The wbinvd flushes but does not invalidate */ - u8 proc_c1:1; /* 02: All processors support C1 state */ - u8 plvl2_up:1; /* 03: C2 state works on MP system */ - u8 pwr_button:1; /* 04: Power button is handled as a generic feature */ - u8 sleep_button:1; /* 05: Sleep button is handled as a generic feature, or not present */ - u8 fixed_rTC:1; /* 06: RTC wakeup stat not in fixed register space */ - u8 rtcs4:1; /* 07: RTC wakeup stat not possible from S4 */ - u8 tmr_val_ext:1; /* 08: tmr_val width is 32 bits (0 = 24 bits) */ - u8:7; /* 09-15: Reserved, must be zero */ - u8 reserved5[2]; /* 16-31: Reserved, must be zero */ + u8 enabled:1; /* 00: Use affinity structure */ + u8 hot_pluggable:1; /* 01: Memory region is hot pluggable */ + u8 non_volatile:1; /* 02: Memory is non-volatile */ + u8:5; /* 03-07: Reserved, must be zero */ + u8 reserved5[3]; /* 08-31: Reserved, must be zero */ + + u64 reserved6; /* Reserved, must be zero */ +}; + +/******************************************************************************* + * + * TCPA - Trusted Computing Platform Alliance table + * + ******************************************************************************/ + +struct acpi_table_tcpa { + ACPI_TABLE_HEADER_DEF u16 reserved; + u32 max_log_length; /* Maximum length for the event log area */ + u64 log_address; /* Address of the event log area */ }; +/******************************************************************************* + * + * WDRT - Watchdog Resource Table + * + ******************************************************************************/ + +struct acpi_table_wdrt { + ACPI_TABLE_HEADER_DEF u32 header_length; /* Watchdog Header Length */ + u8 pci_segment; /* PCI Segment number */ + u8 pci_bus; /* PCI Bus number */ + u8 pci_device; /* PCI Device number */ + u8 pci_function; /* PCI Function number */ + u32 timer_period; /* Period of one timer count (msec) */ + u32 max_count; /* Maximum counter value supported */ + u32 min_count; /* Minimum counter value */ + u8 flags; + u8 reserved[3]; + u32 entries; /* Number of watchdog entries that follow */ +}; + +#if 0 /* Flags, will be converted to macros */ +u8 enabled:1; /* 00: Timer enabled */ +u8:6; /* 01-06: Reserved */ +u8 sleep_stop:1; /* 07: Timer stopped in sleep state */ +#endif + +/* Macros used to generate offsets to specific table fields */ + +#define ACPI_ASF0_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_asf_info,f) +#define ACPI_ASF1_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_asf_alert,f) +#define ACPI_ASF2_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_asf_remote,f) +#define ACPI_ASF3_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_asf_rmcp,f) +#define ACPI_ASF4_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_asf_address,f) +#define ACPI_BOOT_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_table_boot,f) +#define ACPI_CPEP_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_table_cpep,f) +#define ACPI_CPEP0_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_cpep_polling,f) +#define ACPI_DBGP_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_table_dbgp,f) +#define ACPI_ECDT_OFFSET(f) (u8) ACPI_OFFSET (struct ec_boot_resources,f) +#define ACPI_HPET_OFFSET(f) (u8) ACPI_OFFSET (struct hpet_table,f) +#define ACPI_MADT_OFFSET(f) (u8) ACPI_OFFSET (struct multiple_apic_table,f) +#define ACPI_MADT0_OFFSET(f) (u8) ACPI_OFFSET (struct madt_processor_apic,f) +#define ACPI_MADT1_OFFSET(f) (u8) ACPI_OFFSET (struct madt_io_apic,f) +#define ACPI_MADT2_OFFSET(f) (u8) ACPI_OFFSET (struct madt_interrupt_override,f) +#define ACPI_MADT3_OFFSET(f) (u8) ACPI_OFFSET (struct madt_nmi_source,f) +#define ACPI_MADT4_OFFSET(f) (u8) ACPI_OFFSET (struct madt_local_apic_nmi,f) +#define ACPI_MADT5_OFFSET(f) (u8) ACPI_OFFSET (struct madt_address_override,f) +#define ACPI_MADT6_OFFSET(f) (u8) ACPI_OFFSET (struct madt_io_sapic,f) +#define ACPI_MADT7_OFFSET(f) (u8) ACPI_OFFSET (struct madt_local_sapic,f) +#define ACPI_MADT8_OFFSET(f) (u8) ACPI_OFFSET (struct madt_interrupt_source,f) +#define ACPI_MADTH_OFFSET(f) (u8) ACPI_OFFSET (struct apic_header,f) +#define ACPI_MCFG_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_table_mcfg,f) +#define ACPI_MCFG0_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_mcfg_allocation,f) +#define ACPI_SBST_OFFSET(f) (u8) ACPI_OFFSET (struct smart_battery_table,f) +#define ACPI_SLIT_OFFSET(f) (u8) ACPI_OFFSET (struct system_locality_info,f) +#define ACPI_SPCR_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_table_spcr,f) +#define ACPI_SPMI_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_table_spmi,f) +#define ACPI_SRAT_OFFSET(f) (u8) ACPI_OFFSET (struct system_resource_affinity,f) +#define ACPI_SRAT0_OFFSET(f) (u8) ACPI_OFFSET (struct static_resource_alloc,f) +#define ACPI_SRAT1_OFFSET(f) (u8) ACPI_OFFSET (struct memory_affinity,f) +#define ACPI_TCPA_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_table_tcpa,f) +#define ACPI_WDRT_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_table_wdrt,f) + +#define ACPI_HPET_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (struct hpet_table,f,o) +#define ACPI_SRAT0_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (struct static_resource_alloc,f,o) +#define ACPI_SRAT1_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (struct memory_affinity,f,o) +#define ACPI_MADT_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (struct multiple_apic_table,f,o) +#define ACPI_MADT0_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (struct madt_processor_apic,f,o) +#define ACPI_MADT2_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (struct madt_interrupt_override,f,o) +#define ACPI_MADT3_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (struct madt_nmi_source,f,o) +#define ACPI_MADT4_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (struct madt_local_apic_nmi,f,o) +#define ACPI_MADT7_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (struct madt_local_sapic,f,o) +#define ACPI_MADT8_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (struct madt_interrupt_source,f,o) + +/* Reset to default packing */ + #pragma pack() #endif /* __ACTBL1_H__ */ diff --git a/include/acpi/actbl2.h b/include/acpi/actbl2.h index dfc7ac109..67efe6cad 100644 --- a/include/acpi/actbl2.h +++ b/include/acpi/actbl2.h @@ -44,234 +44,6 @@ #ifndef __ACTBL2_H__ #define __ACTBL2_H__ -/* - * Prefered Power Management Profiles - */ -#define PM_UNSPECIFIED 0 -#define PM_DESKTOP 1 -#define PM_MOBILE 2 -#define PM_WORKSTATION 3 -#define PM_ENTERPRISE_SERVER 4 -#define PM_SOHO_SERVER 5 -#define PM_APPLIANCE_PC 6 - -/* - * ACPI Boot Arch Flags - */ -#define BAF_LEGACY_DEVICES 0x0001 -#define BAF_8042_KEYBOARD_CONTROLLER 0x0002 - -#define FADT2_REVISION_ID 3 -#define FADT2_MINUS_REVISION_ID 2 - -#pragma pack(1) - -/* - * ACPI 2.0 Root System Description Table (RSDT) - */ -struct rsdt_descriptor_rev2 { - ACPI_TABLE_HEADER_DEF /* ACPI common table header */ - u32 table_offset_entry[1]; /* Array of pointers to ACPI tables */ -}; - -/* - * ACPI 2.0 Extended System Description Table (XSDT) - */ -struct xsdt_descriptor_rev2 { - ACPI_TABLE_HEADER_DEF /* ACPI common table header */ - u64 table_offset_entry[1]; /* Array of pointers to ACPI tables */ -}; - -/* - * ACPI 2.0 Firmware ACPI Control Structure (FACS) - */ -struct facs_descriptor_rev2 { - char signature[4]; /* ASCII table signature */ - u32 length; /* Length of structure, in bytes */ - u32 hardware_signature; /* Hardware configuration signature */ - u32 firmware_waking_vector; /* 32-bit physical address of the Firmware Waking Vector. */ - u32 global_lock; /* Global Lock used to synchronize access to shared hardware resources */ - - /* Flags (32 bits) */ - - u8 S4bios_f:1; /* 00: S4BIOS support is present */ - u8:7; /* 01-07: Reserved, must be zero */ - u8 reserved1[3]; /* 08-31: Reserved, must be zero */ - - u64 xfirmware_waking_vector; /* 64-bit physical address of the Firmware Waking Vector. */ - u8 version; /* Version of this table */ - u8 reserved3[31]; /* Reserved, must be zero */ -}; - -/* - * ACPI 2.0+ Generic Address Structure (GAS) - */ -struct acpi_generic_address { - u8 address_space_id; /* Address space where struct or register exists. */ - u8 register_bit_width; /* Size in bits of given register */ - u8 register_bit_offset; /* Bit offset within the register */ - u8 access_width; /* Minimum Access size (ACPI 3.0) */ - u64 address; /* 64-bit address of struct or register */ -}; - -#define FADT_REV2_COMMON \ - u32 V1_firmware_ctrl; /* 32-bit physical address of FACS */ \ - u32 V1_dsdt; /* 32-bit physical address of DSDT */ \ - u8 reserved1; /* System Interrupt Model isn't used in ACPI 2.0*/ \ - u8 prefer_PM_profile; /* Conveys preferred power management profile to OSPM. */ \ - u16 sci_int; /* System vector of SCI interrupt */ \ - u32 smi_cmd; /* Port address of SMI command port */ \ - u8 acpi_enable; /* Value to write to smi_cmd to enable ACPI */ \ - u8 acpi_disable; /* Value to write to smi_cmd to disable ACPI */ \ - u8 S4bios_req; /* Value to write to SMI CMD to enter S4BIOS state */ \ - u8 pstate_cnt; /* Processor performance state control*/ \ - u32 V1_pm1a_evt_blk; /* Port address of Power Mgt 1a acpi_event Reg Blk */ \ - u32 V1_pm1b_evt_blk; /* Port address of Power Mgt 1b acpi_event Reg Blk */ \ - u32 V1_pm1a_cnt_blk; /* Port address of Power Mgt 1a Control Reg Blk */ \ - u32 V1_pm1b_cnt_blk; /* Port address of Power Mgt 1b Control Reg Blk */ \ - u32 V1_pm2_cnt_blk; /* Port address of Power Mgt 2 Control Reg Blk */ \ - u32 V1_pm_tmr_blk; /* Port address of Power Mgt Timer Ctrl Reg Blk */ \ - u32 V1_gpe0_blk; /* Port addr of General Purpose acpi_event 0 Reg Blk */ \ - u32 V1_gpe1_blk; /* Port addr of General Purpose acpi_event 1 Reg Blk */ \ - u8 pm1_evt_len; /* Byte length of ports at pm1_x_evt_blk */ \ - u8 pm1_cnt_len; /* Byte length of ports at pm1_x_cnt_blk */ \ - u8 pm2_cnt_len; /* Byte Length of ports at pm2_cnt_blk */ \ - u8 pm_tm_len; /* Byte Length of ports at pm_tm_blk */ \ - u8 gpe0_blk_len; /* Byte Length of ports at gpe0_blk */ \ - u8 gpe1_blk_len; /* Byte Length of ports at gpe1_blk */ \ - u8 gpe1_base; /* Offset in gpe model where gpe1 events start */ \ - u8 cst_cnt; /* Support for the _CST object and C States change notification.*/ \ - u16 plvl2_lat; /* Worst case HW latency to enter/exit C2 state */ \ - u16 plvl3_lat; /* Worst case HW latency to enter/exit C3 state */ \ - u16 flush_size; /* Number of flush strides that need to be read */ \ - u16 flush_stride; /* Processor's memory cache line width, in bytes */ \ - u8 duty_offset; /* Processor's duty cycle index in processor's P_CNT reg*/ \ - u8 duty_width; /* Processor's duty cycle value bit width in P_CNT register.*/ \ - u8 day_alrm; /* Index to day-of-month alarm in RTC CMOS RAM */ \ - u8 mon_alrm; /* Index to month-of-year alarm in RTC CMOS RAM */ \ - u8 century; /* Index to century in RTC CMOS RAM */ \ - u16 iapc_boot_arch; /* IA-PC Boot Architecture Flags. See Table 5-10 for description*/ - -/* - * ACPI 2.0+ Fixed ACPI Description Table (FADT) - */ -struct fadt_descriptor_rev2 { - ACPI_TABLE_HEADER_DEF /* ACPI common table header */ - FADT_REV2_COMMON u8 reserved2; /* Reserved, must be zero */ - - /* Flags (32 bits) */ - - u8 wb_invd:1; /* 00: The wbinvd instruction works properly */ - u8 wb_invd_flush:1; /* 01: The wbinvd flushes but does not invalidate */ - u8 proc_c1:1; /* 02: All processors support C1 state */ - u8 plvl2_up:1; /* 03: C2 state works on MP system */ - u8 pwr_button:1; /* 04: Power button is handled as a generic feature */ - u8 sleep_button:1; /* 05: Sleep button is handled as a generic feature, or not present */ - u8 fixed_rTC:1; /* 06: RTC wakeup stat not in fixed register space */ - u8 rtcs4:1; /* 07: RTC wakeup stat not possible from S4 */ - u8 tmr_val_ext:1; /* 08: tmr_val is 32 bits 0=24-bits */ - u8 dock_cap:1; /* 09: Docking supported */ - u8 reset_reg_sup:1; /* 10: System reset via the FADT RESET_REG supported */ - u8 sealed_case:1; /* 11: No internal expansion capabilities and case is sealed */ - u8 headless:1; /* 12: No local video capabilities or local input devices */ - u8 cpu_sw_sleep:1; /* 13: Must execute native instruction after writing SLP_TYPx register */ - - u8 pci_exp_wak:1; /* 14: System supports PCIEXP_WAKE (STS/EN) bits (ACPI 3.0) */ - u8 use_platform_clock:1; /* 15: OSPM should use platform-provided timer (ACPI 3.0) */ - u8 S4rtc_sts_valid:1; /* 16: Contents of RTC_STS valid after S4 wake (ACPI 3.0) */ - u8 remote_power_on_capable:1; /* 17: System is compatible with remote power on (ACPI 3.0) */ - u8 force_apic_cluster_model:1; /* 18: All local APICs must use cluster model (ACPI 3.0) */ - u8 force_apic_physical_destination_mode:1; /* 19: all local x_aPICs must use physical dest mode (ACPI 3.0) */ - u8:4; /* 20-23: Reserved, must be zero */ - u8 reserved3; /* 24-31: Reserved, must be zero */ - - struct acpi_generic_address reset_register; /* Reset register address in GAS format */ - u8 reset_value; /* Value to write to the reset_register port to reset the system */ - u8 reserved4[3]; /* These three bytes must be zero */ - u64 xfirmware_ctrl; /* 64-bit physical address of FACS */ - u64 Xdsdt; /* 64-bit physical address of DSDT */ - struct acpi_generic_address xpm1a_evt_blk; /* Extended Power Mgt 1a acpi_event Reg Blk address */ - struct acpi_generic_address xpm1b_evt_blk; /* Extended Power Mgt 1b acpi_event Reg Blk address */ - struct acpi_generic_address xpm1a_cnt_blk; /* Extended Power Mgt 1a Control Reg Blk address */ - struct acpi_generic_address xpm1b_cnt_blk; /* Extended Power Mgt 1b Control Reg Blk address */ - struct acpi_generic_address xpm2_cnt_blk; /* Extended Power Mgt 2 Control Reg Blk address */ - struct acpi_generic_address xpm_tmr_blk; /* Extended Power Mgt Timer Ctrl Reg Blk address */ - struct acpi_generic_address xgpe0_blk; /* Extended General Purpose acpi_event 0 Reg Blk address */ - struct acpi_generic_address xgpe1_blk; /* Extended General Purpose acpi_event 1 Reg Blk address */ -}; - -/* "Down-revved" ACPI 2.0 FADT descriptor */ - -struct fadt_descriptor_rev2_minus { - ACPI_TABLE_HEADER_DEF /* ACPI common table header */ - FADT_REV2_COMMON u8 reserved2; /* Reserved, must be zero */ - u32 flags; - struct acpi_generic_address reset_register; /* Reset register address in GAS format */ - u8 reset_value; /* Value to write to the reset_register port to reset the system. */ - u8 reserved7[3]; /* Reserved, must be zero */ -}; - -/* ECDT - Embedded Controller Boot Resources Table */ - -struct ec_boot_resources { - ACPI_TABLE_HEADER_DEF struct acpi_generic_address ec_control; /* Address of EC command/status register */ - struct acpi_generic_address ec_data; /* Address of EC data register */ - u32 uid; /* Unique ID - must be same as the EC _UID method */ - u8 gpe_bit; /* The GPE for the EC */ - u8 ec_id[1]; /* Full namepath of the EC in the ACPI namespace */ -}; - -/* SRAT - System Resource Affinity Table */ - -struct static_resource_alloc { - u8 type; - u8 length; - u8 proximity_domain_lo; - u8 apic_id; - - /* Flags (32 bits) */ - - u8 enabled:1; /* 00: Use affinity structure */ - u8:7; /* 01-07: Reserved, must be zero */ - u8 reserved3[3]; /* 08-31: Reserved, must be zero */ - - u8 local_sapic_eid; - u8 proximity_domain_hi[3]; - u32 reserved4; /* Reserved, must be zero */ -}; - -struct memory_affinity { - u8 type; - u8 length; - u32 proximity_domain; - u16 reserved3; - u64 base_address; - u64 address_length; - u32 reserved4; - - /* Flags (32 bits) */ - - u8 enabled:1; /* 00: Use affinity structure */ - u8 hot_pluggable:1; /* 01: Memory region is hot pluggable */ - u8 non_volatile:1; /* 02: Memory is non-volatile */ - u8:5; /* 03-07: Reserved, must be zero */ - u8 reserved5[3]; /* 08-31: Reserved, must be zero */ - - u64 reserved6; /* Reserved, must be zero */ -}; - -struct system_resource_affinity { - ACPI_TABLE_HEADER_DEF u32 reserved1; /* Must be value '1' */ - u64 reserved2; /* Reserved, must be zero */ -}; - -/* SLIT - System Locality Distance Information Table */ - -struct system_locality_info { - ACPI_TABLE_HEADER_DEF u64 locality_count; - u8 entry[1][1]; -}; - -#pragma pack() +/* Code moved to both actbl.h and actbl1.h */ #endif /* __ACTBL2_H__ */ diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h index 7ca89cde7..64b603cfe 100644 --- a/include/acpi/actypes.h +++ b/include/acpi/actypes.h @@ -44,6 +44,8 @@ #ifndef __ACTYPES_H__ #define __ACTYPES_H__ +/* acpisrc:struct_defs -- for acpisrc conversion */ + /* * ACPI_MACHINE_WIDTH must be specified in an OS- or compiler-dependent header * and must be either 16, 32, or 64 @@ -154,7 +156,6 @@ typedef u64 acpi_physical_address; #define ACPI_MAX_PTR ACPI_UINT64_MAX #define ACPI_SIZE_MAX ACPI_UINT64_MAX -#define ALIGNED_ADDRESS_BOUNDARY 0x00000008 #define ACPI_USE_NATIVE_DIVIDE /* Has native 64-bit integer support */ /* @@ -195,8 +196,6 @@ typedef u64 acpi_physical_address; #define ACPI_MAX_PTR ACPI_UINT32_MAX #define ACPI_SIZE_MAX ACPI_UINT32_MAX -#define ALIGNED_ADDRESS_BOUNDARY 0x00000004 - /******************************************************************************* * * Types specific to 16-bit targets @@ -223,7 +222,6 @@ typedef char *acpi_physical_address; #define ACPI_MAX_PTR ACPI_UINT16_MAX #define ACPI_SIZE_MAX ACPI_UINT16_MAX -#define ALIGNED_ADDRESS_BOUNDARY 0x00000002 #define ACPI_USE_NATIVE_DIVIDE /* No 64-bit integers, ok to use native divide */ /* 64-bit integers cannot be supported */ @@ -243,7 +241,7 @@ typedef acpi_native_uint acpi_size; /******************************************************************************* * - * OS- or compiler-dependent types + * OS-dependent and compiler-dependent types * * If the defaults below are not appropriate for the host system, they can * be defined in the compiler-specific or OS-specific header, and this will @@ -251,27 +249,34 @@ typedef acpi_native_uint acpi_size; * ******************************************************************************/ -/* Use C99 uintptr_t for pointer casting if available, "void *" otherwise */ +/* Value returned by acpi_os_get_thread_id */ -#ifndef acpi_uintptr_t -#define acpi_uintptr_t void * +#ifndef acpi_thread_id +#define acpi_thread_id acpi_native_uint #endif -/* - * If acpi_cache_t was not defined in the OS-dependent header, - * define it now. This is typically the case where the local cache - * manager implementation is to be used (ACPI_USE_LOCAL_CACHE) - */ -#ifndef acpi_cache_t -#define acpi_cache_t struct acpi_memory_list +/* Object returned from acpi_os_create_lock */ + +#ifndef acpi_spinlock +#define acpi_spinlock void * #endif -/* - * Allow the CPU flags word to be defined per-OS to simplify the use of the - * lock and unlock OSL interfaces. - */ +/* Flags for acpi_os_acquire_lock/acpi_os_release_lock */ + #ifndef acpi_cpu_flags -#define acpi_cpu_flags acpi_native_uint +#define acpi_cpu_flags acpi_native_uint +#endif + +/* Object returned from acpi_os_create_cache */ + +#ifndef acpi_cache_t +#define acpi_cache_t struct acpi_memory_list +#endif + +/* Use C99 uintptr_t for pointer casting if available, "void *" otherwise */ + +#ifndef acpi_uintptr_t +#define acpi_uintptr_t void * #endif /* @@ -292,6 +297,14 @@ typedef acpi_native_uint acpi_size; #define ACPI_UNUSED_VAR #endif +/* + * All ACPICA functions that are available to the rest of the kernel are + * tagged with this macro which can be defined as appropriate for the host. + */ +#ifndef ACPI_EXPORT_SYMBOL +#define ACPI_EXPORT_SYMBOL(symbol) +#endif + /******************************************************************************* * * Independent types @@ -367,6 +380,11 @@ struct uint32_struct { u32 hi; }; +/* Synchronization objects */ + +#define acpi_mutex void * +#define acpi_semaphore void * + /* * Acpi integer width. In ACPI version 1, integers are * 32 bits. In ACPI version 2, integers are 64 bits. @@ -477,15 +495,15 @@ typedef u64 acpi_integer; */ typedef u32 acpi_table_type; -#define ACPI_TABLE_RSDP (acpi_table_type) 0 -#define ACPI_TABLE_DSDT (acpi_table_type) 1 -#define ACPI_TABLE_FADT (acpi_table_type) 2 -#define ACPI_TABLE_FACS (acpi_table_type) 3 -#define ACPI_TABLE_PSDT (acpi_table_type) 4 -#define ACPI_TABLE_SSDT (acpi_table_type) 5 -#define ACPI_TABLE_XSDT (acpi_table_type) 6 -#define ACPI_TABLE_MAX 6 -#define NUM_ACPI_TABLE_TYPES (ACPI_TABLE_MAX+1) +#define ACPI_TABLE_ID_RSDP (acpi_table_type) 0 +#define ACPI_TABLE_ID_DSDT (acpi_table_type) 1 +#define ACPI_TABLE_ID_FADT (acpi_table_type) 2 +#define ACPI_TABLE_ID_FACS (acpi_table_type) 3 +#define ACPI_TABLE_ID_PSDT (acpi_table_type) 4 +#define ACPI_TABLE_ID_SSDT (acpi_table_type) 5 +#define ACPI_TABLE_ID_XSDT (acpi_table_type) 6 +#define ACPI_TABLE_ID_MAX 6 +#define ACPI_NUM_TABLE_TYPES (ACPI_TABLE_ID_MAX+1) /* * Types associated with ACPI names and objects. The first group of @@ -816,7 +834,7 @@ struct acpi_system_info { u32 debug_level; u32 debug_layer; u32 num_table_types; - struct acpi_table_info table_info[NUM_ACPI_TABLE_TYPES]; + struct acpi_table_info table_info[ACPI_TABLE_ID_MAX + 1]; }; /* @@ -858,7 +876,7 @@ acpi_status(*acpi_adr_space_handler) (u32 function, void *handler_context, void *region_context); -#define ACPI_DEFAULT_HANDLER NULL +#define ACPI_DEFAULT_HANDLER NULL typedef acpi_status(*acpi_adr_space_setup) (acpi_handle region_handle, @@ -911,12 +929,13 @@ struct acpi_compatible_id_list { #define ACPI_STA_DEVICE_PRESENT 0x01 #define ACPI_STA_DEVICE_ENABLED 0x02 #define ACPI_STA_DEVICE_UI 0x04 -#define ACPI_STA_DEVICE_OK 0x08 +#define ACPI_STA_DEVICE_FUNCTIONING 0x08 +#define ACPI_STA_DEVICE_OK 0x08 /* Synonym */ #define ACPI_STA_BATTERY_PRESENT 0x10 #define ACPI_COMMON_OBJ_INFO \ - acpi_object_type type; /* ACPI object type */ \ - acpi_name name /* ACPI object Name */ + acpi_object_type type; /* ACPI object type */ \ + acpi_name name /* ACPI object Name */ struct acpi_obj_info_header { ACPI_COMMON_OBJ_INFO; @@ -957,7 +976,7 @@ struct acpi_mem_space_context { * Definitions for Resource Attributes */ typedef u16 acpi_rs_length; /* Resource Length field is fixed at 16 bits */ -typedef u32 acpi_rsdesc_size; /* Max Resource Descriptor size is (length+3) = (64_k-1)+3 */ +typedef u32 acpi_rsdesc_size; /* Max Resource Descriptor size is (Length+3) = (64_k-1)+3 */ /* * Memory Attributes @@ -972,8 +991,8 @@ typedef u32 acpi_rsdesc_size; /* Max Resource Descriptor size is (length+3) = (6 /* * IO Attributes - * The ISA Io ranges are: n000-n0_ffh, n400-n4_ffh, n800-n8_ffh, n_c00-n_cFFh. - * The non-ISA Io ranges are: n100-n3_ffh, n500-n7_ffh, n900-n_bFfh, n_cd0-n_fFFh. + * The ISA IO ranges are: n000-n0_fFh, n400-n4_fFh, n800-n8_fFh, n_c00-n_cFFh. + * The non-ISA IO ranges are: n100-n3_fFh, n500-n7_fFh, n900-n_bFFh, n_cd0-n_fFFh. */ #define ACPI_NON_ISA_ONLY_RANGES (u8) 0x01 #define ACPI_ISA_ONLY_RANGES (u8) 0x02 @@ -1171,12 +1190,12 @@ struct acpi_resource_source { /* Fields common to all address descriptors, 16/32/64 bit */ #define ACPI_RESOURCE_ADDRESS_COMMON \ - u8 resource_type; \ - u8 producer_consumer; \ - u8 decode; \ - u8 min_address_fixed; \ - u8 max_address_fixed; \ - union acpi_resource_attribute info; + u8 resource_type; \ + u8 producer_consumer; \ + u8 decode; \ + u8 min_address_fixed; \ + u8 max_address_fixed; \ + union acpi_resource_attribute info; struct acpi_resource_address { ACPI_RESOURCE_ADDRESS_COMMON}; @@ -1297,16 +1316,6 @@ struct acpi_resource { #define ACPI_NEXT_RESOURCE(res) (struct acpi_resource *)((u8 *) res + res->length) -#ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED -#define ACPI_ALIGN_RESOURCE_SIZE(length) (length) -#else -#define ACPI_ALIGN_RESOURCE_SIZE(length) ACPI_ROUND_UP_TO_NATIVE_WORD(length) -#endif - -/* - * END: of definitions for Resource Attributes - */ - struct acpi_pci_routing_table { u32 length; u32 pin; @@ -1315,8 +1324,4 @@ struct acpi_pci_routing_table { char source[4]; /* pad to 64 bits so sizeof() works in all cases */ }; -/* - * END: of definitions for PCI Routing tables - */ - #endif /* __ACTYPES_H__ */ diff --git a/include/acpi/acutils.h b/include/acpi/acutils.h index 0927765df..ba039ea1a 100644 --- a/include/acpi/acutils.h +++ b/include/acpi/acutils.h @@ -50,24 +50,24 @@ extern const u8 acpi_gbl_resource_aml_sizes[]; #if defined(ACPI_DISASSEMBLER) || defined (ACPI_DEBUGGER) -extern const char *acpi_gbl_BMdecode[2]; -extern const char *acpi_gbl_config_decode[4]; -extern const char *acpi_gbl_consume_decode[2]; -extern const char *acpi_gbl_DECdecode[2]; -extern const char *acpi_gbl_HEdecode[2]; -extern const char *acpi_gbl_io_decode[2]; -extern const char *acpi_gbl_LLdecode[2]; -extern const char *acpi_gbl_max_decode[2]; -extern const char *acpi_gbl_MEMdecode[4]; -extern const char *acpi_gbl_min_decode[2]; -extern const char *acpi_gbl_MTPdecode[4]; -extern const char *acpi_gbl_RNGdecode[4]; -extern const char *acpi_gbl_RWdecode[2]; -extern const char *acpi_gbl_SHRdecode[2]; -extern const char *acpi_gbl_SIZdecode[4]; -extern const char *acpi_gbl_TRSdecode[2]; -extern const char *acpi_gbl_TTPdecode[2]; -extern const char *acpi_gbl_TYPdecode[4]; +extern const char *acpi_gbl_bm_decode[]; +extern const char *acpi_gbl_config_decode[]; +extern const char *acpi_gbl_consume_decode[]; +extern const char *acpi_gbl_dec_decode[]; +extern const char *acpi_gbl_he_decode[]; +extern const char *acpi_gbl_io_decode[]; +extern const char *acpi_gbl_ll_decode[]; +extern const char *acpi_gbl_max_decode[]; +extern const char *acpi_gbl_mem_decode[]; +extern const char *acpi_gbl_min_decode[]; +extern const char *acpi_gbl_mtp_decode[]; +extern const char *acpi_gbl_rng_decode[]; +extern const char *acpi_gbl_rw_decode[]; +extern const char *acpi_gbl_shr_decode[]; +extern const char *acpi_gbl_siz_decode[]; +extern const char *acpi_gbl_trs_decode[]; +extern const char *acpi_gbl_ttp_decode[]; +extern const char *acpi_gbl_typ_decode[]; #endif /* Types for Resource descriptor entries */ @@ -77,6 +77,12 @@ extern const char *acpi_gbl_TYPdecode[4]; #define ACPI_VARIABLE_LENGTH 2 #define ACPI_SMALL_VARIABLE_LENGTH 3 +typedef +acpi_status(*acpi_walk_aml_callback) (u8 * aml, + u32 length, + u32 offset, + u8 resource_index, void **context); + typedef acpi_status(*acpi_pkg_callback) (u8 object_type, union acpi_operand_object * source_object, @@ -277,6 +283,8 @@ acpi_ut_ptr_exit(u32 line_number, void acpi_ut_dump_buffer(u8 * buffer, u32 count, u32 display, u32 component_id); +void acpi_ut_dump_buffer2(u8 * buffer, u32 count, u32 display); + void acpi_ut_report_error(char *module_name, u32 line_number); void acpi_ut_report_info(char *module_name, u32 line_number); @@ -445,6 +453,8 @@ acpi_ut_short_divide(acpi_integer in_dividend, /* * utmisc */ +u8 acpi_ut_is_aml_table(struct acpi_table_header *table); + acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id); void acpi_ut_release_owner_id(acpi_owner_id * owner_id); @@ -460,7 +470,9 @@ void acpi_ut_print_string(char *string, u8 max_length); u8 acpi_ut_valid_acpi_name(u32 name); -u8 acpi_ut_valid_acpi_character(char character); +acpi_name acpi_ut_repair_name(acpi_name name); + +u8 acpi_ut_valid_acpi_char(char character, acpi_native_uint position); acpi_status acpi_ut_strtoul64(char *string, u32 base, acpi_integer * ret_integer); @@ -469,6 +481,25 @@ acpi_ut_strtoul64(char *string, u32 base, acpi_integer * ret_integer); #define ACPI_ANY_BASE 0 +u32 acpi_ut_dword_byte_swap(u32 value); + +void acpi_ut_set_integer_width(u8 revision); + +#ifdef ACPI_DEBUG_OUTPUT +void +acpi_ut_display_init_pathname(u8 type, + struct acpi_namespace_node *obj_handle, + char *path); +#endif + +/* + * utresrc + */ +acpi_status +acpi_ut_walk_aml_resources(u8 * aml, + acpi_size aml_length, + acpi_walk_aml_callback user_function, void **context); + acpi_status acpi_ut_validate_resource(void *aml, u8 * return_index); u32 acpi_ut_get_descriptor_length(void *aml); @@ -483,20 +514,6 @@ acpi_status acpi_ut_get_resource_end_tag(union acpi_operand_object *obj_desc, u8 ** end_tag); -u8 acpi_ut_generate_checksum(u8 * buffer, u32 length); - -u32 acpi_ut_dword_byte_swap(u32 value); - -void acpi_ut_set_integer_width(u8 revision); - -#ifdef ACPI_DEBUG_OUTPUT -void -acpi_ut_display_init_pathname(u8 type, - struct acpi_namespace_node *obj_handle, - char *path); - -#endif - /* * utmutex - mutex support */ @@ -523,14 +540,15 @@ acpi_ut_initialize_buffer(struct acpi_buffer *buffer, void *acpi_ut_allocate(acpi_size size, u32 component, char *module, u32 line); -void *acpi_ut_callocate(acpi_size size, u32 component, char *module, u32 line); +void *acpi_ut_allocate_zeroed(acpi_size size, + u32 component, char *module, u32 line); #ifdef ACPI_DBG_TRACK_ALLOCATIONS void *acpi_ut_allocate_and_track(acpi_size size, u32 component, char *module, u32 line); -void *acpi_ut_callocate_and_track(acpi_size size, - u32 component, char *module, u32 line); +void *acpi_ut_allocate_zeroed_and_track(acpi_size size, + u32 component, char *module, u32 line); void acpi_ut_free_and_track(void *address, u32 component, char *module, u32 line); @@ -540,6 +558,11 @@ void acpi_ut_dump_allocation_info(void); #endif /* ACPI_FUTURE_USAGE */ void acpi_ut_dump_allocations(u32 component, char *module); + +acpi_status +acpi_ut_create_list(char *list_name, + u16 object_size, struct acpi_memory_list **return_cache); + #endif #endif /* _ACUTILS_H */ diff --git a/include/acpi/amlcode.h b/include/acpi/amlcode.h index 37964a59a..cf18426a8 100644 --- a/include/acpi/amlcode.h +++ b/include/acpi/amlcode.h @@ -180,8 +180,10 @@ #define AML_BANK_FIELD_OP (u16) 0x5b87 #define AML_DATA_REGION_OP (u16) 0x5b88 /* ACPI 2.0 */ -/* Bogus opcodes (they are actually two separate opcodes) */ - +/* + * Combination opcodes (actually two one-byte opcodes) + * Used by the disassembler and i_aSL compiler + */ #define AML_LGREATEREQUAL_OP (u16) 0x9295 #define AML_LLESSEQUAL_OP (u16) 0x9294 #define AML_LNOTEQUAL_OP (u16) 0x9293 diff --git a/include/acpi/amlresrc.h b/include/acpi/amlresrc.h index fb4735315..be03818af 100644 --- a/include/acpi/amlresrc.h +++ b/include/acpi/amlresrc.h @@ -42,39 +42,45 @@ * POSSIBILITY OF SUCH DAMAGES. */ +/* acpisrc:struct_defs -- for acpisrc conversion */ + #ifndef __AMLRESRC_H #define __AMLRESRC_H -#define ASL_RESNAME_ADDRESS "_ADR" -#define ASL_RESNAME_ALIGNMENT "_ALN" -#define ASL_RESNAME_ADDRESSSPACE "_ASI" -#define ASL_RESNAME_ACCESSSIZE "_ASZ" -#define ASL_RESNAME_TYPESPECIFICATTRIBUTES "_ATT" -#define ASL_RESNAME_BASEADDRESS "_BAS" -#define ASL_RESNAME_BUSMASTER "_BM_" /* Master(1), Slave(0) */ -#define ASL_RESNAME_DECODE "_DEC" -#define ASL_RESNAME_DMA "_DMA" -#define ASL_RESNAME_DMATYPE "_TYP" /* Compatible(0), A(1), B(2), F(3) */ -#define ASL_RESNAME_GRANULARITY "_GRA" -#define ASL_RESNAME_INTERRUPT "_INT" -#define ASL_RESNAME_INTERRUPTLEVEL "_LL_" /* active_lo(1), active_hi(0) */ -#define ASL_RESNAME_INTERRUPTSHARE "_SHR" /* Shareable(1), no_share(0) */ -#define ASL_RESNAME_INTERRUPTTYPE "_HE_" /* Edge(1), Level(0) */ -#define ASL_RESNAME_LENGTH "_LEN" -#define ASL_RESNAME_MEMATTRIBUTES "_MTP" /* Memory(0), Reserved(1), ACPI(2), NVS(3) */ -#define ASL_RESNAME_MEMTYPE "_MEM" /* non_cache(0), Cacheable(1) Cache+combine(2), Cache+prefetch(3) */ -#define ASL_RESNAME_MAXADDR "_MAX" -#define ASL_RESNAME_MINADDR "_MIN" -#define ASL_RESNAME_MAXTYPE "_MAF" -#define ASL_RESNAME_MINTYPE "_MIF" -#define ASL_RESNAME_REGISTERBITOFFSET "_RBO" -#define ASL_RESNAME_REGISTERBITWIDTH "_RBW" -#define ASL_RESNAME_RANGETYPE "_RNG" -#define ASL_RESNAME_READWRITETYPE "_RW_" /* read_only(0), Writeable (1) */ -#define ASL_RESNAME_TRANSLATION "_TRA" -#define ASL_RESNAME_TRANSTYPE "_TRS" /* Sparse(1), Dense(0) */ -#define ASL_RESNAME_TYPE "_TTP" /* Translation(1), Static (0) */ -#define ASL_RESNAME_XFERTYPE "_SIz" /* 8(0), 8_and16(1), 16(2) */ +/* + * Resource descriptor tags, as defined in the ACPI specification. + * Used to symbolically reference fields within a descriptor. + */ +#define ACPI_RESTAG_ADDRESS "_ADR" +#define ACPI_RESTAG_ALIGNMENT "_ALN" +#define ACPI_RESTAG_ADDRESSSPACE "_ASI" +#define ACPI_RESTAG_ACCESSSIZE "_ASZ" +#define ACPI_RESTAG_TYPESPECIFICATTRIBUTES "_ATT" +#define ACPI_RESTAG_BASEADDRESS "_BAS" +#define ACPI_RESTAG_BUSMASTER "_BM_" /* Master(1), Slave(0) */ +#define ACPI_RESTAG_DECODE "_DEC" +#define ACPI_RESTAG_DMA "_DMA" +#define ACPI_RESTAG_DMATYPE "_TYP" /* Compatible(0), A(1), B(2), F(3) */ +#define ACPI_RESTAG_GRANULARITY "_GRA" +#define ACPI_RESTAG_INTERRUPT "_INT" +#define ACPI_RESTAG_INTERRUPTLEVEL "_LL_" /* active_lo(1), active_hi(0) */ +#define ACPI_RESTAG_INTERRUPTSHARE "_SHR" /* Shareable(1), no_share(0) */ +#define ACPI_RESTAG_INTERRUPTTYPE "_HE_" /* Edge(1), Level(0) */ +#define ACPI_RESTAG_LENGTH "_LEN" +#define ACPI_RESTAG_MEMATTRIBUTES "_MTP" /* Memory(0), Reserved(1), ACPI(2), NVS(3) */ +#define ACPI_RESTAG_MEMTYPE "_MEM" /* non_cache(0), Cacheable(1) Cache+combine(2), Cache+prefetch(3) */ +#define ACPI_RESTAG_MAXADDR "_MAX" +#define ACPI_RESTAG_MINADDR "_MIN" +#define ACPI_RESTAG_MAXTYPE "_MAF" +#define ACPI_RESTAG_MINTYPE "_MIF" +#define ACPI_RESTAG_REGISTERBITOFFSET "_RBO" +#define ACPI_RESTAG_REGISTERBITWIDTH "_RBW" +#define ACPI_RESTAG_RANGETYPE "_RNG" +#define ACPI_RESTAG_READWRITETYPE "_RW_" /* read_only(0), Writeable (1) */ +#define ACPI_RESTAG_TRANSLATION "_TRA" +#define ACPI_RESTAG_TRANSTYPE "_TRS" /* Sparse(1), Dense(0) */ +#define ACPI_RESTAG_TYPE "_TTP" /* Translation(1), Static (0) */ +#define ACPI_RESTAG_XFERTYPE "_SIZ" /* 8(0), 8_and16(1), 16(2) */ /* Default sizes for "small" resource descriptors */ @@ -109,7 +115,7 @@ struct asl_resource_node { * SMALL descriptors */ #define AML_RESOURCE_SMALL_HEADER_COMMON \ - u8 descriptor_type; + u8 descriptor_type; struct aml_resource_small_header { AML_RESOURCE_SMALL_HEADER_COMMON}; @@ -162,8 +168,8 @@ struct aml_resource_end_tag { * LARGE descriptors */ #define AML_RESOURCE_LARGE_HEADER_COMMON \ - u8 descriptor_type;\ - u16 resource_length; + u8 descriptor_type;\ + u16 resource_length; struct aml_resource_large_header { AML_RESOURCE_LARGE_HEADER_COMMON}; @@ -194,9 +200,9 @@ struct aml_resource_fixed_memory32 { }; #define AML_RESOURCE_ADDRESS_COMMON \ - u8 resource_type; \ - u8 flags; \ - u8 specific_flags; + u8 resource_type; \ + u8 flags; \ + u8 specific_flags; struct aml_resource_address { AML_RESOURCE_LARGE_HEADER_COMMON AML_RESOURCE_ADDRESS_COMMON}; @@ -266,6 +272,7 @@ struct aml_resource_generic_register { union aml_resource { /* Descriptor headers */ + u8 descriptor_type; struct aml_resource_small_header small_header; struct aml_resource_large_header large_header; @@ -296,9 +303,9 @@ union aml_resource { /* Utility overlays */ struct aml_resource_address address; - u32 u32_item; - u16 u16_item; - u8 U8item; + u32 dword_item; + u16 word_item; + u8 byte_item; }; #endif diff --git a/include/acpi/pdc_intel.h b/include/acpi/pdc_intel.h index 3fa81d55c..c5472be6f 100644 --- a/include/acpi/pdc_intel.h +++ b/include/acpi/pdc_intel.h @@ -18,6 +18,11 @@ ACPI_PDC_C_C1_HALT | \ ACPI_PDC_P_FFH) +#define ACPI_PDC_EST_CAPABILITY_SWSMP (ACPI_PDC_SMP_C1PT | \ + ACPI_PDC_C_C1_HALT | \ + ACPI_PDC_SMP_P_SWCOORD | \ + ACPI_PDC_P_FFH) + #define ACPI_PDC_C_CAPABILITY_SMP (ACPI_PDC_SMP_C2C3 | \ ACPI_PDC_SMP_C1PT | \ ACPI_PDC_C_C1_HALT) diff --git a/include/acpi/platform/acenv.h b/include/acpi/platform/acenv.h index 223ec6467..453a469fd 100644 --- a/include/acpi/platform/acenv.h +++ b/include/acpi/platform/acenv.h @@ -49,33 +49,41 @@ */ #ifdef ACPI_LIBRARY +/* + * Note: The non-debug version of the acpi_library does not contain any + * debug support, for minimimal size. The debug version uses ACPI_FULL_DEBUG + */ #define ACPI_USE_LOCAL_CACHE #endif -#ifdef ACPI_DUMP_APP -#ifndef MSDOS +#ifdef ACPI_ASL_COMPILER #define ACPI_DEBUG_OUTPUT -#endif #define ACPI_APPLICATION #define ACPI_DISASSEMBLER -#define ACPI_NO_METHOD_EXECUTION +#define ACPI_CONSTANT_EVAL_ONLY +#define ACPI_LARGE_NAMESPACE_NODE +#define ACPI_DATA_TABLE_DISASSEMBLY #endif #ifdef ACPI_EXEC_APP #undef DEBUGGER_THREADING #define DEBUGGER_THREADING DEBUGGER_SINGLE_THREADED -#define ACPI_DEBUG_OUTPUT +#define ACPI_FULL_DEBUG #define ACPI_APPLICATION #define ACPI_DEBUGGER -#define ACPI_DISASSEMBLER #define ACPI_MUTEX_DEBUG +#define ACPI_DBG_TRACK_ALLOCATIONS #endif -#ifdef ACPI_ASL_COMPILER +#ifdef ACPI_DASM_APP +#ifndef MSDOS #define ACPI_DEBUG_OUTPUT +#endif #define ACPI_APPLICATION #define ACPI_DISASSEMBLER -#define ACPI_CONSTANT_EVAL_ONLY +#define ACPI_NO_METHOD_EXECUTION +#define ACPI_LARGE_NAMESPACE_NODE +#define ACPI_DATA_TABLE_DISASSEMBLY #endif #ifdef ACPI_APPLICATION @@ -83,6 +91,12 @@ #define ACPI_USE_LOCAL_CACHE #endif +#ifdef ACPI_FULL_DEBUG +#define ACPI_DEBUGGER +#define ACPI_DEBUG_OUTPUT +#define ACPI_DISASSEMBLER +#endif + /* * Environment configuration. The purpose of this file is to interface to the * local generation environment. @@ -137,7 +151,7 @@ #elif defined(MSDOS) /* Must appear after WIN32 and WIN64 check */ #include "acdos16.h" -#elif defined(__FreeBSD__) +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) #include "acfreebsd.h" #elif defined(__NetBSD__) @@ -163,17 +177,6 @@ #endif -/* - * Memory allocation tracking. Used only if - * 1) This is the debug version - * 2) This is NOT a 16-bit version of the code (not enough real-mode memory) - */ -#ifdef ACPI_DEBUG_OUTPUT -#if ACPI_MACHINE_WIDTH != 16 -#define ACPI_DBG_TRACK_ALLOCATIONS -#endif -#endif - /*! [End] no source code translation !*/ /* @@ -271,8 +274,8 @@ typedef char *va_list; /* * Storage alignment properties */ -#define _AUPBND (sizeof (acpi_native_uint) - 1) -#define _ADNBND (sizeof (acpi_native_uint) - 1) +#define _AUPBND (sizeof (acpi_native_int) - 1) +#define _ADNBND (sizeof (acpi_native_int) - 1) /* * Variable argument list macro definitions diff --git a/include/acpi/platform/aclinux.h b/include/acpi/platform/aclinux.h index 2e6d54569..47faf2791 100644 --- a/include/acpi/platform/aclinux.h +++ b/include/acpi/platform/aclinux.h @@ -49,30 +49,27 @@ #ifdef __KERNEL__ -#include #include #include +#include #include #include #include #include #include +#include +#include +#include -#define strtoul simple_strtoul - -#define ACPI_MACHINE_WIDTH BITS_PER_LONG - -/* Type(s) for the OSL */ +/* Host-dependent types and defines */ -#ifdef ACPI_USE_LOCAL_CACHE -#define acpi_cache_t struct acpi_memory_list -#else -#include -#define acpi_cache_t kmem_cache_t -#endif +#define ACPI_MACHINE_WIDTH BITS_PER_LONG +#define acpi_cache_t kmem_cache_t +#define acpi_spinlock spinlock_t * +#define ACPI_EXPORT_SYMBOL(symbol) EXPORT_SYMBOL(symbol); +#define strtoul simple_strtoul /* Full namespace pathname length limit - arbitrary */ - #define ACPI_PATHNAME_MAX 256 #else /* !__KERNEL__ */ @@ -104,4 +101,30 @@ #define acpi_cpu_flags unsigned long +#define acpi_thread_id struct task_struct * + +static inline acpi_thread_id acpi_os_get_thread_id(void) { return current; } + +/* + * The irqs_disabled() check is for resume from RAM. + * Interrupts are off during resume, just like they are for boot. + * However, boot has (system_state != SYSTEM_RUNNING) + * to quiet __might_sleep() in kmalloc() and resume does not. + */ +#include +static inline void *acpi_os_allocate(acpi_size size) { + return kmalloc(size, irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL); +} +static inline void *acpi_os_allocate_zeroed(acpi_size size) { + return kzalloc(size, irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL); +} + +static inline void *acpi_os_acquire_object(acpi_cache_t * cache) { + return kmem_cache_zalloc(cache, irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL); +} + +#define ACPI_ALLOCATE(a) acpi_os_allocate(a) +#define ACPI_ALLOCATE_ZEROED(a) acpi_os_allocate_zeroed(a) +#define ACPI_FREE(a) kfree(a) + #endif /* __ACLINUX_H__ */ diff --git a/include/acpi/processor.h b/include/acpi/processor.h index badf0277b..9dd5b7596 100644 --- a/include/acpi/processor.h +++ b/include/acpi/processor.h @@ -2,7 +2,7 @@ #define __ACPI_PROCESSOR_H #include -#include +#include #include @@ -18,6 +18,17 @@ #define ACPI_PDC_REVISION_ID 0x1 +#define ACPI_PSD_REV0_REVISION 0 /* Support for _PSD as in ACPI 3.0 */ +#define ACPI_PSD_REV0_ENTRIES 5 + +/* + * Types of coordination defined in ACPI 3.0. Same macros can be used across + * P, C and T states + */ +#define DOMAIN_COORD_TYPE_SW_ALL 0xfc +#define DOMAIN_COORD_TYPE_SW_ANY 0xfd +#define DOMAIN_COORD_TYPE_HW_ALL 0xfe + /* Power Management */ struct acpi_processor_cx; @@ -51,6 +62,7 @@ struct acpi_processor_cx { u32 latency_ticks; u32 power; u32 usage; + u64 time; struct acpi_processor_cx_policy promotion; struct acpi_processor_cx_policy demotion; }; @@ -66,6 +78,14 @@ struct acpi_processor_power { /* Performance Management */ +struct acpi_psd_package { + acpi_integer num_entries; + acpi_integer revision; + acpi_integer domain; + acpi_integer coord_type; + acpi_integer num_processors; +} __attribute__ ((packed)); + struct acpi_pct_register { u8 descriptor; u16 length; @@ -92,7 +112,9 @@ struct acpi_processor_performance { struct acpi_pct_register status_register; unsigned int state_count; struct acpi_processor_px *states; - + struct acpi_psd_package domain_info; + cpumask_t shared_cpu_map; + unsigned int shared_type; }; /* Throttling Control */ @@ -161,6 +183,9 @@ struct acpi_processor_errata { } piix4; }; +extern int acpi_processor_preregister_performance( + struct acpi_processor_performance **performance); + extern int acpi_processor_register_performance(struct acpi_processor_performance *performance, unsigned int cpu); extern void acpi_processor_unregister_performance(struct diff --git a/include/asm-alpha/barrier.h b/include/asm-alpha/barrier.h index 681ff581a..384dc08d6 100644 --- a/include/asm-alpha/barrier.h +++ b/include/asm-alpha/barrier.h @@ -30,7 +30,4 @@ __asm__ __volatile__("mb": : :"memory") #define set_mb(var, value) \ do { var = value; mb(); } while (0) -#define set_wmb(var, value) \ -do { var = value; wmb(); } while (0) - #endif /* __BARRIER_H */ diff --git a/include/asm-alpha/bitops.h b/include/asm-alpha/bitops.h index 3f88715e8..4b6ef7f21 100644 --- a/include/asm-alpha/bitops.h +++ b/include/asm-alpha/bitops.h @@ -1,7 +1,6 @@ #ifndef _ALPHA_BITOPS_H #define _ALPHA_BITOPS_H -#include #include /* diff --git a/include/asm-alpha/cache.h b/include/asm-alpha/cache.h index e6d4d1695..f199e69a5 100644 --- a/include/asm-alpha/cache.h +++ b/include/asm-alpha/cache.h @@ -4,7 +4,6 @@ #ifndef __ARCH_ALPHA_CACHE_H #define __ARCH_ALPHA_CACHE_H -#include /* Bytes per L1 (data) cache line. */ #if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_EV6) diff --git a/include/asm-alpha/cacheflush.h b/include/asm-alpha/cacheflush.h index 3fc6ef726..805640b41 100644 --- a/include/asm-alpha/cacheflush.h +++ b/include/asm-alpha/cacheflush.h @@ -1,7 +1,6 @@ #ifndef _ALPHA_CACHEFLUSH_H #define _ALPHA_CACHEFLUSH_H -#include #include /* Caches aren't brain-dead on the Alpha. */ diff --git a/include/asm-alpha/compiler.h b/include/asm-alpha/compiler.h index 00c6f57ad..d2768cc3d 100644 --- a/include/asm-alpha/compiler.h +++ b/include/asm-alpha/compiler.h @@ -90,6 +90,7 @@ __asm__("stw %1,%0" : "=m"(mem) : "r"(val)) #endif +#ifdef __KERNEL__ /* Some idiots over in thought inline should imply always_inline. This breaks stuff. We'll include this file whenever we run into such problems. */ @@ -101,4 +102,6 @@ #undef __always_inline #define __always_inline inline __attribute__((always_inline)) +#endif /* __KERNEL__ */ + #endif /* __ALPHA_COMPILER_H */ diff --git a/include/asm-alpha/core_cia.h b/include/asm-alpha/core_cia.h index 3a70d68bf..9e0516c0c 100644 --- a/include/asm-alpha/core_cia.h +++ b/include/asm-alpha/core_cia.h @@ -4,7 +4,6 @@ /* Define to experiment with fitting everything into one 512MB HAE window. */ #define CIA_ONE_HAE_WINDOW 1 -#include #include #include diff --git a/include/asm-alpha/core_t2.h b/include/asm-alpha/core_t2.h index 5c1c40338..457c34b6e 100644 --- a/include/asm-alpha/core_t2.h +++ b/include/asm-alpha/core_t2.h @@ -1,7 +1,6 @@ #ifndef __ALPHA_T2__H__ #define __ALPHA_T2__H__ -#include #include #include #include @@ -436,7 +435,7 @@ static inline void t2_outl(u32 b, unsigned long addr) set_hae(msb); \ } -static spinlock_t t2_hae_lock = SPIN_LOCK_UNLOCKED; +static DEFINE_SPINLOCK(t2_hae_lock); __EXTERN_INLINE u8 t2_readb(const volatile void __iomem *xaddr) { diff --git a/include/asm-alpha/dma-mapping.h b/include/asm-alpha/dma-mapping.h index 62d0d6681..b9ff4d8cb 100644 --- a/include/asm-alpha/dma-mapping.h +++ b/include/asm-alpha/dma-mapping.h @@ -1,7 +1,6 @@ #ifndef _ALPHA_DMA_MAPPING_H #define _ALPHA_DMA_MAPPING_H -#include #ifdef CONFIG_PCI diff --git a/include/asm-alpha/dma.h b/include/asm-alpha/dma.h index 683afaa3d..87cfdbdf0 100644 --- a/include/asm-alpha/dma.h +++ b/include/asm-alpha/dma.h @@ -18,7 +18,6 @@ #ifndef _ASM_DMA_H #define _ASM_DMA_H -#include #include #include diff --git a/include/asm-alpha/floppy.h b/include/asm-alpha/floppy.h index 289a00d51..6a9f02af9 100644 --- a/include/asm-alpha/floppy.h +++ b/include/asm-alpha/floppy.h @@ -10,7 +10,6 @@ #ifndef __ASM_ALPHA_FLOPPY_H #define __ASM_ALPHA_FLOPPY_H -#include #define fd_inb(port) inb_p(port) #define fd_outb(value,port) outb_p(value,port) @@ -26,9 +25,8 @@ #define fd_enable_irq() enable_irq(FLOPPY_IRQ) #define fd_disable_irq() disable_irq(FLOPPY_IRQ) #define fd_cacheflush(addr,size) /* nothing */ -#define fd_request_irq() request_irq(FLOPPY_IRQ, floppy_interrupt, \ - SA_INTERRUPT|SA_SAMPLE_RANDOM, \ - "floppy", NULL) +#define fd_request_irq() request_irq(FLOPPY_IRQ, floppy_interrupt,\ + IRQF_DISABLED, "floppy", NULL) #define fd_free_irq() free_irq(FLOPPY_IRQ, NULL); #ifdef CONFIG_PCI diff --git a/include/asm-alpha/hardirq.h b/include/asm-alpha/hardirq.h index 7bb6a36c9..d953e234d 100644 --- a/include/asm-alpha/hardirq.h +++ b/include/asm-alpha/hardirq.h @@ -1,7 +1,6 @@ #ifndef _ALPHA_HARDIRQ_H #define _ALPHA_HARDIRQ_H -#include #include #include diff --git a/include/asm-alpha/hw_irq.h b/include/asm-alpha/hw_irq.h index a310b9efc..a37db0f95 100644 --- a/include/asm-alpha/hw_irq.h +++ b/include/asm-alpha/hw_irq.h @@ -1,9 +1,6 @@ #ifndef _ALPHA_HW_IRQ_H #define _ALPHA_HW_IRQ_H -#include - -static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) {} extern volatile unsigned long irq_err_count; diff --git a/include/asm-alpha/ide.h b/include/asm-alpha/ide.h index 6126afe27..2a5cc0b36 100644 --- a/include/asm-alpha/ide.h +++ b/include/asm-alpha/ide.h @@ -13,7 +13,6 @@ #ifdef __KERNEL__ -#include #define IDE_ARCH_OBSOLETE_DEFAULTS diff --git a/include/asm-alpha/io.h b/include/asm-alpha/io.h index 3ebbeee75..f5ae98c25 100644 --- a/include/asm-alpha/io.h +++ b/include/asm-alpha/io.h @@ -3,7 +3,6 @@ #ifdef __KERNEL__ -#include #include #include #include diff --git a/include/asm-alpha/irq.h b/include/asm-alpha/irq.h index 566db7200..917b9fe37 100644 --- a/include/asm-alpha/irq.h +++ b/include/asm-alpha/irq.h @@ -8,7 +8,6 @@ */ #include -#include #if defined(CONFIG_ALPHA_GENERIC) @@ -93,8 +92,4 @@ extern void enable_irq(unsigned int); struct pt_regs; extern void (*perf_irq)(unsigned long, struct pt_regs *); -struct irqaction; -int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *); - - #endif /* _ALPHA_IRQ_H */ diff --git a/include/asm-alpha/kmap_types.h b/include/asm-alpha/kmap_types.h index 3d10cd3ea..3e6735a34 100644 --- a/include/asm-alpha/kmap_types.h +++ b/include/asm-alpha/kmap_types.h @@ -3,7 +3,6 @@ /* Dummy header just to define km_type. */ -#include #ifdef CONFIG_DEBUG_HIGHMEM # define D(n) __KM_FENCE_##n , diff --git a/include/asm-alpha/machvec.h b/include/asm-alpha/machvec.h index ece166a20..aced22f91 100644 --- a/include/asm-alpha/machvec.h +++ b/include/asm-alpha/machvec.h @@ -1,7 +1,6 @@ #ifndef __ALPHA_MACHVEC_H #define __ALPHA_MACHVEC_H 1 -#include #include /* diff --git a/include/asm-alpha/mmu_context.h b/include/asm-alpha/mmu_context.h index 0c017fc18..fe249e9d3 100644 --- a/include/asm-alpha/mmu_context.h +++ b/include/asm-alpha/mmu_context.h @@ -7,7 +7,6 @@ * Copyright (C) 1996, Linus Torvalds */ -#include #include #include #include diff --git a/include/asm-alpha/mmzone.h b/include/asm-alpha/mmzone.h index 192d80c87..64d0ab98f 100644 --- a/include/asm-alpha/mmzone.h +++ b/include/asm-alpha/mmzone.h @@ -5,7 +5,6 @@ #ifndef _ASM_MMZONE_H_ #define _ASM_MMZONE_H_ -#include #include struct bootmem_data_t; /* stupid forward decl. */ diff --git a/include/asm-alpha/page.h b/include/asm-alpha/page.h index bc6f28e37..fca1bc747 100644 --- a/include/asm-alpha/page.h +++ b/include/asm-alpha/page.h @@ -1,7 +1,8 @@ #ifndef _ALPHA_PAGE_H #define _ALPHA_PAGE_H -#include +#ifdef __KERNEL__ + #include /* PAGE_SHIFT determines the page size */ @@ -9,8 +10,6 @@ #define PAGE_SIZE (1UL << PAGE_SHIFT) #define PAGE_MASK (~(PAGE_SIZE-1)) -#ifdef __KERNEL__ - #ifndef __ASSEMBLY__ #define STRICT_MM_TYPECHECKS @@ -93,10 +92,11 @@ typedef unsigned long pgprot_t; #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \ VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) + #define devmem_is_allowed(x) 1 -#endif /* __KERNEL__ */ #include #include +#endif /* __KERNEL__ */ #endif /* _ALPHA_PAGE_H */ diff --git a/include/asm-alpha/param.h b/include/asm-alpha/param.h index 3ed0b3b02..214e79963 100644 --- a/include/asm-alpha/param.h +++ b/include/asm-alpha/param.h @@ -5,7 +5,6 @@ hardware ignores reprogramming. We also need userland buy-in to the change in HZ, since this is visible in the wait4 resources etc. */ -#include #ifndef HZ # ifndef CONFIG_ALPHA_RAWHIDE diff --git a/include/asm-alpha/pgalloc.h b/include/asm-alpha/pgalloc.h index 308475642..471864e8d 100644 --- a/include/asm-alpha/pgalloc.h +++ b/include/asm-alpha/pgalloc.h @@ -1,7 +1,6 @@ #ifndef _ALPHA_PGALLOC_H #define _ALPHA_PGALLOC_H -#include #include #include diff --git a/include/asm-alpha/pgtable.h b/include/asm-alpha/pgtable.h index a985cd29b..93eaa58b7 100644 --- a/include/asm-alpha/pgtable.h +++ b/include/asm-alpha/pgtable.h @@ -10,7 +10,6 @@ * This hopefully works with any standard Alpha page-size, as defined * in (currently 8192). */ -#include #include #include diff --git a/include/asm-alpha/rwsem.h b/include/asm-alpha/rwsem.h index fafdd4f70..1570c0b54 100644 --- a/include/asm-alpha/rwsem.h +++ b/include/asm-alpha/rwsem.h @@ -36,20 +36,11 @@ struct rw_semaphore { #define RWSEM_ACTIVE_WRITE_BIAS (RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS) spinlock_t wait_lock; struct list_head wait_list; -#if RWSEM_DEBUG - int debug; -#endif }; -#if RWSEM_DEBUG -#define __RWSEM_DEBUG_INIT , 0 -#else -#define __RWSEM_DEBUG_INIT /* */ -#endif - #define __RWSEM_INITIALIZER(name) \ { RWSEM_UNLOCKED_VALUE, SPIN_LOCK_UNLOCKED, \ - LIST_HEAD_INIT((name).wait_list) __RWSEM_DEBUG_INIT } + LIST_HEAD_INIT((name).wait_list) } #define DECLARE_RWSEM(name) \ struct rw_semaphore name = __RWSEM_INITIALIZER(name) @@ -59,9 +50,6 @@ static inline void init_rwsem(struct rw_semaphore *sem) sem->count = RWSEM_UNLOCKED_VALUE; spin_lock_init(&sem->wait_lock); INIT_LIST_HEAD(&sem->wait_list); -#if RWSEM_DEBUG - sem->debug = 0; -#endif } static inline void __down_read(struct rw_semaphore *sem) diff --git a/include/asm-alpha/serial.h b/include/asm-alpha/serial.h index 7e4b2987d..9d263e8d8 100644 --- a/include/asm-alpha/serial.h +++ b/include/asm-alpha/serial.h @@ -2,7 +2,6 @@ * include/asm-alpha/serial.h */ -#include /* * This assumes you have a 1.8432 MHz clock for your UART. diff --git a/include/asm-alpha/signal.h b/include/asm-alpha/signal.h index 1a2c52a05..13c2305d3 100644 --- a/include/asm-alpha/signal.h +++ b/include/asm-alpha/signal.h @@ -77,7 +77,6 @@ typedef unsigned long sigset_t; * SA_FLAGS values: * * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. * SA_RESETHAND clears the handler when the signal is delivered. @@ -98,7 +97,6 @@ typedef unsigned long sigset_t; #define SA_ONESHOT SA_RESETHAND #define SA_NOMASK SA_NODEFER -#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ /* * sigaltstack controls diff --git a/include/asm-alpha/smp.h b/include/asm-alpha/smp.h index e1432102b..a1a1eca6b 100644 --- a/include/asm-alpha/smp.h +++ b/include/asm-alpha/smp.h @@ -1,7 +1,6 @@ #ifndef __ASM_SMP_H #define __ASM_SMP_H -#include #include #include #include diff --git a/include/asm-alpha/socket.h b/include/asm-alpha/socket.h index b51932291..d22ab97ea 100644 --- a/include/asm-alpha/socket.h +++ b/include/asm-alpha/socket.h @@ -51,6 +51,7 @@ #define SCM_TIMESTAMP SO_TIMESTAMP #define SO_PEERSEC 30 +#define SO_PASSSEC 34 /* Security levels - as per NRL IPv6 - don't actually do anything */ #define SO_SECURITY_AUTHENTICATION 19 diff --git a/include/asm-alpha/spinlock.h b/include/asm-alpha/spinlock.h index 8197c69ef..0c294c9b0 100644 --- a/include/asm-alpha/spinlock.h +++ b/include/asm-alpha/spinlock.h @@ -1,7 +1,6 @@ #ifndef _ALPHA_SPINLOCK_H #define _ALPHA_SPINLOCK_H -#include #include #include #include diff --git a/include/asm-alpha/system.h b/include/asm-alpha/system.h index f3b7b1a59..03e9c0e5e 100644 --- a/include/asm-alpha/system.h +++ b/include/asm-alpha/system.h @@ -1,7 +1,6 @@ #ifndef __ALPHA_SYSTEM_H #define __ALPHA_SYSTEM_H -#include #include #include #include diff --git a/include/asm-alpha/tlbflush.h b/include/asm-alpha/tlbflush.h index 9d484c1fd..1ca3ed3bd 100644 --- a/include/asm-alpha/tlbflush.h +++ b/include/asm-alpha/tlbflush.h @@ -1,7 +1,6 @@ #ifndef _ALPHA_TLBFLUSH_H #define _ALPHA_TLBFLUSH_H -#include #include #include diff --git a/include/asm-alpha/unistd.h b/include/asm-alpha/unistd.h index ef25b6585..bc6e6a925 100644 --- a/include/asm-alpha/unistd.h +++ b/include/asm-alpha/unistd.h @@ -383,6 +383,8 @@ #define __NR_inotify_add_watch 445 #define __NR_inotify_rm_watch 446 +#ifdef __KERNEL__ + #define NR_SYSCALLS 447 #if defined(__GNUC__) @@ -565,9 +567,8 @@ type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5, type6 arg6)\ _syscall_return(type); \ } -#endif /* __LIBRARY__ && __GNUC__ */ +#endif /* __GNUC__ */ -#ifdef __KERNEL__ #define __ARCH_WANT_IPC_PARSE_VERSION #define __ARCH_WANT_OLD_READDIR #define __ARCH_WANT_STAT64 @@ -578,7 +579,6 @@ type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5, type6 arg6)\ #define __ARCH_WANT_SYS_OLD_GETRLIMIT #define __ARCH_WANT_SYS_OLDUMOUNT #define __ARCH_WANT_SYS_SIGPENDING -#endif #ifdef __KERNEL_SYSCALLS__ @@ -661,4 +661,5 @@ asmlinkage long sys_rt_sigaction(int sig, #define cond_syscall(x) asm(".weak\t" #x "\n" #x " = sys_ni_syscall") +#endif /* __KERNEL__ */ #endif /* _ALPHA_UNISTD_H */ diff --git a/include/asm-alpha/vga.h b/include/asm-alpha/vga.h index 8ca4f6b2d..ed06f59b5 100644 --- a/include/asm-alpha/vga.h +++ b/include/asm-alpha/vga.h @@ -46,6 +46,6 @@ extern void scr_memcpyw(u16 *d, const u16 *s, unsigned int count); #define vga_readb(a) readb((u8 __iomem *)(a)) #define vga_writeb(v,a) writeb(v, (u8 __iomem *)(a)) -#define VGA_MAP_MEM(x) ((unsigned long) ioremap(x, 0)) +#define VGA_MAP_MEM(x,s) ((unsigned long) ioremap(x, s)) #endif diff --git a/include/asm-arm/apm.h b/include/asm-arm/apm.h index 3a50eb759..d09113b37 100644 --- a/include/asm-arm/apm.h +++ b/include/asm-arm/apm.h @@ -13,7 +13,6 @@ #ifndef ARM_ASM_SA1100_APM_H #define ARM_ASM_SA1100_APM_H -#include #include /* diff --git a/include/asm-arm/arch-aaec2000/io.h b/include/asm-arm/arch-aaec2000/io.h index 8d67907fd..d710204ac 100644 --- a/include/asm-arm/arch-aaec2000/io.h +++ b/include/asm-arm/arch-aaec2000/io.h @@ -16,6 +16,5 @@ */ #define __io(a) ((void __iomem *)(a)) #define __mem_pci(a) (a) -#define __mem_isa(a) (a) #endif diff --git a/include/asm-arm/arch-aaec2000/memory.h b/include/asm-arm/arch-aaec2000/memory.h index d8209f891..24b51cccd 100644 --- a/include/asm-arm/arch-aaec2000/memory.h +++ b/include/asm-arm/arch-aaec2000/memory.h @@ -11,7 +11,6 @@ #ifndef __ASM_ARCH_MEMORY_H #define __ASM_ARCH_MEMORY_H -#include #define PHYS_OFFSET UL(0xf0000000) diff --git a/include/asm-arm/arch-at91rm9200/at91rm9200_sys.h b/include/asm-arm/arch-at91rm9200/at91rm9200_sys.h index 2910d359f..0f4c12d5f 100644 --- a/include/asm-arm/arch-at91rm9200/at91rm9200_sys.h +++ b/include/asm-arm/arch-at91rm9200/at91rm9200_sys.h @@ -68,8 +68,17 @@ #define AT91_DBGU_RHR (AT91_DBGU + 0x18) /* Receiver Holding Register */ #define AT91_DBGU_THR (AT91_DBGU + 0x1c) /* Transmitter Holding Register */ #define AT91_DBGU_BRGR (AT91_DBGU + 0x20) /* Baud Rate Generator Register */ + #define AT91_DBGU_CIDR (AT91_DBGU + 0x40) /* Chip ID Register */ #define AT91_DBGU_EXID (AT91_DBGU + 0x44) /* Chip ID Extension Register */ +#define AT91_CIDR_VERSION (0x1f << 0) /* Version of the Device */ +#define AT91_CIDR_EPROC (7 << 5) /* Embedded Processor */ +#define AT91_CIDR_NVPSIZ (0xf << 8) /* Nonvolatile Program Memory Size */ +#define AT91_CIDR_NVPSIZ2 (0xf << 12) /* Second Nonvolatile Program Memory Size */ +#define AT91_CIDR_SRAMSIZ (0xf << 16) /* Internal SRAM Size */ +#define AT91_CIDR_ARCH (0xff << 20) /* Architecture Identifier */ +#define AT91_CIDR_NVPTYP (7 << 28) /* Nonvolatile Program Memory Type */ +#define AT91_CIDR_EXT (1 << 31) /* Extension Flag */ /* @@ -241,7 +250,7 @@ #define AT91_RTC_SEC (0x7f << 0) /* Current Second */ #define AT91_RTC_MIN (0x7f << 8) /* Current Minute */ #define AT91_RTC_HOUR (0x3f << 16) /* Current Hour */ -#define At91_RTC_AMPM (1 << 22) /* Ante Meridiem Post Meridiem Indicator */ +#define AT91_RTC_AMPM (1 << 22) /* Ante Meridiem Post Meridiem Indicator */ #define AT91_RTC_CALR (AT91_RTC + 0x0c) /* Calendar Register */ #define AT91_RTC_CENT (0x7f << 0) /* Current Century */ diff --git a/include/asm-arm/arch-at91rm9200/board.h b/include/asm-arm/arch-at91rm9200/board.h index 4fdef13d0..c1ca9a465 100644 --- a/include/asm-arm/arch-at91rm9200/board.h +++ b/include/asm-arm/arch-at91rm9200/board.h @@ -20,7 +20,7 @@ /* * These are data structures found in platform_device.dev.platform_data, - * and describing board-specfic data needed by drivers. For example, + * and describing board-specific data needed by drivers. For example, * which pin is used for a given GPIO role. * * In 2.6, drivers should strongly avoid board-specific knowledge so @@ -31,14 +31,9 @@ #ifndef __ASM_ARCH_BOARD_H #define __ASM_ARCH_BOARD_H - /* Clocks */ -extern unsigned long at91_master_clock; - - /* Serial Port */ -extern int at91_serial_map[AT91_NR_UART]; -extern int at91_console_port; - #include +#include +#include /* USB Device */ struct at91_udc_data { @@ -91,10 +86,25 @@ struct at91_nand_data { extern void __init at91_add_device_nand(struct at91_nand_data *data); /* I2C*/ -void __init at91_add_device_i2c(void); +extern void __init at91_add_device_i2c(void); + + /* SPI */ +extern void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices); - /* RTC */ -void __init at91_add_device_rtc(void); + /* Serial */ +struct at91_uart_config { + unsigned short console_tty; /* tty number of serial console */ + unsigned short nr_tty; /* number of serial tty's */ + short tty_map[]; /* map UART to tty number */ +}; +extern struct platform_device *at91_default_console_device; +extern void __init at91_init_serial(struct at91_uart_config *config); + +struct at91_uart_data { + short use_dma_tx; /* use transmit DMA? */ + short use_dma_rx; /* use receive DMA? */ +}; +extern void __init at91_add_device_serial(void); /* LEDs */ extern u8 at91_leds_cpu; diff --git a/include/asm-arm/arch-at91rm9200/gpio.h b/include/asm-arm/arch-at91rm9200/gpio.h index 6176ab2dc..dbde1baaf 100644 --- a/include/asm-arm/arch-at91rm9200/gpio.h +++ b/include/asm-arm/arch-at91rm9200/gpio.h @@ -13,6 +13,8 @@ #ifndef __ASM_ARCH_AT91RM9200_GPIO_H #define __ASM_ARCH_AT91RM9200_GPIO_H +#include + #define PIN_BASE NR_AIC_IRQS #define PQFP_GPIO_BANKS 3 /* PQFP package has 3 banks */ @@ -188,6 +190,9 @@ extern int at91_set_multi_drive(unsigned pin, int is_on); /* callable at any time */ extern int at91_set_gpio_value(unsigned pin, int value); extern int at91_get_gpio_value(unsigned pin); + +extern void at91_gpio_suspend(void); +extern void at91_gpio_resume(void); #endif #endif diff --git a/include/asm-arm/arch-at91rm9200/hardware.h b/include/asm-arm/arch-at91rm9200/hardware.h index 59e6f44d3..235d39d91 100644 --- a/include/asm-arm/arch-at91rm9200/hardware.h +++ b/include/asm-arm/arch-at91rm9200/hardware.h @@ -50,9 +50,12 @@ #define AT91_VA_BASE_TCB0 AT91_IO_P2V(AT91_BASE_TCB0) /* Internal SRAM */ -#define AT91_BASE_SRAM 0x00200000 /* Internal SRAM base address */ +#define AT91_SRAM_BASE 0x00200000 /* Internal SRAM base address */ #define AT91_SRAM_SIZE 0x00004000 /* Internal SRAM SIZE (16Kb) */ + /* Internal SRAM is mapped below the IO devices */ +#define AT91_SRAM_VIRT_BASE (AT91_IO_VIRT_BASE - AT91_SRAM_SIZE) + /* Serial ports */ #define AT91_NR_UART 5 /* 4 USART3's and one DBGU port */ @@ -81,14 +84,14 @@ static inline unsigned int at91_sys_read(unsigned int reg_offset) { void __iomem *addr = (void __iomem *)AT91_VA_BASE_SYS; - return readl(addr + reg_offset); + return __raw_readl(addr + reg_offset); } static inline void at91_sys_write(unsigned int reg_offset, unsigned long value) { void __iomem *addr = (void __iomem *)AT91_VA_BASE_SYS; - writel(value, addr + reg_offset); + __raw_writel(value, addr + reg_offset); } #endif diff --git a/include/asm-arm/arch-at91rm9200/io.h b/include/asm-arm/arch-at91rm9200/io.h index 23e670d85..88fd1bebc 100644 --- a/include/asm-arm/arch-at91rm9200/io.h +++ b/include/asm-arm/arch-at91rm9200/io.h @@ -21,7 +21,6 @@ #ifndef __ASM_ARCH_IO_H #define __ASM_ARCH_IO_H -#include #include #define IO_SPACE_LIMIT 0xFFFFFFFF diff --git a/include/asm-arm/arch-at91rm9200/irqs.h b/include/asm-arm/arch-at91rm9200/irqs.h index 27b0497f1..f63842c2c 100644 --- a/include/asm-arm/arch-at91rm9200/irqs.h +++ b/include/asm-arm/arch-at91rm9200/irqs.h @@ -37,16 +37,6 @@ * symbols in gpio.h for ones handled indirectly as GPIOs. * We make provision for 4 banks of GPIO. */ -#include - #define NR_IRQS (NR_AIC_IRQS + (4 * 32)) - -#ifndef __ASSEMBLY__ -/* - * Initialize the IRQ controller. - */ -extern void at91rm9200_init_irq(unsigned int priority[]); -#endif - #endif diff --git a/include/asm-arm/arch-at91rm9200/memory.h b/include/asm-arm/arch-at91rm9200/memory.h index 462f1f0ad..f985069e6 100644 --- a/include/asm-arm/arch-at91rm9200/memory.h +++ b/include/asm-arm/arch-at91rm9200/memory.h @@ -21,7 +21,7 @@ #ifndef __ASM_ARCH_MEMORY_H #define __ASM_ARCH_MEMORY_H -#include +#include #define PHYS_OFFSET (AT91_SDRAM_BASE) @@ -33,9 +33,7 @@ * bus_to_virt: Used to convert an address for DMA operations * to an address that the kernel can use. */ -#define __virt_to_bus__is_a_macro #define __virt_to_bus(x) __virt_to_phys(x) -#define __bus_to_virt__is_a_macro #define __bus_to_virt(x) __phys_to_virt(x) #endif diff --git a/include/asm-arm/arch-at91rm9200/pio.h b/include/asm-arm/arch-at91rm9200/pio.h deleted file mode 100644 index a89501b4a..000000000 --- a/include/asm-arm/arch-at91rm9200/pio.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - * include/asm-arm/arch-at91rm9200/pio.h - * - * Copyright (C) 2003 SAN People - * - * 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 __ASM_ARCH_PIO_H -#define __ASM_ARCH_PIO_H - -#include - -static inline void AT91_CfgPIO_USART0(void) { - at91_sys_write(AT91_PIOA + PIO_PDR, AT91_PA17_TXD0 | AT91_PA18_RXD0 | AT91_PA20_CTS0); - - /* - * Errata #39 - RTS0 is not internally connected to PA21. We need to drive - * the pin manually. Default is off (RTS is active low). - */ - at91_sys_write(AT91_PIOA + PIO_PER, AT91_PA21_RTS0); - at91_sys_write(AT91_PIOA + PIO_OER, AT91_PA21_RTS0); - at91_sys_write(AT91_PIOA + PIO_SODR, AT91_PA21_RTS0); -} - -static inline void AT91_CfgPIO_USART1(void) { - at91_sys_write(AT91_PIOB + PIO_PDR, AT91_PB18_RI1 | AT91_PB19_DTR1 - | AT91_PB20_TXD1 | AT91_PB21_RXD1 | AT91_PB23_DCD1 - | AT91_PB24_CTS1 | AT91_PB25_DSR1 | AT91_PB26_RTS1); -} - -static inline void AT91_CfgPIO_USART2(void) { - at91_sys_write(AT91_PIOA + PIO_PDR, AT91_PA22_RXD2 | AT91_PA23_TXD2); -} - -static inline void AT91_CfgPIO_USART3(void) { - at91_sys_write(AT91_PIOA + PIO_PDR, AT91_PA5_TXD3 | AT91_PA6_RXD3); - at91_sys_write(AT91_PIOA + PIO_BSR, AT91_PA5_TXD3 | AT91_PA6_RXD3); -} - -static inline void AT91_CfgPIO_DBGU(void) { - at91_sys_write(AT91_PIOA + PIO_PDR, AT91_PA31_DTXD | AT91_PA30_DRXD); -} - -/* - * Enable the Two-Wire interface. - */ -static inline void AT91_CfgPIO_TWI(void) { - at91_sys_write(AT91_PIOA + PIO_PDR, AT91_PA25_TWD | AT91_PA26_TWCK); - at91_sys_write(AT91_PIOA + PIO_ASR, AT91_PA25_TWD | AT91_PA26_TWCK); - at91_sys_write(AT91_PIOA + PIO_MDER, AT91_PA25_TWD | AT91_PA26_TWCK); /* open drain */ -} - -/* - * Enable the Serial Peripheral Interface. - */ -static inline void AT91_CfgPIO_SPI(void) { - at91_sys_write(AT91_PIOA + PIO_PDR, AT91_PA0_MISO | AT91_PA1_MOSI | AT91_PA2_SPCK); -} - -static inline void AT91_CfgPIO_SPI_CS0(void) { - at91_sys_write(AT91_PIOA + PIO_PDR, AT91_PA3_NPCS0); -} - -static inline void AT91_CfgPIO_SPI_CS1(void) { - at91_sys_write(AT91_PIOA + PIO_PDR, AT91_PA4_NPCS1); -} - -static inline void AT91_CfgPIO_SPI_CS2(void) { - at91_sys_write(AT91_PIOA + PIO_PDR, AT91_PA5_NPCS2); -} - -static inline void AT91_CfgPIO_SPI_CS3(void) { - at91_sys_write(AT91_PIOA + PIO_PDR, AT91_PA6_NPCS3); -} - -/* - * Select the DataFlash card. - */ -static inline void AT91_CfgPIO_DataFlashCard(void) { - at91_sys_write(AT91_PIOB + PIO_PER, AT91_PIO_P(7)); - at91_sys_write(AT91_PIOB + PIO_OER, AT91_PIO_P(7)); - at91_sys_write(AT91_PIOB + PIO_CODR, AT91_PIO_P(7)); -} - -/* - * Enable NAND Flash (SmartMedia) interface. - */ -static inline void AT91_CfgPIO_SmartMedia(void) { - /* enable PC0=SMCE, PC1=SMOE, PC3=SMWE, A21=CLE, A22=ALE */ - at91_sys_write(AT91_PIOC + PIO_ASR, AT91_PC0_BFCK | AT91_PC1_BFRDY_SMOE | AT91_PC3_BFBAA_SMWE); - at91_sys_write(AT91_PIOC + PIO_PDR, AT91_PC0_BFCK | AT91_PC1_BFRDY_SMOE | AT91_PC3_BFBAA_SMWE); - - /* Configure PC2 as input (signal READY of the SmartMedia) */ - at91_sys_write(AT91_PIOC + PIO_PER, AT91_PC2_BFAVD); /* enable direct output enable */ - at91_sys_write(AT91_PIOC + PIO_ODR, AT91_PC2_BFAVD); /* disable output */ - - /* Configure PB1 as input (signal Card Detect of the SmartMedia) */ - at91_sys_write(AT91_PIOB + PIO_PER, AT91_PIO_P(1)); /* enable direct output enable */ - at91_sys_write(AT91_PIOB + PIO_ODR, AT91_PIO_P(1)); /* disable output */ -} - -static inline int AT91_PIO_SmartMedia_RDY(void) { - return (at91_sys_read(AT91_PIOC + PIO_PDSR) & AT91_PIO_P(2)) ? 1 : 0; -} - -static inline int AT91_PIO_SmartMedia_CardDetect(void) { - return (at91_sys_read(AT91_PIOB + PIO_PDSR) & AT91_PIO_P(1)) ? 1 : 0; -} - -#endif diff --git a/include/asm-arm/arch-at91rm9200/system.h b/include/asm-arm/arch-at91rm9200/system.h index 29c42655f..8a2ff472e 100644 --- a/include/asm-arm/arch-at91rm9200/system.h +++ b/include/asm-arm/arch-at91rm9200/system.h @@ -21,7 +21,7 @@ #ifndef __ASM_ARCH_SYSTEM_H #define __ASM_ARCH_SYSTEM_H -#include +#include static inline void arch_idle(void) { @@ -48,4 +48,12 @@ static inline void arch_reset(char mode) at91_sys_write(AT91_ST_CR, AT91_ST_WDRST); } +#define ARCH_ID_AT91RM9200 0x09200080 +#define ARCH_ID_AT91SAM9261 0x019000a0 + +static inline unsigned long arch_identify(void) +{ + return at91_sys_read(AT91_DBGU_CIDR) & (AT91_CIDR_EPROC | AT91_CIDR_ARCH); +} + #endif diff --git a/include/asm-arm/arch-at91rm9200/timex.h b/include/asm-arm/arch-at91rm9200/timex.h index 3f112dd12..88687cefe 100644 --- a/include/asm-arm/arch-at91rm9200/timex.h +++ b/include/asm-arm/arch-at91rm9200/timex.h @@ -21,7 +21,7 @@ #ifndef __ASM_ARCH_TIMEX_H #define __ASM_ARCH_TIMEX_H -#include +#include #define CLOCK_TICK_RATE (AT91_SLOW_CLOCK) diff --git a/include/asm-arm/arch-at91rm9200/uncompress.h b/include/asm-arm/arch-at91rm9200/uncompress.h index 7b38497c2..ec7811ab0 100644 --- a/include/asm-arm/arch-at91rm9200/uncompress.h +++ b/include/asm-arm/arch-at91rm9200/uncompress.h @@ -21,7 +21,7 @@ #ifndef __ASM_ARCH_UNCOMPRESS_H #define __ASM_ARCH_UNCOMPRESS_H -#include +#include /* * The following code assumes the serial port has already been diff --git a/include/asm-arm/arch-at91rm9200/vmalloc.h b/include/asm-arm/arch-at91rm9200/vmalloc.h index 34d9718fe..4c367eb57 100644 --- a/include/asm-arm/arch-at91rm9200/vmalloc.h +++ b/include/asm-arm/arch-at91rm9200/vmalloc.h @@ -21,6 +21,6 @@ #ifndef __ASM_ARCH_VMALLOC_H #define __ASM_ARCH_VMALLOC_H -#define VMALLOC_END (AT91_IO_VIRT_BASE & PGDIR_MASK) +#define VMALLOC_END (AT91_SRAM_VIRT_BASE & PGDIR_MASK) #endif diff --git a/include/asm-arm/arch-cl7500/acornfb.h b/include/asm-arm/arch-cl7500/acornfb.h index 3867231a4..aea6330c9 100644 --- a/include/asm-arm/arch-cl7500/acornfb.h +++ b/include/asm-arm/arch-cl7500/acornfb.h @@ -1,4 +1,3 @@ -#include #define acornfb_valid_pixrate(var) (var->pixclock >= 39325 && var->pixclock <= 40119) static inline void diff --git a/include/asm-arm/arch-clps711x/hardware.h b/include/asm-arm/arch-clps711x/hardware.h index 1386871e1..0fdbe72ff 100644 --- a/include/asm-arm/arch-clps711x/hardware.h +++ b/include/asm-arm/arch-clps711x/hardware.h @@ -22,7 +22,6 @@ #ifndef __ASM_ARCH_HARDWARE_H #define __ASM_ARCH_HARDWARE_H -#include #define CLPS7111_VIRT_BASE 0xff000000 #define CLPS7111_BASE CLPS7111_VIRT_BASE diff --git a/include/asm-arm/arch-clps711x/io.h b/include/asm-arm/arch-clps711x/io.h index 62613b0e2..53d790202 100644 --- a/include/asm-arm/arch-clps711x/io.h +++ b/include/asm-arm/arch-clps711x/io.h @@ -26,7 +26,6 @@ #define __io(a) ((void __iomem *)(a)) #define __mem_pci(a) (a) -#define __mem_isa(a) (a) /* * We don't support ins[lb]/outs[lb]. Make them fault. diff --git a/include/asm-arm/arch-clps711x/memory.h b/include/asm-arm/arch-clps711x/memory.h index 61d871740..c6e8dcf67 100644 --- a/include/asm-arm/arch-clps711x/memory.h +++ b/include/asm-arm/arch-clps711x/memory.h @@ -20,7 +20,6 @@ #ifndef __ASM_ARCH_MEMORY_H #define __ASM_ARCH_MEMORY_H -#include /* * Physical DRAM offset. diff --git a/include/asm-arm/arch-clps711x/uncompress.h b/include/asm-arm/arch-clps711x/uncompress.h index 07157b7e4..03d233ae8 100644 --- a/include/asm-arm/arch-clps711x/uncompress.h +++ b/include/asm-arm/arch-clps711x/uncompress.h @@ -17,7 +17,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include #include #include #include diff --git a/include/asm-arm/arch-ebsa285/hardware.h b/include/asm-arm/arch-ebsa285/hardware.h index ec51fe924..daad8ee2d 100644 --- a/include/asm-arm/arch-ebsa285/hardware.h +++ b/include/asm-arm/arch-ebsa285/hardware.h @@ -12,7 +12,6 @@ #ifndef __ASM_ARCH_HARDWARE_H #define __ASM_ARCH_HARDWARE_H -#include #include #ifdef CONFIG_ARCH_FOOTBRIDGE diff --git a/include/asm-arm/arch-ebsa285/io.h b/include/asm-arm/arch-ebsa285/io.h index 776f9d377..f9c729141 100644 --- a/include/asm-arm/arch-ebsa285/io.h +++ b/include/asm-arm/arch-ebsa285/io.h @@ -24,7 +24,6 @@ #define __io(a) ((void __iomem *)(PCIO_BASE + (a))) #if 1 #define __mem_pci(a) (a) -#define __mem_isa(a) ((a) + PCIMEM_BASE) #else static inline void __iomem *___mem_pci(void __iomem *p) @@ -34,14 +33,7 @@ static inline void __iomem *___mem_pci(void __iomem *p) return p; } -static inline void __iomem *___mem_isa(void __iomem *p) -{ - unsigned long a = (unsigned long)p; - BUG_ON(a >= 16*1048576); - return p + PCIMEM_BASE; -} #define __mem_pci(a) ___mem_pci(a) -#define __mem_isa(a) ___mem_isa(a) #endif #endif diff --git a/include/asm-arm/arch-ebsa285/memory.h b/include/asm-arm/arch-ebsa285/memory.h index 99181ffc7..cbd7ae64b 100644 --- a/include/asm-arm/arch-ebsa285/memory.h +++ b/include/asm-arm/arch-ebsa285/memory.h @@ -19,7 +19,6 @@ #ifndef __ASM_ARCH_MEMORY_H #define __ASM_ARCH_MEMORY_H -#include #if defined(CONFIG_FOOTBRIDGE_ADDIN) /* diff --git a/include/asm-arm/arch-ebsa285/vmalloc.h b/include/asm-arm/arch-ebsa285/vmalloc.h index d1ca955ce..025982009 100644 --- a/include/asm-arm/arch-ebsa285/vmalloc.h +++ b/include/asm-arm/arch-ebsa285/vmalloc.h @@ -6,7 +6,6 @@ * published by the Free Software Foundation. */ -#include #ifdef CONFIG_ARCH_FOOTBRIDGE #define VMALLOC_END (PAGE_OFFSET + 0x30000000) diff --git a/include/asm-arm/arch-ep93xx/ep93xx-regs.h b/include/asm-arm/arch-ep93xx/ep93xx-regs.h index 71cea0b58..8c322975f 100644 --- a/include/asm-arm/arch-ep93xx/ep93xx-regs.h +++ b/include/asm-arm/arch-ep93xx/ep93xx-regs.h @@ -115,6 +115,8 @@ #define EP93XX_SYSCON_CLOCK_USH_EN 0x10000000 #define EP93XX_SYSCON_HALT EP93XX_SYSCON_REG(0x08) #define EP93XX_SYSCON_STANDBY EP93XX_SYSCON_REG(0x0c) +#define EP93XX_SYSCON_CLOCK_SET1 EP93XX_SYSCON_REG(0x20) +#define EP93XX_SYSCON_CLOCK_SET2 EP93XX_SYSCON_REG(0x24) #define EP93XX_SYSCON_DEVICE_CONFIG EP93XX_SYSCON_REG(0x80) #define EP93XX_SYSCON_DEVICE_CONFIG_CRUNCH_ENABLE 0x00800000 #define EP93XX_SYSCON_SWLOCK EP93XX_SYSCON_REG(0xc0) diff --git a/include/asm-arm/arch-ep93xx/platform.h b/include/asm-arm/arch-ep93xx/platform.h index df9cbb6ef..d7a34ce20 100644 --- a/include/asm-arm/arch-ep93xx/platform.h +++ b/include/asm-arm/arch-ep93xx/platform.h @@ -8,6 +8,7 @@ void ep93xx_map_io(void); void ep93xx_init_irq(void); void ep93xx_init_time(unsigned long); void ep93xx_init_devices(void); +void ep93xx_clock_init(void); extern struct sys_timer ep93xx_timer; diff --git a/include/asm-arm/arch-h720x/memory.h b/include/asm-arm/arch-h720x/memory.h index 4a1bfd78a..53e923dba 100644 --- a/include/asm-arm/arch-h720x/memory.h +++ b/include/asm-arm/arch-h720x/memory.h @@ -23,9 +23,7 @@ * There is something to do here later !, Mar 2000, Jungjun Kim */ -#define __virt_to_bus__is_a_macro #define __virt_to_bus(x) __virt_to_phys(x) -#define __bus_to_virt__is_a_macro #define __bus_to_virt(x) __phys_to_virt(x) #endif diff --git a/include/asm-arm/arch-imx/imx-dma.h b/include/asm-arm/arch-imx/imx-dma.h index f2063c1d6..599f03e5a 100644 --- a/include/asm-arm/arch-imx/imx-dma.h +++ b/include/asm-arm/arch-imx/imx-dma.h @@ -46,7 +46,7 @@ struct imx_dma_channel { const char *name; void (*irq_handler) (int, void *, struct pt_regs *); - void (*err_handler) (int, void *, struct pt_regs *); + void (*err_handler) (int, void *, struct pt_regs *, int errcode); void *data; dmamode_t dma_mode; struct scatterlist *sg; @@ -58,6 +58,10 @@ struct imx_dma_channel { extern struct imx_dma_channel imx_dma_channels[IMX_DMA_CHANNELS]; +#define IMX_DMA_ERR_BURST 1 +#define IMX_DMA_ERR_REQUEST 2 +#define IMX_DMA_ERR_TRANSFER 4 +#define IMX_DMA_ERR_BUFFER 8 /* The type to distinguish channel numbers parameter from ordinal int type */ typedef int imx_dmach_t; @@ -74,7 +78,7 @@ imx_dma_setup_sg(imx_dmach_t dma_ch, int imx_dma_setup_handlers(imx_dmach_t dma_ch, void (*irq_handler) (int, void *, struct pt_regs *), - void (*err_handler) (int, void *, struct pt_regs *), void *data); + void (*err_handler) (int, void *, struct pt_regs *, int), void *data); void imx_dma_enable(imx_dmach_t dma_ch); diff --git a/include/asm-arm/arch-imx/memory.h b/include/asm-arm/arch-imx/memory.h index d09ae32cd..5ad901279 100644 --- a/include/asm-arm/arch-imx/memory.h +++ b/include/asm-arm/arch-imx/memory.h @@ -30,9 +30,7 @@ * bus_to_virt: Used to convert an address for DMA operations * to an address that the kernel can use. */ -#define __virt_to_bus__is_a_macro -#define __virt_to_bus(x) (x - PAGE_OFFSET + PHYS_OFFSET) -#define __bus_to_virt__is_a_macro -#define __bus_to_virt(x) (x - PHYS_OFFSET + PAGE_OFFSET) +#define __virt_to_bus(x) (x - PAGE_OFFSET + PHYS_OFFSET) +#define __bus_to_virt(x) (x - PHYS_OFFSET + PAGE_OFFSET) #endif diff --git a/include/asm-arm/arch-integrator/io.h b/include/asm-arm/arch-integrator/io.h index 31f2deab5..c8f217594 100644 --- a/include/asm-arm/arch-integrator/io.h +++ b/include/asm-arm/arch-integrator/io.h @@ -32,6 +32,5 @@ #define __io(a) ((void __iomem *)(PCI_IO_VADDR + (a))) #define __mem_pci(a) (a) -#define __mem_isa(a) ((a) + PCI_MEMORY_VADDR) #endif diff --git a/include/asm-arm/arch-integrator/smp.h b/include/asm-arm/arch-integrator/smp.h index da6981efd..ab2c79bb9 100644 --- a/include/asm-arm/arch-integrator/smp.h +++ b/include/asm-arm/arch-integrator/smp.h @@ -1,7 +1,6 @@ #ifndef ASMARM_ARCH_SMP_H #define ASMARM_ARCH_SMP_H -#include #include #include diff --git a/include/asm-arm/arch-iop3xx/io.h b/include/asm-arm/arch-iop3xx/io.h index f39046a6a..36adbdf50 100644 --- a/include/asm-arm/arch-iop3xx/io.h +++ b/include/asm-arm/arch-iop3xx/io.h @@ -17,6 +17,5 @@ #define __io(p) ((void __iomem *)(p)) #define __mem_pci(a) (a) -#define __mem_isa(a) (a) #endif diff --git a/include/asm-arm/arch-iop3xx/iop331-irqs.h b/include/asm-arm/arch-iop3xx/iop331-irqs.h index 8ff73d487..7135ad7e3 100644 --- a/include/asm-arm/arch-iop3xx/iop331-irqs.h +++ b/include/asm-arm/arch-iop3xx/iop331-irqs.h @@ -91,7 +91,6 @@ #define NR_IRQS NR_IOP331_IRQS -#if defined(CONFIG_ARCH_IQ80331) /* * Interrupts available on the IQ80331 board */ @@ -111,7 +110,6 @@ #define IRQ_IQ80331_INTC IRQ_IOP331_XINT2 #define IRQ_IQ80331_INTD IRQ_IOP331_XINT3 -#elif defined(CONFIG_MACH_IQ80332) /* * Interrupts available on the IQ80332 board */ @@ -131,6 +129,4 @@ #define IRQ_IQ80332_INTC IRQ_IOP331_XINT2 #define IRQ_IQ80332_INTD IRQ_IOP331_XINT3 -#endif - #endif // _IOP331_IRQ_H_ diff --git a/include/asm-arm/arch-iop3xx/memory.h b/include/asm-arm/arch-iop3xx/memory.h index bc62f4b13..e43ebd984 100644 --- a/include/asm-arm/arch-iop3xx/memory.h +++ b/include/asm-arm/arch-iop3xx/memory.h @@ -5,7 +5,6 @@ #ifndef __ASM_ARCH_MEMORY_H #define __ASM_ARCH_MEMORY_H -#include #include /* diff --git a/include/asm-arm/arch-iop3xx/timex.h b/include/asm-arm/arch-iop3xx/timex.h index 472badb45..14ca8d0f7 100644 --- a/include/asm-arm/arch-iop3xx/timex.h +++ b/include/asm-arm/arch-iop3xx/timex.h @@ -3,7 +3,6 @@ * * IOP3xx architecture timex specifications */ -#include #include #if defined(CONFIG_ARCH_IQ80321) || defined(CONFIG_ARCH_IQ31244) diff --git a/include/asm-arm/arch-iop3xx/uncompress.h b/include/asm-arm/arch-iop3xx/uncompress.h index c98eb6254..fbdd5af64 100644 --- a/include/asm-arm/arch-iop3xx/uncompress.h +++ b/include/asm-arm/arch-iop3xx/uncompress.h @@ -1,7 +1,6 @@ /* * linux/include/asm-arm/arch-iop3xx/uncompress.h */ -#include #include #include #include diff --git a/include/asm-arm/arch-ixp23xx/entry-macro.S b/include/asm-arm/arch-ixp23xx/entry-macro.S index 0ef4e6016..867761677 100644 --- a/include/asm-arm/arch-ixp23xx/entry-macro.S +++ b/include/asm-arm/arch-ixp23xx/entry-macro.S @@ -8,7 +8,7 @@ .macro get_irqnr_and_base, irqnr, irqstat, base, tmp ldr \irqnr, =(IXP23XX_INTC_VIRT + IXP23XX_INTR_IRQ_ENC_ST_OFFSET) ldr \irqnr, [\irqnr] @ get interrupt number - cmp \irqnr, #0x0 @ suprious interrupt ? + cmp \irqnr, #0x0 @ spurious interrupt ? movne \irqnr, \irqnr, lsr #2 @ skip unwanted low order bits subne \irqnr, \irqnr, #1 @ convert to 0 based diff --git a/include/asm-arm/arch-ixp23xx/ixp23xx.h b/include/asm-arm/arch-ixp23xx/ixp23xx.h index e49e1ca61..3927b1d61 100644 --- a/include/asm-arm/arch-ixp23xx/ixp23xx.h +++ b/include/asm-arm/arch-ixp23xx/ixp23xx.h @@ -124,6 +124,7 @@ #define IXP23XX_EXP_UNIT_FUSE IXP23XX_EXP_CFG_REG(0x28) #define IXP23XX_EXP_MSF_MUX IXP23XX_EXP_CFG_REG(0x30) +#define IXP23XX_EXP_CFG_FUSE IXP23XX_EXP_CFG_REG(0x34) #define IXP23XX_EXP_BUS_PHYS 0x90000000 #define IXP23XX_EXP_BUS_WINDOW_SIZE 0x01000000 @@ -251,7 +252,7 @@ * CAP CSRs. ****************************************************************************/ #define IXP23XX_GLOBAL_REG(x) ((volatile unsigned long *)(IXP23XX_CAP_CSR_VIRT + 0x4a00 + (x))) -#define IXP23XX_PROD_IDG IXP23XX_GLOBAL_REG(0x00) +#define IXP23XX_PRODUCT_ID IXP23XX_GLOBAL_REG(0x00) #define IXP23XX_MISC_CONTROL IXP23XX_GLOBAL_REG(0x04) #define IXP23XX_MSF_CLK_CNTRL IXP23XX_GLOBAL_REG(0x08) #define IXP23XX_RESET0 IXP23XX_GLOBAL_REG(0x0c) @@ -265,6 +266,8 @@ #define IXP23XX_PCI_UNIT_RESET (1 << 1) #define IXP23XX_XSCALE_RESET (1 << 0) +#define IXP23XX_UENGINE_CSR_VIRT_BASE (IXP23XX_CAP_CSR_VIRT + 0x18000) + /**************************************************************************** * PCI CSRs. @@ -292,15 +295,4 @@ #define IXP23XX_PCI_CPP_ADDR_BITS IXP23XX_PCI_CSR(0x0160) -#ifndef __ASSEMBLY__ -/* - * Is system memory on the XSI or CPP bus? - */ -static inline unsigned ixp23xx_cpp_boot(void) -{ - return (*IXP23XX_EXP_CFG0 & IXP23XX_EXP_CFG0_XSI_NOT_PRES); -} -#endif - - #endif diff --git a/include/asm-arm/arch-ixp23xx/platform.h b/include/asm-arm/arch-ixp23xx/platform.h index e4d99060a..56e16d666 100644 --- a/include/asm-arm/arch-ixp23xx/platform.h +++ b/include/asm-arm/arch-ixp23xx/platform.h @@ -14,6 +14,21 @@ #ifndef __ASSEMBLY__ +extern inline unsigned long ixp2000_reg_read(volatile void *reg) +{ + return *((volatile unsigned long *)reg); +} + +extern inline void ixp2000_reg_write(volatile void *reg, unsigned long val) +{ + *((volatile unsigned long *)reg) = val; +} + +extern inline void ixp2000_reg_wrb(volatile void *reg, unsigned long val) +{ + *((volatile unsigned long *)reg) = val; +} + struct pci_sys_data; void ixp23xx_map_io(void); @@ -28,5 +43,15 @@ extern struct sys_timer ixp23xx_timer; #define IXP23XX_UART_XTAL 14745600 +#ifndef __ASSEMBLY__ +/* + * Is system memory on the XSI or CPP bus? + */ +static inline unsigned ixp23xx_cpp_boot(void) +{ + return (*IXP23XX_EXP_CFG0 & IXP23XX_EXP_CFG0_XSI_NOT_PRES); +} +#endif + #endif diff --git a/include/asm-arm/arch-ixp23xx/uncompress.h b/include/asm-arm/arch-ixp23xx/uncompress.h index 013575e6a..16c1110f2 100644 --- a/include/asm-arm/arch-ixp23xx/uncompress.h +++ b/include/asm-arm/arch-ixp23xx/uncompress.h @@ -11,7 +11,7 @@ #ifndef __ASM_ARCH_UNCOMPRESS_H #define __ASM_ARCH_UNCOMPRESS_H -#include +#include #include #define UART_BASE ((volatile u32 *)IXP23XX_UART1_PHYS) diff --git a/include/asm-arm/arch-ixp4xx/dma.h b/include/asm-arm/arch-ixp4xx/dma.h index 312065dc0..789f7f53c 100644 --- a/include/asm-arm/arch-ixp4xx/dma.h +++ b/include/asm-arm/arch-ixp4xx/dma.h @@ -11,7 +11,6 @@ #ifndef __ASM_ARCH_DMA_H #define __ASM_ARCH_DMA_H -#include #include #include #include @@ -20,7 +19,4 @@ #define MAX_DMA_ADDRESS (PAGE_OFFSET + SZ_64M) -/* No DMA */ -#define MAX_DMA_CHANNELS 0 - #endif /* _ASM_ARCH_DMA_H */ diff --git a/include/asm-arm/arch-ixp4xx/io.h b/include/asm-arm/arch-ixp4xx/io.h index c27b9d307..0d517267f 100644 --- a/include/asm-arm/arch-ixp4xx/io.h +++ b/include/asm-arm/arch-ixp4xx/io.h @@ -3,7 +3,7 @@ * * Author: Deepak Saxena * - * Copyright (C) 2002-2004 MontaVista Software, Inc. + * Copyright (C) 2002-2005 MontaVista Software, Inc. * * 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 @@ -38,7 +38,7 @@ extern int ixp4xx_pci_write(u32 addr, u32 cmd, u32 data); * 2) If > 64MB of memory space is required, the IXP4xx can be configured * to use indirect registers to access PCI (as we do below for I/O * transactions). This allows for up to 128MB (0x48000000 to 0x4fffffff) - * of memory on the bus. The disadvantadge of this is that every + * of memory on the bus. The disadvantage of this is that every * PCI access requires three local register accesses plus a spinlock, * but in some cases the performance hit is acceptable. In addition, * you cannot mmap() PCI devices in this case. @@ -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,18 +70,16 @@ __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(p, v) __ixp4xx_writeb(p, v) -#define writew(p, v) __ixp4xx_writew(p, v) -#define writel(p, v) __ixp4xx_writel(p, v) +#define writeb(v, p) __ixp4xx_writeb(v, p) +#define writew(v, p) __ixp4xx_writew(v, p) +#define writel(v, p) __ixp4xx_writel(v, p) #define writesb(p, v, l) __ixp4xx_writesb(p, v, l) #define writesw(p, v, l) __ixp4xx_writesw(p, v, l) @@ -97,8 +94,9 @@ __ixp4xx_iounmap(void __iomem *addr) #define readsl(p, v, l) __ixp4xx_readsl(p, v, l) static inline void -__ixp4xx_writeb(u8 value, u32 addr) +__ixp4xx_writeb(u8 value, volatile void __iomem *p) { + u32 addr = (u32)p; u32 n, byte_enables, data; if (addr >= VMALLOC_START) { @@ -113,15 +111,16 @@ __ixp4xx_writeb(u8 value, u32 addr) } static inline void -__ixp4xx_writesb(u32 bus_addr, u8 *vaddr, int count) +__ixp4xx_writesb(volatile void __iomem *bus_addr, const u8 *vaddr, int count) { while (count--) writeb(*vaddr++, bus_addr); } static inline void -__ixp4xx_writew(u16 value, u32 addr) +__ixp4xx_writew(u16 value, volatile void __iomem *p) { + u32 addr = (u32)p; u32 n, byte_enables, data; if (addr >= VMALLOC_START) { @@ -136,15 +135,16 @@ __ixp4xx_writew(u16 value, u32 addr) } static inline void -__ixp4xx_writesw(u32 bus_addr, u16 *vaddr, int count) +__ixp4xx_writesw(volatile void __iomem *bus_addr, const u16 *vaddr, int count) { while (count--) writew(*vaddr++, bus_addr); } static inline void -__ixp4xx_writel(u32 value, u32 addr) +__ixp4xx_writel(u32 value, volatile void __iomem *p) { + u32 addr = (u32)p; if (addr >= VMALLOC_START) { __raw_writel(value, addr); return; @@ -154,15 +154,16 @@ __ixp4xx_writel(u32 value, u32 addr) } static inline void -__ixp4xx_writesl(u32 bus_addr, u32 *vaddr, int count) +__ixp4xx_writesl(volatile void __iomem *bus_addr, const u32 *vaddr, int count) { while (count--) writel(*vaddr++, bus_addr); } static inline unsigned char -__ixp4xx_readb(u32 addr) +__ixp4xx_readb(const volatile void __iomem *p) { + u32 addr = (u32)p; u32 n, byte_enables, data; if (addr >= VMALLOC_START) @@ -177,15 +178,16 @@ __ixp4xx_readb(u32 addr) } static inline void -__ixp4xx_readsb(u32 bus_addr, u8 *vaddr, u32 count) +__ixp4xx_readsb(const volatile void __iomem *bus_addr, u8 *vaddr, u32 count) { while (count--) *vaddr++ = readb(bus_addr); } static inline unsigned short -__ixp4xx_readw(u32 addr) +__ixp4xx_readw(const volatile void __iomem *p) { + u32 addr = (u32)p; u32 n, byte_enables, data; if (addr >= VMALLOC_START) @@ -200,15 +202,16 @@ __ixp4xx_readw(u32 addr) } static inline void -__ixp4xx_readsw(u32 bus_addr, u16 *vaddr, u32 count) +__ixp4xx_readsw(const volatile void __iomem *bus_addr, u16 *vaddr, u32 count) { while (count--) *vaddr++ = readw(bus_addr); } static inline unsigned long -__ixp4xx_readl(u32 addr) +__ixp4xx_readl(const volatile void __iomem *p) { + u32 addr = (u32)p; u32 data; if (addr >= VMALLOC_START) @@ -221,7 +224,7 @@ __ixp4xx_readl(u32 addr) } static inline void -__ixp4xx_readsl(u32 bus_addr, u32 *vaddr, u32 count) +__ixp4xx_readsl(const volatile void __iomem *bus_addr, u32 *vaddr, u32 count) { while (count--) *vaddr++ = readl(bus_addr); @@ -239,7 +242,7 @@ __ixp4xx_readsl(u32 bus_addr, u32 *vaddr, u32 count) eth_copy_and_sum((s),__mem_pci(c),(l),(b)) static inline int -check_signature(unsigned long bus_addr, const unsigned char *signature, +check_signature(const unsigned char __iomem *bus_addr, const unsigned char *signature, int length) { int retval = 0; @@ -257,6 +260,12 @@ out: #endif +#ifndef CONFIG_PCI + +#define __io(v) v + +#else + /* * IXP4xx does not have a transparent cpu -> PCI I/O translation * window. Instead, it has a set of registers that must be tweaked @@ -383,6 +392,199 @@ __ixp4xx_insl(u32 io_addr, u32 *vaddr, u32 count) *vaddr++ = inl(io_addr); } +#define PIO_OFFSET 0x10000UL +#define PIO_MASK 0x0ffffUL + +#define __is_io_address(p) (((unsigned long)p >= PIO_OFFSET) && \ + ((unsigned long)p <= (PIO_MASK + PIO_OFFSET))) +static inline unsigned int +__ixp4xx_ioread8(const void __iomem *addr) +{ + unsigned long port = (unsigned long __force)addr; + if (__is_io_address(port)) + return (unsigned int)__ixp4xx_inb(port & PIO_MASK); + else +#ifndef CONFIG_IXP4XX_INDIRECT_PCI + return (unsigned int)__raw_readb(port); +#else + return (unsigned int)__ixp4xx_readb(addr); +#endif +} + +static inline void +__ixp4xx_ioread8_rep(const void __iomem *addr, void *vaddr, u32 count) +{ + unsigned long port = (unsigned long __force)addr; + if (__is_io_address(port)) + __ixp4xx_insb(port & PIO_MASK, vaddr, count); + else +#ifndef CONFIG_IXP4XX_INDIRECT_PCI + __raw_readsb(addr, vaddr, count); +#else + __ixp4xx_readsb(addr, vaddr, count); +#endif +} + +static inline unsigned int +__ixp4xx_ioread16(const void __iomem *addr) +{ + unsigned long port = (unsigned long __force)addr; + if (__is_io_address(port)) + return (unsigned int)__ixp4xx_inw(port & PIO_MASK); + else +#ifndef CONFIG_IXP4XX_INDIRECT_PCI + return le16_to_cpu(__raw_readw((u32)port)); +#else + return (unsigned int)__ixp4xx_readw(addr); +#endif +} + +static inline void +__ixp4xx_ioread16_rep(const void __iomem *addr, void *vaddr, u32 count) +{ + unsigned long port = (unsigned long __force)addr; + if (__is_io_address(port)) + __ixp4xx_insw(port & PIO_MASK, vaddr, count); + else +#ifndef CONFIG_IXP4XX_INDIRECT_PCI + __raw_readsw(addr, vaddr, count); +#else + __ixp4xx_readsw(addr, vaddr, count); +#endif +} + +static inline unsigned int +__ixp4xx_ioread32(const void __iomem *addr) +{ + unsigned long port = (unsigned long __force)addr; + if (__is_io_address(port)) + return (unsigned int)__ixp4xx_inl(port & PIO_MASK); + else { +#ifndef CONFIG_IXP4XX_INDIRECT_PCI + return le32_to_cpu(__raw_readl((u32)port)); +#else + return (unsigned int)__ixp4xx_readl(addr); +#endif + } +} + +static inline void +__ixp4xx_ioread32_rep(const void __iomem *addr, void *vaddr, u32 count) +{ + unsigned long port = (unsigned long __force)addr; + if (__is_io_address(port)) + __ixp4xx_insl(port & PIO_MASK, vaddr, count); + else +#ifndef CONFIG_IXP4XX_INDIRECT_PCI + __raw_readsl(addr, vaddr, count); +#else + __ixp4xx_readsl(addr, vaddr, count); +#endif +} + +static inline void +__ixp4xx_iowrite8(u8 value, void __iomem *addr) +{ + unsigned long port = (unsigned long __force)addr; + if (__is_io_address(port)) + __ixp4xx_outb(value, port & PIO_MASK); + else +#ifndef CONFIG_IXP4XX_INDIRECT_PCI + __raw_writeb(value, port); +#else + __ixp4xx_writeb(value, addr); +#endif +} + +static inline void +__ixp4xx_iowrite8_rep(void __iomem *addr, const void *vaddr, u32 count) +{ + unsigned long port = (unsigned long __force)addr; + if (__is_io_address(port)) + __ixp4xx_outsb(port & PIO_MASK, vaddr, count); + else +#ifndef CONFIG_IXP4XX_INDIRECT_PCI + __raw_writesb(addr, vaddr, count); +#else + __ixp4xx_writesb(addr, vaddr, count); +#endif +} + +static inline void +__ixp4xx_iowrite16(u16 value, void __iomem *addr) +{ + unsigned long port = (unsigned long __force)addr; + if (__is_io_address(port)) + __ixp4xx_outw(value, port & PIO_MASK); + else +#ifndef CONFIG_IXP4XX_INDIRECT_PCI + __raw_writew(cpu_to_le16(value), addr); +#else + __ixp4xx_writew(value, addr); +#endif +} + +static inline void +__ixp4xx_iowrite16_rep(void __iomem *addr, const void *vaddr, u32 count) +{ + unsigned long port = (unsigned long __force)addr; + if (__is_io_address(port)) + __ixp4xx_outsw(port & PIO_MASK, vaddr, count); + else +#ifndef CONFIG_IXP4XX_INDIRECT_PCI + __raw_writesw(addr, vaddr, count); +#else + __ixp4xx_writesw(addr, vaddr, count); +#endif +} + +static inline void +__ixp4xx_iowrite32(u32 value, void __iomem *addr) +{ + unsigned long port = (unsigned long __force)addr; + if (__is_io_address(port)) + __ixp4xx_outl(value, port & PIO_MASK); + else +#ifndef CONFIG_IXP4XX_INDIRECT_PCI + __raw_writel(cpu_to_le32(value), port); +#else + __ixp4xx_writel(value, addr); +#endif +} + +static inline void +__ixp4xx_iowrite32_rep(void __iomem *addr, const void *vaddr, u32 count) +{ + unsigned long port = (unsigned long __force)addr; + if (__is_io_address(port)) + __ixp4xx_outsl(port & PIO_MASK, vaddr, count); + else +#ifndef CONFIG_IXP4XX_INDIRECT_PCI + __raw_writesl(addr, vaddr, count); +#else + __ixp4xx_writesl(addr, vaddr, count); +#endif +} + +#define ioread8(p) __ixp4xx_ioread8(p) +#define ioread16(p) __ixp4xx_ioread16(p) +#define ioread32(p) __ixp4xx_ioread32(p) + +#define ioread8_rep(p, v, c) __ixp4xx_ioread8_rep(p, v, c) +#define ioread16_rep(p, v, c) __ixp4xx_ioread16_rep(p, v, c) +#define ioread32_rep(p, v, c) __ixp4xx_ioread32_rep(p, v, c) + +#define iowrite8(v,p) __ixp4xx_iowrite8(v,p) +#define iowrite16(v,p) __ixp4xx_iowrite16(v,p) +#define iowrite32(v,p) __ixp4xx_iowrite32(v,p) + +#define iowrite8_rep(p, v, c) __ixp4xx_iowrite8_rep(p, v, c) +#define iowrite16_rep(p, v, c) __ixp4xx_iowrite16_rep(p, v, c) +#define iowrite32_rep(p, v, c) __ixp4xx_iowrite32_rep(p, v, c) + +#define ioport_map(port, nr) ((void __iomem*)(port + PIO_OFFSET)) +#define ioport_unmap(addr) +#endif // !CONFIG_PCI #endif // __ASM_ARM_ARCH_IO_H diff --git a/include/asm-arm/arch-l7200/io.h b/include/asm-arm/arch-l7200/io.h index cab8ad0ad..cd080d838 100644 --- a/include/asm-arm/arch-l7200/io.h +++ b/include/asm-arm/arch-l7200/io.h @@ -19,7 +19,6 @@ */ #define __io_pci(a) ((void __iomem *)(PCIO_BASE + (a))) #define __mem_pci(a) (a) -#define __mem_isa(a) (a) #define __ioaddr(p) __io_pci(p) diff --git a/include/asm-arm/arch-lh7a40x/constants.h b/include/asm-arm/arch-lh7a40x/constants.h index 52c1cb9c3..51de96e87 100644 --- a/include/asm-arm/arch-lh7a40x/constants.h +++ b/include/asm-arm/arch-lh7a40x/constants.h @@ -12,7 +12,6 @@ #ifndef __ASM_ARCH_CONSTANTS_H #define __ASM_ARCH_CONSTANTS_H -#include /* Addressing constants */ @@ -29,8 +28,7 @@ #if defined (CONFIG_MACH_LPD7A400) || defined (CONFIG_MACH_LPD7A404) -# define IOBARRIER_PHYS 0xc0000000 /* Start of SDRAM */ -/*# define IOBARRIER_PHYS 0x00000000 */ /* Start of flash */ +# define IOBARRIER_PHYS 0x10000000 /* Second bank, fastest timing */ # define IOBARRIER_VIRT 0xf0000000 # define IOBARRIER_SIZE PAGE_SIZE @@ -53,6 +51,9 @@ # define CPLD08_PHYS CPLDX_PHYS (0x08) # define CPLD08_VIRT CPLDX_VIRT (0x08) # define CPLD08_SIZE PAGE_SIZE +# define CPLD0A_PHYS CPLDX_PHYS (0x0a) +# define CPLD0A_VIRT CPLDX_VIRT (0x0a) +# define CPLD0A_SIZE PAGE_SIZE # define CPLD0C_PHYS CPLDX_PHYS (0x0c) # define CPLD0C_VIRT CPLDX_VIRT (0x0c) # define CPLD0C_SIZE PAGE_SIZE @@ -84,5 +85,7 @@ #define XTAL_IN 14745600 /* 14.7456 MHz crystal */ #define PLL_CLOCK (XTAL_IN * 21) /* 309 MHz PLL clock */ #define MAX_HCLK_KHZ 100000 /* HCLK max limit ~100MHz */ +#define HCLK (99993600) +//#define HCLK (119808000) #endif /* __ASM_ARCH_CONSTANTS_H */ diff --git a/include/asm-arm/arch-lh7a40x/dma.h b/include/asm-arm/arch-lh7a40x/dma.h index 15492e325..a8cbd14bb 100644 --- a/include/asm-arm/arch-lh7a40x/dma.h +++ b/include/asm-arm/arch-lh7a40x/dma.h @@ -1,9 +1,86 @@ /* include/asm-arm/arch-lh7a40x/dma.h * - * Copyright (C) 2003 Coastal Environmental Systems + * Copyright (C) 2005 Marc Singer * * 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. * */ + +typedef enum { + DMA_M2M0 = 0, + DMA_M2M1 = 1, + DMA_M2P0 = 2, /* Tx */ + DMA_M2P1 = 3, /* Rx */ + DMA_M2P2 = 4, /* Tx */ + DMA_M2P3 = 5, /* Rx */ + DMA_M2P4 = 6, /* Tx - AC97 */ + DMA_M2P5 = 7, /* Rx - AC97 */ + DMA_M2P6 = 8, /* Tx */ + DMA_M2P7 = 9, /* Rx */ +} dma_device_t; + +#define DMA_LENGTH_MAX ((64*1024) - 4) /* bytes */ + +#define DMAC_GCA __REG(DMAC_PHYS + 0x2b80) +#define DMAC_GIR __REG(DMAC_PHYS + 0x2bc0) + +#define DMAC_GIR_MMI1 (1<<11) +#define DMAC_GIR_MMI0 (1<<10) +#define DMAC_GIR_MPI8 (1<<9) +#define DMAC_GIR_MPI9 (1<<8) +#define DMAC_GIR_MPI6 (1<<7) +#define DMAC_GIR_MPI7 (1<<6) +#define DMAC_GIR_MPI4 (1<<5) +#define DMAC_GIR_MPI5 (1<<4) +#define DMAC_GIR_MPI2 (1<<3) +#define DMAC_GIR_MPI3 (1<<2) +#define DMAC_GIR_MPI0 (1<<1) +#define DMAC_GIR_MPI1 (1<<0) + +#define DMAC_M2P0 0x0000 +#define DMAC_M2P1 0x0040 +#define DMAC_M2P2 0x0080 +#define DMAC_M2P3 0x00c0 +#define DMAC_M2P4 0x0240 +#define DMAC_M2P5 0x0200 +#define DMAC_M2P6 0x02c0 +#define DMAC_M2P7 0x0280 +#define DMAC_M2P8 0x0340 +#define DMAC_M2P9 0x0300 +#define DMAC_M2M0 0x0100 +#define DMAC_M2M1 0x0140 + +#define DMAC_P_PCONTROL(c) __REG(DMAC_PHYS + (c) + 0x00) +#define DMAC_P_PINTERRUPT(c) __REG(DMAC_PHYS + (c) + 0x04) +#define DMAC_P_PPALLOC(c) __REG(DMAC_PHYS + (c) + 0x08) +#define DMAC_P_PSTATUS(c) __REG(DMAC_PHYS + (c) + 0x0c) +#define DMAC_P_REMAIN(c) __REG(DMAC_PHYS + (c) + 0x14) +#define DMAC_P_MAXCNT0(c) __REG(DMAC_PHYS + (c) + 0x20) +#define DMAC_P_BASE0(c) __REG(DMAC_PHYS + (c) + 0x24) +#define DMAC_P_CURRENT0(c) __REG(DMAC_PHYS + (c) + 0x28) +#define DMAC_P_MAXCNT1(c) __REG(DMAC_PHYS + (c) + 0x30) +#define DMAC_P_BASE1(c) __REG(DMAC_PHYS + (c) + 0x34) +#define DMAC_P_CURRENT1(c) __REG(DMAC_PHYS + (c) + 0x38) + +#define DMAC_PCONTROL_ENABLE (1<<4) + +#define DMAC_PORT_USB 0 +#define DMAC_PORT_SDMMC 1 +#define DMAC_PORT_AC97_1 2 +#define DMAC_PORT_AC97_2 3 +#define DMAC_PORT_AC97_3 4 +#define DMAC_PORT_UART1 6 +#define DMAC_PORT_UART2 7 +#define DMAC_PORT_UART3 8 + +#define DMAC_PSTATUS_CURRSTATE_SHIFT 4 +#define DMAC_PSTATUS_CURRSTATE_MASK 0x3 + +#define DMAC_PSTATUS_NEXTBUF (1<<6) +#define DMAC_PSTATUS_STALLRINT (1<<0) + +#define DMAC_INT_CHE (1<<3) +#define DMAC_INT_NFB (1<<1) +#define DMAC_INT_STALL (1<<0) diff --git a/include/asm-arm/arch-lh7a40x/entry-macro.S b/include/asm-arm/arch-lh7a40x/entry-macro.S index 865f396aa..9fc7f4988 100644 --- a/include/asm-arm/arch-lh7a40x/entry-macro.S +++ b/include/asm-arm/arch-lh7a40x/entry-macro.S @@ -7,12 +7,76 @@ * License version 2. This program is licensed "as is" without any * warranty of any kind, whether express or implied. */ +#include +#include -# if defined (CONFIG_ARCH_LH7A400) && defined (CONFIG_ARCH_LH7A404) -# error "LH7A400 and LH7A404 are mutually exclusive" -# endif +/* In order to allow there to be support for both of the processor + classes at the same time, we make a hack here that isn't very + pretty. At startup, the link pointed to with the + branch_irq_lh7a400 symbol is replaced with a NOP when the CPU is + detected as a lh7a404. -# if defined (CONFIG_ARCH_LH7A400) + *** FIXME: we should clean this up so that there is only one + implementation for each CPU's design. + +*/ + +#if defined (CONFIG_ARCH_LH7A400) && defined (CONFIG_ARCH_LH7A404) + + .macro disable_fiq + .endm + + .macro get_irqnr_and_base, irqnr, irqstat, base, tmp + +branch_irq_lh7a400: b 1000f + +@ Implementation of the LH7A404 get_irqnr_and_base. + + mov \irqnr, #0 @ VIC1 irq base + mov \base, #io_p2v(0x80000000) @ APB registers + add \base, \base, #0x8000 + ldr \tmp, [\base, #0x0030] @ VIC1_VECTADDR + tst \tmp, #VA_VECTORED @ Direct vectored + bne 1002f + tst \tmp, #VA_VIC1DEFAULT @ Default vectored VIC1 + ldrne \irqstat, [\base, #0] @ VIC1_IRQSTATUS + bne 1001f + add \base, \base, #(0xa000 - 0x8000) + ldr \tmp, [\base, #0x0030] @ VIC2_VECTADDR + tst \tmp, #VA_VECTORED @ Direct vectored + bne 1002f + ldr \irqstat, [\base, #0] @ VIC2_IRQSTATUS + mov \irqnr, #32 @ VIC2 irq base + +1001: movs \irqstat, \irqstat, lsr #1 @ Shift into carry + bcs 1008f @ Bit set; irq found + add \irqnr, \irqnr, #1 + bne 1001b @ Until no bits + b 1009f @ Nothing? Hmm. +1002: and \irqnr, \tmp, #0x3f @ Mask for valid bits +1008: movs \irqstat, #1 @ Force !Z + str \tmp, [\base, #0x0030] @ Clear vector + b 1009f + +@ Implementation of the LH7A400 get_irqnr_and_base. + +1000: mov \irqnr, #0 + mov \base, #io_p2v(0x80000000) @ APB registers + ldr \irqstat, [\base, #0x500] @ PIC INTSR + +1001: movs \irqstat, \irqstat, lsr #1 @ Shift into carry + bcs 1008f @ Bit set; irq found + add \irqnr, \irqnr, #1 + bne 1001b @ Until no bits + b 1009f @ Nothing? Hmm. +1008: movs \irqstat, #1 @ Force !Z + +1009: + .endm + + + +#elif defined (CONFIG_ARCH_LH7A400) .macro disable_fiq .endm diff --git a/include/asm-arm/arch-lh7a40x/hardware.h b/include/asm-arm/arch-lh7a40x/hardware.h index aeb07c162..e9ff74fd7 100644 --- a/include/asm-arm/arch-lh7a40x/hardware.h +++ b/include/asm-arm/arch-lh7a40x/hardware.h @@ -13,6 +13,8 @@ #ifndef __ASM_ARCH_HARDWARE_H #define __ASM_ARCH_HARDWARE_H +#include /* Added for the sake of amba-clcd driver */ + #define io_p2v(x) (0xf0000000 | (((x) & 0xfff00000) >> 4) | ((x) & 0x0000ffff)) #define io_v2p(x) ( (((x) & 0x0fff0000) << 4) | ((x) & 0x0000ffff)) @@ -53,6 +55,8 @@ typedef struct { volatile u8 offset[4096]; } __regbase8; #endif +#define MASK_AND_SET(v,m,s) (v) = ((v)&~(m))|(s) + #include "registers.h" #endif /* _ASM_ARCH_HARDWARE_H */ diff --git a/include/asm-arm/arch-lh7a40x/io.h b/include/asm-arm/arch-lh7a40x/io.h index bbcd4335f..17bc94097 100644 --- a/include/asm-arm/arch-lh7a40x/io.h +++ b/include/asm-arm/arch-lh7a40x/io.h @@ -18,6 +18,5 @@ /* No ISA or PCI bus on this machine. */ #define __io(a) ((void __iomem *)(a)) #define __mem_pci(a) (a) -#define __mem_isa(a) (a) #endif /* __ASM_ARCH_IO_H */ diff --git a/include/asm-arm/arch-lh7a40x/irqs.h b/include/asm-arm/arch-lh7a40x/irqs.h index f91f3e59f..afe8c7cba 100644 --- a/include/asm-arm/arch-lh7a40x/irqs.h +++ b/include/asm-arm/arch-lh7a40x/irqs.h @@ -18,7 +18,6 @@ #ifndef __ASM_ARCH_IRQS_H #define __ASM_ARCH_IRQS_H -#include #define FIQ_START 80 @@ -154,9 +153,10 @@ #if !defined (IRQ_GPIO0INTR) # define IRQ_GPIO0INTR IRQ_GPIO0FIQ #endif -#define IRQ_TICK IRQ_TINTR +#define IRQ_TICK IRQ_TINTR #define IRQ_PCC1_RDY IRQ_GPIO6INTR /* PCCard 1 ready */ #define IRQ_PCC2_RDY IRQ_GPIO7INTR /* PCCard 2 ready */ +#define IRQ_USB IRQ_USBINTR /* USB device */ #ifdef CONFIG_MACH_KEV7A400 # define IRQ_TS IRQ_GPIOFIQ /* Touchscreen */ @@ -191,6 +191,10 @@ # define IRQ_LPD7A400_TS IRQ_LPD7A40X_CPLD + 1 /* Touch screen */ #endif +#if defined (CONFIG_MACH_LPD7A400) +# define IRQ_TOUCH IRQ_LPD7A400_TS +#endif + #define NR_IRQS (NR_IRQ_CPU + NR_IRQ_BOARD) #endif diff --git a/include/asm-arm/arch-lh7a40x/registers.h b/include/asm-arm/arch-lh7a40x/registers.h index 2edb22e35..b4f09b3e2 100644 --- a/include/asm-arm/arch-lh7a40x/registers.h +++ b/include/asm-arm/arch-lh7a40x/registers.h @@ -9,7 +9,6 @@ * */ -#include #include #ifndef __ASM_ARCH_REGISTERS_H @@ -18,7 +17,7 @@ /* Physical register base addresses */ -#define AC97_PHYS (0x80000000) /* AC97 Controller */ +#define AC97C_PHYS (0x80000000) /* AC97 Controller */ #define MMC_PHYS (0x80000100) /* Multimedia Card Controller */ #define USB_PHYS (0x80000200) /* USB Client */ #define SCI_PHYS (0x80000300) /* Secure Card Interface */ @@ -35,6 +34,8 @@ #define RTC_PHYS (0x80000d00) /* Real-time Clock */ #define GPIO_PHYS (0x80000e00) /* General Purpose IO */ #define BMI_PHYS (0x80000f00) /* Battery Monitor Interface */ +#define HRTFTC_PHYS (0x80001000) /* High-res TFT Controller (LH7A400) */ +#define ALI_PHYS (0x80001000) /* Advanced LCD Interface (LH7A404) */ #define WDT_PHYS (0x80001400) /* Watchdog Timer */ #define SMC_PHYS (0x80002000) /* Static Memory Controller */ #define SDRC_PHYS (0x80002400) /* SDRAM Controller */ @@ -43,6 +44,7 @@ /* Physical registers of the LH7A404 */ +#define ADC_PHYS (0x80001300) /* A/D & Touchscreen Controller */ #define VIC1_PHYS (0x80008000) /* Vectored Interrupt Controller 1 */ #define USBH_PHYS (0x80009000) /* USB OHCI host controller */ #define VIC2_PHYS (0x8000a000) /* Vectored Interrupt Controller 2 */ @@ -53,10 +55,32 @@ /* Clock/State Controller register */ +#define CSC_PWRSR __REG(CSC_PHYS + 0x00) /* Reset register & ID */ #define CSC_PWRCNT __REG(CSC_PHYS + 0x04) /* Power control */ +#define CSC_CLKSET __REG(CSC_PHYS + 0x20) /* Clock speed control */ +#define CSC_USBDRESET __REG(CSC_PHYS + 0x4c) /* USB Device resets */ #define CSC_PWRCNT_USBH_EN (1<<28) /* USB Host power enable */ - +#define CSC_PWRCNT_DMAC_M2M1_EN (1<<27) +#define CSC_PWRCNT_DMAC_M2M0_EN (1<<26) +#define CSC_PWRCNT_DMAC_M2P8_EN (1<<25) +#define CSC_PWRCNT_DMAC_M2P9_EN (1<<24) +#define CSC_PWRCNT_DMAC_M2P6_EN (1<<23) +#define CSC_PWRCNT_DMAC_M2P7_EN (1<<22) +#define CSC_PWRCNT_DMAC_M2P4_EN (1<<21) +#define CSC_PWRCNT_DMAC_M2P5_EN (1<<20) +#define CSC_PWRCNT_DMAC_M2P2_EN (1<<19) +#define CSC_PWRCNT_DMAC_M2P3_EN (1<<18) +#define CSC_PWRCNT_DMAC_M2P0_EN (1<<17) +#define CSC_PWRCNT_DMAC_M2P1_EN (1<<16) + +#define CSC_PWRSR_CHIPMAN_SHIFT (24) +#define CSC_PWRSR_CHIPMAN_MASK (0xff) +#define CSC_PWRSR_CHIPID_SHIFT (16) +#define CSC_PWRSR_CHIPID_MASK (0xff) + +#define CSC_USBDRESET_APBRESETREG (1<<1) +#define CSC_USBDRESET_IORESETREG (1<<0) /* Interrupt Controller registers */ @@ -109,6 +133,13 @@ #define GPIO_GPIOFEOI __REG(GPIO_PHYS + 0x54) /* GPIO End-of-Interrupt */ #define GPIO_GPIOINTEN __REG(GPIO_PHYS + 0x58) /* GPIO Interrupt Enable */ #define GPIO_INTSTATUS __REG(GPIO_PHYS + 0x5c) /* GPIO Interrupt Status */ +#define GPIO_PINMUX __REG(GPIO_PHYS + 0x2c) +#define GPIO_PADD __REG(GPIO_PHYS + 0x10) +#define GPIO_PAD __REG(GPIO_PHYS + 0x00) +#define GPIO_PCD __REG(GPIO_PHYS + 0x08) +#define GPIO_PCDD __REG(GPIO_PHYS + 0x18) +#define GPIO_PEDD __REG(GPIO_PHYS + 0x24) +#define GPIO_PED __REG(GPIO_PHYS + 0x20) /* Static Memory Controller registers */ @@ -138,20 +169,21 @@ #endif #if defined (CONFIG_MACH_LPD7A400) || defined (CONFIG_MACH_LPD7A404) -# define CPLD_CONTROL __REG8(CPLD02_PHYS) -# define CPLD_SPI_DATA __REG8(CPLD06_PHYS) -# define CPLD_SPI_CONTROL __REG8(CPLD08_PHYS) -# define CPLD_SPI_EEPROM __REG8(CPLD0A_PHYS) -# define CPLD_INTERRUPTS __REG8(CPLD0C_PHYS) /* IRQ mask/status */ -# define CPLD_BOOT_MODE __REG8(CPLD0E_PHYS) -# define CPLD_FLASH __REG8(CPLD10_PHYS) -# define CPLD_POWER_MGMT __REG8(CPLD12_PHYS) -# define CPLD_REVISION __REG8(CPLD14_PHYS) -# define CPLD_GPIO_EXT __REG8(CPLD16_PHYS) -# define CPLD_GPIO_DATA __REG8(CPLD18_PHYS) -# define CPLD_GPIO_DIR __REG8(CPLD1A_PHYS) -#endif +# define CPLD_CONTROL __REG16(CPLD02_PHYS) +# define CPLD_SPI_DATA __REG16(CPLD06_PHYS) +# define CPLD_SPI_CONTROL __REG16(CPLD08_PHYS) +# define CPLD_SPI_EEPROM __REG16(CPLD0A_PHYS) +# define CPLD_INTERRUPTS __REG16(CPLD0C_PHYS) /* IRQ mask/status */ +# define CPLD_BOOT_MODE __REG16(CPLD0E_PHYS) +# define CPLD_FLASH __REG16(CPLD10_PHYS) +# define CPLD_POWER_MGMT __REG16(CPLD12_PHYS) +# define CPLD_REVISION __REG16(CPLD14_PHYS) +# define CPLD_GPIO_EXT __REG16(CPLD16_PHYS) +# define CPLD_GPIO_DATA __REG16(CPLD18_PHYS) +# define CPLD_GPIO_DIR __REG16(CPLD1A_PHYS) + +#endif /* Timer registers */ @@ -190,4 +222,3 @@ #endif /* _ASM_ARCH_REGISTERS_H */ - diff --git a/include/asm-arm/arch-lh7a40x/uncompress.h b/include/asm-arm/arch-lh7a40x/uncompress.h index f8053346f..3d1ce0426 100644 --- a/include/asm-arm/arch-lh7a40x/uncompress.h +++ b/include/asm-arm/arch-lh7a40x/uncompress.h @@ -16,7 +16,7 @@ #ifndef UART_R_STATUS # define UART_R_STATUS (0x10) #endif -#define nTxRdy (0x20) /* Not TxReady (literally Tx FIFO full) */ +#define nTxRdy (0x20) /* Not TxReady (literally Tx FIFO full) */ /* Access UART with physical addresses before MMU is setup */ #define UART_STATUS (*(volatile unsigned long*) (UART2_PHYS + UART_R_STATUS)) diff --git a/include/asm-arm/arch-omap/board.h b/include/asm-arm/arch-omap/board.h index 6d6240a46..edf1dc6ad 100644 --- a/include/asm-arm/arch-omap/board.h +++ b/include/asm-arm/arch-omap/board.h @@ -10,7 +10,6 @@ #ifndef _OMAP_BOARD_H #define _OMAP_BOARD_H -#include #include /* Different peripheral ids */ @@ -23,6 +22,7 @@ #define OMAP_TAG_UART 0x4f07 #define OMAP_TAG_FBMEM 0x4f08 #define OMAP_TAG_STI_CONSOLE 0x4f09 +#define OMAP_TAG_CAMERA_SENSOR 0x4f0a #define OMAP_TAG_BOOT_REASON 0x4f80 #define OMAP_TAG_FLASH_PART 0x4f81 @@ -62,6 +62,12 @@ struct omap_sti_console_config { u8 channel; }; +struct omap_camera_sensor_config { + u16 reset_gpio; + int (*power_on)(void * data); + int (*power_off)(void * data); +}; + struct omap_usb_config { /* Configure drivers according to the connectors on your board: * - "A" connector (rectagular) diff --git a/include/asm-arm/arch-omap/clock.h b/include/asm-arm/arch-omap/clock.h index 3c4eb9fbe..f83003f52 100644 --- a/include/asm-arm/arch-omap/clock.h +++ b/include/asm-arm/arch-omap/clock.h @@ -48,8 +48,6 @@ struct clk_functions { }; extern unsigned int mpurate; -extern struct list_head clocks; -extern spinlock_t clockfw_lock; extern int clk_init(struct clk_functions * custom_clocks); extern int clk_register(struct clk *clk); diff --git a/include/asm-arm/arch-omap/dma.h b/include/asm-arm/arch-omap/dma.h index ca1202312..1b1b02307 100644 --- a/include/asm-arm/arch-omap/dma.h +++ b/include/asm-arm/arch-omap/dma.h @@ -185,8 +185,8 @@ /* DMA channels for 24xx */ #define OMAP24XX_DMA_NO_DEVICE 0 #define OMAP24XX_DMA_XTI_DMA 1 /* S_DMA_0 */ -#define OMAP24XX_DMA_EXT_NDMA_REQ0 2 /* S_DMA_1 */ -#define OMAP24XX_DMA_EXT_NDMA_REQ1 3 /* S_DMA_2 */ +#define OMAP24XX_DMA_EXT_DMAREQ0 2 /* S_DMA_1 */ +#define OMAP24XX_DMA_EXT_DMAREQ1 3 /* S_DMA_2 */ #define OMAP24XX_DMA_GPMC 4 /* S_DMA_3 */ #define OMAP24XX_DMA_GFX 5 /* S_DMA_4 */ #define OMAP24XX_DMA_DSS 6 /* S_DMA_5 */ @@ -197,7 +197,9 @@ #define OMAP24XX_DMA_DES_TX 11 /* S_DMA_10 */ #define OMAP24XX_DMA_DES_RX 12 /* S_DMA_11 */ #define OMAP24XX_DMA_SHA1MD5_RX 13 /* S_DMA_12 */ - +#define OMAP24XX_DMA_EXT_DMAREQ2 14 /* S_DMA_13 */ +#define OMAP24XX_DMA_EXT_DMAREQ3 15 /* S_DMA_14 */ +#define OMAP24XX_DMA_EXT_DMAREQ4 16 /* S_DMA_15 */ #define OMAP24XX_DMA_EAC_AC_RD 17 /* S_DMA_16 */ #define OMAP24XX_DMA_EAC_AC_WR 18 /* S_DMA_17 */ #define OMAP24XX_DMA_EAC_MD_UL_RD 19 /* S_DMA_18 */ @@ -244,6 +246,7 @@ #define OMAP24XX_DMA_MMC1_TX 61 /* SDMA_60 */ #define OMAP24XX_DMA_MMC1_RX 62 /* SDMA_61 */ #define OMAP24XX_DMA_MS 63 /* SDMA_62 */ +#define OMAP24XX_DMA_EXT_DMAREQ5 64 /* S_DMA_63 */ /*----------------------------------------------------------------------------*/ @@ -274,7 +277,7 @@ #define OMAP1610_DMA_LCD_LCH_CTRL (OMAP1610_DMA_LCD_BASE + 0xea) #define OMAP1610_DMA_LCD_SRC_FI_B1_U (OMAP1610_DMA_LCD_BASE + 0xf4) -#define OMAP_DMA_TOUT_IRQ (1 << 0) /* Only on omap1 */ +#define OMAP1_DMA_TOUT_IRQ (1 << 0) #define OMAP_DMA_DROP_IRQ (1 << 1) #define OMAP_DMA_HALF_IRQ (1 << 2) #define OMAP_DMA_FRAME_IRQ (1 << 3) @@ -315,11 +318,11 @@ enum { OMAP_LCD_DMA_B2_BOTTOM }; -/* REVISIT: Check if BURST_4 is really 1 (or 2) */ enum omap_dma_burst_mode { OMAP_DMA_DATA_BURST_DIS = 0, OMAP_DMA_DATA_BURST_4, - OMAP_DMA_DATA_BURST_8 + OMAP_DMA_DATA_BURST_8, + OMAP_DMA_DATA_BURST_16, }; enum omap_dma_color_mode { diff --git a/include/asm-arm/arch-omap/dmtimer.h b/include/asm-arm/arch-omap/dmtimer.h index e6522e6a3..7a289ff07 100644 --- a/include/asm-arm/arch-omap/dmtimer.h +++ b/include/asm-arm/arch-omap/dmtimer.h @@ -5,6 +5,7 @@ * * Copyright (C) 2005 Nokia Corporation * Author: Lauri Leukkunen + * PWM and clock framwork support by Timo Teras. * * 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 @@ -25,69 +26,56 @@ * 675 Mass Ave, Cambridge, MA 02139, USA. */ -#ifndef __ASM_ARCH_TIMER_H -#define __ASM_ARCH_TIMER_H - -#include - -#define OMAP_TIMER_SRC_ARMXOR 0x00 -#define OMAP_TIMER_SRC_32_KHZ 0x01 -#define OMAP_TIMER_SRC_EXT_CLK 0x02 - -/* timer control reg bits */ -#define OMAP_TIMER_CTRL_CAPTMODE (1 << 13) -#define OMAP_TIMER_CTRL_PT (1 << 12) -#define OMAP_TIMER_CTRL_TRG_OVERFLOW (0x1 << 10) -#define OMAP_TIMER_CTRL_TRG_OFANDMATCH (0x2 << 10) -#define OMAP_TIMER_CTRL_TCM_LOWTOHIGH (0x1 << 8) -#define OMAP_TIMER_CTRL_TCM_HIGHTOLOW (0x2 << 8) -#define OMAP_TIMER_CTRL_TCM_BOTHEDGES (0x3 << 8) -#define OMAP_TIMER_CTRL_SCPWM (1 << 7) -#define OMAP_TIMER_CTRL_CE (1 << 6) /* compare enable */ -#define OMAP_TIMER_CTRL_PRE (1 << 5) /* prescaler enable */ -#define OMAP_TIMER_CTRL_PTV_SHIFT 2 /* how much to shift the prescaler value */ -#define OMAP_TIMER_CTRL_AR (1 << 1) /* auto-reload enable */ -#define OMAP_TIMER_CTRL_ST (1 << 0) /* start timer */ +#ifndef __ASM_ARCH_DMTIMER_H +#define __ASM_ARCH_DMTIMER_H -/* timer interrupt enable bits */ -#define OMAP_TIMER_INT_CAPTURE (1 << 2) -#define OMAP_TIMER_INT_OVERFLOW (1 << 1) -#define OMAP_TIMER_INT_MATCH (1 << 0) +/* clock sources */ +#define OMAP_TIMER_SRC_SYS_CLK 0x00 +#define OMAP_TIMER_SRC_32_KHZ 0x01 +#define OMAP_TIMER_SRC_EXT_CLK 0x02 +/* timer interrupt enable bits */ +#define OMAP_TIMER_INT_CAPTURE (1 << 2) +#define OMAP_TIMER_INT_OVERFLOW (1 << 1) +#define OMAP_TIMER_INT_MATCH (1 << 0) -struct omap_dm_timer { - struct list_head timer_list; +/* trigger types */ +#define OMAP_TIMER_TRIGGER_NONE 0x00 +#define OMAP_TIMER_TRIGGER_OVERFLOW 0x01 +#define OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE 0x02 - u32 base; - unsigned int irq; -}; +struct omap_dm_timer; +struct clk; -u32 omap_dm_timer_read_reg(struct omap_dm_timer *timer, int reg); -void omap_dm_timer_write_reg(struct omap_dm_timer *timer, int reg, u32 value); +int omap_dm_timer_init(void); -struct omap_dm_timer * omap_dm_timer_request(void); +struct omap_dm_timer *omap_dm_timer_request(void); +struct omap_dm_timer *omap_dm_timer_request_specific(int timer_id); void omap_dm_timer_free(struct omap_dm_timer *timer); -void omap_dm_timer_set_source(struct omap_dm_timer *timer, int source); -void omap_dm_timer_set_int_enable(struct omap_dm_timer *timer, unsigned int value); -void omap_dm_timer_set_trigger(struct omap_dm_timer *timer, unsigned int value); -void omap_dm_timer_enable_compare(struct omap_dm_timer *timer); -void omap_dm_timer_enable_autoreload(struct omap_dm_timer *timer); +int omap_dm_timer_get_irq(struct omap_dm_timer *timer); + +u32 omap_dm_timer_modify_idlect_mask(u32 inputmask); +struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer); void omap_dm_timer_trigger(struct omap_dm_timer *timer); void omap_dm_timer_start(struct omap_dm_timer *timer); void omap_dm_timer_stop(struct omap_dm_timer *timer); -void omap_dm_timer_set_load(struct omap_dm_timer *timer, unsigned int load); -void omap_dm_timer_set_match(struct omap_dm_timer *timer, unsigned int match); +void omap_dm_timer_set_source(struct omap_dm_timer *timer, int source); +void omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload, unsigned int value); +void omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, unsigned int match); +void omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on, int toggle, int trigger); +void omap_dm_timer_set_prescaler(struct omap_dm_timer *timer, int prescaler); + +void omap_dm_timer_set_int_enable(struct omap_dm_timer *timer, unsigned int value); unsigned int omap_dm_timer_read_status(struct omap_dm_timer *timer); void omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value); - unsigned int omap_dm_timer_read_counter(struct omap_dm_timer *timer); -void omap_dm_timer_reset_counter(struct omap_dm_timer *timer); +void omap_dm_timer_write_counter(struct omap_dm_timer *timer, unsigned int value); int omap_dm_timers_active(void); -u32 omap_dm_timer_modify_idlect_mask(u32 inputmask); -#endif /* __ASM_ARCH_TIMER_H */ + +#endif /* __ASM_ARCH_DMTIMER_H */ diff --git a/include/asm-arm/arch-omap/hardware.h b/include/asm-arm/arch-omap/hardware.h index 7909b7298..481048d65 100644 --- a/include/asm-arm/arch-omap/hardware.h +++ b/include/asm-arm/arch-omap/hardware.h @@ -37,7 +37,6 @@ #define __ASM_ARCH_OMAP_HARDWARE_H #include -#include #ifndef __ASSEMBLER__ #include #include @@ -298,6 +297,10 @@ #include "board-perseus2.h" #endif +#ifdef CONFIG_MACH_OMAP_FSAMPLE +#include "board-fsample.h" +#endif + #ifdef CONFIG_MACH_OMAP_H3 #include "board-h3.h" #endif diff --git a/include/asm-arm/arch-omap/io.h b/include/asm-arm/arch-omap/io.h index b726acfca..78f68e6a4 100644 --- a/include/asm-arm/arch-omap/io.h +++ b/include/asm-arm/arch-omap/io.h @@ -44,7 +44,6 @@ */ #define __io(a) ((void __iomem *)(PCIO_BASE + (a))) #define __mem_pci(a) (a) -#define __mem_isa(a) (a) /* * ---------------------------------------------------------------------------- diff --git a/include/asm-arm/arch-omap/irqs.h b/include/asm-arm/arch-omap/irqs.h index 42098d99f..2542495d8 100644 --- a/include/asm-arm/arch-omap/irqs.h +++ b/include/asm-arm/arch-omap/irqs.h @@ -242,10 +242,24 @@ #define INT_24XX_GPIO_BANK2 30 #define INT_24XX_GPIO_BANK3 31 #define INT_24XX_GPIO_BANK4 32 +#define INT_24XX_GPTIMER1 37 +#define INT_24XX_GPTIMER2 38 +#define INT_24XX_GPTIMER3 39 +#define INT_24XX_GPTIMER4 40 +#define INT_24XX_GPTIMER5 41 +#define INT_24XX_GPTIMER6 42 +#define INT_24XX_GPTIMER7 43 +#define INT_24XX_GPTIMER8 44 +#define INT_24XX_GPTIMER9 45 +#define INT_24XX_GPTIMER10 46 +#define INT_24XX_GPTIMER11 47 +#define INT_24XX_GPTIMER12 48 #define INT_24XX_MCBSP1_IRQ_TX 59 #define INT_24XX_MCBSP1_IRQ_RX 60 #define INT_24XX_MCBSP2_IRQ_TX 62 #define INT_24XX_MCBSP2_IRQ_RX 63 +#define INT_24XX_UART1_IRQ 72 +#define INT_24XX_UART2_IRQ 73 #define INT_24XX_UART3_IRQ 74 /* Max. 128 level 2 IRQs (OMAP1610), 192 GPIOs (OMAP730) and diff --git a/include/asm-arm/arch-omap/mux.h b/include/asm-arm/arch-omap/mux.h index 0dc24d4ba..679869c5e 100644 --- a/include/asm-arm/arch-omap/mux.h +++ b/include/asm-arm/arch-omap/mux.h @@ -410,6 +410,12 @@ enum omap24xx_index { /* 24xx clock */ W14_24XX_SYS_CLKOUT, + /* 24xx GPMC wait pin monitoring */ + L3_GPMC_WAIT0, + N7_GPMC_WAIT1, + M1_GPMC_WAIT2, + P1_GPMC_WAIT3, + /* 242X McBSP */ Y15_24XX_MCBSP2_CLKX, R14_24XX_MCBSP2_FSX, @@ -429,6 +435,26 @@ enum omap24xx_index { M15_24XX_GPIO92, V14_24XX_GPIO117, + /* 242x DBG GPIO */ + V4_242X_GPIO49, + W2_242X_GPIO50, + U4_242X_GPIO51, + V3_242X_GPIO52, + V2_242X_GPIO53, + V6_242X_GPIO53, + T4_242X_GPIO54, + Y4_242X_GPIO54, + T3_242X_GPIO55, + U2_242X_GPIO56, + + /* 24xx external DMA requests */ + AA10_242X_DMAREQ0, + AA6_242X_DMAREQ1, + E4_242X_DMAREQ2, + G4_242X_DMAREQ3, + D3_242X_DMAREQ4, + E3_242X_DMAREQ5, + P20_24XX_TSC_IRQ, /* UART3 */ diff --git a/include/asm-arm/arch-omap/pm.h b/include/asm-arm/arch-omap/pm.h index 05b003f3a..e46623c61 100644 --- a/include/asm-arm/arch-omap/pm.h +++ b/include/asm-arm/arch-omap/pm.h @@ -299,10 +299,43 @@ enum omap24xx_save_state { OMAP24XX_SLEEP_SAVE_INTC_MIR0, OMAP24XX_SLEEP_SAVE_INTC_MIR1, OMAP24XX_SLEEP_SAVE_INTC_MIR2, + + OMAP24XX_SLEEP_SAVE_CM_CLKSTCTRL_MPU, + OMAP24XX_SLEEP_SAVE_CM_CLKSTCTRL_CORE, + OMAP24XX_SLEEP_SAVE_CM_CLKSTCTRL_GFX, + OMAP24XX_SLEEP_SAVE_CM_CLKSTCTRL_DSP, + OMAP24XX_SLEEP_SAVE_CM_CLKSTCTRL_MDM, + + OMAP24XX_SLEEP_SAVE_PM_PWSTCTRL_MPU, + OMAP24XX_SLEEP_SAVE_PM_PWSTCTRL_CORE, + OMAP24XX_SLEEP_SAVE_PM_PWSTCTRL_GFX, + OMAP24XX_SLEEP_SAVE_PM_PWSTCTRL_DSP, + OMAP24XX_SLEEP_SAVE_PM_PWSTCTRL_MDM, + + OMAP24XX_SLEEP_SAVE_CM_IDLEST1_CORE, + OMAP24XX_SLEEP_SAVE_CM_IDLEST2_CORE, + OMAP24XX_SLEEP_SAVE_CM_IDLEST3_CORE, + OMAP24XX_SLEEP_SAVE_CM_IDLEST4_CORE, + OMAP24XX_SLEEP_SAVE_CM_IDLEST_GFX, + OMAP24XX_SLEEP_SAVE_CM_IDLEST_WKUP, + OMAP24XX_SLEEP_SAVE_CM_IDLEST_CKGEN, + OMAP24XX_SLEEP_SAVE_CM_IDLEST_DSP, + OMAP24XX_SLEEP_SAVE_CM_IDLEST_MDM, + + OMAP24XX_SLEEP_SAVE_CM_AUTOIDLE1_CORE, + OMAP24XX_SLEEP_SAVE_CM_AUTOIDLE2_CORE, + OMAP24XX_SLEEP_SAVE_CM_AUTOIDLE3_CORE, + OMAP24XX_SLEEP_SAVE_CM_AUTOIDLE4_CORE, + OMAP24XX_SLEEP_SAVE_CM_AUTOIDLE_WKUP, + OMAP24XX_SLEEP_SAVE_CM_AUTOIDLE_PLL, + OMAP24XX_SLEEP_SAVE_CM_AUTOIDLE_DSP, + OMAP24XX_SLEEP_SAVE_CM_AUTOIDLE_MDM, + OMAP24XX_SLEEP_SAVE_CM_FCLKEN1_CORE, OMAP24XX_SLEEP_SAVE_CM_FCLKEN2_CORE, OMAP24XX_SLEEP_SAVE_CM_ICLKEN1_CORE, OMAP24XX_SLEEP_SAVE_CM_ICLKEN2_CORE, + OMAP24XX_SLEEP_SAVE_CM_ICLKEN3_CORE, OMAP24XX_SLEEP_SAVE_CM_ICLKEN4_CORE, OMAP24XX_SLEEP_SAVE_GPIO1_IRQENABLE1, OMAP24XX_SLEEP_SAVE_GPIO2_IRQENABLE1, diff --git a/include/asm-arm/arch-omap/system.h b/include/asm-arm/arch-omap/system.h index 67970d1a2..ac2bfa433 100644 --- a/include/asm-arm/arch-omap/system.h +++ b/include/asm-arm/arch-omap/system.h @@ -4,7 +4,6 @@ */ #ifndef __ASM_ARCH_SYSTEM_H #define __ASM_ARCH_SYSTEM_H -#include #include #include diff --git a/include/asm-arm/arch-omap/uncompress.h b/include/asm-arm/arch-omap/uncompress.h index ca2c8bec8..aca0adfef 100644 --- a/include/asm-arm/arch-omap/uncompress.h +++ b/include/asm-arm/arch-omap/uncompress.h @@ -17,7 +17,6 @@ * kind, whether express or implied. */ -#include #include #include #include diff --git a/include/asm-arm/arch-pxa/idp.h b/include/asm-arm/arch-pxa/idp.h index e7ef49741..b6952534a 100644 --- a/include/asm-arm/arch-pxa/idp.h +++ b/include/asm-arm/arch-pxa/idp.h @@ -15,7 +15,6 @@ * Changes for 2.6 kernel. */ -#include /* * Note: this file must be safe to include in assembly files diff --git a/include/asm-arm/arch-pxa/io.h b/include/asm-arm/arch-pxa/io.h index eb2dd58d3..7f8d817b4 100644 --- a/include/asm-arm/arch-pxa/io.h +++ b/include/asm-arm/arch-pxa/io.h @@ -16,6 +16,5 @@ */ #define __io(a) ((void __iomem *)(a)) #define __mem_pci(a) (a) -#define __mem_isa(a) (a) #endif diff --git a/include/asm-arm/arch-pxa/irqs.h b/include/asm-arm/arch-pxa/irqs.h index 67af238a8..f3bc70eee 100644 --- a/include/asm-arm/arch-pxa/irqs.h +++ b/include/asm-arm/arch-pxa/irqs.h @@ -10,7 +10,6 @@ * published by the Free Software Foundation. */ -#include #ifdef CONFIG_PXA27x #define PXA_IRQ_SKIP 0 diff --git a/include/asm-arm/arch-pxa/poodle.h b/include/asm-arm/arch-pxa/poodle.h index 58bda9d57..4d6a40315 100644 --- a/include/asm-arm/arch-pxa/poodle.h +++ b/include/asm-arm/arch-pxa/poodle.h @@ -31,30 +31,33 @@ #define POODLE_GPIO_CF_CD (14) #define POODLE_GPIO_CF_STSCHG (14) #define POODLE_GPIO_SD_PWR (33) +#define POODLE_GPIO_SD_PWR1 (3) #define POODLE_GPIO_nSD_CLK (6) #define POODLE_GPIO_nSD_WP (7) #define POODLE_GPIO_nSD_INT (8) #define POODLE_GPIO_nSD_DETECT (9) #define POODLE_GPIO_MAIN_BAT_LOW (13) #define POODLE_GPIO_BAT_COVER (13) +#define POODLE_GPIO_USB_PULLUP (20) #define POODLE_GPIO_ADC_TEMP_ON (21) #define POODLE_GPIO_BYPASS_ON (36) #define POODLE_GPIO_CHRG_ON (38) #define POODLE_GPIO_CHRG_FULL (16) +#define POODLE_GPIO_DISCHARGE_ON (42) /* Enable battery discharge */ /* PXA GPIOs */ -#define POODLE_IRQ_GPIO_ON_KEY IRQ_GPIO0 -#define POODLE_IRQ_GPIO_AC_IN IRQ_GPIO1 -#define POODLE_IRQ_GPIO_HP_IN IRQ_GPIO4 -#define POODLE_IRQ_GPIO_CO IRQ_GPIO16 -#define POODLE_IRQ_GPIO_TP_INT IRQ_GPIO5 -#define POODLE_IRQ_GPIO_WAKEUP IRQ_GPIO11 -#define POODLE_IRQ_GPIO_GA_INT IRQ_GPIO10 -#define POODLE_IRQ_GPIO_CF_IRQ IRQ_GPIO17 -#define POODLE_IRQ_GPIO_CF_CD IRQ_GPIO14 -#define POODLE_IRQ_GPIO_nSD_INT IRQ_GPIO8 -#define POODLE_IRQ_GPIO_nSD_DETECT IRQ_GPIO9 -#define POODLE_IRQ_GPIO_MAIN_BAT_LOW IRQ_GPIO13 +#define POODLE_IRQ_GPIO_ON_KEY IRQ_GPIO(0) +#define POODLE_IRQ_GPIO_AC_IN IRQ_GPIO(1) +#define POODLE_IRQ_GPIO_HP_IN IRQ_GPIO(4) +#define POODLE_IRQ_GPIO_CO IRQ_GPIO(16) +#define POODLE_IRQ_GPIO_TP_INT IRQ_GPIO(5) +#define POODLE_IRQ_GPIO_WAKEUP IRQ_GPIO(11) +#define POODLE_IRQ_GPIO_GA_INT IRQ_GPIO(10) +#define POODLE_IRQ_GPIO_CF_IRQ IRQ_GPIO(17) +#define POODLE_IRQ_GPIO_CF_CD IRQ_GPIO(14) +#define POODLE_IRQ_GPIO_nSD_INT IRQ_GPIO(8) +#define POODLE_IRQ_GPIO_nSD_DETECT IRQ_GPIO(9) +#define POODLE_IRQ_GPIO_MAIN_BAT_LOW IRQ_GPIO(13) /* SCOOP GPIOs */ #define POODLE_SCOOP_CHARGE_ON SCOOP_GPCR_PA11 @@ -67,4 +70,6 @@ #define POODLE_SCOOP_IO_DIR ( POODLE_SCOOP_VPEN | POODLE_SCOOP_HS_OUT ) #define POODLE_SCOOP_IO_OUT ( 0 ) +extern struct platform_device poodle_locomo_device; + #endif /* __ASM_ARCH_POODLE_H */ diff --git a/include/asm-arm/arch-pxa/pxa-regs.h b/include/asm-arm/arch-pxa/pxa-regs.h index c8f53a71c..f5cc65dd7 100644 --- a/include/asm-arm/arch-pxa/pxa-regs.h +++ b/include/asm-arm/arch-pxa/pxa-regs.h @@ -13,7 +13,6 @@ #ifndef __PXA_REGS_H #define __PXA_REGS_H -#include /* * PXA Chip selects @@ -1330,6 +1329,7 @@ #define GPIO84_NSRXD 84 /* NSSP receive */ #define GPIO85_nPCE_1 85 /* Card Enable for Card Space (PXA27x) */ #define GPIO92_MMCDAT0 92 /* MMC DAT0 (PXA27x) */ +#define GPIO102_nPCE_1 102 /* PCMCIA (PXA27x) */ #define GPIO109_MMCDAT1 109 /* MMC DAT1 (PXA27x) */ #define GPIO110_MMCDAT2 110 /* MMC DAT2 (PXA27x) */ #define GPIO110_MMCCS0 110 /* MMC Chip Select 0 (PXA27x) */ @@ -1472,6 +1472,7 @@ #define GPIO84_NSSP_RX (84 | GPIO_ALT_FN_2_IN) #define GPIO85_nPCE_1_MD (85 | GPIO_ALT_FN_1_OUT) #define GPIO92_MMCDAT0_MD (92 | GPIO_ALT_FN_1_OUT) +#define GPIO102_nPCE_1_MD (102 | GPIO_ALT_FN_1_OUT) #define GPIO104_pSKTSEL_MD (104 | GPIO_ALT_FN_1_OUT) #define GPIO109_MMCDAT1_MD (109 | GPIO_ALT_FN_1_OUT) #define GPIO110_MMCDAT2_MD (110 | GPIO_ALT_FN_1_OUT) @@ -1626,7 +1627,7 @@ #define SSCR0_RIM (1 << 22) /* Receive FIFO overrrun interrupt mask */ #define SSCR0_TUM (1 << 23) /* Transmit FIFO underrun interrupt mask */ #define SSCR0_FRDC (0x07000000) /* Frame rate divider control (mask) */ -#define SSCR0_SlotsPerFrm(c) ((x) - 1) /* Time slots per frame [1..8] */ +#define SSCR0_SlotsPerFrm(x) ((x) - 1) /* Time slots per frame [1..8] */ #define SSCR0_ADC (1 << 30) /* Audio clock select */ #define SSCR0_MOD (1 << 31) /* Mode (normal or network) */ #endif @@ -1707,6 +1708,10 @@ #if defined (CONFIG_PXA27x) #define SSTO_P1 __REG(0x41000028) /* SSP Port 1 Time Out Register */ #define SSPSP_P1 __REG(0x4100002C) /* SSP Port 1 Programmable Serial Protocol */ +#define SSTSA_P1 __REG(0x41000030) /* SSP Port 1 Tx Timeslot Active */ +#define SSRSA_P1 __REG(0x41000034) /* SSP Port 1 Rx Timeslot Active */ +#define SSTSS_P1 __REG(0x41000038) /* SSP Port 1 Timeslot Status */ +#define SSACD_P1 __REG(0x4100003C) /* SSP Port 1 Audio Clock Divider */ #define SSCR0_P2 __REG(0x41700000) /* SSP Port 2 Control Register 0 */ #define SSCR1_P2 __REG(0x41700004) /* SSP Port 2 Control Register 1 */ #define SSSR_P2 __REG(0x41700008) /* SSP Port 2 Status Register */ @@ -1714,6 +1719,10 @@ #define SSDR_P2 __REG(0x41700010) /* (Write / Read) SSP Port 2 Data Write Register/SSP Data Read Register */ #define SSTO_P2 __REG(0x41700028) /* SSP Port 2 Time Out Register */ #define SSPSP_P2 __REG(0x4170002C) /* SSP Port 2 Programmable Serial Protocol */ +#define SSTSA_P2 __REG(0x41700030) /* SSP Port 2 Tx Timeslot Active */ +#define SSRSA_P2 __REG(0x41700034) /* SSP Port 2 Rx Timeslot Active */ +#define SSTSS_P2 __REG(0x41700038) /* SSP Port 2 Timeslot Status */ +#define SSACD_P2 __REG(0x4170003C) /* SSP Port 2 Audio Clock Divider */ #define SSCR0_P3 __REG(0x41900000) /* SSP Port 3 Control Register 0 */ #define SSCR1_P3 __REG(0x41900004) /* SSP Port 3 Control Register 1 */ #define SSSR_P3 __REG(0x41900008) /* SSP Port 3 Status Register */ @@ -1721,6 +1730,10 @@ #define SSDR_P3 __REG(0x41900010) /* (Write / Read) SSP Port 3 Data Write Register/SSP Data Read Register */ #define SSTO_P3 __REG(0x41900028) /* SSP Port 3 Time Out Register */ #define SSPSP_P3 __REG(0x4190002C) /* SSP Port 3 Programmable Serial Protocol */ +#define SSTSA_P3 __REG(0x41900030) /* SSP Port 3 Tx Timeslot Active */ +#define SSRSA_P3 __REG(0x41900034) /* SSP Port 3 Rx Timeslot Active */ +#define SSTSS_P3 __REG(0x41900038) /* SSP Port 3 Timeslot Status */ +#define SSACD_P3 __REG(0x4190003C) /* SSP Port 3 Audio Clock Divider */ #else /* PXA255 (only port 2) and PXA26x ports*/ #define SSTO_P1 __REG(0x41000028) /* SSP Port 1 Time Out Register */ #define SSPSP_P1 __REG(0x4100002C) /* SSP Port 1 Programmable Serial Protocol */ @@ -1747,6 +1760,10 @@ #define SSDR_P(x) (*(((x) == 1) ? &SSDR_P1 : ((x) == 2) ? &SSDR_P2 : ((x) == 3) ? &SSDR_P3 : NULL)) #define SSTO_P(x) (*(((x) == 1) ? &SSTO_P1 : ((x) == 2) ? &SSTO_P2 : ((x) == 3) ? &SSTO_P3 : NULL)) #define SSPSP_P(x) (*(((x) == 1) ? &SSPSP_P1 : ((x) == 2) ? &SSPSP_P2 : ((x) == 3) ? &SSPSP_P3 : NULL)) +#define SSTSA_P(x) (*(((x) == 1) ? &SSTSA_P1 : ((x) == 2) ? &SSTSA_P2 : ((x) == 3) ? &SSTSA_P3 : NULL)) +#define SSRSA_P(x) (*(((x) == 1) ? &SSRSA_P1 : ((x) == 2) ? &SSRSA_P2 : ((x) == 3) ? &SSRSA_P3 : NULL)) +#define SSTSS_P(x) (*(((x) == 1) ? &SSTSS_P1 : ((x) == 2) ? &SSTSS_P2 : ((x) == 3) ? &SSTSS_P3 : NULL)) +#define SSACD_P(x) (*(((x) == 1) ? &SSACD_P1 : ((x) == 2) ? &SSACD_P2 : ((x) == 3) ? &SSACD_P3 : NULL)) /* * MultiMediaCard (MMC) controller diff --git a/include/asm-arm/arch-pxa/ssp.h b/include/asm-arm/arch-pxa/ssp.h index 949878c0d..ea200551a 100644 --- a/include/asm-arm/arch-pxa/ssp.h +++ b/include/asm-arm/arch-pxa/ssp.h @@ -40,8 +40,8 @@ struct ssp_dev { }; int ssp_write_word(struct ssp_dev *dev, u32 data); -int ssp_read_word(struct ssp_dev *dev); -void ssp_flush(struct ssp_dev *dev); +int ssp_read_word(struct ssp_dev *dev, u32 *data); +int ssp_flush(struct ssp_dev *dev); void ssp_enable(struct ssp_dev *dev); void ssp_disable(struct ssp_dev *dev); void ssp_save_state(struct ssp_dev *dev, struct ssp_state *ssp); diff --git a/include/asm-arm/arch-pxa/system.h b/include/asm-arm/arch-pxa/system.h index 840a46bfb..1d56a3ef8 100644 --- a/include/asm-arm/arch-pxa/system.h +++ b/include/asm-arm/arch-pxa/system.h @@ -10,6 +10,7 @@ * published by the Free Software Foundation. */ +#include #include "hardware.h" #include "pxa-regs.h" diff --git a/include/asm-arm/arch-pxa/timex.h b/include/asm-arm/arch-pxa/timex.h index aa125ec56..2473bb51d 100644 --- a/include/asm-arm/arch-pxa/timex.h +++ b/include/asm-arm/arch-pxa/timex.h @@ -10,7 +10,6 @@ * published by the Free Software Foundation. */ -#include #if defined(CONFIG_PXA25x) /* PXA250/210 timer base */ diff --git a/include/asm-arm/arch-realview/io.h b/include/asm-arm/arch-realview/io.h index d444a68ac..c70f1dfbe 100644 --- a/include/asm-arm/arch-realview/io.h +++ b/include/asm-arm/arch-realview/io.h @@ -29,6 +29,5 @@ static inline void __iomem *__io(unsigned long addr) #define __io(a) __io(a) #define __mem_pci(a) (a) -#define __mem_isa(a) (a) #endif diff --git a/include/asm-arm/arch-realview/smp.h b/include/asm-arm/arch-realview/smp.h index fc87783e8..515819efd 100644 --- a/include/asm-arm/arch-realview/smp.h +++ b/include/asm-arm/arch-realview/smp.h @@ -1,7 +1,6 @@ #ifndef ASMARM_ARCH_SMP_H #define ASMARM_ARCH_SMP_H -#include #include diff --git a/include/asm-arm/arch-s3c2410/anubis-cpld.h b/include/asm-arm/arch-s3c2410/anubis-cpld.h index 5675b1796..40e8e270d 100644 --- a/include/asm-arm/arch-s3c2410/anubis-cpld.h +++ b/include/asm-arm/arch-s3c2410/anubis-cpld.h @@ -9,9 +9,6 @@ * 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. - * - * Changelog: - * */ #ifndef __ASM_ARCH_ANUBISCPLD_H diff --git a/include/asm-arm/arch-s3c2410/anubis-irq.h b/include/asm-arm/arch-s3c2410/anubis-irq.h index 82f15dbd9..4b5f42377 100644 --- a/include/asm-arm/arch-s3c2410/anubis-irq.h +++ b/include/asm-arm/arch-s3c2410/anubis-irq.h @@ -9,9 +9,7 @@ * 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. - * - * Changelog: - */ +*/ #ifndef __ASM_ARCH_ANUBISIRQ_H #define __ASM_ARCH_ANUBISIRQ_H diff --git a/include/asm-arm/arch-s3c2410/anubis-map.h b/include/asm-arm/arch-s3c2410/anubis-map.h index d529ffda8..058a2104b 100644 --- a/include/asm-arm/arch-s3c2410/anubis-map.h +++ b/include/asm-arm/arch-s3c2410/anubis-map.h @@ -9,8 +9,6 @@ * 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. - * - * Changelog: */ /* needs arch/map.h including with this */ diff --git a/include/asm-arm/arch-s3c2410/audio.h b/include/asm-arm/arch-s3c2410/audio.h index 0d276e67f..7e0222276 100644 --- a/include/asm-arm/arch-s3c2410/audio.h +++ b/include/asm-arm/arch-s3c2410/audio.h @@ -9,10 +9,6 @@ * 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. - * - * Changelog: - * 20-Nov-2004 BJD Created file - * 07-Mar-2005 BJD Added suspend/resume calls */ #ifndef __ASM_ARCH_AUDIO_H diff --git a/include/asm-arm/arch-s3c2410/bast-cpld.h b/include/asm-arm/arch-s3c2410/bast-cpld.h index e28ca51a4..8969cffe8 100644 --- a/include/asm-arm/arch-s3c2410/bast-cpld.h +++ b/include/asm-arm/arch-s3c2410/bast-cpld.h @@ -8,11 +8,6 @@ * 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. - * - * Changelog: - * 25-May-2003 BJD Created file, added CTRL1 registers - * 30-Aug-2004 BJD Updated definitions from 2.4.26 port - * 30-Aug-2004 BJD Added CTRL3 and CTRL4 definitions */ #ifndef __ASM_ARCH_BASTCPLD_H diff --git a/include/asm-arm/arch-s3c2410/bast-irq.h b/include/asm-arm/arch-s3c2410/bast-irq.h index b79b47f0d..15ffa66f5 100644 --- a/include/asm-arm/arch-s3c2410/bast-irq.h +++ b/include/asm-arm/arch-s3c2410/bast-irq.h @@ -8,11 +8,7 @@ * 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. - * - * Changelog: - * 14-Sep-2004 BJD Fixed IRQ_USBOC definition - * 06-Jan-2003 BJD Linux 2.6.0 version - */ +*/ #ifndef __ASM_ARCH_BASTIRQ_H #define __ASM_ARCH_BASTIRQ_H diff --git a/include/asm-arm/arch-s3c2410/bast-map.h b/include/asm-arm/arch-s3c2410/bast-map.h index 29c07e302..727cef84c 100644 --- a/include/asm-arm/arch-s3c2410/bast-map.h +++ b/include/asm-arm/arch-s3c2410/bast-map.h @@ -8,10 +8,6 @@ * 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. - * - * Changelog: - * 06-Jan-2003 BJD Linux 2.6.0 version, moved bast specifics from arch/map.h - * 12-Mar-2004 BJD Fixed header include protection */ /* needs arch/map.h including with this */ diff --git a/include/asm-arm/arch-s3c2410/bast-pmu.h b/include/asm-arm/arch-s3c2410/bast-pmu.h index 758c5c59d..82836027f 100644 --- a/include/asm-arm/arch-s3c2410/bast-pmu.h +++ b/include/asm-arm/arch-s3c2410/bast-pmu.h @@ -9,9 +9,6 @@ * 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. - * - * Changelog: - * 08-Oct-2003 BJD Initial creation */ #ifndef __ASM_ARCH_BASTPMU_H diff --git a/include/asm-arm/arch-s3c2410/debug-macro.S b/include/asm-arm/arch-s3c2410/debug-macro.S index abfbe45cd..93064860e 100644 --- a/include/asm-arm/arch-s3c2410/debug-macro.S +++ b/include/asm-arm/arch-s3c2410/debug-macro.S @@ -10,9 +10,6 @@ * 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. - * - * Modifications: - * 10-Mar-2005 LCVR Changed S3C2410_VA to S3C24XX_VA */ #include @@ -25,7 +22,7 @@ .macro addruart, rx mrc p15, 0, \rx, c1, c0 tst \rx, #1 - ldreq \rx, = S3C2410_PA_UART + ldreq \rx, = S3C24XX_PA_UART ldrne \rx, = S3C24XX_VA_UART #if CONFIG_DEBUG_S3C2410_UART != 0 add \rx, \rx, #(S3C2410_UART1_OFF * CONFIG_DEBUG_S3C2410_UART) @@ -33,7 +30,7 @@ .endm .macro senduart,rd,rx - str \rd, [\rx, # S3C2410_UTXH ] + strb \rd, [\rx, # S3C2410_UTXH ] .endm .macro busyuart, rd, rx @@ -42,15 +39,21 @@ beq 1001f @ @ FIFO enabled... 1003: + @ check for arm920 vs arm926. currently assume all arm926 + @ devices have an 64 byte FIFO identical to the s3c2440 + mrc p15, 0, \rd, c0, c0 + and \rd, \rd, #0xff0 + teq \rd, #0x260 + beq 1004f mrc p15, 0, \rd, c1, c0 tst \rd, #1 - addeq \rd, \rx, #(S3C2410_PA_GPIO - S3C2410_PA_UART) + addeq \rd, \rx, #(S3C24XX_PA_GPIO - S3C24XX_PA_UART) addne \rd, \rx, #(S3C24XX_VA_GPIO - S3C24XX_VA_UART) bic \rd, \rd, #0xff000 ldr \rd, [ \rd, # S3C2410_GSTATUS1 - S3C2410_GPIOREG(0) ] and \rd, \rd, #0x00ff0000 teq \rd, #0x00440000 @ is it 2440? - +1004: ldr \rd, [ \rx, # S3C2410_UFSTAT ] moveq \rd, \rd, lsr #SHIFT_2440TXF tst \rd, #S3C2410_UFSTAT_TXFULL @@ -75,7 +78,7 @@ 1003: mrc p15, 0, \rd, c1, c0 tst \rd, #1 - addeq \rd, \rx, #(S3C2410_PA_GPIO - S3C2410_PA_UART) + addeq \rd, \rx, #(S3C24XX_PA_GPIO - S3C24XX_PA_UART) addne \rd, \rx, #(S3C24XX_VA_GPIO - S3C24XX_VA_UART) bic \rd, \rd, #0xff000 ldr \rd, [ \rd, # S3C2410_GSTATUS1 - S3C2410_GPIOREG(0) ] diff --git a/include/asm-arm/arch-s3c2410/dma.h b/include/asm-arm/arch-s3c2410/dma.h index b011e14f3..3661e465b 100644 --- a/include/asm-arm/arch-s3c2410/dma.h +++ b/include/asm-arm/arch-s3c2410/dma.h @@ -1,49 +1,41 @@ -/* linux/include/asm-arm/arch-bast/dma.h +/* linux/include/asm-arm/arch-s3c2410/dma.h * - * Copyright (C) 2003,2004 Simtec Electronics + * Copyright (C) 2003,2004,2006 Simtec Electronics * Ben Dooks * - * Samsung S3C2410X DMA support + * Samsung S3C241XX DMA support * * 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. - * - * Changelog: - * ??-May-2003 BJD Created file - * ??-Jun-2003 BJD Added more dma functionality to go with arch - * 10-Nov-2004 BJD Added sys_device support */ #ifndef __ASM_ARCH_DMA_H #define __ASM_ARCH_DMA_H __FILE__ -#include #include #include "hardware.h" - /* * This is the maximum DMA address(physical address) that can be DMAd to. * */ -#define MAX_DMA_ADDRESS 0x20000000 +#define MAX_DMA_ADDRESS 0x40000000 #define MAX_DMA_TRANSFER_SIZE 0x100000 /* Data Unit is half word */ - /* we have 4 dma channels */ #define S3C2410_DMA_CHANNELS (4) /* types */ -typedef enum { +enum s3c2410_dma_state { S3C2410_DMA_IDLE, S3C2410_DMA_RUNNING, S3C2410_DMA_PAUSED -} s3c2410_dma_state_t; +}; -/* s3c2410_dma_loadst_t +/* enum s3c2410_dma_loadst * * This represents the state of the DMA engine, wrt to the loaded / running * transfers. Since we don't have any way of knowing exactly the state of @@ -71,44 +63,40 @@ typedef enum { * currently running. */ -typedef enum { +enum s3c2410_dma_loadst { S3C2410_DMALOAD_NONE, S3C2410_DMALOAD_1LOADED, S3C2410_DMALOAD_1RUNNING, S3C2410_DMALOAD_1LOADED_1RUNNING, -} s3c2410_dma_loadst_t; +}; -typedef enum { +enum s3c2410_dma_buffresult { S3C2410_RES_OK, S3C2410_RES_ERR, S3C2410_RES_ABORT -} s3c2410_dma_buffresult_t; - - -typedef enum s3c2410_dmasrc_e s3c2410_dmasrc_t; +}; -enum s3c2410_dmasrc_e { - S3C2410_DMASRC_HW, /* source is memory */ - S3C2410_DMASRC_MEM /* source is hardware */ +enum s3c2410_dmasrc { + S3C2410_DMASRC_HW, /* source is memory */ + S3C2410_DMASRC_MEM /* source is hardware */ }; -/* enum s3c2410_chan_op_e +/* enum s3c2410_chan_op * * operation codes passed to the DMA code by the user, and also used * to inform the current channel owner of any changes to the system state */ -enum s3c2410_chan_op_e { +enum s3c2410_chan_op { S3C2410_DMAOP_START, S3C2410_DMAOP_STOP, S3C2410_DMAOP_PAUSE, S3C2410_DMAOP_RESUME, S3C2410_DMAOP_FLUSH, - S3C2410_DMAOP_TIMEOUT, /* internal signal to handler */ + S3C2410_DMAOP_TIMEOUT, /* internal signal to handler */ + S3C2410_DMAOP_STARTED, /* indicate channel started */ }; -typedef enum s3c2410_chan_op_e s3c2410_chan_op_t; - /* flags */ #define S3C2410_DMAF_SLOW (1<<0) /* slow, so don't worry about @@ -117,104 +105,100 @@ typedef enum s3c2410_chan_op_e s3c2410_chan_op_t; /* dma buffer */ -typedef struct s3c2410_dma_buf_s s3c2410_dma_buf_t; - struct s3c2410_dma_client { char *name; }; -typedef struct s3c2410_dma_client s3c2410_dma_client_t; - /* s3c2410_dma_buf_s * * internally used buffer structure to describe a queued or running * buffer. */ -struct s3c2410_dma_buf_s { - s3c2410_dma_buf_t *next; - int magic; /* magic */ - int size; /* buffer size in bytes */ - dma_addr_t data; /* start of DMA data */ - dma_addr_t ptr; /* where the DMA got to [1] */ - void *id; /* client's id */ +struct s3c2410_dma_buf; +struct s3c2410_dma_buf { + struct s3c2410_dma_buf *next; + int magic; /* magic */ + int size; /* buffer size in bytes */ + dma_addr_t data; /* start of DMA data */ + dma_addr_t ptr; /* where the DMA got to [1] */ + void *id; /* client's id */ }; /* [1] is this updated for both recv/send modes? */ -typedef struct s3c2410_dma_chan_s s3c2410_dma_chan_t; +struct s3c2410_dma_chan; /* s3c2410_dma_cbfn_t * * buffer callback routine type */ -typedef void (*s3c2410_dma_cbfn_t)(s3c2410_dma_chan_t *, void *buf, int size, - s3c2410_dma_buffresult_t result); +typedef void (*s3c2410_dma_cbfn_t)(struct s3c2410_dma_chan *, + void *buf, int size, + enum s3c2410_dma_buffresult result); -typedef int (*s3c2410_dma_opfn_t)(s3c2410_dma_chan_t *, - s3c2410_chan_op_t ); +typedef int (*s3c2410_dma_opfn_t)(struct s3c2410_dma_chan *, + enum s3c2410_chan_op ); -struct s3c2410_dma_stats_s { - unsigned long loads; - unsigned long timeout_longest; - unsigned long timeout_shortest; - unsigned long timeout_avg; - unsigned long timeout_failed; +struct s3c2410_dma_stats { + unsigned long loads; + unsigned long timeout_longest; + unsigned long timeout_shortest; + unsigned long timeout_avg; + unsigned long timeout_failed; }; -typedef struct s3c2410_dma_stats_s s3c2410_dma_stats_t; - -/* struct s3c2410_dma_chan_s +/* struct s3c2410_dma_chan * * full state information for each DMA channel */ -struct s3c2410_dma_chan_s { +struct s3c2410_dma_chan { /* channel state flags and information */ - unsigned char number; /* number of this dma channel */ - unsigned char in_use; /* channel allocated */ - unsigned char irq_claimed; /* irq claimed for channel */ - unsigned char irq_enabled; /* irq enabled for channel */ - unsigned char xfer_unit; /* size of an transfer */ + unsigned char number; /* number of this dma channel */ + unsigned char in_use; /* channel allocated */ + unsigned char irq_claimed; /* irq claimed for channel */ + unsigned char irq_enabled; /* irq enabled for channel */ + unsigned char xfer_unit; /* size of an transfer */ /* channel state */ - s3c2410_dma_state_t state; - s3c2410_dma_loadst_t load_state; - s3c2410_dma_client_t *client; + enum s3c2410_dma_state state; + enum s3c2410_dma_loadst load_state; + struct s3c2410_dma_client *client; /* channel configuration */ - s3c2410_dmasrc_t source; - unsigned long dev_addr; - unsigned long load_timeout; - unsigned int flags; /* channel flags */ + enum s3c2410_dmasrc source; + unsigned long dev_addr; + unsigned long load_timeout; + unsigned int flags; /* channel flags */ /* channel's hardware position and configuration */ - void __iomem *regs; /* channels registers */ - void __iomem *addr_reg; /* data address register */ - unsigned int irq; /* channel irq */ - unsigned long dcon; /* default value of DCON */ + void __iomem *regs; /* channels registers */ + void __iomem *addr_reg; /* data address register */ + unsigned int irq; /* channel irq */ + unsigned long dcon; /* default value of DCON */ /* driver handles */ - s3c2410_dma_cbfn_t callback_fn; /* buffer done callback */ - s3c2410_dma_opfn_t op_fn; /* channel operation callback */ + s3c2410_dma_cbfn_t callback_fn; /* buffer done callback */ + s3c2410_dma_opfn_t op_fn; /* channel op callback */ /* stats gathering */ - s3c2410_dma_stats_t *stats; - s3c2410_dma_stats_t stats_store; + struct s3c2410_dma_stats *stats; + struct s3c2410_dma_stats stats_store; /* buffer list and information */ - s3c2410_dma_buf_t *curr; /* current dma buffer */ - s3c2410_dma_buf_t *next; /* next buffer to load */ - s3c2410_dma_buf_t *end; /* end of queue */ + struct s3c2410_dma_buf *curr; /* current dma buffer */ + struct s3c2410_dma_buf *next; /* next buffer to load */ + struct s3c2410_dma_buf *end; /* end of queue */ /* system device */ struct sys_device dev; }; /* the currently allocated channel information */ -extern s3c2410_dma_chan_t s3c2410_chans[]; +extern struct s3c2410_dma_chan s3c2410_chans[]; /* note, we don't really use dma_device_t at the moment */ typedef unsigned long dma_device_t; @@ -227,7 +211,7 @@ typedef unsigned long dma_device_t; */ extern int s3c2410_dma_request(dmach_t channel, - s3c2410_dma_client_t *, void *dev); + struct s3c2410_dma_client *, void *dev); /* s3c2410_dma_ctrl @@ -235,7 +219,7 @@ extern int s3c2410_dma_request(dmach_t channel, * change the state of the dma channel */ -extern int s3c2410_dma_ctrl(dmach_t channel, s3c2410_chan_op_t op); +extern int s3c2410_dma_ctrl(dmach_t channel, enum s3c2410_chan_op op); /* s3c2410_dma_setflags * @@ -250,7 +234,7 @@ extern int s3c2410_dma_setflags(dmach_t channel, * free the dma channel (will also abort any outstanding operations) */ -extern int s3c2410_dma_free(dmach_t channel, s3c2410_dma_client_t *); +extern int s3c2410_dma_free(dmach_t channel, struct s3c2410_dma_client *); /* s3c2410_dma_enqueue * @@ -274,7 +258,7 @@ extern int s3c2410_dma_config(dmach_t channel, int xferunit, int dcon); * configure the device we're talking to */ -extern int s3c2410_dma_devconfig(int channel, s3c2410_dmasrc_t source, +extern int s3c2410_dma_devconfig(int channel, enum s3c2410_dmasrc source, int hwcfg, unsigned long devaddr); /* s3c2410_dma_getposition diff --git a/include/asm-arm/arch-s3c2410/entry-macro.S b/include/asm-arm/arch-s3c2410/entry-macro.S index b7d4d7f44..e09a6b8ec 100644 --- a/include/asm-arm/arch-s3c2410/entry-macro.S +++ b/include/asm-arm/arch-s3c2410/entry-macro.S @@ -6,114 +6,67 @@ * This file is licensed under the terms of the GNU General Public * License version 2. This program is licensed "as is" without any * warranty of any kind, whether express or implied. +*/ - * Modifications: - * 10-Mar-2005 LCVR Changed S3C2410_VA to S3C24XX_VA - */ - - - .macro get_irqnr_and_base, irqnr, irqstat, base, tmp - - mov \tmp, #S3C24XX_VA_IRQ - ldr \irqnr, [ \tmp, #0x14 ] @ get irq no -30000: - teq \irqnr, #4 - teqne \irqnr, #5 - beq 1002f @ external irq reg - - @ debug check to see if interrupt reported is the same - @ as the offset.... - - teq \irqnr, #0 - beq 20002f - ldr \irqstat, [ \tmp, #0x10 ] @ INTPND - mov \irqstat, \irqstat, lsr \irqnr - tst \irqstat, #1 - bne 20002f +/* We have a problem that the INTOFFSET register does not always + * show one interrupt. Occasionally we get two interrupts through + * the prioritiser, and this causes the INTOFFSET register to show + * what looks like the logical-or of the two interrupt numbers. + * + * Thanks to Klaus, Shannon, et al for helping to debug this problem +*/ - /* debug/warning if we get an invalud response from the - * INTOFFSET register */ -#if 1 - stmfd r13!, { r0 - r4 , r8-r12, r14 } - ldr r1, [ \tmp, #0x14 ] @ INTOFFSET - ldr r2, [ \tmp, #0x10 ] @ INTPND - ldr r3, [ \tmp, #0x00 ] @ SRCPND - adr r0, 20003f - bl printk - b 20004f +#define INTPND (0x10) +#define INTOFFSET (0x14) -20003: - .ascii "<7>irq: err - bad offset %d, intpnd=%08x, srcpnd=%08x\n" - .byte 0 - .align 4 -20004: - mov r1, #1 - mov \tmp, #S3C24XX_VA_IRQ - ldmfd r13!, { r0 - r4 , r8-r12, r14 } -#endif +#include +#include - @ try working out interrupt number for ourselves - mov \irqnr, #0 - ldr \irqstat, [ \tmp, #0x10 ] @ INTPND -10021: - movs \irqstat, \irqstat, lsr#1 - bcs 30000b @ try and re-start the proccess - add \irqnr, \irqnr, #1 - cmp \irqnr, #32 - ble 10021b + .macro get_irqnr_and_base, irqnr, irqstat, base, tmp - @ found no interrupt, set Z flag and leave - movs \irqnr, #0 - b 1001f + mov \base, #S3C24XX_VA_IRQ -20005: -20002: @ exit - @ we base the s3c2410x interrupts at 16 and above to allow - @ isa peripherals to have their standard interrupts, also - @ ensure that Z flag is un-set on exit + @@ try the interrupt offset register, since it is there - @ note, we cannot be sure if we get IRQ_EINT0 (0) that - @ there is simply no interrupt pending, so in all other - @ cases we jump to say we have found something, otherwise - @ we check to see if the interrupt really is assrted - adds \irqnr, \irqnr, #IRQ_EINT0 - teq \irqnr, #IRQ_EINT0 - bne 1001f @ exit - ldr \irqstat, [ \tmp, #0x10 ] @ INTPND + ldr \irqstat, [ \base, #INTPND ] teq \irqstat, #0 - moveq \irqnr, #0 - b 1001f - - @ we get here from no main or external interrupts pending -1002: - add \tmp, \tmp, #S3C24XX_VA_GPIO - S3C24XX_VA_IRQ - ldr \irqstat, [ \tmp, # 0xa8 ] @ EXTINTPEND - ldr \irqnr, [ \tmp, # 0xa4 ] @ EXTINTMASK - - bic \irqstat, \irqstat, \irqnr @ clear masked irqs - - mov \irqnr, #IRQ_EINT4 @ start extint nos - mov \irqstat, \irqstat, lsr#4 @ ignore bottom 4 bits -10021: - movs \irqstat, \irqstat, lsr#1 - bcs 1004f - add \irqnr, \irqnr, #1 - cmp \irqnr, #IRQ_EINT23 - ble 10021b - - @ found no interrupt, set Z flag and leave - movs \irqnr, #0 - -1004: @ ensure Z flag clear in case our MOVS shifted out the last bit - teq \irqnr, #0 + beq 1002f + ldr \irqnr, [ \base, #INTOFFSET ] + mov \tmp, #1 + tst \irqstat, \tmp, lsl \irqnr + bne 1001f + + @@ the number specified is not a valid irq, so try + @@ and work it out for ourselves + + mov \irqnr, #0 @@ start here + + @@ work out which irq (if any) we got + + movs \tmp, \irqstat, lsl#16 + addeq \irqnr, \irqnr, #16 + moveq \irqstat, \irqstat, lsr#16 + tst \irqstat, #0xff + addeq \irqnr, \irqnr, #8 + moveq \irqstat, \irqstat, lsr#8 + tst \irqstat, #0xf + addeq \irqnr, \irqnr, #4 + moveq \irqstat, \irqstat, lsr#4 + tst \irqstat, #0x3 + addeq \irqnr, \irqnr, #2 + moveq \irqstat, \irqstat, lsr#2 + tst \irqstat, #0x1 + addeq \irqnr, \irqnr, #1 + + @@ we have the value 1001: - @ exit irq routine - .endm + adds \irqnr, \irqnr, #IRQ_EINT0 +1002: + @@ exit here, Z flag unset if IRQ + .endm /* currently don't need an disable_fiq macro */ .macro disable_fiq .endm - - diff --git a/include/asm-arm/arch-s3c2410/fb.h b/include/asm-arm/arch-s3c2410/fb.h index 4790491ba..71161797b 100644 --- a/include/asm-arm/arch-s3c2410/fb.h +++ b/include/asm-arm/arch-s3c2410/fb.h @@ -7,13 +7,6 @@ * 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. - * - * - * Changelog: - * 07-Sep-2004 RTP Created file - * 03-Nov-2004 BJD Updated and minor cleanups - * 03-Aug-2005 RTP Renamed to fb.h - * 26-Oct-2005 BJD Changed name of platdata init */ #ifndef __ASM_ARM_FB_H diff --git a/include/asm-arm/arch-s3c2410/hardware.h b/include/asm-arm/arch-s3c2410/hardware.h index a2330bf83..871f8af09 100644 --- a/include/asm-arm/arch-s3c2410/hardware.h +++ b/include/asm-arm/arch-s3c2410/hardware.h @@ -8,16 +8,6 @@ * 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. - * - * Changelog: - * 21-May-2003 BJD Created file - * 06-Jun-2003 BJD Added CPU frequency settings - * 03-Sep-2003 BJD Linux v2.6 support - * 12-Mar-2004 BJD Fixed include protection, fixed type of clock vars - * 14-Sep-2004 BJD Added misccr and getpin to gpio - * 01-Oct-2004 BJD Added the new gpio functions - * 16-Oct-2004 BJD Removed the clock variables - * 15-Jan-2006 LCVR Added s3c2400_gpio_getirq() */ #ifndef __ASM_ARCH_HARDWARE_H diff --git a/include/asm-arm/arch-s3c2410/idle.h b/include/asm-arm/arch-s3c2410/idle.h index 749227c09..eed450608 100644 --- a/include/asm-arm/arch-s3c2410/idle.h +++ b/include/asm-arm/arch-s3c2410/idle.h @@ -8,10 +8,6 @@ * published by the Free Software Foundation. * * S3C2410 CPU Idle controls - * - * Changelog: - * 28-Oct-2004 BJD Initial version - * */ #ifndef __ASM_ARCH_IDLE_H diff --git a/include/asm-arm/arch-s3c2410/iic.h b/include/asm-arm/arch-s3c2410/iic.h index 518547f6d..ed3d6c7bf 100644 --- a/include/asm-arm/arch-s3c2410/iic.h +++ b/include/asm-arm/arch-s3c2410/iic.h @@ -8,10 +8,6 @@ * 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. - * - * Changelog: - * 05-Oct-2004 BJD Created file - * 19-Oct-2004 BJD Updated for s3c2440 */ #ifndef __ASM_ARCH_IIC_H diff --git a/include/asm-arm/arch-s3c2410/io.h b/include/asm-arm/arch-s3c2410/io.h index 16fbc8aff..6b35a4f26 100644 --- a/include/asm-arm/arch-s3c2410/io.h +++ b/include/asm-arm/arch-s3c2410/io.h @@ -4,13 +4,7 @@ * * Copyright (C) 1997 Russell King * (C) 2003 Simtec Electronics - * - * Modifications: - * 06-Dec-1997 RMK Created. - * 02-Sep-2003 BJD Modified for S3C2410 - * 10-Mar-2005 LCVR Changed S3C2410_VA to S3C24XX_VA - * 13-Oct-2005 BJD Fixed problems with LDRH/STRH offset range - */ +*/ #ifndef __ASM_ARM_ARCH_IO_H #define __ASM_ARM_ARCH_IO_H diff --git a/include/asm-arm/arch-s3c2410/irqs.h b/include/asm-arm/arch-s3c2410/irqs.h index d9773d697..39a69829d 100644 --- a/include/asm-arm/arch-s3c2410/irqs.h +++ b/include/asm-arm/arch-s3c2410/irqs.h @@ -6,14 +6,7 @@ * 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. - * - * Changelog: - * 12-May-2003 BJD Created file - * 08-Jan-2003 BJD Linux 2.6.0 version, moved BAST bits out - * 12-Mar-2004 BJD Fixed bug in header protection - * 10-Feb-2005 BJD Added camera IRQ from guillaume.gourat@nexvision.tv - * 28-Feb-2005 BJD Updated s3c2440 IRQs - */ +*/ #ifndef __ASM_ARCH_IRQS_H diff --git a/include/asm-arm/arch-s3c2410/map.h b/include/asm-arm/arch-s3c2410/map.h index c380d264a..27ba0ac3f 100644 --- a/include/asm-arm/arch-s3c2410/map.h +++ b/include/asm-arm/arch-s3c2410/map.h @@ -8,13 +8,6 @@ * 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. - * - * Changelog: - * 12-May-2003 BJD Created file - * 06-Jan-2003 BJD Linux 2.6.0 version, moved bast specifics out - * 10-Feb-2005 BJD Added CAMIF definition from guillaume.gourat@nexvision.tv - * 10-Mar-2005 LCVR Added support to S3C2400, changed {VA,SZ} names - * 15-Jan-2006 LCVR Added S3C24XX_PA macros for common S3C24XX resources */ #ifndef __ASM_ARCH_MAP_H @@ -126,9 +119,18 @@ #define S3C24XX_SZ_IIS SZ_1M /* GPIO ports */ -#define S3C24XX_VA_GPIO S3C2410_ADDR(0x00E00000) + +/* the calculation for the VA of this must ensure that + * it is the same distance apart from the UART in the + * phsyical address space, as the initial mapping for the IO + * is done as a 1:1 maping. This puts it (currently) at + * 0xF6800000, which is not in the way of any current mapping + * by the base system. +*/ + #define S3C2400_PA_GPIO (0x15600000) #define S3C2410_PA_GPIO (0x56000000) +#define S3C24XX_VA_GPIO ((S3C2410_PA_GPIO - S3C24XX_PA_UART) + S3C24XX_VA_UART) #define S3C24XX_SZ_GPIO SZ_1M /* RTC */ @@ -227,4 +229,20 @@ #define S3C24XX_PA_SPI S3C2410_PA_SPI #endif +/* deal with the registers that move under the 2412/2413 */ + +#if defined(CONFIG_CPU_S3C2412) || defined(CONFIG_CPU_S3C2413) +#ifndef __ASSEMBLY__ +extern void __iomem *s3c24xx_va_gpio2; +#endif +#ifdef CONFIG_CPU_S3C2412_ONLY +#define S3C24XX_VA_GPIO2 (S3C24XX_VA_GPIO + 0x10) +#else +#define S3C24XX_VA_GPIO2 s3c24xx_va_gpio2 +#endif +#else +#define s3c24xx_va_gpio2 S3C24XX_VA_GPIO +#define S3C24XX_VA_GPIO2 S3C24XX_VA_GPIO +#endif + #endif /* __ASM_ARCH_MAP_H */ diff --git a/include/asm-arm/arch-s3c2410/memory.h b/include/asm-arm/arch-s3c2410/memory.h index 6ab834a14..4be6a74c4 100644 --- a/include/asm-arm/arch-s3c2410/memory.h +++ b/include/asm-arm/arch-s3c2410/memory.h @@ -1,6 +1,4 @@ -/* - * linux/include/asm-arm/arch-s3c2410/memory.h - * +/* linux/include/asm-arm/arch-s3c2410/memory.h * from linux/include/asm-arm/arch-rpc/memory.h * * Copyright (C) 1996,1997,1998 Russell King. @@ -8,16 +6,6 @@ * 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. - * - * Changelog: - * 20-Oct-1996 RMK Created - * 31-Dec-1997 RMK Fixed definitions to reduce warnings - * 11-Jan-1998 RMK Uninlined to reduce hits on cache - * 08-Feb-1998 RMK Added __virt_to_bus and __bus_to_virt - * 21-Mar-1999 RMK Renamed to memory.h - * RMK Added TASK_SIZE and PAGE_OFFSET - * 05-Apr-2004 BJD Copied and altered for arch-s3c2410 - * 17-Mar-2005 LCVR Modified for S3C2400 */ #ifndef __ASM_ARCH_MEMORY_H diff --git a/include/asm-arm/arch-s3c2410/nand.h b/include/asm-arm/arch-s3c2410/nand.h index 9148ac045..e350ae2ac 100644 --- a/include/asm-arm/arch-s3c2410/nand.h +++ b/include/asm-arm/arch-s3c2410/nand.h @@ -8,9 +8,6 @@ * 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. - * - * Changelog: - * 23-Sep-2004 BJD Created file */ /* struct s3c2410_nand_set diff --git a/include/asm-arm/arch-s3c2410/osiris-map.h b/include/asm-arm/arch-s3c2410/osiris-map.h index 7c4b0cd2d..e2d406218 100644 --- a/include/asm-arm/arch-s3c2410/osiris-map.h +++ b/include/asm-arm/arch-s3c2410/osiris-map.h @@ -9,8 +9,6 @@ * 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. - * - * Changelog: */ /* needs arch/map.h including with this */ diff --git a/include/asm-arm/arch-s3c2410/regs-adc.h b/include/asm-arm/arch-s3c2410/regs-adc.h index 15bfc2f57..c7b90b3ec 100644 --- a/include/asm-arm/arch-s3c2410/regs-adc.h +++ b/include/asm-arm/arch-s3c2410/regs-adc.h @@ -7,9 +7,6 @@ * published by the Free Software Foundation. * * S3C2410 ADC registers - * - * Changelog: - * 27-09-2004 SAH Created file */ #ifndef __ASM_ARCH_REGS_ADC_H diff --git a/include/asm-arm/arch-s3c2410/regs-clock.h b/include/asm-arm/arch-s3c2410/regs-clock.h index 34360706e..b2f4690c0 100644 --- a/include/asm-arm/arch-s3c2410/regs-clock.h +++ b/include/asm-arm/arch-s3c2410/regs-clock.h @@ -1,6 +1,6 @@ /* linux/include/asm/arch-s3c2410/regs-clock.h * - * Copyright (c) 2003,2004,2005 Simtec Electronics + * Copyright (c) 2003,2004,2005,2006 Simtec Electronics * http://armlinux.simtec.co.uk/ * * This program is free software; you can redistribute it and/or modify @@ -8,18 +8,6 @@ * published by the Free Software Foundation. * * S3C2410 clock register definitions - * - * Changelog: - * 18-Aug-2004 Ben Dooks Added 2440 definitions - * 08-Aug-2004 Herbert Pötzl Added CLKCON definitions - * 19-06-2003 Ben Dooks Created file - * 12-03-2004 Ben Dooks Updated include protection - * 29-Sep-2004 Ben Dooks Fixed usage for assembly inclusion - * 10-Feb-2005 Ben Dooks Fixed CAMDIVN address (Guillaume Gourat) - * 10-Mar-2005 Lucas Villa Real Changed S3C2410_VA to S3C24XX_VA - * 27-Aug-2005 Ben Dooks Add clock-slow info - * 20-Oct-2005 Ben Dooks Fixed overflow in PLL (Guillaume Gourat) - * 20-Oct-2005 Ben Dooks Add masks for DCLK (Guillaume Gourat) */ #ifndef __ASM_ARM_REGS_CLOCK @@ -114,7 +102,7 @@ s3c2410_get_pll(unsigned int pllval, unsigned int baseclk) #endif /* __ASSEMBLY__ */ -#ifdef CONFIG_CPU_S3C2440 +#if defined(CONFIG_CPU_S3C2440) || defined(CONFIG_CPU_S3C2442) /* extra registers */ #define S3C2440_CAMDIVN S3C2410_CLKREG(0x18) @@ -136,7 +124,70 @@ s3c2410_get_pll(unsigned int pllval, unsigned int baseclk) #define S3C2440_CAMDIVN_HCLK4_HALF (1<<9) #define S3C2440_CAMDIVN_DVSEN (1<<12) -#endif /* CONFIG_CPU_S3C2440 */ - +#define S3C2442_CAMDIVN_CAMCLK_DIV3 (1<<5) + +#endif /* CONFIG_CPU_S3C2440 or CONFIG_CPU_S3C2442 */ + +#if defined(CONFIG_CPU_S3C2412) || defined(CONFIG_CPU_S3C2413) + +#define S3C2412_OSCSET S3C2410_CLKREG(0x18) +#define S3C2412_CLKSRC S3C2410_CLKREG(0x1C) + +#define S3C2412_PLLCON_OFF (1<<20) + +#define S3C2412_CLKDIVN_PDIVN (1<<2) +#define S3C2412_CLKDIVN_HDIVN_MASK (3<<0) +#define S3C2421_CLKDIVN_ARMDIVN (1<<3) +#define S3C2412_CLKDIVN_USB48DIV (1<<6) +#define S3C2412_CLKDIVN_UARTDIV_MASK (15<<8) +#define S3C2412_CLKDIVN_UARTDIV_SHIFT (8) +#define S3C2412_CLKDIVN_I2SDIV_MASK (15<<12) +#define S3C2412_CLKDIVN_I2SDIV_SHIFT (12) +#define S3C2412_CLKDIVN_CAMDIV_MASK (15<<16) +#define S3C2412_CLKDIVN_CAMDIV_SHIFT (16) + +#define S3C2412_CLKCON_WDT (1<<28) +#define S3C2412_CLKCON_SPI (1<<27) +#define S3C2412_CLKCON_IIS (1<<26) +#define S3C2412_CLKCON_IIC (1<<25) +#define S3C2412_CLKCON_ADC (1<<24) +#define S3C2412_CLKCON_RTC (1<<23) +#define S3C2412_CLKCON_GPIO (1<<22) +#define S3C2412_CLKCON_UART2 (1<<21) +#define S3C2412_CLKCON_UART1 (1<<20) +#define S3C2412_CLKCON_UART0 (1<<19) +#define S3C2412_CLKCON_SDI (1<<18) +#define S3C2412_CLKCON_PWMT (1<<17) +#define S3C2412_CLKCON_USBD (1<<16) +#define S3C2412_CLKCON_CAMCLK (1<<15) +#define S3C2412_CLKCON_UARTCLK (1<<14) +/* missing 13 */ +#define S3C2412_CLKCON_USB_HOST48 (1<<12) +#define S3C2412_CLKCON_USB_DEV48 (1<<11) +#define S3C2412_CLKCON_HCLKdiv2 (1<<10) +#define S3C2412_CLKCON_HCLKx2 (1<<9) +#define S3C2412_CLKCON_SDRAM (1<<8) +/* missing 7 */ +#define S3C2412_CLKCON_USBH S3C2410_CLKCON_USBH +#define S3C2412_CLKCON_LCDC S3C2410_CLKCON_LCDC +#define S3C2412_CLKCON_NAND S3C2410_CLKCON_NAND +#define S3C2412_CLKCON_DMA3 (1<<3) +#define S3C2412_CLKCON_DMA2 (1<<2) +#define S3C2412_CLKCON_DMA1 (1<<1) +#define S3C2412_CLKCON_DMA0 (1<<0) + +/* clock sourec controls */ + +#define S3C2412_CLKSRC_EXTCLKDIV_MASK (7 << 0) +#define S3C2412_CLKSRC_EXTCLKDIV_SHIFT (0) +#define S3C2412_CLKSRC_MDIVCLK_EXTCLKDIV (1<<3) +#define S3C2412_CLKSRC_MSYSCLK_MPLL (1<<4) +#define S3C2412_CLKSRC_USYSCLK_UPLL (1<<5) +#define S3C2412_CLKSRC_UARTCLK_MPLL (1<<8) +#define S3C2412_CLKSRC_I2SCLK_MPLL (1<<9) +#define S3C2412_CLKSRC_USBCLK_HCLK (1<<10) +#define S3C2412_CLKSRC_CAMCLK_HCLK (1<<11) + +#endif /* CONFIG_CPU_S3C2412 | CONFIG_CPU_S3C2413 */ #endif /* __ASM_ARM_REGS_CLOCK */ diff --git a/include/asm-arm/arch-s3c2410/regs-dsc.h b/include/asm-arm/arch-s3c2410/regs-dsc.h index a023b0434..a0a124875 100644 --- a/include/asm-arm/arch-s3c2410/regs-dsc.h +++ b/include/asm-arm/arch-s3c2410/regs-dsc.h @@ -7,18 +7,19 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * - * S3C2440 Signal Drive Strength Control - * - * Changelog: - * 11-Aug-2004 BJD Created file - * 25-Aug-2004 BJD Added the _SELECT_* defs for using with functions + * S3C2440/S3C2412 Signal Drive Strength Control */ #ifndef __ASM_ARCH_REGS_DSC_H #define __ASM_ARCH_REGS_DSC_H "2440-dsc" -#ifdef CONFIG_CPU_S3C2440 +#if defined(CONFIG_CPU_S3C2412) +#define S3C2412_DSC0 S3C2410_GPIOREG(0xdc) +#define S3C2412_DSC1 S3C2410_GPIOREG(0xe0) +#endif + +#if defined(CONFIG_CPU_S3C2440) #define S3C2440_DSC0 S3C2410_GPIOREG(0xc4) #define S3C2440_DSC1 S3C2410_GPIOREG(0xc8) @@ -170,7 +171,7 @@ #define S3C2440_DSC1_CS1_4mA (3<<2) #define S3C2440_DSC1_CS1_MASK (3<<2) -#define S3C2440_DSC1_CS0 (S3C2440_SELECT_DSC1 | 0 +#define S3C2440_DSC1_CS0 (S3C2440_SELECT_DSC1 | 0) #define S3C2440_DSC1_CS0_10mA (0<<0) #define S3C2440_DSC1_CS0_8mA (1<<0) #define S3C2440_DSC1_CS0_6mA (2<<0) diff --git a/include/asm-arm/arch-s3c2410/regs-gpio.h b/include/asm-arm/arch-s3c2410/regs-gpio.h index d25740846..93c49432d 100644 --- a/include/asm-arm/arch-s3c2410/regs-gpio.h +++ b/include/asm-arm/arch-s3c2410/regs-gpio.h @@ -8,21 +8,6 @@ * published by the Free Software Foundation. * * S3C2410 GPIO register definitions - * - * Changelog: - * 19-06-2003 BJD Created file - * 23-06-2003 BJD Updated GSTATUS registers - * 12-03-2004 BJD Updated include protection - * 20-07-2004 BJD Added GPIO pin numbers, added Port A definitions - * 04-10-2004 BJD Fixed number of bugs, added EXT IRQ filter defs - * 17-10-2004 BJD Added GSTATUS1 register definitions - * 18-11-2004 BJD Fixed definitions of GPE3, GPE4, GPE5 and GPE6 - * 18-11-2004 BJD Added S3C2440 AC97 controls - * 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 - * 15-Jan-2006 LCVR Written S3C24XX_GPIO_BASE() macro */ @@ -45,7 +30,7 @@ #define S3C24XX_MISCCR S3C2400_MISCCR #else #define S3C24XX_GPIO_BASE(x) S3C2410_GPIO_BASE(x) -#define S3C24XX_MISCCR S3C2410_MISCCR +#define S3C24XX_MISCCR S3C24XX_GPIOREG2(0x80) #endif /* CONFIG_CPU_S3C2400 */ @@ -73,9 +58,15 @@ #define S3C2410_GPIO_SFN2 (0xFFFFFFF2) /* not available on A */ #define S3C2410_GPIO_SFN3 (0xFFFFFFF3) /* not available on A */ -/* configure GPIO ports A..G */ +/* register address for the GPIO registers. + * S3C24XX_GPIOREG2 is for the second set of registers in the + * GPIO which move between s3c2410 and s3c2412 type systems */ #define S3C2410_GPIOREG(x) ((x) + S3C24XX_VA_GPIO) +#define S3C24XX_GPIOREG2(x) ((x) + S3C24XX_VA_GPIO2) + + +/* configure GPIO ports A..G */ /* port A - S3C2410: 22bits, zero in bit X makes pin X output * S3C2400: 18bits, zero in bit X makes pin X output @@ -450,12 +441,14 @@ #define S3C2410_GPD0_OUTP (0x01 << 0) #define S3C2410_GPD0_VD8 (0x02 << 0) #define S3C2400_GPD0_VFRAME (0x02 << 0) +#define S3C2442_GPD0_nSPICS1 (0x03 << 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 S3C2442_GPD1_SPICLK1 (0x03 << 2) #define S3C2410_GPD2 S3C2410_GPIONO(S3C2410_GPIO_BANKD, 2) #define S3C2410_GPD2_INP (0x00 << 4) @@ -858,6 +851,7 @@ #define S3C2410_GPG12_OUTP (0x01 << 24) #define S3C2410_GPG12_EINT20 (0x02 << 24) #define S3C2410_GPG12_XMON (0x03 << 24) +#define S3C2442_GPG12_nSPICS0 (0x03 << 24) #define S3C2410_GPG13 S3C2410_GPIONO(S3C2410_GPIO_BANKG, 13) #define S3C2410_GPG13_INP (0x00 << 26) @@ -943,17 +937,25 @@ #define S3C2410_GPH9_INP (0x00 << 18) #define S3C2410_GPH9_OUTP (0x01 << 18) #define S3C2410_GPH9_CLKOUT0 (0x02 << 18) +#define S3C2442_GPH9_nSPICS0 (0x03 << 18) #define S3C2410_GPH10 S3C2410_GPIONO(S3C2410_GPIO_BANKH, 10) #define S3C2410_GPH10_INP (0x00 << 20) #define S3C2410_GPH10_OUTP (0x01 << 20) #define S3C2410_GPH10_CLKOUT1 (0x02 << 20) +/* The S3C2412 and S3C2413 move the GPJ register set to after + * GPH, which means all registers after 0x80 are now offset by 0x10 + * for the 2412/2413 from the 2410/2440/2442 +*/ + /* miscellaneous control */ #define S3C2400_MISCCR S3C2410_GPIOREG(0x54) #define S3C2410_MISCCR S3C2410_GPIOREG(0x80) #define S3C2410_DCLKCON S3C2410_GPIOREG(0x84) +#define S3C24XX_DCLKCON S3C24XX_GPIOREG2(0x84) + /* see clock.h for dclk definitions */ /* pullup control on databus */ @@ -981,6 +983,8 @@ #define S3C2410_MISCCR_CLK0_DCLK0 (5<<4) #define S3C2410_MISCCR_CLK0_MASK (7<<4) +#define S3C2412_MISCCR_CLK0_RTC (2<<4) + #define S3C2410_MISCCR_CLK1_MPLL (0<<8) #define S3C2410_MISCCR_CLK1_UPLL (1<<8) #define S3C2410_MISCCR_CLK1_FCLK (2<<8) @@ -989,6 +993,8 @@ #define S3C2410_MISCCR_CLK1_DCLK1 (5<<8) #define S3C2410_MISCCR_CLK1_MASK (7<<8) +#define S3C2412_MISCCR_CLK1_CLKsrc (0<<8) + #define S3C2410_MISCCR_USBSUSPND0 (1<<12) #define S3C2410_MISCCR_USBSUSPND1 (1<<13) @@ -996,7 +1002,7 @@ #define S3C2410_MISCCR_nEN_SCLK0 (1<<17) #define S3C2410_MISCCR_nEN_SCLK1 (1<<18) -#define S3C2410_MISCCR_nEN_SCLKE (1<<19) +#define S3C2410_MISCCR_nEN_SCLKE (1<<19) /* not 2412 */ #define S3C2410_MISCCR_SDSLEEP (7<<17) /* external interrupt control... */ @@ -1013,6 +1019,10 @@ #define S3C2410_EXTINT1 S3C2410_GPIOREG(0x8C) #define S3C2410_EXTINT2 S3C2410_GPIOREG(0x90) +#define S3C24XX_EXTINT0 S3C24XX_GPIOREG2(0x88) +#define S3C24XX_EXTINT1 S3C24XX_GPIOREG2(0x8C) +#define S3C24XX_EXTINT2 S3C24XX_GPIOREG2(0x90) + /* values for S3C2410_EXTINT0/1/2 */ #define S3C2410_EXTINT_LOWLEV (0x00) #define S3C2410_EXTINT_HILEV (0x01) @@ -1026,6 +1036,11 @@ #define S3C2410_EINFLT2 S3C2410_GPIOREG(0x9C) #define S3C2410_EINFLT3 S3C2410_GPIOREG(0xA0) +#define S3C24XX_EINFLT0 S3C24XX_GPIOREG2(0x94) +#define S3C24XX_EINFLT1 S3C24XX_GPIOREG2(0x98) +#define S3C24XX_EINFLT2 S3C24XX_GPIOREG2(0x9C) +#define S3C24XX_EINFLT3 S3C24XX_GPIOREG2(0xA0) + /* values for interrupt filtering */ #define S3C2410_EINTFLT_PCLK (0x00) #define S3C2410_EINTFLT_EXTCLK (1<<7) @@ -1035,6 +1050,7 @@ /* GSTATUS have miscellaneous information in them * + * These move between s3c2410 and s3c2412 style systems. */ #define S3C2410_GSTATUS0 S3C2410_GPIOREG(0x0AC) @@ -1043,6 +1059,18 @@ #define S3C2410_GSTATUS3 S3C2410_GPIOREG(0x0B8) #define S3C2410_GSTATUS4 S3C2410_GPIOREG(0x0BC) +#define S3C2412_GSTATUS0 S3C2410_GPIOREG(0x0BC) +#define S3C2412_GSTATUS1 S3C2410_GPIOREG(0x0C0) +#define S3C2412_GSTATUS2 S3C2410_GPIOREG(0x0C4) +#define S3C2412_GSTATUS3 S3C2410_GPIOREG(0x0C8) +#define S3C2412_GSTATUS4 S3C2410_GPIOREG(0x0CC) + +#define S3C24XX_GSTATUS0 S3C24XX_GPIOREG2(0x0AC) +#define S3C24XX_GSTATUS1 S3C24XX_GPIOREG2(0x0B0) +#define S3C24XX_GSTATUS2 S3C24XX_GPIOREG2(0x0B4) +#define S3C24XX_GSTATUS3 S3C24XX_GPIOREG2(0x0B8) +#define S3C24XX_GSTATUS4 S3C24XX_GPIOREG2(0x0BC) + #define S3C2410_GSTATUS0_nWAIT (1<<3) #define S3C2410_GSTATUS0_NCON (1<<2) #define S3C2410_GSTATUS0_RnB (1<<1) @@ -1050,7 +1078,9 @@ #define S3C2410_GSTATUS1_IDMASK (0xffff0000) #define S3C2410_GSTATUS1_2410 (0x32410000) +#define S3C2410_GSTATUS1_2412 (0x32412001) #define S3C2410_GSTATUS1_2440 (0x32440000) +#define S3C2410_GSTATUS1_2442 (0x32440aaa) #define S3C2410_GSTATUS2_WTRESET (1<<2) #define S3C2410_GSTATUS2_OFFRESET (1<<1) @@ -1072,5 +1102,22 @@ #define S3C2400_OPENCR_OPC_MOSIDIS (0<<5) #define S3C2400_OPENCR_OPC_MOSIEN (1<<5) +/* 2412/2413 sleep configuration registers */ + +#define S3C2412_GPBSLPCON S3C2410_GPIOREG(0x1C) +#define S3C2412_GPCSLPCON S3C2410_GPIOREG(0x2C) +#define S3C2412_GPDSLPCON S3C2410_GPIOREG(0x3C) +#define S3C2412_GPESLPCON S3C2410_GPIOREG(0x4C) +#define S3C2412_GPFSLPCON S3C2410_GPIOREG(0x5C) +#define S3C2412_GPGSLPCON S3C2410_GPIOREG(0x6C) +#define S3C2412_GPHSLPCON S3C2410_GPIOREG(0x7C) + +/* definitions for each pin bit */ +#define S3C2412_SLPCON_LOW(x) ( 0x00 << ((x) * 2)) +#define S3C2412_SLPCON_HI(x) ( 0x01 << ((x) * 2)) +#define S3C2412_SLPCON_IN(x) ( 0x02 << ((x) * 2)) +#define S3C2412_SLPCON_PDWN(x) ( 0x03 << ((x) * 2)) +#define S3C2412_SLPCON_MASK(x) ( 0x03 << ((x) * 2)) + #endif /* __ASM_ARCH_REGS_GPIO_H */ diff --git a/include/asm-arm/arch-s3c2410/regs-gpioj.h b/include/asm-arm/arch-s3c2410/regs-gpioj.h index 3ad2324ac..91cefa260 100644 --- a/include/asm-arm/arch-s3c2410/regs-gpioj.h +++ b/include/asm-arm/arch-s3c2410/regs-gpioj.h @@ -8,10 +8,6 @@ * published by the Free Software Foundation. * * S3C2440 GPIO J register definitions - * - * Changelog: - * 11-Aug-2004 BJD Created file - * 10-Feb-2005 BJD Fix GPJ12 definition (Guillaume Gourat) */ @@ -32,6 +28,11 @@ #define S3C2440_GPJDAT S3C2410_GPIOREG(0xd4) #define S3C2440_GPJUP S3C2410_GPIOREG(0xd8) +#define S3C2413_GPJCON S3C2410_GPIOREG(0x80) +#define S3C2413_GPJDAT S3C2410_GPIOREG(0x84) +#define S3C2413_GPJUP S3C2410_GPIOREG(0x88) +#define S3C2413_GPJSLPCON S3C2410_GPIOREG(0x8C) + #define S3C2440_GPJ0 S3C2410_GPIONO(S3C2440_GPIO_BANKJ, 0) #define S3C2440_GPJ0_INP (0x00 << 0) #define S3C2440_GPJ0_OUTP (0x01 << 0) diff --git a/include/asm-arm/arch-s3c2410/regs-iic.h b/include/asm-arm/arch-s3c2410/regs-iic.h index fed3288e2..2ae29522f 100644 --- a/include/asm-arm/arch-s3c2410/regs-iic.h +++ b/include/asm-arm/arch-s3c2410/regs-iic.h @@ -8,10 +8,6 @@ * published by the Free Software Foundation. * * S3C2410 I2C Controller - * - * Changelog: - * 03-Oct-2004 BJD Initial include for Linux - * 08-Nov-2004 BJD Added S3C2440 filter register */ #ifndef __ASM_ARCH_REGS_IIC_H diff --git a/include/asm-arm/arch-s3c2410/regs-iis.h b/include/asm-arm/arch-s3c2410/regs-iis.h index 7fdde9b91..72cd25098 100644 --- a/include/asm-arm/arch-s3c2410/regs-iis.h +++ b/include/asm-arm/arch-s3c2410/regs-iis.h @@ -8,17 +8,7 @@ * published by the Free Software Foundation. * * S3C2410 IIS register definition - * - * Changelog: - * 19-06-2003 BJD Created file - * 26-06-2003 BJD Finished off definitions for register addresses - * 12-03-2004 BJD Updated include protection - * 07-03-2005 BJD Added FIFO size flags and S3C2440 MPLL - * 05-04-2005 LCVR Added IISFCON definitions for the S3C2400 - * 18-07-2005 DA Change IISCON_MPLL to IISMOD_MPLL - * Correct IISMOD_256FS and IISMOD_384FS - * Add IISCON_PSCEN - */ +*/ #ifndef __ASM_ARCH_REGS_IIS_H #define __ASM_ARCH_REGS_IIS_H diff --git a/include/asm-arm/arch-s3c2410/regs-irq.h b/include/asm-arm/arch-s3c2410/regs-irq.h index 24b7292df..29fb8ef67 100644 --- a/include/asm-arm/arch-s3c2410/regs-irq.h +++ b/include/asm-arm/arch-s3c2410/regs-irq.h @@ -6,14 +6,7 @@ * 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. - * - * - * - * Changelog: - * 19-06-2003 BJD Created file - * 12-03-2004 BJD Updated include protection - * 10-03-2005 LCVR Changed S3C2410_VA to S3C24XX_VA - */ +*/ #ifndef ___ASM_ARCH_REGS_IRQ_H @@ -23,6 +16,7 @@ #define S3C2410_IRQREG(x) ((x) + S3C24XX_VA_IRQ) #define S3C2410_EINTREG(x) ((x) + S3C24XX_VA_GPIO) +#define S3C24XX_EINTREG(x) ((x) + S3C24XX_VA_GPIO2) #define S3C2410_SRCPND S3C2410_IRQREG(0x000) #define S3C2410_INTMOD S3C2410_IRQREG(0x004) @@ -40,5 +34,10 @@ #define S3C2410_EINTMASK S3C2410_EINTREG(0x0A4) #define S3C2410_EINTPEND S3C2410_EINTREG(0X0A8) +#define S3C2412_EINTMASK S3C2410_EINTREG(0x0B4) +#define S3C2412_EINTPEND S3C2410_EINTREG(0X0B8) + +#define S3C24XX_EINTMASK S3C24XX_EINTREG(0x0A4) +#define S3C24XX_EINTPEND S3C24XX_EINTREG(0X0A8) #endif /* ___ASM_ARCH_REGS_IRQ_H */ diff --git a/include/asm-arm/arch-s3c2410/regs-lcd.h b/include/asm-arm/arch-s3c2410/regs-lcd.h index b6b1b4e8b..b306d6e31 100644 --- a/include/asm-arm/arch-s3c2410/regs-lcd.h +++ b/include/asm-arm/arch-s3c2410/regs-lcd.h @@ -6,14 +6,6 @@ * 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. - * - * - * - * Changelog: - * 12-06-2003 BJD Created file - * 26-06-2003 BJD Updated LCDCON register definitions - * 12-03-2004 BJD Updated include protection - * 10-03-2005 LCVR Changed S3C2410_VA to S3C24XX_VA */ diff --git a/include/asm-arm/arch-s3c2410/regs-mem.h b/include/asm-arm/arch-s3c2410/regs-mem.h index a2d7d0cec..375dca503 100644 --- a/include/asm-arm/arch-s3c2410/regs-mem.h +++ b/include/asm-arm/arch-s3c2410/regs-mem.h @@ -8,12 +8,6 @@ * published by the Free Software Foundation. * * S3C2410 Memory Control register definitions - * - * Changelog: - * 29-Sep-2004 BJD Initial include for Linux - * 10-Mar-2005 LCVR Changed S3C2410_VA to S3C24XX_VA - * 04-Apr-2005 LCVR Added S3C2400 DRAM/BANKSIZE_MASK definitions - * */ #ifndef __ASM_ARM_MEMREGS_H diff --git a/include/asm-arm/arch-s3c2410/regs-nand.h b/include/asm-arm/arch-s3c2410/regs-nand.h index 7cff235e6..b824d371a 100644 --- a/include/asm-arm/arch-s3c2410/regs-nand.h +++ b/include/asm-arm/arch-s3c2410/regs-nand.h @@ -8,10 +8,6 @@ * published by the Free Software Foundation. * * S3C2410 NAND register definitions - * - * Changelog: - * 18-Aug-2004 BJD Copied file from 2.4 and updated - * 01-May-2005 BJD Added definitions for s3c2440 controller */ #ifndef __ASM_ARM_REGS_NAND @@ -39,10 +35,19 @@ #define S3C2440_NFESTAT1 S3C2410_NFREG(0x28) #define S3C2440_NFMECC0 S3C2410_NFREG(0x2C) #define S3C2440_NFMECC1 S3C2410_NFREG(0x30) -#define S3C2440_NFSECC S3C2410_NFREG(0x34) +#define S3C2440_NFSECC S3C24E10_NFREG(0x34) #define S3C2440_NFSBLK S3C2410_NFREG(0x38) #define S3C2440_NFEBLK S3C2410_NFREG(0x3C) +#define S3C2412_NFSBLK S3C2410_NFREG(0x20) +#define S3C2412_NFEBLK S3C2410_NFREG(0x24) +#define S3C2412_NFSTAT S3C2410_NFREG(0x28) +#define S3C2412_NFMECC_ERR0 S3C2410_NFREG(0x2C) +#define S3C2412_NFMECC_ERR1 S3C2410_NFREG(0x30) +#define S3C2412_NFMECC0 S3C2410_NFREG(0x34) +#define S3C2412_NFMECC1 S3C2410_NFREG(0x38) +#define S3C2412_NFSECC S3C2410_NFREG(0x3C) + #define S3C2410_NFCONF_EN (1<<15) #define S3C2410_NFCONF_512BYTE (1<<14) #define S3C2410_NFCONF_4STEP (1<<13) @@ -77,5 +82,42 @@ #define S3C2440_NFSTAT_RnB_CHANGE (1<<2) #define S3C2440_NFSTAT_ILLEGAL_ACCESS (1<<3) +#define S3C2412_NFCONF_NANDBOOT (1<<31) +#define S3C2412_NFCONF_ECCCLKCON (1<<30) +#define S3C2412_NFCONF_ECC_MLC (1<<24) +#define S3C2412_NFCONF_TACLS_MASK (7<<12) /* 1 extra bit of Tacls */ + +#define S3C2412_NFCONT_ECC4_DIRWR (1<<18) +#define S3C2412_NFCONT_LOCKTIGHT (1<<17) +#define S3C2412_NFCONT_SOFTLOCK (1<<16) +#define S3C2412_NFCONT_ECC4_ENCINT (1<<13) +#define S3C2412_NFCONT_ECC4_DECINT (1<<12) +#define S3C2412_NFCONT_MAIN_ECC_LOCK (1<<7) +#define S3C2412_NFCONT_INIT_MAIN_ECC (1<<5) +#define S3C2412_NFCONT_nFCE1 (1<<2) +#define S3C2412_NFCONT_nFCE0 (1<<1) + +#define S3C2412_NFSTAT_ECC_ENCDONE (1<<7) +#define S3C2412_NFSTAT_ECC_DECDONE (1<<6) +#define S3C2412_NFSTAT_ILLEGAL_ACCESS (1<<5) +#define S3C2412_NFSTAT_RnB_CHANGE (1<<4) +#define S3C2412_NFSTAT_nFCE1 (1<<3) +#define S3C2412_NFSTAT_nFCE0 (1<<2) +#define S3C2412_NFSTAT_Res1 (1<<1) +#define S3C2412_NFSTAT_READY (1<<0) + +#define S3C2412_NFECCERR_SERRDATA(x) (((x) >> 21) & 0xf) +#define S3C2412_NFECCERR_SERRBIT(x) (((x) >> 18) & 0x7) +#define S3C2412_NFECCERR_MERRDATA(x) (((x) >> 7) & 0x3ff) +#define S3C2412_NFECCERR_MERRBIT(x) (((x) >> 4) & 0x7) +#define S3C2412_NFECCERR_SPARE_ERR(x) (((x) >> 2) & 0x3) +#define S3C2412_NFECCERR_MAIN_ERR(x) (((x) >> 2) & 0x3) +#define S3C2412_NFECCERR_NONE (0) +#define S3C2412_NFECCERR_1BIT (1) +#define S3C2412_NFECCERR_MULTIBIT (2) +#define S3C2412_NFECCERR_ECCAREA (3) + + + #endif /* __ASM_ARM_REGS_NAND */ diff --git a/include/asm-arm/arch-s3c2410/regs-rtc.h b/include/asm-arm/arch-s3c2410/regs-rtc.h index 228983f89..cd88fd634 100644 --- a/include/asm-arm/arch-s3c2410/regs-rtc.h +++ b/include/asm-arm/arch-s3c2410/regs-rtc.h @@ -8,17 +8,12 @@ * published by the Free Software Foundation. * * S3C2410 Internal RTC register definition - * - * Changelog: - * 19-06-2003 BJD Created file - * 12-03-2004 BJD Updated include protection - * 15-01-2005 LCVR Changed S3C2410_VA to S3C24XX_VA (s3c2400 support) */ #ifndef __ASM_ARCH_REGS_RTC_H #define __ASM_ARCH_REGS_RTC_H __FILE__ -#define S3C2410_RTCREG(x) ((x) + S3C24XX_VA_RTC) +#define S3C2410_RTCREG(x) (x) #define S3C2410_RTCCON S3C2410_RTCREG(0x40) #define S3C2410_RTCCON_RTCEN (1<<0) diff --git a/include/asm-arm/arch-s3c2410/regs-sdi.h b/include/asm-arm/arch-s3c2410/regs-sdi.h index ca9a26fbe..06e716e5b 100644 --- a/include/asm-arm/arch-s3c2410/regs-sdi.h +++ b/include/asm-arm/arch-s3c2410/regs-sdi.h @@ -8,11 +8,6 @@ * published by the Free Software Foundation. * * S3C2410 MMC/SDIO register definitions - * - * Changelog: - * 18-Aug-2004 Ben Dooks Created initial file - * 29-Nov-2004 Koen Martens Added some missing defines, fixed duplicates - * 29-Nov-2004 Ben Dooks Updated Koen's patch */ #ifndef __ASM_ARM_REGS_SDI diff --git a/include/asm-arm/arch-s3c2410/regs-serial.h b/include/asm-arm/arch-s3c2410/regs-serial.h index 83b01254c..19c77da9c 100644 --- a/include/asm-arm/arch-s3c2410/regs-serial.h +++ b/include/asm-arm/arch-s3c2410/regs-serial.h @@ -27,10 +27,7 @@ * 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 - * - * Modifications: - * 10-Mar-2005 LCVR Changed S3C2410_VA to S3C24XX_VA (s3c2400 support) - */ +*/ #ifndef __ASM_ARM_REGS_SERIAL_H #define __ASM_ARM_REGS_SERIAL_H @@ -82,6 +79,12 @@ #define S3C2440_UCON2_DIVMASK (7 << 12) #define S3C2440_UCON_DIVSHIFT (12) +#define S3C2412_UCON_CLKMASK (3<<10) +#define S3C2412_UCON_UCLK (1<<10) +#define S3C2412_UCON_USYSCLK (3<<10) +#define S3C2412_UCON_PCLK (0<<10) +#define S3C2412_UCON_PCLK2 (2<<10) + #define S3C2410_UCON_UCLK (1<<10) #define S3C2410_UCON_SBREAK (1<<4) @@ -124,6 +127,15 @@ #define S3C2410_UMCOM_AFC (1<<4) #define S3C2410_UMCOM_RTS_LOW (1<<0) +#define S3C2412_UMCON_AFC_63 (0<<5) +#define S3C2412_UMCON_AFC_56 (1<<5) +#define S3C2412_UMCON_AFC_48 (2<<5) +#define S3C2412_UMCON_AFC_40 (3<<5) +#define S3C2412_UMCON_AFC_32 (4<<5) +#define S3C2412_UMCON_AFC_24 (5<<5) +#define S3C2412_UMCON_AFC_16 (6<<5) +#define S3C2412_UMCON_AFC_8 (7<<5) + #define S3C2410_UFSTAT_TXFULL (1<<9) #define S3C2410_UFSTAT_RXFULL (1<<8) #define S3C2410_UFSTAT_TXMASK (15<<4) diff --git a/include/asm-arm/arch-s3c2410/regs-spi.h b/include/asm-arm/arch-s3c2410/regs-spi.h index 338217858..3552280d1 100644 --- a/include/asm-arm/arch-s3c2410/regs-spi.h +++ b/include/asm-arm/arch-s3c2410/regs-spi.h @@ -7,13 +7,7 @@ * published by the Free Software Foundation. * * S3C2410 SPI register definition - * - * Changelog: - * 20-04-2004 KF Created file - * 04-10-2004 BJD Removed VA address (no longer mapped) - * tidied file for submission - * 03-04-2005 LCVR Added S3C2400_SPPIN_nCS definition - */ +*/ #ifndef __ASM_ARCH_REGS_SPI_H #define __ASM_ARCH_REGS_SPI_H diff --git a/include/asm-arm/arch-s3c2410/regs-timer.h b/include/asm-arm/arch-s3c2410/regs-timer.h index 169064e27..731918e77 100644 --- a/include/asm-arm/arch-s3c2410/regs-timer.h +++ b/include/asm-arm/arch-s3c2410/regs-timer.h @@ -8,13 +8,6 @@ * published by the Free Software Foundation. * * S3C2410 Timer configuration - * - * Changelog: - * 05-06-2003 BJD Created file - * 26-06-2003 BJD Added more timer definitions to mux / control - * 12-03-2004 BJD Updated include protection - * 10-02-2005 BJD Added S3C2410_TCFG1_MUX4_SHIFT (Guillaume Gourat) - * 10-03-2005 LCVR Changed S3C2410_VA to S3C24XX_VA */ diff --git a/include/asm-arm/arch-s3c2410/regs-udc.h b/include/asm-arm/arch-s3c2410/regs-udc.h index bf315b763..3aa31a27d 100644 --- a/include/asm-arm/arch-s3c2410/regs-udc.h +++ b/include/asm-arm/arch-s3c2410/regs-udc.h @@ -6,13 +6,7 @@ * 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. - * - * Changelog: - * 01-08-2004 Initial creation - * 12-09-2004 Cleanup for submission - * 24-10-2004 Fixed S3C2410_UDC_MAXP_REG definition - * 10-03-2005 Changed S3C2410_VA to S3C24XX_VA - */ +*/ #ifndef __ASM_ARCH_REGS_UDC_H #define __ASM_ARCH_REGS_UDC_H diff --git a/include/asm-arm/arch-s3c2410/regs-watchdog.h b/include/asm-arm/arch-s3c2410/regs-watchdog.h index d199ca6af..f4fff448c 100644 --- a/include/asm-arm/arch-s3c2410/regs-watchdog.h +++ b/include/asm-arm/arch-s3c2410/regs-watchdog.h @@ -1,4 +1,4 @@ -/* linux/include/asm/arch-s3c2410/regs0watchdog.h +/* linux/include/asm/arch-s3c2410/regs-watchdog.h * * Copyright (c) 2003 Simtec Electronics * http://www.simtec.co.uk/products/SWLINUX/ @@ -8,11 +8,6 @@ * published by the Free Software Foundation. * * S3C2410 Watchdog timer control - * - * Changelog: - * 21-06-2003 BJD Created file - * 12-03-2004 BJD Updated include protection - * 10-03-2005 LCVR Changed S3C2410_VA to S3C24XX_VA */ diff --git a/include/asm-arm/arch-s3c2410/system.h b/include/asm-arm/arch-s3c2410/system.h index 9b0d85024..718246d85 100644 --- a/include/asm-arm/arch-s3c2410/system.h +++ b/include/asm-arm/arch-s3c2410/system.h @@ -8,14 +8,7 @@ * 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. - * - * Changelog: - * 12-May-2003 BJD Created file - * 14-May-2003 BJD Removed idle to aid debugging - * 12-Jun-2003 BJD Added reset via watchdog - * 04-Sep-2003 BJD Moved to v2.6 - * 28-Oct-2004 BJD Added over-ride for idle, and fixed reset panic() - */ +*/ #include #include diff --git a/include/asm-arm/arch-s3c2410/timex.h b/include/asm-arm/arch-s3c2410/timex.h index 3558a3a75..703c337c5 100644 --- a/include/asm-arm/arch-s3c2410/timex.h +++ b/include/asm-arm/arch-s3c2410/timex.h @@ -8,12 +8,6 @@ * 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. - * - * Changelog: - * 02-Sep-2003 BJD Created file - * 05-Jan-2004 BJD Updated for Linux 2.6.0 - * 22-Nov-2004 BJD Fixed CLOCK_TICK_RATE - * 10-Jan-2004 BJD Removed s3c2410_clock_tick_rate */ #ifndef __ASM_ARCH_TIMEX_H diff --git a/include/asm-arm/arch-s3c2410/uncompress.h b/include/asm-arm/arch-s3c2410/uncompress.h index a6f6a0e44..81b3e91c5 100644 --- a/include/asm-arm/arch-s3c2410/uncompress.h +++ b/include/asm-arm/arch-s3c2410/uncompress.h @@ -8,21 +8,11 @@ * 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. - * - * Changelog: - * 22-May-2003 BJD Created - * 08-Sep-2003 BJD Moved to linux v2.6 - * 12-Mar-2004 BJD Updated header protection - * 12-Oct-2004 BJD Take account of debug uart configuration - * 15-Nov-2004 BJD Fixed uart configuration - * 22-Feb-2005 BJD Added watchdog to uncompress - * 04-Apr-2005 LCVR Added support to S3C2400 (no cpuid at GSTATUS1) */ #ifndef __ASM_ARCH_UNCOMPRESS_H #define __ASM_ARCH_UNCOMPRESS_H -#include /* defines for UART registers */ #include "asm/arch/regs-serial.h" @@ -82,7 +72,8 @@ static void putc(int ch) while (1) { level = uart_rd(S3C2410_UFSTAT); - if (cpuid == S3C2410_GSTATUS1_2440) { + if (cpuid == S3C2410_GSTATUS1_2440 || + cpuid == S3C2410_GSTATUS1_2442) { level &= S3C2440_UFSTAT_TXMASK; level >>= S3C2440_UFSTAT_TXSHIFT; } else { @@ -130,7 +121,7 @@ static void arch_decomp_wdog_start(void) { __raw_writel(WDOG_COUNT, S3C2410_WTDAT); __raw_writel(WDOG_COUNT, S3C2410_WTCNT); - __raw_writel(S3C2410_WTCON_ENABLE | S3C2410_WTCON_DIV128 | S3C2410_WTCON_RSTEN | S3C2410_WTCON_PRESCALE(0x40), S3C2410_WTCON); + __raw_writel(S3C2410_WTCON_ENABLE | S3C2410_WTCON_DIV128 | S3C2410_WTCON_RSTEN | S3C2410_WTCON_PRESCALE(0x80), S3C2410_WTCON); } #else diff --git a/include/asm-arm/arch-s3c2410/usb-control.h b/include/asm-arm/arch-s3c2410/usb-control.h index bd43b566d..35723569a 100644 --- a/include/asm-arm/arch-s3c2410/usb-control.h +++ b/include/asm-arm/arch-s3c2410/usb-control.h @@ -8,11 +8,6 @@ * 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. - * - * Changelog: - * 11-Sep-2004 BJD Created file - * 21-Sep-2004 BJD Updated port info - * 09-Aug-2005 BJD Renamed s3c2410_report_oc s3c2410_usb_report_oc */ #ifndef __ASM_ARCH_USBCONTROL_H diff --git a/include/asm-arm/arch-s3c2410/vmalloc.h b/include/asm-arm/arch-s3c2410/vmalloc.h index 33963cd54..0ae3bdb7e 100644 --- a/include/asm-arm/arch-s3c2410/vmalloc.h +++ b/include/asm-arm/arch-s3c2410/vmalloc.h @@ -10,11 +10,7 @@ * published by the Free Software Foundation. * * S3C2410 vmalloc definition - * - * Changelog: - * 12-Mar-2004 BJD Fixed header, added include protection - * 12=Mar-2004 BJD Fixed VMALLOC_END definitions - */ +*/ #ifndef __ASM_ARCH_VMALLOC_H #define __ASM_ARCH_VMALLOC_H diff --git a/include/asm-arm/arch-s3c2410/vr1000-cpld.h b/include/asm-arm/arch-s3c2410/vr1000-cpld.h index 0ee373ac6..a341b1e1b 100644 --- a/include/asm-arm/arch-s3c2410/vr1000-cpld.h +++ b/include/asm-arm/arch-s3c2410/vr1000-cpld.h @@ -8,10 +8,6 @@ * 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. - * - * Changelog: - * 25-May-2003 BJD Created file, added CTRL1 registers - * 19-Mar-2004 BJD Added VR1000 CPLD definitions */ #ifndef __ASM_ARCH_VR1000CPLD_H diff --git a/include/asm-arm/arch-s3c2410/vr1000-irq.h b/include/asm-arm/arch-s3c2410/vr1000-irq.h index 694f7715d..c39a0ffa6 100644 --- a/include/asm-arm/arch-s3c2410/vr1000-irq.h +++ b/include/asm-arm/arch-s3c2410/vr1000-irq.h @@ -8,11 +8,7 @@ * 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. - * - * Changelog: - * 06-Jan-2003 BJD Linux 2.6.0 version - * 19-Mar-2004 BJD Updates for VR1000 - */ +*/ #ifndef __ASM_ARCH_VR1000IRQ_H #define __ASM_ARCH_VR1000IRQ_H diff --git a/include/asm-arm/arch-s3c2410/vr1000-map.h b/include/asm-arm/arch-s3c2410/vr1000-map.h index 867c9355f..1fe4db36c 100644 --- a/include/asm-arm/arch-s3c2410/vr1000-map.h +++ b/include/asm-arm/arch-s3c2410/vr1000-map.h @@ -8,12 +8,6 @@ * 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. - * - * Changelog: - * 06-Jan-2003 BJD Linux 2.6.0 version, split specifics from arch/map.h - * 12-Mar-2004 BJD Fixed header include protection - * 19-Mar-2004 BJD Copied to VR1000 machine headers. - * 19-Jan-2005 BJD Updated map definitions */ /* needs arch/map.h including with this */ diff --git a/include/asm-arm/arch-sa1100/assabet.h b/include/asm-arm/arch-sa1100/assabet.h index 1f59b368c..d6a1bb5b4 100644 --- a/include/asm-arm/arch-sa1100/assabet.h +++ b/include/asm-arm/arch-sa1100/assabet.h @@ -12,7 +12,6 @@ #ifndef __ASM_ARCH_ASSABET_H #define __ASM_ARCH_ASSABET_H -#include /* System Configuration Register flags */ diff --git a/include/asm-arm/arch-sa1100/cerf.h b/include/asm-arm/arch-sa1100/cerf.h index 356d5ba88..9a19c3d07 100644 --- a/include/asm-arm/arch-sa1100/cerf.h +++ b/include/asm-arm/arch-sa1100/cerf.h @@ -10,7 +10,6 @@ #ifndef _INCLUDE_CERF_H_ #define _INCLUDE_CERF_H_ -#include #define CERF_ETH_IO 0xf0000000 #define CERF_ETH_IRQ IRQ_GPIO26 diff --git a/include/asm-arm/arch-sa1100/collie.h b/include/asm-arm/arch-sa1100/collie.h index d49e5ff63..14a344aa3 100644 --- a/include/asm-arm/arch-sa1100/collie.h +++ b/include/asm-arm/arch-sa1100/collie.h @@ -13,7 +13,6 @@ #ifndef __ASM_ARCH_COLLIE_H #define __ASM_ARCH_COLLIE_H -#include #define COLLIE_SCP_CHARGE_ON SCOOP_GPCR_PA11 #define COLLIE_SCP_DIAG_BOOT1 SCOOP_GPCR_PA12 diff --git a/include/asm-arm/arch-sa1100/dma.h b/include/asm-arm/arch-sa1100/dma.h index 02575d72a..6b7917a2e 100644 --- a/include/asm-arm/arch-sa1100/dma.h +++ b/include/asm-arm/arch-sa1100/dma.h @@ -10,7 +10,6 @@ #ifndef __ASM_ARCH_DMA_H #define __ASM_ARCH_DMA_H -#include #include "hardware.h" diff --git a/include/asm-arm/arch-sa1100/hardware.h b/include/asm-arm/arch-sa1100/hardware.h index ee008a548..1abd7cfc8 100644 --- a/include/asm-arm/arch-sa1100/hardware.h +++ b/include/asm-arm/arch-sa1100/hardware.h @@ -12,7 +12,6 @@ #ifndef __ASM_ARCH_HARDWARE_H #define __ASM_ARCH_HARDWARE_H -#include #define UNCACHEABLE_ADDR 0xfa050000 diff --git a/include/asm-arm/arch-sa1100/ide.h b/include/asm-arm/arch-sa1100/ide.h index 215353806..98b10bcf9 100644 --- a/include/asm-arm/arch-sa1100/ide.h +++ b/include/asm-arm/arch-sa1100/ide.h @@ -9,7 +9,6 @@ * architectures. */ -#include #include #include #include diff --git a/include/asm-arm/arch-sa1100/io.h b/include/asm-arm/arch-sa1100/io.h index 040ccde7a..075626940 100644 --- a/include/asm-arm/arch-sa1100/io.h +++ b/include/asm-arm/arch-sa1100/io.h @@ -22,6 +22,5 @@ static inline void __iomem *__io(unsigned long addr) } #define __io(a) __io(a) #define __mem_pci(a) (a) -#define __mem_isa(a) (a) #endif diff --git a/include/asm-arm/arch-sa1100/irqs.h b/include/asm-arm/arch-sa1100/irqs.h index eabd3be3d..d7940683e 100644 --- a/include/asm-arm/arch-sa1100/irqs.h +++ b/include/asm-arm/arch-sa1100/irqs.h @@ -7,7 +7,6 @@ * * 2001/11/14 RMK Cleaned up and standardised a lot of the IRQs. */ -#include #define IRQ_GPIO0 0 #define IRQ_GPIO1 1 diff --git a/include/asm-arm/arch-sa1100/memory.h b/include/asm-arm/arch-sa1100/memory.h index a29fac138..1ff172dc8 100644 --- a/include/asm-arm/arch-sa1100/memory.h +++ b/include/asm-arm/arch-sa1100/memory.h @@ -7,7 +7,6 @@ #ifndef __ASM_ARCH_MEMORY_H #define __ASM_ARCH_MEMORY_H -#include #include /* diff --git a/include/asm-arm/arch-sa1100/system.h b/include/asm-arm/arch-sa1100/system.h index 0f0612f79..aef91e3b6 100644 --- a/include/asm-arm/arch-sa1100/system.h +++ b/include/asm-arm/arch-sa1100/system.h @@ -3,7 +3,6 @@ * * Copyright (c) 1999 Nicolas Pitre */ -#include #include static inline void arch_idle(void) diff --git a/include/asm-arm/arch-versatile/io.h b/include/asm-arm/arch-versatile/io.h index 47e904cf2..c4d01948e 100644 --- a/include/asm-arm/arch-versatile/io.h +++ b/include/asm-arm/arch-versatile/io.h @@ -28,6 +28,5 @@ static inline void __iomem *__io(unsigned long addr) } #define __io(a) __io(a) #define __mem_pci(a) (a) -#define __mem_isa(a) (a) #endif diff --git a/include/asm-arm/arch-versatile/platform.h b/include/asm-arm/arch-versatile/platform.h index 72ef87456..2af9d7c9c 100644 --- a/include/asm-arm/arch-versatile/platform.h +++ b/include/asm-arm/arch-versatile/platform.h @@ -65,6 +65,8 @@ #define VERSATILE_SYS_OSC1_OFFSET 0x1C #endif +#define VERSATILE_SYS_OSCCLCD_OFFSET 0x1c + #define VERSATILE_SYS_LOCK_OFFSET 0x20 #define VERSATILE_SYS_100HZ_OFFSET 0x24 #define VERSATILE_SYS_CFGDATA1_OFFSET 0x28 diff --git a/include/asm-arm/arch-versatile/system.h b/include/asm-arm/arch-versatile/system.h index 8889a1897..71c6254c0 100644 --- a/include/asm-arm/arch-versatile/system.h +++ b/include/asm-arm/arch-versatile/system.h @@ -36,16 +36,14 @@ static inline void arch_idle(void) static inline void arch_reset(char mode) { - unsigned int hdr_ctrl = (IO_ADDRESS(VERSATILE_SYS_BASE) + VERSATILE_SYS_RESETCTL_OFFSET); - unsigned int val; + u32 val; - /* - * To reset, we hit the on-board reset register - * in the system FPGA - */ - val = __raw_readl(hdr_ctrl); - val |= VERSATILE_SYS_CTRL_RESET_CONFIGCLR; - __raw_writel(val, hdr_ctrl); + val = __raw_readl(IO_ADDRESS(VERSATILE_SYS_RESETCTL)) & ~0x7; + val |= 0x105; + + __raw_writel(0xa05f, IO_ADDRESS(VERSATILE_SYS_LOCK)); + __raw_writel(val, IO_ADDRESS(VERSATILE_SYS_RESETCTL)); + __raw_writel(0, IO_ADDRESS(VERSATILE_SYS_LOCK)); } #endif diff --git a/include/asm-arm/assembler.h b/include/asm-arm/assembler.h index d53bafa9b..fce832820 100644 --- a/include/asm-arm/assembler.h +++ b/include/asm-arm/assembler.h @@ -55,30 +55,6 @@ #define PLD(code...) #endif -#define MODE_USR USR_MODE -#define MODE_FIQ FIQ_MODE -#define MODE_IRQ IRQ_MODE -#define MODE_SVC SVC_MODE - -#define DEFAULT_FIQ MODE_FIQ - -/* - * LOADREGS - ldm with PC in register list (eg, ldmfd sp!, {pc}) - */ -#ifdef __STDC__ -#define LOADREGS(cond, base, reglist...)\ - ldm##cond base,reglist -#else -#define LOADREGS(cond, base, reglist...)\ - ldm/**/cond base,reglist -#endif - -/* - * Build a return instruction for this processor type. - */ -#define RETINSTR(instr, regs...)\ - instr regs - /* * Enable and disable interrupts */ @@ -117,18 +93,6 @@ msr cpsr_c, \oldcpsr .endm -/* - * These two are used to save LR/restore PC over a user-based access. - * The old 26-bit architecture requires that we do. On 32-bit - * architecture, we can safely ignore this requirement. - */ - .macro save_lr - .endm - - .macro restore_pc - mov pc, lr - .endm - #define USER(x...) \ 9999: x; \ .section __ex_table,"a"; \ diff --git a/include/asm-arm/atomic.h b/include/asm-arm/atomic.h index 3d7283d84..4b0ce3e7d 100644 --- a/include/asm-arm/atomic.h +++ b/include/asm-arm/atomic.h @@ -11,7 +11,6 @@ #ifndef __ASM_ARM_ATOMIC_H #define __ASM_ARM_ATOMIC_H -#include #include typedef struct { volatile int counter; } atomic_t; diff --git a/include/asm-arm/bug.h b/include/asm-arm/bug.h index 5ab8216f5..0e36fd5d8 100644 --- a/include/asm-arm/bug.h +++ b/include/asm-arm/bug.h @@ -1,8 +1,6 @@ #ifndef _ASMARM_BUG_H #define _ASMARM_BUG_H -#include -#include #ifdef CONFIG_BUG #ifdef CONFIG_DEBUG_BUGVERBOSE diff --git a/include/asm-arm/bugs.h b/include/asm-arm/bugs.h index 4c80ec519..ca54eb0f1 100644 --- a/include/asm-arm/bugs.h +++ b/include/asm-arm/bugs.h @@ -10,8 +10,12 @@ #ifndef __ASM_BUGS_H #define __ASM_BUGS_H +#ifdef CONFIG_MMU extern void check_writebuffer_bugs(void); #define check_bugs() check_writebuffer_bugs() +#else +#define check_bugs() do { } while (0) +#endif #endif diff --git a/include/asm-arm/byteorder.h b/include/asm-arm/byteorder.h index 17eaf8bdf..e6f7fcdc7 100644 --- a/include/asm-arm/byteorder.h +++ b/include/asm-arm/byteorder.h @@ -22,16 +22,18 @@ static inline __attribute_const__ __u32 ___arch__swab32(__u32 x) { __u32 t; - if (__builtin_constant_p(x)) { - t = x ^ ((x << 16) | (x >> 16)); /* eor r1,r0,r0,ror #16 */ - } else { +#ifndef __thumb__ + if (!__builtin_constant_p(x)) { /* * The compiler needs a bit of a hint here to always do the * right thing and not screw it up to different degrees * depending on the gcc version. */ asm ("eor\t%0, %1, %1, ror #16" : "=r" (t) : "r" (x)); - } + } else +#endif + t = x ^ ((x << 16) | (x >> 16)); /* eor r1,r0,r0,ror #16 */ + x = (x << 24) | (x >> 8); /* mov r0,r0,ror #8 */ t &= ~0x00FF0000; /* bic r1,r1,#0x00FF0000 */ x ^= (t >> 8); /* eor r0,r0,r1,lsr #8 */ diff --git a/include/asm-arm/cacheflush.h b/include/asm-arm/cacheflush.h index 746be56b1..e4a2569c6 100644 --- a/include/asm-arm/cacheflush.h +++ b/include/asm-arm/cacheflush.h @@ -10,7 +10,6 @@ #ifndef _ASMARM_CACHEFLUSH_H #define _ASMARM_CACHEFLUSH_H -#include #include #include @@ -248,14 +247,12 @@ extern void dmac_flush_range(unsigned long, unsigned long); */ #define copy_to_user_page(vma, page, vaddr, dst, src, len) \ do { \ - flush_cache_page(vma, vaddr, page_to_pfn(page));\ memcpy(dst, src, len); \ - flush_dcache_page(page); \ + flush_ptrace_access(vma, page, vaddr, dst, len, 1);\ } while (0) #define copy_from_user_page(vma, page, vaddr, dst, src, len) \ do { \ - flush_cache_page(vma, vaddr, page_to_pfn(page));\ memcpy(dst, src, len); \ } while (0) @@ -286,10 +283,24 @@ flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned l __cpuc_flush_user_range(addr, addr + PAGE_SIZE, vma->vm_flags); } } + +static inline void +flush_ptrace_access(struct vm_area_struct *vma, struct page *page, + unsigned long uaddr, void *kaddr, + unsigned long len, int write) +{ + if (cpu_isset(smp_processor_id(), vma->vm_mm->cpu_vm_mask)) { + unsigned long addr = (unsigned long)kaddr; + __cpuc_coherent_kern_range(addr, addr + len); + } +} #else extern void flush_cache_mm(struct mm_struct *mm); extern void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end); extern void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned long pfn); +extern void flush_ptrace_access(struct vm_area_struct *vma, struct page *page, + unsigned long uaddr, void *kaddr, + unsigned long len, int write); #endif /* diff --git a/include/asm-arm/cpu.h b/include/asm-arm/cpu.h index fcbdd40cb..715426b9b 100644 --- a/include/asm-arm/cpu.h +++ b/include/asm-arm/cpu.h @@ -10,12 +10,12 @@ #ifndef __ASM_ARM_CPU_H #define __ASM_ARM_CPU_H -#include #include struct cpuinfo_arm { struct cpu cpu; #ifdef CONFIG_SMP + struct task_struct *idle; unsigned int loops_per_jiffy; #endif }; diff --git a/include/asm-arm/dma-mapping.h b/include/asm-arm/dma-mapping.h index 63ca7412a..55eb4dc32 100644 --- a/include/asm-arm/dma-mapping.h +++ b/include/asm-arm/dma-mapping.h @@ -3,7 +3,6 @@ #ifdef __KERNEL__ -#include #include /* need struct page */ #include diff --git a/include/asm-arm/dma.h b/include/asm-arm/dma.h index 49c01e2bf..9f2c5305c 100644 --- a/include/asm-arm/dma.h +++ b/include/asm-arm/dma.h @@ -3,7 +3,6 @@ typedef unsigned int dmach_t; -#include #include #include #include diff --git a/include/asm-arm/domain.h b/include/asm-arm/domain.h index f8ea2de48..4c2885abb 100644 --- a/include/asm-arm/domain.h +++ b/include/asm-arm/domain.h @@ -50,6 +50,8 @@ #define domain_val(dom,type) ((type) << (2*(dom))) #ifndef __ASSEMBLY__ + +#ifdef CONFIG_MMU #define set_domain(x) \ do { \ __asm__ __volatile__( \ @@ -66,5 +68,10 @@ set_domain(thread->cpu_domain); \ } while (0) +#else +#define set_domain(x) do { } while (0) +#define modify_domain(dom,type) do { } while (0) +#endif + #endif #endif /* !__ASSEMBLY__ */ diff --git a/include/asm-arm/elf.h b/include/asm-arm/elf.h index 2d44b42d1..17f0c656d 100644 --- a/include/asm-arm/elf.h +++ b/include/asm-arm/elf.h @@ -1,7 +1,6 @@ #ifndef __ASMARM_ELF_H #define __ASMARM_ELF_H -#include /* * ELF register definitions.. @@ -9,7 +8,6 @@ #include #include -#include typedef unsigned long elf_greg_t; typedef unsigned long elf_freg_t[3]; @@ -30,11 +28,6 @@ typedef elf_greg_t elf_gregset_t[ELF_NGREG]; typedef struct user_fp elf_fpregset_t; -/* - * This is used to ensure we don't load something for the wrong architecture. - */ -#define elf_check_arch(x) ( ((x)->e_machine == EM_ARM) && (ELF_PROC_OK((x))) ) - /* * These are used to set parameters in the core dumps. */ @@ -46,6 +39,14 @@ typedef struct user_fp elf_fpregset_t; #endif #define ELF_ARCH EM_ARM +#ifdef __KERNEL__ +#include + +/* + * This is used to ensure we don't load something for the wrong architecture. + */ +#define elf_check_arch(x) ( ((x)->e_machine == EM_ARM) && (ELF_PROC_OK((x))) ) + #define USE_ELF_CORE_DUMP #define ELF_EXEC_PAGESIZE 4096 @@ -82,8 +83,6 @@ typedef struct user_fp elf_fpregset_t; extern char elf_platform[]; #define ELF_PLATFORM (elf_platform) -#ifdef __KERNEL__ - /* * 32-bit code is always OK. Some cpus can do 26-bit, some can't. */ diff --git a/include/asm-arm/floppy.h b/include/asm-arm/floppy.h index 6ea657c88..54b5ae44e 100644 --- a/include/asm-arm/floppy.h +++ b/include/asm-arm/floppy.h @@ -25,7 +25,7 @@ #define fd_inb(port) inb((port)) #define fd_request_irq() request_irq(IRQ_FLOPPYDISK,floppy_interrupt,\ - SA_INTERRUPT|SA_SAMPLE_RANDOM,"floppy",NULL) + IRQF_DISABLED,"floppy",NULL) #define fd_free_irq() free_irq(IRQ_FLOPPYDISK,NULL) #define fd_disable_irq() disable_irq(IRQ_FLOPPYDISK) #define fd_enable_irq() enable_irq(IRQ_FLOPPYDISK) diff --git a/include/asm-arm/fpstate.h b/include/asm-arm/fpstate.h index 52bae088a..6af4e6bd1 100644 --- a/include/asm-arm/fpstate.h +++ b/include/asm-arm/fpstate.h @@ -11,7 +11,6 @@ #ifndef __ASM_ARM_FPSTATE_H #define __ASM_ARM_FPSTATE_H -#include #ifndef __ASSEMBLY__ @@ -73,6 +72,14 @@ union fp_state { #define FP_SIZE (sizeof(union fp_state) / sizeof(int)) +struct crunch_state { + unsigned int mvdx[16][2]; + unsigned int mvax[4][3]; + unsigned int dspsc[2]; +}; + +#define CRUNCH_SIZE sizeof(struct crunch_state) + #endif #endif diff --git a/include/asm-arm/glue.h b/include/asm-arm/glue.h index 223e0d6c4..0cc5d3b10 100644 --- a/include/asm-arm/glue.h +++ b/include/asm-arm/glue.h @@ -15,7 +15,6 @@ */ #ifdef __KERNEL__ -#include #ifdef __STDC__ #define ____glue(name,fn) name##fn diff --git a/include/asm-arm/hardirq.h b/include/asm-arm/hardirq.h index 1cbb173bf..182310b99 100644 --- a/include/asm-arm/hardirq.h +++ b/include/asm-arm/hardirq.h @@ -1,7 +1,6 @@ #ifndef __ASM_HARDIRQ_H #define __ASM_HARDIRQ_H -#include #include #include #include diff --git a/include/asm-arm/hardware/dec21285.h b/include/asm-arm/hardware/dec21285.h index 6685e3fb9..546f7077b 100644 --- a/include/asm-arm/hardware/dec21285.h +++ b/include/asm-arm/hardware/dec21285.h @@ -18,7 +18,6 @@ #define DC21285_PCI_IO 0x7c000000 #define DC21285_PCI_MEM 0x80000000 -#include #ifndef __ASSEMBLY__ #include #define DC21285_IO(x) ((volatile unsigned long *)(ARMCSR_BASE+(x))) diff --git a/include/asm-arm/hardware/iomd.h b/include/asm-arm/hardware/iomd.h index 82fa2c279..396e55ad0 100644 --- a/include/asm-arm/hardware/iomd.h +++ b/include/asm-arm/hardware/iomd.h @@ -13,7 +13,6 @@ #ifndef __ASMARM_HARDWARE_IOMD_H #define __ASMARM_HARDWARE_IOMD_H -#include #ifndef __ASSEMBLY__ diff --git a/include/asm-arm/hardware/locomo.h b/include/asm-arm/hardware/locomo.h index 5f10048ec..22dfb1737 100644 --- a/include/asm-arm/hardware/locomo.h +++ b/include/asm-arm/hardware/locomo.h @@ -111,6 +111,8 @@ #define LOCOMO_ALS 0x00 /* Adjust light cycle */ #define LOCOMO_ALD 0x04 /* Adjust light duty */ +#define LOCOMO_ALC_EN 0x8000 + /* Backlight controller: TFT signal */ #define LOCOMO_BACKLIGHT 0x38 #define LOCOMO_TC 0x00 /* TFT control signal */ @@ -203,4 +205,7 @@ void locomo_gpio_write(struct locomo_dev *ldev, unsigned int bits, unsigned int /* M62332 control function */ void locomo_m62332_senddata(struct locomo_dev *ldev, unsigned int dac_data, int channel); +/* Frontlight control */ +void locomo_frontlight_set(struct locomo_dev *dev, int duty, int vr, int bpwf); + #endif diff --git a/include/asm-arm/hardware/sharpsl_pm.h b/include/asm-arm/hardware/sharpsl_pm.h index 36983e5f3..ecf15b839 100644 --- a/include/asm-arm/hardware/sharpsl_pm.h +++ b/include/asm-arm/hardware/sharpsl_pm.h @@ -16,6 +16,7 @@ struct sharpsl_charger_machinfo { void (*exit)(void); int gpio_acin; int gpio_batfull; + int batfull_irq; int gpio_batlock; int gpio_fatal; void (*discharge)(int); @@ -34,9 +35,19 @@ struct sharpsl_charger_machinfo { #define SHARPSL_STATUS_FATAL 7 unsigned long (*charger_wakeup)(void); int (*should_wakeup)(unsigned int resume_on_alarm); + void (*backlight_limit)(int); + int (*backlight_get_status) (void); + int charge_on_volt; + int charge_on_temp; + int charge_acin_high; + int charge_acin_low; + int fatal_acin_volt; + int fatal_noacin_volt; int bat_levels; struct battery_thresh *bat_levels_noac; struct battery_thresh *bat_levels_acin; + struct battery_thresh *bat_levels_noac_bl; + struct battery_thresh *bat_levels_acin_bl; int status_high_acin; int status_low_acin; int status_high_noac; diff --git a/include/asm-arm/hardware/ssp.h b/include/asm-arm/hardware/ssp.h index 28aa11b76..3b42e1819 100644 --- a/include/asm-arm/hardware/ssp.h +++ b/include/asm-arm/hardware/ssp.h @@ -16,8 +16,8 @@ struct ssp_state { }; int ssp_write_word(u16 data); -int ssp_read_word(void); -void ssp_flush(void); +int ssp_read_word(u16 *data); +int ssp_flush(void); void ssp_enable(void); void ssp_disable(void); void ssp_save_state(struct ssp_state *ssp); diff --git a/include/asm-arm/io.h b/include/asm-arm/io.h index b3479fc1c..bf7b9dea3 100644 --- a/include/asm-arm/io.h +++ b/include/asm-arm/io.h @@ -291,5 +291,12 @@ extern void pci_iounmap(struct pci_dev *dev, void __iomem *addr); */ #define xlate_dev_kmem_ptr(p) p +/* + * Register ISA memory and port locations for glibc iopl/inb/outb + * emulation. + */ +extern void register_isa_ports(unsigned int mmio, unsigned int io, + unsigned int io_shift); + #endif /* __KERNEL__ */ #endif /* __ASM_ARM_IO_H */ diff --git a/include/asm-arm/irq.h b/include/asm-arm/irq.h index 60b5105c9..283af50a1 100644 --- a/include/asm-arm/irq.h +++ b/include/asm-arm/irq.h @@ -21,18 +21,13 @@ struct irqaction; -extern void disable_irq_nosync(unsigned int); -extern void disable_irq(unsigned int); -extern void enable_irq(unsigned int); - /* - * These correspond with the SA_TRIGGER_* defines, and therefore the - * IORESOURCE_IRQ_* defines. + * Migration helpers */ -#define __IRQT_RISEDGE (1 << 0) -#define __IRQT_FALEDGE (1 << 1) -#define __IRQT_HIGHLVL (1 << 2) -#define __IRQT_LOWLVL (1 << 3) +#define __IRQT_FALEDGE IRQ_TYPE_EDGE_FALLING +#define __IRQT_RISEDGE IRQ_TYPE_EDGE_RISING +#define __IRQT_LOWLVL IRQ_TYPE_LEVEL_LOW +#define __IRQT_HIGHLVL IRQ_TYPE_LEVEL_HIGH #define IRQT_NOEDGE (0) #define IRQT_RISING (__IRQT_RISEDGE) @@ -40,16 +35,7 @@ extern void enable_irq(unsigned int); #define IRQT_BOTHEDGE (__IRQT_RISEDGE|__IRQT_FALEDGE) #define IRQT_LOW (__IRQT_LOWLVL) #define IRQT_HIGH (__IRQT_HIGHLVL) -#define IRQT_PROBE (1 << 4) - -int set_irq_type(unsigned int irq, unsigned int type); -void disable_irq_wake(unsigned int irq); -void enable_irq_wake(unsigned int irq); -int setup_irq(unsigned int, struct irqaction *); - -struct irqaction; -struct pt_regs; -int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *); +#define IRQT_PROBE IRQ_TYPE_PROBE extern void migrate_irqs(void); #endif diff --git a/include/asm-arm/leds.h b/include/asm-arm/leds.h index 88ce4124f..12290ea55 100644 --- a/include/asm-arm/leds.h +++ b/include/asm-arm/leds.h @@ -13,7 +13,6 @@ #ifndef ASM_ARM_LEDS_H #define ASM_ARM_LEDS_H -#include typedef enum { led_idle_start, diff --git a/include/asm-arm/mach/irq.h b/include/asm-arm/mach/irq.h index d4d420ecf..131f33733 100644 --- a/include/asm-arm/mach/irq.h +++ b/include/asm-arm/mach/irq.h @@ -10,95 +10,9 @@ #ifndef __ASM_ARM_MACH_IRQ_H #define __ASM_ARM_MACH_IRQ_H -struct irqdesc; -struct pt_regs; -struct seq_file; - -typedef void (*irq_handler_t)(unsigned int, struct irqdesc *, struct pt_regs *); -typedef void (*irq_control_t)(unsigned int); - -struct irqchip { - /* - * Acknowledge the IRQ. - * If this is a level-based IRQ, then it is expected to mask the IRQ - * as well. - */ - void (*ack)(unsigned int); - /* - * Mask the IRQ in hardware. - */ - void (*mask)(unsigned int); - /* - * Unmask the IRQ in hardware. - */ - void (*unmask)(unsigned int); - /* - * Ask the hardware to re-trigger the IRQ. - * Note: This method _must_ _not_ call the interrupt handler. - * If you are unable to retrigger the interrupt, do not - * provide a function, or if you do, return non-zero. - */ - int (*retrigger)(unsigned int); - /* - * Set the type of the IRQ. - */ - int (*set_type)(unsigned int, unsigned int); - /* - * Set wakeup-enable on the selected IRQ - */ - int (*set_wake)(unsigned int, unsigned int); - -#ifdef CONFIG_SMP - /* - * Route an interrupt to a CPU - */ - void (*set_cpu)(struct irqdesc *desc, unsigned int irq, unsigned int cpu); -#endif -}; - -struct irqdesc { - irq_handler_t handle; - struct irqchip *chip; - struct irqaction *action; - struct list_head pend; - void __iomem *base; - void *data; - unsigned int disable_depth; - - unsigned int triggered: 1; /* IRQ has occurred */ - unsigned int running : 1; /* IRQ is running */ - unsigned int pending : 1; /* IRQ is pending */ - unsigned int probing : 1; /* IRQ in use for a probe */ - unsigned int probe_ok : 1; /* IRQ can be used for probe */ - unsigned int valid : 1; /* IRQ claimable */ - unsigned int noautoenable : 1; /* don't automatically enable IRQ */ - unsigned int unused :25; - - unsigned int irqs_unhandled; - struct proc_dir_entry *procdir; - -#ifdef CONFIG_SMP - cpumask_t affinity; - unsigned int cpu; -#endif - - /* - * IRQ lock detection - */ - unsigned int lck_cnt; - unsigned int lck_pc; - unsigned int lck_jif; -}; - -extern struct irqdesc irq_desc[]; +#include -/* - * Helpful inline function for calling irq descriptor handlers. - */ -static inline void desc_handle_irq(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs) -{ - desc->handle(irq, desc, regs); -} +struct seq_file; /* * This is internal. Do not use it. @@ -106,18 +20,22 @@ static inline void desc_handle_irq(unsigned int irq, struct irqdesc *desc, struc extern void (*init_arch_irq)(void); extern void init_FIQ(void); extern int show_fiq_list(struct seq_file *, void *); -void __set_irq_handler(unsigned int irq, irq_handler_t, int); /* - * External stuff. + * Function wrappers + */ +#define set_irq_chipdata(irq, d) set_irq_chip_data(irq, d) +#define get_irq_chipdata(irq) get_irq_chip_data(irq) + +/* + * Obsolete inline function for calling irq descriptor handlers. */ -#define set_irq_handler(irq,handler) __set_irq_handler(irq,handler,0) -#define set_irq_chained_handler(irq,handler) __set_irq_handler(irq,handler,1) -#define set_irq_data(irq,d) do { irq_desc[irq].data = d; } while (0) -#define set_irq_chipdata(irq,d) do { irq_desc[irq].base = d; } while (0) -#define get_irq_chipdata(irq) (irq_desc[irq].base) +static inline void desc_handle_irq(unsigned int irq, struct irq_desc *desc, + struct pt_regs *regs) +{ + desc->handle_irq(irq, desc, regs); +} -void set_irq_chip(unsigned int irq, struct irqchip *); void set_irq_flags(unsigned int irq, unsigned int flags); #define IRQF_VALID (1 << 0) @@ -125,12 +43,25 @@ void set_irq_flags(unsigned int irq, unsigned int flags); #define IRQF_NOAUTOEN (1 << 2) /* - * Built-in IRQ handlers. + * This is for easy migration, but should be changed in the source */ -void do_level_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs); -void do_edge_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs); -void do_simple_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs); -void do_bad_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs); -void dummy_mask_unmask_irq(unsigned int irq); +#define do_level_IRQ handle_level_irq +#define do_edge_IRQ handle_edge_irq +#define do_simple_IRQ handle_simple_irq +#define irqdesc irq_desc +#define irqchip irq_chip + +#define do_bad_IRQ(irq,desc,regs) \ +do { \ + spin_lock(&desc->lock); \ + handle_bad_irq(irq, desc, regs); \ + spin_unlock(&desc->lock); \ +} while(0) + +extern unsigned long irq_err_count; +static inline void ack_bad_irq(int irq) +{ + irq_err_count++; +} #endif diff --git a/include/asm-arm/mach/map.h b/include/asm-arm/mach/map.h index e8ea67c97..cef5364ed 100644 --- a/include/asm-arm/mach/map.h +++ b/include/asm-arm/mach/map.h @@ -16,8 +16,6 @@ struct map_desc { unsigned int type; }; -struct meminfo; - #define MT_DEVICE 0 #define MT_CACHECLEAN 1 #define MT_MINICLEAN 2 @@ -28,7 +26,8 @@ struct meminfo; #define MT_IXP2000_DEVICE 7 #define MT_NONSHARED_DEVICE 8 -extern void create_memmap_holes(struct meminfo *); -extern void memtable_init(struct meminfo *); +#ifdef CONFIG_MMU extern void iotable_init(struct map_desc *, int); -extern void setup_io_desc(void); +#else +#define iotable_init(map,num) do { } while (0) +#endif diff --git a/include/asm-arm/mach/pci.h b/include/asm-arm/mach/pci.h index 25d540ed0..923e0ca66 100644 --- a/include/asm-arm/mach/pci.h +++ b/include/asm-arm/mach/pci.h @@ -28,7 +28,7 @@ struct hw_pci { struct pci_sys_data { struct list_head node; int busnr; /* primary bus number */ - unsigned long mem_offset; /* bus->cpu memory mapping offset */ + u64 mem_offset; /* bus->cpu memory mapping offset */ unsigned long io_offset; /* bus->cpu IO mapping offset */ struct pci_bus *bus; /* PCI bus */ struct resource *resource[3]; /* Primary PCI bus resources */ diff --git a/include/asm-arm/mach/serial_at91rm9200.h b/include/asm-arm/mach/serial_at91rm9200.h deleted file mode 100644 index 98f4b0cb8..000000000 --- a/include/asm-arm/mach/serial_at91rm9200.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * linux/include/asm-arm/mach/serial_at91rm9200.h - * - * Based on serial_sa1100.h by Nicolas Pitre - * - * Copyright (C) 2002 ATMEL Rousset - * - * Low level machine dependent UART functions. - */ -#include - -struct uart_port; - -/* - * This is a temporary structure for registering these - * functions; it is intended to be discarded after boot. - */ -struct at91rm9200_port_fns { - void (*set_mctrl)(struct uart_port *, u_int); - u_int (*get_mctrl)(struct uart_port *); - void (*enable_ms)(struct uart_port *); - void (*pm)(struct uart_port *, u_int, u_int); - int (*set_wake)(struct uart_port *, u_int); - int (*open)(struct uart_port *); - void (*close)(struct uart_port *); -}; - -#if defined(CONFIG_SERIAL_AT91) -void at91_register_uart_fns(struct at91rm9200_port_fns *fns); -void at91_register_uart(int idx, int port); -#else -#define at91_register_uart_fns(fns) do { } while (0) -#define at91_register_uart(idx,port) do { } while (0) -#endif - - diff --git a/include/asm-arm/mach/serial_sa1100.h b/include/asm-arm/mach/serial_sa1100.h index 916201858..20c22bb21 100644 --- a/include/asm-arm/mach/serial_sa1100.h +++ b/include/asm-arm/mach/serial_sa1100.h @@ -7,7 +7,6 @@ * * Low level machine dependent UART functions. */ -#include struct uart_port; struct uart_info; diff --git a/include/asm-arm/mach/time.h b/include/asm-arm/mach/time.h index 5cf4fd659..dee0bc336 100644 --- a/include/asm-arm/mach/time.h +++ b/include/asm-arm/mach/time.h @@ -39,14 +39,37 @@ struct sys_timer { void (*suspend)(void); void (*resume)(void); unsigned long (*offset)(void); + +#ifdef CONFIG_NO_IDLE_HZ + struct dyn_tick_timer *dyn_tick; +#endif +}; + +#ifdef CONFIG_NO_IDLE_HZ + +#define DYN_TICK_ENABLED (1 << 1) + +struct dyn_tick_timer { + spinlock_t lock; + unsigned int state; /* Current state */ + int (*enable)(void); /* Enables dynamic tick */ + int (*disable)(void); /* Disables dynamic tick */ + void (*reprogram)(unsigned long); /* Reprograms the timer */ + int (*handler)(int, void *, struct pt_regs *); }; +void timer_dyn_reprogram(void); +#else +#define timer_dyn_reprogram() do { } while (0) +#endif + extern struct sys_timer *system_timer; extern void timer_tick(struct pt_regs *); /* * Kernel time keeping support. */ +struct timespec; extern int (*set_rtc)(void); extern void save_time_delta(struct timespec *delta, struct timespec *rtc); extern void restore_time_delta(struct timespec *delta, struct timespec *rtc); diff --git a/include/asm-arm/memory.h b/include/asm-arm/memory.h index 209289407..91d536c21 100644 --- a/include/asm-arm/memory.h +++ b/include/asm-arm/memory.h @@ -2,6 +2,7 @@ * linux/include/asm-arm/memory.h * * Copyright (C) 2000-2002 Russell King + * modification for nommu, Hyok S. Choi, 2004 * * 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 @@ -22,11 +23,12 @@ #define UL(x) (x) #endif -#include #include #include #include +#ifdef CONFIG_MMU + #ifndef TASK_SIZE /* * TASK_SIZE - the maximum size of a user space task. @@ -48,6 +50,65 @@ #define PAGE_OFFSET UL(0xc0000000) #endif +/* + * The module space lives between the addresses given by TASK_SIZE + * and PAGE_OFFSET - it must be within 32MB of the kernel text. + */ +#define MODULE_END (PAGE_OFFSET) +#define MODULE_START (MODULE_END - 16*1048576) + +#if TASK_SIZE > MODULE_START +#error Top of user space clashes with start of module space +#endif + +/* + * The XIP kernel gets mapped at the bottom of the module vm area. + * Since we use sections to map it, this macro replaces the physical address + * with its virtual address while keeping offset from the base section. + */ +#define XIP_VIRT_ADDR(physaddr) (MODULE_START + ((physaddr) & 0x000fffff)) + +/* + * Allow 16MB-aligned ioremap pages + */ +#define IOREMAP_MAX_ORDER 24 + +#else /* CONFIG_MMU */ + +/* + * The limitation of user task size can grow up to the end of free ram region. + * It is difficult to define and perhaps will never meet the original meaning + * of this define that was meant to. + * Fortunately, there is no reference for this in noMMU mode, for now. + */ +#ifndef TASK_SIZE +#define TASK_SIZE (CONFIG_DRAM_SIZE) +#endif + +#ifndef TASK_UNMAPPED_BASE +#define TASK_UNMAPPED_BASE UL(0x00000000) +#endif + +#ifndef PHYS_OFFSET +#define PHYS_OFFSET (CONFIG_DRAM_BASE) +#endif + +#ifndef END_MEM +#define END_MEM (CONFIG_DRAM_BASE + CONFIG_DRAM_SIZE) +#endif + +#ifndef PAGE_OFFSET +#define PAGE_OFFSET (PHYS_OFFSET) +#endif + +/* + * The module can be at any place in ram in nommu mode. + */ +#define MODULE_END (END_MEM) +#define MODULE_START (PHYS_OFFSET) + +#endif /* !CONFIG_MMU */ + /* * Size of DMA-consistent memory region. Must be multiple of 2M, * between 2MB and 14MB inclusive. @@ -72,24 +133,6 @@ #define __phys_to_pfn(paddr) ((paddr) >> PAGE_SHIFT) #define __pfn_to_phys(pfn) ((pfn) << PAGE_SHIFT) -/* - * The module space lives between the addresses given by TASK_SIZE - * and PAGE_OFFSET - it must be within 32MB of the kernel text. - */ -#define MODULE_END (PAGE_OFFSET) -#define MODULE_START (MODULE_END - 16*1048576) - -#if TASK_SIZE > MODULE_START -#error Top of user space clashes with start of module space -#endif - -/* - * The XIP kernel gets mapped at the bottom of the module vm area. - * Since we use sections to map it, this macro replaces the physical address - * with its virtual address while keeping offset from the base section. - */ -#define XIP_VIRT_ADDR(physaddr) (MODULE_START + ((physaddr) & 0x000fffff)) - #ifndef __ASSEMBLY__ /* diff --git a/include/asm-arm/mmu.h b/include/asm-arm/mmu.h index a457cb719..fe2a23b56 100644 --- a/include/asm-arm/mmu.h +++ b/include/asm-arm/mmu.h @@ -1,10 +1,13 @@ #ifndef __ARM_MMU_H #define __ARM_MMU_H +#ifdef CONFIG_MMU + typedef struct { #if __LINUX_ARM_ARCH__ >= 6 unsigned int id; #endif + unsigned int kvm_seq; } mm_context_t; #if __LINUX_ARM_ARCH__ >= 6 @@ -13,4 +16,18 @@ typedef struct { #define ASID(mm) (0) #endif +#else + +/* + * From nommu.h: + * Copyright (C) 2002, David McCullough + * modified for 2.6 by Hyok S. Choi + */ +typedef struct { + struct vm_list_struct *vmlist; + unsigned long end_brk; +} mm_context_t; + +#endif + #endif diff --git a/include/asm-arm/mmu_context.h b/include/asm-arm/mmu_context.h index 81c59face..d1a65b1ed 100644 --- a/include/asm-arm/mmu_context.h +++ b/include/asm-arm/mmu_context.h @@ -17,6 +17,8 @@ #include #include +void __check_kvm_seq(struct mm_struct *mm); + #if __LINUX_ARM_ARCH__ >= 6 /* @@ -45,13 +47,21 @@ static inline void check_context(struct mm_struct *mm) { if (unlikely((mm->context.id ^ cpu_last_asid) >> ASID_BITS)) __new_context(mm); + + if (unlikely(mm->context.kvm_seq != init_mm.context.kvm_seq)) + __check_kvm_seq(mm); } #define init_new_context(tsk,mm) (__init_new_context(tsk,mm),0) #else -#define check_context(mm) do { } while (0) +static inline void check_context(struct mm_struct *mm) +{ + if (unlikely(mm->context.kvm_seq != init_mm.context.kvm_seq)) + __check_kvm_seq(mm); +} + #define init_new_context(tsk,mm) 0 #endif @@ -82,6 +92,7 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, struct task_struct *tsk) { +#ifdef CONFIG_MMU unsigned int cpu = smp_processor_id(); if (prev != next) { @@ -91,6 +102,7 @@ switch_mm(struct mm_struct *prev, struct mm_struct *next, if (cache_is_vivt()) cpu_clear(cpu, prev->cpu_vm_mask); } +#endif } #define deactivate_mm(tsk,mm) do { } while (0) diff --git a/include/asm-arm/page.h b/include/asm-arm/page.h index dfa947585..b779c2017 100644 --- a/include/asm-arm/page.h +++ b/include/asm-arm/page.h @@ -10,20 +10,25 @@ #ifndef _ASMARM_PAGE_H #define _ASMARM_PAGE_H -#include + +#ifdef __KERNEL__ /* PAGE_SHIFT determines the page size */ #define PAGE_SHIFT 12 #define PAGE_SIZE (1UL << PAGE_SHIFT) #define PAGE_MASK (~(PAGE_SIZE-1)) -#ifdef __KERNEL__ - /* to align the pointer to the (next) page boundary */ #define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK) #ifndef __ASSEMBLY__ +#ifndef CONFIG_MMU + +#include "page-nommu.h" + +#else + #include /* @@ -172,6 +177,8 @@ typedef unsigned long pgprot_t; /* the upper-most page table pointer */ extern pmd_t *top_pmd; +#endif /* CONFIG_MMU */ + #include #endif /* !__ASSEMBLY__ */ @@ -186,10 +193,10 @@ extern pmd_t *top_pmd; #define ARCH_SLAB_MINALIGN 8 #endif +#include + #define devmem_is_allowed(x) 1 #endif /* __KERNEL__ */ -#include - #endif diff --git a/include/asm-arm/pci.h b/include/asm-arm/pci.h index ead3ced38..f21abd4dd 100644 --- a/include/asm-arm/pci.h +++ b/include/asm-arm/pci.h @@ -2,7 +2,6 @@ #define ASMARM_PCI_H #ifdef __KERNEL__ -#include #include #include /* for PCIBIOS_MIN_* */ diff --git a/include/asm-arm/pgalloc.h b/include/asm-arm/pgalloc.h index c4ac2e677..4d4394552 100644 --- a/include/asm-arm/pgalloc.h +++ b/include/asm-arm/pgalloc.h @@ -16,6 +16,10 @@ #include #include +#define check_pgt_cache() do { } while (0) + +#ifdef CONFIG_MMU + #define _PAGE_USER_TABLE (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_USER)) #define _PAGE_KERNEL_TABLE (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_KERNEL)) @@ -32,8 +36,6 @@ extern void free_pgd_slow(pgd_t *pgd); #define pgd_alloc(mm) get_pgd_slow(mm) #define pgd_free(pgd) free_pgd_slow(pgd) -#define check_pgt_cache() do { } while (0) - /* * Allocate one PTE table. * @@ -126,4 +128,6 @@ pmd_populate(struct mm_struct *mm, pmd_t *pmdp, struct page *ptep) __pmd_populate(pmdp, page_to_pfn(ptep) << PAGE_SHIFT | _PAGE_USER_TABLE); } +#endif /* CONFIG_MMU */ + #endif diff --git a/include/asm-arm/pgtable-hwdef.h b/include/asm-arm/pgtable-hwdef.h index 1bc1f997b..f3b5120c9 100644 --- a/include/asm-arm/pgtable-hwdef.h +++ b/include/asm-arm/pgtable-hwdef.h @@ -28,6 +28,7 @@ */ #define PMD_SECT_BUFFERABLE (1 << 2) #define PMD_SECT_CACHEABLE (1 << 3) +#define PMD_SECT_XN (1 << 4) /* v6 */ #define PMD_SECT_AP_WRITE (1 << 10) #define PMD_SECT_AP_READ (1 << 11) #define PMD_SECT_TEX(x) ((x) << 12) /* v5 */ diff --git a/include/asm-arm/pgtable.h b/include/asm-arm/pgtable.h index e85c08d78..8d3919c64 100644 --- a/include/asm-arm/pgtable.h +++ b/include/asm-arm/pgtable.h @@ -11,9 +11,15 @@ #define _ASMARM_PGTABLE_H #include +#include + +#ifndef CONFIG_MMU + +#include "pgtable-nommu.h" + +#else #include -#include #include /* @@ -378,4 +384,6 @@ extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; #endif /* !__ASSEMBLY__ */ +#endif /* CONFIG_MMU */ + #endif /* _ASMARM_PGTABLE_H */ diff --git a/include/asm-arm/proc-fns.h b/include/asm-arm/proc-fns.h index 106045edb..1bde92cda 100644 --- a/include/asm-arm/proc-fns.h +++ b/include/asm-arm/proc-fns.h @@ -13,7 +13,6 @@ #ifdef __KERNEL__ -#include /* * Work out if we need multiple CPU support @@ -166,6 +165,8 @@ #include +#ifdef CONFIG_MMU + #define cpu_switch_mm(pgd,mm) cpu_do_switch_mm(virt_to_phys(pgd),mm) #define cpu_get_pgd() \ @@ -177,6 +178,8 @@ (pgd_t *)phys_to_virt(pg); \ }) +#endif + #endif /* __ASSEMBLY__ */ #endif /* __KERNEL__ */ #endif /* __ASM_PROCFNS_H */ diff --git a/include/asm-arm/procinfo.h b/include/asm-arm/procinfo.h index 842526055..91a31adfa 100644 --- a/include/asm-arm/procinfo.h +++ b/include/asm-arm/procinfo.h @@ -29,7 +29,8 @@ struct processor; struct proc_info_list { unsigned int cpu_val; unsigned int cpu_mask; - unsigned long __cpu_mmu_flags; /* used by head.S */ + unsigned long __cpu_mm_mmu_flags; /* used by head.S */ + unsigned long __cpu_io_mmu_flags; /* used by head.S */ unsigned long __cpu_flush; /* used by head.S */ const char *arch_name; const char *elf_name; @@ -54,5 +55,6 @@ extern unsigned int elf_hwcap; #define HWCAP_VFP 64 #define HWCAP_EDSP 128 #define HWCAP_JAVA 256 +#define HWCAP_IWMMXT 512 #endif diff --git a/include/asm-arm/ptrace.h b/include/asm-arm/ptrace.h index 77adb7fa1..5a8ef787d 100644 --- a/include/asm-arm/ptrace.h +++ b/include/asm-arm/ptrace.h @@ -10,7 +10,6 @@ #ifndef __ASM_ARM_PTRACE_H #define __ASM_ARM_PTRACE_H -#include #define PTRACE_GETREGS 12 #define PTRACE_SETREGS 13 @@ -26,6 +25,11 @@ #define PTRACE_SET_SYSCALL 23 +/* PTRACE_SYSCALL is 24 */ + +#define PTRACE_GETCRUNCHREGS 25 +#define PTRACE_SETCRUNCHREGS 26 + /* * PSR bits */ diff --git a/include/asm-arm/signal.h b/include/asm-arm/signal.h index ced691619..d0fb487ab 100644 --- a/include/asm-arm/signal.h +++ b/include/asm-arm/signal.h @@ -82,7 +82,6 @@ typedef unsigned long sigset_t; * is running in 26-bit. * SA_ONSTACK allows alternate signal stacks (see sigaltstack(2)). * SA_RESTART flag to get restarting signals (which were the default long ago) - * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_NODEFER prevents the current signal from being masked in the handler. * SA_RESETHAND clears the handler when the signal is delivered. * @@ -101,7 +100,6 @@ typedef unsigned long sigset_t; #define SA_NOMASK SA_NODEFER #define SA_ONESHOT SA_RESETHAND -#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ /* @@ -113,10 +111,6 @@ typedef unsigned long sigset_t; #define MINSIGSTKSZ 2048 #define SIGSTKSZ 8192 -#ifdef __KERNEL__ -#define SA_TIMER 0x40000000 -#endif - #include #ifdef __KERNEL__ diff --git a/include/asm-arm/smp.h b/include/asm-arm/smp.h index fe45f7f61..f67acce38 100644 --- a/include/asm-arm/smp.h +++ b/include/asm-arm/smp.h @@ -10,7 +10,6 @@ #ifndef __ASM_ARM_SMP_H #define __ASM_ARM_SMP_H -#include #include #include #include diff --git a/include/asm-arm/socket.h b/include/asm-arm/socket.h index 3c51da643..19f7df702 100644 --- a/include/asm-arm/socket.h +++ b/include/asm-arm/socket.h @@ -48,5 +48,6 @@ #define SO_ACCEPTCONN 30 #define SO_PEERSEC 31 +#define SO_PASSSEC 34 #endif /* _ASM_SOCKET_H */ diff --git a/include/asm-arm/spinlock.h b/include/asm-arm/spinlock.h index 406ca97a8..01b7c26a3 100644 --- a/include/asm-arm/spinlock.h +++ b/include/asm-arm/spinlock.h @@ -199,7 +199,21 @@ static inline void __raw_read_unlock(raw_rwlock_t *rw) : "cc"); } -#define __raw_read_trylock(lock) generic__raw_read_trylock(lock) +static inline int __raw_read_trylock(raw_rwlock_t *rw) +{ + unsigned long tmp, tmp2 = 1; + + __asm__ __volatile__( +"1: ldrex %0, [%2]\n" +" adds %0, %0, #1\n" +" strexpl %1, %0, [%2]\n" + : "=&r" (tmp), "+r" (tmp2) + : "r" (&rw->lock) + : "cc"); + + smp_mb(); + return tmp2 == 0; +} /* read_can_lock - would read_trylock() succeed? */ #define __raw_read_can_lock(x) ((x)->lock < 0x80000000) diff --git a/include/asm-arm/system.h b/include/asm-arm/system.h index 7c9568d30..0947cbf9b 100644 --- a/include/asm-arm/system.h +++ b/include/asm-arm/system.h @@ -3,7 +3,6 @@ #ifdef __KERNEL__ -#include #define CPU_ARCH_UNKNOWN 0 #define CPU_ARCH_ARMv3 1 @@ -108,6 +107,9 @@ extern void __show_regs(struct pt_regs *); extern int cpu_architecture(void); extern void cpu_init(void); +void arm_machine_restart(char mode); +extern void (*arm_pm_restart)(char str); + /* * Intel's XScale3 core supports some v6 features (supersections, L2) * but advertises itself as v5 as it does not support the v6 ISA. For @@ -174,7 +176,6 @@ extern unsigned int user_debug; #define wmb() mb() #define read_barrier_depends() do { } while(0) #define set_mb(var, value) do { var = value; mb(); } while (0) -#define set_wmb(var, value) do { var = value; wmb(); } while (0) #define nop() __asm__ __volatile__("mov\tr0,r0\t@ nop\n\t"); /* diff --git a/include/asm-arm/thread_info.h b/include/asm-arm/thread_info.h index cfbccb63c..f28b23613 100644 --- a/include/asm-arm/thread_info.h +++ b/include/asm-arm/thread_info.h @@ -59,6 +59,7 @@ struct thread_info { struct cpu_context_save cpu_context; /* cpu context */ __u8 used_cp[16]; /* thread used copro */ unsigned long tp_value; + struct crunch_state crunchstate; union fp_state fpstate __attribute__((aligned(8))); union vfp_state vfpstate; struct restart_block restart_block; @@ -101,16 +102,22 @@ extern void free_thread_info(struct thread_info *); #define thread_saved_fp(tsk) \ ((unsigned long)(task_thread_info(tsk)->cpu_context.fp)) +extern void crunch_task_disable(struct thread_info *); +extern void crunch_task_copy(struct thread_info *, void *); +extern void crunch_task_restore(struct thread_info *, void *); +extern void crunch_task_release(struct thread_info *); + extern void iwmmxt_task_disable(struct thread_info *); extern void iwmmxt_task_copy(struct thread_info *, void *); extern void iwmmxt_task_restore(struct thread_info *, void *); extern void iwmmxt_task_release(struct thread_info *); +extern void iwmmxt_task_switch(struct thread_info *); #endif /* * We use bit 30 of the preempt_count to indicate that kernel - * preemption is occuring. See include/asm-arm/hardirq.h. + * preemption is occurring. See include/asm-arm/hardirq.h. */ #define PREEMPT_ACTIVE 0x40000000 diff --git a/include/asm-arm/tlbflush.h b/include/asm-arm/tlbflush.h index 728992451..d97fc7618 100644 --- a/include/asm-arm/tlbflush.h +++ b/include/asm-arm/tlbflush.h @@ -10,7 +10,6 @@ #ifndef _ASMARM_TLBFLUSH_H #define _ASMARM_TLBFLUSH_H -#include #ifndef CONFIG_MMU diff --git a/include/asm-arm/uaccess.h b/include/asm-arm/uaccess.h index 064f0f5e8..87aba57a6 100644 --- a/include/asm-arm/uaccess.h +++ b/include/asm-arm/uaccess.h @@ -40,16 +40,25 @@ struct exception_table_entry extern int fixup_exception(struct pt_regs *regs); +/* + * These two are intentionally not defined anywhere - if the kernel + * code generates any references to them, that's a bug. + */ +extern int __get_user_bad(void); +extern int __put_user_bad(void); + /* * Note that this is actually 0x1,0000,0000 */ #define KERNEL_DS 0x00000000 -#define USER_DS TASK_SIZE - #define get_ds() (KERNEL_DS) + +#ifdef CONFIG_MMU + +#define USER_DS TASK_SIZE #define get_fs() (current_thread_info()->addr_limit) -static inline void set_fs (mm_segment_t fs) +static inline void set_fs(mm_segment_t fs) { current_thread_info()->addr_limit = fs; modify_domain(DOMAIN_KERNEL, fs ? DOMAIN_CLIENT : DOMAIN_MANAGER); @@ -75,8 +84,6 @@ static inline void set_fs (mm_segment_t fs) : "cc"); \ flag; }) -#define access_ok(type,addr,size) (__range_ok(addr,size) == 0) - /* * Single-value transfer routines. They automatically use the right * size if we just have the right pointer type. Note that the functions @@ -87,20 +94,10 @@ static inline void set_fs (mm_segment_t fs) * fixup code, but there are a few places where it intrudes on the * main code path. When we only write to user space, there is no * problem. - * - * The "__xxx" versions of the user access functions do not verify the - * address space - it must have been done previously with a separate - * "access_ok()" call. - * - * The "xxx_error" versions set the third argument to EFAULT if an - * error occurs, and leave it unchanged on success. Note that these - * versions are void (ie, don't return a value as such). */ - extern int __get_user_1(void *); extern int __get_user_2(void *); extern int __get_user_4(void *); -extern int __get_user_bad(void); #define __get_user_x(__r2,__p,__e,__s,__i...) \ __asm__ __volatile__ ( \ @@ -131,6 +128,74 @@ extern int __get_user_bad(void); __e; \ }) +extern int __put_user_1(void *, unsigned int); +extern int __put_user_2(void *, unsigned int); +extern int __put_user_4(void *, unsigned int); +extern int __put_user_8(void *, unsigned long long); + +#define __put_user_x(__r2,__p,__e,__s) \ + __asm__ __volatile__ ( \ + __asmeq("%0", "r0") __asmeq("%2", "r2") \ + "bl __put_user_" #__s \ + : "=&r" (__e) \ + : "0" (__p), "r" (__r2) \ + : "ip", "lr", "cc") + +#define put_user(x,p) \ + ({ \ + const register typeof(*(p)) __r2 asm("r2") = (x); \ + const register typeof(*(p)) __user *__p asm("r0") = (p);\ + register int __e asm("r0"); \ + switch (sizeof(*(__p))) { \ + case 1: \ + __put_user_x(__r2, __p, __e, 1); \ + break; \ + case 2: \ + __put_user_x(__r2, __p, __e, 2); \ + break; \ + case 4: \ + __put_user_x(__r2, __p, __e, 4); \ + break; \ + case 8: \ + __put_user_x(__r2, __p, __e, 8); \ + break; \ + default: __e = __put_user_bad(); break; \ + } \ + __e; \ + }) + +#else /* CONFIG_MMU */ + +/* + * uClinux has only one addr space, so has simplified address limits. + */ +#define USER_DS KERNEL_DS + +#define segment_eq(a,b) (1) +#define __addr_ok(addr) (1) +#define __range_ok(addr,size) (0) +#define get_fs() (KERNEL_DS) + +static inline void set_fs(mm_segment_t fs) +{ +} + +#define get_user(x,p) __get_user(x,p) +#define put_user(x,p) __put_user(x,p) + +#endif /* CONFIG_MMU */ + +#define access_ok(type,addr,size) (__range_ok(addr,size) == 0) + +/* + * The "__xxx" versions of the user access functions do not verify the + * address space - it must have been done previously with a separate + * "access_ok()" call. + * + * The "xxx_error" versions set the third argument to EFAULT if an + * error occurs, and leave it unchanged on success. Note that these + * versions are void (ie, don't return a value as such). + */ #define __get_user(x,ptr) \ ({ \ long __gu_err = 0; \ @@ -212,43 +277,6 @@ do { \ : "r" (addr), "i" (-EFAULT) \ : "cc") -extern int __put_user_1(void *, unsigned int); -extern int __put_user_2(void *, unsigned int); -extern int __put_user_4(void *, unsigned int); -extern int __put_user_8(void *, unsigned long long); -extern int __put_user_bad(void); - -#define __put_user_x(__r2,__p,__e,__s) \ - __asm__ __volatile__ ( \ - __asmeq("%0", "r0") __asmeq("%2", "r2") \ - "bl __put_user_" #__s \ - : "=&r" (__e) \ - : "0" (__p), "r" (__r2) \ - : "ip", "lr", "cc") - -#define put_user(x,p) \ - ({ \ - const register typeof(*(p)) __r2 asm("r2") = (x); \ - const register typeof(*(p)) __user *__p asm("r0") = (p);\ - register int __e asm("r0"); \ - switch (sizeof(*(__p))) { \ - case 1: \ - __put_user_x(__r2, __p, __e, 1); \ - break; \ - case 2: \ - __put_user_x(__r2, __p, __e, 2); \ - break; \ - case 4: \ - __put_user_x(__r2, __p, __e, 4); \ - break; \ - case 8: \ - __put_user_x(__r2, __p, __e, 8); \ - break; \ - default: __e = __put_user_bad(); break; \ - } \ - __e; \ - }) - #define __put_user(x,ptr) \ ({ \ long __pu_err = 0; \ @@ -353,66 +381,54 @@ do { \ : "r" (x), "i" (-EFAULT) \ : "cc") -extern unsigned long __arch_copy_from_user(void *to, const void __user *from, unsigned long n); -extern unsigned long __arch_copy_to_user(void __user *to, const void *from, unsigned long n); -extern unsigned long __arch_clear_user(void __user *addr, unsigned long n); -extern unsigned long __arch_strncpy_from_user(char *to, const char __user *from, unsigned long count); -extern unsigned long __arch_strnlen_user(const char __user *s, long n); + +#ifdef CONFIG_MMU +extern unsigned long __copy_from_user(void *to, const void __user *from, unsigned long n); +extern unsigned long __copy_to_user(void __user *to, const void *from, unsigned long n); +extern unsigned long __clear_user(void __user *addr, unsigned long n); +#else +#define __copy_from_user(to,from,n) (memcpy(to, (void __force *)from, n), 0) +#define __copy_to_user(to,from,n) (memcpy((void __force *)to, from, n), 0) +#define __clear_user(addr,n) (memset((void __force *)addr, 0, n), 0) +#endif + +extern unsigned long __strncpy_from_user(char *to, const char __user *from, unsigned long count); +extern unsigned long __strnlen_user(const char __user *s, long n); static inline unsigned long copy_from_user(void *to, const void __user *from, unsigned long n) { if (access_ok(VERIFY_READ, from, n)) - n = __arch_copy_from_user(to, from, n); + n = __copy_from_user(to, from, n); else /* security hole - plug it */ memzero(to, n); return n; } -static inline unsigned long __copy_from_user(void *to, const void __user *from, unsigned long n) -{ - return __arch_copy_from_user(to, from, n); -} - static inline unsigned long copy_to_user(void __user *to, const void *from, unsigned long n) { if (access_ok(VERIFY_WRITE, to, n)) - n = __arch_copy_to_user(to, from, n); + n = __copy_to_user(to, from, n); return n; } -static inline unsigned long __copy_to_user(void __user *to, const void *from, unsigned long n) -{ - return __arch_copy_to_user(to, from, n); -} - #define __copy_to_user_inatomic __copy_to_user #define __copy_from_user_inatomic __copy_from_user -static inline unsigned long clear_user (void __user *to, unsigned long n) +static inline unsigned long clear_user(void __user *to, unsigned long n) { if (access_ok(VERIFY_WRITE, to, n)) - n = __arch_clear_user(to, n); + n = __clear_user(to, n); return n; } -static inline unsigned long __clear_user (void __user *to, unsigned long n) -{ - return __arch_clear_user(to, n); -} - -static inline long strncpy_from_user (char *dst, const char __user *src, long count) +static inline long strncpy_from_user(char *dst, const char __user *src, long count) { long res = -EFAULT; if (access_ok(VERIFY_READ, src, 1)) - res = __arch_strncpy_from_user(dst, src, count); + res = __strncpy_from_user(dst, src, count); return res; } -static inline long __strncpy_from_user (char *dst, const char __user *src, long count) -{ - return __arch_strncpy_from_user(dst, src, count); -} - #define strlen_user(s) strnlen_user(s, ~0UL >> 1) static inline long strnlen_user(const char __user *s, long n) @@ -420,7 +436,7 @@ static inline long strnlen_user(const char __user *s, long n) unsigned long res = 0; if (__addr_ok(s)) - res = __arch_strnlen_user(s, n); + res = __strnlen_user(s, n); return res; } diff --git a/include/asm-arm/ucontext.h b/include/asm-arm/ucontext.h index f85313013..bf65e9f45 100644 --- a/include/asm-arm/ucontext.h +++ b/include/asm-arm/ucontext.h @@ -1,12 +1,103 @@ #ifndef _ASMARM_UCONTEXT_H #define _ASMARM_UCONTEXT_H +#include + +/* + * struct sigcontext only has room for the basic registers, but struct + * ucontext now has room for all registers which need to be saved and + * restored. Coprocessor registers are stored in uc_regspace. Each + * coprocessor's saved state should start with a documented 32-bit magic + * number, followed by a 32-bit word giving the coproccesor's saved size. + * uc_regspace may be expanded if necessary, although this takes some + * coordination with glibc. + */ + struct ucontext { unsigned long uc_flags; struct ucontext *uc_link; stack_t uc_stack; struct sigcontext uc_mcontext; - sigset_t uc_sigmask; /* mask last for extensibility */ + sigset_t uc_sigmask; + /* Allow for uc_sigmask growth. Glibc uses a 1024-bit sigset_t. */ + int __unused[32 - (sizeof (sigset_t) / sizeof (int))]; + /* Last for extensibility. Eight byte aligned because some + coprocessors require eight byte alignment. */ + unsigned long uc_regspace[128] __attribute__((__aligned__(8))); }; +#ifdef __KERNEL__ + +/* + * Coprocessor save state. The magic values and specific + * coprocessor's layouts are part of the userspace ABI. Each one of + * these should be a multiple of eight bytes and aligned to eight + * bytes, to prevent unpredictable padding in the signal frame. + */ + +#ifdef CONFIG_CRUNCH +#define CRUNCH_MAGIC 0x5065cf03 +#define CRUNCH_STORAGE_SIZE (CRUNCH_SIZE + 8) + +struct crunch_sigframe { + unsigned long magic; + unsigned long size; + struct crunch_state storage; +} __attribute__((__aligned__(8))); +#endif + +#ifdef CONFIG_IWMMXT +/* iwmmxt_area is 0x98 bytes long, preceeded by 8 bytes of signature */ +#define IWMMXT_MAGIC 0x12ef842a +#define IWMMXT_STORAGE_SIZE (IWMMXT_SIZE + 8) + +struct iwmmxt_sigframe { + unsigned long magic; + unsigned long size; + struct iwmmxt_struct storage; +} __attribute__((__aligned__(8))); +#endif /* CONFIG_IWMMXT */ + +#ifdef CONFIG_VFP +#if __LINUX_ARM_ARCH__ < 6 +/* For ARM pre-v6, we use fstmiax and fldmiax. This adds one extra + * word after the registers, and a word of padding at the end for + * alignment. */ +#define VFP_MAGIC 0x56465001 +#define VFP_STORAGE_SIZE 152 +#else +#define VFP_MAGIC 0x56465002 +#define VFP_STORAGE_SIZE 144 +#endif + +struct vfp_sigframe +{ + unsigned long magic; + unsigned long size; + union vfp_state storage; +}; +#endif /* CONFIG_VFP */ + +/* + * Auxiliary signal frame. This saves stuff like FP state. + * The layout of this structure is not part of the user ABI, + * because the config options aren't. uc_regspace is really + * one of these. + */ +struct aux_sigframe { +#ifdef CONFIG_CRUNCH + struct crunch_sigframe crunch; +#endif +#ifdef CONFIG_IWMMXT + struct iwmmxt_sigframe iwmmxt; +#endif +#if 0 && defined CONFIG_VFP /* Not yet saved. */ + struct vfp_sigframe vfp; +#endif + /* Something that isn't a valid magic number for any coprocessor. */ + unsigned long end_magic; +} __attribute__((__aligned__(8))); + +#endif + #endif /* !_ASMARM_UCONTEXT_H */ diff --git a/include/asm-arm/unistd.h b/include/asm-arm/unistd.h index cbf39a56d..1e891f860 100644 --- a/include/asm-arm/unistd.h +++ b/include/asm-arm/unistd.h @@ -13,8 +13,6 @@ #ifndef __ASM_ARM_UNISTD_H #define __ASM_ARM_UNISTD_H -#include - #define __NR_OABI_SYSCALL_BASE 0x900000 #if defined(__thumb__) || defined(__ARM_EABI__) @@ -378,6 +376,9 @@ #undef __NR_ipc #endif +#ifdef __KERNEL__ +#include + #define __sys2(x) #x #define __sys1(x) __sys2(x) @@ -526,7 +527,6 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6 __syscall_return(type,__res); \ } -#ifdef __KERNEL__ #define __ARCH_WANT_IPC_PARSE_VERSION #define __ARCH_WANT_STAT64 #define __ARCH_WANT_SYS_GETHOSTNAME @@ -547,7 +547,6 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6 #define __ARCH_WANT_OLD_READDIR #define __ARCH_WANT_SYS_SOCKETCALL #endif -#endif #ifdef __KERNEL_SYSCALLS__ @@ -571,7 +570,7 @@ asmlinkage long sys_rt_sigaction(int sig, struct sigaction __user *oact, size_t sigsetsize); -#endif +#endif /* __KERNEL_SYSCALLS__ */ /* * "Conditional" syscalls @@ -581,4 +580,5 @@ asmlinkage long sys_rt_sigaction(int sig, */ #define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") +#endif /* __KERNEL__ */ #endif /* __ASM_ARM_UNISTD_H */ diff --git a/include/asm-arm/vga.h b/include/asm-arm/vga.h index 926e5ee12..1e0b913c3 100644 --- a/include/asm-arm/vga.h +++ b/include/asm-arm/vga.h @@ -4,7 +4,7 @@ #include #include -#define VGA_MAP_MEM(x) (PCIMEM_BASE + (x)) +#define VGA_MAP_MEM(x,s) (PCIMEM_BASE + (x)) #define vga_readb(x) (*((volatile unsigned char *)x)) #define vga_writeb(x,y) (*((volatile unsigned char *)y) = (x)) diff --git a/include/asm-arm26/atomic.h b/include/asm-arm26/atomic.h index 1552c8653..97e944fe1 100644 --- a/include/asm-arm26/atomic.h +++ b/include/asm-arm26/atomic.h @@ -20,7 +20,6 @@ #ifndef __ASM_ARM_ATOMIC_H #define __ASM_ARM_ATOMIC_H -#include #ifdef CONFIG_SMP #error SMP is NOT supported diff --git a/include/asm-arm26/bug.h b/include/asm-arm26/bug.h index 7177c7399..8545d58b0 100644 --- a/include/asm-arm26/bug.h +++ b/include/asm-arm26/bug.h @@ -1,7 +1,6 @@ #ifndef _ASMARM_BUG_H #define _ASMARM_BUG_H -#include #ifdef CONFIG_BUG #ifdef CONFIG_DEBUG_BUGVERBOSE diff --git a/include/asm-arm26/dma.h b/include/asm-arm26/dma.h index 995e223e4..4326ba85e 100644 --- a/include/asm-arm26/dma.h +++ b/include/asm-arm26/dma.h @@ -3,7 +3,6 @@ typedef unsigned int dmach_t; -#include #include #include #include diff --git a/include/asm-arm26/floppy.h b/include/asm-arm26/floppy.h index 9e090ad7e..efb732165 100644 --- a/include/asm-arm26/floppy.h +++ b/include/asm-arm26/floppy.h @@ -22,7 +22,7 @@ #define fd_inb(port) inb((port)) #define fd_request_irq() request_irq(IRQ_FLOPPYDISK,floppy_interrupt,\ - SA_INTERRUPT|SA_SAMPLE_RANDOM,"floppy",NULL) + IRQF_DISABLED,"floppy",NULL) #define fd_free_irq() free_irq(IRQ_FLOPPYDISK,NULL) #define fd_disable_irq() disable_irq(IRQ_FLOPPYDISK) #define fd_enable_irq() enable_irq(IRQ_FLOPPYDISK) diff --git a/include/asm-arm26/hardirq.h b/include/asm-arm26/hardirq.h index 87c19d2bb..e717742ff 100644 --- a/include/asm-arm26/hardirq.h +++ b/include/asm-arm26/hardirq.h @@ -1,7 +1,6 @@ #ifndef __ASM_HARDIRQ_H #define __ASM_HARDIRQ_H -#include #include #include #include diff --git a/include/asm-arm26/hardware.h b/include/asm-arm26/hardware.h index 82fc55e2a..801df0bde 100644 --- a/include/asm-arm26/hardware.h +++ b/include/asm-arm26/hardware.h @@ -16,7 +16,6 @@ #ifndef __ASM_HARDWARE_H #define __ASM_HARDWARE_H -#include /* diff --git a/include/asm-arm26/io.h b/include/asm-arm26/io.h index 02f94d88a..2aa033bd0 100644 --- a/include/asm-arm26/io.h +++ b/include/asm-arm26/io.h @@ -22,7 +22,6 @@ #ifdef __KERNEL__ -#include #include #include #include diff --git a/include/asm-arm26/irq.h b/include/asm-arm26/irq.h index 06bd5a543..9aaac87ef 100644 --- a/include/asm-arm26/irq.h +++ b/include/asm-arm26/irq.h @@ -44,9 +44,5 @@ extern void enable_irq(unsigned int); int set_irq_type(unsigned int irq, unsigned int type); -int setup_irq(unsigned int, struct irqaction *); -struct pt_regs; -int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *); - #endif diff --git a/include/asm-arm26/leds.h b/include/asm-arm26/leds.h index 88ce4124f..12290ea55 100644 --- a/include/asm-arm26/leds.h +++ b/include/asm-arm26/leds.h @@ -13,7 +13,6 @@ #ifndef ASM_ARM_LEDS_H #define ASM_ARM_LEDS_H -#include typedef enum { led_idle_start, diff --git a/include/asm-arm26/mach-types.h b/include/asm-arm26/mach-types.h index b34045b78..0aeaedcba 100644 --- a/include/asm-arm26/mach-types.h +++ b/include/asm-arm26/mach-types.h @@ -6,7 +6,6 @@ #ifndef __ASM_ARM_MACH_TYPE_H #define __ASM_ARM_MACH_TYPE_H -#include #ifndef __ASSEMBLY__ extern unsigned int __machine_arch_type; diff --git a/include/asm-arm26/page.h b/include/asm-arm26/page.h index b0d9605c8..41dacdda7 100644 --- a/include/asm-arm26/page.h +++ b/include/asm-arm26/page.h @@ -1,7 +1,6 @@ #ifndef _ASMARM_PAGE_H #define _ASMARM_PAGE_H -#include #ifdef __KERNEL__ #ifndef __ASSEMBLY__ diff --git a/include/asm-arm26/pgtable.h b/include/asm-arm26/pgtable.h index a59025027..19ac9101a 100644 --- a/include/asm-arm26/pgtable.h +++ b/include/asm-arm26/pgtable.h @@ -13,7 +13,6 @@ #include -#include #include /* diff --git a/include/asm-arm26/serial.h b/include/asm-arm26/serial.h index 5fc747d1b..dd86a716c 100644 --- a/include/asm-arm26/serial.h +++ b/include/asm-arm26/serial.h @@ -14,7 +14,6 @@ #ifndef __ASM_SERIAL_H #define __ASM_SERIAL_H -#include /* * This assumes you have a 1.8432 MHz clock for your UART. diff --git a/include/asm-arm26/signal.h b/include/asm-arm26/signal.h index 37ad25355..967ba4947 100644 --- a/include/asm-arm26/signal.h +++ b/include/asm-arm26/signal.h @@ -82,7 +82,6 @@ typedef unsigned long sigset_t; * is running in 26-bit. * SA_ONSTACK allows alternate signal stacks (see sigaltstack(2)). * SA_RESTART flag to get restarting signals (which were the default long ago) - * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_NODEFER prevents the current signal from being masked in the handler. * SA_RESETHAND clears the handler when the signal is delivered. * @@ -101,7 +100,6 @@ typedef unsigned long sigset_t; #define SA_NOMASK SA_NODEFER #define SA_ONESHOT SA_RESETHAND -#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ /* diff --git a/include/asm-arm26/smp.h b/include/asm-arm26/smp.h index 5ca771631..38349ec8b 100644 --- a/include/asm-arm26/smp.h +++ b/include/asm-arm26/smp.h @@ -1,7 +1,6 @@ #ifndef __ASM_SMP_H #define __ASM_SMP_H -#include #ifdef CONFIG_SMP #error SMP not supported diff --git a/include/asm-arm26/socket.h b/include/asm-arm26/socket.h index 3c51da643..19f7df702 100644 --- a/include/asm-arm26/socket.h +++ b/include/asm-arm26/socket.h @@ -48,5 +48,6 @@ #define SO_ACCEPTCONN 30 #define SO_PEERSEC 31 +#define SO_PASSSEC 34 #endif /* _ASM_SOCKET_H */ diff --git a/include/asm-arm26/sysirq.h b/include/asm-arm26/sysirq.h index cad250c7b..81dca90d9 100644 --- a/include/asm-arm26/sysirq.h +++ b/include/asm-arm26/sysirq.h @@ -11,7 +11,6 @@ * 04-04-1998 PJB Merged arc and a5k versions */ -#include #if defined(CONFIG_ARCH_A5K) #define IRQ_PRINTER 0 diff --git a/include/asm-arm26/system.h b/include/asm-arm26/system.h index 702884926..00ae32aa1 100644 --- a/include/asm-arm26/system.h +++ b/include/asm-arm26/system.h @@ -3,7 +3,6 @@ #ifdef __KERNEL__ -#include /* * This is used to ensure the compiler did actually allocate the register we @@ -91,7 +90,6 @@ extern unsigned int user_debug; #define read_barrier_depends() do { } while(0) #define set_mb(var, value) do { var = value; mb(); } while (0) -#define set_wmb(var, value) do { var = value; wmb(); } while (0) /* * We assume knowledge of how diff --git a/include/asm-arm26/unistd.h b/include/asm-arm26/unistd.h index d296fb507..3138cef69 100644 --- a/include/asm-arm26/unistd.h +++ b/include/asm-arm26/unistd.h @@ -14,8 +14,6 @@ #ifndef __ASM_ARM_UNISTD_H #define __ASM_ARM_UNISTD_H -#include - #define __NR_SYSCALL_BASE 0x900000 /* @@ -314,6 +312,9 @@ #define __ARM_NR_cacheflush (__ARM_NR_BASE+2) #define __ARM_NR_usr26 (__ARM_NR_BASE+3) +#ifdef __KERNEL__ +#include + #define __sys2(x) #x #define __sys1(x) __sys2(x) @@ -445,7 +446,6 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6 __syscall_return(type,__res); \ } -#ifdef __KERNEL__ #define __ARCH_WANT_IPC_PARSE_VERSION #define __ARCH_WANT_OLD_READDIR #define __ARCH_WANT_STAT64 @@ -464,7 +464,6 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6 #define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPROCMASK #define __ARCH_WANT_SYS_RT_SIGACTION -#endif #ifdef __KERNEL_SYSCALLS__ @@ -488,7 +487,7 @@ asmlinkage long sys_rt_sigaction(int sig, struct sigaction __user *oact, size_t sigsetsize); -#endif +#endif /* __KERNEL_SYSCALLS__ */ /* * "Conditional" syscalls @@ -498,4 +497,5 @@ asmlinkage long sys_rt_sigaction(int sig, */ #define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") +#endif /* __KERNEL__ */ #endif /* __ASM_ARM_UNISTD_H */ diff --git a/include/asm-cris/arch-v10/io.h b/include/asm-cris/arch-v10/io.h index dd39198ec..11ef5b53d 100644 --- a/include/asm-cris/arch-v10/io.h +++ b/include/asm-cris/arch-v10/io.h @@ -2,7 +2,6 @@ #define _ASM_ARCH_CRIS_IO_H #include -#include /* Etrax shadow registers - which live in arch/cris/kernel/shadows.c */ diff --git a/include/asm-cris/arch-v10/irq.h b/include/asm-cris/arch-v10/irq.h index 4fa8945b0..b1128a998 100644 --- a/include/asm-cris/arch-v10/irq.h +++ b/include/asm-cris/arch-v10/irq.h @@ -141,7 +141,7 @@ __asm__ ( \ * it here, we would not get the multiple_irq at all. * * The non-blocking here is based on the knowledge that the timer interrupt is - * registred as a fast interrupt (SA_INTERRUPT) so that we _know_ there will not + * registred as a fast interrupt (IRQF_DISABLED) so that we _know_ there will not * be an sti() before the timer irq handler is run to acknowledge the interrupt. */ diff --git a/include/asm-cris/arch-v10/page.h b/include/asm-cris/arch-v10/page.h index 407e6e68f..7d8307aed 100644 --- a/include/asm-cris/arch-v10/page.h +++ b/include/asm-cris/arch-v10/page.h @@ -1,7 +1,6 @@ #ifndef _CRIS_ARCH_PAGE_H #define _CRIS_ARCH_PAGE_H -#include #ifdef __KERNEL__ diff --git a/include/asm-cris/arch-v10/system.h b/include/asm-cris/arch-v10/system.h index 1ac7b639b..4a9cd36c9 100644 --- a/include/asm-cris/arch-v10/system.h +++ b/include/asm-cris/arch-v10/system.h @@ -1,7 +1,6 @@ #ifndef __ASM_CRIS_ARCH_SYSTEM_H #define __ASM_CRIS_ARCH_SYSTEM_H -#include /* read the CPU version register */ diff --git a/include/asm-cris/arch-v32/arbiter.h b/include/asm-cris/arch-v32/arbiter.h index dba3c285c..081a911d7 100644 --- a/include/asm-cris/arch-v32/arbiter.h +++ b/include/asm-cris/arch-v32/arbiter.h @@ -20,8 +20,8 @@ enum arbiter_all_accesses = 0xff }; -int crisv32_arbiter_allocate_bandwith(int client, int region, - unsigned long bandwidth); +int crisv32_arbiter_allocate_bandwidth(int client, int region, + unsigned long bandwidth); int crisv32_arbiter_watch(unsigned long start, unsigned long size, unsigned long clients, unsigned long accesses, watch_callback* cb); diff --git a/include/asm-cris/arch-v32/io.h b/include/asm-cris/arch-v32/io.h index 043c9ce52..5efe4d949 100644 --- a/include/asm-cris/arch-v32/io.h +++ b/include/asm-cris/arch-v32/io.h @@ -4,7 +4,6 @@ #include #include #include -#include enum crisv32_io_dir { diff --git a/include/asm-cris/arch-v32/irq.h b/include/asm-cris/arch-v32/irq.h index d35aa8174..bac94ee6b 100644 --- a/include/asm-cris/arch-v32/irq.h +++ b/include/asm-cris/arch-v32/irq.h @@ -1,7 +1,6 @@ #ifndef _ASM_ARCH_IRQ_H #define _ASM_ARCH_IRQ_H -#include #include "hwregs/intr_vect.h" /* Number of non-cpu interrupts. */ @@ -99,7 +98,7 @@ __asm__ ( \ * if we had BLOCK'edit here, we would not get the multiple_irq at all. * * The non-blocking here is based on the knowledge that the timer interrupt is - * registred as a fast interrupt (SA_INTERRUPT) so that we _know_ there will not + * registred as a fast interrupt (IRQF_DISABLED) so that we _know_ there will not * be an sti() before the timer irq handler is run to acknowledge the interrupt. */ #define BUILD_TIMER_IRQ(nr, mask) \ diff --git a/include/asm-cris/arch-v32/page.h b/include/asm-cris/arch-v32/page.h index 77827bc17..fa454fe12 100644 --- a/include/asm-cris/arch-v32/page.h +++ b/include/asm-cris/arch-v32/page.h @@ -1,7 +1,6 @@ #ifndef _ASM_CRIS_ARCH_PAGE_H #define _ASM_CRIS_ARCH_PAGE_H -#include #ifdef __KERNEL__ diff --git a/include/asm-cris/arch-v32/processor.h b/include/asm-cris/arch-v32/processor.h index 32bf2e538..5553b0cd0 100644 --- a/include/asm-cris/arch-v32/processor.h +++ b/include/asm-cris/arch-v32/processor.h @@ -1,7 +1,6 @@ #ifndef _ASM_CRIS_ARCH_PROCESSOR_H #define _ASM_CRIS_ARCH_PROCESSOR_H -#include /* Return current instruction pointer. */ #define current_text_addr() \ diff --git a/include/asm-cris/arch-v32/system.h b/include/asm-cris/arch-v32/system.h index a3d75d581..d20e2d6d6 100644 --- a/include/asm-cris/arch-v32/system.h +++ b/include/asm-cris/arch-v32/system.h @@ -1,7 +1,6 @@ #ifndef _ASM_CRIS_ARCH_SYSTEM_H #define _ASM_CRIS_ARCH_SYSTEM_H -#include /* Read the CPU version register. */ static inline unsigned long rdvr(void) diff --git a/include/asm-cris/byteorder.h b/include/asm-cris/byteorder.h index a1a222ada..0cd9db1cc 100644 --- a/include/asm-cris/byteorder.h +++ b/include/asm-cris/byteorder.h @@ -3,14 +3,15 @@ #ifdef __GNUC__ +#ifdef __KERNEL__ #include /* defines are necessary because the other files detect the presence * of a defined __arch_swab32, not an inline */ - #define __arch__swab32(x) ___arch__swab32(x) #define __arch__swab16(x) ___arch__swab16(x) +#endif /* __KERNEL__ */ #if !defined(__STRICT_ANSI__) || defined(__KERNEL__) # define __BYTEORDER_HAS_U64__ diff --git a/include/asm-cris/elf.h b/include/asm-cris/elf.h index 87a60bd8e..96a40c1de 100644 --- a/include/asm-cris/elf.h +++ b/include/asm-cris/elf.h @@ -5,7 +5,6 @@ * ELF register definitions.. */ -#include #include #define R_CRIS_NONE 0 @@ -46,6 +45,9 @@ typedef unsigned long elf_fpregset_t; #define ELF_DATA ELFDATA2LSB #define ELF_ARCH EM_CRIS +#ifdef __KERNEL__ +#include + /* The master for these definitions is {binutils}/include/elf/cris.h: */ /* User symbols in this file have a leading underscore. */ #define EF_CRIS_UNDERSCORE 0x00000001 @@ -87,8 +89,8 @@ typedef unsigned long elf_fpregset_t; #define ELF_PLATFORM (NULL) -#ifdef __KERNEL__ #define SET_PERSONALITY(ex, ibcs2) set_personality((ibcs2)?PER_SVR4:PER_LINUX) -#endif + +#endif /* __KERNEL__ */ #endif diff --git a/include/asm-cris/eshlibld.h b/include/asm-cris/eshlibld.h index 2b577cde1..10ce36cf7 100644 --- a/include/asm-cris/eshlibld.h +++ b/include/asm-cris/eshlibld.h @@ -32,7 +32,6 @@ /* We have dependencies all over the place for the host system for xsim being a linux system, so let's not pretend anything else with #ifdef:s here until fixed. */ -#include #include /* Maybe do sanity checking if file input. */ diff --git a/include/asm-cris/etraxgpio.h b/include/asm-cris/etraxgpio.h index 80ee10f70..5d0028dba 100644 --- a/include/asm-cris/etraxgpio.h +++ b/include/asm-cris/etraxgpio.h @@ -25,7 +25,6 @@ #ifndef _ASM_ETRAXGPIO_H #define _ASM_ETRAXGPIO_H -#include /* etraxgpio _IOC_TYPE, bits 8 to 15 in ioctl cmd */ #ifdef CONFIG_ETRAX_ARCH_V10 #define ETRAXGPIO_IOCTYPE 43 diff --git a/include/asm-cris/fasttimer.h b/include/asm-cris/fasttimer.h index 69522028b..a3a77132c 100644 --- a/include/asm-cris/fasttimer.h +++ b/include/asm-cris/fasttimer.h @@ -5,7 +5,6 @@ * This may be useful in other OS than Linux so use 2 space indentation... * Copyright (C) 2000, 2002 Axis Communications AB */ -#include #include /* struct timeval */ #include diff --git a/include/asm-cris/hw_irq.h b/include/asm-cris/hw_irq.h index 341536a23..298066020 100644 --- a/include/asm-cris/hw_irq.h +++ b/include/asm-cris/hw_irq.h @@ -1,7 +1,5 @@ #ifndef _ASM_HW_IRQ_H #define _ASM_HW_IRQ_H -static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) {} - #endif diff --git a/include/asm-cris/irq.h b/include/asm-cris/irq.h index 4b3387922..998cce9f3 100644 --- a/include/asm-cris/irq.h +++ b/include/asm-cris/irq.h @@ -1,11 +1,6 @@ #ifndef _ASM_IRQ_H #define _ASM_IRQ_H -/* - * IRQ line status macro IRQ_PER_CPU is used - */ -#define ARCH_HAS_IRQ_PER_CPU - #include static inline int irq_canonicalize(int irq) diff --git a/include/asm-cris/page.h b/include/asm-cris/page.h index 4053ad41a..d50197df9 100644 --- a/include/asm-cris/page.h +++ b/include/asm-cris/page.h @@ -1,7 +1,8 @@ #ifndef _CRIS_PAGE_H #define _CRIS_PAGE_H -#include +#ifdef __KERNEL__ + #include /* PAGE_SHIFT determines the page size */ @@ -13,8 +14,6 @@ #endif #define PAGE_MASK (~(PAGE_SIZE-1)) -#ifdef __KERNEL__ - #define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) #define copy_page(to,from) memcpy((void *)(to), (void *)(from), PAGE_SIZE) @@ -74,12 +73,12 @@ typedef struct { unsigned long pgprot; } pgprot_t; #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \ VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) +#include +#include + #define devmem_is_allowed(x) 1 #endif /* __KERNEL__ */ -#include -#include - #endif /* _CRIS_PAGE_H */ diff --git a/include/asm-cris/pci.h b/include/asm-cris/pci.h index 2064bc1de..b2ac8a331 100644 --- a/include/asm-cris/pci.h +++ b/include/asm-cris/pci.h @@ -1,7 +1,6 @@ #ifndef __ASM_CRIS_PCI_H #define __ASM_CRIS_PCI_H -#include #ifdef __KERNEL__ #include /* for struct page */ diff --git a/include/asm-cris/pgtable.h b/include/asm-cris/pgtable.h index 70a832514..5d76c1c0d 100644 --- a/include/asm-cris/pgtable.h +++ b/include/asm-cris/pgtable.h @@ -9,7 +9,6 @@ #include #ifndef __ASSEMBLY__ -#include #include #include #endif diff --git a/include/asm-cris/posix_types.h b/include/asm-cris/posix_types.h index 6d26fee4a..7b9ed22ab 100644 --- a/include/asm-cris/posix_types.h +++ b/include/asm-cris/posix_types.h @@ -6,8 +6,6 @@ #ifndef __ARCH_CRIS_POSIX_TYPES_H #define __ARCH_CRIS_POSIX_TYPES_H -#include - /* * This file is generally used by user-level software, so you need to * be a little careful about namespace pollution etc. Also, we cannot @@ -53,9 +51,8 @@ typedef struct { #endif /* !defined(__KERNEL__) && !defined(__USE_ALL) */ } __kernel_fsid_t; -/* should this ifdef be here ? */ - -#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) +#ifdef __KERNEL__ +#include #undef __FD_SET #define __FD_SET(fd,fdsetp) set_bit(fd, (void *)(fdsetp)) @@ -69,6 +66,6 @@ typedef struct { #undef __FD_ZERO #define __FD_ZERO(fdsetp) memset((void *)(fdsetp), 0, __FDSET_LONGS << 2) -#endif /* defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) */ +#endif /* __KERNEL__ */ #endif /* __ARCH_CRIS_POSIX_TYPES_H */ diff --git a/include/asm-cris/processor.h b/include/asm-cris/processor.h index 961e2bcea..568da1dec 100644 --- a/include/asm-cris/processor.h +++ b/include/asm-cris/processor.h @@ -10,7 +10,6 @@ #ifndef __ASM_CRIS_PROCESSOR_H #define __ASM_CRIS_PROCESSOR_H -#include #include #include #include diff --git a/include/asm-cris/rtc.h b/include/asm-cris/rtc.h index 97c130398..cb4bf9217 100644 --- a/include/asm-cris/rtc.h +++ b/include/asm-cris/rtc.h @@ -4,7 +4,6 @@ #define __RTC_H__ -#include #ifdef CONFIG_ETRAX_DS1302 /* Dallas DS1302 clock/calendar register numbers. */ diff --git a/include/asm-cris/signal.h b/include/asm-cris/signal.h index dfe039593..349ae682b 100644 --- a/include/asm-cris/signal.h +++ b/include/asm-cris/signal.h @@ -74,7 +74,6 @@ typedef unsigned long sigset_t; * SA_FLAGS values: * * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. * SA_RESETHAND clears the handler when the signal is delivered. @@ -95,7 +94,6 @@ typedef unsigned long sigset_t; #define SA_NOMASK SA_NODEFER #define SA_ONESHOT SA_RESETHAND -#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ #define SA_RESTORER 0x04000000 diff --git a/include/asm-cris/socket.h b/include/asm-cris/socket.h index 8b1da3e58..01cfdf1d6 100644 --- a/include/asm-cris/socket.h +++ b/include/asm-cris/socket.h @@ -50,6 +50,7 @@ #define SO_ACCEPTCONN 30 #define SO_PEERSEC 31 +#define SO_PASSSEC 34 #endif /* _ASM_SOCKET_H */ diff --git a/include/asm-cris/system.h b/include/asm-cris/system.h index b1c593b6d..b869f6161 100644 --- a/include/asm-cris/system.h +++ b/include/asm-cris/system.h @@ -17,7 +17,6 @@ extern struct task_struct *resume(struct task_struct *prev, struct task_struct * #define wmb() mb() #define read_barrier_depends() do { } while(0) #define set_mb(var, value) do { var = value; mb(); } while (0) -#define set_wmb(var, value) do { var = value; wmb(); } while (0) #ifdef CONFIG_SMP #define smp_mb() mb() diff --git a/include/asm-cris/tlbflush.h b/include/asm-cris/tlbflush.h index c52238005..056961247 100644 --- a/include/asm-cris/tlbflush.h +++ b/include/asm-cris/tlbflush.h @@ -1,7 +1,6 @@ #ifndef _CRIS_TLBFLUSH_H #define _CRIS_TLBFLUSH_H -#include #include #include #include diff --git a/include/asm-cris/unistd.h b/include/asm-cris/unistd.h index bb2dfe480..7372efae0 100644 --- a/include/asm-cris/unistd.h +++ b/include/asm-cris/unistd.h @@ -1,8 +1,6 @@ #ifndef _ASM_CRIS_UNISTD_H_ #define _ASM_CRIS_UNISTD_H_ -#include - /* * This file contains the system call numbers, and stub macros for libc. */ @@ -295,11 +293,12 @@ #define __NR_request_key 287 #define __NR_keyctl 288 -#define NR_syscalls 289 +#ifdef __KERNEL__ +#define NR_syscalls 289 +#include -#ifdef __KERNEL__ #define __ARCH_WANT_IPC_PARSE_VERSION #define __ARCH_WANT_OLD_READDIR #define __ARCH_WANT_OLD_STAT @@ -322,7 +321,6 @@ #define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPROCMASK #define __ARCH_WANT_SYS_RT_SIGACTION -#endif #ifdef __KERNEL_SYSCALLS__ @@ -379,12 +377,10 @@ asmlinkage long sys_rt_sigaction(int sig, * complaints. We don't want to use -fno-builtin, so just use a * different name when in the kernel. */ -#ifdef __KERNEL__ #define _exit kernel_syscall_exit -#endif static inline _syscall1(int,_exit,int,exitcode) static inline _syscall3(pid_t,waitpid,pid_t,pid,int *,wait_stat,int,options) -#endif +#endif /* __KERNEL_SYSCALLS__ */ /* @@ -395,4 +391,5 @@ static inline _syscall3(pid_t,waitpid,pid_t,pid,int *,wait_stat,int,options) */ #define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") +#endif /* __KERNEL__ */ #endif /* _ASM_CRIS_UNISTD_H_ */ diff --git a/include/asm-frv/atomic.h b/include/asm-frv/atomic.h index e75968463..066386ac2 100644 --- a/include/asm-frv/atomic.h +++ b/include/asm-frv/atomic.h @@ -14,7 +14,6 @@ #ifndef _ASM_ATOMIC_H #define _ASM_ATOMIC_H -#include #include #include @@ -218,56 +217,17 @@ extern unsigned long atomic_test_and_XOR_mask(unsigned long mask, volatile unsig __typeof__(*(ptr)) __xg_orig; \ \ switch (sizeof(__xg_orig)) { \ - case 1: \ - asm volatile( \ - "0: \n" \ - " orcc gr0,gr0,gr0,icc3 \n" \ - " ckeq icc3,cc7 \n" \ - " ldub.p %M0,%1 \n" \ - " orcr cc7,cc7,cc3 \n" \ - " cstb.p %2,%M0 ,cc3,#1 \n" \ - " corcc gr29,gr29,gr0 ,cc3,#1 \n" \ - " beq icc3,#0,0b \n" \ - : "+U"(*__xg_ptr), "=&r"(__xg_orig) \ - : "r"(x) \ - : "memory", "cc7", "cc3", "icc3" \ - ); \ - break; \ - \ - case 2: \ - asm volatile( \ - "0: \n" \ - " orcc gr0,gr0,gr0,icc3 \n" \ - " ckeq icc3,cc7 \n" \ - " lduh.p %M0,%1 \n" \ - " orcr cc7,cc7,cc3 \n" \ - " csth.p %2,%M0 ,cc3,#1 \n" \ - " corcc gr29,gr29,gr0 ,cc3,#1 \n" \ - " beq icc3,#0,0b \n" \ - : "+U"(*__xg_ptr), "=&r"(__xg_orig) \ - : "r"(x) \ - : "memory", "cc7", "cc3", "icc3" \ - ); \ - break; \ - \ case 4: \ asm volatile( \ - "0: \n" \ - " orcc gr0,gr0,gr0,icc3 \n" \ - " ckeq icc3,cc7 \n" \ - " ld.p %M0,%1 \n" \ - " orcr cc7,cc7,cc3 \n" \ - " cst.p %2,%M0 ,cc3,#1 \n" \ - " corcc gr29,gr29,gr0 ,cc3,#1 \n" \ - " beq icc3,#0,0b \n" \ - : "+U"(*__xg_ptr), "=&r"(__xg_orig) \ - : "r"(x) \ - : "memory", "cc7", "cc3", "icc3" \ + "swap%I0 %M0,%1" \ + : "+m"(*__xg_ptr), "=r"(__xg_orig) \ + : "1"(x) \ + : "memory" \ ); \ break; \ \ default: \ - __xg_orig = 0; \ + __xg_orig = (__typeof__(__xg_orig))0; \ asm volatile("break"); \ break; \ } \ @@ -277,8 +237,6 @@ extern unsigned long atomic_test_and_XOR_mask(unsigned long mask, volatile unsig #else -extern uint8_t __xchg_8 (uint8_t i, volatile void *v); -extern uint16_t __xchg_16(uint16_t i, volatile void *v); extern uint32_t __xchg_32(uint32_t i, volatile void *v); #define xchg(ptr, x) \ @@ -287,11 +245,9 @@ extern uint32_t __xchg_32(uint32_t i, volatile void *v); __typeof__(*(ptr)) __xg_orig; \ \ switch (sizeof(__xg_orig)) { \ - case 1: __xg_orig = (__typeof__(*(ptr))) __xchg_8 ((uint8_t) x, __xg_ptr); break; \ - case 2: __xg_orig = (__typeof__(*(ptr))) __xchg_16((uint16_t) x, __xg_ptr); break; \ case 4: __xg_orig = (__typeof__(*(ptr))) __xchg_32((uint32_t) x, __xg_ptr); break; \ default: \ - __xg_orig = 0; \ + __xg_orig = (__typeof__(__xg_orig))0; \ asm volatile("break"); \ break; \ } \ @@ -318,46 +274,6 @@ extern uint32_t __xchg_32(uint32_t i, volatile void *v); __typeof__(*(ptr)) __xg_new = (new); \ \ switch (sizeof(__xg_orig)) { \ - case 1: \ - asm volatile( \ - "0: \n" \ - " orcc gr0,gr0,gr0,icc3 \n" \ - " ckeq icc3,cc7 \n" \ - " ldub.p %M0,%1 \n" \ - " orcr cc7,cc7,cc3 \n" \ - " sub%I4 %1,%4,%2 \n" \ - " sllcc %2,#24,gr0,icc0 \n" \ - " bne icc0,#0,1f \n" \ - " cstb.p %3,%M0 ,cc3,#1 \n" \ - " corcc gr29,gr29,gr0 ,cc3,#1 \n" \ - " beq icc3,#0,0b \n" \ - "1: \n" \ - : "+U"(*__xg_ptr), "=&r"(__xg_orig), "=&r"(__xg_tmp) \ - : "r"(__xg_new), "NPr"(__xg_test) \ - : "memory", "cc7", "cc3", "icc3", "icc0" \ - ); \ - break; \ - \ - case 2: \ - asm volatile( \ - "0: \n" \ - " orcc gr0,gr0,gr0,icc3 \n" \ - " ckeq icc3,cc7 \n" \ - " lduh.p %M0,%1 \n" \ - " orcr cc7,cc7,cc3 \n" \ - " sub%I4 %1,%4,%2 \n" \ - " sllcc %2,#16,gr0,icc0 \n" \ - " bne icc0,#0,1f \n" \ - " csth.p %3,%M0 ,cc3,#1 \n" \ - " corcc gr29,gr29,gr0 ,cc3,#1 \n" \ - " beq icc3,#0,0b \n" \ - "1: \n" \ - : "+U"(*__xg_ptr), "=&r"(__xg_orig), "=&r"(__xg_tmp) \ - : "r"(__xg_new), "NPr"(__xg_test) \ - : "memory", "cc7", "cc3", "icc3", "icc0" \ - ); \ - break; \ - \ case 4: \ asm volatile( \ "0: \n" \ @@ -388,8 +304,6 @@ extern uint32_t __xchg_32(uint32_t i, volatile void *v); #else -extern uint8_t __cmpxchg_8 (uint8_t *v, uint8_t test, uint8_t new); -extern uint16_t __cmpxchg_16(uint16_t *v, uint16_t test, uint16_t new); extern uint32_t __cmpxchg_32(uint32_t *v, uint32_t test, uint32_t new); #define cmpxchg(ptr, test, new) \ @@ -400,8 +314,6 @@ extern uint32_t __cmpxchg_32(uint32_t *v, uint32_t test, uint32_t new); __typeof__(*(ptr)) __xg_new = (new); \ \ switch (sizeof(__xg_orig)) { \ - case 1: __xg_orig = __cmpxchg_8 (__xg_ptr, __xg_test, __xg_new); break; \ - case 2: __xg_orig = __cmpxchg_16(__xg_ptr, __xg_test, __xg_new); break; \ case 4: __xg_orig = __cmpxchg_32(__xg_ptr, __xg_test, __xg_new); break; \ default: \ __xg_orig = 0; \ @@ -414,4 +326,19 @@ extern uint32_t __cmpxchg_32(uint32_t *v, uint32_t test, uint32_t new); #endif +#define atomic_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), old, new)) +#define atomic_xchg(v, new) (xchg(&((v)->counter), new)) + +#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) + +#include #endif /* _ASM_ATOMIC_H */ diff --git a/include/asm-frv/bitops.h b/include/asm-frv/bitops.h index b664bd5b6..980ae1b0c 100644 --- a/include/asm-frv/bitops.h +++ b/include/asm-frv/bitops.h @@ -14,7 +14,6 @@ #ifndef _ASM_BITOPS_H #define _ASM_BITOPS_H -#include #include #include #include @@ -22,20 +21,7 @@ #ifdef __KERNEL__ -/* - * ffz = Find First Zero in word. Undefined if no zero exists, - * so code should check against ~0UL first.. - */ -static inline unsigned long ffz(unsigned long word) -{ - unsigned long result = 0; - - while (word & 1) { - result++; - word >>= 1; - } - return result; -} +#include /* * clear_bit() doesn't provide any barrier for the compiler. @@ -171,51 +157,9 @@ static inline int __test_bit(int nr, const volatile void * addr) __constant_test_bit((nr),(addr)) : \ __test_bit((nr),(addr))) -extern int find_next_bit(const unsigned long *addr, int size, int offset); - -#define find_first_bit(addr, size) find_next_bit(addr, size, 0) - -#define find_first_zero_bit(addr, size) \ - find_next_zero_bit((addr), (size), 0) - -static inline int find_next_zero_bit(const void *addr, int size, int offset) -{ - const unsigned long *p = ((const unsigned long *) addr) + (offset >> 5); - unsigned long result = offset & ~31UL; - unsigned long tmp; - - if (offset >= size) - return size; - size -= result; - offset &= 31UL; - if (offset) { - tmp = *(p++); - tmp |= ~0UL >> (32-offset); - if (size < 32) - goto found_first; - if (~tmp) - goto found_middle; - size -= 32; - result += 32; - } - while (size & ~31UL) { - if (~(tmp = *(p++))) - goto found_middle; - result += 32; - size -= 32; - } - if (!size) - return result; - tmp = *p; - -found_first: - tmp |= ~0UL >> size; -found_middle: - return result + ffz(tmp); -} - -#define ffs(x) generic_ffs(x) -#define __ffs(x) (ffs(x) - 1) +#include +#include +#include /* * fls: find last bit set. @@ -229,112 +173,16 @@ found_middle: bit ? 33 - bit : bit; \ }) -/* - * Every architecture must define this function. It's the fastest - * way of searching a 140-bit bitmap where the first 100 bits are - * unlikely to be set. It's guaranteed that at least one of the 140 - * bits is cleared. - */ -static inline int sched_find_first_bit(const unsigned long *b) -{ - if (unlikely(b[0])) - return __ffs(b[0]); - if (unlikely(b[1])) - return __ffs(b[1]) + 32; - if (unlikely(b[2])) - return __ffs(b[2]) + 64; - if (b[3]) - return __ffs(b[3]) + 96; - return __ffs(b[4]) + 128; -} +#include +#include +#include +#include -/* - * hweightN: returns the hamming weight (i.e. the number - * of bits set) of a N-bit word - */ - -#define hweight32(x) generic_hweight32(x) -#define hweight16(x) generic_hweight16(x) -#define hweight8(x) generic_hweight8(x) - -#define ext2_set_bit(nr, addr) test_and_set_bit ((nr) ^ 0x18, (addr)) -#define ext2_clear_bit(nr, addr) test_and_clear_bit((nr) ^ 0x18, (addr)) - -#define ext2_set_bit_atomic(lock,nr,addr) ext2_set_bit((nr), addr) -#define ext2_clear_bit_atomic(lock,nr,addr) ext2_clear_bit((nr), addr) - -static inline int ext2_test_bit(int nr, const volatile void * addr) -{ - const volatile unsigned char *ADDR = (const unsigned char *) addr; - int mask; - - ADDR += nr >> 3; - mask = 1 << (nr & 0x07); - return ((mask & *ADDR) != 0); -} - -#define ext2_find_first_zero_bit(addr, size) \ - ext2_find_next_zero_bit((addr), (size), 0) - -static inline unsigned long ext2_find_next_zero_bit(const void *addr, - unsigned long size, - unsigned long offset) -{ - const unsigned long *p = ((const unsigned long *) addr) + (offset >> 5); - unsigned long result = offset & ~31UL; - unsigned long tmp; - - if (offset >= size) - return size; - size -= result; - offset &= 31UL; - if(offset) { - /* We hold the little endian value in tmp, but then the - * shift is illegal. So we could keep a big endian value - * in tmp, like this: - * - * tmp = __swab32(*(p++)); - * tmp |= ~0UL >> (32-offset); - * - * but this would decrease preformance, so we change the - * shift: - */ - tmp = *(p++); - tmp |= __swab32(~0UL >> (32-offset)); - if(size < 32) - goto found_first; - if(~tmp) - goto found_middle; - size -= 32; - result += 32; - } - while(size & ~31UL) { - if(~(tmp = *(p++))) - goto found_middle; - result += 32; - size -= 32; - } - if(!size) - return result; - tmp = *p; - -found_first: - /* tmp is little endian, so we would have to swab the shift, - * see above. But then we have to swab tmp below for ffz, so - * we might as well do this here. - */ - return result + ffz(__swab32(tmp) | (~0UL << size)); -found_middle: - return result + ffz(__swab32(tmp)); -} +#define ext2_set_bit_atomic(lock,nr,addr) test_and_set_bit ((nr) ^ 0x18, (addr)) +#define ext2_clear_bit_atomic(lock,nr,addr) test_and_clear_bit((nr) ^ 0x18, (addr)) -/* Bitmap functions for the minix filesystem. */ -#define minix_test_and_set_bit(nr,addr) ext2_set_bit(nr,addr) -#define minix_set_bit(nr,addr) ext2_set_bit(nr,addr) -#define minix_test_and_clear_bit(nr,addr) ext2_clear_bit(nr,addr) -#define minix_test_bit(nr,addr) ext2_test_bit(nr,addr) -#define minix_find_first_zero_bit(addr,size) ext2_find_first_zero_bit(addr,size) +#include #endif /* __KERNEL__ */ diff --git a/include/asm-frv/bug.h b/include/asm-frv/bug.h index 074c0d577..6b1b44d71 100644 --- a/include/asm-frv/bug.h +++ b/include/asm-frv/bug.h @@ -11,7 +11,7 @@ #ifndef _ASM_BUG_H #define _ASM_BUG_H -#include +#include #ifdef CONFIG_BUG /* diff --git a/include/asm-frv/cache.h b/include/asm-frv/cache.h index cf69b6373..2797163b8 100644 --- a/include/asm-frv/cache.h +++ b/include/asm-frv/cache.h @@ -12,7 +12,6 @@ #ifndef __ASM_CACHE_H #define __ASM_CACHE_H -#include /* bytes per L1 cache line */ #define L1_CACHE_SHIFT (CONFIG_FRV_L1_CACHE_SHIFT) diff --git a/include/asm-frv/checksum.h b/include/asm-frv/checksum.h index 10236f680..42bf0db22 100644 --- a/include/asm-frv/checksum.h +++ b/include/asm-frv/checksum.h @@ -43,7 +43,7 @@ unsigned int csum_partial_copy(const char *src, char *dst, int len, int sum); * here even more important to align src and dst on a 32-bit (or even * better 64-bit) boundary */ -extern unsigned int csum_partial_copy_from_user(const char *src, char *dst, +extern unsigned int csum_partial_copy_from_user(const char __user *src, char *dst, int len, int sum, int *csum_err); #define csum_partial_copy_nocheck(src, dst, len, sum) \ diff --git a/include/asm-frv/dma.h b/include/asm-frv/dma.h index d8f9a2f21..18d6bb8f8 100644 --- a/include/asm-frv/dma.h +++ b/include/asm-frv/dma.h @@ -14,7 +14,6 @@ //#define DMA_DEBUG 1 -#include #include #undef MAX_DMA_CHANNELS /* don't use kernel/dma.c */ diff --git a/include/asm-frv/elf.h b/include/asm-frv/elf.h index 7d2098f04..7df58a3e6 100644 --- a/include/asm-frv/elf.h +++ b/include/asm-frv/elf.h @@ -12,7 +12,6 @@ #ifndef __ASM_ELF_H #define __ASM_ELF_H -#include #include #include @@ -65,7 +64,7 @@ typedef unsigned long elf_greg_t; #define ELF_NGREG (sizeof(struct pt_regs) / sizeof(elf_greg_t)) typedef elf_greg_t elf_gregset_t[ELF_NGREG]; -typedef struct fpmedia_struct elf_fpregset_t; +typedef struct user_fpmedia_regs elf_fpregset_t; /* * This is used to ensure we don't load something for the wrong architecture. @@ -117,6 +116,7 @@ do { \ } while(0) #define USE_ELF_CORE_DUMP +#define ELF_FDPIC_CORE_EFLAGS EF_FRV_FDPIC #define ELF_EXEC_PAGESIZE 16384 /* This is the location that an ET_DYN program is loaded if exec'ed. Typical @@ -126,9 +126,6 @@ do { \ #define ELF_ET_DYN_BASE 0x08000000UL -#define ELF_CORE_COPY_REGS(pr_reg, regs) \ - memcpy(&pr_reg[0], ®s->sp, 31 * sizeof(uint32_t)); - /* This yields a mask that user programs can use to figure out what instruction set this cpu supports. */ diff --git a/include/asm-frv/fpu.h b/include/asm-frv/fpu.h index b1178f8ca..d73c60b56 100644 --- a/include/asm-frv/fpu.h +++ b/include/asm-frv/fpu.h @@ -1,7 +1,6 @@ #ifndef __ASM_FPU_H #define __ASM_FPU_H -#include /* * MAX floating point unit state size (FSAVE/FRESTORE) diff --git a/include/asm-frv/gdb-stub.h b/include/asm-frv/gdb-stub.h index c58479a4b..24f973867 100644 --- a/include/asm-frv/gdb-stub.h +++ b/include/asm-frv/gdb-stub.h @@ -89,6 +89,7 @@ extern void gdbstub_do_rx(void); extern asmlinkage void __debug_stub_init_break(void); extern asmlinkage void __break_hijack_kernel_event(void); +extern asmlinkage void __break_hijack_kernel_event_breaks_here(void); extern asmlinkage void start_kernel(void); extern asmlinkage void gdbstub_rx_handler(void); @@ -114,5 +115,26 @@ extern void console_set_baud(unsigned baud); #define gdbstub_proto(FMT,...) ({ 0; }) #endif +/* + * we dedicate GR31 to keeping a pointer to the gdbstub exception frame + * - gr31 is destroyed on entry to the gdbstub if !MMU + * - gr31 is saved in scr3 on entry to the gdbstub if in !MMU + */ +register struct frv_frame0 *__debug_frame0 asm("gr31"); + +#define __debug_frame (&__debug_frame0->regs) +#define __debug_user_context (&__debug_frame0->uc) +#define __debug_regs (&__debug_frame0->debug) +#define __debug_reg(X) ((unsigned long *) ((unsigned long) &__debug_frame0 + (X))) + +struct frv_debug_status { + unsigned long bpsr; + unsigned long dcr; + unsigned long brr; + unsigned long nmar; +}; + +extern struct frv_debug_status __debug_status; + #endif /* _LANGUAGE_ASSEMBLY */ #endif /* __ASM_GDB_STUB_H */ diff --git a/include/asm-frv/hardirq.h b/include/asm-frv/hardirq.h index 5248ca054..7581b5a75 100644 --- a/include/asm-frv/hardirq.h +++ b/include/asm-frv/hardirq.h @@ -12,8 +12,8 @@ #ifndef __ASM_HARDIRQ_H #define __ASM_HARDIRQ_H -#include #include +#include typedef struct { unsigned int __softirq_pending; diff --git a/include/asm-frv/highmem.h b/include/asm-frv/highmem.h index 295f74a57..e2247c22a 100644 --- a/include/asm-frv/highmem.h +++ b/include/asm-frv/highmem.h @@ -17,7 +17,6 @@ #ifdef __KERNEL__ -#include #include #include #include @@ -135,7 +134,7 @@ static inline void *kmap_atomic(struct page *page, enum km_type type) default: BUG(); - return 0; + return NULL; } } diff --git a/include/asm-frv/ide.h b/include/asm-frv/ide.h index f9caecf7e..f0bd2cb25 100644 --- a/include/asm-frv/ide.h +++ b/include/asm-frv/ide.h @@ -14,7 +14,6 @@ #ifdef __KERNEL__ -#include #include #include #include @@ -33,10 +32,10 @@ /* * 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__ */ diff --git a/include/asm-frv/io.h b/include/asm-frv/io.h index 48829f727..7765f5528 100644 --- a/include/asm-frv/io.h +++ b/include/asm-frv/io.h @@ -17,7 +17,7 @@ #ifdef __KERNEL__ -#include +#include #include #include #include @@ -40,13 +40,13 @@ static inline unsigned long _swapl(unsigned long v) //#define __iormb() asm volatile("membar") //#define __iowmb() asm volatile("membar") -#define __raw_readb(addr) __builtin_read8((void *) (addr)) -#define __raw_readw(addr) __builtin_read16((void *) (addr)) -#define __raw_readl(addr) __builtin_read32((void *) (addr)) +#define __raw_readb __builtin_read8 +#define __raw_readw __builtin_read16 +#define __raw_readl __builtin_read32 -#define __raw_writeb(datum, addr) __builtin_write8((void *) (addr), datum) -#define __raw_writew(datum, addr) __builtin_write16((void *) (addr), datum) -#define __raw_writel(datum, addr) __builtin_write32((void *) (addr), datum) +#define __raw_writeb(datum, addr) __builtin_write8(addr, datum) +#define __raw_writew(datum, addr) __builtin_write16(addr, datum) +#define __raw_writel(datum, addr) __builtin_write32(addr, datum) static inline void io_outsb(unsigned int addr, const void *buf, int len) { @@ -104,6 +104,8 @@ static inline void __insl(unsigned long addr, void *buf, int len, int swap) __insl_sw(addr, buf, len); } +#define mmiowb() mb() + /* * make the short names macros so specific devices * can override them as required @@ -114,7 +116,7 @@ static inline void memset_io(volatile void __iomem *addr, unsigned char val, int memset((void __force *) addr, val, count); } -static inline void memcpy_fromio(void *dst, volatile void __iomem *src, int count) +static inline void memcpy_fromio(void *dst, const volatile void __iomem *src, int count) { memcpy(dst, (void __force *) src, count); } @@ -126,12 +128,12 @@ static inline void memcpy_toio(volatile void __iomem *dst, const void *src, int static inline uint8_t inb(unsigned long addr) { - return __builtin_read8((void *)addr); + return __builtin_read8((void __iomem *)addr); } static inline uint16_t inw(unsigned long addr) { - uint16_t ret = __builtin_read16((void *)addr); + uint16_t ret = __builtin_read16((void __iomem *)addr); if (__is_PCI_IO(addr)) ret = _swapw(ret); @@ -141,7 +143,7 @@ static inline uint16_t inw(unsigned long addr) static inline uint32_t inl(unsigned long addr) { - uint32_t ret = __builtin_read32((void *)addr); + uint32_t ret = __builtin_read32((void __iomem *)addr); if (__is_PCI_IO(addr)) ret = _swapl(ret); @@ -151,21 +153,21 @@ static inline uint32_t inl(unsigned long addr) static inline void outb(uint8_t datum, unsigned long addr) { - __builtin_write8((void *)addr, datum); + __builtin_write8((void __iomem *)addr, datum); } static inline void outw(uint16_t datum, unsigned long addr) { if (__is_PCI_IO(addr)) datum = _swapw(datum); - __builtin_write16((void *)addr, datum); + __builtin_write16((void __iomem *)addr, datum); } static inline void outl(uint32_t datum, unsigned long addr) { if (__is_PCI_IO(addr)) datum = _swapl(datum); - __builtin_write32((void *)addr, datum); + __builtin_write32((void __iomem *)addr, datum); } #define inb_p(addr) inb(addr) @@ -187,12 +189,12 @@ static inline void outl(uint32_t datum, unsigned long addr) static inline uint8_t readb(const volatile void __iomem *addr) { - return __builtin_read8((volatile uint8_t __force *) addr); + return __builtin_read8((__force void volatile __iomem *) addr); } static inline uint16_t readw(const volatile void __iomem *addr) { - uint16_t ret = __builtin_read16((volatile uint16_t __force *)addr); + uint16_t ret = __builtin_read16((__force void volatile __iomem *)addr); if (__is_PCI_MEM(addr)) ret = _swapw(ret); @@ -201,7 +203,7 @@ static inline uint16_t readw(const volatile void __iomem *addr) static inline uint32_t readl(const volatile void __iomem *addr) { - uint32_t ret = __builtin_read32((volatile uint32_t __force *)addr); + uint32_t ret = __builtin_read32((__force void volatile __iomem *)addr); if (__is_PCI_MEM(addr)) ret = _swapl(ret); @@ -209,9 +211,13 @@ static inline uint32_t readl(const volatile void __iomem *addr) return ret; } +#define readb_relaxed readb +#define readw_relaxed readw +#define readl_relaxed readl + static inline void writeb(uint8_t datum, volatile void __iomem *addr) { - __builtin_write8((volatile uint8_t __force *) addr, datum); + __builtin_write8(addr, datum); if (__is_PCI_MEM(addr)) __flush_PCI_writes(); } @@ -221,7 +227,7 @@ static inline void writew(uint16_t datum, volatile void __iomem *addr) if (__is_PCI_MEM(addr)) datum = _swapw(datum); - __builtin_write16((volatile uint16_t __force *) addr, datum); + __builtin_write16(addr, datum); if (__is_PCI_MEM(addr)) __flush_PCI_writes(); } @@ -231,7 +237,7 @@ static inline void writel(uint32_t datum, volatile void __iomem *addr) if (__is_PCI_MEM(addr)) datum = _swapl(datum); - __builtin_write32((volatile uint32_t __force *) addr, datum); + __builtin_write32(addr, datum); if (__is_PCI_MEM(addr)) __flush_PCI_writes(); } @@ -244,7 +250,6 @@ static inline void writel(uint32_t datum, volatile void __iomem *addr) #define IOMAP_WRITETHROUGH 3 extern void __iomem *__ioremap(unsigned long physaddr, unsigned long size, int cacheflag); -extern void __iounmap(void __iomem *addr, unsigned long size); static inline void __iomem *ioremap(unsigned long physaddr, unsigned long size) { @@ -266,13 +271,108 @@ static inline void __iomem *ioremap_fullcache(unsigned long physaddr, unsigned l return __ioremap(physaddr, size, IOMAP_FULL_CACHING); } -extern void iounmap(void __iomem *addr); +extern void iounmap(void volatile __iomem *addr); + +static inline void __iomem *ioport_map(unsigned long port, unsigned int nr) +{ + return (void __iomem *) port; +} + +static inline void ioport_unmap(void __iomem *p) +{ +} static inline void flush_write_buffers(void) { __asm__ __volatile__ ("membar" : : :"memory"); } +/* + * do appropriate I/O accesses for token type + */ +static inline unsigned int ioread8(void __iomem *p) +{ + return __builtin_read8(p); +} + +static inline unsigned int ioread16(void __iomem *p) +{ + uint16_t ret = __builtin_read16(p); + if (__is_PCI_addr(p)) + ret = _swapw(ret); + return ret; +} + +static inline unsigned int ioread32(void __iomem *p) +{ + uint32_t ret = __builtin_read32(p); + if (__is_PCI_addr(p)) + ret = _swapl(ret); + return ret; +} + +static inline void iowrite8(u8 val, void __iomem *p) +{ + __builtin_write8(p, val); + if (__is_PCI_MEM(p)) + __flush_PCI_writes(); +} + +static inline void iowrite16(u16 val, void __iomem *p) +{ + if (__is_PCI_addr(p)) + val = _swapw(val); + __builtin_write16(p, val); + if (__is_PCI_MEM(p)) + __flush_PCI_writes(); +} + +static inline void iowrite32(u32 val, void __iomem *p) +{ + if (__is_PCI_addr(p)) + val = _swapl(val); + __builtin_write32(p, val); + if (__is_PCI_MEM(p)) + __flush_PCI_writes(); +} + +static inline void ioread8_rep(void __iomem *p, void *dst, unsigned long count) +{ + io_insb((unsigned long) p, dst, count); +} + +static inline void ioread16_rep(void __iomem *p, void *dst, unsigned long count) +{ + io_insw((unsigned long) p, dst, count); +} + +static inline void ioread32_rep(void __iomem *p, void *dst, unsigned long count) +{ + __insl_ns((unsigned long) p, dst, count); +} + +static inline void iowrite8_rep(void __iomem *p, const void *src, unsigned long count) +{ + io_outsb((unsigned long) p, src, count); +} + +static inline void iowrite16_rep(void __iomem *p, const void *src, unsigned long count) +{ + io_outsw((unsigned long) p, src, count); +} + +static inline void iowrite32_rep(void __iomem *p, const void *src, unsigned long count) +{ + __outsl_ns((unsigned long) p, src, count); +} + +/* Create a virtual mapping cookie for a PCI BAR (memory or IO) */ +struct pci_dev; +extern void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max); +static inline void pci_iounmap(struct pci_dev *dev, void __iomem *p) +{ +} + /* * Convert a physical pointer to a virtual kernel pointer for /dev/mem @@ -285,6 +385,27 @@ static inline void flush_write_buffers(void) */ #define xlate_dev_kmem_ptr(p) p +/* + * Check BIOS signature + */ +static inline int check_signature(volatile void __iomem *io_addr, + const unsigned char *signature, int length) +{ + int retval = 0; + + do { + if (readb(io_addr) != *signature) + goto out; + io_addr++; + signature++; + length--; + } while (length); + + retval = 1; +out: + return retval; +} + #endif /* __KERNEL__ */ #endif /* _ASM_IO_H */ diff --git a/include/asm-frv/irq-routing.h b/include/asm-frv/irq-routing.h index 686fb2b39..ac3ab900a 100644 --- a/include/asm-frv/irq-routing.h +++ b/include/asm-frv/irq-routing.h @@ -51,7 +51,7 @@ struct irq_source { struct irq_level { int usage; int disable_count; - unsigned long flags; /* current SA_INTERRUPT and SA_SHIRQ settings */ + unsigned long flags; /* current IRQF_DISABLED and IRQF_SHARED settings */ spinlock_t lock; struct irq_source *sources; }; diff --git a/include/asm-frv/irq.h b/include/asm-frv/irq.h index 2c16d8dc0..58b619215 100644 --- a/include/asm-frv/irq.h +++ b/include/asm-frv/irq.h @@ -12,7 +12,6 @@ #ifndef _ASM_IRQ_H_ #define _ASM_IRQ_H_ -#include /* * the system has an on-CPU PIC and another PIC on the FPGA and other PICs on other peripherals, diff --git a/include/asm-frv/mb-regs.h b/include/asm-frv/mb-regs.h index c8f575fc4..219e5f926 100644 --- a/include/asm-frv/mb-regs.h +++ b/include/asm-frv/mb-regs.h @@ -16,6 +16,17 @@ #include #include +#ifndef __ASSEMBLY__ +/* gcc builtins, annotated */ + +unsigned long __builtin_read8(volatile void __iomem *); +unsigned long __builtin_read16(volatile void __iomem *); +unsigned long __builtin_read32(volatile void __iomem *); +void __builtin_write8(volatile void __iomem *, unsigned char); +void __builtin_write16(volatile void __iomem *, unsigned short); +void __builtin_write32(volatile void __iomem *, unsigned long); +#endif + #define __region_IO KERNEL_IO_START /* the region from 0xe0000000 to 0xffffffff has suitable * protection laid over the top for use in memory-mapped * I/O @@ -59,7 +70,7 @@ #define __region_PCI_MEM (__region_CS2 + 0x08000000UL) #define __flush_PCI_writes() \ do { \ - __builtin_write8((volatile void *) __region_PCI_MEM, 0); \ + __builtin_write8((volatile void __iomem *) __region_PCI_MEM, 0); \ } while(0) #define __is_PCI_IO(addr) \ @@ -68,6 +79,9 @@ do { \ #define __is_PCI_MEM(addr) \ ((unsigned long)(addr) - __region_PCI_MEM < 0x08000000UL) +#define __is_PCI_addr(addr) \ + ((unsigned long)(addr) - __region_PCI_IO < 0x0c000000UL) + #define __get_CLKSW() ({ *(volatile unsigned long *)(__region_CS2 + 0x0130000cUL) & 0xffUL; }) #define __get_CLKIN() (__get_CLKSW() * 125U * 100000U / 24U) @@ -80,15 +94,15 @@ extern int __nongprelbss mb93090_mb00_detected; #define __set_LEDS(X) \ do { \ if (mb93090_mb00_detected) \ - __builtin_write32((void *) __addr_LEDS(), ~(X)); \ + __builtin_write32((void __iomem *) __addr_LEDS(), ~(X)); \ } while (0) #else #define __set_LEDS(X) #endif #define __addr_LCD() (__region_CS2 + 0x01200008UL) -#define __get_LCD(B) __builtin_read32((volatile void *) (B)) -#define __set_LCD(B,X) __builtin_write32((volatile void *) (B), (X)) +#define __get_LCD(B) __builtin_read32((volatile void __iomem *) (B)) +#define __set_LCD(B,X) __builtin_write32((volatile void __iomem *) (B), (X)) #define LCD_D 0x000000ff /* LCD data bus */ #define LCD_RW 0x00000100 /* LCD R/W signal */ @@ -149,6 +163,7 @@ do { \ #define __is_PCI_IO(addr) 0 /* no PCI */ #define __is_PCI_MEM(addr) 0 +#define __is_PCI_addr(addr) 0 #define __region_PCI_IO 0 #define __region_PCI_MEM 0 #define __flush_PCI_writes() do { } while(0) @@ -157,11 +172,11 @@ do { \ #define __get_CLKIN() 66000000UL #define __addr_LEDS() (__region_CS2 + 0x00000023UL) -#define __set_LEDS(X) __builtin_write8((volatile void *) __addr_LEDS(), (X)) +#define __set_LEDS(X) __builtin_write8((volatile void __iomem *) __addr_LEDS(), (X)) #define __addr_FPGATR() (__region_CS2 + 0x00000030UL) -#define __set_FPGATR(X) __builtin_write32((volatile void *) __addr_FPGATR(), (X)) -#define __get_FPGATR() __builtin_read32((volatile void *) __addr_FPGATR()) +#define __set_FPGATR(X) __builtin_write32((volatile void __iomem *) __addr_FPGATR(), (X)) +#define __get_FPGATR() __builtin_read32((volatile void __iomem *) __addr_FPGATR()) #define MB93093_FPGA_FPGATR_AUDIO_CLK 0x00000003 @@ -176,7 +191,7 @@ do { \ #define MB93093_FPGA_SWR_PUSHSWMASK (0x1F<<26) #define MB93093_FPGA_SWR_PUSHSW4 (1<<29) -#define __addr_FPGA_SWR ((volatile void *)(__region_CS2 + 0x28UL)) +#define __addr_FPGA_SWR ((volatile void __iomem *)(__region_CS2 + 0x28UL)) #define __get_FPGA_PUSHSW1_5() (__builtin_read32(__addr_FPGA_SWR) & MB93093_FPGA_SWR_PUSHSWMASK) diff --git a/include/asm-frv/mmu_context.h b/include/asm-frv/mmu_context.h index 4fb9ea3c5..72edcaacc 100644 --- a/include/asm-frv/mmu_context.h +++ b/include/asm-frv/mmu_context.h @@ -12,7 +12,6 @@ #ifndef _ASM_MMU_CONTEXT_H #define _ASM_MMU_CONTEXT_H -#include #include #include #include diff --git a/include/asm-frv/page.h b/include/asm-frv/page.h index f7914f178..134cc0cdf 100644 --- a/include/asm-frv/page.h +++ b/include/asm-frv/page.h @@ -3,7 +3,6 @@ #ifdef __KERNEL__ -#include #include #include #include @@ -45,25 +44,10 @@ typedef struct { unsigned long pgprot; } pgprot_t; /* to align the pointer to the (next) page boundary */ #define PAGE_ALIGN(addr) (((addr) + PAGE_SIZE - 1) & PAGE_MASK) -/* Pure 2^n version of get_order */ -static inline int get_order(unsigned long size) __attribute_const__; -static inline int get_order(unsigned long size) -{ - int order; - - size = (size - 1) >> (PAGE_SHIFT - 1); - order = -1; - do { - size >>= 1; - order++; - } while (size); - return order; -} - #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) @@ -72,13 +56,9 @@ extern unsigned long min_low_pfn; extern unsigned long max_pfn; #ifdef CONFIG_MMU -#define pfn_to_page(pfn) (mem_map + (pfn)) -#define page_to_pfn(page) ((unsigned long) ((page) - mem_map)) #define pfn_valid(pfn) ((pfn) < max_mapnr) - #else -#define pfn_to_page(pfn) (&mem_map[(pfn) - (PAGE_OFFSET >> PAGE_SHIFT)]) -#define page_to_pfn(page) ((PAGE_OFFSET >> PAGE_SHIFT) + (unsigned long) ((page) - mem_map)) +#define ARCH_PFN_OFFSET (PAGE_OFFSET >> PAGE_SHIFT) #define pfn_valid(pfn) ((pfn) >= min_low_pfn && (pfn) < max_low_pfn) #endif @@ -102,4 +82,7 @@ extern unsigned long max_pfn; #define WANT_PAGE_VIRTUAL 1 #endif +#include +#include + #endif /* _ASM_PAGE_H */ diff --git a/include/asm-frv/pci.h b/include/asm-frv/pci.h index a6a469231..f35a4511e 100644 --- a/include/asm-frv/pci.h +++ b/include/asm-frv/pci.h @@ -13,7 +13,6 @@ #ifndef ASM_PCI_H #define ASM_PCI_H -#include #include #include #include @@ -32,7 +31,7 @@ extern void pcibios_set_master(struct pci_dev *dev); extern void pcibios_penalize_isa_irq(int irq); #ifdef CONFIG_MMU -extern void *consistent_alloc(int gfp, size_t size, dma_addr_t *dma_handle); +extern void *consistent_alloc(gfp_t gfp, size_t size, dma_addr_t *dma_handle); extern void consistent_free(void *vaddr); extern void consistent_sync(void *vaddr, size_t size, int direction); extern void consistent_sync_page(struct page *page, unsigned long offset, @@ -57,6 +56,24 @@ extern void pci_free_consistent(struct pci_dev *hwdev, size_t size, */ #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) + +#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 + /* * These are pretty much arbitary with the CoMEM implementation. * We have the whole address space to ourselves. diff --git a/include/asm-frv/pgalloc.h b/include/asm-frv/pgalloc.h index 1bd28f41b..ce982a6c6 100644 --- a/include/asm-frv/pgalloc.h +++ b/include/asm-frv/pgalloc.h @@ -15,7 +15,6 @@ #ifndef _ASM_PGALLOC_H #define _ASM_PGALLOC_H -#include #include #include diff --git a/include/asm-frv/pgtable.h b/include/asm-frv/pgtable.h index d0a9c2f9c..7af7485e8 100644 --- a/include/asm-frv/pgtable.h +++ b/include/asm-frv/pgtable.h @@ -16,7 +16,6 @@ #ifndef _ASM_PGTABLE_H #define _ASM_PGTABLE_H -#include #include #include #include @@ -26,6 +25,8 @@ #include #include #include +struct mm_struct; +struct vm_area_struct; #endif #ifndef __ASSEMBLY__ @@ -418,6 +419,11 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, asm volatile("dcf %M0" :: "U"(*ptep)); } +/* + * Macro to mark a page protection value as "uncacheable" + */ +#define pgprot_noncached(prot) (__pgprot(pgprot_val(prot) | _PAGE_NOCACHE)) + /* * Conversion functions: convert a page and protection to a page entry, * and a page entry and page directory to the page they refer to. @@ -436,8 +442,6 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) return pte; } -#define page_pte(page) page_pte_prot((page), __pgprot(0)) - /* to find an entry in a page-table-directory. */ #define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1)) #define pgd_index_k(addr) pgd_index(addr) @@ -500,9 +504,6 @@ static inline int pte_file(pte_t pte) #define PageSkip(page) (0) #define kern_addr_valid(addr) (1) -#define io_remap_page_range(vma, vaddr, paddr, size, prot) \ - remap_pfn_range(vma, vaddr, (paddr) >> PAGE_SHIFT, size, prot) - #define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ remap_pfn_range(vma, vaddr, pfn, size, prot) diff --git a/include/asm-frv/processor.h b/include/asm-frv/processor.h index 5228c18b7..3744f2e47 100644 --- a/include/asm-frv/processor.h +++ b/include/asm-frv/processor.h @@ -12,7 +12,6 @@ #ifndef _ASM_PROCESSOR_H #define _ASM_PROCESSOR_H -#include #include #ifndef __ASSEMBLY__ @@ -22,6 +21,7 @@ */ #define current_text_addr() ({ __label__ _l; _l: &&_l;}) +#include #include #include #include @@ -140,7 +140,7 @@ unsigned long get_wchan(struct task_struct *p); extern struct task_struct *alloc_task_struct(void); extern void free_task_struct(struct task_struct *p); -#define cpu_relax() do { } while (0) +#define cpu_relax() barrier() /* data cache prefetch */ #define ARCH_HAS_PREFETCH diff --git a/include/asm-frv/ptrace.h b/include/asm-frv/ptrace.h index b2cce0718..7ff525162 100644 --- a/include/asm-frv/ptrace.h +++ b/include/asm-frv/ptrace.h @@ -62,18 +62,10 @@ #ifndef __ASSEMBLY__ /* - * dedicate GR28; to keeping the a pointer to the current exception frame + * we dedicate GR28 to keeping a pointer to the current exception frame + * - gr28 is destroyed on entry to the kernel from userspace */ register struct pt_regs *__frame asm("gr28"); -register struct pt_regs *__debug_frame asm("gr31"); - -#ifndef container_of -#define container_of(ptr, type, member) ({ \ - const typeof( ((type *)0)->member ) *__mptr = (ptr); \ - (type *)( (char *)__mptr - offsetof(type,member) );}) -#endif - -#define __debug_regs container_of(__debug_frame, struct pt_debug_regs, normal_regs) #define user_mode(regs) (!((regs)->psr & PSR_S)) #define instruction_pointer(regs) ((regs)->pc) diff --git a/include/asm-frv/registers.h b/include/asm-frv/registers.h index fccfd95cf..9666119fc 100644 --- a/include/asm-frv/registers.h +++ b/include/asm-frv/registers.h @@ -23,7 +23,13 @@ * * +0x2000 +---------------------- * | union { - * | struct user_context + * | struct frv_frame0 { + * | struct user_context { + * | struct user_int_regs + * | struct user_fpmedia_regs + * | } + * | struct frv_debug_regs + * | } * | struct pt_regs [user exception] * | } * +---------------------- <-- __kernel_frame0_ptr (maybe GR28) @@ -51,11 +57,11 @@ #define _ASM_REGISTERS_H #ifndef __ASSEMBLY__ -#define __OFFSET(X) (X) +#define __OFFSET(X,N) ((X)+(N)*4) #define __OFFSETC(X,N) xxxxxxxxxxxxxxxxxxxxxxxx #else -#define __OFFSET(X) ((X)*4) -#define __OFFSETC(X,N) ((X)*4+(N)) +#define __OFFSET(X,N) ((X)+(N)*4) +#define __OFFSETC(X,N) ((X)+(N)) #endif /*****************************************************************************/ @@ -117,30 +123,13 @@ struct pt_regs { #endif -#define REG_PSR __OFFSET( 0) /* Processor Status Register */ -#define REG_ISR __OFFSET( 1) /* Integer Status Register */ -#define REG_CCR __OFFSET( 2) /* Condition Code Register */ -#define REG_CCCR __OFFSET( 3) /* Condition Code for Conditional Insns Register */ -#define REG_LR __OFFSET( 4) /* Link Register */ -#define REG_LCR __OFFSET( 5) /* Loop Count Register */ -#define REG_PC __OFFSET( 6) /* Program Counter */ - -#define REG__STATUS __OFFSET( 7) /* exception status */ #define REG__STATUS_STEP 0x00000001 /* - reenable single stepping on return */ #define REG__STATUS_STEPPED 0x00000002 /* - single step caused exception */ #define REG__STATUS_BROKE 0x00000004 /* - BREAK insn caused exception */ #define REG__STATUS_SYSC_ENTRY 0x40000000 /* - T on syscall entry (ptrace.c only) */ #define REG__STATUS_SYSC_EXIT 0x80000000 /* - T on syscall exit (ptrace.c only) */ -#define REG_SYSCALLNO __OFFSET( 8) /* syscall number or -1 */ -#define REG_ORIG_GR8 __OFFSET( 9) /* saved GR8 for signal handling */ -#define REG_GNER0 __OFFSET(10) -#define REG_GNER1 __OFFSET(11) -#define REG_IACC0 __OFFSET(12) - -#define REG_TBR __OFFSET(14) /* Trap Vector Register */ -#define REG_GR(R) __OFFSET((14+(R))) -#define REG__END REG_GR(32) +#define REG_GR(R) __OFFSET(REG_GR0, (R)) #define REG_SP REG_GR(1) #define REG_FP REG_GR(2) @@ -149,27 +138,21 @@ struct pt_regs { /*****************************************************************************/ /* - * extension tacked in front of the exception frame in debug mode + * debugging registers */ #ifndef __ASSEMBLY__ -struct pt_debug_regs +struct frv_debug_regs { - unsigned long bpsr; unsigned long dcr; - unsigned long brr; - unsigned long nmar; - struct pt_regs normal_regs; + unsigned long ibar[4] __attribute__((aligned(8))); + unsigned long dbar[4] __attribute__((aligned(8))); + unsigned long dbdr[4][4] __attribute__((aligned(8))); + unsigned long dbmr[4][4] __attribute__((aligned(8))); } __attribute__((aligned(8))); #endif -#define REG_NMAR __OFFSET(-1) -#define REG_BRR __OFFSET(-2) -#define REG_DCR __OFFSET(-3) -#define REG_BPSR __OFFSET(-4) -#define REG__DEBUG_XTRA __OFFSET(4) - /*****************************************************************************/ /* * userspace registers @@ -223,33 +206,27 @@ struct user_context void *extension; } __attribute__((aligned(8))); +struct frv_frame0 { + union { + struct pt_regs regs; + struct user_context uc; + }; + + struct frv_debug_regs debug; + +} __attribute__((aligned(32))); + #endif -#define NR_USER_INT_REGS (14 + 64) -#define NR_USER_FPMEDIA_REGS (64 + 2 + 2 + 8 + 8/4 + 1) -#define NR_USER_CONTEXT (NR_USER_INT_REGS + NR_USER_FPMEDIA_REGS + 1) - -#define USER_CONTEXT_SIZE (((NR_USER_CONTEXT + 1) & ~1) * 4) - -#define __THREAD_FRAME __OFFSET(0) -#define __THREAD_CURR __OFFSET(1) -#define __THREAD_SP __OFFSET(2) -#define __THREAD_FP __OFFSET(3) -#define __THREAD_LR __OFFSET(4) -#define __THREAD_PC __OFFSET(5) -#define __THREAD_GR(R) __OFFSET(6 + (R) - 16) -#define __THREAD_FRAME0 __OFFSET(19) -#define __THREAD_USER __OFFSET(19) - -#define __USER_INT __OFFSET(0) -#define __INT_GR(R) __OFFSET(14 + (R)) - -#define __USER_FPMEDIA __OFFSET(NR_USER_INT_REGS) -#define __FPMEDIA_FR(R) __OFFSET(NR_USER_INT_REGS + (R)) -#define __FPMEDIA_FNER(R) __OFFSET(NR_USER_INT_REGS + 64 + (R)) -#define __FPMEDIA_MSR(R) __OFFSET(NR_USER_INT_REGS + 66 + (R)) -#define __FPMEDIA_ACC(R) __OFFSET(NR_USER_INT_REGS + 68 + (R)) -#define __FPMEDIA_ACCG(R) __OFFSETC(NR_USER_INT_REGS + 76, (R)) -#define __FPMEDIA_FSR(R) __OFFSET(NR_USER_INT_REGS + 78 + (R)) +#define __INT_GR(R) __OFFSET(__INT_GR0, (R)) + +#define __FPMEDIA_FR(R) __OFFSET(__FPMEDIA_FR0, (R)) +#define __FPMEDIA_FNER(R) __OFFSET(__FPMEDIA_FNER0, (R)) +#define __FPMEDIA_MSR(R) __OFFSET(__FPMEDIA_MSR0, (R)) +#define __FPMEDIA_ACC(R) __OFFSET(__FPMEDIA_ACC0, (R)) +#define __FPMEDIA_ACCG(R) __OFFSETC(__FPMEDIA_ACCG0, (R)) +#define __FPMEDIA_FSR(R) __OFFSET(__FPMEDIA_FSR0, (R)) + +#define __THREAD_GR(R) __OFFSET(__THREAD_GR16, (R) - 16) #endif /* _ASM_REGISTERS_H */ diff --git a/include/asm-frv/segment.h b/include/asm-frv/segment.h index 61222f00d..e3616a6f9 100644 --- a/include/asm-frv/segment.h +++ b/include/asm-frv/segment.h @@ -12,7 +12,6 @@ #ifndef _ASM_SEGMENT_H #define _ASM_SEGMENT_H -#include #ifndef __ASSEMBLY__ diff --git a/include/asm-frv/serial.h b/include/asm-frv/serial.h index 6917d556a..dbb825998 100644 --- a/include/asm-frv/serial.h +++ b/include/asm-frv/serial.h @@ -6,7 +6,6 @@ * * Based on linux/include/asm-i386/serial.h */ -#include #include /* diff --git a/include/asm-frv/signal.h b/include/asm-frv/signal.h index d407bde57..2079197d4 100644 --- a/include/asm-frv/signal.h +++ b/include/asm-frv/signal.h @@ -74,7 +74,6 @@ typedef unsigned long sigset_t; * SA_FLAGS values: * * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. * SA_RESETHAND clears the handler when the signal is delivered. @@ -94,7 +93,6 @@ typedef unsigned long sigset_t; #define SA_NOMASK SA_NODEFER #define SA_ONESHOT SA_RESETHAND -#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ #define SA_RESTORER 0x04000000 @@ -114,13 +112,13 @@ struct old_sigaction { __sighandler_t sa_handler; old_sigset_t sa_mask; unsigned long sa_flags; - void (*sa_restorer)(void); + __sigrestore_t sa_restorer; }; struct sigaction { __sighandler_t sa_handler; unsigned long sa_flags; - void (*sa_restorer)(void); + __sigrestore_t sa_restorer; sigset_t sa_mask; /* mask last for extensibility */ }; @@ -146,12 +144,11 @@ struct sigaction { #endif /* __KERNEL__ */ typedef struct sigaltstack { - void *ss_sp; + void __user *ss_sp; int ss_flags; size_t ss_size; } stack_t; -extern int do_signal(struct pt_regs *regs, sigset_t *oldset); #define ptrace_signal_deliver(regs, cookie) do { } while (0) #ifdef __KERNEL__ diff --git a/include/asm-frv/smp.h b/include/asm-frv/smp.h index 5ca771631..38349ec8b 100644 --- a/include/asm-frv/smp.h +++ b/include/asm-frv/smp.h @@ -1,7 +1,6 @@ #ifndef __ASM_SMP_H #define __ASM_SMP_H -#include #ifdef CONFIG_SMP #error SMP not supported diff --git a/include/asm-frv/socket.h b/include/asm-frv/socket.h index c3be17c7d..31db18fc8 100644 --- a/include/asm-frv/socket.h +++ b/include/asm-frv/socket.h @@ -14,6 +14,8 @@ #define SO_BROADCAST 6 #define SO_SNDBUF 7 #define SO_RCVBUF 8 +#define SO_SNDBUFFORCE 32 +#define SO_RCVBUFFORCE 33 #define SO_KEEPALIVE 9 #define SO_OOBINLINE 10 #define SO_NO_CHECK 11 @@ -46,6 +48,7 @@ #define SO_ACCEPTCONN 30 #define SO_PEERSEC 31 +#define SO_PASSSEC 34 #endif /* _ASM_SOCKET_H */ diff --git a/include/asm-frv/system.h b/include/asm-frv/system.h index d2aea70a5..116689931 100644 --- a/include/asm-frv/system.h +++ b/include/asm-frv/system.h @@ -12,14 +12,11 @@ #ifndef _ASM_SYSTEM_H #define _ASM_SYSTEM_H -#include /* get configuration macros */ #include #include struct thread_struct; -#define prepare_to_switch() do { } while(0) - /* * switch_to(prev, next) should switch from task `prev' to `next' * `prev' will never be the same as `next'. @@ -40,8 +37,84 @@ do { \ /* * interrupt flag manipulation + * - use virtual interrupt management since touching the PSR is slow + * - ICC2.Z: T if interrupts virtually disabled + * - ICC2.C: F if interrupts really disabled + * - if Z==1 upon interrupt: + * - C is set to 0 + * - interrupts are really disabled + * - entry.S returns immediately + * - uses TIHI (TRAP if Z==0 && C==0) #2 to really reenable interrupts + * - if taken, the trap: + * - sets ICC2.C + * - enables interrupts */ -#define local_irq_disable() \ +#define local_irq_disable() \ +do { \ + /* set Z flag, but don't change the C flag */ \ + asm volatile(" andcc gr0,gr0,gr0,icc2 \n" \ + : \ + : \ + : "memory", "icc2" \ + ); \ +} while(0) + +#define local_irq_enable() \ +do { \ + /* clear Z flag and then test the C flag */ \ + asm volatile(" oricc gr0,#1,gr0,icc2 \n" \ + " tihi icc2,gr0,#2 \n" \ + : \ + : \ + : "memory", "icc2" \ + ); \ +} while(0) + +#define local_save_flags(flags) \ +do { \ + typecheck(unsigned long, flags); \ + asm volatile("movsg ccr,%0" \ + : "=r"(flags) \ + : \ + : "memory"); \ + \ + /* shift ICC2.Z to bit 0 */ \ + flags >>= 26; \ + \ + /* make flags 1 if interrupts disabled, 0 otherwise */ \ + flags &= 1UL; \ +} while(0) + +#define irqs_disabled() \ + ({unsigned long flags; local_save_flags(flags); flags; }) + +#define local_irq_save(flags) \ +do { \ + typecheck(unsigned long, flags); \ + local_save_flags(flags); \ + local_irq_disable(); \ +} while(0) + +#define local_irq_restore(flags) \ +do { \ + typecheck(unsigned long, flags); \ + \ + /* load the Z flag by turning 1 if disabled into 0 if disabled \ + * and thus setting the Z flag but not the C flag */ \ + asm volatile(" xoricc %0,#1,gr0,icc2 \n" \ + /* then test Z=0 and C=0 */ \ + " tihi icc2,gr0,#2 \n" \ + : \ + : "r"(flags) \ + : "memory", "icc2" \ + ); \ + \ +} while(0) + +/* + * real interrupt flag manipulation + */ +#define __local_irq_disable() \ do { \ unsigned long psr; \ asm volatile(" movsg psr,%0 \n" \ @@ -53,7 +126,7 @@ do { \ : "memory"); \ } while(0) -#define local_irq_enable() \ +#define __local_irq_enable() \ do { \ unsigned long psr; \ asm volatile(" movsg psr,%0 \n" \ @@ -64,7 +137,7 @@ do { \ : "memory"); \ } while(0) -#define local_save_flags(flags) \ +#define __local_save_flags(flags) \ do { \ typecheck(unsigned long, flags); \ asm("movsg psr,%0" \ @@ -73,7 +146,7 @@ do { \ : "memory"); \ } while(0) -#define local_irq_save(flags) \ +#define __local_irq_save(flags) \ do { \ unsigned long npsr; \ typecheck(unsigned long, flags); \ @@ -86,7 +159,7 @@ do { \ : "memory"); \ } while(0) -#define local_irq_restore(flags) \ +#define __local_irq_restore(flags) \ do { \ typecheck(unsigned long, flags); \ asm volatile(" movgs %0,psr \n" \ @@ -95,7 +168,7 @@ do { \ : "memory"); \ } while(0) -#define irqs_disabled() \ +#define __irqs_disabled() \ ((__get_PSR() & PSR_PIL) >= PSR_PIL_14) /* @@ -106,7 +179,6 @@ do { \ #define rmb() asm volatile ("membar" : : :"memory") #define wmb() asm volatile ("membar" : : :"memory") #define set_mb(var, value) do { var = value; mb(); } while (0) -#define set_wmb(var, value) do { var = value; wmb(); } while (0) #define smp_mb() mb() #define smp_rmb() rmb() diff --git a/include/asm-frv/thread_info.h b/include/asm-frv/thread_info.h index b80a97f50..d66c48e6e 100644 --- a/include/asm-frv/thread_info.h +++ b/include/asm-frv/thread_info.h @@ -19,6 +19,8 @@ #include #endif +#define THREAD_SIZE 8192 + /* * low level task data that entry.S needs immediate access to * - this struct should fit entirely inside of one cache line @@ -33,7 +35,7 @@ struct thread_info { unsigned long flags; /* low level flags */ unsigned long status; /* thread-synchronous flags */ __u32 cpu; /* current CPU */ - __s32 preempt_count; /* 0 => preemptable, <0 => BUG */ + int preempt_count; /* 0 => preemptable, <0 => BUG */ mm_segment_t addr_limit; /* thread address space: 0-0xBFFFFFFF for user-thead @@ -46,19 +48,11 @@ struct thread_info { #else /* !__ASSEMBLY__ */ -/* offsets into the thread_info struct for assembly code access */ -#define TI_TASK 0x00000000 -#define TI_EXEC_DOMAIN 0x00000004 -#define TI_FLAGS 0x00000008 -#define TI_STATUS 0x0000000C -#define TI_CPU 0x00000010 -#define TI_PRE_COUNT 0x00000014 -#define TI_ADDR_LIMIT 0x00000018 -#define TI_RESTART_BLOCK 0x0000001C +#include #endif -#define PREEMPT_ACTIVE 0x4000000 +#define PREEMPT_ACTIVE 0x10000000 /* * macros/functions for gaining access to the thread information structure @@ -83,12 +77,6 @@ struct thread_info { #define init_thread_info (init_thread_union.thread_info) #define init_stack (init_thread_union.stack) -#ifdef CONFIG_SMALL_TASKS -#define THREAD_SIZE 4096 -#else -#define THREAD_SIZE 8192 -#endif - /* how to get the thread information struct from C */ register struct thread_info *__current_thread_info asm("gr15"); @@ -110,14 +98,8 @@ register struct thread_info *__current_thread_info asm("gr15"); #endif #define free_thread_info(info) kfree(info) -#define get_thread_info(ti) get_task_struct((ti)->task) -#define put_thread_info(ti) put_task_struct((ti)->task) - -#else /* !__ASSEMBLY__ */ -#define THREAD_SIZE 8192 - -#endif +#endif /* __ASSEMBLY__ */ /* * thread information flags @@ -131,6 +113,7 @@ register struct thread_info *__current_thread_info asm("gr15"); #define TIF_NEED_RESCHED 3 /* rescheduling necessary */ #define TIF_SINGLESTEP 4 /* restore singlestep on return to user mode */ #define TIF_IRET 5 /* return with iret */ +#define TIF_RESTORE_SIGMASK 6 /* restore signal mask in do_signal() */ #define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling TIF_NEED_RESCHED */ #define TIF_MEMDIE 17 /* OOM killer killed process */ @@ -140,6 +123,7 @@ register struct thread_info *__current_thread_info asm("gr15"); #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) #define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP) #define _TIF_IRET (1 << TIF_IRET) +#define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK) #define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) #define _TIF_WORK_MASK 0x0000FFFE /* work to do on interrupt/exception return */ diff --git a/include/asm-frv/tlbflush.h b/include/asm-frv/tlbflush.h index bc3462625..da3a3179a 100644 --- a/include/asm-frv/tlbflush.h +++ b/include/asm-frv/tlbflush.h @@ -12,7 +12,6 @@ #ifndef _ASM_TLBFLUSH_H #define _ASM_TLBFLUSH_H -#include #include #include diff --git a/include/asm-frv/types.h b/include/asm-frv/types.h index 1a5b6546b..1b6d1923b 100644 --- a/include/asm-frv/types.h +++ b/include/asm-frv/types.h @@ -46,7 +46,6 @@ typedef unsigned long long __u64; #ifndef __ASSEMBLY__ -#include typedef signed char s8; typedef unsigned char u8; @@ -59,14 +58,11 @@ typedef unsigned int u32; typedef signed long long s64; typedef unsigned long long u64; -typedef u64 u_quad_t; /* Dma addresses are 32-bits wide. */ typedef u32 dma_addr_t; -typedef unsigned short kmem_bufctl_t; - #endif /* __ASSEMBLY__ */ #endif /* __KERNEL__ */ diff --git a/include/asm-frv/uaccess.h b/include/asm-frv/uaccess.h index 32dc52e88..3d90e1018 100644 --- a/include/asm-frv/uaccess.h +++ b/include/asm-frv/uaccess.h @@ -22,7 +22,7 @@ #define HAVE_ARCH_UNMAPPED_AREA /* we decide where to put mmaps */ -#define __ptr(x) ((unsigned long *)(x)) +#define __ptr(x) ((unsigned long __force *)(x)) #define VERIFY_READ 0 #define VERIFY_WRITE 1 @@ -64,15 +64,9 @@ static inline int ___range_ok(unsigned long addr, unsigned long size) #define __range_ok(addr,size) ___range_ok((unsigned long) (addr), (unsigned long) (size)) -#define access_ok(type,addr,size) (__range_ok((addr), (size)) == 0) +#define access_ok(type,addr,size) (__range_ok((void __user *)(addr), (size)) == 0) #define __access_ok(addr,size) (__range_ok((addr), (size)) == 0) -/* this function will go away soon - use access_ok() / __range_ok() instead */ -static inline int __deprecated verify_area(int type, const void * addr, unsigned long size) -{ - return __range_ok(addr, size); -} - /* * The exception table consists of pairs of addresses: the first is the * address of an instruction that is allowed to fault, and the second is @@ -103,6 +97,7 @@ extern unsigned long search_exception_table(unsigned long); int __pu_err = 0; \ \ typeof(*(ptr)) __pu_val = (x); \ + __chk_user_ptr(ptr); \ \ switch (sizeof (*(ptr))) { \ case 1: \ @@ -126,7 +121,7 @@ extern unsigned long search_exception_table(unsigned long); #define put_user(x, ptr) \ ({ \ - typeof(&*ptr) _p = (ptr); \ + typeof(*(ptr)) __user *_p = (ptr); \ int _e; \ \ _e = __range_ok(_p, sizeof(*_p)); \ @@ -181,33 +176,44 @@ do { \ */ #define __get_user(x, ptr) \ ({ \ - typeof(*(ptr)) __gu_val = 0; \ int __gu_err = 0; \ + __chk_user_ptr(ptr); \ \ switch (sizeof(*(ptr))) { \ - case 1: \ + case 1: { \ + unsigned char __gu_val; \ __get_user_asm(__gu_err, __gu_val, ptr, "ub", "=r"); \ + (x) = *(__force __typeof__(*(ptr)) *) &__gu_val; \ break; \ - case 2: \ + } \ + case 2: { \ + unsigned short __gu_val; \ __get_user_asm(__gu_err, __gu_val, ptr, "uh", "=r"); \ + (x) = *(__force __typeof__(*(ptr)) *) &__gu_val; \ break; \ - case 4: \ + } \ + case 4: { \ + unsigned int __gu_val; \ __get_user_asm(__gu_err, __gu_val, ptr, "", "=r"); \ + (x) = *(__force __typeof__(*(ptr)) *) &__gu_val; \ break; \ - case 8: \ + } \ + case 8: { \ + unsigned long long __gu_val; \ __get_user_asm(__gu_err, __gu_val, ptr, "d", "=e"); \ + (x) = *(__force __typeof__(*(ptr)) *) &__gu_val; \ break; \ + } \ default: \ __gu_err = __get_user_bad(); \ break; \ } \ - (x) = __gu_val; \ __gu_err; \ }) #define get_user(x, ptr) \ ({ \ - typeof(&*ptr) _p = (ptr); \ + const typeof(*(ptr)) __user *_p = (ptr);\ int _e; \ \ _e = __range_ok(_p, sizeof(*_p)); \ @@ -254,19 +260,20 @@ do { \ /* * */ +#define ____force(x) (__force void *)(void __user *)(x) #ifdef CONFIG_MMU extern long __memset_user(void *dst, unsigned long count); extern long __memcpy_user(void *dst, const void *src, unsigned long count); -#define clear_user(dst,count) __memset_user((dst), (count)) -#define __copy_from_user_inatomic(to, from, n) __memcpy_user((to), (from), (n)) -#define __copy_to_user_inatomic(to, from, n) __memcpy_user((to), (from), (n)) +#define clear_user(dst,count) __memset_user(____force(dst), (count)) +#define __copy_from_user_inatomic(to, from, n) __memcpy_user((to), ____force(from), (n)) +#define __copy_to_user_inatomic(to, from, n) __memcpy_user(____force(to), (from), (n)) #else -#define clear_user(dst,count) (memset((dst), 0, (count)), 0) -#define __copy_from_user_inatomic(to, from, n) (memcpy((to), (from), (n)), 0) -#define __copy_to_user_inatomic(to, from, n) (memcpy((to), (from), (n)), 0) +#define clear_user(dst,count) (memset(____force(dst), 0, (count)), 0) +#define __copy_from_user_inatomic(to, from, n) (memcpy((to), ____force(from), (n)), 0) +#define __copy_to_user_inatomic(to, from, n) (memcpy(____force(to), (from), (n)), 0) #endif @@ -284,7 +291,7 @@ __copy_from_user(void *to, const void __user *from, unsigned long n) return __copy_from_user_inatomic(to, from, n); } -static inline long copy_from_user(void *to, const void *from, unsigned long n) +static inline long copy_from_user(void *to, const void __user *from, unsigned long n) { unsigned long ret = n; @@ -297,22 +304,16 @@ static inline long copy_from_user(void *to, const void *from, unsigned long n) return ret; } -static inline long copy_to_user(void *to, const void *from, unsigned long n) +static inline long copy_to_user(void __user *to, const void *from, unsigned long n) { return likely(__access_ok(to, n)) ? __copy_to_user(to, from, n) : n; } -#define copy_to_user_ret(to,from,n,retval) ({ if (copy_to_user(to,from,n)) return retval; }) -#define copy_from_user_ret(to,from,n,retval) ({ if (copy_from_user(to,from,n)) return retval; }) - -extern long strncpy_from_user(char *dst, const char *src, long count); -extern long strnlen_user(const char *src, long count); +extern long strncpy_from_user(char *dst, const char __user *src, long count); +extern long strnlen_user(const char __user *src, long count); #define strlen_user(str) strnlen_user(str, 32767) extern unsigned long search_exception_table(unsigned long addr); -#define copy_to_user_page(vma, page, vaddr, dst, src, len) memcpy(dst, src, len) -#define copy_from_user_page(vma, page, vaddr, dst, src, len) memcpy(dst, src, len) - #endif /* _ASM_UACCESS_H */ diff --git a/include/asm-frv/unaligned.h b/include/asm-frv/unaligned.h index a0d199bf0..dc8e9c9bf 100644 --- a/include/asm-frv/unaligned.h +++ b/include/asm-frv/unaligned.h @@ -12,7 +12,6 @@ #ifndef _ASM_UNALIGNED_H #define _ASM_UNALIGNED_H -#include /* * Unaligned accesses on uClinux can't be performed in a fault handler - the diff --git a/include/asm-frv/unistd.h b/include/asm-frv/unistd.h index 5cf989b44..b80dbd839 100644 --- a/include/asm-frv/unistd.h +++ b/include/asm-frv/unistd.h @@ -289,19 +289,37 @@ #define __NR_mq_timedreceive (__NR_mq_open+3) #define __NR_mq_notify (__NR_mq_open+4) #define __NR_mq_getsetattr (__NR_mq_open+5) -#define __NR_sys_kexec_load 283 +#define __NR_kexec_load 283 #define __NR_waitid 284 /* #define __NR_sys_setaltroot 285 */ #define __NR_add_key 286 #define __NR_request_key 287 #define __NR_keyctl 288 -#define __NR_vperfctr_open 289 -#define __NR_vperfctr_control (__NR_perfctr_info+1) -#define __NR_vperfctr_unlink (__NR_perfctr_info+2) -#define __NR_vperfctr_iresume (__NR_perfctr_info+3) -#define __NR_vperfctr_read (__NR_perfctr_info+4) +#define __NR_ioprio_set 289 +#define __NR_ioprio_get 290 +#define __NR_inotify_init 291 +#define __NR_inotify_add_watch 292 +#define __NR_inotify_rm_watch 293 +#define __NR_migrate_pages 294 +#define __NR_openat 295 +#define __NR_mkdirat 296 +#define __NR_mknodat 297 +#define __NR_fchownat 298 +#define __NR_futimesat 299 +#define __NR_fstatat64 300 +#define __NR_unlinkat 301 +#define __NR_renameat 302 +#define __NR_linkat 303 +#define __NR_symlinkat 304 +#define __NR_readlinkat 305 +#define __NR_fchmodat 306 +#define __NR_faccessat 307 +#define __NR_pselect6 308 +#define __NR_ppoll 309 -#define NR_syscalls 294 +#ifdef __KERNEL__ + +#define NR_syscalls 310 /* * process the return value of a syscall, consigning it to one of two possible fates @@ -313,7 +331,7 @@ do { \ unsigned long __sr2 = (res); \ if (__builtin_expect(__sr2 >= (unsigned long)(-4095), 0)) { \ errno = (-__sr2); \ - __sr2 = ULONG_MAX; \ + __sr2 = ~0UL; \ } \ return (type) __sr2; \ } while (0) @@ -442,28 +460,10 @@ type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg * some others too. */ #define __NR__exit __NR_exit -static inline _syscall0(int,pause) -static inline _syscall0(int,sync) -static inline _syscall0(pid_t,setsid) -static inline _syscall3(int,write,int,fd,const char *,buf,off_t,count) -static inline _syscall3(int,read,int,fd,char *,buf,off_t,count) -static inline _syscall3(off_t,lseek,int,fd,off_t,offset,int,count) -static inline _syscall1(int,dup,int,fd) static inline _syscall3(int,execve,const char *,file,char **,argv,char **,envp) -static inline _syscall3(int,open,const char *,file,int,flag,int,mode) -static inline _syscall1(int,close,int,fd) -static inline _syscall1(int,_exit,int,exitcode) -static inline _syscall3(pid_t,waitpid,pid_t,pid,int *,wait_stat,int,options) -static inline _syscall1(int,delete_module,const char *,name) -static inline pid_t wait(int * wait_stat) -{ - return waitpid(-1,wait_stat,0); -} +#endif /* __KERNEL_SYSCALLS__ */ -#endif - -#ifdef __KERNEL__ #define __ARCH_WANT_IPC_PARSE_VERSION /* #define __ARCH_WANT_OLD_READDIR */ #define __ARCH_WANT_OLD_STAT @@ -486,7 +486,7 @@ static inline pid_t wait(int * wait_stat) /* #define __ARCH_WANT_SYS_SIGPENDING */ #define __ARCH_WANT_SYS_SIGPROCMASK #define __ARCH_WANT_SYS_RT_SIGACTION -#endif +#define __ARCH_WANT_SYS_RT_SIGSUSPEND /* * "Conditional" syscalls @@ -498,4 +498,5 @@ static inline pid_t wait(int * wait_stat) #define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") #endif +#endif /* __KERNEL__ */ #endif /* _ASM_UNISTD_H_ */ diff --git a/include/asm-frv/virtconvert.h b/include/asm-frv/virtconvert.h index a29a0aec2..59788fa2a 100644 --- a/include/asm-frv/virtconvert.h +++ b/include/asm-frv/virtconvert.h @@ -17,7 +17,6 @@ #ifdef __KERNEL__ -#include #include #ifdef CONFIG_MMU diff --git a/include/asm-generic/bug.h b/include/asm-generic/bug.h index cce17f9ff..cc45364c2 100644 --- a/include/asm-generic/bug.h +++ b/include/asm-generic/bug.h @@ -2,7 +2,6 @@ #define _ASM_GENERIC_BUG_H #include -#include #ifndef __ASSEMBLY__ extern const char *print_tainted(void); @@ -35,12 +34,42 @@ extern const char *print_tainted(void); #endif #ifndef HAVE_ARCH_BUG_ON -#define BUG_ON(condition) do { if (condition) ; } while(0) +#define BUG_ON(condition) do { \ + if (unlikely((condition)!=0)) { \ + printk("BUGging on (%s)\n", #condition); \ + BUG(); \ + } \ +} while(0) #endif #ifndef HAVE_ARCH_WARN_ON -#define WARN_ON(condition) do { if (condition) ; } while(0) +#define WARN_ON(condition) do { \ + if (unlikely((condition)!=0)) { \ + printk("BUG: warning: (%s) at %s:%d/%s()\n", \ + #condition, __FILE__, __LINE__, __FUNCTION__); \ + dump_stack(); \ + } \ +} while (0) +#endif #endif + +#define WARN_ON_ONCE(condition) \ +({ \ + static int __warn_once = 1; \ + int __ret = 0; \ + \ + if (unlikely((condition) && __warn_once)) { \ + __warn_once = 0; \ + WARN_ON(condition); \ + __ret = 1; \ + } \ + __ret; \ +}) + +#ifdef CONFIG_SMP +# define WARN_ON_SMP(x) WARN_ON(x) +#else +# define WARN_ON_SMP(x) do { } while (0) #endif #endif diff --git a/include/asm-generic/cputime.h b/include/asm-generic/cputime.h index 6f178563e..09204e40d 100644 --- a/include/asm-generic/cputime.h +++ b/include/asm-generic/cputime.h @@ -24,7 +24,9 @@ typedef u64 cputime64_t; #define cputime64_zero (0ULL) #define cputime64_add(__a, __b) ((__a) + (__b)) +#define cputime64_sub(__a, __b) ((__a) - (__b)) #define cputime64_to_jiffies64(__ct) (__ct) +#define jiffies64_to_cputime64(__jif) (__jif) #define cputime_to_cputime64(__ct) ((u64) __ct) diff --git a/include/asm-generic/dma-mapping.h b/include/asm-generic/dma-mapping.h index 1b3562077..b541e48cc 100644 --- a/include/asm-generic/dma-mapping.h +++ b/include/asm-generic/dma-mapping.h @@ -7,7 +7,6 @@ #ifndef _ASM_GENERIC_DMA_MAPPING_H #define _ASM_GENERIC_DMA_MAPPING_H -#include #ifdef CONFIG_PCI diff --git a/include/asm-generic/fcntl.h b/include/asm-generic/fcntl.h index 3c4909d14..5aa79cd3b 100644 --- a/include/asm-generic/fcntl.h +++ b/include/asm-generic/fcntl.h @@ -1,7 +1,6 @@ #ifndef _ASM_GENERIC_FCNTL_H #define _ASM_GENERIC_FCNTL_H -#include #include /* open/fcntl - O_SYNC is only implemented on blocks devices and on files diff --git a/include/asm-generic/local.h b/include/asm-generic/local.h index 9291c24f5..ab4692972 100644 --- a/include/asm-generic/local.h +++ b/include/asm-generic/local.h @@ -1,7 +1,6 @@ #ifndef _ASM_GENERIC_LOCAL_H #define _ASM_GENERIC_LOCAL_H -#include #include #include #include diff --git a/include/asm-generic/memory_model.h b/include/asm-generic/memory_model.h index 0cfb086dd..8078cbd2c 100644 --- a/include/asm-generic/memory_model.h +++ b/include/asm-generic/memory_model.h @@ -23,29 +23,23 @@ #endif /* CONFIG_DISCONTIGMEM */ -#ifdef CONFIG_OUT_OF_LINE_PFN_TO_PAGE -struct page; -/* this is useful when inlined pfn_to_page is too big */ -extern struct page *pfn_to_page(unsigned long pfn); -extern unsigned long page_to_pfn(struct page *page); -#else /* * supports 3 memory models. */ #if defined(CONFIG_FLATMEM) -#define pfn_to_page(pfn) (mem_map + ((pfn) - ARCH_PFN_OFFSET)) -#define page_to_pfn(page) ((unsigned long)((page) - mem_map) + \ +#define __pfn_to_page(pfn) (mem_map + ((pfn) - ARCH_PFN_OFFSET)) +#define __page_to_pfn(page) ((unsigned long)((page) - mem_map) + \ ARCH_PFN_OFFSET) #elif defined(CONFIG_DISCONTIGMEM) -#define pfn_to_page(pfn) \ +#define __pfn_to_page(pfn) \ ({ unsigned long __pfn = (pfn); \ unsigned long __nid = arch_pfn_to_nid(pfn); \ NODE_DATA(__nid)->node_mem_map + arch_local_page_offset(__pfn, __nid);\ }) -#define page_to_pfn(pg) \ +#define __page_to_pfn(pg) \ ({ struct page *__pg = (pg); \ struct pglist_data *__pgdat = NODE_DATA(page_to_nid(__pg)); \ (unsigned long)(__pg - __pgdat->node_mem_map) + \ @@ -57,18 +51,27 @@ extern unsigned long page_to_pfn(struct page *page); * Note: section's mem_map is encorded to reflect its start_pfn. * section[i].section_mem_map == mem_map's address - start_pfn; */ -#define page_to_pfn(pg) \ +#define __page_to_pfn(pg) \ ({ struct page *__pg = (pg); \ int __sec = page_to_section(__pg); \ __pg - __section_mem_map_addr(__nr_to_section(__sec)); \ }) -#define pfn_to_page(pfn) \ +#define __pfn_to_page(pfn) \ ({ unsigned long __pfn = (pfn); \ struct mem_section *__sec = __pfn_to_section(__pfn); \ __section_mem_map_addr(__sec) + __pfn; \ }) #endif /* CONFIG_FLATMEM/DISCONTIGMEM/SPARSEMEM */ + +#ifdef CONFIG_OUT_OF_LINE_PFN_TO_PAGE +struct page; +/* this is useful when inlined pfn_to_page is too big */ +extern struct page *pfn_to_page(unsigned long pfn); +extern unsigned long page_to_pfn(struct page *page); +#else +#define page_to_pfn __page_to_pfn +#define pfn_to_page __pfn_to_page #endif /* CONFIG_OUT_OF_LINE_PFN_TO_PAGE */ #endif /* __ASSEMBLY__ */ diff --git a/include/asm-generic/mman.h b/include/asm-generic/mman.h index 010ced7cf..3b41d2bb7 100644 --- a/include/asm-generic/mman.h +++ b/include/asm-generic/mman.h @@ -39,10 +39,4 @@ #define MAP_ANON MAP_ANONYMOUS #define MAP_FILE 0 -#ifdef __KERNEL__ -#ifndef arch_mmap_check -#define arch_mmap_check(addr, len, flags) (0) -#endif -#endif - #endif diff --git a/include/asm-generic/mutex-null.h b/include/asm-generic/mutex-null.h index 5cf8b7ce0..254a126ed 100644 --- a/include/asm-generic/mutex-null.h +++ b/include/asm-generic/mutex-null.h @@ -10,15 +10,10 @@ #ifndef _ASM_GENERIC_MUTEX_NULL_H #define _ASM_GENERIC_MUTEX_NULL_H -/* extra parameter only needed for mutex debugging: */ -#ifndef __IP__ -# define __IP__ -#endif - -#define __mutex_fastpath_lock(count, fail_fn) fail_fn(count __RET_IP__) -#define __mutex_fastpath_lock_retval(count, fail_fn) fail_fn(count __RET_IP__) -#define __mutex_fastpath_unlock(count, fail_fn) fail_fn(count __RET_IP__) -#define __mutex_fastpath_trylock(count, fail_fn) fail_fn(count) -#define __mutex_slowpath_needs_to_unlock() 1 +#define __mutex_fastpath_lock(count, fail_fn) fail_fn(count) +#define __mutex_fastpath_lock_retval(count, fail_fn) fail_fn(count) +#define __mutex_fastpath_unlock(count, fail_fn) fail_fn(count) +#define __mutex_fastpath_trylock(count, fail_fn) fail_fn(count) +#define __mutex_slowpath_needs_to_unlock() 1 #endif diff --git a/include/asm-generic/percpu.h b/include/asm-generic/percpu.h index c0caf433a..e160e0429 100644 --- a/include/asm-generic/percpu.h +++ b/include/asm-generic/percpu.h @@ -7,6 +7,8 @@ extern unsigned long __per_cpu_offset[NR_CPUS]; +#define per_cpu_offset(x) (__per_cpu_offset[x]) + /* Separate out the type, so (int[3], foo) works. */ #define DEFINE_PER_CPU(type, name) \ __attribute__((__section__(".data.percpu"))) __typeof__(type) per_cpu__##name @@ -14,6 +16,7 @@ extern unsigned long __per_cpu_offset[NR_CPUS]; /* var is in discarded region: offset to particular copy we want */ #define per_cpu(var, cpu) (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset[cpu])) #define __get_cpu_var(var) per_cpu(var, smp_processor_id()) +#define __raw_get_cpu_var(var) per_cpu(var, raw_smp_processor_id()) /* A macro to avoid #include hell... */ #define percpu_modcopy(pcpudst, src, size) \ @@ -30,6 +33,7 @@ do { \ #define per_cpu(var, cpu) (*((void)(cpu), &per_cpu__##var)) #define __get_cpu_var(var) per_cpu__##var +#define __raw_get_cpu_var(var) per_cpu__##var #endif /* SMP */ diff --git a/include/asm-generic/rtc.h b/include/asm-generic/rtc.h index cef08db34..4087037a4 100644 --- a/include/asm-generic/rtc.h +++ b/include/asm-generic/rtc.h @@ -114,6 +114,7 @@ static inline unsigned int get_rtc_time(struct rtc_time *time) /* Set the current date and time in the real time clock. */ static inline int set_rtc_time(struct rtc_time *time) { + unsigned long flags; unsigned char mon, day, hrs, min, sec; unsigned char save_control, save_freq_select; unsigned int yrs; @@ -131,7 +132,7 @@ static inline int set_rtc_time(struct rtc_time *time) if (yrs > 255) /* They are unsigned */ return -EINVAL; - spin_lock_irq(&rtc_lock); + spin_lock_irqsave(&rtc_lock, flags); #ifdef CONFIG_MACH_DECSTATION real_yrs = yrs; leap_yr = ((!((yrs + 1900) % 4) && ((yrs + 1900) % 100)) || @@ -152,7 +153,7 @@ static inline int set_rtc_time(struct rtc_time *time) * whether the chip is in binary mode or not. */ if (yrs > 169) { - spin_unlock_irq(&rtc_lock); + spin_unlock_irqrestore(&rtc_lock, flags); return -EINVAL; } @@ -187,7 +188,7 @@ static inline int set_rtc_time(struct rtc_time *time) CMOS_WRITE(save_control, RTC_CONTROL); CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT); - spin_unlock_irq(&rtc_lock); + spin_unlock_irqrestore(&rtc_lock, flags); return 0; } diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h index 0b49f9e07..962cad7cf 100644 --- a/include/asm-generic/sections.h +++ b/include/asm-generic/sections.h @@ -14,5 +14,6 @@ extern char _end[]; extern char __per_cpu_start[], __per_cpu_end[]; extern char __kprobes_text_start[], __kprobes_text_end[]; extern char __initdata_begin[], __initdata_end[]; +extern char __start_rodata[], __end_rodata[]; #endif /* _ASM_GENERIC_SECTIONS_H_ */ diff --git a/include/asm-generic/signal.h b/include/asm-generic/signal.h index 9418d6e9b..dae1d8720 100644 --- a/include/asm-generic/signal.h +++ b/include/asm-generic/signal.h @@ -1,3 +1,8 @@ +#ifndef __ASM_GENERIC_SIGNAL_H +#define __ASM_GENERIC_SIGNAL_H + +#include + #ifndef SIG_BLOCK #define SIG_BLOCK 0 /* for blocking signals */ #endif @@ -19,3 +24,5 @@ typedef __restorefn_t __user *__sigrestore_t; #define SIG_IGN ((__force __sighandler_t)1) /* ignore signal */ #define SIG_ERR ((__force __sighandler_t)-1) /* error return from signal */ #endif + +#endif /* __ASM_GENERIC_SIGNAL_H */ diff --git a/include/asm-generic/tlb.h b/include/asm-generic/tlb.h index 8dbedfa92..e119e193d 100644 --- a/include/asm-generic/tlb.h +++ b/include/asm-generic/tlb.h @@ -13,7 +13,6 @@ #ifndef _ASM_GENERIC__TLB_H #define _ASM_GENERIC__TLB_H -#include #include #include #include diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 9d11550b4..253ae1328 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -58,6 +58,20 @@ VMLINUX_SYMBOL(__stop___ksymtab_gpl) = .; \ } \ \ + /* Kernel symbol table: Normal unused symbols */ \ + __ksymtab_unused : AT(ADDR(__ksymtab_unused) - LOAD_OFFSET) { \ + VMLINUX_SYMBOL(__start___ksymtab_unused) = .; \ + *(__ksymtab_unused) \ + VMLINUX_SYMBOL(__stop___ksymtab_unused) = .; \ + } \ + \ + /* Kernel symbol table: GPL-only unused symbols */ \ + __ksymtab_unused_gpl : AT(ADDR(__ksymtab_unused_gpl) - LOAD_OFFSET) { \ + VMLINUX_SYMBOL(__start___ksymtab_unused_gpl) = .; \ + *(__ksymtab_unused_gpl) \ + VMLINUX_SYMBOL(__stop___ksymtab_unused_gpl) = .; \ + } \ + \ /* Kernel symbol table: GPL-future-only symbols */ \ __ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - LOAD_OFFSET) { \ VMLINUX_SYMBOL(__start___ksymtab_gpl_future) = .; \ @@ -79,6 +93,20 @@ VMLINUX_SYMBOL(__stop___kcrctab_gpl) = .; \ } \ \ + /* Kernel symbol table: Normal unused symbols */ \ + __kcrctab_unused : AT(ADDR(__kcrctab_unused) - LOAD_OFFSET) { \ + VMLINUX_SYMBOL(__start___kcrctab_unused) = .; \ + *(__kcrctab_unused) \ + VMLINUX_SYMBOL(__stop___kcrctab_unused) = .; \ + } \ + \ + /* Kernel symbol table: GPL-only unused symbols */ \ + __kcrctab_unused_gpl : AT(ADDR(__kcrctab_unused_gpl) - LOAD_OFFSET) { \ + VMLINUX_SYMBOL(__start___kcrctab_unused_gpl) = .; \ + *(__kcrctab_unused_gpl) \ + VMLINUX_SYMBOL(__stop___kcrctab_unused_gpl) = .; \ + } \ + \ /* Kernel symbol table: GPL-future-only symbols */ \ __kcrctab_gpl_future : AT(ADDR(__kcrctab_gpl_future) - LOAD_OFFSET) { \ VMLINUX_SYMBOL(__start___kcrctab_gpl_future) = .; \ @@ -166,3 +194,6 @@ .stab.index 0 : { *(.stab.index) } \ .stab.indexstr 0 : { *(.stab.indexstr) } \ .comment 0 : { *(.comment) } + +#define NOTES \ + .notes : { *(.note.*) } :note diff --git a/include/asm-h8300/bitops.h b/include/asm-h8300/bitops.h index 574f57b6c..d76299c98 100644 --- a/include/asm-h8300/bitops.h +++ b/include/asm-h8300/bitops.h @@ -6,7 +6,6 @@ * Copyright 2002, Yoshinori Sato */ -#include #include #include diff --git a/include/asm-h8300/dma.h b/include/asm-h8300/dma.h index 3708681b7..3edbaaaed 100644 --- a/include/asm-h8300/dma.h +++ b/include/asm-h8300/dma.h @@ -1,7 +1,6 @@ #ifndef _H8300_DMA_H #define _H8300_DMA_H -#include /* * Set number of channels of DMA on ColdFire for different implementations. diff --git a/include/asm-h8300/elf.h b/include/asm-h8300/elf.h index f4af1553a..7ba6a0af4 100644 --- a/include/asm-h8300/elf.h +++ b/include/asm-h8300/elf.h @@ -5,7 +5,6 @@ * ELF register definitions.. */ -#include #include #include diff --git a/include/asm-h8300/hardirq.h b/include/asm-h8300/hardirq.h index e961bfe20..18fa7931e 100644 --- a/include/asm-h8300/hardirq.h +++ b/include/asm-h8300/hardirq.h @@ -2,7 +2,6 @@ #define __H8300_HARDIRQ_H #include -#include #include #include #include diff --git a/include/asm-h8300/io.h b/include/asm-h8300/io.h index 1773e373e..91b7487cb 100644 --- a/include/asm-h8300/io.h +++ b/include/asm-h8300/io.h @@ -3,7 +3,6 @@ #ifdef __KERNEL__ -#include #include #if defined(CONFIG_H83007) || defined(CONFIG_H83068) diff --git a/include/asm-h8300/irq.h b/include/asm-h8300/irq.h index 73065f5bd..42a3ac424 100644 --- a/include/asm-h8300/irq.h +++ b/include/asm-h8300/irq.h @@ -63,8 +63,4 @@ extern void enable_irq(unsigned int); extern void disable_irq(unsigned int); #define disable_irq_nosync(x) disable_irq(x) -struct irqaction; -struct pt_regs; -int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *); - #endif /* _H8300_IRQ_H_ */ diff --git a/include/asm-h8300/keyboard.h b/include/asm-h8300/keyboard.h index b05d11387..fbad65e8a 100644 --- a/include/asm-h8300/keyboard.h +++ b/include/asm-h8300/keyboard.h @@ -7,7 +7,6 @@ #ifndef _H8300_KEYBOARD_H #define _H8300_KEYBOARD_H -#include /* dummy i.e. no real keyboard */ #define kbd_setkeycode(x...) (-ENOSYS) diff --git a/include/asm-h8300/mmu_context.h b/include/asm-h8300/mmu_context.h index 23b555b7b..855721a5d 100644 --- a/include/asm-h8300/mmu_context.h +++ b/include/asm-h8300/mmu_context.h @@ -1,7 +1,6 @@ #ifndef __H8300_MMU_CONTEXT_H #define __H8300_MMU_CONTEXT_H -#include #include #include #include diff --git a/include/asm-h8300/page.h b/include/asm-h8300/page.h index b9ff136c5..f3299755a 100644 --- a/include/asm-h8300/page.h +++ b/include/asm-h8300/page.h @@ -1,7 +1,7 @@ #ifndef _H8300_PAGE_H #define _H8300_PAGE_H -#include +#ifdef __KERNEL__ /* PAGE_SHIFT determines the page size */ @@ -9,8 +9,6 @@ #define PAGE_SIZE (1UL << PAGE_SHIFT) #define PAGE_MASK (~(PAGE_SIZE-1)) -#ifdef __KERNEL__ - #include #ifndef __ASSEMBLY__ @@ -67,7 +65,6 @@ extern unsigned long memory_end; #define MAP_NR(addr) (((unsigned long)(addr)-PAGE_OFFSET) >> PAGE_SHIFT) #define virt_to_page(addr) (mem_map + (((unsigned long)(addr)-PAGE_OFFSET) >> PAGE_SHIFT)) -#define virt_to_page(addr) (mem_map + (((unsigned long)(addr)-PAGE_OFFSET) >> PAGE_SHIFT)) #define page_to_virt(page) ((((page) - mem_map) << PAGE_SHIFT) + PAGE_OFFSET) #define pfn_valid(page) (page < max_mapnr) @@ -78,11 +75,11 @@ extern unsigned long memory_end; #endif /* __ASSEMBLY__ */ +#include +#include + #define devmem_is_allowed(x) 1 #endif /* __KERNEL__ */ -#include -#include - #endif /* _H8300_PAGE_H */ diff --git a/include/asm-h8300/page_offset.h b/include/asm-h8300/page_offset.h index 8cc6e1721..f87064630 100644 --- a/include/asm-h8300/page_offset.h +++ b/include/asm-h8300/page_offset.h @@ -1,4 +1,3 @@ -#include #define PAGE_OFFSET_RAW 0x00000000 diff --git a/include/asm-h8300/param.h b/include/asm-h8300/param.h index 126dddf72..c25806ed1 100644 --- a/include/asm-h8300/param.h +++ b/include/asm-h8300/param.h @@ -1,7 +1,6 @@ #ifndef _H8300_PARAM_H #define _H8300_PARAM_H -#include #ifndef HZ #define HZ 100 diff --git a/include/asm-h8300/pgtable.h b/include/asm-h8300/pgtable.h index f6e296fc1..8b7c68579 100644 --- a/include/asm-h8300/pgtable.h +++ b/include/asm-h8300/pgtable.h @@ -3,7 +3,6 @@ #include -#include #include #include #include diff --git a/include/asm-h8300/processor.h b/include/asm-h8300/processor.h index c6f0a7108..99b664aa2 100644 --- a/include/asm-h8300/processor.h +++ b/include/asm-h8300/processor.h @@ -17,7 +17,7 @@ */ #define current_text_addr() ({ __label__ _l; _l: &&_l;}) -#include +#include #include #include #include @@ -130,6 +130,6 @@ unsigned long get_wchan(struct task_struct *p); eip; }) #define KSTK_ESP(tsk) ((tsk) == current ? rdusp() : (tsk)->thread.usp) -#define cpu_relax() do { } while (0) +#define cpu_relax() barrier() #endif diff --git a/include/asm-h8300/semaphore-helper.h b/include/asm-h8300/semaphore-helper.h index 29e0fbf1a..4fea36be5 100644 --- a/include/asm-h8300/semaphore-helper.h +++ b/include/asm-h8300/semaphore-helper.h @@ -10,7 +10,6 @@ * m68k version by Andreas Schwab */ -#include #include /* diff --git a/include/asm-h8300/shm.h b/include/asm-h8300/shm.h index bec758524..ed6623c05 100644 --- a/include/asm-h8300/shm.h +++ b/include/asm-h8300/shm.h @@ -1,7 +1,6 @@ #ifndef _H8300_SHM_H #define _H8300_SHM_H -#include /* format of page table entries that correspond to shared memory pages currently out in swap space (see also mm/swap.c): diff --git a/include/asm-h8300/signal.h b/include/asm-h8300/signal.h index 8eccdc176..7bc15048a 100644 --- a/include/asm-h8300/signal.h +++ b/include/asm-h8300/signal.h @@ -74,7 +74,6 @@ typedef unsigned long sigset_t; * SA_FLAGS values: * * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. * SA_RESETHAND clears the handler when the signal is delivered. @@ -94,7 +93,6 @@ typedef unsigned long sigset_t; #define SA_NOMASK SA_NODEFER #define SA_ONESHOT SA_RESETHAND -#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ #define SA_RESTORER 0x04000000 diff --git a/include/asm-h8300/socket.h b/include/asm-h8300/socket.h index d98cf85ba..ebc830fee 100644 --- a/include/asm-h8300/socket.h +++ b/include/asm-h8300/socket.h @@ -48,5 +48,6 @@ #define SO_ACCEPTCONN 30 #define SO_PEERSEC 31 +#define SO_PASSSEC 34 #endif /* _ASM_SOCKET_H */ diff --git a/include/asm-h8300/system.h b/include/asm-h8300/system.h index 8e81cf665..5084a9d42 100644 --- a/include/asm-h8300/system.h +++ b/include/asm-h8300/system.h @@ -1,7 +1,6 @@ #ifndef _H8300_SYSTEM_H #define _H8300_SYSTEM_H -#include /* get configuration macros */ #include /* @@ -85,7 +84,6 @@ asmlinkage void resume(void); #define wmb() asm volatile ("" : : :"memory") #define set_rmb(var, value) do { xchg(&var, value); } while (0) #define set_mb(var, value) set_rmb(var, value) -#define set_wmb(var, value) do { var = value; wmb(); } while (0) #ifdef CONFIG_SMP #define smp_mb() mb() diff --git a/include/asm-h8300/unaligned.h b/include/asm-h8300/unaligned.h index 8a9396117..ffb67f472 100644 --- a/include/asm-h8300/unaligned.h +++ b/include/asm-h8300/unaligned.h @@ -1,7 +1,6 @@ #ifndef __H8300_UNALIGNED_H #define __H8300_UNALIGNED_H -#include /* Use memmove here, so gcc does not insert a __builtin_memcpy. */ diff --git a/include/asm-h8300/unistd.h b/include/asm-h8300/unistd.h index adb051593..226dd596c 100644 --- a/include/asm-h8300/unistd.h +++ b/include/asm-h8300/unistd.h @@ -292,6 +292,8 @@ #define __NR_request_key 287 #define __NR_keyctl 288 +#ifdef __KERNEL__ + #define NR_syscalls 289 @@ -460,7 +462,6 @@ type name(atype a, btype b, ctype c, dtype d, etype e, ftype f) \ __syscall_return(type, __res); \ } -#ifdef __KERNEL__ #define __ARCH_WANT_IPC_PARSE_VERSION #define __ARCH_WANT_OLD_READDIR #define __ARCH_WANT_OLD_STAT @@ -483,7 +484,6 @@ type name(atype a, btype b, ctype c, dtype d, etype e, ftype f) \ #define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPROCMASK #define __ARCH_WANT_SYS_RT_SIGACTION -#endif #ifdef __KERNEL_SYSCALLS__ @@ -534,7 +534,7 @@ asmlinkage long sys_rt_sigaction(int sig, struct sigaction __user *oact, size_t sigsetsize); -#endif +#endif /* __KERNEL_SYSCALLS__ */ /* * "Conditional" syscalls @@ -543,4 +543,5 @@ asmlinkage long sys_rt_sigaction(int sig, asm (".weak\t_" #name "\n" \ ".set\t_" #name ",_sys_ni_syscall"); +#endif /* __KERNEL__ */ #endif /* _ASM_H8300_UNISTD_H_ */ diff --git a/include/asm-h8300/virtconvert.h b/include/asm-h8300/virtconvert.h index 3b344c1df..ee7d5ea10 100644 --- a/include/asm-h8300/virtconvert.h +++ b/include/asm-h8300/virtconvert.h @@ -7,7 +7,6 @@ #ifdef __KERNEL__ -#include #include #include diff --git a/include/asm-i386/alternative.h b/include/asm-i386/alternative.h index d79e9ee10..b01a7ec40 100644 --- a/include/asm-i386/alternative.h +++ b/include/asm-i386/alternative.h @@ -5,6 +5,8 @@ #include +#include + struct alt_instr { u8 *instr; /* original instruction */ u8 *replacement; @@ -17,11 +19,19 @@ struct alt_instr { extern void apply_alternatives(struct alt_instr *start, struct alt_instr *end); struct module; +#ifdef CONFIG_SMP extern void alternatives_smp_module_add(struct module *mod, char *name, void *locks, void *locks_end, void *text, void *text_end); extern void alternatives_smp_module_del(struct module *mod); extern void alternatives_smp_switch(int smp); +#else +static inline void alternatives_smp_module_add(struct module *mod, char *name, + void *locks, void *locks_end, + void *text, void *text_end) {} +static inline void alternatives_smp_module_del(struct module *mod) {} +static inline void alternatives_smp_switch(int smp) {} +#endif #endif @@ -78,9 +88,6 @@ extern void alternatives_smp_switch(int smp); /* * Alternative inline assembly for SMP. * - * alternative_smp() takes two versions (SMP first, UP second) and is - * for more complex stuff such as spinlocks. - * * The LOCK_PREFIX macro defined here replaces the LOCK and * LOCK_PREFIX macros used everywhere in the source tree. * @@ -100,21 +107,6 @@ extern void alternatives_smp_switch(int smp); */ #ifdef CONFIG_SMP -#define alternative_smp(smpinstr, upinstr, args...) \ - asm volatile ("661:\n\t" smpinstr "\n662:\n" \ - ".section .smp_altinstructions,\"a\"\n" \ - " .align 4\n" \ - " .long 661b\n" /* label */ \ - " .long 663f\n" /* new instruction */ \ - " .byte 0x68\n" /* X86_FEATURE_UP */ \ - " .byte 662b-661b\n" /* sourcelen */ \ - " .byte 664f-663f\n" /* replacementlen */ \ - ".previous\n" \ - ".section .smp_altinstr_replacement,\"awx\"\n" \ - "663:\n\t" upinstr "\n" /* replacement */ \ - "664:\n\t.fill 662b-661b,1,0x42\n" /* space for original */ \ - ".previous" : args) - #define LOCK_PREFIX \ ".section .smp_locks,\"a\"\n" \ " .align 4\n" \ @@ -123,8 +115,6 @@ extern void alternatives_smp_switch(int smp); "661:\n\tlock; " #else /* ! CONFIG_SMP */ -#define alternative_smp(smpinstr, upinstr, args...) \ - asm volatile (upinstr : args) #define LOCK_PREFIX "" #endif diff --git a/include/asm-i386/apic.h b/include/asm-i386/apic.h index 87476de38..cc5419495 100644 --- a/include/asm-i386/apic.h +++ b/include/asm-i386/apic.h @@ -1,7 +1,6 @@ #ifndef __ASM_APIC_H #define __ASM_APIC_H -#include #include #include #include @@ -112,24 +111,12 @@ extern void init_apic_mappings (void); extern void smp_local_timer_interrupt (struct pt_regs * regs); extern void setup_boot_APIC_clock (void); extern void setup_secondary_APIC_clock (void); -extern void setup_apic_nmi_watchdog (void); -extern int reserve_lapic_nmi(void); -extern void release_lapic_nmi(void); -extern void disable_timer_nmi_watchdog(void); -extern void enable_timer_nmi_watchdog(void); -extern void nmi_watchdog_tick (struct pt_regs * regs); extern int APIC_init_uniprocessor (void); extern void disable_APIC_timer(void); extern void enable_APIC_timer(void); extern void enable_NMI_through_LVT0 (void * dummy); -extern unsigned int nmi_watchdog; -#define NMI_NONE 0 -#define NMI_IO_APIC 1 -#define NMI_LOCAL_APIC 2 -#define NMI_INVALID 3 - extern int disable_timer_pin_1; #ifndef CONFIG_XEN @@ -141,7 +128,7 @@ void switch_ipi_to_APIC_timer(void *cpumask); extern int timer_over_8254; -extern int modern_apic(void); +extern void dmi_check_apic(void); #else /* !CONFIG_X86_LOCAL_APIC */ static inline void lapic_shutdown(void) { } diff --git a/include/asm-i386/apicdef.h b/include/asm-i386/apicdef.h index 5e4a35af2..9f6995341 100644 --- a/include/asm-i386/apicdef.h +++ b/include/asm-i386/apicdef.h @@ -121,7 +121,6 @@ */ #define u32 unsigned int -#define lapic ((volatile struct local_apic *)APIC_BASE) struct local_apic { diff --git a/include/asm-i386/atomic.h b/include/asm-i386/atomic.h index 4ddce5296..51a166242 100644 --- a/include/asm-i386/atomic.h +++ b/include/asm-i386/atomic.h @@ -1,7 +1,6 @@ #ifndef __ARCH_I386_ATOMIC__ #define __ARCH_I386_ATOMIC__ -#include #include #include @@ -47,8 +46,8 @@ static __inline__ void atomic_add(int i, atomic_t *v) { __asm__ __volatile__( LOCK_PREFIX "addl %1,%0" - :"=m" (v->counter) - :"ir" (i), "m" (v->counter)); + :"+m" (v->counter) + :"ir" (i)); } /** @@ -62,8 +61,8 @@ static __inline__ void atomic_sub(int i, atomic_t *v) { __asm__ __volatile__( LOCK_PREFIX "subl %1,%0" - :"=m" (v->counter) - :"ir" (i), "m" (v->counter)); + :"+m" (v->counter) + :"ir" (i)); } /** @@ -81,8 +80,8 @@ static __inline__ int atomic_sub_and_test(int i, atomic_t *v) __asm__ __volatile__( LOCK_PREFIX "subl %2,%0; sete %1" - :"=m" (v->counter), "=qm" (c) - :"ir" (i), "m" (v->counter) : "memory"); + :"+m" (v->counter), "=qm" (c) + :"ir" (i) : "memory"); return c; } @@ -96,8 +95,7 @@ static __inline__ void atomic_inc(atomic_t *v) { __asm__ __volatile__( LOCK_PREFIX "incl %0" - :"=m" (v->counter) - :"m" (v->counter)); + :"+m" (v->counter)); } /** @@ -110,8 +108,7 @@ static __inline__ void atomic_dec(atomic_t *v) { __asm__ __volatile__( LOCK_PREFIX "decl %0" - :"=m" (v->counter) - :"m" (v->counter)); + :"+m" (v->counter)); } /** @@ -128,8 +125,8 @@ static __inline__ int atomic_dec_and_test(atomic_t *v) __asm__ __volatile__( LOCK_PREFIX "decl %0; sete %1" - :"=m" (v->counter), "=qm" (c) - :"m" (v->counter) : "memory"); + :"+m" (v->counter), "=qm" (c) + : : "memory"); return c != 0; } @@ -147,8 +144,8 @@ static __inline__ int atomic_inc_and_test(atomic_t *v) __asm__ __volatile__( LOCK_PREFIX "incl %0; sete %1" - :"=m" (v->counter), "=qm" (c) - :"m" (v->counter) : "memory"); + :"+m" (v->counter), "=qm" (c) + : : "memory"); return c != 0; } @@ -167,8 +164,8 @@ static __inline__ int atomic_add_negative(int i, atomic_t *v) __asm__ __volatile__( LOCK_PREFIX "addl %2,%0; sets %1" - :"=m" (v->counter), "=qm" (c) - :"ir" (i), "m" (v->counter) : "memory"); + :"+m" (v->counter), "=qm" (c) + :"ir" (i) : "memory"); return c; } diff --git a/include/asm-i386/bitops.h b/include/asm-i386/bitops.h index 08deaeee6..1c780fa1e 100644 --- a/include/asm-i386/bitops.h +++ b/include/asm-i386/bitops.h @@ -5,7 +5,6 @@ * Copyright 1992, Linus Torvalds. */ -#include #include #include diff --git a/include/asm-i386/bug.h b/include/asm-i386/bug.h index 8f79de19e..8062cdbf2 100644 --- a/include/asm-i386/bug.h +++ b/include/asm-i386/bug.h @@ -1,7 +1,6 @@ #ifndef _I386_BUG_H #define _I386_BUG_H -#include /* * Tell the user there is some problem. diff --git a/include/asm-i386/bugs.h b/include/asm-i386/bugs.h index 50233e034..2a9e4ee59 100644 --- a/include/asm-i386/bugs.h +++ b/include/asm-i386/bugs.h @@ -17,7 +17,6 @@ * void check_bugs(void); */ -#include #include #include #include diff --git a/include/asm-i386/byteorder.h b/include/asm-i386/byteorder.h index a0d73f48d..a45470a8b 100644 --- a/include/asm-i386/byteorder.h +++ b/include/asm-i386/byteorder.h @@ -8,7 +8,6 @@ /* For avoiding bswap on i386 */ #ifdef __KERNEL__ -#include #endif static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x) diff --git a/include/asm-i386/cache.h b/include/asm-i386/cache.h index ca15c9c66..57c62f414 100644 --- a/include/asm-i386/cache.h +++ b/include/asm-i386/cache.h @@ -4,7 +4,6 @@ #ifndef __ARCH_I386_CACHE_H #define __ARCH_I386_CACHE_H -#include /* L1 cache line size */ #define L1_CACHE_SHIFT (CONFIG_X86_L1_CACHE_SHIFT) diff --git a/include/asm-i386/cpu.h b/include/asm-i386/cpu.h index e7252c216..b1bc7b1b6 100644 --- a/include/asm-i386/cpu.h +++ b/include/asm-i386/cpu.h @@ -7,8 +7,6 @@ #include #include -#include - struct i386_cpu { struct cpu cpu; }; diff --git a/include/asm-i386/cpufeature.h b/include/asm-i386/cpufeature.h index b44bfc623..d314ebb3d 100644 --- a/include/asm-i386/cpufeature.h +++ b/include/asm-i386/cpufeature.h @@ -72,6 +72,7 @@ #define X86_FEATURE_CONSTANT_TSC (3*32+ 8) /* TSC ticks at a constant rate */ #define X86_FEATURE_UP (3*32+ 9) /* smp kernel running on up */ #define X86_FEATURE_FXSAVE_LEAK (3*32+10) /* FXSAVE leaks FOP/FIP/FOP */ +#define X86_FEATURE_ARCH_PERFMON (3*32+11) /* Intel Architectural PerfMon */ /* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */ #define X86_FEATURE_XMM3 (4*32+ 0) /* Streaming SIMD Extensions-3 */ @@ -88,6 +89,12 @@ #define X86_FEATURE_XSTORE_EN (5*32+ 3) /* on-CPU RNG enabled */ #define X86_FEATURE_XCRYPT (5*32+ 6) /* on-CPU crypto (xcrypt insn) */ #define X86_FEATURE_XCRYPT_EN (5*32+ 7) /* on-CPU crypto enabled */ +#define X86_FEATURE_ACE2 (5*32+ 8) /* Advanced Cryptography Engine v2 */ +#define X86_FEATURE_ACE2_EN (5*32+ 9) /* ACE v2 enabled */ +#define X86_FEATURE_PHE (5*32+ 10) /* PadLock Hash Engine */ +#define X86_FEATURE_PHE_EN (5*32+ 11) /* PHE enabled */ +#define X86_FEATURE_PMM (5*32+ 12) /* PadLock Montgomery Multiplier */ +#define X86_FEATURE_PMM_EN (5*32+ 13) /* PMM enabled */ /* More extended AMD flags: CPUID level 0x80000001, ecx, word 6 */ #define X86_FEATURE_LAHF_LM (6*32+ 0) /* LAHF/SAHF in long mode */ @@ -121,6 +128,12 @@ #define cpu_has_xstore_enabled boot_cpu_has(X86_FEATURE_XSTORE_EN) #define cpu_has_xcrypt boot_cpu_has(X86_FEATURE_XCRYPT) #define cpu_has_xcrypt_enabled boot_cpu_has(X86_FEATURE_XCRYPT_EN) +#define cpu_has_ace2 boot_cpu_has(X86_FEATURE_ACE2) +#define cpu_has_ace2_enabled boot_cpu_has(X86_FEATURE_ACE2_EN) +#define cpu_has_phe boot_cpu_has(X86_FEATURE_PHE) +#define cpu_has_phe_enabled boot_cpu_has(X86_FEATURE_PHE_EN) +#define cpu_has_pmm boot_cpu_has(X86_FEATURE_PMM) +#define cpu_has_pmm_enabled boot_cpu_has(X86_FEATURE_PMM_EN) #endif /* __ASM_I386_CPUFEATURE_H */ diff --git a/include/asm-i386/delay.h b/include/asm-i386/delay.h index 456db8501..b1c7650dc 100644 --- a/include/asm-i386/delay.h +++ b/include/asm-i386/delay.h @@ -23,4 +23,6 @@ extern void __delay(unsigned long loops); ((n) > 20000 ? __bad_ndelay() : __const_udelay((n) * 5ul)) : \ __ndelay(n)) +void use_tsc_delay(void); + #endif /* defined(_I386_DELAY_H) */ diff --git a/include/asm-i386/dma.h b/include/asm-i386/dma.h index f24b2bba2..d23aac8e1 100644 --- a/include/asm-i386/dma.h +++ b/include/asm-i386/dma.h @@ -8,7 +8,6 @@ #ifndef _ASM_DMA_H #define _ASM_DMA_H -#include #include /* And spinlocks */ #include /* need byte IO */ #include diff --git a/include/asm-i386/elf.h b/include/asm-i386/elf.h index ffef1f337..f3de7f3b3 100644 --- a/include/asm-i386/elf.h +++ b/include/asm-i386/elf.h @@ -7,10 +7,7 @@ #include #include -#include -#include /* for savesegment */ #include -#include #include @@ -48,6 +45,12 @@ typedef struct user_fxsr_struct elf_fpxregset_t; #define ELF_DATA ELFDATA2LSB #define ELF_ARCH EM_386 +#ifdef __KERNEL__ + +#include +#include /* for savesegment */ +#include + /* SVR4/i386 ABI (pages 3-31, 3-32) says that when the program starts %edx contains a pointer to a function which might be registered using `atexit'. This provides a mean for the dynamic linker to call DT_FINI functions for @@ -111,7 +114,6 @@ typedef struct user_fxsr_struct elf_fpxregset_t; #define ELF_PLATFORM (vx_new_uts(machine)) -#ifdef __KERNEL__ #define SET_PERSONALITY(ex, ibcs2) do { } while (0) /* @@ -130,31 +132,44 @@ extern int dump_task_extended_fpu (struct task_struct *, struct user_fxsr_struct #define ELF_CORE_COPY_FPREGS(tsk, elf_fpregs) dump_task_fpu(tsk, elf_fpregs) #define ELF_CORE_COPY_XFPREGS(tsk, elf_xfpregs) dump_task_extended_fpu(tsk, elf_xfpregs) +#define VDSO_HIGH_BASE (__fix_to_virt(FIX_VDSO)) +#define VDSO_BASE ((unsigned long)current->mm->context.vdso) + +#ifdef CONFIG_COMPAT_VDSO +# define VDSO_COMPAT_BASE VDSO_HIGH_BASE +# define VDSO_PRELINK VDSO_HIGH_BASE +#else +# define VDSO_COMPAT_BASE VDSO_BASE +# define VDSO_PRELINK 0 +#endif + +#define VDSO_COMPAT_SYM(x) \ + (VDSO_COMPAT_BASE + (unsigned long)(x) - VDSO_PRELINK) + +#define VDSO_SYM(x) \ + (VDSO_BASE + (unsigned long)(x) - VDSO_PRELINK) + +#define VDSO_HIGH_EHDR ((const struct elfhdr *) VDSO_HIGH_BASE) +#define VDSO_EHDR ((const struct elfhdr *) VDSO_COMPAT_BASE) + extern void __kernel_vsyscall; -#define VSYSCALL_BASE ((unsigned long)current->mm->context.vdso) -#define VSYSCALL_EHDR ((const struct elfhdr *) VSYSCALL_BASE) -#define VSYSCALL_OFFSET ((unsigned long) &__kernel_vsyscall) -#define VSYSCALL_ENTRY (VSYSCALL_BASE + VSYSCALL_OFFSET) - -/* kernel-internal fixmap address: */ -#define __VSYSCALL_BASE (__fix_to_virt(FIX_VSYSCALL)) -#define __VSYSCALL_EHDR ((const struct elfhdr *) __VSYSCALL_BASE) - -#define ARCH_DLINFO \ -do { \ - if (VSYSCALL_BASE) { \ - NEW_AUX_ENT(AT_SYSINFO, VSYSCALL_ENTRY); \ - NEW_AUX_ENT(AT_SYSINFO_EHDR, VSYSCALL_BASE); \ - } \ -} while (0) + +#define VDSO_ENTRY VDSO_SYM(&__kernel_vsyscall) #define ARCH_HAS_SETUP_ADDITIONAL_PAGES struct linux_binprm; extern int arch_setup_additional_pages(struct linux_binprm *bprm, - int executable_stack, unsigned long start_code, - unsigned long interp_map_address); + int executable_stack, unsigned long start_code, + unsigned long interp_map_address); + +extern unsigned int vdso_enabled; + +#define ARCH_DLINFO \ +do if (vdso_enabled) { \ + NEW_AUX_ENT(AT_SYSINFO, VDSO_ENTRY); \ + NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_COMPAT_BASE); \ +} while (0) -#if 0 /* Disabled for exec-shield, where a normal vma holds the vDSO. */ /* * These macros parameterize elf_core_dump in fs/binfmt_elf.c to write out * extra segments containing the vsyscall DSO contents. Dumping its @@ -163,15 +178,15 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, * Dumping its extra ELF program headers includes all the other information * a debugger needs to easily find how the vsyscall DSO was being used. */ -#define ELF_CORE_EXTRA_PHDRS (__VSYSCALL_EHDR->e_phnum) +#define ELF_CORE_EXTRA_PHDRS (VDSO_HIGH_EHDR->e_phnum) #define ELF_CORE_WRITE_EXTRA_PHDRS \ do { \ const struct elf_phdr *const vsyscall_phdrs = \ - (const struct elf_phdr *) (__VSYSCALL_BASE \ - + __VSYSCALL_EHDR->e_phoff); \ + (const struct elf_phdr *) (VDSO_HIGH_BASE \ + + VDSO_HIGH_EHDR->e_phoff); \ int i; \ Elf32_Off ofs = 0; \ - for (i = 0; i < __VSYSCALL_EHDR->e_phnum; ++i) { \ + for (i = 0; i < VDSO_HIGH_EHDR->e_phnum; ++i) { \ struct elf_phdr phdr = vsyscall_phdrs[i]; \ if (phdr.p_type == PT_LOAD) { \ BUG_ON(ofs != 0); \ @@ -189,23 +204,19 @@ do { \ #define ELF_CORE_WRITE_EXTRA_DATA \ do { \ const struct elf_phdr *const vsyscall_phdrs = \ - (const struct elf_phdr *) (__VSYSCALL_BASE \ - + __VSYSCALL_EHDR->e_phoff); \ + (const struct elf_phdr *) (VDSO_HIGH_BASE \ + + VDSO_HIGH_EHDR->e_phoff); \ int i; \ - for (i = 0; i < __VSYSCALL_EHDR->e_phnum; ++i) { \ + for (i = 0; i < VDSO_HIGH_EHDR->e_phnum; ++i) { \ if (vsyscall_phdrs[i].p_type == PT_LOAD) \ DUMP_WRITE((void *) vsyscall_phdrs[i].p_vaddr, \ PAGE_ALIGN(vsyscall_phdrs[i].p_memsz)); \ } \ } while (0) -#endif #endif #define __HAVE_ARCH_RANDOMIZE_BRK extern void randomize_brk(unsigned long old_brk); -#define __HAVE_ARCH_VSYSCALL -extern void map_vsyscall(void); - #endif diff --git a/include/asm-i386/fixmap.h b/include/asm-i386/fixmap.h index f11513aa9..591c5536f 100644 --- a/include/asm-i386/fixmap.h +++ b/include/asm-i386/fixmap.h @@ -13,14 +13,14 @@ #ifndef _ASM_FIXMAP_H #define _ASM_FIXMAP_H -#include /* used by vmalloc.c, vsyscall.lds.S. * * Leave one empty page between vmalloc'ed areas and * the start of the fixmap. */ -extern unsigned long __FIXADDR_TOP; + +#define __FIXADDR_TOP 0xfffff000 #ifndef __ASSEMBLY__ #include @@ -52,7 +52,7 @@ extern unsigned long __FIXADDR_TOP; */ enum fixed_addresses { FIX_HOLE, - FIX_VSYSCALL, + FIX_VDSO, #ifdef CONFIG_X86_LOCAL_APIC FIX_APIC_BASE, /* local (CPU) APIC) -- required for SMP or not */ #endif @@ -95,8 +95,6 @@ enum fixed_addresses { extern void __set_fixmap (enum fixed_addresses idx, unsigned long phys, pgprot_t flags); -extern void set_fixaddr_top(unsigned long top); - #define set_fixmap(idx, phys) \ __set_fixmap(idx, phys, PAGE_KERNEL) /* @@ -118,14 +116,6 @@ extern void set_fixaddr_top(unsigned long top); #define __fix_to_virt(x) (FIXADDR_TOP - ((x) << PAGE_SHIFT)) #define __virt_to_fix(x) ((FIXADDR_TOP - ((x)&PAGE_MASK)) >> PAGE_SHIFT) -/* - * This is the range that is readable by user mode, and things - * acting like user mode such as get_user_pages. - */ -#define FIXADDR_USER_START (__fix_to_virt(FIX_VSYSCALL)) -#define FIXADDR_USER_END (FIXADDR_USER_START + PAGE_SIZE) - - extern void __this_fixmap_does_not_exist(void); /* diff --git a/include/asm-i386/floppy.h b/include/asm-i386/floppy.h index 03403045c..359ead60b 100644 --- a/include/asm-i386/floppy.h +++ b/include/asm-i386/floppy.h @@ -144,12 +144,11 @@ static int vdma_get_dma_residue(unsigned int dummy) static int fd_request_irq(void) { if(can_use_virtual_dma) - return request_irq(FLOPPY_IRQ, floppy_hardint,SA_INTERRUPT, - "floppy", NULL); + return request_irq(FLOPPY_IRQ, floppy_hardint, + IRQF_DISABLED, "floppy", NULL); else return request_irq(FLOPPY_IRQ, floppy_interrupt, - SA_INTERRUPT|SA_SAMPLE_RANDOM, - "floppy", NULL); + IRQF_DISABLED, "floppy", NULL); } diff --git a/include/asm-i386/futex.h b/include/asm-i386/futex.h index 7b8ceefd0..946d97cfe 100644 --- a/include/asm-i386/futex.h +++ b/include/asm-i386/futex.h @@ -20,8 +20,8 @@ .align 8\n\ .long 1b,3b\n\ .previous" \ - : "=r" (oldval), "=r" (ret), "=m" (*uaddr) \ - : "i" (-EFAULT), "m" (*uaddr), "0" (oparg), "1" (0)) + : "=r" (oldval), "=r" (ret), "+m" (*uaddr) \ + : "i" (-EFAULT), "0" (oparg), "1" (0)) #define __futex_atomic_op2(insn, ret, oldval, uaddr, oparg) \ __asm__ __volatile ( \ @@ -38,9 +38,9 @@ .align 8\n\ .long 1b,4b,2b,4b\n\ .previous" \ - : "=&a" (oldval), "=&r" (ret), "=m" (*uaddr), \ + : "=&a" (oldval), "=&r" (ret), "+m" (*uaddr), \ "=&r" (tem) \ - : "r" (oparg), "i" (-EFAULT), "m" (*uaddr), "1" (0)) + : "r" (oparg), "i" (-EFAULT), "1" (0)) static inline int futex_atomic_op_inuser (int encoded_op, int __user *uaddr) @@ -123,7 +123,7 @@ futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) " .long 1b,3b \n" " .previous \n" - : "=a" (oldval), "=m" (*uaddr) + : "=a" (oldval), "+m" (*uaddr) : "i" (-EFAULT), "r" (newval), "0" (oldval) : "memory" ); diff --git a/include/asm-i386/hardirq.h b/include/asm-i386/hardirq.h index ee754d359..0e358dc40 100644 --- a/include/asm-i386/hardirq.h +++ b/include/asm-i386/hardirq.h @@ -1,7 +1,6 @@ #ifndef __ASM_HARDIRQ_H #define __ASM_HARDIRQ_H -#include #include #include diff --git a/include/asm-i386/highmem.h b/include/asm-i386/highmem.h index 0fd331306..e9a34ebc2 100644 --- a/include/asm-i386/highmem.h +++ b/include/asm-i386/highmem.h @@ -20,7 +20,6 @@ #ifdef __KERNEL__ -#include #include #include #include diff --git a/include/asm-i386/hpet.h b/include/asm-i386/hpet.h index 7f1a8a6ee..af5d43551 100644 --- a/include/asm-i386/hpet.h +++ b/include/asm-i386/hpet.h @@ -27,7 +27,6 @@ #include #include -#include #include diff --git a/include/asm-i386/hw_irq.h b/include/asm-i386/hw_irq.h index 622815bf3..87e5a351d 100644 --- a/include/asm-i386/hw_irq.h +++ b/include/asm-i386/hw_irq.h @@ -12,7 +12,6 @@ * */ -#include #include #include #include @@ -20,6 +19,8 @@ struct hw_interrupt_type; +#define NMI_VECTOR 0x02 + /* * Various low-level irq details needed by irq.c, process.c, * time.c, io_apic.c and smp.c @@ -68,14 +69,4 @@ extern atomic_t irq_mis_count; #define IO_APIC_IRQ(x) (((x) >= 16) || ((1<<(x)) & io_apic_irqs)) -#if defined(CONFIG_X86_IO_APIC) -static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) -{ - if (IO_APIC_IRQ(i)) - send_IPI_self(IO_APIC_VECTOR(i)); -} -#else -static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) {} -#endif - #endif /* _ASM_HW_IRQ_H */ diff --git a/include/asm-i386/i387.h b/include/asm-i386/i387.h index bc1d6edae..6838ce6c8 100644 --- a/include/asm-i386/i387.h +++ b/include/asm-i386/i387.h @@ -126,17 +126,12 @@ extern int save_i387( struct _fpstate __user *buf ); extern int restore_i387( struct _fpstate __user *buf ); /* - * ptrace request handers... + * ptrace request handlers... */ -extern int get_fpregs( struct user_i387_struct __user *buf, - struct task_struct *tsk ); -extern int set_fpregs( struct task_struct *tsk, - struct user_i387_struct __user *buf ); - -extern int get_fpxregs( struct user_fxsr_struct __user *buf, - struct task_struct *tsk ); -extern int set_fpxregs( struct task_struct *tsk, - struct user_fxsr_struct __user *buf ); +extern int get_fpregs(struct user_i387_struct *, struct task_struct *); +extern int set_fpregs(struct task_struct *, const struct user_i387_struct *); +extern void updated_fpxregs(struct task_struct *tsk); + /* * FPU state for core dumps... diff --git a/include/asm-i386/ide.h b/include/asm-i386/ide.h index 454440193..73465d289 100644 --- a/include/asm-i386/ide.h +++ b/include/asm-i386/ide.h @@ -13,7 +13,6 @@ #ifdef __KERNEL__ -#include #ifndef MAX_HWIFS # ifdef CONFIG_BLK_DEV_IDEPCI diff --git a/include/asm-i386/io.h b/include/asm-i386/io.h index 79670bb4b..b3724fe93 100644 --- a/include/asm-i386/io.h +++ b/include/asm-i386/io.h @@ -1,7 +1,6 @@ #ifndef _ASM_IO_H #define _ASM_IO_H -#include #include #include diff --git a/include/asm-i386/io_apic.h b/include/asm-i386/io_apic.h index d92e253f7..5092e819b 100644 --- a/include/asm-i386/io_apic.h +++ b/include/asm-i386/io_apic.h @@ -1,7 +1,6 @@ #ifndef __ASM_IO_APIC_H #define __ASM_IO_APIC_H -#include #include #include diff --git a/include/asm-i386/irq.h b/include/asm-i386/irq.h index 5169d7af4..331726b41 100644 --- a/include/asm-i386/irq.h +++ b/include/asm-i386/irq.h @@ -10,7 +10,6 @@ * */ -#include #include /* include comes from machine specific directory */ #include "irq_vectors.h" diff --git a/include/asm-i386/kdebug.h b/include/asm-i386/kdebug.h index 96d0828ce..d18cdb9fc 100644 --- a/include/asm-i386/kdebug.h +++ b/include/asm-i386/kdebug.h @@ -19,6 +19,8 @@ struct die_args { extern int register_die_notifier(struct notifier_block *); extern int unregister_die_notifier(struct notifier_block *); +extern int register_page_fault_notifier(struct notifier_block *); +extern int unregister_page_fault_notifier(struct notifier_block *); extern struct atomic_notifier_head i386die_chain; diff --git a/include/asm-i386/kmap_types.h b/include/asm-i386/kmap_types.h index 6886a0c3f..806aae3c5 100644 --- a/include/asm-i386/kmap_types.h +++ b/include/asm-i386/kmap_types.h @@ -1,7 +1,6 @@ #ifndef _ASM_KMAP_TYPES_H #define _ASM_KMAP_TYPES_H -#include #ifdef CONFIG_DEBUG_HIGHMEM # define D(n) __KM_FENCE_##n , diff --git a/include/asm-i386/kprobes.h b/include/asm-i386/kprobes.h index 57d157c5c..8774d0668 100644 --- a/include/asm-i386/kprobes.h +++ b/include/asm-i386/kprobes.h @@ -44,6 +44,8 @@ typedef u8 kprobe_opcode_t; #define JPROBE_ENTRY(pentry) (kprobe_opcode_t *)pentry #define ARCH_SUPPORTS_KRETPROBES +#define ARCH_INACTIVE_KPROBE_COUNT 0 +#define flush_insn_slot(p) do { } while (0) void arch_remove_kprobe(struct kprobe *p); void kretprobe_trampoline(void); diff --git a/include/asm-i386/local.h b/include/asm-i386/local.h index e67fa0826..12060e22f 100644 --- a/include/asm-i386/local.h +++ b/include/asm-i386/local.h @@ -17,32 +17,30 @@ static __inline__ void local_inc(local_t *v) { __asm__ __volatile__( "incl %0" - :"=m" (v->counter) - :"m" (v->counter)); + :"+m" (v->counter)); } static __inline__ void local_dec(local_t *v) { __asm__ __volatile__( "decl %0" - :"=m" (v->counter) - :"m" (v->counter)); + :"+m" (v->counter)); } static __inline__ void local_add(long i, local_t *v) { __asm__ __volatile__( "addl %1,%0" - :"=m" (v->counter) - :"ir" (i), "m" (v->counter)); + :"+m" (v->counter) + :"ir" (i)); } static __inline__ void local_sub(long i, local_t *v) { __asm__ __volatile__( "subl %1,%0" - :"=m" (v->counter) - :"ir" (i), "m" (v->counter)); + :"+m" (v->counter) + :"ir" (i)); } /* On x86, these are no better than the atomic variants. */ @@ -55,12 +53,26 @@ static __inline__ void local_sub(long i, local_t *v) * much more efficient than these naive implementations. Note they take * a variable, not an address. */ -#define cpu_local_read(v) local_read(&__get_cpu_var(v)) -#define cpu_local_set(v, i) local_set(&__get_cpu_var(v), (i)) -#define cpu_local_inc(v) local_inc(&__get_cpu_var(v)) -#define cpu_local_dec(v) local_dec(&__get_cpu_var(v)) -#define cpu_local_add(i, v) local_add((i), &__get_cpu_var(v)) -#define cpu_local_sub(i, v) local_sub((i), &__get_cpu_var(v)) + +/* Need to disable preemption for the cpu local counters otherwise we could + still access a variable of a previous CPU in a non atomic way. */ +#define cpu_local_wrap_v(v) \ + ({ local_t res__; \ + preempt_disable(); \ + res__ = (v); \ + preempt_enable(); \ + res__; }) +#define cpu_local_wrap(v) \ + ({ preempt_disable(); \ + v; \ + preempt_enable(); }) \ + +#define cpu_local_read(v) cpu_local_wrap_v(local_read(&__get_cpu_var(v))) +#define cpu_local_set(v, i) cpu_local_wrap(local_set(&__get_cpu_var(v), (i))) +#define cpu_local_inc(v) cpu_local_wrap(local_inc(&__get_cpu_var(v))) +#define cpu_local_dec(v) cpu_local_wrap(local_dec(&__get_cpu_var(v))) +#define cpu_local_add(i, v) cpu_local_wrap(local_add((i), &__get_cpu_var(v))) +#define cpu_local_sub(i, v) cpu_local_wrap(local_sub((i), &__get_cpu_var(v))) #define __cpu_local_inc(v) cpu_local_inc(v) #define __cpu_local_dec(v) cpu_local_dec(v) diff --git a/include/asm-i386/mach-default/mach_ipi.h b/include/asm-i386/mach-default/mach_ipi.h index a1d0072e3..0dba244c8 100644 --- a/include/asm-i386/mach-default/mach_ipi.h +++ b/include/asm-i386/mach-default/mach_ipi.h @@ -1,6 +1,9 @@ #ifndef __ASM_MACH_IPI_H #define __ASM_MACH_IPI_H +/* Avoid include hell */ +#define NMI_VECTOR 0x02 + void send_IPI_mask_bitmask(cpumask_t mask, int vector); void __send_IPI_shortcut(unsigned int shortcut, int vector); @@ -13,7 +16,7 @@ static inline void send_IPI_mask(cpumask_t mask, int vector) static inline void __local_send_IPI_allbutself(int vector) { - if (no_broadcast) { + if (no_broadcast || vector == NMI_VECTOR) { cpumask_t mask = cpu_online_map; cpu_clear(smp_processor_id(), mask); @@ -24,7 +27,7 @@ static inline void __local_send_IPI_allbutself(int vector) static inline void __local_send_IPI_all(int vector) { - if (no_broadcast) + if (no_broadcast || vector == NMI_VECTOR) send_IPI_mask(cpu_online_map, vector); else __send_IPI_shortcut(APIC_DEST_ALLINC, vector); diff --git a/include/asm-i386/mach-default/mach_mpspec.h b/include/asm-i386/mach-default/mach_mpspec.h index 6b5dadcf1..51c9a9775 100644 --- a/include/asm-i386/mach-default/mach_mpspec.h +++ b/include/asm-i386/mach-default/mach_mpspec.h @@ -3,6 +3,10 @@ #define MAX_IRQ_SOURCES 256 +#if CONFIG_BASE_SMALL == 0 +#define MAX_MP_BUSSES 256 +#else #define MAX_MP_BUSSES 32 +#endif #endif /* __ASM_MACH_MPSPEC_H */ diff --git a/include/asm-i386/mach-default/mach_timer.h b/include/asm-i386/mach-default/mach_timer.h index 4b9703bb0..807992fd4 100644 --- a/include/asm-i386/mach-default/mach_timer.h +++ b/include/asm-i386/mach-default/mach_timer.h @@ -15,7 +15,9 @@ #ifndef _MACH_TIMER_H #define _MACH_TIMER_H -#define CALIBRATE_LATCH (5 * LATCH) +#define CALIBRATE_TIME_MSEC 30 /* 30 msecs */ +#define CALIBRATE_LATCH \ + ((CLOCK_TICK_RATE * CALIBRATE_TIME_MSEC + 1000/2)/1000) static inline void mach_prepare_counter(void) { diff --git a/include/asm-i386/mach-default/setup_arch_post.h b/include/asm-i386/mach-default/setup_arch_post.h deleted file mode 100644 index 2fc488872..000000000 --- a/include/asm-i386/mach-default/setup_arch_post.h +++ /dev/null @@ -1,40 +0,0 @@ -/** - * machine_specific_memory_setup - Hook for machine specific memory setup. - * - * Description: - * This is included late in kernel/setup.c so that it can make - * use of all of the static functions. - **/ - -static char * __init machine_specific_memory_setup(void) -{ - char *who; - - - who = "BIOS-e820"; - - /* - * Try to copy the BIOS-supplied E820-map. - * - * Otherwise fake a memory map; one section from 0k->640k, - * the next section from 1mb->appropriate_mem_k - */ - sanitize_e820_map(E820_MAP, &E820_MAP_NR); - if (copy_e820_map(E820_MAP, E820_MAP_NR) < 0) { - unsigned long mem_size; - - /* compare results from other methods and take the greater */ - if (ALT_MEM_K < EXT_MEM_K) { - mem_size = EXT_MEM_K; - who = "BIOS-88"; - } else { - mem_size = ALT_MEM_K; - who = "BIOS-e801"; - } - - e820.nr_map = 0; - add_memory_region(0, LOWMEMSIZE(), E820_RAM); - add_memory_region(HIGH_MEMORY, mem_size << 10, E820_RAM); - } - return who; -} diff --git a/include/asm-i386/mach-default/setup_arch_pre.h b/include/asm-i386/mach-default/setup_arch_pre.h deleted file mode 100644 index fb42099e7..000000000 --- a/include/asm-i386/mach-default/setup_arch_pre.h +++ /dev/null @@ -1,5 +0,0 @@ -/* Hook to call BIOS initialisation function */ - -/* no action for generic */ - -#define ARCH_SETUP diff --git a/include/asm-i386/mach-summit/mach_apic.h b/include/asm-i386/mach-summit/mach_apic.h index 3d6d12937..9fd073286 100644 --- a/include/asm-i386/mach-summit/mach_apic.h +++ b/include/asm-i386/mach-summit/mach_apic.h @@ -1,7 +1,6 @@ #ifndef __ASM_MACH_APIC_H #define __ASM_MACH_APIC_H -#include #include #define esr_disable (1) diff --git a/include/asm-i386/mach-summit/mach_mpparse.h b/include/asm-i386/mach-summit/mach_mpparse.h index 1cce2b924..942683991 100644 --- a/include/asm-i386/mach-summit/mach_mpparse.h +++ b/include/asm-i386/mach-summit/mach_mpparse.h @@ -2,6 +2,7 @@ #define __ASM_MACH_MPPARSE_H #include +#include extern int use_cyclone; @@ -29,6 +30,7 @@ static inline int mps_oem_check(struct mp_config_table *mpc, char *oem, (!strncmp(productid, "VIGIL SMP", 9) || !strncmp(productid, "EXA", 3) || !strncmp(productid, "RUTHLESS SMP", 12))){ + mark_tsc_unstable(); use_cyclone = 1; /*enable cyclone-timer*/ setup_summit(); return 1; @@ -42,6 +44,7 @@ static inline int acpi_madt_oem_check(char *oem_id, char *oem_table_id) if (!strncmp(oem_id, "IBM", 3) && (!strncmp(oem_table_id, "SERVIGIL", 8) || !strncmp(oem_table_id, "EXA", 3))){ + mark_tsc_unstable(); use_cyclone = 1; /*enable cyclone-timer*/ setup_summit(); return 1; diff --git a/include/asm-i386/mach-visws/setup_arch_post.h b/include/asm-i386/mach-visws/setup_arch_post.h deleted file mode 100644 index cdbd895a5..000000000 --- a/include/asm-i386/mach-visws/setup_arch_post.h +++ /dev/null @@ -1,49 +0,0 @@ -/* Hook for machine specific memory setup. - * - * This is included late in kernel/setup.c so that it can make use of all of - * the static functions. */ - -#define MB (1024 * 1024) - -unsigned long sgivwfb_mem_phys; -unsigned long sgivwfb_mem_size; - -long long mem_size __initdata = 0; - -static char * __init machine_specific_memory_setup(void) -{ - long long gfx_mem_size = 8 * MB; - - mem_size = ALT_MEM_K; - - if (!mem_size) { - printk(KERN_WARNING "Bootloader didn't set memory size, upgrade it !\n"); - mem_size = 128 * MB; - } - - /* - * this hardcodes the graphics memory to 8 MB - * it really should be sized dynamically (or at least - * set as a boot param) - */ - if (!sgivwfb_mem_size) { - printk(KERN_WARNING "Defaulting to 8 MB framebuffer size\n"); - sgivwfb_mem_size = 8 * MB; - } - - /* - * Trim to nearest MB - */ - sgivwfb_mem_size &= ~((1 << 20) - 1); - sgivwfb_mem_phys = mem_size - gfx_mem_size; - - add_memory_region(0, LOWMEMSIZE(), E820_RAM); - add_memory_region(HIGH_MEMORY, mem_size - sgivwfb_mem_size - HIGH_MEMORY, E820_RAM); - add_memory_region(sgivwfb_mem_phys, sgivwfb_mem_size, E820_RESERVED); - - return "PROM"; - - /* Remove gcc warnings */ - (void) sanitize_e820_map(NULL, NULL); - (void) copy_e820_map(NULL, 0); -} diff --git a/include/asm-i386/mach-visws/setup_arch_pre.h b/include/asm-i386/mach-visws/setup_arch_pre.h deleted file mode 100644 index b92d6d9a4..000000000 --- a/include/asm-i386/mach-visws/setup_arch_pre.h +++ /dev/null @@ -1,5 +0,0 @@ -/* Hook to call BIOS initialisation function */ - -/* no action for visws */ - -#define ARCH_SETUP diff --git a/include/asm-i386/mach-voyager/setup_arch_post.h b/include/asm-i386/mach-voyager/setup_arch_post.h deleted file mode 100644 index f6f6c2cbc..000000000 --- a/include/asm-i386/mach-voyager/setup_arch_post.h +++ /dev/null @@ -1,73 +0,0 @@ -/* Hook for machine specific memory setup. - * - * This is included late in kernel/setup.c so that it can make use of all of - * the static functions. */ - -static char * __init machine_specific_memory_setup(void) -{ - char *who; - - who = "NOT VOYAGER"; - - if(voyager_level == 5) { - __u32 addr, length; - int i; - - who = "Voyager-SUS"; - - e820.nr_map = 0; - for(i=0; voyager_memory_detect(i, &addr, &length); i++) { - add_memory_region(addr, length, E820_RAM); - } - return who; - } else if(voyager_level == 4) { - __u32 tom; - __u16 catbase = inb(VOYAGER_SSPB_RELOCATION_PORT)<<8; - /* select the DINO config space */ - outb(VOYAGER_DINO, VOYAGER_CAT_CONFIG_PORT); - /* Read DINO top of memory register */ - tom = ((inb(catbase + 0x4) & 0xf0) << 16) - + ((inb(catbase + 0x5) & 0x7f) << 24); - - if(inb(catbase) != VOYAGER_DINO) { - printk(KERN_ERR "Voyager: Failed to get DINO for L4, setting tom to EXT_MEM_K\n"); - tom = (EXT_MEM_K)<<10; - } - who = "Voyager-TOM"; - add_memory_region(0, 0x9f000, E820_RAM); - /* map from 1M to top of memory */ - add_memory_region(1*1024*1024, tom - 1*1024*1024, E820_RAM); - /* FIXME: Should check the ASICs to see if I need to - * take out the 8M window. Just do it at the moment - * */ - add_memory_region(8*1024*1024, 8*1024*1024, E820_RESERVED); - return who; - } - - who = "BIOS-e820"; - - /* - * Try to copy the BIOS-supplied E820-map. - * - * Otherwise fake a memory map; one section from 0k->640k, - * the next section from 1mb->appropriate_mem_k - */ - sanitize_e820_map(E820_MAP, &E820_MAP_NR); - if (copy_e820_map(E820_MAP, E820_MAP_NR) < 0) { - unsigned long mem_size; - - /* compare results from other methods and take the greater */ - if (ALT_MEM_K < EXT_MEM_K) { - mem_size = EXT_MEM_K; - who = "BIOS-88"; - } else { - mem_size = ALT_MEM_K; - who = "BIOS-e801"; - } - - e820.nr_map = 0; - add_memory_region(0, LOWMEMSIZE(), E820_RAM); - add_memory_region(HIGH_MEMORY, mem_size << 10, E820_RAM); - } - return who; -} diff --git a/include/asm-i386/mach-voyager/setup_arch_pre.h b/include/asm-i386/mach-voyager/setup_arch_pre.h deleted file mode 100644 index 48f7e6ff4..000000000 --- a/include/asm-i386/mach-voyager/setup_arch_pre.h +++ /dev/null @@ -1,10 +0,0 @@ -#include -#define VOYAGER_BIOS_INFO ((struct voyager_bios_info *)(PARAM+0x40)) - -/* Hook to call BIOS initialisation function */ - -/* for voyager, pass the voyager BIOS/SUS info area to the detection - * routines */ - -#define ARCH_SETUP voyager_detect(VOYAGER_BIOS_INFO); - diff --git a/include/asm-i386/mach-xen/setup_arch_post.h b/include/asm-i386/mach-xen/setup_arch_post.h deleted file mode 100644 index 0f1caa060..000000000 --- a/include/asm-i386/mach-xen/setup_arch_post.h +++ /dev/null @@ -1,101 +0,0 @@ -/** - * machine_specific_memory_setup - Hook for machine specific memory setup. - * - * Description: - * This is included late in kernel/setup.c so that it can make - * use of all of the static functions. - **/ - -#include -#include - -static char * __init machine_specific_memory_setup(void) -{ - int rc; - struct xen_memory_map memmap; - /* - * This is rather large for a stack variable but this early in - * the boot process we know we have plenty slack space. - */ - struct e820entry map[E820MAX]; - - memmap.nr_entries = E820MAX; - set_xen_guest_handle(memmap.buffer, map); - - rc = HYPERVISOR_memory_op(XENMEM_memory_map, &memmap); - if ( rc == -ENOSYS ) { - memmap.nr_entries = 1; - map[0].addr = 0ULL; - map[0].size = PFN_PHYS(xen_start_info->nr_pages); - /* 8MB slack (to balance backend allocations). */ - map[0].size += 8ULL << 20; - map[0].type = E820_RAM; - rc = 0; - } - BUG_ON(rc); - - sanitize_e820_map(map, (char *)&memmap.nr_entries); - - BUG_ON(copy_e820_map(map, (char)memmap.nr_entries) < 0); - - return "Xen"; -} - -extern void hypervisor_callback(void); -extern void failsafe_callback(void); -extern void nmi(void); - -unsigned long *machine_to_phys_mapping; -EXPORT_SYMBOL(machine_to_phys_mapping); -unsigned int machine_to_phys_order; -EXPORT_SYMBOL(machine_to_phys_order); - -static void __init machine_specific_arch_setup(void) -{ - int ret; - struct xen_machphys_mapping mapping; - unsigned long machine_to_phys_nr_ents; - struct xen_platform_parameters pp; - struct callback_register event = { - .type = CALLBACKTYPE_event, - .address = { __KERNEL_CS, (unsigned long)hypervisor_callback }, - }; - struct callback_register failsafe = { - .type = CALLBACKTYPE_failsafe, - .address = { __KERNEL_CS, (unsigned long)failsafe_callback }, - }; - struct callback_register nmi_cb = { - .type = CALLBACKTYPE_nmi, - .address = { __KERNEL_CS, (unsigned long)nmi }, - }; - - ret = HYPERVISOR_callback_op(CALLBACKOP_register, &event); - if (ret == 0) - ret = HYPERVISOR_callback_op(CALLBACKOP_register, &failsafe); - if (ret == -ENOSYS) - ret = HYPERVISOR_set_callbacks( - event.address.cs, event.address.eip, - failsafe.address.cs, failsafe.address.eip); - BUG_ON(ret); - - ret = HYPERVISOR_callback_op(CALLBACKOP_register, &nmi_cb); - if (ret == -ENOSYS) { - struct xennmi_callback cb; - - cb.handler_address = nmi_cb.address.eip; - HYPERVISOR_nmi_op(XENNMI_register_callback, &cb); - } - - if (HYPERVISOR_xen_version(XENVER_platform_parameters, - &pp) == 0) - set_fixaddr_top(pp.virt_start - PAGE_SIZE); - - machine_to_phys_mapping = (unsigned long *)MACH2PHYS_VIRT_START; - machine_to_phys_nr_ents = MACH2PHYS_NR_ENTRIES; - if (HYPERVISOR_memory_op(XENMEM_machphys_mapping, &mapping) == 0) { - machine_to_phys_mapping = (unsigned long *)mapping.v_start; - machine_to_phys_nr_ents = mapping.max_mfn + 1; - } - while ((1UL << machine_to_phys_order) < machine_to_phys_nr_ents ) - machine_to_phys_order++; -} diff --git a/include/asm-i386/mach-xen/setup_arch_pre.h b/include/asm-i386/mach-xen/setup_arch_pre.h deleted file mode 100644 index b18df6896..000000000 --- a/include/asm-i386/mach-xen/setup_arch_pre.h +++ /dev/null @@ -1,5 +0,0 @@ -/* Hook to call BIOS initialisation function */ - -#define ARCH_SETUP machine_specific_arch_setup(); - -static void __init machine_specific_arch_setup(void); diff --git a/include/asm-i386/mmu.h b/include/asm-i386/mmu.h index 17c6b085b..049f32e68 100644 --- a/include/asm-i386/mmu.h +++ b/include/asm-i386/mmu.h @@ -7,7 +7,6 @@ * we put the segment information here. * * cpu_vm_mask is used to optimize ldt flushing. - * * exec_limit is used to track the range PROT_EXEC * mappings span. */ diff --git a/include/asm-i386/mmu_context.h b/include/asm-i386/mmu_context.h index bf0821835..62b7bf184 100644 --- a/include/asm-i386/mmu_context.h +++ b/include/asm-i386/mmu_context.h @@ -1,7 +1,6 @@ #ifndef __I386_SCHED_H #define __I386_SCHED_H -#include #include #include #include diff --git a/include/asm-i386/mmzone.h b/include/asm-i386/mmzone.h index e33e9f9e4..22cb07cc8 100644 --- a/include/asm-i386/mmzone.h +++ b/include/asm-i386/mmzone.h @@ -14,7 +14,7 @@ extern struct pglist_data *node_data[]; #ifdef CONFIG_X86_NUMAQ #include -#else /* summit or generic arch */ +#elif defined(CONFIG_ACPI_SRAT)/* summit or generic arch */ #include #endif diff --git a/include/asm-i386/msi.h b/include/asm-i386/msi.h index f041d4495..b11c4b7df 100644 --- a/include/asm-i386/msi.h +++ b/include/asm-i386/msi.h @@ -9,7 +9,15 @@ #include #include -#define LAST_DEVICE_VECTOR 232 +#define LAST_DEVICE_VECTOR (FIRST_SYSTEM_VECTOR - 1) #define MSI_TARGET_CPU_SHIFT 12 +extern struct msi_ops msi_apic_ops; + +static inline int msi_arch_init(void) +{ + msi_register(&msi_apic_ops); + return 0; +} + #endif /* ASM_MSI_H */ diff --git a/include/asm-i386/mtrr.h b/include/asm-i386/mtrr.h index 64cf937c7..07f063ae2 100644 --- a/include/asm-i386/mtrr.h +++ b/include/asm-i386/mtrr.h @@ -23,7 +23,6 @@ #ifndef _LINUX_MTRR_H #define _LINUX_MTRR_H -#include #include #include @@ -77,6 +76,8 @@ extern int mtrr_add_page (unsigned long base, unsigned long size, extern int mtrr_del (int reg, unsigned long base, unsigned long size); extern int mtrr_del_page (int reg, unsigned long base, unsigned long size); extern void mtrr_centaur_report_mcr(int mcr, u32 lo, u32 hi); +extern void mtrr_ap_init(void); +extern void mtrr_bp_init(void); # else static __inline__ int mtrr_add (unsigned long base, unsigned long size, unsigned int type, char increment) @@ -101,6 +102,8 @@ static __inline__ int mtrr_del_page (int reg, unsigned long base, static __inline__ void mtrr_centaur_report_mcr(int mcr, u32 lo, u32 hi) {;} +#define mtrr_ap_init() do {} while (0) +#define mtrr_bp_init() do {} while (0) # endif #endif diff --git a/include/asm-i386/nmi.h b/include/asm-i386/nmi.h index 21f16638f..67d994799 100644 --- a/include/asm-i386/nmi.h +++ b/include/asm-i386/nmi.h @@ -5,24 +5,38 @@ #define ASM_NMI_H #include - + struct pt_regs; - + typedef int (*nmi_callback_t)(struct pt_regs * regs, int cpu); - -/** + +/** * set_nmi_callback * * Set a handler for an NMI. Only one handler may be * set. Return 1 if the NMI was handled. */ void set_nmi_callback(nmi_callback_t callback); - -/** + +/** * unset_nmi_callback * * Remove the handler previously set. */ void unset_nmi_callback(void); - + +extern void setup_apic_nmi_watchdog (void); +extern int reserve_lapic_nmi(void); +extern void release_lapic_nmi(void); +extern void disable_timer_nmi_watchdog(void); +extern void enable_timer_nmi_watchdog(void); +extern void nmi_watchdog_tick (struct pt_regs * regs); + +extern unsigned int nmi_watchdog; +#define NMI_DEFAULT -1 +#define NMI_NONE 0 +#define NMI_IO_APIC 1 +#define NMI_LOCAL_APIC 2 +#define NMI_INVALID 3 + #endif /* ASM_NMI_H */ diff --git a/include/asm-i386/node.h b/include/asm-i386/node.h deleted file mode 100644 index e13c6ffa7..000000000 --- a/include/asm-i386/node.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef _ASM_I386_NODE_H_ -#define _ASM_I386_NODE_H_ - -#include -#include -#include -#include -#include - -struct i386_node { - struct node node; -}; -extern struct i386_node node_devices[MAX_NUMNODES]; - -static inline int arch_register_node(int num){ - int p_node; - struct node *parent = NULL; - - if (!node_online(num)) - return 0; - p_node = parent_node(num); - - if (p_node != num) - parent = &node_devices[p_node].node; - - return register_node(&node_devices[num].node, num, parent); -} - -#endif /* _ASM_I386_NODE_H_ */ diff --git a/include/asm-i386/page.h b/include/asm-i386/page.h index 2b2683ea4..e862cdc64 100644 --- a/include/asm-i386/page.h +++ b/include/asm-i386/page.h @@ -12,7 +12,6 @@ #ifdef __KERNEL__ #ifndef __ASSEMBLY__ -#include #ifdef CONFIG_X86_USE_3DNOW @@ -97,6 +96,8 @@ typedef struct { unsigned long pgprot; } pgprot_t; #ifndef __ASSEMBLY__ +struct vm_area_struct; + /* * This much address space is reserved for vmalloc() and iomap() * as well as fixmap mappings. @@ -128,7 +129,7 @@ extern int devmem_is_allowed(unsigned long pagenr); #define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET) #define VMALLOC_RESERVE ((unsigned long)__VMALLOC_RESERVE) -#define MAXMEM (__FIXADDR_TOP-__PAGE_OFFSET-__VMALLOC_RESERVE) +#define MAXMEM (-__PAGE_OFFSET-__VMALLOC_RESERVE) #define __pa(x) ((unsigned long)(x)-PAGE_OFFSET) #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) @@ -144,11 +145,10 @@ extern int devmem_is_allowed(unsigned long pagenr); ((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0 ) | \ VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) - - -#endif /* __KERNEL__ */ - #include #include +#define __HAVE_ARCH_GATE_AREA 1 +#endif /* __KERNEL__ */ + #endif /* _I386_PAGE_H */ diff --git a/include/asm-i386/param.h b/include/asm-i386/param.h index 095580f3a..745dc5bd0 100644 --- a/include/asm-i386/param.h +++ b/include/asm-i386/param.h @@ -2,7 +2,6 @@ #define _ASMi386_PARAM_H #ifdef __KERNEL__ -# include # 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() */ diff --git a/include/asm-i386/pci.h b/include/asm-i386/pci.h index 78c85985a..64b6d0bae 100644 --- a/include/asm-i386/pci.h +++ b/include/asm-i386/pci.h @@ -1,7 +1,6 @@ #ifndef __i386_PCI_H #define __i386_PCI_H -#include #ifdef __KERNEL__ #include /* for struct page */ diff --git a/include/asm-i386/pgalloc.h b/include/asm-i386/pgalloc.h index e893581bf..90b246505 100644 --- a/include/asm-i386/pgalloc.h +++ b/include/asm-i386/pgalloc.h @@ -1,7 +1,6 @@ #ifndef _I386_PGALLOC_H #define _I386_PGALLOC_H -#include #include #include #include diff --git a/include/asm-i386/pgtable.h b/include/asm-i386/pgtable.h index 672c3f76b..09697fec3 100644 --- a/include/asm-i386/pgtable.h +++ b/include/asm-i386/pgtable.h @@ -1,7 +1,6 @@ #ifndef _I386_PGTABLE_H #define _I386_PGTABLE_H -#include /* * The Linux memory management assumes a three-level page table setup. On diff --git a/include/asm-i386/posix_types.h b/include/asm-i386/posix_types.h index 4e47ed059..133e31e7d 100644 --- a/include/asm-i386/posix_types.h +++ b/include/asm-i386/posix_types.h @@ -51,12 +51,12 @@ typedef struct { #undef __FD_SET #define __FD_SET(fd,fdsetp) \ __asm__ __volatile__("btsl %1,%0": \ - "=m" (*(__kernel_fd_set *) (fdsetp)):"r" ((int) (fd))) + "+m" (*(__kernel_fd_set *) (fdsetp)):"r" ((int) (fd))) #undef __FD_CLR #define __FD_CLR(fd,fdsetp) \ __asm__ __volatile__("btrl %1,%0": \ - "=m" (*(__kernel_fd_set *) (fdsetp)):"r" ((int) (fd))) + "+m" (*(__kernel_fd_set *) (fdsetp)):"r" ((int) (fd))) #undef __FD_ISSET #define __FD_ISSET(fd,fdsetp) (__extension__ ({ \ diff --git a/include/asm-i386/processor.h b/include/asm-i386/processor.h index e6712d64e..cd1c7b6dd 100644 --- a/include/asm-i386/processor.h +++ b/include/asm-i386/processor.h @@ -17,7 +17,6 @@ #include #include #include -#include #include #include #include @@ -72,8 +71,12 @@ struct cpuinfo_x86 { cpumask_t llc_shared_map; /* cpus sharing the last level cache */ #endif unsigned char x86_max_cores; /* cpuid returned max cores value */ - unsigned char booted_cores; /* number of cores as seen by OS */ unsigned char apicid; +#ifdef CONFIG_SMP + unsigned char booted_cores; /* number of cores as seen by OS */ + __u8 phys_proc_id; /* Physical processor id. */ + __u8 cpu_core_id; /* Core id */ +#endif } __attribute__((__aligned__(SMP_CACHE_BYTES))); #define X86_VENDOR_INTEL 0 @@ -105,14 +108,13 @@ extern struct cpuinfo_x86 cpu_data[]; #define current_cpu_data boot_cpu_data #endif -extern int phys_proc_id[NR_CPUS]; -extern int cpu_core_id[NR_CPUS]; extern int cpu_llc_id[NR_CPUS]; extern char ignore_fpu_irq; extern void identify_cpu(struct cpuinfo_x86 *); extern void print_cpu_info(struct cpuinfo_x86 *); extern unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c); +extern unsigned short num_cache_leaves; #ifdef CONFIG_X86_HT extern void detect_ht(struct cpuinfo_x86 *c); @@ -561,7 +563,7 @@ extern void prepare_to_copy(struct task_struct *tsk); extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); extern unsigned long thread_saved_pc(struct task_struct *tsk); -void show_trace(struct task_struct *task, unsigned long *stack); +void show_trace(struct task_struct *task, struct pt_regs *regs, unsigned long *stack); unsigned long get_wchan(struct task_struct *p); @@ -735,18 +737,4 @@ extern unsigned long boot_option_idle_override; extern void enable_sep_cpu(void); extern int sysenter_setup(void); -#ifdef CONFIG_MTRR -extern void mtrr_ap_init(void); -extern void mtrr_bp_init(void); -#else -#define mtrr_ap_init() do {} while (0) -#define mtrr_bp_init() do {} while (0) -#endif - -#ifdef CONFIG_X86_MCE -extern void mcheck_init(struct cpuinfo_x86 *c); -#else -#define mcheck_init(c) do {} while(0) -#endif - #endif /* __ASM_I386_PROCESSOR_H */ diff --git a/include/asm-i386/rwlock.h b/include/asm-i386/rwlock.h index 94f00195d..f40ccbd8c 100644 --- a/include/asm-i386/rwlock.h +++ b/include/asm-i386/rwlock.h @@ -20,56 +20,18 @@ #define RW_LOCK_BIAS 0x01000000 #define RW_LOCK_BIAS_STR "0x01000000" -#define __build_read_lock_ptr(rw, helper) \ - alternative_smp("lock; subl $1,(%0)\n\t" \ +#define __build_read_lock(rw, helper) \ + asm volatile(LOCK_PREFIX " subl $1,(%0)\n\t" \ "jns 1f\n" \ "call " helper "\n\t" \ - "1:\n", \ - "subl $1,(%0)\n\t", \ - :"a" (rw) : "memory") + "1:\n" \ + ::"a" (rw) : "memory") -#define __build_read_lock_const(rw, helper) \ - alternative_smp("lock; subl $1,%0\n\t" \ - "jns 1f\n" \ - "pushl %%eax\n\t" \ - "leal %0,%%eax\n\t" \ - "call " helper "\n\t" \ - "popl %%eax\n\t" \ - "1:\n", \ - "subl $1,%0\n\t", \ - "=m" (*(volatile int *)rw) : : "memory") - -#define __build_read_lock(rw, helper) do { \ - if (__builtin_constant_p(rw)) \ - __build_read_lock_const(rw, helper); \ - else \ - __build_read_lock_ptr(rw, helper); \ - } while (0) - -#define __build_write_lock_ptr(rw, helper) \ - alternative_smp("lock; subl $" RW_LOCK_BIAS_STR ",(%0)\n\t" \ +#define __build_write_lock(rw, helper) \ + asm volatile(LOCK_PREFIX " subl $" RW_LOCK_BIAS_STR ",(%0)\n\t" \ "jz 1f\n" \ "call " helper "\n\t" \ - "1:\n", \ - "subl $" RW_LOCK_BIAS_STR ",(%0)\n\t", \ - :"a" (rw) : "memory") - -#define __build_write_lock_const(rw, helper) \ - alternative_smp("lock; subl $" RW_LOCK_BIAS_STR ",%0\n\t" \ - "jz 1f\n" \ - "pushl %%eax\n\t" \ - "leal %0,%%eax\n\t" \ - "call " helper "\n\t" \ - "popl %%eax\n\t" \ - "1:\n", \ - "subl $" RW_LOCK_BIAS_STR ",%0\n\t", \ - "=m" (*(volatile int *)rw) : : "memory") - -#define __build_write_lock(rw, helper) do { \ - if (__builtin_constant_p(rw)) \ - __build_write_lock_const(rw, helper); \ - else \ - __build_write_lock_ptr(rw, helper); \ - } while (0) + "1:\n" \ + ::"a" (rw) : "memory") #endif diff --git a/include/asm-i386/rwsem.h b/include/asm-i386/rwsem.h index be4ab8592..43113f560 100644 --- a/include/asm-i386/rwsem.h +++ b/include/asm-i386/rwsem.h @@ -40,6 +40,7 @@ #include #include +#include struct rwsem_waiter; @@ -61,36 +62,34 @@ struct rw_semaphore { #define RWSEM_ACTIVE_WRITE_BIAS (RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS) spinlock_t wait_lock; struct list_head wait_list; -#if RWSEM_DEBUG - int debug; +#ifdef CONFIG_DEBUG_LOCK_ALLOC + struct lockdep_map dep_map; #endif }; -/* - * initialisation - */ -#if RWSEM_DEBUG -#define __RWSEM_DEBUG_INIT , 0 +#ifdef CONFIG_DEBUG_LOCK_ALLOC +# define __RWSEM_DEP_MAP_INIT(lockname) , .dep_map = { .name = #lockname } #else -#define __RWSEM_DEBUG_INIT /* */ +# define __RWSEM_DEP_MAP_INIT(lockname) #endif + #define __RWSEM_INITIALIZER(name) \ { RWSEM_UNLOCKED_VALUE, SPIN_LOCK_UNLOCKED, LIST_HEAD_INIT((name).wait_list) \ - __RWSEM_DEBUG_INIT } + __RWSEM_DEP_MAP_INIT(name) } #define DECLARE_RWSEM(name) \ struct rw_semaphore name = __RWSEM_INITIALIZER(name) -static inline void init_rwsem(struct rw_semaphore *sem) -{ - sem->count = RWSEM_UNLOCKED_VALUE; - spin_lock_init(&sem->wait_lock); - INIT_LIST_HEAD(&sem->wait_list); -#if RWSEM_DEBUG - sem->debug = 0; -#endif -} +extern void __init_rwsem(struct rw_semaphore *sem, const char *name, + struct lock_class_key *key); + +#define init_rwsem(sem) \ +do { \ + static struct lock_class_key __key; \ + \ + __init_rwsem((sem), #sem, &__key); \ +} while (0) /* * lock for reading @@ -112,8 +111,8 @@ LOCK_PREFIX " incl (%%eax)\n\t" /* adds 0x00000001, returns the old value " jmp 1b\n" LOCK_SECTION_END "# ending down_read\n\t" - : "=m"(sem->count) - : "a"(sem), "m"(sem->count) + : "+m" (sem->count) + : "a" (sem) : "memory", "cc"); } @@ -134,8 +133,8 @@ LOCK_PREFIX " cmpxchgl %2,%0\n\t" " jnz 1b\n\t" "2:\n\t" "# ending __down_read_trylock\n\t" - : "+m"(sem->count), "=&a"(result), "=&r"(tmp) - : "i"(RWSEM_ACTIVE_READ_BIAS) + : "+m" (sem->count), "=&a" (result), "=&r" (tmp) + : "i" (RWSEM_ACTIVE_READ_BIAS) : "memory", "cc"); return result>=0 ? 1 : 0; } @@ -143,7 +142,7 @@ LOCK_PREFIX " cmpxchgl %2,%0\n\t" /* * lock for writing */ -static inline void __down_write(struct rw_semaphore *sem) +static inline void __down_write_nested(struct rw_semaphore *sem, int subclass) { int tmp; @@ -162,11 +161,16 @@ LOCK_PREFIX " xadd %%edx,(%%eax)\n\t" /* subtract 0x0000ffff, returns the " jmp 1b\n" LOCK_SECTION_END "# ending down_write" - : "=m"(sem->count), "=d"(tmp) - : "a"(sem), "1"(tmp), "m"(sem->count) + : "+m" (sem->count), "=d" (tmp) + : "a" (sem), "1" (tmp) : "memory", "cc"); } +static inline void __down_write(struct rw_semaphore *sem) +{ + __down_write_nested(sem, 0); +} + /* * trylock for writing -- returns 1 if successful, 0 if contention */ @@ -201,8 +205,8 @@ LOCK_PREFIX " xadd %%edx,(%%eax)\n\t" /* subtracts 1, returns the old valu " jmp 1b\n" LOCK_SECTION_END "# ending __up_read\n" - : "=m"(sem->count), "=d"(tmp) - : "a"(sem), "1"(tmp), "m"(sem->count) + : "+m" (sem->count), "=d" (tmp) + : "a" (sem), "1" (tmp) : "memory", "cc"); } @@ -227,8 +231,8 @@ LOCK_PREFIX " xaddl %%edx,(%%eax)\n\t" /* tries to transition 0xffff0001 -> " jmp 1b\n" LOCK_SECTION_END "# ending __up_write\n" - : "=m"(sem->count) - : "a"(sem), "i"(-RWSEM_ACTIVE_WRITE_BIAS), "m"(sem->count) + : "+m" (sem->count) + : "a" (sem), "i" (-RWSEM_ACTIVE_WRITE_BIAS) : "memory", "cc", "edx"); } @@ -252,8 +256,8 @@ LOCK_PREFIX " addl %2,(%%eax)\n\t" /* transitions 0xZZZZ0001 -> 0xYYYY0001 " jmp 1b\n" LOCK_SECTION_END "# ending __downgrade_write\n" - : "=m"(sem->count) - : "a"(sem), "i"(-RWSEM_WAITING_BIAS), "m"(sem->count) + : "+m" (sem->count) + : "a" (sem), "i" (-RWSEM_WAITING_BIAS) : "memory", "cc"); } @@ -264,8 +268,8 @@ static inline void rwsem_atomic_add(int delta, struct rw_semaphore *sem) { __asm__ __volatile__( LOCK_PREFIX "addl %1,%0" - : "=m"(sem->count) - : "ir"(delta), "m"(sem->count)); + : "+m" (sem->count) + : "ir" (delta)); } /* @@ -276,10 +280,9 @@ static inline int rwsem_atomic_update(int delta, struct rw_semaphore *sem) int tmp = delta; __asm__ __volatile__( -LOCK_PREFIX "xadd %0,(%2)" - : "+r"(tmp), "=m"(sem->count) - : "r"(sem), "m"(sem->count) - : "memory"); +LOCK_PREFIX "xadd %0,%1" + : "+r" (tmp), "+m" (sem->count) + : : "memory"); return tmp+delta; } diff --git a/include/asm-i386/semaphore.h b/include/asm-i386/semaphore.h index f7a0f310c..d51e800ac 100644 --- a/include/asm-i386/semaphore.h +++ b/include/asm-i386/semaphore.h @@ -107,7 +107,7 @@ static inline void down(struct semaphore * sem) "call __down_failed\n\t" "jmp 1b\n" LOCK_SECTION_END - :"=m" (sem->count) + :"+m" (sem->count) : :"memory","ax"); } @@ -132,7 +132,7 @@ static inline int down_interruptible(struct semaphore * sem) "call __down_failed_interruptible\n\t" "jmp 1b\n" LOCK_SECTION_END - :"=a" (result), "=m" (sem->count) + :"=a" (result), "+m" (sem->count) : :"memory"); return result; @@ -157,7 +157,7 @@ static inline int down_trylock(struct semaphore * sem) "call __down_failed_trylock\n\t" "jmp 1b\n" LOCK_SECTION_END - :"=a" (result), "=m" (sem->count) + :"=a" (result), "+m" (sem->count) : :"memory"); return result; @@ -182,7 +182,7 @@ static inline void up(struct semaphore * sem) "jmp 1b\n" LOCK_SECTION_END ".subsection 0\n" - :"=m" (sem->count) + :"+m" (sem->count) : :"memory","ax"); } diff --git a/include/asm-i386/serial.h b/include/asm-i386/serial.h index e1ecfccb7..bd67480ca 100644 --- a/include/asm-i386/serial.h +++ b/include/asm-i386/serial.h @@ -2,7 +2,6 @@ * include/asm-i386/serial.h */ -#include /* * This assumes you have a 1.8432 MHz clock for your UART. diff --git a/include/asm-i386/setup.h b/include/asm-i386/setup.h index ee941457b..2734909ef 100644 --- a/include/asm-i386/setup.h +++ b/include/asm-i386/setup.h @@ -6,6 +6,7 @@ #ifndef _i386_SETUP_H #define _i386_SETUP_H +#ifdef __KERNEL__ #include /* @@ -13,6 +14,7 @@ */ #define MAXMEM_PFN PFN_DOWN(MAXMEM) #define MAX_NONPAE_PFN (1 << 20) +#endif #define PARAM_SIZE 4096 #define COMMAND_LINE_SIZE 256 @@ -59,6 +61,21 @@ extern unsigned char boot_params[PARAM_SIZE]; #define EDD_MBR_SIGNATURE ((unsigned int *) (PARAM+EDD_MBR_SIG_BUF)) #define EDD_BUF ((struct edd_info *) (PARAM+EDDBUF)) +/* + * Do NOT EVER look at the BIOS memory size location. + * It does not work on many machines. + */ +#define LOWMEMSIZE() (0x9f000) + +struct e820entry; + +char * __init machine_specific_memory_setup(void); + +int __init copy_e820_map(struct e820entry * biosmap, int nr_map); +int __init sanitize_e820_map(struct e820entry * biosmap, char * pnr_map); +void __init add_memory_region(unsigned long long start, + unsigned long long size, int type); + #endif /* __ASSEMBLY__ */ #endif /* _i386_SETUP_H */ diff --git a/include/asm-i386/signal.h b/include/asm-i386/signal.h index 026fd2314..53945c95a 100644 --- a/include/asm-i386/signal.h +++ b/include/asm-i386/signal.h @@ -2,7 +2,6 @@ #define _ASMi386_SIGNAL_H #include -#include #include #include @@ -10,6 +9,9 @@ struct siginfo; #ifdef __KERNEL__ + +#include + /* Most things should be clean enough to redefine this at will, if care is taken to make libc match. */ @@ -77,7 +79,6 @@ typedef unsigned long sigset_t; * SA_FLAGS values: * * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. * SA_RESETHAND clears the handler when the signal is delivered. @@ -97,7 +98,6 @@ typedef unsigned long sigset_t; #define SA_NOMASK SA_NODEFER #define SA_ONESHOT SA_RESETHAND -#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ #define SA_RESTORER 0x04000000 @@ -221,10 +221,8 @@ struct pt_regs; #define ptrace_signal_deliver(regs, cookie) \ do { \ - if (current->ptrace & PT_DTRACE) { \ - current->ptrace &= ~PT_DTRACE; \ + if (test_and_clear_thread_flag(TIF_FORCED_TF)) \ (regs)->eflags &= ~TF_MASK; \ - } \ } while (0) #endif /* __KERNEL__ */ diff --git a/include/asm-i386/smp.h b/include/asm-i386/smp.h index 61d3ab9db..142d10e34 100644 --- a/include/asm-i386/smp.h +++ b/include/asm-i386/smp.h @@ -5,7 +5,6 @@ * We need the APIC definitions automatically as part of 'smp.h' */ #ifndef __ASSEMBLY__ -#include #include #include #include diff --git a/include/asm-i386/socket.h b/include/asm-i386/socket.h index 802ae7619..5755d57c4 100644 --- a/include/asm-i386/socket.h +++ b/include/asm-i386/socket.h @@ -48,5 +48,6 @@ #define SO_ACCEPTCONN 30 #define SO_PEERSEC 31 +#define SO_PASSSEC 34 #endif /* _ASM_SOCKET_H */ diff --git a/include/asm-i386/spinlock.h b/include/asm-i386/spinlock.h index 6d794a373..d1020363c 100644 --- a/include/asm-i386/spinlock.h +++ b/include/asm-i386/spinlock.h @@ -4,7 +4,6 @@ #include #include #include -#include #include /* @@ -23,7 +22,7 @@ #define __raw_spin_lock_string \ "\n1:\t" \ - "lock ; decb %0\n\t" \ + LOCK_PREFIX " ; decb %0\n\t" \ "jns 3f\n" \ "2:\t" \ "rep;nop\n\t" \ @@ -32,11 +31,16 @@ "jmp 1b\n" \ "3:\n\t" +/* + * NOTE: there's an irqs-on section here, which normally would have to be + * irq-traced, but on CONFIG_TRACE_IRQFLAGS we never use + * __raw_spin_lock_string_flags(). + */ #define __raw_spin_lock_string_flags \ "\n1:\t" \ - "lock ; decb %0\n\t" \ + LOCK_PREFIX " ; decb %0\n\t" \ "jns 5f\n" \ - "2:\t" \ + "2:\t" \ "testl $0x200, %1\n\t" \ "jz 4f\n\t" \ "sti\n" \ @@ -53,31 +57,29 @@ "jmp 4b\n" \ "5:\n\t" -#define __raw_spin_lock_string_up \ - "\n\tdecb %0" - static inline void __raw_spin_lock(raw_spinlock_t *lock) { - alternative_smp( - __raw_spin_lock_string, - __raw_spin_lock_string_up, - "=m" (lock->slock) : : "memory"); + asm(__raw_spin_lock_string : "+m" (lock->slock) : : "memory"); } +/* + * It is easier for the lock validator if interrupts are not re-enabled + * in the middle of a lock-acquire. This is a performance feature anyway + * so we turn it off: + */ +#ifndef CONFIG_PROVE_LOCKING static inline void __raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long flags) { - alternative_smp( - __raw_spin_lock_string_flags, - __raw_spin_lock_string_up, - "=m" (lock->slock) : "r" (flags) : "memory"); + asm(__raw_spin_lock_string_flags : "+m" (lock->slock) : "r" (flags) : "memory"); } +#endif static inline int __raw_spin_trylock(raw_spinlock_t *lock) { char oldval; __asm__ __volatile__( "xchgb %b0,%1" - :"=q" (oldval), "=m" (lock->slock) + :"=q" (oldval), "+m" (lock->slock) :"0" (0) : "memory"); return oldval > 0; } @@ -93,7 +95,7 @@ static inline int __raw_spin_trylock(raw_spinlock_t *lock) #define __raw_spin_unlock_string \ "movb $1,%0" \ - :"=m" (lock->slock) : : "memory" + :"+m" (lock->slock) : : "memory" static inline void __raw_spin_unlock(raw_spinlock_t *lock) @@ -107,7 +109,7 @@ static inline void __raw_spin_unlock(raw_spinlock_t *lock) #define __raw_spin_unlock_string \ "xchgb %b0, %1" \ - :"=q" (oldval), "=m" (lock->slock) \ + :"=q" (oldval), "+m" (lock->slock) \ :"0" (oldval) : "memory" static inline void __raw_spin_unlock(raw_spinlock_t *lock) @@ -188,13 +190,13 @@ static inline int __raw_write_trylock(raw_rwlock_t *lock) static inline void __raw_read_unlock(raw_rwlock_t *rw) { - asm volatile(LOCK_PREFIX "incl %0" :"=m" (rw->lock) : : "memory"); + asm volatile(LOCK_PREFIX "incl %0" :"+m" (rw->lock) : : "memory"); } static inline void __raw_write_unlock(raw_rwlock_t *rw) { asm volatile(LOCK_PREFIX "addl $" RW_LOCK_BIAS_STR ", %0" - : "=m" (rw->lock) : : "memory"); + : "+m" (rw->lock) : : "memory"); } #endif /* __ASM_SPINLOCK_H */ diff --git a/include/asm-i386/string.h b/include/asm-i386/string.h index bb5f88a27..b92773619 100644 --- a/include/asm-i386/string.h +++ b/include/asm-i386/string.h @@ -2,7 +2,6 @@ #define _I386_STRING_H_ #ifdef __KERNEL__ -#include /* * On a 486 or Pentium, we are better off not using the * byte string operations. But on a 386 or a PPro the diff --git a/include/asm-i386/system.h b/include/asm-i386/system.h index 19cc79c9a..098bcee94 100644 --- a/include/asm-i386/system.h +++ b/include/asm-i386/system.h @@ -1,7 +1,6 @@ #ifndef __ASM_SYSTEM_H #define __ASM_SYSTEM_H -#include #include #include #include @@ -12,9 +11,14 @@ struct task_struct; /* one of the stranger aspects of C forward declarations.. */ extern struct task_struct * FASTCALL(__switch_to(struct task_struct *prev, struct task_struct *next)); +/* + * Saving eflags is important. It switches not only IOPL between tasks, + * it also protects other tasks from NT leaking through sysenter etc. + */ #define switch_to(prev,next,last) do { \ unsigned long esi,edi; \ - asm volatile("pushl %%ebp\n\t" \ + asm volatile("pushfl\n\t" /* Save flags */ \ + "pushl %%ebp\n\t" \ "movl %%esp,%0\n\t" /* save ESP */ \ "movl %5,%%esp\n\t" /* restore ESP */ \ "movl $1f,%1\n\t" /* save EIP */ \ @@ -22,6 +26,7 @@ extern struct task_struct * FASTCALL(__switch_to(struct task_struct *prev, struc "jmp __switch_to\n" \ "1:\t" \ "popl %%ebp\n\t" \ + "popfl" \ :"=m" (prev->thread.esp),"=m" (prev->thread.eip), \ "=a" (last),"=S" (esi),"=D" (edi) \ :"m" (next->thread.esp),"m" (next->thread.eip), \ @@ -83,10 +88,6 @@ __asm__ __volatile__ ("movw %%dx,%1\n\t" \ #define savesegment(seg, value) \ asm volatile("mov %%" #seg ",%0":"=rm" (value)) -/* - * Clear and set 'TS' bit respectively - */ -#define clts() __asm__ __volatile__ ("clts") #define read_cr0() ({ \ unsigned int __dummy; \ __asm__ __volatile__( \ @@ -95,7 +96,7 @@ __asm__ __volatile__ ("movw %%dx,%1\n\t" \ __dummy; \ }) #define write_cr0(x) \ - __asm__ __volatile__("movl %0,%%cr0": :"r" (x)); + __asm__ __volatile__("movl %0,%%cr0": :"r" (x)) #define read_cr2() ({ \ unsigned int __dummy; \ @@ -105,7 +106,7 @@ __asm__ __volatile__ ("movw %%dx,%1\n\t" \ __dummy; \ }) #define write_cr2(x) \ - __asm__ __volatile__("movl %0,%%cr2": :"r" (x)); + __asm__ __volatile__("movl %0,%%cr2": :"r" (x)) #define read_cr3() ({ \ unsigned int __dummy; \ @@ -115,7 +116,7 @@ __asm__ __volatile__ ("movw %%dx,%1\n\t" \ __dummy; \ }) #define write_cr3(x) \ - __asm__ __volatile__("movl %0,%%cr3": :"r" (x)); + __asm__ __volatile__("movl %0,%%cr3": :"r" (x)) #define read_cr4() ({ \ unsigned int __dummy; \ @@ -124,7 +125,6 @@ __asm__ __volatile__ ("movw %%dx,%1\n\t" \ :"=r" (__dummy)); \ __dummy; \ }) - #define read_cr4_safe() ({ \ unsigned int __dummy; \ /* This could fault if %cr4 does not exist */ \ @@ -136,15 +136,19 @@ __asm__ __volatile__ ("movw %%dx,%1\n\t" \ : "=r" (__dummy): "0" (0)); \ __dummy; \ }) - #define write_cr4(x) \ - __asm__ __volatile__("movl %0,%%cr4": :"r" (x)); + __asm__ __volatile__("movl %0,%%cr4": :"r" (x)) + +/* + * Clear and set 'TS' bit respectively + */ +#define clts() __asm__ __volatile__ ("clts") #define stts() write_cr0(8 | read_cr0()) #endif /* __KERNEL__ */ #define wbinvd() \ - __asm__ __volatile__ ("wbinvd": : :"memory"); + __asm__ __volatile__ ("wbinvd": : :"memory") static inline unsigned long get_limit(unsigned long segment) { @@ -428,7 +432,7 @@ static inline unsigned long long __cmpxchg64(volatile void *ptr, unsigned long l * does not enforce ordering, since there is no data dependency between * the read of "a" and the read of "b". Therefore, on some CPUs, such * as Alpha, "y" could be set to 3 and "x" to 0. Use rmb() - * in cases like thiswhere there are no data dependencies. + * in cases like this where there are no data dependencies. **/ #define read_barrier_depends() do { } while(0) @@ -455,27 +459,7 @@ static inline unsigned long long __cmpxchg64(volatile void *ptr, unsigned long l #define set_mb(var, value) do { var = value; barrier(); } while (0) #endif -#define set_wmb(var, value) do { var = value; wmb(); } while (0) - -/* interrupt control.. */ -#define local_save_flags(x) do { typecheck(unsigned long,x); __asm__ __volatile__("pushfl ; popl %0":"=g" (x): /* no input */); } while (0) -#define local_irq_restore(x) do { typecheck(unsigned long,x); __asm__ __volatile__("pushl %0 ; popfl": /* no output */ :"g" (x):"memory", "cc"); } while (0) -#define local_irq_disable() __asm__ __volatile__("cli": : :"memory") -#define local_irq_enable() __asm__ __volatile__("sti": : :"memory") -/* used in the idle loop; sti takes one instruction cycle to complete */ -#define safe_halt() __asm__ __volatile__("sti; hlt": : :"memory") -/* used when interrupts are already enabled or to shutdown the processor */ -#define halt() __asm__ __volatile__("hlt": : :"memory") - -#define irqs_disabled() \ -({ \ - unsigned long flags; \ - local_save_flags(flags); \ - !(flags & (1<<9)); \ -}) - -/* For spinlocks etc */ -#define local_irq_save(x) __asm__ __volatile__("pushfl ; popl %0 ; cli":"=g" (x): /* no input */ :"memory") +#include /* * disable hlt during certain critical i/o operations diff --git a/include/asm-i386/thread_info.h b/include/asm-i386/thread_info.h index f84290f43..b3fa512b7 100644 --- a/include/asm-i386/thread_info.h +++ b/include/asm-i386/thread_info.h @@ -9,7 +9,6 @@ #ifdef __KERNEL__ -#include #include #include @@ -85,17 +84,15 @@ struct thread_info { #define init_stack (init_thread_union.stack) +/* how to get the current stack pointer from C */ +register unsigned long current_stack_pointer asm("esp") __attribute_used__; + /* how to get the thread information struct from C */ static inline struct thread_info *current_thread_info(void) { - struct thread_info *ti; - __asm__("andl %%esp,%0; ":"=r" (ti) : "0" (~(THREAD_SIZE - 1))); - return ti; + return (struct thread_info *)(current_stack_pointer & ~(THREAD_SIZE - 1)); } -/* how to get the current stack pointer from C */ -register unsigned long current_stack_pointer asm("esp") __attribute_used__; - /* thread information allocation */ #ifdef CONFIG_DEBUG_STACK_USAGE #define alloc_thread_info(tsk) \ @@ -138,12 +135,13 @@ register unsigned long current_stack_pointer asm("esp") __attribute_used__; #define TIF_NEED_RESCHED 3 /* rescheduling necessary */ #define TIF_SINGLESTEP 4 /* restore singlestep on return to user mode */ #define TIF_IRET 5 /* return with iret */ -#define TIF_SYSCALL_EMU 6 /* syscall emulation active */ #define TIF_SYSCALL_AUDIT 7 /* syscall auditing active */ #define TIF_SECCOMP 8 /* secure computing */ #define TIF_RESTORE_SIGMASK 9 /* restore signal mask in do_signal() */ -#define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling TIF_NEED_RESCHED */ -#define TIF_MEMDIE 17 +#define TIF_MEMDIE 16 +#define TIF_DEBUG 17 /* uses debug registers */ +#define TIF_IO_BITMAP 18 /* uses I/O bitmap */ +#define TIF_FORCED_TF 19 /* true if TF in eflags artificially */ #define _TIF_SYSCALL_TRACE (1<thread_info->status & TS_POLLING) #endif /* __KERNEL__ */ diff --git a/include/asm-i386/timer.h b/include/asm-i386/timer.h index aed164374..d0ebd05f8 100644 --- a/include/asm-i386/timer.h +++ b/include/asm-i386/timer.h @@ -3,68 +3,11 @@ #include #include -/** - * struct timer_ops - used to define a timer source - * - * @name: name of the timer. - * @init: Probes and initializes the timer. Takes clock= override - * string as an argument. Returns 0 on success, anything else - * on failure. - * @mark_offset: called by the timer interrupt. - * @get_offset: called by gettimeofday(). Returns the number of microseconds - * since the last timer interupt. - * @monotonic_clock: returns the number of nanoseconds since the init of the - * timer. - * @delay: delays this many clock cycles. - */ -struct timer_opts { - char* name; - void (*mark_offset)(void); - unsigned long (*get_offset)(void); - unsigned long long (*monotonic_clock)(void); - void (*delay)(unsigned long); - unsigned long (*read_timer)(void); - int (*suspend)(pm_message_t state); - int (*resume)(void); -}; - -struct init_timer_opts { - int (*init)(char *override); - struct timer_opts *opts; -}; - #define TICK_SIZE (tick_nsec / 1000) - -extern struct timer_opts* __init select_timer(void); -extern void clock_fallback(void); void setup_pit_timer(void); - /* Modifiers for buggy PIT handling */ - extern int pit_latch_buggy; - -extern struct timer_opts *cur_timer; extern int timer_ack; - -/* list of externed timers */ -extern struct timer_opts timer_none; -extern struct timer_opts timer_pit; -extern struct init_timer_opts timer_pit_init; -extern struct init_timer_opts timer_tsc_init; -#ifdef CONFIG_X86_CYCLONE_TIMER -extern struct init_timer_opts timer_cyclone_init; -#endif - -extern unsigned long calibrate_tsc(void); -extern unsigned long read_timer_tsc(void); -extern void init_cpu_khz(void); extern int recalibrate_cpu_khz(void); -#ifdef CONFIG_HPET_TIMER -extern struct init_timer_opts timer_hpet_init; -extern unsigned long calibrate_tsc_hpet(unsigned long *tsc_hpet_quotient_ptr); -#endif -#ifdef CONFIG_X86_PM_TIMER -extern struct init_timer_opts timer_pmtmr_init; -#endif #endif diff --git a/include/asm-i386/timex.h b/include/asm-i386/timex.h index 292b5a68f..366604440 100644 --- a/include/asm-i386/timex.h +++ b/include/asm-i386/timex.h @@ -6,8 +6,8 @@ #ifndef _ASMi386_TIMEX_H #define _ASMi386_TIMEX_H -#include #include +#include #ifdef CONFIG_X86_ELAN # define CLOCK_TICK_RATE 1189200 /* AMD Elan has different frequency! */ @@ -16,39 +16,6 @@ #endif -/* - * Standard way to access the cycle counter on i586+ CPUs. - * Currently only used on SMP. - * - * If you really have a SMP machine with i486 chips or older, - * compile for that, and this will just always return zero. - * That's ok, it just means that the nicer scheduling heuristics - * won't work for you. - * - * We only use the low 32 bits, and we'd simply better make sure - * that we reschedule before that wraps. Scheduling at least every - * four billion cycles just basically sounds like a good idea, - * regardless of how fast the machine is. - */ -typedef unsigned long long cycles_t; - -static inline cycles_t get_cycles (void) -{ - unsigned long long ret=0; - -#ifndef CONFIG_X86_TSC - if (!cpu_has_tsc) - return 0; -#endif - -#if defined(CONFIG_X86_GENERIC) || defined(CONFIG_X86_TSC) - rdtscll(ret); -#endif - return ret; -} - -extern unsigned int cpu_khz; - extern int read_current_timer(unsigned long *timer_value); #define ARCH_HAS_READ_CURRENT_TIMER 1 diff --git a/include/asm-i386/tlbflush.h b/include/asm-i386/tlbflush.h index ab216e137..d57ca5c54 100644 --- a/include/asm-i386/tlbflush.h +++ b/include/asm-i386/tlbflush.h @@ -1,7 +1,6 @@ #ifndef _I386_TLBFLUSH_H #define _I386_TLBFLUSH_H -#include #include #include diff --git a/include/asm-i386/topology.h b/include/asm-i386/topology.h index b94e5eeef..6adbd9b1a 100644 --- a/include/asm-i386/topology.h +++ b/include/asm-i386/topology.h @@ -28,10 +28,8 @@ #define _ASM_I386_TOPOLOGY_H #ifdef CONFIG_X86_HT -#define topology_physical_package_id(cpu) \ - (phys_proc_id[cpu] == BAD_APICID ? -1 : phys_proc_id[cpu]) -#define topology_core_id(cpu) \ - (cpu_core_id[cpu] == BAD_APICID ? 0 : cpu_core_id[cpu]) +#define topology_physical_package_id(cpu) (cpu_data[cpu].phys_proc_id) +#define topology_core_id(cpu) (cpu_data[cpu].cpu_core_id) #define topology_core_siblings(cpu) (cpu_core_map[cpu]) #define topology_thread_siblings(cpu) (cpu_sibling_map[cpu]) #endif @@ -114,4 +112,9 @@ extern unsigned long node_remap_size[]; extern cpumask_t cpu_coregroup_map(int cpu); +#ifdef CONFIG_SMP +#define mc_capable() (boot_cpu_data.x86_max_cores > 1) +#define smt_capable() (smp_num_siblings > 1) +#endif + #endif /* _ASM_I386_TOPOLOGY_H */ diff --git a/include/asm-i386/types.h b/include/asm-i386/types.h index e50a08bd7..4b4b295cc 100644 --- a/include/asm-i386/types.h +++ b/include/asm-i386/types.h @@ -35,7 +35,6 @@ typedef unsigned long long __u64; #ifndef __ASSEMBLY__ -#include typedef signed char s8; typedef unsigned char u8; diff --git a/include/asm-i386/uaccess.h b/include/asm-i386/uaccess.h index 371457b1c..54d905ebc 100644 --- a/include/asm-i386/uaccess.h +++ b/include/asm-i386/uaccess.h @@ -4,7 +4,6 @@ /* * User space memory access functions */ -#include #include #include #include @@ -59,7 +58,7 @@ extern struct movsl_mask { __chk_user_ptr(addr); \ asm("addl %3,%1 ; sbbl %0,%0; cmpl %1,%4; sbbl $0,%0" \ :"=&r" (flag), "=r" (sum) \ - :"1" (addr),"g" ((int)(size)),"g" (current_thread_info()->addr_limit.seg)); \ + :"1" (addr),"g" ((int)(size)),"rm" (current_thread_info()->addr_limit.seg)); \ flag; }) /** @@ -391,6 +390,12 @@ unsigned long __must_check __copy_to_user_ll(void __user *to, const void *from, unsigned long n); unsigned long __must_check __copy_from_user_ll(void *to, const void __user *from, unsigned long n); +unsigned long __must_check __copy_from_user_ll_nozero(void *to, + const void __user *from, unsigned long n); +unsigned long __must_check __copy_from_user_ll_nocache(void *to, + const void __user *from, unsigned long n); +unsigned long __must_check __copy_from_user_ll_nocache_nozero(void *to, + const void __user *from, unsigned long n); /* * Here we special-case 1, 2 and 4-byte copy_*_user invocations. On a fault @@ -457,10 +462,41 @@ __copy_to_user(void __user *to, const void *from, unsigned long n) * * If some data could not be copied, this function will pad the copied * data to the requested size using zero bytes. + * + * An alternate version - __copy_from_user_inatomic() - may be called from + * atomic context and will fail rather than sleep. In this case the + * uncopied bytes will *NOT* be padded with zeros. See fs/filemap.h + * for explanation of why this is needed. */ static __always_inline unsigned long __copy_from_user_inatomic(void *to, const void __user *from, unsigned long n) { + /* Avoid zeroing the tail if the copy fails.. + * If 'n' is constant and 1, 2, or 4, we do still zero on a failure, + * but as the zeroing behaviour is only significant when n is not + * constant, that shouldn't be a problem. + */ + if (__builtin_constant_p(n)) { + unsigned long ret; + + switch (n) { + case 1: + __get_user_size(*(u8 *)to, from, 1, ret, 1); + return ret; + case 2: + __get_user_size(*(u16 *)to, from, 2, ret, 2); + return ret; + case 4: + __get_user_size(*(u32 *)to, from, 4, ret, 4); + return ret; + } + } + return __copy_from_user_ll_nozero(to, from, n); +} +static __always_inline unsigned long +__copy_from_user(void *to, const void __user *from, unsigned long n) +{ + might_sleep(); if (__builtin_constant_p(n)) { unsigned long ret; @@ -479,12 +515,36 @@ __copy_from_user_inatomic(void *to, const void __user *from, unsigned long n) return __copy_from_user_ll(to, from, n); } +#define ARCH_HAS_NOCACHE_UACCESS + +static __always_inline unsigned long __copy_from_user_nocache(void *to, + const void __user *from, unsigned long n) +{ + might_sleep(); + if (__builtin_constant_p(n)) { + unsigned long ret; + + switch (n) { + case 1: + __get_user_size(*(u8 *)to, from, 1, ret, 1); + return ret; + case 2: + __get_user_size(*(u16 *)to, from, 2, ret, 2); + return ret; + case 4: + __get_user_size(*(u32 *)to, from, 4, ret, 4); + return ret; + } + } + return __copy_from_user_ll_nocache(to, from, n); +} + static __always_inline unsigned long -__copy_from_user(void *to, const void __user *from, unsigned long n) +__copy_from_user_inatomic_nocache(void *to, const void __user *from, unsigned long n) { - might_sleep(); - return __copy_from_user_inatomic(to, from, n); + return __copy_from_user_ll_nocache_nozero(to, from, n); } + unsigned long __must_check copy_to_user(void __user *to, const void *from, unsigned long n); unsigned long __must_check copy_from_user(void *to, diff --git a/include/asm-i386/unistd.h b/include/asm-i386/unistd.h index 94fff76ec..8cd8a7607 100644 --- a/include/asm-i386/unistd.h +++ b/include/asm-i386/unistd.h @@ -322,8 +322,11 @@ #define __NR_sync_file_range 314 #define __NR_tee 315 #define __NR_vmsplice 316 +#define __NR_move_pages 317 -#define NR_syscalls 317 +#ifdef __KERNEL__ + +#define NR_syscalls 318 #ifndef __KERNEL_SYSCALLS_NO_ERRNO__ /* @@ -427,7 +430,6 @@ __asm__ volatile ("push %%ebp ; push %%ebx ; movl 4(%2),%%ebp ; " \ __syscall_return(type,__res); \ } -#ifdef __KERNEL__ #define __ARCH_WANT_IPC_PARSE_VERSION #define __ARCH_WANT_OLD_READDIR #define __ARCH_WANT_OLD_STAT @@ -451,7 +453,6 @@ __syscall_return(type,__res); \ #define __ARCH_WANT_SYS_SIGPROCMASK #define __ARCH_WANT_SYS_RT_SIGACTION #define __ARCH_WANT_SYS_RT_SIGSUSPEND -#endif #ifdef __KERNEL_SYSCALLS__ @@ -490,7 +491,7 @@ asmlinkage long sys_rt_sigaction(int sig, struct sigaction __user *oact, size_t sigsetsize); -#endif +#endif /* __KERNEL_SYSCALLS__ */ /* * "Conditional" syscalls @@ -502,4 +503,5 @@ asmlinkage long sys_rt_sigaction(int sig, #define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") #endif +#endif /* __KERNEL__ */ #endif /* _ASM_I386_UNISTD_H_ */ diff --git a/include/asm-i386/vga.h b/include/asm-i386/vga.h index ef0c0e50c..0ecf68ac0 100644 --- a/include/asm-i386/vga.h +++ b/include/asm-i386/vga.h @@ -12,7 +12,7 @@ * access the videoram directly without any black magic. */ -#define VGA_MAP_MEM(x) (unsigned long)phys_to_virt(x) +#define VGA_MAP_MEM(x,s) (unsigned long)phys_to_virt(x) #define vga_readb(x) (*(x)) #define vga_writeb(x,y) (*(y) = (x)) diff --git a/include/asm-ia64/agp.h b/include/asm-ia64/agp.h index 4e517f0e6..9458f58ad 100644 --- a/include/asm-ia64/agp.h +++ b/include/asm-ia64/agp.h @@ -19,13 +19,49 @@ #define flush_agp_cache() mb() /* Convert a physical address to an address suitable for the GART. */ +#ifndef CONFIG_XEN #define phys_to_gart(x) (x) #define gart_to_phys(x) (x) +#else +#define phys_to_gart(x) phys_to_machine_for_dma(x) +#define gart_to_phys(x) machine_to_phys_for_dma(x) +#endif /* GATT allocation. Returns/accepts GATT kernel virtual address. */ -#define alloc_gatt_pages(order) \ - ((char *)__get_free_pages(GFP_KERNEL, (order))) -#define free_gatt_pages(table, order) \ - free_pages((unsigned long)(table), (order)) +#ifdef CONFIG_XEN +#include +static inline char* +alloc_gatt_pages(unsigned int order) +{ + unsigned long error; + unsigned long ret = __get_free_pages(GFP_KERNEL, (order)); + if (ret == 0) { + goto out; + } + error = xen_create_contiguous_region(ret, order, 0); + if (error) { + free_pages(ret, order); + ret = 0; + } +out: + return (char*)ret; +} +static inline void +free_gatt_pages(void* table, unsigned int order) +{ + xen_destroy_contiguous_region((unsigned long)table, order); + free_pages((unsigned long)table, order); +} +#else /* CONFIG_XEN */ +/* Convert a physical address to an address suitable for the GART. */ +#define phys_to_gart(x) (x) +#define gart_to_phys(x) (x) + +/* GATT allocation. Returns/accepts GATT kernel virtual address. */ +#define alloc_gatt_pages(order) \ + ((char *)__get_free_pages(GFP_KERNEL, (order))) +#define free_gatt_pages(table, order) \ + free_pages((unsigned long)(table), (order)) +#endif /* CONFIG_XEN */ #endif /* _ASM_IA64_AGP_H */ diff --git a/include/asm-ia64/asmmacro.h b/include/asm-ia64/asmmacro.h index edf2cebb2..c22b4658f 100644 --- a/include/asm-ia64/asmmacro.h +++ b/include/asm-ia64/asmmacro.h @@ -6,7 +6,6 @@ * David Mosberger-Tang */ -#include #define ENTRY(name) \ .align 32; \ diff --git a/include/asm-ia64/cache.h b/include/asm-ia64/cache.h index f0a104db8..e7482bd62 100644 --- a/include/asm-ia64/cache.h +++ b/include/asm-ia64/cache.h @@ -1,7 +1,6 @@ #ifndef _ASM_IA64_CACHE_H #define _ASM_IA64_CACHE_H -#include /* * Copyright (C) 1998-2000 Hewlett-Packard Co diff --git a/include/asm-ia64/delay.h b/include/asm-ia64/delay.h index bba702076..a30a62f23 100644 --- a/include/asm-ia64/delay.h +++ b/include/asm-ia64/delay.h @@ -12,7 +12,6 @@ * Copyright (C) 1999 Don Dugger */ -#include #include #include #include diff --git a/include/asm-ia64/dma-mapping.h b/include/asm-ia64/dma-mapping.h index df67d4080..a527db735 100644 --- a/include/asm-ia64/dma-mapping.h +++ b/include/asm-ia64/dma-mapping.h @@ -5,22 +5,70 @@ * Copyright (C) 2003-2004 Hewlett-Packard Co * David Mosberger-Tang */ -#include #include -#define dma_alloc_coherent platform_dma_alloc_coherent -#define dma_alloc_noncoherent platform_dma_alloc_coherent /* coherent mem. is cheap */ -#define dma_free_coherent platform_dma_free_coherent -#define dma_free_noncoherent platform_dma_free_coherent -#define dma_map_single platform_dma_map_single -#define dma_map_sg platform_dma_map_sg -#define dma_unmap_single platform_dma_unmap_single -#define dma_unmap_sg platform_dma_unmap_sg -#define dma_sync_single_for_cpu platform_dma_sync_single_for_cpu -#define dma_sync_sg_for_cpu platform_dma_sync_sg_for_cpu +#ifndef CONFIG_XEN + +#define dma_alloc_coherent platform_dma_alloc_coherent +#define dma_alloc_noncoherent platform_dma_alloc_coherent /* coherent mem. is cheap */ +#define dma_free_coherent platform_dma_free_coherent +#define dma_free_noncoherent platform_dma_free_coherent +#define dma_map_single platform_dma_map_single +#define dma_map_sg platform_dma_map_sg +#define dma_unmap_single platform_dma_unmap_single +#define dma_unmap_sg platform_dma_unmap_sg +#define dma_sync_single_for_cpu platform_dma_sync_single_for_cpu +#define dma_sync_sg_for_cpu platform_dma_sync_sg_for_cpu #define dma_sync_single_for_device platform_dma_sync_single_for_device -#define dma_sync_sg_for_device platform_dma_sync_sg_for_device -#define dma_mapping_error platform_dma_mapping_error +#define dma_sync_sg_for_device platform_dma_sync_sg_for_device +#define dma_mapping_error platform_dma_mapping_error + + +#else /* CONFIG_XEN */ +/* Needed for arch/i386/kernel/swiotlb.c and arch/i386/kernel/pci-dma-xen.c */ +#include +/* Needed for arch/i386/kernel/swiotlb.c */ +#include + +int dma_map_sg(struct device *hwdev, struct scatterlist *sg, int nents, + enum dma_data_direction direction); +void dma_unmap_sg(struct device *hwdev, struct scatterlist *sg, int nents, + enum dma_data_direction direction); +int dma_supported(struct device *dev, u64 mask); +void *dma_alloc_coherent(struct device *dev, size_t size, + dma_addr_t *dma_handle, gfp_t gfp); +void dma_free_coherent(struct device *dev, size_t size, void *vaddr, + dma_addr_t dma_handle); +dma_addr_t dma_map_single(struct device *dev, void *ptr, size_t size, + enum dma_data_direction direction); +void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, + enum dma_data_direction direction); +void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, + size_t size, enum dma_data_direction direction); +void dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, + size_t size, + enum dma_data_direction direction); +int dma_mapping_error(dma_addr_t dma_addr); + +#define flush_write_buffers() do { } while (0) +static inline void +dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems, + enum dma_data_direction direction) +{ + if (swiotlb) + swiotlb_sync_sg_for_cpu(dev,sg,nelems,direction); + flush_write_buffers(); +} + +static inline void +dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems, + enum dma_data_direction direction) +{ + if (swiotlb) + swiotlb_sync_sg_for_device(dev,sg,nelems,direction); + flush_write_buffers(); +} +#endif /* CONFIG_XEN */ #define dma_map_page(dev, pg, off, size, dir) \ dma_map_single(dev, page_address(pg) + (off), (size), (dir)) @@ -37,7 +85,9 @@ #define dma_sync_single_range_for_device(dev, dma_handle, offset, size, dir) \ dma_sync_single_for_device(dev, dma_handle, size, dir) +#ifndef CONFIG_XEN #define dma_supported platform_dma_supported +#endif static inline int dma_set_mask (struct device *dev, u64 mask) @@ -62,4 +112,29 @@ dma_cache_sync (void *vaddr, size_t size, enum dma_data_direction dir) #define dma_is_consistent(dma_handle) (1) /* all we do is coherent memory... */ +#ifdef CONFIG_XEN +/* arch/i386/kernel/swiotlb.o requires */ +void contiguous_bitmap_init(unsigned long end_pfn); + +static inline int +address_needs_mapping(struct device *hwdev, dma_addr_t addr) +{ + dma_addr_t mask = DMA_64BIT_MASK; + /* If the device has a mask, use it, otherwise default to 64 bits */ + if (hwdev && hwdev->dma_mask) + mask = *hwdev->dma_mask; + return (addr & ~mask) != 0; +} +#else +#define contiguous_bitmap_init(end_pfn) ((void)end_pfn) +#endif + +static inline int +range_straddles_page_boundary(void *p, size_t size) +{ + extern unsigned long *contiguous_bitmap; + return (((((unsigned long)p & ~PAGE_MASK) + size) > PAGE_SIZE) && + !test_bit(__pa(p) >> PAGE_SHIFT, contiguous_bitmap)); +} + #endif /* _ASM_IA64_DMA_MAPPING_H */ diff --git a/include/asm-ia64/dma.h b/include/asm-ia64/dma.h index 3be1b4925..dad3a735d 100644 --- a/include/asm-ia64/dma.h +++ b/include/asm-ia64/dma.h @@ -6,7 +6,6 @@ * David Mosberger-Tang */ -#include #include /* need byte IO */ diff --git a/include/asm-ia64/elf.h b/include/asm-ia64/elf.h index 446fce036..d96b5ebab 100644 --- a/include/asm-ia64/elf.h +++ b/include/asm-ia64/elf.h @@ -8,7 +8,6 @@ * David Mosberger-Tang */ -#include #include #include @@ -155,6 +154,30 @@ extern void ia64_init_addr_space (void); #define ELF_NGREG 128 /* we really need just 72 but let's leave some headroom... */ #define ELF_NFPREG 128 /* f0 and f1 could be omitted, but so what... */ +/* elf_gregset_t register offsets */ +#define ELF_GR_0_OFFSET 0 +#define ELF_NAT_OFFSET (32 * sizeof(elf_greg_t)) +#define ELF_PR_OFFSET (33 * sizeof(elf_greg_t)) +#define ELF_BR_0_OFFSET (34 * sizeof(elf_greg_t)) +#define ELF_CR_IIP_OFFSET (42 * sizeof(elf_greg_t)) +#define ELF_CFM_OFFSET (43 * sizeof(elf_greg_t)) +#define ELF_CR_IPSR_OFFSET (44 * sizeof(elf_greg_t)) +#define ELF_GR_OFFSET(i) (ELF_GR_0_OFFSET + i * sizeof(elf_greg_t)) +#define ELF_BR_OFFSET(i) (ELF_BR_0_OFFSET + i * sizeof(elf_greg_t)) +#define ELF_AR_RSC_OFFSET (45 * sizeof(elf_greg_t)) +#define ELF_AR_BSP_OFFSET (46 * sizeof(elf_greg_t)) +#define ELF_AR_BSPSTORE_OFFSET (47 * sizeof(elf_greg_t)) +#define ELF_AR_RNAT_OFFSET (48 * sizeof(elf_greg_t)) +#define ELF_AR_CCV_OFFSET (49 * sizeof(elf_greg_t)) +#define ELF_AR_UNAT_OFFSET (50 * sizeof(elf_greg_t)) +#define ELF_AR_FPSR_OFFSET (51 * sizeof(elf_greg_t)) +#define ELF_AR_PFS_OFFSET (52 * sizeof(elf_greg_t)) +#define ELF_AR_LC_OFFSET (53 * sizeof(elf_greg_t)) +#define ELF_AR_EC_OFFSET (54 * sizeof(elf_greg_t)) +#define ELF_AR_CSD_OFFSET (55 * sizeof(elf_greg_t)) +#define ELF_AR_SSD_OFFSET (56 * sizeof(elf_greg_t)) +#define ELF_AR_END_OFFSET (57 * sizeof(elf_greg_t)) + typedef unsigned long elf_fpxregset_t; typedef unsigned long elf_greg_t; diff --git a/include/asm-ia64/gcc_intrin.h b/include/asm-ia64/gcc_intrin.h index 4fb4e439b..b23a28029 100644 --- a/include/asm-ia64/gcc_intrin.h +++ b/include/asm-ia64/gcc_intrin.h @@ -26,7 +26,7 @@ extern void ia64_bad_param_for_getreg (void); register unsigned long ia64_r13 asm ("r13") __attribute_used__; -#define ia64_setreg(regnum, val) \ +#define __ia64_setreg(regnum, val) \ ({ \ switch (regnum) { \ case _IA64_REG_PSR_L: \ @@ -55,7 +55,7 @@ register unsigned long ia64_r13 asm ("r13") __attribute_used__; } \ }) -#define ia64_getreg(regnum) \ +#define __ia64_getreg(regnum) \ ({ \ __u64 ia64_intri_res; \ \ @@ -92,7 +92,7 @@ register unsigned long ia64_r13 asm ("r13") __attribute_used__; #define ia64_hint_pause 0 -#define ia64_hint(mode) \ +#define __ia64_hint(mode) \ ({ \ switch (mode) { \ case ia64_hint_pause: \ @@ -374,7 +374,7 @@ register unsigned long ia64_r13 asm ("r13") __attribute_used__; #define ia64_invala() asm volatile ("invala" ::: "memory") -#define ia64_thash(addr) \ +#define __ia64_thash(addr) \ ({ \ __u64 ia64_intri_res; \ asm volatile ("thash %0=%1" : "=r"(ia64_intri_res) : "r" (addr)); \ @@ -394,18 +394,18 @@ register unsigned long ia64_r13 asm ("r13") __attribute_used__; #define ia64_nop(x) asm volatile ("nop %0"::"i"(x)); -#define ia64_itci(addr) asm volatile ("itc.i %0;;" :: "r"(addr) : "memory") +#define __ia64_itci(addr) asm volatile ("itc.i %0;;" :: "r"(addr) : "memory") -#define ia64_itcd(addr) asm volatile ("itc.d %0;;" :: "r"(addr) : "memory") +#define __ia64_itcd(addr) asm volatile ("itc.d %0;;" :: "r"(addr) : "memory") -#define ia64_itri(trnum, addr) asm volatile ("itr.i itr[%0]=%1" \ +#define __ia64_itri(trnum, addr) asm volatile ("itr.i itr[%0]=%1" \ :: "r"(trnum), "r"(addr) : "memory") -#define ia64_itrd(trnum, addr) asm volatile ("itr.d dtr[%0]=%1" \ +#define __ia64_itrd(trnum, addr) asm volatile ("itr.d dtr[%0]=%1" \ :: "r"(trnum), "r"(addr) : "memory") -#define ia64_tpa(addr) \ +#define __ia64_tpa(addr) \ ({ \ __u64 ia64_pa; \ asm volatile ("tpa %0 = %1" : "=r"(ia64_pa) : "r"(addr) : "memory"); \ @@ -415,22 +415,22 @@ register unsigned long ia64_r13 asm ("r13") __attribute_used__; #define __ia64_set_dbr(index, val) \ asm volatile ("mov dbr[%0]=%1" :: "r"(index), "r"(val) : "memory") -#define ia64_set_ibr(index, val) \ +#define __ia64_set_ibr(index, val) \ asm volatile ("mov ibr[%0]=%1" :: "r"(index), "r"(val) : "memory") -#define ia64_set_pkr(index, val) \ +#define __ia64_set_pkr(index, val) \ asm volatile ("mov pkr[%0]=%1" :: "r"(index), "r"(val) : "memory") -#define ia64_set_pmc(index, val) \ +#define __ia64_set_pmc(index, val) \ asm volatile ("mov pmc[%0]=%1" :: "r"(index), "r"(val) : "memory") -#define ia64_set_pmd(index, val) \ +#define __ia64_set_pmd(index, val) \ asm volatile ("mov pmd[%0]=%1" :: "r"(index), "r"(val) : "memory") -#define ia64_set_rr(index, val) \ +#define __ia64_set_rr(index, val) \ asm volatile ("mov rr[%0]=%1" :: "r"(index), "r"(val) : "memory"); -#define ia64_get_cpuid(index) \ +#define __ia64_get_cpuid(index) \ ({ \ __u64 ia64_intri_res; \ asm volatile ("mov %0=cpuid[%r1]" : "=r"(ia64_intri_res) : "rO"(index)); \ @@ -444,21 +444,21 @@ register unsigned long ia64_r13 asm ("r13") __attribute_used__; ia64_intri_res; \ }) -#define ia64_get_ibr(index) \ +#define __ia64_get_ibr(index) \ ({ \ __u64 ia64_intri_res; \ asm volatile ("mov %0=ibr[%1]" : "=r"(ia64_intri_res) : "r"(index)); \ ia64_intri_res; \ }) -#define ia64_get_pkr(index) \ +#define __ia64_get_pkr(index) \ ({ \ __u64 ia64_intri_res; \ asm volatile ("mov %0=pkr[%1]" : "=r"(ia64_intri_res) : "r"(index)); \ ia64_intri_res; \ }) -#define ia64_get_pmc(index) \ +#define __ia64_get_pmc(index) \ ({ \ __u64 ia64_intri_res; \ asm volatile ("mov %0=pmc[%1]" : "=r"(ia64_intri_res) : "r"(index)); \ @@ -466,48 +466,48 @@ register unsigned long ia64_r13 asm ("r13") __attribute_used__; }) -#define ia64_get_pmd(index) \ +#define __ia64_get_pmd(index) \ ({ \ __u64 ia64_intri_res; \ asm volatile ("mov %0=pmd[%1]" : "=r"(ia64_intri_res) : "r"(index)); \ ia64_intri_res; \ }) -#define ia64_get_rr(index) \ +#define __ia64_get_rr(index) \ ({ \ __u64 ia64_intri_res; \ asm volatile ("mov %0=rr[%1]" : "=r"(ia64_intri_res) : "r" (index)); \ ia64_intri_res; \ }) -#define ia64_fc(addr) asm volatile ("fc %0" :: "r"(addr) : "memory") +#define __ia64_fc(addr) asm volatile ("fc %0" :: "r"(addr) : "memory") #define ia64_sync_i() asm volatile (";; sync.i" ::: "memory") -#define ia64_ssm(mask) asm volatile ("ssm %0":: "i"((mask)) : "memory") -#define ia64_rsm(mask) asm volatile ("rsm %0":: "i"((mask)) : "memory") +#define __ia64_ssm(mask) asm volatile ("ssm %0":: "i"((mask)) : "memory") +#define __ia64_rsm(mask) asm volatile ("rsm %0":: "i"((mask)) : "memory") #define ia64_sum(mask) asm volatile ("sum %0":: "i"((mask)) : "memory") #define ia64_rum(mask) asm volatile ("rum %0":: "i"((mask)) : "memory") -#define ia64_ptce(addr) asm volatile ("ptc.e %0" :: "r"(addr)) +#define __ia64_ptce(addr) asm volatile ("ptc.e %0" :: "r"(addr)) -#define ia64_ptcga(addr, size) \ +#define __ia64_ptcga(addr, size) \ do { \ asm volatile ("ptc.ga %0,%1" :: "r"(addr), "r"(size) : "memory"); \ ia64_dv_serialize_data(); \ } while (0) -#define ia64_ptcl(addr, size) \ +#define __ia64_ptcl(addr, size) \ do { \ asm volatile ("ptc.l %0,%1" :: "r"(addr), "r"(size) : "memory"); \ ia64_dv_serialize_data(); \ } while (0) -#define ia64_ptri(addr, size) \ +#define __ia64_ptri(addr, size) \ asm volatile ("ptr.i %0,%1" :: "r"(addr), "r"(size) : "memory") -#define ia64_ptrd(addr, size) \ +#define __ia64_ptrd(addr, size) \ asm volatile ("ptr.d %0,%1" :: "r"(addr), "r"(size) : "memory") /* Values for lfhint in ia64_lfetch and ia64_lfetch_fault */ @@ -589,7 +589,7 @@ do { \ } \ }) -#define ia64_intrin_local_irq_restore(x) \ +#define __ia64_intrin_local_irq_restore(x) \ do { \ asm volatile (";; cmp.ne p6,p7=%0,r0;;" \ "(p6) ssm psr.i;" \ @@ -598,4 +598,6 @@ do { \ :: "r"((x)) : "p6", "p7", "memory"); \ } while (0) +#define __ia64_get_psr_i() (__ia64_getreg(_IA64_REG_PSR) & 0x4000UL) + #endif /* _ASM_IA64_GCC_INTRIN_H */ diff --git a/include/asm-ia64/hardirq.h b/include/asm-ia64/hardirq.h index 33ef8f096..140e495b8 100644 --- a/include/asm-ia64/hardirq.h +++ b/include/asm-ia64/hardirq.h @@ -6,7 +6,6 @@ * David Mosberger-Tang */ -#include #include #include diff --git a/include/asm-ia64/hw_irq.h b/include/asm-ia64/hw_irq.h index 0cf119b42..d990e9e57 100644 --- a/include/asm-ia64/hw_irq.h +++ b/include/asm-ia64/hw_irq.h @@ -15,7 +15,11 @@ #include #include +#ifndef CONFIG_XEN typedef u8 ia64_vector; +#else +typedef u16 ia64_vector; +#endif /* * 0 special @@ -47,9 +51,19 @@ typedef u8 ia64_vector; #define IA64_CMC_VECTOR 0x1f /* corrected machine-check interrupt vector */ /* * Vectors 0x20-0x2f are reserved for legacy ISA IRQs. + * Use vectors 0x30-0xe7 as the default device vector range for ia64. + * Platforms may choose to reduce this range in platform_irq_setup, but the + * platform range must fall within + * [IA64_DEF_FIRST_DEVICE_VECTOR..IA64_DEF_LAST_DEVICE_VECTOR] */ -#define IA64_FIRST_DEVICE_VECTOR 0x30 -#define IA64_LAST_DEVICE_VECTOR 0xe7 +extern int ia64_first_device_vector; +extern int ia64_last_device_vector; + +#define IA64_DEF_FIRST_DEVICE_VECTOR 0x30 +#define IA64_DEF_LAST_DEVICE_VECTOR 0xe7 +#define IA64_FIRST_DEVICE_VECTOR ia64_first_device_vector +#define IA64_LAST_DEVICE_VECTOR ia64_last_device_vector +#define IA64_MAX_DEVICE_VECTORS (IA64_DEF_LAST_DEVICE_VECTOR - IA64_DEF_FIRST_DEVICE_VECTOR + 1) #define IA64_NUM_DEVICE_VECTORS (IA64_LAST_DEVICE_VECTOR - IA64_FIRST_DEVICE_VECTOR + 1) #define IA64_MCA_RENDEZ_VECTOR 0xe8 /* MCA rendez interrupt */ @@ -83,12 +97,18 @@ extern struct hw_interrupt_type irq_type_ia64_lsapic; /* CPU-internal interrupt extern int assign_irq_vector (int irq); /* allocate a free vector */ extern void free_irq_vector (int vector); +extern int reserve_irq_vector (int vector); extern void ia64_send_ipi (int cpu, int vector, int delivery_mode, int redirect); extern void register_percpu_irq (ia64_vector vec, struct irqaction *action); -static inline void -hw_resend_irq (struct hw_interrupt_type *h, unsigned int vector) +static inline void ia64_resend_irq(unsigned int vector) { +#ifdef CONFIG_XEN + extern void resend_irq_on_evtchn(unsigned int i); + if (is_running_on_xen()) + resend_irq_on_evtchn(vector); + else +#endif /* CONFIG_XEN */ platform_send_ipi(smp_processor_id(), vector, IA64_IPI_DM_INT, 0); } diff --git a/include/asm-ia64/ia32.h b/include/asm-ia64/ia32.h index f8044a116..5ff8d74c3 100644 --- a/include/asm-ia64/ia32.h +++ b/include/asm-ia64/ia32.h @@ -1,7 +1,6 @@ #ifndef _ASM_IA64_IA32_H #define _ASM_IA64_IA32_H -#include #include #include diff --git a/include/asm-ia64/ide.h b/include/asm-ia64/ide.h index 93f45c5f1..e928675de 100644 --- a/include/asm-ia64/ide.h +++ b/include/asm-ia64/ide.h @@ -13,7 +13,6 @@ #ifdef __KERNEL__ -#include #include diff --git a/include/asm-ia64/intel_intrin.h b/include/asm-ia64/intel_intrin.h index d069b6acd..abc660e58 100644 --- a/include/asm-ia64/intel_intrin.h +++ b/include/asm-ia64/intel_intrin.h @@ -16,8 +16,10 @@ * intrinsic */ -#define ia64_getreg __getReg -#define ia64_setreg __setReg +#define __ia64_getreg __getReg +#define __ia64_setreg __setReg + +#define __ia64_hint(x) #define ia64_hint __hint #define ia64_hint_pause __hint_pause @@ -33,16 +35,16 @@ #define ia64_getf_exp __getf_exp #define ia64_shrp _m64_shrp -#define ia64_tpa __tpa +#define __ia64_tpa __tpa #define ia64_invala __invala #define ia64_invala_gr __invala_gr #define ia64_invala_fr __invala_fr #define ia64_nop __nop #define ia64_sum __sum -#define ia64_ssm __ssm +#define __ia64_ssm __ssm #define ia64_rum __rum -#define ia64_rsm __rsm -#define ia64_fc __fc +#define __ia64_rsm __rsm +#define __ia64_fc __fc #define ia64_ldfs __ldfs #define ia64_ldfd __ldfd @@ -80,24 +82,24 @@ #define __ia64_set_dbr(index, val) \ __setIndReg(_IA64_REG_INDR_DBR, index, val) -#define ia64_set_ibr(index, val) \ +#define __ia64_set_ibr(index, val) \ __setIndReg(_IA64_REG_INDR_IBR, index, val) -#define ia64_set_pkr(index, val) \ +#define __ia64_set_pkr(index, val) \ __setIndReg(_IA64_REG_INDR_PKR, index, val) -#define ia64_set_pmc(index, val) \ +#define __ia64_set_pmc(index, val) \ __setIndReg(_IA64_REG_INDR_PMC, index, val) -#define ia64_set_pmd(index, val) \ +#define __ia64_set_pmd(index, val) \ __setIndReg(_IA64_REG_INDR_PMD, index, val) -#define ia64_set_rr(index, val) \ +#define __ia64_set_rr(index, val) \ __setIndReg(_IA64_REG_INDR_RR, index, val) -#define ia64_get_cpuid(index) __getIndReg(_IA64_REG_INDR_CPUID, index) +#define __ia64_get_cpuid(index) __getIndReg(_IA64_REG_INDR_CPUID, index) #define __ia64_get_dbr(index) __getIndReg(_IA64_REG_INDR_DBR, index) -#define ia64_get_ibr(index) __getIndReg(_IA64_REG_INDR_IBR, index) -#define ia64_get_pkr(index) __getIndReg(_IA64_REG_INDR_PKR, index) -#define ia64_get_pmc(index) __getIndReg(_IA64_REG_INDR_PMC, index) -#define ia64_get_pmd(index) __getIndReg(_IA64_REG_INDR_PMD, index) -#define ia64_get_rr(index) __getIndReg(_IA64_REG_INDR_RR, index) +#define __ia64_get_ibr(index) __getIndReg(_IA64_REG_INDR_IBR, index) +#define __ia64_get_pkr(index) __getIndReg(_IA64_REG_INDR_PKR, index) +#define __ia64_get_pmc(index) __getIndReg(_IA64_REG_INDR_PMC, index) +#define __ia64_get_pmd(index) __getIndReg(_IA64_REG_INDR_PMD, index) +#define __ia64_get_rr(index) __getIndReg(_IA64_REG_INDR_RR, index) #define ia64_srlz_d __dsrlz #define ia64_srlz_i __isrlz @@ -116,18 +118,18 @@ #define ia64_ld8_acq __ld8_acq #define ia64_sync_i __synci -#define ia64_thash __thash -#define ia64_ttag __ttag -#define ia64_itcd __itcd -#define ia64_itci __itci -#define ia64_itrd __itrd -#define ia64_itri __itri -#define ia64_ptce __ptce -#define ia64_ptcl __ptcl -#define ia64_ptcg __ptcg -#define ia64_ptcga __ptcga -#define ia64_ptri __ptri -#define ia64_ptrd __ptrd +#define __ia64_thash __thash +#define __ia64_ttag __ttag +#define __ia64_itcd __itcd +#define __ia64_itci __itci +#define __ia64_itrd __itrd +#define __ia64_itri __itri +#define __ia64_ptce __ptce +#define __ia64_ptcl __ptcl +#define __ia64_ptcg __ptcg +#define __ia64_ptcga __ptcga +#define __ia64_ptri __ptri +#define __ia64_ptrd __ptrd #define ia64_dep_mi _m64_dep_mi /* Values for lfhint in __lfetch and __lfetch_fault */ @@ -142,16 +144,18 @@ #define ia64_lfetch_fault __lfetch_fault #define ia64_lfetch_fault_excl __lfetch_fault_excl -#define ia64_intrin_local_irq_restore(x) \ +#define __ia64_intrin_local_irq_restore(x) \ do { \ if ((x) != 0) { \ - ia64_ssm(IA64_PSR_I); \ + __ia64_ssm(IA64_PSR_I); \ ia64_srlz_d(); \ } else { \ - ia64_rsm(IA64_PSR_I); \ + __ia64_rsm(IA64_PSR_I); \ } \ } while (0) +#define __ia64_get_psr_i() (__ia64_getreg(_IA64_REG_PSR) & 0x4000UL) + #define __builtin_trap() __break(0); #endif /* _ASM_IA64_INTEL_INTRIN_H */ diff --git a/include/asm-ia64/intrinsics.h b/include/asm-ia64/intrinsics.h index 8089f955e..3a95aa432 100644 --- a/include/asm-ia64/intrinsics.h +++ b/include/asm-ia64/intrinsics.h @@ -9,7 +9,6 @@ */ #ifndef __ASSEMBLY__ -#include /* include compiler specific intrinsics */ #include diff --git a/include/asm-ia64/io.h b/include/asm-ia64/io.h index c2e374210..14ac58556 100644 --- a/include/asm-ia64/io.h +++ b/include/asm-ia64/io.h @@ -66,9 +66,11 @@ extern unsigned int num_io_spaces; #define PIO_RESERVED __IA64_UNCACHED_OFFSET #define HAVE_ARCH_PIO_SIZE +#include #include #include #include +#include #include #include @@ -88,16 +90,49 @@ phys_to_virt (unsigned long address) } #define ARCH_HAS_VALID_PHYS_ADDR_RANGE +extern u64 kern_mem_attribute (unsigned long phys_addr, unsigned long size); extern int valid_phys_addr_range (unsigned long addr, size_t count); /* efi.c */ -extern int valid_mmap_phys_addr_range (unsigned long addr, size_t count); +extern int valid_mmap_phys_addr_range (unsigned long pfn, size_t count); /* * The following two macros are deprecated and scheduled for removal. * Please use the PCI-DMA interface defined in instead. */ +#ifndef CONFIG_XEN #define bus_to_virt phys_to_virt #define virt_to_bus virt_to_phys #define page_to_bus page_to_phys +#define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) +#define page_to_pseudophys(page) page_to_phys(page) +#else /* CONFIG_XEN */ +#define bus_to_virt(bus) \ + phys_to_virt(machine_to_phys_for_dma(bus)) +#define virt_to_bus(virt) \ + phys_to_machine_for_dma(virt_to_phys(virt)) +#define page_to_bus(page) \ + phys_to_machine_for_dma(page_to_pseudophys(page)) + +#define page_to_pseudophys(page) \ + ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT) + +/* + * Drivers that use page_to_phys() for bus addresses are broken. + * This includes: + * drivers/ide/cris/ide-cris.c + * drivers/scsi/dec_esp.c + */ +#define page_to_phys(page) (page_to_pseudophys(page)) +#define bvec_to_bus(bv) (page_to_bus((bv)->bv_page) + \ + (unsigned long) (bv)->bv_offset) +#define bio_to_pseudophys(bio) (page_to_pseudophys(bio_page((bio))) + \ + (unsigned long) bio_offset((bio))) +#define bvec_to_pseudophys(bv) (page_to_pseudophys((bv)->bv_page) + \ + (unsigned long) (bv)->bv_offset) +#define BIOVEC_PHYS_MERGEABLE(vec1, vec2) \ + (((bvec_to_bus((vec1)) + (vec1)->bv_len) == bvec_to_bus((vec2))) && \ + ((bvec_to_pseudophys((vec1)) + (vec1)->bv_len) == \ + bvec_to_pseudophys((vec2)))) +#endif /* CONFIG_XEN */ # endif /* KERNEL */ diff --git a/include/asm-ia64/iosapic.h b/include/asm-ia64/iosapic.h index 20f98f175..87de4873f 100644 --- a/include/asm-ia64/iosapic.h +++ b/include/asm-ia64/iosapic.h @@ -53,6 +53,7 @@ #define NR_IOSAPICS 256 +#ifndef CONFIG_XEN static inline unsigned int iosapic_read(char __iomem *iosapic, unsigned int reg) { writel(reg, iosapic + IOSAPIC_REG_SELECT); @@ -64,6 +65,7 @@ static inline void iosapic_write(char __iomem *iosapic, unsigned int reg, u32 va writel(reg, iosapic + IOSAPIC_REG_SELECT); writel(val, iosapic + IOSAPIC_WINDOW); } +#endif static inline void iosapic_eoi(char __iomem *iosapic, u32 vector) { diff --git a/include/asm-ia64/irq.h b/include/asm-ia64/irq.h index dbe86c0bb..96f58d78b 100644 --- a/include/asm-ia64/irq.h +++ b/include/asm-ia64/irq.h @@ -11,13 +11,39 @@ * 02/29/00 D.Mosberger moved most things into hw_irq.h */ +#ifndef CONFIG_XEN #define NR_IRQS 256 #define NR_IRQ_VECTORS NR_IRQS - +#else /* - * IRQ line status macro IRQ_PER_CPU is used + * The flat IRQ space is divided into two regions: + * 1. A one-to-one mapping of real physical IRQs. This space is only used + * if we have physical device-access privilege. This region is at the + * start of the IRQ space so that existing device drivers do not need + * to be modified to translate physical IRQ numbers into our IRQ space. + * 3. A dynamic mapping of inter-domain and Xen-sourced virtual IRQs. These + * are bound using the provided bind/unbind functions. */ -#define ARCH_HAS_IRQ_PER_CPU + +#define PIRQ_BASE 0 +#define NR_PIRQS 256 + +#define DYNIRQ_BASE (PIRQ_BASE + NR_PIRQS) +#define NR_DYNIRQS 256 + +#define NR_IRQS (NR_PIRQS + NR_DYNIRQS) +#define NR_IRQ_VECTORS NR_IRQS + +#define pirq_to_irq(_x) ((_x) + PIRQ_BASE) +#define irq_to_pirq(_x) ((_x) - PIRQ_BASE) + +#define dynirq_to_irq(_x) ((_x) + DYNIRQ_BASE) +#define irq_to_dynirq(_x) ((_x) - DYNIRQ_BASE) + +#define RESCHEDULE_VECTOR 0 +#define IPI_VECTOR 1 +#define NR_IPIS 2 +#endif /* CONFIG_XEN */ static __inline__ int irq_canonicalize (int irq) diff --git a/include/asm-ia64/kdebug.h b/include/asm-ia64/kdebug.h index c195a9ad1..aed7142f9 100644 --- a/include/asm-ia64/kdebug.h +++ b/include/asm-ia64/kdebug.h @@ -40,6 +40,8 @@ struct die_args { extern int register_die_notifier(struct notifier_block *); extern int unregister_die_notifier(struct notifier_block *); +extern int register_page_fault_notifier(struct notifier_block *); +extern int unregister_page_fault_notifier(struct notifier_block *); extern struct atomic_notifier_head ia64die_chain; enum die_val { diff --git a/include/asm-ia64/kmap_types.h b/include/asm-ia64/kmap_types.h index bc777525f..5d1658aa2 100644 --- a/include/asm-ia64/kmap_types.h +++ b/include/asm-ia64/kmap_types.h @@ -1,7 +1,6 @@ #ifndef _ASM_IA64_KMAP_TYPES_H #define _ASM_IA64_KMAP_TYPES_H -#include #ifdef CONFIG_DEBUG_HIGHMEM # define D(n) __KM_FENCE_##n , diff --git a/include/asm-ia64/kprobes.h b/include/asm-ia64/kprobes.h index 8c0fc227f..938904910 100644 --- a/include/asm-ia64/kprobes.h +++ b/include/asm-ia64/kprobes.h @@ -82,6 +82,7 @@ struct kprobe_ctlblk { #define JPROBE_ENTRY(pentry) (kprobe_opcode_t *)pentry #define ARCH_SUPPORTS_KRETPROBES +#define ARCH_INACTIVE_KPROBE_COUNT 1 #define SLOT0_OPCODE_SHIFT (37) #define SLOT1_p1_OPCODE_SHIFT (37 - (64-46)) @@ -124,5 +125,6 @@ static inline void jprobe_return(void) } extern void invalidate_stacked_regs(void); extern void flush_register_stack(void); +extern void flush_insn_slot(struct kprobe *p); #endif /* _ASM_KPROBES_H */ diff --git a/include/asm-ia64/machvec.h b/include/asm-ia64/machvec.h index a9c995a86..15b545a89 100644 --- a/include/asm-ia64/machvec.h +++ b/include/asm-ia64/machvec.h @@ -10,7 +10,6 @@ #ifndef _ASM_IA64_MACHVEC_H #define _ASM_IA64_MACHVEC_H -#include #include /* forward declarations: */ @@ -76,6 +75,7 @@ typedef unsigned char ia64_mv_readb_relaxed_t (const volatile void __iomem *); typedef unsigned short ia64_mv_readw_relaxed_t (const volatile void __iomem *); typedef unsigned int ia64_mv_readl_relaxed_t (const volatile void __iomem *); typedef unsigned long ia64_mv_readq_relaxed_t (const volatile void __iomem *); +typedef int ia64_mv_msi_init_t (void); static inline void machvec_noop (void) @@ -154,6 +154,7 @@ extern void machvec_tlb_migrate_finish (struct mm_struct *); # define platform_readl_relaxed ia64_mv.readl_relaxed # define platform_readq_relaxed ia64_mv.readq_relaxed # define platform_migrate ia64_mv.migrate +# define platform_msi_init ia64_mv.msi_init # endif /* __attribute__((__aligned__(16))) is required to make size of the @@ -203,6 +204,7 @@ struct ia64_machine_vector { ia64_mv_readl_relaxed_t *readl_relaxed; ia64_mv_readq_relaxed_t *readq_relaxed; ia64_mv_migrate_t *migrate; + ia64_mv_msi_init_t *msi_init; } __attribute__((__aligned__(16))); /* align attrib? see above comment */ #define MACHVEC_INIT(name) \ @@ -248,6 +250,7 @@ struct ia64_machine_vector { platform_readl_relaxed, \ platform_readq_relaxed, \ platform_migrate, \ + platform_msi_init, \ } extern struct ia64_machine_vector ia64_mv; @@ -401,5 +404,8 @@ extern int ia64_pci_legacy_write(struct pci_bus *bus, u16 port, u32 val, u8 size #ifndef platform_migrate # define platform_migrate machvec_noop_task #endif +#ifndef platform_msi_init +# define platform_msi_init ((ia64_mv_msi_init_t*)NULL) +#endif #endif /* _ASM_IA64_MACHVEC_H */ diff --git a/include/asm-ia64/machvec_dig.h b/include/asm-ia64/machvec_dig.h index 8a0752f40..ccb777e37 100644 --- a/include/asm-ia64/machvec_dig.h +++ b/include/asm-ia64/machvec_dig.h @@ -13,4 +13,19 @@ extern ia64_mv_setup_t dig_setup; #define platform_name "dig" #define platform_setup dig_setup +#ifdef CONFIG_XEN +# define platform_dma_map_sg dma_map_sg +# define platform_dma_unmap_sg dma_unmap_sg +# define platform_dma_mapping_error dma_mapping_error +# define platform_dma_supported dma_supported +# define platform_dma_alloc_coherent dma_alloc_coherent +# define platform_dma_free_coherent dma_free_coherent +# define platform_dma_map_single dma_map_single +# define platform_dma_unmap_single dma_unmap_single +# define platform_dma_sync_single_for_cpu \ + dma_sync_single_for_cpu +# define platform_dma_sync_single_for_device \ + dma_sync_single_for_device +#endif + #endif /* _ASM_IA64_MACHVEC_DIG_h */ diff --git a/include/asm-ia64/machvec_sn2.h b/include/asm-ia64/machvec_sn2.h index da1d43755..cf724dc79 100644 --- a/include/asm-ia64/machvec_sn2.h +++ b/include/asm-ia64/machvec_sn2.h @@ -67,6 +67,8 @@ extern ia64_mv_dma_sync_sg_for_device sn_dma_sync_sg_for_device; extern ia64_mv_dma_mapping_error sn_dma_mapping_error; extern ia64_mv_dma_supported sn_dma_supported; extern ia64_mv_migrate_t sn_migrate; +extern ia64_mv_msi_init_t sn_msi_init; + /* * This stuff has dual use! @@ -117,6 +119,11 @@ extern ia64_mv_migrate_t sn_migrate; #define platform_dma_mapping_error sn_dma_mapping_error #define platform_dma_supported sn_dma_supported #define platform_migrate sn_migrate +#ifdef CONFIG_PCI_MSI +#define platform_msi_init sn_msi_init +#else +#define platform_msi_init ((ia64_mv_msi_init_t*)NULL) +#endif #include diff --git a/include/asm-ia64/mca.h b/include/asm-ia64/mca.h index 9c5389b7e..ee97f7c2d 100644 --- a/include/asm-ia64/mca.h +++ b/include/asm-ia64/mca.h @@ -69,14 +69,16 @@ typedef struct ia64_mc_info_s { */ struct ia64_sal_os_state { - /* SAL to OS, must be at offset 0 */ + + /* SAL to OS */ u64 os_gp; /* GP of the os registered with the SAL, physical */ u64 pal_proc; /* PAL_PROC entry point, physical */ u64 sal_proc; /* SAL_PROC entry point, physical */ u64 rv_rc; /* MCA - Rendezvous state, INIT - reason code */ u64 proc_state_param; /* from R18 */ u64 monarch; /* 1 for a monarch event, 0 for a slave */ - /* common, must follow SAL to OS */ + + /* common */ u64 sal_ra; /* Return address in SAL, physical */ u64 sal_gp; /* GP of the SAL - physical */ pal_min_state_area_t *pal_min_state; /* from R17. physical in asm, virtual in C */ @@ -98,7 +100,8 @@ struct ia64_sal_os_state { u64 iipa; u64 iim; u64 iha; - /* OS to SAL, must follow common */ + + /* OS to SAL */ u64 os_status; /* OS status to SAL, enum below */ u64 context; /* 0 if return to same context 1 if return to new context */ diff --git a/include/asm-ia64/meminit.h b/include/asm-ia64/meminit.h index 46501b01a..5cd4b89b5 100644 --- a/include/asm-ia64/meminit.h +++ b/include/asm-ia64/meminit.h @@ -7,7 +7,6 @@ * for more details. */ -#include /* * Entries defined so far: @@ -17,10 +16,15 @@ * - command line string * - kernel code & data * - Kernel memory map built from EFI memory map + * - xen start info * * More could be added if necessary */ +#ifndef CONFIG_XEN #define IA64_MAX_RSVD_REGIONS 6 +#else +#define IA64_MAX_RSVD_REGIONS 7 +#endif struct rsvd_region { unsigned long start; /* virtual address of beginning of element */ @@ -57,6 +61,11 @@ extern void efi_memmap_init(unsigned long *, unsigned long *); extern struct page *vmem_map; extern int find_largest_hole (u64 start, u64 end, void *arg); extern int create_mem_map_page_table (u64 start, u64 end, void *arg); + extern int vmemmap_find_next_valid_pfn(int, int); +#else +static inline int vmemmap_find_next_valid_pfn(int node, int i) +{ + return i + 1; +} #endif - #endif /* meminit_h */ diff --git a/include/asm-ia64/mman.h b/include/asm-ia64/mman.h index b242f9522..c73b87832 100644 --- a/include/asm-ia64/mman.h +++ b/include/asm-ia64/mman.h @@ -8,14 +8,6 @@ * David Mosberger-Tang , Hewlett-Packard Co */ -#ifdef __KERNEL__ -#ifndef __ASSEMBLY__ -#define arch_mmap_check ia64_map_check_rgn -int ia64_map_check_rgn(unsigned long addr, unsigned long len, - unsigned long flags); -#endif -#endif - #include #define MAP_GROWSDOWN 0x00100 /* stack-like segment */ @@ -30,4 +22,12 @@ int ia64_map_check_rgn(unsigned long addr, unsigned long len, #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ +#ifdef __KERNEL__ +#ifndef __ASSEMBLY__ +#define arch_mmap_check ia64_mmap_check +int ia64_mmap_check(unsigned long addr, unsigned long len, + unsigned long flags); +#endif +#endif + #endif /* _ASM_IA64_MMAN_H */ diff --git a/include/asm-ia64/msi.h b/include/asm-ia64/msi.h index 97890f776..bb92b0dbd 100644 --- a/include/asm-ia64/msi.h +++ b/include/asm-ia64/msi.h @@ -14,4 +14,16 @@ static inline void set_intr_gate (int nr, void *func) {} #define ack_APIC_irq ia64_eoi #define MSI_TARGET_CPU_SHIFT 4 +extern struct msi_ops msi_apic_ops; + +static inline int msi_arch_init(void) +{ + if (platform_msi_init) + return platform_msi_init(); + + /* default ops for most ia64 platforms */ + msi_register(&msi_apic_ops); + return 0; +} + #endif /* ASM_MSI_H */ diff --git a/include/asm-ia64/nodedata.h b/include/asm-ia64/nodedata.h index 9978c7ce7..2fb337b0e 100644 --- a/include/asm-ia64/nodedata.h +++ b/include/asm-ia64/nodedata.h @@ -11,7 +11,6 @@ #ifndef _ASM_IA64_NODEDATA_H #define _ASM_IA64_NODEDATA_H -#include #include #include @@ -47,6 +46,18 @@ struct ia64_node_data { */ #define NODE_DATA(nid) (local_node_data->pg_data_ptrs[nid]) +/* + * LOCAL_DATA_ADDR - This is to calculate the address of other node's + * "local_node_data" at hot-plug phase. The local_node_data + * is pointed by per_cpu_page. Kernel usually use it for + * just executing cpu. However, when new node is hot-added, + * the addresses of local data for other nodes are necessary + * to update all of them. + */ +#define LOCAL_DATA_ADDR(pgdat) \ + ((struct ia64_node_data *)((u64)(pgdat) + \ + L1_CACHE_ALIGN(sizeof(struct pglist_data)))) + #endif /* CONFIG_NUMA */ #endif /* _ASM_IA64_NODEDATA_H */ diff --git a/include/asm-ia64/numa.h b/include/asm-ia64/numa.h index dae6aeb7b..7d5e2ccc3 100644 --- a/include/asm-ia64/numa.h +++ b/include/asm-ia64/numa.h @@ -11,7 +11,6 @@ #ifndef _ASM_IA64_NUMA_H #define _ASM_IA64_NUMA_H -#include #ifdef CONFIG_NUMA @@ -65,7 +64,13 @@ extern int paddr_to_nid(unsigned long paddr); #define local_nodeid (cpu_to_node_map[smp_processor_id()]) +extern void map_cpu_to_node(int cpu, int nid); +extern void unmap_cpu_from_node(int cpu, int nid); + + #else /* !CONFIG_NUMA */ +#define map_cpu_to_node(cpu, nid) do{}while(0) +#define unmap_cpu_from_node(cpu, nid) do{}while(0) #define paddr_to_nid(addr) 0 diff --git a/include/asm-ia64/page.h b/include/asm-ia64/page.h index 1dc2190f8..6b342519a 100644 --- a/include/asm-ia64/page.h +++ b/include/asm-ia64/page.h @@ -7,7 +7,7 @@ * David Mosberger-Tang */ -#include +# ifdef __KERNEL__ #include #include @@ -65,7 +65,6 @@ # define __pa(x) ((x) - PAGE_OFFSET) # define __va(x) ((x) + PAGE_OFFSET) #else /* !__ASSEMBLY */ -# ifdef __KERNEL__ # define STRICT_MM_TYPECHECKS extern void clear_page (void *page); @@ -127,7 +126,9 @@ extern unsigned long max_low_pfn; # define pfn_valid(pfn) (((pfn) >= min_low_pfn) && ((pfn) < max_low_pfn) && ia64_pfn_valid(pfn)) #endif +#ifndef CONFIG_XEN #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) +#endif #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) @@ -175,7 +176,6 @@ get_order (unsigned long size) return order; } -# endif /* __KERNEL__ */ #endif /* !__ASSEMBLY__ */ #ifdef STRICT_MM_TYPECHECKS @@ -229,6 +229,54 @@ get_order (unsigned long size) (((current->personality & READ_IMPLIES_EXEC) != 0) \ ? VM_EXEC : 0)) -#define devmem_is_allowed(x) 1 +#ifndef __ASSEMBLY__ +#ifdef CONFIG_XEN + +#include +#include +#include // to compile netback, netfront + +/* + * XXX hack! + * Linux/IA64 uses PG_arch_1. + * This hack will be removed once PG_foreign bit is taken. + * #include + */ +#ifdef __ASM_XEN_FOREIGN_PAGE_H__ +# error "don't include include/xen/foreign_page.h!" +#endif + +extern struct address_space xen_ia64_foreign_dummy_mapping; +#define PageForeign(page) \ + ((page)->mapping == &xen_ia64_foreign_dummy_mapping) +#define SetPageForeign(page, dtor) do { \ + set_page_private((page), (unsigned long)(dtor)); \ + (page)->mapping = &xen_ia64_foreign_dummy_mapping; \ + smp_rmb(); \ +} while (0) + +#define ClearPageForeign(page) do { \ + (page)->mapping = NULL; \ + smp_rmb(); \ + set_page_private((page), 0); \ +} while (0) + +#define PageForeignDestructor(page) \ + ( (void (*) (struct page *)) page_private(page) ) + +#define arch_free_page(_page,_order) \ +({ int foreign = PageForeign(_page); \ + if (foreign) \ + (PageForeignDestructor(_page))(_page); \ + foreign; \ +}) +#define HAVE_ARCH_FREE_PAGE + +#include + +#endif /* CONFIG_XEN */ +#endif /* __ASSEMBLY__ */ +#define devmem_is_allowed(x) 1 +# endif /* __KERNEL__ */ #endif /* _ASM_IA64_PAGE_H */ diff --git a/include/asm-ia64/pal.h b/include/asm-ia64/pal.h index 37e52a283..1b2fbc683 100644 --- a/include/asm-ia64/pal.h +++ b/include/asm-ia64/pal.h @@ -82,6 +82,7 @@ #ifndef __ASSEMBLY__ #include +#include #include /* @@ -1433,7 +1434,12 @@ typedef union pal_version_u { } pal_version_u_t; -/* Return PAL version information */ +/* + * Return PAL version information. While the documentation states that + * PAL_VERSION can be called in either physical or virtual mode, some + * implementations only allow physical calls. We don't call it very often, + * so the overhead isn't worth eliminating. + */ static inline s64 ia64_pal_version (pal_version_u_t *pal_min_version, pal_version_u_t *pal_cur_version) { diff --git a/include/asm-ia64/param.h b/include/asm-ia64/param.h index 5e1e0d2d7..49c62dd5e 100644 --- a/include/asm-ia64/param.h +++ b/include/asm-ia64/param.h @@ -19,7 +19,6 @@ #define MAXHOSTNAMELEN 64 /* max length of hostname */ #ifdef __KERNEL__ -# include /* mustn't include outside of #ifdef __KERNEL__ */ # ifdef CONFIG_IA64_HP_SIM /* * Yeah, simulating stuff is slow, so let us catch some breath between diff --git a/include/asm-ia64/percpu.h b/include/asm-ia64/percpu.h index 2b14dee29..fbe5cf3ab 100644 --- a/include/asm-ia64/percpu.h +++ b/include/asm-ia64/percpu.h @@ -12,7 +12,6 @@ # define THIS_CPU(var) (per_cpu__##var) /* use this to mark accesses to per-CPU variables... */ #else /* !__ASSEMBLY__ */ -#include #include @@ -37,12 +36,14 @@ #ifdef CONFIG_SMP extern unsigned long __per_cpu_offset[NR_CPUS]; +#define per_cpu_offset(x) (__per_cpu_offset(x)) /* Equal to __per_cpu_offset[smp_processor_id()], but faster to access: */ DECLARE_PER_CPU(unsigned long, local_per_cpu_offset); #define per_cpu(var, cpu) (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset[cpu])) #define __get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __ia64_per_cpu_var(local_per_cpu_offset))) +#define __raw_get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __ia64_per_cpu_var(local_per_cpu_offset))) extern void percpu_modcopy(void *pcpudst, const void *src, unsigned long size); extern void setup_per_cpu_areas (void); @@ -52,6 +53,7 @@ extern void *per_cpu_init(void); #define per_cpu(var, cpu) (*((void)(cpu), &per_cpu__##var)) #define __get_cpu_var(var) per_cpu__##var +#define __raw_get_cpu_var(var) per_cpu__##var #define per_cpu_init() (__phys_per_cpu_start) #endif /* SMP */ diff --git a/include/asm-ia64/pgalloc.h b/include/asm-ia64/pgalloc.h index d66b8ebea..4e96d778e 100644 --- a/include/asm-ia64/pgalloc.h +++ b/include/asm-ia64/pgalloc.h @@ -17,7 +17,6 @@ * Copyright (C) 2000, Goutham Rao */ -#include #include #include @@ -130,7 +129,11 @@ static inline void pmd_free(pmd_t * pmd) static inline void pmd_populate(struct mm_struct *mm, pmd_t * pmd_entry, struct page *pte) { +#ifndef CONFIG_XEN pmd_val(*pmd_entry) = page_to_phys(pte); +#else + pmd_val(*pmd_entry) = page_to_pseudophys(pte); +#endif } static inline void diff --git a/include/asm-ia64/pgtable.h b/include/asm-ia64/pgtable.h index c0f8144f2..228981cad 100644 --- a/include/asm-ia64/pgtable.h +++ b/include/asm-ia64/pgtable.h @@ -12,7 +12,6 @@ * David Mosberger-Tang */ -#include #include #include @@ -317,22 +316,20 @@ ia64_phys_addr_valid (unsigned long addr) #define pte_mkhuge(pte) (__pte(pte_val(pte))) /* - * Macro to a page protection value as "uncacheable". Note that "protection" is really a - * misnomer here as the protection value contains the memory attribute bits, dirty bits, - * and various other bits as well. + * Make page protection values cacheable, uncacheable, or write- + * combining. Note that "protection" is really a misnomer here as the + * protection value contains the memory attribute bits, dirty bits, and + * various other bits as well. */ +#define pgprot_cacheable(prot) __pgprot((pgprot_val(prot) & ~_PAGE_MA_MASK) | _PAGE_MA_WB) #define pgprot_noncached(prot) __pgprot((pgprot_val(prot) & ~_PAGE_MA_MASK) | _PAGE_MA_UC) - -/* - * Macro to make mark a page protection value as "write-combining". - * Note that "protection" is really a misnomer here as the protection - * value contains the memory attribute bits, dirty bits, and various - * other bits as well. Accesses through a write-combining translation - * works bypasses the caches, but does allow for consecutive writes to - * be combined into single (but larger) write transactions. - */ #define pgprot_writecombine(prot) __pgprot((pgprot_val(prot) & ~_PAGE_MA_MASK) | _PAGE_MA_WC) +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 + static inline unsigned long pgd_index (unsigned long address) { diff --git a/include/asm-ia64/processor.h b/include/asm-ia64/processor.h index b3bd58e80..1837234c6 100644 --- a/include/asm-ia64/processor.h +++ b/include/asm-ia64/processor.h @@ -13,12 +13,12 @@ * 06/16/00 A. Mallick added csd/ssd/tssd for ia32 support */ -#include #include #include #include #include +#include #define IA64_NUM_DBG_REGS 8 /* diff --git a/include/asm-ia64/ptrace.h b/include/asm-ia64/ptrace.h index 9471cdc3f..1414316ef 100644 --- a/include/asm-ia64/ptrace.h +++ b/include/asm-ia64/ptrace.h @@ -54,9 +54,10 @@ * This is because ar.ec is saved as part of ar.pfs. */ -#include #include + +#ifdef __KERNEL__ #ifndef ASM_OFFSETS_C #include #endif @@ -80,10 +81,9 @@ #define KERNEL_STACK_SIZE IA64_STK_OFFSET -#ifndef __ASSEMBLY__ +#endif /* __KERNEL__ */ -#include -#include +#ifndef __ASSEMBLY__ /* * This struct defines the way the registers are saved on system @@ -230,6 +230,9 @@ struct switch_stack { #ifdef __KERNEL__ +#include +#include + #define __ARCH_SYS_PTRACE 1 /* diff --git a/include/asm-ia64/rwsem.h b/include/asm-ia64/rwsem.h index 1327c91ea..2d1640cc2 100644 --- a/include/asm-ia64/rwsem.h +++ b/include/asm-ia64/rwsem.h @@ -33,9 +33,6 @@ struct rw_semaphore { signed long count; spinlock_t wait_lock; struct list_head wait_list; -#if RWSEM_DEBUG - int debug; -#endif }; #define RWSEM_UNLOCKED_VALUE __IA64_UL_CONST(0x0000000000000000) @@ -45,19 +42,9 @@ struct rw_semaphore { #define RWSEM_ACTIVE_READ_BIAS RWSEM_ACTIVE_BIAS #define RWSEM_ACTIVE_WRITE_BIAS (RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS) -/* - * initialization - */ -#if RWSEM_DEBUG -#define __RWSEM_DEBUG_INIT , 0 -#else -#define __RWSEM_DEBUG_INIT /* */ -#endif - #define __RWSEM_INITIALIZER(name) \ { RWSEM_UNLOCKED_VALUE, SPIN_LOCK_UNLOCKED, \ - LIST_HEAD_INIT((name).wait_list) \ - __RWSEM_DEBUG_INIT } + LIST_HEAD_INIT((name).wait_list) } #define DECLARE_RWSEM(name) \ struct rw_semaphore name = __RWSEM_INITIALIZER(name) @@ -73,9 +60,6 @@ init_rwsem (struct rw_semaphore *sem) sem->count = RWSEM_UNLOCKED_VALUE; spin_lock_init(&sem->wait_lock); INIT_LIST_HEAD(&sem->wait_list); -#if RWSEM_DEBUG - sem->debug = 0; -#endif } /* diff --git a/include/asm-ia64/signal.h b/include/asm-ia64/signal.h index 5e328ed5d..4f5ca5643 100644 --- a/include/asm-ia64/signal.h +++ b/include/asm-ia64/signal.h @@ -56,7 +56,6 @@ * SA_FLAGS values: * * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_INTERRUPT is a no-op, but left due to historical reasons. * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. * SA_RESETHAND clears the handler when the signal is delivered. @@ -76,7 +75,6 @@ #define SA_NOMASK SA_NODEFER #define SA_ONESHOT SA_RESETHAND -#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ #define SA_RESTORER 0x04000000 @@ -114,8 +112,6 @@ #define _NSIG_BPW 64 #define _NSIG_WORDS (_NSIG / _NSIG_BPW) -#define SA_PERCPU_IRQ 0x02000000 - #endif /* __KERNEL__ */ #include diff --git a/include/asm-ia64/smp.h b/include/asm-ia64/smp.h index a3914352c..719ff309c 100644 --- a/include/asm-ia64/smp.h +++ b/include/asm-ia64/smp.h @@ -10,7 +10,6 @@ #ifndef _ASM_IA64_SMP_H #define _ASM_IA64_SMP_H -#include #include #include #include diff --git a/include/asm-ia64/sn/intr.h b/include/asm-ia64/sn/intr.h index 60a51a406..12b54ddb0 100644 --- a/include/asm-ia64/sn/intr.h +++ b/include/asm-ia64/sn/intr.h @@ -10,6 +10,7 @@ #define _ASM_IA64_SN_INTR_H #include +#include #define SGI_UART_VECTOR 0xe9 @@ -40,6 +41,7 @@ struct sn_irq_info { int irq_cpuid; /* kernel logical cpuid */ int irq_irq; /* the IRQ number */ int irq_int_bit; /* Bridge interrupt pin */ + /* <0 means MSI */ u64 irq_xtalkaddr; /* xtalkaddr IRQ is sent to */ int irq_bridge_type;/* pciio asic type (pciio.h) */ void *irq_bridge; /* bridge generating irq */ @@ -53,6 +55,12 @@ struct sn_irq_info { }; extern void sn_send_IPI_phys(int, long, int, int); +extern u64 sn_intr_alloc(nasid_t, int, + struct sn_irq_info *, + int, nasid_t, int); +extern void sn_intr_free(nasid_t, int, struct sn_irq_info *); +extern struct sn_irq_info *sn_retarget_vector(struct sn_irq_info *, nasid_t, int); +extern struct list_head **sn_irq_lh; #define CPU_VECTOR_TO_IRQ(cpuid,vector) (vector) diff --git a/include/asm-ia64/sn/pcibr_provider.h b/include/asm-ia64/sn/pcibr_provider.h index 51260ab70..e3b0c3fe5 100644 --- a/include/asm-ia64/sn/pcibr_provider.h +++ b/include/asm-ia64/sn/pcibr_provider.h @@ -55,6 +55,7 @@ #define PCI32_ATE_V (0x1 << 0) #define PCI32_ATE_CO (0x1 << 1) #define PCI32_ATE_PREC (0x1 << 2) +#define PCI32_ATE_MSI (0x1 << 2) #define PCI32_ATE_PREF (0x1 << 3) #define PCI32_ATE_BAR (0x1 << 4) #define PCI32_ATE_ADDR_SHFT 12 @@ -117,8 +118,8 @@ struct pcibus_info { extern int pcibr_init_provider(void); extern void *pcibr_bus_fixup(struct pcibus_bussoft *, struct pci_controller *); -extern dma_addr_t pcibr_dma_map(struct pci_dev *, unsigned long, size_t); -extern dma_addr_t pcibr_dma_map_consistent(struct pci_dev *, unsigned long, size_t); +extern dma_addr_t pcibr_dma_map(struct pci_dev *, unsigned long, size_t, int type); +extern dma_addr_t pcibr_dma_map_consistent(struct pci_dev *, unsigned long, size_t, int type); extern void pcibr_dma_unmap(struct pci_dev *, dma_addr_t, int); /* diff --git a/include/asm-ia64/sn/pcibus_provider_defs.h b/include/asm-ia64/sn/pcibus_provider_defs.h index 04e27d5b3..8f7c83d0f 100644 --- a/include/asm-ia64/sn/pcibus_provider_defs.h +++ b/include/asm-ia64/sn/pcibus_provider_defs.h @@ -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. */ #ifndef _ASM_IA64_SN_PCI_PCIBUS_PROVIDER_H #define _ASM_IA64_SN_PCI_PCIBUS_PROVIDER_H @@ -18,8 +18,9 @@ #define PCIIO_ASIC_TYPE_PIC 2 #define PCIIO_ASIC_TYPE_TIOCP 3 #define PCIIO_ASIC_TYPE_TIOCA 4 +#define PCIIO_ASIC_TYPE_TIOCE 5 -#define PCIIO_ASIC_MAX_TYPES 5 +#define PCIIO_ASIC_MAX_TYPES 6 /* * Common pciio bus provider data. There should be one of these as the @@ -28,25 +29,40 @@ */ struct pcibus_bussoft { - uint32_t bs_asic_type; /* chipset type */ - uint32_t bs_xid; /* xwidget id */ - uint64_t bs_persist_busnum; /* Persistent Bus Number */ - uint64_t bs_legacy_io; /* legacy io pio addr */ - uint64_t bs_legacy_mem; /* legacy mem pio addr */ - uint64_t bs_base; /* widget base */ + u32 bs_asic_type; /* chipset type */ + u32 bs_xid; /* xwidget id */ + u32 bs_persist_busnum; /* Persistent Bus Number */ + u32 bs_persist_segment; /* Segment Number */ + u64 bs_legacy_io; /* legacy io pio addr */ + u64 bs_legacy_mem; /* legacy mem pio addr */ + u64 bs_base; /* widget base */ struct xwidget_info *bs_xwidget_info; }; +struct pci_controller; /* * SN pci bus indirection */ struct sn_pcibus_provider { - dma_addr_t (*dma_map)(struct pci_dev *, unsigned long, size_t); - dma_addr_t (*dma_map_consistent)(struct pci_dev *, unsigned long, size_t); + dma_addr_t (*dma_map)(struct pci_dev *, unsigned long, size_t, int flags); + dma_addr_t (*dma_map_consistent)(struct pci_dev *, unsigned long, size_t, int flags); void (*dma_unmap)(struct pci_dev *, dma_addr_t, int); - void * (*bus_fixup)(struct pcibus_bussoft *); + void * (*bus_fixup)(struct pcibus_bussoft *, struct pci_controller *); + void (*force_interrupt)(struct sn_irq_info *); + void (*target_interrupt)(struct sn_irq_info *); }; +/* + * Flags used by the map interfaces + * bits 3:0 specifies format of passed in address + * bit 4 specifies that address is to be used for MSI + */ + +#define SN_DMA_ADDRTYPE(x) ((x) & 0xf) +#define SN_DMA_ADDR_PHYS 1 /* address is an xio address. */ +#define SN_DMA_ADDR_XIO 2 /* address is phys memory */ +#define SN_DMA_MSI 0x10 /* Bus address is to be used for MSI */ + extern struct sn_pcibus_provider *sn_pci_provider[]; #endif /* _ASM_IA64_SN_PCI_PCIBUS_PROVIDER_H */ diff --git a/include/asm-ia64/sn/simulator.h b/include/asm-ia64/sn/simulator.h index 16a48b5a0..c3fd3eb25 100644 --- a/include/asm-ia64/sn/simulator.h +++ b/include/asm-ia64/sn/simulator.h @@ -8,7 +8,6 @@ #ifndef _ASM_IA64_SN_SIMULATOR_H #define _ASM_IA64_SN_SIMULATOR_H -#include #define SNMAGIC 0xaeeeeeee8badbeefL #define IS_MEDUSA() ({long sn; asm("mov %0=cpuid[%1]" : "=r"(sn) : "r"(2)); sn == SNMAGIC;}) diff --git a/include/asm-ia64/sn/sn_cpuid.h b/include/asm-ia64/sn/sn_cpuid.h index 749deb2ca..a676dd9ac 100644 --- a/include/asm-ia64/sn/sn_cpuid.h +++ b/include/asm-ia64/sn/sn_cpuid.h @@ -11,7 +11,6 @@ #ifndef _ASM_IA64_SN_SN_CPUID_H #define _ASM_IA64_SN_SN_CPUID_H -#include #include #include #include diff --git a/include/asm-ia64/sn/sn_sal.h b/include/asm-ia64/sn/sn_sal.h index 51aca022c..ba826b3f7 100644 --- a/include/asm-ia64/sn/sn_sal.h +++ b/include/asm-ia64/sn/sn_sal.h @@ -12,7 +12,6 @@ */ -#include #include #include #include @@ -86,6 +85,7 @@ #define SN_SAL_GET_PROM_FEATURE_SET 0x02000065 #define SN_SAL_SET_OS_FEATURE_SET 0x02000066 #define SN_SAL_INJECT_ERROR 0x02000067 +#define SN_SAL_SET_CPU_NUMBER 0x02000068 /* * Service-specific constants @@ -346,7 +346,7 @@ ia64_sn_plat_set_error_handling_features(void) ret_stuff.v1 = 0; ret_stuff.v2 = 0; SAL_CALL_REENTRANT(ret_stuff, SN_SAL_SET_ERROR_HANDLING_FEATURES, - (SAL_ERR_FEAT_MCA_SLV_TO_OS_INIT_SLV | SAL_ERR_FEAT_LOG_SBES), + SAL_ERR_FEAT_LOG_SBES, 0, 0, 0, 0, 0, 0); return ret_stuff.status; @@ -706,12 +706,9 @@ static inline int sn_change_memprotect(u64 paddr, u64 len, u64 perms, u64 *nasid_array) { struct ia64_sal_retval ret_stuff; - unsigned long irq_flags; - local_irq_save(irq_flags); ia64_sal_oemcall_nolock(&ret_stuff, SN_SAL_MEMPROTECT, paddr, len, (u64)nasid_array, perms, 0, 0, 0); - local_irq_restore(irq_flags); return ret_stuff.status; } #define SN_MEMPROT_ACCESS_CLASS_0 0x14a080 @@ -1143,12 +1140,18 @@ static inline int sn_inject_error(u64 paddr, u64 *data, u64 *ecc) { struct ia64_sal_retval ret_stuff; - unsigned long irq_flags; - local_irq_save(irq_flags); ia64_sal_oemcall_nolock(&ret_stuff, SN_SAL_INJECT_ERROR, paddr, (u64)data, (u64)ecc, 0, 0, 0, 0); - local_irq_restore(irq_flags); return ret_stuff.status; } + +static inline int +ia64_sn_set_cpu_number(int cpu) +{ + struct ia64_sal_retval rv; + + SAL_CALL_NOLOCK(rv, SN_SAL_SET_CPU_NUMBER, cpu, 0, 0, 0, 0, 0, 0); + return rv.status; +} #endif /* _ASM_IA64_SN_SN_SAL_H */ diff --git a/include/asm-ia64/sn/tioca_provider.h b/include/asm-ia64/sn/tioca_provider.h index b6acc22ab..65cdd73c2 100644 --- a/include/asm-ia64/sn/tioca_provider.h +++ b/include/asm-ia64/sn/tioca_provider.h @@ -27,7 +27,7 @@ #define PV908234 (1 << 1) /* CA:AGPDMA write request data mismatch with ABC1CL merge */ #define PV895469 (1 << 1) - /* TIO:CA TLB invalidate of written GART entries possibly not occuring in CA*/ + /* TIO:CA TLB invalidate of written GART entries possibly not occurring in CA*/ #define PV910244 (1 << 1) struct tioca_dmamap{ @@ -56,31 +56,31 @@ struct tioca_kernel { /* * General GART stuff */ - uint64_t ca_ap_size; /* size of aperature in bytes */ - uint32_t ca_gart_entries; /* # uint64_t entries in gart */ - uint32_t ca_ap_pagesize; /* aperature page size in bytes */ - uint64_t ca_ap_bus_base; /* bus address of CA aperature */ - uint64_t ca_gart_size; /* gart size in bytes */ - uint64_t *ca_gart; /* gart table vaddr */ - uint64_t ca_gart_coretalk_addr; /* gart coretalk addr */ - uint8_t ca_gart_iscoherent; /* used in tioca_tlbflush */ + u64 ca_ap_size; /* size of aperature in bytes */ + u32 ca_gart_entries; /* # u64 entries in gart */ + u32 ca_ap_pagesize; /* aperature page size in bytes */ + u64 ca_ap_bus_base; /* bus address of CA aperature */ + u64 ca_gart_size; /* gart size in bytes */ + u64 *ca_gart; /* gart table vaddr */ + u64 ca_gart_coretalk_addr; /* gart coretalk addr */ + u8 ca_gart_iscoherent; /* used in tioca_tlbflush */ /* PCI GART convenience values */ - uint64_t ca_pciap_base; /* pci aperature bus base address */ - uint64_t ca_pciap_size; /* pci aperature size (bytes) */ - uint64_t ca_pcigart_base; /* gfx GART bus base address */ - uint64_t *ca_pcigart; /* gfx GART vm address */ - uint32_t ca_pcigart_entries; - uint32_t ca_pcigart_start; /* PCI start index in ca_gart */ + u64 ca_pciap_base; /* pci aperature bus base address */ + u64 ca_pciap_size; /* pci aperature size (bytes) */ + u64 ca_pcigart_base; /* gfx GART bus base address */ + u64 *ca_pcigart; /* gfx GART vm address */ + u32 ca_pcigart_entries; + u32 ca_pcigart_start; /* PCI start index in ca_gart */ void *ca_pcigart_pagemap; /* AGP GART convenience values */ - uint64_t ca_gfxap_base; /* gfx aperature bus base address */ - uint64_t ca_gfxap_size; /* gfx aperature size (bytes) */ - uint64_t ca_gfxgart_base; /* gfx GART bus base address */ - uint64_t *ca_gfxgart; /* gfx GART vm address */ - uint32_t ca_gfxgart_entries; - uint32_t ca_gfxgart_start; /* agpgart start index in ca_gart */ + u64 ca_gfxap_base; /* gfx aperature bus base address */ + u64 ca_gfxap_size; /* gfx aperature size (bytes) */ + u64 ca_gfxgart_base; /* gfx GART bus base address */ + u64 *ca_gfxgart; /* gfx GART vm address */ + u32 ca_gfxgart_entries; + u32 ca_gfxgart_start; /* agpgart start index in ca_gart */ }; /* @@ -93,11 +93,11 @@ struct tioca_kernel { struct tioca_common { struct pcibus_bussoft ca_common; /* common pciio header */ - uint32_t ca_rev; - uint32_t ca_closest_nasid; + u32 ca_rev; + u32 ca_closest_nasid; - uint64_t ca_prom_private; - uint64_t ca_kernel_private; + u64 ca_prom_private; + u64 ca_kernel_private; }; /** @@ -139,9 +139,9 @@ tioca_paddr_to_gart(unsigned long paddr) */ static inline unsigned long -tioca_physpage_to_gart(uint64_t page_addr) +tioca_physpage_to_gart(u64 page_addr) { - uint64_t coretalk_addr; + u64 coretalk_addr; coretalk_addr = PHYS_TO_TIODMA(page_addr); if (!coretalk_addr) { @@ -161,7 +161,7 @@ tioca_physpage_to_gart(uint64_t page_addr) static inline void tioca_tlbflush(struct tioca_kernel *tioca_kernel) { - volatile uint64_t tmp; + volatile u64 tmp; volatile struct tioca *ca_base; struct tioca_common *tioca_common; @@ -182,11 +182,11 @@ tioca_tlbflush(struct tioca_kernel *tioca_kernel) * touch every CL aligned GART entry. */ - ca_base->ca_control2 &= ~(CA_GART_MEM_PARAM); - ca_base->ca_control2 |= CA_GART_FLUSH_TLB; - ca_base->ca_control2 |= - (0x2ull << CA_GART_MEM_PARAM_SHFT); - tmp = ca_base->ca_control2; + __sn_clrq_relaxed(&ca_base->ca_control2, CA_GART_MEM_PARAM); + __sn_setq_relaxed(&ca_base->ca_control2, CA_GART_FLUSH_TLB); + __sn_setq_relaxed(&ca_base->ca_control2, + (0x2ull << CA_GART_MEM_PARAM_SHFT)); + tmp = __sn_readq_relaxed(&ca_base->ca_control2); } return; @@ -196,11 +196,12 @@ tioca_tlbflush(struct tioca_kernel *tioca_kernel) * Gart in uncached mode ... need an explicit flush. */ - ca_base->ca_control2 |= CA_GART_FLUSH_TLB; - tmp = ca_base->ca_control2; + __sn_setq_relaxed(&ca_base->ca_control2, CA_GART_FLUSH_TLB); + tmp = __sn_readq_relaxed(&ca_base->ca_control2); } -extern uint32_t tioca_gart_found; +extern u32 tioca_gart_found; +extern struct list_head tioca_list; extern int tioca_init_provider(void); extern void tioca_fastwrite_enable(struct tioca_kernel *tioca_kern); #endif /* _ASM_IA64_SN_TIO_CA_AGP_PROVIDER_H */ diff --git a/include/asm-ia64/sn/tiocp.h b/include/asm-ia64/sn/tiocp.h index f47c08ab4..e8ad0bb5b 100644 --- a/include/asm-ia64/sn/tiocp.h +++ b/include/asm-ia64/sn/tiocp.h @@ -3,13 +3,14 @@ * License. See the file "COPYING" in the main directory of this archive * for more details. * - * Copyright (C) 2003-2004 Silicon Graphics, Inc. All rights reserved. + * Copyright (C) 2003-2005 Silicon Graphics, Inc. All rights reserved. */ #ifndef _ASM_IA64_SN_PCI_TIOCP_H #define _ASM_IA64_SN_PCI_TIOCP_H #define TIOCP_HOST_INTR_ADDR 0x003FFFFFFFFFFFFFUL #define TIOCP_PCI64_CMDTYPE_MEM (0x1ull << 60) +#define TIOCP_PCI64_CMDTYPE_MSI (0x3ull << 60) /***************************************************************************** diff --git a/include/asm-ia64/sn/xpc.h b/include/asm-ia64/sn/xpc.h index b454ad4e2..35e1386f3 100644 --- a/include/asm-ia64/sn/xpc.h +++ b/include/asm-ia64/sn/xpc.h @@ -15,7 +15,6 @@ #define _ASM_IA64_SN_XPC_H -#include #include #include #include @@ -1127,8 +1126,8 @@ xpc_notify_IRQ_send_local(struct xpc_channel *ch, u8 ipi_flag, #define XPC_GET_IPI_FLAGS(_amo, _c) ((u8) (((_amo) >> ((_c) * 8)) & 0xff)) #define XPC_SET_IPI_FLAGS(_amo, _c, _f) (_amo) |= ((u64) (_f) << ((_c) * 8)) -#define XPC_ANY_OPENCLOSE_IPI_FLAGS_SET(_amo) ((_amo) & 0x0f0f0f0f0f0f0f0f) -#define XPC_ANY_MSG_IPI_FLAGS_SET(_amo) ((_amo) & 0x1010101010101010) +#define XPC_ANY_OPENCLOSE_IPI_FLAGS_SET(_amo) ((_amo) & __IA64_UL_CONST(0x0f0f0f0f0f0f0f0f)) +#define XPC_ANY_MSG_IPI_FLAGS_SET(_amo) ((_amo) & __IA64_UL_CONST(0x1010101010101010)) static inline void diff --git a/include/asm-ia64/socket.h b/include/asm-ia64/socket.h index a255006fb..d638ef3d5 100644 --- a/include/asm-ia64/socket.h +++ b/include/asm-ia64/socket.h @@ -57,5 +57,6 @@ #define SO_ACCEPTCONN 30 #define SO_PEERSEC 31 +#define SO_PASSSEC 34 #endif /* _ASM_IA64_SOCKET_H */ diff --git a/include/asm-ia64/string.h b/include/asm-ia64/string.h index 43502d3b5..85fd65c52 100644 --- a/include/asm-ia64/string.h +++ b/include/asm-ia64/string.h @@ -9,7 +9,6 @@ * David Mosberger-Tang */ -#include /* remove this once we remove the A-step workaround... */ #define __HAVE_ARCH_STRLEN 1 /* see arch/ia64/lib/strlen.S */ #define __HAVE_ARCH_MEMSET 1 /* see arch/ia64/lib/memset.S */ diff --git a/include/asm-ia64/system.h b/include/asm-ia64/system.h index 2f3620593..8d948286f 100644 --- a/include/asm-ia64/system.h +++ b/include/asm-ia64/system.h @@ -12,7 +12,6 @@ * Copyright (C) 1999 Asit Mallick * Copyright (C) 1999 Don Dugger */ -#include #include #include @@ -25,7 +24,7 @@ * 0xa000000000000000+2*PERCPU_PAGE_SIZE * - 0xa000000000000000+3*PERCPU_PAGE_SIZE remain unmapped (guard page) */ -#define KERNEL_START (GATE_ADDR+0x100000000) +#define KERNEL_START (GATE_ADDR+__IA64_UL_CONST(0x100000000)) #define PERCPU_ADDR (-PERCPU_PAGE_SIZE) #ifndef __ASSEMBLY__ @@ -99,12 +98,11 @@ extern struct ia64_boot_param { #endif /* - * XXX check on these---I suspect what Linus really wants here is + * XXX check on this ---I suspect what Linus really wants here is * acquire vs release semantics but we can't discuss this stuff with * Linus just yet. Grrr... */ #define set_mb(var, value) do { (var) = (value); mb(); } while (0) -#define set_wmb(var, value) do { (var) = (value); mb(); } while (0) #define safe_halt() ia64_pal_halt_light() /* PAL_HALT_LIGHT */ @@ -125,7 +123,7 @@ extern struct ia64_boot_param { #define __local_irq_save(x) \ do { \ ia64_stop(); \ - (x) = ia64_getreg(_IA64_REG_PSR); \ + (x) = ia64_get_psr_i(); \ ia64_stop(); \ ia64_rsm(IA64_PSR_I); \ } while (0) @@ -173,7 +171,7 @@ do { \ #endif /* !CONFIG_IA64_DEBUG_IRQ */ #define local_irq_enable() ({ ia64_stop(); ia64_ssm(IA64_PSR_I); ia64_srlz_d(); }) -#define local_save_flags(flags) ({ ia64_stop(); (flags) = ia64_getreg(_IA64_REG_PSR); }) +#define local_save_flags(flags) ({ ia64_stop(); (flags) = ia64_get_psr_i(); }) #define irqs_disabled() \ ({ \ diff --git a/include/asm-ia64/thread_info.h b/include/asm-ia64/thread_info.h index e5392c4d3..8adcde093 100644 --- a/include/asm-ia64/thread_info.h +++ b/include/asm-ia64/thread_info.h @@ -27,6 +27,7 @@ struct thread_info { __u32 flags; /* thread_info flags (see TIF_*) */ __u32 cpu; /* current CPU */ __u32 last_cpu; /* Last CPU thread ran on */ + __u32 status; /* Thread synchronous flags */ mm_segment_t addr_limit; /* user-level address space limit */ int preempt_count; /* 0=premptable, <0=BUG; will also serve as bh-counter */ struct restart_block restart_block; @@ -67,7 +68,7 @@ struct thread_info { #define end_of_stack(p) (unsigned long *)((void *)(p) + IA64_RBS_OFFSET) #define __HAVE_ARCH_TASK_STRUCT_ALLOCATOR -#define alloc_task_struct() ((task_t *)__get_free_pages(GFP_KERNEL | __GFP_COMP, KERNEL_STACK_SIZE_ORDER)) +#define alloc_task_struct() ((struct task_struct *)__get_free_pages(GFP_KERNEL | __GFP_COMP, KERNEL_STACK_SIZE_ORDER)) #define free_task_struct(tsk) free_pages((unsigned long) (tsk), KERNEL_STACK_SIZE_ORDER) #endif /* !__ASSEMBLY */ @@ -103,4 +104,8 @@ struct thread_info { /* like TIF_ALLWORK_BITS but sans TIF_SYSCALL_TRACE or TIF_SYSCALL_AUDIT */ #define TIF_WORK_MASK (TIF_ALLWORK_MASK&~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT)) +#define TS_POLLING 1 /* true if in idle loop and not sleeping */ + +#define tsk_is_polling(t) ((t)->thread_info->status & TS_POLLING) + #endif /* _ASM_IA64_THREAD_INFO_H */ diff --git a/include/asm-ia64/tlb.h b/include/asm-ia64/tlb.h index e2c6e18ad..a544ab823 100644 --- a/include/asm-ia64/tlb.h +++ b/include/asm-ia64/tlb.h @@ -37,7 +37,6 @@ * } * tlb_finish_mmu(tlb, start, end); // finish unmap for address space MM */ -#include #include #include #include diff --git a/include/asm-ia64/tlbflush.h b/include/asm-ia64/tlbflush.h index a35b323ba..cf9acb9bb 100644 --- a/include/asm-ia64/tlbflush.h +++ b/include/asm-ia64/tlbflush.h @@ -6,7 +6,6 @@ * David Mosberger-Tang */ -#include #include diff --git a/include/asm-ia64/topology.h b/include/asm-ia64/topology.h index 616b5ed2a..937c21257 100644 --- a/include/asm-ia64/topology.h +++ b/include/asm-ia64/topology.h @@ -112,6 +112,7 @@ void build_cpu_to_node_map(void); #define topology_core_id(cpu) (cpu_data(cpu)->core_id) #define topology_core_siblings(cpu) (cpu_core_map[cpu]) #define topology_thread_siblings(cpu) (cpu_sibling_map[cpu]) +#define smt_capable() (smp_num_siblings > 1) #endif #include diff --git a/include/asm-ia64/unistd.h b/include/asm-ia64/unistd.h index 93dbb82de..11762ce64 100644 --- a/include/asm-ia64/unistd.h +++ b/include/asm-ia64/unistd.h @@ -265,7 +265,7 @@ #define __NR_keyctl 1273 #define __NR_ioprio_set 1274 #define __NR_ioprio_get 1275 -/* 1276 is available for reuse (was briefly sys_set_zone_reclaim) */ +#define __NR_move_pages 1276 #define __NR_inotify_init 1277 #define __NR_inotify_add_watch 1278 #define __NR_inotify_rm_watch 1279 @@ -286,15 +286,13 @@ /* 1294, 1295 reserved for pselect/ppoll */ #define __NR_unshare 1296 #define __NR_splice 1297 -#define __NR_set_robust_list 1298 -#define __NR_get_robust_list 1299 +/* 1298, 1299 reserved for set_robust_list/get_robust_list */ #define __NR_sync_file_range 1300 #define __NR_tee 1301 #define __NR_vmsplice 1302 #ifdef __KERNEL__ -#include #define NR_syscalls 279 /* length of syscall table */ diff --git a/include/asm-ia64/ustack.h b/include/asm-ia64/ustack.h index da55c9124..a34946791 100644 --- a/include/asm-ia64/ustack.h +++ b/include/asm-ia64/ustack.h @@ -5,12 +5,15 @@ * Constants for the user stack size */ +#ifdef __KERNEL__ #include /* The absolute hard limit for stack size is 1/2 of the mappable space in the region */ #define MAX_USER_STACK_SIZE (RGN_MAP_LIMIT/2) -/* Make a default stack size of 2GB */ -#define DEFAULT_USER_STACK_SIZE (1UL << 31) #define STACK_TOP (0x6000000000000000UL + RGN_MAP_LIMIT) +#endif + +/* Make a default stack size of 2GiB */ +#define DEFAULT_USER_STACK_SIZE (1UL << 31) #endif /* _ASM_IA64_USTACK_H */ diff --git a/include/asm-ia64/vga.h b/include/asm-ia64/vga.h index 091177cda..02184ecd8 100644 --- a/include/asm-ia64/vga.h +++ b/include/asm-ia64/vga.h @@ -17,7 +17,7 @@ extern unsigned long vga_console_iobase; extern unsigned long vga_console_membase; -#define VGA_MAP_MEM(x) ((unsigned long) ioremap_nocache(vga_console_membase + (x), 0)) +#define VGA_MAP_MEM(x,s) ((unsigned long) ioremap_nocache(vga_console_membase + (x), s)) #define vga_readb(x) (*(x)) #define vga_writeb(x,y) (*(y) = (x)) diff --git a/include/asm-m32r/assembler.h b/include/asm-m32r/assembler.h index 1a1aa17ed..47041d19d 100644 --- a/include/asm-m32r/assembler.h +++ b/include/asm-m32r/assembler.h @@ -9,7 +9,6 @@ * This file contains M32R architecture specific macro definitions. */ -#include #ifndef __STR #ifdef __ASSEMBLY__ diff --git a/include/asm-m32r/atomic.h b/include/asm-m32r/atomic.h index 3122fe106..f5a7d7301 100644 --- a/include/asm-m32r/atomic.h +++ b/include/asm-m32r/atomic.h @@ -9,7 +9,6 @@ * Copyright (C) 2004 Hirokazu Takata */ -#include #include #include diff --git a/include/asm-m32r/bitops.h b/include/asm-m32r/bitops.h index 902a36610..66ab67216 100644 --- a/include/asm-m32r/bitops.h +++ b/include/asm-m32r/bitops.h @@ -11,7 +11,6 @@ * Copyright (C) 2004 Hirokazu Takata */ -#include #include #include #include diff --git a/include/asm-m32r/cacheflush.h b/include/asm-m32r/cacheflush.h index e57427b6e..8b261b491 100644 --- a/include/asm-m32r/cacheflush.h +++ b/include/asm-m32r/cacheflush.h @@ -1,7 +1,6 @@ #ifndef _ASM_M32R_CACHEFLUSH_H #define _ASM_M32R_CACHEFLUSH_H -#include #include extern void _flush_cache_all(void); diff --git a/include/asm-m32r/hardirq.h b/include/asm-m32r/hardirq.h index 5da830ec1..cb8aa762f 100644 --- a/include/asm-m32r/hardirq.h +++ b/include/asm-m32r/hardirq.h @@ -2,7 +2,6 @@ #ifndef __ASM_HARDIRQ_H #define __ASM_HARDIRQ_H -#include #include #include diff --git a/include/asm-m32r/hw_irq.h b/include/asm-m32r/hw_irq.h index 8d7e9d0e0..7138537cd 100644 --- a/include/asm-m32r/hw_irq.h +++ b/include/asm-m32r/hw_irq.h @@ -1,9 +1,4 @@ #ifndef _ASM_M32R_HW_IRQ_H #define _ASM_M32R_HW_IRQ_H -static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) -{ - /* Nothing to do */ -} - #endif /* _ASM_M32R_HW_IRQ_H */ diff --git a/include/asm-m32r/ide.h b/include/asm-m32r/ide.h index f7aa96970..219a0f74e 100644 --- a/include/asm-m32r/ide.h +++ b/include/asm-m32r/ide.h @@ -15,7 +15,6 @@ #ifdef __KERNEL__ -#include #ifndef MAX_HWIFS # ifdef CONFIG_BLK_DEV_IDEPCI diff --git a/include/asm-m32r/irq.h b/include/asm-m32r/irq.h index ca9439545..2f93f4743 100644 --- a/include/asm-m32r/irq.h +++ b/include/asm-m32r/irq.h @@ -2,7 +2,6 @@ #ifndef _ASM_M32R_IRQ_H #define _ASM_M32R_IRQ_H -#include #if defined(CONFIG_PLAT_M32700UT_Alpha) || defined(CONFIG_PLAT_USRV) /* diff --git a/include/asm-m32r/kmap_types.h b/include/asm-m32r/kmap_types.h index 742959101..0524d89ed 100644 --- a/include/asm-m32r/kmap_types.h +++ b/include/asm-m32r/kmap_types.h @@ -3,7 +3,6 @@ /* Dummy header just to define km_type. */ -#include #ifdef CONFIG_DEBUG_HIGHMEM # define D(n) __KM_FENCE_##n , diff --git a/include/asm-m32r/m32104ut/m32104ut_pld.h b/include/asm-m32r/m32104ut/m32104ut_pld.h index a4eac2055..6ba4ddf7d 100644 --- a/include/asm-m32r/m32104ut/m32104ut_pld.h +++ b/include/asm-m32r/m32104ut/m32104ut_pld.h @@ -15,7 +15,6 @@ #ifndef _M32104UT_M32104UT_PLD_H #define _M32104UT_M32104UT_PLD_H -#include #if defined(CONFIG_PLAT_M32104UT) #define PLD_PLAT_BASE 0x02c00000 diff --git a/include/asm-m32r/m32700ut/m32700ut_lan.h b/include/asm-m32r/m32700ut/m32700ut_lan.h index 50545ec9c..c050b19e8 100644 --- a/include/asm-m32r/m32700ut/m32700ut_lan.h +++ b/include/asm-m32r/m32700ut/m32700ut_lan.h @@ -15,7 +15,6 @@ #ifndef _M32700UT_M32700UT_LAN_H #define _M32700UT_M32700UT_LAN_H -#include #ifndef __ASSEMBLY__ /* diff --git a/include/asm-m32r/m32700ut/m32700ut_lcd.h b/include/asm-m32r/m32700ut/m32700ut_lcd.h index ede6c77bd..4da4e822e 100644 --- a/include/asm-m32r/m32700ut/m32700ut_lcd.h +++ b/include/asm-m32r/m32700ut/m32700ut_lcd.h @@ -15,7 +15,6 @@ #ifndef _M32700UT_M32700UT_LCD_H #define _M32700UT_M32700UT_LCD_H -#include #ifndef __ASSEMBLY__ /* diff --git a/include/asm-m32r/m32700ut/m32700ut_pld.h b/include/asm-m32r/m32700ut/m32700ut_pld.h index f5e479486..f35f9159a 100644 --- a/include/asm-m32r/m32700ut/m32700ut_pld.h +++ b/include/asm-m32r/m32700ut/m32700ut_pld.h @@ -15,7 +15,6 @@ #ifndef _M32700UT_M32700UT_PLD_H #define _M32700UT_M32700UT_PLD_H -#include #if defined(CONFIG_PLAT_M32700UT_Alpha) #define PLD_PLAT_BASE 0x08c00000 diff --git a/include/asm-m32r/m32r.h b/include/asm-m32r/m32r.h index b133ca61a..decfc5990 100644 --- a/include/asm-m32r/m32r.h +++ b/include/asm-m32r/m32r.h @@ -7,7 +7,6 @@ * Copyright (C) 2003, 2004 Renesas Technology Corp. */ -#include /* Chip type */ #if defined(CONFIG_CHIP_XNUX_MP) || defined(CONFIG_CHIP_XNUX2_MP) diff --git a/include/asm-m32r/mmu.h b/include/asm-m32r/mmu.h index 9c00eb78e..cf3f6d78a 100644 --- a/include/asm-m32r/mmu.h +++ b/include/asm-m32r/mmu.h @@ -1,7 +1,6 @@ #ifndef _ASM_M32R_MMU_H #define _ASM_M32R_MMU_H -#include #if !defined(CONFIG_MMU) typedef struct { diff --git a/include/asm-m32r/mmu_context.h b/include/asm-m32r/mmu_context.h index 3634c5361..542302eb6 100644 --- a/include/asm-m32r/mmu_context.h +++ b/include/asm-m32r/mmu_context.h @@ -3,7 +3,6 @@ #ifdef __KERNEL__ -#include #include @@ -15,7 +14,6 @@ #ifndef __ASSEMBLY__ -#include #include #include #include diff --git a/include/asm-m32r/opsput/opsput_lan.h b/include/asm-m32r/opsput/opsput_lan.h index 7a2a839ee..61948296f 100644 --- a/include/asm-m32r/opsput/opsput_lan.h +++ b/include/asm-m32r/opsput/opsput_lan.h @@ -15,7 +15,6 @@ #ifndef _OPSPUT_OPSPUT_LAN_H #define _OPSPUT_OPSPUT_LAN_H -#include #ifndef __ASSEMBLY__ /* diff --git a/include/asm-m32r/opsput/opsput_lcd.h b/include/asm-m32r/opsput/opsput_lcd.h index 3a883e3d7..44cfd7fe2 100644 --- a/include/asm-m32r/opsput/opsput_lcd.h +++ b/include/asm-m32r/opsput/opsput_lcd.h @@ -15,7 +15,6 @@ #ifndef _OPSPUT_OPSPUT_LCD_H #define _OPSPUT_OPSPUT_LCD_H -#include #ifndef __ASSEMBLY__ /* diff --git a/include/asm-m32r/opsput/opsput_pld.h b/include/asm-m32r/opsput/opsput_pld.h index 2018e6925..46296fe1e 100644 --- a/include/asm-m32r/opsput/opsput_pld.h +++ b/include/asm-m32r/opsput/opsput_pld.h @@ -15,7 +15,6 @@ #ifndef _OPSPUT_OPSPUT_PLD_H #define _OPSPUT_OPSPUT_PLD_H -#include #define PLD_PLAT_BASE 0x1cc00000 diff --git a/include/asm-m32r/page.h b/include/asm-m32r/page.h index 9ddbc087d..404a4c240 100644 --- a/include/asm-m32r/page.h +++ b/include/asm-m32r/page.h @@ -1,7 +1,6 @@ #ifndef _ASM_M32R_PAGE_H #define _ASM_M32R_PAGE_H -#include /* PAGE_SHIFT determines the page size */ #define PAGE_SHIFT 12 @@ -88,10 +87,9 @@ typedef struct { unsigned long pgprot; } pgprot_t; #define devmem_is_allowed(x) 1 -#endif /* __KERNEL__ */ - #include #include +#endif /* __KERNEL__ */ #endif /* _ASM_M32R_PAGE_H */ diff --git a/include/asm-m32r/pgalloc.h b/include/asm-m32r/pgalloc.h index 6da309b6f..e09a86c3c 100644 --- a/include/asm-m32r/pgalloc.h +++ b/include/asm-m32r/pgalloc.h @@ -3,7 +3,6 @@ /* $Id$ */ -#include #include #include diff --git a/include/asm-m32r/pgtable-2level.h b/include/asm-m32r/pgtable-2level.h index 861727c20..be0f167e3 100644 --- a/include/asm-m32r/pgtable-2level.h +++ b/include/asm-m32r/pgtable-2level.h @@ -3,7 +3,6 @@ #ifdef __KERNEL__ -#include /* * traditional M32R two-level paging structure: diff --git a/include/asm-m32r/pgtable.h b/include/asm-m32r/pgtable.h index 75740debc..1983b7f45 100644 --- a/include/asm-m32r/pgtable.h +++ b/include/asm-m32r/pgtable.h @@ -20,7 +20,6 @@ #ifndef __ASSEMBLY__ -#include #include #include #include diff --git a/include/asm-m32r/processor.h b/include/asm-m32r/processor.h index 09fd1813e..32755bf13 100644 --- a/include/asm-m32r/processor.h +++ b/include/asm-m32r/processor.h @@ -14,7 +14,6 @@ */ #include -#include #include #include /* pt_regs */ diff --git a/include/asm-m32r/ptrace.h b/include/asm-m32r/ptrace.h index 53c792452..2d2a6c973 100644 --- a/include/asm-m32r/ptrace.h +++ b/include/asm-m32r/ptrace.h @@ -12,9 +12,6 @@ * Copyright (C) 2001-2002, 2004 Hirokazu Takata */ -#include -#include /* M32R_PSW_BSM, M32R_PSW_BPM */ - /* 0 - 13 are integer registers (general purpose registers). */ #define PT_R4 0 #define PT_R5 1 @@ -141,6 +138,8 @@ struct pt_regs { #ifdef __KERNEL__ +#include /* M32R_PSW_BSM, M32R_PSW_BPM */ + #define __ARCH_SYS_PTRACE 1 #if defined(CONFIG_ISA_M32R2) || defined(CONFIG_CHIP_VDEC2) diff --git a/include/asm-m32r/rtc.h b/include/asm-m32r/rtc.h index ec3cdf666..6b2b837c5 100644 --- a/include/asm-m32r/rtc.h +++ b/include/asm-m32r/rtc.h @@ -4,7 +4,6 @@ #define __RTC_H__ -#include /* Dallas DS1302 clock/calendar register numbers. */ # define RTC_SECONDS 0 diff --git a/include/asm-m32r/semaphore.h b/include/asm-m32r/semaphore.h index 81750edc8..41e45d7b8 100644 --- a/include/asm-m32r/semaphore.h +++ b/include/asm-m32r/semaphore.h @@ -12,7 +12,6 @@ * Copyright (C) 2004, 2006 Hirokazu Takata */ -#include #include #include #include diff --git a/include/asm-m32r/serial.h b/include/asm-m32r/serial.h index 1bf480f58..5ac244c72 100644 --- a/include/asm-m32r/serial.h +++ b/include/asm-m32r/serial.h @@ -3,7 +3,6 @@ /* include/asm-m32r/serial.h */ -#include #define BASE_BAUD 115200 diff --git a/include/asm-m32r/sigcontext.h b/include/asm-m32r/sigcontext.h index 942b8a309..73025c0c4 100644 --- a/include/asm-m32r/sigcontext.h +++ b/include/asm-m32r/sigcontext.h @@ -3,7 +3,6 @@ /* $Id$ */ -#include struct sigcontext { /* CPU registers */ diff --git a/include/asm-m32r/signal.h b/include/asm-m32r/signal.h index 95f69b191..65423bed3 100644 --- a/include/asm-m32r/signal.h +++ b/include/asm-m32r/signal.h @@ -6,7 +6,6 @@ /* orig : i386 2.4.18 */ #include -#include #include #include @@ -81,7 +80,6 @@ typedef unsigned long sigset_t; * SA_FLAGS values: * * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. * SA_RESETHAND clears the handler when the signal is delivered. @@ -101,7 +99,6 @@ typedef unsigned long sigset_t; #define SA_NOMASK SA_NODEFER #define SA_ONESHOT SA_RESETHAND -#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ #define SA_RESTORER 0x04000000 diff --git a/include/asm-m32r/smp.h b/include/asm-m32r/smp.h index 1184293e5..650d2558c 100644 --- a/include/asm-m32r/smp.h +++ b/include/asm-m32r/smp.h @@ -3,7 +3,6 @@ /* $Id$ */ -#include #ifdef CONFIG_SMP #ifndef __ASSEMBLY__ diff --git a/include/asm-m32r/socket.h b/include/asm-m32r/socket.h index 8b6680f22..acdf748fc 100644 --- a/include/asm-m32r/socket.h +++ b/include/asm-m32r/socket.h @@ -48,5 +48,6 @@ #define SO_ACCEPTCONN 30 #define SO_PEERSEC 31 +#define SO_PASSSEC 34 #endif /* _ASM_M32R_SOCKET_H */ diff --git a/include/asm-m32r/spinlock.h b/include/asm-m32r/spinlock.h index 7de7def28..f94c1a673 100644 --- a/include/asm-m32r/spinlock.h +++ b/include/asm-m32r/spinlock.h @@ -9,7 +9,6 @@ * Copyright (C) 2004 Hirokazu Takata */ -#include /* CONFIG_DEBUG_SPINLOCK, CONFIG_SMP */ #include #include #include diff --git a/include/asm-m32r/system.h b/include/asm-m32r/system.h index e55013f37..9e618afec 100644 --- a/include/asm-m32r/system.h +++ b/include/asm-m32r/system.h @@ -10,7 +10,6 @@ * Copyright (C) 2004, 2006 Hirokazu Takata */ -#include #include #ifdef __KERNEL__ @@ -19,7 +18,7 @@ * switch_to(prev, next) should switch from task `prev' to `next' * `prev' will never be the same as `next'. * - * `next' and `prev' should be task_t, but it isn't always defined + * `next' and `prev' should be struct task_struct, but it isn't always defined */ #define switch_to(prev, next, last) do { \ @@ -319,7 +318,7 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size) * does not enforce ordering, since there is no data dependency between * the read of "a" and the read of "b". Therefore, on some CPUs, such * as Alpha, "y" could be set to 3 and "x" to 0. Use rmb() - * in cases like thiswhere there are no data dependencies. + * in cases like this where there are no data dependencies. **/ #define read_barrier_depends() do { } while (0) @@ -337,7 +336,6 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size) #endif #define set_mb(var, value) do { xchg(&var, value); } while (0) -#define set_wmb(var, value) do { var = value; wmb(); } while (0) #define arch_align_stack(x) (x) diff --git a/include/asm-m32r/timex.h b/include/asm-m32r/timex.h index abf12e7ff..e89bfd17d 100644 --- a/include/asm-m32r/timex.h +++ b/include/asm-m32r/timex.h @@ -9,7 +9,6 @@ * m32r architecture timex specifications */ -#include #define CLOCK_TICK_RATE (CONFIG_BUS_CLOCK / CONFIG_TIMER_DIVIDE) #define CLOCK_TICK_FACTOR 20 /* Factor of both 1000000 and CLOCK_TICK_RATE */ diff --git a/include/asm-m32r/tlbflush.h b/include/asm-m32r/tlbflush.h index bc7c407db..ae4494960 100644 --- a/include/asm-m32r/tlbflush.h +++ b/include/asm-m32r/tlbflush.h @@ -1,7 +1,6 @@ #ifndef _ASM_M32R_TLBFLUSH_H #define _ASM_M32R_TLBFLUSH_H -#include #include /* diff --git a/include/asm-m32r/uaccess.h b/include/asm-m32r/uaccess.h index 819cc28a9..26e978c7e 100644 --- a/include/asm-m32r/uaccess.h +++ b/include/asm-m32r/uaccess.h @@ -11,7 +11,6 @@ /* * User space memory access functions */ -#include #include #include #include diff --git a/include/asm-m32r/unistd.h b/include/asm-m32r/unistd.h index be0eb014c..89f376e62 100644 --- a/include/asm-m32r/unistd.h +++ b/include/asm-m32r/unistd.h @@ -3,8 +3,6 @@ /* $Id$ */ -#include /* SYSCALL_* */ - /* * This file contains the system call numbers. */ @@ -295,12 +293,16 @@ #define __NR_kexec_load 283 #define __NR_waitid 284 +#ifdef __KERNEL__ + #define NR_syscalls 285 /* user-visible error numbers are in the range -1 - -124: see * */ +#include /* SYSCALL_* */ + #define __syscall_return(type, res) \ do { \ if ((unsigned long)(res) >= (unsigned long)(-(124 + 1))) { \ @@ -405,7 +407,6 @@ __asm__ __volatile__ (\ __syscall_return(type,__res); \ } -#ifdef __KERNEL__ #define __ARCH_WANT_IPC_PARSE_VERSION #define __ARCH_WANT_STAT64 #define __ARCH_WANT_SYS_ALARM @@ -421,7 +422,6 @@ __syscall_return(type,__res); \ #define __ARCH_WANT_SYS_OLD_GETRLIMIT /*will be unused*/ #define __ARCH_WANT_SYS_OLDUMOUNT #define __ARCH_WANT_SYS_RT_SIGACTION -#endif #ifdef __KERNEL_SYSCALLS__ @@ -470,4 +470,5 @@ asmlinkage long sys_rt_sigaction(int sig, #define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") #endif +#endif /* __KERNEL__ */ #endif /* _ASM_M32R_UNISTD_H */ diff --git a/include/asm-m32r/user.h b/include/asm-m32r/user.h index 2ffd0c65a..1ad4ded84 100644 --- a/include/asm-m32r/user.h +++ b/include/asm-m32r/user.h @@ -8,7 +8,6 @@ */ #include -#include #include #include diff --git a/include/asm-m32r/vga.h b/include/asm-m32r/vga.h index d0f4b6eed..533163447 100644 --- a/include/asm-m32r/vga.h +++ b/include/asm-m32r/vga.h @@ -14,7 +14,7 @@ * access the videoram directly without any black magic. */ -#define VGA_MAP_MEM(x) (unsigned long)phys_to_virt(x) +#define VGA_MAP_MEM(x,s) (unsigned long)phys_to_virt(x) #define vga_readb(x) (*(x)) #define vga_writeb(x,y) (*(y) = (x)) diff --git a/include/asm-m68k/amigaints.h b/include/asm-m68k/amigaints.h index aa968d014..7c8713468 100644 --- a/include/asm-m68k/amigaints.h +++ b/include/asm-m68k/amigaints.h @@ -13,6 +13,8 @@ #ifndef _ASMm68k_AMIGAINTS_H_ #define _ASMm68k_AMIGAINTS_H_ +#include + /* ** Amiga Interrupt sources. ** @@ -23,72 +25,52 @@ #define CIA_IRQS (5) #define AMI_IRQS (32) /* AUTO_IRQS+AMI_STD_IRQS+2*CIA_IRQS */ -/* vertical blanking interrupt */ -#define IRQ_AMIGA_VERTB 0 +/* builtin serial port interrupts */ +#define IRQ_AMIGA_TBE (IRQ_USER+0) +#define IRQ_AMIGA_RBF (IRQ_USER+11) -/* copper interrupt */ -#define IRQ_AMIGA_COPPER 1 +/* floppy disk interrupts */ +#define IRQ_AMIGA_DSKBLK (IRQ_USER+1) +#define IRQ_AMIGA_DSKSYN (IRQ_USER+12) -/* Audio interrupts */ -#define IRQ_AMIGA_AUD0 2 -#define IRQ_AMIGA_AUD1 3 -#define IRQ_AMIGA_AUD2 4 -#define IRQ_AMIGA_AUD3 5 +/* software interrupts */ +#define IRQ_AMIGA_SOFT (IRQ_USER+2) -/* Blitter done interrupt */ -#define IRQ_AMIGA_BLIT 6 +/* interrupts from external hardware */ +#define IRQ_AMIGA_PORTS IRQ_AUTO_2 +#define IRQ_AMIGA_EXTER IRQ_AUTO_6 -/* floppy disk interrupts */ -#define IRQ_AMIGA_DSKSYN 7 -#define IRQ_AMIGA_DSKBLK 8 +/* copper interrupt */ +#define IRQ_AMIGA_COPPER (IRQ_USER+4) -/* builtin serial port interrupts */ -#define IRQ_AMIGA_RBF 9 -#define IRQ_AMIGA_TBE 10 +/* vertical blanking interrupt */ +#define IRQ_AMIGA_VERTB (IRQ_USER+5) -/* software interrupts */ -#define IRQ_AMIGA_SOFT 11 +/* Blitter done interrupt */ +#define IRQ_AMIGA_BLIT (IRQ_USER+6) -/* interrupts from external hardware */ -#define IRQ_AMIGA_PORTS 12 -#define IRQ_AMIGA_EXTER 13 +/* Audio interrupts */ +#define IRQ_AMIGA_AUD0 (IRQ_USER+7) +#define IRQ_AMIGA_AUD1 (IRQ_USER+8) +#define IRQ_AMIGA_AUD2 (IRQ_USER+9) +#define IRQ_AMIGA_AUD3 (IRQ_USER+10) /* CIA interrupt sources */ -#define IRQ_AMIGA_CIAA 14 -#define IRQ_AMIGA_CIAA_TA 14 -#define IRQ_AMIGA_CIAA_TB 15 -#define IRQ_AMIGA_CIAA_ALRM 16 -#define IRQ_AMIGA_CIAA_SP 17 -#define IRQ_AMIGA_CIAA_FLG 18 -#define IRQ_AMIGA_CIAB 19 -#define IRQ_AMIGA_CIAB_TA 19 -#define IRQ_AMIGA_CIAB_TB 20 -#define IRQ_AMIGA_CIAB_ALRM 21 -#define IRQ_AMIGA_CIAB_SP 22 -#define IRQ_AMIGA_CIAB_FLG 23 - -/* auto-vector interrupts */ -#define IRQ_AMIGA_AUTO 24 -#define IRQ_AMIGA_AUTO_0 24 /* This is just a dummy */ -#define IRQ_AMIGA_AUTO_1 25 -#define IRQ_AMIGA_AUTO_2 26 -#define IRQ_AMIGA_AUTO_3 27 -#define IRQ_AMIGA_AUTO_4 28 -#define IRQ_AMIGA_AUTO_5 29 -#define IRQ_AMIGA_AUTO_6 30 -#define IRQ_AMIGA_AUTO_7 31 - -#define IRQ_FLOPPY IRQ_AMIGA_DSKBLK +#define IRQ_AMIGA_CIAA (IRQ_USER+14) +#define IRQ_AMIGA_CIAA_TA (IRQ_USER+14) +#define IRQ_AMIGA_CIAA_TB (IRQ_USER+15) +#define IRQ_AMIGA_CIAA_ALRM (IRQ_USER+16) +#define IRQ_AMIGA_CIAA_SP (IRQ_USER+17) +#define IRQ_AMIGA_CIAA_FLG (IRQ_USER+18) +#define IRQ_AMIGA_CIAB (IRQ_USER+19) +#define IRQ_AMIGA_CIAB_TA (IRQ_USER+19) +#define IRQ_AMIGA_CIAB_TB (IRQ_USER+20) +#define IRQ_AMIGA_CIAB_ALRM (IRQ_USER+21) +#define IRQ_AMIGA_CIAB_SP (IRQ_USER+22) +#define IRQ_AMIGA_CIAB_FLG (IRQ_USER+23) -/* INTREQR masks */ -#define IRQ1_MASK 0x0007 /* INTREQR mask for IRQ 1 */ -#define IRQ2_MASK 0x0008 /* INTREQR mask for IRQ 2 */ -#define IRQ3_MASK 0x0070 /* INTREQR mask for IRQ 3 */ -#define IRQ4_MASK 0x0780 /* INTREQR mask for IRQ 4 */ -#define IRQ5_MASK 0x1800 /* INTREQR mask for IRQ 5 */ -#define IRQ6_MASK 0x2000 /* INTREQR mask for IRQ 6 */ -#define IRQ7_MASK 0x4000 /* INTREQR mask for IRQ 7 */ +/* INTREQR masks */ #define IF_SETCLR 0x8000 /* set/clr bit */ #define IF_INTEN 0x4000 /* master interrupt bit in INT* registers */ #define IF_EXTER 0x2000 /* external level 6 and CIA B interrupt */ @@ -106,9 +88,6 @@ #define IF_DSKBLK 0x0002 /* diskblock DMA finished */ #define IF_TBE 0x0001 /* serial transmit buffer empty interrupt */ -extern void amiga_do_irq(int irq, struct pt_regs *fp); -extern void amiga_do_irq_list(int irq, struct pt_regs *fp); - /* CIA interrupt control register bits */ #define CIA_ICR_TA 0x01 @@ -125,6 +104,7 @@ extern void amiga_do_irq_list(int irq, struct pt_regs *fp); extern struct ciabase ciaa_base, ciab_base; +extern void cia_init_IRQ(struct ciabase *base); extern unsigned char cia_set_irq(struct ciabase *base, unsigned char mask); extern unsigned char cia_able_irq(struct ciabase *base, unsigned char mask); diff --git a/include/asm-m68k/apollohw.h b/include/asm-m68k/apollohw.h index 4304e1c33..a1373b9aa 100644 --- a/include/asm-m68k/apollohw.h +++ b/include/asm-m68k/apollohw.h @@ -3,6 +3,8 @@ #ifndef _ASMm68k_APOLLOHW_H_ #define _ASMm68k_APOLLOHW_H_ +#include + /* apollo models */ @@ -101,4 +103,6 @@ extern u_long timer_physaddr; #define isaIO2mem(x) (((((x) & 0x3f8) << 7) | (((x) & 0xfc00) >> 6) | ((x) & 0x7)) + 0x40000 + IO_BASE) +#define IRQ_APOLLO IRQ_USER + #endif diff --git a/include/asm-m68k/atari_stdma.h b/include/asm-m68k/atari_stdma.h index 64f92880c..b4eadf852 100644 --- a/include/asm-m68k/atari_stdma.h +++ b/include/asm-m68k/atari_stdma.h @@ -3,7 +3,7 @@ #define _atari_stdma_h -#include +#include /***************************** Prototypes *****************************/ diff --git a/include/asm-m68k/atariints.h b/include/asm-m68k/atariints.h index 42952c890..0ed454fc2 100644 --- a/include/asm-m68k/atariints.h +++ b/include/asm-m68k/atariints.h @@ -45,17 +45,6 @@ #define IRQ_TYPE_FAST 1 #define IRQ_TYPE_PRIO 2 -#define IRQ_SPURIOUS (0) - -/* auto-vector interrupts */ -#define IRQ_AUTO_1 (1) -#define IRQ_AUTO_2 (2) -#define IRQ_AUTO_3 (3) -#define IRQ_AUTO_4 (4) -#define IRQ_AUTO_5 (5) -#define IRQ_AUTO_6 (6) -#define IRQ_AUTO_7 (7) - /* ST-MFP interrupts */ #define IRQ_MFP_BUSY (8) #define IRQ_MFP_DCD (9) diff --git a/include/asm-m68k/atomic.h b/include/asm-m68k/atomic.h index 732d696d3..d5eed64cb 100644 --- a/include/asm-m68k/atomic.h +++ b/include/asm-m68k/atomic.h @@ -1,7 +1,6 @@ #ifndef __ARCH_M68K_ATOMIC__ #define __ARCH_M68K_ATOMIC__ -#include #include /* local_irq_XXX() */ diff --git a/include/asm-m68k/bug.h b/include/asm-m68k/bug.h index 072ce274d..7b60776cc 100644 --- a/include/asm-m68k/bug.h +++ b/include/asm-m68k/bug.h @@ -1,7 +1,6 @@ #ifndef _M68K_BUG_H #define _M68K_BUG_H -#include #ifdef CONFIG_BUG #ifdef CONFIG_DEBUG_BUGVERBOSE diff --git a/include/asm-m68k/bvme6000hw.h b/include/asm-m68k/bvme6000hw.h index 28a859b03..f40d2f851 100644 --- a/include/asm-m68k/bvme6000hw.h +++ b/include/asm-m68k/bvme6000hw.h @@ -109,23 +109,23 @@ typedef struct { #define BVME_IRQ_TYPE_PRIO 0 -#define BVME_IRQ_PRN 0x54 -#define BVME_IRQ_I596 0x1a -#define BVME_IRQ_SCSI 0x1b -#define BVME_IRQ_TIMER 0x59 -#define BVME_IRQ_RTC 0x1e -#define BVME_IRQ_ABORT 0x1f +#define BVME_IRQ_PRN (IRQ_USER+20) +#define BVME_IRQ_TIMER (IRQ_USER+25) +#define BVME_IRQ_I596 IRQ_AUTO_2 +#define BVME_IRQ_SCSI IRQ_AUTO_3 +#define BVME_IRQ_RTC IRQ_AUTO_6 +#define BVME_IRQ_ABORT IRQ_AUTO_7 /* SCC interrupts */ -#define BVME_IRQ_SCC_BASE 0x40 -#define BVME_IRQ_SCCB_TX 0x40 -#define BVME_IRQ_SCCB_STAT 0x42 -#define BVME_IRQ_SCCB_RX 0x44 -#define BVME_IRQ_SCCB_SPCOND 0x46 -#define BVME_IRQ_SCCA_TX 0x48 -#define BVME_IRQ_SCCA_STAT 0x4a -#define BVME_IRQ_SCCA_RX 0x4c -#define BVME_IRQ_SCCA_SPCOND 0x4e +#define BVME_IRQ_SCC_BASE IRQ_USER +#define BVME_IRQ_SCCB_TX IRQ_USER +#define BVME_IRQ_SCCB_STAT (IRQ_USER+2) +#define BVME_IRQ_SCCB_RX (IRQ_USER+4) +#define BVME_IRQ_SCCB_SPCOND (IRQ_USER+6) +#define BVME_IRQ_SCCA_TX (IRQ_USER+8) +#define BVME_IRQ_SCCA_STAT (IRQ_USER+10) +#define BVME_IRQ_SCCA_RX (IRQ_USER+12) +#define BVME_IRQ_SCCA_SPCOND (IRQ_USER+14) /* Address control registers */ diff --git a/include/asm-m68k/cacheflush.h b/include/asm-m68k/cacheflush.h index 8aba971b1..24d3ff449 100644 --- a/include/asm-m68k/cacheflush.h +++ b/include/asm-m68k/cacheflush.h @@ -3,26 +3,30 @@ #include +/* cache code */ +#define FLUSH_I_AND_D (0x00000808) +#define FLUSH_I (0x00000008) + /* * Cache handling functions */ -#define flush_icache() \ -({ \ - if (CPU_IS_040_OR_060) \ - __asm__ __volatile__("nop\n\t" \ - ".chip 68040\n\t" \ - "cinva %%ic\n\t" \ - ".chip 68k" : ); \ - else { \ - unsigned long _tmp; \ - __asm__ __volatile__("movec %%cacr,%0\n\t" \ - "orw %1,%0\n\t" \ - "movec %0,%%cacr" \ - : "=&d" (_tmp) \ - : "id" (FLUSH_I)); \ - } \ -}) +static inline void flush_icache(void) +{ + if (CPU_IS_040_OR_060) + asm volatile ( "nop\n" + " .chip 68040\n" + " cpusha %bc\n" + " .chip 68k"); + else { + unsigned long tmp; + asm volatile ( "movec %%cacr,%0\n" + " or.w %1,%0\n" + " movec %0,%%cacr" + : "=&d" (tmp) + : "id" (FLUSH_I)); + } +} /* * invalidate the cache for the specified memory range. @@ -43,10 +47,6 @@ extern void cache_push(unsigned long paddr, int len); */ extern void cache_push_v(unsigned long vaddr, int len); -/* cache code */ -#define FLUSH_I_AND_D (0x00000808) -#define FLUSH_I (0x00000008) - /* This is needed whenever the virtual mapping of the current process changes. */ #define __flush_cache_all() \ diff --git a/include/asm-m68k/dma-mapping.h b/include/asm-m68k/dma-mapping.h index b1920c703..cebbb0337 100644 --- a/include/asm-m68k/dma-mapping.h +++ b/include/asm-m68k/dma-mapping.h @@ -1,12 +1,91 @@ #ifndef _M68K_DMA_MAPPING_H #define _M68K_DMA_MAPPING_H -#include +#include -#ifdef CONFIG_PCI -#include -#else -#include -#endif +struct scatterlist; + +static inline int dma_supported(struct device *dev, u64 mask) +{ + return 1; +} + +static inline int dma_set_mask(struct device *dev, u64 mask) +{ + return 0; +} + +static inline int dma_get_cache_alignment(void) +{ + return 1 << L1_CACHE_SHIFT; +} + +static inline int dma_is_consistent(dma_addr_t dma_addr) +{ + return 0; +} + +extern void *dma_alloc_coherent(struct device *, size_t, + dma_addr_t *, int); +extern void dma_free_coherent(struct device *, size_t, + void *, dma_addr_t); + +static inline void *dma_alloc_noncoherent(struct device *dev, size_t size, + dma_addr_t *handle, int flag) +{ + return dma_alloc_coherent(dev, size, handle, flag); +} +static inline void dma_free_noncoherent(struct device *dev, size_t size, + void *addr, dma_addr_t handle) +{ + dma_free_coherent(dev, size, addr, handle); +} +static inline void dma_cache_sync(void *vaddr, size_t size, + enum dma_data_direction dir) +{ + /* we use coherent allocation, so not much to do here. */ +} + +extern dma_addr_t dma_map_single(struct device *, void *, size_t, + enum dma_data_direction); +static inline void dma_unmap_single(struct device *dev, dma_addr_t addr, + size_t size, enum dma_data_direction dir) +{ +} + +extern dma_addr_t dma_map_page(struct device *, struct page *, + unsigned long, size_t size, + enum dma_data_direction); +static inline void dma_unmap_page(struct device *dev, dma_addr_t address, + size_t size, enum dma_data_direction dir) +{ +} + +extern int dma_map_sg(struct device *, struct scatterlist *, int, + enum dma_data_direction); +static inline void dma_unmap_sg(struct device *dev, struct scatterlist *sg, + int nhwentries, enum dma_data_direction dir) +{ +} + +extern void dma_sync_single_for_device(struct device *, dma_addr_t, size_t, + enum dma_data_direction); +extern void dma_sync_sg_for_device(struct device *, struct scatterlist *, int, + enum dma_data_direction); + +static inline void dma_sync_single_for_cpu(struct device *dev, dma_addr_t handle, + size_t size, enum dma_data_direction dir) +{ +} + +static inline void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, + int nents, enum dma_data_direction dir) +{ +} + +static inline int dma_mapping_error(dma_addr_t handle) +{ + return 0; +} #endif /* _M68K_DMA_MAPPING_H */ diff --git a/include/asm-m68k/dma.h b/include/asm-m68k/dma.h index d5266a886..d0c9e61e5 100644 --- a/include/asm-m68k/dma.h +++ b/include/asm-m68k/dma.h @@ -1,7 +1,6 @@ #ifndef _M68K_DMA_H #define _M68K_DMA_H 1 -#include /* it's useless on the m68k, but unfortunately needed by the new bootmem allocator (but this should do it for this) */ diff --git a/include/asm-m68k/dvma.h b/include/asm-m68k/dvma.h index 5978f87b0..e1112de5a 100644 --- a/include/asm-m68k/dvma.h +++ b/include/asm-m68k/dvma.h @@ -9,7 +9,6 @@ #ifndef __M68K_DVMA_H #define __M68K_DVMA_H -#include #define DVMA_PAGE_SHIFT 13 #define DVMA_PAGE_SIZE (1UL << DVMA_PAGE_SHIFT) diff --git a/include/asm-m68k/elf.h b/include/asm-m68k/elf.h index 38bf8347f..eb63b85f9 100644 --- a/include/asm-m68k/elf.h +++ b/include/asm-m68k/elf.h @@ -5,7 +5,6 @@ * ELF register definitions.. */ -#include #include #include diff --git a/include/asm-m68k/entry.h b/include/asm-m68k/entry.h index 0396495cd..f8f6b185d 100644 --- a/include/asm-m68k/entry.h +++ b/include/asm-m68k/entry.h @@ -1,7 +1,6 @@ #ifndef __M68K_ENTRY_H #define __M68K_ENTRY_H -#include #include #include diff --git a/include/asm-m68k/floppy.h b/include/asm-m68k/floppy.h index 63a05ed95..57f4fdda6 100644 --- a/include/asm-m68k/floppy.h +++ b/include/asm-m68k/floppy.h @@ -88,8 +88,8 @@ static __inline__ void fd_outb(unsigned char value, int port) static int fd_request_irq(void) { if(MACH_IS_Q40) - return request_irq(FLOPPY_IRQ, floppy_hardint,SA_INTERRUPT, - "floppy", floppy_hardint); + return request_irq(FLOPPY_IRQ, floppy_hardint, + IRQF_DISABLED, "floppy", floppy_hardint); else if(MACH_IS_SUN3X) return sun3xflop_request_irq(); return -ENXIO; diff --git a/include/asm-m68k/fpu.h b/include/asm-m68k/fpu.h index 3bcf85065..59701d7b4 100644 --- a/include/asm-m68k/fpu.h +++ b/include/asm-m68k/fpu.h @@ -1,7 +1,6 @@ #ifndef __M68K_FPU_H #define __M68K_FPU_H -#include /* * MAX floating point unit state size (FSAVE/FRESTORE) diff --git a/include/asm-m68k/hardirq.h b/include/asm-m68k/hardirq.h index 5e1c5826c..394ee9460 100644 --- a/include/asm-m68k/hardirq.h +++ b/include/asm-m68k/hardirq.h @@ -1,7 +1,6 @@ #ifndef __M68K_HARDIRQ_H #define __M68K_HARDIRQ_H -#include #include #include diff --git a/include/asm-m68k/ide.h b/include/asm-m68k/ide.h index 36118fd01..365f76fb8 100644 --- a/include/asm-m68k/ide.h +++ b/include/asm-m68k/ide.h @@ -31,7 +31,6 @@ #ifdef __KERNEL__ -#include #include #include diff --git a/include/asm-m68k/io.h b/include/asm-m68k/io.h index dcfaa352d..5e0fcf418 100644 --- a/include/asm-m68k/io.h +++ b/include/asm-m68k/io.h @@ -23,7 +23,6 @@ #ifdef __KERNEL__ -#include #include #include #include diff --git a/include/asm-m68k/irq.h b/include/asm-m68k/irq.h index 9ac047c40..3257f9881 100644 --- a/include/asm-m68k/irq.h +++ b/include/asm-m68k/irq.h @@ -1,14 +1,9 @@ #ifndef _M68K_IRQ_H_ #define _M68K_IRQ_H_ -#include -#include - -/* - * # of m68k interrupts - */ - -#define SYS_IRQS 8 +#include +#include +#include /* * This should be the same as the max(NUM_X_SOURCES) for all the @@ -16,10 +11,20 @@ * Currently the Atari has 72 and the Amiga 24, but if both are * supported in the kernel it is better to make room for 72. */ -#if defined(CONFIG_ATARI) || defined(CONFIG_MAC) -#define NR_IRQS (72+SYS_IRQS) +#if defined(CONFIG_VME) || defined(CONFIG_SUN3) || defined(CONFIG_SUN3X) +#define NR_IRQS 200 +#elif defined(CONFIG_ATARI) || defined(CONFIG_MAC) +#define NR_IRQS 72 +#elif defined(CONFIG_Q40) +#define NR_IRQS 43 +#elif defined(CONFIG_AMIGA) +#define NR_IRQS 32 +#elif defined(CONFIG_APOLLO) +#define NR_IRQS 24 +#elif defined(CONFIG_HP300) +#define NR_IRQS 8 #else -#define NR_IRQS (24+SYS_IRQS) +#error unknown nr of irqs #endif /* @@ -41,57 +46,29 @@ * that routine requires service. */ -#define IRQ1 (1) /* level 1 interrupt */ -#define IRQ2 (2) /* level 2 interrupt */ -#define IRQ3 (3) /* level 3 interrupt */ -#define IRQ4 (4) /* level 4 interrupt */ -#define IRQ5 (5) /* level 5 interrupt */ -#define IRQ6 (6) /* level 6 interrupt */ -#define IRQ7 (7) /* level 7 interrupt (non-maskable) */ +#define IRQ_SPURIOUS 0 -/* - * "Generic" interrupt sources - */ - -#define IRQ_SCHED_TIMER (8) /* interrupt source for scheduling timer */ +#define IRQ_AUTO_1 1 /* level 1 interrupt */ +#define IRQ_AUTO_2 2 /* level 2 interrupt */ +#define IRQ_AUTO_3 3 /* level 3 interrupt */ +#define IRQ_AUTO_4 4 /* level 4 interrupt */ +#define IRQ_AUTO_5 5 /* level 5 interrupt */ +#define IRQ_AUTO_6 6 /* level 6 interrupt */ +#define IRQ_AUTO_7 7 /* level 7 interrupt (non-maskable) */ -static __inline__ int irq_canonicalize(int irq) -{ - return irq; -} - -/* - * Machine specific interrupt sources. - * - * Adding an interrupt service routine for a source with this bit - * set indicates a special machine specific interrupt source. - * The machine specific files define these sources. - * - * The IRQ_MACHSPEC bit is now gone - the only thing it did was to - * introduce unnecessary overhead. - * - * All interrupt handling is actually machine specific so it is better - * to use function pointers, as used by the Sparc port, and select the - * interrupt handling functions when initializing the kernel. This way - * we save some unnecessary overhead at run-time. - * 01/11/97 - Jes - */ +#define IRQ_USER 8 -extern void (*enable_irq)(unsigned int); -extern void (*disable_irq)(unsigned int); +extern unsigned int irq_canonicalize(unsigned int irq); +extern void enable_irq(unsigned int); +extern void disable_irq(unsigned int); #define disable_irq_nosync disable_irq struct pt_regs; -extern int cpu_request_irq(unsigned int, - irqreturn_t (*)(int, void *, struct pt_regs *), - unsigned long, const char *, void *); -extern void cpu_free_irq(unsigned int, void *); - /* * various flags for request_irq() - the Amiga now uses the standard - * mechanism like all other architectures - SA_INTERRUPT and SA_SHIRQ - * are your friends. + * mechanism like all other architectures - IRQF_DISABLED and + * IRQF_SHARED are your friends. */ #ifndef MACH_AMIGA_ONLY #define IRQ_FLG_LOCK (0x0001) /* handler is not replaceable */ @@ -106,33 +83,45 @@ extern void cpu_free_irq(unsigned int, void *); * interrupt source (if it supports chaining). */ typedef struct irq_node { - irqreturn_t (*handler)(int, void *, struct pt_regs *); - unsigned long flags; + int (*handler)(int, void *, struct pt_regs *); void *dev_id; - const char *devname; struct irq_node *next; + unsigned long flags; + const char *devname; } irq_node_t; /* * This structure has only 4 elements for speed reasons */ typedef struct irq_handler { - irqreturn_t (*handler)(int, void *, struct pt_regs *); + int (*handler)(int, void *, struct pt_regs *); unsigned long flags; void *dev_id; const char *devname; } irq_handler_t; -/* count of spurious interrupts */ -extern volatile unsigned int num_spurious; +struct irq_controller { + const char *name; + spinlock_t lock; + int (*startup)(unsigned int irq); + void (*shutdown)(unsigned int irq); + void (*enable)(unsigned int irq); + void (*disable)(unsigned int irq); +}; + +extern int m68k_irq_startup(unsigned int); +extern void m68k_irq_shutdown(unsigned int); /* * This function returns a new irq_node_t */ extern irq_node_t *new_irq_node(void); -struct irqaction; -struct pt_regs; -int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *); +extern void m68k_setup_auto_interrupt(void (*handler)(unsigned int, struct pt_regs *)); +extern void m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt, + void (*handler)(unsigned int, struct pt_regs *)); +extern void m68k_setup_irq_controller(struct irq_controller *, unsigned int, unsigned int); + +asmlinkage void m68k_handle_int(unsigned int, struct pt_regs *); #endif /* _M68K_IRQ_H_ */ diff --git a/include/asm-m68k/mac_oss.h b/include/asm-m68k/mac_oss.h index 7644a639c..7221f7251 100644 --- a/include/asm-m68k/mac_oss.h +++ b/include/asm-m68k/mac_oss.h @@ -69,12 +69,12 @@ #define OSS_IRQLEV_DISABLED 0 #define OSS_IRQLEV_IOPISM 1 /* ADB? */ -#define OSS_IRQLEV_SCSI 2 -#define OSS_IRQLEV_NUBUS 3 /* keep this on its own level */ -#define OSS_IRQLEV_IOPSCC 4 /* matches VIA alternate mapping */ -#define OSS_IRQLEV_SOUND 5 /* matches VIA alternate mapping */ +#define OSS_IRQLEV_SCSI IRQ_AUTO_2 +#define OSS_IRQLEV_NUBUS IRQ_AUTO_3 /* keep this on its own level */ +#define OSS_IRQLEV_IOPSCC IRQ_AUTO_4 /* matches VIA alternate mapping */ +#define OSS_IRQLEV_SOUND IRQ_AUTO_5 /* matches VIA alternate mapping */ #define OSS_IRQLEV_60HZ 6 /* matches VIA alternate mapping */ -#define OSS_IRQLEV_VIA1 6 /* matches VIA alternate mapping */ +#define OSS_IRQLEV_VIA1 IRQ_AUTO_6 /* matches VIA alternate mapping */ #define OSS_IRQLEV_PARITY 7 /* matches VIA alternate mapping */ #ifndef __ASSEMBLY__ diff --git a/include/asm-m68k/machdep.h b/include/asm-m68k/machdep.h index 7d3fee342..df898f27e 100644 --- a/include/asm-m68k/machdep.h +++ b/include/asm-m68k/machdep.h @@ -13,14 +13,8 @@ struct buffer_head; extern void (*mach_sched_init) (irqreturn_t (*handler)(int, void *, struct pt_regs *)); /* machine dependent irq functions */ extern void (*mach_init_IRQ) (void); -extern irqreturn_t (*(*mach_default_handler)[]) (int, void *, struct pt_regs *); -extern int (*mach_request_irq) (unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), - unsigned long flags, const char *devname, void *dev_id); -extern void (*mach_free_irq) (unsigned int irq, void *dev_id); extern void (*mach_get_model) (char *model); extern int (*mach_get_hardware_list) (char *buffer); -extern int (*mach_get_irq_list) (struct seq_file *p, void *v); -extern irqreturn_t (*mach_process_int) (int irq, struct pt_regs *fp); /* machine dependent timer functions */ extern unsigned long (*mach_gettimeoffset)(void); extern int (*mach_hwclk)(int, struct rtc_time*); diff --git a/include/asm-m68k/macintosh.h b/include/asm-m68k/macintosh.h index 6fc3d1951..27d11da2b 100644 --- a/include/asm-m68k/macintosh.h +++ b/include/asm-m68k/macintosh.h @@ -11,17 +11,7 @@ extern void mac_reset(void); extern void mac_poweroff(void); extern void mac_init_IRQ(void); -extern int mac_request_irq (unsigned int, irqreturn_t (*)(int, void *, - struct pt_regs *), - unsigned long, const char *, void *); -extern void mac_free_irq(unsigned int, void *); -extern void mac_enable_irq(unsigned int); -extern void mac_disable_irq(unsigned int); extern int mac_irq_pending(unsigned int); -extern int show_mac_interrupts(struct seq_file *, void *); -#if 0 -extern void mac_default_handler(int irq); -#endif extern void mac_identify(void); extern void mac_report_hardware(void); extern void mac_debugging_penguin(int); diff --git a/include/asm-m68k/macints.h b/include/asm-m68k/macints.h index fd8c3a9fe..679c48ab4 100644 --- a/include/asm-m68k/macints.h +++ b/include/asm-m68k/macints.h @@ -59,17 +59,6 @@ #define IRQ_SRC(irq) (irq >> 3) #define IRQ_IDX(irq) (irq & 7) -#define IRQ_SPURIOUS (0) - -/* auto-vector interrupts */ -#define IRQ_AUTO_1 (1) -#define IRQ_AUTO_2 (2) -#define IRQ_AUTO_3 (3) -#define IRQ_AUTO_4 (4) -#define IRQ_AUTO_5 (5) -#define IRQ_AUTO_6 (6) -#define IRQ_AUTO_7 (7) - /* VIA1 interrupts */ #define IRQ_VIA1_0 (8) /* one second int. */ #define IRQ_VIA1_1 (9) /* VBlank int. */ @@ -163,7 +152,4 @@ #define INT_CLK 24576 /* CLK while int_clk =2.456MHz and divide = 100 */ #define INT_TICKS 246 /* to make sched_time = 99.902... HZ */ -extern irq_node_t *mac_irq_list[NUM_MAC_SOURCES]; -extern void mac_do_irq_list(int irq, struct pt_regs *); - #endif /* asm/macints.h */ diff --git a/include/asm-m68k/mc146818rtc.h b/include/asm-m68k/mc146818rtc.h index 11442095a..11fe12ddb 100644 --- a/include/asm-m68k/mc146818rtc.h +++ b/include/asm-m68k/mc146818rtc.h @@ -4,7 +4,6 @@ #ifndef _ASM_MC146818RTC_H #define _ASM_MC146818RTC_H -#include #ifdef CONFIG_ATARI /* RTC in Atari machines */ diff --git a/include/asm-m68k/mmu_context.h b/include/asm-m68k/mmu_context.h index 661191d15..231d11bd8 100644 --- a/include/asm-m68k/mmu_context.h +++ b/include/asm-m68k/mmu_context.h @@ -1,7 +1,6 @@ #ifndef __M68K_MMU_CONTEXT_H #define __M68K_MMU_CONTEXT_H -#include static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk) { diff --git a/include/asm-m68k/motorola_pgtable.h b/include/asm-m68k/motorola_pgtable.h index 162872345..1ccc7338a 100644 --- a/include/asm-m68k/motorola_pgtable.h +++ b/include/asm-m68k/motorola_pgtable.h @@ -1,7 +1,6 @@ #ifndef _MOTOROLA_PGTABLE_H #define _MOTOROLA_PGTABLE_H -#include /* * Definitions for MMU descriptors diff --git a/include/asm-m68k/mvme147hw.h b/include/asm-m68k/mvme147hw.h index f245139f3..b81043108 100644 --- a/include/asm-m68k/mvme147hw.h +++ b/include/asm-m68k/mvme147hw.h @@ -1,6 +1,8 @@ #ifndef _MVME147HW_H_ #define _MVME147HW_H_ +#include + typedef struct { unsigned char ctrl, @@ -72,39 +74,39 @@ struct pcc_regs { #define PCC_LEVEL_SCSI_PORT 0x04 #define PCC_LEVEL_SCSI_DMA 0x04 -#define PCC_IRQ_AC_FAIL 0x40 -#define PCC_IRQ_BERR 0x41 -#define PCC_IRQ_ABORT 0x42 -/* #define PCC_IRQ_SERIAL 0x43 */ -#define PCC_IRQ_PRINTER 0x47 -#define PCC_IRQ_TIMER1 0x48 -#define PCC_IRQ_TIMER2 0x49 -#define PCC_IRQ_SOFTWARE1 0x4a -#define PCC_IRQ_SOFTWARE2 0x4b +#define PCC_IRQ_AC_FAIL (IRQ_USER+0) +#define PCC_IRQ_BERR (IRQ_USER+1) +#define PCC_IRQ_ABORT (IRQ_USER+2) +/* #define PCC_IRQ_SERIAL (IRQ_USER+3) */ +#define PCC_IRQ_PRINTER (IRQ_USER+7) +#define PCC_IRQ_TIMER1 (IRQ_USER+8) +#define PCC_IRQ_TIMER2 (IRQ_USER+9) +#define PCC_IRQ_SOFTWARE1 (IRQ_USER+10) +#define PCC_IRQ_SOFTWARE2 (IRQ_USER+11) #define M147_SCC_A_ADDR 0xfffe3002 #define M147_SCC_B_ADDR 0xfffe3000 #define M147_SCC_PCLK 5000000 -#define MVME147_IRQ_SCSI_PORT 0x45 -#define MVME147_IRQ_SCSI_DMA 0x46 +#define MVME147_IRQ_SCSI_PORT (IRQ_USER+0x45) +#define MVME147_IRQ_SCSI_DMA (IRQ_USER+0x46) /* SCC interrupts, for MVME147 */ #define MVME147_IRQ_TYPE_PRIO 0 -#define MVME147_IRQ_SCC_BASE 0x60 -#define MVME147_IRQ_SCCB_TX 0x60 -#define MVME147_IRQ_SCCB_STAT 0x62 -#define MVME147_IRQ_SCCB_RX 0x64 -#define MVME147_IRQ_SCCB_SPCOND 0x66 -#define MVME147_IRQ_SCCA_TX 0x68 -#define MVME147_IRQ_SCCA_STAT 0x6a -#define MVME147_IRQ_SCCA_RX 0x6c -#define MVME147_IRQ_SCCA_SPCOND 0x6e +#define MVME147_IRQ_SCC_BASE (IRQ_USER+32) +#define MVME147_IRQ_SCCB_TX (IRQ_USER+32) +#define MVME147_IRQ_SCCB_STAT (IRQ_USER+34) +#define MVME147_IRQ_SCCB_RX (IRQ_USER+36) +#define MVME147_IRQ_SCCB_SPCOND (IRQ_USER+38) +#define MVME147_IRQ_SCCA_TX (IRQ_USER+40) +#define MVME147_IRQ_SCCA_STAT (IRQ_USER+42) +#define MVME147_IRQ_SCCA_RX (IRQ_USER+44) +#define MVME147_IRQ_SCCA_SPCOND (IRQ_USER+46) #define MVME147_LANCE_BASE 0xfffe1800 -#define MVME147_LANCE_IRQ 0x44 +#define MVME147_LANCE_IRQ (IRQ_USER+4) #define ETHERNET_ADDRESS 0xfffe0778 diff --git a/include/asm-m68k/mvme16xhw.h b/include/asm-m68k/mvme16xhw.h index 5d07231d2..6117f5665 100644 --- a/include/asm-m68k/mvme16xhw.h +++ b/include/asm-m68k/mvme16xhw.h @@ -66,28 +66,28 @@ typedef struct { #define MVME162_IRQ_TYPE_PRIO 0 -#define MVME167_IRQ_PRN 0x54 -#define MVME16x_IRQ_I596 0x57 -#define MVME16x_IRQ_SCSI 0x55 -#define MVME16x_IRQ_FLY 0x7f -#define MVME167_IRQ_SER_ERR 0x5c -#define MVME167_IRQ_SER_MODEM 0x5d -#define MVME167_IRQ_SER_TX 0x5e -#define MVME167_IRQ_SER_RX 0x5f -#define MVME16x_IRQ_TIMER 0x59 -#define MVME167_IRQ_ABORT 0x6e -#define MVME162_IRQ_ABORT 0x5e +#define MVME167_IRQ_PRN (IRQ_USER+20) +#define MVME16x_IRQ_I596 (IRQ_USER+23) +#define MVME16x_IRQ_SCSI (IRQ_USER+21) +#define MVME16x_IRQ_FLY (IRQ_USER+63) +#define MVME167_IRQ_SER_ERR (IRQ_USER+28) +#define MVME167_IRQ_SER_MODEM (IRQ_USER+29) +#define MVME167_IRQ_SER_TX (IRQ_USER+30) +#define MVME167_IRQ_SER_RX (IRQ_USER+31) +#define MVME16x_IRQ_TIMER (IRQ_USER+25) +#define MVME167_IRQ_ABORT (IRQ_USER+46) +#define MVME162_IRQ_ABORT (IRQ_USER+30) /* SCC interrupts, for MVME162 */ -#define MVME162_IRQ_SCC_BASE 0x40 -#define MVME162_IRQ_SCCB_TX 0x40 -#define MVME162_IRQ_SCCB_STAT 0x42 -#define MVME162_IRQ_SCCB_RX 0x44 -#define MVME162_IRQ_SCCB_SPCOND 0x46 -#define MVME162_IRQ_SCCA_TX 0x48 -#define MVME162_IRQ_SCCA_STAT 0x4a -#define MVME162_IRQ_SCCA_RX 0x4c -#define MVME162_IRQ_SCCA_SPCOND 0x4e +#define MVME162_IRQ_SCC_BASE (IRQ_USER+0) +#define MVME162_IRQ_SCCB_TX (IRQ_USER+0) +#define MVME162_IRQ_SCCB_STAT (IRQ_USER+2) +#define MVME162_IRQ_SCCB_RX (IRQ_USER+4) +#define MVME162_IRQ_SCCB_SPCOND (IRQ_USER+6) +#define MVME162_IRQ_SCCA_TX (IRQ_USER+8) +#define MVME162_IRQ_SCCA_STAT (IRQ_USER+10) +#define MVME162_IRQ_SCCA_RX (IRQ_USER+12) +#define MVME162_IRQ_SCCA_SPCOND (IRQ_USER+14) /* MVME162 version register */ diff --git a/include/asm-m68k/openprom.h b/include/asm-m68k/openprom.h index efbfb0bec..869ab9176 100644 --- a/include/asm-m68k/openprom.h +++ b/include/asm-m68k/openprom.h @@ -8,7 +8,6 @@ * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) */ -#include /* Empirical constants... */ #ifdef CONFIG_SUN3 diff --git a/include/asm-m68k/oplib.h b/include/asm-m68k/oplib.h index c3594f473..06caa2d08 100644 --- a/include/asm-m68k/oplib.h +++ b/include/asm-m68k/oplib.h @@ -244,11 +244,6 @@ extern void prom_getstring(int node, char *prop, char *buf, int bufsize); /* Does the passed node have the given "name"? YES=1 NO=0 */ extern int prom_nodematch(int thisnode, char *name); -/* Puts in buffer a prom name in the form name@x,y or name (x for which_io - * and y for first regs phys address - */ -extern int prom_getname(int node, char *buf, int buflen); - /* Search all siblings starting at the passed node for "name" matching * the given string. Returns the node on success, zero on failure. */ diff --git a/include/asm-m68k/page.h b/include/asm-m68k/page.h index 3725c9bd9..f4c883b22 100644 --- a/include/asm-m68k/page.h +++ b/include/asm-m68k/page.h @@ -1,7 +1,8 @@ #ifndef _M68K_PAGE_H #define _M68K_PAGE_H -#include + +#ifdef __KERNEL__ /* PAGE_SHIFT determines the page size */ #ifndef CONFIG_SUN3 @@ -16,8 +17,6 @@ #endif #define PAGE_MASK (~(PAGE_SIZE-1)) -#ifdef __KERNEL__ - #include #if PAGE_SHIFT < 13 @@ -176,10 +175,10 @@ static inline void *__va(unsigned long x) #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \ VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) +#include + #define devmem_is_allowed(x) 1 #endif /* __KERNEL__ */ -#include - #endif /* _M68K_PAGE_H */ diff --git a/include/asm-m68k/page_offset.h b/include/asm-m68k/page_offset.h index 86d3c2845..1cbdb7f30 100644 --- a/include/asm-m68k/page_offset.h +++ b/include/asm-m68k/page_offset.h @@ -1,4 +1,3 @@ -#include /* This handles the memory map.. */ #ifndef CONFIG_SUN3 diff --git a/include/asm-m68k/pgalloc.h b/include/asm-m68k/pgalloc.h index b468b7958..a9cfb4b99 100644 --- a/include/asm-m68k/pgalloc.h +++ b/include/asm-m68k/pgalloc.h @@ -2,7 +2,6 @@ #ifndef M68K_PGALLOC_H #define M68K_PGALLOC_H -#include #include #include #include diff --git a/include/asm-m68k/pgtable.h b/include/asm-m68k/pgtable.h index add129e93..f3aa05377 100644 --- a/include/asm-m68k/pgtable.h +++ b/include/asm-m68k/pgtable.h @@ -3,7 +3,6 @@ #include -#include #include #ifndef __ASSEMBLY__ diff --git a/include/asm-m68k/processor.h b/include/asm-m68k/processor.h index 7982285e8..8455f778b 100644 --- a/include/asm-m68k/processor.h +++ b/include/asm-m68k/processor.h @@ -13,7 +13,6 @@ */ #define current_text_addr() ({ __label__ _l; _l: &&_l;}) -#include #include #include #include @@ -72,10 +71,10 @@ struct thread_struct { }; #define INIT_THREAD { \ - ksp: sizeof(init_stack) + (unsigned long) init_stack, \ - sr: PS_S, \ - fs: __KERNEL_DS, \ - info: INIT_THREAD_INFO(init_task) \ + .ksp = sizeof(init_stack) + (unsigned long) init_stack, \ + .sr = PS_S, \ + .fs = __KERNEL_DS, \ + .info = INIT_THREAD_INFO(init_task), \ } /* diff --git a/include/asm-m68k/scatterlist.h b/include/asm-m68k/scatterlist.h index d7c9b5c5e..8e612266d 100644 --- a/include/asm-m68k/scatterlist.h +++ b/include/asm-m68k/scatterlist.h @@ -2,18 +2,17 @@ #define _M68K_SCATTERLIST_H struct scatterlist { - /* These two are only valid if ADDRESS member of this - * struct is NULL. - */ struct page *page; unsigned int offset; - unsigned int length; - __u32 dvma_address; /* A place to hang host-specific addresses at. */ + __u32 dma_address; /* A place to hang host-specific addresses at. */ }; /* This is bogus and should go away. */ #define ISA_DMA_THRESHOLD (0x00ffffff) +#define sg_dma_address(sg) ((sg)->dma_address) +#define sg_dma_len(sg) ((sg)->length) + #endif /* !(_M68K_SCATTERLIST_H) */ diff --git a/include/asm-m68k/semaphore-helper.h b/include/asm-m68k/semaphore-helper.h index 1516a642f..eef30ba0b 100644 --- a/include/asm-m68k/semaphore-helper.h +++ b/include/asm-m68k/semaphore-helper.h @@ -9,7 +9,6 @@ * m68k version by Andreas Schwab */ -#include #include /* diff --git a/include/asm-m68k/serial.h b/include/asm-m68k/serial.h index 3fe29f8b0..2b90d6e69 100644 --- a/include/asm-m68k/serial.h +++ b/include/asm-m68k/serial.h @@ -6,7 +6,6 @@ * */ -#include /* * This assumes you have a 1.8432 MHz clock for your UART. diff --git a/include/asm-m68k/setup.h b/include/asm-m68k/setup.h index a89aa8407..7facc9a46 100644 --- a/include/asm-m68k/setup.h +++ b/include/asm-m68k/setup.h @@ -23,7 +23,6 @@ #ifndef _M68K_SETUP_H #define _M68K_SETUP_H -#include /* diff --git a/include/asm-m68k/shm.h b/include/asm-m68k/shm.h index 3fa2f368f..fa56ec84a 100644 --- a/include/asm-m68k/shm.h +++ b/include/asm-m68k/shm.h @@ -1,7 +1,6 @@ #ifndef _M68K_SHM_H #define _M68K_SHM_H -#include /* format of page table entries that correspond to shared memory pages currently out in swap space (see also mm/swap.c): diff --git a/include/asm-m68k/signal.h b/include/asm-m68k/signal.h index b7b7ea20c..de1ba6ead 100644 --- a/include/asm-m68k/signal.h +++ b/include/asm-m68k/signal.h @@ -74,7 +74,6 @@ typedef unsigned long sigset_t; * SA_FLAGS values: * * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. * SA_RESETHAND clears the handler when the signal is delivered. @@ -94,7 +93,6 @@ typedef unsigned long sigset_t; #define SA_NOMASK SA_NODEFER #define SA_ONESHOT SA_RESETHAND -#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ /* * sigaltstack controls @@ -156,13 +154,17 @@ typedef struct sigaltstack { static inline void sigaddset(sigset_t *set, int _sig) { - __asm__("bfset %0{%1,#1}" : "=m" (*set) : "id" ((_sig - 1) ^ 31) + asm ("bfset %0{%1,#1}" + : "+od" (*set) + : "id" ((_sig - 1) ^ 31) : "cc"); } static inline void sigdelset(sigset_t *set, int _sig) { - __asm__("bfclr %0{%1,#1}" : "=m"(*set) : "id"((_sig - 1) ^ 31) + asm ("bfclr %0{%1,#1}" + : "+od" (*set) + : "id" ((_sig - 1) ^ 31) : "cc"); } @@ -175,8 +177,10 @@ static inline int __const_sigismember(sigset_t *set, int _sig) static inline int __gen_sigismember(sigset_t *set, int _sig) { int ret; - __asm__("bfextu %1{%2,#1},%0" - : "=d"(ret) : "m"(*set), "id"((_sig-1) ^ 31)); + asm ("bfextu %1{%2,#1},%0" + : "=d" (ret) + : "od" (*set), "id" ((_sig-1) ^ 31) + : "cc"); return ret; } @@ -187,7 +191,10 @@ static inline int __gen_sigismember(sigset_t *set, int _sig) static inline int sigfindinword(unsigned long word) { - __asm__("bfffo %1{#0,#0},%0" : "=d"(word) : "d"(word & -word) : "cc"); + asm ("bfffo %1{#0,#0},%0" + : "=d" (word) + : "d" (word & -word) + : "cc"); return word ^ 31; } diff --git a/include/asm-m68k/socket.h b/include/asm-m68k/socket.h index f578ca4b7..a5966ec00 100644 --- a/include/asm-m68k/socket.h +++ b/include/asm-m68k/socket.h @@ -48,5 +48,6 @@ #define SO_ACCEPTCONN 30 #define SO_PEERSEC 31 +#define SO_PASSSEC 34 #endif /* _ASM_SOCKET_H */ diff --git a/include/asm-m68k/sun3ints.h b/include/asm-m68k/sun3ints.h index bd038fccb..de91fa071 100644 --- a/include/asm-m68k/sun3ints.h +++ b/include/asm-m68k/sun3ints.h @@ -12,37 +12,25 @@ #define SUN3INTS_H #include -#include -#include -#include #include -#include -#include #include #include +#include #define SUN3_INT_VECS 192 void sun3_enable_irq(unsigned int irq); void sun3_disable_irq(unsigned int irq); -int sun3_request_irq(unsigned int irq, - irqreturn_t (*handler)(int, void *, struct pt_regs *), - unsigned long flags, const char *devname, void *dev_id - ); extern void sun3_init_IRQ (void); -extern irqreturn_t (*sun3_default_handler[]) (int, void *, struct pt_regs *); -extern void sun3_free_irq (unsigned int irq, void *dev_id); extern void sun3_enable_interrupts (void); extern void sun3_disable_interrupts (void); -extern int show_sun3_interrupts(struct seq_file *, void *); -extern irqreturn_t sun3_process_int(int, struct pt_regs *); extern volatile unsigned char* sun3_intreg; /* master list of VME vectors -- don't fuck with this */ -#define SUN3_VEC_FLOPPY 0x40 -#define SUN3_VEC_VMESCSI0 0x40 -#define SUN3_VEC_VMESCSI1 0x41 -#define SUN3_VEC_CG 0xA8 +#define SUN3_VEC_FLOPPY (IRQ_USER+0) +#define SUN3_VEC_VMESCSI0 (IRQ_USER+0) +#define SUN3_VEC_VMESCSI1 (IRQ_USER+1) +#define SUN3_VEC_CG (IRQ_USER+104) #endif /* SUN3INTS_H */ diff --git a/include/asm-m68k/sun3xflop.h b/include/asm-m68k/sun3xflop.h index 98a9f79da..ca8cc4113 100644 --- a/include/asm-m68k/sun3xflop.h +++ b/include/asm-m68k/sun3xflop.h @@ -208,7 +208,8 @@ static int sun3xflop_request_irq(void) if(!once) { once = 1; - error = request_irq(FLOPPY_IRQ, sun3xflop_hardint, SA_INTERRUPT, "floppy", NULL); + error = request_irq(FLOPPY_IRQ, sun3xflop_hardint, + IRQF_DISABLED, "floppy", NULL); return ((error == 0) ? 0 : -1); } else return 0; } diff --git a/include/asm-m68k/system.h b/include/asm-m68k/system.h index 64d3481df..131a0cb0f 100644 --- a/include/asm-m68k/system.h +++ b/include/asm-m68k/system.h @@ -1,7 +1,6 @@ #ifndef _M68K_SYSTEM_H #define _M68K_SYSTEM_H -#include /* get configuration macros */ #include #include #include @@ -81,7 +80,6 @@ static inline int irqs_disabled(void) #define wmb() barrier() #define read_barrier_depends() do { } while(0) #define set_mb(var, value) do { xchg(&var, value); } while (0) -#define set_wmb(var, value) do { var = value; wmb(); } while (0) #define smp_mb() barrier() #define smp_rmb() barrier() diff --git a/include/asm-m68k/tlbflush.h b/include/asm-m68k/tlbflush.h index 8e61ccffe..31678831e 100644 --- a/include/asm-m68k/tlbflush.h +++ b/include/asm-m68k/tlbflush.h @@ -1,7 +1,6 @@ #ifndef _M68K_TLBFLUSH_H #define _M68K_TLBFLUSH_H -#include #ifndef CONFIG_SUN3 diff --git a/include/asm-m68k/traps.h b/include/asm-m68k/traps.h index 475056191..8caef2562 100644 --- a/include/asm-m68k/traps.h +++ b/include/asm-m68k/traps.h @@ -13,8 +13,15 @@ #ifndef __ASSEMBLY__ +#include +#include + typedef void (*e_vector)(void); +asmlinkage void auto_inthandler(void); +asmlinkage void user_inthandler(void); +asmlinkage void bad_inthandler(void); + extern e_vector vectors[]; #endif diff --git a/include/asm-m68k/uaccess.h b/include/asm-m68k/uaccess.h index 2ffd87b0a..88b1f4740 100644 --- a/include/asm-m68k/uaccess.h +++ b/include/asm-m68k/uaccess.h @@ -4,8 +4,9 @@ /* * User space memory access functions */ +#include #include -#include +#include #include #define VERIFY_READ 0 @@ -32,858 +33,335 @@ struct exception_table_entry unsigned long insn, fixup; }; +extern int __put_user_bad(void); +extern int __get_user_bad(void); + +#define __put_user_asm(res, x, ptr, bwl, reg, err) \ +asm volatile ("\n" \ + "1: moves."#bwl" %2,%1\n" \ + "2:\n" \ + " .section .fixup,\"ax\"\n" \ + " .even\n" \ + "10: moveq.l %3,%0\n" \ + " jra 2b\n" \ + " .previous\n" \ + "\n" \ + " .section __ex_table,\"a\"\n" \ + " .align 4\n" \ + " .long 1b,10b\n" \ + " .long 2b,10b\n" \ + " .previous" \ + : "+d" (res), "=m" (*(ptr)) \ + : #reg (x), "i" (err)) /* * These are the main single-value transfer routines. They automatically * use the right size if we just have the right pointer type. */ -#define put_user(x, ptr) \ -({ \ - int __pu_err; \ - typeof(*(ptr)) __pu_val = (x); \ - __chk_user_ptr(ptr); \ - switch (sizeof (*(ptr))) { \ - case 1: \ - __put_user_asm(__pu_err, __pu_val, ptr, b); \ - break; \ - case 2: \ - __put_user_asm(__pu_err, __pu_val, ptr, w); \ - break; \ - case 4: \ - __put_user_asm(__pu_err, __pu_val, ptr, l); \ - break; \ - case 8: \ - __pu_err = __constant_copy_to_user(ptr, &__pu_val, 8); \ - break; \ - default: \ - __pu_err = __put_user_bad(); \ - break; \ - } \ - __pu_err; \ +#define __put_user(x, ptr) \ +({ \ + typeof(*(ptr)) __pu_val = (x); \ + int __pu_err = 0; \ + __chk_user_ptr(ptr); \ + switch (sizeof (*(ptr))) { \ + case 1: \ + __put_user_asm(__pu_err, __pu_val, ptr, b, d, -EFAULT); \ + break; \ + case 2: \ + __put_user_asm(__pu_err, __pu_val, ptr, w, d, -EFAULT); \ + break; \ + case 4: \ + __put_user_asm(__pu_err, __pu_val, ptr, l, r, -EFAULT); \ + break; \ + case 8: \ + { \ + const void *__pu_ptr = (ptr); \ + asm volatile ("\n" \ + "1: moves.l %2,(%1)+\n" \ + "2: moves.l %R2,(%1)\n" \ + "3:\n" \ + " .section .fixup,\"ax\"\n" \ + " .even\n" \ + "10: movel %3,%0\n" \ + " jra 3b\n" \ + " .previous\n" \ + "\n" \ + " .section __ex_table,\"a\"\n" \ + " .align 4\n" \ + " .long 1b,10b\n" \ + " .long 2b,10b\n" \ + " .long 3b,10b\n" \ + " .previous" \ + : "+d" (__pu_err), "+a" (__pu_ptr) \ + : "r" (__pu_val), "i" (-EFAULT) \ + : "memory"); \ + break; \ + } \ + default: \ + __pu_err = __put_user_bad(); \ + break; \ + } \ + __pu_err; \ }) -#define __put_user(x, ptr) put_user(x, ptr) - -extern int __put_user_bad(void); +#define put_user(x, ptr) __put_user(x, ptr) -/* - * Tell gcc we read from memory instead of writing: this is because - * we do not write to any memory gcc knows about, so there are no - * aliasing issues. - */ -#define __put_user_asm(err,x,ptr,bwl) \ -__asm__ __volatile__ \ - ("21:moves" #bwl " %2,%1\n" \ - "1:\n" \ - ".section .fixup,\"ax\"\n" \ - " .even\n" \ - "2: movel %3,%0\n" \ - " jra 1b\n" \ - ".previous\n" \ - ".section __ex_table,\"a\"\n" \ - " .align 4\n" \ - " .long 21b,2b\n" \ - " .long 1b,2b\n" \ - ".previous" \ - : "=d"(err) \ - : "m"(*(ptr)), "r"(x), "i"(-EFAULT), "0"(0)) -#define get_user(x, ptr) \ -({ \ - int __gu_err; \ - typeof(*(ptr)) __gu_val; \ - __chk_user_ptr(ptr); \ - switch (sizeof(*(ptr))) { \ - case 1: \ - __get_user_asm(__gu_err, __gu_val, ptr, b, "=d"); \ - break; \ - case 2: \ - __get_user_asm(__gu_err, __gu_val, ptr, w, "=r"); \ - break; \ - case 4: \ - __get_user_asm(__gu_err, __gu_val, ptr, l, "=r"); \ - break; \ - case 8: \ - __gu_err = __constant_copy_from_user(&__gu_val, ptr, 8); \ - break; \ - default: \ - __gu_val = (typeof(*(ptr)))0; \ - __gu_err = __get_user_bad(); \ - break; \ - } \ - (x) = __gu_val; \ - __gu_err; \ +#define __get_user_asm(res, x, ptr, type, bwl, reg, err) ({ \ + type __gu_val; \ + asm volatile ("\n" \ + "1: moves."#bwl" %2,%1\n" \ + "2:\n" \ + " .section .fixup,\"ax\"\n" \ + " .even\n" \ + "10: move.l %3,%0\n" \ + " sub."#bwl" %1,%1\n" \ + " jra 2b\n" \ + " .previous\n" \ + "\n" \ + " .section __ex_table,\"a\"\n" \ + " .align 4\n" \ + " .long 1b,10b\n" \ + " .previous" \ + : "+d" (res), "=&" #reg (__gu_val) \ + : "m" (*(ptr)), "i" (err)); \ + (x) = (typeof(*(ptr)))(long)__gu_val; \ }) -#define __get_user(x, ptr) get_user(x, ptr) - -extern int __get_user_bad(void); - -#define __get_user_asm(err,x,ptr,bwl,reg) \ -__asm__ __volatile__ \ - ("1: moves" #bwl " %2,%1\n" \ - "2:\n" \ - ".section .fixup,\"ax\"\n" \ - " .even\n" \ - "3: movel %3,%0\n" \ - " sub" #bwl " %1,%1\n" \ - " jra 2b\n" \ - ".previous\n" \ - ".section __ex_table,\"a\"\n" \ - " .align 4\n" \ - " .long 1b,3b\n" \ - ".previous" \ - : "=d"(err), reg(x) \ - : "m"(*(ptr)), "i" (-EFAULT), "0"(0)) -static inline unsigned long -__generic_copy_from_user(void *to, const void __user *from, unsigned long n) -{ - unsigned long tmp; - __asm__ __volatile__ - (" tstl %2\n" - " jeq 2f\n" - "1: movesl (%1)+,%3\n" - " movel %3,(%0)+\n" - " subql #1,%2\n" - " jne 1b\n" - "2: movel %4,%2\n" - " bclr #1,%2\n" - " jeq 4f\n" - "3: movesw (%1)+,%3\n" - " movew %3,(%0)+\n" - "4: bclr #0,%2\n" - " jeq 6f\n" - "5: movesb (%1)+,%3\n" - " moveb %3,(%0)+\n" - "6:\n" - ".section .fixup,\"ax\"\n" - " .even\n" - "7: movel %2,%%d0\n" - "71:clrl (%0)+\n" - " subql #1,%%d0\n" - " jne 71b\n" - " lsll #2,%2\n" - " addl %4,%2\n" - " btst #1,%4\n" - " jne 81f\n" - " btst #0,%4\n" - " jne 91f\n" - " jra 6b\n" - "8: addql #2,%2\n" - "81:clrw (%0)+\n" - " btst #0,%4\n" - " jne 91f\n" - " jra 6b\n" - "9: addql #1,%2\n" - "91:clrb (%0)+\n" - " jra 6b\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 4\n" - " .long 1b,7b\n" - " .long 3b,8b\n" - " .long 5b,9b\n" - ".previous" - : "=a"(to), "=a"(from), "=d"(n), "=&d"(tmp) - : "d"(n & 3), "0"(to), "1"(from), "2"(n/4) - : "d0", "memory"); - return n; -} +#define __get_user(x, ptr) \ +({ \ + int __gu_err = 0; \ + __chk_user_ptr(ptr); \ + switch (sizeof(*(ptr))) { \ + case 1: \ + __get_user_asm(__gu_err, x, ptr, u8, b, d, -EFAULT); \ + break; \ + case 2: \ + __get_user_asm(__gu_err, x, ptr, u16, w, d, -EFAULT); \ + break; \ + case 4: \ + __get_user_asm(__gu_err, x, ptr, u32, l, r, -EFAULT); \ + break; \ +/* case 8: disabled because gcc-4.1 has a broken typeof \ + { \ + const void *__gu_ptr = (ptr); \ + u64 __gu_val; \ + asm volatile ("\n" \ + "1: moves.l (%2)+,%1\n" \ + "2: moves.l (%2),%R1\n" \ + "3:\n" \ + " .section .fixup,\"ax\"\n" \ + " .even\n" \ + "10: move.l %3,%0\n" \ + " sub.l %1,%1\n" \ + " sub.l %R1,%R1\n" \ + " jra 3b\n" \ + " .previous\n" \ + "\n" \ + " .section __ex_table,\"a\"\n" \ + " .align 4\n" \ + " .long 1b,10b\n" \ + " .long 2b,10b\n" \ + " .previous" \ + : "+d" (__gu_err), "=&r" (__gu_val), \ + "+a" (__gu_ptr) \ + : "i" (-EFAULT) \ + : "memory"); \ + (x) = (typeof(*(ptr)))__gu_val; \ + break; \ + } */ \ + default: \ + __gu_err = __get_user_bad(); \ + break; \ + } \ + __gu_err; \ +}) +#define get_user(x, ptr) __get_user(x, ptr) -static inline unsigned long -__generic_copy_to_user(void __user *to, const void *from, unsigned long n) -{ - unsigned long tmp; - __asm__ __volatile__ - (" tstl %2\n" - " jeq 3f\n" - "1: movel (%1)+,%3\n" - "22:movesl %3,(%0)+\n" - "2: subql #1,%2\n" - " jne 1b\n" - "3: movel %4,%2\n" - " bclr #1,%2\n" - " jeq 4f\n" - " movew (%1)+,%3\n" - "24:movesw %3,(%0)+\n" - "4: bclr #0,%2\n" - " jeq 5f\n" - " moveb (%1)+,%3\n" - "25:movesb %3,(%0)+\n" - "5:\n" - ".section .fixup,\"ax\"\n" - " .even\n" - "60:addql #1,%2\n" - "6: lsll #2,%2\n" - " addl %4,%2\n" - " jra 5b\n" - "7: addql #2,%2\n" - " jra 5b\n" - "8: addql #1,%2\n" - " jra 5b\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 4\n" - " .long 1b,60b\n" - " .long 22b,6b\n" - " .long 2b,6b\n" - " .long 24b,7b\n" - " .long 3b,60b\n" - " .long 4b,7b\n" - " .long 25b,8b\n" - " .long 5b,8b\n" - ".previous" - : "=a"(to), "=a"(from), "=d"(n), "=&d"(tmp) - : "r"(n & 3), "0"(to), "1"(from), "2"(n / 4) - : "memory"); - return n; -} +unsigned long __generic_copy_from_user(void *to, const void __user *from, unsigned long n); +unsigned long __generic_copy_to_user(void __user *to, const void *from, unsigned long n); -#define __copy_from_user_big(to, from, n, fixup, copy) \ - __asm__ __volatile__ \ - ("10: movesl (%1)+,%%d0\n" \ - " movel %%d0,(%0)+\n" \ - " subql #1,%2\n" \ - " jne 10b\n" \ - ".section .fixup,\"ax\"\n" \ - " .even\n" \ - "11: movel %2,%%d0\n" \ - "13: clrl (%0)+\n" \ - " subql #1,%%d0\n" \ - " jne 13b\n" \ - " lsll #2,%2\n" \ - fixup "\n" \ - " jra 12f\n" \ - ".previous\n" \ - ".section __ex_table,\"a\"\n" \ - " .align 4\n" \ - " .long 10b,11b\n" \ - ".previous\n" \ - copy "\n" \ - "12:" \ - : "=a"(to), "=a"(from), "=d"(n) \ - : "0"(to), "1"(from), "2"(n/4) \ - : "d0", "memory") +#define __constant_copy_from_user_asm(res, to, from, tmp, n, s1, s2, s3)\ + asm volatile ("\n" \ + "1: moves."#s1" (%2)+,%3\n" \ + " move."#s1" %3,(%1)+\n" \ + "2: moves."#s2" (%2)+,%3\n" \ + " move."#s2" %3,(%1)+\n" \ + " .ifnc \""#s3"\",\"\"\n" \ + "3: moves."#s3" (%2)+,%3\n" \ + " move."#s3" %3,(%1)+\n" \ + " .endif\n" \ + "4:\n" \ + " .section __ex_table,\"a\"\n" \ + " .align 4\n" \ + " .long 1b,10f\n" \ + " .long 2b,20f\n" \ + " .ifnc \""#s3"\",\"\"\n" \ + " .long 3b,30f\n" \ + " .endif\n" \ + " .previous\n" \ + "\n" \ + " .section .fixup,\"ax\"\n" \ + " .even\n" \ + "10: clr."#s1" (%1)+\n" \ + "20: clr."#s2" (%1)+\n" \ + " .ifnc \""#s3"\",\"\"\n" \ + "30: clr."#s3" (%1)+\n" \ + " .endif\n" \ + " moveq.l #"#n",%0\n" \ + " jra 4b\n" \ + " .previous\n" \ + : "+d" (res), "+&a" (to), "+a" (from), "=&d" (tmp) \ + : : "memory") -static inline unsigned long +static __always_inline unsigned long __constant_copy_from_user(void *to, const void __user *from, unsigned long n) { - switch (n) { - case 0: - break; - case 1: - __asm__ __volatile__ - ("1: movesb (%1)+,%%d0\n" - " moveb %%d0,(%0)+\n" - "2:\n" - ".section .fixup,\"ax\"\n" - " .even\n" - "3: addql #1,%2\n" - " clrb (%0)+\n" - " jra 2b\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 4\n" - " .long 1b,3b\n" - ".previous" - : "=a"(to), "=a"(from), "=d"(n) - : "0"(to), "1"(from), "2"(0) - : "d0", "memory"); - break; - case 2: - __asm__ __volatile__ - ("1: movesw (%1)+,%%d0\n" - " movew %%d0,(%0)+\n" - "2:\n" - ".section .fixup,\"ax\"\n" - " .even\n" - "3: addql #2,%2\n" - " clrw (%0)+\n" - " jra 2b\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 4\n" - " .long 1b,3b\n" - ".previous" - : "=a"(to), "=a"(from), "=d"(n) - : "0"(to), "1"(from), "2"(0) - : "d0", "memory"); - break; - case 3: - __asm__ __volatile__ - ("1: movesw (%1)+,%%d0\n" - " movew %%d0,(%0)+\n" - "2: movesb (%1)+,%%d0\n" - " moveb %%d0,(%0)+\n" - "3:" - ".section .fixup,\"ax\"\n" - " .even\n" - "4: addql #2,%2\n" - " clrw (%0)+\n" - "5: addql #1,%2\n" - " clrb (%0)+\n" - " jra 3b\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 4\n" - " .long 1b,4b\n" - " .long 2b,5b\n" - ".previous" - : "=a"(to), "=a"(from), "=d"(n) - : "0"(to), "1"(from), "2"(0) - : "d0", "memory"); - break; - case 4: - __asm__ __volatile__ - ("1: movesl (%1)+,%%d0\n" - " movel %%d0,(%0)+\n" - "2:" - ".section .fixup,\"ax\"\n" - " .even\n" - "3: addql #4,%2\n" - " clrl (%0)+\n" - " jra 2b\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 4\n" - " .long 1b,3b\n" - ".previous" - : "=a"(to), "=a"(from), "=d"(n) - : "0"(to), "1"(from), "2"(0) - : "d0", "memory"); - break; - case 8: - __asm__ __volatile__ - ("1: movesl (%1)+,%%d0\n" - " movel %%d0,(%0)+\n" - "2: movesl (%1)+,%%d0\n" - " movel %%d0,(%0)+\n" - "3:" - ".section .fixup,\"ax\"\n" - " .even\n" - "4: addql #4,%2\n" - " clrl (%0)+\n" - "5: addql #4,%2\n" - " clrl (%0)+\n" - " jra 3b\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 4\n" - " .long 1b,4b\n" - " .long 2b,5b\n" - ".previous" - : "=a"(to), "=a"(from), "=d"(n) - : "0"(to), "1"(from), "2"(0) - : "d0", "memory"); - break; - case 12: - __asm__ __volatile__ - ("1: movesl (%1)+,%%d0\n" - " movel %%d0,(%0)+\n" - "2: movesl (%1)+,%%d0\n" - " movel %%d0,(%0)+\n" - "3: movesl (%1)+,%%d0\n" - " movel %%d0,(%0)+\n" - "4:" - ".section .fixup,\"ax\"\n" - " .even\n" - "5: addql #4,%2\n" - " clrl (%0)+\n" - "6: addql #4,%2\n" - " clrl (%0)+\n" - "7: addql #4,%2\n" - " clrl (%0)+\n" - " jra 4b\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 4\n" - " .long 1b,5b\n" - " .long 2b,6b\n" - " .long 3b,7b\n" - ".previous" - : "=a"(to), "=a"(from), "=d"(n) - : "0"(to), "1"(from), "2"(0) - : "d0", "memory"); - break; - case 16: - __asm__ __volatile__ - ("1: movesl (%1)+,%%d0\n" - " movel %%d0,(%0)+\n" - "2: movesl (%1)+,%%d0\n" - " movel %%d0,(%0)+\n" - "3: movesl (%1)+,%%d0\n" - " movel %%d0,(%0)+\n" - "4: movesl (%1)+,%%d0\n" - " movel %%d0,(%0)+\n" - "5:" - ".section .fixup,\"ax\"\n" - " .even\n" - "6: addql #4,%2\n" - " clrl (%0)+\n" - "7: addql #4,%2\n" - " clrl (%0)+\n" - "8: addql #4,%2\n" - " clrl (%0)+\n" - "9: addql #4,%2\n" - " clrl (%0)+\n" - " jra 5b\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 4\n" - " .long 1b,6b\n" - " .long 2b,7b\n" - " .long 3b,8b\n" - " .long 4b,9b\n" - ".previous" - : "=a"(to), "=a"(from), "=d"(n) - : "0"(to), "1"(from), "2"(0) - : "d0", "memory"); - break; - default: - switch (n & 3) { - case 0: - __copy_from_user_big(to, from, n, "", ""); - break; + unsigned long res = 0, tmp; + + switch (n) { case 1: - __copy_from_user_big(to, from, n, - /* fixup */ - "1: addql #1,%2\n" - " clrb (%0)+", - /* copy */ - "2: movesb (%1)+,%%d0\n" - " moveb %%d0,(%0)+\n" - ".section __ex_table,\"a\"\n" - " .long 2b,1b\n" - ".previous"); - break; + __get_user_asm(res, *(u8 *)to, (u8 *)from, u8, b, d, 1); + break; case 2: - __copy_from_user_big(to, from, n, - /* fixup */ - "1: addql #2,%2\n" - " clrw (%0)+", - /* copy */ - "2: movesw (%1)+,%%d0\n" - " movew %%d0,(%0)+\n" - ".section __ex_table,\"a\"\n" - " .long 2b,1b\n" - ".previous"); - break; + __get_user_asm(res, *(u16 *)to, (u16 *)from, u16, w, d, 2); + break; case 3: - __copy_from_user_big(to, from, n, - /* fixup */ - "1: addql #2,%2\n" - " clrw (%0)+\n" - "2: addql #1,%2\n" - " clrb (%0)+", - /* copy */ - "3: movesw (%1)+,%%d0\n" - " movew %%d0,(%0)+\n" - "4: movesb (%1)+,%%d0\n" - " moveb %%d0,(%0)+\n" - ".section __ex_table,\"a\"\n" - " .long 3b,1b\n" - " .long 4b,2b\n" - ".previous"); - break; + __constant_copy_from_user_asm(res, to, from, tmp, 3, w, b,); + break; + case 4: + __get_user_asm(res, *(u32 *)to, (u32 *)from, u32, l, r, 4); + break; + case 5: + __constant_copy_from_user_asm(res, to, from, tmp, 5, l, b,); + break; + case 6: + __constant_copy_from_user_asm(res, to, from, tmp, 6, l, w,); + break; + case 7: + __constant_copy_from_user_asm(res, to, from, tmp, 7, l, w, b); + break; + case 8: + __constant_copy_from_user_asm(res, to, from, tmp, 8, l, l,); + break; + case 9: + __constant_copy_from_user_asm(res, to, from, tmp, 9, l, l, b); + break; + case 10: + __constant_copy_from_user_asm(res, to, from, tmp, 10, l, l, w); + break; + case 12: + __constant_copy_from_user_asm(res, to, from, tmp, 12, l, l, l); + break; + default: + /* we limit the inlined version to 3 moves */ + return __generic_copy_from_user(to, from, n); } - break; - } - return n; -} -#define __copy_to_user_big(to, from, n, fixup, copy) \ - __asm__ __volatile__ \ - ("10: movel (%1)+,%%d0\n" \ - "31: movesl %%d0,(%0)+\n" \ - "11: subql #1,%2\n" \ - " jne 10b\n" \ - "41:\n" \ - ".section .fixup,\"ax\"\n" \ - " .even\n" \ - "22: addql #1,%2\n" \ - "12: lsll #2,%2\n" \ - fixup "\n" \ - " jra 13f\n" \ - ".previous\n" \ - ".section __ex_table,\"a\"\n" \ - " .align 4\n" \ - " .long 10b,22b\n" \ - " .long 31b,12b\n" \ - " .long 11b,12b\n" \ - " .long 41b,22b\n" \ - ".previous\n" \ - copy "\n" \ - "13:" \ - : "=a"(to), "=a"(from), "=d"(n) \ - : "0"(to), "1"(from), "2"(n/4) \ - : "d0", "memory") + return res; +} -#define __copy_to_user_inatomic __copy_to_user -#define __copy_from_user_inatomic __copy_from_user +#define __constant_copy_to_user_asm(res, to, from, tmp, n, s1, s2, s3) \ + asm volatile ("\n" \ + " move."#s1" (%2)+,%3\n" \ + "11: moves."#s1" %3,(%1)+\n" \ + "12: move."#s2" (%2)+,%3\n" \ + "21: moves."#s2" %3,(%1)+\n" \ + "22:\n" \ + " .ifnc \""#s3"\",\"\"\n" \ + " move."#s3" (%2)+,%3\n" \ + "31: moves."#s3" %3,(%1)+\n" \ + "32:\n" \ + " .endif\n" \ + "4:\n" \ + "\n" \ + " .section __ex_table,\"a\"\n" \ + " .align 4\n" \ + " .long 11b,5f\n" \ + " .long 12b,5f\n" \ + " .long 21b,5f\n" \ + " .long 22b,5f\n" \ + " .ifnc \""#s3"\",\"\"\n" \ + " .long 31b,5f\n" \ + " .long 32b,5f\n" \ + " .endif\n" \ + " .previous\n" \ + "\n" \ + " .section .fixup,\"ax\"\n" \ + " .even\n" \ + "5: moveq.l #"#n",%0\n" \ + " jra 4b\n" \ + " .previous\n" \ + : "+d" (res), "+a" (to), "+a" (from), "=&d" (tmp) \ + : : "memory") -static inline unsigned long +static __always_inline unsigned long __constant_copy_to_user(void __user *to, const void *from, unsigned long n) { - switch (n) { - case 0: - break; - case 1: - __asm__ __volatile__ - (" moveb (%1)+,%%d0\n" - "21:movesb %%d0,(%0)+\n" - "1:\n" - ".section .fixup,\"ax\"\n" - " .even\n" - "2: addql #1,%2\n" - " jra 1b\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 4\n " - " .long 21b,2b\n" - " .long 1b,2b\n" - ".previous" - : "=a"(to), "=a"(from), "=d"(n) - : "0"(to), "1"(from), "2"(0) - : "d0", "memory"); - break; - case 2: - __asm__ __volatile__ - (" movew (%1)+,%%d0\n" - "21:movesw %%d0,(%0)+\n" - "1:\n" - ".section .fixup,\"ax\"\n" - " .even\n" - "2: addql #2,%2\n" - " jra 1b\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 4\n" - " .long 21b,2b\n" - " .long 1b,2b\n" - ".previous" - : "=a"(to), "=a"(from), "=d"(n) - : "0"(to), "1"(from), "2"(0) - : "d0", "memory"); - break; - case 3: - __asm__ __volatile__ - (" movew (%1)+,%%d0\n" - "21:movesw %%d0,(%0)+\n" - "1: moveb (%1)+,%%d0\n" - "22:movesb %%d0,(%0)+\n" - "2:\n" - ".section .fixup,\"ax\"\n" - " .even\n" - "3: addql #2,%2\n" - "4: addql #1,%2\n" - " jra 2b\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 4\n" - " .long 21b,3b\n" - " .long 1b,3b\n" - " .long 22b,4b\n" - " .long 2b,4b\n" - ".previous" - : "=a"(to), "=a"(from), "=d"(n) - : "0"(to), "1"(from), "2"(0) - : "d0", "memory"); - break; - case 4: - __asm__ __volatile__ - (" movel (%1)+,%%d0\n" - "21:movesl %%d0,(%0)+\n" - "1:\n" - ".section .fixup,\"ax\"\n" - " .even\n" - "2: addql #4,%2\n" - " jra 1b\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 4\n" - " .long 21b,2b\n" - " .long 1b,2b\n" - ".previous" - : "=a"(to), "=a"(from), "=d"(n) - : "0"(to), "1"(from), "2"(0) - : "d0", "memory"); - break; - case 8: - __asm__ __volatile__ - (" movel (%1)+,%%d0\n" - "21:movesl %%d0,(%0)+\n" - "1: movel (%1)+,%%d0\n" - "22:movesl %%d0,(%0)+\n" - "2:\n" - ".section .fixup,\"ax\"\n" - " .even\n" - "3: addql #4,%2\n" - "4: addql #4,%2\n" - " jra 2b\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 4\n" - " .long 21b,3b\n" - " .long 1b,3b\n" - " .long 22b,4b\n" - " .long 2b,4b\n" - ".previous" - : "=a"(to), "=a"(from), "=d"(n) - : "0"(to), "1"(from), "2"(0) - : "d0", "memory"); - break; - case 12: - __asm__ __volatile__ - (" movel (%1)+,%%d0\n" - "21:movesl %%d0,(%0)+\n" - "1: movel (%1)+,%%d0\n" - "22:movesl %%d0,(%0)+\n" - "2: movel (%1)+,%%d0\n" - "23:movesl %%d0,(%0)+\n" - "3:\n" - ".section .fixup,\"ax\"\n" - " .even\n" - "4: addql #4,%2\n" - "5: addql #4,%2\n" - "6: addql #4,%2\n" - " jra 3b\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 4\n" - " .long 21b,4b\n" - " .long 1b,4b\n" - " .long 22b,5b\n" - " .long 2b,5b\n" - " .long 23b,6b\n" - " .long 3b,6b\n" - ".previous" - : "=a"(to), "=a"(from), "=d"(n) - : "0"(to), "1"(from), "2"(0) - : "d0", "memory"); - break; - case 16: - __asm__ __volatile__ - (" movel (%1)+,%%d0\n" - "21:movesl %%d0,(%0)+\n" - "1: movel (%1)+,%%d0\n" - "22:movesl %%d0,(%0)+\n" - "2: movel (%1)+,%%d0\n" - "23:movesl %%d0,(%0)+\n" - "3: movel (%1)+,%%d0\n" - "24:movesl %%d0,(%0)+\n" - "4:" - ".section .fixup,\"ax\"\n" - " .even\n" - "5: addql #4,%2\n" - "6: addql #4,%2\n" - "7: addql #4,%2\n" - "8: addql #4,%2\n" - " jra 4b\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 4\n" - " .long 21b,5b\n" - " .long 1b,5b\n" - " .long 22b,6b\n" - " .long 2b,6b\n" - " .long 23b,7b\n" - " .long 3b,7b\n" - " .long 24b,8b\n" - " .long 4b,8b\n" - ".previous" - : "=a"(to), "=a"(from), "=d"(n) - : "0"(to), "1"(from), "2"(0) - : "d0", "memory"); - break; - default: - switch (n & 3) { - case 0: - __copy_to_user_big(to, from, n, "", ""); - break; + unsigned long res = 0, tmp; + + switch (n) { case 1: - __copy_to_user_big(to, from, n, - /* fixup */ - "1: addql #1,%2", - /* copy */ - " moveb (%1)+,%%d0\n" - "22:movesb %%d0,(%0)+\n" - "2:" - ".section __ex_table,\"a\"\n" - " .long 22b,1b\n" - " .long 2b,1b\n" - ".previous"); - break; + __put_user_asm(res, *(u8 *)from, (u8 *)to, b, d, 1); + break; case 2: - __copy_to_user_big(to, from, n, - /* fixup */ - "1: addql #2,%2", - /* copy */ - " movew (%1)+,%%d0\n" - "22:movesw %%d0,(%0)+\n" - "2:" - ".section __ex_table,\"a\"\n" - " .long 22b,1b\n" - " .long 2b,1b\n" - ".previous"); - break; + __put_user_asm(res, *(u16 *)from, (u16 *)to, w, d, 2); + break; case 3: - __copy_to_user_big(to, from, n, - /* fixup */ - "1: addql #2,%2\n" - "2: addql #1,%2", - /* copy */ - " movew (%1)+,%%d0\n" - "23:movesw %%d0,(%0)+\n" - "3: moveb (%1)+,%%d0\n" - "24:movesb %%d0,(%0)+\n" - "4:" - ".section __ex_table,\"a\"\n" - " .long 23b,1b\n" - " .long 3b,1b\n" - " .long 24b,2b\n" - " .long 4b,2b\n" - ".previous"); - break; + __constant_copy_to_user_asm(res, to, from, tmp, 3, w, b,); + break; + case 4: + __put_user_asm(res, *(u32 *)from, (u32 *)to, l, r, 4); + break; + case 5: + __constant_copy_to_user_asm(res, to, from, tmp, 5, l, b,); + break; + case 6: + __constant_copy_to_user_asm(res, to, from, tmp, 6, l, w,); + break; + case 7: + __constant_copy_to_user_asm(res, to, from, tmp, 7, l, w, b); + break; + case 8: + __constant_copy_to_user_asm(res, to, from, tmp, 8, l, l,); + break; + case 9: + __constant_copy_to_user_asm(res, to, from, tmp, 9, l, l, b); + break; + case 10: + __constant_copy_to_user_asm(res, to, from, tmp, 10, l, l, w); + break; + case 12: + __constant_copy_to_user_asm(res, to, from, tmp, 12, l, l, l); + break; + default: + /* limit the inlined version to 3 moves */ + return __generic_copy_to_user(to, from, n); } - break; - } - return n; + + return res; } -#define copy_from_user(to, from, n) \ +#define __copy_from_user(to, from, n) \ (__builtin_constant_p(n) ? \ __constant_copy_from_user(to, from, n) : \ __generic_copy_from_user(to, from, n)) -#define copy_to_user(to, from, n) \ +#define __copy_to_user(to, from, n) \ (__builtin_constant_p(n) ? \ __constant_copy_to_user(to, from, n) : \ __generic_copy_to_user(to, from, n)) -#define __copy_from_user(to, from, n) copy_from_user(to, from, n) -#define __copy_to_user(to, from, n) copy_to_user(to, from, n) - -/* - * Copy a null terminated string from userspace. - */ - -static inline long -strncpy_from_user(char *dst, const char __user *src, long count) -{ - long res; - if (count == 0) return count; - __asm__ __volatile__ - ("1: movesb (%2)+,%%d0\n" - "12:moveb %%d0,(%1)+\n" - " jeq 2f\n" - " subql #1,%3\n" - " jne 1b\n" - "2: subl %3,%0\n" - "3:\n" - ".section .fixup,\"ax\"\n" - " .even\n" - "4: movel %4,%0\n" - " jra 3b\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 4\n" - " .long 1b,4b\n" - " .long 12b,4b\n" - ".previous" - : "=d"(res), "=a"(dst), "=a"(src), "=d"(count) - : "i"(-EFAULT), "0"(count), "1"(dst), "2"(src), "3"(count) - : "d0", "memory"); - return res; -} +#define __copy_to_user_inatomic __copy_to_user +#define __copy_from_user_inatomic __copy_from_user -/* - * Return the size of a string (including the ending 0) - * - * Return 0 on exception, a value greater than N if too long - */ -static inline long strnlen_user(const char __user *src, long n) -{ - long res; +#define copy_from_user(to, from, n) __copy_from_user(to, from, n) +#define copy_to_user(to, from, n) __copy_to_user(to, from, n) - res = -(unsigned long)src; - __asm__ __volatile__ - ("1:\n" - " tstl %2\n" - " jeq 3f\n" - "2: movesb (%1)+,%%d0\n" - "22:\n" - " subql #1,%2\n" - " tstb %%d0\n" - " jne 1b\n" - " jra 4f\n" - "3:\n" - " addql #1,%0\n" - "4:\n" - " addl %1,%0\n" - "5:\n" - ".section .fixup,\"ax\"\n" - " .even\n" - "6: moveq %3,%0\n" - " jra 5b\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 4\n" - " .long 2b,6b\n" - " .long 22b,6b\n" - ".previous" - : "=d"(res), "=a"(src), "=d"(n) - : "i"(0), "0"(res), "1"(src), "2"(n) - : "d0"); - return res; -} +long strncpy_from_user(char *dst, const char __user *src, long count); +long strnlen_user(const char __user *src, long n); +unsigned long clear_user(void __user *to, unsigned long n); #define strlen_user(str) strnlen_user(str, 32767) -/* - * Zero Userspace - */ - -static inline unsigned long -clear_user(void __user *to, unsigned long n) -{ - __asm__ __volatile__ - (" tstl %1\n" - " jeq 3f\n" - "1: movesl %3,(%0)+\n" - "2: subql #1,%1\n" - " jne 1b\n" - "3: movel %2,%1\n" - " bclr #1,%1\n" - " jeq 4f\n" - "24:movesw %3,(%0)+\n" - "4: bclr #0,%1\n" - " jeq 5f\n" - "25:movesb %3,(%0)+\n" - "5:\n" - ".section .fixup,\"ax\"\n" - " .even\n" - "61:addql #1,%1\n" - "6: lsll #2,%1\n" - " addl %2,%1\n" - " jra 5b\n" - "7: addql #2,%1\n" - " jra 5b\n" - "8: addql #1,%1\n" - " jra 5b\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 4\n" - " .long 1b,61b\n" - " .long 2b,6b\n" - " .long 3b,61b\n" - " .long 24b,7b\n" - " .long 4b,7b\n" - " .long 25b,8b\n" - " .long 5b,8b\n" - ".previous" - : "=a"(to), "=d"(n) - : "r"(n & 3), "r"(0), "0"(to), "1"(n/4)); - return n; -} - #endif /* _M68K_UACCESS_H */ diff --git a/include/asm-m68k/unistd.h b/include/asm-m68k/unistd.h index c2554bcd1..7c0b6296b 100644 --- a/include/asm-m68k/unistd.h +++ b/include/asm-m68k/unistd.h @@ -285,6 +285,8 @@ #define __NR_request_key 280 #define __NR_keyctl 281 +#ifdef __KERNEL__ + #define NR_syscalls 282 /* user-visible error numbers are in the range -1 - -124: see @@ -383,7 +385,6 @@ __asm__ __volatile__ ("trap #0" \ __syscall_return(type,__res); \ } -#ifdef __KERNEL__ #define __ARCH_WANT_IPC_PARSE_VERSION #define __ARCH_WANT_OLD_READDIR #define __ARCH_WANT_OLD_STAT @@ -406,52 +407,12 @@ __syscall_return(type,__res); \ #define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPROCMASK #define __ARCH_WANT_SYS_RT_SIGACTION -#endif #ifdef __KERNEL_SYSCALLS__ -#include -#include -#include - -/* - * we need this inline - forking from kernel space will result - * in NO COPY ON WRITE (!!!), until an execve is executed. This - * is no problem, but for the stack. This is handled by not letting - * main() use the stack at all after fork(). Thus, no function - * calls - which means inline code for fork too, as otherwise we - * would use the stack upon exit from 'fork()'. - * - * Actually only pause and fork are needed inline, so that there - * won't be any messing with the stack from main(), but we define - * some others too. - */ -#define __NR__exit __NR_exit -static inline _syscall0(pid_t,setsid) -static inline _syscall3(int,write,int,fd,const char *,buf,off_t,count) -static inline _syscall3(int,read,int,fd,char *,buf,off_t,count) -static inline _syscall3(off_t,lseek,int,fd,off_t,offset,int,count) -static inline _syscall1(int,dup,int,fd) static inline _syscall3(int,execve,const char *,file,char **,argv,char **,envp) -static inline _syscall3(int,open,const char *,file,int,flag,int,mode) -static inline _syscall1(int,close,int,fd) -static inline _syscall1(int,_exit,int,exitcode) -static inline _syscall3(pid_t,waitpid,pid_t,pid,int *,wait_stat,int,options) - -asmlinkage long sys_mmap2( - unsigned long addr, unsigned long len, - unsigned long prot, unsigned long flags, - unsigned long fd, unsigned long pgoff); -asmlinkage int sys_execve(char *name, char **argv, char **envp); -asmlinkage int sys_pipe(unsigned long *fildes); -struct pt_regs; -struct sigaction; -asmlinkage long sys_rt_sigaction(int sig, - const struct sigaction __user *act, - struct sigaction __user *oact, - size_t sigsetsize); -#endif +#endif /* __KERNEL_SYSCALLS__ */ /* * "Conditional" syscalls @@ -461,4 +422,5 @@ asmlinkage long sys_rt_sigaction(int sig, */ #define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") +#endif /* __KERNEL__ */ #endif /* _ASM_M68K_UNISTD_H_ */ diff --git a/include/asm-m68k/virtconvert.h b/include/asm-m68k/virtconvert.h index 8c4e8037b..83a87c9b1 100644 --- a/include/asm-m68k/virtconvert.h +++ b/include/asm-m68k/virtconvert.h @@ -7,7 +7,6 @@ #ifdef __KERNEL__ -#include #include #include #include diff --git a/include/asm-m68knommu/bitops.h b/include/asm-m68knommu/bitops.h index 0b68ccd32..d7fa7d9c0 100644 --- a/include/asm-m68knommu/bitops.h +++ b/include/asm-m68knommu/bitops.h @@ -5,7 +5,6 @@ * Copyright 1992, Linus Torvalds. */ -#include #include #include /* swab32 */ #include /* save_flags */ diff --git a/include/asm-m68knommu/bootstd.h b/include/asm-m68knommu/bootstd.h index 3fdc79f06..bdc1a4ac4 100644 --- a/include/asm-m68knommu/bootstd.h +++ b/include/asm-m68knommu/bootstd.h @@ -52,7 +52,7 @@ type name(void) \ __asm__ __volatile__ ("trap #2" \ : "=g" (__res) \ : "0" (__res) \ - : "%d0"); \ + ); \ __bsc_return(type,__res); \ } @@ -64,7 +64,7 @@ type name(atype a) \ __asm__ __volatile__ ("trap #2" \ : "=g" (__res) \ : "0" (__res), "d" (__a) \ - : "%d0"); \ + ); \ __bsc_return(type,__res); \ } @@ -77,7 +77,7 @@ type name(atype a, btype b) \ __asm__ __volatile__ ("trap #2" \ : "=g" (__res) \ : "0" (__res), "d" (__a), "d" (__b) \ - : "%d0"); \ + ); \ __bsc_return(type,__res); \ } @@ -92,7 +92,7 @@ type name(atype a, btype b, ctype c) \ : "=g" (__res) \ : "0" (__res), "d" (__a), "d" (__b), \ "d" (__c) \ - : "%d0"); \ + ); \ __bsc_return(type,__res); \ } @@ -108,7 +108,7 @@ type name(atype a, btype b, ctype c, dtype d) \ : "=g" (__res) \ : "0" (__res), "d" (__a), "d" (__b), \ "d" (__c), "d" (__d) \ - : "%d0"); \ + ); \ __bsc_return(type,__res); \ } @@ -125,7 +125,7 @@ type name(atype a, btype b, ctype c, dtype d, etype e) \ : "=g" (__res) \ : "0" (__res), "d" (__a), "d" (__b), \ "d" (__c), "d" (__d), "d" (__e) \ - : "%d0"); \ + ); \ __bsc_return(type,__res); \ } diff --git a/include/asm-m68knommu/cacheflush.h b/include/asm-m68knommu/cacheflush.h index 49925e91e..c3aadf3b0 100644 --- a/include/asm-m68knommu/cacheflush.h +++ b/include/asm-m68knommu/cacheflush.h @@ -57,13 +57,13 @@ static inline void __flush_cache_all(void) "nop\n\t" : : : "d0" ); #endif /* CONFIG_M527x || CONFIG_M528x */ -#ifdef CONFIG_M5272 +#if defined(CONFIG_M5206) || defined(CONFIG_M5206e) || defined(CONFIG_M5272) __asm__ __volatile__ ( - "movel #0x01000000, %%d0\n\t" + "movel #0x81000100, %%d0\n\t" "movec %%d0, %%CACR\n\t" "nop\n\t" : : : "d0" ); -#endif /* CONFIG_M5272 */ +#endif /* CONFIG_M5206 || CONFIG_M5206e || CONFIG_M5272 */ #ifdef CONFIG_M5249 __asm__ __volatile__ ( "movel #0xa1000200, %%d0\n\t" @@ -71,6 +71,13 @@ static inline void __flush_cache_all(void) "nop\n\t" : : : "d0" ); #endif /* CONFIG_M5249 */ +#ifdef CONFIG_M532x + __asm__ __volatile__ ( + "movel #0x81000200, %%d0\n\t" + "movec %%d0, %%CACR\n\t" + "nop\n\t" + : : : "d0" ); +#endif /* CONFIG_M532x */ } #endif /* _M68KNOMMU_CACHEFLUSH_H */ diff --git a/include/asm-m68knommu/coldfire.h b/include/asm-m68knommu/coldfire.h index 6190f77b1..83a9fa4e6 100644 --- a/include/asm-m68knommu/coldfire.h +++ b/include/asm-m68knommu/coldfire.h @@ -3,7 +3,7 @@ /* * coldfire.h -- Motorola ColdFire CPU sepecific defines * - * (C) Copyright 1999-2002, Greg Ungerer (gerg@snapgear.com) + * (C) Copyright 1999-2006, Greg Ungerer (gerg@snapgear.com) * (C) Copyright 2000, Lineo (www.lineo.com) */ @@ -12,7 +12,19 @@ #define coldfire_h /****************************************************************************/ -#include + +/* + * Define master clock frequency. This is essentially done at config + * time now. No point enumerating dozens of possible clock options + * here. Also the peripheral clock (bus clock) divide ratio is set + * at config time too. + */ +#ifdef CONFIG_CLOCK_SET +#define MCF_CLK CONFIG_CLOCK_FREQ +#define MCF_BUSCLK (CONFIG_CLOCK_FREQ / CONFIG_CLOCK_DIV) +#else +#error "Don't know what your ColdFire CPU clock frequency is??" +#endif /* * Define the processor support peripherals base address. @@ -30,64 +42,9 @@ defined(CONFIG_M520x) #undef MCF_MBAR #define MCF_MBAR MCF_IPSBAR -#endif - -/* - * Define master clock frequency. - */ -#if defined(CONFIG_CLOCK_11MHz) -#define MCF_CLK 11289600 -#elif defined(CONFIG_CLOCK_16MHz) -#define MCF_CLK 16000000 -#elif defined(CONFIG_CLOCK_20MHz) -#define MCF_CLK 20000000 -#elif defined(CONFIG_CLOCK_24MHz) -#define MCF_CLK 24000000 -#elif defined(CONFIG_CLOCK_25MHz) -#define MCF_CLK 25000000 -#elif defined(CONFIG_CLOCK_33MHz) -#define MCF_CLK 33000000 -#elif defined(CONFIG_CLOCK_40MHz) -#define MCF_CLK 40000000 -#elif defined(CONFIG_CLOCK_45MHz) -#define MCF_CLK 45000000 -#elif defined(CONFIG_CLOCK_48MHz) -#define MCF_CLK 48000000 -#elif defined(CONFIG_CLOCK_50MHz) -#define MCF_CLK 50000000 -#elif defined(CONFIG_CLOCK_54MHz) -#define MCF_CLK 54000000 -#elif defined(CONFIG_CLOCK_60MHz) -#define MCF_CLK 60000000 -#elif defined(CONFIG_CLOCK_62_5MHz) -#define MCF_CLK 62500000 -#elif defined(CONFIG_CLOCK_64MHz) -#define MCF_CLK 64000000 -#elif defined(CONFIG_CLOCK_66MHz) -#define MCF_CLK 66000000 -#elif defined(CONFIG_CLOCK_70MHz) -#define MCF_CLK 70000000 -#elif defined(CONFIG_CLOCK_100MHz) -#define MCF_CLK 100000000 -#elif defined(CONFIG_CLOCK_140MHz) -#define MCF_CLK 140000000 -#elif defined(CONFIG_CLOCK_150MHz) -#define MCF_CLK 150000000 -#elif defined(CONFIG_CLOCK_166MHz) -#define MCF_CLK 166000000 -#else -#error "Don't know what your ColdFire CPU clock frequency is??" -#endif - -/* - * One some ColdFire family members the bus clock (used by internal - * peripherals) is not the same as the CPU clock. - */ -#if defined(CONFIG_M523x) || defined(CONFIG_M5249) || defined(CONFIG_M527x) || \ - defined(CONFIG_M520x) -#define MCF_BUSCLK (MCF_CLK / 2) -#else -#define MCF_BUSCLK MCF_CLK +#elif defined(CONFIG_M532x) +#undef MCF_MBAR +#define MCF_MBAR 0x00000000 #endif /****************************************************************************/ diff --git a/include/asm-m68knommu/commproc.h b/include/asm-m68knommu/commproc.h index e522ca819..0161ebb5d 100644 --- a/include/asm-m68knommu/commproc.h +++ b/include/asm-m68knommu/commproc.h @@ -17,7 +17,6 @@ #ifndef __CPM_360__ #define __CPM_360__ -#include /* CPM Command register masks: */ #define CPM_CR_RST ((ushort)0x8000) diff --git a/include/asm-m68knommu/dma-mapping.h b/include/asm-m68knommu/dma-mapping.h index a6c42ba48..5622b855a 100644 --- a/include/asm-m68knommu/dma-mapping.h +++ b/include/asm-m68knommu/dma-mapping.h @@ -1,7 +1,6 @@ #ifndef _M68KNOMMU_DMA_MAPPING_H #define _M68KNOMMU_DMA_MAPPING_H -#include #ifdef CONFIG_PCI #include diff --git a/include/asm-m68knommu/dma.h b/include/asm-m68knommu/dma.h index 43e98c96a..3338001ab 100644 --- a/include/asm-m68knommu/dma.h +++ b/include/asm-m68knommu/dma.h @@ -3,7 +3,6 @@ //#define DMA_DEBUG 1 -#include #ifdef CONFIG_COLDFIRE /* diff --git a/include/asm-m68knommu/elf.h b/include/asm-m68knommu/elf.h index 991948770..40b1ed682 100644 --- a/include/asm-m68knommu/elf.h +++ b/include/asm-m68knommu/elf.h @@ -5,7 +5,6 @@ * ELF register definitions.. */ -#include #include #include diff --git a/include/asm-m68knommu/elia.h b/include/asm-m68knommu/elia.h index f18b8e9d8..e037d4e2d 100644 --- a/include/asm-m68knommu/elia.h +++ b/include/asm-m68knommu/elia.h @@ -12,7 +12,6 @@ #define elia_h /****************************************************************************/ -#include #include #ifdef CONFIG_eLIA diff --git a/include/asm-m68knommu/entry.h b/include/asm-m68knommu/entry.h index 06f5aa70b..c2553d262 100644 --- a/include/asm-m68knommu/entry.h +++ b/include/asm-m68knommu/entry.h @@ -1,7 +1,6 @@ #ifndef __M68KNOMMU_ENTRY_H #define __M68KNOMMU_ENTRY_H -#include #include #include diff --git a/include/asm-m68knommu/fpu.h b/include/asm-m68knommu/fpu.h index 225082991..b16b2e4fc 100644 --- a/include/asm-m68knommu/fpu.h +++ b/include/asm-m68knommu/fpu.h @@ -1,7 +1,6 @@ #ifndef __M68KNOMMU_FPU_H #define __M68KNOMMU_FPU_H -#include /* * MAX floating point unit state size (FSAVE/FRESTORE) diff --git a/include/asm-m68knommu/hardirq.h b/include/asm-m68knommu/hardirq.h index 476180f4c..980075bab 100644 --- a/include/asm-m68knommu/hardirq.h +++ b/include/asm-m68knommu/hardirq.h @@ -1,7 +1,6 @@ #ifndef __M68K_HARDIRQ_H #define __M68K_HARDIRQ_H -#include #include #include #include diff --git a/include/asm-m68knommu/io.h b/include/asm-m68knommu/io.h index e08f2ee4b..8df4cee2a 100644 --- a/include/asm-m68knommu/io.h +++ b/include/asm-m68knommu/io.h @@ -3,7 +3,6 @@ #ifdef __KERNEL__ -#include /* * These are for ISA/PCI shared memory _only_ and should never be used diff --git a/include/asm-m68knommu/irq.h b/include/asm-m68knommu/irq.h index 20c48ec85..45e7a2fd1 100644 --- a/include/asm-m68knommu/irq.h +++ b/include/asm-m68knommu/irq.h @@ -1,7 +1,6 @@ #ifndef _M68K_IRQ_H_ #define _M68K_IRQ_H_ -#include #include #ifdef CONFIG_COLDFIRE @@ -63,8 +62,8 @@ extern void (*mach_disable_irq)(unsigned int); /* * various flags for request_irq() - the Amiga now uses the standard - * mechanism like all other architectures - SA_INTERRUPT and SA_SHIRQ - * are your friends. + * mechanism like all other architectures - IRQF_DISABLED and + * IRQF_SHARED are your friends. */ #define IRQ_FLG_LOCK (0x0001) /* handler is not replaceable */ #define IRQ_FLG_REPLACE (0x0002) /* replace existing handler */ @@ -84,12 +83,8 @@ extern void (*mach_disable_irq)(unsigned int); /* * Some drivers want these entry points */ -#define enable_irq(x) 0 +#define enable_irq(x) do { } while (0) #define disable_irq(x) do { } while (0) #define disable_irq_nosync(x) disable_irq(x) -struct irqaction; -struct pt_regs; -int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *); - #endif /* _M68K_IRQ_H_ */ diff --git a/include/asm-m68knommu/m5206sim.h b/include/asm-m68knommu/m5206sim.h index d1e750902..7e3594dea 100644 --- a/include/asm-m68knommu/m5206sim.h +++ b/include/asm-m68knommu/m5206sim.h @@ -12,7 +12,6 @@ #define m5206sim_h /****************************************************************************/ -#include /* * Define the 5206 SIM register set addresses. diff --git a/include/asm-m68knommu/m520xsim.h b/include/asm-m68knommu/m520xsim.h index 6dc62869e..1dac22ea9 100644 --- a/include/asm-m68knommu/m520xsim.h +++ b/include/asm-m68knommu/m520xsim.h @@ -11,7 +11,6 @@ #define m520xsim_h /****************************************************************************/ -#include /* * Define the 5282 SIM register set addresses. diff --git a/include/asm-m68knommu/m523xsim.h b/include/asm-m68knommu/m523xsim.h index 926cfb805..bf397313e 100644 --- a/include/asm-m68knommu/m523xsim.h +++ b/include/asm-m68knommu/m523xsim.h @@ -11,7 +11,6 @@ #define m523xsim_h /****************************************************************************/ -#include /* * Define the 523x SIM register set addresses. diff --git a/include/asm-m68knommu/m5249sim.h b/include/asm-m68knommu/m5249sim.h index 9344f529b..399814f0b 100644 --- a/include/asm-m68knommu/m5249sim.h +++ b/include/asm-m68knommu/m5249sim.h @@ -157,7 +157,7 @@ movel %d0,0x180(%a1) /* set PLL register */ nop -#ifdef CONFIG_CLOCK_140MHz +#if CONFIG_CLOCK_FREQ == 140000000 /* * Set initial clock frequency. This assumes M5249C3 board * is fitted with 11.2896MHz crystal. It will program the diff --git a/include/asm-m68knommu/m5272sim.h b/include/asm-m68knommu/m5272sim.h index b40875362..6217edc21 100644 --- a/include/asm-m68knommu/m5272sim.h +++ b/include/asm-m68knommu/m5272sim.h @@ -12,7 +12,6 @@ #define m5272sim_h /****************************************************************************/ -#include /* * Define the 5272 SIM register set addresses. diff --git a/include/asm-m68knommu/m527xsim.h b/include/asm-m68knommu/m527xsim.h index e7878d0f7..1f63ab3fb 100644 --- a/include/asm-m68knommu/m527xsim.h +++ b/include/asm-m68knommu/m527xsim.h @@ -11,7 +11,6 @@ #define m527xsim_h /****************************************************************************/ -#include /* * Define the 5270/5271 SIM register set addresses. diff --git a/include/asm-m68knommu/m528xsim.h b/include/asm-m68knommu/m528xsim.h index 610774a17..1a3b1ae06 100644 --- a/include/asm-m68knommu/m528xsim.h +++ b/include/asm-m68knommu/m528xsim.h @@ -11,7 +11,6 @@ #define m528xsim_h /****************************************************************************/ -#include /* * Define the 5280/5282 SIM register set addresses. diff --git a/include/asm-m68knommu/mcfcache.h b/include/asm-m68knommu/mcfcache.h index bdd8c53ef..7b61a8a52 100644 --- a/include/asm-m68knommu/mcfcache.h +++ b/include/asm-m68knommu/mcfcache.h @@ -11,7 +11,6 @@ #define __M68KNOMMU_MCFCACHE_H /****************************************************************************/ -#include /* * The different ColdFire families have different cache arrangments. @@ -33,7 +32,7 @@ .endm #endif /* CONFIG_M5206 || CONFIG_M5206e || CONFIG_M5272 */ -#if defined(CONFIG_M527x) +#if defined(CONFIG_M523x) || defined(CONFIG_M527x) /* * New version 2 cores have a configurable split cache arrangement. * For now I am just enabling instruction cache - but ultimately I @@ -51,23 +50,20 @@ movec %d0,%CACR /* enable cache */ nop .endm -#endif /* CONFIG_M527x */ +#endif /* CONFIG_M523x || CONFIG_M527x */ #if defined(CONFIG_M528x) -/* - * Cache is totally broken on early 5282 silicon. So far now we - * disable its cache all together. - */ .macro CACHE_ENABLE - movel #0x01000000,%d0 - movec %d0,%CACR /* invalidate cache */ nop - movel #0x0000c000,%d0 /* set SDRAM cached only */ - movec %d0,%ACR0 - movel #0x00000000,%d0 /* no other regions cached */ - movec %d0,%ACR1 - movel #0x00000000,%d0 /* configure cache */ - movec %d0,%CACR /* enable cache */ + movel #0x01000000, %d0 + movec %d0, %CACR /* Invalidate cache */ + nop + movel #0x0000c020, %d0 /* Set SDRAM cached only */ + movec %d0, %ACR0 + movel #0xff00c000, %d0 /* Cache Flash also */ + movec %d0, %ACR1 + movel #0x80000200, %d0 /* Setup cache mask */ + movec %d0, %CACR /* Enable cache */ nop .endm #endif /* CONFIG_M528x */ @@ -96,6 +92,21 @@ .endm #endif /* CONFIG_M5249 || CONFIG_M5307 */ +#if defined(CONFIG_M532x) +.macro CACHE_ENABLE + movel #0x01000000,%d0 /* invalidate cache cmd */ + movec %d0,%CACR /* do invalidate cache */ + nop + movel #0x4001C000,%d0 /* set SDRAM cached (write-thru) */ + movec %d0,%ACR0 + movel #0x00000000,%d0 /* no other regions cached */ + movec %d0,%ACR1 + movel #0x80000200,%d0 /* setup cache mask */ + movec %d0,%CACR /* enable cache */ + nop +.endm +#endif /* CONFIG_M532x */ + #if defined(CONFIG_M5407) /* * Version 4 cores have a true harvard style separate instruction @@ -120,6 +131,20 @@ .endm #endif /* CONFIG_M5407 */ +#if defined(CONFIG_M520x) +.macro CACHE_ENABLE + move.l #0x01000000,%d0 /* invalidate whole cache */ + movec %d0,%CACR + nop + move.l #0x0000c000,%d0 /* set SDRAM cached (write-thru) */ + movec %d0,%ACR0 + move.l #0x00000000,%d0 /* no other regions cached */ + movec %d0,%ACR1 + move.l #0x80400000,%d0 /* enable 8K instruction cache */ + movec %d0,%CACR + nop +.endm +#endif /* CONFIG_M520x */ /****************************************************************************/ #endif /* __M68KNOMMU_MCFCACHE_H */ diff --git a/include/asm-m68knommu/mcfdma.h b/include/asm-m68knommu/mcfdma.h index b93f8ba8a..ea729e81a 100644 --- a/include/asm-m68knommu/mcfdma.h +++ b/include/asm-m68knommu/mcfdma.h @@ -11,7 +11,6 @@ #define mcfdma_h /****************************************************************************/ -#include /* * Get address specific defines for this Coldfire member. diff --git a/include/asm-m68knommu/mcfmbus.h b/include/asm-m68knommu/mcfmbus.h index 4762589e8..13df9d41b 100644 --- a/include/asm-m68knommu/mcfmbus.h +++ b/include/asm-m68knommu/mcfmbus.h @@ -11,7 +11,6 @@ #ifndef mcfmbus_h #define mcfmbus_h -#include #define MCFMBUS_BASE 0x280 diff --git a/include/asm-m68knommu/mcfne.h b/include/asm-m68knommu/mcfne.h index a71b1c8cb..c920ccdb6 100644 --- a/include/asm-m68knommu/mcfne.h +++ b/include/asm-m68knommu/mcfne.h @@ -18,7 +18,6 @@ #define mcfne_h /****************************************************************************/ -#include /* * Support for NE2000 clones devices in ColdFire based boards. diff --git a/include/asm-m68knommu/mcfpci.h b/include/asm-m68knommu/mcfpci.h index d6229047d..f1507dd06 100644 --- a/include/asm-m68knommu/mcfpci.h +++ b/include/asm-m68knommu/mcfpci.h @@ -12,7 +12,6 @@ #define mcfpci_h /****************************************************************************/ -#include #ifdef CONFIG_PCI diff --git a/include/asm-m68knommu/mcfpit.h b/include/asm-m68knommu/mcfpit.h index a685f1b45..f570cf64f 100644 --- a/include/asm-m68knommu/mcfpit.h +++ b/include/asm-m68knommu/mcfpit.h @@ -11,7 +11,6 @@ #define mcfpit_h /****************************************************************************/ -#include /* * Get address specific defines for the 5270/5271, 5280/5282, and 5208. @@ -29,11 +28,9 @@ /* * Define the PIT timer register set addresses. */ -struct mcfpit { - unsigned short pcsr; /* PIT control and status */ - unsigned short pmr; /* PIT modulus register */ - unsigned short pcntr; /* PIT count register */ -} __attribute__((packed)); +#define MCFPIT_PCSR 0x0 /* PIT control register */ +#define MCFPIT_PMR 0x2 /* PIT modulus register */ +#define MCFPIT_PCNTR 0x4 /* PIT count register */ /* * Bit definitions for the PIT Control and Status register. diff --git a/include/asm-m68knommu/mcfsim.h b/include/asm-m68knommu/mcfsim.h index 81d74a31d..1074ae717 100644 --- a/include/asm-m68knommu/mcfsim.h +++ b/include/asm-m68knommu/mcfsim.h @@ -12,7 +12,6 @@ #define mcfsim_h /****************************************************************************/ -#include /* * Include 5204, 5206/e, 5235, 5249, 5270/5271, 5272, 5280/5282, @@ -36,6 +35,8 @@ #include #elif defined(CONFIG_M5307) #include +#elif defined(CONFIG_M532x) +#include #elif defined(CONFIG_M5407) #include #endif @@ -101,6 +102,7 @@ #define MCFSIM_IMR_MASKALL 0x3ffe /* All intr sources */ #endif + /* * PIT interrupt settings, if not found in mXXXXsim.h file. */ diff --git a/include/asm-m68knommu/mcfsmc.h b/include/asm-m68knommu/mcfsmc.h index 2583900b9..2d7a4dbd9 100644 --- a/include/asm-m68knommu/mcfsmc.h +++ b/include/asm-m68knommu/mcfsmc.h @@ -17,7 +17,6 @@ * allow 8 bit accesses. So this code is 16bit access only. */ -#include #undef outb #undef inb diff --git a/include/asm-m68knommu/mcftimer.h b/include/asm-m68knommu/mcftimer.h index 0f47164c3..6f4d796e0 100644 --- a/include/asm-m68knommu/mcftimer.h +++ b/include/asm-m68knommu/mcftimer.h @@ -3,7 +3,7 @@ /* * mcftimer.h -- ColdFire internal TIMER support defines. * - * (C) Copyright 1999-2002, Greg Ungerer (gerg@snapgear.com) + * (C) Copyright 1999-2006, Greg Ungerer * (C) Copyright 2000, Lineo Inc. (www.lineo.com) */ @@ -12,7 +12,6 @@ #define mcftimer_h /****************************************************************************/ -#include /* * Get address specific defines for this ColdFire member. @@ -28,6 +27,11 @@ #elif defined(CONFIG_M5249) || defined(CONFIG_M5307) || defined(CONFIG_M5407) #define MCFTIMER_BASE1 0x140 /* Base address of TIMER1 */ #define MCFTIMER_BASE2 0x180 /* Base address of TIMER2 */ +#elif defined(CONFIG_M532x) +#define MCFTIMER_BASE1 0xfc070000 /* Base address of TIMER1 */ +#define MCFTIMER_BASE2 0xfc074000 /* Base address of TIMER2 */ +#define MCFTIMER_BASE3 0xfc078000 /* Base address of TIMER3 */ +#define MCFTIMER_BASE4 0xfc07c000 /* Base address of TIMER4 */ #endif @@ -35,23 +39,14 @@ * Define the TIMER register set addresses. */ #define MCFTIMER_TMR 0x00 /* Timer Mode reg (r/w) */ -#define MCFTIMER_TRR 0x02 /* Timer Reference (r/w) */ -#define MCFTIMER_TCR 0x04 /* Timer Capture reg (r/w) */ -#define MCFTIMER_TCN 0x06 /* Timer Counter reg (r/w) */ +#define MCFTIMER_TRR 0x04 /* Timer Reference (r/w) */ +#define MCFTIMER_TCR 0x08 /* Timer Capture reg (r/w) */ +#define MCFTIMER_TCN 0x0C /* Timer Counter reg (r/w) */ +#if defined(CONFIG_M532x) +#define MCFTIMER_TER 0x03 /* Timer Event reg (r/w) */ +#else #define MCFTIMER_TER 0x11 /* Timer Event reg (r/w) */ - -struct mcftimer { - unsigned short tmr; /* Timer Mode reg (r/w) */ - unsigned short reserved1; - unsigned short trr; /* Timer Reference (r/w) */ - unsigned short reserved2; - unsigned short tcr; /* Timer Capture reg (r/w) */ - unsigned short reserved3; - unsigned short tcn; /* Timer Counter reg (r/w) */ - unsigned short reserved4; - unsigned char reserved5; - unsigned char ter; /* Timer Event reg (r/w) */ -} __attribute__((packed)); +#endif /* * Bit definitions for the Timer Mode Register (TMR). diff --git a/include/asm-m68knommu/mcfuart.h b/include/asm-m68knommu/mcfuart.h index b016fad83..dc0146c52 100644 --- a/include/asm-m68knommu/mcfuart.h +++ b/include/asm-m68knommu/mcfuart.h @@ -12,7 +12,6 @@ #define mcfuart_h /****************************************************************************/ -#include /* * Define the base address of the UARTS within the MBAR address @@ -45,6 +44,10 @@ #define MCFUART_BASE1 0x60000 /* Base address of UART1 */ #define MCFUART_BASE2 0x64000 /* Base address of UART2 */ #define MCFUART_BASE3 0x68000 /* Base address of UART2 */ +#elif defined(CONFIG_M532x) +#define MCFUART_BASE1 0xfc060000 /* Base address of UART1 */ +#define MCFUART_BASE2 0xfc064000 /* Base address of UART2 */ +#define MCFUART_BASE3 0xfc068000 /* Base address of UART3 */ #endif diff --git a/include/asm-m68knommu/mcfwdebug.h b/include/asm-m68knommu/mcfwdebug.h index 6ceae1035..27f70e45d 100644 --- a/include/asm-m68knommu/mcfwdebug.h +++ b/include/asm-m68knommu/mcfwdebug.h @@ -10,7 +10,6 @@ #ifndef mcfdebug_h #define mcfdebug_h /****************************************************************************/ -#include /* Define the debug module registers */ #define MCFDEBUG_CSR 0x0 /* Configuration status */ diff --git a/include/asm-m68knommu/mmu_context.h b/include/asm-m68knommu/mmu_context.h index 1e080eca9..6c077d3a2 100644 --- a/include/asm-m68knommu/mmu_context.h +++ b/include/asm-m68knommu/mmu_context.h @@ -1,7 +1,6 @@ #ifndef __M68KNOMMU_MMU_CONTEXT_H #define __M68KNOMMU_MMU_CONTEXT_H -#include #include #include #include diff --git a/include/asm-m68knommu/nettel.h b/include/asm-m68knommu/nettel.h index 9bda307e6..0299f6a2d 100644 --- a/include/asm-m68knommu/nettel.h +++ b/include/asm-m68knommu/nettel.h @@ -13,7 +13,6 @@ #define nettel_h /****************************************************************************/ -#include /****************************************************************************/ #ifdef CONFIG_NETtel diff --git a/include/asm-m68knommu/page.h b/include/asm-m68knommu/page.h index 4b74349ff..385a34701 100644 --- a/include/asm-m68knommu/page.h +++ b/include/asm-m68knommu/page.h @@ -1,7 +1,7 @@ #ifndef _M68KNOMMU_PAGE_H #define _M68KNOMMU_PAGE_H -#include +#ifdef __KERNEL__ /* PAGE_SHIFT determines the page size */ @@ -9,8 +9,6 @@ #define PAGE_SIZE (1UL << PAGE_SHIFT) #define PAGE_MASK (~(PAGE_SIZE-1)) -#ifdef __KERNEL__ - #include #ifndef __ASSEMBLY__ @@ -77,10 +75,10 @@ extern unsigned long memory_end; #endif /* __ASSEMBLY__ */ +#include + #define devmem_is_allowed(x) 1 #endif /* __KERNEL__ */ -#include - #endif /* _M68KNOMMU_PAGE_H */ diff --git a/include/asm-m68knommu/page_offset.h b/include/asm-m68knommu/page_offset.h index 2b45645e9..d4e73e0ba 100644 --- a/include/asm-m68knommu/page_offset.h +++ b/include/asm-m68knommu/page_offset.h @@ -1,47 +1,5 @@ -#include /* This handles the memory map.. */ - -#ifdef CONFIG_COLDFIRE -#if defined(CONFIG_SMALL) -#define PAGE_OFFSET_RAW 0x30020000 -#elif defined(CONFIG_CFV240) -#define PAGE_OFFSET_RAW 0x02000000 -#else -#define PAGE_OFFSET_RAW 0x00000000 -#endif -#endif - -#ifdef CONFIG_M68360 -#define PAGE_OFFSET_RAW 0x00000000 -#endif - -#ifdef CONFIG_PILOT -#ifdef CONFIG_M68328 -#define PAGE_OFFSET_RAW 0x10000000 -#endif -#ifdef CONFIG_M68EZ328 -#define PAGE_OFFSET_RAW 0x00000000 -#endif -#endif -#ifdef CONFIG_UCSIMM -#define PAGE_OFFSET_RAW 0x00000000 -#endif - -#if defined(CONFIG_UCDIMM) || defined(CONFIG_DRAGEN2) -#ifdef CONFIG_M68VZ328 -#define PAGE_OFFSET_RAW 0x00000000 -#endif /* CONFIG_M68VZ328 */ -#endif /* CONFIG_UCDIMM */ - -#ifdef CONFIG_M68EZ328ADS -#define PAGE_OFFSET_RAW 0x00000000 -#endif -#ifdef CONFIG_ALMA_ANS -#define PAGE_OFFSET_RAW 0x00000000 -#endif -#ifdef CONFIG_M68EN302 -#define PAGE_OFFSET_RAW 0x00000000 -#endif +#define PAGE_OFFSET_RAW CONFIG_RAMBASE diff --git a/include/asm-m68knommu/param.h b/include/asm-m68knommu/param.h index 3f57d5db8..4c9904d65 100644 --- a/include/asm-m68knommu/param.h +++ b/include/asm-m68knommu/param.h @@ -1,7 +1,6 @@ #ifndef _M68KNOMMU_PARAM_H #define _M68KNOMMU_PARAM_H -#include #if defined(CONFIG_CLEOPATRA) #define HZ 1000 diff --git a/include/asm-m68knommu/pgtable.h b/include/asm-m68knommu/pgtable.h index 00893055e..549ad231e 100644 --- a/include/asm-m68knommu/pgtable.h +++ b/include/asm-m68knommu/pgtable.h @@ -7,7 +7,6 @@ * (C) Copyright 2000-2002, Greg Ungerer */ -#include #include #include #include diff --git a/include/asm-m68knommu/processor.h b/include/asm-m68knommu/processor.h index ba393b1a0..9d3a1bf41 100644 --- a/include/asm-m68knommu/processor.h +++ b/include/asm-m68knommu/processor.h @@ -13,7 +13,7 @@ */ #define current_text_addr() ({ __label__ _l; _l: &&_l;}) -#include +#include #include #include #include @@ -78,20 +78,32 @@ struct thread_struct { {0, 0}, 0, {0,}, {0, 0, 0}, {0,}, \ } +/* + * Coldfire stacks need to be re-aligned on trap exit, conventional + * 68k can handle this case cleanly. + */ +#if defined(CONFIG_COLDFIRE) +#define reformat(_regs) do { (_regs)->format = 0x4; } while(0) +#else +#define reformat(_regs) do { } while (0) +#endif + /* * Do necessary setup to start up a newly executed thread. * * pass the data segment into user programs if it exists, * it can't hurt anything as far as I can tell */ -#define start_thread(_regs, _pc, _usp) \ -do { \ - set_fs(USER_DS); /* reads from user space */ \ - (_regs)->pc = (_pc); \ - if (current->mm) \ - (_regs)->d5 = current->mm->start_data; \ - (_regs)->sr &= ~0x2000; \ - wrusp(_usp); \ +#define start_thread(_regs, _pc, _usp) \ +do { \ + set_fs(USER_DS); /* reads from user space */ \ + (_regs)->pc = (_pc); \ + ((struct switch_stack *)(_regs))[-1].a6 = 0; \ + reformat(_regs); \ + if (current->mm) \ + (_regs)->d5 = current->mm->start_data; \ + (_regs)->sr &= ~0x2000; \ + wrusp(_usp); \ } while(0) /* Forward declaration, a strange C thing */ @@ -126,6 +138,6 @@ unsigned long get_wchan(struct task_struct *p); eip; }) #define KSTK_ESP(tsk) ((tsk) == current ? rdusp() : (tsk)->thread.usp) -#define cpu_relax() do { } while (0) +#define cpu_relax() barrier() #endif diff --git a/include/asm-m68knommu/ptrace.h b/include/asm-m68knommu/ptrace.h index f65bd9074..47258e86e 100644 --- a/include/asm-m68knommu/ptrace.h +++ b/include/asm-m68knommu/ptrace.h @@ -46,11 +46,9 @@ struct pt_regs { #else unsigned short sr; unsigned long pc; -#ifndef NO_FORMAT_VEC unsigned format : 4; /* frame format specifier */ unsigned vector : 12; /* vector offset */ #endif -#endif }; /* @@ -70,7 +68,7 @@ struct switch_stack { /* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */ #define PTRACE_GETREGS 12 #define PTRACE_SETREGS 13 -#ifdef COFNIG_FPU +#ifdef CONFIG_FPU #define PTRACE_GETFPREGS 14 #define PTRACE_SETFPREGS 15 #endif diff --git a/include/asm-m68knommu/semaphore-helper.h b/include/asm-m68knommu/semaphore-helper.h index a6586417c..43da7bc48 100644 --- a/include/asm-m68knommu/semaphore-helper.h +++ b/include/asm-m68knommu/semaphore-helper.h @@ -9,7 +9,6 @@ * m68k version by Andreas Schwab */ -#include /* * These two _must_ execute atomically wrt each other. diff --git a/include/asm-m68knommu/signal.h b/include/asm-m68knommu/signal.h index 1d13187f6..216c08be5 100644 --- a/include/asm-m68knommu/signal.h +++ b/include/asm-m68knommu/signal.h @@ -74,7 +74,6 @@ typedef unsigned long sigset_t; * SA_FLAGS values: * * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. * SA_RESETHAND clears the handler when the signal is delivered. @@ -94,7 +93,6 @@ typedef unsigned long sigset_t; #define SA_NOMASK SA_NODEFER #define SA_ONESHOT SA_RESETHAND -#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ /* * sigaltstack controls diff --git a/include/asm-m68knommu/system.h b/include/asm-m68knommu/system.h index 6338afc85..2a8144986 100644 --- a/include/asm-m68knommu/system.h +++ b/include/asm-m68knommu/system.h @@ -1,7 +1,6 @@ #ifndef _M68KNOMMU_SYSTEM_H #define _M68KNOMMU_SYSTEM_H -#include /* get configuration macros */ #include #include #include @@ -107,7 +106,6 @@ asmlinkage void resume(void); #define wmb() asm volatile ("" : : :"memory") #define set_rmb(var, value) do { xchg(&var, value); } while (0) #define set_mb(var, value) set_rmb(var, value) -#define set_wmb(var, value) do { var = value; wmb(); } while (0) #ifdef CONFIG_SMP #define smp_mb() mb() diff --git a/include/asm-m68knommu/uaccess.h b/include/asm-m68knommu/uaccess.h index 05be9515a..62b29b10b 100644 --- a/include/asm-m68knommu/uaccess.h +++ b/include/asm-m68knommu/uaccess.h @@ -93,7 +93,7 @@ extern int __put_user_bad(void); #define get_user(x, ptr) \ ({ \ int __gu_err = 0; \ - typeof(*(ptr)) __gu_val = 0; \ + typeof(x) __gu_val = 0; \ switch (sizeof(*(ptr))) { \ case 1: \ __get_user_asm(__gu_err, __gu_val, ptr, b, "=d"); \ @@ -105,23 +105,23 @@ extern int __put_user_bad(void); __get_user_asm(__gu_err, __gu_val, ptr, l, "=r"); \ break; \ case 8: \ - memcpy(&__gu_val, ptr, sizeof (*(ptr))); \ + memcpy((void *) &__gu_val, ptr, sizeof (*(ptr))); \ break; \ default: \ __gu_val = 0; \ __gu_err = __get_user_bad(); \ break; \ } \ - (x) = __gu_val; \ + (x) = (typeof(*(ptr))) __gu_val; \ __gu_err; \ }) #define __get_user(x, ptr) get_user(x, ptr) extern int __get_user_bad(void); -#define __get_user_asm(err,x,ptr,bwl,reg) \ - __asm__ ("move" #bwl " %1,%0" \ - : "=d" (x) \ +#define __get_user_asm(err,x,ptr,bwl,reg) \ + __asm__ ("move" #bwl " %1,%0" \ + : "=d" (x) \ : "m" (*__ptr(ptr))) #define copy_from_user(to, from, n) (memcpy(to, from, n), 0) diff --git a/include/asm-m68knommu/unaligned.h b/include/asm-m68knommu/unaligned.h index 8876f034e..869e9dd24 100644 --- a/include/asm-m68knommu/unaligned.h +++ b/include/asm-m68knommu/unaligned.h @@ -1,7 +1,6 @@ #ifndef __M68K_UNALIGNED_H #define __M68K_UNALIGNED_H -#include #ifdef CONFIG_COLDFIRE diff --git a/include/asm-m68knommu/unistd.h b/include/asm-m68knommu/unistd.h index 5373988a7..1b2abdf28 100644 --- a/include/asm-m68knommu/unistd.h +++ b/include/asm-m68knommu/unistd.h @@ -286,6 +286,8 @@ #define __NR_request_key 280 #define __NR_keyctl 281 +#ifdef __KERNEL__ + #define NR_syscalls 282 /* user-visible error numbers are in the range -1 - -122: see @@ -437,7 +439,6 @@ type name(atype a, btype b, ctype c, dtype d, etype e) \ return (type)__res; \ } -#ifdef __KERNEL__ #define __ARCH_WANT_IPC_PARSE_VERSION #define __ARCH_WANT_OLD_READDIR #define __ARCH_WANT_OLD_STAT @@ -460,7 +461,6 @@ type name(atype a, btype b, ctype c, dtype d, etype e) \ #define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPROCMASK #define __ARCH_WANT_SYS_RT_SIGACTION -#endif #ifdef __KERNEL_SYSCALLS__ @@ -515,7 +515,7 @@ asmlinkage long sys_rt_sigaction(int sig, struct sigaction __user *oact, size_t sigsetsize); -#endif +#endif /* __KERNEL_SYSCALLS__ */ /* * "Conditional" syscalls @@ -525,4 +525,5 @@ asmlinkage long sys_rt_sigaction(int sig, */ #define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") +#endif /* __KERNEL__ */ #endif /* _ASM_M68K_UNISTD_H_ */ diff --git a/include/asm-mips/a.out.h b/include/asm-mips/a.out.h index 2b3dc3bed..ef33c3f13 100644 --- a/include/asm-mips/a.out.h +++ b/include/asm-mips/a.out.h @@ -10,7 +10,6 @@ #ifdef __KERNEL__ -#include #endif diff --git a/include/asm-mips/addrspace.h b/include/asm-mips/addrspace.h index 1386af1cb..45c706e34 100644 --- a/include/asm-mips/addrspace.h +++ b/include/asm-mips/addrspace.h @@ -10,7 +10,6 @@ #ifndef _ASM_ADDRSPACE_H #define _ASM_ADDRSPACE_H -#include #include /* @@ -133,57 +132,22 @@ || defined (CONFIG_CPU_NEVADA) \ || defined (CONFIG_CPU_TX49XX) \ || defined (CONFIG_CPU_MIPS64) -#define KUSIZE _LLCONST_(0x0000010000000000) /* 2^^40 */ -#define KUSIZE_64 _LLCONST_(0x0000010000000000) /* 2^^40 */ -#define K0SIZE _LLCONST_(0x0000001000000000) /* 2^^36 */ -#define K1SIZE _LLCONST_(0x0000001000000000) /* 2^^36 */ -#define K2SIZE _LLCONST_(0x000000ff80000000) -#define KSEGSIZE _LLCONST_(0x000000ff80000000) /* max syssegsz */ #define TO_PHYS_MASK _LLCONST_(0x0000000fffffffff) /* 2^^36 - 1 */ #endif #if defined (CONFIG_CPU_R8000) /* We keep KUSIZE consistent with R4000 for now (2^^40) instead of (2^^48) */ -#define KUSIZE _LLCONST_(0x0000010000000000) /* 2^^40 */ -#define KUSIZE_64 _LLCONST_(0x0000010000000000) /* 2^^40 */ -#define K0SIZE _LLCONST_(0x0000010000000000) /* 2^^40 */ -#define K1SIZE _LLCONST_(0x0000010000000000) /* 2^^40 */ -#define K2SIZE _LLCONST_(0x0001000000000000) -#define KSEGSIZE _LLCONST_(0x0000010000000000) /* max syssegsz */ #define TO_PHYS_MASK _LLCONST_(0x000000ffffffffff) /* 2^^40 - 1 */ #endif #if defined (CONFIG_CPU_R10000) -#define KUSIZE _LLCONST_(0x0000010000000000) /* 2^^40 */ -#define KUSIZE_64 _LLCONST_(0x0000010000000000) /* 2^^40 */ -#define K0SIZE _LLCONST_(0x0000010000000000) /* 2^^40 */ -#define K1SIZE _LLCONST_(0x0000010000000000) /* 2^^40 */ -#define K2SIZE _LLCONST_(0x00000fff80000000) -#define KSEGSIZE _LLCONST_(0x00000fff80000000) /* max syssegsz */ #define TO_PHYS_MASK _LLCONST_(0x000000ffffffffff) /* 2^^40 - 1 */ #endif #if defined(CONFIG_CPU_SB1) || defined(CONFIG_CPU_SB1A) -#define KUSIZE _LLCONST_(0x0000100000000000) /* 2^^44 */ -#define KUSIZE_64 _LLCONST_(0x0000100000000000) /* 2^^44 */ -#define K0SIZE _LLCONST_(0x0000100000000000) /* 2^^44 */ -#define K1SIZE _LLCONST_(0x0000100000000000) /* 2^^44 */ -#define K2SIZE _LLCONST_(0x0000ffff80000000) -#define KSEGSIZE _LLCONST_(0x0000ffff80000000) /* max syssegsz */ #define TO_PHYS_MASK _LLCONST_(0x00000fffffffffff) /* 2^^44 - 1 */ #endif -/* - * Further names for SGI source compatibility. These are stolen from - * IRIX's . - */ -#define KUBASE _LLCONST_(0) -#define KUSIZE_32 _LLCONST_(0x0000000080000000) /* KUSIZE - for a 32 bit proc */ -#define K0BASE_EXL_WR _LLCONST_(0xa800000000000000) /* exclusive on write */ -#define K0BASE_NONCOH _LLCONST_(0x9800000000000000) /* noncoherent */ -#define K0BASE_EXL _LLCONST_(0xa000000000000000) /* exclusive */ - #ifndef CONFIG_CPU_R8000 /* diff --git a/include/asm-mips/arc/types.h b/include/asm-mips/arc/types.h index bbb725c36..b9adcd6f0 100644 --- a/include/asm-mips/arc/types.h +++ b/include/asm-mips/arc/types.h @@ -9,7 +9,6 @@ #ifndef _ASM_ARC_TYPES_H #define _ASM_ARC_TYPES_H -#include #ifdef CONFIG_ARC32 diff --git a/include/asm-mips/asm.h b/include/asm-mips/asm.h index 4b090f314..e3038a459 100644 --- a/include/asm-mips/asm.h +++ b/include/asm-mips/asm.h @@ -17,7 +17,6 @@ #ifndef __ASM_ASM_H #define __ASM_ASM_H -#include #include #ifndef CAT diff --git a/include/asm-mips/asmmacro-32.h b/include/asm-mips/asmmacro-32.h index 11daf5ceb..5de3963f5 100644 --- a/include/asm-mips/asmmacro-32.h +++ b/include/asm-mips/asmmacro-32.h @@ -12,7 +12,7 @@ #include #include - .macro fpu_save_double thread status tmp1=t0 tmp2 + .macro fpu_save_double thread status tmp1=t0 cfc1 \tmp1, fcr31 sdc1 $f0, THREAD_FPR0(\thread) sdc1 $f2, THREAD_FPR2(\thread) @@ -70,7 +70,7 @@ sw \tmp, THREAD_FCR31(\thread) .endm - .macro fpu_restore_double thread tmp=t0 + .macro fpu_restore_double thread status tmp=t0 lw \tmp, THREAD_FCR31(\thread) ldc1 $f0, THREAD_FPR0(\thread) ldc1 $f2, THREAD_FPR2(\thread) diff --git a/include/asm-mips/asmmacro-64.h b/include/asm-mips/asmmacro-64.h index 559c355b9..225feefcb 100644 --- a/include/asm-mips/asmmacro-64.h +++ b/include/asm-mips/asmmacro-64.h @@ -53,12 +53,12 @@ sdc1 $f31, THREAD_FPR31(\thread) .endm - .macro fpu_save_double thread status tmp1 tmp2 - sll \tmp2, \tmp1, 5 - bgez \tmp2, 2f + .macro fpu_save_double thread status tmp + sll \tmp, \status, 5 + bgez \tmp, 2f fpu_save_16odd \thread 2: - fpu_save_16even \thread \tmp1 # clobbers t1 + fpu_save_16even \thread \tmp .endm .macro fpu_restore_16even thread tmp=t0 @@ -101,13 +101,12 @@ ldc1 $f31, THREAD_FPR31(\thread) .endm - .macro fpu_restore_double thread tmp - mfc0 t0, CP0_STATUS - sll t1, t0, 5 - bgez t1, 1f # 16 register mode? + .macro fpu_restore_double thread status tmp + sll \tmp, \status, 5 + bgez \tmp, 1f # 16 register mode? - fpu_restore_16odd a0 -1: fpu_restore_16even a0, t0 # clobbers t0 + fpu_restore_16odd \thread +1: fpu_restore_16even \thread \tmp .endm .macro cpu_save_nonscratch thread diff --git a/include/asm-mips/asmmacro.h b/include/asm-mips/asmmacro.h index f54aa147e..92e62ef71 100644 --- a/include/asm-mips/asmmacro.h +++ b/include/asm-mips/asmmacro.h @@ -8,7 +8,6 @@ #ifndef _ASM_ASMMACRO_H #define _ASM_ASMMACRO_H -#include #include #ifdef CONFIG_32BIT @@ -27,14 +26,14 @@ ori \reg, \reg, TCSTATUS_IXMT xori \reg, \reg, TCSTATUS_IXMT mtc0 \reg, CP0_TCSTATUS - ehb + _ehb .endm .macro local_irq_disable reg=t0 mfc0 \reg, CP0_TCSTATUS ori \reg, \reg, TCSTATUS_IXMT mtc0 \reg, CP0_TCSTATUS - ehb + _ehb .endm #else .macro local_irq_enable reg=t0 diff --git a/include/asm-mips/atomic.h b/include/asm-mips/atomic.h index 2c8b85337..e64abc0d8 100644 --- a/include/asm-mips/atomic.h +++ b/include/asm-mips/atomic.h @@ -17,14 +17,13 @@ * we have to include outside the * main big wrapper ... */ -#include #include #ifndef _ASM_ATOMIC_H #define _ASM_ATOMIC_H +#include #include -#include #include typedef struct { volatile int counter; } atomic_t; diff --git a/include/asm-mips/bcache.h b/include/asm-mips/bcache.h index 446102b34..3646a3f2e 100644 --- a/include/asm-mips/bcache.h +++ b/include/asm-mips/bcache.h @@ -9,7 +9,6 @@ #ifndef _ASM_BCACHE_H #define _ASM_BCACHE_H -#include /* Some R4000 / R4400 / R4600 / R5000 machines may have a non-dma-coherent, chipset implemented caches. On machines with other CPUs the CPU does the diff --git a/include/asm-mips/bitops.h b/include/asm-mips/bitops.h index d2f444537..1bb89c5a1 100644 --- a/include/asm-mips/bitops.h +++ b/include/asm-mips/bitops.h @@ -9,7 +9,6 @@ #ifndef _ASM_BITOPS_H #define _ASM_BITOPS_H -#include #include #include #include @@ -32,7 +31,7 @@ #ifdef __KERNEL__ -#include +#include #include #include diff --git a/include/asm-mips/bootinfo.h b/include/asm-mips/bootinfo.h index 14fc88f27..3b745e76f 100644 --- a/include/asm-mips/bootinfo.h +++ b/include/asm-mips/bootinfo.h @@ -217,6 +217,13 @@ */ #define MACH_GROUP_TITAN 22 /* PMC-Sierra Titan */ #define MACH_TITAN_YOSEMITE 1 /* PMC-Sierra Yosemite */ +#define MACH_TITAN_EXCITE 2 /* Basler eXcite */ + +/* + * Valid machtype for group NEC EMMA2RH + */ +#define MACH_GROUP_NEC_EMMA2RH 25 /* NEC EMMA2RH (was 23) */ +#define MACH_NEC_MARKEINS 0 /* NEC EMMA2RH Mark-eins */ #define CL_SIZE COMMAND_LINE_SIZE @@ -258,4 +265,10 @@ extern char arcs_cmdline[CL_SIZE]; * Registers a0, a1, a3 and a4 as passed to the kenrel entry by firmware */ extern unsigned long fw_arg0, fw_arg1, fw_arg2, fw_arg3; + +/* + * Platform memory detection hook called by setup_arch + */ +extern void plat_mem_setup(void); + #endif /* _ASM_BOOTINFO_H */ diff --git a/include/asm-mips/bug.h b/include/asm-mips/bug.h index 87d49a5bd..7b4739dc8 100644 --- a/include/asm-mips/bug.h +++ b/include/asm-mips/bug.h @@ -1,7 +1,6 @@ #ifndef __ASM_BUG_H #define __ASM_BUG_H -#include #ifdef CONFIG_BUG diff --git a/include/asm-mips/bugs.h b/include/asm-mips/bugs.h index cb2ea7c15..0d7f9c1f5 100644 --- a/include/asm-mips/bugs.h +++ b/include/asm-mips/bugs.h @@ -7,7 +7,6 @@ #ifndef _ASM_BUGS_H #define _ASM_BUGS_H -#include #include #include #include diff --git a/include/asm-mips/byteorder.h b/include/asm-mips/byteorder.h index aefc02f16..eee83cbdf 100644 --- a/include/asm-mips/byteorder.h +++ b/include/asm-mips/byteorder.h @@ -8,7 +8,6 @@ #ifndef _ASM_BYTEORDER_H #define _ASM_BYTEORDER_H -#include #include #include diff --git a/include/asm-mips/cache.h b/include/asm-mips/cache.h index 55e19f2ff..37f175c42 100644 --- a/include/asm-mips/cache.h +++ b/include/asm-mips/cache.h @@ -9,7 +9,6 @@ #ifndef _ASM_CACHE_H #define _ASM_CACHE_H -#include #include #define L1_CACHE_SHIFT CONFIG_MIPS_L1_CACHE_SHIFT diff --git a/include/asm-mips/checksum.h b/include/asm-mips/checksum.h index b09f8971e..a5e6050ec 100644 --- a/include/asm-mips/checksum.h +++ b/include/asm-mips/checksum.h @@ -11,7 +11,6 @@ #ifndef _ASM_CHECKSUM_H #define _ASM_CHECKSUM_H -#include #include #include diff --git a/include/asm-mips/compat.h b/include/asm-mips/compat.h index 986511db5..900f472fd 100644 --- a/include/asm-mips/compat.h +++ b/include/asm-mips/compat.h @@ -145,8 +145,5 @@ static inline void __user *compat_alloc_user_space(long len) return (void __user *) (regs->regs[29] - len); } -#if defined (__MIPSEL__) -#define __COMPAT_ENDIAN_SWAP__ 1 -#endif #endif /* _ASM_COMPAT_H */ diff --git a/include/asm-mips/cpu-features.h b/include/asm-mips/cpu-features.h index 254e11ed2..eadca266f 100644 --- a/include/asm-mips/cpu-features.h +++ b/include/asm-mips/cpu-features.h @@ -9,7 +9,6 @@ #ifndef __ASM_CPU_FEATURES_H #define __ASM_CPU_FEATURES_H -#include #include #include @@ -144,12 +143,8 @@ #define cpu_has_dsp (cpu_data[0].ases & MIPS_ASE_DSP) #endif -#ifdef CONFIG_MIPS_MT #ifndef cpu_has_mipsmt -# define cpu_has_mipsmt (cpu_data[0].ases & MIPS_ASE_MIPSMT) -#endif -#else -# define cpu_has_mipsmt 0 +#define cpu_has_mipsmt (cpu_data[0].ases & MIPS_ASE_MIPSMT) #endif #ifdef CONFIG_32BIT @@ -188,24 +183,20 @@ # endif #endif -#ifdef CONFIG_CPU_MIPSR2 -# if defined(CONFIG_CPU_MIPSR2_IRQ_VI) && !defined(cpu_has_vint) -# define cpu_has_vint (cpu_data[0].options & MIPS_CPU_VINT) -# else -# define cpu_has_vint 0 -# endif -# if defined(CONFIG_CPU_MIPSR2_IRQ_EI) && !defined(cpu_has_veic) -# define cpu_has_veic (cpu_data[0].options & MIPS_CPU_VEIC) -# else -# define cpu_has_veic 0 -# endif -#else +#if defined(CONFIG_CPU_MIPSR2_IRQ_VI) && !defined(cpu_has_vint) +# define cpu_has_vint (cpu_data[0].options & MIPS_CPU_VINT) +#elif !defined(cpu_has_vint) # define cpu_has_vint 0 +#endif + +#if defined(CONFIG_CPU_MIPSR2_IRQ_EI) && !defined(cpu_has_veic) +# define cpu_has_veic (cpu_data[0].options & MIPS_CPU_VEIC) +#elif !defined(cpu_has_veic) # define cpu_has_veic 0 #endif -#ifndef cpu_has_subset_pcaches -#define cpu_has_subset_pcaches (cpu_data[0].options & MIPS_CPU_SUBSET_CACHES) +#ifndef cpu_has_inclusive_pcaches +#define cpu_has_inclusive_pcaches (cpu_data[0].options & MIPS_CPU_INCLUSIVE_CACHES) #endif #ifndef cpu_dcache_line_size diff --git a/include/asm-mips/cpu-info.h b/include/asm-mips/cpu-info.h index 6572ac703..a2f0c8ea9 100644 --- a/include/asm-mips/cpu-info.h +++ b/include/asm-mips/cpu-info.h @@ -12,7 +12,6 @@ #ifndef __ASM_CPU_INFO_H #define __ASM_CPU_INFO_H -#include #include #ifdef CONFIG_SGI_IP27 diff --git a/include/asm-mips/cpu.h b/include/asm-mips/cpu.h index dff2a0a52..d38fdbf84 100644 --- a/include/asm-mips/cpu.h +++ b/include/asm-mips/cpu.h @@ -242,7 +242,7 @@ #define MIPS_CPU_EJTAG 0x00008000 /* EJTAG exception */ #define MIPS_CPU_NOFPUEX 0x00010000 /* no FPU exception */ #define MIPS_CPU_LLSC 0x00020000 /* CPU has ll/sc instructions */ -#define MIPS_CPU_SUBSET_CACHES 0x00040000 /* P-cache subset enforced */ +#define MIPS_CPU_INCLUSIVE_CACHES 0x00040000 /* P-cache subset enforced */ #define MIPS_CPU_PREFETCH 0x00080000 /* CPU has usable prefetch */ #define MIPS_CPU_VINT 0x00100000 /* CPU supports MIPSR2 vectored interrupts */ #define MIPS_CPU_VEIC 0x00200000 /* CPU supports MIPSR2 external interrupt controller mode */ diff --git a/include/asm-mips/ddb5074.h b/include/asm-mips/ddb5074.h deleted file mode 100644 index 0d09ac27f..000000000 --- a/include/asm-mips/ddb5074.h +++ /dev/null @@ -1,11 +0,0 @@ -/* - * include/asm-mips/ddb5074.h -- NEC DDB Vrc-5074 definitions - * - * Copyright (C) 2000 Geert Uytterhoeven - * Sony Software Development Center Europe (SDCE), Brussels - */ - -extern void ddb5074_led_hex(int hex); -extern void ddb5074_led_d2(int on); -extern void ddb5074_led_d3(int on); - diff --git a/include/asm-mips/ddb5xxx/ddb5074.h b/include/asm-mips/ddb5xxx/ddb5074.h deleted file mode 100644 index 58d88306a..000000000 --- a/include/asm-mips/ddb5xxx/ddb5074.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * include/asm-mips/ddb5074.h -- NEC DDB Vrc-5074 definitions - * - * Copyright (C) 2000 Geert Uytterhoeven - * Sony Software Development Center Europe (SDCE), Brussels - */ - -#ifndef _ASM_DDB5XXX_DDB5074_H -#define _ASM_DDB5XXX_DDB5074_H - -#include - -#define DDB_SDRAM_SIZE 0x04000000 /* 64MB */ - -#define DDB_PCI_IO_BASE 0x06000000 -#define DDB_PCI_IO_SIZE 0x02000000 /* 32 MB */ - -#define DDB_PCI_MEM_BASE 0x08000000 -#define DDB_PCI_MEM_SIZE 0x08000000 /* 128 MB */ - -#define DDB_PCI_CONFIG_BASE DDB_PCI_MEM_BASE -#define DDB_PCI_CONFIG_SIZE DDB_PCI_MEM_SIZE - -#define NILE4_PCI_IO_BASE 0xa6000000 -#define NILE4_PCI_MEM_BASE 0xa8000000 -#define NILE4_PCI_CFG_BASE NILE4_PCI_MEM_BASE -#define DDB_PCI_IACK_BASE NILE4_PCI_IO_BASE - -#define NILE4_IRQ_BASE NUM_I8259_INTERRUPTS -#define CPU_IRQ_BASE (NUM_NILE4_INTERRUPTS + NILE4_IRQ_BASE) -#define CPU_NILE4_CASCADE 2 - -extern void ddb5074_led_hex(int hex); -extern void ddb5074_led_d2(int on); -extern void ddb5074_led_d3(int on); - -extern void nile4_irq_setup(u32 base); -#endif diff --git a/include/asm-mips/ddb5xxx/ddb5476.h b/include/asm-mips/ddb5xxx/ddb5476.h deleted file mode 100644 index 4c23390d9..000000000 --- a/include/asm-mips/ddb5xxx/ddb5476.h +++ /dev/null @@ -1,157 +0,0 @@ -/* - * header file specific for ddb5476 - * - * Copyright (C) 2001 MontaVista Software Inc. - * Author: Jun Sun, jsun@mvista.com or jsun@junsun.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. - * - */ - -/* - * Memory map (physical address) - * - * Note most of the following address must be properly aligned by the - * corresponding size. For example, if PCI_IO_SIZE is 16MB, then - * PCI_IO_BASE must be aligned along 16MB boundary. - */ -#define DDB_SDRAM_BASE 0x00000000 -#define DDB_SDRAM_SIZE 0x04000000 /* 64MB */ - -#define DDB_DCS3_BASE 0x04000000 /* flash 1 */ -#define DDB_DCS3_SIZE 0x01000000 /* 16MB */ - -#define DDB_DCS2_BASE 0x05000000 /* flash 2 */ -#define DDB_DCS2_SIZE 0x01000000 /* 16MB */ - -#define DDB_PCI_IO_BASE 0x06000000 -#define DDB_PCI_IO_SIZE 0x02000000 /* 32 MB */ - -#define DDB_PCI_MEM_BASE 0x08000000 -#define DDB_PCI_MEM_SIZE 0x08000000 /* 128 MB */ - -#define DDB_DCS5_BASE 0x13000000 /* DDB status regs */ -#define DDB_DCS5_SIZE 0x00200000 /* 2MB, 8-bit */ - -#define DDB_DCS4_BASE 0x14000000 /* DDB control regs */ -#define DDB_DCS4_SIZE 0x00200000 /* 2MB, 8-bit */ - -#define DDB_INTCS_BASE 0x1fa00000 /* VRC5476 control regs */ -#define DDB_INTCS_SIZE 0x00200000 /* 2MB */ - -#define DDB_BOOTCS_BASE 0x1fc00000 /* Boot ROM / EPROM /Flash */ -#define DDB_BOOTCS_SIZE 0x00200000 /* 2 MB - doc says 4MB */ - - -/* aliases */ -#define DDB_PCI_CONFIG_BASE DDB_PCI_MEM_BASE -#define DDB_PCI_CONFIG_SIZE DDB_PCI_MEM_SIZE - -/* PCI intr ack share PCIW0 with PCI IO */ -#define DDB_PCI_IACK_BASE DDB_PCI_IO_BASE - -/* - * Interrupt mapping - * - * We have three interrupt controllers: - * - * . CPU itself - 8 sources - * . i8259 - 16 sources - * . vrc5476 - 16 sources - * - * They connected as follows: - * all vrc5476 interrupts are routed to cpu IP2 (by software setting) - * all i2869 are routed to INTC in vrc5476 (by hardware connection) - * - * All VRC5476 PCI interrupts are level-triggered (no ack needed). - * All PCI irq but INTC are active low. - */ - -/* - * irq number block assignment - */ - -#define NUM_CPU_IRQ 8 -#define NUM_I8259_IRQ 16 -#define NUM_VRC5476_IRQ 16 - -#define DDB_IRQ_BASE 0 - -#define I8259_IRQ_BASE DDB_IRQ_BASE -#define VRC5476_IRQ_BASE (I8259_IRQ_BASE + NUM_I8259_IRQ) -#define CPU_IRQ_BASE (VRC5476_IRQ_BASE + NUM_VRC5476_IRQ) - -/* - * vrc5476 irq defs, see page 52-64 of Vrc5074 system controller manual - */ - -#define VRC5476_IRQ_CPCE 0 /* cpu parity error */ -#define VRC5476_IRQ_CNTD 1 /* cpu no target */ -#define VRC5476_IRQ_MCE 2 /* memory check error */ -#define VRC5476_IRQ_DMA 3 /* DMA */ -#define VRC5476_IRQ_UART 4 /* vrc5476 builtin UART, not used */ -#define VRC5476_IRQ_WDOG 5 /* watchdog timer */ -#define VRC5476_IRQ_GPT 6 /* general purpose timer */ -#define VRC5476_IRQ_LBRT 7 /* local bus read timeout */ -#define VRC5476_IRQ_INTA 8 /* PCI INT #A */ -#define VRC5476_IRQ_INTB 9 /* PCI INT #B */ -#define VRC5476_IRQ_INTC 10 /* PCI INT #C */ -#define VRC5476_IRQ_INTD 11 /* PCI INT #D */ -#define VRC5476_IRQ_INTE 12 /* PCI INT #E */ -#define VRC5476_IRQ_RESERVED_13 13 /* reserved */ -#define VRC5476_IRQ_PCIS 14 /* PCI SERR # */ -#define VRC5476_IRQ_PCI 15 /* PCI internal error */ - -/* - * i2859 irq assignment - */ -#define I8259_IRQ_RESERVED_0 0 -#define I8259_IRQ_KEYBOARD 1 /* M1543 default */ -#define I8259_IRQ_CASCADE 2 -#define I8259_IRQ_UART_B 3 /* M1543 default, may conflict with RTC according to schematic diagram */ -#define I8259_IRQ_UART_A 4 /* M1543 default */ -#define I8259_IRQ_PARALLEL 5 /* M1543 default */ -#define I8259_IRQ_RESERVED_6 6 -#define I8259_IRQ_RESERVED_7 7 -#define I8259_IRQ_RTC 8 /* who set this? */ -#define I8259_IRQ_USB 9 /* ddb_setup */ -#define I8259_IRQ_PMU 10 /* ddb_setup */ -#define I8259_IRQ_RESERVED_11 11 -#define I8259_IRQ_RESERVED_12 12 /* m1543_irq_setup */ -#define I8259_IRQ_RESERVED_13 13 -#define I8259_IRQ_HDC1 14 /* default and ddb_setup */ -#define I8259_IRQ_HDC2 15 /* default */ - - -/* - * misc - */ -#define VRC5476_I8259_CASCADE VRC5476_IRQ_INTC -#define CPU_VRC5476_CASCADE 2 - -#define is_i8259_irq(irq) ((irq) < NUM_I8259_IRQ) -#define nile4_to_irq(n) ((n)+NUM_I8259_IRQ) -#define irq_to_nile4(n) ((n)-NUM_I8259_IRQ) - -/* - * low-level irq functions - */ -#ifndef __ASSEMBLY__ -extern void nile4_map_irq(int nile4_irq, int cpu_irq); -extern void nile4_map_irq_all(int cpu_irq); -extern void nile4_enable_irq(int nile4_irq); -extern void nile4_disable_irq(int nile4_irq); -extern void nile4_disable_irq_all(void); -extern u16 nile4_get_irq_stat(int cpu_irq); -extern void nile4_enable_irq_output(int cpu_irq); -extern void nile4_disable_irq_output(int cpu_irq); -extern void nile4_set_pci_irq_polarity(int pci_irq, int high); -extern void nile4_set_pci_irq_level_or_edge(int pci_irq, int level); -extern void nile4_clear_irq(int nile4_irq); -extern void nile4_clear_irq_mask(u32 mask); -extern u8 nile4_i8259_iack(void); -extern void nile4_dump_irq_status(void); /* Debug */ -#endif /* !__ASSEMBLY__ */ diff --git a/include/asm-mips/ddb5xxx/ddb5477.h b/include/asm-mips/ddb5xxx/ddb5477.h index a438548e6..c5af4b73f 100644 --- a/include/asm-mips/ddb5xxx/ddb5477.h +++ b/include/asm-mips/ddb5xxx/ddb5477.h @@ -17,7 +17,6 @@ #ifndef __ASM_DDB5XXX_DDB5477_H #define __ASM_DDB5XXX_DDB5477_H -#include /* * This contains macros that are specific to DDB5477 or renamed from diff --git a/include/asm-mips/ddb5xxx/ddb5xxx.h b/include/asm-mips/ddb5xxx/ddb5xxx.h index 873c03f2c..e97fcc8d5 100644 --- a/include/asm-mips/ddb5xxx/ddb5xxx.h +++ b/include/asm-mips/ddb5xxx/ddb5xxx.h @@ -18,7 +18,6 @@ #ifndef __ASM_DDB5XXX_DDB5XXX_H #define __ASM_DDB5XXX_DDB5XXX_H -#include #include /* @@ -174,13 +173,8 @@ static inline void ddb_sync(void) { -/* The DDB5074 doesn't seem to like these accesses. They kill the board on - * interrupt load - */ -#ifndef CONFIG_DDB5074 volatile u32 *p = (volatile u32 *)0xbfc00000; (void)(*p); -#endif } static inline void ddb_out32(u32 offset, u32 val) @@ -260,11 +254,7 @@ extern void ddb_pci_reset_bus(void); /* * include the board dependent part */ -#if defined(CONFIG_DDB5074) -#include -#elif defined(CONFIG_DDB5476) -#include -#elif defined(CONFIG_DDB5477) +#if defined(CONFIG_DDB5477) #include #else #error "Unknown DDB board!" diff --git a/include/asm-mips/debug.h b/include/asm-mips/debug.h index 930f2b75e..1fd5a2b39 100644 --- a/include/asm-mips/debug.h +++ b/include/asm-mips/debug.h @@ -15,7 +15,6 @@ #ifndef _ASM_DEBUG_H #define _ASM_DEBUG_H -#include /* * run-time macros for catching spurious errors. Eable CONFIG_RUNTIME_DEBUG in diff --git a/include/asm-mips/dec/prom.h b/include/asm-mips/dec/prom.h index 1384dd096..b9c820368 100644 --- a/include/asm-mips/dec/prom.h +++ b/include/asm-mips/dec/prom.h @@ -15,7 +15,6 @@ #ifndef _ASM_DEC_PROM_H #define _ASM_DEC_PROM_H -#include #include #include diff --git a/include/asm-mips/delay.h b/include/asm-mips/delay.h index 928f30f8c..ea77050f8 100644 --- a/include/asm-mips/delay.h +++ b/include/asm-mips/delay.h @@ -10,7 +10,6 @@ #ifndef _ASM_DELAY_H #define _ASM_DELAY_H -#include #include #include #include diff --git a/include/asm-mips/dma.h b/include/asm-mips/dma.h index 6aaf9939a..e85849ac1 100644 --- a/include/asm-mips/dma.h +++ b/include/asm-mips/dma.h @@ -12,7 +12,6 @@ #ifndef _ASM_DMA_H #define _ASM_DMA_H -#include #include /* need byte IO */ #include /* And spinlocks */ #include diff --git a/include/asm-mips/elf.h b/include/asm-mips/elf.h index bdc9de2df..ebd6bfb19 100644 --- a/include/asm-mips/elf.h +++ b/include/asm-mips/elf.h @@ -8,7 +8,6 @@ #ifndef _ASM_ELF_H #define _ASM_ELF_H -#include /* ELF header e_flags defines. */ /* MIPS architecture level. */ diff --git a/include/asm-mips/fcntl.h b/include/asm-mips/fcntl.h index 43d047a9a..787220e6c 100644 --- a/include/asm-mips/fcntl.h +++ b/include/asm-mips/fcntl.h @@ -8,7 +8,6 @@ #ifndef _ASM_FCNTL_H #define _ASM_FCNTL_H -#include #define O_APPEND 0x0008 #define O_SYNC 0x0010 diff --git a/include/asm-mips/fixmap.h b/include/asm-mips/fixmap.h index 73a3028dd..6959bdb59 100644 --- a/include/asm-mips/fixmap.h +++ b/include/asm-mips/fixmap.h @@ -13,7 +13,6 @@ #ifndef _ASM_FIXMAP_H #define _ASM_FIXMAP_H -#include #include #ifdef CONFIG_HIGHMEM #include @@ -70,7 +69,11 @@ extern void __set_fixmap (enum fixed_addresses idx, * the start of the fixmap, and leave one page empty * at the top of mem.. */ +#if defined(CONFIG_CPU_TX39XX) || defined(CONFIG_CPU_TX49XX) +#define FIXADDR_TOP (0xff000000UL - 0x2000) +#else #define FIXADDR_TOP (0xffffe000UL) +#endif #define FIXADDR_SIZE (__end_of_fixed_addresses << PAGE_SHIFT) #define FIXADDR_START (FIXADDR_TOP - FIXADDR_SIZE) diff --git a/include/asm-mips/fpu.h b/include/asm-mips/fpu.h index b0f50015e..58c561a9e 100644 --- a/include/asm-mips/fpu.h +++ b/include/asm-mips/fpu.h @@ -10,7 +10,6 @@ #ifndef _ASM_FPU_H #define _ASM_FPU_H -#include #include #include @@ -138,10 +137,9 @@ static inline fpureg_t *get_fpu_regs(struct task_struct *tsk) if (cpu_has_fpu) { if ((tsk == current) && __is_fpu_owner()) _save_fp(current); - return tsk->thread.fpu.hard.fpr; } - return tsk->thread.fpu.soft.fpr; + return tsk->thread.fpu.fpr; } #endif /* _ASM_FPU_H */ diff --git a/include/asm-mips/fpu_emulator.h b/include/asm-mips/fpu_emulator.h index 16cb4d11d..2731c38bd 100644 --- a/include/asm-mips/fpu_emulator.h +++ b/include/asm-mips/fpu_emulator.h @@ -12,8 +12,8 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. * - * Further private data for which no space exists in mips_fpu_soft_struct. - * This should be subsumed into the mips_fpu_soft_struct structure as + * Further private data for which no space exists in mips_fpu_struct. + * This should be subsumed into the mips_fpu_struct structure as * defined in processor.h as soon as the absurd wired absolute assembler * offsets become dynamic at compile time. * diff --git a/include/asm-mips/futex.h b/include/asm-mips/futex.h index 12d118f1b..ed023eae0 100644 --- a/include/asm-mips/futex.h +++ b/include/asm-mips/futex.h @@ -3,7 +3,6 @@ #ifdef __KERNEL__ -#include #include #include #include @@ -22,51 +21,53 @@ " .set push \n" \ " .set noat \n" \ " .set mips3 \n" \ - "1: ll %1, (%3) # __futex_atomic_op \n" \ + "1: ll %1, %4 # __futex_atomic_op \n" \ " .set mips0 \n" \ " " insn " \n" \ " .set mips3 \n" \ - "2: sc $1, (%3) \n" \ + "2: sc $1, %2 \n" \ " beqzl $1, 1b \n" \ __FUTEX_SMP_SYNC \ "3: \n" \ " .set pop \n" \ " .set mips0 \n" \ " .section .fixup,\"ax\" \n" \ - "4: li %0, %5 \n" \ + "4: li %0, %6 \n" \ " j 2b \n" \ " .previous \n" \ " .section __ex_table,\"a\" \n" \ " "__UA_ADDR "\t1b, 4b \n" \ " "__UA_ADDR "\t2b, 4b \n" \ " .previous \n" \ - : "=r" (ret), "=r" (oldval) \ - : "0" (0), "r" (uaddr), "Jr" (oparg), "i" (-EFAULT)); \ + : "=r" (ret), "=&r" (oldval), "=R" (*uaddr) \ + : "0" (0), "R" (*uaddr), "Jr" (oparg), "i" (-EFAULT) \ + : "memory"); \ } else if (cpu_has_llsc) { \ __asm__ __volatile__( \ " .set push \n" \ " .set noat \n" \ " .set mips3 \n" \ - "1: ll %1, (%3) # __futex_atomic_op \n" \ + "1: ll %1, %4 # __futex_atomic_op \n" \ " .set mips0 \n" \ " " insn " \n" \ " .set mips3 \n" \ - "2: sc $1, (%3) \n" \ + "2: sc $1, %2 \n" \ " beqz $1, 1b \n" \ __FUTEX_SMP_SYNC \ "3: \n" \ " .set pop \n" \ " .set mips0 \n" \ " .section .fixup,\"ax\" \n" \ - "4: li %0, %5 \n" \ + "4: li %0, %6 \n" \ " j 2b \n" \ " .previous \n" \ " .section __ex_table,\"a\" \n" \ " "__UA_ADDR "\t1b, 4b \n" \ " "__UA_ADDR "\t2b, 4b \n" \ " .previous \n" \ - : "=r" (ret), "=r" (oldval) \ - : "0" (0), "r" (uaddr), "Jr" (oparg), "i" (-EFAULT)); \ + : "=r" (ret), "=&r" (oldval), "=R" (*uaddr) \ + : "0" (0), "R" (*uaddr), "Jr" (oparg), "i" (-EFAULT) \ + : "memory"); \ } else \ ret = -ENOSYS; \ } @@ -89,23 +90,23 @@ futex_atomic_op_inuser (int encoded_op, int __user *uaddr) switch (op) { case FUTEX_OP_SET: - __futex_atomic_op("move $1, %z4", ret, oldval, uaddr, oparg); + __futex_atomic_op("move $1, %z5", ret, oldval, uaddr, oparg); break; case FUTEX_OP_ADD: - __futex_atomic_op("addu $1, %1, %z4", + __futex_atomic_op("addu $1, %1, %z5", ret, oldval, uaddr, oparg); break; case FUTEX_OP_OR: - __futex_atomic_op("or $1, %1, %z4", + __futex_atomic_op("or $1, %1, %z5", ret, oldval, uaddr, oparg); break; case FUTEX_OP_ANDN: - __futex_atomic_op("and $1, %1, %z4", + __futex_atomic_op("and $1, %1, %z5", ret, oldval, uaddr, ~oparg); break; case FUTEX_OP_XOR: - __futex_atomic_op("xor $1, %1, %z4", + __futex_atomic_op("xor $1, %1, %z5", ret, oldval, uaddr, oparg); break; default: diff --git a/include/asm-mips/hazards.h b/include/asm-mips/hazards.h index dadc05188..25f5e8a41 100644 --- a/include/asm-mips/hazards.h +++ b/include/asm-mips/hazards.h @@ -10,7 +10,6 @@ #ifndef _ASM_HAZARDS_H #define _ASM_HAZARDS_H -#include #ifdef __ASSEMBLY__ @@ -70,10 +69,10 @@ * Use a macro for ehb unless explicit support for MIPSR2 is enabled */ -#define irq_enable_hazard +#define irq_enable_hazard \ _ehb -#define irq_disable_hazard +#define irq_disable_hazard \ _ehb #elif defined(CONFIG_CPU_R10000) || defined(CONFIG_CPU_RM9000) diff --git a/include/asm-mips/highmem.h b/include/asm-mips/highmem.h index 8cf598402..c976bfaab 100644 --- a/include/asm-mips/highmem.h +++ b/include/asm-mips/highmem.h @@ -19,7 +19,6 @@ #ifdef __KERNEL__ -#include #include #include #include diff --git a/include/asm-mips/hw_irq.h b/include/asm-mips/hw_irq.h index c854d017c..458d9fdc7 100644 --- a/include/asm-mips/hw_irq.h +++ b/include/asm-mips/hw_irq.h @@ -19,9 +19,9 @@ extern void init_8259A(int aeoi); extern atomic_t irq_err_count; -/* This may not be apropriate for all machines, we'll see ... */ -static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) -{ -} +/* + * interrupt-retrigger: NOP for now. This may not be apropriate for all + * machines, we'll see ... + */ #endif /* __ASM_HW_IRQ_H */ diff --git a/include/asm-mips/inst.h b/include/asm-mips/inst.h index 1ed8d0f62..6489f0073 100644 --- a/include/asm-mips/inst.h +++ b/include/asm-mips/inst.h @@ -74,7 +74,7 @@ enum spec3_op { ins_op, dinsm_op, dinsu_op, dins_op, bshfl_op = 0x20, dbshfl_op = 0x24, - rdhwr_op = 0x3f + rdhwr_op = 0x3b }; /* diff --git a/include/asm-mips/interrupt.h b/include/asm-mips/interrupt.h deleted file mode 100644 index 4bb9c06f4..000000000 --- a/include/asm-mips/interrupt.h +++ /dev/null @@ -1,222 +0,0 @@ -/* - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 1994, 95, 96, 97, 98, 99, 2003 by Ralf Baechle - * Copyright (C) 1996 by Paul M. Antoine - * Copyright (C) 1999 Silicon Graphics - * Copyright (C) 2000 MIPS Technologies, Inc. - */ -#ifndef _ASM_INTERRUPT_H -#define _ASM_INTERRUPT_H - -#include -#include - -__asm__ ( - " .macro local_irq_enable \n" - " .set push \n" - " .set reorder \n" - " .set noat \n" -#ifdef CONFIG_MIPS_MT_SMTC - " mfc0 $1, $2, 1 # SMTC - clear TCStatus.IXMT \n" - " ori $1, 0x400 \n" - " xori $1, 0x400 \n" - " mtc0 $1, $2, 1 \n" -#elif defined(CONFIG_CPU_MIPSR2) - " ei \n" -#else - " mfc0 $1,$12 \n" - " ori $1,0x1f \n" - " xori $1,0x1e \n" - " mtc0 $1,$12 \n" -#endif - " irq_enable_hazard \n" - " .set pop \n" - " .endm"); - -static inline void local_irq_enable(void) -{ - __asm__ __volatile__( - "local_irq_enable" - : /* no outputs */ - : /* no inputs */ - : "memory"); -} - -/* - * For cli() we have to insert nops to make sure that the new value - * has actually arrived in the status register before the end of this - * macro. - * R4000/R4400 need three nops, the R4600 two nops and the R10000 needs - * no nops at all. - */ -/* - * For TX49, operating only IE bit is not enough. - * - * If mfc0 $12 follows store and the mfc0 is last instruction of a - * page and fetching the next instruction causes TLB miss, the result - * of the mfc0 might wrongly contain EXL bit. - * - * ERT-TX49H2-027, ERT-TX49H3-012, ERT-TX49HL3-006, ERT-TX49H4-008 - * - * Workaround: mask EXL bit of the result or place a nop before mfc0. - */ -__asm__ ( - " .macro local_irq_disable\n" - " .set push \n" - " .set noat \n" -#ifdef CONFIG_MIPS_MT_SMTC - " mfc0 $1, $2, 1 \n" - " ori $1, 0x400 \n" - " .set noreorder \n" - " mtc0 $1, $2, 1 \n" -#elif defined(CONFIG_CPU_MIPSR2) - " di \n" -#else - " mfc0 $1,$12 \n" - " ori $1,0x1f \n" - " xori $1,0x1f \n" - " .set noreorder \n" - " mtc0 $1,$12 \n" -#endif - " irq_disable_hazard \n" - " .set pop \n" - " .endm \n"); - -static inline void local_irq_disable(void) -{ - __asm__ __volatile__( - "local_irq_disable" - : /* no outputs */ - : /* no inputs */ - : "memory"); -} - -__asm__ ( - " .macro local_save_flags flags \n" - " .set push \n" - " .set reorder \n" -#ifdef CONFIG_MIPS_MT_SMTC - " mfc0 \\flags, $2, 1 \n" -#else - " mfc0 \\flags, $12 \n" -#endif - " .set pop \n" - " .endm \n"); - -#define local_save_flags(x) \ -__asm__ __volatile__( \ - "local_save_flags %0" \ - : "=r" (x)) - -__asm__ ( - " .macro local_irq_save result \n" - " .set push \n" - " .set reorder \n" - " .set noat \n" -#ifdef CONFIG_MIPS_MT_SMTC - " mfc0 \\result, $2, 1 \n" - " ori $1, \\result, 0x400 \n" - " .set noreorder \n" - " mtc0 $1, $2, 1 \n" - " andi \\result, \\result, 0x400 \n" -#elif defined(CONFIG_CPU_MIPSR2) - " di \\result \n" - " andi \\result, 1 \n" -#else - " mfc0 \\result, $12 \n" - " ori $1, \\result, 0x1f \n" - " xori $1, 0x1f \n" - " .set noreorder \n" - " mtc0 $1, $12 \n" -#endif - " irq_disable_hazard \n" - " .set pop \n" - " .endm \n"); - -#define local_irq_save(x) \ -__asm__ __volatile__( \ - "local_irq_save\t%0" \ - : "=r" (x) \ - : /* no inputs */ \ - : "memory") - -__asm__ ( - " .macro local_irq_restore flags \n" - " .set push \n" - " .set noreorder \n" - " .set noat \n" -#ifdef CONFIG_MIPS_MT_SMTC - "mfc0 $1, $2, 1 \n" - "andi \\flags, 0x400 \n" - "ori $1, 0x400 \n" - "xori $1, 0x400 \n" - "or \\flags, $1 \n" - "mtc0 \\flags, $2, 1 \n" -#elif defined(CONFIG_CPU_MIPSR2) && defined(CONFIG_IRQ_CPU) - /* - * Slow, but doesn't suffer from a relativly unlikely race - * condition we're having since days 1. - */ - " beqz \\flags, 1f \n" - " di \n" - " ei \n" - "1: \n" -#elif defined(CONFIG_CPU_MIPSR2) - /* - * Fast, dangerous. Life is fun, life is good. - */ - " mfc0 $1, $12 \n" - " ins $1, \\flags, 0, 1 \n" - " mtc0 $1, $12 \n" -#else - " mfc0 $1, $12 \n" - " andi \\flags, 1 \n" - " ori $1, 0x1f \n" - " xori $1, 0x1f \n" - " or \\flags, $1 \n" - " mtc0 \\flags, $12 \n" -#endif - " irq_disable_hazard \n" - " .set pop \n" - " .endm \n"); - -#define local_irq_restore(flags) \ -do { \ - unsigned long __tmp1; \ - \ - __asm__ __volatile__( \ - "local_irq_restore\t%0" \ - : "=r" (__tmp1) \ - : "0" (flags) \ - : "memory"); \ -} while(0) - -static inline int irqs_disabled(void) -{ -#ifdef CONFIG_MIPS_MT_SMTC - /* - * SMTC model uses TCStatus.IXMT to disable interrupts for a thread/CPU - */ - unsigned long __result; - - __asm__ __volatile__( - " .set noreorder \n" - " mfc0 %0, $2, 1 \n" - " andi %0, 0x400 \n" - " slt %0, $0, %0 \n" - " .set reorder \n" - : "=r" (__result)); - - return __result; -#else - unsigned long flags; - local_save_flags(flags); - - return !(flags & 1); -#endif -} - -#endif /* _ASM_INTERRUPT_H */ diff --git a/include/asm-mips/io.h b/include/asm-mips/io.h index 6b17eb9d7..df624e1ee 100644 --- a/include/asm-mips/io.h +++ b/include/asm-mips/io.h @@ -12,7 +12,6 @@ #ifndef _ASM_IO_H #define _ASM_IO_H -#include #include #include #include diff --git a/include/asm-mips/ip32/machine.h b/include/asm-mips/ip32/machine.h index e440fdf4b..1b631b8da 100644 --- a/include/asm-mips/ip32/machine.h +++ b/include/asm-mips/ip32/machine.h @@ -10,7 +10,6 @@ #ifndef _ASM_IP32_MACHINE_H #define _ASM_IP32_MACHINE_H -#include #ifdef CONFIG_SGI_IP32 diff --git a/include/asm-mips/irq.h b/include/asm-mips/irq.h index dde677f02..896550bad 100644 --- a/include/asm-mips/irq.h +++ b/include/asm-mips/irq.h @@ -9,7 +9,6 @@ #ifndef _ASM_IRQ_H #define _ASM_IRQ_H -#include #include #include @@ -77,4 +76,8 @@ extern int setup_irq_smtc(unsigned int irq, struct irqaction * new, unsigned long hwmask); #endif /* CONFIG_MIPS_MT_SMTC */ +#ifdef CONFIG_SMP +#define ARCH_HAS_IRQ_PER_CPU +#endif + #endif /* _ASM_IRQ_H */ diff --git a/include/asm-mips/isadep.h b/include/asm-mips/isadep.h index 7bb003511..24c6cda79 100644 --- a/include/asm-mips/isadep.h +++ b/include/asm-mips/isadep.h @@ -5,7 +5,6 @@ * * Copyright (c) 1998 Harald Koerfgen */ -#include #ifndef __ASM_ISADEP_H #define __ASM_ISADEP_H diff --git a/include/asm-mips/jmr3927/irq.h b/include/asm-mips/jmr3927/irq.h index b0c325a22..fe551f33a 100644 --- a/include/asm-mips/jmr3927/irq.h +++ b/include/asm-mips/jmr3927/irq.h @@ -12,7 +12,6 @@ #ifndef __ASSEMBLY__ -#include #include struct tb_irq_space { diff --git a/include/asm-mips/kmap_types.h b/include/asm-mips/kmap_types.h index 6886a0c3f..806aae3c5 100644 --- a/include/asm-mips/kmap_types.h +++ b/include/asm-mips/kmap_types.h @@ -1,7 +1,6 @@ #ifndef _ASM_KMAP_TYPES_H #define _ASM_KMAP_TYPES_H -#include #ifdef CONFIG_DEBUG_HIGHMEM # define D(n) __KM_FENCE_##n , diff --git a/include/asm-mips/local.h b/include/asm-mips/local.h index c38844f61..9e2d43bae 100644 --- a/include/asm-mips/local.h +++ b/include/asm-mips/local.h @@ -1,7 +1,6 @@ #ifndef _ASM_LOCAL_H #define _ASM_LOCAL_H -#include #include #include diff --git a/include/asm-mips/mach-au1x00/au1000.h b/include/asm-mips/mach-au1x00/au1000.h index 4686e17c2..582acd8ad 100644 --- a/include/asm-mips/mach-au1x00/au1000.h +++ b/include/asm-mips/mach-au1x00/au1000.h @@ -35,7 +35,6 @@ #ifndef _AU1000_H_ #define _AU1000_H_ -#include #ifndef _LANGUAGE_ASSEMBLY diff --git a/include/asm-mips/mach-au1x00/au1xxx.h b/include/asm-mips/mach-au1x00/au1xxx.h index b7b46dd9b..947135941 100644 --- a/include/asm-mips/mach-au1x00/au1xxx.h +++ b/include/asm-mips/mach-au1x00/au1xxx.h @@ -23,7 +23,6 @@ #ifndef _AU1XXX_H_ #define _AU1XXX_H_ -#include #include diff --git a/include/asm-mips/mach-au1x00/au1xxx_dbdma.h b/include/asm-mips/mach-au1x00/au1xxx_dbdma.h index b327bcd3f..d5b38a247 100644 --- a/include/asm-mips/mach-au1x00/au1xxx_dbdma.h +++ b/include/asm-mips/mach-au1x00/au1xxx_dbdma.h @@ -34,7 +34,6 @@ #ifndef _AU1000_DBDMA_H_ #define _AU1000_DBDMA_H_ -#include #ifndef _LANGUAGE_ASSEMBLY diff --git a/include/asm-mips/mach-au1x00/au1xxx_ide.h b/include/asm-mips/mach-au1x00/au1xxx_ide.h index e867b4ef9..301e71300 100644 --- a/include/asm-mips/mach-au1x00/au1xxx_ide.h +++ b/include/asm-mips/mach-au1x00/au1xxx_ide.h @@ -29,7 +29,6 @@ * Note: for more information, please refer "AMD Alchemy Au1200/Au1550 IDE * Interface and Linux Device Driver" Application Note. */ -#include #ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA #define DMA_WAIT_TIMEOUT 100 diff --git a/include/asm-mips/mach-au1x00/au1xxx_psc.h b/include/asm-mips/mach-au1x00/au1xxx_psc.h index 8e5fb3c7d..1bd4e27ca 100644 --- a/include/asm-mips/mach-au1x00/au1xxx_psc.h +++ b/include/asm-mips/mach-au1x00/au1xxx_psc.h @@ -33,14 +33,18 @@ #ifndef _AU1000_PSC_H_ #define _AU1000_PSC_H_ -#include /* The PSC base addresses. */ #ifdef CONFIG_SOC_AU1550 #define PSC0_BASE_ADDR 0xb1a00000 #define PSC1_BASE_ADDR 0xb1b00000 #define PSC2_BASE_ADDR 0xb0a00000 -#define PSC3_BASE_ADDR 0xb0d00000 +#define PSC3_BASE_ADDR 0xb0b00000 +#endif + +#ifdef CONFIG_SOC_AU1200 +#define PSC0_BASE_ADDR 0xb1a00000 +#define PSC1_BASE_ADDR 0xb1b00000 #endif /* The PSC select and control registers are common to @@ -228,6 +232,8 @@ typedef struct psc_i2s { #define PSC_I2SCFG_DD_DISABLE (1 << 27) #define PSC_I2SCFG_DE_ENABLE (1 << 26) #define PSC_I2SCFG_SET_WS(x) (((((x) / 2) - 1) & 0x7f) << 16) +#define PSC_I2SCFG_WS(n) ((n & 0xFF) << 16) +#define PSC_I2SCFG_WS_MASK (PSC_I2SCFG_WS(0x3F)) #define PSC_I2SCFG_WI (1 << 15) #define PSC_I2SCFG_DIV_MASK (3 << 13) @@ -506,7 +512,7 @@ typedef struct psc_smb { /* Transmit register control. */ -#define PSC_SMBTXRX_RSR (1 << 30) +#define PSC_SMBTXRX_RSR (1 << 28) #define PSC_SMBTXRX_STP (1 << 29) #define PSC_SMBTXRX_DATAMASK (0xff) diff --git a/include/asm-mips/mach-au1x00/ioremap.h b/include/asm-mips/mach-au1x00/ioremap.h index d3ec62745..098fca428 100644 --- a/include/asm-mips/mach-au1x00/ioremap.h +++ b/include/asm-mips/mach-au1x00/ioremap.h @@ -9,7 +9,6 @@ #ifndef __ASM_MACH_AU1X00_IOREMAP_H #define __ASM_MACH_AU1X00_IOREMAP_H -#include #include #ifdef CONFIG_64BIT_PHYS_ADDR diff --git a/include/asm-mips/mach-cobalt/cpu-feature-overrides.h b/include/asm-mips/mach-cobalt/cpu-feature-overrides.h index ace8c5ef9..c6dfa59d1 100644 --- a/include/asm-mips/mach-cobalt/cpu-feature-overrides.h +++ b/include/asm-mips/mach-cobalt/cpu-feature-overrides.h @@ -8,7 +8,6 @@ #ifndef __ASM_COBALT_CPU_FEATURE_OVERRIDES_H #define __ASM_COBALT_CPU_FEATURE_OVERRIDES_H -#include #define cpu_has_tlb 1 #define cpu_has_4kex 1 @@ -28,7 +27,7 @@ #define cpu_has_mcheck 0 #define cpu_has_ejtag 0 -#define cpu_has_subset_pcaches 0 +#define cpu_has_inclusive_pcaches 0 #define cpu_dcache_line_size() 32 #define cpu_icache_line_size() 32 #define cpu_scache_line_size() 0 diff --git a/include/asm-mips/mach-db1x00/db1x00.h b/include/asm-mips/mach-db1x00/db1x00.h index 7b28b23f9..0f5f4c29f 100644 --- a/include/asm-mips/mach-db1x00/db1x00.h +++ b/include/asm-mips/mach-db1x00/db1x00.h @@ -28,11 +28,22 @@ #ifndef __ASM_DB1X00_H #define __ASM_DB1X00_H -#include #ifdef CONFIG_MIPS_DB1550 + +#define DBDMA_AC97_TX_CHAN DSCR_CMD0_PSC1_TX +#define DBDMA_AC97_RX_CHAN DSCR_CMD0_PSC1_RX +#define DBDMA_I2S_TX_CHAN DSCR_CMD0_PSC3_TX +#define DBDMA_I2S_RX_CHAN DSCR_CMD0_PSC3_RX + +#define SPI_PSC_BASE PSC0_BASE_ADDR +#define AC97_PSC_BASE PSC1_BASE_ADDR +#define SMBUS_PSC_BASE PSC2_BASE_ADDR +#define I2S_PSC_BASE PSC3_BASE_ADDR + #define BCSR_KSEG1_ADDR 0xAF000000 #define NAND_PHYS_ADDR 0x20000000 + #else #define BCSR_KSEG1_ADDR 0xAE000000 #endif diff --git a/include/asm-mips/mach-ddb5074/mc146818rtc.h b/include/asm-mips/mach-ddb5074/mc146818rtc.h deleted file mode 100644 index 2eb9acb10..000000000 --- a/include/asm-mips/mach-ddb5074/mc146818rtc.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 1998, 2001, 03 by Ralf Baechle - * - * RTC routines for PC style attached Dallas chip. - */ -#ifndef __ASM_MACH_DDB5074_MC146818RTC_H -#define __ASM_MACH_DDB5074_MC146818RTC_H - -#include -#include - -#define RTC_PORT(x) (0x70 + (x)) -#define RTC_IRQ 8 - -static inline unsigned char CMOS_READ(unsigned long addr) -{ - return *(volatile unsigned char *)(KSEG1ADDR(DDB_PCI_MEM_BASE)+addr); -} - -static inline void CMOS_WRITE(unsigned char data, unsigned long addr) -{ - *(volatile unsigned char *)(KSEG1ADDR(DDB_PCI_MEM_BASE)+addr) = data; -} - -#define RTC_ALWAYS_BCD 1 - -#endif /* __ASM_MACH_DDB5074_MC146818RTC_H */ diff --git a/include/asm-mips/mach-dec/mc146818rtc.h b/include/asm-mips/mach-dec/mc146818rtc.h index 6d37a5675..6724e99e4 100644 --- a/include/asm-mips/mach-dec/mc146818rtc.h +++ b/include/asm-mips/mach-dec/mc146818rtc.h @@ -19,6 +19,8 @@ extern volatile u8 *dec_rtc_base; +#define ARCH_RTC_LOCATION + #define RTC_PORT(x) CPHYSADDR((long)dec_rtc_base) #define RTC_IO_EXTENT dec_kn_slot_size #define RTC_IOMAPPED 0 diff --git a/include/asm-mips/mach-dec/param.h b/include/asm-mips/mach-dec/param.h deleted file mode 100644 index 3e4f0e390..000000000 --- a/include/asm-mips/mach-dec/param.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2003 by Ralf Baechle - */ -#ifndef __ASM_MACH_DEC_PARAM_H -#define __ASM_MACH_DEC_PARAM_H - -/* - * log2(HZ), change this here if you want another HZ value. This is also - * used in dec_time_init. Minimum is 1, Maximum is 15. - */ -#define LOG_2_HZ 7 -#define HZ (1 << LOG_2_HZ) - -#endif /* __ASM_MACH_DEC_PARAM_H */ diff --git a/include/asm-mips/mach-generic/floppy.h b/include/asm-mips/mach-generic/floppy.h index 682a5858f..001a8ce17 100644 --- a/include/asm-mips/mach-generic/floppy.h +++ b/include/asm-mips/mach-generic/floppy.h @@ -98,7 +98,7 @@ static inline void fd_disable_irq(void) static inline int fd_request_irq(void) { return request_irq(FLOPPY_IRQ, floppy_interrupt, - SA_INTERRUPT | SA_SAMPLE_RANDOM, "floppy", NULL); + IRQF_DISABLED, "floppy", NULL); } static inline void fd_free_irq(void) diff --git a/include/asm-mips/mach-generic/ide.h b/include/asm-mips/mach-generic/ide.h index e33153595..6eba2e576 100644 --- a/include/asm-mips/mach-generic/ide.h +++ b/include/asm-mips/mach-generic/ide.h @@ -15,7 +15,6 @@ #ifdef __KERNEL__ -#include #include #include #include diff --git a/include/asm-mips/mach-generic/kmalloc.h b/include/asm-mips/mach-generic/kmalloc.h index 373d66dee..410ab5f6c 100644 --- a/include/asm-mips/mach-generic/kmalloc.h +++ b/include/asm-mips/mach-generic/kmalloc.h @@ -1,7 +1,6 @@ #ifndef __ASM_MACH_GENERIC_KMALLOC_H #define __ASM_MACH_GENERIC_KMALLOC_H -#include #ifndef CONFIG_DMA_COHERENT /* diff --git a/include/asm-mips/mach-generic/param.h b/include/asm-mips/mach-generic/param.h deleted file mode 100644 index a0d12f964..000000000 --- a/include/asm-mips/mach-generic/param.h +++ /dev/null @@ -1,13 +0,0 @@ -/* - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2003 by Ralf Baechle - */ -#ifndef __ASM_MACH_GENERIC_PARAM_H -#define __ASM_MACH_GENERIC_PARAM_H - -#define HZ 1000 /* Internal kernel timer frequency */ - -#endif /* __ASM_MACH_GENERIC_PARAM_H */ diff --git a/include/asm-mips/mach-generic/spaces.h b/include/asm-mips/mach-generic/spaces.h index b849d8dd7..0ae9997bc 100644 --- a/include/asm-mips/mach-generic/spaces.h +++ b/include/asm-mips/mach-generic/spaces.h @@ -10,7 +10,6 @@ #ifndef _ASM_MACH_GENERIC_SPACES_H #define _ASM_MACH_GENERIC_SPACES_H -#include #ifdef CONFIG_32BIT diff --git a/include/asm-mips/mach-ip22/cpu-feature-overrides.h b/include/asm-mips/mach-ip22/cpu-feature-overrides.h index 2a37bedb4..f7c5dc8a5 100644 --- a/include/asm-mips/mach-ip22/cpu-feature-overrides.h +++ b/include/asm-mips/mach-ip22/cpu-feature-overrides.h @@ -13,7 +13,7 @@ */ #define cpu_has_tlb 1 #define cpu_has_4kex 1 -#define cpu_has_4kcache 1 +#define cpu_has_4k_cache 1 #define cpu_has_fpu 1 #define cpu_has_32fpr 1 #define cpu_has_counter 1 diff --git a/include/asm-mips/mach-ip22/spaces.h b/include/asm-mips/mach-ip22/spaces.h index 8385f7167..ab20c026f 100644 --- a/include/asm-mips/mach-ip22/spaces.h +++ b/include/asm-mips/mach-ip22/spaces.h @@ -10,7 +10,6 @@ #ifndef _ASM_MACH_IP22_SPACES_H #define _ASM_MACH_IP22_SPACES_H -#include #ifdef CONFIG_32BIT diff --git a/include/asm-mips/mach-ip27/cpu-feature-overrides.h b/include/asm-mips/mach-ip27/cpu-feature-overrides.h index 2d2f5b91e..a071974b6 100644 --- a/include/asm-mips/mach-ip27/cpu-feature-overrides.h +++ b/include/asm-mips/mach-ip27/cpu-feature-overrides.h @@ -31,7 +31,10 @@ #define cpu_has_nofpuex 0 #define cpu_has_64bits 1 -#define cpu_has_subset_pcaches 1 +#define cpu_has_4kex 1 +#define cpu_has_4k_cache 1 + +#define cpu_has_inclusive_pcaches 1 #define cpu_dcache_line_size() 32 #define cpu_icache_line_size() 64 diff --git a/include/asm-mips/mach-ip32/cpu-feature-overrides.h b/include/asm-mips/mach-ip32/cpu-feature-overrides.h index b932237f2..2a3de092b 100644 --- a/include/asm-mips/mach-ip32/cpu-feature-overrides.h +++ b/include/asm-mips/mach-ip32/cpu-feature-overrides.h @@ -9,7 +9,6 @@ #ifndef __ASM_MACH_IP32_CPU_FEATURE_OVERRIDES_H #define __ASM_MACH_IP32_CPU_FEATURE_OVERRIDES_H -#include /* * R5000 has an interesting "restriction": ll(d)/sc(d) @@ -18,7 +17,7 @@ * so, for 64bit IP32 kernel we just don't use ll/sc. * This does not affect luserland. */ -#if defined(CONFIG_CPU_R5000) && defined(CONFIG_MIPS64) +#if (defined(CONFIG_CPU_R5000) || defined(CONFIG_CPU_NEVADA)) && defined(CONFIG_64BIT) #define cpu_has_llsc 0 #else #define cpu_has_llsc 1 @@ -37,5 +36,13 @@ #define cpu_has_ejtag 0 #define cpu_has_vtag_icache 0 #define cpu_has_ic_fills_f_dc 0 +#define cpu_has_dsp 0 +#define cpu_has_4k_cache 1 + + +#define cpu_has_mips32r1 0 +#define cpu_has_mips32r2 0 +#define cpu_has_mips64r1 0 +#define cpu_has_mips64r2 0 #endif /* __ASM_MACH_IP32_CPU_FEATURE_OVERRIDES_H */ diff --git a/include/asm-mips/mach-ip32/kmalloc.h b/include/asm-mips/mach-ip32/kmalloc.h index 9d2d4d9ac..f6198a21f 100644 --- a/include/asm-mips/mach-ip32/kmalloc.h +++ b/include/asm-mips/mach-ip32/kmalloc.h @@ -1,7 +1,6 @@ #ifndef __ASM_MACH_IP32_KMALLOC_H #define __ASM_MACH_IP32_KMALLOC_H -#include #if defined(CONFIG_CPU_R5000) || defined (CONFIG_CPU_RM7000) #define ARCH_KMALLOC_MINALIGN 32 diff --git a/include/asm-mips/mach-ja/cpu-feature-overrides.h b/include/asm-mips/mach-ja/cpu-feature-overrides.h index 90ff08708..84b6dead0 100644 --- a/include/asm-mips/mach-ja/cpu-feature-overrides.h +++ b/include/asm-mips/mach-ja/cpu-feature-overrides.h @@ -31,7 +31,7 @@ #define cpu_has_nofpuex 0 #define cpu_has_64bits 1 -#define cpu_has_subset_pcaches 0 +#define cpu_has_inclusive_pcaches 0 #define cpu_dcache_line_size() 32 #define cpu_icache_line_size() 32 diff --git a/include/asm-mips/mach-jazz/floppy.h b/include/asm-mips/mach-jazz/floppy.h index c9dad99b1..56e9ca6ae 100644 --- a/include/asm-mips/mach-jazz/floppy.h +++ b/include/asm-mips/mach-jazz/floppy.h @@ -90,7 +90,7 @@ static inline void fd_disable_irq(void) static inline int fd_request_irq(void) { return request_irq(FLOPPY_IRQ, floppy_interrupt, - SA_INTERRUPT | SA_SAMPLE_RANDOM, "floppy", NULL); + IRQF_DISABLED, "floppy", NULL); } static inline void fd_free_irq(void) diff --git a/include/asm-mips/mach-jazz/param.h b/include/asm-mips/mach-jazz/param.h deleted file mode 100644 index 639763a51..000000000 --- a/include/asm-mips/mach-jazz/param.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2003 by Ralf Baechle - */ -#ifndef __ASM_MACH_JAZZ_PARAM_H -#define __ASM_MACH_JAZZ_PARAM_H - -/* - * Jazz is currently using the internal 100Hz timer of the R4030 - */ -#define HZ 100 /* Internal kernel timer frequency */ - -#endif /* __ASM_MACH_JAZZ_PARAM_H */ diff --git a/include/asm-mips/mach-mips/cpu-feature-overrides.h b/include/asm-mips/mach-mips/cpu-feature-overrides.h index e06af6c86..7f3e3f9bd 100644 --- a/include/asm-mips/mach-mips/cpu-feature-overrides.h +++ b/include/asm-mips/mach-mips/cpu-feature-overrides.h @@ -9,7 +9,6 @@ #ifndef __ASM_MACH_MIPS_CPU_FEATURE_OVERRIDES_H #define __ASM_MACH_MIPS_CPU_FEATURE_OVERRIDES_H -#include /* * CPU feature overrides for MIPS boards @@ -17,7 +16,7 @@ #ifdef CONFIG_CPU_MIPS32 #define cpu_has_tlb 1 #define cpu_has_4kex 1 -#define cpu_has_4kcache 1 +#define cpu_has_4k_cache 1 /* #define cpu_has_fpu ? */ /* #define cpu_has_32fpr ? */ #define cpu_has_counter 1 @@ -40,14 +39,14 @@ #define cpu_has_nofpuex 0 /* #define cpu_has_64bits ? */ /* #define cpu_has_64bit_zero_reg ? */ -/* #define cpu_has_subset_pcaches ? */ +/* #define cpu_has_inclusive_pcaches ? */ #define cpu_icache_snoops_remote_store 1 #endif #ifdef CONFIG_CPU_MIPS64 #define cpu_has_tlb 1 #define cpu_has_4kex 1 -#define cpu_has_4kcache 1 +#define cpu_has_4k_cache 1 /* #define cpu_has_fpu ? */ /* #define cpu_has_32fpr ? */ #define cpu_has_counter 1 @@ -66,7 +65,7 @@ #define cpu_has_nofpuex 0 /* #define cpu_has_64bits ? */ /* #define cpu_has_64bit_zero_reg ? */ -/* #define cpu_has_subset_pcaches ? */ +/* #define cpu_has_inclusive_pcaches ? */ #define cpu_icache_snoops_remote_store 1 #endif diff --git a/include/asm-mips/mach-mips/irq.h b/include/asm-mips/mach-mips/irq.h index f8579696c..e994b0c01 100644 --- a/include/asm-mips/mach-mips/irq.h +++ b/include/asm-mips/mach-mips/irq.h @@ -1,14 +1,7 @@ #ifndef __ASM_MACH_MIPS_IRQ_H #define __ASM_MACH_MIPS_IRQ_H -#include #define NR_IRQS 256 -#ifdef CONFIG_SMP - -#define ARCH_HAS_IRQ_PER_CPU - -#endif - #endif /* __ASM_MACH_MIPS_IRQ_H */ diff --git a/include/asm-mips/mach-mips/param.h b/include/asm-mips/mach-mips/param.h deleted file mode 100644 index 805ef6d27..000000000 --- a/include/asm-mips/mach-mips/param.h +++ /dev/null @@ -1,13 +0,0 @@ -/* - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2003 by Ralf Baechle - */ -#ifndef __ASM_MACH_MIPS_PARAM_H -#define __ASM_MACH_MIPS_PARAM_H - -#define HZ 100 /* Internal kernel timer frequency */ - -#endif /* __ASM_MACH_MIPS_PARAM_H */ diff --git a/include/asm-mips/mach-ocelot3/cpu-feature-overrides.h b/include/asm-mips/mach-ocelot3/cpu-feature-overrides.h index 782b98624..57a12ded0 100644 --- a/include/asm-mips/mach-ocelot3/cpu-feature-overrides.h +++ b/include/asm-mips/mach-ocelot3/cpu-feature-overrides.h @@ -34,7 +34,7 @@ #define cpu_has_nofpuex 0 #define cpu_has_64bits 1 -#define cpu_has_subset_pcaches 0 +#define cpu_has_inclusive_pcaches 0 #define cpu_dcache_line_size() 32 #define cpu_icache_line_size() 32 diff --git a/include/asm-mips/mach-pb1x00/pb1550.h b/include/asm-mips/mach-pb1x00/pb1550.h index 9578ead11..9a4955ce3 100644 --- a/include/asm-mips/mach-pb1x00/pb1550.h +++ b/include/asm-mips/mach-pb1x00/pb1550.h @@ -27,7 +27,6 @@ #ifndef __ASM_PB1550_H #define __ASM_PB1550_H -#include #include #define DBDMA_AC97_TX_CHAN DSCR_CMD0_PSC1_TX diff --git a/include/asm-mips/mach-qemu/param.h b/include/asm-mips/mach-qemu/param.h deleted file mode 100644 index cb30ee490..000000000 --- a/include/asm-mips/mach-qemu/param.h +++ /dev/null @@ -1,13 +0,0 @@ -/* - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2005 by Ralf Baechle - */ -#ifndef __ASM_MACH_QEMU_PARAM_H -#define __ASM_MACH_QEMU_PARAM_H - -#define HZ 100 /* Internal kernel timer frequency */ - -#endif /* __ASM_MACH_QEMU_PARAM_H */ diff --git a/include/asm-mips/mach-rm200/cpu-feature-overrides.h b/include/asm-mips/mach-rm200/cpu-feature-overrides.h index 91e7cf5f2..11410ae10 100644 --- a/include/asm-mips/mach-rm200/cpu-feature-overrides.h +++ b/include/asm-mips/mach-rm200/cpu-feature-overrides.h @@ -14,7 +14,7 @@ #define cpu_has_tlb 1 #define cpu_has_4kex 1 -#define cpu_has_4kcache 1 +#define cpu_has_4k_cache 1 #define cpu_has_fpu 1 #define cpu_has_32fpr 1 #define cpu_has_counter 1 @@ -35,10 +35,8 @@ #define cpu_has_nofpuex 0 #define cpu_has_64bits 1 -#define cpu_has_subset_pcaches 0 /* No S-cache on R5000 I think ... */ #define cpu_dcache_line_size() 32 #define cpu_icache_line_size() 32 -#define cpu_scache_line_size() 0 /* No S-cache on R5000 I think ... */ #define cpu_has_mips32r1 0 #define cpu_has_mips32r2 0 diff --git a/include/asm-mips/mach-sibyte/cpu-feature-overrides.h b/include/asm-mips/mach-sibyte/cpu-feature-overrides.h index 193a666cd..a25968f27 100644 --- a/include/asm-mips/mach-sibyte/cpu-feature-overrides.h +++ b/include/asm-mips/mach-sibyte/cpu-feature-overrides.h @@ -31,7 +31,7 @@ #define cpu_has_nofpuex 0 #define cpu_has_64bits 1 -#define cpu_has_subset_pcaches 0 +#define cpu_has_inclusive_pcaches 0 #define cpu_dcache_line_size() 32 #define cpu_icache_line_size() 32 diff --git a/include/asm-mips/mach-sim/cpu-feature-overrides.h b/include/asm-mips/mach-sim/cpu-feature-overrides.h index cadbe8eda..779b02205 100644 --- a/include/asm-mips/mach-sim/cpu-feature-overrides.h +++ b/include/asm-mips/mach-sim/cpu-feature-overrides.h @@ -8,7 +8,6 @@ #ifndef __ASM_MACH_SIM_CPU_FEATURE_OVERRIDES_H #define __ASM_MACH_SIM_CPU_FEATURE_OVERRIDES_H -#include /* * CPU feature overrides for MIPS boards @@ -16,7 +15,7 @@ #ifdef CONFIG_CPU_MIPS32 #define cpu_has_tlb 1 #define cpu_has_4kex 1 -#define cpu_has_4kcache 1 +#define cpu_has_4k_cache 1 #define cpu_has_fpu 0 /* #define cpu_has_32fpr ? */ #define cpu_has_counter 1 @@ -35,13 +34,13 @@ #define cpu_has_nofpuex 0 /* #define cpu_has_64bits ? */ /* #define cpu_has_64bit_zero_reg ? */ -/* #define cpu_has_subset_pcaches ? */ +/* #define cpu_has_inclusive_pcaches ? */ #endif #ifdef CONFIG_CPU_MIPS64 #define cpu_has_tlb 1 #define cpu_has_4kex 1 -#define cpu_has_4kcache 1 +#define cpu_has_4k_cache 1 /* #define cpu_has_fpu ? */ /* #define cpu_has_32fpr ? */ #define cpu_has_counter 1 @@ -60,7 +59,7 @@ #define cpu_has_nofpuex 0 /* #define cpu_has_64bits ? */ /* #define cpu_has_64bit_zero_reg ? */ -/* #define cpu_has_subset_pcaches ? */ +/* #define cpu_has_inclusive_pcaches ? */ #endif #endif /* __ASM_MACH_MIPS_CPU_FEATURE_OVERRIDES_H */ diff --git a/include/asm-mips/mach-yosemite/cpu-feature-overrides.h b/include/asm-mips/mach-yosemite/cpu-feature-overrides.h index 58603e3da..42cebb7ce 100644 --- a/include/asm-mips/mach-yosemite/cpu-feature-overrides.h +++ b/include/asm-mips/mach-yosemite/cpu-feature-overrides.h @@ -25,21 +25,21 @@ #define cpu_has_vtag_icache 0 #define cpu_has_dc_aliases 0 #define cpu_has_ic_fills_f_dc 0 +#define cpu_has_dsp 0 #define cpu_icache_snoops_remote_store 0 #define cpu_has_nofpuex 0 #define cpu_has_64bits 1 -#define cpu_has_subset_pcaches 0 +#define cpu_has_inclusive_pcaches 0 #define cpu_dcache_line_size() 32 #define cpu_icache_line_size() 32 #define cpu_scache_line_size() 32 -/* - * On the RM9000 we need to ensure that I-cache lines being fetches only - * contain valid instructions are funny things will happen. - */ -#define PLAT_TRAMPOLINE_STUFF_LINE 32UL +#define cpu_has_mips32r1 0 +#define cpu_has_mips32r2 0 +#define cpu_has_mips64r1 0 +#define cpu_has_mips64r2 0 #endif /* __ASM_MACH_YOSEMITE_CPU_FEATURE_OVERRIDES_H */ diff --git a/include/asm-mips/mips-boards/generic.h b/include/asm-mips/mips-boards/generic.h index fa8b913cc..b98f1658c 100644 --- a/include/asm-mips/mips-boards/generic.h +++ b/include/asm-mips/mips-boards/generic.h @@ -20,7 +20,6 @@ #ifndef __ASM_MIPS_BOARDS_GENERIC_H #define __ASM_MIPS_BOARDS_GENERIC_H -#include #include #include #include diff --git a/include/asm-mips/mipsregs.h b/include/asm-mips/mipsregs.h index 5af7517fc..1f318d707 100644 --- a/include/asm-mips/mipsregs.h +++ b/include/asm-mips/mipsregs.h @@ -13,7 +13,6 @@ #ifndef _ASM_MIPSREGS_H #define _ASM_MIPSREGS_H -#include #include #include @@ -471,6 +470,8 @@ /* Bits specific to the VR41xx. */ #define VR41_CONF_CS (_ULCAST_(1) << 12) +#define VR41_CONF_P4K (_ULCAST_(1) << 13) +#define VR41_CONF_BP (_ULCAST_(1) << 16) #define VR41_CONF_M16 (_ULCAST_(1) << 20) #define VR41_CONF_AD (_ULCAST_(1) << 23) @@ -1417,7 +1418,7 @@ change_c0_##name(unsigned int change, unsigned int new) \ #else /* SMTC versions that manage MT scheduling */ -#include +#include /* * This is a duplicate of dmt() in mipsmtregs.h to avoid problems with @@ -1451,18 +1452,17 @@ static inline void __emt(unsigned int previous) { if ((previous & __EMT_ENABLE)) __asm__ __volatile__( - " .set noreorder \n" " .set mips32r2 \n" " .word 0x41600be1 # emt \n" " ehb \n" - " .set mips0 \n" - " .set reorder \n"); + " .set mips0 \n"); } static inline void __ehb(void) { __asm__ __volatile__( - " ehb \n"); + " .set mips32r2 \n" + " ehb \n" " .set mips0 \n"); } /* diff --git a/include/asm-mips/mmu_context.h b/include/asm-mips/mmu_context.h index 6e09f4c87..18b69de87 100644 --- a/include/asm-mips/mmu_context.h +++ b/include/asm-mips/mmu_context.h @@ -11,7 +11,6 @@ #ifndef _ASM_MMU_CONTEXT_H #define _ASM_MMU_CONTEXT_H -#include #include #include #include diff --git a/include/asm-mips/mmzone.h b/include/asm-mips/mmzone.h index 7bde44320..f53ec54c9 100644 --- a/include/asm-mips/mmzone.h +++ b/include/asm-mips/mmzone.h @@ -5,26 +5,13 @@ #ifndef _ASM_MMZONE_H_ #define _ASM_MMZONE_H_ -#include #include #include #ifdef CONFIG_DISCONTIGMEM -#define kvaddr_to_nid(kvaddr) pa_to_nid(__pa(kvaddr)) #define pfn_to_nid(pfn) pa_to_nid((pfn) << PAGE_SHIFT) -#define pfn_valid(pfn) \ -({ \ - unsigned long __pfn = (pfn); \ - int __n = pfn_to_nid(__pfn); \ - ((__n >= 0) ? (__pfn < NODE_DATA(__n)->node_start_pfn + \ - NODE_DATA(__n)->node_spanned_pages) : 0);\ -}) - -/* XXX: FIXME -- wli */ -#define kern_addr_valid(addr) (0) - #endif /* CONFIG_DISCONTIGMEM */ #endif /* _ASM_MMZONE_H_ */ diff --git a/include/asm-mips/module.h b/include/asm-mips/module.h index 3e3ba057a..694f97959 100644 --- a/include/asm-mips/module.h +++ b/include/asm-mips/module.h @@ -1,7 +1,6 @@ #ifndef _ASM_MODULE_H #define _ASM_MODULE_H -#include #include #include diff --git a/include/asm-mips/msgbuf.h b/include/asm-mips/msgbuf.h index a15339597..0d6c7f14d 100644 --- a/include/asm-mips/msgbuf.h +++ b/include/asm-mips/msgbuf.h @@ -1,7 +1,6 @@ #ifndef _ASM_MSGBUF_H #define _ASM_MSGBUF_H -#include /* * The msqid64_ds structure for the MIPS architecture. diff --git a/include/asm-mips/paccess.h b/include/asm-mips/paccess.h index 46f2d23d2..147844ef1 100644 --- a/include/asm-mips/paccess.h +++ b/include/asm-mips/paccess.h @@ -13,7 +13,6 @@ #ifndef _ASM_PACCESS_H #define _ASM_PACCESS_H -#include #include #ifdef CONFIG_32BIT diff --git a/include/asm-mips/page.h b/include/asm-mips/page.h index 7a18d1a66..43131ed89 100644 --- a/include/asm-mips/page.h +++ b/include/asm-mips/page.h @@ -9,14 +9,11 @@ #ifndef _ASM_PAGE_H #define _ASM_PAGE_H -#include #ifdef __KERNEL__ #include -#endif - /* * PAGE_SHIFT determines the page size */ @@ -35,8 +32,6 @@ #define PAGE_SIZE (1UL << PAGE_SHIFT) #define PAGE_MASK (~((1 << PAGE_SHIFT) - 1)) - -#ifdef __KERNEL__ #ifndef __ASSEMBLY__ extern void clear_page(void * page); @@ -139,10 +134,25 @@ typedef struct { unsigned long pgprot; } pgprot_t; #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) -#ifndef CONFIG_SPARSEMEM -#ifndef CONFIG_NEED_MULTIPLE_NODES +#ifdef CONFIG_FLATMEM + #define pfn_valid(pfn) ((pfn) < max_mapnr) -#endif + +#elif defined(CONFIG_SPARSEMEM) + +/* pfn_valid is defined in linux/mmzone.h */ + +#elif defined(CONFIG_NEED_MULTIPLE_NODES) + +#define pfn_valid(pfn) \ +({ \ + unsigned long __pfn = (pfn); \ + int __n = pfn_to_nid(__pfn); \ + ((__n >= 0) ? (__pfn < NODE_DATA(__n)->node_start_pfn + \ + NODE_DATA(__n)->node_spanned_pages) \ + : 0); \ +}) + #endif #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) @@ -154,8 +164,6 @@ typedef struct { unsigned long pgprot; } pgprot_t; #define UNCAC_ADDR(addr) ((addr) - PAGE_OFFSET + UNCAC_BASE) #define CAC_ADDR(addr) ((addr) - UNCAC_BASE + PAGE_OFFSET) -#endif /* defined (__KERNEL__) */ - #ifdef CONFIG_LIMITED_DMA #define WANT_PAGE_VIRTUAL #endif @@ -163,6 +171,8 @@ typedef struct { unsigned long pgprot; } pgprot_t; #include #include +#endif /* defined (__KERNEL__) */ + #define devmem_is_allowed(x) 1 #endif /* _ASM_PAGE_H */ diff --git a/include/asm-mips/param.h b/include/asm-mips/param.h index 2bead8273..1d9bb8c5a 100644 --- a/include/asm-mips/param.h +++ b/include/asm-mips/param.h @@ -11,7 +11,7 @@ #ifdef __KERNEL__ -# include /* Internal kernel timer frequency */ +# 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() */ #endif diff --git a/include/asm-mips/pci.h b/include/asm-mips/pci.h index 6c9ad8171..c4d68bebd 100644 --- a/include/asm-mips/pci.h +++ b/include/asm-mips/pci.h @@ -6,7 +6,6 @@ #ifndef _ASM_PCI_H #define _ASM_PCI_H -#include #include #ifdef __KERNEL__ diff --git a/include/asm-mips/pci/bridge.h b/include/asm-mips/pci/bridge.h index b4ee995c5..0c45e7598 100644 --- a/include/asm-mips/pci/bridge.h +++ b/include/asm-mips/pci/bridge.h @@ -15,6 +15,7 @@ #include #include #include /* generic widget header */ +#include /* I/O page size */ @@ -848,4 +849,6 @@ struct bridge_controller { extern void register_bridge_irq(unsigned int irq); extern int request_bridge_irq(struct bridge_controller *bc); +extern struct pci_ops bridge_pci_ops; + #endif /* _ASM_PCI_BRIDGE_H */ diff --git a/include/asm-mips/pgalloc.h b/include/asm-mips/pgalloc.h index fe1df5723..582c1fe6c 100644 --- a/include/asm-mips/pgalloc.h +++ b/include/asm-mips/pgalloc.h @@ -9,7 +9,6 @@ #ifndef _ASM_PGALLOC_H #define _ASM_PGALLOC_H -#include #include #include diff --git a/include/asm-mips/pgtable-32.h b/include/asm-mips/pgtable-32.h index 087c20769..4b26d8528 100644 --- a/include/asm-mips/pgtable-32.h +++ b/include/asm-mips/pgtable-32.h @@ -9,7 +9,6 @@ #ifndef _ASM_PGTABLE_32_H #define _ASM_PGTABLE_32_H -#include #include #include diff --git a/include/asm-mips/pgtable-64.h b/include/asm-mips/pgtable-64.h index 2faf5c9ff..e3db93212 100644 --- a/include/asm-mips/pgtable-64.h +++ b/include/asm-mips/pgtable-64.h @@ -9,7 +9,6 @@ #ifndef _ASM_PGTABLE_64_H #define _ASM_PGTABLE_64_H -#include #include #include diff --git a/include/asm-mips/pgtable-bits.h b/include/asm-mips/pgtable-bits.h index 01e76e932..7494ba911 100644 --- a/include/asm-mips/pgtable-bits.h +++ b/include/asm-mips/pgtable-bits.h @@ -10,7 +10,6 @@ #ifndef _ASM_PGTABLE_BITS_H #define _ASM_PGTABLE_BITS_H -#include /* * Note that we shift the lower 32bits of each EntryLo[01] entry diff --git a/include/asm-mips/pgtable.h b/include/asm-mips/pgtable.h index d0af2a3b0..a36ca1be1 100644 --- a/include/asm-mips/pgtable.h +++ b/include/asm-mips/pgtable.h @@ -8,7 +8,6 @@ #ifndef _ASM_PGTABLE_H #define _ASM_PGTABLE_H -#include #ifdef CONFIG_32BIT #include #endif @@ -379,9 +378,7 @@ static inline void update_mmu_cache(struct vm_area_struct *vma, __update_cache(vma, address, pte); } -#ifndef CONFIG_NEED_MULTIPLE_NODES #define kern_addr_valid(addr) (1) -#endif #ifdef CONFIG_64BIT_PHYS_ADDR extern int remap_pfn_range(struct vm_area_struct *vma, unsigned long from, unsigned long pfn, unsigned long size, pgprot_t prot); diff --git a/include/asm-mips/prefetch.h b/include/asm-mips/prefetch.h index 71293ec16..17850834c 100644 --- a/include/asm-mips/prefetch.h +++ b/include/asm-mips/prefetch.h @@ -8,7 +8,6 @@ #ifndef __ASM_PREFETCH_H #define __ASM_PREFETCH_H -#include /* * R5000 and RM5200 implements pref and prefx instructions but they're nops, so diff --git a/include/asm-mips/processor.h b/include/asm-mips/processor.h index 0fb75f076..5f80ba71a 100644 --- a/include/asm-mips/processor.h +++ b/include/asm-mips/processor.h @@ -11,7 +11,6 @@ #ifndef _ASM_PROCESSOR_H #define _ASM_PROCESSOR_H -#include #include #include @@ -71,11 +70,6 @@ extern unsigned int vced_count, vcei_count; typedef __u64 fpureg_t; -struct mips_fpu_hard_struct { - fpureg_t fpr[NUM_FPU_REGS]; - unsigned int fcr31; -}; - /* * It would be nice to add some more fields for emulator statistics, but there * are a number of fixed offsets in offset.h and elsewhere that would have to @@ -83,18 +77,13 @@ struct mips_fpu_hard_struct { * the FPU emulator for now. See asm-mips/fpu_emulator.h. */ -struct mips_fpu_soft_struct { +struct mips_fpu_struct { fpureg_t fpr[NUM_FPU_REGS]; unsigned int fcr31; }; -union mips_fpu_union { - struct mips_fpu_hard_struct hard; - struct mips_fpu_soft_struct soft; -}; - #define INIT_FPU { \ - {{0,},} \ + {0,} \ } #define NUM_DSP_REGS 6 @@ -133,7 +122,7 @@ struct thread_struct { unsigned long cp0_status; /* Saved fpu/fpu emulator stuff. */ - union mips_fpu_union fpu; + struct mips_fpu_struct fpu; #ifdef CONFIG_MIPS_MT_FPAFF /* Emulated instruction count */ unsigned long emulated_fp; diff --git a/include/asm-mips/ptrace.h b/include/asm-mips/ptrace.h index fa9d8713c..4113316ee 100644 --- a/include/asm-mips/ptrace.h +++ b/include/asm-mips/ptrace.h @@ -9,7 +9,6 @@ #ifndef _ASM_PTRACE_H #define _ASM_PTRACE_H -#include #include diff --git a/include/asm-mips/qemu.h b/include/asm-mips/qemu.h index 905c39585..531caf445 100644 --- a/include/asm-mips/qemu.h +++ b/include/asm-mips/qemu.h @@ -21,4 +21,10 @@ */ #define QEMU_C0_COUNTER_CLOCK 100000000 +/* + * Magic qemu system control location. + */ +#define QEMU_RESTART_REG 0xBFBF0000 +#define QEMU_HALT_REG 0xBFBF0004 + #endif /* __ASM_QEMU_H */ diff --git a/include/asm-mips/reg.h b/include/asm-mips/reg.h index 7b33bbca9..634b55d7e 100644 --- a/include/asm-mips/reg.h +++ b/include/asm-mips/reg.h @@ -12,9 +12,8 @@ #ifndef __ASM_MIPS_REG_H #define __ASM_MIPS_REG_H -#include -#if defined(CONFIG_MIPS32) || defined(WANT_COMPAT_REG_H) +#if defined(CONFIG_32BIT) || defined(WANT_COMPAT_REG_H) #define EF_R0 6 #define EF_R1 7 @@ -70,7 +69,7 @@ #endif -#if CONFIG_MIPS64 +#ifdef CONFIG_64BIT #define EF_R0 0 #define EF_R1 1 @@ -124,6 +123,6 @@ #define EF_SIZE 304 /* size in bytes */ -#endif /* CONFIG_MIPS64 */ +#endif /* CONFIG_64BIT */ #endif /* __ASM_MIPS_REG_H */ diff --git a/include/asm-mips/resource.h b/include/asm-mips/resource.h index 1fba00c22..87cb30852 100644 --- a/include/asm-mips/resource.h +++ b/include/asm-mips/resource.h @@ -9,7 +9,6 @@ #ifndef _ASM_RESOURCE_H #define _ASM_RESOURCE_H -#include /* * These five resource limit IDs have a MIPS/Linux-specific ordering, diff --git a/include/asm-mips/serial.h b/include/asm-mips/serial.h index 7196ceb0e..584bd9c0a 100644 --- a/include/asm-mips/serial.h +++ b/include/asm-mips/serial.h @@ -9,7 +9,6 @@ #ifndef _ASM_SERIAL_H #define _ASM_SERIAL_H -#include /* * This assumes you have a 1.8432 MHz clock for your UART. diff --git a/include/asm-mips/sgiarcs.h b/include/asm-mips/sgiarcs.h index 722b77a8c..ddb859d05 100644 --- a/include/asm-mips/sgiarcs.h +++ b/include/asm-mips/sgiarcs.h @@ -12,7 +12,6 @@ #ifndef _ASM_SGIARCS_H #define _ASM_SGIARCS_H -#include #include #include diff --git a/include/asm-mips/sibyte/board.h b/include/asm-mips/sibyte/board.h index 900edcbee..3dfe29ed4 100644 --- a/include/asm-mips/sibyte/board.h +++ b/include/asm-mips/sibyte/board.h @@ -19,7 +19,6 @@ #ifndef _SIBYTE_BOARD_H #define _SIBYTE_BOARD_H -#include #if defined(CONFIG_SIBYTE_SWARM) || defined(CONFIG_SIBYTE_PTSWARM) || \ defined(CONFIG_SIBYTE_CRHONE) || defined(CONFIG_SIBYTE_CRHINE) || \ diff --git a/include/asm-mips/sibyte/carmel.h b/include/asm-mips/sibyte/carmel.h index b5e7dae19..57c53e62a 100644 --- a/include/asm-mips/sibyte/carmel.h +++ b/include/asm-mips/sibyte/carmel.h @@ -18,7 +18,6 @@ #ifndef __ASM_SIBYTE_CARMEL_H #define __ASM_SIBYTE_CARMEL_H -#include #include #include diff --git a/include/asm-mips/sibyte/sentosa.h b/include/asm-mips/sibyte/sentosa.h index 824605847..64c47874f 100644 --- a/include/asm-mips/sibyte/sentosa.h +++ b/include/asm-mips/sibyte/sentosa.h @@ -18,7 +18,6 @@ #ifndef __ASM_SIBYTE_SENTOSA_H #define __ASM_SIBYTE_SENTOSA_H -#include #include #include diff --git a/include/asm-mips/sibyte/swarm.h b/include/asm-mips/sibyte/swarm.h index 06e1d528e..86db37e5a 100644 --- a/include/asm-mips/sibyte/swarm.h +++ b/include/asm-mips/sibyte/swarm.h @@ -18,7 +18,6 @@ #ifndef __ASM_SIBYTE_SWARM_H #define __ASM_SIBYTE_SWARM_H -#include #include #include diff --git a/include/asm-mips/siginfo.h b/include/asm-mips/siginfo.h index 2ba313d94..2e32949bd 100644 --- a/include/asm-mips/siginfo.h +++ b/include/asm-mips/siginfo.h @@ -9,7 +9,6 @@ #ifndef _ASM_SIGINFO_H #define _ASM_SIGINFO_H -#include #define __ARCH_SIGEV_PREAMBLE_SIZE (sizeof(long) + 2*sizeof(int)) #undef __ARCH_SI_TRAPNO /* exception code needs to fill this ... */ diff --git a/include/asm-mips/signal.h b/include/asm-mips/signal.h index d8349e4b5..87a1dff95 100644 --- a/include/asm-mips/signal.h +++ b/include/asm-mips/signal.h @@ -9,7 +9,6 @@ #ifndef _ASM_SIGNAL_H #define _ASM_SIGNAL_H -#include #include #define _NSIG 128 @@ -65,7 +64,6 @@ typedef unsigned long old_sigset_t; /* at least 32 bits */ * SA_FLAGS values: * * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. * SA_RESETHAND clears the handler when the signal is delivered. @@ -85,7 +83,6 @@ typedef unsigned long old_sigset_t; /* at least 32 bits */ #define SA_NOMASK SA_NODEFER #define SA_ONESHOT SA_RESETHAND -#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ #define SA_RESTORER 0x04000000 /* Only for o32 */ @@ -100,15 +97,6 @@ typedef unsigned long old_sigset_t; /* at least 32 bits */ #ifdef __KERNEL__ -/* - * These values of sa_flags are used only by the kernel as part of the - * irq handling routines. - * - * SA_INTERRUPT is also used by the irq handling routines. - * SA_SHIRQ flag is for shared interrupt support on PCI and EISA. - */ -#define SA_SAMPLE_RANDOM SA_RESTART - #ifdef CONFIG_TRAD_SIGNALS #define sig_uses_siginfo(ka) ((ka)->sa.sa_flags & SA_SIGINFO) #else diff --git a/include/asm-mips/sim.h b/include/asm-mips/sim.h index 9c2af1b00..67c4fe52b 100644 --- a/include/asm-mips/sim.h +++ b/include/asm-mips/sim.h @@ -9,7 +9,6 @@ #ifndef _ASM_SIM_H #define _ASM_SIM_H -#include #include diff --git a/include/asm-mips/smp.h b/include/asm-mips/smp.h index e14e4b69d..1608fd71d 100644 --- a/include/asm-mips/smp.h +++ b/include/asm-mips/smp.h @@ -11,7 +11,6 @@ #ifndef __ASM_SMP_H #define __ASM_SMP_H -#include #ifdef CONFIG_SMP diff --git a/include/asm-mips/sn/addrs.h b/include/asm-mips/sn/addrs.h index 2b5cef1ba..8fa0af6b6 100644 --- a/include/asm-mips/sn/addrs.h +++ b/include/asm-mips/sn/addrs.h @@ -9,7 +9,6 @@ #ifndef _ASM_SN_ADDRS_H #define _ASM_SN_ADDRS_H -#include #ifndef __ASSEMBLY__ #include @@ -27,13 +26,8 @@ #ifndef __ASSEMBLY__ -#if defined(CONFIG_SGI_IO) /* FIXME */ -#define PS_UINT_CAST (__psunsigned_t) -#define UINT64_CAST (__uint64_t) -#else /* CONFIG_SGI_IO */ #define PS_UINT_CAST (unsigned long) #define UINT64_CAST (unsigned long) -#endif /* CONFIG_SGI_IO */ #define HUBREG_CAST (volatile hubreg_t *) @@ -253,14 +247,6 @@ * for _x. */ -#ifdef _STANDALONE - -/* DO NOT USE THESE DIRECTLY IN THE KERNEL. SEE BELOW. */ -#define LOCAL_HUB(_x) (HUBREG_CAST (IALIAS_BASE + (_x))) -#define REMOTE_HUB(_n, _x) (HUBREG_CAST (NODE_SWIN_BASE(_n, 1) + \ - 0x800000 + (_x))) -#endif /* _STANDALONE */ - /* * WARNING: * When certain Hub chip workaround are defined, it's not sufficient @@ -327,20 +313,6 @@ PHYS_TO_K0(NODE_OFFSET(nasid) | ARCS_SPB_OFFSET) #define ARCS_SPB_SIZE 0x0400 -#ifdef _STANDALONE - -#define ARCS_TVECTOR_OFFSET 0x2800 -#define ARCS_PVECTOR_OFFSET 0x2c00 - -/* - * These addresses are used by the master CPU to install the transfer - * and private vectors. All others use the SPB to find them. - */ -#define TVADDR (NODE_CAC_BASE(get_nasid()) + ARCS_TVECTOR_OFFSET) -#define PVADDR (NODE_CAC_BASE(get_nasid()) + ARCS_PVECTOR_OFFSET) - -#endif /* _STANDALONE */ - #define KLDIR_OFFSET 0x2000 #define KLDIR_ADDR(nasid) \ TO_NODE_UNCAC((nasid), KLDIR_OFFSET) diff --git a/include/asm-mips/sn/agent.h b/include/asm-mips/sn/agent.h index d6df13aae..ac4ea85c3 100644 --- a/include/asm-mips/sn/agent.h +++ b/include/asm-mips/sn/agent.h @@ -11,7 +11,6 @@ #ifndef _ASM_SGI_SN_AGENT_H #define _ASM_SGI_SN_AGENT_H -#include #include #include #include diff --git a/include/asm-mips/sn/arch.h b/include/asm-mips/sn/arch.h index d247a819d..51174af6a 100644 --- a/include/asm-mips/sn/arch.h +++ b/include/asm-mips/sn/arch.h @@ -11,7 +11,6 @@ #ifndef _ASM_SN_ARCH_H #define _ASM_SN_ARCH_H -#include #include #include #ifdef CONFIG_SGI_IP27 diff --git a/include/asm-mips/sn/io.h b/include/asm-mips/sn/io.h index 13326453e..ab2fa8cd2 100644 --- a/include/asm-mips/sn/io.h +++ b/include/asm-mips/sn/io.h @@ -9,7 +9,6 @@ #ifndef _ASM_SN_IO_H #define _ASM_SN_IO_H -#include #if defined (CONFIG_SGI_IP27) #include #endif diff --git a/include/asm-mips/sn/ioc3.h b/include/asm-mips/sn/ioc3.h index f7d530f30..099677774 100644 --- a/include/asm-mips/sn/ioc3.h +++ b/include/asm-mips/sn/ioc3.h @@ -5,6 +5,8 @@ #ifndef _IOC3_H #define _IOC3_H +#include + /* SUPERIO uart register map */ typedef volatile struct ioc3_uartregs { union { diff --git a/include/asm-mips/sn/klconfig.h b/include/asm-mips/sn/klconfig.h index 9709ff701..b63cd0655 100644 --- a/include/asm-mips/sn/klconfig.h +++ b/include/asm-mips/sn/klconfig.h @@ -27,7 +27,6 @@ * that offsets of existing fields do not change. */ -#include #include #include @@ -37,7 +36,7 @@ //#include // XXX Stolen from : #define MAX_ROUTER_PORTS (6) /* Max. number of ports on a router */ -#include +#include //#include //#include @@ -54,32 +53,21 @@ #include #include #include -#if defined(CONFIG_SGI_IO) || defined(CONFIG_SGI_IP35) +#if defined(CONFIG_SGI_IP35) // The hack file has to be before vector and after sn0_fru.... #include #include #include -#endif /* CONFIG_SGI_IO || CONFIG_SGI_IP35 */ +#endif /* CONFIG_SGI_IP35 */ #endif /* CONFIG_SGI_IP27 || CONFIG_SGI_IP35 */ #define KLCFGINFO_MAGIC 0xbeedbabe -#ifdef FRUTEST -typedef u64 klconf_off_t; -#else typedef s32 klconf_off_t; -#endif /* * Some IMPORTANT OFFSETS. These are the offsets on all NODES. */ -#if 0 -#define RAMBASE 0 -#define ARCSSPB_OFF 0x1000 /* shift it to sys/arcs/spb.h */ - -#define OFF_HWGRAPH 0 -#endif - #define MAX_MODULE_ID 255 #define SIZE_PAD 4096 /* 4k padding for structures */ /* @@ -134,15 +122,9 @@ typedef s32 klconf_off_t; typedef struct console_s { -#if defined(CONFIG_SGI_IO) /* FIXME */ - __psunsigned_t uart_base; - __psunsigned_t config_base; - __psunsigned_t memory_base; -#else unsigned long uart_base; unsigned long config_base; unsigned long memory_base; -#endif short baud; short flag; int type; @@ -174,10 +156,6 @@ typedef struct kl_config_hdr { #define KL_CONFIG_HDR(_nasid) ((kl_config_hdr_t *)(KLCONFIG_ADDR(_nasid))) -#if 0 -#define KL_CONFIG_MALLOC_HDR(_nasid) \ - (KL_CONFIG_HDR(_nasid)->ch_malloc_hdr) -#endif #define KL_CONFIG_INFO_OFFSET(_nasid) \ (KL_CONFIG_HDR(_nasid)->ch_board_info) #define KL_CONFIG_INFO_SET_OFFSET(_nasid, _off) \ @@ -197,23 +175,13 @@ typedef struct kl_config_hdr { /* --- New Macros for the changed kl_config_hdr_t structure --- */ -#if defined(CONFIG_SGI_IO) -#define PTR_CH_MALLOC_HDR(_k) ((klc_malloc_hdr_t *)\ - ((__psunsigned_t)_k + (_k->ch_malloc_hdr_off))) -#else #define PTR_CH_MALLOC_HDR(_k) ((klc_malloc_hdr_t *)\ (unsigned long)_k + (_k->ch_malloc_hdr_off))) -#endif #define KL_CONFIG_CH_MALLOC_HDR(_n) PTR_CH_MALLOC_HDR(KL_CONFIG_HDR(_n)) -#if defined(CONFIG_SGI_IO) -#define PTR_CH_CONS_INFO(_k) ((console_t *)\ - ((__psunsigned_t)_k + (_k->ch_cons_off))) -#else #define PTR_CH_CONS_INFO(_k) ((console_t *)\ ((unsigned long)_k + (_k->ch_cons_off))) -#endif #define KL_CONFIG_CH_CONS_INFO(_n) PTR_CH_CONS_INFO(KL_CONFIG_HDR(_n)) @@ -490,14 +458,6 @@ typedef struct lboard_s { #define KLCF_NUM_COMPS(_brd) ((_brd)->brd_numcompts) #define KLCF_MODULE_ID(_brd) ((_brd)->brd_module) -#ifdef FRUTEST - -#define KLCF_NEXT(_brd) ((_brd)->brd_next ? (lboard_t *)((_brd)->brd_next): NULL) -#define KLCF_COMP(_brd, _ndx) (klinfo_t *)((_brd)->brd_compts[(_ndx)]) -#define KLCF_COMP_ERROR(_brd, _comp) (_brd = _brd , (_comp)->errinfo) - -#else - #define KLCF_NEXT(_brd) \ ((_brd)->brd_next ? \ (lboard_t *)(NODE_OFFSET_TO_K1(NASID_GET(_brd), (_brd)->brd_next)):\ @@ -509,8 +469,6 @@ typedef struct lboard_s { #define KLCF_COMP_ERROR(_brd, _comp) \ (NODE_OFFSET_TO_K1(NASID_GET(_brd), (_comp)->errinfo)) -#endif - #define KLCF_COMP_TYPE(_comp) ((_comp)->struct_type) #define KLCF_BRIDGE_W_ID(_comp) ((_comp)->physid) /* Widget ID */ @@ -631,18 +589,6 @@ typedef struct klport_s { klconf_off_t port_offset; } klport_t; -#if 0 -/* - * This is very similar to the klport_s but instead of having a componant - * offset it has a board offset. - */ -typedef struct klxbow_port_s { - nasid_t port_nasid; - unsigned char port_flag; - klconf_off_t board_offset; -} klxbow_port_t; -#endif - typedef struct klcpu_s { /* CPU */ klinfo_t cpu_info; unsigned short cpu_prid; /* Processor PRID value */ @@ -656,7 +602,7 @@ typedef struct klcpu_s { /* CPU */ typedef struct klhub_s { /* HUB */ klinfo_t hub_info; - uint hub_flags; /* PCFG_HUB_xxx flags */ + unsigned int hub_flags; /* PCFG_HUB_xxx flags */ klport_t hub_port; /* hub is connected to this */ nic_t hub_box_nic; /* nic of containing box */ klconf_off_t hub_mfg_nic; /* MFG NIC string */ @@ -665,7 +611,7 @@ typedef struct klhub_s { /* HUB */ typedef struct klhub_uart_s { /* HUB */ klinfo_t hubuart_info; - uint hubuart_flags; /* PCFG_HUB_xxx flags */ + unsigned int hubuart_flags; /* PCFG_HUB_xxx flags */ nic_t hubuart_box_nic; /* nic of containing box */ } klhub_uart_t ; @@ -764,7 +710,7 @@ typedef struct klvmed_s { /* VME DEVICE - VME BOARD */ /* XXX - Don't we need the number of ports here?!? */ typedef struct klrou_s { /* ROUTER */ klinfo_t rou_info ; - uint rou_flags ; /* PCFG_ROUTER_xxx flags */ + unsigned int rou_flags ; /* PCFG_ROUTER_xxx flags */ nic_t rou_box_nic ; /* nic of the containing module */ klport_t rou_port[MAX_ROUTER_PORTS + 1] ; /* array index 1 to 6 */ klconf_off_t rou_mfg_nic ; /* MFG NIC string */ @@ -787,8 +733,8 @@ typedef struct klgfx_s { /* GRAPHICS Device */ klinfo_t gfx_info; klconf_off_t old_gndevs; /* for compatibility with older proms */ klconf_off_t old_gdoff0; /* for compatibility with older proms */ - uint cookie; /* for compatibility with older proms */ - uint moduleslot; + unsigned int cookie; /* for compatibility with older proms */ + unsigned int moduleslot; struct klgfx_s *gfx_next_pipe; graphics_t gfx_specific; klconf_off_t pad0; /* for compatibility with older proms */ @@ -945,36 +891,6 @@ extern klcpu_t *nasid_slice_to_cpuinfo(nasid_t, int); extern lboard_t *find_lboard_class(lboard_t *start, unsigned char brd_class); -#if defined(CONFIG_SGI_IO) -extern xwidgetnum_t nodevertex_widgetnum_get(vertex_hdl_t node_vtx); -extern vertex_hdl_t nodevertex_xbow_peer_get(vertex_hdl_t node_vtx); -extern lboard_t *find_gfxpipe(int pipenum); -extern void setup_gfxpipe_link(vertex_hdl_t vhdl,int pipenum); -extern lboard_t *find_lboard_module_class(lboard_t *start, moduleid_t mod, - unsigned char brd_class); -extern lboard_t *find_nic_lboard(lboard_t *, nic_t); -extern lboard_t *find_nic_type_lboard(nasid_t, unsigned char, nic_t); -extern lboard_t *find_lboard_modslot(lboard_t *start, moduleid_t mod, slotid_t slot); -extern lboard_t *find_lboard_module(lboard_t *start, moduleid_t mod); -extern lboard_t *get_board_name(nasid_t nasid, moduleid_t mod, slotid_t slot, char *name); -extern int config_find_nic_router(nasid_t, nic_t, lboard_t **, klrou_t**); -extern int config_find_nic_hub(nasid_t, nic_t, lboard_t **, klhub_t**); -extern int config_find_xbow(nasid_t, lboard_t **, klxbow_t**); -extern klcpu_t *get_cpuinfo(cpuid_t cpu); -extern int update_klcfg_cpuinfo(nasid_t, int); -extern void board_to_path(lboard_t *brd, char *path); -extern moduleid_t get_module_id(nasid_t nasid); -extern void nic_name_convert(char *old_name, char *new_name); -extern int module_brds(nasid_t nasid, lboard_t **module_brds, int n); -extern lboard_t *brd_from_key(ulong_t key); -extern void device_component_canonical_name_get(lboard_t *,klinfo_t *, - char *); -extern int board_serial_number_get(lboard_t *,char *); -extern int is_master_baseio(nasid_t,moduleid_t,slotid_t); -extern nasid_t get_actual_nasid(lboard_t *brd) ; -extern net_vec_t klcfg_discover_route(lboard_t *, lboard_t *, int); -#else /* CONFIG_SGI_IO */ extern klcpu_t *sn_get_cpuinfo(cpuid_t cpu); -#endif /* CONFIG_SGI_IO */ #endif /* _ASM_SN_KLCONFIG_H */ diff --git a/include/asm-mips/sn/kldir.h b/include/asm-mips/sn/kldir.h index f0efab167..0573cbffc 100644 --- a/include/asm-mips/sn/kldir.h +++ b/include/asm-mips/sn/kldir.h @@ -11,11 +11,6 @@ #ifndef _ASM_SN_KLDIR_H #define _ASM_SN_KLDIR_H -#include - -#if defined(CONFIG_SGI_IO) -#include -#endif /* * The kldir memory area resides at a fixed place in each node's memory and @@ -136,8 +131,6 @@ #define KLDIR_OFF_STRIDE 0x28 #endif /* __ASSEMBLY__ */ -#if !defined(CONFIG_SGI_IO) - /* * This is defined here because IP27_SYMMON_STK_SIZE must be at least what * we define here. Since it's set up in the prom. We can't redefine it later @@ -147,7 +140,7 @@ */ #define SYMMON_STACK_SIZE 0x8000 -#if defined (PROM) || defined (SABLE) +#if defined (PROM) /* * These defines are prom version dependent. No code other than the IP27 @@ -184,7 +177,7 @@ #define IP27_FREEMEM_COUNT 1 #define IP27_FREEMEM_STRIDE 0 -#endif /* PROM || SABLE*/ +#endif /* PROM */ /* * There will be only one of these in a partition so the IO6 must set it up. */ @@ -207,17 +200,11 @@ #define KLDIR_ENT_SIZE 0x40 #define KLDIR_MAX_ENTRIES (0x400 / 0x40) -#endif /* !CONFIG_SGI_IO */ - #ifndef __ASSEMBLY__ typedef struct kldir_ent_s { u64 magic; /* Indicates validity of entry */ off_t offset; /* Offset from start of node space */ -#if defined(CONFIG_SGI_IO) /* FIXME */ - __psunsigned_t pointer; /* Pointer to area in some cases */ -#else unsigned long pointer; /* Pointer to area in some cases */ -#endif size_t size; /* Size in bytes */ u64 count; /* Repeat count if array, 1 if not */ size_t stride; /* Stride if array, 0 if not */ @@ -227,22 +214,4 @@ typedef struct kldir_ent_s { } kldir_ent_t; #endif /* !__ASSEMBLY__ */ -#if defined(CONFIG_SGI_IO) - -#define KLDIR_ENT_SIZE 0x40 -#define KLDIR_MAX_ENTRIES (0x400 / 0x40) - -/* - * The actual offsets of each memory area are machine-dependent - */ -#ifdef CONFIG_SGI_IP27 -// Not yet #include -#elif defined(CONFIG_SGI_IP35) -#include -#else -#error "kldir.h is currently defined for IP27 and IP35 platforms only" -#endif - -#endif /* CONFIG_SGI_IO */ - #endif /* _ASM_SN_KLDIR_H */ diff --git a/include/asm-mips/sn/launch.h b/include/asm-mips/sn/launch.h index b67699c0c..b7c222631 100644 --- a/include/asm-mips/sn/launch.h +++ b/include/asm-mips/sn/launch.h @@ -9,7 +9,6 @@ #ifndef _ASM_SN_LAUNCH_H #define _ASM_SN_LAUNCH_H -#include #include #include diff --git a/include/asm-mips/sn/mapped_kernel.h b/include/asm-mips/sn/mapped_kernel.h index 59edb20f8..c3dd5d0d5 100644 --- a/include/asm-mips/sn/mapped_kernel.h +++ b/include/asm-mips/sn/mapped_kernel.h @@ -20,7 +20,6 @@ * code. So no jumps can be done before we have switched to using * cksseg addresses. */ -#include #include #define REP_BASE CAC_BASE diff --git a/include/asm-mips/sn/sn0/addrs.h b/include/asm-mips/sn/sn0/addrs.h index 398815639..9e8cc5291 100644 --- a/include/asm-mips/sn/sn0/addrs.h +++ b/include/asm-mips/sn/sn0/addrs.h @@ -11,7 +11,6 @@ #ifndef _ASM_SN_SN0_ADDRS_H #define _ASM_SN_SN0_ADDRS_H -#include /* * SN0 (on a T5) Address map @@ -49,7 +48,7 @@ * so for now we just use defines bracketed by an ifdef. */ -#ifdef CONFIG_SGI_SN0_N_MODE +#ifdef CONFIG_SGI_SN_N_MODE #define NODE_SIZE_BITS 31 #define BWIN_SIZE_BITS 28 @@ -63,7 +62,7 @@ #define BDDIR_UPPER_MASK (UINT64_CAST 0x7ffff << 10) #define BDECC_UPPER_MASK (UINT64_CAST 0x3ffffff << 3) -#else /* !defined(CONFIG_SGI_SN0_N_MODE), assume that M-mode is desired */ +#else /* !defined(CONFIG_SGI_SN_N_MODE), assume that M-mode is desired */ #define NODE_SIZE_BITS 32 #define BWIN_SIZE_BITS 29 @@ -77,7 +76,7 @@ #define BDDIR_UPPER_MASK (UINT64_CAST 0xfffff << 10) #define BDECC_UPPER_MASK (UINT64_CAST 0x7ffffff << 3) -#endif /* !defined(CONFIG_SGI_SN0_N_MODE) */ +#endif /* !defined(CONFIG_SGI_SN_N_MODE) */ #define NODE_ADDRSPACE_SIZE (UINT64_CAST 1 << NODE_SIZE_BITS) @@ -85,15 +84,15 @@ #define NASID_GET(_pa) (int) ((UINT64_CAST (_pa) >> \ NASID_SHFT) & NASID_BITMASK) -#if !defined(__ASSEMBLY__) && !defined(_STANDALONE) +#if !defined(__ASSEMBLY__) #define NODE_SWIN_BASE(nasid, widget) \ ((widget == 0) ? NODE_BWIN_BASE((nasid), SWIN0_BIGWIN) \ : RAW_NODE_SWIN_BASE(nasid, widget)) -#else /* __ASSEMBLY__ || _STANDALONE */ +#else /* __ASSEMBLY__ */ #define NODE_SWIN_BASE(nasid, widget) \ (NODE_IO_BASE(nasid) + (UINT64_CAST (widget) << SWIN_SIZE_BITS)) -#endif /* __ASSEMBLY__ || _STANDALONE */ +#endif /* __ASSEMBLY__ */ /* * The following definitions pertain to the IO special address @@ -143,12 +142,7 @@ #define SN0_WIDGET_BASE(_nasid, _wid) (NODE_SWIN_BASE((_nasid), (_wid))) /* Turn on sable logging for the processors whose bits are set. */ -#ifdef SABLE -#define SABLE_LOG_TRIGGER(_map) \ - *((volatile hubreg_t *)(IO_BASE + 0x17ffff0)) = (_map) -#else #define SABLE_LOG_TRIGGER(_map) -#endif /* SABLE */ #ifndef __ASSEMBLY__ #define KERN_NMI_ADDR(nasid, slice) \ @@ -281,76 +275,6 @@ #define _ARCSPROM -#ifdef _STANDALONE - -/* - * The PROM needs to pass the device base address and the - * device pci cfg space address to the device drivers during - * install. The COMPONENT->Key field is used for this purpose. - * Macros needed by SN0 device drivers to convert the - * COMPONENT->Key field to the respective base address. - * Key field looks as follows: - * - * +----------------------------------------------------+ - * |devnasid | widget |pciid |hubwidid|hstnasid | adap | - * | 2 | 1 | 1 | 1 | 2 | 1 | - * +----------------------------------------------------+ - * | | | | | | | - * 64 48 40 32 24 8 0 - * - * These are used by standalone drivers till the io infrastructure - * is in place. - */ - -#ifndef __ASSEMBLY__ - -#define uchar unsigned char - -#define KEY_DEVNASID_SHFT 48 -#define KEY_WIDID_SHFT 40 -#define KEY_PCIID_SHFT 32 -#define KEY_HUBWID_SHFT 24 -#define KEY_HSTNASID_SHFT 8 - -#define MK_SN0_KEY(nasid, widid, pciid) \ - ((((__psunsigned_t)nasid)<< KEY_DEVNASID_SHFT |\ - ((__psunsigned_t)widid) << KEY_WIDID_SHFT) |\ - ((__psunsigned_t)pciid) << KEY_PCIID_SHFT) - -#define ADD_HUBWID_KEY(key,hubwid)\ - (key|=((__psunsigned_t)hubwid << KEY_HUBWID_SHFT)) - -#define ADD_HSTNASID_KEY(key,hstnasid)\ - (key|=((__psunsigned_t)hstnasid << KEY_HSTNASID_SHFT)) - -#define GET_DEVNASID_FROM_KEY(key) ((short)(key >> KEY_DEVNASID_SHFT)) -#define GET_WIDID_FROM_KEY(key) ((uchar)(key >> KEY_WIDID_SHFT)) -#define GET_PCIID_FROM_KEY(key) ((uchar)(key >> KEY_PCIID_SHFT)) -#define GET_HUBWID_FROM_KEY(key) ((uchar)(key >> KEY_HUBWID_SHFT)) -#define GET_HSTNASID_FROM_KEY(key) ((short)(key >> KEY_HSTNASID_SHFT)) - -#define PCI_64_TARGID_SHFT 60 - -#define GET_PCIBASE_FROM_KEY(key) (NODE_SWIN_BASE(GET_DEVNASID_FROM_KEY(key),\ - GET_WIDID_FROM_KEY(key))\ - | BRIDGE_DEVIO(GET_PCIID_FROM_KEY(key))) - -#define GET_PCICFGBASE_FROM_KEY(key) \ - (NODE_SWIN_BASE(GET_DEVNASID_FROM_KEY(key),\ - GET_WIDID_FROM_KEY(key))\ - | BRIDGE_TYPE0_CFG_DEV(GET_PCIID_FROM_KEY(key))) - -#define GET_WIDBASE_FROM_KEY(key) \ - (NODE_SWIN_BASE(GET_DEVNASID_FROM_KEY(key),\ - GET_WIDID_FROM_KEY(key))) - -#define PUT_INSTALL_STATUS(c,s) c->Revision = s -#define GET_INSTALL_STATUS(c) c->Revision - -#endif /* !__ASSEMBLY__ */ - -#endif /* _STANDALONE */ - #if defined (HUB_ERR_STS_WAR) #define ERR_STS_WAR_REGISTER IIO_IIBUSERR diff --git a/include/asm-mips/sn/sn0/arch.h b/include/asm-mips/sn/sn0/arch.h index fb78773a5..f734f2007 100644 --- a/include/asm-mips/sn/sn0/arch.h +++ b/include/asm-mips/sn/sn0/arch.h @@ -11,9 +11,6 @@ #ifndef _ASM_SN_SN0_ARCH_H #define _ASM_SN_SN0_ARCH_H -#include - -#ifndef SABLE #ifndef SN0XXL /* 128 cpu SMP max */ /* @@ -54,25 +51,16 @@ */ #define MAX_PARTITIONS MAX_REGIONS - -#else - -#define MAX_COMPACT_NODES 4 -#define MAX_NASIDS 4 -#define MAXCPUS 8 - -#endif - #define NASID_MASK_BYTES ((MAX_NASIDS + 7) / 8) /* * Slot constants for SN0 */ -#ifdef CONFIG_SGI_SN0_N_MODE +#ifdef CONFIG_SGI_SN_N_MODE #define MAX_MEM_SLOTS 16 /* max slots per node */ -#else /* !CONFIG_SGI_SN0_N_MODE, assume M_MODE */ +#else /* !CONFIG_SGI_SN_N_MODE, assume CONFIG_SGI_SN_M_MODE */ #define MAX_MEM_SLOTS 32 /* max slots per node */ -#endif /* defined(N_MODE) */ +#endif /* CONFIG_SGI_SN_M_MODE */ #define SLOT_SHIFT (27) #define SLOT_MIN_MEM_SIZE (32*1024*1024) diff --git a/include/asm-mips/sn/sn0/hub.h b/include/asm-mips/sn/sn0/hub.h index f5dbba6f4..3e228f8e7 100644 --- a/include/asm-mips/sn/sn0/hub.h +++ b/include/asm-mips/sn/sn0/hub.h @@ -31,10 +31,6 @@ #include //#include -#ifdef SABLE -#define IP27_NO_HUBUART_INT 1 -#endif - /* Translation of uncached attributes */ #define UATTR_HSPEC 0 #define UATTR_IO 1 diff --git a/include/asm-mips/sn/sn0/hubio.h b/include/asm-mips/sn/sn0/hubio.h index f314da21b..ef91b3363 100644 --- a/include/asm-mips/sn/sn0/hubio.h +++ b/include/asm-mips/sn/sn0/hubio.h @@ -486,22 +486,6 @@ typedef union h1_icrba_u { #define ICRBN_A_CERR_SHFT 54 #define ICRBN_A_ERR_MASK 0x3ff -#if 0 /* Disabled, this causes namespace polution and break allmodconfig */ -/* - * Easy access macros. - */ -#define a_error icrba_fields_s.error -#define a_ecode icrba_fields_s.ecode -#define a_lnetuce icrba_fields_s.lnetuce -#define a_mark icrba_fields_s.mark -#define a_xerr icrba_fields_s.xerr -#define a_sidn icrba_fields_s.sidn -#define a_tnum icrba_fields_s.tnum -#define a_addr icrba_fields_s.addr -#define a_valid icrba_fields_s.valid -#define a_iow icrba_fields_s.iow -#endif - #endif /* !__ASSEMBLY__ */ #define IIO_ICRB_ADDR_SHFT 2 /* Shift to get proper address */ diff --git a/include/asm-mips/sn/sn0/hubmd.h b/include/asm-mips/sn/sn0/hubmd.h index a66def4e0..14c225d80 100644 --- a/include/asm-mips/sn/sn0/hubmd.h +++ b/include/asm-mips/sn/sn0/hubmd.h @@ -11,7 +11,6 @@ #ifndef _ASM_SN_SN0_HUBMD_H #define _ASM_SN_SN0_HUBMD_H -#include /* * Hub Memory/Directory interface registers @@ -92,7 +91,7 @@ #define MD_UREG1_14 0x2200f0 /* uController/UART 1 register */ #define MD_UREG1_15 0x2200f8 /* uController/UART 1 register */ -#ifdef CONFIG_SGI_SN0_N_MODE +#ifdef CONFIG_SGI_SN_N_MODE #define MD_MEM_BANKS 4 /* 4 banks of memory max in N mode */ #else #define MD_MEM_BANKS 8 /* 8 banks of memory max in M mode */ diff --git a/include/asm-mips/sn/sn0/hubpi.h b/include/asm-mips/sn/sn0/hubpi.h index 355bba855..e39f5f9da 100644 --- a/include/asm-mips/sn/sn0/hubpi.h +++ b/include/asm-mips/sn/sn0/hubpi.h @@ -398,24 +398,6 @@ typedef u64 rtc_time_t; /* PI_RT_FILTER_CTRL mask and shift definitions */ -#if 0 -/* - * XXX - This register's definition has changed, but it's only implemented - * in Hub 2. - */ -#define PRFC_DROP_COUNT_SHFT 27 -#define PRFC_DROP_COUNT_MASK (UINT64_CAST 0x3ff << 27) -#define PRFC_DROP_CTR_SHFT 18 -#define PRFC_DROP_CTR_MASK (UINT64_CAST 0x1ff << 18) -#define PRFC_MASK_ENABLE_SHFT 10 -#define PRFC_MASK_ENABLE_MASK (UINT64_CAST 0x7f << 10) -#define PRFC_MASK_CTR_SHFT 2 -#define PRFC_MASK_CTR_MASK (UINT64_CAST 0xff << 2) -#define PRFC_OFFSET_SHFT 0 -#define PRFC_OFFSET_MASK (UINT64_CAST 3) -#endif /* 0 */ - - /* * Bits for NACK_CNT_A/B and NACK_CMP */ diff --git a/include/asm-mips/sn/sn0/ip27.h b/include/asm-mips/sn/sn0/ip27.h index ade0e974d..3c97e0855 100644 --- a/include/asm-mips/sn/sn0/ip27.h +++ b/include/asm-mips/sn/sn0/ip27.h @@ -6,7 +6,7 @@ * Derived from IRIX . * * Copyright (C) 1992 - 1997, 1999 Silicon Graphics, Inc. - * Copyright (C) 1999 by Ralf Baechle + * Copyright (C) 1999, 2006 by Ralf Baechle */ #ifndef _ASM_SN_SN0_IP27_H #define _ASM_SN_SN0_IP27_H @@ -82,11 +82,4 @@ #define SEND_NMI(_nasid, _slice) \ REMOTE_HUB_S((_nasid), (PI_NMI_A + ((_slice) * PI_NMI_OFFSET)), 1) -/* Sanity hazzard ... Below all the Origin hacks are following. */ - -#define SN00_BRIDGE 0x9200000008000000 -#define SN00I_BRIDGE0 0x920000000b000000 -#define SN00I_BRIDGE1 0x920000000e000000 -#define SN00I_BRIDGE2 0x920000000f000000 - #endif /* _ASM_SN_SN0_IP27_H */ diff --git a/include/asm-mips/sn/sn0/sn0_fru.h b/include/asm-mips/sn/sn0/sn0_fru.h deleted file mode 100644 index 82c6377c2..000000000 --- a/include/asm-mips/sn/sn0/sn0_fru.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - * - * Derived from IRIX - * - * Copyright (C) 1992 - 1997, 1999 Silcon Graphics, Inc. - * Copyright (C) 1999 Ralf Baechle (ralf@gnu.org) - */ -#ifndef _ASM_SN_SN0_SN0_FRU_H -#define _ASM_SN_SN0_SN0_FRU_H - -#define MAX_DIMMS 8 /* max # of dimm banks */ -#define MAX_PCIDEV 8 /* max # of pci devices on a pci bus */ - -typedef unsigned char confidence_t; - -typedef struct kf_mem_s { - confidence_t km_confidence; /* confidence level that the memory is bad - * is this necessary ? - */ - confidence_t km_dimm[MAX_DIMMS]; - /* confidence level that dimm[i] is bad - *I think this is the right number - */ - -} kf_mem_t; - -typedef struct kf_cpu_s { - confidence_t kc_confidence; /* confidence level that cpu is bad */ - confidence_t kc_icache; /* confidence level that instr. cache is bad */ - confidence_t kc_dcache; /* confidence level that data cache is bad */ - confidence_t kc_scache; /* confidence level that sec. cache is bad */ - confidence_t kc_sysbus; /* confidence level that sysad/cmd/state bus is bad */ -} kf_cpu_t; - -typedef struct kf_pci_bus_s { - confidence_t kpb_belief; /* confidence level that the pci bus is bad */ - confidence_t kpb_pcidev_belief[MAX_PCIDEV]; - /* confidence level that the pci dev is bad */ -} kf_pci_bus_t; - -#endif /* _ASM_SN_SN0_SN0_FRU_H */ diff --git a/include/asm-mips/sni.h b/include/asm-mips/sni.h index b3bc698df..b9ba54d0d 100644 --- a/include/asm-mips/sni.h +++ b/include/asm-mips/sni.h @@ -15,9 +15,6 @@ /* * ASIC PCI registers for little endian configuration. */ -#ifndef __MIPSEL__ -#error "Fix me for big endian" -#endif #define PCIMT_UCONF 0xbfff0000 #define PCIMT_IOADTIMEOUT2 0xbfff0008 #define PCIMT_IOMEMCONF 0xbfff0010 @@ -51,9 +48,9 @@ #define PCIMT_PCI_CONF 0xbfff0100 /* - * Data port for the PCI bus. + * Data port for the PCI bus in IO space */ -#define PCIMT_CONFIG_DATA 0xb4000cfc +#define PCIMT_CONFIG_DATA 0x0cfc /* * Board specific registers diff --git a/include/asm-mips/socket.h b/include/asm-mips/socket.h index 0bb31e5aa..36ebe4e18 100644 --- a/include/asm-mips/socket.h +++ b/include/asm-mips/socket.h @@ -69,6 +69,7 @@ To add: #define SO_REUSEPORT 0x0200 /* Allow local address and port reuse. */ #define SO_PEERSEC 30 #define SO_SNDBUFFORCE 31 #define SO_RCVBUFFORCE 33 +#define SO_PASSSEC 34 #ifdef __KERNEL__ diff --git a/include/asm-mips/stackframe.h b/include/asm-mips/stackframe.h index c4856a874..158a4cd12 100644 --- a/include/asm-mips/stackframe.h +++ b/include/asm-mips/stackframe.h @@ -10,7 +10,6 @@ #ifndef _ASM_STACKFRAME_H #define _ASM_STACKFRAME_H -#include #include #include @@ -305,7 +304,7 @@ mfc0 v0, CP0_TCSTATUS ori v0, TCSTATUS_IXMT mtc0 v0, CP0_TCSTATUS - ehb + _ehb DMT 5 # dmt a1 jal mips_ihb #endif /* CONFIG_MIPS_MT_SMTC */ @@ -326,14 +325,14 @@ * restore TCStatus.IXMT. */ LONG_L v1, PT_TCSTATUS(sp) - ehb + _ehb mfc0 v0, CP0_TCSTATUS andi v1, TCSTATUS_IXMT /* We know that TCStatua.IXMT should be set from above */ xori v0, v0, TCSTATUS_IXMT or v0, v0, v1 mtc0 v0, CP0_TCSTATUS - ehb + _ehb andi a1, a1, VPECONTROL_TE beqz a1, 1f emt @@ -412,7 +411,7 @@ /* Clear TKSU, leave IXMT */ xori t0, 0x00001800 mtc0 t0, CP0_TCSTATUS - ehb + _ehb /* We need to leave the global IE bit set, but clear EXL...*/ mfc0 t0, CP0_STATUS ori t0, ST0_EXL | ST0_ERL @@ -439,7 +438,7 @@ * and enable interrupts only for the * current TC, using the TCStatus register. */ - ehb + _ehb mfc0 t0,CP0_TCSTATUS /* Fortunately CU 0 is in the same place in both registers */ /* Set TCU0, TKSU (for later inversion) and IXMT */ @@ -448,7 +447,7 @@ /* Clear TKSU *and* IXMT */ xori t0, 0x00001c00 mtc0 t0, CP0_TCSTATUS - ehb + _ehb /* We need to leave the global IE bit set, but clear EXL...*/ mfc0 t0, CP0_STATUS ori t0, ST0_EXL @@ -480,7 +479,7 @@ andi v1, v0, TCSTATUS_IXMT ori v0, TCSTATUS_IXMT mtc0 v0, CP0_TCSTATUS - ehb + _ehb DMT 2 # dmt v0 /* * We don't know a priori if ra is "live" @@ -496,7 +495,7 @@ xori t0, 0x1e mtc0 t0, CP0_STATUS #ifdef CONFIG_MIPS_MT_SMTC - ehb + _ehb andi v0, v0, VPECONTROL_TE beqz v0, 2f nop /* delay slot */ diff --git a/include/asm-mips/string.h b/include/asm-mips/string.h index 907da600f..436e3ad35 100644 --- a/include/asm-mips/string.h +++ b/include/asm-mips/string.h @@ -10,7 +10,6 @@ #ifndef _ASM_STRING_H #define _ASM_STRING_H -#include /* * Most of the inline functions are rather naive implementations so I just diff --git a/include/asm-mips/system.h b/include/asm-mips/system.h index 261f71d16..dcb4701d5 100644 --- a/include/asm-mips/system.h +++ b/include/asm-mips/system.h @@ -12,15 +12,14 @@ #ifndef _ASM_SYSTEM_H #define _ASM_SYSTEM_H -#include #include +#include #include #include #include #include #include -#include /* * read_barrier_depends - Flush all pending reads that subsequents reads @@ -144,9 +143,6 @@ #define set_mb(var, value) \ do { var = value; mb(); } while (0) -#define set_wmb(var, value) \ -do { var = value; wmb(); } while (0) - /* * switch_to(n) should switch tasks to task nr n, first * checking that n isn't the current task, in which case it does nothing. diff --git a/include/asm-mips/thread_info.h b/include/asm-mips/thread_info.h index f8d97dafd..ae8ada5b4 100644 --- a/include/asm-mips/thread_info.h +++ b/include/asm-mips/thread_info.h @@ -9,7 +9,6 @@ #ifdef __KERNEL__ -#include #ifndef __ASSEMBLY__ diff --git a/include/asm-mips/time.h b/include/asm-mips/time.h index d897c8bb5..2d5437356 100644 --- a/include/asm-mips/time.h +++ b/include/asm-mips/time.h @@ -83,11 +83,11 @@ extern asmlinkage void ll_local_timer_interrupt(int irq, struct pt_regs *regs); /* * board specific routines required by time_init(). * board_time_init is defaulted to NULL and can remain so. - * board_timer_setup must be setup properly in machine setup routine. + * plat_timer_setup must be setup properly in machine setup routine. */ struct irqaction; extern void (*board_time_init)(void); -extern void (*board_timer_setup)(struct irqaction *irq); +extern void plat_timer_setup(struct irqaction *irq); /* * mips_hpt_frequency - must be set if you intend to use an R4k-compatible diff --git a/include/asm-mips/tlbflush.h b/include/asm-mips/tlbflush.h index bb4ae3cdc..276be77c3 100644 --- a/include/asm-mips/tlbflush.h +++ b/include/asm-mips/tlbflush.h @@ -1,7 +1,6 @@ #ifndef __ASM_TLBFLUSH_H #define __ASM_TLBFLUSH_H -#include #include /* diff --git a/include/asm-mips/tx4927/toshiba_rbtx4927.h b/include/asm-mips/tx4927/toshiba_rbtx4927.h index 6ce1e9475..94bef03d9 100644 --- a/include/asm-mips/tx4927/toshiba_rbtx4927.h +++ b/include/asm-mips/tx4927/toshiba_rbtx4927.h @@ -27,7 +27,6 @@ #ifndef __ASM_TX4927_TOSHIBA_RBTX4927_H #define __ASM_TX4927_TOSHIBA_RBTX4927_H -#include #include #include #ifdef CONFIG_PCI diff --git a/include/asm-mips/types.h b/include/asm-mips/types.h index cd2813d8e..2b52e180c 100644 --- a/include/asm-mips/types.h +++ b/include/asm-mips/types.h @@ -52,7 +52,6 @@ typedef unsigned long long __u64; #ifndef __ASSEMBLY__ -#include typedef __signed char s8; typedef unsigned char u8; diff --git a/include/asm-mips/uaccess.h b/include/asm-mips/uaccess.h index b96f3e0f3..1cdd4eeb2 100644 --- a/include/asm-mips/uaccess.h +++ b/include/asm-mips/uaccess.h @@ -9,7 +9,6 @@ #ifndef _ASM_UACCESS_H #define _ASM_UACCESS_H -#include #include #include #include diff --git a/include/asm-mips/unistd.h b/include/asm-mips/unistd.h index 1068fe9a0..610ccb8a5 100644 --- a/include/asm-mips/unistd.h +++ b/include/asm-mips/unistd.h @@ -326,16 +326,19 @@ #define __NR_unshare (__NR_Linux + 303) #define __NR_splice (__NR_Linux + 304) #define __NR_sync_file_range (__NR_Linux + 305) +#define __NR_tee (__NR_Linux + 306) +#define __NR_vmsplice (__NR_Linux + 307) +#define __NR_move_pages (__NR_Linux + 308) /* * Offset of the last Linux o32 flavoured syscall */ -#define __NR_Linux_syscalls 305 +#define __NR_Linux_syscalls 308 #endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */ #define __NR_O32_Linux 4000 -#define __NR_O32_Linux_syscalls 305 +#define __NR_O32_Linux_syscalls 308 #if _MIPS_SIM == _MIPS_SIM_ABI64 @@ -608,16 +611,19 @@ #define __NR_unshare (__NR_Linux + 262) #define __NR_splice (__NR_Linux + 263) #define __NR_sync_file_range (__NR_Linux + 264) +#define __NR_tee (__NR_Linux + 265) +#define __NR_vmsplice (__NR_Linux + 266) +#define __NR_move_pages (__NR_Linux + 267) /* * Offset of the last Linux 64-bit flavoured syscall */ -#define __NR_Linux_syscalls 264 +#define __NR_Linux_syscalls 267 #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */ #define __NR_64_Linux 5000 -#define __NR_64_Linux_syscalls 264 +#define __NR_64_Linux_syscalls 267 #if _MIPS_SIM == _MIPS_SIM_NABI32 @@ -894,16 +900,21 @@ #define __NR_unshare (__NR_Linux + 266) #define __NR_splice (__NR_Linux + 267) #define __NR_sync_file_range (__NR_Linux + 268) +#define __NR_tee (__NR_Linux + 269) +#define __NR_vmsplice (__NR_Linux + 270) +#define __NR_move_pages (__NR_Linux + 271) /* * Offset of the last N32 flavoured syscall */ -#define __NR_Linux_syscalls 268 +#define __NR_Linux_syscalls 271 #endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */ #define __NR_N32_Linux 6000 -#define __NR_N32_Linux_syscalls 268 +#define __NR_N32_Linux_syscalls 271 + +#ifdef __KERNEL__ #ifndef __ASSEMBLY__ @@ -1168,9 +1179,6 @@ type name (atype a,btype b,ctype c,dtype d,etype e,ftype f) \ #endif /* (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64) */ -#ifdef __KERNEL__ - -#include #define __ARCH_WANT_IPC_PARSE_VERSION #define __ARCH_WANT_OLD_READDIR @@ -1197,7 +1205,6 @@ type name (atype a,btype b,ctype c,dtype d,etype e,ftype f) \ # ifdef CONFIG_MIPS32_O32 # define __ARCH_WANT_COMPAT_SYS_TIME # endif -#endif #ifdef __KERNEL_SYSCALLS__ @@ -1248,4 +1255,5 @@ asmlinkage long sys_rt_sigaction(int sig, */ #define cond_syscall(x) asm(".weak\t" #x "\n" #x "\t=\tsys_ni_syscall") +#endif /* __KERNEL__ */ #endif /* _ASM_UNISTD_H */ diff --git a/include/asm-mips/vga.h b/include/asm-mips/vga.h index 34755c0a6..c1dd0b10b 100644 --- a/include/asm-mips/vga.h +++ b/include/asm-mips/vga.h @@ -13,7 +13,7 @@ * access the videoram directly without any black magic. */ -#define VGA_MAP_MEM(x) (0xb0000000L + (unsigned long)(x)) +#define VGA_MAP_MEM(x,s) (0xb0000000L + (unsigned long)(x)) #define vga_readb(x) (*(x)) #define vga_writeb(x,y) (*(y) = (x)) diff --git a/include/asm-mips/vr41xx/capcella.h b/include/asm-mips/vr41xx/capcella.h index d10ffda50..e0ee05a3d 100644 --- a/include/asm-mips/vr41xx/capcella.h +++ b/include/asm-mips/vr41xx/capcella.h @@ -20,7 +20,7 @@ #ifndef __ZAO_CAPCELLA_H #define __ZAO_CAPCELLA_H -#include +#include /* * General-Purpose I/O Pin Number diff --git a/include/asm-mips/vr41xx/cmbvr4133.h b/include/asm-mips/vr41xx/cmbvr4133.h index 42af38901..9490ade58 100644 --- a/include/asm-mips/vr41xx/cmbvr4133.h +++ b/include/asm-mips/vr41xx/cmbvr4133.h @@ -15,8 +15,7 @@ #ifndef __NEC_CMBVR4133_H #define __NEC_CMBVR4133_H -#include -#include +#include /* * General-Purpose I/O Pin Number @@ -55,7 +54,4 @@ #define IDE_SECONDARY_IRQ I8259_IRQ(15) #define I8259_IRQ_LAST IDE_SECONDARY_IRQ -#define RTC_PORT(x) (0xaf000100 + (x)) -#define RTC_IO_EXTENT 0x140 - #endif /* __NEC_CMBVR4133_H */ diff --git a/include/asm-mips/vr41xx/e55.h b/include/asm-mips/vr41xx/e55.h deleted file mode 100644 index 558f2269b..000000000 --- a/include/asm-mips/vr41xx/e55.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * e55.h, Include file for CASIO CASSIOPEIA E-10/15/55/65. - * - * Copyright (C) 2002-2004 Yoichi Yuasa - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#ifndef __CASIO_E55_H -#define __CASIO_E55_H - -#include -#include - -/* - * Board specific address mapping - */ -#define VR41XX_ISA_MEM_BASE 0x10000000 -#define VR41XX_ISA_MEM_SIZE 0x04000000 - -/* VR41XX_ISA_IO_BASE includes offset from real base. */ -#define VR41XX_ISA_IO_BASE 0x1400c000 -#define VR41XX_ISA_IO_SIZE 0x03ff4000 - -#define ISA_BUS_IO_BASE 0 -#define ISA_BUS_IO_SIZE VR41XX_ISA_IO_SIZE - -#define IO_PORT_BASE KSEG1ADDR(VR41XX_ISA_IO_BASE) -#define IO_PORT_RESOURCE_START ISA_BUS_IO_BASE -#define IO_PORT_RESOURCE_END (ISA_BUS_IO_BASE + ISA_BUS_IO_SIZE - 1) - -#endif /* __CASIO_E55_H */ diff --git a/include/asm-mips/vr41xx/mpc30x.h b/include/asm-mips/vr41xx/mpc30x.h index a6cbe4da6..1d67df843 100644 --- a/include/asm-mips/vr41xx/mpc30x.h +++ b/include/asm-mips/vr41xx/mpc30x.h @@ -20,7 +20,7 @@ #ifndef __VICTOR_MPC30X_H #define __VICTOR_MPC30X_H -#include +#include /* * General-Purpose I/O Pin Number diff --git a/include/asm-mips/vr41xx/tb0219.h b/include/asm-mips/vr41xx/tb0219.h index 273c63926..dc981b4be 100644 --- a/include/asm-mips/vr41xx/tb0219.h +++ b/include/asm-mips/vr41xx/tb0219.h @@ -1,7 +1,7 @@ /* * tb0219.h, Include file for TANBAC TB0219. * - * Copyright (C) 2002-2004 Yoichi Yuasa + * Copyright (C) 2002-2004 Yoichi Yuasa * * Modified for TANBAC TB0219: * Copyright (C) 2003 Megasolution Inc. @@ -23,7 +23,7 @@ #ifndef __TANBAC_TB0219_H #define __TANBAC_TB0219_H -#include +#include /* * General-Purpose I/O Pin Number diff --git a/include/asm-mips/vr41xx/tb0226.h b/include/asm-mips/vr41xx/tb0226.h index 2513f450e..de527dcfa 100644 --- a/include/asm-mips/vr41xx/tb0226.h +++ b/include/asm-mips/vr41xx/tb0226.h @@ -20,7 +20,7 @@ #ifndef __TANBAC_TB0226_H #define __TANBAC_TB0226_H -#include +#include /* * General-Purpose I/O Pin Number diff --git a/include/asm-mips/vr41xx/tb0287.h b/include/asm-mips/vr41xx/tb0287.h index dd9832313..61bead68a 100644 --- a/include/asm-mips/vr41xx/tb0287.h +++ b/include/asm-mips/vr41xx/tb0287.h @@ -22,7 +22,7 @@ #ifndef __TANBAC_TB0287_H #define __TANBAC_TB0287_H -#include +#include /* * General-Purpose I/O Pin Number diff --git a/include/asm-mips/vr41xx/vr41xx.h b/include/asm-mips/vr41xx/vr41xx.h index 70828d5fa..dd3eb3dc5 100644 --- a/include/asm-mips/vr41xx/vr41xx.h +++ b/include/asm-mips/vr41xx/vr41xx.h @@ -74,59 +74,6 @@ extern void vr41xx_mask_clock(vr41xx_clock_t clock); /* * Interrupt Control Unit */ -/* CPU core Interrupt Numbers */ -#define MIPS_CPU_IRQ_BASE 0 -#define MIPS_CPU_IRQ(x) (MIPS_CPU_IRQ_BASE + (x)) -#define MIPS_SOFTINT0_IRQ MIPS_CPU_IRQ(0) -#define MIPS_SOFTINT1_IRQ MIPS_CPU_IRQ(1) -#define INT0_IRQ MIPS_CPU_IRQ(2) -#define INT1_IRQ MIPS_CPU_IRQ(3) -#define INT2_IRQ MIPS_CPU_IRQ(4) -#define INT3_IRQ MIPS_CPU_IRQ(5) -#define INT4_IRQ MIPS_CPU_IRQ(6) -#define TIMER_IRQ MIPS_CPU_IRQ(7) - -/* SYINT1 Interrupt Numbers */ -#define SYSINT1_IRQ_BASE 8 -#define SYSINT1_IRQ(x) (SYSINT1_IRQ_BASE + (x)) -#define BATTRY_IRQ SYSINT1_IRQ(0) -#define POWER_IRQ SYSINT1_IRQ(1) -#define RTCLONG1_IRQ SYSINT1_IRQ(2) -#define ELAPSEDTIME_IRQ SYSINT1_IRQ(3) -/* RFU */ -#define PIU_IRQ SYSINT1_IRQ(5) -#define AIU_IRQ SYSINT1_IRQ(6) -#define KIU_IRQ SYSINT1_IRQ(7) -#define GIUINT_IRQ SYSINT1_IRQ(8) -#define SIU_IRQ SYSINT1_IRQ(9) -#define BUSERR_IRQ SYSINT1_IRQ(10) -#define SOFTINT_IRQ SYSINT1_IRQ(11) -#define CLKRUN_IRQ SYSINT1_IRQ(12) -#define DOZEPIU_IRQ SYSINT1_IRQ(13) -#define SYSINT1_IRQ_LAST DOZEPIU_IRQ - -/* SYSINT2 Interrupt Numbers */ -#define SYSINT2_IRQ_BASE 24 -#define SYSINT2_IRQ(x) (SYSINT2_IRQ_BASE + (x)) -#define RTCLONG2_IRQ SYSINT2_IRQ(0) -#define LED_IRQ SYSINT2_IRQ(1) -#define HSP_IRQ SYSINT2_IRQ(2) -#define TCLOCK_IRQ SYSINT2_IRQ(3) -#define FIR_IRQ SYSINT2_IRQ(4) -#define CEU_IRQ SYSINT2_IRQ(4) /* same number as FIR_IRQ */ -#define DSIU_IRQ SYSINT2_IRQ(5) -#define PCI_IRQ SYSINT2_IRQ(6) -#define SCU_IRQ SYSINT2_IRQ(7) -#define CSI_IRQ SYSINT2_IRQ(8) -#define BCU_IRQ SYSINT2_IRQ(9) -#define ETHERNET_IRQ SYSINT2_IRQ(10) -#define SYSINT2_IRQ_LAST ETHERNET_IRQ - -/* GIU Interrupt Numbers */ -#define GIU_IRQ_BASE 40 -#define GIU_IRQ(x) (GIU_IRQ_BASE + (x)) /* IRQ 40-71 */ -#define GIU_IRQ_LAST GIU_IRQ(31) - extern int vr41xx_set_intassign(unsigned int irq, unsigned char intassign); extern int cascade_irq(unsigned int irq, int (*get_irq)(unsigned int, struct pt_regs *)); diff --git a/include/asm-mips/vr41xx/vrc4173.h b/include/asm-mips/vr41xx/vrc4173.h deleted file mode 100644 index 4d41a9c09..000000000 --- a/include/asm-mips/vr41xx/vrc4173.h +++ /dev/null @@ -1,222 +0,0 @@ -/* - * vrc4173.h, Include file for NEC VRC4173. - * - * Copyright (C) 2000 Michael R. McDonald - * Copyright (C) 2001-2003 Montavista Software Inc. - * Author: Yoichi Yuasa - * Copyright (C) 2004 Yoichi Yuasa - * Copyright (C) 2005 Ralf Baechle (ralf@linux-mips.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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#ifndef __NEC_VRC4173_H -#define __NEC_VRC4173_H - -#include -#include - -/* - * Interrupt Number - */ -#define VRC4173_IRQ_BASE 72 -#define VRC4173_IRQ(x) (VRC4173_IRQ_BASE + (x)) -#define VRC4173_USB_IRQ VRC4173_IRQ(0) -#define VRC4173_PCMCIA2_IRQ VRC4173_IRQ(1) -#define VRC4173_PCMCIA1_IRQ VRC4173_IRQ(2) -#define VRC4173_PS2CH2_IRQ VRC4173_IRQ(3) -#define VRC4173_PS2CH1_IRQ VRC4173_IRQ(4) -#define VRC4173_PIU_IRQ VRC4173_IRQ(5) -#define VRC4173_AIU_IRQ VRC4173_IRQ(6) -#define VRC4173_KIU_IRQ VRC4173_IRQ(7) -#define VRC4173_GIU_IRQ VRC4173_IRQ(8) -#define VRC4173_AC97_IRQ VRC4173_IRQ(9) -#define VRC4173_AC97INT1_IRQ VRC4173_IRQ(10) -/* RFU */ -#define VRC4173_DOZEPIU_IRQ VRC4173_IRQ(13) -#define VRC4173_IRQ_LAST VRC4173_DOZEPIU_IRQ - -/* - * PCI I/O accesses - */ -#ifdef CONFIG_VRC4173 - -extern unsigned long vrc4173_io_offset; - -#define set_vrc4173_io_offset(offset) do { vrc4173_io_offset = (offset); } while (0) - -#define vrc4173_outb(val,port) outb((val), vrc4173_io_offset+(port)) -#define vrc4173_outw(val,port) outw((val), vrc4173_io_offset+(port)) -#define vrc4173_outl(val,port) outl((val), vrc4173_io_offset+(port)) -#define vrc4173_outb_p(val,port) outb_p((val), vrc4173_io_offset+(port)) -#define vrc4173_outw_p(val,port) outw_p((val), vrc4173_io_offset+(port)) -#define vrc4173_outl_p(val,port) outl_p((val), vrc4173_io_offset+(port)) - -#define vrc4173_inb(port) inb(vrc4173_io_offset+(port)) -#define vrc4173_inw(port) inw(vrc4173_io_offset+(port)) -#define vrc4173_inl(port) inl(vrc4173_io_offset+(port)) -#define vrc4173_inb_p(port) inb_p(vrc4173_io_offset+(port)) -#define vrc4173_inw_p(port) inw_p(vrc4173_io_offset+(port)) -#define vrc4173_inl_p(port) inl_p(vrc4173_io_offset+(port)) - -#define vrc4173_outsb(port,addr,count) outsb(vrc4173_io_offset+(port),(addr),(count)) -#define vrc4173_outsw(port,addr,count) outsw(vrc4173_io_offset+(port),(addr),(count)) -#define vrc4173_outsl(port,addr,count) outsl(vrc4173_io_offset+(port),(addr),(count)) - -#define vrc4173_insb(port,addr,count) insb(vrc4173_io_offset+(port),(addr),(count)) -#define vrc4173_insw(port,addr,count) insw(vrc4173_io_offset+(port),(addr),(count)) -#define vrc4173_insl(port,addr,count) insl(vrc4173_io_offset+(port),(addr),(count)) - -#else - -#define set_vrc4173_io_offset(offset) do {} while (0) - -#define vrc4173_outb(val,port) do {} while (0) -#define vrc4173_outw(val,port) do {} while (0) -#define vrc4173_outl(val,port) do {} while (0) -#define vrc4173_outb_p(val,port) do {} while (0) -#define vrc4173_outw_p(val,port) do {} while (0) -#define vrc4173_outl_p(val,port) do {} while (0) - -#define vrc4173_inb(port) 0 -#define vrc4173_inw(port) 0 -#define vrc4173_inl(port) 0 -#define vrc4173_inb_p(port) 0 -#define vrc4173_inw_p(port) 0 -#define vrc4173_inl_p(port) 0 - -#define vrc4173_outsb(port,addr,count) do {} while (0) -#define vrc4173_outsw(port,addr,count) do {} while (0) -#define vrc4173_outsl(port,addr,count) do {} while (0) - -#define vrc4173_insb(port,addr,count) do {} while (0) -#define vrc4173_insw(port,addr,count) do {} while (0) -#define vrc4173_insl(port,addr,count) do {} while (0) - -#endif - -/* - * Clock Mask Unit - */ -typedef enum vrc4173_clock { - VRC4173_PIU_CLOCK, - VRC4173_KIU_CLOCK, - VRC4173_AIU_CLOCK, - VRC4173_PS2_CH1_CLOCK, - VRC4173_PS2_CH2_CLOCK, - VRC4173_USBU_PCI_CLOCK, - VRC4173_CARDU1_PCI_CLOCK, - VRC4173_CARDU2_PCI_CLOCK, - VRC4173_AC97U_PCI_CLOCK, - VRC4173_USBU_48MHz_CLOCK, - VRC4173_EXT_48MHz_CLOCK, - VRC4173_48MHz_CLOCK, -} vrc4173_clock_t; - -#ifdef CONFIG_VRC4173 - -extern void vrc4173_supply_clock(vrc4173_clock_t clock); -extern void vrc4173_mask_clock(vrc4173_clock_t clock); - -#else - -static inline void vrc4173_supply_clock(vrc4173_clock_t clock) {} -static inline void vrc4173_mask_clock(vrc4173_clock_t clock) {} - -#endif - -/* - * Interupt Control Unit - */ - -#define VRC4173_PIUINT_COMMAND 0x0040 -#define VRC4173_PIUINT_DATA 0x0020 -#define VRC4173_PIUINT_PAGE1 0x0010 -#define VRC4173_PIUINT_PAGE0 0x0008 -#define VRC4173_PIUINT_DATALOST 0x0004 -#define VRC4173_PIUINT_STATUSCHANGE 0x0001 - -#ifdef CONFIG_VRC4173 - -extern void vrc4173_enable_piuint(uint16_t mask); -extern void vrc4173_disable_piuint(uint16_t mask); - -#else - -static inline void vrc4173_enable_piuint(uint16_t mask) {} -static inline void vrc4173_disable_piuint(uint16_t mask) {} - -#endif - -#define VRC4173_AIUINT_INPUT_DMAEND 0x0800 -#define VRC4173_AIUINT_INPUT_DMAHALT 0x0400 -#define VRC4173_AIUINT_INPUT_DATALOST 0x0200 -#define VRC4173_AIUINT_INPUT_DATA 0x0100 -#define VRC4173_AIUINT_OUTPUT_DMAEND 0x0008 -#define VRC4173_AIUINT_OUTPUT_DMAHALT 0x0004 -#define VRC4173_AIUINT_OUTPUT_NODATA 0x0002 - -#ifdef CONFIG_VRC4173 - -extern void vrc4173_enable_aiuint(uint16_t mask); -extern void vrc4173_disable_aiuint(uint16_t mask); - -#else - -static inline void vrc4173_enable_aiuint(uint16_t mask) {} -static inline void vrc4173_disable_aiuint(uint16_t mask) {} - -#endif - -#define VRC4173_KIUINT_DATALOST 0x0004 -#define VRC4173_KIUINT_DATAREADY 0x0002 -#define VRC4173_KIUINT_SCAN 0x0001 - -#ifdef CONFIG_VRC4173 - -extern void vrc4173_enable_kiuint(uint16_t mask); -extern void vrc4173_disable_kiuint(uint16_t mask); - -#else - -static inline void vrc4173_enable_kiuint(uint16_t mask) {} -static inline void vrc4173_disable_kiuint(uint16_t mask) {} - -#endif - -/* - * General-Purpose I/O Unit - */ -typedef enum vrc4173_function { - PS2_CHANNEL1, - PS2_CHANNEL2, - TOUCHPANEL, - KEYBOARD_8SCANLINES, - KEYBOARD_10SCANLINES, - KEYBOARD_12SCANLINES, - GPIO_0_15PINS, - GPIO_16_20PINS, -} vrc4173_function_t; - -#ifdef CONFIG_VRC4173 - -extern void vrc4173_select_function(vrc4173_function_t function); - -#else - -static inline void vrc4173_select_function(vrc4173_function_t function) {} - -#endif - -#endif /* __NEC_VRC4173_H */ diff --git a/include/asm-mips/vr41xx/workpad.h b/include/asm-mips/vr41xx/workpad.h deleted file mode 100644 index 6bfa9c009..000000000 --- a/include/asm-mips/vr41xx/workpad.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * workpad.h, Include file for IBM WorkPad z50. - * - * Copyright (C) 2002-2004 Yoichi Yuasa - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#ifndef __IBM_WORKPAD_H -#define __IBM_WORKPAD_H - -#include -#include - -/* - * Board specific address mapping - */ -#define VR41XX_ISA_MEM_BASE 0x10000000 -#define VR41XX_ISA_MEM_SIZE 0x04000000 - -/* VR41XX_ISA_IO_BASE includes offset from real base. */ -#define VR41XX_ISA_IO_BASE 0x15000000 -#define VR41XX_ISA_IO_SIZE 0x03000000 - -#define ISA_BUS_IO_BASE 0 -#define ISA_BUS_IO_SIZE VR41XX_ISA_IO_SIZE - -#define IO_PORT_BASE KSEG1ADDR(VR41XX_ISA_IO_BASE) -#define IO_PORT_RESOURCE_START ISA_BUS_IO_BASE -#define IO_PORT_RESOURCE_END (ISA_BUS_IO_BASE + ISA_BUS_IO_SIZE - 1) - -#endif /* __IBM_WORKPAD_H */ diff --git a/include/asm-mips/war.h b/include/asm-mips/war.h index ad374bd3f..3ac146c01 100644 --- a/include/asm-mips/war.h +++ b/include/asm-mips/war.h @@ -8,7 +8,6 @@ #ifndef _ASM_WAR_H #define _ASM_WAR_H -#include /* * Another R4600 erratum. Due to the lack of errata information the exact @@ -172,7 +171,8 @@ * On the RM9000 there is a problem which makes the CreateDirtyExclusive * cache operation unusable on SMP systems. */ -#if defined(CONFIG_MOMENCO_JAGUAR_ATX) || defined(CONFIG_PMC_YOSEMITE) +#if defined(CONFIG_MOMENCO_JAGUAR_ATX) || defined(CONFIG_PMC_YOSEMITE) || \ + defined(CONFIG_BASLER_EXCITE) #define RM9000_CDEX_SMP_WAR 1 #endif @@ -182,7 +182,7 @@ * being fetched may case spurious exceptions. */ #if defined(CONFIG_MOMENCO_JAGUAR_ATX) || defined(CONFIG_MOMENCO_OCELOT_3) || \ - defined(CONFIG_PMC_YOSEMITE) + defined(CONFIG_PMC_YOSEMITE) || defined(CONFIG_BASLER_EXCITE) #define ICACHE_REFILLS_WORKAROUND_WAR 1 #endif diff --git a/include/asm-mips/wbflush.h b/include/asm-mips/wbflush.h index c3bef50f3..eadc0ac47 100644 --- a/include/asm-mips/wbflush.h +++ b/include/asm-mips/wbflush.h @@ -11,7 +11,6 @@ #ifndef _ASM_WBFLUSH_H #define _ASM_WBFLUSH_H -#include #ifdef CONFIG_CPU_HAS_WB diff --git a/include/asm-parisc/assembly.h b/include/asm-parisc/assembly.h index 3ce3440d1..1a7bfe699 100644 --- a/include/asm-parisc/assembly.h +++ b/include/asm-parisc/assembly.h @@ -48,6 +48,7 @@ #define CALLEE_SAVE_FRAME_SIZE (CALLEE_REG_FRAME_SIZE + CALLEE_FLOAT_FRAME_SIZE) #ifdef CONFIG_PA20 +#define LDCW ldcw,co #define BL b,l # ifdef CONFIG_64BIT # define LEVEL 2.0w @@ -55,6 +56,7 @@ # define LEVEL 2.0 # endif #else +#define LDCW ldcw #define BL bl #define LEVEL 1.1 #endif diff --git a/include/asm-parisc/atomic.h b/include/asm-parisc/atomic.h index 403ea9731..48bf9b8ab 100644 --- a/include/asm-parisc/atomic.h +++ b/include/asm-parisc/atomic.h @@ -5,7 +5,6 @@ #ifndef _ASM_PARISC_ATOMIC_H_ #define _ASM_PARISC_ATOMIC_H_ -#include #include #include diff --git a/include/asm-parisc/cache.h b/include/asm-parisc/cache.h index c83166547..7d22fa206 100644 --- a/include/asm-parisc/cache.h +++ b/include/asm-parisc/cache.h @@ -5,7 +5,6 @@ #ifndef __ARCH_PARISC_CACHE_H #define __ARCH_PARISC_CACHE_H -#include /* * PA 2.0 processors have 64-byte cachelines; PA 1.1 processors have diff --git a/include/asm-parisc/cacheflush.h b/include/asm-parisc/cacheflush.h index 76b6b7d60..0b459cdfb 100644 --- a/include/asm-parisc/cacheflush.h +++ b/include/asm-parisc/cacheflush.h @@ -1,7 +1,6 @@ #ifndef _PARISC_CACHEFLUSH_H #define _PARISC_CACHEFLUSH_H -#include #include #include /* for flush_user_dcache_range_asm() proto */ diff --git a/include/asm-parisc/compat.h b/include/asm-parisc/compat.h index 289624d8b..71b4eeea2 100644 --- a/include/asm-parisc/compat.h +++ b/include/asm-parisc/compat.h @@ -5,6 +5,7 @@ */ #include #include +#include #define COMPAT_USER_HZ 100 @@ -149,4 +150,14 @@ static __inline__ void __user *compat_alloc_user_space(long len) return (void __user *)regs->gr[30]; } +static inline int __is_compat_task(struct task_struct *t) +{ + return personality(t->personality) == PER_LINUX32; +} + +static inline int is_compat_task(void) +{ + return __is_compat_task(current); +} + #endif /* _ASM_PARISC_COMPAT_H */ diff --git a/include/asm-parisc/dma-mapping.h b/include/asm-parisc/dma-mapping.h index 74d4ac6f2..1e387e1da 100644 --- a/include/asm-parisc/dma-mapping.h +++ b/include/asm-parisc/dma-mapping.h @@ -1,7 +1,6 @@ #ifndef _PARISC_DMA_MAPPING_H #define _PARISC_DMA_MAPPING_H -#include #include #include #include diff --git a/include/asm-parisc/dma.h b/include/asm-parisc/dma.h index 31fd10df4..9979c3cb3 100644 --- a/include/asm-parisc/dma.h +++ b/include/asm-parisc/dma.h @@ -9,7 +9,6 @@ #ifndef _ASM_DMA_H #define _ASM_DMA_H -#include #include /* need byte IO */ #include diff --git a/include/asm-parisc/floppy.h b/include/asm-parisc/floppy.h index ca3aed768..da2f9c157 100644 --- a/include/asm-parisc/floppy.h +++ b/include/asm-parisc/floppy.h @@ -156,13 +156,11 @@ static int vdma_get_dma_residue(unsigned int dummy) static int fd_request_irq(void) { if(can_use_virtual_dma) - return request_irq(FLOPPY_IRQ, floppy_hardint,SA_INTERRUPT, - "floppy", NULL); + return request_irq(FLOPPY_IRQ, floppy_hardint, + IRQF_DISABLED, "floppy", NULL); else return request_irq(FLOPPY_IRQ, floppy_interrupt, - SA_INTERRUPT|SA_SAMPLE_RANDOM, - "floppy", NULL); - + IRQF_DISABLED, "floppy", NULL); } static unsigned long dma_mem_alloc(unsigned long size) diff --git a/include/asm-parisc/hw_irq.h b/include/asm-parisc/hw_irq.h index 151426e27..6707f7df3 100644 --- a/include/asm-parisc/hw_irq.h +++ b/include/asm-parisc/hw_irq.h @@ -3,15 +3,6 @@ /* * linux/include/asm/hw_irq.h - * - * (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar - * - * moved some of the old arch/i386/kernel/irq.h to here. VY - * - * IRQ/IPI changes taken from work by Thomas Radke - * */ -extern void hw_resend_irq(struct hw_interrupt_type *, unsigned int); - #endif diff --git a/include/asm-parisc/io.h b/include/asm-parisc/io.h index 244f6b888..b9eb245b8 100644 --- a/include/asm-parisc/io.h +++ b/include/asm-parisc/io.h @@ -1,7 +1,6 @@ #ifndef _ASM_IO_H #define _ASM_IO_H -#include #include #include diff --git a/include/asm-parisc/irq.h b/include/asm-parisc/irq.h index b0a30e2c9..5cae26061 100644 --- a/include/asm-parisc/irq.h +++ b/include/asm-parisc/irq.h @@ -7,7 +7,6 @@ #ifndef _ASM_PARISC_IRQ_H #define _ASM_PARISC_IRQ_H -#include #include #include @@ -27,11 +26,6 @@ #define NR_IRQS (CPU_IRQ_MAX + 1) -/* - * IRQ line status macro IRQ_PER_CPU is used - */ -#define ARCH_HAS_IRQ_PER_CPU - static __inline__ int irq_canonicalize(int irq) { return (irq == 2) ? 9 : irq; diff --git a/include/asm-parisc/kmap_types.h b/include/asm-parisc/kmap_types.h index 6886a0c3f..806aae3c5 100644 --- a/include/asm-parisc/kmap_types.h +++ b/include/asm-parisc/kmap_types.h @@ -1,7 +1,6 @@ #ifndef _ASM_KMAP_TYPES_H #define _ASM_KMAP_TYPES_H -#include #ifdef CONFIG_DEBUG_HIGHMEM # define D(n) __KM_FENCE_##n , diff --git a/include/asm-parisc/mmzone.h b/include/asm-parisc/mmzone.h index ceb9b7319..c87813662 100644 --- a/include/asm-parisc/mmzone.h +++ b/include/asm-parisc/mmzone.h @@ -14,11 +14,6 @@ extern struct node_map_data node_data[]; #define NODE_DATA(nid) (&node_data[nid].pg_data) -/* - * Given a kernel address, find the home node of the underlying memory. - */ -#define kvaddr_to_nid(kaddr) pfn_to_nid(__pa(kaddr) >> PAGE_SHIFT) - #define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn) #define node_end_pfn(nid) \ ({ \ diff --git a/include/asm-parisc/page.h b/include/asm-parisc/page.h index a3f24a6e9..fcae97e6a 100644 --- a/include/asm-parisc/page.h +++ b/include/asm-parisc/page.h @@ -1,23 +1,14 @@ #ifndef _PARISC_PAGE_H #define _PARISC_PAGE_H -#if !defined(__KERNEL__) -/* this is for userspace applications (4k page size) */ -# define PAGE_SHIFT 12 /* 4k */ -# define PAGE_SIZE (1UL << PAGE_SHIFT) -# define PAGE_MASK (~(PAGE_SIZE-1)) -#endif - - #ifdef __KERNEL__ -#include #if defined(CONFIG_PARISC_PAGE_SIZE_4KB) -# define PAGE_SHIFT 12 /* 4k */ +# define PAGE_SHIFT 12 #elif defined(CONFIG_PARISC_PAGE_SIZE_16KB) -# define PAGE_SHIFT 14 /* 16k */ +# define PAGE_SHIFT 14 #elif defined(CONFIG_PARISC_PAGE_SIZE_64KB) -# define PAGE_SHIFT 16 /* 64k */ +# define PAGE_SHIFT 16 #else # error "unknown default kernel page size" #endif @@ -189,11 +180,11 @@ extern int npmem_ranges; #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \ VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) +#include +#include + #define devmem_is_allowed(x) 1 #endif /* __KERNEL__ */ -#include -#include - #endif /* _PARISC_PAGE_H */ diff --git a/include/asm-parisc/param.h b/include/asm-parisc/param.h index f4694d452..07cb9b93c 100644 --- a/include/asm-parisc/param.h +++ b/include/asm-parisc/param.h @@ -2,7 +2,6 @@ #define _ASMPARISC_PARAM_H #ifdef __KERNEL__ -#include # ifdef CONFIG_PA20 # define HZ 1000 /* Faster machines */ # else diff --git a/include/asm-parisc/pci.h b/include/asm-parisc/pci.h index 77bbafb7f..8b631f47e 100644 --- a/include/asm-parisc/pci.h +++ b/include/asm-parisc/pci.h @@ -1,7 +1,6 @@ #ifndef __ASM_PARISC_PCI_H #define __ASM_PARISC_PCI_H -#include #include diff --git a/include/asm-parisc/pdc.h b/include/asm-parisc/pdc.h index 0a3face6c..c9b2e3532 100644 --- a/include/asm-parisc/pdc.h +++ b/include/asm-parisc/pdc.h @@ -1,7 +1,6 @@ #ifndef _PARISC_PDC_H #define _PARISC_PDC_H -#include /* * PDC return values ... @@ -279,12 +278,11 @@ typedef struct { /* constants for OS (NVM...) */ #define OS_ID_NONE 0 /* Undefined OS ID */ #define OS_ID_HPUX 1 /* HP-UX OS */ -#define OS_ID_LINUX OS_ID_HPUX /* just use the same value as hpux */ #define OS_ID_MPEXL 2 /* MPE XL OS */ #define OS_ID_OSF 3 /* OSF OS */ #define OS_ID_HPRT 4 /* HP-RT OS */ #define OS_ID_NOVEL 5 /* NOVELL OS */ -#define OS_ID_NT 6 /* NT OS */ +#define OS_ID_LINUX 6 /* Linux */ /* constants for PDC_CHASSIS */ @@ -353,8 +351,8 @@ struct pdc_cache_cf { /* for PDC_CACHE (I/D-caches) */ cc_wt : 1, /* 0 = WT-Dcache, 1 = WB-Dcache */ cc_sh : 2, /* 0 = separate I/D-cache, else shared I/D-cache */ cc_cst : 3, /* 0 = incoherent D-cache, 1=coherent D-cache */ - cc_pad1 : 5, /* reserved */ - cc_assoc: 8; /* associativity of I/D-cache */ + cc_pad1 : 10, /* reserved */ + cc_hv : 3; /* hversion dependent */ }; struct pdc_tlb_cf { /* for PDC_CACHE (I/D-TLB's) */ @@ -720,6 +718,7 @@ void setup_pdc(void); /* in inventory.c */ int pdc_add_valid(unsigned long address); int pdc_chassis_info(struct pdc_chassis_info *chassis_info, void *led_info, unsigned long len); int pdc_chassis_disp(unsigned long disp); +int pdc_chassis_warn(unsigned long *warn); int pdc_coproc_cfg(struct pdc_coproc_cfg *pdc_coproc_info); int pdc_iodc_read(unsigned long *actcnt, unsigned long hpa, unsigned int index, void *iodc_data, unsigned int iodc_data_size); @@ -733,6 +732,7 @@ int pdc_model_cpuid(unsigned long *cpu_id); int pdc_model_versions(unsigned long *versions, int id); int pdc_model_capabilities(unsigned long *capabilities); int pdc_cache_info(struct pdc_cache_info *cache); +int pdc_spaceid_bits(unsigned long *space_bits); #ifndef CONFIG_PA20 int pdc_btlb_info(struct pdc_btlb_info *btlb); int pdc_mem_map_hpa(struct pdc_memory_map *r_addr, struct pdc_module_path *mod_path); @@ -776,6 +776,18 @@ int pdc_sti_call(unsigned long func, unsigned long flags, extern void pdc_init(void); +static inline char * os_id_to_string(u16 os_id) { + switch(os_id) { + case OS_ID_NONE: return "No OS"; + case OS_ID_HPUX: return "HP-UX"; + case OS_ID_MPEXL: return "MPE-iX"; + case OS_ID_OSF: return "OSF"; + case OS_ID_HPRT: return "HP-RT"; + case OS_ID_NOVEL: return "Novell Netware"; + case OS_ID_LINUX: return "Linux"; + default: return "Unknown"; + } +} #endif /* __ASSEMBLY__ */ #endif /* _PARISC_PDC_H */ diff --git a/include/asm-parisc/pgtable.h b/include/asm-parisc/pgtable.h index aec089eb8..5066c54da 100644 --- a/include/asm-parisc/pgtable.h +++ b/include/asm-parisc/pgtable.h @@ -3,7 +3,6 @@ #include -#include #include #ifndef __ASSEMBLY__ @@ -507,13 +506,13 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, /* TLB page size encoding - see table 3-1 in parisc20.pdf */ #define _PAGE_SIZE_ENCODING_4K 0 -#define _PAGE_SIZE_ENCODING_16K 1 -#define _PAGE_SIZE_ENCODING_64K 2 +#define _PAGE_SIZE_ENCODING_16K 1 +#define _PAGE_SIZE_ENCODING_64K 2 #define _PAGE_SIZE_ENCODING_256K 3 #define _PAGE_SIZE_ENCODING_1M 4 #define _PAGE_SIZE_ENCODING_4M 5 -#define _PAGE_SIZE_ENCODING_16M 6 -#define _PAGE_SIZE_ENCODING_64M 7 +#define _PAGE_SIZE_ENCODING_16M 6 +#define _PAGE_SIZE_ENCODING_64M 7 #if defined(CONFIG_PARISC_PAGE_SIZE_4KB) # define _PAGE_SIZE_ENCODING_DEFAULT _PAGE_SIZE_ENCODING_4K diff --git a/include/asm-parisc/processor.h b/include/asm-parisc/processor.h index 89f2f1c16..b73626f04 100644 --- a/include/asm-parisc/processor.h +++ b/include/asm-parisc/processor.h @@ -9,7 +9,6 @@ #define __ASM_PARISC_PROCESSOR_H #ifndef __ASSEMBLY__ -#include #include #include @@ -27,14 +26,12 @@ * Default implementation of macro that returns current * instruction pointer ("program counter"). */ - -/* We cannot use MFIA as it was added for PA2.0 - prumpf - - At one point there were no "0f/0b" type local symbols in gas for - PA-RISC. This is no longer true, but this still seems like the - nicest way to implement this. */ - -#define current_text_addr() ({ void *pc; __asm__("\n\tblr 0,%0\n\tnop":"=r" (pc)); pc; }) +#ifdef CONFIG_PA20 +#define current_ia(x) __asm__("mfia %0" : "=r"(x)) +#else /* mfia added in pa2.0 */ +#define current_ia(x) __asm__("blr 0,%0\n\tnop" : "=r"(x)) +#endif +#define current_text_addr() ({ void *pc; current_ia(pc); pc; }) #define TASK_SIZE (current->thread.task_size) #define TASK_UNMAPPED_BASE (current->thread.map_base) diff --git a/include/asm-parisc/psw.h b/include/asm-parisc/psw.h index 4334d6ca2..5a3e23c9c 100644 --- a/include/asm-parisc/psw.h +++ b/include/asm-parisc/psw.h @@ -1,6 +1,5 @@ #ifndef _PARISC_PSW_H -#include #define PSW_I 0x00000001 #define PSW_D 0x00000002 diff --git a/include/asm-parisc/signal.h b/include/asm-parisc/signal.h index 25cb23ef7..98a82fa0c 100644 --- a/include/asm-parisc/signal.h +++ b/include/asm-parisc/signal.h @@ -48,7 +48,6 @@ * SA_FLAGS values: * * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. * SA_RESETHAND clears the handler when the signal is delivered. @@ -69,7 +68,6 @@ #define SA_NOMASK SA_NODEFER #define SA_ONESHOT SA_RESETHAND -#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ #define SA_RESTORER 0x04000000 /* obsolete -- ignored */ diff --git a/include/asm-parisc/smp.h b/include/asm-parisc/smp.h index dbdbd2e9f..d4c0e26af 100644 --- a/include/asm-parisc/smp.h +++ b/include/asm-parisc/smp.h @@ -1,7 +1,6 @@ #ifndef __ASM_SMP_H #define __ASM_SMP_H -#include #if defined(CONFIG_SMP) diff --git a/include/asm-parisc/socket.h b/include/asm-parisc/socket.h index 1bf54dc53..ce2eae170 100644 --- a/include/asm-parisc/socket.h +++ b/include/asm-parisc/socket.h @@ -48,5 +48,6 @@ #define SO_ACCEPTCONN 0x401c #define SO_PEERSEC 0x401d +#define SO_PASSSEC 0x401e #endif /* _ASM_SOCKET_H */ diff --git a/include/asm-parisc/system.h b/include/asm-parisc/system.h index a5a973c0c..74f037a39 100644 --- a/include/asm-parisc/system.h +++ b/include/asm-parisc/system.h @@ -1,7 +1,6 @@ #ifndef __PARISC_SYSTEM_H #define __PARISC_SYSTEM_H -#include #include /* The program status word as bitfields. */ @@ -144,8 +143,6 @@ static inline void set_eiem(unsigned long val) #define read_barrier_depends() do { } while(0) #define set_mb(var, value) do { var = value; mb(); } while (0) -#define set_wmb(var, value) do { var = value; wmb(); } while (0) - #ifndef CONFIG_PA20 /* Because kmalloc only guarantees 8-byte alignment for kmalloc'd data, @@ -156,13 +153,14 @@ static inline void set_eiem(unsigned long val) type and dynamically select the 16-byte aligned int from the array for the semaphore. */ -#define __PA_LDCW_ALIGNMENT 16 -#define __ldcw_align(a) ({ \ - unsigned long __ret = (unsigned long) &(a)->lock[0]; \ - __ret = (__ret + __PA_LDCW_ALIGNMENT - 1) & ~(__PA_LDCW_ALIGNMENT - 1); \ - (volatile unsigned int *) __ret; \ +#define __PA_LDCW_ALIGNMENT 16 +#define __ldcw_align(a) ({ \ + unsigned long __ret = (unsigned long) &(a)->lock[0]; \ + __ret = (__ret + __PA_LDCW_ALIGNMENT - 1) \ + & ~(__PA_LDCW_ALIGNMENT - 1); \ + (volatile unsigned int *) __ret; \ }) -#define LDCW "ldcw" +#define __LDCW "ldcw" #else /*CONFIG_PA20*/ /* From: "Jim Hull" @@ -172,17 +170,18 @@ static inline void set_eiem(unsigned long val) they only require "natural" alignment (4-byte for ldcw, 8-byte for ldcd). */ -#define __PA_LDCW_ALIGNMENT 4 +#define __PA_LDCW_ALIGNMENT 4 #define __ldcw_align(a) ((volatile unsigned int *)a) -#define LDCW "ldcw,co" +#define __LDCW "ldcw,co" #endif /*!CONFIG_PA20*/ /* LDCW, the only atomic read-write operation PA-RISC has. *sigh*. */ -#define __ldcw(a) ({ \ - unsigned __ret; \ - __asm__ __volatile__(LDCW " 0(%1),%0" : "=r" (__ret) : "r" (a)); \ - __ret; \ +#define __ldcw(a) ({ \ + unsigned __ret; \ + __asm__ __volatile__(__LDCW " 0(%1),%0" \ + : "=r" (__ret) : "r" (a)); \ + __ret; \ }) #ifdef CONFIG_SMP diff --git a/include/asm-parisc/tlbflush.h b/include/asm-parisc/tlbflush.h index 825994a90..f662e837d 100644 --- a/include/asm-parisc/tlbflush.h +++ b/include/asm-parisc/tlbflush.h @@ -3,7 +3,6 @@ /* TLB flushing routines.... */ -#include #include #include diff --git a/include/asm-parisc/uaccess.h b/include/asm-parisc/uaccess.h index f6c417c8c..d973e8b34 100644 --- a/include/asm-parisc/uaccess.h +++ b/include/asm-parisc/uaccess.h @@ -172,7 +172,11 @@ struct exception_data { /* * The "__put_user/kernel_asm()" macros tell gcc they read from memory * instead of writing. This is because they do not write to any memory - * gcc knows about, so there are no aliasing issues. + * gcc knows about, so there are no aliasing issues. These macros must + * also be aware that "fixup_put_user_skip_[12]" are executed in the + * context of the fault, and any registers used there must be listed + * as clobbers. In this case only "r1" is used by the current routines. + * r8/r9 are already listed as err/val. */ #ifdef __LP64__ @@ -183,7 +187,8 @@ struct exception_data { "\t.dword\t1b,fixup_put_user_skip_1\n" \ "\t.previous" \ : "=r"(__pu_err) \ - : "r"(ptr), "r"(x), "0"(__pu_err)) + : "r"(ptr), "r"(x), "0"(__pu_err) \ + : "r1") #define __put_user_asm(stx,x,ptr) \ __asm__ __volatile__ ( \ diff --git a/include/asm-parisc/unistd.h b/include/asm-parisc/unistd.h index 0e1a30be2..27bcfad1c 100644 --- a/include/asm-parisc/unistd.h +++ b/include/asm-parisc/unistd.h @@ -792,15 +792,11 @@ #define HPUX_GATEWAY_ADDR 0xC0000004 #define LINUX_GATEWAY_ADDR 0x100 +#ifdef __KERNEL__ #ifndef __ASSEMBLY__ #define SYS_ify(syscall_name) __NR_##syscall_name -/* Assume all syscalls are done from PIC code just to be - * safe. The worst case scenario is that you lose a register - * and save/restore r19 across the syscall. */ -#define PIC - #ifndef ASM_LINE_SEP # define ASM_LINE_SEP ; #endif @@ -934,7 +930,6 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \ return K_INLINE_SYSCALL(name, 5, arg1, arg2, arg3, arg4, arg5); \ } -#ifdef __KERNEL__ #define __ARCH_WANT_OLD_READDIR #define __ARCH_WANT_STAT64 #define __ARCH_WANT_SYS_ALARM @@ -956,7 +951,6 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \ #define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPROCMASK #define __ARCH_WANT_SYS_RT_SIGACTION -#endif /* mmap & mmap2 take 6 arguments */ #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5,type6,arg6) \ @@ -1056,4 +1050,5 @@ asmlinkage long sys_rt_sigaction(int sig, */ #define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") +#endif /* __KERNEL__ */ #endif /* _ASM_PARISC_UNISTD_H_ */ diff --git a/include/asm-powerpc/abs_addr.h b/include/asm-powerpc/abs_addr.h index c5c3259e0..4aa220718 100644 --- a/include/asm-powerpc/abs_addr.h +++ b/include/asm-powerpc/abs_addr.h @@ -2,7 +2,6 @@ #define _ASM_POWERPC_ABS_ADDR_H #ifdef __KERNEL__ -#include /* * c 2001 PPC 64 Team, IBM Corp diff --git a/include/asm-powerpc/atomic.h b/include/asm-powerpc/atomic.h index bb3c0ab7e..53283e254 100644 --- a/include/asm-powerpc/atomic.h +++ b/include/asm-powerpc/atomic.h @@ -27,8 +27,8 @@ static __inline__ void atomic_add(int a, atomic_t *v) PPC405_ERR77(0,%3) " stwcx. %0,0,%3 \n\ bne- 1b" - : "=&r" (t), "=m" (v->counter) - : "r" (a), "r" (&v->counter), "m" (v->counter) + : "=&r" (t), "+m" (v->counter) + : "r" (a), "r" (&v->counter) : "cc"); } @@ -63,8 +63,8 @@ static __inline__ void atomic_sub(int a, atomic_t *v) PPC405_ERR77(0,%3) " stwcx. %0,0,%3 \n\ bne- 1b" - : "=&r" (t), "=m" (v->counter) - : "r" (a), "r" (&v->counter), "m" (v->counter) + : "=&r" (t), "+m" (v->counter) + : "r" (a), "r" (&v->counter) : "cc"); } @@ -97,8 +97,8 @@ static __inline__ void atomic_inc(atomic_t *v) PPC405_ERR77(0,%2) " stwcx. %0,0,%2 \n\ bne- 1b" - : "=&r" (t), "=m" (v->counter) - : "r" (&v->counter), "m" (v->counter) + : "=&r" (t), "+m" (v->counter) + : "r" (&v->counter) : "cc"); } @@ -141,8 +141,8 @@ static __inline__ void atomic_dec(atomic_t *v) PPC405_ERR77(0,%2)\ " stwcx. %0,0,%2\n\ bne- 1b" - : "=&r" (t), "=m" (v->counter) - : "r" (&v->counter), "m" (v->counter) + : "=&r" (t), "+m" (v->counter) + : "r" (&v->counter) : "cc"); } @@ -253,8 +253,8 @@ static __inline__ void atomic64_add(long a, atomic64_t *v) add %0,%2,%0\n\ stdcx. %0,0,%3 \n\ bne- 1b" - : "=&r" (t), "=m" (v->counter) - : "r" (a), "r" (&v->counter), "m" (v->counter) + : "=&r" (t), "+m" (v->counter) + : "r" (a), "r" (&v->counter) : "cc"); } @@ -287,8 +287,8 @@ static __inline__ void atomic64_sub(long a, atomic64_t *v) subf %0,%2,%0\n\ stdcx. %0,0,%3 \n\ bne- 1b" - : "=&r" (t), "=m" (v->counter) - : "r" (a), "r" (&v->counter), "m" (v->counter) + : "=&r" (t), "+m" (v->counter) + : "r" (a), "r" (&v->counter) : "cc"); } @@ -319,8 +319,8 @@ static __inline__ void atomic64_inc(atomic64_t *v) addic %0,%0,1\n\ stdcx. %0,0,%2 \n\ bne- 1b" - : "=&r" (t), "=m" (v->counter) - : "r" (&v->counter), "m" (v->counter) + : "=&r" (t), "+m" (v->counter) + : "r" (&v->counter) : "cc"); } @@ -361,8 +361,8 @@ static __inline__ void atomic64_dec(atomic64_t *v) addic %0,%0,-1\n\ stdcx. %0,0,%2\n\ bne- 1b" - : "=&r" (t), "=m" (v->counter) - : "r" (&v->counter), "m" (v->counter) + : "=&r" (t), "+m" (v->counter) + : "r" (&v->counter) : "cc"); } diff --git a/include/asm-powerpc/backlight.h b/include/asm-powerpc/backlight.h index 1ba1f27a0..8cf5c37c3 100644 --- a/include/asm-powerpc/backlight.h +++ b/include/asm-powerpc/backlight.h @@ -2,30 +2,40 @@ * Routines for handling backlight control on PowerBooks * * For now, implementation resides in - * arch/powerpc/platforms/powermac/pmac_support.c + * arch/powerpc/platforms/powermac/backlight.c * */ #ifndef __ASM_POWERPC_BACKLIGHT_H #define __ASM_POWERPC_BACKLIGHT_H #ifdef __KERNEL__ -/* Abstract values */ -#define BACKLIGHT_OFF 0 -#define BACKLIGHT_MIN 1 -#define BACKLIGHT_MAX 0xf +#include +#include -struct backlight_controller { - int (*set_enable)(int enable, int level, void *data); - int (*set_level)(int level, void *data); -}; +/* For locking instructions, see the implementation file */ +extern struct backlight_device *pmac_backlight; +extern struct mutex pmac_backlight_mutex; -extern void register_backlight_controller(struct backlight_controller *ctrler, void *data, char *type); -extern void unregister_backlight_controller(struct backlight_controller *ctrler, void *data); +extern int pmac_backlight_curve_lookup(struct fb_info *info, int value); -extern int set_backlight_enable(int enable); -extern int get_backlight_enable(void); -extern int set_backlight_level(int level); -extern int get_backlight_level(void); +extern int pmac_has_backlight_type(const char *type); + +extern void pmac_backlight_key(int direction); +static inline void pmac_backlight_key_up(void) +{ + pmac_backlight_key(0); +} +static inline void pmac_backlight_key_down(void) +{ + pmac_backlight_key(1); +} + +extern void pmac_backlight_set_legacy_brightness_pmu(int brightness); +extern int pmac_backlight_set_legacy_brightness(int brightness); +extern int pmac_backlight_get_legacy_brightness(void); + +extern void pmac_backlight_enable(void); +extern void pmac_backlight_disable(void); #endif /* __KERNEL__ */ #endif diff --git a/include/asm-powerpc/bitops.h b/include/asm-powerpc/bitops.h index d1c2a4405..c341063d0 100644 --- a/include/asm-powerpc/bitops.h +++ b/include/asm-powerpc/bitops.h @@ -65,8 +65,8 @@ static __inline__ void set_bit(int nr, volatile unsigned long *addr) PPC405_ERR77(0,%3) PPC_STLCX "%0,0,%3\n" "bne- 1b" - : "=&r"(old), "=m"(*p) - : "r"(mask), "r"(p), "m"(*p) + : "=&r" (old), "+m" (*p) + : "r" (mask), "r" (p) : "cc" ); } @@ -82,8 +82,8 @@ static __inline__ void clear_bit(int nr, volatile unsigned long *addr) PPC405_ERR77(0,%3) PPC_STLCX "%0,0,%3\n" "bne- 1b" - : "=&r"(old), "=m"(*p) - : "r"(mask), "r"(p), "m"(*p) + : "=&r" (old), "+m" (*p) + : "r" (mask), "r" (p) : "cc" ); } @@ -99,8 +99,8 @@ static __inline__ void change_bit(int nr, volatile unsigned long *addr) PPC405_ERR77(0,%3) PPC_STLCX "%0,0,%3\n" "bne- 1b" - : "=&r"(old), "=m"(*p) - : "r"(mask), "r"(p), "m"(*p) + : "=&r" (old), "+m" (*p) + : "r" (mask), "r" (p) : "cc" ); } @@ -179,8 +179,8 @@ static __inline__ void set_bits(unsigned long mask, unsigned long *addr) "or %0,%0,%2\n" PPC_STLCX "%0,0,%3\n" "bne- 1b" - : "=&r" (old), "=m" (*addr) - : "r" (mask), "r" (addr), "m" (*addr) + : "=&r" (old), "+m" (*addr) + : "r" (mask), "r" (addr) : "cc"); } @@ -288,8 +288,8 @@ static __inline__ int test_le_bit(unsigned long nr, #define __test_and_clear_le_bit(nr, addr) \ __test_and_clear_bit((nr) ^ BITOP_LE_SWIZZLE, (addr)) -#define find_first_zero_le_bit(addr, size) find_next_zero_le_bit((addr), (size), 0) -unsigned long find_next_zero_le_bit(const unsigned long *addr, +#define find_first_zero_le_bit(addr, size) generic_find_next_zero_le_bit((addr), (size), 0) +unsigned long generic_find_next_zero_le_bit(const unsigned long *addr, unsigned long size, unsigned long offset); /* Bitmap functions for the ext2 filesystem */ @@ -309,7 +309,7 @@ unsigned long find_next_zero_le_bit(const unsigned long *addr, #define ext2_find_first_zero_bit(addr, size) \ find_first_zero_le_bit((unsigned long*)addr, size) #define ext2_find_next_zero_bit(addr, size, off) \ - find_next_zero_le_bit((unsigned long*)addr, size, off) + generic_find_next_zero_le_bit((unsigned long*)addr, size, off) /* Bitmap functions for the minix filesystem. */ diff --git a/include/asm-powerpc/cache.h b/include/asm-powerpc/cache.h index 6379c2df5..642be62cf 100644 --- a/include/asm-powerpc/cache.h +++ b/include/asm-powerpc/cache.h @@ -3,7 +3,6 @@ #ifdef __KERNEL__ -#include /* bytes per L1 cache line */ #if defined(CONFIG_8xx) || defined(CONFIG_403GCX) diff --git a/include/asm-powerpc/cputable.h b/include/asm-powerpc/cputable.h index f6265c2a0..1ba3c9983 100644 --- a/include/asm-powerpc/cputable.h +++ b/include/asm-powerpc/cputable.h @@ -24,6 +24,9 @@ #define PPC_FEATURE_ICACHE_SNOOP 0x00002000 #define PPC_FEATURE_ARCH_2_05 0x00001000 +#define PPC_FEATURE_TRUE_LE 0x00000002 +#define PPC_FEATURE_PPC_LE 0x00000001 + #ifdef __KERNEL__ #ifndef __ASSEMBLY__ @@ -69,6 +72,13 @@ struct cpu_spec { /* Processor specific oprofile operations */ enum powerpc_oprofile_type oprofile_type; + /* Bit locations inside the mmcra change */ + unsigned long oprofile_mmcra_sihv; + unsigned long oprofile_mmcra_sipr; + + /* Bits to clear during an oprofile exception */ + unsigned long oprofile_mmcra_clear; + /* Name of processor class, for the ELF AT_PLATFORM entry */ char *platform; }; @@ -104,41 +114,33 @@ extern void do_cpu_ftr_fixups(unsigned long offset); #define CPU_FTR_NO_BTIC ASM_CONST(0x0000000000040000) #define CPU_FTR_BIG_PHYS ASM_CONST(0x0000000000080000) #define CPU_FTR_NODSISRALIGN ASM_CONST(0x0000000000100000) +#define CPU_FTR_PPC_LE ASM_CONST(0x0000000000200000) +#define CPU_FTR_REAL_LE ASM_CONST(0x0000000000400000) +/* + * Add the 64-bit processor unique features in the top half of the word; + * on 32-bit, make the names available but defined to be 0. + */ #ifdef __powerpc64__ -/* Add the 64b processor unique features in the top half of the word */ -#define CPU_FTR_SLB ASM_CONST(0x0000000100000000) -#define CPU_FTR_16M_PAGE ASM_CONST(0x0000000200000000) -#define CPU_FTR_TLBIEL ASM_CONST(0x0000000400000000) -#define CPU_FTR_NOEXECUTE ASM_CONST(0x0000000800000000) -#define CPU_FTR_IABR ASM_CONST(0x0000002000000000) -#define CPU_FTR_MMCRA ASM_CONST(0x0000004000000000) -#define CPU_FTR_CTRL ASM_CONST(0x0000008000000000) -#define CPU_FTR_SMT ASM_CONST(0x0000010000000000) -#define CPU_FTR_COHERENT_ICACHE ASM_CONST(0x0000020000000000) -#define CPU_FTR_LOCKLESS_TLBIE ASM_CONST(0x0000040000000000) -#define CPU_FTR_MMCRA_SIHV ASM_CONST(0x0000080000000000) -#define CPU_FTR_CI_LARGE_PAGE ASM_CONST(0x0000100000000000) -#define CPU_FTR_PAUSE_ZERO ASM_CONST(0x0000200000000000) -#define CPU_FTR_PURR ASM_CONST(0x0000400000000000) +#define LONG_ASM_CONST(x) ASM_CONST(x) #else -/* ensure on 32b processors the flags are available for compiling but - * don't do anything */ -#define CPU_FTR_SLB ASM_CONST(0x0) -#define CPU_FTR_16M_PAGE ASM_CONST(0x0) -#define CPU_FTR_TLBIEL ASM_CONST(0x0) -#define CPU_FTR_NOEXECUTE ASM_CONST(0x0) -#define CPU_FTR_IABR ASM_CONST(0x0) -#define CPU_FTR_MMCRA ASM_CONST(0x0) -#define CPU_FTR_CTRL ASM_CONST(0x0) -#define CPU_FTR_SMT ASM_CONST(0x0) -#define CPU_FTR_COHERENT_ICACHE ASM_CONST(0x0) -#define CPU_FTR_LOCKLESS_TLBIE ASM_CONST(0x0) -#define CPU_FTR_MMCRA_SIHV ASM_CONST(0x0) -#define CPU_FTR_CI_LARGE_PAGE ASM_CONST(0x0) -#define CPU_FTR_PURR ASM_CONST(0x0) +#define LONG_ASM_CONST(x) 0 #endif +#define CPU_FTR_SLB LONG_ASM_CONST(0x0000000100000000) +#define CPU_FTR_16M_PAGE LONG_ASM_CONST(0x0000000200000000) +#define CPU_FTR_TLBIEL LONG_ASM_CONST(0x0000000400000000) +#define CPU_FTR_NOEXECUTE LONG_ASM_CONST(0x0000000800000000) +#define CPU_FTR_IABR LONG_ASM_CONST(0x0000002000000000) +#define CPU_FTR_MMCRA LONG_ASM_CONST(0x0000004000000000) +#define CPU_FTR_CTRL LONG_ASM_CONST(0x0000008000000000) +#define CPU_FTR_SMT LONG_ASM_CONST(0x0000010000000000) +#define CPU_FTR_COHERENT_ICACHE LONG_ASM_CONST(0x0000020000000000) +#define CPU_FTR_LOCKLESS_TLBIE LONG_ASM_CONST(0x0000040000000000) +#define CPU_FTR_CI_LARGE_PAGE LONG_ASM_CONST(0x0000100000000000) +#define CPU_FTR_PAUSE_ZERO LONG_ASM_CONST(0x0000200000000000) +#define CPU_FTR_PURR LONG_ASM_CONST(0x0000400000000000) + #ifndef __ASSEMBLY__ #define CPU_FTR_PPCAS_ARCH_V2_BASE (CPU_FTR_SLB | \ @@ -192,92 +194,95 @@ extern void do_cpu_ftr_fixups(unsigned long offset); #define CPU_FTRS_PPC601 (CPU_FTR_COMMON | CPU_FTR_601 | CPU_FTR_HPTE_TABLE) #define CPU_FTRS_603 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | \ - CPU_FTR_MAYBE_CAN_NAP) + CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_PPC_LE) #define CPU_FTRS_604 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ - CPU_FTR_USE_TB | CPU_FTR_604_PERF_MON | CPU_FTR_HPTE_TABLE) + CPU_FTR_USE_TB | CPU_FTR_604_PERF_MON | CPU_FTR_HPTE_TABLE | \ + CPU_FTR_PPC_LE) #define CPU_FTRS_740_NOTAU (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \ - CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP) + CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_PPC_LE) #define CPU_FTRS_740 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \ - CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP) + CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP | \ + CPU_FTR_PPC_LE) #define CPU_FTRS_750 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \ - CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP) + CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP | \ + CPU_FTR_PPC_LE) #define CPU_FTRS_750FX1 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \ CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP | \ - CPU_FTR_DUAL_PLL_750FX | CPU_FTR_NO_DPM) + CPU_FTR_DUAL_PLL_750FX | CPU_FTR_NO_DPM | CPU_FTR_PPC_LE) #define CPU_FTRS_750FX2 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \ CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP | \ - CPU_FTR_NO_DPM) + CPU_FTR_NO_DPM | CPU_FTR_PPC_LE) #define CPU_FTRS_750FX (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \ CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP | \ - CPU_FTR_DUAL_PLL_750FX | CPU_FTR_HAS_HIGH_BATS) + CPU_FTR_DUAL_PLL_750FX | CPU_FTR_HAS_HIGH_BATS | CPU_FTR_PPC_LE) #define CPU_FTRS_750GX (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE | \ CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU | \ CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP | \ - CPU_FTR_DUAL_PLL_750FX | CPU_FTR_HAS_HIGH_BATS) + CPU_FTR_DUAL_PLL_750FX | CPU_FTR_HAS_HIGH_BATS | CPU_FTR_PPC_LE) #define CPU_FTRS_7400_NOTAU (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \ CPU_FTR_ALTIVEC_COMP | CPU_FTR_HPTE_TABLE | \ - CPU_FTR_MAYBE_CAN_NAP) + CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_PPC_LE) #define CPU_FTRS_7400 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \ CPU_FTR_TAU | CPU_FTR_ALTIVEC_COMP | CPU_FTR_HPTE_TABLE | \ - CPU_FTR_MAYBE_CAN_NAP) + CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_PPC_LE) #define CPU_FTRS_7450_20 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \ CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | \ - CPU_FTR_NEED_COHERENT) + CPU_FTR_NEED_COHERENT | CPU_FTR_PPC_LE) #define CPU_FTRS_7450_21 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ CPU_FTR_USE_TB | \ CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \ CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | \ CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_L3_DISABLE_NAP | \ - CPU_FTR_NEED_COHERENT) + CPU_FTR_NEED_COHERENT | CPU_FTR_PPC_LE) #define CPU_FTRS_7450_23 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ CPU_FTR_USE_TB | \ CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \ CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | \ - CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_NEED_COHERENT) + CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_NEED_COHERENT | CPU_FTR_PPC_LE) #define CPU_FTRS_7455_1 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ CPU_FTR_USE_TB | \ CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR | \ CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | CPU_FTR_HAS_HIGH_BATS | \ - CPU_FTR_NEED_COHERENT) + CPU_FTR_NEED_COHERENT | CPU_FTR_PPC_LE) #define CPU_FTRS_7455_20 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ CPU_FTR_USE_TB | \ CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \ CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | \ CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_L3_DISABLE_NAP | \ - CPU_FTR_NEED_COHERENT | CPU_FTR_HAS_HIGH_BATS) + CPU_FTR_NEED_COHERENT | CPU_FTR_HAS_HIGH_BATS | CPU_FTR_PPC_LE) #define CPU_FTRS_7455 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ CPU_FTR_USE_TB | \ CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \ CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | \ CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS | \ - CPU_FTR_NEED_COHERENT) + CPU_FTR_NEED_COHERENT | CPU_FTR_PPC_LE) #define CPU_FTRS_7447_10 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ CPU_FTR_USE_TB | \ CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \ CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | \ CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS | \ - CPU_FTR_NEED_COHERENT | CPU_FTR_NO_BTIC) + CPU_FTR_NEED_COHERENT | CPU_FTR_NO_BTIC | CPU_FTR_PPC_LE) #define CPU_FTRS_7447 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ CPU_FTR_USE_TB | \ CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \ CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | \ CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS | \ - CPU_FTR_NEED_COHERENT) + CPU_FTR_NEED_COHERENT | CPU_FTR_PPC_LE) #define CPU_FTRS_7447A (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ CPU_FTR_USE_TB | \ CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \ CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | \ CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS | \ - CPU_FTR_NEED_COHERENT) + CPU_FTR_NEED_COHERENT | CPU_FTR_PPC_LE) #define CPU_FTRS_82XX (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB) #define CPU_FTRS_G2_LE (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE | \ @@ -287,13 +292,6 @@ extern void do_cpu_ftr_fixups(unsigned long offset); CPU_FTR_COMMON) #define CPU_FTRS_CLASSIC32 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE) -#define CPU_FTRS_POWER3_32 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ - CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE) -#define CPU_FTRS_POWER4_32 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ - CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_NODSISRALIGN) -#define CPU_FTRS_970_32 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ - CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_ALTIVEC_COMP | \ - CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_NODSISRALIGN) #define CPU_FTRS_8XX (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB) #define CPU_FTRS_40X (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ CPU_FTR_NODSISRALIGN) @@ -307,7 +305,7 @@ extern void do_cpu_ftr_fixups(unsigned long offset); #define CPU_FTRS_GENERIC_32 (CPU_FTR_COMMON | CPU_FTR_NODSISRALIGN) #ifdef __powerpc64__ #define CPU_FTRS_POWER3 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ - CPU_FTR_HPTE_TABLE | CPU_FTR_IABR) + CPU_FTR_HPTE_TABLE | CPU_FTR_IABR | CPU_FTR_PPC_LE) #define CPU_FTRS_RS64 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ CPU_FTR_HPTE_TABLE | CPU_FTR_IABR | \ CPU_FTR_MMCRA | CPU_FTR_CTRL) @@ -320,12 +318,12 @@ extern void do_cpu_ftr_fixups(unsigned long offset); CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | \ CPU_FTR_MMCRA | CPU_FTR_SMT | \ CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | \ - CPU_FTR_MMCRA_SIHV | CPU_FTR_PURR) + CPU_FTR_PURR) #define CPU_FTRS_POWER6 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | \ CPU_FTR_MMCRA | CPU_FTR_SMT | \ CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | \ - CPU_FTR_PURR | CPU_FTR_CI_LARGE_PAGE) + CPU_FTR_PURR | CPU_FTR_CI_LARGE_PAGE | CPU_FTR_REAL_LE) #define CPU_FTRS_CELL (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | \ CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \ @@ -354,12 +352,6 @@ enum { #else CPU_FTRS_GENERIC_32 | #endif -#ifdef CONFIG_PPC64BRIDGE - CPU_FTRS_POWER3_32 | -#endif -#ifdef CONFIG_POWER4 - CPU_FTRS_POWER4_32 | CPU_FTRS_970_32 | -#endif #ifdef CONFIG_8xx CPU_FTRS_8XX | #endif @@ -399,12 +391,6 @@ enum { #else CPU_FTRS_GENERIC_32 & #endif -#ifdef CONFIG_PPC64BRIDGE - CPU_FTRS_POWER3_32 & -#endif -#ifdef CONFIG_POWER4 - CPU_FTRS_POWER4_32 & CPU_FTRS_970_32 & -#endif #ifdef CONFIG_8xx CPU_FTRS_8XX & #endif diff --git a/include/asm-powerpc/cputime.h b/include/asm-powerpc/cputime.h index a21185d47..310804485 100644 --- a/include/asm-powerpc/cputime.h +++ b/include/asm-powerpc/cputime.h @@ -43,6 +43,7 @@ typedef u64 cputime64_t; #define cputime64_zero ((cputime64_t)0) #define cputime64_add(__a, __b) ((__a) + (__b)) +#define cputime64_sub(__a, __b) ((__a) - (__b)) #define cputime_to_cputime64(__ct) (__ct) #ifdef __KERNEL__ @@ -74,6 +75,23 @@ static inline cputime_t jiffies_to_cputime(const unsigned long jif) return ct; } +static inline cputime64_t jiffies64_to_cputime64(const u64 jif) +{ + cputime_t ct; + u64 sec; + + /* have to be a little careful about overflow */ + ct = jif % HZ; + sec = jif / HZ; + if (ct) { + ct *= tb_ticks_per_sec; + do_div(ct, HZ); + } + if (sec) + ct += (cputime_t) sec * tb_ticks_per_sec; + return ct; +} + static inline u64 cputime64_to_jiffies64(const cputime_t ct) { return mulhdu(ct, __cputime_jiffies_factor); diff --git a/include/asm-powerpc/delay.h b/include/asm-powerpc/delay.h index 057a60955..f9200a65c 100644 --- a/include/asm-powerpc/delay.h +++ b/include/asm-powerpc/delay.h @@ -17,5 +17,18 @@ extern void __delay(unsigned long loops); extern void udelay(unsigned long usecs); +/* + * On shared processor machines the generic implementation of mdelay can + * result in large errors. While each iteration of the loop inside mdelay + * is supposed to take 1ms, the hypervisor could sleep our partition for + * longer (eg 10ms). With the right timing these errors can add up. + * + * Since there is no 32bit overflow issue on 64bit kernels, just call + * udelay directly. + */ +#ifdef CONFIG_PPC64 +#define mdelay(n) udelay((n) * 1000) +#endif + #endif /* __KERNEL__ */ #endif /* _ASM_POWERPC_DELAY_H */ diff --git a/include/asm-powerpc/dma-mapping.h b/include/asm-powerpc/dma-mapping.h index 2ac63f569..2ab9baf78 100644 --- a/include/asm-powerpc/dma-mapping.h +++ b/include/asm-powerpc/dma-mapping.h @@ -8,7 +8,6 @@ #define _ASM_DMA_MAPPING_H #ifdef __KERNEL__ -#include #include #include /* need struct page definitions */ diff --git a/include/asm-powerpc/dma.h b/include/asm-powerpc/dma.h index 4bb57fe37..7a4374bdb 100644 --- a/include/asm-powerpc/dma.h +++ b/include/asm-powerpc/dma.h @@ -22,7 +22,6 @@ * with a grain of salt. */ -#include #include #include #include diff --git a/include/asm-powerpc/eeh.h b/include/asm-powerpc/eeh.h index 868c7139d..6a7843966 100644 --- a/include/asm-powerpc/eeh.h +++ b/include/asm-powerpc/eeh.h @@ -21,7 +21,6 @@ #define _PPC64_EEH_H #ifdef __KERNEL__ -#include #include #include #include @@ -206,6 +205,7 @@ static inline void eeh_memset_io(volatile void __iomem *addr, int c, lc |= lc << 8; lc |= lc << 16; + __asm__ __volatile__ ("sync" : : : "memory"); while(n && !EEH_CHECK_ALIGN(p, 4)) { *((volatile u8 *)p) = c; p++; @@ -230,6 +230,7 @@ static inline void eeh_memcpy_fromio(void *dest, const volatile void __iomem *sr void *destsave = dest; unsigned long nsave = n; + __asm__ __volatile__ ("sync" : : : "memory"); while(n && (!EEH_CHECK_ALIGN(vsrc, 4) || !EEH_CHECK_ALIGN(dest, 4))) { *((u8 *)dest) = *((volatile u8 *)vsrc); __asm__ __volatile__ ("eieio" : : : "memory"); @@ -267,6 +268,7 @@ static inline void eeh_memcpy_toio(volatile void __iomem *dest, const void *src, { void *vdest = (void __force *) dest; + __asm__ __volatile__ ("sync" : : : "memory"); while(n && (!EEH_CHECK_ALIGN(vdest, 4) || !EEH_CHECK_ALIGN(src, 4))) { *((volatile u8 *)vdest) = *((u8 *)src); src++; @@ -293,8 +295,6 @@ static inline void eeh_memcpy_toio(volatile void __iomem *dest, const void *src, static inline u8 eeh_inb(unsigned long port) { u8 val; - if (!_IO_IS_VALID(port)) - return ~0; val = in_8((u8 __iomem *)(port+pci_io_base)); if (EEH_POSSIBLE_ERROR(val, u8)) return eeh_check_failure((void __iomem *)(port), val); @@ -303,15 +303,12 @@ static inline u8 eeh_inb(unsigned long port) static inline void eeh_outb(u8 val, unsigned long port) { - if (_IO_IS_VALID(port)) - out_8((u8 __iomem *)(port+pci_io_base), val); + out_8((u8 __iomem *)(port+pci_io_base), val); } static inline u16 eeh_inw(unsigned long port) { u16 val; - if (!_IO_IS_VALID(port)) - return ~0; val = in_le16((u16 __iomem *)(port+pci_io_base)); if (EEH_POSSIBLE_ERROR(val, u16)) return eeh_check_failure((void __iomem *)(port), val); @@ -320,15 +317,12 @@ static inline u16 eeh_inw(unsigned long port) static inline void eeh_outw(u16 val, unsigned long port) { - if (_IO_IS_VALID(port)) - out_le16((u16 __iomem *)(port+pci_io_base), val); + out_le16((u16 __iomem *)(port+pci_io_base), val); } static inline u32 eeh_inl(unsigned long port) { u32 val; - if (!_IO_IS_VALID(port)) - return ~0; val = in_le32((u32 __iomem *)(port+pci_io_base)); if (EEH_POSSIBLE_ERROR(val, u32)) return eeh_check_failure((void __iomem *)(port), val); @@ -337,8 +331,7 @@ static inline u32 eeh_inl(unsigned long port) static inline void eeh_outl(u32 val, unsigned long port) { - if (_IO_IS_VALID(port)) - out_le32((u32 __iomem *)(port+pci_io_base), val); + out_le32((u32 __iomem *)(port+pci_io_base), val); } /* in-string eeh macros */ diff --git a/include/asm-powerpc/eeh_event.h b/include/asm-powerpc/eeh_event.h index 93d55a2be..dc6bf0ffb 100644 --- a/include/asm-powerpc/eeh_event.h +++ b/include/asm-powerpc/eeh_event.h @@ -18,8 +18,8 @@ * Copyright (c) 2005 Linas Vepstas */ -#ifndef ASM_PPC64_EEH_EVENT_H -#define ASM_PPC64_EEH_EVENT_H +#ifndef ASM_POWERPC_EEH_EVENT_H +#define ASM_POWERPC_EEH_EVENT_H #ifdef __KERNEL__ /** EEH event -- structure holding pci controller data that describes @@ -39,7 +39,7 @@ struct eeh_event { * @dev pci device * * This routine builds a PCI error event which will be delivered - * to all listeners on the peh_notifier_chain. + * to all listeners on the eeh_notifier_chain. * * This routine can be called within an interrupt context; * the actual event will be delivered in a normal context @@ -51,7 +51,7 @@ int eeh_send_failure_event (struct device_node *dn, int time_unavail); /* Main recovery function */ -void handle_eeh_events (struct eeh_event *); +struct pci_dn * handle_eeh_events (struct eeh_event *); #endif /* __KERNEL__ */ -#endif /* ASM_PPC64_EEH_EVENT_H */ +#endif /* ASM_POWERPC_EEH_EVENT_H */ diff --git a/include/asm-powerpc/elf.h b/include/asm-powerpc/elf.h index cfa0e243c..2aba27e87 100644 --- a/include/asm-powerpc/elf.h +++ b/include/asm-powerpc/elf.h @@ -3,14 +3,14 @@ #ifdef __KERNEL__ #include /* for task_struct */ +#include +#include #endif #include #include #include #include -#include -#include /* PowerPC relocations defined by the ABIs */ #define R_PPC_NONE 0 @@ -129,7 +129,7 @@ typedef elf_greg_t32 elf_gregset_t32[ELF_NGREG]; /* Assumption: ELF_ARCH == EM_PPC and ELF_CLASS == ELFCLASS32 */ typedef elf_greg_t32 elf_greg_t; typedef elf_gregset_t32 elf_gregset_t; -# define elf_addr_t u32 +# define elf_addr_t __u32 #endif /* ELF_ARCH */ /* Floating point registers */ @@ -161,6 +161,7 @@ typedef elf_vrreg_t elf_vrregset_t[ELF_NVRREG]; typedef elf_vrreg_t elf_vrregset_t32[ELF_NVRREG32]; #endif +#ifdef __KERNEL__ /* * This is used to ensure we don't load something for the wrong architecture. */ @@ -176,8 +177,6 @@ typedef elf_vrreg_t elf_vrregset_t32[ELF_NVRREG32]; #define ELF_ET_DYN_BASE (0x08000000) -#ifdef __KERNEL__ - /* Common routine for both 32-bit and 64-bit processes */ static inline void ppc_elf_core_copy_regs(elf_gregset_t elf_regs, struct pt_regs *regs) @@ -295,7 +294,7 @@ do { \ NEW_AUX_ENT(AT_DCACHEBSIZE, dcache_bsize); \ NEW_AUX_ENT(AT_ICACHEBSIZE, icache_bsize); \ NEW_AUX_ENT(AT_UCACHEBSIZE, ucache_bsize); \ - VDSO_AUX_ENT(AT_SYSINFO_EHDR, current->thread.vdso_base) \ + VDSO_AUX_ENT(AT_SYSINFO_EHDR, current->mm->context.vdso_base) \ } while (0) /* PowerPC64 relocations defined by the ABIs */ diff --git a/include/asm-powerpc/floppy.h b/include/asm-powerpc/floppy.h index 608164c39..fd242a223 100644 --- a/include/asm-powerpc/floppy.h +++ b/include/asm-powerpc/floppy.h @@ -11,7 +11,6 @@ #define __ASM_POWERPC_FLOPPY_H #ifdef __KERNEL__ -#include #include #define fd_inb(port) inb_p(port) @@ -28,8 +27,7 @@ #define fd_disable_irq() disable_irq(FLOPPY_IRQ) #define fd_cacheflush(addr,size) /* nothing */ #define fd_request_irq() request_irq(FLOPPY_IRQ, floppy_interrupt, \ - SA_INTERRUPT|SA_SAMPLE_RANDOM, \ - "floppy", NULL) + IRQF_DISABLED, "floppy", NULL) #define fd_free_irq() free_irq(FLOPPY_IRQ, NULL); #ifdef CONFIG_PCI diff --git a/include/asm-powerpc/futex.h b/include/asm-powerpc/futex.h index f1b3c00bc..936422e54 100644 --- a/include/asm-powerpc/futex.h +++ b/include/asm-powerpc/futex.h @@ -84,7 +84,33 @@ static inline int futex_atomic_op_inuser (int encoded_op, int __user *uaddr) static inline int futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) { - return -ENOSYS; + int prev; + + if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) + return -EFAULT; + + __asm__ __volatile__ ( + LWSYNC_ON_SMP +"1: lwarx %0,0,%2 # futex_atomic_cmpxchg_inatomic\n\ + cmpw 0,%0,%3\n\ + bne- 3f\n" + PPC405_ERR77(0,%2) +"2: stwcx. %4,0,%2\n\ + bne- 1b\n" + ISYNC_ON_SMP +"3: .section .fixup,\"ax\"\n\ +4: li %0,%5\n\ + b 3b\n\ + .previous\n\ + .section __ex_table,\"a\"\n\ + .align 3\n\ + " PPC_LONG "1b,4b,2b,4b\n\ + .previous" \ + : "=&r" (prev), "+m" (*uaddr) + : "r" (uaddr), "r" (oldval), "r" (newval), "i" (-EFAULT) + : "cc", "memory"); + + return prev; } #endif /* __KERNEL__ */ diff --git a/include/asm-powerpc/hvcall.h b/include/asm-powerpc/hvcall.h index 6cc7e1fb7..0d3c4e857 100644 --- a/include/asm-powerpc/hvcall.h +++ b/include/asm-powerpc/hvcall.h @@ -102,6 +102,15 @@ #define H_PP1 (1UL<<(63-62)) #define H_PP2 (1UL<<(63-63)) +/* VASI States */ +#define H_VASI_INVALID 0 +#define H_VASI_ENABLED 1 +#define H_VASI_ABORTED 2 +#define H_VASI_SUSPENDING 3 +#define H_VASI_SUSPENDED 4 +#define H_VASI_RESUMED 5 +#define H_VASI_COMPLETED 6 + /* DABRX flags */ #define H_DABRX_HYPERVISOR (1UL<<(63-61)) #define H_DABRX_KERNEL (1UL<<(63-62)) @@ -190,6 +199,7 @@ #define H_QUERY_INT_STATE 0x1E4 #define H_POLL_PENDING 0x1D8 #define H_JOIN 0x298 +#define H_VASI_STATE 0x2A4 #define H_ENABLE_CRQ 0x2B0 #ifndef __ASSEMBLY__ diff --git a/include/asm-powerpc/hw_irq.h b/include/asm-powerpc/hw_irq.h index 26b89d859..d40359204 100644 --- a/include/asm-powerpc/hw_irq.h +++ b/include/asm-powerpc/hw_irq.h @@ -6,7 +6,6 @@ #ifdef __KERNEL__ -#include #include #include #include @@ -87,27 +86,27 @@ static inline void local_irq_save_ptr(unsigned long *flags) #define mask_irq(irq) \ ({ \ irq_desc_t *desc = get_irq_desc(irq); \ - if (desc->handler && desc->handler->disable) \ - desc->handler->disable(irq); \ + if (desc->chip && desc->chip->disable) \ + desc->chip->disable(irq); \ }) #define unmask_irq(irq) \ ({ \ irq_desc_t *desc = get_irq_desc(irq); \ - if (desc->handler && desc->handler->enable) \ - desc->handler->enable(irq); \ + if (desc->chip && desc->chip->enable) \ + desc->chip->enable(irq); \ }) #define ack_irq(irq) \ ({ \ irq_desc_t *desc = get_irq_desc(irq); \ - if (desc->handler && desc->handler->ack) \ - desc->handler->ack(irq); \ + if (desc->chip && desc->chip->ack) \ + desc->chip->ack(irq); \ }) -/* Should we handle this via lost interrupts and IPIs or should we don't care like - * we do now ? --BenH. +/* + * interrupt-retrigger: should we handle this via lost interrupts and IPIs + * or should we not care like we do now ? --BenH. */ struct hw_interrupt_type; -static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) {} #endif /* __KERNEL__ */ #endif /* _ASM_POWERPC_HW_IRQ_H */ diff --git a/include/asm-powerpc/i8259.h b/include/asm-powerpc/i8259.h index 0392159e1..c80e11305 100644 --- a/include/asm-powerpc/i8259.h +++ b/include/asm-powerpc/i8259.h @@ -4,11 +4,13 @@ #include -extern struct hw_interrupt_type i8259_pic; - +#ifdef CONFIG_PPC_MERGE +extern void i8259_init(struct device_node *node, unsigned long intack_addr); +extern unsigned int i8259_irq(struct pt_regs *regs); +#else extern void i8259_init(unsigned long intack_addr, int offset); extern int i8259_irq(struct pt_regs *regs); -extern int i8259_irq_cascade(struct pt_regs *regs, void *unused); +#endif #endif /* __KERNEL__ */ #endif /* _ASM_POWERPC_I8259_H */ diff --git a/include/asm-powerpc/ide.h b/include/asm-powerpc/ide.h index da5f64048..b09b42af6 100644 --- a/include/asm-powerpc/ide.h +++ b/include/asm-powerpc/ide.h @@ -22,7 +22,6 @@ #endif #ifndef __powerpc64__ -#include #include #include #include diff --git a/include/asm-powerpc/io.h b/include/asm-powerpc/io.h index f1c2469b8..212428db0 100644 --- a/include/asm-powerpc/io.h +++ b/include/asm-powerpc/io.h @@ -19,6 +19,7 @@ extern int check_legacy_ioport(unsigned long base_port); #include #include #include +#include #ifdef CONFIG_PPC_ISERIES #include #endif @@ -40,12 +41,6 @@ extern int check_legacy_ioport(unsigned long base_port); 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 */ @@ -78,6 +73,9 @@ extern unsigned long io_page_mask; * Neither do the standard versions now, these are just here * for older code. */ +#define insb(port, buf, ns) _insb((u8 __iomem *)((port)+pci_io_base), (buf), (ns)) +#define insw(port, buf, ns) _insw_ns((u8 __iomem *)((port)+pci_io_base), (buf), (ns)) +#define insl(port, buf, nl) _insl_ns((u8 __iomem *)((port)+pci_io_base), (buf), (nl)) #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 @@ -143,12 +141,12 @@ static inline void __raw_writeq(unsigned long v, volatile void __iomem *addr) #define insw_ns(port, buf, ns) eeh_insw_ns((port), (buf), (ns)) #define insl_ns(port, buf, nl) eeh_insl_ns((port), (buf), (nl)) +#endif + #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) @@ -165,7 +163,11 @@ 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() +static inline void mmiowb(void) +{ + __asm__ __volatile__ ("sync" : : : "memory"); + get_paca()->io_sync = 0; +} /* * output pause versions need a delay at least for the @@ -281,22 +283,23 @@ 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" + __asm__ __volatile__("sync; 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" + __asm__ __volatile__("sync; stb%U0%X0 %1,%0" : "=m" (*addr) : "r" (val)); + get_paca()->io_sync = 1; } static inline int in_le16(const volatile unsigned short __iomem *addr) { int ret; - __asm__ __volatile__("lhbrx %0,0,%1; twi 0,%0,0; isync" + __asm__ __volatile__("sync; lhbrx %0,0,%1; twi 0,%0,0; isync" : "=r" (ret) : "r" (addr), "m" (*addr)); return ret; } @@ -305,28 +308,30 @@ 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" + __asm__ __volatile__("sync; 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" + __asm__ __volatile__("sync; sthbrx %1,0,%2" : "=m" (*addr) : "r" (val), "r" (addr)); + get_paca()->io_sync = 1; } static inline void out_be16(volatile unsigned short __iomem *addr, int val) { - __asm__ __volatile__("sth%U0%X0 %1,%0; sync" + __asm__ __volatile__("sync; sth%U0%X0 %1,%0" : "=m" (*addr) : "r" (val)); + get_paca()->io_sync = 1; } static inline unsigned in_le32(const volatile unsigned __iomem *addr) { unsigned ret; - __asm__ __volatile__("lwbrx %0,0,%1; twi 0,%0,0; isync" + __asm__ __volatile__("sync; lwbrx %0,0,%1; twi 0,%0,0; isync" : "=r" (ret) : "r" (addr), "m" (*addr)); return ret; } @@ -335,21 +340,23 @@ static inline unsigned in_be32(const volatile unsigned __iomem *addr) { unsigned ret; - __asm__ __volatile__("lwz%U1%X1 %0,%1; twi 0,%0,0; isync" + __asm__ __volatile__("sync; 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) + __asm__ __volatile__("sync; stwbrx %1,0,%2" : "=m" (*addr) : "r" (val), "r" (addr)); + get_paca()->io_sync = 1; } static inline void out_be32(volatile unsigned __iomem *addr, int val) { - __asm__ __volatile__("stw%U0%X0 %1,%0; sync" + __asm__ __volatile__("sync; stw%U0%X0 %1,%0" : "=m" (*addr) : "r" (val)); + get_paca()->io_sync = 1; } static inline unsigned long in_le64(const volatile unsigned long __iomem *addr) @@ -357,6 +364,7 @@ static inline unsigned long in_le64(const volatile unsigned long __iomem *addr) unsigned long tmp, ret; __asm__ __volatile__( + "sync\n" "ld %1,0(%2)\n" "twi 0,%1,0\n" "isync\n" @@ -375,7 +383,7 @@ 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" + __asm__ __volatile__("sync; ld%U1%X1 %0,%1; twi 0,%0,0; isync" : "=r" (ret) : "m" (*addr)); return ret; } @@ -392,14 +400,16 @@ static inline void out_le64(volatile unsigned long __iomem *addr, unsigned long "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" + "sync\n" + "std %0,0(%3)" : "=&r" (tmp) , "=&r" (val) : "1" (val) , "b" (addr) , "m" (*addr)); + get_paca()->io_sync = 1; } 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)); + __asm__ __volatile__("sync; std%U0%X0 %1,%0" : "=m" (*addr) : "r" (val)); + get_paca()->io_sync = 1; } #ifndef CONFIG_PPC_ISERIES diff --git a/include/asm-powerpc/iommu.h b/include/asm-powerpc/iommu.h index 18ca29e91..a5e98641a 100644 --- a/include/asm-powerpc/iommu.h +++ b/include/asm-powerpc/iommu.h @@ -22,7 +22,6 @@ #define _ASM_IOMMU_H #ifdef __KERNEL__ -#include #include #include #include @@ -67,7 +66,8 @@ extern void iommu_free_table(struct device_node *dn); /* Initializes an iommu_table based in values set in the passed-in * structure */ -extern struct iommu_table *iommu_init_table(struct iommu_table * tbl); +extern struct iommu_table *iommu_init_table(struct iommu_table * tbl, + int nid); extern int iommu_map_sg(struct device *dev, struct iommu_table *tbl, struct scatterlist *sglist, int nelems, unsigned long mask, @@ -76,7 +76,8 @@ extern void iommu_unmap_sg(struct iommu_table *tbl, struct scatterlist *sglist, int nelems, enum dma_data_direction direction); extern void *iommu_alloc_coherent(struct iommu_table *tbl, size_t size, - dma_addr_t *dma_handle, unsigned long mask, gfp_t flag); + dma_addr_t *dma_handle, unsigned long mask, + gfp_t flag, int node); extern void iommu_free_coherent(struct iommu_table *tbl, size_t size, void *vaddr, dma_addr_t dma_handle); extern dma_addr_t iommu_map_single(struct iommu_table *tbl, void *vaddr, diff --git a/include/asm-powerpc/ipic.h b/include/asm-powerpc/ipic.h index 0fe396a2b..53079ec3a 100644 --- a/include/asm-powerpc/ipic.h +++ b/include/asm-powerpc/ipic.h @@ -69,9 +69,6 @@ enum ipic_mcp_irq { IPIC_MCP_MU = 7, }; -extern void ipic_init(phys_addr_t phys_addr, unsigned int flags, - unsigned int irq_offset, - unsigned char *senses, unsigned int senses_count); extern int ipic_set_priority(unsigned int irq, unsigned int priority); extern void ipic_set_highest_priority(unsigned int irq); extern void ipic_set_default_priority(void); @@ -79,7 +76,16 @@ extern void ipic_enable_mcp(enum ipic_mcp_irq mcp_irq); extern void ipic_disable_mcp(enum ipic_mcp_irq mcp_irq); extern u32 ipic_get_mcp_status(void); extern void ipic_clear_mcp_status(u32 mask); + +#ifdef CONFIG_PPC_MERGE +extern void ipic_init(struct device_node *node, unsigned int flags); +extern unsigned int ipic_get_irq(struct pt_regs *regs); +#else +extern void ipic_init(phys_addr_t phys_addr, unsigned int flags, + unsigned int irq_offset, + unsigned char *senses, unsigned int senses_count); extern int ipic_get_irq(struct pt_regs *regs); +#endif #endif /* __ASM_IPIC_H__ */ #endif /* __KERNEL__ */ diff --git a/include/asm-powerpc/irq.h b/include/asm-powerpc/irq.h index 7bc6d73b2..571490073 100644 --- a/include/asm-powerpc/irq.h +++ b/include/asm-powerpc/irq.h @@ -9,32 +9,13 @@ * 2 of the License, or (at your option) any later version. */ -#include #include +#include +#include #include #include -/* this number is used when no interrupt has been assigned */ -#define NO_IRQ (-1) - -/* - * These constants are used for passing information about interrupt - * signal polarity and level/edge sensing to the low-level PIC chip - * drivers. - */ -#define IRQ_SENSE_MASK 0x1 -#define IRQ_SENSE_LEVEL 0x1 /* interrupt on active level */ -#define IRQ_SENSE_EDGE 0x0 /* interrupt triggered by edge */ - -#define IRQ_POLARITY_MASK 0x2 -#define IRQ_POLARITY_POSITIVE 0x2 /* high level or low->high edge */ -#define IRQ_POLARITY_NEGATIVE 0x0 /* low level or high->low edge */ - -/* - * IRQ line status macro IRQ_PER_CPU is used - */ -#define ARCH_HAS_IRQ_PER_CPU #define get_irq_desc(irq) (&irq_desc[(irq)]) @@ -42,50 +23,313 @@ #define for_each_irq(i) \ for ((i) = 0; (i) < NR_IRQS; ++(i)) -#ifdef CONFIG_PPC64 +extern atomic_t ppc_n_lost_interrupts; -/* - * Maximum number of interrupt sources that we can handle. +#ifdef CONFIG_PPC_MERGE + +/* This number is used when no interrupt has been assigned */ +#define NO_IRQ (0) + +/* This is a special irq number to return from get_irq() to tell that + * no interrupt happened _and_ ignore it (don't count it as bad). Some + * platforms like iSeries rely on that. */ +#define NO_IRQ_IGNORE ((unsigned int)-1) + +/* Total number of virq in the platform (make it a CONFIG_* option ? */ #define NR_IRQS 512 -/* Interrupt numbers are virtual in case they are sparsely - * distributed by the hardware. +/* Number of irqs reserved for the legacy controller */ +#define NUM_ISA_INTERRUPTS 16 + +/* This type is the placeholder for a hardware interrupt number. It has to + * be big enough to enclose whatever representation is used by a given + * platform. + */ +typedef unsigned long irq_hw_number_t; + +/* Interrupt controller "host" data structure. This could be defined as a + * irq domain controller. That is, it handles the mapping between hardware + * and virtual interrupt numbers for a given interrupt domain. The host + * structure is generally created by the PIC code for a given PIC instance + * (though a host can cover more than one PIC if they have a flat number + * model). It's the host callbacks that are responsible for setting the + * irq_chip on a given irq_desc after it's been mapped. + * + * The host code and data structures are fairly agnostic to the fact that + * we use an open firmware device-tree. We do have references to struct + * device_node in two places: in irq_find_host() to find the host matching + * a given interrupt controller node, and of course as an argument to its + * counterpart host->ops->match() callback. However, those are treated as + * generic pointers by the core and the fact that it's actually a device-node + * pointer is purely a convention between callers and implementation. This + * code could thus be used on other architectures by replacing those two + * by some sort of arch-specific void * "token" used to identify interrupt + * controllers. + */ +struct irq_host; +struct radix_tree_root; + +/* Functions below are provided by the host and called whenever a new mapping + * is created or an old mapping is disposed. The host can then proceed to + * whatever internal data structures management is required. It also needs + * to setup the irq_desc when returning from map(). + */ +struct irq_host_ops { + /* Match an interrupt controller device node to a host, returns + * 1 on a match + */ + int (*match)(struct irq_host *h, struct device_node *node); + + /* Create or update a mapping between a virtual irq number and a hw + * irq number. This is called only once for a given mapping. + */ + int (*map)(struct irq_host *h, unsigned int virq, irq_hw_number_t hw); + + /* Dispose of such a mapping */ + void (*unmap)(struct irq_host *h, unsigned int virq); + + /* Translate device-tree interrupt specifier from raw format coming + * from the firmware to a irq_hw_number_t (interrupt line number) and + * type (sense) that can be passed to set_irq_type(). In the absence + * of this callback, irq_create_of_mapping() and irq_of_parse_and_map() + * will return the hw number in the first cell and IRQ_TYPE_NONE for + * the type (which amount to keeping whatever default value the + * interrupt controller has for that line) + */ + int (*xlate)(struct irq_host *h, struct device_node *ctrler, + u32 *intspec, unsigned int intsize, + irq_hw_number_t *out_hwirq, unsigned int *out_type); +}; + +struct irq_host { + struct list_head link; + + /* type of reverse mapping technique */ + unsigned int revmap_type; +#define IRQ_HOST_MAP_LEGACY 0 /* legacy 8259, gets irqs 1..15 */ +#define IRQ_HOST_MAP_NOMAP 1 /* no fast reverse mapping */ +#define IRQ_HOST_MAP_LINEAR 2 /* linear map of interrupts */ +#define IRQ_HOST_MAP_TREE 3 /* radix tree */ + union { + struct { + unsigned int size; + unsigned int *revmap; + } linear; + struct radix_tree_root tree; + } revmap_data; + struct irq_host_ops *ops; + void *host_data; + irq_hw_number_t inval_irq; +}; + +/* The main irq map itself is an array of NR_IRQ entries containing the + * associate host and irq number. An entry with a host of NULL is free. + * An entry can be allocated if it's free, the allocator always then sets + * hwirq first to the host's invalid irq number and then fills ops. + */ +struct irq_map_entry { + irq_hw_number_t hwirq; + struct irq_host *host; +}; + +extern struct irq_map_entry irq_map[NR_IRQS]; + + +/*** + * irq_alloc_host - Allocate a new irq_host data structure + * @node: device-tree node of the interrupt controller + * @revmap_type: type of reverse mapping to use + * @revmap_arg: for IRQ_HOST_MAP_LINEAR linear only: size of the map + * @ops: map/unmap host callbacks + * @inval_irq: provide a hw number in that host space that is always invalid + * + * Allocates and initialize and irq_host structure. Note that in the case of + * IRQ_HOST_MAP_LEGACY, the map() callback will be called before this returns + * for all legacy interrupts except 0 (which is always the invalid irq for + * a legacy controller). For a IRQ_HOST_MAP_LINEAR, the map is allocated by + * this call as well. For a IRQ_HOST_MAP_TREE, the radix tree will be allocated + * later during boot automatically (the reverse mapping will use the slow path + * until that happens). + */ +extern struct irq_host *irq_alloc_host(unsigned int revmap_type, + unsigned int revmap_arg, + struct irq_host_ops *ops, + irq_hw_number_t inval_irq); + + +/*** + * irq_find_host - Locates a host for a given device node + * @node: device-tree node of the interrupt controller + */ +extern struct irq_host *irq_find_host(struct device_node *node); + + +/*** + * irq_set_default_host - Set a "default" host + * @host: default host pointer + * + * For convenience, it's possible to set a "default" host that will be used + * whenever NULL is passed to irq_create_mapping(). It makes life easier for + * platforms that want to manipulate a few hard coded interrupt numbers that + * aren't properly represented in the device-tree. + */ +extern void irq_set_default_host(struct irq_host *host); + + +/*** + * irq_set_virq_count - Set the maximum number of virt irqs + * @count: number of linux virtual irqs, capped with NR_IRQS + * + * This is mainly for use by platforms like iSeries who want to program + * the virtual irq number in the controller to avoid the reverse mapping + */ +extern void irq_set_virq_count(unsigned int count); + + +/*** + * irq_create_mapping - Map a hardware interrupt into linux virq space + * @host: host owning this hardware interrupt or NULL for default host + * @hwirq: hardware irq number in that host space + * + * Only one mapping per hardware interrupt is permitted. Returns a linux + * virq number. + * If the sense/trigger is to be specified, set_irq_type() should be called + * on the number returned from that call. + */ +extern unsigned int irq_create_mapping(struct irq_host *host, + irq_hw_number_t hwirq); + + +/*** + * irq_dispose_mapping - Unmap an interrupt + * @virq: linux virq number of the interrupt to unmap + */ +extern void irq_dispose_mapping(unsigned int virq); + +/*** + * irq_find_mapping - Find a linux virq from an hw irq number. + * @host: host owning this hardware interrupt + * @hwirq: hardware irq number in that host space + * + * This is a slow path, for use by generic code. It's expected that an + * irq controller implementation directly calls the appropriate low level + * mapping function. + */ +extern unsigned int irq_find_mapping(struct irq_host *host, + irq_hw_number_t hwirq); + + +/*** + * irq_radix_revmap - Find a linux virq from a hw irq number. + * @host: host owning this hardware interrupt + * @hwirq: hardware irq number in that host space + * + * This is a fast path, for use by irq controller code that uses radix tree + * revmaps + */ +extern unsigned int irq_radix_revmap(struct irq_host *host, + irq_hw_number_t hwirq); + +/*** + * irq_linear_revmap - Find a linux virq from a hw irq number. + * @host: host owning this hardware interrupt + * @hwirq: hardware irq number in that host space + * + * This is a fast path, for use by irq controller code that uses linear + * revmaps. It does fallback to the slow path if the revmap doesn't exist + * yet and will create the revmap entry with appropriate locking + */ + +extern unsigned int irq_linear_revmap(struct irq_host *host, + irq_hw_number_t hwirq); + + + +/*** + * irq_alloc_virt - Allocate virtual irq numbers + * @host: host owning these new virtual irqs + * @count: number of consecutive numbers to allocate + * @hint: pass a hint number, the allocator will try to use a 1:1 mapping + * + * This is a low level function that is used internally by irq_create_mapping() + * and that can be used by some irq controllers implementations for things + * like allocating ranges of numbers for MSIs. The revmaps are left untouched. + */ +extern unsigned int irq_alloc_virt(struct irq_host *host, + unsigned int count, + unsigned int hint); + +/*** + * irq_free_virt - Free virtual irq numbers + * @virq: virtual irq number of the first interrupt to free + * @count: number of interrupts to free + * + * This function is the opposite of irq_alloc_virt. It will not clear reverse + * maps, this should be done previously by unmap'ing the interrupt. In fact, + * all interrupts covered by the range being freed should have been unmapped + * prior to calling this. + */ +extern void irq_free_virt(unsigned int virq, unsigned int count); + + +/* -- OF helpers -- */ + +/* irq_create_of_mapping - Map a hardware interrupt into linux virq space + * @controller: Device node of the interrupt controller + * @inspec: Interrupt specifier from the device-tree + * @intsize: Size of the interrupt specifier from the device-tree + * + * This function is identical to irq_create_mapping except that it takes + * as input informations straight from the device-tree (typically the results + * of the of_irq_map_*() functions. */ -extern unsigned int virt_irq_to_real_map[NR_IRQS]; +extern unsigned int irq_create_of_mapping(struct device_node *controller, + u32 *intspec, unsigned int intsize); -/* The maximum virtual IRQ number that we support. This - * can be set by the platform and will be reduced by the - * value of __irq_offset_value. It defaults to and is - * capped by (NR_IRQS - 1). + +/* irq_of_parse_and_map - Parse nad Map an interrupt into linux virq space + * @device: Device node of the device whose interrupt is to be mapped + * @index: Index of the interrupt to map + * + * This function is a wrapper that chains of_irq_map_one() and + * irq_create_of_mapping() to make things easier to callers */ -extern unsigned int virt_irq_max; +extern unsigned int irq_of_parse_and_map(struct device_node *dev, int index); + +/* -- End OF helpers -- */ -/* Create a mapping for a real_irq if it doesn't already exist. - * Return the virtual irq as a convenience. +/*** + * irq_early_init - Init irq remapping subsystem */ -int virt_irq_create_mapping(unsigned int real_irq); -void virt_irq_init(void); +extern void irq_early_init(void); -static inline unsigned int virt_irq_to_real(unsigned int virt_irq) +static __inline__ int irq_canonicalize(int irq) { - return virt_irq_to_real_map[virt_irq]; + return irq; } -extern unsigned int real_irq_to_virt_slowpath(unsigned int real_irq); + +#else /* CONFIG_PPC_MERGE */ + +/* This number is used when no interrupt has been assigned */ +#define NO_IRQ (-1) +#define NO_IRQ_IGNORE (-2) + /* - * List of interrupt controllers. + * These constants are used for passing information about interrupt + * signal polarity and level/edge sensing to the low-level PIC chip + * drivers. */ -#define IC_INVALID 0 -#define IC_OPEN_PIC 1 -#define IC_PPC_XIC 2 -#define IC_CELL_PIC 3 -#define IC_ISERIES 4 +#define IRQ_SENSE_MASK 0x1 +#define IRQ_SENSE_LEVEL 0x1 /* interrupt on active level */ +#define IRQ_SENSE_EDGE 0x0 /* interrupt triggered by edge */ -extern u64 ppc64_interrupt_controller; +#define IRQ_POLARITY_MASK 0x2 +#define IRQ_POLARITY_POSITIVE 0x2 /* high level or low->high edge */ +#define IRQ_POLARITY_NEGATIVE 0x0 /* low level or high->low edge */ -#else /* 32-bit */ #if defined(CONFIG_40x) #include @@ -348,6 +592,92 @@ extern u64 ppc64_interrupt_controller; #define SIU_INT_PC1 ((uint)0x3e+CPM_IRQ_OFFSET) #define SIU_INT_PC0 ((uint)0x3f+CPM_IRQ_OFFSET) +#elif defined(CONFIG_PPC_86xx) +#include + +#define NR_EPIC_INTS 48 +#ifndef NR_8259_INTS +#define NR_8259_INTS 16 /*ULI 1575 can route 12 interrupts */ +#endif +#define NUM_8259_INTERRUPTS NR_8259_INTS + +#ifndef I8259_OFFSET +#define I8259_OFFSET 0 +#endif + +#define NR_IRQS 256 + +/* Internal IRQs on MPC86xx OpenPIC */ + +#ifndef MPC86xx_OPENPIC_IRQ_OFFSET +#define MPC86xx_OPENPIC_IRQ_OFFSET NR_8259_INTS +#endif + +/* The 48 internal sources */ +#define MPC86xx_IRQ_NULL ( 0 + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_MCM ( 1 + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_DDR ( 2 + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_LBC ( 3 + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_DMA0 ( 4 + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_DMA1 ( 5 + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_DMA2 ( 6 + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_DMA3 ( 7 + MPC86xx_OPENPIC_IRQ_OFFSET) + +/* no 10,11 */ +#define MPC86xx_IRQ_UART2 (12 + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_TSEC1_TX (13 + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_TSEC1_RX (14 + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_TSEC3_TX (15 + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_TSEC3_RX (16 + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_TSEC3_ERROR (17 + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_TSEC1_ERROR (18 + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_TSEC2_TX (19 + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_TSEC2_RX (20 + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_TSEC4_TX (21 + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_TSEC4_RX (22 + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_TSEC4_ERROR (23 + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_TSEC2_ERROR (24 + MPC86xx_OPENPIC_IRQ_OFFSET) +/* no 25 */ +#define MPC86xx_IRQ_UART1 (26 + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_IIC (27 + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_PERFMON (28 + MPC86xx_OPENPIC_IRQ_OFFSET) +/* no 29,30,31 */ +#define MPC86xx_IRQ_SRIO_ERROR (32 + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_SRIO_OUT_BELL (33 + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_SRIO_IN_BELL (34 + MPC86xx_OPENPIC_IRQ_OFFSET) +/* no 35,36 */ +#define MPC86xx_IRQ_SRIO_OUT_MSG1 (37 + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_SRIO_IN_MSG1 (38 + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_SRIO_OUT_MSG2 (39 + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_SRIO_IN_MSG2 (40 + MPC86xx_OPENPIC_IRQ_OFFSET) + +/* The 12 external interrupt lines */ +#define MPC86xx_IRQ_EXT_BASE 48 +#define MPC86xx_IRQ_EXT0 (0 + MPC86xx_IRQ_EXT_BASE \ + + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_EXT1 (1 + MPC86xx_IRQ_EXT_BASE \ + + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_EXT2 (2 + MPC86xx_IRQ_EXT_BASE \ + + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_EXT3 (3 + MPC86xx_IRQ_EXT_BASE \ + + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_EXT4 (4 + MPC86xx_IRQ_EXT_BASE \ + + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_EXT5 (5 + MPC86xx_IRQ_EXT_BASE \ + + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_EXT6 (6 + MPC86xx_IRQ_EXT_BASE \ + + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_EXT7 (7 + MPC86xx_IRQ_EXT_BASE \ + + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_EXT8 (8 + MPC86xx_IRQ_EXT_BASE \ + + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_EXT9 (9 + MPC86xx_IRQ_EXT_BASE \ + + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_EXT10 (10 + MPC86xx_IRQ_EXT_BASE \ + + MPC86xx_OPENPIC_IRQ_OFFSET) +#define MPC86xx_IRQ_EXT11 (11 + MPC86xx_IRQ_EXT_BASE \ + + MPC86xx_OPENPIC_IRQ_OFFSET) + #else /* CONFIG_40x + CONFIG_8xx */ /* * this is the # irq's for all ppc arch's (pmac/chrp/prep) @@ -432,16 +762,11 @@ extern u64 ppc64_interrupt_controller; #endif /* CONFIG_8260 */ -#endif +#endif /* Whatever way too big #ifdef */ #define NR_MASK_WORDS ((NR_IRQS + 31) / 32) /* pedantic: these are long because they are used with set_bit --RR */ extern unsigned long ppc_cached_irq_mask[NR_MASK_WORDS]; -extern atomic_t ppc_n_lost_interrupts; - -#define virt_irq_create_mapping(x) (x) - -#endif /* * Because many systems have two overlapping names spaces for @@ -480,6 +805,7 @@ static __inline__ int irq_canonicalize(int irq) irq = 9; return irq; } +#endif /* CONFIG_PPC_MERGE */ extern int distribute_irqs; @@ -499,9 +825,8 @@ extern struct thread_info *softirq_ctx[NR_CPUS]; extern void irq_ctx_init(void); extern void call_do_softirq(struct thread_info *tp); -extern int call___do_IRQ(int irq, struct pt_regs *regs, - struct thread_info *tp); - +extern int call_handle_irq(int irq, void *p1, void *p2, + struct thread_info *tp, void *func); #else #define irq_ctx_init() diff --git a/include/asm-powerpc/iseries/iseries_io.h b/include/asm-powerpc/iseries/iseries_io.h index 496aa852b..f29009bd6 100644 --- a/include/asm-powerpc/iseries/iseries_io.h +++ b/include/asm-powerpc/iseries/iseries_io.h @@ -1,7 +1,6 @@ #ifndef _ASM_POWERPC_ISERIES_ISERIES_IO_H #define _ASM_POWERPC_ISERIES_ISERIES_IO_H -#include #ifdef CONFIG_PPC_ISERIES #include diff --git a/include/asm-powerpc/iseries/it_lp_queue.h b/include/asm-powerpc/iseries/it_lp_queue.h index b7c6fc12c..284c5a7db 100644 --- a/include/asm-powerpc/iseries/it_lp_queue.h +++ b/include/asm-powerpc/iseries/it_lp_queue.h @@ -29,20 +29,20 @@ struct HvLpEvent; -#define ITMaxLpQueues 8 +#define IT_LP_MAX_QUEUES 8 -#define NotUsed 0 // Queue will not be used by PLIC -#define DedicatedIo 1 // Queue dedicated to IO processor specified -#define DedicatedLp 2 // Queue dedicated to LP specified -#define Shared 3 // Queue shared for both IO and LP +#define IT_LP_NOT_USED 0 /* Queue will not be used by PLIC */ +#define IT_LP_DEDICATED_IO 1 /* Queue dedicated to IO processor specified */ +#define IT_LP_DEDICATED_LP 2 /* Queue dedicated to LP specified */ +#define IT_LP_SHARED 3 /* Queue shared for both IO and LP */ -#define LpEventStackSize 4096 -#define LpEventMaxSize 256 -#define LpEventAlign 64 +#define IT_LP_EVENT_STACK_SIZE 4096 +#define IT_LP_EVENT_MAX_SIZE 256 +#define IT_LP_EVENT_ALIGN 64 struct hvlpevent_queue { /* - * The xSlicCurEventPtr is the pointer to the next event stack entry + * The hq_current_event is the pointer to the next event stack entry * that will become valid. The OS must peek at this entry to determine * if it is valid. PLIC will set the valid indicator as the very last * store into that entry. @@ -52,23 +52,23 @@ struct hvlpevent_queue { * location again. * * If the event stack fills and there are overflow events, then PLIC - * will set the xPlicOverflowIntPending flag in which case the OS will + * will set the hq_overflow_pending flag in which case the OS will * have to fetch the additional LP events once they have drained the * event stack. * * The first 16-bytes are known by both the OS and PLIC. The remainder * of the cache line is for use by the OS. */ - u8 xPlicOverflowIntPending;// 0x00 Overflow events are pending - u8 xPlicStatus; // 0x01 DedicatedIo or DedicatedLp or NotUsed - u16 xSlicLogicalProcIndex; // 0x02 Logical Proc Index for correlation - u8 xPlicRsvd[12]; // 0x04 - char *xSlicCurEventPtr; // 0x10 - char *xSlicLastValidEventPtr; // 0x18 - char *xSlicEventStackPtr; // 0x20 - u8 xIndex; // 0x28 unique sequential index. - u8 xSlicRsvd[3]; // 0x29-2b - spinlock_t lock; + u8 hq_overflow_pending; /* 0x00 Overflow events are pending */ + u8 hq_status; /* 0x01 DedicatedIo or DedicatedLp or NotUsed */ + u16 hq_proc_index; /* 0x02 Logical Proc Index for correlation */ + u8 hq_reserved1[12]; /* 0x04 */ + char *hq_current_event; /* 0x10 */ + char *hq_last_event; /* 0x18 */ + char *hq_event_stack; /* 0x20 */ + u8 hq_index; /* 0x28 unique sequential index. */ + u8 hq_reserved2[3]; /* 0x29-2b */ + spinlock_t hq_lock; }; extern struct hvlpevent_queue hvlpevent_queue; diff --git a/include/asm-powerpc/kdebug.h b/include/asm-powerpc/kdebug.h index c01786ab5..532bfee93 100644 --- a/include/asm-powerpc/kdebug.h +++ b/include/asm-powerpc/kdebug.h @@ -18,6 +18,8 @@ struct die_args { extern int register_die_notifier(struct notifier_block *); extern int unregister_die_notifier(struct notifier_block *); +extern int register_page_fault_notifier(struct notifier_block *); +extern int unregister_page_fault_notifier(struct notifier_block *); extern struct atomic_notifier_head powerpc_die_chain; /* Grossly misnamed. */ diff --git a/include/asm-powerpc/kdump.h b/include/asm-powerpc/kdump.h index a87aed00d..10e8eb1e6 100644 --- a/include/asm-powerpc/kdump.h +++ b/include/asm-powerpc/kdump.h @@ -1,13 +1,40 @@ #ifndef _PPC64_KDUMP_H #define _PPC64_KDUMP_H +/* Kdump kernel runs at 32 MB, change at your peril. */ +#define KDUMP_KERNELBASE 0x2000000 + /* How many bytes to reserve at zero for kdump. The reserve limit should - * be greater or equal to the trampoline's end address. */ -#define KDUMP_RESERVE_LIMIT 0x8000 + * be greater or equal to the trampoline's end address. + * Reserve to the end of the FWNMI area, see head_64.S */ +#define KDUMP_RESERVE_LIMIT 0x10000 /* 64K */ + +#ifdef CONFIG_CRASH_DUMP +#define PHYSICAL_START KDUMP_KERNELBASE #define KDUMP_TRAMPOLINE_START 0x0100 #define KDUMP_TRAMPOLINE_END 0x3000 -extern void kdump_setup(void); +#define KDUMP_MIN_TCE_ENTRIES 2048 + +#else /* !CONFIG_CRASH_DUMP */ + +#define PHYSICAL_START 0x0 + +#endif /* CONFIG_CRASH_DUMP */ + +#ifndef __ASSEMBLY__ +#ifdef CONFIG_CRASH_DUMP + +extern void reserve_kdump_trampoline(void); +extern void setup_kdump_trampoline(void); + +#else /* !CONFIG_CRASH_DUMP */ + +static inline void reserve_kdump_trampoline(void) { ; } +static inline void setup_kdump_trampoline(void) { ; } + +#endif /* CONFIG_CRASH_DUMP */ +#endif /* __ASSEMBLY__ */ #endif /* __PPC64_KDUMP_H */ diff --git a/include/asm-powerpc/kexec.h b/include/asm-powerpc/kexec.h index 6a2af2f68..11cbdf81f 100644 --- a/include/asm-powerpc/kexec.h +++ b/include/asm-powerpc/kexec.h @@ -31,9 +31,11 @@ #define KEXEC_ARCH KEXEC_ARCH_PPC #endif +#ifndef __ASSEMBLY__ +#include + #ifdef CONFIG_KEXEC -#ifndef __ASSEMBLY__ #ifdef __powerpc64__ /* * This function is responsible for capturing register states if coming @@ -108,13 +110,15 @@ static inline void crash_setup_regs(struct pt_regs *newregs, #define MAX_NOTE_BYTES 1024 -#ifdef __powerpc64__ extern void kexec_smp_wait(void); /* get and clear naca physid, wait for master to copy new code to 0 */ -extern void __init kexec_setup(void); extern int crashing_cpu; extern void crash_send_ipi(void (*crash_ipi_callback)(struct pt_regs *)); -#endif /* __powerpc64 __ */ +extern cpumask_t cpus_in_sr; +static inline int kexec_sr_activated(int cpu) +{ + return cpu_isset(cpu,cpus_in_sr); +} struct kimage; struct pt_regs; @@ -123,8 +127,22 @@ extern int default_machine_kexec_prepare(struct kimage *image); extern void default_machine_crash_shutdown(struct pt_regs *regs); extern void machine_kexec_simple(struct kimage *image); +extern void crash_kexec_secondary(struct pt_regs *regs); +extern int overlaps_crashkernel(unsigned long start, unsigned long size); +extern void reserve_crashkernel(void); + +#else /* !CONFIG_KEXEC */ +static inline int kexec_sr_activated(int cpu) { return 0; } +static inline void crash_kexec_secondary(struct pt_regs *regs) { } + +static inline int overlaps_crashkernel(unsigned long start, unsigned long size) +{ + return 0; +} + +static inline void reserve_crashkernel(void) { ; } -#endif /* ! __ASSEMBLY__ */ #endif /* CONFIG_KEXEC */ +#endif /* ! __ASSEMBLY__ */ #endif /* __KERNEL__ */ #endif /* _ASM_POWERPC_KEXEC_H */ diff --git a/include/asm-powerpc/kprobes.h b/include/asm-powerpc/kprobes.h index f466bc804..34e1f89a5 100644 --- a/include/asm-powerpc/kprobes.h +++ b/include/asm-powerpc/kprobes.h @@ -50,6 +50,9 @@ typedef unsigned int kprobe_opcode_t; IS_TWI(instr) || IS_TDI(instr)) #define ARCH_SUPPORTS_KRETPROBES +#define ARCH_INACTIVE_KPROBE_COUNT 1 +#define flush_insn_slot(p) do { } while (0) + void kretprobe_trampoline(void); extern void arch_remove_kprobe(struct kprobe *p); diff --git a/include/asm-powerpc/machdep.h b/include/asm-powerpc/machdep.h index 0f9254c18..c17c13742 100644 --- a/include/asm-powerpc/machdep.h +++ b/include/asm-powerpc/machdep.h @@ -9,7 +9,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include @@ -82,6 +81,8 @@ struct machdep_calls { void (*tce_free)(struct iommu_table *tbl, long index, long npages); + unsigned long (*tce_get)(struct iommu_table *tbl, + long index); void (*tce_flush)(struct iommu_table *tbl); void (*iommu_dev_setup)(struct pci_dev *dev); void (*iommu_bus_setup)(struct pci_bus *bus); @@ -96,7 +97,7 @@ struct machdep_calls { void (*show_percpuinfo)(struct seq_file *m, int i); void (*init_IRQ)(void); - int (*get_irq)(struct pt_regs *); + unsigned int (*get_irq)(struct pt_regs *); #ifdef CONFIG_KEXEC void (*kexec_cpu_down)(int crash_shutdown, int secondary); #endif @@ -238,6 +239,11 @@ struct machdep_calls { */ void (*machine_kexec)(struct kimage *image); #endif /* CONFIG_KEXEC */ + +#ifdef CONFIG_PCI_MSI + int (*enable_msi)(struct pci_dev *pdev); + void (*disable_msi)(struct pci_dev *pdev); +#endif /* CONFIG_PCI_MSI */ }; extern void power4_idle(void); diff --git a/include/asm-powerpc/mmu.h b/include/asm-powerpc/mmu.h index 31f721994..c3fc7a28e 100644 --- a/include/asm-powerpc/mmu.h +++ b/include/asm-powerpc/mmu.h @@ -96,6 +96,8 @@ extern char initial_stab[]; #define HPTE_R_FLAGS ASM_CONST(0x00000000000003ff) #define HPTE_R_PP ASM_CONST(0x0000000000000003) #define HPTE_R_N ASM_CONST(0x0000000000000004) +#define HPTE_R_C ASM_CONST(0x0000000000000080) +#define HPTE_R_R ASM_CONST(0x0000000000000100) /* Values for PP (assumes Ks=0, Kp=1) */ /* pp0 will always be 0 for linux */ @@ -163,6 +165,16 @@ struct mmu_psize_def extern struct mmu_psize_def mmu_psize_defs[MMU_PAGE_COUNT]; extern int mmu_linear_psize; extern int mmu_virtual_psize; +extern int mmu_vmalloc_psize; +extern int mmu_io_psize; + +/* + * If the processor supports 64k normal pages but not 64k cache + * inhibited pages, we have to be prepared to switch processes + * to use 4k pages when they create cache-inhibited mappings. + * If this is the case, mmu_ci_restrictions will be set to 1. + */ +extern int mmu_ci_restrictions; #ifdef CONFIG_HUGETLB_PAGE /* @@ -226,7 +238,6 @@ 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); @@ -254,6 +265,7 @@ extern long iSeries_hpte_insert(unsigned long hpte_group, extern void stabs_alloc(void); extern void slb_initialize(void); +extern void slb_flush_and_rebolt(void); extern void stab_initialize(unsigned long stab); #endif /* __ASSEMBLY__ */ @@ -357,9 +369,12 @@ typedef unsigned long mm_context_id_t; typedef struct { mm_context_id_t id; + u16 user_psize; /* page size index */ + u16 sllp; /* SLB entry page size encoding */ #ifdef CONFIG_HUGETLB_PAGE u16 low_htlb_areas, high_htlb_areas; #endif + unsigned long vdso_base; } mm_context_t; diff --git a/include/asm-powerpc/mmu_context.h b/include/asm-powerpc/mmu_context.h index 1b8a25fd4..083ac917b 100644 --- a/include/asm-powerpc/mmu_context.h +++ b/include/asm-powerpc/mmu_context.h @@ -20,20 +20,18 @@ * 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 */ } +/* + * The proto-VSID space has 2^35 - 1 segments available for user mappings. + * Each segment contains 2^28 bytes. Each context maps 2^44 bytes, + * so we can support 2^19-1 contexts (19 == 35 + 28 - 44). + */ #define NO_CONTEXT 0 -#define MAX_CONTEXT (0x100000-1) +#define MAX_CONTEXT ((1UL << 19) - 1) extern int init_new_context(struct task_struct *tsk, struct mm_struct *mm); extern void destroy_context(struct mm_struct *mm); @@ -52,13 +50,8 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, 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)) diff --git a/include/asm-powerpc/mmzone.h b/include/asm-powerpc/mmzone.h index 88d70bae7..d484ca94c 100644 --- a/include/asm-powerpc/mmzone.h +++ b/include/asm-powerpc/mmzone.h @@ -8,7 +8,6 @@ #define _ASM_MMZONE_H_ #ifdef __KERNEL__ -#include /* * generic non-linear memory support: diff --git a/include/asm-powerpc/mpic.h b/include/asm-powerpc/mpic.h index 6b9e78142..a9f9604b9 100644 --- a/include/asm-powerpc/mpic.h +++ b/include/asm-powerpc/mpic.h @@ -22,6 +22,10 @@ #define MPIC_GREG_GCONF_8259_PTHROU_DIS 0x20000000 #define MPIC_GREG_GCONF_BASE_MASK 0x000fffff #define MPIC_GREG_GLOBAL_CONF_1 0x00030 +#define MPIC_GREG_GLOBAL_CONF_1_SIE 0x08000000 +#define MPIC_GREG_GLOBAL_CONF_1_CLK_RATIO_MASK 0x70000000 +#define MPIC_GREG_GLOBAL_CONF_1_CLK_RATIO(r) \ + (((r) << 28) & MPIC_GREG_GLOBAL_CONF_1_CLK_RATIO_MASK) #define MPIC_GREG_VENDOR_0 0x00040 #define MPIC_GREG_VENDOR_1 0x00050 #define MPIC_GREG_VENDOR_2 0x00060 @@ -37,6 +41,7 @@ #define MPIC_GREG_IPI_VECTOR_PRI_1 0x000b0 #define MPIC_GREG_IPI_VECTOR_PRI_2 0x000c0 #define MPIC_GREG_IPI_VECTOR_PRI_3 0x000d0 +#define MPIC_GREG_IPI_STRIDE 0x10 #define MPIC_GREG_SPURIOUS 0x000e0 #define MPIC_GREG_TIMER_FREQ 0x000f0 @@ -64,6 +69,7 @@ #define MPIC_CPU_IPI_DISPATCH_1 0x00050 #define MPIC_CPU_IPI_DISPATCH_2 0x00060 #define MPIC_CPU_IPI_DISPATCH_3 0x00070 +#define MPIC_CPU_IPI_DISPATCH_STRIDE 0x00010 #define MPIC_CPU_CURRENT_TASK_PRI 0x00080 #define MPIC_CPU_TASKPRI_MASK 0x0000000f #define MPIC_CPU_WHOAMI 0x00090 @@ -110,8 +116,102 @@ #define MPIC_VEC_TIMER_1 248 #define MPIC_VEC_TIMER_0 247 -/* Type definition of the cascade handler */ -typedef int (*mpic_cascade_t)(struct pt_regs *regs, void *data); +/* + * Tsi108 implementation of MPIC has many differences from the original one + */ + +/* + * Global registers + */ + +#define TSI108_GREG_BASE 0x00000 +#define TSI108_GREG_FEATURE_0 0x00000 +#define TSI108_GREG_GLOBAL_CONF_0 0x00004 +#define TSI108_GREG_VENDOR_ID 0x0000c +#define TSI108_GREG_IPI_VECTOR_PRI_0 0x00204 /* Doorbell 0 */ +#define TSI108_GREG_IPI_STRIDE 0x0c +#define TSI108_GREG_SPURIOUS 0x00010 +#define TSI108_GREG_TIMER_FREQ 0x00014 + +/* + * Timer registers + */ +#define TSI108_TIMER_BASE 0x0030 +#define TSI108_TIMER_STRIDE 0x10 +#define TSI108_TIMER_CURRENT_CNT 0x00000 +#define TSI108_TIMER_BASE_CNT 0x00004 +#define TSI108_TIMER_VECTOR_PRI 0x00008 +#define TSI108_TIMER_DESTINATION 0x0000c + +/* + * Per-Processor registers + */ +#define TSI108_CPU_BASE 0x00300 +#define TSI108_CPU_STRIDE 0x00040 +#define TSI108_CPU_IPI_DISPATCH_0 0x00200 +#define TSI108_CPU_IPI_DISPATCH_STRIDE 0x00000 +#define TSI108_CPU_CURRENT_TASK_PRI 0x00000 +#define TSI108_CPU_WHOAMI 0xffffffff +#define TSI108_CPU_INTACK 0x00004 +#define TSI108_CPU_EOI 0x00008 + +/* + * Per-source registers + */ +#define TSI108_IRQ_BASE 0x00100 +#define TSI108_IRQ_STRIDE 0x00008 +#define TSI108_IRQ_VECTOR_PRI 0x00000 +#define TSI108_VECPRI_VECTOR_MASK 0x000000ff +#define TSI108_VECPRI_POLARITY_POSITIVE 0x01000000 +#define TSI108_VECPRI_POLARITY_NEGATIVE 0x00000000 +#define TSI108_VECPRI_SENSE_LEVEL 0x02000000 +#define TSI108_VECPRI_SENSE_EDGE 0x00000000 +#define TSI108_VECPRI_POLARITY_MASK 0x01000000 +#define TSI108_VECPRI_SENSE_MASK 0x02000000 +#define TSI108_IRQ_DESTINATION 0x00004 + +/* weird mpic register indices and mask bits in the HW info array */ +enum { + MPIC_IDX_GREG_BASE = 0, + MPIC_IDX_GREG_FEATURE_0, + MPIC_IDX_GREG_GLOBAL_CONF_0, + MPIC_IDX_GREG_VENDOR_ID, + MPIC_IDX_GREG_IPI_VECTOR_PRI_0, + MPIC_IDX_GREG_IPI_STRIDE, + MPIC_IDX_GREG_SPURIOUS, + MPIC_IDX_GREG_TIMER_FREQ, + + MPIC_IDX_TIMER_BASE, + MPIC_IDX_TIMER_STRIDE, + MPIC_IDX_TIMER_CURRENT_CNT, + MPIC_IDX_TIMER_BASE_CNT, + MPIC_IDX_TIMER_VECTOR_PRI, + MPIC_IDX_TIMER_DESTINATION, + + MPIC_IDX_CPU_BASE, + MPIC_IDX_CPU_STRIDE, + MPIC_IDX_CPU_IPI_DISPATCH_0, + MPIC_IDX_CPU_IPI_DISPATCH_STRIDE, + MPIC_IDX_CPU_CURRENT_TASK_PRI, + MPIC_IDX_CPU_WHOAMI, + MPIC_IDX_CPU_INTACK, + MPIC_IDX_CPU_EOI, + + MPIC_IDX_IRQ_BASE, + MPIC_IDX_IRQ_STRIDE, + MPIC_IDX_IRQ_VECTOR_PRI, + + MPIC_IDX_VECPRI_VECTOR_MASK, + MPIC_IDX_VECPRI_POLARITY_POSITIVE, + MPIC_IDX_VECPRI_POLARITY_NEGATIVE, + MPIC_IDX_VECPRI_SENSE_LEVEL, + MPIC_IDX_VECPRI_SENSE_EDGE, + MPIC_IDX_VECPRI_POLARITY_MASK, + MPIC_IDX_VECPRI_SENSE_MASK, + MPIC_IDX_IRQ_DESTINATION, + MPIC_IDX_END +}; + #ifdef CONFIG_MPIC_BROKEN_U3 /* Fixup table entry */ @@ -128,10 +228,19 @@ struct mpic_irq_fixup /* The instance data of a given MPIC */ struct mpic { + /* The device node of the interrupt controller */ + struct device_node *of_node; + + /* The remapper for this MPIC */ + struct irq_host *irqhost; + /* The "linux" controller struct */ - hw_irq_controller hc_irq; + struct irq_chip hc_irq; +#ifdef CONFIG_MPIC_BROKEN_U3 + struct irq_chip hc_ht_irq; +#endif #ifdef CONFIG_SMP - hw_irq_controller hc_ipi; + struct irq_chip hc_ipi; #endif const char *name; /* Flags */ @@ -140,20 +249,12 @@ struct mpic unsigned int isu_size; unsigned int isu_shift; unsigned int isu_mask; - /* Offset of irq vector numbers */ - unsigned int irq_offset; unsigned int irq_count; - /* Offset of ipi vector numbers */ - unsigned int ipi_offset; /* Number of sources */ unsigned int num_sources; /* Number of CPUs */ unsigned int num_cpus; - /* cascade handler */ - mpic_cascade_t cascade; - void *cascade_data; - unsigned int cascade_vec; - /* senses array */ + /* default senses array */ unsigned char *senses; unsigned int senses_count; @@ -169,15 +270,29 @@ struct mpic volatile u32 __iomem *cpuregs[MPIC_MAX_CPUS]; volatile u32 __iomem *isus[MPIC_MAX_ISU]; +#ifdef CONFIG_MPIC_WEIRD + /* Pointer to HW info array */ + u32 *hw_set; +#endif + /* link */ struct mpic *next; }; +/* + * MPIC flags (passed to mpic_alloc) + * + * The top 4 bits contain an MPIC bhw id that is used to index the + * register offsets and some masks when CONFIG_MPIC_WEIRD is set. + * Note setting any ID (leaving those bits to 0) means standard MPIC + */ + /* This is the primary controller, only that one has IPIs and * has afinity control. A non-primary MPIC always uses CPU0 * registers only */ #define MPIC_PRIMARY 0x00000001 + /* Set this for a big-endian MPIC */ #define MPIC_BIG_ENDIAN 0x00000002 /* Broken U3 MPIC */ @@ -186,6 +301,18 @@ struct mpic #define MPIC_BROKEN_IPI 0x00000008 /* MPIC wants a reset */ #define MPIC_WANTS_RESET 0x00000010 +/* Spurious vector requires EOI */ +#define MPIC_SPV_EOI 0x00000020 +/* No passthrough disable */ +#define MPIC_NO_PTHROU_DIS 0x00000040 + +/* MPIC HW modification ID */ +#define MPIC_REGSET_MASK 0xf0000000 +#define MPIC_REGSET(val) (((val) & 0xf ) << 28) +#define MPIC_GET_REGSET(flags) (((flags) >> 28) & 0xf) + +#define MPIC_REGSET_STANDARD MPIC_REGSET(0) /* Original MPIC */ +#define MPIC_REGSET_TSI108 MPIC_REGSET(1) /* Tsi108/109 PIC */ /* Allocate the controller structure and setup the linux irq descs * for the range if interrupts passed in. No HW initialization is @@ -209,14 +336,11 @@ struct mpic * The values in the array start at the first source of the MPIC, * that is senses[0] correspond to linux irq "irq_offset". */ -extern struct mpic *mpic_alloc(unsigned long phys_addr, +extern struct mpic *mpic_alloc(struct device_node *node, + unsigned long phys_addr, unsigned int flags, unsigned int isu_size, - unsigned int irq_offset, unsigned int irq_count, - unsigned int ipi_offset, - unsigned char *senses, - unsigned int senses_num, const char *name); /* Assign ISUs, to call before mpic_init() @@ -228,22 +352,27 @@ extern struct mpic *mpic_alloc(unsigned long phys_addr, extern void mpic_assign_isu(struct mpic *mpic, unsigned int isu_num, unsigned long phys_addr); +/* Set default sense codes + * + * @mpic: controller + * @senses: array of sense codes + * @count: size of above array + * + * Optionally provide an array (indexed on hardware interrupt numbers + * for this MPIC) of default sense codes for the chip. Those are linux + * sense codes IRQ_TYPE_* + * + * The driver gets ownership of the pointer, don't dispose of it or + * anything like that. __init only. + */ +extern void mpic_set_default_senses(struct mpic *mpic, u8 *senses, int count); + + /* Initialize the controller. After this has been called, none of the above * should be called again for this mpic */ extern void mpic_init(struct mpic *mpic); -/* Setup a cascade. Currently, only one cascade is supported this - * way, though you can always do a normal request_irq() and add - * other cascades this way. You should call this _after_ having - * added all the ISUs - * - * @irq_no: "linux" irq number of the cascade (that is offset'ed vector) - * @handler: cascade handler function - */ -extern void mpic_setup_cascade(unsigned int irq_no, mpic_cascade_t hanlder, - void *data); - /* * All of the following functions must only be used after the * ISUs have been assigned and the controller fully initialized @@ -280,12 +409,15 @@ extern void mpic_send_ipi(unsigned int ipi_no, unsigned int cpu_mask); void smp_mpic_message_pass(int target, int msg); /* Fetch interrupt from a given mpic */ -extern int mpic_get_one_irq(struct mpic *mpic, struct pt_regs *regs); +extern unsigned int mpic_get_one_irq(struct mpic *mpic, struct pt_regs *regs); /* This one gets to the primary mpic */ -extern int mpic_get_irq(struct pt_regs *regs); +extern unsigned int mpic_get_irq(struct pt_regs *regs); + +/* Set the EPIC clock ratio */ +void mpic_set_clk_ratio(struct mpic *mpic, u32 clock_ratio); -/* global mpic for pSeries */ -extern struct mpic *pSeries_mpic; +/* Enable/Disable EPIC serial interrupt mode */ +void mpic_set_serial_int(struct mpic *mpic, int enable); #endif /* __KERNEL__ */ #endif /* _ASM_POWERPC_MPIC_H */ diff --git a/include/asm-powerpc/of_device.h b/include/asm-powerpc/of_device.h index 6249a7c39..c5c0b0b3c 100644 --- a/include/asm-powerpc/of_device.h +++ b/include/asm-powerpc/of_device.h @@ -9,7 +9,7 @@ /* * The of_platform_bus_type is a bus type used by drivers that do not * attach to a macio or similar bus but still use OF probing - * mecanism + * mechanism */ extern struct bus_type of_platform_bus_type; diff --git a/include/asm-powerpc/paca.h b/include/asm-powerpc/paca.h index 706325f99..3d5d590bc 100644 --- a/include/asm-powerpc/paca.h +++ b/include/asm-powerpc/paca.h @@ -16,7 +16,6 @@ #define _ASM_POWERPC_PACA_H #ifdef __KERNEL__ -#include #include #include #include @@ -79,11 +78,9 @@ struct paca_struct { u64 exmc[10]; /* used for machine checks */ u64 exslb[10]; /* used for SLB/segment table misses * on the linear mapping */ -#ifdef CONFIG_PPC_64K_PAGES - pgd_t *pgdir; -#endif /* CONFIG_PPC_64K_PAGES */ mm_context_t context; + u16 vmalloc_sllp; u16 slb_cache[SLB_CACHE_ENTRIES]; u16 slb_cache_ptr; @@ -96,6 +93,7 @@ struct paca_struct { u64 saved_r1; /* r1 save for RTAS calls */ u64 saved_msr; /* MSR saved here by enter_rtas */ u8 proc_enabled; /* irq soft-enable flag */ + u8 io_sync; /* writel() needs spin_unlock sync */ /* Stuff for accurate time accounting */ u64 user_time; /* accumulated usermode TB ticks */ diff --git a/include/asm-powerpc/page.h b/include/asm-powerpc/page.h index eaf081279..42d17acf0 100644 --- a/include/asm-powerpc/page.h +++ b/include/asm-powerpc/page.h @@ -11,8 +11,8 @@ */ #ifdef __KERNEL__ -#include #include +#include /* * On PPC32 page size is 4K. For PPC64 we support either 4K or 64K software @@ -52,13 +52,6 @@ * If you want to test if something's a kernel address, use is_kernel_addr(). */ -#ifdef CONFIG_CRASH_DUMP -/* Kdump kernel runs at 32 MB, change at your peril. */ -#define PHYSICAL_START 0x2000000 -#else -#define PHYSICAL_START 0x0 -#endif - #define PAGE_OFFSET ASM_CONST(CONFIG_KERNEL_START) #define KERNELBASE (PAGE_OFFSET + PHYSICAL_START) @@ -198,6 +191,9 @@ extern void copy_user_page(void *to, void *from, unsigned long vaddr, struct page *p); extern int page_is_ram(unsigned long pfn); +struct vm_area_struct; +extern const char *arch_vma_name(struct vm_area_struct *vma); + #include #endif /* __ASSEMBLY__ */ diff --git a/include/asm-powerpc/pci-bridge.h b/include/asm-powerpc/pci-bridge.h index 38de92d41..86ee46b09 100644 --- a/include/asm-powerpc/pci-bridge.h +++ b/include/asm-powerpc/pci-bridge.h @@ -22,6 +22,7 @@ struct pci_controller { struct pci_bus *bus; char is_dynamic; + int node; void *arch_data; struct list_head list_node; @@ -78,12 +79,6 @@ struct pci_dn { 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 */ }; @@ -171,6 +166,12 @@ static inline unsigned long pci_address_to_pio(phys_addr_t address) #define PCI_PROBE_NORMAL 0 /* Do normal PCI probing */ #define PCI_PROBE_DEVTREE 1 /* Instantiate from device tree */ +#ifdef CONFIG_NUMA +#define PHB_SET_NODE(PHB, NODE) ((PHB)->node = (NODE)) +#else +#define PHB_SET_NODE(PHB, NODE) ((PHB)->node = -1) +#endif + #endif /* CONFIG_PPC64 */ #endif /* __KERNEL__ */ #endif diff --git a/include/asm-powerpc/pci.h b/include/asm-powerpc/pci.h index 5d2c9e6c4..46afd29b9 100644 --- a/include/asm-powerpc/pci.h +++ b/include/asm-powerpc/pci.h @@ -242,7 +242,7 @@ extern pgprot_t pci_phys_mem_access_prot(struct file *file, #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); + resource_size_t *start, resource_size_t *end); #endif /* CONFIG_PPC_MULTIPLATFORM || CONFIG_PPC32 */ #endif /* __KERNEL__ */ diff --git a/include/asm-powerpc/percpu.h b/include/asm-powerpc/percpu.h index 184a7a4d2..2f2e3024f 100644 --- a/include/asm-powerpc/percpu.h +++ b/include/asm-powerpc/percpu.h @@ -14,6 +14,7 @@ #define __per_cpu_offset(cpu) (paca[cpu].data_offset) #define __my_cpu_offset() get_paca()->data_offset +#define per_cpu_offset(x) (__per_cpu_offset(x)) /* Separate out the type, so (int[3], foo) works. */ #define DEFINE_PER_CPU(type, name) \ @@ -22,6 +23,7 @@ /* var is in discarded region: offset to particular copy we want */ #define per_cpu(var, cpu) (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset(cpu))) #define __get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __my_cpu_offset())) +#define __raw_get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __my_cpu_offset())) /* A macro to avoid #include hell... */ #define percpu_modcopy(pcpudst, src, size) \ @@ -41,6 +43,7 @@ extern void setup_per_cpu_areas(void); #define per_cpu(var, cpu) (*((void)(cpu), &per_cpu__##var)) #define __get_cpu_var(var) per_cpu__##var +#define __raw_get_cpu_var(var) per_cpu__##var #endif /* SMP */ diff --git a/include/asm-powerpc/pgalloc.h b/include/asm-powerpc/pgalloc.h index af90f7a6b..881c14f33 100644 --- a/include/asm-powerpc/pgalloc.h +++ b/include/asm-powerpc/pgalloc.h @@ -122,7 +122,7 @@ static inline void pte_free(struct page *ptepage) pte_free_kernel(page_address(ptepage)); } -#define PGF_CACHENUM_MASK 0xf +#define PGF_CACHENUM_MASK 0x3 typedef struct pgtable_free { unsigned long val; diff --git a/include/asm-powerpc/pgtable-4k.h b/include/asm-powerpc/pgtable-4k.h index b2e186299..e70361556 100644 --- a/include/asm-powerpc/pgtable-4k.h +++ b/include/asm-powerpc/pgtable-4k.h @@ -78,6 +78,8 @@ #define pte_iterate_hashed_end() } while(0) +#define pte_pagesize_index(pte) MMU_PAGE_4K + /* * 4-level page tables related bits */ diff --git a/include/asm-powerpc/pgtable-64k.h b/include/asm-powerpc/pgtable-64k.h index 653915014..4b7126c53 100644 --- a/include/asm-powerpc/pgtable-64k.h +++ b/include/asm-powerpc/pgtable-64k.h @@ -90,6 +90,8 @@ #define pte_iterate_hashed_end() } while(0); } } while(0) +#define pte_pagesize_index(pte) \ + (((pte) & _PAGE_COMBO)? MMU_PAGE_4K: MMU_PAGE_64K) #endif /* __ASSEMBLY__ */ #endif /* __KERNEL__ */ diff --git a/include/asm-powerpc/pgtable.h b/include/asm-powerpc/pgtable.h index e9f1f4627..8dbf5ad81 100644 --- a/include/asm-powerpc/pgtable.h +++ b/include/asm-powerpc/pgtable.h @@ -12,7 +12,6 @@ */ #ifndef __ASSEMBLY__ -#include #include #include /* For TASK_SIZE */ #include @@ -47,8 +46,8 @@ struct mm_struct; /* * Define the address range of the vmalloc VM area. */ -#define VMALLOC_START (0xD000000000000000ul) -#define VMALLOC_SIZE (0x80000000000UL) +#define VMALLOC_START ASM_CONST(0xD000000000000000) +#define VMALLOC_SIZE ASM_CONST(0x80000000000) #define VMALLOC_END (VMALLOC_START + VMALLOC_SIZE) /* @@ -413,12 +412,6 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr, 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; } diff --git a/include/asm-powerpc/pmac_pfunc.h b/include/asm-powerpc/pmac_pfunc.h index cef61304f..1330d6a58 100644 --- a/include/asm-powerpc/pmac_pfunc.h +++ b/include/asm-powerpc/pmac_pfunc.h @@ -205,7 +205,7 @@ extern void pmf_do_irq(struct pmf_function *func); * * The args array contains as many arguments as is required by the function, * this is dependent on the function you are calling, unfortunately Apple - * mecanism provides no way to encode that so you have to get it right at + * mechanism provides no way to encode that so you have to get it right at * the call site. Some functions require no args, in which case, you can * pass NULL. * diff --git a/include/asm-powerpc/ppc_asm.h b/include/asm-powerpc/ppc_asm.h index dd1c0a913..a940cfe04 100644 --- a/include/asm-powerpc/ppc_asm.h +++ b/include/asm-powerpc/ppc_asm.h @@ -5,7 +5,6 @@ #define _ASM_POWERPC_PPC_ASM_H #include -#include #include #ifndef __ASSEMBLY__ diff --git a/include/asm-powerpc/processor.h b/include/asm-powerpc/processor.h index 2b3935ac6..ee810c659 100644 --- a/include/asm-powerpc/processor.h +++ b/include/asm-powerpc/processor.h @@ -149,11 +149,11 @@ struct thread_struct { unsigned int val; /* Floating point status */ } fpscr; int fpexc_mode; /* floating-point exception mode */ + unsigned int align_ctl; /* alignment handling control */ #ifdef CONFIG_PPC64 unsigned long start_tb; /* Start purr when proc switched in */ unsigned long accum_tb; /* Total accumilated purr for process */ #endif - unsigned long vdso_base; /* base of the vDSO library */ unsigned long dabr; /* Data address breakpoint register */ #ifdef CONFIG_ALTIVEC /* Complete AltiVec register set */ @@ -190,7 +190,7 @@ struct thread_struct { .fs = KERNEL_DS, \ .fpr = {0}, \ .fpscr = { .val = 0, }, \ - .fpexc_mode = MSR_FE0|MSR_FE1, \ + .fpexc_mode = 0, \ } #endif @@ -212,6 +212,18 @@ unsigned long get_wchan(struct task_struct *p); extern int get_fpexc_mode(struct task_struct *tsk, unsigned long adr); extern int set_fpexc_mode(struct task_struct *tsk, unsigned int val); +#define GET_ENDIAN(tsk, adr) get_endian((tsk), (adr)) +#define SET_ENDIAN(tsk, val) set_endian((tsk), (val)) + +extern int get_endian(struct task_struct *tsk, unsigned long adr); +extern int set_endian(struct task_struct *tsk, unsigned int val); + +#define GET_UNALIGN_CTL(tsk, adr) get_unalign_ctl((tsk), (adr)) +#define SET_UNALIGN_CTL(tsk, val) set_unalign_ctl((tsk), (val)) + +extern int get_unalign_ctl(struct task_struct *tsk, unsigned long adr); +extern int set_unalign_ctl(struct task_struct *tsk, unsigned int val); + static inline unsigned int __unpack_fe01(unsigned long msr_bits) { return ((msr_bits & MSR_FE0) >> 10) | ((msr_bits & MSR_FE1) >> 8); diff --git a/include/asm-powerpc/prom.h b/include/asm-powerpc/prom.h index 97ef1cd71..d0fa1b9ae 100644 --- a/include/asm-powerpc/prom.h +++ b/include/asm-powerpc/prom.h @@ -15,7 +15,6 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ -#include #include #include #include @@ -65,11 +64,6 @@ struct boot_param_header typedef u32 phandle; typedef u32 ihandle; -struct interrupt_info { - int line; - int sense; /* +ve/-ve logic, edge or level, etc. */ -}; - struct property { char *name; int length; @@ -82,8 +76,6 @@ struct device_node { char *type; phandle node; phandle linux_phandle; - int n_intrs; - struct interrupt_info *intrs; char *full_name; struct property *properties; @@ -168,8 +160,8 @@ extern void unflatten_device_tree(void); extern void early_init_devtree(void *); extern int device_is_compatible(struct device_node *device, const char *); extern int machine_is_compatible(const char *compat); -extern unsigned char *get_property(struct device_node *node, const char *name, - int *lenp); +extern void *get_property(struct device_node *node, const char *name, + int *lenp); extern void print_properties(struct device_node *node); extern int prom_n_addr_cells(struct device_node* np); extern int prom_n_size_cells(struct device_node* np); @@ -205,6 +197,15 @@ extern int release_OF_resource(struct device_node* node, int index); */ +/* Helper to read a big number */ +static inline u64 of_read_number(u32 *cell, int size) +{ + u64 r = 0; + while (size--) + r = (r << 32) | *(cell++); + return r; +} + /* Translate an OF address block into a CPU physical address */ #define OF_BAD_ADDR ((u64)-1) @@ -230,7 +231,96 @@ extern int of_address_to_resource(struct device_node *dev, int index, extern int of_pci_address_to_resource(struct device_node *dev, int bar, struct resource *r); +/* Parse the ibm,dma-window property of an OF node into the busno, phys and + * size parameters. + */ +void of_parse_dma_window(struct device_node *dn, unsigned char *dma_window_prop, + unsigned long *busno, unsigned long *phys, unsigned long *size); + extern void kdump_move_device_tree(void); +/* CPU OF node matching */ +struct device_node *of_get_cpu_node(int cpu, unsigned int *thread); + + +/* + * OF interrupt mapping + */ + +/* This structure is returned when an interrupt is mapped. The controller + * field needs to be put() after use + */ + +#define OF_MAX_IRQ_SPEC 4 /* We handle specifiers of at most 4 cells */ + +struct of_irq { + struct device_node *controller; /* Interrupt controller node */ + u32 size; /* Specifier size */ + u32 specifier[OF_MAX_IRQ_SPEC]; /* Specifier copy */ +}; + +/*** + * of_irq_map_init - Initialize the irq remapper + * @flags: flags defining workarounds to enable + * + * Some machines have bugs in the device-tree which require certain workarounds + * to be applied. Call this before any interrupt mapping attempts to enable + * those workarounds. + */ +#define OF_IMAP_OLDWORLD_MAC 0x00000001 +#define OF_IMAP_NO_PHANDLE 0x00000002 + +extern void of_irq_map_init(unsigned int flags); + +/*** + * of_irq_map_raw - Low level interrupt tree parsing + * @parent: the device interrupt parent + * @intspec: interrupt specifier ("interrupts" property of the device) + * @ointsize: size of the passed in interrupt specifier + * @addr: address specifier (start of "reg" property of the device) + * @out_irq: structure of_irq filled by this function + * + * Returns 0 on success and a negative number on error + * + * This function is a low-level interrupt tree walking function. It + * can be used to do a partial walk with synthetized reg and interrupts + * properties, for example when resolving PCI interrupts when no device + * node exist for the parent. + * + */ + +extern int of_irq_map_raw(struct device_node *parent, u32 *intspec, + u32 ointsize, u32 *addr, + struct of_irq *out_irq); + + +/*** + * of_irq_map_one - Resolve an interrupt for a device + * @device: the device whose interrupt is to be resolved + * @index: index of the interrupt to resolve + * @out_irq: structure of_irq filled by this function + * + * This function resolves an interrupt, walking the tree, for a given + * device-tree node. It's the high level pendant to of_irq_map_raw(). + * It also implements the workarounds for OldWolrd Macs. + */ +extern int of_irq_map_one(struct device_node *device, int index, + struct of_irq *out_irq); + +/*** + * of_irq_map_pci - Resolve the interrupt for a PCI device + * @pdev: the device whose interrupt is to be resolved + * @out_irq: structure of_irq filled by this function + * + * This function resolves the PCI interrupt for a given PCI device. If a + * device-node exists for a given pci_dev, it will use normal OF tree + * walking. If not, it will implement standard swizzling and walk up the + * PCI tree until an device-node is found, at which point it will finish + * resolving using the OF tree walking. + */ +struct pci_dev; +extern int of_irq_map_pci(struct pci_dev *pdev, struct of_irq *out_irq); + + #endif /* __KERNEL__ */ #endif /* _POWERPC_PROM_H */ diff --git a/include/asm-powerpc/ptrace.h b/include/asm-powerpc/ptrace.h index 9c550b314..4435efe85 100644 --- a/include/asm-powerpc/ptrace.h +++ b/include/asm-powerpc/ptrace.h @@ -215,12 +215,10 @@ do { \ #define PTRACE_GETVRREGS 18 #define PTRACE_SETVRREGS 19 -#ifndef __powerpc64__ /* Get/set all the upper 32-bits of the SPE registers, accumulator, and * spefscr, in one go */ #define PTRACE_GETEVRREGS 20 #define PTRACE_SETEVRREGS 21 -#endif /* __powerpc64__ */ /* * Get or set a debug register. The first 16 are DABR registers and the @@ -229,7 +227,6 @@ do { \ #define PTRACE_GET_DEBUGREG 25 #define PTRACE_SET_DEBUGREG 26 -#ifdef __powerpc64__ /* Additional PTRACE requests implemented on PowerPC. */ #define PPC_PTRACE_GETREGS 0x99 /* Get GPRs 0 - 31 */ #define PPC_PTRACE_SETREGS 0x98 /* Set GPRs 0 - 31 */ @@ -243,6 +240,5 @@ do { \ #define PPC_PTRACE_POKEDATA_3264 0x92 #define PPC_PTRACE_PEEKUSR_3264 0x91 #define PPC_PTRACE_POKEUSR_3264 0x90 -#endif /* __powerpc64__ */ #endif /* _ASM_POWERPC_PTRACE_H */ diff --git a/include/asm-powerpc/reg.h b/include/asm-powerpc/reg.h index bd467bf5c..cf73475a0 100644 --- a/include/asm-powerpc/reg.h +++ b/include/asm-powerpc/reg.h @@ -93,8 +93,8 @@ #define MSR_LE __MASK(MSR_LE_LG) /* Little Endian */ #ifdef CONFIG_PPC64 -#define MSR_ MSR_ME | MSR_RI | MSR_IR | MSR_DR | MSR_ISF -#define MSR_KERNEL MSR_ | MSR_SF | MSR_HV +#define MSR_ MSR_ME | MSR_RI | MSR_IR | MSR_DR | MSR_ISF |MSR_HV +#define MSR_KERNEL MSR_ | MSR_SF #define MSR_USER32 MSR_ | MSR_PR | MSR_EE #define MSR_USER64 MSR_USER32 | MSR_SF @@ -153,7 +153,7 @@ #define SPRN_DABR 0x3F5 /* Data Address Breakpoint Register */ #define DABR_TRANSLATION (1UL << 2) #define SPRN_DAR 0x013 /* Data Address Register */ -#define SPRN_DSISR 0x012 /* Data Storage Interrupt Status Register */ +#define SPRN_DSISR 0x012 /* Data Storage Interrupt Status Register */ #define DSISR_NOHPTE 0x40000000 /* no translation found */ #define DSISR_PROTFAULT 0x08000000 /* protection fault */ #define DSISR_ISSTORE 0x02000000 /* access was a store */ @@ -258,16 +258,16 @@ #define SPRN_IABR 0x3F2 /* Instruction Address Breakpoint Register */ #define SPRN_HID4 0x3F4 /* 970 HID4 */ #define SPRN_HID5 0x3F6 /* 970 HID5 */ -#define SPRN_HID6 0x3F9 /* BE HID 6 */ -#define HID6_LB (0x0F<<12) /* Concurrent Large Page Modes */ -#define HID6_DLP (1<<20) /* Disable all large page modes (4K only) */ -#define SPRN_TSC_CELL 0x399 /* Thread switch control on Cell */ -#define TSC_CELL_DEC_ENABLE_0 0x400000 /* Decrementer Interrupt */ -#define TSC_CELL_DEC_ENABLE_1 0x200000 /* Decrementer Interrupt */ -#define TSC_CELL_EE_ENABLE 0x100000 /* External Interrupt */ -#define TSC_CELL_EE_BOOST 0x080000 /* External Interrupt Boost */ -#define SPRN_TSC 0x3FD /* Thread switch control on others */ -#define SPRN_TST 0x3FC /* Thread switch timeout on others */ +#define SPRN_HID6 0x3F9 /* BE HID 6 */ +#define HID6_LB (0x0F<<12) /* Concurrent Large Page Modes */ +#define HID6_DLP (1<<20) /* Disable all large page modes (4K only) */ +#define SPRN_TSC_CELL 0x399 /* Thread switch control on Cell */ +#define TSC_CELL_DEC_ENABLE_0 0x400000 /* Decrementer Interrupt */ +#define TSC_CELL_DEC_ENABLE_1 0x200000 /* Decrementer Interrupt */ +#define TSC_CELL_EE_ENABLE 0x100000 /* External Interrupt */ +#define TSC_CELL_EE_BOOST 0x080000 /* External Interrupt Boost */ +#define SPRN_TSC 0x3FD /* Thread switch control on others */ +#define SPRN_TST 0x3FC /* Thread switch timeout on others */ #if !defined(SPRN_IAC1) && !defined(SPRN_IAC2) #define SPRN_IAC1 0x3F4 /* Instruction Address Compare 1 */ #define SPRN_IAC2 0x3F5 /* Instruction Address Compare 2 */ @@ -362,7 +362,7 @@ #endif #define SPRN_PTEHI 0x3D5 /* 981 7450 PTE HI word (S/W TLB load) */ #define SPRN_PTELO 0x3D6 /* 982 7450 PTE LO word (S/W TLB load) */ -#define SPRN_PURR 0x135 /* Processor Utilization of Resources Reg */ +#define SPRN_PURR 0x135 /* Processor Utilization of Resources Reg */ #define SPRN_PVR 0x11F /* Processor Version Register */ #define SPRN_RPA 0x3D6 /* Required Physical Address Register */ #define SPRN_SDA 0x3BF /* Sampled Data Address Register */ @@ -386,6 +386,8 @@ #define SRR1_WAKEMT 0x00280000 /* mtctrl */ #define SRR1_WAKEDEC 0x00180000 /* Decrementer interrupt */ #define SRR1_WAKETHERM 0x00100000 /* Thermal management interrupt */ +#define SPRN_HSRR0 0x13A /* Save/Restore Register 0 */ +#define SPRN_HSRR1 0x13B /* Save/Restore Register 1 */ #ifndef SPRN_SVR #define SPRN_SVR 0x11E /* System Version Register */ @@ -443,6 +445,10 @@ #define MMCRA_SIHV 0x10000000UL /* state of MSR HV when SIAR set */ #define MMCRA_SIPR 0x08000000UL /* state of MSR PR when SIAR set */ #define MMCRA_SAMPLE_ENABLE 0x00000001UL /* enable sampling */ +#define POWER6_MMCRA_SIHV 0x0000040000000000ULL +#define POWER6_MMCRA_SIPR 0x0000020000000000ULL +#define POWER6_MMCRA_THRM 0x00000020UL +#define POWER6_MMCRA_OTHER 0x0000000EUL #define SPRN_PMC1 787 #define SPRN_PMC2 788 #define SPRN_PMC3 789 @@ -495,6 +501,19 @@ #define MMCR0_PMC2_LOADMISSTIME 0x5 #endif +/* + * An mtfsf instruction with the L bit set. On CPUs that support this a + * full 64bits of FPSCR is restored and on other CPUs it is ignored. + * + * Until binutils gets the new form of mtfsf, hardwire the instruction. + */ +#ifdef CONFIG_PPC64 +#define MTFSF_L(REG) \ + .long (0xfc00058e | ((0xff) << 17) | ((REG) << 11) | (1 << 25)) +#else +#define MTFSF_L(REG) mtfsf 0xff, (REG) +#endif + /* Processor Version Register (PVR) field extraction */ #define PVR_VER(pvr) (((pvr) >> 16) & 0xFFFF) /* Version field */ @@ -559,20 +578,20 @@ /* 64-bit processors */ /* XXX the prefix should be PVR_, we'll do a global sweep to fix it one day */ -#define PV_NORTHSTAR 0x0033 -#define PV_PULSAR 0x0034 -#define PV_POWER4 0x0035 -#define PV_ICESTAR 0x0036 -#define PV_SSTAR 0x0037 -#define PV_POWER4p 0x0038 +#define PV_NORTHSTAR 0x0033 +#define PV_PULSAR 0x0034 +#define PV_POWER4 0x0035 +#define PV_ICESTAR 0x0036 +#define PV_SSTAR 0x0037 +#define PV_POWER4p 0x0038 #define PV_970 0x0039 -#define PV_POWER5 0x003A +#define PV_POWER5 0x003A #define PV_POWER5p 0x003B #define PV_970FX 0x003C -#define PV_630 0x0040 -#define PV_630p 0x0041 -#define PV_970MP 0x0044 -#define PV_BE 0x0070 +#define PV_630 0x0040 +#define PV_630p 0x0041 +#define PV_970MP 0x0044 +#define PV_BE 0x0070 /* * Number of entries in the SLB. If this ever changes we should handle diff --git a/include/asm-powerpc/rtas.h b/include/asm-powerpc/rtas.h index f43c6835e..82a27e9a0 100644 --- a/include/asm-powerpc/rtas.h +++ b/include/asm-powerpc/rtas.h @@ -24,6 +24,7 @@ #define RTAS_RMOBUF_MAX (64 * 1024) /* RTAS return status codes */ +#define RTAS_NOT_SUSPENDABLE -9004 #define RTAS_BUSY -2 /* RTAS Busy */ #define RTAS_EXTENDED_DELAY_MIN 9900 #define RTAS_EXTENDED_DELAY_MAX 9905 @@ -169,6 +170,7 @@ extern int rtas_get_sensor(int sensor, int index, int *state); extern int rtas_get_power_level(int powerdomain, int *level); extern int rtas_set_power_level(int powerdomain, int level, int *setlevel); extern int rtas_set_indicator(int indicator, int index, int new_value); +extern int rtas_set_indicator_fast(int indicator, int index, int new_value); extern void rtas_progress(char *s, unsigned short hex); extern void rtas_initialize(void); @@ -177,12 +179,11 @@ extern unsigned long rtas_get_boot_time(void); extern void rtas_get_rtc_time(struct rtc_time *rtc_time); extern int rtas_set_rtc_time(struct rtc_time *rtc_time); -/* Given an RTAS status code of 9900..9905 compute the hinted delay */ -unsigned int rtas_extended_busy_delay_time(int status); -static inline int rtas_is_extended_busy(int status) -{ - return status >= 9900 && status <= 9909; -} +extern unsigned int rtas_busy_delay_time(int status); +extern unsigned int rtas_busy_delay(int status); + +extern int early_init_dt_scan_rtas(unsigned long node, + const char *uname, int depth, void *data); extern void pSeries_log_error(char *buf, unsigned int err_type, int fatal); diff --git a/include/asm-powerpc/rwsem.h b/include/asm-powerpc/rwsem.h index 2c2fe9647..e929145e1 100644 --- a/include/asm-powerpc/rwsem.h +++ b/include/asm-powerpc/rwsem.h @@ -28,24 +28,11 @@ struct rw_semaphore { #define RWSEM_ACTIVE_WRITE_BIAS (RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS) spinlock_t wait_lock; struct list_head wait_list; -#if RWSEM_DEBUG - int debug; -#endif }; -/* - * initialisation - */ -#if RWSEM_DEBUG -#define __RWSEM_DEBUG_INIT , 0 -#else -#define __RWSEM_DEBUG_INIT /* */ -#endif - #define __RWSEM_INITIALIZER(name) \ { RWSEM_UNLOCKED_VALUE, SPIN_LOCK_UNLOCKED, \ - LIST_HEAD_INIT((name).wait_list) \ - __RWSEM_DEBUG_INIT } + LIST_HEAD_INIT((name).wait_list) } #define DECLARE_RWSEM(name) \ struct rw_semaphore name = __RWSEM_INITIALIZER(name) @@ -60,9 +47,6 @@ static inline void init_rwsem(struct rw_semaphore *sem) sem->count = RWSEM_UNLOCKED_VALUE; spin_lock_init(&sem->wait_lock); INIT_LIST_HEAD(&sem->wait_list); -#if RWSEM_DEBUG - sem->debug = 0; -#endif } /* diff --git a/include/asm-powerpc/signal.h b/include/asm-powerpc/signal.h index a4d8f8648..a8c7babf4 100644 --- a/include/asm-powerpc/signal.h +++ b/include/asm-powerpc/signal.h @@ -63,7 +63,6 @@ typedef struct { * SA_FLAGS values: * * SA_ONSTACK is not currently supported, but will allow sigaltstack(2). - * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. * SA_RESETHAND clears the handler when the signal is delivered. @@ -83,7 +82,6 @@ typedef struct { #define SA_NOMASK SA_NODEFER #define SA_ONESHOT SA_RESETHAND -#define SA_INTERRUPT 0x20000000u /* dummy -- ignored */ #define SA_RESTORER 0x04000000U diff --git a/include/asm-powerpc/smp.h b/include/asm-powerpc/smp.h index 4a716f707..068f119aa 100644 --- a/include/asm-powerpc/smp.h +++ b/include/asm-powerpc/smp.h @@ -17,7 +17,6 @@ #define _ASM_POWERPC_SMP_H #ifdef __KERNEL__ -#include #include #include #include diff --git a/include/asm-powerpc/smu.h b/include/asm-powerpc/smu.h index 2dc93632f..51e65fc46 100644 --- a/include/asm-powerpc/smu.h +++ b/include/asm-powerpc/smu.h @@ -5,7 +5,6 @@ * Definitions for talking to the SMU chip in newer G5 PowerMacs */ #ifdef __KERNEL__ -#include #include #endif #include diff --git a/include/asm-powerpc/socket.h b/include/asm-powerpc/socket.h index e4b8177d4..c8b1da50e 100644 --- a/include/asm-powerpc/socket.h +++ b/include/asm-powerpc/socket.h @@ -55,5 +55,6 @@ #define SO_ACCEPTCONN 30 #define SO_PEERSEC 31 +#define SO_PASSSEC 34 #endif /* _ASM_POWERPC_SOCKET_H */ diff --git a/include/asm-powerpc/spinlock.h b/include/asm-powerpc/spinlock.h index 895cb6d3a..c31e4382a 100644 --- a/include/asm-powerpc/spinlock.h +++ b/include/asm-powerpc/spinlock.h @@ -36,6 +36,19 @@ #define LOCK_TOKEN 1 #endif +#if defined(CONFIG_PPC64) && defined(CONFIG_SMP) +#define CLEAR_IO_SYNC (get_paca()->io_sync = 0) +#define SYNC_IO do { \ + if (unlikely(get_paca()->io_sync)) { \ + mb(); \ + get_paca()->io_sync = 0; \ + } \ + } while (0) +#else +#define CLEAR_IO_SYNC +#define SYNC_IO +#endif + /* * This returns the old value in the lock, so we succeeded * in getting the lock if the return value is 0. @@ -61,6 +74,7 @@ static __inline__ unsigned long __spin_trylock(raw_spinlock_t *lock) static int __inline__ __raw_spin_trylock(raw_spinlock_t *lock) { + CLEAR_IO_SYNC; return __spin_trylock(lock) == 0; } @@ -91,6 +105,7 @@ extern void __rw_yield(raw_rwlock_t *lock); static void __inline__ __raw_spin_lock(raw_spinlock_t *lock) { + CLEAR_IO_SYNC; while (1) { if (likely(__spin_trylock(lock) == 0)) break; @@ -107,6 +122,7 @@ static void __inline__ __raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long { unsigned long flags_dis; + CLEAR_IO_SYNC; while (1) { if (likely(__spin_trylock(lock) == 0)) break; @@ -124,6 +140,7 @@ static void __inline__ __raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long static __inline__ void __raw_spin_unlock(raw_spinlock_t *lock) { + SYNC_IO; __asm__ __volatile__("# __raw_spin_unlock\n\t" LWSYNC_ON_SMP: : :"memory"); lock->slock = 0; diff --git a/include/asm-powerpc/spu.h b/include/asm-powerpc/spu.h index 7cfcff3ef..c02d105d8 100644 --- a/include/asm-powerpc/spu.h +++ b/include/asm-powerpc/spu.h @@ -24,9 +24,8 @@ #define _SPU_H #ifdef __KERNEL__ -#include -#include #include +#include #define LS_SIZE (256 * 1024) #define LS_ADDR_MASK (LS_SIZE - 1) @@ -118,12 +117,12 @@ struct spu { struct list_head sched_list; int number; int nid; + unsigned int irqs[3]; u32 isrc; u32 node; u64 flags; u64 dar; u64 dsisr; - struct kref kref; size_t ls_size; unsigned int slb_replace; struct mm_struct *mm; @@ -135,7 +134,6 @@ struct spu { int class_0_pending; spinlock_t register_lock; - u32 stop_code; void (* wbox_callback)(struct spu *spu); void (* ibox_callback)(struct spu *spu); void (* stop_callback)(struct spu *spu); @@ -144,6 +142,8 @@ struct spu { char irq_c0[8]; char irq_c1[8]; char irq_c2[8]; + + struct sys_device sysdev; }; struct spu *spu_alloc(void); @@ -182,29 +182,6 @@ static inline void unregister_spu_syscalls(struct spufs_calls *calls) #endif /* MODULE */ -/* access to priv1 registers */ -void spu_int_mask_and(struct spu *spu, int class, u64 mask); -void spu_int_mask_or(struct spu *spu, int class, u64 mask); -void spu_int_mask_set(struct spu *spu, int class, u64 mask); -u64 spu_int_mask_get(struct spu *spu, int class); -void spu_int_stat_clear(struct spu *spu, int class, u64 stat); -u64 spu_int_stat_get(struct spu *spu, int class); -void spu_int_route_set(struct spu *spu, u64 route); -u64 spu_mfc_dar_get(struct spu *spu); -u64 spu_mfc_dsisr_get(struct spu *spu); -void spu_mfc_dsisr_set(struct spu *spu, u64 dsisr); -void spu_mfc_sdr_set(struct spu *spu, u64 sdr); -void spu_mfc_sr1_set(struct spu *spu, u64 sr1); -u64 spu_mfc_sr1_get(struct spu *spu); -void spu_mfc_tclass_id_set(struct spu *spu, u64 tclass_id); -u64 spu_mfc_tclass_id_get(struct spu *spu); -void spu_tlb_invalidate(struct spu *spu); -void spu_resource_allocation_groupID_set(struct spu *spu, u64 id); -u64 spu_resource_allocation_groupID_get(struct spu *spu); -void spu_resource_allocation_enable_set(struct spu *spu, u64 enable); -u64 spu_resource_allocation_enable_get(struct spu *spu); - - /* * This defines the Local Store, Problem Area and Privlege Area of an SPU. */ diff --git a/include/asm-powerpc/spu_csa.h b/include/asm-powerpc/spu_csa.h index ba18d7d4d..964c2d38c 100644 --- a/include/asm-powerpc/spu_csa.h +++ b/include/asm-powerpc/spu_csa.h @@ -86,10 +86,18 @@ struct spu_lscsa { struct spu_reg128 event_mask; struct spu_reg128 srr0; struct spu_reg128 stopped_status; - struct spu_reg128 pad[119]; /* 'ls' must be page-aligned. */ - unsigned char ls[LS_SIZE]; + + /* + * 'ls' must be page-aligned on all configurations. + * Since we don't want to rely on having the spu-gcc + * installed to build the kernel and this structure + * is used in the SPU-side code, make it 64k-page + * aligned for now. + */ + unsigned char ls[LS_SIZE] __attribute__((aligned(65536))); }; +#ifndef __SPU__ /* * struct spu_problem_collapsed - condensed problem state area, w/o pads. */ @@ -250,6 +258,7 @@ extern int spu_restore(struct spu_state *new, struct spu *spu); extern int spu_switch(struct spu_state *prev, struct spu_state *new, struct spu *spu); +#endif /* !__SPU__ */ #endif /* __KERNEL__ */ #endif /* !__ASSEMBLY__ */ #endif /* _SPU_CSA_H_ */ diff --git a/include/asm-powerpc/system.h b/include/asm-powerpc/system.h index d075725bf..4c9f5229e 100644 --- a/include/asm-powerpc/system.h +++ b/include/asm-powerpc/system.h @@ -39,7 +39,6 @@ #define read_barrier_depends() do { } while(0) #define set_mb(var, value) do { var = value; mb(); } while (0) -#define set_wmb(var, value) do { var = value; wmb(); } while (0) #ifdef __KERNEL__ #ifdef CONFIG_SMP @@ -54,6 +53,15 @@ #define smp_read_barrier_depends() do { } while(0) #endif /* CONFIG_SMP */ +/* + * This is a barrier which prevents following instructions from being + * started until the value of the argument x is known. For example, if + * x is a variable loaded from memory, this prevents following + * instructions from being executed until the load has been performed. + */ +#define data_barrier(x) \ + asm volatile("twi 0,%0,0; isync" : : "r" (x) : "memory"); + struct task_struct; struct pt_regs; @@ -220,8 +228,8 @@ __xchg_u32(volatile void *p, unsigned long val) " stwcx. %3,0,%2 \n\ bne- 1b" ISYNC_ON_SMP - : "=&r" (prev), "=m" (*(volatile unsigned int *)p) - : "r" (p), "r" (val), "m" (*(volatile unsigned int *)p) + : "=&r" (prev), "+m" (*(volatile unsigned int *)p) + : "r" (p), "r" (val) : "cc", "memory"); return prev; @@ -240,8 +248,8 @@ __xchg_u64(volatile void *p, unsigned long val) " stdcx. %3,0,%2 \n\ bne- 1b" ISYNC_ON_SMP - : "=&r" (prev), "=m" (*(volatile unsigned long *)p) - : "r" (p), "r" (val), "m" (*(volatile unsigned long *)p) + : "=&r" (prev), "+m" (*(volatile unsigned long *)p) + : "r" (p), "r" (val) : "cc", "memory"); return prev; @@ -299,8 +307,8 @@ __cmpxchg_u32(volatile unsigned int *p, unsigned long old, unsigned long new) ISYNC_ON_SMP "\n\ 2:" - : "=&r" (prev), "=m" (*p) - : "r" (p), "r" (old), "r" (new), "m" (*p) + : "=&r" (prev), "+m" (*p) + : "r" (p), "r" (old), "r" (new) : "cc", "memory"); return prev; @@ -322,8 +330,8 @@ __cmpxchg_u64(volatile unsigned long *p, unsigned long old, unsigned long new) ISYNC_ON_SMP "\n\ 2:" - : "=&r" (prev), "=m" (*p) - : "r" (p), "r" (old), "r" (new), "m" (*p) + : "=&r" (prev), "+m" (*p) + : "r" (p), "r" (old), "r" (new) : "cc", "memory"); return prev; diff --git a/include/asm-powerpc/tce.h b/include/asm-powerpc/tce.h index 6fa200ad7..c9483adbf 100644 --- a/include/asm-powerpc/tce.h +++ b/include/asm-powerpc/tce.h @@ -35,32 +35,15 @@ #define TCE_PAGE_SIZE (1 << TCE_SHIFT) #define TCE_PAGE_FACTOR (PAGE_SHIFT - TCE_SHIFT) - -/* tce_entry - * Used by pSeries (SMP) and iSeries/pSeries LPAR, but there it's - * abstracted so layout is irrelevant. - */ -union tce_entry { - unsigned long te_word; - struct { - unsigned int tb_cacheBits :6; /* Cache hash bits - not used */ - unsigned int tb_rsvd :6; - unsigned long tb_rpn :40; /* Real page number */ - unsigned int tb_valid :1; /* Tce is valid (vb only) */ - unsigned int tb_allio :1; /* Tce is valid for all lps (vb only) */ - unsigned int tb_lpindex :8; /* LpIndex for user of TCE (vb only) */ - unsigned int tb_pciwr :1; /* Write allowed (pci only) */ - unsigned int tb_rdwr :1; /* Read allowed (pci), Write allowed (vb) */ - } te_bits; -#define te_cacheBits te_bits.tb_cacheBits -#define te_rpn te_bits.tb_rpn -#define te_valid te_bits.tb_valid -#define te_allio te_bits.tb_allio -#define te_lpindex te_bits.tb_lpindex -#define te_pciwr te_bits.tb_pciwr -#define te_rdwr te_bits.tb_rdwr -}; - +#define TCE_ENTRY_SIZE 8 /* each TCE is 64 bits */ + +#define TCE_RPN_MASK 0xfffffffffful /* 40-bit RPN (4K pages) */ +#define TCE_RPN_SHIFT 12 +#define TCE_VALID 0x800 /* TCE valid */ +#define TCE_ALLIO 0x400 /* TCE valid for all lpars */ +#define TCE_PCI_WRITE 0x2 /* write from PCI allowed */ +#define TCE_PCI_READ 0x1 /* read from PCI allowed */ +#define TCE_VB_WRITE 0x1 /* write from VB allowed */ #endif /* __KERNEL__ */ #endif /* _ASM_POWERPC_TCE_H */ diff --git a/include/asm-powerpc/thread_info.h b/include/asm-powerpc/thread_info.h index 88b553c6b..d339e2e88 100644 --- a/include/asm-powerpc/thread_info.h +++ b/include/asm-powerpc/thread_info.h @@ -21,7 +21,6 @@ #define THREAD_SIZE (1 << THREAD_SHIFT) #ifndef __ASSEMBLY__ -#include #include #include #include diff --git a/include/asm-powerpc/time.h b/include/asm-powerpc/time.h index 912118db1..5785ac473 100644 --- a/include/asm-powerpc/time.h +++ b/include/asm-powerpc/time.h @@ -14,13 +14,13 @@ #define __POWERPC_TIME_H #ifdef __KERNEL__ -#include #include #include #include -#ifdef CONFIG_PPC64 +#ifdef CONFIG_PPC_ISERIES #include +#include #include #endif @@ -30,10 +30,6 @@ extern unsigned long tb_ticks_per_usec; extern unsigned long tb_ticks_per_sec; extern u64 tb_to_xs; extern unsigned tb_to_us; -extern unsigned long tb_last_stamp; -extern u64 tb_last_jiffy; - -DECLARE_PER_CPU(unsigned long, last_jiffy); struct rtc_time; extern void to_tm(int tim, struct rtc_time * tm); @@ -178,7 +174,8 @@ static inline void set_dec(int val) #ifdef CONFIG_PPC_ISERIES int cur_dec; - if (get_lppaca()->shared_proc) { + if (firmware_has_feature(FW_FEATURE_ISERIES) && + get_lppaca()->shared_proc) { get_lppaca()->virtual_decr = val; cur_dec = get_dec(); if (cur_dec > val) diff --git a/include/asm-powerpc/timex.h b/include/asm-powerpc/timex.h index c02d15ace..3b9a8e786 100644 --- a/include/asm-powerpc/timex.h +++ b/include/asm-powerpc/timex.h @@ -7,7 +7,6 @@ * PowerPC architecture timex specifications */ -#include #include #define CLOCK_TICK_RATE 1024000 /* Underlying HZ */ diff --git a/include/asm-powerpc/tlb.h b/include/asm-powerpc/tlb.h index 601a53cf9..4e2a83468 100644 --- a/include/asm-powerpc/tlb.h +++ b/include/asm-powerpc/tlb.h @@ -13,7 +13,6 @@ #define _ASM_POWERPC_TLB_H #ifdef __KERNEL__ -#include #ifndef __powerpc64__ #include #endif diff --git a/include/asm-powerpc/tlbflush.h b/include/asm-powerpc/tlbflush.h index a2998eee3..93c7d0c72 100644 --- a/include/asm-powerpc/tlbflush.h +++ b/include/asm-powerpc/tlbflush.h @@ -17,7 +17,6 @@ */ #ifdef __KERNEL__ -#include struct mm_struct; diff --git a/include/asm-powerpc/topology.h b/include/asm-powerpc/topology.h index 87362a055..bbc3844b0 100644 --- a/include/asm-powerpc/topology.h +++ b/include/asm-powerpc/topology.h @@ -2,7 +2,6 @@ #define _ASM_POWERPC_TOPOLOGY_H #ifdef __KERNEL__ -#include struct sys_device; struct device_node; @@ -32,8 +31,13 @@ static inline int node_to_first_cpu(int node) int of_node_to_nid(struct device_node *device); -#define pcibus_to_node(node) (-1) -#define pcibus_to_cpumask(bus) (cpu_online_map) +struct pci_bus; +extern int pcibus_to_node(struct pci_bus *bus); + +#define pcibus_to_cpumask(bus) (pcibus_to_node(bus) == -1 ? \ + CPU_MASK_ALL : \ + node_to_cpumask(pcibus_to_node(bus)) \ + ) /* sched_domains SD_NODE_INIT for PPC64 machines */ #define SD_NODE_INIT (struct sched_domain) { \ @@ -89,5 +93,10 @@ static inline void sysfs_remove_device_from_node(struct sys_device *dev, #endif /* CONFIG_NUMA */ +#ifdef CONFIG_SMP +#include +#define smt_capable() (cpu_has_feature(CPU_FTR_SMT)) +#endif + #endif /* __KERNEL__ */ #endif /* _ASM_POWERPC_TOPOLOGY_H */ diff --git a/include/asm-powerpc/types.h b/include/asm-powerpc/types.h index baabba96e..d6fb56b80 100644 --- a/include/asm-powerpc/types.h +++ b/include/asm-powerpc/types.h @@ -64,7 +64,6 @@ typedef struct { #ifndef __ASSEMBLY__ -#include typedef signed char s8; typedef unsigned char u8; diff --git a/include/asm-powerpc/udbg.h b/include/asm-powerpc/udbg.h index 5c4236c34..55e57844f 100644 --- a/include/asm-powerpc/udbg.h +++ b/include/asm-powerpc/udbg.h @@ -23,7 +23,8 @@ extern int udbg_write(const char *s, int n); extern int udbg_read(char *buf, int buflen); extern void register_early_udbg_console(void); -extern void udbg_printf(const char *fmt, ...); +extern void udbg_printf(const char *fmt, ...) + __attribute__ ((format (printf, 1, 2))); extern void udbg_progress(char *s, unsigned short hex); extern void udbg_init_uart(void __iomem *comport, unsigned int speed, @@ -41,7 +42,8 @@ extern void __init udbg_init_debug_lpar(void); extern void __init udbg_init_pmac_realmode(void); extern void __init udbg_init_maple_realmode(void); extern void __init udbg_init_iseries(void); -extern void __init udbg_init_rtas(void); +extern void __init udbg_init_rtas_panel(void); +extern void __init udbg_init_rtas_console(void); #endif /* __KERNEL__ */ #endif /* _ASM_POWERPC_UDBG_H */ diff --git a/include/asm-powerpc/unistd.h b/include/asm-powerpc/unistd.h index 4b5f5e1cd..b8faee752 100644 --- a/include/asm-powerpc/unistd.h +++ b/include/asm-powerpc/unistd.h @@ -324,12 +324,12 @@ #define __NR_get_robust_list 299 #define __NR_set_robust_list 300 +#ifdef __KERNEL__ + #define __NR_syscalls 301 -#ifdef __KERNEL__ #define __NR__exit __NR_exit #define NR_syscalls __NR_syscalls -#endif #ifndef __ASSEMBLY__ @@ -441,9 +441,7 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6 __syscall_nr(6, type, name, arg1, arg2, arg3, arg4, arg5, arg6); \ } -#ifdef __KERNEL__ -#include #include #include #include @@ -499,8 +497,8 @@ extern int execve(const char *file, char **argv, char **envp); #define cond_syscall(x) asm(".weak\t." #x "\n\t.set\t." #x ",.sys_ni_syscall") #endif -#endif /* __KERNEL__ */ #endif /* __ASSEMBLY__ */ +#endif /* __KERNEL__ */ #endif /* _ASM_PPC_UNISTD_H_ */ diff --git a/include/asm-powerpc/vga.h b/include/asm-powerpc/vga.h index f8d350aab..a2eac409c 100644 --- a/include/asm-powerpc/vga.h +++ b/include/asm-powerpc/vga.h @@ -12,7 +12,6 @@ #include -#include #if defined(CONFIG_VGA_CONSOLE) || defined(CONFIG_MDA_CONSOLE) @@ -42,9 +41,9 @@ static inline u16 scr_readw(volatile const u16 *addr) extern unsigned long vgacon_remap_base; #ifdef __powerpc64__ -#define VGA_MAP_MEM(x) ((unsigned long) ioremap((x), 0)) +#define VGA_MAP_MEM(x,s) ((unsigned long) ioremap((x), s)) #else -#define VGA_MAP_MEM(x) (x + vgacon_remap_base) +#define VGA_MAP_MEM(x,s) (x + vgacon_remap_base) #endif #define vga_readb(x) (*(x)) diff --git a/include/asm-powerpc/vio.h b/include/asm-powerpc/vio.h index 0544ece51..dc9bd101c 100644 --- a/include/asm-powerpc/vio.h +++ b/include/asm-powerpc/vio.h @@ -15,7 +15,6 @@ #define _ASM_POWERPC_VIO_H #ifdef __KERNEL__ -#include #include #include #include @@ -64,32 +63,22 @@ struct vio_driver { struct device_driver driver; }; -struct vio_bus_ops { - int (*match)(const struct vio_device_id *id, const struct vio_dev *dev); - void (*unregister_device)(struct vio_dev *); - void (*release_device)(struct device *); -}; - extern struct dma_mapping_ops vio_dma_ops; extern struct bus_type vio_bus_type; -extern struct vio_dev vio_bus_device; extern int vio_register_driver(struct vio_driver *drv); extern void vio_unregister_driver(struct vio_driver *drv); -extern struct vio_dev * __devinit vio_register_device(struct vio_dev *viodev); extern void __devinit vio_unregister_device(struct vio_dev *dev); -extern int vio_bus_init(struct vio_bus_ops *); - -#ifdef CONFIG_PPC_PSERIES struct device_node; extern struct vio_dev * __devinit vio_register_device_node( struct device_node *node_vdev); -extern struct vio_dev *vio_find_node(struct device_node *vnode); -extern const void *vio_get_attribute(struct vio_dev *vdev, void *which, +extern const void *vio_get_attribute(struct vio_dev *vdev, char *which, int *length); +#ifdef CONFIG_PPC_PSERIES +extern struct vio_dev *vio_find_node(struct device_node *vnode); extern int vio_enable_interrupts(struct vio_dev *dev); extern int vio_disable_interrupts(struct vio_dev *dev); #endif diff --git a/include/asm-ppc/amigahw.h b/include/asm-ppc/amigahw.h index 8c98945e7..90fd1274d 100644 --- a/include/asm-ppc/amigahw.h +++ b/include/asm-ppc/amigahw.h @@ -2,7 +2,6 @@ #ifndef __ASMPPC_AMIGAHW_H #define __ASMPPC_AMIGAHW_H -#include #include #undef CHIP_PHYSADDR diff --git a/include/asm-ppc/bootinfo.h b/include/asm-ppc/bootinfo.h index 93d955c70..2ace4a74f 100644 --- a/include/asm-ppc/bootinfo.h +++ b/include/asm-ppc/bootinfo.h @@ -9,7 +9,6 @@ #ifndef _PPC_BOOTINFO_H #define _PPC_BOOTINFO_H -#include #include #if defined(CONFIG_APUS) && !defined(__BOOTER__) diff --git a/include/asm-ppc/commproc.h b/include/asm-ppc/commproc.h index 31f362966..3247bea5f 100644 --- a/include/asm-ppc/commproc.h +++ b/include/asm-ppc/commproc.h @@ -17,7 +17,6 @@ #ifndef __CPM_8XX__ #define __CPM_8XX__ -#include #include #include diff --git a/include/asm-ppc/cpm2.h b/include/asm-ppc/cpm2.h index c5883dbed..f6a7ff04f 100644 --- a/include/asm-ppc/cpm2.h +++ b/include/asm-ppc/cpm2.h @@ -69,7 +69,7 @@ #define CPM_CR_INIT_TX ((ushort)0x0002) #define CPM_CR_HUNT_MODE ((ushort)0x0003) #define CPM_CR_STOP_TX ((ushort)0x0004) -#define CPM_CR_GRA_STOP_TX ((ushort)0x0005) +#define CPM_CR_GRA_STOP_TX ((ushort)0x0005) #define CPM_CR_RESTART_TX ((ushort)0x0006) #define CPM_CR_SET_GADDR ((ushort)0x0008) #define CPM_CR_START_IDMA ((ushort)0x0009) @@ -109,6 +109,7 @@ static inline long IS_DPERR(const uint offset) * and dual port ram. */ extern cpm_cpm2_t *cpmp; /* Pointer to comm processor */ + extern uint cpm_dpalloc(uint size, uint align); extern int cpm_dpfree(uint offset); extern uint cpm_dpalloc_fixed(uint offset, uint size, uint align); @@ -116,6 +117,8 @@ extern void cpm_dpdump(void); extern void *cpm_dpram_addr(uint offset); extern void cpm_setbrg(uint brg, uint rate); extern void cpm2_fastbrg(uint brg, uint rate, int div16); +extern void cpm2_reset(void); + /* Buffer descriptors used by many of the CPM protocols. */ @@ -1084,8 +1087,106 @@ typedef struct im_idma { #define SCCR_PCIDF_MSK 0x00000078 /* PCI division factor */ #define SCCR_PCIDF_SHIFT 3 +#ifndef CPM_IMMR_OFFSET +#define CPM_IMMR_OFFSET 0x101a8 +#endif -#endif /* __CPM2__ */ -#endif /* __KERNEL__ */ +#define FCC_PSMR_RMII ((uint)0x00020000) /* Use RMII interface */ + +/* FCC iop & clock configuration. BSP code is responsible to define Fx_RXCLK & Fx_TXCLK + * in order to use clock-computing stuff below for the FCC x + */ + +/* Automatically generates register configurations */ +#define PC_CLK(x) ((uint)(1<<(x-1))) /* FCC CLK I/O ports */ + +#define CMXFCR_RF1CS(x) ((uint)((x-5)<<27)) /* FCC1 Receive Clock Source */ +#define CMXFCR_TF1CS(x) ((uint)((x-5)<<24)) /* FCC1 Transmit Clock Source */ +#define CMXFCR_RF2CS(x) ((uint)((x-9)<<19)) /* FCC2 Receive Clock Source */ +#define CMXFCR_TF2CS(x) ((uint)((x-9)<<16)) /* FCC2 Transmit Clock Source */ +#define CMXFCR_RF3CS(x) ((uint)((x-9)<<11)) /* FCC3 Receive Clock Source */ +#define CMXFCR_TF3CS(x) ((uint)((x-9)<<8)) /* FCC3 Transmit Clock Source */ + +#define PC_F1RXCLK PC_CLK(F1_RXCLK) +#define PC_F1TXCLK PC_CLK(F1_TXCLK) +#define CMX1_CLK_ROUTE (CMXFCR_RF1CS(F1_RXCLK) | CMXFCR_TF1CS(F1_TXCLK)) +#define CMX1_CLK_MASK ((uint)0xff000000) +#define PC_F2RXCLK PC_CLK(F2_RXCLK) +#define PC_F2TXCLK PC_CLK(F2_TXCLK) +#define CMX2_CLK_ROUTE (CMXFCR_RF2CS(F2_RXCLK) | CMXFCR_TF2CS(F2_TXCLK)) +#define CMX2_CLK_MASK ((uint)0x00ff0000) +#define PC_F3RXCLK PC_CLK(F3_RXCLK) +#define PC_F3TXCLK PC_CLK(F3_TXCLK) +#define CMX3_CLK_ROUTE (CMXFCR_RF3CS(F3_RXCLK) | CMXFCR_TF3CS(F3_TXCLK)) +#define CMX3_CLK_MASK ((uint)0x0000ff00) + +#define CPMUX_CLK_MASK (CMX3_CLK_MASK | CMX2_CLK_MASK) +#define CPMUX_CLK_ROUTE (CMX3_CLK_ROUTE | CMX2_CLK_ROUTE) + +#define CLK_TRX (PC_F3TXCLK | PC_F3RXCLK | PC_F2TXCLK | PC_F2RXCLK) + +/* I/O Pin assignment for FCC1. I don't yet know the best way to do this, + * but there is little variation among the choices. + */ +#define PA1_COL 0x00000001U +#define PA1_CRS 0x00000002U +#define PA1_TXER 0x00000004U +#define PA1_TXEN 0x00000008U +#define PA1_RXDV 0x00000010U +#define PA1_RXER 0x00000020U +#define PA1_TXDAT 0x00003c00U +#define PA1_RXDAT 0x0003c000U +#define PA1_PSORA0 (PA1_RXDAT | PA1_TXDAT) +#define PA1_PSORA1 (PA1_COL | PA1_CRS | PA1_TXER | PA1_TXEN | \ + PA1_RXDV | PA1_RXER) +#define PA1_DIRA0 (PA1_RXDAT | PA1_CRS | PA1_COL | PA1_RXER | PA1_RXDV) +#define PA1_DIRA1 (PA1_TXDAT | PA1_TXEN | PA1_TXER) + + +/* I/O Pin assignment for FCC2. I don't yet know the best way to do this, + * but there is little variation among the choices. + */ +#define PB2_TXER 0x00000001U +#define PB2_RXDV 0x00000002U +#define PB2_TXEN 0x00000004U +#define PB2_RXER 0x00000008U +#define PB2_COL 0x00000010U +#define PB2_CRS 0x00000020U +#define PB2_TXDAT 0x000003c0U +#define PB2_RXDAT 0x00003c00U +#define PB2_PSORB0 (PB2_RXDAT | PB2_TXDAT | PB2_CRS | PB2_COL | \ + PB2_RXER | PB2_RXDV | PB2_TXER) +#define PB2_PSORB1 (PB2_TXEN) +#define PB2_DIRB0 (PB2_RXDAT | PB2_CRS | PB2_COL | PB2_RXER | PB2_RXDV) +#define PB2_DIRB1 (PB2_TXDAT | PB2_TXEN | PB2_TXER) + + +/* I/O Pin assignment for FCC3. I don't yet know the best way to do this, + * but there is little variation among the choices. + */ +#define PB3_RXDV 0x00004000U +#define PB3_RXER 0x00008000U +#define PB3_TXER 0x00010000U +#define PB3_TXEN 0x00020000U +#define PB3_COL 0x00040000U +#define PB3_CRS 0x00080000U +#define PB3_TXDAT 0x0f000000U +#define PC3_TXDAT 0x00000010U +#define PB3_RXDAT 0x00f00000U +#define PB3_PSORB0 (PB3_RXDAT | PB3_TXDAT | PB3_CRS | PB3_COL | \ + PB3_RXER | PB3_RXDV | PB3_TXER | PB3_TXEN) +#define PB3_PSORB1 0 +#define PB3_DIRB0 (PB3_RXDAT | PB3_CRS | PB3_COL | PB3_RXER | PB3_RXDV) +#define PB3_DIRB1 (PB3_TXDAT | PB3_TXEN | PB3_TXER) +#define PC3_DIRC1 (PC3_TXDAT) + +/* Handy macro to specify mem for FCCs*/ +#define FCC_MEM_OFFSET(x) (CPM_FCC_SPECIAL_BASE + (x*128)) +#define FCC1_MEM_OFFSET FCC_MEM_OFFSET(0) +#define FCC2_MEM_OFFSET FCC_MEM_OFFSET(1) +#define FCC2_MEM_OFFSET FCC_MEM_OFFSET(2) + +#endif /* __CPM2__ */ +#endif /* __KERNEL__ */ diff --git a/include/asm-ppc/floppy.h b/include/asm-ppc/floppy.h index 8ccd4a276..d3963ca79 100644 --- a/include/asm-ppc/floppy.h +++ b/include/asm-ppc/floppy.h @@ -96,13 +96,11 @@ static int vdma_get_dma_residue(unsigned int dummy) static int fd_request_irq(void) { if (can_use_virtual_dma) - return request_irq(FLOPPY_IRQ, floppy_hardint,SA_INTERRUPT, - "floppy", NULL); + return request_irq(FLOPPY_IRQ, floppy_hardint, + IRQF_DISABLED, "floppy", NULL); else return request_irq(FLOPPY_IRQ, floppy_interrupt, - SA_INTERRUPT|SA_SAMPLE_RANDOM, - "floppy", NULL); - + IRQF_DISABLED, "floppy", NULL); } static int vdma_dma_setup(char *addr, unsigned long size, int mode, int io) diff --git a/include/asm-ppc/ibm403.h b/include/asm-ppc/ibm403.h index bf6efa041..c9c5d539c 100644 --- a/include/asm-ppc/ibm403.h +++ b/include/asm-ppc/ibm403.h @@ -12,7 +12,6 @@ #ifndef __ASM_IBM403_H__ #define __ASM_IBM403_H__ -#include #if defined(CONFIG_403GCX) diff --git a/include/asm-ppc/ibm44x.h b/include/asm-ppc/ibm44x.h index 3acc382cc..7818b54b6 100644 --- a/include/asm-ppc/ibm44x.h +++ b/include/asm-ppc/ibm44x.h @@ -17,7 +17,6 @@ #ifndef __ASM_IBM44x_H__ #define __ASM_IBM44x_H__ -#include #ifndef NR_BOARD_IRQS #define NR_BOARD_IRQS 0 diff --git a/include/asm-ppc/ibm4xx.h b/include/asm-ppc/ibm4xx.h index 38f997107..cf62b69cb 100644 --- a/include/asm-ppc/ibm4xx.h +++ b/include/asm-ppc/ibm4xx.h @@ -14,7 +14,6 @@ #ifndef __ASM_IBM4XX_H__ #define __ASM_IBM4XX_H__ -#include #include #ifdef CONFIG_40x diff --git a/include/asm-ppc/io.h b/include/asm-ppc/io.h index b919d8fb7..680555be2 100644 --- a/include/asm-ppc/io.h +++ b/include/asm-ppc/io.h @@ -2,7 +2,6 @@ #ifndef _PPC_IO_H #define _PPC_IO_H -#include #include #include @@ -64,7 +63,7 @@ extern inline int in_8(const volatile unsigned char __iomem *addr) int ret; __asm__ __volatile__( - "lbz%U1%X1 %0,%1;\n" + "sync; lbz%U1%X1 %0,%1;\n" "twi 0,%0,0;\n" "isync" : "=r" (ret) : "m" (*addr)); return ret; @@ -79,7 +78,7 @@ extern inline int in_le16(const volatile unsigned short __iomem *addr) { int ret; - __asm__ __volatile__("lhbrx %0,0,%1;\n" + __asm__ __volatile__("sync; lhbrx %0,0,%1;\n" "twi 0,%0,0;\n" "isync" : "=r" (ret) : "r" (addr), "m" (*addr)); @@ -90,7 +89,7 @@ extern inline int in_be16(const volatile unsigned short __iomem *addr) { int ret; - __asm__ __volatile__("lhz%U1%X1 %0,%1;\n" + __asm__ __volatile__("sync; lhz%U1%X1 %0,%1;\n" "twi 0,%0,0;\n" "isync" : "=r" (ret) : "m" (*addr)); return ret; @@ -98,20 +97,20 @@ extern inline int in_be16(const volatile unsigned short __iomem *addr) extern inline void out_le16(volatile unsigned short __iomem *addr, int val) { - __asm__ __volatile__("sthbrx %1,0,%2; eieio" : "=m" (*addr) : + __asm__ __volatile__("sync; sthbrx %1,0,%2" : "=m" (*addr) : "r" (val), "r" (addr)); } extern inline void out_be16(volatile unsigned short __iomem *addr, int val) { - __asm__ __volatile__("sth%U0%X0 %1,%0; eieio" : "=m" (*addr) : "r" (val)); + __asm__ __volatile__("sync; sth%U0%X0 %1,%0" : "=m" (*addr) : "r" (val)); } extern inline unsigned in_le32(const volatile unsigned __iomem *addr) { unsigned ret; - __asm__ __volatile__("lwbrx %0,0,%1;\n" + __asm__ __volatile__("sync; lwbrx %0,0,%1;\n" "twi 0,%0,0;\n" "isync" : "=r" (ret) : "r" (addr), "m" (*addr)); @@ -122,7 +121,7 @@ extern inline unsigned in_be32(const volatile unsigned __iomem *addr) { unsigned ret; - __asm__ __volatile__("lwz%U1%X1 %0,%1;\n" + __asm__ __volatile__("sync; lwz%U1%X1 %0,%1;\n" "twi 0,%0,0;\n" "isync" : "=r" (ret) : "m" (*addr)); return ret; @@ -130,13 +129,13 @@ extern inline unsigned in_be32(const volatile unsigned __iomem *addr) extern inline void out_le32(volatile unsigned __iomem *addr, int val) { - __asm__ __volatile__("stwbrx %1,0,%2; eieio" : "=m" (*addr) : + __asm__ __volatile__("sync; stwbrx %1,0,%2" : "=m" (*addr) : "r" (val), "r" (addr)); } extern inline void out_be32(volatile unsigned __iomem *addr, int val) { - __asm__ __volatile__("stw%U0%X0 %1,%0; eieio" : "=m" (*addr) : "r" (val)); + __asm__ __volatile__("sync; stw%U0%X0 %1,%0" : "=m" (*addr) : "r" (val)); } #if defined (CONFIG_8260_PCI9) #define readb(addr) in_8((volatile u8 *)(addr)) @@ -260,6 +259,7 @@ extern __inline__ unsigned int name(unsigned int port) \ { \ unsigned int x; \ __asm__ __volatile__( \ + "sync\n" \ "0:" op " %0,0,%1\n" \ "1: twi 0,%0,0\n" \ "2: isync\n" \ @@ -285,6 +285,7 @@ extern __inline__ unsigned int name(unsigned int port) \ extern __inline__ void name(unsigned int val, unsigned int port) \ { \ __asm__ __volatile__( \ + "sync\n" \ "0:" op " %0,0,%1\n" \ "1: sync\n" \ "2:\n" \ diff --git a/include/asm-ppc/machdep.h b/include/asm-ppc/machdep.h index e1a0a7b21..da7746738 100644 --- a/include/asm-ppc/machdep.h +++ b/include/asm-ppc/machdep.h @@ -2,7 +2,6 @@ #ifndef _PPC_MACHDEP_H #define _PPC_MACHDEP_H -#include #include #include diff --git a/include/asm-ppc/mmu.h b/include/asm-ppc/mmu.h index 9205db404..14584e505 100644 --- a/include/asm-ppc/mmu.h +++ b/include/asm-ppc/mmu.h @@ -6,7 +6,6 @@ #ifndef _PPC_MMU_H_ #define _PPC_MMU_H_ -#include #ifndef __ASSEMBLY__ @@ -24,25 +23,18 @@ extern phys_addr_t fixup_bigphys_addr(phys_addr_t, phys_addr_t); #define PHYS_FMT "%16Lx" #endif -/* Default "unsigned long" context */ -typedef unsigned long mm_context_t; +typedef struct { + unsigned long id; + unsigned long vdso_base; +} mm_context_t; /* Hardware Page Table Entry */ typedef struct _PTE { -#ifdef CONFIG_PPC64BRIDGE - unsigned long long vsid:52; - unsigned long api:5; - unsigned long :5; - unsigned long h:1; - unsigned long v:1; - unsigned long long rpn:52; -#else /* CONFIG_PPC64BRIDGE */ unsigned long v:1; /* Entry is valid */ unsigned long vsid:24; /* Virtual segment identifier */ unsigned long h:1; /* Hash algorithm indicator */ unsigned long api:6; /* Abbreviated page index */ unsigned long rpn:20; /* Real (physical) page number */ -#endif /* CONFIG_PPC64BRIDGE */ unsigned long :3; /* Unused */ unsigned long r:1; /* Referenced */ unsigned long c:1; /* Changed */ @@ -83,11 +75,7 @@ typedef struct _P601_BATU { /* Upper part of BAT for 601 processor */ } P601_BATU; typedef struct _BATU { /* Upper part of BAT (all except 601) */ -#ifdef CONFIG_PPC64BRIDGE - unsigned long long bepi:47; -#else /* CONFIG_PPC64BRIDGE */ unsigned long bepi:15; /* Effective page index (virtual address) */ -#endif /* CONFIG_PPC64BRIDGE */ unsigned long :4; /* Unused */ unsigned long bl:11; /* Block size mask */ unsigned long vs:1; /* Supervisor valid */ @@ -102,11 +90,7 @@ typedef struct _P601_BATL { /* Lower part of BAT for 601 processor */ } P601_BATL; typedef struct _BATL { /* Lower part of BAT (all except 601) */ -#ifdef CONFIG_PPC64BRIDGE - unsigned long long brpn:47; -#else /* CONFIG_PPC64BRIDGE */ unsigned long brpn:15; /* Real page index (physical address) */ -#endif /* CONFIG_PPC64BRIDGE */ unsigned long :10; /* Unused */ unsigned long w:1; /* Write-thru cache */ unsigned long i:1; /* Cache inhibit */ diff --git a/include/asm-ppc/mmu_context.h b/include/asm-ppc/mmu_context.h index 4f152cca1..2bc8589cc 100644 --- a/include/asm-ppc/mmu_context.h +++ b/include/asm-ppc/mmu_context.h @@ -2,7 +2,6 @@ #ifndef __PPC_MMU_CONTEXT_H #define __PPC_MMU_CONTEXT_H -#include #include #include #include @@ -71,7 +70,7 @@ static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk) #else /* PPC 6xx, 7xx CPUs */ -#define NO_CONTEXT ((mm_context_t) -1) +#define NO_CONTEXT ((unsigned long) -1) #define LAST_CONTEXT 32767 #define FIRST_CONTEXT 1 #endif @@ -86,7 +85,7 @@ static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk) * can be used for debugging on all processors (if you happen to have * an Abatron). */ -extern void set_context(mm_context_t context, pgd_t *pgd); +extern void set_context(unsigned long contextid, pgd_t *pgd); /* * Bitmap of contexts in use. @@ -99,7 +98,7 @@ extern unsigned long context_map[]; * Its use is an optimization only, we can't rely on this context * number to be free, but it usually will be. */ -extern mm_context_t next_mmu_context; +extern unsigned long next_mmu_context; /* * If we don't have sufficient contexts to give one to every task @@ -118,9 +117,9 @@ extern void steal_context(void); */ static inline void get_mmu_context(struct mm_struct *mm) { - mm_context_t ctx; + unsigned long ctx; - if (mm->context != NO_CONTEXT) + if (mm->context.id != NO_CONTEXT) return; #ifdef FEW_CONTEXTS while (atomic_dec_if_positive(&nr_free_contexts) < 0) @@ -133,7 +132,7 @@ static inline void get_mmu_context(struct mm_struct *mm) ctx = 0; } next_mmu_context = (ctx + 1) & LAST_CONTEXT; - mm->context = ctx; + mm->context.id = ctx; #ifdef FEW_CONTEXTS context_mm[ctx] = mm; #endif @@ -142,7 +141,12 @@ static inline void get_mmu_context(struct mm_struct *mm) /* * Set up the context for a new address space. */ -#define init_new_context(tsk,mm) (((mm)->context = NO_CONTEXT), 0) +static inline int init_new_context(struct task_struct *t, struct mm_struct *mm) +{ + mm->context.id = NO_CONTEXT; + mm->context.vdso_base = 0; + return 0; +} /* * We're finished using the context for an address space. @@ -150,9 +154,9 @@ static inline void get_mmu_context(struct mm_struct *mm) static inline void destroy_context(struct mm_struct *mm) { preempt_disable(); - if (mm->context != NO_CONTEXT) { - clear_bit(mm->context, context_map); - mm->context = NO_CONTEXT; + if (mm->context.id != NO_CONTEXT) { + clear_bit(mm->context.id, context_map); + mm->context.id = NO_CONTEXT; #ifdef FEW_CONTEXTS atomic_inc(&nr_free_contexts); #endif @@ -180,7 +184,7 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, /* Setup new userspace context */ get_mmu_context(next); - set_context(next->context, next->pgd); + set_context(next->context.id, next->pgd); } #define deactivate_mm(tsk,mm) do { } while (0) diff --git a/include/asm-ppc/mpc8260.h b/include/asm-ppc/mpc8260.h index 6ba69a86b..23579d4af 100644 --- a/include/asm-ppc/mpc8260.h +++ b/include/asm-ppc/mpc8260.h @@ -8,7 +8,6 @@ #ifndef __ASM_PPC_MPC8260_H__ #define __ASM_PPC_MPC8260_H__ -#include #ifdef CONFIG_8260 @@ -83,6 +82,7 @@ enum ppc_sys_devices { MPC82xx_CPM_SMC2, MPC82xx_CPM_USB, MPC82xx_SEC1, + MPC82xx_MDIO_BB, NUM_PPC_SYS_DEVS, }; diff --git a/include/asm-ppc/mpc83xx.h b/include/asm-ppc/mpc83xx.h index bb1b0576c..02ed2c325 100644 --- a/include/asm-ppc/mpc83xx.h +++ b/include/asm-ppc/mpc83xx.h @@ -3,7 +3,7 @@ * * MPC83xx definitions * - * Maintainer: Kumar Gala + * Maintainer: Kumar Gala * * Copyright 2005 Freescale Semiconductor, Inc * @@ -17,7 +17,6 @@ #ifndef __ASM_MPC83xx_H__ #define __ASM_MPC83xx_H__ -#include #include #ifdef CONFIG_83xx @@ -107,6 +106,8 @@ enum ppc_sys_devices { MPC83xx_SEC2, MPC83xx_USB2_DR, MPC83xx_USB2_MPH, + MPC83xx_MDIO, + NUM_PPC_SYS_DEVS, }; #endif /* CONFIG_83xx */ diff --git a/include/asm-ppc/mpc85xx.h b/include/asm-ppc/mpc85xx.h index 22713e331..9b4851199 100644 --- a/include/asm-ppc/mpc85xx.h +++ b/include/asm-ppc/mpc85xx.h @@ -3,7 +3,7 @@ * * MPC85xx definitions * - * Maintainer: Kumar Gala + * Maintainer: Kumar Gala * * Copyright 2004 Freescale Semiconductor, Inc * @@ -17,7 +17,6 @@ #ifndef __ASM_MPC85xx_H__ #define __ASM_MPC85xx_H__ -#include #include #ifdef CONFIG_85xx @@ -25,9 +24,12 @@ #ifdef CONFIG_MPC8540_ADS #include #endif -#ifdef CONFIG_MPC8555_CDS +#if defined(CONFIG_MPC8555_CDS) || defined(CONFIG_MPC8548_CDS) #include #endif +#ifdef CONFIG_MPC85xx_CDS +#include +#endif #ifdef CONFIG_MPC8560_ADS #include #endif @@ -37,6 +39,10 @@ #ifdef CONFIG_STX_GP3 #include #endif +#if defined(CONFIG_TQM8540) || defined(CONFIG_TQM8541) || \ + defined(CONFIG_TQM8555) || defined(CONFIG_TQM8560) +#include +#endif #define _IO_BASE isa_io_base #define _ISA_MEM_BASE isa_mem_base @@ -67,6 +73,8 @@ extern unsigned char __res[]; #define MPC85xx_DMA3_SIZE (0x00080) #define MPC85xx_ENET1_OFFSET (0x24000) #define MPC85xx_ENET1_SIZE (0x01000) +#define MPC85xx_MIIM_OFFSET (0x24520) +#define MPC85xx_MIIM_SIZE (0x00018) #define MPC85xx_ENET2_OFFSET (0x25000) #define MPC85xx_ENET2_SIZE (0x01000) #define MPC85xx_ENET3_OFFSET (0x26000) @@ -74,7 +82,7 @@ extern unsigned char __res[]; #define MPC85xx_GUTS_OFFSET (0xe0000) #define MPC85xx_GUTS_SIZE (0x01000) #define MPC85xx_IIC1_OFFSET (0x03000) -#define MPC85xx_IIC1_SIZE (0x01000) +#define MPC85xx_IIC1_SIZE (0x00100) #define MPC85xx_OPENPIC_OFFSET (0x40000) #define MPC85xx_OPENPIC_SIZE (0x40000) #define MPC85xx_PCI1_OFFSET (0x08000) @@ -127,8 +135,66 @@ enum ppc_sys_devices { MPC85xx_CPM_MCC2, MPC85xx_CPM_SMC1, MPC85xx_CPM_SMC2, + MPC85xx_eTSEC1, + MPC85xx_eTSEC2, + MPC85xx_eTSEC3, + MPC85xx_eTSEC4, + MPC85xx_IIC2, + MPC85xx_MDIO, + NUM_PPC_SYS_DEVS, }; +/* Internal interrupts are all Level Sensitive, and Positive Polarity */ +#define MPC85XX_INTERNAL_IRQ_SENSES \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 0 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 1 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 2 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 3 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 4 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 5 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 6 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 7 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 8 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 9 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 10 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 11 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 12 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 13 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 14 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 15 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 16 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 17 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 18 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 19 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 20 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 21 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 22 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 23 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 24 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 25 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 26 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 27 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 28 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 29 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 30 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 31 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 32 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 33 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 34 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 35 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 36 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 37 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 38 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 39 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 40 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 41 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 42 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 43 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 44 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 45 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* Internal 46 */ \ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE) /* Internal 47 */ + #endif /* CONFIG_85xx */ #endif /* __ASM_MPC85xx_H__ */ #endif /* __KERNEL__ */ diff --git a/include/asm-ppc/mpc8xx.h b/include/asm-ppc/mpc8xx.h index 3515a7fa6..d3a2f2fe2 100644 --- a/include/asm-ppc/mpc8xx.h +++ b/include/asm-ppc/mpc8xx.h @@ -8,7 +8,6 @@ #ifndef __CONFIG_8xx_DEFS #define __CONFIG_8xx_DEFS -#include #ifdef CONFIG_8xx @@ -111,6 +110,7 @@ enum ppc_sys_devices { MPC8xx_CPM_SMC1, MPC8xx_CPM_SMC2, MPC8xx_CPM_USB, + MPC8xx_MDIO_FEC, NUM_PPC_SYS_DEVS, }; diff --git a/include/asm-ppc/mv64x60.h b/include/asm-ppc/mv64x60.h index 4f2405b83..663edbee3 100644 --- a/include/asm-ppc/mv64x60.h +++ b/include/asm-ppc/mv64x60.h @@ -17,7 +17,6 @@ #include #include #include -#include #include #include diff --git a/include/asm-ppc/ocp.h b/include/asm-ppc/ocp.h index 983116f59..16dbc7d17 100644 --- a/include/asm-ppc/ocp.h +++ b/include/asm-ppc/ocp.h @@ -26,8 +26,6 @@ #include #include -#include -#include #include #include diff --git a/include/asm-ppc/open_pic.h b/include/asm-ppc/open_pic.h index ec2f46629..a4fe962d9 100644 --- a/include/asm-ppc/open_pic.h +++ b/include/asm-ppc/open_pic.h @@ -12,7 +12,6 @@ #ifndef _PPC_KERNEL_OPEN_PIC_H #define _PPC_KERNEL_OPEN_PIC_H -#include #include #define OPENPIC_SIZE 0x40000 diff --git a/include/asm-ppc/page.h b/include/asm-ppc/page.h index a3cf8f5da..dc57e41c6 100644 --- a/include/asm-ppc/page.h +++ b/include/asm-ppc/page.h @@ -1,7 +1,6 @@ #ifndef _PPC_PAGE_H #define _PPC_PAGE_H -#include #include /* PAGE_SHIFT determines the page size */ @@ -15,7 +14,6 @@ #define PAGE_MASK (~((1 << PAGE_SHIFT) - 1)) #ifdef __KERNEL__ -#include /* This must match what is in arch/ppc/Makefile */ #define PAGE_OFFSET CONFIG_KERNEL_START @@ -172,7 +170,7 @@ extern __inline__ int get_order(unsigned long size) #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \ VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) -/* We do define AT_SYSINFO_EHDR but don't use the gate mecanism */ +/* We do define AT_SYSINFO_EHDR but don't use the gate mechanism */ #define __HAVE_ARCH_GATE_AREA 1 #define devmem_is_allowed(x) 1 diff --git a/include/asm-ppc/pc_serial.h b/include/asm-ppc/pc_serial.h index 8f994f9f8..81a2d0fda 100644 --- a/include/asm-ppc/pc_serial.h +++ b/include/asm-ppc/pc_serial.h @@ -9,7 +9,6 @@ * anyone using any of those on a PPC platform. -- paulus */ -#include /* * This assumes you have a 1.8432 MHz clock for your UART. diff --git a/include/asm-ppc/pci.h b/include/asm-ppc/pci.h index 61434edba..11ffaaa5d 100644 --- a/include/asm-ppc/pci.h +++ b/include/asm-ppc/pci.h @@ -133,7 +133,7 @@ extern pgprot_t pci_phys_mem_access_prot(struct file *file, #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); + resource_size_t *start, resource_size_t *end); #endif /* __KERNEL__ */ diff --git a/include/asm-ppc/pgalloc.h b/include/asm-ppc/pgalloc.h index 48ae247d9..d880c2703 100644 --- a/include/asm-ppc/pgalloc.h +++ b/include/asm-ppc/pgalloc.h @@ -2,7 +2,6 @@ #ifndef _PPC_PGALLOC_H #define _PPC_PGALLOC_H -#include #include extern void __bad_pte(pmd_t *pmd); diff --git a/include/asm-ppc/pgtable.h b/include/asm-ppc/pgtable.h index 570b35516..51fa7c662 100644 --- a/include/asm-ppc/pgtable.h +++ b/include/asm-ppc/pgtable.h @@ -4,7 +4,6 @@ #include -#include #ifndef __ASSEMBLY__ #include @@ -663,7 +662,7 @@ static inline int __ptep_test_and_clear_young(unsigned int context, unsigned lon return (old & _PAGE_ACCESSED) != 0; } #define ptep_test_and_clear_young(__vma, __addr, __ptep) \ - __ptep_test_and_clear_young((__vma)->vm_mm->context, __addr, __ptep) + __ptep_test_and_clear_young((__vma)->vm_mm->context.id, __addr, __ptep) #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY static inline int ptep_test_and_clear_dirty(struct vm_area_struct *vma, diff --git a/include/asm-ppc/ppc4xx_dma.h b/include/asm-ppc/ppc4xx_dma.h index 8636cdbf6..935d1e053 100644 --- a/include/asm-ppc/ppc4xx_dma.h +++ b/include/asm-ppc/ppc4xx_dma.h @@ -24,7 +24,6 @@ #ifndef __ASMPPC_PPC4xx_DMA_H #define __ASMPPC_PPC4xx_DMA_H -#include #include #include #include @@ -33,9 +32,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 @@ -285,7 +281,7 @@ typedef uint32_t sgl_handle_t; #define GET_DMA_POLARITY(chan) (DMAReq_ActiveLow(chan) | DMAAck_ActiveLow(chan) | EOT_ActiveLow(chan)) -#elif defined(CONFIG_STBXXX_DMA) /* stb03xxx */ +#elif defined(CONFIG_STB03xxx) /* stb03xxx */ #define DMA_PPC4xx_SIZE 4096 diff --git a/include/asm-ppc/ppc4xx_pic.h b/include/asm-ppc/ppc4xx_pic.h index c16c7f81c..e44261206 100644 --- a/include/asm-ppc/ppc4xx_pic.h +++ b/include/asm-ppc/ppc4xx_pic.h @@ -17,7 +17,6 @@ #ifndef __PPC4XX_PIC_H__ #define __PPC4XX_PIC_H__ -#include #include #include diff --git a/include/asm-ppc/serial.h b/include/asm-ppc/serial.h index b74af5461..8a59f8871 100644 --- a/include/asm-ppc/serial.h +++ b/include/asm-ppc/serial.h @@ -6,7 +6,6 @@ #ifndef __ASM_SERIAL_H__ #define __ASM_SERIAL_H__ -#include #if defined(CONFIG_EV64260) #include diff --git a/include/asm-ppc/smp.h b/include/asm-ppc/smp.h index 30e9268a8..0b7fa8958 100644 --- a/include/asm-ppc/smp.h +++ b/include/asm-ppc/smp.h @@ -10,7 +10,6 @@ #ifndef _PPC_SMP_H #define _PPC_SMP_H -#include #include #include #include diff --git a/include/asm-ppc/system.h b/include/asm-ppc/system.h index fb49c0c49..738943584 100644 --- a/include/asm-ppc/system.h +++ b/include/asm-ppc/system.h @@ -33,7 +33,6 @@ #define read_barrier_depends() do { } while(0) #define set_mb(var, value) do { var = value; mb(); } while (0) -#define set_wmb(var, value) do { var = value; wmb(); } while (0) #ifdef CONFIG_SMP #define smp_mb() mb() diff --git a/include/asm-ppc/time.h b/include/asm-ppc/time.h index c86112323..f7eadf6ac 100644 --- a/include/asm-ppc/time.h +++ b/include/asm-ppc/time.h @@ -9,7 +9,6 @@ #ifndef __ASM_TIME_H__ #define __ASM_TIME_H__ -#include #include #include #include diff --git a/include/asm-s390/bitops.h b/include/asm-s390/bitops.h index ca092ffb7..0ddcdba79 100644 --- a/include/asm-s390/bitops.h +++ b/include/asm-s390/bitops.h @@ -12,7 +12,9 @@ * Copyright (C) 1992, Linus Torvalds * */ -#include + +#ifdef __KERNEL__ + #include /* @@ -51,19 +53,6 @@ * with operation of the form "set_bit(bitnr, flags)". */ -/* set ALIGN_CS to 1 if the SMP safe bit operations should - * align the address to 4 byte boundary. It seems to work - * without the alignment. - */ -#ifdef __KERNEL__ -#define ALIGN_CS 0 -#else -#define ALIGN_CS 1 -#ifndef CONFIG_SMP -#error "bitops won't work without CONFIG_SMP" -#endif -#endif - /* bitmap tables from arch/S390/kernel/bitmap.S */ extern const char _oi_bitmap[]; extern const char _ni_bitmap[]; @@ -122,10 +111,6 @@ static inline void set_bit_cs(unsigned long nr, volatile unsigned long *ptr) unsigned long addr, old, new, mask; addr = (unsigned long) ptr; -#if ALIGN_CS == 1 - nr += (addr & __BITOPS_ALIGN) << 3; /* add alignment to bit number */ - addr ^= addr & __BITOPS_ALIGN; /* align address to 8 */ -#endif /* calculate address for CS */ addr += (nr ^ (nr & (__BITOPS_WORDSIZE - 1))) >> 3; /* make OR mask */ @@ -142,10 +127,6 @@ static inline void clear_bit_cs(unsigned long nr, volatile unsigned long *ptr) unsigned long addr, old, new, mask; addr = (unsigned long) ptr; -#if ALIGN_CS == 1 - nr += (addr & __BITOPS_ALIGN) << 3; /* add alignment to bit number */ - addr ^= addr & __BITOPS_ALIGN; /* align address to 8 */ -#endif /* calculate address for CS */ addr += (nr ^ (nr & (__BITOPS_WORDSIZE - 1))) >> 3; /* make AND mask */ @@ -162,10 +143,6 @@ static inline void change_bit_cs(unsigned long nr, volatile unsigned long *ptr) unsigned long addr, old, new, mask; addr = (unsigned long) ptr; -#if ALIGN_CS == 1 - nr += (addr & __BITOPS_ALIGN) << 3; /* add alignment to bit number */ - addr ^= addr & __BITOPS_ALIGN; /* align address to 8 */ -#endif /* calculate address for CS */ addr += (nr ^ (nr & (__BITOPS_WORDSIZE - 1))) >> 3; /* make XOR mask */ @@ -183,10 +160,6 @@ test_and_set_bit_cs(unsigned long nr, volatile unsigned long *ptr) unsigned long addr, old, new, mask; addr = (unsigned long) ptr; -#if ALIGN_CS == 1 - nr += (addr & __BITOPS_ALIGN) << 3; /* add alignment to bit number */ - addr ^= addr & __BITOPS_ALIGN; /* align address to 8 */ -#endif /* calculate address for CS */ addr += (nr ^ (nr & (__BITOPS_WORDSIZE - 1))) >> 3; /* make OR/test mask */ @@ -206,10 +179,6 @@ test_and_clear_bit_cs(unsigned long nr, volatile unsigned long *ptr) unsigned long addr, old, new, mask; addr = (unsigned long) ptr; -#if ALIGN_CS == 1 - nr += (addr & __BITOPS_ALIGN) << 3; /* add alignment to bit number */ - addr ^= addr & __BITOPS_ALIGN; /* align address to 8 */ -#endif /* calculate address for CS */ addr += (nr ^ (nr & (__BITOPS_WORDSIZE - 1))) >> 3; /* make AND/test mask */ @@ -229,10 +198,6 @@ test_and_change_bit_cs(unsigned long nr, volatile unsigned long *ptr) unsigned long addr, old, new, mask; addr = (unsigned long) ptr; -#if ALIGN_CS == 1 - nr += (addr & __BITOPS_ALIGN) << 3; /* add alignment to bit number */ - addr ^= addr & __BITOPS_ALIGN; /* align address to 8 */ -#endif /* calculate address for CS */ addr += (nr ^ (nr & (__BITOPS_WORDSIZE - 1))) >> 3; /* make XOR/test mask */ @@ -835,8 +800,6 @@ static inline int sched_find_first_bit(unsigned long *b) #include -#ifdef __KERNEL__ - /* * ATTENTION: intel byte ordering convention for ext2 and minix !! * bit 0 is the LSB of addr; bit 31 is the MSB of addr; diff --git a/include/asm-s390/bug.h b/include/asm-s390/bug.h index 7ddaa05b9..876898363 100644 --- a/include/asm-s390/bug.h +++ b/include/asm-s390/bug.h @@ -5,9 +5,18 @@ #ifdef CONFIG_BUG +static inline __attribute__((noreturn)) void __do_illegal_op(void) +{ +#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) + __builtin_trap(); +#else + asm volatile(".long 0"); +#endif +} + #define BUG() do { \ printk("kernel BUG at %s:%d!\n", __FILE__, __LINE__); \ - __builtin_trap(); \ + __do_illegal_op(); \ } while (0) #define HAVE_ARCH_BUG diff --git a/include/asm-s390/ccwdev.h b/include/asm-s390/ccwdev.h index 12456cb2f..58c70acff 100644 --- a/include/asm-s390/ccwdev.h +++ b/include/asm-s390/ccwdev.h @@ -63,7 +63,7 @@ ccw_device_id_match(const struct ccw_device_id *array, return id; } - return 0; + return NULL; } /* The struct ccw device is our replacement for the globally accessible diff --git a/include/asm-s390/cio.h b/include/asm-s390/cio.h index 089cf567c..28fdd6e2b 100644 --- a/include/asm-s390/cio.h +++ b/include/asm-s390/cio.h @@ -276,6 +276,10 @@ extern void wait_cons_dev(void); extern void clear_all_subchannels(void); +extern void cio_reset_channel_paths(void); + +extern void css_schedule_reprobe(void); + #endif #endif diff --git a/include/asm-s390/cmb.h b/include/asm-s390/cmb.h index dae1dd4fb..241756f80 100644 --- a/include/asm-s390/cmb.h +++ b/include/asm-s390/cmb.h @@ -44,10 +44,6 @@ struct cmbdata { #define BIODASDCMFENABLE _IO(DASD_IOCTL_LETTER,32) /* enable channel measurement */ #define BIODASDCMFDISABLE _IO(DASD_IOCTL_LETTER,33) -/* reset channel measurement block */ -#define BIODASDRESETCMB _IO(DASD_IOCTL_LETTER,34) -/* read channel measurement data */ -#define BIODASDREADCMB _IOWR(DASD_IOCTL_LETTER,32,u64) /* read channel measurement data */ #define BIODASDREADALLCMB _IOWR(DASD_IOCTL_LETTER,33,struct cmbdata) diff --git a/include/asm-s390/dasd.h b/include/asm-s390/dasd.h index 1630c26e8..c042f9578 100644 --- a/include/asm-s390/dasd.h +++ b/include/asm-s390/dasd.h @@ -68,10 +68,12 @@ typedef struct dasd_information2_t { * 0x00: default features * 0x01: readonly (ro) * 0x02: use diag discipline (diag) + * 0x04: set the device initially online (internal use only) */ -#define DASD_FEATURE_DEFAULT 0 -#define DASD_FEATURE_READONLY 1 -#define DASD_FEATURE_USEDIAG 2 +#define DASD_FEATURE_DEFAULT 0x00 +#define DASD_FEATURE_READONLY 0x01 +#define DASD_FEATURE_USEDIAG 0x02 +#define DASD_FEATURE_INITIAL_ONLINE 0x04 #define DASD_PARTN_BITS 2 diff --git a/include/asm-s390/debug.h b/include/asm-s390/debug.h index 23450ed4b..c00dd2b3d 100644 --- a/include/asm-s390/debug.h +++ b/include/asm-s390/debug.h @@ -9,9 +9,7 @@ #ifndef DEBUG_H #define DEBUG_H -#include #include -#include /* Note: * struct __debug_entry must be defined outside of #ifdef __KERNEL__ @@ -36,6 +34,7 @@ struct __debug_entry{ #define __DEBUG_FEATURE_VERSION 2 /* version of debug feature */ #ifdef __KERNEL__ +#include #include #include #include diff --git a/include/asm-s390/div64.h b/include/asm-s390/div64.h index af098dc3c..6cd978cef 100644 --- a/include/asm-s390/div64.h +++ b/include/asm-s390/div64.h @@ -1,49 +1 @@ -#ifndef __S390_DIV64 -#define __S390_DIV64 - -#ifndef __s390x__ - -/* for do_div "base" needs to be smaller than 2^31-1 */ -#define do_div(n, base) ({ \ - unsigned long long __n = (n); \ - unsigned long __r; \ - \ - asm (" slr 0,0\n" \ - " l 1,%1\n" \ - " srdl 0,1\n" \ - " dr 0,%2\n" \ - " alr 1,1\n" \ - " alr 0,0\n" \ - " lhi 2,1\n" \ - " n 2,%1\n" \ - " alr 0,2\n" \ - " clr 0,%2\n" \ - " jl 0f\n" \ - " slr 0,%2\n" \ - " ahi 1,1\n" \ - "0: st 1,%1\n" \ - " l 1,4+%1\n" \ - " srdl 0,1\n" \ - " dr 0,%2\n" \ - " alr 1,1\n" \ - " alr 0,0\n" \ - " lhi 2,1\n" \ - " n 2,4+%1\n" \ - " alr 0,2\n" \ - " clr 0,%2\n" \ - " jl 1f\n" \ - " slr 0,%2\n" \ - " ahi 1,1\n" \ - "1: st 1,4+%1\n" \ - " lr %0,0" \ - : "=d" (__r), "=m" (__n) \ - : "d" (base), "m" (__n) : "0", "1", "2", "cc" ); \ - (n) = (__n); \ - __r; \ -}) - -#else /* __s390x__ */ #include -#endif /* __s390x__ */ - -#endif diff --git a/include/asm-s390/elf.h b/include/asm-s390/elf.h index 710646e64..c0d629d61 100644 --- a/include/asm-s390/elf.h +++ b/include/asm-s390/elf.h @@ -92,19 +92,6 @@ /* Keep this the last entry. */ #define R_390_NUM 61 -/* - * ELF register definitions.. - */ - -#include /* for task_struct */ -#include -#include -#include /* for save_access_regs */ - - -typedef s390_fp_regs elf_fpregset_t; -typedef s390_regs elf_gregset_t; - /* * These are used to set parameters in the core dumps. */ @@ -116,6 +103,20 @@ typedef s390_regs elf_gregset_t; #define ELF_DATA ELFDATA2MSB #define ELF_ARCH EM_S390 +/* + * ELF register definitions.. + */ + +#include +#include + +typedef s390_fp_regs elf_fpregset_t; +typedef s390_regs elf_gregset_t; + +#ifdef __KERNEL__ +#include /* for task_struct */ +#include /* for save_access_regs */ + /* * This is used to ensure we don't load something for the wrong architecture. */ @@ -198,7 +199,6 @@ static inline int dump_task_fpu(struct task_struct *tsk, elf_fpregset_t *fpregs) #define ELF_PLATFORM (NULL) -#ifdef __KERNEL__ #ifndef __s390x__ #define SET_PERSONALITY(ex, ibcs2) set_personality((ibcs2)?PER_SVR4:PER_LINUX) #else /* __s390x__ */ diff --git a/include/asm-s390/hardirq.h b/include/asm-s390/hardirq.h index 6792c559a..e84b7ef54 100644 --- a/include/asm-s390/hardirq.h +++ b/include/asm-s390/hardirq.h @@ -12,7 +12,6 @@ #ifndef __ASM_HARDIRQ_H #define __ASM_HARDIRQ_H -#include #include #include #include diff --git a/include/asm-s390/idals.h b/include/asm-s390/idals.h index 8038858b8..e82c10efe 100644 --- a/include/asm-s390/idals.h +++ b/include/asm-s390/idals.h @@ -13,7 +13,6 @@ #ifndef _S390_IDALS_H #define _S390_IDALS_H -#include #include #include #include diff --git a/include/asm-s390/io.h b/include/asm-s390/io.h index b05825dd1..d4614b35f 100644 --- a/include/asm-s390/io.h +++ b/include/asm-s390/io.h @@ -86,20 +86,25 @@ extern void iounmap(void *addr); #define readb(addr) (*(volatile unsigned char *) __io_virt(addr)) #define readw(addr) (*(volatile unsigned short *) __io_virt(addr)) #define readl(addr) (*(volatile unsigned int *) __io_virt(addr)) +#define readq(addr) (*(volatile unsigned long long *) __io_virt(addr)) #define readb_relaxed(addr) readb(addr) #define readw_relaxed(addr) readw(addr) #define readl_relaxed(addr) readl(addr) +#define readq_relaxed(addr) readq(addr) #define __raw_readb readb #define __raw_readw readw #define __raw_readl readl +#define __raw_readq readq #define writeb(b,addr) (*(volatile unsigned char *) __io_virt(addr) = (b)) #define writew(b,addr) (*(volatile unsigned short *) __io_virt(addr) = (b)) #define writel(b,addr) (*(volatile unsigned int *) __io_virt(addr) = (b)) +#define writeq(b,addr) (*(volatile unsigned long long *) __io_virt(addr) = (b)) #define __raw_writeb writeb #define __raw_writew writew #define __raw_writel writel +#define __raw_writeq writeq #define memset_io(a,b,c) memset(__io_virt(a),(b),(c)) #define memcpy_fromio(a,b,c) memcpy((a),__io_virt(b),(c)) diff --git a/include/asm-s390/irq.h b/include/asm-s390/irq.h index 916a1aa0b..bd1a721f7 100644 --- a/include/asm-s390/irq.h +++ b/include/asm-s390/irq.h @@ -21,10 +21,6 @@ enum interruption_class { #define touch_nmi_watchdog() do { } while(0) -struct irqaction; -struct pt_regs; -int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *); - #endif /* __KERNEL__ */ #endif diff --git a/include/asm-s390/local.h b/include/asm-s390/local.h index cf8189009..86745a1b2 100644 --- a/include/asm-s390/local.h +++ b/include/asm-s390/local.h @@ -1,7 +1,6 @@ #ifndef _ASM_LOCAL_H #define _ASM_LOCAL_H -#include #include #include diff --git a/include/asm-s390/lowcore.h b/include/asm-s390/lowcore.h index bea727904..596c8b172 100644 --- a/include/asm-s390/lowcore.h +++ b/include/asm-s390/lowcore.h @@ -124,7 +124,6 @@ #ifndef __ASSEMBLY__ -#include #include #include #include diff --git a/include/asm-s390/page.h b/include/asm-s390/page.h index 3ecd741a6..b59fea4e2 100644 --- a/include/asm-s390/page.h +++ b/include/asm-s390/page.h @@ -9,7 +9,6 @@ #ifndef _S390_PAGE_H #define _S390_PAGE_H -#include #include /* PAGE_SHIFT determines the page size */ @@ -20,6 +19,7 @@ #define PAGE_DEFAULT_KEY (PAGE_DEFAULT_ACC << 4) #ifdef __KERNEL__ +#include #ifndef __ASSEMBLY__ #ifndef __s390x__ @@ -189,11 +189,11 @@ page_get_storage_key(unsigned long addr) #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \ VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) +#include +#include + #define devmem_is_allowed(x) 1 #endif /* __KERNEL__ */ -#include -#include - #endif /* _S390_PAGE_H */ diff --git a/include/asm-s390/percpu.h b/include/asm-s390/percpu.h index 436d21660..28b3517e7 100644 --- a/include/asm-s390/percpu.h +++ b/include/asm-s390/percpu.h @@ -40,7 +40,9 @@ extern unsigned long __per_cpu_offset[NR_CPUS]; __typeof__(type) per_cpu__##name #define __get_cpu_var(var) __reloc_hide(var,S390_lowcore.percpu_offset) +#define __raw_get_cpu_var(var) __reloc_hide(var,S390_lowcore.percpu_offset) #define per_cpu(var,cpu) __reloc_hide(var,__per_cpu_offset[cpu]) +#define per_cpu_offset(x) (__per_cpu_offset[x]) /* A macro to avoid #include hell... */ #define percpu_modcopy(pcpudst, src, size) \ @@ -57,6 +59,7 @@ do { \ __typeof__(type) per_cpu__##name #define __get_cpu_var(var) __reloc_hide(var,0) +#define __raw_get_cpu_var(var) __reloc_hide(var,0) #define per_cpu(var,cpu) __reloc_hide(var,0) #endif /* SMP */ diff --git a/include/asm-s390/pgalloc.h b/include/asm-s390/pgalloc.h index 0259469cc..808c15e6d 100644 --- a/include/asm-s390/pgalloc.h +++ b/include/asm-s390/pgalloc.h @@ -13,7 +13,6 @@ #ifndef _S390_PGALLOC_H #define _S390_PGALLOC_H -#include #include #include #include @@ -147,7 +146,7 @@ pte_alloc_one(struct mm_struct *mm, unsigned long vmaddr) pte_t *pte = pte_alloc_one_kernel(mm, vmaddr); if (pte) return virt_to_page(pte); - return 0; + return NULL; } static inline void pte_free_kernel(pte_t *pte) diff --git a/include/asm-s390/pgtable.h b/include/asm-s390/pgtable.h index 859b5e969..24312387f 100644 --- a/include/asm-s390/pgtable.h +++ b/include/asm-s390/pgtable.h @@ -657,13 +657,6 @@ static inline pte_t mk_pte_phys(unsigned long physpage, pgprot_t pgprot) __pte; \ }) -#define SetPageUptodate(_page) \ - do { \ - struct page *__page = (_page); \ - if (!test_and_set_bit(PG_uptodate, &__page->flags)) \ - page_test_and_clear_dirty(_page); \ - } while (0) - #ifdef __s390x__ #define pfn_pmd(pfn, pgprot) \ diff --git a/include/asm-s390/posix_types.h b/include/asm-s390/posix_types.h index 61788de3c..b94c98856 100644 --- a/include/asm-s390/posix_types.h +++ b/include/asm-s390/posix_types.h @@ -76,24 +76,36 @@ typedef struct { } __kernel_fsid_t; -#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) - -#ifndef _S390_BITOPS_H -#include -#endif - -#undef __FD_SET -#define __FD_SET(fd,fdsetp) set_bit((fd),(fdsetp)->fds_bits) - -#undef __FD_CLR -#define __FD_CLR(fd,fdsetp) clear_bit((fd),(fdsetp)->fds_bits) - -#undef __FD_ISSET -#define __FD_ISSET(fd,fdsetp) test_bit((fd),(fdsetp)->fds_bits) +#ifdef __KERNEL__ + +#undef __FD_SET +static inline void __FD_SET(unsigned long fd, __kernel_fd_set *fdsetp) +{ + unsigned long _tmp = fd / __NFDBITS; + unsigned long _rem = fd % __NFDBITS; + fdsetp->fds_bits[_tmp] |= (1UL<<_rem); +} + +#undef __FD_CLR +static inline void __FD_CLR(unsigned long fd, __kernel_fd_set *fdsetp) +{ + unsigned long _tmp = fd / __NFDBITS; + unsigned long _rem = fd % __NFDBITS; + fdsetp->fds_bits[_tmp] &= ~(1UL<<_rem); +} + +#undef __FD_ISSET +static inline int __FD_ISSET(unsigned long fd, const __kernel_fd_set *fdsetp) +{ + unsigned long _tmp = fd / __NFDBITS; + unsigned long _rem = fd % __NFDBITS; + return (fdsetp->fds_bits[_tmp] & (1UL<<_rem)) != 0; +} #undef __FD_ZERO -#define __FD_ZERO(fdsetp) (memset ((fdsetp), 0, sizeof(*(fd_set *)(fdsetp)))) +#define __FD_ZERO(fdsetp) \ + ((void) memset ((__ptr_t) (fdsetp), 0, sizeof (__kernel_fd_set))) -#endif /* defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2)*/ +#endif /* __KERNEL__ */ #endif diff --git a/include/asm-s390/processor.h b/include/asm-s390/processor.h index c5cbc4bd8..5b71d3731 100644 --- a/include/asm-s390/processor.h +++ b/include/asm-s390/processor.h @@ -199,15 +199,13 @@ unsigned long get_wchan(struct task_struct *p); /* * Give up the time slice of the virtual PU. */ -#ifndef __s390x__ -# define cpu_relax() asm volatile ("diag 0,0,68" : : : "memory") -#else /* __s390x__ */ -# define cpu_relax() \ - do { \ - if (MACHINE_HAS_DIAG44) \ - asm volatile ("diag 0,0,68" : : : "memory"); \ - } while (0) -#endif /* __s390x__ */ +static inline void cpu_relax(void) +{ + if (MACHINE_HAS_DIAG44) + asm volatile ("diag 0,0,68" : : : "memory"); + else + barrier(); +} /* * Set PSW to specified value. diff --git a/include/asm-s390/ptrace.h b/include/asm-s390/ptrace.h index a949cc077..4d75d77b0 100644 --- a/include/asm-s390/ptrace.h +++ b/include/asm-s390/ptrace.h @@ -181,11 +181,8 @@ #define PTRACE_OLDSETOPTIONS 21 #ifndef __ASSEMBLY__ -#include #include #include -#include -#include typedef union { @@ -301,6 +298,9 @@ typedef struct } s390_regs; #ifdef __KERNEL__ +#include +#include + /* * The pt_regs struct defines the way the registers are stored on * the stack during a system call. diff --git a/include/asm-s390/rwsem.h b/include/asm-s390/rwsem.h index 0422a085d..13ec16965 100644 --- a/include/asm-s390/rwsem.h +++ b/include/asm-s390/rwsem.h @@ -61,6 +61,9 @@ struct rw_semaphore { signed long count; spinlock_t wait_lock; struct list_head wait_list; +#ifdef CONFIG_DEBUG_LOCK_ALLOC + struct lockdep_map dep_map; +#endif }; #ifndef __s390x__ @@ -80,8 +83,16 @@ struct rw_semaphore { /* * initialisation */ + +#ifdef CONFIG_DEBUG_LOCK_ALLOC +# define __RWSEM_DEP_MAP_INIT(lockname) , .dep_map = { .name = #lockname } +#else +# define __RWSEM_DEP_MAP_INIT(lockname) +#endif + #define __RWSEM_INITIALIZER(name) \ -{ RWSEM_UNLOCKED_VALUE, SPIN_LOCK_UNLOCKED, LIST_HEAD_INIT((name).wait_list) } +{ RWSEM_UNLOCKED_VALUE, SPIN_LOCK_UNLOCKED, LIST_HEAD_INIT((name).wait_list) \ + __RWSEM_DEP_MAP_INIT(name) } #define DECLARE_RWSEM(name) \ struct rw_semaphore name = __RWSEM_INITIALIZER(name) @@ -93,6 +104,17 @@ static inline void init_rwsem(struct rw_semaphore *sem) INIT_LIST_HEAD(&sem->wait_list); } +extern void __init_rwsem(struct rw_semaphore *sem, const char *name, + struct lock_class_key *key); + +#define init_rwsem(sem) \ +do { \ + static struct lock_class_key __key; \ + \ + __init_rwsem((sem), #sem, &__key); \ +} while (0) + + /* * lock for reading */ @@ -155,7 +177,7 @@ static inline int __down_read_trylock(struct rw_semaphore *sem) /* * lock for writing */ -static inline void __down_write(struct rw_semaphore *sem) +static inline void __down_write_nested(struct rw_semaphore *sem, int subclass) { signed long old, new, tmp; @@ -181,6 +203,11 @@ static inline void __down_write(struct rw_semaphore *sem) rwsem_down_write_failed(sem); } +static inline void __down_write(struct rw_semaphore *sem) +{ + __down_write_nested(sem, 0); +} + /* * trylock for writing -- returns 1 if successful, 0 if contention */ diff --git a/include/asm-s390/semaphore.h b/include/asm-s390/semaphore.h index 702cf4366..32cdc69f3 100644 --- a/include/asm-s390/semaphore.h +++ b/include/asm-s390/semaphore.h @@ -37,7 +37,8 @@ struct semaphore { static inline void sema_init (struct semaphore *sem, int val) { - *sem = (struct semaphore) __SEMAPHORE_INITIALIZER((*sem),val); + atomic_set(&sem->count, val); + init_waitqueue_head(&sem->wait); } static inline void init_MUTEX (struct semaphore *sem) diff --git a/include/asm-s390/setup.h b/include/asm-s390/setup.h index da3fd4a7b..19e319793 100644 --- a/include/asm-s390/setup.h +++ b/include/asm-s390/setup.h @@ -40,15 +40,16 @@ extern unsigned long machine_flags; #define MACHINE_IS_VM (machine_flags & 1) #define MACHINE_IS_P390 (machine_flags & 4) #define MACHINE_HAS_MVPG (machine_flags & 16) -#define MACHINE_HAS_DIAG44 (machine_flags & 32) #define MACHINE_HAS_IDTE (machine_flags & 128) #ifndef __s390x__ #define MACHINE_HAS_IEEE (machine_flags & 2) #define MACHINE_HAS_CSP (machine_flags & 8) +#define MACHINE_HAS_DIAG44 (1) #else /* __s390x__ */ #define MACHINE_HAS_IEEE (1) #define MACHINE_HAS_CSP (1) +#define MACHINE_HAS_DIAG44 (machine_flags & 32) #endif /* __s390x__ */ diff --git a/include/asm-s390/sfp-machine.h b/include/asm-s390/sfp-machine.h index 3c79b5384..de69dfa46 100644 --- a/include/asm-s390/sfp-machine.h +++ b/include/asm-s390/sfp-machine.h @@ -25,7 +25,6 @@ #ifndef _SFP_MACHINE_H #define _SFP_MACHINE_H -#include #define _FP_W_TYPE_SIZE 32 #define _FP_W_TYPE unsigned long diff --git a/include/asm-s390/signal.h b/include/asm-s390/signal.h index 7084626de..f6cfddb27 100644 --- a/include/asm-s390/signal.h +++ b/include/asm-s390/signal.h @@ -84,7 +84,6 @@ typedef unsigned long sigset_t; * SA_FLAGS values: * * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. * SA_RESETHAND clears the handler when the signal is delivered. @@ -104,7 +103,6 @@ typedef unsigned long sigset_t; #define SA_NOMASK SA_NODEFER #define SA_ONESHOT SA_RESETHAND -#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ #define SA_RESTORER 0x04000000 diff --git a/include/asm-s390/smp.h b/include/asm-s390/smp.h index 444dae591..657646054 100644 --- a/include/asm-s390/smp.h +++ b/include/asm-s390/smp.h @@ -10,7 +10,6 @@ #ifndef __ASM_SMP_H #define __ASM_SMP_H -#include #include #include #include diff --git a/include/asm-s390/socket.h b/include/asm-s390/socket.h index 15a5298c8..1778a49a7 100644 --- a/include/asm-s390/socket.h +++ b/include/asm-s390/socket.h @@ -56,5 +56,6 @@ #define SO_ACCEPTCONN 30 #define SO_PEERSEC 31 +#define SO_PASSSEC 34 #endif /* _ASM_SOCKET_H */ diff --git a/include/asm-s390/system.h b/include/asm-s390/system.h index 6a89dbb03..16040048c 100644 --- a/include/asm-s390/system.h +++ b/include/asm-s390/system.h @@ -11,7 +11,6 @@ #ifndef __ASM_SYSTEM_H #define __ASM_SYSTEM_H -#include #include #include #include @@ -129,8 +128,13 @@ extern void account_system_vtime(struct task_struct *); #define nop() __asm__ __volatile__ ("nop") -#define xchg(ptr,x) \ - ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(void *)(ptr),sizeof(*(ptr)))) +#define xchg(ptr,x) \ +({ \ + __typeof__(*(ptr)) __ret; \ + __ret = (__typeof__(*(ptr))) \ + __xchg((unsigned long)(x), (void *)(ptr),sizeof(*(ptr))); \ + __ret; \ +}) static inline unsigned long __xchg(unsigned long x, void * ptr, int size) { @@ -300,35 +304,6 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size) #define set_mb(var, value) do { var = value; mb(); } while (0) -#define set_wmb(var, value) do { var = value; wmb(); } while (0) - -/* interrupt control.. */ -#define local_irq_enable() ({ \ - unsigned long __dummy; \ - __asm__ __volatile__ ( \ - "stosm 0(%1),0x03" \ - : "=m" (__dummy) : "a" (&__dummy) : "memory" ); \ - }) - -#define local_irq_disable() ({ \ - unsigned long __flags; \ - __asm__ __volatile__ ( \ - "stnsm 0(%1),0xfc" : "=m" (__flags) : "a" (&__flags) ); \ - __flags; \ - }) - -#define local_save_flags(x) \ - __asm__ __volatile__("stosm 0(%1),0" : "=m" (x) : "a" (&x), "m" (x) ) - -#define local_irq_restore(x) \ - __asm__ __volatile__("ssm 0(%0)" : : "a" (&x), "m" (x) : "memory") - -#define irqs_disabled() \ -({ \ - unsigned long flags; \ - local_save_flags(flags); \ - !((flags >> __FLAG_SHIFT) & 3); \ -}) #ifdef __s390x__ @@ -443,8 +418,7 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size) }) #endif /* __s390x__ */ -/* For spinlocks etc */ -#define local_irq_save(x) ((x) = local_irq_disable()) +#include /* * Use to set psw mask except for the first byte which @@ -483,4 +457,3 @@ extern void (*_machine_power_off)(void); #endif /* __KERNEL__ */ #endif - diff --git a/include/asm-s390/thread_info.h b/include/asm-s390/thread_info.h index 8e0c7ed73..0a518915b 100644 --- a/include/asm-s390/thread_info.h +++ b/include/asm-s390/thread_info.h @@ -63,6 +63,7 @@ struct thread_info { .exec_domain = &default_exec_domain, \ .flags = 0, \ .cpu = 0, \ + .preempt_count = 1, \ .restart_block = { \ .fn = do_no_restart_syscall, \ }, \ diff --git a/include/asm-s390/timex.h b/include/asm-s390/timex.h index 4848057da..5d0332a4c 100644 --- a/include/asm-s390/timex.h +++ b/include/asm-s390/timex.h @@ -19,7 +19,7 @@ static inline cycles_t get_cycles(void) { cycles_t cycles; - __asm__("stck 0(%1)" : "=m" (cycles) : "a" (&cycles) : "cc"); + __asm__ __volatile__ ("stck 0(%1)" : "=m" (cycles) : "a" (&cycles) : "cc"); return cycles >> 2; } @@ -27,7 +27,7 @@ static inline unsigned long long get_clock (void) { unsigned long long clk; - __asm__("stck 0(%1)" : "=m" (clk) : "a" (&clk) : "cc"); + __asm__ __volatile__ ("stck 0(%1)" : "=m" (clk) : "a" (&clk) : "cc"); return clk; } diff --git a/include/asm-s390/tlbflush.h b/include/asm-s390/tlbflush.h index 1bb73b0e6..73cd85beb 100644 --- a/include/asm-s390/tlbflush.h +++ b/include/asm-s390/tlbflush.h @@ -1,7 +1,6 @@ #ifndef _S390_TLBFLUSH_H #define _S390_TLBFLUSH_H -#include #include #include diff --git a/include/asm-s390/types.h b/include/asm-s390/types.h index 5738ad635..ae2951cc8 100644 --- a/include/asm-s390/types.h +++ b/include/asm-s390/types.h @@ -58,7 +58,6 @@ typedef __signed__ long saddr_t; #ifndef __ASSEMBLY__ -#include typedef signed char s8; typedef unsigned char u8; diff --git a/include/asm-s390/unistd.h b/include/asm-s390/unistd.h index 78e34a8eb..e15cf988e 100644 --- a/include/asm-s390/unistd.h +++ b/include/asm-s390/unistd.h @@ -392,11 +392,11 @@ #endif -/* user-visible error numbers are in the range -1 - -122: see */ +#ifdef __KERNEL__ #define __syscall_return(type, res) \ do { \ - if ((unsigned long)(res) >= (unsigned long)(-125)) { \ + if ((unsigned long)(res) >= (unsigned long)(-4095)) {\ errno = -(res); \ res = -1; \ } \ @@ -546,7 +546,6 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ __syscall_return(type,__res); \ } -#ifdef __KERNEL__ #define __ARCH_WANT_IPC_PARSE_VERSION #define __ARCH_WANT_OLD_READDIR #define __ARCH_WANT_SYS_ALARM @@ -573,11 +572,9 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ # define __ARCH_WANT_COMPAT_SYS_TIME # define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND # endif -#endif #ifdef __KERNEL_SYSCALLS__ -#include #include #include #include @@ -625,7 +622,7 @@ asmlinkage long sys_rt_sigaction(int sig, struct sigaction __user *oact, size_t sigsetsize); -#endif +#endif /* __KERNEL_SYSCALLS__ */ /* * "Conditional" syscalls @@ -635,4 +632,5 @@ asmlinkage long sys_rt_sigaction(int sig, */ #define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") +#endif /* __KERNEL__ */ #endif /* _ASM_S390_UNISTD_H_ */ diff --git a/include/asm-s390/vtoc.h b/include/asm-s390/vtoc.h index d1de5b7eb..3a5267d90 100644 --- a/include/asm-s390/vtoc.h +++ b/include/asm-s390/vtoc.h @@ -177,27 +177,27 @@ struct vtoc_format7_label } __attribute__ ((packed)); struct vtoc_cms_label { - u8 label_id[4]; /* Label identifier */ - u8 vol_id[6]; /* Volid */ - u16 version_id; /* Version identifier */ - u32 block_size; /* Disk block size */ - u32 origin_ptr; /* Disk origin pointer */ - u32 usable_count; /* Number of usable cylinders/blocks */ - u32 formatted_count; /* Maximum number of formatted cylinders/ + __u8 label_id[4]; /* Label identifier */ + __u8 vol_id[6]; /* Volid */ + __u16 version_id; /* Version identifier */ + __u32 block_size; /* Disk block size */ + __u32 origin_ptr; /* Disk origin pointer */ + __u32 usable_count; /* Number of usable cylinders/blocks */ + __u32 formatted_count; /* Maximum number of formatted cylinders/ * blocks */ - u32 block_count; /* Disk size in CMS blocks */ - u32 used_count; /* Number of CMS blocks in use */ - u32 fst_size; /* File Status Table (FST) size */ - u32 fst_count; /* Number of FSTs per CMS block */ - u8 format_date[6]; /* Disk FORMAT date */ - u8 reserved1[2]; - u32 disk_offset; /* Disk offset when reserved*/ - u32 map_block; /* Allocation Map Block with next hole */ - u32 hblk_disp; /* Displacement into HBLK data of next hole */ - u32 user_disp; /* Displacement into user part of Allocation + __u32 block_count; /* Disk size in CMS blocks */ + __u32 used_count; /* Number of CMS blocks in use */ + __u32 fst_size; /* File Status Table (FST) size */ + __u32 fst_count; /* Number of FSTs per CMS block */ + __u8 format_date[6]; /* Disk FORMAT date */ + __u8 reserved1[2]; + __u32 disk_offset; /* Disk offset when reserved*/ + __u32 map_block; /* Allocation Map Block with next hole */ + __u32 hblk_disp; /* Displacement into HBLK data of next hole */ + __u32 user_disp; /* Displacement into user part of Allocation * map */ - u8 reserved2[4]; - u8 segment_name[8]; /* Name of shared segment */ + __u8 reserved2[4]; + __u8 segment_name[8]; /* Name of shared segment */ } __attribute__ ((packed)); #endif /* _ASM_S390_VTOC_H */ diff --git a/include/asm-sh/bug.h b/include/asm-sh/bug.h index 70508a360..1b4fc52a5 100644 --- a/include/asm-sh/bug.h +++ b/include/asm-sh/bug.h @@ -1,7 +1,6 @@ #ifndef __ASM_SH_BUG_H #define __ASM_SH_BUG_H -#include #ifdef CONFIG_BUG /* diff --git a/include/asm-sh/checksum.h b/include/asm-sh/checksum.h index 5ebd0f242..fa03b30c4 100644 --- a/include/asm-sh/checksum.h +++ b/include/asm-sh/checksum.h @@ -9,7 +9,6 @@ * Copyright (C) 1999 by Kaz Kojima & Niibe Yutaka */ -#include #include /* diff --git a/include/asm-sh/dma-mapping.h b/include/asm-sh/dma-mapping.h index 48f1f42c5..124968f98 100644 --- a/include/asm-sh/dma-mapping.h +++ b/include/asm-sh/dma-mapping.h @@ -1,7 +1,6 @@ #ifndef __ASM_SH_DMA_MAPPING_H #define __ASM_SH_DMA_MAPPING_H -#include #include #include #include diff --git a/include/asm-sh/dma.h b/include/asm-sh/dma.h index a118a0d43..e62a6d0ed 100644 --- a/include/asm-sh/dma.h +++ b/include/asm-sh/dma.h @@ -11,7 +11,6 @@ #define __ASM_SH_DMA_H #ifdef __KERNEL__ -#include #include #include #include diff --git a/include/asm-sh/fixmap.h b/include/asm-sh/fixmap.h index 509224bdb..412bccaa0 100644 --- a/include/asm-sh/fixmap.h +++ b/include/asm-sh/fixmap.h @@ -13,7 +13,6 @@ #ifndef _ASM_FIXMAP_H #define _ASM_FIXMAP_H -#include #include #include #ifdef CONFIG_HIGHMEM diff --git a/include/asm-sh/floppy.h b/include/asm-sh/floppy.h index 38d7a2942..dc1ad464f 100644 --- a/include/asm-sh/floppy.h +++ b/include/asm-sh/floppy.h @@ -146,13 +146,11 @@ static int vdma_get_dma_residue(unsigned int dummy) static int fd_request_irq(void) { if(can_use_virtual_dma) - return request_irq(FLOPPY_IRQ, floppy_hardint,SA_INTERRUPT, - "floppy", NULL); + return request_irq(FLOPPY_IRQ, floppy_hardint, + IRQF_DISABLED, "floppy", NULL); else return request_irq(FLOPPY_IRQ, floppy_interrupt, - SA_INTERRUPT|SA_SAMPLE_RANDOM, - "floppy", NULL); - + IRQF_DISABLED, "floppy", NULL); } static unsigned long dma_mem_alloc(unsigned long size) diff --git a/include/asm-sh/hardirq.h b/include/asm-sh/hardirq.h index f2fdf0f76..715ee237f 100644 --- a/include/asm-sh/hardirq.h +++ b/include/asm-sh/hardirq.h @@ -1,7 +1,6 @@ #ifndef __ASM_SH_HARDIRQ_H #define __ASM_SH_HARDIRQ_H -#include #include #include diff --git a/include/asm-sh/hd64461/hd64461.h b/include/asm-sh/hd64461/hd64461.h index c457ca277..87f13d24c 100644 --- a/include/asm-sh/hd64461/hd64461.h +++ b/include/asm-sh/hd64461/hd64461.h @@ -5,7 +5,6 @@ * Copyright (C) 2000 YAEGASHI Takeshi * Hitachi HD64461 companion chip support */ -#include /* Constants for PCMCIA mappings */ #define HD64461_PCC_WINDOW 0x01000000 diff --git a/include/asm-sh/hd64465/hd64465.h b/include/asm-sh/hd64465/hd64465.h index c672032b7..cfd0e803d 100644 --- a/include/asm-sh/hd64465/hd64465.h +++ b/include/asm-sh/hd64465/hd64465.h @@ -11,7 +11,6 @@ * Derived from which bore the message: * Copyright (C) 2000 YAEGASHI Takeshi */ -#include #include #include diff --git a/include/asm-sh/hw_irq.h b/include/asm-sh/hw_irq.h index 1d934fb2c..fed266169 100644 --- a/include/asm-sh/hw_irq.h +++ b/include/asm-sh/hw_irq.h @@ -1,9 +1,4 @@ #ifndef __ASM_SH_HW_IRQ_H #define __ASM_SH_HW_IRQ_H -static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) -{ - /* Nothing to do */ -} - #endif /* __ASM_SH_HW_IRQ_H */ diff --git a/include/asm-sh/ide.h b/include/asm-sh/ide.h index 711dad4cb..9f8e9142d 100644 --- a/include/asm-sh/ide.h +++ b/include/asm-sh/ide.h @@ -14,7 +14,6 @@ #ifdef __KERNEL__ -#include #define ide_default_io_ctl(base) (0) diff --git a/include/asm-sh/io.h b/include/asm-sh/io.h index 2c3afe713..894e64b2d 100644 --- a/include/asm-sh/io.h +++ b/include/asm-sh/io.h @@ -23,7 +23,6 @@ * inb by default expands to _inb, but the machine specific code may * define it to __inb if it chooses. */ -#include #include #include #include diff --git a/include/asm-sh/irq.h b/include/asm-sh/irq.h index 42b8394c0..611e67cd0 100644 --- a/include/asm-sh/irq.h +++ b/include/asm-sh/irq.h @@ -11,7 +11,6 @@ * */ -#include #include #include /* for pt_regs */ diff --git a/include/asm-sh/keyboard.h b/include/asm-sh/keyboard.h index 1103df003..31dcc4fa5 100644 --- a/include/asm-sh/keyboard.h +++ b/include/asm-sh/keyboard.h @@ -5,7 +5,6 @@ */ #include -#include #include #ifdef CONFIG_SH_MPC1211 diff --git a/include/asm-sh/kmap_types.h b/include/asm-sh/kmap_types.h index 2492ba071..84d565c69 100644 --- a/include/asm-sh/kmap_types.h +++ b/include/asm-sh/kmap_types.h @@ -3,7 +3,6 @@ /* Dummy header just to define km_type. */ -#include #ifdef CONFIG_DEBUG_HIGHMEM # define D(n) __KM_FENCE_##n , diff --git a/include/asm-sh/machvec.h b/include/asm-sh/machvec.h index 550c50a73..550501fa4 100644 --- a/include/asm-sh/machvec.h +++ b/include/asm-sh/machvec.h @@ -10,7 +10,6 @@ #ifndef _ASM_SH_MACHVEC_H #define _ASM_SH_MACHVEC_H 1 -#include #include #include diff --git a/include/asm-sh/machvec_init.h b/include/asm-sh/machvec_init.h index 9e7de808f..e397798eb 100644 --- a/include/asm-sh/machvec_init.h +++ b/include/asm-sh/machvec_init.h @@ -12,7 +12,6 @@ #ifndef __SH_MACHVEC_INIT_H #define __SH_MACHVEC_INIT_H -#include /* * In a GENERIC kernel, we have lots of these vectors floating about, diff --git a/include/asm-sh/mpc1211/dma.h b/include/asm-sh/mpc1211/dma.h index 0a2fdab3e..e506d1aaa 100644 --- a/include/asm-sh/mpc1211/dma.h +++ b/include/asm-sh/mpc1211/dma.h @@ -8,7 +8,6 @@ #ifndef _ASM_MPC1211_DMA_H #define _ASM_MPC1211_DMA_H -#include #include /* And spinlocks */ #include /* need byte IO */ #include diff --git a/include/asm-sh/mpc1211/keyboard.h b/include/asm-sh/mpc1211/keyboard.h index 5f0b9088c..71ef4cf42 100644 --- a/include/asm-sh/mpc1211/keyboard.h +++ b/include/asm-sh/mpc1211/keyboard.h @@ -57,7 +57,7 @@ extern unsigned char pckbd_sysrq_xlate[128]; #define AUX_IRQ 12 #define aux_request_irq(hand, dev_id) \ - request_irq(AUX_IRQ, hand, SA_SHIRQ, "PS2 Mouse", dev_id) + request_irq(AUX_IRQ, hand, IRQF_SHARED, "PS2 Mouse", dev_id) #define aux_free_irq(dev_id) free_irq(AUX_IRQ, dev_id) diff --git a/include/asm-sh/overdrive/overdrive.h b/include/asm-sh/overdrive/overdrive.h index aa62ae68c..fc746c244 100644 --- a/include/asm-sh/overdrive/overdrive.h +++ b/include/asm-sh/overdrive/overdrive.h @@ -6,7 +6,6 @@ * */ -#include #ifndef __OVERDRIVE_H__ #define __OVERDRIVE_H__ diff --git a/include/asm-sh/page.h b/include/asm-sh/page.h index 5eb8e6d9e..cba9f7d2a 100644 --- a/include/asm-sh/page.h +++ b/include/asm-sh/page.h @@ -13,7 +13,6 @@ [ P4 control ] 0xE0000000 */ -#include /* PAGE_SHIFT determines the page size */ #define PAGE_SHIFT 12 @@ -105,7 +104,7 @@ typedef struct { unsigned long pgprot; } pgprot_t; /* PFN start number, because of __MEMORY_START */ #define PFN_START (__MEMORY_START >> PAGE_SHIFT) -#define ARCH_PFN_OFFSET (FPN_START) +#define ARCH_PFN_OFFSET (PFN_START) #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) #define pfn_valid(pfn) (((pfn) - PFN_START) < max_mapnr) #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) @@ -113,11 +112,10 @@ typedef struct { unsigned long pgprot; } pgprot_t; #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \ VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) -#define devmem_is_allowed(x) 1 - -#endif /* __KERNEL__ */ - #include #include +#define devmem_is_allowed(x) 1 + +#endif /* __KERNEL__ */ #endif /* __ASM_SH_PAGE_H */ diff --git a/include/asm-sh/pgtable.h b/include/asm-sh/pgtable.h index bb0efb31a..dcd23a036 100644 --- a/include/asm-sh/pgtable.h +++ b/include/asm-sh/pgtable.h @@ -8,7 +8,6 @@ * Copyright (C) 2002, 2003, 2004 Paul Mundt */ -#include #include /* diff --git a/include/asm-sh/processor.h b/include/asm-sh/processor.h index fa5bd2d88..eeb0f48bb 100644 --- a/include/asm-sh/processor.h +++ b/include/asm-sh/processor.h @@ -9,6 +9,7 @@ #define __ASM_SH_PROCESSOR_H #ifdef __KERNEL__ +#include #include #include #include @@ -263,7 +264,7 @@ extern unsigned long get_wchan(struct task_struct *p); #define KSTK_ESP(tsk) ((tsk)->thread.sp) #define cpu_sleep() __asm__ __volatile__ ("sleep" : : : "memory") -#define cpu_relax() do { } while (0) +#define cpu_relax() barrier() #endif /* __KERNEL__ */ #endif /* __ASM_SH_PROCESSOR_H */ diff --git a/include/asm-sh/ptrace.h b/include/asm-sh/ptrace.h index 792fc35bd..ed358a376 100644 --- a/include/asm-sh/ptrace.h +++ b/include/asm-sh/ptrace.h @@ -1,8 +1,6 @@ #ifndef __ASM_SH_PTRACE_H #define __ASM_SH_PTRACE_H -#include - /* * Copyright (C) 1999, 2000 Niibe Yutaka * diff --git a/include/asm-sh/rwsem.h b/include/asm-sh/rwsem.h index 0262d3d1e..9d2aea5e8 100644 --- a/include/asm-sh/rwsem.h +++ b/include/asm-sh/rwsem.h @@ -25,24 +25,11 @@ struct rw_semaphore { #define RWSEM_ACTIVE_WRITE_BIAS (RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS) spinlock_t wait_lock; struct list_head wait_list; -#if RWSEM_DEBUG - int debug; -#endif }; -/* - * initialisation - */ -#if RWSEM_DEBUG -#define __RWSEM_DEBUG_INIT , 0 -#else -#define __RWSEM_DEBUG_INIT /* */ -#endif - #define __RWSEM_INITIALIZER(name) \ { RWSEM_UNLOCKED_VALUE, SPIN_LOCK_UNLOCKED, \ - LIST_HEAD_INIT((name).wait_list) \ - __RWSEM_DEBUG_INIT } + LIST_HEAD_INIT((name).wait_list) } #define DECLARE_RWSEM(name) \ struct rw_semaphore name = __RWSEM_INITIALIZER(name) @@ -57,9 +44,6 @@ static inline void init_rwsem(struct rw_semaphore *sem) sem->count = RWSEM_UNLOCKED_VALUE; spin_lock_init(&sem->wait_lock); INIT_LIST_HEAD(&sem->wait_list); -#if RWSEM_DEBUG - sem->debug = 0; -#endif } /* diff --git a/include/asm-sh/serial.h b/include/asm-sh/serial.h index f51e232d5..8734590d2 100644 --- a/include/asm-sh/serial.h +++ b/include/asm-sh/serial.h @@ -7,7 +7,6 @@ #ifndef _ASM_SERIAL_H #define _ASM_SERIAL_H -#include #include #ifdef CONFIG_SH_EC3104 diff --git a/include/asm-sh/signal.h b/include/asm-sh/signal.h index d6e8eb0e6..5c5c1e852 100644 --- a/include/asm-sh/signal.h +++ b/include/asm-sh/signal.h @@ -75,7 +75,6 @@ typedef unsigned long sigset_t; * SA_FLAGS values: * * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. * SA_RESETHAND clears the handler when the signal is delivered. @@ -95,7 +94,6 @@ typedef unsigned long sigset_t; #define SA_NOMASK SA_NODEFER #define SA_ONESHOT SA_RESETHAND -#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ #define SA_RESTORER 0x04000000 diff --git a/include/asm-sh/smp.h b/include/asm-sh/smp.h index f19a8b3b6..f57c4fe96 100644 --- a/include/asm-sh/smp.h +++ b/include/asm-sh/smp.h @@ -10,7 +10,6 @@ #ifndef __ASM_SH_SMP_H #define __ASM_SH_SMP_H -#include #include #include diff --git a/include/asm-sh/socket.h b/include/asm-sh/socket.h index 553904ff9..ca70362eb 100644 --- a/include/asm-sh/socket.h +++ b/include/asm-sh/socket.h @@ -48,5 +48,6 @@ #define SO_ACCEPTCONN 30 #define SO_PEERSEC 31 +#define SO_PASSSEC 34 #endif /* __ASM_SH_SOCKET_H */ diff --git a/include/asm-sh/system.h b/include/asm-sh/system.h index bb0330499..ad35ad495 100644 --- a/include/asm-sh/system.h +++ b/include/asm-sh/system.h @@ -6,14 +6,13 @@ * Copyright (C) 2002 Paul Mundt */ -#include /* * switch_to() should switch tasks to task nr n, first */ #define switch_to(prev, next, last) do { \ - task_t *__last; \ + struct task_struct *__last; \ register unsigned long *__ts1 __asm__ ("r1") = &prev->thread.sp; \ register unsigned long *__ts2 __asm__ ("r2") = &prev->thread.pc; \ register unsigned long *__ts4 __asm__ ("r4") = (unsigned long *)prev; \ @@ -102,7 +101,6 @@ extern void __xchg_called_with_bad_pointer(void); #endif #define set_mb(var, value) do { xchg(&var, value); } while (0) -#define set_wmb(var, value) do { var = value; wmb(); } while (0) /* Interrupt Control */ static __inline__ void local_irq_enable(void) diff --git a/include/asm-sh/types.h b/include/asm-sh/types.h index 488552f43..3c09dd4ca 100644 --- a/include/asm-sh/types.h +++ b/include/asm-sh/types.h @@ -35,7 +35,6 @@ typedef unsigned long long __u64; #ifndef __ASSEMBLY__ -#include typedef __signed__ char s8; typedef unsigned char u8; diff --git a/include/asm-sh/unistd.h b/include/asm-sh/unistd.h index 05520cebd..76b5430cb 100644 --- a/include/asm-sh/unistd.h +++ b/include/asm-sh/unistd.h @@ -304,6 +304,8 @@ #define NR_syscalls 293 +#ifdef __KERNEL__ + /* user-visible error numbers are in the range -1 - -124: see */ #define __syscall_return(type, res) \ @@ -420,7 +422,6 @@ __asm__ __volatile__ ("trapa #0x16" \ __syscall_return(type,__sc0); \ } -#ifdef __KERNEL__ #define __ARCH_WANT_IPC_PARSE_VERSION #define __ARCH_WANT_OLD_READDIR #define __ARCH_WANT_OLD_STAT @@ -443,7 +444,6 @@ __syscall_return(type,__sc0); \ #define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPROCMASK #define __ARCH_WANT_SYS_RT_SIGACTION -#endif #ifdef __KERNEL_SYSCALLS__ @@ -513,7 +513,7 @@ asmlinkage long sys_rt_sigaction(int sig, struct sigaction __user *oact, size_t sigsetsize); -#endif +#endif /* __KERNEL_SYSCALLS__ */ /* * "Conditional" syscalls @@ -525,4 +525,5 @@ asmlinkage long sys_rt_sigaction(int sig, #define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") #endif +#endif /* __KERNEL__ */ #endif /* __ASM_SH_UNISTD_H */ diff --git a/include/asm-sh/watchdog.h b/include/asm-sh/watchdog.h index f0cf4be21..09ca41972 100644 --- a/include/asm-sh/watchdog.h +++ b/include/asm-sh/watchdog.h @@ -13,7 +13,6 @@ #ifdef __KERNEL__ #include -#include #include #include diff --git a/include/asm-sh64/bug.h b/include/asm-sh64/bug.h index 5d659ec28..f3a9c9248 100644 --- a/include/asm-sh64/bug.h +++ b/include/asm-sh64/bug.h @@ -1,8 +1,7 @@ #ifndef __ASM_SH64_BUG_H #define __ASM_SH64_BUG_H -#include - +#ifdef CONFIG_BUG /* * Tell the user there is some problem, then force a segfault (in process * context) or a panic (interrupt context). @@ -12,17 +11,9 @@ *(volatile int *)0 = 0; \ } while (0) -#define BUG_ON(condition) do { \ - if (unlikely((condition)!=0)) \ - BUG(); \ -} while(0) +#define HAVE_ARCH_BUG +#endif -#define WARN_ON(condition) do { \ - if (unlikely((condition)!=0)) { \ - printk("Badness in %s at %s:%d\n", __FUNCTION__, __FILE__, __LINE__); \ - dump_stack(); \ - } \ -} while (0) +#include #endif /* __ASM_SH64_BUG_H */ - diff --git a/include/asm-sh64/byteorder.h b/include/asm-sh64/byteorder.h index f602ebe33..7419d7882 100644 --- a/include/asm-sh64/byteorder.h +++ b/include/asm-sh64/byteorder.h @@ -14,7 +14,7 @@ #include -static __inline__ __const__ __u32 ___arch__swab32(__u32 x) +static inline __attribute_const__ __u32 ___arch__swab32(__u32 x) { __asm__("byterev %0, %0\n\t" "shari %0, 32, %0" @@ -23,7 +23,7 @@ static __inline__ __const__ __u32 ___arch__swab32(__u32 x) return x; } -static __inline__ __const__ __u16 ___arch__swab16(__u16 x) +static inline __attribute_const__ __u16 ___arch__swab16(__u16 x) { __asm__("byterev %0, %0\n\t" "shari %0, 48, %0" diff --git a/include/asm-sh64/dma-mapping.h b/include/asm-sh64/dma-mapping.h index b8d26fe67..68e27a8fc 100644 --- a/include/asm-sh64/dma-mapping.h +++ b/include/asm-sh64/dma-mapping.h @@ -1,7 +1,6 @@ #ifndef __ASM_SH_DMA_MAPPING_H #define __ASM_SH_DMA_MAPPING_H -#include #include #include #include @@ -25,7 +24,7 @@ static inline int dma_set_mask(struct device *dev, u64 mask) } static inline void *dma_alloc_coherent(struct device *dev, size_t size, - dma_addr_t *dma_handle, int flag) + dma_addr_t *dma_handle, gfp_t flag) { return consistent_alloc(NULL, size, dma_handle); } @@ -127,22 +126,30 @@ static inline void dma_sync_sg(struct device *dev, struct scatterlist *sg, static inline void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size, enum dma_data_direction dir) - __attribute__ ((alias("dma_sync_single"))); +{ + dma_sync_single(dev, dma_handle, size, dir); +} static inline void dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, size_t size, enum dma_data_direction dir) - __attribute__ ((alias("dma_sync_single"))); +{ + dma_sync_single(dev, dma_handle, size, dir); +} static inline void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems, enum dma_data_direction dir) - __attribute__ ((alias("dma_sync_sg"))); +{ + dma_sync_sg(dev, sg, nelems, dir); +} static inline void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems, enum dma_data_direction dir) - __attribute__ ((alias("dma_sync_sg"))); +{ + dma_sync_sg(dev, sg, nelems, dir); +} static inline int dma_get_cache_alignment(void) { diff --git a/include/asm-sh64/hardirq.h b/include/asm-sh64/hardirq.h index ad2330e41..555fd7a35 100644 --- a/include/asm-sh64/hardirq.h +++ b/include/asm-sh64/hardirq.h @@ -1,7 +1,6 @@ #ifndef __ASM_SH64_HARDIRQ_H #define __ASM_SH64_HARDIRQ_H -#include #include #include diff --git a/include/asm-sh64/hw_irq.h b/include/asm-sh64/hw_irq.h index ae718d1f2..ebb39089b 100644 --- a/include/asm-sh64/hw_irq.h +++ b/include/asm-sh64/hw_irq.h @@ -11,6 +11,5 @@ * Copyright (C) 2000, 2001 Paolo Alberelli * */ -static __inline__ void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) { /* Nothing to do */ } #endif /* __ASM_SH64_HW_IRQ_H */ diff --git a/include/asm-sh64/ide.h b/include/asm-sh64/ide.h index 6fd514daa..c9d84d5f7 100644 --- a/include/asm-sh64/ide.h +++ b/include/asm-sh64/ide.h @@ -15,11 +15,6 @@ #ifdef __KERNEL__ -#include - -#ifndef MAX_HWIFS -#define MAX_HWIFS CONFIG_IDE_MAX_HWIFS -#endif /* Without this, the initialisation of PCI IDE cards end up calling * ide_init_hwif_ports, which won't work. */ diff --git a/include/asm-sh64/io.h b/include/asm-sh64/io.h index cfafaa73b..252fedbb6 100644 --- a/include/asm-sh64/io.h +++ b/include/asm-sh64/io.h @@ -123,6 +123,13 @@ void insw(unsigned long port, void *addr, unsigned long count); void outsl(unsigned long port, const void *addr, unsigned long count); void insl(unsigned long port, void *addr, unsigned long count); +#define __raw_readb readb +#define __raw_readw readw +#define __raw_readl readl +#define __raw_writeb writeb +#define __raw_writew writew +#define __raw_writel writel + void memcpy_toio(void __iomem *to, const void *from, long count); void memcpy_fromio(void *to, void __iomem *from, long count); @@ -143,12 +150,12 @@ extern unsigned long pciio_virt; * Change virtual addresses to physical addresses and vv. * These are trivial on the 1:1 Linux/SuperH mapping */ -extern __inline__ unsigned long virt_to_phys(volatile void * address) +static inline unsigned long virt_to_phys(volatile void * address) { return __pa(address); } -extern __inline__ void * phys_to_virt(unsigned long address) +static inline void * phys_to_virt(unsigned long address) { return __va(address); } @@ -156,12 +163,12 @@ extern __inline__ void * phys_to_virt(unsigned long address) extern void * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags); -extern __inline__ void * ioremap(unsigned long phys_addr, unsigned long size) +static inline void * ioremap(unsigned long phys_addr, unsigned long size) { return __ioremap(phys_addr, size, 1); } -extern __inline__ void * ioremap_nocache (unsigned long phys_addr, unsigned long size) +static inline void * ioremap_nocache (unsigned long phys_addr, unsigned long size) { return __ioremap(phys_addr, size, 0); } diff --git a/include/asm-sh64/irq.h b/include/asm-sh64/irq.h index f815b43df..1ca49e292 100644 --- a/include/asm-sh64/irq.h +++ b/include/asm-sh64/irq.h @@ -12,7 +12,6 @@ * */ -#include /* * Encoded IRQs are not considered worth to be supported. diff --git a/include/asm-sh64/keyboard.h b/include/asm-sh64/keyboard.h index 733e2bbe7..1fab96d79 100644 --- a/include/asm-sh64/keyboard.h +++ b/include/asm-sh64/keyboard.h @@ -65,7 +65,7 @@ extern unsigned char pckbd_sysrq_xlate[128]; #endif #define aux_request_irq(hand, dev_id) \ - request_irq(AUX_IRQ, hand, SA_SHIRQ, "PS2 Mouse", dev_id) + request_irq(AUX_IRQ, hand, IRQF_SHARED, "PS2 Mouse", dev_id) #define aux_free_irq(dev_id) free_irq(AUX_IRQ, dev_id) diff --git a/include/asm-sh64/mmu_context.h b/include/asm-sh64/mmu_context.h index f062e1513..8c860dab2 100644 --- a/include/asm-sh64/mmu_context.h +++ b/include/asm-sh64/mmu_context.h @@ -26,7 +26,6 @@ */ extern unsigned long mmu_context_cache; -#include #include @@ -50,7 +49,7 @@ extern pgd_t *mmu_pdtp_cache; */ #define MMU_VPN_MASK 0xfffff000 -extern __inline__ void +static inline void get_new_mmu_context(struct mm_struct *mm) { extern void flush_tlb_all(void); diff --git a/include/asm-sh64/page.h b/include/asm-sh64/page.h index e1f7f5a41..de207a933 100644 --- a/include/asm-sh64/page.h +++ b/include/asm-sh64/page.h @@ -17,7 +17,6 @@ * */ -#include /* PAGE_SHIFT determines the page size */ #define PAGE_SHIFT 12 @@ -41,6 +40,7 @@ #define HPAGE_SIZE (1UL << HPAGE_SHIFT) #define HPAGE_MASK (~(HPAGE_SIZE-1)) #define HUGETLB_PAGE_ORDER (HPAGE_SHIFT-PAGE_SHIFT) +#define ARCH_HAS_SETCLEAR_HUGE_PTE #endif #ifdef __KERNEL__ @@ -104,9 +104,7 @@ typedef struct { unsigned long pgprot; } pgprot_t; /* PFN start number, because of __MEMORY_START */ #define PFN_START (__MEMORY_START >> PAGE_SHIFT) - -#define pfn_to_page(pfn) (mem_map + (pfn) - PFN_START) -#define page_to_pfn(page) ((unsigned long)((page) - mem_map) + PFN_START) +#define ARCH_PFN_OFFSET (PFN_START) #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) #define pfn_valid(pfn) (((pfn) - PFN_START) < max_mapnr) #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) @@ -114,24 +112,10 @@ typedef struct { unsigned long pgprot; } pgprot_t; #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \ VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) -#ifndef __ASSEMBLY__ - -/* Pure 2^n version of get_order */ -extern __inline__ int get_order(unsigned long size) -{ - int order; +#include +#include - size = (size-1) >> (PAGE_SHIFT-1); - order = -1; - do { - size >>= 1; - order++; - } while (size); - return order; -} - -#endif +#define devmem_is_allowed(x) 1 #endif /* __KERNEL__ */ - #endif /* __ASM_SH64_PAGE_H */ diff --git a/include/asm-sh64/param.h b/include/asm-sh64/param.h index d18cc87c1..f409adb41 100644 --- a/include/asm-sh64/param.h +++ b/include/asm-sh64/param.h @@ -12,7 +12,6 @@ #ifndef __ASM_SH64_PARAM_H #define __ASM_SH64_PARAM_H -#include #ifdef __KERNEL__ # ifdef CONFIG_SH_WDT diff --git a/include/asm-sh64/pgtable.h b/include/asm-sh64/pgtable.h index 525e1523e..54c782189 100644 --- a/include/asm-sh64/pgtable.h +++ b/include/asm-sh64/pgtable.h @@ -22,7 +22,8 @@ #include #include #include -#include + +struct vm_area_struct; extern void paging_init(void); @@ -419,17 +420,19 @@ static inline int pte_young(pte_t pte){ return pte_val(pte) & _PAGE_ACCESSED; } static inline int pte_file(pte_t pte) { return pte_val(pte) & _PAGE_FILE; } static inline int pte_write(pte_t pte){ return pte_val(pte) & _PAGE_WRITE; } -extern inline pte_t pte_rdprotect(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_READ)); return pte; } -extern inline pte_t pte_wrprotect(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_WRITE)); return pte; } -extern inline pte_t pte_exprotect(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_EXECUTE)); return pte; } -extern inline pte_t pte_mkclean(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_DIRTY)); return pte; } -extern inline pte_t pte_mkold(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_ACCESSED)); return pte; } +static inline pte_t pte_rdprotect(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_READ)); return pte; } +static inline pte_t pte_wrprotect(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_WRITE)); return pte; } +static inline pte_t pte_exprotect(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_EXECUTE)); return pte; } +static inline pte_t pte_mkclean(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_DIRTY)); return pte; } +static inline pte_t pte_mkold(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_ACCESSED)); return pte; } + +static inline pte_t pte_mkread(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_READ)); return pte; } +static inline pte_t pte_mkwrite(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_WRITE)); return pte; } +static inline pte_t pte_mkexec(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_EXECUTE)); return pte; } +static inline pte_t pte_mkdirty(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_DIRTY)); return pte; } +static inline pte_t pte_mkyoung(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_ACCESSED)); return pte; } +static inline pte_t pte_mkhuge(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_SZHUGE)); return pte; } -extern inline pte_t pte_mkread(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_READ)); return pte; } -extern inline pte_t pte_mkwrite(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_WRITE)); return pte; } -extern inline pte_t pte_mkexec(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_EXECUTE)); return pte; } -extern inline pte_t pte_mkdirty(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_DIRTY)); return pte; } -extern inline pte_t pte_mkyoung(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_ACCESSED)); return pte; } /* * Conversion functions: convert a page and protection to a page entry. @@ -452,12 +455,9 @@ extern inline pte_t pte_mkyoung(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | #define mk_pte_phys(physpage, pgprot) \ ({ pte_t __pte; set_pte(&__pte, __pte(physpage | pgprot_val(pgprot))); __pte; }) -extern inline pte_t pte_modify(pte_t pte, pgprot_t newprot) +static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) { set_pte(&pte, __pte((pte_val(pte) & _PAGE_CHG_MASK) | pgprot_val(newprot))); return pte; } -#define page_pte_prot(page, prot) mk_pte(page, prot) -#define page_pte(page) page_pte_prot(page, __pgprot(0)) - typedef pte_t *pte_addr_t; #define pgtable_cache_init() do { } while (0) @@ -480,9 +480,6 @@ extern void update_mmu_cache(struct vm_area_struct * vma, #define PageSkip(page) (0) #define kern_addr_valid(addr) (1) -#define io_remap_page_range(vma, vaddr, paddr, size, prot) \ - remap_pfn_range(vma, vaddr, (paddr) >> PAGE_SHIFT, size, prot) - #define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ remap_pfn_range(vma, vaddr, pfn, size, prot) diff --git a/include/asm-sh64/processor.h b/include/asm-sh64/processor.h index a51bd41e6..eb2bee4b4 100644 --- a/include/asm-sh64/processor.h +++ b/include/asm-sh64/processor.h @@ -22,6 +22,7 @@ #include #include #include +#include /* * Default implementation of macro that returns current @@ -228,7 +229,7 @@ extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); * FPU lazy state save handling. */ -extern __inline__ void release_fpu(void) +static inline void release_fpu(void) { unsigned long long __dummy; @@ -240,7 +241,7 @@ extern __inline__ void release_fpu(void) : "r" (SR_FD)); } -extern __inline__ void grab_fpu(void) +static inline void grab_fpu(void) { unsigned long long __dummy; @@ -279,7 +280,7 @@ extern unsigned long get_wchan(struct task_struct *p); #define KSTK_EIP(tsk) ((tsk)->thread.pc) #define KSTK_ESP(tsk) ((tsk)->thread.sp) -#define cpu_relax() do { } while (0) +#define cpu_relax() barrier() #endif /* __ASSEMBLY__ */ #endif /* __ASM_SH64_PROCESSOR_H */ diff --git a/include/asm-sh64/ptrace.h b/include/asm-sh64/ptrace.h index 56190f521..a6d4da519 100644 --- a/include/asm-sh64/ptrace.h +++ b/include/asm-sh64/ptrace.h @@ -28,7 +28,7 @@ struct pt_regs { #ifdef __KERNEL__ #define user_mode(regs) (((regs)->sr & 0x40000000)==0) #define instruction_pointer(regs) ((regs)->pc) -#define profile_pc(regs) instruction_pointer(regs) +#define profile_pc(regs) ((unsigned long)instruction_pointer(regs)) extern void show_regs(struct pt_regs *); #endif diff --git a/include/asm-sh64/shmparam.h b/include/asm-sh64/shmparam.h index d3a99a4dc..1bb820c83 100644 --- a/include/asm-sh64/shmparam.h +++ b/include/asm-sh64/shmparam.h @@ -2,19 +2,11 @@ #define __ASM_SH64_SHMPARAM_H /* - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - * - * include/asm-sh64/shmparam.h - * - * Copyright (C) 2000, 2001 Paolo Alberelli - * + * Set this to a sensible safe default, we'll work out the specifics for the + * align mask from the cache descriptor at run-time. */ +#define SHMLBA 0x4000 -#include - -/* attach addr a multiple of this */ -#define SHMLBA (cpu_data->dcache.sets * L1_CACHE_BYTES) +#define __ARCH_FORCE_SHMLBA #endif /* __ASM_SH64_SHMPARAM_H */ diff --git a/include/asm-sh64/signal.h b/include/asm-sh64/signal.h index 2400dc688..244e13473 100644 --- a/include/asm-sh64/signal.h +++ b/include/asm-sh64/signal.h @@ -13,7 +13,6 @@ */ #include -#include /* Avoid too many header ordering problems. */ struct siginfo; @@ -74,7 +73,6 @@ typedef struct { * SA_FLAGS values: * * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. * SA_RESETHAND clears the handler when the signal is delivered. @@ -94,7 +92,6 @@ typedef struct { #define SA_NOMASK SA_NODEFER #define SA_ONESHOT SA_RESETHAND -#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ #define SA_RESTORER 0x04000000 diff --git a/include/asm-sh64/system.h b/include/asm-sh64/system.h index 42510e496..b1598c26f 100644 --- a/include/asm-sh64/system.h +++ b/include/asm-sh64/system.h @@ -14,7 +14,6 @@ * */ -#include #include #include @@ -65,9 +64,8 @@ extern void __xchg_called_with_bad_pointer(void); #define smp_read_barrier_depends() do { } while (0) #endif /* CONFIG_SMP */ -#define set_rmb(var, value) do { xchg(&var, value); } while (0) +#define set_rmb(var, value) do { (void)xchg(&var, value); } while (0) #define set_mb(var, value) set_rmb(var, value) -#define set_wmb(var, value) do { var = value; wmb(); } while (0) /* Interrupt Control */ #ifndef HARD_CLI @@ -132,7 +130,7 @@ static __inline__ void local_irq_disable(void) (flags != 0); \ }) -extern __inline__ unsigned long xchg_u32(volatile int * m, unsigned long val) +static inline unsigned long xchg_u32(volatile int * m, unsigned long val) { unsigned long flags, retval; @@ -143,7 +141,7 @@ extern __inline__ unsigned long xchg_u32(volatile int * m, unsigned long val) return retval; } -extern __inline__ unsigned long xchg_u8(volatile unsigned char * m, unsigned long val) +static inline unsigned long xchg_u8(volatile unsigned char * m, unsigned long val) { unsigned long flags, retval; diff --git a/include/asm-sh64/uaccess.h b/include/asm-sh64/uaccess.h index a33654d57..644c67b65 100644 --- a/include/asm-sh64/uaccess.h +++ b/include/asm-sh64/uaccess.h @@ -60,12 +60,6 @@ #define access_ok(type,addr,size) (__range_ok(addr,size) == 0) #define __access_ok(addr,size) (__range_ok(addr,size) == 0) -/* this function will go away soon - use access_ok() instead */ -extern inline int __deprecated verify_area(int type, const void __user * addr, unsigned long size) -{ - return access_ok(type,addr,size) ? 0 : -EFAULT; -} - /* * Uh, these should become the main single-value transfer routines ... * They automatically use the right size if we just have the right @@ -134,25 +128,20 @@ do { \ #define __get_user_nocheck(x,ptr,size) \ ({ \ - long __gu_addr = (long)(ptr); \ - long __gu_err; \ - __typeof(*(ptr)) __gu_val; \ - __asm__ ("":"=r" (__gu_val)); \ - __asm__ ("":"=r" (__gu_err)); \ - __get_user_size((void *)&__gu_val, __gu_addr, (size), __gu_err); \ - (x) = (__typeof__(*(ptr))) __gu_val; \ + long __gu_err, __gu_val; \ + __get_user_size((void *)&__gu_val, (long)(ptr), \ + (size), __gu_err); \ + (x) = (__typeof__(*(ptr)))__gu_val; \ __gu_err; \ }) #define __get_user_check(x,ptr,size) \ ({ \ long __gu_addr = (long)(ptr); \ - long __gu_err = -EFAULT; \ - __typeof(*(ptr)) __gu_val; \ - __asm__ ("":"=r" (__gu_val)); \ - __asm__ ("":"=r" (__gu_err)); \ + long __gu_err = -EFAULT, __gu_val; \ if (__access_ok(__gu_addr, (size))) \ - __get_user_size((void *)&__gu_val, __gu_addr, (size), __gu_err); \ + __get_user_size((void *)&__gu_val, __gu_addr, \ + (size), __gu_err); \ (x) = (__typeof__(*(ptr))) __gu_val; \ __gu_err; \ }) @@ -293,7 +282,7 @@ __sfu_res = __strncpy_from_user((unsigned long) (dest), __sfu_src, __sfu_count); */ extern long __strnlen_user(const char *__s, long __n); -extern __inline__ long strnlen_user(const char *s, long n) +static inline long strnlen_user(const char *s, long n) { if (!__addr_ok(s)) return 0; diff --git a/include/asm-sh64/unistd.h b/include/asm-sh64/unistd.h index 95f0b1304..9a1590fff 100644 --- a/include/asm-sh64/unistd.h +++ b/include/asm-sh64/unistd.h @@ -333,13 +333,20 @@ #define __NR_mq_timedreceive (__NR_mq_open+3) #define __NR_mq_notify (__NR_mq_open+4) #define __NR_mq_getsetattr (__NR_mq_open+5) -#define __NR_sys_kexec_load 311 +#define __NR_kexec_load 311 #define __NR_waitid 312 #define __NR_add_key 313 #define __NR_request_key 314 #define __NR_keyctl 315 +#define __NR_ioprio_set 316 +#define __NR_ioprio_get 317 +#define __NR_inotify_init 318 +#define __NR_inotify_add_watch 319 +#define __NR_inotify_rm_watch 320 -#define NR_syscalls 316 +#ifdef __KERNEL__ + +#define NR_syscalls 321 /* user-visible error numbers are in the range -1 - -125: see */ @@ -481,7 +488,6 @@ __asm__ __volatile__ ("!dummy %0 %1 %2 %3 %4 %5 %6" \ __syscall_return(type,__sc0); \ } -#ifdef __KERNEL__ #define __ARCH_WANT_IPC_PARSE_VERSION #define __ARCH_WANT_OLD_READDIR #define __ARCH_WANT_OLD_STAT @@ -504,7 +510,6 @@ __syscall_return(type,__sc0); \ #define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPROCMASK #define __ARCH_WANT_SYS_RT_SIGACTION -#endif #ifdef __KERNEL_SYSCALLS__ @@ -545,7 +550,7 @@ static inline pid_t wait(int * wait_stat) { return waitpid(-1,wait_stat,0); } -#endif +#endif /* __KERNEL_SYSCALLS__ */ /* * "Conditional" syscalls @@ -557,4 +562,5 @@ static inline pid_t wait(int * wait_stat) #define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") #endif +#endif /* __KERNEL__ */ #endif /* __ASM_SH64_UNISTD_H */ diff --git a/include/asm-sh64/user.h b/include/asm-sh64/user.h index 8f32f39a8..eb3b33edd 100644 --- a/include/asm-sh64/user.h +++ b/include/asm-sh64/user.h @@ -13,7 +13,6 @@ */ #include -#include #include #include diff --git a/include/asm-sparc/asmmacro.h b/include/asm-sparc/asmmacro.h index 0d4b65bd2..a619a4d97 100644 --- a/include/asm-sparc/asmmacro.h +++ b/include/asm-sparc/asmmacro.h @@ -6,7 +6,6 @@ #ifndef _SPARC_ASMMACRO_H #define _SPARC_ASMMACRO_H -#include #include #include diff --git a/include/asm-sparc/atomic.h b/include/asm-sparc/atomic.h index e1033170b..731fa56e0 100644 --- a/include/asm-sparc/atomic.h +++ b/include/asm-sparc/atomic.h @@ -10,7 +10,6 @@ #ifndef __ARCH_SPARC_ATOMIC__ #define __ARCH_SPARC_ATOMIC__ -#include typedef struct { volatile int counter; } atomic_t; diff --git a/include/asm-sparc/bugs.h b/include/asm-sparc/bugs.h index e652f89e0..a0f939bee 100644 --- a/include/asm-sparc/bugs.h +++ b/include/asm-sparc/bugs.h @@ -5,7 +5,6 @@ */ #include -#include extern unsigned long loops_per_jiffy; diff --git a/include/asm-sparc/cacheflush.h b/include/asm-sparc/cacheflush.h index 490121700..fc632f811 100644 --- a/include/asm-sparc/cacheflush.h +++ b/include/asm-sparc/cacheflush.h @@ -1,7 +1,6 @@ #ifndef _SPARC_CACHEFLUSH_H #define _SPARC_CACHEFLUSH_H -#include #include /* Common for other includes */ // #include from pgalloc.h // #include from pgalloc.h diff --git a/include/asm-sparc/delay.h b/include/asm-sparc/delay.h index 7ec8e9f7a..48aa70eef 100644 --- a/include/asm-sparc/delay.h +++ b/include/asm-sparc/delay.h @@ -7,7 +7,6 @@ #ifndef __SPARC_DELAY_H #define __SPARC_DELAY_H -#include #include static inline void __delay(unsigned long loops) diff --git a/include/asm-sparc/dma-mapping.h b/include/asm-sparc/dma-mapping.h index d7c3b0f0a..6db83dc93 100644 --- a/include/asm-sparc/dma-mapping.h +++ b/include/asm-sparc/dma-mapping.h @@ -1,7 +1,6 @@ #ifndef _ASM_SPARC_DMA_MAPPING_H #define _ASM_SPARC_DMA_MAPPING_H -#include #ifdef CONFIG_PCI #include diff --git a/include/asm-sparc/dma.h b/include/asm-sparc/dma.h index 8ec206aa5..407b36144 100644 --- a/include/asm-sparc/dma.h +++ b/include/asm-sparc/dma.h @@ -7,7 +7,6 @@ #ifndef _ASM_SPARC_DMA_H #define _ASM_SPARC_DMA_H -#include #include #include diff --git a/include/asm-sparc/ebus.h b/include/asm-sparc/ebus.h index 2d6a997c5..54652887c 100644 --- a/include/asm-sparc/ebus.h +++ b/include/asm-sparc/ebus.h @@ -13,13 +13,14 @@ #include #endif #include +#include +#include struct linux_ebus_child { struct linux_ebus_child *next; struct linux_ebus_device *parent; struct linux_ebus *bus; - int prom_node; - char prom_name[64]; + struct device_node *prom_node; struct resource resource[PROMREG_MAX]; int num_addrs; unsigned int irqs[PROMINTR_MAX]; @@ -27,27 +28,27 @@ struct linux_ebus_child { }; struct linux_ebus_device { + struct of_device ofdev; struct linux_ebus_device *next; struct linux_ebus_child *children; struct linux_ebus *bus; - int prom_node; - char prom_name[64]; + struct device_node *prom_node; struct resource resource[PROMREG_MAX]; int num_addrs; unsigned int irqs[PROMINTR_MAX]; int num_irqs; }; +#define to_ebus_device(d) container_of(d, struct linux_ebus_device, ofdev.dev) struct linux_ebus { + struct of_device ofdev; struct linux_ebus *next; struct linux_ebus_device *devices; struct linux_pbm_info *parent; struct pci_dev *self; - int prom_node; - char prom_name[64]; - struct linux_prom_ebus_ranges ebus_ranges[PROMREG_MAX]; - int num_ebus_ranges; + struct device_node *prom_node; }; +#define to_ebus(d) container_of(d, struct linux_ebus, ofdev.dev) struct linux_ebus_dma { unsigned int dcsr; diff --git a/include/asm-sparc/elf.h b/include/asm-sparc/elf.h index 4a71d7c1e..83a3dd15a 100644 --- a/include/asm-sparc/elf.h +++ b/include/asm-sparc/elf.h @@ -6,7 +6,6 @@ * ELF register definitions.. */ -#include #include #ifdef __KERNEL__ diff --git a/include/asm-sparc/fixmap.h b/include/asm-sparc/fixmap.h index 9de52b4d2..f18fc0755 100644 --- a/include/asm-sparc/fixmap.h +++ b/include/asm-sparc/fixmap.h @@ -13,7 +13,6 @@ #ifndef _ASM_FIXMAP_H #define _ASM_FIXMAP_H -#include #include #include #ifdef CONFIG_HIGHMEM diff --git a/include/asm-sparc/floppy.h b/include/asm-sparc/floppy.h index 7a941b800..c53b332c8 100644 --- a/include/asm-sparc/floppy.h +++ b/include/asm-sparc/floppy.h @@ -271,7 +271,8 @@ static int sun_fd_request_irq(void) if(!once) { once = 1; - error = request_fast_irq(FLOPPY_IRQ, floppy_hardint, SA_INTERRUPT, "floppy"); + error = request_fast_irq(FLOPPY_IRQ, floppy_hardint, + IRQF_DISABLED, "floppy"); return ((error == 0) ? 0 : -1); } else return 0; } diff --git a/include/asm-sparc/hardirq.h b/include/asm-sparc/hardirq.h index 2a668c479..4f63ed8df 100644 --- a/include/asm-sparc/hardirq.h +++ b/include/asm-sparc/hardirq.h @@ -7,7 +7,6 @@ #ifndef __SPARC_HARDIRQ_H #define __SPARC_HARDIRQ_H -#include #include #include #include diff --git a/include/asm-sparc/ide.h b/include/asm-sparc/ide.h index 64d810385..a6d735a13 100644 --- a/include/asm-sparc/ide.h +++ b/include/asm-sparc/ide.h @@ -11,7 +11,6 @@ #ifdef __KERNEL__ -#include #include #include #include diff --git a/include/asm-sparc/io.h b/include/asm-sparc/io.h index a42df208d..cab0b851b 100644 --- a/include/asm-sparc/io.h +++ b/include/asm-sparc/io.h @@ -249,6 +249,22 @@ extern void __iomem *ioremap(unsigned long offset, unsigned long size); #define ioremap_nocache(X,Y) ioremap((X),(Y)) extern void iounmap(volatile void __iomem *addr); +#define ioread8(X) readb(X) +#define ioread16(X) readw(X) +#define ioread32(X) readl(X) +#define iowrite8(val,X) writeb(val,X) +#define iowrite16(val,X) writew(val,X) +#define iowrite32(val,X) writel(val,X) + +/* Create a virtual mapping cookie for an IO port range */ +extern void __iomem *ioport_map(unsigned long port, unsigned int nr); +extern void ioport_unmap(void __iomem *); + +/* Create a virtual mapping cookie for a PCI BAR (memory or IO) */ +struct pci_dev; +extern void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max); +extern void pci_iounmap(struct pci_dev *dev, void __iomem *); + /* * Bus number may be in res->flags... somewhere. */ diff --git a/include/asm-sparc/irq.h b/include/asm-sparc/irq.h index cee356b0d..3141ddfea 100644 --- a/include/asm-sparc/irq.h +++ b/include/asm-sparc/irq.h @@ -7,7 +7,6 @@ #ifndef _SPARC_IRQ_H #define _SPARC_IRQ_H -#include #include #include /* For NR_CPUS */ #include @@ -17,8 +16,6 @@ #define __irq_ino(irq) irq #define __irq_pil(irq) irq -BTFIXUPDEF_CALL(char *, __irq_itoa, unsigned int) -#define __irq_itoa(irq) BTFIXUP_CALL(__irq_itoa)(irq) #define NR_IRQS 16 @@ -184,8 +181,4 @@ extern struct sun4m_intregs *sun4m_interrupts; #define SUN4M_INT_SBUS(x) (1 << (x+7)) #define SUN4M_INT_VME(x) (1 << (x)) -struct irqaction; -struct pt_regs; -int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *); - #endif diff --git a/include/asm-sparc/mman.h b/include/asm-sparc/mman.h index 95ecab588..b7dc40bc6 100644 --- a/include/asm-sparc/mman.h +++ b/include/asm-sparc/mman.h @@ -2,12 +2,6 @@ #ifndef __SPARC_MMAN_H__ #define __SPARC_MMAN_H__ -#ifdef __KERNEL__ -#define arch_mmap_check sparc_mmap_check -int sparc_mmap_check(unsigned long addr, unsigned long len, - unsigned long flags); -#endif - #include /* SunOS'ified... */ @@ -41,4 +35,12 @@ int sparc_mmap_check(unsigned long addr, unsigned long len, #define MADV_FREE 0x5 /* (Solaris) contents can be freed */ +#ifdef __KERNEL__ +#ifndef __ASSEMBLY__ +#define arch_mmap_check sparc_mmap_check +int sparc_mmap_check(unsigned long addr, unsigned long len, + unsigned long flags); +#endif +#endif + #endif /* __SPARC_MMAN_H__ */ diff --git a/include/asm-sparc/mostek.h b/include/asm-sparc/mostek.h index 59b86bc79..bd92a78f4 100644 --- a/include/asm-sparc/mostek.h +++ b/include/asm-sparc/mostek.h @@ -9,7 +9,6 @@ #ifndef _SPARC_MOSTEK_H #define _SPARC_MOSTEK_H -#include #include #include diff --git a/include/asm-sparc/oplib.h b/include/asm-sparc/oplib.h index f283f8aaf..91691e52c 100644 --- a/include/asm-sparc/oplib.h +++ b/include/asm-sparc/oplib.h @@ -267,11 +267,6 @@ extern void prom_getstring(int node, char *prop, char *buf, int bufsize); /* Does the passed node have the given "name"? YES=1 NO=0 */ extern int prom_nodematch(int thisnode, char *name); -/* Puts in buffer a prom name in the form name@x,y or name (x for which_io - * and y for first regs phys address - */ -extern int prom_getname(int node, char *buf, int buflen); - /* Search all siblings starting at the passed node for "name" matching * the given string. Returns the node on success, zero on failure. */ diff --git a/include/asm-sparc/page.h b/include/asm-sparc/page.h index b04914eae..a7dafac06 100644 --- a/include/asm-sparc/page.h +++ b/include/asm-sparc/page.h @@ -8,7 +8,8 @@ #ifndef _SPARC_PAGE_H #define _SPARC_PAGE_H -#include +#ifdef __KERNEL__ + #ifdef CONFIG_SUN4 #define PAGE_SHIFT 13 #else @@ -22,8 +23,6 @@ #endif #define PAGE_MASK (~(PAGE_SIZE-1)) -#ifdef __KERNEL__ - #include #ifndef __ASSEMBLY__ @@ -161,11 +160,11 @@ extern unsigned long pfn_base; #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \ VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) +#include +#include + #define devmem_is_allowed(x) 1 #endif /* __KERNEL__ */ -#include -#include - #endif /* _SPARC_PAGE_H */ diff --git a/include/asm-sparc/pbm.h b/include/asm-sparc/pbm.h index 0aba3a82c..fedd9c6e8 100644 --- a/include/asm-sparc/pbm.h +++ b/include/asm-sparc/pbm.h @@ -22,6 +22,7 @@ #include #include +#include struct linux_pbm_info { int prom_node; @@ -40,7 +41,7 @@ struct linux_pbm_info { */ struct pcidev_cookie { struct linux_pbm_info *pbm; - int prom_node; + struct device_node *prom_node; }; #endif /* !(__SPARC_PBM_H) */ diff --git a/include/asm-sparc/pgalloc.h b/include/asm-sparc/pgalloc.h index 8db566203..288259527 100644 --- a/include/asm-sparc/pgalloc.h +++ b/include/asm-sparc/pgalloc.h @@ -2,7 +2,6 @@ #ifndef _SPARC_PGALLOC_H #define _SPARC_PGALLOC_H -#include #include #include diff --git a/include/asm-sparc/pgtable.h b/include/asm-sparc/pgtable.h index 9eea8f4d4..226c6475c 100644 --- a/include/asm-sparc/pgtable.h +++ b/include/asm-sparc/pgtable.h @@ -11,7 +11,6 @@ #include -#include #include #include #include diff --git a/include/asm-sparc/sbus.h b/include/asm-sparc/sbus.h index a13cddcec..d036e4419 100644 --- a/include/asm-sparc/sbus.h +++ b/include/asm-sparc/sbus.h @@ -11,7 +11,8 @@ #include #include -/* #include */ /* Unused since we use opaque iommu (|io-unit) */ +#include +#include #include /* We scan which devices are on the SBus using the PROM node device @@ -42,18 +43,19 @@ struct sbus_bus; /* Linux SBUS device tables */ struct sbus_dev { - struct sbus_bus *bus; /* Back ptr to sbus */ - struct sbus_dev *next; /* next device on this SBus or null */ - struct sbus_dev *child; /* For ledma and espdma on sun4m */ - struct sbus_dev *parent; /* Parent device if not toplevel */ - int prom_node; /* PROM device tree node for this device */ - char prom_name[64]; /* PROM device name */ + struct of_device ofdev; + struct sbus_bus *bus; + struct sbus_dev *next; + struct sbus_dev *child; + struct sbus_dev *parent; + int prom_node; + char prom_name[64]; int slot; struct resource resource[PROMREG_MAX]; struct linux_prom_registers reg_addrs[PROMREG_MAX]; - int num_registers, ranges_applied; + int num_registers; struct linux_prom_ranges device_ranges[PROMREG_MAX]; int num_device_ranges; @@ -61,9 +63,11 @@ struct sbus_dev { unsigned int irqs[4]; int num_irqs; }; +#define to_sbus_device(d) container_of(d, struct sbus_dev, ofdev.dev) /* This struct describes the SBus(s) found on this machine. */ struct sbus_bus { + struct of_device ofdev; void *iommu; /* Opaque IOMMU cookie */ struct sbus_dev *devices; /* Link to devices on this SBus */ struct sbus_bus *next; /* next SBus, if more than one SBus */ @@ -77,6 +81,7 @@ struct sbus_bus { int devid; int board; }; +#define to_sbus(d) container_of(d, struct sbus_bus, ofdev.dev) extern struct sbus_bus *sbus_root; @@ -102,6 +107,7 @@ sbus_is_slave(struct sbus_dev *dev) #define sbus_can_dma_64bit(sdev) (0) /* actually, sparc_cpu_model==sun4d */ #define sbus_can_burst64(sdev) (0) /* actually, sparc_cpu_model==sun4d */ extern void sbus_set_sbus64(struct sbus_dev *, int); +extern void sbus_fill_device_irq(struct sbus_dev *); /* These yield IOMMU mappings in consistent mode. */ extern void *sbus_alloc_consistent(struct sbus_dev *, long, u32 *dma_addrp); @@ -139,4 +145,10 @@ extern void sbus_dma_sync_sg_for_device(struct sbus_dev *, struct scatterlist *, BTFIXUPDEF_CALL(unsigned int, sbint_to_irq, struct sbus_dev *sdev, unsigned int) #define sbint_to_irq(sdev, sbint) BTFIXUP_CALL(sbint_to_irq)(sdev, sbint) +extern void sbus_arch_bus_ranges_init(struct device_node *, struct sbus_bus *); +extern void sbus_setup_iommu(struct sbus_bus *, struct device_node *); +extern void sbus_setup_arch_props(struct sbus_bus *, struct device_node *); +extern int sbus_arch_preinit(void); +extern void sbus_arch_postinit(void); + #endif /* !(_SPARC_SBUS_H) */ diff --git a/include/asm-sparc/sfp-machine.h b/include/asm-sparc/sfp-machine.h index b4ca2d94b..ecfc86a4a 100644 --- a/include/asm-sparc/sfp-machine.h +++ b/include/asm-sparc/sfp-machine.h @@ -25,7 +25,6 @@ #ifndef _SFP_MACHINE_H #define _SFP_MACHINE_H -#include #define _FP_W_TYPE_SIZE 32 #define _FP_W_TYPE unsigned long diff --git a/include/asm-sparc/signal.h b/include/asm-sparc/signal.h index aa9960ad0..d03a21c97 100644 --- a/include/asm-sparc/signal.h +++ b/include/asm-sparc/signal.h @@ -132,16 +132,13 @@ struct sigstack { * usage of signal stacks by using the (now obsolete) sa_restorer field in * the sigaction structure as a stack pointer. This is now possible due to * the changes in signal handling. LBT 010493. - * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_RESTART flag to get restarting signals (which were the default long ago) - * SA_SHIRQ flag is for shared interrupt support on PCI and EISA. */ #define SA_NOCLDSTOP _SV_IGNCHILD #define SA_STACK _SV_SSTACK #define SA_ONSTACK _SV_SSTACK #define SA_RESTART _SV_INTR #define SA_ONESHOT _SV_RESET -#define SA_INTERRUPT 0x10u #define SA_NOMASK 0x20u #define SA_NOCLDWAIT 0x100u #define SA_SIGINFO 0x200u @@ -171,7 +168,7 @@ struct sigstack { * statically allocated data.. which is NOT GOOD. * */ -#define SA_STATIC_ALLOC 0x80 +#define SA_STATIC_ALLOC 0x8000 #endif #include diff --git a/include/asm-sparc/smp.h b/include/asm-sparc/smp.h index 98c46e3fb..b9da9a600 100644 --- a/include/asm-sparc/smp.h +++ b/include/asm-sparc/smp.h @@ -6,7 +6,6 @@ #ifndef _SPARC_SMP_H #define _SPARC_SMP_H -#include #include #include #include @@ -146,6 +145,8 @@ static inline int hard_smp_processor_id(void) #define prof_multiplier(__cpu) cpu_data(__cpu).multiplier #define prof_counter(__cpu) cpu_data(__cpu).counter +void smp_setup_cpu_possible_map(void); + #endif /* !(__ASSEMBLY__) */ /* Sparc specific messages. */ @@ -162,7 +163,11 @@ static inline int hard_smp_processor_id(void) #define MBOX_IDLECPU2 0xFD #define MBOX_STOPCPU2 0xFE -#endif /* SMP */ +#else /* SMP */ + +#define smp_setup_cpu_possible_map() do { } while (0) + +#endif /* !(SMP) */ #define NO_PROC_ID 0xFF diff --git a/include/asm-sparc/socket.h b/include/asm-sparc/socket.h index 4e0ce3a35..f6c4e5baf 100644 --- a/include/asm-sparc/socket.h +++ b/include/asm-sparc/socket.h @@ -48,6 +48,7 @@ #define SCM_TIMESTAMP SO_TIMESTAMP #define SO_PEERSEC 0x001e +#define SO_PASSSEC 0x001f /* Security levels - as per NRL IPv6 - don't actually do anything */ #define SO_SECURITY_AUTHENTICATION 0x5001 diff --git a/include/asm-sparc/spinlock.h b/include/asm-sparc/spinlock.h index 3350c90c7..1c75474ba 100644 --- a/include/asm-sparc/spinlock.h +++ b/include/asm-sparc/spinlock.h @@ -154,6 +154,9 @@ static inline int __raw_write_trylock(raw_rwlock_t *rw) #define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock) #define __raw_read_trylock(lock) generic__raw_read_trylock(lock) +#define __raw_read_can_lock(rw) (!((rw)->lock & 0xff)) +#define __raw_write_can_lock(rw) (!(rw)->lock) + #endif /* !(__ASSEMBLY__) */ #endif /* __SPARC_SPINLOCK_H */ diff --git a/include/asm-sparc/system.h b/include/asm-sparc/system.h index 58dd16292..100c3eaf3 100644 --- a/include/asm-sparc/system.h +++ b/include/asm-sparc/system.h @@ -1,10 +1,8 @@ /* $Id: system.h,v 1.86 2001/10/30 04:57:10 davem Exp $ */ -#include #ifndef __SPARC_SYSTEM_H #define __SPARC_SYSTEM_H -#include #include #include /* NR_CPUS */ #include @@ -201,7 +199,6 @@ static inline unsigned long getipl(void) #define wmb() mb() #define read_barrier_depends() do { } while(0) #define set_mb(__var, __value) do { __var = __value; mb(); } while(0) -#define set_wmb(__var, __value) set_mb(__var, __value) #define smp_mb() __asm__ __volatile__("":::"memory") #define smp_rmb() __asm__ __volatile__("":::"memory") #define smp_wmb() __asm__ __volatile__("":::"memory") diff --git a/include/asm-sparc/timer.h b/include/asm-sparc/timer.h index b16eb739d..cb1fa1d1f 100644 --- a/include/asm-sparc/timer.h +++ b/include/asm-sparc/timer.h @@ -4,7 +4,6 @@ * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) */ -#include #ifndef _SPARC_TIMER_H #define _SPARC_TIMER_H diff --git a/include/asm-sparc/tlbflush.h b/include/asm-sparc/tlbflush.h index 5643ca31e..4a3b66618 100644 --- a/include/asm-sparc/tlbflush.h +++ b/include/asm-sparc/tlbflush.h @@ -1,7 +1,6 @@ #ifndef _SPARC_TLBFLUSH_H #define _SPARC_TLBFLUSH_H -#include #include // #include diff --git a/include/asm-sparc/unistd.h b/include/asm-sparc/unistd.h index b3ed04d08..ec8bf1e71 100644 --- a/include/asm-sparc/unistd.h +++ b/include/asm-sparc/unistd.h @@ -319,6 +319,7 @@ #define __NR_set_robust_list 300 #define __NR_get_robust_list 301 +#ifdef __KERNEL__ /* WARNING: You MAY NOT add syscall numbers larger than 301, since * all of the syscall tables in the Sparc kernel are * sized to have 301 entries (starting at zero). Therefore @@ -455,7 +456,6 @@ errno = -__res; \ return -1; \ } -#ifdef __KERNEL__ #define __ARCH_WANT_IPC_PARSE_VERSION #define __ARCH_WANT_OLD_READDIR #define __ARCH_WANT_STAT64 @@ -477,7 +477,6 @@ return -1; \ #define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPROCMASK #define __ARCH_WANT_SYS_RT_SIGSUSPEND -#endif #ifdef __KERNEL_SYSCALLS__ @@ -534,4 +533,5 @@ asmlinkage long sys_rt_sigaction(int sig, */ #define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") +#endif /* __KERNEL__ */ #endif /* _SPARC_UNISTD_H */ diff --git a/include/asm-sparc/vac-ops.h b/include/asm-sparc/vac-ops.h index 9e0172323..ab6f53b91 100644 --- a/include/asm-sparc/vac-ops.h +++ b/include/asm-sparc/vac-ops.h @@ -8,7 +8,6 @@ * Copyright (C) 1994, David S. Miller (davem@caip.rutgers.edu) */ -#include #include #include #include diff --git a/include/asm-sparc/winmacro.h b/include/asm-sparc/winmacro.h index 557257eef..096f3d3d9 100644 --- a/include/asm-sparc/winmacro.h +++ b/include/asm-sparc/winmacro.h @@ -7,7 +7,6 @@ #ifndef _SPARC_WINMACRO_H #define _SPARC_WINMACRO_H -#include #include /* Store the register window onto the 8-byte aligned area starting diff --git a/include/asm-sparc64/atomic.h b/include/asm-sparc64/atomic.h index 468eb48d8..2f0bec26a 100644 --- a/include/asm-sparc64/atomic.h +++ b/include/asm-sparc64/atomic.h @@ -8,7 +8,6 @@ #ifndef __ARCH_SPARC64_ATOMIC__ #define __ARCH_SPARC64_ATOMIC__ -#include #include typedef struct { volatile int counter; } atomic_t; diff --git a/include/asm-sparc64/bitops.h b/include/asm-sparc64/bitops.h index 71944b0f0..3d5e1af84 100644 --- a/include/asm-sparc64/bitops.h +++ b/include/asm-sparc64/bitops.h @@ -7,7 +7,6 @@ #ifndef _SPARC64_BITOPS_H #define _SPARC64_BITOPS_H -#include #include #include diff --git a/include/asm-sparc64/bugs.h b/include/asm-sparc64/bugs.h index 360dd04ed..120422fdb 100644 --- a/include/asm-sparc64/bugs.h +++ b/include/asm-sparc64/bugs.h @@ -4,7 +4,6 @@ * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) */ -#include extern unsigned long loops_per_jiffy; diff --git a/include/asm-sparc64/cacheflush.h b/include/asm-sparc64/cacheflush.h index b3f61659b..745d1ab60 100644 --- a/include/asm-sparc64/cacheflush.h +++ b/include/asm-sparc64/cacheflush.h @@ -1,7 +1,6 @@ #ifndef _SPARC64_CACHEFLUSH_H #define _SPARC64_CACHEFLUSH_H -#include #include #ifndef __ASSEMBLY__ diff --git a/include/asm-sparc64/cpudata.h b/include/asm-sparc64/cpudata.h index 9d6a6dbaf..f2cc9411b 100644 --- a/include/asm-sparc64/cpudata.h +++ b/include/asm-sparc64/cpudata.h @@ -74,8 +74,10 @@ struct trap_per_cpu { unsigned long tsb_huge; unsigned long tsb_huge_temp; -/* Dcache line 8: Unused, needed to keep trap_block a power-of-2 in size. */ - unsigned long __pad2[4]; +/* Dcache line 8: IRQ work list, and keep trap_block a power-of-2 in size. */ + unsigned int irq_worklist; + unsigned int __pad1; + unsigned long __pad2[3]; } __attribute__((aligned(64))); extern struct trap_per_cpu trap_block[NR_CPUS]; extern void init_cur_cpu_trap(struct thread_info *); @@ -119,6 +121,7 @@ extern struct sun4v_2insn_patch_entry __sun4v_2insn_patch, #define TRAP_PER_CPU_CPU_LIST_PA 0xc8 #define TRAP_PER_CPU_TSB_HUGE 0xd0 #define TRAP_PER_CPU_TSB_HUGE_TEMP 0xd8 +#define TRAP_PER_CPU_IRQ_WORKLIST 0xe0 #define TRAP_BLOCK_SZ_SHIFT 8 @@ -171,11 +174,8 @@ extern struct sun4v_2insn_patch_entry __sun4v_2insn_patch, /* Clobbers TMP, loads local processor's IRQ work area into DEST. */ #define TRAP_LOAD_IRQ_WORK(DEST, TMP) \ - __GET_CPUID(TMP) \ - sethi %hi(__irq_work), DEST; \ - sllx TMP, 6, TMP; \ - or DEST, %lo(__irq_work), DEST; \ - add DEST, TMP, DEST; + TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ + add DEST, TRAP_PER_CPU_IRQ_WORKLIST, DEST; /* Clobbers TMP, loads DEST with current thread info pointer. */ #define TRAP_LOAD_THREAD_REG(DEST, TMP) \ @@ -211,9 +211,10 @@ extern struct sun4v_2insn_patch_entry __sun4v_2insn_patch, TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ ldx [DEST + TRAP_PER_CPU_PGD_PADDR], DEST; +/* Clobbers TMP, loads local processor's IRQ work area into DEST. */ #define TRAP_LOAD_IRQ_WORK(DEST, TMP) \ - sethi %hi(__irq_work), DEST; \ - or DEST, %lo(__irq_work), DEST; + TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ + add DEST, TRAP_PER_CPU_IRQ_WORKLIST, DEST; #define TRAP_LOAD_THREAD_REG(DEST, TMP) \ TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ diff --git a/include/asm-sparc64/delay.h b/include/asm-sparc64/delay.h index 2901ea0c3..a4aae6f80 100644 --- a/include/asm-sparc64/delay.h +++ b/include/asm-sparc64/delay.h @@ -11,7 +11,6 @@ #ifndef __SPARC64_DELAY_H #define __SPARC64_DELAY_H -#include #include #include diff --git a/include/asm-sparc64/dma-mapping.h b/include/asm-sparc64/dma-mapping.h index a8d39f23d..27c46fbee 100644 --- a/include/asm-sparc64/dma-mapping.h +++ b/include/asm-sparc64/dma-mapping.h @@ -1,7 +1,6 @@ #ifndef _ASM_SPARC64_DMA_MAPPING_H #define _ASM_SPARC64_DMA_MAPPING_H -#include #ifdef CONFIG_PCI @@ -161,6 +160,63 @@ static inline void dma_free_coherent(struct device *dev, size_t size, BUG(); } +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(); +} + +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(); +} + #endif /* PCI */ + +/* 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 << INTERNODE_CACHE_SHIFT); +} + +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, that's all the pci API can do */ + 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, that's all the pci API can do */ + 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) +{ + /* could define this in terms of the dma_cache ... operations, + * but if you get this on a platform, you should convert the platform + * to using the generic device DMA API */ + BUG(); +} + #endif /* _ASM_SPARC64_DMA_MAPPING_H */ diff --git a/include/asm-sparc64/dma.h b/include/asm-sparc64/dma.h index 1aab3c8dc..27f65972b 100644 --- a/include/asm-sparc64/dma.h +++ b/include/asm-sparc64/dma.h @@ -7,7 +7,6 @@ #ifndef _ASM_SPARC64_DMA_H #define _ASM_SPARC64_DMA_H -#include #include #include #include diff --git a/include/asm-sparc64/ebus.h b/include/asm-sparc64/ebus.h index 7a408a030..a4afe9d57 100644 --- a/include/asm-sparc64/ebus.h +++ b/include/asm-sparc64/ebus.h @@ -10,13 +10,14 @@ #include #include +#include +#include struct linux_ebus_child { struct linux_ebus_child *next; struct linux_ebus_device *parent; struct linux_ebus *bus; - int prom_node; - char prom_name[64]; + struct device_node *prom_node; struct resource resource[PROMREG_MAX]; int num_addrs; unsigned int irqs[PROMINTR_MAX]; @@ -24,32 +25,29 @@ struct linux_ebus_child { }; struct linux_ebus_device { + struct of_device ofdev; struct linux_ebus_device *next; struct linux_ebus_child *children; struct linux_ebus *bus; - int prom_node; - char prom_name[64]; + struct device_node *prom_node; struct resource resource[PROMREG_MAX]; int num_addrs; unsigned int irqs[PROMINTR_MAX]; int num_irqs; }; +#define to_ebus_device(d) container_of(d, struct linux_ebus_device, ofdev.dev) struct linux_ebus { + struct of_device ofdev; struct linux_ebus *next; struct linux_ebus_device *devices; struct pci_pbm_info *parent; struct pci_dev *self; int index; int is_rio; - int prom_node; - char prom_name[64]; - struct linux_prom_ebus_ranges ebus_ranges[PROMREG_MAX]; - int num_ebus_ranges; - struct linux_prom_ebus_intmap ebus_intmap[PROMREG_MAX]; - int num_ebus_intmap; - struct linux_prom_ebus_intmask ebus_intmask; + struct device_node *prom_node; }; +#define to_ebus(d) container_of(d, struct linux_ebus, ofdev.dev) struct ebus_dma_info { spinlock_t lock; diff --git a/include/asm-sparc64/fhc.h b/include/asm-sparc64/fhc.h index f29eaa254..9e7f1b0d7 100644 --- a/include/asm-sparc64/fhc.h +++ b/include/asm-sparc64/fhc.h @@ -10,6 +10,7 @@ #include #include +#include #include struct linux_fhc; @@ -34,8 +35,7 @@ struct linux_central { unsigned long clkregs; unsigned long clkver; int slots; - int prom_node; - char prom_name[64]; + struct device_node *prom_node; struct linux_prom_ranges central_ranges[PROMREG_MAX]; int num_central_ranges; @@ -112,8 +112,7 @@ struct linux_fhc { struct fhc_regs fhc_regs; int board; int jtag_master; - int prom_node; - char prom_name[64]; + struct device_node *prom_node; struct linux_prom_ranges fhc_ranges[PROMREG_MAX]; int num_fhc_ranges; diff --git a/include/asm-sparc64/floppy.h b/include/asm-sparc64/floppy.h index 6a95d5d0c..abf150038 100644 --- a/include/asm-sparc64/floppy.h +++ b/include/asm-sparc64/floppy.h @@ -10,7 +10,6 @@ #ifndef __ASM_SPARC64_FLOPPY_H #define __ASM_SPARC64_FLOPPY_H -#include #include #include @@ -209,7 +208,55 @@ static void sun_fd_enable_dma(void) pdma_areasize = pdma_size; } -extern irqreturn_t sparc_floppy_irq(int, void *, struct pt_regs *); +irqreturn_t sparc_floppy_irq(int irq, void *dev_cookie, struct pt_regs *regs) +{ + if (likely(doing_pdma)) { + void __iomem *stat = (void __iomem *) fdc_status; + unsigned char *vaddr = pdma_vaddr; + unsigned long size = pdma_size; + u8 val; + + while (size) { + val = readb(stat); + if (unlikely(!(val & 0x80))) { + pdma_vaddr = vaddr; + pdma_size = size; + return IRQ_HANDLED; + } + if (unlikely(!(val & 0x20))) { + pdma_vaddr = vaddr; + pdma_size = size; + doing_pdma = 0; + goto main_interrupt; + } + if (val & 0x40) { + /* read */ + *vaddr++ = readb(stat + 1); + } else { + unsigned char data = *vaddr++; + + /* write */ + writeb(data, stat + 1); + } + size--; + } + + pdma_vaddr = vaddr; + pdma_size = size; + + /* Send Terminal Count pulse to floppy controller. */ + val = readb(auxio_register); + val |= AUXIO_AUX1_FTCNT; + writeb(val, auxio_register); + val &= ~AUXIO_AUX1_FTCNT; + writeb(val, auxio_register); + + doing_pdma = 0; + } + +main_interrupt: + return floppy_interrupt(irq, dev_cookie, regs); +} static int sun_fd_request_irq(void) { @@ -220,7 +267,7 @@ static int sun_fd_request_irq(void) once = 1; error = request_irq(FLOPPY_IRQ, sparc_floppy_irq, - SA_INTERRUPT, "floppy", NULL); + IRQF_DISABLED, "floppy", NULL); return ((error == 0) ? 0 : -1); } @@ -499,15 +546,14 @@ static int sun_pci_fd_test_drive(unsigned long port, int drive) #ifdef CONFIG_PCI static int __init ebus_fdthree_p(struct linux_ebus_device *edev) { - if (!strcmp(edev->prom_name, "fdthree")) + if (!strcmp(edev->prom_node->name, "fdthree")) return 1; - if (!strcmp(edev->prom_name, "floppy")) { - char compat[16]; - prom_getstring(edev->prom_node, - "compatible", - compat, sizeof(compat)); - compat[15] = '\0'; - if (!strcmp(compat, "fdthree")) + if (!strcmp(edev->prom_node->name, "floppy")) { + char *compat; + + compat = of_get_property(edev->prom_node, + "compatible", NULL); + if (compat && !strcmp(compat, "fdthree")) return 1; } return 0; @@ -525,12 +571,12 @@ static unsigned long __init isa_floppy_init(void) for_each_isa(isa_br) { for_each_isadev(isa_dev, isa_br) { - if (!strcmp(isa_dev->prom_name, "dma")) { + if (!strcmp(isa_dev->prom_node->name, "dma")) { struct sparc_isa_device *child = isa_dev->child; while (child) { - if (!strcmp(child->prom_name, + if (!strcmp(child->prom_node->name, "floppy")) { isa_dev = child; goto isa_done; @@ -615,6 +661,7 @@ static unsigned long __init sun_floppy_init(void) struct linux_ebus_device *edev = NULL; unsigned long config = 0; void __iomem *auxio_reg; + char *state_prop; for_each_ebus(ebus) { for_each_ebusdev(edev, ebus) { @@ -631,9 +678,8 @@ static unsigned long __init sun_floppy_init(void) #endif } - prom_getproperty(edev->prom_node, "status", - state, sizeof(state)); - if (!strncmp(state, "disabled", 8)) + state_prop = of_get_property(edev->prom_node, "status", NULL); + if (state_prop && !strncmp(state_prop, "disabled", 8)) return 0; FLOPPY_IRQ = edev->irqs[0]; @@ -704,7 +750,7 @@ static unsigned long __init sun_floppy_init(void) */ for_each_ebus(ebus) { for_each_ebusdev(edev, ebus) { - if (!strcmp(edev->prom_name, "ecpp")) { + if (!strcmp(edev->prom_node->name, "ecpp")) { config = edev->resource[1].start; goto config_done; } diff --git a/include/asm-sparc64/hardirq.h b/include/asm-sparc64/hardirq.h index f0cf71376..7c29fd1a8 100644 --- a/include/asm-sparc64/hardirq.h +++ b/include/asm-sparc64/hardirq.h @@ -12,6 +12,8 @@ #define local_softirq_pending() \ (local_cpu_data().__softirq_pending) +void ack_bad_irq(unsigned int irq); + #define HARDIRQ_BITS 8 #endif /* !(__SPARC64_HARDIRQ_H) */ diff --git a/include/asm-sparc64/hw_irq.h b/include/asm-sparc64/hw_irq.h index 153cae2dd..599b3b073 100644 --- a/include/asm-sparc64/hw_irq.h +++ b/include/asm-sparc64/hw_irq.h @@ -1,6 +1,6 @@ #ifndef __ASM_SPARC64_HW_IRQ_H #define __ASM_SPARC64_HW_IRQ_H -/* Dummy include. */ +extern void hw_resend_irq(struct hw_interrupt_type *handler, unsigned int virt_irq); #endif diff --git a/include/asm-sparc64/ide.h b/include/asm-sparc64/ide.h index c393f815b..55149cf93 100644 --- a/include/asm-sparc64/ide.h +++ b/include/asm-sparc64/ide.h @@ -10,7 +10,6 @@ #ifdef __KERNEL__ -#include #include #include #include diff --git a/include/asm-sparc64/irq.h b/include/asm-sparc64/irq.h index de33d6e1a..905e59b4a 100644 --- a/include/asm-sparc64/irq.h +++ b/include/asm-sparc64/irq.h @@ -8,7 +8,6 @@ #ifndef _SPARC64_IRQ_H #define _SPARC64_IRQ_H -#include #include #include #include @@ -16,58 +15,6 @@ #include #include -struct ino_bucket; - -#define MAX_IRQ_DESC_ACTION 4 - -struct irq_desc { - void (*pre_handler)(struct ino_bucket *, void *, void *); - void *pre_handler_arg1; - void *pre_handler_arg2; - u32 action_active_mask; - struct irqaction action[MAX_IRQ_DESC_ACTION]; -}; - -/* You should not mess with this directly. That's the job of irq.c. - * - * If you make changes here, please update hand coded assembler of - * the vectored interrupt trap handler in entry.S -DaveM - * - * This is currently one DCACHE line, two buckets per L2 cache - * line. Keep this in mind please. - */ -struct ino_bucket { - /* Next handler in per-CPU PIL worklist. We know that - * bucket pointers have the high 32-bits clear, so to - * save space we only store the bits we need. - */ -/*0x00*/unsigned int irq_chain; - - /* PIL to schedule this IVEC at. */ -/*0x04*/unsigned char pil; - - /* If an IVEC arrives while irq_info is NULL, we - * set this to notify request_irq() about the event. - */ -/*0x05*/unsigned char pending; - - /* Miscellaneous flags. */ -/*0x06*/unsigned char flags; - - /* Currently unused. */ -/*0x07*/unsigned char __pad; - - /* Reference to IRQ descriptor for this bucket. */ -/*0x08*/struct irq_desc *irq_info; - - /* Sun5 Interrupt Clear Register. */ -/*0x10*/unsigned long iclr; - - /* Sun5 Interrupt Mapping Register. */ -/*0x18*/unsigned long imap; - -}; - /* IMAP/ICLR register defines */ #define IMAP_VALID 0x80000000 /* IRQ Enabled */ #define IMAP_TID_UPA 0x7c000000 /* UPA TargetID */ @@ -85,36 +32,20 @@ struct ino_bucket { #define ICLR_TRANSMIT 0x00000001 /* Transmit state */ #define ICLR_PENDING 0x00000003 /* Pending state */ -/* Only 8-bits are available, be careful. -DaveM */ -#define IBF_PCI 0x02 /* PSYCHO/SABRE/SCHIZO PCI interrupt. */ -#define IBF_ACTIVE 0x04 /* Interrupt is active and has a handler.*/ -#define IBF_INPROGRESS 0x10 /* IRQ is being serviced. */ - -#define NUM_IVECS (IMAP_INR + 1) -extern struct ino_bucket ivector_table[NUM_IVECS]; - -#define __irq_ino(irq) \ - (((struct ino_bucket *)(unsigned long)(irq)) - &ivector_table[0]) -#define __irq_pil(irq) ((struct ino_bucket *)(unsigned long)(irq))->pil -#define __bucket(irq) ((struct ino_bucket *)(unsigned long)(irq)) -#define __irq(bucket) ((unsigned int)(unsigned long)(bucket)) - -static __inline__ char *__irq_itoa(unsigned int irq) -{ - static char buff[16]; - - sprintf(buff, "%d,%x", __irq_pil(irq), (unsigned int)__irq_ino(irq)); - return buff; -} - -#define NR_IRQS 16 +/* The largest number of unique interrupt sources we support. + * If this needs to ever be larger than 255, you need to change + * the type of ino_bucket->virt_irq as appropriate. + * + * ino_bucket->virt_irq allocation is made during {sun4v_,}build_irq(). + */ +#define NR_IRQS 255 +extern void irq_install_pre_handler(int virt_irq, + void (*func)(unsigned int, void *, void *), + void *arg1, void *arg2); #define irq_canonicalize(irq) (irq) -extern void disable_irq(unsigned int); -#define disable_irq_nosync disable_irq -extern void enable_irq(unsigned int); -extern unsigned int build_irq(int pil, int inofixup, unsigned long iclr, unsigned long imap); -extern unsigned int sun4v_build_irq(u32 devhandle, unsigned int devino, int pil, unsigned char flags); +extern unsigned int build_irq(int inofixup, unsigned long iclr, unsigned long imap); +extern unsigned int sun4v_build_irq(u32 devhandle, unsigned int devino); extern unsigned int sbus_build_irq(void *sbus, unsigned int ino); static __inline__ void set_softint(unsigned long bits) @@ -140,8 +71,4 @@ static __inline__ unsigned long get_softint(void) return retval; } -struct irqaction; -struct pt_regs; -int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *); - #endif diff --git a/include/asm-sparc64/isa.h b/include/asm-sparc64/isa.h index 4601bbfc3..d9728b903 100644 --- a/include/asm-sparc64/isa.h +++ b/include/asm-sparc64/isa.h @@ -9,37 +9,32 @@ #include #include +#include +#include struct sparc_isa_bridge; struct sparc_isa_device { + struct of_device ofdev; struct sparc_isa_device *next; struct sparc_isa_device *child; struct sparc_isa_bridge *bus; - int prom_node; - char prom_name[64]; - char compatible[64]; + struct device_node *prom_node; struct resource resource; unsigned int irq; }; +#define to_isa_device(d) container_of(d, struct sparc_isa_device, ofdev.dev) struct sparc_isa_bridge { + struct of_device ofdev; struct sparc_isa_bridge *next; struct sparc_isa_device *devices; struct pci_pbm_info *parent; struct pci_dev *self; int index; - int prom_node; - char prom_name[64]; -#define linux_prom_isa_ranges linux_prom_ebus_ranges - struct linux_prom_isa_ranges isa_ranges[PROMREG_MAX]; - int num_isa_ranges; -#define linux_prom_isa_intmap linux_prom_ebus_intmap - struct linux_prom_isa_intmap isa_intmap[PROMREG_MAX]; - int num_isa_intmap; -#define linux_prom_isa_intmask linux_prom_ebus_intmask - struct linux_prom_isa_intmap isa_intmask; + struct device_node *prom_node; }; +#define to_isa_bridge(d) container_of(d, struct sparc_isa_bridge, ofdev.dev) extern struct sparc_isa_bridge *isa_chain; diff --git a/include/asm-sparc64/kdebug.h b/include/asm-sparc64/kdebug.h index 4040d127a..11251bdd0 100644 --- a/include/asm-sparc64/kdebug.h +++ b/include/asm-sparc64/kdebug.h @@ -17,6 +17,8 @@ struct die_args { extern int register_die_notifier(struct notifier_block *); extern int unregister_die_notifier(struct notifier_block *); +extern int register_page_fault_notifier(struct notifier_block *); +extern int unregister_page_fault_notifier(struct notifier_block *); extern struct atomic_notifier_head sparc64die_chain; extern void bad_trap(struct pt_regs *, long); diff --git a/include/asm-sparc64/kprobes.h b/include/asm-sparc64/kprobes.h index e4efe652b..c9f5c34d3 100644 --- a/include/asm-sparc64/kprobes.h +++ b/include/asm-sparc64/kprobes.h @@ -1,7 +1,6 @@ #ifndef _SPARC64_KPROBES_H #define _SPARC64_KPROBES_H -#include #include #include @@ -13,6 +12,8 @@ typedef u32 kprobe_opcode_t; #define JPROBE_ENTRY(pentry) (kprobe_opcode_t *)pentry #define arch_remove_kprobe(p) do {} while (0) +#define ARCH_INACTIVE_KPROBE_COUNT 0 +#define flush_insn_slot(p) do { } while (0) /* Architecture specific copy of original instruction*/ struct arch_specific_insn { diff --git a/include/asm-sparc64/mc146818rtc.h b/include/asm-sparc64/mc146818rtc.h index 75bd572b3..e9c0fcc25 100644 --- a/include/asm-sparc64/mc146818rtc.h +++ b/include/asm-sparc64/mc146818rtc.h @@ -4,7 +4,6 @@ #ifndef __ASM_SPARC64_MC146818RTC_H #define __ASM_SPARC64_MC146818RTC_H -#include #include #ifndef RTC_PORT diff --git a/include/asm-sparc64/mman.h b/include/asm-sparc64/mman.h index b3002763c..8cc1860be 100644 --- a/include/asm-sparc64/mman.h +++ b/include/asm-sparc64/mman.h @@ -2,12 +2,6 @@ #ifndef __SPARC64_MMAN_H__ #define __SPARC64_MMAN_H__ -#ifdef __KERNEL__ -#define arch_mmap_check sparc64_mmap_check -int sparc64_mmap_check(unsigned long addr, unsigned long len, - unsigned long flags); -#endif - #include /* SunOS'ified... */ @@ -41,4 +35,12 @@ int sparc64_mmap_check(unsigned long addr, unsigned long len, #define MADV_FREE 0x5 /* (Solaris) contents can be freed */ +#ifdef __KERNEL__ +#ifndef __ASSEMBLY__ +#define arch_mmap_check sparc64_mmap_check +int sparc64_mmap_check(unsigned long addr, unsigned long len, + unsigned long flags); +#endif +#endif + #endif /* __SPARC64_MMAN_H__ */ diff --git a/include/asm-sparc64/mmu.h b/include/asm-sparc64/mmu.h index 2d4f2ea95..70af4b6ce 100644 --- a/include/asm-sparc64/mmu.h +++ b/include/asm-sparc64/mmu.h @@ -1,7 +1,6 @@ #ifndef __MMU_H #define __MMU_H -#include #include #include #include diff --git a/include/asm-sparc64/openprom.h b/include/asm-sparc64/openprom.h index b4959d2b0..e01b80559 100644 --- a/include/asm-sparc64/openprom.h +++ b/include/asm-sparc64/openprom.h @@ -175,7 +175,7 @@ struct linux_nodeops { }; /* More fun PROM structures for device probing. */ -#define PROMREG_MAX 16 +#define PROMREG_MAX 24 #define PROMVADDR_MAX 16 #define PROMINTR_MAX 15 diff --git a/include/asm-sparc64/oplib.h b/include/asm-sparc64/oplib.h index c754676e1..6a0da3b16 100644 --- a/include/asm-sparc64/oplib.h +++ b/include/asm-sparc64/oplib.h @@ -9,7 +9,6 @@ #ifndef __SPARC64_OPLIB_H #define __SPARC64_OPLIB_H -#include #include /* OBP version string. */ @@ -288,11 +287,6 @@ extern void prom_getstring(int node, const char *prop, char *buf, int bufsize); /* Does the passed node have the given "name"? YES=1 NO=0 */ extern int prom_nodematch(int thisnode, const char *name); -/* Puts in buffer a prom name in the form name@x,y or name (x for which_io - * and y for first regs phys address - */ -extern int prom_getname(int node, char *buf, int buflen); - /* Search all siblings starting at the passed node for "name" matching * the given string. Returns the node on success, zero on failure. */ @@ -324,8 +318,9 @@ extern int prom_pathtoinode(const char *path); extern int prom_inst2pkg(int); /* CPU probing helpers. */ -int cpu_find_by_instance(int instance, int *prom_node, int *mid); -int cpu_find_by_mid(int mid, int *prom_node); +struct device_node; +int cpu_find_by_instance(int instance, struct device_node **dev_node, int *mid); +int cpu_find_by_mid(int mid, struct device_node **prom_node); /* Client interface level routines. */ extern void prom_set_trap_table(unsigned long tba); diff --git a/include/asm-sparc64/page.h b/include/asm-sparc64/page.h index fea526017..294ca9340 100644 --- a/include/asm-sparc64/page.h +++ b/include/asm-sparc64/page.h @@ -3,7 +3,8 @@ #ifndef _SPARC64_PAGE_H #define _SPARC64_PAGE_H -#include +#ifdef __KERNEL__ + #include #if defined(CONFIG_SPARC64_PAGE_SIZE_8KB) @@ -28,8 +29,6 @@ #define DCACHE_ALIASING_POSSIBLE #endif -#ifdef __KERNEL__ - #if defined(CONFIG_HUGETLB_PAGE_SIZE_4MB) #define HPAGE_SHIFT 22 #elif defined(CONFIG_HUGETLB_PAGE_SIZE_512K) @@ -144,8 +143,7 @@ typedef unsigned long pgprot_t; #define devmem_is_allowed(x) 1 -#endif /* !(__KERNEL__) */ - #include -#endif /* !(_SPARC64_PAGE_H) */ +#endif /* __KERNEL__ */ +#endif /* _SPARC64_PAGE_H */ diff --git a/include/asm-sparc64/param.h b/include/asm-sparc64/param.h index a1cd49746..f0125cf5a 100644 --- a/include/asm-sparc64/param.h +++ b/include/asm-sparc64/param.h @@ -1,7 +1,6 @@ #ifndef _ASMSPARC64_PARAM_H #define _ASMSPARC64_PARAM_H -#include #ifdef __KERNEL__ # define HZ CONFIG_HZ /* Internal kernel timer frequency */ diff --git a/include/asm-sparc64/parport.h b/include/asm-sparc64/parport.h index 56b5197d7..d3895873e 100644 --- a/include/asm-sparc64/parport.h +++ b/include/asm-sparc64/parport.h @@ -67,18 +67,17 @@ static __inline__ unsigned int get_dma_residue(unsigned int dmanr) static int ebus_ecpp_p(struct linux_ebus_device *edev) { - if (!strcmp(edev->prom_name, "ecpp")) + if (!strcmp(edev->prom_node->name, "ecpp")) return 1; - if (!strcmp(edev->prom_name, "parallel")) { - char compat[19]; - prom_getstring(edev->prom_node, - "compatible", - compat, sizeof(compat)); - compat[18] = '\0'; - if (!strcmp(compat, "ecpp")) - return 1; - if (!strcmp(compat, "ns87317-ecpp") && - !strcmp(compat + 13, "ecpp")) + if (!strcmp(edev->prom_node->name, "parallel")) { + char *compat; + + compat = of_get_property(edev->prom_node, + "compatible", NULL); + if (compat && + (!strcmp(compat, "ecpp") || + !strcmp(compat, "ns87317-ecpp") || + !strcmp(compat + 13, "ecpp"))) return 1; } return 0; @@ -94,12 +93,12 @@ static int parport_isa_probe(int count) struct sparc_isa_device *child; unsigned long base; - if (strcmp(isa_dev->prom_name, "dma")) + if (strcmp(isa_dev->prom_node->name, "dma")) continue; child = isa_dev->child; while (child) { - if (!strcmp(child->prom_name, "parallel")) + if (!strcmp(child->prom_node->name, "parallel")) break; child = child->next; } diff --git a/include/asm-sparc64/pbm.h b/include/asm-sparc64/pbm.h index 1396f1109..dcfa76293 100644 --- a/include/asm-sparc64/pbm.h +++ b/include/asm-sparc64/pbm.h @@ -15,6 +15,8 @@ #include #include #include +#include +#include #include /* The abstraction used here is that there are PCI controllers, @@ -153,16 +155,15 @@ struct pci_pbm_info { int chip_revision; /* Name used for top-level resources. */ - char name[64]; + char *name; /* OBP specific information. */ - int prom_node; - char prom_name[64]; - struct linux_prom_pci_ranges pbm_ranges[PROM_PCIRNG_MAX]; + struct device_node *prom_node; + struct linux_prom_pci_ranges *pbm_ranges; int num_pbm_ranges; - struct linux_prom_pci_intmap pbm_intmap[PROM_PCIIMAP_MAX]; + struct linux_prom_pci_intmap *pbm_intmap; int num_pbm_intmap; - struct linux_prom_pci_intmask pbm_intmask; + struct linux_prom_pci_intmask *pbm_intmask; u64 ino_bitmap; /* PBM I/O and Memory space resources. */ @@ -209,7 +210,6 @@ struct pci_controller_info { /* Operations which are controller specific. */ void (*scan_bus)(struct pci_controller_info *); - unsigned int (*irq_build)(struct pci_pbm_info *, struct pci_dev *, unsigned int); void (*base_address_update)(struct pci_dev *, int); void (*resource_adjust)(struct pci_dev *, struct resource *, struct resource *); @@ -217,8 +217,6 @@ struct pci_controller_info { struct pci_ops *pci_ops; unsigned int pci_first_busno; unsigned int pci_last_busno; - - void *starfire_cookie; }; /* PCI devices which are not bridges have this placed in their pci_dev @@ -227,8 +225,8 @@ struct pci_controller_info { */ struct pcidev_cookie { struct pci_pbm_info *pbm; - char prom_name[64]; - int prom_node; + struct device_node *prom_node; + struct of_device *op; struct linux_prom_pci_registers prom_regs[PROMREG_MAX]; int num_prom_regs; struct linux_prom_pci_registers prom_assignments[PROMREG_MAX]; diff --git a/include/asm-sparc64/percpu.h b/include/asm-sparc64/percpu.h index baef13b58..ced8cbde0 100644 --- a/include/asm-sparc64/percpu.h +++ b/include/asm-sparc64/percpu.h @@ -11,6 +11,7 @@ extern unsigned long __per_cpu_base; extern unsigned long __per_cpu_shift; #define __per_cpu_offset(__cpu) \ (__per_cpu_base + ((unsigned long)(__cpu) << __per_cpu_shift)) +#define per_cpu_offset(x) (__per_cpu_offset(x)) /* Separate out the type, so (int[3], foo) works. */ #define DEFINE_PER_CPU(type, name) \ @@ -21,6 +22,7 @@ register unsigned long __local_per_cpu_offset asm("g5"); /* var is in discarded region: offset to particular copy we want */ #define per_cpu(var, cpu) (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset(cpu))) #define __get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __local_per_cpu_offset)) +#define __raw_get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __local_per_cpu_offset)) /* A macro to avoid #include hell... */ #define percpu_modcopy(pcpudst, src, size) \ @@ -37,6 +39,7 @@ do { \ #define per_cpu(var, cpu) (*((void)cpu, &per_cpu__##var)) #define __get_cpu_var(var) per_cpu__##var +#define __raw_get_cpu_var(var) per_cpu__##var #endif /* SMP */ diff --git a/include/asm-sparc64/pgalloc.h b/include/asm-sparc64/pgalloc.h index 6306271f6..9972623eb 100644 --- a/include/asm-sparc64/pgalloc.h +++ b/include/asm-sparc64/pgalloc.h @@ -2,7 +2,6 @@ #ifndef _SPARC64_PGALLOC_H #define _SPARC64_PGALLOC_H -#include #include #include #include diff --git a/include/asm-sparc64/pgtable.h b/include/asm-sparc64/pgtable.h index cd464f469..ebfe395cf 100644 --- a/include/asm-sparc64/pgtable.h +++ b/include/asm-sparc64/pgtable.h @@ -14,7 +14,6 @@ #include -#include #include #include #include @@ -235,7 +234,7 @@ static inline pte_t pfn_pte(unsigned long pfn, pgprot_t prot) sz_bits = 0UL; if (_PAGE_SZBITS_4U != 0UL || _PAGE_SZBITS_4V != 0UL) { __asm__ __volatile__( - "\n661: sethi %uhi(%1), %0\n" + "\n661: sethi %%uhi(%1), %0\n" " sllx %0, 32, %0\n" " .section .sun4v_2insn_patch, \"ax\"\n" " .word 661b\n" @@ -340,7 +339,7 @@ static inline pgprot_t pgprot_noncached(pgprot_t prot) " .section .sun4v_2insn_patch, \"ax\"\n" " .word 661b\n" " andn %0, %4, %0\n" - " or %0, %3, %0\n" + " or %0, %5, %0\n" " .previous\n" : "=r" (val) : "0" (val), "i" (_PAGE_CP_4U | _PAGE_CV_4U), "i" (_PAGE_E_4U), @@ -757,6 +756,8 @@ extern unsigned long *sparc64_valid_addr_bitmap; #define kern_addr_valid(addr) \ (test_bit(__pa((unsigned long)(addr))>>22, sparc64_valid_addr_bitmap)) +extern int page_in_phys_avail(unsigned long paddr); + extern int io_remap_pfn_range(struct vm_area_struct *vma, unsigned long from, unsigned long pfn, unsigned long size, pgprot_t prot); diff --git a/include/asm-sparc64/pil.h b/include/asm-sparc64/pil.h index 79f827eb3..72927749a 100644 --- a/include/asm-sparc64/pil.h +++ b/include/asm-sparc64/pil.h @@ -5,9 +5,9 @@ /* To avoid some locking problems, we hard allocate certain PILs * for SMP cross call messages that must do a etrap/rtrap. * - * A cli() does not block the cross call delivery, so when SMP - * locking is an issue we reschedule the event into a PIL interrupt - * which is blocked by cli(). + * A local_irq_disable() does not block the cross call delivery, so + * when SMP locking is an issue we reschedule the event into a PIL + * interrupt which is blocked by local_irq_disable(). * * In fact any XCALL which has to etrap/rtrap has a problem because * it is difficult to prevent rtrap from running BH's, and that would @@ -17,6 +17,7 @@ #define PIL_SMP_RECEIVE_SIGNAL 2 #define PIL_SMP_CAPTURE 3 #define PIL_SMP_CTX_NEW_VERSION 4 +#define PIL_DEVICE_IRQ 5 #ifndef __ASSEMBLY__ #define PIL_RESERVED(PIL) ((PIL) == PIL_SMP_CALL_FUNC || \ diff --git a/include/asm-sparc64/processor.h b/include/asm-sparc64/processor.h index c6896b882..66dd2fa0e 100644 --- a/include/asm-sparc64/processor.h +++ b/include/asm-sparc64/processor.h @@ -13,7 +13,6 @@ */ #define current_text_addr() ({ void *pc; __asm__("rd %%pc, %0" : "=r" (pc)); pc; }) -#include #include #include #include diff --git a/include/asm-sparc64/sbus.h b/include/asm-sparc64/sbus.h index 48279e10f..7efd49d31 100644 --- a/include/asm-sparc64/sbus.h +++ b/include/asm-sparc64/sbus.h @@ -11,6 +11,8 @@ #include #include +#include +#include #include #include @@ -42,18 +44,19 @@ struct sbus_bus; /* Linux SBUS device tables */ struct sbus_dev { - struct sbus_bus *bus; /* Our toplevel parent SBUS */ - struct sbus_dev *next; /* Chain of siblings */ - struct sbus_dev *child; /* Chain of children */ - struct sbus_dev *parent;/* Parent device if not toplevel*/ - int prom_node; /* OBP node of this device */ - char prom_name[64]; /* OBP device name property */ - int slot; /* SBUS slot number */ + struct of_device ofdev; + struct sbus_bus *bus; + struct sbus_dev *next; + struct sbus_dev *child; + struct sbus_dev *parent; + int prom_node; + char prom_name[64]; + int slot; struct resource resource[PROMREG_MAX]; struct linux_prom_registers reg_addrs[PROMREG_MAX]; - int num_registers, ranges_applied; + int num_registers; struct linux_prom_ranges device_ranges[PROMREG_MAX]; int num_device_ranges; @@ -61,9 +64,11 @@ struct sbus_dev { unsigned int irqs[4]; int num_irqs; }; +#define to_sbus_device(d) container_of(d, struct sbus_dev, ofdev.dev) /* This struct describes the SBus(s) found on this machine. */ struct sbus_bus { + struct of_device ofdev; void *iommu; /* Opaque IOMMU cookie */ struct sbus_dev *devices; /* Tree of SBUS devices */ struct sbus_bus *next; /* Next SBUS in system */ @@ -75,8 +80,8 @@ struct sbus_bus { int num_sbus_ranges; int portid; - void *starfire_cookie; }; +#define to_sbus(d) container_of(d, struct sbus_bus, ofdev.dev) extern struct sbus_bus *sbus_root; @@ -95,6 +100,7 @@ extern struct sbus_bus *sbus_root; #define sbus_can_dma_64bit(sdev) (1) #define sbus_can_burst64(sdev) (1) extern void sbus_set_sbus64(struct sbus_dev *, int); +extern void sbus_fill_device_irq(struct sbus_dev *); /* These yield IOMMU mappings in consistent mode. */ extern void *sbus_alloc_consistent(struct sbus_dev *, size_t, dma_addr_t *dma_addrp); @@ -119,4 +125,10 @@ extern void sbus_dma_sync_sg_for_cpu(struct sbus_dev *, struct scatterlist *, in #define sbus_dma_sync_sg sbus_dma_sync_sg_for_cpu extern void sbus_dma_sync_sg_for_device(struct sbus_dev *, struct scatterlist *, int, int); +extern void sbus_arch_bus_ranges_init(struct device_node *, struct sbus_bus *); +extern void sbus_setup_iommu(struct sbus_bus *, struct device_node *); +extern void sbus_setup_arch_props(struct sbus_bus *, struct device_node *); +extern int sbus_arch_preinit(void); +extern void sbus_arch_postinit(void); + #endif /* !(_SPARC64_SBUS_H) */ diff --git a/include/asm-sparc64/shmparam.h b/include/asm-sparc64/shmparam.h index 8c66fded8..911d0427d 100644 --- a/include/asm-sparc64/shmparam.h +++ b/include/asm-sparc64/shmparam.h @@ -1,6 +1,7 @@ /* $Id: shmparam.h,v 1.5 2001/09/24 21:17:57 kanoj Exp $ */ #ifndef _ASMSPARC64_SHMPARAM_H #define _ASMSPARC64_SHMPARAM_H +#ifdef __KERNEL__ #include @@ -8,4 +9,5 @@ /* attach addr a multiple of this */ #define SHMLBA ((PAGE_SIZE > L1DCACHE_SIZE) ? PAGE_SIZE : L1DCACHE_SIZE) +#endif /* __KERNEL__ */ #endif /* _ASMSPARC64_SHMPARAM_H */ diff --git a/include/asm-sparc64/siginfo.h b/include/asm-sparc64/siginfo.h index df17e47ab..c96e6c30f 100644 --- a/include/asm-sparc64/siginfo.h +++ b/include/asm-sparc64/siginfo.h @@ -11,7 +11,6 @@ #ifdef __KERNEL__ -#include #include #ifdef CONFIG_COMPAT diff --git a/include/asm-sparc64/signal.h b/include/asm-sparc64/signal.h index e3059bb4a..996887110 100644 --- a/include/asm-sparc64/signal.h +++ b/include/asm-sparc64/signal.h @@ -6,7 +6,6 @@ #ifdef __KERNEL__ #ifndef __ASSEMBLY__ -#include #include #include #include @@ -134,16 +133,13 @@ struct sigstack { * usage of signal stacks by using the (now obsolete) sa_restorer field in * the sigaction structure as a stack pointer. This is now possible due to * the changes in signal handling. LBT 010493. - * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_RESTART flag to get restarting signals (which were the default long ago) - * SA_SHIRQ flag is for shared interrupt support on PCI and EISA. */ #define SA_NOCLDSTOP _SV_IGNCHILD #define SA_STACK _SV_SSTACK #define SA_ONSTACK _SV_SSTACK #define SA_RESTART _SV_INTR #define SA_ONESHOT _SV_RESET -#define SA_INTERRUPT 0x10u #define SA_NOMASK 0x20u #define SA_NOCLDWAIT 0x100u #define SA_SIGINFO 0x200u diff --git a/include/asm-sparc64/smp.h b/include/asm-sparc64/smp.h index 89d86ecaa..388249b75 100644 --- a/include/asm-sparc64/smp.h +++ b/include/asm-sparc64/smp.h @@ -6,7 +6,6 @@ #ifndef _SPARC64_SMP_H #define _SPARC64_SMP_H -#include #include #include #include diff --git a/include/asm-sparc64/socket.h b/include/asm-sparc64/socket.h index 59987dad3..754d46a50 100644 --- a/include/asm-sparc64/socket.h +++ b/include/asm-sparc64/socket.h @@ -48,6 +48,7 @@ #define SCM_TIMESTAMP SO_TIMESTAMP #define SO_PEERSEC 0x001e +#define SO_PASSSEC 0x001f /* Security levels - as per NRL IPv6 - don't actually do anything */ #define SO_SECURITY_AUTHENTICATION 0x5001 diff --git a/include/asm-sparc64/spinlock.h b/include/asm-sparc64/spinlock.h index 508c416e9..bd5ffc76b 100644 --- a/include/asm-sparc64/spinlock.h +++ b/include/asm-sparc64/spinlock.h @@ -6,7 +6,6 @@ #ifndef __SPARC64_SPINLOCK_H #define __SPARC64_SPINLOCK_H -#include #include /* For NR_CPUS */ #ifndef __ASSEMBLY__ diff --git a/include/asm-sparc64/starfire.h b/include/asm-sparc64/starfire.h index b606cb2b3..48b50b5e3 100644 --- a/include/asm-sparc64/starfire.h +++ b/include/asm-sparc64/starfire.h @@ -14,7 +14,7 @@ extern int this_is_starfire; extern void check_if_starfire(void); extern void starfire_cpu_setup(void); extern int starfire_hard_smp_processor_id(void); -extern void *starfire_hookup(int); +extern void starfire_hookup(int); extern unsigned int starfire_translate(unsigned long imap, unsigned int upaid); #endif diff --git a/include/asm-sparc64/system.h b/include/asm-sparc64/system.h index a18ec87a5..a8b7432c9 100644 --- a/include/asm-sparc64/system.h +++ b/include/asm-sparc64/system.h @@ -2,7 +2,6 @@ #ifndef __SPARC64_SYSTEM_H #define __SPARC64_SYSTEM_H -#include #include #include #include @@ -124,8 +123,6 @@ do { __asm__ __volatile__("ba,pt %%xcc, 1f\n\t" \ #define read_barrier_depends() do { } while(0) #define set_mb(__var, __value) \ do { __var = __value; membar_storeload_storestore(); } while(0) -#define set_wmb(__var, __value) \ - do { __var = __value; wmb(); } while(0) #ifdef CONFIG_SMP #define smp_mb() mb() diff --git a/include/asm-sparc64/timer.h b/include/asm-sparc64/timer.h index edc8e08c3..d435594df 100644 --- a/include/asm-sparc64/timer.h +++ b/include/asm-sparc64/timer.h @@ -9,7 +9,6 @@ #include -#include struct sparc64_tick_ops { void (*init_tick)(unsigned long); diff --git a/include/asm-sparc64/tlb.h b/include/asm-sparc64/tlb.h index 41a5d1c70..68546bf3a 100644 --- a/include/asm-sparc64/tlb.h +++ b/include/asm-sparc64/tlb.h @@ -1,7 +1,6 @@ #ifndef _SPARC64_TLB_H #define _SPARC64_TLB_H -#include #include #include #include diff --git a/include/asm-sparc64/tlbflush.h b/include/asm-sparc64/tlbflush.h index e3a7c453b..348732857 100644 --- a/include/asm-sparc64/tlbflush.h +++ b/include/asm-sparc64/tlbflush.h @@ -1,7 +1,6 @@ #ifndef _SPARC64_TLBFLUSH_H #define _SPARC64_TLBFLUSH_H -#include #include #include diff --git a/include/asm-sparc64/topology.h b/include/asm-sparc64/topology.h index 0e234e201..98a6c6135 100644 --- a/include/asm-sparc64/topology.h +++ b/include/asm-sparc64/topology.h @@ -1,6 +1,9 @@ #ifndef _ASM_SPARC64_TOPOLOGY_H #define _ASM_SPARC64_TOPOLOGY_H +#include +#define smt_capable() (tlb_type == hypervisor) + #include #endif /* _ASM_SPARC64_TOPOLOGY_H */ diff --git a/include/asm-sparc64/ttable.h b/include/asm-sparc64/ttable.h index 2d5e3c464..f2352606a 100644 --- a/include/asm-sparc64/ttable.h +++ b/include/asm-sparc64/ttable.h @@ -2,7 +2,6 @@ #ifndef _SPARC64_TTABLE_H #define _SPARC64_TTABLE_H -#include #include #ifdef __ASSEMBLY__ diff --git a/include/asm-sparc64/unistd.h b/include/asm-sparc64/unistd.h index 5a3f7b1c1..fc28b349e 100644 --- a/include/asm-sparc64/unistd.h +++ b/include/asm-sparc64/unistd.h @@ -321,6 +321,7 @@ #define __NR_set_robust_list 300 #define __NR_get_robust_list 301 +#ifdef __KERNEL__ /* WARNING: You MAY NOT add syscall numbers larger than 301, since * all of the syscall tables in the Sparc kernel are * sized to have 301 entries (starting at zero). Therefore @@ -487,7 +488,6 @@ asmlinkage long sys_rt_sigaction(int sig, #endif /* __KERNEL_SYSCALLS__ */ -#ifdef __KERNEL__ /* sysconf options, for SunOS compatibility */ #define _SC_ARG_MAX 1 #define _SC_CHILD_MAX 2 @@ -521,7 +521,6 @@ asmlinkage long sys_rt_sigaction(int sig, #define __ARCH_WANT_SYS_SIGPROCMASK #define __ARCH_WANT_SYS_RT_SIGSUSPEND #define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND -#endif /* * "Conditional" syscalls @@ -531,4 +530,5 @@ asmlinkage long sys_rt_sigaction(int sig, */ #define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") +#endif /* __KERNEL__ */ #endif /* _SPARC64_UNISTD_H */ diff --git a/include/asm-sparc64/vdev.h b/include/asm-sparc64/vdev.h deleted file mode 100644 index 996e6be7b..000000000 --- a/include/asm-sparc64/vdev.h +++ /dev/null @@ -1,16 +0,0 @@ -/* vdev.h: SUN4V virtual device interfaces and defines. - * - * Copyright (C) 2006 David S. Miller - */ - -#ifndef _SPARC64_VDEV_H -#define _SPARC64_VDEV_H - -#include - -extern u32 sun4v_vdev_devhandle; -extern int sun4v_vdev_root; - -extern unsigned int sun4v_vdev_device_interrupt(unsigned int); - -#endif /* !(_SPARC64_VDEV_H) */ diff --git a/include/asm-sparc64/vga.h b/include/asm-sparc64/vga.h index 9c57eb363..c69d5b2ba 100644 --- a/include/asm-sparc64/vga.h +++ b/include/asm-sparc64/vga.h @@ -28,6 +28,6 @@ static inline u16 scr_readw(const u16 *addr) return *addr; } -#define VGA_MAP_MEM(x) (x) +#define VGA_MAP_MEM(x,s) (x) #endif diff --git a/include/asm-um/a.out.h b/include/asm-um/a.out.h index 7c26265e1..50cee7b29 100644 --- a/include/asm-um/a.out.h +++ b/include/asm-um/a.out.h @@ -1,7 +1,6 @@ #ifndef __UM_A_OUT_H #define __UM_A_OUT_H -#include "linux/config.h" #include "asm/arch/a.out.h" #include "choose-mode.h" diff --git a/include/asm-um/cache.h b/include/asm-um/cache.h index 3d0587075..19e1bdd67 100644 --- a/include/asm-um/cache.h +++ b/include/asm-um/cache.h @@ -1,7 +1,6 @@ #ifndef __UM_CACHE_H #define __UM_CACHE_H -#include #if defined(CONFIG_UML_X86) && !defined(CONFIG_64BIT) # define L1_CACHE_SHIFT (CONFIG_X86_L1_CACHE_SHIFT) diff --git a/include/asm-um/elf-ppc.h b/include/asm-um/elf-ppc.h index 2998cf925..99711134e 100644 --- a/include/asm-um/elf-ppc.h +++ b/include/asm-um/elf-ppc.h @@ -1,7 +1,6 @@ #ifndef __UM_ELF_PPC_H #define __UM_ELF_PPC_H -#include "linux/config.h" extern long elf_aux_hwcap; #define ELF_HWCAP (elf_aux_hwcap) diff --git a/include/asm-um/fixmap.h b/include/asm-um/fixmap.h index ae0ca3932..d352a35cf 100644 --- a/include/asm-um/fixmap.h +++ b/include/asm-um/fixmap.h @@ -1,7 +1,6 @@ #ifndef __UM_FIXMAP_H #define __UM_FIXMAP_H -#include #include #include #include diff --git a/include/asm-um/hardirq.h b/include/asm-um/hardirq.h index 1224b2690..313ebb8a2 100644 --- a/include/asm-um/hardirq.h +++ b/include/asm-um/hardirq.h @@ -3,7 +3,6 @@ #ifndef __ASM_UM_HARDIRQ_H #define __ASM_UM_HARDIRQ_H -#include #include #include diff --git a/include/asm-um/hw_irq.h b/include/asm-um/hw_irq.h index 4ee38c0b6..1cf84cf5f 100644 --- a/include/asm-um/hw_irq.h +++ b/include/asm-um/hw_irq.h @@ -4,7 +4,4 @@ #include "asm/irq.h" #include "asm/archparam.h" -static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) -{} - #endif diff --git a/include/asm-um/io.h b/include/asm-um/io.h index 1934d9340..44e8b8c77 100644 --- a/include/asm-um/io.h +++ b/include/asm-um/io.h @@ -45,8 +45,13 @@ static inline void writel(unsigned int b, volatile void __iomem *addr) { *(volatile unsigned int __force *) addr = b; } +static inline void writeq(unsigned int b, volatile void __iomem *addr) +{ + *(volatile unsigned long long __force *) addr = b; +} #define __raw_writeb writeb #define __raw_writew writew #define __raw_writel writel +#define __raw_writeq writeq #endif diff --git a/include/asm-um/kmap_types.h b/include/asm-um/kmap_types.h index 0b22ad776..6c03acdb4 100644 --- a/include/asm-um/kmap_types.h +++ b/include/asm-um/kmap_types.h @@ -6,6 +6,24 @@ #ifndef __UM_KMAP_TYPES_H #define __UM_KMAP_TYPES_H -#include "asm/arch/kmap_types.h" +/* No more #include "asm/arch/kmap_types.h" ! */ + +enum km_type { + KM_BOUNCE_READ, + KM_SKB_SUNRPC_DATA, + KM_SKB_DATA_SOFTIRQ, + KM_USER0, + KM_USER1, + KM_UML_USERCOPY, /* UML specific, for copy_*_user - used in do_op_one_page */ + KM_BIO_SRC_IRQ, + KM_BIO_DST_IRQ, + KM_PTE0, + KM_PTE1, + KM_IRQ0, + KM_IRQ1, + KM_SOFTIRQ0, + KM_SOFTIRQ1, + KM_TYPE_NR +}; #endif diff --git a/include/asm-um/linkage.h b/include/asm-um/linkage.h index e3d62dcbd..78b862472 100644 --- a/include/asm-um/linkage.h +++ b/include/asm-um/linkage.h @@ -3,7 +3,6 @@ #include "asm/arch/linkage.h" -#include /* will pick sane defaults */ #ifdef CONFIG_GPROF diff --git a/include/asm-um/mmu_context.h b/include/asm-um/mmu_context.h index 9a0e48eb5..f709c784b 100644 --- a/include/asm-um/mmu_context.h +++ b/include/asm-um/mmu_context.h @@ -7,7 +7,6 @@ #define __UM_MMU_CONTEXT_H #include "linux/sched.h" -#include "linux/config.h" #include "choose-mode.h" #include "um_mmu.h" diff --git a/include/asm-um/page.h b/include/asm-um/page.h index 459311435..b5b65d4a4 100644 --- a/include/asm-um/page.h +++ b/include/asm-um/page.h @@ -9,7 +9,6 @@ struct page; -#include #include /* PAGE_SHIFT determines the page size */ diff --git a/include/asm-um/pgalloc.h b/include/asm-um/pgalloc.h index 45564e3c9..937f9cf2a 100644 --- a/include/asm-um/pgalloc.h +++ b/include/asm-um/pgalloc.h @@ -8,7 +8,6 @@ #ifndef __UM_PGALLOC_H #define __UM_PGALLOC_H -#include "linux/config.h" #include "linux/mm.h" #include "asm/fixmap.h" diff --git a/include/asm-um/processor-generic.h b/include/asm-um/processor-generic.h index da07a69ce..824c28896 100644 --- a/include/asm-um/processor-generic.h +++ b/include/asm-um/processor-generic.h @@ -10,7 +10,6 @@ struct pt_regs; struct task_struct; -#include "linux/config.h" #include "asm/ptrace.h" #include "choose-mode.h" #include "registers.h" diff --git a/include/asm-um/ptrace-generic.h b/include/asm-um/ptrace-generic.h index 503484305..a36f5371b 100644 --- a/include/asm-um/ptrace-generic.h +++ b/include/asm-um/ptrace-generic.h @@ -8,7 +8,6 @@ #ifndef __ASSEMBLY__ -#include "linux/config.h" #define pt_regs pt_regs_subarch #define show_regs show_regs_subarch diff --git a/include/asm-um/smp.h b/include/asm-um/smp.h index aeda6657f..ca552261e 100644 --- a/include/asm-um/smp.h +++ b/include/asm-um/smp.h @@ -3,7 +3,6 @@ #ifdef CONFIG_SMP -#include "linux/config.h" #include "linux/bitops.h" #include "asm/current.h" #include "linux/cpumask.h" diff --git a/include/asm-um/thread_info.h b/include/asm-um/thread_info.h index f166b9837..261e2f452 100644 --- a/include/asm-um/thread_info.h +++ b/include/asm-um/thread_info.h @@ -8,7 +8,6 @@ #ifndef __ASSEMBLY__ -#include #include #include diff --git a/include/asm-v850/atomic.h b/include/asm-v850/atomic.h index 166df0045..e4e57de08 100644 --- a/include/asm-v850/atomic.h +++ b/include/asm-v850/atomic.h @@ -14,7 +14,6 @@ #ifndef __V850_ATOMIC_H__ #define __V850_ATOMIC_H__ -#include #include diff --git a/include/asm-v850/bitops.h b/include/asm-v850/bitops.h index 1f6fd5ab4..1fa99baf4 100644 --- a/include/asm-v850/bitops.h +++ b/include/asm-v850/bitops.h @@ -14,7 +14,6 @@ #define __V850_BITOPS_H__ -#include #include /* unlikely */ #include /* swab32 */ #include /* interrupt enable/disable */ diff --git a/include/asm-v850/dma-mapping.h b/include/asm-v850/dma-mapping.h index c63fb50ec..1cc42c603 100644 --- a/include/asm-v850/dma-mapping.h +++ b/include/asm-v850/dma-mapping.h @@ -1,7 +1,6 @@ #ifndef __V850_DMA_MAPPING_H__ #define __V850_DMA_MAPPING_H__ -#include #ifdef CONFIG_PCI #include diff --git a/include/asm-v850/hardirq.h b/include/asm-v850/hardirq.h index d98488cd5..04e20127c 100644 --- a/include/asm-v850/hardirq.h +++ b/include/asm-v850/hardirq.h @@ -1,7 +1,6 @@ #ifndef __V850_HARDIRQ_H__ #define __V850_HARDIRQ_H__ -#include #include #include diff --git a/include/asm-v850/hw_irq.h b/include/asm-v850/hw_irq.h index a8aab4342..043e94bb6 100644 --- a/include/asm-v850/hw_irq.h +++ b/include/asm-v850/hw_irq.h @@ -1,8 +1,4 @@ #ifndef __V850_HW_IRQ_H__ #define __V850_HW_IRQ_H__ -static inline void hw_resend_irq (struct hw_interrupt_type *h, unsigned int i) -{ -} - #endif /* __V850_HW_IRQ_H__ */ diff --git a/include/asm-v850/irq.h b/include/asm-v850/irq.h index 44431152b..1bf096db8 100644 --- a/include/asm-v850/irq.h +++ b/include/asm-v850/irq.h @@ -62,8 +62,6 @@ extern void disable_irq (unsigned int irq); /* Disable an irq without waiting. */ extern void disable_irq_nosync (unsigned int irq); -extern int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *); - #endif /* !__ASSEMBLY__ */ #endif /* __V850_IRQ_H__ */ diff --git a/include/asm-v850/machdep.h b/include/asm-v850/machdep.h index 98d8bf639..f1e3b8b91 100644 --- a/include/asm-v850/machdep.h +++ b/include/asm-v850/machdep.h @@ -14,7 +14,6 @@ #ifndef __V850_MACHDEP_H__ #define __V850_MACHDEP_H__ -#include /* chips */ #ifdef CONFIG_V850E_MA1 diff --git a/include/asm-v850/page.h b/include/asm-v850/page.h index 6ac5ba307..018f2675f 100644 --- a/include/asm-v850/page.h +++ b/include/asm-v850/page.h @@ -14,6 +14,8 @@ #ifndef __V850_PAGE_H__ #define __V850_PAGE_H__ +#ifdef __KERNEL__ + #include @@ -32,7 +34,6 @@ #endif -#ifdef __KERNEL__ #ifndef __ASSEMBLY__ #define STRICT_MM_TYPECHECKS @@ -122,11 +123,11 @@ typedef unsigned long pgprot_t; #define __va(x) ((void *)__phys_to_virt ((unsigned long)(x))) +#include +#include + #define devmem_is_allowed(x) 1 #endif /* KERNEL */ -#include -#include - #endif /* __V850_PAGE_H__ */ diff --git a/include/asm-v850/param.h b/include/asm-v850/param.h index 8d796e4bf..3c65bd573 100644 --- a/include/asm-v850/param.h +++ b/include/asm-v850/param.h @@ -14,8 +14,6 @@ #ifndef __V850_PARAM_H__ #define __V850_PARAM_H__ -#include /* For HZ */ - #define EXEC_PAGESIZE 4096 #ifndef NOGROUP @@ -25,6 +23,8 @@ #define MAXHOSTNAMELEN 64 /* max length of hostname */ #ifdef __KERNEL__ +#include /* For HZ */ + # define USER_HZ 100 # define CLOCKS_PER_SEC USER_HZ #endif diff --git a/include/asm-v850/pgtable.h b/include/asm-v850/pgtable.h index 3cf8775ce..1ea2a900f 100644 --- a/include/asm-v850/pgtable.h +++ b/include/asm-v850/pgtable.h @@ -3,7 +3,6 @@ #include -#include #include diff --git a/include/asm-v850/processor.h b/include/asm-v850/processor.h index 2d3130893..979e3467f 100644 --- a/include/asm-v850/processor.h +++ b/include/asm-v850/processor.h @@ -14,11 +14,11 @@ #ifndef __V850_PROCESSOR_H__ #define __V850_PROCESSOR_H__ -#include #ifndef __ASSEMBLY__ /* is not asm-safe. */ #include #endif +#include #include #include @@ -107,7 +107,7 @@ unsigned long get_wchan (struct task_struct *p); #define KSTK_ESP(task) task_sp (task) -#define cpu_relax() ((void)0) +#define cpu_relax() barrier() #else /* __ASSEMBLY__ */ diff --git a/include/asm-v850/serial.h b/include/asm-v850/serial.h index 8c2a609ba..36d8f4cbb 100644 --- a/include/asm-v850/serial.h +++ b/include/asm-v850/serial.h @@ -6,7 +6,6 @@ * Copyright (C) 1999 by Ralf Baechle * Copyright (C) 1999, 2000 Silicon Graphics, Inc. */ -#include #ifdef CONFIG_RTE_CB_ME2 diff --git a/include/asm-v850/signal.h b/include/asm-v850/signal.h index cb52caa69..a38df0834 100644 --- a/include/asm-v850/signal.h +++ b/include/asm-v850/signal.h @@ -77,7 +77,6 @@ typedef unsigned long sigset_t; * SA_FLAGS values: * * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. * SA_RESETHAND clears the handler when the signal is delivered. @@ -97,7 +96,6 @@ typedef unsigned long sigset_t; #define SA_NOMASK SA_NODEFER #define SA_ONESHOT SA_RESETHAND -#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ #define SA_RESTORER 0x04000000 diff --git a/include/asm-v850/socket.h b/include/asm-v850/socket.h index 0240d366a..0dfe55ac2 100644 --- a/include/asm-v850/socket.h +++ b/include/asm-v850/socket.h @@ -48,5 +48,6 @@ #define SO_ACCEPTCONN 30 #define SO_PEERSEC 31 +#define SO_PASSSEC 34 #endif /* __V850_SOCKET_H__ */ diff --git a/include/asm-v850/system.h b/include/asm-v850/system.h index 7091af4b7..da39916f1 100644 --- a/include/asm-v850/system.h +++ b/include/asm-v850/system.h @@ -68,7 +68,6 @@ static inline int irqs_disabled (void) #define read_barrier_depends() ((void)0) #define set_rmb(var, value) do { xchg (&var, value); } while (0) #define set_mb(var, value) set_rmb (var, value) -#define set_wmb(var, value) do { var = value; wmb (); } while (0) #define smp_mb() mb () #define smp_rmb() rmb () diff --git a/include/asm-v850/unistd.h b/include/asm-v850/unistd.h index 82460a7bb..bcb44bfe5 100644 --- a/include/asm-v850/unistd.h +++ b/include/asm-v850/unistd.h @@ -14,8 +14,6 @@ #ifndef __V850_UNISTD_H__ #define __V850_UNISTD_H__ -#include - #define __NR_restart_syscall 0 #define __NR_exit 1 #define __NR_fork 2 @@ -237,10 +235,9 @@ except the syscall number (r12). */ #define SYSCALL_SHORT_CLOBBERS SYSCALL_CLOBBERS, "r13", "r14" +#ifdef __KERNEL__ -/* User programs sometimes end up including this header file - (indirectly, via uClibc header files), so I'm a bit nervous just - including . */ +#include #define __syscall_return(type, res) \ do { \ @@ -368,7 +365,6 @@ type name (atype a, btype b, ctype c, dtype d, etype e, ftype f) \ } -#ifdef __KERNEL__ #define __ARCH_WANT_IPC_PARSE_VERSION #define __ARCH_WANT_OLD_READDIR #define __ARCH_WANT_STAT64 @@ -389,7 +385,6 @@ type name (atype a, btype b, ctype c, dtype d, etype e, ftype f) \ #define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPROCMASK #define __ARCH_WANT_SYS_RT_SIGACTION -#endif #ifdef __KERNEL_SYSCALLS__ @@ -440,7 +435,7 @@ asmlinkage long sys_rt_sigaction(int sig, struct sigaction __user *oact, size_t sigsetsize); -#endif +#endif /* __KERNEL_SYSCALLS__ */ /* * "Conditional" syscalls @@ -455,4 +450,5 @@ asmlinkage long sys_rt_sigaction(int sig, void name (void) __attribute__ ((weak, alias ("sys_ni_syscall"))); #endif +#endif /* __KERNEL__ */ #endif /* __V850_UNISTD_H__ */ diff --git a/include/asm-v850/v850e_uart.h b/include/asm-v850/v850e_uart.h index 5930d5990..5182fb4cc 100644 --- a/include/asm-v850/v850e_uart.h +++ b/include/asm-v850/v850e_uart.h @@ -19,7 +19,6 @@ #ifndef __V850_V850E_UART_H__ #define __V850_V850E_UART_H__ -#include #include #include diff --git a/include/asm-x86_64/acpi.h b/include/asm-x86_64/acpi.h index aa1c7b2e4..2c95a319c 100644 --- a/include/asm-x86_64/acpi.h +++ b/include/asm-x86_64/acpi.h @@ -162,6 +162,8 @@ extern int acpi_pci_disabled; extern u8 x86_acpiid_to_apicid[]; +#define ARCH_HAS_POWER_INIT 1 + extern int acpi_skip_timer_override; #endif /*__KERNEL__*/ diff --git a/include/asm-x86_64/apic.h b/include/asm-x86_64/apic.h index 79db75f17..309cee961 100644 --- a/include/asm-x86_64/apic.h +++ b/include/asm-x86_64/apic.h @@ -1,7 +1,6 @@ #ifndef __ASM_APIC_H #define __ASM_APIC_H -#include #include #include #include @@ -50,7 +49,8 @@ static __inline unsigned int apic_read(unsigned long reg) static __inline__ void apic_wait_icr_idle(void) { - while ( apic_read( APIC_ICR ) & APIC_ICR_BUSY ); + while (apic_read( APIC_ICR ) & APIC_ICR_BUSY) + cpu_relax(); } static inline void ack_APIC_irq(void) @@ -80,30 +80,23 @@ extern void init_apic_mappings (void); extern void smp_local_timer_interrupt (struct pt_regs * regs); extern void setup_boot_APIC_clock (void); extern void setup_secondary_APIC_clock (void); -extern void setup_apic_nmi_watchdog (void); -extern int reserve_lapic_nmi(void); -extern void release_lapic_nmi(void); -extern void disable_timer_nmi_watchdog(void); -extern void enable_timer_nmi_watchdog(void); -extern void nmi_watchdog_tick (struct pt_regs * regs, unsigned reason); extern int APIC_init_uniprocessor (void); extern void disable_APIC_timer(void); extern void enable_APIC_timer(void); extern void clustered_apic_check(void); -extern void nmi_watchdog_default(void); -extern int setup_nmi_watchdog(char *); +extern void setup_APIC_extened_lvt(unsigned char lvt_off, unsigned char vector, + unsigned char msg_type, unsigned char mask); -extern unsigned int nmi_watchdog; -#define NMI_DEFAULT -1 -#define NMI_NONE 0 -#define NMI_IO_APIC 1 -#define NMI_LOCAL_APIC 2 -#define NMI_INVALID 3 +#define K8_APIC_EXT_LVT_BASE 0x500 +#define K8_APIC_EXT_INT_MSG_FIX 0x0 +#define K8_APIC_EXT_INT_MSG_SMI 0x2 +#define K8_APIC_EXT_INT_MSG_NMI 0x4 +#define K8_APIC_EXT_INT_MSG_EXT 0x7 +#define K8_APIC_EXT_LVT_ENTRY_THRESHOLD 0 extern int disable_timer_pin_1; -extern void setup_threshold_lvt(unsigned long lvt_off); #ifndef CONFIG_XEN void smp_send_timer_broadcast_ipi(void); diff --git a/include/asm-x86_64/apicdef.h b/include/asm-x86_64/apicdef.h index 5a48e9bcf..1dd40067c 100644 --- a/include/asm-x86_64/apicdef.h +++ b/include/asm-x86_64/apicdef.h @@ -137,8 +137,6 @@ */ #define u32 unsigned int -#define lapic ((volatile struct local_apic *)APIC_BASE) - struct local_apic { /*000*/ struct { u32 __reserved[4]; } __reserved_01; diff --git a/include/asm-x86_64/atomic.h b/include/asm-x86_64/atomic.h index cecbf7baa..007e88d6d 100644 --- a/include/asm-x86_64/atomic.h +++ b/include/asm-x86_64/atomic.h @@ -1,8 +1,7 @@ #ifndef __ARCH_X86_64_ATOMIC__ #define __ARCH_X86_64_ATOMIC__ -#include -#include +#include /* atomic_t should be 32 bit signed type */ @@ -53,7 +52,7 @@ typedef struct { volatile int counter; } atomic_t; static __inline__ void atomic_add(int i, atomic_t *v) { __asm__ __volatile__( - LOCK "addl %1,%0" + LOCK_PREFIX "addl %1,%0" :"=m" (v->counter) :"ir" (i), "m" (v->counter)); } @@ -68,7 +67,7 @@ static __inline__ void atomic_add(int i, atomic_t *v) static __inline__ void atomic_sub(int i, atomic_t *v) { __asm__ __volatile__( - LOCK "subl %1,%0" + LOCK_PREFIX "subl %1,%0" :"=m" (v->counter) :"ir" (i), "m" (v->counter)); } @@ -87,7 +86,7 @@ static __inline__ int atomic_sub_and_test(int i, atomic_t *v) unsigned char c; __asm__ __volatile__( - LOCK "subl %2,%0; sete %1" + LOCK_PREFIX "subl %2,%0; sete %1" :"=m" (v->counter), "=qm" (c) :"ir" (i), "m" (v->counter) : "memory"); return c; @@ -102,7 +101,7 @@ static __inline__ int atomic_sub_and_test(int i, atomic_t *v) static __inline__ void atomic_inc(atomic_t *v) { __asm__ __volatile__( - LOCK "incl %0" + LOCK_PREFIX "incl %0" :"=m" (v->counter) :"m" (v->counter)); } @@ -116,7 +115,7 @@ static __inline__ void atomic_inc(atomic_t *v) static __inline__ void atomic_dec(atomic_t *v) { __asm__ __volatile__( - LOCK "decl %0" + LOCK_PREFIX "decl %0" :"=m" (v->counter) :"m" (v->counter)); } @@ -134,7 +133,7 @@ static __inline__ int atomic_dec_and_test(atomic_t *v) unsigned char c; __asm__ __volatile__( - LOCK "decl %0; sete %1" + LOCK_PREFIX "decl %0; sete %1" :"=m" (v->counter), "=qm" (c) :"m" (v->counter) : "memory"); return c != 0; @@ -153,7 +152,7 @@ static __inline__ int atomic_inc_and_test(atomic_t *v) unsigned char c; __asm__ __volatile__( - LOCK "incl %0; sete %1" + LOCK_PREFIX "incl %0; sete %1" :"=m" (v->counter), "=qm" (c) :"m" (v->counter) : "memory"); return c != 0; @@ -173,7 +172,7 @@ static __inline__ int atomic_add_negative(int i, atomic_t *v) unsigned char c; __asm__ __volatile__( - LOCK "addl %2,%0; sets %1" + LOCK_PREFIX "addl %2,%0; sets %1" :"=m" (v->counter), "=qm" (c) :"ir" (i), "m" (v->counter) : "memory"); return c; @@ -190,7 +189,7 @@ static __inline__ int atomic_add_return(int i, atomic_t *v) { int __i = i; __asm__ __volatile__( - LOCK "xaddl %0, %1;" + LOCK_PREFIX "xaddl %0, %1;" :"=r"(i) :"m"(v->counter), "0"(i)); return i + __i; @@ -238,7 +237,7 @@ typedef struct { volatile long counter; } atomic64_t; static __inline__ void atomic64_add(long i, atomic64_t *v) { __asm__ __volatile__( - LOCK "addq %1,%0" + LOCK_PREFIX "addq %1,%0" :"=m" (v->counter) :"ir" (i), "m" (v->counter)); } @@ -253,7 +252,7 @@ static __inline__ void atomic64_add(long i, atomic64_t *v) static __inline__ void atomic64_sub(long i, atomic64_t *v) { __asm__ __volatile__( - LOCK "subq %1,%0" + LOCK_PREFIX "subq %1,%0" :"=m" (v->counter) :"ir" (i), "m" (v->counter)); } @@ -272,7 +271,7 @@ static __inline__ int atomic64_sub_and_test(long i, atomic64_t *v) unsigned char c; __asm__ __volatile__( - LOCK "subq %2,%0; sete %1" + LOCK_PREFIX "subq %2,%0; sete %1" :"=m" (v->counter), "=qm" (c) :"ir" (i), "m" (v->counter) : "memory"); return c; @@ -287,7 +286,7 @@ static __inline__ int atomic64_sub_and_test(long i, atomic64_t *v) static __inline__ void atomic64_inc(atomic64_t *v) { __asm__ __volatile__( - LOCK "incq %0" + LOCK_PREFIX "incq %0" :"=m" (v->counter) :"m" (v->counter)); } @@ -301,7 +300,7 @@ static __inline__ void atomic64_inc(atomic64_t *v) static __inline__ void atomic64_dec(atomic64_t *v) { __asm__ __volatile__( - LOCK "decq %0" + LOCK_PREFIX "decq %0" :"=m" (v->counter) :"m" (v->counter)); } @@ -319,7 +318,7 @@ static __inline__ int atomic64_dec_and_test(atomic64_t *v) unsigned char c; __asm__ __volatile__( - LOCK "decq %0; sete %1" + LOCK_PREFIX "decq %0; sete %1" :"=m" (v->counter), "=qm" (c) :"m" (v->counter) : "memory"); return c != 0; @@ -338,7 +337,7 @@ static __inline__ int atomic64_inc_and_test(atomic64_t *v) unsigned char c; __asm__ __volatile__( - LOCK "incq %0; sete %1" + LOCK_PREFIX "incq %0; sete %1" :"=m" (v->counter), "=qm" (c) :"m" (v->counter) : "memory"); return c != 0; @@ -358,7 +357,7 @@ static __inline__ int atomic64_add_negative(long i, atomic64_t *v) unsigned char c; __asm__ __volatile__( - LOCK "addq %2,%0; sets %1" + LOCK_PREFIX "addq %2,%0; sets %1" :"=m" (v->counter), "=qm" (c) :"ir" (i), "m" (v->counter) : "memory"); return c; @@ -375,7 +374,7 @@ static __inline__ long atomic64_add_return(long i, atomic64_t *v) { long __i = i; __asm__ __volatile__( - LOCK "xaddq %0, %1;" + LOCK_PREFIX "xaddq %0, %1;" :"=r"(i) :"m"(v->counter), "0"(i)); return i + __i; @@ -419,11 +418,11 @@ static __inline__ long atomic64_sub_return(long i, atomic64_t *v) /* These are x86-specific, used by some header files */ #define atomic_clear_mask(mask, addr) \ -__asm__ __volatile__(LOCK "andl %0,%1" \ +__asm__ __volatile__(LOCK_PREFIX "andl %0,%1" \ : : "r" (~(mask)),"m" (*addr) : "memory") #define atomic_set_mask(mask, addr) \ -__asm__ __volatile__(LOCK "orl %0,%1" \ +__asm__ __volatile__(LOCK_PREFIX "orl %0,%1" \ : : "r" ((unsigned)mask),"m" (*(addr)) : "memory") /* Atomic operations are already serializing on x86 */ diff --git a/include/asm-x86_64/bitops.h b/include/asm-x86_64/bitops.h index 79212128d..f7ba57b1c 100644 --- a/include/asm-x86_64/bitops.h +++ b/include/asm-x86_64/bitops.h @@ -5,13 +5,7 @@ * Copyright 1992, Linus Torvalds. */ -#include - -#ifdef CONFIG_SMP -#define LOCK_PREFIX "lock ; " -#else -#define LOCK_PREFIX "" -#endif +#include #define ADDR (*(volatile long *) addr) diff --git a/include/asm-x86_64/bugs.h b/include/asm-x86_64/bugs.h index 59bc68925..d86c5dd68 100644 --- a/include/asm-x86_64/bugs.h +++ b/include/asm-x86_64/bugs.h @@ -10,7 +10,6 @@ * void check_bugs(void); */ -#include #include #include #include diff --git a/include/asm-x86_64/cache.h b/include/asm-x86_64/cache.h index f8dff1c67..ed8a9d252 100644 --- a/include/asm-x86_64/cache.h +++ b/include/asm-x86_64/cache.h @@ -4,7 +4,6 @@ #ifndef __ARCH_X8664_CACHE_H #define __ARCH_X8664_CACHE_H -#include /* L1 cache line size */ #define L1_CACHE_SHIFT (CONFIG_X86_L1_CACHE_SHIFT) diff --git a/include/asm-x86_64/calling.h b/include/asm-x86_64/calling.h index fc2c5a6c2..6f4f63af9 100644 --- a/include/asm-x86_64/calling.h +++ b/include/asm-x86_64/calling.h @@ -2,7 +2,6 @@ * Some macros to handle stack frames in assembly. */ -#include #define R15 0 #define R14 8 diff --git a/include/asm-x86_64/cpufeature.h b/include/asm-x86_64/cpufeature.h index 662964b74..ee792faac 100644 --- a/include/asm-x86_64/cpufeature.h +++ b/include/asm-x86_64/cpufeature.h @@ -46,6 +46,7 @@ #define X86_FEATURE_SYSCALL (1*32+11) /* SYSCALL/SYSRET */ #define X86_FEATURE_MMXEXT (1*32+22) /* AMD MMX extensions */ #define X86_FEATURE_FXSR_OPT (1*32+25) /* FXSR optimizations */ +#define X86_FEATURE_RDTSCP (1*32+27) /* RDTSCP */ #define X86_FEATURE_LM (1*32+29) /* Long Mode (x86-64) */ #define X86_FEATURE_3DNOWEXT (1*32+30) /* AMD 3DNow! extensions */ #define X86_FEATURE_3DNOW (1*32+31) /* 3DNow! */ @@ -65,6 +66,8 @@ #define X86_FEATURE_CONSTANT_TSC (3*32+5) /* TSC runs at constant rate */ #define X86_FEATURE_SYNC_RDTSC (3*32+6) /* RDTSC syncs CPU core */ #define X86_FEATURE_FXSAVE_LEAK (3*32+7) /* FIP/FOP/FDP leaks through FXSAVE */ +#define X86_FEATURE_UP (3*32+8) /* SMP kernel running on UP */ +#define X86_FEATURE_ARCH_PERFMON (3*32+9) /* Intel Architectural PerfMon */ /* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */ #define X86_FEATURE_XMM3 (4*32+ 0) /* Streaming SIMD Extensions-3 */ diff --git a/include/asm-x86_64/dma-mapping.h b/include/asm-x86_64/dma-mapping.h index 49a81a665..b6da83dcc 100644 --- a/include/asm-x86_64/dma-mapping.h +++ b/include/asm-x86_64/dma-mapping.h @@ -6,7 +6,6 @@ * documentation. */ -#include #include #include @@ -56,6 +55,13 @@ extern dma_addr_t bad_dma_address; extern struct dma_mapping_ops* dma_ops; extern int iommu_merge; +static inline int valid_dma_direction(int dma_direction) +{ + return ((dma_direction == DMA_BIDIRECTIONAL) || + (dma_direction == DMA_TO_DEVICE) || + (dma_direction == DMA_FROM_DEVICE)); +} + static inline int dma_mapping_error(dma_addr_t dma_addr) { if (dma_ops->mapping_error) @@ -73,6 +79,7 @@ static inline dma_addr_t dma_map_single(struct device *hwdev, void *ptr, size_t size, int direction) { + BUG_ON(!valid_dma_direction(direction)); return dma_ops->map_single(hwdev, ptr, size, direction); } @@ -80,6 +87,7 @@ static inline void dma_unmap_single(struct device *dev, dma_addr_t addr,size_t size, int direction) { + BUG_ON(!valid_dma_direction(direction)); dma_ops->unmap_single(dev, addr, size, direction); } @@ -92,6 +100,7 @@ static inline void dma_sync_single_for_cpu(struct device *hwdev, dma_addr_t dma_handle, size_t size, int direction) { + BUG_ON(!valid_dma_direction(direction)); if (dma_ops->sync_single_for_cpu) dma_ops->sync_single_for_cpu(hwdev, dma_handle, size, direction); @@ -102,6 +111,7 @@ static inline void dma_sync_single_for_device(struct device *hwdev, dma_addr_t dma_handle, size_t size, int direction) { + BUG_ON(!valid_dma_direction(direction)); if (dma_ops->sync_single_for_device) dma_ops->sync_single_for_device(hwdev, dma_handle, size, direction); @@ -112,6 +122,7 @@ static inline void dma_sync_single_range_for_cpu(struct device *hwdev, dma_addr_t dma_handle, unsigned long offset, size_t size, int direction) { + BUG_ON(!valid_dma_direction(direction)); if (dma_ops->sync_single_range_for_cpu) { dma_ops->sync_single_range_for_cpu(hwdev, dma_handle, offset, size, direction); } @@ -123,6 +134,7 @@ static inline void dma_sync_single_range_for_device(struct device *hwdev, dma_addr_t dma_handle, unsigned long offset, size_t size, int direction) { + BUG_ON(!valid_dma_direction(direction)); if (dma_ops->sync_single_range_for_device) dma_ops->sync_single_range_for_device(hwdev, dma_handle, offset, size, direction); @@ -134,6 +146,7 @@ static inline void dma_sync_sg_for_cpu(struct device *hwdev, struct scatterlist *sg, int nelems, int direction) { + BUG_ON(!valid_dma_direction(direction)); if (dma_ops->sync_sg_for_cpu) dma_ops->sync_sg_for_cpu(hwdev, sg, nelems, direction); flush_write_buffers(); @@ -143,6 +156,7 @@ static inline void dma_sync_sg_for_device(struct device *hwdev, struct scatterlist *sg, int nelems, int direction) { + BUG_ON(!valid_dma_direction(direction)); if (dma_ops->sync_sg_for_device) { dma_ops->sync_sg_for_device(hwdev, sg, nelems, direction); } @@ -153,6 +167,7 @@ dma_sync_sg_for_device(struct device *hwdev, struct scatterlist *sg, static inline int dma_map_sg(struct device *hwdev, struct scatterlist *sg, int nents, int direction) { + BUG_ON(!valid_dma_direction(direction)); return dma_ops->map_sg(hwdev, sg, nents, direction); } @@ -160,6 +175,7 @@ static inline void dma_unmap_sg(struct device *hwdev, struct scatterlist *sg, int nents, int direction) { + BUG_ON(!valid_dma_direction(direction)); dma_ops->unmap_sg(hwdev, sg, nents, direction); } diff --git a/include/asm-x86_64/dma.h b/include/asm-x86_64/dma.h index 6f2a817b6..a37c16f06 100644 --- a/include/asm-x86_64/dma.h +++ b/include/asm-x86_64/dma.h @@ -1,4 +1,4 @@ -/* $Id: dma.h,v 1.1.1.1 2001/04/19 20:00:38 ak Exp $ +/* * linux/include/asm/dma.h: Defines for using and allocating dma channels. * Written by Hennus Bergman, 1992. * High DMA channel support & info by Hannu Savolainen @@ -8,7 +8,6 @@ #ifndef _ASM_DMA_H #define _ASM_DMA_H -#include #include /* And spinlocks */ #include /* need byte IO */ #include diff --git a/include/asm-x86_64/dwarf2.h b/include/asm-x86_64/dwarf2.h index 07654bd15..0744db777 100644 --- a/include/asm-x86_64/dwarf2.h +++ b/include/asm-x86_64/dwarf2.h @@ -1,7 +1,6 @@ #ifndef _DWARF2_H #define _DWARF2_H 1 -#include #ifndef __ASSEMBLY__ #warning "asm/dwarf2.h should be only included in pure assembly files" diff --git a/include/asm-x86_64/e820.h b/include/asm-x86_64/e820.h index 670a3388e..f65674832 100644 --- a/include/asm-x86_64/e820.h +++ b/include/asm-x86_64/e820.h @@ -46,6 +46,7 @@ extern void setup_memory_region(void); extern void contig_e820_setup(void); extern unsigned long e820_end_of_ram(void); extern void e820_reserve_resources(void); +extern void e820_mark_nosave_regions(void); extern void e820_print_map(char *who); extern int e820_any_mapped(unsigned long start, unsigned long end, unsigned type); extern int e820_all_mapped(unsigned long start, unsigned long end, unsigned type); diff --git a/include/asm-x86_64/elf.h b/include/asm-x86_64/elf.h index b4f8f4a41..a406fcb1e 100644 --- a/include/asm-x86_64/elf.h +++ b/include/asm-x86_64/elf.h @@ -7,8 +7,6 @@ #include #include -#include -#include /* x86-64 relocation types */ #define R_X86_64_NONE 0 /* No reloc */ @@ -38,12 +36,6 @@ typedef elf_greg_t elf_gregset_t[ELF_NGREG]; typedef struct user_i387_struct elf_fpregset_t; -/* - * This is used to ensure we don't load something for the wrong architecture. - */ -#define elf_check_arch(x) \ - ((x)->e_machine == EM_X86_64) - /* * These are used to set parameters in the core dumps. */ @@ -51,6 +43,17 @@ typedef struct user_i387_struct elf_fpregset_t; #define ELF_DATA ELFDATA2LSB #define ELF_ARCH EM_X86_64 +#ifdef __KERNEL__ +#include +#include + +/* + * This is used to ensure we don't load something for the wrong architecture. + */ +#define elf_check_arch(x) \ + ((x)->e_machine == EM_X86_64) + + /* SVR4/i386 ABI (pages 3-31, 3-32) says that when the program starts %edx contains a pointer to a function which might be registered using `atexit'. This provides a mean for the dynamic linker to call DT_FINI functions for @@ -141,7 +144,6 @@ typedef struct user_i387_struct elf_fpregset_t; /* I'm not sure if we can use '-' here */ #define ELF_PLATFORM ("x86_64") -#ifdef __KERNEL__ extern void set_personality_64bit(void); #define SET_PERSONALITY(ex, ibcs2) set_personality_64bit() /* diff --git a/include/asm-x86_64/fixmap.h b/include/asm-x86_64/fixmap.h index 7b286bd21..0b4ffbd1a 100644 --- a/include/asm-x86_64/fixmap.h +++ b/include/asm-x86_64/fixmap.h @@ -11,7 +11,6 @@ #ifndef _ASM_FIXMAP_H #define _ASM_FIXMAP_H -#include #include #include #include diff --git a/include/asm-x86_64/floppy.h b/include/asm-x86_64/floppy.h index 52825ce68..32ff5d132 100644 --- a/include/asm-x86_64/floppy.h +++ b/include/asm-x86_64/floppy.h @@ -144,13 +144,11 @@ static int vdma_get_dma_residue(unsigned int dummy) static int fd_request_irq(void) { if(can_use_virtual_dma) - return request_irq(FLOPPY_IRQ, floppy_hardint,SA_INTERRUPT, - "floppy", NULL); + return request_irq(FLOPPY_IRQ, floppy_hardint, + IRQF_DISABLED, "floppy", NULL); else return request_irq(FLOPPY_IRQ, floppy_interrupt, - SA_INTERRUPT|SA_SAMPLE_RANDOM, - "floppy", NULL); - + IRQF_DISABLED, "floppy", NULL); } static unsigned long dma_mem_alloc(unsigned long size) diff --git a/include/asm-x86_64/fpu32.h b/include/asm-x86_64/fpu32.h index 4153db5c0..dce9f6f4b 100644 --- a/include/asm-x86_64/fpu32.h +++ b/include/asm-x86_64/fpu32.h @@ -7,4 +7,7 @@ int restore_i387_ia32(struct task_struct *tsk, struct _fpstate_ia32 __user *buf, int save_i387_ia32(struct task_struct *tsk, struct _fpstate_ia32 __user *buf, struct pt_regs *regs, int fsave); +int get_fpregs32(struct user_i387_ia32_struct *, struct task_struct *); +int set_fpregs32(struct task_struct *, const struct user_i387_ia32_struct *); + #endif diff --git a/include/asm-x86_64/gart-mapping.h b/include/asm-x86_64/gart-mapping.h deleted file mode 100644 index ada497b0b..000000000 --- a/include/asm-x86_64/gart-mapping.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _X8664_GART_MAPPING_H -#define _X8664_GART_MAPPING_H 1 - -#include -#include - -struct device; - -extern void* -gart_alloc_coherent(struct device *dev, size_t size, - dma_addr_t *dma_handle, gfp_t gfp); - -extern int -gart_dma_supported(struct device *hwdev, u64 mask); - -#endif /* _X8664_GART_MAPPING_H */ diff --git a/include/asm-x86_64/hardirq.h b/include/asm-x86_64/hardirq.h index 8689951e3..64a65ce2f 100644 --- a/include/asm-x86_64/hardirq.h +++ b/include/asm-x86_64/hardirq.h @@ -1,7 +1,6 @@ #ifndef __ASM_HARDIRQ_H #define __ASM_HARDIRQ_H -#include #include #include #include diff --git a/include/asm-x86_64/hpet.h b/include/asm-x86_64/hpet.h index 18ff7ee9e..b39098408 100644 --- a/include/asm-x86_64/hpet.h +++ b/include/asm-x86_64/hpet.h @@ -55,7 +55,7 @@ extern int is_hpet_enabled(void); extern int hpet_rtc_timer_init(void); -extern int oem_force_hpet_timer(void); +extern int apic_is_clustered_box(void); extern int hpet_use_timer; diff --git a/include/asm-x86_64/hw_irq.h b/include/asm-x86_64/hw_irq.h index 91f751ba0..48a4a5364 100644 --- a/include/asm-x86_64/hw_irq.h +++ b/include/asm-x86_64/hw_irq.h @@ -12,12 +12,9 @@ * * * hacked by Andi Kleen for x86-64. - * - * $Id: hw_irq.h,v 1.24 2001/09/14 20:55:03 vojtech Exp $ */ #ifndef __ASSEMBLY__ -#include #include #include #include @@ -130,15 +127,6 @@ __asm__( \ "push $~(" #nr ") ; " \ "jmp common_interrupt"); -#if defined(CONFIG_X86_IO_APIC) -static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) { - if (IO_APIC_IRQ(i)) - send_IPI_self(IO_APIC_VECTOR(i)); -} -#else -static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) {} -#endif - #define platform_legacy_irq(irq) ((irq) < 16) #endif diff --git a/include/asm-x86_64/ia32.h b/include/asm-x86_64/ia32.h index e6b7f2234..0190b7c4e 100644 --- a/include/asm-x86_64/ia32.h +++ b/include/asm-x86_64/ia32.h @@ -1,7 +1,6 @@ #ifndef _ASM_X86_64_IA32_H #define _ASM_X86_64_IA32_H -#include #ifdef CONFIG_IA32_EMULATION diff --git a/include/asm-x86_64/ia32_unistd.h b/include/asm-x86_64/ia32_unistd.h index b4f4b172b..5b52ce507 100644 --- a/include/asm-x86_64/ia32_unistd.h +++ b/include/asm-x86_64/ia32_unistd.h @@ -4,317 +4,15 @@ /* * This file contains the system call numbers of the ia32 port, * this is for the kernel only. + * Only add syscalls here where some part of the kernel needs to know + * the number. This should be otherwise in sync with asm-i386/unistd.h. -AK */ #define __NR_ia32_restart_syscall 0 #define __NR_ia32_exit 1 -#define __NR_ia32_fork 2 #define __NR_ia32_read 3 #define __NR_ia32_write 4 -#define __NR_ia32_open 5 -#define __NR_ia32_close 6 -#define __NR_ia32_waitpid 7 -#define __NR_ia32_creat 8 -#define __NR_ia32_link 9 -#define __NR_ia32_unlink 10 -#define __NR_ia32_execve 11 -#define __NR_ia32_chdir 12 -#define __NR_ia32_time 13 -#define __NR_ia32_mknod 14 -#define __NR_ia32_chmod 15 -#define __NR_ia32_lchown 16 -#define __NR_ia32_break 17 -#define __NR_ia32_oldstat 18 -#define __NR_ia32_lseek 19 -#define __NR_ia32_getpid 20 -#define __NR_ia32_mount 21 -#define __NR_ia32_umount 22 -#define __NR_ia32_setuid 23 -#define __NR_ia32_getuid 24 -#define __NR_ia32_stime 25 -#define __NR_ia32_ptrace 26 -#define __NR_ia32_alarm 27 -#define __NR_ia32_oldfstat 28 -#define __NR_ia32_pause 29 -#define __NR_ia32_utime 30 -#define __NR_ia32_stty 31 -#define __NR_ia32_gtty 32 -#define __NR_ia32_access 33 -#define __NR_ia32_nice 34 -#define __NR_ia32_ftime 35 -#define __NR_ia32_sync 36 -#define __NR_ia32_kill 37 -#define __NR_ia32_rename 38 -#define __NR_ia32_mkdir 39 -#define __NR_ia32_rmdir 40 -#define __NR_ia32_dup 41 -#define __NR_ia32_pipe 42 -#define __NR_ia32_times 43 -#define __NR_ia32_prof 44 -#define __NR_ia32_brk 45 -#define __NR_ia32_setgid 46 -#define __NR_ia32_getgid 47 -#define __NR_ia32_signal 48 -#define __NR_ia32_geteuid 49 -#define __NR_ia32_getegid 50 -#define __NR_ia32_acct 51 -#define __NR_ia32_umount2 52 -#define __NR_ia32_lock 53 -#define __NR_ia32_ioctl 54 -#define __NR_ia32_fcntl 55 -#define __NR_ia32_mpx 56 -#define __NR_ia32_setpgid 57 -#define __NR_ia32_ulimit 58 -#define __NR_ia32_oldolduname 59 -#define __NR_ia32_umask 60 -#define __NR_ia32_chroot 61 -#define __NR_ia32_ustat 62 -#define __NR_ia32_dup2 63 -#define __NR_ia32_getppid 64 -#define __NR_ia32_getpgrp 65 -#define __NR_ia32_setsid 66 -#define __NR_ia32_sigaction 67 -#define __NR_ia32_sgetmask 68 -#define __NR_ia32_ssetmask 69 -#define __NR_ia32_setreuid 70 -#define __NR_ia32_setregid 71 -#define __NR_ia32_sigsuspend 72 -#define __NR_ia32_sigpending 73 -#define __NR_ia32_sethostname 74 -#define __NR_ia32_setrlimit 75 -#define __NR_ia32_getrlimit 76 /* Back compatible 2Gig limited rlimit */ -#define __NR_ia32_getrusage 77 -#define __NR_ia32_gettimeofday 78 -#define __NR_ia32_settimeofday 79 -#define __NR_ia32_getgroups 80 -#define __NR_ia32_setgroups 81 -#define __NR_ia32_select 82 -#define __NR_ia32_symlink 83 -#define __NR_ia32_oldlstat 84 -#define __NR_ia32_readlink 85 -#define __NR_ia32_uselib 86 -#define __NR_ia32_swapon 87 -#define __NR_ia32_reboot 88 -#define __NR_ia32_readdir 89 -#define __NR_ia32_mmap 90 -#define __NR_ia32_munmap 91 -#define __NR_ia32_truncate 92 -#define __NR_ia32_ftruncate 93 -#define __NR_ia32_fchmod 94 -#define __NR_ia32_fchown 95 -#define __NR_ia32_getpriority 96 -#define __NR_ia32_setpriority 97 -#define __NR_ia32_profil 98 -#define __NR_ia32_statfs 99 -#define __NR_ia32_fstatfs 100 -#define __NR_ia32_ioperm 101 -#define __NR_ia32_socketcall 102 -#define __NR_ia32_syslog 103 -#define __NR_ia32_setitimer 104 -#define __NR_ia32_getitimer 105 -#define __NR_ia32_stat 106 -#define __NR_ia32_lstat 107 -#define __NR_ia32_fstat 108 -#define __NR_ia32_olduname 109 -#define __NR_ia32_iopl 110 -#define __NR_ia32_vhangup 111 -#define __NR_ia32_idle 112 -#define __NR_ia32_vm86old 113 -#define __NR_ia32_wait4 114 -#define __NR_ia32_swapoff 115 -#define __NR_ia32_sysinfo 116 -#define __NR_ia32_ipc 117 -#define __NR_ia32_fsync 118 -#define __NR_ia32_sigreturn 119 -#define __NR_ia32_clone 120 -#define __NR_ia32_setdomainname 121 -#define __NR_ia32_uname 122 -#define __NR_ia32_modify_ldt 123 -#define __NR_ia32_adjtimex 124 -#define __NR_ia32_mprotect 125 -#define __NR_ia32_sigprocmask 126 -#define __NR_ia32_create_module 127 -#define __NR_ia32_init_module 128 -#define __NR_ia32_delete_module 129 -#define __NR_ia32_get_kernel_syms 130 -#define __NR_ia32_quotactl 131 -#define __NR_ia32_getpgid 132 -#define __NR_ia32_fchdir 133 -#define __NR_ia32_bdflush 134 -#define __NR_ia32_sysfs 135 -#define __NR_ia32_personality 136 -#define __NR_ia32_afs_syscall 137 /* Syscall for Andrew File System */ -#define __NR_ia32_setfsuid 138 -#define __NR_ia32_setfsgid 139 -#define __NR_ia32__llseek 140 -#define __NR_ia32_getdents 141 -#define __NR_ia32__newselect 142 -#define __NR_ia32_flock 143 -#define __NR_ia32_msync 144 -#define __NR_ia32_readv 145 -#define __NR_ia32_writev 146 -#define __NR_ia32_getsid 147 -#define __NR_ia32_fdatasync 148 -#define __NR_ia32__sysctl 149 -#define __NR_ia32_mlock 150 -#define __NR_ia32_munlock 151 -#define __NR_ia32_mlockall 152 -#define __NR_ia32_munlockall 153 -#define __NR_ia32_sched_setparam 154 -#define __NR_ia32_sched_getparam 155 -#define __NR_ia32_sched_setscheduler 156 -#define __NR_ia32_sched_getscheduler 157 -#define __NR_ia32_sched_yield 158 -#define __NR_ia32_sched_get_priority_max 159 -#define __NR_ia32_sched_get_priority_min 160 -#define __NR_ia32_sched_rr_get_interval 161 -#define __NR_ia32_nanosleep 162 -#define __NR_ia32_mremap 163 -#define __NR_ia32_setresuid 164 -#define __NR_ia32_getresuid 165 -#define __NR_ia32_vm86 166 -#define __NR_ia32_query_module 167 -#define __NR_ia32_poll 168 -#define __NR_ia32_nfsservctl 169 -#define __NR_ia32_setresgid 170 -#define __NR_ia32_getresgid 171 -#define __NR_ia32_prctl 172 +#define __NR_ia32_sigreturn 119 #define __NR_ia32_rt_sigreturn 173 -#define __NR_ia32_rt_sigaction 174 -#define __NR_ia32_rt_sigprocmask 175 -#define __NR_ia32_rt_sigpending 176 -#define __NR_ia32_rt_sigtimedwait 177 -#define __NR_ia32_rt_sigqueueinfo 178 -#define __NR_ia32_rt_sigsuspend 179 -#define __NR_ia32_pread 180 -#define __NR_ia32_pwrite 181 -#define __NR_ia32_chown 182 -#define __NR_ia32_getcwd 183 -#define __NR_ia32_capget 184 -#define __NR_ia32_capset 185 -#define __NR_ia32_sigaltstack 186 -#define __NR_ia32_sendfile 187 -#define __NR_ia32_getpmsg 188 /* some people actually want streams */ -#define __NR_ia32_putpmsg 189 /* some people actually want streams */ -#define __NR_ia32_vfork 190 -#define __NR_ia32_ugetrlimit 191 /* SuS compliant getrlimit */ -#define __NR_ia32_mmap2 192 -#define __NR_ia32_truncate64 193 -#define __NR_ia32_ftruncate64 194 -#define __NR_ia32_stat64 195 -#define __NR_ia32_lstat64 196 -#define __NR_ia32_fstat64 197 -#define __NR_ia32_lchown32 198 -#define __NR_ia32_getuid32 199 -#define __NR_ia32_getgid32 200 -#define __NR_ia32_geteuid32 201 -#define __NR_ia32_getegid32 202 -#define __NR_ia32_setreuid32 203 -#define __NR_ia32_setregid32 204 -#define __NR_ia32_getgroups32 205 -#define __NR_ia32_setgroups32 206 -#define __NR_ia32_fchown32 207 -#define __NR_ia32_setresuid32 208 -#define __NR_ia32_getresuid32 209 -#define __NR_ia32_setresgid32 210 -#define __NR_ia32_getresgid32 211 -#define __NR_ia32_chown32 212 -#define __NR_ia32_setuid32 213 -#define __NR_ia32_setgid32 214 -#define __NR_ia32_setfsuid32 215 -#define __NR_ia32_setfsgid32 216 -#define __NR_ia32_pivot_root 217 -#define __NR_ia32_mincore 218 -#define __NR_ia32_madvise 219 -#define __NR_ia32_madvise1 219 /* delete when C lib stub is removed */ -#define __NR_ia32_getdents64 220 -#define __NR_ia32_fcntl64 221 -#define __NR_ia32_tuxcall 222 -#define __NR_ia32_security 223 -#define __NR_ia32_gettid 224 -#define __NR_ia32_readahead 225 -#define __NR_ia32_setxattr 226 -#define __NR_ia32_lsetxattr 227 -#define __NR_ia32_fsetxattr 228 -#define __NR_ia32_getxattr 229 -#define __NR_ia32_lgetxattr 230 -#define __NR_ia32_fgetxattr 231 -#define __NR_ia32_listxattr 232 -#define __NR_ia32_llistxattr 233 -#define __NR_ia32_flistxattr 234 -#define __NR_ia32_removexattr 235 -#define __NR_ia32_lremovexattr 236 -#define __NR_ia32_fremovexattr 237 -#define __NR_ia32_tkill 238 -#define __NR_ia32_sendfile64 239 -#define __NR_ia32_futex 240 -#define __NR_ia32_sched_setaffinity 241 -#define __NR_ia32_sched_getaffinity 242 -#define __NR_ia32_set_thread_area 243 -#define __NR_ia32_get_thread_area 244 -#define __NR_ia32_io_setup 245 -#define __NR_ia32_io_destroy 246 -#define __NR_ia32_io_getevents 247 -#define __NR_ia32_io_submit 248 -#define __NR_ia32_io_cancel 249 -#define __NR_ia32_exit_group 252 -#define __NR_ia32_lookup_dcookie 253 -#define __NR_ia32_sys_epoll_create 254 -#define __NR_ia32_sys_epoll_ctl 255 -#define __NR_ia32_sys_epoll_wait 256 -#define __NR_ia32_remap_file_pages 257 -#define __NR_ia32_set_tid_address 258 -#define __NR_ia32_timer_create 259 -#define __NR_ia32_timer_settime (__NR_ia32_timer_create+1) -#define __NR_ia32_timer_gettime (__NR_ia32_timer_create+2) -#define __NR_ia32_timer_getoverrun (__NR_ia32_timer_create+3) -#define __NR_ia32_timer_delete (__NR_ia32_timer_create+4) -#define __NR_ia32_clock_settime (__NR_ia32_timer_create+5) -#define __NR_ia32_clock_gettime (__NR_ia32_timer_create+6) -#define __NR_ia32_clock_getres (__NR_ia32_timer_create+7) -#define __NR_ia32_clock_nanosleep (__NR_ia32_timer_create+8) -#define __NR_ia32_statfs64 268 -#define __NR_ia32_fstatfs64 269 -#define __NR_ia32_tgkill 270 -#define __NR_ia32_utimes 271 -#define __NR_ia32_fadvise64_64 272 -#define __NR_ia32_vserver 273 -#define __NR_ia32_mbind 274 -#define __NR_ia32_get_mempolicy 275 -#define __NR_ia32_set_mempolicy 276 -#define __NR_ia32_mq_open 277 -#define __NR_ia32_mq_unlink (__NR_ia32_mq_open+1) -#define __NR_ia32_mq_timedsend (__NR_ia32_mq_open+2) -#define __NR_ia32_mq_timedreceive (__NR_ia32_mq_open+3) -#define __NR_ia32_mq_notify (__NR_ia32_mq_open+4) -#define __NR_ia32_mq_getsetattr (__NR_ia32_mq_open+5) -#define __NR_ia32_kexec 283 -#define __NR_ia32_waitid 284 -/* #define __NR_sys_setaltroot 285 */ -#define __NR_ia32_add_key 286 -#define __NR_ia32_request_key 287 -#define __NR_ia32_keyctl 288 -#define __NR_ia32_ioprio_set 289 -#define __NR_ia32_ioprio_get 290 -#define __NR_ia32_inotify_init 291 -#define __NR_ia32_inotify_add_watch 292 -#define __NR_ia32_inotify_rm_watch 293 -#define __NR_ia32_migrate_pages 294 -#define __NR_ia32_openat 295 -#define __NR_ia32_mkdirat 296 -#define __NR_ia32_mknodat 297 -#define __NR_ia32_fchownat 298 -#define __NR_ia32_futimesat 299 -#define __NR_ia32_fstatat64 300 -#define __NR_ia32_unlinkat 301 -#define __NR_ia32_renameat 302 -#define __NR_ia32_linkat 303 -#define __NR_ia32_symlinkat 304 -#define __NR_ia32_readlinkat 305 -#define __NR_ia32_fchmodat 306 -#define __NR_ia32_faccessat 307 -#define __NR_ia32_pselect6 308 -#define __NR_ia32_ppoll 309 -#define __NR_ia32_unshare 310 #endif /* _ASM_X86_64_IA32_UNISTD_H_ */ diff --git a/include/asm-x86_64/io.h b/include/asm-x86_64/io.h index a05da8a50..70e91fe76 100644 --- a/include/asm-x86_64/io.h +++ b/include/asm-x86_64/io.h @@ -1,7 +1,6 @@ #ifndef _ASM_IO_H #define _ASM_IO_H -#include /* * This file contains the definitions for the x86 IO instructions diff --git a/include/asm-x86_64/io_apic.h b/include/asm-x86_64/io_apic.h index 52484e82c..fb7a0909a 100644 --- a/include/asm-x86_64/io_apic.h +++ b/include/asm-x86_64/io_apic.h @@ -1,7 +1,6 @@ #ifndef __ASM_IO_APIC_H #define __ASM_IO_APIC_H -#include #include #include diff --git a/include/asm-x86_64/kdebug.h b/include/asm-x86_64/kdebug.h index cf795631d..2b0c088e2 100644 --- a/include/asm-x86_64/kdebug.h +++ b/include/asm-x86_64/kdebug.h @@ -15,6 +15,8 @@ struct die_args { extern int register_die_notifier(struct notifier_block *); extern int unregister_die_notifier(struct notifier_block *); +extern int register_page_fault_notifier(struct notifier_block *); +extern int unregister_page_fault_notifier(struct notifier_block *); extern struct atomic_notifier_head die_chain; /* Grossly misnamed. */ @@ -47,7 +49,7 @@ static inline int notify_die(enum die_val val, const char *str, return atomic_notifier_call_chain(&die_chain, val, &args); } -extern int printk_address(unsigned long address); +extern void printk_address(unsigned long address); extern void die(const char *,struct pt_regs *,long); extern void __die(const char *,struct pt_regs *,long); extern void show_registers(struct pt_regs *regs); diff --git a/include/asm-x86_64/kprobes.h b/include/asm-x86_64/kprobes.h index 98a1e95dd..cf5317898 100644 --- a/include/asm-x86_64/kprobes.h +++ b/include/asm-x86_64/kprobes.h @@ -43,9 +43,11 @@ typedef u8 kprobe_opcode_t; #define JPROBE_ENTRY(pentry) (kprobe_opcode_t *)pentry #define ARCH_SUPPORTS_KRETPROBES +#define ARCH_INACTIVE_KPROBE_COUNT 1 void kretprobe_trampoline(void); extern void arch_remove_kprobe(struct kprobe *p); +#define flush_insn_slot(p) do { } while (0) /* Architecture specific copy of original instruction*/ struct arch_specific_insn { diff --git a/include/asm-x86_64/local.h b/include/asm-x86_64/local.h index cd17945bf..e769e6200 100644 --- a/include/asm-x86_64/local.h +++ b/include/asm-x86_64/local.h @@ -59,12 +59,26 @@ static inline void local_sub(long i, local_t *v) * This could be done better if we moved the per cpu data directly * after GS. */ -#define cpu_local_read(v) local_read(&__get_cpu_var(v)) -#define cpu_local_set(v, i) local_set(&__get_cpu_var(v), (i)) -#define cpu_local_inc(v) local_inc(&__get_cpu_var(v)) -#define cpu_local_dec(v) local_dec(&__get_cpu_var(v)) -#define cpu_local_add(i, v) local_add((i), &__get_cpu_var(v)) -#define cpu_local_sub(i, v) local_sub((i), &__get_cpu_var(v)) + +/* Need to disable preemption for the cpu local counters otherwise we could + still access a variable of a previous CPU in a non atomic way. */ +#define cpu_local_wrap_v(v) \ + ({ local_t res__; \ + preempt_disable(); \ + res__ = (v); \ + preempt_enable(); \ + res__; }) +#define cpu_local_wrap(v) \ + ({ preempt_disable(); \ + v; \ + preempt_enable(); }) \ + +#define cpu_local_read(v) cpu_local_wrap_v(local_read(&__get_cpu_var(v))) +#define cpu_local_set(v, i) cpu_local_wrap(local_set(&__get_cpu_var(v), (i))) +#define cpu_local_inc(v) cpu_local_wrap(local_inc(&__get_cpu_var(v))) +#define cpu_local_dec(v) cpu_local_wrap(local_dec(&__get_cpu_var(v))) +#define cpu_local_add(i, v) cpu_local_wrap(local_add((i), &__get_cpu_var(v))) +#define cpu_local_sub(i, v) cpu_local_wrap(local_sub((i), &__get_cpu_var(v))) #define __cpu_local_inc(v) cpu_local_inc(v) #define __cpu_local_dec(v) cpu_local_dec(v) diff --git a/include/asm-x86_64/mce.h b/include/asm-x86_64/mce.h index 722978509..d13687dfd 100644 --- a/include/asm-x86_64/mce.h +++ b/include/asm-x86_64/mce.h @@ -67,13 +67,22 @@ struct mce_log { /* Software defined banks */ #define MCE_EXTENDED_BANK 128 #define MCE_THERMAL_BANK MCE_EXTENDED_BANK + 0 -#define MCE_THRESHOLD_BASE MCE_EXTENDED_BANK + 1 /* MCE_AMD */ -#define MCE_THRESHOLD_DRAM_ECC MCE_THRESHOLD_BASE + 4 + +#define K8_MCE_THRESHOLD_BASE (MCE_EXTENDED_BANK + 1) /* MCE_AMD */ +#define K8_MCE_THRESHOLD_BANK_0 (MCE_THRESHOLD_BASE + 0 * 9) +#define K8_MCE_THRESHOLD_BANK_1 (MCE_THRESHOLD_BASE + 1 * 9) +#define K8_MCE_THRESHOLD_BANK_2 (MCE_THRESHOLD_BASE + 2 * 9) +#define K8_MCE_THRESHOLD_BANK_3 (MCE_THRESHOLD_BASE + 3 * 9) +#define K8_MCE_THRESHOLD_BANK_4 (MCE_THRESHOLD_BASE + 4 * 9) +#define K8_MCE_THRESHOLD_BANK_5 (MCE_THRESHOLD_BASE + 5 * 9) +#define K8_MCE_THRESHOLD_DRAM_ECC (MCE_THRESHOLD_BANK_4 + 0) #ifdef __KERNEL__ #include void mce_log(struct mce *m); +DECLARE_PER_CPU(struct sys_device, device_mce); + #ifdef CONFIG_X86_MCE_INTEL void mce_intel_feature_init(struct cpuinfo_x86 *c); #else diff --git a/include/asm-x86_64/mmu_context.h b/include/asm-x86_64/mmu_context.h index 19f0c83d0..af03b9f85 100644 --- a/include/asm-x86_64/mmu_context.h +++ b/include/asm-x86_64/mmu_context.h @@ -1,7 +1,6 @@ #ifndef __X86_64_MMU_CONTEXT_H #define __X86_64_MMU_CONTEXT_H -#include #include #include #include diff --git a/include/asm-x86_64/mmzone.h b/include/asm-x86_64/mmzone.h index 6944e7122..c38ebdf6f 100644 --- a/include/asm-x86_64/mmzone.h +++ b/include/asm-x86_64/mmzone.h @@ -4,7 +4,6 @@ #ifndef _ASM_X86_64_MMZONE_H #define _ASM_X86_64_MMZONE_H 1 -#include #ifdef CONFIG_NUMA @@ -43,7 +42,6 @@ static inline __attribute__((pure)) int phys_to_nid(unsigned long addr) #ifdef CONFIG_DISCONTIGMEM #define pfn_to_nid(pfn) phys_to_nid((unsigned long)(pfn) << PAGE_SHIFT) -#define kvaddr_to_nid(kaddr) phys_to_nid(__pa(kaddr)) extern int pfn_valid(unsigned long pfn); #endif diff --git a/include/asm-x86_64/msi.h b/include/asm-x86_64/msi.h index 356e0e82f..3ad234662 100644 --- a/include/asm-x86_64/msi.h +++ b/include/asm-x86_64/msi.h @@ -10,7 +10,15 @@ #include #include -#define LAST_DEVICE_VECTOR 232 +#define LAST_DEVICE_VECTOR (FIRST_SYSTEM_VECTOR - 1) #define MSI_TARGET_CPU_SHIFT 12 +extern struct msi_ops msi_apic_ops; + +static inline int msi_arch_init(void) +{ + msi_register(&msi_apic_ops); + return 0; +} + #endif /* ASM_MSI_H */ diff --git a/include/asm-x86_64/mtrr.h b/include/asm-x86_64/mtrr.h index 66ac1c0f2..d6135b254 100644 --- a/include/asm-x86_64/mtrr.h +++ b/include/asm-x86_64/mtrr.h @@ -23,9 +23,7 @@ #ifndef _LINUX_MTRR_H #define _LINUX_MTRR_H -#include #include -#include #define MTRR_IOCTL_BASE 'M' @@ -102,11 +100,10 @@ static __inline__ int mtrr_del_page (int reg, unsigned long base, return -ENODEV; } -# endif - -#endif +#endif /* CONFIG_MTRR */ #ifdef CONFIG_COMPAT +#include struct mtrr_sentry32 { @@ -138,4 +135,6 @@ struct mtrr_gentry32 #endif /* CONFIG_COMPAT */ +#endif /* __KERNEL__ */ + #endif /* _LINUX_MTRR_H */ diff --git a/include/asm-x86_64/mutex.h b/include/asm-x86_64/mutex.h index 11fbee2bd..06fab6de2 100644 --- a/include/asm-x86_64/mutex.h +++ b/include/asm-x86_64/mutex.h @@ -24,7 +24,7 @@ do { \ typecheck_fn(fastcall void (*)(atomic_t *), fail_fn); \ \ __asm__ __volatile__( \ - LOCK " decl (%%rdi) \n" \ + LOCK_PREFIX " decl (%%rdi) \n" \ " js 2f \n" \ "1: \n" \ \ @@ -74,7 +74,7 @@ do { \ typecheck_fn(fastcall void (*)(atomic_t *), fail_fn); \ \ __asm__ __volatile__( \ - LOCK " incl (%%rdi) \n" \ + LOCK_PREFIX " incl (%%rdi) \n" \ " jle 2f \n" \ "1: \n" \ \ diff --git a/include/asm-x86_64/nmi.h b/include/asm-x86_64/nmi.h index d3abfc6a8..efb45c894 100644 --- a/include/asm-x86_64/nmi.h +++ b/include/asm-x86_64/nmi.h @@ -5,26 +5,27 @@ #define ASM_NMI_H #include +#include struct pt_regs; - + typedef int (*nmi_callback_t)(struct pt_regs * regs, int cpu); - -/** + +/** * set_nmi_callback * * Set a handler for an NMI. Only one handler may be * set. Return 1 if the NMI was handled. */ void set_nmi_callback(nmi_callback_t callback); - -/** + +/** * unset_nmi_callback * * Remove the handler previously set. */ void unset_nmi_callback(void); - + #ifdef CONFIG_PM /** Replace the PM callback routine for NMI. */ @@ -56,4 +57,21 @@ extern int unknown_nmi_panic; extern int check_nmi_watchdog(void); +extern void setup_apic_nmi_watchdog (void); +extern int reserve_lapic_nmi(void); +extern void release_lapic_nmi(void); +extern void disable_timer_nmi_watchdog(void); +extern void enable_timer_nmi_watchdog(void); +extern void nmi_watchdog_tick (struct pt_regs * regs, unsigned reason); + +extern void nmi_watchdog_default(void); +extern int setup_nmi_watchdog(char *); + +extern unsigned int nmi_watchdog; +#define NMI_DEFAULT -1 +#define NMI_NONE 0 +#define NMI_IO_APIC 1 +#define NMI_LOCAL_APIC 2 +#define NMI_INVALID 3 + #endif /* ASM_NMI_H */ diff --git a/include/asm-x86_64/numa.h b/include/asm-x86_64/numa.h index 1cc92fe02..933ff11ec 100644 --- a/include/asm-x86_64/numa.h +++ b/include/asm-x86_64/numa.h @@ -8,7 +8,6 @@ struct bootnode { }; extern int compute_hash_shift(struct bootnode *nodes, int numnodes); -extern int pxm_to_node(int nid); #define ZONE_ALIGN (1UL << (MAX_ORDER+PAGE_SHIFT)) diff --git a/include/asm-x86_64/page.h b/include/asm-x86_64/page.h index ece50e0fd..ec836f7b7 100644 --- a/include/asm-x86_64/page.h +++ b/include/asm-x86_64/page.h @@ -1,7 +1,6 @@ #ifndef _X86_64_PAGE_H #define _X86_64_PAGE_H -#include /* PAGE_SHIFT determines the page size */ #define PAGE_SHIFT 12 @@ -20,7 +19,7 @@ #define EXCEPTION_STACK_ORDER 0 #define EXCEPTION_STKSZ (PAGE_SIZE << EXCEPTION_STACK_ORDER) -#define DEBUG_STACK_ORDER EXCEPTION_STACK_ORDER +#define DEBUG_STACK_ORDER (EXCEPTION_STACK_ORDER + 1) #define DEBUG_STKSZ (PAGE_SIZE << DEBUG_STACK_ORDER) #define IRQSTACK_ORDER 2 @@ -136,13 +135,13 @@ typedef struct { unsigned long pgprot; } pgprot_t; #define __HAVE_ARCH_GATE_AREA 1 +#include +#include + #ifndef __ASSEMBLY__ extern int devmem_is_allowed(unsigned long pagenr); #endif #endif /* __KERNEL__ */ -#include -#include - #endif /* _X86_64_PAGE_H */ diff --git a/include/asm-x86_64/param.h b/include/asm-x86_64/param.h index 5956b23b5..a728786c3 100644 --- a/include/asm-x86_64/param.h +++ b/include/asm-x86_64/param.h @@ -2,7 +2,6 @@ #define _ASMx86_64_PARAM_H #ifdef __KERNEL__ -# include # 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() */ diff --git a/include/asm-x86_64/pci.h b/include/asm-x86_64/pci.h index 8a05af264..49c5e9280 100644 --- a/include/asm-x86_64/pci.h +++ b/include/asm-x86_64/pci.h @@ -1,7 +1,6 @@ #ifndef __x8664_PCI_H #define __x8664_PCI_H -#include #include #ifdef __KERNEL__ @@ -40,8 +39,8 @@ int pcibios_set_irq_routing(struct pci_dev *dev, int pin, int irq); #include #include #include -#include /* for have_iommu */ +extern void pci_iommu_alloc(void); extern int iommu_setup(char *opt); /* The PCI address space does equal the physical memory @@ -53,7 +52,7 @@ extern int iommu_setup(char *opt); */ #define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys) -#ifdef CONFIG_GART_IOMMU +#if defined(CONFIG_IOMMU) || defined(CONFIG_CALGARY_IOMMU) /* * x86-64 always supports DAC, but sometimes it is useful to force diff --git a/include/asm-x86_64/percpu.h b/include/asm-x86_64/percpu.h index 7f33aaf9f..08dd9f9dd 100644 --- a/include/asm-x86_64/percpu.h +++ b/include/asm-x86_64/percpu.h @@ -14,6 +14,8 @@ #define __per_cpu_offset(cpu) (cpu_pda(cpu)->data_offset) #define __my_cpu_offset() read_pda(data_offset) +#define per_cpu_offset(x) (__per_cpu_offset(x)) + /* Separate out the type, so (int[3], foo) works. */ #define DEFINE_PER_CPU(type, name) \ __attribute__((__section__(".data.percpu"))) __typeof__(type) per_cpu__##name @@ -21,6 +23,7 @@ /* var is in discarded region: offset to particular copy we want */ #define per_cpu(var, cpu) (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset(cpu))) #define __get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __my_cpu_offset())) +#define __raw_get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __my_cpu_offset())) /* A macro to avoid #include hell... */ #define percpu_modcopy(pcpudst, src, size) \ @@ -40,6 +43,7 @@ extern void setup_per_cpu_areas(void); #define per_cpu(var, cpu) (*((void)(cpu), &per_cpu__##var)) #define __get_cpu_var(var) per_cpu__##var +#define __raw_get_cpu_var(var) per_cpu__##var #endif /* SMP */ diff --git a/include/asm-x86_64/pgtable.h b/include/asm-x86_64/pgtable.h index 195952b2c..40746e1ce 100644 --- a/include/asm-x86_64/pgtable.h +++ b/include/asm-x86_64/pgtable.h @@ -337,14 +337,8 @@ static inline int pmd_large(pmd_t pte) { /* to find an entry in a page-table-directory. */ #define pud_index(address) (((address) >> PUD_SHIFT) & (PTRS_PER_PUD-1)) #define pud_offset(pgd, address) ((pud_t *) pgd_page(*(pgd)) + pud_index(address)) -#define pud_offset_k(pgd, addr) pud_offset(pgd, addr) #define pud_present(pud) (pud_val(pud) & _PAGE_PRESENT) -static inline pud_t *__pud_offset_k(pud_t *pud, unsigned long address) -{ - return pud + pud_index(address); -} - /* PMD - Level 2 access */ #define pmd_page_kernel(pmd) ((unsigned long) __va(pmd_val(pmd) & PTE_MASK)) #define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT)) diff --git a/include/asm-x86_64/processor.h b/include/asm-x86_64/processor.h index 37a3ec433..de9c3147e 100644 --- a/include/asm-x86_64/processor.h +++ b/include/asm-x86_64/processor.h @@ -12,7 +12,6 @@ #include #include #include -#include #include #include #include @@ -70,7 +69,11 @@ struct cpuinfo_x86 { cpumask_t llc_shared_map; /* cpus sharing the last level cache */ #endif __u8 apicid; +#ifdef CONFIG_SMP __u8 booted_cores; /* number of cores as seen by OS */ + __u8 phys_proc_id; /* Physical Processor id. */ + __u8 cpu_core_id; /* Core id. */ +#endif } ____cacheline_aligned; #define X86_VENDOR_INTEL 0 @@ -97,6 +100,7 @@ extern char ignore_irq13; extern void identify_cpu(struct cpuinfo_x86 *); extern void print_cpu_info(struct cpuinfo_x86 *); extern unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c); +extern unsigned short num_cache_leaves; /* * EFLAGS bits @@ -228,8 +232,14 @@ struct tss_struct { unsigned long io_bitmap[IO_BITMAP_LONGS + 1]; } __attribute__((packed)) ____cacheline_aligned; + extern struct cpuinfo_x86 boot_cpu_data; DECLARE_PER_CPU(struct tss_struct,init_tss); +/* Save the original ist values for checking stack pointers during debugging */ +struct orig_ist { + unsigned long ist[7]; +}; +DECLARE_PER_CPU(struct orig_ist, orig_ist); #ifdef CONFIG_X86_VSMP #define ARCH_MIN_TASKALIGN (1 << INTERNODE_CACHE_SHIFT) diff --git a/include/asm-x86_64/proto.h b/include/asm-x86_64/proto.h index 8abf2a43c..038fe1f47 100644 --- a/include/asm-x86_64/proto.h +++ b/include/asm-x86_64/proto.h @@ -37,7 +37,6 @@ extern void ia32_sysenter_target(void); extern void config_acpi_tables(void); extern void ia32_syscall(void); -extern void iommu_hole_init(void); extern int pmtimer_mark_offset(void); extern void pmtimer_resume(void); @@ -75,7 +74,7 @@ extern void main_timer_handler(struct pt_regs *regs); extern unsigned long end_pfn_map; -extern void show_trace(unsigned long * rsp); +extern void show_trace(struct task_struct *, struct pt_regs *, unsigned long * rsp); extern void show_registers(struct pt_regs *regs); extern void exception_table_check(void); @@ -101,13 +100,9 @@ extern int unsynchronized_tsc(void); extern void select_idle_routine(const struct cpuinfo_x86 *c); -extern void gart_parse_options(char *); -extern void __init no_iommu_init(void); - extern unsigned long table_start, table_end; extern int exception_trace; -extern int force_iommu, no_iommu; extern int using_apic_timer; extern int disable_apic; extern unsigned cpu_khz; @@ -116,7 +111,13 @@ extern int skip_ioapic_setup; extern int acpi_ht; extern int acpi_disabled; -#ifdef CONFIG_GART_IOMMU +extern void no_iommu_init(void); +extern int force_iommu, no_iommu; +extern int iommu_detected; +#ifdef CONFIG_IOMMU +extern void gart_iommu_init(void); +extern void gart_parse_options(char *); +extern void iommu_hole_init(void); extern int fallback_aper_order; extern int fallback_aper_force; extern int iommu_aperture; diff --git a/include/asm-x86_64/rwlock.h b/include/asm-x86_64/rwlock.h index 9942cc393..28a080d23 100644 --- a/include/asm-x86_64/rwlock.h +++ b/include/asm-x86_64/rwlock.h @@ -18,69 +18,21 @@ #ifndef _ASM_X86_64_RWLOCK_H #define _ASM_X86_64_RWLOCK_H -#include - #define RW_LOCK_BIAS 0x01000000 -#define RW_LOCK_BIAS_STR "0x01000000" - -#define __build_read_lock_ptr(rw, helper) \ - asm volatile(LOCK "subl $1,(%0)\n\t" \ - "js 2f\n" \ - "1:\n" \ - LOCK_SECTION_START("") \ - "2:\tcall " helper "\n\t" \ - "jmp 1b\n" \ - LOCK_SECTION_END \ - ::"a" (rw) : "memory") +#define RW_LOCK_BIAS_STR "0x01000000" -#define __build_read_lock_const(rw, helper) \ - asm volatile(LOCK "subl $1,%0\n\t" \ - "js 2f\n" \ +#define __build_read_lock(rw) \ + asm volatile(LOCK_PREFIX "subl $1,(%0)\n\t" \ + "jns 1f\n" \ + "call __read_lock_failed\n" \ "1:\n" \ - LOCK_SECTION_START("") \ - "2:\tpushq %%rax\n\t" \ - "leaq %0,%%rax\n\t" \ - "call " helper "\n\t" \ - "popq %%rax\n\t" \ - "jmp 1b\n" \ - LOCK_SECTION_END \ - :"=m" (*((volatile int *)rw))::"memory") - -#define __build_read_lock(rw, helper) do { \ - if (__builtin_constant_p(rw)) \ - __build_read_lock_const(rw, helper); \ - else \ - __build_read_lock_ptr(rw, helper); \ - } while (0) + ::"D" (rw), "i" (RW_LOCK_BIAS) : "memory") -#define __build_write_lock_ptr(rw, helper) \ - asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",(%0)\n\t" \ - "jnz 2f\n" \ +#define __build_write_lock(rw) \ + asm volatile(LOCK_PREFIX "subl %1,(%0)\n\t" \ + "jz 1f\n" \ + "\tcall __write_lock_failed\n\t" \ "1:\n" \ - LOCK_SECTION_START("") \ - "2:\tcall " helper "\n\t" \ - "jmp 1b\n" \ - LOCK_SECTION_END \ - ::"a" (rw) : "memory") - -#define __build_write_lock_const(rw, helper) \ - asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",%0\n\t" \ - "jnz 2f\n" \ - "1:\n" \ - LOCK_SECTION_START("") \ - "2:\tpushq %%rax\n\t" \ - "leaq %0,%%rax\n\t" \ - "call " helper "\n\t" \ - "popq %%rax\n\t" \ - "jmp 1b\n" \ - LOCK_SECTION_END \ - :"=m" (*((volatile long *)rw))::"memory") - -#define __build_write_lock(rw, helper) do { \ - if (__builtin_constant_p(rw)) \ - __build_write_lock_const(rw, helper); \ - else \ - __build_write_lock_ptr(rw, helper); \ - } while (0) + ::"D" (rw), "i" (RW_LOCK_BIAS) : "memory") #endif diff --git a/include/asm-x86_64/semaphore.h b/include/asm-x86_64/semaphore.h index a389aa6fe..064df08b9 100644 --- a/include/asm-x86_64/semaphore.h +++ b/include/asm-x86_64/semaphore.h @@ -106,7 +106,7 @@ static inline void down(struct semaphore * sem) __asm__ __volatile__( "# atomic down operation\n\t" - LOCK "decl %0\n\t" /* --sem->count */ + LOCK_PREFIX "decl %0\n\t" /* --sem->count */ "js 2f\n" "1:\n" LOCK_SECTION_START("") @@ -130,7 +130,7 @@ static inline int down_interruptible(struct semaphore * sem) __asm__ __volatile__( "# atomic interruptible down operation\n\t" - LOCK "decl %1\n\t" /* --sem->count */ + LOCK_PREFIX "decl %1\n\t" /* --sem->count */ "js 2f\n\t" "xorl %0,%0\n" "1:\n" @@ -154,7 +154,7 @@ static inline int down_trylock(struct semaphore * sem) __asm__ __volatile__( "# atomic interruptible down operation\n\t" - LOCK "decl %1\n\t" /* --sem->count */ + LOCK_PREFIX "decl %1\n\t" /* --sem->count */ "js 2f\n\t" "xorl %0,%0\n" "1:\n" @@ -178,7 +178,7 @@ static inline void up(struct semaphore * sem) { __asm__ __volatile__( "# atomic up operation\n\t" - LOCK "incl %0\n\t" /* ++sem->count */ + LOCK_PREFIX "incl %0\n\t" /* ++sem->count */ "jle 2f\n" "1:\n" LOCK_SECTION_START("") diff --git a/include/asm-x86_64/serial.h b/include/asm-x86_64/serial.h index dc752eafa..b0496e0d7 100644 --- a/include/asm-x86_64/serial.h +++ b/include/asm-x86_64/serial.h @@ -2,7 +2,6 @@ * include/asm-x86_64/serial.h */ -#include /* * This assumes you have a 1.8432 MHz clock for your UART. diff --git a/include/asm-x86_64/signal.h b/include/asm-x86_64/signal.h index f8d557985..4581f978b 100644 --- a/include/asm-x86_64/signal.h +++ b/include/asm-x86_64/signal.h @@ -3,13 +3,13 @@ #ifndef __ASSEMBLY__ #include -#include #include /* Avoid too many header ordering problems. */ struct siginfo; #ifdef __KERNEL__ +#include /* Most things should be clean enough to redefine this at will, if care is taken to make libc match. */ @@ -24,10 +24,6 @@ typedef struct { } sigset_t; -struct pt_regs; -asmlinkage int do_signal(struct pt_regs *regs, sigset_t *oldset); - - #else /* Here we must cater to libcs that poke about in kernel headers. */ @@ -83,7 +79,6 @@ typedef unsigned long sigset_t; * SA_FLAGS values: * * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. * SA_RESETHAND clears the handler when the signal is delivered. @@ -103,7 +98,6 @@ typedef unsigned long sigset_t; #define SA_NOMASK SA_NODEFER #define SA_ONESHOT SA_RESETHAND -#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ #define SA_RESTORER 0x04000000 diff --git a/include/asm-x86_64/smp.h b/include/asm-x86_64/smp.h index a4fdaeb5c..6805e1feb 100644 --- a/include/asm-x86_64/smp.h +++ b/include/asm-x86_64/smp.h @@ -5,7 +5,6 @@ * We need the APIC definitions automatically as part of 'smp.h' */ #ifndef __ASSEMBLY__ -#include #include #include #include @@ -54,8 +53,6 @@ extern int smp_call_function_single(int cpuid, void (*func) (void *info), extern cpumask_t cpu_sibling_map[NR_CPUS]; extern cpumask_t cpu_core_map[NR_CPUS]; -extern u8 phys_proc_id[NR_CPUS]; -extern u8 cpu_core_id[NR_CPUS]; extern u8 cpu_llc_id[NR_CPUS]; #define SMP_TRAMPOLINE_BASE 0x6000 diff --git a/include/asm-x86_64/socket.h b/include/asm-x86_64/socket.h index f2cdbeae5..b46702607 100644 --- a/include/asm-x86_64/socket.h +++ b/include/asm-x86_64/socket.h @@ -48,5 +48,6 @@ #define SO_ACCEPTCONN 30 #define SO_PEERSEC 31 +#define SO_PASSSEC 34 #endif /* _ASM_SOCKET_H */ diff --git a/include/asm-x86_64/spinlock.h b/include/asm-x86_64/spinlock.h index fe484a699..a8e3d89f5 100644 --- a/include/asm-x86_64/spinlock.h +++ b/include/asm-x86_64/spinlock.h @@ -4,7 +4,6 @@ #include #include #include -#include /* * Your basic SMP spinlocks, allowing only a single CPU anywhere @@ -22,7 +21,7 @@ #define __raw_spin_lock_string \ "\n1:\t" \ - "lock ; decl %0\n\t" \ + LOCK_PREFIX " ; decl %0\n\t" \ "js 2f\n" \ LOCK_SECTION_START("") \ "2:\t" \ @@ -32,15 +31,16 @@ "jmp 1b\n" \ LOCK_SECTION_END +#define __raw_spin_lock_string_up \ + "\n\tdecl %0" + #define __raw_spin_unlock_string \ "movl $1,%0" \ :"=m" (lock->slock) : : "memory" static inline void __raw_spin_lock(raw_spinlock_t *lock) { - __asm__ __volatile__( - __raw_spin_lock_string - :"=m" (lock->slock) : : "memory"); + asm volatile(__raw_spin_lock_string : "=m" (lock->slock) : : "memory"); } #define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock) @@ -79,13 +79,6 @@ static inline void __raw_spin_unlock(raw_spinlock_t *lock) * * On x86, we implement read-write locks as a 32-bit counter * with the high bit (sign) being the "contended" bit. - * - * The inline assembly is non-obvious. Think about it. - * - * Changed to use the same technique as rw semaphores. See - * semaphore.h for details. -ben - * - * the helpers are in arch/i386/kernel/semaphore.c */ #define __raw_read_can_lock(x) ((int)(x)->lock > 0) @@ -93,12 +86,12 @@ static inline void __raw_spin_unlock(raw_spinlock_t *lock) static inline void __raw_read_lock(raw_rwlock_t *rw) { - __build_read_lock(rw, "__read_lock_failed"); + __build_read_lock(rw); } static inline void __raw_write_lock(raw_rwlock_t *rw) { - __build_write_lock(rw, "__write_lock_failed"); + __build_write_lock(rw); } static inline int __raw_read_trylock(raw_rwlock_t *lock) @@ -122,12 +115,12 @@ static inline int __raw_write_trylock(raw_rwlock_t *lock) static inline void __raw_read_unlock(raw_rwlock_t *rw) { - asm volatile("lock ; incl %0" :"=m" (rw->lock) : : "memory"); + asm volatile(LOCK_PREFIX " ; incl %0" :"=m" (rw->lock) : : "memory"); } static inline void __raw_write_unlock(raw_rwlock_t *rw) { - asm volatile("lock ; addl $" RW_LOCK_BIAS_STR ",%0" + asm volatile(LOCK_PREFIX " ; addl $" RW_LOCK_BIAS_STR ",%0" : "=m" (rw->lock) : : "memory"); } diff --git a/include/asm-x86_64/string.h b/include/asm-x86_64/string.h index ee6bf2753..9505d9f4b 100644 --- a/include/asm-x86_64/string.h +++ b/include/asm-x86_64/string.h @@ -6,7 +6,8 @@ /* Written 2002 by Andi Kleen */ /* Only used for special circumstances. Stolen from i386/string.h */ -static inline void * __inline_memcpy(void * to, const void * from, size_t n) +static __always_inline void * +__inline_memcpy(void * to, const void * from, size_t n) { unsigned long d0, d1, d2; __asm__ __volatile__( diff --git a/include/asm-x86_64/swiotlb.h b/include/asm-x86_64/swiotlb.h index 60757efd1..ba94ab3d2 100644 --- a/include/asm-x86_64/swiotlb.h +++ b/include/asm-x86_64/swiotlb.h @@ -1,7 +1,6 @@ #ifndef _ASM_SWIOTLB_H #define _ASM_SWTIOLB_H 1 -#include #include @@ -43,6 +42,8 @@ extern void swiotlb_free_coherent (struct device *hwdev, size_t size, extern int swiotlb_dma_supported(struct device *hwdev, u64 mask); extern void swiotlb_init(void); +extern int swiotlb_force; + #ifdef CONFIG_SWIOTLB extern int swiotlb; #else diff --git a/include/asm-x86_64/system.h b/include/asm-x86_64/system.h index 397598980..6bf170bce 100644 --- a/include/asm-x86_64/system.h +++ b/include/asm-x86_64/system.h @@ -1,18 +1,12 @@ #ifndef __ASM_SYSTEM_H #define __ASM_SYSTEM_H -#include #include #include +#include #ifdef __KERNEL__ -#ifdef CONFIG_SMP -#define LOCK_PREFIX "lock ; " -#else -#define LOCK_PREFIX "" -#endif - #define __STR(x) #x #define STR(x) __STR(x) @@ -35,7 +29,7 @@ "thread_return:\n\t" \ "movq %%gs:%P[pda_pcurrent],%%rsi\n\t" \ "movq %P[thread_info](%%rsi),%%r8\n\t" \ - LOCK "btr %[tif_fork],%P[ti_flags](%%r8)\n\t" \ + LOCK_PREFIX "btr %[tif_fork],%P[ti_flags](%%r8)\n\t" \ "movq %%rax,%%rdi\n\t" \ "jc ret_from_fork\n\t" \ RESTORE_CONTEXT \ @@ -70,82 +64,6 @@ extern void load_gs_index(unsigned); ".previous" \ : :"r" (value), "r" (0)) -#ifdef __KERNEL__ -struct alt_instr { - __u8 *instr; /* original instruction */ - __u8 *replacement; - __u8 cpuid; /* cpuid bit set for replacement */ - __u8 instrlen; /* length of original instruction */ - __u8 replacementlen; /* length of new instruction, <= instrlen */ - __u8 pad[5]; -}; -#endif - -/* - * Alternative instructions for different CPU types or capabilities. - * - * This allows to use optimized instructions even on generic binary - * kernels. - * - * length of oldinstr must be longer or equal the length of newinstr - * It can be padded with nops as needed. - * - * For non barrier like inlines please define new variants - * without volatile and memory clobber. - */ -#define alternative(oldinstr, newinstr, feature) \ - asm volatile ("661:\n\t" oldinstr "\n662:\n" \ - ".section .altinstructions,\"a\"\n" \ - " .align 8\n" \ - " .quad 661b\n" /* label */ \ - " .quad 663f\n" /* new instruction */ \ - " .byte %c0\n" /* feature bit */ \ - " .byte 662b-661b\n" /* sourcelen */ \ - " .byte 664f-663f\n" /* replacementlen */ \ - ".previous\n" \ - ".section .altinstr_replacement,\"ax\"\n" \ - "663:\n\t" newinstr "\n664:\n" /* replacement */ \ - ".previous" :: "i" (feature) : "memory") - -/* - * Alternative inline assembly with input. - * - * Peculiarities: - * No memory clobber here. - * Argument numbers start with 1. - * Best is to use constraints that are fixed size (like (%1) ... "r") - * If you use variable sized constraints like "m" or "g" in the - * replacement make sure to pad to the worst case length. - */ -#define alternative_input(oldinstr, newinstr, feature, input...) \ - asm volatile ("661:\n\t" oldinstr "\n662:\n" \ - ".section .altinstructions,\"a\"\n" \ - " .align 8\n" \ - " .quad 661b\n" /* label */ \ - " .quad 663f\n" /* new instruction */ \ - " .byte %c0\n" /* feature bit */ \ - " .byte 662b-661b\n" /* sourcelen */ \ - " .byte 664f-663f\n" /* replacementlen */ \ - ".previous\n" \ - ".section .altinstr_replacement,\"ax\"\n" \ - "663:\n\t" newinstr "\n664:\n" /* replacement */ \ - ".previous" :: "i" (feature), ##input) - -/* Like alternative_input, but with a single output argument */ -#define alternative_io(oldinstr, newinstr, feature, output, input...) \ - asm volatile ("661:\n\t" oldinstr "\n662:\n" \ - ".section .altinstructions,\"a\"\n" \ - " .align 8\n" \ - " .quad 661b\n" /* label */ \ - " .quad 663f\n" /* new instruction */ \ - " .byte %c[feat]\n" /* feature bit */ \ - " .byte 662b-661b\n" /* sourcelen */ \ - " .byte 664f-663f\n" /* replacementlen */ \ - ".previous\n" \ - ".section .altinstr_replacement,\"ax\"\n" \ - "663:\n\t" newinstr "\n664:\n" /* replacement */ \ - ".previous" : output : [feat] "i" (feature), ##input) - /* * Clear and set 'TS' bit respectively */ @@ -322,50 +240,14 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, #endif #define read_barrier_depends() do {} while(0) #define set_mb(var, value) do { (void) xchg(&var, value); } while (0) -#define set_wmb(var, value) do { var = value; wmb(); } while (0) #define warn_if_not_ulong(x) do { unsigned long foo; (void) (&(x) == &foo); } while (0) -/* interrupt control.. */ -#define local_save_flags(x) do { warn_if_not_ulong(x); __asm__ __volatile__("# save_flags \n\t pushfq ; popq %q0":"=g" (x): /* no input */ :"memory"); } while (0) -#define local_irq_restore(x) __asm__ __volatile__("# restore_flags \n\t pushq %0 ; popfq": /* no output */ :"g" (x):"memory", "cc") - -#ifdef CONFIG_X86_VSMP -/* Interrupt control for VSMP architecture */ -#define local_irq_disable() do { unsigned long flags; local_save_flags(flags); local_irq_restore((flags & ~(1 << 9)) | (1 << 18)); } while (0) -#define local_irq_enable() do { unsigned long flags; local_save_flags(flags); local_irq_restore((flags | (1 << 9)) & ~(1 << 18)); } while (0) - -#define irqs_disabled() \ -({ \ - unsigned long flags; \ - local_save_flags(flags); \ - (flags & (1<<18)) || !(flags & (1<<9)); \ -}) - -/* For spinlocks etc */ -#define local_irq_save(x) do { local_save_flags(x); local_irq_restore((x & ~(1 << 9)) | (1 << 18)); } while (0) -#else /* CONFIG_X86_VSMP */ -#define local_irq_disable() __asm__ __volatile__("cli": : :"memory") -#define local_irq_enable() __asm__ __volatile__("sti": : :"memory") - -#define irqs_disabled() \ -({ \ - unsigned long flags; \ - local_save_flags(flags); \ - !(flags & (1<<9)); \ -}) - -/* For spinlocks etc */ -#define local_irq_save(x) do { warn_if_not_ulong(x); __asm__ __volatile__("# local_irq_save \n\t pushfq ; popq %0 ; cli":"=g" (x): /* no input */ :"memory"); } while (0) -#endif - -/* used in the idle loop; sti takes one instruction cycle to complete */ -#define safe_halt() __asm__ __volatile__("sti; hlt": : :"memory") -/* used when interrupts are already enabled or to shutdown the processor */ -#define halt() __asm__ __volatile__("hlt": : :"memory") +#include void cpu_idle_wait(void); extern unsigned long arch_align_stack(unsigned long sp); +extern void free_init_pages(char *what, unsigned long begin, unsigned long end); #endif diff --git a/include/asm-x86_64/thread_info.h b/include/asm-x86_64/thread_info.h index 4ac0e0a36..3363f7b3b 100644 --- a/include/asm-x86_64/thread_info.h +++ b/include/asm-x86_64/thread_info.h @@ -73,8 +73,21 @@ static inline struct thread_info *stack_thread_info(void) } /* thread information allocation */ +#ifdef CONFIG_DEBUG_STACK_USAGE +#define alloc_thread_info(tsk) \ + ({ \ + struct thread_info *ret; \ + \ + ret = ((struct thread_info *) __get_free_pages(GFP_KERNEL,THREAD_ORDER)); \ + if (ret) \ + memset(ret, 0, THREAD_SIZE); \ + ret; \ + }) +#else #define alloc_thread_info(tsk) \ ((struct thread_info *) __get_free_pages(GFP_KERNEL,THREAD_ORDER)) +#endif + #define free_thread_info(ti) free_pages((unsigned long) (ti), THREAD_ORDER) #else /* !__ASSEMBLY__ */ @@ -101,11 +114,13 @@ static inline struct thread_info *stack_thread_info(void) #define TIF_IRET 5 /* force IRET */ #define TIF_SYSCALL_AUDIT 7 /* syscall auditing active */ #define TIF_SECCOMP 8 /* secure computing */ -#define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling TIF_NEED_RESCHED */ +#define TIF_RESTORE_SIGMASK 9 /* restore signal mask in do_signal */ +/* 16 free */ #define TIF_IA32 17 /* 32bit process */ #define TIF_FORK 18 /* ret_from_fork */ #define TIF_ABI_PENDING 19 #define TIF_MEMDIE 20 +#define TIF_FORCED_TF 21 /* true if TF in eflags artificially */ #define _TIF_SYSCALL_TRACE (1<thread_info->status & TS_POLLING) #endif /* __KERNEL__ */ diff --git a/include/asm-x86_64/tlbflush.h b/include/asm-x86_64/tlbflush.h index 4a9c20ea9..d16d5b60f 100644 --- a/include/asm-x86_64/tlbflush.h +++ b/include/asm-x86_64/tlbflush.h @@ -1,7 +1,6 @@ #ifndef _X8664_TLBFLUSH_H #define _X8664_TLBFLUSH_H -#include #include #include diff --git a/include/asm-x86_64/topology.h b/include/asm-x86_64/topology.h index 9db54e9d1..6e7a2e976 100644 --- a/include/asm-x86_64/topology.h +++ b/include/asm-x86_64/topology.h @@ -1,15 +1,12 @@ #ifndef _ASM_X86_64_TOPOLOGY_H #define _ASM_X86_64_TOPOLOGY_H -#include #ifdef CONFIG_NUMA #include #include -/* Map the K8 CPU local memory controllers to a simple 1:1 CPU:NODE topology */ - extern cpumask_t cpu_online_map; extern unsigned char cpu_to_node[]; @@ -58,12 +55,12 @@ extern int __node_distance(int, int); #endif #ifdef CONFIG_SMP -#define topology_physical_package_id(cpu) \ - (phys_proc_id[cpu] == BAD_APICID ? -1 : phys_proc_id[cpu]) -#define topology_core_id(cpu) \ - (cpu_core_id[cpu] == BAD_APICID ? 0 : cpu_core_id[cpu]) +#define topology_physical_package_id(cpu) (cpu_data[cpu].phys_proc_id) +#define topology_core_id(cpu) (cpu_data[cpu].cpu_core_id) #define topology_core_siblings(cpu) (cpu_core_map[cpu]) #define topology_thread_siblings(cpu) (cpu_sibling_map[cpu]) +#define mc_capable() (boot_cpu_data.x86_max_cores > 1) +#define smt_capable() (smp_num_siblings > 1) #endif #include diff --git a/include/asm-x86_64/uaccess.h b/include/asm-x86_64/uaccess.h index bddffcb59..1e1fa003d 100644 --- a/include/asm-x86_64/uaccess.h +++ b/include/asm-x86_64/uaccess.h @@ -4,7 +4,6 @@ /* * User space memory access functions */ -#include #include #include #include diff --git a/include/asm-x86_64/unistd.h b/include/asm-x86_64/unistd.h index caede3f70..43904f49b 100644 --- a/include/asm-x86_64/unistd.h +++ b/include/asm-x86_64/unistd.h @@ -608,9 +608,9 @@ __SYSCALL(__NR_fchmodat, sys_fchmodat) #define __NR_faccessat 269 __SYSCALL(__NR_faccessat, sys_faccessat) #define __NR_pselect6 270 -__SYSCALL(__NR_pselect6, sys_ni_syscall) /* for now */ +__SYSCALL(__NR_pselect6, sys_pselect6) #define __NR_ppoll 271 -__SYSCALL(__NR_ppoll, sys_ni_syscall) /* for now */ +__SYSCALL(__NR_ppoll, sys_ppoll) #define __NR_unshare 272 __SYSCALL(__NR_unshare, sys_unshare) #define __NR_set_robust_list 273 @@ -625,8 +625,12 @@ __SYSCALL(__NR_tee, sys_tee) __SYSCALL(__NR_sync_file_range, sys_sync_file_range) #define __NR_vmsplice 278 __SYSCALL(__NR_vmsplice, sys_vmsplice) +#define __NR_move_pages 279 +__SYSCALL(__NR_move_pages, sys_move_pages) -#define __NR_syscall_max __NR_vmsplice +#ifdef __KERNEL__ + +#define __NR_syscall_max __NR_move_pages #ifndef __NO_STUBS @@ -643,7 +647,6 @@ do { \ return (type) (res); \ } while (0) -#ifdef __KERNEL__ #define __ARCH_WANT_OLD_READDIR #define __ARCH_WANT_OLD_STAT #define __ARCH_WANT_SYS_ALARM @@ -663,9 +666,9 @@ do { \ #define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPROCMASK #define __ARCH_WANT_SYS_RT_SIGACTION +#define __ARCH_WANT_SYS_RT_SIGSUSPEND #define __ARCH_WANT_SYS_TIME #define __ARCH_WANT_COMPAT_SYS_TIME -#endif #ifndef __KERNEL_SYSCALLS__ @@ -827,9 +830,7 @@ asmlinkage long sys_fork(struct pt_regs regs); asmlinkage long sys_vfork(struct pt_regs regs); asmlinkage long sys_pipe(int *fildes); -#endif /* __KERNEL_SYSCALLS__ */ - -#if !defined(__ASSEMBLY__) && defined(__KERNEL__) +#ifndef __ASSEMBLY__ #include #include @@ -844,9 +845,9 @@ asmlinkage long sys_rt_sigaction(int sig, struct sigaction __user *oact, size_t sigsetsize); -#endif /* __ASSEMBLY__ */ +#endif /* __ASSEMBLY__ */ -#endif /* __NO_STUBS */ +#endif /* __KERNEL_SYSCALLS__ */ /* * "Conditional" syscalls @@ -856,4 +857,8 @@ asmlinkage long sys_rt_sigaction(int sig, */ #define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") -#endif +#endif /* __NO_STUBS */ + +#endif /* __KERNEL__ */ + +#endif /* _ASM_X86_64_UNISTD_H_ */ diff --git a/include/asm-x86_64/vga.h b/include/asm-x86_64/vga.h index ef0c0e50c..0ecf68ac0 100644 --- a/include/asm-x86_64/vga.h +++ b/include/asm-x86_64/vga.h @@ -12,7 +12,7 @@ * access the videoram directly without any black magic. */ -#define VGA_MAP_MEM(x) (unsigned long)phys_to_virt(x) +#define VGA_MAP_MEM(x,s) (unsigned long)phys_to_virt(x) #define vga_readb(x) (*(x)) #define vga_writeb(x,y) (*(y) = (x)) diff --git a/include/asm-x86_64/vsyscall.h b/include/asm-x86_64/vsyscall.h index a85e16f56..146b24402 100644 --- a/include/asm-x86_64/vsyscall.h +++ b/include/asm-x86_64/vsyscall.h @@ -1,8 +1,6 @@ #ifndef _ASM_X86_64_VSYSCALL_H_ #define _ASM_X86_64_VSYSCALL_H_ -#include - enum vsyscall_num { __NR_vgettimeofday, __NR_vtime, @@ -14,6 +12,7 @@ enum vsyscall_num { #define VSYSCALL_ADDR(vsyscall_nr) (VSYSCALL_START+VSYSCALL_SIZE*(vsyscall_nr)) #ifdef __KERNEL__ +#include #define __section_vxtime __attribute__ ((unused, __section__ (".vxtime"), aligned(16))) #define __section_wall_jiffies __attribute__ ((unused, __section__ (".wall_jiffies"), aligned(16))) diff --git a/include/asm-xtensa/atomic.h b/include/asm-xtensa/atomic.h index fe105a123..5c2672021 100644 --- a/include/asm-xtensa/atomic.h +++ b/include/asm-xtensa/atomic.h @@ -13,7 +13,6 @@ #ifndef _XTENSA_ATOMIC_H #define _XTENSA_ATOMIC_H -#include #include typedef struct { volatile int counter; } atomic_t; diff --git a/include/asm-xtensa/checksum.h b/include/asm-xtensa/checksum.h index 81a797ae3..03114f8d1 100644 --- a/include/asm-xtensa/checksum.h +++ b/include/asm-xtensa/checksum.h @@ -11,7 +11,6 @@ #ifndef _XTENSA_CHECKSUM_H #define _XTENSA_CHECKSUM_H -#include #include #include @@ -44,8 +43,7 @@ asmlinkage unsigned int csum_partial_copy_generic( const char *src, char *dst, i * Note: when you get a NULL pointer exception here this means someone * passed in an incorrect kernel address to one of these functions. * - * If you use these functions directly please don't forget the - * verify_area(). + * If you use these functions directly please don't forget the access_ok(). */ static inline unsigned int csum_partial_copy_nocheck ( const char *src, char *dst, diff --git a/include/asm-xtensa/delay.h b/include/asm-xtensa/delay.h index 1bc601ec3..e1d8c9e01 100644 --- a/include/asm-xtensa/delay.h +++ b/include/asm-xtensa/delay.h @@ -12,7 +12,6 @@ #ifndef _XTENSA_DELAY_H #define _XTENSA_DELAY_H -#include #include #include diff --git a/include/asm-xtensa/dma.h b/include/asm-xtensa/dma.h index 1c22b0234..db2633f67 100644 --- a/include/asm-xtensa/dma.h +++ b/include/asm-xtensa/dma.h @@ -11,7 +11,6 @@ #ifndef _XTENSA_DMA_H #define _XTENSA_DMA_H -#include #include /* need byte IO */ #include diff --git a/include/asm-xtensa/hardirq.h b/include/asm-xtensa/hardirq.h index aa9c1adf6..87cb19d1b 100644 --- a/include/asm-xtensa/hardirq.h +++ b/include/asm-xtensa/hardirq.h @@ -11,7 +11,6 @@ #ifndef _XTENSA_HARDIRQ_H #define _XTENSA_HARDIRQ_H -#include #include #include diff --git a/include/asm-xtensa/hw_irq.h b/include/asm-xtensa/hw_irq.h index ccf436249..3ddbea759 100644 --- a/include/asm-xtensa/hw_irq.h +++ b/include/asm-xtensa/hw_irq.h @@ -11,8 +11,4 @@ #ifndef _XTENSA_HW_IRQ_H #define _XTENSA_HW_IRQ_H -static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) -{ -} - #endif diff --git a/include/asm-xtensa/ide.h b/include/asm-xtensa/ide.h index b523cd4a4..6b912742a 100644 --- a/include/asm-xtensa/ide.h +++ b/include/asm-xtensa/ide.h @@ -14,7 +14,6 @@ #ifdef __KERNEL__ -#include #ifndef MAX_HWIFS # define MAX_HWIFS 1 diff --git a/include/asm-xtensa/io.h b/include/asm-xtensa/io.h index c5c13985b..556e5eed3 100644 --- a/include/asm-xtensa/io.h +++ b/include/asm-xtensa/io.h @@ -12,7 +12,6 @@ #define _XTENSA_IO_H #ifdef __KERNEL__ -#include #include #include diff --git a/include/asm-xtensa/irq.h b/include/asm-xtensa/irq.h index d984e9559..049fde7e7 100644 --- a/include/asm-xtensa/irq.h +++ b/include/asm-xtensa/irq.h @@ -11,7 +11,6 @@ #ifndef _XTENSA_IRQ_H #define _XTENSA_IRQ_H -#include #include #include diff --git a/include/asm-xtensa/mmu_context.h b/include/asm-xtensa/mmu_context.h index 364a7b057..af683a74a 100644 --- a/include/asm-xtensa/mmu_context.h +++ b/include/asm-xtensa/mmu_context.h @@ -13,7 +13,6 @@ #ifndef _XTENSA_MMU_CONTEXT_H #define _XTENSA_MMU_CONTEXT_H -#include #include #include diff --git a/include/asm-xtensa/page.h b/include/asm-xtensa/page.h index 992bac5c1..40f4c6c3f 100644 --- a/include/asm-xtensa/page.h +++ b/include/asm-xtensa/page.h @@ -14,7 +14,6 @@ #ifdef __KERNEL__ #include -#include /* * PAGE_SHIFT determines the page size diff --git a/include/asm-xtensa/pgalloc.h b/include/asm-xtensa/pgalloc.h index 734a8d060..d56ddf205 100644 --- a/include/asm-xtensa/pgalloc.h +++ b/include/asm-xtensa/pgalloc.h @@ -13,7 +13,6 @@ #ifdef __KERNEL__ -#include #include #include #include diff --git a/include/asm-xtensa/platform.h b/include/asm-xtensa/platform.h index 36163894b..48135a971 100644 --- a/include/asm-xtensa/platform.h +++ b/include/asm-xtensa/platform.h @@ -13,7 +13,6 @@ #ifndef _XTENSA_PLATFORM_H #define _XTENSA_PLATFORM_H -#include #include #include diff --git a/include/asm-xtensa/processor.h b/include/asm-xtensa/processor.h index d1d72ad36..8b96e77c9 100644 --- a/include/asm-xtensa/processor.h +++ b/include/asm-xtensa/processor.h @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -191,7 +192,7 @@ extern unsigned long get_wchan(struct task_struct *p); #define KSTK_EIP(tsk) (task_pt_regs(tsk)->pc) #define KSTK_ESP(tsk) (task_pt_regs(tsk)->areg[1]) -#define cpu_relax() do { } while (0) +#define cpu_relax() barrier() /* Special register access. */ diff --git a/include/asm-xtensa/rwsem.h b/include/asm-xtensa/rwsem.h index 3c02b0e03..0aad3a587 100644 --- a/include/asm-xtensa/rwsem.h +++ b/include/asm-xtensa/rwsem.h @@ -31,24 +31,11 @@ struct rw_semaphore { #define RWSEM_ACTIVE_WRITE_BIAS (RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS) spinlock_t wait_lock; struct list_head wait_list; -#if RWSEM_DEBUG - int debug; -#endif }; -/* - * initialisation - */ -#if RWSEM_DEBUG -#define __RWSEM_DEBUG_INIT , 0 -#else -#define __RWSEM_DEBUG_INIT /* */ -#endif - #define __RWSEM_INITIALIZER(name) \ { RWSEM_UNLOCKED_VALUE, SPIN_LOCK_UNLOCKED, \ - LIST_HEAD_INIT((name).wait_list) \ - __RWSEM_DEBUG_INIT } + LIST_HEAD_INIT((name).wait_list) } #define DECLARE_RWSEM(name) \ struct rw_semaphore name = __RWSEM_INITIALIZER(name) @@ -63,9 +50,6 @@ static inline void init_rwsem(struct rw_semaphore *sem) sem->count = RWSEM_UNLOCKED_VALUE; spin_lock_init(&sem->wait_lock); INIT_LIST_HEAD(&sem->wait_list); -#if RWSEM_DEBUG - sem->debug = 0; -#endif } /* @@ -172,4 +156,9 @@ static inline int rwsem_atomic_update(int delta, struct rw_semaphore *sem) return atomic_add_return(delta, (atomic_t *)(&sem->count)); } -#endif /* _XTENSA_RWSEM_XADD_H */ +static inline int rwsem_is_locked(struct rw_semaphore *sem) +{ + return (sem->count != 0); +} + +#endif /* _XTENSA_RWSEM_H */ diff --git a/include/asm-xtensa/signal.h b/include/asm-xtensa/signal.h index a99c9aec6..633ba73bc 100644 --- a/include/asm-xtensa/signal.h +++ b/include/asm-xtensa/signal.h @@ -75,7 +75,6 @@ typedef struct { * SA_FLAGS values: * * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. * SA_RESETHAND clears the handler when the signal is delivered. @@ -95,7 +94,6 @@ typedef struct { #define SA_NOMASK SA_NODEFER #define SA_ONESHOT SA_RESETHAND -#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ #define SA_RESTORER 0x04000000 @@ -109,19 +107,6 @@ typedef struct { #define SIGSTKSZ 8192 #ifndef __ASSEMBLY__ -#ifdef __KERNEL__ - -/* - * These values of sa_flags are used only by the kernel as part of the - * irq handling routines. - * - * SA_INTERRUPT is also used by the irq handling routines. - * SA_SHIRQ is for shared interrupt support on PCI and EISA. - */ -#define SA_SAMPLE_RANDOM SA_RESTART -#define SA_SHIRQ 0x04000000 -#define SA_PROBEIRQ 0x08000000 -#endif #define SIG_BLOCK 0 /* for blocking signals */ #define SIG_UNBLOCK 1 /* for unblocking signals */ diff --git a/include/asm-xtensa/socket.h b/include/asm-xtensa/socket.h index 00f83f3a6..971d231be 100644 --- a/include/asm-xtensa/socket.h +++ b/include/asm-xtensa/socket.h @@ -59,5 +59,6 @@ #define SO_ACCEPTCONN 30 #define SO_PEERSEC 31 +#define SO_PASSSEC 34 #endif /* _XTENSA_SOCKET_H */ diff --git a/include/asm-xtensa/system.h b/include/asm-xtensa/system.h index b29f7ae6a..932bda92a 100644 --- a/include/asm-xtensa/system.h +++ b/include/asm-xtensa/system.h @@ -11,7 +11,6 @@ #ifndef _XTENSA_SYSTEM_H #define _XTENSA_SYSTEM_H -#include #include #include @@ -100,7 +99,6 @@ static inline void disable_coprocessor(int i) #endif #define set_mb(var, value) do { var = value; mb(); } while (0) -#define set_wmb(var, value) do { var = value; wmb(); } while (0) #if !defined (__ASSEMBLY__) diff --git a/include/asm-xtensa/uaccess.h b/include/asm-xtensa/uaccess.h index 06a22b83b..88a64e114 100644 --- a/include/asm-xtensa/uaccess.h +++ b/include/asm-xtensa/uaccess.h @@ -154,35 +154,6 @@ .Laccess_ok_\@: .endm -/* - * verify_area determines whether a memory access is allowed. It's - * mostly an unnecessary wrapper for access_ok, but we provide it as a - * duplicate of the verify_area() C inline function below. See the - * equivalent C version below for clarity. - * - * On error, verify_area branches to a label indicated by parameter - * . This implies that the macro falls through to the next - * instruction on success. - * - * Note that we assume success is the common case, and we optimize the - * branch fall-through case on success. - * - * On Entry: - * register containing memory address - * register containing memory size - * temp register - * label to branch to on error; implies fall-through - * macro on success - * On Exit: - * preserved - * preserved - * destroyed - */ - .macro verify_area aa, as, at, sp, error - access_ok \at, \aa, \as, \sp, \error - .endm - - #else /* __ASSEMBLY__ not defined */ #include @@ -211,11 +182,6 @@ #define __access_ok(addr,size) (__kernel_ok || __user_ok((addr),(size))) #define access_ok(type,addr,size) __access_ok((unsigned long)(addr),(size)) -static inline int verify_area(int type, const void * addr, unsigned long size) -{ - return access_ok(type,addr,size) ? 0 : -EFAULT; -} - /* * These are the main single-value transfer routines. They * automatically use the right size if we just have the right pointer diff --git a/include/asm-xtensa/unistd.h b/include/asm-xtensa/unistd.h index 6b39d6609..5e1b99dc4 100644 --- a/include/asm-xtensa/unistd.h +++ b/include/asm-xtensa/unistd.h @@ -11,8 +11,6 @@ #ifndef _XTENSA_UNISTD_H #define _XTENSA_UNISTD_H -#include - #define __NR_spill 0 #define __NR_exit 1 #define __NR_read 3 @@ -221,21 +219,9 @@ #define SYSXTENSA_COUNT 5 /* count of syscall0 functions*/ #ifdef __KERNEL__ -#define __syscall_return(type, res) return ((type)(res)) -#else -#define __syscall_return(type, res) \ -do { \ - if ((unsigned long)(res) >= (unsigned long)(-125)) { \ - /* Avoid using "res" which is declared to be in register r2; \ - * errno might expand to a function call and clobber it. */ \ - int __err = -(res); \ - errno = __err; \ - res = -1; \ - } \ - return (type) (res); \ -} while (0) -#endif +#include +#define __syscall_return(type, res) return ((type)(res)) /* Tensilica's xt-xcc compiler is much more agressive at code * optimization than gcc. Multiple __asm__ statements are @@ -429,11 +415,10 @@ static __inline__ _syscall3(int,execve,const char*,file,char**,argv,char**,envp) */ #define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall"); -#ifdef __KERNEL__ #define __ARCH_WANT_STAT64 #define __ARCH_WANT_SYS_UTIME #define __ARCH_WANT_SYS_LLSEEK #define __ARCH_WANT_SYS_RT_SIGACTION -#endif +#endif /* __KERNEL__ */ #endif /* _XTENSA_UNISTD_H */ diff --git a/include/asm-xtensa/vga.h b/include/asm-xtensa/vga.h index 23d82f6ac..1fd8cab3a 100644 --- a/include/asm-xtensa/vga.h +++ b/include/asm-xtensa/vga.h @@ -11,7 +11,7 @@ #ifndef _XTENSA_VGA_H #define _XTENSA_VGA_H -#define VGA_MAP_MEM(x) (unsigned long)phys_to_virt(x) +#define VGA_MAP_MEM(x,s) (unsigned long)phys_to_virt(x) #define vga_readb(x) (*(x)) #define vga_writeb(x,y) (*(y) = (x)) diff --git a/include/keys/user-type.h b/include/keys/user-type.h index a3dae1803..c37c34275 100644 --- a/include/keys/user-type.h +++ b/include/keys/user-type.h @@ -37,6 +37,7 @@ extern struct key_type key_type_user; extern int user_instantiate(struct key *key, const void *data, size_t datalen); extern int user_update(struct key *key, const void *data, size_t datalen); extern int user_match(const struct key *key, const void *criterion); +extern void user_revoke(struct key *key); extern void user_destroy(struct key *key); extern void user_describe(const struct key *user, struct seq_file *m); extern long user_read(const struct key *key, diff --git a/include/linux/ac97_codec.h b/include/linux/ac97_codec.h index c35833824..2ed2fd855 100644 --- a/include/linux/ac97_codec.h +++ b/include/linux/ac97_codec.h @@ -259,7 +259,7 @@ struct ac97_codec { int type; u32 model; - int modem:1; + unsigned int modem:1; struct ac97_ops *codec_ops; diff --git a/include/linux/acct.h b/include/linux/acct.h index 9a6640107..e86bae732 100644 --- a/include/linux/acct.h +++ b/include/linux/acct.h @@ -16,7 +16,6 @@ #define _LINUX_ACCT_H #include -#include #include #include @@ -116,20 +115,23 @@ struct acct_v3 #ifdef __KERNEL__ -#include #ifdef CONFIG_BSD_PROCESS_ACCT struct vfsmount; struct super_block; extern void acct_auto_close_mnt(struct vfsmount *m); extern void acct_auto_close(struct super_block *sb); -extern void acct_process(long exitcode); +extern void acct_init_pacct(struct pacct_struct *pacct); +extern void acct_collect(long exitcode, int group_dead); +extern void acct_process(void); extern void acct_update_integrals(struct task_struct *tsk); extern void acct_clear_integrals(struct task_struct *tsk); #else #define acct_auto_close_mnt(x) do { } while (0) #define acct_auto_close(x) do { } while (0) -#define acct_process(x) do { } while (0) +#define acct_init_pacct(x) do { } while (0) +#define acct_collect(x,y) do { } while (0) +#define acct_process() do { } while (0) #define acct_update_integrals(x) do { } while (0) #define acct_clear_integrals(task) do { } while (0) #endif @@ -165,6 +167,7 @@ typedef struct acct acct_t; #endif /* __KERNEL */ #ifdef __KERNEL__ +#include /* * Yet another set of HZ to *HZ helper functions. * See for the original. diff --git a/include/linux/acpi.h b/include/linux/acpi.h index d3bc25e6d..88b5dfd8e 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -25,7 +25,6 @@ #ifndef _LINUX_ACPI_H #define _LINUX_ACPI_H -#include #ifdef CONFIG_ACPI @@ -38,6 +37,7 @@ #include #include #include +#include #include @@ -408,10 +408,18 @@ void acpi_table_print_madt_entry (acpi_table_entry_header *madt); void acpi_table_print_srat_entry (acpi_table_entry_header *srat); /* the following four functions are architecture-dependent */ +#ifdef CONFIG_HAVE_ARCH_PARSE_SRAT +#define NR_NODE_MEMBLKS MAX_NUMNODES +#define acpi_numa_slit_init(slit) do {} while (0) +#define acpi_numa_processor_affinity_init(pa) do {} while (0) +#define acpi_numa_memory_affinity_init(ma) do {} while (0) +#define acpi_numa_arch_fixup() do {} while (0) +#else void acpi_numa_slit_init (struct acpi_table_slit *slit); void acpi_numa_processor_affinity_init (struct acpi_table_processor_affinity *pa); void acpi_numa_memory_affinity_init (struct acpi_table_memory_affinity *ma); void acpi_numa_arch_fixup(void); +#endif #ifdef CONFIG_ACPI_HOTPLUG_CPU /* Arch dependent functions for cpu hotplug support */ @@ -520,12 +528,18 @@ static inline void acpi_set_cstate_limit(unsigned int new_limit) { return; } #ifdef CONFIG_ACPI_NUMA int acpi_get_pxm(acpi_handle handle); +int acpi_get_node(acpi_handle *handle); #else static inline int acpi_get_pxm(acpi_handle handle) { return 0; } +static inline int acpi_get_node(acpi_handle *handle) +{ + return 0; +} #endif +extern int acpi_paddr_to_node(u64 start_addr, u64 size); extern int pnpacpi_disabled; diff --git a/include/linux/affs_hardblocks.h b/include/linux/affs_hardblocks.h index 3fb869939..f1b948c1f 100644 --- a/include/linux/affs_hardblocks.h +++ b/include/linux/affs_hardblocks.h @@ -1,45 +1,47 @@ #ifndef AFFS_HARDBLOCKS_H #define AFFS_HARDBLOCKS_H +#include + /* Just the needed definitions for the RDB of an Amiga HD. */ struct RigidDiskBlock { - u32 rdb_ID; + __u32 rdb_ID; __be32 rdb_SummedLongs; - s32 rdb_ChkSum; - u32 rdb_HostID; + __s32 rdb_ChkSum; + __u32 rdb_HostID; __be32 rdb_BlockBytes; - u32 rdb_Flags; - u32 rdb_BadBlockList; + __u32 rdb_Flags; + __u32 rdb_BadBlockList; __be32 rdb_PartitionList; - u32 rdb_FileSysHeaderList; - u32 rdb_DriveInit; - u32 rdb_Reserved1[6]; - u32 rdb_Cylinders; - u32 rdb_Sectors; - u32 rdb_Heads; - u32 rdb_Interleave; - u32 rdb_Park; - u32 rdb_Reserved2[3]; - u32 rdb_WritePreComp; - u32 rdb_ReducedWrite; - u32 rdb_StepRate; - u32 rdb_Reserved3[5]; - u32 rdb_RDBBlocksLo; - u32 rdb_RDBBlocksHi; - u32 rdb_LoCylinder; - u32 rdb_HiCylinder; - u32 rdb_CylBlocks; - u32 rdb_AutoParkSeconds; - u32 rdb_HighRDSKBlock; - u32 rdb_Reserved4; + __u32 rdb_FileSysHeaderList; + __u32 rdb_DriveInit; + __u32 rdb_Reserved1[6]; + __u32 rdb_Cylinders; + __u32 rdb_Sectors; + __u32 rdb_Heads; + __u32 rdb_Interleave; + __u32 rdb_Park; + __u32 rdb_Reserved2[3]; + __u32 rdb_WritePreComp; + __u32 rdb_ReducedWrite; + __u32 rdb_StepRate; + __u32 rdb_Reserved3[5]; + __u32 rdb_RDBBlocksLo; + __u32 rdb_RDBBlocksHi; + __u32 rdb_LoCylinder; + __u32 rdb_HiCylinder; + __u32 rdb_CylBlocks; + __u32 rdb_AutoParkSeconds; + __u32 rdb_HighRDSKBlock; + __u32 rdb_Reserved4; char rdb_DiskVendor[8]; char rdb_DiskProduct[16]; char rdb_DiskRevision[4]; char rdb_ControllerVendor[8]; char rdb_ControllerProduct[16]; char rdb_ControllerRevision[4]; - u32 rdb_Reserved5[10]; + __u32 rdb_Reserved5[10]; }; #define IDNAME_RIGIDDISK 0x5244534B /* "RDSK" */ @@ -47,16 +49,16 @@ struct RigidDiskBlock { struct PartitionBlock { __be32 pb_ID; __be32 pb_SummedLongs; - s32 pb_ChkSum; - u32 pb_HostID; + __s32 pb_ChkSum; + __u32 pb_HostID; __be32 pb_Next; - u32 pb_Flags; - u32 pb_Reserved1[2]; - u32 pb_DevFlags; - u8 pb_DriveName[32]; - u32 pb_Reserved2[15]; + __u32 pb_Flags; + __u32 pb_Reserved1[2]; + __u32 pb_DevFlags; + __u8 pb_DriveName[32]; + __u32 pb_Reserved2[15]; __be32 pb_Environment[17]; - u32 pb_EReserved[15]; + __u32 pb_EReserved[15]; }; #define IDNAME_PARTITION 0x50415254 /* "PART" */ diff --git a/include/linux/agpgart.h b/include/linux/agpgart.h index 6d59c8efe..bfb8ec791 100644 --- a/include/linux/agpgart.h +++ b/include/linux/agpgart.h @@ -27,8 +27,6 @@ #ifndef _AGP_H #define _AGP_H 1 -#include - #define AGPIOC_BASE 'A' #define AGPIOC_INFO _IOR (AGPIOC_BASE, 0, struct agp_info*) #define AGPIOC_ACQUIRE _IO (AGPIOC_BASE, 1) @@ -112,6 +110,7 @@ typedef struct _agp_unbind { #else /* __KERNEL__ */ #include +#include #define AGPGART_MINOR 175 diff --git a/include/linux/amba/clcd.h b/include/linux/amba/clcd.h index 9cf64b1b6..29c044826 100644 --- a/include/linux/amba/clcd.h +++ b/include/linux/amba/clcd.h @@ -9,7 +9,6 @@ * License. See the file COPYING in the main directory of this archive * for more details. */ -#include #include /* diff --git a/include/linux/ata.h b/include/linux/ata.h index 312a2c0c6..3671af869 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h @@ -97,6 +97,9 @@ enum { ATA_DRQ = (1 << 3), /* data request i/o */ ATA_ERR = (1 << 0), /* have an error */ ATA_SRST = (1 << 2), /* software reset */ + ATA_ICRC = (1 << 7), /* interface CRC error */ + ATA_UNC = (1 << 6), /* uncorrectable media error */ + ATA_IDNF = (1 << 4), /* ID not found */ ATA_ABORTED = (1 << 2), /* command aborted */ /* ATA command block registers */ @@ -130,6 +133,8 @@ enum { ATA_CMD_WRITE = 0xCA, ATA_CMD_WRITE_EXT = 0x35, ATA_CMD_WRITE_FUA_EXT = 0x3D, + ATA_CMD_FPDMA_READ = 0x60, + ATA_CMD_FPDMA_WRITE = 0x61, ATA_CMD_PIO_READ = 0x20, ATA_CMD_PIO_READ_EXT = 0x24, ATA_CMD_PIO_WRITE = 0x30, @@ -148,6 +153,10 @@ enum { ATA_CMD_INIT_DEV_PARAMS = 0x91, ATA_CMD_READ_NATIVE_MAX = 0xF8, ATA_CMD_READ_NATIVE_MAX_EXT = 0x27, + ATA_CMD_READ_LOG_EXT = 0x2f, + + /* READ_LOG_EXT pages */ + ATA_LOG_SATA_NCQ = 0x10, /* SETFEATURES stuff */ SETFEATURES_XFER = 0x03, @@ -172,6 +181,9 @@ enum { XFER_PIO_0 = 0x08, XFER_PIO_SLOW = 0x00, + SETFEATURES_WC_ON = 0x02, /* Enable write cache */ + SETFEATURES_WC_OFF = 0x82, /* Disable write cache */ + /* ATAPI stuff */ ATAPI_PKT_DMA = (1 << 0), ATAPI_DMADIR = (1 << 2), /* ATAPI data dir: @@ -192,6 +204,16 @@ enum { SCR_ACTIVE = 3, SCR_NOTIFICATION = 4, + /* SError bits */ + SERR_DATA_RECOVERED = (1 << 0), /* recovered data error */ + SERR_COMM_RECOVERED = (1 << 1), /* recovered comm failure */ + SERR_DATA = (1 << 8), /* unrecovered data error */ + SERR_PERSISTENT = (1 << 9), /* persistent data/comm error */ + SERR_PROTOCOL = (1 << 10), /* protocol violation */ + SERR_INTERNAL = (1 << 11), /* host internal error */ + SERR_PHYRDY_CHG = (1 << 16), /* PHY RDY changed */ + SERR_DEV_XCHG = (1 << 26), /* device exchanged */ + /* struct ata_taskfile flags */ ATA_TFLAG_LBA48 = (1 << 0), /* enable 48-bit LBA and "HOB" */ ATA_TFLAG_ISADDR = (1 << 1), /* enable r/w to nsect/lba regs */ @@ -199,6 +221,7 @@ enum { ATA_TFLAG_WRITE = (1 << 3), /* data dir: host->dev==1 (write) */ ATA_TFLAG_LBA = (1 << 4), /* enable LBA */ ATA_TFLAG_FUA = (1 << 5), /* enable FUA */ + ATA_TFLAG_POLLING = (1 << 6), /* set nIEN to 1 and use polling */ }; enum ata_tf_protocols { @@ -207,6 +230,7 @@ enum ata_tf_protocols { ATA_PROT_NODATA, /* no data */ ATA_PROT_PIO, /* PIO single sector */ ATA_PROT_DMA, /* DMA */ + ATA_PROT_NCQ, /* NCQ */ ATA_PROT_ATAPI, /* packet command, PIO data xfer*/ ATA_PROT_ATAPI_NODATA, /* packet command, no data */ ATA_PROT_ATAPI_DMA, /* packet command with special DMA sauce */ @@ -262,6 +286,8 @@ struct ata_taskfile { #define ata_id_has_pm(id) ((id)[82] & (1 << 3)) #define ata_id_has_lba(id) ((id)[49] & (1 << 9)) #define ata_id_has_dma(id) ((id)[49] & (1 << 8)) +#define ata_id_has_ncq(id) ((id)[76] & (1 << 8)) +#define ata_id_queue_depth(id) (((id)[75] & 0x1f) + 1) #define ata_id_removeable(id) ((id)[0] & (1 << 7)) #define ata_id_has_dword_io(id) ((id)[50] & (1 << 0)) #define ata_id_u32(id,n) \ @@ -272,6 +298,8 @@ struct ata_taskfile { ((u64) (id)[(n) + 1] << 16) | \ ((u64) (id)[(n) + 0]) ) +#define ata_id_cdb_intr(id) (((id)[0] & 0x60) == 0x20) + static inline unsigned int ata_id_major_version(const u16 *id) { unsigned int mver; @@ -311,6 +339,15 @@ static inline int is_atapi_taskfile(const struct ata_taskfile *tf) (tf->protocol == ATA_PROT_ATAPI_DMA); } +static inline int is_multi_taskfile(struct ata_taskfile *tf) +{ + return (tf->command == ATA_CMD_READ_MULTI) || + (tf->command == ATA_CMD_WRITE_MULTI) || + (tf->command == ATA_CMD_READ_MULTI_EXT) || + (tf->command == ATA_CMD_WRITE_MULTI_EXT) || + (tf->command == ATA_CMD_WRITE_MULTI_FUA_EXT); +} + static inline int ata_ok(u8 status) { return ((status & (ATA_BUSY | ATA_DRDY | ATA_DF | ATA_DRQ | ATA_ERR)) diff --git a/include/linux/atmdev.h b/include/linux/atmdev.h index b203ea82a..2096e5c72 100644 --- a/include/linux/atmdev.h +++ b/include/linux/atmdev.h @@ -209,7 +209,7 @@ struct atm_cirange { #ifdef __KERNEL__ -#include +#include #include /* wait_queue_head_t */ #include /* struct timeval */ #include @@ -359,6 +359,7 @@ struct atm_dev { struct proc_dir_entry *proc_entry; /* proc entry */ char *proc_name; /* proc entry name */ #endif + struct class_device class_dev; /* sysfs class device */ struct list_head dev_list; /* linkage */ }; @@ -460,7 +461,7 @@ static inline void atm_dev_put(struct atm_dev *dev) BUG_ON(!test_bit(ATM_DF_REMOVED, &dev->flags)); if (dev->ops->dev_close) dev->ops->dev_close(dev); - kfree(dev); + class_device_put(&dev->class_dev); } } diff --git a/include/linux/audit.h b/include/linux/audit.h index b74c148f1..40a6c2629 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h @@ -24,8 +24,7 @@ #ifndef _LINUX_AUDIT_H_ #define _LINUX_AUDIT_H_ -#include -#include +#include /* The netlink messages for the audit system is divided into blocks: * 1000 - 1099 are for commanding the audit system @@ -83,7 +82,12 @@ #define AUDIT_CONFIG_CHANGE 1305 /* Audit system configuration change */ #define AUDIT_SOCKADDR 1306 /* sockaddr copied as syscall arg */ #define AUDIT_CWD 1307 /* Current working directory */ +#define AUDIT_EXECVE 1309 /* execve arguments */ #define AUDIT_IPC_SET_PERM 1311 /* IPC new permissions record type */ +#define AUDIT_MQ_OPEN 1312 /* POSIX MQ open record type */ +#define AUDIT_MQ_SENDRECV 1313 /* POSIX MQ send/receive record type */ +#define AUDIT_MQ_NOTIFY 1314 /* POSIX MQ notify record type */ +#define AUDIT_MQ_GETSETATTR 1315 /* POSIX MQ get/set attribute record type */ #define AUDIT_AVC 1400 /* SE Linux avc denial or grant */ #define AUDIT_SELINUX_ERR 1401 /* Internal SE Linux Errors */ @@ -118,10 +122,21 @@ /* Rule structure sizes -- if these change, different AUDIT_ADD and * AUDIT_LIST commands must be implemented. */ #define AUDIT_MAX_FIELDS 64 +#define AUDIT_MAX_KEY_LEN 32 #define AUDIT_BITMASK_SIZE 64 #define AUDIT_WORD(nr) ((__u32)((nr)/32)) #define AUDIT_BIT(nr) (1 << ((nr) - AUDIT_WORD(nr)*32)) +#define AUDIT_SYSCALL_CLASSES 16 +#define AUDIT_CLASS_DIR_WRITE 0 +#define AUDIT_CLASS_DIR_WRITE_32 1 +#define AUDIT_CLASS_CHATTR 2 +#define AUDIT_CLASS_CHATTR_32 3 +#define AUDIT_CLASS_READ 4 +#define AUDIT_CLASS_READ_32 5 +#define AUDIT_CLASS_WRITE 6 +#define AUDIT_CLASS_WRITE_32 7 + /* This bitmask is used to validate user input. It represents all bits that * are currently used in an audit field constant understood by the kernel. * If you are adding a new #define AUDIT_, please ensure that @@ -146,11 +161,17 @@ #define AUDIT_PERS 10 #define AUDIT_ARCH 11 #define AUDIT_MSGTYPE 12 -#define AUDIT_SE_USER 13 /* security label user */ -#define AUDIT_SE_ROLE 14 /* security label role */ -#define AUDIT_SE_TYPE 15 /* security label type */ -#define AUDIT_SE_SEN 16 /* security label sensitivity label */ -#define AUDIT_SE_CLR 17 /* security label clearance label */ +#define AUDIT_SUBJ_USER 13 /* security label user */ +#define AUDIT_SUBJ_ROLE 14 /* security label role */ +#define AUDIT_SUBJ_TYPE 15 /* security label type */ +#define AUDIT_SUBJ_SEN 16 /* security label sensitivity label */ +#define AUDIT_SUBJ_CLR 17 /* security label clearance label */ +#define AUDIT_PPID 18 +#define AUDIT_OBJ_USER 19 +#define AUDIT_OBJ_ROLE 20 +#define AUDIT_OBJ_TYPE 21 +#define AUDIT_OBJ_LEV_LOW 22 +#define AUDIT_OBJ_LEV_HIGH 23 /* These are ONLY useful when checking * at syscall exit time (AUDIT_AT_EXIT). */ @@ -159,12 +180,16 @@ #define AUDIT_INODE 102 #define AUDIT_EXIT 103 #define AUDIT_SUCCESS 104 /* exit >= 0; value ignored */ +#define AUDIT_WATCH 105 +#define AUDIT_PERM 106 #define AUDIT_ARG0 200 #define AUDIT_ARG1 (AUDIT_ARG0+1) #define AUDIT_ARG2 (AUDIT_ARG0+2) #define AUDIT_ARG3 (AUDIT_ARG0+3) +#define AUDIT_FILTERKEY 210 + #define AUDIT_NEGATE 0x80000000 /* These are the supported operators. @@ -232,6 +257,11 @@ #define AUDIT_ARCH_V850 (EM_V850|__AUDIT_ARCH_LE) #define AUDIT_ARCH_X86_64 (EM_X86_64|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE) +#define AUDIT_PERM_EXEC 1 +#define AUDIT_PERM_WRITE 2 +#define AUDIT_PERM_READ 4 +#define AUDIT_PERM_ATTR 8 + struct audit_status { __u32 mask; /* Bit mask for valid entries */ __u32 enabled; /* 1 = enabled, 0 = disabled */ @@ -273,21 +303,28 @@ struct audit_rule { /* for AUDIT_LIST, AUDIT_ADD, and AUDIT_DEL */ }; #ifdef __KERNEL__ +#include struct audit_sig_info { uid_t uid; pid_t pid; + char ctx[0]; }; struct audit_buffer; struct audit_context; struct inode; struct netlink_skb_parms; +struct linux_binprm; +struct mq_attr; +struct mqstat; #define AUDITSC_INVALID 0 #define AUDITSC_SUCCESS 1 #define AUDITSC_FAILURE 2 #define AUDITSC_RESULT(x) ( ((long)(x))<0?AUDITSC_FAILURE:AUDITSC_SUCCESS ) +extern int __init audit_register_class(int class, unsigned *list); +extern int audit_classify_syscall(int abi, unsigned syscall); #ifdef CONFIG_AUDITSYSCALL /* These are defined in auditsc.c */ /* Public API */ @@ -297,21 +334,35 @@ extern void audit_syscall_entry(int arch, int major, unsigned long a0, unsigned long a1, unsigned long a2, unsigned long a3); extern void audit_syscall_exit(int failed, long return_code); -extern void audit_getname(const char *name); +extern void __audit_getname(const char *name); extern void audit_putname(const char *name); -extern void __audit_inode(const char *name, const struct inode *inode, unsigned flags); +extern void __audit_inode(const char *name, const struct inode *inode); extern void __audit_inode_child(const char *dname, const struct inode *inode, - unsigned long pino); -static inline void audit_inode(const char *name, const struct inode *inode, - unsigned flags) { - if (unlikely(current->audit_context)) - __audit_inode(name, inode, flags); + const struct inode *parent); +extern void __audit_inode_update(const struct inode *inode); +static inline int audit_dummy_context(void) +{ + void *p = current->audit_context; + return !p || *(int *)p; +} +static inline void audit_getname(const char *name) +{ + if (unlikely(!audit_dummy_context())) + __audit_getname(name); +} +static inline void audit_inode(const char *name, const struct inode *inode) { + if (unlikely(!audit_dummy_context())) + __audit_inode(name, inode); } static inline void audit_inode_child(const char *dname, - const struct inode *inode, - unsigned long pino) { - if (unlikely(current->audit_context)) - __audit_inode_child(dname, inode, pino); + const struct inode *inode, + const struct inode *parent) { + if (unlikely(!audit_dummy_context())) + __audit_inode_child(dname, inode, parent); +} +static inline void audit_inode_update(const struct inode *inode) { + if (unlikely(!audit_dummy_context())) + __audit_inode_update(inode); } /* Private API (for audit.c only) */ @@ -320,33 +371,91 @@ extern void auditsc_get_stamp(struct audit_context *ctx, struct timespec *t, unsigned int *serial); extern int audit_set_loginuid(struct task_struct *task, uid_t loginuid); extern uid_t audit_get_loginuid(struct audit_context *ctx); -extern int audit_ipc_obj(struct kern_ipc_perm *ipcp); -extern int audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode, struct kern_ipc_perm *ipcp); +extern int __audit_ipc_obj(struct kern_ipc_perm *ipcp); +extern int __audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode); +extern int audit_bprm(struct linux_binprm *bprm); extern int audit_socketcall(int nargs, unsigned long *args); extern int audit_sockaddr(int len, void *addr); extern int audit_avc_path(struct dentry *dentry, struct vfsmount *mnt); -extern void audit_signal_info(int sig, struct task_struct *t); extern int audit_set_macxattr(const char *name); +extern int __audit_mq_open(int oflag, mode_t mode, struct mq_attr __user *u_attr); +extern int __audit_mq_timedsend(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec __user *u_abs_timeout); +extern int __audit_mq_timedreceive(mqd_t mqdes, size_t msg_len, unsigned int __user *u_msg_prio, const struct timespec __user *u_abs_timeout); +extern int __audit_mq_notify(mqd_t mqdes, const struct sigevent __user *u_notification); +extern int __audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat); + +static inline int audit_ipc_obj(struct kern_ipc_perm *ipcp) +{ + if (unlikely(!audit_dummy_context())) + return __audit_ipc_obj(ipcp); + return 0; +} +static inline int audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode) +{ + if (unlikely(!audit_dummy_context())) + return __audit_ipc_set_perm(qbytes, uid, gid, mode); + return 0; +} +static inline int audit_mq_open(int oflag, mode_t mode, struct mq_attr __user *u_attr) +{ + if (unlikely(!audit_dummy_context())) + return __audit_mq_open(oflag, mode, u_attr); + return 0; +} +static inline int audit_mq_timedsend(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec __user *u_abs_timeout) +{ + if (unlikely(!audit_dummy_context())) + return __audit_mq_timedsend(mqdes, msg_len, msg_prio, u_abs_timeout); + return 0; +} +static inline int audit_mq_timedreceive(mqd_t mqdes, size_t msg_len, unsigned int __user *u_msg_prio, const struct timespec __user *u_abs_timeout) +{ + if (unlikely(!audit_dummy_context())) + return __audit_mq_timedreceive(mqdes, msg_len, u_msg_prio, u_abs_timeout); + return 0; +} +static inline int audit_mq_notify(mqd_t mqdes, const struct sigevent __user *u_notification) +{ + if (unlikely(!audit_dummy_context())) + return __audit_mq_notify(mqdes, u_notification); + return 0; +} +static inline int audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat) +{ + if (unlikely(!audit_dummy_context())) + return __audit_mq_getsetattr(mqdes, mqstat); + return 0; +} +extern int audit_n_rules; #else #define audit_alloc(t) ({ 0; }) #define audit_free(t) do { ; } while (0) #define audit_syscall_entry(ta,a,b,c,d,e) do { ; } while (0) #define audit_syscall_exit(f,r) do { ; } while (0) +#define audit_dummy_context() 1 #define audit_getname(n) do { ; } while (0) #define audit_putname(n) do { ; } while (0) -#define __audit_inode(n,i,f) do { ; } while (0) +#define __audit_inode(n,i) do { ; } while (0) #define __audit_inode_child(d,i,p) do { ; } while (0) -#define audit_inode(n,i,f) do { ; } while (0) +#define __audit_inode_update(i) do { ; } while (0) +#define audit_inode(n,i) do { ; } while (0) #define audit_inode_child(d,i,p) do { ; } while (0) +#define audit_inode_update(i) do { ; } while (0) #define auditsc_get_stamp(c,t,s) do { BUG(); } while (0) #define audit_get_loginuid(c) ({ -1; }) #define audit_ipc_obj(i) ({ 0; }) -#define audit_ipc_set_perm(q,u,g,m,i) ({ 0; }) +#define audit_ipc_set_perm(q,u,g,m) ({ 0; }) +#define audit_bprm(p) ({ 0; }) #define audit_socketcall(n,a) ({ 0; }) #define audit_sockaddr(len, addr) ({ 0; }) #define audit_avc_path(dentry, mnt) ({ 0; }) -#define audit_signal_info(s,t) do { ; } while (0) #define audit_set_macxattr(n) do { ; } while (0) +#define audit_mq_open(o,m,a) ({ 0; }) +#define audit_mq_timedsend(d,l,p,t) ({ 0; }) +#define audit_mq_timedreceive(d,l,p,t) ({ 0; }) +#define audit_mq_notify(d,n) ({ 0; }) +#define audit_mq_getsetattr(d,s) ({ 0; }) +#define audit_n_rules 0 #endif #ifdef CONFIG_AUDIT @@ -364,8 +473,11 @@ extern void audit_log_end(struct audit_buffer *ab); extern void audit_log_hex(struct audit_buffer *ab, const unsigned char *buf, size_t len); -extern void audit_log_untrustedstring(struct audit_buffer *ab, +extern const char * audit_log_untrustedstring(struct audit_buffer *ab, const char *string); +extern const char * audit_log_n_untrustedstring(struct audit_buffer *ab, + size_t n, + const char *string); extern void audit_log_d_path(struct audit_buffer *ab, const char *prefix, struct dentry *dentry, @@ -383,8 +495,8 @@ extern int audit_receive_filter(int type, int pid, int uid, int seq, #define audit_log_end(b) do { ; } while (0) #define audit_log_hex(a,b,l) do { ; } while (0) #define audit_log_untrustedstring(a,s) do { ; } while (0) +#define audit_log_n_untrustedstring(a,n,s) do { ; } while (0) #define audit_log_d_path(b,p,d,v) do { ; } while (0) -#define audit_panic(m) do { ; } while (0) #endif #endif #endif diff --git a/include/linux/bio.h b/include/linux/bio.h index b60ffe32c..76bdaeab6 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -47,7 +47,7 @@ #define BIO_BUG_ON #endif -#define BIO_MAX_PAGES (256) +#define BIO_MAX_PAGES 256 #define BIO_MAX_SIZE (BIO_MAX_PAGES << PAGE_CACHE_SHIFT) #define BIO_MAX_SECTORS (BIO_MAX_SIZE >> 9) diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h index cff80436f..a1460b5fc 100644 --- a/include/linux/bitmap.h +++ b/include/linux/bitmap.h @@ -24,6 +24,9 @@ * The available bitmap operations and their rough meaning in the * case that the bitmap is a single unsigned long are thus: * + * Note that nbits should be always a compile time evaluable constant. + * Otherwise many inlines will generate horrible code. + * * bitmap_zero(dst, nbits) *dst = 0UL * bitmap_fill(dst, nbits) *dst = ~0UL * bitmap_copy(dst, src, nbits) *dst = *src @@ -244,6 +247,8 @@ static inline int __must_check bitmap_full(const unsigned long *src, int nbits) static inline int __must_check bitmap_weight(const unsigned long *src, int nbits) { + if (nbits <= BITS_PER_LONG) + return hweight_long(*src & BITMAP_LAST_WORD_MASK(nbits)); return __bitmap_weight(src, nbits); } diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 59e1259b1..aafe82788 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1,7 +1,6 @@ #ifndef _LINUX_BLKDEV_H #define _LINUX_BLKDEV_H -#include #include #include #include @@ -152,11 +151,9 @@ struct request { void *elevator_private; void *completion_data; - unsigned short ioprio; - int rq_status; /* should split this into a few status bits */ - struct gendisk *rq_disk; int errors; + struct gendisk *rq_disk; unsigned long start_time; /* Number of scatter-gather DMA addr+len pairs after @@ -171,8 +168,9 @@ struct request { */ unsigned short nr_hw_segments; + unsigned short ioprio; + int tag; - char *buffer; int ref_count; request_queue_t *q; @@ -180,6 +178,7 @@ struct request { struct completion *waiting; void *special; + char *buffer; /* * when request is used as a packet command carrier @@ -188,19 +187,13 @@ struct request { unsigned char cmd[BLK_MAX_CDB]; unsigned int data_len; - void *data; - unsigned int sense_len; + void *data; void *sense; unsigned int timeout; int retries; - /* - * For Power Management requests - */ - struct request_pm_state *pm; - /* * completion callback. end_io_data should be folded in with waiting */ @@ -242,6 +235,7 @@ enum rq_flag_bits { __REQ_PM_RESUME, /* resume request */ __REQ_PM_SHUTDOWN, /* shutdown request */ __REQ_ORDERED_COLOR, /* is before or after barrier */ + __REQ_RW_SYNC, /* request is sync (O_DIRECT) */ __REQ_NR_BITS, /* stops here */ }; @@ -271,6 +265,7 @@ enum rq_flag_bits { #define REQ_PM_RESUME (1 << __REQ_PM_RESUME) #define REQ_PM_SHUTDOWN (1 << __REQ_PM_SHUTDOWN) #define REQ_ORDERED_COLOR (1 << __REQ_ORDERED_COLOR) +#define REQ_RW_SYNC (1 << __REQ_RW_SYNC) /* * State information carried for REQ_PM_SUSPEND and REQ_PM_RESUME @@ -439,9 +434,6 @@ struct request_queue #define RQ_INACTIVE (-1) #define RQ_ACTIVE 1 -#define RQ_SCSI_BUSY 0xffff -#define RQ_SCSI_DONE 0xfffe -#define RQ_SCSI_DISCONNECTING 0xffe0 #define QUEUE_FLAG_CLUSTER 0 /* cluster several segments into 1 */ #define QUEUE_FLAG_QUEUED 1 /* uses generic tag queueing */ diff --git a/include/linux/blkpg.h b/include/linux/blkpg.h index be5d0f4ad..faf8a45af 100644 --- a/include/linux/blkpg.h +++ b/include/linux/blkpg.h @@ -24,6 +24,7 @@ * * For today, only the partition stuff - aeb, 990515 */ +#include #include #define BLKPG _IO(0x12,105) diff --git a/include/linux/blktrace_api.h b/include/linux/blktrace_api.h index b34d3e73d..7520cc1ff 100644 --- a/include/linux/blktrace_api.h +++ b/include/linux/blktrace_api.h @@ -1,7 +1,6 @@ #ifndef BLKTRACE_H #define BLKTRACE_H -#include #include #include @@ -12,7 +11,7 @@ enum blktrace_cat { BLK_TC_READ = 1 << 0, /* reads */ BLK_TC_WRITE = 1 << 1, /* writes */ BLK_TC_BARRIER = 1 << 2, /* barrier */ - BLK_TC_SYNC = 1 << 3, /* barrier */ + BLK_TC_SYNC = 1 << 3, /* sync IO */ BLK_TC_QUEUE = 1 << 4, /* queueing/merging */ BLK_TC_REQUEUE = 1 << 5, /* requeueing */ BLK_TC_ISSUE = 1 << 6, /* issue */ @@ -20,6 +19,7 @@ enum blktrace_cat { BLK_TC_FS = 1 << 8, /* fs requests */ BLK_TC_PC = 1 << 9, /* pc requests */ BLK_TC_NOTIFY = 1 << 10, /* special message */ + BLK_TC_AHEAD = 1 << 11, /* readahead */ BLK_TC_END = 1 << 15, /* only 16-bits, reminder */ }; @@ -91,9 +91,9 @@ struct blk_io_trace { * The remap event */ struct blk_io_trace_remap { - u32 device; + __be32 device; u32 __pad; - u64 sector; + __be64 sector; }; enum { @@ -148,7 +148,7 @@ static inline void blk_add_trace_rq(struct request_queue *q, struct request *rq, u32 what) { struct blk_trace *bt = q->blk_trace; - int rw = rq->flags & 0x07; + int rw = rq->flags & 0x03; if (likely(!bt)) return; @@ -225,7 +225,7 @@ static inline void blk_add_trace_pdu_int(struct request_queue *q, u32 what, struct bio *bio, unsigned int pdu) { struct blk_trace *bt = q->blk_trace; - u64 rpdu = cpu_to_be64(pdu); + __be64 rpdu = cpu_to_be64(pdu); if (likely(!bt)) return; diff --git a/include/linux/blockgroup_lock.h b/include/linux/blockgroup_lock.h index 0137ee5dd..860731298 100644 --- a/include/linux/blockgroup_lock.h +++ b/include/linux/blockgroup_lock.h @@ -6,7 +6,6 @@ * Simple hashed spinlocking. */ -#include #include #include diff --git a/include/linux/bootmem.h b/include/linux/bootmem.h index da2d107fe..1021f508d 100644 --- a/include/linux/bootmem.h +++ b/include/linux/bootmem.h @@ -91,8 +91,8 @@ static inline void *alloc_remap(int nid, unsigned long size) } #endif -extern unsigned long __initdata nr_kernel_pages; -extern unsigned long __initdata nr_all_pages; +extern unsigned long __meminitdata nr_kernel_pages; +extern unsigned long nr_all_pages; extern void *__init alloc_large_system_hash(const char *tablename, unsigned long bucketsize, diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index 08033f3ac..2c4bbb811 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h @@ -149,7 +149,6 @@ void create_empty_buffers(struct page *, unsigned long, unsigned long b_state); void end_buffer_read_sync(struct buffer_head *bh, int uptodate); void end_buffer_write_sync(struct buffer_head *bh, int uptodate); -void end_buffer_async_write(struct buffer_head *bh, int uptodate); /* Things to do with buffers at mapping->private_list */ void mark_buffer_dirty_inode(struct buffer_head *bh, struct inode *inode); @@ -215,6 +214,7 @@ int nobh_truncate_page(struct address_space *, loff_t); int nobh_writepage(struct page *page, get_block_t *get_block, struct writeback_control *wbc); +void buffer_init(void); /* * inline definitions diff --git a/include/linux/cache.h b/include/linux/cache.h index cc4b3aafa..4552504c0 100644 --- a/include/linux/cache.h +++ b/include/linux/cache.h @@ -2,7 +2,6 @@ #define __LINUX_CACHE_H #include -#include #include #ifndef L1_CACHE_ALIGN diff --git a/include/linux/cn_proc.h b/include/linux/cn_proc.h index 1417de935..1c86d65bc 100644 --- a/include/linux/cn_proc.h +++ b/include/linux/cn_proc.h @@ -3,31 +3,22 @@ * * Copyright (C) Matt Helsley, IBM Corp. 2005 * Based on cn_fork.h by Nguyen Anh Quynh and Guillaume Thouvenin - * Original copyright notice follows: * Copyright (C) 2005 Nguyen Anh Quynh * Copyright (C) 2005 Guillaume Thouvenin * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2.1 of the GNU Lesser General Public License + * as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * This program is distributed in the hope that it would be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef CN_PROC_H #define CN_PROC_H #include -#include -#include /* * Userspace sends this enum to register with the kernel that it is listening @@ -66,7 +57,8 @@ struct proc_event { PROC_EVENT_EXIT = 0x80000000 } what; __u32 cpu; - struct timespec timestamp; + __u64 __attribute__((aligned(8))) timestamp_ns; + /* Number of nano seconds since system boot */ union { /* must be last field of proc_event struct */ struct { __u32 err; diff --git a/include/linux/coda.h b/include/linux/coda.h index bbc5afcd7..b5cf0780c 100644 --- a/include/linux/coda.h +++ b/include/linux/coda.h @@ -59,7 +59,6 @@ Mellon the rights to redistribute these changes without encumbrance. #ifndef _CODA_HEADER_ #define _CODA_HEADER_ -#include /* Catch new _KERNEL defn for NetBSD and DJGPP/__CYGWIN32__ */ #if defined(__NetBSD__) || \ diff --git a/include/linux/coda_linux.h b/include/linux/coda_linux.h index b3ecf8f71..be512cc98 100644 --- a/include/linux/coda_linux.h +++ b/include/linux/coda_linux.h @@ -27,8 +27,8 @@ extern struct inode_operations coda_dir_inode_operations; extern struct inode_operations coda_file_inode_operations; extern struct inode_operations coda_ioctl_inode_operations; -extern struct address_space_operations coda_file_aops; -extern struct address_space_operations coda_symlink_aops; +extern const struct address_space_operations coda_file_aops; +extern const struct address_space_operations coda_symlink_aops; extern const struct file_operations coda_dir_operations; extern const struct file_operations coda_file_operations; @@ -36,7 +36,7 @@ extern const struct file_operations coda_ioctl_operations; /* operations shared over more than one file */ int coda_open(struct inode *i, struct file *f); -int coda_flush(struct file *f); +int coda_flush(struct file *f, fl_owner_t id); int coda_release(struct inode *i, struct file *f); int coda_permission(struct inode *inode, int mask, struct nameidata *nd); int coda_revalidate_inode(struct dentry *); diff --git a/include/linux/coda_psdev.h b/include/linux/coda_psdev.h index d539262a8..98f6c52c1 100644 --- a/include/linux/coda_psdev.h +++ b/include/linux/coda_psdev.h @@ -70,7 +70,7 @@ int venus_pioctl(struct super_block *sb, struct CodaFid *fid, unsigned int cmd, struct PioctlData *data); int coda_downcall(int opcode, union outputArgs *out, struct super_block *sb); int venus_fsync(struct super_block *sb, struct CodaFid *fid); -int venus_statfs(struct super_block *sb, struct kstatfs *sfs); +int venus_statfs(struct dentry *dentry, struct kstatfs *sfs); /* messages between coda filesystem in kernel and Venus */ diff --git a/include/linux/compat.h b/include/linux/compat.h index 6d3a654be..9760753e6 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -4,7 +4,6 @@ * These are the type definitions for the architecture specific * syscall compatibility layer. */ -#include #ifdef CONFIG_COMPAT @@ -227,5 +226,7 @@ static inline int compat_timespec_compare(struct compat_timespec *lhs, asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp); +extern int compat_printk(const char *fmt, ...); + #endif /* CONFIG_COMPAT */ #endif /* _LINUX_COMPAT_H */ diff --git a/include/linux/compat_ioctl.h b/include/linux/compat_ioctl.h index 89ab677cb..bea025519 100644 --- a/include/linux/compat_ioctl.h +++ b/include/linux/compat_ioctl.h @@ -216,6 +216,7 @@ COMPATIBLE_IOCTL(VT_RESIZE) COMPATIBLE_IOCTL(VT_RESIZEX) COMPATIBLE_IOCTL(VT_LOCKSWITCH) COMPATIBLE_IOCTL(VT_UNLOCKSWITCH) +COMPATIBLE_IOCTL(VT_GETHIFONTMASK) /* Little p (/dev/rtc, /dev/envctrl, etc.) */ COMPATIBLE_IOCTL(RTC_AIE_ON) COMPATIBLE_IOCTL(RTC_AIE_OFF) @@ -567,11 +568,6 @@ COMPATIBLE_IOCTL(AUTOFS_IOC_PROTOSUBVER) COMPATIBLE_IOCTL(AUTOFS_IOC_ASKREGHOST) COMPATIBLE_IOCTL(AUTOFS_IOC_TOGGLEREGHOST) COMPATIBLE_IOCTL(AUTOFS_IOC_ASKUMOUNT) -/* DEVFS */ -COMPATIBLE_IOCTL(DEVFSDIOC_GET_PROTO_REV) -COMPATIBLE_IOCTL(DEVFSDIOC_SET_EVENT_MASK) -COMPATIBLE_IOCTL(DEVFSDIOC_RELEASE_EVENT_QUEUE) -COMPATIBLE_IOCTL(DEVFSDIOC_SET_DEBUG_MASK) /* Raw devices */ COMPATIBLE_IOCTL(RAW_SETBIND) COMPATIBLE_IOCTL(RAW_GETBIND) @@ -673,6 +669,11 @@ COMPATIBLE_IOCTL(CAPI_SET_FLAGS) COMPATIBLE_IOCTL(CAPI_CLR_FLAGS) COMPATIBLE_IOCTL(CAPI_NCCI_OPENCOUNT) COMPATIBLE_IOCTL(CAPI_NCCI_GETUNIT) +/* Siemens Gigaset */ +COMPATIBLE_IOCTL(GIGASET_REDIR) +COMPATIBLE_IOCTL(GIGASET_CONFIG) +COMPATIBLE_IOCTL(GIGASET_BRKCHARS) +COMPATIBLE_IOCTL(GIGASET_VERSION) /* Misc. */ COMPATIBLE_IOCTL(0x41545900) /* ATYIO_CLKR */ COMPATIBLE_IOCTL(0x41545901) /* ATYIO_CLKW */ diff --git a/include/linux/compiler.h b/include/linux/compiler.h index f23d3c6fc..9b4f11094 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h @@ -78,6 +78,7 @@ extern void __chk_io_ptr(void __iomem *); #endif /* __ASSEMBLY__ */ +#ifdef __KERNEL__ /* * Allow us to mark functions as 'deprecated' and have gcc emit a nice * warning for each use, in hopes of speeding the functions removal. @@ -127,6 +128,16 @@ extern void __chk_io_ptr(void __iomem *); # define __attribute_pure__ /* unimplemented */ #endif +#ifndef noinline +#define noinline +#endif + +#ifndef __always_inline +#define __always_inline inline +#endif + +#endif /* __KERNEL__ */ + /* * From the GCC manual: * @@ -145,12 +156,4 @@ extern void __chk_io_ptr(void __iomem *); # define __attribute_const__ /* unimplemented */ #endif -#ifndef noinline -#define noinline -#endif - -#ifndef __always_inline -#define __always_inline inline -#endif - #endif /* __LINUX_COMPILER_H */ diff --git a/include/linux/completion.h b/include/linux/completion.h index 90663ad21..268c5a4a2 100644 --- a/include/linux/completion.h +++ b/include/linux/completion.h @@ -18,9 +18,24 @@ struct completion { #define COMPLETION_INITIALIZER(work) \ { 0, __WAIT_QUEUE_HEAD_INITIALIZER((work).wait) } +#define COMPLETION_INITIALIZER_ONSTACK(work) \ + ({ init_completion(&work); work; }) + #define DECLARE_COMPLETION(work) \ struct completion work = COMPLETION_INITIALIZER(work) +/* + * Lockdep needs to run a non-constant initializer for on-stack + * completions - so we use the _ONSTACK() variant for those that + * are on the kernel stack: + */ +#ifdef CONFIG_LOCKDEP +# define DECLARE_COMPLETION_ONSTACK(work) \ + struct completion work = COMPLETION_INITIALIZER_ONSTACK(work) +#else +# define DECLARE_COMPLETION_ONSTACK(work) DECLARE_COMPLETION(work) +#endif + static inline void init_completion(struct completion *x) { x->done = 0; diff --git a/include/linux/config.h b/include/linux/config.h index 4337c2f43..db6e5cae6 100644 --- a/include/linux/config.h +++ b/include/linux/config.h @@ -3,6 +3,7 @@ /* This file is no longer in use and kept only for backward compatibility. * autoconf.h is now included via -imacros on the commandline */ +#warning Including config.h is deprecated. #include #if !defined (__KERNEL__) && !defined(__KERNGLUE__) #error including kernel header in userspace; use the glibc headers instead! diff --git a/include/linux/connector.h b/include/linux/connector.h index ad1a22c1c..4c02119c6 100644 --- a/include/linux/connector.h +++ b/include/linux/connector.h @@ -34,8 +34,11 @@ #define CN_VAL_PROC 0x1 #define CN_IDX_CIFS 0x2 #define CN_VAL_CIFS 0x1 +#define CN_W1_IDX 0x3 /* w1 communication */ +#define CN_W1_VAL 0x1 -#define CN_NETLINK_USERS 1 + +#define CN_NETLINK_USERS 4 /* * Maximum connector's message size. diff --git a/include/linux/console.h b/include/linux/console.h index 721371382..3bdf2155e 100644 --- a/include/linux/console.h +++ b/include/linux/console.h @@ -63,9 +63,11 @@ extern const struct consw vga_con; /* VGA text console */ extern const struct consw newport_con; /* SGI Newport console */ extern const struct consw prom_con; /* SPARC PROM console */ +int con_is_bound(const struct consw *csw); +int register_con_driver(const struct consw *csw, int first, int last); +int unregister_con_driver(const struct consw *csw); int take_over_console(const struct consw *sw, int first, int last, int deflt); void give_up_console(const struct consw *sw); - /* scroll */ #define SM_UP (1) #define SM_DOWN (2) @@ -87,6 +89,7 @@ void give_up_console(const struct consw *sw); #define CON_CONSDEV (2) /* Last on the command line */ #define CON_ENABLED (4) #define CON_BOOT (8) +#define CON_ANYTIME (16) /* Safe to call when cpu is offline */ struct console { @@ -117,6 +120,10 @@ extern void console_stop(struct console *); extern void console_start(struct console *); extern int is_console_locked(void); +/* Suspend and resume console messages over PM events */ +extern void suspend_console(void); +extern void resume_console(void); + /* Some debug stub to catch some of the obvious races in the VT code */ #if 1 #define WARN_CONSOLE_UNLOCKED() WARN_ON(!is_console_locked() && !oops_in_progress) diff --git a/include/linux/console_struct.h b/include/linux/console_struct.h index f8e5587a0..25423f79b 100644 --- a/include/linux/console_struct.h +++ b/include/linux/console_struct.h @@ -9,6 +9,7 @@ * to achieve effects such as fast scrolling by changing the origin. */ +#include #include struct vt_struct; diff --git a/include/linux/cpu.h b/include/linux/cpu.h index 08d50c53a..3fef7d67a 100644 --- a/include/linux/cpu.h +++ b/include/linux/cpu.h @@ -31,18 +31,23 @@ struct cpu { struct sys_device sysdev; }; -extern int register_cpu(struct cpu *, int, struct node *); +extern int register_cpu(struct cpu *cpu, int num); extern struct sys_device *get_cpu_sysdev(unsigned cpu); #ifdef CONFIG_HOTPLUG_CPU -extern void unregister_cpu(struct cpu *, struct node *); +extern void unregister_cpu(struct cpu *cpu); #endif struct notifier_block; #ifdef CONFIG_SMP /* Need to know about CPUs going up/down? */ extern int register_cpu_notifier(struct notifier_block *nb); +#ifdef CONFIG_HOTPLUG_CPU extern void unregister_cpu_notifier(struct notifier_block *nb); -extern int current_in_cpu_hotplug(void); +#else +static inline void unregister_cpu_notifier(struct notifier_block *nb) +{ +} +#endif int cpu_up(unsigned int cpu); @@ -55,10 +60,6 @@ static inline int register_cpu_notifier(struct notifier_block *nb) static inline void unregister_cpu_notifier(struct notifier_block *nb) { } -static inline int current_in_cpu_hotplug(void) -{ - return 0; -} #endif /* CONFIG_SMP */ extern struct sysdev_class cpu_sysdev_class; @@ -67,22 +68,33 @@ extern struct sysdev_class cpu_sysdev_class; /* Stop CPUs going up and down. */ 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 }; \ register_cpu_notifier(&fn##_nb); \ } +#define register_hotcpu_notifier(nb) register_cpu_notifier(nb) +#define unregister_hotcpu_notifier(nb) unregister_cpu_notifier(nb) int cpu_down(unsigned int cpu); #define cpu_is_offline(cpu) unlikely(!cpu_online(cpu)) #else #define lock_cpu_hotplug() do { } while (0) #define unlock_cpu_hotplug() do { } while (0) #define lock_cpu_hotplug_interruptible() 0 -#define hotcpu_notifier(fn, pri) +#define hotcpu_notifier(fn, pri) do { } while (0) +#define register_hotcpu_notifier(nb) do { } while (0) +#define unregister_hotcpu_notifier(nb) do { } while (0) /* CPUs don't go offline once they're online w/o CONFIG_HOTPLUG_CPU */ static inline int cpu_is_offline(int cpu) { return 0; } #endif +#ifdef CONFIG_SUSPEND_SMP +extern int disable_nonboot_cpus(void); +extern void enable_nonboot_cpus(void); +#else +static inline int disable_nonboot_cpus(void) { return 0; } +static inline void enable_nonboot_cpus(void) {} +#endif + #endif /* _LINUX_CPU_H_ */ diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index 17866d7e2..4ea39fee9 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h @@ -15,7 +15,6 @@ #define _LINUX_CPUFREQ_H #include -#include #include #include #include @@ -73,6 +72,8 @@ struct cpufreq_real_policy { struct cpufreq_policy { cpumask_t cpus; /* affected CPUs */ + unsigned int shared_type; /* ANY or ALL affected CPUs + should set cpufreq */ unsigned int cpu; /* cpu nr of registered CPU */ struct cpufreq_cpuinfo cpuinfo;/* see above */ @@ -99,6 +100,10 @@ struct cpufreq_policy { #define CPUFREQ_INCOMPATIBLE (1) #define CPUFREQ_NOTIFY (2) +#define CPUFREQ_SHARED_TYPE_NONE (0) /* None */ +#define CPUFREQ_SHARED_TYPE_HW (1) /* HW does needed coordination */ +#define CPUFREQ_SHARED_TYPE_ALL (2) /* All dependent CPUs should set freq */ +#define CPUFREQ_SHARED_TYPE_ANY (3) /* Freq can be set from any dependent CPU*/ /******************** cpufreq transition notifiers *******************/ @@ -167,9 +172,6 @@ extern int __cpufreq_driver_target(struct cpufreq_policy *policy, unsigned int relation); -/* pass an event to the cpufreq governor */ -int cpufreq_governor(unsigned int cpu, unsigned int event); - int cpufreq_register_governor(struct cpufreq_governor *governor); void cpufreq_unregister_governor(struct cpufreq_governor *governor); diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h index 9cbb781d6..b268a3c0c 100644 --- a/include/linux/cpumask.h +++ b/include/linux/cpumask.h @@ -317,7 +317,8 @@ static inline void __cpus_remap(cpumask_t *dstp, const cpumask_t *srcp, (cpu) < NR_CPUS; \ (cpu) = next_cpu((cpu), (mask))) #else /* NR_CPUS == 1 */ -#define for_each_cpu_mask(cpu, mask) for ((cpu) = 0; (cpu) < 1; (cpu)++) +#define for_each_cpu_mask(cpu, mask) \ + for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask) #endif /* NR_CPUS */ /* @@ -405,7 +406,6 @@ int __any_online_cpu(const cpumask_t *mask); #define any_online_cpu(mask) 0 #endif -#define for_each_cpu(cpu) for_each_cpu_mask((cpu), cpu_possible_map) #define for_each_possible_cpu(cpu) for_each_cpu_mask((cpu), cpu_possible_map) #define for_each_online_cpu(cpu) for_each_cpu_mask((cpu), cpu_online_map) #define for_each_present_cpu(cpu) for_each_cpu_mask((cpu), cpu_present_map) diff --git a/include/linux/cramfs_fs.h b/include/linux/cramfs_fs.h index a8948f34b..a41f38428 100644 --- a/include/linux/cramfs_fs.h +++ b/include/linux/cramfs_fs.h @@ -1,13 +1,7 @@ #ifndef __CRAMFS_H #define __CRAMFS_H -#ifndef __KERNEL__ - -typedef unsigned char u8; -typedef unsigned short u16; -typedef unsigned int u32; - -#endif +#include #define CRAMFS_MAGIC 0x28cd3d45 /* some random number */ #define CRAMFS_SIGNATURE "Compressed ROMFS" @@ -33,9 +27,9 @@ typedef unsigned int u32; * Reasonably terse representation of the inode data. */ struct cramfs_inode { - u32 mode:CRAMFS_MODE_WIDTH, uid:CRAMFS_UID_WIDTH; + __u32 mode:CRAMFS_MODE_WIDTH, uid:CRAMFS_UID_WIDTH; /* SIZE for device files is i_rdev */ - u32 size:CRAMFS_SIZE_WIDTH, gid:CRAMFS_GID_WIDTH; + __u32 size:CRAMFS_SIZE_WIDTH, gid:CRAMFS_GID_WIDTH; /* NAMELEN is the length of the file name, divided by 4 and rounded up. (cramfs doesn't support hard links.) */ /* OFFSET: For symlinks and non-empty regular files, this @@ -44,27 +38,27 @@ struct cramfs_inode { see README). For non-empty directories it is the offset (divided by 4) of the inode of the first file in that directory. For anything else, offset is zero. */ - u32 namelen:CRAMFS_NAMELEN_WIDTH, offset:CRAMFS_OFFSET_WIDTH; + __u32 namelen:CRAMFS_NAMELEN_WIDTH, offset:CRAMFS_OFFSET_WIDTH; }; struct cramfs_info { - u32 crc; - u32 edition; - u32 blocks; - u32 files; + __u32 crc; + __u32 edition; + __u32 blocks; + __u32 files; }; /* * Superblock information at the beginning of the FS. */ struct cramfs_super { - u32 magic; /* 0x28cd3d45 - random number */ - u32 size; /* length in bytes */ - u32 flags; /* feature flags */ - u32 future; /* reserved for future use */ - u8 signature[16]; /* "Compressed ROMFS" */ + __u32 magic; /* 0x28cd3d45 - random number */ + __u32 size; /* length in bytes */ + __u32 flags; /* feature flags */ + __u32 future; /* reserved for future use */ + __u8 signature[16]; /* "Compressed ROMFS" */ struct cramfs_info fsid; /* unique filesystem info */ - u8 name[16]; /* user-defined name */ + __u8 name[16]; /* user-defined name */ struct cramfs_inode root; /* root inode data */ }; diff --git a/include/linux/crypto.h b/include/linux/crypto.h index 4484f5e08..3abe2ac2b 100644 --- a/include/linux/crypto.h +++ b/include/linux/crypto.h @@ -17,7 +17,6 @@ #ifndef _LINUX_CRYPTO_H #define _LINUX_CRYPTO_H -#include #include #include #include @@ -67,7 +66,7 @@ struct crypto_tfm; struct cipher_desc { struct crypto_tfm *tfm; - void (*crfn)(void *ctx, u8 *dst, const u8 *src); + void (*crfn)(struct crypto_tfm *tfm, u8 *dst, const u8 *src); unsigned int (*prfn)(const struct cipher_desc *desc, u8 *dst, const u8 *src, unsigned int nbytes); void *info; @@ -80,10 +79,10 @@ struct cipher_desc { struct cipher_alg { unsigned int cia_min_keysize; unsigned int cia_max_keysize; - int (*cia_setkey)(void *ctx, const u8 *key, + int (*cia_setkey)(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen, u32 *flags); - void (*cia_encrypt)(void *ctx, u8 *dst, const u8 *src); - void (*cia_decrypt)(void *ctx, u8 *dst, const u8 *src); + void (*cia_encrypt)(struct crypto_tfm *tfm, u8 *dst, const u8 *src); + void (*cia_decrypt)(struct crypto_tfm *tfm, u8 *dst, const u8 *src); unsigned int (*cia_encrypt_ecb)(const struct cipher_desc *desc, u8 *dst, const u8 *src, @@ -101,20 +100,19 @@ struct cipher_alg { struct digest_alg { unsigned int dia_digestsize; - void (*dia_init)(void *ctx); - void (*dia_update)(void *ctx, const u8 *data, unsigned int len); - void (*dia_final)(void *ctx, u8 *out); - int (*dia_setkey)(void *ctx, const u8 *key, + void (*dia_init)(struct crypto_tfm *tfm); + void (*dia_update)(struct crypto_tfm *tfm, const u8 *data, + unsigned int len); + void (*dia_final)(struct crypto_tfm *tfm, u8 *out); + int (*dia_setkey)(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen, u32 *flags); }; struct compress_alg { - int (*coa_init)(void *ctx); - void (*coa_exit)(void *ctx); - int (*coa_compress)(void *ctx, const u8 *src, unsigned int slen, - u8 *dst, unsigned int *dlen); - int (*coa_decompress)(void *ctx, const u8 *src, unsigned int slen, - u8 *dst, unsigned int *dlen); + int (*coa_compress)(struct crypto_tfm *tfm, const u8 *src, + unsigned int slen, u8 *dst, unsigned int *dlen); + int (*coa_decompress)(struct crypto_tfm *tfm, const u8 *src, + unsigned int slen, u8 *dst, unsigned int *dlen); }; #define cra_cipher cra_u.cipher @@ -130,14 +128,17 @@ struct crypto_alg { int cra_priority; - const char cra_name[CRYPTO_MAX_ALG_NAME]; - const char cra_driver_name[CRYPTO_MAX_ALG_NAME]; + char cra_name[CRYPTO_MAX_ALG_NAME]; + char cra_driver_name[CRYPTO_MAX_ALG_NAME]; union { struct cipher_alg cipher; struct digest_alg digest; struct compress_alg compress; } cra_u; + + int (*cra_init)(struct crypto_tfm *tfm); + void (*cra_exit)(struct crypto_tfm *tfm); struct module *cra_module; }; diff --git a/include/linux/cyclomx.h b/include/linux/cyclomx.h index 300d704bd..b88f7f428 100644 --- a/include/linux/cyclomx.h +++ b/include/linux/cyclomx.h @@ -24,7 +24,6 @@ * 1998/08/08 acme Version 0.0.1 */ -#include #include #include diff --git a/include/linux/dcache.h b/include/linux/dcache.h index 4607ee97e..ea8510fe0 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h @@ -115,6 +115,18 @@ struct dentry { unsigned char d_iname[DNAME_INLINE_LEN_MIN]; /* small names */ }; +/* + * dentry->d_lock spinlock nesting subclasses: + * + * 0: normal + * 1: nested + */ +enum dentry_d_lock_class +{ + DENTRY_D_LOCK_NORMAL, /* implicitly used by plain spin_lock() APIs. */ + DENTRY_D_LOCK_NESTED +}; + struct dentry_operations { int (*d_revalidate)(struct dentry *, struct nameidata *); int (*d_hash) (struct dentry *, struct qstr *); @@ -210,6 +222,7 @@ static inline int dname_external(struct dentry *dentry) */ extern void d_instantiate(struct dentry *, struct inode *); extern struct dentry * d_instantiate_unique(struct dentry *, struct inode *); +extern struct dentry * d_materialise_unique(struct dentry *, struct inode *); extern void d_delete(struct dentry *); /* allocate/de-allocate */ @@ -218,7 +231,7 @@ extern struct dentry * d_alloc_anon(struct inode *); extern struct dentry * d_splice_alias(struct inode *, struct dentry *); extern void shrink_dcache_sb(struct super_block *); extern void shrink_dcache_parent(struct dentry *); -extern void shrink_dcache_anon(struct hlist_head *); +extern void shrink_dcache_for_umount(struct super_block *); extern int d_invalidate(struct dentry *); extern void flush_dentry_attributes(void); diff --git a/include/linux/dcookies.h b/include/linux/dcookies.h index 1d68428c9..0fe7cdf32 100644 --- a/include/linux/dcookies.h +++ b/include/linux/dcookies.h @@ -9,7 +9,6 @@ #ifndef DCOOKIES_H #define DCOOKIES_H -#include #ifdef CONFIG_PROFILING diff --git a/include/linux/delay.h b/include/linux/delay.h index 868456a62..5443e1fbe 100644 --- a/include/linux/delay.h +++ b/include/linux/delay.h @@ -25,13 +25,15 @@ extern unsigned long loops_per_jiffy; #define MAX_UDELAY_MS 5 #endif -#define mdelay(n) ( \ - { \ - static int warned=0; \ - unsigned long __ms=(n); \ - WARN_ON(in_irq() && !(warned++)); \ - while (__ms--) udelay(1000); \ - }) +#ifndef mdelay +#define mdelay(n) ( \ +{ \ + static int warned=0; \ + unsigned long __ms=(n); \ + WARN_ON(in_irq() && !(warned++)); \ + while (__ms--) udelay(1000); \ +}) +#endif #ifndef ndelay #define ndelay(x) udelay(((x)+999)/1000) diff --git a/include/linux/devfs_fs.h b/include/linux/devfs_fs.h deleted file mode 100644 index de236f431..000000000 --- a/include/linux/devfs_fs.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef _LINUX_DEVFS_FS_H -#define _LINUX_DEVFS_FS_H - -#include - -#define DEVFSD_PROTOCOL_REVISION_KERNEL 5 - -#define DEVFSD_IOCTL_BASE 'd' - -/* These are the various ioctls */ -#define DEVFSDIOC_GET_PROTO_REV _IOR(DEVFSD_IOCTL_BASE, 0, int) -#define DEVFSDIOC_SET_EVENT_MASK _IOW(DEVFSD_IOCTL_BASE, 2, int) -#define DEVFSDIOC_RELEASE_EVENT_QUEUE _IOW(DEVFSD_IOCTL_BASE, 3, int) -#define DEVFSDIOC_SET_DEBUG_MASK _IOW(DEVFSD_IOCTL_BASE, 4, int) - -#define DEVFSD_NOTIFY_REGISTERED 0 -#define DEVFSD_NOTIFY_UNREGISTERED 1 -#define DEVFSD_NOTIFY_ASYNC_OPEN 2 -#define DEVFSD_NOTIFY_CLOSE 3 -#define DEVFSD_NOTIFY_LOOKUP 4 -#define DEVFSD_NOTIFY_CHANGE 5 -#define DEVFSD_NOTIFY_CREATE 6 -#define DEVFSD_NOTIFY_DELETE 7 - -#define DEVFS_PATHLEN 1024 /* Never change this otherwise the - binary interface will change */ - -struct devfsd_notify_struct { /* Use native C types to ensure same types in kernel and user space */ - unsigned int type; /* DEVFSD_NOTIFY_* value */ - unsigned int mode; /* Mode of the inode or device entry */ - unsigned int major; /* Major number of device entry */ - unsigned int minor; /* Minor number of device entry */ - unsigned int uid; /* Uid of process, inode or device entry */ - unsigned int gid; /* Gid of process, inode or device entry */ - unsigned int overrun_count; /* Number of lost events */ - unsigned int namelen; /* Number of characters not including '\0' */ - /* The device name MUST come last */ - char devname[DEVFS_PATHLEN]; /* This will be '\0' terminated */ -}; - -#endif /* _LINUX_DEVFS_FS_H */ diff --git a/include/linux/devfs_fs_kernel.h b/include/linux/devfs_fs_kernel.h deleted file mode 100644 index 89810e73d..000000000 --- a/include/linux/devfs_fs_kernel.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef _LINUX_DEVFS_FS_KERNEL_H -#define _LINUX_DEVFS_FS_KERNEL_H - -#include -#include -#include -#include - -#include - -#define DEVFS_SUPER_MAGIC 0x1373 - -#ifdef CONFIG_DEVFS_FS -extern int devfs_mk_bdev(dev_t dev, umode_t mode, const char *fmt, ...) - __attribute__ ((format(printf, 3, 4))); -extern int devfs_mk_cdev(dev_t dev, umode_t mode, const char *fmt, ...) - __attribute__ ((format(printf, 3, 4))); -extern int devfs_mk_symlink(const char *name, const char *link); -extern int devfs_mk_dir(const char *fmt, ...) - __attribute__ ((format(printf, 1, 2))); -extern void devfs_remove(const char *fmt, ...) - __attribute__ ((format(printf, 1, 2))); -extern int devfs_register_tape(const char *name); -extern void devfs_unregister_tape(int num); -extern void mount_devfs_fs(void); -#else /* CONFIG_DEVFS_FS */ -static inline int devfs_mk_bdev(dev_t dev, umode_t mode, const char *fmt, ...) -{ - return 0; -} -static inline int devfs_mk_cdev(dev_t dev, umode_t mode, const char *fmt, ...) -{ - return 0; -} -static inline int devfs_mk_symlink(const char *name, const char *link) -{ - return 0; -} -static inline int devfs_mk_dir(const char *fmt, ...) -{ - return 0; -} -static inline void devfs_remove(const char *fmt, ...) -{ -} -static inline int devfs_register_tape(const char *name) -{ - return -1; -} -static inline void devfs_unregister_tape(int num) -{ -} -static inline void mount_devfs_fs(void) -{ - return; -} -#endif /* CONFIG_DEVFS_FS */ -#endif /* _LINUX_DEVFS_FS_KERNEL_H */ diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h index aee10b2ea..e3d1c33d1 100644 --- a/include/linux/device-mapper.h +++ b/include/linux/device-mapper.h @@ -8,9 +8,12 @@ #ifndef _LINUX_DEVICE_MAPPER_H #define _LINUX_DEVICE_MAPPER_H +#ifdef __KERNEL__ + struct dm_target; struct dm_table; struct dm_dev; +struct mapped_device; typedef enum { STATUSTYPE_INFO, STATUSTYPE_TABLE } status_type_t; @@ -78,7 +81,7 @@ void dm_put_device(struct dm_target *ti, struct dm_dev *d); struct target_type { const char *name; struct module *module; - unsigned version[3]; + unsigned version[3]; dm_ctr_fn ctr; dm_dtr_fn dtr; dm_map_fn map; @@ -128,4 +131,108 @@ struct dm_target { int dm_register_target(struct target_type *t); int dm_unregister_target(struct target_type *t); -#endif /* _LINUX_DEVICE_MAPPER_H */ + +/*----------------------------------------------------------------- + * Functions for creating and manipulating mapped devices. + * Drop the reference with dm_put when you finish with the object. + *---------------------------------------------------------------*/ + +/* + * DM_ANY_MINOR chooses the next available minor number. + */ +#define DM_ANY_MINOR (-1) +int dm_create(int minor, struct mapped_device **md); + +/* + * Reference counting for md. + */ +struct mapped_device *dm_get_md(dev_t dev); +void dm_get(struct mapped_device *md); +void dm_put(struct mapped_device *md); + +/* + * An arbitrary pointer may be stored alongside a mapped device. + */ +void dm_set_mdptr(struct mapped_device *md, void *ptr); +void *dm_get_mdptr(struct mapped_device *md); + +/* + * A device can still be used while suspended, but I/O is deferred. + */ +int dm_suspend(struct mapped_device *md, int with_lockfs); +int dm_resume(struct mapped_device *md); + +/* + * Event functions. + */ +uint32_t dm_get_event_nr(struct mapped_device *md); +int dm_wait_event(struct mapped_device *md, int event_nr); + +/* + * Info functions. + */ +const char *dm_device_name(struct mapped_device *md); +struct gendisk *dm_disk(struct mapped_device *md); +int dm_suspended(struct mapped_device *md); + +/* + * Geometry functions. + */ +int dm_get_geometry(struct mapped_device *md, struct hd_geometry *geo); +int dm_set_geometry(struct mapped_device *md, struct hd_geometry *geo); + + +/*----------------------------------------------------------------- + * Functions for manipulating device-mapper tables. + *---------------------------------------------------------------*/ + +/* + * First create an empty table. + */ +int dm_table_create(struct dm_table **result, int mode, + unsigned num_targets, struct mapped_device *md); + +/* + * Then call this once for each target. + */ +int dm_table_add_target(struct dm_table *t, const char *type, + sector_t start, sector_t len, char *params); + +/* + * Finally call this to make the table ready for use. + */ +int dm_table_complete(struct dm_table *t); + +/* + * Table reference counting. + */ +struct dm_table *dm_get_table(struct mapped_device *md); +void dm_table_get(struct dm_table *t); +void dm_table_put(struct dm_table *t); + +/* + * Queries + */ +sector_t dm_table_get_size(struct dm_table *t); +unsigned int dm_table_get_num_targets(struct dm_table *t); +int dm_table_get_mode(struct dm_table *t); +struct mapped_device *dm_table_get_md(struct dm_table *t); + +/* + * Trigger an event. + */ +void dm_table_event(struct dm_table *t); + +/* + * The device must be suspended before calling this method. + */ +int dm_swap_table(struct mapped_device *md, struct dm_table *t); + +/* + * Prepare a table for a device that will error all I/O. + * To make it active, call dm_suspend(), dm_swap_table() then dm_resume(). + */ +int dm_create_error_table(struct dm_table **result, struct mapped_device *md); + +#endif /* __KERNEL__ */ +#endif /* _LINUX_DEVICE_MAPPER_H */ diff --git a/include/linux/device.h b/include/linux/device.h index e8e53b9ac..1e5f30da9 100644 --- a/include/linux/device.h +++ b/include/linux/device.h @@ -11,7 +11,6 @@ #ifndef _DEVICE_H_ #define _DEVICE_H_ -#include #include #include #include @@ -61,11 +60,6 @@ extern void bus_unregister(struct bus_type * bus); extern void bus_rescan_devices(struct bus_type * bus); -extern struct bus_type * get_bus(struct bus_type * bus); -extern void put_bus(struct bus_type * bus); - -extern struct bus_type * find_bus(char * name); - /* iterator helpers for buses */ int bus_for_each_dev(struct bus_type * bus, struct device * start, void * data, @@ -148,6 +142,7 @@ struct class { struct subsystem subsys; struct list_head children; + struct list_head devices; struct list_head interfaces; struct semaphore sem; /* locks both the children and interfaces lists */ @@ -164,9 +159,6 @@ struct class { extern int class_register(struct class *); extern void class_unregister(struct class *); -extern struct class * class_get(struct class *); -extern void class_put(struct class *); - struct class_attribute { struct attribute attr; @@ -314,6 +306,7 @@ struct device { struct kobject kobj; char bus_id[BUS_ID_SIZE]; /* position on parent bus */ struct device_attribute uevent_attr; + struct device_attribute *devt_attr; struct semaphore sem; /* semaphore to synchronize calls to * its driver. @@ -341,6 +334,11 @@ struct device { struct dma_coherent_mem *dma_mem; /* internal for coherent mem override */ + /* class_device migration path */ + struct list_head node; + struct class *class; /* optional*/ + dev_t devt; /* dev_t, creates the sysfs "dev" */ + void (*release)(struct device * dev); }; @@ -382,6 +380,13 @@ extern int device_attach(struct device * dev); extern void driver_attach(struct device_driver * drv); extern void device_reprobe(struct device *dev); +/* + * Easy functions for dynamically creating devices on the fly + */ +extern struct device *device_create(struct class *cls, struct device *parent, + dev_t devt, char *fmt, ...) + __attribute__((format(printf,4,5))); +extern void device_destroy(struct class *cls, dev_t devt); /* * Platform "fixup" functions - allow the platform to have their say @@ -411,8 +416,9 @@ extern int firmware_register(struct subsystem *); extern void firmware_unregister(struct subsystem *); /* debugging and troubleshooting/diagnostic helpers. */ +extern const char *dev_driver_string(struct device *dev); #define dev_printk(level, dev, format, arg...) \ - printk(level "%s %s: " format , (dev)->driver ? (dev)->driver->name : "" , (dev)->bus_id , ## arg) + printk(level "%s %s: " format , dev_driver_string(dev) , (dev)->bus_id , ## arg) #ifdef DEBUG #define dev_dbg(dev, format, arg...) \ diff --git a/include/linux/divert.h b/include/linux/divert.h index 6919b0913..8fb4e9de6 100644 --- a/include/linux/divert.h +++ b/include/linux/divert.h @@ -27,10 +27,10 @@ struct divert_blk { int divert; /* are we active */ unsigned int protos; /* protocols */ - u16 tcp_dst[MAX_DIVERT_PORTS]; /* specific tcp dst ports to divert */ - u16 tcp_src[MAX_DIVERT_PORTS]; /* specific tcp src ports to divert */ - u16 udp_dst[MAX_DIVERT_PORTS]; /* specific udp dst ports to divert */ - u16 udp_src[MAX_DIVERT_PORTS]; /* specific udp src ports to divert */ + __u16 tcp_dst[MAX_DIVERT_PORTS]; /* specific tcp dst ports to divert */ + __u16 tcp_src[MAX_DIVERT_PORTS]; /* specific tcp src ports to divert */ + __u16 udp_dst[MAX_DIVERT_PORTS]; /* specific udp dst ports to divert */ + __u16 udp_src[MAX_DIVERT_PORTS]; /* specific udp src ports to divert */ }; /* @@ -40,12 +40,12 @@ struct divert_blk typedef union _divert_cf_arg { - s16 int16; - u16 uint16; - s32 int32; - u32 uint32; - s64 int64; - u64 uint64; + __s16 int16; + __u16 uint16; + __s32 int32; + __u32 uint32; + __s64 int64; + __u64 uint64; void __user *ptr; } divert_cf_arg; diff --git a/include/linux/dm-ioctl.h b/include/linux/dm-ioctl.h index c67c67866..9623bb625 100644 --- a/include/linux/dm-ioctl.h +++ b/include/linux/dm-ioctl.h @@ -285,9 +285,9 @@ typedef char ioctl_struct[308]; #define DM_DEV_SET_GEOMETRY _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl) #define DM_VERSION_MAJOR 4 -#define DM_VERSION_MINOR 6 +#define DM_VERSION_MINOR 7 #define DM_VERSION_PATCHLEVEL 0 -#define DM_VERSION_EXTRA "-ioctl (2006-02-17)" +#define DM_VERSION_EXTRA "-ioctl (2006-06-24)" /* Status bits */ #define DM_READONLY_FLAG (1 << 0) /* In/Out */ @@ -314,7 +314,7 @@ typedef char ioctl_struct[308]; #define DM_BUFFER_FULL_FLAG (1 << 8) /* Out */ /* - * Set this to improve performance when you aren't going to use open_count. + * This flag is now ignored. */ #define DM_SKIP_BDGET_FLAG (1 << 9) /* In */ diff --git a/include/linux/dmi.h b/include/linux/dmi.h index d2bcf5560..0791df281 100644 --- a/include/linux/dmi.h +++ b/include/linux/dmi.h @@ -1,6 +1,8 @@ #ifndef __DMI_H__ #define __DMI_H__ +#include + enum dmi_field { DMI_NONE, DMI_BIOS_VENDOR, @@ -9,12 +11,31 @@ enum dmi_field { DMI_SYS_VENDOR, DMI_PRODUCT_NAME, DMI_PRODUCT_VERSION, + DMI_PRODUCT_SERIAL, DMI_BOARD_VENDOR, DMI_BOARD_NAME, DMI_BOARD_VERSION, DMI_STRING_MAX, }; +enum dmi_device_type { + DMI_DEV_TYPE_ANY = 0, + DMI_DEV_TYPE_OTHER, + DMI_DEV_TYPE_UNKNOWN, + DMI_DEV_TYPE_VIDEO, + DMI_DEV_TYPE_SCSI, + DMI_DEV_TYPE_ETHERNET, + DMI_DEV_TYPE_TOKENRING, + DMI_DEV_TYPE_SOUND, + DMI_DEV_TYPE_IPMI = -1 +}; + +struct dmi_header { + u8 type; + u8 length; + u16 handle; +}; + /* * DMI callbacks for problem boards */ @@ -25,22 +46,36 @@ struct dmi_strmatch { struct dmi_system_id { int (*callback)(struct dmi_system_id *); - char *ident; + const char *ident; struct dmi_strmatch matches[4]; void *driver_data; }; -#define DMI_MATCH(a,b) { a, b } +#define DMI_MATCH(a, b) { a, b } + +struct dmi_device { + struct list_head list; + int type; + const char *name; + void *device_data; /* Type specific data */ +}; -#if defined(CONFIG_X86) && !defined(CONFIG_X86_64) +#ifdef CONFIG_DMI extern int dmi_check_system(struct dmi_system_id *list); extern char * dmi_get_system_info(int field); - +extern struct dmi_device * dmi_find_device(int type, const char *name, + struct dmi_device *from); +extern void dmi_scan_machine(void); +extern int dmi_get_year(int field); +extern int dmi_cpus; #else static inline int dmi_check_system(struct dmi_system_id *list) { return 0; } static inline char * dmi_get_system_info(int field) { return NULL; } +static inline struct dmi_device * dmi_find_device(int type, const char *name, + struct dmi_device *from) { return NULL; } +static inline int dmi_get_year(int year) { return 0; } #endif diff --git a/include/linux/dnotify.h b/include/linux/dnotify.h index f134a0197..102a902b4 100644 --- a/include/linux/dnotify.h +++ b/include/linux/dnotify.h @@ -18,7 +18,6 @@ struct dnotify_struct { #ifdef __KERNEL__ -#include #ifdef CONFIG_DNOTIFY diff --git a/include/linux/dqblk_xfs.h b/include/linux/dqblk_xfs.h index 2fda1b2aa..527504c11 100644 --- a/include/linux/dqblk_xfs.h +++ b/include/linux/dqblk_xfs.h @@ -125,14 +125,14 @@ typedef struct fs_disk_quota { /* * fs_quota_stat is the struct returned in Q_XGETQSTAT for a given file system. - * Provides a centralized way to get meta infomation about the quota subsystem. + * Provides a centralized way to get meta information about the quota subsystem. * eg. space taken up for user and group quotas, number of dquots currently * incore. */ #define FS_QSTAT_VERSION 1 /* fs_quota_stat.qs_version */ /* - * Some basic infomation about 'quota files'. + * Some basic information about 'quota files'. */ typedef struct fs_qfilestat { __u64 qfs_ino; /* inode number */ diff --git a/include/linux/dvb/dmx.h b/include/linux/dvb/dmx.h index 2787b8a22..c6a2353c4 100644 --- a/include/linux/dvb/dmx.h +++ b/include/linux/dvb/dmx.h @@ -88,20 +88,6 @@ typedef enum #define DMX_PES_PCR DMX_PES_PCR0 -typedef enum -{ - DMX_SCRAMBLING_EV, - DMX_FRONTEND_EV -} dmx_event_t; - - -typedef enum -{ - DMX_SCRAMBLING_OFF, - DMX_SCRAMBLING_ON -} dmx_scrambling_status_t; - - typedef struct dmx_filter { __u8 filter[DMX_FILTER_SIZE]; @@ -132,17 +118,6 @@ struct dmx_pes_filter_params __u32 flags; }; - -struct dmx_event -{ - dmx_event_t event; - time_t timeStamp; - union - { - dmx_scrambling_status_t scrambling; - } u; -}; - typedef struct dmx_caps { __u32 caps; int num_decoders; @@ -171,7 +146,6 @@ struct dmx_stc { #define DMX_SET_FILTER _IOW('o', 43, struct dmx_sct_filter_params) #define DMX_SET_PES_FILTER _IOW('o', 44, struct dmx_pes_filter_params) #define DMX_SET_BUFFER_SIZE _IO('o', 45) -#define DMX_GET_EVENT _IOR('o', 46, struct dmx_event) #define DMX_GET_PES_PIDS _IOR('o', 47, __u16[5]) #define DMX_GET_CAPS _IOR('o', 48, dmx_caps_t) #define DMX_SET_SOURCE _IOW('o', 49, dmx_source_t) diff --git a/include/linux/efi.h b/include/linux/efi.h index e203613d3..66d621dbc 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h @@ -294,6 +294,7 @@ extern void efi_enter_virtual_mode (void); /* switch EFI to virtual mode, if pos extern u64 efi_get_iobase (void); extern u32 efi_mem_type (unsigned long phys_addr); extern u64 efi_mem_attributes (unsigned long phys_addr); +extern u64 efi_mem_attribute (unsigned long phys_addr, unsigned long size); extern int efi_mem_attribute_range (unsigned long phys_addr, unsigned long size, u64 attr); extern int __init efi_uart_console_only (void); diff --git a/include/linux/efs_fs.h b/include/linux/efs_fs.h index fbfa6b52e..278ef4495 100644 --- a/include/linux/efs_fs.h +++ b/include/linux/efs_fs.h @@ -38,7 +38,7 @@ struct statfs; extern struct inode_operations efs_dir_inode_operations; extern const struct file_operations efs_dir_operations; -extern struct address_space_operations efs_symlink_aops; +extern const struct address_space_operations efs_symlink_aops; extern void efs_read_inode(struct inode *); extern efs_block_t efs_map_block(struct inode *, efs_block_t); diff --git a/include/linux/elf.h b/include/linux/elf.h index d3bfacb24..b70d1d2c8 100644 --- a/include/linux/elf.h +++ b/include/linux/elf.h @@ -3,6 +3,7 @@ #include #include +#include #include #ifndef elf_read_implies_exec @@ -55,64 +56,6 @@ typedef __s64 Elf64_Sxword; #define ET_LOPROC 0xff00 #define ET_HIPROC 0xffff -/* These constants define the various ELF target machines */ -#define EM_NONE 0 -#define EM_M32 1 -#define EM_SPARC 2 -#define EM_386 3 -#define EM_68K 4 -#define EM_88K 5 -#define EM_486 6 /* Perhaps disused */ -#define EM_860 7 - -#define EM_MIPS 8 /* MIPS R3000 (officially, big-endian only) */ - -#define EM_MIPS_RS4_BE 10 /* MIPS R4000 big-endian */ - -#define EM_PARISC 15 /* HPPA */ - -#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */ - -#define EM_PPC 20 /* PowerPC */ -#define EM_PPC64 21 /* PowerPC64 */ - -#define EM_SH 42 /* SuperH */ - -#define EM_SPARCV9 43 /* SPARC v9 64-bit */ - -#define EM_IA_64 50 /* HP/Intel IA-64 */ - -#define EM_X86_64 62 /* AMD x86-64 */ - -#define EM_S390 22 /* IBM S/390 */ - -#define EM_CRIS 76 /* Axis Communications 32-bit embedded processor */ - -#define EM_V850 87 /* NEC v850 */ - -#define EM_M32R 88 /* Renesas M32R */ - -#define EM_H8_300 46 /* Renesas H8/300,300H,H8S */ - -/* - * This is an interim value that we will use until the committee comes - * up with a final number. - */ -#define EM_ALPHA 0x9026 - -/* Bogus old v850 magic number, used by old tools. */ -#define EM_CYGNUS_V850 0x9080 - -/* Bogus old m32r magic number, used by old tools. */ -#define EM_CYGNUS_M32R 0x9041 - -/* - * This is the old interim value for S/390 architecture - */ -#define EM_S390_OLD 0xA390 - -#define EM_FRV 0x5441 /* Fujitsu FR-V */ - /* This is the info that is needed to parse the dynamic section of the file */ #define DT_NULL 0 #define DT_NEEDED 1 diff --git a/include/linux/elfcore.h b/include/linux/elfcore.h index 0cf0bea01..9631dddae 100644 --- a/include/linux/elfcore.h +++ b/include/linux/elfcore.h @@ -60,6 +60,16 @@ struct elf_prstatus long pr_instr; /* Current instruction */ #endif elf_gregset_t pr_reg; /* GP registers */ +#ifdef CONFIG_BINFMT_ELF_FDPIC + /* When using FDPIC, the loadmap addresses need to be communicated + * to GDB in order for GDB to do the necessary relocations. The + * fields (below) used to communicate this information are placed + * immediately after ``pr_reg'', so that the loadmap addresses may + * be viewed as part of the register set if so desired. + */ + unsigned long pr_exec_fdpic_loadmap; + unsigned long pr_interp_fdpic_loadmap; +#endif int pr_fpvalid; /* True if math co-processor being used. */ }; diff --git a/include/linux/err.h b/include/linux/err.h index ff71d2af5..cd3b367f7 100644 --- a/include/linux/err.h +++ b/include/linux/err.h @@ -13,7 +13,9 @@ * This should be a per-architecture thing, to allow different * error and pointer decisions. */ -#define IS_ERR_VALUE(x) unlikely((x) > (unsigned long)-1000L) +#define MAX_ERRNO 4095 + +#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO) static inline void *ERR_PTR(long error) { diff --git a/include/linux/errqueue.h b/include/linux/errqueue.h index 174582fed..408118a07 100644 --- a/include/linux/errqueue.h +++ b/include/linux/errqueue.h @@ -21,7 +21,6 @@ struct sock_extended_err #ifdef __KERNEL__ -#include #include #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) #include diff --git a/include/linux/etherdevice.h b/include/linux/etherdevice.h index e4b09d2a2..745c98835 100644 --- a/include/linux/etherdevice.h +++ b/include/linux/etherdevice.h @@ -92,8 +92,9 @@ static inline int is_broadcast_ether_addr(const u8 *addr) */ static inline int is_valid_ether_addr(const u8 *addr) { - return !is_multicast_ether_addr(addr) && !is_zero_ether_addr(addr) && - !is_broadcast_ether_addr(addr); + /* FF:FF:FF:FF:FF:FF is a multicast address so we don't need to + * explicitly check for it here. */ + return !is_multicast_ether_addr(addr) && !is_zero_ether_addr(addr); } /** diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h index 9269df738..c6310aef5 100644 --- a/include/linux/ethtool.h +++ b/include/linux/ethtool.h @@ -15,24 +15,24 @@ /* This should work for both 32 and 64 bit userland. */ struct ethtool_cmd { - u32 cmd; - u32 supported; /* Features this interface supports */ - u32 advertising; /* Features this interface advertises */ - u16 speed; /* The forced speed, 10Mb, 100Mb, gigabit */ - u8 duplex; /* Duplex, half or full */ - u8 port; /* Which connector port */ - u8 phy_address; - u8 transceiver; /* Which transceiver to use */ - u8 autoneg; /* Enable or disable autonegotiation */ - u32 maxtxpkt; /* Tx pkts before generating tx int */ - u32 maxrxpkt; /* Rx pkts before generating rx int */ - u32 reserved[4]; + __u32 cmd; + __u32 supported; /* Features this interface supports */ + __u32 advertising; /* Features this interface advertises */ + __u16 speed; /* The forced speed, 10Mb, 100Mb, gigabit */ + __u8 duplex; /* Duplex, half or full */ + __u8 port; /* Which connector port */ + __u8 phy_address; + __u8 transceiver; /* Which transceiver to use */ + __u8 autoneg; /* Enable or disable autonegotiation */ + __u32 maxtxpkt; /* Tx pkts before generating tx int */ + __u32 maxrxpkt; /* Rx pkts before generating rx int */ + __u32 reserved[4]; }; #define ETHTOOL_BUSINFO_LEN 32 /* these strings are set to whatever the driver author decides... */ struct ethtool_drvinfo { - u32 cmd; + __u32 cmd; char driver[32]; /* driver short name, "tulip", "eepro100" */ char version[32]; /* driver version string */ char fw_version[32]; /* firmware version string, if applicable */ @@ -40,53 +40,53 @@ struct ethtool_drvinfo { /* For PCI devices, use pci_name(pci_dev). */ char reserved1[32]; char reserved2[16]; - u32 n_stats; /* number of u64's from ETHTOOL_GSTATS */ - u32 testinfo_len; - u32 eedump_len; /* Size of data from ETHTOOL_GEEPROM (bytes) */ - u32 regdump_len; /* Size of data from ETHTOOL_GREGS (bytes) */ + __u32 n_stats; /* number of u64's from ETHTOOL_GSTATS */ + __u32 testinfo_len; + __u32 eedump_len; /* Size of data from ETHTOOL_GEEPROM (bytes) */ + __u32 regdump_len; /* Size of data from ETHTOOL_GREGS (bytes) */ }; #define SOPASS_MAX 6 /* wake-on-lan settings */ struct ethtool_wolinfo { - u32 cmd; - u32 supported; - u32 wolopts; - u8 sopass[SOPASS_MAX]; /* SecureOn(tm) password */ + __u32 cmd; + __u32 supported; + __u32 wolopts; + __u8 sopass[SOPASS_MAX]; /* SecureOn(tm) password */ }; /* for passing single values */ struct ethtool_value { - u32 cmd; - u32 data; + __u32 cmd; + __u32 data; }; /* for passing big chunks of data */ struct ethtool_regs { - u32 cmd; - u32 version; /* driver-specific, indicates different chips/revs */ - u32 len; /* bytes */ - u8 data[0]; + __u32 cmd; + __u32 version; /* driver-specific, indicates different chips/revs */ + __u32 len; /* bytes */ + __u8 data[0]; }; /* for passing EEPROM chunks */ struct ethtool_eeprom { - u32 cmd; - u32 magic; - u32 offset; /* in bytes */ - u32 len; /* in bytes */ - u8 data[0]; + __u32 cmd; + __u32 magic; + __u32 offset; /* in bytes */ + __u32 len; /* in bytes */ + __u8 data[0]; }; /* for configuring coalescing parameters of chip */ struct ethtool_coalesce { - u32 cmd; /* ETHTOOL_{G,S}COALESCE */ + __u32 cmd; /* ETHTOOL_{G,S}COALESCE */ /* How many usecs to delay an RX interrupt after * a packet arrives. If 0, only rx_max_coalesced_frames * is used. */ - u32 rx_coalesce_usecs; + __u32 rx_coalesce_usecs; /* How many packets to delay an RX interrupt after * a packet arrives. If 0, only rx_coalesce_usecs is @@ -94,21 +94,21 @@ struct ethtool_coalesce { * to zero as this would cause RX interrupts to never be * generated. */ - u32 rx_max_coalesced_frames; + __u32 rx_max_coalesced_frames; /* Same as above two parameters, except that these values * apply while an IRQ is being serviced by the host. Not * all cards support this feature and the values are ignored * in that case. */ - u32 rx_coalesce_usecs_irq; - u32 rx_max_coalesced_frames_irq; + __u32 rx_coalesce_usecs_irq; + __u32 rx_max_coalesced_frames_irq; /* How many usecs to delay a TX interrupt after * a packet is sent. If 0, only tx_max_coalesced_frames * is used. */ - u32 tx_coalesce_usecs; + __u32 tx_coalesce_usecs; /* How many packets to delay a TX interrupt after * a packet is sent. If 0, only tx_coalesce_usecs is @@ -116,22 +116,22 @@ struct ethtool_coalesce { * to zero as this would cause TX interrupts to never be * generated. */ - u32 tx_max_coalesced_frames; + __u32 tx_max_coalesced_frames; /* Same as above two parameters, except that these values * apply while an IRQ is being serviced by the host. Not * all cards support this feature and the values are ignored * in that case. */ - u32 tx_coalesce_usecs_irq; - u32 tx_max_coalesced_frames_irq; + __u32 tx_coalesce_usecs_irq; + __u32 tx_max_coalesced_frames_irq; /* How many usecs to delay in-memory statistics * block updates. Some drivers do not have an in-memory * statistic block, and in such cases this value is ignored. * This value must not be zero. */ - u32 stats_block_coalesce_usecs; + __u32 stats_block_coalesce_usecs; /* Adaptive RX/TX coalescing is an algorithm implemented by * some drivers to improve latency under low packet rates and @@ -140,18 +140,18 @@ struct ethtool_coalesce { * not implemented by the driver causes these values to be * silently ignored. */ - u32 use_adaptive_rx_coalesce; - u32 use_adaptive_tx_coalesce; + __u32 use_adaptive_rx_coalesce; + __u32 use_adaptive_tx_coalesce; /* When the packet rate (measured in packets per second) * is below pkt_rate_low, the {rx,tx}_*_low parameters are * used. */ - u32 pkt_rate_low; - u32 rx_coalesce_usecs_low; - u32 rx_max_coalesced_frames_low; - u32 tx_coalesce_usecs_low; - u32 tx_max_coalesced_frames_low; + __u32 pkt_rate_low; + __u32 rx_coalesce_usecs_low; + __u32 rx_max_coalesced_frames_low; + __u32 tx_coalesce_usecs_low; + __u32 tx_max_coalesced_frames_low; /* When the packet rate is below pkt_rate_high but above * pkt_rate_low (both measured in packets per second) the @@ -162,43 +162,43 @@ struct ethtool_coalesce { * is above pkt_rate_high, the {rx,tx}_*_high parameters are * used. */ - u32 pkt_rate_high; - u32 rx_coalesce_usecs_high; - u32 rx_max_coalesced_frames_high; - u32 tx_coalesce_usecs_high; - u32 tx_max_coalesced_frames_high; + __u32 pkt_rate_high; + __u32 rx_coalesce_usecs_high; + __u32 rx_max_coalesced_frames_high; + __u32 tx_coalesce_usecs_high; + __u32 tx_max_coalesced_frames_high; /* How often to do adaptive coalescing packet rate sampling, * measured in seconds. Must not be zero. */ - u32 rate_sample_interval; + __u32 rate_sample_interval; }; /* for configuring RX/TX ring parameters */ struct ethtool_ringparam { - u32 cmd; /* ETHTOOL_{G,S}RINGPARAM */ + __u32 cmd; /* ETHTOOL_{G,S}RINGPARAM */ /* Read only attributes. These indicate the maximum number * of pending RX/TX ring entries the driver will allow the * user to set. */ - u32 rx_max_pending; - u32 rx_mini_max_pending; - u32 rx_jumbo_max_pending; - u32 tx_max_pending; + __u32 rx_max_pending; + __u32 rx_mini_max_pending; + __u32 rx_jumbo_max_pending; + __u32 tx_max_pending; /* Values changeable by the user. The valid values are * in the range 1 to the "*_max_pending" counterpart above. */ - u32 rx_pending; - u32 rx_mini_pending; - u32 rx_jumbo_pending; - u32 tx_pending; + __u32 rx_pending; + __u32 rx_mini_pending; + __u32 rx_jumbo_pending; + __u32 tx_pending; }; /* for configuring link flow control parameters */ struct ethtool_pauseparam { - u32 cmd; /* ETHTOOL_{G,S}PAUSEPARAM */ + __u32 cmd; /* ETHTOOL_{G,S}PAUSEPARAM */ /* If the link is being auto-negotiated (via ethtool_cmd.autoneg * being true) the user may set 'autonet' here non-zero to have the @@ -210,9 +210,9 @@ struct ethtool_pauseparam { * then {rx,tx}_pause force the driver to use/not-use pause * flow control. */ - u32 autoneg; - u32 rx_pause; - u32 tx_pause; + __u32 autoneg; + __u32 rx_pause; + __u32 tx_pause; }; #define ETH_GSTRING_LEN 32 @@ -223,10 +223,10 @@ enum ethtool_stringset { /* for passing string sets for data tagging */ struct ethtool_gstrings { - u32 cmd; /* ETHTOOL_GSTRINGS */ - u32 string_set; /* string set id e.c. ETH_SS_TEST, etc*/ - u32 len; /* number of strings in the string set */ - u8 data[0]; + __u32 cmd; /* ETHTOOL_GSTRINGS */ + __u32 string_set; /* string set id e.c. ETH_SS_TEST, etc*/ + __u32 len; /* number of strings in the string set */ + __u8 data[0]; }; enum ethtool_test_flags { @@ -236,26 +236,28 @@ enum ethtool_test_flags { /* for requesting NIC test and getting results*/ struct ethtool_test { - u32 cmd; /* ETHTOOL_TEST */ - u32 flags; /* ETH_TEST_FL_xxx */ - u32 reserved; - u32 len; /* result length, in number of u64 elements */ - u64 data[0]; + __u32 cmd; /* ETHTOOL_TEST */ + __u32 flags; /* ETH_TEST_FL_xxx */ + __u32 reserved; + __u32 len; /* result length, in number of u64 elements */ + __u64 data[0]; }; /* for dumping NIC-specific statistics */ struct ethtool_stats { - u32 cmd; /* ETHTOOL_GSTATS */ - u32 n_stats; /* number of u64's being returned */ - u64 data[0]; + __u32 cmd; /* ETHTOOL_GSTATS */ + __u32 n_stats; /* number of u64's being returned */ + __u64 data[0]; }; struct ethtool_perm_addr { - u32 cmd; /* ETHTOOL_GPERMADDR */ - u32 size; - u8 data[0]; + __u32 cmd; /* ETHTOOL_GPERMADDR */ + __u32 size; + __u8 data[0]; }; +#ifdef __KERNEL__ + struct net_device; /* Some generic methods drivers may use in their ethtool_ops */ @@ -371,6 +373,7 @@ struct ethtool_ops { u32 (*get_ufo)(struct net_device *); int (*set_ufo)(struct net_device *, u32); }; +#endif /* __KERNEL__ */ /* CMDs currently supported */ #define ETHTOOL_GSET 0x00000001 /* Get settings. */ diff --git a/include/linux/eventpoll.h b/include/linux/eventpoll.h index 1e4bdfcf8..84cfa8bbd 100644 --- a/include/linux/eventpoll.h +++ b/include/linux/eventpoll.h @@ -1,6 +1,6 @@ /* * include/linux/eventpoll.h ( Efficent event polling implementation ) - * Copyright (C) 2001,...,2003 Davide Libenzi + * Copyright (C) 2001,...,2006 Davide Libenzi * * 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/linux/ext2_fs.h b/include/linux/ext2_fs.h index 065e0317d..ad46c3e6d 100644 --- a/include/linux/ext2_fs.h +++ b/include/linux/ext2_fs.h @@ -17,7 +17,6 @@ #define _LINUX_EXT2_FS_H #include -#include /* * The second extended filesystem constants/structures @@ -70,6 +69,7 @@ #define EXT2_SUPER_MAGIC 0xEF53 #ifdef __KERNEL__ +#include static inline struct ext2_sb_info *EXT2_SB(struct super_block *sb) { return sb->s_fs_info; diff --git a/include/linux/ext3_fs.h b/include/linux/ext3_fs.h index 33bc72c36..4c39437b0 100644 --- a/include/linux/ext3_fs.h +++ b/include/linux/ext3_fs.h @@ -17,11 +17,6 @@ #define _LINUX_EXT3_FS_H #include -#include -#include - - -struct statfs; /* * The second extended filesystem constants/structures @@ -500,6 +495,8 @@ struct ext3_super_block { }; #ifdef __KERNEL__ +#include +#include static inline struct ext3_sb_info * EXT3_SB(struct super_block *sb) { return sb->s_fs_info; @@ -686,6 +683,8 @@ struct ext3_dir_entry_2 { #define DX_HASH_HALF_MD4 1 #define DX_HASH_TEA 2 +#ifdef __KERNEL__ + /* hash info structure used by the directory hash */ struct dx_hash_info { @@ -697,7 +696,6 @@ struct dx_hash_info #define EXT3_HTREE_EOF 0x7fffffff -#ifdef __KERNEL__ /* * Control parameters used by ext3_htree_next_block */ @@ -734,6 +732,14 @@ struct dir_private_info { __u32 next_hash; }; +/* calculate the first block number of the group */ +static inline ext3_fsblk_t +ext3_group_first_block_no(struct super_block *sb, unsigned long group_no) +{ + return group_no * (ext3_fsblk_t)EXT3_BLOCKS_PER_GROUP(sb) + + le32_to_cpu(EXT3_SB(sb)->s_es->s_first_data_block); +} + /* * Special error return code only used by dx_probe() and its callers. */ @@ -754,14 +760,16 @@ struct dir_private_info { /* balloc.c */ extern int ext3_bg_has_super(struct super_block *sb, int group); extern unsigned long ext3_bg_num_gdb(struct super_block *sb, int group); -extern int ext3_new_block (handle_t *, struct inode *, unsigned long, int *); -extern int ext3_new_blocks (handle_t *, struct inode *, unsigned long, - unsigned long *, int *); -extern void ext3_free_blocks (handle_t *, struct inode *, unsigned long, - unsigned long); -extern void ext3_free_blocks_sb (handle_t *, struct super_block *, - unsigned long, unsigned long, int *); -extern unsigned long ext3_count_free_blocks (struct super_block *); +extern ext3_fsblk_t ext3_new_block (handle_t *handle, struct inode *inode, + ext3_fsblk_t goal, int *errp); +extern ext3_fsblk_t ext3_new_blocks (handle_t *handle, struct inode *inode, + ext3_fsblk_t goal, unsigned long *count, int *errp); +extern void ext3_free_blocks (handle_t *handle, struct inode *inode, + ext3_fsblk_t block, unsigned long count); +extern void ext3_free_blocks_sb (handle_t *handle, struct super_block *sb, + ext3_fsblk_t block, unsigned long count, + unsigned long *pdquot_freed_blocks); +extern ext3_fsblk_t ext3_count_free_blocks (struct super_block *); extern void ext3_check_blocks_bitmap (struct super_block *); extern struct ext3_group_desc * ext3_get_group_desc(struct super_block * sb, unsigned int block_group, @@ -797,7 +805,8 @@ extern unsigned long ext3_count_free (struct buffer_head *, unsigned); /* inode.c */ -int ext3_forget(handle_t *, int, struct inode *, struct buffer_head *, int); +int ext3_forget(handle_t *handle, int is_metadata, struct inode *inode, + struct buffer_head *bh, ext3_fsblk_t blocknr); struct buffer_head * ext3_getblk (handle_t *, struct inode *, long, int, int *); struct buffer_head * ext3_bread (handle_t *, struct inode *, int, int, int *); int ext3_get_blocks_handle(handle_t *handle, struct inode *inode, @@ -833,7 +842,7 @@ extern int ext3_group_add(struct super_block *sb, struct ext3_new_group_data *input); extern int ext3_group_extend(struct super_block *sb, struct ext3_super_block *es, - unsigned long n_blocks_count); + ext3_fsblk_t n_blocks_count); /* super.c */ extern void ext3_error (struct super_block *, const char *, const char *, ...) diff --git a/include/linux/ext3_fs_i.h b/include/linux/ext3_fs_i.h index 7abf90147..2f18b9511 100644 --- a/include/linux/ext3_fs_i.h +++ b/include/linux/ext3_fs_i.h @@ -21,9 +21,17 @@ #include #include +/* data type for block offset of block group */ +typedef int ext3_grpblk_t; + +/* data type for filesystem-wide blocks number */ +typedef unsigned long ext3_fsblk_t; + +#define E3FSBLK "%lu" + struct ext3_reserve_window { - __u32 _rsv_start; /* First byte reserved */ - __u32 _rsv_end; /* Last byte reserved or 0 */ + ext3_fsblk_t _rsv_start; /* First byte reserved */ + ext3_fsblk_t _rsv_end; /* Last byte reserved or 0 */ }; struct ext3_reserve_window_node { @@ -50,7 +58,7 @@ struct ext3_block_alloc_info { * allocated to this file. This give us the goal (target) for the next * allocation when we detect linearly ascending requests. */ - __u32 last_alloc_physical_block; + ext3_fsblk_t last_alloc_physical_block; }; #define rsv_start rsv_window._rsv_start @@ -67,7 +75,7 @@ struct ext3_inode_info { __u8 i_frag_no; __u8 i_frag_size; #endif - __u32 i_file_acl; + ext3_fsblk_t i_file_acl; __u32 i_dir_acl; __u32 i_dtime; diff --git a/include/linux/fb.h b/include/linux/fb.h index 315d89740..2f335e966 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h @@ -366,16 +366,21 @@ struct fb_cursor { struct fb_image image; /* Cursor image */ }; +#ifdef CONFIG_FB_BACKLIGHT +/* Settings for the generic backlight code */ +#define FB_BACKLIGHT_LEVELS 128 +#define FB_BACKLIGHT_MAX 0xFF +#endif + #ifdef __KERNEL__ #include #include -#include #include #include -#include #include #include +#include #include struct vm_area_struct; @@ -497,23 +502,19 @@ struct fb_cursor_user { #define FB_EVENT_MODE_DELETE 0x04 /* A driver registered itself */ #define FB_EVENT_FB_REGISTERED 0x05 +/* A driver unregistered itself */ +#define FB_EVENT_FB_UNREGISTERED 0x06 /* CONSOLE-SPECIFIC: get console to framebuffer mapping */ -#define FB_EVENT_GET_CONSOLE_MAP 0x06 +#define FB_EVENT_GET_CONSOLE_MAP 0x07 /* CONSOLE-SPECIFIC: set console to framebuffer mapping */ -#define FB_EVENT_SET_CONSOLE_MAP 0x07 +#define FB_EVENT_SET_CONSOLE_MAP 0x08 /* A display blank is requested */ -#define FB_EVENT_BLANK 0x08 +#define FB_EVENT_BLANK 0x09 /* Private modelist is to be replaced */ -#define FB_EVENT_NEW_MODELIST 0x09 +#define FB_EVENT_NEW_MODELIST 0x0A /* The resolution of the passed in fb_info about to change and all vc's should be changed */ -#define FB_EVENT_MODE_CHANGE_ALL 0x0A -/* CONSOLE-SPECIFIC: set console rotation */ -#define FB_EVENT_SET_CON_ROTATE 0x0B -/* CONSOLE-SPECIFIC: get console rotation */ -#define FB_EVENT_GET_CON_ROTATE 0x0C -/* CONSOLE-SPECIFIC: rotate all consoles */ -#define FB_EVENT_SET_CON_ROTATE_ALL 0x0D +#define FB_EVENT_MODE_CHANGE_ALL 0x0B struct fb_event { struct fb_info *info; @@ -523,7 +524,7 @@ struct fb_event { extern int fb_register_client(struct notifier_block *nb); extern int fb_unregister_client(struct notifier_block *nb); - +extern int fb_notifier_call_chain(unsigned long val, void *v); /* * Pixmap structure definition * @@ -555,7 +556,7 @@ struct fb_pixmap { * Frame buffer operations * * LOCKING NOTE: those functions must _ALL_ be called with the console - * semaphore held, this is the only suitable locking mecanism we have + * semaphore held, this is the only suitable locking mechanism we have * in 2.6. Some may be called at interrupt time at this point though. */ @@ -756,6 +757,21 @@ struct fb_info { struct fb_cmap cmap; /* Current cmap */ struct list_head modelist; /* mode list */ struct fb_videomode *mode; /* current mode */ + +#ifdef CONFIG_FB_BACKLIGHT + /* Lock ordering: + * bl_mutex (protects bl_dev and bl_curve) + * bl_dev->sem (backlight class) + */ + struct mutex bl_mutex; + + /* assigned backlight device */ + struct backlight_device *bl_dev; + + /* Backlight level curve */ + u8 bl_curve[FB_BACKLIGHT_LEVELS]; +#endif + struct fb_ops *fbops; struct device *device; struct class_device *class_device; /* sysfs per device attrs */ @@ -870,7 +886,6 @@ extern int fb_get_color_depth(struct fb_var_screeninfo *var, struct fb_fix_screeninfo *fix); extern int fb_get_options(char *name, char **option); extern int fb_new_modelist(struct fb_info *info); -extern int fb_con_duit(struct fb_info *info, int event, void *data); extern struct fb_info *registered_fb[FB_MAX]; extern int num_registered_fb; @@ -895,6 +910,7 @@ extern struct fb_info *framebuffer_alloc(size_t size, struct device *dev); extern void framebuffer_release(struct fb_info *info); extern int fb_init_class_device(struct fb_info *fb_info); extern void fb_cleanup_class_device(struct fb_info *head); +extern void fb_bl_default_curve(struct fb_info *fb_info, u8 off, u8 min, u8 max); /* drivers/video/fbmon.c */ #define FB_MAXTIMINGS 0 diff --git a/include/linux/fcntl.h b/include/linux/fcntl.h index c52a63755..996f5611c 100644 --- a/include/linux/fcntl.h +++ b/include/linux/fcntl.h @@ -29,6 +29,7 @@ #define AT_SYMLINK_NOFOLLOW 0x100 /* Do not follow symbolic links. */ #define AT_REMOVEDIR 0x200 /* Remove directory instead of unlinking file. */ +#define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */ #ifdef __KERNEL__ diff --git a/include/linux/fs.h b/include/linux/fs.h index dfe92fd08..ee7f02a54 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -6,7 +6,6 @@ * structures etc. */ -#include #include #include @@ -28,6 +27,10 @@ #define BLOCK_SIZE_BITS 10 #define BLOCK_SIZE (1<i_mutex nesting subclasses for the lock validator: + * + * 0: the object of the current VFS operation + * 1: parent + * 2: child/target + * 3: quota file + * + * The locking order between these classes is + * parent -> child -> normal -> xattr -> quota + */ +enum inode_i_mutex_lock_class +{ + I_MUTEX_NORMAL, + I_MUTEX_PARENT, + I_MUTEX_CHILD, + I_MUTEX_XATTR, + I_MUTEX_QUOTA +}; + /* * NOTE: in a 32bit arch with a preemptable kernel and * an UP compile the i_size_read/write must be atomic @@ -697,7 +719,9 @@ extern spinlock_t files_lock; #define FL_POSIX 1 #define FL_FLOCK 2 #define FL_ACCESS 8 /* not trying to lock, just looking */ +#define FL_EXISTS 16 /* when unlocking, test for existence */ #define FL_LEASE 32 /* lease held on this file */ +#define FL_CLOSE 64 /* unlock on close */ #define FL_SLEEP 128 /* A blocking lock */ /* @@ -791,7 +815,6 @@ extern int posix_lock_file_conf(struct file *, struct file_lock *, struct file_l extern int posix_lock_file(struct file *, struct file_lock *); extern int posix_lock_file_wait(struct file *, struct file_lock *); extern int posix_unblock_lock(struct file *, struct file_lock *); -extern int posix_locks_deadlock(struct file_lock *, struct file_lock *); extern int flock_lock_file_wait(struct file *filp, struct file_lock *fl); extern int __break_lease(struct inode *inode, unsigned int flags); extern void lease_get_mtime(struct inode *, struct timespec *time); @@ -799,7 +822,6 @@ extern int setlease(struct file *, long, struct file_lock **); extern int lease_modify(struct file_lock **, int); extern int lock_may_read(struct inode *, loff_t start, unsigned long count); extern int lock_may_write(struct inode *, loff_t start, unsigned long count); -extern void steal_locks(fl_owner_t from); struct fasync_struct { int magic; @@ -981,7 +1003,7 @@ int generic_osync_inode(struct inode *, struct address_space *, int); * This allows the kernel to read directories into kernel space or * to have different dirent layouts depending on the binary type. */ -typedef int (*filldir_t)(void *, const char *, int, loff_t, ino_t, unsigned); +typedef int (*filldir_t)(void *, const char *, int, loff_t, u64, unsigned); struct block_device_operations { int (*open) (struct inode *, struct file *); @@ -1042,7 +1064,7 @@ struct file_operations { long (*compat_ioctl) (struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); int (*open) (struct inode *, struct file *); - int (*flush) (struct file *); + int (*flush) (struct file *, fl_owner_t id); int (*release) (struct inode *, struct file *); int (*fsync) (struct file *, struct dentry *, int datasync); int (*aio_fsync) (struct kiocb *, int datasync); @@ -1115,10 +1137,10 @@ struct super_operations { int (*sync_fs)(struct super_block *sb, int wait); void (*write_super_lockfs) (struct super_block *); void (*unlockfs) (struct super_block *); - int (*statfs) (struct super_block *, struct kstatfs *); + int (*statfs) (struct dentry *, struct kstatfs *); int (*remount_fs) (struct super_block *, int *, char *); void (*clear_inode) (struct inode *); - void (*umount_begin) (struct super_block *); + void (*umount_begin) (struct vfsmount *, int); int (*show_options)(struct seq_file *, struct vfsmount *); int (*show_stats)(struct seq_file *, struct vfsmount *); @@ -1288,23 +1310,28 @@ find_exported_dentry(struct super_block *sb, void *obj, void *parent, struct file_system_type { const char *name; int fs_flags; - struct super_block *(*get_sb) (struct file_system_type *, int, - const char *, void *); + int (*get_sb) (struct file_system_type *, int, + const char *, void *, struct vfsmount *); void (*kill_sb) (struct super_block *); struct module *owner; struct file_system_type * next; struct list_head fs_supers; + struct lock_class_key s_lock_key; + struct lock_class_key s_umount_key; }; -struct super_block *get_sb_bdev(struct file_system_type *fs_type, +extern int get_sb_bdev(struct file_system_type *fs_type, int flags, const char *dev_name, void *data, - int (*fill_super)(struct super_block *, void *, int)); -struct super_block *get_sb_single(struct file_system_type *fs_type, + int (*fill_super)(struct super_block *, void *, int), + struct vfsmount *mnt); +extern int get_sb_single(struct file_system_type *fs_type, int flags, void *data, - int (*fill_super)(struct super_block *, void *, int)); -struct super_block *get_sb_nodev(struct file_system_type *fs_type, + int (*fill_super)(struct super_block *, void *, int), + struct vfsmount *mnt); +extern int get_sb_nodev(struct file_system_type *fs_type, int flags, void *data, - int (*fill_super)(struct super_block *, void *, int)); + int (*fill_super)(struct super_block *, void *, int), + struct vfsmount *mnt); void generic_shutdown_super(struct super_block *sb); void kill_block_super(struct super_block *sb); void kill_anon_super(struct super_block *sb); @@ -1315,8 +1342,10 @@ struct super_block *sget(struct file_system_type *type, int (*test)(struct super_block *,void *), int (*set)(struct super_block *,void *), void *data); -struct super_block *get_sb_pseudo(struct file_system_type *, char *, - struct super_operations *ops, unsigned long); +extern int get_sb_pseudo(struct file_system_type *, char *, + struct super_operations *ops, unsigned long, + struct vfsmount *mnt); +extern int simple_set_mnt(struct vfsmount *mnt, struct super_block *sb); int __put_super(struct super_block *sb); int __put_super_and_need_restart(struct super_block *sb); void unnamed_dev_init(void); @@ -1339,7 +1368,7 @@ extern struct vfsmount *copy_tree(struct vfsmount *, struct dentry *, int); extern void mnt_set_mountpoint(struct vfsmount *, struct dentry *, struct vfsmount *); -extern int vfs_statfs(struct super_block *, struct kstatfs *); +extern int vfs_statfs(struct dentry *, struct kstatfs *); /* /sys/fs */ extern struct subsystem fs_subsys; @@ -1418,7 +1447,7 @@ extern void bd_forget(struct inode *inode); extern void bdput(struct block_device *); extern struct block_device *open_by_devnum(dev_t, unsigned); extern const struct file_operations def_blk_fops; -extern struct address_space_operations def_blk_aops; +extern const struct address_space_operations def_blk_aops; extern const struct file_operations def_chr_fops; extern const struct file_operations bad_sock_fops; extern const struct file_operations def_fifo_fops; @@ -1621,6 +1650,8 @@ extern ssize_t generic_file_direct_write(struct kiocb *, const struct iovec *, unsigned long *, loff_t, loff_t *, size_t, size_t); extern ssize_t generic_file_buffered_write(struct kiocb *, const struct iovec *, unsigned long, loff_t, loff_t *, size_t, ssize_t); +extern int generic_file_buffered_write_one_kernel_page(struct address_space *, + pgoff_t, struct page *); extern ssize_t do_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos); extern ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos); ssize_t generic_file_write_nolock(struct file *file, const struct iovec *iov, @@ -1762,7 +1793,7 @@ extern loff_t dcache_dir_lseek(struct file *, loff_t, int); extern int dcache_readdir(struct file *, void *, filldir_t); extern int dcache_readdir_filter(struct file *, void *, filldir_t, int (*)(struct dentry *)); extern int simple_getattr(struct vfsmount *, struct dentry *, struct kstat *); -extern int simple_statfs(struct super_block *, struct kstatfs *); +extern int simple_statfs(struct dentry *, struct kstatfs *); extern int simple_link(struct dentry *, struct inode *, struct dentry *); extern int simple_unlink(struct inode *, struct dentry *); extern int simple_rmdir(struct inode *, struct dentry *); @@ -1782,13 +1813,14 @@ extern struct inode_operations simple_dir_inode_operations; struct tree_descr { char *name; const struct file_operations *ops; int mode; }; struct dentry *d_alloc_name(struct dentry *, const char *); extern int simple_fill_super(struct super_block *, int, struct tree_descr *); -extern int simple_pin_fs(char *name, struct vfsmount **mount, int *count); +extern int simple_pin_fs(struct file_system_type *, struct vfsmount **mount, int *count); extern void simple_release_fs(struct vfsmount **mount, int *count); extern ssize_t simple_read_from_buffer(void __user *, size_t, loff_t *, const void *, size_t); #ifdef CONFIG_MIGRATION -extern int buffer_migrate_page(struct page *, struct page *); +extern int buffer_migrate_page(struct address_space *, + struct page *, struct page *); #else #define buffer_migrate_page NULL #endif diff --git a/include/linux/fs_enet_pd.h b/include/linux/fs_enet_pd.h index 783c476b8..74ed35a00 100644 --- a/include/linux/fs_enet_pd.h +++ b/include/linux/fs_enet_pd.h @@ -69,34 +69,21 @@ enum fs_ioport { fsiop_porte, }; -struct fs_mii_bus_info { - int method; /* mii method */ - int id; /* the id of the mii_bus */ - int disable_aneg; /* if the controller needs to negothiate speed & duplex */ - int lpa; /* the default board-specific vallues will be applied otherwise */ - - union { - struct { - int duplex; - int speed; - } fixed; - - struct { - /* nothing */ - } fec; - - struct { - /* nothing */ - } scc; - - struct { - int mdio_port; /* port & bit for MDIO */ - int mdio_bit; - int mdc_port; /* port & bit for MDC */ - int mdc_bit; - int delay; /* delay in us */ - } bitbang; - } i; +struct fs_mii_bit { + u32 offset; + u8 bit; + u8 polarity; +}; +struct fs_mii_bb_platform_info { + struct fs_mii_bit mdio_dir; + struct fs_mii_bit mdio_dat; + struct fs_mii_bit mdc_dat; + int mdio_port; /* port & bit for MDIO */ + int mdio_bit; + int mdc_port; /* port & bit for MDC */ + int mdc_bit; + int delay; /* delay in us */ + int irq[32]; /* irqs per phy's */ }; struct fs_platform_info { @@ -119,6 +106,7 @@ struct fs_platform_info { u32 device_flags; int phy_addr; /* the phy address (-1 no phy) */ + const char* bus_id; int phy_irq; /* the phy irq (if it exists) */ const struct fs_mii_bus_info *bus_info; @@ -130,6 +118,10 @@ struct fs_platform_info { int napi_weight; /* NAPI weight */ int use_rmii; /* use RMII mode */ + int has_phy; /* if the network is phy container as well...*/ +}; +struct fs_mii_fec_platform_info { + u32 irq[32]; + u32 mii_speed; }; - #endif diff --git a/include/linux/fsnotify.h b/include/linux/fsnotify.h index 11438eff4..d4f219ffa 100644 --- a/include/linux/fsnotify.h +++ b/include/linux/fsnotify.h @@ -54,19 +54,20 @@ static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir, if (isdir) isdir = IN_ISDIR; - inotify_inode_queue_event(old_dir, IN_MOVED_FROM|isdir,cookie,old_name); - inotify_inode_queue_event(new_dir, IN_MOVED_TO|isdir, cookie, new_name); + inotify_inode_queue_event(old_dir, IN_MOVED_FROM|isdir,cookie,old_name, + source); + inotify_inode_queue_event(new_dir, IN_MOVED_TO|isdir, cookie, new_name, + source); if (target) { - inotify_inode_queue_event(target, IN_DELETE_SELF, 0, NULL); + inotify_inode_queue_event(target, IN_DELETE_SELF, 0, NULL, NULL); inotify_inode_is_dead(target); } if (source) { - inotify_inode_queue_event(source, IN_MOVE_SELF, 0, NULL); + inotify_inode_queue_event(source, IN_MOVE_SELF, 0, NULL, NULL); } - audit_inode_child(old_name, source, old_dir->i_ino); - audit_inode_child(new_name, target, new_dir->i_ino); + audit_inode_child(new_name, source, new_dir); } /* @@ -85,7 +86,7 @@ static inline void fsnotify_nameremove(struct dentry *dentry, int isdir) */ static inline void fsnotify_inoderemove(struct inode *inode) { - inotify_inode_queue_event(inode, IN_DELETE_SELF, 0, NULL); + inotify_inode_queue_event(inode, IN_DELETE_SELF, 0, NULL, NULL); inotify_inode_is_dead(inode); } @@ -95,8 +96,9 @@ static inline void fsnotify_inoderemove(struct inode *inode) static inline void fsnotify_create(struct inode *inode, struct dentry *dentry) { inode_dir_notify(inode, DN_CREATE); - inotify_inode_queue_event(inode, IN_CREATE, 0, dentry->d_name.name); - audit_inode_child(dentry->d_name.name, dentry->d_inode, inode->i_ino); + inotify_inode_queue_event(inode, IN_CREATE, 0, dentry->d_name.name, + dentry->d_inode); + audit_inode_child(dentry->d_name.name, dentry->d_inode, inode); } /* @@ -106,8 +108,8 @@ static inline void fsnotify_mkdir(struct inode *inode, struct dentry *dentry) { inode_dir_notify(inode, DN_CREATE); inotify_inode_queue_event(inode, IN_CREATE | IN_ISDIR, 0, - dentry->d_name.name); - audit_inode_child(dentry->d_name.name, dentry->d_inode, inode->i_ino); + dentry->d_name.name, dentry->d_inode); + audit_inode_child(dentry->d_name.name, dentry->d_inode, inode); } /* @@ -123,7 +125,7 @@ static inline void fsnotify_access(struct dentry *dentry) dnotify_parent(dentry, DN_ACCESS); inotify_dentry_parent_queue_event(dentry, mask, 0, dentry->d_name.name); - inotify_inode_queue_event(inode, mask, 0, NULL); + inotify_inode_queue_event(inode, mask, 0, NULL, NULL); } /* @@ -139,7 +141,7 @@ static inline void fsnotify_modify(struct dentry *dentry) dnotify_parent(dentry, DN_MODIFY); inotify_dentry_parent_queue_event(dentry, mask, 0, dentry->d_name.name); - inotify_inode_queue_event(inode, mask, 0, NULL); + inotify_inode_queue_event(inode, mask, 0, NULL, NULL); } /* @@ -154,7 +156,7 @@ static inline void fsnotify_open(struct dentry *dentry) mask |= IN_ISDIR; inotify_dentry_parent_queue_event(dentry, mask, 0, dentry->d_name.name); - inotify_inode_queue_event(inode, mask, 0, NULL); + inotify_inode_queue_event(inode, mask, 0, NULL, NULL); } /* @@ -172,7 +174,7 @@ static inline void fsnotify_close(struct file *file) mask |= IN_ISDIR; inotify_dentry_parent_queue_event(dentry, mask, 0, name); - inotify_inode_queue_event(inode, mask, 0, NULL); + inotify_inode_queue_event(inode, mask, 0, NULL, NULL); } /* @@ -187,7 +189,7 @@ static inline void fsnotify_xattr(struct dentry *dentry) mask |= IN_ISDIR; inotify_dentry_parent_queue_event(dentry, mask, 0, dentry->d_name.name); - inotify_inode_queue_event(inode, mask, 0, NULL); + inotify_inode_queue_event(inode, mask, 0, NULL, NULL); } /* @@ -234,7 +236,7 @@ static inline void fsnotify_change(struct dentry *dentry, unsigned int ia_valid) if (in_mask) { if (S_ISDIR(inode->i_mode)) in_mask |= IN_ISDIR; - inotify_inode_queue_event(inode, in_mask, 0, NULL); + inotify_inode_queue_event(inode, in_mask, 0, NULL, NULL); inotify_dentry_parent_queue_event(dentry, in_mask, 0, dentry->d_name.name); } diff --git a/include/linux/ftape.h b/include/linux/ftape.h index 72faeec9f..7e7038cba 100644 --- a/include/linux/ftape.h +++ b/include/linux/ftape.h @@ -35,7 +35,6 @@ #include #endif #include -#include #include #define FT_SECTOR(x) (x+1) /* sector offset into real sector */ diff --git a/include/linux/fuse.h b/include/linux/fuse.h index 5425b6002..9fc48a674 100644 --- a/include/linux/fuse.h +++ b/include/linux/fuse.h @@ -1,6 +1,6 @@ /* FUSE: Filesystem in Userspace - Copyright (C) 2001-2005 Miklos Szeredi + Copyright (C) 2001-2006 Miklos Szeredi This program can be distributed under the terms of the GNU GPL. See the file COPYING. @@ -9,18 +9,19 @@ /* This file defines the kernel interface of FUSE */ #include +#include /** Version number of this interface */ #define FUSE_KERNEL_VERSION 7 /** Minor version number of this interface */ -#define FUSE_KERNEL_MINOR_VERSION 6 +#define FUSE_KERNEL_MINOR_VERSION 7 /** The node ID of the root inode */ #define FUSE_ROOT_ID 1 /** The major number of the fuse character device */ -#define FUSE_MAJOR 10 +#define FUSE_MAJOR MISC_MAJOR /** The minor number of the fuse character device */ #define FUSE_MINOR 229 @@ -58,6 +59,13 @@ struct fuse_kstatfs { __u32 spare[6]; }; +struct fuse_file_lock { + __u64 start; + __u64 end; + __u32 type; + __u32 pid; /* tgid */ +}; + /** * Bitmasks for fuse_setattr_in.valid */ @@ -82,6 +90,7 @@ struct fuse_kstatfs { * INIT request/reply flags */ #define FUSE_ASYNC_READ (1 << 0) +#define FUSE_POSIX_LOCKS (1 << 1) enum fuse_opcode { FUSE_LOOKUP = 1, @@ -112,8 +121,12 @@ enum fuse_opcode { FUSE_READDIR = 28, FUSE_RELEASEDIR = 29, FUSE_FSYNCDIR = 30, + FUSE_GETLK = 31, + FUSE_SETLK = 32, + FUSE_SETLKW = 33, FUSE_ACCESS = 34, - FUSE_CREATE = 35 + FUSE_CREATE = 35, + FUSE_INTERRUPT = 36, }; /* The read buffer is required to be at least 8k, but may be much larger */ @@ -199,6 +212,7 @@ struct fuse_flush_in { __u64 fh; __u32 flush_flags; __u32 padding; + __u64 lock_owner; }; struct fuse_read_in { @@ -247,6 +261,16 @@ struct fuse_getxattr_out { __u32 padding; }; +struct fuse_lk_in { + __u64 fh; + __u64 owner; + struct fuse_file_lock lk; +}; + +struct fuse_lk_out { + struct fuse_file_lock lk; +}; + struct fuse_access_in { __u32 mask; __u32 padding; @@ -268,6 +292,10 @@ struct fuse_init_out { __u32 max_write; }; +struct fuse_interrupt_in { + __u64 unique; +}; + struct fuse_in_header { __u32 len; __u32 opcode; diff --git a/include/linux/futex.h b/include/linux/futex.h index 966a5b3da..d097b5b72 100644 --- a/include/linux/futex.h +++ b/include/linux/futex.h @@ -12,6 +12,9 @@ #define FUTEX_REQUEUE 3 #define FUTEX_CMP_REQUEUE 4 #define FUTEX_WAKE_OP 5 +#define FUTEX_LOCK_PI 6 +#define FUTEX_UNLOCK_PI 7 +#define FUTEX_TRYLOCK_PI 8 /* * Support for robust futexes: the kernel cleans up held futexes at @@ -90,18 +93,22 @@ struct robust_list_head { */ #define ROBUST_LIST_LIMIT 2048 -long do_futex(unsigned long uaddr, int op, int val, - unsigned long timeout, unsigned long uaddr2, int val2, - int val3); +long do_futex(u32 __user *uaddr, int op, u32 val, unsigned long timeout, + u32 __user *uaddr2, u32 val2, u32 val3); -extern int handle_futex_death(u32 __user *uaddr, struct task_struct *curr); +extern int +handle_futex_death(u32 __user *uaddr, struct task_struct *curr, int pi); #ifdef CONFIG_FUTEX extern void exit_robust_list(struct task_struct *curr); +extern void exit_pi_state_list(struct task_struct *curr); #else static inline void exit_robust_list(struct task_struct *curr) { } +static inline void exit_pi_state_list(struct task_struct *curr) +{ +} #endif #define FUTEX_OP_SET 0 /* *(int *)UADDR2 = OPARG; */ diff --git a/include/linux/gameport.h b/include/linux/gameport.h index 71e7b2847..2cdba0c23 100644 --- a/include/linux/gameport.h +++ b/include/linux/gameport.h @@ -9,6 +9,7 @@ * the Free Software Foundation. */ +#ifdef __KERNEL__ #include #include #include @@ -154,6 +155,8 @@ static inline void gameport_register_driver(struct gameport_driver *drv) void gameport_unregister_driver(struct gameport_driver *drv); +#endif /* __KERNEL__ */ + #define GAMEPORT_MODE_DISABLED 0 #define GAMEPORT_MODE_RAW 1 #define GAMEPORT_MODE_COOKED 2 @@ -169,6 +172,8 @@ void gameport_unregister_driver(struct gameport_driver *drv); #define GAMEPORT_ID_VENDOR_GRAVIS 0x0009 #define GAMEPORT_ID_VENDOR_GUILLEMOT 0x000a +#ifdef __KERNEL__ + static inline void gameport_trigger(struct gameport *gameport) { if (gameport->trigger) @@ -219,4 +224,5 @@ static inline void gameport_set_poll_interval(struct gameport *gameport, unsigne void gameport_start_polling(struct gameport *gameport); void gameport_stop_polling(struct gameport *gameport); +#endif /* __KERNEL__ */ #endif diff --git a/include/linux/genalloc.h b/include/linux/genalloc.h index 7fd0576a4..690c42803 100644 --- a/include/linux/genalloc.h +++ b/include/linux/genalloc.h @@ -4,37 +4,32 @@ * Uses for this includes on-device special memory, uncached memory * etc. * - * This code is based on the buddy allocator found in the sym53c8xx_2 - * driver, adapted for general purpose use. - * * This source code is licensed under the GNU General Public License, * Version 2. See the file COPYING for more details. */ -#include -#define ALLOC_MIN_SHIFT 5 /* 32 bytes minimum */ /* - * Link between free memory chunks of a given size. + * General purpose special memory pool descriptor. */ -struct gen_pool_link { - struct gen_pool_link *next; +struct gen_pool { + rwlock_t lock; + struct list_head chunks; /* list of chunks in this pool */ + int min_alloc_order; /* minimum allocation order */ }; /* - * Memory pool descriptor. + * General purpose special memory pool chunk descriptor. */ -struct gen_pool { +struct gen_pool_chunk { spinlock_t lock; - unsigned long (*get_new_chunk)(struct gen_pool *); - struct gen_pool *next; - struct gen_pool_link *h; - unsigned long private; - int max_chunk_shift; + struct list_head next_chunk; /* next chunk in pool */ + unsigned long start_addr; /* starting address of memory chunk */ + unsigned long end_addr; /* ending address of memory chunk */ + unsigned long bits[0]; /* bitmap for allocating memory chunk */ }; -unsigned long gen_pool_alloc(struct gen_pool *poolp, int size); -void gen_pool_free(struct gen_pool *mp, unsigned long ptr, int size); -struct gen_pool *gen_pool_create(int nr_chunks, int max_chunk_shift, - unsigned long (*fp)(struct gen_pool *), - unsigned long data); +extern struct gen_pool *gen_pool_create(int, int); +extern int gen_pool_add(struct gen_pool *, unsigned long, size_t, int); +extern unsigned long gen_pool_alloc(struct gen_pool *, size_t); +extern void gen_pool_free(struct gen_pool *, unsigned long, size_t); diff --git a/include/linux/generic_serial.h b/include/linux/generic_serial.h index 652611a4b..e25384561 100644 --- a/include/linux/generic_serial.h +++ b/include/linux/generic_serial.h @@ -12,6 +12,7 @@ #ifndef GENERIC_SERIAL_H #define GENERIC_SERIAL_H +#ifdef __KERNEL__ #include struct real_driver { @@ -54,6 +55,7 @@ struct gs_port { spinlock_t driver_lock; }; +#endif /* __KERNEL__ */ /* Flags */ /* Warning: serial.h defines some ASYNC_ flags, they say they are "only" @@ -75,7 +77,7 @@ struct gs_port { #define GS_DEBUG_FLOW 0x00000020 #define GS_DEBUG_WRITE 0x00000040 - +#ifdef __KERNEL__ void gs_put_char(struct tty_struct *tty, unsigned char ch); int gs_write(struct tty_struct *tty, const unsigned char *buf, int count); @@ -94,5 +96,5 @@ int gs_init_port(struct gs_port *port); int gs_setserial(struct gs_port *port, struct serial_struct __user *sp); int gs_getserial(struct gs_port *port, struct serial_struct __user *sp); void gs_got_break(struct gs_port *port); - +#endif /* __KERNEL__ */ #endif diff --git a/include/linux/genhd.h b/include/linux/genhd.h index 2ef845b35..e4af57e87 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h @@ -9,13 +9,7 @@ * */ -#include #include -#include -#include -#include -#include -#include enum { /* These three have identical behaviour; use the second one if DOS FDISK gets @@ -61,6 +55,12 @@ struct partition { #endif #ifdef __KERNEL__ +#include +#include +#include +#include +#include + struct partition { unsigned char boot_ind; /* 0x80 - active */ unsigned char head; /* starting head */ @@ -112,8 +112,6 @@ struct gendisk { sector_t capacity; int flags; - char devfs_name[64]; /* devfs crap */ - int number; /* more of the same */ struct device *driverfs_dev; struct kobject kobj; struct kobject *holder_dir; diff --git a/include/linux/gfp.h b/include/linux/gfp.h index 83ece62bc..92383d0d4 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h @@ -4,7 +4,6 @@ #include #include #include -#include struct vm_area_struct; diff --git a/include/linux/hardirq.h b/include/linux/hardirq.h index eab537091..50d8b5744 100644 --- a/include/linux/hardirq.h +++ b/include/linux/hardirq.h @@ -1,9 +1,9 @@ #ifndef LINUX_HARDIRQ_H #define LINUX_HARDIRQ_H -#include #include #include +#include #include #include @@ -87,9 +87,6 @@ extern void synchronize_irq(unsigned int irq); # define synchronize_irq(irq) barrier() #endif -#define nmi_enter() irq_enter() -#define nmi_exit() sub_preempt_count(HARDIRQ_OFFSET) - struct task_struct; #ifndef CONFIG_VIRT_CPU_ACCOUNTING @@ -98,12 +95,35 @@ static inline void account_system_vtime(struct task_struct *tsk) } #endif +/* + * It is safe to do non-atomic ops on ->hardirq_context, + * because NMI handlers may not preempt and the ops are + * always balanced, so the interrupted value of ->hardirq_context + * will always be restored. + */ #define irq_enter() \ do { \ account_system_vtime(current); \ add_preempt_count(HARDIRQ_OFFSET); \ + trace_hardirq_enter(); \ + } while (0) + +/* + * Exit irq context without processing softirqs: + */ +#define __irq_exit() \ + do { \ + trace_hardirq_exit(); \ + account_system_vtime(current); \ + sub_preempt_count(HARDIRQ_OFFSET); \ } while (0) +/* + * Exit irq context and process softirqs if needed: + */ extern void irq_exit(void); +#define nmi_enter() do { lockdep_off(); irq_enter(); } while (0) +#define nmi_exit() do { __irq_exit(); lockdep_on(); } while (0) + #endif /* LINUX_HARDIRQ_H */ diff --git a/include/linux/hdlc.h b/include/linux/hdlc.h index df695e9ae..d5ebbb29a 100644 --- a/include/linux/hdlc.h +++ b/include/linux/hdlc.h @@ -188,7 +188,7 @@ int hdlc_x25_ioctl(struct net_device *dev, struct ifreq *ifr); int hdlc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd); /* Must be used by hardware driver on module startup/exit */ -int register_hdlc_device(struct net_device *dev); +#define register_hdlc_device(dev) register_netdev(dev) void unregister_hdlc_device(struct net_device *dev); struct net_device *alloc_hdlcdev(void *priv); @@ -224,8 +224,6 @@ static __inline__ void debug_frame(const struct sk_buff *skb) int hdlc_open(struct net_device *dev); /* Must be called by hardware driver when HDLC device is being closed */ void hdlc_close(struct net_device *dev); -/* Called by hardware driver when DCD line level changes */ -void hdlc_set_carrier(int on, struct net_device *dev); /* May be used by hardware driver to gain control over HDLC device */ static __inline__ void hdlc_proto_detach(hdlc_device *hdlc) diff --git a/include/linux/highmem.h b/include/linux/highmem.h index 8f2bcfb85..a7a0d2a45 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h @@ -1,7 +1,6 @@ #ifndef _LINUX_HIGHMEM_H #define _LINUX_HIGHMEM_H -#include #include #include diff --git a/include/linux/highuid.h b/include/linux/highuid.h index 53ecac390..434e56246 100644 --- a/include/linux/highuid.h +++ b/include/linux/highuid.h @@ -1,7 +1,6 @@ #ifndef _LINUX_HIGHUID_H #define _LINUX_HIGHUID_H -#include #include /* diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h index 306acf1dc..4fc379de6 100644 --- a/include/linux/hrtimer.h +++ b/include/linux/hrtimer.h @@ -40,7 +40,6 @@ struct hrtimer_base; /** * struct hrtimer - the basic hrtimer structure - * * @node: red black tree node for time ordered insertion * @expires: the absolute expiry time in the hrtimers internal * representation. The time is related to the clock on @@ -59,7 +58,6 @@ struct hrtimer { /** * struct hrtimer_sleeper - simple sleeper structure - * * @timer: embedded timer structure * @task: task to wake up * @@ -72,7 +70,6 @@ struct hrtimer_sleeper { /** * struct hrtimer_base - the timer base for a specific clock - * * @index: clock type index for per_cpu support when moving a timer * to a base on another cpu. * @lock: lock protecting the base and associated timers @@ -83,6 +80,7 @@ struct hrtimer_sleeper { * @get_softirq_time: function to retrieve the current time from the softirq * @curr_timer: the timer which is executing a callback right now * @softirq_time: the time when running the hrtimer queue in the softirq + * @lock_key: the lock_class_key for use with lockdep */ struct hrtimer_base { clockid_t index; @@ -94,6 +92,7 @@ struct hrtimer_base { ktime_t (*get_softirq_time)(void); struct hrtimer *curr_timer; ktime_t softirq_time; + struct lock_class_key lock_key; }; /* @@ -127,7 +126,7 @@ extern ktime_t hrtimer_get_next_event(void); static inline int hrtimer_active(const struct hrtimer *timer) { - return timer->node.rb_parent != HRTIMER_INACTIVE; + return rb_parent(&timer->node) != &timer->node; } /* Forward a hrtimer so it expires after now: */ diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index 4c5e610fe..c25a38d8f 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h @@ -23,6 +23,8 @@ int hugetlb_report_node_meminfo(int, char *); unsigned long hugetlb_total_pages(void); int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long address, int write_access); +int hugetlb_reserve_pages(struct inode *inode, long from, long to); +void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed); extern unsigned long max_huge_pages; extern const unsigned long hugetlb_zero, hugetlb_infinity; @@ -139,8 +141,6 @@ struct hugetlbfs_sb_info { struct hugetlbfs_inode_info { struct shared_policy policy; - /* Protected by the (global) hugetlb_lock */ - unsigned long prereserved_hpages; struct inode vfs_inode; }; @@ -157,10 +157,6 @@ static inline struct hugetlbfs_sb_info *HUGETLBFS_SB(struct super_block *sb) extern const struct file_operations hugetlbfs_file_operations; extern struct vm_operations_struct hugetlb_vm_ops; struct file *hugetlb_zero_setup(size_t); -int hugetlb_extend_reservation(struct hugetlbfs_inode_info *info, - unsigned long atleast_hpages); -void hugetlb_truncate_reservation(struct hugetlbfs_inode_info *info, - unsigned long atmost_hpages); int hugetlb_get_quota(struct address_space *mapping); void hugetlb_put_quota(struct address_space *mapping); diff --git a/include/linux/i2c-algo-ite.h b/include/linux/i2c-algo-ite.h index 26a8b8985..0073fe96c 100644 --- a/include/linux/i2c-algo-ite.h +++ b/include/linux/i2c-algo-ite.h @@ -29,7 +29,7 @@ #ifndef I2C_ALGO_ITE_H #define I2C_ALGO_ITE_H 1 -#include +#include /* Example of a sequential read request: struct i2c_iic_msg s_msg; @@ -49,6 +49,9 @@ struct i2c_iic_msg { char *buf; /* pointer to msg data */ }; +#ifdef __KERNEL__ +struct i2c_adapter; + struct i2c_algo_iic_data { void *data; /* private data for lolevel routines */ void (*setiic) (void *data, int ctl, int val); @@ -65,5 +68,5 @@ struct i2c_algo_iic_data { int i2c_iic_add_bus(struct i2c_adapter *); int i2c_iic_del_bus(struct i2c_adapter *); - +#endif /* __KERNEL__ */ #endif /* I2C_ALGO_ITE_H */ diff --git a/include/linux/i2c-id.h b/include/linux/i2c-id.h index c8b81f419..9418519a5 100644 --- a/include/linux/i2c-id.h +++ b/include/linux/i2c-id.h @@ -112,6 +112,10 @@ #define I2C_DRIVERID_X1205 82 /* Xicor/Intersil X1205 RTC */ #define I2C_DRIVERID_PCF8563 83 /* Philips PCF8563 RTC */ #define I2C_DRIVERID_RS5C372 84 /* Ricoh RS5C372 RTC */ +#define I2C_DRIVERID_BT866 85 /* Conexant bt866 video encoder */ +#define I2C_DRIVERID_KS0127 86 /* Samsung ks0127 video decoder */ +#define I2C_DRIVERID_TLV320AIC23B 87 /* TI TLV320AIC23B audio codec */ +#define I2C_DRIVERID_ISL1208 88 /* Intersil ISL1208 RTC */ #define I2C_DRIVERID_I2CDEV 900 #define I2C_DRIVERID_ARP 902 /* SMBus ARP Client */ diff --git a/include/linux/i2c.h b/include/linux/i2c.h index 1635ee259..eb0628a7e 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h @@ -20,14 +20,15 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* ------------------------------------------------------------------------- */ -/* With some changes from Kyösti Mälkki and +/* With some changes from Kyösti Mälkki and Frodo Looijaard */ #ifndef _LINUX_I2C_H #define _LINUX_I2C_H -#include #include +#ifdef __KERNEL__ +#include #include #include #include /* for struct device */ @@ -96,13 +97,13 @@ extern s32 i2c_smbus_write_word_data(struct i2c_client * client, u8 command, u16 value); extern s32 i2c_smbus_write_block_data(struct i2c_client * client, u8 command, u8 length, - u8 *values); + const u8 *values); /* Returns the number of read bytes */ extern s32 i2c_smbus_read_i2c_block_data(struct i2c_client * client, u8 command, u8 *values); extern s32 i2c_smbus_write_i2c_block_data(struct i2c_client * client, u8 command, u8 length, - u8 *values); + const u8 *values); /* * A driver is capable of handling one or more physical devices present on @@ -192,6 +193,8 @@ struct i2c_algorithm { to NULL. If an adapter algorithm can do SMBus access, set smbus_xfer. If set to NULL, the SMBus protocol is simulated using common I2C messages */ + /* master_xfer should return the number of messages successfully + processed, or a negative value on error */ int (*master_xfer)(struct i2c_adapter *adap,struct i2c_msg *msgs, int num); int (*smbus_xfer) (struct i2c_adapter *adap, u16 addr, @@ -354,6 +357,7 @@ static inline int i2c_adapter_id(struct i2c_adapter *adap) { return adap->nr; } +#endif /* __KERNEL__ */ /* * I2C Message - used for pure i2c transaction, also from /dev interface @@ -469,6 +473,7 @@ union i2c_smbus_data { #define I2C_SMBUS 0x0720 /* SMBus-level access */ /* ----- I2C-DEV: char device interface stuff ------------------------- */ +#ifdef __KERNEL__ #define I2C_MAJOR 89 /* Device major number */ @@ -646,5 +651,5 @@ static unsigned short *forces[] = { force, force_##chip1, \ force_##chip6, force_##chip7, \ force_##chip8, NULL }; \ I2C_CLIENT_INSMOD_COMMON - +#endif /* __KERNEL__ */ #endif /* _LINUX_I2C_H */ diff --git a/include/linux/i2o-dev.h b/include/linux/i2o-dev.h index 36fd18cda..c2519df1b 100644 --- a/include/linux/i2o-dev.h +++ b/include/linux/i2o-dev.h @@ -13,7 +13,7 @@ * This header file defines the I2O APIs that are available to both * the kernel and user level applications. Kernel specific structures * are defined in i2o_osm. OSMs should include _only_ i2o_osm.h which - * automatically includs this file. + * automatically includes this file. * */ @@ -23,14 +23,7 @@ /* How many controllers are we allowing */ #define MAX_I2O_CONTROLLERS 32 -//#include -#ifndef __KERNEL__ - -typedef unsigned char u8; -typedef unsigned short u16; -typedef unsigned int u32; - -#endif /* __KERNEL__ */ +#include /* * I2O Control IOCTLs and structures @@ -53,7 +46,7 @@ typedef unsigned int u32; struct i2o_cmd_passthru32 { unsigned int iop; /* IOP unit number */ - u32 msg; /* message */ + __u32 msg; /* message */ }; struct i2o_cmd_passthru { @@ -138,53 +131,53 @@ typedef struct i2o_sg_io_hdr { #define I2O_BUS_UNKNOWN 0x80 typedef struct _i2o_pci_bus { - u8 PciFunctionNumber; - u8 PciDeviceNumber; - u8 PciBusNumber; - u8 reserved; - u16 PciVendorID; - u16 PciDeviceID; + __u8 PciFunctionNumber; + __u8 PciDeviceNumber; + __u8 PciBusNumber; + __u8 reserved; + __u16 PciVendorID; + __u16 PciDeviceID; } i2o_pci_bus; typedef struct _i2o_local_bus { - u16 LbBaseIOPort; - u16 reserved; - u32 LbBaseMemoryAddress; + __u16 LbBaseIOPort; + __u16 reserved; + __u32 LbBaseMemoryAddress; } i2o_local_bus; typedef struct _i2o_isa_bus { - u16 IsaBaseIOPort; - u8 CSN; - u8 reserved; - u32 IsaBaseMemoryAddress; + __u16 IsaBaseIOPort; + __u8 CSN; + __u8 reserved; + __u32 IsaBaseMemoryAddress; } i2o_isa_bus; typedef struct _i2o_eisa_bus_info { - u16 EisaBaseIOPort; - u8 reserved; - u8 EisaSlotNumber; - u32 EisaBaseMemoryAddress; + __u16 EisaBaseIOPort; + __u8 reserved; + __u8 EisaSlotNumber; + __u32 EisaBaseMemoryAddress; } i2o_eisa_bus; typedef struct _i2o_mca_bus { - u16 McaBaseIOPort; - u8 reserved; - u8 McaSlotNumber; - u32 McaBaseMemoryAddress; + __u16 McaBaseIOPort; + __u8 reserved; + __u8 McaSlotNumber; + __u32 McaBaseMemoryAddress; } i2o_mca_bus; typedef struct _i2o_other_bus { - u16 BaseIOPort; - u16 reserved; - u32 BaseMemoryAddress; + __u16 BaseIOPort; + __u16 reserved; + __u32 BaseMemoryAddress; } i2o_other_bus; typedef struct _i2o_hrt_entry { - u32 adapter_id; - u32 parent_tid:12; - u32 state:4; - u32 bus_num:8; - u32 bus_type:8; + __u32 adapter_id; + __u32 parent_tid:12; + __u32 state:4; + __u32 bus_num:8; + __u32 bus_type:8; union { i2o_pci_bus pci_bus; i2o_local_bus local_bus; @@ -196,66 +189,66 @@ typedef struct _i2o_hrt_entry { } i2o_hrt_entry; typedef struct _i2o_hrt { - u16 num_entries; - u8 entry_len; - u8 hrt_version; - u32 change_ind; + __u16 num_entries; + __u8 entry_len; + __u8 hrt_version; + __u32 change_ind; i2o_hrt_entry hrt_entry[1]; } i2o_hrt; typedef struct _i2o_lct_entry { - u32 entry_size:16; - u32 tid:12; - u32 reserved:4; - u32 change_ind; - u32 device_flags; - u32 class_id:12; - u32 version:4; - u32 vendor_id:16; - u32 sub_class; - u32 user_tid:12; - u32 parent_tid:12; - u32 bios_info:8; - u8 identity_tag[8]; - u32 event_capabilities; + __u32 entry_size:16; + __u32 tid:12; + __u32 reserved:4; + __u32 change_ind; + __u32 device_flags; + __u32 class_id:12; + __u32 version:4; + __u32 vendor_id:16; + __u32 sub_class; + __u32 user_tid:12; + __u32 parent_tid:12; + __u32 bios_info:8; + __u8 identity_tag[8]; + __u32 event_capabilities; } i2o_lct_entry; typedef struct _i2o_lct { - u32 table_size:16; - u32 boot_tid:12; - u32 lct_ver:4; - u32 iop_flags; - u32 change_ind; + __u32 table_size:16; + __u32 boot_tid:12; + __u32 lct_ver:4; + __u32 iop_flags; + __u32 change_ind; i2o_lct_entry lct_entry[1]; } i2o_lct; typedef struct _i2o_status_block { - u16 org_id; - u16 reserved; - u16 iop_id:12; - u16 reserved1:4; - u16 host_unit_id; - u16 segment_number:12; - u16 i2o_version:4; - u8 iop_state; - u8 msg_type; - u16 inbound_frame_size; - u8 init_code; - u8 reserved2; - u32 max_inbound_frames; - u32 cur_inbound_frames; - u32 max_outbound_frames; + __u16 org_id; + __u16 reserved; + __u16 iop_id:12; + __u16 reserved1:4; + __u16 host_unit_id; + __u16 segment_number:12; + __u16 i2o_version:4; + __u8 iop_state; + __u8 msg_type; + __u16 inbound_frame_size; + __u8 init_code; + __u8 reserved2; + __u32 max_inbound_frames; + __u32 cur_inbound_frames; + __u32 max_outbound_frames; char product_id[24]; - u32 expected_lct_size; - u32 iop_capabilities; - u32 desired_mem_size; - u32 current_mem_size; - u32 current_mem_base; - u32 desired_io_size; - u32 current_io_size; - u32 current_io_base; - u32 reserved3:24; - u32 cmd_status:8; + __u32 expected_lct_size; + __u32 iop_capabilities; + __u32 desired_mem_size; + __u32 current_mem_size; + __u32 current_mem_base; + __u32 desired_io_size; + __u32 current_io_size; + __u32 current_io_base; + __u32 reserved3:24; + __u32 cmd_status:8; } i2o_status_block; /* Event indicator mask flags */ diff --git a/include/linux/ide.h b/include/linux/ide.h index a8bef1d13..99620451d 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h @@ -6,7 +6,6 @@ * Copyright (C) 1994-2002 Linus Torvalds & authors */ -#include #include #include #include @@ -553,7 +552,6 @@ typedef struct ide_drive_s { struct hd_driveid *id; /* drive model identification info */ struct proc_dir_entry *proc; /* /proc/ide/ directory entry */ struct ide_settings_s *settings;/* /proc/ide/ drive settings */ - char devfs_name[64]; /* devfs crap */ struct hwif_s *hwif; /* actually (ide_hwif_t *) */ @@ -573,6 +571,7 @@ typedef struct ide_drive_s { u8 waiting_for_dma; /* dma currently in progress */ u8 unmask; /* okay to unmask other irqs */ u8 bswap; /* byte swap data */ + u8 noflush; /* don't attempt flushes */ u8 dsc_overlap; /* DSC overlap */ u8 nice1; /* give potential excess bandwidth */ @@ -631,6 +630,7 @@ typedef struct ide_drive_s { unsigned int usage; /* current "open()" count for drive */ unsigned int failures; /* current failure count */ unsigned int max_failures; /* maximum allowed failure count */ + u64 probed_capacity;/* initial reported media capacity (ide-cd only currently) */ u64 capacity64; /* total number of sectors */ @@ -793,6 +793,7 @@ typedef struct hwif_s { unsigned auto_poll : 1; /* supports nop auto-poll */ unsigned sg_mapped : 1; /* sg_table and sg_nents are ready */ unsigned no_io_32bit : 1; /* 1 = can not do 32-bit IO ops */ + unsigned err_stops_fifo : 1; /* 1=data FIFO is cleared by an error */ struct device gendev; struct completion gendev_rel_comp; /* To deal with device release() */ @@ -1006,6 +1007,8 @@ extern ide_hwif_t ide_hwifs[]; /* master data repository */ extern int noautodma; extern int ide_end_request (ide_drive_t *drive, int uptodate, int nrsecs); +int ide_end_dequeued_request(ide_drive_t *drive, struct request *rq, + int uptodate, int nr_sectors); /* * This is used on exit from the driver to designate the next irq handler @@ -1357,7 +1360,7 @@ extern struct semaphore ide_cfg_sem; * ide_drive_t->hwif: constant, no locking */ -#define local_irq_set(flags) do { local_save_flags((flags)); local_irq_enable(); } while (0) +#define local_irq_set(flags) do { local_save_flags((flags)); local_irq_enable_in_hardirq(); } while (0) extern struct bus_type ide_bus_type; diff --git a/include/linux/idr.h b/include/linux/idr.h index f559a719d..826803449 100644 --- a/include/linux/idr.h +++ b/include/linux/idr.h @@ -66,7 +66,7 @@ struct idr { .id_free = NULL, \ .layers = 0, \ .id_free_cnt = 0, \ - .lock = SPIN_LOCK_UNLOCKED, \ + .lock = __SPIN_LOCK_UNLOCKED(name.lock), \ } #define DEFINE_IDR(name) struct idr name = IDR_INIT(name) diff --git a/include/linux/if_fddi.h b/include/linux/if_fddi.h index 1288a161b..e0a150046 100644 --- a/include/linux/if_fddi.h +++ b/include/linux/if_fddi.h @@ -102,6 +102,7 @@ struct fddihdr } hdr; } __attribute__ ((packed)); +#ifdef __KERNEL__ /* Define FDDI statistics structure */ struct fddi_statistics { @@ -193,5 +194,6 @@ struct fddi_statistics { __u32 port_ler_flag[2]; __u32 port_hardware_present[2]; }; +#endif /* __KERNEL__ */ #endif /* _LINUX_IF_FDDI_H */ diff --git a/include/linux/if_frad.h b/include/linux/if_frad.h index 395f0aad9..f272a80ca 100644 --- a/include/linux/if_frad.h +++ b/include/linux/if_frad.h @@ -24,7 +24,6 @@ #ifndef _FRAD_H_ #define _FRAD_H_ -#include #include #if defined(CONFIG_DLCI) || defined(CONFIG_DLCI_MODULE) diff --git a/include/linux/if_tr.h b/include/linux/if_tr.h index 5502f597c..2f94cf2c7 100644 --- a/include/linux/if_tr.h +++ b/include/linux/if_tr.h @@ -43,7 +43,6 @@ struct trh_hdr { }; #ifdef __KERNEL__ -#include #include static inline struct trh_hdr *tr_hdr(const struct sk_buff *skb) diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h index eef0876d8..ab2740832 100644 --- a/include/linux/if_vlan.h +++ b/include/linux/if_vlan.h @@ -23,8 +23,8 @@ struct vlan_collection; struct vlan_dev_info; struct hlist_node; -#include /* for proc_dir_entry */ #include +#include #define VLAN_HLEN 4 /* The additional bytes (on top of the Ethernet header) * that VLAN requires. @@ -155,6 +155,11 @@ static inline int __vlan_hwaccel_rx(struct sk_buff *skb, { struct net_device_stats *stats; + if (skb_bond_should_drop(skb)) { + dev_kfree_skb_any(skb); + return NET_RX_DROP; + } + skb->dev = grp->vlan_devices[vlan_tag & VLAN_VID_MASK]; if (skb->dev == NULL) { dev_kfree_skb_any(skb); @@ -185,7 +190,8 @@ static inline int __vlan_hwaccel_rx(struct sk_buff *skb, * This allows the VLAN to have a different MAC than the underlying * device, and still route correctly. */ - if (!memcmp(eth_hdr(skb)->h_dest, skb->dev->dev_addr, ETH_ALEN)) + if (!compare_ether_addr(eth_hdr(skb)->h_dest, + skb->dev->dev_addr)) skb->pkt_type = PACKET_HOST; break; }; diff --git a/include/linux/igmp.h b/include/linux/igmp.h index 28f4f3b36..899c3d477 100644 --- a/include/linux/igmp.h +++ b/include/linux/igmp.h @@ -169,7 +169,7 @@ struct ip_sf_list struct ip_mc_list { struct in_device *interface; - unsigned long multiaddr; + __be32 multiaddr; struct ip_sf_list *sources; struct ip_sf_list *tomb; unsigned int sfmode; diff --git a/include/linux/init.h b/include/linux/init.h index 93dcbe1ab..6667785dd 100644 --- a/include/linux/init.h +++ b/include/linux/init.h @@ -1,7 +1,6 @@ #ifndef _LINUX_INIT_H #define _LINUX_INIT_H -#include #include /* These macros are used to mark some functions or diff --git a/include/linux/init_task.h b/include/linux/init_task.h index e8864e6c0..c37358e17 100644 --- a/include/linux/init_task.h +++ b/include/linux/init_task.h @@ -3,6 +3,8 @@ #include #include +#include +#include #define INIT_FDTABLE \ { \ @@ -21,7 +23,7 @@ .count = ATOMIC_INIT(1), \ .fdt = &init_files.fdtab, \ .fdtab = INIT_FDTABLE, \ - .file_lock = SPIN_LOCK_UNLOCKED, \ + .file_lock = __SPIN_LOCK_UNLOCKED(init_task.file_lock), \ .next_fd = 0, \ .close_on_exec_init = { { 0, } }, \ .open_fds_init = { { 0, } }, \ @@ -36,7 +38,7 @@ .user_id = 0, \ .next = NULL, \ .wait = __WAIT_QUEUE_HEAD_INITIALIZER(name.wait), \ - .ctx_lock = SPIN_LOCK_UNLOCKED, \ + .ctx_lock = __SPIN_LOCK_UNLOCKED(name.ctx_lock), \ .reqs_active = 0U, \ .max_reqs = ~0U, \ } @@ -48,7 +50,7 @@ .mm_users = ATOMIC_INIT(2), \ .mm_count = ATOMIC_INIT(1), \ .mmap_sem = __RWSEM_INITIALIZER(name.mmap_sem), \ - .page_table_lock = SPIN_LOCK_UNLOCKED, \ + .page_table_lock = __SPIN_LOCK_UNLOCKED(name.page_table_lock), \ .mmlist = LIST_HEAD_INIT(name.mmlist), \ .cpu_vm_mask = CPU_MASK_ALL, \ } @@ -69,7 +71,7 @@ #define INIT_SIGHAND(sighand) { \ .count = ATOMIC_INIT(1), \ .action = { { { .sa_handler = NULL, } }, }, \ - .siglock = SPIN_LOCK_UNLOCKED, \ + .siglock = __SPIN_LOCK_UNLOCKED(sighand.siglock), \ } extern struct group_info init_groups; @@ -87,6 +89,7 @@ extern struct group_info init_groups; .lock_depth = -1, \ .prio = MAX_PRIO-20, \ .static_prio = MAX_PRIO-20, \ + .normal_prio = MAX_PRIO-20, \ .policy = SCHED_NORMAL, \ .cpus_allowed = CPU_MASK_ALL, \ .mm = NULL, \ @@ -95,9 +98,6 @@ extern struct group_info init_groups; .ioprio = 0, \ .time_slice = HZ, \ .tasks = LIST_HEAD_INIT(tsk.tasks), \ - .ptrace_children= LIST_HEAD_INIT(tsk.ptrace_children), \ - .ptrace_list = LIST_HEAD_INIT(tsk.ptrace_list), \ - .real_parent = &tsk, \ .parent = &tsk, \ .children = LIST_HEAD_INIT(tsk.children), \ .sibling = LIST_HEAD_INIT(tsk.sibling), \ @@ -118,11 +118,13 @@ extern struct group_info init_groups; .list = LIST_HEAD_INIT(tsk.pending.list), \ .signal = {{0}}}, \ .blocked = {{0}}, \ - .alloc_lock = SPIN_LOCK_UNLOCKED, \ - .proc_lock = SPIN_LOCK_UNLOCKED, \ + .alloc_lock = __SPIN_LOCK_UNLOCKED(tsk.alloc_lock), \ .journal_info = NULL, \ .cpu_timers = INIT_CPU_TIMERS(tsk.cpu_timers), \ .fs_excl = ATOMIC_INIT(0), \ + .pi_lock = SPIN_LOCK_UNLOCKED, \ + INIT_TRACE_IRQFLAGS \ + INIT_LOCKDEP \ .xid = 0, \ .vx_info = NULL, \ .nid = 0, \ diff --git a/include/linux/inotify.h b/include/linux/inotify.h index 09e00433c..d4f48c640 100644 --- a/include/linux/inotify.h +++ b/include/linux/inotify.h @@ -67,20 +67,66 @@ struct inotify_event { #include #include -#include + +/* + * struct inotify_watch - represents a watch request on a specific inode + * + * h_list is protected by ih->mutex of the associated inotify_handle. + * i_list, mask are protected by inode->inotify_mutex of the associated inode. + * ih, inode, and wd are never written to once the watch is created. + * + * Callers must use the established inotify interfaces to access inotify_watch + * contents. The content of this structure is private to the inotify + * implementation. + */ +struct inotify_watch { + struct list_head h_list; /* entry in inotify_handle's list */ + struct list_head i_list; /* entry in inode's list */ + atomic_t count; /* reference count */ + struct inotify_handle *ih; /* associated inotify handle */ + struct inode *inode; /* associated inode */ + __s32 wd; /* watch descriptor */ + __u32 mask; /* event mask for this watch */ +}; + +struct inotify_operations { + void (*handle_event)(struct inotify_watch *, u32, u32, u32, + const char *, struct inode *); + void (*destroy_watch)(struct inotify_watch *); +}; #ifdef CONFIG_INOTIFY +/* Kernel API for producing events */ + extern void inotify_d_instantiate(struct dentry *, struct inode *); extern void inotify_d_move(struct dentry *); extern void inotify_inode_queue_event(struct inode *, __u32, __u32, - const char *); + const char *, struct inode *); extern void inotify_dentry_parent_queue_event(struct dentry *, __u32, __u32, const char *); extern void inotify_unmount_inodes(struct list_head *); extern void inotify_inode_is_dead(struct inode *); extern u32 inotify_get_cookie(void); +/* Kernel Consumer API */ + +extern struct inotify_handle *inotify_init(const struct inotify_operations *); +extern void inotify_init_watch(struct inotify_watch *); +extern void inotify_destroy(struct inotify_handle *); +extern __s32 inotify_find_watch(struct inotify_handle *, struct inode *, + struct inotify_watch **); +extern __s32 inotify_find_update_watch(struct inotify_handle *, struct inode *, + u32); +extern __s32 inotify_add_watch(struct inotify_handle *, struct inotify_watch *, + struct inode *, __u32); +extern int inotify_rm_watch(struct inotify_handle *, struct inotify_watch *); +extern int inotify_rm_wd(struct inotify_handle *, __u32); +extern void inotify_remove_watch_locked(struct inotify_handle *, + struct inotify_watch *); +extern void get_inotify_watch(struct inotify_watch *); +extern void put_inotify_watch(struct inotify_watch *); + #else static inline void inotify_d_instantiate(struct dentry *dentry, @@ -94,7 +140,8 @@ static inline void inotify_d_move(struct dentry *dentry) static inline void inotify_inode_queue_event(struct inode *inode, __u32 mask, __u32 cookie, - const char *filename) + const char *filename, + struct inode *n_inode) { } @@ -117,6 +164,62 @@ static inline u32 inotify_get_cookie(void) return 0; } +static inline struct inotify_handle *inotify_init(const struct inotify_operations *ops) +{ + return ERR_PTR(-EOPNOTSUPP); +} + +static inline void inotify_init_watch(struct inotify_watch *watch) +{ +} + +static inline void inotify_destroy(struct inotify_handle *ih) +{ +} + +static inline __s32 inotify_find_watch(struct inotify_handle *ih, struct inode *inode, + struct inotify_watch **watchp) +{ + return -EOPNOTSUPP; +} + +static inline __s32 inotify_find_update_watch(struct inotify_handle *ih, + struct inode *inode, u32 mask) +{ + return -EOPNOTSUPP; +} + +static inline __s32 inotify_add_watch(struct inotify_handle *ih, + struct inotify_watch *watch, + struct inode *inode, __u32 mask) +{ + return -EOPNOTSUPP; +} + +static inline int inotify_rm_watch(struct inotify_handle *ih, + struct inotify_watch *watch) +{ + return -EOPNOTSUPP; +} + +static inline int inotify_rm_wd(struct inotify_handle *ih, __u32 wd) +{ + return -EOPNOTSUPP; +} + +static inline void inotify_remove_watch_locked(struct inotify_handle *ih, + struct inotify_watch *watch) +{ +} + +static inline void get_inotify_watch(struct inotify_watch *watch) +{ +} + +static inline void put_inotify_watch(struct inotify_watch *watch) +{ +} + #endif /* CONFIG_INOTIFY */ #endif /* __KERNEL __ */ diff --git a/include/linux/input.h b/include/linux/input.h index ce1a756c4..b3253ab72 100644 --- a/include/linux/input.h +++ b/include/linux/input.h @@ -15,6 +15,7 @@ #else #include #include +#include #include #endif @@ -231,7 +232,8 @@ struct input_absinfo { #define KEY_PAUSE 119 #define KEY_KPCOMMA 121 -#define KEY_HANGUEL 122 +#define KEY_HANGEUL 122 +#define KEY_HANGUEL KEY_HANGEUL #define KEY_HANJA 123 #define KEY_YEN 124 #define KEY_LEFTMETA 125 @@ -891,7 +893,6 @@ struct input_dev { int (*open)(struct input_dev *dev); void (*close)(struct input_dev *dev); - int (*accept)(struct input_dev *dev, struct file *file); int (*flush)(struct input_dev *dev, struct file *file); int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value); int (*upload_effect)(struct input_dev *dev, struct ff_effect *effect); @@ -959,6 +960,26 @@ struct input_dev { struct input_handle; +/** + * struct input_handler - implements one of interfaces for input devices + * @private: driver-specific data + * @event: event handler + * @connect: called when attaching a handler to an input device + * @disconnect: disconnects a handler from input device + * @start: starts handler for given handle. This function is called by + * input core right after connect() method and also when a process + * that "grabbed" a device releases it + * @fops: file operations this driver implements + * @minor: beginning of range of 32 minors for devices this driver + * can provide + * @name: name of the handler, to be shown in /proc/bus/input/handlers + * @id_table: pointer to a table of input_device_ids this driver can + * handle + * @blacklist: prointer to a table of input_device_ids this driver should + * ignore even if they match @id_table + * @h_list: list of input handles associated with the handler + * @node: for placing the driver onto input_handler_list + */ struct input_handler { void *private; @@ -966,6 +987,7 @@ struct input_handler { void (*event)(struct input_handle *handle, unsigned int type, unsigned int code, int value); struct input_handle* (*connect)(struct input_handler *handler, struct input_dev *dev, struct input_device_id *id); void (*disconnect)(struct input_handle *handle); + void (*start)(struct input_handle *handle); const struct file_operations *fops; int minor; @@ -1004,6 +1026,7 @@ static inline void init_input_dev(struct input_dev *dev) } struct input_dev *input_allocate_device(void); +void input_free_device(struct input_dev *dev); static inline struct input_dev *input_get_device(struct input_dev *dev) { @@ -1015,12 +1038,6 @@ static inline void input_put_device(struct input_dev *dev) class_device_put(&dev->cdev); } -static inline void input_free_device(struct input_dev *dev) -{ - if (dev) - input_put_device(dev); -} - int input_register_device(struct input_dev *); void input_unregister_device(struct input_dev *); @@ -1033,10 +1050,10 @@ void input_release_device(struct input_handle *); int input_open_device(struct input_handle *); void input_close_device(struct input_handle *); -int input_accept_process(struct input_handle *handle, struct file *file); int input_flush_device(struct input_handle* handle, struct file* file); void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value); +void input_inject_event(struct input_handle *handle, unsigned int type, unsigned int code, int value); static inline void input_report_key(struct input_dev *dev, unsigned int code, int value) { diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index d55ff51ff..1463c0927 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h @@ -2,37 +2,67 @@ #ifndef _LINUX_INTERRUPT_H #define _LINUX_INTERRUPT_H -#include #include #include #include #include #include +#include #include #include +#include #include #include #include /* - * For 2.4.x compatibility, 2.4.x can use - * - * typedef void irqreturn_t; - * #define IRQ_NONE - * #define IRQ_HANDLED - * #define IRQ_RETVAL(x) - * - * To mix old-style and new-style irq handler returns. + * These correspond to the IORESOURCE_IRQ_* defines in + * linux/ioport.h to select the interrupt line behaviour. When + * requesting an interrupt without specifying a IRQF_TRIGGER, the + * setting should be assumed to be "as already configured", which + * may be as per machine or firmware initialisation. + */ +#define IRQF_TRIGGER_NONE 0x00000000 +#define IRQF_TRIGGER_RISING 0x00000001 +#define IRQF_TRIGGER_FALLING 0x00000002 +#define IRQF_TRIGGER_HIGH 0x00000004 +#define IRQF_TRIGGER_LOW 0x00000008 +#define IRQF_TRIGGER_MASK (IRQF_TRIGGER_HIGH | IRQF_TRIGGER_LOW | \ + IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING) +#define IRQF_TRIGGER_PROBE 0x00000010 + +/* + * These flags used only by the kernel as part of the + * irq handling routines. * - * IRQ_NONE means we didn't handle it. - * IRQ_HANDLED means that we did have a valid interrupt and handled it. - * IRQ_RETVAL(x) selects on the two depending on x being non-zero (for handled) + * IRQF_DISABLED - keep irqs disabled when calling the action handler + * IRQF_SAMPLE_RANDOM - irq is used to feed the random generator + * IRQF_SHARED - allow sharing the irq among several devices + * IRQF_PROBE_SHARED - set by callers when they expect sharing mismatches to occur + * IRQF_TIMER - Flag to mark this interrupt as timer interrupt */ -typedef int irqreturn_t; +#define IRQF_DISABLED 0x00000020 +#define IRQF_SAMPLE_RANDOM 0x00000040 +#define IRQF_SHARED 0x00000080 +#define IRQF_PROBE_SHARED 0x00000100 +#define IRQF_TIMER 0x00000200 +#define IRQF_PERCPU 0x00000400 -#define IRQ_NONE (0) -#define IRQ_HANDLED (1) -#define IRQ_RETVAL(x) ((x) != 0) +/* + * Migration helpers. Scheduled for removal in 1/2007 + * Do not use for new code ! + */ +#define SA_INTERRUPT IRQF_DISABLED +#define SA_SAMPLE_RANDOM IRQF_SAMPLE_RANDOM +#define SA_SHIRQ IRQF_SHARED +#define SA_PROBEIRQ IRQF_PROBE_SHARED +#define SA_PERCPU IRQF_PERCPU + +#define SA_TRIGGER_LOW IRQF_TRIGGER_LOW +#define SA_TRIGGER_HIGH IRQF_TRIGGER_HIGH +#define SA_TRIGGER_FALLING IRQF_TRIGGER_FALLING +#define SA_TRIGGER_RISING IRQF_TRIGGER_RISING +#define SA_TRIGGER_MASK IRQF_TRIGGER_MASK struct irqaction { irqreturn_t (*handler)(int, void *, struct pt_regs *); @@ -51,12 +81,90 @@ extern int request_irq(unsigned int, unsigned long, const char *, void *); extern void free_irq(unsigned int, void *); +/* + * On lockdep we dont want to enable hardirqs in hardirq + * context. Use local_irq_enable_in_hardirq() to annotate + * kernel code that has to do this nevertheless (pretty much + * the only valid case is for old/broken hardware that is + * insanely slow). + * + * NOTE: in theory this might break fragile code that relies + * on hardirq delivery - in practice we dont seem to have such + * places left. So the only effect should be slightly increased + * irqs-off latencies. + */ +#ifdef CONFIG_LOCKDEP +# define local_irq_enable_in_hardirq() do { } while (0) +#else +# define local_irq_enable_in_hardirq() local_irq_enable() +#endif #ifdef CONFIG_GENERIC_HARDIRQS extern void disable_irq_nosync(unsigned int irq); extern void disable_irq(unsigned int irq); extern void enable_irq(unsigned int irq); + +/* + * Special lockdep variants of irq disabling/enabling. + * These should be used for locking constructs that + * know that a particular irq context which is disabled, + * and which is the only irq-context user of a lock, + * that it's safe to take the lock in the irq-disabled + * section without disabling hardirqs. + * + * On !CONFIG_LOCKDEP they are equivalent to the normal + * irq disable/enable methods. + */ +static inline void disable_irq_nosync_lockdep(unsigned int irq) +{ + disable_irq_nosync(irq); +#ifdef CONFIG_LOCKDEP + local_irq_disable(); #endif +} + +static inline void disable_irq_lockdep(unsigned int irq) +{ + disable_irq(irq); +#ifdef CONFIG_LOCKDEP + local_irq_disable(); +#endif +} + +static inline void enable_irq_lockdep(unsigned int irq) +{ +#ifdef CONFIG_LOCKDEP + local_irq_enable(); +#endif + enable_irq(irq); +} + +/* IRQ wakeup (PM) control: */ +extern int set_irq_wake(unsigned int irq, unsigned int on); + +static inline int enable_irq_wake(unsigned int irq) +{ + return set_irq_wake(irq, 1); +} + +static inline int disable_irq_wake(unsigned int irq) +{ + return set_irq_wake(irq, 0); +} + +#else /* !CONFIG_GENERIC_HARDIRQS */ +/* + * NOTE: non-genirq architectures, if they want to support the lock + * validator need to define the methods below in their asm/irq.h + * files, under an #ifdef CONFIG_LOCKDEP section. + */ +# ifndef CONFIG_LOCKDEP +# define disable_irq_nosync_lockdep(irq) disable_irq_nosync(irq) +# define disable_irq_lockdep(irq) disable_irq(irq) +# define enable_irq_lockdep(irq) enable_irq(irq) +# endif + +#endif /* CONFIG_GENERIC_HARDIRQS */ #ifdef CONFIG_HAVE_IRQ_IGNORE_UNHANDLED int irq_ignore_unhandled(unsigned int irq); @@ -98,13 +206,11 @@ static inline void __deprecated save_and_cli(unsigned long *x) #define save_and_cli(x) save_and_cli(&x) #endif /* CONFIG_SMP */ -/* SoftIRQ primitives. */ -#define local_bh_disable() \ - do { add_preempt_count(SOFTIRQ_OFFSET); barrier(); } while (0) -#define __local_bh_enable() \ - do { barrier(); sub_preempt_count(SOFTIRQ_OFFSET); } while (0) - +extern void local_bh_disable(void); +extern void __local_bh_enable(void); +extern void _local_bh_enable(void); extern void local_bh_enable(void); +extern void local_bh_enable_ip(unsigned long ip); /* PLEASE, avoid to allocate new softirqs, if you need not _really_ high frequency threaded job scheduling. For almost all the purposes diff --git a/include/linux/io.h b/include/linux/io.h index 85533ec5a..420e2fdf2 100644 --- a/include/linux/io.h +++ b/include/linux/io.h @@ -21,5 +21,6 @@ #include void __iowrite32_copy(void __iomem *to, const void *from, size_t count); +void __iowrite64_copy(void __iomem *to, const void *from, size_t count); #endif /* _LINUX_IO_H */ diff --git a/include/linux/ioc4.h b/include/linux/ioc4.h index 3dd18b785..de73a3289 100644 --- a/include/linux/ioc4.h +++ b/include/linux/ioc4.h @@ -147,6 +147,10 @@ struct ioc4_misc_regs { #define IOC4_GPCR_EDGE_6 0x40 #define IOC4_GPCR_EDGE_7 0x80 +#define IOC4_VARIANT_IO9 0x0900 +#define IOC4_VARIANT_PCI_RT 0x0901 +#define IOC4_VARIANT_IO10 0x1000 + /* One of these per IOC4 */ struct ioc4_driver_data { struct list_head idd_list; @@ -156,6 +160,7 @@ struct ioc4_driver_data { struct __iomem ioc4_misc_regs *idd_misc_regs; unsigned long count_period; void *idd_serial_data; + unsigned int idd_variant; }; /* One per submodule */ diff --git a/include/linux/ioport.h b/include/linux/ioport.h index cd6bd001b..d42c83399 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h @@ -9,13 +9,15 @@ #define _LINUX_IOPORT_H #include +#include /* * Resources are tree-like, allowing * nesting etc.. */ struct resource { + resource_size_t start; + resource_size_t end; const char *name; - unsigned long start, end; unsigned long flags; struct resource *parent, *sibling, *child; }; @@ -53,6 +55,7 @@ struct resource_list { #define IORESOURCE_IRQ_LOWEDGE (1<<1) #define IORESOURCE_IRQ_HIGHLEVEL (1<<2) #define IORESOURCE_IRQ_LOWLEVEL (1<<3) +#define IORESOURCE_IRQ_SHAREABLE (1<<4) /* ISA PnP DMA specific bits (IORESOURCE_BITS) */ #define IORESOURCE_DMA_TYPE_MASK (3<<0) @@ -94,33 +97,39 @@ extern struct resource iomem_resource; extern int request_resource(struct resource *root, struct resource *new); extern struct resource * ____request_resource(struct resource *root, struct resource *new); extern int release_resource(struct resource *new); -extern __deprecated_for_modules int insert_resource(struct resource *parent, struct resource *new); +extern int insert_resource(struct resource *parent, struct resource *new); extern int allocate_resource(struct resource *root, struct resource *new, - unsigned long size, - unsigned long min, unsigned long max, - unsigned long align, + resource_size_t size, resource_size_t min, + resource_size_t max, resource_size_t align, void (*alignf)(void *, struct resource *, - unsigned long, unsigned long), + resource_size_t, resource_size_t), void *alignf_data); -int adjust_resource(struct resource *res, unsigned long start, - unsigned long size); +int adjust_resource(struct resource *res, resource_size_t start, + resource_size_t size); + +/* get registered SYSTEM_RAM resources in specified area */ +extern int find_next_system_ram(struct resource *res); /* Convenience shorthand with allocation */ #define request_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name)) #define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name)) #define rename_region(region, newname) do { (region)->name = (newname); } while (0) -extern struct resource * __request_region(struct resource *, unsigned long start, unsigned long n, const char *name); +extern struct resource * __request_region(struct resource *, + resource_size_t start, + resource_size_t n, const char *name); /* Compatibility cruft */ #define release_region(start,n) __release_region(&ioport_resource, (start), (n)) #define check_mem_region(start,n) __check_region(&iomem_resource, (start), (n)) #define release_mem_region(start,n) __release_region(&iomem_resource, (start), (n)) -extern int __check_region(struct resource *, unsigned long, unsigned long); -extern void __release_region(struct resource *, unsigned long, unsigned long); +extern int __check_region(struct resource *, resource_size_t, resource_size_t); +extern void __release_region(struct resource *, resource_size_t, + resource_size_t); -static inline int __deprecated check_region(unsigned long s, unsigned long n) +static inline int __deprecated check_region(resource_size_t s, + resource_size_t n) { return __check_region(&ioport_resource, s, n); } diff --git a/include/linux/ioprio.h b/include/linux/ioprio.h index 88d5961f7..8e2042b9d 100644 --- a/include/linux/ioprio.h +++ b/include/linux/ioprio.h @@ -59,27 +59,6 @@ static inline int task_nice_ioprio(struct task_struct *task) /* * For inheritance, return the highest of the two given priorities */ -static inline int ioprio_best(unsigned short aprio, unsigned short bprio) -{ - unsigned short aclass = IOPRIO_PRIO_CLASS(aprio); - unsigned short bclass = IOPRIO_PRIO_CLASS(bprio); - - if (!ioprio_valid(aprio)) - return bprio; - if (!ioprio_valid(bprio)) - return aprio; - - if (aclass == IOPRIO_CLASS_NONE) - aclass = IOPRIO_CLASS_BE; - if (bclass == IOPRIO_CLASS_NONE) - bclass = IOPRIO_CLASS_BE; - - if (aclass == bclass) - return min(aprio, bprio); - if (aclass > bclass) - return bprio; - else - return aprio; -} +extern int ioprio_best(unsigned short aprio, unsigned short bprio); #endif diff --git a/include/linux/ipmi.h b/include/linux/ipmi.h index 0a84b5693..d09fbeabf 100644 --- a/include/linux/ipmi.h +++ b/include/linux/ipmi.h @@ -36,7 +36,6 @@ #include #include -#include /* * This file describes an interface to an IPMI driver. You have to @@ -210,11 +209,8 @@ struct kernel_ipmi_msg */ #include #include - -#ifdef CONFIG_PROC_FS +#include #include -extern struct proc_dir_entry *proc_ipmi_root; -#endif /* CONFIG_PROC_FS */ /* Opaque type for a IPMI message user. One of these is needed to send and receive messages. */ diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index 1263d8cb3..297853c84 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h @@ -1,7 +1,6 @@ #ifndef _IPV6_H #define _IPV6_H -#include #include #include diff --git a/include/linux/irq.h b/include/linux/irq.h index ee2a82a57..fbf6d901e 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h @@ -1,5 +1,5 @@ -#ifndef __irq_h -#define __irq_h +#ifndef _LINUX_IRQ_H +#define _LINUX_IRQ_H /* * Please do not include this file in generic code. There is currently @@ -9,99 +9,190 @@ * Thanks. --rmk */ -#include #include -#if !defined(CONFIG_S390) +#ifndef CONFIG_S390 #include #include #include #include +#include #include #include /* * IRQ line status. + * + * Bits 0-16 are reserved for the IRQF_* bits in linux/interrupt.h + * + * IRQ types */ -#define IRQ_INPROGRESS 1 /* IRQ handler active - do not enter! */ -#define IRQ_DISABLED 2 /* IRQ disabled - do not enter! */ -#define IRQ_PENDING 4 /* IRQ pending - replay on enable */ -#define IRQ_REPLAY 8 /* IRQ has been replayed but not acked yet */ -#define IRQ_AUTODETECT 16 /* IRQ is being autodetected */ -#define IRQ_WAITING 32 /* IRQ not yet seen - for autodetection */ -#define IRQ_LEVEL 64 /* IRQ level triggered */ -#define IRQ_MASKED 128 /* IRQ masked - shouldn't be seen again */ -#if defined(ARCH_HAS_IRQ_PER_CPU) -# define IRQ_PER_CPU 256 /* IRQ is per CPU */ +#define IRQ_TYPE_NONE 0x00000000 /* Default, unspecified type */ +#define IRQ_TYPE_EDGE_RISING 0x00000001 /* Edge rising type */ +#define IRQ_TYPE_EDGE_FALLING 0x00000002 /* Edge falling type */ +#define IRQ_TYPE_EDGE_BOTH (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING) +#define IRQ_TYPE_LEVEL_HIGH 0x00000004 /* Level high type */ +#define IRQ_TYPE_LEVEL_LOW 0x00000008 /* Level low type */ +#define IRQ_TYPE_SENSE_MASK 0x0000000f /* Mask of the above */ +#define IRQ_TYPE_PROBE 0x00000010 /* Probing in progress */ + +/* Internal flags */ +#define IRQ_INPROGRESS 0x00010000 /* IRQ handler active - do not enter! */ +#define IRQ_DISABLED 0x00020000 /* IRQ disabled - do not enter! */ +#define IRQ_PENDING 0x00040000 /* IRQ pending - replay on enable */ +#define IRQ_REPLAY 0x00080000 /* IRQ has been replayed but not acked yet */ +#define IRQ_AUTODETECT 0x00100000 /* IRQ is being autodetected */ +#define IRQ_WAITING 0x00200000 /* IRQ not yet seen - for autodetection */ +#define IRQ_LEVEL 0x00400000 /* IRQ level triggered */ +#define IRQ_MASKED 0x00800000 /* IRQ masked - shouldn't be seen again */ +#define IRQ_PER_CPU 0x01000000 /* IRQ is per CPU */ +#ifdef CONFIG_IRQ_PER_CPU # define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU) #else # define CHECK_IRQ_PER_CPU(var) 0 #endif -/* - * Interrupt controller descriptor. This is all we need - * to describe about the low-level hardware. +#define IRQ_NOPROBE 0x02000000 /* IRQ is not valid for probing */ +#define IRQ_NOREQUEST 0x04000000 /* IRQ cannot be requested */ +#define IRQ_NOAUTOEN 0x08000000 /* IRQ will not be enabled on request irq */ +#define IRQ_DELAYED_DISABLE 0x10000000 /* IRQ disable (masking) happens delayed. */ +#define IRQ_WAKEUP 0x20000000 /* IRQ triggers system wakeup */ + +struct proc_dir_entry; + +/** + * struct irq_chip - hardware interrupt chip descriptor + * + * @name: name for /proc/interrupts + * @startup: start up the interrupt (defaults to ->enable if NULL) + * @shutdown: shut down the interrupt (defaults to ->disable if NULL) + * @enable: enable the interrupt (defaults to chip->unmask if NULL) + * @disable: disable the interrupt (defaults to chip->mask if NULL) + * @ack: start of a new interrupt + * @mask: mask an interrupt source + * @mask_ack: ack and mask an interrupt source + * @unmask: unmask an interrupt source + * @eoi: end of interrupt - chip level + * @end: end of interrupt - flow level + * @set_affinity: set the CPU affinity on SMP machines + * @retrigger: resend an IRQ to the CPU + * @set_type: set the flow type (IRQ_TYPE_LEVEL/etc.) of an IRQ + * @set_wake: enable/disable power-management wake-on of an IRQ + * + * @release: release function solely used by UML + * @typename: obsoleted by name, kept as migration helper */ -struct hw_interrupt_type { - const char * typename; - unsigned int (*startup)(unsigned int irq); - void (*shutdown)(unsigned int irq); - void (*enable)(unsigned int irq); - void (*disable)(unsigned int irq); - void (*ack)(unsigned int irq); - void (*end)(unsigned int irq); - void (*set_affinity)(unsigned int irq, cpumask_t dest); +struct irq_chip { + const char *name; + unsigned int (*startup)(unsigned int irq); + void (*shutdown)(unsigned int irq); + void (*enable)(unsigned int irq); + void (*disable)(unsigned int irq); + + void (*ack)(unsigned int irq); + void (*mask)(unsigned int irq); + void (*mask_ack)(unsigned int irq); + void (*unmask)(unsigned int irq); + void (*eoi)(unsigned int irq); + + void (*end)(unsigned int irq); + void (*set_affinity)(unsigned int irq, cpumask_t dest); + int (*retrigger)(unsigned int irq); + int (*set_type)(unsigned int irq, unsigned int flow_type); + int (*set_wake)(unsigned int irq, unsigned int on); + /* Currently used only by UML, might disappear one day.*/ #ifdef CONFIG_IRQ_RELEASE_METHOD - void (*release)(unsigned int irq, void *dev_id); + void (*release)(unsigned int irq, void *dev_id); #endif + /* + * For compatibility, ->typename is copied into ->name. + * Will disappear. + */ + const char *typename; }; -typedef struct hw_interrupt_type hw_irq_controller; - -/* - * This is the "IRQ descriptor", which contains various information - * about the irq, including what kind of hardware handling it has, - * whether it is disabled etc etc. +/** + * struct irq_desc - interrupt descriptor + * + * @handle_irq: highlevel irq-events handler [if NULL, __do_IRQ()] + * @chip: low level interrupt hardware access + * @handler_data: per-IRQ data for the irq_chip methods + * @chip_data: platform-specific per-chip private data for the chip + * methods, to allow shared chip implementations + * @action: the irq action chain + * @status: status information + * @depth: disable-depth, for nested irq_disable() calls + * @wake_depth: enable depth, for multiple set_irq_wake() callers + * @irq_count: stats field to detect stalled irqs + * @irqs_unhandled: stats field for spurious unhandled interrupts + * @lock: locking for SMP + * @affinity: IRQ affinity on SMP + * @cpu: cpu index useful for balancing + * @pending_mask: pending rebalanced interrupts + * @move_irq: need to re-target IRQ destination + * @dir: /proc/irq/ procfs entry + * @affinity_entry: /proc/irq/smp_affinity procfs entry on SMP * * Pad this out to 32 bytes for cache and indexing reasons. */ -typedef struct irq_desc { - hw_irq_controller *handler; - void *handler_data; - struct irqaction *action; /* IRQ action list */ - unsigned int status; /* IRQ status */ - unsigned int depth; /* nested irq disables */ - unsigned int irq_count; /* For detecting broken interrupts */ - unsigned int irqs_unhandled; - spinlock_t lock; -#if defined (CONFIG_GENERIC_PENDING_IRQ) || defined (CONFIG_IRQBALANCE) - unsigned int move_irq; /* Flag need to re-target intr dest*/ +struct irq_desc { + void fastcall (*handle_irq)(unsigned int irq, + struct irq_desc *desc, + struct pt_regs *regs); + struct irq_chip *chip; + void *handler_data; + void *chip_data; + struct irqaction *action; /* IRQ action list */ + unsigned int status; /* IRQ status */ + + unsigned int depth; /* nested irq disables */ + unsigned int wake_depth; /* nested wake enables */ + unsigned int irq_count; /* For detecting broken IRQs */ + unsigned int irqs_unhandled; + spinlock_t lock; +#ifdef CONFIG_SMP + cpumask_t affinity; + unsigned int cpu; +#endif +#if defined(CONFIG_GENERIC_PENDING_IRQ) || defined(CONFIG_IRQBALANCE) + cpumask_t pending_mask; + unsigned int move_irq; /* need to re-target IRQ dest */ +#endif +#ifdef CONFIG_PROC_FS + struct proc_dir_entry *dir; #endif -} ____cacheline_aligned irq_desc_t; +} ____cacheline_aligned; -extern irq_desc_t irq_desc [NR_IRQS]; +extern struct irq_desc irq_desc[NR_IRQS]; -/* Return a pointer to the irq descriptor for IRQ. */ -static inline irq_desc_t * -irq_descp (int irq) -{ - return irq_desc + irq; -} +/* + * Migration helpers for obsolete names, they will go away: + */ +#define hw_interrupt_type irq_chip +typedef struct irq_chip hw_irq_controller; +#define no_irq_type no_irq_chip +typedef struct irq_desc irq_desc_t; -#include /* the arch dependent stuff */ +/* + * Pick up the arch-dependent methods: + */ +#include -extern int setup_irq(unsigned int irq, struct irqaction * new); +extern int setup_irq(unsigned int irq, struct irqaction *new); #ifdef CONFIG_GENERIC_HARDIRQS -extern cpumask_t irq_affinity[NR_IRQS]; + +#ifndef handle_dynamic_tick +# define handle_dynamic_tick(a) do { } while (0) +#endif #ifdef CONFIG_SMP static inline void set_native_irq_info(int irq, cpumask_t mask) { - irq_affinity[irq] = mask; + irq_desc[irq].affinity = mask; } #else static inline void set_native_irq_info(int irq, cpumask_t mask) @@ -111,8 +202,7 @@ static inline void set_native_irq_info(int irq, cpumask_t mask) #ifdef CONFIG_SMP -#if defined (CONFIG_GENERIC_PENDING_IRQ) || defined (CONFIG_IRQBALANCE) -extern cpumask_t pending_irq_cpumask[NR_IRQS]; +#if defined(CONFIG_GENERIC_PENDING_IRQ) || defined(CONFIG_IRQBALANCE) void set_pending_irq(unsigned int irq, cpumask_t mask); void move_native_irq(int irq); @@ -133,7 +223,7 @@ static inline void set_irq_info(int irq, cpumask_t mask) { } -#else // CONFIG_PCI_MSI +#else /* CONFIG_PCI_MSI */ static inline void move_irq(int irq) { @@ -144,53 +234,178 @@ static inline void set_irq_info(int irq, cpumask_t mask) { set_native_irq_info(irq, mask); } -#endif // CONFIG_PCI_MSI -#else // CONFIG_GENERIC_PENDING_IRQ || CONFIG_IRQBALANCE +#endif /* CONFIG_PCI_MSI */ + +#else /* CONFIG_GENERIC_PENDING_IRQ || CONFIG_IRQBALANCE */ + +static inline void move_irq(int irq) +{ +} + +static inline void move_native_irq(int irq) +{ +} + +static inline void set_pending_irq(unsigned int irq, cpumask_t mask) +{ +} -#define move_irq(x) -#define move_native_irq(x) -#define set_pending_irq(x,y) static inline void set_irq_info(int irq, cpumask_t mask) { set_native_irq_info(irq, mask); } -#endif // CONFIG_GENERIC_PENDING_IRQ +#endif /* CONFIG_GENERIC_PENDING_IRQ */ -#else // CONFIG_SMP +#else /* CONFIG_SMP */ #define move_irq(x) #define move_native_irq(x) -#endif // CONFIG_SMP - -extern int no_irq_affinity; -extern int noirqdebug_setup(char *str); +#endif /* CONFIG_SMP */ -extern fastcall int handle_IRQ_event(unsigned int irq, struct pt_regs *regs, - struct irqaction *action); -extern fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs *regs); -extern void note_interrupt(unsigned int irq, irq_desc_t *desc, - int action_ret, struct pt_regs *regs); -extern int can_request_irq(unsigned int irq, unsigned long irqflags); - -extern void init_irq_proc(void); +#ifdef CONFIG_IRQBALANCE +extern void set_balance_irq_affinity(unsigned int irq, cpumask_t mask); +#else +static inline void set_balance_irq_affinity(unsigned int irq, cpumask_t mask) +{ +} +#endif #ifdef CONFIG_AUTO_IRQ_AFFINITY extern int select_smp_affinity(unsigned int irq); #else -static inline int -select_smp_affinity(unsigned int irq) +static inline int select_smp_affinity(unsigned int irq) { return 1; } #endif -#endif +extern int no_irq_affinity; -extern hw_irq_controller no_irq_type; /* needed in every arch ? */ +/* Handle irq action chains: */ +extern int handle_IRQ_event(unsigned int irq, struct pt_regs *regs, + struct irqaction *action); -#endif +/* + * Built-in IRQ handlers for various IRQ types, + * callable via desc->chip->handle_irq() + */ +extern void fastcall +handle_level_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs); +extern void fastcall +handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc, + struct pt_regs *regs); +extern void fastcall +handle_edge_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs); +extern void fastcall +handle_simple_irq(unsigned int irq, struct irq_desc *desc, + struct pt_regs *regs); +extern void fastcall +handle_percpu_irq(unsigned int irq, struct irq_desc *desc, + struct pt_regs *regs); +extern void fastcall +handle_bad_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs); + +/* + * Get a descriptive string for the highlevel handler, for + * /proc/interrupts output: + */ +extern const char * +handle_irq_name(void fastcall (*handle)(unsigned int, struct irq_desc *, + struct pt_regs *)); + +/* + * Monolithic do_IRQ implementation. + * (is an explicit fastcall, because i386 4KSTACKS calls it from assembly) + */ +extern fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs *regs); + +/* + * Architectures call this to let the generic IRQ layer + * handle an interrupt. If the descriptor is attached to an + * irqchip-style controller then we call the ->handle_irq() handler, + * and it calls __do_IRQ() if it's attached to an irqtype-style controller. + */ +static inline void generic_handle_irq(unsigned int irq, struct pt_regs *regs) +{ + struct irq_desc *desc = irq_desc + irq; + + if (likely(desc->handle_irq)) + desc->handle_irq(irq, desc, regs); + else + __do_IRQ(irq, regs); +} + +/* Handling of unhandled and spurious interrupts: */ +extern void note_interrupt(unsigned int irq, struct irq_desc *desc, + int action_ret, struct pt_regs *regs); + +/* Resending of interrupts :*/ +void check_irq_resend(struct irq_desc *desc, unsigned int irq); + +/* Initialize /proc/irq/ */ +extern void init_irq_proc(void); + +/* Enable/disable irq debugging output: */ +extern int noirqdebug_setup(char *str); + +/* Checks whether the interrupt can be requested by request_irq(): */ +extern int can_request_irq(unsigned int irq, unsigned long irqflags); + +/* Dummy irq-chip implementations: */ +extern struct irq_chip no_irq_chip; +extern struct irq_chip dummy_irq_chip; + +extern void +set_irq_chip_and_handler(unsigned int irq, struct irq_chip *chip, + void fastcall (*handle)(unsigned int, + struct irq_desc *, + struct pt_regs *)); +extern void +__set_irq_handler(unsigned int irq, + void fastcall (*handle)(unsigned int, struct irq_desc *, + struct pt_regs *), + int is_chained); + +/* + * Set a highlevel flow handler for a given IRQ: + */ +static inline void +set_irq_handler(unsigned int irq, + void fastcall (*handle)(unsigned int, struct irq_desc *, + struct pt_regs *)) +{ + __set_irq_handler(irq, handle, 0); +} + +/* + * Set a highlevel chained flow handler for a given IRQ. + * (a chained handler is automatically enabled and set to + * IRQ_NOREQUEST and IRQ_NOPROBE) + */ +static inline void +set_irq_chained_handler(unsigned int irq, + void fastcall (*handle)(unsigned int, struct irq_desc *, + struct pt_regs *)) +{ + __set_irq_handler(irq, handle, 1); +} + +/* Set/get chip/data for an IRQ: */ + +extern int set_irq_chip(unsigned int irq, struct irq_chip *chip); +extern int set_irq_data(unsigned int irq, void *data); +extern int set_irq_chip_data(unsigned int irq, void *data); +extern int set_irq_type(unsigned int irq, unsigned int type); + +#define get_irq_chip(irq) (irq_desc[irq].chip) +#define get_irq_chip_data(irq) (irq_desc[irq].chip_data) +#define get_irq_data(irq) (irq_desc[irq].handler_data) + +#endif /* CONFIG_GENERIC_HARDIRQS */ + +#endif /* !CONFIG_S390 */ -#endif /* __irq_h */ +#endif /* _LINUX_IRQ_H */ diff --git a/include/linux/irq_cpustat.h b/include/linux/irq_cpustat.h index af93505ec..77e4bac29 100644 --- a/include/linux/irq_cpustat.h +++ b/include/linux/irq_cpustat.h @@ -9,7 +9,6 @@ * Keith Owens July 2000. */ -#include /* * Simple wrappers reducing source bloat. Define all irq_stat fields diff --git a/include/linux/isapnp.h b/include/linux/isapnp.h index 26c64c286..1e8728a9e 100644 --- a/include/linux/isapnp.h +++ b/include/linux/isapnp.h @@ -22,7 +22,6 @@ #ifndef LINUX_ISAPNP_H #define LINUX_ISAPNP_H -#include #include #include diff --git a/include/linux/isdn.h b/include/linux/isdn.h index 53eaee960..62991148d 100644 --- a/include/linux/isdn.h +++ b/include/linux/isdn.h @@ -146,7 +146,6 @@ typedef struct { #ifdef __KERNEL__ -#include #include #include #include diff --git a/include/linux/isdn/tpam.h b/include/linux/isdn/tpam.h deleted file mode 100644 index 9f65bea49..000000000 --- a/include/linux/isdn/tpam.h +++ /dev/null @@ -1,56 +0,0 @@ -/* $Id: tpam.h,v 1.1.2.1 2001/06/08 08:23:46 kai Exp $ - * - * Turbo PAM ISDN driver for Linux. (Kernel Driver) - * - * Copyright 2001 Stelian Pop , Alcôve - * - * For all support questions please contact: - * - * 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 _TPAM_H_ -#define _TPAM_H_ - -#include -#include - -/* IOCTL commands */ -#define TPAM_CMD_DSPLOAD 0x0001 -#define TPAM_CMD_DSPSAVE 0x0002 -#define TPAM_CMD_DSPRUN 0x0003 -#define TPAM_CMD_LOOPMODEON 0x0004 -#define TPAM_CMD_LOOPMODEOFF 0x0005 - -/* addresses of debug information zones on board */ -#define TPAM_TRAPAUDIT_REGISTER 0x005493e4 -#define TPAM_NCOAUDIT_REGISTER 0x00500000 -#define TPAM_MSGAUDIT_REGISTER 0x008E30F0 - -/* length of debug information zones on board */ -#define TPAM_TRAPAUDIT_LENGTH 10000 -#define TPAM_NCOAUDIT_LENGTH 300000 -#define TPAM_NCOAUDIT_COUNT 30 -#define TPAM_MSGAUDIT_LENGTH 60000 - -/* IOCTL load/save parameter */ -typedef struct tpam_dsp_ioctl { - __u32 address; /* address to load/save data */ - __u32 data_len; /* size of data to be loaded/saved */ - __u8 data[0]; /* data */ -} tpam_dsp_ioctl; - -#endif /* _TPAM_H_ */ diff --git a/include/linux/isdn_ppp.h b/include/linux/isdn_ppp.h index 26b00a76e..8687a7dc0 100644 --- a/include/linux/isdn_ppp.h +++ b/include/linux/isdn_ppp.h @@ -67,7 +67,6 @@ struct isdn_ppp_comp_data { #ifdef __KERNEL__ -#include #ifdef CONFIG_IPPP_FILTER #include diff --git a/include/linux/isdnif.h b/include/linux/isdnif.h index 04e10f9f1..b9b5a684e 100644 --- a/include/linux/isdnif.h +++ b/include/linux/isdnif.h @@ -54,7 +54,6 @@ #ifdef __KERNEL__ -#include #include /***************************************************************************/ diff --git a/include/linux/jbd.h b/include/linux/jbd.h index 6a425e370..a04c154c5 100644 --- a/include/linux/jbd.h +++ b/include/linux/jbd.h @@ -72,6 +72,9 @@ extern int journal_enable_debug; #endif extern void * __jbd_kmalloc (const char *where, size_t size, gfp_t flags, int retry); +extern void * jbd_slab_alloc(size_t size, gfp_t flags); +extern void jbd_slab_free(void *ptr, size_t size); + #define jbd_kmalloc(size, flags) \ __jbd_kmalloc(__FUNCTION__, (size), (flags), journal_oom_retry) #define jbd_rep_kmalloc(size, flags) \ @@ -500,6 +503,12 @@ struct transaction_s */ struct journal_head *t_checkpoint_list; + /* + * Doubly-linked circular list of all buffers submitted for IO while + * checkpointing. [j_list_lock] + */ + struct journal_head *t_checkpoint_io_list; + /* * Doubly-linked circular list of temporary buffers currently undergoing * IO in the log [j_list_lock] @@ -849,7 +858,7 @@ extern void journal_commit_transaction(journal_t *); /* Checkpoint list management */ int __journal_clean_checkpoint_list(journal_t *journal); -void __journal_remove_checkpoint(struct journal_head *); +int __journal_remove_checkpoint(struct journal_head *); void __journal_insert_checkpoint(struct journal_head *, transaction_t *); /* Buffer IO */ diff --git a/include/linux/jffs2.h b/include/linux/jffs2.h index cf792bb3c..c9c760700 100644 --- a/include/linux/jffs2.h +++ b/include/linux/jffs2.h @@ -65,6 +65,18 @@ #define JFFS2_NODETYPE_SUMMARY (JFFS2_FEATURE_RWCOMPAT_DELETE | JFFS2_NODE_ACCURATE | 6) +#define JFFS2_NODETYPE_XATTR (JFFS2_FEATURE_INCOMPAT | JFFS2_NODE_ACCURATE | 8) +#define JFFS2_NODETYPE_XREF (JFFS2_FEATURE_INCOMPAT | JFFS2_NODE_ACCURATE | 9) + +/* XATTR Related */ +#define JFFS2_XPREFIX_USER 1 /* for "user." */ +#define JFFS2_XPREFIX_SECURITY 2 /* for "security." */ +#define JFFS2_XPREFIX_ACL_ACCESS 3 /* for "system.posix_acl_access" */ +#define JFFS2_XPREFIX_ACL_DEFAULT 4 /* for "system.posix_acl_default" */ +#define JFFS2_XPREFIX_TRUSTED 5 /* for "trusted.*" */ + +#define JFFS2_ACL_VERSION 0x0001 + // Maybe later... //#define JFFS2_NODETYPE_CHECKPOINT (JFFS2_FEATURE_RWCOMPAT_DELETE | JFFS2_NODE_ACCURATE | 3) //#define JFFS2_NODETYPE_OPTIONS (JFFS2_FEATURE_RWCOMPAT_COPY | JFFS2_NODE_ACCURATE | 4) @@ -82,11 +94,11 @@ typedef struct { uint32_t v32; -} __attribute__((packed)) jint32_t; +} __attribute__((packed)) jint32_t; typedef struct { uint32_t m; -} __attribute__((packed)) jmode_t; +} __attribute__((packed)) jmode_t; typedef struct { uint16_t v16; @@ -99,7 +111,7 @@ struct jffs2_unknown_node jint16_t nodetype; jint32_t totlen; /* So we can skip over nodes we don't grok */ jint32_t hdr_crc; -} __attribute__((packed)); +}; struct jffs2_raw_dirent { @@ -117,7 +129,7 @@ struct jffs2_raw_dirent jint32_t node_crc; jint32_t name_crc; uint8_t name[0]; -} __attribute__((packed)); +}; /* The JFFS2 raw inode structure: Used for storage on physical media. */ /* The uid, gid, atime, mtime and ctime members could be longer, but @@ -149,6 +161,33 @@ struct jffs2_raw_inode jint32_t data_crc; /* CRC for the (compressed) data. */ jint32_t node_crc; /* CRC for the raw inode (excluding data) */ uint8_t data[0]; +}; + +struct jffs2_raw_xattr { + jint16_t magic; + jint16_t nodetype; /* = JFFS2_NODETYPE_XATTR */ + jint32_t totlen; + jint32_t hdr_crc; + jint32_t xid; /* XATTR identifier number */ + jint32_t version; + uint8_t xprefix; + uint8_t name_len; + jint16_t value_len; + jint32_t data_crc; + jint32_t node_crc; + uint8_t data[0]; +} __attribute__((packed)); + +struct jffs2_raw_xref +{ + jint16_t magic; + jint16_t nodetype; /* = JFFS2_NODETYPE_XREF */ + jint32_t totlen; + jint32_t hdr_crc; + jint32_t ino; /* inode number */ + jint32_t xid; /* XATTR identifier number */ + jint32_t xseqno; /* xref sequencial number */ + jint32_t node_crc; } __attribute__((packed)); struct jffs2_raw_summary @@ -163,14 +202,22 @@ struct jffs2_raw_summary jint32_t sum_crc; /* summary information crc */ jint32_t node_crc; /* node crc */ jint32_t sum[0]; /* inode summary info */ -} __attribute__((packed)); +}; union jffs2_node_union { struct jffs2_raw_inode i; struct jffs2_raw_dirent d; + struct jffs2_raw_xattr x; + struct jffs2_raw_xref r; struct jffs2_raw_summary s; struct jffs2_unknown_node u; }; +/* Data payload for device nodes. */ +union jffs2_device_node { + jint16_t old; + jint32_t new; +}; + #endif /* __LINUX_JFFS2_H__ */ diff --git a/include/linux/jffs2_fs_i.h b/include/linux/jffs2_fs_i.h deleted file mode 100644 index ad565bf9d..000000000 --- a/include/linux/jffs2_fs_i.h +++ /dev/null @@ -1,50 +0,0 @@ -/* $Id: jffs2_fs_i.h,v 1.19 2005/11/07 11:14:52 gleixner Exp $ */ - -#ifndef _JFFS2_FS_I -#define _JFFS2_FS_I - -#include -#include -#include - -struct jffs2_inode_info { - /* We need an internal mutex similar to inode->i_mutex. - Unfortunately, we can't used the existing one, because - either the GC would deadlock, or we'd have to release it - before letting GC proceed. Or we'd have to put ugliness - into the GC code so it didn't attempt to obtain the i_mutex - for the inode(s) which are already locked */ - struct semaphore sem; - - /* The highest (datanode) version number used for this ino */ - uint32_t highest_version; - - /* List of data fragments which make up the file */ - struct rb_root fragtree; - - /* There may be one datanode which isn't referenced by any of the - above fragments, if it contains a metadata update but no actual - data - or if this is a directory inode */ - /* This also holds the _only_ dnode for symlinks/device nodes, - etc. */ - struct jffs2_full_dnode *metadata; - - /* Directory entries */ - struct jffs2_full_dirent *dents; - - /* The target path if this is the inode of a symlink */ - unsigned char *target; - - /* Some stuff we just have to keep in-core at all times, for each inode. */ - struct jffs2_inode_cache *inocache; - - uint16_t flags; - uint8_t usercompr; -#if !defined (__ECOS) -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,2) - struct inode vfs_inode; -#endif -#endif -}; - -#endif /* _JFFS2_FS_I */ diff --git a/include/linux/jffs2_fs_sb.h b/include/linux/jffs2_fs_sb.h deleted file mode 100644 index 4bcfb5570..000000000 --- a/include/linux/jffs2_fs_sb.h +++ /dev/null @@ -1,122 +0,0 @@ -/* $Id: jffs2_fs_sb.h,v 1.54 2005/09/21 13:37:34 dedekind Exp $ */ - -#ifndef _JFFS2_FS_SB -#define _JFFS2_FS_SB - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define JFFS2_SB_FLAG_RO 1 -#define JFFS2_SB_FLAG_SCANNING 2 /* Flash scanning is in progress */ -#define JFFS2_SB_FLAG_BUILDING 4 /* File system building is in progress */ - -struct jffs2_inodirty; - -/* A struct for the overall file system control. Pointers to - jffs2_sb_info structs are named `c' in the source code. - Nee jffs_control -*/ -struct jffs2_sb_info { - struct mtd_info *mtd; - - uint32_t highest_ino; - uint32_t checked_ino; - - unsigned int flags; - - struct task_struct *gc_task; /* GC task struct */ - struct completion gc_thread_start; /* GC thread start completion */ - struct completion gc_thread_exit; /* GC thread exit completion port */ - - struct semaphore alloc_sem; /* Used to protect all the following - fields, and also to protect against - out-of-order writing of nodes. And GC. */ - uint32_t cleanmarker_size; /* Size of an _inline_ CLEANMARKER - (i.e. zero for OOB CLEANMARKER */ - - uint32_t flash_size; - uint32_t used_size; - uint32_t dirty_size; - uint32_t wasted_size; - uint32_t free_size; - uint32_t erasing_size; - uint32_t bad_size; - uint32_t sector_size; - uint32_t unchecked_size; - - uint32_t nr_free_blocks; - uint32_t nr_erasing_blocks; - - /* Number of free blocks there must be before we... */ - uint8_t resv_blocks_write; /* ... allow a normal filesystem write */ - uint8_t resv_blocks_deletion; /* ... allow a normal filesystem deletion */ - uint8_t resv_blocks_gctrigger; /* ... wake up the GC thread */ - uint8_t resv_blocks_gcbad; /* ... pick a block from the bad_list to GC */ - uint8_t resv_blocks_gcmerge; /* ... merge pages when garbage collecting */ - - uint32_t nospc_dirty_size; - - uint32_t nr_blocks; - struct jffs2_eraseblock *blocks; /* The whole array of blocks. Used for getting blocks - * from the offset (blocks[ofs / sector_size]) */ - struct jffs2_eraseblock *nextblock; /* The block we're currently filling */ - - struct jffs2_eraseblock *gcblock; /* The block we're currently garbage-collecting */ - - struct list_head clean_list; /* Blocks 100% full of clean data */ - struct list_head very_dirty_list; /* Blocks with lots of dirty space */ - struct list_head dirty_list; /* Blocks with some dirty space */ - struct list_head erasable_list; /* Blocks which are completely dirty, and need erasing */ - struct list_head erasable_pending_wbuf_list; /* Blocks which need erasing but only after the current wbuf is flushed */ - struct list_head erasing_list; /* Blocks which are currently erasing */ - struct list_head erase_pending_list; /* Blocks which need erasing now */ - struct list_head erase_complete_list; /* Blocks which are erased and need the clean marker written to them */ - struct list_head free_list; /* Blocks which are free and ready to be used */ - struct list_head bad_list; /* Bad blocks. */ - struct list_head bad_used_list; /* Bad blocks with valid data in. */ - - spinlock_t erase_completion_lock; /* Protect free_list and erasing_list - against erase completion handler */ - wait_queue_head_t erase_wait; /* For waiting for erases to complete */ - - wait_queue_head_t inocache_wq; - struct jffs2_inode_cache **inocache_list; - spinlock_t inocache_lock; - - /* Sem to allow jffs2_garbage_collect_deletion_dirent to - drop the erase_completion_lock while it's holding a pointer - to an obsoleted node. I don't like this. Alternatives welcomed. */ - struct semaphore erase_free_sem; - - uint32_t wbuf_pagesize; /* 0 for NOR and other flashes with no wbuf */ - -#ifdef CONFIG_JFFS2_FS_WRITEBUFFER - /* Write-behind buffer for NAND flash */ - unsigned char *wbuf; - uint32_t wbuf_ofs; - uint32_t wbuf_len; - struct jffs2_inodirty *wbuf_inodes; - - struct rw_semaphore wbuf_sem; /* Protects the write buffer */ - - /* Information about out-of-band area usage... */ - struct nand_oobinfo *oobinfo; - uint32_t badblock_pos; - uint32_t fsdata_pos; - uint32_t fsdata_len; -#endif - - struct jffs2_summary *summary; /* Summary information */ - - /* OS-private pointer for getting back to master superblock info */ - void *os_priv; -}; - -#endif /* _JFFS2_FB_SB */ diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h index 043376920..329ebcffa 100644 --- a/include/linux/jiffies.h +++ b/include/linux/jiffies.h @@ -47,8 +47,8 @@ * - (NOM / DEN) fits in (32 - LSH) bits. * - (NOM % DEN) fits in (32 - LSH) bits. */ -#define SH_DIV(NOM,DEN,LSH) ( ((NOM / DEN) << LSH) \ - + (((NOM % DEN) << LSH) + DEN / 2) / DEN) +#define SH_DIV(NOM,DEN,LSH) ( (((NOM) / (DEN)) << (LSH)) \ + + ((((NOM) % (DEN)) << (LSH)) + (DEN) / 2) / (DEN)) /* HZ is the requested value. ACTHZ is actual HZ ("<< 8" is for accuracy) */ #define ACTHZ (SH_DIV (CLOCK_TICK_RATE, LATCH, 8)) diff --git a/include/linux/joystick.h b/include/linux/joystick.h index 5fd20ddd7..e2d3a18af 100644 --- a/include/linux/joystick.h +++ b/include/linux/joystick.h @@ -111,25 +111,25 @@ struct js_corr { #define JS_SET_ALL 8 struct JS_DATA_TYPE { - int32_t buttons; - int32_t x; - int32_t y; + __s32 buttons; + __s32 x; + __s32 y; }; struct JS_DATA_SAVE_TYPE_32 { - int32_t JS_TIMEOUT; - int32_t BUSY; - int32_t JS_EXPIRETIME; - int32_t JS_TIMELIMIT; + __s32 JS_TIMEOUT; + __s32 BUSY; + __s32 JS_EXPIRETIME; + __s32 JS_TIMELIMIT; struct JS_DATA_TYPE JS_SAVE; struct JS_DATA_TYPE JS_CORR; }; struct JS_DATA_SAVE_TYPE_64 { - int32_t JS_TIMEOUT; - int32_t BUSY; - int64_t JS_EXPIRETIME; - int64_t JS_TIMELIMIT; + __s32 JS_TIMEOUT; + __s32 BUSY; + __s64 JS_EXPIRETIME; + __s64 JS_TIMELIMIT; struct JS_DATA_TYPE JS_SAVE; struct JS_DATA_TYPE JS_CORR; }; diff --git a/include/linux/kallsyms.h b/include/linux/kallsyms.h index 9bbd04092..849043ce4 100644 --- a/include/linux/kallsyms.h +++ b/include/linux/kallsyms.h @@ -5,7 +5,6 @@ #ifndef _LINUX_KALLSYMS_H #define _LINUX_KALLSYMS_H -#include #define KSYM_NAME_LEN 127 @@ -58,10 +57,25 @@ do { \ #define print_fn_descriptor_symbol(fmt, addr) print_symbol(fmt, addr) #endif -#define print_symbol(fmt, addr) \ -do { \ - __check_printsym_format(fmt, ""); \ - __print_symbol(fmt, addr); \ +static inline void print_symbol(const char *fmt, unsigned long addr) +{ + __check_printsym_format(fmt, ""); + __print_symbol(fmt, (unsigned long) + __builtin_extract_return_addr((void *)addr)); +} + +#ifndef CONFIG_64BIT +#define print_ip_sym(ip) \ +do { \ + printk("[<%08lx>]", ip); \ + print_symbol(" %s\n", ip); \ } while(0) +#else +#define print_ip_sym(ip) \ +do { \ + printk("[<%016lx>]", ip); \ + print_symbol(" %s\n", ip); \ +} while(0) +#endif #endif /*_LINUX_KALLSYMS_H*/ diff --git a/include/linux/kbd_kern.h b/include/linux/kbd_kern.h index 4eb851ece..efe0ee4cc 100644 --- a/include/linux/kbd_kern.h +++ b/include/linux/kbd_kern.h @@ -155,10 +155,8 @@ static inline void con_schedule_flip(struct tty_struct *t) { unsigned long flags; spin_lock_irqsave(&t->buf.lock, flags); - if (t->buf.tail != NULL) { - t->buf.tail->active = 0; + if (t->buf.tail != NULL) t->buf.tail->commit = t->buf.tail->used; - } spin_unlock_irqrestore(&t->buf.lock, flags); schedule_work(&t->buf.work); } diff --git a/include/linux/kernel.h b/include/linux/kernel.h index f6dc34a85..b4562bfce 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -25,11 +25,16 @@ extern const char vx_linux_banner[]; #define LONG_MAX ((long)(~0UL>>1)) #define LONG_MIN (-LONG_MAX - 1) #define ULONG_MAX (~0UL) +#define LLONG_MAX ((long long)(~0ULL>>1)) +#define LLONG_MIN (-LLONG_MAX - 1) +#define ULLONG_MAX (~0ULL) #define STACK_MAGIC 0xdeadbeef #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) #define ALIGN(x,a) (((x)+(a)-1)&~((a)-1)) +#define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f)) +#define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) #define KERN_EMERG "<0>" /* system is unusable */ #define KERN_ALERT "<1>" /* action must be taken immediately */ @@ -76,7 +81,7 @@ extern int cond_resched(void); # define might_sleep() do { might_resched(); } while (0) #endif -#define might_sleep_if(cond) do { if (unlikely(cond)) might_sleep(); } while (0) +#define might_sleep_if(cond) do { if (cond) might_sleep(); } while (0) #define abs(x) ({ \ int __x = (x); \ @@ -115,6 +120,8 @@ extern int scnprintf(char * buf, size_t size, const char * fmt, ...) __attribute__ ((format (printf, 3, 4))); extern int vscnprintf(char *buf, size_t size, const char *fmt, va_list args) __attribute__ ((format (printf, 3, 0))); +extern char *kasprintf(gfp_t gfp, const char *fmt, ...) + __attribute__ ((format (printf, 2, 3))); extern int sscanf(const char *, const char *, ...) __attribute__ ((format (scanf, 2, 3))); @@ -204,6 +211,7 @@ extern enum system_states { extern void dump_stack(void); #ifdef DEBUG +/* If you are writing a driver, please use dev_dbg instead */ #define pr_debug(fmt,arg...) \ printk(KERN_DEBUG fmt,##arg) #else @@ -332,6 +340,12 @@ struct sysinfo { /* Force a compilation error if condition is true */ #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) +/* Force a compilation error if condition is true, but also produce a + result (of value 0 and type size_t), so the expression can be used + e.g. in a structure initializer (or where-ever else comma expressions + aren't permitted). */ +#define BUILD_BUG_ON_ZERO(e) (sizeof(char[1 - 2 * !!(e)]) - 1) + /* Trap pasters of __FUNCTION__ at compile-time */ #define __FUNCTION__ (__func__) diff --git a/include/linux/kernel_stat.h b/include/linux/kernel_stat.h index b46249082..43e895f1c 100644 --- a/include/linux/kernel_stat.h +++ b/include/linux/kernel_stat.h @@ -1,7 +1,6 @@ #ifndef _LINUX_KERNEL_STAT_H #define _LINUX_KERNEL_STAT_H -#include #include #include #include diff --git a/include/linux/kexec.h b/include/linux/kexec.h index cfb3410e3..6427949dd 100644 --- a/include/linux/kexec.h +++ b/include/linux/kexec.h @@ -106,6 +106,7 @@ extern struct page *kimage_alloc_control_pages(struct kimage *image, extern void crash_kexec(struct pt_regs *); int kexec_should_crash(struct task_struct *); extern struct kimage *kexec_image; +extern struct kimage *kexec_crash_image; #define KEXEC_ON_CRASH 0x00000001 #define KEXEC_ARCH_MASK 0xffff0000 diff --git a/include/linux/key.h b/include/linux/key.h index cbf464ad9..169f05e48 100644 --- a/include/linux/key.h +++ b/include/linux/key.h @@ -177,7 +177,8 @@ struct key { /* * kernel managed key type definition */ -typedef int (*request_key_actor_t)(struct key *key, struct key *authkey, const char *op); +typedef int (*request_key_actor_t)(struct key *key, struct key *authkey, + const char *op, void *aux); struct key_type { /* name of the type */ @@ -205,6 +206,11 @@ struct key_type { /* match a key against a description */ int (*match)(const struct key *key, const void *desc); + /* clear some of the data from a key on revokation (optional) + * - the key's semaphore will be write-locked by the caller + */ + void (*revoke)(struct key *key); + /* clear the data from a key (optional) */ void (*destroy)(struct key *key); @@ -241,8 +247,16 @@ extern void unregister_key_type(struct key_type *ktype); extern struct key *key_alloc(struct key_type *type, const char *desc, - uid_t uid, gid_t gid, key_perm_t perm, - int not_in_quota); + uid_t uid, gid_t gid, + struct task_struct *ctx, + key_perm_t perm, + unsigned long flags); + + +#define KEY_ALLOC_IN_QUOTA 0x0000 /* add to quota, reject if would overrun */ +#define KEY_ALLOC_QUOTA_OVERRUN 0x0001 /* add to quota, permit even if overrun */ +#define KEY_ALLOC_NOT_IN_QUOTA 0x0002 /* not in quota */ + extern int key_payload_reserve(struct key *key, size_t datalen); extern int key_instantiate_and_link(struct key *key, const void *data, @@ -272,6 +286,11 @@ extern struct key *request_key(struct key_type *type, const char *description, const char *callout_info); +extern struct key *request_key_with_auxdata(struct key_type *type, + const char *description, + const char *callout_info, + void *aux); + extern int key_validate(struct key *key); extern key_ref_t key_create_or_update(key_ref_t keyring, @@ -279,7 +298,7 @@ extern key_ref_t key_create_or_update(key_ref_t keyring, const char *description, const void *payload, size_t plen, - int not_in_quota); + unsigned long flags); extern int key_update(key_ref_t key, const void *payload, @@ -292,7 +311,9 @@ extern int key_unlink(struct key *keyring, struct key *key); extern struct key *keyring_alloc(const char *description, uid_t uid, gid_t gid, - int not_in_quota, struct key *dest); + struct task_struct *ctx, + unsigned long flags, + struct key *dest); extern int keyring_clear(struct key *keyring); @@ -313,7 +334,8 @@ extern void keyring_replace_payload(struct key *key, void *replacement); * the userspace interface */ extern struct key root_user_keyring, root_session_keyring; -extern int alloc_uid_keyring(struct user_struct *user); +extern int alloc_uid_keyring(struct user_struct *user, + struct task_struct *ctx); extern void switch_uid_keyring(struct user_struct *new_user); extern int copy_keys(unsigned long clone_flags, struct task_struct *tsk); extern int copy_thread_group_keys(struct task_struct *tsk); @@ -342,7 +364,7 @@ extern void key_init(void); #define make_key_ref(k) ({ NULL; }) #define key_ref_to_ptr(k) ({ NULL; }) #define is_key_possessed(k) 0 -#define alloc_uid_keyring(u) 0 +#define alloc_uid_keyring(u,c) 0 #define switch_uid_keyring(u) do { } while(0) #define __install_session_keyring(t, k) ({ NULL; }) #define copy_keys(f,t) 0 @@ -355,6 +377,10 @@ extern void key_init(void); #define key_fsgid_changed(t) do { } while(0) #define key_init() do { } while(0) +/* Initial keyrings */ +extern struct key root_user_keyring; +extern struct key root_session_keyring; + #endif /* CONFIG_KEYS */ #endif /* __KERNEL__ */ #endif /* _LINUX_KEY_H */ diff --git a/include/linux/kmod.h b/include/linux/kmod.h index 27501f4de..009c16122 100644 --- a/include/linux/kmod.h +++ b/include/linux/kmod.h @@ -20,7 +20,6 @@ */ #include -#include #include #include diff --git a/include/linux/kobject.h b/include/linux/kobject.h index c187c53ce..2d2293279 100644 --- a/include/linux/kobject.h +++ b/include/linux/kobject.h @@ -190,6 +190,8 @@ struct subsystem _varname##_subsys = { \ /* The global /sys/kernel/ subsystem for people to chain off of */ extern struct subsystem kernel_subsys; +/* The global /sys/hypervisor/ subsystem */ +extern struct subsystem hypervisor_subsys; /** * Helpers for setting the kset of registered objects. diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h index 778adc0fa..8bf6702da 100644 --- a/include/linux/kprobes.h +++ b/include/linux/kprobes.h @@ -29,7 +29,6 @@ * and Prasanna S Panchamukhi * added function-return probes. */ -#include #include #include #include diff --git a/include/linux/kthread.h b/include/linux/kthread.h index ebdd41fd1..1c65e7a9f 100644 --- a/include/linux/kthread.h +++ b/include/linux/kthread.h @@ -4,37 +4,19 @@ #include #include -/** - * kthread_create: create a kthread. - * @threadfn: the function to run until signal_pending(current). - * @data: data ptr for @threadfn. - * @namefmt: printf-style name for the thread. - * - * Description: This helper function creates and names a kernel - * thread. The thread will be stopped: use wake_up_process() to start - * it. See also kthread_run(), kthread_create_on_cpu(). - * - * When woken, the thread will run @threadfn() with @data as its - * argument. @threadfn can either call do_exit() directly if it is a - * standalone thread for which noone will call kthread_stop(), or - * return when 'kthread_should_stop()' is true (which means - * kthread_stop() has been called). The return value should be zero - * or a negative error number: it will be passed to kthread_stop(). - * - * Returns a task_struct or ERR_PTR(-ENOMEM). - */ struct task_struct *kthread_create(int (*threadfn)(void *data), void *data, const char namefmt[], ...); /** - * kthread_run: create and wake a thread. + * kthread_run - create and wake a thread. * @threadfn: the function to run until signal_pending(current). * @data: data ptr for @threadfn. * @namefmt: printf-style name for the thread. * * Description: Convenient wrapper for kthread_create() followed by - * wake_up_process(). Returns the kthread, or ERR_PTR(-ENOMEM). */ + * wake_up_process(). Returns the kthread or ERR_PTR(-ENOMEM). + */ #define kthread_run(threadfn, data, namefmt, ...) \ ({ \ struct task_struct *__k \ @@ -44,50 +26,8 @@ struct task_struct *kthread_create(int (*threadfn)(void *data), __k; \ }) -/** - * kthread_bind: bind a just-created kthread to a cpu. - * @k: thread created by kthread_create(). - * @cpu: cpu (might not be online, must be possible) for @k to run on. - * - * Description: This function is equivalent to set_cpus_allowed(), - * except that @cpu doesn't need to be online, and the thread must be - * stopped (ie. just returned from kthread_create(). - */ void kthread_bind(struct task_struct *k, unsigned int cpu); - -/** - * kthread_stop: stop a thread created by kthread_create(). - * @k: thread created by kthread_create(). - * - * Sets kthread_should_stop() for @k to return true, wakes it, and - * waits for it to exit. Your threadfn() must not call do_exit() - * itself if you use this function! This can also be called after - * kthread_create() instead of calling wake_up_process(): the thread - * will exit without calling threadfn(). - * - * Returns the result of threadfn(), or -EINTR if wake_up_process() - * was never called. */ int kthread_stop(struct task_struct *k); - -/** - * kthread_stop_sem: stop a thread created by kthread_create(). - * @k: thread created by kthread_create(). - * @s: semaphore that @k waits on while idle. - * - * Does essentially the same thing as kthread_stop() above, but wakes - * @k by calling up(@s). - * - * Returns the result of threadfn(), or -EINTR if wake_up_process() - * was never called. */ -int kthread_stop_sem(struct task_struct *k, struct semaphore *s); - -/** - * kthread_should_stop: should this kthread return now? - * - * When someone calls kthread_stop on your kthread, it will be woken - * and this will return true. You should then return, and your return - * value will be passed through to kthread_stop(). - */ int kthread_should_stop(void); #endif /* _LINUX_KTHREAD_H */ diff --git a/include/linux/ktime.h b/include/linux/ktime.h index 62bc57580..84eeecd60 100644 --- a/include/linux/ktime.h +++ b/include/linux/ktime.h @@ -56,7 +56,8 @@ typedef union { #endif } ktime_t; -#define KTIME_MAX (~((u64)1 << 63)) +#define KTIME_MAX ((s64)~((u64)1 << 63)) +#define KTIME_SEC_MAX (KTIME_MAX / NSEC_PER_SEC) /* * ktime_t definitions when using the 64-bit scalar representation: @@ -66,7 +67,6 @@ typedef union { /** * ktime_set - Set a ktime_t variable from a seconds/nanoseconds value - * * @secs: seconds to set * @nsecs: nanoseconds to set * @@ -74,6 +74,10 @@ typedef union { */ static inline ktime_t ktime_set(const long secs, const unsigned long nsecs) { +#if (BITS_PER_LONG == 64) + if (unlikely(secs >= KTIME_SEC_MAX)) + return (ktime_t){ .tv64 = KTIME_MAX }; +#endif return (ktime_t) { .tv64 = (s64)secs * NSEC_PER_SEC + (s64)nsecs }; } @@ -138,7 +142,6 @@ static inline ktime_t ktime_set(const long secs, const unsigned long nsecs) /** * ktime_sub - subtract two ktime_t variables - * * @lhs: minuend * @rhs: subtrahend * @@ -157,7 +160,6 @@ static inline ktime_t ktime_sub(const ktime_t lhs, const ktime_t rhs) /** * ktime_add - add two ktime_t variables - * * @add1: addend1 * @add2: addend2 * @@ -184,7 +186,6 @@ static inline ktime_t ktime_add(const ktime_t add1, const ktime_t add2) /** * ktime_add_ns - Add a scalar nanoseconds value to a ktime_t variable - * * @kt: addend * @nsec: the scalar nsec value to add * @@ -194,7 +195,6 @@ extern ktime_t ktime_add_ns(const ktime_t kt, u64 nsec); /** * timespec_to_ktime - convert a timespec to ktime_t format - * * @ts: the timespec variable to convert * * Returns a ktime_t variable with the converted timespec value @@ -207,7 +207,6 @@ static inline ktime_t timespec_to_ktime(const struct timespec ts) /** * timeval_to_ktime - convert a timeval to ktime_t format - * * @tv: the timeval variable to convert * * Returns a ktime_t variable with the converted timeval value @@ -220,7 +219,6 @@ static inline ktime_t timeval_to_ktime(const struct timeval tv) /** * ktime_to_timespec - convert a ktime_t variable to timespec format - * * @kt: the ktime_t variable to convert * * Returns the timespec representation of the ktime value @@ -233,7 +231,6 @@ static inline struct timespec ktime_to_timespec(const ktime_t kt) /** * ktime_to_timeval - convert a ktime_t variable to timeval format - * * @kt: the ktime_t variable to convert * * Returns the timeval representation of the ktime value diff --git a/include/linux/libata.h b/include/linux/libata.h index 630678514..e35df8c8a 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -30,9 +30,11 @@ #include #include #include +#include #include #include #include +#include /* * compile-time options: to be removed as soon as all the drivers are @@ -44,7 +46,6 @@ #undef ATA_NDEBUG /* define to disable quick runtime checks */ #undef ATA_ENABLE_PATA /* define to enable PATA support in some * low-level drivers */ -#undef ATAPI_ENABLE_DMADIR /* enables ATAPI DMADIR bridge support */ /* note: prints function name for you */ @@ -108,8 +109,11 @@ enum { LIBATA_MAX_PRD = ATA_MAX_PRD / 2, ATA_MAX_PORTS = 8, ATA_DEF_QUEUE = 1, - ATA_MAX_QUEUE = 1, + /* tag ATA_MAX_QUEUE - 1 is reserved for internal commands */ + ATA_MAX_QUEUE = 32, + ATA_TAG_INTERNAL = ATA_MAX_QUEUE - 1, ATA_MAX_SECTORS = 200, /* FIXME */ + ATA_MAX_SECTORS_LBA48 = 65535, ATA_MAX_BUS = 2, ATA_DEF_BUSY_WAIT = 10000, ATA_SHORT_PAUSE = (HZ >> 6) + 1, @@ -122,10 +126,16 @@ enum { /* struct ata_device stuff */ ATA_DFLAG_LBA = (1 << 0), /* device supports LBA */ ATA_DFLAG_LBA48 = (1 << 1), /* device supports LBA48 */ - + ATA_DFLAG_CDB_INTR = (1 << 2), /* device asserts INTRQ when ready for CDB */ + ATA_DFLAG_NCQ = (1 << 3), /* device supports NCQ */ ATA_DFLAG_CFG_MASK = (1 << 8) - 1, ATA_DFLAG_PIO = (1 << 8), /* device currently in PIO mode */ + ATA_DFLAG_SUSPENDED = (1 << 9), /* device suspended */ + ATA_DFLAG_INIT_MASK = (1 << 16) - 1, + + ATA_DFLAG_DETACH = (1 << 16), + ATA_DFLAG_DETACHED = (1 << 17), ATA_DEV_UNKNOWN = 0, /* unknown device */ ATA_DEV_ATA = 1, /* ATA device */ @@ -135,43 +145,63 @@ enum { ATA_DEV_NONE = 5, /* no device */ /* struct ata_port flags */ - ATA_FLAG_SLAVE_POSS = (1 << 1), /* host supports slave dev */ + ATA_FLAG_SLAVE_POSS = (1 << 0), /* host supports slave dev */ /* (doesn't imply presence) */ - ATA_FLAG_PORT_DISABLED = (1 << 2), /* port is disabled, ignore it */ - ATA_FLAG_SATA = (1 << 3), - ATA_FLAG_NO_LEGACY = (1 << 4), /* no legacy mode check */ - ATA_FLAG_SRST = (1 << 5), /* (obsolete) use ATA SRST, not E.D.D. */ - ATA_FLAG_MMIO = (1 << 6), /* use MMIO, not PIO */ - ATA_FLAG_SATA_RESET = (1 << 7), /* (obsolete) use COMRESET */ - ATA_FLAG_PIO_DMA = (1 << 8), /* PIO cmds via DMA */ - 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_FLAG_SUSPENDED = (1 << 12), /* port is suspended */ - - ATA_FLAG_PIO_LBA48 = (1 << 13), /* Host DMA engine is LBA28 only */ - ATA_FLAG_IRQ_MASK = (1 << 14), /* Mask IRQ in PIO xfers */ - - ATA_FLAG_FLUSH_PORT_TASK = (1 << 15), /* Flush port task */ - ATA_FLAG_IN_EH = (1 << 16), /* EH in progress */ - - ATA_QCFLAG_ACTIVE = (1 << 1), /* cmd not yet ack'd to scsi lyer */ - ATA_QCFLAG_SG = (1 << 3), /* have s/g table? */ - ATA_QCFLAG_SINGLE = (1 << 4), /* no s/g, just a single buffer */ + ATA_FLAG_SATA = (1 << 1), + ATA_FLAG_NO_LEGACY = (1 << 2), /* no legacy mode check */ + ATA_FLAG_MMIO = (1 << 3), /* use MMIO, not PIO */ + ATA_FLAG_SRST = (1 << 4), /* (obsolete) use ATA SRST, not E.D.D. */ + ATA_FLAG_SATA_RESET = (1 << 5), /* (obsolete) use COMRESET */ + ATA_FLAG_NO_ATAPI = (1 << 6), /* No ATAPI support */ + ATA_FLAG_PIO_DMA = (1 << 7), /* PIO cmds via DMA */ + ATA_FLAG_PIO_LBA48 = (1 << 8), /* Host DMA engine is LBA28 only */ + ATA_FLAG_PIO_POLLING = (1 << 9), /* use polling PIO if LLD + * doesn't handle PIO interrupts */ + ATA_FLAG_NCQ = (1 << 10), /* host supports NCQ */ + ATA_FLAG_HRST_TO_RESUME = (1 << 11), /* hardreset to resume phy */ + ATA_FLAG_SKIP_D2H_BSY = (1 << 12), /* can't wait for the first D2H + * Register FIS clearing BSY */ + ATA_FLAG_DEBUGMSG = (1 << 13), + + /* The following flag belongs to ap->pflags but is kept in + * ap->flags because it's referenced in many LLDs and will be + * removed in not-too-distant future. + */ + ATA_FLAG_DISABLED = (1 << 23), /* port is disabled, ignore it */ + + /* bits 24:31 of ap->flags are reserved for LLD specific flags */ + + /* struct ata_port pflags */ + ATA_PFLAG_EH_PENDING = (1 << 0), /* EH pending */ + ATA_PFLAG_EH_IN_PROGRESS = (1 << 1), /* EH in progress */ + ATA_PFLAG_FROZEN = (1 << 2), /* port is frozen */ + ATA_PFLAG_RECOVERED = (1 << 3), /* recovery action performed */ + ATA_PFLAG_LOADING = (1 << 4), /* boot/loading probe */ + ATA_PFLAG_UNLOADING = (1 << 5), /* module is unloading */ + ATA_PFLAG_SCSI_HOTPLUG = (1 << 6), /* SCSI hotplug scheduled */ + + ATA_PFLAG_FLUSH_PORT_TASK = (1 << 16), /* flush port task */ + ATA_PFLAG_SUSPENDED = (1 << 17), /* port is suspended (power) */ + ATA_PFLAG_PM_PENDING = (1 << 18), /* PM operation pending */ + + /* struct ata_queued_cmd flags */ + ATA_QCFLAG_ACTIVE = (1 << 0), /* cmd not yet ack'd to scsi lyer */ + ATA_QCFLAG_SG = (1 << 1), /* have s/g table? */ + ATA_QCFLAG_SINGLE = (1 << 2), /* no s/g, just a single buffer */ ATA_QCFLAG_DMAMAP = ATA_QCFLAG_SG | ATA_QCFLAG_SINGLE, - ATA_QCFLAG_EH_SCHEDULED = (1 << 5), /* EH scheduled */ + ATA_QCFLAG_IO = (1 << 3), /* standard IO command */ + ATA_QCFLAG_RESULT_TF = (1 << 4), /* result TF requested */ + + ATA_QCFLAG_FAILED = (1 << 16), /* cmd failed and is owned by EH */ + ATA_QCFLAG_SENSE_VALID = (1 << 17), /* sense data valid */ + ATA_QCFLAG_EH_SCHEDULED = (1 << 18), /* EH scheduled (obsolete) */ /* host set flags */ ATA_HOST_SIMPLEX = (1 << 0), /* Host is simplex, one DMA channel per host_set only */ /* various lengths of time */ - ATA_TMOUT_PIO = 30 * HZ, ATA_TMOUT_BOOT = 30 * HZ, /* heuristic */ ATA_TMOUT_BOOT_QUICK = 7 * HZ, /* heuristic */ - ATA_TMOUT_CDB = 30 * HZ, - ATA_TMOUT_CDB_QUICK = 5 * HZ, ATA_TMOUT_INTERNAL = 30 * HZ, ATA_TMOUT_INTERNAL_QUICK = 5 * HZ, @@ -210,21 +240,65 @@ enum { /* size of buffer to pad xfers ending on unaligned boundaries */ ATA_DMA_PAD_SZ = 4, ATA_DMA_PAD_BUF_SZ = ATA_DMA_PAD_SZ * ATA_MAX_QUEUE, - - /* Masks for port functions */ + + /* masks for port functions */ ATA_PORT_PRIMARY = (1 << 0), ATA_PORT_SECONDARY = (1 << 1), + + /* ering size */ + ATA_ERING_SIZE = 32, + + /* desc_len for ata_eh_info and context */ + ATA_EH_DESC_LEN = 80, + + /* reset / recovery action types */ + ATA_EH_REVALIDATE = (1 << 0), + ATA_EH_SOFTRESET = (1 << 1), + ATA_EH_HARDRESET = (1 << 2), + ATA_EH_SUSPEND = (1 << 3), + ATA_EH_RESUME = (1 << 4), + ATA_EH_PM_FREEZE = (1 << 5), + + ATA_EH_RESET_MASK = ATA_EH_SOFTRESET | ATA_EH_HARDRESET, + ATA_EH_PERDEV_MASK = ATA_EH_REVALIDATE | ATA_EH_SUSPEND | + ATA_EH_RESUME | ATA_EH_PM_FREEZE, + + /* ata_eh_info->flags */ + ATA_EHI_HOTPLUGGED = (1 << 0), /* could have been hotplugged */ + ATA_EHI_RESUME_LINK = (1 << 1), /* resume link (reset modifier) */ + ATA_EHI_NO_AUTOPSY = (1 << 2), /* no autopsy */ + ATA_EHI_QUIET = (1 << 3), /* be quiet */ + + ATA_EHI_DID_RESET = (1 << 16), /* already reset this port */ + + ATA_EHI_RESET_MODIFIER_MASK = ATA_EHI_RESUME_LINK, + + /* max repeat if error condition is still set after ->error_handler */ + ATA_EH_MAX_REPEAT = 5, + + /* how hard are we gonna try to probe/recover devices */ + ATA_PROBE_MAX_TRIES = 3, + ATA_EH_RESET_TRIES = 3, + ATA_EH_DEV_TRIES = 3, + + /* Drive spinup time (time from power-on to the first D2H FIS) + * in msecs - 8s currently. Failing to get ready in this time + * isn't critical. It will result in reset failure for + * controllers which can't wait for the first D2H FIS. libata + * will retry, so it just has to be long enough to spin up + * most devices. + */ + ATA_SPINUP_WAIT = 8000, }; enum hsm_task_states { - HSM_ST_UNKNOWN, - HSM_ST_IDLE, - HSM_ST_POLL, - HSM_ST_TMOUT, - HSM_ST, - HSM_ST_LAST, - HSM_ST_LAST_POLL, - HSM_ST_ERR, + HSM_ST_UNKNOWN, /* state unknown */ + HSM_ST_IDLE, /* no command on going */ + HSM_ST, /* (waiting the device to) transfer data */ + HSM_ST_LAST, /* (waiting the device to) complete command */ + HSM_ST_ERR, /* error */ + HSM_ST_FIRST, /* (waiting the device to) + write CDB or first data block */ }; enum ata_completion_errors { @@ -247,9 +321,9 @@ struct ata_queued_cmd; /* typedefs */ typedef void (*ata_qc_cb_t) (struct ata_queued_cmd *qc); -typedef void (*ata_probeinit_fn_t)(struct ata_port *); -typedef int (*ata_reset_fn_t)(struct ata_port *, int, unsigned int *); -typedef void (*ata_postreset_fn_t)(struct ata_port *ap, unsigned int *); +typedef int (*ata_prereset_fn_t)(struct ata_port *ap); +typedef int (*ata_reset_fn_t)(struct ata_port *ap, unsigned int *classes); +typedef void (*ata_postreset_fn_t)(struct ata_port *ap, unsigned int *classes); struct ata_ioports { unsigned long cmd_addr; @@ -301,7 +375,8 @@ struct ata_host_set { unsigned long flags; int simplex_claimed; /* Keep seperate in case we ever need to do this locked */ - struct ata_port * ports[0]; + struct ata_host_set *next; /* for legacy mode */ + struct ata_port *ports[0]; }; struct ata_queued_cmd { @@ -340,7 +415,7 @@ struct ata_queued_cmd { struct scatterlist *__sg; unsigned int err_mask; - + struct ata_taskfile result_tf; ata_qc_cb_t complete_fn; void *private_data; @@ -352,12 +427,26 @@ struct ata_host_stats { unsigned long rw_reqbuf; }; +struct ata_ering_entry { + int is_io; + unsigned int err_mask; + u64 timestamp; +}; + +struct ata_ering { + int cursor; + struct ata_ering_entry ring[ATA_ERING_SIZE]; +}; + struct ata_device { - u64 n_sectors; /* size of device, if ATA */ + struct ata_port *ap; + unsigned int devno; /* 0 or 1 */ unsigned long flags; /* ATA_DFLAG_xxx */ + struct scsi_device *sdev; /* attached SCSI device */ + /* n_sector is used as CLEAR_OFFSET, read comment above CLEAR_OFFSET */ + u64 n_sectors; /* size of device, if ATA */ unsigned int class; /* ATA_DEV_xxx */ - unsigned int devno; /* 0 or 1 */ - u16 *id; /* IDENTIFY xxx DEVICE data */ + u16 id[ATA_ID_WORDS]; /* IDENTIFY xxx DEVICE data */ u8 pio_mode; u8 dma_mode; u8 xfer_mode; @@ -377,12 +466,44 @@ struct ata_device { u16 cylinders; /* Number of cylinders */ u16 heads; /* Number of heads */ u16 sectors; /* Number of sectors per track */ + + /* error history */ + struct ata_ering ering; +}; + +/* Offset into struct ata_device. Fields above it are maintained + * acress device init. Fields below are zeroed. + */ +#define ATA_DEVICE_CLEAR_OFFSET offsetof(struct ata_device, n_sectors) + +struct ata_eh_info { + struct ata_device *dev; /* offending device */ + u32 serror; /* SError from LLDD */ + unsigned int err_mask; /* port-wide err_mask */ + unsigned int action; /* ATA_EH_* action mask */ + unsigned int dev_action[ATA_MAX_DEVICES]; /* dev EH action */ + unsigned int flags; /* ATA_EHI_* flags */ + + unsigned long hotplug_timestamp; + unsigned int probe_mask; + + char desc[ATA_EH_DESC_LEN]; + int desc_len; +}; + +struct ata_eh_context { + struct ata_eh_info i; + int tries[ATA_MAX_DEVICES]; + unsigned int classes[ATA_MAX_DEVICES]; + unsigned int did_probe_mask; }; struct ata_port { struct Scsi_Host *host; /* our co-allocated scsi host */ const struct ata_port_operations *ops; + spinlock_t *lock; unsigned long flags; /* ATA_FLAG_xxx */ + unsigned int pflags; /* ATA_PFLAG_xxx */ unsigned int id; /* unique id req'd by scsi midlyr */ unsigned int port_no; /* unique port #; from zero */ unsigned int hard_port_no; /* hardware port #; from zero */ @@ -401,26 +522,43 @@ struct ata_port { unsigned int mwdma_mask; unsigned int udma_mask; unsigned int cbl; /* cable type; ATA_CBL_xxx */ + unsigned int hw_sata_spd_limit; + unsigned int sata_spd_limit; /* SATA PHY speed limit */ + + /* record runtime error info, protected by host_set lock */ + struct ata_eh_info eh_info; + /* EH context owned by EH */ + struct ata_eh_context eh_context; struct ata_device device[ATA_MAX_DEVICES]; struct ata_queued_cmd qcmd[ATA_MAX_QUEUE]; - unsigned long qactive; + unsigned long qc_allocated; + unsigned int qc_active; + unsigned int active_tag; + u32 sactive; struct ata_host_stats stats; struct ata_host_set *host_set; struct device *dev; struct work_struct port_task; + struct work_struct hotplug_task; + struct work_struct scsi_rescan_task; unsigned int hsm_task_state; - unsigned long pio_task_timeout; u32 msg_enable; struct list_head eh_done_q; + wait_queue_head_t eh_wait_q; + + pm_message_t pm_mesg; + int *pm_result; void *private_data; + + u8 sector_buf[ATA_SECT_SIZE]; /* owned by EH */ }; struct ata_port_operations { @@ -442,7 +580,6 @@ struct ata_port_operations { void (*phy_reset) (struct ata_port *ap); /* obsolete */ void (*set_mode) (struct ata_port *ap); - int (*probe_reset) (struct ata_port *ap, unsigned int *classes); void (*post_set_mode) (struct ata_port *ap); @@ -451,10 +588,20 @@ struct ata_port_operations { void (*bmdma_setup) (struct ata_queued_cmd *qc); void (*bmdma_start) (struct ata_queued_cmd *qc); + void (*data_xfer) (struct ata_device *, unsigned char *, unsigned int, int); + void (*qc_prep) (struct ata_queued_cmd *qc); unsigned int (*qc_issue) (struct ata_queued_cmd *qc); - void (*eng_timeout) (struct ata_port *ap); + /* Error handlers. ->error_handler overrides ->eng_timeout and + * indicates that new-style EH is in place. + */ + void (*eng_timeout) (struct ata_port *ap); /* obsolete */ + + void (*freeze) (struct ata_port *ap); + void (*thaw) (struct ata_port *ap); + void (*error_handler) (struct ata_port *ap); + void (*post_internal_cmd) (struct ata_queued_cmd *qc); irqreturn_t (*irq_handler)(int, void *, struct pt_regs *); void (*irq_clear) (struct ata_port *); @@ -463,6 +610,9 @@ struct ata_port_operations { void (*scr_write) (struct ata_port *ap, unsigned int sc_reg, u32 val); + int (*port_suspend) (struct ata_port *ap, pm_message_t mesg); + int (*port_resume) (struct ata_port *ap); + int (*port_start) (struct ata_port *ap); void (*port_stop) (struct ata_port *ap); @@ -496,51 +646,71 @@ struct ata_timing { #define FIT(v,vmin,vmax) max_t(short,min_t(short,v,vmax),vmin) +extern const unsigned long sata_deb_timing_normal[]; +extern const unsigned long sata_deb_timing_hotplug[]; +extern const unsigned long sata_deb_timing_long[]; + +static inline const unsigned long * +sata_ehc_deb_timing(struct ata_eh_context *ehc) +{ + if (ehc->i.flags & ATA_EHI_HOTPLUGGED) + return sata_deb_timing_hotplug; + else + return sata_deb_timing_normal; +} + extern void ata_port_probe(struct ata_port *); extern void __sata_phy_reset(struct ata_port *ap); extern void sata_phy_reset(struct ata_port *ap); extern void ata_bus_reset(struct ata_port *ap); -extern int ata_drive_probe_reset(struct ata_port *ap, - ata_probeinit_fn_t probeinit, - ata_reset_fn_t softreset, ata_reset_fn_t hardreset, - ata_postreset_fn_t postreset, unsigned int *classes); -extern void ata_std_probeinit(struct ata_port *ap); -extern int ata_std_softreset(struct ata_port *ap, int verbose, - unsigned int *classes); -extern int sata_std_hardreset(struct ata_port *ap, int verbose, - unsigned int *class); +extern int sata_set_spd(struct ata_port *ap); +extern int sata_phy_debounce(struct ata_port *ap, const unsigned long *param); +extern int sata_phy_resume(struct ata_port *ap, const unsigned long *param); +extern int ata_std_prereset(struct ata_port *ap); +extern int ata_std_softreset(struct ata_port *ap, unsigned int *classes); +extern int sata_std_hardreset(struct ata_port *ap, unsigned int *class); extern void ata_std_postreset(struct ata_port *ap, unsigned int *classes); -extern int ata_dev_revalidate(struct ata_port *ap, struct ata_device *dev, - int post_reset); +extern int ata_dev_revalidate(struct ata_device *dev, int post_reset); extern void ata_port_disable(struct ata_port *); extern void ata_std_ports(struct ata_ioports *ioaddr); #ifdef CONFIG_PCI extern int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info, unsigned int n_ports); extern void ata_pci_remove_one (struct pci_dev *pdev); +extern void ata_pci_device_do_suspend(struct pci_dev *pdev, pm_message_t state); +extern void ata_pci_device_do_resume(struct pci_dev *pdev); extern int ata_pci_device_suspend(struct pci_dev *pdev, pm_message_t state); extern int ata_pci_device_resume(struct pci_dev *pdev); extern int ata_pci_clear_simplex(struct pci_dev *pdev); #endif /* CONFIG_PCI */ extern int ata_device_add(const struct ata_probe_ent *ent); +extern void ata_port_detach(struct ata_port *ap); extern void ata_host_set_remove(struct ata_host_set *host_set); extern int ata_scsi_detect(struct scsi_host_template *sht); extern int ata_scsi_ioctl(struct scsi_device *dev, int cmd, void __user *arg); extern int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)); -extern void ata_eh_qc_complete(struct ata_queued_cmd *qc); -extern void ata_eh_qc_retry(struct ata_queued_cmd *qc); extern int ata_scsi_release(struct Scsi_Host *host); extern unsigned int ata_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc); +extern int sata_scr_valid(struct ata_port *ap); +extern int sata_scr_read(struct ata_port *ap, int reg, u32 *val); +extern int sata_scr_write(struct ata_port *ap, int reg, u32 val); +extern int sata_scr_write_flush(struct ata_port *ap, int reg, u32 val); +extern int ata_port_online(struct ata_port *ap); +extern int ata_port_offline(struct ata_port *ap); extern int ata_scsi_device_resume(struct scsi_device *); extern int ata_scsi_device_suspend(struct scsi_device *, pm_message_t state); -extern int ata_device_resume(struct ata_port *, struct ata_device *); -extern int ata_device_suspend(struct ata_port *, struct ata_device *, pm_message_t state); +extern int ata_host_set_suspend(struct ata_host_set *host_set, + pm_message_t mesg); +extern void ata_host_set_resume(struct ata_host_set *host_set); extern int ata_ratelimit(void); extern unsigned int ata_busy_sleep(struct ata_port *ap, unsigned long timeout_pat, unsigned long timeout); extern void ata_port_queue_task(struct ata_port *ap, void (*fn)(void *), void *data, unsigned long delay); +extern u32 ata_wait_register(void __iomem *reg, u32 mask, u32 val, + unsigned long interval_msec, + unsigned long timeout_msec); /* * Default driver ops implementations @@ -554,11 +724,16 @@ extern void ata_std_dev_select (struct ata_port *ap, unsigned int device); extern u8 ata_check_status(struct ata_port *ap); extern u8 ata_altstatus(struct ata_port *ap); extern void ata_exec_command(struct ata_port *ap, const struct ata_taskfile *tf); -extern int ata_std_probe_reset(struct ata_port *ap, unsigned int *classes); extern int ata_port_start (struct ata_port *ap); extern void ata_port_stop (struct ata_port *ap); extern void ata_host_stop (struct ata_host_set *host_set); extern irqreturn_t ata_interrupt (int irq, void *dev_instance, struct pt_regs *regs); +extern void ata_mmio_data_xfer(struct ata_device *adev, unsigned char *buf, + unsigned int buflen, int write_data); +extern void ata_pio_data_xfer(struct ata_device *adev, unsigned char *buf, + unsigned int buflen, int write_data); +extern void ata_pio_data_xfer_noirq(struct ata_device *adev, unsigned char *buf, + unsigned int buflen, int write_data); extern void ata_qc_prep(struct ata_queued_cmd *qc); extern void ata_noop_qc_prep(struct ata_queued_cmd *qc); extern unsigned int ata_qc_issue_prot(struct ata_queued_cmd *qc); @@ -576,17 +751,29 @@ 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); -extern void ata_eng_timeout(struct ata_port *ap); -extern void ata_scsi_simulate(struct ata_port *ap, struct ata_device *dev, - struct scsi_cmnd *cmd, +extern void ata_bmdma_freeze(struct ata_port *ap); +extern void ata_bmdma_thaw(struct ata_port *ap); +extern void ata_bmdma_drive_eh(struct ata_port *ap, ata_prereset_fn_t prereset, + ata_reset_fn_t softreset, + ata_reset_fn_t hardreset, + ata_postreset_fn_t postreset); +extern void ata_bmdma_error_handler(struct ata_port *ap); +extern void ata_bmdma_post_internal_cmd(struct ata_queued_cmd *qc); +extern int ata_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc, + u8 status, int in_wq); +extern void ata_qc_complete(struct ata_queued_cmd *qc); +extern int ata_qc_complete_multiple(struct ata_port *ap, u32 qc_active, + void (*finish_qc)(struct ata_queued_cmd *)); +extern void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)); extern int ata_std_bios_param(struct scsi_device *sdev, struct block_device *bdev, sector_t capacity, int geom[]); extern int ata_scsi_slave_config(struct scsi_device *sdev); -extern struct ata_device *ata_dev_pair(struct ata_port *ap, - struct ata_device *adev); +extern void ata_scsi_slave_destroy(struct scsi_device *sdev); +extern int ata_scsi_change_queue_depth(struct scsi_device *sdev, + int queue_depth); +extern struct ata_device *ata_dev_pair(struct ata_device *adev); /* * Timing helpers @@ -632,7 +819,69 @@ extern int pci_test_config_bits(struct pci_dev *pdev, const struct pci_bits *bit extern unsigned long ata_pci_default_filter(const struct ata_port *, struct ata_device *, unsigned long); #endif /* CONFIG_PCI */ +/* + * EH + */ +extern void ata_eng_timeout(struct ata_port *ap); + +extern void ata_port_schedule_eh(struct ata_port *ap); +extern int ata_port_abort(struct ata_port *ap); +extern int ata_port_freeze(struct ata_port *ap); + +extern void ata_eh_freeze_port(struct ata_port *ap); +extern void ata_eh_thaw_port(struct ata_port *ap); + +extern void ata_eh_qc_complete(struct ata_queued_cmd *qc); +extern void ata_eh_qc_retry(struct ata_queued_cmd *qc); + +extern void ata_do_eh(struct ata_port *ap, ata_prereset_fn_t prereset, + ata_reset_fn_t softreset, ata_reset_fn_t hardreset, + ata_postreset_fn_t postreset); + +/* + * printk helpers + */ +#define ata_port_printk(ap, lv, fmt, args...) \ + printk(lv"ata%u: "fmt, (ap)->id , ##args) + +#define ata_dev_printk(dev, lv, fmt, args...) \ + printk(lv"ata%u.%02u: "fmt, (dev)->ap->id, (dev)->devno , ##args) + +/* + * ata_eh_info helpers + */ +#define ata_ehi_push_desc(ehi, fmt, args...) do { \ + (ehi)->desc_len += scnprintf((ehi)->desc + (ehi)->desc_len, \ + ATA_EH_DESC_LEN - (ehi)->desc_len, \ + fmt , ##args); \ +} while (0) + +#define ata_ehi_clear_desc(ehi) do { \ + (ehi)->desc[0] = '\0'; \ + (ehi)->desc_len = 0; \ +} while (0) + +static inline void __ata_ehi_hotplugged(struct ata_eh_info *ehi) +{ + if (ehi->flags & ATA_EHI_HOTPLUGGED) + return; + + ehi->flags |= ATA_EHI_HOTPLUGGED | ATA_EHI_RESUME_LINK; + ehi->hotplug_timestamp = jiffies; + + ehi->action |= ATA_EH_SOFTRESET; + ehi->probe_mask |= (1 << ATA_MAX_DEVICES) - 1; +} + +static inline void ata_ehi_hotplugged(struct ata_eh_info *ehi) +{ + __ata_ehi_hotplugged(ehi); + ehi->err_mask |= AC_ERR_ATA_BUS; +} +/* + * qc helpers + */ static inline int ata_sg_is_last(struct scatterlist *sg, struct ata_queued_cmd *qc) { @@ -675,16 +924,60 @@ static inline unsigned int ata_tag_valid(unsigned int tag) return (tag < ATA_MAX_QUEUE) ? 1 : 0; } -static inline unsigned int ata_class_present(unsigned int class) +static inline unsigned int ata_tag_internal(unsigned int tag) +{ + return tag == ATA_MAX_QUEUE - 1; +} + +/* + * device helpers + */ +static inline unsigned int ata_class_enabled(unsigned int class) { return class == ATA_DEV_ATA || class == ATA_DEV_ATAPI; } -static inline unsigned int ata_dev_present(const struct ata_device *dev) +static inline unsigned int ata_class_disabled(unsigned int class) +{ + return class == ATA_DEV_ATA_UNSUP || class == ATA_DEV_ATAPI_UNSUP; +} + +static inline unsigned int ata_class_absent(unsigned int class) +{ + return !ata_class_enabled(class) && !ata_class_disabled(class); +} + +static inline unsigned int ata_dev_enabled(const struct ata_device *dev) +{ + return ata_class_enabled(dev->class); +} + +static inline unsigned int ata_dev_disabled(const struct ata_device *dev) +{ + return ata_class_disabled(dev->class); +} + +static inline unsigned int ata_dev_absent(const struct ata_device *dev) +{ + return ata_class_absent(dev->class); +} + +static inline unsigned int ata_dev_ready(const struct ata_device *dev) +{ + return ata_dev_enabled(dev) && !(dev->flags & ATA_DFLAG_SUSPENDED); +} + +/* + * port helpers + */ +static inline int ata_port_max_devices(const struct ata_port *ap) { - return ata_class_present(dev->class); + if (ap->flags & ATA_FLAG_SLAVE_POSS) + return 2; + return 1; } + static inline u8 ata_chk_status(struct ata_port *ap) { return ap->ops->check_status(ap); @@ -763,20 +1056,35 @@ static inline void ata_qc_set_polling(struct ata_queued_cmd *qc) qc->tf.ctl |= ATA_NIEN; } -static inline struct ata_queued_cmd *ata_qc_from_tag (struct ata_port *ap, - unsigned int tag) +static inline struct ata_queued_cmd *__ata_qc_from_tag(struct ata_port *ap, + unsigned int tag) { if (likely(ata_tag_valid(tag))) return &ap->qcmd[tag]; return NULL; } -static inline void ata_tf_init(struct ata_port *ap, struct ata_taskfile *tf, unsigned int device) +static inline struct ata_queued_cmd *ata_qc_from_tag(struct ata_port *ap, + unsigned int tag) +{ + struct ata_queued_cmd *qc = __ata_qc_from_tag(ap, tag); + + if (unlikely(!qc) || !ap->ops->error_handler) + return qc; + + if ((qc->flags & (ATA_QCFLAG_ACTIVE | + ATA_QCFLAG_FAILED)) == ATA_QCFLAG_ACTIVE) + return qc; + + return NULL; +} + +static inline void ata_tf_init(struct ata_device *dev, struct ata_taskfile *tf) { memset(tf, 0, sizeof(*tf)); - tf->ctl = ap->ctl; - if (device == 0) + tf->ctl = dev->ap->ctl; + if (dev->devno == 0) tf->device = ATA_DEVICE_OBS; else tf->device = ATA_DEVICE_OBS | ATA_DEV1; @@ -791,26 +1099,11 @@ static inline void ata_qc_reinit(struct ata_queued_cmd *qc) qc->nbytes = qc->curbytes = 0; qc->err_mask = 0; - ata_tf_init(qc->ap, &qc->tf, qc->dev->devno); -} - -/** - * ata_qc_complete - Complete an active ATA command - * @qc: Command to complete - * @err_mask: ATA Status register contents - * - * Indicate to the mid and upper layers that an ATA - * command has completed, with either an ok or not-ok status. - * - * LOCKING: - * spin_lock_irqsave(host_set lock) - */ -static inline void ata_qc_complete(struct ata_queued_cmd *qc) -{ - if (unlikely(qc->flags & ATA_QCFLAG_EH_SCHEDULED)) - return; + ata_tf_init(qc->dev, &qc->tf); - __ata_qc_complete(qc); + /* init result_tf such that it indicates normal completion */ + qc->result_tf.command = ATA_DRDY; + qc->result_tf.feature = 0; } /** @@ -889,28 +1182,6 @@ static inline u8 ata_irq_ack(struct ata_port *ap, unsigned int chk_drq) return status; } -static inline u32 scr_read(struct ata_port *ap, unsigned int reg) -{ - return ap->ops->scr_read(ap, reg); -} - -static inline void scr_write(struct ata_port *ap, unsigned int reg, u32 val) -{ - ap->ops->scr_write(ap, reg, val); -} - -static inline void scr_write_flush(struct ata_port *ap, unsigned int reg, - u32 val) -{ - ap->ops->scr_write(ap, reg, val); - (void) ap->ops->scr_read(ap, reg); -} - -static inline unsigned int sata_dev_present(struct ata_port *ap) -{ - return ((scr_read(ap, SCR_STATUS) & 0xf) == 0x3) ? 1 : 0; -} - static inline int ata_try_flush_cache(const struct ata_device *dev) { return ata_id_wcache_enabled(dev->id) || @@ -920,7 +1191,7 @@ static inline int ata_try_flush_cache(const struct ata_device *dev) static inline unsigned int ac_err_mask(u8 status) { - if (status & ATA_BUSY) + if (status & (ATA_BUSY | ATA_DRQ)) return AC_ERR_HSM; if (status & (ATA_ERR | ATA_DF)) return AC_ERR_DEV; @@ -948,4 +1219,9 @@ static inline void ata_pad_free(struct ata_port *ap, struct device *dev) dma_free_coherent(dev, ATA_DMA_PAD_BUF_SZ, ap->pad, ap->pad_dma); } +static inline struct ata_port *ata_shost_to_port(struct Scsi_Host *host) +{ + return (struct ata_port *) &host->hostdata[0]; +} + #endif /* __LINUX_LIBATA_H__ */ diff --git a/include/linux/linkage.h b/include/linux/linkage.h index c08c9983e..932021f87 100644 --- a/include/linux/linkage.h +++ b/include/linux/linkage.h @@ -1,7 +1,6 @@ #ifndef _LINUX_LINKAGE_H #define _LINUX_LINKAGE_H -#include #include #ifdef __cplusplus diff --git a/include/linux/list.h b/include/linux/list.h index e43989c12..a9c90287c 100644 --- a/include/linux/list.h +++ b/include/linux/list.h @@ -4,18 +4,9 @@ #ifdef __KERNEL__ #include +#include #include -#include #include -#include - -/* - * These are non-NULL pointers that will result in page faults - * under normal circumstances, used to verify that nobody uses - * non-initialized list entries. - */ -#define LIST_POISON1 ((void *) 0x00100100) -#define LIST_POISON2 ((void *) 0x00200200) /* * Simple doubly linked list implementation. @@ -48,25 +39,21 @@ static inline void INIT_LIST_HEAD(struct list_head *list) * This is only for internal list manipulation where we know * the prev/next entries already! */ +#ifndef CONFIG_DEBUG_LIST static inline void __list_add(struct list_head *new, struct list_head *prev, struct list_head *next) { - if (next->prev != prev) { - printk("List corruption. next->prev should be %p, but was %p\n", - prev, next->prev); - BUG(); - } - if (prev->next != next) { - printk("List corruption. prev->next should be %p, but was %p\n", - next, prev->next); - BUG(); - } next->prev = new; new->next = next; new->prev = prev; prev->next = new; } +#else +extern void __list_add(struct list_head *new, + struct list_head *prev, + struct list_head *next); +#endif /** * list_add - add a new entry @@ -76,10 +63,15 @@ static inline void __list_add(struct list_head *new, * Insert a new entry after the specified head. * This is good for implementing stacks. */ +#ifndef CONFIG_DEBUG_LIST static inline void list_add(struct list_head *new, struct list_head *head) { __list_add(new, head, head->next); } +#else +extern void list_add(struct list_head *new, struct list_head *head); +#endif + /** * list_add_tail - add a new entry @@ -172,22 +164,16 @@ static inline void __list_del(struct list_head * prev, struct list_head * next) * Note: list_empty on entry does not return true after this, the entry is * in an undefined state. */ +#ifndef CONFIG_DEBUG_LIST static inline void list_del(struct list_head *entry) { - if (entry->prev->next != entry) { - printk("List corruption. prev->next should be %p, but was %p\n", - entry, entry->prev->next); - BUG(); - } - if (entry->next->prev != entry) { - printk("List corruption. next->prev should be %p, but was %p\n", - entry, entry->next->prev); - BUG(); - } __list_del(entry->prev, entry->next); entry->next = LIST_POISON1; entry->prev = LIST_POISON2; } +#else +extern void list_del(struct list_head *entry); +#endif /** * list_del_rcu - deletes entry from list without re-initialization @@ -219,12 +205,35 @@ static inline void list_del_rcu(struct list_head *entry) entry->prev = LIST_POISON2; } +/** + * list_replace - replace old entry by new one + * @old : the element to be replaced + * @new : the new element to insert + * Note: if 'old' was empty, it will be overwritten. + */ +static inline void list_replace(struct list_head *old, + struct list_head *new) +{ + new->next = old->next; + new->next->prev = new; + new->prev = old->prev; + new->prev->next = new; +} + +static inline void list_replace_init(struct list_head *old, + struct list_head *new) +{ + list_replace(old, new); + INIT_LIST_HEAD(old); +} + /* * list_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. + * Note: 'old' should not be empty. */ static inline void list_replace_rcu(struct list_head *old, struct list_head *new) @@ -270,6 +279,17 @@ static inline void list_move_tail(struct list_head *list, list_add_tail(list, head); } +/** + * list_is_last - tests whether @list is the last entry in list @head + * @list: the entry to test + * @head: the head of the list + */ +static inline int list_is_last(const struct list_head *list, + const struct list_head *head) +{ + return list->next == head; +} + /** * list_empty - tests whether a list is empty * @head: the list to test. @@ -280,16 +300,17 @@ static inline int list_empty(const struct list_head *head) } /** - * list_empty_careful - tests whether a list is - * empty _and_ checks that no other CPU might be - * in the process of still modifying either member + * list_empty_careful - tests whether a list is empty and not being modified + * @head: the list to test + * + * Description: + * tests whether a list is empty _and_ checks that no other CPU might be + * in the process of modifying either member (next or prev) * * NOTE: using list_empty_careful() without synchronization * can only be safe if the only activity that can happen * to the list entry is list_del_init(). Eg. it cannot be used * if another CPU could re-list_add() it. - * - * @head: the list to test. */ static inline int list_empty_careful(const struct list_head *head) { @@ -349,7 +370,7 @@ static inline void list_splice_init(struct list_head *list, /** * list_for_each - iterate over a list - * @pos: the &struct list_head to use as a loop counter. + * @pos: the &struct list_head to use as a loop cursor. * @head: the head for your list. */ #define list_for_each(pos, head) \ @@ -358,7 +379,7 @@ static inline void list_splice_init(struct list_head *list, /** * __list_for_each - iterate over a list - * @pos: the &struct list_head to use as a loop counter. + * @pos: the &struct list_head to use as a loop cursor. * @head: the head for your list. * * This variant differs from list_for_each() in that it's the @@ -371,7 +392,7 @@ static inline void list_splice_init(struct list_head *list, /** * list_for_each_prev - iterate over a list backwards - * @pos: the &struct list_head to use as a loop counter. + * @pos: the &struct list_head to use as a loop cursor. * @head: the head for your list. */ #define list_for_each_prev(pos, head) \ @@ -379,8 +400,8 @@ static inline void list_splice_init(struct list_head *list, pos = pos->prev) /** - * list_for_each_safe - iterate over a list safe against removal of list entry - * @pos: the &struct list_head to use as a loop counter. + * list_for_each_safe - iterate over a list safe against removal of list entry + * @pos: the &struct list_head to use as a loop cursor. * @n: another &struct list_head to use as temporary storage * @head: the head for your list. */ @@ -390,7 +411,7 @@ static inline void list_splice_init(struct list_head *list, /** * list_for_each_entry - iterate over list of given type - * @pos: the type * to use as a loop counter. + * @pos: the type * to use as a loop cursor. * @head: the head for your list. * @member: the name of the list_struct within the struct. */ @@ -401,7 +422,7 @@ static inline void list_splice_init(struct list_head *list, /** * list_for_each_entry_reverse - iterate backwards over list of given type. - * @pos: the type * to use as a loop counter. + * @pos: the type * to use as a loop cursor. * @head: the head for your list. * @member: the name of the list_struct within the struct. */ @@ -411,21 +432,24 @@ static inline void list_splice_init(struct list_head *list, pos = list_entry(pos->member.prev, typeof(*pos), member)) /** - * list_prepare_entry - prepare a pos entry for use as a start point in - * list_for_each_entry_continue + * list_prepare_entry - prepare a pos entry for use in list_for_each_entry_continue * @pos: the type * to use as a start point * @head: the head of the list * @member: the name of the list_struct within the struct. + * + * Prepares a pos entry for use as a start point in list_for_each_entry_continue. */ #define list_prepare_entry(pos, head, member) \ ((pos) ? : list_entry(head, typeof(*pos), member)) /** - * list_for_each_entry_continue - iterate over list of given type - * continuing after existing point - * @pos: the type * to use as a loop counter. + * list_for_each_entry_continue - continue iteration over list of given type + * @pos: the type * to use as a loop cursor. * @head: the head for your list. * @member: the name of the list_struct within the struct. + * + * Continue to iterate over list of given type, continuing after + * the current position. */ #define list_for_each_entry_continue(pos, head, member) \ for (pos = list_entry(pos->member.next, typeof(*pos), member); \ @@ -433,11 +457,12 @@ static inline void list_splice_init(struct list_head *list, pos = list_entry(pos->member.next, typeof(*pos), member)) /** - * list_for_each_entry_from - iterate over list of given type - * continuing from existing point - * @pos: the type * to use as a loop counter. + * list_for_each_entry_from - iterate over list of given type from the current point + * @pos: the type * to use as a loop cursor. * @head: the head for your list. * @member: the name of the list_struct within the struct. + * + * Iterate over list of given type, continuing from current position. */ #define list_for_each_entry_from(pos, head, member) \ for (; prefetch(pos->member.next), &pos->member != (head); \ @@ -445,7 +470,7 @@ static inline void list_splice_init(struct list_head *list, /** * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry - * @pos: the type * to use as a loop counter. + * @pos: the type * to use as a loop cursor. * @n: another type * to use as temporary storage * @head: the head for your list. * @member: the name of the list_struct within the struct. @@ -457,12 +482,14 @@ static inline void list_splice_init(struct list_head *list, pos = n, n = list_entry(n->member.next, typeof(*n), member)) /** - * list_for_each_entry_safe_continue - iterate over list of given type - * continuing after existing point safe against removal of list entry - * @pos: the type * to use as a loop counter. + * list_for_each_entry_safe_continue + * @pos: the type * to use as a loop cursor. * @n: another type * to use as temporary storage * @head: the head for your list. * @member: the name of the list_struct within the struct. + * + * Iterate over list of given type, continuing after current point, + * safe against removal of list entry. */ #define list_for_each_entry_safe_continue(pos, n, head, member) \ for (pos = list_entry(pos->member.next, typeof(*pos), member), \ @@ -471,12 +498,14 @@ static inline void list_splice_init(struct list_head *list, pos = n, n = list_entry(n->member.next, typeof(*n), member)) /** - * list_for_each_entry_safe_from - iterate over list of given type - * from existing point safe against removal of list entry - * @pos: the type * to use as a loop counter. + * list_for_each_entry_safe_from + * @pos: the type * to use as a loop cursor. * @n: another type * to use as temporary storage * @head: the head for your list. * @member: the name of the list_struct within the struct. + * + * Iterate over list of given type from current point, safe against + * removal of list entry. */ #define list_for_each_entry_safe_from(pos, n, head, member) \ for (n = list_entry(pos->member.next, typeof(*pos), member); \ @@ -484,12 +513,14 @@ static inline void list_splice_init(struct list_head *list, pos = n, n = list_entry(n->member.next, typeof(*n), member)) /** - * list_for_each_entry_safe_reverse - iterate backwards over list of given type safe against - * removal of list entry - * @pos: the type * to use as a loop counter. + * list_for_each_entry_safe_reverse + * @pos: the type * to use as a loop cursor. * @n: another type * to use as temporary storage * @head: the head for your list. * @member: the name of the list_struct within the struct. + * + * Iterate backwards over list of given type, safe against removal + * of list entry. */ #define list_for_each_entry_safe_reverse(pos, n, head, member) \ for (pos = list_entry((head)->prev, typeof(*pos), member), \ @@ -499,7 +530,7 @@ static inline void list_splice_init(struct list_head *list, /** * list_for_each_rcu - iterate over an rcu-protected list - * @pos: the &struct list_head to use as a loop counter. + * @pos: the &struct list_head to use as a loop cursor. * @head: the head for your list. * * This list-traversal primitive may safely run concurrently with @@ -517,12 +548,13 @@ static inline void list_splice_init(struct list_head *list, pos = pos->next) /** - * list_for_each_safe_rcu - iterate over an rcu-protected list safe - * against removal of list entry - * @pos: the &struct list_head to use as a loop counter. + * list_for_each_safe_rcu + * @pos: the &struct list_head to use as a loop cursor. * @n: another &struct list_head to use as temporary storage * @head: the head for your list. * + * Iterate over an rcu-protected list, safe against removal of list entry. + * * This list-traversal primitive may safely run concurrently with * the _rcu list-mutation primitives such as list_add_rcu() * as long as the traversal is guarded by rcu_read_lock(). @@ -534,7 +566,7 @@ static inline void list_splice_init(struct list_head *list, /** * list_for_each_entry_rcu - iterate over rcu list of given type - * @pos: the type * to use as a loop counter. + * @pos: the type * to use as a loop cursor. * @head: the head for your list. * @member: the name of the list_struct within the struct. * @@ -550,11 +582,12 @@ static inline void list_splice_init(struct list_head *list, /** - * list_for_each_continue_rcu - iterate over an rcu-protected list - * continuing after existing point. - * @pos: the &struct list_head to use as a loop counter. + * list_for_each_continue_rcu + * @pos: the &struct list_head to use as a loop cursor. * @head: the head for your list. * + * Iterate over an rcu-protected list, continuing after current point. + * * This list-traversal primitive may safely run concurrently with * the _rcu list-mutation primitives such as list_add_rcu() * as long as the traversal is guarded by rcu_read_lock(). @@ -680,11 +713,14 @@ static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h) /** - * hlist_add_head_rcu - adds the specified element to the specified hlist, - * while permitting racing traversals. + * hlist_add_head_rcu * @n: the element to add to the hash list. * @h: the list to add to. * + * Description: + * Adds the specified element to the specified hlist, + * while permitting racing traversals. + * * The caller must take whatever precautions are necessary * (such as holding appropriate locks) to avoid racing * with another list-mutation primitive, such as hlist_add_head_rcu() @@ -729,11 +765,14 @@ static inline void hlist_add_after(struct hlist_node *n, } /** - * hlist_add_before_rcu - adds the specified element to the specified hlist - * before the specified node while permitting racing traversals. + * hlist_add_before_rcu * @n: the new element to add to the hash list. * @next: the existing element to add the new element before. * + * Description: + * Adds the specified element to the specified hlist + * before the specified node while permitting racing traversals. + * * The caller must take whatever precautions are necessary * (such as holding appropriate locks) to avoid racing * with another list-mutation primitive, such as hlist_add_head_rcu() @@ -754,11 +793,14 @@ static inline void hlist_add_before_rcu(struct hlist_node *n, } /** - * hlist_add_after_rcu - adds the specified element to the specified hlist - * after the specified node while permitting racing traversals. + * hlist_add_after_rcu * @prev: the existing element to add the new element after. * @n: the new element to add to the hash list. * + * Description: + * Adds the specified element to the specified hlist + * after the specified node while permitting racing traversals. + * * The caller must take whatever precautions are necessary * (such as holding appropriate locks) to avoid racing * with another list-mutation primitive, such as hlist_add_head_rcu() @@ -791,8 +833,8 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev, /** * hlist_for_each_entry - iterate over list of given type - * @tpos: the type * to use as a loop counter. - * @pos: the &struct hlist_node to use as a loop counter. + * @tpos: the type * to use as a loop cursor. + * @pos: the &struct hlist_node to use as a loop cursor. * @head: the head for your list. * @member: the name of the hlist_node within the struct. */ @@ -803,9 +845,9 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev, pos = pos->next) /** - * hlist_for_each_entry_continue - iterate over a hlist continuing after existing point - * @tpos: the type * to use as a loop counter. - * @pos: the &struct hlist_node to use as a loop counter. + * hlist_for_each_entry_continue - iterate over a hlist continuing after current point + * @tpos: the type * to use as a loop cursor. + * @pos: the &struct hlist_node to use as a loop cursor. * @member: the name of the hlist_node within the struct. */ #define hlist_for_each_entry_continue(tpos, pos, member) \ @@ -815,9 +857,9 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev, pos = pos->next) /** - * hlist_for_each_entry_from - iterate over a hlist continuing from existing point - * @tpos: the type * to use as a loop counter. - * @pos: the &struct hlist_node to use as a loop counter. + * hlist_for_each_entry_from - iterate over a hlist continuing from current point + * @tpos: the type * to use as a loop cursor. + * @pos: the &struct hlist_node to use as a loop cursor. * @member: the name of the hlist_node within the struct. */ #define hlist_for_each_entry_from(tpos, pos, member) \ @@ -827,8 +869,8 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev, /** * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry - * @tpos: the type * to use as a loop counter. - * @pos: the &struct hlist_node to use as a loop counter. + * @tpos: the type * to use as a loop cursor. + * @pos: the &struct hlist_node to use as a loop cursor. * @n: another &struct hlist_node to use as temporary storage * @head: the head for your list. * @member: the name of the hlist_node within the struct. @@ -841,8 +883,8 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev, /** * hlist_for_each_entry_rcu - iterate over rcu list of given type - * @tpos: the type * to use as a loop counter. - * @pos: the &struct hlist_node to use as a loop counter. + * @tpos: the type * to use as a loop cursor. + * @pos: the &struct hlist_node to use as a loop cursor. * @head: the head for your list. * @member: the name of the hlist_node within the struct. * diff --git a/include/linux/lockd/lockd.h b/include/linux/lockd/lockd.h index 995f89dc8..0d92c468d 100644 --- a/include/linux/lockd/lockd.h +++ b/include/linux/lockd/lockd.h @@ -11,7 +11,6 @@ #ifdef __KERNEL__ -#include #include #include #include @@ -50,11 +49,12 @@ struct nlm_host { h_killed : 1, h_monitored : 1; wait_queue_head_t h_gracewait; /* wait while reclaiming */ + struct rw_semaphore h_rwsem; /* Reboot recovery lock */ u32 h_state; /* pseudo-state counter */ u32 h_nsmstate; /* true remote NSM state */ u32 h_pidcount; /* Pseudopids */ atomic_t h_count; /* reference count */ - struct semaphore h_sema; /* mutex for pmap binding */ + struct mutex h_mutex; /* mutex for pmap binding */ unsigned long h_nextrebind; /* next portmap call */ unsigned long h_expires; /* eligible for GC */ struct list_head h_lockowners; /* Lockowners for the client */ @@ -123,7 +123,6 @@ struct nlm_block { unsigned int b_id; /* block id */ unsigned char b_queued; /* re-queued */ unsigned char b_granted; /* VFS granted lock */ - unsigned char b_done; /* callback complete */ struct nlm_file * b_file; /* file in question */ }; @@ -220,6 +219,7 @@ static __inline__ int nlm_compare_locks(const struct file_lock *fl1, const struct file_lock *fl2) { return fl1->fl_pid == fl2->fl_pid + && fl1->fl_owner == fl2->fl_owner && fl1->fl_start == fl2->fl_start && fl1->fl_end == fl2->fl_end &&(fl1->fl_type == fl2->fl_type || fl2->fl_type == F_UNLCK); diff --git a/include/linux/lockd/nlm.h b/include/linux/lockd/nlm.h index 869b630cb..d9d46e442 100644 --- a/include/linux/lockd/nlm.h +++ b/include/linux/lockd/nlm.h @@ -9,7 +9,6 @@ #ifndef LINUX_LOCKD_NLM_H #define LINUX_LOCKD_NLM_H -#include /* Maximum file offset in file_lock.fl_end */ # define NLM_OFFSET_MAX ((s32) 0x7fffffff) diff --git a/include/linux/mc146818rtc.h b/include/linux/mc146818rtc.h index bbc93ae21..432b2fa24 100644 --- a/include/linux/mc146818rtc.h +++ b/include/linux/mc146818rtc.h @@ -89,4 +89,11 @@ extern spinlock_t rtc_lock; /* serialize CMOS RAM access */ # define RTC_VRT 0x80 /* valid RAM and time */ /**********************************************************************/ +#ifndef ARCH_RTC_LOCATION /* Override by ? */ + +#define RTC_IO_EXTENT 0x8 +#define RTC_IOMAPPED 1 /* Default to I/O mapping. */ + +#endif /* ARCH_RTC_LOCATION */ + #endif /* _MC146818RTC_H */ diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h index 911206386..218501cfa 100644 --- a/include/linux/memory_hotplug.h +++ b/include/linux/memory_hotplug.h @@ -63,6 +63,76 @@ extern int online_pages(unsigned long, unsigned long); /* reasonably generic interface to expand the physical pages in a zone */ extern int __add_pages(struct zone *zone, unsigned long start_pfn, unsigned long nr_pages); + +#ifdef CONFIG_NUMA +extern int memory_add_physaddr_to_nid(u64 start); +#else +static inline int memory_add_physaddr_to_nid(u64 start) +{ + return 0; +} +#endif + +#ifdef CONFIG_HAVE_ARCH_NODEDATA_EXTENSION +/* + * For supporting node-hotadd, we have to allocate a new pgdat. + * + * If an arch has generic style NODE_DATA(), + * node_data[nid] = kzalloc() works well. But it depends on the architecture. + * + * In general, generic_alloc_nodedata() is used. + * Now, arch_free_nodedata() is just defined for error path of node_hot_add. + * + */ +extern pg_data_t *arch_alloc_nodedata(int nid); +extern void arch_free_nodedata(pg_data_t *pgdat); +extern void arch_refresh_nodedata(int nid, pg_data_t *pgdat); + +#else /* CONFIG_HAVE_ARCH_NODEDATA_EXTENSION */ + +#define arch_alloc_nodedata(nid) generic_alloc_nodedata(nid) +#define arch_free_nodedata(pgdat) generic_free_nodedata(pgdat) + +#ifdef CONFIG_NUMA +/* + * If ARCH_HAS_NODEDATA_EXTENSION=n, this func is used to allocate pgdat. + * XXX: kmalloc_node() can't work well to get new node's memory at this time. + * Because, pgdat for the new node is not allocated/initialized yet itself. + * To use new node's memory, more consideration will be necessary. + */ +#define generic_alloc_nodedata(nid) \ +({ \ + kzalloc(sizeof(pg_data_t), GFP_KERNEL); \ +}) +/* + * This definition is just for error path in node hotadd. + * For node hotremove, we have to replace this. + */ +#define generic_free_nodedata(pgdat) kfree(pgdat) + +extern pg_data_t *node_data[]; +static inline void arch_refresh_nodedata(int nid, pg_data_t *pgdat) +{ + node_data[nid] = pgdat; +} + +#else /* !CONFIG_NUMA */ + +/* never called */ +static inline pg_data_t *generic_alloc_nodedata(int nid) +{ + BUG(); + return NULL; +} +static inline void generic_free_nodedata(pg_data_t *pgdat) +{ +} +static inline void arch_refresh_nodedata(int nid, pg_data_t *pgdat) +{ +} +#endif /* CONFIG_NUMA */ +#endif /* CONFIG_HAVE_ARCH_NODEDATA_EXTENSION */ + #else /* ! CONFIG_MEMORY_HOTPLUG */ /* * Stub functions for when hotplug is off @@ -99,7 +169,8 @@ static inline int __remove_pages(struct zone *zone, unsigned long start_pfn, return -ENOSYS; } -extern int add_memory(u64 start, u64 size); +extern int add_memory(int nid, u64 start, u64 size); +extern int arch_add_memory(int nid, u64 start, u64 size); extern int remove_memory(u64 start, u64 size); #endif /* __LINUX_MEMORY_HOTPLUG_H */ diff --git a/include/linux/mempolicy.h b/include/linux/mempolicy.h index 8480aef10..72440f0a4 100644 --- a/include/linux/mempolicy.h +++ b/include/linux/mempolicy.h @@ -22,17 +22,20 @@ /* Flags for mbind */ #define MPOL_MF_STRICT (1<<0) /* Verify existing pages in the mapping */ +#define MPOL_MF_MOVE (1<<1) /* Move pages owned by this process to conform to mapping */ +#define MPOL_MF_MOVE_ALL (1<<2) /* Move every page to conform to mapping */ +#define MPOL_MF_INTERNAL (1<<3) /* Internal flags start here */ #ifdef __KERNEL__ -#include #include -#include #include #include #include +#include struct vm_area_struct; +struct mm_struct; #ifdef CONFIG_NUMA @@ -47,8 +50,7 @@ struct vm_area_struct; * Locking policy for interlave: * In process context there is no locking because only the process accesses * its own state. All vma manipulation is somewhat protected by a down_read on - * mmap_sem. For allocating in the interleave policy the page_table_lock - * must be also aquired to protect il_next. + * mmap_sem. * * Freeing policy: * When policy is MPOL_BIND v.zonelist is kmalloc'ed and must be kfree'd. @@ -63,9 +65,10 @@ struct mempolicy { union { struct zonelist *zonelist; /* bind */ short preferred_node; /* preferred */ - DECLARE_BITMAP(nodes, MAX_NUMNODES); /* interleave */ + nodemask_t nodes; /* interleave */ /* undefined for default */ } v; + nodemask_t cpuset_mems_allowed; /* mempolicy relative to these nodes */ }; /* @@ -110,14 +113,6 @@ static inline int mpol_equal(struct mempolicy *a, struct mempolicy *b) #define mpol_set_vma_default(vma) ((vma)->vm_policy = NULL) -/* - * Hugetlb policy. i386 hugetlb so far works with node numbers - * instead of zone lists, so give it special interfaces for now. - */ -extern int mpol_first_node(struct vm_area_struct *vma, unsigned long addr); -extern int mpol_node_valid(int nid, struct vm_area_struct *vma, - unsigned long addr); - /* * Tree of shared policies for a shared memory region. * Maintain the policies in a pseudo mm that contains vmas. The vmas @@ -137,12 +132,8 @@ struct shared_policy { spinlock_t lock; }; -static inline void mpol_shared_policy_init(struct shared_policy *info) -{ - info->root = RB_ROOT; - spin_lock_init(&info->lock); -} - +void mpol_shared_policy_init(struct shared_policy *info, int policy, + nodemask_t *nodes); int mpol_set_shared_policy(struct shared_policy *info, struct vm_area_struct *vma, struct mempolicy *new); @@ -152,6 +143,37 @@ struct mempolicy *mpol_shared_policy_lookup(struct shared_policy *sp, extern void numa_default_policy(void); extern void numa_policy_init(void); +extern void mpol_rebind_policy(struct mempolicy *pol, const nodemask_t *new); +extern void mpol_rebind_task(struct task_struct *tsk, + const nodemask_t *new); +extern void mpol_rebind_mm(struct mm_struct *mm, nodemask_t *new); +extern void mpol_fix_fork_child_flag(struct task_struct *p); +#define set_cpuset_being_rebound(x) (cpuset_being_rebound = (x)) + +#ifdef CONFIG_CPUSET +#define current_cpuset_is_being_rebound() \ + (cpuset_being_rebound == current->cpuset) +#else +#define current_cpuset_is_being_rebound() 0 +#endif + +extern struct mempolicy default_policy; +extern struct zonelist *huge_zonelist(struct vm_area_struct *vma, + unsigned long addr); +extern unsigned slab_node(struct mempolicy *policy); + +extern int policy_zone; + +static inline void check_highest_zone(int k) +{ + if (k > policy_zone) + policy_zone = k; +} + +int do_migrate_pages(struct mm_struct *mm, + const nodemask_t *from_nodes, const nodemask_t *to_nodes, int flags); + +extern void *cpuset_being_rebound; /* Trigger mpol_copy vma rebind */ #else @@ -178,17 +200,6 @@ static inline struct mempolicy *mpol_copy(struct mempolicy *old) return NULL; } -static inline int mpol_first_node(struct vm_area_struct *vma, unsigned long a) -{ - return numa_node_id(); -} - -static inline int -mpol_node_valid(int nid, struct vm_area_struct *vma, unsigned long a) -{ - return 1; -} - struct shared_policy {}; static inline int mpol_set_shared_policy(struct shared_policy *info, @@ -198,7 +209,8 @@ static inline int mpol_set_shared_policy(struct shared_policy *info, return -EINVAL; } -static inline void mpol_shared_policy_init(struct shared_policy *info) +static inline void mpol_shared_policy_init(struct shared_policy *info, + int policy, nodemask_t *nodes) { } @@ -223,6 +235,42 @@ static inline void numa_default_policy(void) { } +static inline void mpol_rebind_policy(struct mempolicy *pol, + const nodemask_t *new) +{ +} + +static inline void mpol_rebind_task(struct task_struct *tsk, + const nodemask_t *new) +{ +} + +static inline void mpol_rebind_mm(struct mm_struct *mm, nodemask_t *new) +{ +} + +static inline void mpol_fix_fork_child_flag(struct task_struct *p) +{ +} + +#define set_cpuset_being_rebound(x) do {} while (0) + +static inline struct zonelist *huge_zonelist(struct vm_area_struct *vma, + unsigned long addr) +{ + return NODE_DATA(0)->node_zonelists + gfp_zone(GFP_HIGHUSER); +} + +static inline int do_migrate_pages(struct mm_struct *mm, + const nodemask_t *from_nodes, + const nodemask_t *to_nodes, int flags) +{ + return 0; +} + +static inline void check_highest_zone(int k) +{ +} #endif /* CONFIG_NUMA */ #endif /* __KERNEL__ */ diff --git a/include/linux/migrate.h b/include/linux/migrate.h index ff0a64073..48148e0cd 100644 --- a/include/linux/migrate.h +++ b/include/linux/migrate.h @@ -1,36 +1,44 @@ #ifndef _LINUX_MIGRATE_H #define _LINUX_MIGRATE_H -#include #include +typedef struct page *new_page_t(struct page *, unsigned long private, int **); + #ifdef CONFIG_MIGRATION extern int isolate_lru_page(struct page *p, struct list_head *pagelist); extern int putback_lru_pages(struct list_head *l); -extern int migrate_page(struct page *, struct page *); -extern void migrate_page_copy(struct page *, struct page *); -extern int migrate_page_remove_references(struct page *, struct page *, int); -extern int migrate_pages(struct list_head *l, struct list_head *t, - struct list_head *moved, struct list_head *failed); -extern int migrate_pages_to(struct list_head *pagelist, - struct vm_area_struct *vma, int dest); -extern int fail_migrate_page(struct page *, struct page *); +extern int migrate_page(struct address_space *, + struct page *, struct page *); +extern int migrate_pages(struct list_head *l, new_page_t x, unsigned long); -extern int migrate_prep(void); +extern int fail_migrate_page(struct address_space *, + struct page *, struct page *); +extern int migrate_prep(void); +extern int migrate_vmas(struct mm_struct *mm, + const nodemask_t *from, const nodemask_t *to, + unsigned long flags); #else static inline int isolate_lru_page(struct page *p, struct list_head *list) { return -ENOSYS; } static inline int putback_lru_pages(struct list_head *l) { return 0; } -static inline int migrate_pages(struct list_head *l, struct list_head *t, - struct list_head *moved, struct list_head *failed) { return -ENOSYS; } +static inline int migrate_pages(struct list_head *l, new_page_t x, + unsigned long private) { return -ENOSYS; } static inline int migrate_pages_to(struct list_head *pagelist, struct vm_area_struct *vma, int dest) { return 0; } static inline int migrate_prep(void) { return -ENOSYS; } +static inline int migrate_vmas(struct mm_struct *mm, + const nodemask_t *from, const nodemask_t *to, + unsigned long flags) +{ + return -ENOSYS; +} + /* Possible settings for the migrate_page() method in address_operations */ #define migrate_page NULL #define fail_migrate_page NULL diff --git a/include/linux/mii.h b/include/linux/mii.h index 68f5a0f39..beddc6d3b 100644 --- a/include/linux/mii.h +++ b/include/linux/mii.h @@ -9,7 +9,6 @@ #define __LINUX_MII_H__ #include -#include /* Generic MII registers. */ @@ -136,6 +135,20 @@ #define LPA_1000FULL 0x0800 /* Link partner 1000BASE-T full duplex */ #define LPA_1000HALF 0x0400 /* Link partner 1000BASE-T half duplex */ +/* This structure is used in all SIOCxMIIxxx ioctl calls */ +struct mii_ioctl_data { + __u16 phy_id; + __u16 reg_num; + __u16 val_in; + __u16 val_out; +}; + +#ifdef __KERNEL__ + +#include + +struct ethtool_cmd; + struct mii_if_info { int phy_id; int advertising; @@ -151,9 +164,6 @@ struct mii_if_info { void (*mdio_write) (struct net_device *dev, int phy_id, int location, int val); }; -struct ethtool_cmd; -struct mii_ioctl_data; - extern int mii_link_ok (struct mii_if_info *mii); extern int mii_nway_restart (struct mii_if_info *mii); extern int mii_ethtool_gset(struct mii_if_info *mii, struct ethtool_cmd *ecmd); @@ -168,16 +178,6 @@ extern int generic_mii_ioctl(struct mii_if_info *mii_if, unsigned int *duplex_changed); - -/* This structure is used in all SIOCxMIIxxx ioctl calls */ -struct mii_ioctl_data { - u16 phy_id; - u16 reg_num; - u16 val_in; - u16 val_out; -}; - - static inline struct mii_ioctl_data *if_mii(struct ifreq *rq) { return (struct mii_ioctl_data *) &rq->ifr_ifru; @@ -235,5 +235,5 @@ static inline unsigned int mii_duplex (unsigned int duplex_lock, return 0; } - +#endif /* __KERNEL__ */ #endif /* __LINUX_MII_H__ */ diff --git a/include/linux/miscdevice.h b/include/linux/miscdevice.h index 5b584dafb..b03cfb91e 100644 --- a/include/linux/miscdevice.h +++ b/include/linux/miscdevice.h @@ -40,7 +40,6 @@ struct miscdevice { struct list_head list; struct device *dev; struct class_device *class; - char devfs_name[64]; }; extern int misc_register(struct miscdevice * misc); diff --git a/include/linux/mm.h b/include/linux/mm.h index 51eea5b38..4efda963f 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -7,7 +7,6 @@ #ifdef __KERNEL__ -#include #include #include #include @@ -15,6 +14,8 @@ #include #include #include +#include +#include struct mempolicy; struct anon_vma; @@ -37,7 +38,6 @@ extern int sysctl_legacy_va_layout; #include #include #include -#include #define nth_page(page,n) pfn_to_page(page_to_pfn((page)) + (n)) @@ -146,7 +146,6 @@ extern unsigned int kobjsize(const void *objp); #define VM_GROWSDOWN 0x00000100 /* general info on the segment */ #define VM_GROWSUP 0x00000200 -#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.. */ @@ -203,10 +202,16 @@ struct vm_operations_struct { void (*close)(struct vm_area_struct * area); struct page * (*nopage)(struct vm_area_struct * area, unsigned long address, int *type); int (*populate)(struct vm_area_struct * area, unsigned long address, unsigned long len, pgprot_t prot, unsigned long pgoff, int nonblock); + + /* notification that a previously read-only page is about to become + * writable, if an error is returned it will cause a SIGBUS */ + int (*page_mkwrite)(struct vm_area_struct *vma, struct page *page); #ifdef CONFIG_NUMA int (*set_policy)(struct vm_area_struct *vma, struct mempolicy *new); struct mempolicy *(*get_policy)(struct vm_area_struct *vma, unsigned long addr); + int (*migrate)(struct vm_area_struct *vma, const nodemask_t *from, + const nodemask_t *to, unsigned long flags); #endif }; @@ -335,6 +340,7 @@ static inline void init_page_count(struct page *page) } void put_page(struct page *page); +void put_pages_list(struct list_head *pages); void split_page(struct page *page, unsigned int order); @@ -469,10 +475,13 @@ static inline unsigned long page_zonenum(struct page *page) struct zone; extern struct zone *zone_table[]; +static inline int page_zone_id(struct page *page) +{ + return (page->flags >> ZONETABLE_PGSHIFT) & ZONETABLE_MASK; +} static inline struct zone *page_zone(struct page *page) { - return zone_table[(page->flags >> ZONETABLE_PGSHIFT) & - ZONETABLE_MASK]; + return zone_table[page_zone_id(page)]; } static inline unsigned long page_to_nid(struct page *page) @@ -511,6 +520,11 @@ static inline void set_page_links(struct page *page, unsigned long zone, set_page_section(page, pfn_to_section_nr(pfn)); } +/* + * Some inline functions in vmstat.h depend on page_zone() + */ +#include + #ifndef CONFIG_DISCONTIGMEM /* The array of struct pages - for discontigmem use pgdat->lmem_map */ extern struct page *mem_map; @@ -792,6 +806,39 @@ struct shrinker; extern struct shrinker *set_shrinker(int, shrinker_t); extern void remove_shrinker(struct shrinker *shrinker); +/* + * Some shared mappigns will want the pages marked read-only + * to track write events. If so, we'll downgrade vm_page_prot + * to the private version (using protection_map[] without the + * VM_SHARED bit). + */ +static inline int vma_wants_writenotify(struct vm_area_struct *vma) +{ + unsigned int vm_flags = vma->vm_flags; + + /* If it was private or non-writable, the write bit is already clear */ + if ((vm_flags & (VM_WRITE|VM_SHARED)) != ((VM_WRITE|VM_SHARED))) + return 0; + + /* The backer wishes to know when pages are first written to? */ + if (vma->vm_ops && vma->vm_ops->page_mkwrite) + return 1; + + /* The open routine did something to the protections already? */ + if (pgprot_val(vma->vm_page_prot) != + pgprot_val(protection_map[vm_flags & + (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)])) + return 0; + + /* Specialty mapping? */ + if (vm_flags & (VM_PFNMAP|VM_INSERTPAGE)) + return 0; + + /* Can the mapping track the dirty pages? */ + return vma->vm_file && vma->vm_file->f_mapping && + mapping_cap_account_dirty(vma->vm_file->f_mapping); +} + 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); @@ -1015,6 +1062,7 @@ static inline unsigned long vma_pages(struct vm_area_struct *vma) return (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; } +pgprot_t vm_get_page_prot(unsigned long vm_flags); struct vm_area_struct *find_extend_vma(struct mm_struct *, unsigned long addr); struct page *vmalloc_to_page(void *addr); unsigned long vmalloc_to_pfn(void *addr); @@ -1050,8 +1098,8 @@ static inline void kernel_map_pages(struct page *page, int numpages, int enable) { if (!PageHighMem(page) && !enable) - mutex_debug_check_no_locks_freed(page_address(page), - numpages * PAGE_SIZE); + debug_check_no_locks_freed(page_address(page), + numpages * PAGE_SIZE); } #endif @@ -1080,5 +1128,7 @@ void drop_slab(void); extern int randomize_va_space; #endif +const char *arch_vma_name(struct vm_area_struct *vma); + #endif /* __KERNEL__ */ #endif /* _LINUX_MM_H */ diff --git a/include/linux/mman.h b/include/linux/mman.h index 18a5689ef..87920a085 100644 --- a/include/linux/mman.h +++ b/include/linux/mman.h @@ -1,10 +1,6 @@ #ifndef _LINUX_MMAN_H #define _LINUX_MMAN_H -#include -#include - -#include #include #define MREMAP_MAYMOVE 1 @@ -13,6 +9,12 @@ #define OVERCOMMIT_GUESS 0 #define OVERCOMMIT_ALWAYS 1 #define OVERCOMMIT_NEVER 2 + +#ifdef __KERNEL__ +#include + +#include + extern int sysctl_overcommit_memory; extern int sysctl_overcommit_ratio; extern atomic_t vm_committed_space; @@ -63,5 +65,5 @@ calc_vm_flag_bits(unsigned long flags) _calc_vm_trans(flags, MAP_EXECUTABLE, VM_EXECUTABLE) | _calc_vm_trans(flags, MAP_LOCKED, VM_LOCKED ); } - +#endif /* __KERNEL__ */ #endif /* _LINUX_MMAN_H */ diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index c1f021edd..ba095aebe 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -77,7 +77,7 @@ struct mmc_host { struct device *dev; struct class_device class_dev; int index; - struct mmc_host_ops *ops; + const struct mmc_host_ops *ops; unsigned int f_min; unsigned int f_max; u32 ocr_avail; diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h index 03a14a30c..627e2c08c 100644 --- a/include/linux/mmc/mmc.h +++ b/include/linux/mmc/mmc.h @@ -105,6 +105,8 @@ extern int mmc_wait_for_cmd(struct mmc_host *, struct mmc_command *, int); extern int mmc_wait_for_app_cmd(struct mmc_host *, unsigned int, struct mmc_command *, int); +extern void mmc_set_data_timeout(struct mmc_data *, const struct mmc_card *, int); + extern int __mmc_claim_host(struct mmc_host *host, struct mmc_card *card); static inline void mmc_claim_host(struct mmc_host *host) diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 2d8337150..5dfe11189 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -4,7 +4,6 @@ #ifdef __KERNEL__ #ifndef __ASSEMBLY__ -#include #include #include #include @@ -47,6 +46,27 @@ struct zone_padding { #define ZONE_PADDING(name) #endif +enum zone_stat_item { + NR_ANON_PAGES, /* Mapped anonymous pages */ + NR_FILE_MAPPED, /* pagecache pages mapped into pagetables. + only modified from process context */ + NR_FILE_PAGES, + NR_SLAB, /* Pages used by slab allocator */ + NR_PAGETABLE, /* used for pagetables */ + NR_FILE_DIRTY, + NR_WRITEBACK, + NR_UNSTABLE_NFS, /* NFS unstable pages */ + NR_BOUNCE, +#ifdef CONFIG_NUMA + NUMA_HIT, /* allocated in intended node */ + NUMA_MISS, /* allocated in non intended node */ + NUMA_FOREIGN, /* was intended here, hit elsewhere */ + NUMA_INTERLEAVE_HIT, /* interleaver preferred this zone */ + NUMA_LOCAL, /* allocation from local node */ + NUMA_OTHER, /* allocation from other node */ +#endif + NR_VM_ZONE_STAT_ITEMS }; + struct per_cpu_pages { int count; /* number of pages in the list */ int high; /* high watermark, emptying needed */ @@ -56,13 +76,9 @@ struct per_cpu_pages { struct per_cpu_pageset { struct per_cpu_pages pcp[2]; /* 0: hot. 1: cold */ -#ifdef CONFIG_NUMA - unsigned long numa_hit; /* allocated in intended node */ - unsigned long numa_miss; /* allocated in non intended node */ - unsigned long numa_foreign; /* was intended here, hit elsewhere */ - unsigned long interleave_hit; /* interleaver prefered this zone */ - unsigned long local_node; /* allocation from local node */ - unsigned long other_node; /* allocation from other node */ +#ifdef CONFIG_SMP + s8 stat_threshold; + s8 vm_stat_diff[NR_VM_ZONE_STAT_ITEMS]; #endif } ____cacheline_aligned_in_smp; @@ -135,6 +151,11 @@ struct zone { unsigned long lowmem_reserve[MAX_NR_ZONES]; #ifdef CONFIG_NUMA + /* + * zone reclaim becomes active if more unmapped pages exist. + */ + unsigned long min_unmapped_ratio; + unsigned long min_slab_pages; struct per_cpu_pageset *pageset[NR_CPUS]; #else struct per_cpu_pageset pageset[NR_CPUS]; @@ -166,12 +187,8 @@ struct zone { /* A count of how many reclaimers are scanning this zone */ atomic_t reclaim_in_progress; - /* - * timestamp (in jiffies) of the last zone reclaim that did not - * result in freeing of pages. This is used to avoid repeated scans - * if all memory in the zone is in use. - */ - unsigned long last_unsuccessful_zone_reclaim; + /* Zone statistics */ + atomic_long_t vm_stat[NR_VM_ZONE_STAT_ITEMS]; /* * prev_priority holds the scanning priority for this zone. It is @@ -183,13 +200,9 @@ struct zone { * under - it drives the swappiness decision: whether to unmap mapped * pages. * - * temp_priority is used to remember the scanning priority at which - * this zone was successfully refilled to free_pages == pages_high. - * - * Access to both these fields is quite racy even on uniprocessor. But + * Access to both this field is quite racy even on uniprocessor. But * it is expected to average out OK. */ - int temp_priority; int prev_priority; @@ -198,7 +211,7 @@ struct zone { /* * wait_table -- the array holding the hash table - * wait_table_size -- the size of the hash table array + * wait_table_hash_nr_entries -- the size of the hash table array * wait_table_bits -- wait_table_size == (1 << wait_table_bits) * * The purpose of all these is to keep track of the people @@ -221,7 +234,7 @@ struct zone { * free_area_init_core() performs the initialization of them. */ wait_queue_head_t * wait_table; - unsigned long wait_table_size; + unsigned long wait_table_hash_nr_entries; unsigned long wait_table_bits; /* @@ -334,6 +347,9 @@ void wakeup_kswapd(struct zone *zone, int order); int zone_watermark_ok(struct zone *z, int order, unsigned long mark, int classzone_idx, int alloc_flags); +extern int init_currently_empty_zone(struct zone *zone, unsigned long start_pfn, + unsigned long size); + #ifdef CONFIG_HAVE_MEMORY_PRESENT void memory_present(int nid, unsigned long start, unsigned long end); #else @@ -400,6 +416,10 @@ int lowmem_reserve_ratio_sysctl_handler(struct ctl_table *, int, struct file *, void __user *, size_t *, loff_t *); int percpu_pagelist_fraction_sysctl_handler(struct ctl_table *, int, struct file *, void __user *, size_t *, loff_t *); +int sysctl_min_unmapped_ratio_sysctl_handler(struct ctl_table *, int, + struct file *, void __user *, size_t *, loff_t *); +int sysctl_min_slab_ratio_sysctl_handler(struct ctl_table *, int, + struct file *, void __user *, size_t *, loff_t *); #include /* Returns the number of the current Node. */ @@ -507,6 +527,10 @@ struct mem_section { * pages. However, it is stored with some other magic. * (see sparse.c::sparse_init_one_section()) * + * Additionally during early boot we encode node id of + * the location of the section here to guide allocation. + * (see sparse.c::memory_present()) + * * Making it a UL at least makes someone do a cast * before using it wrong. */ @@ -546,6 +570,7 @@ extern int __section_nr(struct mem_section* ms); #define SECTION_HAS_MEM_MAP (1UL<<1) #define SECTION_MAP_LAST_BIT (1UL<<2) #define SECTION_MAP_MASK (~(SECTION_MAP_LAST_BIT-1)) +#define SECTION_NID_SHIFT 2 static inline struct page *__section_mem_map_addr(struct mem_section *section) { @@ -603,6 +628,12 @@ void sparse_init(void); #define sparse_index_init(_sec, _nid) do {} while (0) #endif /* CONFIG_SPARSEMEM */ +#ifdef CONFIG_NODES_SPAN_OTHER_NODES +#define early_pfn_in_nid(pfn, nid) (early_pfn_to_nid(pfn) == (nid)) +#else +#define early_pfn_in_nid(pfn, nid) (1) +#endif + #ifndef early_pfn_valid #define early_pfn_valid(pfn) (1) #endif diff --git a/include/linux/module.h b/include/linux/module.h index b9b98bb22..c4584187e 100644 --- a/include/linux/module.h +++ b/include/linux/module.h @@ -6,7 +6,6 @@ * Rewritten by Richard Henderson Dec 1996 * Rewritten again by Rusty Russell, 2002 */ -#include #include #include #include @@ -106,6 +105,8 @@ extern struct module __this_module; * "GPL and additional rights" [GNU Public License v2 rights and more] * "Dual BSD/GPL" [GNU Public License v2 * or BSD license choice] + * "Dual MIT/GPL" [GNU Public License v2 + * or MIT license choice] * "Dual MPL/GPL" [GNU Public License v2 * or Mozilla license choice] * @@ -202,6 +203,15 @@ void *__symbol_get_gpl(const char *symbol); #define EXPORT_SYMBOL_GPL_FUTURE(sym) \ __EXPORT_SYMBOL(sym, "_gpl_future") + +#ifdef CONFIG_UNUSED_SYMBOLS +#define EXPORT_UNUSED_SYMBOL(sym) __EXPORT_SYMBOL(sym, "_unused") +#define EXPORT_UNUSED_SYMBOL_GPL(sym) __EXPORT_SYMBOL(sym, "_unused_gpl") +#else +#define EXPORT_UNUSED_SYMBOL(sym) +#define EXPORT_UNUSED_SYMBOL_GPL(sym) +#endif + #endif struct module_ref @@ -260,6 +270,15 @@ struct module unsigned int num_gpl_syms; const unsigned long *gpl_crcs; + /* unused exported symbols. */ + const struct kernel_symbol *unused_syms; + unsigned int num_unused_syms; + const unsigned long *unused_crcs; + /* GPL-only, unused exported symbols. */ + const struct kernel_symbol *unused_gpl_syms; + unsigned int num_unused_gpl_syms; + const unsigned long *unused_gpl_crcs; + /* symbols that will be GPL-only in the near future. */ const struct kernel_symbol *gpl_future_syms; unsigned int num_gpl_future_syms; @@ -284,6 +303,9 @@ struct module /* The size of the executable code in each section. */ unsigned long init_text_size, core_text_size; + /* The handle returned from unwind_add_table. */ + void *unwind_info; + /* Arch-specific module values */ struct mod_arch_specific arch; @@ -339,13 +361,12 @@ static inline int module_is_live(struct module *mod) /* Is this address in a module? (second is with no locks, for oops) */ struct module *module_text_address(unsigned long addr); struct module *__module_text_address(unsigned long addr); +int is_module_address(unsigned long addr); /* Returns module and fills in value, defined and namebuf, or NULL if symnum out of range. */ -struct module *module_get_kallsym(unsigned int symnum, - unsigned long *value, - char *type, - char namebuf[128]); +struct module *module_get_kallsym(unsigned int symnum, unsigned long *value, + char *type, char *name, size_t namelen); /* Look for this name: can be of form module:name. */ unsigned long module_kallsyms_lookup_name(const char *name); @@ -455,6 +476,8 @@ void module_remove_driver(struct device_driver *); #define EXPORT_SYMBOL(sym) #define EXPORT_SYMBOL_GPL(sym) #define EXPORT_SYMBOL_GPL_FUTURE(sym) +#define EXPORT_UNUSED_SYMBOL(sym) +#define EXPORT_UNUSED_SYMBOL_GPL(sym) /* Given an address, look for it in the exception tables. */ static inline const struct exception_table_entry * @@ -475,6 +498,11 @@ static inline struct module *__module_text_address(unsigned long addr) return NULL; } +static inline int is_module_address(unsigned long addr) +{ + return 0; +} + /* Get/put a kernel symbol (calls should be symmetric) */ #define symbol_get(x) ({ extern typeof(x) x __attribute__((weak)); &(x); }) #define symbol_put(x) do { } while(0) @@ -508,8 +536,8 @@ static inline const char *module_address_lookup(unsigned long addr, static inline struct module *module_get_kallsym(unsigned int symnum, unsigned long *value, - char *type, - char namebuf[128]) + char *type, char *name, + size_t namelen) { return NULL; } @@ -560,13 +588,4 @@ static inline void module_remove_driver(struct device_driver *driver) #define __MODULE_STRING(x) __stringify(x) -/* Use symbol_get and symbol_put instead. You'll thank me. */ -#define HAVE_INTER_MODULE -extern void __deprecated inter_module_register(const char *, - struct module *, const void *); -extern void __deprecated inter_module_unregister(const char *); -extern const void * __deprecated inter_module_get_request(const char *, - const char *); -extern void __deprecated inter_module_put(const char *); - #endif /* _LINUX_MODULE_H */ diff --git a/include/linux/mount.h b/include/linux/mount.h index a708e3674..42d699ce0 100644 --- a/include/linux/mount.h +++ b/include/linux/mount.h @@ -17,6 +17,11 @@ #include #include +struct super_block; +struct vfsmount; +struct dentry; +struct namespace; + #define MNT_NOSUID 0x01 #define MNT_NODEV 0x02 #define MNT_NOEXEC 0x04 @@ -26,6 +31,8 @@ #define MNT_IS_RDONLY(m) ((m) && ((m)->mnt_flags & MNT_RDONLY)) +#define MNT_SHRINKABLE 0x100 + #define MNT_SHARED 0x1000 /* if the vfsmount is a shared mount */ #define MNT_UNBINDABLE 0x2000 /* if the vfsmount is a unbindable mount */ #define MNT_PNODE_MASK 0x3000 /* propogation flag mask */ @@ -78,12 +85,18 @@ extern struct vfsmount *alloc_vfsmnt(const char *name); extern struct vfsmount *do_kern_mount(const char *fstype, int flags, const char *name, void *data); +struct file_system_type; +extern struct vfsmount *vfs_kern_mount(struct file_system_type *type, + int flags, const char *name, + void *data); + struct nameidata; extern int do_add_mount(struct vfsmount *newmnt, struct nameidata *nd, int mnt_flags, struct list_head *fslist); extern void mark_mounts_for_expiry(struct list_head *mounts); +extern void shrink_submounts(struct vfsmount *mountpoint, struct list_head *mounts); extern spinlock_t vfsmount_lock; extern dev_t name_to_dev_t(char *name); diff --git a/include/linux/msg.h b/include/linux/msg.h index 903e0ab81..acc7c174f 100644 --- a/include/linux/msg.h +++ b/include/linux/msg.h @@ -2,7 +2,6 @@ #define _LINUX_MSG_H #include -#include /* ipcs ctl commands */ #define MSG_STAT 11 @@ -63,6 +62,7 @@ struct msginfo { #define MSGSEG (__MSGSEG <= 0xffff ? __MSGSEG : 0xffff) #ifdef __KERNEL__ +#include /* one msg_msg structure for each message */ struct msg_msg { diff --git a/include/linux/mtd/bbm.h b/include/linux/mtd/bbm.h index 7a7fbe87f..1221b7c44 100644 --- a/include/linux/mtd/bbm.h +++ b/include/linux/mtd/bbm.h @@ -19,21 +19,21 @@ /** * struct nand_bbt_descr - bad block table descriptor - * @param options options for this descriptor - * @param pages the page(s) where we find the bbt, used with + * @options: options for this descriptor + * @pages: the page(s) where we find the bbt, used with * option BBT_ABSPAGE when bbt is searched, * then we store the found bbts pages here. * Its an array and supports up to 8 chips now - * @param offs offset of the pattern in the oob area of the page - * @param veroffs offset of the bbt version counter in the oob are of the page - * @param version version read from the bbt page during scan - * @param len length of the pattern, if 0 no pattern check is performed - * @param maxblocks maximum number of blocks to search for a bbt. This number of - * blocks is reserved at the end of the device + * @offs: offset of the pattern in the oob area of the page + * @veroffs: offset of the bbt version counter in the oob area of the page + * @version: version read from the bbt page during scan + * @len: length of the pattern, if 0 no pattern check is performed + * @maxblocks: maximum number of blocks to search for a bbt. This + * number of blocks is reserved at the end of the device * where the tables are written. - * @param reserved_block_code if non-0, this pattern denotes a reserved + * @reserved_block_code: if non-0, this pattern denotes a reserved * (rather than bad) block in the stored bbt - * @param pattern pattern to identify bad block table or factory marked + * @pattern: pattern to identify bad block table or factory marked * good / bad blocks, can be NULL, if len = 0 * * Descriptor for the bad block table marker and the descriptor for the @@ -93,12 +93,15 @@ struct nand_bbt_descr { #define ONENAND_BADBLOCK_POS 0 /** - * struct bbt_info - [GENERIC] Bad Block Table data structure - * @param bbt_erase_shift [INTERN] number of address bits in a bbt entry - * @param badblockpos [INTERN] position of the bad block marker in the oob area - * @param bbt [INTERN] bad block table pointer - * @param badblock_pattern [REPLACEABLE] bad block scan pattern used for initial bad block scan - * @param priv [OPTIONAL] pointer to private bbm date + * struct bbm_info - [GENERIC] Bad Block Table data structure + * @bbt_erase_shift: [INTERN] number of address bits in a bbt entry + * @badblockpos: [INTERN] position of the bad block marker in the oob area + * @options: options for this descriptor + * @bbt: [INTERN] bad block table pointer + * @isbad_bbt: function to determine if a block is bad + * @badblock_pattern: [REPLACEABLE] bad block scan pattern used for + * initial bad block scan + * @priv: [OPTIONAL] pointer to private bbm date */ struct bbm_info { int bbt_erase_shift; diff --git a/include/linux/mtd/cfi.h b/include/linux/mtd/cfi.h index 23a568910..123948b14 100644 --- a/include/linux/mtd/cfi.h +++ b/include/linux/mtd/cfi.h @@ -7,7 +7,6 @@ #ifndef __MTD_CFI_H__ #define __MTD_CFI_H__ -#include #include #include #include @@ -200,6 +199,18 @@ struct cfi_pri_amdstd { uint8_t TopBottom; } __attribute__((packed)); +/* Vendor-Specific PRI for Atmel chips (command set 0x0002) */ + +struct cfi_pri_atmel { + uint8_t pri[3]; + uint8_t MajorVersion; + uint8_t MinorVersion; + uint8_t Features; + uint8_t BottomBoot; + uint8_t BurstMode; + uint8_t PageMode; +} __attribute__((packed)); + struct cfi_pri_query { uint8_t NumFields; uint32_t ProtField[1]; /* Not host ordered */ @@ -465,6 +476,7 @@ struct cfi_fixup { #define CFI_ID_ANY 0xffff #define CFI_MFR_AMD 0x0001 +#define CFI_MFR_ATMEL 0x001F #define CFI_MFR_ST 0x0020 /* STMicroelectronics */ void cfi_fixup(struct mtd_info *mtd, struct cfi_fixup* fixups); diff --git a/include/linux/mtd/inftl.h b/include/linux/mtd/inftl.h index d7eaa40e5..6977780e5 100644 --- a/include/linux/mtd/inftl.h +++ b/include/linux/mtd/inftl.h @@ -46,7 +46,7 @@ struct INFTLrecord { unsigned int nb_blocks; /* number of physical blocks */ unsigned int nb_boot_blocks; /* number of blocks used by the bios */ struct erase_info instr; - struct nand_oobinfo oobinfo; + struct nand_ecclayout oobinfo; }; int INFTL_mount(struct INFTLrecord *s); diff --git a/include/linux/mtd/map.h b/include/linux/mtd/map.h index 7dfd6e1fc..28d461d86 100644 --- a/include/linux/mtd/map.h +++ b/include/linux/mtd/map.h @@ -5,7 +5,6 @@ #ifndef __LINUX_MTD_MAP_H__ #define __LINUX_MTD_MAP_H__ -#include #include #include #include diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h index b6f2fdae6..94a443d45 100644 --- a/include/linux/mtd/mtd.h +++ b/include/linux/mtd/mtd.h @@ -13,7 +13,6 @@ #error This is a kernel header. Perhaps include mtd-user.h instead? #endif -#include #include #include #include @@ -56,18 +55,69 @@ struct mtd_erase_region_info { u_int32_t numblocks; /* Number of blocks of erasesize in this region */ }; +/* + * oob operation modes + * + * MTD_OOB_PLACE: oob data are placed at the given offset + * MTD_OOB_AUTO: oob data are automatically placed at the free areas + * which are defined by the ecclayout + * MTD_OOB_RAW: mode to read raw data+oob in one chunk. The oob data + * is inserted into the data. Thats a raw image of the + * flash contents. + */ +typedef enum { + MTD_OOB_PLACE, + MTD_OOB_AUTO, + MTD_OOB_RAW, +} mtd_oob_mode_t; + +/** + * struct mtd_oob_ops - oob operation operands + * @mode: operation mode + * + * @len: number of bytes to write/read. When a data buffer is given + * (datbuf != NULL) this is the number of data bytes. When + * no data buffer is available this is the number of oob bytes. + * + * @retlen: number of bytes written/read. When a data buffer is given + * (datbuf != NULL) this is the number of data bytes. When + * no data buffer is available this is the number of oob bytes. + * + * @ooblen: number of oob bytes per page + * @ooboffs: offset of oob data in the oob area (only relevant when + * mode = MTD_OOB_PLACE) + * @datbuf: data buffer - if NULL only oob data are read/written + * @oobbuf: oob data buffer + */ +struct mtd_oob_ops { + mtd_oob_mode_t mode; + size_t len; + size_t retlen; + size_t ooblen; + uint32_t ooboffs; + uint8_t *datbuf; + uint8_t *oobbuf; +}; + struct mtd_info { u_char type; u_int32_t flags; u_int32_t size; // Total size of the MTD - /* "Major" erase size for the device. Naïve users may take this + /* "Major" erase size for the device. Naïve users may take this * to be the only erase size available, or may use the more detailed * information below if they desire */ u_int32_t erasesize; + /* Minimal writable flash unit size. In case of NOR flash it is 1 (even + * though individual bits can be cleared), in case of NAND flash it is + * one NAND page (or half, or one-fourths of it), in case of ECC-ed NOR + * it is of ECC block size, etc. It is illegal to have writesize = 0. + * Any driver registering a struct mtd_info must ensure a writesize of + * 1 or larger. + */ + u_int32_t writesize; - u_int32_t oobblock; // Size of OOB blocks (e.g. 512) u_int32_t oobsize; // Amount of OOB data per block (e.g. 16) u_int32_t ecctype; u_int32_t eccsize; @@ -79,7 +129,6 @@ struct mtd_info { * MTD_PROGRAM_REGIONS flag is set. * (Maybe we should have an union for those?) */ -#define MTD_PROGREGION_SIZE(mtd) (mtd)->oobblock #define MTD_PROGREGION_CTRLMODE_VALID(mtd) (mtd)->oobsize #define MTD_PROGREGION_CTRLMODE_INVALID(mtd) (mtd)->ecctype @@ -87,9 +136,8 @@ struct mtd_info { char *name; int index; - // oobinfo is a nand_oobinfo structure, which can be set by iotcl (MEMSETOOBINFO) - struct nand_oobinfo oobinfo; - u_int32_t oobavail; // Number of bytes in OOB area available for fs + /* ecc layout structure pointer - read only ! */ + struct nand_ecclayout *ecclayout; /* Data for variable erase regions. If numeraseregions is zero, * it means that the whole device has erasesize as given above. @@ -112,11 +160,10 @@ struct mtd_info { int (*read) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); int (*write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf); - int (*read_ecc) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf, u_char *eccbuf, struct nand_oobinfo *oobsel); - int (*write_ecc) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf, u_char *eccbuf, struct nand_oobinfo *oobsel); - - int (*read_oob) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); - int (*write_oob) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf); + int (*read_oob) (struct mtd_info *mtd, loff_t from, + struct mtd_oob_ops *ops); + int (*write_oob) (struct mtd_info *mtd, loff_t to, + struct mtd_oob_ops *ops); /* * Methods to access the protection register area, present in some @@ -130,17 +177,11 @@ struct mtd_info { int (*write_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); int (*lock_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len); - /* kvec-based read/write methods. We need these especially for NAND flash, - with its limited number of write cycles per erase. + /* kvec-based read/write methods. NB: The 'count' parameter is the number of _vectors_, each of which contains an (ofs, len) tuple. */ - int (*readv) (struct mtd_info *mtd, struct kvec *vecs, unsigned long count, loff_t from, size_t *retlen); - int (*readv_ecc) (struct mtd_info *mtd, struct kvec *vecs, unsigned long count, loff_t from, - size_t *retlen, u_char *eccbuf, struct nand_oobinfo *oobsel); int (*writev) (struct mtd_info *mtd, const struct kvec *vecs, unsigned long count, loff_t to, size_t *retlen); - int (*writev_ecc) (struct mtd_info *mtd, const struct kvec *vecs, unsigned long count, loff_t to, - size_t *retlen, u_char *eccbuf, struct nand_oobinfo *oobsel); /* Sync */ void (*sync) (struct mtd_info *mtd); @@ -159,6 +200,9 @@ struct mtd_info { struct notifier_block reboot_notifier; /* default mode before reboot */ + /* ECC status information */ + struct mtd_ecc_stats ecc_stats; + void *priv; struct module *owner; @@ -192,20 +236,6 @@ int default_mtd_writev(struct mtd_info *mtd, const struct kvec *vecs, int default_mtd_readv(struct mtd_info *mtd, struct kvec *vecs, unsigned long count, loff_t from, size_t *retlen); -#define MTD_ERASE(mtd, args...) (*(mtd->erase))(mtd, args) -#define MTD_POINT(mtd, a,b,c,d) (*(mtd->point))(mtd, a,b,c, (u_char **)(d)) -#define MTD_UNPOINT(mtd, arg) (*(mtd->unpoint))(mtd, (u_char *)arg) -#define MTD_READ(mtd, args...) (*(mtd->read))(mtd, args) -#define MTD_WRITE(mtd, args...) (*(mtd->write))(mtd, args) -#define MTD_READV(mtd, args...) (*(mtd->readv))(mtd, args) -#define MTD_WRITEV(mtd, args...) (*(mtd->writev))(mtd, args) -#define MTD_READECC(mtd, args...) (*(mtd->read_ecc))(mtd, args) -#define MTD_WRITEECC(mtd, args...) (*(mtd->write_ecc))(mtd, args) -#define MTD_READOOB(mtd, args...) (*(mtd->read_oob))(mtd, args) -#define MTD_WRITEOOB(mtd, args...) (*(mtd->write_oob))(mtd, args) -#define MTD_SYNC(mtd) do { if (mtd->sync) (*(mtd->sync))(mtd); } while (0) - - #ifdef CONFIG_MTD_PARTITIONS void mtd_erase_callback(struct erase_info *instr); #else @@ -226,7 +256,7 @@ static inline void mtd_erase_callback(struct erase_info *instr) #ifdef CONFIG_MTD_DEBUG #define DEBUG(n, args...) \ - do { \ + do { \ if (n <= CONFIG_MTD_DEBUG_VERBOSE) \ printk(KERN_INFO args); \ } while(0) diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h index da5e67b3f..0b4cd2fa6 100644 --- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h @@ -11,52 +11,15 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * - * Info: - * Contains standard defines and IDs for NAND flash devices + * Info: + * Contains standard defines and IDs for NAND flash devices * - * Changelog: - * 01-31-2000 DMW Created - * 09-18-2000 SJH Moved structure out of the Disk-On-Chip drivers - * so it can be used by other NAND flash device - * drivers. I also changed the copyright since none - * of the original contents of this file are specific - * to DoC devices. David can whack me with a baseball - * bat later if I did something naughty. - * 10-11-2000 SJH Added private NAND flash structure for driver - * 10-24-2000 SJH Added prototype for 'nand_scan' function - * 10-29-2001 TG changed nand_chip structure to support - * hardwarespecific function for accessing control lines - * 02-21-2002 TG added support for different read/write adress and - * ready/busy line access function - * 02-26-2002 TG added chip_delay to nand_chip structure to optimize - * command delay times for different chips - * 04-28-2002 TG OOB config defines moved from nand.c to avoid duplicate - * defines in jffs2/wbuf.c - * 08-07-2002 TG forced bad block location to byte 5 of OOB, even if - * CONFIG_MTD_NAND_ECC_JFFS2 is not set - * 08-10-2002 TG extensions to nand_chip structure to support HW-ECC - * - * 08-29-2002 tglx nand_chip structure: data_poi for selecting - * internal / fs-driver buffer - * support for 6byte/512byte hardware ECC - * read_ecc, write_ecc extended for different oob-layout - * oob layout selections: NAND_NONE_OOB, NAND_JFFS2_OOB, - * NAND_YAFFS_OOB - * 11-25-2002 tglx Added Manufacturer code FUJITSU, NATIONAL - * Split manufacturer and device ID structures - * - * 02-08-2004 tglx added option field to nand structure for chip anomalities - * 05-25-2004 tglx added bad block table support, ST-MICRO manufacturer id - * update of nand_chip structure description - * 01-17-2005 dmarlin added extended commands for AG-AND device and added option - * for BBT_AUTO_REFRESH. - * 01-20-2005 dmarlin added optional pointer to hardware specific callback for - * extra error status checks. + * Changelog: + * See git changelog. */ #ifndef __LINUX_MTD_NAND_H #define __LINUX_MTD_NAND_H -#include #include #include #include @@ -67,10 +30,6 @@ extern int nand_scan (struct mtd_info *mtd, int max_chips); /* Free resources held by the NAND device */ extern void nand_release (struct mtd_info *mtd); -/* Read raw data from the device without ECC */ -extern int nand_read_raw (struct mtd_info *mtd, uint8_t *buf, loff_t from, size_t len, size_t ooblen); - - /* The maximum number of NAND chips in an array */ #define NAND_MAX_CHIPS 8 @@ -79,44 +38,45 @@ extern int nand_read_raw (struct mtd_info *mtd, uint8_t *buf, loff_t from, size_ * adjust this accordingly. */ #define NAND_MAX_OOBSIZE 64 +#define NAND_MAX_PAGESIZE 2048 /* * Constants for hardware specific CLE/ALE/NCE function -*/ + * + * These are bits which can be or'ed to set/clear multiple + * bits in one go. + */ /* Select the chip by setting nCE to low */ -#define NAND_CTL_SETNCE 1 -/* Deselect the chip by setting nCE to high */ -#define NAND_CTL_CLRNCE 2 +#define NAND_NCE 0x01 /* Select the command latch by setting CLE to high */ -#define NAND_CTL_SETCLE 3 -/* Deselect the command latch by setting CLE to low */ -#define NAND_CTL_CLRCLE 4 +#define NAND_CLE 0x02 /* Select the address latch by setting ALE to high */ -#define NAND_CTL_SETALE 5 -/* Deselect the address latch by setting ALE to low */ -#define NAND_CTL_CLRALE 6 -/* Set write protection by setting WP to high. Not used! */ -#define NAND_CTL_SETWP 7 -/* Clear write protection by setting WP to low. Not used! */ -#define NAND_CTL_CLRWP 8 +#define NAND_ALE 0x04 + +#define NAND_CTRL_CLE (NAND_NCE | NAND_CLE) +#define NAND_CTRL_ALE (NAND_NCE | NAND_ALE) +#define NAND_CTRL_CHANGE 0x80 /* * Standard NAND flash commands */ #define NAND_CMD_READ0 0 #define NAND_CMD_READ1 1 +#define NAND_CMD_RNDOUT 5 #define NAND_CMD_PAGEPROG 0x10 #define NAND_CMD_READOOB 0x50 #define NAND_CMD_ERASE1 0x60 #define NAND_CMD_STATUS 0x70 #define NAND_CMD_STATUS_MULTI 0x71 #define NAND_CMD_SEQIN 0x80 +#define NAND_CMD_RNDIN 0x85 #define NAND_CMD_READID 0x90 #define NAND_CMD_ERASE2 0xd0 #define NAND_CMD_RESET 0xff /* Extended commands for large page devices */ #define NAND_CMD_READSTART 0x30 +#define NAND_CMD_RNDOUTSTART 0xE0 #define NAND_CMD_CACHEDPROG 0x15 /* Extended commands for AG-AND device */ @@ -138,6 +98,8 @@ extern int nand_read_raw (struct mtd_info *mtd, uint8_t *buf, loff_t from, size_ #define NAND_CMD_STATUS_RESET 0x7f #define NAND_CMD_STATUS_CLEAR 0xff +#define NAND_CMD_NONE -1 + /* Status bits */ #define NAND_STATUS_FAIL 0x01 #define NAND_STATUS_FAIL_N1 0x02 @@ -148,21 +110,12 @@ extern int nand_read_raw (struct mtd_info *mtd, uint8_t *buf, loff_t from, size_ /* * Constants for ECC_MODES */ - -/* No ECC. Usage is not recommended ! */ -#define NAND_ECC_NONE 0 -/* Software ECC 3 byte ECC per 256 Byte data */ -#define NAND_ECC_SOFT 1 -/* Hardware ECC 3 byte ECC per 256 Byte data */ -#define NAND_ECC_HW3_256 2 -/* Hardware ECC 3 byte ECC per 512 Byte data */ -#define NAND_ECC_HW3_512 3 -/* Hardware ECC 3 byte ECC per 512 Byte data */ -#define NAND_ECC_HW6_512 4 -/* Hardware ECC 8 byte ECC per 512 Byte data */ -#define NAND_ECC_HW8_512 6 -/* Hardware ECC 12 byte ECC per 2048 Byte data */ -#define NAND_ECC_HW12_2048 7 +typedef enum { + NAND_ECC_NONE, + NAND_ECC_SOFT, + NAND_ECC_HW, + NAND_ECC_HW_SYNDROME, +} nand_ecc_modes_t; /* * Constants for Hardware ECC @@ -201,6 +154,10 @@ extern int nand_read_raw (struct mtd_info *mtd, uint8_t *buf, loff_t from, size_ * bits from adjacent blocks from 'leaking' in altering data. * This happens with the Renesas AG-AND chips, possibly others. */ #define BBT_AUTO_REFRESH 0x00000080 +/* Chip does not require ready check on read. True + * for all large page devices, as they do not support + * autoincrement.*/ +#define NAND_NO_READRDY 0x00000100 /* Options valid for Samsung large page devices */ #define NAND_SAMSUNG_LP_OPTIONS \ @@ -219,18 +176,12 @@ extern int nand_read_raw (struct mtd_info *mtd, uint8_t *buf, loff_t from, size_ /* Use a flash based bad block table. This option is passed to the * default bad block table function. */ #define NAND_USE_FLASH_BBT 0x00010000 -/* The hw ecc generator provides a syndrome instead a ecc value on read - * This can only work if we have the ecc bytes directly behind the - * data bytes. Applies for DOC and AG-AND Renesas HW Reed Solomon generators */ -#define NAND_HWECC_SYNDROME 0x00020000 /* This option skips the bbt scan during initialization. */ -#define NAND_SKIP_BBTSCAN 0x00040000 +#define NAND_SKIP_BBTSCAN 0x00020000 /* Options set by nand scan */ -/* Nand scan has allocated oob_buf */ -#define NAND_OOBBUF_ALLOC 0x40000000 -/* Nand scan has allocated data_buf */ -#define NAND_DATABUF_ALLOC 0x80000000 +/* Nand scan has allocated controller struct */ +#define NAND_CONTROLLER_ALLOC 0x80000000 /* @@ -251,7 +202,7 @@ typedef enum { struct nand_chip; /** - * struct nand_hw_control - Control structure for hardware controller (e.g ECC generator) shared among independend devices + * struct nand_hw_control - Control structure for hardware controller (e.g ECC generator) shared among independent devices * @lock: protection lock * @active: the mtd device which holds the controller currently * @wq: wait queue to sleep on if a NAND operation is in progress @@ -263,46 +214,110 @@ struct nand_hw_control { wait_queue_head_t wq; }; +/** + * struct nand_ecc_ctrl - Control structure for ecc + * @mode: ecc mode + * @steps: number of ecc steps per page + * @size: data bytes per ecc step + * @bytes: ecc bytes per step + * @total: total number of ecc bytes per page + * @prepad: padding information for syndrome based ecc generators + * @postpad: padding information for syndrome based ecc generators + * @layout: ECC layout control struct pointer + * @hwctl: function to control hardware ecc generator. Must only + * be provided if an hardware ECC is available + * @calculate: function for ecc calculation or readback from ecc hardware + * @correct: function for ecc correction, matching to ecc generator (sw/hw) + * @read_page: function to read a page according to the ecc generator requirements + * @write_page: function to write a page according to the ecc generator requirements + * @read_oob: function to read chip OOB data + * @write_oob: function to write chip OOB data + */ +struct nand_ecc_ctrl { + nand_ecc_modes_t mode; + int steps; + int size; + int bytes; + int total; + int prepad; + int postpad; + struct nand_ecclayout *layout; + void (*hwctl)(struct mtd_info *mtd, int mode); + int (*calculate)(struct mtd_info *mtd, + const uint8_t *dat, + uint8_t *ecc_code); + int (*correct)(struct mtd_info *mtd, uint8_t *dat, + uint8_t *read_ecc, + uint8_t *calc_ecc); + int (*read_page)(struct mtd_info *mtd, + struct nand_chip *chip, + uint8_t *buf); + void (*write_page)(struct mtd_info *mtd, + struct nand_chip *chip, + const uint8_t *buf); + int (*read_oob)(struct mtd_info *mtd, + struct nand_chip *chip, + int page, + int sndcmd); + int (*write_oob)(struct mtd_info *mtd, + struct nand_chip *chip, + int page); +}; + +/** + * struct nand_buffers - buffer structure for read/write + * @ecccalc: buffer for calculated ecc + * @ecccode: buffer for ecc read from flash + * @oobwbuf: buffer for write oob data + * @databuf: buffer for data - dynamically sized + * @oobrbuf: buffer to read oob data + * + * Do not change the order of buffers. databuf and oobrbuf must be in + * consecutive order. + */ +struct nand_buffers { + uint8_t ecccalc[NAND_MAX_OOBSIZE]; + uint8_t ecccode[NAND_MAX_OOBSIZE]; + uint8_t oobwbuf[NAND_MAX_OOBSIZE]; + uint8_t databuf[NAND_MAX_PAGESIZE]; + uint8_t oobrbuf[NAND_MAX_OOBSIZE]; +}; + /** * struct nand_chip - NAND Private Flash Chip Data * @IO_ADDR_R: [BOARDSPECIFIC] address to read the 8 I/O lines of the flash device * @IO_ADDR_W: [BOARDSPECIFIC] address to write the 8 I/O lines of the flash device * @read_byte: [REPLACEABLE] read one byte from the chip - * @write_byte: [REPLACEABLE] write one byte to the chip * @read_word: [REPLACEABLE] read one word from the chip - * @write_word: [REPLACEABLE] write one word to the chip * @write_buf: [REPLACEABLE] write data from the buffer to the chip * @read_buf: [REPLACEABLE] read data from the chip into the buffer * @verify_buf: [REPLACEABLE] verify buffer contents against the chip data * @select_chip: [REPLACEABLE] select chip nr * @block_bad: [REPLACEABLE] check, if the block is bad * @block_markbad: [REPLACEABLE] mark the block bad - * @hwcontrol: [BOARDSPECIFIC] hardwarespecific function for accesing control-lines + * @cmd_ctrl: [BOARDSPECIFIC] hardwarespecific funtion for controlling + * ALE/CLE/nCE. Also used to write command and address * @dev_ready: [BOARDSPECIFIC] hardwarespecific function for accesing device ready/busy line * If set to NULL no access to ready/busy is available and the ready/busy information * is read from the chip status register * @cmdfunc: [REPLACEABLE] hardwarespecific function for writing commands to the chip * @waitfunc: [REPLACEABLE] hardwarespecific function for wait on ready - * @calculate_ecc: [REPLACEABLE] function for ecc calculation or readback from ecc hardware - * @correct_data: [REPLACEABLE] function for ecc correction, matching to ecc generator (sw/hw) - * @enable_hwecc: [BOARDSPECIFIC] function to enable (reset) hardware ecc generator. Must only - * be provided if a hardware ECC is available + * @ecc: [BOARDSPECIFIC] ecc control ctructure + * @buffers: buffer structure for read/write + * @hwcontrol: platform-specific hardware control structure + * @ops: oob operation operands * @erase_cmd: [INTERN] erase command write function, selectable due to AND support * @scan_bbt: [REPLACEABLE] function to scan bad block table - * @eccmode: [BOARDSPECIFIC] mode of ecc, see defines - * @eccsize: [INTERN] databytes used per ecc-calculation - * @eccbytes: [INTERN] number of ecc bytes per ecc-calculation step - * @eccsteps: [INTERN] number of ecc calculation steps per page * @chip_delay: [BOARDSPECIFIC] chip dependent delay for transfering data from array to read regs (tR) - * @chip_lock: [INTERN] spinlock used to protect access to this structure and the chip * @wq: [INTERN] wait queue to sleep on if a NAND operation is in progress - * @state: [INTERN] the current state of the NAND device + * @state: [INTERN] the current state of the NAND device + * @oob_poi: poison value buffer * @page_shift: [INTERN] number of address bits in a page (column address bits) * @phys_erase_shift: [INTERN] number of address bits in a physical eraseblock * @bbt_erase_shift: [INTERN] number of address bits in a bbt entry * @chip_shift: [INTERN] number of address bits in one chip - * @data_buf: [INTERN] internal buffer for one page + oob - * @oob_buf: [INTERN] oob buffer for one eraseblock + * @datbuf: [INTERN] internal buffer for one page + oob + * @oobbuf: [INTERN] oob buffer for one eraseblock * @oobdirty: [INTERN] indicates that oob_buf must be reinitialized * @data_poi: [INTERN] pointer to a data buffer * @options: [BOARDSPECIFIC] various chip options. They can partly be set to inform nand_scan about @@ -312,12 +327,13 @@ struct nand_hw_control { * @chipsize: [INTERN] the size of one chip for multichip arrays * @pagemask: [INTERN] page number mask = number of (pages / chip) - 1 * @pagebuf: [INTERN] holds the pagenumber which is currently in data_buf - * @autooob: [REPLACEABLE] the default (auto)placement scheme + * @ecclayout: [REPLACEABLE] the default ecc placement scheme * @bbt: [INTERN] bad block table pointer * @bbt_td: [REPLACEABLE] bad block table descriptor for flash lookup * @bbt_md: [REPLACEABLE] bad block table mirror descriptor * @badblock_pattern: [REPLACEABLE] bad block scan pattern used for initial bad block scan - * @controller: [OPTIONAL] a pointer to a hardware controller structure which is shared among multiple independend devices + * @controller: [REPLACEABLE] a pointer to a hardware controller structure + * which is shared among multiple independend devices * @priv: [OPTIONAL] pointer to private chip date * @errstat: [OPTIONAL] hardware specific function to perform additional error status checks * (determine if errors are correctable) @@ -325,58 +341,57 @@ struct nand_hw_control { struct nand_chip { void __iomem *IO_ADDR_R; - void __iomem *IO_ADDR_W; + void __iomem *IO_ADDR_W; - u_char (*read_byte)(struct mtd_info *mtd); - void (*write_byte)(struct mtd_info *mtd, u_char byte); + uint8_t (*read_byte)(struct mtd_info *mtd); u16 (*read_word)(struct mtd_info *mtd); - void (*write_word)(struct mtd_info *mtd, u16 word); - - void (*write_buf)(struct mtd_info *mtd, const u_char *buf, int len); - void (*read_buf)(struct mtd_info *mtd, u_char *buf, int len); - int (*verify_buf)(struct mtd_info *mtd, const u_char *buf, int len); + void (*write_buf)(struct mtd_info *mtd, const uint8_t *buf, int len); + void (*read_buf)(struct mtd_info *mtd, uint8_t *buf, int len); + int (*verify_buf)(struct mtd_info *mtd, const uint8_t *buf, int len); void (*select_chip)(struct mtd_info *mtd, int chip); int (*block_bad)(struct mtd_info *mtd, loff_t ofs, int getchip); int (*block_markbad)(struct mtd_info *mtd, loff_t ofs); - void (*hwcontrol)(struct mtd_info *mtd, int cmd); - int (*dev_ready)(struct mtd_info *mtd); - void (*cmdfunc)(struct mtd_info *mtd, unsigned command, int column, int page_addr); - int (*waitfunc)(struct mtd_info *mtd, struct nand_chip *this, int state); - int (*calculate_ecc)(struct mtd_info *mtd, const u_char *dat, u_char *ecc_code); - int (*correct_data)(struct mtd_info *mtd, u_char *dat, u_char *read_ecc, u_char *calc_ecc); - void (*enable_hwecc)(struct mtd_info *mtd, int mode); + void (*cmd_ctrl)(struct mtd_info *mtd, int dat, + unsigned int ctrl); + int (*dev_ready)(struct mtd_info *mtd); + void (*cmdfunc)(struct mtd_info *mtd, unsigned command, int column, int page_addr); + int (*waitfunc)(struct mtd_info *mtd, struct nand_chip *this); void (*erase_cmd)(struct mtd_info *mtd, int page); int (*scan_bbt)(struct mtd_info *mtd); - int eccmode; - int eccsize; - int eccbytes; - int eccsteps; - int chip_delay; - spinlock_t chip_lock; - wait_queue_head_t wq; - nand_state_t state; - int page_shift; + int (*errstat)(struct mtd_info *mtd, struct nand_chip *this, int state, int status, int page); + + int chip_delay; + unsigned int options; + + int page_shift; int phys_erase_shift; int bbt_erase_shift; int chip_shift; - u_char *data_buf; - u_char *oob_buf; - int oobdirty; - u_char *data_poi; - unsigned int options; - int badblockpos; int numchips; unsigned long chipsize; int pagemask; int pagebuf; - struct nand_oobinfo *autooob; + int badblockpos; + + nand_state_t state; + + uint8_t *oob_poi; + struct nand_hw_control *controller; + struct nand_ecclayout *ecclayout; + + struct nand_ecc_ctrl ecc; + struct nand_buffers buffers; + struct nand_hw_control hwcontrol; + + struct mtd_oob_ops ops; + uint8_t *bbt; struct nand_bbt_descr *bbt_td; struct nand_bbt_descr *bbt_md; + struct nand_bbt_descr *badblock_pattern; - struct nand_hw_control *controller; + void *priv; - int (*errstat)(struct mtd_info *mtd, struct nand_chip *this, int state, int status, int page); }; /* @@ -388,19 +403,18 @@ struct nand_chip { #define NAND_MFR_NATIONAL 0x8f #define NAND_MFR_RENESAS 0x07 #define NAND_MFR_STMICRO 0x20 -#define NAND_MFR_HYNIX 0xad +#define NAND_MFR_HYNIX 0xad /** * struct nand_flash_dev - NAND Flash Device ID Structure - * - * @name: Identify the device type - * @id: device ID code - * @pagesize: Pagesize in bytes. Either 256 or 512 or 0 + * @name: Identify the device type + * @id: device ID code + * @pagesize: Pagesize in bytes. Either 256 or 512 or 0 * If the pagesize is 0, then the real pagesize * and the eraseize are determined from the * extended id bytes in the chip - * @erasesize: Size of an erase block in the flash device. - * @chipsize: Total chipsize in Mega Bytes + * @erasesize: Size of an erase block in the flash device. + * @chipsize: Total chipsize in Mega Bytes * @options: Bitfield to store chip relevant options */ struct nand_flash_dev { @@ -415,7 +429,7 @@ struct nand_flash_dev { /** * struct nand_manufacturers - NAND Flash Manufacturer ID Structure * @name: Manufacturer name - * @id: manufacturer ID code of device. + * @id: manufacturer ID code of device. */ struct nand_manufacturers { int id; @@ -455,7 +469,7 @@ struct nand_bbt_descr { int veroffs; uint8_t version[NAND_MAX_CHIPS]; int len; - int maxblocks; + int maxblocks; int reserved_block_code; uint8_t *pattern; }; @@ -494,14 +508,14 @@ struct nand_bbt_descr { /* The maximum number of blocks to scan for a bbt */ #define NAND_BBT_SCAN_MAXBLOCKS 4 -extern int nand_scan_bbt (struct mtd_info *mtd, struct nand_bbt_descr *bd); -extern int nand_update_bbt (struct mtd_info *mtd, loff_t offs); -extern int nand_default_bbt (struct mtd_info *mtd); -extern int nand_isbad_bbt (struct mtd_info *mtd, loff_t offs, int allowbbt); -extern int nand_erase_nand (struct mtd_info *mtd, struct erase_info *instr, int allowbbt); -extern int nand_do_read_ecc (struct mtd_info *mtd, loff_t from, size_t len, - size_t * retlen, u_char * buf, u_char * oob_buf, - struct nand_oobinfo *oobsel, int flags); +extern int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd); +extern int nand_update_bbt(struct mtd_info *mtd, loff_t offs); +extern int nand_default_bbt(struct mtd_info *mtd); +extern int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt); +extern int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr, + int allowbbt); +extern int nand_do_read(struct mtd_info *mtd, loff_t from, size_t len, + size_t * retlen, uint8_t * buf); /* * Constants for oob configuration @@ -509,4 +523,51 @@ extern int nand_do_read_ecc (struct mtd_info *mtd, loff_t from, size_t len, #define NAND_SMALL_BADBLOCK_POS 5 #define NAND_LARGE_BADBLOCK_POS 0 +/** + * struct platform_nand_chip - chip level device structure + * @nr_chips: max. number of chips to scan for + * @chip_offset: chip number offset + * @nr_partitions: number of partitions pointed to by partitions (or zero) + * @partitions: mtd partition list + * @chip_delay: R/B delay value in us + * @options: Option flags, e.g. 16bit buswidth + * @ecclayout: ecc layout info structure + * @priv: hardware controller specific settings + */ +struct platform_nand_chip { + int nr_chips; + int chip_offset; + int nr_partitions; + struct mtd_partition *partitions; + struct nand_ecclayout *ecclayout; + int chip_delay; + unsigned int options; + void *priv; +}; + +/** + * struct platform_nand_ctrl - controller level device structure + * @hwcontrol: platform specific hardware control structure + * @dev_ready: platform specific function to read ready/busy pin + * @select_chip: platform specific chip select function + * @priv: private data to transport driver specific settings + * + * All fields are optional and depend on the hardware driver requirements + */ +struct platform_nand_ctrl { + void (*hwcontrol)(struct mtd_info *mtd, int cmd); + int (*dev_ready)(struct mtd_info *mtd); + void (*select_chip)(struct mtd_info *mtd, int chip); + void *priv; +}; + +/* Some helpers to access the data structures */ +static inline +struct platform_nand_chip *get_platform_nandchip(struct mtd_info *mtd) +{ + struct nand_chip *chip = mtd->priv; + + return chip->priv; +} + #endif /* __LINUX_MTD_NAND_H */ diff --git a/include/linux/mtd/nftl.h b/include/linux/mtd/nftl.h index d35d2c21f..bcf2fb3fa 100644 --- a/include/linux/mtd/nftl.h +++ b/include/linux/mtd/nftl.h @@ -37,7 +37,7 @@ struct NFTLrecord { unsigned int nb_blocks; /* number of physical blocks */ unsigned int nb_boot_blocks; /* number of blocks used by the bios */ struct erase_info instr; - struct nand_oobinfo oobinfo; + struct nand_ecclayout oobinfo; }; int NFTL_mount(struct NFTLrecord *s); diff --git a/include/linux/mtd/onenand.h b/include/linux/mtd/onenand.h index 7419b5fab..1f4972155 100644 --- a/include/linux/mtd/onenand.h +++ b/include/linux/mtd/onenand.h @@ -23,7 +23,7 @@ extern int onenand_scan(struct mtd_info *mtd, int max_chips); /* Free resources held by the OneNAND device */ extern void onenand_release(struct mtd_info *mtd); -/** +/* * onenand_state_t - chip states * Enumeration for OneNAND flash chip state */ @@ -35,14 +35,16 @@ typedef enum { FL_SYNCING, FL_UNLOCKING, FL_LOCKING, + FL_RESETING, + FL_OTPING, FL_PM_SUSPENDED, } onenand_state_t; /** * struct onenand_bufferram - OneNAND BufferRAM Data - * @param block block address in BufferRAM - * @param page page address in BufferRAM - * @param valid valid flag + * @block: block address in BufferRAM + * @page: page address in BufferRAM + * @valid: valid flag */ struct onenand_bufferram { int block; @@ -52,32 +54,43 @@ struct onenand_bufferram { /** * struct onenand_chip - OneNAND Private Flash Chip Data - * @param base [BOARDSPECIFIC] address to access OneNAND - * @param chipsize [INTERN] the size of one chip for multichip arrays - * @param device_id [INTERN] device ID - * @param verstion_id [INTERN] version ID - * @param options [BOARDSPECIFIC] various chip options. They can partly be set to inform onenand_scan about - * @param erase_shift [INTERN] number of address bits in a block - * @param page_shift [INTERN] number of address bits in a page - * @param ppb_shift [INTERN] number of address bits in a pages per block - * @param page_mask [INTERN] a page per block mask - * @param bufferam_index [INTERN] BufferRAM index - * @param bufferam [INTERN] BufferRAM info - * @param readw [REPLACEABLE] hardware specific function for read short - * @param writew [REPLACEABLE] hardware specific function for write short - * @param command [REPLACEABLE] hardware specific function for writing commands to the chip - * @param wait [REPLACEABLE] hardware specific function for wait on ready - * @param read_bufferram [REPLACEABLE] hardware specific function for BufferRAM Area - * @param write_bufferram [REPLACEABLE] hardware specific function for BufferRAM Area - * @param read_word [REPLACEABLE] hardware specific function for read register of OneNAND - * @param write_word [REPLACEABLE] hardware specific function for write register of OneNAND - * @param scan_bbt [REPLACEALBE] hardware specific function for scaning Bad block Table - * @param chip_lock [INTERN] spinlock used to protect access to this structure and the chip - * @param wq [INTERN] wait queue to sleep on if a OneNAND operation is in progress - * @param state [INTERN] the current state of the OneNAND device - * @param autooob [REPLACEABLE] the default (auto)placement scheme - * @param bbm [REPLACEABLE] pointer to Bad Block Management - * @param priv [OPTIONAL] pointer to private chip date + * @base: [BOARDSPECIFIC] address to access OneNAND + * @chipsize: [INTERN] the size of one chip for multichip arrays + * @device_id: [INTERN] device ID + * @density_mask: chip density, used for DDP devices + * @verstion_id: [INTERN] version ID + * @options: [BOARDSPECIFIC] various chip options. They can + * partly be set to inform onenand_scan about + * @erase_shift: [INTERN] number of address bits in a block + * @page_shift: [INTERN] number of address bits in a page + * @ppb_shift: [INTERN] number of address bits in a pages per block + * @page_mask: [INTERN] a page per block mask + * @bufferram_index: [INTERN] BufferRAM index + * @bufferram: [INTERN] BufferRAM info + * @readw: [REPLACEABLE] hardware specific function for read short + * @writew: [REPLACEABLE] hardware specific function for write short + * @command: [REPLACEABLE] hardware specific function for writing + * commands to the chip + * @wait: [REPLACEABLE] hardware specific function for wait on ready + * @read_bufferram: [REPLACEABLE] hardware specific function for BufferRAM Area + * @write_bufferram: [REPLACEABLE] hardware specific function for BufferRAM Area + * @read_word: [REPLACEABLE] hardware specific function for read + * register of OneNAND + * @write_word: [REPLACEABLE] hardware specific function for write + * register of OneNAND + * @mmcontrol: sync burst read function + * @block_markbad: function to mark a block as bad + * @scan_bbt: [REPLACEALBE] hardware specific function for scanning + * Bad block Table + * @chip_lock: [INTERN] spinlock used to protect access to this + * structure and the chip + * @wq: [INTERN] wait queue to sleep on if a OneNAND + * operation is in progress + * @state: [INTERN] the current state of the OneNAND device + * @page_buf: data buffer + * @ecclayout: [REPLACEABLE] the default ecc placement scheme + * @bbm: [REPLACEABLE] pointer to Bad Block Management + * @priv: [OPTIONAL] pointer to private chip date */ struct onenand_chip { void __iomem *base; @@ -111,9 +124,9 @@ struct onenand_chip { onenand_state_t state; unsigned char *page_buf; - struct nand_oobinfo *autooob; + struct nand_ecclayout *ecclayout; - void *bbm; + void *bbm; void *priv; }; @@ -130,6 +143,9 @@ struct onenand_chip { #define ONENAND_SET_SYS_CFG1(v, this) \ (this->write_word(v, this->base + ONENAND_REG_SYS_CFG1)) +/* Check byte access in OneNAND */ +#define ONENAND_CHECK_BYTE_ACCESS(addr) (addr & 0x1) + /* * Options bits */ @@ -142,9 +158,9 @@ struct onenand_chip { #define ONENAND_MFR_SAMSUNG 0xec /** - * struct nand_manufacturers - NAND Flash Manufacturer ID Structure - * @param name: Manufacturer name - * @param id: manufacturer ID code of device. + * struct onenand_manufacturers - NAND Flash Manufacturer ID Structure + * @name: Manufacturer name + * @id: manufacturer ID code of device. */ struct onenand_manufacturers { int id; diff --git a/include/linux/mtd/onenand_regs.h b/include/linux/mtd/onenand_regs.h index d7832ef8e..4a72818d2 100644 --- a/include/linux/mtd/onenand_regs.h +++ b/include/linux/mtd/onenand_regs.h @@ -112,6 +112,7 @@ #define ONENAND_CMD_LOCK_TIGHT (0x2C) #define ONENAND_CMD_ERASE (0x94) #define ONENAND_CMD_RESET (0xF0) +#define ONENAND_CMD_OTP_ACCESS (0x65) #define ONENAND_CMD_READID (0x90) /* NOTE: Those are not *REAL* commands */ @@ -152,6 +153,8 @@ #define ONENAND_CTRL_ERASE (1 << 11) #define ONENAND_CTRL_ERROR (1 << 10) #define ONENAND_CTRL_RSTB (1 << 7) +#define ONENAND_CTRL_OTP_L (1 << 6) +#define ONENAND_CTRL_OTP_BL (1 << 5) /* * Interrupt Status Register F241h (R) @@ -177,4 +180,9 @@ #define ONENAND_ECC_2BIT (1 << 1) #define ONENAND_ECC_2BIT_ALL (0xAAAA) +/* + * One-Time Programmable (OTP) + */ +#define ONENAND_OTP_LOCK_OFFSET (14) + #endif /* __ONENAND_REG_H */ diff --git a/include/linux/mtd/partitions.h b/include/linux/mtd/partitions.h index b03f512d5..da6b3d6f1 100644 --- a/include/linux/mtd/partitions.h +++ b/include/linux/mtd/partitions.h @@ -41,7 +41,7 @@ struct mtd_partition { u_int32_t size; /* partition size */ u_int32_t offset; /* offset within the master MTD space */ u_int32_t mask_flags; /* master MTD flags to mask out for this partition */ - struct nand_oobinfo *oobsel; /* out of band layout for this partition (NAND only)*/ + struct nand_ecclayout *ecclayout; /* out of band layout for this partition (NAND only)*/ struct mtd_info **mtdp; /* pointer to store the MTD object */ }; diff --git a/include/linux/mtd/physmap.h b/include/linux/mtd/physmap.h index 05aa49706..86831e359 100644 --- a/include/linux/mtd/physmap.h +++ b/include/linux/mtd/physmap.h @@ -1,8 +1,8 @@ /* - * For boards with physically mapped flash and using + * For boards with physically mapped flash and using * drivers/mtd/maps/physmap.c mapping driver. * - * $Id: physmap.h,v 1.3 2004/07/21 00:16:15 jwboyer Exp $ + * $Id: physmap.h,v 1.4 2005/11/07 11:14:55 gleixner Exp $ * * Copyright (C) 2003 MontaVista Software Inc. * Author: Jun Sun, jsun@mvista.com or jsun@junsun.net @@ -15,47 +15,38 @@ */ #ifndef __LINUX_MTD_PHYSMAP__ - -#include - -#if defined(CONFIG_MTD_PHYSMAP) +#define __LINUX_MTD_PHYSMAP__ #include #include #include -/* - * The map_info for physmap. Board can override size, buswidth, phys, - * (*set_vpp)(), etc in their initial setup routine. - */ -extern struct map_info physmap_map; +struct physmap_flash_data { + unsigned int width; + void (*set_vpp)(struct map_info *, int); + unsigned int nr_parts; + struct mtd_partition *parts; +}; /* * Board needs to specify the exact mapping during their setup time. */ -static inline void physmap_configure(unsigned long addr, unsigned long size, int bankwidth, void (*set_vpp)(struct map_info *, int) ) -{ - physmap_map.phys = addr; - physmap_map.size = size; - physmap_map.bankwidth = bankwidth; - physmap_map.set_vpp = set_vpp; -} +void physmap_configure(unsigned long addr, unsigned long size, + int bankwidth, void (*set_vpp)(struct map_info *, int) ); -#if defined(CONFIG_MTD_PARTITIONS) +#ifdef CONFIG_MTD_PARTITIONS /* - * Machines that wish to do flash partition may want to call this function in - * their setup routine. + * Machines that wish to do flash partition may want to call this function in + * their setup routine. * * physmap_set_partitions(mypartitions, num_parts); * - * Note that one can always override this hard-coded partition with + * Note that one can always override this hard-coded partition with * command line partition (you need to enable CONFIG_MTD_CMDLINE_PARTS). */ void physmap_set_partitions(struct mtd_partition *parts, int num_parts); #endif /* defined(CONFIG_MTD_PARTITIONS) */ -#endif /* defined(CONFIG_MTD) */ #endif /* __LINUX_MTD_PHYSMAP__ */ - diff --git a/include/linux/mtd/xip.h b/include/linux/mtd/xip.h index fc071125c..e9d40bdde 100644 --- a/include/linux/mtd/xip.h +++ b/include/linux/mtd/xip.h @@ -12,29 +12,28 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * - * $Id: xip.h,v 1.2 2004/12/01 15:49:10 nico Exp $ + * $Id: xip.h,v 1.5 2005/11/07 11:14:55 gleixner Exp $ */ #ifndef __LINUX_MTD_XIP_H__ #define __LINUX_MTD_XIP_H__ -#include #ifdef CONFIG_MTD_XIP -/* - * Function that are modifying the flash state away from array mode must - * obviously not be running from flash. The __xipram is therefore marking - * those functions so they get relocated to ram. - */ -#define __xipram __attribute__ ((__section__ (".data"))) - /* * We really don't want gcc to guess anything. * We absolutely _need_ proper inlining. */ #include +/* + * Function that are modifying the flash state away from array mode must + * obviously not be running from flash. The __xipram is therefore marking + * those functions so they get relocated to ram. + */ +#define __xipram noinline __attribute__ ((__section__ (".data"))) + /* * Each architecture has to provide the following macros. They must access * the hardware directly and not rely on any other (XIP) functions since they @@ -58,22 +57,16 @@ * returned value is <= the real elapsed time. * note 2: this should be able to cope with a few seconds without * overflowing. + * + * xip_iprefetch() + * + * Macro to fill instruction prefetch + * e.g. a series of nops: asm volatile (".rep 8; nop; .endr"); */ -#if defined(CONFIG_ARCH_SA1100) || defined(CONFIG_ARCH_PXA) - -#include -#ifdef CONFIG_ARCH_PXA -#include -#endif - -#define xip_irqpending() (ICIP & ICMR) +#include -/* we sample OSCR and convert desired delta to usec (1/4 ~= 1000000/3686400) */ -#define xip_currtime() (OSCR) -#define xip_elapsed_since(x) (signed)((OSCR - (x)) / 4) - -#else +#ifndef xip_irqpending #warning "missing IRQ and timer primitives for XIP MTD support" #warning "some of the XIP MTD support code will be disabled" @@ -85,16 +78,17 @@ #endif +#ifndef xip_iprefetch +#define xip_iprefetch() do { } while (0) +#endif + /* * xip_cpu_idle() is used when waiting for a delay equal or larger than * the system timer tick period. This should put the CPU into idle mode * to save power and to be woken up only when some interrupts are pending. - * As above, this should not rely upon standard kernel code. + * This should not rely upon standard kernel code. */ - -#if defined(CONFIG_CPU_XSCALE) -#define xip_cpu_idle() asm volatile ("mcr p14, 0, %0, c7, c0, 0" :: "r" (1)) -#else +#ifndef xip_cpu_idle #define xip_cpu_idle() do { } while (0) #endif diff --git a/include/linux/mutex-debug.h b/include/linux/mutex-debug.h index 8b5769f00..2537285e1 100644 --- a/include/linux/mutex-debug.h +++ b/include/linux/mutex-debug.h @@ -2,22 +2,22 @@ #define __LINUX_MUTEX_DEBUG_H #include +#include /* * Mutexes - debugging helpers: */ -#define __DEBUG_MUTEX_INITIALIZER(lockname) \ - , .held_list = LIST_HEAD_INIT(lockname.held_list), \ - .name = #lockname , .magic = &lockname +#define __DEBUG_MUTEX_INITIALIZER(lockname) \ + , .magic = &lockname -#define mutex_init(sem) __mutex_init(sem, __FUNCTION__) +#define mutex_init(mutex) \ +do { \ + static struct lock_class_key __key; \ + \ + __mutex_init((mutex), #mutex, &__key); \ +} while (0) extern void FASTCALL(mutex_destroy(struct mutex *lock)); -extern void mutex_debug_show_all_locks(void); -extern void mutex_debug_show_held_locks(struct task_struct *filter); -extern void mutex_debug_check_no_locks_held(struct task_struct *task); -extern void mutex_debug_check_no_locks_freed(const void *from, unsigned long len); - #endif diff --git a/include/linux/mutex.h b/include/linux/mutex.h index f1ac507fa..27c48daa3 100644 --- a/include/linux/mutex.h +++ b/include/linux/mutex.h @@ -13,6 +13,7 @@ #include #include #include +#include #include @@ -50,11 +51,12 @@ struct mutex { struct list_head wait_list; #ifdef CONFIG_DEBUG_MUTEXES struct thread_info *owner; - struct list_head held_list; - unsigned long acquire_ip; const char *name; void *magic; #endif +#ifdef CONFIG_DEBUG_LOCK_ALLOC + struct lockdep_map dep_map; +#endif }; /* @@ -74,24 +76,34 @@ struct mutex_waiter { # include #else # define __DEBUG_MUTEX_INITIALIZER(lockname) -# define mutex_init(mutex) __mutex_init(mutex, NULL) +# define mutex_init(mutex) \ +do { \ + static struct lock_class_key __key; \ + \ + __mutex_init((mutex), #mutex, &__key); \ +} while (0) # define mutex_destroy(mutex) do { } while (0) -# define mutex_debug_show_all_locks() do { } while (0) -# define mutex_debug_show_held_locks(p) do { } while (0) -# define mutex_debug_check_no_locks_held(task) do { } while (0) -# define mutex_debug_check_no_locks_freed(from, len) do { } while (0) +#endif + +#ifdef CONFIG_DEBUG_LOCK_ALLOC +# define __DEP_MAP_MUTEX_INITIALIZER(lockname) \ + , .dep_map = { .name = #lockname } +#else +# define __DEP_MAP_MUTEX_INITIALIZER(lockname) #endif #define __MUTEX_INITIALIZER(lockname) \ { .count = ATOMIC_INIT(1) \ , .wait_lock = SPIN_LOCK_UNLOCKED \ , .wait_list = LIST_HEAD_INIT(lockname.wait_list) \ - __DEBUG_MUTEX_INITIALIZER(lockname) } + __DEBUG_MUTEX_INITIALIZER(lockname) \ + __DEP_MAP_MUTEX_INITIALIZER(lockname) } #define DEFINE_MUTEX(mutexname) \ struct mutex mutexname = __MUTEX_INITIALIZER(mutexname) -extern void fastcall __mutex_init(struct mutex *lock, const char *name); +extern void __mutex_init(struct mutex *lock, const char *name, + struct lock_class_key *key); /*** * mutex_is_locked - is the mutex locked @@ -110,6 +122,13 @@ static inline int fastcall mutex_is_locked(struct mutex *lock) */ extern void fastcall mutex_lock(struct mutex *lock); extern int fastcall mutex_lock_interruptible(struct mutex *lock); + +#ifdef CONFIG_DEBUG_LOCK_ALLOC +extern void mutex_lock_nested(struct mutex *lock, unsigned int subclass); +#else +# define mutex_lock_nested(lock, subclass) mutex_lock(lock) +#endif + /* * NOTE: mutex_trylock() follows the spin_trylock() convention, * not the down_trylock() convention! diff --git a/include/linux/nbd.h b/include/linux/nbd.h index a6ce409ec..e712e7d47 100644 --- a/include/linux/nbd.h +++ b/include/linux/nbd.h @@ -77,11 +77,11 @@ struct nbd_device { * server. All data are in network byte order. */ struct nbd_request { - u32 magic; - u32 type; /* == READ || == WRITE */ + __be32 magic; + __be32 type; /* == READ || == WRITE */ char handle[8]; - u64 from; - u32 len; + __be64 from; + __be32 len; } #ifdef __GNUC__ __attribute__ ((packed)) @@ -93,8 +93,8 @@ struct nbd_request { * it has completed an I/O request (or an error occurs). */ struct nbd_reply { - u32 magic; - u32 error; /* 0 = ok, else error */ + __be32 magic; + __be32 error; /* 0 = ok, else error */ char handle[8]; /* handle you got from request */ }; #endif diff --git a/include/linux/ncp_fs.h b/include/linux/ncp_fs.h index 96dc237b8..b208f0cd5 100644 --- a/include/linux/ncp_fs.h +++ b/include/linux/ncp_fs.h @@ -12,8 +12,6 @@ #include #include -#include -#include #include #include @@ -146,7 +144,8 @@ struct ncp_nls_ioctl #ifdef __KERNEL__ -#include +#include +#include /* undef because public define in umsdos_fs.h (ncp_fs.h isn't public) */ #undef PRINTK diff --git a/include/linux/net.h b/include/linux/net.h index 91ab7ba7d..d421f7d4e 100644 --- a/include/linux/net.h +++ b/include/linux/net.h @@ -18,9 +18,7 @@ #ifndef _LINUX_NET_H #define _LINUX_NET_H -#include #include -#include #include struct poll_table_struct; @@ -57,12 +55,14 @@ typedef enum { #define __SO_ACCEPTCON (1 << 16) /* performed a listen */ #ifdef __KERNEL__ +#include #define SOCK_ASYNC_NOSPACE 0 #define SOCK_ASYNC_WAITDATA 1 #define SOCK_NOSPACE 2 #define SOCK_PASSCRED 3 -#define SOCK_USER_SOCKET 4 +#define SOCK_PASSSEC 4 +#define SOCK_USER_SOCKET 5 #ifndef ARCH_HAS_SOCKET_TYPES /** diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index c5b97cf59..50a471951 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -34,9 +34,9 @@ #include #include -#include #include #include +#include struct divert_blk; struct vlan_group; @@ -313,9 +313,15 @@ struct net_device /* Segmentation offload features */ #define NETIF_F_GSO_SHIFT 16 +#define NETIF_F_GSO_MASK 0xffff0000 #define NETIF_F_TSO (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT) -#define NETIF_F_UFO (SKB_GSO_UDPV4 << NETIF_F_GSO_SHIFT) +#define NETIF_F_UFO (SKB_GSO_UDP << NETIF_F_GSO_SHIFT) #define NETIF_F_GSO_ROBUST (SKB_GSO_DODGY << NETIF_F_GSO_SHIFT) +#define NETIF_F_TSO_ECN (SKB_GSO_TCP_ECN << NETIF_F_GSO_SHIFT) +#define NETIF_F_TSO6 (SKB_GSO_TCPV6 << NETIF_F_GSO_SHIFT) + + /* List of features with software fallbacks. */ +#define NETIF_F_GSO_SOFTWARE (NETIF_F_TSO | NETIF_F_TSO_ECN | NETIF_F_TSO6) #define NETIF_F_GEN_CSUM (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM) #define NETIF_F_ALL_CSUM (NETIF_F_IP_CSUM | NETIF_F_GEN_CSUM) @@ -608,6 +614,9 @@ struct softnet_data struct sk_buff *completion_queue; struct net_device backlog_dev; /* Sorry. 8) */ +#ifdef CONFIG_NET_DMA + struct dma_chan *net_dma; +#endif }; DECLARE_PER_CPU(struct softnet_data,softnet_data); @@ -699,7 +708,6 @@ extern int dev_hard_start_xmit(struct sk_buff *skb, extern void dev_init(void); -extern int netdev_nit; extern int netdev_budget; /* Called by rtnetlink.c:rtnl_unlock() */ @@ -989,12 +997,17 @@ extern void dev_seq_stop(struct seq_file *seq, void *v); extern void linkwatch_run_queue(void); -static inline int skb_gso_ok(struct sk_buff *skb, int features) +static inline int net_gso_ok(int features, int gso_type) { - int feature = skb_shinfo(skb)->gso_type << NETIF_F_GSO_SHIFT; + int feature = gso_type << NETIF_F_GSO_SHIFT; return (features & feature) == feature; } +static inline int skb_gso_ok(struct sk_buff *skb, int features) +{ + return net_gso_ok(features, skb_shinfo(skb)->gso_type); +} + static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb) { return skb_is_gso(skb) && @@ -1002,6 +1015,30 @@ static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb) unlikely(skb->ip_summed != CHECKSUM_HW)); } +/* On bonding slaves other than the currently active slave, suppress + * duplicates except for 802.3ad ETH_P_SLOW and alb non-mcast/bcast. + */ +static inline int skb_bond_should_drop(struct sk_buff *skb) +{ + struct net_device *dev = skb->dev; + struct net_device *master = dev->master; + + if (master && + (dev->priv_flags & IFF_SLAVE_INACTIVE)) { + if (master->priv_flags & IFF_MASTER_ALB) { + if (skb->pkt_type != PACKET_BROADCAST && + skb->pkt_type != PACKET_MULTICAST) + return 0; + } + if (master->priv_flags & IFF_MASTER_8023AD && + skb->protocol == __constant_htons(ETH_P_SLOW)) + return 0; + + return 1; + } + return 0; +} + #endif /* __KERNEL__ */ #endif /* _LINUX_DEV_H */ diff --git a/include/linux/netfilter.h b/include/linux/netfilter.h index b31a9bca9..10168e26a 100644 --- a/include/linux/netfilter.h +++ b/include/linux/netfilter.h @@ -40,7 +40,6 @@ #endif #ifdef __KERNEL__ -#include #ifdef CONFIG_NETFILTER extern void netfilter_init(void); diff --git a/include/linux/netfilter/nf_conntrack_common.h b/include/linux/netfilter/nf_conntrack_common.h index 3ff88c878..d2e4bd7a7 100644 --- a/include/linux/netfilter/nf_conntrack_common.h +++ b/include/linux/netfilter/nf_conntrack_common.h @@ -69,6 +69,10 @@ enum ip_conntrack_status { /* Connection is dying (removed from lists), can not be unset. */ IPS_DYING_BIT = 9, IPS_DYING = (1 << IPS_DYING_BIT), + + /* Connection has fixed timeout. */ + IPS_FIXED_TIMEOUT_BIT = 10, + IPS_FIXED_TIMEOUT = (1 << IPS_FIXED_TIMEOUT_BIT), }; /* Connection tracking event bits */ diff --git a/include/linux/netfilter/nfnetlink_conntrack.h b/include/linux/netfilter/nfnetlink_conntrack.h index 668ec946c..b5883ccee 100644 --- a/include/linux/netfilter/nfnetlink_conntrack.h +++ b/include/linux/netfilter/nfnetlink_conntrack.h @@ -27,13 +27,15 @@ enum ctattr_type { CTA_STATUS, CTA_PROTOINFO, CTA_HELP, - CTA_NAT, + CTA_NAT_SRC, +#define CTA_NAT CTA_NAT_SRC /* backwards compatibility */ CTA_TIMEOUT, CTA_MARK, CTA_COUNTERS_ORIG, CTA_COUNTERS_REPLY, CTA_USE, CTA_ID, + CTA_NAT_DST, __CTA_MAX }; #define CTA_MAX (__CTA_MAX - 1) diff --git a/include/linux/netfilter/xt_conntrack.h b/include/linux/netfilter/xt_conntrack.h index 34f63cf2e..4c2d9945c 100644 --- a/include/linux/netfilter/xt_conntrack.h +++ b/include/linux/netfilter/xt_conntrack.h @@ -42,7 +42,7 @@ struct ip_conntrack_old_tuple } u; /* The protocol. */ - u16 protonum; + __u16 protonum; } dst; }; diff --git a/include/linux/netfilter_arp.h b/include/linux/netfilter_arp.h index a3f8977f7..92bc6ddcb 100644 --- a/include/linux/netfilter_arp.h +++ b/include/linux/netfilter_arp.h @@ -5,7 +5,6 @@ * (C)2002 Rusty Russell IBM -- This code is GPL. */ -#include #include /* There is no PF_ARP. */ diff --git a/include/linux/netfilter_bridge.h b/include/linux/netfilter_bridge.h index 178a97e1a..427c67ff8 100644 --- a/include/linux/netfilter_bridge.h +++ b/include/linux/netfilter_bridge.h @@ -4,10 +4,8 @@ /* bridge-specific defines for netfilter. */ -#include #include #if defined(__KERNEL__) && defined(CONFIG_BRIDGE_NETFILTER) -#include #include #endif @@ -47,8 +45,10 @@ enum nf_br_hook_priorities { #define BRNF_BRIDGED 0x08 #define BRNF_NF_BRIDGE_PREROUTING 0x10 + /* Only used in br_forward.c */ -static inline int nf_bridge_maybe_copy_header(struct sk_buff *skb) +static inline +int nf_bridge_maybe_copy_header(struct sk_buff *skb) { int err; @@ -88,6 +88,8 @@ struct bridge_skb_cb { __u32 ipv4; } daddr; }; + +extern int brnf_deferred_hooks; #endif /* CONFIG_BRIDGE_NETFILTER */ #endif /* __KERNEL__ */ diff --git a/include/linux/netfilter_ipv4.h b/include/linux/netfilter_ipv4.h index 85301c5e8..ce02c984f 100644 --- a/include/linux/netfilter_ipv4.h +++ b/include/linux/netfilter_ipv4.h @@ -5,7 +5,6 @@ * (C)1998 Rusty Russell -- This code is GPL. */ -#include #include /* only for userspace compatibility */ diff --git a/include/linux/netfilter_ipv4/ip_conntrack.h b/include/linux/netfilter_ipv4/ip_conntrack.h index a6c3d57e9..cfb454ae2 100644 --- a/include/linux/netfilter_ipv4/ip_conntrack.h +++ b/include/linux/netfilter_ipv4/ip_conntrack.h @@ -4,7 +4,6 @@ #include #ifdef __KERNEL__ -#include #include #include #include @@ -130,6 +129,10 @@ struct ip_conntrack u_int32_t priority; #endif +#ifdef CONFIG_IP_NF_CONNTRACK_SECMARK + u_int32_t secmark; +#endif + /* Traversed often, so hopefully in different cacheline to top */ /* These are my tuples; original and reply */ struct ip_conntrack_tuple_hash tuplehash[IP_CT_DIR_MAX]; @@ -163,6 +166,7 @@ struct ip_conntrack_expect unsigned int flags; #ifdef CONFIG_IP_NF_NAT_NEEDED + u_int32_t saved_ip; /* This is the original per-proto part, used to map the * expected connection the way the recipient expects. */ union ip_conntrack_manip_proto saved_proto; @@ -302,6 +306,7 @@ static inline int is_dying(struct ip_conntrack *ct) } extern unsigned int ip_conntrack_htable_size; +extern int ip_conntrack_checksum; #define CONNTRACK_STAT_INC(count) (__get_cpu_var(ip_conntrack_stat).count++) diff --git a/include/linux/netfilter_ipv4/ip_conntrack_h323.h b/include/linux/netfilter_ipv4/ip_conntrack_h323.h index eace86bd2..3cbff7379 100644 --- a/include/linux/netfilter_ipv4/ip_conntrack_h323.h +++ b/include/linux/netfilter_ipv4/ip_conntrack_h323.h @@ -71,6 +71,13 @@ extern int (*nat_h245_hook) (struct sk_buff ** pskb, struct ip_conntrack * ct, unsigned char **data, int dataoff, TransportAddress * addr, u_int16_t port, struct ip_conntrack_expect * exp); +extern int (*nat_callforwarding_hook) (struct sk_buff ** pskb, + struct ip_conntrack * ct, + enum ip_conntrack_info ctinfo, + unsigned char **data, int dataoff, + TransportAddress * addr, + u_int16_t port, + struct ip_conntrack_expect * exp); extern int (*nat_q931_hook) (struct sk_buff ** pskb, struct ip_conntrack * ct, enum ip_conntrack_info ctinfo, unsigned char **data, TransportAddress * addr, diff --git a/include/linux/netfilter_ipv4/ip_conntrack_helper_h323_types.h b/include/linux/netfilter_ipv4/ip_conntrack_helper_h323_types.h index cc98f7aa5..3d4a77379 100644 --- a/include/linux/netfilter_ipv4/ip_conntrack_helper_h323_types.h +++ b/include/linux/netfilter_ipv4/ip_conntrack_helper_h323_types.h @@ -1,4 +1,4 @@ -/* Generated by Jing Min Zhao's ASN.1 parser, Mar 15 2006 +/* Generated by Jing Min Zhao's ASN.1 parser, Apr 20 2006 * * Copyright (c) 2006 Jing Min Zhao * @@ -412,6 +412,7 @@ typedef struct Facility_UUIE { /* SEQUENCE */ eFacility_UUIE_destinationInfo = (1 << 14), eFacility_UUIE_h245SecurityMode = (1 << 13), } options; + TransportAddress alternativeAddress; FacilityReason reason; TransportAddress h245Address; Facility_UUIE_fastStart fastStart; diff --git a/include/linux/netfilter_ipv4/listhelp.h b/include/linux/netfilter_ipv4/listhelp.h index 360429f48..5d92cf044 100644 --- a/include/linux/netfilter_ipv4/listhelp.h +++ b/include/linux/netfilter_ipv4/listhelp.h @@ -1,6 +1,5 @@ #ifndef _LISTHELP_H #define _LISTHELP_H -#include #include /* Header to do more comprehensive job than linux/list.h; assume list diff --git a/include/linux/netlink.h b/include/linux/netlink.h index 87b8a5703..855b44668 100644 --- a/include/linux/netlink.h +++ b/include/linux/netlink.h @@ -5,7 +5,7 @@ #include #define NETLINK_ROUTE 0 /* Routing/device hook */ -#define NETLINK_W1 1 /* 1-wire subsystem */ +#define NETLINK_UNUSED 1 /* Unused number */ #define NETLINK_USERSOCK 2 /* Reserved for user mode socket protocols */ #define NETLINK_FIREWALL 3 /* Firewalling hook */ #define NETLINK_INET_DIAG 4 /* INET socket monitoring */ diff --git a/include/linux/netpoll.h b/include/linux/netpoll.h index ca5a87330..1efe60c5c 100644 --- a/include/linux/netpoll.h +++ b/include/linux/netpoll.h @@ -31,6 +31,7 @@ struct netpoll_info { int rx_flags; spinlock_t rx_lock; struct netpoll *rx_np; /* netpoll that registered an rx_hook */ + struct sk_buff_head arp_tx; /* list of arp requests to reply to */ }; void netpoll_poll(struct netpoll *np); diff --git a/include/linux/nfs.h b/include/linux/nfs.h index ca2ffa6ae..54af92c1c 100644 --- a/include/linux/nfs.h +++ b/include/linux/nfs.h @@ -7,9 +7,6 @@ #ifndef _LINUX_NFS_H #define _LINUX_NFS_H -#include -#include - #define NFS_PROGRAM 100003 #define NFS_PORT 2049 #define NFS_MAXDATA 8192 @@ -129,7 +126,10 @@ enum nfs_ftype { NFFIFO = 8 }; -#if defined(__KERNEL__) +#ifdef __KERNEL__ +#include +#include + /* * This is the kernel NFS client file handle representation */ diff --git a/include/linux/nfs4.h b/include/linux/nfs4.h index 0c1c306cd..db05182ca 100644 --- a/include/linux/nfs4.h +++ b/include/linux/nfs4.h @@ -14,7 +14,6 @@ #define _LINUX_NFS4_H #include -#include #define NFS4_VERIFIER_SIZE 8 #define NFS4_FHSIZE 128 @@ -97,6 +96,9 @@ enum nfs4_acl_whotype { NFS4_ACL_WHO_EVERYONE, }; +#ifdef __KERNEL__ +#include + struct nfs4_ace { uint32_t type; uint32_t flag; @@ -155,6 +157,12 @@ enum nfs_opnum4 { OP_ILLEGAL = 10044, }; +/*Defining first and last NFS4 operations implemented. +Needs to be updated if more operations are defined in future.*/ + +#define FIRST_NFS4_OP OP_ACCESS +#define LAST_NFS4_OP OP_RELEASE_LOCKOWNER + enum nfsstat4 { NFS4_OK = 0, NFS4ERR_PERM = 1, @@ -345,8 +353,6 @@ enum lock_type4 { #define NFS4_MINOR_VERSION 0 #define NFS4_DEBUG 1 -#ifdef __KERNEL__ - /* Index of predefined Linux client operations */ enum { @@ -384,6 +390,7 @@ enum { NFSPROC4_CLNT_DELEGRETURN, NFSPROC4_CLNT_GETACL, NFSPROC4_CLNT_SETACL, + NFSPROC4_CLNT_FS_LOCATIONS, }; #endif diff --git a/include/linux/nfs4_mount.h b/include/linux/nfs4_mount.h index 26b4c83f8..15199ccd7 100644 --- a/include/linux/nfs4_mount.h +++ b/include/linux/nfs4_mount.h @@ -65,6 +65,7 @@ struct nfs4_mount_data { #define NFS4_MOUNT_NOCTO 0x0010 /* 1 */ #define NFS4_MOUNT_NOAC 0x0020 /* 1 */ #define NFS4_MOUNT_STRICTLOCK 0x1000 /* 1 */ +#define NFS4_MOUNT_FSCACHE 0x4000 /* 1 */ #define NFS4_MOUNT_FLAGMASK 0xFFFF #endif diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index c71227dd4..821c628d0 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h @@ -9,27 +9,6 @@ #ifndef _LINUX_NFS_FS_H #define _LINUX_NFS_FS_H -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - /* * Enable debugging support for nfs client. * Requires RPC_DEBUG. @@ -47,11 +26,6 @@ */ #define NFS_SUPER_MAGIC 0x6969 -/* - * These are the default flags for swap requests - */ -#define NFS_RPC_SWAPFLAGS (RPC_TASK_SWAPPER|RPC_TASK_ROOTCREDS) - /* * When flushing a cluster of dirty pages, there can be different * strategies: @@ -61,9 +35,37 @@ #define FLUSH_LOWPRI 8 /* low priority background flush */ #define FLUSH_HIGHPRI 16 /* high priority memory reclaim flush */ #define FLUSH_NOCOMMIT 32 /* Don't send the NFSv3/v4 COMMIT */ +#define FLUSH_INVALIDATE 64 /* Invalidate the page cache */ #ifdef __KERNEL__ +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +/* + * These are the default flags for swap requests + */ +#define NFS_RPC_SWAPFLAGS (RPC_TASK_SWAPPER|RPC_TASK_ROOTCREDS) + /* * NFSv3/v4 Access mode cache entry */ @@ -179,6 +181,9 @@ struct nfs_inode { int delegation_state; struct rw_semaphore rwsem; #endif /* CONFIG_NFS_V4*/ +#ifdef CONFIG_NFS_FSCACHE + struct fscache_cookie *fscache; +#endif struct inode vfs_inode; }; @@ -208,7 +213,7 @@ static inline struct nfs_inode *NFS_I(struct inode *inode) #define NFS_FH(inode) (&NFS_I(inode)->fh) #define NFS_SERVER(inode) (NFS_SB(inode->i_sb)) #define NFS_CLIENT(inode) (NFS_SERVER(inode)->client) -#define NFS_PROTO(inode) (NFS_SERVER(inode)->rpc_ops) +#define NFS_PROTO(inode) (NFS_SERVER(inode)->nfs_client->rpc_ops) #define NFS_ADDR(inode) (RPC_PEERADDR(NFS_CLIENT(inode))) #define NFS_COOKIEVERF(inode) (NFS_I(inode)->cookieverf) #define NFS_READTIME(inode) (NFS_I(inode)->read_cache_jiffies) @@ -234,8 +239,12 @@ static inline int nfs_caches_unstable(struct inode *inode) static inline void nfs_mark_for_revalidate(struct inode *inode) { + struct nfs_inode *nfsi = NFS_I(inode); + spin_lock(&inode->i_lock); - NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ATTR | NFS_INO_INVALID_ACCESS; + nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ACCESS; + if (S_ISDIR(inode->i_mode)) + nfsi->cache_validity |= NFS_INO_REVAL_PAGECACHE|NFS_INO_INVALID_DATA; spin_unlock(&inode->i_lock); } @@ -297,7 +306,7 @@ extern int nfs_release(struct inode *, struct file *); extern int nfs_attribute_timeout(struct inode *inode); extern int nfs_revalidate_inode(struct nfs_server *server, struct inode *inode); extern int __nfs_revalidate_inode(struct nfs_server *, struct inode *); -extern void nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping); +extern int nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping); extern int nfs_setattr(struct dentry *, struct iattr *); extern void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr); extern void nfs_begin_attr_update(struct inode *); @@ -307,6 +316,10 @@ extern void nfs_end_data_update(struct inode *); extern struct nfs_open_context *get_nfs_open_context(struct nfs_open_context *ctx); extern void put_nfs_open_context(struct nfs_open_context *ctx); extern struct nfs_open_context *nfs_find_open_context(struct inode *inode, struct rpc_cred *cred, int mode); +extern struct vfsmount *nfs_do_submount(const struct vfsmount *mnt_parent, + const struct dentry *dentry, + struct nfs_fh *fh, + struct nfs_fattr *fattr); /* linux/net/ipv4/ipconfig.c: trims ip addr off front of name, too. */ extern u32 root_nfs_parse_addr(char *name); /*__init*/ @@ -325,7 +338,7 @@ extern struct inode_operations nfs_file_inode_operations; extern struct inode_operations nfs3_file_inode_operations; #endif /* CONFIG_NFS_V3 */ extern const struct file_operations nfs_file_operations; -extern struct address_space_operations nfs_file_aops; +extern const struct address_space_operations nfs_file_aops; static inline struct rpc_cred *nfs_file_cred(struct file *file) { @@ -392,6 +405,15 @@ extern void nfs_unregister_sysctl(void); #define nfs_unregister_sysctl() do { } while(0) #endif +/* + * linux/fs/nfs/namespace.c + */ +extern struct list_head nfs_automount_list; +extern struct inode_operations nfs_mountpoint_inode_operations; +extern struct inode_operations nfs_referral_inode_operations; +extern int nfs_mountpoint_expiry_timeout; +extern void nfs_release_automount_timer(void); + /* * linux/fs/nfs/unlink.c */ @@ -409,7 +431,7 @@ extern int nfs_writeback_done(struct rpc_task *, struct nfs_write_data *); extern void nfs_writedata_release(void *); #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4) -struct nfs_write_data *nfs_commit_alloc(unsigned int pagecount); +struct nfs_write_data *nfs_commit_alloc(void); void nfs_commit_free(struct nfs_write_data *p); #endif @@ -458,10 +480,9 @@ static inline int nfs_wb_page(struct inode *inode, struct page* page) } /* - * Allocate and free nfs_write_data structures + * Allocate nfs_write_data structures */ -extern struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount); -extern void nfs_writedata_free(struct nfs_write_data *p); +extern struct nfs_write_data *nfs_writedata_alloc(size_t len); /* * linux/fs/nfs/read.c @@ -473,10 +494,9 @@ extern int nfs_readpage_result(struct rpc_task *, struct nfs_read_data *); extern void nfs_readdata_release(void *data); /* - * Allocate and free nfs_read_data structures + * Allocate nfs_read_data structures */ -extern struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount); -extern void nfs_readdata_free(struct nfs_read_data *p); +extern struct nfs_read_data *nfs_readdata_alloc(size_t len); /* * linux/fs/nfs3proc.c @@ -521,15 +541,6 @@ nfs_size_to_loff_t(__u64 size) return (loff_t) size; } -static inline ino_t -nfs_fileid_to_ino_t(u64 fileid) -{ - ino_t ino = (ino_t) fileid; - if (sizeof(ino_t) < sizeof(u64)) - ino ^= fileid >> (sizeof(u64)-sizeof(ino_t)) * 8; - return ino; -} - /* NFS root */ extern void * nfs_root_data(void); @@ -563,6 +574,8 @@ extern void * nfs_root_data(void); #define NFSDBG_FILE 0x0040 #define NFSDBG_ROOT 0x0080 #define NFSDBG_CALLBACK 0x0100 +#define NFSDBG_CLIENT 0x0200 +#define NFSDBG_FSCACHE 0x0400 #define NFSDBG_ALL 0xFFFF #ifdef __KERNEL__ diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h index 65dec21af..c44be53c2 100644 --- a/include/linux/nfs_fs_sb.h +++ b/include/linux/nfs_fs_sb.h @@ -3,17 +3,88 @@ #include #include +#include struct nfs_iostats; +/* + * The nfs_client identifies our client state to the server. + */ +struct nfs_client { + atomic_t cl_count; + int cl_cons_state; /* current construction state (-ve: init error) */ +#define NFS_CS_READY 0 /* ready to be used */ +#define NFS_CS_INITING 1 /* busy initialising */ + int cl_nfsversion; /* NFS protocol version */ + unsigned long cl_res_state; /* NFS resources state */ +#define NFS_CS_RPCIOD 0 /* - rpciod started */ +#define NFS_CS_CALLBACK 1 /* - callback started */ +#define NFS_CS_IDMAP 2 /* - idmap started */ +#define NFS_CS_RENEWD 3 /* - renewd started */ + struct sockaddr_in cl_addr; /* server identifier */ + char * cl_hostname; /* hostname of server */ + struct list_head cl_share_link; /* link in global client list */ + struct list_head cl_superblocks; /* List of nfs_server structs */ + + struct rpc_clnt * cl_rpcclient; + const struct nfs_rpc_ops *rpc_ops; /* NFS protocol vector */ + unsigned long retrans_timeo; /* retransmit timeout */ + unsigned int retrans_count; /* number of retransmit tries */ + +#ifdef CONFIG_NFS_V4 + u64 cl_clientid; /* constant */ + nfs4_verifier cl_confirm; + unsigned long cl_state; + + u32 cl_lockowner_id; + + /* + * The following rwsem ensures exclusive access to the server + * while we recover the state following a lease expiration. + */ + struct rw_semaphore cl_sem; + + struct list_head cl_delegations; + struct list_head cl_state_owners; + struct list_head cl_unused; + int cl_nunused; + spinlock_t cl_lock; + + unsigned long cl_lease_time; + unsigned long cl_last_renewal; + struct work_struct cl_renewd; + + struct rpc_wait_queue cl_rpcwaitq; + + /* used for the setclientid verifier */ + struct timespec cl_boot_time; + + /* idmapper */ + struct idmap * cl_idmap; + + /* Our own IP address, as a null-terminated string. + * This is used to generate the clientid, and the callback address. + */ + char cl_ipaddr[16]; + unsigned char cl_id_uniquifier; +#endif + +#ifdef CONFIG_NFS_FSCACHE + struct fscache_cookie *fscache; /* client index cache cookie */ +#endif +}; + /* * NFS client parameters stored in the superblock. */ struct nfs_server { + struct nfs_client * nfs_client; /* shared client and NFS4 state */ + struct list_head client_link; /* List of other nfs_server structs + * that share the same client + */ + struct list_head master_link; /* link in master servers list */ struct rpc_clnt * client; /* RPC client handle */ - struct rpc_clnt * client_sys; /* 2nd handle for FSINFO */ struct rpc_clnt * client_acl; /* ACL RPC client handle */ - struct nfs_rpc_ops * rpc_ops; /* NFS protocol vector */ struct nfs_iostats * io_stats; /* I/O statistics */ struct backing_dev_info backing_dev_info; int flags; /* various flags */ @@ -29,23 +100,14 @@ struct nfs_server { unsigned int acregmax; unsigned int acdirmin; unsigned int acdirmax; - unsigned long retrans_timeo; /* retransmit timeout */ - unsigned int retrans_count; /* number of retransmit tries */ unsigned int namelen; - char * hostname; /* remote hostname */ - struct nfs_fh fh; - struct sockaddr_in addr; + + struct nfs_fsid fsid; + __u64 maxfilesize; /* maximum file size */ unsigned long mount_time; /* when this fs was mounted */ + dev_t s_dev; /* superblock dev numbers */ + #ifdef CONFIG_NFS_V4 - /* Our own IP address, as a null-terminated string. - * This is used to generate the clientid, and the callback address. - */ - char ip_addr[16]; - char * mnt_path; - struct nfs4_client * nfs4_state; /* all NFSv4 state starts here */ - struct list_head nfs4_siblings; /* List of other nfs_server structs - * that share the same clientid - */ u32 attr_bitmask[2];/* V4 bitmask representing the set of attributes supported on this filesystem */ @@ -53,6 +115,7 @@ struct nfs_server { that are supported on this filesystem */ #endif + void (*destroy)(struct nfs_server *); }; /* Server capabilities */ diff --git a/include/linux/nfs_idmap.h b/include/linux/nfs_idmap.h index 102e56094..15a9f3b72 100644 --- a/include/linux/nfs_idmap.h +++ b/include/linux/nfs_idmap.h @@ -62,15 +62,15 @@ struct idmap_msg { #ifdef __KERNEL__ /* Forward declaration to make this header independent of others */ -struct nfs4_client; +struct nfs_client; -void nfs_idmap_new(struct nfs4_client *); -void nfs_idmap_delete(struct nfs4_client *); +int nfs_idmap_new(struct nfs_client *); +void nfs_idmap_delete(struct nfs_client *); -int nfs_map_name_to_uid(struct nfs4_client *, const char *, size_t, __u32 *); -int nfs_map_group_to_gid(struct nfs4_client *, const char *, size_t, __u32 *); -int nfs_map_uid_to_name(struct nfs4_client *, __u32, char *); -int nfs_map_gid_to_group(struct nfs4_client *, __u32, char *); +int nfs_map_name_to_uid(struct nfs_client *, const char *, size_t, __u32 *); +int nfs_map_group_to_gid(struct nfs_client *, const char *, size_t, __u32 *); +int nfs_map_uid_to_name(struct nfs_client *, __u32, char *); +int nfs_map_gid_to_group(struct nfs_client *, __u32, char *); extern unsigned int nfs_idmap_cache_timeout; #endif /* __KERNEL__ */ diff --git a/include/linux/nfs_mount.h b/include/linux/nfs_mount.h index b1531a032..c453f415e 100644 --- a/include/linux/nfs_mount.h +++ b/include/linux/nfs_mount.h @@ -61,7 +61,8 @@ struct nfs_mount_data { #define NFS_MOUNT_NOACL 0x0800 /* 4 */ #define NFS_MOUNT_STRICTLOCK 0x1000 /* reserved for NFSv4 */ #define NFS_MOUNT_SECFLAVOUR 0x2000 /* 5 */ -#define NFS_MOUNT_TAGXID 0x8000 /* tagxid */ +#define NFS_MOUNT_FSCACHE 0x4000 +#define NFS_MOUNT_TAGXID 0x8000 #define NFS_MOUNT_FLAGMASK 0xFFFF #endif diff --git a/include/linux/nfs_page.h b/include/linux/nfs_page.h index 66e2ed658..1f7bd287c 100644 --- a/include/linux/nfs_page.h +++ b/include/linux/nfs_page.h @@ -13,7 +13,6 @@ #include #include #include -#include #include #include @@ -63,8 +62,8 @@ extern void nfs_release_request(struct nfs_page *req); extern int nfs_scan_lock_dirty(struct nfs_inode *nfsi, struct list_head *dst, unsigned long idx_start, unsigned int npages); -extern int nfs_scan_list(struct list_head *, struct list_head *, - unsigned long, unsigned int); +extern int nfs_scan_list(struct nfs_inode *nfsi, struct list_head *head, struct list_head *dst, + unsigned long idx_start, unsigned int npages); extern int nfs_coalesce_requests(struct list_head *, struct list_head *, unsigned int); extern int nfs_wait_on_request(struct nfs_page *); diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index 7fafc4c54..2426b11b6 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h @@ -14,11 +14,19 @@ #define NFS_DEF_FILE_IO_SIZE (4096U) #define NFS_MIN_FILE_IO_SIZE (1024U) -struct nfs4_fsid { - __u64 major; - __u64 minor; +struct nfs_fsid { + uint64_t major; + uint64_t minor; }; +/* + * Helper for checking equality between 2 fsids. + */ +static inline int nfs_fsid_equal(const struct nfs_fsid *a, const struct nfs_fsid *b) +{ + return a->major == b->major && a->minor == b->minor; +} + struct nfs_fattr { unsigned short valid; /* which fields are valid */ __u64 pre_size; /* pre_op_attr.size */ @@ -40,10 +48,7 @@ struct nfs_fattr { } nfs3; } du; dev_t rdev; - union { - __u64 nfs3; /* also nfs2 */ - struct nfs4_fsid nfs4; - } fsid_u; + struct nfs_fsid fsid; __u64 fileid; struct timespec atime; struct timespec mtime; @@ -57,8 +62,8 @@ struct nfs_fattr { #define NFS_ATTR_WCC 0x0001 /* pre-op WCC data */ #define NFS_ATTR_FATTR 0x0002 /* post-op attributes */ #define NFS_ATTR_FATTR_V3 0x0004 /* NFSv3 attributes */ -#define NFS_ATTR_FATTR_V4 0x0008 -#define NFS_ATTR_PRE_CHANGE 0x0010 +#define NFS_ATTR_FATTR_V4 0x0008 /* NFSv4 change attribute */ +#define NFS_ATTR_FATTR_V4_REFERRAL 0x0010 /* NFSv4 referral */ /* * Info on the file system @@ -654,7 +659,7 @@ struct nfs4_rename_res { struct nfs4_setclientid { const nfs4_verifier * sc_verifier; /* request */ unsigned int sc_name_len; - char sc_name[32]; /* request */ + char sc_name[48]; /* request */ u32 sc_prog; /* request */ unsigned int sc_netid_len; char sc_netid[4]; /* request */ @@ -675,6 +680,40 @@ struct nfs4_server_caps_res { u32 has_symlinks; }; +struct nfs4_string { + unsigned int len; + char *data; +}; + +#define NFS4_PATHNAME_MAXCOMPONENTS 512 +struct nfs4_pathname { + unsigned int ncomponents; + struct nfs4_string components[NFS4_PATHNAME_MAXCOMPONENTS]; +}; + +#define NFS4_FS_LOCATION_MAXSERVERS 10 +struct nfs4_fs_location { + unsigned int nservers; + struct nfs4_string servers[NFS4_FS_LOCATION_MAXSERVERS]; + struct nfs4_pathname rootpath; +}; + +#define NFS4_FS_LOCATIONS_MAXENTRIES 10 +struct nfs4_fs_locations { + struct nfs_fattr fattr; + const struct nfs_server *server; + struct nfs4_pathname fs_path; + int nlocations; + struct nfs4_fs_location locations[NFS4_FS_LOCATIONS_MAXENTRIES]; +}; + +struct nfs4_fs_locations_arg { + const struct nfs_fh *dir_fh; + const struct qstr *name; + struct page *page; + const u32 *bitmask; +}; + #endif /* CONFIG_NFS_V4 */ struct nfs_page; @@ -690,12 +729,13 @@ struct nfs_read_data { struct list_head pages; /* Coalesced read requests */ struct nfs_page *req; /* multi ops per nfs_page */ struct page **pagevec; + unsigned int npages; /* Max length of pagevec */ struct nfs_readargs args; struct nfs_readres res; #ifdef CONFIG_NFS_V4 unsigned long timestamp; /* For lease renewal */ #endif - struct page *page_array[NFS_PAGEVEC_SIZE + 1]; + struct page *page_array[NFS_PAGEVEC_SIZE]; }; struct nfs_write_data { @@ -708,12 +748,13 @@ struct nfs_write_data { struct list_head pages; /* Coalesced requests we wish to flush */ struct nfs_page *req; /* multi ops per nfs_page */ struct page **pagevec; + unsigned int npages; /* Max length of pagevec */ struct nfs_writeargs args; /* argument struct */ struct nfs_writeres res; /* result struct */ #ifdef CONFIG_NFS_V4 unsigned long timestamp; /* For lease renewal */ #endif - struct page *page_array[NFS_PAGEVEC_SIZE + 1]; + struct page *page_array[NFS_PAGEVEC_SIZE]; }; struct nfs_access_entry; @@ -729,6 +770,9 @@ struct nfs_rpc_ops { int (*getroot) (struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *); + int (*lookupfh)(struct nfs_server *, struct nfs_fh *, + struct qstr *, struct nfs_fh *, + struct nfs_fattr *); int (*getattr) (struct nfs_server *, struct nfs_fh *, struct nfs_fattr *); int (*setattr) (struct dentry *, struct nfs_fattr *, @@ -765,6 +809,7 @@ struct nfs_rpc_ops { struct nfs_fsinfo *); int (*pathconf) (struct nfs_server *, struct nfs_fh *, struct nfs_pathconf *); + int (*set_capabilities)(struct nfs_server *, struct nfs_fh *); u32 * (*decode_dirent)(u32 *, struct nfs_entry *, int plus); void (*read_setup) (struct nfs_read_data *); int (*read_done) (struct rpc_task *, struct nfs_read_data *); @@ -788,9 +833,9 @@ struct nfs_rpc_ops { /* * Function vectors etc. for the NFS client */ -extern struct nfs_rpc_ops nfs_v2_clientops; -extern struct nfs_rpc_ops nfs_v3_clientops; -extern struct nfs_rpc_ops nfs_v4_clientops; +extern const struct nfs_rpc_ops nfs_v2_clientops; +extern const struct nfs_rpc_ops nfs_v3_clientops; +extern const struct nfs_rpc_ops nfs_v4_clientops; extern struct rpc_version nfs_version2; extern struct rpc_version nfs_version3; extern struct rpc_version nfs_version4; diff --git a/include/linux/nfsd/nfsd.h b/include/linux/nfsd/nfsd.h index ec7c2e872..2dcad295f 100644 --- a/include/linux/nfsd/nfsd.h +++ b/include/linux/nfsd/nfsd.h @@ -10,7 +10,6 @@ #ifndef LINUX_NFSD_NFSD_H #define LINUX_NFSD_NFSD_H -#include #include #include #include diff --git a/include/linux/nfsd/nfsfh.h b/include/linux/nfsd/nfsfh.h index 0798b7781..069257ea9 100644 --- a/include/linux/nfsd/nfsfh.h +++ b/include/linux/nfsd/nfsfh.h @@ -16,7 +16,6 @@ #include #ifdef __KERNEL__ -# include # include # include # include @@ -270,14 +269,8 @@ fill_post_wcc(struct svc_fh *fhp) fhp->fh_post_uid = inode->i_uid; fhp->fh_post_gid = inode->i_gid; fhp->fh_post_size = inode->i_size; - if (inode->i_blksize) { - fhp->fh_post_blksize = inode->i_blksize; - fhp->fh_post_blocks = inode->i_blocks; - } else { - fhp->fh_post_blksize = BLOCK_SIZE; - /* how much do we care for accuracy with MinixFS? */ - fhp->fh_post_blocks = (inode->i_size+511) >> 9; - } + fhp->fh_post_blksize = BLOCK_SIZE; + fhp->fh_post_blocks = inode->i_blocks; fhp->fh_post_rdev[0] = htonl((u32)imajor(inode)); fhp->fh_post_rdev[1] = htonl((u32)iminor(inode)); fhp->fh_post_atime = inode->i_atime; @@ -297,8 +290,9 @@ fill_post_wcc(struct svc_fh *fhp) * vfs.c:nfsd_rename as it needs to grab 2 i_mutex's at once * so, any changes here should be reflected there. */ + static inline void -fh_lock(struct svc_fh *fhp) +fh_lock_nested(struct svc_fh *fhp, unsigned int subclass) { struct dentry *dentry = fhp->fh_dentry; struct inode *inode; @@ -317,11 +311,17 @@ fh_lock(struct svc_fh *fhp) } inode = dentry->d_inode; - mutex_lock(&inode->i_mutex); + mutex_lock_nested(&inode->i_mutex, subclass); fill_pre_wcc(fhp); fhp->fh_locked = 1; } +static inline void +fh_lock(struct svc_fh *fhp) +{ + fh_lock_nested(fhp, I_MUTEX_NORMAL); +} + /* * Unlock a file handle/inode */ diff --git a/include/linux/nfsd/stats.h b/include/linux/nfsd/stats.h index b6f1e0cda..28a82fdd9 100644 --- a/include/linux/nfsd/stats.h +++ b/include/linux/nfsd/stats.h @@ -9,6 +9,8 @@ #ifndef LINUX_NFSD_STATS_H #define LINUX_NFSD_STATS_H +#include + struct nfsd_stats { unsigned int rchits; /* repcache hits */ unsigned int rcmisses; /* repcache hits */ @@ -27,6 +29,10 @@ struct nfsd_stats { unsigned int ra_size; /* size of ra cache */ unsigned int ra_depth[11]; /* number of times ra entry was found that deep * in the cache (10percentiles). [10] = not found */ +#ifdef CONFIG_NFSD_V4 + unsigned int nfs4_opcount[LAST_NFS4_OP + 1]; /* count of individual nfsv4 operations */ +#endif + }; /* thread usage wraps very million seconds (approx one fortnight) */ diff --git a/include/linux/nfsd/syscall.h b/include/linux/nfsd/syscall.h index a37ad8678..fb1663d58 100644 --- a/include/linux/nfsd/syscall.h +++ b/include/linux/nfsd/syscall.h @@ -11,7 +11,6 @@ #include #ifdef __KERNEL__ -# include # include # include #endif diff --git a/include/linux/node.h b/include/linux/node.h index 254dc3de6..bc001bc22 100644 --- a/include/linux/node.h +++ b/include/linux/node.h @@ -26,8 +26,33 @@ struct node { struct sys_device sysdev; }; +extern struct node node_devices[]; + extern int register_node(struct node *, int, struct node *); extern void unregister_node(struct node *node); +#ifdef CONFIG_NUMA +extern int register_one_node(int nid); +extern void unregister_one_node(int nid); +extern int register_cpu_under_node(unsigned int cpu, unsigned int nid); +extern int unregister_cpu_under_node(unsigned int cpu, unsigned int nid); +#else +static inline int register_one_node(int nid) +{ + return 0; +} +static inline int unregister_one_node(int nid) +{ + return 0; +} +static inline int register_cpu_under_node(unsigned int cpu, unsigned int nid) +{ + return 0; +} +static inline int unregister_cpu_under_node(unsigned int cpu, unsigned int nid) +{ + return 0; +} +#endif #define to_node(sys_device) container_of(sys_device, struct node, sysdev) diff --git a/include/linux/notifier.h b/include/linux/notifier.h index 51dbab971..7ff386a6a 100644 --- a/include/linux/notifier.h +++ b/include/linux/notifier.h @@ -65,7 +65,7 @@ struct raw_notifier_head { } while (0) #define ATOMIC_NOTIFIER_INIT(name) { \ - .lock = SPIN_LOCK_UNLOCKED, \ + .lock = __SPIN_LOCK_UNLOCKED(name.lock), \ .head = NULL } #define BLOCKING_NOTIFIER_INIT(name) { \ .rwsem = __RWSEM_INITIALIZER((name).rwsem), \ diff --git a/include/linux/numa.h b/include/linux/numa.h index e481feb1b..a31a7301b 100644 --- a/include/linux/numa.h +++ b/include/linux/numa.h @@ -1,7 +1,6 @@ #ifndef _LINUX_NUMA_H #define _LINUX_NUMA_H -#include #ifdef CONFIG_NODES_SHIFT #define NODES_SHIFT CONFIG_NODES_SHIFT diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index d276a4e2f..6e017b7e9 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h @@ -5,9 +5,7 @@ #ifndef PAGE_FLAGS_H #define PAGE_FLAGS_H -#include -#include -#include +#include /* * Various page->flags bits: @@ -73,7 +71,7 @@ #define PG_active 6 #define PG_slab 7 /* slab debug (Suparna wants this) */ -#define PG_checked 8 /* kill me in 2.5.. */ +#define PG_fs_misc 8 #define PG_arch_1 9 #define PG_reserved 10 #define PG_private 11 /* Has something at ->private */ @@ -88,135 +86,17 @@ #define PG_nosave_free 18 /* Free, should not be written */ #define PG_buddy 19 /* Page is free, on buddy lists */ -#define PG_uncached 20 /* Page has been mapped as uncached */ +#if (BITS_PER_LONG > 32) /* - * Global page accounting. One instance per CPU. Only unsigned longs are - * allowed. + * 64-bit-only flags build down from bit 31 * - * - Fields can be modified with xxx_page_state and xxx_page_state_zone at - * any time safely (which protects the instance from modification by - * interrupt. - * - The __xxx_page_state variants can be used safely when interrupts are - * disabled. - * - The __xxx_page_state variants can be used if the field is only - * modified from process context and protected from preemption, or only - * modified from interrupt context. In this case, the field should be - * commented here. + * 32 bit -------------------------------| FIELDS | FLAGS | + * 64 bit | FIELDS | ?????? FLAGS | + * 63 32 0 */ -struct page_state { - unsigned long nr_dirty; /* Dirty writeable pages */ - unsigned long nr_writeback; /* Pages under writeback */ - unsigned long nr_unstable; /* NFS unstable pages */ - unsigned long nr_page_table_pages;/* Pages used for pagetables */ - unsigned long nr_mapped; /* mapped into pagetables. - * only modified from process context */ - unsigned long nr_slab; /* In slab */ -#define GET_PAGE_STATE_LAST nr_slab - - /* - * The below are zeroed by get_page_state(). Use get_full_page_state() - * to add up all these. - */ - unsigned long pgpgin; /* Disk reads */ - unsigned long pgpgout; /* Disk writes */ - unsigned long pswpin; /* swap reads */ - unsigned long pswpout; /* swap writes */ - - unsigned long pgalloc_high; /* page allocations */ - unsigned long pgalloc_normal; - unsigned long pgalloc_dma32; - unsigned long pgalloc_dma; - - unsigned long pgfree; /* page freeings */ - unsigned long pgactivate; /* pages moved inactive->active */ - unsigned long pgdeactivate; /* pages moved active->inactive */ - - unsigned long pgfault; /* faults (major+minor) */ - unsigned long pgmajfault; /* faults (major only) */ - - unsigned long pgrefill_high; /* inspected in refill_inactive_zone */ - unsigned long pgrefill_normal; - unsigned long pgrefill_dma32; - unsigned long pgrefill_dma; - - unsigned long pgsteal_high; /* total highmem pages reclaimed */ - unsigned long pgsteal_normal; - unsigned long pgsteal_dma32; - unsigned long pgsteal_dma; - - unsigned long pgscan_kswapd_high;/* total highmem pages scanned */ - unsigned long pgscan_kswapd_normal; - unsigned long pgscan_kswapd_dma32; - unsigned long pgscan_kswapd_dma; - - unsigned long pgscan_direct_high;/* total highmem pages scanned */ - unsigned long pgscan_direct_normal; - unsigned long pgscan_direct_dma32; - unsigned long pgscan_direct_dma; - - unsigned long pginodesteal; /* pages reclaimed via inode freeing */ - unsigned long slabs_scanned; /* slab objects scanned */ - unsigned long kswapd_steal; /* pages reclaimed by kswapd */ - unsigned long kswapd_inodesteal;/* reclaimed via kswapd inode freeing */ - unsigned long pageoutrun; /* kswapd's calls to page reclaim */ - unsigned long allocstall; /* direct reclaim calls */ - - unsigned long pgrotated; /* pages rotated to tail of the LRU */ - unsigned long nr_bounce; /* pages for bounce buffers */ -}; - -extern void get_page_state(struct page_state *ret); -extern void get_page_state_node(struct page_state *ret, int node); -extern void get_full_page_state(struct page_state *ret); -extern unsigned long read_page_state_offset(unsigned long offset); -extern void mod_page_state_offset(unsigned long offset, unsigned long delta); -extern void __mod_page_state_offset(unsigned long offset, unsigned long delta); - -#define read_page_state(member) \ - read_page_state_offset(offsetof(struct page_state, member)) - -#define mod_page_state(member, delta) \ - mod_page_state_offset(offsetof(struct page_state, member), (delta)) - -#define __mod_page_state(member, delta) \ - __mod_page_state_offset(offsetof(struct page_state, member), (delta)) - -#define inc_page_state(member) mod_page_state(member, 1UL) -#define dec_page_state(member) mod_page_state(member, 0UL - 1) -#define add_page_state(member,delta) mod_page_state(member, (delta)) -#define sub_page_state(member,delta) mod_page_state(member, 0UL - (delta)) - -#define __inc_page_state(member) __mod_page_state(member, 1UL) -#define __dec_page_state(member) __mod_page_state(member, 0UL - 1) -#define __add_page_state(member,delta) __mod_page_state(member, (delta)) -#define __sub_page_state(member,delta) __mod_page_state(member, 0UL - (delta)) - -#define page_state(member) (*__page_state(offsetof(struct page_state, member))) - -#define state_zone_offset(zone, member) \ -({ \ - unsigned offset; \ - if (is_highmem(zone)) \ - offset = offsetof(struct page_state, member##_high); \ - else if (is_normal(zone)) \ - offset = offsetof(struct page_state, member##_normal); \ - else if (is_dma32(zone)) \ - offset = offsetof(struct page_state, member##_dma32); \ - else \ - offset = offsetof(struct page_state, member##_dma); \ - offset; \ -}) - -#define __mod_page_state_zone(zone, member, delta) \ - do { \ - __mod_page_state_offset(state_zone_offset(zone, member), (delta)); \ - } while (0) - -#define mod_page_state_zone(zone, member, delta) \ - do { \ - mod_page_state_offset(state_zone_offset(zone, member), (delta)); \ - } while (0) +#define PG_uncached 31 /* Page has been mapped as uncached */ +#endif /* * Manipulation of page state flags @@ -242,7 +122,14 @@ extern void __mod_page_state_offset(unsigned long offset, unsigned long delta); #define TestClearPageReferenced(page) test_and_clear_bit(PG_referenced, &(page)->flags) #define PageUptodate(page) test_bit(PG_uptodate, &(page)->flags) -#ifndef SetPageUptodate +#ifdef CONFIG_S390 +#define SetPageUptodate(_page) \ + do { \ + struct page *__page = (_page); \ + if (!test_and_set_bit(PG_uptodate, &__page->flags)) \ + page_test_and_clear_dirty(_page); \ + } while (0) +#else #define SetPageUptodate(page) set_bit(PG_uptodate, &(page)->flags) #endif #define ClearPageUptodate(page) clear_bit(PG_uptodate, &(page)->flags) @@ -274,10 +161,6 @@ extern void __mod_page_state_offset(unsigned long offset, unsigned long delta); #define PageHighMem(page) 0 /* needed to optimize away at compile time */ #endif -#define PageChecked(page) test_bit(PG_checked, &(page)->flags) -#define SetPageChecked(page) set_bit(PG_checked, &(page)->flags) -#define ClearPageChecked(page) clear_bit(PG_checked, &(page)->flags) - #define PageReserved(page) test_bit(PG_reserved, &(page)->flags) #define SetPageReserved(page) set_bit(PG_reserved, &(page)->flags) #define ClearPageReserved(page) clear_bit(PG_reserved, &(page)->flags) @@ -294,7 +177,7 @@ extern void __mod_page_state_offset(unsigned long offset, unsigned long delta); do { \ if (!test_and_set_bit(PG_writeback, \ &(page)->flags)) \ - inc_page_state(nr_writeback); \ + inc_zone_page_state(page, NR_WRITEBACK); \ } while (0) #define TestSetPageWriteback(page) \ ({ \ @@ -302,14 +185,14 @@ extern void __mod_page_state_offset(unsigned long offset, unsigned long delta); ret = test_and_set_bit(PG_writeback, \ &(page)->flags); \ if (!ret) \ - inc_page_state(nr_writeback); \ + inc_zone_page_state(page, NR_WRITEBACK); \ ret; \ }) #define ClearPageWriteback(page) \ do { \ if (test_and_clear_bit(PG_writeback, \ &(page)->flags)) \ - dec_page_state(nr_writeback); \ + dec_zone_page_state(page, NR_WRITEBACK); \ } while (0) #define TestClearPageWriteback(page) \ ({ \ @@ -317,7 +200,7 @@ extern void __mod_page_state_offset(unsigned long offset, unsigned long delta); ret = test_and_clear_bit(PG_writeback, \ &(page)->flags); \ if (ret) \ - dec_page_state(nr_writeback); \ + dec_zone_page_state(page, NR_WRITEBACK); \ ret; \ }) @@ -376,4 +259,13 @@ static inline void set_page_writeback(struct page *page) test_set_page_writeback(page); } +/* + * Filesystem-specific page bit testing + */ +#define PageFsMisc(page) test_bit(PG_fs_misc, &(page)->flags) +#define SetPageFsMisc(page) set_bit(PG_fs_misc, &(page)->flags) +#define TestSetPageFsMisc(page) test_and_set_bit(PG_fs_misc, &(page)->flags) +#define ClearPageFsMisc(page) clear_bit(PG_fs_misc, &(page)->flags) +#define TestClearPageFsMisc(page) test_and_clear_bit(PG_fs_misc, &(page)->flags) + #endif /* PAGE_FLAGS_H */ diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 7a1af574d..e77298b27 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -99,6 +99,13 @@ extern struct page * read_cache_page(struct address_space *mapping, extern int read_cache_pages(struct address_space *mapping, struct list_head *pages, filler_t *filler, void *data); +static inline struct page *read_mapping_page(struct address_space *mapping, + unsigned long index, void *data) +{ + filler_t *filler = (filler_t *)mapping->a_ops->readpage; + return read_cache_page(mapping, index, filler, data); +} + int add_to_page_cache(struct page *page, struct address_space *mapping, unsigned long index, gfp_t gfp_mask); int add_to_page_cache_lru(struct page *page, struct address_space *mapping, @@ -106,51 +113,6 @@ int add_to_page_cache_lru(struct page *page, struct address_space *mapping, extern void remove_from_page_cache(struct page *page); extern void __remove_from_page_cache(struct page *page); -extern atomic_t nr_pagecache; - -#ifdef CONFIG_SMP - -#define PAGECACHE_ACCT_THRESHOLD max(16, NR_CPUS * 2) -DECLARE_PER_CPU(long, nr_pagecache_local); - -/* - * pagecache_acct implements approximate accounting for pagecache. - * vm_enough_memory() do not need high accuracy. Writers will keep - * an offset in their per-cpu arena and will spill that into the - * global count whenever the absolute value of the local count - * exceeds the counter's threshold. - * - * MUST be protected from preemption. - * current protection is mapping->page_lock. - */ -static inline void pagecache_acct(int count) -{ - long *local; - - local = &__get_cpu_var(nr_pagecache_local); - *local += count; - if (*local > PAGECACHE_ACCT_THRESHOLD || *local < -PAGECACHE_ACCT_THRESHOLD) { - atomic_add(*local, &nr_pagecache); - *local = 0; - } -} - -#else - -static inline void pagecache_acct(int count) -{ - atomic_add(count, &nr_pagecache); -} -#endif - -static inline unsigned long get_page_cache_size(void) -{ - int ret = atomic_read(&nr_pagecache); - if (unlikely(ret < 0)) - ret = 0; - return ret; -} - /* * Return byte-offset into filesystem object for page. */ @@ -207,6 +169,23 @@ static inline void wait_on_page_writeback(struct page *page) extern void end_page_writeback(struct page *page); +/* + * permit installation of a state change monitor in the queue for a page + */ +extern void install_page_waitqueue_monitor(struct page *page, + wait_queue_t *monitor); + +/* + * Wait for filesystem-specific page synchronisation to complete + */ +static inline void wait_on_page_fs_misc(struct page *page) +{ + if (PageFsMisc(page)) + wait_on_page_bit(page, PG_fs_misc); +} + +extern void fastcall end_page_fs_misc(struct page *page); + /* * Fault a userspace page into pagetables. Return non-zero on a fault. * diff --git a/include/linux/parport.h b/include/linux/parport.h index 008d736a6..5bf321e82 100644 --- a/include/linux/parport.h +++ b/include/linux/parport.h @@ -96,7 +96,6 @@ typedef enum { /* The rest is for the kernel only */ #ifdef __KERNEL__ -#include #include #include #include @@ -128,6 +127,10 @@ struct amiga_parport_state { unsigned char statusdir;/* ciab.ddrb & 7 */ }; +struct ax88796_parport_state { + unsigned char cpr; +}; + struct ip32_parport_state { unsigned int dcr; unsigned int ecr; @@ -139,6 +142,7 @@ struct parport_state { /* ARC has no state. */ struct ax_parport_state ax; struct amiga_parport_state amiga; + struct ax88796_parport_state ax88796; /* Atari has not state. */ struct ip32_parport_state ip32; void *misc; diff --git a/include/linux/pci.h b/include/linux/pci.h index 3a6a4e37a..8565b81d7 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -17,8 +17,6 @@ #ifndef LINUX_PCI_H #define LINUX_PCI_H -#include - /* Include the pci register defines */ #include @@ -46,8 +44,9 @@ #ifdef __KERNEL__ +#include + #include -#include #include #include #include @@ -162,7 +161,11 @@ struct pci_dev { unsigned int is_enabled:1; /* pci_enable_device has been called */ unsigned int is_busmaster:1; /* device is busmaster */ unsigned int no_msi:1; /* device may not use msi */ + unsigned int no_d1d2:1; /* only allow d0 or d3 */ unsigned int block_ucfg_access:1; /* userspace config space access is blocked */ + unsigned int broken_parity_status:1; /* Device generates false positive parity */ + unsigned int msi_enabled:1; + unsigned int msix_enabled:1; u32 saved_config_space[16]; /* config space saved at suspend time */ struct hlist_head saved_cap_space; @@ -402,8 +405,8 @@ int pcibios_enable_device(struct pci_dev *, int mask); char *pcibios_setup (char *str); /* Used only when drivers/pci/setup.c is used */ -void pcibios_align_resource(void *, struct resource *, - unsigned long, unsigned long); +void pcibios_align_resource(void *, struct resource *, resource_size_t, + resource_size_t); void pcibios_update_irq(struct pci_dev *, int irq); /* Generic PCI functions used internally */ @@ -442,6 +445,7 @@ struct pci_dev *pci_find_device_reverse (unsigned int vendor, unsigned int devic struct pci_dev *pci_find_slot (unsigned int bus, unsigned int devfn); int pci_find_capability (struct pci_dev *dev, int cap); int pci_find_next_capability (struct pci_dev *dev, u8 pos, int cap); +int pci_find_ext_capability (struct pci_dev *dev, int cap); struct pci_bus * pci_find_next_bus(const struct pci_bus *from); struct pci_dev *pci_get_device (unsigned int vendor, unsigned int device, struct pci_dev *from); @@ -496,6 +500,7 @@ int pci_set_dma_mask(struct pci_dev *dev, u64 mask); int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask); void pci_update_resource(struct pci_dev *dev, struct resource *res, int resno); int pci_assign_resource(struct pci_dev *dev, int i); +int pci_assign_resource_fixed(struct pci_dev *dev, int i); void pci_restore_bars(struct pci_dev *dev); /* ROM control related routines */ @@ -528,10 +533,10 @@ void pci_release_region(struct pci_dev *, int); /* drivers/pci/bus.c */ int pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res, - unsigned long size, unsigned long align, - unsigned long min, unsigned int type_mask, + resource_size_t size, resource_size_t align, + resource_size_t min, unsigned int type_mask, void (*alignf)(void *, struct resource *, - unsigned long, unsigned long), + resource_size_t, resource_size_t), void *alignf_data); void pci_enable_bridges(struct pci_bus *bus); @@ -662,6 +667,7 @@ static inline int pci_register_driver(struct pci_driver *drv) { return 0;} static inline void pci_unregister_driver(struct pci_driver *drv) { } static inline int pci_find_capability (struct pci_dev *dev, int cap) {return 0; } static inline int pci_find_next_capability (struct pci_dev *dev, u8 post, int cap) { return 0; } +static inline int pci_find_ext_capability (struct pci_dev *dev, int cap) {return 0; } static inline const struct pci_device_id *pci_match_device(const struct pci_device_id *ids, const struct pci_dev *dev) { return NULL; } /* Power management related routines */ @@ -725,7 +731,8 @@ static inline char *pci_name(struct pci_dev *pdev) */ #ifndef HAVE_ARCH_PCI_RESOURCE_TO_USER static inline void pci_resource_to_user(const struct pci_dev *dev, int bar, - const struct resource *rsrc, u64 *start, u64 *end) + const struct resource *rsrc, resource_size_t *start, + resource_size_t *end) { *start = rsrc->start; *end = rsrc->end; diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index 2bd4cbafc..7a249155e 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h @@ -352,8 +352,11 @@ #define PCI_DEVICE_ID_ATI_RS480 0x5950 /* ATI IXP Chipset */ #define PCI_DEVICE_ID_ATI_IXP200_IDE 0x4349 +#define PCI_DEVICE_ID_ATI_IXP200_SMBUS 0x4353 +#define PCI_DEVICE_ID_ATI_IXP300_SMBUS 0x4363 #define PCI_DEVICE_ID_ATI_IXP300_IDE 0x4369 #define PCI_DEVICE_ID_ATI_IXP300_SATA 0x436e +#define PCI_DEVICE_ID_ATI_IXP400_SMBUS 0x4372 #define PCI_DEVICE_ID_ATI_IXP400_IDE 0x4376 #define PCI_DEVICE_ID_ATI_IXP400_SATA 0x4379 #define PCI_DEVICE_ID_ATI_IXP400_SATA2 0x437a @@ -645,6 +648,8 @@ #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_966 0x0966 +#define PCI_DEVICE_ID_SI_968 0x0968 #define PCI_DEVICE_ID_SI_5511 0x5511 #define PCI_DEVICE_ID_SI_5513 0x5513 #define PCI_DEVICE_ID_SI_5517 0x5517 @@ -725,7 +730,9 @@ #define PCI_DEVICE_ID_TI_TVP4020 0x3d07 #define PCI_DEVICE_ID_TI_4450 0x8011 #define PCI_DEVICE_ID_TI_XX21_XX11 0x8031 +#define PCI_DEVICE_ID_TI_XX21_XX11_SD 0x8034 #define PCI_DEVICE_ID_TI_X515 0x8036 +#define PCI_DEVICE_ID_TI_XX12 0x8039 #define PCI_DEVICE_ID_TI_1130 0xac12 #define PCI_DEVICE_ID_TI_1031 0xac13 #define PCI_DEVICE_ID_TI_1131 0xac15 @@ -848,7 +855,12 @@ #define PCI_VENDOR_ID_QLOGIC 0x1077 +#define PCI_DEVICE_ID_QLOGIC_ISP10160 0x1016 #define PCI_DEVICE_ID_QLOGIC_ISP1020 0x1020 +#define PCI_DEVICE_ID_QLOGIC_ISP1080 0x1080 +#define PCI_DEVICE_ID_QLOGIC_ISP12160 0x1216 +#define PCI_DEVICE_ID_QLOGIC_ISP1240 0x1240 +#define PCI_DEVICE_ID_QLOGIC_ISP1280 0x1280 #define PCI_DEVICE_ID_QLOGIC_ISP2100 0x2100 #define PCI_DEVICE_ID_QLOGIC_ISP2200 0x2200 #define PCI_DEVICE_ID_QLOGIC_ISP2300 0x2300 @@ -935,6 +947,7 @@ #define PCI_DEVICE_ID_PLX_DJINN_ITOO 0x1151 #define PCI_DEVICE_ID_PLX_R753 0x1152 #define PCI_DEVICE_ID_PLX_OLITEC 0x1187 +#define PCI_DEVICE_ID_PLX_PCI200SYN 0x3196 #define PCI_DEVICE_ID_PLX_9050 0x9050 #define PCI_DEVICE_ID_PLX_9080 0x9080 #define PCI_DEVICE_ID_PLX_GTEK_SERIAL2 0xa001 @@ -987,13 +1000,6 @@ #define PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO 0x8006 #define PCI_DEVICE_ID_NEOMAGIC_NM256XL_PLUS_AUDIO 0x8016 -#define PCI_VENDOR_ID_ASP 0x10cd -#define PCI_DEVICE_ID_ASP_1200A 0x1100 -#define PCI_DEVICE_ID_ASP_ABP940 0x1200 -#define PCI_DEVICE_ID_ASP_ABP940U 0x1300 -#define PCI_DEVICE_ID_ASP_ABP940UW 0x2300 -#define PCI_DEVICE_ID_38C0800_REV1 0x2500 -#define PCI_DEVICE_ID_38C1600_REV1 0x2700 #define PCI_VENDOR_ID_TCONRAD 0x10da #define PCI_DEVICE_ID_TCONRAD_TOKENRING 0x0508 @@ -1024,6 +1030,7 @@ #define PCI_DEVICE_ID_NVIDIA_NVENET_8 0x0056 #define PCI_DEVICE_ID_NVIDIA_NVENET_9 0x0057 #define PCI_DEVICE_ID_NVIDIA_CK804_AUDIO 0x0059 +#define PCI_DEVICE_ID_NVIDIA_CK804_PCIE 0x005d #define PCI_DEVICE_ID_NVIDIA_NFORCE2_SMBUS 0x0064 #define PCI_DEVICE_ID_NVIDIA_NFORCE2_IDE 0x0065 #define PCI_DEVICE_ID_NVIDIA_NVENET_2 0x0066 @@ -1133,9 +1140,11 @@ #define PCI_DEVICE_ID_NVIDIA_QUADRO4_900XGL 0x0258 #define PCI_DEVICE_ID_NVIDIA_QUADRO4_750XGL 0x0259 #define PCI_DEVICE_ID_NVIDIA_QUADRO4_700XGL 0x025B +#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SMBUS 0x0264 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE 0x0265 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA 0x0266 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA2 0x0267 +#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SMBUS 0x0368 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE 0x036E #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA 0x037E #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA2 0x037F @@ -1189,6 +1198,19 @@ #define PCI_DEVICE_ID_NVIDIA_QUADRO_FX_1100 0x034E #define PCI_DEVICE_ID_NVIDIA_NVENET_14 0x0372 #define PCI_DEVICE_ID_NVIDIA_NVENET_15 0x0373 +#define PCI_DEVICE_ID_NVIDIA_NVENET_16 0x03E5 +#define PCI_DEVICE_ID_NVIDIA_NVENET_17 0x03E6 +#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA 0x03E7 +#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE 0x03EC +#define PCI_DEVICE_ID_NVIDIA_NVENET_18 0x03EE +#define PCI_DEVICE_ID_NVIDIA_NVENET_19 0x03EF +#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA2 0x03F6 +#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA3 0x03F7 +#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_IDE 0x0448 +#define PCI_DEVICE_ID_NVIDIA_NVENET_20 0x0450 +#define PCI_DEVICE_ID_NVIDIA_NVENET_21 0x0451 +#define PCI_DEVICE_ID_NVIDIA_NVENET_22 0x0452 +#define PCI_DEVICE_ID_NVIDIA_NVENET_23 0x0453 #define PCI_VENDOR_ID_IMS 0x10e0 #define PCI_DEVICE_ID_IMS_TT128 0x9128 @@ -1272,6 +1294,7 @@ #define PCI_DEVICE_ID_VIA_8367_0 0x3099 #define PCI_DEVICE_ID_VIA_8653_0 0x3101 #define PCI_DEVICE_ID_VIA_8622 0x3102 +#define PCI_DEVICE_ID_VIA_8235_USB_2 0x3104 #define PCI_DEVICE_ID_VIA_8233C_0 0x3109 #define PCI_DEVICE_ID_VIA_8361 0x3112 #define PCI_DEVICE_ID_VIA_XM266 0x3116 @@ -1423,6 +1446,7 @@ #define PCI_DEVICE_ID_RICOH_RL5C475 0x0475 #define PCI_DEVICE_ID_RICOH_RL5C476 0x0476 #define PCI_DEVICE_ID_RICOH_RL5C478 0x0478 +#define PCI_DEVICE_ID_RICOH_R5C822 0x0822 #define PCI_VENDOR_ID_DLINK 0x1186 #define PCI_DEVICE_ID_DLINK_DGE510T 0x4c00 @@ -1705,6 +1729,9 @@ #define PCI_VENDOR_ID_DOMEX 0x134a #define PCI_DEVICE_ID_DOMEX_DMX3191D 0x0001 +#define PCI_VENDOR_ID_INTASHIELD 0x135a +#define PCI_DEVICE_ID_INTASHIELD_IS200 0x0d80 + #define PCI_VENDOR_ID_QUATECH 0x135C #define PCI_DEVICE_ID_QUATECH_QSC100 0x0010 #define PCI_DEVICE_ID_QUATECH_DSC100 0x0020 @@ -1837,6 +1864,7 @@ #define PCI_VENDOR_ID_SAMSUNG 0x144d +#define PCI_VENDOR_ID_MYRICOM 0x14c1 #define PCI_VENDOR_ID_TITAN 0x14D2 #define PCI_DEVICE_ID_TITAN_010L 0x8001 @@ -1897,6 +1925,7 @@ #define PCI_DEVICE_ID_TIGON3_5751F 0x167e #define PCI_DEVICE_ID_TIGON3_5787M 0x1693 #define PCI_DEVICE_ID_TIGON3_5782 0x1696 +#define PCI_DEVICE_ID_TIGON3_5786 0x169a #define PCI_DEVICE_ID_TIGON3_5787 0x169b #define PCI_DEVICE_ID_TIGON3_5788 0x169c #define PCI_DEVICE_ID_TIGON3_5789 0x169d @@ -1945,6 +1974,7 @@ #define PCI_VENDOR_ID_MELLANOX 0x15b3 #define PCI_DEVICE_ID_MELLANOX_TAVOR 0x5a44 +#define PCI_DEVICE_ID_MELLANOX_TAVOR_BRIDGE 0x5a46 #define PCI_DEVICE_ID_MELLANOX_ARBEL_COMPAT 0x6278 #define PCI_DEVICE_ID_MELLANOX_ARBEL 0x6282 #define PCI_DEVICE_ID_MELLANOX_SINAI_OLD 0x5e8c @@ -1968,6 +1998,9 @@ #define PCI_VENDOR_ID_NETCELL 0x169c #define PCI_DEVICE_ID_REVOLUTION 0x0044 +#define PCI_VENDOR_ID_VITESSE 0x1725 +#define PCI_DEVICE_ID_VITESSE_VSC7174 0x7174 + #define PCI_VENDOR_ID_LINKSYS 0x1737 #define PCI_DEVICE_ID_LINKSYS_EG1064 0x1064 @@ -1992,6 +2025,13 @@ #define PCI_VENDOR_ID_TDI 0x192E #define PCI_DEVICE_ID_TDI_EHCI 0x0101 +#define PCI_VENDOR_ID_JMICRON 0x197B +#define PCI_DEVICE_ID_JMICRON_JMB360 0x2360 +#define PCI_DEVICE_ID_JMICRON_JMB361 0x2361 +#define PCI_DEVICE_ID_JMICRON_JMB363 0x2363 +#define PCI_DEVICE_ID_JMICRON_JMB365 0x2365 +#define PCI_DEVICE_ID_JMICRON_JMB366 0x2366 +#define PCI_DEVICE_ID_JMICRON_JMB368 0x2368 #define PCI_VENDOR_ID_TEKRAM 0x1de1 #define PCI_DEVICE_ID_TEKRAM_DC290 0xdc29 @@ -2053,6 +2093,7 @@ #define PCI_DEVICE_ID_INTEL_80960_RP 0x1960 #define PCI_DEVICE_ID_INTEL_82840_HB 0x1a21 #define PCI_DEVICE_ID_INTEL_82845_HB 0x1a30 +#define PCI_DEVICE_ID_INTEL_IOAT 0x1a38 #define PCI_DEVICE_ID_INTEL_82801AA_0 0x2410 #define PCI_DEVICE_ID_INTEL_82801AA_1 0x2411 #define PCI_DEVICE_ID_INTEL_82801AA_3 0x2413 @@ -2107,6 +2148,7 @@ #define PCI_DEVICE_ID_INTEL_82820_UP_HB 0x2501 #define PCI_DEVICE_ID_INTEL_82850_HB 0x2530 #define PCI_DEVICE_ID_INTEL_82860_HB 0x2531 +#define PCI_DEVICE_ID_INTEL_E7501_MCH 0x254c #define PCI_DEVICE_ID_INTEL_82845G_HB 0x2560 #define PCI_DEVICE_ID_INTEL_82845G_IG 0x2562 #define PCI_DEVICE_ID_INTEL_82865_HB 0x2570 diff --git a/include/linux/pci_regs.h b/include/linux/pci_regs.h index d27a78b71..96930cb59 100644 --- a/include/linux/pci_regs.h +++ b/include/linux/pci_regs.h @@ -197,6 +197,7 @@ #define PCI_CAP_ID_CHSWP 0x06 /* CompactPCI HotSwap */ #define PCI_CAP_ID_PCIX 0x07 /* PCI-X */ #define PCI_CAP_ID_HT_IRQCONF 0x08 /* HyperTransport IRQ Configuration */ +#define PCI_CAP_ID_VNDR 0x09 /* Vendor specific capability */ #define PCI_CAP_ID_SHPC 0x0C /* PCI Standard Hot-Plug Controller */ #define PCI_CAP_ID_EXP 0x10 /* PCI Express */ #define PCI_CAP_ID_MSIX 0x11 /* MSI-X */ @@ -421,7 +422,23 @@ #define PCI_ERR_CAP_ECRC_CHKE 0x00000100 /* ECRC Check Enable */ #define PCI_ERR_HEADER_LOG 28 /* Header Log Register (16 bytes) */ #define PCI_ERR_ROOT_COMMAND 44 /* Root Error Command */ +/* Correctable Err Reporting Enable */ +#define PCI_ERR_ROOT_CMD_COR_EN 0x00000001 +/* Non-fatal Err Reporting Enable */ +#define PCI_ERR_ROOT_CMD_NONFATAL_EN 0x00000002 +/* Fatal Err Reporting Enable */ +#define PCI_ERR_ROOT_CMD_FATAL_EN 0x00000004 #define PCI_ERR_ROOT_STATUS 48 +#define PCI_ERR_ROOT_COR_RCV 0x00000001 /* ERR_COR Received */ +/* Multi ERR_COR Received */ +#define PCI_ERR_ROOT_MULTI_COR_RCV 0x00000002 +/* ERR_FATAL/NONFATAL Recevied */ +#define PCI_ERR_ROOT_UNCOR_RCV 0x00000004 +/* Multi ERR_FATAL/NONFATAL Recevied */ +#define PCI_ERR_ROOT_MULTI_UNCOR_RCV 0x00000008 +#define PCI_ERR_ROOT_FIRST_FATAL 0x00000010 /* First Fatal */ +#define PCI_ERR_ROOT_NONFATAL_RCV 0x00000020 /* Non-Fatal Received */ +#define PCI_ERR_ROOT_FATAL_RCV 0x00000040 /* Fatal Received */ #define PCI_ERR_ROOT_COR_SRC 52 #define PCI_ERR_ROOT_SRC 54 diff --git a/include/linux/percpu_counter.h b/include/linux/percpu_counter.h index 682525511..f5aa593cc 100644 --- a/include/linux/percpu_counter.h +++ b/include/linux/percpu_counter.h @@ -6,18 +6,18 @@ * WARNING: these things are HUGE. 4 kbytes per counter on 32-way P4. */ -#include #include #include #include #include +#include #ifdef CONFIG_SMP struct percpu_counter { spinlock_t lock; - long count; - long *counters; + s64 count; + s32 *counters; }; #if NR_CPUS >= 16 @@ -26,11 +26,11 @@ struct percpu_counter { #define FBC_BATCH (NR_CPUS*4) #endif -static inline void percpu_counter_init(struct percpu_counter *fbc) +static inline void percpu_counter_init(struct percpu_counter *fbc, s64 amount) { spin_lock_init(&fbc->lock); - fbc->count = 0; - fbc->counters = alloc_percpu(long); + fbc->count = amount; + fbc->counters = alloc_percpu(s32); } static inline void percpu_counter_destroy(struct percpu_counter *fbc) @@ -38,10 +38,10 @@ static inline void percpu_counter_destroy(struct percpu_counter *fbc) free_percpu(fbc->counters); } -void percpu_counter_mod(struct percpu_counter *fbc, long amount); -long percpu_counter_sum(struct percpu_counter *fbc); +void percpu_counter_mod(struct percpu_counter *fbc, s32 amount); +s64 percpu_counter_sum(struct percpu_counter *fbc); -static inline long percpu_counter_read(struct percpu_counter *fbc) +static inline s64 percpu_counter_read(struct percpu_counter *fbc) { return fbc->count; } @@ -49,13 +49,14 @@ static inline long percpu_counter_read(struct percpu_counter *fbc) /* * It is possible for the percpu_counter_read() to return a small negative * number for some counter which should never be negative. + * */ -static inline long percpu_counter_read_positive(struct percpu_counter *fbc) +static inline s64 percpu_counter_read_positive(struct percpu_counter *fbc) { - long ret = fbc->count; + s64 ret = fbc->count; barrier(); /* Prevent reloads of fbc->count */ - if (ret > 0) + if (ret >= 0) return ret; return 1; } @@ -63,12 +64,12 @@ static inline long percpu_counter_read_positive(struct percpu_counter *fbc) #else struct percpu_counter { - long count; + s64 count; }; -static inline void percpu_counter_init(struct percpu_counter *fbc) +static inline void percpu_counter_init(struct percpu_counter *fbc, s64 amount) { - fbc->count = 0; + fbc->count = amount; } static inline void percpu_counter_destroy(struct percpu_counter *fbc) @@ -76,24 +77,24 @@ static inline void percpu_counter_destroy(struct percpu_counter *fbc) } static inline void -percpu_counter_mod(struct percpu_counter *fbc, long amount) +percpu_counter_mod(struct percpu_counter *fbc, s32 amount) { preempt_disable(); fbc->count += amount; preempt_enable(); } -static inline long percpu_counter_read(struct percpu_counter *fbc) +static inline s64 percpu_counter_read(struct percpu_counter *fbc) { return fbc->count; } -static inline long percpu_counter_read_positive(struct percpu_counter *fbc) +static inline s64 percpu_counter_read_positive(struct percpu_counter *fbc) { return fbc->count; } -static inline long percpu_counter_sum(struct percpu_counter *fbc) +static inline s64 percpu_counter_sum(struct percpu_counter *fbc) { return percpu_counter_read_positive(fbc); } diff --git a/include/linux/pfn.h b/include/linux/pfn.h index ba2a86677..d2aace0e2 100644 --- a/include/linux/pfn.h +++ b/include/linux/pfn.h @@ -4,6 +4,10 @@ #define PFN_ALIGN(x) (((unsigned long)(x) + (PAGE_SIZE - 1)) & PAGE_MASK) #define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT) #define PFN_DOWN(x) ((x) >> PAGE_SHIFT) +#if defined(CONFIG_X86_XEN) && defined(CONFIG_X86_PAE) #define PFN_PHYS(x) ((unsigned long long)(x) << PAGE_SHIFT) +#else +#define PFN_PHYS(x) ((x) << PAGE_SHIFT) +#endif #endif diff --git a/include/linux/phy.h b/include/linux/phy.h index 331521a10..9447a57ee 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -378,6 +378,7 @@ int phy_mii_ioctl(struct phy_device *phydev, struct mii_ioctl_data *mii_data, int cmd); int phy_start_interrupts(struct phy_device *phydev); void phy_print_status(struct phy_device *phydev); +struct phy_device* phy_device_create(struct mii_bus *bus, int addr, int phy_id); extern struct bus_type mdio_bus_type; #endif /* __PHY_H */ diff --git a/include/linux/pid.h b/include/linux/pid.h index 29960b03b..d4a9f83ac 100644 --- a/include/linux/pid.h +++ b/include/linux/pid.h @@ -8,7 +8,8 @@ enum pid_type PIDTYPE_PID, PIDTYPE_PGID, PIDTYPE_SID, - PIDTYPE_MAX + PIDTYPE_MAX, + PIDTYPE_REALPID }; /* diff --git a/include/linux/pm.h b/include/linux/pm.h index 66be58902..658c1b93d 100644 --- a/include/linux/pm.h +++ b/include/linux/pm.h @@ -23,7 +23,6 @@ #ifdef __KERNEL__ -#include #include #include diff --git a/include/linux/pm_legacy.h b/include/linux/pm_legacy.h index 008932d73..514729a44 100644 --- a/include/linux/pm_legacy.h +++ b/include/linux/pm_legacy.h @@ -1,7 +1,6 @@ #ifndef __LINUX_PM_LEGACY_H__ #define __LINUX_PM_LEGACY_H__ -#include #ifdef CONFIG_PM_LEGACY @@ -15,11 +14,6 @@ extern int pm_active; struct pm_dev __deprecated * pm_register(pm_dev_t type, unsigned long id, pm_callback callback); -/* - * Unregister all devices with matching callback - */ -void __deprecated pm_unregister_all(pm_callback callback); - /* * Send a request to all devices */ @@ -36,8 +30,6 @@ static inline struct pm_dev *pm_register(pm_dev_t type, return NULL; } -static inline void pm_unregister_all(pm_callback callback) {} - static inline int pm_send_all(pm_request_t rqst, void *data) { return 0; diff --git a/include/linux/pmu.h b/include/linux/pmu.h index 217d3daf7..783177387 100644 --- a/include/linux/pmu.h +++ b/include/linux/pmu.h @@ -6,7 +6,6 @@ * Copyright (C) 1998 Paul Mackerras. */ -#include #define PMU_DRIVER_VERSION 2 @@ -231,4 +230,7 @@ extern int pmu_battery_count; extern struct pmu_battery_info pmu_batteries[PMU_MAX_BATTERIES]; extern unsigned int pmu_power_flags; +/* Backlight */ +extern void pmu_backlight_init(void); + #endif /* __KERNEL__ */ diff --git a/include/linux/pnp.h b/include/linux/pnp.h index 93b0959eb..ab8a8dd8d 100644 --- a/include/linux/pnp.h +++ b/include/linux/pnp.h @@ -389,7 +389,8 @@ int pnp_start_dev(struct pnp_dev *dev); int pnp_stop_dev(struct pnp_dev *dev); int pnp_activate_dev(struct pnp_dev *dev); int pnp_disable_dev(struct pnp_dev *dev); -void pnp_resource_change(struct resource *resource, unsigned long start, unsigned long size); +void pnp_resource_change(struct resource *resource, resource_size_t start, + resource_size_t size); /* protocol helpers */ int pnp_is_active(struct pnp_dev * dev); @@ -434,7 +435,9 @@ static inline int pnp_start_dev(struct pnp_dev *dev) { return -ENODEV; } static inline int pnp_stop_dev(struct pnp_dev *dev) { return -ENODEV; } static inline int pnp_activate_dev(struct pnp_dev *dev) { return -ENODEV; } static inline int pnp_disable_dev(struct pnp_dev *dev) { return -ENODEV; } -static inline void pnp_resource_change(struct resource *resource, unsigned long start, unsigned long size) { } +static inline void pnp_resource_change(struct resource *resource, + resource_size_t start, + resource_size_t size) { } /* protocol helpers */ static inline int pnp_is_active(struct pnp_dev * dev) { return 0; } diff --git a/include/linux/ppp_defs.h b/include/linux/ppp_defs.h index 402056cd0..c6b13ff85 100644 --- a/include/linux/ppp_defs.h +++ b/include/linux/ppp_defs.h @@ -42,8 +42,6 @@ #ifndef _PPP_DEFS_H_ #define _PPP_DEFS_H_ -#include - /* * The basic PPP frame. */ @@ -97,7 +95,11 @@ #define PPP_INITFCS 0xffff /* Initial FCS value */ #define PPP_GOODFCS 0xf0b8 /* Good final FCS value */ + +#ifdef __KERNEL__ +#include #define PPP_FCS(fcs, c) crc_ccitt_byte(fcs, c) +#endif /* * Extended asyncmap - allows any character to be escaped. @@ -179,12 +181,4 @@ struct ppp_idle { time_t recv_idle; /* time since last NP packet received */ }; -#ifndef __P -#ifdef __STDC__ -#define __P(x) x -#else -#define __P(x) () -#endif -#endif - #endif /* _PPP_DEFS_H_ */ diff --git a/include/linux/prctl.h b/include/linux/prctl.h index bf022c43a..52a9be412 100644 --- a/include/linux/prctl.h +++ b/include/linux/prctl.h @@ -52,4 +52,11 @@ #define PR_SET_NAME 15 /* Set process name */ #define PR_GET_NAME 16 /* Get process name */ +/* Get/set process endian */ +#define PR_GET_ENDIAN 19 +#define PR_SET_ENDIAN 20 +# define PR_ENDIAN_BIG 0 +# define PR_ENDIAN_LITTLE 1 /* True little endian mode */ +# define PR_ENDIAN_PPC_LITTLE 2 /* "PowerPC" pseudo little endian */ + #endif /* _LINUX_PRCTL_H */ diff --git a/include/linux/preempt.h b/include/linux/preempt.h index 5769d14d1..d0926d634 100644 --- a/include/linux/preempt.h +++ b/include/linux/preempt.h @@ -6,7 +6,6 @@ * preempt_count (used for kernel preemption, interrupt count, etc.) */ -#include #include #include diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h index 0713dc555..0c4d76055 100644 --- a/include/linux/proc_fs.h +++ b/include/linux/proc_fs.h @@ -1,7 +1,6 @@ #ifndef _LINUX_PROC_FS_H #define _LINUX_PROC_FS_H -#include #include #include #include @@ -101,9 +100,8 @@ extern void proc_misc_init(void); struct mm_struct; +void proc_flush_task(struct task_struct *task); struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, struct nameidata *); -struct dentry *proc_pid_unhash(struct task_struct *p); -void proc_pid_flush(struct dentry *proc_dentry); int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir); unsigned long task_vsize(struct mm_struct *); int task_statm(struct mm_struct *, int *, int *, int *, int *); @@ -213,8 +211,7 @@ static inline void proc_net_remove(const char *name) #define proc_net_create(name, mode, info) ({ (void)(mode), NULL; }) static inline void proc_net_remove(const char *name) {} -static inline struct dentry *proc_pid_unhash(struct task_struct *p) { return NULL; } -static inline void proc_pid_flush(struct dentry *proc_dentry) { } +static inline void proc_flush_task(struct task_struct *task) { } static inline struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode, struct proc_dir_entry *parent) { return NULL; } @@ -250,9 +247,9 @@ extern void kclist_add(struct kcore_list *, void *, size_t); #endif struct proc_inode { - struct task_struct *task; - int type; + struct pid *pid; int vx_flags; + int fd; union { int (*proc_get_link)(struct inode *, struct dentry **, struct vfsmount **); int (*proc_read)(struct task_struct *task, char *page); @@ -272,4 +269,10 @@ static inline struct proc_dir_entry *PDE(const struct inode *inode) return PROC_I(inode)->pde; } +struct proc_maps_private { + struct pid *pid; + struct task_struct *task; + struct vm_area_struct *tail_vma; +}; + #endif /* _LINUX_PROC_FS_H */ diff --git a/include/linux/profile.h b/include/linux/profile.h index 1f2fea664..e633004ae 100644 --- a/include/linux/profile.h +++ b/include/linux/profile.h @@ -4,7 +4,6 @@ #ifdef __KERNEL__ #include -#include #include #include #include diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h index 578c28e50..5438afe59 100644 --- a/include/linux/ptrace.h +++ b/include/linux/ptrace.h @@ -49,64 +49,185 @@ #include #ifdef __KERNEL__ -/* - * Ptrace flags - */ +#include +#include +struct task_struct; +struct siginfo; +struct rusage; + -#define PT_PTRACED 0x00000001 -#define PT_DTRACE 0x00000002 /* delayed trace (used on m68k, i386) */ -#define PT_TRACESYSGOOD 0x00000004 -#define PT_PTRACE_CAP 0x00000008 /* ptracer can follow suid-exec */ -#define PT_TRACE_FORK 0x00000010 -#define PT_TRACE_VFORK 0x00000020 -#define PT_TRACE_CLONE 0x00000040 -#define PT_TRACE_EXEC 0x00000080 -#define PT_TRACE_VFORK_DONE 0x00000100 -#define PT_TRACE_EXIT 0x00000200 -#define PT_ATTACHED 0x00000400 /* parent != real_parent */ - -#define PT_TRACE_MASK 0x000003f4 - -/* single stepping state bits (used on ARM and PA-RISC) */ -#define PT_SINGLESTEP_BIT 31 -#define PT_SINGLESTEP (1< /* For unlikely. */ -#include /* For struct task_struct. */ - - -extern long arch_ptrace(struct task_struct *child, long request, long addr, long data); -extern struct task_struct *ptrace_get_task_struct(pid_t pid); -extern int ptrace_traceme(void); -extern int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len); -extern int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long dst, int len); -extern int ptrace_attach(struct task_struct *tsk); -extern int ptrace_detach(struct task_struct *, unsigned int); -extern void __ptrace_detach(struct task_struct *, unsigned int); -extern void ptrace_disable(struct task_struct *); -extern int ptrace_check_attach(struct task_struct *task, int kill); -extern int ptrace_request(struct task_struct *child, long request, long addr, long data); -extern void ptrace_notify(int exit_code); -extern void __ptrace_link(struct task_struct *child, - struct task_struct *new_parent); -extern void __ptrace_unlink(struct task_struct *child); -extern void ptrace_untrace(struct task_struct *child); extern int ptrace_may_attach(struct task_struct *task); extern int __ptrace_may_attach(struct task_struct *task); -static inline void ptrace_link(struct task_struct *child, - struct task_struct *new_parent) + +#ifdef CONFIG_PTRACE +#include +struct utrace_attached_engine; +struct utrace_regset_view; + +/* + * These must be defined by arch code to handle machine-specific ptrace + * requests such as PTRACE_PEEKUSR and PTRACE_GETREGS. Returns -ENOSYS for + * any request it does not handle, then handled by machine-independent code. + * This can change *request and then return -ENOSYS to handle a + * machine-specific alias for a generic request. + * + * This code should NOT access task machine state directly. Instead it + * should use the utrace_regset accessors. The functions below make this easy. + * + * Any nonzero return value should be for an error. If the return value of + * the ptrace syscall should be a nonzero success value, this returns zero + * and sets *retval to the value--which might have any bit pattern at all, + * including one that looks like -ENOSYS or another error code. + */ +extern fastcall int arch_ptrace(long *request, struct task_struct *child, + struct utrace_attached_engine *engine, + unsigned long addr, unsigned long data, + long *retval); +#ifdef CONFIG_COMPAT +#include + +extern fastcall int arch_compat_ptrace(compat_long_t *request, + struct task_struct *child, + struct utrace_attached_engine *engine, + compat_ulong_t a, compat_ulong_t d, + compat_long_t *retval); +#endif + +/* + * Convenience function doing access to a single utrace_regset for ptrace. + * The offset and size are in bytes, giving the location in the regset data. + */ +extern fastcall int ptrace_regset_access(struct task_struct *child, + struct utrace_attached_engine *engine, + const struct utrace_regset_view *view, + int setno, unsigned long offset, + unsigned int size, void __user *data, + int write); + +/* + * Convenience wrapper for doing access to a whole utrace_regset for ptrace. + */ +static inline int ptrace_whole_regset(struct task_struct *child, + struct utrace_attached_engine *engine, + long data, int setno, int write) +{ + return ptrace_regset_access(child, engine, utrace_native_view(current), + setno, 0, -1, (void __user *)data, write); +} + +/* + * Convenience function doing access to a single slot in a utrace_regset. + * The regno value gives a slot number plus regset->bias. + * The value accessed is regset->size bytes long. + */ +extern fastcall int ptrace_onereg_access(struct task_struct *child, + struct utrace_attached_engine *engine, + const struct utrace_regset_view *view, + int setno, unsigned long regno, + void __user *data, int write); + + +/* + * An array of these describes the layout of the virtual struct user + * accessed by PEEKUSR/POKEUSR, or the structure used by GETREGS et al. + * The array is terminated by an element with .end of zero. + * An element describes the range [.start, .end) of struct user offsets, + * measured in bytes; it maps to the regset in the view's regsets array + * at the index given by .regset, at .offset bytes into that regset's data. + * If .regset is -1, then the [.start, .end) range reads as zero. + */ +struct ptrace_layout_segment { + unsigned int start, end, regset, offset; +}; + +/* + * Convenience function for doing access to a ptrace compatibility layout. + * The offset and size are in bytes. + */ +extern fastcall int ptrace_layout_access( + struct task_struct *child, struct utrace_attached_engine *engine, + const struct utrace_regset_view *view, + const struct ptrace_layout_segment layout[], + unsigned long offset, unsigned int size, + void __user *data, void *kdata, int write); + + +/* Convenience wrapper for the common PTRACE_PEEKUSR implementation. */ +static inline int ptrace_peekusr(struct task_struct *child, + struct utrace_attached_engine *engine, + const struct ptrace_layout_segment layout[], + unsigned long addr, long data) +{ + return ptrace_layout_access(child, engine, utrace_native_view(current), + layout, addr, sizeof(long), + (unsigned long __user *)data, NULL, 0); +} + +/* Convenience wrapper for the common PTRACE_PEEKUSR implementation. */ +static inline int ptrace_pokeusr(struct task_struct *child, + struct utrace_attached_engine *engine, + const struct ptrace_layout_segment layout[], + unsigned long addr, long data) +{ + return ptrace_layout_access(child, engine, utrace_native_view(current), + layout, addr, sizeof(long), + NULL, &data, 1); +} + +#ifdef CONFIG_COMPAT +/* Convenience wrapper for the common PTRACE_PEEKUSR implementation. */ +static inline int ptrace_compat_peekusr( + struct task_struct *child, struct utrace_attached_engine *engine, + const struct ptrace_layout_segment layout[], + compat_ulong_t addr, compat_ulong_t data) +{ + compat_ulong_t *udata = (compat_ulong_t __user *) (unsigned long) data; + return ptrace_layout_access(child, engine, utrace_native_view(current), + layout, addr, sizeof(compat_ulong_t), + udata, NULL, 0); +} + +/* Convenience wrapper for the common PTRACE_PEEKUSR implementation. */ +static inline int ptrace_compat_pokeusr( + struct task_struct *child, struct utrace_attached_engine *engine, + const struct ptrace_layout_segment layout[], + compat_ulong_t addr, compat_ulong_t data) { - if (unlikely(child->ptrace)) - __ptrace_link(child, new_parent); + return ptrace_layout_access(child, engine, utrace_native_view(current), + layout, addr, sizeof(compat_ulong_t), + NULL, &data, 1); } -static inline void ptrace_unlink(struct task_struct *child) +#endif + + +/* + * Called in do_exit, after setting PF_EXITING, no locks are held. + */ +void ptrace_exit(struct task_struct *tsk); + +/* + * Called in do_wait, with tasklist_lock held for reading. + * This reports any ptrace-child that is ready as do_wait would a normal child. + * If there are no ptrace children, returns -ECHILD. + * If there are some ptrace children but none reporting now, returns 0. + * In those cases the tasklist_lock is still held so next_thread(tsk) works. + * For any other return value, tasklist_lock is released before return. + */ +int ptrace_do_wait(struct task_struct *tsk, + pid_t pid, int options, struct siginfo __user *infop, + int __user *stat_addr, struct rusage __user *rusagep); +#else +static inline void ptrace_exit(struct task_struct *tsk) { } +static inline int ptrace_do_wait(struct task_struct *tsk, + pid_t pid, int options, + struct siginfo __user *infop, + int __user *stat_addr, + struct rusage __user *rusagep) { - if (unlikely(child->ptrace)) - __ptrace_unlink(child); + return -ECHILD; } +#endif #ifndef force_successful_syscall_return diff --git a/include/linux/quota.h b/include/linux/quota.h index 2dab71e1c..b8fbf26eb 100644 --- a/include/linux/quota.h +++ b/include/linux/quota.h @@ -37,8 +37,6 @@ #include #include -#include -#include #define __DQUOT_VERSION__ "dquot_6.5.1" #define __DQUOT_NUM_VERSION__ 6*10000+5*100+1 @@ -133,6 +131,8 @@ struct if_dqinfo { }; #ifdef __KERNEL__ +#include +#include #include #include diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h index 21e5a9124..5110201a4 100644 --- a/include/linux/quotaops.h +++ b/include/linux/quotaops.h @@ -10,7 +10,6 @@ #ifndef _LINUX_QUOTAOPS_ #define _LINUX_QUOTAOPS_ -#include #include #include diff --git a/include/linux/radix-tree.h b/include/linux/radix-tree.h index dd83cca28..9158a6814 100644 --- a/include/linux/radix-tree.h +++ b/include/linux/radix-tree.h @@ -23,6 +23,9 @@ #include #include +#define RADIX_TREE_MAX_TAGS 2 + +/* root tags are stored in gfp_mask, shifted by __GFP_BITS_SHIFT */ struct radix_tree_root { unsigned int height; gfp_t gfp_mask; @@ -45,8 +48,6 @@ do { \ (root)->rnode = NULL; \ } while (0) -#define RADIX_TREE_MAX_TAGS 2 - int radix_tree_insert(struct radix_tree_root *, unsigned long, void *); void *radix_tree_lookup(struct radix_tree_root *, unsigned long); void **radix_tree_lookup_slot(struct radix_tree_root *, unsigned long); diff --git a/include/linux/raid/bitmap.h b/include/linux/raid/bitmap.h index 899437802..63df898fe 100644 --- a/include/linux/raid/bitmap.h +++ b/include/linux/raid/bitmap.h @@ -140,6 +140,7 @@ typedef __u16 bitmap_counter_t; enum bitmap_state { BITMAP_ACTIVE = 0x001, /* the bitmap is in use */ BITMAP_STALE = 0x002, /* the bitmap file is out of date or had -EIO */ + BITMAP_WRITE_ERROR = 0x004, /* A write error has occurred */ BITMAP_HOSTENDIAN = 0x8000, }; @@ -244,15 +245,9 @@ struct bitmap { unsigned long daemon_lastrun; /* jiffies of last run */ unsigned long daemon_sleep; /* how many seconds between updates? */ - /* - * bitmap_writeback_daemon waits for file-pages that have been written, - * as there is no way to get a call-back when a page write completes. - */ - mdk_thread_t *writeback_daemon; - spinlock_t write_lock; + atomic_t pending_writes; /* pending writes to the bitmap file */ wait_queue_head_t write_wait; - struct list_head complete_pages; - mempool_t *write_pool; + }; /* the bitmap API */ diff --git a/include/linux/raid/linear.h b/include/linux/raid/linear.h index 7eaf290e1..ba15469da 100644 --- a/include/linux/raid/linear.h +++ b/include/linux/raid/linear.h @@ -13,8 +13,10 @@ typedef struct dev_info dev_info_t; struct linear_private_data { + struct linear_private_data *prev; /* earlier version */ dev_info_t **hash_table; sector_t hash_spacing; + sector_t array_size; int preshift; /* shift before dividing by hash_spacing */ dev_info_t disks[0]; }; diff --git a/include/linux/raid/md.h b/include/linux/raid/md.h index 66b44e5e0..eb3e547c8 100644 --- a/include/linux/raid/md.h +++ b/include/linux/raid/md.h @@ -85,8 +85,6 @@ extern void md_done_sync(mddev_t *mddev, int blocks, int ok); extern void md_error (mddev_t *mddev, mdk_rdev_t *rdev); extern void md_unplug_mddev(mddev_t *mddev); -extern void md_print_devices (void); - extern void md_super_write(mddev_t *mddev, mdk_rdev_t *rdev, sector_t sector, int size, struct page *page); extern void md_super_wait(mddev_t *mddev); @@ -97,7 +95,5 @@ extern void md_new_event(mddev_t *mddev); extern void md_update_sb(mddev_t * mddev); -#define MD_BUG(x...) { printk("md: bug in file %s, line %d\n", __FILE__, __LINE__); md_print_devices(); } - #endif diff --git a/include/linux/raid/md_k.h b/include/linux/raid/md_k.h index e2df61f5b..d28890295 100644 --- a/include/linux/raid/md_k.h +++ b/include/linux/raid/md_k.h @@ -40,7 +40,8 @@ typedef struct mdk_rdev_s mdk_rdev_t; * options passed in raidrun: */ -#define MAX_CHUNK_SIZE (4096*1024) +/* Currently this must fix in an 'int' */ +#define MAX_CHUNK_SIZE (1<<30) /* * MD's 'extended' device @@ -57,6 +58,7 @@ struct mdk_rdev_s struct page *sb_page; int sb_loaded; + __u64 sb_events; sector_t data_offset; /* start of data in array */ sector_t sb_offset; int sb_size; /* bytes in the superblock */ @@ -87,6 +89,10 @@ struct mdk_rdev_s * array and could again if we did a partial * resync from the bitmap */ + sector_t recovery_offset;/* If this device has been partially + * recovered, this is where we were + * up to. + */ atomic_t nr_pending; /* number of pending requests. * only maintained for arrays that @@ -142,9 +148,10 @@ struct mddev_s struct mdk_thread_s *thread; /* management thread */ struct mdk_thread_s *sync_thread; /* doing resync or reconstruct */ - sector_t curr_resync; /* blocks scheduled */ + sector_t curr_resync; /* last block scheduled */ unsigned long resync_mark; /* a recent timestamp */ sector_t resync_mark_cnt;/* blocks written at resync_mark */ + sector_t curr_mark_cnt; /* blocks scheduled now */ sector_t resync_max_sectors; /* may be set by personality */ @@ -182,6 +189,8 @@ struct mddev_s #define MD_RECOVERY_REQUESTED 6 #define MD_RECOVERY_CHECK 7 #define MD_RECOVERY_RESHAPE 8 +#define MD_RECOVERY_FROZEN 9 + unsigned long recovery; int in_sync; /* know to not need resync */ diff --git a/include/linux/raid/md_p.h b/include/linux/raid/md_p.h index f1fbae7e3..b6ebc69ba 100644 --- a/include/linux/raid/md_p.h +++ b/include/linux/raid/md_p.h @@ -265,9 +265,12 @@ struct mdp_superblock_1 { /* feature_map bits */ #define MD_FEATURE_BITMAP_OFFSET 1 +#define MD_FEATURE_RECOVERY_OFFSET 2 /* recovery_offset is present and + * must be honoured + */ #define MD_FEATURE_RESHAPE_ACTIVE 4 -#define MD_FEATURE_ALL 5 +#define MD_FEATURE_ALL (1|2|4) #endif diff --git a/include/linux/raid/raid10.h b/include/linux/raid/raid10.h index b1103298a..c41e56a7c 100644 --- a/include/linux/raid/raid10.h +++ b/include/linux/raid/raid10.h @@ -24,11 +24,16 @@ struct r10_private_data_s { int far_copies; /* number of copies layed out * at large strides across drives */ + int far_offset; /* far_copies are offset by 1 stripe + * instead of many + */ int copies; /* near_copies * far_copies. * must be <= raid_disks */ sector_t stride; /* distance between far copies. - * This is size / far_copies + * This is size / far_copies unless + * far_offset, in which case it is + * 1 stripe. */ int chunk_shift; /* shift from chunks to sectors */ diff --git a/include/linux/raid/raid5.h b/include/linux/raid/raid5.h index 914af6670..20ed4c997 100644 --- a/include/linux/raid/raid5.h +++ b/include/linux/raid/raid5.h @@ -212,6 +212,7 @@ struct raid5_private_data { mddev_t *mddev; struct disk_info *spare; int chunk_size, level, algorithm; + int max_degraded; int raid_disks, working_disks, failed_disks; int max_nr_stripes; diff --git a/include/linux/ramfs.h b/include/linux/ramfs.h index 78ecfa28b..00b340ba6 100644 --- a/include/linux/ramfs.h +++ b/include/linux/ramfs.h @@ -2,8 +2,8 @@ #define _LINUX_RAMFS_H struct inode *ramfs_get_inode(struct super_block *sb, int mode, dev_t dev); -struct super_block *ramfs_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data); +extern int ramfs_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt); #ifndef CONFIG_MMU extern unsigned long ramfs_nommu_get_unmapped_area(struct file *file, diff --git a/include/linux/rbtree.h b/include/linux/rbtree.h index 4b7cc4fe3..8d5382e62 100644 --- a/include/linux/rbtree.h +++ b/include/linux/rbtree.h @@ -99,22 +99,43 @@ static inline struct page * rb_insert_page_cache(struct inode * inode, struct rb_node { - struct rb_node *rb_parent; - int rb_color; + unsigned long rb_parent_color; #define RB_RED 0 #define RB_BLACK 1 struct rb_node *rb_right; struct rb_node *rb_left; -}; +} __attribute__((aligned(sizeof(long)))); + /* The alignment might seem pointless, but allegedly CRIS needs it */ struct rb_root { struct rb_node *rb_node; }; + +#define rb_parent(r) ((struct rb_node *)((r)->rb_parent_color & ~3)) +#define rb_color(r) ((r)->rb_parent_color & 1) +#define rb_is_red(r) (!rb_color(r)) +#define rb_is_black(r) rb_color(r) +#define rb_set_red(r) do { (r)->rb_parent_color &= ~1; } while (0) +#define rb_set_black(r) do { (r)->rb_parent_color |= 1; } while (0) + +static inline void rb_set_parent(struct rb_node *rb, struct rb_node *p) +{ + rb->rb_parent_color = (rb->rb_parent_color & 3) | (unsigned long)p; +} +static inline void rb_set_color(struct rb_node *rb, int color) +{ + rb->rb_parent_color = (rb->rb_parent_color & ~1) | color; +} + #define RB_ROOT (struct rb_root) { NULL, } #define rb_entry(ptr, type, member) container_of(ptr, type, member) +#define RB_EMPTY_ROOT(root) ((root)->rb_node == NULL) +#define RB_EMPTY_NODE(node) (rb_parent(node) != node) +#define RB_CLEAR_NODE(node) (rb_set_parent(node, node)) + extern void rb_insert_color(struct rb_node *, struct rb_root *); extern void rb_erase(struct rb_node *, struct rb_root *); @@ -131,8 +152,7 @@ extern void rb_replace_node(struct rb_node *victim, struct rb_node *new, static inline void rb_link_node(struct rb_node * node, struct rb_node * parent, struct rb_node ** rb_link) { - node->rb_parent = parent; - node->rb_color = RB_RED; + node->rb_parent_color = (unsigned long )parent; node->rb_left = node->rb_right = NULL; *rb_link = node; diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 970284f57..b4ca73d65 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h @@ -163,14 +163,22 @@ extern int rcu_needs_cpu(int cpu); * * It is illegal to block while in an RCU read-side critical section. */ -#define rcu_read_lock() preempt_disable() +#define rcu_read_lock() \ + do { \ + preempt_disable(); \ + __acquire(RCU); \ + } while(0) /** * rcu_read_unlock - marks the end of an RCU read-side critical section. * * See rcu_read_lock() for more information. */ -#define rcu_read_unlock() preempt_enable() +#define rcu_read_unlock() \ + do { \ + __release(RCU); \ + preempt_enable(); \ + } while(0) /* * So where is rcu_write_lock()? It does not exist, as there is no @@ -193,14 +201,22 @@ extern int rcu_needs_cpu(int cpu); * can use just rcu_read_lock(). * */ -#define rcu_read_lock_bh() local_bh_disable() +#define rcu_read_lock_bh() \ + do { \ + local_bh_disable(); \ + __acquire(RCU_BH); \ + } while(0) /* * rcu_read_unlock_bh - marks the end of a softirq-only RCU critical section * * See rcu_read_lock_bh() for more information. */ -#define rcu_read_unlock_bh() local_bh_enable() +#define rcu_read_unlock_bh() \ + do { \ + __release(RCU_BH); \ + local_bh_enable(); \ + } while(0) /** * rcu_dereference - fetch an RCU-protected pointer in an @@ -246,7 +262,7 @@ extern int rcu_needs_cpu(int cpu); * softirq handlers will have completed, since in some kernels, these * handlers can run in process context, and can block. * - * This primitive provides the guarantees made by the (deprecated) + * This primitive provides the guarantees made by the (now removed) * synchronize_kernel() API. In contrast, synchronize_rcu() only * guarantees that rcu_read_lock() sections will have completed. * In "classic RCU", these two guarantees happen to be one and @@ -258,13 +274,13 @@ extern void rcu_init(void); extern void rcu_check_callbacks(int cpu, int user); extern void rcu_restart_cpu(int cpu); extern long rcu_batches_completed(void); +extern long rcu_batches_completed_bh(void); /* Exported interfaces */ extern void FASTCALL(call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *head))); extern void FASTCALL(call_rcu_bh(struct rcu_head *head, void (*func)(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); diff --git a/include/linux/reboot.h b/include/linux/reboot.h index 015297ff7..1dd1c7073 100644 --- a/include/linux/reboot.h +++ b/include/linux/reboot.h @@ -59,13 +59,13 @@ extern void machine_crash_shutdown(struct pt_regs *); * Architecture independent implemenations of sys_reboot commands. */ -extern void kernel_restart_prepare(char *cmd); extern void kernel_shutdown_prepare(enum system_states state); extern void kernel_restart(char *cmd); extern void kernel_halt(void); extern void kernel_power_off(void); -extern void kernel_kexec(void); + +void ctrl_alt_del(void); /* * Emergency restart, callable from an interrupt handler. diff --git a/include/linux/reiserfs_fs.h b/include/linux/reiserfs_fs.h index ca3f26985..93de35bbd 100644 --- a/include/linux/reiserfs_fs.h +++ b/include/linux/reiserfs_fs.h @@ -1986,7 +1986,7 @@ void reiserfs_unmap_buffer(struct buffer_head *); /* file.c */ extern struct inode_operations reiserfs_file_inode_operations; extern const struct file_operations reiserfs_file_operations; -extern struct address_space_operations reiserfs_address_space_operations; +extern const struct address_space_operations reiserfs_address_space_operations; /* fix_nodes.c */ diff --git a/include/linux/reiserfs_xattr.h b/include/linux/reiserfs_xattr.h index 9244c5748..5e961035c 100644 --- a/include/linux/reiserfs_xattr.h +++ b/include/linux/reiserfs_xattr.h @@ -2,53 +2,50 @@ File: linux/reiserfs_xattr.h */ -#include -#include #include /* Magic value in header */ -#define REISERFS_XATTR_MAGIC 0x52465841 /* "RFXA" */ +#define REISERFS_XATTR_MAGIC 0x52465841 /* "RFXA" */ struct reiserfs_xattr_header { - __le32 h_magic; /* magic number for identification */ - __le32 h_hash; /* hash of the value */ + __le32 h_magic; /* magic number for identification */ + __le32 h_hash; /* hash of the value */ }; #ifdef __KERNEL__ +#include struct reiserfs_xattr_handler { char *prefix; - int (*init)(void); - void (*exit)(void); - int (*get)(struct inode *inode, const char *name, void *buffer, - size_t size); - int (*set)(struct inode *inode, const char *name, const void *buffer, - size_t size, int flags); - int (*del)(struct inode *inode, const char *name); - int (*list)(struct inode *inode, const char *name, int namelen, char *out); - struct list_head handlers; + int (*init) (void); + void (*exit) (void); + int (*get) (struct inode * inode, const char *name, void *buffer, + size_t size); + int (*set) (struct inode * inode, const char *name, const void *buffer, + size_t size, int flags); + int (*del) (struct inode * inode, const char *name); + int (*list) (struct inode * inode, const char *name, int namelen, + char *out); + struct list_head handlers; }; - #ifdef CONFIG_REISERFS_FS_XATTR #define is_reiserfs_priv_object(inode) IS_PRIVATE(inode) #define has_xattr_dir(inode) (REISERFS_I(inode)->i_flags & i_has_xattr_dir) -ssize_t reiserfs_getxattr (struct dentry *dentry, const char *name, - void *buffer, size_t size); -int reiserfs_setxattr (struct dentry *dentry, const char *name, - const void *value, size_t size, int flags); -ssize_t reiserfs_listxattr (struct dentry *dentry, char *buffer, size_t size); -int reiserfs_removexattr (struct dentry *dentry, const char *name); -int reiserfs_delete_xattrs (struct inode *inode); -int reiserfs_chown_xattrs (struct inode *inode, struct iattr *attrs); -int reiserfs_xattr_init (struct super_block *sb, int mount_flags); -int reiserfs_permission (struct inode *inode, int mask, struct nameidata *nd); -int reiserfs_permission_locked (struct inode *inode, int mask, struct nameidata *nd); - -int reiserfs_xattr_del (struct inode *, const char *); -int reiserfs_xattr_get (const struct inode *, const char *, void *, size_t); -int reiserfs_xattr_set (struct inode *, const char *, const void *, - size_t, int); +ssize_t reiserfs_getxattr(struct dentry *dentry, const char *name, + void *buffer, size_t size); +int reiserfs_setxattr(struct dentry *dentry, const char *name, + const void *value, size_t size, int flags); +ssize_t reiserfs_listxattr(struct dentry *dentry, char *buffer, size_t size); +int reiserfs_removexattr(struct dentry *dentry, const char *name); +int reiserfs_delete_xattrs(struct inode *inode); +int reiserfs_chown_xattrs(struct inode *inode, struct iattr *attrs); +int reiserfs_xattr_init(struct super_block *sb, int mount_flags); +int reiserfs_permission(struct inode *inode, int mask, struct nameidata *nd); + +int reiserfs_xattr_del(struct inode *, const char *); +int reiserfs_xattr_get(const struct inode *, const char *, void *, size_t); +int reiserfs_xattr_set(struct inode *, const char *, const void *, size_t, int); extern struct reiserfs_xattr_handler user_handler; extern struct reiserfs_xattr_handler trusted_handler; @@ -56,69 +53,60 @@ extern struct reiserfs_xattr_handler trusted_handler; extern struct reiserfs_xattr_handler security_handler; #endif -int reiserfs_xattr_register_handlers (void) __init; -void reiserfs_xattr_unregister_handlers (void); +int reiserfs_xattr_register_handlers(void) __init; +void reiserfs_xattr_unregister_handlers(void); -static inline void -reiserfs_write_lock_xattrs(struct super_block *sb) +static inline void reiserfs_write_lock_xattrs(struct super_block *sb) { - down_write (&REISERFS_XATTR_DIR_SEM(sb)); + down_write(&REISERFS_XATTR_DIR_SEM(sb)); } -static inline void -reiserfs_write_unlock_xattrs(struct super_block *sb) +static inline void reiserfs_write_unlock_xattrs(struct super_block *sb) { - up_write (&REISERFS_XATTR_DIR_SEM(sb)); + up_write(&REISERFS_XATTR_DIR_SEM(sb)); } -static inline void -reiserfs_read_lock_xattrs(struct super_block *sb) +static inline void reiserfs_read_lock_xattrs(struct super_block *sb) { - down_read (&REISERFS_XATTR_DIR_SEM(sb)); + down_read(&REISERFS_XATTR_DIR_SEM(sb)); } -static inline void -reiserfs_read_unlock_xattrs(struct super_block *sb) +static inline void reiserfs_read_unlock_xattrs(struct super_block *sb) { - up_read (&REISERFS_XATTR_DIR_SEM(sb)); + up_read(&REISERFS_XATTR_DIR_SEM(sb)); } -static inline void -reiserfs_write_lock_xattr_i(struct inode *inode) +static inline void reiserfs_write_lock_xattr_i(struct inode *inode) { - down_write (&REISERFS_I(inode)->xattr_sem); + down_write(&REISERFS_I(inode)->xattr_sem); } -static inline void -reiserfs_write_unlock_xattr_i(struct inode *inode) +static inline void reiserfs_write_unlock_xattr_i(struct inode *inode) { - up_write (&REISERFS_I(inode)->xattr_sem); + up_write(&REISERFS_I(inode)->xattr_sem); } -static inline void -reiserfs_read_lock_xattr_i(struct inode *inode) +static inline void reiserfs_read_lock_xattr_i(struct inode *inode) { - down_read (&REISERFS_I(inode)->xattr_sem); + down_read(&REISERFS_I(inode)->xattr_sem); } -static inline void -reiserfs_read_unlock_xattr_i(struct inode *inode) +static inline void reiserfs_read_unlock_xattr_i(struct inode *inode) { - up_read (&REISERFS_I(inode)->xattr_sem); + up_read(&REISERFS_I(inode)->xattr_sem); } -static inline void -reiserfs_mark_inode_private(struct inode *inode) +static inline void reiserfs_mark_inode_private(struct inode *inode) { - inode->i_flags |= S_PRIVATE; + inode->i_flags |= S_PRIVATE; } #else #define is_reiserfs_priv_object(inode) 0 -#define reiserfs_mark_inode_private(inode) +#define reiserfs_mark_inode_private(inode) do {;} while(0) #define reiserfs_getxattr NULL #define reiserfs_setxattr NULL #define reiserfs_listxattr NULL #define reiserfs_removexattr NULL -#define reiserfs_write_lock_xattrs(sb) -#define reiserfs_write_unlock_xattrs(sb) +#define reiserfs_write_lock_xattrs(sb) do {;} while(0) +#define reiserfs_write_unlock_xattrs(sb) do {;} while(0) #define reiserfs_read_lock_xattrs(sb) #define reiserfs_read_unlock_xattrs(sb) @@ -127,13 +115,20 @@ reiserfs_mark_inode_private(struct inode *inode) #define reiserfs_xattr_register_handlers() 0 #define reiserfs_xattr_unregister_handlers() -static inline int reiserfs_delete_xattrs (struct inode *inode) { return 0; }; -static inline int reiserfs_chown_xattrs (struct inode *inode, struct iattr *attrs) { return 0; }; -static inline int reiserfs_xattr_init (struct super_block *sb, int mount_flags) +static inline int reiserfs_delete_xattrs(struct inode *inode) +{ + return 0; +}; +static inline int reiserfs_chown_xattrs(struct inode *inode, + struct iattr *attrs) +{ + return 0; +}; +static inline int reiserfs_xattr_init(struct super_block *sb, int mount_flags) { - sb->s_flags = (sb->s_flags & ~MS_POSIXACL); /* to be sure */ - return 0; + sb->s_flags = (sb->s_flags & ~MS_POSIXACL); /* to be sure */ + return 0; }; #endif -#endif /* __KERNEL__ */ +#endif /* __KERNEL__ */ diff --git a/include/linux/relay.h b/include/linux/relay.h index 4bcc1531d..24accb483 100644 --- a/include/linux/relay.h +++ b/include/linux/relay.h @@ -10,7 +10,6 @@ #ifndef _LINUX_RELAY_H #define _LINUX_RELAY_H -#include #include #include #include diff --git a/include/linux/resource.h b/include/linux/resource.h index b3bc5fd18..14757afef 100644 --- a/include/linux/resource.h +++ b/include/linux/resource.h @@ -3,6 +3,8 @@ #include +struct task_struct; + /* * Resource control/accounting header file for linux */ @@ -70,4 +72,6 @@ struct rlimit { */ #include +int getrusage(struct task_struct *p, int who, struct rusage __user *ru); + #endif diff --git a/include/linux/rio.h b/include/linux/rio.h index c7e907faa..d93857056 100644 --- a/include/linux/rio.h +++ b/include/linux/rio.h @@ -17,7 +17,6 @@ #ifdef __KERNEL__ #include -#include #include #include #include diff --git a/include/linux/rio_drv.h b/include/linux/rio_drv.h index f54772d0e..7adb2a1aa 100644 --- a/include/linux/rio_drv.h +++ b/include/linux/rio_drv.h @@ -16,7 +16,6 @@ #ifdef __KERNEL__ #include -#include #include #include #include diff --git a/include/linux/rmap.h b/include/linux/rmap.h index d6b9bcd13..81c24e371 100644 --- a/include/linux/rmap.h +++ b/include/linux/rmap.h @@ -4,7 +4,6 @@ * Declarations for Reverse Mapping functions in mm/rmap.c */ -#include #include #include #include @@ -73,7 +72,7 @@ void __anon_vma_link(struct vm_area_struct *); void page_add_anon_rmap(struct page *, struct vm_area_struct *, unsigned long); void page_add_new_anon_rmap(struct page *, struct vm_area_struct *, unsigned long); void page_add_file_rmap(struct page *); -void page_remove_rmap(struct page *); +void page_remove_rmap(struct page *, struct vm_area_struct *); /** * page_dup_rmap - duplicate pte mapping to a page @@ -92,7 +91,6 @@ static inline void page_dup_rmap(struct page *page) */ int page_referenced(struct page *, int is_locked); int try_to_unmap(struct page *, int ignore_refs); -void remove_from_swap(struct page *page); /* * Called from mm/filemap_xip.c to unmap empty zero page @@ -105,6 +103,14 @@ pte_t *page_check_address(struct page *, struct mm_struct *, */ unsigned long page_address_in_vma(struct page *, struct vm_area_struct *); +/* + * Cleans the PTEs of shared mappings. + * (and since clean PTEs should also be readonly, write protects them too) + * + * returns the number of cleaned PTEs. + */ +int page_mkclean(struct page *); + #else /* !CONFIG_MMU */ #define anon_vma_init() do {} while (0) diff --git a/include/linux/root_dev.h b/include/linux/root_dev.h index c7097d31e..340d85de6 100644 --- a/include/linux/root_dev.h +++ b/include/linux/root_dev.h @@ -2,6 +2,8 @@ #define _ROOT_DEV_H_ #include +#include +#include enum { Root_NFS = MKDEV(UNNAMED_MAJOR, 255), diff --git a/include/linux/rtc.h b/include/linux/rtc.h index ab61cd119..5371e4e74 100644 --- a/include/linux/rtc.h +++ b/include/linux/rtc.h @@ -34,8 +34,8 @@ struct rtc_time { * alarm API. */ struct rtc_wkalrm { - unsigned char enabled; /* 0 = alarm disable, 1 = alarm disabled */ - unsigned char pending; /* 0 = alarm pending, 1 = alarm not pending */ + unsigned char enabled; /* 0 = alarm disabled, 1 = alarm enabled */ + unsigned char pending; /* 0 = alarm not pending, 1 = alarm pending */ struct rtc_time time; /* time the alarm is set to */ }; @@ -102,6 +102,7 @@ struct rtc_pll_info { #include extern int rtc_month_days(unsigned int month, unsigned int year); +extern int rtc_year_days(unsigned int day, unsigned int month, unsigned int year); extern int rtc_valid_tm(struct rtc_time *tm); extern int rtc_tm_to_time(struct rtc_time *tm, unsigned long *time); extern void rtc_time_to_tm(unsigned long time, struct rtc_time *tm); @@ -155,6 +156,17 @@ struct rtc_device struct rtc_task *irq_task; spinlock_t irq_task_lock; int irq_freq; + int max_user_freq; +#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL + struct work_struct uie_task; + struct timer_list uie_timer; + /* Those fields are protected by rtc->irq_lock */ + unsigned int oldsecs; + unsigned int irq_active:1; + unsigned int stop_uie_polling:1; + unsigned int uie_task_active:1; + unsigned int uie_timer_active:1; +#endif }; #define to_rtc_device(d) container_of(d, struct rtc_device, class_dev) diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h index df0cdd410..facd9ee37 100644 --- a/include/linux/rtnetlink.h +++ b/include/linux/rtnetlink.h @@ -909,7 +909,6 @@ struct tcamsg #ifdef __KERNEL__ -#include #include extern size_t rtattr_strlcpy(char *dest, const struct rtattr *rta, size_t size); diff --git a/include/linux/rwsem-spinlock.h b/include/linux/rwsem-spinlock.h index f30f80508..ae1fcadd5 100644 --- a/include/linux/rwsem-spinlock.h +++ b/include/linux/rwsem-spinlock.h @@ -32,30 +32,37 @@ struct rw_semaphore { __s32 activity; spinlock_t wait_lock; struct list_head wait_list; -#if RWSEM_DEBUG - int debug; +#ifdef CONFIG_DEBUG_LOCK_ALLOC + struct lockdep_map dep_map; #endif }; -/* - * initialisation - */ -#if RWSEM_DEBUG -#define __RWSEM_DEBUG_INIT , 0 +#ifdef CONFIG_DEBUG_LOCK_ALLOC +# define __RWSEM_DEP_MAP_INIT(lockname) , .dep_map = { .name = #lockname } #else -#define __RWSEM_DEBUG_INIT /* */ +# define __RWSEM_DEP_MAP_INIT(lockname) #endif #define __RWSEM_INITIALIZER(name) \ -{ 0, SPIN_LOCK_UNLOCKED, LIST_HEAD_INIT((name).wait_list) __RWSEM_DEBUG_INIT } +{ 0, SPIN_LOCK_UNLOCKED, LIST_HEAD_INIT((name).wait_list) __RWSEM_DEP_MAP_INIT(name) } #define DECLARE_RWSEM(name) \ struct rw_semaphore name = __RWSEM_INITIALIZER(name) -extern void FASTCALL(init_rwsem(struct rw_semaphore *sem)); +extern void __init_rwsem(struct rw_semaphore *sem, const char *name, + struct lock_class_key *key); + +#define init_rwsem(sem) \ +do { \ + static struct lock_class_key __key; \ + \ + __init_rwsem((sem), #sem, &__key); \ +} while (0) + extern void FASTCALL(__down_read(struct rw_semaphore *sem)); extern int FASTCALL(__down_read_trylock(struct rw_semaphore *sem)); extern void FASTCALL(__down_write(struct rw_semaphore *sem)); +extern void FASTCALL(__down_write_nested(struct rw_semaphore *sem, int subclass)); extern int FASTCALL(__down_write_trylock(struct rw_semaphore *sem)); extern void FASTCALL(__up_read(struct rw_semaphore *sem)); extern void FASTCALL(__up_write(struct rw_semaphore *sem)); diff --git a/include/linux/rwsem.h b/include/linux/rwsem.h index bfb988885..7b524b410 100644 --- a/include/linux/rwsem.h +++ b/include/linux/rwsem.h @@ -9,11 +9,8 @@ #include -#define RWSEM_DEBUG 0 - #ifdef __KERNEL__ -#include #include #include #include @@ -27,89 +24,71 @@ struct rw_semaphore; #include /* use an arch-specific implementation */ #endif -#ifndef rwsemtrace -#if RWSEM_DEBUG -extern void FASTCALL(rwsemtrace(struct rw_semaphore *sem, const char *str)); -#else -#define rwsemtrace(SEM,FMT) -#endif -#endif - /* * lock for reading */ -static inline void down_read(struct rw_semaphore *sem) -{ - might_sleep(); - rwsemtrace(sem,"Entering down_read"); - __down_read(sem); - rwsemtrace(sem,"Leaving down_read"); -} +extern void down_read(struct rw_semaphore *sem); /* * trylock for reading -- returns 1 if successful, 0 if contention */ -static inline int down_read_trylock(struct rw_semaphore *sem) -{ - int ret; - rwsemtrace(sem,"Entering down_read_trylock"); - ret = __down_read_trylock(sem); - rwsemtrace(sem,"Leaving down_read_trylock"); - return ret; -} +extern int down_read_trylock(struct rw_semaphore *sem); /* * lock for writing */ -static inline void down_write(struct rw_semaphore *sem) -{ - might_sleep(); - rwsemtrace(sem,"Entering down_write"); - __down_write(sem); - rwsemtrace(sem,"Leaving down_write"); -} +extern void down_write(struct rw_semaphore *sem); /* * trylock for writing -- returns 1 if successful, 0 if contention */ -static inline int down_write_trylock(struct rw_semaphore *sem) -{ - int ret; - rwsemtrace(sem,"Entering down_write_trylock"); - ret = __down_write_trylock(sem); - rwsemtrace(sem,"Leaving down_write_trylock"); - return ret; -} +extern int down_write_trylock(struct rw_semaphore *sem); /* * release a read lock */ -static inline void up_read(struct rw_semaphore *sem) -{ - rwsemtrace(sem,"Entering up_read"); - __up_read(sem); - rwsemtrace(sem,"Leaving up_read"); -} +extern void up_read(struct rw_semaphore *sem); /* * release a write lock */ -static inline void up_write(struct rw_semaphore *sem) -{ - rwsemtrace(sem,"Entering up_write"); - __up_write(sem); - rwsemtrace(sem,"Leaving up_write"); -} +extern void up_write(struct rw_semaphore *sem); /* * downgrade write lock to read lock */ -static inline void downgrade_write(struct rw_semaphore *sem) -{ - rwsemtrace(sem,"Entering downgrade_write"); - __downgrade_write(sem); - rwsemtrace(sem,"Leaving downgrade_write"); -} +extern void downgrade_write(struct rw_semaphore *sem); + +#ifdef CONFIG_DEBUG_LOCK_ALLOC +/* + * nested locking. NOTE: rwsems are not allowed to recurse + * (which occurs if the same task tries to acquire the same + * lock instance multiple times), but multiple locks of the + * same lock class might be taken, if the order of the locks + * is always the same. This ordering rule can be expressed + * to lockdep via the _nested() APIs, but enumerating the + * subclasses that are used. (If the nesting relationship is + * static then another method for expressing nested locking is + * the explicit definition of lock class keys and the use of + * lockdep_set_class() at lock initialization time. + * See Documentation/lockdep-design.txt for more details.) + */ +extern void down_read_nested(struct rw_semaphore *sem, int subclass); +extern void down_write_nested(struct rw_semaphore *sem, int subclass); +/* + * Take/release a lock when not the owner will release it. + * + * [ This API should be avoided as much as possible - the + * proper abstraction for this case is completions. ] + */ +extern void down_read_non_owner(struct rw_semaphore *sem); +extern void up_read_non_owner(struct rw_semaphore *sem); +#else +# define down_read_nested(sem, subclass) down_read(sem) +# define down_write_nested(sem, subclass) down_write(sem) +# define down_read_non_owner(sem) down_read(sem) +# define up_read_non_owner(sem) up_read(sem) +#endif #endif /* __KERNEL__ */ #endif /* _LINUX_RWSEM_H */ diff --git a/include/linux/scc.h b/include/linux/scc.h index 885a4a02b..3495bd953 100644 --- a/include/linux/scc.h +++ b/include/linux/scc.h @@ -3,7 +3,6 @@ #ifndef _SCC_H #define _SCC_H -#include /* selection of hardware types */ diff --git a/include/linux/sched.h b/include/linux/sched.h index fda98fe81..bd6c826f9 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1,9 +1,46 @@ #ifndef _LINUX_SCHED_H #define _LINUX_SCHED_H +#include /* For AT_VECTOR_SIZE */ + +/* + * cloning flags: + */ +#define CSIGNAL 0x000000ff /* signal mask to be sent at exit */ +#define CLONE_VM 0x00000100 /* set if VM shared between processes */ +#define CLONE_FS 0x00000200 /* set if fs info shared between processes */ +#define CLONE_FILES 0x00000400 /* set if open files shared between processes */ +#define CLONE_SIGHAND 0x00000800 /* set if signal handlers and blocked signals shared */ +#define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */ +#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */ +#define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */ +#define CLONE_THREAD 0x00010000 /* Same thread group? */ +#define CLONE_NEWNS 0x00020000 /* New namespace group? */ +#define CLONE_SYSVSEM 0x00040000 /* share system V SEM_UNDO semantics */ +#define CLONE_SETTLS 0x00080000 /* create a new TLS for the child */ +#define CLONE_PARENT_SETTID 0x00100000 /* set the TID in the parent */ +#define CLONE_CHILD_CLEARTID 0x00200000 /* clear the TID in the child */ +#define CLONE_DETACHED 0x00400000 /* Unused, ignored */ +#define CLONE_UNTRACED 0x00800000 /* set if the tracing process can't force CLONE_PTRACE on this clone */ +#define CLONE_CHILD_SETTID 0x01000000 /* set the TID in the child */ +#define CLONE_STOPPED 0x02000000 /* Start in stopped state */ + +/* + * Scheduling policies + */ +#define SCHED_NORMAL 0 +#define SCHED_FIFO 1 +#define SCHED_RR 2 +#define SCHED_BATCH 3 + +#ifdef __KERNEL__ + +struct sched_param { + int sched_priority; +}; + #include /* for HZ */ -#include #include #include #include @@ -37,35 +74,21 @@ #include #include #include +#include -#include /* For AT_VECTOR_SIZE */ +#include +#include +#include +#include +#include + +#include struct exec_domain; +struct futex_pi_state; extern int exec_shield; extern int print_fatal_signals; -/* - * cloning flags: - */ -#define CSIGNAL 0x000000ff /* signal mask to be sent at exit */ -#define CLONE_VM 0x00000100 /* set if VM shared between processes */ -#define CLONE_FS 0x00000200 /* set if fs info shared between processes */ -#define CLONE_FILES 0x00000400 /* set if open files shared between processes */ -#define CLONE_SIGHAND 0x00000800 /* set if signal handlers and blocked signals shared */ -#define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */ -#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */ -#define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */ -#define CLONE_THREAD 0x00010000 /* Same thread group? */ -#define CLONE_NEWNS 0x00020000 /* New namespace group? */ -#define CLONE_SYSVSEM 0x00040000 /* share system V SEM_UNDO semantics */ -#define CLONE_SETTLS 0x00080000 /* create a new TLS for the child */ -#define CLONE_PARENT_SETTID 0x00100000 /* set the TID in the parent */ -#define CLONE_CHILD_CLEARTID 0x00200000 /* clear the TID in the child */ -#define CLONE_DETACHED 0x00400000 /* Unused, ignored */ -#define CLONE_UNTRACED 0x00800000 /* set if the tracing process can't force CLONE_PTRACE on this clone */ -#define CLONE_CHILD_SETTID 0x01000000 /* set the TID in the child */ -#define CLONE_STOPPED 0x02000000 /* Start in stopped state */ - /* * List of flags we want to share for kernel threads, * if only because they are not used by them anyway. @@ -105,14 +128,8 @@ extern unsigned long nr_running(void); extern unsigned long nr_uninterruptible(void); extern unsigned long nr_active(void); extern unsigned long nr_iowait(void); +extern unsigned long weighted_cpuload(const int cpu); -#include -#include -#include -#include -#include - -#include /* * Task state bitmask. NOTE! These bits are also @@ -160,20 +177,6 @@ extern unsigned long nr_iowait(void); /* Task command name length */ #define TASK_COMM_LEN 16 -/* - * Scheduling policies - */ -#define SCHED_NORMAL 0 -#define SCHED_FIFO 1 -#define SCHED_RR 2 -#define SCHED_BATCH 3 - -struct sched_param { - int sched_priority; -}; - -#ifdef __KERNEL__ - #include /* @@ -185,11 +188,11 @@ struct sched_param { extern rwlock_t tasklist_lock; extern spinlock_t mmlist_lock; -typedef struct task_struct task_t; +struct task_struct; extern void sched_init(void); extern void sched_init_smp(void); -extern void init_idle(task_t *idle, int cpu); +extern void init_idle(struct task_struct *idle, int cpu); extern cpumask_t nohz_cpu_mask; @@ -373,6 +376,14 @@ struct sighand_struct { spinlock_t siglock; }; +struct pacct_struct { + int ac_flag; + long ac_exitcode; + unsigned long ac_mem; + cputime_t ac_utime, ac_stime; + unsigned long ac_minflt, ac_majflt; +}; + /* * NOTE! "signal_struct" does not have it's own * locking, because a shared signal_struct always @@ -387,7 +398,7 @@ struct signal_struct { wait_queue_head_t wait_chldexit; /* for wait4() */ /* current thread group signal load-balancing target: */ - task_t *curr_target; + struct task_struct *curr_target; /* shared signal handling: */ struct sigpending shared_pending; @@ -464,6 +475,13 @@ struct signal_struct { struct key *session_keyring; /* keyring inherited over fork */ struct key *process_keyring; /* keyring private to this process */ #endif +#ifdef CONFIG_BSD_PROCESS_ACCT + struct pacct_struct pacct; /* per-process accounting information */ +#endif +#ifdef CONFIG_TASKSTATS + spinlock_t stats_lock; + struct taskstats *stats; +#endif }; /* Context switch must be unlocked if interrupts are to be enabled */ @@ -498,8 +516,11 @@ struct signal_struct { #define MAX_PRIO (MAX_RT_PRIO + 40) -#define rt_task(p) (unlikely((p)->prio < MAX_RT_PRIO)) +#define rt_prio(prio) unlikely((prio) < MAX_RT_PRIO) +#define rt_task(p) rt_prio((p)->prio) #define batch_task(p) (unlikely((p)->policy == SCHED_BATCH)) +#define has_rt_policy(p) \ + unlikely((p)->policy != SCHED_NORMAL && (p)->policy != SCHED_BATCH) /* * Some day this will be a full-fledged user tracking system.. @@ -509,7 +530,7 @@ struct user_struct { atomic_t processes; /* How many processes does this user have? */ atomic_t files; /* How many open files does this user have? */ atomic_t sigpending; /* How many pending signals does this user have? */ -#ifdef CONFIG_INOTIFY +#ifdef CONFIG_INOTIFY_USER atomic_t inotify_watches; /* How many inotify watches does this user have? */ atomic_t inotify_devs; /* How many inotify devs does this user have opened? */ #endif @@ -533,11 +554,10 @@ extern struct user_struct *find_user(xid_t, uid_t); extern struct user_struct root_user; #define INIT_USER (&root_user) -typedef struct prio_array prio_array_t; struct backing_dev_info; struct reclaim_state; -#ifdef CONFIG_SCHEDSTATS +#if defined(CONFIG_SCHEDSTATS) || defined(CONFIG_TASK_DELAY_ACCT) struct sched_info { /* cumulative counters */ unsigned long cpu_time, /* time spent on the cpu */ @@ -548,9 +568,53 @@ struct sched_info { unsigned long last_arrival, /* when we last ran on a cpu */ last_queued; /* when we were last queued to run */ }; +#endif /* defined(CONFIG_SCHEDSTATS) || defined(CONFIG_TASK_DELAY_ACCT) */ +#ifdef CONFIG_SCHEDSTATS extern struct file_operations proc_schedstat_operations; +#endif /* CONFIG_SCHEDSTATS */ + +#ifdef CONFIG_TASK_DELAY_ACCT +struct task_delay_info { + spinlock_t lock; + unsigned int flags; /* Private per-task flags */ + + /* For each stat XXX, add following, aligned appropriately + * + * struct timespec XXX_start, XXX_end; + * u64 XXX_delay; + * u32 XXX_count; + * + * Atomicity of updates to XXX_delay, XXX_count protected by + * single lock above (split into XXX_lock if contention is an issue). + */ + + /* + * XXX_count is incremented on every XXX operation, the delay + * associated with the operation is added to XXX_delay. + * XXX_delay contains the accumulated delay time in nanoseconds. + */ + struct timespec blkio_start, blkio_end; /* Shared by blkio, swapin */ + u64 blkio_delay; /* wait for sync block io completion */ + u64 swapin_delay; /* wait for swapin block io completion */ + u32 blkio_count; /* total count of the number of sync block */ + /* io operations performed */ + u32 swapin_count; /* total count of the number of swapin block */ + /* io operations performed */ +}; +#endif /* CONFIG_TASK_DELAY_ACCT */ + +static inline int sched_info_on(void) +{ +#ifdef CONFIG_SCHEDSTATS + return 1; +#elif defined(CONFIG_TASK_DELAY_ACCT) + extern int delayacct_on; + return delayacct_on; +#else + return 0; #endif +} enum idle_type { @@ -563,9 +627,9 @@ enum idle_type /* * sched-domains (multiprocessor balancing) declarations: */ -#ifdef CONFIG_SMP #define SCHED_LOAD_SCALE 128UL /* increase resolution of load */ +#ifdef CONFIG_SMP #define SD_LOAD_BALANCE 1 /* Do load balancing on this domain. */ #define SD_BALANCE_NEWIDLE 2 /* Balance when about to become idle */ #define SD_BALANCE_EXEC 4 /* Balance on exec */ @@ -574,6 +638,11 @@ enum idle_type #define SD_WAKE_AFFINE 32 /* Wake task to waking CPU */ #define SD_WAKE_BALANCE 64 /* Perform balancing at task wakeup */ #define SD_SHARE_CPUPOWER 128 /* Domain members share cpu power */ +#define SD_POWERSAVINGS_BALANCE 256 /* Balance for power savings */ + +#define BALANCE_FOR_POWER ((sched_mc_power_savings || sched_smt_power_savings) \ + ? SD_POWERSAVINGS_BALANCE : 0) + struct sched_group { struct sched_group *next; /* Must be a circular list */ @@ -643,7 +712,7 @@ struct sched_domain { #endif }; -extern void partition_sched_domains(cpumask_t *partition1, +extern int partition_sched_domains(cpumask_t *partition1, cpumask_t *partition2); /* @@ -693,7 +762,7 @@ extern int groups_search(struct group_info *group_info, gid_t grp); ((gi)->blocks[(i)/NGROUPS_PER_BLOCK][(i)%NGROUPS_PER_BLOCK]) #ifdef ARCH_HAS_PREFETCH_SWITCH_STACK -extern void prefetch_stack(struct task_struct*); +extern void prefetch_stack(struct task_struct *t); #else static inline void prefetch_stack(struct task_struct *t) { } #endif @@ -709,21 +778,25 @@ enum sleep_type { SLEEP_INTERRUPTED, }; +struct prio_array; + struct task_struct { volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ struct thread_info *thread_info; atomic_t usage; unsigned long flags; /* per process flags, defined below */ - unsigned long ptrace; int lock_depth; /* BKL lock depth */ -#if defined(CONFIG_SMP) && defined(__ARCH_WANT_UNLOCKED_CTXSW) +#ifdef CONFIG_SMP +#ifdef __ARCH_WANT_UNLOCKED_CTXSW int oncpu; #endif - int prio, static_prio; +#endif + int load_weight; /* for niceness load balancing purposes */ + int prio, static_prio, normal_prio; struct list_head run_list; - prio_array_t *array; + struct prio_array *array; unsigned short ioprio; unsigned int btrace_seq; @@ -737,17 +810,11 @@ struct task_struct { cpumask_t cpus_allowed; unsigned int time_slice, first_time_slice; -#ifdef CONFIG_SCHEDSTATS +#if defined(CONFIG_SCHEDSTATS) || defined(CONFIG_TASK_DELAY_ACCT) struct sched_info sched_info; #endif struct list_head tasks; - /* - * ptrace_list/ptrace_children forms the list of my children - * that were stolen by a ptracer. - */ - struct list_head ptrace_children; - struct list_head ptrace_list; struct mm_struct *mm, *active_mm; @@ -762,15 +829,13 @@ struct task_struct { pid_t pid; pid_t tgid; /* - * pointers to (original) parent process, youngest child, younger sibling, + * pointers to parent process, youngest child, younger sibling, * older sibling, respectively. (p->father can be replaced with * p->parent->pid) */ - struct task_struct *real_parent; /* real parent process (when being debugged) */ struct task_struct *parent; /* parent process */ /* - * children/sibling forms the list of my children plus the - * tasks I'm ptracing. + * children/sibling forms the list of my children */ struct list_head children; /* list of my children */ struct list_head sibling; /* linkage in my parent's children list */ @@ -855,18 +920,53 @@ struct task_struct { seccomp_t seccomp; +#ifdef CONFIG_UTRACE + struct utrace *utrace; + unsigned long utrace_flags; +#endif + /* Thread group tracking */ u32 parent_exec_id; u32 self_exec_id; /* Protection of (de-)allocation: mm, files, fs, tty, keyrings */ spinlock_t alloc_lock; -/* Protection of proc_dentry: nesting proc_lock, dcache_lock, write_lock_irq(&tasklist_lock); */ - spinlock_t proc_lock; + + /* Protection of the PI data structures: */ + spinlock_t pi_lock; + +#ifdef CONFIG_RT_MUTEXES + /* PI waiters blocked on a rt_mutex held by this task */ + struct plist_head pi_waiters; + /* Deadlock detection and priority inheritance handling */ + struct rt_mutex_waiter *pi_blocked_on; +#endif #ifdef CONFIG_DEBUG_MUTEXES /* mutex deadlock detection */ struct mutex_waiter *blocked_on; #endif +#ifdef CONFIG_TRACE_IRQFLAGS + unsigned int irq_events; + int hardirqs_enabled; + unsigned long hardirq_enable_ip; + unsigned int hardirq_enable_event; + unsigned long hardirq_disable_ip; + unsigned int hardirq_disable_event; + int softirqs_enabled; + unsigned long softirq_disable_ip; + unsigned int softirq_disable_event; + unsigned long softirq_enable_ip; + unsigned int softirq_enable_event; + int hardirq_context; + int softirq_context; +#endif +#ifdef CONFIG_LOCKDEP +# define MAX_LOCK_DEPTH 30UL + u64 curr_chain_key; + int lockdep_depth; + struct held_lock held_locks[MAX_LOCK_DEPTH]; + unsigned int lockdep_recursion; +#endif /* journalling filesystem info */ void *journal_info; @@ -874,13 +974,10 @@ struct task_struct { /* VM state */ struct reclaim_state *reclaim_state; - struct dentry *proc_dentry; struct backing_dev_info *backing_dev_info; struct io_context *io_context; - unsigned long ptrace_message; - siginfo_t *last_siginfo; /* For ptrace use. */ /* * current io wait handle: wait queue entry to use for io waits * If this thread is processing aio, this points at the waitqueue @@ -909,14 +1006,23 @@ struct task_struct { #ifdef CONFIG_COMPAT struct compat_robust_list_head __user *compat_robust_list; #endif + struct list_head pi_state_list; + struct futex_pi_state *pi_state_cache; atomic_t fs_excl; /* holding fs exclusive resources */ struct rcu_head rcu; +#ifdef CONFIG_PTRACE + struct list_head ptracees; +#endif + /* * cache last used pipe for splice */ struct pipe_inode_info *splice_pipe; +#ifdef CONFIG_TASK_DELAY_ACCT + struct task_delay_info *delays; +#endif }; static inline pid_t process_group(struct task_struct *tsk) @@ -970,13 +1076,13 @@ static inline void put_task_struct(struct task_struct *t) #define PF_KSWAPD 0x00040000 /* I am kswapd */ #define PF_SWAPOFF 0x00080000 /* I am in swapoff */ #define PF_LESS_THROTTLE 0x00100000 /* Throttle me less: I clean memory */ -#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_SWAPWRITE 0x01000000 /* Allowed to write to swap */ -#define PF_SPREAD_PAGE 0x04000000 /* Spread page cache over cpuset */ -#define PF_SPREAD_SLAB 0x08000000 /* Spread some slab caches over cpuset */ +#define PF_BORROWED_MM 0x00200000 /* I am a kthread doing use_mm */ +#define PF_RANDOMIZE 0x00400000 /* randomize virtual address space */ +#define PF_SWAPWRITE 0x00800000 /* Allowed to write to swap */ +#define PF_SPREAD_PAGE 0x01000000 /* Spread page cache over cpuset */ +#define PF_SPREAD_SLAB 0x02000000 /* Spread some slab caches over cpuset */ #define PF_MEMPOLICY 0x10000000 /* Non-default NUMA mempolicy */ +#define PF_MUTEX_TESTER 0x20000000 /* Thread belongs to the rt mutex tester */ /* * Only the _current_ task can read/write to tsk->flags, but other @@ -1004,9 +1110,9 @@ static inline void put_task_struct(struct task_struct *t) #define used_math() tsk_used_math(current) #ifdef CONFIG_SMP -extern int set_cpus_allowed(task_t *p, cpumask_t new_mask); +extern int set_cpus_allowed(struct task_struct *p, cpumask_t new_mask); #else -static inline int set_cpus_allowed(task_t *p, cpumask_t new_mask) +static inline int set_cpus_allowed(struct task_struct *p, cpumask_t new_mask) { if (!cpu_isset(0, new_mask)) return -EINVAL; @@ -1015,7 +1121,8 @@ static inline int set_cpus_allowed(task_t *p, cpumask_t new_mask) #endif extern unsigned long long sched_clock(void); -extern unsigned long long current_sched_time(const task_t *current_task); +extern unsigned long long +current_sched_time(const struct task_struct *current_task); /* sched_exec is called by processes performing an exec */ #ifdef CONFIG_SMP @@ -1031,16 +1138,29 @@ static inline void idle_task_exit(void) {} #endif extern void sched_idle_next(void); -extern void set_user_nice(task_t *p, long nice); -extern int task_prio(const task_t *p); -extern int task_nice(const task_t *p); -extern int can_nice(const task_t *p, const int nice); -extern int task_curr(const task_t *p); + +#ifdef CONFIG_RT_MUTEXES +extern int rt_mutex_getprio(struct task_struct *p); +extern void rt_mutex_setprio(struct task_struct *p, int prio); +extern void rt_mutex_adjust_pi(struct task_struct *p); +#else +static inline int rt_mutex_getprio(struct task_struct *p) +{ + return p->normal_prio; +} +# define rt_mutex_adjust_pi(p) do { } while (0) +#endif + +extern void set_user_nice(struct task_struct *p, long nice); +extern int task_prio(const struct task_struct *p); +extern int task_nice(const struct task_struct *p); +extern int can_nice(const struct task_struct *p, const int nice); +extern int task_curr(const struct task_struct *p); extern int idle_cpu(int cpu); extern int sched_setscheduler(struct task_struct *, int, struct sched_param *); -extern task_t *idle_task(int cpu); -extern task_t *curr_task(int cpu); -extern void set_curr_task(int cpu, task_t *p); +extern struct task_struct *idle_task(int cpu); +extern struct task_struct *curr_task(int cpu); +extern void set_curr_task(int cpu, struct task_struct *p); void yield(void); @@ -1071,10 +1191,9 @@ extern struct mm_struct init_mm; #define find_task_by_real_pid(nr) \ - find_task_by_pid_type(PIDTYPE_PID, nr) + find_task_by_pid_type(PIDTYPE_REALPID, nr) #define find_task_by_pid(nr) \ - find_task_by_pid_type(PIDTYPE_PID, \ - vx_rmap_pid(nr)) + find_task_by_pid_type(PIDTYPE_PID, nr) extern struct task_struct *find_task_by_pid_type(int type, int pid); extern void set_special_pids(pid_t session, pid_t pgrp); @@ -1103,8 +1222,8 @@ extern void FASTCALL(wake_up_new_task(struct task_struct * tsk, #else static inline void kick_process(struct task_struct *tsk) { } #endif -extern void FASTCALL(sched_fork(task_t * p, int clone_flags)); -extern void FASTCALL(sched_exit(task_t * p)); +extern void FASTCALL(sched_fork(struct task_struct * p, int clone_flags)); +extern void FASTCALL(sched_exit(struct task_struct * p)); extern int in_group_p(gid_t); extern int in_egroup_p(gid_t); @@ -1137,8 +1256,9 @@ extern int force_sig_info(int, struct siginfo *, struct task_struct *); extern int __kill_pg_info(int sig, struct siginfo *info, pid_t pgrp); extern int kill_pg_info(int, struct siginfo *, pid_t); extern int kill_proc_info(int, struct siginfo *, pid_t); -extern int kill_proc_info_as_uid(int, struct siginfo *, pid_t, uid_t, uid_t); +extern int kill_proc_info_as_uid(int, struct siginfo *, pid_t, uid_t, uid_t, u32); extern void do_notify_parent(struct task_struct *, int); +extern void do_notify_parent_cldstop(struct task_struct *, int); extern void force_sig(int, struct task_struct *); extern void force_sig_specific(int, struct task_struct *); extern int send_sig(int, struct task_struct *, int); @@ -1209,17 +1329,17 @@ extern NORET_TYPE void do_group_exit(int); extern void daemonize(const char *, ...); extern int allow_signal(int); extern int disallow_signal(int); -extern task_t *child_reaper; +extern struct task_struct *child_reaper; extern int do_execve(char *, char __user * __user *, char __user * __user *, struct pt_regs *); extern long do_fork(unsigned long, unsigned long, struct pt_regs *, unsigned long, int __user *, int __user *); -task_t *fork_idle(int); +struct task_struct *fork_idle(int); extern void set_task_comm(struct task_struct *tsk, char *from); extern void get_task_comm(char *to, struct task_struct *tsk); #ifdef CONFIG_SMP -extern void wait_task_inactive(task_t * p); +extern void wait_task_inactive(struct task_struct * p); #else #define wait_task_inactive(p) do { } while (0) #endif @@ -1245,13 +1365,13 @@ extern void wait_task_inactive(task_t * p); /* de_thread depends on thread_group_leader not being a pid based check */ #define thread_group_leader(p) (p == p->group_leader) -static inline task_t *next_thread(const task_t *p) +static inline struct task_struct *next_thread(const struct task_struct *p) { return list_entry(rcu_dereference(p->thread_group.next), - task_t, thread_group); + struct task_struct, thread_group); } -static inline int thread_group_empty(task_t *p) +static inline int thread_group_empty(struct task_struct *p) { return list_empty(&p->thread_group); } @@ -1260,7 +1380,7 @@ static inline int thread_group_empty(task_t *p) (thread_group_leader(p) && !thread_group_empty(p)) /* - * Protects ->fs, ->files, ->mm, ->ptrace, ->group_info, ->comm, keyring + * Protects ->fs, ->files, ->mm, ->group_info, ->comm, keyring * subscriptions and synchronises with wait4(). Also used in procfs. Also * pins the final release of task.io_context. Also protects ->cpuset. * @@ -1436,6 +1556,11 @@ static inline void arch_pick_mmap_layout(struct mm_struct *mm) extern long sched_setaffinity(pid_t pid, cpumask_t new_mask); extern long sched_getaffinity(pid_t pid, cpumask_t *mask); +#include +extern int sched_mc_power_savings, sched_smt_power_savings; +extern struct sysdev_attribute attr_sched_mc_power_savings, attr_sched_smt_power_savings; +extern int sched_create_sysfs_power_savings_entries(struct sysdev_class *cls); + extern void normalize_rt_tasks(void); #ifdef CONFIG_PM @@ -1464,6 +1589,14 @@ static inline void freeze(struct task_struct *p) p->flags |= PF_FREEZE; } +/* + * Sometimes we may need to cancel the previous 'freeze' request + */ +static inline void do_not_freeze(struct task_struct *p) +{ + p->flags &= ~PF_FREEZE; +} + /* * Wake up a frozen process */ diff --git a/include/linux/scx200.h b/include/linux/scx200.h index a22f9e173..de466e11e 100644 --- a/include/linux/scx200.h +++ b/include/linux/scx200.h @@ -32,7 +32,7 @@ extern unsigned scx200_cb_base; /* High Resolution Timer */ #define SCx200_TIMER_OFFSET 0x08 -#define SCx200_TIMER_SIZE 0x05 +#define SCx200_TIMER_SIZE 0x06 /* Clock Generators */ #define SCx200_CLOCKGEN_OFFSET 0x10 @@ -49,10 +49,3 @@ extern unsigned scx200_cb_base; #define SCx200_REV 0x3d /* Revision Register */ #define SCx200_CBA 0x3e /* Configuration Base Address Register */ #define SCx200_CBA_SCRATCH 0x64 /* Configuration Base Address Scratchpad */ - -/* - Local variables: - compile-command: "make -C ../.. bzImage modules" - c-basic-offset: 8 - End: -*/ diff --git a/include/linux/scx200_gpio.h b/include/linux/scx200_gpio.h index 30cdd648b..90dd069cc 100644 --- a/include/linux/scx200_gpio.h +++ b/include/linux/scx200_gpio.h @@ -1,6 +1,6 @@ #include -u32 scx200_gpio_configure(int index, u32 set, u32 clear); +u32 scx200_gpio_configure(unsigned index, u32 set, u32 clear); extern unsigned scx200_gpio_base; extern long scx200_gpio_shadow[2]; @@ -17,7 +17,7 @@ extern long scx200_gpio_shadow[2]; /* returns the value of the GPIO pin */ -static inline int scx200_gpio_get(int index) { +static inline int scx200_gpio_get(unsigned index) { __SCx200_GPIO_BANK; __SCx200_GPIO_IOADDR + 0x04; __SCx200_GPIO_INDEX; @@ -29,7 +29,7 @@ static inline int scx200_gpio_get(int index) { driven if the GPIO is configured as an output, it might not be the state of the GPIO right now if the GPIO is configured as an input) */ -static inline int scx200_gpio_current(int index) { +static inline int scx200_gpio_current(unsigned index) { __SCx200_GPIO_BANK; __SCx200_GPIO_INDEX; @@ -38,7 +38,7 @@ static inline int scx200_gpio_current(int index) { /* drive the GPIO signal high */ -static inline void scx200_gpio_set_high(int index) { +static inline void scx200_gpio_set_high(unsigned index) { __SCx200_GPIO_BANK; __SCx200_GPIO_IOADDR; __SCx200_GPIO_SHADOW; @@ -49,7 +49,7 @@ static inline void scx200_gpio_set_high(int index) { /* drive the GPIO signal low */ -static inline void scx200_gpio_set_low(int index) { +static inline void scx200_gpio_set_low(unsigned index) { __SCx200_GPIO_BANK; __SCx200_GPIO_IOADDR; __SCx200_GPIO_SHADOW; @@ -60,7 +60,7 @@ static inline void scx200_gpio_set_low(int index) { /* drive the GPIO signal to state */ -static inline void scx200_gpio_set(int index, int state) { +static inline void scx200_gpio_set(unsigned index, int state) { __SCx200_GPIO_BANK; __SCx200_GPIO_IOADDR; __SCx200_GPIO_SHADOW; @@ -73,7 +73,7 @@ static inline void scx200_gpio_set(int index, int state) { } /* toggle the GPIO signal */ -static inline void scx200_gpio_change(int index) { +static inline void scx200_gpio_change(unsigned index) { __SCx200_GPIO_BANK; __SCx200_GPIO_IOADDR; __SCx200_GPIO_SHADOW; @@ -87,10 +87,3 @@ static inline void scx200_gpio_change(int index) { #undef __SCx200_GPIO_SHADOW #undef __SCx200_GPIO_INDEX #undef __SCx200_GPIO_OUT - -/* - Local variables: - compile-command: "make -C ../.. bzImage modules" - c-basic-offset: 8 - End: -*/ diff --git a/include/linux/seccomp.h b/include/linux/seccomp.h index 3a2702bbb..3e8b1cf54 100644 --- a/include/linux/seccomp.h +++ b/include/linux/seccomp.h @@ -1,7 +1,6 @@ #ifndef _LINUX_SECCOMP_H #define _LINUX_SECCOMP_H -#include #ifdef CONFIG_SECCOMP @@ -19,15 +18,21 @@ static inline void secure_computing(int this_syscall) __secure_computing(this_syscall); } +static inline int has_secure_computing(struct thread_info *ti) +{ + return unlikely(test_ti_thread_flag(ti, TIF_SECCOMP)); +} + #else /* CONFIG_SECCOMP */ -#if (__GNUC__ > 2) - typedef struct { } seccomp_t; -#else - typedef struct { int gcc_is_buggy; } seccomp_t; -#endif +typedef struct { } seccomp_t; #define secure_computing(x) do { } while (0) +/* static inline to preserve typechecking */ +static inline int has_secure_computing(struct thread_info *ti) +{ + return 0; +} #endif /* CONFIG_SECCOMP */ diff --git a/include/linux/security.h b/include/linux/security.h index 1bab48f6a..6bc2aad49 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -67,7 +67,7 @@ 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); +extern int cap_netlink_recv(struct sk_buff *skb, int cap); /* * Values used in the task_security_ops calls @@ -171,9 +171,9 @@ struct swap_info_struct; * Deallocate and clear the sb->s_security field. * @sb contains the super_block structure to be modified. * @sb_statfs: - * Check permission before obtaining filesystem statistics for the @sb - * filesystem. - * @sb contains the super_block structure for the filesystem. + * Check permission before obtaining filesystem statistics for the @mnt + * mountpoint. + * @dentry is a handle on the superblock for the filesystem. * Return 0 if permission is granted. * @sb_mount: * Check permission before an object specified by @dev_name is mounted on @@ -567,6 +567,9 @@ struct swap_info_struct; * @p. * @p contains the task_struct for the process. * Return 0 if permission is granted. + * @task_getsecid: + * Retrieve the security identifier of the process @p. + * @p contains the task_struct for the process and place is into @secid. * @task_setgroups: * Check permission before setting the supplementary group set of the * current process. @@ -577,6 +580,15 @@ struct swap_info_struct; * @p contains the task_struct of process. * @nice contains the new nice value. * Return 0 if permission is granted. + * @task_setioprio + * Check permission before setting the ioprio value of @p to @ioprio. + * @p contains the task_struct of process. + * @ioprio contains the new ioprio value + * Return 0 if permission is granted. + * @task_getioprio + * Check permission before getting the ioprio value of @p. + * @p contains the task_struct of process. + * Return 0 if permission is granted. * @task_setrlimit: * Check permission before setting the resource limits of the current * process for @resource to @new_rlim. The old resource limit values can @@ -596,6 +608,10 @@ struct swap_info_struct; * @p. * @p contains the task_struct for process. * Return 0 if permission is granted. + * @task_movememory + * Check permission before moving memory owned by process @p. + * @p contains the task_struct for process. + * Return 0 if permission is granted. * @task_kill: * Check permission before sending signal @sig to @p. @info can be NULL, * the constant 1, or a pointer to a siginfo structure. If @info is 1 or @@ -606,6 +622,7 @@ struct swap_info_struct; * @p contains the task_struct for process. * @info contains the signal information. * @sig contains the signal value. + * @secid contains the sid of the process where the signal originated * Return 0 if permission is granted. * @task_wait: * Check permission before allowing a process to reap a child process @p @@ -647,6 +664,7 @@ struct swap_info_struct; * Check permission before processing the received netlink message in * @skb. * @skb contains the sk_buff structure for the netlink message. + * @cap indicates the capability required * Return 0 if permission is granted. * * Security hooks for Unix domain networking. @@ -805,31 +823,37 @@ struct swap_info_struct; * 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. + * Allocate a security structure to the xp->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. + * Allocate a security structure to the new->security field + * that contains the information from the old->security field. * Return 0 if operation was successful (memory to allocate). * @xfrm_policy_free_security: * @xp contains the xfrm_policy - * Deallocate xp->selector.security. + * Deallocate xp->security. + * @xfrm_policy_delete_security: + * @xp contains the xfrm_policy. + * Authorize deletion of xp->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 + * Allocate a security structure to the x->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. + * Deallocate x->security. + * @xfrm_state_delete_security: + * @x contains the xfrm_state. + * Authorize deletion of x->security. * @xfrm_policy_lookup: * @xp contains the xfrm_policy for which the access control is being * checked. @@ -847,6 +871,7 @@ struct swap_info_struct; * Permit allocation of a key and assign security data. Note that key does * not have a serial number assigned at this point. * @key points to the key. + * @flags is the allocation flags * Return 0 if permission is granted, -ve error otherwise. * @key_free: * Notification of destruction; free security data. @@ -1084,6 +1109,16 @@ struct swap_info_struct; * @name contains the name of the security module being unstacked. * @ops contains a pointer to the struct security_operations of the module to unstack. * + * @secid_to_secctx: + * Convert secid to security context. + * @secid contains the security ID. + * @secdata contains the pointer that stores the converted security context. + * + * @release_secctx: + * Release the security context. + * @secdata contains the security context. + * @seclen contains the length of the security context. + * * This is the main security structure. */ struct security_operations { @@ -1121,7 +1156,7 @@ struct security_operations { int (*sb_copy_data)(struct file_system_type *type, void *orig, void *copy); int (*sb_kern_mount) (struct super_block *sb, void *data); - int (*sb_statfs) (struct super_block * sb); + int (*sb_statfs) (struct dentry *dentry); int (*sb_mount) (char *dev_name, struct nameidata * nd, char *type, unsigned long flags, void *data); int (*sb_check_sb) (struct vfsmount * mnt, struct nameidata * nd); @@ -1202,14 +1237,18 @@ struct security_operations { int (*task_setpgid) (struct task_struct * p, pid_t pgid); int (*task_getpgid) (struct task_struct * p); int (*task_getsid) (struct task_struct * p); + void (*task_getsecid) (struct task_struct * p, u32 * secid); int (*task_setgroups) (struct group_info *group_info); int (*task_setnice) (struct task_struct * p, int nice); + int (*task_setioprio) (struct task_struct * p, int ioprio); + int (*task_getioprio) (struct task_struct * p); int (*task_setrlimit) (unsigned int resource, struct rlimit * new_rlim); int (*task_setscheduler) (struct task_struct * p, int policy, struct sched_param * lp); int (*task_getscheduler) (struct task_struct * p); + int (*task_movememory) (struct task_struct * p); int (*task_kill) (struct task_struct * p, - struct siginfo * info, int sig); + struct siginfo * info, int sig, u32 secid); int (*task_wait) (struct task_struct * p); int (*task_prctl) (int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, @@ -1248,7 +1287,7 @@ struct security_operations { struct sembuf * sops, unsigned nsops, int alter); int (*netlink_send) (struct sock * sk, struct sk_buff * skb); - int (*netlink_recv) (struct sk_buff * skb); + int (*netlink_recv) (struct sk_buff * skb, int cap); /* allow module stacking */ int (*register_security) (const char *name, @@ -1260,6 +1299,8 @@ struct security_operations { int (*getprocattr)(struct task_struct *p, char *name, void *value, size_t size); int (*setprocattr)(struct task_struct *p, char *name, void *value, size_t size); + int (*secid_to_secctx)(u32 secid, char **secdata, u32 *seclen); + void (*release_secctx)(char *secdata, u32 seclen); #ifdef CONFIG_SECURITY_NETWORK int (*unix_stream_connect) (struct socket * sock, @@ -1288,7 +1329,7 @@ struct security_operations { int (*socket_shutdown) (struct socket * sock, int how); int (*socket_sock_rcv_skb) (struct sock * sk, struct sk_buff * skb); int (*socket_getpeersec_stream) (struct socket *sock, char __user *optval, int __user *optlen, unsigned len); - int (*socket_getpeersec_dgram) (struct sk_buff *skb, char **secdata, u32 *seclen); + int (*socket_getpeersec_dgram) (struct socket *sock, struct sk_buff *skb, u32 *secid); 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); @@ -1298,14 +1339,16 @@ struct security_operations { 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_policy_delete_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_state_delete_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); + int (*key_alloc)(struct key *key, struct task_struct *tsk, unsigned long flags); void (*key_free)(struct key *key); int (*key_permission)(key_ref_t key_ref, struct task_struct *context, @@ -1442,9 +1485,9 @@ static inline int security_sb_kern_mount (struct super_block *sb, void *data) return security_ops->sb_kern_mount (sb, data); } -static inline int security_sb_statfs (struct super_block *sb) +static inline int security_sb_statfs (struct dentry *dentry) { - return security_ops->sb_statfs (sb); + return security_ops->sb_statfs (dentry); } static inline int security_sb_mount (char *dev_name, struct nameidata *nd, @@ -1818,6 +1861,11 @@ static inline int security_task_getsid (struct task_struct *p) return security_ops->task_getsid (p); } +static inline void security_task_getsecid (struct task_struct *p, u32 *secid) +{ + security_ops->task_getsecid (p, secid); +} + static inline int security_task_setgroups (struct group_info *group_info) { return security_ops->task_setgroups (group_info); @@ -1828,6 +1876,16 @@ static inline int security_task_setnice (struct task_struct *p, int nice) return security_ops->task_setnice (p, nice); } +static inline int security_task_setioprio (struct task_struct *p, int ioprio) +{ + return security_ops->task_setioprio (p, ioprio); +} + +static inline int security_task_getioprio (struct task_struct *p) +{ + return security_ops->task_getioprio (p); +} + static inline int security_task_setrlimit (unsigned int resource, struct rlimit *new_rlim) { @@ -1846,10 +1904,16 @@ static inline int security_task_getscheduler (struct task_struct *p) return security_ops->task_getscheduler (p); } +static inline int security_task_movememory (struct task_struct *p) +{ + return security_ops->task_movememory (p); +} + static inline int security_task_kill (struct task_struct *p, - struct siginfo *info, int sig) + struct siginfo *info, int sig, + u32 secid) { - return security_ops->task_kill (p, info, sig); + return security_ops->task_kill (p, info, sig, secid); } static inline int security_task_wait (struct task_struct *p) @@ -2002,9 +2066,19 @@ static inline int security_netlink_send(struct sock *sk, struct sk_buff * skb) return security_ops->netlink_send(sk, skb); } -static inline int security_netlink_recv(struct sk_buff * skb) +static inline int security_netlink_recv(struct sk_buff * skb, int cap) +{ + return security_ops->netlink_recv(skb, cap); +} + +static inline int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen) { - return security_ops->netlink_recv(skb); + return security_ops->secid_to_secctx(secid, secdata, seclen); +} + +static inline void security_release_secctx(char *secdata, u32 seclen) +{ + return security_ops->release_secctx(secdata, seclen); } /* prototypes */ @@ -2154,7 +2228,7 @@ static inline int security_sb_kern_mount (struct super_block *sb, void *data) return 0; } -static inline int security_sb_statfs (struct super_block *sb) +static inline int security_sb_statfs (struct dentry *dentry) { return 0; } @@ -2460,6 +2534,9 @@ static inline int security_task_getsid (struct task_struct *p) return 0; } +static inline void security_task_getsecid (struct task_struct *p, u32 *secid) +{ } + static inline int security_task_setgroups (struct group_info *group_info) { return 0; @@ -2470,6 +2547,16 @@ static inline int security_task_setnice (struct task_struct *p, int nice) return 0; } +static inline int security_task_setioprio (struct task_struct *p, int ioprio) +{ + return 0; +} + +static inline int security_task_getioprio (struct task_struct *p) +{ + return 0; +} + static inline int security_task_setrlimit (unsigned int resource, struct rlimit *new_rlim) { @@ -2488,8 +2575,14 @@ static inline int security_task_getscheduler (struct task_struct *p) return 0; } +static inline int security_task_movememory (struct task_struct *p) +{ + return 0; +} + static inline int security_task_kill (struct task_struct *p, - struct siginfo *info, int sig) + struct siginfo *info, int sig, + u32 secid) { return 0; } @@ -2630,9 +2723,9 @@ static inline int security_netlink_send (struct sock *sk, struct sk_buff *skb) return cap_netlink_send (sk, skb); } -static inline int security_netlink_recv (struct sk_buff *skb) +static inline int security_netlink_recv (struct sk_buff *skb, int cap) { - return cap_netlink_recv (skb); + return cap_netlink_recv (skb, cap); } static inline struct dentry *securityfs_create_dir(const char *name, @@ -2654,6 +2747,14 @@ static inline void securityfs_remove(struct dentry *dentry) { } +static inline int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen) +{ + return -EOPNOTSUPP; +} + +static inline void security_release_secctx(char *secdata, u32 seclen) +{ +} #endif /* CONFIG_SECURITY */ #ifdef CONFIG_SECURITY_NETWORK @@ -2769,10 +2870,9 @@ static inline int security_socket_getpeersec_stream(struct socket *sock, char __ return security_ops->socket_getpeersec_stream(sock, optval, optlen, len); } -static inline int security_socket_getpeersec_dgram(struct sk_buff *skb, char **secdata, - u32 *seclen) +static inline int security_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid) { - return security_ops->socket_getpeersec_dgram(skb, secdata, seclen); + return security_ops->socket_getpeersec_dgram(sock, skb, secid); } static inline int security_sk_alloc(struct sock *sk, int family, gfp_t priority) @@ -2897,8 +2997,7 @@ static inline int security_socket_getpeersec_stream(struct socket *sock, char __ return -ENOPROTOOPT; } -static inline int security_socket_getpeersec_dgram(struct sk_buff *skb, char **secdata, - u32 *seclen) +static inline int security_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid) { return -ENOPROTOOPT; } @@ -2934,11 +3033,21 @@ static inline void security_xfrm_policy_free(struct xfrm_policy *xp) security_ops->xfrm_policy_free_security(xp); } +static inline int security_xfrm_policy_delete(struct xfrm_policy *xp) +{ + return security_ops->xfrm_policy_delete_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 int security_xfrm_state_delete(struct xfrm_state *x) +{ + return security_ops->xfrm_state_delete_security(x); +} + static inline void security_xfrm_state_free(struct xfrm_state *x) { security_ops->xfrm_state_free_security(x); @@ -2963,6 +3072,11 @@ static inline void security_xfrm_policy_free(struct xfrm_policy *xp) { } +static inline int security_xfrm_policy_delete(struct xfrm_policy *xp) +{ + return 0; +} + static inline int security_xfrm_state_alloc(struct xfrm_state *x, struct xfrm_user_sec_ctx *sec_ctx) { return 0; @@ -2972,6 +3086,11 @@ static inline void security_xfrm_state_free(struct xfrm_state *x) { } +static inline int security_xfrm_state_delete(struct xfrm_state *x) +{ + return 0; +} + static inline int security_xfrm_policy_lookup(struct xfrm_policy *xp, u32 sk_sid, u8 dir) { return 0; @@ -2980,9 +3099,11 @@ static inline int security_xfrm_policy_lookup(struct xfrm_policy *xp, u32 sk_sid #ifdef CONFIG_KEYS #ifdef CONFIG_SECURITY -static inline int security_key_alloc(struct key *key) +static inline int security_key_alloc(struct key *key, + struct task_struct *tsk, + unsigned long flags) { - return security_ops->key_alloc(key); + return security_ops->key_alloc(key, tsk, flags); } static inline void security_key_free(struct key *key) @@ -2999,7 +3120,9 @@ static inline int security_key_permission(key_ref_t key_ref, #else -static inline int security_key_alloc(struct key *key) +static inline int security_key_alloc(struct key *key, + struct task_struct *tsk, + unsigned long flags) { return 0; } diff --git a/include/linux/selinux.h b/include/linux/selinux.h index 4047bcde4..aad4e390d 100644 --- a/include/linux/selinux.h +++ b/include/linux/selinux.h @@ -118,6 +118,27 @@ void selinux_get_ipc_sid(const struct kern_ipc_perm *ipcp, u32 *sid); */ void selinux_get_task_sid(struct task_struct *tsk, u32 *sid); +/** + * selinux_string_to_sid - map a security context string to a security ID + * @str: the security context string to be mapped + * @sid: ID value returned via this. + * + * Returns 0 if successful, with the SID stored in sid. A value + * of zero for sid indicates no SID could be determined (but no error + * occurred). + */ +int selinux_string_to_sid(char *str, u32 *sid); + +/** + * selinux_relabel_packet_permission - check permission to relabel a packet + * @sid: ID value to be applied to network packet (via SECMARK, most likely) + * + * Returns 0 if the current task is allowed to label packets with the + * supplied security ID. Note that it is implicit that the packet is always + * being relabeled from the default unlabled value, and that the access + * control decision is made in the AVC. + */ +int selinux_relabel_packet_permission(u32 sid); #else @@ -172,6 +193,17 @@ static inline void selinux_get_task_sid(struct task_struct *tsk, u32 *sid) *sid = 0; } +static inline int selinux_string_to_sid(const char *str, u32 *sid) +{ + *sid = 0; + return 0; +} + +static inline int selinux_relabel_packet_permission(u32 sid) +{ + return 0; +} + #endif /* CONFIG_SECURITY_SELINUX */ #endif /* _LINUX_SELINUX_H */ diff --git a/include/linux/sem.h b/include/linux/sem.h index 3c1f1120f..9aaffb0b1 100644 --- a/include/linux/sem.h +++ b/include/linux/sem.h @@ -2,7 +2,6 @@ #define _LINUX_SEM_H #include -#include /* semop flags */ #define SEM_UNDO 0x1000 /* undo the operation on exit */ @@ -78,6 +77,7 @@ struct seminfo { #define SEMUSZ 20 /* sizeof struct sem_undo */ #ifdef __KERNEL__ +#include struct task_struct; diff --git a/include/linux/seqlock.h b/include/linux/seqlock.h index 5a0955728..46000936f 100644 --- a/include/linux/seqlock.h +++ b/include/linux/seqlock.h @@ -26,7 +26,6 @@ * by Keith Owens and Andrea Arcangeli */ -#include #include #include @@ -39,9 +38,17 @@ typedef struct { * These macros triggered gcc-3.x compile-time problems. We think these are * OK now. Be cautious. */ -#define SEQLOCK_UNLOCKED { 0, SPIN_LOCK_UNLOCKED } -#define seqlock_init(x) do { *(x) = (seqlock_t) SEQLOCK_UNLOCKED; } while (0) +#define __SEQLOCK_UNLOCKED(lockname) \ + { 0, __SPIN_LOCK_UNLOCKED(lockname) } +#define SEQLOCK_UNLOCKED \ + __SEQLOCK_UNLOCKED(old_style_seqlock_init) + +#define seqlock_init(x) \ + do { *(x) = (seqlock_t) __SEQLOCK_UNLOCKED(x); } while (0) + +#define DEFINE_SEQLOCK(x) \ + seqlock_t x = __SEQLOCK_UNLOCKED(x) /* Lock out other writers and update the count. * Acts like a normal spin_lock/unlock. diff --git a/include/linux/serialP.h b/include/linux/serialP.h index 2b9e6b955..e811a615f 100644 --- a/include/linux/serialP.h +++ b/include/linux/serialP.h @@ -19,7 +19,6 @@ * For definitions of the flags field, see tty.h */ -#include #include #include #include diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h index bd1485812..f9fdf9750 100644 --- a/include/linux/serial_core.h +++ b/include/linux/serial_core.h @@ -67,8 +67,8 @@ /* Parisc type numbers. */ #define PORT_MUX 48 -/* Atmel AT91RM9200 SoC */ -#define PORT_AT91RM9200 49 +/* Atmel AT91xxx SoC */ +#define PORT_AT91 49 /* Macintosh Zilog type numbers */ #define PORT_MAC_ZILOG 50 /* m68k : not yet implemented */ @@ -130,9 +130,11 @@ /* SUN4V Hypervisor Console */ #define PORT_SUNHV 72 +#define PORT_S3C2412 73 + + #ifdef __KERNEL__ -#include #include #include #include @@ -214,16 +216,18 @@ struct uart_port { unsigned char __iomem *membase; /* read/write[bwl] */ unsigned int irq; /* irq number */ unsigned int uartclk; /* base uart clock */ - unsigned char fifosize; /* tx fifo size */ + unsigned int fifosize; /* tx fifo size */ unsigned char x_char; /* xon/xoff char */ unsigned char regshift; /* reg offset shift */ unsigned char iotype; /* io access style */ + unsigned char unused1; #define UPIO_PORT (0) #define UPIO_HUB6 (1) #define UPIO_MEM (2) #define UPIO_MEM32 (3) #define UPIO_AU (4) /* Au1x00 type IO */ +#define UPIO_TSI (5) /* Tsi108/109 type IO */ unsigned int read_status_mask; /* driver specific */ unsigned int ignore_status_mask; /* driver specific */ @@ -315,6 +319,7 @@ struct uart_info { #define UIF_CTS_FLOW ((__force uif_t) (1 << 26)) #define UIF_NORMAL_ACTIVE ((__force uif_t) (1 << 29)) #define UIF_INITIALIZED ((__force uif_t) (1 << 31)) +#define UIF_SUSPENDED ((__force uif_t) (1 << 30)) int blocked_open; @@ -334,7 +339,6 @@ struct uart_driver { struct module *owner; const char *driver_name; const char *dev_name; - const char *devfs_name; int major; int minor; int nr; diff --git a/include/linux/serio.h b/include/linux/serio.h index 6348e8330..41bdd5ded 100644 --- a/include/linux/serio.h +++ b/include/linux/serio.h @@ -41,6 +41,7 @@ struct serio { void (*stop)(struct serio *); struct serio *parent, *child; + unsigned int depth; /* level of nesting in serio hierarchy */ struct serio_driver *drv; /* accessed from interrupt, must be protected by serio->lock and serio->sem */ struct mutex drv_mutex; /* protects serio->drv so attributes can pin driver */ diff --git a/include/linux/signal.h b/include/linux/signal.h index 70739f51a..117135e33 100644 --- a/include/linux/signal.h +++ b/include/linux/signal.h @@ -1,38 +1,12 @@ #ifndef _LINUX_SIGNAL_H #define _LINUX_SIGNAL_H -#include -#include #include #include #ifdef __KERNEL__ - -/* - * These values of sa_flags are used only by the kernel as part of the - * irq handling routines. - * - * SA_INTERRUPT is also used by the irq handling routines. - * SA_SHIRQ is for shared interrupt support on PCI and EISA. - * SA_PROBEIRQ is set by callers when they expect sharing mismatches to occur - */ -#define SA_SAMPLE_RANDOM SA_RESTART -#define SA_SHIRQ 0x04000000 -#define SA_PROBEIRQ 0x08000000 - -/* - * As above, these correspond to the IORESOURCE_IRQ_* defines in - * linux/ioport.h to select the interrupt line behaviour. When - * requesting an interrupt without specifying a SA_TRIGGER, the - * setting should be assumed to be "as already configured", which - * may be as per machine or firmware initialisation. - */ -#define SA_TRIGGER_LOW 0x00000008 -#define SA_TRIGGER_HIGH 0x00000004 -#define SA_TRIGGER_FALLING 0x00000002 -#define SA_TRIGGER_RISING 0x00000001 -#define SA_TRIGGER_MASK (SA_TRIGGER_HIGH|SA_TRIGGER_LOW|\ - SA_TRIGGER_RISING|SA_TRIGGER_FALLING) +#include +#include /* * Real Time signals may be queued. diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 68ed67092..099dc5e88 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -14,7 +14,6 @@ #ifndef _LINUX_SKBUFF_H #define _LINUX_SKBUFF_H -#include #include #include #include @@ -29,6 +28,7 @@ #include #include #include +#include #define HAVE_ALLOC_SKB /* For the drivers to know */ #define HAVE_ALIGNABLE_SKB /* Ditto 8) */ @@ -171,10 +171,15 @@ enum { enum { SKB_GSO_TCPV4 = 1 << 0, - SKB_GSO_UDPV4 = 1 << 1, + SKB_GSO_UDP = 1 << 1, /* This indicates the skb is from an untrusted source. */ SKB_GSO_DODGY = 1 << 2, + + /* This indicates the tcp segment has CWR set. */ + SKB_GSO_TCP_ECN = 1 << 3, + + SKB_GSO_TCPV6 = 1 << 4, }; /** @@ -220,6 +225,9 @@ enum { * @nf_bridge: Saved data about a bridged frame - see br_netfilter.c * @tc_index: Traffic control index * @tc_verd: traffic control verdict + * @dma_cookie: a cookie to one of several possible DMA operations + * done by skb DMA functions + * @secmark: security marking */ struct sk_buff { @@ -305,6 +313,12 @@ struct sk_buff { #if defined(CONFIG_VNET) || defined(CONFIG_VNET_MODULE) xid_t xid; /* VServer context ID */ #endif +#ifdef CONFIG_NET_DMA + dma_cookie_t dma_cookie; +#endif +#ifdef CONFIG_NETWORK_SECMARK + __u32 secmark; +#endif /* These elements must be at the end, see alloc_skb() for details. */ unsigned int truesize; @@ -358,7 +372,7 @@ extern struct sk_buff *skb_realloc_headroom(struct sk_buff *skb, extern struct sk_buff *skb_copy_expand(const struct sk_buff *skb, int newheadroom, int newtailroom, gfp_t priority); -extern struct sk_buff * skb_pad(struct sk_buff *skb, int pad); +extern int skb_pad(struct sk_buff *skb, int pad); #define dev_kfree_skb(a) kfree_skb(a) extern void skb_over_panic(struct sk_buff *skb, int len, void *here); @@ -601,6 +615,14 @@ static inline __u32 skb_queue_len(const struct sk_buff_head *list_) return list_->qlen; } +/* + * This function creates a split out lock class for each invocation; + * this is needed for now since a whole lot of users of the skb-queue + * infrastructure in drivers have different locking usage (in hardirq) + * than the networking core (in softirq only). In the long run either the + * network layer or drivers should need annotation to consolidate the + * main types of usage into 3 classes. + */ static inline void skb_queue_head_init(struct sk_buff_head *list) { spin_lock_init(&list->lock); @@ -1077,7 +1099,7 @@ static inline void __skb_queue_purge(struct sk_buff_head *list) #ifndef CONFIG_HAVE_ARCH_DEV_ALLOC_SKB /** - * __dev_alloc_skb - allocate an skbuff for sending + * __dev_alloc_skb - allocate an skbuff for receiving * @length: length to allocate * @gfp_mask: get_free_pages mask, passed to alloc_skb * @@ -1086,7 +1108,7 @@ static inline void __skb_queue_purge(struct sk_buff_head *list) * the headroom they think they need without accounting for the * built in space. The built in space is used for optimisations. * - * %NULL is returned in there is no free memory. + * %NULL is returned if there is no free memory. */ static inline struct sk_buff *__dev_alloc_skb(unsigned int length, gfp_t gfp_mask) @@ -1101,7 +1123,7 @@ extern struct sk_buff *__dev_alloc_skb(unsigned int length, gfp_t gfp_mask); #endif /** - * dev_alloc_skb - allocate an skbuff for sending + * dev_alloc_skb - allocate an skbuff for receiving * @length: length to allocate * * Allocate a new &sk_buff and assign it a usage count of one. The @@ -1109,7 +1131,7 @@ extern struct sk_buff *__dev_alloc_skb(unsigned int length, gfp_t gfp_mask); * the headroom they think they need without accounting for the * built in space. The built in space is used for optimisations. * - * %NULL is returned in there is no free memory. Although this function + * %NULL is returned if there is no free memory. Although this function * allocates memory it can be called from an interrupt. */ static inline struct sk_buff *dev_alloc_skb(unsigned int length) @@ -1117,6 +1139,28 @@ static inline struct sk_buff *dev_alloc_skb(unsigned int length) return __dev_alloc_skb(length, GFP_ATOMIC); } +extern struct sk_buff *__netdev_alloc_skb(struct net_device *dev, + unsigned int length, gfp_t gfp_mask); + +/** + * netdev_alloc_skb - allocate an skbuff for rx on a specific device + * @dev: network device to receive on + * @length: length to allocate + * + * Allocate a new &sk_buff and assign it a usage count of one. The + * buffer has unspecified headroom built in. Users should allocate + * the headroom they think they need without accounting for the + * built in space. The built in space is used for optimisations. + * + * %NULL is returned if there is no free memory. Although this function + * allocates memory it can be called from an interrupt. + */ +static inline struct sk_buff *netdev_alloc_skb(struct net_device *dev, + unsigned int length) +{ + return __netdev_alloc_skb(dev, length, GFP_ATOMIC); +} + /** * skb_cow - copy header of skb when it is required * @skb: buffer to cow @@ -1150,16 +1194,15 @@ static inline int skb_cow(struct sk_buff *skb, unsigned int headroom) * * Pads up a buffer to ensure the trailing bytes exist and are * blanked. If the buffer already contains sufficient data it - * is untouched. Returns the buffer, which may be a replacement - * for the original, or NULL for out of memory - in which case - * the original buffer is still freed. + * is untouched. Otherwise it is extended. Returns zero on + * success. The skb is freed on error. */ -static inline struct sk_buff *skb_padto(struct sk_buff *skb, unsigned int len) +static inline int skb_padto(struct sk_buff *skb, unsigned int len) { unsigned int size = skb->len; if (likely(size >= len)) - return skb; + return 0; return skb_pad(skb, len-size); } @@ -1319,7 +1362,6 @@ extern void skb_copy_and_csum_dev(const struct sk_buff *skb, u8 *to); extern void skb_split(struct sk_buff *skb, struct sk_buff *skb1, const u32 len); -extern void skb_release_data(struct sk_buff *skb); extern struct sk_buff *skb_segment(struct sk_buff *skb, int features); static inline void *skb_header_pointer(const struct sk_buff *skb, int offset, @@ -1450,6 +1492,24 @@ static inline void nf_reset(struct sk_buff *skb) static inline void nf_reset(struct sk_buff *skb) {} #endif /* CONFIG_NETFILTER */ +#ifdef CONFIG_NETWORK_SECMARK +static inline void skb_copy_secmark(struct sk_buff *to, const struct sk_buff *from) +{ + to->secmark = from->secmark; +} + +static inline void skb_init_secmark(struct sk_buff *skb) +{ + skb->secmark = 0; +} +#else +static inline void skb_copy_secmark(struct sk_buff *to, const struct sk_buff *from) +{ } + +static inline void skb_init_secmark(struct sk_buff *skb) +{ } +#endif + static inline int skb_is_gso(const struct sk_buff *skb) { return skb_shinfo(skb)->gso_size; diff --git a/include/linux/slab.h b/include/linux/slab.h index 2d985d59c..45ad55b70 100644 --- a/include/linux/slab.h +++ b/include/linux/slab.h @@ -11,7 +11,6 @@ typedef struct kmem_cache kmem_cache_t; -#include /* kmalloc_sizes.h needs CONFIG_ options */ #include #include #include @@ -87,6 +86,51 @@ extern void *__kmalloc_track_caller(size_t, gfp_t, void*); __kmalloc_track_caller(size, flags, __builtin_return_address(0)) #endif +/** + * kmalloc - allocate memory + * @size: how many bytes of memory are required. + * @flags: the type of memory to allocate. + * + * kmalloc is the normal method of allocating memory + * in the kernel. + * + * The @flags argument may be one of: + * + * %GFP_USER - Allocate memory on behalf of user. May sleep. + * + * %GFP_KERNEL - Allocate normal kernel ram. May sleep. + * + * %GFP_ATOMIC - Allocation will not sleep. + * For example, use this inside interrupt handlers. + * + * %GFP_HIGHUSER - Allocate pages from high memory. + * + * %GFP_NOIO - Do not do any I/O at all while trying to get memory. + * + * %GFP_NOFS - Do not make any fs calls while trying to get memory. + * + * Also it is possible to set different flags by OR'ing + * in one or more of the following additional @flags: + * + * %__GFP_COLD - Request cache-cold pages instead of + * trying to return cache-warm pages. + * + * %__GFP_DMA - Request memory from the DMA-capable zone. + * + * %__GFP_HIGH - This allocation has high priority and may use emergency pools. + * + * %__GFP_HIGHMEM - Allocated memory may be from highmem. + * + * %__GFP_NOFAIL - Indicate that this allocation is in no way allowed to fail + * (think twice before using). + * + * %__GFP_NORETRY - If memory is not immediately available, + * then give up at once. + * + * %__GFP_NOWARN - If allocation fails, don't issue any warnings. + * + * %__GFP_REPEAT - If allocation fails initially, try once more before failing. + */ static inline void *kmalloc(size_t size, gfp_t flags) { if (__builtin_constant_p(size)) { @@ -112,6 +156,11 @@ found: extern void *__kzalloc(size_t, gfp_t); +/** + * kzalloc - allocate memory. The memory is set to zero. + * @size: how many bytes of memory are required. + * @flags: the type of memory to allocate (see kmalloc). + */ static inline void *kzalloc(size_t size, gfp_t flags) { if (__builtin_constant_p(size)) { diff --git a/include/linux/smb.h b/include/linux/smb.h index b0162208c..ce10216ad 100644 --- a/include/linux/smb.h +++ b/include/linux/smb.h @@ -88,7 +88,6 @@ struct smb_fattr { struct timespec f_atime; struct timespec f_mtime; struct timespec f_ctime; - unsigned long f_blksize; unsigned long f_blocks; int f_unix; }; diff --git a/include/linux/smb_fs.h b/include/linux/smb_fs.h index 621a3d366..367d6c3e8 100644 --- a/include/linux/smb_fs.h +++ b/include/linux/smb_fs.h @@ -10,8 +10,6 @@ #define _LINUX_SMB_FS_H #include -#include -#include /* * ioctl commands @@ -24,6 +22,8 @@ #ifdef __KERNEL__ +#include +#include #include #include diff --git a/include/linux/smp.h b/include/linux/smp.h index e2fa3ab4a..837e8bce1 100644 --- a/include/linux/smp.h +++ b/include/linux/smp.h @@ -6,7 +6,6 @@ * Alan Cox. */ -#include extern void cpu_idle(void); @@ -126,4 +125,6 @@ static inline void smp_send_reschedule(int cpu) { } #define put_cpu() preempt_enable() #define put_cpu_no_resched() preempt_enable_no_resched() +void smp_setup_processor_id(void); + #endif /* __LINUX_SMP_H */ diff --git a/include/linux/smp_lock.h b/include/linux/smp_lock.h index fa1ff3b16..cf715a40d 100644 --- a/include/linux/smp_lock.h +++ b/include/linux/smp_lock.h @@ -1,7 +1,6 @@ #ifndef __LINUX_SMPLOCK_H #define __LINUX_SMPLOCK_H -#include #ifdef CONFIG_LOCK_KERNEL #include #include diff --git a/include/linux/socket.h b/include/linux/socket.h index 24f34248b..8e7a6840b 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h @@ -18,8 +18,6 @@ struct __kernel_sockaddr_storage { #if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) -#include /* for CONFIG_COMPAT */ -#include #include /* arch-dependent defines */ #include /* the SIOCxxx I/O controls */ #include /* iovec support */ diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index e928c0dcc..c8bb68099 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h @@ -642,10 +642,14 @@ struct spi_board_info { u16 bus_num; u16 chip_select; + /* mode becomes spi_device.mode, and is essential for chips + * where the default of SPI_CS_HIGH = 0 is wrong. + */ + u8 mode; + /* ... may need additional spi_device chip config data here. * avoid stuff protocol drivers can set; but include stuff * needed to behave without being bound to a driver: - * - chipselect polarity * - quirks like clock rate mattering when not selected */ }; diff --git a/include/linux/spinlock.h b/include/linux/spinlock.h index 799be6747..31473db92 100644 --- a/include/linux/spinlock.h +++ b/include/linux/spinlock.h @@ -46,7 +46,6 @@ * linux/spinlock.h: builds the final spin_*() APIs. */ -#include #include #include #include @@ -83,14 +82,40 @@ extern int __lockfunc generic__raw_read_trylock(raw_rwlock_t *lock); /* * Pull the __raw*() functions/declarations (UP-nondebug doesnt need them): */ -#if defined(CONFIG_SMP) +#ifdef CONFIG_SMP # include #else # include #endif -#define spin_lock_init(lock) do { *(lock) = SPIN_LOCK_UNLOCKED; } while (0) -#define rwlock_init(lock) do { *(lock) = RW_LOCK_UNLOCKED; } while (0) +#ifdef CONFIG_DEBUG_SPINLOCK + extern void __spin_lock_init(spinlock_t *lock, const char *name, + struct lock_class_key *key); +# define spin_lock_init(lock) \ +do { \ + static struct lock_class_key __key; \ + \ + __spin_lock_init((lock), #lock, &__key); \ +} while (0) + +#else +# define spin_lock_init(lock) \ + do { *(lock) = SPIN_LOCK_UNLOCKED; } while (0) +#endif + +#ifdef CONFIG_DEBUG_SPINLOCK + extern void __rwlock_init(rwlock_t *lock, const char *name, + struct lock_class_key *key); +# define rwlock_init(lock) \ +do { \ + static struct lock_class_key __key; \ + \ + __rwlock_init((lock), #lock, &__key); \ +} while (0) +#else +# define rwlock_init(lock) \ + do { *(lock) = RW_LOCK_UNLOCKED; } while (0) +#endif #define spin_is_locked(lock) __raw_spin_is_locked(&(lock)->raw_lock) @@ -114,7 +139,6 @@ extern int __lockfunc generic__raw_read_trylock(raw_rwlock_t *lock); #define _raw_spin_lock_flags(lock, flags) _raw_spin_lock(lock) extern int _raw_spin_trylock(spinlock_t *lock); extern void _raw_spin_unlock(spinlock_t *lock); - extern void _raw_read_lock(rwlock_t *lock); extern int _raw_read_trylock(rwlock_t *lock); extern void _raw_read_unlock(rwlock_t *lock); @@ -122,17 +146,17 @@ extern int __lockfunc generic__raw_read_trylock(raw_rwlock_t *lock); extern int _raw_write_trylock(rwlock_t *lock); extern void _raw_write_unlock(rwlock_t *lock); #else -# define _raw_spin_unlock(lock) __raw_spin_unlock(&(lock)->raw_lock) -# define _raw_spin_trylock(lock) __raw_spin_trylock(&(lock)->raw_lock) # define _raw_spin_lock(lock) __raw_spin_lock(&(lock)->raw_lock) # define _raw_spin_lock_flags(lock, flags) \ __raw_spin_lock_flags(&(lock)->raw_lock, *(flags)) +# define _raw_spin_trylock(lock) __raw_spin_trylock(&(lock)->raw_lock) +# define _raw_spin_unlock(lock) __raw_spin_unlock(&(lock)->raw_lock) # define _raw_read_lock(rwlock) __raw_read_lock(&(rwlock)->raw_lock) -# define _raw_write_lock(rwlock) __raw_write_lock(&(rwlock)->raw_lock) -# define _raw_read_unlock(rwlock) __raw_read_unlock(&(rwlock)->raw_lock) -# define _raw_write_unlock(rwlock) __raw_write_unlock(&(rwlock)->raw_lock) # define _raw_read_trylock(rwlock) __raw_read_trylock(&(rwlock)->raw_lock) +# define _raw_read_unlock(rwlock) __raw_read_unlock(&(rwlock)->raw_lock) +# define _raw_write_lock(rwlock) __raw_write_lock(&(rwlock)->raw_lock) # define _raw_write_trylock(rwlock) __raw_write_trylock(&(rwlock)->raw_lock) +# define _raw_write_unlock(rwlock) __raw_write_unlock(&(rwlock)->raw_lock) #endif #define read_can_lock(rwlock) __raw_read_can_lock(&(rwlock)->raw_lock) @@ -148,6 +172,13 @@ extern int __lockfunc generic__raw_read_trylock(raw_rwlock_t *lock); #define write_trylock(lock) __cond_lock(_write_trylock(lock)) #define spin_lock(lock) _spin_lock(lock) + +#ifdef CONFIG_DEBUG_LOCK_ALLOC +# define spin_lock_nested(lock, subclass) _spin_lock_nested(lock, subclass) +#else +# define spin_lock_nested(lock, subclass) _spin_lock(lock) +#endif + #define write_lock(lock) _write_lock(lock) #define read_lock(lock) _read_lock(lock) @@ -173,21 +204,18 @@ extern int __lockfunc generic__raw_read_trylock(raw_rwlock_t *lock); /* * We inline the unlock functions in the nondebug case: */ -#if defined(CONFIG_DEBUG_SPINLOCK) || defined(CONFIG_PREEMPT) || !defined(CONFIG_SMP) +#if defined(CONFIG_DEBUG_SPINLOCK) || defined(CONFIG_PREEMPT) || \ + !defined(CONFIG_SMP) # define spin_unlock(lock) _spin_unlock(lock) # define read_unlock(lock) _read_unlock(lock) # define write_unlock(lock) _write_unlock(lock) -#else -# define spin_unlock(lock) __raw_spin_unlock(&(lock)->raw_lock) -# define read_unlock(lock) __raw_read_unlock(&(lock)->raw_lock) -# define write_unlock(lock) __raw_write_unlock(&(lock)->raw_lock) -#endif - -#if defined(CONFIG_DEBUG_SPINLOCK) || defined(CONFIG_PREEMPT) || !defined(CONFIG_SMP) # define spin_unlock_irq(lock) _spin_unlock_irq(lock) # define read_unlock_irq(lock) _read_unlock_irq(lock) # define write_unlock_irq(lock) _write_unlock_irq(lock) #else +# define spin_unlock(lock) __raw_spin_unlock(&(lock)->raw_lock) +# define read_unlock(lock) __raw_read_unlock(&(lock)->raw_lock) +# define write_unlock(lock) __raw_write_unlock(&(lock)->raw_lock) # define spin_unlock_irq(lock) \ do { __raw_spin_unlock(&(lock)->raw_lock); local_irq_enable(); } while (0) # define read_unlock_irq(lock) \ diff --git a/include/linux/spinlock_api_smp.h b/include/linux/spinlock_api_smp.h index 78e6989ff..b2c4f8299 100644 --- a/include/linux/spinlock_api_smp.h +++ b/include/linux/spinlock_api_smp.h @@ -20,6 +20,8 @@ int in_lock_functions(unsigned long addr); #define assert_spin_locked(x) BUG_ON(!spin_is_locked(x)) void __lockfunc _spin_lock(spinlock_t *lock) __acquires(spinlock_t); +void __lockfunc _spin_lock_nested(spinlock_t *lock, int subclass) + __acquires(spinlock_t); void __lockfunc _read_lock(rwlock_t *lock) __acquires(rwlock_t); void __lockfunc _write_lock(rwlock_t *lock) __acquires(rwlock_t); void __lockfunc _spin_lock_bh(spinlock_t *lock) __acquires(spinlock_t); diff --git a/include/linux/spinlock_api_up.h b/include/linux/spinlock_api_up.h index cd81cee56..67faa044c 100644 --- a/include/linux/spinlock_api_up.h +++ b/include/linux/spinlock_api_up.h @@ -49,6 +49,7 @@ do { local_irq_restore(flags); __UNLOCK(lock); } while (0) #define _spin_lock(lock) __LOCK(lock) +#define _spin_lock_nested(lock, subclass) __LOCK(lock) #define _read_lock(lock) __LOCK(lock) #define _write_lock(lock) __LOCK(lock) #define _spin_lock_bh(lock) __LOCK_BH(lock) diff --git a/include/linux/spinlock_types.h b/include/linux/spinlock_types.h index 9cb51e070..dc5fb69e4 100644 --- a/include/linux/spinlock_types.h +++ b/include/linux/spinlock_types.h @@ -9,6 +9,8 @@ * Released under the General Public License (GPL). */ +#include + #if defined(CONFIG_SMP) # include #else @@ -24,6 +26,9 @@ typedef struct { unsigned int magic, owner_cpu; void *owner; #endif +#ifdef CONFIG_DEBUG_LOCK_ALLOC + struct lockdep_map dep_map; +#endif } spinlock_t; #define SPINLOCK_MAGIC 0xdead4ead @@ -37,31 +42,53 @@ typedef struct { unsigned int magic, owner_cpu; void *owner; #endif +#ifdef CONFIG_DEBUG_LOCK_ALLOC + struct lockdep_map dep_map; +#endif } rwlock_t; #define RWLOCK_MAGIC 0xdeaf1eed #define SPINLOCK_OWNER_INIT ((void *)-1L) +#ifdef CONFIG_DEBUG_LOCK_ALLOC +# define SPIN_DEP_MAP_INIT(lockname) .dep_map = { .name = #lockname } +#else +# define SPIN_DEP_MAP_INIT(lockname) +#endif + +#ifdef CONFIG_DEBUG_LOCK_ALLOC +# define RW_DEP_MAP_INIT(lockname) .dep_map = { .name = #lockname } +#else +# define RW_DEP_MAP_INIT(lockname) +#endif + #ifdef CONFIG_DEBUG_SPINLOCK -# define SPIN_LOCK_UNLOCKED \ +# define __SPIN_LOCK_UNLOCKED(lockname) \ (spinlock_t) { .raw_lock = __RAW_SPIN_LOCK_UNLOCKED, \ .magic = SPINLOCK_MAGIC, \ .owner = SPINLOCK_OWNER_INIT, \ - .owner_cpu = -1 } -#define RW_LOCK_UNLOCKED \ + .owner_cpu = -1, \ + SPIN_DEP_MAP_INIT(lockname) } +#define __RW_LOCK_UNLOCKED(lockname) \ (rwlock_t) { .raw_lock = __RAW_RW_LOCK_UNLOCKED, \ .magic = RWLOCK_MAGIC, \ .owner = SPINLOCK_OWNER_INIT, \ - .owner_cpu = -1 } + .owner_cpu = -1, \ + RW_DEP_MAP_INIT(lockname) } #else -# define SPIN_LOCK_UNLOCKED \ - (spinlock_t) { .raw_lock = __RAW_SPIN_LOCK_UNLOCKED } -#define RW_LOCK_UNLOCKED \ - (rwlock_t) { .raw_lock = __RAW_RW_LOCK_UNLOCKED } +# define __SPIN_LOCK_UNLOCKED(lockname) \ + (spinlock_t) { .raw_lock = __RAW_SPIN_LOCK_UNLOCKED, \ + SPIN_DEP_MAP_INIT(lockname) } +#define __RW_LOCK_UNLOCKED(lockname) \ + (rwlock_t) { .raw_lock = __RAW_RW_LOCK_UNLOCKED, \ + RW_DEP_MAP_INIT(lockname) } #endif -#define DEFINE_SPINLOCK(x) spinlock_t x = SPIN_LOCK_UNLOCKED -#define DEFINE_RWLOCK(x) rwlock_t x = RW_LOCK_UNLOCKED +#define SPIN_LOCK_UNLOCKED __SPIN_LOCK_UNLOCKED(old_style_spin_init) +#define RW_LOCK_UNLOCKED __RW_LOCK_UNLOCKED(old_style_rw_init) + +#define DEFINE_SPINLOCK(x) spinlock_t x = __SPIN_LOCK_UNLOCKED(x) +#define DEFINE_RWLOCK(x) rwlock_t x = __RW_LOCK_UNLOCKED(x) #endif /* __LINUX_SPINLOCK_TYPES_H */ diff --git a/include/linux/spinlock_types_up.h b/include/linux/spinlock_types_up.h index 04135b0e1..27644af20 100644 --- a/include/linux/spinlock_types_up.h +++ b/include/linux/spinlock_types_up.h @@ -12,10 +12,14 @@ * Released under the General Public License (GPL). */ -#ifdef CONFIG_DEBUG_SPINLOCK +#if defined(CONFIG_DEBUG_SPINLOCK) || \ + defined(CONFIG_DEBUG_LOCK_ALLOC) typedef struct { volatile unsigned int slock; +#ifdef CONFIG_DEBUG_LOCK_ALLOC + struct lockdep_map dep_map; +#endif } raw_spinlock_t; #define __RAW_SPIN_LOCK_UNLOCKED { 1 } @@ -30,6 +34,9 @@ typedef struct { } raw_spinlock_t; typedef struct { /* no debug version on UP */ +#ifdef CONFIG_DEBUG_LOCK_ALLOC + struct lockdep_map dep_map; +#endif } raw_rwlock_t; #define __RAW_RW_LOCK_UNLOCKED { } diff --git a/include/linux/spinlock_up.h b/include/linux/spinlock_up.h index 31accf2f0..ea54c4c9a 100644 --- a/include/linux/spinlock_up.h +++ b/include/linux/spinlock_up.h @@ -18,7 +18,6 @@ */ #ifdef CONFIG_DEBUG_SPINLOCK - #define __raw_spin_is_locked(x) ((x)->slock == 0) static inline void __raw_spin_lock(raw_spinlock_t *lock) diff --git a/include/linux/squashfs_fs.h b/include/linux/squashfs_fs.h index 54a6e5e6d..ef01d8874 100644 --- a/include/linux/squashfs_fs.h +++ b/include/linux/squashfs_fs.h @@ -1,9 +1,11 @@ #ifndef SQUASHFS_FS #define SQUASHFS_FS + /* * Squashfs * - * Copyright (c) 2002, 2003, 2004, 2005 Phillip Lougher + * Copyright (c) 2002, 2003, 2004, 2005, 2006 + * Phillip Lougher * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -22,6 +24,10 @@ * squashfs_fs.h */ +#ifndef CONFIG_SQUASHFS_2_0_COMPATIBILITY +#define CONFIG_SQUASHFS_2_0_COMPATIBILITY +#endif + #ifdef CONFIG_SQUASHFS_VMALLOC #define SQUASHFS_ALLOC(a) vmalloc(a) #define SQUASHFS_FREE(a) vfree(a) @@ -30,8 +36,8 @@ #define SQUASHFS_FREE(a) kfree(a) #endif #define SQUASHFS_CACHED_FRAGMENTS CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE -#define SQUASHFS_MAJOR 2 -#define SQUASHFS_MINOR 1 +#define SQUASHFS_MAJOR 3 +#define SQUASHFS_MINOR 0 #define SQUASHFS_MAGIC 0x73717368 #define SQUASHFS_MAGIC_SWAP 0x68737173 #define SQUASHFS_START 0 @@ -54,8 +60,9 @@ #define SQUASHFS_NAME_LEN 256 #define SQUASHFS_INVALID ((long long) 0xffffffffffff) -#define SQUASHFS_INVALID_BLK ((long long) 0xffffffff) -#define SQUASHFS_USED_BLK ((long long) 0xfffffffe) +#define SQUASHFS_INVALID_FRAG ((unsigned int) 0xffffffff) +#define SQUASHFS_INVALID_BLK ((long long) -1) +#define SQUASHFS_USED_BLK ((long long) -2) /* Filesystem flags */ #define SQUASHFS_NOI 0 @@ -65,15 +72,34 @@ #define SQUASHFS_NO_FRAG 4 #define SQUASHFS_ALWAYS_FRAG 5 #define SQUASHFS_DUPLICATE 6 + #define SQUASHFS_BIT(flag, bit) ((flag >> bit) & 1) -#define SQUASHFS_UNCOMPRESSED_INODES(flags) SQUASHFS_BIT(flags, SQUASHFS_NOI) -#define SQUASHFS_UNCOMPRESSED_DATA(flags) SQUASHFS_BIT(flags, SQUASHFS_NOD) -#define SQUASHFS_UNCOMPRESSED_FRAGMENTS(flags) SQUASHFS_BIT(flags, SQUASHFS_NOF) -#define SQUASHFS_NO_FRAGMENTS(flags) SQUASHFS_BIT(flags, SQUASHFS_NO_FRAG) -#define SQUASHFS_ALWAYS_FRAGMENTS(flags) SQUASHFS_BIT(flags, SQUASHFS_ALWAYS_FRAG) -#define SQUASHFS_DUPLICATES(flags) SQUASHFS_BIT(flags, SQUASHFS_DUPLICATE) -#define SQUASHFS_CHECK_DATA(flags) SQUASHFS_BIT(flags, SQUASHFS_CHECK) -#define SQUASHFS_MKFLAGS(noi, nod, check_data, nof, no_frag, always_frag, duplicate_checking) (noi | (nod << 1) | (check_data << 2) | (nof << 3) | (no_frag << 4) | (always_frag << 5) | (duplicate_checking << 6)) + +#define SQUASHFS_UNCOMPRESSED_INODES(flags) SQUASHFS_BIT(flags, \ + SQUASHFS_NOI) + +#define SQUASHFS_UNCOMPRESSED_DATA(flags) SQUASHFS_BIT(flags, \ + SQUASHFS_NOD) + +#define SQUASHFS_UNCOMPRESSED_FRAGMENTS(flags) SQUASHFS_BIT(flags, \ + SQUASHFS_NOF) + +#define SQUASHFS_NO_FRAGMENTS(flags) SQUASHFS_BIT(flags, \ + SQUASHFS_NO_FRAG) + +#define SQUASHFS_ALWAYS_FRAGMENTS(flags) SQUASHFS_BIT(flags, \ + SQUASHFS_ALWAYS_FRAG) + +#define SQUASHFS_DUPLICATES(flags) SQUASHFS_BIT(flags, \ + SQUASHFS_DUPLICATE) + +#define SQUASHFS_CHECK_DATA(flags) SQUASHFS_BIT(flags, \ + SQUASHFS_CHECK) + +#define SQUASHFS_MKFLAGS(noi, nod, check_data, nof, no_frag, always_frag, \ + duplicate_checking) (noi | (nod << 1) | (check_data << 2) \ + | (nof << 3) | (no_frag << 4) | (always_frag << 5) | \ + (duplicate_checking << 6)) /* Max number of types and file types */ #define SQUASHFS_DIR_TYPE 1 @@ -84,73 +110,113 @@ #define SQUASHFS_FIFO_TYPE 6 #define SQUASHFS_SOCKET_TYPE 7 #define SQUASHFS_LDIR_TYPE 8 +#define SQUASHFS_LREG_TYPE 9 /* 1.0 filesystem type definitions */ #define SQUASHFS_TYPES 5 #define SQUASHFS_IPC_TYPE 0 -/* Flag whether block is compressed or uncompressed, bit is set if block is uncompressed */ +/* Flag whether block is compressed or uncompressed, bit is set if block is + * uncompressed */ #define SQUASHFS_COMPRESSED_BIT (1 << 15) + #define SQUASHFS_COMPRESSED_SIZE(B) (((B) & ~SQUASHFS_COMPRESSED_BIT) ? \ - (B) & ~SQUASHFS_COMPRESSED_BIT : SQUASHFS_COMPRESSED_BIT) + (B) & ~SQUASHFS_COMPRESSED_BIT : SQUASHFS_COMPRESSED_BIT) #define SQUASHFS_COMPRESSED(B) (!((B) & SQUASHFS_COMPRESSED_BIT)) #define SQUASHFS_COMPRESSED_BIT_BLOCK (1 << 24) -#define SQUASHFS_COMPRESSED_SIZE_BLOCK(B) (((B) & ~SQUASHFS_COMPRESSED_BIT_BLOCK) ? \ - (B) & ~SQUASHFS_COMPRESSED_BIT_BLOCK : SQUASHFS_COMPRESSED_BIT_BLOCK) -#define SQUASHFS_COMPRESSED_BLOCK(B) (!((B) & SQUASHFS_COMPRESSED_BIT_BLOCK)) +#define SQUASHFS_COMPRESSED_SIZE_BLOCK(B) (((B) & \ + ~SQUASHFS_COMPRESSED_BIT_BLOCK) ? (B) & \ + ~SQUASHFS_COMPRESSED_BIT_BLOCK : SQUASHFS_COMPRESSED_BIT_BLOCK) + +#define SQUASHFS_COMPRESSED_BLOCK(B) (!((B) & SQUASHFS_COMPRESSED_BIT_BLOCK)) /* - * Inode number ops. Inodes consist of a compressed block number, and an uncompressed - * offset within that block + * Inode number ops. Inodes consist of a compressed block number, and an + * uncompressed offset within that block */ #define SQUASHFS_INODE_BLK(a) ((unsigned int) ((a) >> 16)) + #define SQUASHFS_INODE_OFFSET(a) ((unsigned int) ((a) & 0xffff)) -#define SQUASHFS_MKINODE(A, B) ((squashfs_inode)(((squashfs_inode) (A) << 16)\ - + (B))) + +#define SQUASHFS_MKINODE(A, B) ((squashfs_inode_t)(((squashfs_inode_t) (A)\ + << 16) + (B))) /* Compute 32 bit VFS inode number from squashfs inode number */ -#define SQUASHFS_MK_VFS_INODE(a, b) ((unsigned int) (((a) << 8) + ((b) >> 2) + 1)) +#define SQUASHFS_MK_VFS_INODE(a, b) ((unsigned int) (((a) << 8) + \ + ((b) >> 2) + 1)) +/* XXX */ /* Translate between VFS mode and squashfs mode */ #define SQUASHFS_MODE(a) ((a) & 0xfff) /* fragment and fragment table defines */ -typedef unsigned int squashfs_fragment_index; -#define SQUASHFS_FRAGMENT_BYTES(A) (A * sizeof(squashfs_fragment_entry)) -#define SQUASHFS_FRAGMENT_INDEX(A) (SQUASHFS_FRAGMENT_BYTES(A) / SQUASHFS_METADATA_SIZE) -#define SQUASHFS_FRAGMENT_INDEX_OFFSET(A) (SQUASHFS_FRAGMENT_BYTES(A) % SQUASHFS_METADATA_SIZE) -#define SQUASHFS_FRAGMENT_INDEXES(A) ((SQUASHFS_FRAGMENT_BYTES(A) + SQUASHFS_METADATA_SIZE - 1) / SQUASHFS_METADATA_SIZE) -#define SQUASHFS_FRAGMENT_INDEX_BYTES(A) (SQUASHFS_FRAGMENT_INDEXES(A) * sizeof(squashfs_fragment_index)) +#define SQUASHFS_FRAGMENT_BYTES(A) (A * sizeof(struct squashfs_fragment_entry)) + +#define SQUASHFS_FRAGMENT_INDEX(A) (SQUASHFS_FRAGMENT_BYTES(A) / \ + SQUASHFS_METADATA_SIZE) + +#define SQUASHFS_FRAGMENT_INDEX_OFFSET(A) (SQUASHFS_FRAGMENT_BYTES(A) % \ + SQUASHFS_METADATA_SIZE) + +#define SQUASHFS_FRAGMENT_INDEXES(A) ((SQUASHFS_FRAGMENT_BYTES(A) + \ + SQUASHFS_METADATA_SIZE - 1) / \ + SQUASHFS_METADATA_SIZE) + +#define SQUASHFS_FRAGMENT_INDEX_BYTES(A) (SQUASHFS_FRAGMENT_INDEXES(A) *\ + sizeof(long long)) /* cached data constants for filesystem */ #define SQUASHFS_CACHED_BLKS 8 -#define SQUASHFS_MAX_FILE_SIZE_LOG 32 -#define SQUASHFS_MAX_FILE_SIZE ((long long) 1 << (SQUASHFS_MAX_FILE_SIZE_LOG - 1)) +#define SQUASHFS_MAX_FILE_SIZE_LOG 64 + +#define SQUASHFS_MAX_FILE_SIZE ((long long) 1 << \ + (SQUASHFS_MAX_FILE_SIZE_LOG - 2)) #define SQUASHFS_MARKER_BYTE 0xff +/* meta index cache */ +#define SQUASHFS_META_INDEXES (SQUASHFS_METADATA_SIZE / sizeof(unsigned int)) +#define SQUASHFS_META_ENTRIES 31 +#define SQUASHFS_META_NUMBER 8 +#define SQUASHFS_SLOTS 4 + +struct meta_entry { + long long data_block; + unsigned int index_block; + unsigned short offset; + unsigned short pad; +}; + +struct meta_index { + unsigned int inode_number; + unsigned int offset; + unsigned short entries; + unsigned short skip; + unsigned short locked; + unsigned short pad; + struct meta_entry meta_entry[SQUASHFS_META_ENTRIES]; +}; + /* * definitions for structures on disk */ -typedef unsigned int squashfs_block; -typedef long long squashfs_inode; - -typedef unsigned int squashfs_uid; +typedef long long squashfs_block_t; +typedef long long squashfs_inode_t; -typedef struct squashfs_super_block { +struct squashfs_super_block { unsigned int s_magic; unsigned int inodes; - unsigned int bytes_used; - unsigned int uid_start; - unsigned int guid_start; - unsigned int inode_table_start; - unsigned int directory_table_start; + unsigned int bytes_used_2; + unsigned int uid_start_2; + unsigned int guid_start_2; + unsigned int inode_table_start_2; + unsigned int directory_table_start_2; unsigned int s_major:16; unsigned int s_minor:16; unsigned int block_size_1:16; @@ -159,108 +225,125 @@ typedef struct squashfs_super_block { unsigned int no_uids:8; unsigned int no_guids:8; unsigned int mkfs_time /* time of filesystem creation */; - squashfs_inode root_inode; + squashfs_inode_t root_inode; unsigned int block_size; unsigned int fragments; - unsigned int fragment_table_start; -} __attribute__ ((packed)) squashfs_super_block; - -typedef struct { - unsigned int index:27; - unsigned int start_block:29; + unsigned int fragment_table_start_2; + long long bytes_used; + long long uid_start; + long long guid_start; + long long inode_table_start; + long long directory_table_start; + long long fragment_table_start; + long long unused; +} __attribute__ ((packed)); + +struct squashfs_dir_index { + unsigned int index; + unsigned int start_block; unsigned char size; unsigned char name[0]; -} __attribute__ ((packed)) squashfs_dir_index; - -typedef struct { - unsigned int inode_type:4; - unsigned int mode:12; /* protection */ - unsigned int uid:8; /* index into uid table */ - unsigned int guid:8; /* index into guid table */ -} __attribute__ ((packed)) squashfs_base_inode_header; - -typedef squashfs_base_inode_header squashfs_ipc_inode_header; - -typedef struct { - unsigned int inode_type:4; - unsigned int mode:12; /* protection */ - unsigned int uid:8; /* index into uid table */ - unsigned int guid:8; /* index into guid table */ +} __attribute__ ((packed)); + +#define SQUASHFS_BASE_INODE_HEADER \ + unsigned int inode_type:4; \ + unsigned int mode:12; \ + unsigned int uid:8; \ + unsigned int guid:8; \ + unsigned int mtime; \ + unsigned int inode_number; + +struct squashfs_base_inode_header { + SQUASHFS_BASE_INODE_HEADER; +} __attribute__ ((packed)); + +struct squashfs_ipc_inode_header { + SQUASHFS_BASE_INODE_HEADER; + unsigned int nlink; +} __attribute__ ((packed)); + +struct squashfs_dev_inode_header { + SQUASHFS_BASE_INODE_HEADER; + unsigned int nlink; unsigned short rdev; -} __attribute__ ((packed)) squashfs_dev_inode_header; +} __attribute__ ((packed)); -typedef struct { - unsigned int inode_type:4; - unsigned int mode:12; /* protection */ - unsigned int uid:8; /* index into uid table */ - unsigned int guid:8; /* index into guid table */ +struct squashfs_symlink_inode_header { + SQUASHFS_BASE_INODE_HEADER; + unsigned int nlink; unsigned short symlink_size; char symlink[0]; -} __attribute__ ((packed)) squashfs_symlink_inode_header; +} __attribute__ ((packed)); -typedef struct { - unsigned int inode_type:4; - unsigned int mode:12; /* protection */ - unsigned int uid:8; /* index into uid table */ - unsigned int guid:8; /* index into guid table */ - unsigned int mtime; - squashfs_block start_block; +struct squashfs_reg_inode_header { + SQUASHFS_BASE_INODE_HEADER; + squashfs_block_t start_block; unsigned int fragment; unsigned int offset; - unsigned int file_size:SQUASHFS_MAX_FILE_SIZE_LOG; + unsigned int file_size; unsigned short block_list[0]; -} __attribute__ ((packed)) squashfs_reg_inode_header; +} __attribute__ ((packed)); -typedef struct { - unsigned int inode_type:4; - unsigned int mode:12; /* protection */ - unsigned int uid:8; /* index into uid table */ - unsigned int guid:8; /* index into guid table */ +struct squashfs_lreg_inode_header { + SQUASHFS_BASE_INODE_HEADER; + unsigned int nlink; + squashfs_block_t start_block; + unsigned int fragment; + unsigned int offset; + long long file_size; + unsigned short block_list[0]; +} __attribute__ ((packed)); + +struct squashfs_dir_inode_header { + SQUASHFS_BASE_INODE_HEADER; + unsigned int nlink; unsigned int file_size:19; unsigned int offset:13; - unsigned int mtime; - unsigned int start_block:24; -} __attribute__ ((packed)) squashfs_dir_inode_header; + unsigned int start_block; + unsigned int parent_inode; +} __attribute__ ((packed)); -typedef struct { - unsigned int inode_type:4; - unsigned int mode:12; /* protection */ - unsigned int uid:8; /* index into uid table */ - unsigned int guid:8; /* index into guid table */ +struct squashfs_ldir_inode_header { + SQUASHFS_BASE_INODE_HEADER; + unsigned int nlink; unsigned int file_size:27; unsigned int offset:13; - unsigned int mtime; - unsigned int start_block:24; + unsigned int start_block; unsigned int i_count:16; - squashfs_dir_index index[0]; -} __attribute__ ((packed)) squashfs_ldir_inode_header; - -typedef union { - squashfs_base_inode_header base; - squashfs_dev_inode_header dev; - squashfs_symlink_inode_header symlink; - squashfs_reg_inode_header reg; - squashfs_dir_inode_header dir; - squashfs_ldir_inode_header ldir; - squashfs_ipc_inode_header ipc; -} squashfs_inode_header; + unsigned int parent_inode; + struct squashfs_dir_index index[0]; +} __attribute__ ((packed)); + +union squashfs_inode_header { + struct squashfs_base_inode_header base; + struct squashfs_dev_inode_header dev; + struct squashfs_symlink_inode_header symlink; + struct squashfs_reg_inode_header reg; + struct squashfs_lreg_inode_header lreg; + struct squashfs_dir_inode_header dir; + struct squashfs_ldir_inode_header ldir; + struct squashfs_ipc_inode_header ipc; +}; -typedef struct { +struct squashfs_dir_entry { unsigned int offset:13; unsigned int type:3; unsigned int size:8; + int inode_number:16; char name[0]; -} __attribute__ ((packed)) squashfs_dir_entry; +} __attribute__ ((packed)); -typedef struct { +struct squashfs_dir_header { unsigned int count:8; - unsigned int start_block:24; -} __attribute__ ((packed)) squashfs_dir_header; - -typedef struct { unsigned int start_block; + unsigned int inode_number; +} __attribute__ ((packed)); + +struct squashfs_fragment_entry { + long long start_block; unsigned int size; -} __attribute__ ((packed)) squashfs_fragment_entry; + unsigned int unused; +} __attribute__ ((packed)); extern int squashfs_uncompress_block(void *d, int dstlen, void *s, int srclen); extern int squashfs_uncompress_init(void); @@ -268,20 +351,28 @@ extern int squashfs_uncompress_exit(void); /* * macros to convert each packed bitfield structure from little endian to big - * endian and vice versa. These are needed when creating or using a filesystem on a - * machine with different byte ordering to the target architecture. + * endian and vice versa. These are needed when creating or using a filesystem + * on a machine with different byte ordering to the target architecture. * */ +#define SQUASHFS_SWAP_START \ + int bits;\ + int b_pos;\ + unsigned long long val;\ + unsigned char *s;\ + unsigned char *d; + #define SQUASHFS_SWAP_SUPER_BLOCK(s, d) {\ - SQUASHFS_MEMSET(s, d, sizeof(squashfs_super_block));\ + SQUASHFS_SWAP_START\ + SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_super_block));\ SQUASHFS_SWAP((s)->s_magic, d, 0, 32);\ SQUASHFS_SWAP((s)->inodes, d, 32, 32);\ - SQUASHFS_SWAP((s)->bytes_used, d, 64, 32);\ - SQUASHFS_SWAP((s)->uid_start, d, 96, 32);\ - SQUASHFS_SWAP((s)->guid_start, d, 128, 32);\ - SQUASHFS_SWAP((s)->inode_table_start, d, 160, 32);\ - SQUASHFS_SWAP((s)->directory_table_start, d, 192, 32);\ + SQUASHFS_SWAP((s)->bytes_used_2, d, 64, 32);\ + SQUASHFS_SWAP((s)->uid_start_2, d, 96, 32);\ + SQUASHFS_SWAP((s)->guid_start_2, d, 128, 32);\ + SQUASHFS_SWAP((s)->inode_table_start_2, d, 160, 32);\ + SQUASHFS_SWAP((s)->directory_table_start_2, d, 192, 32);\ SQUASHFS_SWAP((s)->s_major, d, 224, 16);\ SQUASHFS_SWAP((s)->s_minor, d, 240, 16);\ SQUASHFS_SWAP((s)->block_size_1, d, 256, 16);\ @@ -293,153 +384,218 @@ extern int squashfs_uncompress_exit(void); SQUASHFS_SWAP((s)->root_inode, d, 344, 64);\ SQUASHFS_SWAP((s)->block_size, d, 408, 32);\ SQUASHFS_SWAP((s)->fragments, d, 440, 32);\ - SQUASHFS_SWAP((s)->fragment_table_start, d, 472, 32);\ + SQUASHFS_SWAP((s)->fragment_table_start_2, d, 472, 32);\ + SQUASHFS_SWAP((s)->bytes_used, d, 504, 64);\ + SQUASHFS_SWAP((s)->uid_start, d, 568, 64);\ + SQUASHFS_SWAP((s)->guid_start, d, 632, 64);\ + SQUASHFS_SWAP((s)->inode_table_start, d, 696, 64);\ + SQUASHFS_SWAP((s)->directory_table_start, d, 760, 64);\ + SQUASHFS_SWAP((s)->fragment_table_start, d, 824, 64);\ + SQUASHFS_SWAP((s)->unused, d, 888, 64);\ } -#define SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, n) {\ +#define SQUASHFS_SWAP_BASE_INODE_CORE(s, d, n)\ SQUASHFS_MEMSET(s, d, n);\ SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\ SQUASHFS_SWAP((s)->mode, d, 4, 12);\ SQUASHFS_SWAP((s)->uid, d, 16, 8);\ SQUASHFS_SWAP((s)->guid, d, 24, 8);\ + SQUASHFS_SWAP((s)->mtime, d, 32, 32);\ + SQUASHFS_SWAP((s)->inode_number, d, 64, 32); + +#define SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, n) {\ + SQUASHFS_SWAP_START\ + SQUASHFS_SWAP_BASE_INODE_CORE(s, d, n)\ } -#define SQUASHFS_SWAP_IPC_INODE_HEADER(s, d) SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, sizeof(squashfs_ipc_inode_header)) +#define SQUASHFS_SWAP_IPC_INODE_HEADER(s, d) {\ + SQUASHFS_SWAP_START\ + SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \ + sizeof(struct squashfs_ipc_inode_header))\ + SQUASHFS_SWAP((s)->nlink, d, 96, 32);\ +} #define SQUASHFS_SWAP_DEV_INODE_HEADER(s, d) {\ - SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, sizeof(squashfs_dev_inode_header));\ - SQUASHFS_SWAP((s)->rdev, d, 32, 16);\ + SQUASHFS_SWAP_START\ + SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \ + sizeof(struct squashfs_dev_inode_header)); \ + SQUASHFS_SWAP((s)->nlink, d, 96, 32);\ + SQUASHFS_SWAP((s)->rdev, d, 128, 16);\ } #define SQUASHFS_SWAP_SYMLINK_INODE_HEADER(s, d) {\ - SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, sizeof(squashfs_symlink_inode_header));\ - SQUASHFS_SWAP((s)->symlink_size, d, 32, 16);\ + SQUASHFS_SWAP_START\ + SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \ + sizeof(struct squashfs_symlink_inode_header));\ + SQUASHFS_SWAP((s)->nlink, d, 96, 32);\ + SQUASHFS_SWAP((s)->symlink_size, d, 128, 16);\ } #define SQUASHFS_SWAP_REG_INODE_HEADER(s, d) {\ - SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, sizeof(squashfs_reg_inode_header));\ - SQUASHFS_SWAP((s)->mtime, d, 32, 32);\ - SQUASHFS_SWAP((s)->start_block, d, 64, 32);\ - SQUASHFS_SWAP((s)->fragment, d, 96, 32);\ - SQUASHFS_SWAP((s)->offset, d, 128, 32);\ - SQUASHFS_SWAP((s)->file_size, d, 160, SQUASHFS_MAX_FILE_SIZE_LOG);\ + SQUASHFS_SWAP_START\ + SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \ + sizeof(struct squashfs_reg_inode_header));\ + SQUASHFS_SWAP((s)->start_block, d, 96, 64);\ + SQUASHFS_SWAP((s)->fragment, d, 160, 32);\ + SQUASHFS_SWAP((s)->offset, d, 192, 32);\ + SQUASHFS_SWAP((s)->file_size, d, 224, 32);\ +} + +#define SQUASHFS_SWAP_LREG_INODE_HEADER(s, d) {\ + SQUASHFS_SWAP_START\ + SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \ + sizeof(struct squashfs_lreg_inode_header));\ + SQUASHFS_SWAP((s)->nlink, d, 96, 32);\ + SQUASHFS_SWAP((s)->start_block, d, 128, 64);\ + SQUASHFS_SWAP((s)->fragment, d, 192, 32);\ + SQUASHFS_SWAP((s)->offset, d, 224, 32);\ + SQUASHFS_SWAP((s)->file_size, d, 256, 64);\ } #define SQUASHFS_SWAP_DIR_INODE_HEADER(s, d) {\ - SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, sizeof(squashfs_dir_inode_header));\ - SQUASHFS_SWAP((s)->file_size, d, 32, 19);\ - SQUASHFS_SWAP((s)->offset, d, 51, 13);\ - SQUASHFS_SWAP((s)->mtime, d, 64, 32);\ - SQUASHFS_SWAP((s)->start_block, d, 96, 24);\ + SQUASHFS_SWAP_START\ + SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \ + sizeof(struct squashfs_dir_inode_header));\ + SQUASHFS_SWAP((s)->nlink, d, 96, 32);\ + SQUASHFS_SWAP((s)->file_size, d, 128, 19);\ + SQUASHFS_SWAP((s)->offset, d, 147, 13);\ + SQUASHFS_SWAP((s)->start_block, d, 160, 32);\ + SQUASHFS_SWAP((s)->parent_inode, d, 192, 32);\ } #define SQUASHFS_SWAP_LDIR_INODE_HEADER(s, d) {\ - SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, sizeof(squashfs_ldir_inode_header));\ - SQUASHFS_SWAP((s)->file_size, d, 32, 27);\ - SQUASHFS_SWAP((s)->offset, d, 59, 13);\ - SQUASHFS_SWAP((s)->mtime, d, 72, 32);\ - SQUASHFS_SWAP((s)->start_block, d, 104, 24);\ - SQUASHFS_SWAP((s)->i_count, d, 128, 16);\ + SQUASHFS_SWAP_START\ + SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \ + sizeof(struct squashfs_ldir_inode_header));\ + SQUASHFS_SWAP((s)->nlink, d, 96, 32);\ + SQUASHFS_SWAP((s)->file_size, d, 128, 27);\ + SQUASHFS_SWAP((s)->offset, d, 155, 13);\ + SQUASHFS_SWAP((s)->start_block, d, 168, 32);\ + SQUASHFS_SWAP((s)->i_count, d, 200, 16);\ + SQUASHFS_SWAP((s)->parent_inode, d, 216, 32);\ } #define SQUASHFS_SWAP_DIR_INDEX(s, d) {\ - SQUASHFS_MEMSET(s, d, sizeof(squashfs_dir_index));\ - SQUASHFS_SWAP((s)->index, d, 0, 27);\ - SQUASHFS_SWAP((s)->start_block, d, 27, 29);\ - SQUASHFS_SWAP((s)->size, d, 56, 8);\ + SQUASHFS_SWAP_START\ + SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_index));\ + SQUASHFS_SWAP((s)->index, d, 0, 32);\ + SQUASHFS_SWAP((s)->start_block, d, 32, 32);\ + SQUASHFS_SWAP((s)->size, d, 64, 8);\ } #define SQUASHFS_SWAP_DIR_HEADER(s, d) {\ - SQUASHFS_MEMSET(s, d, sizeof(squashfs_dir_header));\ + SQUASHFS_SWAP_START\ + SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_header));\ SQUASHFS_SWAP((s)->count, d, 0, 8);\ - SQUASHFS_SWAP((s)->start_block, d, 8, 24);\ + SQUASHFS_SWAP((s)->start_block, d, 8, 32);\ + SQUASHFS_SWAP((s)->inode_number, d, 40, 32);\ } #define SQUASHFS_SWAP_DIR_ENTRY(s, d) {\ - SQUASHFS_MEMSET(s, d, sizeof(squashfs_dir_entry));\ + SQUASHFS_SWAP_START\ + SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_entry));\ SQUASHFS_SWAP((s)->offset, d, 0, 13);\ SQUASHFS_SWAP((s)->type, d, 13, 3);\ SQUASHFS_SWAP((s)->size, d, 16, 8);\ + SQUASHFS_SWAP((s)->inode_number, d, 24, 16);\ } #define SQUASHFS_SWAP_FRAGMENT_ENTRY(s, d) {\ - SQUASHFS_MEMSET(s, d, sizeof(squashfs_fragment_entry));\ - SQUASHFS_SWAP((s)->start_block, d, 0, 32);\ - SQUASHFS_SWAP((s)->size, d, 32, 32);\ + SQUASHFS_SWAP_START\ + SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_fragment_entry));\ + SQUASHFS_SWAP((s)->start_block, d, 0, 64);\ + SQUASHFS_SWAP((s)->size, d, 64, 32);\ } #define SQUASHFS_SWAP_SHORTS(s, d, n) {\ int entry;\ int bit_position;\ + SQUASHFS_SWAP_START\ SQUASHFS_MEMSET(s, d, n * 2);\ - for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += 16)\ + for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \ + 16)\ SQUASHFS_SWAP(s[entry], d, bit_position, 16);\ } #define SQUASHFS_SWAP_INTS(s, d, n) {\ int entry;\ int bit_position;\ + SQUASHFS_SWAP_START\ SQUASHFS_MEMSET(s, d, n * 4);\ - for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += 32)\ + for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \ + 32)\ SQUASHFS_SWAP(s[entry], d, bit_position, 32);\ } +#define SQUASHFS_SWAP_LONG_LONGS(s, d, n) {\ + int entry;\ + int bit_position;\ + SQUASHFS_SWAP_START\ + SQUASHFS_MEMSET(s, d, n * 8);\ + for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \ + 64)\ + SQUASHFS_SWAP(s[entry], d, bit_position, 64);\ +} + #define SQUASHFS_SWAP_DATA(s, d, n, bits) {\ int entry;\ int bit_position;\ + SQUASHFS_SWAP_START\ SQUASHFS_MEMSET(s, d, n * bits / 8);\ - for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += bits)\ + for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \ + bits)\ SQUASHFS_SWAP(s[entry], d, bit_position, bits);\ } -#define SQUASHFS_SWAP_FRAGMENT_INDEXES(s, d, n) SQUASHFS_SWAP_INTS(s, d, n) +#define SQUASHFS_SWAP_FRAGMENT_INDEXES(s, d, n) SQUASHFS_SWAP_LONG_LONGS(s, d, n) + +#ifdef CONFIG_SQUASHFS_1_0_COMPATIBILITY -#ifdef SQUASHFS_1_0_COMPATIBILITY -typedef struct { +struct squashfs_base_inode_header_1 { unsigned int inode_type:4; unsigned int mode:12; /* protection */ unsigned int uid:4; /* index into uid table */ unsigned int guid:4; /* index into guid table */ -} __attribute__ ((packed)) squashfs_base_inode_header_1; +} __attribute__ ((packed)); -typedef struct { +struct squashfs_ipc_inode_header_1 { unsigned int inode_type:4; unsigned int mode:12; /* protection */ unsigned int uid:4; /* index into uid table */ unsigned int guid:4; /* index into guid table */ unsigned int type:4; unsigned int offset:4; -} __attribute__ ((packed)) squashfs_ipc_inode_header_1; +} __attribute__ ((packed)); -typedef struct { +struct squashfs_dev_inode_header_1 { unsigned int inode_type:4; unsigned int mode:12; /* protection */ unsigned int uid:4; /* index into uid table */ unsigned int guid:4; /* index into guid table */ unsigned short rdev; -} __attribute__ ((packed)) squashfs_dev_inode_header_1; +} __attribute__ ((packed)); -typedef struct { +struct squashfs_symlink_inode_header_1 { unsigned int inode_type:4; unsigned int mode:12; /* protection */ unsigned int uid:4; /* index into uid table */ unsigned int guid:4; /* index into guid table */ unsigned short symlink_size; char symlink[0]; -} __attribute__ ((packed)) squashfs_symlink_inode_header_1; +} __attribute__ ((packed)); -typedef struct { +struct squashfs_reg_inode_header_1 { unsigned int inode_type:4; unsigned int mode:12; /* protection */ unsigned int uid:4; /* index into uid table */ unsigned int guid:4; /* index into guid table */ unsigned int mtime; - squashfs_block start_block; - unsigned int file_size:SQUASHFS_MAX_FILE_SIZE_LOG; + unsigned int start_block; + unsigned int file_size:32; unsigned short block_list[0]; -} __attribute__ ((packed)) squashfs_reg_inode_header_1; +} __attribute__ ((packed)); -typedef struct { +struct squashfs_dir_inode_header_1 { unsigned int inode_type:4; unsigned int mode:12; /* protection */ unsigned int uid:4; /* index into uid table */ @@ -448,72 +604,308 @@ typedef struct { unsigned int offset:13; unsigned int mtime; unsigned int start_block:24; -} __attribute__ ((packed)) squashfs_dir_inode_header_1; +} __attribute__ ((packed)); -#define SQUASHFS_SWAP_BASE_INODE_HEADER_1(s, d, n) {\ +#define SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, n) \ SQUASHFS_MEMSET(s, d, n);\ SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\ SQUASHFS_SWAP((s)->mode, d, 4, 12);\ SQUASHFS_SWAP((s)->uid, d, 16, 4);\ - SQUASHFS_SWAP((s)->guid, d, 20, 4);\ + SQUASHFS_SWAP((s)->guid, d, 20, 4); + +#define SQUASHFS_SWAP_BASE_INODE_HEADER_1(s, d, n) {\ + SQUASHFS_SWAP_START\ + SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, n)\ } #define SQUASHFS_SWAP_IPC_INODE_HEADER_1(s, d) {\ - SQUASHFS_SWAP_BASE_INODE_HEADER_1(s, d, sizeof(squashfs_ipc_inode_header_1));\ + SQUASHFS_SWAP_START\ + SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \ + sizeof(struct squashfs_ipc_inode_header_1));\ SQUASHFS_SWAP((s)->type, d, 24, 4);\ SQUASHFS_SWAP((s)->offset, d, 28, 4);\ } #define SQUASHFS_SWAP_DEV_INODE_HEADER_1(s, d) {\ - SQUASHFS_SWAP_BASE_INODE_HEADER_1(s, d, sizeof(squashfs_dev_inode_header_1));\ + SQUASHFS_SWAP_START\ + SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \ + sizeof(struct squashfs_dev_inode_header_1));\ SQUASHFS_SWAP((s)->rdev, d, 24, 16);\ } #define SQUASHFS_SWAP_SYMLINK_INODE_HEADER_1(s, d) {\ - SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, sizeof(squashfs_symlink_inode_header_1));\ + SQUASHFS_SWAP_START\ + SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \ + sizeof(struct squashfs_symlink_inode_header_1));\ SQUASHFS_SWAP((s)->symlink_size, d, 24, 16);\ } #define SQUASHFS_SWAP_REG_INODE_HEADER_1(s, d) {\ - SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, sizeof(squashfs_reg_inode_header_1));\ + SQUASHFS_SWAP_START\ + SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \ + sizeof(struct squashfs_reg_inode_header_1));\ SQUASHFS_SWAP((s)->mtime, d, 24, 32);\ SQUASHFS_SWAP((s)->start_block, d, 56, 32);\ - SQUASHFS_SWAP((s)->file_size, d, 88, SQUASHFS_MAX_FILE_SIZE_LOG);\ + SQUASHFS_SWAP((s)->file_size, d, 88, 32);\ } #define SQUASHFS_SWAP_DIR_INODE_HEADER_1(s, d) {\ - SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, sizeof(squashfs_dir_inode_header_1));\ + SQUASHFS_SWAP_START\ + SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \ + sizeof(struct squashfs_dir_inode_header_1));\ SQUASHFS_SWAP((s)->file_size, d, 24, 19);\ SQUASHFS_SWAP((s)->offset, d, 43, 13);\ SQUASHFS_SWAP((s)->mtime, d, 56, 32);\ SQUASHFS_SWAP((s)->start_block, d, 88, 24);\ } + +#endif + +#ifdef CONFIG_SQUASHFS_2_0_COMPATIBILITY + +struct squashfs_dir_index_2 { + unsigned int index:27; + unsigned int start_block:29; + unsigned char size; + unsigned char name[0]; +} __attribute__ ((packed)); + +struct squashfs_base_inode_header_2 { + unsigned int inode_type:4; + unsigned int mode:12; /* protection */ + unsigned int uid:8; /* index into uid table */ + unsigned int guid:8; /* index into guid table */ +} __attribute__ ((packed)); + +struct squashfs_ipc_inode_header_2 { + unsigned int inode_type:4; + unsigned int mode:12; /* protection */ + unsigned int uid:8; /* index into uid table */ + unsigned int guid:8; /* index into guid table */ +} __attribute__ ((packed)); + +struct squashfs_dev_inode_header_2 { + unsigned int inode_type:4; + unsigned int mode:12; /* protection */ + unsigned int uid:8; /* index into uid table */ + unsigned int guid:8; /* index into guid table */ + unsigned short rdev; +} __attribute__ ((packed)); + +struct squashfs_symlink_inode_header_2 { + unsigned int inode_type:4; + unsigned int mode:12; /* protection */ + unsigned int uid:8; /* index into uid table */ + unsigned int guid:8; /* index into guid table */ + unsigned short symlink_size; + char symlink[0]; +} __attribute__ ((packed)); + +struct squashfs_reg_inode_header_2 { + unsigned int inode_type:4; + unsigned int mode:12; /* protection */ + unsigned int uid:8; /* index into uid table */ + unsigned int guid:8; /* index into guid table */ + unsigned int mtime; + unsigned int start_block; + unsigned int fragment; + unsigned int offset; + unsigned int file_size:32; + unsigned short block_list[0]; +} __attribute__ ((packed)); + +struct squashfs_dir_inode_header_2 { + unsigned int inode_type:4; + unsigned int mode:12; /* protection */ + unsigned int uid:8; /* index into uid table */ + unsigned int guid:8; /* index into guid table */ + unsigned int file_size:19; + unsigned int offset:13; + unsigned int mtime; + unsigned int start_block:24; +} __attribute__ ((packed)); + +struct squashfs_ldir_inode_header_2 { + unsigned int inode_type:4; + unsigned int mode:12; /* protection */ + unsigned int uid:8; /* index into uid table */ + unsigned int guid:8; /* index into guid table */ + unsigned int file_size:27; + unsigned int offset:13; + unsigned int mtime; + unsigned int start_block:24; + unsigned int i_count:16; + struct squashfs_dir_index_2 index[0]; +} __attribute__ ((packed)); + +union squashfs_inode_header_2 { + struct squashfs_base_inode_header_2 base; + struct squashfs_dev_inode_header_2 dev; + struct squashfs_symlink_inode_header_2 symlink; + struct squashfs_reg_inode_header_2 reg; + struct squashfs_dir_inode_header_2 dir; + struct squashfs_ldir_inode_header_2 ldir; + struct squashfs_ipc_inode_header_2 ipc; +}; + +struct squashfs_dir_header_2 { + unsigned int count:8; + unsigned int start_block:24; +} __attribute__ ((packed)); + +struct squashfs_dir_entry_2 { + unsigned int offset:13; + unsigned int type:3; + unsigned int size:8; + char name[0]; +} __attribute__ ((packed)); + +struct squashfs_fragment_entry_2 { + unsigned int start_block; + unsigned int size; +} __attribute__ ((packed)); + +#define SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, n)\ + SQUASHFS_MEMSET(s, d, n);\ + SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\ + SQUASHFS_SWAP((s)->mode, d, 4, 12);\ + SQUASHFS_SWAP((s)->uid, d, 16, 8);\ + SQUASHFS_SWAP((s)->guid, d, 24, 8);\ + +#define SQUASHFS_SWAP_BASE_INODE_HEADER_2(s, d, n) {\ + SQUASHFS_SWAP_START\ + SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, n)\ +} + +#define SQUASHFS_SWAP_IPC_INODE_HEADER_2(s, d) \ + SQUASHFS_SWAP_BASE_INODE_HEADER_2(s, d, sizeof(struct squashfs_ipc_inode_header_2)) + +#define SQUASHFS_SWAP_DEV_INODE_HEADER_2(s, d) {\ + SQUASHFS_SWAP_START\ + SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \ + sizeof(struct squashfs_dev_inode_header_2)); \ + SQUASHFS_SWAP((s)->rdev, d, 32, 16);\ +} + +#define SQUASHFS_SWAP_SYMLINK_INODE_HEADER_2(s, d) {\ + SQUASHFS_SWAP_START\ + SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \ + sizeof(struct squashfs_symlink_inode_header_2));\ + SQUASHFS_SWAP((s)->symlink_size, d, 32, 16);\ +} + +#define SQUASHFS_SWAP_REG_INODE_HEADER_2(s, d) {\ + SQUASHFS_SWAP_START\ + SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \ + sizeof(struct squashfs_reg_inode_header_2));\ + SQUASHFS_SWAP((s)->mtime, d, 32, 32);\ + SQUASHFS_SWAP((s)->start_block, d, 64, 32);\ + SQUASHFS_SWAP((s)->fragment, d, 96, 32);\ + SQUASHFS_SWAP((s)->offset, d, 128, 32);\ + SQUASHFS_SWAP((s)->file_size, d, 160, 32);\ +} + +#define SQUASHFS_SWAP_DIR_INODE_HEADER_2(s, d) {\ + SQUASHFS_SWAP_START\ + SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \ + sizeof(struct squashfs_dir_inode_header_2));\ + SQUASHFS_SWAP((s)->file_size, d, 32, 19);\ + SQUASHFS_SWAP((s)->offset, d, 51, 13);\ + SQUASHFS_SWAP((s)->mtime, d, 64, 32);\ + SQUASHFS_SWAP((s)->start_block, d, 96, 24);\ +} + +#define SQUASHFS_SWAP_LDIR_INODE_HEADER_2(s, d) {\ + SQUASHFS_SWAP_START\ + SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \ + sizeof(struct squashfs_ldir_inode_header_2));\ + SQUASHFS_SWAP((s)->file_size, d, 32, 27);\ + SQUASHFS_SWAP((s)->offset, d, 59, 13);\ + SQUASHFS_SWAP((s)->mtime, d, 72, 32);\ + SQUASHFS_SWAP((s)->start_block, d, 104, 24);\ + SQUASHFS_SWAP((s)->i_count, d, 128, 16);\ +} + +#define SQUASHFS_SWAP_DIR_INDEX_2(s, d) {\ + SQUASHFS_SWAP_START\ + SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_index_2));\ + SQUASHFS_SWAP((s)->index, d, 0, 27);\ + SQUASHFS_SWAP((s)->start_block, d, 27, 29);\ + SQUASHFS_SWAP((s)->size, d, 56, 8);\ +} +#define SQUASHFS_SWAP_DIR_HEADER_2(s, d) {\ + SQUASHFS_SWAP_START\ + SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_header_2));\ + SQUASHFS_SWAP((s)->count, d, 0, 8);\ + SQUASHFS_SWAP((s)->start_block, d, 8, 24);\ +} + +#define SQUASHFS_SWAP_DIR_ENTRY_2(s, d) {\ + SQUASHFS_SWAP_START\ + SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_entry_2));\ + SQUASHFS_SWAP((s)->offset, d, 0, 13);\ + SQUASHFS_SWAP((s)->type, d, 13, 3);\ + SQUASHFS_SWAP((s)->size, d, 16, 8);\ +} + +#define SQUASHFS_SWAP_FRAGMENT_ENTRY_2(s, d) {\ + SQUASHFS_SWAP_START\ + SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_fragment_entry_2));\ + SQUASHFS_SWAP((s)->start_block, d, 0, 32);\ + SQUASHFS_SWAP((s)->size, d, 32, 32);\ +} + +#define SQUASHFS_SWAP_FRAGMENT_INDEXES_2(s, d, n) SQUASHFS_SWAP_INTS(s, d, n) + +/* fragment and fragment table defines */ +#define SQUASHFS_FRAGMENT_BYTES_2(A) (A * sizeof(struct squashfs_fragment_entry_2)) + +#define SQUASHFS_FRAGMENT_INDEX_2(A) (SQUASHFS_FRAGMENT_BYTES_2(A) / \ + SQUASHFS_METADATA_SIZE) + +#define SQUASHFS_FRAGMENT_INDEX_OFFSET_2(A) (SQUASHFS_FRAGMENT_BYTES_2(A) % \ + SQUASHFS_METADATA_SIZE) + +#define SQUASHFS_FRAGMENT_INDEXES_2(A) ((SQUASHFS_FRAGMENT_BYTES_2(A) + \ + SQUASHFS_METADATA_SIZE - 1) / \ + SQUASHFS_METADATA_SIZE) + +#define SQUASHFS_FRAGMENT_INDEX_BYTES_2(A) (SQUASHFS_FRAGMENT_INDEXES_2(A) *\ + sizeof(int)) + #endif #ifdef __KERNEL__ + /* * macros used to swap each structure entry, taking into account - * bitfields and different bitfield placing conventions on differing architectures + * bitfields and different bitfield placing conventions on differing + * architectures */ + #include + #ifdef __BIG_ENDIAN /* convert from little endian to big endian */ -#define SQUASHFS_SWAP(value, p, pos, tbits) _SQUASHFS_SWAP(value, p, pos, tbits, b_pos) +#define SQUASHFS_SWAP(value, p, pos, tbits) _SQUASHFS_SWAP(value, p, pos, \ + tbits, b_pos) #else /* convert from big endian to little endian */ -#define SQUASHFS_SWAP(value, p, pos, tbits) _SQUASHFS_SWAP(value, p, pos, tbits, 64 - tbits - b_pos) +#define SQUASHFS_SWAP(value, p, pos, tbits) _SQUASHFS_SWAP(value, p, pos, \ + tbits, 64 - tbits - b_pos) #endif #define _SQUASHFS_SWAP(value, p, pos, tbits, SHIFT) {\ - int bits;\ - int b_pos = pos % 8;\ - unsigned long long val = 0;\ - unsigned char *s = (unsigned char *)p + (pos / 8);\ - unsigned char *d = ((unsigned char *) &val) + 7;\ + b_pos = pos % 8;\ + val = 0;\ + s = (unsigned char *)p + (pos / 8);\ + d = ((unsigned char *) &val) + 7;\ for(bits = 0; bits < (tbits + b_pos); bits += 8) \ *d-- = *s++;\ value = (val >> (SHIFT))/* & ((1 << tbits) - 1)*/;\ } + #define SQUASHFS_MEMSET(s, d, n) memset(s, 0, n); + #endif #endif diff --git a/include/linux/squashfs_fs_i.h b/include/linux/squashfs_fs_i.h index 0d6a8795a..d0cf810a8 100644 --- a/include/linux/squashfs_fs_i.h +++ b/include/linux/squashfs_fs_i.h @@ -3,7 +3,8 @@ /* * Squashfs * - * Copyright (c) 2002, 2003, 2004, 2005 Phillip Lougher + * Copyright (c) 2002, 2003, 2004, 2005, 2006 + * Phillip Lougher * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -22,22 +23,23 @@ * squashfs_fs_i.h */ -typedef struct squashfs_inode_info { - unsigned int start_block; - unsigned int block_list_start; +struct squashfs_inode_info { + long long start_block; unsigned int offset; union { struct { - unsigned int fragment_start_block; + long long fragment_start_block; unsigned int fragment_size; unsigned int fragment_offset; + long long block_list_start; } s1; struct { - unsigned int directory_index_start; + long long directory_index_start; unsigned int directory_index_offset; unsigned int directory_index_count; + unsigned int parent_inode; } s2; } u; struct inode vfs_inode; - } squashfs_inode_info; +}; #endif diff --git a/include/linux/squashfs_fs_sb.h b/include/linux/squashfs_fs_sb.h index 615a8cee2..6b35e64d0 100644 --- a/include/linux/squashfs_fs_sb.h +++ b/include/linux/squashfs_fs_sb.h @@ -3,7 +3,8 @@ /* * Squashfs * - * Copyright (c) 2002, 2003, 2004, 2005 Phillip Lougher + * Copyright (c) 2002, 2003, 2004, 2005, 2006 + * Phillip Lougher * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,42 +25,51 @@ #include -typedef struct { - unsigned int block; +struct squashfs_cache { + long long block; int length; - unsigned int next_index; + long long next_index; char *data; - } squashfs_cache; +}; struct squashfs_fragment_cache { - unsigned int block; + long long block; int length; unsigned int locked; char *data; - }; +}; -typedef struct squashfs_sb_info { - squashfs_super_block sBlk; +struct squashfs_sb_info { + struct squashfs_super_block sblk; int devblksize; int devblksize_log2; int swap; - squashfs_cache *block_cache; + struct squashfs_cache *block_cache; struct squashfs_fragment_cache *fragment; int next_cache; int next_fragment; - squashfs_uid *uid; - squashfs_uid *guid; - squashfs_fragment_index *fragment_index; + int next_meta_index; + unsigned int *uid; + unsigned int *guid; + long long *fragment_index; + unsigned int *fragment_index_2; unsigned int read_size; char *read_data; char *read_page; + struct semaphore read_data_mutex; struct semaphore read_page_mutex; struct semaphore block_cache_mutex; struct semaphore fragment_mutex; + struct semaphore meta_index_mutex; wait_queue_head_t waitq; wait_queue_head_t fragment_wait_queue; - struct inode *(*iget)(struct super_block *s, squashfs_inode inode); - unsigned int (*read_blocklist)(struct inode *inode, int index, int readahead_blks, - char *block_list, unsigned short **block_p, unsigned int *bsize); - } squashfs_sb_info; + struct meta_index *meta_index; + z_stream stream; + struct inode *(*iget)(struct super_block *s, squashfs_inode_t \ + inode); + long long (*read_blocklist)(struct inode *inode, int \ + index, int readahead_blks, char *block_list, \ + unsigned short **block_p, unsigned int *bsize); + int (*read_fragment_index_table)(struct super_block *s); +}; #endif diff --git a/include/linux/stat.h b/include/linux/stat.h index 512df9852..b2d3bc720 100644 --- a/include/linux/stat.h +++ b/include/linux/stat.h @@ -57,7 +57,7 @@ #include struct kstat { - unsigned long ino; + u64 ino; dev_t dev; umode_t mode; unsigned int nlink; diff --git a/include/linux/stddef.h b/include/linux/stddef.h index b3a2cadf9..ea65dfb60 100644 --- a/include/linux/stddef.h +++ b/include/linux/stddef.h @@ -10,11 +10,13 @@ #define NULL ((void *)0) #endif +#ifdef __KERNEL__ #undef offsetof #ifdef __compiler_offsetof #define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER) #else #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) #endif +#endif /* __KERNEL__ */ #endif diff --git a/include/linux/stop_machine.h b/include/linux/stop_machine.h index 151a803ed..5bfc553bd 100644 --- a/include/linux/stop_machine.h +++ b/include/linux/stop_machine.h @@ -4,7 +4,6 @@ very heavy lock, which is equivalent to grabbing every spinlock (and more). So the "read" side to such a lock is anything which diables preeempt. */ -#include #include #include diff --git a/include/linux/string.h b/include/linux/string.h index c61306da8..e4c755860 100644 --- a/include/linux/string.h +++ b/include/linux/string.h @@ -56,6 +56,7 @@ extern char * strnchr(const char *, size_t, int); #ifndef __HAVE_ARCH_STRRCHR extern char * strrchr(const char *,int); #endif +extern char * strstrip(char *); #ifndef __HAVE_ARCH_STRSTR extern char * strstr(const char *,const char *); #endif diff --git a/include/linux/sunrpc/auth.h b/include/linux/sunrpc/auth.h index b27c818da..bb6b93b6c 100644 --- a/include/linux/sunrpc/auth.h +++ b/include/linux/sunrpc/auth.h @@ -11,7 +11,6 @@ #ifdef __KERNEL__ -#include #include #include #include diff --git a/include/linux/sunrpc/debug.h b/include/linux/sunrpc/debug.h index 1a42d902b..e4729aa67 100644 --- a/include/linux/sunrpc/debug.h +++ b/include/linux/sunrpc/debug.h @@ -9,19 +9,6 @@ #ifndef _LINUX_SUNRPC_DEBUG_H_ #define _LINUX_SUNRPC_DEBUG_H_ -#include - -#include -#include - -/* - * Enable RPC debugging/profiling. - */ -#ifdef CONFIG_SYSCTL -#define RPC_DEBUG -#endif -/* #define RPC_PROFILE */ - /* * RPC debug facilities */ @@ -41,6 +28,17 @@ #ifdef __KERNEL__ +#include +#include + +/* + * Enable RPC debugging/profiling. + */ +#ifdef CONFIG_SYSCTL +#define RPC_DEBUG +#endif +/* #define RPC_PROFILE */ + /* * Debugging macros etc */ diff --git a/include/linux/sunrpc/gss_api.h b/include/linux/sunrpc/gss_api.h index 9b8bcf125..6e112cc5c 100644 --- a/include/linux/sunrpc/gss_api.h +++ b/include/linux/sunrpc/gss_api.h @@ -126,7 +126,7 @@ struct gss_api_mech *gss_mech_get_by_pseudoflavor(u32); /* Just increments the mechanism's reference count and returns its input: */ struct gss_api_mech * gss_mech_get(struct gss_api_mech *); -/* For every succesful gss_mech_get or gss_mech_get_by_* call there must be a +/* For every successful gss_mech_get or gss_mech_get_by_* call there must be a * corresponding call to gss_mech_put. */ void gss_mech_put(struct gss_api_mech *); diff --git a/include/linux/sunrpc/rpc_pipe_fs.h b/include/linux/sunrpc/rpc_pipe_fs.h index 2c2189cb3..a481472c9 100644 --- a/include/linux/sunrpc/rpc_pipe_fs.h +++ b/include/linux/sunrpc/rpc_pipe_fs.h @@ -42,9 +42,9 @@ RPC_I(struct inode *inode) extern int rpc_queue_upcall(struct inode *, struct rpc_pipe_msg *); extern struct dentry *rpc_mkdir(char *, struct rpc_clnt *); -extern int rpc_rmdir(char *); +extern int rpc_rmdir(struct dentry *); extern struct dentry *rpc_mkpipe(char *, void *, struct rpc_pipe_ops *, int flags); -extern int rpc_unlink(char *); +extern int rpc_unlink(struct dentry *); extern struct vfsmount *rpc_get_mount(void); extern void rpc_put_mount(void); diff --git a/include/linux/sunrpc/stats.h b/include/linux/sunrpc/stats.h index d93c24b47..5fa0f2084 100644 --- a/include/linux/sunrpc/stats.h +++ b/include/linux/sunrpc/stats.h @@ -9,7 +9,6 @@ #ifndef _LINUX_SUNRPC_STATS_H #define _LINUX_SUNRPC_STATS_H -#include #include struct rpc_stat { diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h index 503564384..7b27c09b5 100644 --- a/include/linux/sunrpc/svc.h +++ b/include/linux/sunrpc/svc.h @@ -159,7 +159,9 @@ struct svc_rqst { * determine what device number * to report (real or virtual) */ - + int rq_sendfile_ok; /* turned off in gss privacy + * to prevent encrypting page + * cache pages */ wait_queue_head_t rq_wait; /* synchronization */ }; diff --git a/include/linux/sunrpc/xdr.h b/include/linux/sunrpc/xdr.h index 84c35d42d..e6d3d3495 100644 --- a/include/linux/sunrpc/xdr.h +++ b/include/linux/sunrpc/xdr.h @@ -194,6 +194,7 @@ extern void xdr_write_pages(struct xdr_stream *xdr, struct page **pages, extern void xdr_init_decode(struct xdr_stream *xdr, struct xdr_buf *buf, uint32_t *p); extern uint32_t *xdr_inline_decode(struct xdr_stream *xdr, size_t nbytes); extern void xdr_read_pages(struct xdr_stream *xdr, unsigned int len); +extern void xdr_enter_page(struct xdr_stream *xdr, unsigned int len); #endif /* __KERNEL__ */ diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h index e8bbe8118..3a0cca255 100644 --- a/include/linux/sunrpc/xprt.h +++ b/include/linux/sunrpc/xprt.h @@ -37,7 +37,7 @@ extern unsigned int xprt_max_resvport; #define RPC_MIN_RESVPORT (1U) #define RPC_MAX_RESVPORT (65535U) -#define RPC_DEF_MIN_RESVPORT (650U) +#define RPC_DEF_MIN_RESVPORT (665U) #define RPC_DEF_MAX_RESVPORT (1023U) /* @@ -229,7 +229,7 @@ int xprt_reserve_xprt(struct rpc_task *task); int xprt_reserve_xprt_cong(struct rpc_task *task); int xprt_prepare_transmit(struct rpc_task *task); void xprt_transmit(struct rpc_task *task); -void xprt_abort_transmit(struct rpc_task *task); +void xprt_end_transmit(struct rpc_task *task); int xprt_adjust_timeout(struct rpc_rqst *req); void xprt_release_xprt(struct rpc_xprt *xprt, struct rpc_task *task); void xprt_release_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task); diff --git a/include/linux/suspend.h b/include/linux/suspend.h index 37c1c76fd..6e8a06c95 100644 --- a/include/linux/suspend.h +++ b/include/linux/suspend.h @@ -6,7 +6,6 @@ #endif #include #include -#include #include #include @@ -58,14 +57,6 @@ static inline int software_suspend(void) } #endif /* CONFIG_PM */ -#ifdef CONFIG_SUSPEND_SMP -extern void disable_nonboot_cpus(void); -extern void enable_nonboot_cpus(void); -#else -static inline void disable_nonboot_cpus(void) {} -static inline void enable_nonboot_cpus(void) {} -#endif - void save_processor_state(void); void restore_processor_state(void); struct saved_context; diff --git a/include/linux/swap.h b/include/linux/swap.h index f03c24719..f433a87e3 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -1,7 +1,6 @@ #ifndef _LINUX_SWAP_H #define _LINUX_SWAP_H -#include #include #include #include @@ -11,6 +10,8 @@ #include #include +struct bio; + #define SWAP_FLAG_PREFER 0x8000 /* set if swap priority specified */ #define SWAP_FLAG_PRIO_MASK 0x7fff #define SWAP_FLAG_PRIO_SHIFT 0 @@ -29,7 +30,14 @@ static inline int current_is_kswapd(void) * the type/offset into the pte as 5/27 as well. */ #define MAX_SWAPFILES_SHIFT 5 +#ifndef CONFIG_MIGRATION #define MAX_SWAPFILES (1 << MAX_SWAPFILES_SHIFT) +#else +/* Use last two entries for page migration swap entries */ +#define MAX_SWAPFILES ((1 << MAX_SWAPFILES_SHIFT)-2) +#define SWP_MIGRATION_READ MAX_SWAPFILES +#define SWP_MIGRATION_WRITE (MAX_SWAPFILES + 1) +#endif /* * Magic header for a swap area. The first part of the union is @@ -49,12 +57,14 @@ union swap_header { char magic[10]; /* SWAP-SPACE or SWAPSPACE2 */ } magic; struct { - char bootbits[1024]; /* Space for disklabel etc. */ - unsigned int version; - unsigned int last_page; - unsigned int nr_badpages; - unsigned int padding[125]; - unsigned int badpages[1]; + char bootbits[1024]; /* Space for disklabel etc. */ + __u32 version; + __u32 last_page; + __u32 nr_badpages; + unsigned char sws_uuid[16]; + unsigned char sws_volume[16]; + __u32 padding[117]; + __u32 badpages[1]; } info; }; @@ -177,24 +187,12 @@ extern unsigned long try_to_free_pages(struct zone **, gfp_t); extern unsigned long shrink_all_memory(unsigned long nr_pages); extern int vm_swappiness; extern int remove_mapping(struct address_space *mapping, struct page *page); - -/* possible outcome of pageout() */ -typedef enum { - /* failed to write page out, page is locked */ - PAGE_KEEP, - /* move page to the active list, page is locked */ - PAGE_ACTIVATE, - /* page has been sent to the disk successfully, page is unlocked */ - PAGE_SUCCESS, - /* page is clean and locked */ - PAGE_CLEAN, -} pageout_t; - -extern pageout_t pageout(struct page *page, struct address_space *mapping); +extern long vm_total_pages; #ifdef CONFIG_NUMA extern int zone_reclaim_mode; -extern int zone_reclaim_interval; +extern int sysctl_min_unmapped_ratio; +extern int sysctl_min_slab_ratio; extern int zone_reclaim(struct zone *, gfp_t, unsigned int); #else #define zone_reclaim_mode 0 @@ -204,6 +202,8 @@ static inline int zone_reclaim(struct zone *z, gfp_t mask, unsigned int order) } #endif +extern int kswapd_run(int nid); + #ifdef CONFIG_MMU /* linux/mm/shmem.c */ extern int shmem_unuse(swp_entry_t entry, struct page *page); @@ -215,7 +215,9 @@ extern void swap_unplug_io_fn(struct backing_dev_info *, struct page *); /* linux/mm/page_io.c */ extern int swap_readpage(struct file *, struct page *); extern int swap_writepage(struct page *page, struct writeback_control *wbc); -extern int rw_swap_page_sync(int, swp_entry_t, struct page *); +extern int rw_swap_page_sync(int rw, swp_entry_t entry, struct page *page, + struct bio **bio_chain); +extern int end_swap_bio_read(struct bio *bio, unsigned int bytes_done, int err); /* linux/mm/swap_state.c */ extern struct address_space swapper_space; @@ -251,7 +253,6 @@ extern int remove_exclusive_swap_page(struct page *); struct backing_dev_info; extern spinlock_t swap_lock; -extern int remove_vma_swap(struct vm_area_struct *vma, struct page *page); /* linux/mm/thrash.c */ extern struct mm_struct * swap_token_mm; @@ -289,18 +290,60 @@ static inline void disable_swap_token(void) #define free_pages_and_swap_cache(pages, nr) \ release_pages((pages), (nr), 0); -#define show_swap_cache_info() /*NOTHING*/ -#define free_swap_and_cache(swp) /*NOTHING*/ -#define swap_duplicate(swp) /*NOTHING*/ -#define swap_free(swp) /*NOTHING*/ -#define read_swap_cache_async(swp,vma,addr) NULL -#define lookup_swap_cache(swp) NULL -#define valid_swaphandles(swp, off) 0 +static inline void show_swap_cache_info(void) +{ +} + +static inline void free_swap_and_cache(swp_entry_t swp) +{ +} + +static inline int swap_duplicate(swp_entry_t swp) +{ + return 0; +} + +static inline void swap_free(swp_entry_t swp) +{ +} + +static inline struct page *read_swap_cache_async(swp_entry_t swp, + struct vm_area_struct *vma, unsigned long addr) +{ + return NULL; +} + +static inline struct page *lookup_swap_cache(swp_entry_t swp) +{ + return NULL; +} + +static inline int valid_swaphandles(swp_entry_t entry, unsigned long *offset) +{ + return 0; +} + #define can_share_swap_page(p) (page_mapcount(p) == 1) -#define move_to_swap_cache(p, swp) 1 -#define move_from_swap_cache(p, i, m) 1 -#define __delete_from_swap_cache(p) /*NOTHING*/ -#define delete_from_swap_cache(p) /*NOTHING*/ + +static inline int move_to_swap_cache(struct page *page, swp_entry_t entry) +{ + return 1; +} + +static inline int move_from_swap_cache(struct page *page, unsigned long index, + struct address_space *mapping) +{ + return 1; +} + +static inline void __delete_from_swap_cache(struct page *page) +{ +} + +static inline void delete_from_swap_cache(struct page *page) +{ +} + #define swap_token_default_timeout 0 static inline int remove_exclusive_swap_page(struct page *p) diff --git a/include/linux/swapops.h b/include/linux/swapops.h index 87b9d14c7..ec639aa3a 100644 --- a/include/linux/swapops.h +++ b/include/linux/swapops.h @@ -67,3 +67,56 @@ static inline pte_t swp_entry_to_pte(swp_entry_t entry) BUG_ON(pte_file(__swp_entry_to_pte(arch_entry))); return __swp_entry_to_pte(arch_entry); } + +#ifdef CONFIG_MIGRATION +static inline swp_entry_t make_migration_entry(struct page *page, int write) +{ + BUG_ON(!PageLocked(page)); + return swp_entry(write ? SWP_MIGRATION_WRITE : SWP_MIGRATION_READ, + page_to_pfn(page)); +} + +static inline int is_migration_entry(swp_entry_t entry) +{ + return unlikely(swp_type(entry) == SWP_MIGRATION_READ || + swp_type(entry) == SWP_MIGRATION_WRITE); +} + +static inline int is_write_migration_entry(swp_entry_t entry) +{ + return unlikely(swp_type(entry) == SWP_MIGRATION_WRITE); +} + +static inline struct page *migration_entry_to_page(swp_entry_t entry) +{ + struct page *p = pfn_to_page(swp_offset(entry)); + /* + * Any use of migration entries may only occur while the + * corresponding page is locked + */ + BUG_ON(!PageLocked(p)); + return p; +} + +static inline void make_migration_entry_read(swp_entry_t *entry) +{ + *entry = swp_entry(SWP_MIGRATION_READ, swp_offset(*entry)); +} + +extern void migration_entry_wait(struct mm_struct *mm, pmd_t *pmd, + unsigned long address); +#else + +#define make_migration_entry(page, write) swp_entry(0, 0) +#define is_migration_entry(swp) 0 +#define migration_entry_to_page(swp) NULL +static inline void make_migration_entry_read(swp_entry_t *entryp) { } +static inline void migration_entry_wait(struct mm_struct *mm, pmd_t *pmd, + unsigned long address) { } +static inline int is_write_migration_entry(swp_entry_t entry) +{ + return 0; +} + +#endif + diff --git a/include/linux/synclink.h b/include/linux/synclink.h index 2993302f7..0577f5284 100644 --- a/include/linux/synclink.h +++ b/include/linux/synclink.h @@ -1,7 +1,7 @@ /* * SyncLink Multiprotocol Serial Adapter Driver * - * $Id: synclink.h,v 3.11 2006/02/06 21:20:29 paulkf Exp $ + * $Id: synclink.h,v 3.13 2006/05/23 18:25:06 paulkf Exp $ * * Copyright (C) 1998-2000 by Microgate Corporation * @@ -97,6 +97,8 @@ #define HDLC_TXIDLE_ALT_MARK_SPACE 4 #define HDLC_TXIDLE_SPACE 5 #define HDLC_TXIDLE_MARK 6 +#define HDLC_TXIDLE_CUSTOM_8 0x10000000 +#define HDLC_TXIDLE_CUSTOM_16 0x20000000 #define HDLC_ENCODING_NRZ 0 #define HDLC_ENCODING_NRZB 1 @@ -170,6 +172,7 @@ typedef struct _MGSL_PARAMS #define SYNCLINK_GT_DEVICE_ID 0x0070 #define SYNCLINK_GT4_DEVICE_ID 0x0080 #define SYNCLINK_AC_DEVICE_ID 0x0090 +#define SYNCLINK_GT2_DEVICE_ID 0x00A0 #define MGSL_MAX_SERIAL_NUMBER 30 /* diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 60d49e545..008f04c56 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h @@ -54,7 +54,6 @@ struct compat_stat; struct compat_timeval; struct robust_list_head; -#include #include #include #include @@ -175,9 +174,9 @@ asmlinkage long sys_waitid(int which, pid_t pid, int options, struct rusage __user *ru); asmlinkage long sys_waitpid(pid_t pid, int __user *stat_addr, int options); asmlinkage long sys_set_tid_address(int __user *tidptr); -asmlinkage long sys_futex(u32 __user *uaddr, int op, int val, +asmlinkage long sys_futex(u32 __user *uaddr, int op, u32 val, struct timespec __user *utime, u32 __user *uaddr2, - int val3); + u32 val3); asmlinkage long sys_init_module(void __user *umod, unsigned long len, const char __user *uargs); @@ -517,6 +516,16 @@ asmlinkage long sys_set_mempolicy(int mode, unsigned long __user *nmask, asmlinkage long sys_migrate_pages(pid_t pid, unsigned long maxnode, const unsigned long __user *from, const unsigned long __user *to); +asmlinkage long sys_move_pages(pid_t pid, unsigned long nr_pages, + const void __user * __user *pages, + const int __user *nodes, + int __user *status, + int flags); +asmlinkage long compat_sys_move_pages(pid_t pid, unsigned long nr_page, + __u32 __user *pages, + const int __user *nodes, + int __user *status, + int flags); asmlinkage long sys_mbind(unsigned long start, unsigned long len, unsigned long mode, unsigned long __user *nmask, diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index 5d5fc2d30..bd28e8ae0 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -55,7 +55,7 @@ enum CTL_KERN=1, /* General kernel info and control */ CTL_VM=2, /* VM management */ CTL_NET=3, /* Networking */ - CTL_PROC=4, /* Process info */ + /* was CTL_PROC */ CTL_FS=5, /* Filesystems */ CTL_DEBUG=6, /* Debugging */ CTL_DEV=7, /* Devices */ @@ -152,9 +152,12 @@ enum KERN_SPIN_RETRY=70, /* int: number of spinlock retries */ KERN_ACPI_VIDEO_FLAGS=71, /* int: flags for setting up video after ACPI sleep */ KERN_IA64_UNALIGNED=72, /* int: ia64 unaligned userland trap enable */ + KERN_COMPAT_LOG=73, /* int: print compat layer messages */ + KERN_MAX_LOCK_DEPTH=74, }; + /* CTL_VM names: */ enum { @@ -189,7 +192,10 @@ enum VM_DROP_PAGECACHE=29, /* int: nuke lots of pagecache */ VM_PERCPU_PAGELIST_FRACTION=30,/* int: fraction of pages in each percpu_pagelist */ VM_ZONE_RECLAIM_MODE=31, /* reclaim local zone memory before going off node */ - VM_ZONE_RECLAIM_INTERVAL=32, /* time period to wait after reclaim failure */ + VM_MIN_UNMAPPED=32, /* Set min percent of unmapped pages */ + VM_PANIC_ON_OOM=33, /* panic at out-of-memory */ + VM_VDSO_ENABLED=34, /* map VDSO into new processes? */ + VM_MIN_SLAB=35, /* Percent pages ignored by zone reclaim */ }; @@ -318,6 +324,7 @@ enum NET_NF_CONNTRACK_FRAG6_TIMEOUT=29, NET_NF_CONNTRACK_FRAG6_LOW_THRESH=30, NET_NF_CONNTRACK_FRAG6_HIGH_THRESH=31, + NET_NF_CONNTRACK_CHECKSUM=32, }; /* /proc/sys/net/ipv4 */ @@ -408,6 +415,8 @@ enum NET_TCP_MTU_PROBING=113, NET_TCP_BASE_MSS=114, NET_IPV4_TCP_WORKAROUND_SIGNED_WINDOWS=115, + NET_TCP_DMA_COPYBREAK=116, + NET_TCP_SLOW_START_AFTER_IDLE=117, #ifdef CONFIG_ICMP_IPOD NET_IPV4_ICMP_IPOD_VERSION, NET_IPV4_ICMP_IPOD_ENABLED, @@ -503,6 +512,7 @@ enum NET_IPV4_NF_CONNTRACK_SCTP_TIMEOUT_SHUTDOWN_RECD=25, NET_IPV4_NF_CONNTRACK_SCTP_TIMEOUT_SHUTDOWN_ACK_SENT=26, NET_IPV4_NF_CONNTRACK_COUNT=27, + NET_IPV4_NF_CONNTRACK_CHECKSUM=28, }; /* /proc/sys/net/ipv6 */ @@ -823,8 +833,6 @@ enum { NET_TUX_IGNORE_QUERY = 45, }; -/* CTL_PROC names: */ - /* CTL_FS names: */ enum { diff --git a/include/linux/sysdev.h b/include/linux/sysdev.h index 2a4b432e1..166a2e58c 100644 --- a/include/linux/sysdev.h +++ b/include/linux/sysdev.h @@ -37,11 +37,27 @@ struct sysdev_class { struct kset kset; }; +struct sysdev_class_attribute { + struct attribute attr; + ssize_t (*show)(struct sysdev_class *, char *); + ssize_t (*store)(struct sysdev_class *, const char *, size_t); +}; + +#define SYSDEV_CLASS_ATTR(_name,_mode,_show,_store) \ +struct sysdev_class_attribute attr_##_name = { \ + .attr = {.name = __stringify(_name), .mode = _mode }, \ + .show = _show, \ + .store = _store, \ +}; + extern int sysdev_class_register(struct sysdev_class *); extern void sysdev_class_unregister(struct sysdev_class *); - +extern int sysdev_class_create_file(struct sysdev_class *, + struct sysdev_class_attribute *); +extern void sysdev_class_remove_file(struct sysdev_class *, + struct sysdev_class_attribute *); /** * Auxillary system device drivers. */ diff --git a/include/linux/sysrq.h b/include/linux/sysrq.h index ea819b89c..4812ff605 100644 --- a/include/linux/sysrq.h +++ b/include/linux/sysrq.h @@ -11,7 +11,6 @@ * based upon discusions in irc://irc.openprojects.net/#kernelnewbies */ -#include struct pt_regs; struct tty_struct; diff --git a/include/linux/tcp.h b/include/linux/tcp.h index 542d39596..8ebf49790 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h @@ -159,8 +159,8 @@ struct tcp_info #ifdef __KERNEL__ -#include #include +#include #include #include #include @@ -233,6 +233,13 @@ struct tcp_sock { struct iovec *iov; int memory; int len; +#ifdef CONFIG_NET_DMA + /* members for async copy */ + struct dma_chan *dma_chan; + int wakeup; + struct dma_pinned_list *pinned_list; + dma_cookie_t dma_cookie; +#endif } ucopy; __u32 snd_wl1; /* Sequence for window update */ diff --git a/include/linux/threads.h b/include/linux/threads.h index e646bcdf2..38d1a5d65 100644 --- a/include/linux/threads.h +++ b/include/linux/threads.h @@ -1,7 +1,6 @@ #ifndef _LINUX_THREADS_H #define _LINUX_THREADS_H -#include /* * The default limit for the nr of threads is now in diff --git a/include/linux/time.h b/include/linux/time.h index 0cd696cee..a5b739967 100644 --- a/include/linux/time.h +++ b/include/linux/time.h @@ -28,10 +28,13 @@ struct timezone { #ifdef __KERNEL__ /* Parameters used to convert the timespec values: */ -#define MSEC_PER_SEC 1000L -#define USEC_PER_SEC 1000000L -#define NSEC_PER_SEC 1000000000L -#define NSEC_PER_USEC 1000L +#define MSEC_PER_SEC 1000L +#define USEC_PER_MSEC 1000L +#define NSEC_PER_USEC 1000L +#define NSEC_PER_MSEC 1000000L +#define USEC_PER_SEC 1000000L +#define NSEC_PER_SEC 1000000000L +#define FSEC_PER_SEC 1000000000000000L static inline int timespec_equal(struct timespec *a, struct timespec *b) { @@ -67,6 +70,18 @@ extern unsigned long mktime(const unsigned int year, const unsigned int mon, extern void set_normalized_timespec(struct timespec *ts, time_t sec, long nsec); +/* + * sub = lhs - rhs, in normalized form + */ +static inline struct timespec timespec_sub(struct timespec lhs, + struct timespec rhs) +{ + struct timespec ts_delta; + set_normalized_timespec(&ts_delta, lhs.tv_sec - rhs.tv_sec, + lhs.tv_nsec - rhs.tv_nsec); + return ts_delta; +} + /* * Returns true if the timespec is norm, false if denorm: */ @@ -77,6 +92,8 @@ extern struct timespec xtime; extern struct timespec wall_to_monotonic; extern seqlock_t xtime_lock; +void timekeeping_init(void); + static inline unsigned long get_seconds(void) { return xtime.tv_sec; @@ -100,6 +117,7 @@ extern int do_getitimer(int which, struct itimerval *value); extern void getnstimeofday(struct timespec *tv); extern struct timespec timespec_trunc(struct timespec t, unsigned gran); +extern int timekeeping_is_continuous(void); /** * timespec_to_ns - Convert timespec to nanoseconds @@ -142,6 +160,20 @@ extern struct timespec ns_to_timespec(const s64 nsec); */ extern struct timeval ns_to_timeval(const s64 nsec); +/** + * timespec_add_ns - Adds nanoseconds to a timespec + * @a: pointer to timespec to be incremented + * @ns: unsigned nanoseconds value to be added + */ +static inline void timespec_add_ns(struct timespec *a, u64 ns) +{ + ns += a->tv_nsec; + while(unlikely(ns >= NSEC_PER_SEC)) { + ns -= NSEC_PER_SEC; + a->tv_sec++; + } + a->tv_nsec = ns; +} #endif /* __KERNEL__ */ #define NFDBITS __NFDBITS diff --git a/include/linux/timer.h b/include/linux/timer.h index 0a485beba..c982304db 100644 --- a/include/linux/timer.h +++ b/include/linux/timer.h @@ -1,7 +1,6 @@ #ifndef _LINUX_TIMER_H #define _LINUX_TIMER_H -#include #include #include #include diff --git a/include/linux/timex.h b/include/linux/timex.h index 03914b7e4..d543d3871 100644 --- a/include/linux/timex.h +++ b/include/linux/timex.h @@ -53,12 +53,10 @@ #ifndef _LINUX_TIMEX_H #define _LINUX_TIMEX_H -#include #include #include #include -#include /* * SHIFT_KG and SHIFT_KF establish the damping of the PLL and are chosen @@ -192,6 +190,8 @@ struct timex { #define TIME_BAD TIME_ERROR /* bw compat */ #ifdef __KERNEL__ +#include + /* * kernel variables * Note: maximum error = NTP synch distance = dispersion + delay / 2; @@ -304,6 +304,8 @@ time_interpolator_reset(void) #endif /* !CONFIG_TIME_INTERPOLATION */ +#define TICK_LENGTH_SHIFT 32 + /* Returns how long ticks are at present, in ns / 2^(SHIFT_SCALE-10). */ extern u64 current_tick_length(void); diff --git a/include/linux/topology.h b/include/linux/topology.h index a305ae2e4..ec1eca852 100644 --- a/include/linux/topology.h +++ b/include/linux/topology.h @@ -134,7 +134,8 @@ .flags = SD_LOAD_BALANCE \ | SD_BALANCE_NEWIDLE \ | SD_BALANCE_EXEC \ - | SD_WAKE_AFFINE, \ + | SD_WAKE_AFFINE \ + | BALANCE_FOR_POWER, \ .last_balance = jiffies, \ .balance_interval = 1, \ .nr_balance_failed = 0, \ diff --git a/include/linux/tty.h b/include/linux/tty.h index f13f49afe..04827ca65 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h @@ -5,25 +5,13 @@ * 'tty.h' defines some structures used by tty_io.c and some defines. */ -/* - * These constants are also useful for user-level apps (e.g., VC - * resizing). - */ -#define MIN_NR_CONSOLES 1 /* must be at least 1 */ -#define MAX_NR_CONSOLES 63 /* serial lines start at 64 */ -#define MAX_NR_USER_CONSOLES 63 /* must be root to allocate above this */ - /* Note: the ioctl VT_GETSTATE does not work for - consoles 16 and higher (since it returns a short) */ - #ifdef __KERNEL__ -#include #include #include #include #include #include #include -#include #include #include @@ -58,7 +46,6 @@ struct tty_buffer { unsigned char *flag_buf_ptr; int used; int size; - int active; int commit; int read; /* Data points here */ @@ -72,6 +59,7 @@ struct tty_bufhead { struct tty_buffer *head; /* Queue head */ struct tty_buffer *tail; /* Active buffer */ struct tty_buffer *free; /* Free queue head */ + int memory_used; /* Buffer space used excluding free queue */ }; /* * The pty uses char_buf and flag_buf as a contiguous buffer @@ -260,7 +248,6 @@ struct tty_struct { #define TTY_DO_WRITE_WAKEUP 5 /* Call write_wakeup after queuing new */ #define TTY_PUSH 6 /* n_tty private */ #define TTY_CLOSING 7 /* ->close() in progress */ -#define TTY_DONT_FLIP 8 /* Defer buffer flip */ #define TTY_LDISC 9 /* Line discipline attached */ #define TTY_HW_COOK_OUT 14 /* Hardware can do output cooking */ #define TTY_HW_COOK_IN 15 /* Hardware can do input cooking */ @@ -273,7 +260,6 @@ struct tty_struct { extern void tty_write_flush(struct tty_struct *); extern struct termios tty_std_termios; -extern int fg_console, last_console, want_console; extern int kmsg_redirect; @@ -291,7 +277,9 @@ extern int tty_register_ldisc(int disc, struct tty_ldisc *new_ldisc); extern int tty_unregister_ldisc(int disc); extern int tty_register_driver(struct tty_driver *driver); extern int tty_unregister_driver(struct tty_driver *driver); -extern void tty_register_device(struct tty_driver *driver, unsigned index, struct device *dev); +extern struct class_device *tty_register_device(struct tty_driver *driver, + unsigned index, + struct device *dev); extern void tty_unregister_device(struct tty_driver *driver, unsigned index); extern int tty_read_raw_data(struct tty_struct *tty, unsigned char *bufp, int buflen); diff --git a/include/linux/tty_driver.h b/include/linux/tty_driver.h index b368b296d..58c961c9e 100644 --- a/include/linux/tty_driver.h +++ b/include/linux/tty_driver.h @@ -157,7 +157,6 @@ struct tty_driver { struct cdev cdev; struct module *owner; const char *driver_name; - const char *devfs_name; const char *name; int name_base; /* offset of printed name */ int major; /* major device number */ @@ -242,8 +241,15 @@ void tty_set_operations(struct tty_driver *driver, struct tty_operations *op); * is also a promise, if the above case is true, not to signal * overruns, either.) * - * TTY_DRIVER_NO_DEVFS --- if set, do not create devfs entries. This - * is only used by tty_register_driver(). + * TTY_DRIVER_DYNAMIC_DEV --- if set, the individual tty devices need + * to be registered with a call to tty_register_driver() when the + * device is found in the system and unregistered with a call to + * tty_unregister_device() so the devices will be show up + * properly in sysfs. If not set, driver->num entries will be + * created by the tty core in sysfs when tty_register_driver() is + * called. This is to be used by drivers that have tty devices + * that can appear and disappear while the main tty driver is + * registered with the tty core. * * TTY_DRIVER_DEVPTS_MEM -- don't use the standard arrays, instead * use dynamic memory keyed through the devpts filesystem. This @@ -252,7 +258,7 @@ void tty_set_operations(struct tty_driver *driver, struct tty_operations *op); #define TTY_DRIVER_INSTALLED 0x0001 #define TTY_DRIVER_RESET_TERMIOS 0x0002 #define TTY_DRIVER_REAL_RAW 0x0004 -#define TTY_DRIVER_NO_DEVFS 0x0008 +#define TTY_DRIVER_DYNAMIC_DEV 0x0008 #define TTY_DRIVER_DEVPTS_MEM 0x0010 /* tty driver types */ diff --git a/include/linux/tty_flip.h b/include/linux/tty_flip.h index 31548303e..eb677cf56 100644 --- a/include/linux/tty_flip.h +++ b/include/linux/tty_flip.h @@ -12,7 +12,7 @@ static inline int tty_insert_flip_char(struct tty_struct *tty, unsigned char ch, char flag) { struct tty_buffer *tb = tty->buf.tail; - if (tb && tb->active && tb->used < tb->size) { + if (tb && tb->used < tb->size) { tb->flag_buf_ptr[tb->used] = flag; tb->char_buf_ptr[tb->used++] = ch; return 1; diff --git a/include/linux/types.h b/include/linux/types.h index b6d865e8b..775ea6a11 100644 --- a/include/linux/types.h +++ b/include/linux/types.h @@ -2,7 +2,6 @@ #define _LINUX_TYPES_H #ifdef __KERNEL__ -#include #define BITS_TO_LONGS(bits) \ (((bits)+BITS_PER_LONG-1)/BITS_PER_LONG) @@ -180,8 +179,15 @@ typedef __u64 __bitwise __be64; #ifdef __KERNEL__ typedef unsigned __bitwise__ gfp_t; + +#ifdef CONFIG_RESOURCES_64BIT +typedef u64 resource_size_t; +#else +typedef u32 resource_size_t; #endif +#endif /* __KERNEL__ */ + struct ustat { __kernel_daddr_t f_tfree; __kernel_ino_t f_tinode; diff --git a/include/linux/udp.h b/include/linux/udp.h index 85a556588..90223f057 100644 --- a/include/linux/udp.h +++ b/include/linux/udp.h @@ -35,7 +35,6 @@ struct udphdr { #define UDP_ENCAP_ESPINUDP 2 /* draft-ietf-ipsec-udp-encaps-06 */ #ifdef __KERNEL__ -#include #include #include @@ -47,7 +46,7 @@ struct udp_sock { unsigned int corkflag; /* Cork is required */ __u16 encap_type; /* Is this an Encapsulation socket? */ /* - * Following member retains the infomation to create a UDP header + * Following member retains the information to create a UDP header * when the socket is uncorked. */ __u16 len; /* total length of pending frames */ diff --git a/include/linux/ufs_fs.h b/include/linux/ufs_fs.h index 843aeaaa7..aa6832b23 100644 --- a/include/linux/ufs_fs.h +++ b/include/linux/ufs_fs.h @@ -32,7 +32,6 @@ #include #include -#include #include #include @@ -221,6 +220,19 @@ typedef __u16 __bitwise __fs16; */ #define UFS_MINFREE 5 #define UFS_DEFAULTOPT UFS_OPTTIME + +/* + * Debug code + */ +#ifdef CONFIG_UFS_DEBUG +# define UFSD(f, a...) { \ + printk ("UFSD (%s, %d): %s:", \ + __FILE__, __LINE__, __FUNCTION__); \ + printk (f, ## a); \ + } +#else +# define UFSD(f, a...) /**/ +#endif /* * Turn file system block numbers into disk block addresses. @@ -339,8 +351,23 @@ struct ufs2_csum_total { __fs64 cs_spare[3]; /* future expansion */ }; +/* + * File system flags + */ +#define UFS_UNCLEAN 0x01 /* file system not clean at mount (unused) */ +#define UFS_DOSOFTDEP 0x02 /* file system using soft dependencies */ +#define UFS_NEEDSFSCK 0x04 /* needs sync fsck (FreeBSD compat, unused) */ +#define UFS_INDEXDIRS 0x08 /* kernel supports indexed directories */ +#define UFS_ACLS 0x10 /* file system has ACLs enabled */ +#define UFS_MULTILABEL 0x20 /* file system is MAC multi-label */ +#define UFS_FLAGS_UPDATED 0x80 /* flags have been moved to new location */ + +#if 0 /* * This is the actual superblock, as it is laid out on the disk. + * Do NOT use this structure, because of sizeof(ufs_super_block) > 512 and + * it may occupy several blocks, use + * struct ufs_super_block_(first,second,third) instead. */ struct ufs_super_block { __fs32 fs_link; /* UNUSED */ @@ -417,7 +444,7 @@ struct ufs_super_block { __s8 fs_fmod; /* super block modified flag */ __s8 fs_clean; /* file system is clean flag */ __s8 fs_ronly; /* mounted read-only flag */ - __s8 fs_flags; /* currently unused flag */ + __s8 fs_flags; union { struct { __s8 fs_fsmnt[UFS_MAXMNTLEN];/* name mounted on */ @@ -486,6 +513,7 @@ struct ufs_super_block { __fs32 fs_magic; /* magic number */ __u8 fs_space[1]; /* list of blocks for each rotation */ }; +#endif/*struct ufs_super_block*/ /* * Preference for optimization. @@ -667,7 +695,7 @@ struct ufs_buffer_head { }; struct ufs_cg_private_info { - struct ufs_cylinder_group ucg; + struct ufs_buffer_head c_ubh; __u32 c_cgx; /* number of cylidner group */ __u16 c_ncyl; /* number of cyl's this cg */ __u16 c_niblk; /* number of inode blocks this cg */ @@ -687,6 +715,7 @@ struct ufs_cg_private_info { struct ufs_sb_private_info { struct ufs_buffer_head s_ubh; /* buffer containing super block */ + struct ufs2_csum_total cs_total; __u32 s_sblkno; /* offset of super-blocks in filesys */ __u32 s_cblkno; /* offset of cg-block in filesys */ __u32 s_iblkno; /* offset of inode-blocks in filesys */ @@ -825,16 +854,54 @@ struct ufs_super_block_first { }; struct ufs_super_block_second { - __s8 fs_fsmnt[212]; - __fs32 fs_cgrotor; - __fs32 fs_csp[UFS_MAXCSBUFS]; - __fs32 fs_maxcluster; - __fs32 fs_cpc; - __fs16 fs_opostbl[82]; -}; + union { + struct { + __s8 fs_fsmnt[212]; + __fs32 fs_cgrotor; + __fs32 fs_csp[UFS_MAXCSBUFS]; + __fs32 fs_maxcluster; + __fs32 fs_cpc; + __fs16 fs_opostbl[82]; + } fs_u1; + struct { + __s8 fs_fsmnt[UFS2_MAXMNTLEN - UFS_MAXMNTLEN + 212]; + __u8 fs_volname[UFS2_MAXVOLLEN]; + __fs64 fs_swuid; + __fs32 fs_pad; + __fs32 fs_cgrotor; + __fs32 fs_ocsp[UFS2_NOCSPTRS]; + __fs32 fs_contigdirs; + __fs32 fs_csp; + __fs32 fs_maxcluster; + __fs32 fs_active; + __fs32 fs_old_cpc; + __fs32 fs_maxbsize; + __fs64 fs_sparecon64[17]; + __fs64 fs_sblockloc; + __fs64 cs_ndir; + __fs64 cs_nbfree; + } fs_u2; + } fs_un; +}; struct ufs_super_block_third { - __fs16 fs_opostbl[46]; + union { + struct { + __fs16 fs_opostbl[46]; + } fs_u1; + struct { + __fs64 cs_nifree; /* number of free inodes */ + __fs64 cs_nffree; /* number of free frags */ + __fs64 cs_numclusters; /* number of free clusters */ + __fs64 cs_spare[3]; /* future expansion */ + struct ufs_timeval fs_time; /* last time written */ + __fs64 fs_size; /* number of blocks in fs */ + __fs64 fs_dsize; /* number of data blocks in fs */ + __fs64 fs_csaddr; /* blk addr of cyl grp summary area */ + __fs64 fs_pendingblocks;/* blocks in process of being freed */ + __fs32 fs_pendinginodes;/*inodes in process of being freed */ + } __attribute__ ((packed)) fs_u2; + } fs_un1; union { struct { __fs32 fs_sparecon[53];/* reserved for future constants */ @@ -862,7 +929,7 @@ struct ufs_super_block_third { __fs32 fs_qfmask[2]; /* ~usb_fmask */ __fs32 fs_state; /* file system state time stamp */ } fs_44; - } fs_u2; + } fs_un2; __fs32 fs_postblformat; __fs32 fs_nrpos; __fs32 fs_postbloff; @@ -876,7 +943,8 @@ struct ufs_super_block_third { /* balloc.c */ extern void ufs_free_fragments (struct inode *, unsigned, unsigned); extern void ufs_free_blocks (struct inode *, unsigned, unsigned); -extern unsigned ufs_new_fragments (struct inode *, __fs32 *, unsigned, unsigned, unsigned, int *); +extern unsigned ufs_new_fragments(struct inode *, __fs32 *, unsigned, unsigned, + unsigned, int *, struct page *); /* cylinder.c */ extern struct ufs_cg_private_info * ufs_load_cylinder (struct super_block *, unsigned); @@ -887,30 +955,29 @@ extern struct inode_operations ufs_dir_inode_operations; extern int ufs_add_link (struct dentry *, struct inode *); extern ino_t ufs_inode_by_name(struct inode *, struct dentry *); extern int ufs_make_empty(struct inode *, struct inode *); -extern struct ufs_dir_entry * ufs_find_entry (struct dentry *, struct buffer_head **); -extern int ufs_delete_entry (struct inode *, struct ufs_dir_entry *, struct buffer_head *); +extern struct ufs_dir_entry *ufs_find_entry(struct inode *, struct dentry *, struct page **); +extern int ufs_delete_entry(struct inode *, struct ufs_dir_entry *, struct page *); extern int ufs_empty_dir (struct inode *); -extern struct ufs_dir_entry * ufs_dotdot (struct inode *, struct buffer_head **); -extern void ufs_set_link(struct inode *, struct ufs_dir_entry *, struct buffer_head *, struct inode *); +extern struct ufs_dir_entry *ufs_dotdot(struct inode *, struct page **); +extern void ufs_set_link(struct inode *dir, struct ufs_dir_entry *de, + struct page *page, struct inode *inode); /* file.c */ extern struct inode_operations ufs_file_inode_operations; extern const struct file_operations ufs_file_operations; -extern struct address_space_operations ufs_aops; +extern const struct address_space_operations ufs_aops; /* ialloc.c */ extern void ufs_free_inode (struct inode *inode); extern struct inode * ufs_new_inode (struct inode *, int); /* inode.c */ -extern u64 ufs_frag_map (struct inode *, sector_t); extern void ufs_read_inode (struct inode *); extern void ufs_put_inode (struct inode *); extern int ufs_write_inode (struct inode *, int); extern int ufs_sync_inode (struct inode *); extern void ufs_delete_inode (struct inode *); -extern struct buffer_head * ufs_getfrag (struct inode *, unsigned, int, int *); extern struct buffer_head * ufs_bread (struct inode *, unsigned, int, int *); extern int ufs_getfrag_block (struct inode *inode, sector_t fragment, struct buffer_head *bh_result, int create); @@ -926,7 +993,7 @@ extern void ufs_panic (struct super_block *, const char *, const char *, ...) __ extern struct inode_operations ufs_fast_symlink_inode_operations; /* truncate.c */ -extern void ufs_truncate (struct inode *); +extern int ufs_truncate (struct inode *, loff_t); static inline struct ufs_sb_info *UFS_SB(struct super_block *sb) { diff --git a/include/linux/ufs_fs_i.h b/include/linux/ufs_fs_i.h index 21665a953..f50ce3b0c 100644 --- a/include/linux/ufs_fs_i.h +++ b/include/linux/ufs_fs_i.h @@ -27,6 +27,7 @@ struct ufs_inode_info { __u32 i_oeftflag; __u16 i_osync; __u32 i_lastfrag; + __u32 i_dir_start_lookup; struct inode vfs_inode; }; diff --git a/include/linux/unistd.h b/include/linux/unistd.h index 10ed9834b..c18c60f32 100644 --- a/include/linux/unistd.h +++ b/include/linux/unistd.h @@ -1,7 +1,9 @@ #ifndef _LINUX_UNISTD_H_ #define _LINUX_UNISTD_H_ +#ifdef __KERNEL__ extern int errno; +#endif /* * Include machine specific syscallX macros diff --git a/include/linux/usb.h b/include/linux/usb.h index e34e5e3dc..d2bd0c8e0 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -10,7 +10,6 @@ #ifdef __KERNEL__ -#include #include /* for -ENODEV */ #include /* for mdelay() */ #include /* for in_interrupt() */ @@ -41,13 +40,15 @@ struct usb_driver; * Devices may also have class-specific or vendor-specific descriptors. */ +struct ep_device; + /** * struct usb_host_endpoint - host-side endpoint descriptor and queue * @desc: descriptor for this endpoint, wMaxPacketSize in native byteorder * @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 + * @ep_dev: ep_device for sysfs info * @extra: descriptors following this endpoint in the configuration * @extralen: how many bytes of "extra" are valid * @@ -58,7 +59,7 @@ struct usb_host_endpoint { struct usb_endpoint_descriptor desc; struct list_head urb_list; void *hcpriv; - struct kobject *kobj; /* For sysfs info */ + struct ep_device *ep_dev; /* For sysfs info */ unsigned char *extra; /* Extra descriptors */ int extralen; @@ -387,6 +388,8 @@ extern int usb_lock_device_for_reset(struct usb_device *udev, /* USB port reset for device reinitialization */ extern int usb_reset_device(struct usb_device *dev); +extern int usb_reset_composite_device(struct usb_device *dev, + struct usb_interface *iface); extern struct usb_device *usb_find_device(u16 vendor_id, u16 product_id); @@ -555,6 +558,10 @@ struct usb_dynids { * do (or don't) show up otherwise in the filesystem. * @suspend: Called when the device is going to be suspended by the system. * @resume: Called when the device is being resumed by the system. + * @pre_reset: Called by usb_reset_composite_device() when the device + * is about to be reset. + * @post_reset: Called by usb_reset_composite_device() after the device + * has been reset. * @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. @@ -593,6 +600,9 @@ struct usb_driver { int (*suspend) (struct usb_interface *intf, pm_message_t message); int (*resume) (struct usb_interface *intf); + void (*pre_reset) (struct usb_interface *intf); + void (*post_reset) (struct usb_interface *intf); + const struct usb_device_id *id_table; struct usb_dynids dynids; @@ -1009,6 +1019,8 @@ void usb_buffer_unmap_sg (struct usb_device *dev, unsigned pipe, extern int usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request, __u8 requesttype, __u16 value, __u16 index, void *data, __u16 size, int timeout); +extern int usb_interrupt_msg(struct usb_device *usb_dev, unsigned int pipe, + void *data, int len, int *actual_length, int timeout); extern int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, void *data, int len, int *actual_length, int timeout); diff --git a/include/linux/usb_cdc.h b/include/linux/usb_cdc.h deleted file mode 100644 index f22d6beec..000000000 --- a/include/linux/usb_cdc.h +++ /dev/null @@ -1,192 +0,0 @@ -/* - * USB Communications Device Class (CDC) definitions - * - * CDC says how to talk to lots of different types of network adapters, - * notably ethernet adapters and various modems. It's used mostly with - * firmware based USB peripherals. - */ - -#define USB_CDC_SUBCLASS_ACM 0x02 -#define USB_CDC_SUBCLASS_ETHERNET 0x06 -#define USB_CDC_SUBCLASS_WHCM 0x08 -#define USB_CDC_SUBCLASS_DMM 0x09 -#define USB_CDC_SUBCLASS_MDLM 0x0a -#define USB_CDC_SUBCLASS_OBEX 0x0b - -#define USB_CDC_PROTO_NONE 0 - -#define USB_CDC_ACM_PROTO_AT_V25TER 1 -#define USB_CDC_ACM_PROTO_AT_PCCA101 2 -#define USB_CDC_ACM_PROTO_AT_PCCA101_WAKE 3 -#define USB_CDC_ACM_PROTO_AT_GSM 4 -#define USB_CDC_ACM_PROTO_AT_3G 5 -#define USB_CDC_ACM_PROTO_AT_CDMA 6 -#define USB_CDC_ACM_PROTO_VENDOR 0xff - -/*-------------------------------------------------------------------------*/ - -/* - * Class-Specific descriptors ... there are a couple dozen of them - */ - -#define USB_CDC_HEADER_TYPE 0x00 /* header_desc */ -#define USB_CDC_CALL_MANAGEMENT_TYPE 0x01 /* call_mgmt_descriptor */ -#define USB_CDC_ACM_TYPE 0x02 /* acm_descriptor */ -#define USB_CDC_UNION_TYPE 0x06 /* union_desc */ -#define USB_CDC_COUNTRY_TYPE 0x07 -#define USB_CDC_ETHERNET_TYPE 0x0f /* ether_desc */ -#define USB_CDC_WHCM_TYPE 0x11 -#define USB_CDC_MDLM_TYPE 0x12 /* mdlm_desc */ -#define USB_CDC_MDLM_DETAIL_TYPE 0x13 /* mdlm_detail_desc */ -#define USB_CDC_DMM_TYPE 0x14 -#define USB_CDC_OBEX_TYPE 0x15 - -/* "Header Functional Descriptor" from CDC spec 5.2.3.1 */ -struct usb_cdc_header_desc { - __u8 bLength; - __u8 bDescriptorType; - __u8 bDescriptorSubType; - - __le16 bcdCDC; -} __attribute__ ((packed)); - -/* "Call Management Descriptor" from CDC spec 5.2.3.2 */ -struct usb_cdc_call_mgmt_descriptor { - __u8 bLength; - __u8 bDescriptorType; - __u8 bDescriptorSubType; - - __u8 bmCapabilities; -#define USB_CDC_CALL_MGMT_CAP_CALL_MGMT 0x01 -#define USB_CDC_CALL_MGMT_CAP_DATA_INTF 0x02 - - __u8 bDataInterface; -} __attribute__ ((packed)); - -/* "Abstract Control Management Descriptor" from CDC spec 5.2.3.3 */ -struct usb_cdc_acm_descriptor { - __u8 bLength; - __u8 bDescriptorType; - __u8 bDescriptorSubType; - - __u8 bmCapabilities; -} __attribute__ ((packed)); - -/* "Union Functional Descriptor" from CDC spec 5.2.3.8 */ -struct usb_cdc_union_desc { - __u8 bLength; - __u8 bDescriptorType; - __u8 bDescriptorSubType; - - __u8 bMasterInterface0; - __u8 bSlaveInterface0; - /* ... and there could be other slave interfaces */ -} __attribute__ ((packed)); - -/* "Ethernet Networking Functional Descriptor" from CDC spec 5.2.3.16 */ -struct usb_cdc_ether_desc { - __u8 bLength; - __u8 bDescriptorType; - __u8 bDescriptorSubType; - - __u8 iMACAddress; - __le32 bmEthernetStatistics; - __le16 wMaxSegmentSize; - __le16 wNumberMCFilters; - __u8 bNumberPowerFilters; -} __attribute__ ((packed)); - -/* "MDLM Functional Descriptor" from CDC WMC spec 6.7.2.3 */ -struct usb_cdc_mdlm_desc { - __u8 bLength; - __u8 bDescriptorType; - __u8 bDescriptorSubType; - - __le16 bcdVersion; - __u8 bGUID[16]; -} __attribute__ ((packed)); - -/* "MDLM Detail Functional Descriptor" from CDC WMC spec 6.7.2.4 */ -struct usb_cdc_mdlm_detail_desc { - __u8 bLength; - __u8 bDescriptorType; - __u8 bDescriptorSubType; - - /* type is associated with mdlm_desc.bGUID */ - __u8 bGuidDescriptorType; - __u8 bDetailData[0]; -} __attribute__ ((packed)); - -/*-------------------------------------------------------------------------*/ - -/* - * Class-Specific Control Requests (6.2) - * - * section 3.6.2.1 table 4 has the ACM profile, for modems. - * section 3.8.2 table 10 has the ethernet profile. - * - * Microsoft's RNDIS stack for Ethernet is a vendor-specific CDC ACM variant, - * heavily dependent on the encapsulated (proprietary) command mechanism. - */ - -#define USB_CDC_SEND_ENCAPSULATED_COMMAND 0x00 -#define USB_CDC_GET_ENCAPSULATED_RESPONSE 0x01 -#define USB_CDC_REQ_SET_LINE_CODING 0x20 -#define USB_CDC_REQ_GET_LINE_CODING 0x21 -#define USB_CDC_REQ_SET_CONTROL_LINE_STATE 0x22 -#define USB_CDC_REQ_SEND_BREAK 0x23 -#define USB_CDC_SET_ETHERNET_MULTICAST_FILTERS 0x40 -#define USB_CDC_SET_ETHERNET_PM_PATTERN_FILTER 0x41 -#define USB_CDC_GET_ETHERNET_PM_PATTERN_FILTER 0x42 -#define USB_CDC_SET_ETHERNET_PACKET_FILTER 0x43 -#define USB_CDC_GET_ETHERNET_STATISTIC 0x44 - -/* Line Coding Structure from CDC spec 6.2.13 */ -struct usb_cdc_line_coding { - __le32 dwDTERate; - __u8 bCharFormat; -#define USB_CDC_1_STOP_BITS 0 -#define USB_CDC_1_5_STOP_BITS 1 -#define USB_CDC_2_STOP_BITS 2 - - __u8 bParityType; -#define USB_CDC_NO_PARITY 0 -#define USB_CDC_ODD_PARITY 1 -#define USB_CDC_EVEN_PARITY 2 -#define USB_CDC_MARK_PARITY 3 -#define USB_CDC_SPACE_PARITY 4 - - __u8 bDataBits; -} __attribute__ ((packed)); - -/* table 62; bits in multicast filter */ -#define USB_CDC_PACKET_TYPE_PROMISCUOUS (1 << 0) -#define USB_CDC_PACKET_TYPE_ALL_MULTICAST (1 << 1) /* no filter */ -#define USB_CDC_PACKET_TYPE_DIRECTED (1 << 2) -#define USB_CDC_PACKET_TYPE_BROADCAST (1 << 3) -#define USB_CDC_PACKET_TYPE_MULTICAST (1 << 4) /* filtered */ - - -/*-------------------------------------------------------------------------*/ - -/* - * Class-Specific Notifications (6.3) sent by interrupt transfers - * - * section 3.8.2 table 11 of the CDC spec lists Ethernet notifications - * section 3.6.2.1 table 5 specifies ACM notifications, accepted by RNDIS - * RNDIS also defines its own bit-incompatible notifications - */ - -#define USB_CDC_NOTIFY_NETWORK_CONNECTION 0x00 -#define USB_CDC_NOTIFY_RESPONSE_AVAILABLE 0x01 -#define USB_CDC_NOTIFY_SERIAL_STATE 0x20 -#define USB_CDC_NOTIFY_SPEED_CHANGE 0x2a - -struct usb_cdc_notification { - __u8 bmRequestType; - __u8 bNotificationType; - __le16 wValue; - __le16 wIndex; - __le16 wLength; -} __attribute__ ((packed)); - diff --git a/include/linux/usb_ch9.h b/include/linux/usb_ch9.h index a2aacfc7a..c720d107f 100644 --- a/include/linux/usb_ch9.h +++ b/include/linux/usb_ch9.h @@ -51,6 +51,9 @@ #define USB_RECIP_INTERFACE 0x01 #define USB_RECIP_ENDPOINT 0x02 #define USB_RECIP_OTHER 0x03 +/* From Wireless USB 1.0 */ +#define USB_RECIP_PORT 0x04 +#define USB_RECIP_RPIPE 0x05 /* * Standard requests, for the bRequest field of a SETUP packet. @@ -73,7 +76,9 @@ #define USB_REQ_SET_ENCRYPTION 0x0D /* Wireless USB */ #define USB_REQ_GET_ENCRYPTION 0x0E +#define USB_REQ_RPIPE_ABORT 0x0E #define USB_REQ_SET_HANDSHAKE 0x0F +#define USB_REQ_RPIPE_RESET 0x0F #define USB_REQ_GET_HANDSHAKE 0x10 #define USB_REQ_SET_CONNECTION 0x11 #define USB_REQ_SET_SECURITY_DATA 0x12 @@ -159,6 +164,8 @@ struct usb_ctrlrequest { #define USB_DT_BOS 0x0f #define USB_DT_DEVICE_CAPABILITY 0x10 #define USB_DT_WIRELESS_ENDPOINT_COMP 0x11 +#define USB_DT_WIRE_ADAPTER 0x21 +#define USB_DT_RPIPE 0x22 /* conventional codes for class-specific descriptors */ #define USB_DT_CS_DEVICE 0x21 diff --git a/include/linux/usb_gadget.h b/include/linux/usb_gadget.h index 1d78870ed..e17186dbc 100644 --- a/include/linux/usb_gadget.h +++ b/include/linux/usb_gadget.h @@ -872,9 +872,9 @@ int usb_gadget_config_buf(const struct usb_config_descriptor *config, /* utility wrapping a simple endpoint selection policy */ extern struct usb_ep *usb_ep_autoconfig (struct usb_gadget *, - struct usb_endpoint_descriptor *) __init; + struct usb_endpoint_descriptor *) __devinit; -extern void usb_ep_autoconfig_reset (struct usb_gadget *) __init; +extern void usb_ep_autoconfig_reset (struct usb_gadget *) __devinit; #endif /* __KERNEL__ */ diff --git a/include/linux/usb_input.h b/include/linux/usb_input.h deleted file mode 100644 index 716e0cc16..000000000 --- a/include/linux/usb_input.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef __USB_INPUT_H -#define __USB_INPUT_H - -/* - * Copyright (C) 2005 Dmitry Torokhov - * - * 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 -#include -#include - -static inline void -usb_to_input_id(const struct usb_device *dev, struct input_id *id) -{ - id->bustype = BUS_USB; - id->vendor = le16_to_cpu(dev->descriptor.idVendor); - id->product = le16_to_cpu(dev->descriptor.idProduct); - id->version = le16_to_cpu(dev->descriptor.bcdDevice); -} - -#endif diff --git a/include/linux/usb_isp116x.h b/include/linux/usb_isp116x.h deleted file mode 100644 index 436dd8a2b..000000000 --- a/include/linux/usb_isp116x.h +++ /dev/null @@ -1,29 +0,0 @@ - -/* - * Board initialization code should put one of these into dev->platform_data - * and place the isp116x onto platform_bus. - */ - -struct isp116x_platform_data { - /* Enable internal resistors on downstream ports */ - unsigned sel15Kres:1; - /* On-chip overcurrent detection */ - unsigned oc_enable:1; - /* INT output polarity */ - unsigned int_act_high:1; - /* INT edge or level triggered */ - unsigned int_edge_triggered:1; - /* Enable wakeup by devices on usb bus (e.g. wakeup - by attachment/detachment or by device activity - such as moving a mouse). When chosen, this option - prevents stopping internal clock, increasing - thereby power consumption in suspended state. */ - unsigned remote_wakeup_enable:1; - /* Inter-io delay (ns). The chip is picky about access timings; it - expects at least: - 150ns delay between consecutive accesses to DATA_REG, - 300ns delay between access to ADDR_REG and DATA_REG - OE, WE MUST NOT be changed during these intervals - */ - void (*delay) (struct device * dev, int delay); -}; diff --git a/include/linux/usb_sl811.h b/include/linux/usb_sl811.h deleted file mode 100644 index 4f2d012d7..000000000 --- a/include/linux/usb_sl811.h +++ /dev/null @@ -1,26 +0,0 @@ - -/* - * board initialization should put one of these into dev->platform_data - * and place the sl811hs onto platform_bus named "sl811-hcd". - */ - -struct sl811_platform_data { - unsigned can_wakeup:1; - - /* given port_power, msec/2 after power on till power good */ - u8 potpg; - - /* mA/2 power supplied on this port (max = default = 250) */ - u8 power; - - /* sl811 relies on an external source of VBUS current */ - void (*port_power)(struct device *dev, int is_on); - - /* pulse sl811 nRST (probably with a GPIO) */ - void (*reset)(struct device *dev); - - // some boards need something like these: - // int (*check_overcurrent)(struct device *dev); - // void (*clock_enable)(struct device *dev, int is_on); -}; - diff --git a/include/linux/usb_usual.h b/include/linux/usb_usual.h index b2d08984a..e7fc5fed5 100644 --- a/include/linux/usb_usual.h +++ b/include/linux/usb_usual.h @@ -9,7 +9,6 @@ #ifndef __LINUX_USB_USUAL_H #define __LINUX_USB_USUAL_H -#include /* We should do this for cleanliness... But other usb_foo.h do not do this. */ /* #include */ @@ -44,6 +43,10 @@ /* Need delay after Command phase */ \ US_FLAG(NO_WP_DETECT, 0x00000200) \ /* Don't check for write-protect */ \ + US_FLAG(MAX_SECTORS_64, 0x00000400) \ + /* Sets max_sectors to 64 */ \ + US_FLAG(IGNORE_DEVICE, 0x00000800) \ + /* Don't claim device */ #define US_FLAG(name, value) US_FL_##name = value , enum { US_DO_ALL_FLAGS }; diff --git a/include/linux/usbdevice_fs.h b/include/linux/usbdevice_fs.h index 8859f0b41..7b7aadb69 100644 --- a/include/linux/usbdevice_fs.h +++ b/include/linux/usbdevice_fs.h @@ -123,6 +123,7 @@ struct usbdevfs_hub_portinfo { char port [127]; /* e.g. port 3 connects to device 27 */ }; +#ifdef __KERNEL__ #ifdef CONFIG_COMPAT #include struct usbdevfs_urb32 { @@ -147,6 +148,7 @@ struct usbdevfs_ioctl32 { compat_caddr_t data; }; #endif +#endif /* __KERNEL__ */ #define USBDEVFS_CONTROL _IOWR('U', 0, struct usbdevfs_ctrltransfer) #define USBDEVFS_BULK _IOWR('U', 2, struct usbdevfs_bulktransfer) diff --git a/include/linux/vermagic.h b/include/linux/vermagic.h index dc7c621e4..46919f9f5 100644 --- a/include/linux/vermagic.h +++ b/include/linux/vermagic.h @@ -1,4 +1,4 @@ -#include +#include #include /* Simply sanity version stamp for modules. */ diff --git a/include/linux/videodev.h b/include/linux/videodev.h index 91140091c..8dba97a29 100644 --- a/include/linux/videodev.h +++ b/include/linux/videodev.h @@ -1,48 +1,20 @@ +/* + * Video for Linux version 1 - OBSOLETE + * + * Header file for v4l1 drivers and applications, for + * Linux kernels 2.2.x or 2.4.x. + * + * Provides header for legacy drivers and applications + * + * See http://linuxtv.org for more info + * + */ #ifndef __LINUX_VIDEODEV_H #define __LINUX_VIDEODEV_H -#include - -#define HAVE_V4L1 1 - #include -#ifdef __KERNEL__ - -#include - -extern struct video_device* video_devdata(struct file*); - -#define to_video_device(cd) container_of(cd, struct video_device, class_dev) -static inline void -video_device_create_file(struct video_device *vfd, - struct class_device_attribute *attr) -{ - class_device_create_file(&vfd->class_dev, attr); -} -static inline void -video_device_remove_file(struct video_device *vfd, - struct class_device_attribute *attr) -{ - class_device_remove_file(&vfd->class_dev, attr); -} - -#if OBSOLETE_OWNER /* to be removed in 2.6.15 */ -/* helper functions to access driver private data. */ -static inline void *video_get_drvdata(struct video_device *dev) -{ - return dev->priv; -} - -static inline void video_set_drvdata(struct video_device *dev, void *data) -{ - dev->priv = data; -} -#endif - -extern int video_exclusive_open(struct inode *inode, struct file *file); -extern int video_exclusive_release(struct inode *inode, struct file *file); -#endif /* __KERNEL__ */ +#if defined(CONFIG_VIDEO_V4L1_COMPAT) || !defined (__KERNEL__) struct video_capability { @@ -363,6 +335,9 @@ struct video_code #define VID_HARDWARE_SAA7114H 37 #define VID_HARDWARE_SN9C102 38 #define VID_HARDWARE_ARV 39 + +#endif /* CONFIG_VIDEO_V4L1_COMPAT */ + #endif /* __LINUX_VIDEODEV_H */ /* diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index ad7fa9c86..e3715d774 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h @@ -1,35 +1,31 @@ -#ifndef __LINUX_VIDEODEV2_H -#define __LINUX_VIDEODEV2_H /* * Video for Linux Two * - * Header file for v4l or V4L2 drivers and applications, for - * Linux kernels 2.2.x or 2.4.x. + * Header file for v4l or V4L2 drivers and applications + * with public API. + * All kernel-specific stuff were moved to media/v4l2-dev.h, so + * no #if __KERNEL tests are allowed here * - * See http://bytesex.org/v4l/ for API specs and other - * v4l2 documentation. + * See http://linuxtv.org for more info * * Author: Bill Dirks * Justin Schoeman * et al. */ +#ifndef __LINUX_VIDEODEV2_H +#define __LINUX_VIDEODEV2_H #ifdef __KERNEL__ -#include /* need struct timeval */ -#include -#include -#include -#endif +#include /* need struct timeval */ #include /* need __user */ - - -#define OBSOLETE_OWNER 1 /* It will be removed for 2.6.17 */ -#define HAVE_V4L2 1 +#else +#define __user +#endif +#include /* * Common stuff for both V4L1 and V4L2 * Moved from videodev.h */ - #define VIDEO_MAX_FRAME 32 #define VID_TYPE_CAPTURE 1 /* Can capture */ @@ -47,71 +43,6 @@ #define VID_TYPE_MJPEG_DECODER 4096 /* Can decode MJPEG streams */ #define VID_TYPE_MJPEG_ENCODER 8192 /* Can encode MJPEG streams */ -#ifdef __KERNEL__ - -/* Minor device allocation */ -#define MINOR_VFL_TYPE_GRABBER_MIN 0 -#define MINOR_VFL_TYPE_GRABBER_MAX 63 -#define MINOR_VFL_TYPE_RADIO_MIN 64 -#define MINOR_VFL_TYPE_RADIO_MAX 127 -#define MINOR_VFL_TYPE_VTX_MIN 192 -#define MINOR_VFL_TYPE_VTX_MAX 223 -#define MINOR_VFL_TYPE_VBI_MIN 224 -#define MINOR_VFL_TYPE_VBI_MAX 255 - -#define VFL_TYPE_GRABBER 0 -#define VFL_TYPE_VBI 1 -#define VFL_TYPE_RADIO 2 -#define VFL_TYPE_VTX 3 - -struct video_device -{ - /* device info */ - struct device *dev; - char name[32]; - int type; /* v4l1 */ - int type2; /* v4l2 */ - int hardware; - int minor; - - /* device ops + callbacks */ - const struct file_operations *fops; - void (*release)(struct video_device *vfd); - - -#if OBSOLETE_OWNER /* to be removed in 2.6.15 */ - /* obsolete -- fops->owner is used instead */ - struct module *owner; - /* dev->driver_data will be used instead some day. - * Use the video_{get|set}_drvdata() helper functions, - * so the switch over will be transparent for you. - * Or use {pci|usb}_{get|set}_drvdata() directly. */ - void *priv; -#endif - - /* for videodev.c intenal usage -- please don't touch */ - int users; /* video_exclusive_{open|close} ... */ - struct mutex lock; /* ... helper function uses these */ - char devfs_name[64]; /* devfs */ - struct class_device class_dev; /* sysfs */ -}; - -#define VIDEO_MAJOR 81 - -extern int video_register_device(struct video_device *, int type, int nr); -extern void video_unregister_device(struct video_device *); -extern int video_usercopy(struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg, - int (*func)(struct inode *inode, struct file *file, - unsigned int cmd, void *arg)); - -/* helper functions to alloc / release struct video_device, the - later can be used for video_device->release() */ -struct video_device *video_device_alloc(void); -void video_device_release(struct video_device *vfd); - -#endif - /* * M I S C E L L A N E O U S */ @@ -172,6 +103,8 @@ enum v4l2_ctrl_type { V4L2_CTRL_TYPE_BOOLEAN = 2, V4L2_CTRL_TYPE_MENU = 3, V4L2_CTRL_TYPE_BUTTON = 4, + V4L2_CTRL_TYPE_INTEGER64 = 5, + V4L2_CTRL_TYPE_CTRL_CLASS = 6, }; enum v4l2_tuner_type { @@ -270,7 +203,6 @@ struct v4l2_capability /* * V I D E O I M A G E F O R M A T */ - struct v4l2_pix_format { __u32 width; @@ -283,7 +215,7 @@ struct v4l2_pix_format __u32 priv; /* private data, depends on pixelformat */ }; -/* Pixel format FOURCC depth Description */ +/* Pixel format FOURCC depth Description */ #define V4L2_PIX_FMT_RGB332 v4l2_fourcc('R','G','B','1') /* 8 RGB-3-3-2 */ #define V4L2_PIX_FMT_RGB555 v4l2_fourcc('R','G','B','O') /* 16 RGB-5-5-5 */ #define V4L2_PIX_FMT_RGB565 v4l2_fourcc('R','G','B','P') /* 16 RGB-5-6-5 */ @@ -311,6 +243,7 @@ struct v4l2_pix_format #define V4L2_PIX_FMT_YUV420 v4l2_fourcc('Y','U','1','2') /* 12 YUV 4:2:0 */ #define V4L2_PIX_FMT_YYUV v4l2_fourcc('Y','Y','U','V') /* 16 YUV 4:2:2 */ #define V4L2_PIX_FMT_HI240 v4l2_fourcc('H','I','2','4') /* 8 8-bit color */ +#define V4L2_PIX_FMT_HM12 v4l2_fourcc('H','M','1','2') /* 8 YUV 4:1:1 16x16 macroblocks */ /* see http://www.siliconimaging.com/RGB%20Bayer.htm */ #define V4L2_PIX_FMT_SBGGR8 v4l2_fourcc('B','A','8','1') /* 8 BGBG.. GRGR.. */ @@ -319,7 +252,7 @@ struct v4l2_pix_format #define V4L2_PIX_FMT_MJPEG v4l2_fourcc('M','J','P','G') /* Motion-JPEG */ #define V4L2_PIX_FMT_JPEG v4l2_fourcc('J','P','E','G') /* JFIF JPEG */ #define V4L2_PIX_FMT_DV v4l2_fourcc('d','v','s','d') /* 1394 */ -#define V4L2_PIX_FMT_MPEG v4l2_fourcc('M','P','E','G') /* MPEG */ +#define V4L2_PIX_FMT_MPEG v4l2_fourcc('M','P','E','G') /* MPEG-1/2/4 */ /* Vendor-specific formats */ #define V4L2_PIX_FMT_WNVA v4l2_fourcc('W','N','V','A') /* Winnov hw compress */ @@ -343,7 +276,6 @@ struct v4l2_fmtdesc #define V4L2_FMT_FLAG_COMPRESSED 0x0001 - /* * T I M E C O D E */ @@ -373,16 +305,15 @@ struct v4l2_timecode #define V4L2_TC_USERBITS_8BITCHARS 0x0008 /* The above is based on SMPTE timecodes */ - +#ifdef __KERNEL__ /* * M P E G C O M P R E S S I O N P A R A M E T E R S * - * ### WARNING: this is still work-in-progress right now, most likely - * ### there will be some incompatible changes. + * ### WARNING: This experimental MPEG compression API is obsolete. + * ### It is replaced by the MPEG controls API. + * ### This old API will disappear in the near future! * */ - - enum v4l2_bitrate_mode { V4L2_BITRATE_NONE = 0, /* not specified */ V4L2_BITRATE_CBR, /* constant bitrate */ @@ -460,6 +391,7 @@ struct v4l2_mpeg_compression { /* I don't expect the above being perfect yet ;) */ __u32 reserved_5[8]; }; +#endif struct v4l2_jpegcompression { @@ -491,7 +423,6 @@ struct v4l2_jpegcompression * allways use APP0 */ }; - /* * M E M O R Y - M A P P I N G B U F F E R S */ @@ -573,7 +504,6 @@ struct v4l2_window void __user *bitmap; }; - /* * C A P T U R E P A R A M E T E R S */ @@ -586,6 +516,7 @@ struct v4l2_captureparm __u32 readbuffers; /* # of buffers for read */ __u32 reserved[4]; }; + /* Flags for 'capability' and 'capturemode' fields */ #define V4L2_MODE_HIGHQUALITY 0x0001 /* High quality imaging mode */ #define V4L2_CAP_TIMEPERFRAME 0x1000 /* timeperframe field is supported */ @@ -603,7 +534,6 @@ struct v4l2_outputparm /* * I N P U T I M A G E C R O P P I N G */ - struct v4l2_cropcap { enum v4l2_buf_type type; struct v4l2_rect bounds; @@ -710,7 +640,6 @@ struct v4l2_standard __u32 reserved[4]; }; - /* * V I D E O I N P U T S */ @@ -725,6 +654,7 @@ struct v4l2_input __u32 status; __u32 reserved[4]; }; + /* Values for the 'type' field */ #define V4L2_INPUT_TYPE_TUNER 1 #define V4L2_INPUT_TYPE_CAMERA 2 @@ -775,6 +705,34 @@ struct v4l2_control __s32 value; }; +struct v4l2_ext_control +{ + __u32 id; + __u32 reserved2[2]; + union { + __s32 value; + __s64 value64; + void *reserved; + }; +} __attribute__ ((packed)); + +struct v4l2_ext_controls +{ + __u32 ctrl_class; + __u32 count; + __u32 error_idx; + __u32 reserved[2]; + struct v4l2_ext_control *controls; +}; + +/* Values for ctrl_class field */ +#define V4L2_CTRL_CLASS_USER 0x00980000 /* Old-style 'user' controls */ +#define V4L2_CTRL_CLASS_MPEG 0x00990000 /* MPEG-compression controls */ + +#define V4L2_CTRL_ID_MASK (0x0fffffff) +#define V4L2_CTRL_ID2CLASS(id) ((id) & 0x0fff0000UL) +#define V4L2_CTRL_DRIVER_PRIV(id) (((id) & 0xffff) >= 0x1000) + /* Used in the VIDIOC_QUERYCTRL ioctl for querying controls */ struct v4l2_queryctrl { @@ -801,12 +759,21 @@ struct v4l2_querymenu /* Control flags */ #define V4L2_CTRL_FLAG_DISABLED 0x0001 #define V4L2_CTRL_FLAG_GRABBED 0x0002 +#define V4L2_CTRL_FLAG_READ_ONLY 0x0004 +#define V4L2_CTRL_FLAG_UPDATE 0x0008 +#define V4L2_CTRL_FLAG_INACTIVE 0x0010 +#define V4L2_CTRL_FLAG_SLIDER 0x0020 + +/* Query flag, to be ORed with the control ID */ +#define V4L2_CTRL_FLAG_NEXT_CTRL 0x80000000 -/* Control IDs defined by V4L2 */ -#define V4L2_CID_BASE 0x00980900 +/* User-class control IDs defined by V4L2 */ +#define V4L2_CID_BASE (V4L2_CTRL_CLASS_USER | 0x900) +#define V4L2_CID_USER_BASE V4L2_CID_BASE /* IDs reserved for driver specific controls */ #define V4L2_CID_PRIVATE_BASE 0x08000000 +#define V4L2_CID_USER_CLASS (V4L2_CTRL_CLASS_USER | 1) #define V4L2_CID_BRIGHTNESS (V4L2_CID_BASE+0) #define V4L2_CID_CONTRAST (V4L2_CID_BASE+1) #define V4L2_CID_SATURATION (V4L2_CID_BASE+2) @@ -833,6 +800,188 @@ struct v4l2_querymenu #define V4L2_CID_VCENTER (V4L2_CID_BASE+23) #define V4L2_CID_LASTP1 (V4L2_CID_BASE+24) /* last CID + 1 */ +/* MPEG-class control IDs defined by V4L2 */ +#define V4L2_CID_MPEG_BASE (V4L2_CTRL_CLASS_MPEG | 0x900) +#define V4L2_CID_MPEG_CLASS (V4L2_CTRL_CLASS_MPEG | 1) + +/* MPEG streams */ +#define V4L2_CID_MPEG_STREAM_TYPE (V4L2_CID_MPEG_BASE+0) +enum v4l2_mpeg_stream_type { + V4L2_MPEG_STREAM_TYPE_MPEG2_PS = 0, /* MPEG-2 program stream */ + V4L2_MPEG_STREAM_TYPE_MPEG2_TS = 1, /* MPEG-2 transport stream */ + V4L2_MPEG_STREAM_TYPE_MPEG1_SS = 2, /* MPEG-1 system stream */ + V4L2_MPEG_STREAM_TYPE_MPEG2_DVD = 3, /* MPEG-2 DVD-compatible stream */ + V4L2_MPEG_STREAM_TYPE_MPEG1_VCD = 4, /* MPEG-1 VCD-compatible stream */ + V4L2_MPEG_STREAM_TYPE_MPEG2_SVCD = 5, /* MPEG-2 SVCD-compatible stream */ +}; +#define V4L2_CID_MPEG_STREAM_PID_PMT (V4L2_CID_MPEG_BASE+1) +#define V4L2_CID_MPEG_STREAM_PID_AUDIO (V4L2_CID_MPEG_BASE+2) +#define V4L2_CID_MPEG_STREAM_PID_VIDEO (V4L2_CID_MPEG_BASE+3) +#define V4L2_CID_MPEG_STREAM_PID_PCR (V4L2_CID_MPEG_BASE+4) +#define V4L2_CID_MPEG_STREAM_PES_ID_AUDIO (V4L2_CID_MPEG_BASE+5) +#define V4L2_CID_MPEG_STREAM_PES_ID_VIDEO (V4L2_CID_MPEG_BASE+6) +#define V4L2_CID_MPEG_STREAM_VBI_FMT (V4L2_CID_MPEG_BASE+7) +enum v4l2_mpeg_stream_vbi_fmt { + V4L2_MPEG_STREAM_VBI_FMT_NONE = 0, /* No VBI in the MPEG stream */ + V4L2_MPEG_STREAM_VBI_FMT_IVTV = 1, /* VBI in private packets, IVTV format */ +}; + +/* MPEG audio */ +#define V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ (V4L2_CID_MPEG_BASE+100) +enum v4l2_mpeg_audio_sampling_freq { + V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100 = 0, + V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000 = 1, + V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000 = 2, +}; +#define V4L2_CID_MPEG_AUDIO_ENCODING (V4L2_CID_MPEG_BASE+101) +enum v4l2_mpeg_audio_encoding { + V4L2_MPEG_AUDIO_ENCODING_LAYER_1 = 0, + V4L2_MPEG_AUDIO_ENCODING_LAYER_2 = 1, + V4L2_MPEG_AUDIO_ENCODING_LAYER_3 = 2, +}; +#define V4L2_CID_MPEG_AUDIO_L1_BITRATE (V4L2_CID_MPEG_BASE+102) +enum v4l2_mpeg_audio_l1_bitrate { + V4L2_MPEG_AUDIO_L1_BITRATE_32K = 0, + V4L2_MPEG_AUDIO_L1_BITRATE_64K = 1, + V4L2_MPEG_AUDIO_L1_BITRATE_96K = 2, + V4L2_MPEG_AUDIO_L1_BITRATE_128K = 3, + V4L2_MPEG_AUDIO_L1_BITRATE_160K = 4, + V4L2_MPEG_AUDIO_L1_BITRATE_192K = 5, + V4L2_MPEG_AUDIO_L1_BITRATE_224K = 6, + V4L2_MPEG_AUDIO_L1_BITRATE_256K = 7, + V4L2_MPEG_AUDIO_L1_BITRATE_288K = 8, + V4L2_MPEG_AUDIO_L1_BITRATE_320K = 9, + V4L2_MPEG_AUDIO_L1_BITRATE_352K = 10, + V4L2_MPEG_AUDIO_L1_BITRATE_384K = 11, + V4L2_MPEG_AUDIO_L1_BITRATE_416K = 12, + V4L2_MPEG_AUDIO_L1_BITRATE_448K = 13, +}; +#define V4L2_CID_MPEG_AUDIO_L2_BITRATE (V4L2_CID_MPEG_BASE+103) +enum v4l2_mpeg_audio_l2_bitrate { + V4L2_MPEG_AUDIO_L2_BITRATE_32K = 0, + V4L2_MPEG_AUDIO_L2_BITRATE_48K = 1, + V4L2_MPEG_AUDIO_L2_BITRATE_56K = 2, + V4L2_MPEG_AUDIO_L2_BITRATE_64K = 3, + V4L2_MPEG_AUDIO_L2_BITRATE_80K = 4, + V4L2_MPEG_AUDIO_L2_BITRATE_96K = 5, + V4L2_MPEG_AUDIO_L2_BITRATE_112K = 6, + V4L2_MPEG_AUDIO_L2_BITRATE_128K = 7, + V4L2_MPEG_AUDIO_L2_BITRATE_160K = 8, + V4L2_MPEG_AUDIO_L2_BITRATE_192K = 9, + V4L2_MPEG_AUDIO_L2_BITRATE_224K = 10, + V4L2_MPEG_AUDIO_L2_BITRATE_256K = 11, + V4L2_MPEG_AUDIO_L2_BITRATE_320K = 12, + V4L2_MPEG_AUDIO_L2_BITRATE_384K = 13, +}; +#define V4L2_CID_MPEG_AUDIO_L3_BITRATE (V4L2_CID_MPEG_BASE+104) +enum v4l2_mpeg_audio_l3_bitrate { + V4L2_MPEG_AUDIO_L3_BITRATE_32K = 0, + V4L2_MPEG_AUDIO_L3_BITRATE_40K = 1, + V4L2_MPEG_AUDIO_L3_BITRATE_48K = 2, + V4L2_MPEG_AUDIO_L3_BITRATE_56K = 3, + V4L2_MPEG_AUDIO_L3_BITRATE_64K = 4, + V4L2_MPEG_AUDIO_L3_BITRATE_80K = 5, + V4L2_MPEG_AUDIO_L3_BITRATE_96K = 6, + V4L2_MPEG_AUDIO_L3_BITRATE_112K = 7, + V4L2_MPEG_AUDIO_L3_BITRATE_128K = 8, + V4L2_MPEG_AUDIO_L3_BITRATE_160K = 9, + V4L2_MPEG_AUDIO_L3_BITRATE_192K = 10, + V4L2_MPEG_AUDIO_L3_BITRATE_224K = 11, + V4L2_MPEG_AUDIO_L3_BITRATE_256K = 12, + V4L2_MPEG_AUDIO_L3_BITRATE_320K = 13, +}; +#define V4L2_CID_MPEG_AUDIO_MODE (V4L2_CID_MPEG_BASE+105) +enum v4l2_mpeg_audio_mode { + V4L2_MPEG_AUDIO_MODE_STEREO = 0, + V4L2_MPEG_AUDIO_MODE_JOINT_STEREO = 1, + V4L2_MPEG_AUDIO_MODE_DUAL = 2, + V4L2_MPEG_AUDIO_MODE_MONO = 3, +}; +#define V4L2_CID_MPEG_AUDIO_MODE_EXTENSION (V4L2_CID_MPEG_BASE+106) +enum v4l2_mpeg_audio_mode_extension { + V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_4 = 0, + V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_8 = 1, + V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_12 = 2, + V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_16 = 3, +}; +#define V4L2_CID_MPEG_AUDIO_EMPHASIS (V4L2_CID_MPEG_BASE+107) +enum v4l2_mpeg_audio_emphasis { + V4L2_MPEG_AUDIO_EMPHASIS_NONE = 0, + V4L2_MPEG_AUDIO_EMPHASIS_50_DIV_15_uS = 1, + V4L2_MPEG_AUDIO_EMPHASIS_CCITT_J17 = 2, +}; +#define V4L2_CID_MPEG_AUDIO_CRC (V4L2_CID_MPEG_BASE+108) +enum v4l2_mpeg_audio_crc { + V4L2_MPEG_AUDIO_CRC_NONE = 0, + V4L2_MPEG_AUDIO_CRC_CRC16 = 1, +}; + +/* MPEG video */ +#define V4L2_CID_MPEG_VIDEO_ENCODING (V4L2_CID_MPEG_BASE+200) +enum v4l2_mpeg_video_encoding { + V4L2_MPEG_VIDEO_ENCODING_MPEG_1 = 0, + V4L2_MPEG_VIDEO_ENCODING_MPEG_2 = 1, +}; +#define V4L2_CID_MPEG_VIDEO_ASPECT (V4L2_CID_MPEG_BASE+201) +enum v4l2_mpeg_video_aspect { + V4L2_MPEG_VIDEO_ASPECT_1x1 = 0, + V4L2_MPEG_VIDEO_ASPECT_4x3 = 1, + V4L2_MPEG_VIDEO_ASPECT_16x9 = 2, + V4L2_MPEG_VIDEO_ASPECT_221x100 = 3, +}; +#define V4L2_CID_MPEG_VIDEO_B_FRAMES (V4L2_CID_MPEG_BASE+202) +#define V4L2_CID_MPEG_VIDEO_GOP_SIZE (V4L2_CID_MPEG_BASE+203) +#define V4L2_CID_MPEG_VIDEO_GOP_CLOSURE (V4L2_CID_MPEG_BASE+204) +#define V4L2_CID_MPEG_VIDEO_PULLDOWN (V4L2_CID_MPEG_BASE+205) +#define V4L2_CID_MPEG_VIDEO_BITRATE_MODE (V4L2_CID_MPEG_BASE+206) +enum v4l2_mpeg_video_bitrate_mode { + V4L2_MPEG_VIDEO_BITRATE_MODE_VBR = 0, + V4L2_MPEG_VIDEO_BITRATE_MODE_CBR = 1, +}; +#define V4L2_CID_MPEG_VIDEO_BITRATE (V4L2_CID_MPEG_BASE+207) +#define V4L2_CID_MPEG_VIDEO_BITRATE_PEAK (V4L2_CID_MPEG_BASE+208) +#define V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION (V4L2_CID_MPEG_BASE+209) + +/* MPEG-class control IDs specific to the CX2584x driver as defined by V4L2 */ +#define V4L2_CID_MPEG_CX2341X_BASE (V4L2_CTRL_CLASS_MPEG | 0x1000) +#define V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE (V4L2_CID_MPEG_CX2341X_BASE+0) +enum v4l2_mpeg_cx2341x_video_spatial_filter_mode { + V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_MANUAL = 0, + V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO = 1, +}; +#define V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER (V4L2_CID_MPEG_CX2341X_BASE+1) +#define V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE (V4L2_CID_MPEG_CX2341X_BASE+2) +enum v4l2_mpeg_cx2341x_video_luma_spatial_filter_type { + V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_OFF = 0, + V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_1D_HOR = 1, + V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_1D_VERT = 2, + V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_2D_HV_SEPARABLE = 3, + V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_2D_SYM_NON_SEPARABLE = 4, +}; +#define V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE (V4L2_CID_MPEG_CX2341X_BASE+3) +enum v4l2_mpeg_cx2341x_video_chroma_spatial_filter_type { + V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_OFF = 0, + V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_1D_HOR = 1, +}; +#define V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE (V4L2_CID_MPEG_CX2341X_BASE+4) +enum v4l2_mpeg_cx2341x_video_temporal_filter_mode { + V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_MANUAL = 0, + V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_AUTO = 1, +}; +#define V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER (V4L2_CID_MPEG_CX2341X_BASE+5) +#define V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE (V4L2_CID_MPEG_CX2341X_BASE+6) +enum v4l2_mpeg_cx2341x_video_median_filter_type { + V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF = 0, + V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_HOR = 1, + V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_VERT = 2, + V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_HOR_VERT = 3, + V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_DIAG = 4, +}; +#define V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_BOTTOM (V4L2_CID_MPEG_CX2341X_BASE+7) +#define V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP (V4L2_CID_MPEG_CX2341X_BASE+8) +#define V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM (V4L2_CID_MPEG_CX2341X_BASE+9) +#define V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP (V4L2_CID_MPEG_CX2341X_BASE+10) + /* * T U N I N G */ @@ -904,6 +1053,7 @@ struct v4l2_audio __u32 mode; __u32 reserved[2]; }; + /* Flags for the 'capability' field */ #define V4L2_AUDCAP_STEREO 0x00001 #define V4L2_AUDCAP_AVL 0x00002 @@ -927,7 +1077,6 @@ struct v4l2_audioout */ /* Raw VBI */ - struct v4l2_vbi_format { __u32 sampling_rate; /* in 1 Hz */ @@ -1034,8 +1183,6 @@ struct v4l2_streamparm } parm; }; - - /* * I O C T L C O D E S F O R V I D E O D E V I C E S * @@ -1045,8 +1192,10 @@ struct v4l2_streamparm #define VIDIOC_ENUM_FMT _IOWR ('V', 2, struct v4l2_fmtdesc) #define VIDIOC_G_FMT _IOWR ('V', 4, struct v4l2_format) #define VIDIOC_S_FMT _IOWR ('V', 5, struct v4l2_format) +#ifdef __KERNEL__ #define VIDIOC_G_MPEGCOMP _IOR ('V', 6, struct v4l2_mpeg_compression) #define VIDIOC_S_MPEGCOMP _IOW ('V', 7, struct v4l2_mpeg_compression) +#endif #define VIDIOC_REQBUFS _IOWR ('V', 8, struct v4l2_requestbuffers) #define VIDIOC_QUERYBUF _IOWR ('V', 9, struct v4l2_buffer) #define VIDIOC_G_FBUF _IOR ('V', 10, struct v4l2_framebuffer) @@ -1096,7 +1245,11 @@ struct v4l2_streamparm #define VIDIOC_G_SLICED_VBI_CAP _IOR ('V', 69, struct v4l2_sliced_vbi_cap) #endif #define VIDIOC_LOG_STATUS _IO ('V', 70) +#define VIDIOC_G_EXT_CTRLS _IOWR ('V', 71, struct v4l2_ext_controls) +#define VIDIOC_S_EXT_CTRLS _IOWR ('V', 72, struct v4l2_ext_controls) +#define VIDIOC_TRY_EXT_CTRLS _IOWR ('V', 73, struct v4l2_ext_controls) +#ifdef __OLD_VIDIOC_ /* for compatibility, will go away some day */ #define VIDIOC_OVERLAY_OLD _IOWR ('V', 14, int) #define VIDIOC_S_PARM_OLD _IOW ('V', 22, struct v4l2_streamparm) @@ -1104,57 +1257,10 @@ struct v4l2_streamparm #define VIDIOC_G_AUDIO_OLD _IOWR ('V', 33, struct v4l2_audio) #define VIDIOC_G_AUDOUT_OLD _IOWR ('V', 49, struct v4l2_audioout) #define VIDIOC_CROPCAP_OLD _IOR ('V', 58, struct v4l2_cropcap) - -#define BASE_VIDIOC_PRIVATE 192 /* 192-255 are private */ - - -#ifdef __KERNEL__ -/* - * - * V 4 L 2 D R I V E R H E L P E R A P I - * - * Some commonly needed functions for drivers (v4l2-common.o module) - */ -#include - -/* Video standard functions */ -extern unsigned int v4l2_video_std_fps(struct v4l2_standard *vs); -extern int v4l2_video_std_construct(struct v4l2_standard *vs, - int id, char *name); - -/* prority handling */ -struct v4l2_prio_state { - atomic_t prios[4]; -}; -int v4l2_prio_init(struct v4l2_prio_state *global); -int v4l2_prio_change(struct v4l2_prio_state *global, enum v4l2_priority *local, - enum v4l2_priority new); -int v4l2_prio_open(struct v4l2_prio_state *global, enum v4l2_priority *local); -int v4l2_prio_close(struct v4l2_prio_state *global, enum v4l2_priority *local); -enum v4l2_priority v4l2_prio_max(struct v4l2_prio_state *global); -int v4l2_prio_check(struct v4l2_prio_state *global, enum v4l2_priority *local); - -/* names for fancy debug output */ -extern char *v4l2_field_names[]; -extern char *v4l2_type_names[]; - -/* Compatibility layer interface -- v4l1-compat module */ -typedef int (*v4l2_kioctl)(struct inode *inode, struct file *file, - unsigned int cmd, void *arg); - -#ifdef CONFIG_VIDEO_V4L1_COMPAT -int v4l_compat_translate_ioctl(struct inode *inode, struct file *file, - int cmd, void *arg, v4l2_kioctl driver_ioctl); -#else -#define v4l_compat_translate_ioctl(inode,file,cmd,arg,ioctl) -EINVAL #endif -/* 32 Bits compatibility layer for 64 bits processors */ -extern long v4l_compat_ioctl32(struct file *file, unsigned int cmd, - unsigned long arg); - +#define BASE_VIDIOC_PRIVATE 192 /* 192-255 are private */ -#endif /* __KERNEL__ */ #endif /* __LINUX_VIDEODEV2_H */ /* diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index 1d5577b2b..71b6363ca 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h @@ -4,10 +4,14 @@ #include #include /* pgprot_t */ +struct vm_area_struct; + /* bits in vm_struct->flags */ #define VM_IOREMAP 0x00000001 /* ioremap() and friends */ #define VM_ALLOC 0x00000002 /* vmalloc() */ #define VM_MAP 0x00000004 /* vmap()ed pages */ +#define VM_USERMAP 0x00000008 /* suitable for remap_vmalloc_range */ +#define VM_VPAGES 0x00000010 /* buffer for pages was vmalloc'ed */ /* bits [20..32] reserved for arch specific ioremap internals */ /* @@ -32,9 +36,11 @@ struct vm_struct { * Highlevel APIs for driver use */ extern void *vmalloc(unsigned long size); +extern void *vmalloc_user(unsigned long size); extern void *vmalloc_node(unsigned long size, int node); extern void *vmalloc_exec(unsigned long size); extern void *vmalloc_32(unsigned long size); +extern void *vmalloc_32_user(unsigned long size); extern void *__vmalloc(unsigned long size, gfp_t gfp_mask, pgprot_t prot); extern void *__vmalloc_area(struct vm_struct *area, gfp_t gfp_mask, pgprot_t prot); @@ -45,6 +51,9 @@ extern void vfree(void *addr); extern void *vmap(struct page **pages, unsigned int count, unsigned long flags, pgprot_t prot); extern void vunmap(void *addr); + +extern int remap_vmalloc_range(struct vm_area_struct *vma, void *addr, + unsigned long pgoff); /* * Lowlevel-APIs (not for driver use!) diff --git a/include/linux/vs_context.h b/include/linux/vs_context.h index 8cdeb8d3a..51656ac72 100644 --- a/include/linux/vs_context.h +++ b/include/linux/vs_context.h @@ -170,7 +170,48 @@ static inline void __wakeup_vx_info(struct vx_info *vxi) wake_up_interruptible(&vxi->vx_wait); } + +#define enter_vx_info(v,s) __enter_vx_info(v,s,__FILE__,__LINE__) + +static inline void __enter_vx_info(struct vx_info *vxi, + struct vx_info_save *vxis, const char *_file, int _line) +{ + vxlprintk(VXD_CBIT(xid, 5), "enter_vx_info(%p[#%d],%p) %p[#%d,%p]", + vxi, vxi ? vxi->vx_id : 0, vxis, current, + current->xid, current->vx_info, _file, _line); + vxis->vxi = xchg(¤t->vx_info, vxi); + vxis->xid = current->xid; + current->xid = vxi ? vxi->vx_id : 0; +} + +#define leave_vx_info(s) __leave_vx_info(s,__FILE__,__LINE__) + +static inline void __leave_vx_info(struct vx_info_save *vxis, + const char *_file, int _line) +{ + vxlprintk(VXD_CBIT(xid, 5), "leave_vx_info(%p[#%d,%p]) %p[#%d,%p]", + vxis, vxis->xid, vxis->vxi, current, + current->xid, current->vx_info, _file, _line); + (void)xchg(¤t->vx_info, vxis->vxi); + current->xid = vxis->xid; +} + + +static inline void __enter_vx_admin(struct vx_info_save *vxis) +{ + vxis->vxi = xchg(¤t->vx_info, NULL); + vxis->xid = xchg(¤t->xid, (xid_t)0); +} + +static inline void __leave_vx_admin(struct vx_info_save *vxis) +{ + (void)xchg(¤t->xid, vxis->xid); + (void)xchg(¤t->vx_info, vxis->vxi); +} + extern void exit_vx_info(struct task_struct *, int); +extern void exit_vx_info_early(struct task_struct *, int); + static inline struct task_struct *vx_child_reaper(struct task_struct *p) @@ -189,6 +230,9 @@ struct task_struct *vx_child_reaper(struct task_struct *p) reaper = vxi->vx_reaper; out: + vxdprintk(VXD_CBIT(xid, 3), + "vx_child_reaper(%p[#%u,%u]) = %p[#%u,%u]\n", + p, p->xid, p->pid, reaper, reaper->xid, reaper->pid); return reaper; } diff --git a/include/linux/vs_cvirt.h b/include/linux/vs_cvirt.h index 0901e7360..3158d5a84 100644 --- a/include/linux/vs_cvirt.h +++ b/include/linux/vs_cvirt.h @@ -103,6 +103,54 @@ static inline void vx_uninterruptible_dec(struct task_struct *p) } +struct inode; + +#define VXF_FAKE_INIT (VXF_INFO_INIT|VXF_STATE_INIT) + +static inline +int proc_pid_visible(struct task_struct *task, int pid) +{ + if ((pid == 1) && + !vx_flags(VXF_FAKE_INIT, VXF_FAKE_INIT)) + /* show a blend through init */ + goto visible; + if (vx_check(vx_task_xid(task), VX_WATCH|VX_IDENT)) + goto visible; + return 0; +visible: + return 1; +} + +static inline +struct task_struct *find_proc_task_by_pid(int pid) +{ + struct task_struct *task = find_task_by_pid(pid); + + if (task && !proc_pid_visible(task, pid)) { + vxdprintk(VXD_CBIT(misc, 6), + "dropping task %p[#%u,%u] for %p[#%u,%u]", + task, task->xid, task->pid, + current, current->xid, current->pid); + task = NULL; + } + return task; +} + +static inline +struct task_struct *vx_get_proc_task(struct inode *inode, struct pid *pid) +{ + struct task_struct *task = get_pid_task(pid, PIDTYPE_PID); + + if (task && !proc_pid_visible(task, pid->nr)) { + vxdprintk(VXD_CBIT(misc, 6), + "dropping task %p[#%u,%u] for %p[#%u,%u]", + task, task->xid, task->pid, + current, current->xid, current->pid); + task = NULL; + } + return task; +} + #else #warning duplicate inclusion #endif diff --git a/include/linux/vs_dlimit.h b/include/linux/vs_dlimit.h index 674262d97..b39a32a8a 100644 --- a/include/linux/vs_dlimit.h +++ b/include/linux/vs_dlimit.h @@ -144,7 +144,7 @@ out: } static inline void __dl_adjust_block(struct super_block *sb, xid_t xid, - unsigned int *free_blocks, unsigned int *root_blocks, + unsigned long *free_blocks, unsigned long *root_blocks, const char *_file, int _line) { struct dl_info *dli; @@ -163,7 +163,7 @@ static inline void __dl_adjust_block(struct super_block *sb, xid_t xid, spin_unlock(&dli->dl_lock); vxlprintk(VXD_CBIT(dlim, 2), - "ADJUST: %lld,%lld on %d,%d [mult=%d]", + "ADJUST: %lld,%lld on %ld,%ld [mult=%d]", (long long)bfree, (long long)broot, *free_blocks, *root_blocks, dli->dl_nrlmult, _file, _line); diff --git a/include/linux/vserver/context.h b/include/linux/vserver/context.h index 4053ced81..eecad020f 100644 --- a/include/linux/vserver/context.h +++ b/include/linux/vserver/context.h @@ -124,6 +124,12 @@ struct vx_info { }; +struct vx_info_save { + struct vx_info *vxi; + xid_t xid; +}; + + /* status flags */ #define VXS_HASHED 0x0001 diff --git a/include/linux/vserver/cvirt_def.h b/include/linux/vserver/cvirt_def.h index 23aa246f5..5ac0c2e64 100644 --- a/include/linux/vserver/cvirt_def.h +++ b/include/linux/vserver/cvirt_def.h @@ -56,8 +56,6 @@ struct _vx_cvirt { atomic_t total_forks; /* number of forks so far */ - struct _vx_usage_stat cpustat[NR_CPUS]; - struct _vx_syslog syslog; }; diff --git a/include/linux/vserver/xid.h b/include/linux/vserver/xid.h index 2e4349eb2..1498de4ba 100644 --- a/include/linux/vserver/xid.h +++ b/include/linux/vserver/xid.h @@ -1,8 +1,6 @@ #ifndef _VX_XID_H #define _VX_XID_H -#include - #define XID_TAG(in) (IS_TAGXID(in)) diff --git a/include/linux/vt.h b/include/linux/vt.h index 9f95b0bea..ba806e871 100644 --- a/include/linux/vt.h +++ b/include/linux/vt.h @@ -1,6 +1,16 @@ #ifndef _LINUX_VT_H #define _LINUX_VT_H +/* + * These constants are also useful for user-level apps (e.g., VC + * resizing). + */ +#define MIN_NR_CONSOLES 1 /* must be at least 1 */ +#define MAX_NR_CONSOLES 63 /* serial lines start at 64 */ +#define MAX_NR_USER_CONSOLES 63 /* must be root to allocate above this */ + /* Note: the ioctl VT_GETSTATE does not work for + consoles 16 and higher (since it returns a short) */ + /* 0x56 is 'V', to avoid collision with termios and kd */ #define VT_OPENQRY 0x5600 /* find available vt */ @@ -50,5 +60,6 @@ struct vt_consize { #define VT_RESIZEX 0x560A /* set kernel's idea of screensize + more */ #define VT_LOCKSWITCH 0x560B /* disallow vt switching */ #define VT_UNLOCKSWITCH 0x560C /* allow vt switching */ +#define VT_GETHIFONTMASK 0x560D /* return hi font mask */ #endif /* _LINUX_VT_H */ diff --git a/include/linux/vt_buffer.h b/include/linux/vt_buffer.h index 1f7ba3629..057db7d2f 100644 --- a/include/linux/vt_buffer.h +++ b/include/linux/vt_buffer.h @@ -13,7 +13,6 @@ #ifndef _LINUX_VT_BUFFER_H_ #define _LINUX_VT_BUFFER_H_ -#include #if defined(CONFIG_VGA_CONSOLE) || defined(CONFIG_MDA_CONSOLE) #include diff --git a/include/linux/vt_kern.h b/include/linux/vt_kern.h index fab5aed8c..918a29763 100644 --- a/include/linux/vt_kern.h +++ b/include/linux/vt_kern.h @@ -6,7 +6,6 @@ * with information needed by the vt package */ -#include #include #include #include @@ -27,6 +26,7 @@ extern void kd_mksound(unsigned int hz, unsigned int ticks); extern int kbd_rate(struct kbd_repeat *rep); +extern int fg_console, last_console, want_console; /* console.c */ diff --git a/include/linux/wait.h b/include/linux/wait.h index 34f41e790..868dc31e8 100644 --- a/include/linux/wait.h +++ b/include/linux/wait.h @@ -19,7 +19,6 @@ #ifdef __KERNEL__ -#include #include #include #include @@ -69,7 +68,7 @@ struct task_struct; wait_queue_t name = __WAITQUEUE_INITIALIZER(name, tsk) #define __WAIT_QUEUE_HEAD_INITIALIZER(name) { \ - .lock = SPIN_LOCK_UNLOCKED, \ + .lock = __SPIN_LOCK_UNLOCKED(name.lock), \ .task_list = { &(name).task_list, &(name).task_list } } #define DECLARE_WAIT_QUEUE_HEAD(name) \ @@ -78,11 +77,7 @@ struct task_struct; #define __WAIT_BIT_KEY_INITIALIZER(word, bit) \ { .flags = word, .bit_nr = bit, } -static inline void init_waitqueue_head(wait_queue_head_t *q) -{ - spin_lock_init(&q->lock); - INIT_LIST_HEAD(&q->task_list); -} +extern void init_waitqueue_head(wait_queue_head_t *q); static inline void init_waitqueue_entry(wait_queue_t *q, struct task_struct *p) { @@ -115,7 +110,7 @@ static inline int waitqueue_active(wait_queue_head_t *q) extern void FASTCALL(add_wait_queue(wait_queue_head_t *q, wait_queue_t * wait)); extern void FASTCALL(add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_t * wait)); -extern int FASTCALL(remove_wait_queue(wait_queue_head_t *q, wait_queue_t * wait)); +extern void FASTCALL(remove_wait_queue(wait_queue_head_t *q, wait_queue_t * wait)); static inline void __add_wait_queue(wait_queue_head_t *head, wait_queue_t *new) { diff --git a/include/linux/wanrouter.h b/include/linux/wanrouter.h index 1b6b76a4e..2cd05013e 100644 --- a/include/linux/wanrouter.h +++ b/include/linux/wanrouter.h @@ -44,8 +44,6 @@ * Jan 02, 1997 Gene Kozin Initial version (based on wanpipe.h). *****************************************************************************/ -#include /* Support for SMP Locking */ - #ifndef _ROUTER_H #define _ROUTER_H @@ -457,6 +455,8 @@ typedef struct wanif_conf #include /* support for device drivers */ #include /* proc filesystem pragmatics */ #include /* support for network drivers */ +#include /* Support for SMP Locking */ + /*---------------------------------------------------------------------------- * WAN device data space. */ diff --git a/include/linux/watchdog.h b/include/linux/watchdog.h index 1192ed8f4..011bcfeb9 100644 --- a/include/linux/watchdog.h +++ b/include/linux/watchdog.h @@ -28,6 +28,9 @@ struct watchdog_info { #define WDIOC_KEEPALIVE _IOR(WATCHDOG_IOCTL_BASE, 5, int) #define WDIOC_SETTIMEOUT _IOWR(WATCHDOG_IOCTL_BASE, 6, int) #define WDIOC_GETTIMEOUT _IOR(WATCHDOG_IOCTL_BASE, 7, int) +#define WDIOC_SETPRETIMEOUT _IOWR(WATCHDOG_IOCTL_BASE, 8, int) +#define WDIOC_GETPRETIMEOUT _IOR(WATCHDOG_IOCTL_BASE, 9, int) +#define WDIOC_GETTIMELEFT _IOR(WATCHDOG_IOCTL_BASE, 10, int) #define WDIOF_UNKNOWN -1 /* Unknown flag error */ #define WDIOS_UNKNOWN -1 /* Unknown status error */ @@ -38,9 +41,10 @@ struct watchdog_info { #define WDIOF_EXTERN2 0x0008 /* External relay 2 */ #define WDIOF_POWERUNDER 0x0010 /* Power bad/power fault */ #define WDIOF_CARDRESET 0x0020 /* Card previously reset the CPU */ -#define WDIOF_POWEROVER 0x0040 /* Power over voltage */ -#define WDIOF_SETTIMEOUT 0x0080 /* Set timeout (in seconds) */ -#define WDIOF_MAGICCLOSE 0x0100 /* Supports magic close char */ +#define WDIOF_POWEROVER 0x0040 /* Power over voltage */ +#define WDIOF_SETTIMEOUT 0x0080 /* Set timeout (in seconds) */ +#define WDIOF_MAGICCLOSE 0x0100 /* Supports magic close char */ +#define WDIOF_PRETIMEOUT 0x0200 /* Pretimeout (in seconds), get/set */ #define WDIOF_KEEPALIVEPING 0x8000 /* Keep alive ping reply */ #define WDIOS_DISABLECARD 0x0001 /* Turn off the watchdog timer */ diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h index 957c21c16..9bca3539a 100644 --- a/include/linux/workqueue.h +++ b/include/linux/workqueue.h @@ -63,6 +63,8 @@ extern void destroy_workqueue(struct workqueue_struct *wq); extern int FASTCALL(queue_work(struct workqueue_struct *wq, struct work_struct *work)); extern int FASTCALL(queue_delayed_work(struct workqueue_struct *wq, struct work_struct *work, unsigned long delay)); +extern int queue_delayed_work_on(int cpu, struct workqueue_struct *wq, + struct work_struct *work, unsigned long delay); extern void FASTCALL(flush_workqueue(struct workqueue_struct *wq)); extern int FASTCALL(schedule_work(struct work_struct *work)); diff --git a/include/linux/writeback.h b/include/linux/writeback.h index 56f92fcbe..05843b8b8 100644 --- a/include/linux/writeback.h +++ b/include/linux/writeback.h @@ -50,14 +50,15 @@ struct writeback_control { * a hint that the filesystem need only write out the pages inside that * byterange. The byte at `end' is included in the writeout request. */ - loff_t start; - loff_t end; + loff_t range_start; + loff_t range_end; unsigned nonblocking:1; /* Don't get stuck on request queues */ unsigned encountered_congestion:1; /* An output: a queue is full */ unsigned for_kupdate:1; /* A kupdate writeback */ unsigned for_reclaim:1; /* Invoked from the page allocator */ unsigned for_writepages:1; /* This is a writepages() call */ + unsigned range_cyclic:1; /* range_start is cyclic */ }; /* @@ -114,6 +115,7 @@ int sync_page_range(struct inode *inode, struct address_space *mapping, loff_t pos, loff_t count); int sync_page_range_nolock(struct inode *inode, struct address_space *mapping, loff_t pos, loff_t count); +void set_page_dirty_balance(struct page *page); /* pdflush.c */ extern int nr_pdflush_threads; /* Global so it can be exported to sysctl diff --git a/include/linux/xfrm.h b/include/linux/xfrm.h index 6b42cc474..46a15c7a1 100644 --- a/include/linux/xfrm.h +++ b/include/linux/xfrm.h @@ -118,6 +118,10 @@ enum XFRM_SHARE_UNIQUE /* Use once */ }; +#define XFRM_MODE_TRANSPORT 0 +#define XFRM_MODE_TUNNEL 1 +#define XFRM_MODE_MAX 2 + /* Netlink configuration messages. */ enum { XFRM_MSG_BASE = 0x10, diff --git a/include/linux/zconf.h b/include/linux/zconf.h index f1cfd66b9..0beb75e38 100644 --- a/include/linux/zconf.h +++ b/include/linux/zconf.h @@ -33,6 +33,18 @@ */ #ifndef MAX_WBITS # define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* default windowBits for decompression. MAX_WBITS is for compression only */ +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif + +/* default memLevel */ +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL #endif /* Type declarations */ diff --git a/include/linux/zlib.h b/include/linux/zlib.h index 4fa32f0d4..9e3192a7d 100644 --- a/include/linux/zlib.h +++ b/include/linux/zlib.h @@ -1,7 +1,6 @@ /* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.1.3, July 9th, 1998 - Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler + Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -24,7 +23,7 @@ The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt + Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). */ @@ -33,7 +32,22 @@ #include -#define ZLIB_VERSION "1.1.3" +/* zlib deflate based on ZLIB_VERSION "1.1.3" */ +/* zlib inflate based on ZLIB_VERSION "1.2.3" */ + +/* + This is a modified version of zlib for use inside the Linux kernel. + The main changes are to perform all memory allocation in advance. + + Inflation Changes: + * Z_PACKET_FLUSH is added and used by ppp_deflate. Before returning + this checks there is no more input data available and the next data + is a STORED block. It also resets the mode to be read for the next + data, all as per PPP requirements. + * Addition of zlib_inflateIncomp which copies incompressible data into + the history window and adjusts the accoutning without calling + zlib_inflate itself to inflate the data. +*/ /* The 'zlib' compression library provides in-memory compression and @@ -48,9 +62,18 @@ application must provide more input and/or consume the output (providing more output space) before each call. + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + The library also supports reading and writing files in gzip (.gz) format with an interface similar to that of stdio. + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + The library does not install any signal handler. The decoder checks the consistency of the compressed data, so the library should never crash even in case of corrupted input. @@ -119,7 +142,8 @@ typedef z_stream *z_streamp; #define Z_SYNC_FLUSH 3 #define Z_FULL_FLUSH 4 #define Z_FINISH 5 -/* Allowed flush values; see deflate() below for details */ +#define Z_BLOCK 6 /* Only for inflate at present */ +/* Allowed flush values; see deflate() and inflate() below for details */ #define Z_OK 0 #define Z_STREAM_END 1 @@ -155,13 +179,6 @@ typedef z_stream *z_streamp; /* basic functions */ -extern const char * zlib_zlibVersion (void); -/* The application can compare zlibVersion and ZLIB_VERSION for consistency. - If the first character differs, the library code actually used is - not compatible with the zlib.h header file used by the application. - This check is automatically made by deflateInit and inflateInit. - */ - extern int zlib_deflate_workspacesize (void); /* Returns the number of bytes that needs to be allocated for a per- @@ -315,9 +332,9 @@ extern int zlib_inflateInit (z_streamp strm); extern int zlib_inflate (z_streamp strm, int flush); /* inflate decompresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may some - introduce some output latency (reading input without producing any output) - except when forced to flush. + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. The detailed semantics are as follows. inflate performs one or both of the following actions: @@ -341,11 +358,26 @@ extern int zlib_inflate (z_streamp strm, int flush); must be called again after making room in the output buffer because there might be more output pending. - If the parameter flush is set to Z_SYNC_FLUSH, inflate flushes as much - output as possible to the output buffer. The flushing behavior of inflate is - not specified for values of the flush parameter other than Z_SYNC_FLUSH - and Z_FINISH, but the current implementation actually flushes as much output - as possible anyway. + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, + Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() stop + if and when it gets to the next deflate block boundary. When decoding the + zlib or gzip format, this will cause inflate() to return immediately after + the header and before the first block. When doing a raw inflate, inflate() + will go ahead and process the first block, and will return when it gets to + the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + Also to assist in this, on return inflate() will set strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 + if inflate() is currently decoding the last block in the deflate stream, + plus 128 if inflate() returned immediately after decoding an end-of-block + code or decoding the complete header up to just before the first byte of the + deflate stream. The end-of-block will not be indicated until all of the + uncompressed data from that block has been written to strm->next_out. The + number of unused bits may in general be greater than seven, except when + bit 7 of data_type is set, in which case the number of unused bits will be + less than eight. inflate() should normally be called until it returns Z_STREAM_END or an error. However if all decompression is to be performed in a single step @@ -355,29 +387,44 @@ extern int zlib_inflate (z_streamp strm, int flush); uncompressed data. (The size of the uncompressed data may have been saved by the compressor for this purpose.) The next operation on this stream must be inflateEnd to deallocate the decompression state. The use of Z_FINISH - is never required, but can be used to inform inflate that a faster routine + is never required, but can be used to inform inflate that a faster approach may be used for the single inflate() call. - If a preset dictionary is needed at this point (see inflateSetDictionary - below), inflate sets strm-adler to the adler32 checksum of the - dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise - it sets strm->adler to the adler32 checksum of all output produced - so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or - an error code as described below. At the end of the stream, inflate() - checks that its computed adler32 checksum is equal to that saved by the - compressor and returns Z_STREAM_END only if the checksum is correct. + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the only effect of the flush parameter in this implementation + is on the return value of inflate(), as noted below, or when it returns early + because Z_BLOCK is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the adler32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the adler32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed adler32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() will decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically. Any information + contained in the gzip header is not retained, so applications that need that + information should instead use raw inflate, see inflateInit2() below, or + inflateBack() and perform their own processing of the gzip header and + trailer. inflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if the end of the compressed data has been reached and all uncompressed output has been produced, Z_NEED_DICT if a preset dictionary is needed at this point, Z_DATA_ERROR if the input data was - corrupted (input stream not conforming to the zlib format or incorrect - adler32 checksum), Z_STREAM_ERROR if the stream structure was inconsistent - (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if no progress is possible or if there was not - enough room in the output buffer when Z_FINISH is used. In the Z_DATA_ERROR - case, the application may then call inflateSync to look for a good - compression block. + corrupted (input stream not conforming to the zlib format or incorrect check + value), Z_STREAM_ERROR if the stream structure was inconsistent (for example + if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, + Z_BUF_ERROR if no progress is possible or if there was not enough room in the + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may then + call inflateSync() to look for a good compression block if a partial recovery + of the data is desired. */ @@ -547,16 +594,36 @@ extern int inflateInit2 (z_streamp strm, int windowBits); The windowBits parameter is the base two logarithm of the maximum window size (the size of the history buffer). It should be in the range 8..15 for this version of the library. The default value is 15 if inflateInit is used - instead. If a compressed stream with a larger window size is given as - input, inflate() will return with the error code Z_DATA_ERROR instead of - trying to allocate a larger window. - - inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative - memLevel). msg is set to null if there is no error message. inflateInit2 - does not perform any decompression apart from reading the zlib header if - present: this will be done by inflate(). (So next_in and avail_in may be - modified, but next_out and avail_out are unchanged.) + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an adler32 or a crc32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is + a crc32 instead of an adler32. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg + is set to null if there is no error message. inflateInit2 does not perform + any decompression apart from reading the zlib header if present: this will + be done by inflate(). (So next_in and avail_in may be modified, but next_out + and avail_out are unchanged.) */ extern int zlib_inflateSetDictionary (z_streamp strm, @@ -564,16 +631,19 @@ extern int zlib_inflateSetDictionary (z_streamp strm, uInt dictLength); /* Initializes the decompression dictionary from the given uncompressed byte - sequence. This function must be called immediately after a call of inflate - if this call returned Z_NEED_DICT. The dictionary chosen by the compressor - can be determined from the Adler32 value returned by this call of - inflate. The compressor and decompressor must use exactly the same - dictionary (see deflateSetDictionary). + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the adler32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called + immediately after inflateInit2() or inflateReset() and before any call of + inflate() to set the dictionary. The application must insure that the + dictionary that was used for compression is provided. inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a parameter is invalid (such as NULL dictionary) or the stream state is inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the - expected one (incorrect Adler32 value). inflateSetDictionary does not + expected one (incorrect adler32 value). inflateSetDictionary does not perform any decompression: this will be done by subsequent calls of inflate(). */ @@ -614,40 +684,19 @@ extern int zlib_inflateIncomp (z_stream *strm); containing the data at next_in (except that the data is not output). */ - /* various hacks, don't look :) */ - -/* deflateInit and inflateInit are macros to allow checking the zlib version - * and the compiler's view of z_stream: - */ -extern int zlib_deflateInit_ (z_streamp strm, int level, - const char *version, int stream_size); -extern int zlib_inflateInit_ (z_streamp strm, - const char *version, int stream_size); -extern int zlib_deflateInit2_ (z_streamp strm, int level, int method, - int windowBits, int memLevel, - int strategy, const char *version, - int stream_size); -extern int zlib_inflateInit2_ (z_streamp strm, int windowBits, - const char *version, int stream_size); #define zlib_deflateInit(strm, level) \ - zlib_deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) + zlib_deflateInit2((strm), (level), Z_DEFLATED, MAX_WBITS, \ + DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY) #define zlib_inflateInit(strm) \ - zlib_inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) -#define zlib_deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ - zlib_deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ - (strategy), ZLIB_VERSION, sizeof(z_stream)) -#define zlib_inflateInit2(strm, windowBits) \ - zlib_inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) + zlib_inflateInit2((strm), DEF_WBITS) +extern int zlib_deflateInit2(z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy); +extern int zlib_inflateInit2(z_streamp strm, int windowBits); #if !defined(_Z_UTIL_H) && !defined(NO_DUMMY_DECL) struct internal_state {int dummy;}; /* hack for buggy compilers */ #endif -extern const char * zlib_zError (int err); -#if 0 -extern int zlib_inflateSyncPoint (z_streamp z); -#endif -extern const uLong * zlib_get_crc_table (void); - #endif /* _ZLIB_H */ diff --git a/include/linux/zorro.h b/include/linux/zorro.h index 2f135cf6e..913bfc226 100644 --- a/include/linux/zorro.h +++ b/include/linux/zorro.h @@ -11,8 +11,6 @@ #ifndef _LINUX_ZORRO_H #define _LINUX_ZORRO_H -#ifndef __ASSEMBLY__ - #include @@ -112,45 +110,6 @@ struct ConfigDev { __u32 cd_Unused[4]; /* for whatever the driver wants */ } __attribute__ ((packed)); -#else /* __ASSEMBLY__ */ - -LN_Succ = 0 -LN_Pred = LN_Succ+4 -LN_Type = LN_Pred+4 -LN_Pri = LN_Type+1 -LN_Name = LN_Pri+1 -LN_sizeof = LN_Name+4 - -ER_Type = 0 -ER_Product = ER_Type+1 -ER_Flags = ER_Product+1 -ER_Reserved03 = ER_Flags+1 -ER_Manufacturer = ER_Reserved03+1 -ER_SerialNumber = ER_Manufacturer+2 -ER_InitDiagVec = ER_SerialNumber+4 -ER_Reserved0c = ER_InitDiagVec+2 -ER_Reserved0d = ER_Reserved0c+1 -ER_Reserved0e = ER_Reserved0d+1 -ER_Reserved0f = ER_Reserved0e+1 -ER_sizeof = ER_Reserved0f+1 - -CD_Node = 0 -CD_Flags = CD_Node+LN_sizeof -CD_Pad = CD_Flags+1 -CD_Rom = CD_Pad+1 -CD_BoardAddr = CD_Rom+ER_sizeof -CD_BoardSize = CD_BoardAddr+4 -CD_SlotAddr = CD_BoardSize+4 -CD_SlotSize = CD_SlotAddr+2 -CD_Driver = CD_SlotSize+2 -CD_NextCD = CD_Driver+4 -CD_Unused = CD_NextCD+4 -CD_sizeof = CD_Unused+(4*4) - -#endif /* __ASSEMBLY__ */ - -#ifndef __ASSEMBLY__ - #define ZORRO_NUM_AUTO 16 #ifdef __KERNEL__ @@ -290,7 +249,6 @@ extern DECLARE_BITMAP(zorro_unused_z2ram, 128); #define Z2RAM_CHUNKSHIFT (16) -#endif /* !__ASSEMBLY__ */ #endif /* __KERNEL__ */ #endif /* _LINUX_ZORRO_H */ diff --git a/include/linux/zutil.h b/include/linux/zutil.h index ee0c59cf2..6adfa9a6f 100644 --- a/include/linux/zutil.h +++ b/include/linux/zutil.h @@ -23,18 +23,6 @@ typedef unsigned long ulg; /* common constants */ -#ifndef DEF_WBITS -# define DEF_WBITS MAX_WBITS -#endif -/* default windowBits for decompression. MAX_WBITS is for compression only */ - -#if MAX_MEM_LEVEL >= 8 -# define DEF_MEM_LEVEL 8 -#else -# define DEF_MEM_LEVEL MAX_MEM_LEVEL -#endif -/* default memLevel */ - #define STORED_BLOCK 0 #define STATIC_TREES 1 #define DYN_TREES 2 diff --git a/include/media/ir-common.h b/include/media/ir-common.h index 302d5b394..7bab09b0e 100644 --- a/include/media/ir-common.h +++ b/include/media/ir-common.h @@ -73,7 +73,7 @@ extern IR_KEYTAB_TYPE ir_codes_cinergy_1400[IR_KEYTAB_SIZE]; extern IR_KEYTAB_TYPE ir_codes_avertv_303[IR_KEYTAB_SIZE]; extern IR_KEYTAB_TYPE ir_codes_dntv_live_dvbt_pro[IR_KEYTAB_SIZE]; extern IR_KEYTAB_TYPE ir_codes_em_terratec[IR_KEYTAB_SIZE]; -extern IR_KEYTAB_TYPE ir_codes_em_pinnacle_usb[IR_KEYTAB_SIZE]; +extern IR_KEYTAB_TYPE ir_codes_pinnacle_grey[IR_KEYTAB_SIZE]; extern IR_KEYTAB_TYPE ir_codes_flyvideo[IR_KEYTAB_SIZE]; extern IR_KEYTAB_TYPE ir_codes_flydvb[IR_KEYTAB_SIZE]; extern IR_KEYTAB_TYPE ir_codes_cinergy[IR_KEYTAB_SIZE]; @@ -87,8 +87,9 @@ extern IR_KEYTAB_TYPE ir_codes_pctv_sedna[IR_KEYTAB_SIZE]; extern IR_KEYTAB_TYPE ir_codes_pv951[IR_KEYTAB_SIZE]; extern IR_KEYTAB_TYPE ir_codes_rc5_tv[IR_KEYTAB_SIZE]; extern IR_KEYTAB_TYPE ir_codes_winfast[IR_KEYTAB_SIZE]; -extern IR_KEYTAB_TYPE ir_codes_pinnacle[IR_KEYTAB_SIZE]; +extern IR_KEYTAB_TYPE ir_codes_pinnacle_color[IR_KEYTAB_SIZE]; extern IR_KEYTAB_TYPE ir_codes_hauppauge_new[IR_KEYTAB_SIZE]; +extern IR_KEYTAB_TYPE ir_codes_npgtech[IR_KEYTAB_SIZE]; #endif diff --git a/include/media/ir-kbd-i2c.h b/include/media/ir-kbd-i2c.h index 730f21ed9..a455f7ce5 100644 --- a/include/media/ir-kbd-i2c.h +++ b/include/media/ir-kbd-i2c.h @@ -20,5 +20,6 @@ struct IR_i2c { int (*get_key)(struct IR_i2c*, u32*, u32*); }; -int get_key_pinnacle(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw); +int get_key_pinnacle_grey(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw); +int get_key_pinnacle_color(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw); #endif diff --git a/include/media/ovcamchip.h b/include/media/ovcamchip.h index cb7c0aa96..0f43451f8 100644 --- a/include/media/ovcamchip.h +++ b/include/media/ovcamchip.h @@ -15,22 +15,9 @@ #define __LINUX_OVCAMCHIP_H #include +#include #include -/* Remove these once they are officially defined */ -#ifndef I2C_DRIVERID_OVCAMCHIP - #define I2C_DRIVERID_OVCAMCHIP 0xf00f -#endif -#ifndef I2C_HW_SMBUS_OV511 - #define I2C_HW_SMBUS_OV511 0xfe -#endif -#ifndef I2C_HW_SMBUS_OV518 - #define I2C_HW_SMBUS_OV518 0xff -#endif -#ifndef I2C_HW_SMBUS_OVFX2 - #define I2C_HW_SMBUS_OVFX2 0xfd -#endif - /* --------------------------------- */ /* ENUMERATIONS */ /* --------------------------------- */ diff --git a/include/media/saa7115.h b/include/media/saa7115.h index 6b4836f3f..9f0e2285a 100644 --- a/include/media/saa7115.h +++ b/include/media/saa7115.h @@ -1,5 +1,5 @@ /* - saa7115.h - definition for saa7113/4/5 inputs + saa7115.h - definition for saa7113/4/5 inputs and frequency flags Copyright (C) 2006 Hans Verkuil (hverkuil@xs4all.nl) @@ -33,5 +33,14 @@ #define SAA7115_SVIDEO2 8 #define SAA7115_SVIDEO3 9 +/* SAA7115 v4l2_crystal_freq frequency values */ +#define SAA7115_FREQ_32_11_MHZ 32110000 /* 32.11 MHz crystal, SAA7114/5 only */ +#define SAA7115_FREQ_24_576_MHZ 24576000 /* 24.576 MHz crystal */ + +/* SAA7115 v4l2_crystal_freq audio clock control flags */ +#define SAA7115_FREQ_FL_UCGC (1 << 0) /* SA 3A[7], UCGC, SAA7115 only */ +#define SAA7115_FREQ_FL_CGCDIV (1 << 1) /* SA 3A[6], CGCDIV, SAA7115 only */ +#define SAA7115_FREQ_FL_APLL (1 << 2) /* SA 3A[3], APLL, SAA7114/5 only */ + #endif diff --git a/include/media/saa7146_vv.h b/include/media/saa7146_vv.h index 4507cb61a..83fe2e3d1 100644 --- a/include/media/saa7146_vv.h +++ b/include/media/saa7146_vv.h @@ -2,7 +2,7 @@ #define __SAA7146_VV__ #include - +#include #include #include diff --git a/include/media/tuner-types.h b/include/media/tuner-types.h index ad9c171bf..3c43b95f4 100644 --- a/include/media/tuner-types.h +++ b/include/media/tuner-types.h @@ -20,6 +20,7 @@ struct tuner_range { struct tuner_params { enum param_type type; + /* Many Philips based tuners have a comment like this in their * datasheet: * @@ -39,6 +40,60 @@ struct tuner_params { * static unless the control byte was sent first. */ unsigned int cb_first_if_lower_freq:1; + /* Set to 1 if this tuner uses a tda9887 */ + unsigned int has_tda9887:1; + /* Many Philips tuners use tda9887 PORT1 to select the FM radio + sensitivity. If this setting is 1, then set PORT1 to 1 to + get proper FM reception. */ + unsigned int port1_fm_high_sensitivity:1; + /* Some Philips tuners use tda9887 PORT2 to select the FM radio + sensitivity. If this setting is 1, then set PORT2 to 1 to + get proper FM reception. */ + unsigned int port2_fm_high_sensitivity:1; + /* Most tuners with a tda9887 use QSS mode. Some (cheaper) tuners + use Intercarrier mode. If this setting is 1, then the tuner + needs to be set to intercarrier mode. */ + unsigned int intercarrier_mode:1; + /* This setting sets the default value for PORT1. + 0 means inactive, 1 means active. Note: the actual bit + value written to the tda9887 is inverted. So a 0 here + means a 1 in the B6 bit. */ + unsigned int port1_active:1; + /* This setting sets the default value for PORT2. + 0 means inactive, 1 means active. Note: the actual bit + value written to the tda9887 is inverted. So a 0 here + means a 1 in the B7 bit. */ + unsigned int port2_active:1; + /* Sometimes PORT1 is inverted when the SECAM-L' standard is selected. + Set this bit to 1 if this is needed. */ + unsigned int port1_invert_for_secam_lc:1; + /* Sometimes PORT2 is inverted when the SECAM-L' standard is selected. + Set this bit to 1 if this is needed. */ + unsigned int port2_invert_for_secam_lc:1; + /* Some cards require PORT1 to be 1 for mono Radio FM and 0 for stereo. */ + unsigned int port1_set_for_fm_mono:1; + /* Default tda9887 TOP value in dB for the low band. Default is 0. + Range: -16:+15 */ + signed int default_top_low:5; + /* Default tda9887 TOP value in dB for the mid band. Default is 0. + Range: -16:+15 */ + signed int default_top_mid:5; + /* Default tda9887 TOP value in dB for the high band. Default is 0. + Range: -16:+15 */ + signed int default_top_high:5; + /* Default tda9887 TOP value in dB for SECAM-L/L' for the low band. + Default is 0. Several tuners require a different TOP value for + the SECAM-L/L' standards. Range: -16:+15 */ + signed int default_top_secam_low:5; + /* Default tda9887 TOP value in dB for SECAM-L/L' for the mid band. + Default is 0. Several tuners require a different TOP value for + the SECAM-L/L' standards. Range: -16:+15 */ + signed int default_top_secam_mid:5; + /* Default tda9887 TOP value in dB for SECAM-L/L' for the high band. + Default is 0. Several tuners require a different TOP value for + the SECAM-L/L' standards. Range: -16:+15 */ + signed int default_top_secam_high:5; + unsigned int count; struct tuner_range *ranges; diff --git a/include/media/tuner.h b/include/media/tuner.h index 017fed7d5..2f7b00b08 100644 --- a/include/media/tuner.h +++ b/include/media/tuner.h @@ -25,6 +25,8 @@ #include #include +extern int tuner_debug; + #define ADDR_UNSET (255) #define TUNER_TEMIC_PAL 0 /* 4002 FH5 (3X 7756, 9483) */ @@ -108,7 +110,7 @@ #define TUNER_TEA5767 62 /* Only FM Radio Tuner */ #define TUNER_PHILIPS_FMD1216ME_MK3 63 -#define TUNER_LG_TDVS_H062F 64 /* DViCO FusionHDTV 5 */ +#define TUNER_LG_TDVS_H06XF 64 /* TDVS H061F, H062F, H064F */ #define TUNER_YMEC_TVF66T5_B_DFF 65 /* Acorp Y878F */ #define TUNER_LG_TALN 66 #define TUNER_PHILIPS_TD1316 67 @@ -119,6 +121,8 @@ #define TUNER_XCEIVE_XC3028 71 #define TUNER_THOMSON_FE6600 72 /* DViCO FusionHDTV DVB-T Hybrid */ +#define TUNER_SAMSUNG_TCPG_6121P30A 73 /* Hauppauge PVR-500 PAL */ +#define TUNER_TDA9887 74 /* This tuner should be used only internally */ /* tv card specific */ #define TDA9887_PRESENT (1<<0) @@ -190,6 +194,10 @@ struct tuner { int using_v4l2; + /* used by tda9887 */ + unsigned int tda9887_config; + unsigned char tda9887_data[4]; + /* used by MT2032 */ unsigned int xogc; unsigned int radio_if2; @@ -206,6 +214,8 @@ struct tuner { void (*set_radio_freq)(struct i2c_client *c, unsigned int freq); int (*has_signal)(struct i2c_client *c); int (*is_stereo)(struct i2c_client *c); + int (*get_afc)(struct i2c_client *c); + void (*tuner_status)(struct i2c_client *c); void (*standby)(struct i2c_client *c); }; @@ -218,6 +228,7 @@ extern int tda8290_probe(struct i2c_client *c); extern int tea5767_tuner_init(struct i2c_client *c); extern int default_tuner_init(struct i2c_client *c); extern int tea5767_autodetection(struct i2c_client *c); +extern int tda9887_tuner_init(struct i2c_client *c); #define tuner_warn(fmt, arg...) do {\ printk(KERN_WARNING "%s %d-%04x: " fmt, t->i2c.driver->driver.name, \ diff --git a/include/media/v4l2-common.h b/include/media/v4l2-common.h index 642520acd..5564db13c 100644 --- a/include/media/v4l2-common.h +++ b/include/media/v4l2-common.h @@ -26,8 +26,14 @@ #ifndef V4L2_COMMON_H_ #define V4L2_COMMON_H_ +#include + /* v4l debugging and diagnostics */ +/* Debug bitmask flags to be used on V4L2 */ +#define V4L2_DEBUG_IOCTL 0x01 +#define V4L2_DEBUG_IOCTL_ARG 0x02 + /* Common printk constucts for v4l-i2c drivers. These macros create a unique prefix consisting of the driver name, the adapter number and the i2c address. */ @@ -78,6 +84,19 @@ extern void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg); /* ------------------------------------------------------------------------- */ +/* Control helper functions */ + +int v4l2_ctrl_check(struct v4l2_ext_control *ctrl, struct v4l2_queryctrl *qctrl, + const char **menu_items); +const char **v4l2_ctrl_get_menu(u32 id); +int v4l2_ctrl_query_fill(struct v4l2_queryctrl *qctrl, s32 min, s32 max, s32 step, s32 def); +int v4l2_ctrl_query_fill_std(struct v4l2_queryctrl *qctrl); +int v4l2_ctrl_query_menu(struct v4l2_querymenu *qmenu, + struct v4l2_queryctrl *qctrl, const char **menu_items); +u32 v4l2_ctrl_next(const u32 * const *ctrl_classes, u32 id); + +/* ------------------------------------------------------------------------- */ + /* Internal ioctls */ /* VIDIOC_INT_G_REGISTER and VIDIOC_INT_S_REGISTER */ @@ -112,6 +131,8 @@ enum v4l2_chip_ident { V4L2_IDENT_SAA7129 = 159, /* module cx25840: reserved range 200-249 */ + V4L2_IDENT_CX25836 = 236, + V4L2_IDENT_CX25837 = 237, V4L2_IDENT_CX25840 = 240, V4L2_IDENT_CX25841 = 241, V4L2_IDENT_CX25842 = 242, @@ -211,4 +232,15 @@ struct v4l2_routing { #define VIDIOC_INT_S_VIDEO_ROUTING _IOW ('d', 111, struct v4l2_routing) #define VIDIOC_INT_G_VIDEO_ROUTING _IOR ('d', 112, struct v4l2_routing) +struct v4l2_crystal_freq { + u32 freq; /* frequency in Hz of the crystal */ + u32 flags; /* device specific flags */ +}; + +/* Sets the frequency of the crystal used to generate the clocks. + An extra flags field allows device specific configuration regarding + clock frequency dividers, etc. If not used, then set flags to 0. + If the frequency is not supported, then -EINVAL is returned. */ +#define VIDIOC_INT_S_CRYSTAL_FREQ _IOW ('d', 113, struct v4l2_crystal_freq) + #endif /* V4L2_COMMON_H_ */ diff --git a/include/media/video-buf-dvb.h b/include/media/video-buf-dvb.h index b78d90fe6..8233cafde 100644 --- a/include/media/video-buf-dvb.h +++ b/include/media/video-buf-dvb.h @@ -26,7 +26,8 @@ struct videobuf_dvb { int videobuf_dvb_register(struct videobuf_dvb *dvb, struct module *module, - void *adapter_priv); + void *adapter_priv, + struct device *device); void videobuf_dvb_unregister(struct videobuf_dvb *dvb); /* diff --git a/include/media/video-buf.h b/include/media/video-buf.h index fff3fd0fb..1115a2569 100644 --- a/include/media/video-buf.h +++ b/include/media/video-buf.h @@ -23,6 +23,7 @@ */ #include +#include #define UNSET (-1U) diff --git a/include/mtd/mtd-abi.h b/include/mtd/mtd-abi.h index a76ab898f..1da3f7fa7 100644 --- a/include/mtd/mtd-abi.h +++ b/include/mtd/mtd-abi.h @@ -1,14 +1,15 @@ /* - * $Id: mtd-abi.h,v 1.7 2004/11/23 15:37:32 gleixner Exp $ + * $Id: mtd-abi.h,v 1.13 2005/11/07 11:14:56 gleixner Exp $ * - * Portions of MTD ABI definition which are shared by kernel and user space + * Portions of MTD ABI definition which are shared by kernel and user space */ #ifndef __MTD_ABI_H__ #define __MTD_ABI_H__ -#ifndef __KERNEL__ /* Urgh. The whole point of splitting this out into - separate files was to avoid #ifdef __KERNEL__ */ +#ifndef __KERNEL__ +/* Urgh. The whole point of splitting this out into + separate files was to avoid #ifdef __KERNEL__ */ #define __user #endif @@ -28,26 +29,17 @@ struct mtd_oob_buf { #define MTD_ROM 2 #define MTD_NORFLASH 3 #define MTD_NANDFLASH 4 -#define MTD_PEROM 5 -#define MTD_OTHER 14 -#define MTD_UNKNOWN 15 - -#define MTD_CLEAR_BITS 1 // Bits can be cleared (flash) -#define MTD_SET_BITS 2 // Bits can be set -#define MTD_ERASEABLE 4 // Has an erase function -#define MTD_WRITEB_WRITEABLE 8 // Direct IO is possible -#define MTD_VOLATILE 16 // Set for RAMs -#define MTD_XIP 32 // eXecute-In-Place possible -#define MTD_OOB 64 // Out-of-band data (NAND flash) -#define MTD_ECC 128 // Device capable of automatic ECC -#define MTD_NO_VIRTBLOCKS 256 // Virtual blocks not allowed +#define MTD_DATAFLASH 6 + +#define MTD_WRITEABLE 0x400 /* Device is writeable */ +#define MTD_BIT_WRITEABLE 0x800 /* Single bits can be flipped */ +#define MTD_NO_ERASE 0x1000 /* No erase necessary */ // Some common devices / combinations of capabilities #define MTD_CAP_ROM 0 -#define MTD_CAP_RAM (MTD_CLEAR_BITS|MTD_SET_BITS|MTD_WRITEB_WRITEABLE) -#define MTD_CAP_NORFLASH (MTD_CLEAR_BITS|MTD_ERASEABLE) -#define MTD_CAP_NANDFLASH (MTD_CLEAR_BITS|MTD_ERASEABLE|MTD_OOB) -#define MTD_WRITEABLE (MTD_CLEAR_BITS|MTD_SET_BITS) +#define MTD_CAP_RAM (MTD_WRITEABLE | MTD_BIT_WRITEABLE | MTD_NO_ERASE) +#define MTD_CAP_NORFLASH (MTD_WRITEABLE | MTD_BIT_WRITEABLE) +#define MTD_CAP_NANDFLASH (MTD_WRITEABLE) // Types of automatic ECC/Checksum available @@ -60,39 +52,62 @@ struct mtd_oob_buf { #define MTD_NANDECC_PLACE 1 // Use the given placement in the structure (YAFFS1 legacy mode) #define MTD_NANDECC_AUTOPLACE 2 // Use the default placement scheme #define MTD_NANDECC_PLACEONLY 3 // Use the given placement in the structure (Do not store ecc result on read) +#define MTD_NANDECC_AUTOPL_USR 4 // Use the given autoplacement scheme rather than using the default + +/* OTP mode selection */ +#define MTD_OTP_OFF 0 +#define MTD_OTP_FACTORY 1 +#define MTD_OTP_USER 2 struct mtd_info_user { uint8_t type; uint32_t flags; uint32_t size; // Total size of the MTD uint32_t erasesize; - uint32_t oobblock; // Size of OOB blocks (e.g. 512) + uint32_t writesize; uint32_t oobsize; // Amount of OOB data per block (e.g. 16) uint32_t ecctype; uint32_t eccsize; }; struct region_info_user { - uint32_t offset; /* At which this region starts, + uint32_t offset; /* At which this region starts, * from the beginning of the MTD */ uint32_t erasesize; /* For this region */ uint32_t numblocks; /* Number of blocks in this region */ uint32_t regionindex; }; -#define MEMGETINFO _IOR('M', 1, struct mtd_info_user) -#define MEMERASE _IOW('M', 2, struct erase_info_user) -#define MEMWRITEOOB _IOWR('M', 3, struct mtd_oob_buf) -#define MEMREADOOB _IOWR('M', 4, struct mtd_oob_buf) -#define MEMLOCK _IOW('M', 5, struct erase_info_user) -#define MEMUNLOCK _IOW('M', 6, struct erase_info_user) +struct otp_info { + uint32_t start; + uint32_t length; + uint32_t locked; +}; + +#define MEMGETINFO _IOR('M', 1, struct mtd_info_user) +#define MEMERASE _IOW('M', 2, struct erase_info_user) +#define MEMWRITEOOB _IOWR('M', 3, struct mtd_oob_buf) +#define MEMREADOOB _IOWR('M', 4, struct mtd_oob_buf) +#define MEMLOCK _IOW('M', 5, struct erase_info_user) +#define MEMUNLOCK _IOW('M', 6, struct erase_info_user) #define MEMGETREGIONCOUNT _IOR('M', 7, int) #define MEMGETREGIONINFO _IOWR('M', 8, struct region_info_user) #define MEMSETOOBSEL _IOW('M', 9, struct nand_oobinfo) #define MEMGETOOBSEL _IOR('M', 10, struct nand_oobinfo) #define MEMGETBADBLOCK _IOW('M', 11, loff_t) #define MEMSETBADBLOCK _IOW('M', 12, loff_t) +#define OTPSELECT _IOR('M', 13, int) +#define OTPGETREGIONCOUNT _IOW('M', 14, int) +#define OTPGETREGIONINFO _IOW('M', 15, struct otp_info) +#define OTPLOCK _IOR('M', 16, struct otp_info) +#define ECCGETLAYOUT _IOR('M', 17, struct nand_ecclayout) +#define ECCGETSTATS _IOR('M', 18, struct mtd_ecc_stats) +#define MTDFILEMODE _IO('M', 19) +/* + * Obsolete legacy interface. Keep it in order not to break userspace + * interfaces + */ struct nand_oobinfo { uint32_t useecc; uint32_t eccbytes; @@ -100,4 +115,46 @@ struct nand_oobinfo { uint32_t eccpos[32]; }; +struct nand_oobfree { + uint32_t offset; + uint32_t length; +}; + +#define MTD_MAX_OOBFREE_ENTRIES 8 +/* + * ECC layout control structure. Exported to userspace for + * diagnosis and to allow creation of raw images + */ +struct nand_ecclayout { + uint32_t eccbytes; + uint32_t eccpos[64]; + uint32_t oobavail; + struct nand_oobfree oobfree[MTD_MAX_OOBFREE_ENTRIES]; +}; + +/** + * struct mtd_ecc_stats - error correction stats + * + * @corrected: number of corrected bits + * @failed: number of uncorrectable errors + * @badblocks: number of bad blocks in this partition + * @bbtblocks: number of blocks reserved for bad block tables + */ +struct mtd_ecc_stats { + uint32_t corrected; + uint32_t failed; + uint32_t badblocks; + uint32_t bbtblocks; +}; + +/* + * Read/write file modes for access to MTD + */ +enum mtd_file_modes { + MTD_MODE_NORMAL = MTD_OTP_OFF, + MTD_MODE_OTP_FACTORY = MTD_OTP_FACTORY, + MTD_MODE_OTP_USER = MTD_OTP_USER, + MTD_MODE_RAW, +}; + #endif /* __MTD_ABI_H__ */ diff --git a/include/mtd/mtd-user.h b/include/mtd/mtd-user.h index 1c13fc716..713f34d3e 100644 --- a/include/mtd/mtd-user.h +++ b/include/mtd/mtd-user.h @@ -16,5 +16,6 @@ typedef struct mtd_info_user mtd_info_t; typedef struct erase_info_user erase_info_t; typedef struct region_info_user region_info_t; typedef struct nand_oobinfo nand_oobinfo_t; +typedef struct nand_ecclayout nand_ecclayout_t; #endif /* __MTD_USER_H__ */ diff --git a/include/net/addrconf.h b/include/net/addrconf.h index 750e2508d..3d71251b3 100644 --- a/include/net/addrconf.h +++ b/include/net/addrconf.h @@ -45,7 +45,6 @@ struct prefix_info { #ifdef __KERNEL__ -#include #include #include #include diff --git a/include/net/af_unix.h b/include/net/af_unix.h index 8a10ee616..b483a036a 100644 --- a/include/net/af_unix.h +++ b/include/net/af_unix.h @@ -1,7 +1,6 @@ #ifndef __LINUX_NET_AFUNIX_H #define __LINUX_NET_AFUNIX_H -#include #include #include #include @@ -57,14 +56,21 @@ struct unix_address { struct unix_skb_parms { struct ucred creds; /* Skb credentials */ struct scm_fp_list *fp; /* Passed files */ +#ifdef CONFIG_SECURITY_NETWORK + u32 secid; /* Security ID */ +#endif }; #define UNIXCB(skb) (*(struct unix_skb_parms*)&((skb)->cb)) #define UNIXCREDS(skb) (&UNIXCB((skb)).creds) +#define UNIXSID(skb) (&UNIXCB((skb)).secid) #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_wlock_nested(s) \ + spin_lock_nested(&unix_sk(s)->lock, \ + SINGLE_DEPTH_NESTING) #define unix_state_wunlock(s) spin_unlock(&unix_sk(s)->lock) #ifdef __KERNEL__ diff --git a/include/net/ax25.h b/include/net/ax25.h index 5bd997487..69374cd1a 100644 --- a/include/net/ax25.h +++ b/include/net/ax25.h @@ -6,7 +6,6 @@ #ifndef _AX25_H #define _AX25_H -#include #include #include #include @@ -183,14 +182,26 @@ typedef struct { typedef struct ax25_route { struct ax25_route *next; - atomic_t ref; + atomic_t refcount; ax25_address callsign; struct net_device *dev; ax25_digi *digipeat; char ip_mode; - struct timer_list timer; } ax25_route; +static inline void ax25_hold_route(ax25_route *ax25_rt) +{ + atomic_inc(&ax25_rt->refcount); +} + +extern void __ax25_put_route(ax25_route *ax25_rt); + +static inline void ax25_put_route(ax25_route *ax25_rt) +{ + if (atomic_dec_and_test(&ax25_rt->refcount)) + __ax25_put_route(ax25_rt); +} + typedef struct { char slave; /* slave_mode? */ struct timer_list slave_timer; /* timeout timer */ @@ -349,17 +360,11 @@ extern int ax25_check_iframes_acked(ax25_cb *, unsigned short); extern void ax25_rt_device_down(struct net_device *); extern int ax25_rt_ioctl(unsigned int, void __user *); extern struct file_operations ax25_route_fops; +extern ax25_route *ax25_get_route(ax25_address *addr, struct net_device *dev); extern int ax25_rt_autobind(ax25_cb *, ax25_address *); -extern ax25_route *ax25_rt_find_route(ax25_route *, ax25_address *, - struct net_device *); extern struct sk_buff *ax25_rt_build_path(struct sk_buff *, ax25_address *, ax25_address *, ax25_digi *); extern void ax25_rt_free(void); -static inline void ax25_put_route(ax25_route *ax25_rt) -{ - atomic_dec(&ax25_rt->ref); -} - /* ax25_std_in.c */ extern int ax25_std_frame_in(ax25_cb *, struct sk_buff *, int); diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h index 911ceb5cd..771d17783 100644 --- a/include/net/bluetooth/bluetooth.h +++ b/include/net/bluetooth/bluetooth.h @@ -175,6 +175,6 @@ extern int hci_sock_cleanup(void); extern int bt_sysfs_init(void); extern void bt_sysfs_cleanup(void); -extern struct class bt_class; +extern struct class *bt_class; #endif /* __BLUETOOTH_H */ diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index b06a2d2f6..b2bdb1aa0 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h @@ -54,7 +54,8 @@ /* HCI device quirks */ enum { HCI_QUIRK_RESET_ON_INIT, - HCI_QUIRK_RAW_DEVICE + HCI_QUIRK_RAW_DEVICE, + HCI_QUIRK_FIXUP_BUFFER_SIZE }; /* HCI device flags */ @@ -100,9 +101,10 @@ enum { #define HCIINQUIRY _IOR('H', 240, int) /* HCI timeouts */ -#define HCI_CONN_TIMEOUT (HZ * 40) -#define HCI_DISCONN_TIMEOUT (HZ * 2) -#define HCI_CONN_IDLE_TIMEOUT (HZ * 60) +#define HCI_CONNECT_TIMEOUT (40000) /* 40 seconds */ +#define HCI_DISCONN_TIMEOUT (2000) /* 2 seconds */ +#define HCI_IDLE_TIMEOUT (6000) /* 6 seconds */ +#define HCI_INIT_TIMEOUT (10000) /* 10 seconds */ /* HCI Packet types */ #define HCI_COMMAND_PKT 0x01 @@ -144,7 +146,7 @@ enum { #define LMP_TACCURACY 0x10 #define LMP_RSWITCH 0x20 #define LMP_HOLD 0x40 -#define LMP_SNIF 0x80 +#define LMP_SNIFF 0x80 #define LMP_PARK 0x01 #define LMP_RSSI 0x02 @@ -159,13 +161,21 @@ enum { #define LMP_PSCHEME 0x02 #define LMP_PCONTROL 0x04 +#define LMP_SNIFF_SUBR 0x02 + +/* Connection modes */ +#define HCI_CM_ACTIVE 0x0000 +#define HCI_CM_HOLD 0x0001 +#define HCI_CM_SNIFF 0x0002 +#define HCI_CM_PARK 0x0003 + /* Link policies */ #define HCI_LP_RSWITCH 0x0001 #define HCI_LP_HOLD 0x0002 #define HCI_LP_SNIFF 0x0004 #define HCI_LP_PARK 0x0008 -/* Link mode */ +/* Link modes */ #define HCI_LM_ACCEPT 0x8000 #define HCI_LM_MASTER 0x0001 #define HCI_LM_AUTH 0x0002 @@ -191,7 +201,7 @@ struct hci_rp_read_loc_version { } __attribute__ ((packed)); #define OCF_READ_LOCAL_FEATURES 0x0003 -struct hci_rp_read_loc_features { +struct hci_rp_read_local_features { __u8 status; __u8 features[8]; } __attribute__ ((packed)); @@ -375,17 +385,32 @@ struct hci_cp_change_conn_link_key { } __attribute__ ((packed)); #define OCF_READ_REMOTE_FEATURES 0x001B -struct hci_cp_read_rmt_features { +struct hci_cp_read_remote_features { __le16 handle; } __attribute__ ((packed)); #define OCF_READ_REMOTE_VERSION 0x001D -struct hci_cp_read_rmt_version { +struct hci_cp_read_remote_version { __le16 handle; } __attribute__ ((packed)); /* Link Policy */ -#define OGF_LINK_POLICY 0x02 +#define OGF_LINK_POLICY 0x02 + +#define OCF_SNIFF_MODE 0x0003 +struct hci_cp_sniff_mode { + __le16 handle; + __le16 max_interval; + __le16 min_interval; + __le16 attempt; + __le16 timeout; +} __attribute__ ((packed)); + +#define OCF_EXIT_SNIFF_MODE 0x0004 +struct hci_cp_exit_sniff_mode { + __le16 handle; +} __attribute__ ((packed)); + #define OCF_ROLE_DISCOVERY 0x0009 struct hci_cp_role_discovery { __le16 handle; @@ -406,7 +431,7 @@ struct hci_rp_read_link_policy { __le16 policy; } __attribute__ ((packed)); -#define OCF_SWITCH_ROLE 0x000B +#define OCF_SWITCH_ROLE 0x000B struct hci_cp_switch_role { bdaddr_t bdaddr; __u8 role; @@ -422,6 +447,14 @@ struct hci_rp_write_link_policy { __le16 handle; } __attribute__ ((packed)); +#define OCF_SNIFF_SUBRATE 0x0011 +struct hci_cp_sniff_subrate { + __le16 handle; + __le16 max_latency; + __le16 min_remote_timeout; + __le16 min_local_timeout; +} __attribute__ ((packed)); + /* Status params */ #define OGF_STATUS_PARAM 0x05 @@ -581,15 +614,15 @@ struct hci_ev_link_key_notify { __u8 key_type; } __attribute__ ((packed)); -#define HCI_EV_RMT_FEATURES 0x0B -struct hci_ev_rmt_features { +#define HCI_EV_REMOTE_FEATURES 0x0B +struct hci_ev_remote_features { __u8 status; __le16 handle; __u8 features[8]; } __attribute__ ((packed)); -#define HCI_EV_RMT_VERSION 0x0C -struct hci_ev_rmt_version { +#define HCI_EV_REMOTE_VERSION 0x0C +struct hci_ev_remote_version { __u8 status; __le16 handle; __u8 lmp_ver; @@ -610,6 +643,16 @@ struct hci_ev_pscan_rep_mode { __u8 pscan_rep_mode; } __attribute__ ((packed)); +#define HCI_EV_SNIFF_SUBRATE 0x2E +struct hci_ev_sniff_subrate { + __u8 status; + __le16 handle; + __le16 max_tx_latency; + __le16 max_rx_latency; + __le16 max_remote_timeout; + __le16 max_local_timeout; +} __attribute__ ((packed)); + /* Internal events generated by Bluetooth stack */ #define HCI_EV_STACK_INTERNAL 0xFD struct hci_ev_stack_internal { diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index bb9f81dc8..d84855fe7 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -31,10 +31,7 @@ #define HCI_PROTO_L2CAP 0 #define HCI_PROTO_SCO 1 -#define HCI_INIT_TIMEOUT (HZ * 10) - /* HCI Core structures */ - struct inquiry_data { bdaddr_t bdaddr; __u8 pscan_rep_mode; @@ -81,6 +78,10 @@ struct hci_dev { __u16 link_policy; __u16 link_mode; + __u32 idle_timeout; + __u16 sniff_min_interval; + __u16 sniff_max_interval; + unsigned long quirks; atomic_t cmd_cnt; @@ -123,7 +124,8 @@ struct hci_dev { atomic_t promisc; - struct class_device class_dev; + struct device *parent; + struct device dev; struct module *owner; @@ -145,18 +147,24 @@ struct hci_conn { bdaddr_t dst; __u16 handle; __u16 state; + __u8 mode; __u8 type; __u8 out; __u8 dev_class[3]; + __u8 features[8]; + __u16 interval; + __u16 link_policy; __u32 link_mode; + __u8 power_save; unsigned long pend; - + unsigned int sent; - + struct sk_buff_head data_q; - struct timer_list timer; - + struct timer_list disc_timer; + struct timer_list idle_timer; + struct hci_dev *hdev; void *l2cap_data; void *sco_data; @@ -211,7 +219,8 @@ void hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data); enum { HCI_CONN_AUTH_PEND, HCI_CONN_ENCRYPT_PEND, - HCI_CONN_RSWITCH_PEND + HCI_CONN_RSWITCH_PEND, + HCI_CONN_MODE_CHANGE_PEND, }; static inline void hci_conn_hash_init(struct hci_dev *hdev) @@ -286,31 +295,27 @@ int hci_conn_encrypt(struct hci_conn *conn); int hci_conn_change_link_key(struct hci_conn *conn); int hci_conn_switch_role(struct hci_conn *conn, uint8_t role); -static inline void hci_conn_set_timer(struct hci_conn *conn, unsigned long timeout) -{ - mod_timer(&conn->timer, jiffies + timeout); -} - -static inline void hci_conn_del_timer(struct hci_conn *conn) -{ - del_timer(&conn->timer); -} +void hci_conn_enter_active_mode(struct hci_conn *conn); +void hci_conn_enter_sniff_mode(struct hci_conn *conn); static inline void hci_conn_hold(struct hci_conn *conn) { atomic_inc(&conn->refcnt); - hci_conn_del_timer(conn); + del_timer(&conn->disc_timer); } static inline void hci_conn_put(struct hci_conn *conn) { if (atomic_dec_and_test(&conn->refcnt)) { + unsigned long timeo; if (conn->type == ACL_LINK) { - unsigned long timeo = (conn->out) ? - HCI_DISCONN_TIMEOUT : HCI_DISCONN_TIMEOUT * 2; - hci_conn_set_timer(conn, timeo); + timeo = msecs_to_jiffies(HCI_DISCONN_TIMEOUT); + if (!conn->out) + timeo *= 2; + del_timer(&conn->idle_timer); } else - hci_conn_set_timer(conn, HZ / 100); + timeo = msecs_to_jiffies(10); + mod_timer(&conn->disc_timer, jiffies + timeo); } } @@ -408,11 +413,13 @@ static inline int hci_recv_frame(struct sk_buff *skb) int hci_register_sysfs(struct hci_dev *hdev); void hci_unregister_sysfs(struct hci_dev *hdev); -#define SET_HCIDEV_DEV(hdev, pdev) ((hdev)->class_dev.dev = (pdev)) +#define SET_HCIDEV_DEV(hdev, pdev) ((hdev)->parent = (pdev)) /* ----- LMP capabilities ----- */ -#define lmp_rswitch_capable(dev) (dev->features[0] & LMP_RSWITCH) -#define lmp_encrypt_capable(dev) (dev->features[0] & LMP_ENCRYPT) +#define lmp_rswitch_capable(dev) ((dev)->features[0] & LMP_RSWITCH) +#define lmp_encrypt_capable(dev) ((dev)->features[0] & LMP_ENCRYPT) +#define lmp_sniff_capable(dev) ((dev)->features[0] & LMP_SNIFF) +#define lmp_sniffsubr_capable(dev) ((dev)->features[5] & LMP_SNIFF_SUBR) /* ----- HCI protocols ----- */ struct hci_proto { diff --git a/include/net/compat.h b/include/net/compat.h index e65cbedb6..9859b6028 100644 --- a/include/net/compat.h +++ b/include/net/compat.h @@ -1,7 +1,6 @@ #ifndef NET_COMPAT_H #define NET_COMPAT_H -#include struct sock; diff --git a/include/net/dst.h b/include/net/dst.h index 5161e8901..36d54fc24 100644 --- a/include/net/dst.h +++ b/include/net/dst.h @@ -8,7 +8,6 @@ #ifndef _NET_DST_H #define _NET_DST_H -#include #include #include #include diff --git a/include/net/genetlink.h b/include/net/genetlink.h index 805de50df..8c2287264 100644 --- a/include/net/genetlink.h +++ b/include/net/genetlink.h @@ -150,4 +150,24 @@ static inline int genlmsg_unicast(struct sk_buff *skb, u32 pid) return nlmsg_unicast(genl_sock, skb, pid); } +/** + * gennlmsg_data - head of message payload + * @gnlh: genetlink messsage header + */ +static inline void *genlmsg_data(const struct genlmsghdr *gnlh) +{ + return ((unsigned char *) gnlh + GENL_HDRLEN); +} + +/** + * genlmsg_len - length of message payload + * @gnlh: genetlink message header + */ +static inline int genlmsg_len(const struct genlmsghdr *gnlh) +{ + struct nlmsghdr *nlh = (struct nlmsghdr *)((unsigned char *)gnlh - + NLMSG_HDRLEN); + return (nlh->nlmsg_len - GENL_HDRLEN - NLMSG_HDRLEN); +} + #endif /* __NET_GENERIC_NETLINK_H */ diff --git a/include/net/icmp.h b/include/net/icmp.h index 7ea37ea94..afde98fd9 100644 --- a/include/net/icmp.h +++ b/include/net/icmp.h @@ -18,7 +18,6 @@ #ifndef _ICMP_H #define _ICMP_H -#include #include #include diff --git a/include/net/ieee80211.h b/include/net/ieee80211.h index 7fe57f957..ecc42864b 100644 --- a/include/net/ieee80211.h +++ b/include/net/ieee80211.h @@ -11,27 +11,25 @@ * * Adaption to a generic IEEE 802.11 stack by James Ketrenos * - * Copyright (c) 2004, Intel Corporation + * Copyright (c) 2004-2005, Intel Corporation * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. See README and COPYING for * more details. + * + * API Version History + * 1.0.x -- Initial version + * 1.1.x -- Added radiotap, QoS, TIM, ieee80211_geo APIs, + * various structure changes, and crypto API init method */ #ifndef IEEE80211_H #define IEEE80211_H +#include /* ETH_ALEN */ +#include /* ARRAY_SIZE */ +#include -#include /* ETH_ALEN */ -#include /* ARRAY_SIZE */ - -#if WIRELESS_EXT < 17 -#define IW_QUAL_QUAL_INVALID 0x10 -#define IW_QUAL_LEVEL_INVALID 0x20 -#define IW_QUAL_NOISE_INVALID 0x40 -#define IW_QUAL_QUAL_UPDATED 0x1 -#define IW_QUAL_LEVEL_UPDATED 0x2 -#define IW_QUAL_NOISE_UPDATED 0x4 -#endif +#define IEEE80211_VERSION "git-1.1.13" #define IEEE80211_DATA_LEN 2304 /* Maximum size for the MA-UNITDATA primitive, 802.11 standard section @@ -42,67 +40,19 @@ represents the 2304 bytes of real data, plus a possible 8 bytes of WEP IV and ICV. (this interpretation suggested by Ramiro Barreiro) */ - -#define IEEE80211_HLEN 30 -#define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN) - -struct ieee80211_hdr { - u16 frame_ctl; - u16 duration_id; - u8 addr1[ETH_ALEN]; - u8 addr2[ETH_ALEN]; - u8 addr3[ETH_ALEN]; - u16 seq_ctl; - u8 addr4[ETH_ALEN]; -} __attribute__ ((packed)); - -struct ieee80211_hdr_3addr { - u16 frame_ctl; - u16 duration_id; - u8 addr1[ETH_ALEN]; - u8 addr2[ETH_ALEN]; - u8 addr3[ETH_ALEN]; - u16 seq_ctl; -} __attribute__ ((packed)); - -enum eap_type { - EAP_PACKET = 0, - EAPOL_START, - EAPOL_LOGOFF, - EAPOL_KEY, - EAPOL_ENCAP_ASF_ALERT -}; - -static const char *eap_types[] = { - [EAP_PACKET] = "EAP-Packet", - [EAPOL_START] = "EAPOL-Start", - [EAPOL_LOGOFF] = "EAPOL-Logoff", - [EAPOL_KEY] = "EAPOL-Key", - [EAPOL_ENCAP_ASF_ALERT] = "EAPOL-Encap-ASF-Alert" -}; - -static inline const char *eap_get_type(int type) -{ - return (type >= ARRAY_SIZE(eap_types)) ? "Unknown" : eap_types[type]; -} - -struct eapol { - u8 snap[6]; - u16 ethertype; - u8 version; - u8 type; - u16 length; -} __attribute__ ((packed)); - +#define IEEE80211_1ADDR_LEN 10 +#define IEEE80211_2ADDR_LEN 16 #define IEEE80211_3ADDR_LEN 24 #define IEEE80211_4ADDR_LEN 30 #define IEEE80211_FCS_LEN 4 +#define IEEE80211_HLEN (IEEE80211_4ADDR_LEN) +#define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN) #define MIN_FRAG_THRESHOLD 256U #define MAX_FRAG_THRESHOLD 2346U /* Frame control field constants */ -#define IEEE80211_FCTL_VERS 0x0002 +#define IEEE80211_FCTL_VERS 0x0003 #define IEEE80211_FCTL_FTYPE 0x000c #define IEEE80211_FCTL_STYPE 0x00f0 #define IEEE80211_FCTL_TODS 0x0100 @@ -110,8 +60,8 @@ struct eapol { #define IEEE80211_FCTL_MOREFRAGS 0x0400 #define IEEE80211_FCTL_RETRY 0x0800 #define IEEE80211_FCTL_PM 0x1000 -#define IEEE80211_FCTL_MOREDATA 0x2000 -#define IEEE80211_FCTL_WEP 0x4000 +#define IEEE80211_FCTL_MOREDATA 0x2000 +#define IEEE80211_FCTL_PROTECTED 0x4000 #define IEEE80211_FCTL_ORDER 0x8000 #define IEEE80211_FTYPE_MGMT 0x0000 @@ -130,6 +80,7 @@ struct eapol { #define IEEE80211_STYPE_DISASSOC 0x00A0 #define IEEE80211_STYPE_AUTH 0x00B0 #define IEEE80211_STYPE_DEAUTH 0x00C0 +#define IEEE80211_STYPE_ACTION 0x00D0 /* control */ #define IEEE80211_STYPE_PSPOLL 0x00A0 @@ -148,10 +99,13 @@ struct eapol { #define IEEE80211_STYPE_CFACK 0x0050 #define IEEE80211_STYPE_CFPOLL 0x0060 #define IEEE80211_STYPE_CFACKPOLL 0x0070 +#define IEEE80211_STYPE_QOS_DATA 0x0080 #define IEEE80211_SCTL_FRAG 0x000F #define IEEE80211_SCTL_SEQ 0xFFF0 +/* QOS control */ +#define IEEE80211_QCTL_TID 0x000F /* debug macros */ @@ -163,10 +117,19 @@ do { if (ieee80211_debug_level & (level)) \ in_interrupt() ? 'I' : 'U', __FUNCTION__ , ## args); } while (0) #else #define IEEE80211_DEBUG(level, fmt, args...) do {} while (0) -#endif /* CONFIG_IEEE80211_DEBUG */ +#endif /* CONFIG_IEEE80211_DEBUG */ + +/* debug macros not dependent on CONFIG_IEEE80211_DEBUG */ + +#define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x" +#define MAC_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5] + +/* escape_essid() is intended to be used in debug (and possibly error) + * messages. It should never be used for passing essid to user space. */ +const char *escape_essid(const char *essid, u8 essid_len); /* - * To use the debug system; + * To use the debug system: * * If you are defining a new debug classification, simply add it to the #define * list here in the form of: @@ -182,11 +145,11 @@ do { if (ieee80211_debug_level & (level)) \ * * To add your debug level to the list of levels seen when you perform * - * % cat /proc/net/ipw/debug_level + * % cat /proc/net/ieee80211/debug_level * - * you simply need to add your entry to the ipw_debug_levels array. + * you simply need to add your entry to the ieee80211_debug_level array. * - * If you do not see debug_level in /proc/net/ipw then you do not have + * If you do not see debug_level in /proc/net/ieee80211 then you do not have * CONFIG_IEEE80211_DEBUG defined in your kernel configuration * */ @@ -197,11 +160,11 @@ do { if (ieee80211_debug_level & (level)) \ #define IEEE80211_DL_STATE (1<<3) #define IEEE80211_DL_MGMT (1<<4) #define IEEE80211_DL_FRAG (1<<5) -#define IEEE80211_DL_EAP (1<<6) #define IEEE80211_DL_DROP (1<<7) #define IEEE80211_DL_TX (1<<8) #define IEEE80211_DL_RX (1<<9) +#define IEEE80211_DL_QOS (1<<31) #define IEEE80211_ERROR(f, a...) printk(KERN_ERR "ieee80211: " f, ## a) #define IEEE80211_WARNING(f, a...) printk(KERN_WARNING "ieee80211: " f, ## a) @@ -212,24 +175,24 @@ do { if (ieee80211_debug_level & (level)) \ #define IEEE80211_DEBUG_STATE(f, a...) IEEE80211_DEBUG(IEEE80211_DL_STATE, f, ## a) #define IEEE80211_DEBUG_MGMT(f, a...) IEEE80211_DEBUG(IEEE80211_DL_MGMT, f, ## a) #define IEEE80211_DEBUG_FRAG(f, a...) IEEE80211_DEBUG(IEEE80211_DL_FRAG, f, ## a) -#define IEEE80211_DEBUG_EAP(f, a...) IEEE80211_DEBUG(IEEE80211_DL_EAP, f, ## a) #define IEEE80211_DEBUG_DROP(f, a...) IEEE80211_DEBUG(IEEE80211_DL_DROP, f, ## a) #define IEEE80211_DEBUG_TX(f, a...) IEEE80211_DEBUG(IEEE80211_DL_TX, f, ## a) #define IEEE80211_DEBUG_RX(f, a...) IEEE80211_DEBUG(IEEE80211_DL_RX, f, ## a) +#define IEEE80211_DEBUG_QOS(f, a...) IEEE80211_DEBUG(IEEE80211_DL_QOS, f, ## a) #include #include -#include /* ARPHRD_ETHER */ +#include /* ARPHRD_ETHER */ #ifndef WIRELESS_SPY -#define WIRELESS_SPY // enable iwspy support +#define WIRELESS_SPY /* enable iwspy support */ #endif -#include // new driver API +#include /* new driver API */ #ifndef ETH_P_PAE -#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */ -#endif /* ETH_P_PAE */ +#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */ +#endif /* ETH_P_PAE */ -#define ETH_P_PREAUTH 0x88C7 /* IEEE 802.11i pre-authentication */ +#define ETH_P_PREAUTH 0x88C7 /* IEEE 802.11i pre-authentication */ #ifndef ETH_P_80211_RAW #define ETH_P_80211_RAW (ETH_P_ECONET + 1) @@ -241,15 +204,16 @@ do { if (ieee80211_debug_level & (level)) \ struct ieee80211_snap_hdr { - u8 dsap; /* always 0xAA */ - u8 ssap; /* always 0xAA */ - u8 ctrl; /* always 0x03 */ - u8 oui[P80211_OUI_LEN]; /* organizational universal id */ + u8 dsap; /* always 0xAA */ + u8 ssap; /* always 0xAA */ + u8 ctrl; /* always 0x03 */ + u8 oui[P80211_OUI_LEN]; /* organizational universal id */ } __attribute__ ((packed)); #define SNAP_SIZE sizeof(struct ieee80211_snap_hdr) +#define WLAN_FC_GET_VERS(fc) ((fc) & IEEE80211_FCTL_VERS) #define WLAN_FC_GET_TYPE(fc) ((fc) & IEEE80211_FCTL_FTYPE) #define WLAN_FC_GET_STYPE(fc) ((fc) & IEEE80211_FCTL_STYPE) @@ -259,10 +223,11 @@ struct ieee80211_snap_hdr { /* Authentication algorithms */ #define WLAN_AUTH_OPEN 0 #define WLAN_AUTH_SHARED_KEY 1 +#define WLAN_AUTH_LEAP 2 #define WLAN_AUTH_CHALLENGE_LEN 128 -#define WLAN_CAPABILITY_BSS (1<<0) +#define WLAN_CAPABILITY_ESS (1<<0) #define WLAN_CAPABILITY_IBSS (1<<1) #define WLAN_CAPABILITY_CF_POLLABLE (1<<2) #define WLAN_CAPABILITY_CF_POLL_REQUEST (1<<3) @@ -270,52 +235,90 @@ struct ieee80211_snap_hdr { #define WLAN_CAPABILITY_SHORT_PREAMBLE (1<<5) #define WLAN_CAPABILITY_PBCC (1<<6) #define WLAN_CAPABILITY_CHANNEL_AGILITY (1<<7) +#define WLAN_CAPABILITY_SPECTRUM_MGMT (1<<8) +#define WLAN_CAPABILITY_QOS (1<<9) +#define WLAN_CAPABILITY_SHORT_SLOT_TIME (1<<10) +#define WLAN_CAPABILITY_DSSS_OFDM (1<<13) /* Status codes */ -#define WLAN_STATUS_SUCCESS 0 -#define WLAN_STATUS_UNSPECIFIED_FAILURE 1 -#define WLAN_STATUS_CAPS_UNSUPPORTED 10 -#define WLAN_STATUS_REASSOC_NO_ASSOC 11 -#define WLAN_STATUS_ASSOC_DENIED_UNSPEC 12 -#define WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG 13 -#define WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION 14 -#define WLAN_STATUS_CHALLENGE_FAIL 15 -#define WLAN_STATUS_AUTH_TIMEOUT 16 -#define WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA 17 -#define WLAN_STATUS_ASSOC_DENIED_RATES 18 -/* 802.11b */ -#define WLAN_STATUS_ASSOC_DENIED_NOSHORT 19 -#define WLAN_STATUS_ASSOC_DENIED_NOPBCC 20 -#define WLAN_STATUS_ASSOC_DENIED_NOAGILITY 21 +enum ieee80211_statuscode { + WLAN_STATUS_SUCCESS = 0, + WLAN_STATUS_UNSPECIFIED_FAILURE = 1, + WLAN_STATUS_CAPS_UNSUPPORTED = 10, + WLAN_STATUS_REASSOC_NO_ASSOC = 11, + WLAN_STATUS_ASSOC_DENIED_UNSPEC = 12, + WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG = 13, + WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION = 14, + WLAN_STATUS_CHALLENGE_FAIL = 15, + WLAN_STATUS_AUTH_TIMEOUT = 16, + WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA = 17, + WLAN_STATUS_ASSOC_DENIED_RATES = 18, + /* 802.11b */ + WLAN_STATUS_ASSOC_DENIED_NOSHORTPREAMBLE = 19, + WLAN_STATUS_ASSOC_DENIED_NOPBCC = 20, + WLAN_STATUS_ASSOC_DENIED_NOAGILITY = 21, + /* 802.11h */ + WLAN_STATUS_ASSOC_DENIED_NOSPECTRUM = 22, + WLAN_STATUS_ASSOC_REJECTED_BAD_POWER = 23, + WLAN_STATUS_ASSOC_REJECTED_BAD_SUPP_CHAN = 24, + /* 802.11g */ + WLAN_STATUS_ASSOC_DENIED_NOSHORTTIME = 25, + WLAN_STATUS_ASSOC_DENIED_NODSSSOFDM = 26, + /* 802.11i */ + WLAN_STATUS_INVALID_IE = 40, + WLAN_STATUS_INVALID_GROUP_CIPHER = 41, + WLAN_STATUS_INVALID_PAIRWISE_CIPHER = 42, + WLAN_STATUS_INVALID_AKMP = 43, + WLAN_STATUS_UNSUPP_RSN_VERSION = 44, + WLAN_STATUS_INVALID_RSN_IE_CAP = 45, + WLAN_STATUS_CIPHER_SUITE_REJECTED = 46, +}; /* Reason codes */ -#define WLAN_REASON_UNSPECIFIED 1 -#define WLAN_REASON_PREV_AUTH_NOT_VALID 2 -#define WLAN_REASON_DEAUTH_LEAVING 3 -#define WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY 4 -#define WLAN_REASON_DISASSOC_AP_BUSY 5 -#define WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA 6 -#define WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA 7 -#define WLAN_REASON_DISASSOC_STA_HAS_LEFT 8 -#define WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH 9 - - -/* Information Element IDs */ -#define WLAN_EID_SSID 0 -#define WLAN_EID_SUPP_RATES 1 -#define WLAN_EID_FH_PARAMS 2 -#define WLAN_EID_DS_PARAMS 3 -#define WLAN_EID_CF_PARAMS 4 -#define WLAN_EID_TIM 5 -#define WLAN_EID_IBSS_PARAMS 6 -#define WLAN_EID_CHALLENGE 16 -#define WLAN_EID_RSN 48 -#define WLAN_EID_GENERIC 221 - -#define IEEE80211_MGMT_HDR_LEN 24 -#define IEEE80211_DATA_HDR3_LEN 24 -#define IEEE80211_DATA_HDR4_LEN 30 +enum ieee80211_reasoncode { + WLAN_REASON_UNSPECIFIED = 1, + WLAN_REASON_PREV_AUTH_NOT_VALID = 2, + WLAN_REASON_DEAUTH_LEAVING = 3, + WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY = 4, + WLAN_REASON_DISASSOC_AP_BUSY = 5, + WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA = 6, + WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA = 7, + WLAN_REASON_DISASSOC_STA_HAS_LEFT = 8, + WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH = 9, + /* 802.11h */ + WLAN_REASON_DISASSOC_BAD_POWER = 10, + WLAN_REASON_DISASSOC_BAD_SUPP_CHAN = 11, + /* 802.11i */ + WLAN_REASON_INVALID_IE = 13, + WLAN_REASON_MIC_FAILURE = 14, + WLAN_REASON_4WAY_HANDSHAKE_TIMEOUT = 15, + WLAN_REASON_GROUP_KEY_HANDSHAKE_TIMEOUT = 16, + WLAN_REASON_IE_DIFFERENT = 17, + WLAN_REASON_INVALID_GROUP_CIPHER = 18, + WLAN_REASON_INVALID_PAIRWISE_CIPHER = 19, + WLAN_REASON_INVALID_AKMP = 20, + WLAN_REASON_UNSUPP_RSN_VERSION = 21, + WLAN_REASON_INVALID_RSN_IE_CAP = 22, + WLAN_REASON_IEEE8021X_FAILED = 23, + WLAN_REASON_CIPHER_SUITE_REJECTED = 24, +}; +/* Action categories - 802.11h */ +enum ieee80211_actioncategories { + WLAN_ACTION_SPECTRUM_MGMT = 0, + /* Reserved 1-127 */ + /* Error 128-255 */ +}; + +/* Action details - 802.11h */ +enum ieee80211_actiondetails { + WLAN_ACTION_CATEGORY_MEASURE_REQUEST = 0, + WLAN_ACTION_CATEGORY_MEASURE_REPORT = 1, + WLAN_ACTION_CATEGORY_TPC_REQUEST = 2, + WLAN_ACTION_CATEGORY_TPC_REPORT = 3, + WLAN_ACTION_CATEGORY_CHANNEL_SWITCH = 4, + /* 5 - 255 Reserved */ +}; #define IEEE80211_STATMASK_SIGNAL (1<<0) #define IEEE80211_STATMASK_RSSI (1<<1) @@ -323,7 +326,6 @@ struct ieee80211_snap_hdr { #define IEEE80211_STATMASK_RATE (1<<3) #define IEEE80211_STATMASK_WEMASK 0x7 - #define IEEE80211_CCK_MODULATION (1<<0) #define IEEE80211_OFDM_MODULATION (1<<1) @@ -381,23 +383,23 @@ struct ieee80211_snap_hdr { #define IEEE80211_NUM_CCK_RATES 4 #define IEEE80211_OFDM_SHIFT_MASK_A 4 - - - /* NOTE: This data is for statistical purposes; not all hardware provides this - * information for frames received. Not setting these will not cause - * any adverse affects. */ + * information for frames received. + * For ieee80211_rx_mgt, you need to set at least the 'len' parameter. + */ struct ieee80211_rx_stats { u32 mac_time; s8 rssi; u8 signal; u8 noise; - u16 rate; /* in 100 kbps */ + u16 rate; /* in 100 kbps */ u8 received_channel; u8 control; u8 mask; u8 freq; u16 len; + u64 tsf; + u32 beacon_time; }; /* IEEE 802.11 requires that STA supports concurrent reception of at least @@ -441,38 +443,46 @@ struct ieee80211_stats { struct ieee80211_device; -#define SEC_KEY_1 (1<<0) -#define SEC_KEY_2 (1<<1) -#define SEC_KEY_3 (1<<2) -#define SEC_KEY_4 (1<<3) -#define SEC_ACTIVE_KEY (1<<4) -#define SEC_AUTH_MODE (1<<5) -#define SEC_UNICAST_GROUP (1<<6) -#define SEC_LEVEL (1<<7) -#define SEC_ENABLED (1<<8) - -#define SEC_LEVEL_0 0 /* None */ -#define SEC_LEVEL_1 1 /* WEP 40 and 104 bit */ -#define SEC_LEVEL_2 2 /* Level 1 + TKIP */ -#define SEC_LEVEL_2_CKIP 3 /* Level 1 + CKIP */ -#define SEC_LEVEL_3 4 /* Level 2 + CCMP */ - -#define WEP_KEYS 4 -#define WEP_KEY_LEN 13 +#include "ieee80211_crypt.h" + +#define SEC_KEY_1 (1<<0) +#define SEC_KEY_2 (1<<1) +#define SEC_KEY_3 (1<<2) +#define SEC_KEY_4 (1<<3) +#define SEC_ACTIVE_KEY (1<<4) +#define SEC_AUTH_MODE (1<<5) +#define SEC_UNICAST_GROUP (1<<6) +#define SEC_LEVEL (1<<7) +#define SEC_ENABLED (1<<8) +#define SEC_ENCRYPT (1<<9) + +#define SEC_LEVEL_0 0 /* None */ +#define SEC_LEVEL_1 1 /* WEP 40 and 104 bit */ +#define SEC_LEVEL_2 2 /* Level 1 + TKIP */ +#define SEC_LEVEL_2_CKIP 3 /* Level 1 + CKIP */ +#define SEC_LEVEL_3 4 /* Level 2 + CCMP */ + +#define SEC_ALG_NONE 0 +#define SEC_ALG_WEP 1 +#define SEC_ALG_TKIP 2 +#define SEC_ALG_CCMP 3 + +#define WEP_KEYS 4 +#define WEP_KEY_LEN 13 +#define SCM_KEY_LEN 32 +#define SCM_TEMPORAL_KEY_LENGTH 16 struct ieee80211_security { u16 active_key:2, - enabled:1, - auth_mode:2, - auth_algo:4, - unicast_uses_group:1; + enabled:1, + auth_mode:2, auth_algo:4, unicast_uses_group:1, encrypt:1; + u8 encode_alg[WEP_KEYS]; u8 key_sizes[WEP_KEYS]; - u8 keys[WEP_KEYS][WEP_KEY_LEN]; + u8 keys[WEP_KEYS][SCM_KEY_LEN]; u8 level; u16 flags; } __attribute__ ((packed)); - /* 802.11 data frame from AP @@ -488,33 +498,105 @@ Total: 28-2340 bytes */ -struct ieee80211_header_data { - u16 frame_ctl; - u16 duration_id; - u8 addr1[6]; - u8 addr2[6]; - u8 addr3[6]; - u16 seq_ctrl; -}; - #define BEACON_PROBE_SSID_ID_POSITION 12 /* Management Frame Information Element Types */ -#define MFIE_TYPE_SSID 0 -#define MFIE_TYPE_RATES 1 -#define MFIE_TYPE_FH_SET 2 -#define MFIE_TYPE_DS_SET 3 -#define MFIE_TYPE_CF_SET 4 -#define MFIE_TYPE_TIM 5 -#define MFIE_TYPE_IBSS_SET 6 -#define MFIE_TYPE_CHALLENGE 16 -#define MFIE_TYPE_RSN 48 -#define MFIE_TYPE_RATES_EX 50 -#define MFIE_TYPE_GENERIC 221 - -struct ieee80211_info_element_hdr { - u8 id; - u8 len; +enum ieee80211_mfie { + MFIE_TYPE_SSID = 0, + MFIE_TYPE_RATES = 1, + MFIE_TYPE_FH_SET = 2, + MFIE_TYPE_DS_SET = 3, + MFIE_TYPE_CF_SET = 4, + MFIE_TYPE_TIM = 5, + MFIE_TYPE_IBSS_SET = 6, + MFIE_TYPE_COUNTRY = 7, + MFIE_TYPE_HOP_PARAMS = 8, + MFIE_TYPE_HOP_TABLE = 9, + MFIE_TYPE_REQUEST = 10, + MFIE_TYPE_CHALLENGE = 16, + MFIE_TYPE_POWER_CONSTRAINT = 32, + MFIE_TYPE_POWER_CAPABILITY = 33, + MFIE_TYPE_TPC_REQUEST = 34, + MFIE_TYPE_TPC_REPORT = 35, + MFIE_TYPE_SUPP_CHANNELS = 36, + MFIE_TYPE_CSA = 37, + MFIE_TYPE_MEASURE_REQUEST = 38, + MFIE_TYPE_MEASURE_REPORT = 39, + MFIE_TYPE_QUIET = 40, + MFIE_TYPE_IBSS_DFS = 41, + MFIE_TYPE_ERP_INFO = 42, + MFIE_TYPE_RSN = 48, + MFIE_TYPE_RATES_EX = 50, + MFIE_TYPE_GENERIC = 221, + MFIE_TYPE_QOS_PARAMETER = 222, +}; + +/* Minimal header; can be used for passing 802.11 frames with sufficient + * information to determine what type of underlying data type is actually + * stored in the data. */ +struct ieee80211_hdr { + __le16 frame_ctl; + __le16 duration_id; + u8 payload[0]; +} __attribute__ ((packed)); + +struct ieee80211_hdr_1addr { + __le16 frame_ctl; + __le16 duration_id; + u8 addr1[ETH_ALEN]; + u8 payload[0]; +} __attribute__ ((packed)); + +struct ieee80211_hdr_2addr { + __le16 frame_ctl; + __le16 duration_id; + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + u8 payload[0]; +} __attribute__ ((packed)); + +struct ieee80211_hdr_3addr { + __le16 frame_ctl; + __le16 duration_id; + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + u8 addr3[ETH_ALEN]; + __le16 seq_ctl; + u8 payload[0]; +} __attribute__ ((packed)); + +struct ieee80211_hdr_4addr { + __le16 frame_ctl; + __le16 duration_id; + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + u8 addr3[ETH_ALEN]; + __le16 seq_ctl; + u8 addr4[ETH_ALEN]; + u8 payload[0]; +} __attribute__ ((packed)); + +struct ieee80211_hdr_3addrqos { + __le16 frame_ctl; + __le16 duration_id; + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + u8 addr3[ETH_ALEN]; + __le16 seq_ctl; + u8 payload[0]; + __le16 qos_ctl; +} __attribute__ ((packed)); + +struct ieee80211_hdr_4addrqos { + __le16 frame_ctl; + __le16 duration_id; + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + u8 addr3[ETH_ALEN]; + __le16 seq_ctl; + u8 addr4[ETH_ALEN]; + u8 payload[0]; + __le16 qos_ctl; } __attribute__ ((packed)); struct ieee80211_info_element { @@ -540,50 +622,100 @@ struct ieee80211_info_element { u16 status; */ -struct ieee80211_authentication { - struct ieee80211_header_data header; - u16 algorithm; - u16 transaction; - u16 status; - struct ieee80211_info_element info_element; +struct ieee80211_auth { + struct ieee80211_hdr_3addr header; + __le16 algorithm; + __le16 transaction; + __le16 status; + /* challenge */ + struct ieee80211_info_element info_element[0]; +} __attribute__ ((packed)); + +struct ieee80211_channel_switch { + u8 id; + u8 len; + u8 mode; + u8 channel; + u8 count; } __attribute__ ((packed)); +struct ieee80211_action { + struct ieee80211_hdr_3addr header; + u8 category; + u8 action; + union { + struct ieee80211_action_exchange { + u8 token; + struct ieee80211_info_element info_element[0]; + } exchange; + struct ieee80211_channel_switch channel_switch; + + } format; +} __attribute__ ((packed)); + +struct ieee80211_disassoc { + struct ieee80211_hdr_3addr header; + __le16 reason; +} __attribute__ ((packed)); + +/* Alias deauth for disassoc */ +#define ieee80211_deauth ieee80211_disassoc + +struct ieee80211_probe_request { + struct ieee80211_hdr_3addr header; + /* SSID, supported rates */ + struct ieee80211_info_element info_element[0]; +} __attribute__ ((packed)); struct ieee80211_probe_response { - struct ieee80211_header_data header; + struct ieee80211_hdr_3addr header; u32 time_stamp[2]; - u16 beacon_interval; - u16 capability; - struct ieee80211_info_element info_element; + __le16 beacon_interval; + __le16 capability; + /* SSID, supported rates, FH params, DS params, + * CF params, IBSS params, TIM (if beacon), RSN */ + struct ieee80211_info_element info_element[0]; } __attribute__ ((packed)); -struct ieee80211_assoc_request_frame { - u16 capability; - u16 listen_interval; - u8 current_ap[ETH_ALEN]; - struct ieee80211_info_element info_element; +/* Alias beacon for probe_response */ +#define ieee80211_beacon ieee80211_probe_response + +struct ieee80211_assoc_request { + struct ieee80211_hdr_3addr header; + __le16 capability; + __le16 listen_interval; + /* SSID, supported rates, RSN */ + struct ieee80211_info_element info_element[0]; } __attribute__ ((packed)); -struct ieee80211_assoc_response_frame { +struct ieee80211_reassoc_request { struct ieee80211_hdr_3addr header; - u16 capability; - u16 status; - u16 aid; - struct ieee80211_info_element info_element; /* supported rates */ + __le16 capability; + __le16 listen_interval; + u8 current_ap[ETH_ALEN]; + struct ieee80211_info_element info_element[0]; } __attribute__ ((packed)); +struct ieee80211_assoc_response { + struct ieee80211_hdr_3addr header; + __le16 capability; + __le16 status; + __le16 aid; + /* supported rates */ + struct ieee80211_info_element info_element[0]; +} __attribute__ ((packed)); struct ieee80211_txb { u8 nr_frags; u8 encrypted; - u16 reserved; - u16 frag_size; - u16 payload_size; + u8 rts_included; + u8 reserved; + __le16 frag_size; + __le16 payload_size; struct sk_buff *fragments[0]; }; - -/* SWEEP TABLE ENTRIES NUMBER*/ +/* SWEEP TABLE ENTRIES NUMBER */ #define MAX_SWEEP_TAB_ENTRIES 42 #define MAX_SWEEP_TAB_ENTRIES_PER_PACKET 7 /* MAX_RATES_LENGTH needs to be 12. The spec says 8, and many APs @@ -598,9 +730,161 @@ struct ieee80211_txb { #define MAX_WPA_IE_LEN 64 -#define NETWORK_EMPTY_ESSID (1<<0) -#define NETWORK_HAS_OFDM (1<<1) -#define NETWORK_HAS_CCK (1<<2) +#define NETWORK_EMPTY_ESSID (1<<0) +#define NETWORK_HAS_OFDM (1<<1) +#define NETWORK_HAS_CCK (1<<2) + +/* QoS structure */ +#define NETWORK_HAS_QOS_PARAMETERS (1<<3) +#define NETWORK_HAS_QOS_INFORMATION (1<<4) +#define NETWORK_HAS_QOS_MASK (NETWORK_HAS_QOS_PARAMETERS | \ + NETWORK_HAS_QOS_INFORMATION) + +/* 802.11h */ +#define NETWORK_HAS_POWER_CONSTRAINT (1<<5) +#define NETWORK_HAS_CSA (1<<6) +#define NETWORK_HAS_QUIET (1<<7) +#define NETWORK_HAS_IBSS_DFS (1<<8) +#define NETWORK_HAS_TPC_REPORT (1<<9) + +#define QOS_QUEUE_NUM 4 +#define QOS_OUI_LEN 3 +#define QOS_OUI_TYPE 2 +#define QOS_ELEMENT_ID 221 +#define QOS_OUI_INFO_SUB_TYPE 0 +#define QOS_OUI_PARAM_SUB_TYPE 1 +#define QOS_VERSION_1 1 +#define QOS_AIFSN_MIN_VALUE 2 + +struct ieee80211_qos_information_element { + u8 elementID; + u8 length; + u8 qui[QOS_OUI_LEN]; + u8 qui_type; + u8 qui_subtype; + u8 version; + u8 ac_info; +} __attribute__ ((packed)); + +struct ieee80211_qos_ac_parameter { + u8 aci_aifsn; + u8 ecw_min_max; + __le16 tx_op_limit; +} __attribute__ ((packed)); + +struct ieee80211_qos_parameter_info { + struct ieee80211_qos_information_element info_element; + u8 reserved; + struct ieee80211_qos_ac_parameter ac_params_record[QOS_QUEUE_NUM]; +} __attribute__ ((packed)); + +struct ieee80211_qos_parameters { + __le16 cw_min[QOS_QUEUE_NUM]; + __le16 cw_max[QOS_QUEUE_NUM]; + u8 aifs[QOS_QUEUE_NUM]; + u8 flag[QOS_QUEUE_NUM]; + __le16 tx_op_limit[QOS_QUEUE_NUM]; +} __attribute__ ((packed)); + +struct ieee80211_qos_data { + struct ieee80211_qos_parameters parameters; + int active; + int supported; + u8 param_count; + u8 old_param_count; +}; + +struct ieee80211_tim_parameters { + u8 tim_count; + u8 tim_period; +} __attribute__ ((packed)); + +/*******************************************************/ + +enum { /* ieee80211_basic_report.map */ + IEEE80211_BASIC_MAP_BSS = (1 << 0), + IEEE80211_BASIC_MAP_OFDM = (1 << 1), + IEEE80211_BASIC_MAP_UNIDENTIFIED = (1 << 2), + IEEE80211_BASIC_MAP_RADAR = (1 << 3), + IEEE80211_BASIC_MAP_UNMEASURED = (1 << 4), + /* Bits 5-7 are reserved */ + +}; +struct ieee80211_basic_report { + u8 channel; + __le64 start_time; + __le16 duration; + u8 map; +} __attribute__ ((packed)); + +enum { /* ieee80211_measurement_request.mode */ + /* Bit 0 is reserved */ + IEEE80211_MEASUREMENT_ENABLE = (1 << 1), + IEEE80211_MEASUREMENT_REQUEST = (1 << 2), + IEEE80211_MEASUREMENT_REPORT = (1 << 3), + /* Bits 4-7 are reserved */ +}; + +enum { + IEEE80211_REPORT_BASIC = 0, /* required */ + IEEE80211_REPORT_CCA = 1, /* optional */ + IEEE80211_REPORT_RPI = 2, /* optional */ + /* 3-255 reserved */ +}; + +struct ieee80211_measurement_params { + u8 channel; + __le64 start_time; + __le16 duration; +} __attribute__ ((packed)); + +struct ieee80211_measurement_request { + struct ieee80211_info_element ie; + u8 token; + u8 mode; + u8 type; + struct ieee80211_measurement_params params[0]; +} __attribute__ ((packed)); + +struct ieee80211_measurement_report { + struct ieee80211_info_element ie; + u8 token; + u8 mode; + u8 type; + union { + struct ieee80211_basic_report basic[0]; + } u; +} __attribute__ ((packed)); + +struct ieee80211_tpc_report { + u8 transmit_power; + u8 link_margin; +} __attribute__ ((packed)); + +struct ieee80211_channel_map { + u8 channel; + u8 map; +} __attribute__ ((packed)); + +struct ieee80211_ibss_dfs { + struct ieee80211_info_element ie; + u8 owner[ETH_ALEN]; + u8 recovery_interval; + struct ieee80211_channel_map channel_map[0]; +}; + +struct ieee80211_csa { + u8 mode; + u8 channel; + u8 count; +} __attribute__ ((packed)); + +struct ieee80211_quiet { + u8 count; + u8 period; + u8 duration; + u8 offset; +} __attribute__ ((packed)); struct ieee80211_network { /* These entries are used to identify a unique network */ @@ -610,6 +894,8 @@ struct ieee80211_network { u8 ssid[IW_ESSID_MAX_SIZE + 1]; u8 ssid_len; + struct ieee80211_qos_data qos_data; + /* These are network statistics */ struct ieee80211_rx_stats stats; u16 capability; @@ -619,16 +905,37 @@ struct ieee80211_network { u8 rates_ex_len; unsigned long last_scanned; u8 mode; - u8 flags; + u32 flags; u32 last_associate; u32 time_stamp[2]; u16 beacon_interval; u16 listen_interval; u16 atim_window; + u8 erp_value; u8 wpa_ie[MAX_WPA_IE_LEN]; size_t wpa_ie_len; u8 rsn_ie[MAX_WPA_IE_LEN]; size_t rsn_ie_len; + struct ieee80211_tim_parameters tim; + + /* 802.11h info */ + + /* Power Constraint - mandatory if spctrm mgmt required */ + u8 power_constraint; + + /* TPC Report - mandatory if spctrm mgmt required */ + struct ieee80211_tpc_report tpc_report; + + /* IBSS DFS - mandatory if spctrm mgmt required and IBSS + * NOTE: This is variable length and so must be allocated dynamically */ + struct ieee80211_ibss_dfs *ibss_dfs; + + /* Channel Switch Announcement - optional if spctrm mgmt required */ + struct ieee80211_csa csa; + + /* Quiet - optional if spctrm mgmt required */ + struct ieee80211_quiet quiet; + struct list_head list; }; @@ -644,26 +951,56 @@ enum ieee80211_state { #define DEFAULT_MAX_SCAN_AGE (15 * HZ) #define DEFAULT_FTS 2346 -#define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x" -#define MAC_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5] - - -extern inline int is_broadcast_ether_addr(const u8 *addr) -{ - return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ - (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); -} #define CFG_IEEE80211_RESERVE_FCS (1<<0) #define CFG_IEEE80211_COMPUTE_FCS (1<<1) +#define CFG_IEEE80211_RTS (1<<2) + +#define IEEE80211_24GHZ_MIN_CHANNEL 1 +#define IEEE80211_24GHZ_MAX_CHANNEL 14 +#define IEEE80211_24GHZ_CHANNELS (IEEE80211_24GHZ_MAX_CHANNEL - \ + IEEE80211_24GHZ_MIN_CHANNEL + 1) + +#define IEEE80211_52GHZ_MIN_CHANNEL 34 +#define IEEE80211_52GHZ_MAX_CHANNEL 165 +#define IEEE80211_52GHZ_CHANNELS (IEEE80211_52GHZ_MAX_CHANNEL - \ + IEEE80211_52GHZ_MIN_CHANNEL + 1) + +enum { + IEEE80211_CH_PASSIVE_ONLY = (1 << 0), + IEEE80211_CH_80211H_RULES = (1 << 1), + IEEE80211_CH_B_ONLY = (1 << 2), + IEEE80211_CH_NO_IBSS = (1 << 3), + IEEE80211_CH_UNIFORM_SPREADING = (1 << 4), + IEEE80211_CH_RADAR_DETECT = (1 << 5), + IEEE80211_CH_INVALID = (1 << 6), +}; + +struct ieee80211_channel { + u32 freq; /* in MHz */ + u8 channel; + u8 flags; + u8 max_power; /* in dBm */ +}; + +struct ieee80211_geo { + u8 name[4]; + u8 bg_channels; + u8 a_channels; + struct ieee80211_channel bg[IEEE80211_24GHZ_CHANNELS]; + struct ieee80211_channel a[IEEE80211_52GHZ_CHANNELS]; +}; struct ieee80211_device { struct net_device *dev; + struct ieee80211_security sec; /* Bookkeeping structures */ struct net_device_stats stats; struct ieee80211_stats ieee_stats; + struct ieee80211_geo geo; + /* Probe / Beacon management */ struct list_head network_free_list; struct list_head network_list; @@ -671,62 +1008,106 @@ struct ieee80211_device { int scans; int scan_age; - int iw_mode; /* operating mode (IW_MODE_*) */ + int iw_mode; /* operating mode (IW_MODE_*) */ + struct iw_spy_data spy_data; /* iwspy support */ spinlock_t lock; - int tx_headroom; /* Set to size of any additional room needed at front - * of allocated Tx SKBs */ + int tx_headroom; /* Set to size of any additional room needed at front + * of allocated Tx SKBs */ u32 config; /* WEP and other encryption related settings at the device level */ - int open_wep; /* Set to 1 to allow unencrypted frames */ + int open_wep; /* Set to 1 to allow unencrypted frames */ - int reset_on_keychange; /* Set to 1 if the HW needs to be reset on + int reset_on_keychange; /* Set to 1 if the HW needs to be reset on * WEP key changes */ /* If the host performs {en,de}cryption, then set to 1 */ int host_encrypt; + int host_encrypt_msdu; int host_decrypt; - int ieee802_1x; /* is IEEE 802.1X used */ + /* host performs multicast decryption */ + int host_mc_decrypt; + + int host_open_frag; + int host_build_iv; + int ieee802_1x; /* is IEEE 802.1X used */ /* WPA data */ int wpa_enabled; int drop_unencrypted; - int tkip_countermeasures; int privacy_invoked; size_t wpa_ie_len; u8 *wpa_ie; struct list_head crypt_deinit_list; struct ieee80211_crypt_data *crypt[WEP_KEYS]; - int tx_keyidx; /* default TX key index (crypt[tx_keyidx]) */ + int tx_keyidx; /* default TX key index (crypt[tx_keyidx]) */ struct timer_list crypt_deinit_timer; + int crypt_quiesced; - int bcrx_sta_key; /* use individual keys to override default keys even - * with RX of broad/multicast frames */ + int bcrx_sta_key; /* use individual keys to override default keys even + * with RX of broad/multicast frames */ /* Fragmentation structures */ struct ieee80211_frag_entry frag_cache[IEEE80211_FRAG_CACHE_LEN]; unsigned int frag_next_idx; - u16 fts; /* Fragmentation Threshold */ + u16 fts; /* Fragmentation Threshold */ + u16 rts; /* RTS threshold */ /* Association info */ u8 bssid[ETH_ALEN]; enum ieee80211_state state; - int mode; /* A, B, G */ - int modulation; /* CCK, OFDM */ - int freq_band; /* 2.4Ghz, 5.2Ghz, Mixed */ - int abg_ture; /* ABG flag */ + int mode; /* A, B, G */ + int modulation; /* CCK, OFDM */ + int freq_band; /* 2.4Ghz, 5.2Ghz, Mixed */ + int abg_true; /* ABG flag */ + + int perfect_rssi; + int worst_rssi; /* Callback functions */ - void (*set_security)(struct net_device *dev, - struct ieee80211_security *sec); - int (*hard_start_xmit)(struct ieee80211_txb *txb, - struct net_device *dev); - int (*reset_port)(struct net_device *dev); + void (*set_security) (struct net_device * dev, + struct ieee80211_security * sec); + int (*hard_start_xmit) (struct ieee80211_txb * txb, + struct net_device * dev, int pri); + int (*reset_port) (struct net_device * dev); + int (*is_queue_full) (struct net_device * dev, int pri); + + int (*handle_management) (struct net_device * dev, + struct ieee80211_network * network, u16 type); + int (*is_qos_active) (struct net_device *dev, struct sk_buff *skb); + + /* Typical STA methods */ + int (*handle_auth) (struct net_device * dev, + struct ieee80211_auth * auth); + int (*handle_deauth) (struct net_device * dev, + struct ieee80211_deauth * auth); + int (*handle_action) (struct net_device * dev, + struct ieee80211_action * action, + struct ieee80211_rx_stats * stats); + int (*handle_disassoc) (struct net_device * dev, + struct ieee80211_disassoc * assoc); + int (*handle_beacon) (struct net_device * dev, + struct ieee80211_beacon * beacon, + struct ieee80211_network * network); + int (*handle_probe_response) (struct net_device * dev, + struct ieee80211_probe_response * resp, + struct ieee80211_network * network); + int (*handle_probe_request) (struct net_device * dev, + struct ieee80211_probe_request * req, + struct ieee80211_rx_stats * stats); + int (*handle_assoc_response) (struct net_device * dev, + struct ieee80211_assoc_response * resp, + struct ieee80211_network * network); + + /* Typical AP methods */ + int (*handle_assoc_request) (struct net_device * dev); + int (*handle_reassoc_request) (struct net_device * dev, + struct ieee80211_reassoc_request * req); /* This must be the last item so that it points to the data * allocated beyond this structure by alloc_ieee80211 */ @@ -738,12 +1119,12 @@ struct ieee80211_device { #define IEEE_G (1<<2) #define IEEE_MODE_MASK (IEEE_A|IEEE_B|IEEE_G) -extern inline void *ieee80211_priv(struct net_device *dev) +static inline void *ieee80211_priv(struct net_device *dev) { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +static inline int ieee80211_is_empty_essid(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -759,7 +1140,8 @@ extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +static inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, + int mode) { /* * It is possible for both access points and our device to support @@ -785,23 +1167,26 @@ extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mod return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +static inline int ieee80211_get_hdrlen(u16 fc) { - int hdrlen = 24; + int hdrlen = IEEE80211_3ADDR_LEN; + u16 stype = WLAN_FC_GET_STYPE(fc); switch (WLAN_FC_GET_TYPE(fc)) { case IEEE80211_FTYPE_DATA: if ((fc & IEEE80211_FCTL_FROMDS) && (fc & IEEE80211_FCTL_TODS)) - hdrlen = 30; /* Addr4 */ + hdrlen = IEEE80211_4ADDR_LEN; + if (stype & IEEE80211_STYPE_QOS_DATA) + hdrlen += 2; break; case IEEE80211_FTYPE_CTL: switch (WLAN_FC_GET_STYPE(fc)) { case IEEE80211_STYPE_CTS: case IEEE80211_STYPE_ACK: - hdrlen = 10; + hdrlen = IEEE80211_1ADDR_LEN; break; default: - hdrlen = 16; + hdrlen = IEEE80211_2ADDR_LEN; break; } break; @@ -810,7 +1195,48 @@ extern inline int ieee80211_get_hdrlen(u16 fc) return hdrlen; } +static inline u8 *ieee80211_get_payload(struct ieee80211_hdr *hdr) +{ + switch (ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl))) { + case IEEE80211_1ADDR_LEN: + return ((struct ieee80211_hdr_1addr *)hdr)->payload; + case IEEE80211_2ADDR_LEN: + return ((struct ieee80211_hdr_2addr *)hdr)->payload; + case IEEE80211_3ADDR_LEN: + return ((struct ieee80211_hdr_3addr *)hdr)->payload; + case IEEE80211_4ADDR_LEN: + return ((struct ieee80211_hdr_4addr *)hdr)->payload; + } + return NULL; +} +static inline int ieee80211_is_ofdm_rate(u8 rate) +{ + switch (rate & ~IEEE80211_BASIC_RATE_MASK) { + case IEEE80211_OFDM_RATE_6MB: + case IEEE80211_OFDM_RATE_9MB: + case IEEE80211_OFDM_RATE_12MB: + case IEEE80211_OFDM_RATE_18MB: + case IEEE80211_OFDM_RATE_24MB: + case IEEE80211_OFDM_RATE_36MB: + case IEEE80211_OFDM_RATE_48MB: + case IEEE80211_OFDM_RATE_54MB: + return 1; + } + return 0; +} + +static inline int ieee80211_is_cck_rate(u8 rate) +{ + switch (rate & ~IEEE80211_BASIC_RATE_MASK) { + case IEEE80211_CCK_RATE_1MB: + case IEEE80211_CCK_RATE_2MB: + case IEEE80211_CCK_RATE_5MB: + case IEEE80211_CCK_RATE_11MB: + return 1; + } + return 0; +} /* ieee80211.c */ extern void free_ieee80211(struct net_device *dev); @@ -819,21 +1245,39 @@ extern struct net_device *alloc_ieee80211(int sizeof_priv); extern int ieee80211_set_encryption(struct ieee80211_device *ieee); /* ieee80211_tx.c */ - - -extern int ieee80211_xmit(struct sk_buff *skb, - struct net_device *dev); +extern int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev); extern void ieee80211_txb_free(struct ieee80211_txb *); - +extern int ieee80211_tx_frame(struct ieee80211_device *ieee, + struct ieee80211_hdr *frame, int hdr_len, + int total_len, int encrypt_mpdu); /* ieee80211_rx.c */ extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); +/* make sure to set stats->len */ extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, - struct ieee80211_hdr *header, + struct ieee80211_hdr_4addr *header, struct ieee80211_rx_stats *stats); - -/* iee80211_wx.c */ +extern void ieee80211_network_reset(struct ieee80211_network *network); + +/* ieee80211_geo.c */ +extern const struct ieee80211_geo *ieee80211_get_geo(struct ieee80211_device + *ieee); +extern int ieee80211_set_geo(struct ieee80211_device *ieee, + const struct ieee80211_geo *geo); + +extern int ieee80211_is_valid_channel(struct ieee80211_device *ieee, + u8 channel); +extern int ieee80211_channel_to_index(struct ieee80211_device *ieee, + u8 channel); +extern u8 ieee80211_freq_to_channel(struct ieee80211_device *ieee, u32 freq); +extern u8 ieee80211_get_channel_flags(struct ieee80211_device *ieee, + u8 channel); +extern const struct ieee80211_channel *ieee80211_get_channel(struct + ieee80211_device + *ieee, u8 channel); + +/* ieee80211_wx.c */ extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); @@ -843,40 +1287,29 @@ extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); +extern int ieee80211_wx_set_encodeext(struct ieee80211_device *ieee, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra); +extern int ieee80211_wx_get_encodeext(struct ieee80211_device *ieee, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra); +extern int ieee80211_wx_set_auth(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, + char *extra); +extern int ieee80211_wx_get_auth(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, + char *extra); - -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +static inline void ieee80211_increment_scans(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +static inline int ieee80211_get_scans(struct ieee80211_device *ieee) { return ieee->scans; } -static inline const char *escape_essid(const char *essid, u8 essid_len) { - static char escaped[IW_ESSID_MAX_SIZE * 2 + 1]; - const char *s = essid; - char *d = escaped; - - if (ieee80211_is_empty_essid(essid, essid_len)) { - memcpy(escaped, "", sizeof("")); - return escaped; - } - - essid_len = min(essid_len, (u8)IW_ESSID_MAX_SIZE); - while (essid_len--) { - if (*s == '\0') { - *d++ = '\\'; - *d++ = '0'; - s++; - } else { - *d++ = *s++; - } - } - *d = '\0'; - return escaped; -} - -#endif /* IEEE80211_H */ +#endif /* IEEE80211_H */ diff --git a/include/net/ieee80211softmac.h b/include/net/ieee80211softmac.h index 052ed596a..00ad810eb 100644 --- a/include/net/ieee80211softmac.h +++ b/include/net/ieee80211softmac.h @@ -86,6 +86,9 @@ struct ieee80211softmac_assoc_info { /* BSSID we're trying to associate to */ char bssid[ETH_ALEN]; + + /* Rates supported by the network */ + struct ieee80211softmac_ratesinfo supported_rates; /* some flags. * static_essid is valid if the essid is constant, @@ -101,6 +104,7 @@ struct ieee80211softmac_assoc_info { */ u8 static_essid:1, associating:1, + assoc_wait:1, bssvalid:1, bssfixed:1; @@ -132,23 +136,26 @@ enum { struct ieee80211softmac_txrates { /* The Bit-Rate to be used for multicast frames. */ u8 mcast_rate; - /* The Bit-Rate to be used for multicast fallback - * (If the device supports fallback and hardware-retry) - */ - u8 mcast_fallback; + + /* The Bit-Rate to be used for multicast management frames. */ + u8 mgt_mcast_rate; + /* The Bit-Rate to be used for any other (normal) data packet. */ u8 default_rate; /* The Bit-Rate to be used for default fallback * (If the device supports fallback and hardware-retry) */ u8 default_fallback; + + /* This is the rate that the user asked for */ + u8 user_rate; }; /* Bits for txrates_change callback. */ #define IEEE80211SOFTMAC_TXRATECHG_DEFAULT (1 << 0) /* default_rate */ #define IEEE80211SOFTMAC_TXRATECHG_DEFAULT_FBACK (1 << 1) /* default_fallback */ #define IEEE80211SOFTMAC_TXRATECHG_MCAST (1 << 2) /* mcast_rate */ -#define IEEE80211SOFTMAC_TXRATECHG_MCAST_FBACK (1 << 3) /* mcast_fallback */ +#define IEEE80211SOFTMAC_TXRATECHG_MGT_MCAST (1 << 3) /* mgt_mcast_rate */ struct ieee80211softmac_device { /* 802.11 structure for data stuff */ @@ -250,6 +257,28 @@ extern void ieee80211softmac_fragment_lost(struct net_device *dev, * Note that the rates need to be sorted. */ extern void ieee80211softmac_set_rates(struct net_device *dev, u8 count, u8 *rates); +/* Helper function which advises you the rate at which a frame should be + * transmitted at. */ +static inline u8 ieee80211softmac_suggest_txrate(struct ieee80211softmac_device *mac, + int is_multicast, + int is_mgt) +{ + struct ieee80211softmac_txrates *txrates = &mac->txrates; + + if (!mac->associated) + return txrates->mgt_mcast_rate; + + /* We are associated, sending unicast frame */ + if (!is_multicast) + return txrates->default_rate; + + /* We are associated, sending multicast frame */ + if (is_mgt) + return txrates->mgt_mcast_rate; + else + return txrates->mcast_rate; +} + /* Start the SoftMAC. Call this after you initialized the device * and it is ready to run. */ @@ -282,7 +311,7 @@ extern void ieee80211softmac_stop(struct net_device *dev); * - context set to the context data you want passed * The return value is 0, or an error. */ -typedef void (*notify_function_ptr)(struct net_device *dev, void *context); +typedef void (*notify_function_ptr)(struct net_device *dev, int event_type, void *context); #define ieee80211softmac_notify(dev, event, fun, context) ieee80211softmac_notify_gfp(dev, event, fun, context, GFP_KERNEL); #define ieee80211softmac_notify_atomic(dev, event, fun, context) ieee80211softmac_notify_gfp(dev, event, fun, context, GFP_ATOMIC); diff --git a/include/net/ieee80211softmac_wx.h b/include/net/ieee80211softmac_wx.h index 3e0be453e..4ee3ad572 100644 --- a/include/net/ieee80211softmac_wx.h +++ b/include/net/ieee80211softmac_wx.h @@ -91,4 +91,9 @@ ieee80211softmac_wx_get_genie(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); +extern int +ieee80211softmac_wx_set_mlme(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, + char *extra); #endif /* _IEEE80211SOFTMAC_WX */ diff --git a/include/net/inet6_hashtables.h b/include/net/inet6_hashtables.h index 59f0c83d5..bc6a71dce 100644 --- a/include/net/inet6_hashtables.h +++ b/include/net/inet6_hashtables.h @@ -14,7 +14,6 @@ #ifndef _INET6_HASHTABLES_H #define _INET6_HASHTABLES_H -#include #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) #include diff --git a/include/net/inet_hashtables.h b/include/net/inet_hashtables.h index 1a80498a9..6f3a6fa7b 100644 --- a/include/net/inet_hashtables.h +++ b/include/net/inet_hashtables.h @@ -14,7 +14,6 @@ #ifndef _INET_HASHTABLES_H #define _INET_HASHTABLES_H -#include #include #include diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h index 482425447..55644aa2b 100644 --- a/include/net/inet_sock.h +++ b/include/net/inet_sock.h @@ -16,7 +16,6 @@ #ifndef _INET_SOCK_H #define _INET_SOCK_H -#include #include #include diff --git a/include/net/inet_timewait_sock.h b/include/net/inet_timewait_sock.h index 0e8a6ad6f..456616bf8 100644 --- a/include/net/inet_timewait_sock.h +++ b/include/net/inet_timewait_sock.h @@ -15,7 +15,6 @@ #ifndef _INET_TIMEWAIT_SOCK_ #define _INET_TIMEWAIT_SOCK_ -#include #include #include diff --git a/include/net/ip.h b/include/net/ip.h index 3d2e5ca62..98f908400 100644 --- a/include/net/ip.h +++ b/include/net/ip.h @@ -22,7 +22,6 @@ #ifndef _IP_H #define _IP_H -#include #include #include #include @@ -147,7 +146,6 @@ void ip_send_reply(struct sock *sk, struct sk_buff *skb, struct ip_reply_arg *ar struct ipv4_config { int log_martians; - int autoconfig; int no_pmtu_disc; }; diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h index a398ae5e3..96b0e6640 100644 --- a/include/net/ip6_route.h +++ b/include/net/ip6_route.h @@ -139,16 +139,22 @@ extern rwlock_t rt6_lock; /* * Store a destination cache entry in a socket */ -static inline void ip6_dst_store(struct sock *sk, struct dst_entry *dst, - struct in6_addr *daddr) +static inline void __ip6_dst_store(struct sock *sk, struct dst_entry *dst, + struct in6_addr *daddr) { struct ipv6_pinfo *np = inet6_sk(sk); struct rt6_info *rt = (struct rt6_info *) dst; - write_lock(&sk->sk_dst_lock); - __sk_dst_set(sk, dst); + sk_setup_caps(sk, dst); np->daddr_cache = daddr; np->dst_cookie = rt->rt6i_node ? rt->rt6i_node->fn_sernum : 0; +} + +static inline void ip6_dst_store(struct sock *sk, struct dst_entry *dst, + struct in6_addr *daddr) +{ + write_lock(&sk->sk_dst_lock); + __ip6_dst_store(sk, dst, daddr); write_unlock(&sk->sk_dst_lock); } diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h index e000fa2cd..a095d1dec 100644 --- a/include/net/ip_fib.h +++ b/include/net/ip_fib.h @@ -16,7 +16,6 @@ #ifndef _NET_IP_FIB_H #define _NET_IP_FIB_H -#include #include #include diff --git a/include/net/ip_mp_alg.h b/include/net/ip_mp_alg.h index 77225735c..ac747b647 100644 --- a/include/net/ip_mp_alg.h +++ b/include/net/ip_mp_alg.h @@ -7,7 +7,6 @@ #ifndef _NET_IP_MP_ALG_H #define _NET_IP_MP_ALG_H -#include #include #include #include diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h index 7d2674fde..3b57b159b 100644 --- a/include/net/ip_vs.h +++ b/include/net/ip_vs.h @@ -248,7 +248,6 @@ struct ip_vs_daemon_user { #ifdef __KERNEL__ -#include #include /* for struct list_head */ #include /* for struct rwlock_t */ #include /* for struct atomic_t */ diff --git a/include/net/ipv6.h b/include/net/ipv6.h index 4abedb8ea..ece7e8a84 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h @@ -104,7 +104,6 @@ struct frag_hdr { #ifdef __KERNEL__ -#include #include /* sysctls */ @@ -469,6 +468,9 @@ extern void ip6_flush_pending_frames(struct sock *sk); extern int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi *fl); +extern int ip6_sk_dst_lookup(struct sock *sk, + struct dst_entry **dst, + struct flowi *fl); /* * skb processing functions diff --git a/include/net/irda/irda.h b/include/net/irda/irda.h index 1880e46ec..1cb0607fc 100644 --- a/include/net/irda/irda.h +++ b/include/net/irda/irda.h @@ -26,7 +26,6 @@ #ifndef NET_IRDA_H #define NET_IRDA_H -#include #include /* struct sk_buff */ #include #include /* sa_family_t in */ diff --git a/include/net/irda/irda_device.h b/include/net/irda/irda_device.h index 92c828029..bca19ca7b 100644 --- a/include/net/irda/irda_device.h +++ b/include/net/irda/irda_device.h @@ -39,7 +39,6 @@ #ifndef IRDA_DEVICE_H #define IRDA_DEVICE_H -#include #include #include #include @@ -161,7 +160,7 @@ typedef struct { int irq, irq2; /* Interrupts used */ int dma, dma2; /* DMA channel(s) used */ int fifo_size; /* FIFO size */ - int irqflags; /* interrupt flags (ie, SA_SHIRQ|SA_INTERRUPT) */ + int irqflags; /* interrupt flags (ie, IRQF_SHARED|IRQF_DISABLED) */ int direction; /* Link direction, used by some FIR drivers */ int enabled; /* Powered on? */ int suspended; /* Suspended by APM */ diff --git a/include/net/irda/irlap.h b/include/net/irda/irlap.h index 2127cae1e..e77eb88d9 100644 --- a/include/net/irda/irlap.h +++ b/include/net/irda/irlap.h @@ -27,7 +27,6 @@ #ifndef IRLAP_H #define IRLAP_H -#include #include #include #include diff --git a/include/net/irda/irlmp.h b/include/net/irda/irlmp.h index c0c895d37..11ecfa58a 100644 --- a/include/net/irda/irlmp.h +++ b/include/net/irda/irlmp.h @@ -29,7 +29,6 @@ #include /* for HZ */ -#include #include #include diff --git a/include/net/irda/irlmp_frame.h b/include/net/irda/irlmp_frame.h index eb3ad158c..c463f8bca 100644 --- a/include/net/irda/irlmp_frame.h +++ b/include/net/irda/irlmp_frame.h @@ -26,7 +26,6 @@ #ifndef IRMLP_FRAME_H #define IRMLP_FRAME_H -#include #include #include diff --git a/include/net/irda/qos.h b/include/net/irda/qos.h index 9ae3d6bc2..cc577dc0a 100644 --- a/include/net/irda/qos.h +++ b/include/net/irda/qos.h @@ -31,7 +31,6 @@ #ifndef IRDA_QOS_H #define IRDA_QOS_H -#include #include #include diff --git a/include/net/llc_if.h b/include/net/llc_if.h index 090eaa0d7..c608812a8 100644 --- a/include/net/llc_if.h +++ b/include/net/llc_if.h @@ -16,6 +16,7 @@ #include #include #include +#include #include #define LLC_DATAUNIT_PRIM 1 @@ -61,8 +62,6 @@ #define LLC_STATUS_CONFLICT 7 /* disconnect conn */ #define LLC_STATUS_RESET_DONE 8 /* */ -extern u8 llc_mac_null_var[IFHWADDRLEN]; - /** * llc_mac_null - determines if a address is a null mac address * @mac: Mac address to test if null. @@ -70,16 +69,20 @@ extern u8 llc_mac_null_var[IFHWADDRLEN]; * Determines if a given address is a null mac address. Returns 0 if the * address is not a null mac, 1 if the address is a null mac. */ -static __inline__ int llc_mac_null(u8 *mac) +static inline int llc_mac_null(const u8 *mac) { - return !memcmp(mac, llc_mac_null_var, IFHWADDRLEN); + return is_zero_ether_addr(mac); } -static __inline__ int llc_addrany(struct llc_addr *addr) +static inline int llc_addrany(const struct llc_addr *addr) { return llc_mac_null(addr->mac) && !addr->lsap; } +static inline int llc_mac_multicast(const u8 *mac) +{ + return is_multicast_ether_addr(mac); +} /** * llc_mac_match - determines if two mac addresses are the same * @mac1: First mac address to compare. @@ -89,9 +92,9 @@ static __inline__ int llc_addrany(struct llc_addr *addr) * is not a complete match up to len, 1 if a complete match up to len is * found. */ -static __inline__ int llc_mac_match(u8 *mac1, u8 *mac2) +static inline int llc_mac_match(const u8 *mac1, const u8 *mac2) { - return !memcmp(mac1, mac2, IFHWADDRLEN); + return !compare_ether_addr(mac1, mac2); } extern int llc_establish_connection(struct sock *sk, u8 *lmac, diff --git a/include/net/ndisc.h b/include/net/ndisc.h index 91fa271a0..d3915dabe 100644 --- a/include/net/ndisc.h +++ b/include/net/ndisc.h @@ -37,7 +37,6 @@ enum { #ifdef __KERNEL__ -#include #include #include #include diff --git a/include/net/netfilter/nf_conntrack.h b/include/net/netfilter/nf_conntrack.h index 916013ca4..1fbd8193d 100644 --- a/include/net/netfilter/nf_conntrack.h +++ b/include/net/netfilter/nf_conntrack.h @@ -15,7 +15,6 @@ #include #ifdef __KERNEL__ -#include #include #include #include @@ -114,6 +113,10 @@ struct nf_conn u_int32_t mark; #endif +#ifdef CONFIG_NF_CONNTRACK_SECMARK + u_int32_t secmark; +#endif + /* Storage reserved for other modules: */ union nf_conntrack_proto proto; @@ -285,6 +288,7 @@ static inline int nf_ct_is_dying(struct nf_conn *ct) } extern unsigned int nf_conntrack_htable_size; +extern int nf_conntrack_checksum; #define NF_CT_STAT_INC(count) (__get_cpu_var(nf_conntrack_stat).count++) diff --git a/include/net/netfilter/nf_conntrack_compat.h b/include/net/netfilter/nf_conntrack_compat.h index 3cac19fb3..f1b1482d7 100644 --- a/include/net/netfilter/nf_conntrack_compat.h +++ b/include/net/netfilter/nf_conntrack_compat.h @@ -20,6 +20,19 @@ static inline u_int32_t *nf_ct_get_mark(const struct sk_buff *skb, } #endif /* CONFIG_IP_NF_CONNTRACK_MARK */ +#ifdef CONFIG_IP_NF_CONNTRACK_SECMARK +static inline u_int32_t *nf_ct_get_secmark(const struct sk_buff *skb, + u_int32_t *ctinfo) +{ + struct ip_conntrack *ct = ip_conntrack_get(skb, ctinfo); + + if (ct) + return &ct->secmark; + else + return NULL; +} +#endif /* CONFIG_IP_NF_CONNTRACK_SECMARK */ + #ifdef CONFIG_IP_NF_CT_ACCT static inline struct ip_conntrack_counter * nf_ct_get_counters(const struct sk_buff *skb) @@ -70,6 +83,19 @@ static inline u_int32_t *nf_ct_get_mark(const struct sk_buff *skb, } #endif /* CONFIG_NF_CONNTRACK_MARK */ +#ifdef CONFIG_NF_CONNTRACK_SECMARK +static inline u_int32_t *nf_ct_get_secmark(const struct sk_buff *skb, + u_int32_t *ctinfo) +{ + struct nf_conn *ct = nf_ct_get(skb, ctinfo); + + if (ct) + return &ct->secmark; + else + return NULL; +} +#endif /* CONFIG_NF_CONNTRACK_MARK */ + #ifdef CONFIG_NF_CT_ACCT static inline struct ip_conntrack_counter * nf_ct_get_counters(const struct sk_buff *skb) diff --git a/include/net/pkt_act.h b/include/net/pkt_act.h index bd08964b7..cf5e4d2e4 100644 --- a/include/net/pkt_act.h +++ b/include/net/pkt_act.h @@ -4,7 +4,6 @@ #include #include #include -#include #include #include #include @@ -15,7 +14,6 @@ #include #include #include -#include #include #include #include diff --git a/include/net/pkt_sched.h b/include/net/pkt_sched.h index 75b5b9333..f6afee732 100644 --- a/include/net/pkt_sched.h +++ b/include/net/pkt_sched.h @@ -171,14 +171,14 @@ psched_tod_diff(int delta_sec, int bound) ({ \ int __delta = (tv).tv_usec + (delta); \ (tv_res).tv_sec = (tv).tv_sec; \ - if (__delta > USEC_PER_SEC) { (tv_res).tv_sec++; __delta -= USEC_PER_SEC; } \ + while (__delta >= USEC_PER_SEC) { (tv_res).tv_sec++; __delta -= USEC_PER_SEC; } \ (tv_res).tv_usec = __delta; \ }) #define PSCHED_TADD(tv, delta) \ ({ \ (tv).tv_usec += (delta); \ - if ((tv).tv_usec > USEC_PER_SEC) { (tv).tv_sec++; \ + while ((tv).tv_usec >= USEC_PER_SEC) { (tv).tv_sec++; \ (tv).tv_usec -= USEC_PER_SEC; } \ }) diff --git a/include/net/protocol.h b/include/net/protocol.h index d516c58ce..c643bce64 100644 --- a/include/net/protocol.h +++ b/include/net/protocol.h @@ -24,7 +24,6 @@ #ifndef _PROTOCOL_H #define _PROTOCOL_H -#include #include #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) #include @@ -52,11 +51,18 @@ struct inet6_protocol struct inet6_skb_parm *opt, int type, int code, int offset, __u32 info); + + int (*gso_send_check)(struct sk_buff *skb); + struct sk_buff *(*gso_segment)(struct sk_buff *skb, + int features); + unsigned int flags; /* INET6_PROTO_xxx */ }; #define INET6_PROTO_NOPOLICY 0x1 #define INET6_PROTO_FINAL 0x2 +/* This should be set for any extension header which is compatible with GSO. */ +#define INET6_PROTO_GSO_EXTHDR 0x4 #endif /* This is used to register socket interfaces for IP protocols. */ diff --git a/include/net/raw.h b/include/net/raw.h index e67b28a02..e4af59781 100644 --- a/include/net/raw.h +++ b/include/net/raw.h @@ -17,7 +17,6 @@ #ifndef _RAW_H #define _RAW_H -#include #include @@ -36,7 +35,7 @@ extern rwlock_t raw_v4_lock; extern struct sock *__raw_v4_lookup(struct sock *sk, unsigned short num, - unsigned long raddr, unsigned long laddr, + __be32 raddr, __be32 laddr, int dif); extern int raw_v4_input(struct sk_buff *skb, struct iphdr *iph, int hash); diff --git a/include/net/red.h b/include/net/red.h index 2ed4358e3..a4eb37946 100644 --- a/include/net/red.h +++ b/include/net/red.h @@ -1,7 +1,6 @@ #ifndef __NET_SCHED_RED_H #define __NET_SCHED_RED_H -#include #include #include #include @@ -213,7 +212,7 @@ static inline unsigned long red_calc_qavg_from_idle_time(struct red_parms *p) * Seems, it is the best solution to * problem of too coarse exponent tabulation. */ - us_idle = (p->qavg * us_idle) >> p->Scell_log; + us_idle = (p->qavg * (u64)us_idle) >> p->Scell_log; if (us_idle < (p->qavg >> 1)) return p->qavg - us_idle; diff --git a/include/net/route.h b/include/net/route.h index 086673bce..4bacfbef8 100644 --- a/include/net/route.h +++ b/include/net/route.h @@ -24,7 +24,6 @@ #ifndef _ROUTE_H #define _ROUTE_H -#include #include #include #include diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index 7b6ec9986..b0e9108a4 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h @@ -1,7 +1,6 @@ #ifndef __NET_SCHED_GENERIC_H #define __NET_SCHED_GENERIC_H -#include #include #include #include diff --git a/include/net/scm.h b/include/net/scm.h index 540619cb7..5637d5e22 100644 --- a/include/net/scm.h +++ b/include/net/scm.h @@ -3,6 +3,7 @@ #include #include +#include /* Well, we should have at least one descriptor open * to accept passed FDs 8) @@ -19,6 +20,9 @@ struct scm_cookie { struct ucred creds; /* Skb credentials */ struct scm_fp_list *fp; /* Passed files */ +#ifdef CONFIG_SECURITY_NETWORK + u32 secid; /* Passed security ID */ +#endif unsigned long seq; /* Connection seqno */ }; @@ -28,6 +32,16 @@ extern int __scm_send(struct socket *sock, struct msghdr *msg, struct scm_cookie extern void __scm_destroy(struct scm_cookie *scm); extern struct scm_fp_list * scm_fp_dup(struct scm_fp_list *fpl); +#ifdef CONFIG_SECURITY_NETWORK +static __inline__ void unix_get_peersec_dgram(struct socket *sock, struct scm_cookie *scm) +{ + security_socket_getpeersec_dgram(sock, NULL, &scm->secid); +} +#else +static __inline__ void unix_get_peersec_dgram(struct socket *sock, struct scm_cookie *scm) +{ } +#endif /* CONFIG_SECURITY_NETWORK */ + static __inline__ void scm_destroy(struct scm_cookie *scm) { if (scm && scm->fp) @@ -43,11 +57,33 @@ static __inline__ int scm_send(struct socket *sock, struct msghdr *msg, scm->creds.pid = p->tgid; scm->fp = NULL; scm->seq = 0; + unix_get_peersec_dgram(sock, scm); if (msg->msg_controllen <= 0) return 0; return __scm_send(sock, msg, scm); } +#ifdef CONFIG_SECURITY_NETWORK +static inline void scm_passec(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm) +{ + char *secdata; + u32 seclen; + int err; + + if (test_bit(SOCK_PASSSEC, &sock->flags)) { + err = security_secid_to_secctx(scm->secid, &secdata, &seclen); + + if (!err) { + put_cmsg(msg, SOL_SOCKET, SCM_SECURITY, seclen, secdata); + security_release_secctx(secdata, seclen); + } + } +} +#else +static inline void scm_passec(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm) +{ } +#endif /* CONFIG_SECURITY_NETWORK */ + static __inline__ void scm_recv(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm, int flags) { @@ -62,6 +98,8 @@ static __inline__ void scm_recv(struct socket *sock, struct msghdr *msg, if (test_bit(SOCK_PASSCRED, &sock->flags)) put_cmsg(msg, SOL_SOCKET, SCM_CREDENTIALS, sizeof(scm->creds), &scm->creds); + scm_passec(sock, msg, scm); + if (!scm->fp) return; diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h index 225dcea94..92eae0e0f 100644 --- a/include/net/sctp/sctp.h +++ b/include/net/sctp/sctp.h @@ -63,7 +63,6 @@ */ -#include #ifdef TEST_FRAME #undef CONFIG_PROC_FS diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h index 5f69158c1..e5aa7ff1f 100644 --- a/include/net/sctp/structs.h +++ b/include/net/sctp/structs.h @@ -445,6 +445,7 @@ typedef struct sctp_sender_hb_info { struct sctp_paramhdr param_hdr; union sctp_addr daddr; unsigned long sent_at; + __u64 hb_nonce; } __attribute__((packed)) sctp_sender_hb_info_t; /* @@ -730,13 +731,10 @@ void sctp_init_addrs(struct sctp_chunk *, union sctp_addr *, const union sctp_addr *sctp_source(const struct sctp_chunk *chunk); /* This is a structure for holding either an IPv6 or an IPv4 address. */ -/* sin_family -- AF_INET or AF_INET6 - * sin_port -- ordinary port number - * sin_addr -- cast to either (struct in_addr) or (struct in6_addr) - */ struct sctp_sockaddr_entry { struct list_head list; union sctp_addr a; + __u8 use_as_src; }; typedef struct sctp_chunk *(sctp_packet_phandler_t)(struct sctp_association *); @@ -984,6 +982,9 @@ struct sctp_transport { */ char cacc_saw_newack; } cacc; + + /* 64-bit random number sent with heartbeat. */ + __u64 hb_nonce; }; struct sctp_transport *sctp_transport_new(const union sctp_addr *, @@ -1138,7 +1139,7 @@ int sctp_bind_addr_copy(struct sctp_bind_addr *dest, sctp_scope_t scope, gfp_t gfp, int flags); int sctp_add_bind_addr(struct sctp_bind_addr *, union sctp_addr *, - gfp_t gfp); + __u8 use_as_src, gfp_t gfp); int sctp_del_bind_addr(struct sctp_bind_addr *, union sctp_addr *); int sctp_bind_addr_match(struct sctp_bind_addr *, const union sctp_addr *, struct sctp_sock *); diff --git a/include/net/sctp/user.h b/include/net/sctp/user.h index 8a6bef6f9..1b7aae6cd 100644 --- a/include/net/sctp/user.h +++ b/include/net/sctp/user.h @@ -560,9 +560,18 @@ struct sctp_paddrinfo { } __attribute__((packed, aligned(4))); /* Peer addresses's state. */ +/* UNKNOWN: Peer address passed by the upper layer in sendmsg or connect[x] + * calls. + * UNCONFIRMED: Peer address received in INIT/INIT-ACK address parameters. + * Not yet confirmed by a heartbeat and not available for data + * transfers. + * ACTIVE : Peer address confirmed, active and available for data transfers. + * INACTIVE: Peer address inactive and not available for data transfers. + */ enum sctp_spinfo_state { SCTP_INACTIVE, SCTP_ACTIVE, + SCTP_UNCONFIRMED, SCTP_UNKNOWN = 0xffff /* Value used for transport state unknown */ }; diff --git a/include/net/sock.h b/include/net/sock.h index f937108a4..cc7534d8a 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -40,11 +40,11 @@ #ifndef _SOCK_H #define _SOCK_H -#include #include #include #include #include +#include #include #include /* struct sk_buff */ #include @@ -79,14 +79,17 @@ typedef struct { spinlock_t slock; struct sock_iocb *owner; wait_queue_head_t wq; + /* + * We express the mutex-alike socket_lock semantics + * to the lock validator by explicitly managing + * the slock as a lock variant (in addition to + * the slock itself): + */ +#ifdef CONFIG_DEBUG_LOCK_ALLOC + struct lockdep_map dep_map; +#endif } socket_lock_t; -#define sock_lock_init(__sk) \ -do { spin_lock_init(&((__sk)->sk_lock.slock)); \ - (__sk)->sk_lock.owner = NULL; \ - init_waitqueue_head(&((__sk)->sk_lock.wq)); \ -} while(0) - struct sock; struct proto; @@ -136,6 +139,7 @@ struct sock_common { * @sk_receive_queue: incoming packets * @sk_wmem_alloc: transmit queue bytes committed * @sk_write_queue: Packet sending queue + * @sk_async_wait_queue: DMA copied packets * @sk_omem_alloc: "o" is "option" or "other" * @sk_wmem_queued: persistent queue size * @sk_forward_alloc: space allocated forward @@ -144,6 +148,7 @@ struct sock_common { * @sk_flags: %SO_LINGER (l_onoff), %SO_BROADCAST, %SO_KEEPALIVE, %SO_OOBINLINE settings * @sk_no_check: %SO_NO_CHECK setting, wether or not checkup packets * @sk_route_caps: route capabilities (e.g. %NETIF_F_TSO) + * @sk_gso_type: GSO type (e.g. %SKB_GSO_TCPV4) * @sk_lingertime: %SO_LINGER l_linger setting * @sk_backlog: always used with the per-socket spinlock held * @sk_callback_lock: used with the callbacks in the end of this struct @@ -214,11 +219,13 @@ struct sock { atomic_t sk_omem_alloc; struct sk_buff_head sk_receive_queue; struct sk_buff_head sk_write_queue; + struct sk_buff_head sk_async_wait_queue; int sk_wmem_queued; int sk_forward_alloc; gfp_t sk_allocation; int sk_sndbuf; int sk_route_caps; + int sk_gso_type; int sk_rcvlowat; unsigned long sk_flags; unsigned long sk_lingertime; @@ -392,7 +399,6 @@ enum sock_flags { SOCK_USE_WRITE_QUEUE, /* whether to call sk->sk_write_space in sock_wfree */ SOCK_DBG, /* %SO_DEBUG setting */ SOCK_RCVTSTAMP, /* %SO_TIMESTAMP setting */ - SOCK_NO_LARGESEND, /* whether to sent large segments or not */ SOCK_LOCALROUTE, /* route locally only, %SO_DONTROUTE setting */ SOCK_QUEUE_SHRUNK, /* write queue has been shrunk recently */ }; @@ -750,11 +756,33 @@ static inline int sk_stream_wmem_schedule(struct sock *sk, int size) */ #define sock_owned_by_user(sk) ((sk)->sk_lock.owner) +/* + * Macro so as to not evaluate some arguments when + * lockdep is not enabled. + * + * Mark both the sk_lock and the sk_lock.slock as a + * per-address-family lock class. + */ +#define sock_lock_init_class_and_name(sk, sname, skey, name, key) \ +do { \ + sk->sk_lock.owner = NULL; \ + init_waitqueue_head(&sk->sk_lock.wq); \ + spin_lock_init(&(sk)->sk_lock.slock); \ + debug_check_no_locks_freed((void *)&(sk)->sk_lock, \ + sizeof((sk)->sk_lock)); \ + lockdep_set_class_and_name(&(sk)->sk_lock.slock, \ + (skey), (sname)); \ + lockdep_init_map(&(sk)->sk_lock.dep_map, (name), (key), 0); \ +} while (0) + extern void FASTCALL(lock_sock(struct sock *sk)); extern void FASTCALL(release_sock(struct sock *sk)); /* BH context may only use the following locking interface. */ #define bh_lock_sock(__sk) spin_lock(&((__sk)->sk_lock.slock)) +#define bh_lock_sock_nested(__sk) \ + spin_lock_nested(&((__sk)->sk_lock.slock), \ + SINGLE_DEPTH_NESTING) #define bh_unlock_sock(__sk) spin_unlock(&((__sk)->sk_lock.slock)) extern struct sock *sk_alloc(int family, @@ -881,10 +909,7 @@ static inline int sk_filter(struct sock *sk, struct sk_buff *skb, int needlock) if (filter) { unsigned int pkt_len = sk_run_filter(skb, filter->insns, filter->len); - if (!pkt_len) - err = -EPERM; - else - skb_trim(skb, pkt_len); + err = pkt_len ? pskb_trim(skb, pkt_len) : -EPERM; } if (needlock) @@ -1029,24 +1054,30 @@ __sk_dst_reset(struct sock *sk) static inline void sk_dst_reset(struct sock *sk) { - write_lock(&sk->sk_dst_lock); + unsigned long flags; + write_lock_irqsave(&sk->sk_dst_lock, flags); __sk_dst_reset(sk); - write_unlock(&sk->sk_dst_lock); + write_unlock_irqrestore(&sk->sk_dst_lock, flags); } extern struct dst_entry *__sk_dst_check(struct sock *sk, u32 cookie); extern struct dst_entry *sk_dst_check(struct sock *sk, u32 cookie); +static inline int sk_can_gso(const struct sock *sk) +{ + return net_gso_ok(sk->sk_route_caps, sk->sk_gso_type); +} + static inline void sk_setup_caps(struct sock *sk, struct dst_entry *dst) { __sk_dst_set(sk, dst); sk->sk_route_caps = dst->dev->features; if (sk->sk_route_caps & NETIF_F_GSO) - sk->sk_route_caps |= NETIF_F_TSO; - if (sk->sk_route_caps & NETIF_F_TSO) { - if (sock_flag(sk, SOCK_NO_LARGESEND) || dst->header_len) - sk->sk_route_caps &= ~NETIF_F_TSO; + sk->sk_route_caps |= NETIF_F_GSO_MASK; + if (sk_can_gso(sk)) { + if (dst->header_len) + sk->sk_route_caps &= ~NETIF_F_GSO_MASK; else sk->sk_route_caps |= NETIF_F_SG | NETIF_F_HW_CSUM; } @@ -1283,15 +1314,27 @@ sock_recv_timestamp(struct msghdr *msg, struct sock *sk, struct sk_buff *skb) * sk_eat_skb - Release a skb if it is no longer needed * @sk: socket to eat this skb from * @skb: socket buffer to eat + * @copied_early: flag indicating whether DMA operations copied this data early * * This routine must be called with interrupts disabled or with the socket * locked so that the sk_buff queue operation is ok. */ -static inline void sk_eat_skb(struct sock *sk, struct sk_buff *skb) +#ifdef CONFIG_NET_DMA +static inline void sk_eat_skb(struct sock *sk, struct sk_buff *skb, int copied_early) +{ + __skb_unlink(skb, &sk->sk_receive_queue); + if (!copied_early) + __kfree_skb(skb); + else + __skb_queue_tail(&sk->sk_async_wait_queue, skb); +} +#else +static inline void sk_eat_skb(struct sock *sk, struct sk_buff *skb, int copied_early) { __skb_unlink(skb, &sk->sk_receive_queue); __kfree_skb(skb); } +#endif extern void sock_enable_timestamp(struct sock *sk); extern int sock_get_timestamp(struct sock *, struct timeval __user *); diff --git a/include/net/tcp.h b/include/net/tcp.h index 8fa246247..781156845 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -21,13 +21,13 @@ #define TCP_DEBUG 1 #define FASTRETRANS_DEBUG 1 -#include #include #include #include #include #include #include +#include #include #include @@ -218,6 +218,7 @@ extern int sysctl_tcp_adv_win_scale; extern int sysctl_tcp_tw_reuse; extern int sysctl_tcp_frto; extern int sysctl_tcp_low_latency; +extern int sysctl_tcp_dma_copybreak; extern int sysctl_tcp_nometrics_save; extern int sysctl_tcp_moderate_rcvbuf; extern int sysctl_tcp_tso_win_divisor; @@ -225,6 +226,7 @@ extern int sysctl_tcp_abc; extern int sysctl_tcp_mtu_probing; extern int sysctl_tcp_base_mss; extern int sysctl_tcp_workaround_signed_windows; +extern int sysctl_tcp_slow_start_after_idle; extern atomic_t tcp_memory_allocated; extern atomic_t tcp_sockets_allocated; @@ -295,6 +297,8 @@ extern int tcp_rcv_established(struct sock *sk, extern void tcp_rcv_space_adjust(struct sock *sk); +extern void tcp_cleanup_rbuf(struct sock *sk, int copied); + extern int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp); @@ -433,7 +437,7 @@ extern int tcp_send_synack(struct sock *); extern void tcp_push_one(struct sock *, unsigned int mss_now); extern void tcp_send_ack(struct sock *sk); extern void tcp_send_delayed_ack(struct sock *sk); -extern void cleanup_rbuf(struct sock *sk, int copied); +extern void tcp_cleanup_rbuf(struct sock *sk, int copied); /* tcp_input.c */ extern void tcp_cwnd_application_limited(struct sock *sk); @@ -631,7 +635,7 @@ struct tcp_congestion_ops { /* return slow start threshold (required) */ u32 (*ssthresh)(struct sock *sk); /* lower bound for congestion window (optional) */ - u32 (*min_cwnd)(struct sock *sk); + u32 (*min_cwnd)(const struct sock *sk); /* do new cwnd calculation (required) */ void (*cong_avoid)(struct sock *sk, u32 ack, u32 rtt, u32 in_flight, int good_ack); @@ -666,7 +670,7 @@ extern struct tcp_congestion_ops tcp_init_congestion_ops; extern u32 tcp_reno_ssthresh(struct sock *sk); extern void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 rtt, u32 in_flight, int flag); -extern u32 tcp_reno_min_cwnd(struct sock *sk); +extern u32 tcp_reno_min_cwnd(const struct sock *sk); extern struct tcp_congestion_ops tcp_reno; static inline void tcp_set_ca_state(struct sock *sk, const u8 ca_state) @@ -750,7 +754,7 @@ static inline int tcp_is_cwnd_limited(const struct sock *sk, u32 in_flight) if (in_flight >= tp->snd_cwnd) return 1; - if (!(sk->sk_route_caps & NETIF_F_TSO)) + if (!sk_can_gso(sk)) return 0; left = tp->snd_cwnd - in_flight; @@ -820,6 +824,12 @@ static inline void tcp_prequeue_init(struct tcp_sock *tp) tp->ucopy.len = 0; tp->ucopy.memory = 0; skb_queue_head_init(&tp->ucopy.prequeue); +#ifdef CONFIG_NET_DMA + tp->ucopy.dma_chan = NULL; + tp->ucopy.wakeup = 0; + tp->ucopy.pinned_list = NULL; + tp->ucopy.dma_cookie = 0; +#endif } /* Packet is added to VJ-style prequeue for processing in process @@ -907,6 +917,9 @@ static inline void tcp_set_state(struct sock *sk, int state) static inline void tcp_done(struct sock *sk) { + if(sk->sk_state == TCP_SYN_SENT || sk->sk_state == TCP_SYN_RECV) + TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS); + tcp_set_state(sk, TCP_CLOSE); tcp_clear_xmit_timers(sk); diff --git a/include/net/tcp_ecn.h b/include/net/tcp_ecn.h index c6b843974..4629d7717 100644 --- a/include/net/tcp_ecn.h +++ b/include/net/tcp_ecn.h @@ -31,10 +31,9 @@ static inline void TCP_ECN_send_syn(struct sock *sk, struct tcp_sock *tp, struct sk_buff *skb) { tp->ecn_flags = 0; - if (sysctl_tcp_ecn && !(sk->sk_route_caps & NETIF_F_TSO)) { + if (sysctl_tcp_ecn) { TCP_SKB_CB(skb)->flags |= TCPCB_FLAG_ECE|TCPCB_FLAG_CWR; tp->ecn_flags = TCP_ECN_OK; - sock_set_flag(sk, SOCK_NO_LARGESEND); } } @@ -56,6 +55,7 @@ static inline void TCP_ECN_send(struct sock *sk, struct tcp_sock *tp, if (tp->ecn_flags&TCP_ECN_QUEUE_CWR) { tp->ecn_flags &= ~TCP_ECN_QUEUE_CWR; skb->h.th->cwr = 1; + skb_shinfo(skb)->gso_type |= SKB_GSO_TCP_ECN; } } else { /* ACK or retransmitted segment: clear ECT|CE */ diff --git a/include/net/tipc/tipc_bearer.h b/include/net/tipc/tipc_bearer.h index 098607cd4..e07136d74 100644 --- a/include/net/tipc/tipc_bearer.h +++ b/include/net/tipc/tipc_bearer.h @@ -49,10 +49,18 @@ #define TIPC_MEDIA_TYPE_ETH 1 +/* + * Destination address structure used by TIPC bearers when sending messages + * + * IMPORTANT: The fields of this structure MUST be stored using the specified + * byte order indicated below, as the structure is exchanged between nodes + * as part of a link setup process. + */ + struct tipc_media_addr { - __u32 type; + __u32 type; /* bearer type (network byte order) */ union { - __u8 eth_addr[6]; /* Ethernet bearer */ + __u8 eth_addr[6]; /* 48 bit Ethernet addr (byte array) */ #if 0 /* Prototypes for other possible bearer types */ diff --git a/include/net/tux.h b/include/net/tux.h index 9b40bc5e2..c22898d8f 100644 --- a/include/net/tux.h +++ b/include/net/tux.h @@ -19,7 +19,6 @@ #include #include #include -#include #include #include #include diff --git a/include/net/xfrm.h b/include/net/xfrm.h index afa508d92..9c5ee9f20 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h @@ -20,6 +20,8 @@ #include #define XFRM_ALIGN8(len) (((len) + 7) & ~7) +#define MODULE_ALIAS_XFRM_MODE(family, encap) \ + MODULE_ALIAS("xfrm-mode-" __stringify(family) "-" __stringify(encap)) extern struct sock *xfrm_nl; extern u32 sysctl_xfrm_aevent_etime; @@ -164,6 +166,7 @@ struct xfrm_state /* Reference to data common to all the instances of this * transformer. */ struct xfrm_type *type; + struct xfrm_mode *mode; /* Security context */ struct xfrm_sec_ctx *security; @@ -204,8 +207,8 @@ struct xfrm_type; struct xfrm_dst; struct xfrm_policy_afinfo { unsigned short family; - rwlock_t lock; - struct xfrm_type_map *type_map; + struct xfrm_type *type_map[IPPROTO_MAX]; + struct xfrm_mode *mode_map[XFRM_MODE_MAX]; struct dst_ops *dst_ops; void (*garbage_collect)(void); int (*dst_lookup)(struct xfrm_dst **dst, struct flowi *fl); @@ -232,7 +235,6 @@ extern int __xfrm_state_delete(struct xfrm_state *x); struct xfrm_state_afinfo { unsigned short family; - rwlock_t lock; struct list_head *state_bydst; struct list_head *state_byspi; int (*init_flags)(struct xfrm_state *x); @@ -264,16 +266,24 @@ struct xfrm_type u32 (*get_max_size)(struct xfrm_state *, int size); }; -struct xfrm_type_map { - rwlock_t lock; - struct xfrm_type *map[256]; -}; - extern int xfrm_register_type(struct xfrm_type *type, unsigned short family); extern int xfrm_unregister_type(struct xfrm_type *type, unsigned short family); extern struct xfrm_type *xfrm_get_type(u8 proto, unsigned short family); extern void xfrm_put_type(struct xfrm_type *type); +struct xfrm_mode { + int (*input)(struct xfrm_state *x, struct sk_buff *skb); + int (*output)(struct sk_buff *skb); + + struct module *owner; + unsigned int encap; +}; + +extern int xfrm_register_mode(struct xfrm_mode *mode, int family); +extern int xfrm_unregister_mode(struct xfrm_mode *mode, int family); +extern struct xfrm_mode *xfrm_get_mode(unsigned int encap, int family); +extern void xfrm_put_mode(struct xfrm_mode *mode); + struct xfrm_tmpl { /* id in template is interpreted as: diff --git a/include/pcmcia/ss.h b/include/pcmcia/ss.h index 5e0a01ab2..ede639812 100644 --- a/include/pcmcia/ss.h +++ b/include/pcmcia/ss.h @@ -15,7 +15,6 @@ #ifndef _LINUX_SS_H #define _LINUX_SS_H -#include #include #include /* task_struct, completion */ #include diff --git a/include/rdma/ib_cache.h b/include/rdma/ib_cache.h index 5bf9834f7..f179d233f 100644 --- a/include/rdma/ib_cache.h +++ b/include/rdma/ib_cache.h @@ -102,4 +102,17 @@ int ib_find_cached_pkey(struct ib_device *device, u16 pkey, u16 *index); +/** + * ib_get_cached_lmc - Returns a cached lmc table entry + * @device: The device to query. + * @port_num: The port number of the device to query. + * @lmc: The lmc value for the specified port for that device. + * + * ib_get_cached_lmc() fetches the specified lmc table entry stored in + * the local software cache. + */ +int ib_get_cached_lmc(struct ib_device *device, + u8 port_num, + u8 *lmc); + #endif /* _IB_CACHE_H */ diff --git a/include/rdma/ib_cm.h b/include/rdma/ib_cm.h index 0a9fcd59e..c9b4738be 100644 --- a/include/rdma/ib_cm.h +++ b/include/rdma/ib_cm.h @@ -32,7 +32,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - * $Id: ib_cm.h 2730 2005-06-28 16:43:03Z sean.hefty $ + * $Id: ib_cm.h 4311 2005-12-05 18:42:01Z sean.hefty $ */ #if !defined(IB_CM_H) #define IB_CM_H @@ -102,7 +102,8 @@ enum ib_cm_data_size { IB_CM_APR_INFO_LENGTH = 72, IB_CM_SIDR_REQ_PRIVATE_DATA_SIZE = 216, IB_CM_SIDR_REP_PRIVATE_DATA_SIZE = 136, - IB_CM_SIDR_REP_INFO_LENGTH = 72 + IB_CM_SIDR_REP_INFO_LENGTH = 72, + IB_CM_COMPARE_SIZE = 64 }; struct ib_cm_id; @@ -238,7 +239,6 @@ struct ib_cm_sidr_rep_event_param { u32 qpn; void *info; u8 info_len; - }; struct ib_cm_event { @@ -317,6 +317,15 @@ void ib_destroy_cm_id(struct ib_cm_id *cm_id); #define IB_SERVICE_ID_AGN_MASK __constant_cpu_to_be64(0xFF00000000000000ULL) #define IB_CM_ASSIGN_SERVICE_ID __constant_cpu_to_be64(0x0200000000000000ULL) +#define IB_CMA_SERVICE_ID __constant_cpu_to_be64(0x0000000001000000ULL) +#define IB_CMA_SERVICE_ID_MASK __constant_cpu_to_be64(0xFFFFFFFFFF000000ULL) +#define IB_SDP_SERVICE_ID __constant_cpu_to_be64(0x0000000000010000ULL) +#define IB_SDP_SERVICE_ID_MASK __constant_cpu_to_be64(0xFFFFFFFFFFFF0000ULL) + +struct ib_cm_compare_data { + u8 data[IB_CM_COMPARE_SIZE]; + u8 mask[IB_CM_COMPARE_SIZE]; +}; /** * ib_cm_listen - Initiates listening on the specified service ID for @@ -330,10 +339,12 @@ void ib_destroy_cm_id(struct ib_cm_id *cm_id); * range of service IDs. If set to 0, the service ID is matched * exactly. This parameter is ignored if %service_id is set to * IB_CM_ASSIGN_SERVICE_ID. + * @compare_data: This parameter is optional. It specifies data that must + * appear in the private data of a connection request for the specified + * listen request. */ -int ib_cm_listen(struct ib_cm_id *cm_id, - __be64 service_id, - __be64 service_mask); +int ib_cm_listen(struct ib_cm_id *cm_id, __be64 service_id, __be64 service_mask, + struct ib_cm_compare_data *compare_data); struct ib_cm_req_param { struct ib_sa_path_rec *primary_path; @@ -535,7 +546,6 @@ struct ib_cm_sidr_req_param { const void *private_data; u8 private_data_len; u8 max_cm_retries; - u16 pkey; }; /** @@ -559,7 +569,7 @@ struct ib_cm_sidr_rep_param { }; /** - * ib_send_cm_sidr_rep - Sends a service ID resolution request to the + * ib_send_cm_sidr_rep - Sends a service ID resolution reply to the * remote node. * @cm_id: Communication identifier associated with the received service ID * resolution request. diff --git a/include/rdma/ib_fmr_pool.h b/include/rdma/ib_fmr_pool.h index 4ace54cd0..00dadbf94 100644 --- a/include/rdma/ib_fmr_pool.h +++ b/include/rdma/ib_fmr_pool.h @@ -88,7 +88,7 @@ int ib_flush_fmr_pool(struct ib_fmr_pool *pool); struct ib_pool_fmr *ib_fmr_pool_map_phys(struct ib_fmr_pool *pool_handle, u64 *page_list, int list_len, - u64 *io_virtual_address); + u64 io_virtual_address); int ib_fmr_pool_unmap(struct ib_pool_fmr *fmr); diff --git a/include/rdma/ib_mad.h b/include/rdma/ib_mad.h index 5ff775580..585d28e96 100644 --- a/include/rdma/ib_mad.h +++ b/include/rdma/ib_mad.h @@ -75,6 +75,7 @@ #define IB_MGMT_METHOD_TRAP_REPRESS 0x07 #define IB_MGMT_METHOD_RESP 0x80 +#define IB_BM_ATTR_MOD_RESP cpu_to_be32(1) #define IB_MGMT_MAX_METHODS 128 @@ -246,6 +247,12 @@ struct ib_mad_send_buf { int retries; }; +/** + * ib_response_mad - Returns if the specified MAD has been generated in + * response to a sent request or trap. + */ +int ib_response_mad(struct ib_mad *mad); + /** * ib_get_rmpp_resptime - Returns the RMPP response time. * @rmpp_hdr: An RMPP header. diff --git a/include/rdma/ib_sa.h b/include/rdma/ib_sa.h index ad63c215e..c99e4420f 100644 --- a/include/rdma/ib_sa.h +++ b/include/rdma/ib_sa.h @@ -370,5 +370,12 @@ ib_sa_mcmember_rec_delete(struct ib_device *device, u8 port_num, context, query); } +/** + * ib_init_ah_from_path - Initialize address handle attributes based on an SA + * path record. + */ +int ib_init_ah_from_path(struct ib_device *device, u8 port_num, + struct ib_sa_path_rec *rec, + struct ib_ah_attr *ah_attr); #endif /* IB_SA_H */ diff --git a/include/rdma/ib_smi.h b/include/rdma/ib_smi.h index 87f60737f..f29af135b 100644 --- a/include/rdma/ib_smi.h +++ b/include/rdma/ib_smi.h @@ -85,6 +85,42 @@ struct ib_smp { #define IB_SMP_ATTR_LED_INFO __constant_htons(0x0031) #define IB_SMP_ATTR_VENDOR_MASK __constant_htons(0xFF00) +struct ib_port_info { + __be64 mkey; + __be64 gid_prefix; + __be16 lid; + __be16 sm_lid; + __be32 cap_mask; + __be16 diag_code; + __be16 mkey_lease_period; + u8 local_port_num; + u8 link_width_enabled; + u8 link_width_supported; + u8 link_width_active; + u8 linkspeed_portstate; /* 4 bits, 4 bits */ + u8 portphysstate_linkdown; /* 4 bits, 4 bits */ + u8 mkeyprot_resv_lmc; /* 2 bits, 3, 3 */ + u8 linkspeedactive_enabled; /* 4 bits, 4 bits */ + u8 neighbormtu_mastersmsl; /* 4 bits, 4 bits */ + u8 vlcap_inittype; /* 4 bits, 4 bits */ + u8 vl_high_limit; + u8 vl_arb_high_cap; + u8 vl_arb_low_cap; + u8 inittypereply_mtucap; /* 4 bits, 4 bits */ + u8 vlstallcnt_hoqlife; /* 3 bits, 5 bits */ + u8 operationalvl_pei_peo_fpi_fpo; /* 4 bits, 1, 1, 1, 1 */ + __be16 mkey_violations; + __be16 pkey_violations; + __be16 qkey_violations; + u8 guid_cap; + u8 clientrereg_resv_subnetto; /* 1 bit, 2 bits, 5 */ + u8 resv_resptimevalue; /* 3 bits, 5 bits */ + u8 localphyerrors_overrunerrors; /* 4 bits, 4 bits */ + __be16 max_credit_hint; + u8 resv; + u8 link_roundtrip_latency[3]; +}; + static inline u8 ib_get_smp_direction(struct ib_smp *smp) { diff --git a/include/rdma/ib_user_cm.h b/include/rdma/ib_user_cm.h index 19be11604..066c20b7c 100644 --- a/include/rdma/ib_user_cm.h +++ b/include/rdma/ib_user_cm.h @@ -30,13 +30,13 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - * $Id: ib_user_cm.h 2576 2005-06-09 17:00:30Z libor $ + * $Id: ib_user_cm.h 4019 2005-11-11 00:33:09Z sean.hefty $ */ #ifndef IB_USER_CM_H #define IB_USER_CM_H -#include +#include #define IB_USER_CM_ABI_VERSION 4 @@ -110,58 +110,6 @@ struct ib_ucm_init_qp_attr { __u32 qp_state; }; -struct ib_ucm_ah_attr { - __u8 grh_dgid[16]; - __u32 grh_flow_label; - __u16 dlid; - __u16 reserved; - __u8 grh_sgid_index; - __u8 grh_hop_limit; - __u8 grh_traffic_class; - __u8 sl; - __u8 src_path_bits; - __u8 static_rate; - __u8 is_global; - __u8 port_num; -}; - -struct ib_ucm_init_qp_attr_resp { - __u32 qp_attr_mask; - __u32 qp_state; - __u32 cur_qp_state; - __u32 path_mtu; - __u32 path_mig_state; - __u32 qkey; - __u32 rq_psn; - __u32 sq_psn; - __u32 dest_qp_num; - __u32 qp_access_flags; - - struct ib_ucm_ah_attr ah_attr; - struct ib_ucm_ah_attr alt_ah_attr; - - /* ib_qp_cap */ - __u32 max_send_wr; - __u32 max_recv_wr; - __u32 max_send_sge; - __u32 max_recv_sge; - __u32 max_inline_data; - - __u16 pkey_index; - __u16 alt_pkey_index; - __u8 en_sqd_async_notify; - __u8 sq_draining; - __u8 max_rd_atomic; - __u8 max_dest_rd_atomic; - __u8 min_rnr_timer; - __u8 port_num; - __u8 timeout; - __u8 retry_cnt; - __u8 rnr_retry; - __u8 alt_port_num; - __u8 alt_timeout; -}; - struct ib_ucm_listen { __be64 service_id; __be64 service_mask; @@ -180,28 +128,6 @@ struct ib_ucm_private_data { __u8 reserved[3]; }; -struct ib_ucm_path_rec { - __u8 dgid[16]; - __u8 sgid[16]; - __be16 dlid; - __be16 slid; - __u32 raw_traffic; - __be32 flow_label; - __u32 reversible; - __u32 mtu; - __be16 pkey; - __u8 hop_limit; - __u8 traffic_class; - __u8 numb_path; - __u8 sl; - __u8 mtu_selector; - __u8 rate_selector; - __u8 rate; - __u8 packet_life_time_selector; - __u8 packet_life_time; - __u8 preference; -}; - struct ib_ucm_req { __u32 id; __u32 qpn; @@ -274,7 +200,7 @@ struct ib_ucm_sidr_req { __be64 sid; __u64 data; __u64 path; - __u16 pkey; + __u16 reserved_pkey; __u8 len; __u8 max_cm_retries; __u8 reserved[4]; @@ -304,8 +230,8 @@ struct ib_ucm_event_get { }; struct ib_ucm_req_event_resp { - struct ib_ucm_path_rec primary_path; - struct ib_ucm_path_rec alternate_path; + struct ib_user_path_rec primary_path; + struct ib_user_path_rec alternate_path; __be64 remote_ca_guid; __u32 remote_qkey; __u32 remote_qpn; @@ -349,7 +275,7 @@ struct ib_ucm_mra_event_resp { }; struct ib_ucm_lap_event_resp { - struct ib_ucm_path_rec path; + struct ib_user_path_rec path; }; struct ib_ucm_apr_event_resp { diff --git a/include/rdma/ib_user_verbs.h b/include/rdma/ib_user_verbs.h index 338ed4333..7b5372010 100644 --- a/include/rdma/ib_user_verbs.h +++ b/include/rdma/ib_user_verbs.h @@ -32,7 +32,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - * $Id: ib_user_verbs.h 2708 2005-06-24 17:27:21Z roland $ + * $Id: ib_user_verbs.h 4019 2005-11-11 00:33:09Z sean.hefty $ */ #ifndef IB_USER_VERBS_H @@ -323,6 +323,64 @@ struct ib_uverbs_destroy_cq_resp { __u32 async_events_reported; }; +struct ib_uverbs_global_route { + __u8 dgid[16]; + __u32 flow_label; + __u8 sgid_index; + __u8 hop_limit; + __u8 traffic_class; + __u8 reserved; +}; + +struct ib_uverbs_ah_attr { + struct ib_uverbs_global_route grh; + __u16 dlid; + __u8 sl; + __u8 src_path_bits; + __u8 static_rate; + __u8 is_global; + __u8 port_num; + __u8 reserved; +}; + +struct ib_uverbs_qp_attr { + __u32 qp_attr_mask; + __u32 qp_state; + __u32 cur_qp_state; + __u32 path_mtu; + __u32 path_mig_state; + __u32 qkey; + __u32 rq_psn; + __u32 sq_psn; + __u32 dest_qp_num; + __u32 qp_access_flags; + + struct ib_uverbs_ah_attr ah_attr; + struct ib_uverbs_ah_attr alt_ah_attr; + + /* ib_qp_cap */ + __u32 max_send_wr; + __u32 max_recv_wr; + __u32 max_send_sge; + __u32 max_recv_sge; + __u32 max_inline_data; + + __u16 pkey_index; + __u16 alt_pkey_index; + __u8 en_sqd_async_notify; + __u8 sq_draining; + __u8 max_rd_atomic; + __u8 max_dest_rd_atomic; + __u8 min_rnr_timer; + __u8 port_num; + __u8 timeout; + __u8 retry_cnt; + __u8 rnr_retry; + __u8 alt_port_num; + __u8 alt_timeout; + __u8 reserved[5]; +}; + struct ib_uverbs_create_qp { __u64 response; __u64 user_handle; @@ -541,26 +599,6 @@ struct ib_uverbs_post_srq_recv_resp { __u32 bad_wr; }; -struct ib_uverbs_global_route { - __u8 dgid[16]; - __u32 flow_label; - __u8 sgid_index; - __u8 hop_limit; - __u8 traffic_class; - __u8 reserved; -}; - -struct ib_uverbs_ah_attr { - struct ib_uverbs_global_route grh; - __u16 dlid; - __u8 sl; - __u8 src_path_bits; - __u8 static_rate; - __u8 is_global; - __u8 port_num; - __u8 reserved; -}; - struct ib_uverbs_create_ah { __u64 response; __u64 user_handle; diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index 6bbf1b364..ee1f3a355 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h @@ -260,7 +260,8 @@ enum ib_event_type { IB_EVENT_SM_CHANGE, IB_EVENT_SRQ_ERR, IB_EVENT_SRQ_LIMIT_REACHED, - IB_EVENT_QP_LAST_WQE_REACHED + IB_EVENT_QP_LAST_WQE_REACHED, + IB_EVENT_CLIENT_REREGISTER }; struct ib_event { @@ -696,8 +697,12 @@ struct ib_ucontext { struct ib_uobject { u64 user_handle; /* handle given to us by userspace */ struct ib_ucontext *context; /* associated user context */ + void *object; /* containing object */ struct list_head list; /* link to context's list */ u32 id; /* index into kernel idr */ + struct kref ref; + struct rw_semaphore mutex; /* protects .live */ + int live; }; struct ib_umem { @@ -827,6 +832,7 @@ struct ib_cache { struct ib_event_handler event_handler; struct ib_pkey_cache **pkey_cache; struct ib_gid_cache **gid_cache; + u8 *lmc_cache; }; struct ib_device { @@ -1085,6 +1091,20 @@ int ib_dealloc_pd(struct ib_pd *pd); */ struct ib_ah *ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr); +/** + * ib_init_ah_from_wc - Initializes address handle attributes from a + * work completion. + * @device: Device on which the received message arrived. + * @port_num: Port on which the received message arrived. + * @wc: Work completion associated with the received message. + * @grh: References the received global route header. This parameter is + * ignored unless the work completion indicates that the GRH is valid. + * @ah_attr: Returned attributes that can be used when creating an address + * handle for replying to the message. + */ +int ib_init_ah_from_wc(struct ib_device *device, u8 port_num, struct ib_wc *wc, + struct ib_grh *grh, struct ib_ah_attr *ah_attr); + /** * ib_create_ah_from_wc - Creates an address handle associated with the * sender of the specified work completion. diff --git a/include/scsi/iscsi_if.h b/include/scsi/iscsi_if.h index e5618b909..55ebf035e 100644 --- a/include/scsi/iscsi_if.h +++ b/include/scsi/iscsi_if.h @@ -43,10 +43,23 @@ enum iscsi_uevent_e { ISCSI_UEVENT_GET_STATS = UEVENT_BASE + 10, ISCSI_UEVENT_GET_PARAM = UEVENT_BASE + 11, + ISCSI_UEVENT_TRANSPORT_EP_CONNECT = UEVENT_BASE + 12, + ISCSI_UEVENT_TRANSPORT_EP_POLL = UEVENT_BASE + 13, + ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT = UEVENT_BASE + 14, + + ISCSI_UEVENT_TGT_DSCVR = UEVENT_BASE + 15, + /* up events */ ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1, ISCSI_KEVENT_CONN_ERROR = KEVENT_BASE + 2, ISCSI_KEVENT_IF_ERROR = KEVENT_BASE + 3, + ISCSI_KEVENT_DESTROY_SESSION = KEVENT_BASE + 4, +}; + +enum iscsi_tgt_dscvr { + ISCSI_TGT_DSCVR_SEND_TARGETS = 1, + ISCSI_TGT_DSCVR_ISNS = 2, + ISCSI_TGT_DSCVR_SLP = 3, }; struct iscsi_uevent { @@ -60,61 +73,98 @@ struct iscsi_uevent { uint32_t initial_cmdsn; } c_session; struct msg_destroy_session { - uint64_t session_handle; uint32_t sid; } d_session; struct msg_create_conn { - uint64_t session_handle; - uint32_t cid; uint32_t sid; + uint32_t cid; } c_conn; struct msg_bind_conn { - uint64_t session_handle; - uint64_t conn_handle; - uint32_t transport_fd; + uint32_t sid; + uint32_t cid; + uint64_t transport_eph; uint32_t is_leading; } b_conn; struct msg_destroy_conn { - uint64_t conn_handle; + uint32_t sid; uint32_t cid; } d_conn; struct msg_send_pdu { + uint32_t sid; + uint32_t cid; uint32_t hdr_size; uint32_t data_size; - uint64_t conn_handle; } send_pdu; struct msg_set_param { - uint64_t conn_handle; + uint32_t sid; + uint32_t cid; uint32_t param; /* enum iscsi_param */ - uint32_t value; + uint32_t len; } set_param; struct msg_start_conn { - uint64_t conn_handle; + uint32_t sid; + uint32_t cid; } start_conn; struct msg_stop_conn { + uint32_t sid; + uint32_t cid; uint64_t conn_handle; uint32_t flag; } stop_conn; struct msg_get_stats { - uint64_t conn_handle; + uint32_t sid; + uint32_t cid; } get_stats; + struct msg_transport_connect { + uint32_t non_blocking; + } ep_connect; + struct msg_transport_poll { + uint64_t ep_handle; + uint32_t timeout_ms; + } ep_poll; + struct msg_transport_disconnect { + uint64_t ep_handle; + } ep_disconnect; + struct msg_tgt_dscvr { + enum iscsi_tgt_dscvr type; + uint32_t host_no; + /* + * enable = 1 to establish a new connection + * with the server. enable = 0 to disconnect + * from the server. Used primarily to switch + * from one iSNS server to another. + */ + uint32_t enable; + } tgt_dscvr; } u; union { /* messages k -> u */ - uint64_t handle; int retcode; struct msg_create_session_ret { - uint64_t session_handle; uint32_t sid; + uint32_t host_no; } c_session_ret; + struct msg_create_conn_ret { + uint32_t sid; + uint32_t cid; + } c_conn_ret; struct msg_recv_req { + uint32_t sid; + uint32_t cid; uint64_t recv_handle; - uint64_t conn_handle; } recv_req; struct msg_conn_error { - uint64_t conn_handle; + uint32_t sid; + uint32_t cid; uint32_t error; /* enum iscsi_err */ } connerror; + struct msg_session_destroyed { + uint32_t host_no; + uint32_t sid; + } d_session; + struct msg_transport_connect_ret { + uint64_t handle; + } ep_connect_ret; } r; } __attribute__ ((aligned (sizeof(uint64_t)))); @@ -139,29 +189,66 @@ enum iscsi_err { ISCSI_ERR_SESSION_FAILED = ISCSI_ERR_BASE + 13, ISCSI_ERR_HDR_DGST = ISCSI_ERR_BASE + 14, ISCSI_ERR_DATA_DGST = ISCSI_ERR_BASE + 15, - ISCSI_ERR_PARAM_NOT_FOUND = ISCSI_ERR_BASE + 16 + ISCSI_ERR_PARAM_NOT_FOUND = ISCSI_ERR_BASE + 16, + ISCSI_ERR_NO_SCSI_CMD = ISCSI_ERR_BASE + 17, }; /* * iSCSI Parameters (RFC3720) */ enum iscsi_param { - ISCSI_PARAM_MAX_RECV_DLENGTH = 0, - ISCSI_PARAM_MAX_XMIT_DLENGTH = 1, - ISCSI_PARAM_HDRDGST_EN = 2, - ISCSI_PARAM_DATADGST_EN = 3, - ISCSI_PARAM_INITIAL_R2T_EN = 4, - ISCSI_PARAM_MAX_R2T = 5, - ISCSI_PARAM_IMM_DATA_EN = 6, - ISCSI_PARAM_FIRST_BURST = 7, - ISCSI_PARAM_MAX_BURST = 8, - ISCSI_PARAM_PDU_INORDER_EN = 9, - ISCSI_PARAM_DATASEQ_INORDER_EN = 10, - ISCSI_PARAM_ERL = 11, - ISCSI_PARAM_IFMARKER_EN = 12, - ISCSI_PARAM_OFMARKER_EN = 13, + /* passed in using netlink set param */ + ISCSI_PARAM_MAX_RECV_DLENGTH, + ISCSI_PARAM_MAX_XMIT_DLENGTH, + ISCSI_PARAM_HDRDGST_EN, + ISCSI_PARAM_DATADGST_EN, + ISCSI_PARAM_INITIAL_R2T_EN, + ISCSI_PARAM_MAX_R2T, + ISCSI_PARAM_IMM_DATA_EN, + ISCSI_PARAM_FIRST_BURST, + ISCSI_PARAM_MAX_BURST, + ISCSI_PARAM_PDU_INORDER_EN, + ISCSI_PARAM_DATASEQ_INORDER_EN, + ISCSI_PARAM_ERL, + ISCSI_PARAM_IFMARKER_EN, + ISCSI_PARAM_OFMARKER_EN, + ISCSI_PARAM_EXP_STATSN, + ISCSI_PARAM_TARGET_NAME, + ISCSI_PARAM_TPGT, + ISCSI_PARAM_PERSISTENT_ADDRESS, + ISCSI_PARAM_PERSISTENT_PORT, + ISCSI_PARAM_SESS_RECOVERY_TMO, + + /* pased in through bind conn using transport_fd */ + ISCSI_PARAM_CONN_PORT, + ISCSI_PARAM_CONN_ADDRESS, + + /* must always be last */ + ISCSI_PARAM_MAX, }; -#define ISCSI_PARAM_MAX 14 + +#define ISCSI_MAX_RECV_DLENGTH (1 << ISCSI_PARAM_MAX_RECV_DLENGTH) +#define ISCSI_MAX_XMIT_DLENGTH (1 << ISCSI_PARAM_MAX_XMIT_DLENGTH) +#define ISCSI_HDRDGST_EN (1 << ISCSI_PARAM_HDRDGST_EN) +#define ISCSI_DATADGST_EN (1 << ISCSI_PARAM_DATADGST_EN) +#define ISCSI_INITIAL_R2T_EN (1 << ISCSI_PARAM_INITIAL_R2T_EN) +#define ISCSI_MAX_R2T (1 << ISCSI_PARAM_MAX_R2T) +#define ISCSI_IMM_DATA_EN (1 << ISCSI_PARAM_IMM_DATA_EN) +#define ISCSI_FIRST_BURST (1 << ISCSI_PARAM_FIRST_BURST) +#define ISCSI_MAX_BURST (1 << ISCSI_PARAM_MAX_BURST) +#define ISCSI_PDU_INORDER_EN (1 << ISCSI_PARAM_PDU_INORDER_EN) +#define ISCSI_DATASEQ_INORDER_EN (1 << ISCSI_PARAM_DATASEQ_INORDER_EN) +#define ISCSI_ERL (1 << ISCSI_PARAM_ERL) +#define ISCSI_IFMARKER_EN (1 << ISCSI_PARAM_IFMARKER_EN) +#define ISCSI_OFMARKER_EN (1 << ISCSI_PARAM_OFMARKER_EN) +#define ISCSI_EXP_STATSN (1 << ISCSI_PARAM_EXP_STATSN) +#define ISCSI_TARGET_NAME (1 << ISCSI_PARAM_TARGET_NAME) +#define ISCSI_TPGT (1 << ISCSI_PARAM_TPGT) +#define ISCSI_PERSISTENT_ADDRESS (1 << ISCSI_PARAM_PERSISTENT_ADDRESS) +#define ISCSI_PERSISTENT_PORT (1 << ISCSI_PARAM_PERSISTENT_PORT) +#define ISCSI_SESS_RECOVERY_TMO (1 << ISCSI_PARAM_SESS_RECOVERY_TMO) +#define ISCSI_CONN_PORT (1 << ISCSI_PARAM_CONN_PORT) +#define ISCSI_CONN_ADDRESS (1 << ISCSI_PARAM_CONN_ADDRESS) #define iscsi_ptr(_handle) ((void*)(unsigned long)_handle) #define iscsi_handle(_ptr) ((uint64_t)(unsigned long)_ptr) diff --git a/include/scsi/iscsi_proto.h b/include/scsi/iscsi_proto.h index 4feda05fd..02f6e4b9e 100644 --- a/include/scsi/iscsi_proto.h +++ b/include/scsi/iscsi_proto.h @@ -21,8 +21,6 @@ #ifndef ISCSI_PROTO_H #define ISCSI_PROTO_H -#define ISCSI_VERSION_STR "0.3" -#define ISCSI_DATE_STR "22-Apr-2005" #define ISCSI_DRAFT20_VERSION 0x00 /* default iSCSI listen port for incoming connections */ diff --git a/include/scsi/libiscsi.h b/include/scsi/libiscsi.h new file mode 100644 index 000000000..41904f611 --- /dev/null +++ b/include/scsi/libiscsi.h @@ -0,0 +1,310 @@ +/* + * iSCSI lib definitions + * + * Copyright (C) 2006 Red Hat, Inc. All rights reserved. + * Copyright (C) 2004 - 2006 Mike Christie + * Copyright (C) 2004 - 2005 Dmitry Yusupov + * Copyright (C) 2004 - 2005 Alex Aizman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +#ifndef LIBISCSI_H +#define LIBISCSI_H + +#include +#include +#include +#include + +struct scsi_transport_template; +struct scsi_device; +struct Scsi_Host; +struct scsi_cmnd; +struct socket; +struct iscsi_transport; +struct iscsi_cls_session; +struct iscsi_cls_conn; +struct iscsi_session; +struct iscsi_nopin; + +/* #define DEBUG_SCSI */ +#ifdef DEBUG_SCSI +#define debug_scsi(fmt...) printk(KERN_INFO "iscsi: " fmt) +#else +#define debug_scsi(fmt...) +#endif + +#define ISCSI_XMIT_CMDS_MAX 128 /* must be power of 2 */ +#define ISCSI_MGMT_CMDS_MAX 32 /* must be power of 2 */ +#define ISCSI_CONN_MAX 1 + +#define ISCSI_MGMT_ITT_OFFSET 0xa00 + +#define ISCSI_DEF_CMD_PER_LUN 32 +#define ISCSI_MAX_CMD_PER_LUN 128 + +/* Task Mgmt states */ +#define TMABORT_INITIAL 0x0 +#define TMABORT_SUCCESS 0x1 +#define TMABORT_FAILED 0x2 +#define TMABORT_TIMEDOUT 0x3 +#define TMABORT_NOT_FOUND 0x4 + +/* Connection suspend "bit" */ +#define ISCSI_SUSPEND_BIT 1 + +#define ISCSI_ITT_MASK (0xfff) +#define ISCSI_CID_SHIFT 12 +#define ISCSI_CID_MASK (0xffff << ISCSI_CID_SHIFT) +#define ISCSI_AGE_SHIFT 28 +#define ISCSI_AGE_MASK (0xf << ISCSI_AGE_SHIFT) + +struct iscsi_mgmt_task { + /* + * Becuae LLDs allocate their hdr differently, this is a pointer to + * that storage. It must be setup at session creation time. + */ + struct iscsi_hdr *hdr; + char *data; /* mgmt payload */ + int data_count; /* counts data to be sent */ + uint32_t itt; /* this ITT */ + void *dd_data; /* driver/transport data */ + struct list_head running; +}; + +enum { + ISCSI_TASK_COMPLETED, + ISCSI_TASK_PENDING, + ISCSI_TASK_RUNNING, +}; + +struct iscsi_cmd_task { + /* + * Becuae LLDs allocate their hdr differently, this is a pointer to + * that storage. It must be setup at session creation time. + */ + struct iscsi_cmd *hdr; + int itt; /* this ITT */ + int datasn; /* DataSN */ + + uint32_t unsol_datasn; + int imm_count; /* imm-data (bytes) */ + int unsol_count; /* unsolicited (bytes)*/ + int data_count; /* remaining Data-Out */ + struct scsi_cmnd *sc; /* associated SCSI cmd*/ + int total_length; + struct iscsi_conn *conn; /* used connection */ + struct iscsi_mgmt_task *mtask; /* tmf mtask in progr */ + + /* state set/tested under session->lock */ + int state; + struct list_head running; /* running cmd list */ + void *dd_data; /* driver/transport data */ +}; + +struct iscsi_conn { + struct iscsi_cls_conn *cls_conn; /* ptr to class connection */ + void *dd_data; /* iscsi_transport data */ + struct iscsi_session *session; /* parent session */ + /* + * LLDs should set this lock. It protects the transport recv + * code + */ + rwlock_t *recv_lock; + /* + * conn_stop() flag: stop to recover, stop to terminate + */ + int stop_stage; + + /* iSCSI connection-wide sequencing */ + uint32_t exp_statsn; + + /* control data */ + int id; /* CID */ + struct list_head item; /* maintains list of conns */ + int c_stage; /* connection state */ + /* + * Preallocated buffer for pdus that have data but do not + * originate from scsi-ml. We never have two pdus using the + * buffer at the same time. It is only allocated to + * the default max recv size because the pdus we support + * should always fit in this buffer + */ + char *data; + struct iscsi_mgmt_task *login_mtask; /* mtask used for login/text */ + struct iscsi_mgmt_task *mtask; /* xmit mtask in progress */ + struct iscsi_cmd_task *ctask; /* xmit ctask in progress */ + + /* xmit */ + struct kfifo *immqueue; /* immediate xmit queue */ + struct kfifo *mgmtqueue; /* mgmt (control) xmit queue */ + struct list_head mgmt_run_list; /* list of control tasks */ + struct list_head xmitqueue; /* data-path cmd queue */ + struct list_head run_list; /* list of cmds in progress */ + struct work_struct xmitwork; /* per-conn. xmit workqueue */ + /* + * serializes connection xmit, access to kfifos: + * xmitqueue, immqueue, mgmtqueue + */ + struct mutex xmitmutex; + + unsigned long suspend_tx; /* suspend Tx */ + unsigned long suspend_rx; /* suspend Rx */ + + /* abort */ + wait_queue_head_t ehwait; /* used in eh_abort() */ + struct iscsi_tm tmhdr; + struct timer_list tmabort_timer; + int tmabort_state; /* see TMABORT_INITIAL, etc.*/ + + /* negotiated params */ + int max_recv_dlength; /* initiator_max_recv_dsl*/ + int max_xmit_dlength; /* target_max_recv_dsl */ + int hdrdgst_en; + int datadgst_en; + int ifmarker_en; + int ofmarker_en; + /* values userspace uses to id a conn */ + int persistent_port; + char *persistent_address; + + /* MIB-statistics */ + uint64_t txdata_octets; + uint64_t rxdata_octets; + uint32_t scsicmd_pdus_cnt; + uint32_t dataout_pdus_cnt; + uint32_t scsirsp_pdus_cnt; + uint32_t datain_pdus_cnt; + uint32_t r2t_pdus_cnt; + uint32_t tmfcmd_pdus_cnt; + int32_t tmfrsp_pdus_cnt; + + /* custom statistics */ + uint32_t eh_abort_cnt; +}; + +struct iscsi_queue { + struct kfifo *queue; /* FIFO Queue */ + void **pool; /* Pool of elements */ + int max; /* Max number of elements */ +}; + +struct iscsi_session { + /* iSCSI session-wide sequencing */ + uint32_t cmdsn; + uint32_t exp_cmdsn; + uint32_t max_cmdsn; + + /* configuration */ + int initial_r2t_en; + int max_r2t; + int imm_data_en; + int first_burst; + int max_burst; + int time2wait; + int time2retain; + int pdu_inorder_en; + int dataseq_inorder_en; + int erl; + int tpgt; + char *targetname; + + /* control data */ + struct iscsi_transport *tt; + struct Scsi_Host *host; + struct iscsi_conn *leadconn; /* leading connection */ + spinlock_t lock; /* protects session state, * + * sequence numbers, * + * session resources: * + * - cmdpool, * + * - mgmtpool, * + * - r2tpool */ + int state; /* session state */ + struct list_head item; + int age; /* counts session re-opens */ + + struct list_head connections; /* list of connections */ + int cmds_max; /* size of cmds array */ + struct iscsi_cmd_task **cmds; /* Original Cmds arr */ + struct iscsi_queue cmdpool; /* PDU's pool */ + int mgmtpool_max; /* size of mgmt array */ + struct iscsi_mgmt_task **mgmt_cmds; /* Original mgmt arr */ + struct iscsi_queue mgmtpool; /* Mgmt PDU's pool */ +}; + +/* + * scsi host template + */ +extern int iscsi_change_queue_depth(struct scsi_device *sdev, int depth); +extern int iscsi_eh_abort(struct scsi_cmnd *sc); +extern int iscsi_eh_host_reset(struct scsi_cmnd *sc); +extern int iscsi_queuecommand(struct scsi_cmnd *sc, + void (*done)(struct scsi_cmnd *)); + +/* + * session management + */ +extern struct iscsi_cls_session * +iscsi_session_setup(struct iscsi_transport *, struct scsi_transport_template *, + int, int, uint32_t, uint32_t *); +extern void iscsi_session_teardown(struct iscsi_cls_session *); +extern struct iscsi_session *class_to_transport_session(struct iscsi_cls_session *); +extern void iscsi_session_recovery_timedout(struct iscsi_cls_session *); +extern int iscsi_set_param(struct iscsi_cls_conn *cls_conn, + enum iscsi_param param, char *buf, int buflen); +extern int iscsi_session_get_param(struct iscsi_cls_session *cls_session, + enum iscsi_param param, char *buf); + +#define session_to_cls(_sess) \ + hostdata_session(_sess->host->hostdata) + +/* + * connection management + */ +extern struct iscsi_cls_conn *iscsi_conn_setup(struct iscsi_cls_session *, + uint32_t); +extern void iscsi_conn_teardown(struct iscsi_cls_conn *); +extern int iscsi_conn_start(struct iscsi_cls_conn *); +extern void iscsi_conn_stop(struct iscsi_cls_conn *, int); +extern int iscsi_conn_bind(struct iscsi_cls_session *, struct iscsi_cls_conn *, + int); +extern void iscsi_conn_failure(struct iscsi_conn *conn, enum iscsi_err err); +extern int iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn, + enum iscsi_param param, char *buf); + +/* + * pdu and task processing + */ +extern int iscsi_check_assign_cmdsn(struct iscsi_session *, + struct iscsi_nopin *); +extern void iscsi_prep_unsolicit_data_pdu(struct iscsi_cmd_task *, + struct iscsi_data *hdr, + int transport_data_cnt); +extern int iscsi_conn_send_pdu(struct iscsi_cls_conn *, struct iscsi_hdr *, + char *, uint32_t); +extern int iscsi_complete_pdu(struct iscsi_conn *, struct iscsi_hdr *, + char *, int); +extern int __iscsi_complete_pdu(struct iscsi_conn *, struct iscsi_hdr *, + char *, int); +extern int iscsi_verify_itt(struct iscsi_conn *, struct iscsi_hdr *, + uint32_t *); + +/* + * generic helpers + */ +extern void iscsi_pool_free(struct iscsi_queue *, void **); +extern int iscsi_pool_init(struct iscsi_queue *, int, void ***, int); + +#endif diff --git a/include/scsi/scsi_cmnd.h b/include/scsi/scsi_cmnd.h index 1ace1b9fe..58e6444ee 100644 --- a/include/scsi/scsi_cmnd.h +++ b/include/scsi/scsi_cmnd.h @@ -9,7 +9,6 @@ struct request; struct scatterlist; struct scsi_device; -struct scsi_request; /* embedded in scsi_cmnd */ @@ -29,13 +28,8 @@ struct scsi_pointer { }; struct scsi_cmnd { - int sc_magic; - struct scsi_device *device; - struct scsi_request *sc_request; - struct list_head list; /* scsi_cmnd participates in queue lists */ - struct list_head eh_entry; /* entry for the host eh_cmd_q */ int eh_eflags; /* Used by error handlr */ void (*done) (struct scsi_cmnd *); /* Mid-level done function */ @@ -64,9 +58,7 @@ struct scsi_cmnd { int timeout_per_command; unsigned char cmd_len; - unsigned char old_cmd_len; enum dma_data_direction sc_data_direction; - enum dma_data_direction sc_old_data_direction; /* These elements define the operation we are about to perform */ #define MAX_COMMAND_SIZE 16 @@ -77,18 +69,11 @@ struct scsi_cmnd { void *request_buffer; /* Actual requested buffer */ /* These elements define the operation we ultimately want to perform */ - unsigned char data_cmnd[MAX_COMMAND_SIZE]; - unsigned short old_use_sg; /* We save use_sg here when requesting - * sense info */ unsigned short use_sg; /* Number of pieces of scatter-gather */ unsigned short sglist_len; /* size of malloc'd scatter-gather list */ - unsigned bufflen; /* Size of data buffer */ - void *buffer; /* Data buffer */ unsigned underflow; /* Return error if less than this amount is transferred */ - unsigned old_underflow; /* save underflow here when reusing the - * command for error handling */ unsigned transfersize; /* How much we are guaranteed to transfer with each SCSI transfer @@ -149,7 +134,12 @@ struct scsi_cmnd { 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_io_completion(struct scsi_cmnd *, unsigned int); extern void scsi_finish_command(struct scsi_cmnd *cmd); +extern void scsi_req_abort_cmd(struct scsi_cmnd *cmd); + +extern void *scsi_kmap_atomic_sg(struct scatterlist *sg, int sg_count, + size_t *offset, size_t *len); +extern void scsi_kunmap_atomic_sg(void *virt); #endif /* _SCSI_SCSI_CMND_H */ diff --git a/include/scsi/scsi_dbg.h b/include/scsi/scsi_dbg.h index 12e90934a..3bbbfbe8c 100644 --- a/include/scsi/scsi_dbg.h +++ b/include/scsi/scsi_dbg.h @@ -2,19 +2,18 @@ #define _SCSI_SCSI_DBG_H struct scsi_cmnd; -struct scsi_request; +struct scsi_sense_hdr; extern void scsi_print_command(struct scsi_cmnd *); +extern void scsi_print_sense_hdr(const char *, struct scsi_sense_hdr *); extern void __scsi_print_command(unsigned char *); extern void scsi_print_sense(const char *, struct scsi_cmnd *); -extern void scsi_print_req_sense(const char *, struct scsi_request *); extern void __scsi_print_sense(const char *name, const unsigned char *sense_buffer, int sense_len); 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); diff --git a/include/scsi/scsi_devinfo.h b/include/scsi/scsi_devinfo.h index d31b16d25..b4ddd3b18 100644 --- a/include/scsi/scsi_devinfo.h +++ b/include/scsi/scsi_devinfo.h @@ -29,4 +29,5 @@ #define BLIST_SELECT_NO_ATN 0x200000 /* select without ATN */ #define BLIST_RETRY_HWERROR 0x400000 /* retry HARDWARE_ERROR */ #define BLIST_MAX_512 0x800000 /* maximum 512 sector cdb length */ +#define BLIST_ATTACH_PQ3 0x1000000 /* Scan: Attach to PQ3 devices */ #endif diff --git a/include/scsi/scsi_eh.h b/include/scsi/scsi_eh.h index d160880b2..c5c0f6762 100644 --- a/include/scsi/scsi_eh.h +++ b/include/scsi/scsi_eh.h @@ -3,7 +3,6 @@ struct scsi_cmnd; struct scsi_device; -struct scsi_request; struct Scsi_Host; /* @@ -43,8 +42,6 @@ extern void scsi_report_device_reset(struct Scsi_Host *, int, int); extern int scsi_block_when_processing_errors(struct scsi_device *); extern int scsi_normalize_sense(const u8 *sense_buffer, int sb_len, struct scsi_sense_hdr *sshdr); -extern int scsi_request_normalize_sense(struct scsi_request *sreq, - struct scsi_sense_hdr *sshdr); extern int scsi_command_normalize_sense(struct scsi_cmnd *cmd, struct scsi_sense_hdr *sshdr); diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h index de6ce541a..b3dd90f3e 100644 --- a/include/scsi/scsi_host.h +++ b/include/scsi/scsi_host.h @@ -472,6 +472,7 @@ struct Scsi_Host { */ unsigned int host_busy; /* commands actually active on low-level */ unsigned int host_failed; /* commands that failed. */ + unsigned int host_eh_scheduled; /* EH scheduled without command */ unsigned short host_no; /* Used for IOCTL_GET_IDLUN, /proc/scsi et al. */ int resetting; /* if set, it means that last_reset is a valid value */ @@ -541,6 +542,9 @@ struct Scsi_Host { */ unsigned ordered_tag:1; + /* task mgmt function in progress */ + unsigned tmf_in_progress:1; + /* * Optional work queue to be utilized by the transport */ @@ -618,7 +622,8 @@ static inline int scsi_host_in_recovery(struct Scsi_Host *shost) { return shost->shost_state == SHOST_RECOVERY || shost->shost_state == SHOST_CANCEL_RECOVERY || - shost->shost_state == SHOST_DEL_RECOVERY; + shost->shost_state == SHOST_DEL_RECOVERY || + shost->tmf_in_progress; } extern int scsi_queue_work(struct Scsi_Host *, struct work_struct *); diff --git a/include/scsi/scsi_request.h b/include/scsi/scsi_request.h deleted file mode 100644 index 98d69fdb8..000000000 --- a/include/scsi/scsi_request.h +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef _SCSI_SCSI_REQUEST_H -#define _SCSI_SCSI_REQUEST_H - -#include - -struct request; -struct scsi_cmnd; -struct scsi_device; -struct Scsi_Host; - - -/* - * This is essentially a slimmed down version of Scsi_Cmnd. The point of - * having this is that requests that are injected into the queue as result - * of things like ioctls and character devices shouldn't be using a - * Scsi_Cmnd until such a time that the command is actually at the head - * of the queue and being sent to the driver. - */ -struct scsi_request { - int sr_magic; - int sr_result; /* Status code from lower level driver */ - unsigned char sr_sense_buffer[SCSI_SENSE_BUFFERSIZE]; /* obtained by REQUEST SENSE - * when CHECK CONDITION is - * received on original command - * (auto-sense) */ - - struct Scsi_Host *sr_host; - struct scsi_device *sr_device; - struct scsi_cmnd *sr_command; - struct request *sr_request; /* A copy of the command we are - working on */ - unsigned sr_bufflen; /* Size of data buffer */ - void *sr_buffer; /* Data buffer */ - int sr_allowed; - enum dma_data_direction sr_data_direction; - unsigned char sr_cmd_len; - unsigned char sr_cmnd[MAX_COMMAND_SIZE]; - void (*sr_done) (struct scsi_cmnd *); /* Mid-level done function */ - int sr_timeout_per_command; - unsigned short sr_use_sg; /* Number of pieces of scatter-gather */ - unsigned short sr_sglist_len; /* size of malloc'd scatter-gather list */ - unsigned sr_underflow; /* Return error if less than - this amount is transferred */ - void *upper_private_data; /* reserved for owner (usually upper - level driver) of this request */ -}; - -extern struct scsi_request *scsi_allocate_request(struct scsi_device *, gfp_t); -extern void scsi_release_request(struct scsi_request *); -extern void scsi_do_req(struct scsi_request *, const void *cmnd, - void *buffer, unsigned bufflen, - void (*done) (struct scsi_cmnd *), - int timeout, int retries); -#endif /* _SCSI_SCSI_REQUEST_H */ diff --git a/include/scsi/scsi_transport_fc.h b/include/scsi/scsi_transport_fc.h index 5626225bd..6d28b0317 100644 --- a/include/scsi/scsi_transport_fc.h +++ b/include/scsi/scsi_transport_fc.h @@ -27,7 +27,6 @@ #ifndef SCSI_TRANSPORT_FC_H #define SCSI_TRANSPORT_FC_H -#include #include #include diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h index b41cf077e..39e833260 100644 --- a/include/scsi/scsi_transport_iscsi.h +++ b/include/scsi/scsi_transport_iscsi.h @@ -2,7 +2,7 @@ * iSCSI transport class definitions * * Copyright (C) IBM Corporation, 2004 - * Copyright (C) Mike Christie, 2004 - 2005 + * Copyright (C) Mike Christie, 2004 - 2006 * Copyright (C) Dmitry Yusupov, 2004 - 2005 * Copyright (C) Alex Aizman, 2004 - 2005 * @@ -27,9 +27,14 @@ #include struct scsi_transport_template; +struct iscsi_transport; struct Scsi_Host; struct mempool_zone; struct iscsi_cls_conn; +struct iscsi_conn; +struct iscsi_cmd_task; +struct iscsi_mgmt_task; +struct sockaddr; /** * struct iscsi_transport - iSCSI Transport template @@ -42,10 +47,31 @@ struct iscsi_cls_conn; * @bind_conn: associate this connection with existing iSCSI session * and specified transport descriptor * @destroy_conn: destroy inactive iSCSI connection - * @set_param: set iSCSI Data-Path operational parameter + * @set_param: set iSCSI parameter. Return 0 on success, -ENODATA + * when param is not supported, and a -Exx value on other + * error. + * @get_param get iSCSI parameter. Must return number of bytes + * copied to buffer on success, -ENODATA when param + * is not supported, and a -Exx value on other error * @start_conn: set connection to be operational * @stop_conn: suspend/recover/terminate connection * @send_pdu: send iSCSI PDU, Login, Logout, NOP-Out, Reject, Text. + * @session_recovery_timedout: notify LLD a block during recovery timed out + * @init_cmd_task: Initialize a iscsi_cmd_task and any internal structs. + * Called from queuecommand with session lock held. + * @init_mgmt_task: Initialize a iscsi_mgmt_task and any internal structs. + * Called from iscsi_conn_send_generic with xmitmutex. + * @xmit_cmd_task: Requests LLD to transfer cmd task. Returns 0 or the + * the number of bytes transferred on success, and -Exyz + * value on error. + * @xmit_mgmt_task: Requests LLD to transfer mgmt task. Returns 0 or the + * the number of bytes transferred on success, and -Exyz + * value on error. + * @cleanup_cmd_task: requests LLD to fail cmd task. Called with xmitmutex + * and session->lock after the connection has been + * suspended and terminated during recovery. If called + * from abort task then connection is not suspended + * or terminated but sk_callback_lock is held * * Template API provided by iSCSI Transport */ @@ -53,38 +79,54 @@ struct iscsi_transport { struct module *owner; char *name; unsigned int caps; + /* LLD sets this to indicate what values it can export to sysfs */ + unsigned int param_mask; struct scsi_host_template *host_template; - /* LLD session/scsi_host data size */ - int hostdata_size; - /* LLD iscsi_host data size */ - int ihostdata_size; /* LLD connection data size */ int conndata_size; + /* LLD session data size */ + int sessiondata_size; int max_lun; unsigned int max_conn; unsigned int max_cmd_len; - struct iscsi_cls_session *(*create_session) - (struct scsi_transport_template *t, uint32_t sn, uint32_t *sid); + struct iscsi_cls_session *(*create_session) (struct iscsi_transport *it, + struct scsi_transport_template *t, uint32_t sn, uint32_t *hn); void (*destroy_session) (struct iscsi_cls_session *session); struct iscsi_cls_conn *(*create_conn) (struct iscsi_cls_session *sess, uint32_t cid); int (*bind_conn) (struct iscsi_cls_session *session, struct iscsi_cls_conn *cls_conn, - uint32_t transport_fd, int is_leading); + uint64_t transport_eph, int is_leading); int (*start_conn) (struct iscsi_cls_conn *conn); void (*stop_conn) (struct iscsi_cls_conn *conn, int flag); void (*destroy_conn) (struct iscsi_cls_conn *conn); int (*set_param) (struct iscsi_cls_conn *conn, enum iscsi_param param, - uint32_t value); + char *buf, int buflen); int (*get_conn_param) (struct iscsi_cls_conn *conn, - enum iscsi_param param, - uint32_t *value); + enum iscsi_param param, char *buf); int (*get_session_param) (struct iscsi_cls_session *session, - enum iscsi_param param, uint32_t *value); + enum iscsi_param param, char *buf); int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, char *data, uint32_t data_size); void (*get_stats) (struct iscsi_cls_conn *conn, struct iscsi_stats *stats); + void (*init_cmd_task) (struct iscsi_cmd_task *ctask); + void (*init_mgmt_task) (struct iscsi_conn *conn, + struct iscsi_mgmt_task *mtask, + char *data, uint32_t data_size); + int (*xmit_cmd_task) (struct iscsi_conn *conn, + struct iscsi_cmd_task *ctask); + void (*cleanup_cmd_task) (struct iscsi_conn *conn, + struct iscsi_cmd_task *ctask); + int (*xmit_mgmt_task) (struct iscsi_conn *conn, + struct iscsi_mgmt_task *mtask); + void (*session_recovery_timedout) (struct iscsi_cls_session *session); + int (*ep_connect) (struct sockaddr *dst_addr, int non_blocking, + uint64_t *ep_handle); + int (*ep_poll) (uint64_t ep_handle, int timeout_ms); + void (*ep_disconnect) (uint64_t ep_handle); + int (*tgt_dscvr) (enum iscsi_tgt_dscvr type, uint32_t host_no, + uint32_t enable, struct sockaddr *dst_addr); }; /* @@ -100,10 +142,19 @@ extern void iscsi_conn_error(struct iscsi_cls_conn *conn, enum iscsi_err error); extern int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, char *data, uint32_t data_size); + +/* Connection's states */ +#define ISCSI_CONN_INITIAL_STAGE 0 +#define ISCSI_CONN_STARTED 1 +#define ISCSI_CONN_STOPPED 2 +#define ISCSI_CONN_CLEANUP_WAIT 3 + struct iscsi_cls_conn { struct list_head conn_list; /* item in connlist */ void *dd_data; /* LLD private data */ struct iscsi_transport *transport; + uint32_t cid; /* connection id */ + int active; /* must be accessed with the connlock */ struct device dev; /* sysfs transport/container device */ struct mempool_zone *z_error; @@ -114,9 +165,27 @@ struct iscsi_cls_conn { #define iscsi_dev_to_conn(_dev) \ container_of(_dev, struct iscsi_cls_conn, dev) +/* Session's states */ +#define ISCSI_STATE_FREE 1 +#define ISCSI_STATE_LOGGED_IN 2 +#define ISCSI_STATE_FAILED 3 +#define ISCSI_STATE_TERMINATE 4 +#define ISCSI_STATE_IN_RECOVERY 5 +#define ISCSI_STATE_RECOVERY_FAILED 6 + struct iscsi_cls_session { struct list_head sess_list; /* item in session_list */ + struct list_head host_list; struct iscsi_transport *transport; + + /* recovery fields */ + int recovery_tmo; + struct work_struct recovery_work; + + int target_id; + + int sid; /* session id */ + void *dd_data; /* LLD private data */ struct device dev; /* sysfs transport/container device */ }; @@ -126,22 +195,34 @@ struct iscsi_cls_session { #define iscsi_session_to_shost(_session) \ dev_to_shost(_session->dev.parent) +#define starget_to_session(_stgt) \ + iscsi_dev_to_session(_stgt->dev.parent) + +struct iscsi_host { + struct list_head sessions; + struct mutex mutex; +}; + /* * session and connection functions that can be used by HW iSCSI LLDs */ +extern struct iscsi_cls_session *iscsi_alloc_session(struct Scsi_Host *shost, + struct iscsi_transport *transport); +extern int iscsi_add_session(struct iscsi_cls_session *session, + unsigned int target_id); +extern int iscsi_if_create_session_done(struct iscsi_cls_conn *conn); +extern int iscsi_if_destroy_session_done(struct iscsi_cls_conn *conn); extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost, - struct iscsi_transport *t); + struct iscsi_transport *t, + unsigned int target_id); +extern void iscsi_remove_session(struct iscsi_cls_session *session); +extern void iscsi_free_session(struct iscsi_cls_session *session); extern int iscsi_destroy_session(struct iscsi_cls_session *session); extern struct iscsi_cls_conn *iscsi_create_conn(struct iscsi_cls_session *sess, uint32_t cid); extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn); +extern void iscsi_unblock_session(struct iscsi_cls_session *session); +extern void iscsi_block_session(struct iscsi_cls_session *session); -/* - * session functions used by software iscsi - */ -extern struct Scsi_Host * -iscsi_transport_create_session(struct scsi_transport_template *scsit, - struct iscsi_transport *transport); -extern int iscsi_transport_destroy_session(struct Scsi_Host *shost); #endif diff --git a/include/scsi/scsi_transport_sas.h b/include/scsi/scsi_transport_sas.h index 93cfb4bf4..6cc231409 100644 --- a/include/scsi/scsi_transport_sas.h +++ b/include/scsi/scsi_transport_sas.h @@ -3,6 +3,7 @@ #include #include +#include struct scsi_transport_template; struct sas_rphy; @@ -55,7 +56,6 @@ struct sas_phy { enum sas_linkrate minimum_linkrate; enum sas_linkrate maximum_linkrate_hw; enum sas_linkrate maximum_linkrate; - u8 port_identifier; /* internal state */ unsigned int local_attached : 1; @@ -66,8 +66,8 @@ struct sas_phy { u32 loss_of_dword_sync_count; u32 phy_reset_problem_count; - /* the other end of the link */ - struct sas_rphy *rphy; + /* for the list of phys belonging to a port */ + struct list_head port_siblings; }; #define dev_to_phy(d) \ @@ -106,6 +106,7 @@ struct sas_end_device { struct sas_expander_device { int level; + int next_port_id; #define SAS_EXPANDER_VENDOR_ID_LEN 8 char vendor_id[SAS_EXPANDER_VENDOR_ID_LEN+1]; @@ -124,6 +125,26 @@ struct sas_expander_device { #define rphy_to_expander_device(r) \ container_of((r), struct sas_expander_device, rphy) +struct sas_port { + struct device dev; + + int port_identifier; + int num_phys; + /* port flags */ + unsigned int is_backlink:1; + + /* the other end of the link */ + struct sas_rphy *rphy; + + struct mutex phy_list_mutex; + struct list_head phy_list; +}; + +#define dev_to_sas_port(d) \ + container_of((d), struct sas_port, dev) +#define transport_class_to_sas_port(cdev) \ + dev_to_sas_port((cdev)->dev) + /* The functions by which the transport class and the driver communicate */ struct sas_function_template { int (*get_linkerrors)(struct sas_phy *); @@ -133,6 +154,7 @@ struct sas_function_template { }; +void sas_remove_children(struct device *); extern void sas_remove_host(struct Scsi_Host *); extern struct sas_phy *sas_phy_alloc(struct device *, int); @@ -141,13 +163,23 @@ extern int sas_phy_add(struct sas_phy *); extern void sas_phy_delete(struct sas_phy *); extern int scsi_is_sas_phy(const struct device *); -extern struct sas_rphy *sas_end_device_alloc(struct sas_phy *); -extern struct sas_rphy *sas_expander_alloc(struct sas_phy *, enum sas_device_type); +extern struct sas_rphy *sas_end_device_alloc(struct sas_port *); +extern struct sas_rphy *sas_expander_alloc(struct sas_port *, enum sas_device_type); void sas_rphy_free(struct sas_rphy *); extern int sas_rphy_add(struct sas_rphy *); extern void sas_rphy_delete(struct sas_rphy *); extern int scsi_is_sas_rphy(const struct device *); +struct sas_port *sas_port_alloc(struct device *, int); +struct sas_port *sas_port_alloc_num(struct device *); +int sas_port_add(struct sas_port *); +void sas_port_free(struct sas_port *); +void sas_port_delete(struct sas_port *); +void sas_port_add_phy(struct sas_port *, struct sas_phy *); +void sas_port_delete_phy(struct sas_port *, struct sas_phy *); +void sas_port_mark_backlink(struct sas_port *); +int scsi_is_sas_port(const struct device *); + extern struct scsi_transport_template * sas_attach_transport(struct sas_function_template *); extern void sas_release_transport(struct scsi_transport_template *); diff --git a/include/scsi/scsi_transport_spi.h b/include/scsi/scsi_transport_spi.h index 5e1d61913..302680c0c 100644 --- a/include/scsi/scsi_transport_spi.h +++ b/include/scsi/scsi_transport_spi.h @@ -20,7 +20,6 @@ #ifndef SCSI_TRANSPORT_SPI_H #define SCSI_TRANSPORT_SPI_H -#include #include #include diff --git a/include/scsi/sg_request.h b/include/scsi/sg_request.h deleted file mode 100644 index 57ff525bd..000000000 --- a/include/scsi/sg_request.h +++ /dev/null @@ -1,26 +0,0 @@ -typedef struct scsi_request Scsi_Request; - -static Scsi_Request *dummy_cmdp; /* only used for sizeof */ - -typedef struct sg_scatter_hold { /* holding area for scsi scatter gather info */ - unsigned short k_use_sg; /* Count of kernel scatter-gather pieces */ - 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) */ - char dio_in_use; /* 0->indirect IO (or mmap), 1->dio */ - unsigned char cmd_opcode; /* first byte of command */ -} Sg_scatter_hold; - -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 */ - unsigned char sense_b[sizeof (dummy_cmdp->sr_sense_buffer)]; - 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 */ - volatile char done; /* 0->before bh, 1->before read, 2->read */ -} Sg_request; diff --git a/include/scsi/srp.h b/include/scsi/srp.h index 637f77ecc..ad178fa78 100644 --- a/include/scsi/srp.h +++ b/include/scsi/srp.h @@ -87,6 +87,11 @@ enum srp_login_rej_reason { SRP_LOGIN_REJ_CHANNEL_LIMIT_REACHED = 0x00010006 }; +enum { + SRP_REV10_IB_IO_CLASS = 0xff00, + SRP_REV16A_IB_IO_CLASS = 0x0100 +}; + struct srp_direct_buf { __be64 va; __be32 key; diff --git a/include/sound/ac97_codec.h b/include/sound/ac97_codec.h index b45a73712..758f8bf13 100644 --- a/include/sound/ac97_codec.h +++ b/include/sound/ac97_codec.h @@ -265,6 +265,7 @@ /* specific - Analog Devices */ #define AC97_AD_TEST 0x5a /* test register */ +#define AC97_AD_TEST2 0x5c /* undocumented test register 2 */ #define AC97_AD_CODEC_CFG 0x70 /* codec configuration */ #define AC97_AD_JACK_SPDIF 0x72 /* Jack Sense & S/PDIF */ #define AC97_AD_SERIAL_CFG 0x74 /* Serial Configuration */ @@ -378,6 +379,7 @@ #define AC97_HAS_NO_MIC (1<<15) /* no MIC volume */ #define AC97_HAS_NO_TONE (1<<16) /* no Tone volume */ #define AC97_HAS_NO_STD_PCM (1<<17) /* no standard AC97 PCM volume and mute */ +#define AC97_HAS_NO_AUX (1<<18) /* no standard AC97 AUX volume and mute */ /* rates indexes */ #define AC97_RATES_FRONT_DAC 0 diff --git a/include/sound/ak4xxx-adda.h b/include/sound/ak4xxx-adda.h index 3bf5911fe..3d9888492 100644 --- a/include/sound/ak4xxx-adda.h +++ b/include/sound/ak4xxx-adda.h @@ -32,8 +32,8 @@ struct snd_akm4xxx; struct snd_ak4xxx_ops { void (*lock)(struct snd_akm4xxx *ak, int chip); void (*unlock)(struct snd_akm4xxx *ak, int chip); - void (*write)(struct snd_akm4xxx *ak, int chip, unsigned char reg, unsigned char val); - // unsigned char (*read)(struct snd_akm4xxx *ak, int chip, unsigned char reg); + void (*write)(struct snd_akm4xxx *ak, int chip, unsigned char reg, + unsigned char val); void (*set_rate_val)(struct snd_akm4xxx *ak, unsigned int rate); }; @@ -41,29 +41,40 @@ struct snd_ak4xxx_ops { struct snd_akm4xxx { struct snd_card *card; - unsigned int num_adcs; /* AK4524 or AK4528 ADCs */ - unsigned int num_dacs; /* AK4524 or AK4528 DACs */ - unsigned char images[AK4XXX_IMAGE_SIZE]; /* saved register image */ - unsigned char ipga_gain[AK4XXX_MAX_CHIPS][2]; /* saved register image for IPGA (AK4528) */ + unsigned int num_adcs; /* AK4524 or AK4528 ADCs */ + unsigned int num_dacs; /* AK4524 or AK4528 DACs */ + unsigned char images[AK4XXX_IMAGE_SIZE]; /* saved register image */ + unsigned char ipga_gain[AK4XXX_MAX_CHIPS][2]; /* saved register image + * for IPGA (AK4528) + */ unsigned long private_value[AK4XXX_MAX_CHIPS]; /* helper for driver */ void *private_data[AK4XXX_MAX_CHIPS]; /* helper for driver */ /* template should fill the following fields */ - unsigned int idx_offset; /* control index offset */ + unsigned int idx_offset; /* control index offset */ enum { SND_AK4524, SND_AK4528, SND_AK4529, SND_AK4355, SND_AK4358, SND_AK4381 } type; + unsigned int *num_stereo; /* array of combined counts + * for the mixer + */ + char **channel_names; /* array of mixer channel names */ struct snd_ak4xxx_ops ops; }; -void snd_akm4xxx_write(struct snd_akm4xxx *ak, int chip, unsigned char reg, unsigned char val); +void snd_akm4xxx_write(struct snd_akm4xxx *ak, int chip, unsigned char reg, + unsigned char val); void snd_akm4xxx_reset(struct snd_akm4xxx *ak, int state); void snd_akm4xxx_init(struct snd_akm4xxx *ak); int snd_akm4xxx_build_controls(struct snd_akm4xxx *ak); -#define snd_akm4xxx_get(ak,chip,reg) (ak)->images[(chip) * 16 + (reg)] -#define snd_akm4xxx_set(ak,chip,reg,val) ((ak)->images[(chip) * 16 + (reg)] = (val)) -#define snd_akm4xxx_get_ipga(ak,chip,reg) (ak)->ipga_gain[chip][(reg)-4] -#define snd_akm4xxx_set_ipga(ak,chip,reg,val) ((ak)->ipga_gain[chip][(reg)-4] = (val)) +#define snd_akm4xxx_get(ak,chip,reg) \ + (ak)->images[(chip) * 16 + (reg)] +#define snd_akm4xxx_set(ak,chip,reg,val) \ + ((ak)->images[(chip) * 16 + (reg)] = (val)) +#define snd_akm4xxx_get_ipga(ak,chip,reg) \ + (ak)->ipga_gain[chip][(reg)-4] +#define snd_akm4xxx_set_ipga(ak,chip,reg,val) \ + ((ak)->ipga_gain[chip][(reg)-4] = (val)) #endif /* __SOUND_AK4XXX_ADDA_H */ diff --git a/include/sound/asequencer.h b/include/sound/asequencer.h index 6691e4aa4..3f2f4042a 100644 --- a/include/sound/asequencer.h +++ b/include/sound/asequencer.h @@ -605,6 +605,10 @@ struct snd_seq_remove_events { #define SNDRV_SEQ_PORT_TYPE_DIRECT_SAMPLE (1<<11) /* Sampling device (support sample download) */ #define SNDRV_SEQ_PORT_TYPE_SAMPLE (1<<12) /* Sampling device (sample can be downloaded at any time) */ /*...*/ +#define SNDRV_SEQ_PORT_TYPE_HARDWARE (1<<16) /* driver for a hardware device */ +#define SNDRV_SEQ_PORT_TYPE_SOFTWARE (1<<17) /* implemented in software */ +#define SNDRV_SEQ_PORT_TYPE_SYNTHESIZER (1<<18) /* generates sound */ +#define SNDRV_SEQ_PORT_TYPE_PORT (1<<19) /* connects to other device(s) */ #define SNDRV_SEQ_PORT_TYPE_APPLICATION (1<<20) /* application (sequencer/editor) */ /* misc. conditioning flags */ diff --git a/include/sound/asound.h b/include/sound/asound.h index 9cc021c7e..41885f48a 100644 --- a/include/sound/asound.h +++ b/include/sound/asound.h @@ -137,7 +137,7 @@ enum { * * *****************************************************************************/ -#define SNDRV_PCM_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 7) +#define SNDRV_PCM_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 8) typedef unsigned long snd_pcm_uframes_t; typedef signed long snd_pcm_sframes_t; diff --git a/include/sound/core.h b/include/sound/core.h index 5135147f2..bab3ff457 100644 --- a/include/sound/core.h +++ b/include/sound/core.h @@ -188,8 +188,6 @@ struct snd_minor { int device; /* device number */ const struct file_operations *f_ops; /* file operations */ void *private_data; /* private data for f_ops->open */ - char name[0]; /* device name (keep at the end of - structure) */ }; /* sound.c */ @@ -233,9 +231,8 @@ int copy_from_user_toio(volatile void __iomem *dst, const void __user *src, size /* init.c */ -extern unsigned int snd_cards_lock; extern struct snd_card *snd_cards[SNDRV_CARDS]; -extern rwlock_t snd_card_rwlock; +int snd_card_locked(int card); #if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE) #define SND_MIXER_OSS_NOTIFY_REGISTER 0 #define SND_MIXER_OSS_NOTIFY_DISCONNECT 1 diff --git a/include/sound/cs46xx.h b/include/sound/cs46xx.h index 80b2979c0..685928e6f 100644 --- a/include/sound/cs46xx.h +++ b/include/sound/cs46xx.h @@ -1704,6 +1704,7 @@ struct snd_cs46xx { int acpi_port; struct snd_kcontrol *eapd_switch; /* for amplifier hack */ int accept_valid; /* accept mmap valid (for OSS) */ + int in_suspend; struct gameport *gameport; diff --git a/include/sound/driver.h b/include/sound/driver.h index 89c6a73f3..3c522e59a 100644 --- a/include/sound/driver.h +++ b/include/sound/driver.h @@ -26,7 +26,6 @@ #include "config.h" #endif -#include /* number of supported soundcards */ #ifdef CONFIG_SND_DYNAMIC_MINORS diff --git a/include/sound/emu10k1.h b/include/sound/emu10k1.h index 186e00ad9..884bbf54c 100644 --- a/include/sound/emu10k1.h +++ b/include/sound/emu10k1.h @@ -245,6 +245,7 @@ #define A_IOCFG_GPOUT0 0x0044 /* analog/digital */ #define A_IOCFG_DISABLE_ANALOG 0x0040 /* = 'enable' for Audigy2 (chiprev=4) */ #define A_IOCFG_ENABLE_DIGITAL 0x0004 +#define A_IOCFG_ENABLE_DIGITAL_AUDIGY4 0x0080 #define A_IOCFG_UNKNOWN_20 0x0020 #define A_IOCFG_DISABLE_AC97_FRONT 0x0080 /* turn off ac97 front -> front (10k2.1) */ #define A_IOCFG_GPOUT1 0x0002 /* IR? drive's internal bypass (?) */ @@ -1065,6 +1066,7 @@ struct snd_emu_chip_details { unsigned char emu1212m; /* EMU 1212m card */ unsigned char spi_dac; /* SPI interface for DAC */ unsigned char i2c_adc; /* I2C interface for ADC */ + unsigned char adc_1361t; /* Use Philips 1361T ADC */ const char *driver; const char *name; const char *id; /* for backward compatibility - can be NULL if not needed */ diff --git a/include/sound/hdsp.h b/include/sound/hdsp.h index 25e1951a9..dec6b1dc3 100644 --- a/include/sound/hdsp.h +++ b/include/sound/hdsp.h @@ -30,13 +30,13 @@ enum HDSP_IO_Type { }; struct hdsp_peak_rms { - u32 input_peaks[26]; - u32 playback_peaks[26]; - u32 output_peaks[28]; - u64 input_rms[26]; - u64 playback_rms[26]; + __u32 input_peaks[26]; + __u32 playback_peaks[26]; + __u32 output_peaks[28]; + __u64 input_rms[26]; + __u64 playback_rms[26]; /* These are only used for H96xx cards */ - u64 output_rms[26]; + __u64 output_rms[26]; }; #define SNDRV_HDSP_IOCTL_GET_PEAK_RMS _IOR('H', 0x40, struct hdsp_peak_rms) diff --git a/include/sound/info.h b/include/sound/info.h index f23d8381c..74f699676 100644 --- a/include/sound/info.h +++ b/include/sound/info.h @@ -27,9 +27,9 @@ /* buffer for information */ struct snd_info_buffer { char *buffer; /* pointer to begin of buffer */ - char *curr; /* current position in buffer */ - unsigned long size; /* current size */ - unsigned long len; /* total length of buffer */ + unsigned int curr; /* current position in buffer */ + unsigned int size; /* current size */ + unsigned int len; /* total length of buffer */ int stop; /* stop flag */ int error; /* error code */ }; @@ -40,8 +40,6 @@ struct snd_info_buffer { struct snd_info_entry; struct snd_info_entry_text { - unsigned long read_size; - unsigned long write_size; void (*read) (struct snd_info_entry *entry, struct snd_info_buffer *buffer); void (*write) (struct snd_info_entry *entry, struct snd_info_buffer *buffer); }; @@ -132,11 +130,9 @@ int snd_card_proc_new(struct snd_card *card, const char *name, struct snd_info_e static inline void snd_info_set_text_ops(struct snd_info_entry *entry, void *private_data, - long read_size, void (*read)(struct snd_info_entry *, struct snd_info_buffer *)) { entry->private_data = private_data; - entry->c.text.read_size = read_size; entry->c.text.read = read; } @@ -167,7 +163,6 @@ static inline int snd_card_proc_new(struct snd_card *card, const char *name, struct snd_info_entry **entryp) { return -EINVAL; } static inline void snd_info_set_text_ops(struct snd_info_entry *entry __attribute__((unused)), void *private_data, - long read_size, void (*read)(struct snd_info_entry *, struct snd_info_buffer *)) {} static inline int snd_info_check_reserved_words(const char *str) { return 1; } diff --git a/include/sound/initval.h b/include/sound/initval.h index d45170b9e..2ae76efc6 100644 --- a/include/sound/initval.h +++ b/include/sound/initval.h @@ -62,7 +62,7 @@ static int snd_legacy_find_free_irq(int *irq_table) { while (*irq_table != -1) { if (!request_irq(*irq_table, snd_legacy_empty_irq_handler, - SA_INTERRUPT | SA_PROBEIRQ, "ALSA Test IRQ", + IRQF_DISABLED | IRQF_PROBE_SHARED, "ALSA Test IRQ", (void *) irq_table)) { free_irq(*irq_table, (void *) irq_table); return *irq_table; diff --git a/include/sound/mpu401.h b/include/sound/mpu401.h index 8e97ace78..ac504321e 100644 --- a/include/sound/mpu401.h +++ b/include/sound/mpu401.h @@ -45,6 +45,12 @@ #define MPU401_HW_PC98II 18 /* Roland PC98II */ #define MPU401_HW_AUREAL 19 /* Aureal Vortex */ +#define MPU401_INFO_INPUT (1 << 0) /* input stream */ +#define MPU401_INFO_OUTPUT (1 << 1) /* output stream */ +#define MPU401_INFO_INTEGRATED (1 << 2) /* integrated h/w port */ +#define MPU401_INFO_MMIO (1 << 3) /* MMIO access */ +#define MPU401_INFO_TX_IRQ (1 << 4) /* independent TX irq */ + #define MPU401_MODE_BIT_INPUT 0 #define MPU401_MODE_BIT_OUTPUT 1 #define MPU401_MODE_BIT_INPUT_TRIGGER 2 @@ -62,6 +68,7 @@ struct snd_mpu401 { struct snd_rawmidi *rmidi; unsigned short hardware; /* MPU401_HW_XXXX */ + unsigned int info_flags; /* MPU401_INFO_XXX */ unsigned long port; /* base port of MPU-401 chip */ unsigned long cport; /* port + 1 (usually) */ struct resource *res; /* port resource */ @@ -99,13 +106,16 @@ struct snd_mpu401 { */ -irqreturn_t snd_mpu401_uart_interrupt(int irq, void *dev_id, struct pt_regs *regs); +irqreturn_t snd_mpu401_uart_interrupt(int irq, void *dev_id, + struct pt_regs *regs); +irqreturn_t snd_mpu401_uart_interrupt_tx(int irq, void *dev_id, + struct pt_regs *regs); int snd_mpu401_uart_new(struct snd_card *card, int device, unsigned short hardware, unsigned long port, - int integrated, + unsigned int info_flags, int irq, int irq_flags, struct snd_rawmidi ** rrawmidi); diff --git a/include/sound/pcm.h b/include/sound/pcm.h index 373425895..f84d84993 100644 --- a/include/sound/pcm.h +++ b/include/sound/pcm.h @@ -300,7 +300,6 @@ struct snd_pcm_runtime { /* -- mmap -- */ volatile struct snd_pcm_mmap_status *status; volatile struct snd_pcm_mmap_control *control; - atomic_t mmap_count; /* -- locking / scheduling -- */ wait_queue_head_t sleep; @@ -368,7 +367,9 @@ struct snd_pcm_substream { struct snd_pcm_group *group; /* pointer to current group */ /* -- assigned files -- */ void *file; - struct file *ffile; + int ref_count; + atomic_t mmap_count; + unsigned int f_flags; void (*pcm_release)(struct snd_pcm_substream *); #if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE) /* -- OSS things -- */ @@ -387,7 +388,7 @@ struct snd_pcm_substream { unsigned int hw_opened: 1; }; -#define SUBSTREAM_BUSY(substream) ((substream)->file != NULL) +#define SUBSTREAM_BUSY(substream) ((substream)->ref_count > 0) struct snd_pcm_str { @@ -825,14 +826,6 @@ int snd_interval_ratnum(struct snd_interval *i, void _snd_pcm_hw_params_any(struct snd_pcm_hw_params *params); void _snd_pcm_hw_param_setempty(struct snd_pcm_hw_params *params, snd_pcm_hw_param_t var); -int snd_pcm_hw_param_near(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - snd_pcm_hw_param_t var, - unsigned int val, int *dir); -int snd_pcm_hw_param_set(struct snd_pcm_substream *pcm, - struct snd_pcm_hw_params *params, - snd_pcm_hw_param_t var, - unsigned int val, int dir); int snd_pcm_hw_params_choose(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params); int snd_pcm_hw_refine(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params); @@ -979,13 +972,13 @@ struct page *snd_pcm_sgbuf_ops_page(struct snd_pcm_substream *substream, unsigne static inline void snd_pcm_mmap_data_open(struct vm_area_struct *area) { struct snd_pcm_substream *substream = (struct snd_pcm_substream *)area->vm_private_data; - atomic_inc(&substream->runtime->mmap_count); + atomic_inc(&substream->mmap_count); } static inline void snd_pcm_mmap_data_close(struct vm_area_struct *area) { struct snd_pcm_substream *substream = (struct snd_pcm_substream *)area->vm_private_data; - atomic_dec(&substream->runtime->mmap_count); + atomic_dec(&substream->mmap_count); } /* mmap for io-memory area */ diff --git a/include/sound/pcm_params.h b/include/sound/pcm_params.h index fb18aef77..85cf1cf4f 100644 --- a/include/sound/pcm_params.h +++ b/include/sound/pcm_params.h @@ -22,29 +22,21 @@ * */ -extern int snd_pcm_hw_param_mask(struct snd_pcm_substream *pcm, struct snd_pcm_hw_params *params, - snd_pcm_hw_param_t var, const struct snd_mask *val); -extern unsigned int snd_pcm_hw_param_value_min(const struct snd_pcm_hw_params *params, - snd_pcm_hw_param_t var, int *dir); -extern unsigned int snd_pcm_hw_param_value_max(const struct snd_pcm_hw_params *params, - snd_pcm_hw_param_t var, int *dir); -extern int _snd_pcm_hw_param_min(struct snd_pcm_hw_params *params, - snd_pcm_hw_param_t var, unsigned int val, int dir); -extern int _snd_pcm_hw_param_setinteger(struct snd_pcm_hw_params *params, - snd_pcm_hw_param_t var); -extern int _snd_pcm_hw_param_set(struct snd_pcm_hw_params *params, - snd_pcm_hw_param_t var, unsigned int val, int dir); - -/* To share the same code we have alsa-lib */ -#define INLINE static inline -#define assert(a) (void)(a) +int snd_pcm_hw_param_first(struct snd_pcm_substream *pcm, + struct snd_pcm_hw_params *params, + snd_pcm_hw_param_t var, int *dir); +int snd_pcm_hw_param_last(struct snd_pcm_substream *pcm, + struct snd_pcm_hw_params *params, + snd_pcm_hw_param_t var, int *dir); +int snd_pcm_hw_param_value(const struct snd_pcm_hw_params *params, + snd_pcm_hw_param_t var, int *dir); #define SNDRV_MASK_BITS 64 /* we use so far 64bits only */ #define SNDRV_MASK_SIZE (SNDRV_MASK_BITS / 32) #define MASK_OFS(i) ((i) >> 5) #define MASK_BIT(i) (1U << ((i) & 31)) -INLINE unsigned int ld2(u_int32_t v) +static inline unsigned int ld2(u_int32_t v) { unsigned r = 0; @@ -69,22 +61,22 @@ INLINE unsigned int ld2(u_int32_t v) return r; } -INLINE size_t snd_mask_sizeof(void) +static inline size_t snd_mask_sizeof(void) { return sizeof(struct snd_mask); } -INLINE void snd_mask_none(struct snd_mask *mask) +static inline void snd_mask_none(struct snd_mask *mask) { memset(mask, 0, sizeof(*mask)); } -INLINE void snd_mask_any(struct snd_mask *mask) +static inline void snd_mask_any(struct snd_mask *mask) { memset(mask, 0xff, SNDRV_MASK_SIZE * sizeof(u_int32_t)); } -INLINE int snd_mask_empty(const struct snd_mask *mask) +static inline int snd_mask_empty(const struct snd_mask *mask) { int i; for (i = 0; i < SNDRV_MASK_SIZE; i++) @@ -93,10 +85,9 @@ INLINE int snd_mask_empty(const struct snd_mask *mask) return 1; } -INLINE unsigned int snd_mask_min(const struct snd_mask *mask) +static inline unsigned int snd_mask_min(const struct snd_mask *mask) { int i; - assert(!snd_mask_empty(mask)); for (i = 0; i < SNDRV_MASK_SIZE; i++) { if (mask->bits[i]) return ffs(mask->bits[i]) - 1 + (i << 5); @@ -104,10 +95,9 @@ INLINE unsigned int snd_mask_min(const struct snd_mask *mask) return 0; } -INLINE unsigned int snd_mask_max(const struct snd_mask *mask) +static inline unsigned int snd_mask_max(const struct snd_mask *mask) { int i; - assert(!snd_mask_empty(mask)); for (i = SNDRV_MASK_SIZE - 1; i >= 0; i--) { if (mask->bits[i]) return ld2(mask->bits[i]) + (i << 5); @@ -115,70 +105,68 @@ INLINE unsigned int snd_mask_max(const struct snd_mask *mask) return 0; } -INLINE void snd_mask_set(struct snd_mask *mask, unsigned int val) +static inline void snd_mask_set(struct snd_mask *mask, unsigned int val) { - assert(val <= SNDRV_MASK_BITS); mask->bits[MASK_OFS(val)] |= MASK_BIT(val); } -INLINE void snd_mask_reset(struct snd_mask *mask, unsigned int val) +static inline void snd_mask_reset(struct snd_mask *mask, unsigned int val) { - assert(val <= SNDRV_MASK_BITS); mask->bits[MASK_OFS(val)] &= ~MASK_BIT(val); } -INLINE void snd_mask_set_range(struct snd_mask *mask, unsigned int from, unsigned int to) +static inline void snd_mask_set_range(struct snd_mask *mask, + unsigned int from, unsigned int to) { unsigned int i; - assert(to <= SNDRV_MASK_BITS && from <= to); for (i = from; i <= to; i++) mask->bits[MASK_OFS(i)] |= MASK_BIT(i); } -INLINE void snd_mask_reset_range(struct snd_mask *mask, unsigned int from, unsigned int to) +static inline void snd_mask_reset_range(struct snd_mask *mask, + unsigned int from, unsigned int to) { unsigned int i; - assert(to <= SNDRV_MASK_BITS && from <= to); for (i = from; i <= to; i++) mask->bits[MASK_OFS(i)] &= ~MASK_BIT(i); } -INLINE void snd_mask_leave(struct snd_mask *mask, unsigned int val) +static inline void snd_mask_leave(struct snd_mask *mask, unsigned int val) { unsigned int v; - assert(val <= SNDRV_MASK_BITS); v = mask->bits[MASK_OFS(val)] & MASK_BIT(val); snd_mask_none(mask); mask->bits[MASK_OFS(val)] = v; } -INLINE void snd_mask_intersect(struct snd_mask *mask, const struct snd_mask *v) +static inline void snd_mask_intersect(struct snd_mask *mask, + const struct snd_mask *v) { int i; for (i = 0; i < SNDRV_MASK_SIZE; i++) mask->bits[i] &= v->bits[i]; } -INLINE int snd_mask_eq(const struct snd_mask *mask, const struct snd_mask *v) +static inline int snd_mask_eq(const struct snd_mask *mask, + const struct snd_mask *v) { return ! memcmp(mask, v, SNDRV_MASK_SIZE * sizeof(u_int32_t)); } -INLINE void snd_mask_copy(struct snd_mask *mask, const struct snd_mask *v) +static inline void snd_mask_copy(struct snd_mask *mask, + const struct snd_mask *v) { *mask = *v; } -INLINE int snd_mask_test(const struct snd_mask *mask, unsigned int val) +static inline int snd_mask_test(const struct snd_mask *mask, unsigned int val) { - assert(val <= SNDRV_MASK_BITS); return mask->bits[MASK_OFS(val)] & MASK_BIT(val); } -INLINE int snd_mask_single(const struct snd_mask *mask) +static inline int snd_mask_single(const struct snd_mask *mask) { int i, c = 0; - assert(!snd_mask_empty(mask)); for (i = 0; i < SNDRV_MASK_SIZE; i++) { if (! mask->bits[i]) continue; @@ -191,10 +179,10 @@ INLINE int snd_mask_single(const struct snd_mask *mask) return 1; } -INLINE int snd_mask_refine(struct snd_mask *mask, const struct snd_mask *v) +static inline int snd_mask_refine(struct snd_mask *mask, + const struct snd_mask *v) { struct snd_mask old; - assert(!snd_mask_empty(mask)); snd_mask_copy(&old, mask); snd_mask_intersect(mask, v); if (snd_mask_empty(mask)) @@ -202,27 +190,24 @@ INLINE int snd_mask_refine(struct snd_mask *mask, const struct snd_mask *v) return !snd_mask_eq(mask, &old); } -INLINE int snd_mask_refine_first(struct snd_mask *mask) +static inline int snd_mask_refine_first(struct snd_mask *mask) { - assert(!snd_mask_empty(mask)); if (snd_mask_single(mask)) return 0; snd_mask_leave(mask, snd_mask_min(mask)); return 1; } -INLINE int snd_mask_refine_last(struct snd_mask *mask) +static inline int snd_mask_refine_last(struct snd_mask *mask) { - assert(!snd_mask_empty(mask)); if (snd_mask_single(mask)) return 0; snd_mask_leave(mask, snd_mask_max(mask)); return 1; } -INLINE int snd_mask_refine_min(struct snd_mask *mask, unsigned int val) +static inline int snd_mask_refine_min(struct snd_mask *mask, unsigned int val) { - assert(!snd_mask_empty(mask)); if (snd_mask_min(mask) >= val) return 0; snd_mask_reset_range(mask, 0, val - 1); @@ -231,9 +216,8 @@ INLINE int snd_mask_refine_min(struct snd_mask *mask, unsigned int val) return 1; } -INLINE int snd_mask_refine_max(struct snd_mask *mask, unsigned int val) +static inline int snd_mask_refine_max(struct snd_mask *mask, unsigned int val) { - assert(!snd_mask_empty(mask)); if (snd_mask_max(mask) <= val) return 0; snd_mask_reset_range(mask, val + 1, SNDRV_MASK_BITS); @@ -242,10 +226,9 @@ INLINE int snd_mask_refine_max(struct snd_mask *mask, unsigned int val) return 1; } -INLINE int snd_mask_refine_set(struct snd_mask *mask, unsigned int val) +static inline int snd_mask_refine_set(struct snd_mask *mask, unsigned int val) { int changed; - assert(!snd_mask_empty(mask)); changed = !snd_mask_single(mask); snd_mask_leave(mask, val); if (snd_mask_empty(mask)) @@ -253,13 +236,12 @@ INLINE int snd_mask_refine_set(struct snd_mask *mask, unsigned int val) return changed; } -INLINE int snd_mask_value(const struct snd_mask *mask) +static inline int snd_mask_value(const struct snd_mask *mask) { - assert(!snd_mask_empty(mask)); return snd_mask_min(mask); } -INLINE void snd_interval_any(struct snd_interval *i) +static inline void snd_interval_any(struct snd_interval *i) { i->min = 0; i->openmin = 0; @@ -269,63 +251,59 @@ INLINE void snd_interval_any(struct snd_interval *i) i->empty = 0; } -INLINE void snd_interval_none(struct snd_interval *i) +static inline void snd_interval_none(struct snd_interval *i) { i->empty = 1; } -INLINE int snd_interval_checkempty(const struct snd_interval *i) +static inline int snd_interval_checkempty(const struct snd_interval *i) { return (i->min > i->max || (i->min == i->max && (i->openmin || i->openmax))); } -INLINE int snd_interval_empty(const struct snd_interval *i) +static inline int snd_interval_empty(const struct snd_interval *i) { return i->empty; } -INLINE int snd_interval_single(const struct snd_interval *i) +static inline int snd_interval_single(const struct snd_interval *i) { - assert(!snd_interval_empty(i)); return (i->min == i->max || (i->min + 1 == i->max && i->openmax)); } -INLINE int snd_interval_value(const struct snd_interval *i) +static inline int snd_interval_value(const struct snd_interval *i) { - assert(snd_interval_single(i)); return i->min; } -INLINE int snd_interval_min(const struct snd_interval *i) +static inline int snd_interval_min(const struct snd_interval *i) { - assert(!snd_interval_empty(i)); return i->min; } -INLINE int snd_interval_max(const struct snd_interval *i) +static inline int snd_interval_max(const struct snd_interval *i) { unsigned int v; - assert(!snd_interval_empty(i)); v = i->max; if (i->openmax) v--; return v; } -INLINE int snd_interval_test(const struct snd_interval *i, unsigned int val) +static inline int snd_interval_test(const struct snd_interval *i, unsigned int val) { return !((i->min > val || (i->min == val && i->openmin) || i->max < val || (i->max == val && i->openmax))); } -INLINE void snd_interval_copy(struct snd_interval *d, const struct snd_interval *s) +static inline void snd_interval_copy(struct snd_interval *d, const struct snd_interval *s) { *d = *s; } -INLINE int snd_interval_setinteger(struct snd_interval *i) +static inline int snd_interval_setinteger(struct snd_interval *i) { if (i->integer) return 0; @@ -335,7 +313,7 @@ INLINE int snd_interval_setinteger(struct snd_interval *i) return 1; } -INLINE int snd_interval_eq(const struct snd_interval *i1, const struct snd_interval *i2) +static inline int snd_interval_eq(const struct snd_interval *i1, const struct snd_interval *i2) { if (i1->empty) return i2->empty; @@ -359,8 +337,5 @@ static inline unsigned int sub(unsigned int a, unsigned int b) return 0; } -#undef INLINE -#undef assert - #endif /* __SOUND_PCM_PARAMS_H */ diff --git a/include/sound/rawmidi.h b/include/sound/rawmidi.h index 584e73dd4..7dbcd10fa 100644 --- a/include/sound/rawmidi.h +++ b/include/sound/rawmidi.h @@ -46,6 +46,7 @@ struct snd_rawmidi; struct snd_rawmidi_substream; +struct snd_seq_port_info; struct snd_rawmidi_ops { int (*open) (struct snd_rawmidi_substream * substream); @@ -57,6 +58,8 @@ struct snd_rawmidi_ops { struct snd_rawmidi_global_ops { int (*dev_register) (struct snd_rawmidi * rmidi); int (*dev_unregister) (struct snd_rawmidi * rmidi); + void (*get_port_info)(struct snd_rawmidi *rmidi, int number, + struct snd_seq_port_info *info); }; struct snd_rawmidi_runtime { diff --git a/include/sound/tea575x-tuner.h b/include/sound/tea575x-tuner.h index a4f554520..b5067d3c2 100644 --- a/include/sound/tea575x-tuner.h +++ b/include/sound/tea575x-tuner.h @@ -20,9 +20,10 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - */ + */ #include +#include struct snd_tea575x; diff --git a/include/sound/version.h b/include/sound/version.h index 4f0e65808..2ee849d0e 100644 --- a/include/sound/version.h +++ b/include/sound/version.h @@ -1,3 +1,3 @@ /* include/version.h. Generated by configure. */ -#define CONFIG_SND_VERSION "1.0.11rc4" -#define CONFIG_SND_DATE " (Wed Mar 22 10:27:24 2006 UTC)" +#define CONFIG_SND_VERSION "1.0.12rc1" +#define CONFIG_SND_DATE " (Thu Jun 22 13:55:50 2006 UTC)" diff --git a/include/video/edid.h b/include/video/edid.h index b913f1961..f6a42d6c2 100644 --- a/include/video/edid.h +++ b/include/video/edid.h @@ -3,7 +3,6 @@ #ifdef __KERNEL__ -#include #ifdef CONFIG_X86 struct edid_info { diff --git a/include/video/vga.h b/include/video/vga.h index 700d6c8eb..b49a5120c 100644 --- a/include/video/vga.h +++ b/include/video/vga.h @@ -17,7 +17,6 @@ #ifndef __linux_video_vga_h__ #define __linux_video_vga_h__ -#include #include #include #ifndef CONFIG_AMIGA diff --git a/include/xen/interface/sched_ctl.h b/include/xen/interface/sched_ctl.h deleted file mode 100644 index 95e50e3c5..000000000 --- a/include/xen/interface/sched_ctl.h +++ /dev/null @@ -1,69 +0,0 @@ -/****************************************************************************** - * Generic scheduler control interface. - * - * Mark Williamson, (C) 2004 Intel Research Cambridge - */ - -#ifndef __XEN_PUBLIC_SCHED_CTL_H__ -#define __XEN_PUBLIC_SCHED_CTL_H__ - -/* Scheduler types. */ -#define SCHED_BVT 0 -#define SCHED_SEDF 4 -#define SCHED_CREDIT 5 - -/* Set or get info? */ -#define SCHED_INFO_PUT 0 -#define SCHED_INFO_GET 1 - -/* - * Generic scheduler control command - used to adjust system-wide scheduler - * parameters - */ -struct sched_ctl_cmd { - uint32_t sched_id; - uint32_t direction; - union { - struct bvt_ctl { - uint32_t ctx_allow; - } bvt; - } u; -}; - -struct sched_adjdom_cmd { - uint32_t sched_id; - uint32_t direction; - domid_t domain; - union { - struct bvt_adjdom { - uint32_t mcu_adv; /* mcu advance: inverse of weight */ - uint32_t warpback; /* warp? */ - int32_t warpvalue; /* warp value */ - int64_t warpl; /* warp limit */ - int64_t warpu; /* unwarp time requirement */ - } bvt; - struct sedf_adjdom { - uint64_t period; - uint64_t slice; - uint64_t latency; - uint32_t extratime; - uint32_t weight; - } sedf; - struct sched_credit_adjdom { - uint16_t weight; - uint16_t cap; - } credit; - } u; -}; - -#endif /* __XEN_PUBLIC_SCHED_CTL_H__ */ - -/* - * Local variables: - * mode: C - * c-set-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff --git a/init/Kconfig b/init/Kconfig index 7af407949..0ca356f9e 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -1,3 +1,12 @@ +config DEFCONFIG_LIST + string + depends on !UML + option defconfig_list + default "/lib/modules/$UNAME_RELEASE/.config" + default "/etc/kernel-config" + default "/boot/config-$UNAME_RELEASE" + default "arch/$ARCH/defconfig" + menu "Code maturity level options" config EXPERIMENTAL @@ -46,8 +55,8 @@ config LOCK_KERNEL config INIT_ENV_ARG_LIMIT int - default 32 if !USERMODE - default 128 if USERMODE + default 32 if !UML + default 128 if UML help Maximum of each of the number of arguments and environment variables passed to init from the kernel command line. @@ -150,21 +159,29 @@ config BSD_PROCESS_ACCT_V3 for processing it. A preliminary version of these tools is available at . -config SYSCTL - bool "Sysctl support" - ---help--- - The sysctl interface provides a means of dynamically changing - certain kernel parameters and variables on the fly without requiring - a recompile of the kernel or reboot of the system. The primary - interface consists of a system call, but if you say Y to "/proc - file system support", a tree of modifiable sysctl entries will be - generated beneath the /proc/sys directory. They are explained in the - files in . Note that enabling this - option will enlarge the kernel by at least 8 KB. +config TASKSTATS + bool "Export task/process statistics through netlink (EXPERIMENTAL)" + depends on NET + default n + help + Export selected statistics for tasks/processes through the + generic netlink interface. Unlike BSD process accounting, the + statistics are available during the lifetime of tasks/processes as + responses to commands. Like BSD accounting, they are sent to user + space on task exit. - As it is generally a good thing, you should say Y here unless - building a kernel for install/rescue disks or your system is very - limited in memory. + Say N if unsure. + +config TASK_DELAY_ACCT + bool "Enable per-task delay accounting (EXPERIMENTAL)" + depends on TASKSTATS + help + Collect information on time spent by a task waiting for system + resources like cpu, synchronous block I/O completion and swapping + in pages. Such statistics can help in setting a task's priorities + relative to other tasks for cpu, io, rss limits etc. + + Say N if unsure. config AUDIT bool "Auditing support" @@ -182,7 +199,8 @@ config AUDITSYSCALL help Enable low-overhead system-call auditing infrastructure that can be used independently or with another kernel subsystem, - such as SELinux. + such as SELinux. To use audit's filesystem watch feature, please + ensure that INOTIFY is configured. config IKCONFIG bool "Kernel .config support" @@ -244,23 +262,6 @@ config RELAY source "usr/Kconfig" -config UID16 - bool "Enable 16-bit UID system calls" if EMBEDDED - depends on ARM || CRIS || FRV || H8300 || X86_32 || M68K || (S390 && !64BIT) || SUPERH || SPARC32 || (SPARC64 && SPARC32_COMPAT) || UML || (X86_64 && IA32_EMULATION) - default y - help - This enables the legacy 16-bit UID syscall wrappers. - -config VM86 - depends X86 - default y - bool "Enable VM86 support" if EMBEDDED - help - This option is required by programs like DOSEMU to run 16-bit legacy - code on X86 processors. It also may be needed by software like - XFree86 to initialize some video cards via BIOS. Disabling this - option saves about 6k. - config CC_OPTIMIZE_FOR_SIZE bool "Optimize for size (Look out for broken compilers!)" default y @@ -282,6 +283,30 @@ menuconfig EMBEDDED environments which can tolerate a "non-standard" kernel. Only use this if you really know what you are doing. +config UID16 + bool "Enable 16-bit UID system calls" if EMBEDDED + depends on ARM || CRIS || FRV || H8300 || X86_32 || M68K || (S390 && !64BIT) || SUPERH || SPARC32 || (SPARC64 && SPARC32_COMPAT) || UML || (X86_64 && IA32_EMULATION) + default y + help + This enables the legacy 16-bit UID syscall wrappers. + +config SYSCTL + bool "Sysctl support" if EMBEDDED + default y + ---help--- + The sysctl interface provides a means of dynamically changing + certain kernel parameters and variables on the fly without requiring + a recompile of the kernel or reboot of the system. The primary + interface consists of a system call, but if you say Y to "/proc + file system support", a tree of modifiable sysctl entries will be + generated beneath the /proc/sys directory. They are explained in the + files in . Note that enabling this + option will enlarge the kernel by at least 8 KB. + + As it is generally a good thing, you should say Y here unless + building a kernel for install/rescue disks or your system is very + limited in memory. + config KALLSYMS bool "Load all symbols for debugging/kksymoops" if EMBEDDED default y @@ -359,6 +384,7 @@ config BASE_FULL config FUTEX bool "Enable futex support" if EMBEDDED default y + select RT_MUTEXES help Disabling this option will cause the kernel to be built without support for "fast userspace mutexes". The resulting kernel may not @@ -391,8 +417,21 @@ config SLAB SLOB is more space efficient but does not scale well and is more susceptible to fragmentation. +config VM_EVENT_COUNTERS + default y + bool "Enable VM event counters for /proc/vmstat" if EMBEDDED + help + VM event counters are only needed to for event counts to be + shown. They have no function for the kernel itself. This + option allows the disabling of the VM event counters. + /proc/vmstat will only show page counts. + endmenu # General setup +config RT_MUTEXES + boolean + select PLIST + config TINY_SHMEM default !SHMEM bool @@ -406,9 +445,6 @@ config SLOB default !SLAB bool -config OBSOLETE_INTERMODULE - tristate - menu "Loadable module support" config MODULES @@ -509,6 +545,35 @@ config STOP_MACHINE Need stop_machine() primitive. endmenu +menu "Process debugging support" + +config UTRACE + bool "Infrastructure for tracing and debugging user processes" + default y + help + Enable the utrace process tracing interface. + This is an internal kernel interface to track events in user + threads, extract and change user thread state. This interface + is exported to kernel modules, and is also used to implement ptrace. + If you disable this, no facilities for debugging user processes + will be available, nor the facilities used by UML and other + applications. Unless you are making a specially stripped-down + kernel and are very sure you don't need these facilitiies, + say Y. + +config PTRACE + bool "Legacy ptrace system call interface" + default y + depends on UTRACE + help + Enable the ptrace system call. + This is traditionally used by debuggers like GDB, + and is used by UML and some other applications. + Unless you are very sure you won't run anything that needs it, + say Y. + +endmenu + menu "Block layer" source "block/Kconfig" endmenu diff --git a/init/Makefile b/init/Makefile index a2300078f..633a268d2 100644 --- a/init/Makefile +++ b/init/Makefile @@ -6,7 +6,6 @@ obj-y := main.o version.o mounts.o initramfs.o obj-$(CONFIG_GENERIC_CALIBRATE_DELAY) += calibrate.o mounts-y := do_mounts.o -mounts-$(CONFIG_DEVFS_FS) += do_mounts_devfs.o mounts-$(CONFIG_BLK_DEV_RAM) += do_mounts_rd.o mounts-$(CONFIG_BLK_DEV_INITRD) += do_mounts_initrd.o mounts-$(CONFIG_BLK_DEV_MD) += do_mounts_md.o diff --git a/init/do_mounts.c b/init/do_mounts.c index f4b7b9d27..94aeec7aa 100644 --- a/init/do_mounts.c +++ b/init/do_mounts.c @@ -325,7 +325,7 @@ static int __init mount_nfs_root(void) { void *data = nfs_root_data(); - create_dev("/dev/root", ROOT_DEV, NULL); + create_dev("/dev/root", ROOT_DEV); if (data && do_mount_root("/dev/root", "nfs", root_mountflags, data) == 0) return 1; @@ -386,7 +386,7 @@ void __init mount_root(void) change_floppy("root floppy"); } #endif - create_dev("/dev/root", ROOT_DEV, root_device_name); + create_dev("/dev/root", ROOT_DEV); mount_block_root("/dev/root", root_mountflags); } @@ -397,8 +397,6 @@ void __init prepare_namespace(void) { int is_floppy; - mount_devfs(); - if (root_delay) { printk(KERN_INFO "Waiting %dsec before mounting root device...\n", root_delay); @@ -409,6 +407,10 @@ void __init prepare_namespace(void) if (saved_root_name[0]) { root_device_name = saved_root_name; + if (!strncmp(root_device_name, "mtd", 3)) { + mount_block_root(root_device_name, root_mountflags); + goto out; + } ROOT_DEV = name_to_dev_t(root_device_name); if (strncmp(root_device_name, "/dev/", 5) == 0) root_device_name += 5; @@ -424,10 +426,8 @@ void __init prepare_namespace(void) mount_root(); out: - umount_devfs("/dev"); sys_mount(".", "/", NULL, MS_MOVE, NULL); sys_chroot("."); security_sb_post_mountroot(); - mount_devfs_fs (); } diff --git a/init/do_mounts.h b/init/do_mounts.h index e0a7ac964..735705d13 100644 --- a/init/do_mounts.h +++ b/init/do_mounts.h @@ -1,6 +1,4 @@ -#include #include -#include #include #include #include @@ -15,25 +13,12 @@ void mount_root(void); extern int root_mountflags; extern char *root_device_name; -#ifdef CONFIG_DEVFS_FS - -void mount_devfs(void); -void umount_devfs(char *path); -int create_dev(char *name, dev_t dev, char *devfs_name); - -#else - -static inline void mount_devfs(void) {} -static inline void umount_devfs(const char *path) {} - -static inline int create_dev(char *name, dev_t dev, char *devfs_name) +static inline int create_dev(char *name, dev_t dev) { sys_unlink(name); return sys_mknod(name, S_IFBLK|0600, new_encode_dev(dev)); } -#endif - #if BITS_PER_LONG == 32 static inline u32 bstat(char *name) { diff --git a/init/do_mounts_devfs.c b/init/do_mounts_devfs.c deleted file mode 100644 index cc5264746..000000000 --- a/init/do_mounts_devfs.c +++ /dev/null @@ -1,137 +0,0 @@ - -#include -#include -#include - -#include "do_mounts.h" - -void __init mount_devfs(void) -{ - sys_mount("devfs", "/dev", "devfs", 0, NULL); -} - -void __init umount_devfs(char *path) -{ - sys_umount(path, 0); -} - -/* - * If the dir will fit in *buf, return its length. If it won't fit, return - * zero. Return -ve on error. - */ -static int __init do_read_dir(int fd, void *buf, int len) -{ - long bytes, n; - char *p = buf; - sys_lseek(fd, 0, 0); - - for (bytes = 0; bytes < len; bytes += n) { - n = sys_getdents64(fd, (struct linux_dirent64 *)(p + bytes), - len - bytes); - if (n < 0) - return n; - if (n == 0) - return bytes; - } - return 0; -} - -/* - * Try to read all of a directory. Returns the contents at *p, which - * is kmalloced memory. Returns the number of bytes read at *len. Returns - * NULL on error. - */ -static void * __init read_dir(char *path, int *len) -{ - int size; - int fd = sys_open(path, 0, 0); - - *len = 0; - if (fd < 0) - return NULL; - - for (size = 1 << 9; size <= (PAGE_SIZE << MAX_ORDER); size <<= 1) { - void *p = kmalloc(size, GFP_KERNEL); - int n; - if (!p) - break; - n = do_read_dir(fd, p, size); - if (n > 0) { - sys_close(fd); - *len = n; - return p; - } - kfree(p); - if (n == -EINVAL) - continue; /* Try a larger buffer */ - if (n < 0) - break; - } - sys_close(fd); - return NULL; -} - -/* - * recursively scan , looking for a device node of type - */ -static int __init find_in_devfs(char *path, unsigned dev) -{ - char *end = path + strlen(path); - int rest = path + 64 - end; - int size; - char *p = read_dir(path, &size); - char *s; - - if (!p) - return -1; - for (s = p; s < p + size; s += ((struct linux_dirent64 *)s)->d_reclen) { - struct linux_dirent64 *d = (struct linux_dirent64 *)s; - if (strlen(d->d_name) + 2 > rest) - continue; - switch (d->d_type) { - case DT_BLK: - sprintf(end, "/%s", d->d_name); - if (bstat(path) != dev) - break; - kfree(p); - return 0; - case DT_DIR: - if (strcmp(d->d_name, ".") == 0) - break; - if (strcmp(d->d_name, "..") == 0) - break; - sprintf(end, "/%s", d->d_name); - if (find_in_devfs(path, dev) < 0) - break; - kfree(p); - return 0; - } - } - kfree(p); - return -1; -} - -/* - * create a device node called which points to - * if possible, otherwise find a device node - * which matches and make a symlink pointing to it. - */ -int __init create_dev(char *name, dev_t dev, char *devfs_name) -{ - char path[64]; - - sys_unlink(name); - if (devfs_name && devfs_name[0]) { - if (strncmp(devfs_name, "/dev/", 5) == 0) - devfs_name += 5; - sprintf(path, "/dev/%s", devfs_name); - if (sys_access(path, 0) == 0) - return sys_symlink(devfs_name, name); - } - if (!dev) - return -1; - strcpy(path, "/dev"); - if (find_in_devfs(path, new_encode_dev(dev)) < 0) - return -1; - return sys_symlink(path + 5, name); -} diff --git a/init/do_mounts_initrd.c b/init/do_mounts_initrd.c index 405f9031a..a06f037fa 100644 --- a/init/do_mounts_initrd.c +++ b/init/do_mounts_initrd.c @@ -44,7 +44,7 @@ static void __init handle_initrd(void) int pid; real_root_dev = new_encode_dev(ROOT_DEV); - create_dev("/dev/root.old", Root_RAM0, NULL); + create_dev("/dev/root.old", Root_RAM0); /* mount initrd on rootfs' /root */ mount_block_root("/dev/root.old", root_mountflags & ~MS_RDONLY); sys_mkdir("/old", 0700); @@ -54,7 +54,6 @@ static void __init handle_initrd(void) sys_chdir("/root"); sys_mount(".", "/", NULL, MS_MOVE, NULL); sys_chroot("."); - mount_devfs_fs (); current->flags |= PF_NOFREEZE; pid = kernel_thread(do_linuxrc, "/linuxrc", SIGCHLD); @@ -71,7 +70,6 @@ static void __init handle_initrd(void) sys_chroot("."); sys_close(old_fd); sys_close(root_fd); - umount_devfs("/old/dev"); if (new_decode_dev(real_root_dev) == Root_RAM0) { sys_chdir("/old"); @@ -107,7 +105,7 @@ static void __init handle_initrd(void) int __init initrd_load(void) { if (mount_initrd) { - create_dev("/dev/ram", Root_RAM0, NULL); + create_dev("/dev/ram", Root_RAM0); /* * Load the initrd data into /dev/ram0. Execute it as initrd * unless /dev/ram0 is supposed to be our actual root device, diff --git a/init/do_mounts_md.c b/init/do_mounts_md.c index f6f36806f..2429e1bf8 100644 --- a/init/do_mounts_md.c +++ b/init/do_mounts_md.c @@ -125,19 +125,18 @@ static void __init md_setup_drive(void) int err = 0; char *devname; mdu_disk_info_t dinfo; - char name[16], devfs_name[16]; + char name[16]; minor = md_setup_args[ent].minor; partitioned = md_setup_args[ent].partitioned; devname = md_setup_args[ent].device_names; sprintf(name, "/dev/md%s%d", partitioned?"_d":"", minor); - sprintf(devfs_name, "/dev/md/%s%d", partitioned?"d":"", minor); if (partitioned) dev = MKDEV(mdp_major, minor << MdpMinorShift); else dev = MKDEV(MD_MAJOR, minor); - create_dev(name, dev, devfs_name); + create_dev(name, dev); for (i = 0; i < MD_SB_DISKS && devname != 0; i++) { char *p; char comp_name[64]; @@ -272,7 +271,7 @@ __setup("md=", md_setup); void __init md_run_setup(void) { - create_dev("/dev/md0", MKDEV(MD_MAJOR, 0), "md/0"); + create_dev("/dev/md0", MKDEV(MD_MAJOR, 0)); if (raid_noautodetect) printk(KERN_INFO "md: Skipping autodetection of RAID arrays. (raid=noautodetect)\n"); else { diff --git a/init/do_mounts_rd.c b/init/do_mounts_rd.c index c2683fcd7..ed652f40f 100644 --- a/init/do_mounts_rd.c +++ b/init/do_mounts_rd.c @@ -262,8 +262,8 @@ int __init rd_load_disk(int n) { if (rd_prompt) change_floppy("root floppy disk to be loaded into RAM disk"); - create_dev("/dev/root", ROOT_DEV, root_device_name); - create_dev("/dev/ram", MKDEV(RAMDISK_MAJOR, n), NULL); + create_dev("/dev/root", ROOT_DEV); + create_dev("/dev/ram", MKDEV(RAMDISK_MAJOR, n)); return rd_load_image("/dev/root"); } diff --git a/init/initramfs.c b/init/initramfs.c index d936912d5..738cc062f 100644 --- a/init/initramfs.c +++ b/init/initramfs.c @@ -30,6 +30,7 @@ static void __init free(void *where) static __initdata struct hash { int ino, minor, major; + mode_t mode; struct hash *next; char name[N_ALIGN(PATH_MAX)]; } *head[32]; @@ -41,7 +42,8 @@ static inline int hash(int major, int minor, int ino) return tmp & 31; } -static char __init *find_link(int major, int minor, int ino, char *name) +static char __init *find_link(int major, int minor, int ino, + mode_t mode, char *name) { struct hash **p, *q; for (p = head + hash(major, minor, ino); *p; p = &(*p)->next) { @@ -51,14 +53,17 @@ static char __init *find_link(int major, int minor, int ino, char *name) continue; if ((*p)->major != major) continue; + if (((*p)->mode ^ mode) & S_IFMT) + continue; return (*p)->name; } q = (struct hash *)malloc(sizeof(struct hash)); if (!q) panic("can't allocate link hash entry"); - q->ino = ino; - q->minor = minor; q->major = major; + q->minor = minor; + q->ino = ino; + q->mode = mode; strcpy(q->name, name); q->next = NULL; *p = q; @@ -229,13 +234,25 @@ static int __init do_reset(void) static int __init maybe_link(void) { if (nlink >= 2) { - char *old = find_link(major, minor, ino, collected); + char *old = find_link(major, minor, ino, mode, collected); if (old) return (sys_link(old, collected) < 0) ? -1 : 1; } return 0; } +static void __init clean_path(char *path, mode_t mode) +{ + struct stat st; + + if (!sys_newlstat(path, &st) && (st.st_mode^mode) & S_IFMT) { + if (S_ISDIR(st.st_mode)) + sys_rmdir(path); + else + sys_unlink(path); + } +} + static __initdata int wfd; static int __init do_name(void) @@ -248,10 +265,15 @@ static int __init do_name(void) } if (dry_run) return 0; + clean_path(collected, mode); if (S_ISREG(mode)) { - sys_unlink(collected); - if (maybe_link() >= 0) { - wfd = sys_open(collected, O_WRONLY|O_CREAT, mode); + int ml = maybe_link(); + if (ml >= 0) { + int openflags = O_WRONLY|O_CREAT; + if (ml != 1) + openflags |= O_TRUNC; + wfd = sys_open(collected, openflags, mode); + if (wfd >= 0) { sys_fchown(wfd, uid, gid); sys_fchmod(wfd, mode); @@ -293,7 +315,7 @@ static int __init do_copy(void) static int __init do_symlink(void) { collected[N_ALIGN(name_len) + body_len] = '\0'; - sys_unlink(collected); + clean_path(collected, 0); sys_symlink(collected + N_ALIGN(name_len), collected); sys_lchown(collected, uid, gid); state = SkipIt; diff --git a/init/main.c b/init/main.c index 495a5bc2f..9b807dd46 100644 --- a/init/main.c +++ b/init/main.c @@ -11,11 +11,9 @@ #define __KERNEL_SYSCALLS__ -#include #include #include #include -#include #include #include #include @@ -43,10 +41,16 @@ #include #include #include +#include +#include #include #include #include #include +#include +#include +#include +#include #include #include @@ -79,7 +83,6 @@ extern void mca_init(void); extern void sbus_init(void); extern void sysctl_init(void); extern void signals_init(void); -extern void buffer_init(void); extern void pidhash_init(void); extern void pidmap_init(void); extern void prio_tree_init(void); @@ -349,6 +352,10 @@ static void __init setup_per_cpu_areas(void) } #endif /* !__GENERIC_PER_CPU */ +#include +#include +#include + /* Called by boot processor to activate the rest. */ static void __init smp_init(void) { @@ -370,6 +377,15 @@ static void __init smp_init(void) smp_commence(); #endif + + printk(KERN_DEBUG "sizeof(vma)=%u bytes\n", (unsigned int) sizeof(struct vm_area_struct)); + printk(KERN_DEBUG "sizeof(page)=%u bytes\n", (unsigned int) sizeof(struct page)); + printk(KERN_DEBUG "sizeof(inode)=%u bytes\n", (unsigned int) sizeof(struct inode)); + printk(KERN_DEBUG "sizeof(dentry)=%u bytes\n", (unsigned int) sizeof(struct dentry)); + printk(KERN_DEBUG "sizeof(ext3inode)=%u bytes\n", (unsigned int) sizeof(struct ext3_inode_info)); + printk(KERN_DEBUG "sizeof(buffer_head)=%u bytes\n", (unsigned int) sizeof(struct buffer_head)); + printk(KERN_DEBUG "sizeof(skbuff)=%u bytes\n", (unsigned int) sizeof(struct sk_buff)); + printk(KERN_DEBUG "sizeof(task_struct)=%u bytes\n", (unsigned int) sizeof(struct task_struct)); } #endif @@ -446,10 +462,28 @@ static void __init boot_cpu_init(void) cpu_set(cpu, cpu_possible_map); } +void __init __attribute__((weak)) smp_setup_processor_id(void) +{ +} + asmlinkage void __init start_kernel(void) { char * command_line; extern struct kernel_param __start___param[], __stop___param[]; + + smp_setup_processor_id(); + + /* + * Need to run as early as possible, to initialize the + * lockdep hash: + */ + unwind_init(); + lockdep_init(); + + local_irq_disable(); + early_boot_irqs_off(); + early_init_irq_lock_class(); + /* * Interrupts are still disabled. Do necessary setups, then * enable them @@ -489,7 +523,13 @@ asmlinkage void __init start_kernel(void) init_timers(); hrtimers_init(); softirq_init(); + timekeeping_init(); time_init(); + profile_init(); + if (!irqs_disabled()) + printk("start_kernel(): bug: interrupts were enabled early\n"); + early_boot_irqs_on(); + local_irq_enable(); /* * HACK ALERT! This is early. We're enabling the console before @@ -499,8 +539,16 @@ asmlinkage void __init start_kernel(void) console_init(); if (panic_later) panic(panic_later, panic_param); - profile_init(); - local_irq_enable(); + + lockdep_info(); + + /* + * Need to run this when irqs are enabled, because it wants + * to self-test [hard/soft]-irqs on/off lock inversion bugs + * too: + */ + locking_selftest(); + #ifdef CONFIG_BLK_DEV_INITRD if (initrd_start && !initrd_below_start_ok && initrd_start < min_low_pfn << PAGE_SHIFT) { @@ -541,6 +589,8 @@ asmlinkage void __init start_kernel(void) proc_root_init(); #endif cpuset_init(); + taskstats_init_early(); + delayacct_init(); check_bugs(); diff --git a/init/version.c b/init/version.c index b92ca0801..6b5a72e4a 100644 --- a/init/version.c +++ b/init/version.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #define version(a) Version_ ## a diff --git a/ipc/compat.c b/ipc/compat.c index a544dfbb0..4d20cfd38 100644 --- a/ipc/compat.c +++ b/ipc/compat.c @@ -21,7 +21,6 @@ * */ #include -#include #include #include #include diff --git a/ipc/mqueue.c b/ipc/mqueue.c index 6c0a57481..5e09476c2 100644 --- a/ipc/mqueue.c +++ b/ipc/mqueue.c @@ -8,6 +8,8 @@ * Lockless receive & send, fd based notify: * Manfred Spraul (manfred@colorfullife.com) * + * Audit: George Wilson (ltcgcw@us.ibm.com) + * * This file is released under the GPL. */ @@ -24,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -114,7 +117,6 @@ static struct inode *mqueue_get_inode(struct super_block *sb, int mode, inode->i_mode = mode; inode->i_uid = current->fsuid; inode->i_gid = current->fsgid; - inode->i_blksize = PAGE_CACHE_SIZE; inode->i_blocks = 0; inode->i_mtime = inode->i_ctime = inode->i_atime = CURRENT_TIME; @@ -207,11 +209,11 @@ static int mqueue_fill_super(struct super_block *sb, void *data, int silent) return 0; } -static struct super_block *mqueue_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, - void *data) +static int mqueue_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, + void *data, struct vfsmount *mnt) { - return get_sb_single(fs_type, flags, data, mqueue_fill_super); + return get_sb_single(fs_type, flags, data, mqueue_fill_super, mnt); } static void init_once(void *foo, kmem_cache_t * cachep, unsigned long flags) @@ -365,7 +367,7 @@ static ssize_t mqueue_read_file(struct file *filp, char __user *u_data, return count; } -static int mqueue_flush_file(struct file *filp) +static int mqueue_flush_file(struct file *filp, fl_owner_t id) { struct mqueue_inode_info *info = MQUEUE_I(filp->f_dentry->d_inode); @@ -666,6 +668,10 @@ asmlinkage long sys_mq_open(const char __user *u_name, int oflag, mode_t mode, char *name; int fd, error; + error = audit_mq_open(oflag, mode, u_attr); + if (error != 0) + return error; + if (IS_ERR(name = getname(u_name))) return PTR_ERR(name); @@ -823,6 +829,10 @@ asmlinkage long sys_mq_timedsend(mqd_t mqdes, const char __user *u_msg_ptr, long timeout; int ret; + ret = audit_mq_timedsend(mqdes, msg_len, msg_prio, u_abs_timeout); + if (ret != 0) + return ret; + if (unlikely(msg_prio >= (unsigned long) MQ_PRIO_MAX)) return -EINVAL; @@ -905,6 +915,10 @@ asmlinkage ssize_t sys_mq_timedreceive(mqd_t mqdes, char __user *u_msg_ptr, struct mqueue_inode_info *info; struct ext_wait_queue wait; + ret = audit_mq_timedreceive(mqdes, msg_len, u_msg_prio, u_abs_timeout); + if (ret != 0) + return ret; + timeout = prepare_timeout(u_abs_timeout); ret = -EBADF; @@ -984,6 +998,10 @@ asmlinkage long sys_mq_notify(mqd_t mqdes, struct mqueue_inode_info *info; struct sk_buff *nc; + ret = audit_mq_notify(mqdes, u_notification); + if (ret != 0) + return ret; + nc = NULL; sock = NULL; if (u_notification != NULL) { @@ -1124,6 +1142,9 @@ asmlinkage long sys_mq_getsetattr(mqd_t mqdes, omqstat = info->attr; omqstat.mq_flags = filp->f_flags & O_NONBLOCK; if (u_mqstat) { + ret = audit_mq_getsetattr(mqdes, &mqstat); + if (ret != 0) + goto out; if (mqstat.mq_flags & O_NONBLOCK) filp->f_flags |= O_NONBLOCK; else diff --git a/ipc/msg.c b/ipc/msg.c index 91bece1be..cc2076331 100644 --- a/ipc/msg.c +++ b/ipc/msg.c @@ -1,6 +1,6 @@ /* * linux/ipc/msg.c - * Copyright (C) 1992 Krishna Balasubramanian + * Copyright (C) 1992 Krishna Balasubramanian * * Removed all the remaining kerneld mess * Catch the -EFAULT stuff properly @@ -19,7 +19,6 @@ */ #include -#include #include #include #include @@ -42,22 +41,24 @@ int msg_ctlmax = MSGMAX; int msg_ctlmnb = MSGMNB; int msg_ctlmni = MSGMNI; -/* one msg_receiver structure for each sleeping receiver */ +/* + * one msg_receiver structure for each sleeping receiver: + */ struct msg_receiver { - struct list_head r_list; - struct task_struct* r_tsk; + struct list_head r_list; + struct task_struct *r_tsk; - int r_mode; - long r_msgtype; - long r_maxsize; + int r_mode; + long r_msgtype; + long r_maxsize; - struct msg_msg* volatile r_msg; + volatile struct msg_msg *r_msg; }; /* one msg_sender for each sleeping sender */ struct msg_sender { - struct list_head list; - struct task_struct* tsk; + struct list_head list; + struct task_struct *tsk; }; #define SEARCH_ANY 1 @@ -65,45 +66,42 @@ struct msg_sender { #define SEARCH_NOTEQUAL 3 #define SEARCH_LESSEQUAL 4 -static atomic_t msg_bytes = ATOMIC_INIT(0); -static atomic_t msg_hdrs = ATOMIC_INIT(0); +static atomic_t msg_bytes = ATOMIC_INIT(0); +static atomic_t msg_hdrs = ATOMIC_INIT(0); static struct ipc_ids msg_ids; -#define msg_lock(id) ((struct msg_queue*)ipc_lock(&msg_ids,id)) -#define msg_unlock(msq) ipc_unlock(&(msq)->q_perm) -#define msg_rmid(id) ((struct msg_queue*)ipc_rmid(&msg_ids,id)) -#define msg_checkid(msq, msgid) \ - ipc_checkid(&msg_ids,&msq->q_perm,msgid) -#define msg_buildid(id, seq) \ - ipc_buildid(&msg_ids, id, seq) +#define msg_lock(id) ((struct msg_queue *)ipc_lock(&msg_ids, id)) +#define msg_unlock(msq) ipc_unlock(&(msq)->q_perm) +#define msg_rmid(id) ((struct msg_queue *)ipc_rmid(&msg_ids, id)) +#define msg_checkid(msq, msgid) ipc_checkid(&msg_ids, &msq->q_perm, msgid) +#define msg_buildid(id, seq) ipc_buildid(&msg_ids, id, seq) -static void freeque (struct msg_queue *msq, int id); -static int newque (key_t key, int msgflg); +static void freeque(struct msg_queue *msq, int id); +static int newque(key_t key, int msgflg); #ifdef CONFIG_PROC_FS static int sysvipc_msg_proc_show(struct seq_file *s, void *it); #endif -void __init msg_init (void) +void __init msg_init(void) { - ipc_init_ids(&msg_ids,msg_ctlmni); + ipc_init_ids(&msg_ids, msg_ctlmni); ipc_init_proc_interface("sysvipc/msg", " key msqid perms cbytes qnum lspid lrpid uid gid cuid cgid stime rtime ctime\n", &msg_ids, sysvipc_msg_proc_show); } -static int newque (key_t key, int msgflg) +static int newque(key_t key, int msgflg) { - int id; - int retval; struct msg_queue *msq; + int id, retval; - msq = ipc_rcu_alloc(sizeof(*msq)); - if (!msq) + msq = ipc_rcu_alloc(sizeof(*msq)); + if (!msq) return -ENOMEM; - msq->q_perm.mode = (msgflg & S_IRWXUGO); + msq->q_perm.mode = msgflg & S_IRWXUGO; msq->q_perm.key = key; msq->q_perm.xid = vx_current_xid(); @@ -115,13 +113,13 @@ static int newque (key_t key, int msgflg) } id = ipc_addid(&msg_ids, &msq->q_perm, msg_ctlmni); - if(id == -1) { + if (id == -1) { security_msg_queue_free(msq); ipc_rcu_putref(msq); return -ENOSPC; } - msq->q_id = msg_buildid(id,msq->q_perm.seq); + msq->q_id = msg_buildid(id, msq->q_perm.seq); msq->q_stime = msq->q_rtime = 0; msq->q_ctime = get_seconds(); msq->q_cbytes = msq->q_qnum = 0; @@ -135,44 +133,44 @@ static int newque (key_t key, int msgflg) return msq->q_id; } -static inline void ss_add(struct msg_queue* msq, struct msg_sender* mss) +static inline void ss_add(struct msg_queue *msq, struct msg_sender *mss) { - mss->tsk=current; - current->state=TASK_INTERRUPTIBLE; - list_add_tail(&mss->list,&msq->q_senders); + mss->tsk = current; + current->state = TASK_INTERRUPTIBLE; + list_add_tail(&mss->list, &msq->q_senders); } -static inline void ss_del(struct msg_sender* mss) +static inline void ss_del(struct msg_sender *mss) { - if(mss->list.next != NULL) + if (mss->list.next != NULL) list_del(&mss->list); } -static void ss_wakeup(struct list_head* h, int kill) +static void ss_wakeup(struct list_head *h, int kill) { struct list_head *tmp; tmp = h->next; while (tmp != h) { - struct msg_sender* mss; - - mss = list_entry(tmp,struct msg_sender,list); + struct msg_sender *mss; + + mss = list_entry(tmp, struct msg_sender, list); tmp = tmp->next; - if(kill) - mss->list.next=NULL; + if (kill) + mss->list.next = NULL; wake_up_process(mss->tsk); } } -static void expunge_all(struct msg_queue* msq, int res) +static void expunge_all(struct msg_queue *msq, int res) { struct list_head *tmp; tmp = msq->q_receivers.next; while (tmp != &msq->q_receivers) { - struct msg_receiver* msr; - - msr = list_entry(tmp,struct msg_receiver,r_list); + struct msg_receiver *msr; + + msr = list_entry(tmp, struct msg_receiver, r_list); tmp = tmp->next; msr->r_msg = NULL; wake_up_process(msr->r_tsk); @@ -180,26 +178,28 @@ static void expunge_all(struct msg_queue* msq, int res) msr->r_msg = ERR_PTR(res); } } -/* - * freeque() wakes up waiters on the sender and receiver waiting queue, - * removes the message queue from message queue ID + +/* + * freeque() wakes up waiters on the sender and receiver waiting queue, + * removes the message queue from message queue ID * array, and cleans up all the messages associated with this queue. * * msg_ids.mutex and the spinlock for this message queue is hold * before freeque() is called. msg_ids.mutex remains locked on exit. */ -static void freeque (struct msg_queue *msq, int id) +static void freeque(struct msg_queue *msq, int id) { struct list_head *tmp; - expunge_all(msq,-EIDRM); - ss_wakeup(&msq->q_senders,1); + expunge_all(msq, -EIDRM); + ss_wakeup(&msq->q_senders, 1); msq = msg_rmid(id); msg_unlock(msq); - + tmp = msq->q_messages.next; - while(tmp != &msq->q_messages) { - struct msg_msg* msg = list_entry(tmp,struct msg_msg,m_list); + while (tmp != &msq->q_messages) { + struct msg_msg *msg = list_entry(tmp, struct msg_msg, m_list); + tmp = tmp->next; atomic_dec(&msg_hdrs); free_msg(msg); @@ -209,10 +209,10 @@ static void freeque (struct msg_queue *msq, int id) ipc_rcu_putref(msq); } -asmlinkage long sys_msgget (key_t key, int msgflg) +asmlinkage long sys_msgget(key_t key, int msgflg) { - int id, ret = -EPERM; struct msg_queue *msq; + int id, ret = -EPERM; mutex_lock(&msg_ids.mutex); if (key == IPC_PRIVATE) @@ -226,31 +226,34 @@ asmlinkage long sys_msgget (key_t key, int msgflg) ret = -EEXIST; } else { msq = msg_lock(id); - BUG_ON(msq==NULL); + BUG_ON(msq == NULL); if (ipcperms(&msq->q_perm, msgflg)) ret = -EACCES; else { int qid = msg_buildid(id, msq->q_perm.seq); - ret = security_msg_queue_associate(msq, msgflg); + + ret = security_msg_queue_associate(msq, msgflg); if (!ret) ret = qid; } msg_unlock(msq); } mutex_unlock(&msg_ids.mutex); + return ret; } -static inline unsigned long copy_msqid_to_user(void __user *buf, struct msqid64_ds *in, int version) +static inline unsigned long +copy_msqid_to_user(void __user *buf, struct msqid64_ds *in, int version) { switch(version) { case IPC_64: - return copy_to_user (buf, in, sizeof(*in)); + return copy_to_user(buf, in, sizeof(*in)); case IPC_OLD: - { + { struct msqid_ds out; - memset(&out,0,sizeof(out)); + memset(&out, 0, sizeof(out)); ipc64_perm_to_ipc_perm(&in->msg_perm, &out.msg_perm); @@ -258,18 +261,18 @@ static inline unsigned long copy_msqid_to_user(void __user *buf, struct msqid64_ out.msg_rtime = in->msg_rtime; out.msg_ctime = in->msg_ctime; - if(in->msg_cbytes > USHRT_MAX) + if (in->msg_cbytes > USHRT_MAX) out.msg_cbytes = USHRT_MAX; else out.msg_cbytes = in->msg_cbytes; out.msg_lcbytes = in->msg_cbytes; - if(in->msg_qnum > USHRT_MAX) + if (in->msg_qnum > USHRT_MAX) out.msg_qnum = USHRT_MAX; else out.msg_qnum = in->msg_qnum; - if(in->msg_qbytes > USHRT_MAX) + if (in->msg_qbytes > USHRT_MAX) out.msg_qbytes = USHRT_MAX; else out.msg_qbytes = in->msg_qbytes; @@ -278,8 +281,8 @@ static inline unsigned long copy_msqid_to_user(void __user *buf, struct msqid64_ out.msg_lspid = in->msg_lspid; out.msg_lrpid = in->msg_lrpid; - return copy_to_user (buf, &out, sizeof(out)); - } + return copy_to_user(buf, &out, sizeof(out)); + } default: return -EINVAL; } @@ -292,14 +295,15 @@ struct msq_setbuf { mode_t mode; }; -static inline unsigned long copy_msqid_from_user(struct msq_setbuf *out, void __user *buf, int version) +static inline unsigned long +copy_msqid_from_user(struct msq_setbuf *out, void __user *buf, int version) { switch(version) { case IPC_64: - { + { struct msqid64_ds tbuf; - if (copy_from_user (&tbuf, buf, sizeof (tbuf))) + if (copy_from_user(&tbuf, buf, sizeof(tbuf))) return -EFAULT; out->qbytes = tbuf.msg_qbytes; @@ -308,60 +312,61 @@ static inline unsigned long copy_msqid_from_user(struct msq_setbuf *out, void __ out->mode = tbuf.msg_perm.mode; return 0; - } + } case IPC_OLD: - { + { struct msqid_ds tbuf_old; - if (copy_from_user (&tbuf_old, buf, sizeof (tbuf_old))) + if (copy_from_user(&tbuf_old, buf, sizeof(tbuf_old))) return -EFAULT; out->uid = tbuf_old.msg_perm.uid; out->gid = tbuf_old.msg_perm.gid; out->mode = tbuf_old.msg_perm.mode; - if(tbuf_old.msg_qbytes == 0) + if (tbuf_old.msg_qbytes == 0) out->qbytes = tbuf_old.msg_lqbytes; else out->qbytes = tbuf_old.msg_qbytes; return 0; - } + } default: return -EINVAL; } } -asmlinkage long sys_msgctl (int msqid, int cmd, struct msqid_ds __user *buf) +asmlinkage long sys_msgctl(int msqid, int cmd, struct msqid_ds __user *buf) { - int err, version; - struct msg_queue *msq; - struct msq_setbuf setbuf; struct kern_ipc_perm *ipcp; - + struct msq_setbuf setbuf; + struct msg_queue *msq; + int err, version; + if (msqid < 0 || cmd < 0) return -EINVAL; version = ipc_parse_version(&cmd); switch (cmd) { - case IPC_INFO: - case MSG_INFO: - { + case IPC_INFO: + case MSG_INFO: + { struct msginfo msginfo; int max_id; + if (!buf) return -EFAULT; - /* We must not return kernel stack data. + /* + * We must not return kernel stack data. * due to padding, it's not enough * to set all member fields. */ - err = security_msg_queue_msgctl(NULL, cmd); if (err) return err; - memset(&msginfo,0,sizeof(msginfo)); + memset(&msginfo, 0, sizeof(msginfo)); msginfo.msgmni = msg_ctlmni; msginfo.msgmax = msg_ctlmax; msginfo.msgmnb = msg_ctlmnb; @@ -379,36 +384,37 @@ asmlinkage long sys_msgctl (int msqid, int cmd, struct msqid_ds __user *buf) } max_id = msg_ids.max_id; mutex_unlock(&msg_ids.mutex); - if (copy_to_user (buf, &msginfo, sizeof(struct msginfo))) + if (copy_to_user(buf, &msginfo, sizeof(struct msginfo))) return -EFAULT; - return (max_id < 0) ? 0: max_id; + return (max_id < 0) ? 0 : max_id; } case MSG_STAT: case IPC_STAT: { struct msqid64_ds tbuf; int success_return; + if (!buf) return -EFAULT; - if(cmd == MSG_STAT && msqid >= msg_ids.entries->size) + if (cmd == MSG_STAT && msqid >= msg_ids.entries->size) return -EINVAL; - memset(&tbuf,0,sizeof(tbuf)); + memset(&tbuf, 0, sizeof(tbuf)); msq = msg_lock(msqid); if (msq == NULL) return -EINVAL; - if(cmd == MSG_STAT) { + if (cmd == MSG_STAT) { success_return = msg_buildid(msqid, msq->q_perm.seq); } else { err = -EIDRM; - if (msg_checkid(msq,msqid)) + if (msg_checkid(msq, msqid)) goto out_unlock; success_return = 0; } err = -EACCES; - if (ipcperms (&msq->q_perm, S_IRUGO)) + if (ipcperms(&msq->q_perm, S_IRUGO)) goto out_unlock; err = security_msg_queue_msgctl(msq, cmd); @@ -432,7 +438,7 @@ asmlinkage long sys_msgctl (int msqid, int cmd, struct msqid_ds __user *buf) case IPC_SET: if (!buf) return -EFAULT; - if (copy_msqid_from_user (&setbuf, buf, version)) + if (copy_msqid_from_user(&setbuf, buf, version)) return -EFAULT; break; case IPC_RMID: @@ -443,23 +449,29 @@ asmlinkage long sys_msgctl (int msqid, int cmd, struct msqid_ds __user *buf) mutex_lock(&msg_ids.mutex); msq = msg_lock(msqid); - err=-EINVAL; + err = -EINVAL; if (msq == NULL) goto out_up; err = -EIDRM; - if (msg_checkid(msq,msqid)) + if (msg_checkid(msq, msqid)) goto out_unlock_up; ipcp = &msq->q_perm; err = audit_ipc_obj(ipcp); if (err) goto out_unlock_up; + if (cmd==IPC_SET) { + err = audit_ipc_set_perm(setbuf.qbytes, setbuf.uid, setbuf.gid, + setbuf.mode); + if (err) + goto out_unlock_up; + } err = -EPERM; - if (current->euid != ipcp->cuid && + if (current->euid != ipcp->cuid && current->euid != ipcp->uid && !capable(CAP_SYS_ADMIN)) - /* We _could_ check for CAP_CHOWN above, but we don't */ + /* We _could_ check for CAP_CHOWN above, but we don't */ goto out_unlock_up; err = security_msg_queue_msgctl(msq, cmd); @@ -469,10 +481,6 @@ asmlinkage long sys_msgctl (int msqid, int cmd, struct msqid_ds __user *buf) switch (cmd) { case IPC_SET: { - err = audit_ipc_set_perm(setbuf.qbytes, setbuf.uid, setbuf.gid, setbuf.mode, ipcp); - if (err) - goto out_unlock_up; - err = -EPERM; if (setbuf.qbytes > msg_ctlmnb && !capable(CAP_SYS_RESOURCE)) goto out_unlock_up; @@ -481,22 +489,22 @@ asmlinkage long sys_msgctl (int msqid, int cmd, struct msqid_ds __user *buf) ipcp->uid = setbuf.uid; ipcp->gid = setbuf.gid; - ipcp->mode = (ipcp->mode & ~S_IRWXUGO) | - (S_IRWXUGO & setbuf.mode); + ipcp->mode = (ipcp->mode & ~S_IRWXUGO) | + (S_IRWXUGO & setbuf.mode); msq->q_ctime = get_seconds(); /* sleeping receivers might be excluded by * stricter permissions. */ - expunge_all(msq,-EAGAIN); + expunge_all(msq, -EAGAIN); /* sleeping senders might be able to send * due to a larger queue size. */ - ss_wakeup(&msq->q_senders,0); + ss_wakeup(&msq->q_senders, 0); msg_unlock(msq); break; } case IPC_RMID: - freeque (msq, msqid); + freeque(msq, msqid); break; } err = 0; @@ -511,41 +519,44 @@ out_unlock: return err; } -static int testmsg(struct msg_msg* msg,long type,int mode) +static int testmsg(struct msg_msg *msg, long type, int mode) { switch(mode) { case SEARCH_ANY: return 1; case SEARCH_LESSEQUAL: - if(msg->m_type <=type) + if (msg->m_type <=type) return 1; break; case SEARCH_EQUAL: - if(msg->m_type == type) + if (msg->m_type == type) return 1; break; case SEARCH_NOTEQUAL: - if(msg->m_type != type) + if (msg->m_type != type) return 1; break; } return 0; } -static inline int pipelined_send(struct msg_queue* msq, struct msg_msg* msg) +static inline int pipelined_send(struct msg_queue *msq, struct msg_msg *msg) { - struct list_head* tmp; + struct list_head *tmp; tmp = msq->q_receivers.next; while (tmp != &msq->q_receivers) { - struct msg_receiver* msr; - msr = list_entry(tmp,struct msg_receiver,r_list); + struct msg_receiver *msr; + + msr = list_entry(tmp, struct msg_receiver, r_list); tmp = tmp->next; - if(testmsg(msg,msr->r_msgtype,msr->r_mode) && - !security_msg_queue_msgrcv(msq, msg, msr->r_tsk, msr->r_msgtype, msr->r_mode)) { + if (testmsg(msg, msr->r_msgtype, msr->r_mode) && + !security_msg_queue_msgrcv(msq, msg, msr->r_tsk, + msr->r_msgtype, msr->r_mode)) { + list_del(&msr->r_list); - if(msr->r_maxsize < msg->m_ts) { + if (msr->r_maxsize < msg->m_ts) { msr->r_msg = NULL; wake_up_process(msr->r_tsk); smp_mb(); @@ -557,6 +568,7 @@ static inline int pipelined_send(struct msg_queue* msq, struct msg_msg* msg) wake_up_process(msr->r_tsk); smp_mb(); msr->r_msg = msg; + return 1; } } @@ -564,40 +576,41 @@ static inline int pipelined_send(struct msg_queue* msq, struct msg_msg* msg) return 0; } -asmlinkage long sys_msgsnd (int msqid, struct msgbuf __user *msgp, size_t msgsz, int msgflg) +asmlinkage long +sys_msgsnd(int msqid, struct msgbuf __user *msgp, size_t msgsz, int msgflg) { struct msg_queue *msq; struct msg_msg *msg; long mtype; int err; - + if (msgsz > msg_ctlmax || (long) msgsz < 0 || msqid < 0) return -EINVAL; if (get_user(mtype, &msgp->mtype)) - return -EFAULT; + return -EFAULT; if (mtype < 1) return -EINVAL; msg = load_msg(msgp->mtext, msgsz); - if(IS_ERR(msg)) + if (IS_ERR(msg)) return PTR_ERR(msg); msg->m_type = mtype; msg->m_ts = msgsz; msq = msg_lock(msqid); - err=-EINVAL; - if(msq==NULL) + err = -EINVAL; + if (msq == NULL) goto out_free; err= -EIDRM; - if (msg_checkid(msq,msqid)) + if (msg_checkid(msq, msqid)) goto out_unlock_free; for (;;) { struct msg_sender s; - err=-EACCES; + err = -EACCES; if (ipcperms(&msq->q_perm, S_IWUGO)) goto out_unlock_free; @@ -605,14 +618,14 @@ asmlinkage long sys_msgsnd (int msqid, struct msgbuf __user *msgp, size_t msgsz, if (err) goto out_unlock_free; - if(msgsz + msq->q_cbytes <= msq->q_qbytes && + if (msgsz + msq->q_cbytes <= msq->q_qbytes && 1 + msq->q_qnum <= msq->q_qbytes) { break; } /* queue full, wait: */ - if(msgflg&IPC_NOWAIT) { - err=-EAGAIN; + if (msgflg & IPC_NOWAIT) { + err = -EAGAIN; goto out_unlock_free; } ss_add(msq, &s); @@ -627,9 +640,9 @@ asmlinkage long sys_msgsnd (int msqid, struct msgbuf __user *msgp, size_t msgsz, goto out_unlock_free; } ss_del(&s); - + if (signal_pending(current)) { - err=-ERESTARTNOHAND; + err = -ERESTARTNOHAND; goto out_unlock_free; } } @@ -637,47 +650,47 @@ asmlinkage long sys_msgsnd (int msqid, struct msgbuf __user *msgp, size_t msgsz, msq->q_lspid = current->tgid; msq->q_stime = get_seconds(); - if(!pipelined_send(msq,msg)) { + if (!pipelined_send(msq, msg)) { /* noone is waiting for this message, enqueue it */ - list_add_tail(&msg->m_list,&msq->q_messages); + list_add_tail(&msg->m_list, &msq->q_messages); msq->q_cbytes += msgsz; msq->q_qnum++; - atomic_add(msgsz,&msg_bytes); + atomic_add(msgsz, &msg_bytes); atomic_inc(&msg_hdrs); } - + err = 0; msg = NULL; out_unlock_free: msg_unlock(msq); out_free: - if(msg!=NULL) + if (msg != NULL) free_msg(msg); return err; } -static inline int convert_mode(long* msgtyp, int msgflg) +static inline int convert_mode(long *msgtyp, int msgflg) { - /* + /* * find message of correct type. * msgtyp = 0 => get first. * msgtyp > 0 => get first message of matching type. - * msgtyp < 0 => get message with least type must be < abs(msgtype). + * msgtyp < 0 => get message with least type must be < abs(msgtype). */ - if(*msgtyp==0) + if (*msgtyp == 0) return SEARCH_ANY; - if(*msgtyp<0) { - *msgtyp=-(*msgtyp); + if (*msgtyp < 0) { + *msgtyp = -*msgtyp; return SEARCH_LESSEQUAL; } - if(msgflg & MSG_EXCEPT) + if (msgflg & MSG_EXCEPT) return SEARCH_NOTEQUAL; return SEARCH_EQUAL; } -asmlinkage long sys_msgrcv (int msqid, struct msgbuf __user *msgp, size_t msgsz, - long msgtyp, int msgflg) +asmlinkage long sys_msgrcv(int msqid, struct msgbuf __user *msgp, size_t msgsz, + long msgtyp, int msgflg) { struct msg_queue *msq; struct msg_msg *msg; @@ -685,44 +698,51 @@ asmlinkage long sys_msgrcv (int msqid, struct msgbuf __user *msgp, size_t msgsz, if (msqid < 0 || (long) msgsz < 0) return -EINVAL; - mode = convert_mode(&msgtyp,msgflg); + mode = convert_mode(&msgtyp, msgflg); msq = msg_lock(msqid); - if(msq==NULL) + if (msq == NULL) return -EINVAL; msg = ERR_PTR(-EIDRM); - if (msg_checkid(msq,msqid)) + if (msg_checkid(msq, msqid)) goto out_unlock; for (;;) { struct msg_receiver msr_d; - struct list_head* tmp; + struct list_head *tmp; msg = ERR_PTR(-EACCES); - if (ipcperms (&msq->q_perm, S_IRUGO)) + if (ipcperms(&msq->q_perm, S_IRUGO)) goto out_unlock; msg = ERR_PTR(-EAGAIN); tmp = msq->q_messages.next; while (tmp != &msq->q_messages) { struct msg_msg *walk_msg; - walk_msg = list_entry(tmp,struct msg_msg,m_list); - if(testmsg(walk_msg,msgtyp,mode) && - !security_msg_queue_msgrcv(msq, walk_msg, current, msgtyp, mode)) { + + walk_msg = list_entry(tmp, struct msg_msg, m_list); + if (testmsg(walk_msg, msgtyp, mode) && + !security_msg_queue_msgrcv(msq, walk_msg, current, + msgtyp, mode)) { + msg = walk_msg; - if(mode == SEARCH_LESSEQUAL && walk_msg->m_type != 1) { - msg=walk_msg; - msgtyp=walk_msg->m_type-1; + if (mode == SEARCH_LESSEQUAL && + walk_msg->m_type != 1) { + msg = walk_msg; + msgtyp = walk_msg->m_type - 1; } else { - msg=walk_msg; + msg = walk_msg; break; } } tmp = tmp->next; } - if(!IS_ERR(msg)) { - /* Found a suitable message. Unlink it from the queue. */ + if (!IS_ERR(msg)) { + /* + * Found a suitable message. + * Unlink it from the queue. + */ if ((msgsz < msg->m_ts) && !(msgflg & MSG_NOERROR)) { msg = ERR_PTR(-E2BIG); goto out_unlock; @@ -732,9 +752,9 @@ asmlinkage long sys_msgrcv (int msqid, struct msgbuf __user *msgp, size_t msgsz, msq->q_rtime = get_seconds(); msq->q_lrpid = current->tgid; msq->q_cbytes -= msg->m_ts; - atomic_sub(msg->m_ts,&msg_bytes); + atomic_sub(msg->m_ts, &msg_bytes); atomic_dec(&msg_hdrs); - ss_wakeup(&msq->q_senders,0); + ss_wakeup(&msq->q_senders, 0); msg_unlock(msq); break; } @@ -743,13 +763,13 @@ asmlinkage long sys_msgrcv (int msqid, struct msgbuf __user *msgp, size_t msgsz, msg = ERR_PTR(-ENOMSG); goto out_unlock; } - list_add_tail(&msr_d.r_list,&msq->q_receivers); + list_add_tail(&msr_d.r_list, &msq->q_receivers); msr_d.r_tsk = current; msr_d.r_msgtype = msgtyp; msr_d.r_mode = mode; - if(msgflg & MSG_NOERROR) + if (msgflg & MSG_NOERROR) msr_d.r_maxsize = INT_MAX; - else + else msr_d.r_maxsize = msgsz; msr_d.r_msg = ERR_PTR(-EAGAIN); current->state = TASK_INTERRUPTIBLE; @@ -774,17 +794,17 @@ asmlinkage long sys_msgrcv (int msqid, struct msgbuf __user *msgp, size_t msgsz, * wake_up_process(). There is a race with exit(), see * ipc/mqueue.c for the details. */ - msg = (struct msg_msg*) msr_d.r_msg; + msg = (struct msg_msg*)msr_d.r_msg; while (msg == NULL) { cpu_relax(); - msg = (struct msg_msg*) msr_d.r_msg; + msg = (struct msg_msg *)msr_d.r_msg; } /* Lockless receive, part 3: * If there is a message or an error then accept it without * locking. */ - if(msg != ERR_PTR(-EAGAIN)) { + if (msg != ERR_PTR(-EAGAIN)) { rcu_read_unlock(); break; } @@ -799,7 +819,7 @@ asmlinkage long sys_msgrcv (int msqid, struct msgbuf __user *msgp, size_t msgsz, * Repeat test after acquiring the spinlock. */ msg = (struct msg_msg*)msr_d.r_msg; - if(msg != ERR_PTR(-EAGAIN)) + if (msg != ERR_PTR(-EAGAIN)) goto out_unlock; list_del(&msr_d.r_list); @@ -811,14 +831,15 @@ out_unlock: } } if (IS_ERR(msg)) - return PTR_ERR(msg); + return PTR_ERR(msg); msgsz = (msgsz > msg->m_ts) ? msg->m_ts : msgsz; if (put_user (msg->m_type, &msgp->mtype) || store_msg(msgp->mtext, msg, msgsz)) { - msgsz = -EFAULT; + msgsz = -EFAULT; } free_msg(msg); + return msgsz; } @@ -831,20 +852,20 @@ static int sysvipc_msg_proc_show(struct seq_file *s, void *it) return 0; return seq_printf(s, - "%10d %10d %4o %10lu %10lu %5u %5u %5u %5u %5u %5u %10lu %10lu %10lu\n", - msq->q_perm.key, - msq->q_id, - msq->q_perm.mode, - msq->q_cbytes, - msq->q_qnum, - msq->q_lspid, - msq->q_lrpid, - msq->q_perm.uid, - msq->q_perm.gid, - msq->q_perm.cuid, - msq->q_perm.cgid, - msq->q_stime, - msq->q_rtime, - msq->q_ctime); + "%10d %10d %4o %10lu %10lu %5u %5u %5u %5u %5u %5u %10lu %10lu %10lu\n", + msq->q_perm.key, + msq->q_id, + msq->q_perm.mode, + msq->q_cbytes, + msq->q_qnum, + msq->q_lspid, + msq->q_lrpid, + msq->q_perm.uid, + msq->q_perm.gid, + msq->q_perm.cuid, + msq->q_perm.cgid, + msq->q_stime, + msq->q_rtime, + msq->q_ctime); } #endif diff --git a/ipc/sem.c b/ipc/sem.c index 11b2960d6..b3cbd4ce1 100644 --- a/ipc/sem.c +++ b/ipc/sem.c @@ -66,7 +66,6 @@ * Dustin Kirkland */ -#include #include #include #include @@ -829,6 +828,11 @@ static int semctl_down(int semid, int semnum, int cmd, int version, union semun if (err) goto out_unlock; + if (cmd == IPC_SET) { + err = audit_ipc_set_perm(0, setbuf.uid, setbuf.gid, setbuf.mode); + if (err) + goto out_unlock; + } if (current->euid != ipcp->cuid && current->euid != ipcp->uid && !capable(CAP_SYS_ADMIN)) { err=-EPERM; @@ -845,9 +849,6 @@ static int semctl_down(int semid, int semnum, int cmd, int version, union semun err = 0; break; case IPC_SET: - err = audit_ipc_set_perm(0, setbuf.uid, setbuf.gid, setbuf.mode, ipcp); - if (err) - goto out_unlock; ipcp->uid = setbuf.uid; ipcp->gid = setbuf.gid; ipcp->mode = (ipcp->mode & ~S_IRWXUGO) diff --git a/ipc/shm.c b/ipc/shm.c index 0d14fb9da..433746060 100644 --- a/ipc/shm.c +++ b/ipc/shm.c @@ -17,7 +17,6 @@ * Dustin Kirkland */ -#include #include #include #include @@ -655,7 +654,7 @@ asmlinkage long sys_shmctl (int shmid, int cmd, struct shmid_ds __user *buf) err = audit_ipc_obj(&(shp->shm_perm)); if (err) goto out_unlock_up; - err = audit_ipc_set_perm(0, setbuf.uid, setbuf.gid, setbuf.mode, &(shp->shm_perm)); + err = audit_ipc_set_perm(0, setbuf.uid, setbuf.gid, setbuf.mode); if (err) goto out_unlock_up; err=-EPERM; @@ -710,7 +709,6 @@ long do_shmat(int shmid, char __user *shmaddr, int shmflg, ulong *raddr) int err; unsigned long flags; unsigned long prot; - unsigned long o_flags; int acc_mode; void *user_addr; @@ -737,11 +735,9 @@ long do_shmat(int shmid, char __user *shmaddr, int shmflg, ulong *raddr) if (shmflg & SHM_RDONLY) { prot = PROT_READ; - o_flags = O_RDONLY; acc_mode = S_IRUGO; } else { prot = PROT_READ | PROT_WRITE; - o_flags = O_RDWR; acc_mode = S_IRUGO | S_IWUGO; } if (shmflg & SHM_EXEC) { diff --git a/ipc/util.c b/ipc/util.c index 43631f5d4..65efa3774 100644 --- a/ipc/util.c +++ b/ipc/util.c @@ -14,7 +14,6 @@ * Dustin Kirkland */ -#include #include #include #include diff --git a/kernel/Makefile b/kernel/Makefile index e112d5754..1666d4b24 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -8,23 +8,33 @@ obj-y = sched.o fork.o exec_domain.o panic.o printk.o profile.o \ signal.o sys.o kmod.o workqueue.o pid.o \ rcupdate.o extable.o params.o posix-timers.o \ kthread.o wait.o kfifo.o sys_ni.o posix-cpu-timers.o mutex.o \ - hrtimer.o + hrtimer.o rwsem.o obj-y += vserver/ +obj-$(CONFIG_STACKTRACE) += stacktrace.o +obj-y += time/ obj-$(CONFIG_DEBUG_MUTEXES) += mutex-debug.o +obj-$(CONFIG_LOCKDEP) += lockdep.o +ifeq ($(CONFIG_PROC_FS),y) +obj-$(CONFIG_LOCKDEP) += lockdep_proc.o +endif obj-$(CONFIG_FUTEX) += futex.o ifeq ($(CONFIG_COMPAT),y) obj-$(CONFIG_FUTEX) += futex_compat.o endif +obj-$(CONFIG_RT_MUTEXES) += rtmutex.o +obj-$(CONFIG_DEBUG_RT_MUTEXES) += rtmutex-debug.o +obj-$(CONFIG_RT_MUTEX_TESTER) += rtmutex-tester.o obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o obj-$(CONFIG_SMP) += cpu.o spinlock.o obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock.o +obj-$(CONFIG_PROVE_LOCKING) += spinlock.o obj-$(CONFIG_UID16) += uid16.o obj-$(CONFIG_MODULES) += module.o module-verify.o obj-$(CONFIG_MODULE_SIG) += module-verify-sig.o -obj-$(CONFIG_OBSOLETE_INTERMODULE) += intermodule.o obj-$(CONFIG_KALLSYMS) += kallsyms.o +obj-$(CONFIG_STACK_UNWIND) += unwind.o obj-$(CONFIG_PM) += power/ obj-$(CONFIG_BSD_PROCESS_ACCT) += acct.o obj-$(CONFIG_KEXEC) += kexec.o @@ -41,6 +51,9 @@ obj-$(CONFIG_GENERIC_HARDIRQS) += irq/ obj-$(CONFIG_SECCOMP) += seccomp.o obj-$(CONFIG_RCU_TORTURE_TEST) += rcutorture.o obj-$(CONFIG_RELAY) += relay.o +obj-$(CONFIG_TASK_DELAY_ACCT) += delayacct.o +obj-$(CONFIG_TASKSTATS) += taskstats.o +obj-$(CONFIG_UTRACE) += utrace.o ifneq ($(CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER),y) # According to Alan Modra , the -fno-omit-frame-pointer is diff --git a/kernel/acct.c b/kernel/acct.c index b327f4d20..2a7c93365 100644 --- a/kernel/acct.c +++ b/kernel/acct.c @@ -43,7 +43,6 @@ * a struct file opened for write. Fixed. 2/6/2000, AV. */ -#include #include #include #include @@ -75,7 +74,7 @@ int acct_parm[3] = {4, 2, 30}; /* * External references and all of the globals. */ -static void do_acct_process(long, struct file *); +static void do_acct_process(struct file *); /* * This structure is used so that all the data protected by lock @@ -118,7 +117,7 @@ static int check_free_space(struct file *file) spin_unlock(&acct_globals.lock); /* May block */ - if (vfs_statfs(file->f_dentry->d_inode->i_sb, &sbuf)) + if (vfs_statfs(file->f_dentry, &sbuf)) return res; suspend = sbuf.f_blocks * SUSPEND; resume = sbuf.f_blocks * RESUME; @@ -196,7 +195,7 @@ static void acct_file_reopen(struct file *file) if (old_acct) { mnt_unpin(old_acct->f_vfsmnt); spin_unlock(&acct_globals.lock); - do_acct_process(0, old_acct); + do_acct_process(old_acct); filp_close(old_acct, NULL); spin_lock(&acct_globals.lock); } @@ -419,16 +418,15 @@ static u32 encode_float(u64 value) /* * do_acct_process does all actual work. Caller holds the reference to file. */ -static void do_acct_process(long exitcode, struct file *file) +static void do_acct_process(struct file *file) { + struct pacct_struct *pacct = ¤t->signal->pacct; acct_t ac; mm_segment_t fs; - unsigned long vsize; unsigned long flim; u64 elapsed; u64 run_time; struct timespec uptime; - unsigned long jiffies; /* * First check to see if there is enough free_space to continue @@ -469,12 +467,6 @@ static void do_acct_process(long exitcode, struct file *file) #endif do_div(elapsed, AHZ); ac.ac_btime = xtime.tv_sec - elapsed; - jiffies = cputime_to_jiffies(cputime_add(current->utime, - current->signal->utime)); - ac.ac_utime = encode_comp_t(jiffies_to_AHZ(jiffies)); - jiffies = cputime_to_jiffies(cputime_add(current->stime, - current->signal->stime)); - ac.ac_stime = encode_comp_t(jiffies_to_AHZ(jiffies)); /* we really need to bite the bullet and change layout */ ac.ac_uid = current->uid; ac.ac_gid = current->gid; @@ -496,37 +488,18 @@ static void do_acct_process(long exitcode, struct file *file) old_encode_dev(tty_devnum(current->signal->tty)) : 0; read_unlock(&tasklist_lock); - ac.ac_flag = 0; - if (current->flags & PF_FORKNOEXEC) - ac.ac_flag |= AFORK; - if (current->flags & PF_SUPERPRIV) - ac.ac_flag |= ASU; - if (current->flags & PF_DUMPCORE) - ac.ac_flag |= ACORE; - if (current->flags & PF_SIGNALED) - ac.ac_flag |= AXSIG; - - vsize = 0; - if (current->mm) { - struct vm_area_struct *vma; - down_read(¤t->mm->mmap_sem); - vma = current->mm->mmap; - while (vma) { - vsize += vma->vm_end - vma->vm_start; - vma = vma->vm_next; - } - up_read(¤t->mm->mmap_sem); - } - vsize = vsize / 1024; - ac.ac_mem = encode_comp_t(vsize); + spin_lock_irq(¤t->sighand->siglock); + ac.ac_utime = encode_comp_t(jiffies_to_AHZ(cputime_to_jiffies(pacct->ac_utime))); + ac.ac_stime = encode_comp_t(jiffies_to_AHZ(cputime_to_jiffies(pacct->ac_stime))); + ac.ac_flag = pacct->ac_flag; + ac.ac_mem = encode_comp_t(pacct->ac_mem); + ac.ac_minflt = encode_comp_t(pacct->ac_minflt); + ac.ac_majflt = encode_comp_t(pacct->ac_majflt); + ac.ac_exitcode = pacct->ac_exitcode; + spin_unlock_irq(¤t->sighand->siglock); ac.ac_io = encode_comp_t(0 /* current->io_usage */); /* %% */ ac.ac_rw = encode_comp_t(ac.ac_io / 1024); - ac.ac_minflt = encode_comp_t(current->signal->min_flt + - current->min_flt); - ac.ac_majflt = encode_comp_t(current->signal->maj_flt + - current->maj_flt); ac.ac_swaps = encode_comp_t(0); - ac.ac_exitcode = exitcode; /* * Kernel segment override to datasegment and write it @@ -545,13 +518,65 @@ static void do_acct_process(long exitcode, struct file *file) set_fs(fs); } +/** + * acct_init_pacct - initialize a new pacct_struct + * @pacct: per-process accounting info struct to initialize + */ +void acct_init_pacct(struct pacct_struct *pacct) +{ + memset(pacct, 0, sizeof(struct pacct_struct)); + pacct->ac_utime = pacct->ac_stime = cputime_zero; +} + +/** + * acct_collect - collect accounting information into pacct_struct + * @exitcode: task exit code + * @group_dead: not 0, if this thread is the last one in the process. + */ +void acct_collect(long exitcode, int group_dead) +{ + struct pacct_struct *pacct = ¤t->signal->pacct; + unsigned long vsize = 0; + + if (group_dead && current->mm) { + struct vm_area_struct *vma; + down_read(¤t->mm->mmap_sem); + vma = current->mm->mmap; + while (vma) { + vsize += vma->vm_end - vma->vm_start; + vma = vma->vm_next; + } + up_read(¤t->mm->mmap_sem); + } + + spin_lock_irq(¤t->sighand->siglock); + if (group_dead) + pacct->ac_mem = vsize / 1024; + if (thread_group_leader(current)) { + pacct->ac_exitcode = exitcode; + if (current->flags & PF_FORKNOEXEC) + pacct->ac_flag |= AFORK; + } + if (current->flags & PF_SUPERPRIV) + pacct->ac_flag |= ASU; + if (current->flags & PF_DUMPCORE) + pacct->ac_flag |= ACORE; + if (current->flags & PF_SIGNALED) + pacct->ac_flag |= AXSIG; + pacct->ac_utime = cputime_add(pacct->ac_utime, current->utime); + pacct->ac_stime = cputime_add(pacct->ac_stime, current->stime); + pacct->ac_minflt += current->min_flt; + pacct->ac_majflt += current->maj_flt; + spin_unlock_irq(¤t->sighand->siglock); +} + /** * acct_process - now just a wrapper around do_acct_process * @exitcode: task exit code * * handles process accounting for an exiting task */ -void acct_process(long exitcode) +void acct_process(void) { struct file *file = NULL; @@ -570,7 +595,7 @@ void acct_process(long exitcode) get_file(file); spin_unlock(&acct_globals.lock); - do_acct_process(exitcode, file); + do_acct_process(file); fput(file); } @@ -599,9 +624,7 @@ void acct_update_integrals(struct task_struct *tsk) */ void acct_clear_integrals(struct task_struct *tsk) { - if (tsk) { - tsk->acct_stimexpd = 0; - tsk->acct_rss_mem1 = 0; - tsk->acct_vm_mem1 = 0; - } + tsk->acct_stimexpd = 0; + tsk->acct_rss_mem1 = 0; + tsk->acct_vm_mem1 = 0; } diff --git a/kernel/audit.c b/kernel/audit.c index df57b493e..963fd15c9 100644 --- a/kernel/audit.c +++ b/kernel/audit.c @@ -56,6 +56,7 @@ #include #include #include +#include #include "audit.h" @@ -89,6 +90,7 @@ static int audit_backlog_wait_overflow = 0; /* The identity of the user shutting down the audit system. */ uid_t audit_sig_uid = -1; pid_t audit_sig_pid = -1; +u32 audit_sig_sid = 0; /* Records can be lost in several ways: 0) [suppressed in audit_alloc] @@ -102,6 +104,12 @@ static atomic_t audit_lost = ATOMIC_INIT(0); /* The netlink socket. */ static struct sock *audit_sock; +/* Inotify handle. */ +struct inotify_handle *audit_ih; + +/* Hash for inode-based rules */ +struct list_head audit_inode_hash[AUDIT_INODE_BUCKETS]; + /* The audit_freelist is a list of pre-allocated audit buffers (if more * than AUDIT_MAXFREE are in use, the audit buffer is freed instead of * being placed on the freelist). */ @@ -114,10 +122,8 @@ static struct task_struct *kauditd_task; static DECLARE_WAIT_QUEUE_HEAD(kauditd_wait); static DECLARE_WAIT_QUEUE_HEAD(audit_backlog_wait); -/* The netlink socket is only to be read by 1 CPU, which lets us assume - * that list additions and deletions never happen simultaneously in - * auditsc.c */ -DEFINE_MUTEX(audit_netlink_mutex); +/* Serialize requests from userspace. */ +static DEFINE_MUTEX(audit_cmd_mutex); /* AUDIT_BUFSIZ is the size of the temporary buffer used for formatting * audit records. Since printk uses a 1024 byte buffer, this buffer @@ -250,7 +256,7 @@ static int audit_set_rate_limit(int limit, uid_t loginuid, u32 sid) "audit_rate_limit=%d old=%d by auid=%u", limit, old, loginuid); audit_rate_limit = limit; - return old; + return 0; } static int audit_set_backlog_limit(int limit, uid_t loginuid, u32 sid) @@ -273,7 +279,7 @@ static int audit_set_backlog_limit(int limit, uid_t loginuid, u32 sid) "audit_backlog_limit=%d old=%d by auid=%u", limit, old, loginuid); audit_backlog_limit = limit; - return old; + return 0; } static int audit_set_enabled(int state, uid_t loginuid, u32 sid) @@ -299,7 +305,7 @@ static int audit_set_enabled(int state, uid_t loginuid, u32 sid) "audit_enabled=%d old=%d by auid=%u", state, old, loginuid); audit_enabled = state; - return old; + return 0; } static int audit_set_failure(int state, uid_t loginuid, u32 sid) @@ -327,7 +333,7 @@ static int audit_set_failure(int state, uid_t loginuid, u32 sid) "audit_failure=%d old=%d by auid=%u", state, old, loginuid); audit_failure = state; - return old; + return 0; } static int kauditd_thread(void *dummy) @@ -363,9 +369,52 @@ static int kauditd_thread(void *dummy) remove_wait_queue(&kauditd_wait, &wait); } } +} + +int audit_send_list(void *_dest) +{ + struct audit_netlink_list *dest = _dest; + int pid = dest->pid; + struct sk_buff *skb; + + /* wait for parent to finish and send an ACK */ + mutex_lock(&audit_cmd_mutex); + mutex_unlock(&audit_cmd_mutex); + + while ((skb = __skb_dequeue(&dest->q)) != NULL) + netlink_unicast(audit_sock, skb, pid, 0); + + kfree(dest); + return 0; } +struct sk_buff *audit_make_reply(int pid, int seq, int type, int done, + int multi, void *payload, int size) +{ + struct sk_buff *skb; + struct nlmsghdr *nlh; + int len = NLMSG_SPACE(size); + void *data; + int flags = multi ? NLM_F_MULTI : 0; + int t = done ? NLMSG_DONE : type; + + skb = alloc_skb(len, GFP_KERNEL); + if (!skb) + return NULL; + + nlh = NLMSG_PUT(skb, pid, seq, t, size); + nlh->nlmsg_flags = flags; + data = NLMSG_DATA(nlh); + memcpy(data, payload, size); + return skb; + +nlmsg_failure: /* Used by NLMSG_PUT */ + if (skb) + kfree_skb(skb); + return NULL; +} + /** * audit_send_reply - send an audit reply message via netlink * @pid: process id to send reply to @@ -383,36 +432,20 @@ void audit_send_reply(int pid, int seq, int type, int done, int multi, void *payload, int size) { struct sk_buff *skb; - struct nlmsghdr *nlh; - int len = NLMSG_SPACE(size); - void *data; - int flags = multi ? NLM_F_MULTI : 0; - int t = done ? NLMSG_DONE : type; - - skb = alloc_skb(len, GFP_KERNEL); + skb = audit_make_reply(pid, seq, type, done, multi, payload, size); if (!skb) return; - - nlh = NLMSG_PUT(skb, pid, seq, t, size); - nlh->nlmsg_flags = flags; - data = NLMSG_DATA(nlh); - memcpy(data, payload, size); - /* Ignore failure. It'll only happen if the sender goes away, because our timeout is set to infinite. */ netlink_unicast(audit_sock, skb, pid, 0); return; - -nlmsg_failure: /* Used by NLMSG_PUT */ - if (skb) - kfree_skb(skb); } /* * Check for appropriate CAP_AUDIT_ capabilities on incoming audit * control messages. */ -static int audit_netlink_ok(kernel_cap_t eff_cap, u16 msg_type) +static int audit_netlink_ok(struct sk_buff *skb, u16 msg_type) { int err = 0; @@ -426,13 +459,13 @@ static int audit_netlink_ok(kernel_cap_t eff_cap, u16 msg_type) case AUDIT_DEL: case AUDIT_DEL_RULE: case AUDIT_SIGNAL_INFO: - if (!cap_raised(eff_cap, CAP_AUDIT_CONTROL)) + if (security_netlink_recv(skb, CAP_AUDIT_CONTROL)) err = -EPERM; break; case AUDIT_USER: case AUDIT_FIRST_USER_MSG...AUDIT_LAST_USER_MSG: case AUDIT_FIRST_USER_MSG2...AUDIT_LAST_USER_MSG2: - if (!cap_raised(eff_cap, CAP_AUDIT_WRITE)) + if (security_netlink_recv(skb, CAP_AUDIT_WRITE)) err = -EPERM; break; default: /* bad msg */ @@ -451,9 +484,11 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) struct audit_buffer *ab; u16 msg_type = nlh->nlmsg_type; uid_t loginuid; /* loginuid of sender */ - struct audit_sig_info sig_data; + struct audit_sig_info *sig_data; + char *ctx; + u32 len; - err = audit_netlink_ok(NETLINK_CB(skb).eff_cap, msg_type); + err = audit_netlink_ok(skb, msg_type); if (err) return err; @@ -503,12 +538,9 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) if (status_get->mask & AUDIT_STATUS_PID) { int old = audit_pid; if (sid) { - char *ctx = NULL; - u32 len; - int rc; - if ((rc = selinux_ctxid_to_string( + if ((err = selinux_ctxid_to_string( sid, &ctx, &len))) - return rc; + return err; else audit_log(NULL, GFP_KERNEL, AUDIT_CONFIG_CHANGE, @@ -523,10 +555,10 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) audit_pid = status_get->pid; } if (status_get->mask & AUDIT_STATUS_RATE_LIMIT) - audit_set_rate_limit(status_get->rate_limit, + err = audit_set_rate_limit(status_get->rate_limit, loginuid, sid); if (status_get->mask & AUDIT_STATUS_BACKLOG_LIMIT) - audit_set_backlog_limit(status_get->backlog_limit, + err = audit_set_backlog_limit(status_get->backlog_limit, loginuid, sid); break; case AUDIT_USER: @@ -544,8 +576,6 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) "user pid=%d uid=%u auid=%u", pid, uid, loginuid); if (sid) { - char *ctx = NULL; - u32 len; if (selinux_ctxid_to_string( sid, &ctx, &len)) { audit_log_format(ab, @@ -584,10 +614,21 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) loginuid, sid); break; case AUDIT_SIGNAL_INFO: - sig_data.uid = audit_sig_uid; - sig_data.pid = audit_sig_pid; + err = selinux_ctxid_to_string(audit_sig_sid, &ctx, &len); + if (err) + return err; + sig_data = kmalloc(sizeof(*sig_data) + len, GFP_KERNEL); + if (!sig_data) { + kfree(ctx); + return -ENOMEM; + } + sig_data->uid = audit_sig_uid; + sig_data->pid = audit_sig_pid; + memcpy(sig_data->ctx, ctx, len); + kfree(ctx); audit_send_reply(NETLINK_CB(skb).pid, seq, AUDIT_SIGNAL_INFO, - 0, 0, &sig_data, sizeof(sig_data)); + 0, 0, sig_data, sizeof(*sig_data) + len); + kfree(sig_data); break; default: err = -EINVAL; @@ -629,20 +670,28 @@ static void audit_receive(struct sock *sk, int length) struct sk_buff *skb; unsigned int qlen; - mutex_lock(&audit_netlink_mutex); + mutex_lock(&audit_cmd_mutex); for (qlen = skb_queue_len(&sk->sk_receive_queue); qlen; qlen--) { skb = skb_dequeue(&sk->sk_receive_queue); audit_receive_skb(skb); kfree_skb(skb); } - mutex_unlock(&audit_netlink_mutex); + mutex_unlock(&audit_cmd_mutex); } +#ifdef CONFIG_AUDITSYSCALL +static const struct inotify_operations audit_inotify_ops = { + .handle_event = audit_handle_ievent, + .destroy_watch = audit_free_parent, +}; +#endif /* Initialize audit support at boot time. */ static int __init audit_init(void) { + int i; + printk(KERN_INFO "audit: initializing netlink socket (%s)\n", audit_default ? "enabled" : "disabled"); audit_sock = netlink_kernel_create(NETLINK_AUDIT, 0, audit_receive, @@ -661,6 +710,16 @@ static int __init audit_init(void) selinux_audit_set_callback(&selinux_audit_rule_update); audit_log(NULL, GFP_KERNEL, AUDIT_KERNEL, "initialized"); + +#ifdef CONFIG_AUDITSYSCALL + audit_ih = inotify_init(&audit_inotify_ops); + if (IS_ERR(audit_ih)) + audit_panic("cannot initialize inotify handle"); +#endif + + for (i = 0; i < AUDIT_INODE_BUCKETS; i++) + INIT_LIST_HEAD(&audit_inode_hash[i]); + return 0; } __initcall(audit_init); @@ -690,10 +749,12 @@ static void audit_buffer_free(struct audit_buffer *ab) kfree_skb(ab->skb); spin_lock_irqsave(&audit_freelist_lock, flags); - if (++audit_freelist_count > AUDIT_MAXFREE) + if (audit_freelist_count > AUDIT_MAXFREE) kfree(ab); - else + else { + audit_freelist_count++; list_add(&ab->list, &audit_freelist); + } spin_unlock_irqrestore(&audit_freelist_lock, flags); } @@ -755,7 +816,7 @@ err: */ unsigned int audit_serial(void) { - static spinlock_t serial_lock = SPIN_LOCK_UNLOCKED; + static DEFINE_SPINLOCK(serial_lock); static unsigned int serial = 0; unsigned long flags; @@ -967,6 +1028,9 @@ void audit_log_hex(struct audit_buffer *ab, const unsigned char *buf, struct sk_buff *skb; static const unsigned char *hex = "0123456789ABCDEF"; + if (!ab) + return; + BUG_ON(!ab->skb); skb = ab->skb; avail = skb_tailroom(skb); @@ -988,28 +1052,79 @@ void audit_log_hex(struct audit_buffer *ab, const unsigned char *buf, skb_put(skb, len << 1); /* new string is twice the old string */ } +/* + * Format a string of no more than slen characters into the audit buffer, + * enclosed in quote marks. + */ +static void audit_log_n_string(struct audit_buffer *ab, size_t slen, + const char *string) +{ + int avail, new_len; + unsigned char *ptr; + struct sk_buff *skb; + + if (!ab) + return; + + BUG_ON(!ab->skb); + skb = ab->skb; + avail = skb_tailroom(skb); + new_len = slen + 3; /* enclosing quotes + null terminator */ + if (new_len > avail) { + avail = audit_expand(ab, new_len); + if (!avail) + return; + } + ptr = skb->tail; + *ptr++ = '"'; + memcpy(ptr, string, slen); + ptr += slen; + *ptr++ = '"'; + *ptr = 0; + skb_put(skb, slen + 2); /* don't include null terminator */ +} + /** - * audit_log_unstrustedstring - log a string that may contain random characters + * audit_log_n_unstrustedstring - log a string that may contain random characters * @ab: audit_buffer + * @len: lenth of string (not including trailing null) * @string: string to be logged * * This code will escape a string that is passed to it if the string * contains a control character, unprintable character, double quote mark, * or a space. Unescaped strings will start and end with a double quote mark. * Strings that are escaped are printed in hex (2 digits per char). + * + * The caller specifies the number of characters in the string to log, which may + * or may not be the entire string. */ -void audit_log_untrustedstring(struct audit_buffer *ab, const char *string) +const char *audit_log_n_untrustedstring(struct audit_buffer *ab, size_t len, + const char *string) { const unsigned char *p = string; while (*p) { if (*p == '"' || *p < 0x21 || *p > 0x7f) { - audit_log_hex(ab, string, strlen(string)); - return; + audit_log_hex(ab, string, len); + return string + len + 1; } p++; } - audit_log_format(ab, "\"%s\"", string); + audit_log_n_string(ab, len, string); + return p + 1; +} + +/** + * audit_log_unstrustedstring - log a string that may contain random characters + * @ab: audit_buffer + * @string: string to be logged + * + * Same as audit_log_n_unstrustedstring(), except that strlen is used to + * determine string length. + */ +const char *audit_log_untrustedstring(struct audit_buffer *ab, const char *string) +{ + return audit_log_n_untrustedstring(ab, strlen(string), string); } /* This is a helper-function to print the escaped d_path */ diff --git a/kernel/audit.h b/kernel/audit.h index 6f733920f..a3370232a 100644 --- a/kernel/audit.h +++ b/kernel/audit.h @@ -19,9 +19,9 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include #include #include +#include /* 0 = no checking 1 = put_count checking @@ -53,6 +53,18 @@ enum audit_state { }; /* Rule lists */ +struct audit_parent; + +struct audit_watch { + atomic_t count; /* reference count */ + char *path; /* insertion path */ + dev_t dev; /* associated superblock device */ + unsigned long ino; /* associated inode number */ + struct audit_parent *parent; /* associated parent */ + struct list_head wlist; /* entry in parent->watches list */ + struct list_head rules; /* associated rules */ +}; + struct audit_field { u32 type; u32 val; @@ -69,7 +81,11 @@ struct audit_krule { u32 mask[AUDIT_BITMASK_SIZE]; u32 buflen; /* for data alloc on list rules */ u32 field_count; + char *filterkey; /* ties events to rules */ struct audit_field *fields; + struct audit_field *inode_f; /* quick access to an inode field */ + struct audit_watch *watch; /* associated watch */ + struct list_head rlist; /* entry in audit_watch.rules list */ }; struct audit_entry { @@ -78,15 +94,54 @@ struct audit_entry { struct audit_krule rule; }; - extern int audit_pid; -extern int audit_comparator(const u32 left, const u32 op, const u32 right); +#define AUDIT_INODE_BUCKETS 32 +extern struct list_head audit_inode_hash[AUDIT_INODE_BUCKETS]; + +static inline int audit_hash_ino(u32 ino) +{ + return (ino & (AUDIT_INODE_BUCKETS-1)); +} + +extern int audit_match_class(int class, unsigned syscall); +extern int audit_comparator(const u32 left, const u32 op, const u32 right); +extern int audit_compare_dname_path(const char *dname, const char *path, + int *dirlen); +extern struct sk_buff * audit_make_reply(int pid, int seq, int type, + int done, int multi, + void *payload, int size); extern void audit_send_reply(int pid, int seq, int type, int done, int multi, void *payload, int size); extern void audit_log_lost(const char *message); extern void audit_panic(const char *message); -extern struct mutex audit_netlink_mutex; +struct audit_netlink_list { + int pid; + struct sk_buff_head q; +}; + +int audit_send_list(void *); + +struct inotify_watch; +extern void audit_free_parent(struct inotify_watch *); +extern void audit_handle_ievent(struct inotify_watch *, u32, u32, u32, + const char *, struct inode *); extern int selinux_audit_rule_update(void); + +#ifdef CONFIG_AUDITSYSCALL +extern void __audit_signal_info(int sig, struct task_struct *t); +static inline void audit_signal_info(int sig, struct task_struct *t) +{ + if (unlikely(audit_pid && t->tgid == audit_pid)) + __audit_signal_info(sig, t); +} +extern enum audit_state audit_filter_inodes(struct task_struct *, + struct audit_context *); +extern void audit_set_auditable(struct audit_context *); +#else +#define audit_signal_info(s,t) +#define audit_filter_inodes(t,c) AUDIT_DISABLED +#define audit_set_auditable(c) +#endif diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c index 7c134906d..a44879b0c 100644 --- a/kernel/auditfilter.c +++ b/kernel/auditfilter.c @@ -22,13 +22,59 @@ #include #include #include +#include +#include +#include #include +#include +#include #include #include "audit.h" -/* There are three lists of rules -- one to search at task creation - * time, one to search at syscall entry time, and another to search at - * syscall exit time. */ +/* + * Locking model: + * + * audit_filter_mutex: + * Synchronizes writes and blocking reads of audit's filterlist + * data. Rcu is used to traverse the filterlist and access + * contents of structs audit_entry, audit_watch and opaque + * selinux rules during filtering. If modified, these structures + * must be copied and replace their counterparts in the filterlist. + * An audit_parent struct is not accessed during filtering, so may + * be written directly provided audit_filter_mutex is held. + */ + +/* + * Reference counting: + * + * audit_parent: lifetime is from audit_init_parent() to receipt of an IN_IGNORED + * event. Each audit_watch holds a reference to its associated parent. + * + * audit_watch: if added to lists, lifetime is from audit_init_watch() to + * audit_remove_watch(). Additionally, an audit_watch may exist + * temporarily to assist in searching existing filter data. Each + * audit_krule holds a reference to its associated watch. + */ + +struct audit_parent { + struct list_head ilist; /* entry in inotify registration list */ + struct list_head watches; /* associated watches */ + struct inotify_watch wdata; /* inotify watch data */ + unsigned flags; /* status flags */ +}; + +/* + * audit_parent status flags: + * + * AUDIT_PARENT_INVALID - set anytime rules/watches are auto-removed due to + * a filesystem event to ensure we're adding audit watches to a valid parent. + * Technically not needed for IN_DELETE_SELF or IN_UNMOUNT events, as we cannot + * receive them while we have nameidata, but must be used for IN_MOVE_SELF which + * we can receive while holding nameidata. + */ +#define AUDIT_PARENT_INVALID 0x001 + +/* Audit filter lists, defined in */ struct list_head audit_filter_list[AUDIT_NR_FILTERS] = { LIST_HEAD_INIT(audit_filter_list[0]), LIST_HEAD_INIT(audit_filter_list[1]), @@ -41,9 +87,53 @@ struct list_head audit_filter_list[AUDIT_NR_FILTERS] = { #endif }; +static DEFINE_MUTEX(audit_filter_mutex); + +/* Inotify handle */ +extern struct inotify_handle *audit_ih; + +/* Inotify events we care about. */ +#define AUDIT_IN_WATCH IN_MOVE|IN_CREATE|IN_DELETE|IN_DELETE_SELF|IN_MOVE_SELF + +void audit_free_parent(struct inotify_watch *i_watch) +{ + struct audit_parent *parent; + + parent = container_of(i_watch, struct audit_parent, wdata); + WARN_ON(!list_empty(&parent->watches)); + kfree(parent); +} + +static inline void audit_get_watch(struct audit_watch *watch) +{ + atomic_inc(&watch->count); +} + +static void audit_put_watch(struct audit_watch *watch) +{ + if (atomic_dec_and_test(&watch->count)) { + WARN_ON(watch->parent); + WARN_ON(!list_empty(&watch->rules)); + kfree(watch->path); + kfree(watch); + } +} + +static void audit_remove_watch(struct audit_watch *watch) +{ + list_del(&watch->wlist); + put_inotify_watch(&watch->parent->wdata); + watch->parent = NULL; + audit_put_watch(watch); /* match initial get */ +} + static inline void audit_free_rule(struct audit_entry *e) { int i; + + /* some rules don't have associated watches */ + if (e->rule.watch) + audit_put_watch(e->rule.watch); if (e->rule.fields) for (i = 0; i < e->rule.field_count; i++) { struct audit_field *f = &e->rule.fields[i]; @@ -51,6 +141,7 @@ static inline void audit_free_rule(struct audit_entry *e) selinux_audit_rule_free(f->se_rule); } kfree(e->rule.fields); + kfree(e->rule.filterkey); kfree(e); } @@ -60,6 +151,50 @@ static inline void audit_free_rule_rcu(struct rcu_head *head) audit_free_rule(e); } +/* Initialize a parent watch entry. */ +static struct audit_parent *audit_init_parent(struct nameidata *ndp) +{ + struct audit_parent *parent; + s32 wd; + + parent = kzalloc(sizeof(*parent), GFP_KERNEL); + if (unlikely(!parent)) + return ERR_PTR(-ENOMEM); + + INIT_LIST_HEAD(&parent->watches); + parent->flags = 0; + + inotify_init_watch(&parent->wdata); + /* grab a ref so inotify watch hangs around until we take audit_filter_mutex */ + get_inotify_watch(&parent->wdata); + wd = inotify_add_watch(audit_ih, &parent->wdata, ndp->dentry->d_inode, + AUDIT_IN_WATCH); + if (wd < 0) { + audit_free_parent(&parent->wdata); + return ERR_PTR(wd); + } + + return parent; +} + +/* Initialize a watch entry. */ +static struct audit_watch *audit_init_watch(char *path) +{ + struct audit_watch *watch; + + watch = kzalloc(sizeof(*watch), GFP_KERNEL); + if (unlikely(!watch)) + return ERR_PTR(-ENOMEM); + + INIT_LIST_HEAD(&watch->rules); + atomic_set(&watch->count, 1); + watch->path = path; + watch->dev = (dev_t)-1; + watch->ino = (unsigned long)-1; + + return watch; +} + /* Initialize an audit filterlist entry. */ static inline struct audit_entry *audit_init_entry(u32 field_count) { @@ -107,6 +242,75 @@ static char *audit_unpack_string(void **bufp, size_t *remain, size_t len) return str; } +/* Translate an inode field to kernel respresentation. */ +static inline int audit_to_inode(struct audit_krule *krule, + struct audit_field *f) +{ + if (krule->listnr != AUDIT_FILTER_EXIT || + krule->watch || krule->inode_f) + return -EINVAL; + + krule->inode_f = f; + return 0; +} + +/* Translate a watch string to kernel respresentation. */ +static int audit_to_watch(struct audit_krule *krule, char *path, int len, + u32 op) +{ + struct audit_watch *watch; + + if (!audit_ih) + return -EOPNOTSUPP; + + if (path[0] != '/' || path[len-1] == '/' || + krule->listnr != AUDIT_FILTER_EXIT || + op & ~AUDIT_EQUAL || + krule->inode_f || krule->watch) /* 1 inode # per rule, for hash */ + return -EINVAL; + + watch = audit_init_watch(path); + if (unlikely(IS_ERR(watch))) + return PTR_ERR(watch); + + audit_get_watch(watch); + krule->watch = watch; + + return 0; +} + +static __u32 *classes[AUDIT_SYSCALL_CLASSES]; + +int __init audit_register_class(int class, unsigned *list) +{ + __u32 *p = kzalloc(AUDIT_BITMASK_SIZE * sizeof(__u32), GFP_KERNEL); + if (!p) + return -ENOMEM; + while (*list != ~0U) { + unsigned n = *list++; + if (n >= AUDIT_BITMASK_SIZE * 32 - AUDIT_SYSCALL_CLASSES) { + kfree(p); + return -EINVAL; + } + p[AUDIT_WORD(n)] |= AUDIT_BIT(n); + } + if (class >= AUDIT_SYSCALL_CLASSES || classes[class]) { + kfree(p); + return -EINVAL; + } + classes[class] = p; + return 0; +} + +int audit_match_class(int class, unsigned syscall) +{ + if (unlikely(syscall >= AUDIT_BITMASK_SIZE * sizeof(__u32))) + return 0; + if (unlikely(class >= AUDIT_SYSCALL_CLASSES || !classes[class])) + return 0; + return classes[class][AUDIT_WORD(syscall)] & AUDIT_BIT(syscall); +} + /* Common user-space to kernel rule translation. */ static inline struct audit_entry *audit_to_entry_common(struct audit_rule *rule) { @@ -128,8 +332,11 @@ static inline struct audit_entry *audit_to_entry_common(struct audit_rule *rule) #endif ; } - if (rule->action != AUDIT_NEVER && rule->action != AUDIT_POSSIBLE && - rule->action != AUDIT_ALWAYS) + if (unlikely(rule->action == AUDIT_POSSIBLE)) { + printk(KERN_ERR "AUDIT_POSSIBLE is deprecated\n"); + goto exit_err; + } + if (rule->action != AUDIT_NEVER && rule->action != AUDIT_ALWAYS) goto exit_err; if (rule->field_count > AUDIT_MAX_FIELDS) goto exit_err; @@ -147,6 +354,22 @@ static inline struct audit_entry *audit_to_entry_common(struct audit_rule *rule) for (i = 0; i < AUDIT_BITMASK_SIZE; i++) entry->rule.mask[i] = rule->mask[i]; + for (i = 0; i < AUDIT_SYSCALL_CLASSES; i++) { + int bit = AUDIT_BITMASK_SIZE * 32 - i - 1; + __u32 *p = &entry->rule.mask[AUDIT_WORD(bit)]; + __u32 *class; + + if (!(*p & AUDIT_BIT(bit))) + continue; + *p &= ~AUDIT_BIT(bit); + class = classes[i]; + if (class) { + int j; + for (j = 0; j < AUDIT_BITMASK_SIZE; j++) + entry->rule.mask[j] |= class[j]; + } + } + return entry; exit_err: @@ -158,6 +381,7 @@ exit_err: static struct audit_entry *audit_rule_to_entry(struct audit_rule *rule) { struct audit_entry *entry; + struct audit_field *f; int err = 0; int i; @@ -172,14 +396,42 @@ static struct audit_entry *audit_rule_to_entry(struct audit_rule *rule) f->type = rule->fields[i] & ~(AUDIT_NEGATE|AUDIT_OPERATORS); f->val = rule->values[i]; - if (f->type & AUDIT_UNUSED_BITS || - f->type == AUDIT_SE_USER || - f->type == AUDIT_SE_ROLE || - f->type == AUDIT_SE_TYPE || - f->type == AUDIT_SE_SEN || - f->type == AUDIT_SE_CLR) { - err = -EINVAL; + err = -EINVAL; + switch(f->type) { + default: goto exit_free; + case AUDIT_PID: + case AUDIT_UID: + case AUDIT_EUID: + case AUDIT_SUID: + case AUDIT_FSUID: + case AUDIT_GID: + case AUDIT_EGID: + case AUDIT_SGID: + case AUDIT_FSGID: + case AUDIT_LOGINUID: + case AUDIT_PERS: + case AUDIT_ARCH: + case AUDIT_MSGTYPE: + case AUDIT_PPID: + case AUDIT_DEVMAJOR: + case AUDIT_DEVMINOR: + case AUDIT_EXIT: + case AUDIT_SUCCESS: + case AUDIT_ARG0: + case AUDIT_ARG1: + case AUDIT_ARG2: + case AUDIT_ARG3: + break; + case AUDIT_PERM: + if (f->val & ~15) + goto exit_free; + break; + case AUDIT_INODE: + err = audit_to_inode(&entry->rule, f); + if (err) + goto exit_free; + break; } entry->rule.vers_ops = (f->op & AUDIT_OPERATORS) ? 2 : 1; @@ -196,6 +448,19 @@ static struct audit_entry *audit_rule_to_entry(struct audit_rule *rule) } } + f = entry->rule.inode_f; + if (f) { + switch(f->op) { + case AUDIT_NOT_EQUAL: + entry->rule.inode_f = NULL; + case AUDIT_EQUAL: + break; + default: + err = -EINVAL; + goto exit_free; + } + } + exit_nofree: return entry; @@ -210,6 +475,7 @@ static struct audit_entry *audit_data_to_entry(struct audit_rule_data *data, { int err = 0; struct audit_entry *entry; + struct audit_field *f; void *bufp; size_t remain = datasz - sizeof(struct audit_rule_data); int i; @@ -235,11 +501,39 @@ static struct audit_entry *audit_data_to_entry(struct audit_rule_data *data, f->se_str = NULL; f->se_rule = NULL; switch(f->type) { - case AUDIT_SE_USER: - case AUDIT_SE_ROLE: - case AUDIT_SE_TYPE: - case AUDIT_SE_SEN: - case AUDIT_SE_CLR: + case AUDIT_PID: + case AUDIT_UID: + case AUDIT_EUID: + case AUDIT_SUID: + case AUDIT_FSUID: + case AUDIT_GID: + case AUDIT_EGID: + case AUDIT_SGID: + case AUDIT_FSGID: + case AUDIT_LOGINUID: + case AUDIT_PERS: + case AUDIT_ARCH: + case AUDIT_MSGTYPE: + case AUDIT_PPID: + case AUDIT_DEVMAJOR: + case AUDIT_DEVMINOR: + case AUDIT_EXIT: + case AUDIT_SUCCESS: + case AUDIT_ARG0: + case AUDIT_ARG1: + case AUDIT_ARG2: + case AUDIT_ARG3: + break; + case AUDIT_SUBJ_USER: + case AUDIT_SUBJ_ROLE: + case AUDIT_SUBJ_TYPE: + case AUDIT_SUBJ_SEN: + case AUDIT_SUBJ_CLR: + case AUDIT_OBJ_USER: + case AUDIT_OBJ_ROLE: + case AUDIT_OBJ_TYPE: + case AUDIT_OBJ_LEV_LOW: + case AUDIT_OBJ_LEV_HIGH: str = audit_unpack_string(&bufp, &remain, f->val); if (IS_ERR(str)) goto exit_free; @@ -260,6 +554,52 @@ static struct audit_entry *audit_data_to_entry(struct audit_rule_data *data, } else f->se_str = str; break; + case AUDIT_WATCH: + str = audit_unpack_string(&bufp, &remain, f->val); + if (IS_ERR(str)) + goto exit_free; + entry->rule.buflen += f->val; + + err = audit_to_watch(&entry->rule, str, f->val, f->op); + if (err) { + kfree(str); + goto exit_free; + } + break; + case AUDIT_INODE: + err = audit_to_inode(&entry->rule, f); + if (err) + goto exit_free; + break; + case AUDIT_FILTERKEY: + err = -EINVAL; + if (entry->rule.filterkey || f->val > AUDIT_MAX_KEY_LEN) + goto exit_free; + str = audit_unpack_string(&bufp, &remain, f->val); + if (IS_ERR(str)) + goto exit_free; + entry->rule.buflen += f->val; + entry->rule.filterkey = str; + break; + case AUDIT_PERM: + if (f->val & ~15) + goto exit_free; + break; + default: + goto exit_free; + } + } + + f = entry->rule.inode_f; + if (f) { + switch(f->op) { + case AUDIT_NOT_EQUAL: + entry->rule.inode_f = NULL; + case AUDIT_EQUAL: + break; + default: + err = -EINVAL; + goto exit_free; } } @@ -291,7 +631,7 @@ static struct audit_rule *audit_krule_to_rule(struct audit_krule *krule) rule = kmalloc(sizeof(*rule), GFP_KERNEL); if (unlikely(!rule)) - return ERR_PTR(-ENOMEM); + return NULL; memset(rule, 0, sizeof(*rule)); rule->flags = krule->flags | krule->listnr; @@ -322,7 +662,7 @@ static struct audit_rule_data *audit_krule_to_data(struct audit_krule *krule) data = kmalloc(sizeof(*data) + krule->buflen, GFP_KERNEL); if (unlikely(!data)) - return ERR_PTR(-ENOMEM); + return NULL; memset(data, 0, sizeof(*data)); data->flags = krule->flags | krule->listnr; @@ -335,14 +675,27 @@ static struct audit_rule_data *audit_krule_to_data(struct audit_krule *krule) data->fields[i] = f->type; data->fieldflags[i] = f->op; switch(f->type) { - case AUDIT_SE_USER: - case AUDIT_SE_ROLE: - case AUDIT_SE_TYPE: - case AUDIT_SE_SEN: - case AUDIT_SE_CLR: + case AUDIT_SUBJ_USER: + case AUDIT_SUBJ_ROLE: + case AUDIT_SUBJ_TYPE: + case AUDIT_SUBJ_SEN: + case AUDIT_SUBJ_CLR: + case AUDIT_OBJ_USER: + case AUDIT_OBJ_ROLE: + case AUDIT_OBJ_TYPE: + case AUDIT_OBJ_LEV_LOW: + case AUDIT_OBJ_LEV_HIGH: data->buflen += data->values[i] = audit_pack_string(&bufp, f->se_str); break; + case AUDIT_WATCH: + data->buflen += data->values[i] = + audit_pack_string(&bufp, krule->watch->path); + break; + case AUDIT_FILTERKEY: + data->buflen += data->values[i] = + audit_pack_string(&bufp, krule->filterkey); + break; default: data->values[i] = f->val; } @@ -370,14 +723,28 @@ static int audit_compare_rule(struct audit_krule *a, struct audit_krule *b) return 1; switch(a->fields[i].type) { - case AUDIT_SE_USER: - case AUDIT_SE_ROLE: - case AUDIT_SE_TYPE: - case AUDIT_SE_SEN: - case AUDIT_SE_CLR: + case AUDIT_SUBJ_USER: + case AUDIT_SUBJ_ROLE: + case AUDIT_SUBJ_TYPE: + case AUDIT_SUBJ_SEN: + case AUDIT_SUBJ_CLR: + case AUDIT_OBJ_USER: + case AUDIT_OBJ_ROLE: + case AUDIT_OBJ_TYPE: + case AUDIT_OBJ_LEV_LOW: + case AUDIT_OBJ_LEV_HIGH: if (strcmp(a->fields[i].se_str, b->fields[i].se_str)) return 1; break; + case AUDIT_WATCH: + if (strcmp(a->watch->path, b->watch->path)) + return 1; + break; + case AUDIT_FILTERKEY: + /* both filterkeys exist based on above type compare */ + if (strcmp(a->filterkey, b->filterkey)) + return 1; + break; default: if (a->fields[i].val != b->fields[i].val) return 1; @@ -391,6 +758,32 @@ static int audit_compare_rule(struct audit_krule *a, struct audit_krule *b) return 0; } +/* Duplicate the given audit watch. The new watch's rules list is initialized + * to an empty list and wlist is undefined. */ +static struct audit_watch *audit_dupe_watch(struct audit_watch *old) +{ + char *path; + struct audit_watch *new; + + path = kstrdup(old->path, GFP_KERNEL); + if (unlikely(!path)) + return ERR_PTR(-ENOMEM); + + new = audit_init_watch(path); + if (unlikely(IS_ERR(new))) { + kfree(path); + goto out; + } + + new->dev = old->dev; + new->ino = old->ino; + get_inotify_watch(&old->parent->wdata); + new->parent = old->parent; + +out: + return new; +} + /* Duplicate selinux field information. The se_rule is opaque, so must be * re-initialized. */ static inline int audit_dupe_selinux_field(struct audit_field *df, @@ -422,12 +815,16 @@ static inline int audit_dupe_selinux_field(struct audit_field *df, /* Duplicate an audit rule. This will be a deep copy with the exception * of the watch - that pointer is carried over. The selinux specific fields * will be updated in the copy. The point is to be able to replace the old - * rule with the new rule in the filterlist, then free the old rule. */ -static struct audit_entry *audit_dupe_rule(struct audit_krule *old) + * rule with the new rule in the filterlist, then free the old rule. + * The rlist element is undefined; list manipulations are handled apart from + * the initial copy. */ +static struct audit_entry *audit_dupe_rule(struct audit_krule *old, + struct audit_watch *watch) { u32 fcount = old->field_count; struct audit_entry *entry; struct audit_krule *new; + char *fk; int i, err = 0; entry = audit_init_entry(fcount); @@ -442,6 +839,8 @@ static struct audit_entry *audit_dupe_rule(struct audit_krule *old) for (i = 0; i < AUDIT_BITMASK_SIZE; i++) new->mask[i] = old->mask[i]; new->buflen = old->buflen; + new->inode_f = old->inode_f; + new->watch = NULL; new->field_count = old->field_count; memcpy(new->fields, old->fields, sizeof(struct audit_field) * fcount); @@ -449,13 +848,25 @@ static struct audit_entry *audit_dupe_rule(struct audit_krule *old) * the originals will all be freed when the old rule is freed. */ for (i = 0; i < fcount; i++) { switch (new->fields[i].type) { - case AUDIT_SE_USER: - case AUDIT_SE_ROLE: - case AUDIT_SE_TYPE: - case AUDIT_SE_SEN: - case AUDIT_SE_CLR: + case AUDIT_SUBJ_USER: + case AUDIT_SUBJ_ROLE: + case AUDIT_SUBJ_TYPE: + case AUDIT_SUBJ_SEN: + case AUDIT_SUBJ_CLR: + case AUDIT_OBJ_USER: + case AUDIT_OBJ_ROLE: + case AUDIT_OBJ_TYPE: + case AUDIT_OBJ_LEV_LOW: + case AUDIT_OBJ_LEV_HIGH: err = audit_dupe_selinux_field(&new->fields[i], &old->fields[i]); + break; + case AUDIT_FILTERKEY: + fk = kstrdup(old->filterkey, GFP_KERNEL); + if (unlikely(!fk)) + err = -ENOMEM; + else + new->filterkey = fk; } if (err) { audit_free_rule(entry); @@ -463,68 +874,442 @@ static struct audit_entry *audit_dupe_rule(struct audit_krule *old) } } + if (watch) { + audit_get_watch(watch); + new->watch = watch; + } + return entry; } -/* Add rule to given filterlist if not a duplicate. Protected by - * audit_netlink_mutex. */ +/* Update inode info in audit rules based on filesystem event. */ +static void audit_update_watch(struct audit_parent *parent, + const char *dname, dev_t dev, + unsigned long ino, unsigned invalidating) +{ + struct audit_watch *owatch, *nwatch, *nextw; + struct audit_krule *r, *nextr; + struct audit_entry *oentry, *nentry; + struct audit_buffer *ab; + + mutex_lock(&audit_filter_mutex); + list_for_each_entry_safe(owatch, nextw, &parent->watches, wlist) { + if (audit_compare_dname_path(dname, owatch->path, NULL)) + continue; + + /* If the update involves invalidating rules, do the inode-based + * filtering now, so we don't omit records. */ + if (invalidating && + audit_filter_inodes(current, current->audit_context) == AUDIT_RECORD_CONTEXT) + audit_set_auditable(current->audit_context); + + nwatch = audit_dupe_watch(owatch); + if (unlikely(IS_ERR(nwatch))) { + mutex_unlock(&audit_filter_mutex); + audit_panic("error updating watch, skipping"); + return; + } + nwatch->dev = dev; + nwatch->ino = ino; + + list_for_each_entry_safe(r, nextr, &owatch->rules, rlist) { + + oentry = container_of(r, struct audit_entry, rule); + list_del(&oentry->rule.rlist); + list_del_rcu(&oentry->list); + + nentry = audit_dupe_rule(&oentry->rule, nwatch); + if (unlikely(IS_ERR(nentry))) + audit_panic("error updating watch, removing"); + else { + int h = audit_hash_ino((u32)ino); + list_add(&nentry->rule.rlist, &nwatch->rules); + list_add_rcu(&nentry->list, &audit_inode_hash[h]); + } + + call_rcu(&oentry->rcu, audit_free_rule_rcu); + } + + ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_CONFIG_CHANGE); + audit_log_format(ab, "audit updated rules specifying path="); + audit_log_untrustedstring(ab, owatch->path); + audit_log_format(ab, " with dev=%u ino=%lu\n", dev, ino); + audit_log_end(ab); + + audit_remove_watch(owatch); + goto add_watch_to_parent; /* event applies to a single watch */ + } + mutex_unlock(&audit_filter_mutex); + return; + +add_watch_to_parent: + list_add(&nwatch->wlist, &parent->watches); + mutex_unlock(&audit_filter_mutex); + return; +} + +/* Remove all watches & rules associated with a parent that is going away. */ +static void audit_remove_parent_watches(struct audit_parent *parent) +{ + struct audit_watch *w, *nextw; + struct audit_krule *r, *nextr; + struct audit_entry *e; + struct audit_buffer *ab; + + mutex_lock(&audit_filter_mutex); + parent->flags |= AUDIT_PARENT_INVALID; + list_for_each_entry_safe(w, nextw, &parent->watches, wlist) { + list_for_each_entry_safe(r, nextr, &w->rules, rlist) { + e = container_of(r, struct audit_entry, rule); + + ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_CONFIG_CHANGE); + audit_log_format(ab, "audit implicitly removed rule path="); + audit_log_untrustedstring(ab, w->path); + if (r->filterkey) { + audit_log_format(ab, " key="); + audit_log_untrustedstring(ab, r->filterkey); + } else + audit_log_format(ab, " key=(null)"); + audit_log_format(ab, " list=%d", r->listnr); + audit_log_end(ab); + + list_del(&r->rlist); + list_del_rcu(&e->list); + call_rcu(&e->rcu, audit_free_rule_rcu); + } + audit_remove_watch(w); + } + mutex_unlock(&audit_filter_mutex); +} + +/* Unregister inotify watches for parents on in_list. + * Generates an IN_IGNORED event. */ +static void audit_inotify_unregister(struct list_head *in_list) +{ + struct audit_parent *p, *n; + + list_for_each_entry_safe(p, n, in_list, ilist) { + list_del(&p->ilist); + inotify_rm_watch(audit_ih, &p->wdata); + /* the put matching the get in audit_do_del_rule() */ + put_inotify_watch(&p->wdata); + } +} + +/* Find an existing audit rule. + * Caller must hold audit_filter_mutex to prevent stale rule data. */ +static struct audit_entry *audit_find_rule(struct audit_entry *entry, + struct list_head *list) +{ + struct audit_entry *e, *found = NULL; + int h; + + if (entry->rule.watch) { + /* we don't know the inode number, so must walk entire hash */ + for (h = 0; h < AUDIT_INODE_BUCKETS; h++) { + list = &audit_inode_hash[h]; + list_for_each_entry(e, list, list) + if (!audit_compare_rule(&entry->rule, &e->rule)) { + found = e; + goto out; + } + } + goto out; + } + + list_for_each_entry(e, list, list) + if (!audit_compare_rule(&entry->rule, &e->rule)) { + found = e; + goto out; + } + +out: + return found; +} + +/* Get path information necessary for adding watches. */ +static int audit_get_nd(char *path, struct nameidata **ndp, + struct nameidata **ndw) +{ + struct nameidata *ndparent, *ndwatch; + int err; + + ndparent = kmalloc(sizeof(*ndparent), GFP_KERNEL); + if (unlikely(!ndparent)) + return -ENOMEM; + + ndwatch = kmalloc(sizeof(*ndwatch), GFP_KERNEL); + if (unlikely(!ndwatch)) { + kfree(ndparent); + return -ENOMEM; + } + + err = path_lookup(path, LOOKUP_PARENT, ndparent); + if (err) { + kfree(ndparent); + kfree(ndwatch); + return err; + } + + err = path_lookup(path, 0, ndwatch); + if (err) { + kfree(ndwatch); + ndwatch = NULL; + } + + *ndp = ndparent; + *ndw = ndwatch; + + return 0; +} + +/* Release resources used for watch path information. */ +static void audit_put_nd(struct nameidata *ndp, struct nameidata *ndw) +{ + if (ndp) { + path_release(ndp); + kfree(ndp); + } + if (ndw) { + path_release(ndw); + kfree(ndw); + } +} + +/* Associate the given rule with an existing parent inotify_watch. + * Caller must hold audit_filter_mutex. */ +static void audit_add_to_parent(struct audit_krule *krule, + struct audit_parent *parent) +{ + struct audit_watch *w, *watch = krule->watch; + int watch_found = 0; + + list_for_each_entry(w, &parent->watches, wlist) { + if (strcmp(watch->path, w->path)) + continue; + + watch_found = 1; + + /* put krule's and initial refs to temporary watch */ + audit_put_watch(watch); + audit_put_watch(watch); + + audit_get_watch(w); + krule->watch = watch = w; + break; + } + + if (!watch_found) { + get_inotify_watch(&parent->wdata); + watch->parent = parent; + + list_add(&watch->wlist, &parent->watches); + } + list_add(&krule->rlist, &watch->rules); +} + +/* Find a matching watch entry, or add this one. + * Caller must hold audit_filter_mutex. */ +static int audit_add_watch(struct audit_krule *krule, struct nameidata *ndp, + struct nameidata *ndw) +{ + struct audit_watch *watch = krule->watch; + struct inotify_watch *i_watch; + struct audit_parent *parent; + int ret = 0; + + /* update watch filter fields */ + if (ndw) { + watch->dev = ndw->dentry->d_inode->i_sb->s_dev; + watch->ino = ndw->dentry->d_inode->i_ino; + } + + /* The audit_filter_mutex must not be held during inotify calls because + * we hold it during inotify event callback processing. If an existing + * inotify watch is found, inotify_find_watch() grabs a reference before + * returning. + */ + mutex_unlock(&audit_filter_mutex); + + if (inotify_find_watch(audit_ih, ndp->dentry->d_inode, &i_watch) < 0) { + parent = audit_init_parent(ndp); + if (IS_ERR(parent)) { + /* caller expects mutex locked */ + mutex_lock(&audit_filter_mutex); + return PTR_ERR(parent); + } + } else + parent = container_of(i_watch, struct audit_parent, wdata); + + mutex_lock(&audit_filter_mutex); + + /* parent was moved before we took audit_filter_mutex */ + if (parent->flags & AUDIT_PARENT_INVALID) + ret = -ENOENT; + else + audit_add_to_parent(krule, parent); + + /* match get in audit_init_parent or inotify_find_watch */ + put_inotify_watch(&parent->wdata); + return ret; +} + +/* Add rule to given filterlist if not a duplicate. */ static inline int audit_add_rule(struct audit_entry *entry, - struct list_head *list) + struct list_head *list) { struct audit_entry *e; + struct audit_field *inode_f = entry->rule.inode_f; + struct audit_watch *watch = entry->rule.watch; + struct nameidata *ndp, *ndw; + int h, err, putnd_needed = 0; +#ifdef CONFIG_AUDITSYSCALL + int dont_count = 0; + + /* If either of these, don't count towards total */ + if (entry->rule.listnr == AUDIT_FILTER_USER || + entry->rule.listnr == AUDIT_FILTER_TYPE) + dont_count = 1; +#endif + + if (inode_f) { + h = audit_hash_ino(inode_f->val); + list = &audit_inode_hash[h]; + } + + mutex_lock(&audit_filter_mutex); + e = audit_find_rule(entry, list); + mutex_unlock(&audit_filter_mutex); + if (e) { + err = -EEXIST; + goto error; + } - /* Do not use the _rcu iterator here, since this is the only - * addition routine. */ - list_for_each_entry(e, list, list) { - if (!audit_compare_rule(&entry->rule, &e->rule)) - return -EEXIST; + /* Avoid calling path_lookup under audit_filter_mutex. */ + if (watch) { + err = audit_get_nd(watch->path, &ndp, &ndw); + if (err) + goto error; + putnd_needed = 1; + } + + mutex_lock(&audit_filter_mutex); + if (watch) { + /* audit_filter_mutex is dropped and re-taken during this call */ + err = audit_add_watch(&entry->rule, ndp, ndw); + if (err) { + mutex_unlock(&audit_filter_mutex); + goto error; + } + h = audit_hash_ino((u32)watch->ino); + list = &audit_inode_hash[h]; } if (entry->rule.flags & AUDIT_FILTER_PREPEND) { list_add_rcu(&entry->list, list); + entry->rule.flags &= ~AUDIT_FILTER_PREPEND; } else { list_add_tail_rcu(&entry->list, list); } +#ifdef CONFIG_AUDITSYSCALL + if (!dont_count) + audit_n_rules++; +#endif + mutex_unlock(&audit_filter_mutex); - return 0; + if (putnd_needed) + audit_put_nd(ndp, ndw); + + return 0; + +error: + if (putnd_needed) + audit_put_nd(ndp, ndw); + if (watch) + audit_put_watch(watch); /* tmp watch, matches initial get */ + return err; } -/* Remove an existing rule from filterlist. Protected by - * audit_netlink_mutex. */ +/* Remove an existing rule from filterlist. */ static inline int audit_del_rule(struct audit_entry *entry, struct list_head *list) { struct audit_entry *e; + struct audit_field *inode_f = entry->rule.inode_f; + struct audit_watch *watch, *tmp_watch = entry->rule.watch; + LIST_HEAD(inotify_list); + int h, ret = 0; +#ifdef CONFIG_AUDITSYSCALL + int dont_count = 0; - /* Do not use the _rcu iterator here, since this is the only - * deletion routine. */ - list_for_each_entry(e, list, list) { - if (!audit_compare_rule(&entry->rule, &e->rule)) { - list_del_rcu(&e->list); - call_rcu(&e->rcu, audit_free_rule_rcu); - return 0; + /* If either of these, don't count towards total */ + if (entry->rule.listnr == AUDIT_FILTER_USER || + entry->rule.listnr == AUDIT_FILTER_TYPE) + dont_count = 1; +#endif + + if (inode_f) { + h = audit_hash_ino(inode_f->val); + list = &audit_inode_hash[h]; + } + + mutex_lock(&audit_filter_mutex); + e = audit_find_rule(entry, list); + if (!e) { + mutex_unlock(&audit_filter_mutex); + ret = -ENOENT; + goto out; + } + + watch = e->rule.watch; + if (watch) { + struct audit_parent *parent = watch->parent; + + list_del(&e->rule.rlist); + + if (list_empty(&watch->rules)) { + audit_remove_watch(watch); + + if (list_empty(&parent->watches)) { + /* Put parent on the inotify un-registration + * list. Grab a reference before releasing + * audit_filter_mutex, to be released in + * audit_inotify_unregister(). */ + list_add(&parent->ilist, &inotify_list); + get_inotify_watch(&parent->wdata); + } } } - return -ENOENT; /* No matching rule */ + + list_del_rcu(&e->list); + call_rcu(&e->rcu, audit_free_rule_rcu); + +#ifdef CONFIG_AUDITSYSCALL + if (!dont_count) + audit_n_rules--; +#endif + mutex_unlock(&audit_filter_mutex); + + if (!list_empty(&inotify_list)) + audit_inotify_unregister(&inotify_list); + +out: + if (tmp_watch) + audit_put_watch(tmp_watch); /* match initial get */ + + return ret; } /* List rules using struct audit_rule. Exists for backward * compatibility with userspace. */ -static int audit_list(void *_dest) +static void audit_list(int pid, int seq, struct sk_buff_head *q) { - int pid, seq; - int *dest = _dest; + struct sk_buff *skb; struct audit_entry *entry; int i; - pid = dest[0]; - seq = dest[1]; - kfree(dest); - - mutex_lock(&audit_netlink_mutex); - - /* The *_rcu iterators not needed here because we are - always called with audit_netlink_mutex held. */ + /* This is a blocking read, so use audit_filter_mutex instead of rcu + * iterator to sync with list writers. */ for (i=0; irule); if (unlikely(!rule)) break; - audit_send_reply(pid, seq, AUDIT_LIST, 0, 1, + skb = audit_make_reply(pid, seq, AUDIT_LIST, 0, 1, rule, sizeof(*rule)); + if (skb) + skb_queue_tail(q, skb); kfree(rule); } } - audit_send_reply(pid, seq, AUDIT_LIST, 1, 1, NULL, 0); - - mutex_unlock(&audit_netlink_mutex); - return 0; + for (i = 0; i < AUDIT_INODE_BUCKETS; i++) { + list_for_each_entry(entry, &audit_inode_hash[i], list) { + struct audit_rule *rule; + + rule = audit_krule_to_rule(&entry->rule); + if (unlikely(!rule)) + break; + skb = audit_make_reply(pid, seq, AUDIT_LIST, 0, 1, + rule, sizeof(*rule)); + if (skb) + skb_queue_tail(q, skb); + kfree(rule); + } + } + skb = audit_make_reply(pid, seq, AUDIT_LIST, 1, 1, NULL, 0); + if (skb) + skb_queue_tail(q, skb); } /* List rules using struct audit_rule_data. */ -static int audit_list_rules(void *_dest) +static void audit_list_rules(int pid, int seq, struct sk_buff_head *q) { - int pid, seq; - int *dest = _dest; + struct sk_buff *skb; struct audit_entry *e; int i; - pid = dest[0]; - seq = dest[1]; - kfree(dest); - - mutex_lock(&audit_netlink_mutex); - - /* The *_rcu iterators not needed here because we are - always called with audit_netlink_mutex held. */ + /* This is a blocking read, so use audit_filter_mutex instead of rcu + * iterator to sync with list writers. */ for (i=0; irule); if (unlikely(!data)) break; - audit_send_reply(pid, seq, AUDIT_LIST_RULES, 0, 1, - data, sizeof(*data)); + skb = audit_make_reply(pid, seq, AUDIT_LIST_RULES, 0, 1, + data, sizeof(*data) + data->buflen); + if (skb) + skb_queue_tail(q, skb); kfree(data); } } - audit_send_reply(pid, seq, AUDIT_LIST_RULES, 1, 1, NULL, 0); + for (i=0; i< AUDIT_INODE_BUCKETS; i++) { + list_for_each_entry(e, &audit_inode_hash[i], list) { + struct audit_rule_data *data; - mutex_unlock(&audit_netlink_mutex); - return 0; + data = audit_krule_to_data(&e->rule); + if (unlikely(!data)) + break; + skb = audit_make_reply(pid, seq, AUDIT_LIST_RULES, 0, 1, + data, sizeof(*data) + data->buflen); + if (skb) + skb_queue_tail(q, skb); + kfree(data); + } + } + skb = audit_make_reply(pid, seq, AUDIT_LIST_RULES, 1, 1, NULL, 0); + if (skb) + skb_queue_tail(q, skb); +} + +/* Log rule additions and removals */ +static void audit_log_rule_change(uid_t loginuid, u32 sid, char *action, + struct audit_krule *rule, int res) +{ + struct audit_buffer *ab; + + ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_CONFIG_CHANGE); + if (!ab) + return; + audit_log_format(ab, "auid=%u", loginuid); + if (sid) { + char *ctx = NULL; + u32 len; + if (selinux_ctxid_to_string(sid, &ctx, &len)) + audit_log_format(ab, " ssid=%u", sid); + else + audit_log_format(ab, " subj=%s", ctx); + kfree(ctx); + } + audit_log_format(ab, " %s rule key=", action); + if (rule->filterkey) + audit_log_untrustedstring(ab, rule->filterkey); + else + audit_log_format(ab, "(null)"); + audit_log_format(ab, " list=%d res=%d", rule->listnr, res); + audit_log_end(ab); } /** @@ -592,7 +1428,7 @@ int audit_receive_filter(int type, int pid, int uid, int seq, void *data, size_t datasz, uid_t loginuid, u32 sid) { struct task_struct *tsk; - int *dest; + struct audit_netlink_list *dest; int err = 0; struct audit_entry *entry; @@ -605,18 +1441,22 @@ int audit_receive_filter(int type, int pid, int uid, int seq, void *data, * happen if we're actually running in the context of auditctl * trying to _send_ the stuff */ - dest = kmalloc(2 * sizeof(int), GFP_KERNEL); + dest = kmalloc(sizeof(struct audit_netlink_list), GFP_KERNEL); if (!dest) return -ENOMEM; - dest[0] = pid; - dest[1] = seq; + dest->pid = pid; + skb_queue_head_init(&dest->q); + mutex_lock(&audit_filter_mutex); if (type == AUDIT_LIST) - tsk = kthread_run(audit_list, dest, "audit_list"); + audit_list(pid, seq, &dest->q); else - tsk = kthread_run(audit_list_rules, dest, - "audit_list_rules"); + audit_list_rules(pid, seq, &dest->q); + mutex_unlock(&audit_filter_mutex); + + tsk = kthread_run(audit_send_list, dest, "audit_send_list"); if (IS_ERR(tsk)) { + skb_queue_purge(&dest->q); kfree(dest); err = PTR_ERR(tsk); } @@ -632,23 +1472,7 @@ int audit_receive_filter(int type, int pid, int uid, int seq, void *data, err = audit_add_rule(entry, &audit_filter_list[entry->rule.listnr]); - if (sid) { - char *ctx = NULL; - u32 len; - if (selinux_ctxid_to_string(sid, &ctx, &len)) { - /* Maybe call audit_panic? */ - audit_log(NULL, GFP_KERNEL, AUDIT_CONFIG_CHANGE, - "auid=%u ssid=%u add rule to list=%d res=%d", - loginuid, sid, entry->rule.listnr, !err); - } else - audit_log(NULL, GFP_KERNEL, AUDIT_CONFIG_CHANGE, - "auid=%u subj=%s add rule to list=%d res=%d", - loginuid, ctx, entry->rule.listnr, !err); - kfree(ctx); - } else - audit_log(NULL, GFP_KERNEL, AUDIT_CONFIG_CHANGE, - "auid=%u add rule to list=%d res=%d", - loginuid, entry->rule.listnr, !err); + audit_log_rule_change(loginuid, sid, "add", &entry->rule, !err); if (err) audit_free_rule(entry); @@ -664,24 +1488,8 @@ int audit_receive_filter(int type, int pid, int uid, int seq, void *data, err = audit_del_rule(entry, &audit_filter_list[entry->rule.listnr]); - - if (sid) { - char *ctx = NULL; - u32 len; - if (selinux_ctxid_to_string(sid, &ctx, &len)) { - /* Maybe call audit_panic? */ - audit_log(NULL, GFP_KERNEL, AUDIT_CONFIG_CHANGE, - "auid=%u ssid=%u remove rule from list=%d res=%d", - loginuid, sid, entry->rule.listnr, !err); - } else - audit_log(NULL, GFP_KERNEL, AUDIT_CONFIG_CHANGE, - "auid=%u subj=%s remove rule from list=%d res=%d", - loginuid, ctx, entry->rule.listnr, !err); - kfree(ctx); - } else - audit_log(NULL, GFP_KERNEL, AUDIT_CONFIG_CHANGE, - "auid=%u remove rule from list=%d res=%d", - loginuid, entry->rule.listnr, !err); + audit_log_rule_change(loginuid, sid, "remove", &entry->rule, + !err); audit_free_rule(entry); break; @@ -712,7 +1520,43 @@ int audit_comparator(const u32 left, const u32 op, const u32 right) return 0; } +/* Compare given dentry name with last component in given path, + * return of 0 indicates a match. */ +int audit_compare_dname_path(const char *dname, const char *path, + int *dirlen) +{ + int dlen, plen; + const char *p; + + if (!dname || !path) + return 1; + + dlen = strlen(dname); + plen = strlen(path); + if (plen < dlen) + return 1; + + /* disregard trailing slashes */ + p = path + plen - 1; + while ((*p == '/') && (p > path)) + p--; + + /* find last path component */ + p = p - dlen + 1; + if (p < path) + return 1; + else if (p > path) { + if (*--p != '/') + return 1; + else + p++; + } + /* return length of path's directory component */ + if (dirlen) + *dirlen = p - path; + return strncmp(p, dname, dlen); +} static int audit_filter_user_rules(struct netlink_skb_parms *cb, struct audit_krule *rule, @@ -744,7 +1588,6 @@ static int audit_filter_user_rules(struct netlink_skb_parms *cb, } switch (rule->action) { case AUDIT_NEVER: *state = AUDIT_DISABLED; break; - case AUDIT_POSSIBLE: *state = AUDIT_BUILD_CONTEXT; break; case AUDIT_ALWAYS: *state = AUDIT_RECORD_CONTEXT; break; } return 1; @@ -806,11 +1649,16 @@ static inline int audit_rule_has_selinux(struct audit_krule *rule) for (i = 0; i < rule->field_count; i++) { struct audit_field *f = &rule->fields[i]; switch (f->type) { - case AUDIT_SE_USER: - case AUDIT_SE_ROLE: - case AUDIT_SE_TYPE: - case AUDIT_SE_SEN: - case AUDIT_SE_CLR: + case AUDIT_SUBJ_USER: + case AUDIT_SUBJ_ROLE: + case AUDIT_SUBJ_TYPE: + case AUDIT_SUBJ_SEN: + case AUDIT_SUBJ_CLR: + case AUDIT_OBJ_USER: + case AUDIT_OBJ_ROLE: + case AUDIT_OBJ_TYPE: + case AUDIT_OBJ_LEV_LOW: + case AUDIT_OBJ_LEV_HIGH: return 1; } } @@ -826,32 +1674,65 @@ static inline int audit_rule_has_selinux(struct audit_krule *rule) int selinux_audit_rule_update(void) { struct audit_entry *entry, *n, *nentry; + struct audit_watch *watch; int i, err = 0; - /* audit_netlink_mutex synchronizes the writers */ - mutex_lock(&audit_netlink_mutex); + /* audit_filter_mutex synchronizes the writers */ + mutex_lock(&audit_filter_mutex); for (i = 0; i < AUDIT_NR_FILTERS; i++) { list_for_each_entry_safe(entry, n, &audit_filter_list[i], list) { if (!audit_rule_has_selinux(&entry->rule)) continue; - nentry = audit_dupe_rule(&entry->rule); + watch = entry->rule.watch; + nentry = audit_dupe_rule(&entry->rule, watch); if (unlikely(IS_ERR(nentry))) { /* save the first error encountered for the * return value */ if (!err) err = PTR_ERR(nentry); audit_panic("error updating selinux filters"); + if (watch) + list_del(&entry->rule.rlist); list_del_rcu(&entry->list); } else { + if (watch) { + list_add(&nentry->rule.rlist, + &watch->rules); + list_del(&entry->rule.rlist); + } list_replace_rcu(&entry->list, &nentry->list); } call_rcu(&entry->rcu, audit_free_rule_rcu); } } - mutex_unlock(&audit_netlink_mutex); + mutex_unlock(&audit_filter_mutex); return err; } + +/* Update watch data in audit rules based on inotify events. */ +void audit_handle_ievent(struct inotify_watch *i_watch, u32 wd, u32 mask, + u32 cookie, const char *dname, struct inode *inode) +{ + struct audit_parent *parent; + + parent = container_of(i_watch, struct audit_parent, wdata); + + if (mask & (IN_CREATE|IN_MOVED_TO) && inode) + audit_update_watch(parent, dname, inode->i_sb->s_dev, + inode->i_ino, 0); + else if (mask & (IN_DELETE|IN_MOVED_FROM)) + audit_update_watch(parent, dname, (dev_t)-1, (unsigned long)-1, 1); + /* inotify automatically removes the watch and sends IN_IGNORED */ + else if (mask & (IN_DELETE_SELF|IN_UNMOUNT)) + audit_remove_parent_watches(parent); + /* inotify does not remove the watch, so remove it manually */ + else if(mask & IN_MOVE_SELF) { + audit_remove_parent_watches(parent); + inotify_remove_watch_locked(audit_ih, i_watch); + } else if (mask & IN_IGNORED) + put_inotify_watch(i_watch); +} diff --git a/kernel/auditsc.c b/kernel/auditsc.c index 1c03a4ed1..c64da575a 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -3,7 +3,7 @@ * * Copyright 2003-2004 Red Hat Inc., Durham, North Carolina. * Copyright 2005 Hewlett-Packard Development Company, L.P. - * Copyright (C) 2005 IBM Corporation + * Copyright (C) 2005, 2006 IBM Corporation * All Rights Reserved. * * This program is free software; you can redistribute it and/or modify @@ -29,6 +29,9 @@ * this file -- see entry.S) is based on a GPL'd patch written by * okir@suse.de and Copyright 2003 SuSE Linux AG. * + * POSIX message queue support added by George Wilson , + * 2006. + * * The support of additional filter rules compares (>, <, >=, <=) was * added by Dustin Kirkland , 2005. * @@ -49,6 +52,7 @@ #include #include #include +#include #include #include #include @@ -59,6 +63,8 @@ #include #include #include +#include +#include #include "audit.h" @@ -76,6 +82,12 @@ extern int audit_enabled; * path_lookup. */ #define AUDIT_NAMES_RESERVED 7 +/* Indicates that audit should log the full pathname. */ +#define AUDIT_NAME_FULL -1 + +/* number of audit rules */ +int audit_n_rules; + /* When fs/namei.c:getname() is called, we store the pointer in name and * we don't let putname() free it (instead we free all of the saved * pointers at syscall exit time). @@ -83,8 +95,9 @@ extern int audit_enabled; * Further, in fs/namei.c:path_lookup() we store the inode and device. */ struct audit_names { const char *name; + int name_len; /* number of name's characters to log */ + unsigned name_put; /* call __putname() for this name */ unsigned long ino; - unsigned long pino; dev_t dev; umode_t mode; uid_t uid; @@ -100,6 +113,33 @@ struct audit_aux_data { #define AUDIT_AUX_IPCPERM 0 +struct audit_aux_data_mq_open { + struct audit_aux_data d; + int oflag; + mode_t mode; + struct mq_attr attr; +}; + +struct audit_aux_data_mq_sendrecv { + struct audit_aux_data d; + mqd_t mqdes; + size_t msg_len; + unsigned int msg_prio; + struct timespec abs_timeout; +}; + +struct audit_aux_data_mq_notify { + struct audit_aux_data d; + mqd_t mqdes; + struct sigevent notification; +}; + +struct audit_aux_data_mq_getsetattr { + struct audit_aux_data d; + mqd_t mqdes; + struct mq_attr mqstat; +}; + struct audit_aux_data_ipcctl { struct audit_aux_data d; struct ipc_perm p; @@ -110,6 +150,13 @@ struct audit_aux_data_ipcctl { u32 osid; }; +struct audit_aux_data_execve { + struct audit_aux_data d; + int argc; + int envc; + char mem[0]; +}; + struct audit_aux_data_socketcall { struct audit_aux_data d; int nargs; @@ -130,6 +177,7 @@ struct audit_aux_data_path { /* The per-task audit context. */ struct audit_context { + int dummy; /* must be the first element */ int in_syscall; /* 1 if task is in a syscall */ enum audit_state state; unsigned int serial; /* serial number for record */ @@ -142,13 +190,14 @@ struct audit_context { int auditable; /* 1 if record should be written */ int name_count; struct audit_names names[AUDIT_NAMES]; + char * filterkey; /* key for rule that triggered record */ struct dentry * pwd; struct vfsmount * pwdmnt; struct audit_context *previous; /* For nested syscalls */ struct audit_aux_data *aux; /* Save things to print about task_struct */ - pid_t pid; + pid_t pid, ppid; uid_t uid, euid, suid, fsuid; gid_t gid, egid, sgid, fsgid; unsigned long personality; @@ -160,12 +209,61 @@ struct audit_context { #endif }; +#define ACC_MODE(x) ("\004\002\006\006"[(x)&O_ACCMODE]) +static inline int open_arg(int flags, int mask) +{ + int n = ACC_MODE(flags); + if (flags & (O_TRUNC | O_CREAT)) + n |= AUDIT_PERM_WRITE; + return n & mask; +} + +static int audit_match_perm(struct audit_context *ctx, int mask) +{ + unsigned n = ctx->major; + switch (audit_classify_syscall(ctx->arch, n)) { + case 0: /* native */ + if ((mask & AUDIT_PERM_WRITE) && + audit_match_class(AUDIT_CLASS_WRITE, n)) + return 1; + if ((mask & AUDIT_PERM_READ) && + audit_match_class(AUDIT_CLASS_READ, n)) + return 1; + if ((mask & AUDIT_PERM_ATTR) && + audit_match_class(AUDIT_CLASS_CHATTR, n)) + return 1; + return 0; + case 1: /* 32bit on biarch */ + if ((mask & AUDIT_PERM_WRITE) && + audit_match_class(AUDIT_CLASS_WRITE_32, n)) + return 1; + if ((mask & AUDIT_PERM_READ) && + audit_match_class(AUDIT_CLASS_READ_32, n)) + return 1; + if ((mask & AUDIT_PERM_ATTR) && + audit_match_class(AUDIT_CLASS_CHATTR_32, n)) + return 1; + return 0; + case 2: /* open */ + return mask & ACC_MODE(ctx->argv[1]); + case 3: /* openat */ + return mask & ACC_MODE(ctx->argv[2]); + case 4: /* socketcall */ + return ((mask & AUDIT_PERM_WRITE) && ctx->argv[0] == SYS_BIND); + case 5: /* execve */ + return mask & AUDIT_PERM_EXEC; + default: + return 0; + } +} +/* Determine if any context name data matches a rule's watch data */ /* Compare a task_struct with an audit_rule. Return 1 on match, 0 * otherwise. */ static int audit_filter_rules(struct task_struct *tsk, struct audit_krule *rule, struct audit_context *ctx, + struct audit_names *name, enum audit_state *state) { int i, j, need_sid = 1; @@ -179,6 +277,10 @@ static int audit_filter_rules(struct task_struct *tsk, case AUDIT_PID: result = audit_comparator(tsk->pid, f->op, f->val); break; + case AUDIT_PPID: + if (ctx) + result = audit_comparator(ctx->ppid, f->op, f->val); + break; case AUDIT_UID: result = audit_comparator(tsk->uid, f->op, f->val); break; @@ -224,7 +326,10 @@ static int audit_filter_rules(struct task_struct *tsk, } break; case AUDIT_DEVMAJOR: - if (ctx) { + if (name) + result = audit_comparator(MAJOR(name->dev), + f->op, f->val); + else if (ctx) { for (j = 0; j < ctx->name_count; j++) { if (audit_comparator(MAJOR(ctx->names[j].dev), f->op, f->val)) { ++result; @@ -234,7 +339,10 @@ static int audit_filter_rules(struct task_struct *tsk, } break; case AUDIT_DEVMINOR: - if (ctx) { + if (name) + result = audit_comparator(MINOR(name->dev), + f->op, f->val); + else if (ctx) { for (j = 0; j < ctx->name_count; j++) { if (audit_comparator(MINOR(ctx->names[j].dev), f->op, f->val)) { ++result; @@ -244,26 +352,32 @@ static int audit_filter_rules(struct task_struct *tsk, } break; case AUDIT_INODE: - if (ctx) { + if (name) + result = (name->ino == f->val); + else if (ctx) { for (j = 0; j < ctx->name_count; j++) { - if (audit_comparator(ctx->names[j].ino, f->op, f->val) || - audit_comparator(ctx->names[j].pino, f->op, f->val)) { + if (audit_comparator(ctx->names[j].ino, f->op, f->val)) { ++result; break; } } } break; + case AUDIT_WATCH: + if (name && rule->watch->ino != (unsigned long)-1) + result = (name->dev == rule->watch->dev && + name->ino == rule->watch->ino); + break; case AUDIT_LOGINUID: result = 0; if (ctx) result = audit_comparator(ctx->loginuid, f->op, f->val); break; - case AUDIT_SE_USER: - case AUDIT_SE_ROLE: - case AUDIT_SE_TYPE: - case AUDIT_SE_SEN: - case AUDIT_SE_CLR: + case AUDIT_SUBJ_USER: + case AUDIT_SUBJ_ROLE: + case AUDIT_SUBJ_TYPE: + case AUDIT_SUBJ_SEN: + case AUDIT_SUBJ_CLR: /* NOTE: this may return negative values indicating a temporary error. We simply treat this as a match for now to avoid losing information that @@ -280,6 +394,46 @@ static int audit_filter_rules(struct task_struct *tsk, ctx); } break; + case AUDIT_OBJ_USER: + case AUDIT_OBJ_ROLE: + case AUDIT_OBJ_TYPE: + case AUDIT_OBJ_LEV_LOW: + case AUDIT_OBJ_LEV_HIGH: + /* The above note for AUDIT_SUBJ_USER...AUDIT_SUBJ_CLR + also applies here */ + if (f->se_rule) { + /* Find files that match */ + if (name) { + result = selinux_audit_rule_match( + name->osid, f->type, f->op, + f->se_rule, ctx); + } else if (ctx) { + for (j = 0; j < ctx->name_count; j++) { + if (selinux_audit_rule_match( + ctx->names[j].osid, + f->type, f->op, + f->se_rule, ctx)) { + ++result; + break; + } + } + } + /* Find ipc objects that match */ + if (ctx) { + struct audit_aux_data *aux; + for (aux = ctx->aux; aux; + aux = aux->next) { + if (aux->type == AUDIT_IPC) { + struct audit_aux_data_ipcctl *axi = (void *)aux; + if (selinux_audit_rule_match(axi->osid, f->type, f->op, f->se_rule, ctx)) { + ++result; + break; + } + } + } + } + } + break; case AUDIT_ARG0: case AUDIT_ARG1: case AUDIT_ARG2: @@ -287,14 +441,22 @@ static int audit_filter_rules(struct task_struct *tsk, if (ctx) result = audit_comparator(ctx->argv[f->type-AUDIT_ARG0], f->op, f->val); break; + case AUDIT_FILTERKEY: + /* ignore this field for filtering */ + result = 1; + break; + case AUDIT_PERM: + result = audit_match_perm(ctx, f->val); + break; } if (!result) return 0; } + if (rule->filterkey) + ctx->filterkey = kstrdup(rule->filterkey, GFP_ATOMIC); switch (rule->action) { case AUDIT_NEVER: *state = AUDIT_DISABLED; break; - case AUDIT_POSSIBLE: *state = AUDIT_BUILD_CONTEXT; break; case AUDIT_ALWAYS: *state = AUDIT_RECORD_CONTEXT; break; } return 1; @@ -311,7 +473,7 @@ static enum audit_state audit_filter_task(struct task_struct *tsk) rcu_read_lock(); list_for_each_entry_rcu(e, &audit_filter_list[AUDIT_FILTER_TASK], list) { - if (audit_filter_rules(tsk, &e->rule, NULL, &state)) { + if (audit_filter_rules(tsk, &e->rule, NULL, NULL, &state)) { rcu_read_unlock(); return state; } @@ -341,8 +503,9 @@ static enum audit_state audit_filter_syscall(struct task_struct *tsk, int bit = AUDIT_BIT(ctx->major); list_for_each_entry_rcu(e, list, list) { - if ((e->rule.mask[word] & bit) == bit - && audit_filter_rules(tsk, &e->rule, ctx, &state)) { + if ((e->rule.mask[word] & bit) == bit && + audit_filter_rules(tsk, &e->rule, ctx, NULL, + &state)) { rcu_read_unlock(); return state; } @@ -352,6 +515,49 @@ static enum audit_state audit_filter_syscall(struct task_struct *tsk, return AUDIT_BUILD_CONTEXT; } +/* At syscall exit time, this filter is called if any audit_names[] have been + * collected during syscall processing. We only check rules in sublists at hash + * buckets applicable to the inode numbers in audit_names[]. + * Regarding audit_state, same rules apply as for audit_filter_syscall(). + */ +enum audit_state audit_filter_inodes(struct task_struct *tsk, + struct audit_context *ctx) +{ + int i; + struct audit_entry *e; + enum audit_state state; + + if (audit_pid && tsk->tgid == audit_pid) + return AUDIT_DISABLED; + + rcu_read_lock(); + for (i = 0; i < ctx->name_count; i++) { + int word = AUDIT_WORD(ctx->major); + int bit = AUDIT_BIT(ctx->major); + struct audit_names *n = &ctx->names[i]; + int h = audit_hash_ino((u32)n->ino); + struct list_head *list = &audit_inode_hash[h]; + + if (list_empty(list)) + continue; + + list_for_each_entry_rcu(e, list, list) { + if ((e->rule.mask[word] & bit) == bit && + audit_filter_rules(tsk, &e->rule, ctx, n, &state)) { + rcu_read_unlock(); + return state; + } + } + } + rcu_read_unlock(); + return AUDIT_BUILD_CONTEXT; +} + +void audit_set_auditable(struct audit_context *ctx) +{ + ctx->auditable = 1; +} + static inline struct audit_context *audit_get_context(struct task_struct *tsk, int return_valid, int return_code) @@ -363,23 +569,23 @@ static inline struct audit_context *audit_get_context(struct task_struct *tsk, context->return_valid = return_valid; context->return_code = return_code; - if (context->in_syscall && !context->auditable) { + if (context->in_syscall && !context->dummy && !context->auditable) { enum audit_state state; + state = audit_filter_syscall(tsk, context, &audit_filter_list[AUDIT_FILTER_EXIT]); + if (state == AUDIT_RECORD_CONTEXT) { + context->auditable = 1; + goto get_context; + } + + state = audit_filter_inodes(tsk, context); if (state == AUDIT_RECORD_CONTEXT) context->auditable = 1; + } - context->pid = tsk->pid; - context->uid = tsk->uid; - context->gid = tsk->gid; - context->euid = tsk->euid; - context->suid = tsk->suid; - context->fsuid = tsk->fsuid; - context->egid = tsk->egid; - context->sgid = tsk->sgid; - context->fsgid = tsk->fsgid; - context->personality = tsk->personality; +get_context: + tsk->audit_context = NULL; return context; } @@ -413,7 +619,7 @@ static inline void audit_free_names(struct audit_context *context) #endif for (i = 0; i < context->name_count; i++) { - if (context->names[i].name) + if (context->names[i].name && context->names[i].name_put) __putname(context->names[i].name); } context->name_count = 0; @@ -513,6 +719,7 @@ static inline void audit_free_context(struct audit_context *context) } audit_free_names(context); audit_free_aux(context); + kfree(context->filterkey); kfree(context); context = previous; } while (context); @@ -544,8 +751,7 @@ static void audit_log_task_context(struct audit_buffer *ab) return; error_path: - if (ctx) - kfree(ctx); + kfree(ctx); audit_panic("error in audit_log_task_context"); return; } @@ -588,6 +794,17 @@ static void audit_log_exit(struct audit_context *context, struct task_struct *ts const char *tty; /* tsk == current */ + context->pid = tsk->pid; + context->ppid = sys_getppid(); /* sic. tsk == current in all cases */ + context->uid = tsk->uid; + context->gid = tsk->gid; + context->euid = tsk->euid; + context->suid = tsk->suid; + context->fsuid = tsk->fsuid; + context->egid = tsk->egid; + context->sgid = tsk->sgid; + context->fsgid = tsk->fsgid; + context->personality = tsk->personality; ab = audit_log_start(context, GFP_KERNEL, AUDIT_SYSCALL); if (!ab) @@ -606,7 +823,7 @@ static void audit_log_exit(struct audit_context *context, struct task_struct *ts tty = "(none)"; audit_log_format(ab, " a0=%lx a1=%lx a2=%lx a3=%lx items=%d" - " pid=%d auid=%u uid=%u gid=%u" + " ppid=%d pid=%d auid=%u uid=%u gid=%u" " euid=%u suid=%u fsuid=%u" " egid=%u sgid=%u fsgid=%u tty=%s", context->argv[0], @@ -614,6 +831,7 @@ static void audit_log_exit(struct audit_context *context, struct task_struct *ts context->argv[2], context->argv[3], context->name_count, + context->ppid, context->pid, context->loginuid, context->uid, @@ -621,6 +839,11 @@ static void audit_log_exit(struct audit_context *context, struct task_struct *ts context->euid, context->suid, context->fsuid, context->egid, context->sgid, context->fsgid, tty); audit_log_task_info(ab, tsk); + if (context->filterkey) { + audit_log_format(ab, " key="); + audit_log_untrustedstring(ab, context->filterkey); + } else + audit_log_format(ab, " key=(null)"); audit_log_end(ab); for (aux = context->aux; aux; aux = aux->next) { @@ -630,11 +853,48 @@ static void audit_log_exit(struct audit_context *context, struct task_struct *ts continue; /* audit_panic has been called */ switch (aux->type) { + case AUDIT_MQ_OPEN: { + struct audit_aux_data_mq_open *axi = (void *)aux; + audit_log_format(ab, + "oflag=0x%x mode=%#o mq_flags=0x%lx mq_maxmsg=%ld " + "mq_msgsize=%ld mq_curmsgs=%ld", + axi->oflag, axi->mode, axi->attr.mq_flags, + axi->attr.mq_maxmsg, axi->attr.mq_msgsize, + axi->attr.mq_curmsgs); + break; } + + case AUDIT_MQ_SENDRECV: { + struct audit_aux_data_mq_sendrecv *axi = (void *)aux; + audit_log_format(ab, + "mqdes=%d msg_len=%zd msg_prio=%u " + "abs_timeout_sec=%ld abs_timeout_nsec=%ld", + axi->mqdes, axi->msg_len, axi->msg_prio, + axi->abs_timeout.tv_sec, axi->abs_timeout.tv_nsec); + break; } + + case AUDIT_MQ_NOTIFY: { + struct audit_aux_data_mq_notify *axi = (void *)aux; + audit_log_format(ab, + "mqdes=%d sigev_signo=%d", + axi->mqdes, + axi->notification.sigev_signo); + break; } + + case AUDIT_MQ_GETSETATTR: { + struct audit_aux_data_mq_getsetattr *axi = (void *)aux; + audit_log_format(ab, + "mqdes=%d mq_flags=0x%lx mq_maxmsg=%ld mq_msgsize=%ld " + "mq_curmsgs=%ld ", + axi->mqdes, + axi->mqstat.mq_flags, axi->mqstat.mq_maxmsg, + axi->mqstat.mq_msgsize, axi->mqstat.mq_curmsgs); + break; } + case AUDIT_IPC: { struct audit_aux_data_ipcctl *axi = (void *)aux; audit_log_format(ab, - " qbytes=%lx iuid=%u igid=%u mode=%x", - axi->qbytes, axi->uid, axi->gid, axi->mode); + "ouid=%u ogid=%u mode=%x", + axi->uid, axi->gid, axi->mode); if (axi->osid != 0) { char *ctx = NULL; u32 len; @@ -652,19 +912,18 @@ static void audit_log_exit(struct audit_context *context, struct task_struct *ts case AUDIT_IPC_SET_PERM: { struct audit_aux_data_ipcctl *axi = (void *)aux; audit_log_format(ab, - " new qbytes=%lx new iuid=%u new igid=%u new mode=%x", + "qbytes=%lx ouid=%u ogid=%u mode=%x", axi->qbytes, axi->uid, axi->gid, axi->mode); - if (axi->osid != 0) { - char *ctx = NULL; - u32 len; - if (selinux_ctxid_to_string( - axi->osid, &ctx, &len)) { - audit_log_format(ab, " osid=%u", - axi->osid); - call_panic = 1; - } else - audit_log_format(ab, " obj=%s", ctx); - kfree(ctx); + break; } + + case AUDIT_EXECVE: { + struct audit_aux_data_execve *axi = (void *)aux; + int i; + const char *p; + for (i = 0, p = axi->mem; i < axi->argc; i++) { + audit_log_format(ab, "a%d=", i); + p = audit_log_untrustedstring(ab, p); + audit_log_format(ab, "\n"); } break; } @@ -700,8 +959,7 @@ static void audit_log_exit(struct audit_context *context, struct task_struct *ts } } for (i = 0; i < context->name_count; i++) { - unsigned long ino = context->names[i].ino; - unsigned long pino = context->names[i].pino; + struct audit_names *n = &context->names[i]; ab = audit_log_start(context, GFP_KERNEL, AUDIT_PATH); if (!ab) @@ -709,33 +967,47 @@ static void audit_log_exit(struct audit_context *context, struct task_struct *ts audit_log_format(ab, "item=%d", i); - audit_log_format(ab, " name="); - if (context->names[i].name) - audit_log_untrustedstring(ab, context->names[i].name); - else - audit_log_format(ab, "(null)"); - - if (pino != (unsigned long)-1) - audit_log_format(ab, " parent=%lu", pino); - if (ino != (unsigned long)-1) - audit_log_format(ab, " inode=%lu", ino); - if ((pino != (unsigned long)-1) || (ino != (unsigned long)-1)) - audit_log_format(ab, " dev=%02x:%02x mode=%#o" - " ouid=%u ogid=%u rdev=%02x:%02x", - MAJOR(context->names[i].dev), - MINOR(context->names[i].dev), - context->names[i].mode, - context->names[i].uid, - context->names[i].gid, - MAJOR(context->names[i].rdev), - MINOR(context->names[i].rdev)); - if (context->names[i].osid != 0) { + if (n->name) { + switch(n->name_len) { + case AUDIT_NAME_FULL: + /* log the full path */ + audit_log_format(ab, " name="); + audit_log_untrustedstring(ab, n->name); + break; + case 0: + /* name was specified as a relative path and the + * directory component is the cwd */ + audit_log_d_path(ab, " name=", context->pwd, + context->pwdmnt); + break; + default: + /* log the name's directory component */ + audit_log_format(ab, " name="); + audit_log_n_untrustedstring(ab, n->name_len, + n->name); + } + } else + audit_log_format(ab, " name=(null)"); + + if (n->ino != (unsigned long)-1) { + audit_log_format(ab, " inode=%lu" + " dev=%02x:%02x mode=%#o" + " ouid=%u ogid=%u rdev=%02x:%02x", + n->ino, + MAJOR(n->dev), + MINOR(n->dev), + n->mode, + n->uid, + n->gid, + MAJOR(n->rdev), + MINOR(n->rdev)); + } + if (n->osid != 0) { char *ctx = NULL; u32 len; if (selinux_ctxid_to_string( - context->names[i].osid, &ctx, &len)) { - audit_log_format(ab, " osid=%u", - context->names[i].osid); + n->osid, &ctx, &len)) { + audit_log_format(ab, " osid=%u", n->osid); call_panic = 2; } else audit_log_format(ab, " obj=%s", ctx); @@ -850,7 +1122,8 @@ void audit_syscall_entry(int arch, int major, context->argv[3] = a4; state = context->state; - if (state == AUDIT_SETUP_CONTEXT || state == AUDIT_BUILD_CONTEXT) + context->dummy = !audit_n_rules; + if (!context->dummy && (state == AUDIT_SETUP_CONTEXT || state == AUDIT_BUILD_CONTEXT)) state = audit_filter_syscall(tsk, context, &audit_filter_list[AUDIT_FILTER_ENTRY]); if (likely(state == AUDIT_DISABLED)) return; @@ -897,6 +1170,8 @@ void audit_syscall_exit(int valid, long return_code) } else { audit_free_names(context); audit_free_aux(context); + kfree(context->filterkey); + context->filterkey = NULL; tsk->audit_context = context; } } @@ -908,11 +1183,11 @@ void audit_syscall_exit(int valid, long return_code) * Add a name to the list of audit names for this context. * Called from fs/namei.c:getname(). */ -void audit_getname(const char *name) +void __audit_getname(const char *name) { struct audit_context *context = current->audit_context; - if (!context || IS_ERR(name) || !name) + if (IS_ERR(name) || !name) return; if (!context->in_syscall) { @@ -925,6 +1200,8 @@ void audit_getname(const char *name) } BUG_ON(context->name_count >= AUDIT_NAMES); context->names[context->name_count].name = name; + context->names[context->name_count].name_len = AUDIT_NAME_FULL; + context->names[context->name_count].name_put = 1; context->names[context->name_count].ino = (unsigned long)-1; ++context->name_count; if (!context->pwd) { @@ -979,23 +1256,26 @@ void audit_putname(const char *name) #endif } -static void audit_inode_context(int idx, const struct inode *inode) +/* Copy inode data into an audit_names. */ +static void audit_copy_inode(struct audit_names *name, const struct inode *inode) { - struct audit_context *context = current->audit_context; - - selinux_get_inode_sid(inode, &context->names[idx].osid); + name->ino = inode->i_ino; + name->dev = inode->i_sb->s_dev; + name->mode = inode->i_mode; + name->uid = inode->i_uid; + name->gid = inode->i_gid; + name->rdev = inode->i_rdev; + selinux_get_inode_sid(inode, &name->osid); } - /** * audit_inode - store the inode and device from a lookup * @name: name being audited * @inode: inode being audited - * @flags: lookup flags (as used in path_lookup()) * * Called from fs/namei.c:path_lookup(). */ -void __audit_inode(const char *name, const struct inode *inode, unsigned flags) +void __audit_inode(const char *name, const struct inode *inode) { int idx; struct audit_context *context = current->audit_context; @@ -1015,33 +1295,28 @@ void __audit_inode(const char *name, const struct inode *inode, unsigned flags) * associated name? */ if (context->name_count >= AUDIT_NAMES - AUDIT_NAMES_RESERVED) return; - idx = context->name_count++; + idx = context->name_count; + if (context->name_count == (AUDIT_NAMES - 1)) { + printk(KERN_DEBUG + "name_count maxed and losing entry [%d]=%s\n", + context->name_count, + context->names[context->name_count].name ?: + "(null)"); + } else + context->name_count++; context->names[idx].name = NULL; #if AUDIT_DEBUG ++context->ino_count; #endif } - context->names[idx].dev = inode->i_sb->s_dev; - context->names[idx].mode = inode->i_mode; - context->names[idx].uid = inode->i_uid; - context->names[idx].gid = inode->i_gid; - context->names[idx].rdev = inode->i_rdev; - audit_inode_context(idx, inode); - if ((flags & LOOKUP_PARENT) && (strcmp(name, "/") != 0) && - (strcmp(name, ".") != 0)) { - context->names[idx].ino = (unsigned long)-1; - context->names[idx].pino = inode->i_ino; - } else { - context->names[idx].ino = inode->i_ino; - context->names[idx].pino = (unsigned long)-1; - } + audit_copy_inode(&context->names[idx], inode); } /** * audit_inode_child - collect inode info for created/removed objects * @dname: inode's dentry name * @inode: inode being audited - * @pino: inode number of dentry parent + * @parent: inode of dentry parent * * For syscalls that create or remove filesystem objects, audit_inode * can only collect information for the filesystem object's parent. @@ -1052,66 +1327,103 @@ void __audit_inode(const char *name, const struct inode *inode, unsigned flags) * unsuccessful attempts. */ void __audit_inode_child(const char *dname, const struct inode *inode, - unsigned long pino) + const struct inode *parent) { int idx; struct audit_context *context = current->audit_context; + const char *found_name = NULL; + int dirlen = 0; if (!context->in_syscall) return; /* determine matching parent */ - if (dname) - for (idx = 0; idx < context->name_count; idx++) - if (context->names[idx].pino == pino) { - const char *n; - const char *name = context->names[idx].name; - int dlen = strlen(dname); - int nlen = name ? strlen(name) : 0; - - if (nlen < dlen) - continue; - - /* disregard trailing slashes */ - n = name + nlen - 1; - while ((*n == '/') && (n > name)) - n--; - - /* find last path component */ - n = n - dlen + 1; - if (n < name) - continue; - else if (n > name) { - if (*--n != '/') - continue; - else - n++; - } - - if (strncmp(n, dname, dlen) == 0) - goto update_context; + if (!dname) + goto update_context; + for (idx = 0; idx < context->name_count; idx++) + if (context->names[idx].ino == parent->i_ino) { + const char *name = context->names[idx].name; + + if (!name) + continue; + + if (audit_compare_dname_path(dname, name, &dirlen) == 0) { + context->names[idx].name_len = dirlen; + found_name = name; + break; } + } - /* catch-all in case match not found */ - idx = context->name_count++; - context->names[idx].name = NULL; - context->names[idx].pino = pino; +update_context: + idx = context->name_count; + if (context->name_count == (AUDIT_NAMES - 1)) { + printk(KERN_DEBUG "name_count maxed and losing entry [%d]=%s\n", + context->name_count, + context->names[context->name_count].name ?: "(null)"); + } else + context->name_count++; #if AUDIT_DEBUG context->ino_count++; #endif + /* Re-use the name belonging to the slot for a matching parent directory. + * All names for this context are relinquished in audit_free_names() */ + context->names[idx].name = found_name; + context->names[idx].name_len = AUDIT_NAME_FULL; + context->names[idx].name_put = 0; /* don't call __putname() */ + + if (!inode) + context->names[idx].ino = (unsigned long)-1; + else + audit_copy_inode(&context->names[idx], inode); + + /* A parent was not found in audit_names, so copy the inode data for the + * provided parent. */ + if (!found_name) { + idx = context->name_count; + if (context->name_count == (AUDIT_NAMES - 1)) { + printk(KERN_DEBUG + "name_count maxed and losing entry [%d]=%s\n", + context->name_count, + context->names[context->name_count].name ?: + "(null)"); + } else + context->name_count++; +#if AUDIT_DEBUG + context->ino_count++; +#endif + audit_copy_inode(&context->names[idx], parent); + } +} -update_context: - if (inode) { - context->names[idx].ino = inode->i_ino; - context->names[idx].dev = inode->i_sb->s_dev; - context->names[idx].mode = inode->i_mode; - context->names[idx].uid = inode->i_uid; - context->names[idx].gid = inode->i_gid; - context->names[idx].rdev = inode->i_rdev; - audit_inode_context(idx, inode); +/** + * audit_inode_update - update inode info for last collected name + * @inode: inode being audited + * + * When open() is called on an existing object with the O_CREAT flag, the inode + * data audit initially collects is incorrect. This additional hook ensures + * audit has the inode data for the actual object to be opened. + */ +void __audit_inode_update(const struct inode *inode) +{ + struct audit_context *context = current->audit_context; + int idx; + + if (!context->in_syscall || !inode) + return; + + if (context->name_count == 0) { + context->name_count++; +#if AUDIT_DEBUG + context->ino_count++; +#endif } + idx = context->name_count - 1; + + audit_copy_inode(&context->names[idx], inode); } +EXPORT_SYMBOL_GPL(__audit_inode_child); + /** * auditsc_get_stamp - get local copies of audit_context values * @ctx: audit_context for the task @@ -1142,18 +1454,23 @@ void auditsc_get_stamp(struct audit_context *ctx, */ int audit_set_loginuid(struct task_struct *task, uid_t loginuid) { - if (task->audit_context) { - struct audit_buffer *ab; - - ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_LOGIN); - if (ab) { - audit_log_format(ab, "login pid=%d uid=%u " - "old auid=%u new auid=%u", - task->pid, task->uid, - task->audit_context->loginuid, loginuid); - audit_log_end(ab); + struct audit_context *context = task->audit_context; + + if (context) { + /* Only log if audit is enabled */ + if (context->in_syscall) { + struct audit_buffer *ab; + + ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_LOGIN); + if (ab) { + audit_log_format(ab, "login pid=%d uid=%u " + "old auid=%u new auid=%u", + task->pid, task->uid, + context->loginuid, loginuid); + audit_log_end(ab); + } } - task->audit_context->loginuid = loginuid; + context->loginuid = loginuid; } return 0; } @@ -1170,19 +1487,220 @@ uid_t audit_get_loginuid(struct audit_context *ctx) } /** - * audit_ipc_obj - record audit data for ipc object - * @ipcp: ipc permissions + * __audit_mq_open - record audit data for a POSIX MQ open + * @oflag: open flag + * @mode: mode bits + * @u_attr: queue attributes * * Returns 0 for success or NULL context or < 0 on error. */ -int audit_ipc_obj(struct kern_ipc_perm *ipcp) +int __audit_mq_open(int oflag, mode_t mode, struct mq_attr __user *u_attr) { - struct audit_aux_data_ipcctl *ax; + struct audit_aux_data_mq_open *ax; + struct audit_context *context = current->audit_context; + + if (!audit_enabled) + return 0; + + if (likely(!context)) + return 0; + + ax = kmalloc(sizeof(*ax), GFP_ATOMIC); + if (!ax) + return -ENOMEM; + + if (u_attr != NULL) { + if (copy_from_user(&ax->attr, u_attr, sizeof(ax->attr))) { + kfree(ax); + return -EFAULT; + } + } else + memset(&ax->attr, 0, sizeof(ax->attr)); + + ax->oflag = oflag; + ax->mode = mode; + + ax->d.type = AUDIT_MQ_OPEN; + ax->d.next = context->aux; + context->aux = (void *)ax; + return 0; +} + +/** + * __audit_mq_timedsend - record audit data for a POSIX MQ timed send + * @mqdes: MQ descriptor + * @msg_len: Message length + * @msg_prio: Message priority + * @u_abs_timeout: Message timeout in absolute time + * + * Returns 0 for success or NULL context or < 0 on error. + */ +int __audit_mq_timedsend(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, + const struct timespec __user *u_abs_timeout) +{ + struct audit_aux_data_mq_sendrecv *ax; struct audit_context *context = current->audit_context; + if (!audit_enabled) + return 0; + if (likely(!context)) return 0; + ax = kmalloc(sizeof(*ax), GFP_ATOMIC); + if (!ax) + return -ENOMEM; + + if (u_abs_timeout != NULL) { + if (copy_from_user(&ax->abs_timeout, u_abs_timeout, sizeof(ax->abs_timeout))) { + kfree(ax); + return -EFAULT; + } + } else + memset(&ax->abs_timeout, 0, sizeof(ax->abs_timeout)); + + ax->mqdes = mqdes; + ax->msg_len = msg_len; + ax->msg_prio = msg_prio; + + ax->d.type = AUDIT_MQ_SENDRECV; + ax->d.next = context->aux; + context->aux = (void *)ax; + return 0; +} + +/** + * __audit_mq_timedreceive - record audit data for a POSIX MQ timed receive + * @mqdes: MQ descriptor + * @msg_len: Message length + * @u_msg_prio: Message priority + * @u_abs_timeout: Message timeout in absolute time + * + * Returns 0 for success or NULL context or < 0 on error. + */ +int __audit_mq_timedreceive(mqd_t mqdes, size_t msg_len, + unsigned int __user *u_msg_prio, + const struct timespec __user *u_abs_timeout) +{ + struct audit_aux_data_mq_sendrecv *ax; + struct audit_context *context = current->audit_context; + + if (!audit_enabled) + return 0; + + if (likely(!context)) + return 0; + + ax = kmalloc(sizeof(*ax), GFP_ATOMIC); + if (!ax) + return -ENOMEM; + + if (u_msg_prio != NULL) { + if (get_user(ax->msg_prio, u_msg_prio)) { + kfree(ax); + return -EFAULT; + } + } else + ax->msg_prio = 0; + + if (u_abs_timeout != NULL) { + if (copy_from_user(&ax->abs_timeout, u_abs_timeout, sizeof(ax->abs_timeout))) { + kfree(ax); + return -EFAULT; + } + } else + memset(&ax->abs_timeout, 0, sizeof(ax->abs_timeout)); + + ax->mqdes = mqdes; + ax->msg_len = msg_len; + + ax->d.type = AUDIT_MQ_SENDRECV; + ax->d.next = context->aux; + context->aux = (void *)ax; + return 0; +} + +/** + * __audit_mq_notify - record audit data for a POSIX MQ notify + * @mqdes: MQ descriptor + * @u_notification: Notification event + * + * Returns 0 for success or NULL context or < 0 on error. + */ + +int __audit_mq_notify(mqd_t mqdes, const struct sigevent __user *u_notification) +{ + struct audit_aux_data_mq_notify *ax; + struct audit_context *context = current->audit_context; + + if (!audit_enabled) + return 0; + + if (likely(!context)) + return 0; + + ax = kmalloc(sizeof(*ax), GFP_ATOMIC); + if (!ax) + return -ENOMEM; + + if (u_notification != NULL) { + if (copy_from_user(&ax->notification, u_notification, sizeof(ax->notification))) { + kfree(ax); + return -EFAULT; + } + } else + memset(&ax->notification, 0, sizeof(ax->notification)); + + ax->mqdes = mqdes; + + ax->d.type = AUDIT_MQ_NOTIFY; + ax->d.next = context->aux; + context->aux = (void *)ax; + return 0; +} + +/** + * __audit_mq_getsetattr - record audit data for a POSIX MQ get/set attribute + * @mqdes: MQ descriptor + * @mqstat: MQ flags + * + * Returns 0 for success or NULL context or < 0 on error. + */ +int __audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat) +{ + struct audit_aux_data_mq_getsetattr *ax; + struct audit_context *context = current->audit_context; + + if (!audit_enabled) + return 0; + + if (likely(!context)) + return 0; + + ax = kmalloc(sizeof(*ax), GFP_ATOMIC); + if (!ax) + return -ENOMEM; + + ax->mqdes = mqdes; + ax->mqstat = *mqstat; + + ax->d.type = AUDIT_MQ_GETSETATTR; + ax->d.next = context->aux; + context->aux = (void *)ax; + return 0; +} + +/** + * audit_ipc_obj - record audit data for ipc object + * @ipcp: ipc permissions + * + * Returns 0 for success or NULL context or < 0 on error. + */ +int __audit_ipc_obj(struct kern_ipc_perm *ipcp) +{ + struct audit_aux_data_ipcctl *ax; + struct audit_context *context = current->audit_context; + ax = kmalloc(sizeof(*ax), GFP_ATOMIC); if (!ax) return -ENOMEM; @@ -1207,14 +1725,11 @@ int audit_ipc_obj(struct kern_ipc_perm *ipcp) * * Returns 0 for success or NULL context or < 0 on error. */ -int audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode, struct kern_ipc_perm *ipcp) +int __audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode) { struct audit_aux_data_ipcctl *ax; struct audit_context *context = current->audit_context; - if (likely(!context)) - return 0; - ax = kmalloc(sizeof(*ax), GFP_ATOMIC); if (!ax) return -ENOMEM; @@ -1223,7 +1738,6 @@ int audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode, ax->uid = uid; ax->gid = gid; ax->mode = mode; - selinux_get_ipc_sid(ipcp, &ax->osid); ax->d.type = AUDIT_IPC_SET_PERM; ax->d.next = context->aux; @@ -1231,6 +1745,39 @@ int audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode, return 0; } +int audit_bprm(struct linux_binprm *bprm) +{ + struct audit_aux_data_execve *ax; + struct audit_context *context = current->audit_context; + unsigned long p, next; + void *to; + + if (likely(!audit_enabled || !context || context->dummy)) + return 0; + + ax = kmalloc(sizeof(*ax) + PAGE_SIZE * MAX_ARG_PAGES - bprm->p, + GFP_KERNEL); + if (!ax) + return -ENOMEM; + + ax->argc = bprm->argc; + ax->envc = bprm->envc; + for (p = bprm->p, to = ax->mem; p < MAX_ARG_PAGES*PAGE_SIZE; p = next) { + struct page *page = bprm->page[p / PAGE_SIZE]; + void *kaddr = kmap(page); + next = (p + PAGE_SIZE) & ~(PAGE_SIZE - 1); + memcpy(to, kaddr + (p & (PAGE_SIZE - 1)), next - p); + to += next - p; + kunmap(page); + } + + ax->d.type = AUDIT_EXECVE; + ax->d.next = context->aux; + context->aux = (void *)ax; + return 0; +} + + /** * audit_socketcall - record audit data for sys_socketcall * @nargs: number of args @@ -1243,7 +1790,7 @@ int audit_socketcall(int nargs, unsigned long *args) struct audit_aux_data_socketcall *ax; struct audit_context *context = current->audit_context; - if (likely(!context)) + if (likely(!context || context->dummy)) return 0; ax = kmalloc(sizeof(*ax) + nargs * sizeof(unsigned long), GFP_KERNEL); @@ -1271,7 +1818,7 @@ int audit_sockaddr(int len, void *a) struct audit_aux_data_sockaddr *ax; struct audit_context *context = current->audit_context; - if (likely(!context)) + if (likely(!context || context->dummy)) return 0; ax = kmalloc(sizeof(*ax) + len, GFP_KERNEL); @@ -1325,19 +1872,20 @@ int audit_avc_path(struct dentry *dentry, struct vfsmount *mnt) * If the audit subsystem is being terminated, record the task (pid) * and uid that is doing that. */ -void audit_signal_info(int sig, struct task_struct *t) +void __audit_signal_info(int sig, struct task_struct *t) { extern pid_t audit_sig_pid; extern uid_t audit_sig_uid; - - if (unlikely(audit_pid && t->tgid == audit_pid)) { - if (sig == SIGTERM || sig == SIGHUP) { - struct audit_context *ctx = current->audit_context; - audit_sig_pid = current->pid; - if (ctx) - audit_sig_uid = ctx->loginuid; - else - audit_sig_uid = current->uid; - } + extern u32 audit_sig_sid; + + if (sig == SIGTERM || sig == SIGHUP || sig == SIGUSR1) { + struct task_struct *tsk = current; + struct audit_context *ctx = tsk->audit_context; + audit_sig_pid = tsk->pid; + if (ctx) + audit_sig_uid = ctx->loginuid; + else + audit_sig_uid = tsk->uid; + selinux_get_task_sid(tsk, &audit_sig_sid); } } diff --git a/kernel/capability.c b/kernel/capability.c index 6b3412f25..6e3c421f6 100644 --- a/kernel/capability.c +++ b/kernel/capability.c @@ -12,7 +12,6 @@ #include #include #include -#include #include unsigned securebits = SECUREBITS_DEFAULT; /* systemwide security settings */ @@ -47,7 +46,7 @@ asmlinkage long sys_capget(cap_user_header_t header, cap_user_data_t dataptr) int ret = 0; pid_t pid; __u32 version; - task_t *target; + struct task_struct *target; struct __user_cap_data_struct data; if (get_user(version, &header->version)) @@ -97,7 +96,7 @@ static inline int cap_set_pg(int pgrp, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted) { - task_t *g, *target; + struct task_struct *g, *target; int ret = -EPERM; int found = 0; @@ -129,7 +128,7 @@ static inline int cap_set_all(kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted) { - task_t *g, *target; + struct task_struct *g, *target; int ret = -EPERM; int found = 0; @@ -173,7 +172,7 @@ asmlinkage long sys_capset(cap_user_header_t header, const cap_user_data_t data) { kernel_cap_t inheritable, permitted, effective; __u32 version; - task_t *target; + struct task_struct *target; int ret; pid_t pid; diff --git a/kernel/compat.c b/kernel/compat.c index c1601a84f..126dee953 100644 --- a/kernel/compat.c +++ b/kernel/compat.c @@ -21,6 +21,7 @@ #include #include #include +#include #include @@ -729,17 +730,10 @@ void sigset_from_compat (sigset_t *set, compat_sigset_t *compat) { switch (_NSIG_WORDS) { -#if defined (__COMPAT_ENDIAN_SWAP__) - case 4: set->sig[3] = compat->sig[7] | (((long)compat->sig[6]) << 32 ); - case 3: set->sig[2] = compat->sig[5] | (((long)compat->sig[4]) << 32 ); - case 2: set->sig[1] = compat->sig[3] | (((long)compat->sig[2]) << 32 ); - case 1: set->sig[0] = compat->sig[1] | (((long)compat->sig[0]) << 32 ); -#else case 4: set->sig[3] = compat->sig[6] | (((long)compat->sig[7]) << 32 ); case 3: set->sig[2] = compat->sig[4] | (((long)compat->sig[5]) << 32 ); case 2: set->sig[1] = compat->sig[2] | (((long)compat->sig[3]) << 32 ); case 1: set->sig[0] = compat->sig[0] | (((long)compat->sig[1]) << 32 ); -#endif } } @@ -934,3 +928,25 @@ asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp) return ret; } + +#ifdef CONFIG_NUMA +asmlinkage long compat_sys_move_pages(pid_t pid, unsigned long nr_pages, + compat_uptr_t __user *pages32, + const int __user *nodes, + int __user *status, + int flags) +{ + const void __user * __user *pages; + int i; + + pages = compat_alloc_user_space(nr_pages * sizeof(void *)); + for (i = 0; i < nr_pages; i++) { + compat_uptr_t p; + + if (get_user(p, pages32 + i) || + put_user(compat_ptr(p), pages + i)) + return -EFAULT; + } + return sys_move_pages(pid, nr_pages, pages, nodes, status, flags); +} +#endif diff --git a/kernel/configs.c b/kernel/configs.c index 009e1ebdc..f9e31974f 100644 --- a/kernel/configs.c +++ b/kernel/configs.c @@ -23,7 +23,6 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include #include #include diff --git a/kernel/cpu.c b/kernel/cpu.c index fe2b8d0bf..32c966284 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c @@ -13,66 +13,66 @@ #include #include #include -#include +#include /* This protects CPUs going up and down... */ -static DECLARE_MUTEX(cpucontrol); +static DEFINE_MUTEX(cpu_add_remove_lock); +static DEFINE_MUTEX(cpu_bitmask_lock); -static BLOCKING_NOTIFIER_HEAD(cpu_chain); +static __cpuinitdata BLOCKING_NOTIFIER_HEAD(cpu_chain); -#ifdef CONFIG_HOTPLUG_CPU -static struct task_struct *lock_cpu_hotplug_owner; -static int lock_cpu_hotplug_depth; - -static int __lock_cpu_hotplug(int interruptible) -{ - int ret = 0; +/* If set, cpu_up and cpu_down will return -EBUSY and do nothing. + * Should always be manipulated under cpu_add_remove_lock + */ +static int cpu_hotplug_disabled; - if (lock_cpu_hotplug_owner != current) { - if (interruptible) - ret = down_interruptible(&cpucontrol); - else - down(&cpucontrol); - } +#ifdef CONFIG_HOTPLUG_CPU - /* - * Set only if we succeed in locking - */ - if (!ret) { - lock_cpu_hotplug_depth++; - lock_cpu_hotplug_owner = current; - } - - return ret; -} +/* Crappy recursive lock-takers in cpufreq! Complain loudly about idiots */ +static struct task_struct *recursive; +static int recursive_depth; void lock_cpu_hotplug(void) { - __lock_cpu_hotplug(0); + struct task_struct *tsk = current; + + if (tsk == recursive) { + static int warnings = 10; + if (warnings) { + printk(KERN_ERR "Lukewarm IQ detected in hotplug locking\n"); + WARN_ON(1); + warnings--; + } + recursive_depth++; + return; + } + mutex_lock(&cpu_bitmask_lock); + recursive = tsk; } EXPORT_SYMBOL_GPL(lock_cpu_hotplug); void unlock_cpu_hotplug(void) { - if (--lock_cpu_hotplug_depth == 0) { - lock_cpu_hotplug_owner = NULL; - up(&cpucontrol); + WARN_ON(recursive != current); + if (recursive_depth) { + recursive_depth--; + return; } + mutex_unlock(&cpu_bitmask_lock); + recursive = NULL; } 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 __cpuinit register_cpu_notifier(struct notifier_block *nb) { return blocking_notifier_chain_register(&cpu_chain, nb); } + +#ifdef CONFIG_HOTPLUG_CPU + EXPORT_SYMBOL(register_cpu_notifier); void unregister_cpu_notifier(struct notifier_block *nb) @@ -81,7 +81,6 @@ void unregister_cpu_notifier(struct notifier_block *nb) } EXPORT_SYMBOL(unregister_cpu_notifier); -#ifdef CONFIG_HOTPLUG_CPU static inline void check_for_tasks(int cpu) { struct task_struct *p; @@ -114,32 +113,25 @@ static int take_cpu_down(void *unused) return 0; } -int cpu_down(unsigned int cpu) +/* Requires cpu_add_remove_lock to be held */ +static int _cpu_down(unsigned int cpu) { int err; struct task_struct *p; cpumask_t old_allowed, tmp; - if ((err = lock_cpu_hotplug_interruptible()) != 0) - return err; + if (num_online_cpus() == 1) + return -EBUSY; - if (num_online_cpus() == 1) { - err = -EBUSY; - goto out; - } - - if (!cpu_online(cpu)) { - err = -EINVAL; - goto out; - } + if (!cpu_online(cpu)) + return -EINVAL; err = blocking_notifier_call_chain(&cpu_chain, CPU_DOWN_PREPARE, (void *)(long)cpu); if (err == NOTIFY_BAD) { printk("%s: attempt to take down CPU %u failed\n", __FUNCTION__, cpu); - err = -EINVAL; - goto out; + return -EINVAL; } /* Ensure that we are not runnable on dying cpu */ @@ -148,7 +140,10 @@ int cpu_down(unsigned int cpu) cpu_clear(cpu, tmp); set_cpus_allowed(current, tmp); + mutex_lock(&cpu_bitmask_lock); p = __stop_machine_run(take_cpu_down, NULL, cpu); + mutex_unlock(&cpu_bitmask_lock); + if (IS_ERR(p)) { /* CPU didn't die: tell everyone. Can't complain. */ if (blocking_notifier_call_chain(&cpu_chain, CPU_DOWN_FAILED, @@ -184,24 +179,32 @@ out_thread: err = kthread_stop(p); out_allowed: set_cpus_allowed(current, old_allowed); -out: - unlock_cpu_hotplug(); + return err; +} + +int cpu_down(unsigned int cpu) +{ + int err = 0; + + mutex_lock(&cpu_add_remove_lock); + if (cpu_hotplug_disabled) + err = -EBUSY; + else + err = _cpu_down(cpu); + + mutex_unlock(&cpu_add_remove_lock); return err; } #endif /*CONFIG_HOTPLUG_CPU*/ -int __devinit cpu_up(unsigned int cpu) +/* Requires cpu_add_remove_lock to be held */ +static int __devinit _cpu_up(unsigned int cpu) { int ret; void *hcpu = (void *)(long)cpu; - if ((ret = lock_cpu_hotplug_interruptible()) != 0) - return ret; - - if (cpu_online(cpu) || !cpu_present(cpu)) { - ret = -EINVAL; - goto out; - } + if (cpu_online(cpu) || !cpu_present(cpu)) + return -EINVAL; ret = blocking_notifier_call_chain(&cpu_chain, CPU_UP_PREPARE, hcpu); if (ret == NOTIFY_BAD) { @@ -212,7 +215,9 @@ int __devinit cpu_up(unsigned int cpu) } /* Arch-specific enabling code. */ + mutex_lock(&cpu_bitmask_lock); ret = __cpu_up(cpu); + mutex_unlock(&cpu_bitmask_lock); if (ret != 0) goto out_notify; BUG_ON(!cpu_online(cpu)); @@ -224,7 +229,95 @@ out_notify: if (ret != 0) blocking_notifier_call_chain(&cpu_chain, CPU_UP_CANCELED, hcpu); -out: - unlock_cpu_hotplug(); + return ret; } + +int __devinit cpu_up(unsigned int cpu) +{ + int err = 0; + + mutex_lock(&cpu_add_remove_lock); + if (cpu_hotplug_disabled) + err = -EBUSY; + else + err = _cpu_up(cpu); + + mutex_unlock(&cpu_add_remove_lock); + return err; +} + +#ifdef CONFIG_SUSPEND_SMP +static cpumask_t frozen_cpus; + +int disable_nonboot_cpus(void) +{ + int cpu, first_cpu, error; + + mutex_lock(&cpu_add_remove_lock); + first_cpu = first_cpu(cpu_present_map); + if (!cpu_online(first_cpu)) { + error = _cpu_up(first_cpu); + if (error) { + printk(KERN_ERR "Could not bring CPU%d up.\n", + first_cpu); + goto out; + } + } + error = set_cpus_allowed(current, cpumask_of_cpu(first_cpu)); + if (error) { + printk(KERN_ERR "Could not run on CPU%d\n", first_cpu); + goto out; + } + /* We take down all of the non-boot CPUs in one shot to avoid races + * with the userspace trying to use the CPU hotplug at the same time + */ + cpus_clear(frozen_cpus); + printk("Disabling non-boot CPUs ...\n"); + for_each_online_cpu(cpu) { + if (cpu == first_cpu) + continue; + error = _cpu_down(cpu); + if (!error) { + cpu_set(cpu, frozen_cpus); + printk("CPU%d is down\n", cpu); + } else { + printk(KERN_ERR "Error taking CPU%d down: %d\n", + cpu, error); + break; + } + } + if (!error) { + BUG_ON(num_online_cpus() > 1); + /* Make sure the CPUs won't be enabled by someone else */ + cpu_hotplug_disabled = 1; + } else { + printk(KERN_ERR "Non-boot CPUs are not disabled"); + } +out: + mutex_unlock(&cpu_add_remove_lock); + return error; +} + +void enable_nonboot_cpus(void) +{ + int cpu, error; + + /* Allow everyone to use the CPU hotplug again */ + mutex_lock(&cpu_add_remove_lock); + cpu_hotplug_disabled = 0; + mutex_unlock(&cpu_add_remove_lock); + + printk("Enabling non-boot CPUs ...\n"); + for_each_cpu_mask(cpu, frozen_cpus) { + error = cpu_up(cpu); + if (!error) { + printk("CPU%d is up\n", cpu); + continue; + } + printk(KERN_WARNING "Error taking CPU%d up: %d\n", + cpu, error); + } + cpus_clear(frozen_cpus); +} +#endif diff --git a/kernel/cpuset.c b/kernel/cpuset.c index cc0383a96..cdc92f972 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c @@ -18,7 +18,6 @@ * distribution for more details. */ -#include #include #include #include @@ -41,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -49,7 +49,6 @@ #include #include #include -#include #include #include @@ -290,7 +289,6 @@ static struct inode *cpuset_new_inode(mode_t mode) inode->i_mode = mode; inode->i_uid = current->fsuid; inode->i_gid = current->fsgid; - inode->i_blksize = PAGE_CACHE_SIZE; inode->i_blocks = 0; inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; inode->i_mapping->backing_dev_info = &cpuset_backing_dev_info; @@ -393,11 +391,11 @@ static int cpuset_fill_super(struct super_block *sb, void *unused_data, return 0; } -static struct super_block *cpuset_get_sb(struct file_system_type *fs_type, - int flags, const char *unused_dev_name, - void *data) +static int cpuset_get_sb(struct file_system_type *fs_type, + int flags, const char *unused_dev_name, + void *data, struct vfsmount *mnt) { - return get_sb_single(fs_type, flags, data, cpuset_fill_super); + return get_sb_single(fs_type, flags, data, cpuset_fill_super, mnt); } static struct file_system_type cpuset_fs_type = { @@ -763,6 +761,8 @@ static int validate_change(const struct cpuset *cur, const struct cpuset *trial) * * Call with manage_mutex held. May nest a call to the * lock_cpu_hotplug()/unlock_cpu_hotplug() pair. + * Must not be called holding callback_mutex, because we must + * not call lock_cpu_hotplug() while holding callback_mutex. */ static void update_cpu_domains(struct cpuset *cur) @@ -782,7 +782,7 @@ static void update_cpu_domains(struct cpuset *cur) if (is_cpu_exclusive(c)) cpus_andnot(pspan, pspan, c->cpus_allowed); } - if (is_removed(cur) || !is_cpu_exclusive(cur)) { + if (!is_cpu_exclusive(cur)) { cpus_or(pspan, pspan, cur->cpus_allowed); if (cpus_equal(pspan, cur->cpus_allowed)) return; @@ -815,6 +815,10 @@ static int update_cpumask(struct cpuset *cs, char *buf) struct cpuset trialcs; int retval, cpus_unchanged; + /* top_cpuset.cpus_allowed tracks cpu_online_map; it's read-only */ + if (cs == &top_cpuset) + return -EACCES; + trialcs = *cs; retval = cpulist_parse(buf, trialcs.cpus_allowed); if (retval < 0) @@ -1064,7 +1068,7 @@ static int update_flag(cpuset_flagbits_t bit, struct cpuset *cs, char *buf) } /* - * Frequency meter - How fast is some event occuring? + * Frequency meter - How fast is some event occurring? * * These routines manage a digitally filtered, constant time based, * event frequency meter. There are four routines: @@ -1178,6 +1182,7 @@ static int attach_task(struct cpuset *cs, char *pidbuf, char **ppathbuf) cpumask_t cpus; nodemask_t from, to; struct mm_struct *mm; + int retval; if (sscanf(pidbuf, "%d", &pid) != 1) return -EIO; @@ -1206,6 +1211,12 @@ static int attach_task(struct cpuset *cs, char *pidbuf, char **ppathbuf) get_task_struct(tsk); } + retval = security_task_setscheduler(tsk, 0, NULL); + if (retval) { + put_task_struct(tsk); + return retval; + } + mutex_lock(&callback_mutex); task_lock(tsk); @@ -1911,6 +1922,17 @@ static int cpuset_mkdir(struct inode *dir, struct dentry *dentry, int mode) return cpuset_create(c_parent, dentry->d_name.name, mode | S_IFDIR); } +/* + * Locking note on the strange update_flag() call below: + * + * If the cpuset being removed is marked cpu_exclusive, then simulate + * turning cpu_exclusive off, which will call update_cpu_domains(). + * The lock_cpu_hotplug() call in update_cpu_domains() must not be + * made while holding callback_mutex. Elsewhere the kernel nests + * callback_mutex inside lock_cpu_hotplug() calls. So the reverse + * nesting would risk an ABBA deadlock. + */ + static int cpuset_rmdir(struct inode *unused_dir, struct dentry *dentry) { struct cpuset *cs = dentry->d_fsdata; @@ -1930,11 +1952,16 @@ static int cpuset_rmdir(struct inode *unused_dir, struct dentry *dentry) mutex_unlock(&manage_mutex); return -EBUSY; } + if (is_cpu_exclusive(cs)) { + int retval = update_flag(CS_CPU_EXCLUSIVE, cs, "0"); + if (retval < 0) { + mutex_unlock(&manage_mutex); + return retval; + } + } parent = cs->parent; mutex_lock(&callback_mutex); set_bit(CS_REMOVED, &cs->flags); - if (is_cpu_exclusive(cs)) - update_cpu_domains(cs); list_del(&cs->sibling); /* delete my sibling from parent->children */ spin_lock(&cs->dentry->d_lock); d = dget(cs->dentry); @@ -2009,6 +2036,33 @@ out: return err; } +/* + * The top_cpuset tracks what CPUs and Memory Nodes are online, + * period. This is necessary in order to make cpusets transparent + * (of no affect) on systems that are actively using CPU hotplug + * but making no active use of cpusets. + * + * This handles CPU hotplug (cpuhp) events. If someday Memory + * Nodes can be hotplugged (dynamically changing node_online_map) + * then we should handle that too, perhaps in a similar way. + */ + +#ifdef CONFIG_HOTPLUG_CPU +static int cpuset_handle_cpuhp(struct notifier_block *nb, + unsigned long phase, void *cpu) +{ + mutex_lock(&manage_mutex); + mutex_lock(&callback_mutex); + + top_cpuset.cpus_allowed = cpu_online_map; + + mutex_unlock(&callback_mutex); + mutex_unlock(&manage_mutex); + + return 0; +} +#endif + /** * cpuset_init_smp - initialize cpus_allowed * @@ -2019,6 +2073,8 @@ void __init cpuset_init_smp(void) { top_cpuset.cpus_allowed = cpu_online_map; top_cpuset.mems_allowed = node_online_map; + + hotcpu_notifier(cpuset_handle_cpuhp, 0); } /** @@ -2363,7 +2419,7 @@ EXPORT_SYMBOL_GPL(cpuset_mem_spread_node); int cpuset_excl_nodes_overlap(const struct task_struct *p) { const struct cpuset *cs1, *cs2; /* my and p's cpuset ancestors */ - int overlap = 0; /* do cpusets overlap? */ + int overlap = 1; /* do cpusets overlap? */ task_lock(current); if (current->flags & PF_EXITING) { @@ -2435,31 +2491,43 @@ void __cpuset_memory_pressure_bump(void) */ static int proc_cpuset_show(struct seq_file *m, void *v) { + struct pid *pid; struct task_struct *tsk; char *buf; - int retval = 0; + int retval; + retval = -ENOMEM; buf = kmalloc(PAGE_SIZE, GFP_KERNEL); if (!buf) - return -ENOMEM; + goto out; + + retval = -ESRCH; + pid = m->private; + tsk = get_pid_task(pid, PIDTYPE_PID); + if (!tsk) + goto out_free; - tsk = m->private; + retval = -EINVAL; mutex_lock(&manage_mutex); + retval = cpuset_path(tsk->cpuset, buf, PAGE_SIZE); if (retval < 0) - goto out; + goto out_unlock; seq_puts(m, buf); seq_putc(m, '\n'); -out: +out_unlock: mutex_unlock(&manage_mutex); + put_task_struct(tsk); +out_free: kfree(buf); +out: return retval; } static int cpuset_open(struct inode *inode, struct file *file) { - struct task_struct *tsk = PROC_I(inode)->task; - return single_open(file, proc_cpuset_show, tsk); + struct pid *pid = PROC_I(inode)->pid; + return single_open(file, proc_cpuset_show, pid); } struct file_operations proc_cpuset_operations = { diff --git a/kernel/exec_domain.c b/kernel/exec_domain.c index c01cead2c..3c2eaea66 100644 --- a/kernel/exec_domain.c +++ b/kernel/exec_domain.c @@ -7,7 +7,6 @@ * 2001-05-06 Complete rewrite, Christoph Hellwig (hch@infradead.org) */ -#include #include #include #include diff --git a/kernel/exit.c b/kernel/exit.c index 08eee6d20..99e79125e 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -4,7 +4,6 @@ * Copyright (C) 1991, 1992 Linus Torvalds */ -#include #include #include #include @@ -22,10 +21,13 @@ #include #include #include +#include #include #include #include #include +#include +#include #include #include #include @@ -36,10 +38,10 @@ #include #include #include /* for audit_free() */ +#include #include #include #include -#include #include #include @@ -49,8 +51,6 @@ extern void sem_exit (void); extern struct task_struct *child_reaper; -int getrusage(struct task_struct *, int, struct rusage __user *); - static void exit_mm(struct task_struct * tsk); static void __unhash_process(struct task_struct *p) @@ -140,17 +140,13 @@ static void delayed_put_task_struct(struct rcu_head *rhp) void release_task(struct task_struct * p) { + struct task_struct *leader; int zap_leader; - task_t *leader; - struct dentry *proc_dentry; - repeat: + tracehook_release_task(p); atomic_dec(&p->user->processes); - spin_lock(&p->proc_lock); - proc_dentry = proc_pid_unhash(p); write_lock_irq(&tasklist_lock); - ptrace_unlink(p); - BUG_ON(!list_empty(&p->ptrace_list) || !list_empty(&p->ptrace_children)); + BUG_ON(tracehook_check_released(p)); __exit_signal(p); /* @@ -176,8 +172,7 @@ repeat: sched_exit(p); write_unlock_irq(&tasklist_lock); - spin_unlock(&p->proc_lock); - proc_pid_flush(proc_dentry); + proc_flush_task(p); release_thread(p); call_rcu(&p->rcu, delayed_put_task_struct); @@ -220,7 +215,7 @@ out: * * "I ask you, have you ever known what it is to be an orphan?" */ -static int will_become_orphaned_pgrp(int pgrp, task_t *ignored_task) +static int will_become_orphaned_pgrp(int pgrp, struct task_struct *ignored_task) { struct task_struct *p; int ret = 1; @@ -228,10 +223,10 @@ static int will_become_orphaned_pgrp(int pgrp, task_t *ignored_task) do_each_task_pid(pgrp, PIDTYPE_PGID, p) { if (p == ignored_task || p->exit_state - || p->real_parent->pid == 1) + || p->parent->pid == 1) continue; - if (process_group(p->real_parent) != pgrp - && p->real_parent->signal->session == p->signal->session) { + if (process_group(p->parent) != pgrp + && p->parent->signal->session == p->signal->session) { ret = 0; break; } @@ -259,16 +254,6 @@ static int has_stopped_jobs(int pgrp) if (p->state != TASK_STOPPED) continue; - /* If p is stopped by a debugger on a signal that won't - stop it, then don't count p as stopped. This isn't - perfect but it's a good approximation. */ - if (unlikely (p->ptrace) - && p->exit_code != SIGSTOP - && p->exit_code != SIGTSTP - && p->exit_code != SIGTTOU - && p->exit_code != SIGTTIN) - continue; - retval = 1; break; } while_each_task_pid(pgrp, PIDTYPE_PGID, p); @@ -291,11 +276,9 @@ static void reparent_to_init(void) { write_lock_irq(&tasklist_lock); - ptrace_unlink(current); /* Reparent to init */ remove_parent(current); current->parent = child_reaper; - current->real_parent = child_reaper; add_parent(current); /* Set the exit signal to SIGCHLD so we signal init on exit */ @@ -585,7 +568,7 @@ static void exit_mm(struct task_struct * tsk) down_read(&mm->mmap_sem); } atomic_inc(&mm->mm_count); - if (mm != tsk->active_mm) BUG(); + BUG_ON(mm != tsk->active_mm); /* more a memory barrier than a real lock */ task_lock(tsk); tsk->mm = NULL; @@ -595,7 +578,8 @@ static void exit_mm(struct task_struct * tsk) mmput(mm); } -static inline void choose_new_parent(task_t *p, task_t *reaper) +static inline void +choose_new_parent(struct task_struct *p, struct task_struct *reaper) { /* check for reaper context */ vxwprintk((p->xid != reaper->xid) && (reaper != child_reaper), @@ -607,10 +591,11 @@ static inline void choose_new_parent(task_t *p, task_t *reaper) * the parent is not a zombie. */ BUG_ON(p == reaper || reaper->exit_state); - p->real_parent = reaper; + p->parent = reaper; } -static void reparent_thread(task_t *p, task_t *father, int traced) +static void +reparent_thread(struct task_struct *p, struct task_struct *father) { /* We don't want people slaying init. */ if (p->exit_signal != -1) @@ -621,35 +606,14 @@ static void reparent_thread(task_t *p, task_t *father, int traced) group_send_sig_info(p->pdeath_signal, SEND_SIG_NOINFO, p); /* Move the child from its dying parent to the new one. */ - if (unlikely(traced)) { - /* Preserve ptrace links if someone else is tracing this child. */ - list_del_init(&p->ptrace_list); - if (p->parent != p->real_parent) - list_add(&p->ptrace_list, &p->real_parent->ptrace_children); - } else { - /* If this child is being traced, then we're the one tracing it - * anyway, so let go of it. - */ - p->ptrace = 0; - remove_parent(p); - p->parent = p->real_parent; - add_parent(p); + list_move_tail(&p->sibling, &p->parent->children); - /* If we'd notified the old parent about this child's death, - * also notify the new parent. - */ - if (p->exit_state == EXIT_ZOMBIE && p->exit_signal != -1 && - thread_group_empty(p)) - do_notify_parent(p, p->exit_signal); - else if (p->state == TASK_TRACED) { - /* - * If it was at a trace stop, turn it into - * a normal stop since it's no longer being - * traced. - */ - ptrace_untrace(p); - } - } + /* If we'd notified the old parent about this child's death, + * also notify the new parent. + */ + if (p->exit_state == EXIT_ZOMBIE && p->exit_signal != -1 && + thread_group_empty(p)) + do_notify_parent(p, p->exit_signal); /* * process group orphan check @@ -674,8 +638,8 @@ static void reparent_thread(task_t *p, task_t *father, int traced) * group, and if no such member exists, give it to * the global child reaper process (ie "init") */ -static void forget_original_parent(struct task_struct * father, - struct list_head *to_release) +static void +forget_original_parent(struct task_struct *father) { struct task_struct *p, *reaper = father; struct list_head *_p, *_n; @@ -688,48 +652,10 @@ static void forget_original_parent(struct task_struct * father, } } while (reaper->exit_state); - /* - * There are only two places where our children can be: - * - * - in our child list - * - in our ptraced child list - * - * Search them and reparent children. - */ list_for_each_safe(_p, _n, &father->children) { - int ptrace; - p = list_entry(_p,struct task_struct,sibling); - - ptrace = p->ptrace; - - /* if father isn't the real parent, then ptrace must be enabled */ - BUG_ON(father != p->real_parent && !ptrace); - - if (father == p->real_parent) { - /* reparent with a reaper, real father it's us */ - choose_new_parent(p, vx_child_reaper(p)); - reparent_thread(p, father, 0); - } else { - /* reparent ptraced task to its real parent */ - __ptrace_unlink (p); - if (p->exit_state == EXIT_ZOMBIE && p->exit_signal != -1 && - thread_group_empty(p)) - do_notify_parent(p, p->exit_signal); - } - - /* - * if the ptraced child is a zombie with exit_signal == -1 - * we must collect it before we exit, or it will remain - * zombie forever since we prevented it from self-reap itself - * while it was being traced by us, to be able to see it in wait4. - */ - if (unlikely(ptrace && p->exit_state == EXIT_ZOMBIE && p->exit_signal == -1)) - list_add(&p->ptrace_list, to_release); - } - list_for_each_safe(_p, _n, &father->ptrace_children) { - p = list_entry(_p,struct task_struct,ptrace_list); - choose_new_parent(p, reaper); - reparent_thread(p, father, 1); + p = list_entry(_p, struct task_struct, sibling); + choose_new_parent(p, vx_child_reaper(p)); + reparent_thread(p, father); } } @@ -741,7 +667,8 @@ static void exit_notify(struct task_struct *tsk) { int state; struct task_struct *t; - struct list_head ptrace_dead, *_p, *_n; + int noreap; + void *cookie; if (signal_pending(tsk) && !(tsk->signal->flags & SIGNAL_GROUP_EXIT) && !thread_group_empty(tsk)) { @@ -777,10 +704,8 @@ static void exit_notify(struct task_struct *tsk) * jobs, send them a SIGHUP and then a SIGCONT. (POSIX 3.2.2.2) */ - INIT_LIST_HEAD(&ptrace_dead); - forget_original_parent(tsk, &ptrace_dead); + forget_original_parent(tsk); BUG_ON(!list_empty(&tsk->children)); - BUG_ON(!list_empty(&tsk->ptrace_children)); /* * Check to see if any process groups have become orphaned @@ -792,7 +717,7 @@ static void exit_notify(struct task_struct *tsk) * is about to become orphaned. */ - t = tsk->real_parent; + t = tsk->parent; if ((process_group(t) != process_group(tsk)) && (t->signal->session == tsk->signal->session) && @@ -824,32 +749,18 @@ static void exit_notify(struct task_struct *tsk) && !capable(CAP_KILL)) tsk->exit_signal = SIGCHLD; - - /* If something other than our normal parent is ptracing us, then - * send it a SIGCHLD instead of honoring exit_signal. exit_signal - * only has special meaning to our real parent. - */ - if (tsk->exit_signal != -1 && thread_group_empty(tsk)) { - int signal = tsk->parent == tsk->real_parent ? tsk->exit_signal : SIGCHLD; - do_notify_parent(tsk, signal); - } else if (tsk->ptrace) { - do_notify_parent(tsk, SIGCHLD); - } + if (!tracehook_notify_death(tsk, &noreap, &cookie) + && tsk->exit_signal != -1 && thread_group_empty(tsk)) + do_notify_parent(tsk, tsk->exit_signal); state = EXIT_ZOMBIE; - if (tsk->exit_signal == -1 && - (likely(tsk->ptrace == 0) || - unlikely(tsk->parent->signal->flags & SIGNAL_GROUP_EXIT))) + if (tsk->exit_signal == -1 && !noreap) state = EXIT_DEAD; tsk->exit_state = state; write_unlock_irq(&tasklist_lock); - list_for_each_safe(_p, _n, &ptrace_dead) { - list_del_init(_p); - t = list_entry(_p,struct task_struct,ptrace_list); - release_task(t); - } + tracehook_report_death(tsk, state, cookie); /* If the process is dead, release it - nobody will wait for it */ if (state == EXIT_DEAD) @@ -859,7 +770,9 @@ static void exit_notify(struct task_struct *tsk) fastcall NORET_TYPE void do_exit(long code) { struct task_struct *tsk = current; + struct taskstats *tidstats; int group_dead; + unsigned int mycpu; profile_task_exit(tsk); @@ -872,10 +785,7 @@ fastcall NORET_TYPE void do_exit(long code) if (unlikely(tsk == child_reaper)) panic("Attempted to kill init!"); - if (unlikely(current->ptrace & PT_TRACE_EXIT)) { - current->ptrace_message = code; - ptrace_notify((PTRACE_EVENT_EXIT << 8) | SIGTRAP); - } + tracehook_report_exit(&code); /* * We're taking recursive faults here in do_exit. Safest is to just @@ -892,11 +802,15 @@ fastcall NORET_TYPE void do_exit(long code) tsk->flags |= PF_EXITING; + ptrace_exit(tsk); + if (unlikely(in_atomic())) printk(KERN_INFO "note: %s[%d] exited with preempt_count %d\n", current->comm, current->pid, preempt_count()); + taskstats_exit_alloc(&tidstats, &mycpu); + acct_update_integrals(tsk); if (tsk->mm) { update_hiwater_rss(tsk->mm); @@ -906,15 +820,17 @@ fastcall NORET_TYPE void do_exit(long code) if (group_dead) { hrtimer_cancel(&tsk->signal->real_timer); exit_itimers(tsk->signal); - acct_process(code); - if (current->tux_info) { + } + + if (current->tux_info) { #ifdef CONFIG_TUX_DEBUG - printk("Possibly unexpected TUX-thread exit(%ld) at %p?\n", - code, __builtin_return_address(0)); + printk("Possibly unexpected TUX-thread exit(%ld) at %p?\n", + code, __builtin_return_address(0)); #endif - current->tux_exit(); - } + current->tux_exit(); } + + acct_collect(code, group_dead); if (unlikely(tsk->robust_list)) exit_robust_list(tsk); #if defined(CONFIG_FUTEX) && defined(CONFIG_COMPAT) @@ -923,14 +839,17 @@ fastcall NORET_TYPE void do_exit(long code) #endif if (unlikely(tsk->audit_context)) audit_free(tsk); + taskstats_exit_send(tsk, tidstats, group_dead, mycpu); + taskstats_exit_free(tidstats); + exit_mm(tsk); + if (group_dead) + acct_process(); exit_sem(tsk); __exit_files(tsk); __exit_fs(tsk); exit_namespace(tsk); - exit_vx_info(tsk, code); - exit_nx_info(tsk); exit_thread(); cpuset_exit(tsk); exit_keys(tsk); @@ -944,15 +863,25 @@ fastcall NORET_TYPE void do_exit(long code) tsk->exit_code = code; proc_exit_connector(tsk); + /* needs to stay before exit_notify() */ + exit_vx_info_early(tsk, code); exit_notify(tsk); #ifdef CONFIG_NUMA mpol_free(tsk->mempolicy); tsk->mempolicy = NULL; #endif /* - * If DEBUG_MUTEXES is on, make sure we are holding no locks: + * This must happen late, after the PID is not + * hashed anymore: */ - mutex_debug_check_no_locks_held(tsk); + if (unlikely(!list_empty(&tsk->pi_state_list))) + exit_pi_state_list(tsk); + if (unlikely(current->pi_state_cache)) + kfree(current->pi_state_cache); + /* + * Make sure we are holding no locks: + */ + debug_check_no_locks_held(tsk); if (tsk->io_context) exit_io_context(); @@ -960,6 +889,10 @@ fastcall NORET_TYPE void do_exit(long code) if (tsk->splice_pipe) __free_pipe_info(tsk->splice_pipe); + /* needs to stay after exit_notify() */ + exit_vx_info(tsk, code); + exit_nx_info(tsk); + /* PF_DEAD causes final put_task_struct after we schedule. */ preempt_disable(); BUG_ON(tsk->flags & PF_DEAD); @@ -1027,7 +960,7 @@ asmlinkage void sys_exit_group(int error_code) do_group_exit((error_code & 0xff) << 8); } -static int eligible_child(pid_t pid, int options, task_t *p) +static int eligible_child(pid_t pid, int options, struct task_struct *p) { if (pid > 0) { if (p->pid != pid) @@ -1041,10 +974,9 @@ static int eligible_child(pid_t pid, int options, task_t *p) } /* - * Do not consider detached threads that are - * not ptraced: + * Do not consider detached threads. */ - if (p->exit_signal == -1 && !p->ptrace) + if (p->exit_signal == -1) return 0; /* Wait for all children (clone and not) if __WALL is set; @@ -1059,7 +991,7 @@ static int eligible_child(pid_t pid, int options, task_t *p) * Do not consider thread group leaders that are * in a non-empty thread group: */ - if (current->tgid != p->tgid && delay_group_leader(p)) + if (delay_group_leader(p)) return 2; if (security_task_wait(p)) @@ -1068,12 +1000,13 @@ static int eligible_child(pid_t pid, int options, task_t *p) return 1; } -static int wait_noreap_copyout(task_t *p, pid_t pid, uid_t uid, +static int wait_noreap_copyout(struct task_struct *p, pid_t pid, uid_t uid, int why, int status, struct siginfo __user *infop, struct rusage __user *rusagep) { int retval = rusagep ? getrusage(p, RUSAGE_BOTH, rusagep) : 0; + put_task_struct(p); if (!retval) retval = put_user(SIGCHLD, &infop->si_signo); @@ -1098,7 +1031,7 @@ static int wait_noreap_copyout(task_t *p, pid_t pid, uid_t uid, * the lock and this task is uninteresting. If we return nonzero, we have * released the lock and the system call should return. */ -static int wait_task_zombie(task_t *p, int noreap, +static int wait_task_zombie(struct task_struct *p, int noreap, struct siginfo __user *infop, int __user *stat_addr, struct rusage __user *ru) { @@ -1114,7 +1047,7 @@ static int wait_task_zombie(task_t *p, int noreap, if (unlikely(p->exit_state != EXIT_ZOMBIE)) return 0; - if (unlikely(p->exit_signal == -1 && p->ptrace == 0)) + if (unlikely(p->exit_signal == -1)) return 0; get_task_struct(p); read_unlock(&tasklist_lock); @@ -1138,15 +1071,9 @@ static int wait_task_zombie(task_t *p, int noreap, BUG_ON(state != EXIT_DEAD); return 0; } - if (unlikely(p->exit_signal == -1 && p->ptrace == 0)) { - /* - * This can only happen in a race with a ptraced thread - * dying on another processor. - */ - return 0; - } + BUG_ON(p->exit_signal == -1); - if (likely(p->real_parent == p->parent) && likely(p->signal)) { + if (likely(p->signal)) { struct signal_struct *psig; struct signal_struct *sig; @@ -1228,28 +1155,8 @@ static int wait_task_zombie(task_t *p, int noreap, return retval; } retval = p->pid; - if (p->real_parent != p->parent) { - write_lock_irq(&tasklist_lock); - /* Double-check with lock held. */ - if (p->real_parent != p->parent) { - __ptrace_unlink(p); - // TODO: is this safe? - p->exit_state = EXIT_ZOMBIE; - /* - * If this is not a detached task, notify the parent. - * If it's still not detached after that, don't release - * it now. - */ - if (p->exit_signal != -1) { - do_notify_parent(p, p->exit_signal); - if (p->exit_signal != -1) - p = NULL; - } - } - write_unlock_irq(&tasklist_lock); - } - if (p != NULL) - release_task(p); + release_task(p); + BUG_ON(!retval); return retval; } @@ -1260,15 +1167,15 @@ static int wait_task_zombie(task_t *p, int noreap, * the lock and this task is uninteresting. If we return nonzero, we have * released the lock and the system call should return. */ -static int wait_task_stopped(task_t *p, int delayed_group_leader, int noreap, - struct siginfo __user *infop, +static int wait_task_stopped(struct task_struct *p, int delayed_group_leader, + int noreap, struct siginfo __user *infop, int __user *stat_addr, struct rusage __user *ru) { int retval, exit_code; if (!p->exit_code) return 0; - if (delayed_group_leader && !(p->ptrace & PT_PTRACED) && + if (delayed_group_leader && p->signal && p->signal->group_stop_count > 0) /* * A group stop is in progress and this is the group leader. @@ -1289,14 +1196,13 @@ static int wait_task_stopped(task_t *p, int delayed_group_leader, int noreap, if (unlikely(noreap)) { pid_t pid = p->pid; uid_t uid = p->uid; - int why = (p->ptrace & PT_PTRACED) ? CLD_TRAPPED : CLD_STOPPED; exit_code = p->exit_code; if (unlikely(!exit_code) || unlikely(p->state & TASK_TRACED)) goto bail_ref; - return wait_noreap_copyout(p, pid, uid, - why, (exit_code << 8) | 0x7f, + return wait_noreap_copyout(p, pid, uid, CLD_STOPPED, + (exit_code << 8) | 0x7f, infop, ru); } @@ -1352,9 +1258,7 @@ bail_ref: if (!retval && infop) retval = put_user(0, &infop->si_errno); if (!retval && infop) - retval = put_user((short)((p->ptrace & PT_PTRACED) - ? CLD_TRAPPED : CLD_STOPPED), - &infop->si_code); + retval = put_user((short)CLD_STOPPED, &infop->si_code); if (!retval && infop) retval = put_user(exit_code, &infop->si_status); if (!retval && infop) @@ -1375,7 +1279,7 @@ bail_ref: * the lock and this task is uninteresting. If we return nonzero, we have * released the lock and the system call should return. */ -static int wait_task_continued(task_t *p, int noreap, +static int wait_task_continued(struct task_struct *p, int noreap, struct siginfo __user *infop, int __user *stat_addr, struct rusage __user *ru) { @@ -1422,22 +1326,6 @@ static int wait_task_continued(task_t *p, int noreap, } -static inline int my_ptrace_child(struct task_struct *p) -{ - if (!(p->ptrace & PT_PTRACED)) - return 0; - if (!(p->ptrace & PT_ATTACHED)) - return 1; - /* - * This child was PTRACE_ATTACH'd. We should be seeing it only if - * we are the attacher. If we are the real parent, this is a race - * inside ptrace_attach. It is waiting for the tasklist_lock, - * which we have to switch the parent links, but has already set - * the flags in p->ptrace. - */ - return (p->parent != p->real_parent); -} - static long do_wait(pid_t pid, int options, struct siginfo __user *infop, int __user *stat_addr, struct rusage __user *ru) { @@ -1461,7 +1349,7 @@ repeat: int ret; list_for_each(_p,&tsk->children) { - p = list_entry(_p,struct task_struct,sibling); + p = list_entry(_p, struct task_struct, sibling); ret = eligible_child(pid, options, p); if (!ret) @@ -1469,26 +1357,17 @@ repeat: switch (p->state) { case TASK_TRACED: - /* - * When we hit the race with PTRACE_ATTACH, - * we will not report this child. But the - * race means it has not yet been moved to - * our ptrace_children list, so we need to - * set the flag here to avoid a spurious ECHILD - * when the race happens with the only child. - */ flag = 1; - if (!my_ptrace_child(p)) - continue; - /*FALLTHROUGH*/ + continue; case TASK_STOPPED: /* * It's stopped now, so it might later * continue, exit, or stop again. */ flag = 1; - if (!(options & WUNTRACED) && - !my_ptrace_child(p)) + if (!(options & WUNTRACED)) + continue; + if (tracehook_inhibit_wait_stopped(p)) continue; retval = wait_task_stopped(p, ret == 2, (options & WNOWAIT), @@ -1513,6 +1392,10 @@ repeat: goto check_continued; if (!likely(options & WEXITED)) continue; + if (tracehook_inhibit_wait_zombie(p)) { + flag = 1; + continue; + } retval = wait_task_zombie( p, (options & WNOWAIT), infop, stat_addr, ru); @@ -1529,6 +1412,8 @@ check_continued: flag = 1; if (!unlikely(options & WCONTINUED)) continue; + if (tracehook_inhibit_wait_continued(p)) + continue; retval = wait_task_continued( p, (options & WNOWAIT), infop, stat_addr, ru); @@ -1537,21 +1422,19 @@ check_continued: break; } } - if (!flag) { - list_for_each(_p, &tsk->ptrace_children) { - p = list_entry(_p, struct task_struct, - ptrace_list); - if (!eligible_child(pid, options, p)) - continue; - flag = 1; - break; - } + + retval = ptrace_do_wait(tsk, pid, options, + infop, stat_addr, ru); + if (retval != -ECHILD) { + flag = 1; + if (retval != 0) /* He released the lock. */ + goto end; } + if (options & __WNOTHREAD) break; tsk = next_thread(tsk); - if (tsk->signal != current->signal) - BUG(); + BUG_ON(tsk->signal != current->signal); } while (tsk != current); read_unlock(&tasklist_lock); @@ -1571,7 +1454,7 @@ end: remove_wait_queue(¤t->signal->wait_chldexit,&wait); if (infop) { if (retval > 0) - retval = 0; + retval = 0; else { /* * For a WNOHANG return, clear out all the fields diff --git a/kernel/fork.c b/kernel/fork.c index 471d19f71..adfa44841 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -11,7 +11,6 @@ * management can be a bitch. See 'mm/memory.c': 'copy_page_range()' */ -#include #include #include #include @@ -37,13 +36,15 @@ #include #include #include -#include +#include #include #include #include #include #include #include +#include +#include #include #include #include @@ -66,9 +67,7 @@ int max_threads; /* tunable limit on nr_threads */ DEFINE_PER_CPU(unsigned long, process_counts) = 0; - __cacheline_aligned DEFINE_RWLOCK(tasklist_lock); /* outer */ - -EXPORT_SYMBOL(tasklist_lock); +__cacheline_aligned DEFINE_RWLOCK(tasklist_lock); /* outer */ int nr_processes(void) { @@ -108,6 +107,7 @@ static kmem_cache_t *mm_cachep; void free_task(struct task_struct *tsk) { free_thread_info(tsk->thread_info); + rt_mutex_debug_task_free(tsk); clr_vx_info(&tsk->vx_info); clr_nx_info(&tsk->nx_info); free_task_struct(tsk); @@ -123,6 +123,7 @@ void __put_task_struct(struct task_struct *tsk) security_task_free(tsk); free_uid(tsk->user); put_group_info(tsk->group_info); + delayacct_tsk_free(tsk); if (!profile_handoff_task(tsk)) free_task(tsk); @@ -199,7 +200,10 @@ static inline int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) down_write(&oldmm->mmap_sem); flush_cache_mm(oldmm); - down_write(&mm->mmap_sem); + /* + * Not linked in yet - no deadlock potential: + */ + down_write_nested(&mm->mmap_sem, SINGLE_DEPTH_NESTING); mm->locked_vm = 0; mm->mmap = NULL; @@ -379,6 +383,8 @@ void fastcall __mmdrop(struct mm_struct *mm) */ void mmput(struct mm_struct *mm) { + might_sleep(); + if (atomic_dec_and_test(&mm->mm_users)) { exit_aio(mm); exit_mmap(mm); @@ -636,6 +642,7 @@ out: /* * Allocate a new files structure and copy contents from the * passed in files structure. + * errorp will be valid only when the returned files_struct is NULL. */ static struct files_struct *dup_fd(struct files_struct *oldf, int *errorp) { @@ -644,6 +651,7 @@ static struct files_struct *dup_fd(struct files_struct *oldf, int *errorp) int open_files, size, i, expand; struct fdtable *old_fdt, *new_fdt; + *errorp = -ENOMEM; newf = alloc_files(); if (!newf) goto out; @@ -759,7 +767,6 @@ static int copy_files(unsigned long clone_flags, struct task_struct * tsk) * break this. */ tsk->files = NULL; - error = -ENOMEM; newf = dup_fd(oldf, &error); if (!newf) goto out; @@ -829,6 +836,7 @@ static inline int copy_signal(unsigned long clone_flags, struct task_struct * ts if (clone_flags & CLONE_THREAD) { atomic_inc(¤t->signal->count); atomic_inc(¤t->signal->live); + taskstats_tgid_alloc(current->signal); return 0; } sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL); @@ -873,6 +881,7 @@ static inline int copy_signal(unsigned long clone_flags, struct task_struct * ts INIT_LIST_HEAD(&sig->cpu_timers[0]); INIT_LIST_HEAD(&sig->cpu_timers[1]); INIT_LIST_HEAD(&sig->cpu_timers[2]); + taskstats_tgid_init(sig); task_lock(current->group_leader); memcpy(sig->rlim, current->signal->rlim, sizeof sig->rlim); @@ -886,6 +895,7 @@ static inline int copy_signal(unsigned long clone_flags, struct task_struct * ts tsk->it_prof_expires = secs_to_cputime(sig->rlim[RLIMIT_CPU].rlim_cur); } + acct_init_pacct(&sig->pacct); return 0; } @@ -893,6 +903,7 @@ static inline int copy_signal(unsigned long clone_flags, struct task_struct * ts void __cleanup_signal(struct signal_struct *sig) { exit_thread_group_keys(sig); + taskstats_tgid_free(sig); kmem_cache_free(signal_cachep, sig); } @@ -912,8 +923,7 @@ static inline void copy_flags(unsigned long clone_flags, struct task_struct *p) new_flags &= ~(PF_SUPERPRIV | PF_NOFREEZE); new_flags |= PF_FORKNOEXEC; - if (!(clone_flags & CLONE_PTRACE)) - p->ptrace = 0; + new_flags |= PF_STARTING; p->flags = new_flags; } @@ -924,6 +934,15 @@ asmlinkage long sys_set_tid_address(int __user *tidptr) return current->pid; } +static inline void rt_mutex_init_task(struct task_struct *p) +{ +#ifdef CONFIG_RT_MUTEXES + spin_lock_init(&p->pi_lock); + plist_head_init(&p->pi_waiters, &p->pi_lock); + p->pi_blocked_on = NULL; +#endif +} + /* * This creates a new process as a copy of the old one, * but does not actually start it yet. @@ -932,13 +951,13 @@ asmlinkage long sys_set_tid_address(int __user *tidptr) * parts of the process environment (as per the clone * flags). The actual kick-off is left to the caller. */ -static task_t *copy_process(unsigned long clone_flags, - unsigned long stack_start, - struct pt_regs *regs, - unsigned long stack_size, - int __user *parent_tidptr, - int __user *child_tidptr, - int pid) +static struct task_struct *copy_process(unsigned long clone_flags, + unsigned long stack_start, + struct pt_regs *regs, + unsigned long stack_size, + int __user *parent_tidptr, + int __user *child_tidptr, + int pid) { int retval; struct task_struct *p = NULL; @@ -971,8 +990,15 @@ static task_t *copy_process(unsigned long clone_flags, p = dup_task_struct(current); if (!p) goto fork_out; + + rt_mutex_init_task(p); + p->tux_info = NULL; +#ifdef CONFIG_TRACE_IRQFLAGS + DEBUG_LOCKS_WARN_ON(!p->hardirqs_enabled); + DEBUG_LOCKS_WARN_ON(!p->softirqs_enabled); +#endif init_vx_info(&p->vx_info, current->vx_info); init_nx_info(&p->nx_info, current->nx_info); @@ -1018,20 +1044,21 @@ static task_t *copy_process(unsigned long clone_flags, goto bad_fork_cleanup_put_domain; p->did_exec = 0; + delayacct_tsk_init(p); /* Must remain after dup_task_struct() */ copy_flags(clone_flags, p); p->pid = pid; retval = -EFAULT; if (clone_flags & CLONE_PARENT_SETTID) if (put_user(p->pid, parent_tidptr)) - goto bad_fork_cleanup; - - p->proc_dentry = NULL; + goto bad_fork_cleanup_delays_binfmt; INIT_LIST_HEAD(&p->children); INIT_LIST_HEAD(&p->sibling); p->vfork_done = NULL; spin_lock_init(&p->alloc_lock); - spin_lock_init(&p->proc_lock); +#ifdef CONFIG_PTRACE + INIT_LIST_HEAD(&p->ptracees); +#endif clear_tsk_thread_flag(p, TIF_SIGPENDING); init_sigpending(&p->pending); @@ -1068,6 +1095,26 @@ static task_t *copy_process(unsigned long clone_flags, } mpol_fix_fork_child_flag(p); #endif +#ifdef CONFIG_TRACE_IRQFLAGS + p->irq_events = 0; + p->hardirqs_enabled = 0; + p->hardirq_enable_ip = 0; + p->hardirq_enable_event = 0; + p->hardirq_disable_ip = _THIS_IP_; + p->hardirq_disable_event = 0; + p->softirqs_enabled = 1; + p->softirq_enable_ip = _THIS_IP_; + p->softirq_enable_event = 0; + p->softirq_disable_ip = 0; + p->softirq_disable_event = 0; + p->hardirq_context = 0; + p->softirq_context = 0; +#endif +#ifdef CONFIG_LOCKDEP + p->lockdep_depth = 0; /* no locks held yet */ + p->curr_chain_key = 0; + p->lockdep_recursion = 0; +#endif #ifdef CONFIG_DEBUG_MUTEXES p->blocked_on = NULL; /* not blocked yet */ @@ -1111,6 +1158,9 @@ static task_t *copy_process(unsigned long clone_flags, #ifdef CONFIG_COMPAT p->compat_robust_list = NULL; #endif + INIT_LIST_HEAD(&p->pi_state_list); + p->pi_state_cache = NULL; + /* * sigaltstack should be cleared when sharing the same VM */ @@ -1142,8 +1192,6 @@ static task_t *copy_process(unsigned long clone_flags, */ p->group_leader = p; INIT_LIST_HEAD(&p->thread_group); - INIT_LIST_HEAD(&p->ptrace_children); - INIT_LIST_HEAD(&p->ptrace_list); /* Perform scheduler related setup. Assign this task to a CPU. */ sched_fork(p, clone_flags); @@ -1167,10 +1215,9 @@ static task_t *copy_process(unsigned long clone_flags, /* CLONE_PARENT re-uses the old parent */ if (clone_flags & (CLONE_PARENT|CLONE_THREAD)) - p->real_parent = current->real_parent; + p->parent = current->parent; else - p->real_parent = current; - p->parent = p->real_parent; + p->parent = current; spin_lock(¤t->sighand->siglock); @@ -1191,18 +1238,6 @@ static task_t *copy_process(unsigned long clone_flags, } if (clone_flags & CLONE_THREAD) { - /* - * Important: if an exit-all has been started then - * do not create this new thread - the whole thread - * group is supposed to exit anyway. - */ - if (current->signal->flags & SIGNAL_GROUP_EXIT) { - spin_unlock(¤t->sighand->siglock); - write_unlock_irq(&tasklist_lock); - retval = -EAGAIN; - goto bad_fork_cleanup_namespace; - } - p->group_leader = current->group_leader; list_add_tail_rcu(&p->thread_group, &p->group_leader->thread_group); @@ -1229,8 +1264,7 @@ static task_t *copy_process(unsigned long clone_flags, if (likely(p->pid)) { add_parent(p); - if (unlikely(p->ptrace & PT_PTRACED)) - __ptrace_link(p, current->parent); + tracehook_init_task(p); if (thread_group_leader(p)) { p->signal->tty = current->signal->tty; @@ -1291,7 +1325,8 @@ bad_fork_cleanup_policy: bad_fork_cleanup_cpuset: #endif cpuset_exit(p); -bad_fork_cleanup: +bad_fork_cleanup_delays_binfmt: + delayacct_tsk_free(p); if (p->binfmt) module_put(p->binfmt->module); bad_fork_cleanup_put_domain: @@ -1315,9 +1350,9 @@ struct pt_regs * __devinit __attribute__((weak)) idle_regs(struct pt_regs *regs) return regs; } -task_t * __devinit fork_idle(int cpu) +struct task_struct * __devinit fork_idle(int cpu) { - task_t *task; + struct task_struct *task; struct pt_regs regs; task = copy_process(CLONE_VM, 0, idle_regs(®s), 0, NULL, NULL, 0); @@ -1328,22 +1363,6 @@ task_t * __devinit fork_idle(int cpu) return task; } -static inline int fork_traceflag (unsigned clone_flags) -{ - if (clone_flags & CLONE_UNTRACED) - return 0; - else if (clone_flags & CLONE_VFORK) { - if (current->ptrace & PT_TRACE_VFORK) - return PTRACE_EVENT_VFORK; - } else if ((clone_flags & CSIGNAL) != SIGCHLD) { - if (current->ptrace & PT_TRACE_CLONE) - return PTRACE_EVENT_CLONE; - } else if (current->ptrace & PT_TRACE_FORK) - return PTRACE_EVENT_FORK; - - return 0; -} - /* * Ok, this is the main fork-routine. * @@ -1358,18 +1377,12 @@ long do_fork(unsigned long clone_flags, int __user *child_tidptr) { struct task_struct *p; - int trace = 0; struct pid *pid = alloc_pid(); long nr; if (!pid) return -EAGAIN; nr = pid->nr; - if (unlikely(current->ptrace)) { - trace = fork_traceflag (clone_flags); - if (trace) - clone_flags |= CLONE_PTRACE; - } p = copy_process(clone_flags, stack_start, regs, stack_size, parent_tidptr, child_tidptr, nr); /* @@ -1384,28 +1397,26 @@ long do_fork(unsigned long clone_flags, init_completion(&vfork); } - if ((p->ptrace & PT_PTRACED) || (clone_flags & CLONE_STOPPED)) { + tracehook_report_clone(clone_flags, p); + + p->flags &= ~PF_STARTING; + + if (clone_flags & CLONE_STOPPED) { /* * We'll start up with an immediate SIGSTOP. */ sigaddset(&p->pending.signal, SIGSTOP); set_tsk_thread_flag(p, TIF_SIGPENDING); + p->state = TASK_STOPPED; } - - if (!(clone_flags & CLONE_STOPPED)) - wake_up_new_task(p, clone_flags); else - p->state = TASK_STOPPED; + wake_up_new_task(p, clone_flags); - if (unlikely (trace)) { - current->ptrace_message = nr; - ptrace_notify ((trace << 8) | SIGTRAP); - } + tracehook_report_clone_complete(clone_flags, nr, p); if (clone_flags & CLONE_VFORK) { wait_for_completion(&vfork); - if (unlikely (current->ptrace & PT_TRACE_VFORK_DONE)) - ptrace_notify ((PTRACE_EVENT_VFORK_DONE << 8) | SIGTRAP); + tracehook_report_vfork_done(p, nr); } } else { free_pid(pid); diff --git a/kernel/futex.c b/kernel/futex.c index c27bb560b..9d260e838 100644 --- a/kernel/futex.c +++ b/kernel/futex.c @@ -12,6 +12,10 @@ * (C) Copyright 2006 Red Hat Inc, All Rights Reserved * Thanks to Thomas Gleixner for suggestions, analysis and fixes. * + * PI-futex support started by Ingo Molnar and Thomas Gleixner + * Copyright (C) 2006 Red Hat, Inc., Ingo Molnar + * Copyright (C) 2006 Timesys Corp., Thomas Gleixner + * * Thanks to Ben LaHaise for yelling "hashed waitqueues" loudly * enough at me, Linus for the original (flawed) idea, Matthew * Kirkwood for proof-of-concept implementation. @@ -44,9 +48,10 @@ #include #include #include -#include #include +#include "rtmutex_common.h" + #define FUTEX_HASHBITS (CONFIG_BASE_SMALL ? 4 : 8) /* @@ -64,7 +69,7 @@ union futex_key { int offset; } shared; struct { - unsigned long uaddr; + unsigned long address; struct mm_struct *mm; int offset; } private; @@ -75,6 +80,27 @@ union futex_key { } both; }; +/* + * Priority Inheritance state: + */ +struct futex_pi_state { + /* + * list of 'owned' pi_state instances - these have to be + * cleaned up in do_exit() if the task exits prematurely: + */ + struct list_head list; + + /* + * The PI object: + */ + struct rt_mutex pi_mutex; + + struct task_struct *owner; + atomic_t refcount; + + union futex_key key; +}; + /* * We use this hashed waitqueue instead of a normal wait_queue_t, so * we can wake only the relevant ones (hashed queues may be shared). @@ -88,15 +114,19 @@ struct futex_q { struct list_head list; wait_queue_head_t waiters; - /* Which hash list lock to use. */ + /* Which hash list lock to use: */ spinlock_t *lock_ptr; - /* Key which the futex is hashed on. */ + /* Key which the futex is hashed on: */ union futex_key key; - /* For fd, sigio sent using these. */ + /* For fd, sigio sent using these: */ int fd; struct file *filp; + + /* Optional priority inheritance state: */ + struct futex_pi_state *pi_state; + struct task_struct *task; }; /* @@ -145,8 +175,9 @@ static inline int match_futex(union futex_key *key1, union futex_key *key2) * * Should be called with ¤t->mm->mmap_sem but NOT any spinlocks. */ -static int get_futex_key(unsigned long uaddr, union futex_key *key) +static int get_futex_key(u32 __user *uaddr, union futex_key *key) { + unsigned long address = (unsigned long)uaddr; struct mm_struct *mm = current->mm; struct vm_area_struct *vma; struct page *page; @@ -155,16 +186,16 @@ static int get_futex_key(unsigned long uaddr, union futex_key *key) /* * The futex address must be "naturally" aligned. */ - key->both.offset = uaddr % PAGE_SIZE; + key->both.offset = address % PAGE_SIZE; if (unlikely((key->both.offset % sizeof(u32)) != 0)) return -EINVAL; - uaddr -= key->both.offset; + address -= key->both.offset; /* * The futex is hashed differently depending on whether * it's in a shared or private mapping. So check vma first. */ - vma = find_extend_vma(mm, uaddr); + vma = find_extend_vma(mm, address); if (unlikely(!vma)) return -EFAULT; @@ -185,7 +216,7 @@ static int get_futex_key(unsigned long uaddr, union futex_key *key) */ if (likely(!(vma->vm_flags & VM_MAYSHARE))) { key->private.mm = mm; - key->private.uaddr = uaddr; + key->private.address = address; return 0; } @@ -195,7 +226,7 @@ static int get_futex_key(unsigned long uaddr, union futex_key *key) key->shared.inode = vma->vm_file->f_dentry->d_inode; key->both.offset++; /* Bit 0 of offset indicates inode-based key. */ if (likely(!(vma->vm_flags & VM_NONLINEAR))) { - key->shared.pgoff = (((uaddr - vma->vm_start) >> PAGE_SHIFT) + key->shared.pgoff = (((address - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff); return 0; } @@ -206,7 +237,7 @@ 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. */ - err = get_user_pages(current, mm, uaddr, 1, 0, 0, &page, NULL); + err = get_user_pages(current, mm, address, 1, 0, 0, &page, NULL); if (err >= 0) { key->shared.pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); @@ -247,17 +278,258 @@ static void drop_key_refs(union futex_key *key) } } -static inline int get_futex_value_locked(int *dest, int __user *from) +static inline int get_futex_value_locked(u32 *dest, u32 __user *from) { int ret; inc_preempt_count(); - ret = __copy_from_user_inatomic(dest, from, sizeof(int)); + ret = __copy_from_user_inatomic(dest, from, sizeof(u32)); dec_preempt_count(); return ret ? -EFAULT : 0; } +/* + * Fault handling. Called with current->mm->mmap_sem held. + */ +static int futex_handle_fault(unsigned long address, int attempt) +{ + struct vm_area_struct * vma; + struct mm_struct *mm = current->mm; + + if (attempt > 2 || !(vma = find_vma(mm, address)) || + vma->vm_start > address || !(vma->vm_flags & VM_WRITE)) + return -EFAULT; + + switch (handle_mm_fault(mm, vma, address, 1)) { + case VM_FAULT_MINOR: + current->min_flt++; + break; + case VM_FAULT_MAJOR: + current->maj_flt++; + break; + default: + return -EFAULT; + } + return 0; +} + +/* + * PI code: + */ +static int refill_pi_state_cache(void) +{ + struct futex_pi_state *pi_state; + + if (likely(current->pi_state_cache)) + return 0; + + pi_state = kmalloc(sizeof(*pi_state), GFP_KERNEL); + + if (!pi_state) + return -ENOMEM; + + memset(pi_state, 0, sizeof(*pi_state)); + INIT_LIST_HEAD(&pi_state->list); + /* pi_mutex gets initialized later */ + pi_state->owner = NULL; + atomic_set(&pi_state->refcount, 1); + + current->pi_state_cache = pi_state; + + return 0; +} + +static struct futex_pi_state * alloc_pi_state(void) +{ + struct futex_pi_state *pi_state = current->pi_state_cache; + + WARN_ON(!pi_state); + current->pi_state_cache = NULL; + + return pi_state; +} + +static void free_pi_state(struct futex_pi_state *pi_state) +{ + if (!atomic_dec_and_test(&pi_state->refcount)) + return; + + /* + * If pi_state->owner is NULL, the owner is most probably dying + * and has cleaned up the pi_state already + */ + if (pi_state->owner) { + spin_lock_irq(&pi_state->owner->pi_lock); + list_del_init(&pi_state->list); + spin_unlock_irq(&pi_state->owner->pi_lock); + + rt_mutex_proxy_unlock(&pi_state->pi_mutex, pi_state->owner); + } + + if (current->pi_state_cache) + kfree(pi_state); + else { + /* + * pi_state->list is already empty. + * clear pi_state->owner. + * refcount is at 0 - put it back to 1. + */ + pi_state->owner = NULL; + atomic_set(&pi_state->refcount, 1); + current->pi_state_cache = pi_state; + } +} + +/* + * Look up the task based on what TID userspace gave us. + * We dont trust it. + */ +static struct task_struct * futex_find_get_task(pid_t pid) +{ + struct task_struct *p; + + read_lock(&tasklist_lock); + p = find_task_by_pid(pid); + if (!p) + goto out_unlock; + if ((current->euid != p->euid) && (current->euid != p->uid)) { + p = NULL; + goto out_unlock; + } + if (p->exit_state != 0) { + p = NULL; + goto out_unlock; + } + get_task_struct(p); +out_unlock: + read_unlock(&tasklist_lock); + + return p; +} + +/* + * This task is holding PI mutexes at exit time => bad. + * Kernel cleans up PI-state, but userspace is likely hosed. + * (Robust-futex cleanup is separate and might save the day for userspace.) + */ +void exit_pi_state_list(struct task_struct *curr) +{ + struct list_head *next, *head = &curr->pi_state_list; + struct futex_pi_state *pi_state; + struct futex_hash_bucket *hb; + union futex_key key; + + /* + * We are a ZOMBIE and nobody can enqueue itself on + * pi_state_list anymore, but we have to be careful + * versus waiters unqueueing themselves: + */ + spin_lock_irq(&curr->pi_lock); + while (!list_empty(head)) { + + next = head->next; + pi_state = list_entry(next, struct futex_pi_state, list); + key = pi_state->key; + hb = hash_futex(&key); + spin_unlock_irq(&curr->pi_lock); + + spin_lock(&hb->lock); + + spin_lock_irq(&curr->pi_lock); + /* + * We dropped the pi-lock, so re-check whether this + * task still owns the PI-state: + */ + if (head->next != next) { + spin_unlock(&hb->lock); + continue; + } + + WARN_ON(pi_state->owner != curr); + WARN_ON(list_empty(&pi_state->list)); + list_del_init(&pi_state->list); + pi_state->owner = NULL; + spin_unlock_irq(&curr->pi_lock); + + rt_mutex_unlock(&pi_state->pi_mutex); + + spin_unlock(&hb->lock); + + spin_lock_irq(&curr->pi_lock); + } + spin_unlock_irq(&curr->pi_lock); +} + +static int +lookup_pi_state(u32 uval, struct futex_hash_bucket *hb, struct futex_q *me) +{ + struct futex_pi_state *pi_state = NULL; + struct futex_q *this, *next; + struct list_head *head; + struct task_struct *p; + pid_t pid; + + head = &hb->chain; + + list_for_each_entry_safe(this, next, head, list) { + if (match_futex(&this->key, &me->key)) { + /* + * Another waiter already exists - bump up + * the refcount and return its pi_state: + */ + pi_state = this->pi_state; + /* + * Userspace might have messed up non PI and PI futexes + */ + if (unlikely(!pi_state)) + return -EINVAL; + + WARN_ON(!atomic_read(&pi_state->refcount)); + + atomic_inc(&pi_state->refcount); + me->pi_state = pi_state; + + return 0; + } + } + + /* + * We are the first waiter - try to look up the real owner and attach + * the new pi_state to it, but bail out when the owner died bit is set + * and TID = 0: + */ + pid = uval & FUTEX_TID_MASK; + if (!pid && (uval & FUTEX_OWNER_DIED)) + return -ESRCH; + p = futex_find_get_task(pid); + if (!p) + return -ESRCH; + + pi_state = alloc_pi_state(); + + /* + * Initialize the pi_mutex in locked state and make 'p' + * the owner of it: + */ + rt_mutex_init_proxy_locked(&pi_state->pi_mutex, p); + + /* Store the key for possible exit cleanups: */ + pi_state->key = me->key; + + spin_lock_irq(&p->pi_lock); + WARN_ON(!list_empty(&pi_state->list)); + list_add(&pi_state->list, &p->pi_state_list); + pi_state->owner = p; + spin_unlock_irq(&p->pi_lock); + + put_task_struct(p); + + me->pi_state = pi_state; + + return 0; +} + /* * The hash bucket lock must be held when this is called. * Afterwards, the futex_q must not be accessed. @@ -285,16 +557,105 @@ static void wake_futex(struct futex_q *q) q->lock_ptr = NULL; } +static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_q *this) +{ + struct task_struct *new_owner; + struct futex_pi_state *pi_state = this->pi_state; + u32 curval, newval; + + if (!pi_state) + return -EINVAL; + + new_owner = rt_mutex_next_owner(&pi_state->pi_mutex); + + /* + * This happens when we have stolen the lock and the original + * pending owner did not enqueue itself back on the rt_mutex. + * Thats not a tragedy. We know that way, that a lock waiter + * is on the fly. We make the futex_q waiter the pending owner. + */ + if (!new_owner) + new_owner = this->task; + + /* + * We pass it to the next owner. (The WAITERS bit is always + * kept enabled while there is PI state around. We must also + * preserve the owner died bit.) + */ + if (!(uval & FUTEX_OWNER_DIED)) { + newval = FUTEX_WAITERS | new_owner->pid; + + inc_preempt_count(); + curval = futex_atomic_cmpxchg_inatomic(uaddr, uval, newval); + dec_preempt_count(); + if (curval == -EFAULT) + return -EFAULT; + if (curval != uval) + return -EINVAL; + } + + spin_lock_irq(&pi_state->owner->pi_lock); + WARN_ON(list_empty(&pi_state->list)); + list_del_init(&pi_state->list); + spin_unlock_irq(&pi_state->owner->pi_lock); + + spin_lock_irq(&new_owner->pi_lock); + WARN_ON(!list_empty(&pi_state->list)); + list_add(&pi_state->list, &new_owner->pi_state_list); + pi_state->owner = new_owner; + spin_unlock_irq(&new_owner->pi_lock); + + rt_mutex_unlock(&pi_state->pi_mutex); + + return 0; +} + +static int unlock_futex_pi(u32 __user *uaddr, u32 uval) +{ + u32 oldval; + + /* + * There is no waiter, so we unlock the futex. The owner died + * bit has not to be preserved here. We are the owner: + */ + inc_preempt_count(); + oldval = futex_atomic_cmpxchg_inatomic(uaddr, uval, 0); + dec_preempt_count(); + + if (oldval == -EFAULT) + return oldval; + if (oldval != uval) + return -EAGAIN; + + return 0; +} + +/* + * Express the locking dependencies for lockdep: + */ +static inline void +double_lock_hb(struct futex_hash_bucket *hb1, struct futex_hash_bucket *hb2) +{ + if (hb1 <= hb2) { + spin_lock(&hb1->lock); + if (hb1 < hb2) + spin_lock_nested(&hb2->lock, SINGLE_DEPTH_NESTING); + } else { /* hb1 > hb2 */ + spin_lock(&hb2->lock); + spin_lock_nested(&hb1->lock, SINGLE_DEPTH_NESTING); + } +} + /* * Wake up all waiters hashed on the physical page that is mapped * to this virtual address: */ -static int futex_wake(unsigned long uaddr, int nr_wake) +static int futex_wake(u32 __user *uaddr, int nr_wake) { - union futex_key key; - struct futex_hash_bucket *bh; - struct list_head *head; + struct futex_hash_bucket *hb; struct futex_q *this, *next; + struct list_head *head; + union futex_key key; int ret; down_read(¤t->mm->mmap_sem); @@ -303,19 +664,23 @@ static int futex_wake(unsigned long uaddr, int nr_wake) if (unlikely(ret != 0)) goto out; - bh = hash_futex(&key); - spin_lock(&bh->lock); - head = &bh->chain; + hb = hash_futex(&key); + spin_lock(&hb->lock); + head = &hb->chain; list_for_each_entry_safe(this, next, head, list) { if (match_futex (&this->key, &key)) { + if (this->pi_state) { + ret = -EINVAL; + break; + } wake_futex(this); if (++ret >= nr_wake) break; } } - spin_unlock(&bh->lock); + spin_unlock(&hb->lock); out: up_read(¤t->mm->mmap_sem); return ret; @@ -325,10 +690,12 @@ out: * Wake up all waiters hashed on the physical page that is mapped * to this virtual address: */ -static int futex_wake_op(unsigned long uaddr1, unsigned long uaddr2, int nr_wake, int nr_wake2, int op) +static int +futex_wake_op(u32 __user *uaddr1, u32 __user *uaddr2, + int nr_wake, int nr_wake2, int op) { union futex_key key1, key2; - struct futex_hash_bucket *bh1, *bh2; + struct futex_hash_bucket *hb1, *hb2; struct list_head *head; struct futex_q *this, *next; int ret, op_ret, attempt = 0; @@ -343,27 +710,25 @@ retryfull: if (unlikely(ret != 0)) goto out; - bh1 = hash_futex(&key1); - bh2 = hash_futex(&key2); + hb1 = hash_futex(&key1); + hb2 = hash_futex(&key2); retry: - if (bh1 < bh2) - spin_lock(&bh1->lock); - spin_lock(&bh2->lock); - if (bh1 > bh2) - spin_lock(&bh1->lock); + double_lock_hb(hb1, hb2); - op_ret = futex_atomic_op_inuser(op, (int __user *)uaddr2); + op_ret = futex_atomic_op_inuser(op, uaddr2); if (unlikely(op_ret < 0)) { - int dummy; + u32 dummy; - spin_unlock(&bh1->lock); - if (bh1 != bh2) - spin_unlock(&bh2->lock); + spin_unlock(&hb1->lock); + if (hb1 != hb2) + spin_unlock(&hb2->lock); #ifndef CONFIG_MMU - /* we don't get EFAULT from MMU faults if we don't have an MMU, - * but we might get them from range checking */ + /* + * we don't get EFAULT from MMU faults if we don't have an MMU, + * but we might get them from range checking + */ ret = op_ret; goto out; #endif @@ -373,47 +738,36 @@ retry: goto out; } - /* futex_atomic_op_inuser needs to both read and write + /* + * futex_atomic_op_inuser needs to both read and write * *(int __user *)uaddr2, but we can't modify it * non-atomically. Therefore, if get_user below is not * enough, we need to handle the fault ourselves, while - * still holding the mmap_sem. */ + * still holding the mmap_sem. + */ if (attempt++) { - struct vm_area_struct * vma; - struct mm_struct *mm = current->mm; - - ret = -EFAULT; - if (attempt >= 2 || - !(vma = find_vma(mm, uaddr2)) || - vma->vm_start > uaddr2 || - !(vma->vm_flags & VM_WRITE)) - goto out; - - switch (handle_mm_fault(mm, vma, uaddr2, 1)) { - case VM_FAULT_MINOR: - current->min_flt++; - break; - case VM_FAULT_MAJOR: - current->maj_flt++; - break; - default: + if (futex_handle_fault((unsigned long)uaddr2, + attempt)) { + ret = -EFAULT; goto out; } goto retry; } - /* If we would have faulted, release mmap_sem, - * fault it in and start all over again. */ + /* + * If we would have faulted, release mmap_sem, + * fault it in and start all over again. + */ up_read(¤t->mm->mmap_sem); - ret = get_user(dummy, (int __user *)uaddr2); + ret = get_user(dummy, uaddr2); if (ret) return ret; goto retryfull; } - head = &bh1->chain; + head = &hb1->chain; list_for_each_entry_safe(this, next, head, list) { if (match_futex (&this->key, &key1)) { @@ -424,7 +778,7 @@ retry: } if (op_ret > 0) { - head = &bh2->chain; + head = &hb2->chain; op_ret = 0; list_for_each_entry_safe(this, next, head, list) { @@ -437,9 +791,9 @@ retry: ret += op_ret; } - spin_unlock(&bh1->lock); - if (bh1 != bh2) - spin_unlock(&bh2->lock); + spin_unlock(&hb1->lock); + if (hb1 != hb2) + spin_unlock(&hb2->lock); out: up_read(¤t->mm->mmap_sem); return ret; @@ -449,11 +803,11 @@ out: * Requeue all waiters hashed on one physical page to another * physical page. */ -static int futex_requeue(unsigned long uaddr1, unsigned long uaddr2, - int nr_wake, int nr_requeue, int *valp) +static int futex_requeue(u32 __user *uaddr1, u32 __user *uaddr2, + int nr_wake, int nr_requeue, u32 *cmpval) { union futex_key key1, key2; - struct futex_hash_bucket *bh1, *bh2; + struct futex_hash_bucket *hb1, *hb2; struct list_head *head1; struct futex_q *this, *next; int ret, drop_count = 0; @@ -468,68 +822,68 @@ static int futex_requeue(unsigned long uaddr1, unsigned long uaddr2, if (unlikely(ret != 0)) goto out; - bh1 = hash_futex(&key1); - bh2 = hash_futex(&key2); + hb1 = hash_futex(&key1); + hb2 = hash_futex(&key2); - if (bh1 < bh2) - spin_lock(&bh1->lock); - spin_lock(&bh2->lock); - if (bh1 > bh2) - spin_lock(&bh1->lock); + double_lock_hb(hb1, hb2); - if (likely(valp != NULL)) { - int curval; + if (likely(cmpval != NULL)) { + u32 curval; - ret = get_futex_value_locked(&curval, (int __user *)uaddr1); + ret = get_futex_value_locked(&curval, uaddr1); if (unlikely(ret)) { - spin_unlock(&bh1->lock); - if (bh1 != bh2) - spin_unlock(&bh2->lock); + spin_unlock(&hb1->lock); + if (hb1 != hb2) + spin_unlock(&hb2->lock); - /* If we would have faulted, release mmap_sem, fault + /* + * If we would have faulted, release mmap_sem, fault * it in and start all over again. */ up_read(¤t->mm->mmap_sem); - ret = get_user(curval, (int __user *)uaddr1); + ret = get_user(curval, uaddr1); if (!ret) goto retry; return ret; } - if (curval != *valp) { + if (curval != *cmpval) { ret = -EAGAIN; goto out_unlock; } } - head1 = &bh1->chain; + head1 = &hb1->chain; list_for_each_entry_safe(this, next, head1, list) { if (!match_futex (&this->key, &key1)) continue; if (++ret <= nr_wake) { wake_futex(this); } else { - list_move_tail(&this->list, &bh2->chain); - this->lock_ptr = &bh2->lock; + /* + * If key1 and key2 hash to the same bucket, no need to + * requeue. + */ + if (likely(head1 != &hb2->chain)) { + list_move_tail(&this->list, &hb2->chain); + this->lock_ptr = &hb2->lock; + } this->key = key2; get_key_refs(&key2); drop_count++; if (ret - nr_wake >= nr_requeue) break; - /* Make sure to stop if key1 == key2 */ - if (head1 == &bh2->chain && head1 != &next->list) - head1 = &this->list; } } out_unlock: - spin_unlock(&bh1->lock); - if (bh1 != bh2) - spin_unlock(&bh2->lock); + spin_unlock(&hb1->lock); + if (hb1 != hb2) + spin_unlock(&hb2->lock); /* drop_key_refs() must be called outside the spinlocks. */ while (--drop_count >= 0) @@ -544,7 +898,7 @@ out: static inline struct futex_hash_bucket * queue_lock(struct futex_q *q, int fd, struct file *filp) { - struct futex_hash_bucket *bh; + struct futex_hash_bucket *hb; q->fd = fd; q->filp = filp; @@ -552,23 +906,24 @@ queue_lock(struct futex_q *q, int fd, struct file *filp) init_waitqueue_head(&q->waiters); get_key_refs(&q->key); - bh = hash_futex(&q->key); - q->lock_ptr = &bh->lock; + hb = hash_futex(&q->key); + q->lock_ptr = &hb->lock; - spin_lock(&bh->lock); - return bh; + spin_lock(&hb->lock); + return hb; } -static inline void __queue_me(struct futex_q *q, struct futex_hash_bucket *bh) +static inline void __queue_me(struct futex_q *q, struct futex_hash_bucket *hb) { - list_add_tail(&q->list, &bh->chain); - spin_unlock(&bh->lock); + list_add_tail(&q->list, &hb->chain); + q->task = current; + spin_unlock(&hb->lock); } static inline void -queue_unlock(struct futex_q *q, struct futex_hash_bucket *bh) +queue_unlock(struct futex_q *q, struct futex_hash_bucket *hb) { - spin_unlock(&bh->lock); + spin_unlock(&hb->lock); drop_key_refs(&q->key); } @@ -580,16 +935,17 @@ queue_unlock(struct futex_q *q, struct futex_hash_bucket *bh) /* The key must be already stored in q->key. */ static void queue_me(struct futex_q *q, int fd, struct file *filp) { - struct futex_hash_bucket *bh; - bh = queue_lock(q, fd, filp); - __queue_me(q, bh); + struct futex_hash_bucket *hb; + + hb = queue_lock(q, fd, filp); + __queue_me(q, hb); } /* Return 1 if we were still queued (ie. 0 means we were woken) */ static int unqueue_me(struct futex_q *q) { - int ret = 0; spinlock_t *lock_ptr; + int ret = 0; /* In the common case we don't take the spinlock, which is nice. */ retry: @@ -616,6 +972,9 @@ static int unqueue_me(struct futex_q *q) } WARN_ON(list_empty(&q->list)); list_del(&q->list); + + BUG_ON(q->pi_state); + spin_unlock(lock_ptr); ret = 1; } @@ -624,21 +983,42 @@ static int unqueue_me(struct futex_q *q) return ret; } -static int futex_wait(unsigned long uaddr, int val, unsigned long time) +/* + * PI futexes can not be requeued and must remove themself from the + * hash bucket. The hash bucket lock is held on entry and dropped here. + */ +static void unqueue_me_pi(struct futex_q *q, struct futex_hash_bucket *hb) +{ + WARN_ON(list_empty(&q->list)); + list_del(&q->list); + + BUG_ON(!q->pi_state); + free_pi_state(q->pi_state); + q->pi_state = NULL; + + spin_unlock(&hb->lock); + + drop_key_refs(&q->key); +} + +static int futex_wait(u32 __user *uaddr, u32 val, unsigned long time) { - DECLARE_WAITQUEUE(wait, current); - int ret, curval; + struct task_struct *curr = current; + DECLARE_WAITQUEUE(wait, curr); + struct futex_hash_bucket *hb; struct futex_q q; - struct futex_hash_bucket *bh; + u32 uval; + int ret; + q.pi_state = NULL; retry: - down_read(¤t->mm->mmap_sem); + down_read(&curr->mm->mmap_sem); ret = get_futex_key(uaddr, &q.key); if (unlikely(ret != 0)) goto out_release_sem; - bh = queue_lock(&q, -1, NULL); + hb = queue_lock(&q, -1, NULL); /* * Access the page AFTER the futex is queued. @@ -660,37 +1040,35 @@ static int futex_wait(unsigned long uaddr, int val, unsigned long time) * We hold the mmap semaphore, so the mapping cannot have changed * since we looked it up in get_futex_key. */ - - ret = get_futex_value_locked(&curval, (int __user *)uaddr); + ret = get_futex_value_locked(&uval, uaddr); if (unlikely(ret)) { - queue_unlock(&q, bh); + queue_unlock(&q, hb); - /* If we would have faulted, release mmap_sem, fault it in and + /* + * If we would have faulted, release mmap_sem, fault it in and * start all over again. */ - up_read(¤t->mm->mmap_sem); + up_read(&curr->mm->mmap_sem); - ret = get_user(curval, (int __user *)uaddr); + ret = get_user(uval, uaddr); if (!ret) goto retry; return ret; } - if (curval != val) { - ret = -EWOULDBLOCK; - queue_unlock(&q, bh); - goto out_release_sem; - } + ret = -EWOULDBLOCK; + if (uval != val) + goto out_unlock_release_sem; /* Only actually queue if *uaddr contained val. */ - __queue_me(&q, bh); + __queue_me(&q, hb); /* * Now the futex is queued and we have checked the data, we * don't want to hold mmap_sem while we sleep. - */ - up_read(¤t->mm->mmap_sem); + */ + up_read(&curr->mm->mmap_sem); /* * There might have been scheduling since the queue_me(), as we @@ -722,12 +1100,367 @@ static int futex_wait(unsigned long uaddr, int val, unsigned long time) return 0; if (time == 0) return -ETIMEDOUT; - /* We expect signal_pending(current), but another thread may - * have handled it for us already. */ + /* + * We expect signal_pending(current), but another thread may + * have handled it for us already. + */ return -EINTR; + out_unlock_release_sem: + queue_unlock(&q, hb); + + out_release_sem: + up_read(&curr->mm->mmap_sem); + return ret; +} + +/* + * Userspace tried a 0 -> TID atomic transition of the futex value + * and failed. The kernel side here does the whole locking operation: + * if there are waiters then it will block, it does PI, etc. (Due to + * races the kernel might see a 0 value of the futex too.) + */ +static int futex_lock_pi(u32 __user *uaddr, int detect, unsigned long sec, + long nsec, int trylock) +{ + struct hrtimer_sleeper timeout, *to = NULL; + struct task_struct *curr = current; + struct futex_hash_bucket *hb; + u32 uval, newval, curval; + struct futex_q q; + int ret, attempt = 0; + + if (refill_pi_state_cache()) + return -ENOMEM; + + if (sec != MAX_SCHEDULE_TIMEOUT) { + to = &timeout; + hrtimer_init(&to->timer, CLOCK_REALTIME, HRTIMER_ABS); + hrtimer_init_sleeper(to, current); + to->timer.expires = ktime_set(sec, nsec); + } + + q.pi_state = NULL; + retry: + down_read(&curr->mm->mmap_sem); + + ret = get_futex_key(uaddr, &q.key); + if (unlikely(ret != 0)) + goto out_release_sem; + + hb = queue_lock(&q, -1, NULL); + + retry_locked: + /* + * To avoid races, we attempt to take the lock here again + * (by doing a 0 -> TID atomic cmpxchg), while holding all + * the locks. It will most likely not succeed. + */ + newval = current->pid; + + inc_preempt_count(); + curval = futex_atomic_cmpxchg_inatomic(uaddr, 0, newval); + dec_preempt_count(); + + if (unlikely(curval == -EFAULT)) + goto uaddr_faulted; + + /* We own the lock already */ + if (unlikely((curval & FUTEX_TID_MASK) == current->pid)) { + if (!detect && 0) + force_sig(SIGKILL, current); + ret = -EDEADLK; + goto out_unlock_release_sem; + } + + /* + * Surprise - we got the lock. Just return + * to userspace: + */ + if (unlikely(!curval)) + goto out_unlock_release_sem; + + uval = curval; + newval = uval | FUTEX_WAITERS; + + inc_preempt_count(); + curval = futex_atomic_cmpxchg_inatomic(uaddr, uval, newval); + dec_preempt_count(); + + if (unlikely(curval == -EFAULT)) + goto uaddr_faulted; + if (unlikely(curval != uval)) + goto retry_locked; + + /* + * We dont have the lock. Look up the PI state (or create it if + * we are the first waiter): + */ + ret = lookup_pi_state(uval, hb, &q); + + if (unlikely(ret)) { + /* + * There were no waiters and the owner task lookup + * failed. When the OWNER_DIED bit is set, then we + * know that this is a robust futex and we actually + * take the lock. This is safe as we are protected by + * the hash bucket lock. We also set the waiters bit + * unconditionally here, to simplify glibc handling of + * multiple tasks racing to acquire the lock and + * cleanup the problems which were left by the dead + * owner. + */ + if (curval & FUTEX_OWNER_DIED) { + uval = newval; + newval = current->pid | + FUTEX_OWNER_DIED | FUTEX_WAITERS; + + inc_preempt_count(); + curval = futex_atomic_cmpxchg_inatomic(uaddr, + uval, newval); + dec_preempt_count(); + + if (unlikely(curval == -EFAULT)) + goto uaddr_faulted; + if (unlikely(curval != uval)) + goto retry_locked; + ret = 0; + } + goto out_unlock_release_sem; + } + + /* + * Only actually queue now that the atomic ops are done: + */ + __queue_me(&q, hb); + + /* + * Now the futex is queued and we have checked the data, we + * don't want to hold mmap_sem while we sleep. + */ + up_read(&curr->mm->mmap_sem); + + WARN_ON(!q.pi_state); + /* + * Block on the PI mutex: + */ + if (!trylock) + ret = rt_mutex_timed_lock(&q.pi_state->pi_mutex, to, 1); + else { + ret = rt_mutex_trylock(&q.pi_state->pi_mutex); + /* Fixup the trylock return value: */ + ret = ret ? 0 : -EWOULDBLOCK; + } + + down_read(&curr->mm->mmap_sem); + spin_lock(q.lock_ptr); + + /* + * Got the lock. We might not be the anticipated owner if we + * did a lock-steal - fix up the PI-state in that case. + */ + if (!ret && q.pi_state->owner != curr) { + u32 newtid = current->pid | FUTEX_WAITERS; + + /* Owner died? */ + if (q.pi_state->owner != NULL) { + spin_lock_irq(&q.pi_state->owner->pi_lock); + WARN_ON(list_empty(&q.pi_state->list)); + list_del_init(&q.pi_state->list); + spin_unlock_irq(&q.pi_state->owner->pi_lock); + } else + newtid |= FUTEX_OWNER_DIED; + + q.pi_state->owner = current; + + spin_lock_irq(¤t->pi_lock); + WARN_ON(!list_empty(&q.pi_state->list)); + list_add(&q.pi_state->list, ¤t->pi_state_list); + spin_unlock_irq(¤t->pi_lock); + + /* Unqueue and drop the lock */ + unqueue_me_pi(&q, hb); + up_read(&curr->mm->mmap_sem); + /* + * We own it, so we have to replace the pending owner + * TID. This must be atomic as we have preserve the + * owner died bit here. + */ + ret = get_user(uval, uaddr); + while (!ret) { + newval = (uval & FUTEX_OWNER_DIED) | newtid; + curval = futex_atomic_cmpxchg_inatomic(uaddr, + uval, newval); + if (curval == -EFAULT) + ret = -EFAULT; + if (curval == uval) + break; + uval = curval; + } + } else { + /* + * Catch the rare case, where the lock was released + * when we were on the way back before we locked + * the hash bucket. + */ + if (ret && q.pi_state->owner == curr) { + if (rt_mutex_trylock(&q.pi_state->pi_mutex)) + ret = 0; + } + /* Unqueue and drop the lock */ + unqueue_me_pi(&q, hb); + up_read(&curr->mm->mmap_sem); + } + + if (!detect && ret == -EDEADLK && 0) + force_sig(SIGKILL, current); + + return ret != -EINTR ? ret : -ERESTARTNOINTR; + + out_unlock_release_sem: + queue_unlock(&q, hb); + out_release_sem: + up_read(&curr->mm->mmap_sem); + return ret; + + uaddr_faulted: + /* + * We have to r/w *(int __user *)uaddr, but we can't modify it + * non-atomically. Therefore, if get_user below is not + * enough, we need to handle the fault ourselves, while + * still holding the mmap_sem. + */ + if (attempt++) { + if (futex_handle_fault((unsigned long)uaddr, attempt)) { + ret = -EFAULT; + goto out_unlock_release_sem; + } + goto retry_locked; + } + + queue_unlock(&q, hb); + up_read(&curr->mm->mmap_sem); + + ret = get_user(uval, uaddr); + if (!ret && (uval != -EFAULT)) + goto retry; + + return ret; +} + +/* + * Userspace attempted a TID -> 0 atomic transition, and failed. + * This is the in-kernel slowpath: we look up the PI state (if any), + * and do the rt-mutex unlock. + */ +static int futex_unlock_pi(u32 __user *uaddr) +{ + struct futex_hash_bucket *hb; + struct futex_q *this, *next; + u32 uval; + struct list_head *head; + union futex_key key; + int ret, attempt = 0; + +retry: + if (get_user(uval, uaddr)) + return -EFAULT; + /* + * We release only a lock we actually own: + */ + if ((uval & FUTEX_TID_MASK) != current->pid) + return -EPERM; + /* + * First take all the futex related locks: + */ + down_read(¤t->mm->mmap_sem); + + ret = get_futex_key(uaddr, &key); + if (unlikely(ret != 0)) + goto out; + + hb = hash_futex(&key); + spin_lock(&hb->lock); + +retry_locked: + /* + * To avoid races, try to do the TID -> 0 atomic transition + * again. If it succeeds then we can return without waking + * anyone else up: + */ + if (!(uval & FUTEX_OWNER_DIED)) { + inc_preempt_count(); + uval = futex_atomic_cmpxchg_inatomic(uaddr, current->pid, 0); + dec_preempt_count(); + } + + if (unlikely(uval == -EFAULT)) + goto pi_faulted; + /* + * Rare case: we managed to release the lock atomically, + * no need to wake anyone else up: + */ + if (unlikely(uval == current->pid)) + goto out_unlock; + + /* + * Ok, other tasks may need to be woken up - check waiters + * and do the wakeup if necessary: + */ + head = &hb->chain; + + list_for_each_entry_safe(this, next, head, list) { + if (!match_futex (&this->key, &key)) + continue; + ret = wake_futex_pi(uaddr, uval, this); + /* + * The atomic access to the futex value + * generated a pagefault, so retry the + * user-access and the wakeup: + */ + if (ret == -EFAULT) + goto pi_faulted; + goto out_unlock; + } + /* + * No waiters - kernel unlocks the futex: + */ + if (!(uval & FUTEX_OWNER_DIED)) { + ret = unlock_futex_pi(uaddr, uval); + if (ret == -EFAULT) + goto pi_faulted; + } + +out_unlock: + spin_unlock(&hb->lock); +out: up_read(¤t->mm->mmap_sem); + + return ret; + +pi_faulted: + /* + * We have to r/w *(int __user *)uaddr, but we can't modify it + * non-atomically. Therefore, if get_user below is not + * enough, we need to handle the fault ourselves, while + * still holding the mmap_sem. + */ + if (attempt++) { + if (futex_handle_fault((unsigned long)uaddr, attempt)) { + ret = -EFAULT; + goto out_unlock; + } + goto retry_locked; + } + + spin_unlock(&hb->lock); + up_read(¤t->mm->mmap_sem); + + ret = get_user(uval, uaddr); + if (!ret && (uval != -EFAULT)) + goto retry; + return ret; } @@ -737,6 +1470,7 @@ static int futex_close(struct inode *inode, struct file *filp) unqueue_me(q); kfree(q); + return 0; } @@ -768,7 +1502,7 @@ static struct file_operations futex_fops = { * Signal allows caller to avoid the race which would occur if they * set the sigio stuff up afterwards. */ -static int futex_fd(unsigned long uaddr, int signal) +static int futex_fd(u32 __user *uaddr, int signal) { struct futex_q *q; struct file *filp; @@ -805,6 +1539,7 @@ static int futex_fd(unsigned long uaddr, int signal) err = -ENOMEM; goto error; } + q->pi_state = NULL; down_read(¤t->mm->mmap_sem); err = get_futex_key(uaddr, &q->key); @@ -842,7 +1577,7 @@ error: * Implementation: user-space maintains a per-thread list of locks it * is holding. Upon do_exit(), the kernel carefully walks this list, * and marks all locks that are owned by this thread with the - * FUTEX_OWNER_DEAD bit, and wakes up a waiter (if any). The list is + * FUTEX_OWNER_DIED bit, and wakes up a waiter (if any). The list is * always manipulated with the lock held, so the list is private and * per-thread. Userspace also maintains a per-thread 'list_op_pending' * field, to allow the kernel to clean up if the thread dies after @@ -915,9 +1650,9 @@ err_unlock: * Process a futex-list entry, check whether it's owned by the * dying task, and do notification if so: */ -int handle_futex_death(u32 __user *uaddr, struct task_struct *curr) +int handle_futex_death(u32 __user *uaddr, struct task_struct *curr, int pi) { - u32 uval; + u32 uval, nval, mval; retry: if (get_user(uval, uaddr)) @@ -934,16 +1669,44 @@ retry: * thread-death.) The rest of the cleanup is done in * userspace. */ - if (futex_atomic_cmpxchg_inatomic(uaddr, uval, - uval | FUTEX_OWNER_DIED) != uval) + mval = (uval & FUTEX_WAITERS) | FUTEX_OWNER_DIED; + nval = futex_atomic_cmpxchg_inatomic(uaddr, uval, mval); + + if (nval == -EFAULT) + return -1; + + if (nval != uval) goto retry; - if (uval & FUTEX_WAITERS) - futex_wake((unsigned long)uaddr, 1); + /* + * Wake robust non-PI futexes here. The wakeup of + * PI futexes happens in exit_pi_state(): + */ + if (!pi) { + if (uval & FUTEX_WAITERS) + futex_wake(uaddr, 1); + } } return 0; } +/* + * Fetch a robust-list pointer. Bit 0 signals PI futexes: + */ +static inline int fetch_robust_entry(struct robust_list __user **entry, + struct robust_list __user **head, int *pi) +{ + unsigned long uentry; + + if (get_user(uentry, (unsigned long *)head)) + return -EFAULT; + + *entry = (void *)(uentry & ~1UL); + *pi = uentry & 1; + + return 0; +} + /* * Walk curr->robust_list (very carefully, it's a userspace list!) * and mark any locks found there dead, and notify any waiters. @@ -954,14 +1717,14 @@ void exit_robust_list(struct task_struct *curr) { struct robust_list_head __user *head = curr->robust_list; struct robust_list __user *entry, *pending; - unsigned int limit = ROBUST_LIST_LIMIT; + unsigned int limit = ROBUST_LIST_LIMIT, pi, pip; unsigned long futex_offset; /* * Fetch the list head (which was registered earlier, via * sys_set_robust_list()): */ - if (get_user(entry, &head->list.next)) + if (fetch_robust_entry(&entry, &head->list.next, &pi)) return; /* * Fetch the relative futex offset: @@ -972,24 +1735,25 @@ void exit_robust_list(struct task_struct *curr) * Fetch any possibly pending lock-add first, and handle it * if it exists: */ - if (get_user(pending, &head->list_op_pending)) + if (fetch_robust_entry(&pending, &head->list_op_pending, &pip)) return; + if (pending) - handle_futex_death((void *)pending + futex_offset, curr); + handle_futex_death((void *)pending + futex_offset, curr, pip); while (entry != &head->list) { /* * A pending lock might already be on the list, so - * dont process it twice: + * don't process it twice: */ if (entry != pending) if (handle_futex_death((void *)entry + futex_offset, - curr)) + curr, pi)) return; /* * Fetch the next entry in the list: */ - if (get_user(entry, &entry->next)) + if (fetch_robust_entry(&entry, &entry->next, &pi)) return; /* * Avoid excessively long or circular lists: @@ -1001,8 +1765,8 @@ void exit_robust_list(struct task_struct *curr) } } -long do_futex(unsigned long uaddr, int op, int val, unsigned long timeout, - unsigned long uaddr2, int val2, int val3) +long do_futex(u32 __user *uaddr, int op, u32 val, unsigned long timeout, + u32 __user *uaddr2, u32 val2, u32 val3) { int ret; @@ -1026,6 +1790,15 @@ long do_futex(unsigned long uaddr, int op, int val, unsigned long timeout, case FUTEX_WAKE_OP: ret = futex_wake_op(uaddr, uaddr2, val, val2, val3); break; + case FUTEX_LOCK_PI: + ret = futex_lock_pi(uaddr, val, timeout, val2, 0); + break; + case FUTEX_UNLOCK_PI: + ret = futex_unlock_pi(uaddr); + break; + case FUTEX_TRYLOCK_PI: + ret = futex_lock_pi(uaddr, 0, timeout, val2, 1); + break; default: ret = -ENOSYS; } @@ -1033,36 +1806,40 @@ long do_futex(unsigned long uaddr, int op, int val, unsigned long timeout, } -asmlinkage long sys_futex(u32 __user *uaddr, int op, int val, +asmlinkage long sys_futex(u32 __user *uaddr, int op, u32 val, struct timespec __user *utime, u32 __user *uaddr2, - int val3) + u32 val3) { struct timespec t; unsigned long timeout = MAX_SCHEDULE_TIMEOUT; - int val2 = 0; + u32 val2 = 0; - if (utime && (op == FUTEX_WAIT)) { + if (utime && (op == FUTEX_WAIT || op == FUTEX_LOCK_PI)) { if (copy_from_user(&t, utime, sizeof(t)) != 0) return -EFAULT; if (!timespec_valid(&t)) return -EINVAL; - timeout = timespec_to_jiffies(&t) + 1; + if (op == FUTEX_WAIT) + timeout = timespec_to_jiffies(&t) + 1; + else { + timeout = t.tv_sec; + val2 = t.tv_nsec; + } } /* * requeue parameter in 'utime' if op == FUTEX_REQUEUE. */ - if (op >= FUTEX_REQUEUE) - val2 = (int) (unsigned long) utime; + if (op == FUTEX_REQUEUE || op == FUTEX_CMP_REQUEUE) + val2 = (u32) (unsigned long) utime; - return do_futex((unsigned long)uaddr, op, val, timeout, - (unsigned long)uaddr2, val2, val3); + return do_futex(uaddr, op, val, timeout, uaddr2, val2, val3); } -static struct super_block * -futexfs_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int futexfs_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, + struct vfsmount *mnt) { - return get_sb_pseudo(fs_type, "futex", NULL, 0xBAD1DEA); + return get_sb_pseudo(fs_type, "futex", NULL, 0xBAD1DEA, mnt); } static struct file_system_type futex_fs_type = { diff --git a/kernel/futex_compat.c b/kernel/futex_compat.c index 7694027f5..c5cca3f65 100644 --- a/kernel/futex_compat.c +++ b/kernel/futex_compat.c @@ -9,10 +9,26 @@ #include #include #include -#include #include + +/* + * Fetch a robust-list pointer. Bit 0 signals PI futexes: + */ +static inline int +fetch_robust_entry(compat_uptr_t *uentry, struct robust_list __user **entry, + compat_uptr_t *head, int *pi) +{ + if (get_user(*uentry, head)) + return -EFAULT; + + *entry = compat_ptr((*uentry) & ~1); + *pi = (unsigned int)(*uentry) & 1; + + return 0; +} + /* * Walk curr->robust_list (very carefully, it's a userspace list!) * and mark any locks found there dead, and notify any waiters. @@ -23,17 +39,16 @@ void compat_exit_robust_list(struct task_struct *curr) { struct compat_robust_list_head __user *head = curr->compat_robust_list; struct robust_list __user *entry, *pending; + unsigned int limit = ROBUST_LIST_LIMIT, pi, pip; compat_uptr_t uentry, upending; - unsigned int limit = ROBUST_LIST_LIMIT; compat_long_t futex_offset; /* * Fetch the list head (which was registered earlier, via * sys_set_robust_list()): */ - if (get_user(uentry, &head->list.next)) + if (fetch_robust_entry(&uentry, &entry, &head->list.next, &pi)) return; - entry = compat_ptr(uentry); /* * Fetch the relative futex offset: */ @@ -43,11 +58,11 @@ void compat_exit_robust_list(struct task_struct *curr) * Fetch any possibly pending lock-add first, and handle it * if it exists: */ - if (get_user(upending, &head->list_op_pending)) + if (fetch_robust_entry(&upending, &pending, + &head->list_op_pending, &pip)) return; - pending = compat_ptr(upending); if (upending) - handle_futex_death((void *)pending + futex_offset, curr); + handle_futex_death((void *)pending + futex_offset, curr, pip); while (compat_ptr(uentry) != &head->list) { /* @@ -56,15 +71,15 @@ void compat_exit_robust_list(struct task_struct *curr) */ if (entry != pending) if (handle_futex_death((void *)entry + futex_offset, - curr)) + curr, pi)) return; /* * Fetch the next entry in the list: */ - if (get_user(uentry, (compat_uptr_t *)&entry->next)) + if (fetch_robust_entry(&uentry, &entry, + (compat_uptr_t *)&entry->next, &pi)) return; - entry = compat_ptr(uentry); /* * Avoid excessively long or circular lists: */ @@ -130,16 +145,20 @@ asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val, unsigned long timeout = MAX_SCHEDULE_TIMEOUT; int val2 = 0; - if (utime && (op == FUTEX_WAIT)) { + if (utime && (op == FUTEX_WAIT || op == FUTEX_LOCK_PI)) { if (get_compat_timespec(&t, utime)) return -EFAULT; if (!timespec_valid(&t)) return -EINVAL; - timeout = timespec_to_jiffies(&t) + 1; + if (op == FUTEX_WAIT) + timeout = timespec_to_jiffies(&t) + 1; + else { + timeout = t.tv_sec; + val2 = t.tv_nsec; + } } - if (op >= FUTEX_REQUEUE) + if (op == FUTEX_REQUEUE || op == FUTEX_CMP_REQUEUE) val2 = (int) (unsigned long) utime; - return do_futex((unsigned long)uaddr, op, val, timeout, - (unsigned long)uaddr2, val2, val3); + return do_futex(uaddr, op, val, timeout, uaddr2, val2, val3); } diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index 01fa2ae98..21c38a7e6 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c @@ -98,7 +98,6 @@ static DEFINE_PER_CPU(struct hrtimer_base, hrtimer_bases[MAX_HRTIMER_BASES]) = /** * ktime_get_ts - get the monotonic clock in timespec format - * * @ts: pointer to timespec variable * * The function calculates the monotonic clock from the realtime @@ -188,7 +187,7 @@ switch_hrtimer_base(struct hrtimer *timer, struct hrtimer_base *base) { struct hrtimer_base *new_base; - new_base = &__get_cpu_var(hrtimer_bases[base->index]); + new_base = &__get_cpu_var(hrtimer_bases)[base->index]; if (base != new_base) { /* @@ -238,7 +237,6 @@ lock_hrtimer_base(const struct hrtimer *timer, unsigned long *flags) # ifndef CONFIG_KTIME_SCALAR /** * ktime_add_ns - Add a scalar nanoseconds value to a ktime_t variable - * * @kt: addend * @nsec: the scalar nsec value to add * @@ -299,7 +297,6 @@ void unlock_hrtimer_base(const struct hrtimer *timer, unsigned long *flags) /** * hrtimer_forward - forward the timer expiry - * * @timer: hrtimer to forward * @now: forward past this time * @interval: the interval to forward @@ -393,7 +390,7 @@ static void __remove_hrtimer(struct hrtimer *timer, struct hrtimer_base *base) if (base->first == &timer->node) base->first = rb_next(&timer->node); rb_erase(&timer->node, &base->active); - timer->node.rb_parent = HRTIMER_INACTIVE; + rb_set_parent(&timer->node, &timer->node); } /* @@ -411,7 +408,6 @@ remove_hrtimer(struct hrtimer *timer, struct hrtimer_base *base) /** * hrtimer_start - (re)start an relative timer on the current CPU - * * @timer: the timer to be added * @tim: expiry time * @mode: expiry mode: absolute (HRTIMER_ABS) or relative (HRTIMER_REL) @@ -460,14 +456,13 @@ EXPORT_SYMBOL_GPL(hrtimer_start); /** * hrtimer_try_to_cancel - try to deactivate a timer - * * @timer: hrtimer to stop * * Returns: * 0 when the timer was not active * 1 when the timer was active * -1 when the timer is currently excuting the callback function and - * can not be stopped + * cannot be stopped */ int hrtimer_try_to_cancel(struct hrtimer *timer) { @@ -489,7 +484,6 @@ EXPORT_SYMBOL_GPL(hrtimer_try_to_cancel); /** * hrtimer_cancel - cancel a timer and wait for the handler to finish. - * * @timer: the timer to be cancelled * * Returns: @@ -510,7 +504,6 @@ EXPORT_SYMBOL_GPL(hrtimer_cancel); /** * hrtimer_get_remaining - get remaining time for the timer - * * @timer: the timer to read */ ktime_t hrtimer_get_remaining(const struct hrtimer *timer) @@ -564,7 +557,6 @@ ktime_t hrtimer_get_next_event(void) /** * hrtimer_init - initialize a timer to the given clock - * * @timer: the timer to be initialized * @clock_id: the clock to be used * @mode: timer mode abs/rel @@ -576,19 +568,18 @@ void hrtimer_init(struct hrtimer *timer, clockid_t clock_id, memset(timer, 0, sizeof(struct hrtimer)); - bases = per_cpu(hrtimer_bases, raw_smp_processor_id()); + bases = __raw_get_cpu_var(hrtimer_bases); if (clock_id == CLOCK_REALTIME && mode != HRTIMER_ABS) clock_id = CLOCK_MONOTONIC; timer->base = &bases[clock_id]; - timer->node.rb_parent = HRTIMER_INACTIVE; + rb_set_parent(&timer->node, &timer->node); } EXPORT_SYMBOL_GPL(hrtimer_init); /** * hrtimer_get_res - get the timer resolution for a clock - * * @which_clock: which clock to query * @tp: pointer to timespec variable to store the resolution * @@ -599,7 +590,7 @@ int hrtimer_get_res(const clockid_t which_clock, struct timespec *tp) { struct hrtimer_base *bases; - bases = per_cpu(hrtimer_bases, raw_smp_processor_id()); + bases = __raw_get_cpu_var(hrtimer_bases); *tp = ktime_to_timespec(bases[which_clock].resolution); return 0; @@ -678,7 +669,7 @@ static int hrtimer_wakeup(struct hrtimer *timer) return HRTIMER_NORESTART; } -void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, task_t *task) +void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, struct task_struct *task) { sl->timer.function = hrtimer_wakeup; sl->task = task; @@ -791,8 +782,10 @@ static void __devinit init_hrtimers_cpu(int cpu) struct hrtimer_base *base = per_cpu(hrtimer_bases, cpu); int i; - for (i = 0; i < MAX_HRTIMER_BASES; i++, base++) + for (i = 0; i < MAX_HRTIMER_BASES; i++, base++) { spin_lock_init(&base->lock); + lockdep_set_class(&base->lock, &base->lock_key); + } } #ifdef CONFIG_HOTPLUG_CPU @@ -842,7 +835,7 @@ static void migrate_hrtimers(int cpu) } #endif /* CONFIG_HOTPLUG_CPU */ -static int hrtimer_cpu_notify(struct notifier_block *self, +static int __cpuinit hrtimer_cpu_notify(struct notifier_block *self, unsigned long action, void *hcpu) { long cpu = (long)hcpu; @@ -866,7 +859,7 @@ static int hrtimer_cpu_notify(struct notifier_block *self, return NOTIFY_OK; } -static struct notifier_block hrtimers_nb = { +static struct notifier_block __cpuinitdata hrtimers_nb = { .notifier_call = hrtimer_cpu_notify, }; diff --git a/kernel/intermodule.c b/kernel/intermodule.c deleted file mode 100644 index 55b1e5b85..000000000 --- a/kernel/intermodule.c +++ /dev/null @@ -1,184 +0,0 @@ -/* Deprecated, do not use. Moved from module.c to here. --RR */ - -/* Written by Keith Owens Oct 2000 */ -#include -#include -#include -#include -#include - -/* inter_module functions are always available, even when the kernel is - * compiled without modules. Consumers of inter_module_xxx routines - * will always work, even when both are built into the kernel, this - * approach removes lots of #ifdefs in mainline code. - */ - -static struct list_head ime_list = LIST_HEAD_INIT(ime_list); -static DEFINE_SPINLOCK(ime_lock); -static int kmalloc_failed; - -struct inter_module_entry { - struct list_head list; - const char *im_name; - struct module *owner; - const void *userdata; -}; - -/** - * inter_module_register - register a new set of inter module data. - * @im_name: an arbitrary string to identify the data, must be unique - * @owner: module that is registering the data, always use THIS_MODULE - * @userdata: pointer to arbitrary userdata to be registered - * - * Description: Check that the im_name has not already been registered, - * complain if it has. For new data, add it to the inter_module_entry - * list. - */ -void inter_module_register(const char *im_name, struct module *owner, const void *userdata) -{ - struct list_head *tmp; - struct inter_module_entry *ime, *ime_new; - - if (!(ime_new = kzalloc(sizeof(*ime), GFP_KERNEL))) { - /* Overloaded kernel, not fatal */ - printk(KERN_ERR - "Aiee, inter_module_register: cannot kmalloc entry for '%s'\n", - im_name); - kmalloc_failed = 1; - return; - } - ime_new->im_name = im_name; - ime_new->owner = owner; - ime_new->userdata = userdata; - - spin_lock(&ime_lock); - list_for_each(tmp, &ime_list) { - ime = list_entry(tmp, struct inter_module_entry, list); - if (strcmp(ime->im_name, im_name) == 0) { - spin_unlock(&ime_lock); - kfree(ime_new); - /* Program logic error, fatal */ - printk(KERN_ERR "inter_module_register: duplicate im_name '%s'", im_name); - BUG(); - } - } - list_add(&(ime_new->list), &ime_list); - spin_unlock(&ime_lock); -} - -/** - * inter_module_unregister - unregister a set of inter module data. - * @im_name: an arbitrary string to identify the data, must be unique - * - * Description: Check that the im_name has been registered, complain if - * it has not. For existing data, remove it from the - * inter_module_entry list. - */ -void inter_module_unregister(const char *im_name) -{ - struct list_head *tmp; - struct inter_module_entry *ime; - - spin_lock(&ime_lock); - list_for_each(tmp, &ime_list) { - ime = list_entry(tmp, struct inter_module_entry, list); - if (strcmp(ime->im_name, im_name) == 0) { - list_del(&(ime->list)); - spin_unlock(&ime_lock); - kfree(ime); - return; - } - } - spin_unlock(&ime_lock); - if (kmalloc_failed) { - printk(KERN_ERR - "inter_module_unregister: no entry for '%s', " - "probably caused by previous kmalloc failure\n", - im_name); - return; - } - else { - /* Program logic error, fatal */ - printk(KERN_ERR "inter_module_unregister: no entry for '%s'", im_name); - BUG(); - } -} - -/** - * inter_module_get - return arbitrary userdata from another module. - * @im_name: an arbitrary string to identify the data, must be unique - * - * Description: If the im_name has not been registered, return NULL. - * Try to increment the use count on the owning module, if that fails - * then return NULL. Otherwise return the userdata. - */ -static const void *inter_module_get(const char *im_name) -{ - struct list_head *tmp; - struct inter_module_entry *ime; - const void *result = NULL; - - spin_lock(&ime_lock); - list_for_each(tmp, &ime_list) { - ime = list_entry(tmp, struct inter_module_entry, list); - if (strcmp(ime->im_name, im_name) == 0) { - if (try_module_get(ime->owner)) - result = ime->userdata; - break; - } - } - spin_unlock(&ime_lock); - return(result); -} - -/** - * inter_module_get_request - im get with automatic request_module. - * @im_name: an arbitrary string to identify the data, must be unique - * @modname: module that is expected to register im_name - * - * Description: If inter_module_get fails, do request_module then retry. - */ -const void *inter_module_get_request(const char *im_name, const char *modname) -{ - const void *result = inter_module_get(im_name); - if (!result) { - request_module("%s", modname); - result = inter_module_get(im_name); - } - return(result); -} - -/** - * inter_module_put - release use of data from another module. - * @im_name: an arbitrary string to identify the data, must be unique - * - * Description: If the im_name has not been registered, complain, - * otherwise decrement the use count on the owning module. - */ -void inter_module_put(const char *im_name) -{ - struct list_head *tmp; - struct inter_module_entry *ime; - - spin_lock(&ime_lock); - list_for_each(tmp, &ime_list) { - ime = list_entry(tmp, struct inter_module_entry, list); - if (strcmp(ime->im_name, im_name) == 0) { - if (ime->owner) - module_put(ime->owner); - spin_unlock(&ime_lock); - return; - } - } - spin_unlock(&ime_lock); - printk(KERN_ERR "inter_module_put: no entry for '%s'", im_name); - BUG(); -} - -EXPORT_SYMBOL(inter_module_register); -EXPORT_SYMBOL(inter_module_unregister); -EXPORT_SYMBOL(inter_module_get_request); -EXPORT_SYMBOL(inter_module_put); - -MODULE_LICENSE("GPL"); - diff --git a/kernel/irq/Makefile b/kernel/irq/Makefile index 9f77f50d8..1dab0ac3f 100644 --- a/kernel/irq/Makefile +++ b/kernel/irq/Makefile @@ -1,5 +1,5 @@ -obj-y := handle.o manage.o spurious.o +obj-y := handle.o manage.o spurious.o resend.o chip.o obj-$(CONFIG_GENERIC_IRQ_PROBE) += autoprobe.o obj-$(CONFIG_PROC_FS) += proc.o obj-$(CONFIG_GENERIC_PENDING_IRQ) += migration.o diff --git a/kernel/irq/autoprobe.c b/kernel/irq/autoprobe.c index 3467097ca..533068cfb 100644 --- a/kernel/irq/autoprobe.c +++ b/kernel/irq/autoprobe.c @@ -11,12 +11,14 @@ #include #include +#include "internals.h" + /* * Autodetection depends on the fact that any interrupt that * comes in on to an unassigned handler will get stuck with * "IRQ_WAITING" cleared and the interrupt disabled. */ -static DECLARE_MUTEX(probe_sem); +static DEFINE_MUTEX(probing_active); /** * probe_irq_on - begin an interrupt autodetect @@ -27,11 +29,11 @@ static DECLARE_MUTEX(probe_sem); */ unsigned long probe_irq_on(void) { - unsigned long val; - irq_desc_t *desc; + struct irq_desc *desc; + unsigned long mask; unsigned int i; - down(&probe_sem); + mutex_lock(&probing_active); /* * something may have generated an irq long ago and we want to * flush such a longstanding irq before considering it as spurious. @@ -40,8 +42,21 @@ unsigned long probe_irq_on(void) desc = irq_desc + i; spin_lock_irq(&desc->lock); - if (!irq_desc[i].action) - irq_desc[i].handler->startup(i); + if (!desc->action && !(desc->status & IRQ_NOPROBE)) { + /* + * An old-style architecture might still have + * the handle_bad_irq handler there: + */ + compat_irq_chip_set_default_handler(desc); + + /* + * Some chips need to know about probing in + * progress: + */ + if (desc->chip->set_type) + desc->chip->set_type(i, IRQ_TYPE_PROBE); + desc->chip->startup(i); + } spin_unlock_irq(&desc->lock); } @@ -57,9 +72,9 @@ unsigned long probe_irq_on(void) desc = irq_desc + i; spin_lock_irq(&desc->lock); - if (!desc->action) { + if (!desc->action && !(desc->status & IRQ_NOPROBE)) { desc->status |= IRQ_AUTODETECT | IRQ_WAITING; - if (desc->handler->startup(i)) + if (desc->chip->startup(i)) desc->status |= IRQ_PENDING; } spin_unlock_irq(&desc->lock); @@ -73,11 +88,11 @@ unsigned long probe_irq_on(void) /* * Now filter out any obviously spurious interrupts */ - val = 0; + mask = 0; for (i = 0; i < NR_IRQS; i++) { - irq_desc_t *desc = irq_desc + i; unsigned int status; + desc = irq_desc + i; spin_lock_irq(&desc->lock); status = desc->status; @@ -85,17 +100,16 @@ unsigned long probe_irq_on(void) /* It triggered already - consider it spurious. */ if (!(status & IRQ_WAITING)) { desc->status = status & ~IRQ_AUTODETECT; - desc->handler->shutdown(i); + desc->chip->shutdown(i); } else if (i < 32) - val |= 1 << i; + mask |= 1 << i; } spin_unlock_irq(&desc->lock); } - return val; + return mask; } - EXPORT_SYMBOL(probe_irq_on); /** @@ -117,7 +131,7 @@ unsigned int probe_irq_mask(unsigned long val) mask = 0; for (i = 0; i < NR_IRQS; i++) { - irq_desc_t *desc = irq_desc + i; + struct irq_desc *desc = irq_desc + i; unsigned int status; spin_lock_irq(&desc->lock); @@ -128,11 +142,11 @@ unsigned int probe_irq_mask(unsigned long val) mask |= 1 << i; desc->status = status & ~IRQ_AUTODETECT; - desc->handler->shutdown(i); + desc->chip->shutdown(i); } spin_unlock_irq(&desc->lock); } - up(&probe_sem); + mutex_unlock(&probing_active); return mask & val; } @@ -160,7 +174,7 @@ int probe_irq_off(unsigned long val) int i, irq_found = 0, nr_irqs = 0; for (i = 0; i < NR_IRQS; i++) { - irq_desc_t *desc = irq_desc + i; + struct irq_desc *desc = irq_desc + i; unsigned int status; spin_lock_irq(&desc->lock); @@ -173,16 +187,16 @@ int probe_irq_off(unsigned long val) nr_irqs++; } desc->status = status & ~IRQ_AUTODETECT; - desc->handler->shutdown(i); + desc->chip->shutdown(i); } spin_unlock_irq(&desc->lock); } - up(&probe_sem); + mutex_unlock(&probing_active); if (nr_irqs > 1) irq_found = -irq_found; + return irq_found; } - EXPORT_SYMBOL(probe_irq_off); diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c index 51df337b3..553a09888 100644 --- a/kernel/irq/handle.c +++ b/kernel/irq/handle.c @@ -1,9 +1,13 @@ /* * linux/kernel/irq/handle.c * - * Copyright (C) 1992, 1998-2004 Linus Torvalds, Ingo Molnar + * Copyright (C) 1992, 1998-2006 Linus Torvalds, Ingo Molnar + * Copyright (C) 2005-2006, Thomas Gleixner, Russell King * * This file contains the core interrupt handling code. + * + * Detailed information is available in Documentation/DocBook/genericirq + * */ #include @@ -11,14 +15,31 @@ #include #include #include +#include #include "internals.h" +/** + * handle_bad_irq - handle spurious and unhandled irqs + * @irq: the interrupt number + * @desc: description of the interrupt + * @regs: pointer to a register structure + * + * Handles spurious and unhandled IRQ's. It also prints a debugmessage. + */ +void fastcall +handle_bad_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs) +{ + print_irq_desc(irq, desc); + kstat_this_cpu.irqs[irq]++; + ack_bad_irq(irq); +} + /* * Linux has a controller-independent interrupt architecture. * Every controller has a 'controller-template', that is used * by the main code to do the right thing. Each driver-visible - * interrupt source is transparently wired to the apropriate + * interrupt source is transparently wired to the appropriate * controller. Thus drivers need not be aware of the * interrupt-controller. * @@ -28,41 +49,68 @@ * * Controller mappings for all interrupt sources: */ -irq_desc_t irq_desc[NR_IRQS] __cacheline_aligned = { +struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned = { [0 ... NR_IRQS-1] = { .status = IRQ_DISABLED, - .handler = &no_irq_type, - .lock = SPIN_LOCK_UNLOCKED + .chip = &no_irq_chip, + .handle_irq = handle_bad_irq, + .depth = 1, + .lock = SPIN_LOCK_UNLOCKED, +#ifdef CONFIG_SMP + .affinity = CPU_MASK_ALL +#endif } }; /* - * Generic 'no controller' code + * What should we do if we get a hw irq event on an illegal vector? + * Each architecture has to answer this themself. */ -static void end_none(unsigned int irq) { } -static void enable_none(unsigned int irq) { } -static void disable_none(unsigned int irq) { } -static void shutdown_none(unsigned int irq) { } -static unsigned int startup_none(unsigned int irq) { return 0; } - -static void ack_none(unsigned int irq) +static void ack_bad(unsigned int irq) { - /* - * 'what should we do if we get a hw irq event on an illegal vector'. - * each architecture has to answer this themself. - */ + print_irq_desc(irq, irq_desc + irq); ack_bad_irq(irq); } -struct hw_interrupt_type no_irq_type = { - .typename = "none", - .startup = startup_none, - .shutdown = shutdown_none, - .enable = enable_none, - .disable = disable_none, - .ack = ack_none, - .end = end_none, - .set_affinity = NULL +/* + * NOP functions + */ +static void noop(unsigned int irq) +{ +} + +static unsigned int noop_ret(unsigned int irq) +{ + return 0; +} + +/* + * Generic no controller implementation + */ +struct irq_chip no_irq_chip = { + .name = "none", + .startup = noop_ret, + .shutdown = noop, + .enable = noop, + .disable = noop, + .ack = ack_bad, + .end = noop, +}; + +/* + * Generic dummy implementation which can be used for + * real dumb interrupt sources + */ +struct irq_chip dummy_irq_chip = { + .name = "dummy", + .startup = noop_ret, + .shutdown = noop, + .enable = noop, + .disable = noop, + .ack = noop, + .mask = noop, + .unmask = noop, + .end = noop, }; /* @@ -73,16 +121,24 @@ irqreturn_t no_action(int cpl, void *dev_id, struct pt_regs *regs) return IRQ_NONE; } -/* - * Have got an event to handle: +/** + * handle_IRQ_event - irq action chain handler + * @irq: the interrupt number + * @regs: pointer to a register structure + * @action: the interrupt action chain for this irq + * + * Handles the action chain of an irq event */ -fastcall int handle_IRQ_event(unsigned int irq, struct pt_regs *regs, - struct irqaction *action) +irqreturn_t handle_IRQ_event(unsigned int irq, struct pt_regs *regs, + struct irqaction *action) { - int ret, retval = 0, status = 0; + irqreturn_t ret, retval = IRQ_NONE; + unsigned int status = 0; - if (!(action->flags & SA_INTERRUPT)) - local_irq_enable(); + handle_dynamic_tick(action); + + if (!(action->flags & IRQF_DISABLED)) + local_irq_enable_in_hardirq(); do { ret = action->handler(irq, action->dev_id, regs); @@ -92,22 +148,30 @@ fastcall int handle_IRQ_event(unsigned int irq, struct pt_regs *regs, action = action->next; } while (action); - if (status & SA_SAMPLE_RANDOM) + if (status & IRQF_SAMPLE_RANDOM) add_interrupt_randomness(irq); local_irq_disable(); return retval; } -/* - * do_IRQ handles all normal device IRQ's (the special +/** + * __do_IRQ - original all in one highlevel IRQ handler + * @irq: the interrupt number + * @regs: pointer to a register structure + * + * __do_IRQ handles all normal device IRQ's (the special * SMP cross-CPU interrupts have their own specific * handlers). + * + * This is the original x86 implementation which is used for every + * interrupt type. */ fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs *regs) { - irq_desc_t *desc = irq_desc + irq; - struct irqaction * action; + struct irq_desc *desc = irq_desc + irq; + struct irqaction *action; + struct vx_info_save vxis; unsigned int status; kstat_this_cpu.irqs[irq]++; @@ -117,16 +181,19 @@ fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs *regs) /* * No locking required for CPU-local interrupts: */ - if (desc->handler->ack) - desc->handler->ack(irq); + __enter_vx_admin(&vxis); + if (desc->chip->ack) + desc->chip->ack(irq); action_ret = handle_IRQ_event(irq, regs, desc->action); - desc->handler->end(irq); + desc->chip->end(irq); + __leave_vx_admin(&vxis); return 1; } spin_lock(&desc->lock); - if (desc->handler->ack) - desc->handler->ack(irq); + __enter_vx_admin(&vxis); + if (desc->chip->ack) + desc->chip->ack(irq); /* * REPLAY is when Linux resends an IRQ that was dropped earlier * WAITING is used by probe to mark irqs that are being tested @@ -186,9 +253,26 @@ out: * The ->end() handler has to deal with interrupts which got * disabled while the handler was running. */ - desc->handler->end(irq); + desc->chip->end(irq); + __leave_vx_admin(&vxis); spin_unlock(&desc->lock); return 1; } +#ifdef CONFIG_TRACE_IRQFLAGS + +/* + * lockdep: we want to handle all irq_desc locks as a single lock-class: + */ +static struct lock_class_key irq_desc_lock_class; + +void early_init_irq_lock_class(void) +{ + int i; + + for (i = 0; i < NR_IRQS; i++) + lockdep_set_class(&irq_desc[i].lock, &irq_desc_lock_class); +} + +#endif diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h index 46feba630..08a849a22 100644 --- a/kernel/irq/internals.h +++ b/kernel/irq/internals.h @@ -4,6 +4,12 @@ extern int noirqdebug; +/* Set default functions for irq_chip structures: */ +extern void irq_chip_set_defaults(struct irq_chip *chip); + +/* Set default handler: */ +extern void compat_irq_chip_set_default_handler(struct irq_desc *desc); + #ifdef CONFIG_PROC_FS extern void register_irq_proc(unsigned int irq); extern void register_handler_proc(unsigned int irq, struct irqaction *action); @@ -16,3 +22,43 @@ static inline void unregister_handler_proc(unsigned int irq, struct irqaction *action) { } #endif +/* + * Debugging printout: + */ + +#include + +#define P(f) if (desc->status & f) printk("%14s set\n", #f) + +static inline void print_irq_desc(unsigned int irq, struct irq_desc *desc) +{ + printk("irq %d, desc: %p, depth: %d, count: %d, unhandled: %d\n", + irq, desc, desc->depth, desc->irq_count, desc->irqs_unhandled); + printk("->handle_irq(): %p, ", desc->handle_irq); + print_symbol("%s\n", (unsigned long)desc->handle_irq); + printk("->chip(): %p, ", desc->chip); + print_symbol("%s\n", (unsigned long)desc->chip); + printk("->action(): %p\n", desc->action); + if (desc->action) { + printk("->action->handler(): %p, ", desc->action->handler); + print_symbol("%s\n", (unsigned long)desc->action->handler); + } + + P(IRQ_INPROGRESS); + P(IRQ_DISABLED); + P(IRQ_PENDING); + P(IRQ_REPLAY); + P(IRQ_AUTODETECT); + P(IRQ_WAITING); + P(IRQ_LEVEL); + P(IRQ_MASKED); +#ifdef CONFIG_IRQ_PER_CPU + P(IRQ_PER_CPU); +#endif + P(IRQ_NOPROBE); + P(IRQ_NOREQUEST); + P(IRQ_NOAUTOEN); +} + +#undef P + diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 97d555999..c2f92f124 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -1,12 +1,12 @@ /* * linux/kernel/irq/manage.c * - * Copyright (C) 1992, 1998-2004 Linus Torvalds, Ingo Molnar + * Copyright (C) 1992, 1998-2006 Linus Torvalds, Ingo Molnar + * Copyright (C) 2005-2006 Thomas Gleixner * * This file contains driver APIs to the irq subsystem. */ -#include #include #include #include @@ -16,12 +16,6 @@ #ifdef CONFIG_SMP -cpumask_t irq_affinity[NR_IRQS] = { [0 ... NR_IRQS-1] = CPU_MASK_ALL }; - -#if defined (CONFIG_GENERIC_PENDING_IRQ) || defined (CONFIG_IRQBALANCE) -cpumask_t __cacheline_aligned pending_irq_cpumask[NR_IRQS]; -#endif - /** * synchronize_irq - wait for pending IRQ handlers (on other CPUs) * @irq: interrupt number to wait for @@ -42,7 +36,6 @@ void synchronize_irq(unsigned int irq) while (desc->status & IRQ_INPROGRESS) cpu_relax(); } - EXPORT_SYMBOL(synchronize_irq); #endif @@ -60,7 +53,7 @@ EXPORT_SYMBOL(synchronize_irq); */ void disable_irq_nosync(unsigned int irq) { - irq_desc_t *desc = irq_desc + irq; + struct irq_desc *desc = irq_desc + irq; unsigned long flags; if (irq >= NR_IRQS) @@ -69,11 +62,10 @@ void disable_irq_nosync(unsigned int irq) spin_lock_irqsave(&desc->lock, flags); if (!desc->depth++) { desc->status |= IRQ_DISABLED; - desc->handler->disable(irq); + desc->chip->disable(irq); } spin_unlock_irqrestore(&desc->lock, flags); } - EXPORT_SYMBOL(disable_irq_nosync); /** @@ -90,7 +82,7 @@ EXPORT_SYMBOL(disable_irq_nosync); */ void disable_irq(unsigned int irq) { - irq_desc_t *desc = irq_desc + irq; + struct irq_desc *desc = irq_desc + irq; if (irq >= NR_IRQS) return; @@ -99,7 +91,6 @@ void disable_irq(unsigned int irq) if (desc->action) synchronize_irq(irq); } - EXPORT_SYMBOL(disable_irq); /** @@ -114,7 +105,7 @@ EXPORT_SYMBOL(disable_irq); */ void enable_irq(unsigned int irq) { - irq_desc_t *desc = irq_desc + irq; + struct irq_desc *desc = irq_desc + irq; unsigned long flags; if (irq >= NR_IRQS) @@ -123,17 +114,15 @@ void enable_irq(unsigned int irq) spin_lock_irqsave(&desc->lock, flags); switch (desc->depth) { case 0: + printk(KERN_WARNING "Unbalanced enable for IRQ %d\n", irq); WARN_ON(1); break; case 1: { unsigned int status = desc->status & ~IRQ_DISABLED; - desc->status = status; - if ((status & (IRQ_PENDING | IRQ_REPLAY)) == IRQ_PENDING) { - desc->status = status | IRQ_REPLAY; - hw_resend_irq(desc->handler,irq); - } - desc->handler->enable(irq); + /* Prevent probing on this irq: */ + desc->status = status | IRQ_NOPROBE; + check_irq_resend(desc, irq); /* fall-through */ } default: @@ -141,9 +130,53 @@ void enable_irq(unsigned int irq) } spin_unlock_irqrestore(&desc->lock, flags); } - EXPORT_SYMBOL(enable_irq); +/** + * set_irq_wake - control irq power management wakeup + * @irq: interrupt to control + * @on: enable/disable power management wakeup + * + * Enable/disable power management wakeup mode, which is + * disabled by default. Enables and disables must match, + * just as they match for non-wakeup mode support. + * + * Wakeup mode lets this IRQ wake the system from sleep + * states like "suspend to RAM". + */ +int set_irq_wake(unsigned int irq, unsigned int on) +{ + struct irq_desc *desc = irq_desc + irq; + unsigned long flags; + int ret = -ENXIO; + int (*set_wake)(unsigned, unsigned) = desc->chip->set_wake; + + /* wakeup-capable irqs can be shared between drivers that + * don't need to have the same sleep mode behaviors. + */ + spin_lock_irqsave(&desc->lock, flags); + if (on) { + if (desc->wake_depth++ == 0) + desc->status |= IRQ_WAKEUP; + else + set_wake = NULL; + } else { + if (desc->wake_depth == 0) { + printk(KERN_WARNING "Unbalanced IRQ %d " + "wake disable\n", irq); + WARN_ON(1); + } else if (--desc->wake_depth == 0) + desc->status &= ~IRQ_WAKEUP; + else + set_wake = NULL; + } + if (set_wake) + ret = desc->chip->set_wake(irq, on); + spin_unlock_irqrestore(&desc->lock, flags); + return ret; +} +EXPORT_SYMBOL(set_irq_wake); + /* * Internal function that tells the architecture code whether a * particular irq has been exclusively allocated or is available @@ -153,22 +186,33 @@ int can_request_irq(unsigned int irq, unsigned long irqflags) { struct irqaction *action; - if (irq >= NR_IRQS) + if (irq >= NR_IRQS || irq_desc[irq].status & IRQ_NOREQUEST) return 0; action = irq_desc[irq].action; if (action) - if (irqflags & action->flags & SA_SHIRQ) + if (irqflags & action->flags & IRQF_SHARED) action = NULL; return !action; } +void compat_irq_chip_set_default_handler(struct irq_desc *desc) +{ + /* + * If the architecture still has not overriden + * the flow handler then zap the default. This + * should catch incorrect flow-type setting. + */ + if (desc->handle_irq == &handle_bad_irq) + desc->handle_irq = NULL; +} + /* * Internal function to register an irqaction - typically used to * allocate special interrupts that are part of the architecture. */ -int setup_irq(unsigned int irq, struct irqaction * new) +int setup_irq(unsigned int irq, struct irqaction *new) { struct irq_desc *desc = irq_desc + irq; struct irqaction *old, **p; @@ -178,14 +222,14 @@ int setup_irq(unsigned int irq, struct irqaction * new) if (irq >= NR_IRQS) return -EINVAL; - if (desc->handler == &no_irq_type) + if (desc->chip == &no_irq_chip) return -ENOSYS; /* * Some drivers like serial.c use request_irq() heavily, * so we have to be careful not to interfere with a * running system. */ - if (new->flags & SA_SAMPLE_RANDOM) { + if (new->flags & IRQF_SAMPLE_RANDOM) { /* * This function might sleep, we want to call it first, * outside of the atomic block. @@ -200,14 +244,26 @@ int setup_irq(unsigned int irq, struct irqaction * new) /* * The following block of code has to be executed atomically */ - spin_lock_irqsave(&desc->lock,flags); + spin_lock_irqsave(&desc->lock, flags); p = &desc->action; - if ((old = *p) != NULL) { - /* Can't share interrupts unless both agree to */ - if (!(old->flags & new->flags & SA_SHIRQ)) { - spin_unlock_irqrestore(&desc->lock,flags); - return -EBUSY; - } + old = *p; + if (old) { + /* + * Can't share interrupts unless both agree to and are + * the same type (level, edge, polarity). So both flag + * fields must have IRQF_SHARED set and the bits which + * set the trigger type must match. + */ + if (!((old->flags & new->flags) & IRQF_SHARED) || + ((old->flags ^ new->flags) & IRQF_TRIGGER_MASK)) + goto mismatch; + +#if defined(CONFIG_IRQ_PER_CPU) + /* All handlers must agree on per-cpuness */ + if ((old->flags & IRQF_PERCPU) != + (new->flags & IRQF_PERCPU)) + goto mismatch; +#endif /* add new interrupt at end of irq queue */ do { @@ -218,17 +274,45 @@ int setup_irq(unsigned int irq, struct irqaction * new) } *p = new; - +#if defined(CONFIG_IRQ_PER_CPU) + if (new->flags & IRQF_PERCPU) + desc->status |= IRQ_PER_CPU; +#endif if (!shared) { - desc->depth = 0; - desc->status &= ~(IRQ_DISABLED | IRQ_AUTODETECT | - IRQ_WAITING | IRQ_INPROGRESS); - if (desc->handler->startup) - desc->handler->startup(irq); - else - desc->handler->enable(irq); + irq_chip_set_defaults(desc->chip); + + /* Setup the type (level, edge polarity) if configured: */ + if (new->flags & IRQF_TRIGGER_MASK) { + if (desc->chip && desc->chip->set_type) + desc->chip->set_type(irq, + new->flags & IRQF_TRIGGER_MASK); + else + /* + * IRQF_TRIGGER_* but the PIC does not support + * multiple flow-types? + */ + printk(KERN_WARNING "No IRQF_TRIGGER set_type " + "function for IRQ %d (%s)\n", irq, + desc->chip ? desc->chip->name : + "unknown"); + } else + compat_irq_chip_set_default_handler(desc); + + desc->status &= ~(IRQ_AUTODETECT | IRQ_WAITING | + IRQ_INPROGRESS); + + if (!(desc->status & IRQ_NOAUTOEN)) { + desc->depth = 0; + desc->status &= ~IRQ_DISABLED; + if (desc->chip->startup) + desc->chip->startup(irq); + else + desc->chip->enable(irq); + } else + /* Undo nested disables: */ + desc->depth = 1; } - spin_unlock_irqrestore(&desc->lock,flags); + spin_unlock_irqrestore(&desc->lock, flags); new->irq = irq; register_irq_proc(irq); @@ -236,6 +320,14 @@ int setup_irq(unsigned int irq, struct irqaction * new) register_handler_proc(irq, new); return 0; + +mismatch: + spin_unlock_irqrestore(&desc->lock, flags); + if (!(new->flags & IRQF_PROBE_SHARED)) { + printk(KERN_ERR "IRQ handler type mismatch for IRQ %d\n", irq); + dump_stack(); + } + return -EBUSY; } /** @@ -262,10 +354,10 @@ void free_irq(unsigned int irq, void *dev_id) return; desc = irq_desc + irq; - spin_lock_irqsave(&desc->lock,flags); + spin_lock_irqsave(&desc->lock, flags); p = &desc->action; for (;;) { - struct irqaction * action = *p; + struct irqaction *action = *p; if (action) { struct irqaction **pp = p; @@ -279,18 +371,18 @@ void free_irq(unsigned int irq, void *dev_id) /* Currently used only by UML, might disappear one day.*/ #ifdef CONFIG_IRQ_RELEASE_METHOD - if (desc->handler->release) - desc->handler->release(irq, dev_id); + if (desc->chip->release) + desc->chip->release(irq, dev_id); #endif if (!desc->action) { desc->status |= IRQ_DISABLED; - if (desc->handler->shutdown) - desc->handler->shutdown(irq); + if (desc->chip->shutdown) + desc->chip->shutdown(irq); else - desc->handler->disable(irq); + desc->chip->disable(irq); } - spin_unlock_irqrestore(&desc->lock,flags); + spin_unlock_irqrestore(&desc->lock, flags); unregister_handler_proc(irq, action); /* Make sure it's not being used on another CPU */ @@ -298,12 +390,11 @@ void free_irq(unsigned int irq, void *dev_id) kfree(action); return; } - printk(KERN_ERR "Trying to free free IRQ%d\n",irq); - spin_unlock_irqrestore(&desc->lock,flags); + printk(KERN_ERR "Trying to free already-free IRQ %d\n", irq); + spin_unlock_irqrestore(&desc->lock, flags); return; } } - EXPORT_SYMBOL(free_irq); /** @@ -330,28 +421,36 @@ EXPORT_SYMBOL(free_irq); * * Flags: * - * SA_SHIRQ Interrupt is shared - * SA_INTERRUPT Disable local interrupts while processing - * SA_SAMPLE_RANDOM The interrupt can be used for entropy + * IRQF_SHARED Interrupt is shared + * IRQF_DISABLED Disable local interrupts while processing + * IRQF_SAMPLE_RANDOM The interrupt can be used for entropy * */ int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), - unsigned long irqflags, const char * devname, void *dev_id) + unsigned long irqflags, const char *devname, void *dev_id) { - struct irqaction * action; + struct irqaction *action; int retval; +#ifdef CONFIG_LOCKDEP + /* + * Lockdep wants atomic interrupt handlers: + */ + irqflags |= SA_INTERRUPT; +#endif /* * Sanity-check: shared interrupts must pass in a real dev-ID, * otherwise we'll have trouble later trying to figure out * which interrupt is which (messes up the interrupt freeing * logic etc). */ - if ((irqflags & SA_SHIRQ) && !dev_id) + if ((irqflags & IRQF_SHARED) && !dev_id) return -EINVAL; if (irq >= NR_IRQS) return -EINVAL; + if (irq_desc[irq].status & IRQ_NOREQUEST) + return -EINVAL; if (!handler) return -EINVAL; @@ -374,6 +473,5 @@ int request_irq(unsigned int irq, return retval; } - EXPORT_SYMBOL(request_irq); diff --git a/kernel/irq/migration.c b/kernel/irq/migration.c index 134f9f2e0..a57ebe9fa 100644 --- a/kernel/irq/migration.c +++ b/kernel/irq/migration.c @@ -3,19 +3,19 @@ void set_pending_irq(unsigned int irq, cpumask_t mask) { - irq_desc_t *desc = irq_desc + irq; + struct irq_desc *desc = irq_desc + irq; unsigned long flags; spin_lock_irqsave(&desc->lock, flags); desc->move_irq = 1; - pending_irq_cpumask[irq] = mask; + irq_desc[irq].pending_mask = mask; spin_unlock_irqrestore(&desc->lock, flags); } void move_native_irq(int irq) { + struct irq_desc *desc = irq_desc + irq; cpumask_t tmp; - irq_desc_t *desc = irq_descp(irq); if (likely(!desc->move_irq)) return; @@ -30,15 +30,15 @@ void move_native_irq(int irq) desc->move_irq = 0; - if (likely(cpus_empty(pending_irq_cpumask[irq]))) + if (unlikely(cpus_empty(irq_desc[irq].pending_mask))) return; - if (!desc->handler->set_affinity) + if (!desc->chip->set_affinity) return; assert_spin_locked(&desc->lock); - cpus_and(tmp, pending_irq_cpumask[irq], cpu_online_map); + cpus_and(tmp, irq_desc[irq].pending_mask, cpu_online_map); /* * If there was a valid mask to work with, please @@ -49,14 +49,14 @@ void move_native_irq(int irq) * cause some ioapics to mal-function. * Being paranoid i guess! */ - if (unlikely(!cpus_empty(tmp))) { + if (likely(!cpus_empty(tmp))) { if (likely(!(desc->status & IRQ_DISABLED))) - desc->handler->disable(irq); + desc->chip->disable(irq); - desc->handler->set_affinity(irq,tmp); + desc->chip->set_affinity(irq,tmp); if (likely(!(desc->status & IRQ_DISABLED))) - desc->handler->enable(irq); + desc->chip->enable(irq); } - cpus_clear(pending_irq_cpumask[irq]); + cpus_clear(irq_desc[irq].pending_mask); } diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c index d03b5eef8..607c7809a 100644 --- a/kernel/irq/proc.c +++ b/kernel/irq/proc.c @@ -12,18 +12,15 @@ #include "internals.h" -static struct proc_dir_entry *root_irq_dir, *irq_dir[NR_IRQS]; +static struct proc_dir_entry *root_irq_dir; #ifdef CONFIG_SMP -/* - * The /proc/irq//smp_affinity values: - */ -static struct proc_dir_entry *smp_affinity_entry[NR_IRQS]; - #ifdef CONFIG_GENERIC_PENDING_IRQ void proc_set_irq_affinity(unsigned int irq, cpumask_t mask_val) { + set_balance_irq_affinity(irq, mask_val); + /* * Save these away for later use. Re-progam when the * interrupt is pending @@ -33,15 +30,16 @@ void proc_set_irq_affinity(unsigned int irq, cpumask_t mask_val) #else void proc_set_irq_affinity(unsigned int irq, cpumask_t mask_val) { - irq_affinity[irq] = mask_val; - irq_desc[irq].handler->set_affinity(irq, mask_val); + set_balance_irq_affinity(irq, mask_val); + irq_desc[irq].affinity = mask_val; + irq_desc[irq].chip->set_affinity(irq, mask_val); } #endif static int irq_affinity_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data) { - int len = cpumask_scnprintf(page, count, irq_affinity[(long)data]); + int len = cpumask_scnprintf(page, count, irq_desc[(long)data].affinity); if (count - len < 2) return -EINVAL; @@ -56,7 +54,7 @@ static int irq_affinity_write_proc(struct file *file, const char __user *buffer, unsigned int irq = (int)(long)data, full_count = count, err; cpumask_t new_value, tmp; - if (!irq_desc[irq].handler->set_affinity || no_irq_affinity) + if (!irq_desc[irq].chip->set_affinity || no_irq_affinity) return -EIO; err = cpumask_parse(buffer, count, new_value); @@ -99,7 +97,7 @@ void register_handler_proc(unsigned int irq, struct irqaction *action) { char name [MAX_NAMELEN]; - if (!irq_dir[irq] || action->dir || !action->name || + if (!irq_desc[irq].dir || action->dir || !action->name || !name_unique(irq, action)) return; @@ -107,7 +105,7 @@ void register_handler_proc(unsigned int irq, struct irqaction *action) snprintf(name, MAX_NAMELEN, "%s", action->name); /* create /proc/irq/1234/handler/ */ - action->dir = proc_mkdir(name, irq_dir[irq]); + action->dir = proc_mkdir(name, irq_desc[irq].dir); } #undef MAX_NAMELEN @@ -119,22 +117,22 @@ void register_irq_proc(unsigned int irq) char name [MAX_NAMELEN]; if (!root_irq_dir || - (irq_desc[irq].handler == &no_irq_type) || - irq_dir[irq]) + (irq_desc[irq].chip == &no_irq_chip) || + irq_desc[irq].dir) return; memset(name, 0, MAX_NAMELEN); sprintf(name, "%d", irq); /* create /proc/irq/1234 */ - irq_dir[irq] = proc_mkdir(name, root_irq_dir); + irq_desc[irq].dir = proc_mkdir(name, root_irq_dir); #ifdef CONFIG_SMP { struct proc_dir_entry *entry; /* create /proc/irq//smp_affinity */ - entry = create_proc_entry("smp_affinity", 0600, irq_dir[irq]); + entry = create_proc_entry("smp_affinity", 0600, irq_desc[irq].dir); if (entry) { entry->nlink = 1; @@ -142,7 +140,6 @@ void register_irq_proc(unsigned int irq) entry->read_proc = irq_affinity_read_proc; entry->write_proc = irq_affinity_write_proc; } - smp_affinity_entry[irq] = entry; } #endif } @@ -152,7 +149,7 @@ void register_irq_proc(unsigned int irq) void unregister_handler_proc(unsigned int irq, struct irqaction *action) { if (action->dir) - remove_proc_entry(action->dir->name, irq_dir[irq]); + remove_proc_entry(action->dir->name, irq_desc[irq].dir); } void init_irq_proc(void) diff --git a/kernel/irq/spurious.c b/kernel/irq/spurious.c index f9353e960..417e98092 100644 --- a/kernel/irq/spurious.c +++ b/kernel/irq/spurious.c @@ -11,44 +11,44 @@ #include #include -static int irqfixup; +static int irqfixup __read_mostly; /* * Recovery handler for misrouted interrupts. */ - static int misrouted_irq(int irq, struct pt_regs *regs) { int i; - irq_desc_t *desc; int ok = 0; int work = 0; /* Did we do work for a real IRQ */ - for(i = 1; i < NR_IRQS; i++) { + for (i = 1; i < NR_IRQS; i++) { + struct irq_desc *desc = irq_desc + i; struct irqaction *action; if (i == irq) /* Already tried */ continue; - desc = &irq_desc[i]; + spin_lock(&desc->lock); - action = desc->action; /* Already running on another processor */ if (desc->status & IRQ_INPROGRESS) { /* * Already running: If it is shared get the other * CPU to go looking for our mystery interrupt too */ - if (desc->action && (desc->action->flags & SA_SHIRQ)) + if (desc->action && (desc->action->flags & IRQF_SHARED)) desc->status |= IRQ_PENDING; spin_unlock(&desc->lock); continue; } /* Honour the normal IRQ locking */ desc->status |= IRQ_INPROGRESS; + action = desc->action; spin_unlock(&desc->lock); + while (action) { /* Only shared IRQ handlers are safe to call */ - if (action->flags & SA_SHIRQ) { + if (action->flags & IRQF_SHARED) { if (action->handler(i, action->dev_id, regs) == IRQ_HANDLED) ok = 1; @@ -62,9 +62,8 @@ static int misrouted_irq(int irq, struct pt_regs *regs) /* * While we were looking for a fixup someone queued a real - * IRQ clashing with our walk + * IRQ clashing with our walk: */ - while ((desc->status & IRQ_PENDING) && action) { /* * Perform real IRQ processing for the IRQ we deferred @@ -80,8 +79,8 @@ static int misrouted_irq(int irq, struct pt_regs *regs) * If we did actual work for the real IRQ line we must let the * IRQ controller clean up too */ - if(work) - desc->handler->end(i); + if (work && desc->chip && desc->chip->end) + desc->chip->end(i); spin_unlock(&desc->lock); } /* So the caller can adjust the irq error counts */ @@ -100,7 +99,8 @@ static int misrouted_irq(int irq, struct pt_regs *regs) */ static void -__report_bad_irq(unsigned int irq, irq_desc_t *desc, irqreturn_t action_ret) +__report_bad_irq(unsigned int irq, struct irq_desc *desc, + irqreturn_t action_ret) { struct irqaction *action; @@ -113,6 +113,7 @@ __report_bad_irq(unsigned int irq, irq_desc_t *desc, irqreturn_t action_ret) } dump_stack(); printk(KERN_ERR "handlers:\n"); + action = desc->action; while (action) { printk(KERN_ERR "[<%p>]", action->handler); @@ -123,7 +124,8 @@ __report_bad_irq(unsigned int irq, irq_desc_t *desc, irqreturn_t action_ret) } } -static void report_bad_irq(unsigned int irq, irq_desc_t *desc, irqreturn_t action_ret) +static void +report_bad_irq(unsigned int irq, struct irq_desc *desc, irqreturn_t action_ret) { static int count = 100; @@ -133,13 +135,12 @@ static void report_bad_irq(unsigned int irq, irq_desc_t *desc, irqreturn_t actio } } -void note_interrupt(unsigned int irq, irq_desc_t *desc, irqreturn_t action_ret, - struct pt_regs *regs) +void note_interrupt(unsigned int irq, struct irq_desc *desc, + irqreturn_t action_ret, struct pt_regs *regs) { - if (action_ret != IRQ_HANDLED) { - if (!irq_ignore_unhandled(irq)) - desc->irqs_unhandled++; - if (action_ret != IRQ_NONE) + if (unlikely(action_ret != IRQ_HANDLED)) { + desc->irqs_unhandled++; + if (unlikely(action_ret != IRQ_NONE)) report_bad_irq(irq, desc, action_ret); } @@ -153,11 +154,11 @@ void note_interrupt(unsigned int irq, irq_desc_t *desc, irqreturn_t action_ret, } desc->irq_count++; - if (desc->irq_count < 100000) + if (likely(desc->irq_count < 100000)) return; desc->irq_count = 0; - if (desc->irqs_unhandled > 99900) { + if (unlikely(desc->irqs_unhandled > 99900)) { /* * The interrupt is stuck */ @@ -167,17 +168,19 @@ void note_interrupt(unsigned int irq, irq_desc_t *desc, irqreturn_t action_ret, */ printk(KERN_EMERG "Disabling IRQ #%d\n", irq); desc->status |= IRQ_DISABLED; - desc->handler->disable(irq); + desc->depth = 1; + desc->chip->disable(irq); } desc->irqs_unhandled = 0; } -int noirqdebug; +int noirqdebug __read_mostly; int __init noirqdebug_setup(char *str) { noirqdebug = 1; printk(KERN_INFO "IRQ lockup detection disabled\n"); + return 1; } @@ -188,6 +191,7 @@ static int __init irqfixup_setup(char *str) irqfixup = 1; printk(KERN_WARNING "Misrouted IRQ fixup support enabled.\n"); printk(KERN_WARNING "This may impact system performance.\n"); + return 1; } diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c index 39277dd6b..ab16a5a4c 100644 --- a/kernel/kallsyms.c +++ b/kernel/kallsyms.c @@ -275,8 +275,8 @@ static void upcase_if_global(struct kallsym_iter *iter) static int get_ksymbol_mod(struct kallsym_iter *iter) { iter->owner = module_get_kallsym(iter->pos - kallsyms_num_syms, - &iter->value, - &iter->type, iter->name); + &iter->value, &iter->type, + iter->name, sizeof(iter->name)); if (iter->owner == NULL) return 0; diff --git a/kernel/kexec.c b/kernel/kexec.c index bf39d28e4..50087ecf3 100644 --- a/kernel/kexec.c +++ b/kernel/kexec.c @@ -902,14 +902,14 @@ static int kimage_load_segment(struct kimage *image, * kexec does not sync, or unmount filesystems so if you need * that to happen you need to do that yourself. */ -struct kimage *kexec_image = NULL; -static struct kimage *kexec_crash_image = NULL; +struct kimage *kexec_image; +struct kimage *kexec_crash_image; /* * A home grown binary mutex. * Nothing can wait so this mutex is safe to use * in interrupt context :) */ -static int kexec_lock = 0; +static int kexec_lock; asmlinkage long sys_kexec_load(unsigned long entry, unsigned long nr_segments, struct kexec_segment __user *segments, @@ -1042,7 +1042,6 @@ asmlinkage long compat_sys_kexec_load(unsigned long entry, void crash_kexec(struct pt_regs *regs) { - struct kimage *image; int locked; @@ -1056,12 +1055,11 @@ void crash_kexec(struct pt_regs *regs) */ locked = xchg(&kexec_lock, 1); if (!locked) { - image = xchg(&kexec_crash_image, NULL); - if (image) { + if (kexec_crash_image) { struct pt_regs fixed_regs; crash_setup_regs(&fixed_regs, regs); machine_crash_shutdown(&fixed_regs); - machine_kexec(image); + machine_kexec(kexec_crash_image); } xchg(&kexec_lock, 0); } diff --git a/kernel/kmod.c b/kernel/kmod.c index d9b28584f..1e79dfcbe 100644 --- a/kernel/kmod.c +++ b/kernel/kmod.c @@ -20,7 +20,6 @@ */ #define __KERNEL_SYSCALLS__ -#include #include #include #include @@ -214,11 +213,12 @@ static void __call_usermodehelper(void *data) { struct subprocess_info *sub_info = data; pid_t pid; + int wait = sub_info->wait; /* CLONE_VFORK: wait until the usermode helper has execve'd * successfully We need the data structures to stay around * until that is done. */ - if (sub_info->wait) + if (wait) pid = kernel_thread(wait_for_helper, sub_info, CLONE_FS | CLONE_FILES | SIGCHLD); else @@ -228,7 +228,7 @@ static void __call_usermodehelper(void *data) if (pid < 0) { sub_info->retval = pid; complete(sub_info->complete); - } else if (!sub_info->wait) + } else if (!wait) complete(sub_info->complete); } @@ -250,7 +250,7 @@ static void __call_usermodehelper(void *data) int call_usermodehelper_keys(char *path, char **argv, char **envp, struct key *session_keyring, int wait) { - DECLARE_COMPLETION(done); + DECLARE_COMPLETION_ONSTACK(done); struct subprocess_info sub_info = { .complete = &done, .path = path, diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 1fbf466a2..3f57dfdc8 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c @@ -47,11 +47,17 @@ static struct hlist_head kprobe_table[KPROBE_TABLE_SIZE]; static struct hlist_head kretprobe_inst_table[KPROBE_TABLE_SIZE]; +static atomic_t kprobe_count; DEFINE_MUTEX(kprobe_mutex); /* Protects kprobe_table */ DEFINE_SPINLOCK(kretprobe_lock); /* Protects kretprobe_inst_table */ static DEFINE_PER_CPU(struct kprobe *, kprobe_instance) = NULL; +static struct notifier_block kprobe_page_fault_nb = { + .notifier_call = kprobe_exceptions_notify, + .priority = 0x7fffffff /* we need to notified first */ +}; + #ifdef __ARCH_WANT_KPROBES_INSN_SLOT /* * kprobe->ainsn.insn points to the copy of the instruction to be @@ -368,16 +374,15 @@ static inline void copy_kprobe(struct kprobe *old_p, struct kprobe *p) */ static int __kprobes add_new_kprobe(struct kprobe *old_p, struct kprobe *p) { - struct kprobe *kp; - if (p->break_handler) { - list_for_each_entry_rcu(kp, &old_p->list, list) { - if (kp->break_handler) - return -EEXIST; - } + if (old_p->break_handler) + return -EEXIST; list_add_tail_rcu(&p->list, &old_p->list); + old_p->break_handler = aggr_break_handler; } else list_add_rcu(&p->list, &old_p->list); + if (p->post_handler && !old_p->post_handler) + old_p->post_handler = aggr_post_handler; return 0; } @@ -388,11 +393,14 @@ static int __kprobes add_new_kprobe(struct kprobe *old_p, struct kprobe *p) static inline void add_aggr_kprobe(struct kprobe *ap, struct kprobe *p) { copy_kprobe(p, ap); + flush_insn_slot(ap); ap->addr = p->addr; ap->pre_handler = aggr_pre_handler; - ap->post_handler = aggr_post_handler; ap->fault_handler = aggr_fault_handler; - ap->break_handler = aggr_break_handler; + if (p->post_handler) + ap->post_handler = aggr_post_handler; + if (p->break_handler) + ap->break_handler = aggr_break_handler; INIT_LIST_HEAD(&ap->list); list_add_rcu(&p->list, &ap->list); @@ -464,6 +472,8 @@ static int __kprobes __register_kprobe(struct kprobe *p, old_p = get_kprobe(p->addr); if (old_p) { ret = register_aggr_kprobe(old_p, p); + if (!ret) + atomic_inc(&kprobe_count); goto out; } @@ -474,6 +484,10 @@ static int __kprobes __register_kprobe(struct kprobe *p, hlist_add_head_rcu(&p->hlist, &kprobe_table[hash_ptr(p->addr, KPROBE_HASH_BITS)]); + if (atomic_add_return(1, &kprobe_count) == \ + (ARCH_INACTIVE_KPROBE_COUNT + 1)) + register_page_fault_notifier(&kprobe_page_fault_nb); + arch_arm_kprobe(p); out: @@ -536,14 +550,40 @@ valid_p: kfree(old_p); } arch_remove_kprobe(p); + } else { + mutex_lock(&kprobe_mutex); + if (p->break_handler) + old_p->break_handler = NULL; + if (p->post_handler){ + list_for_each_entry_rcu(list_p, &old_p->list, list){ + if (list_p->post_handler){ + cleanup_p = 2; + break; + } + } + if (cleanup_p == 0) + old_p->post_handler = NULL; + } + mutex_unlock(&kprobe_mutex); } + + /* Call unregister_page_fault_notifier() + * if no probes are active + */ + mutex_lock(&kprobe_mutex); + if (atomic_add_return(-1, &kprobe_count) == \ + ARCH_INACTIVE_KPROBE_COUNT) + unregister_page_fault_notifier(&kprobe_page_fault_nb); + mutex_unlock(&kprobe_mutex); + return; } static struct notifier_block kprobe_exceptions_nb = { .notifier_call = kprobe_exceptions_notify, - .priority = 0x7fffffff /* we need to notified first */ + .priority = 0x7fffffff /* we need to be notified first */ }; + int __kprobes register_jprobe(struct jprobe *jp) { /* Todo: Verify probepoint is a function entry point */ @@ -652,6 +692,7 @@ static int __init init_kprobes(void) INIT_HLIST_HEAD(&kprobe_table[i]); INIT_HLIST_HEAD(&kretprobe_inst_table[i]); } + atomic_set(&kprobe_count, 0); err = arch_init_kprobes(); if (!err) diff --git a/kernel/ksysfs.c b/kernel/ksysfs.c index f119e098e..e0ffe4ab0 100644 --- a/kernel/ksysfs.c +++ b/kernel/ksysfs.c @@ -8,12 +8,12 @@ * */ -#include #include #include #include #include #include +#include #define KERNEL_ATTR_RO(_name) \ static struct subsys_attribute _name##_attr = __ATTR_RO(_name) @@ -48,6 +48,20 @@ static ssize_t uevent_helper_store(struct subsystem *subsys, const char *page, s KERNEL_ATTR_RW(uevent_helper); #endif +#ifdef CONFIG_KEXEC +static ssize_t kexec_loaded_show(struct subsystem *subsys, char *page) +{ + return sprintf(page, "%d\n", !!kexec_image); +} +KERNEL_ATTR_RO(kexec_loaded); + +static ssize_t kexec_crash_loaded_show(struct subsystem *subsys, char *page) +{ + return sprintf(page, "%d\n", !!kexec_crash_image); +} +KERNEL_ATTR_RO(kexec_crash_loaded); +#endif /* CONFIG_KEXEC */ + decl_subsys(kernel, NULL, NULL); EXPORT_SYMBOL_GPL(kernel_subsys); @@ -55,6 +69,10 @@ static struct attribute * kernel_attrs[] = { #if defined(CONFIG_HOTPLUG) && defined(CONFIG_NET) &uevent_seqnum_attr.attr, &uevent_helper_attr.attr, +#endif +#ifdef CONFIG_KEXEC + &kexec_loaded_attr.attr, + &kexec_crash_loaded_attr.attr, #endif NULL }; diff --git a/kernel/kthread.c b/kernel/kthread.c index c18d7c731..47cfe7230 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c @@ -45,6 +45,13 @@ struct kthread_stop_info static DEFINE_MUTEX(kthread_stop_lock); static struct kthread_stop_info kthread_stop_info; +/** + * kthread_should_stop - should this kthread return now? + * + * When someone calls kthread_stop on your kthread, it will be woken + * and this will return true. You should then return, and your return + * value will be passed through to kthread_stop(). + */ int kthread_should_stop(void) { return (kthread_stop_info.k == current); @@ -122,6 +129,25 @@ static void keventd_create_kthread(void *_create) complete(&create->done); } +/** + * kthread_create - create a kthread. + * @threadfn: the function to run until signal_pending(current). + * @data: data ptr for @threadfn. + * @namefmt: printf-style name for the thread. + * + * Description: This helper function creates and names a kernel + * thread. The thread will be stopped: use wake_up_process() to start + * it. See also kthread_run(), kthread_create_on_cpu(). + * + * When woken, the thread will run @threadfn() with @data as its + * argument. @threadfn can either call do_exit() directly if it is a + * standalone thread for which noone will call kthread_stop(), or + * return when 'kthread_should_stop()' is true (which means + * kthread_stop() has been called). The return value should be zero + * or a negative error number; it will be passed to kthread_stop(). + * + * Returns a task_struct or ERR_PTR(-ENOMEM). + */ struct task_struct *kthread_create(int (*threadfn)(void *data), void *data, const char namefmt[], @@ -156,6 +182,15 @@ struct task_struct *kthread_create(int (*threadfn)(void *data), } EXPORT_SYMBOL(kthread_create); +/** + * kthread_bind - bind a just-created kthread to a cpu. + * @k: thread created by kthread_create(). + * @cpu: cpu (might not be online, must be possible) for @k to run on. + * + * Description: This function is equivalent to set_cpus_allowed(), + * except that @cpu doesn't need to be online, and the thread must be + * stopped (i.e., just returned from kthread_create(). + */ void kthread_bind(struct task_struct *k, unsigned int cpu) { BUG_ON(k->state != TASK_INTERRUPTIBLE); @@ -166,13 +201,20 @@ void kthread_bind(struct task_struct *k, unsigned int cpu) } EXPORT_SYMBOL(kthread_bind); +/** + * kthread_stop - stop a thread created by kthread_create(). + * @k: thread created by kthread_create(). + * + * Sets kthread_should_stop() for @k to return true, wakes it, and + * waits for it to exit. Your threadfn() must not call do_exit() + * itself if you use this function! This can also be called after + * kthread_create() instead of calling wake_up_process(): the thread + * will exit without calling threadfn(). + * + * Returns the result of threadfn(), or %-EINTR if wake_up_process() + * was never called. + */ int kthread_stop(struct task_struct *k) -{ - return kthread_stop_sem(k, NULL); -} -EXPORT_SYMBOL(kthread_stop); - -int kthread_stop_sem(struct task_struct *k, struct semaphore *s) { int ret; @@ -187,10 +229,7 @@ int kthread_stop_sem(struct task_struct *k, struct semaphore *s) /* Now set kthread_should_stop() to true, and wake it up. */ kthread_stop_info.k = k; - if (s) - up(s); - else - wake_up_process(k); + wake_up_process(k); put_task_struct(k); /* Once it dies, reset stop ptr, gather result and we're done. */ @@ -201,7 +240,7 @@ int kthread_stop_sem(struct task_struct *k, struct semaphore *s) return ret; } -EXPORT_SYMBOL(kthread_stop_sem); +EXPORT_SYMBOL(kthread_stop); static __init int helper_init(void) { @@ -210,5 +249,5 @@ static __init int helper_init(void) return 0; } -core_initcall(helper_init); +core_initcall(helper_init); diff --git a/kernel/module-verify-sig.c b/kernel/module-verify-sig.c index 2a75a10a8..23fad538d 100644 --- a/kernel/module-verify-sig.c +++ b/kernel/module-verify-sig.c @@ -10,7 +10,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include diff --git a/kernel/module-verify.c b/kernel/module-verify.c index 85a23bcfe..0c6f8e41f 100644 --- a/kernel/module-verify.c +++ b/kernel/module-verify.c @@ -8,7 +8,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include diff --git a/kernel/module.c b/kernel/module.c index 893ec57b3..f9a59874e 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -1,4 +1,4 @@ -/* Rewritten by Rusty Russell, on the backs of many others... +/* Copyright (C) 2002 Richard Henderson Copyright (C) 2001 Rusty Russell, 2002 Rusty Russell IBM. @@ -16,7 +16,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include #include #include #include @@ -40,9 +39,11 @@ #include #include #include +#include #include #include #include +#include #include "module-verify.h" #if 0 @@ -121,9 +122,17 @@ extern const struct kernel_symbol __start___ksymtab_gpl[]; extern const struct kernel_symbol __stop___ksymtab_gpl[]; extern const struct kernel_symbol __start___ksymtab_gpl_future[]; extern const struct kernel_symbol __stop___ksymtab_gpl_future[]; +extern const struct kernel_symbol __start___ksymtab_unused[]; +extern const struct kernel_symbol __stop___ksymtab_unused[]; +extern const struct kernel_symbol __start___ksymtab_unused_gpl[]; +extern const struct kernel_symbol __stop___ksymtab_unused_gpl[]; +extern const struct kernel_symbol __start___ksymtab_gpl_future[]; +extern const struct kernel_symbol __stop___ksymtab_gpl_future[]; extern const unsigned long __start___kcrctab[]; extern const unsigned long __start___kcrctab_gpl[]; extern const unsigned long __start___kcrctab_gpl_future[]; +extern const unsigned long __start___kcrctab_unused[]; +extern const unsigned long __start___kcrctab_unused_gpl[]; #ifndef CONFIG_MODVERSIONS #define symversion(base, idx) NULL @@ -143,6 +152,17 @@ static const struct kernel_symbol *lookup_symbol(const char *name, return NULL; } +static void printk_unused_warning(const char *name) +{ + printk(KERN_WARNING "Symbol %s is marked as UNUSED, " + "however this module is using it.\n", name); + printk(KERN_WARNING "This symbol will go away in the future.\n"); + printk(KERN_WARNING "Please evalute if this is the right api to use, " + "and if it really is, submit a report the linux kernel " + "mailinglist together with submitting your code for " + "inclusion.\n"); +} + /* Find a symbol, return value, crc and module which owns it */ static unsigned long __find_symbol(const char *name, struct module **owner, @@ -185,6 +205,25 @@ static unsigned long __find_symbol(const char *name, return ks->value; } + ks = lookup_symbol(name, __start___ksymtab_unused, + __stop___ksymtab_unused); + if (ks) { + printk_unused_warning(name); + *crc = symversion(__start___kcrctab_unused, + (ks - __start___ksymtab_unused)); + return ks->value; + } + + if (gplok) + ks = lookup_symbol(name, __start___ksymtab_unused_gpl, + __stop___ksymtab_unused_gpl); + if (ks) { + printk_unused_warning(name); + *crc = symversion(__start___kcrctab_unused_gpl, + (ks - __start___ksymtab_unused_gpl)); + return ks->value; + } + /* Now try modules. */ list_for_each_entry(mod, &modules, list) { *owner = mod; @@ -203,6 +242,23 @@ static unsigned long __find_symbol(const char *name, return ks->value; } } + ks = lookup_symbol(name, mod->unused_syms, mod->unused_syms + mod->num_unused_syms); + if (ks) { + printk_unused_warning(name); + *crc = symversion(mod->unused_crcs, (ks - mod->unused_syms)); + return ks->value; + } + + if (gplok) { + ks = lookup_symbol(name, mod->unused_gpl_syms, + mod->unused_gpl_syms + mod->num_unused_gpl_syms); + if (ks) { + printk_unused_warning(name); + *crc = symversion(mod->unused_gpl_crcs, + (ks - mod->unused_gpl_syms)); + return ks->value; + } + } ks = lookup_symbol(name, mod->gpl_future_syms, (mod->gpl_future_syms + mod->num_gpl_future_syms)); @@ -999,6 +1055,12 @@ static int mod_sysfs_setup(struct module *mod, { int err; + if (!module_subsys.kset.subsys) { + printk(KERN_ERR "%s: module_subsys not initialized\n", + mod->name); + err = -EINVAL; + goto out; + } memset(&mod->mkobj.kobj, 0, sizeof(mod->mkobj.kobj)); err = kobject_set_name(&mod->mkobj.kobj, "%s", mod->name); if (err) @@ -1052,6 +1114,8 @@ static void free_module(struct module *mod) remove_sect_attrs(mod); mod_kobject_remove(mod); + unwind_remove_table(mod->unwind_info, 0); + /* Arch-specific cleanup. */ module_arch_cleanup(mod); @@ -1064,6 +1128,9 @@ static void free_module(struct module *mod) if (mod->percpu) percpu_modfree(mod->percpu); + /* Free lock-classes: */ + lockdep_free_key_range(mod->module_core, mod->core_size); + /* Finally, free the core (containing the module structure) */ module_free(mod, mod->module_core); } @@ -1249,16 +1316,6 @@ static void layout_sections(struct module *mod, } } -static inline int license_is_gpl_compatible(const char *license) -{ - return (strcmp(license, "GPL") == 0 - || strcmp(license, "GPL v2") == 0 - || strcmp(license, "GPL and additional rights") == 0 - || strcmp(license, "Dual BSD/GPL") == 0 - || strcmp(license, "Dual MIT/GPL") == 0 - || strcmp(license, "Dual MPL/GPL") == 0); -} - static void set_license(struct module *mod, const char *license) { if (!license) @@ -1327,7 +1384,7 @@ int is_exported(const char *name, const struct module *mod) if (!mod && lookup_symbol(name, __start___ksymtab, __stop___ksymtab)) return 1; else - if (lookup_symbol(name, mod->syms, mod->syms + mod->num_syms)) + if (mod && lookup_symbol(name, mod->syms, mod->syms + mod->num_syms)) return 1; else return 0; @@ -1410,10 +1467,27 @@ static struct module *load_module(void __user *umod, Elf_Ehdr *hdr; Elf_Shdr *sechdrs; char *secstrings, *args, *modmagic, *strtab = NULL; - unsigned int i, symindex = 0, strindex = 0, setupindex, exindex, - exportindex, modindex, obsparmindex, infoindex, gplindex, - crcindex, gplcrcindex, versindex, pcpuindex, gplfutureindex, - gplfuturecrcindex; + unsigned int i; + unsigned int symindex = 0; + unsigned int strindex = 0; + unsigned int setupindex; + unsigned int exindex; + unsigned int exportindex; + unsigned int modindex; + unsigned int obsparmindex; + unsigned int infoindex; + unsigned int gplindex; + unsigned int crcindex; + unsigned int gplcrcindex; + unsigned int versindex; + unsigned int pcpuindex; + unsigned int gplfutureindex; + unsigned int gplfuturecrcindex; + unsigned int unwindex = 0; + unsigned int unusedindex; + unsigned int unusedcrcindex; + unsigned int unusedgplindex; + unsigned int unusedgplcrcindex; struct module *mod; long err = 0; void *percpu = NULL, *ptr = NULL; /* Stops spurious gcc warning */ @@ -1501,15 +1575,22 @@ static struct module *load_module(void __user *umod, exportindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab"); gplindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab_gpl"); gplfutureindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab_gpl_future"); + unusedindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab_unused"); + unusedgplindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab_unused_gpl"); crcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab"); gplcrcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab_gpl"); gplfuturecrcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab_gpl_future"); + unusedcrcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab_unused"); + unusedgplcrcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab_unused_gpl"); setupindex = find_sec(hdr, sechdrs, secstrings, "__param"); exindex = find_sec(hdr, sechdrs, secstrings, "__ex_table"); obsparmindex = find_sec(hdr, sechdrs, secstrings, "__obsparm"); versindex = find_sec(hdr, sechdrs, secstrings, "__versions"); infoindex = find_sec(hdr, sechdrs, secstrings, ".modinfo"); pcpuindex = find_pcpusec(hdr, sechdrs, secstrings); +#ifdef ARCH_UNWIND_SECTION_NAME + unwindex = find_sec(hdr, sechdrs, secstrings, ARCH_UNWIND_SECTION_NAME); +#endif /* Don't keep modinfo section */ sechdrs[infoindex].sh_flags &= ~(unsigned long)SHF_ALLOC; @@ -1518,6 +1599,8 @@ static struct module *load_module(void __user *umod, sechdrs[symindex].sh_flags |= SHF_ALLOC; sechdrs[strindex].sh_flags |= SHF_ALLOC; #endif + if (unwindex) + sechdrs[unwindex].sh_flags |= SHF_ALLOC; /* Check module struct version now, before we try to use module. */ if (!check_modstruct_version(sechdrs, versindex, mod)) { @@ -1647,14 +1730,27 @@ static struct module *load_module(void __user *umod, mod->gpl_crcs = (void *)sechdrs[gplcrcindex].sh_addr; mod->num_gpl_future_syms = sechdrs[gplfutureindex].sh_size / sizeof(*mod->gpl_future_syms); + mod->num_unused_syms = sechdrs[unusedindex].sh_size / + sizeof(*mod->unused_syms); + mod->num_unused_gpl_syms = sechdrs[unusedgplindex].sh_size / + sizeof(*mod->unused_gpl_syms); mod->gpl_future_syms = (void *)sechdrs[gplfutureindex].sh_addr; if (gplfuturecrcindex) mod->gpl_future_crcs = (void *)sechdrs[gplfuturecrcindex].sh_addr; + mod->unused_syms = (void *)sechdrs[unusedindex].sh_addr; + if (unusedcrcindex) + mod->unused_crcs = (void *)sechdrs[unusedcrcindex].sh_addr; + mod->unused_gpl_syms = (void *)sechdrs[unusedgplindex].sh_addr; + if (unusedgplcrcindex) + mod->unused_crcs = (void *)sechdrs[unusedgplcrcindex].sh_addr; + #ifdef CONFIG_MODVERSIONS if ((mod->num_syms && !crcindex) || (mod->num_gpl_syms && !gplcrcindex) || - (mod->num_gpl_future_syms && !gplfuturecrcindex)) { + (mod->num_gpl_future_syms && !gplfuturecrcindex) || + (mod->num_unused_syms && !unusedcrcindex) || + (mod->num_unused_gpl_syms && !unusedgplcrcindex)) { printk(KERN_WARNING "%s: No versions for exported symbols." " Tainting kernel.\n", mod->name); add_taint(TAINT_FORCED_MODULE); @@ -1746,6 +1842,11 @@ static struct module *load_module(void __user *umod, goto arch_cleanup; add_sect_attrs(mod, hdr->e_shnum, secstrings, sechdrs); + /* Size of section 0 is 0, so this works well if no unwind info. */ + mod->unwind_info = unwind_add_table(mod, + (void *)sechdrs[unwindex].sh_addr, + sechdrs[unwindex].sh_size); + /* Get rid of temporary copy */ vfree(hdr); @@ -1844,6 +1945,7 @@ sys_init_module(void __user *umod, mod->state = MODULE_STATE_LIVE; /* Drop initial reference. */ module_put(mod); + unwind_remove_table(mod->unwind_info, 1); module_free(mod, mod->module_init); mod->module_init = NULL; mod->init_size = 0; @@ -1931,10 +2033,8 @@ const char *module_address_lookup(unsigned long addr, return NULL; } -struct module *module_get_kallsym(unsigned int symnum, - unsigned long *value, - char *type, - char namebuf[128]) +struct module *module_get_kallsym(unsigned int symnum, unsigned long *value, + char *type, char *name, size_t namelen) { struct module *mod; @@ -1943,9 +2043,8 @@ struct module *module_get_kallsym(unsigned int symnum, if (symnum < mod->num_symtab) { *value = mod->symtab[symnum].st_value; *type = mod->symtab[symnum].st_info; - strncpy(namebuf, - mod->strtab + mod->symtab[symnum].st_name, - 127); + strlcpy(name, mod->strtab + mod->symtab[symnum].st_name, + namelen); mutex_unlock(&module_mutex); return mod; } @@ -2074,6 +2173,29 @@ const struct exception_table_entry *search_module_extables(unsigned long addr) return e; } +/* + * Is this a valid module address? + */ +int is_module_address(unsigned long addr) +{ + unsigned long flags; + struct module *mod; + + spin_lock_irqsave(&modlist_lock, flags); + + list_for_each_entry(mod, &modules, list) { + if (within(addr, mod->module_core, mod->core_size)) { + spin_unlock_irqrestore(&modlist_lock, flags); + return 1; + } + } + + spin_unlock_irqrestore(&modlist_lock, flags); + + return 0; +} + + /* Is this a valid kernel address? We don't grab the lock: we are oopsing. */ struct module *__module_text_address(unsigned long addr) { diff --git a/kernel/mutex-debug.c b/kernel/mutex-debug.c index f4913c376..18651641a 100644 --- a/kernel/mutex-debug.c +++ b/kernel/mutex-debug.c @@ -16,395 +16,48 @@ #include #include #include +#include #include #include #include +#include #include "mutex-debug.h" -/* - * We need a global lock when we walk through the multi-process - * lock tree. Only used in the deadlock-debugging case. - */ -DEFINE_SPINLOCK(debug_mutex_lock); - -/* - * All locks held by all tasks, in a single global list: - */ -LIST_HEAD(debug_mutex_held_locks); - -/* - * In the debug case we carry the caller's instruction pointer into - * other functions, but we dont want the function argument overhead - * in the nondebug case - hence these macros: - */ -#define __IP_DECL__ , unsigned long ip -#define __IP__ , ip -#define __RET_IP__ , (unsigned long)__builtin_return_address(0) - -/* - * "mutex debugging enabled" flag. We turn it off when we detect - * the first problem because we dont want to recurse back - * into the tracing code when doing error printk or - * executing a BUG(): - */ -int debug_mutex_on = 1; - -static void printk_task(struct task_struct *p) -{ - if (p) - printk("%16s:%5d [%p, %3d]", p->comm, p->pid, p, p->prio); - else - printk(""); -} - -static void printk_ti(struct thread_info *ti) -{ - if (ti) - printk_task(ti->task); - else - printk(""); -} - -static void printk_task_short(struct task_struct *p) -{ - if (p) - printk("%s/%d [%p, %3d]", p->comm, p->pid, p, p->prio); - else - printk(""); -} - -static void printk_lock(struct mutex *lock, int print_owner) -{ - printk(" [%p] {%s}\n", lock, lock->name); - - if (print_owner && lock->owner) { - printk(".. held by: "); - printk_ti(lock->owner); - printk("\n"); - } - if (lock->owner) { - printk("... acquired at: "); - print_symbol("%s\n", lock->acquire_ip); - } -} - -/* - * printk locks held by a task: - */ -static void show_task_locks(struct task_struct *p) -{ - switch (p->state) { - case TASK_RUNNING: printk("R"); break; - case TASK_INTERRUPTIBLE: printk("S"); break; - case TASK_UNINTERRUPTIBLE: printk("D"); break; - case TASK_STOPPED: printk("T"); break; - case EXIT_ZOMBIE: printk("Z"); break; - case EXIT_DEAD: printk("X"); break; - default: printk("?"); break; - } - printk_task(p); - if (p->blocked_on) { - struct mutex *lock = p->blocked_on->lock; - - printk(" blocked on mutex:"); - printk_lock(lock, 1); - } else - printk(" (not blocked on mutex)\n"); -} - -/* - * printk all locks held in the system (if filter == NULL), - * or all locks belonging to a single task (if filter != NULL): - */ -void show_held_locks(struct task_struct *filter) -{ - struct list_head *curr, *cursor = NULL; - struct mutex *lock; - struct thread_info *t; - unsigned long flags; - int count = 0; - - if (filter) { - printk("------------------------------\n"); - printk("| showing all locks held by: | ("); - printk_task_short(filter); - printk("):\n"); - printk("------------------------------\n"); - } else { - printk("---------------------------\n"); - printk("| showing all locks held: |\n"); - printk("---------------------------\n"); - } - - /* - * Play safe and acquire the global trace lock. We - * cannot printk with that lock held so we iterate - * very carefully: - */ -next: - debug_spin_lock_save(&debug_mutex_lock, flags); - list_for_each(curr, &debug_mutex_held_locks) { - if (cursor && curr != cursor) - continue; - lock = list_entry(curr, struct mutex, held_list); - t = lock->owner; - if (filter && (t != filter->thread_info)) - continue; - count++; - cursor = curr->next; - debug_spin_lock_restore(&debug_mutex_lock, flags); - - printk("\n#%03d: ", count); - printk_lock(lock, filter ? 0 : 1); - goto next; - } - debug_spin_lock_restore(&debug_mutex_lock, flags); - printk("\n"); -} - -void mutex_debug_show_all_locks(void) -{ - struct task_struct *g, *p; - int count = 10; - int unlock = 1; - - printk("\nShowing all blocking locks in the system:\n"); - - /* - * Here we try to get the tasklist_lock as hard as possible, - * if not successful after 2 seconds we ignore it (but keep - * trying). This is to enable a debug printout even if a - * tasklist_lock-holding task deadlocks or crashes. - */ -retry: - if (!read_trylock(&tasklist_lock)) { - if (count == 10) - printk("hm, tasklist_lock locked, retrying... "); - if (count) { - count--; - printk(" #%d", 10-count); - mdelay(200); - goto retry; - } - printk(" ignoring it.\n"); - unlock = 0; - } - if (count != 10) - printk(" locked it.\n"); - - do_each_thread(g, p) { - show_task_locks(p); - if (!unlock) - if (read_trylock(&tasklist_lock)) - unlock = 1; - } while_each_thread(g, p); - - printk("\n"); - show_held_locks(NULL); - printk("=============================================\n\n"); - - if (unlock) - read_unlock(&tasklist_lock); -} - -static void report_deadlock(struct task_struct *task, struct mutex *lock, - struct mutex *lockblk, unsigned long ip) -{ - printk("\n%s/%d is trying to acquire this lock:\n", - current->comm, current->pid); - printk_lock(lock, 1); - printk("... trying at: "); - print_symbol("%s\n", ip); - show_held_locks(current); - - if (lockblk) { - printk("but %s/%d is deadlocking current task %s/%d!\n\n", - task->comm, task->pid, current->comm, current->pid); - printk("\n%s/%d is blocked on this lock:\n", - task->comm, task->pid); - printk_lock(lockblk, 1); - - show_held_locks(task); - - printk("\n%s/%d's [blocked] stackdump:\n\n", - task->comm, task->pid); - show_stack(task, NULL); - } - - printk("\n%s/%d's [current] stackdump:\n\n", - current->comm, current->pid); - dump_stack(); - mutex_debug_show_all_locks(); - printk("[ turning off deadlock detection. Please report this. ]\n\n"); - local_irq_disable(); -} - -/* - * Recursively check for mutex deadlocks: - */ -static int check_deadlock(struct mutex *lock, int depth, - struct thread_info *ti, unsigned long ip) -{ - struct mutex *lockblk; - struct task_struct *task; - - if (!debug_mutex_on) - return 0; - - ti = lock->owner; - if (!ti) - return 0; - - task = ti->task; - lockblk = NULL; - if (task->blocked_on) - lockblk = task->blocked_on->lock; - - /* Self-deadlock: */ - if (current == task) { - DEBUG_OFF(); - if (depth) - return 1; - printk("\n==========================================\n"); - printk( "[ BUG: lock recursion deadlock detected! |\n"); - printk( "------------------------------------------\n"); - report_deadlock(task, lock, NULL, ip); - return 0; - } - - /* Ugh, something corrupted the lock data structure? */ - if (depth > 20) { - DEBUG_OFF(); - printk("\n===========================================\n"); - printk( "[ BUG: infinite lock dependency detected!? |\n"); - printk( "-------------------------------------------\n"); - report_deadlock(task, lock, lockblk, ip); - return 0; - } - - /* Recursively check for dependencies: */ - if (lockblk && check_deadlock(lockblk, depth+1, ti, ip)) { - printk("\n============================================\n"); - printk( "[ BUG: circular locking deadlock detected! ]\n"); - printk( "--------------------------------------------\n"); - report_deadlock(task, lock, lockblk, ip); - return 0; - } - return 0; -} - -/* - * Called when a task exits, this function checks whether the - * task is holding any locks, and reports the first one if so: - */ -void mutex_debug_check_no_locks_held(struct task_struct *task) -{ - struct list_head *curr, *next; - struct thread_info *t; - unsigned long flags; - struct mutex *lock; - - if (!debug_mutex_on) - return; - - debug_spin_lock_save(&debug_mutex_lock, flags); - list_for_each_safe(curr, next, &debug_mutex_held_locks) { - lock = list_entry(curr, struct mutex, held_list); - t = lock->owner; - if (t != task->thread_info) - continue; - list_del_init(curr); - DEBUG_OFF(); - debug_spin_lock_restore(&debug_mutex_lock, flags); - - printk("BUG: %s/%d, lock held at task exit time!\n", - task->comm, task->pid); - printk_lock(lock, 1); - if (lock->owner != task->thread_info) - printk("exiting task is not even the owner??\n"); - return; - } - debug_spin_lock_restore(&debug_mutex_lock, flags); -} - -/* - * Called when kernel memory is freed (or unmapped), or if a mutex - * is destroyed or reinitialized - this code checks whether there is - * any held lock in the memory range of to : - */ -void mutex_debug_check_no_locks_freed(const void *from, unsigned long len) -{ - struct list_head *curr, *next; - const void *to = from + len; - unsigned long flags; - struct mutex *lock; - void *lock_addr; - - if (!debug_mutex_on) - return; - - debug_spin_lock_save(&debug_mutex_lock, flags); - list_for_each_safe(curr, next, &debug_mutex_held_locks) { - lock = list_entry(curr, struct mutex, held_list); - lock_addr = lock; - if (lock_addr < from || lock_addr >= to) - continue; - list_del_init(curr); - DEBUG_OFF(); - debug_spin_lock_restore(&debug_mutex_lock, flags); - - printk("BUG: %s/%d, active lock [%p(%p-%p)] freed!\n", - current->comm, current->pid, lock, from, to); - dump_stack(); - printk_lock(lock, 1); - if (lock->owner != current_thread_info()) - printk("freeing task is not even the owner??\n"); - return; - } - debug_spin_lock_restore(&debug_mutex_lock, flags); -} - /* * Must be called with lock->wait_lock held. */ -void debug_mutex_set_owner(struct mutex *lock, - struct thread_info *new_owner __IP_DECL__) +void debug_mutex_set_owner(struct mutex *lock, struct thread_info *new_owner) { lock->owner = new_owner; - DEBUG_WARN_ON(!list_empty(&lock->held_list)); - if (debug_mutex_on) { - list_add_tail(&lock->held_list, &debug_mutex_held_locks); - lock->acquire_ip = ip; - } } -void debug_mutex_init_waiter(struct mutex_waiter *waiter) +void debug_mutex_lock_common(struct mutex *lock, struct mutex_waiter *waiter) { - memset(waiter, 0x11, sizeof(*waiter)); + memset(waiter, MUTEX_DEBUG_INIT, sizeof(*waiter)); waiter->magic = waiter; INIT_LIST_HEAD(&waiter->list); } void debug_mutex_wake_waiter(struct mutex *lock, struct mutex_waiter *waiter) { - SMP_DEBUG_WARN_ON(!spin_is_locked(&lock->wait_lock)); - DEBUG_WARN_ON(list_empty(&lock->wait_list)); - DEBUG_WARN_ON(waiter->magic != waiter); - DEBUG_WARN_ON(list_empty(&waiter->list)); + SMP_DEBUG_LOCKS_WARN_ON(!spin_is_locked(&lock->wait_lock)); + DEBUG_LOCKS_WARN_ON(list_empty(&lock->wait_list)); + DEBUG_LOCKS_WARN_ON(waiter->magic != waiter); + DEBUG_LOCKS_WARN_ON(list_empty(&waiter->list)); } void debug_mutex_free_waiter(struct mutex_waiter *waiter) { - DEBUG_WARN_ON(!list_empty(&waiter->list)); - memset(waiter, 0x22, sizeof(*waiter)); + DEBUG_LOCKS_WARN_ON(!list_empty(&waiter->list)); + memset(waiter, MUTEX_DEBUG_FREE, sizeof(*waiter)); } void debug_mutex_add_waiter(struct mutex *lock, struct mutex_waiter *waiter, - struct thread_info *ti __IP_DECL__) + struct thread_info *ti) { - SMP_DEBUG_WARN_ON(!spin_is_locked(&lock->wait_lock)); - check_deadlock(lock, 0, ti, ip); + SMP_DEBUG_LOCKS_WARN_ON(!spin_is_locked(&lock->wait_lock)); + /* Mark the current thread as blocked on the lock: */ ti->task->blocked_on = waiter; waiter->lock = lock; @@ -413,9 +66,9 @@ void debug_mutex_add_waiter(struct mutex *lock, struct mutex_waiter *waiter, void mutex_remove_waiter(struct mutex *lock, struct mutex_waiter *waiter, struct thread_info *ti) { - DEBUG_WARN_ON(list_empty(&waiter->list)); - DEBUG_WARN_ON(waiter->task != ti->task); - DEBUG_WARN_ON(ti->task->blocked_on != waiter); + DEBUG_LOCKS_WARN_ON(list_empty(&waiter->list)); + DEBUG_LOCKS_WARN_ON(waiter->task != ti->task); + DEBUG_LOCKS_WARN_ON(ti->task->blocked_on != waiter); ti->task->blocked_on = NULL; list_del_init(&waiter->list); @@ -424,24 +77,23 @@ void mutex_remove_waiter(struct mutex *lock, struct mutex_waiter *waiter, void debug_mutex_unlock(struct mutex *lock) { - DEBUG_WARN_ON(lock->magic != lock); - DEBUG_WARN_ON(!lock->wait_list.prev && !lock->wait_list.next); - DEBUG_WARN_ON(lock->owner != current_thread_info()); - if (debug_mutex_on) { - DEBUG_WARN_ON(list_empty(&lock->held_list)); - list_del_init(&lock->held_list); - } + DEBUG_LOCKS_WARN_ON(lock->owner != current_thread_info()); + DEBUG_LOCKS_WARN_ON(lock->magic != lock); + DEBUG_LOCKS_WARN_ON(!lock->wait_list.prev && !lock->wait_list.next); + DEBUG_LOCKS_WARN_ON(lock->owner != current_thread_info()); } -void debug_mutex_init(struct mutex *lock, const char *name) +void debug_mutex_init(struct mutex *lock, const char *name, + struct lock_class_key *key) { +#ifdef CONFIG_DEBUG_LOCK_ALLOC /* * Make sure we are not reinitializing a held lock: */ - mutex_debug_check_no_locks_freed((void *)lock, sizeof(*lock)); + debug_check_no_locks_freed((void *)lock, sizeof(*lock)); + lockdep_init_map(&lock->dep_map, name, key, 0); +#endif lock->owner = NULL; - INIT_LIST_HEAD(&lock->held_list); - lock->name = name; lock->magic = lock; } @@ -455,7 +107,7 @@ void debug_mutex_init(struct mutex *lock, const char *name) */ void fastcall mutex_destroy(struct mutex *lock) { - DEBUG_WARN_ON(mutex_is_locked(lock)); + DEBUG_LOCKS_WARN_ON(mutex_is_locked(lock)); lock->magic = NULL; } diff --git a/kernel/mutex-debug.h b/kernel/mutex-debug.h index fd384050a..babfbdfc5 100644 --- a/kernel/mutex-debug.h +++ b/kernel/mutex-debug.h @@ -10,125 +10,44 @@ * More details are in kernel/mutex-debug.c. */ -extern spinlock_t debug_mutex_lock; -extern struct list_head debug_mutex_held_locks; -extern int debug_mutex_on; - -/* - * In the debug case we carry the caller's instruction pointer into - * other functions, but we dont want the function argument overhead - * in the nondebug case - hence these macros: - */ -#define __IP_DECL__ , unsigned long ip -#define __IP__ , ip -#define __RET_IP__ , (unsigned long)__builtin_return_address(0) - /* * This must be called with lock->wait_lock held. */ -extern void debug_mutex_set_owner(struct mutex *lock, - struct thread_info *new_owner __IP_DECL__); +extern void +debug_mutex_set_owner(struct mutex *lock, struct thread_info *new_owner); static inline void debug_mutex_clear_owner(struct mutex *lock) { lock->owner = NULL; } -extern void debug_mutex_init_waiter(struct mutex_waiter *waiter); +extern void debug_mutex_lock_common(struct mutex *lock, + struct mutex_waiter *waiter); extern void debug_mutex_wake_waiter(struct mutex *lock, struct mutex_waiter *waiter); extern void debug_mutex_free_waiter(struct mutex_waiter *waiter); extern void debug_mutex_add_waiter(struct mutex *lock, struct mutex_waiter *waiter, - struct thread_info *ti __IP_DECL__); + struct thread_info *ti); extern void mutex_remove_waiter(struct mutex *lock, struct mutex_waiter *waiter, struct thread_info *ti); extern void debug_mutex_unlock(struct mutex *lock); -extern void debug_mutex_init(struct mutex *lock, const char *name); - -#define debug_spin_lock(lock) \ - do { \ - local_irq_disable(); \ - if (debug_mutex_on) \ - spin_lock(lock); \ - } while (0) +extern void debug_mutex_init(struct mutex *lock, const char *name, + struct lock_class_key *key); -#define debug_spin_unlock(lock) \ - do { \ - if (debug_mutex_on) \ - spin_unlock(lock); \ - local_irq_enable(); \ - preempt_check_resched(); \ - } while (0) - -#define debug_spin_lock_save(lock, flags) \ +#define spin_lock_mutex(lock, flags) \ do { \ + struct mutex *l = container_of(lock, struct mutex, wait_lock); \ + \ + DEBUG_LOCKS_WARN_ON(in_interrupt()); \ local_irq_save(flags); \ - if (debug_mutex_on) \ - spin_lock(lock); \ + __raw_spin_lock(&(lock)->raw_lock); \ + DEBUG_LOCKS_WARN_ON(l->magic != l); \ } while (0) -#define debug_spin_lock_restore(lock, flags) \ +#define spin_unlock_mutex(lock, flags) \ do { \ - if (debug_mutex_on) \ - spin_unlock(lock); \ + __raw_spin_unlock(&(lock)->raw_lock); \ local_irq_restore(flags); \ preempt_check_resched(); \ } while (0) - -#define spin_lock_mutex(lock) \ - do { \ - struct mutex *l = container_of(lock, struct mutex, wait_lock); \ - \ - DEBUG_WARN_ON(in_interrupt()); \ - debug_spin_lock(&debug_mutex_lock); \ - spin_lock(lock); \ - DEBUG_WARN_ON(l->magic != l); \ - } while (0) - -#define spin_unlock_mutex(lock) \ - do { \ - spin_unlock(lock); \ - debug_spin_unlock(&debug_mutex_lock); \ - } while (0) - -#define DEBUG_OFF() \ -do { \ - if (debug_mutex_on) { \ - debug_mutex_on = 0; \ - console_verbose(); \ - if (spin_is_locked(&debug_mutex_lock)) \ - spin_unlock(&debug_mutex_lock); \ - } \ -} while (0) - -#define DEBUG_BUG() \ -do { \ - if (debug_mutex_on) { \ - DEBUG_OFF(); \ - BUG(); \ - } \ -} while (0) - -#define DEBUG_WARN_ON(c) \ -do { \ - if (unlikely(c && debug_mutex_on)) { \ - DEBUG_OFF(); \ - WARN_ON(1); \ - } \ -} while (0) - -# define DEBUG_BUG_ON(c) \ -do { \ - if (unlikely(c)) \ - DEBUG_BUG(); \ -} while (0) - -#ifdef CONFIG_SMP -# define SMP_DEBUG_WARN_ON(c) DEBUG_WARN_ON(c) -# define SMP_DEBUG_BUG_ON(c) DEBUG_BUG_ON(c) -#else -# define SMP_DEBUG_WARN_ON(c) do { } while (0) -# define SMP_DEBUG_BUG_ON(c) do { } while (0) -#endif - diff --git a/kernel/mutex.c b/kernel/mutex.c index 5449b210d..8c71cf72a 100644 --- a/kernel/mutex.c +++ b/kernel/mutex.c @@ -17,6 +17,7 @@ #include #include #include +#include /* * In the DEBUG case we are using the "NULL fastpath" for mutexes, @@ -38,13 +39,14 @@ * * It is not allowed to initialize an already locked mutex. */ -void fastcall __mutex_init(struct mutex *lock, const char *name) +void +__mutex_init(struct mutex *lock, const char *name, struct lock_class_key *key) { atomic_set(&lock->count, 1); spin_lock_init(&lock->wait_lock); INIT_LIST_HEAD(&lock->wait_list); - debug_mutex_init(lock, name); + debug_mutex_init(lock, name, key); } EXPORT_SYMBOL(__mutex_init); @@ -56,7 +58,7 @@ EXPORT_SYMBOL(__mutex_init); * branch is predicted by the CPU as default-untaken. */ static void fastcall noinline __sched -__mutex_lock_slowpath(atomic_t *lock_count __IP_DECL__); +__mutex_lock_slowpath(atomic_t *lock_count); /*** * mutex_lock - acquire the mutex @@ -79,7 +81,7 @@ __mutex_lock_slowpath(atomic_t *lock_count __IP_DECL__); * * This function is similar to (but not equivalent to) down(). */ -void fastcall __sched mutex_lock(struct mutex *lock) +void inline fastcall __sched mutex_lock(struct mutex *lock) { might_sleep(); /* @@ -92,7 +94,7 @@ void fastcall __sched mutex_lock(struct mutex *lock) EXPORT_SYMBOL(mutex_lock); static void fastcall noinline __sched -__mutex_unlock_slowpath(atomic_t *lock_count __IP_DECL__); +__mutex_unlock_slowpath(atomic_t *lock_count); /*** * mutex_unlock - release the mutex @@ -120,17 +122,18 @@ EXPORT_SYMBOL(mutex_unlock); * Lock a mutex (possibly interruptible), slowpath: */ static inline int __sched -__mutex_lock_common(struct mutex *lock, long state __IP_DECL__) +__mutex_lock_common(struct mutex *lock, long state, unsigned int subclass) { struct task_struct *task = current; struct mutex_waiter waiter; unsigned int old_val; + unsigned long flags; - debug_mutex_init_waiter(&waiter); + spin_lock_mutex(&lock->wait_lock, flags); - spin_lock_mutex(&lock->wait_lock); - - debug_mutex_add_waiter(lock, &waiter, task->thread_info, ip); + debug_mutex_lock_common(lock, &waiter); + mutex_acquire(&lock->dep_map, subclass, 0, _RET_IP_); + debug_mutex_add_waiter(lock, &waiter, task->thread_info); /* add waiting tasks to the end of the waitqueue (FIFO): */ list_add_tail(&waiter.list, &lock->wait_list); @@ -157,7 +160,8 @@ __mutex_lock_common(struct mutex *lock, long state __IP_DECL__) if (unlikely(state == TASK_INTERRUPTIBLE && signal_pending(task))) { mutex_remove_waiter(lock, &waiter, task->thread_info); - spin_unlock_mutex(&lock->wait_lock); + mutex_release(&lock->dep_map, 1, _RET_IP_); + spin_unlock_mutex(&lock->wait_lock, flags); debug_mutex_free_waiter(&waiter); return -EINTR; @@ -165,48 +169,57 @@ __mutex_lock_common(struct mutex *lock, long state __IP_DECL__) __set_task_state(task, state); /* didnt get the lock, go to sleep: */ - spin_unlock_mutex(&lock->wait_lock); + spin_unlock_mutex(&lock->wait_lock, flags); schedule(); - spin_lock_mutex(&lock->wait_lock); + spin_lock_mutex(&lock->wait_lock, flags); } /* got the lock - rejoice! */ mutex_remove_waiter(lock, &waiter, task->thread_info); - debug_mutex_set_owner(lock, task->thread_info __IP__); + debug_mutex_set_owner(lock, task->thread_info); /* set it to 0 if there are no waiters left: */ if (likely(list_empty(&lock->wait_list))) atomic_set(&lock->count, 0); - spin_unlock_mutex(&lock->wait_lock); + spin_unlock_mutex(&lock->wait_lock, flags); debug_mutex_free_waiter(&waiter); - DEBUG_WARN_ON(list_empty(&lock->held_list)); - DEBUG_WARN_ON(lock->owner != task->thread_info); - return 0; } static void fastcall noinline __sched -__mutex_lock_slowpath(atomic_t *lock_count __IP_DECL__) +__mutex_lock_slowpath(atomic_t *lock_count) { struct mutex *lock = container_of(lock_count, struct mutex, count); - __mutex_lock_common(lock, TASK_UNINTERRUPTIBLE __IP__); + __mutex_lock_common(lock, TASK_UNINTERRUPTIBLE, 0); +} + +#ifdef CONFIG_DEBUG_LOCK_ALLOC +void __sched +mutex_lock_nested(struct mutex *lock, unsigned int subclass) +{ + might_sleep(); + __mutex_lock_common(lock, TASK_UNINTERRUPTIBLE, subclass); } +EXPORT_SYMBOL_GPL(mutex_lock_nested); +#endif + /* * Release the lock, slowpath: */ -static fastcall noinline void -__mutex_unlock_slowpath(atomic_t *lock_count __IP_DECL__) +static fastcall inline void +__mutex_unlock_common_slowpath(atomic_t *lock_count, int nested) { struct mutex *lock = container_of(lock_count, struct mutex, count); + unsigned long flags; - DEBUG_WARN_ON(lock->owner != current_thread_info()); - - spin_lock_mutex(&lock->wait_lock); + spin_lock_mutex(&lock->wait_lock, flags); + mutex_release(&lock->dep_map, nested, _RET_IP_); + debug_mutex_unlock(lock); /* * some architectures leave the lock unlocked in the fastpath failure @@ -216,8 +229,6 @@ __mutex_unlock_slowpath(atomic_t *lock_count __IP_DECL__) if (__mutex_slowpath_needs_to_unlock()) atomic_set(&lock->count, 1); - debug_mutex_unlock(lock); - if (!list_empty(&lock->wait_list)) { /* get the first entry from the wait-list: */ struct mutex_waiter *waiter = @@ -231,7 +242,16 @@ __mutex_unlock_slowpath(atomic_t *lock_count __IP_DECL__) debug_mutex_clear_owner(lock); - spin_unlock_mutex(&lock->wait_lock); + spin_unlock_mutex(&lock->wait_lock, flags); +} + +/* + * Release the lock, slowpath: + */ +static fastcall noinline void +__mutex_unlock_slowpath(atomic_t *lock_count) +{ + __mutex_unlock_common_slowpath(lock_count, 1); } /* @@ -239,7 +259,7 @@ __mutex_unlock_slowpath(atomic_t *lock_count __IP_DECL__) * mutex_lock_interruptible() and mutex_trylock(). */ static int fastcall noinline __sched -__mutex_lock_interruptible_slowpath(atomic_t *lock_count __IP_DECL__); +__mutex_lock_interruptible_slowpath(atomic_t *lock_count); /*** * mutex_lock_interruptible - acquire the mutex, interruptable @@ -262,11 +282,11 @@ int fastcall __sched mutex_lock_interruptible(struct mutex *lock) EXPORT_SYMBOL(mutex_lock_interruptible); static int fastcall noinline __sched -__mutex_lock_interruptible_slowpath(atomic_t *lock_count __IP_DECL__) +__mutex_lock_interruptible_slowpath(atomic_t *lock_count) { struct mutex *lock = container_of(lock_count, struct mutex, count); - return __mutex_lock_common(lock, TASK_INTERRUPTIBLE __IP__); + return __mutex_lock_common(lock, TASK_INTERRUPTIBLE, 0); } /* @@ -276,18 +296,21 @@ __mutex_lock_interruptible_slowpath(atomic_t *lock_count __IP_DECL__) static inline int __mutex_trylock_slowpath(atomic_t *lock_count) { struct mutex *lock = container_of(lock_count, struct mutex, count); + unsigned long flags; int prev; - spin_lock_mutex(&lock->wait_lock); + spin_lock_mutex(&lock->wait_lock, flags); prev = atomic_xchg(&lock->count, -1); - if (likely(prev == 1)) - debug_mutex_set_owner(lock, current_thread_info() __RET_IP__); + if (likely(prev == 1)) { + debug_mutex_set_owner(lock, current_thread_info()); + mutex_acquire(&lock->dep_map, 0, 1, _RET_IP_); + } /* Set it back to 0 if there are no waiters: */ if (likely(list_empty(&lock->wait_list))) atomic_set(&lock->count, 0); - spin_unlock_mutex(&lock->wait_lock); + spin_unlock_mutex(&lock->wait_lock, flags); return prev == 1; } @@ -306,7 +329,7 @@ static inline int __mutex_trylock_slowpath(atomic_t *lock_count) * This function must not be used in interrupt context. The * mutex must be released by the same task that acquired it. */ -int fastcall mutex_trylock(struct mutex *lock) +int fastcall __sched mutex_trylock(struct mutex *lock) { return __mutex_fastpath_trylock(&lock->count, __mutex_trylock_slowpath); diff --git a/kernel/mutex.h b/kernel/mutex.h index 00fe84e7b..a075dafbb 100644 --- a/kernel/mutex.h +++ b/kernel/mutex.h @@ -9,27 +9,22 @@ * !CONFIG_DEBUG_MUTEXES case. Most of them are NOPs: */ -#define spin_lock_mutex(lock) spin_lock(lock) -#define spin_unlock_mutex(lock) spin_unlock(lock) +#define spin_lock_mutex(lock, flags) \ + do { spin_lock(lock); (void)(flags); } while (0) +#define spin_unlock_mutex(lock, flags) \ + do { spin_unlock(lock); (void)(flags); } while (0) #define mutex_remove_waiter(lock, waiter, ti) \ __list_del((waiter)->list.prev, (waiter)->list.next) -#define DEBUG_WARN_ON(c) do { } while (0) #define debug_mutex_set_owner(lock, new_owner) do { } while (0) #define debug_mutex_clear_owner(lock) do { } while (0) -#define debug_mutex_init_waiter(waiter) do { } while (0) #define debug_mutex_wake_waiter(lock, waiter) do { } while (0) #define debug_mutex_free_waiter(waiter) do { } while (0) -#define debug_mutex_add_waiter(lock, waiter, ti, ip) do { } while (0) +#define debug_mutex_add_waiter(lock, waiter, ti) do { } while (0) #define debug_mutex_unlock(lock) do { } while (0) -#define debug_mutex_init(lock, name) do { } while (0) - -/* - * Return-address parameters/declarations. They are very useful for - * debugging, but add overhead in the !DEBUG case - so we go the - * trouble of using this not too elegant but zero-cost solution: - */ -#define __IP_DECL__ -#define __IP__ -#define __RET_IP__ +#define debug_mutex_init(lock, name, key) do { } while (0) +static inline void +debug_mutex_lock_common(struct mutex *lock, struct mutex_waiter *waiter) +{ +} diff --git a/kernel/panic.c b/kernel/panic.c index 6a1bc03c7..c3fba6dbb 100644 --- a/kernel/panic.c +++ b/kernel/panic.c @@ -8,7 +8,6 @@ * This function is used through-out the kernel (including mm and fs) * to indicate a major problem. */ -#include #include #include #include @@ -19,6 +18,7 @@ #include #include #include +#include int panic_on_oops; int tainted; @@ -174,6 +174,7 @@ EXPORT_SYMBOL(print_tainted); void add_taint(unsigned flag) { + debug_locks = 0; /* can't trust the integrity of the kernel anymore */ tainted |= flag; } EXPORT_SYMBOL(add_taint); @@ -258,6 +259,7 @@ int oops_may_print(void) */ void oops_enter(void) { + debug_locks_off(); /* can't trust the integrity of the kernel anymore */ do_oops_enter_exit(); } diff --git a/kernel/params.c b/kernel/params.c index c67011b26..f676820c2 100644 --- a/kernel/params.c +++ b/kernel/params.c @@ -15,7 +15,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include #include #include #include diff --git a/kernel/pid.c b/kernel/pid.c index eeb836b65..5eeb50538 100644 --- a/kernel/pid.c +++ b/kernel/pid.c @@ -26,6 +26,7 @@ #include #include #include +#include #define pid_hashfn(nr) hash_long((unsigned long)nr, pidhash_shift) static struct hlist_head *pid_hash; @@ -218,7 +219,7 @@ struct pid * fastcall find_pid(int nr) return NULL; } -int fastcall attach_pid(task_t *task, enum pid_type type, int nr) +int fastcall attach_pid(struct task_struct *task, enum pid_type type, int nr) { struct pid_link *link; struct pid *pid; @@ -233,7 +234,7 @@ int fastcall attach_pid(task_t *task, enum pid_type type, int nr) return 0; } -void fastcall detach_pid(task_t *task, enum pid_type type) +void fastcall detach_pid(struct task_struct *task, enum pid_type type) { struct pid_link *link; struct pid *pid; @@ -260,6 +261,14 @@ struct task_struct * fastcall pid_task(struct pid *pid, enum pid_type type) first = rcu_dereference(pid->tasks[type].first); if (first) result = hlist_entry(first, struct task_struct, pids[(type)].node); + if (result && (pid->nr != 1) && + !vx_check(vx_task_xid(result), VX_WATCH|VX_ADMIN|VX_IDENT)) { + vxwprintk((type == PIDTYPE_PID) && (current->xid), + "pid_task(%d,%d): task %p[#%u,%u] did lookup %p[#%u,%u]", + pid->nr, type, current, vx_current_xid(), current->pid, + result, vx_task_xid(result), result->pid); + result = NULL; + } } return result; } @@ -267,8 +276,12 @@ struct task_struct * fastcall pid_task(struct pid *pid, enum pid_type type) /* * Must be called under rcu_read_lock() or with tasklist_lock read-held. */ -task_t *find_task_by_pid_type(int type, int nr) +struct task_struct *find_task_by_pid_type(int type, int nr) { + if (type == PIDTYPE_PID) + nr = vx_rmap_pid(nr); + else if (type == PIDTYPE_REALPID) + type = PIDTYPE_PID; return pid_task(find_pid(nr), type); } diff --git a/kernel/posix-cpu-timers.c b/kernel/posix-cpu-timers.c index 13c0be232..0779b486f 100644 --- a/kernel/posix-cpu-timers.c +++ b/kernel/posix-cpu-timers.c @@ -6,7 +6,6 @@ #include #include #include -#include static int check_clock(const clockid_t which_clock) { @@ -88,6 +87,19 @@ static inline union cpu_time_count cpu_time_sub(const clockid_t which_clock, return a; } +/* + * Divide and limit the result to res >= 1 + * + * This is necessary to prevent signal delivery starvation, when the result of + * the division would be rounded down to 0. + */ +static inline cputime_t cputime_div_non_zero(cputime_t time, unsigned long div) +{ + cputime_t res = cputime_div(time, div); + + return max_t(cputime_t, res, 1); +} + /* * Update expiry time from increment, and increase overrun count, * given the current clock sample. @@ -484,8 +496,8 @@ static void process_timer_rebalance(struct task_struct *p, BUG(); break; case CPUCLOCK_PROF: - left = cputime_div(cputime_sub(expires.cpu, val.cpu), - nthreads); + left = cputime_div_non_zero(cputime_sub(expires.cpu, val.cpu), + nthreads); do { if (likely(!(t->flags & PF_EXITING))) { ticks = cputime_add(prof_ticks(t), left); @@ -499,8 +511,8 @@ static void process_timer_rebalance(struct task_struct *p, } while (t != p); break; case CPUCLOCK_VIRT: - left = cputime_div(cputime_sub(expires.cpu, val.cpu), - nthreads); + left = cputime_div_non_zero(cputime_sub(expires.cpu, val.cpu), + nthreads); do { if (likely(!(t->flags & PF_EXITING))) { ticks = cputime_add(virt_ticks(t), left); @@ -516,6 +528,7 @@ static void process_timer_rebalance(struct task_struct *p, case CPUCLOCK_SCHED: nsleft = expires.sched - val.sched; do_div(nsleft, nthreads); + nsleft = max_t(unsigned long long, nsleft, 1); do { if (likely(!(t->flags & PF_EXITING))) { ns = t->sched_time + nsleft; @@ -1160,12 +1173,13 @@ static void check_process_timers(struct task_struct *tsk, prof_left = cputime_sub(prof_expires, utime); prof_left = cputime_sub(prof_left, stime); - prof_left = cputime_div(prof_left, nthreads); + prof_left = cputime_div_non_zero(prof_left, nthreads); virt_left = cputime_sub(virt_expires, utime); - virt_left = cputime_div(virt_left, nthreads); + virt_left = cputime_div_non_zero(virt_left, nthreads); if (sched_expires) { sched_left = sched_expires - sched_time; do_div(sched_left, nthreads); + sched_left = max_t(unsigned long long, sched_left, 1); } else { sched_left = 0; } diff --git a/kernel/posix-timers.c b/kernel/posix-timers.c index e081fef36..c1014d358 100644 --- a/kernel/posix-timers.c +++ b/kernel/posix-timers.c @@ -48,6 +48,7 @@ #include #include #include +#include /* * Management arrays for POSIX timers. Timers are kept in slab memory @@ -298,6 +299,10 @@ void do_schedule_next_timer(struct siginfo *info) int posix_timer_event(struct k_itimer *timr,int si_private) { + struct vx_info_save vxis; + int ret; + + enter_vx_info(task_get_vx_info(timr->it_process), &vxis); memset(&timr->sigq->info, 0, sizeof(siginfo_t)); timr->sigq->info.si_sys_private = si_private; /* Send signal to the process that owns this timer.*/ @@ -310,11 +315,11 @@ int posix_timer_event(struct k_itimer *timr,int si_private) if (timr->it_sigev_notify & SIGEV_THREAD_ID) { struct task_struct *leader; - int ret = send_sigqueue(timr->it_sigev_signo, timr->sigq, - timr->it_process); + ret = send_sigqueue(timr->it_sigev_signo, timr->sigq, + timr->it_process); if (likely(ret >= 0)) - return ret; + goto out; timr->it_sigev_notify = SIGEV_SIGNAL; leader = timr->it_process->group_leader; @@ -322,8 +327,12 @@ int posix_timer_event(struct k_itimer *timr,int si_private) timr->it_process = leader; } - return send_group_sigqueue(timr->it_sigev_signo, timr->sigq, - timr->it_process); + ret = send_group_sigqueue(timr->it_sigev_signo, timr->sigq, + timr->it_process); +out: + leave_vx_info(&vxis); + put_vx_info(vxis.vxi); + return ret; } EXPORT_SYMBOL_GPL(posix_timer_event); diff --git a/kernel/power/Kconfig b/kernel/power/Kconfig index ce0dfb8f4..619ecabf7 100644 --- a/kernel/power/Kconfig +++ b/kernel/power/Kconfig @@ -36,9 +36,27 @@ config PM_DEBUG code. This is helpful when debugging and reporting various PM bugs, like suspend support. +config PM_TRACE + bool "Suspend/resume event tracing" + depends on PM && PM_DEBUG && X86_32 && EXPERIMENTAL + default n + ---help--- + This enables some cheesy code to save the last PM event point in the + RTC across reboots, so that you can debug a machine that just hangs + during suspend (or more commonly, during resume). + + To use this debugging feature you should attempt to suspend the machine, + then reboot it, then run + + dmesg -s 1000000 | grep 'hash matches' + + CAUTION: this option will cause your machine's real-time clock to be + set to an invalid time after a resume. + + config SOFTWARE_SUSPEND bool "Software Suspend" - depends on PM && SWAP && (X86 && (!SMP || SUSPEND_SMP)) || ((FRV || PPC32) && !SMP) + depends on PM && SWAP && ((X86 && (!SMP || SUSPEND_SMP) && !X86_PAE) || ((FRV || PPC32) && !SMP)) ---help--- Enable the possibility of suspending the machine. It doesn't need ACPI or APM. @@ -60,6 +78,10 @@ config SOFTWARE_SUSPEND For more information take a look at . + (For now, swsusp is incompatible with PAE aka HIGHMEM_64G on i386. + we need identity mapping for resume to work, and that is trivial + to get with 4MB pages, but less than trivial on PAE). + config PM_STD_PARTITION string "Default resume partition" depends on SOFTWARE_SUSPEND @@ -82,18 +104,6 @@ config PM_STD_PARTITION suspended image to. It will simply pick the first available swap device. -config SWSUSP_ENCRYPT - bool "Encrypt suspend image" - depends on SOFTWARE_SUSPEND && CRYPTO=y && (CRYPTO_AES=y || CRYPTO_AES_586=y || CRYPTO_AES_X86_64=y) - default "" - ---help--- - To prevent data gathering from swap after resume you can encrypt - the suspend image with a temporary key that is deleted on - resume. - - Note that the temporary key is stored unencrypted on disk while the - system is suspended. - config SUSPEND_SMP bool depends on HOTPLUG_CPU && X86 && PM diff --git a/kernel/power/Makefile b/kernel/power/Makefile index 8d0af3d37..38725f526 100644 --- a/kernel/power/Makefile +++ b/kernel/power/Makefile @@ -7,6 +7,4 @@ obj-y := main.o process.o console.o obj-$(CONFIG_PM_LEGACY) += pm.o obj-$(CONFIG_SOFTWARE_SUSPEND) += swsusp.o disk.o snapshot.o swap.o user.o -obj-$(CONFIG_SUSPEND_SMP) += smp.o - obj-$(CONFIG_MAGIC_SYSRQ) += poweroff.o diff --git a/kernel/power/console.c b/kernel/power/console.c index 6e039ca13..623786d44 100644 --- a/kernel/power/console.c +++ b/kernel/power/console.c @@ -9,20 +9,42 @@ #include #include "power.h" -extern int console_suspended; +#if defined(CONFIG_VT) && defined(CONFIG_VT_CONSOLE) +#define SUSPEND_CONSOLE (MAX_NR_CONSOLES-1) + +static int orig_fgconsole, orig_kmsg; int pm_prepare_console(void) { acquire_console_sem(); - console_suspended = 1; - system_state = SYSTEM_BOOTING; + + orig_fgconsole = fg_console; + + if (vc_allocate(SUSPEND_CONSOLE)) { + /* we can't have a free VC for now. Too bad, + * we don't want to mess the screen for now. */ + release_console_sem(); + return 1; + } + + set_console(SUSPEND_CONSOLE); + release_console_sem(); + + if (vt_waitactive(SUSPEND_CONSOLE)) { + pr_debug("Suspend: Can't switch VCs."); + return 1; + } + orig_kmsg = kmsg_redirect; + kmsg_redirect = SUSPEND_CONSOLE; return 0; } void pm_restore_console(void) { - console_suspended = 0; - system_state = SYSTEM_RUNNING; + acquire_console_sem(); + set_console(orig_fgconsole); release_console_sem(); + kmsg_redirect = orig_kmsg; return; } +#endif diff --git a/kernel/power/disk.c b/kernel/power/disk.c index 81d4d982f..7c7b9b65e 100644 --- a/kernel/power/disk.c +++ b/kernel/power/disk.c @@ -18,6 +18,7 @@ #include #include #include +#include #include "power.h" @@ -72,7 +73,10 @@ static int prepare_processes(void) int error; pm_prepare_console(); - disable_nonboot_cpus(); + + error = disable_nonboot_cpus(); + if (error) + goto enable_cpus; if (freeze_processes()) { error = -EBUSY; @@ -84,6 +88,7 @@ static int prepare_processes(void) return 0; thaw: thaw_processes(); +enable_cpus: enable_nonboot_cpus(); pm_restore_console(); return error; @@ -231,7 +236,7 @@ static int software_resume(void) late_initcall(software_resume); -static char * pm_disk_modes[] = { +static const char * const pm_disk_modes[] = { [PM_DISK_FIRMWARE] = "firmware", [PM_DISK_PLATFORM] = "platform", [PM_DISK_SHUTDOWN] = "shutdown", diff --git a/kernel/power/main.c b/kernel/power/main.c index a6d9ef460..4d403323a 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c @@ -15,7 +15,8 @@ #include #include #include - +#include +#include #include "power.h" @@ -51,7 +52,7 @@ void pm_set_ops(struct pm_ops * ops) static int suspend_prepare(suspend_state_t state) { - int error = 0; + int error; unsigned int free_pages; if (!pm_ops || !pm_ops->enter) @@ -59,12 +60,9 @@ static int suspend_prepare(suspend_state_t state) pm_prepare_console(); - disable_nonboot_cpus(); - - if (num_online_cpus() != 1) { - error = -EPERM; + error = disable_nonboot_cpus(); + if (error) goto Enable_cpu; - } if (freeze_processes()) { error = -EAGAIN; @@ -86,6 +84,7 @@ static int suspend_prepare(suspend_state_t state) goto Thaw; } + suspend_console(); if ((error = device_suspend(PMSG_SUSPEND))) { printk(KERN_ERR "Some devices failed to suspend\n"); goto Finish; @@ -133,6 +132,7 @@ int suspend_enter(suspend_state_t state) static void suspend_finish(suspend_state_t state) { device_resume(); + resume_console(); thaw_processes(); enable_nonboot_cpus(); if (pm_ops && pm_ops->finish) @@ -143,7 +143,7 @@ static void suspend_finish(suspend_state_t state) -static char *pm_states[PM_SUSPEND_MAX] = { +static const char * const pm_states[PM_SUSPEND_MAX] = { [PM_SUSPEND_STANDBY] = "standby", [PM_SUSPEND_MEM] = "mem", #ifdef CONFIG_SOFTWARE_SUSPEND @@ -260,7 +260,7 @@ static ssize_t state_show(struct subsystem * subsys, char * buf) static ssize_t state_store(struct subsystem * subsys, const char * buf, size_t n) { suspend_state_t state = PM_SUSPEND_STANDBY; - char ** s; + const char * const *s; char *p; int error; int len; diff --git a/kernel/power/pm.c b/kernel/power/pm.c index 84063ac8f..c50d15266 100644 --- a/kernel/power/pm.c +++ b/kernel/power/pm.c @@ -75,42 +75,6 @@ struct pm_dev *pm_register(pm_dev_t type, return dev; } -static void __pm_unregister(struct pm_dev *dev) -{ - if (dev) { - list_del(&dev->entry); - kfree(dev); - } -} - -/** - * pm_unregister_all - unregister all devices with matching callback - * @callback: callback function pointer - * - * Unregister every device that would call the callback passed. This - * is primarily meant as a helper function for loadable modules. It - * enables a module to give up all its managed devices without keeping - * its own private list. - */ - -void pm_unregister_all(pm_callback callback) -{ - struct list_head *entry; - - if (!callback) - return; - - mutex_lock(&pm_devs_lock); - entry = pm_devs.next; - while (entry != &pm_devs) { - struct pm_dev *dev = list_entry(entry, struct pm_dev, entry); - entry = entry->next; - if (dev->callback == callback) - __pm_unregister(dev); - } - mutex_unlock(&pm_devs_lock); -} - /** * pm_send - send request to a single device * @dev: device to send to @@ -239,7 +203,6 @@ int pm_send_all(pm_request_t rqst, void *data) } EXPORT_SYMBOL(pm_register); -EXPORT_SYMBOL(pm_unregister_all); EXPORT_SYMBOL(pm_send_all); EXPORT_SYMBOL(pm_active); diff --git a/kernel/power/power.h b/kernel/power/power.h index f06f12f21..1cefcf87a 100644 --- a/kernel/power/power.h +++ b/kernel/power/power.h @@ -50,16 +50,65 @@ extern asmlinkage int swsusp_arch_resume(void); extern unsigned int count_data_pages(void); +/** + * Auxiliary structure used for reading the snapshot image data and + * metadata from and writing them to the list of page backup entries + * (PBEs) which is the main data structure of swsusp. + * + * Using struct snapshot_handle we can transfer the image, including its + * metadata, as a continuous sequence of bytes with the help of + * snapshot_read_next() and snapshot_write_next(). + * + * The code that writes the image to a storage or transfers it to + * the user land is required to use snapshot_read_next() for this + * purpose and it should not make any assumptions regarding the internal + * structure of the image. Similarly, the code that reads the image from + * a storage or transfers it from the user land is required to use + * snapshot_write_next(). + * + * This may allow us to change the internal structure of the image + * in the future with considerably less effort. + */ + struct snapshot_handle { - loff_t offset; - unsigned int page; - unsigned int page_offset; - unsigned int prev; - struct pbe *pbe; - void *buffer; - unsigned int buf_offset; + loff_t offset; /* number of the last byte ready for reading + * or writing in the sequence + */ + unsigned int cur; /* number of the block of PAGE_SIZE bytes the + * next operation will refer to (ie. current) + */ + unsigned int cur_offset; /* offset with respect to the current + * block (for the next operation) + */ + unsigned int prev; /* number of the block of PAGE_SIZE bytes that + * was the current one previously + */ + struct pbe *pbe; /* PBE that corresponds to 'buffer' */ + struct pbe *last_pbe; /* When the image is restored (eg. read + * from disk) we can store some image + * data directly in the page frames + * in which they were before suspend. + * In such a case the PBEs that + * correspond to them will be unused. + * This is the last PBE, so far, that + * does not correspond to such data. + */ + void *buffer; /* address of the block to read from + * or write to + */ + unsigned int buf_offset; /* location to read from or write to, + * given as a displacement from 'buffer' + */ + int sync_read; /* Set to one to notify the caller of + * snapshot_write_next() that it may + * need to call wait_on_bio_chain() + */ }; +/* This macro returns the address from/to which the caller of + * snapshot_read_next()/snapshot_write_next() is allowed to + * read/write data after the function returns + */ #define data_of(handle) ((handle).buffer + (handle).buf_offset) extern int snapshot_read_next(struct snapshot_handle *handle, size_t count); diff --git a/kernel/power/process.c b/kernel/power/process.c index b2a5f671d..72e72d2c6 100644 --- a/kernel/power/process.c +++ b/kernel/power/process.c @@ -66,13 +66,25 @@ static inline void freeze_process(struct task_struct *p) } } +static void cancel_freezing(struct task_struct *p) +{ + unsigned long flags; + + if (freezing(p)) { + pr_debug(" clean up: %s\n", p->comm); + do_not_freeze(p); + spin_lock_irqsave(&p->sighand->siglock, flags); + recalc_sigpending_tsk(p); + spin_unlock_irqrestore(&p->sighand->siglock, flags); + } +} + /* 0 = success, else # of processes that we failed to stop */ int freeze_processes(void) { int todo, nr_user, user_frozen; unsigned long start_time; struct task_struct *g, *p; - unsigned long flags; printk( "Stopping tasks: " ); start_time = jiffies; @@ -85,6 +97,10 @@ int freeze_processes(void) continue; if (frozen(p)) continue; + if (p->state == TASK_TRACED && frozen(p->parent)) { + cancel_freezing(p); + continue; + } if (p->mm && !(p->flags & PF_BORROWED_MM)) { /* The task is a user-space one. * Freeze it unless there's a vfork completion @@ -126,13 +142,7 @@ int freeze_processes(void) do_each_thread(g, p) { if (freezeable(p) && !frozen(p)) printk(KERN_ERR " %s\n", p->comm); - if (freezing(p)) { - pr_debug(" clean up: %s\n", p->comm); - p->flags &= ~PF_FREEZE; - spin_lock_irqsave(&p->sighand->siglock, flags); - recalc_sigpending_tsk(p); - spin_unlock_irqrestore(&p->sighand->siglock, flags); - } + cancel_freezing(p); } while_each_thread(g, p); read_unlock(&tasklist_lock); return todo; diff --git a/kernel/power/smp.c b/kernel/power/smp.c deleted file mode 100644 index cba3584b8..000000000 --- a/kernel/power/smp.c +++ /dev/null @@ -1,85 +0,0 @@ -/* - * drivers/power/smp.c - Functions for stopping other CPUs. - * - * Copyright 2004 Pavel Machek - * Copyright (C) 2002-2003 Nigel Cunningham - * - * This file is released under the GPLv2. - */ - -#undef DEBUG - -#include -#include -#include -#include -#include -#include - -static atomic_t cpu_counter, freeze; - - -static void smp_pause(void * data) -{ - struct saved_context ctxt; - __save_processor_state(&ctxt); - printk("Sleeping in:\n"); - dump_stack(); - atomic_inc(&cpu_counter); - while (atomic_read(&freeze)) { - /* FIXME: restore takes place at random piece inside this. - This should probably be written in assembly, and - preserve general-purpose registers, too - - What about stack? We may need to move to new stack here. - - This should better be ran with interrupts disabled. - */ - cpu_relax(); - barrier(); - } - atomic_dec(&cpu_counter); - __restore_processor_state(&ctxt); -} - -static cpumask_t oldmask; - -void disable_nonboot_cpus(void) -{ - oldmask = current->cpus_allowed; - set_cpus_allowed(current, cpumask_of_cpu(0)); - printk("Freezing CPUs (at %d)", _smp_processor_id()); - current->state = TASK_INTERRUPTIBLE; - schedule_timeout(HZ); - printk("..."); - BUG_ON(_smp_processor_id() != 0); - - /* FIXME: for this to work, all the CPUs must be running - * "idle" thread (or we deadlock). Is that guaranteed? */ - - atomic_set(&cpu_counter, 0); - atomic_set(&freeze, 1); - smp_call_function(smp_pause, NULL, 0, 0); - while (atomic_read(&cpu_counter) < (num_online_cpus() - 1)) { - cpu_relax(); - barrier(); - } - printk("ok\n"); -} - -void enable_nonboot_cpus(void) -{ - printk("Restarting CPUs"); - atomic_set(&freeze, 0); - while (atomic_read(&cpu_counter)) { - cpu_relax(); - barrier(); - } - printk("..."); - set_cpus_allowed(current, oldmask); - schedule(); - printk("ok\n"); - -} - - diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c index 3eeedbb13..81fe8de9e 100644 --- a/kernel/power/snapshot.c +++ b/kernel/power/snapshot.c @@ -150,9 +150,13 @@ int restore_highmem(void) } return 0; } +#else +static inline unsigned int count_highmem_pages(void) {return 0;} +static inline int save_highmem(void) {return 0;} +static inline int restore_highmem(void) {return 0;} #endif -static int pfn_is_nosave(unsigned long pfn) +static inline int pfn_is_nosave(unsigned long pfn) { unsigned long nosave_begin_pfn = __pa(&__nosave_begin) >> PAGE_SHIFT; unsigned long nosave_end_pfn = PAGE_ALIGN(__pa(&__nosave_end)) >> PAGE_SHIFT; @@ -163,43 +167,43 @@ static int pfn_is_nosave(unsigned long pfn) * saveable - Determine whether a page should be cloned or not. * @pfn: The page * - * We save a page if it's Reserved, and not in the range of pages - * statically defined as 'unsaveable', or if it isn't reserved, and - * isn't part of a free chunk of pages. + * We save a page if it isn't Nosave, and is not in the range of pages + * statically defined as 'unsaveable', and it + * isn't a part of a free chunk of pages. */ -static int saveable(struct zone *zone, unsigned long *zone_pfn) +static struct page *saveable_page(unsigned long pfn) { - unsigned long pfn = *zone_pfn + zone->zone_start_pfn; struct page *page; if (!pfn_valid(pfn)) - return 0; + return NULL; page = pfn_to_page(pfn); - BUG_ON(PageReserved(page) && PageNosave(page)); + if (PageNosave(page)) - return 0; + return NULL; if (PageReserved(page) && pfn_is_nosave(pfn)) - return 0; + return NULL; if (PageNosaveFree(page)) - return 0; + return NULL; - return 1; + return page; } unsigned int count_data_pages(void) { struct zone *zone; - unsigned long zone_pfn; + unsigned long pfn, max_zone_pfn; unsigned int n = 0; for_each_zone (zone) { if (is_highmem(zone)) continue; mark_free_pages(zone); - for (zone_pfn = 0; zone_pfn < zone->spanned_pages; ++zone_pfn) - n += saveable(zone, &zone_pfn); + max_zone_pfn = zone->zone_start_pfn + zone->spanned_pages; + for (pfn = zone->zone_start_pfn; pfn < max_zone_pfn; pfn++) + n += !!saveable_page(pfn); } return n; } @@ -207,7 +211,7 @@ unsigned int count_data_pages(void) static void copy_data_pages(struct pbe *pblist) { struct zone *zone; - unsigned long zone_pfn; + unsigned long pfn, max_zone_pfn; struct pbe *pbe, *p; pbe = pblist; @@ -220,14 +224,21 @@ static void copy_data_pages(struct pbe *pblist) SetPageNosaveFree(virt_to_page(p)); for_each_pbe (p, pblist) SetPageNosaveFree(virt_to_page(p->address)); - for (zone_pfn = 0; zone_pfn < zone->spanned_pages; ++zone_pfn) { - if (saveable(zone, &zone_pfn)) { - struct page *page; - page = pfn_to_page(zone_pfn + zone->zone_start_pfn); + max_zone_pfn = zone->zone_start_pfn + zone->spanned_pages; + for (pfn = zone->zone_start_pfn; pfn < max_zone_pfn; pfn++) { + struct page *page = saveable_page(pfn); + + if (page) { + long *src, *dst; + int n; + BUG_ON(!pbe); pbe->orig_address = (unsigned long)page_address(page); - /* copy_page is not usable for copying task structs. */ - memcpy((void *)pbe->address, (void *)pbe->orig_address, PAGE_SIZE); + /* copy_page and memcpy are not usable for copying task structs. */ + dst = (long *)pbe->address; + src = (long *)pbe->orig_address; + for (n = PAGE_SIZE / sizeof(long); n; n--) + *dst++ = *src++; pbe = pbe->next; } } @@ -293,62 +304,29 @@ static inline void create_pbe_list(struct pbe *pblist, unsigned int nr_pages) } } -/** - * On resume it is necessary to trace and eventually free the unsafe - * pages that have been allocated, because they are needed for I/O - * (on x86-64 we likely will "eat" these pages once again while - * creating the temporary page translation tables) - */ - -struct eaten_page { - struct eaten_page *next; - char padding[PAGE_SIZE - sizeof(void *)]; -}; - -static struct eaten_page *eaten_pages = NULL; - -static void release_eaten_pages(void) -{ - struct eaten_page *p, *q; - - p = eaten_pages; - while (p) { - q = p->next; - /* We don't want swsusp_free() to free this page again */ - ClearPageNosave(virt_to_page(p)); - free_page((unsigned long)p); - p = q; - } - eaten_pages = NULL; -} +static unsigned int unsafe_pages; /** * @safe_needed - on resume, for storing the PBE list and the image, * we can only use memory pages that do not conflict with the pages - * which had been used before suspend. + * used before suspend. * * The unsafe pages are marked with the PG_nosave_free flag - * - * Allocated but unusable (ie eaten) memory pages should be marked - * so that swsusp_free() can release them + * and we count them using unsafe_pages */ -static inline void *alloc_image_page(gfp_t gfp_mask, int safe_needed) +static void *alloc_image_page(gfp_t gfp_mask, int safe_needed) { void *res; + res = (void *)get_zeroed_page(gfp_mask); if (safe_needed) - do { + while (res && PageNosaveFree(virt_to_page(res))) { + /* The page is unsafe, mark it for swsusp_free() */ + SetPageNosave(virt_to_page(res)); + unsafe_pages++; res = (void *)get_zeroed_page(gfp_mask); - if (res && PageNosaveFree(virt_to_page(res))) { - /* This is for swsusp_free() */ - SetPageNosave(virt_to_page(res)); - ((struct eaten_page *)res)->next = eaten_pages; - eaten_pages = res; - } - } while (res && PageNosaveFree(virt_to_page(res))); - else - res = (void *)get_zeroed_page(gfp_mask); + } if (res) { SetPageNosave(virt_to_page(res)); SetPageNosaveFree(virt_to_page(res)); @@ -374,7 +352,8 @@ unsigned long get_safe_page(gfp_t gfp_mask) * On each page we set up a list of struct_pbe elements. */ -struct pbe *alloc_pagedir(unsigned int nr_pages, gfp_t gfp_mask, int safe_needed) +static struct pbe *alloc_pagedir(unsigned int nr_pages, gfp_t gfp_mask, + int safe_needed) { unsigned int num; struct pbe *pblist, *pbe; @@ -405,13 +384,14 @@ struct pbe *alloc_pagedir(unsigned int nr_pages, gfp_t gfp_mask, int safe_needed void swsusp_free(void) { struct zone *zone; - unsigned long zone_pfn; + unsigned long pfn, max_zone_pfn; for_each_zone(zone) { - for (zone_pfn = 0; zone_pfn < zone->spanned_pages; ++zone_pfn) - if (pfn_valid(zone_pfn + zone->zone_start_pfn)) { - struct page *page; - page = pfn_to_page(zone_pfn + zone->zone_start_pfn); + max_zone_pfn = zone->zone_start_pfn + zone->spanned_pages; + for (pfn = zone->zone_start_pfn; pfn < max_zone_pfn; pfn++) + if (pfn_valid(pfn)) { + struct page *page = pfn_to_page(pfn); + if (PageNosave(page) && PageNosaveFree(page)) { ClearPageNosave(page); ClearPageNosaveFree(page); @@ -575,7 +555,7 @@ static inline struct pbe *pack_orig_addresses(unsigned long *buf, struct pbe *pb int snapshot_read_next(struct snapshot_handle *handle, size_t count) { - if (handle->page > nr_meta_pages + nr_copy_pages) + if (handle->cur > nr_meta_pages + nr_copy_pages) return 0; if (!buffer) { /* This makes the buffer be freed by swsusp_free() */ @@ -588,8 +568,8 @@ int snapshot_read_next(struct snapshot_handle *handle, size_t count) handle->buffer = buffer; handle->pbe = pagedir_nosave; } - if (handle->prev < handle->page) { - if (handle->page <= nr_meta_pages) { + if (handle->prev < handle->cur) { + if (handle->cur <= nr_meta_pages) { handle->pbe = pack_orig_addresses(buffer, handle->pbe); if (!handle->pbe) handle->pbe = pagedir_nosave; @@ -597,15 +577,15 @@ int snapshot_read_next(struct snapshot_handle *handle, size_t count) handle->buffer = (void *)handle->pbe->address; handle->pbe = handle->pbe->next; } - handle->prev = handle->page; + handle->prev = handle->cur; } - handle->buf_offset = handle->page_offset; - if (handle->page_offset + count >= PAGE_SIZE) { - count = PAGE_SIZE - handle->page_offset; - handle->page_offset = 0; - handle->page++; + handle->buf_offset = handle->cur_offset; + if (handle->cur_offset + count >= PAGE_SIZE) { + count = PAGE_SIZE - handle->cur_offset; + handle->cur_offset = 0; + handle->cur++; } else { - handle->page_offset += count; + handle->cur_offset += count; } handle->offset += count; return count; @@ -620,7 +600,7 @@ int snapshot_read_next(struct snapshot_handle *handle, size_t count) static int mark_unsafe_pages(struct pbe *pblist) { struct zone *zone; - unsigned long zone_pfn; + unsigned long pfn, max_zone_pfn; struct pbe *p; if (!pblist) /* a sanity check */ @@ -628,10 +608,10 @@ static int mark_unsafe_pages(struct pbe *pblist) /* Clear page flags */ for_each_zone (zone) { - for (zone_pfn = 0; zone_pfn < zone->spanned_pages; ++zone_pfn) - if (pfn_valid(zone_pfn + zone->zone_start_pfn)) - ClearPageNosaveFree(pfn_to_page(zone_pfn + - zone->zone_start_pfn)); + max_zone_pfn = zone->zone_start_pfn + zone->spanned_pages; + for (pfn = zone->zone_start_pfn; pfn < max_zone_pfn; pfn++) + if (pfn_valid(pfn)) + ClearPageNosaveFree(pfn_to_page(pfn)); } /* Mark orig addresses */ @@ -642,6 +622,8 @@ static int mark_unsafe_pages(struct pbe *pblist) return -EFAULT; } + unsafe_pages = 0; + return 0; } @@ -719,42 +701,99 @@ static inline struct pbe *unpack_orig_addresses(unsigned long *buf, } /** - * create_image - use metadata contained in the PBE list + * prepare_image - use metadata contained in the PBE list * pointed to by pagedir_nosave to mark the pages that will * be overwritten in the process of restoring the system - * memory state from the image and allocate memory for - * the image avoiding these pages + * memory state from the image ("unsafe" pages) and allocate + * memory for the image + * + * The idea is to allocate the PBE list first and then + * allocate as many pages as it's needed for the image data, + * but not to assign these pages to the PBEs initially. + * Instead, we just mark them as allocated and create a list + * of "safe" which will be used later */ -static int create_image(struct snapshot_handle *handle) +struct safe_page { + struct safe_page *next; + char padding[PAGE_SIZE - sizeof(void *)]; +}; + +static struct safe_page *safe_pages; + +static int prepare_image(struct snapshot_handle *handle) { int error = 0; - struct pbe *p, *pblist; + unsigned int nr_pages = nr_copy_pages; + struct pbe *p, *pblist = NULL; p = pagedir_nosave; error = mark_unsafe_pages(p); if (!error) { - pblist = alloc_pagedir(nr_copy_pages, GFP_ATOMIC, 1); + pblist = alloc_pagedir(nr_pages, GFP_ATOMIC, 1); if (pblist) copy_page_backup_list(pblist, p); free_pagedir(p, 0); if (!pblist) error = -ENOMEM; } - if (!error) - error = alloc_data_pages(pblist, GFP_ATOMIC, 1); + safe_pages = NULL; + if (!error && nr_pages > unsafe_pages) { + nr_pages -= unsafe_pages; + while (nr_pages--) { + struct safe_page *ptr; + + ptr = (struct safe_page *)get_zeroed_page(GFP_ATOMIC); + if (!ptr) { + error = -ENOMEM; + break; + } + if (!PageNosaveFree(virt_to_page(ptr))) { + /* The page is "safe", add it to the list */ + ptr->next = safe_pages; + safe_pages = ptr; + } + /* Mark the page as allocated */ + SetPageNosave(virt_to_page(ptr)); + SetPageNosaveFree(virt_to_page(ptr)); + } + } if (!error) { - release_eaten_pages(); pagedir_nosave = pblist; } else { - pagedir_nosave = NULL; handle->pbe = NULL; - nr_copy_pages = 0; - nr_meta_pages = 0; + swsusp_free(); } return error; } +static void *get_buffer(struct snapshot_handle *handle) +{ + struct pbe *pbe = handle->pbe, *last = handle->last_pbe; + struct page *page = virt_to_page(pbe->orig_address); + + if (PageNosave(page) && PageNosaveFree(page)) { + /* + * We have allocated the "original" page frame and we can + * use it directly to store the read page + */ + pbe->address = 0; + if (last && last->next) + last->next = NULL; + return (void *)pbe->orig_address; + } + /* + * The "original" page frame has not been allocated and we have to + * use a "safe" page frame to store the read page + */ + pbe->address = (unsigned long)safe_pages; + safe_pages = safe_pages->next; + if (last) + last->next = pbe; + handle->last_pbe = pbe; + return (void *)pbe->address; +} + /** * snapshot_write_next - used for writing the system memory snapshot. * @@ -781,7 +820,7 @@ int snapshot_write_next(struct snapshot_handle *handle, size_t count) { int error = 0; - if (handle->prev && handle->page > nr_meta_pages + nr_copy_pages) + if (handle->prev && handle->cur > nr_meta_pages + nr_copy_pages) return 0; if (!buffer) { /* This makes the buffer be freed by swsusp_free() */ @@ -791,33 +830,39 @@ int snapshot_write_next(struct snapshot_handle *handle, size_t count) } if (!handle->offset) handle->buffer = buffer; - if (handle->prev < handle->page) { + handle->sync_read = 1; + if (handle->prev < handle->cur) { if (!handle->prev) { - error = load_header(handle, (struct swsusp_info *)buffer); + error = load_header(handle, + (struct swsusp_info *)buffer); if (error) return error; } else if (handle->prev <= nr_meta_pages) { - handle->pbe = unpack_orig_addresses(buffer, handle->pbe); + handle->pbe = unpack_orig_addresses(buffer, + handle->pbe); if (!handle->pbe) { - error = create_image(handle); + error = prepare_image(handle); if (error) return error; handle->pbe = pagedir_nosave; - handle->buffer = (void *)handle->pbe->address; + handle->last_pbe = NULL; + handle->buffer = get_buffer(handle); + handle->sync_read = 0; } } else { handle->pbe = handle->pbe->next; - handle->buffer = (void *)handle->pbe->address; + handle->buffer = get_buffer(handle); + handle->sync_read = 0; } - handle->prev = handle->page; + handle->prev = handle->cur; } - handle->buf_offset = handle->page_offset; - if (handle->page_offset + count >= PAGE_SIZE) { - count = PAGE_SIZE - handle->page_offset; - handle->page_offset = 0; - handle->page++; + handle->buf_offset = handle->cur_offset; + if (handle->cur_offset + count >= PAGE_SIZE) { + count = PAGE_SIZE - handle->cur_offset; + handle->cur_offset = 0; + handle->cur++; } else { - handle->page_offset += count; + handle->cur_offset += count; } handle->offset += count; return count; @@ -826,5 +871,5 @@ int snapshot_write_next(struct snapshot_handle *handle, size_t count) int snapshot_image_loaded(struct snapshot_handle *handle) { return !(!handle->pbe || handle->pbe->next || !nr_copy_pages || - handle->page <= nr_meta_pages + nr_copy_pages); + handle->cur <= nr_meta_pages + nr_copy_pages); } diff --git a/kernel/power/swap.c b/kernel/power/swap.c index 044b8e0c1..0917c5db5 100644 --- a/kernel/power/swap.c +++ b/kernel/power/swap.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -49,18 +50,16 @@ static int mark_swapfiles(swp_entry_t start) { int error; - rw_swap_page_sync(READ, - swp_entry(root_swap, 0), - virt_to_page((unsigned long)&swsusp_header)); + rw_swap_page_sync(READ, swp_entry(root_swap, 0), + virt_to_page((unsigned long)&swsusp_header), NULL); if (!memcmp("SWAP-SPACE",swsusp_header.sig, 10) || !memcmp("SWAPSPACE2",swsusp_header.sig, 10)) { memcpy(swsusp_header.orig_sig,swsusp_header.sig, 10); memcpy(swsusp_header.sig,SWSUSP_SIG, 10); swsusp_header.image = start; - error = rw_swap_page_sync(WRITE, - swp_entry(root_swap, 0), - virt_to_page((unsigned long) - &swsusp_header)); + error = rw_swap_page_sync(WRITE, swp_entry(root_swap, 0), + virt_to_page((unsigned long)&swsusp_header), + NULL); } else { pr_debug("swsusp: Partition is not swap space.\n"); error = -ENODEV; @@ -88,16 +87,37 @@ static int swsusp_swap_check(void) /* This is called before saving image */ * write_page - Write one page to given swap location. * @buf: Address we're writing. * @offset: Offset of the swap page we're writing to. + * @bio_chain: Link the next write BIO here */ -static int write_page(void *buf, unsigned long offset) +static int write_page(void *buf, unsigned long offset, struct bio **bio_chain) { swp_entry_t entry; int error = -ENOSPC; if (offset) { + struct page *page = virt_to_page(buf); + + if (bio_chain) { + /* + * Whether or not we successfully allocated a copy page, + * we take a ref on the page here. It gets undone in + * wait_on_bio_chain(). + */ + struct page *page_copy; + page_copy = alloc_page(GFP_ATOMIC); + if (page_copy == NULL) { + WARN_ON_ONCE(1); + bio_chain = NULL; /* Go synchronous */ + get_page(page); + } else { + memcpy(page_address(page_copy), + page_address(page), PAGE_SIZE); + page = page_copy; + } + } entry = swp_entry(root_swap, offset); - error = rw_swap_page_sync(WRITE, entry, virt_to_page(buf)); + error = rw_swap_page_sync(WRITE, entry, page, bio_chain); } return error; } @@ -146,6 +166,26 @@ static void release_swap_writer(struct swap_map_handle *handle) handle->bitmap = NULL; } +static void show_speed(struct timeval *start, struct timeval *stop, + unsigned nr_pages, char *msg) +{ + s64 elapsed_centisecs64; + int centisecs; + int k; + int kps; + + elapsed_centisecs64 = timeval_to_ns(stop) - timeval_to_ns(start); + do_div(elapsed_centisecs64, NSEC_PER_SEC / 100); + centisecs = elapsed_centisecs64; + if (centisecs == 0) + centisecs = 1; /* avoid div-by-zero */ + k = nr_pages * (PAGE_SIZE / 1024); + kps = (k * 100) / centisecs; + printk("%s %d kbytes in %d.%02d seconds (%d.%02d MB/s)\n", msg, k, + centisecs / 100, centisecs % 100, + kps / 1000, (kps % 1000) / 10); +} + static int get_swap_writer(struct swap_map_handle *handle) { handle->cur = (struct swap_map_page *)get_zeroed_page(GFP_KERNEL); @@ -165,37 +205,70 @@ static int get_swap_writer(struct swap_map_handle *handle) return 0; } -static int swap_write_page(struct swap_map_handle *handle, void *buf) +static int wait_on_bio_chain(struct bio **bio_chain) { - int error; + struct bio *bio; + struct bio *next_bio; + int ret = 0; + + if (bio_chain == NULL) + return 0; + + bio = *bio_chain; + if (bio == NULL) + return 0; + while (bio) { + struct page *page; + + next_bio = bio->bi_private; + page = bio->bi_io_vec[0].bv_page; + wait_on_page_locked(page); + if (!PageUptodate(page) || PageError(page)) + ret = -EIO; + put_page(page); + bio_put(bio); + bio = next_bio; + } + *bio_chain = NULL; + return ret; +} + +static int swap_write_page(struct swap_map_handle *handle, void *buf, + struct bio **bio_chain) +{ + int error = 0; unsigned long offset; if (!handle->cur) return -EINVAL; offset = alloc_swap_page(root_swap, handle->bitmap); - error = write_page(buf, offset); + error = write_page(buf, offset, bio_chain); if (error) return error; handle->cur->entries[handle->k++] = offset; if (handle->k >= MAP_PAGE_ENTRIES) { + error = wait_on_bio_chain(bio_chain); + if (error) + goto out; offset = alloc_swap_page(root_swap, handle->bitmap); if (!offset) return -ENOSPC; handle->cur->next_swap = offset; - error = write_page(handle->cur, handle->cur_swap); + error = write_page(handle->cur, handle->cur_swap, NULL); if (error) - return error; + goto out; memset(handle->cur, 0, PAGE_SIZE); handle->cur_swap = offset; handle->k = 0; } - return 0; +out: + return error; } static int flush_swap_writer(struct swap_map_handle *handle) { if (handle->cur && handle->cur_swap) - return write_page(handle->cur, handle->cur_swap); + return write_page(handle->cur, handle->cur_swap, NULL); else return -EINVAL; } @@ -206,21 +279,29 @@ static int flush_swap_writer(struct swap_map_handle *handle) static int save_image(struct swap_map_handle *handle, struct snapshot_handle *snapshot, - unsigned int nr_pages) + unsigned int nr_to_write) { unsigned int m; int ret; int error = 0; + int nr_pages; + int err2; + struct bio *bio; + struct timeval start; + struct timeval stop; - printk("Saving image data pages (%u pages) ... ", nr_pages); - m = nr_pages / 100; + printk("Saving image data pages (%u pages) ... ", nr_to_write); + m = nr_to_write / 100; if (!m) m = 1; nr_pages = 0; + bio = NULL; + do_gettimeofday(&start); do { ret = snapshot_read_next(snapshot, PAGE_SIZE); if (ret > 0) { - error = swap_write_page(handle, data_of(*snapshot)); + error = swap_write_page(handle, data_of(*snapshot), + &bio); if (error) break; if (!(nr_pages % m)) @@ -228,8 +309,13 @@ static int save_image(struct swap_map_handle *handle, nr_pages++; } } while (ret > 0); + err2 = wait_on_bio_chain(&bio); + do_gettimeofday(&stop); + if (!error) + error = err2; if (!error) printk("\b\b\b\bdone\n"); + show_speed(&start, &stop, nr_to_write, "Wrote"); return error; } @@ -263,11 +349,11 @@ int swsusp_write(void) struct swap_map_handle handle; struct snapshot_handle snapshot; struct swsusp_info *header; - unsigned long start; int error; if ((error = swsusp_swap_check())) { - printk(KERN_ERR "swsusp: Cannot find swap device, try swapon -a.\n"); + printk(KERN_ERR "swsusp: Cannot find swap device, try " + "swapon -a.\n"); return error; } memset(&snapshot, 0, sizeof(struct snapshot_handle)); @@ -281,16 +367,17 @@ int swsusp_write(void) } error = get_swap_writer(&handle); if (!error) { - start = handle.cur_swap; - error = swap_write_page(&handle, header); - } - if (!error) - error = save_image(&handle, &snapshot, header->pages - 1); - if (!error) { - flush_swap_writer(&handle); - printk("S"); - error = mark_swapfiles(swp_entry(root_swap, start)); - printk("|\n"); + unsigned long start = handle.cur_swap; + error = swap_write_page(&handle, header, NULL); + if (!error) + error = save_image(&handle, &snapshot, + header->pages - 1); + if (!error) { + flush_swap_writer(&handle); + printk("S"); + error = mark_swapfiles(swp_entry(root_swap, start)); + printk("|\n"); + } } if (error) free_all_swap_pages(root_swap, handle.bitmap); @@ -298,25 +385,6 @@ int swsusp_write(void) return error; } -/* - * Using bio to read from swap. - * This code requires a bit more work than just using buffer heads - * but, it is the recommended way for 2.5/2.6. - * The following are to signal the beginning and end of I/O. Bios - * finish asynchronously, while we want them to happen synchronously. - * A simple atomic_t, and a wait loop take care of this problem. - */ - -static atomic_t io_done = ATOMIC_INIT(0); - -static int end_io(struct bio *bio, unsigned int num, int err) -{ - if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) - panic("I/O error reading memory image"); - atomic_set(&io_done, 0); - return 0; -} - static struct block_device *resume_bdev; /** @@ -324,15 +392,15 @@ static struct block_device *resume_bdev; * @rw: READ or WRITE. * @off physical offset of page. * @page: page we're reading or writing. + * @bio_chain: list of pending biod (for async reading) * * Straight from the textbook - allocate and initialize the bio. - * If we're writing, make sure the page is marked as dirty. - * Then submit it and wait. + * If we're reading, make sure the page is marked as dirty. + * Then submit it and, if @bio_chain == NULL, wait. */ - -static int submit(int rw, pgoff_t page_off, void *page) +static int submit(int rw, pgoff_t page_off, struct page *page, + struct bio **bio_chain) { - int error = 0; struct bio *bio; bio = bio_alloc(GFP_ATOMIC, 1); @@ -340,33 +408,40 @@ static int submit(int rw, pgoff_t page_off, void *page) return -ENOMEM; bio->bi_sector = page_off * (PAGE_SIZE >> 9); bio->bi_bdev = resume_bdev; - bio->bi_end_io = end_io; + bio->bi_end_io = end_swap_bio_read; - if (bio_add_page(bio, virt_to_page(page), PAGE_SIZE, 0) < PAGE_SIZE) { - printk("swsusp: ERROR: adding page to bio at %ld\n",page_off); - error = -EFAULT; - goto Done; + if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE) { + printk("swsusp: ERROR: adding page to bio at %ld\n", page_off); + bio_put(bio); + return -EFAULT; } - atomic_set(&io_done, 1); - submit_bio(rw | (1 << BIO_RW_SYNC), bio); - while (atomic_read(&io_done)) - yield(); - if (rw == READ) - bio_set_pages_dirty(bio); - Done: - bio_put(bio); - return error; + lock_page(page); + bio_get(bio); + + if (bio_chain == NULL) { + submit_bio(rw | (1 << BIO_RW_SYNC), bio); + wait_on_page_locked(page); + if (rw == READ) + bio_set_pages_dirty(bio); + bio_put(bio); + } else { + get_page(page); + bio->bi_private = *bio_chain; + *bio_chain = bio; + submit_bio(rw, bio); + } + return 0; } -static int bio_read_page(pgoff_t page_off, void *page) +static int bio_read_page(pgoff_t page_off, void *addr, struct bio **bio_chain) { - return submit(READ, page_off, page); + return submit(READ, page_off, virt_to_page(addr), bio_chain); } -static int bio_write_page(pgoff_t page_off, void *page) +static int bio_write_page(pgoff_t page_off, void *addr) { - return submit(WRITE, page_off, page); + return submit(WRITE, page_off, virt_to_page(addr), NULL); } /** @@ -391,7 +466,7 @@ static int get_swap_reader(struct swap_map_handle *handle, handle->cur = (struct swap_map_page *)get_zeroed_page(GFP_ATOMIC); if (!handle->cur) return -ENOMEM; - error = bio_read_page(swp_offset(start), handle->cur); + error = bio_read_page(swp_offset(start), handle->cur, NULL); if (error) { release_swap_reader(handle); return error; @@ -400,7 +475,8 @@ static int get_swap_reader(struct swap_map_handle *handle, return 0; } -static int swap_read_page(struct swap_map_handle *handle, void *buf) +static int swap_read_page(struct swap_map_handle *handle, void *buf, + struct bio **bio_chain) { unsigned long offset; int error; @@ -410,16 +486,17 @@ static int swap_read_page(struct swap_map_handle *handle, void *buf) offset = handle->cur->entries[handle->k]; if (!offset) return -EFAULT; - error = bio_read_page(offset, buf); + error = bio_read_page(offset, buf, bio_chain); if (error) return error; if (++handle->k >= MAP_PAGE_ENTRIES) { + error = wait_on_bio_chain(bio_chain); handle->k = 0; offset = handle->cur->next_swap; if (!offset) release_swap_reader(handle); - else - error = bio_read_page(offset, handle->cur); + else if (!error) + error = bio_read_page(offset, handle->cur, NULL); } return error; } @@ -432,33 +509,48 @@ static int swap_read_page(struct swap_map_handle *handle, void *buf) static int load_image(struct swap_map_handle *handle, struct snapshot_handle *snapshot, - unsigned int nr_pages) + unsigned int nr_to_read) { unsigned int m; - int ret; int error = 0; + struct timeval start; + struct timeval stop; + struct bio *bio; + int err2; + unsigned nr_pages; - printk("Loading image data pages (%u pages) ... ", nr_pages); - m = nr_pages / 100; + printk("Loading image data pages (%u pages) ... ", nr_to_read); + m = nr_to_read / 100; if (!m) m = 1; nr_pages = 0; - do { - ret = snapshot_write_next(snapshot, PAGE_SIZE); - if (ret > 0) { - error = swap_read_page(handle, data_of(*snapshot)); - if (error) - break; - if (!(nr_pages % m)) - printk("\b\b\b\b%3d%%", nr_pages / m); - nr_pages++; - } - } while (ret > 0); + bio = NULL; + do_gettimeofday(&start); + for ( ; ; ) { + error = snapshot_write_next(snapshot, PAGE_SIZE); + if (error <= 0) + break; + error = swap_read_page(handle, data_of(*snapshot), &bio); + if (error) + break; + if (snapshot->sync_read) + error = wait_on_bio_chain(&bio); + if (error) + break; + if (!(nr_pages % m)) + printk("\b\b\b\b%3d%%", nr_pages / m); + nr_pages++; + } + err2 = wait_on_bio_chain(&bio); + do_gettimeofday(&stop); + if (!error) + error = err2; if (!error) { printk("\b\b\b\bdone\n"); if (!snapshot_image_loaded(snapshot)) error = -ENODATA; } + show_speed(&start, &stop, nr_to_read, "Read"); return error; } @@ -481,7 +573,7 @@ int swsusp_read(void) header = (struct swsusp_info *)data_of(snapshot); error = get_swap_reader(&handle, swsusp_header.image); if (!error) - error = swap_read_page(&handle, header); + error = swap_read_page(&handle, header, NULL); if (!error) error = load_image(&handle, &snapshot, header->pages - 1); release_swap_reader(&handle); @@ -507,7 +599,7 @@ int swsusp_check(void) if (!IS_ERR(resume_bdev)) { set_blocksize(resume_bdev, PAGE_SIZE); memset(&swsusp_header, 0, sizeof(swsusp_header)); - if ((error = bio_read_page(0, &swsusp_header))) + if ((error = bio_read_page(0, &swsusp_header, NULL))) return error; if (!memcmp(SWSUSP_SIG, swsusp_header.sig, 10)) { memcpy(swsusp_header.sig, swsusp_header.orig_sig, 10); diff --git a/kernel/power/swsusp.c b/kernel/power/swsusp.c index c4016cbbd..17f669c83 100644 --- a/kernel/power/swsusp.c +++ b/kernel/power/swsusp.c @@ -67,9 +67,9 @@ unsigned int count_highmem_pages(void); int save_highmem(void); int restore_highmem(void); #else -static int save_highmem(void) { return 0; } -static int restore_highmem(void) { return 0; } -static unsigned int count_highmem_pages(void) { return 0; } +static inline int save_highmem(void) { return 0; } +static inline int restore_highmem(void) { return 0; } +static inline unsigned int count_highmem_pages(void) { return 0; } #endif /** @@ -175,6 +175,12 @@ void free_all_swap_pages(int swap, struct bitmap_page *bitmap) */ #define SHRINK_BITE 10000 +static inline unsigned long __shrink_memory(long tmp) +{ + if (tmp > SHRINK_BITE) + tmp = SHRINK_BITE; + return shrink_all_memory(tmp); +} int swsusp_shrink_memory(void) { @@ -192,15 +198,17 @@ int swsusp_shrink_memory(void) PAGES_FOR_IO; tmp = size; for_each_zone (zone) - if (!is_highmem(zone)) + if (!is_highmem(zone) && populated_zone(zone)) { tmp -= zone->free_pages; + tmp += zone->lowmem_reserve[ZONE_NORMAL]; + } if (tmp > 0) { - tmp = shrink_all_memory(SHRINK_BITE); + tmp = __shrink_memory(tmp); if (!tmp) return -ENOMEM; pages += tmp; } else if (size > image_size / PAGE_SIZE) { - tmp = shrink_all_memory(SHRINK_BITE); + tmp = __shrink_memory(size - (image_size / PAGE_SIZE)); pages += tmp; } printk("\b%c", p[i++%4]); diff --git a/kernel/power/user.c b/kernel/power/user.c index 3f1539fbe..0ef5e4ba3 100644 --- a/kernel/power/user.c +++ b/kernel/power/user.c @@ -19,6 +19,7 @@ #include #include #include +#include #include @@ -139,12 +140,15 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp, if (data->frozen) break; down(&pm_sem); - disable_nonboot_cpus(); - if (freeze_processes()) { - thaw_processes(); - enable_nonboot_cpus(); - error = -EBUSY; + error = disable_nonboot_cpus(); + if (!error) { + error = freeze_processes(); + if (error) { + thaw_processes(); + error = -EBUSY; + } } + enable_nonboot_cpus(); up(&pm_sem); if (!error) data->frozen = 1; diff --git a/kernel/printk.c b/kernel/printk.c index 2500d95bf..913dca305 100644 --- a/kernel/printk.c +++ b/kernel/printk.c @@ -26,13 +26,14 @@ #include #include #include +#include #include /* For in_interrupt() */ -#include #include #include #include #include #include +#include #include #include @@ -55,7 +56,7 @@ int console_printk[4] = { DEFAULT_CONSOLE_LOGLEVEL, /* default_console_loglevel */ }; -EXPORT_SYMBOL(console_printk); +EXPORT_UNUSED_SYMBOL(console_printk); /* June 2006 */ /* * Low lever drivers may need that to know if they can schedule in @@ -80,8 +81,7 @@ struct console *console_drivers; * path in the console code where we end up in places I want * locked without the console sempahore held */ -static int console_locked; -int console_suspended; +static int console_locked, console_suspended; /* * logbuf_lock protects log_buf, log_start, log_end, con_start and logged_chars @@ -354,7 +354,9 @@ static void __call_console_drivers(unsigned long start, unsigned long end) struct console *con; for (con = console_drivers; con; con = con->next) { - if ((con->flags & CON_ENABLED) && con->write) + if ((con->flags & CON_ENABLED) && con->write && + (cpu_online(smp_processor_id()) || + (con->flags & CON_ANYTIME))) con->write(con, &LOG_BUF(start), end - start); } } @@ -464,6 +466,7 @@ static int printk_time = 1; #else static int printk_time = 0; #endif +module_param(printk_time, int, S_IRUGO | S_IWUSR); static int __init printk_time_setup(char *str) { @@ -480,6 +483,18 @@ __attribute__((weak)) unsigned long long printk_clock(void) return sched_clock(); } +/* Check if we have any console registered that can be called early in boot. */ +static int have_callable_console(void) +{ + struct console *con; + + for (con = console_drivers; con; con = con->next) + if (con->flags & CON_ANYTIME) + return 1; + + return 0; +} + /** * printk - print a kernel message * @fmt: format string @@ -527,15 +542,19 @@ asmlinkage int vprintk(const char *fmt, va_list args) char *p; static char printk_buf[1024]; static int log_level_unknown = 1; + struct vx_info_save vxis; preempt_disable(); + __enter_vx_admin(&vxis); if (unlikely(oops_in_progress) && printk_cpu == smp_processor_id()) /* If a crash is occurring during printk() on this CPU, * make sure we can't deadlock */ zap_locks(); /* This stops the holder of console_sem just where we want him */ - spin_lock_irqsave(&logbuf_lock, flags); + local_irq_save(flags); + lockdep_off(); + spin_lock(&logbuf_lock); printk_cpu = smp_processor_id(); /* Emit the output into the temporary buffer */ @@ -598,27 +617,31 @@ asmlinkage int vprintk(const char *fmt, va_list args) log_level_unknown = 1; } - if (!cpu_online(smp_processor_id())) { + if (!down_trylock(&console_sem)) { /* - * Some console drivers may assume that per-cpu resources have - * been allocated. So don't allow them to be called by this - * CPU until it is officially up. We shouldn't be calling into - * random console drivers on a CPU which doesn't exist yet.. + * We own the drivers. We can drop the spinlock and + * let release_console_sem() print the text, maybe ... */ - printk_cpu = UINT_MAX; - spin_unlock_irqrestore(&logbuf_lock, flags); - goto out; - } - if (!down_trylock(&console_sem)) { console_locked = 1; + printk_cpu = UINT_MAX; + spin_unlock(&logbuf_lock); + /* - * We own the drivers. We can drop the spinlock and let - * release_console_sem() print the text + * Console drivers may assume that per-cpu resources have + * been allocated. So unless they're explicitly marked as + * being able to cope (CON_ANYTIME) don't call them until + * this CPU is officially up. */ - printk_cpu = UINT_MAX; - spin_unlock_irqrestore(&logbuf_lock, flags); - console_may_schedule = 0; - release_console_sem(); + if (cpu_online(smp_processor_id()) || have_callable_console()) { + console_may_schedule = 0; + release_console_sem(); + } else { + /* Release by hand to avoid flushing the buffer. */ + console_locked = 0; + up(&console_sem); + } + lockdep_on(); + local_irq_restore(flags); } else { /* * Someone else owns the drivers. We drop the spinlock, which @@ -626,9 +649,12 @@ asmlinkage int vprintk(const char *fmt, va_list args) * console drivers with the output which we just produced. */ printk_cpu = UINT_MAX; - spin_unlock_irqrestore(&logbuf_lock, flags); + spin_unlock(&logbuf_lock); + lockdep_on(); + local_irq_restore(flags); } -out: + + __leave_vx_admin(&vxis); preempt_enable(); return printed_len; } @@ -730,6 +756,23 @@ int __init add_preferred_console(char *name, int idx, char *options) return 0; } +/** + * suspend_console - suspend the console subsystem + * + * This disables printk() while we go into suspend states + */ +void suspend_console(void) +{ + acquire_console_sem(); + console_suspended = 1; +} + +void resume_console(void) +{ + console_suspended = 0; + release_console_sem(); +} + /** * acquire_console_sem - lock the console system for exclusive use. * @@ -740,12 +783,11 @@ int __init add_preferred_console(char *name, int idx, char *options) */ void acquire_console_sem(void) { + BUG_ON(in_interrupt()); if (console_suspended) { down(&secondary_console_sem); return; } - - BUG_ON(in_interrupt()); down(&console_sem); console_locked = 1; console_may_schedule = 1; @@ -766,7 +808,7 @@ int is_console_locked(void) { return console_locked; } -EXPORT_SYMBOL(is_console_locked); +EXPORT_UNUSED_SYMBOL(is_console_locked); /* June 2006 */ /** * release_console_sem - unlock the console system @@ -793,6 +835,8 @@ void release_console_sem(void) return; } + console_may_schedule = 0; + for ( ; ; ) { spin_lock_irqsave(&logbuf_lock, flags); wake_klogd |= log_start - log_end; @@ -806,11 +850,17 @@ void release_console_sem(void) local_irq_restore(flags); } console_locked = 0; - console_may_schedule = 0; up(&console_sem); spin_unlock_irqrestore(&logbuf_lock, flags); - if (wake_klogd && !oops_in_progress && waitqueue_active(&log_wait)) - wake_up_interruptible(&log_wait); + if (wake_klogd && !oops_in_progress && waitqueue_active(&log_wait)) { + /* + * If we printk from within the lock dependency code, + * from within the scheduler code, then do not lock + * up due to self-recursion: + */ + if (!lockdep_internal()) + wake_up_interruptible(&log_wait); + } } EXPORT_SYMBOL(release_console_sem); diff --git a/kernel/profile.c b/kernel/profile.c index 68afe121e..d5bd75e75 100644 --- a/kernel/profile.c +++ b/kernel/profile.c @@ -13,7 +13,6 @@ * to resolve timer interrupt livelocks, William Irwin, Oracle, 2004 */ -#include #include #include #include @@ -299,7 +298,7 @@ out: } #ifdef CONFIG_HOTPLUG_CPU -static int profile_cpu_callback(struct notifier_block *info, +static int __devinit profile_cpu_callback(struct notifier_block *info, unsigned long action, void *__cpu) { int node, cpu = (unsigned long)__cpu; diff --git a/kernel/ptrace.c b/kernel/ptrace.c index ad5df5abc..786130d1b 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c @@ -18,111 +18,34 @@ #include #include #include -#include #include #include -/* - * ptrace a task: make the debugger its new parent and - * move it to the ptrace list. - * - * Must be called with the tasklist lock write-held. - */ -void __ptrace_link(task_t *child, task_t *new_parent) -{ - BUG_ON(!list_empty(&child->ptrace_list)); - if (child->parent == new_parent) - return; - list_add(&child->ptrace_list, &child->parent->ptrace_children); - remove_parent(child); - child->parent = new_parent; - add_parent(child); -} - -/* - * Turn a tracing stop into a normal stop now, since with no tracer there - * would be no way to wake it up with SIGCONT or SIGKILL. If there was a - * signal sent that would resume the child, but didn't because it was in - * TASK_TRACED, resume it now. - * Requires that irqs be disabled. - */ -void ptrace_untrace(task_t *child) -{ - spin_lock(&child->sighand->siglock); - if (child->state == TASK_TRACED) { - if (child->signal->flags & SIGNAL_STOP_STOPPED) { - child->state = TASK_STOPPED; - } else { - signal_wake_up(child, 1); - } - } - spin_unlock(&child->sighand->siglock); -} - -/* - * unptrace a task: move it back to its original parent and - * remove it from the ptrace list. - * - * Must be called with the tasklist lock write-held. - */ -void __ptrace_unlink(task_t *child) -{ - BUG_ON(!child->ptrace); - - child->ptrace = 0; - if (!list_empty(&child->ptrace_list)) { - list_del_init(&child->ptrace_list); - remove_parent(child); - child->parent = child->real_parent; - add_parent(child); - } - - if (child->state == TASK_TRACED) - ptrace_untrace(child); -} - -/* - * Check that we have indeed attached to the thing.. - */ -int ptrace_check_attach(struct task_struct *child, int kill) -{ - int ret = -ESRCH; - - /* - * We take the read lock around doing both checks to close a - * possible race where someone else was tracing our child and - * detached between these two checks. After this locked check, - * we are sure that this is our traced child and that can only - * be changed by us so it's not changing right after this. - */ - read_lock(&tasklist_lock); - if ((child->ptrace & PT_PTRACED) && child->parent == current && - (!(child->ptrace & PT_ATTACHED) || child->real_parent != current) - && child->signal != NULL) { - ret = 0; - spin_lock_irq(&child->sighand->siglock); - if (child->state == TASK_STOPPED) { - child->state = TASK_TRACED; - } else if (child->state != TASK_TRACED && !kill) { - ret = -ESRCH; - } - spin_unlock_irq(&child->sighand->siglock); - } - read_unlock(&tasklist_lock); +#ifdef CONFIG_PTRACE +#include +#include +#include +#endif - if (!ret && !kill) { - wait_task_inactive(child); - } +int getrusage(struct task_struct *, int, struct rusage __user *); - /* All systems go.. */ - return ret; -} +//#define PTRACE_DEBUG int __ptrace_may_attach(struct task_struct *task) { - if (!task->mm) - return -EPERM; + /* May we inspect the given task? + * This check is used both for attaching with ptrace + * and for allowing access to sensitive information in /proc. + * + * ptrace_attach denies several cases that /proc allows + * because setting up the necessary parent/child relationship + * or halting the specified task is impossible. + */ + int dumpable = 0; + /* Don't let security modules deny introspection */ + if (task == current) + return 0; if (((current->uid != task->euid) || (current->uid != task->suid) || (current->uid != task->uid) || @@ -131,7 +54,9 @@ int __ptrace_may_attach(struct task_struct *task) (current->gid != task->gid)) && !capable(CAP_SYS_PTRACE)) return -EPERM; smp_rmb(); - if (!task->mm->dumpable && !capable(CAP_SYS_PTRACE)) + if (task->mm) + dumpable = task->mm->dumpable; + if (!dumpable && !capable(CAP_SYS_PTRACE)) return -EPERM; return security_ptrace(current, task); @@ -146,87 +71,6 @@ int ptrace_may_attach(struct task_struct *task) return !err; } -int ptrace_attach(struct task_struct *task) -{ - int retval; - - retval = -EPERM; - if (task->pid <= 1) - goto out; - if (task->tgid == current->tgid) - goto out; - -repeat: - /* - * Nasty, nasty. - * - * We want to hold both the task-lock and the - * tasklist_lock for writing at the same time. - * But that's against the rules (tasklist_lock - * is taken for reading by interrupts on other - * cpu's that may have task_lock). - */ - task_lock(task); - local_irq_disable(); - if (!write_trylock(&tasklist_lock)) { - local_irq_enable(); - task_unlock(task); - do { - cpu_relax(); - } while (!write_can_lock(&tasklist_lock)); - goto repeat; - } - - /* the same process cannot be attached many times */ - if (task->ptrace & PT_PTRACED) - goto bad; - retval = __ptrace_may_attach(task); - if (retval) - goto bad; - - /* Go */ - task->ptrace |= PT_PTRACED | ((task->real_parent != current) - ? PT_ATTACHED : 0); - if (capable(CAP_SYS_PTRACE)) - task->ptrace |= PT_PTRACE_CAP; - - __ptrace_link(task, current); - - force_sig_specific(SIGSTOP, task); - -bad: - write_unlock_irq(&tasklist_lock); - task_unlock(task); -out: - return retval; -} - -void __ptrace_detach(struct task_struct *child, unsigned int data) -{ - child->exit_code = data; - /* .. re-parent .. */ - __ptrace_unlink(child); - /* .. and wake it up. */ - if (child->exit_state != EXIT_ZOMBIE) - wake_up_process(child); -} - -int ptrace_detach(struct task_struct *child, unsigned int data) -{ - if (!valid_signal(data)) - return -EIO; - - /* Architecture-specific hardware disable .. */ - ptrace_disable(child); - - write_lock_irq(&tasklist_lock); - if (child->ptrace) - __ptrace_detach(child, data); - write_unlock_irq(&tasklist_lock); - - return 0; -} - /* * Access another process' address space. * Source/target buffer must be kernel space, @@ -281,253 +125,1374 @@ int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, in return buf - old_buf; } -int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len) + +#ifndef CONFIG_PTRACE + +asmlinkage long sys_ptrace(long request, long pid, long addr, long data) { - int copied = 0; + return -ENOSYS; +} - while (len > 0) { - char buf[128]; - int this_len, retval; +#else - this_len = (len > sizeof(buf)) ? sizeof(buf) : len; - retval = access_process_vm(tsk, src, buf, this_len, 0); - if (!retval) { - if (copied) - break; - return -EIO; +struct ptrace_state +{ + /* + * These elements are always available, even when the struct is + * awaiting destruction at the next RCU callback point. + */ + struct utrace_attached_engine *engine; + struct task_struct *task; /* Target task. */ + struct task_struct *parent; /* Whom we report to. */ + struct list_head entry; /* Entry on parent->ptracees list. */ + + union { + struct rcu_head dead; + struct { + u8 options; /* PTRACE_SETOPTIONS bits. */ + unsigned int stopped:1; /* Stopped for report. */ + unsigned int reported:1; /* wait already reported. */ + unsigned int syscall:1; /* Reporting for syscall. */ +#ifdef PTRACE_SYSEMU + unsigned int sysemu:1; /* PTRACE_SYSEMU in progress. */ +#endif + unsigned int have_eventmsg:1; /* u.eventmsg valid. */ + unsigned int cap_sys_ptrace:1; /* Tracer capable. */ + + union + { + unsigned long eventmsg; + siginfo_t *siginfo; + } u; + } live; + } u; +}; + +static const struct utrace_engine_ops ptrace_utrace_ops; /* Initialized below. */ + + +static void +ptrace_state_link(struct ptrace_state *state) +{ + task_lock(state->parent); + list_add_rcu(&state->entry, &state->parent->ptracees); + task_unlock(state->parent); +} + +static void +ptrace_state_unlink(struct ptrace_state *state) +{ + task_lock(state->parent); + list_del_rcu(&state->entry); + task_unlock(state->parent); +} + +static int +ptrace_setup(struct task_struct *target, struct utrace_attached_engine *engine, + struct task_struct *parent, u8 options, int cap_sys_ptrace) +{ + struct ptrace_state *state = kzalloc(sizeof *state, GFP_USER); + if (unlikely(state == NULL)) + return -ENOMEM; + + state->engine = engine; + state->task = target; + state->parent = parent; + state->u.live.options = options; + state->u.live.cap_sys_ptrace = cap_sys_ptrace; + ptrace_state_link(state); + + BUG_ON(engine->data != 0); + rcu_assign_pointer(engine->data, (unsigned long) state); + + return 0; +} + +static void +ptrace_state_free(struct rcu_head *rhead) +{ + struct ptrace_state *state = container_of(rhead, + struct ptrace_state, u.dead); + kfree(state); +} + +static void +ptrace_done(struct ptrace_state *state) +{ + INIT_RCU_HEAD(&state->u.dead); + call_rcu(&state->u.dead, ptrace_state_free); +} + +/* + * Update the tracing engine state to match the new ptrace state. + */ +static void +ptrace_update(struct task_struct *target, struct utrace_attached_engine *engine, + unsigned long flags) +{ + struct ptrace_state *state = (struct ptrace_state *) engine->data; + + /* + * These events are always reported. + */ + flags |= (UTRACE_EVENT(DEATH) | UTRACE_EVENT(EXEC) + | UTRACE_EVENT_SIGNAL_ALL); + + /* + * We always have to examine clone events to check for CLONE_PTRACE. + */ + flags |= UTRACE_EVENT(CLONE); + + /* + * PTRACE_SETOPTIONS can request more events. + */ + if (state->u.live.options & PTRACE_O_TRACEEXIT) + flags |= UTRACE_EVENT(EXIT); + if (state->u.live.options & PTRACE_O_TRACEVFORKDONE) + flags |= UTRACE_EVENT(VFORK_DONE); + + /* + * ptrace always inhibits normal parent reaping. + * But for a corner case we sometimes see the REAP event instead. + */ + flags |= UTRACE_ACTION_NOREAP | UTRACE_EVENT(REAP); + + state->u.live.stopped = (flags & UTRACE_ACTION_QUIESCE) != 0; + if (!state->u.live.stopped) { + if (!state->u.live.have_eventmsg) + state->u.live.u.siginfo = NULL; + if (!(target->flags & PF_EXITING)) + target->exit_code = 0; + } + utrace_set_flags(target, engine, flags); +} + +static int ptrace_traceme(void) +{ + struct utrace_attached_engine *engine; + int retval; + + engine = utrace_attach(current, (UTRACE_ATTACH_CREATE + | UTRACE_ATTACH_EXCLUSIVE + | UTRACE_ATTACH_MATCH_OPS), + &ptrace_utrace_ops, 0UL); + + if (IS_ERR(engine)) { + retval = PTR_ERR(engine); + if (retval == -EEXIST) + retval = -EPERM; + } + else { + task_lock(current); + retval = security_ptrace(current->parent, current); + task_unlock(current); + if (!retval) + retval = ptrace_setup(current, engine, + current->parent, 0, 0); + if (retval) + utrace_detach(current, engine); + else + ptrace_update(current, engine, 0); + } + + return retval; +} + +static int ptrace_attach(struct task_struct *task) +{ + struct utrace_attached_engine *engine; + int retval; + + retval = -EPERM; + if (task->pid <= 1) + goto bad; + if (task->tgid == current->tgid) + goto bad; + if (!task->mm) /* kernel threads */ + goto bad; + + engine = utrace_attach(task, (UTRACE_ATTACH_CREATE + | UTRACE_ATTACH_EXCLUSIVE + | UTRACE_ATTACH_MATCH_OPS), + &ptrace_utrace_ops, 0); + if (IS_ERR(engine)) { + retval = PTR_ERR(engine); + if (retval == -EEXIST) + retval = -EPERM; + goto bad; + } + + if (ptrace_may_attach(task)) + retval = ptrace_setup(task, engine, current, 0, + capable(CAP_SYS_PTRACE)); + if (retval) + utrace_detach(task, engine); + else { + int stopped; + + /* Go */ + ptrace_update(task, engine, 0); + force_sig_specific(SIGSTOP, task); + + spin_lock_irq(&task->sighand->siglock); + stopped = (task->state == TASK_STOPPED); + spin_unlock_irq(&task->sighand->siglock); + + if (stopped) { + /* + * Do now the regset 0 writeback that we do on every + * stop, since it's never been done. On register + * window machines, this makes sure the user memory + * backing the register data is up to date. + */ + const struct utrace_regset *regset; + regset = utrace_regset(task, engine, + utrace_native_view(task), 0); + if (regset->writeback) + (*regset->writeback)(task, regset, 1); } - if (copy_to_user(dst, buf, retval)) - return -EFAULT; - copied += retval; - src += retval; - dst += retval; - len -= retval; } - return copied; + +bad: + return retval; } -int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long dst, int len) +static int ptrace_detach(struct task_struct *task, + struct utrace_attached_engine *engine) { - int copied = 0; + struct ptrace_state *state = (struct ptrace_state *) engine->data; + /* + * Clearing ->data before detach makes sure an unrelated task + * calling into ptrace_tracer_task won't try to touch stale state. + */ + rcu_assign_pointer(engine->data, 0UL); + utrace_detach(task, engine); + ptrace_state_unlink(state); + ptrace_done(state); + return 0; +} - while (len > 0) { - char buf[128]; - int this_len, retval; - this_len = (len > sizeof(buf)) ? sizeof(buf) : len; - if (copy_from_user(buf, src, this_len)) - return -EFAULT; - retval = access_process_vm(tsk, dst, buf, this_len, 1); - if (!retval) { - if (copied) - break; - return -EIO; +/* + * This is called when we are exiting. We must stop all our ptracing. + */ +void +ptrace_exit(struct task_struct *tsk) +{ + rcu_read_lock(); + if (unlikely(!list_empty(&tsk->ptracees))) { + struct ptrace_state *state, *next; + + /* + * First detach the utrace layer from all the tasks. + * We don't want to hold any locks while calling utrace_detach. + */ + list_for_each_entry_rcu(state, &tsk->ptracees, entry) { + rcu_assign_pointer(state->engine->data, 0UL); + utrace_detach(state->task, state->engine); + } + + /* + * Now clear out our list and clean up our data structures. + * The task_lock protects our list structure. + */ + task_lock(tsk); + list_for_each_entry_safe(state, next, &tsk->ptracees, entry) { + list_del_rcu(&state->entry); + ptrace_done(state); } - copied += retval; - src += retval; - dst += retval; - len -= retval; + task_unlock(tsk); } - return copied; + rcu_read_unlock(); + + BUG_ON(!list_empty(&tsk->ptracees)); } -static int ptrace_setoptions(struct task_struct *child, long data) +static int +ptrace_induce_signal(struct task_struct *target, + struct utrace_attached_engine *engine, + long signr) { - child->ptrace &= ~PT_TRACE_MASK; + struct ptrace_state *state = (struct ptrace_state *) engine->data; - if (data & PTRACE_O_TRACESYSGOOD) - child->ptrace |= PT_TRACESYSGOOD; + if (signr == 0) + return 0; - if (data & PTRACE_O_TRACEFORK) - child->ptrace |= PT_TRACE_FORK; + if (!valid_signal(signr)) + return -EIO; - if (data & PTRACE_O_TRACEVFORK) - child->ptrace |= PT_TRACE_VFORK; + if (state->u.live.syscall) { + /* + * This is the traditional ptrace behavior when given + * a signal to resume from a syscall tracing stop. + */ + send_sig(signr, target, 1); + } + else if (!state->u.live.have_eventmsg && state->u.live.u.siginfo) { + siginfo_t *info = state->u.live.u.siginfo; + + /* Update the siginfo structure if the signal has + changed. If the debugger wanted something + specific in the siginfo structure then it should + have updated *info via PTRACE_SETSIGINFO. */ + if (signr != info->si_signo) { + info->si_signo = signr; + info->si_errno = 0; + info->si_code = SI_USER; + info->si_pid = current->pid; + info->si_uid = current->uid; + } - if (data & PTRACE_O_TRACECLONE) - child->ptrace |= PT_TRACE_CLONE; + return utrace_inject_signal(target, engine, + UTRACE_ACTION_RESUME, info, NULL); + } - if (data & PTRACE_O_TRACEEXEC) - child->ptrace |= PT_TRACE_EXEC; + return 0; +} + +fastcall int +ptrace_regset_access(struct task_struct *target, + struct utrace_attached_engine *engine, + const struct utrace_regset_view *view, + int setno, unsigned long offset, unsigned int size, + void __user *data, int write) +{ + const struct utrace_regset *regset = utrace_regset(target, engine, + view, setno); + int ret; - if (data & PTRACE_O_TRACEVFORKDONE) - child->ptrace |= PT_TRACE_VFORK_DONE; + if (unlikely(regset == NULL)) + return -EIO; + + if (size == (unsigned int) -1) + size = regset->size * regset->n; - if (data & PTRACE_O_TRACEEXIT) - child->ptrace |= PT_TRACE_EXIT; + if (write) { + if (!access_ok(VERIFY_READ, data, size)) + ret = -EIO; + else + ret = (*regset->set)(target, regset, + offset, size, NULL, data); + } + else { + if (!access_ok(VERIFY_WRITE, data, size)) + ret = -EIO; + else + ret = (*regset->get)(target, regset, + offset, size, NULL, data); + } - return (data & ~PTRACE_O_MASK) ? -EINVAL : 0; + return ret; } -static int ptrace_getsiginfo(struct task_struct *child, siginfo_t __user * data) +fastcall int +ptrace_onereg_access(struct task_struct *target, + struct utrace_attached_engine *engine, + const struct utrace_regset_view *view, + int setno, unsigned long regno, + void __user *data, int write) { - siginfo_t lastinfo; - int error = -ESRCH; + const struct utrace_regset *regset = utrace_regset(target, engine, + view, setno); + unsigned int pos; + int ret; - read_lock(&tasklist_lock); - if (likely(child->sighand != NULL)) { - error = -EINVAL; - spin_lock_irq(&child->sighand->siglock); - if (likely(child->last_siginfo != NULL)) { - lastinfo = *child->last_siginfo; - error = 0; - } - spin_unlock_irq(&child->sighand->siglock); + if (unlikely(regset == NULL)) + return -EIO; + + if (regno < regset->bias || regno >= regset->bias + regset->n) + return -EINVAL; + + pos = (regno - regset->bias) * regset->size; + + if (write) { + if (!access_ok(VERIFY_READ, data, regset->size)) + ret = -EIO; + else + ret = (*regset->set)(target, regset, pos, regset->size, + NULL, data); } - read_unlock(&tasklist_lock); - if (!error) - return copy_siginfo_to_user(data, &lastinfo); - return error; + else { + if (!access_ok(VERIFY_WRITE, data, regset->size)) + ret = -EIO; + else + ret = (*regset->get)(target, regset, pos, regset->size, + NULL, data); + } + + return ret; } -static int ptrace_setsiginfo(struct task_struct *child, siginfo_t __user * data) +fastcall int +ptrace_layout_access(struct task_struct *target, + struct utrace_attached_engine *engine, + const struct utrace_regset_view *view, + const struct ptrace_layout_segment layout[], + unsigned long addr, unsigned int size, + void __user *udata, void *kdata, int write) { - siginfo_t newinfo; - int error = -ESRCH; + const struct ptrace_layout_segment *seg; + int ret = -EIO; + + if (kdata == NULL && + !access_ok(write ? VERIFY_READ : VERIFY_WRITE, udata, size)) + return -EIO; - if (copy_from_user(&newinfo, data, sizeof (siginfo_t))) - return -EFAULT; + seg = layout; + do { + unsigned int pos, n; - read_lock(&tasklist_lock); - if (likely(child->sighand != NULL)) { - error = -EINVAL; - spin_lock_irq(&child->sighand->siglock); - if (likely(child->last_siginfo != NULL)) { - *child->last_siginfo = newinfo; - error = 0; + while (addr >= seg->end && seg->end != 0) + ++seg; + + if (addr < seg->start || addr >= seg->end) + return -EIO; + + pos = addr - seg->start + seg->offset; + n = min(size, seg->end - (unsigned int) addr); + + if (unlikely(seg->regset == (unsigned int) -1)) { + /* + * This is a no-op/zero-fill portion of struct user. + */ + ret = 0; + if (!write) { + if (kdata) + memset(kdata, 0, n); + else if (clear_user(udata, n)) + ret = -EFAULT; + } } - spin_unlock_irq(&child->sighand->siglock); - } + else { + unsigned int align; + const struct utrace_regset *regset = utrace_regset( + target, engine, view, seg->regset); + if (unlikely(regset == NULL)) + return -EIO; + + /* + * A ptrace compatibility layout can do a misaligned + * regset access, e.g. word access to larger data. + * An arch's compat layout can be this way only if + * it is actually ok with the regset code despite the + * regset->align setting. + */ + align = min(regset->align, size); + if ((pos & (align - 1)) + || pos >= regset->n * regset->size) + return -EIO; + + if (write) + ret = (*regset->set)(target, regset, + pos, n, kdata, udata); + else + ret = (*regset->get)(target, regset, + pos, n, kdata, udata); + } + + if (kdata) + kdata += n; + else + udata += n; + addr += n; + size -= n; + } while (ret == 0 && size > 0); + + return ret; +} + + +static int +ptrace_start(long pid, long request, + struct task_struct **childp, + struct utrace_attached_engine **enginep, + struct ptrace_state **statep) + +{ + struct task_struct *child; + struct utrace_attached_engine *engine; + struct ptrace_state *state; + int ret; + + if (request == PTRACE_TRACEME) + return ptrace_traceme(); + + ret = -ESRCH; + read_lock(&tasklist_lock); + child = find_task_by_pid(pid); + if (child) + get_task_struct(child); read_unlock(&tasklist_lock); - return error; +#ifdef PTRACE_DEBUG + printk("ptrace pid %ld => %p\n", pid, child); +#endif + if (!child) + goto out; + + ret = -EPERM; + if (pid == 1) /* you may not mess with init */ + goto out_tsk; + + if (!vx_check(vx_task_xid(child), VX_WATCH|VX_IDENT)) + goto out_tsk; + + if (request == PTRACE_ATTACH) { + ret = ptrace_attach(child); + goto out_tsk; + } + + engine = utrace_attach(child, UTRACE_ATTACH_MATCH_OPS, + &ptrace_utrace_ops, 0); + ret = -ESRCH; + if (IS_ERR(engine) || engine == NULL) + goto out_tsk; + rcu_read_lock(); + state = rcu_dereference((struct ptrace_state *) engine->data); + if (state == NULL || state->parent != current) { + rcu_read_unlock(); + goto out_tsk; + } + rcu_read_unlock(); + + /* + * Traditional ptrace behavior demands that the target already be + * quiescent, but not dead. + */ + if (request != PTRACE_KILL && !state->u.live.stopped) { +#ifdef PTRACE_DEBUG + printk("%d not stopped (%lx)\n", child->pid, child->state); +#endif + if (child->state != TASK_STOPPED) + goto out_tsk; + utrace_set_flags(child, engine, + engine->flags | UTRACE_ACTION_QUIESCE); + } + + /* + * We do this for all requests to match traditional ptrace behavior. + * If the machine state synchronization done at context switch time + * includes e.g. writing back to user memory, we want to make sure + * that has finished before a PTRACE_PEEKDATA can fetch the results. + * On most machines, only regset data is affected by context switch + * and calling utrace_regset later on will take care of that, so + * this is superfluous. + * + * To do this purely in utrace terms, we could do: + * (void) utrace_regset(child, engine, utrace_native_view(child), 0); + */ + wait_task_inactive(child); + + if (child->exit_state) + goto out_tsk; + + *childp = child; + *enginep = engine; + *statep = state; + return -EIO; + +out_tsk: + put_task_struct(child); +out: + return ret; } -int ptrace_request(struct task_struct *child, long request, - long addr, long data) +static int +ptrace_common(long request, struct task_struct *child, + struct utrace_attached_engine *engine, + struct ptrace_state *state, + unsigned long addr, long data) { + unsigned long flags; int ret = -EIO; switch (request) { + case PTRACE_DETACH: + /* + * Detach a process that was attached. + */ + ret = ptrace_induce_signal(child, engine, data); + if (!ret) + ret = ptrace_detach(child, engine); + break; + + /* + * These are the operations that resume the child running. + */ + case PTRACE_KILL: + data = SIGKILL; + case PTRACE_CONT: + case PTRACE_SYSCALL: +#ifdef PTRACE_SYSEMU + case PTRACE_SYSEMU: + case PTRACE_SYSEMU_SINGLESTEP: +#endif +#ifdef PTRACE_SINGLEBLOCK + case PTRACE_SINGLEBLOCK: +# ifdef ARCH_HAS_BLOCK_STEP + if (! ARCH_HAS_BLOCK_STEP) +# endif + if (request == PTRACE_SINGLEBLOCK) + break; +#endif + case PTRACE_SINGLESTEP: +#ifdef ARCH_HAS_SINGLE_STEP + if (! ARCH_HAS_SINGLE_STEP) +#endif + if (request == PTRACE_SINGLESTEP +#ifdef PTRACE_SYSEMU_SINGLESTEP + || request == PTRACE_SYSEMU_SINGLESTEP +#endif + ) + break; + + ret = ptrace_induce_signal(child, engine, data); + if (ret) + break; + + + /* + * Reset the action flags without QUIESCE, so it resumes. + */ + flags = 0; +#ifdef PTRACE_SYSEMU + state->u.live.sysemu = (request == PTRACE_SYSEMU_SINGLESTEP + || request == PTRACE_SYSEMU); +#endif + if (request == PTRACE_SINGLESTEP +#ifdef PTRACE_SYSEMU + || request == PTRACE_SYSEMU_SINGLESTEP +#endif + ) + flags |= UTRACE_ACTION_SINGLESTEP; +#ifdef PTRACE_SINGLEBLOCK + else if (request == PTRACE_SINGLEBLOCK) + flags |= UTRACE_ACTION_BLOCKSTEP; +#endif + if (request == PTRACE_SYSCALL) + flags |= UTRACE_EVENT_SYSCALL; +#ifdef PTRACE_SYSEMU + else if (request == PTRACE_SYSEMU + || request == PTRACE_SYSEMU_SINGLESTEP) + flags |= UTRACE_EVENT(SYSCALL_ENTRY); +#endif + ptrace_update(child, engine, flags); + ret = 0; + break; + #ifdef PTRACE_OLDSETOPTIONS case PTRACE_OLDSETOPTIONS: #endif case PTRACE_SETOPTIONS: - ret = ptrace_setoptions(child, data); + ret = -EINVAL; + if (data & ~PTRACE_O_MASK) + break; + state->u.live.options = data; + ptrace_update(child, engine, UTRACE_ACTION_QUIESCE); + ret = 0; + break; + } + + return ret; +} + + +asmlinkage long sys_ptrace(long request, long pid, long addr, long data) +{ + struct task_struct *child; + struct utrace_attached_engine *engine; + struct ptrace_state *state; + long ret, val; + +#ifdef PTRACE_DEBUG + printk("%d sys_ptrace(%ld, %ld, %lx, %lx)\n", + current->pid, request, pid, addr, data); +#endif + + ret = ptrace_start(pid, request, &child, &engine, &state); + if (ret != -EIO) + goto out; + + val = 0; + ret = arch_ptrace(&request, child, engine, addr, data, &val); + if (ret != -ENOSYS) { + if (ret == 0) { + ret = val; + force_successful_syscall_return(); + } + goto out_tsk; + } + + switch (request) { + default: + ret = ptrace_common(request, child, engine, state, addr, data); break; + + case PTRACE_PEEKTEXT: /* read word at location addr. */ + case PTRACE_PEEKDATA: { + unsigned long tmp; + int copied; + + copied = access_process_vm(child, addr, &tmp, sizeof(tmp), 0); + ret = -EIO; + if (copied != sizeof(tmp)) + break; + ret = put_user(tmp, (unsigned long __user *) data); + break; + } + + case PTRACE_POKETEXT: /* write the word at location addr. */ + case PTRACE_POKEDATA: + ret = 0; + if (access_process_vm(child, addr, &data, sizeof(data), 1) == sizeof(data)) + break; + ret = -EIO; + break; + case PTRACE_GETEVENTMSG: - ret = put_user(child->ptrace_message, (unsigned long __user *) data); + ret = put_user(state->u.live.have_eventmsg + ? state->u.live.u.eventmsg : 0L, + (unsigned long __user *) data); break; case PTRACE_GETSIGINFO: - ret = ptrace_getsiginfo(child, (siginfo_t __user *) data); + ret = -EINVAL; + if (!state->u.live.have_eventmsg && state->u.live.u.siginfo) + ret = copy_siginfo_to_user((siginfo_t __user *) data, + state->u.live.u.siginfo); break; case PTRACE_SETSIGINFO: - ret = ptrace_setsiginfo(child, (siginfo_t __user *) data); + ret = -EINVAL; + if (!state->u.live.have_eventmsg && state->u.live.u.siginfo + && copy_from_user(state->u.live.u.siginfo, + (siginfo_t __user *) data, + sizeof(siginfo_t))) + ret = -EFAULT; break; + } + +out_tsk: + put_task_struct(child); +out: +#ifdef PTRACE_DEBUG + printk("%d ptrace -> %x\n", current->pid, ret); +#endif + return ret; +} + + +#ifdef CONFIG_COMPAT +#include + +asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid, + compat_ulong_t addr, compat_long_t cdata) +{ + const unsigned long data = (unsigned long) (compat_ulong_t) cdata; + struct task_struct *child; + struct utrace_attached_engine *engine; + struct ptrace_state *state; + compat_long_t ret, val; + +#ifdef PTRACE_DEBUG + printk("%d compat_sys_ptrace(%d, %d, %x, %x)\n", + current->pid, request, pid, addr, cdata); +#endif + ret = ptrace_start(pid, request, &child, &engine, &state); + if (ret != -EIO) + goto out; + + val = 0; + ret = arch_compat_ptrace(&request, child, engine, addr, cdata, &val); + if (ret != -ENOSYS) { + if (ret == 0) { + ret = val; + force_successful_syscall_return(); + } + goto out_tsk; + } + + switch (request) { default: + ret = ptrace_common(request, child, engine, state, addr, data); + break; + + case PTRACE_PEEKTEXT: /* read word at location addr. */ + case PTRACE_PEEKDATA: { + compat_ulong_t tmp; + int copied; + + copied = access_process_vm(child, addr, &tmp, sizeof(tmp), 0); + ret = -EIO; + if (copied != sizeof(tmp)) + break; + ret = put_user(tmp, (compat_ulong_t __user *) data); break; } + case PTRACE_POKETEXT: /* write the word at location addr. */ + case PTRACE_POKEDATA: + ret = 0; + if (access_process_vm(child, addr, &cdata, sizeof(cdata), 1) == sizeof(cdata)) + break; + ret = -EIO; + break; + + case PTRACE_GETEVENTMSG: + ret = put_user(state->u.live.have_eventmsg + ? state->u.live.u.eventmsg : 0L, + (compat_long_t __user *) data); + break; + case PTRACE_GETSIGINFO: + ret = -EINVAL; + if (!state->u.live.have_eventmsg && state->u.live.u.siginfo) + ret = copy_siginfo_to_user32( + (struct compat_siginfo __user *) data, + state->u.live.u.siginfo); + break; + case PTRACE_SETSIGINFO: + ret = -EINVAL; + if (!state->u.live.have_eventmsg && state->u.live.u.siginfo + && copy_siginfo_from_user32( + state->u.live.u.siginfo, + (struct compat_siginfo __user *) data)) + ret = -EFAULT; + break; + } + +out_tsk: + put_task_struct(child); +out: +#ifdef PTRACE_DEBUG + printk("%d ptrace -> %x\n", current->pid, ret); +#endif return ret; } +#endif -/** - * ptrace_traceme -- helper for PTRACE_TRACEME - * - * Performs checks and sets PT_PTRACED. - * Should be used by all ptrace implementations for PTRACE_TRACEME. + +/* + * We're called with tasklist_lock held for reading. + * If we return -ECHILD or zero, next_thread(tsk) must still be valid to use. + * If we return another error code, or a successful PID value, we + * release tasklist_lock first. */ -int ptrace_traceme(void) +int +ptrace_do_wait(struct task_struct *tsk, + pid_t pid, int options, struct siginfo __user *infop, + int __user *stat_addr, struct rusage __user *rusagep) { - int ret = -EPERM; + struct ptrace_state *state; + struct task_struct *p; + int err = -ECHILD; + int why, status; + + rcu_read_lock(); + list_for_each_entry_rcu(state, &tsk->ptracees, entry) { + p = state->task; + + if (pid > 0) { + if (p->pid != pid) + continue; + } else if (!pid) { + if (process_group(p) != process_group(current)) + continue; + } else if (pid != -1) { + if (process_group(p) != -pid) + continue; + } + if (((p->exit_signal != SIGCHLD) ^ ((options & __WCLONE) != 0)) + && !(options & __WALL)) + continue; + if (security_task_wait(p)) + continue; + + err = 0; + if (state->u.live.reported) + continue; + + if (state->u.live.stopped) + goto found; + if ((p->state & (TASK_TRACED | TASK_STOPPED)) + && (p->signal->flags & SIGNAL_STOP_STOPPED)) + goto found; + if (p->exit_state == EXIT_ZOMBIE) { + if (!likely(options & WEXITED)) + continue; + if (delay_group_leader(p)) + continue; + goto found; + } + // XXX should handle WCONTINUED + } + rcu_read_unlock(); + return err; + +found: + rcu_read_unlock(); + + BUG_ON(state->parent != tsk); + + if (p->exit_state) { + if (unlikely(p->parent == state->parent)) + /* + * This is our natural child we were ptracing. + * When it dies it detaches (see ptrace_report_death). + * So we're seeing it here in a race. When it + * finishes detaching it will become reapable in + * the normal wait_task_zombie path instead. + */ + return 0; + if ((p->exit_code & 0x7f) == 0) { + why = CLD_EXITED; + status = p->exit_code >> 8; + } else { + why = (p->exit_code & 0x80) ? CLD_DUMPED : CLD_KILLED; + status = p->exit_code & 0xff; + } + } + else { + why = CLD_TRAPPED; + status = (p->exit_code << 8) | 0x7f; + } /* - * Are we already being traced? + * At this point we are committed to a successful return + * or a user error return. Release the tasklist_lock. */ - task_lock(current); - if (!(current->ptrace & PT_PTRACED)) { - ret = security_ptrace(current->parent, current); + read_unlock(&tasklist_lock); + + if (rusagep) + err = getrusage(p, RUSAGE_BOTH, rusagep); + if (infop) { + if (!err) + err = put_user(SIGCHLD, &infop->si_signo); + if (!err) + err = put_user(0, &infop->si_errno); + if (!err) + err = put_user((short)why, &infop->si_code); + if (!err) + err = put_user(p->pid, &infop->si_pid); + if (!err) + err = put_user(p->uid, &infop->si_uid); + if (!err) + err = put_user(status, &infop->si_status); + } + if (!err && stat_addr) + err = put_user(status, stat_addr); + + if (!err) { + struct utrace *utrace; + + err = p->pid; + /* - * Set the ptrace bit in the process ptrace flags. + * If this was a non-death report, the child might now be + * detaching on death in the same race possible in the + * p->exit_state check above. So check for p->utrace being + * NULL, then we don't need to update the state any more. */ - if (!ret) - current->ptrace |= PT_PTRACED; + rcu_read_lock(); + utrace = rcu_dereference(p->utrace); + if (likely(utrace != NULL)) { + utrace_lock(utrace); + if (unlikely(state->u.live.reported)) + /* + * Another thread in the group got here + * first and reaped it before we locked. + */ + err = -ERESTARTNOINTR; + state->u.live.reported = 1; + utrace_unlock(utrace); + } + rcu_read_unlock(); + + if (err > 0 && why != CLD_TRAPPED) + ptrace_detach(p, state->engine); } - task_unlock(current); - return ret; + + return err; } -/** - * ptrace_get_task_struct -- grab a task struct reference for ptrace - * @pid: process id to grab a task_struct reference of - * - * This function is a helper for ptrace implementations. It checks - * permissions and then grabs a task struct for use of the actual - * ptrace implementation. - * - * Returns the task_struct for @pid or an ERR_PTR() on failure. - */ -struct task_struct *ptrace_get_task_struct(pid_t pid) +static void +do_notify(struct task_struct *tsk, struct task_struct *parent, int why) { - struct task_struct *child; + struct siginfo info; + unsigned long flags; + struct sighand_struct *sighand; + int sa_mask; + + info.si_signo = SIGCHLD; + info.si_errno = 0; + info.si_pid = tsk->pid; + info.si_uid = tsk->uid; + + /* FIXME: find out whether or not this is supposed to be c*time. */ + info.si_utime = cputime_to_jiffies(tsk->utime); + info.si_stime = cputime_to_jiffies(tsk->stime); + + sa_mask = SA_NOCLDSTOP; + info.si_code = why; + info.si_status = tsk->exit_code & 0x7f; + if (why == CLD_CONTINUED) + info.si_status = SIGCONT; + else if (why == CLD_STOPPED) + info.si_status = tsk->signal->group_exit_code & 0x7f; + else if (why == CLD_EXITED) { + sa_mask = SA_NOCLDWAIT; + if (tsk->exit_code & 0x80) + info.si_code = CLD_DUMPED; + else if (tsk->exit_code & 0x7f) + info.si_code = CLD_KILLED; + else { + info.si_code = CLD_EXITED; + info.si_status = tsk->exit_code >> 8; + } + } + sighand = parent->sighand; + spin_lock_irqsave(&sighand->siglock, flags); + if (sighand->action[SIGCHLD-1].sa.sa_handler != SIG_IGN && + !(sighand->action[SIGCHLD-1].sa.sa_flags & sa_mask)) + __group_send_sig_info(SIGCHLD, &info, parent); /* - * Tracing init is not allowed. + * Even if SIGCHLD is not generated, we must wake up wait4 calls. */ - if (pid == 1) - return ERR_PTR(-EPERM); - - read_lock(&tasklist_lock); - child = find_task_by_pid(pid); - if (child) - get_task_struct(child); - read_unlock(&tasklist_lock); - if (!child) - return ERR_PTR(-ESRCH); - return child; + wake_up_interruptible_sync(&parent->signal->wait_chldexit); + spin_unlock_irqrestore(&sighand->siglock, flags); } -#ifndef __ARCH_SYS_PTRACE -asmlinkage long sys_ptrace(long request, long pid, long addr, long data) +static u32 +ptrace_report(struct utrace_attached_engine *engine, struct task_struct *tsk, + int code) { - struct task_struct *child; - long ret; + struct ptrace_state *state = (struct ptrace_state *) engine->data; + const struct utrace_regset *regset; + +#ifdef PTRACE_DEBUG + printk("%d ptrace_report %d engine %p state %p code %x parent %d (%p)\n", + current->pid, tsk->pid, engine, state, code, + state->parent->pid, state->parent); + if (!state->u.live.have_eventmsg && state->u.live.u.siginfo) { + const siginfo_t *si = state->u.live.u.siginfo; + printk(" si %d code %x errno %d addr %p\n", + si->si_signo, si->si_code, si->si_errno, + si->si_addr); + } +#endif + + BUG_ON(state->u.live.stopped); /* - * This lock_kernel fixes a subtle race with suid exec + * Set our QUIESCE flag right now, before notifying the tracer. + * We do this before setting state->u.live.stopped rather than + * by using UTRACE_ACTION_NEWSTATE in our return value, to + * ensure that the tracer can't get the notification and then + * try to resume us with PTRACE_CONT before we set the flag. */ - lock_kernel(); - if (request == PTRACE_TRACEME) { - ret = ptrace_traceme(); - goto out; + utrace_set_flags(tsk, engine, engine->flags | UTRACE_ACTION_QUIESCE); + + /* + * If regset 0 has a writeback call, do it now. On register window + * machines, this makes sure the user memory backing the register + * data is up to date by the time wait_task_inactive returns to + * ptrace_start in our tracer doing a PTRACE_PEEKDATA or the like. + */ + regset = utrace_regset(tsk, engine, utrace_native_view(tsk), 0); + if (regset->writeback) + (*regset->writeback)(tsk, regset, 0); + + state->u.live.stopped = 1; + state->u.live.reported = 0; + tsk->exit_code = code; + do_notify(tsk, state->parent, CLD_TRAPPED); + +#ifdef PTRACE_DEBUG + printk("%d ptrace_report quiescing exit_code %x\n", + current->pid, current->exit_code); +#endif + + return UTRACE_ACTION_RESUME; +} + +static inline u32 +ptrace_event(struct utrace_attached_engine *engine, struct task_struct *tsk, + int event) +{ + struct ptrace_state *state = (struct ptrace_state *) engine->data; + state->u.live.syscall = 0; + return ptrace_report(engine, tsk, (event << 8) | SIGTRAP); +} + + +static u32 +ptrace_report_death(struct utrace_attached_engine *engine, + struct task_struct *tsk) +{ + struct ptrace_state *state = (struct ptrace_state *) engine->data; + + if (tsk->parent == state->parent) { + /* + * This is a natural child, so we detach and let the normal + * reporting happen once our NOREAP action is gone. But + * first, generate a SIGCHLD for those cases where normal + * behavior won't. A ptrace'd child always generates SIGCHLD. + */ + if (tsk->exit_signal == -1 || !thread_group_empty(tsk)) + do_notify(tsk, state->parent, CLD_EXITED); + ptrace_state_unlink(state); + rcu_assign_pointer(engine->data, 0UL); + ptrace_done(state); + return UTRACE_ACTION_DETACH; } - child = ptrace_get_task_struct(pid); - if (IS_ERR(child)) { - ret = PTR_ERR(child); + state->u.live.reported = 0; + do_notify(tsk, state->parent, CLD_EXITED); + return UTRACE_ACTION_RESUME; +} + +/* + * We get this only in the case where our UTRACE_ACTION_NOREAP was ignored. + * That happens solely when a non-leader exec reaps the old leader. + */ +static void +ptrace_report_reap(struct utrace_attached_engine *engine, + struct task_struct *tsk) +{ + struct ptrace_state *state; + rcu_read_lock(); + state = rcu_dereference((struct ptrace_state *) engine->data); + if (state != NULL) { + ptrace_state_unlink(state); + rcu_assign_pointer(engine->data, 0UL); + ptrace_done(state); + } + rcu_read_unlock(); +} + + +static u32 +ptrace_report_clone(struct utrace_attached_engine *engine, + struct task_struct *parent, + unsigned long clone_flags, struct task_struct *child) +{ + struct ptrace_state *state = (struct ptrace_state *) engine->data; + struct utrace_attached_engine *child_engine; + int event = PTRACE_EVENT_FORK; + int option = PTRACE_O_TRACEFORK; + +#ifdef PTRACE_DEBUG + printk("%d (%p) engine %p ptrace_report_clone child %d (%p) fl %lx\n", + parent->pid, parent, engine, child->pid, child, clone_flags); +#endif + + if (clone_flags & CLONE_UNTRACED) goto out; + + if (clone_flags & CLONE_VFORK) { + event = PTRACE_EVENT_VFORK; + option = PTRACE_O_TRACEVFORK; + } + else if ((clone_flags & CSIGNAL) != SIGCHLD) { + event = PTRACE_EVENT_CLONE; + option = PTRACE_O_TRACECLONE; } - ret = -EPERM; - if (!vx_check(vx_task_xid(child), VX_WATCH|VX_IDENT)) - goto out_put_task_struct; + if (!(clone_flags & CLONE_PTRACE) && !(state->u.live.options & option)) + goto out; - if (request == PTRACE_ATTACH) { - ret = ptrace_attach(child); - goto out_put_task_struct; + child_engine = utrace_attach(child, (UTRACE_ATTACH_CREATE + | UTRACE_ATTACH_EXCLUSIVE + | UTRACE_ATTACH_MATCH_OPS), + &ptrace_utrace_ops, 0UL); + if (unlikely(IS_ERR(child_engine))) { + BUG_ON(PTR_ERR(child_engine) != -ENOMEM); + printk(KERN_ERR + "ptrace out of memory, lost child %d of %d", + child->pid, parent->pid); + } + else { + int ret = ptrace_setup(child, child_engine, + state->parent, + state->u.live.options, + state->u.live.cap_sys_ptrace); + if (unlikely(ret != 0)) { + BUG_ON(ret != -ENOMEM); + printk(KERN_ERR + "ptrace out of memory, lost child %d of %d", + child->pid, parent->pid); + utrace_detach(child, child_engine); + } + else { + sigaddset(&child->pending.signal, SIGSTOP); + set_tsk_thread_flag(child, TIF_SIGPENDING); + ptrace_update(child, child_engine, 0); + } } - ret = ptrace_check_attach(child, request == PTRACE_KILL); - if (ret < 0) - goto out_put_task_struct; + if (state->u.live.options & option) { + state->u.live.have_eventmsg = 1; + state->u.live.u.eventmsg = child->pid; + return ptrace_event(engine, parent, event); + } - ret = arch_ptrace(child, request, addr, data); - if (ret < 0) - goto out_put_task_struct; +out: + return UTRACE_ACTION_RESUME; +} - out_put_task_struct: - put_task_struct(child); - out: - unlock_kernel(); - return ret; + +static u32 +ptrace_report_vfork_done(struct utrace_attached_engine *engine, + struct task_struct *parent, pid_t child_pid) +{ + struct ptrace_state *state = (struct ptrace_state *) engine->data; + state->u.live.have_eventmsg = 1; + state->u.live.u.eventmsg = child_pid; + return ptrace_event(engine, parent, PTRACE_EVENT_VFORK_DONE); } -#endif /* __ARCH_SYS_PTRACE */ + + +static u32 +ptrace_report_signal(struct utrace_attached_engine *engine, + struct task_struct *tsk, struct pt_regs *regs, + u32 action, siginfo_t *info, + const struct k_sigaction *orig_ka, + struct k_sigaction *return_ka) +{ + struct ptrace_state *state = (struct ptrace_state *) engine->data; + int signo = info == NULL ? SIGTRAP : info->si_signo; + state->u.live.syscall = 0; + state->u.live.have_eventmsg = 0; + state->u.live.u.siginfo = info; + return ptrace_report(engine, tsk, signo) | UTRACE_SIGNAL_IGN; +} + +static u32 +ptrace_report_jctl(struct utrace_attached_engine *engine, + struct task_struct *tsk, int type) +{ + struct ptrace_state *state = (struct ptrace_state *) engine->data; + do_notify(tsk, state->parent, type); + return UTRACE_JCTL_NOSIGCHLD; +} + +static u32 +ptrace_report_exec(struct utrace_attached_engine *engine, + struct task_struct *tsk, + const struct linux_binprm *bprm, + struct pt_regs *regs) +{ + struct ptrace_state *state = (struct ptrace_state *) engine->data; + if (state->u.live.options & PTRACE_O_TRACEEXEC) + return ptrace_event(engine, tsk, PTRACE_EVENT_EXEC); + state->u.live.syscall = 0; + return ptrace_report(engine, tsk, SIGTRAP); +} + +static u32 +ptrace_report_syscall(struct utrace_attached_engine *engine, + struct task_struct *tsk, struct pt_regs *regs, + int entry) +{ + struct ptrace_state *state = (struct ptrace_state *) engine->data; +#ifdef PTRACE_SYSEMU + if (entry && state->u.live.sysemu) + tracehook_abort_syscall(regs); +#endif + state->u.live.syscall = 1; + return ptrace_report(engine, tsk, + ((state->u.live.options & PTRACE_O_TRACESYSGOOD) + ? 0x80 : 0) | SIGTRAP); +} + +static u32 +ptrace_report_syscall_entry(struct utrace_attached_engine *engine, + struct task_struct *tsk, struct pt_regs *regs) +{ + return ptrace_report_syscall(engine, tsk, regs, 1); +} + +static u32 +ptrace_report_syscall_exit(struct utrace_attached_engine *engine, + struct task_struct *tsk, struct pt_regs *regs) +{ + return ptrace_report_syscall(engine, tsk, regs, 0); +} + +static u32 +ptrace_report_exit(struct utrace_attached_engine *engine, + struct task_struct *tsk, long orig_code, long *code) +{ + struct ptrace_state *state = (struct ptrace_state *) engine->data; + state->u.live.have_eventmsg = 1; + state->u.live.u.eventmsg = *code; + return ptrace_event(engine, tsk, PTRACE_EVENT_EXIT); +} + +static int +ptrace_unsafe_exec(struct utrace_attached_engine *engine, + struct task_struct *tsk) +{ + struct ptrace_state *state = (struct ptrace_state *) engine->data; + int unsafe = LSM_UNSAFE_PTRACE; + if (state->u.live.cap_sys_ptrace) + unsafe = LSM_UNSAFE_PTRACE_CAP; + return unsafe; +} + +static struct task_struct * +ptrace_tracer_task(struct utrace_attached_engine *engine, + struct task_struct *target) +{ + struct ptrace_state *state; + + /* + * This call is not necessarily made by the target task, + * so ptrace might be getting detached while we run here. + * The state pointer will be NULL if that happens. + */ + state = rcu_dereference((struct ptrace_state *) engine->data); + + return state == NULL ? NULL : state->parent; +} + +static int +ptrace_allow_access_process_vm(struct utrace_attached_engine *engine, + struct task_struct *target, + struct task_struct *caller) +{ + struct ptrace_state *state; + int ours; + + /* + * This call is not necessarily made by the target task, + * so ptrace might be getting detached while we run here. + * The state pointer will be NULL if that happens. + */ + rcu_read_lock(); + state = rcu_dereference((struct ptrace_state *) engine->data); + ours = (state != NULL + && ((engine->flags & UTRACE_ACTION_QUIESCE) + || (target->state == TASK_STOPPED)) + && state->parent == caller); + rcu_read_unlock(); + + return ours && security_ptrace(caller, target) == 0; +} + + +static const struct utrace_engine_ops ptrace_utrace_ops = +{ + .report_syscall_entry = ptrace_report_syscall_entry, + .report_syscall_exit = ptrace_report_syscall_exit, + .report_exec = ptrace_report_exec, + .report_jctl = ptrace_report_jctl, + .report_signal = ptrace_report_signal, + .report_vfork_done = ptrace_report_vfork_done, + .report_clone = ptrace_report_clone, + .report_exit = ptrace_report_exit, + .report_death = ptrace_report_death, + .report_reap = ptrace_report_reap, + .unsafe_exec = ptrace_unsafe_exec, + .tracer_task = ptrace_tracer_task, + .allow_access_process_vm = ptrace_allow_access_process_vm, +}; + +#endif diff --git a/kernel/rcupdate.c b/kernel/rcupdate.c index 2058f88c7..523e46483 100644 --- a/kernel/rcupdate.c +++ b/kernel/rcupdate.c @@ -53,13 +53,13 @@ static struct rcu_ctrlblk rcu_ctrlblk = { .cur = -300, .completed = -300, - .lock = SPIN_LOCK_UNLOCKED, + .lock = __SPIN_LOCK_UNLOCKED(&rcu_ctrlblk.lock), .cpumask = CPU_MASK_NONE, }; static struct rcu_ctrlblk rcu_bh_ctrlblk = { .cur = -300, .completed = -300, - .lock = SPIN_LOCK_UNLOCKED, + .lock = __SPIN_LOCK_UNLOCKED(&rcu_bh_ctrlblk.lock), .cpumask = CPU_MASK_NONE, }; @@ -182,6 +182,15 @@ long rcu_batches_completed(void) return rcu_ctrlblk.completed; } +/* + * Return the number of RCU batches processed thus far. Useful + * for debug and statistics. + */ +long rcu_batches_completed_bh(void) +{ + return rcu_bh_ctrlblk.completed; +} + static void rcu_barrier_callback(struct rcu_head *notused) { if (atomic_dec_and_test(&rcu_barrier_cpu_count)) @@ -232,12 +241,16 @@ static void rcu_do_batch(struct rcu_data *rdp) next = rdp->donelist = list->next; list->func(list); list = next; - rdp->qlen--; if (++count >= rdp->blimit) break; } + + local_irq_disable(); + rdp->qlen -= count; + local_irq_enable(); if (rdp->blimit == INT_MAX && rdp->qlen <= qlowmark) rdp->blimit = blimit; + if (!rdp->donelist) rdp->donetail = &rdp->donelist; else @@ -539,7 +552,7 @@ static void __devinit rcu_online_cpu(int cpu) tasklet_init(&per_cpu(rcu_tasklet, cpu), rcu_process_callbacks, 0UL); } -static int rcu_cpu_notify(struct notifier_block *self, +static int __cpuinit rcu_cpu_notify(struct notifier_block *self, unsigned long action, void *hcpu) { long cpu = (long)hcpu; @@ -556,7 +569,7 @@ static int rcu_cpu_notify(struct notifier_block *self, return NOTIFY_OK; } -static struct notifier_block rcu_nb = { +static struct notifier_block __cpuinitdata rcu_nb = { .notifier_call = rcu_cpu_notify, }; @@ -612,14 +625,6 @@ void synchronize_rcu(void) wait_for_completion(&rcu.completion); } -/* - * Deprecated, use synchronize_rcu() or synchronize_sched() instead. - */ -void synchronize_kernel(void) -{ - synchronize_rcu(); -} - module_param(blimit, int, 0); module_param(qhimark, int, 0); module_param(qlowmark, int, 0); @@ -627,7 +632,7 @@ module_param(qlowmark, int, 0); module_param(rsinterval, int, 0); #endif EXPORT_SYMBOL_GPL(rcu_batches_completed); -EXPORT_SYMBOL_GPL_FUTURE(call_rcu); /* WARNING: GPL-only in April 2006. */ -EXPORT_SYMBOL_GPL_FUTURE(call_rcu_bh); /* WARNING: GPL-only in April 2006. */ +EXPORT_SYMBOL_GPL(rcu_batches_completed_bh); +EXPORT_SYMBOL_GPL(call_rcu); +EXPORT_SYMBOL_GPL(call_rcu_bh); EXPORT_SYMBOL_GPL(synchronize_rcu); -EXPORT_SYMBOL_GPL_FUTURE(synchronize_kernel); /* WARNING: GPL-only in April 2006. */ diff --git a/kernel/rcutorture.c b/kernel/rcutorture.c index 8154e7589..4d1c3d247 100644 --- a/kernel/rcutorture.c +++ b/kernel/rcutorture.c @@ -1,5 +1,5 @@ /* - * Read-Copy Update /proc-based torture test facility + * Read-Copy Update module-based torture test facility * * 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 @@ -53,6 +53,7 @@ static int stat_interval; /* Interval between stats, in seconds. */ static int verbose; /* Print more debug info. */ static int test_no_idle_hz; /* Test RCU's support for tickless idle CPUs. */ static int shuffle_interval = 5; /* Interval between shuffles (in sec)*/ +static char *torture_type = "rcu"; /* What to torture. */ module_param(nreaders, int, 0); MODULE_PARM_DESC(nreaders, "Number of RCU reader threads"); @@ -64,13 +65,16 @@ module_param(test_no_idle_hz, bool, 0); MODULE_PARM_DESC(test_no_idle_hz, "Test support for tickless idle CPUs"); module_param(shuffle_interval, int, 0); MODULE_PARM_DESC(shuffle_interval, "Number of seconds between shuffles"); -#define TORTURE_FLAG "rcutorture: " +module_param(torture_type, charp, 0); +MODULE_PARM_DESC(torture_type, "Type of RCU to torture (rcu, rcu_bh)"); + +#define TORTURE_FLAG "-torture:" #define PRINTK_STRING(s) \ - do { printk(KERN_ALERT TORTURE_FLAG s "\n"); } while (0) + do { printk(KERN_ALERT "%s" TORTURE_FLAG s "\n", torture_type); } while (0) #define VERBOSE_PRINTK_STRING(s) \ - do { if (verbose) printk(KERN_ALERT TORTURE_FLAG s "\n"); } while (0) + do { if (verbose) printk(KERN_ALERT "%s" TORTURE_FLAG s "\n", torture_type); } while (0) #define VERBOSE_PRINTK_ERRSTRING(s) \ - do { if (verbose) printk(KERN_ALERT TORTURE_FLAG "!!! " s "\n"); } while (0) + do { if (verbose) printk(KERN_ALERT "%s" TORTURE_FLAG "!!! " s "\n", torture_type); } while (0) static char printk_buf[4096]; @@ -139,28 +143,6 @@ rcu_torture_free(struct rcu_torture *p) spin_unlock_bh(&rcu_torture_lock); } -static void -rcu_torture_cb(struct rcu_head *p) -{ - int i; - struct rcu_torture *rp = container_of(p, struct rcu_torture, rtort_rcu); - - if (fullstop) { - /* Test is ending, just drop callbacks on the floor. */ - /* The next initialization will pick up the pieces. */ - return; - } - i = rp->rtort_pipe_count; - if (i > RCU_TORTURE_PIPE_LEN) - i = RCU_TORTURE_PIPE_LEN; - atomic_inc(&rcu_torture_wcount[i]); - if (++rp->rtort_pipe_count >= RCU_TORTURE_PIPE_LEN) { - rp->rtort_mbtest = 0; - rcu_torture_free(rp); - } else - call_rcu(p, rcu_torture_cb); -} - struct rcu_random_state { unsigned long rrs_state; unsigned long rrs_count; @@ -190,6 +172,119 @@ rcu_random(struct rcu_random_state *rrsp) return swahw32(rrsp->rrs_state); } +/* + * Operations vector for selecting different types of tests. + */ + +struct rcu_torture_ops { + void (*init)(void); + void (*cleanup)(void); + int (*readlock)(void); + void (*readunlock)(int idx); + int (*completed)(void); + void (*deferredfree)(struct rcu_torture *p); + int (*stats)(char *page); + char *name; +}; +static struct rcu_torture_ops *cur_ops = NULL; + +/* + * Definitions for rcu torture testing. + */ + +static int rcu_torture_read_lock(void) +{ + rcu_read_lock(); + return 0; +} + +static void rcu_torture_read_unlock(int idx) +{ + rcu_read_unlock(); +} + +static int rcu_torture_completed(void) +{ + return rcu_batches_completed(); +} + +static void +rcu_torture_cb(struct rcu_head *p) +{ + int i; + struct rcu_torture *rp = container_of(p, struct rcu_torture, rtort_rcu); + + if (fullstop) { + /* Test is ending, just drop callbacks on the floor. */ + /* The next initialization will pick up the pieces. */ + return; + } + i = rp->rtort_pipe_count; + if (i > RCU_TORTURE_PIPE_LEN) + i = RCU_TORTURE_PIPE_LEN; + atomic_inc(&rcu_torture_wcount[i]); + if (++rp->rtort_pipe_count >= RCU_TORTURE_PIPE_LEN) { + rp->rtort_mbtest = 0; + rcu_torture_free(rp); + } else + cur_ops->deferredfree(rp); +} + +static void rcu_torture_deferred_free(struct rcu_torture *p) +{ + call_rcu(&p->rtort_rcu, rcu_torture_cb); +} + +static struct rcu_torture_ops rcu_ops = { + .init = NULL, + .cleanup = NULL, + .readlock = rcu_torture_read_lock, + .readunlock = rcu_torture_read_unlock, + .completed = rcu_torture_completed, + .deferredfree = rcu_torture_deferred_free, + .stats = NULL, + .name = "rcu" +}; + +/* + * Definitions for rcu_bh torture testing. + */ + +static int rcu_bh_torture_read_lock(void) +{ + rcu_read_lock_bh(); + return 0; +} + +static void rcu_bh_torture_read_unlock(int idx) +{ + rcu_read_unlock_bh(); +} + +static int rcu_bh_torture_completed(void) +{ + return rcu_batches_completed_bh(); +} + +static void rcu_bh_torture_deferred_free(struct rcu_torture *p) +{ + call_rcu_bh(&p->rtort_rcu, rcu_torture_cb); +} + +static struct rcu_torture_ops rcu_bh_ops = { + .init = NULL, + .cleanup = NULL, + .readlock = rcu_bh_torture_read_lock, + .readunlock = rcu_bh_torture_read_unlock, + .completed = rcu_bh_torture_completed, + .deferredfree = rcu_bh_torture_deferred_free, + .stats = NULL, + .name = "rcu_bh" +}; + +static struct rcu_torture_ops *torture_ops[] = + { &rcu_ops, &rcu_bh_ops, NULL }; + /* * RCU torture writer kthread. Repeatedly substitutes a new structure * for that pointed to by rcu_torture_current, freeing the old structure @@ -209,8 +304,6 @@ rcu_torture_writer(void *arg) do { schedule_timeout_uninterruptible(1); - if (rcu_batches_completed() == oldbatch) - continue; if ((rp = rcu_torture_alloc()) == NULL) continue; rp->rtort_pipe_count = 0; @@ -225,10 +318,10 @@ rcu_torture_writer(void *arg) i = RCU_TORTURE_PIPE_LEN; atomic_inc(&rcu_torture_wcount[i]); old_rp->rtort_pipe_count++; - call_rcu(&old_rp->rtort_rcu, rcu_torture_cb); + cur_ops->deferredfree(old_rp); } rcu_torture_current_version++; - oldbatch = rcu_batches_completed(); + oldbatch = cur_ops->completed(); } while (!kthread_should_stop() && !fullstop); VERBOSE_PRINTK_STRING("rcu_torture_writer task stopping"); while (!kthread_should_stop()) @@ -246,6 +339,7 @@ static int rcu_torture_reader(void *arg) { int completed; + int idx; DEFINE_RCU_RANDOM(rand); struct rcu_torture *p; int pipe_count; @@ -254,12 +348,12 @@ rcu_torture_reader(void *arg) set_user_nice(current, 19); do { - rcu_read_lock(); - completed = rcu_batches_completed(); + idx = cur_ops->readlock(); + completed = cur_ops->completed(); p = rcu_dereference(rcu_torture_current); if (p == NULL) { /* Wait for rcu_torture_writer to get underway */ - rcu_read_unlock(); + cur_ops->readunlock(idx); schedule_timeout_interruptible(HZ); continue; } @@ -273,14 +367,14 @@ rcu_torture_reader(void *arg) pipe_count = RCU_TORTURE_PIPE_LEN; } ++__get_cpu_var(rcu_torture_count)[pipe_count]; - completed = rcu_batches_completed() - completed; + completed = cur_ops->completed() - completed; if (completed > RCU_TORTURE_PIPE_LEN) { /* Should not happen, but... */ completed = RCU_TORTURE_PIPE_LEN; } ++__get_cpu_var(rcu_torture_batch)[completed]; preempt_enable(); - rcu_read_unlock(); + cur_ops->readunlock(idx); schedule(); } while (!kthread_should_stop() && !fullstop); VERBOSE_PRINTK_STRING("rcu_torture_reader task stopping"); @@ -311,7 +405,7 @@ rcu_torture_printk(char *page) if (pipesummary[i] != 0) break; } - cnt += sprintf(&page[cnt], "rcutorture: "); + cnt += sprintf(&page[cnt], "%s%s ", torture_type, TORTURE_FLAG); cnt += sprintf(&page[cnt], "rtc: %p ver: %ld tfle: %d rta: %d rtaf: %d rtf: %d " "rtmbe: %d", @@ -324,7 +418,7 @@ rcu_torture_printk(char *page) atomic_read(&n_rcu_torture_mberror)); if (atomic_read(&n_rcu_torture_mberror) != 0) cnt += sprintf(&page[cnt], " !!!"); - cnt += sprintf(&page[cnt], "\nrcutorture: "); + cnt += sprintf(&page[cnt], "\n%s%s ", torture_type, TORTURE_FLAG); if (i > 1) { cnt += sprintf(&page[cnt], "!!! "); atomic_inc(&n_rcu_torture_error); @@ -332,17 +426,19 @@ rcu_torture_printk(char *page) cnt += sprintf(&page[cnt], "Reader Pipe: "); for (i = 0; i < RCU_TORTURE_PIPE_LEN + 1; i++) cnt += sprintf(&page[cnt], " %ld", pipesummary[i]); - cnt += sprintf(&page[cnt], "\nrcutorture: "); + cnt += sprintf(&page[cnt], "\n%s%s ", torture_type, TORTURE_FLAG); cnt += sprintf(&page[cnt], "Reader Batch: "); - for (i = 0; i < RCU_TORTURE_PIPE_LEN; i++) + for (i = 0; i < RCU_TORTURE_PIPE_LEN + 1; i++) cnt += sprintf(&page[cnt], " %ld", batchsummary[i]); - cnt += sprintf(&page[cnt], "\nrcutorture: "); + cnt += sprintf(&page[cnt], "\n%s%s ", torture_type, TORTURE_FLAG); cnt += sprintf(&page[cnt], "Free-Block Circulation: "); for (i = 0; i < RCU_TORTURE_PIPE_LEN + 1; i++) { cnt += sprintf(&page[cnt], " %d", atomic_read(&rcu_torture_wcount[i])); } cnt += sprintf(&page[cnt], "\n"); + if (cur_ops->stats != NULL) + cnt += cur_ops->stats(&page[cnt]); return cnt; } @@ -444,11 +540,11 @@ rcu_torture_shuffle(void *arg) static inline void rcu_torture_print_module_parms(char *tag) { - printk(KERN_ALERT TORTURE_FLAG "--- %s: nreaders=%d " + printk(KERN_ALERT "%s" TORTURE_FLAG "--- %s: nreaders=%d " "stat_interval=%d verbose=%d test_no_idle_hz=%d " "shuffle_interval = %d\n", - tag, nrealreaders, stat_interval, verbose, test_no_idle_hz, - shuffle_interval); + torture_type, tag, nrealreaders, stat_interval, verbose, + test_no_idle_hz, shuffle_interval); } static void @@ -493,6 +589,9 @@ rcu_torture_cleanup(void) rcu_barrier(); rcu_torture_stats_print(); /* -After- the stats thread is stopped! */ + + if (cur_ops->cleanup != NULL) + cur_ops->cleanup(); if (atomic_read(&n_rcu_torture_error)) rcu_torture_print_module_parms("End of test: FAILURE"); else @@ -508,6 +607,20 @@ rcu_torture_init(void) /* Process args and tell the world that the torturer is on the job. */ + for (i = 0; cur_ops = torture_ops[i], cur_ops != NULL; i++) { + cur_ops = torture_ops[i]; + if (strcmp(torture_type, cur_ops->name) == 0) { + break; + } + } + if (cur_ops == NULL) { + printk(KERN_ALERT "rcutorture: invalid torture type: \"%s\"\n", + torture_type); + return (-EINVAL); + } + if (cur_ops->init != NULL) + cur_ops->init(); /* no "goto unwind" prior to this point!!! */ + if (nreaders >= 0) nrealreaders = nreaders; else diff --git a/kernel/relay.c b/kernel/relay.c index 33345e734..85786ff2a 100644 --- a/kernel/relay.c +++ b/kernel/relay.c @@ -669,7 +669,7 @@ EXPORT_SYMBOL_GPL(relay_flush); */ static int relay_file_open(struct inode *inode, struct file *filp) { - struct rchan_buf *buf = inode->u.generic_ip; + struct rchan_buf *buf = inode->i_private; kref_get(&buf->kref); filp->private_data = buf; diff --git a/kernel/resource.c b/kernel/resource.c index e3080fcc6..46286434a 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -7,7 +7,6 @@ * Arbitrary resource management. */ -#include #include #include #include @@ -23,20 +22,18 @@ struct resource ioport_resource = { .name = "PCI IO", - .start = 0x0000, + .start = 0, .end = IO_SPACE_LIMIT, .flags = IORESOURCE_IO, }; - EXPORT_SYMBOL(ioport_resource); struct resource iomem_resource = { .name = "PCI mem", - .start = 0UL, - .end = ~0UL, + .start = 0, + .end = -1, .flags = IORESOURCE_MEM, }; - EXPORT_SYMBOL(iomem_resource); static DEFINE_RWLOCK(resource_lock); @@ -83,10 +80,10 @@ static int r_show(struct seq_file *m, void *v) for (depth = 0, p = r; depth < MAX_IORES_LEVEL; depth++, p = p->parent) if (p->parent == root) break; - seq_printf(m, "%*s%0*lx-%0*lx : %s\n", + seq_printf(m, "%*s%0*llx-%0*llx : %s\n", depth * 2, "", - width, r->start, - width, r->end, + width, (unsigned long long) r->start, + width, (unsigned long long) r->end, r->name ? r->name : ""); return 0; } @@ -151,8 +148,8 @@ __initcall(ioresources_init); /* Return the conflict entry if you can't request it */ static struct resource * __request_resource(struct resource *root, struct resource *new) { - unsigned long start = new->start; - unsigned long end = new->end; + resource_size_t start = new->start; + resource_size_t end = new->end; struct resource *tmp, **p; if (end < start) @@ -232,15 +229,55 @@ int release_resource(struct resource *old) EXPORT_SYMBOL(release_resource); +#ifdef CONFIG_MEMORY_HOTPLUG +/* + * Finds the lowest memory reosurce exists within [res->start.res->end) + * the caller must specify res->start, res->end, res->flags. + * If found, returns 0, res is overwritten, if not found, returns -1. + */ +int find_next_system_ram(struct resource *res) +{ + resource_size_t start, end; + struct resource *p; + + BUG_ON(!res); + + start = res->start; + end = res->end; + BUG_ON(start >= end); + + read_lock(&resource_lock); + for (p = iomem_resource.child; p ; p = p->sibling) { + /* system ram is just marked as IORESOURCE_MEM */ + if (p->flags != res->flags) + continue; + if (p->start > end) { + p = NULL; + break; + } + if ((p->end >= start) && (p->start < end)) + break; + } + read_unlock(&resource_lock); + if (!p) + return -1; + /* copy data */ + if (res->start < p->start) + res->start = p->start; + if (res->end > p->end) + res->end = p->end; + return 0; +} +#endif + /* * Find empty slot in the resource tree given range and alignment. */ static int find_resource(struct resource *root, struct resource *new, - unsigned long size, - unsigned long min, unsigned long max, - unsigned long align, + resource_size_t size, resource_size_t min, + resource_size_t max, resource_size_t align, void (*alignf)(void *, struct resource *, - unsigned long, unsigned long), + resource_size_t, resource_size_t), void *alignf_data) { struct resource *this = root->child; @@ -282,11 +319,10 @@ static int find_resource(struct resource *root, struct resource *new, * Allocate empty slot in the resource tree given range and alignment. */ int allocate_resource(struct resource *root, struct resource *new, - unsigned long size, - unsigned long min, unsigned long max, - unsigned long align, + resource_size_t size, resource_size_t min, + resource_size_t max, resource_size_t align, void (*alignf)(void *, struct resource *, - unsigned long, unsigned long), + resource_size_t, resource_size_t), void *alignf_data) { int err; @@ -371,17 +407,15 @@ int insert_resource(struct resource *parent, struct resource *new) return result; } -EXPORT_SYMBOL(insert_resource); - /* * Given an existing resource, change its start and size to match the * arguments. Returns -EBUSY if it can't fit. Existing children of * the resource are assumed to be immutable. */ -int adjust_resource(struct resource *res, unsigned long start, unsigned long size) +int adjust_resource(struct resource *res, resource_size_t start, resource_size_t size) { struct resource *tmp, *parent = res->parent; - unsigned long end = start + size - 1; + resource_size_t end = start + size - 1; int result = -EBUSY; write_lock(&resource_lock); @@ -428,7 +462,9 @@ EXPORT_SYMBOL(adjust_resource); * * Release-region releases a matching busy region. */ -struct resource * __request_region(struct resource *parent, unsigned long start, unsigned long n, const char *name) +struct resource * __request_region(struct resource *parent, + resource_size_t start, resource_size_t n, + const char *name) { struct resource *res = kzalloc(sizeof(*res), GFP_KERNEL); @@ -464,7 +500,8 @@ struct resource * __request_region(struct resource *parent, unsigned long start, EXPORT_SYMBOL(__request_region); -int __check_region(struct resource *parent, unsigned long start, unsigned long n) +int __check_region(struct resource *parent, resource_size_t start, + resource_size_t n) { struct resource * res; @@ -479,10 +516,11 @@ int __check_region(struct resource *parent, unsigned long start, unsigned long n EXPORT_SYMBOL(__check_region); -void __release_region(struct resource *parent, unsigned long start, unsigned long n) +void __release_region(struct resource *parent, resource_size_t start, + resource_size_t n) { struct resource **p; - unsigned long end; + resource_size_t end; p = &parent->child; end = start + n - 1; @@ -511,7 +549,9 @@ void __release_region(struct resource *parent, unsigned long start, unsigned lon write_unlock(&resource_lock); - printk(KERN_WARNING "Trying to free nonexistent resource <%08lx-%08lx>\n", start, end); + printk(KERN_WARNING "Trying to free nonexistent resource " + "<%016llx-%016llx>\n", (unsigned long long)start, + (unsigned long long)end); } EXPORT_SYMBOL(__release_region); diff --git a/kernel/sched.c b/kernel/sched.c index eeaa85844..fa5360e13 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -50,6 +51,7 @@ #include #include #include +#include #include #include @@ -171,29 +173,28 @@ */ #define SCALE_PRIO(x, prio) \ - max(x * (MAX_PRIO - prio) / (MAX_USER_PRIO/2), MIN_TIMESLICE) + max(x * (MAX_PRIO - prio) / (MAX_USER_PRIO / 2), MIN_TIMESLICE) -static unsigned int task_timeslice(task_t *p) +static unsigned int static_prio_timeslice(int static_prio) { - if (p->static_prio < NICE_TO_PRIO(0)) - return SCALE_PRIO(DEF_TIMESLICE*4, p->static_prio); + if (static_prio < NICE_TO_PRIO(0)) + return SCALE_PRIO(DEF_TIMESLICE * 4, static_prio); else - return SCALE_PRIO(DEF_TIMESLICE, p->static_prio); + return SCALE_PRIO(DEF_TIMESLICE, static_prio); +} + +static inline unsigned int task_timeslice(struct task_struct *p) +{ + return static_prio_timeslice(p->static_prio); } -#define task_hot(p, now, sd) ((long long) ((now) - (p)->last_ran) \ - < (long long) (sd)->cache_hot_time) /* * These are the runqueue data structures: */ -#define BITMAP_SIZE ((((MAX_PRIO+1+7)/8)+sizeof(long)-1)/sizeof(long)) - -typedef struct runqueue runqueue_t; - struct prio_array { unsigned int nr_active; - unsigned long bitmap[BITMAP_SIZE]; + DECLARE_BITMAP(bitmap, MAX_PRIO+1); /* include 1 bit for delimiter */ struct list_head queue[MAX_PRIO]; }; @@ -204,7 +205,7 @@ struct prio_array { * (such as the load balancing or the thread migration code), lock * acquire operations must be ordered by ascending &runqueue. */ -struct runqueue { +struct rq { spinlock_t lock; /* @@ -212,6 +213,7 @@ struct runqueue { * remote CPUs use both these fields when doing load calculation. */ unsigned long nr_running; + unsigned long raw_weighted_load; #ifdef CONFIG_SMP unsigned long cpu_load[3]; #endif @@ -227,9 +229,9 @@ struct runqueue { unsigned long expired_timestamp; unsigned long long timestamp_last_tick; - task_t *curr, *idle; + struct task_struct *curr, *idle; struct mm_struct *prev_mm; - prio_array_t *active, *expired, arrays[2]; + struct prio_array *active, *expired, arrays[2]; int best_expired_prio; atomic_t nr_iowait; @@ -239,10 +241,10 @@ struct runqueue { /* For active balancing */ int active_balance; int push_cpu; + int cpu; /* cpu of this runqueue */ - task_t *migration_thread; + struct task_struct *migration_thread; struct list_head migration_queue; - int cpu; #endif #ifdef CONFIG_VSERVER_HARDCPU struct list_head hold_queue; @@ -268,9 +270,19 @@ struct runqueue { unsigned long ttwu_cnt; unsigned long ttwu_local; #endif + struct lock_class_key rq_lock_key; }; -static DEFINE_PER_CPU(struct runqueue, runqueues); +static DEFINE_PER_CPU(struct rq, runqueues); + +static inline int cpu_of(struct rq *rq) +{ +#ifdef CONFIG_SMP + return rq->cpu; +#else + return 0; +#endif +} /* * The domain tree (rq->sd) is protected by RCU's quiescent state transition. @@ -279,8 +291,8 @@ static DEFINE_PER_CPU(struct runqueue, runqueues); * The domain tree of any CPU may only be accessed from within * preempt-disabled sections. */ -#define for_each_domain(cpu, domain) \ -for (domain = rcu_dereference(cpu_rq(cpu)->sd); domain; domain = domain->parent) +#define for_each_domain(cpu, __sd) \ + for (__sd = rcu_dereference(cpu_rq(cpu)->sd); __sd; __sd = __sd->parent) #define cpu_rq(cpu) (&per_cpu(runqueues, (cpu))) #define this_rq() (&__get_cpu_var(runqueues)) @@ -295,26 +307,33 @@ for (domain = rcu_dereference(cpu_rq(cpu)->sd); domain; domain = domain->parent) #endif #ifndef __ARCH_WANT_UNLOCKED_CTXSW -static inline int task_running(runqueue_t *rq, task_t *p) +static inline int task_running(struct rq *rq, struct task_struct *p) { return rq->curr == p; } -static inline void prepare_lock_switch(runqueue_t *rq, task_t *next) +static inline void prepare_lock_switch(struct rq *rq, struct task_struct *next) { } -static inline void finish_lock_switch(runqueue_t *rq, task_t *prev) +static inline void finish_lock_switch(struct rq *rq, struct task_struct *prev) { #ifdef CONFIG_DEBUG_SPINLOCK /* this is a valid case when another task releases the spinlock */ rq->lock.owner = current; #endif + /* + * If we are tracking spinlock dependencies then we have to + * fix up the runqueue lock - which gets 'carried over' from + * prev into current: + */ + spin_acquire(&rq->lock.dep_map, 0, 0, _THIS_IP_); + spin_unlock_irq(&rq->lock); } #else /* __ARCH_WANT_UNLOCKED_CTXSW */ -static inline int task_running(runqueue_t *rq, task_t *p) +static inline int task_running(struct rq *rq, struct task_struct *p) { #ifdef CONFIG_SMP return p->oncpu; @@ -323,7 +342,7 @@ static inline int task_running(runqueue_t *rq, task_t *p) #endif } -static inline void prepare_lock_switch(runqueue_t *rq, task_t *next) +static inline void prepare_lock_switch(struct rq *rq, struct task_struct *next) { #ifdef CONFIG_SMP /* @@ -340,7 +359,7 @@ static inline void prepare_lock_switch(runqueue_t *rq, task_t *next) #endif } -static inline void finish_lock_switch(runqueue_t *rq, task_t *prev) +static inline void finish_lock_switch(struct rq *rq, struct task_struct *prev) { #ifdef CONFIG_SMP /* @@ -357,15 +376,34 @@ static inline void finish_lock_switch(runqueue_t *rq, task_t *prev) } #endif /* __ARCH_WANT_UNLOCKED_CTXSW */ +/* + * __task_rq_lock - lock the runqueue a given task resides on. + * Must be called interrupts disabled. + */ +static inline struct rq *__task_rq_lock(struct task_struct *p) + __acquires(rq->lock) +{ + struct rq *rq; + +repeat_lock_task: + rq = task_rq(p); + spin_lock(&rq->lock); + if (unlikely(rq != task_rq(p))) { + spin_unlock(&rq->lock); + goto repeat_lock_task; + } + return rq; +} + /* * task_rq_lock - lock the runqueue a given task resides on and disable * interrupts. Note the ordering: we can safely lookup the task_rq without * explicitly disabling preemption. */ -static inline runqueue_t *task_rq_lock(task_t *p, unsigned long *flags) +static struct rq *task_rq_lock(struct task_struct *p, unsigned long *flags) __acquires(rq->lock) { - struct runqueue *rq; + struct rq *rq; repeat_lock_task: local_irq_save(*flags); @@ -378,7 +416,13 @@ repeat_lock_task: return rq; } -static inline void task_rq_unlock(runqueue_t *rq, unsigned long *flags) +static inline void __task_rq_unlock(struct rq *rq) + __releases(rq->lock) +{ + spin_unlock(&rq->lock); +} + +static inline void task_rq_unlock(struct rq *rq, unsigned long *flags) __releases(rq->lock) { spin_unlock_irqrestore(&rq->lock, *flags); @@ -398,7 +442,7 @@ static int show_schedstat(struct seq_file *seq, void *v) seq_printf(seq, "version %d\n", SCHEDSTAT_VERSION); seq_printf(seq, "timestamp %lu\n", jiffies); for_each_online_cpu(cpu) { - runqueue_t *rq = cpu_rq(cpu); + struct rq *rq = cpu_rq(cpu); #ifdef CONFIG_SMP struct sched_domain *sd; int dcnt = 0; @@ -475,9 +519,36 @@ struct file_operations proc_schedstat_operations = { .release = single_release, }; +/* + * Expects runqueue lock to be held for atomicity of update + */ +static inline void +rq_sched_info_arrive(struct rq *rq, unsigned long delta_jiffies) +{ + if (rq) { + rq->rq_sched_info.run_delay += delta_jiffies; + rq->rq_sched_info.pcnt++; + } +} + +/* + * Expects runqueue lock to be held for atomicity of update + */ +static inline void +rq_sched_info_depart(struct rq *rq, unsigned long delta_jiffies) +{ + if (rq) + rq->rq_sched_info.cpu_time += delta_jiffies; +} # define schedstat_inc(rq, field) do { (rq)->field++; } while (0) # define schedstat_add(rq, field, amt) do { (rq)->field += (amt); } while (0) #else /* !CONFIG_SCHEDSTATS */ +static inline void +rq_sched_info_arrive(struct rq *rq, unsigned long delta_jiffies) +{} +static inline void +rq_sched_info_depart(struct rq *rq, unsigned long delta_jiffies) +{} # define schedstat_inc(rq, field) do { } while (0) # define schedstat_add(rq, field, amt) do { } while (0) #endif @@ -485,10 +556,10 @@ struct file_operations proc_schedstat_operations = { /* * rq_lock - lock a given runqueue and disable interrupts. */ -static inline runqueue_t *this_rq_lock(void) +static inline struct rq *this_rq_lock(void) __acquires(rq->lock) { - runqueue_t *rq; + struct rq *rq; local_irq_disable(); rq = this_rq(); @@ -497,7 +568,7 @@ static inline runqueue_t *this_rq_lock(void) return rq; } -#ifdef CONFIG_SCHEDSTATS +#if defined(CONFIG_SCHEDSTATS) || defined(CONFIG_TASK_DELAY_ACCT) /* * Called when a process is dequeued from the active array and given * the cpu. We should note that with the exception of interactive @@ -513,7 +584,7 @@ static inline runqueue_t *this_rq_lock(void) * long it was from the *first* time it was queued to the time that it * finally hit a cpu. */ -static inline void sched_info_dequeued(task_t *t) +static inline void sched_info_dequeued(struct task_struct *t) { t->sched_info.last_queued = 0; } @@ -523,23 +594,18 @@ static inline void sched_info_dequeued(task_t *t) * long it was waiting to run. We also note when it began so that we * can keep stats on how long its timeslice is. */ -static void sched_info_arrive(task_t *t) +static void sched_info_arrive(struct task_struct *t) { - unsigned long now = jiffies, diff = 0; - struct runqueue *rq = task_rq(t); + unsigned long now = jiffies, delta_jiffies = 0; if (t->sched_info.last_queued) - diff = now - t->sched_info.last_queued; + delta_jiffies = now - t->sched_info.last_queued; sched_info_dequeued(t); - t->sched_info.run_delay += diff; + t->sched_info.run_delay += delta_jiffies; t->sched_info.last_arrival = now; t->sched_info.pcnt++; - if (!rq) - return; - - rq->rq_sched_info.run_delay += diff; - rq->rq_sched_info.pcnt++; + rq_sched_info_arrive(task_rq(t), delta_jiffies); } /* @@ -557,25 +623,23 @@ static void sched_info_arrive(task_t *t) * the timestamp if it is already not set. It's assumed that * sched_info_dequeued() will clear that stamp when appropriate. */ -static inline void sched_info_queued(task_t *t) +static inline void sched_info_queued(struct task_struct *t) { - if (!t->sched_info.last_queued) - t->sched_info.last_queued = jiffies; + if (unlikely(sched_info_on())) + if (!t->sched_info.last_queued) + t->sched_info.last_queued = jiffies; } /* * Called when a process ceases being the active-running process, either * voluntarily or involuntarily. Now we can calculate how long we ran. */ -static inline void sched_info_depart(task_t *t) +static inline void sched_info_depart(struct task_struct *t) { - struct runqueue *rq = task_rq(t); - unsigned long diff = jiffies - t->sched_info.last_arrival; + unsigned long delta_jiffies = jiffies - t->sched_info.last_arrival; - t->sched_info.cpu_time += diff; - - if (rq) - rq->rq_sched_info.cpu_time += diff; + t->sched_info.cpu_time += delta_jiffies; + rq_sched_info_depart(task_rq(t), delta_jiffies); } /* @@ -583,9 +647,10 @@ static inline void sched_info_depart(task_t *t) * their time slice. (This may also be called when switching to or from * the idle task.) We are only called when prev != next. */ -static inline void sched_info_switch(task_t *prev, task_t *next) +static inline void +__sched_info_switch(struct task_struct *prev, struct task_struct *next) { - struct runqueue *rq = task_rq(prev); + struct rq *rq = task_rq(prev); /* * prev now departs the cpu. It's not interesting to record @@ -598,15 +663,21 @@ static inline void sched_info_switch(task_t *prev, task_t *next) if (next != rq->idle) sched_info_arrive(next); } +static inline void +sched_info_switch(struct task_struct *prev, struct task_struct *next) +{ + if (unlikely(sched_info_on())) + __sched_info_switch(prev, next); +} #else #define sched_info_queued(t) do { } while (0) #define sched_info_switch(t, next) do { } while (0) -#endif /* CONFIG_SCHEDSTATS */ +#endif /* CONFIG_SCHEDSTATS || CONFIG_TASK_DELAY_ACCT */ /* * Adding/removing a task to/from a priority array: */ -static void dequeue_task(struct task_struct *p, prio_array_t *array) +static void dequeue_task(struct task_struct *p, struct prio_array *array) { BUG_ON(p->state & TASK_ONHOLD); array->nr_active--; @@ -615,7 +686,7 @@ static void dequeue_task(struct task_struct *p, prio_array_t *array) __clear_bit(p->prio, array->bitmap); } -static void enqueue_task(struct task_struct *p, prio_array_t *array) +static void enqueue_task(struct task_struct *p, struct prio_array *array) { BUG_ON(p->state & TASK_ONHOLD); sched_info_queued(p); @@ -629,13 +700,14 @@ static void enqueue_task(struct task_struct *p, prio_array_t *array) * Put task to the end of the run list without the overhead of dequeue * followed by enqueue. */ -static void requeue_task(struct task_struct *p, prio_array_t *array) +static void requeue_task(struct task_struct *p, struct prio_array *array) { BUG_ON(p->state & TASK_ONHOLD); list_move_tail(&p->run_list, array->queue + p->prio); } -static inline void enqueue_task_head(struct task_struct *p, prio_array_t *array) +static inline void +enqueue_task_head(struct task_struct *p, struct prio_array *array) { BUG_ON(p->state & TASK_ONHOLD); list_add(&p->run_list, array->queue + p->prio); @@ -645,7 +717,7 @@ static inline void enqueue_task_head(struct task_struct *p, prio_array_t *array) } /* - * effective_prio - return the priority that is based on the static + * __normal_prio - return the priority that is based on the static * priority but is modified by bonuses/penalties. * * We scale the actual sleep average [0 .... MAX_SLEEP_AVG] @@ -658,14 +730,12 @@ static inline void enqueue_task_head(struct task_struct *p, prio_array_t *array) * * Both properties are important to certain workloads. */ -static int effective_prio(task_t *p) + +static inline int __normal_prio(struct task_struct *p) { int bonus, prio; struct vx_info *vxi; - if (rt_task(p)) - return p->prio; - bonus = CURRENT_BONUS(p) - MAX_BONUS / 2; prio = p->static_prio - bonus; @@ -681,58 +751,166 @@ static int effective_prio(task_t *p) return prio; } +/* + * To aid in avoiding the subversion of "niceness" due to uneven distribution + * of tasks with abnormal "nice" values across CPUs the contribution that + * each task makes to its run queue's load is weighted according to its + * scheduling class and "nice" value. For SCHED_NORMAL tasks this is just a + * scaled version of the new time slice allocation that they receive on time + * slice expiry etc. + */ + +/* + * Assume: static_prio_timeslice(NICE_TO_PRIO(0)) == DEF_TIMESLICE + * If static_prio_timeslice() is ever changed to break this assumption then + * this code will need modification + */ +#define TIME_SLICE_NICE_ZERO DEF_TIMESLICE +#define LOAD_WEIGHT(lp) \ + (((lp) * SCHED_LOAD_SCALE) / TIME_SLICE_NICE_ZERO) +#define PRIO_TO_LOAD_WEIGHT(prio) \ + LOAD_WEIGHT(static_prio_timeslice(prio)) +#define RTPRIO_TO_LOAD_WEIGHT(rp) \ + (PRIO_TO_LOAD_WEIGHT(MAX_RT_PRIO) + LOAD_WEIGHT(rp)) + +static void set_load_weight(struct task_struct *p) +{ + if (has_rt_policy(p)) { +#ifdef CONFIG_SMP + if (p == task_rq(p)->migration_thread) + /* + * The migration thread does the actual balancing. + * Giving its load any weight will skew balancing + * adversely. + */ + p->load_weight = 0; + else +#endif + p->load_weight = RTPRIO_TO_LOAD_WEIGHT(p->rt_priority); + } else + p->load_weight = PRIO_TO_LOAD_WEIGHT(p->static_prio); +} + +static inline void +inc_raw_weighted_load(struct rq *rq, const struct task_struct *p) +{ + rq->raw_weighted_load += p->load_weight; +} + +static inline void +dec_raw_weighted_load(struct rq *rq, const struct task_struct *p) +{ + rq->raw_weighted_load -= p->load_weight; +} + +static inline void inc_nr_running(struct task_struct *p, struct rq *rq) +{ + rq->nr_running++; + inc_raw_weighted_load(rq, p); +} + +static inline void dec_nr_running(struct task_struct *p, struct rq *rq) +{ + rq->nr_running--; + dec_raw_weighted_load(rq, p); +} + +/* + * Calculate the expected normal priority: i.e. priority + * without taking RT-inheritance into account. Might be + * boosted by interactivity modifiers. Changes upon fork, + * setprio syscalls, and whenever the interactivity + * estimator recalculates. + */ +static inline int normal_prio(struct task_struct *p) +{ + int prio; + + if (has_rt_policy(p)) + prio = MAX_RT_PRIO-1 - p->rt_priority; + else + prio = __normal_prio(p); + return prio; +} + +/* + * Calculate the current priority, i.e. the priority + * taken into account by the scheduler. This value might + * be boosted by RT tasks, or might be boosted by + * interactivity modifiers. Will be RT if the task got + * RT-boosted. If not then it returns p->normal_prio. + */ +static int effective_prio(struct task_struct *p) +{ + p->normal_prio = normal_prio(p); + /* + * If we are RT tasks or we were boosted to RT priority, + * keep the priority unchanged. Otherwise, update priority + * to the normal priority: + */ + if (!rt_prio(p->prio)) + return p->normal_prio; + return p->prio; +} + /* * __activate_task - move a task to the runqueue. */ -static void __activate_task(task_t *p, runqueue_t *rq) +static void __activate_task(struct task_struct *p, struct rq *rq) { - prio_array_t *target = rq->active; + struct prio_array *target = rq->active; if (batch_task(p)) target = rq->expired; enqueue_task(p, target); - rq->nr_running++; + inc_nr_running(p, rq); } /* * __activate_idle_task - move idle task to the _front_ of runqueue. */ -static inline void __activate_idle_task(task_t *p, runqueue_t *rq) +static inline void __activate_idle_task(struct task_struct *p, struct rq *rq) { enqueue_task_head(p, rq->active); - rq->nr_running++; + inc_nr_running(p, rq); } -static int recalc_task_prio(task_t *p, unsigned long long now) +/* + * Recalculate p->normal_prio and p->prio after having slept, + * updating the sleep-average too: + */ +static int recalc_task_prio(struct task_struct *p, unsigned long long now) { /* Caller must always ensure 'now >= p->timestamp' */ - unsigned long long __sleep_time = now - p->timestamp; - unsigned long sleep_time; + unsigned long sleep_time = now - p->timestamp; if (batch_task(p)) sleep_time = 0; - else { - if (__sleep_time > NS_MAX_SLEEP_AVG) - sleep_time = NS_MAX_SLEEP_AVG; - else - sleep_time = (unsigned long)__sleep_time; - } if (likely(sleep_time > 0)) { /* - * User tasks that sleep a long time are categorised as - * idle. They will only have their sleep_avg increased to a - * level that makes them just interactive priority to stay - * active yet prevent them suddenly becoming cpu hogs and - * starving other processes. + * This ceiling is set to the lowest priority that would allow + * a task to be reinserted into the active array on timeslice + * completion. */ - if (p->mm && sleep_time > INTERACTIVE_SLEEP(p)) { - unsigned long ceiling; + unsigned long ceiling = INTERACTIVE_SLEEP(p); - ceiling = JIFFIES_TO_NS(MAX_SLEEP_AVG - - DEF_TIMESLICE); - if (p->sleep_avg < ceiling) - p->sleep_avg = ceiling; + if (p->mm && sleep_time > ceiling && p->sleep_avg < ceiling) { + /* + * Prevents user tasks from achieving best priority + * with one single large enough sleep. + */ + p->sleep_avg = ceiling; + /* + * Using INTERACTIVE_SLEEP() as a ceiling places a + * nice(0) task 1ms sleep away from promotion, and + * gives it 700ms to round-robin with no chance of + * being demoted. This is more than generous, so + * mark this sleep as non-interactive to prevent the + * on-runqueue bonus logic from intervening should + * this task not receive cpu immediately. + */ + p->sleep_type = SLEEP_NONINTERACTIVE; } else { /* * Tasks waking from uninterruptible sleep are @@ -740,12 +918,12 @@ static int recalc_task_prio(task_t *p, unsigned long long now) * are likely to be waiting on I/O */ if (p->sleep_type == SLEEP_NONINTERACTIVE && p->mm) { - if (p->sleep_avg >= INTERACTIVE_SLEEP(p)) + if (p->sleep_avg >= ceiling) sleep_time = 0; else if (p->sleep_avg + sleep_time >= - INTERACTIVE_SLEEP(p)) { - p->sleep_avg = INTERACTIVE_SLEEP(p); - sleep_time = 0; + ceiling) { + p->sleep_avg = ceiling; + sleep_time = 0; } } @@ -759,9 +937,9 @@ static int recalc_task_prio(task_t *p, unsigned long long now) */ p->sleep_avg += sleep_time; - if (p->sleep_avg > NS_MAX_SLEEP_AVG) - p->sleep_avg = NS_MAX_SLEEP_AVG; } + if (p->sleep_avg > NS_MAX_SLEEP_AVG) + p->sleep_avg = NS_MAX_SLEEP_AVG; } return effective_prio(p); @@ -773,7 +951,7 @@ static int recalc_task_prio(task_t *p, unsigned long long now) * Update all the scheduling statistics stuff. (sleep average * calculation, priority modifiers, etc.) */ -static void activate_task(task_t *p, runqueue_t *rq, int local) +static void activate_task(struct task_struct *p, struct rq *rq, int local) { unsigned long long now; @@ -781,7 +959,7 @@ static void activate_task(task_t *p, runqueue_t *rq, int local) #ifdef CONFIG_SMP if (!local) { /* Compensate for drifting sched_clock */ - runqueue_t *this_rq = this_rq(); + struct rq *this_rq = this_rq(); now = (now - this_rq->timestamp_last_tick) + rq->timestamp_last_tick; } @@ -821,15 +999,15 @@ static void activate_task(task_t *p, runqueue_t *rq, int local) /* * deactivate_task - remove a task from the runqueue. */ -static void __deactivate_task(struct task_struct *p, runqueue_t *rq) +static void __deactivate_task(struct task_struct *p, struct rq *rq) { - rq->nr_running--; + dec_nr_running(p, rq); dequeue_task(p, p->array); p->array = NULL; } static inline -void deactivate_task(struct task_struct *p, runqueue_t *rq) +void deactivate_task(struct task_struct *p, struct rq *rq) { vx_deactivate_task(p); __deactivate_task(p, rq); @@ -842,7 +1020,7 @@ void deactivate_task(struct task_struct *p, runqueue_t *rq) */ static inline void vx_hold_task(struct vx_info *vxi, - struct task_struct *p, runqueue_t *rq) + struct task_struct *p, struct rq *rq) { __deactivate_task(p, rq); p->state |= TASK_ONHOLD; @@ -856,14 +1034,14 @@ void vx_hold_task(struct vx_info *vxi, */ static inline void vx_unhold_task(struct vx_info *vxi, - struct task_struct *p, runqueue_t *rq) + struct task_struct *p, struct rq *rq) { list_del(&p->run_list); /* one less waiting */ vx_onhold_dec(vxi); p->state &= ~TASK_ONHOLD; enqueue_task(p, rq->expired); - rq->nr_running++; + inc_nr_running(p, rq); if (p->static_prio < rq->best_expired_prio) rq->best_expired_prio = p->static_prio; @@ -871,14 +1049,14 @@ void vx_unhold_task(struct vx_info *vxi, #else static inline void vx_hold_task(struct vx_info *vxi, - struct task_struct *p, runqueue_t *rq) + struct task_struct *p, struct rq *rq) { return; } static inline void vx_unhold_task(struct vx_info *vxi, - struct task_struct *p, runqueue_t *rq) + struct task_struct *p, struct rq *rq) { return; } @@ -893,7 +1071,12 @@ void vx_unhold_task(struct vx_info *vxi, * the target CPU. */ #ifdef CONFIG_SMP -static void resched_task(task_t *p) + +#ifndef tsk_is_polling +#define tsk_is_polling(t) test_tsk_thread_flag(t, TIF_POLLING_NRFLAG) +#endif + +static void resched_task(struct task_struct *p) { int cpu; @@ -908,13 +1091,13 @@ static void resched_task(task_t *p) if (cpu == smp_processor_id()) return; - /* NEED_RESCHED must be visible before we test POLLING_NRFLAG */ + /* NEED_RESCHED must be visible before we test polling */ smp_mb(); - if (!test_tsk_thread_flag(p, TIF_POLLING_NRFLAG)) + if (!tsk_is_polling(p)) smp_send_reschedule(cpu); } #else -static inline void resched_task(task_t *p) +static inline void resched_task(struct task_struct *p) { assert_spin_locked(&task_rq(p)->lock); set_tsk_need_resched(p); @@ -925,28 +1108,35 @@ static inline void resched_task(task_t *p) * task_curr - is this task currently executing on a CPU? * @p: the task in question. */ -inline int task_curr(const task_t *p) +inline int task_curr(const struct task_struct *p) { return cpu_curr(task_cpu(p)) == p; } +/* Used instead of source_load when we know the type == 0 */ +unsigned long weighted_cpuload(const int cpu) +{ + return cpu_rq(cpu)->raw_weighted_load; +} + #ifdef CONFIG_SMP -typedef struct { +struct migration_req { struct list_head list; - task_t *task; + struct task_struct *task; int dest_cpu; struct completion done; -} migration_req_t; +}; /* * The task's runqueue lock must be held. * Returns true if you have to wait for migration thread. */ -static int migrate_task(task_t *p, int dest_cpu, migration_req_t *req) +static int +migrate_task(struct task_struct *p, int dest_cpu, struct migration_req *req) { - runqueue_t *rq = task_rq(p); + struct rq *rq = task_rq(p); /* * If the task is not on a runqueue (and not running), then @@ -961,6 +1151,7 @@ static int migrate_task(task_t *p, int dest_cpu, migration_req_t *req) req->task = p; req->dest_cpu = dest_cpu; list_add(&req->list, &rq->migration_queue); + return 1; } @@ -973,10 +1164,10 @@ static int migrate_task(task_t *p, int dest_cpu, migration_req_t *req) * smp_call_function() if an IPI is sent by the same process we are * waiting to become inactive. */ -void wait_task_inactive(task_t *p) +void wait_task_inactive(struct task_struct *p) { unsigned long flags; - runqueue_t *rq; + struct rq *rq; int preempted; repeat: @@ -1007,7 +1198,7 @@ repeat: * to another CPU then no harm is done and the purpose has been * achieved as well. */ -void kick_process(task_t *p) +void kick_process(struct task_struct *p) { int cpu; @@ -1019,32 +1210,45 @@ void kick_process(task_t *p) } /* - * Return a low guess at the load of a migration-source cpu. + * Return a low guess at the load of a migration-source cpu weighted + * according to the scheduling class and "nice" value. * * We want to under-estimate the load of migration sources, to * balance conservatively. */ static inline unsigned long source_load(int cpu, int type) { - runqueue_t *rq = cpu_rq(cpu); - unsigned long load_now = rq->nr_running * SCHED_LOAD_SCALE; + struct rq *rq = cpu_rq(cpu); + if (type == 0) - return load_now; + return rq->raw_weighted_load; - return min(rq->cpu_load[type-1], load_now); + return min(rq->cpu_load[type-1], rq->raw_weighted_load); } /* - * Return a high guess at the load of a migration-target cpu + * Return a high guess at the load of a migration-target cpu weighted + * according to the scheduling class and "nice" value. */ static inline unsigned long target_load(int cpu, int type) { - runqueue_t *rq = cpu_rq(cpu); - unsigned long load_now = rq->nr_running * SCHED_LOAD_SCALE; + struct rq *rq = cpu_rq(cpu); + if (type == 0) - return load_now; + return rq->raw_weighted_load; + + return max(rq->cpu_load[type-1], rq->raw_weighted_load); +} + +/* + * Return the average load per task on the cpu's run queue + */ +static inline unsigned long cpu_avg_load_per_task(int cpu) +{ + struct rq *rq = cpu_rq(cpu); + unsigned long n = rq->nr_running; - return max(rq->cpu_load[type-1], load_now); + return n ? rq->raw_weighted_load / n : SCHED_LOAD_SCALE; } /* @@ -1117,7 +1321,7 @@ find_idlest_cpu(struct sched_group *group, struct task_struct *p, int this_cpu) cpus_and(tmp, group->cpumask, p->cpus_allowed); for_each_cpu_mask(i, tmp) { - load = source_load(i, 0); + load = weighted_cpuload(i); if (load < min_load || (load == min_load && i == this_cpu)) { min_load = load; @@ -1144,9 +1348,15 @@ static int sched_balance_self(int cpu, int flag) struct task_struct *t = current; struct sched_domain *tmp, *sd = NULL; - for_each_domain(cpu, tmp) + for_each_domain(cpu, tmp) { + /* + * If power savings logic is enabled for a domain, stop there. + */ + if (tmp->flags & SD_POWERSAVINGS_BALANCE) + break; if (tmp->flags & flag) sd = tmp; + } while (sd) { cpumask_t span; @@ -1191,7 +1401,7 @@ nextlevel: * Returns the CPU we should wake onto. */ #if defined(ARCH_HAS_SCHED_WAKE_IDLE) -static int wake_idle(int cpu, task_t *p) +static int wake_idle(int cpu, struct task_struct *p) { cpumask_t tmp; struct sched_domain *sd; @@ -1214,7 +1424,7 @@ static int wake_idle(int cpu, task_t *p) return cpu; } #else -static inline int wake_idle(int cpu, task_t *p) +static inline int wake_idle(int cpu, struct task_struct *p) { return cpu; } @@ -1234,15 +1444,15 @@ static inline int wake_idle(int cpu, task_t *p) * * returns failure only if the task is already active. */ -static int try_to_wake_up(task_t *p, unsigned int state, int sync) +static int try_to_wake_up(struct task_struct *p, unsigned int state, int sync) { int cpu, this_cpu, success = 0; unsigned long flags; long old_state; - runqueue_t *rq; + struct rq *rq; #ifdef CONFIG_SMP - unsigned long load, this_load; struct sched_domain *sd, *this_sd = NULL; + unsigned long load, this_load; int new_cpu; #endif @@ -1302,17 +1512,19 @@ static int try_to_wake_up(task_t *p, unsigned int state, int sync) if (this_sd->flags & SD_WAKE_AFFINE) { unsigned long tl = this_load; + unsigned long tl_per_task = cpu_avg_load_per_task(this_cpu); + /* * If sync wakeup then subtract the (maximum possible) * effect of the currently running task from the load * of the current CPU: */ if (sync) - tl -= SCHED_LOAD_SCALE; + tl -= current->load_weight; if ((tl <= load && - tl + target_load(cpu, idx) <= SCHED_LOAD_SCALE) || - 100*(tl + SCHED_LOAD_SCALE) <= imbalance*load) { + tl + target_load(cpu, idx) <= tl_per_task) || + 100*(tl + p->load_weight) <= imbalance*load) { /* * This domain has SD_WAKE_AFFINE and * p is cache cold in this domain, and @@ -1397,15 +1609,14 @@ out: return success; } -int fastcall wake_up_process(task_t *p) +int fastcall wake_up_process(struct task_struct *p) { return try_to_wake_up(p, TASK_STOPPED | TASK_TRACED | TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE, 0); } - EXPORT_SYMBOL(wake_up_process); -int fastcall wake_up_state(task_t *p, unsigned int state) +int fastcall wake_up_state(struct task_struct *p, unsigned int state) { return try_to_wake_up(p, state, 0); } @@ -1414,7 +1625,7 @@ int fastcall wake_up_state(task_t *p, unsigned int state) * Perform scheduler related setup for a newly forked process p. * p is forked by current. */ -void fastcall sched_fork(task_t *p, int clone_flags) +void fastcall sched_fork(struct task_struct *p, int clone_flags) { int cpu = get_cpu(); @@ -1430,10 +1641,17 @@ void fastcall sched_fork(task_t *p, int clone_flags) * event cannot wake it up and insert it on the runqueue either. */ p->state = TASK_RUNNING; + + /* + * Make sure we do not leak PI boosting priority to the child: + */ + p->prio = current->normal_prio; + INIT_LIST_HEAD(&p->run_list); p->array = NULL; -#ifdef CONFIG_SCHEDSTATS - memset(&p->sched_info, 0, sizeof(p->sched_info)); +#if defined(CONFIG_SCHEDSTATS) || defined(CONFIG_TASK_DELAY_ACCT) + if (unlikely(sched_info_on())) + memset(&p->sched_info, 0, sizeof(p->sched_info)); #endif #if defined(CONFIG_SMP) && defined(__ARCH_WANT_UNLOCKED_CTXSW) p->oncpu = 0; @@ -1476,11 +1694,11 @@ void fastcall sched_fork(task_t *p, int clone_flags) * that must be done for every newly created context, then puts the task * on the runqueue and wakes it. */ -void fastcall wake_up_new_task(task_t *p, unsigned long clone_flags) +void fastcall wake_up_new_task(struct task_struct *p, unsigned long clone_flags) { + struct rq *rq, *this_rq; unsigned long flags; int this_cpu, cpu; - runqueue_t *rq, *this_rq; rq = task_rq_lock(p, &flags); BUG_ON(p->state != TASK_RUNNING); @@ -1511,10 +1729,11 @@ void fastcall wake_up_new_task(task_t *p, unsigned long clone_flags) else { p->prio = current->prio; BUG_ON(p->state & TASK_ONHOLD); + p->normal_prio = current->normal_prio; list_add_tail(&p->run_list, ¤t->run_list); p->array = current->array; p->array->nr_active++; - rq->nr_running++; + inc_nr_running(p, rq); } set_need_resched(); } else @@ -1561,10 +1780,10 @@ void fastcall wake_up_new_task(task_t *p, unsigned long clone_flags) * artificially, because any timeslice recovered here * was given away by the parent in the first place.) */ -void fastcall sched_exit(task_t *p) +void fastcall sched_exit(struct task_struct *p) { unsigned long flags; - runqueue_t *rq; + struct rq *rq; /* * If the child was a (relative-) CPU hog then decrease @@ -1595,7 +1814,7 @@ void fastcall sched_exit(task_t *p) * prepare_task_switch sets up locking and calls architecture specific * hooks. */ -static inline void prepare_task_switch(runqueue_t *rq, task_t *next) +static inline void prepare_task_switch(struct rq *rq, struct task_struct *next) { prepare_lock_switch(rq, next); prepare_arch_switch(next); @@ -1616,7 +1835,7 @@ static inline void prepare_task_switch(runqueue_t *rq, task_t *next) * with the lock held can cause deadlocks; see schedule() for * details.) */ -static inline void finish_task_switch(runqueue_t *rq, task_t *prev) +static inline void finish_task_switch(struct rq *rq, struct task_struct *prev) __releases(rq->lock) { struct mm_struct *mm = rq->prev_mm; @@ -1654,10 +1873,11 @@ static inline void finish_task_switch(runqueue_t *rq, task_t *prev) * schedule_tail - first thing a freshly forked thread must call. * @prev: the thread we just switched away from. */ -asmlinkage void schedule_tail(task_t *prev) +asmlinkage void schedule_tail(struct task_struct *prev) __releases(rq->lock) { - runqueue_t *rq = this_rq(); + struct rq *rq = this_rq(); + finish_task_switch(rq, prev); #ifdef __ARCH_WANT_UNLOCKED_CTXSW /* In this case, finish_task_switch does not reenable preemption */ @@ -1671,8 +1891,9 @@ asmlinkage void schedule_tail(task_t *prev) * context_switch - switch to the new MM and the new * thread's register state. */ -static inline -task_t * context_switch(runqueue_t *rq, task_t *prev, task_t *next) +static inline struct task_struct * +context_switch(struct rq *rq, struct task_struct *prev, + struct task_struct *next) { struct mm_struct *mm = next->mm; struct mm_struct *oldmm = prev->active_mm; @@ -1689,6 +1910,15 @@ task_t * context_switch(runqueue_t *rq, task_t *prev, task_t *next) WARN_ON(rq->prev_mm); rq->prev_mm = oldmm; } + /* + * Since the runqueue lock will be released by the next + * task (which is an invalid locking op but in the case + * of the scheduler it's an obvious special-case), so we + * do an early lockdep release here: + */ +#ifndef __ARCH_WANT_UNLOCKED_CTXSW + spin_release(&rq->lock.dep_map, 1, _THIS_IP_); +#endif /* Here we just switch the register state and the stack. */ switch_to(prev, next, prev); @@ -1732,7 +1962,8 @@ unsigned long nr_uninterruptible(void) unsigned long long nr_context_switches(void) { - unsigned long long i, sum = 0; + int i; + unsigned long long sum = 0; for_each_possible_cpu(i) sum += cpu_rq(i)->nr_switches; @@ -1767,16 +1998,22 @@ unsigned long nr_active(void) #ifdef CONFIG_SMP +/* + * Is this task likely cache-hot: + */ +static inline int +task_hot(struct task_struct *p, unsigned long long now, struct sched_domain *sd) +{ + return (long long)(now - p->last_ran) < (long long)sd->cache_hot_time; +} + /* * double_rq_lock - safely lock two runqueues * - * We must take them in cpu order to match code in - * dependent_sleeper and wake_dependent_sleeper. - * * Note this does not disable interrupts like task_rq_lock, * you need to do so manually before calling. */ -static void double_rq_lock(runqueue_t *rq1, runqueue_t *rq2) +static void double_rq_lock(struct rq *rq1, struct rq *rq2) __acquires(rq1->lock) __acquires(rq2->lock) { @@ -1784,7 +2021,7 @@ static void double_rq_lock(runqueue_t *rq1, runqueue_t *rq2) spin_lock(&rq1->lock); __acquire(rq2->lock); /* Fake it out ;) */ } else { - if (rq1->cpu < rq2->cpu) { + if (rq1 < rq2) { spin_lock(&rq1->lock); spin_lock(&rq2->lock); } else { @@ -1800,7 +2037,7 @@ static void double_rq_lock(runqueue_t *rq1, runqueue_t *rq2) * Note this does not restore interrupts like task_rq_unlock, * you need to do so manually after calling. */ -static void double_rq_unlock(runqueue_t *rq1, runqueue_t *rq2) +static void double_rq_unlock(struct rq *rq1, struct rq *rq2) __releases(rq1->lock) __releases(rq2->lock) { @@ -1814,13 +2051,13 @@ static void double_rq_unlock(runqueue_t *rq1, runqueue_t *rq2) /* * double_lock_balance - lock the busiest runqueue, this_rq is locked already. */ -static void double_lock_balance(runqueue_t *this_rq, runqueue_t *busiest) +static void double_lock_balance(struct rq *this_rq, struct rq *busiest) __releases(this_rq->lock) __acquires(busiest->lock) __acquires(this_rq->lock) { if (unlikely(!spin_trylock(&busiest->lock))) { - if (busiest->cpu < this_rq->cpu) { + if (busiest < this_rq) { spin_unlock(&this_rq->lock); spin_lock(&busiest->lock); spin_lock(&this_rq->lock); @@ -1835,11 +2072,11 @@ static void double_lock_balance(runqueue_t *this_rq, runqueue_t *busiest) * allow dest_cpu, which will force the cpu onto dest_cpu. Then * the cpu_allowed mask is restored. */ -static void sched_migrate_task(task_t *p, int dest_cpu) +static void sched_migrate_task(struct task_struct *p, int dest_cpu) { - migration_req_t req; - runqueue_t *rq; + struct migration_req req; unsigned long flags; + struct rq *rq; rq = task_rq_lock(p, &flags); if (!cpu_isset(dest_cpu, p->cpus_allowed) @@ -1850,11 +2087,13 @@ static void sched_migrate_task(task_t *p, int dest_cpu) if (migrate_task(p, dest_cpu, &req)) { /* Need to wait for migration thread (might exit: take ref). */ struct task_struct *mt = rq->migration_thread; + get_task_struct(mt); task_rq_unlock(rq, &flags); wake_up_process(mt); put_task_struct(mt); wait_for_completion(&req.done); + return; } out: @@ -1878,14 +2117,14 @@ void sched_exec(void) * pull_task - move a task from a remote runqueue to the local runqueue. * Both runqueues must be locked. */ -static -void pull_task(runqueue_t *src_rq, prio_array_t *src_array, task_t *p, - runqueue_t *this_rq, prio_array_t *this_array, int this_cpu) +static void pull_task(struct rq *src_rq, struct prio_array *src_array, + struct task_struct *p, struct rq *this_rq, + struct prio_array *this_array, int this_cpu) { dequeue_task(p, src_array); - src_rq->nr_running--; + dec_nr_running(p, src_rq); set_task_cpu(p, this_cpu); - this_rq->nr_running++; + inc_nr_running(p, this_rq); enqueue_task(p, this_array); p->timestamp = (p->timestamp - src_rq->timestamp_last_tick) + this_rq->timestamp_last_tick; @@ -1901,7 +2140,7 @@ void pull_task(runqueue_t *src_rq, prio_array_t *src_array, task_t *p, * can_migrate_task - may task p from runqueue rq be migrated to this_cpu? */ static -int can_migrate_task(task_t *p, runqueue_t *rq, int this_cpu, +int can_migrate_task(struct task_struct *p, struct rq *rq, int this_cpu, struct sched_domain *sd, enum idle_type idle, int *all_pinned) { @@ -1932,26 +2171,42 @@ int can_migrate_task(task_t *p, runqueue_t *rq, int this_cpu, return 1; } +#define rq_best_prio(rq) min((rq)->curr->prio, (rq)->best_expired_prio) + /* - * move_tasks tries to move up to max_nr_move tasks from busiest to this_rq, - * as part of a balancing operation within "domain". Returns the number of - * tasks moved. + * move_tasks tries to move up to max_nr_move tasks and max_load_move weighted + * load from busiest to this_rq, as part of a balancing operation within + * "domain". Returns the number of tasks moved. * * Called with both runqueues locked. */ -static int move_tasks(runqueue_t *this_rq, int this_cpu, runqueue_t *busiest, - unsigned long max_nr_move, struct sched_domain *sd, - enum idle_type idle, int *all_pinned) +static int move_tasks(struct rq *this_rq, int this_cpu, struct rq *busiest, + unsigned long max_nr_move, unsigned long max_load_move, + struct sched_domain *sd, enum idle_type idle, + int *all_pinned) { - prio_array_t *array, *dst_array; + int idx, pulled = 0, pinned = 0, this_best_prio, best_prio, + best_prio_seen, skip_for_load; + struct prio_array *array, *dst_array; struct list_head *head, *curr; - int idx, pulled = 0, pinned = 0; - task_t *tmp; + struct task_struct *tmp; + long rem_load_move; - if (max_nr_move == 0) + if (max_nr_move == 0 || max_load_move == 0) goto out; + rem_load_move = max_load_move; pinned = 1; + this_best_prio = rq_best_prio(this_rq); + best_prio = rq_best_prio(busiest); + /* + * Enable handling of the case where there is more than one task + * with the best priority. If the current running task is one + * of those with prio==best_prio we know it won't be moved + * and therefore it's safe to override the skip (based on load) of + * any task we find with that prio. + */ + best_prio_seen = best_prio == busiest->curr->prio; /* * We first consider expired tasks. Those will likely not be @@ -1987,11 +2242,22 @@ skip_bitmap: head = array->queue + idx; curr = head->prev; skip_queue: - tmp = list_entry(curr, task_t, run_list); + tmp = list_entry(curr, struct task_struct, run_list); curr = curr->prev; - if (!can_migrate_task(tmp, busiest, this_cpu, sd, idle, &pinned)) { + /* + * To help distribute high priority tasks accross CPUs we don't + * skip a task if it will be the highest priority task (i.e. smallest + * prio value) on its new queue regardless of its load weight + */ + skip_for_load = tmp->load_weight > rem_load_move; + if (skip_for_load && idx < this_best_prio) + skip_for_load = !best_prio_seen && idx == best_prio; + if (skip_for_load || + !can_migrate_task(tmp, busiest, this_cpu, sd, idle, &pinned)) { + + best_prio_seen |= idx == best_prio; if (curr != head) goto skip_queue; idx++; @@ -2005,9 +2271,15 @@ skip_queue: pull_task(busiest, array, tmp, this_rq, dst_array, this_cpu); pulled++; + rem_load_move -= tmp->load_weight; - /* We only want to steal up to the prescribed number of tasks. */ - if (pulled < max_nr_move) { + /* + * We only want to steal up to the prescribed number of tasks + * and the prescribed amount of weighted load. + */ + if (pulled < max_nr_move && rem_load_move > 0) { + if (idx < this_best_prio) + this_best_prio = idx; if (curr != head) goto skip_queue; idx++; @@ -2028,19 +2300,30 @@ out: /* * find_busiest_group finds and returns the busiest CPU group within the - * domain. It calculates and returns the number of tasks which should be - * moved to restore balance via the imbalance parameter. + * domain. It calculates and returns the amount of weighted load which + * should be moved to restore balance via the imbalance parameter. */ static struct sched_group * find_busiest_group(struct sched_domain *sd, int this_cpu, - unsigned long *imbalance, enum idle_type idle, int *sd_idle) + unsigned long *imbalance, enum idle_type idle, int *sd_idle, + cpumask_t *cpus) { struct sched_group *busiest = NULL, *this = NULL, *group = sd->groups; unsigned long max_load, avg_load, total_load, this_load, total_pwr; unsigned long max_pull; + unsigned long busiest_load_per_task, busiest_nr_running; + unsigned long this_load_per_task, this_nr_running; int load_idx; +#if defined(CONFIG_SCHED_MC) || defined(CONFIG_SCHED_SMT) + int power_savings_balance = 1; + unsigned long leader_nr_running = 0, min_load_per_task = 0; + unsigned long min_nr_running = ULONG_MAX; + struct sched_group *group_min = NULL, *group_leader = NULL; +#endif max_load = this_load = total_load = total_pwr = 0; + busiest_load_per_task = busiest_nr_running = 0; + this_load_per_task = this_nr_running = 0; if (idle == NOT_IDLE) load_idx = sd->busy_idx; else if (idle == NEWLY_IDLE) @@ -2049,16 +2332,24 @@ find_busiest_group(struct sched_domain *sd, int this_cpu, load_idx = sd->idle_idx; do { - unsigned long load; + unsigned long load, group_capacity; int local_group; int i; + unsigned long sum_nr_running, sum_weighted_load; local_group = cpu_isset(this_cpu, group->cpumask); /* Tally up the load of all CPUs in the group */ - avg_load = 0; + sum_weighted_load = sum_nr_running = avg_load = 0; for_each_cpu_mask(i, group->cpumask) { + struct rq *rq; + + if (!cpu_isset(i, *cpus)) + continue; + + rq = cpu_rq(i); + if (*sd_idle && !idle_cpu(i)) *sd_idle = 0; @@ -2069,6 +2360,8 @@ find_busiest_group(struct sched_domain *sd, int this_cpu, load = source_load(i, load_idx); avg_load += load; + sum_nr_running += rq->nr_running; + sum_weighted_load += rq->raw_weighted_load; } total_load += avg_load; @@ -2077,17 +2370,80 @@ find_busiest_group(struct sched_domain *sd, int this_cpu, /* Adjust by relative CPU power of the group */ avg_load = (avg_load * SCHED_LOAD_SCALE) / group->cpu_power; + group_capacity = group->cpu_power / SCHED_LOAD_SCALE; + if (local_group) { this_load = avg_load; this = group; - } else if (avg_load > max_load) { + this_nr_running = sum_nr_running; + this_load_per_task = sum_weighted_load; + } else if (avg_load > max_load && + sum_nr_running > group_capacity) { max_load = avg_load; busiest = group; + busiest_nr_running = sum_nr_running; + busiest_load_per_task = sum_weighted_load; + } + +#if defined(CONFIG_SCHED_MC) || defined(CONFIG_SCHED_SMT) + /* + * Busy processors will not participate in power savings + * balance. + */ + if (idle == NOT_IDLE || !(sd->flags & SD_POWERSAVINGS_BALANCE)) + goto group_next; + + /* + * If the local group is idle or completely loaded + * no need to do power savings balance at this domain + */ + if (local_group && (this_nr_running >= group_capacity || + !this_nr_running)) + power_savings_balance = 0; + + /* + * If a group is already running at full capacity or idle, + * don't include that group in power savings calculations + */ + if (!power_savings_balance || sum_nr_running >= group_capacity + || !sum_nr_running) + goto group_next; + + /* + * Calculate the group which has the least non-idle load. + * This is the group from where we need to pick up the load + * for saving power + */ + if ((sum_nr_running < min_nr_running) || + (sum_nr_running == min_nr_running && + first_cpu(group->cpumask) < + first_cpu(group_min->cpumask))) { + group_min = group; + min_nr_running = sum_nr_running; + min_load_per_task = sum_weighted_load / + sum_nr_running; + } + + /* + * Calculate the group which is almost near its + * capacity but still has some space to pick up some load + * from other group and save more power + */ + if (sum_nr_running <= group_capacity - 1) { + if (sum_nr_running > leader_nr_running || + (sum_nr_running == leader_nr_running && + first_cpu(group->cpumask) > + first_cpu(group_leader->cpumask))) { + group_leader = group; + leader_nr_running = sum_nr_running; + } } +group_next: +#endif group = group->next; } while (group != sd->groups); - if (!busiest || this_load >= max_load || max_load <= SCHED_LOAD_SCALE) + if (!busiest || this_load >= max_load || busiest_nr_running == 0) goto out_balanced; avg_load = (SCHED_LOAD_SCALE * total_load) / total_pwr; @@ -2096,6 +2452,7 @@ find_busiest_group(struct sched_domain *sd, int this_cpu, 100*max_load <= sd->imbalance_pct*this_load) goto out_balanced; + busiest_load_per_task /= busiest_nr_running; /* * We're trying to get all the cpus to the average_load, so we don't * want to push ourselves above the average load, nor do we wish to @@ -2107,21 +2464,49 @@ find_busiest_group(struct sched_domain *sd, int this_cpu, * by pulling tasks to us. Be careful of negative numbers as they'll * appear as very large values with unsigned longs. */ + if (max_load <= busiest_load_per_task) + goto out_balanced; + + /* + * In the presence of smp nice balancing, certain scenarios can have + * max load less than avg load(as we skip the groups at or below + * its cpu_power, while calculating max_load..) + */ + if (max_load < avg_load) { + *imbalance = 0; + goto small_imbalance; + } /* Don't want to pull so many tasks that a group would go idle */ - max_pull = min(max_load - avg_load, max_load - SCHED_LOAD_SCALE); + max_pull = min(max_load - avg_load, max_load - busiest_load_per_task); /* How much load to actually move to equalise the imbalance */ *imbalance = min(max_pull * busiest->cpu_power, (avg_load - this_load) * this->cpu_power) / SCHED_LOAD_SCALE; - if (*imbalance < SCHED_LOAD_SCALE) { - unsigned long pwr_now = 0, pwr_move = 0; - unsigned long tmp; + /* + * if *imbalance is less than the average load per runnable task + * there is no gaurantee that any tasks will be moved so we'll have + * a think about bumping its value to force at least one task to be + * moved + */ + if (*imbalance < busiest_load_per_task) { + unsigned long tmp, pwr_now, pwr_move; + unsigned int imbn; + +small_imbalance: + pwr_move = pwr_now = 0; + imbn = 2; + if (this_nr_running) { + this_load_per_task /= this_nr_running; + if (busiest_load_per_task > this_load_per_task) + imbn = 1; + } else + this_load_per_task = SCHED_LOAD_SCALE; - if (max_load - this_load >= SCHED_LOAD_SCALE*2) { - *imbalance = 1; + if (max_load - this_load >= busiest_load_per_task * imbn) { + *imbalance = busiest_load_per_task; return busiest; } @@ -2131,39 +2516,47 @@ find_busiest_group(struct sched_domain *sd, int this_cpu, * moving them. */ - pwr_now += busiest->cpu_power*min(SCHED_LOAD_SCALE, max_load); - pwr_now += this->cpu_power*min(SCHED_LOAD_SCALE, this_load); + pwr_now += busiest->cpu_power * + min(busiest_load_per_task, max_load); + pwr_now += this->cpu_power * + min(this_load_per_task, this_load); pwr_now /= SCHED_LOAD_SCALE; /* Amount of load we'd subtract */ - tmp = SCHED_LOAD_SCALE*SCHED_LOAD_SCALE/busiest->cpu_power; + tmp = busiest_load_per_task*SCHED_LOAD_SCALE/busiest->cpu_power; if (max_load > tmp) - pwr_move += busiest->cpu_power*min(SCHED_LOAD_SCALE, - max_load - tmp); + pwr_move += busiest->cpu_power * + min(busiest_load_per_task, max_load - tmp); /* Amount of load we'd add */ if (max_load*busiest->cpu_power < - SCHED_LOAD_SCALE*SCHED_LOAD_SCALE) + busiest_load_per_task*SCHED_LOAD_SCALE) tmp = max_load*busiest->cpu_power/this->cpu_power; else - tmp = SCHED_LOAD_SCALE*SCHED_LOAD_SCALE/this->cpu_power; - pwr_move += this->cpu_power*min(SCHED_LOAD_SCALE, this_load + tmp); + tmp = busiest_load_per_task*SCHED_LOAD_SCALE/this->cpu_power; + pwr_move += this->cpu_power*min(this_load_per_task, this_load + tmp); pwr_move /= SCHED_LOAD_SCALE; /* Move if we gain throughput */ if (pwr_move <= pwr_now) goto out_balanced; - *imbalance = 1; - return busiest; + *imbalance = busiest_load_per_task; } - /* Get rid of the scaling factor, rounding down as we divide */ - *imbalance = *imbalance / SCHED_LOAD_SCALE; return busiest; out_balanced: +#if defined(CONFIG_SCHED_MC) || defined(CONFIG_SCHED_SMT) + if (idle == NOT_IDLE || !(sd->flags & SD_POWERSAVINGS_BALANCE)) + goto ret; + if (this == group_leader && group_leader != group_min) { + *imbalance = min_load_per_task; + return group_min; + } +ret: +#endif *imbalance = 0; return NULL; } @@ -2171,19 +2564,27 @@ out_balanced: /* * find_busiest_queue - find the busiest runqueue among the cpus in group. */ -static runqueue_t *find_busiest_queue(struct sched_group *group, - enum idle_type idle) +static struct rq * +find_busiest_queue(struct sched_group *group, enum idle_type idle, + unsigned long imbalance, cpumask_t *cpus) { - unsigned long load, max_load = 0; - runqueue_t *busiest = NULL; + struct rq *busiest = NULL, *rq; + unsigned long max_load = 0; int i; for_each_cpu_mask(i, group->cpumask) { - load = source_load(i, 0); - if (load > max_load) { - max_load = load; - busiest = cpu_rq(i); + if (!cpu_isset(i, *cpus)) + continue; + + rq = cpu_rq(i); + + if (rq->nr_running == 1 && rq->raw_weighted_load > imbalance) + continue; + + if (rq->raw_weighted_load > max_load) { + max_load = rq->raw_weighted_load; + busiest = rq; } } @@ -2196,34 +2597,41 @@ static runqueue_t *find_busiest_queue(struct sched_group *group, */ #define MAX_PINNED_INTERVAL 512 +static inline unsigned long minus_1_or_zero(unsigned long n) +{ + return n > 0 ? n - 1 : 0; +} + /* * Check this_cpu to ensure it is balanced within domain. Attempt to move * tasks if there is an imbalance. * * Called with this_rq unlocked. */ -static int load_balance(int this_cpu, runqueue_t *this_rq, +static int load_balance(int this_cpu, struct rq *this_rq, struct sched_domain *sd, enum idle_type idle) { + int nr_moved, all_pinned = 0, active_balance = 0, sd_idle = 0; struct sched_group *group; - runqueue_t *busiest; unsigned long imbalance; - int nr_moved, all_pinned = 0; - int active_balance = 0; - int sd_idle = 0; + struct rq *busiest; + cpumask_t cpus = CPU_MASK_ALL; - if (idle != NOT_IDLE && sd->flags & SD_SHARE_CPUPOWER) + if (idle != NOT_IDLE && sd->flags & SD_SHARE_CPUPOWER && + !sched_smt_power_savings) sd_idle = 1; schedstat_inc(sd, lb_cnt[idle]); - group = find_busiest_group(sd, this_cpu, &imbalance, idle, &sd_idle); +redo: + group = find_busiest_group(sd, this_cpu, &imbalance, idle, &sd_idle, + &cpus); if (!group) { schedstat_inc(sd, lb_nobusyg[idle]); goto out_balanced; } - busiest = find_busiest_queue(group, idle); + busiest = find_busiest_queue(group, idle, imbalance, &cpus); if (!busiest) { schedstat_inc(sd, lb_nobusyq[idle]); goto out_balanced; @@ -2243,12 +2651,17 @@ static int load_balance(int this_cpu, runqueue_t *this_rq, */ double_rq_lock(this_rq, busiest); nr_moved = move_tasks(this_rq, this_cpu, busiest, - imbalance, sd, idle, &all_pinned); + minus_1_or_zero(busiest->nr_running), + imbalance, sd, idle, &all_pinned); double_rq_unlock(this_rq, busiest); /* All tasks on this runqueue were pinned by CPU affinity */ - if (unlikely(all_pinned)) + if (unlikely(all_pinned)) { + cpu_clear(cpu_of(busiest), cpus); + if (!cpus_empty(cpus)) + goto redo; goto out_balanced; + } } if (!nr_moved) { @@ -2300,7 +2713,8 @@ static int load_balance(int this_cpu, runqueue_t *this_rq, sd->balance_interval *= 2; } - if (!nr_moved && !sd_idle && sd->flags & SD_SHARE_CPUPOWER) + if (!nr_moved && !sd_idle && sd->flags & SD_SHARE_CPUPOWER && + !sched_smt_power_savings) return -1; return nr_moved; @@ -2315,7 +2729,8 @@ out_one_pinned: (sd->balance_interval < sd->max_interval)) sd->balance_interval *= 2; - if (!sd_idle && sd->flags & SD_SHARE_CPUPOWER) + if (!sd_idle && sd->flags & SD_SHARE_CPUPOWER && + !sched_smt_power_savings) return -1; return 0; } @@ -2327,26 +2742,30 @@ out_one_pinned: * Called from schedule when this_rq is about to become idle (NEWLY_IDLE). * this_rq is locked. */ -static int load_balance_newidle(int this_cpu, runqueue_t *this_rq, - struct sched_domain *sd) +static int +load_balance_newidle(int this_cpu, struct rq *this_rq, struct sched_domain *sd) { struct sched_group *group; - runqueue_t *busiest = NULL; + struct rq *busiest = NULL; unsigned long imbalance; int nr_moved = 0; int sd_idle = 0; + cpumask_t cpus = CPU_MASK_ALL; - if (sd->flags & SD_SHARE_CPUPOWER) + if (sd->flags & SD_SHARE_CPUPOWER && !sched_smt_power_savings) sd_idle = 1; schedstat_inc(sd, lb_cnt[NEWLY_IDLE]); - group = find_busiest_group(sd, this_cpu, &imbalance, NEWLY_IDLE, &sd_idle); +redo: + group = find_busiest_group(sd, this_cpu, &imbalance, NEWLY_IDLE, + &sd_idle, &cpus); if (!group) { schedstat_inc(sd, lb_nobusyg[NEWLY_IDLE]); goto out_balanced; } - busiest = find_busiest_queue(group, NEWLY_IDLE); + busiest = find_busiest_queue(group, NEWLY_IDLE, imbalance, + &cpus); if (!busiest) { schedstat_inc(sd, lb_nobusyq[NEWLY_IDLE]); goto out_balanced; @@ -2361,8 +2780,15 @@ static int load_balance_newidle(int this_cpu, runqueue_t *this_rq, /* Attempt to move tasks */ double_lock_balance(this_rq, busiest); nr_moved = move_tasks(this_rq, this_cpu, busiest, + minus_1_or_zero(busiest->nr_running), imbalance, sd, NEWLY_IDLE, NULL); spin_unlock(&busiest->lock); + + if (!nr_moved) { + cpu_clear(cpu_of(busiest), cpus); + if (!cpus_empty(cpus)) + goto redo; + } } if (!nr_moved) { @@ -2376,9 +2802,11 @@ static int load_balance_newidle(int this_cpu, runqueue_t *this_rq, out_balanced: schedstat_inc(sd, lb_balanced[NEWLY_IDLE]); - if (!sd_idle && sd->flags & SD_SHARE_CPUPOWER) + if (!sd_idle && sd->flags & SD_SHARE_CPUPOWER && + !sched_smt_power_savings) return -1; sd->nr_balance_failed = 0; + return 0; } @@ -2386,16 +2814,15 @@ out_balanced: * idle_balance is called by schedule() if this_cpu is about to become * idle. Attempts to pull tasks from other CPUs. */ -static void idle_balance(int this_cpu, runqueue_t *this_rq) +static void idle_balance(int this_cpu, struct rq *this_rq) { struct sched_domain *sd; for_each_domain(this_cpu, sd) { if (sd->flags & SD_BALANCE_NEWIDLE) { - if (load_balance_newidle(this_cpu, this_rq, sd)) { - /* We've pulled tasks over so stop searching */ + /* If we've pulled tasks over stop searching: */ + if (load_balance_newidle(this_cpu, this_rq, sd)) break; - } } } } @@ -2408,14 +2835,14 @@ static void idle_balance(int this_cpu, runqueue_t *this_rq) * * Called with busiest_rq locked. */ -static void active_load_balance(runqueue_t *busiest_rq, int busiest_cpu) +static void active_load_balance(struct rq *busiest_rq, int busiest_cpu) { - struct sched_domain *sd; - runqueue_t *target_rq; int target_cpu = busiest_rq->push_cpu; + struct sched_domain *sd; + struct rq *target_rq; + /* Is there any task to move? */ if (busiest_rq->nr_running <= 1) - /* no task to move */ return; target_rq = cpu_rq(target_cpu); @@ -2431,21 +2858,22 @@ static void active_load_balance(runqueue_t *busiest_rq, int busiest_cpu) double_lock_balance(busiest_rq, target_rq); /* Search for an sd spanning us and the target CPU. */ - for_each_domain(target_cpu, sd) + for_each_domain(target_cpu, sd) { if ((sd->flags & SD_LOAD_BALANCE) && - cpu_isset(busiest_cpu, sd->span)) + cpu_isset(busiest_cpu, sd->span)) break; + } - if (unlikely(sd == NULL)) - goto out; - - schedstat_inc(sd, alb_cnt); + if (likely(sd)) { + schedstat_inc(sd, alb_cnt); - if (move_tasks(target_rq, target_cpu, busiest_rq, 1, sd, SCHED_IDLE, NULL)) - schedstat_inc(sd, alb_pushed); - else - schedstat_inc(sd, alb_failed); -out: + if (move_tasks(target_rq, target_cpu, busiest_rq, 1, + RTPRIO_TO_LOAD_WEIGHT(100), sd, SCHED_IDLE, + NULL)) + schedstat_inc(sd, alb_pushed); + else + schedstat_inc(sd, alb_failed); + } spin_unlock(&target_rq->lock); } @@ -2458,23 +2886,27 @@ out: * Balancing parameters are set up in arch_init_sched_domains. */ -/* Don't have all balancing operations going off at once */ -#define CPU_OFFSET(cpu) (HZ * cpu / NR_CPUS) +/* Don't have all balancing operations going off at once: */ +static inline unsigned long cpu_offset(int cpu) +{ + return jiffies + cpu * HZ / NR_CPUS; +} -static void rebalance_tick(int this_cpu, runqueue_t *this_rq, - enum idle_type idle) +static void +rebalance_tick(int this_cpu, struct rq *this_rq, enum idle_type idle) { - unsigned long old_load, this_load; - unsigned long j = jiffies + CPU_OFFSET(this_cpu); + unsigned long this_load, interval, j = cpu_offset(this_cpu); struct sched_domain *sd; - int i; + int i, scale; + + this_load = this_rq->raw_weighted_load; + + /* Update our load: */ + for (i = 0, scale = 1; i < 3; i++, scale <<= 1) { + unsigned long old_load, new_load; - this_load = this_rq->nr_running * SCHED_LOAD_SCALE; - /* Update our load */ - for (i = 0; i < 3; i++) { - unsigned long new_load = this_load; - int scale = 1 << i; old_load = this_rq->cpu_load[i]; + new_load = this_load; /* * Round up the averaging division if load is increasing. This * prevents us from getting stuck on 9 if the load is 10, for @@ -2486,8 +2918,6 @@ static void rebalance_tick(int this_cpu, runqueue_t *this_rq, } for_each_domain(this_cpu, sd) { - unsigned long interval; - if (!(sd->flags & SD_LOAD_BALANCE)) continue; @@ -2517,17 +2947,18 @@ static void rebalance_tick(int this_cpu, runqueue_t *this_rq, /* * on UP we do not need to balance between CPUs: */ -static inline void rebalance_tick(int cpu, runqueue_t *rq, enum idle_type idle) +static inline void rebalance_tick(int cpu, struct rq *rq, enum idle_type idle) { } -static inline void idle_balance(int cpu, runqueue_t *rq) +static inline void idle_balance(int cpu, struct rq *rq) { } #endif -static inline int wake_priority_sleeper(runqueue_t *rq) +static inline int wake_priority_sleeper(struct rq *rq) { int ret = 0; + #ifdef CONFIG_SCHED_SMT spin_lock(&rq->lock); /* @@ -2551,25 +2982,26 @@ EXPORT_PER_CPU_SYMBOL(kstat); * This is called on clock ticks and on context switches. * Bank in p->sched_time the ns elapsed since the last tick or switch. */ -static inline void update_cpu_clock(task_t *p, runqueue_t *rq, - unsigned long long now) +static inline void +update_cpu_clock(struct task_struct *p, struct rq *rq, unsigned long long now) { - unsigned long long last = max(p->timestamp, rq->timestamp_last_tick); - p->sched_time += now - last; + p->sched_time += now - max(p->timestamp, rq->timestamp_last_tick); } /* * Return current->sched_time plus any more ns on the sched_clock * that have not yet been banked. */ -unsigned long long current_sched_time(const task_t *tsk) +unsigned long long current_sched_time(const struct task_struct *p) { unsigned long long ns; unsigned long flags; + local_irq_save(flags); - ns = max(tsk->timestamp, task_rq(tsk)->timestamp_last_tick); - ns = tsk->sched_time + (sched_clock() - ns); + ns = max(p->timestamp, task_rq(p)->timestamp_last_tick); + ns = p->sched_time + sched_clock() - ns; local_irq_restore(flags); + return ns; } @@ -2583,11 +3015,16 @@ unsigned long long current_sched_time(const task_t *tsk) * increasing number of running tasks. We also ignore the interactivity * if a better static_prio task has expired: */ -#define EXPIRED_STARVING(rq) \ - ((STARVATION_LIMIT && ((rq)->expired_timestamp && \ - (jiffies - (rq)->expired_timestamp >= \ - STARVATION_LIMIT * ((rq)->nr_running) + 1))) || \ - ((rq)->curr->static_prio > (rq)->best_expired_prio)) +static inline int expired_starving(struct rq *rq) +{ + if (rq->curr->static_prio > rq->best_expired_prio) + return 1; + if (!STARVATION_LIMIT || !rq->expired_timestamp) + return 0; + if (jiffies - rq->expired_timestamp > STARVATION_LIMIT * rq->nr_running) + return 1; + return 0; +} /* * Account user cpu time to a process. @@ -2624,7 +3061,7 @@ void account_system_time(struct task_struct *p, int hardirq_offset, { struct cpu_usage_stat *cpustat = &kstat_this_cpu.cpustat; struct vx_info *vxi = p->vx_info; /* p is _always_ current */ - runqueue_t *rq = this_rq(); + struct rq *rq = this_rq(); cputime64_t tmp; p->stime = cputime_add(p->stime, cputime); @@ -2655,7 +3092,7 @@ void account_steal_time(struct task_struct *p, cputime_t steal) { struct cpu_usage_stat *cpustat = &kstat_this_cpu.cpustat; cputime64_t tmp = cputime_to_cputime64(steal); - runqueue_t *rq = this_rq(); + struct rq *rq = this_rq(); if (p == rq->idle) { p->stime = cputime_add(p->stime, steal); @@ -2676,10 +3113,10 @@ void account_steal_time(struct task_struct *p, cputime_t steal) */ void scheduler_tick(void) { - int cpu = smp_processor_id(); - runqueue_t *rq = this_rq(); - task_t *p = current; unsigned long long now = sched_clock(); + struct task_struct *p = current; + int cpu = smp_processor_id(); + struct rq *rq = cpu_rq(cpu); update_cpu_clock(p, rq, now); @@ -2737,7 +3174,7 @@ void scheduler_tick(void) if (!rq->expired_timestamp) rq->expired_timestamp = jiffies; - if (!TASK_INTERACTIVE(p) || EXPIRED_STARVING(rq)) { + if (!TASK_INTERACTIVE(p) || expired_starving(rq)) { enqueue_task(p, rq->expired); if (p->static_prio < rq->best_expired_prio) rq->best_expired_prio = p->static_prio; @@ -2776,55 +3213,42 @@ out: } #ifdef CONFIG_SCHED_SMT -static inline void wakeup_busy_runqueue(runqueue_t *rq) +static inline void wakeup_busy_runqueue(struct rq *rq) { /* If an SMT runqueue is sleeping due to priority reasons wake it up */ if (rq->curr == rq->idle && rq->nr_running) resched_task(rq->idle); } -static void wake_sleeping_dependent(int this_cpu, runqueue_t *this_rq) +/* + * Called with interrupt disabled and this_rq's runqueue locked. + */ +static void wake_sleeping_dependent(int this_cpu) { struct sched_domain *tmp, *sd = NULL; - cpumask_t sibling_map; int i; - for_each_domain(this_cpu, tmp) - if (tmp->flags & SD_SHARE_CPUPOWER) + for_each_domain(this_cpu, tmp) { + if (tmp->flags & SD_SHARE_CPUPOWER) { sd = tmp; + break; + } + } if (!sd) return; - /* - * Unlock the current runqueue because we have to lock in - * CPU order to avoid deadlocks. Caller knows that we might - * unlock. We keep IRQs disabled. - */ - spin_unlock(&this_rq->lock); - - sibling_map = sd->span; - - for_each_cpu_mask(i, sibling_map) - spin_lock(&cpu_rq(i)->lock); - /* - * We clear this CPU from the mask. This both simplifies the - * inner loop and keps this_rq locked when we exit: - */ - cpu_clear(this_cpu, sibling_map); + for_each_cpu_mask(i, sd->span) { + struct rq *smt_rq = cpu_rq(i); - for_each_cpu_mask(i, sibling_map) { - runqueue_t *smt_rq = cpu_rq(i); + if (i == this_cpu) + continue; + if (unlikely(!spin_trylock(&smt_rq->lock))) + continue; wakeup_busy_runqueue(smt_rq); + spin_unlock(&smt_rq->lock); } - - for_each_cpu_mask(i, sibling_map) - spin_unlock(&cpu_rq(i)->lock); - /* - * We exit with this_cpu's rq still held and IRQs - * still disabled: - */ } /* @@ -2832,57 +3256,53 @@ static void wake_sleeping_dependent(int this_cpu, runqueue_t *this_rq) * utilize, if another task runs on a sibling. This models the * slowdown effect of other tasks running on siblings: */ -static inline unsigned long smt_slice(task_t *p, struct sched_domain *sd) +static inline unsigned long +smt_slice(struct task_struct *p, struct sched_domain *sd) { return p->time_slice * (100 - sd->per_cpu_gain) / 100; } -static int dependent_sleeper(int this_cpu, runqueue_t *this_rq) +/* + * To minimise lock contention and not have to drop this_rq's runlock we only + * trylock the sibling runqueues and bypass those runqueues if we fail to + * acquire their lock. As we only trylock the normal locking order does not + * need to be obeyed. + */ +static int +dependent_sleeper(int this_cpu, struct rq *this_rq, struct task_struct *p) { struct sched_domain *tmp, *sd = NULL; - cpumask_t sibling_map; - prio_array_t *array; int ret = 0, i; - task_t *p; - for_each_domain(this_cpu, tmp) - if (tmp->flags & SD_SHARE_CPUPOWER) + /* kernel/rt threads do not participate in dependent sleeping */ + if (!p->mm || rt_task(p)) + return 0; + + for_each_domain(this_cpu, tmp) { + if (tmp->flags & SD_SHARE_CPUPOWER) { sd = tmp; + break; + } + } if (!sd) return 0; - /* - * The same locking rules and details apply as for - * wake_sleeping_dependent(): - */ - spin_unlock(&this_rq->lock); - sibling_map = sd->span; - for_each_cpu_mask(i, sibling_map) - spin_lock(&cpu_rq(i)->lock); - cpu_clear(this_cpu, sibling_map); + for_each_cpu_mask(i, sd->span) { + struct task_struct *smt_curr; + struct rq *smt_rq; - /* - * Establish next task to be run - it might have gone away because - * we released the runqueue lock above: - */ - if (!this_rq->nr_running) - goto out_unlock; - array = this_rq->active; - if (!array->nr_active) - array = this_rq->expired; - BUG_ON(!array->nr_active); + if (i == this_cpu) + continue; - p = list_entry(array->queue[sched_find_first_bit(array->bitmap)].next, - task_t, run_list); + smt_rq = cpu_rq(i); + if (unlikely(!spin_trylock(&smt_rq->lock))) + continue; - for_each_cpu_mask(i, sibling_map) { - runqueue_t *smt_rq = cpu_rq(i); - task_t *smt_curr = smt_rq->curr; + smt_curr = smt_rq->curr; - /* Kernel threads do not participate in dependent sleeping */ - if (!p->mm || !smt_curr->mm || rt_task(p)) - goto check_smt_task; + if (!smt_curr->mm) + goto unlock; /* * If a user task with lower static priority than the @@ -2900,49 +3320,23 @@ static int dependent_sleeper(int this_cpu, runqueue_t *this_rq) if ((jiffies % DEF_TIMESLICE) > (sd->per_cpu_gain * DEF_TIMESLICE / 100)) ret = 1; - } else + } else { if (smt_curr->static_prio < p->static_prio && !TASK_PREEMPTS_CURR(p, smt_rq) && smt_slice(smt_curr, sd) > task_timeslice(p)) ret = 1; - -check_smt_task: - if ((!smt_curr->mm && smt_curr != smt_rq->idle) || - rt_task(smt_curr)) - continue; - if (!p->mm) { - wakeup_busy_runqueue(smt_rq); - continue; - } - - /* - * Reschedule a lower priority task on the SMT sibling for - * it to be put to sleep, or wake it up if it has been put to - * sleep for priority reasons to see if it should run now. - */ - if (rt_task(p)) { - if ((jiffies % DEF_TIMESLICE) > - (sd->per_cpu_gain * DEF_TIMESLICE / 100)) - resched_task(smt_curr); - } else { - if (TASK_PREEMPTS_CURR(p, smt_rq) && - smt_slice(p, sd) > task_timeslice(smt_curr)) - resched_task(smt_curr); - else - wakeup_busy_runqueue(smt_rq); } +unlock: + spin_unlock(&smt_rq->lock); } -out_unlock: - for_each_cpu_mask(i, sibling_map) - spin_unlock(&cpu_rq(i)->lock); return ret; } #else -static inline void wake_sleeping_dependent(int this_cpu, runqueue_t *this_rq) +static inline void wake_sleeping_dependent(int this_cpu) { } - -static inline int dependent_sleeper(int this_cpu, runqueue_t *this_rq) +static inline int +dependent_sleeper(int this_cpu, struct rq *this_rq, struct task_struct *p) { return 0; } @@ -2955,12 +3349,13 @@ void fastcall add_preempt_count(int val) /* * Underflow? */ - BUG_ON((preempt_count() < 0)); + if (DEBUG_LOCKS_WARN_ON((preempt_count() < 0))) + return; preempt_count() += val; /* * Spinlock count overflowing soon? */ - BUG_ON((preempt_count() & PREEMPT_MASK) >= PREEMPT_MASK-10); + DEBUG_LOCKS_WARN_ON((preempt_count() & PREEMPT_MASK) >= PREEMPT_MASK-10); } EXPORT_SYMBOL(add_preempt_count); @@ -2969,11 +3364,15 @@ void fastcall sub_preempt_count(int val) /* * Underflow? */ - BUG_ON(val > preempt_count()); + if (DEBUG_LOCKS_WARN_ON(val > preempt_count())) + return; /* * Is the spinlock portion underflowing? */ - BUG_ON((val < PREEMPT_MASK) && !(preempt_count() & PREEMPT_MASK)); + if (DEBUG_LOCKS_WARN_ON((val < PREEMPT_MASK) && + !(preempt_count() & PREEMPT_MASK))) + return; + preempt_count() -= val; } EXPORT_SYMBOL(sub_preempt_count); @@ -2991,14 +3390,14 @@ static inline int interactive_sleep(enum sleep_type sleep_type) */ asmlinkage void __sched schedule(void) { - long *switch_count; - task_t *prev, *next; - runqueue_t *rq; - prio_array_t *array; + struct task_struct *prev, *next; + struct prio_array *array; struct list_head *queue; unsigned long long now; unsigned long run_time; int cpu, idx, new_prio; + long *switch_count; + struct rq *rq; struct vx_info *vxi; #ifdef CONFIG_VSERVER_HARDCPU int maxidle = -HZ; @@ -3086,7 +3485,7 @@ drain_hold_queue: vxi = NULL; list_for_each_safe(l, n, &rq->hold_queue) { - next = list_entry(l, task_t, run_list); + next = list_entry(l, struct task_struct, run_list); if (vxi == next->vx_info) continue; @@ -3119,32 +3518,13 @@ pick_next: cpu = smp_processor_id(); if (unlikely(!rq->nr_running)) { -go_idle: idle_balance(cpu, rq); if (!rq->nr_running) { next = rq->idle; rq->expired_timestamp = 0; - wake_sleeping_dependent(cpu, rq); - /* - * wake_sleeping_dependent() might have released - * the runqueue, so break out if we got new - * tasks meanwhile: - */ - if (!rq->nr_running) - goto switch_tasks; - } - } else { - if (dependent_sleeper(cpu, rq)) { - next = rq->idle; + wake_sleeping_dependent(cpu); goto switch_tasks; } - /* - * dependent_sleeper() releases and reacquires the runqueue - * lock, hence go into the idle loop if the rq went - * empty meanwhile: - */ - if (unlikely(!rq->nr_running)) - goto go_idle; } array = rq->active; @@ -3162,7 +3542,7 @@ go_idle: idx = sched_find_first_bit(array->bitmap); queue = array->queue + idx; - next = list_entry(queue->next, task_t, run_list); + next = list_entry(queue->next, struct task_struct, run_list); vxi = next->vx_info; #ifdef CONFIG_VSERVER_HARDCPU @@ -3209,6 +3589,8 @@ go_idle: } } next->sleep_type = SLEEP_NORMAL; + if (dependent_sleeper(cpu, rq, next)) + next = rq->idle; switch_tasks: #if defined(CONFIG_VSERVER_HARDCPU) && defined(CONFIG_VSERVER_ACB_SCHED) if (next == rq->idle && !list_empty(&rq->hold_queue)) { @@ -3262,12 +3644,11 @@ switch_tasks: if (unlikely(test_thread_flag(TIF_NEED_RESCHED))) goto need_resched; } - EXPORT_SYMBOL(schedule); #ifdef CONFIG_PREEMPT /* - * this is is the entry point to schedule() from in-kernel preemption + * this is the entry point to schedule() from in-kernel preemption * off of preempt_enable. Kernel preemptions off return from interrupt * occur there and call schedule directly. */ @@ -3307,11 +3688,10 @@ need_resched: if (unlikely(test_thread_flag(TIF_NEED_RESCHED))) goto need_resched; } - EXPORT_SYMBOL(preempt_schedule); /* - * this is is the entry point to schedule() from kernel preemption + * this is the entry point to schedule() from kernel preemption * off of irq context. * Note, that this is called and return with irqs disabled. This will * protect us against recursive calling from irq. @@ -3323,7 +3703,7 @@ asmlinkage void __sched preempt_schedule_irq(void) struct task_struct *task = current; int saved_lock_depth; #endif - /* Catch callers which need to be fixed*/ + /* Catch callers which need to be fixed */ BUG_ON(ti->preempt_count || !irqs_disabled()); need_resched: @@ -3356,10 +3736,8 @@ need_resched: int default_wake_function(wait_queue_t *curr, unsigned mode, int sync, void *key) { - task_t *p = curr->private; - return try_to_wake_up(p, mode, sync); + return try_to_wake_up(curr->private, mode, sync); } - EXPORT_SYMBOL(default_wake_function); /* @@ -3377,13 +3755,11 @@ static void __wake_up_common(wait_queue_head_t *q, unsigned int mode, struct list_head *tmp, *next; list_for_each_safe(tmp, next, &q->task_list) { - wait_queue_t *curr; - unsigned flags; - curr = list_entry(tmp, wait_queue_t, task_list); - flags = curr->flags; + wait_queue_t *curr = list_entry(tmp, wait_queue_t, task_list); + unsigned flags = curr->flags; + if (curr->func(curr, mode, sync, key) && - (flags & WQ_FLAG_EXCLUSIVE) && - !--nr_exclusive) + (flags & WQ_FLAG_EXCLUSIVE) && !--nr_exclusive) break; } } @@ -3404,7 +3780,6 @@ void fastcall __wake_up(wait_queue_head_t *q, unsigned int mode, __wake_up_common(q, mode, nr_exclusive, 0, key); spin_unlock_irqrestore(&q->lock, flags); } - EXPORT_SYMBOL(__wake_up); /* @@ -3473,6 +3848,7 @@ EXPORT_SYMBOL(complete_all); void fastcall __sched wait_for_completion(struct completion *x) { might_sleep(); + spin_lock_irq(&x->wait.lock); if (!x->done) { DECLARE_WAITQUEUE(wait, current); @@ -3628,7 +4004,6 @@ void fastcall __sched interruptible_sleep_on(wait_queue_head_t *q) schedule(); SLEEP_ON_TAIL } - EXPORT_SYMBOL(interruptible_sleep_on); long fastcall __sched @@ -3646,7 +4021,6 @@ interruptible_sleep_on_timeout(wait_queue_head_t *q, long timeout) return timeout; } - EXPORT_SYMBOL(interruptible_sleep_on_timeout); long fastcall __sched sleep_on_timeout(wait_queue_head_t *q, long timeout) @@ -3666,12 +4040,65 @@ long fastcall __sched sleep_on_timeout(wait_queue_head_t *q, long timeout) EXPORT_SYMBOL(sleep_on_timeout); -void set_user_nice(task_t *p, long nice) +#ifdef CONFIG_RT_MUTEXES + +/* + * rt_mutex_setprio - set the current priority of a task + * @p: task + * @prio: prio value (kernel-internal form) + * + * This function changes the 'effective' priority of a task. It does + * not touch ->normal_prio like __setscheduler(). + * + * Used by the rt_mutex code to implement priority inheritance logic. + */ +void rt_mutex_setprio(struct task_struct *p, int prio) +{ + struct prio_array *array; + unsigned long flags; + struct rq *rq; + int oldprio; + + BUG_ON(prio < 0 || prio > MAX_PRIO); + + rq = task_rq_lock(p, &flags); + + oldprio = p->prio; + array = p->array; + if (array) + dequeue_task(p, array); + p->prio = prio; + + if (array) { + /* + * If changing to an RT priority then queue it + * in the active array! + */ + if (rt_task(p)) + array = rq->active; + enqueue_task(p, array); + /* + * Reschedule if we are currently running on this runqueue and + * our priority decreased, or if we are not currently running on + * this runqueue and our priority is higher than the current's + */ + if (task_running(rq, p)) { + if (p->prio > oldprio) + resched_task(rq->curr); + } else if (TASK_PREEMPTS_CURR(p, rq)) + resched_task(rq->curr); + } + task_rq_unlock(rq, &flags); +} + +#endif + +void set_user_nice(struct task_struct *p, long nice) { + struct prio_array *array; + int old_prio, delta; unsigned long flags; - prio_array_t *array; - runqueue_t *rq; - int old_prio, new_prio, delta; + struct rq *rq; if (TASK_NICE(p) == nice || nice < -20 || nice > 19) return; @@ -3686,22 +4113,25 @@ void set_user_nice(task_t *p, long nice) * it wont have any effect on scheduling until the task is * not SCHED_NORMAL/SCHED_BATCH: */ - if (rt_task(p)) { + if (has_rt_policy(p)) { p->static_prio = NICE_TO_PRIO(nice); goto out_unlock; } array = p->array; - if (array) + if (array) { dequeue_task(p, array); + dec_raw_weighted_load(rq, p); + } - old_prio = p->prio; - new_prio = NICE_TO_PRIO(nice); - delta = new_prio - old_prio; p->static_prio = NICE_TO_PRIO(nice); - p->prio += delta; + set_load_weight(p); + old_prio = p->prio; + p->prio = effective_prio(p); + delta = p->prio - old_prio; if (array) { enqueue_task(p, array); + inc_raw_weighted_load(rq, p); /* * If the task increased its priority or is running and * lowered its priority, then reschedule its CPU: @@ -3712,7 +4142,6 @@ void set_user_nice(task_t *p, long nice) out_unlock: task_rq_unlock(rq, &flags); } - EXPORT_SYMBOL(set_user_nice); /* @@ -3720,10 +4149,11 @@ EXPORT_SYMBOL(set_user_nice); * @p: task * @nice: nice value */ -int can_nice(const task_t *p, const int nice) +int can_nice(const struct task_struct *p, const int nice) { /* convert nice value [19,-20] to rlimit style value [1,40] */ int nice_rlim = 20 - nice; + return (nice_rlim <= p->signal->rlim[RLIMIT_NICE].rlim_cur || capable(CAP_SYS_NICE)); } @@ -3739,8 +4169,7 @@ int can_nice(const task_t *p, const int nice) */ asmlinkage long sys_nice(int increment) { - int retval; - long nice; + long nice, retval; /* * Setpriority might change our priority at the same moment. @@ -3779,7 +4208,7 @@ asmlinkage long sys_nice(int increment) * RT tasks are offset by -200. Normal tasks are centered * around 0, value goes from -16 to +15. */ -int task_prio(const task_t *p) +int task_prio(const struct task_struct *p) { return p->prio - MAX_RT_PRIO; } @@ -3788,7 +4217,7 @@ int task_prio(const task_t *p) * task_nice - return the nice value of a given task. * @p: the task in question. */ -int task_nice(const task_t *p) +int task_nice(const struct task_struct *p) { return TASK_NICE(p); } @@ -3807,7 +4236,7 @@ int idle_cpu(int cpu) * idle_task - return the idle task for a given cpu. * @cpu: the processor in question. */ -task_t *idle_task(int cpu) +struct task_struct *idle_task(int cpu) { return cpu_rq(cpu)->idle; } @@ -3816,7 +4245,7 @@ task_t *idle_task(int cpu) * find_process_by_pid - find a process with a matching PID value. * @pid: the pid in question. */ -static inline task_t *find_process_by_pid(pid_t pid) +static inline struct task_struct *find_process_by_pid(pid_t pid) { return pid ? find_task_by_pid(pid) : current; } @@ -3825,18 +4254,18 @@ static inline task_t *find_process_by_pid(pid_t pid) static void __setscheduler(struct task_struct *p, int policy, int prio) { BUG_ON(p->array); + p->policy = policy; p->rt_priority = prio; - if (policy != SCHED_NORMAL && policy != SCHED_BATCH) { - p->prio = MAX_RT_PRIO-1 - p->rt_priority; - } else { - p->prio = p->static_prio; - /* - * SCHED_BATCH tasks are treated as perpetual CPU hogs: - */ - if (policy == SCHED_BATCH) - p->sleep_avg = 0; - } + p->normal_prio = normal_prio(p); + /* we are holding p->pi_lock already */ + p->prio = rt_mutex_getprio(p); + /* + * SCHED_BATCH tasks are treated as perpetual CPU hogs: + */ + if (policy == SCHED_BATCH) + p->sleep_avg = 0; + set_load_weight(p); } /** @@ -3849,12 +4278,13 @@ static void __setscheduler(struct task_struct *p, int policy, int prio) int sched_setscheduler(struct task_struct *p, int policy, struct sched_param *param) { - int retval; - int oldprio, oldpolicy = -1; - prio_array_t *array; + int retval, oldprio, oldpolicy = -1; + struct prio_array *array; unsigned long flags; - runqueue_t *rq; + struct rq *rq; + /* may grab non-irq protected spin_locks */ + BUG_ON(in_interrupt()); recheck: /* double check policy once rq lock held */ if (policy < 0) @@ -3902,15 +4332,21 @@ recheck: retval = security_task_setscheduler(p, policy, param); if (retval) return retval; + /* + * make sure no PI-waiters arrive (or leave) while we are + * changing the priority of the task: + */ + spin_lock_irqsave(&p->pi_lock, flags); /* * To be able to change p->policy safely, the apropriate * runqueue lock must be held. */ - rq = task_rq_lock(p, &flags); + rq = __task_rq_lock(p); /* recheck policy now with rq lock held */ if (unlikely(oldpolicy != -1 && oldpolicy != p->policy)) { policy = oldpolicy = -1; - task_rq_unlock(rq, &flags); + __task_rq_unlock(rq); + spin_unlock_irqrestore(&p->pi_lock, flags); goto recheck; } array = p->array; @@ -3932,7 +4368,11 @@ recheck: } else if (TASK_PREEMPTS_CURR(p, rq)) resched_task(rq->curr); } - task_rq_unlock(rq, &flags); + __task_rq_unlock(rq); + spin_unlock_irqrestore(&p->pi_lock, flags); + + rt_mutex_adjust_pi(p); + return 0; } EXPORT_SYMBOL_GPL(sched_setscheduler); @@ -3940,9 +4380,9 @@ EXPORT_SYMBOL_GPL(sched_setscheduler); static int do_sched_setscheduler(pid_t pid, int policy, struct sched_param __user *param) { - int retval; struct sched_param lparam; struct task_struct *p; + int retval; if (!param || pid < 0) return -EINVAL; @@ -3956,6 +4396,7 @@ do_sched_setscheduler(pid_t pid, int policy, struct sched_param __user *param) } retval = sched_setscheduler(p, policy, &lparam); read_unlock_irq(&tasklist_lock); + return retval; } @@ -3991,8 +4432,8 @@ asmlinkage long sys_sched_setparam(pid_t pid, struct sched_param __user *param) */ asmlinkage long sys_sched_getscheduler(pid_t pid) { + struct task_struct *p; int retval = -EINVAL; - task_t *p; if (pid < 0) goto out_nounlock; @@ -4019,8 +4460,8 @@ out_nounlock: asmlinkage long sys_sched_getparam(pid_t pid, struct sched_param __user *param) { struct sched_param lp; + struct task_struct *p; int retval = -EINVAL; - task_t *p; if (!param || pid < 0) goto out_nounlock; @@ -4053,9 +4494,9 @@ out_unlock: long sched_setaffinity(pid_t pid, cpumask_t new_mask) { - task_t *p; - int retval; cpumask_t cpus_allowed; + struct task_struct *p; + int retval; lock_cpu_hotplug(); read_lock(&tasklist_lock); @@ -4080,6 +4521,10 @@ long sched_setaffinity(pid_t pid, cpumask_t new_mask) !capable(CAP_SYS_NICE)) goto out_unlock; + retval = security_task_setscheduler(p, 0, NULL); + if (retval) + goto out_unlock; + cpus_allowed = cpuset_cpus_allowed(p); cpus_and(new_mask, new_mask, cpus_allowed); retval = set_cpus_allowed(p, new_mask); @@ -4137,8 +4582,8 @@ cpumask_t cpu_possible_map __read_mostly = CPU_MASK_ALL; long sched_getaffinity(pid_t pid, cpumask_t *mask) { + struct task_struct *p; int retval; - task_t *p; lock_cpu_hotplug(); read_lock(&tasklist_lock); @@ -4148,7 +4593,10 @@ long sched_getaffinity(pid_t pid, cpumask_t *mask) if (!p) goto out_unlock; - retval = 0; + retval = security_task_getscheduler(p); + if (retval) + goto out_unlock; + cpus_and(*mask, p->cpus_allowed, cpu_online_map); out_unlock: @@ -4194,9 +4642,8 @@ asmlinkage long sys_sched_getaffinity(pid_t pid, unsigned int len, */ asmlinkage long sys_sched_yield(void) { - runqueue_t *rq = this_rq_lock(); - prio_array_t *array = current->array; - prio_array_t *target = rq->expired; + struct rq *rq = this_rq_lock(); + struct prio_array *array = current->array, *target = rq->expired; schedstat_inc(rq, yld_cnt); /* @@ -4230,6 +4677,7 @@ asmlinkage long sys_sched_yield(void) * no need to preempt or enable interrupts: */ __release(rq->lock); + spin_release(&rq->lock.dep_map, 1, _THIS_IP_); _raw_spin_unlock(&rq->lock); preempt_enable_no_resched(); @@ -4249,6 +4697,9 @@ static inline int __resched_legal(int expected_preempt_count) static void __cond_resched(void) { +#ifdef CONFIG_DEBUG_SPINLOCK_SLEEP + __might_sleep(__FILE__, __LINE__); +#endif /* * The BKS might be reacquired before we have dropped * PREEMPT_ACTIVE, which could trigger a second @@ -4290,6 +4741,7 @@ int cond_resched_lock(spinlock_t *lock) spin_lock(lock); } if (need_resched() && __resched_legal(1)) { + spin_release(&lock->dep_map, 1, _THIS_IP_); _raw_spin_unlock(lock); preempt_enable_no_resched(); __cond_resched(); @@ -4305,7 +4757,9 @@ int __sched cond_resched_softirq(void) BUG_ON(!in_softirq()); if (need_resched() && __resched_legal(0)) { - __local_bh_enable(); + raw_local_irq_disable(); + _local_bh_enable(); + raw_local_irq_enable(); __cond_resched(); local_bh_disable(); return 1; @@ -4325,7 +4779,6 @@ void __sched yield(void) set_current_state(TASK_RUNNING); sys_sched_yield(); } - EXPORT_SYMBOL(yield); /* @@ -4337,23 +4790,26 @@ EXPORT_SYMBOL(yield); */ void __sched io_schedule(void) { - struct runqueue *rq = &per_cpu(runqueues, raw_smp_processor_id()); + struct rq *rq = &__raw_get_cpu_var(runqueues); + delayacct_blkio_start(); atomic_inc(&rq->nr_iowait); schedule(); atomic_dec(&rq->nr_iowait); + delayacct_blkio_end(); } - EXPORT_SYMBOL(io_schedule); long __sched io_schedule_timeout(long timeout) { - struct runqueue *rq = &per_cpu(runqueues, raw_smp_processor_id()); + struct rq *rq = &__raw_get_cpu_var(runqueues); long ret; + delayacct_blkio_start(); atomic_inc(&rq->nr_iowait); ret = schedule_timeout(timeout); atomic_dec(&rq->nr_iowait); + delayacct_blkio_end(); return ret; } @@ -4415,9 +4871,9 @@ asmlinkage long sys_sched_get_priority_min(int policy) asmlinkage long sys_sched_rr_get_interval(pid_t pid, struct timespec __user *interval) { + struct task_struct *p; int retval = -EINVAL; struct timespec t; - task_t *p; if (pid < 0) goto out_nounlock; @@ -4432,7 +4888,7 @@ long sys_sched_rr_get_interval(pid_t pid, struct timespec __user *interval) if (retval) goto out_unlock; - jiffies_to_timespec(p->policy & SCHED_FIFO ? + jiffies_to_timespec(p->policy == SCHED_FIFO ? 0 : task_timeslice(p), &t); read_unlock(&tasklist_lock); retval = copy_to_user(interval, &t, sizeof(t)) ? -EFAULT : 0; @@ -4445,35 +4901,36 @@ out_unlock: static inline struct task_struct *eldest_child(struct task_struct *p) { - if (list_empty(&p->children)) return NULL; + if (list_empty(&p->children)) + return NULL; return list_entry(p->children.next,struct task_struct,sibling); } static inline struct task_struct *older_sibling(struct task_struct *p) { - if (p->sibling.prev==&p->parent->children) return NULL; + if (p->sibling.prev==&p->parent->children) + return NULL; return list_entry(p->sibling.prev,struct task_struct,sibling); } static inline struct task_struct *younger_sibling(struct task_struct *p) { - if (p->sibling.next==&p->parent->children) return NULL; + if (p->sibling.next==&p->parent->children) + return NULL; return list_entry(p->sibling.next,struct task_struct,sibling); } -static void show_task(task_t *p) +static const char stat_nam[] = "RSDTtZX"; + +static void show_task(struct task_struct *p) { - task_t *relative; - unsigned state; + struct task_struct *relative; unsigned long free = 0; - static const char *stat_nam[] = { "R", "S", "D", "T", "t", "Z", "X" }; + unsigned state; - printk("%-13.13s ", p->comm); state = p->state ? __ffs(p->state) + 1 : 0; - if (state < ARRAY_SIZE(stat_nam)) - printk(stat_nam[state]); - else - printk("?"); + printk("%-13.13s %c", p->comm, + state < sizeof(stat_nam) - 1 ? stat_nam[state] : '?'); #if (BITS_PER_LONG == 32) if (state == TASK_RUNNING) printk(" running "); @@ -4517,7 +4974,7 @@ static void show_task(task_t *p) void show_state(void) { - task_t *g, *p; + struct task_struct *g, *p; #if (BITS_PER_LONG == 32) printk("\n" @@ -4539,7 +4996,7 @@ void show_state(void) } while_each_thread(g, p); read_unlock(&tasklist_lock); - mutex_debug_show_all_locks(); + debug_show_all_locks(); } /** @@ -4550,15 +5007,15 @@ void show_state(void) * NOTE: this function does not set the idle thread's NEED_RESCHED * flag, to make booting more robust. */ -void __devinit init_idle(task_t *idle, int cpu) +void __devinit init_idle(struct task_struct *idle, int cpu) { - runqueue_t *rq = cpu_rq(cpu); + struct rq *rq = cpu_rq(cpu); unsigned long flags; idle->timestamp = sched_clock(); idle->sleep_avg = 0; idle->array = NULL; - idle->prio = MAX_PRIO; + idle->prio = idle->normal_prio = MAX_PRIO; idle->state = TASK_RUNNING; idle->cpus_allowed = cpumask_of_cpu(cpu); set_task_cpu(idle, cpu); @@ -4591,7 +5048,7 @@ cpumask_t nohz_cpu_mask = CPU_MASK_NONE; /* * This is how migration works: * - * 1) we queue a migration_req_t structure in the source CPU's + * 1) we queue a struct migration_req structure in the source CPU's * runqueue and wake up that CPU's migration thread. * 2) we down() the locked semaphore => thread blocks. * 3) migration thread wakes up (implicitly it forces the migrated @@ -4613,12 +5070,12 @@ cpumask_t nohz_cpu_mask = CPU_MASK_NONE; * task must not exit() & deallocate itself prematurely. The * call is not atomic; no spinlocks may be held. */ -int set_cpus_allowed(task_t *p, cpumask_t new_mask) +int set_cpus_allowed(struct task_struct *p, cpumask_t new_mask) { + struct migration_req req; unsigned long flags; + struct rq *rq; int ret = 0; - migration_req_t req; - runqueue_t *rq; rq = task_rq_lock(p, &flags); if (!cpus_intersects(new_mask, cpu_online_map)) { @@ -4641,9 +5098,9 @@ int set_cpus_allowed(task_t *p, cpumask_t new_mask) } out: task_rq_unlock(rq, &flags); + return ret; } - EXPORT_SYMBOL_GPL(set_cpus_allowed); /* @@ -4654,13 +5111,16 @@ EXPORT_SYMBOL_GPL(set_cpus_allowed); * * So we race with normal scheduler movements, but that's OK, as long * as the task is no longer on this CPU. + * + * Returns non-zero if task was successfully migrated. */ -static void __migrate_task(struct task_struct *p, int src_cpu, int dest_cpu) +static int __migrate_task(struct task_struct *p, int src_cpu, int dest_cpu) { - runqueue_t *rq_dest, *rq_src; + struct rq *rq_dest, *rq_src; + int ret = 0; if (unlikely(cpu_is_offline(dest_cpu))) - return; + return ret; rq_src = cpu_rq(src_cpu); rq_dest = cpu_rq(dest_cpu); @@ -4684,13 +5144,15 @@ static void __migrate_task(struct task_struct *p, int src_cpu, int dest_cpu) p->timestamp = p->timestamp - rq_src->timestamp_last_tick + rq_dest->timestamp_last_tick; deactivate_task(p, rq_src); - activate_task(p, rq_dest, 0); + vx_activate_task(p); + __activate_task(p, rq_dest); if (TASK_PREEMPTS_CURR(p, rq_dest)) resched_task(rq_dest->curr); } - + ret = 1; out: double_rq_unlock(rq_src, rq_dest); + return ret; } /* @@ -4700,16 +5162,16 @@ out: */ static int migration_thread(void *data) { - runqueue_t *rq; int cpu = (long)data; + struct rq *rq; rq = cpu_rq(cpu); BUG_ON(rq->migration_thread != current); set_current_state(TASK_INTERRUPTIBLE); while (!kthread_should_stop()) { + struct migration_req *req; struct list_head *head; - migration_req_t *req; try_to_freeze(); @@ -4733,7 +5195,7 @@ static int migration_thread(void *data) set_current_state(TASK_INTERRUPTIBLE); continue; } - req = list_entry(head->next, migration_req_t, list); + req = list_entry(head->next, struct migration_req, list); list_del_init(head->next); spin_unlock(&rq->lock); @@ -4758,36 +5220,42 @@ wait_to_die: #ifdef CONFIG_HOTPLUG_CPU /* Figure out where task on dead CPU should go, use force if neccessary. */ -static void move_task_off_dead_cpu(int dead_cpu, struct task_struct *tsk) +static void move_task_off_dead_cpu(int dead_cpu, struct task_struct *p) { - int dest_cpu; + unsigned long flags; cpumask_t mask; + struct rq *rq; + int dest_cpu; +restart: /* On same node? */ mask = node_to_cpumask(cpu_to_node(dead_cpu)); - cpus_and(mask, mask, tsk->cpus_allowed); + cpus_and(mask, mask, p->cpus_allowed); dest_cpu = any_online_cpu(mask); /* On any allowed CPU? */ if (dest_cpu == NR_CPUS) - dest_cpu = any_online_cpu(tsk->cpus_allowed); + dest_cpu = any_online_cpu(p->cpus_allowed); /* No more Mr. Nice Guy. */ if (dest_cpu == NR_CPUS) { - cpus_setall(tsk->cpus_allowed); - dest_cpu = any_online_cpu(tsk->cpus_allowed); + rq = task_rq_lock(p, &flags); + cpus_setall(p->cpus_allowed); + dest_cpu = any_online_cpu(p->cpus_allowed); + task_rq_unlock(rq, &flags); /* * Don't tell them about moving exiting tasks or * kernel threads (both mm NULL), since they never * leave kernel. */ - if (tsk->mm && printk_ratelimit()) + if (p->mm && printk_ratelimit()) printk(KERN_INFO "process %d (%s) no " "longer affine to cpu%d\n", - tsk->pid, tsk->comm, dead_cpu); + p->pid, p->comm, dead_cpu); } - __migrate_task(tsk, dead_cpu, dest_cpu); + if (!__migrate_task(p, dead_cpu, dest_cpu)) + goto restart; } /* @@ -4797,9 +5265,9 @@ static void move_task_off_dead_cpu(int dead_cpu, struct task_struct *tsk) * their home CPUs. So we just add the counter to another CPU's counter, * to keep the global sum constant after CPU-down: */ -static void migrate_nr_uninterruptible(runqueue_t *rq_src) +static void migrate_nr_uninterruptible(struct rq *rq_src) { - runqueue_t *rq_dest = cpu_rq(any_online_cpu(CPU_MASK_ALL)); + struct rq *rq_dest = cpu_rq(any_online_cpu(CPU_MASK_ALL)); unsigned long flags; local_irq_save(flags); @@ -4813,48 +5281,51 @@ static void migrate_nr_uninterruptible(runqueue_t *rq_src) /* Run through task list and migrate tasks from the dead cpu. */ static void migrate_live_tasks(int src_cpu) { - struct task_struct *tsk, *t; + struct task_struct *p, *t; write_lock_irq(&tasklist_lock); - do_each_thread(t, tsk) { - if (tsk == current) + do_each_thread(t, p) { + if (p == current) continue; - if (task_cpu(tsk) == src_cpu) - move_task_off_dead_cpu(src_cpu, tsk); - } while_each_thread(t, tsk); + if (task_cpu(p) == src_cpu) + move_task_off_dead_cpu(src_cpu, p); + } while_each_thread(t, p); write_unlock_irq(&tasklist_lock); } /* Schedules idle task to be the next runnable task on current CPU. * It does so by boosting its priority to highest possible and adding it to - * the _front_ of runqueue. Used by CPU offline code. + * the _front_ of the runqueue. Used by CPU offline code. */ void sched_idle_next(void) { - int cpu = smp_processor_id(); - runqueue_t *rq = this_rq(); + int this_cpu = smp_processor_id(); + struct rq *rq = cpu_rq(this_cpu); struct task_struct *p = rq->idle; unsigned long flags; /* cpu has to be offline */ - BUG_ON(cpu_online(cpu)); + BUG_ON(cpu_online(this_cpu)); - /* Strictly not necessary since rest of the CPUs are stopped by now - * and interrupts disabled on current cpu. + /* + * Strictly not necessary since rest of the CPUs are stopped by now + * and interrupts disabled on the current cpu. */ spin_lock_irqsave(&rq->lock, flags); __setscheduler(p, SCHED_FIFO, MAX_RT_PRIO-1); - /* Add idle task to _front_ of it's priority queue */ + + /* Add idle task to the _front_ of its priority queue: */ __activate_idle_task(p, rq); spin_unlock_irqrestore(&rq->lock, flags); } -/* Ensures that the idle task is using init_mm right before its cpu goes +/* + * Ensures that the idle task is using init_mm right before its cpu goes * offline. */ void idle_task_exit(void) @@ -4868,17 +5339,17 @@ void idle_task_exit(void) mmdrop(mm); } -static void migrate_dead(unsigned int dead_cpu, task_t *tsk) +static void migrate_dead(unsigned int dead_cpu, struct task_struct *p) { - struct runqueue *rq = cpu_rq(dead_cpu); + struct rq *rq = cpu_rq(dead_cpu); /* Must be exiting, otherwise would be on tasklist. */ - BUG_ON(tsk->exit_state != EXIT_ZOMBIE && tsk->exit_state != EXIT_DEAD); + BUG_ON(p->exit_state != EXIT_ZOMBIE && p->exit_state != EXIT_DEAD); /* Cannot have done final schedule yet: would have vanished. */ - BUG_ON(tsk->flags & PF_DEAD); + BUG_ON(p->flags & PF_DEAD); - get_task_struct(tsk); + get_task_struct(p); /* * Drop lock around migration; if someone else moves it, @@ -4886,25 +5357,25 @@ static void migrate_dead(unsigned int dead_cpu, task_t *tsk) * fine. */ spin_unlock_irq(&rq->lock); - move_task_off_dead_cpu(dead_cpu, tsk); + move_task_off_dead_cpu(dead_cpu, p); spin_lock_irq(&rq->lock); - put_task_struct(tsk); + put_task_struct(p); } /* release_task() removes task from tasklist, so we won't find dead tasks. */ static void migrate_dead_tasks(unsigned int dead_cpu) { - unsigned arr, i; - struct runqueue *rq = cpu_rq(dead_cpu); + struct rq *rq = cpu_rq(dead_cpu); + unsigned int arr, i; for (arr = 0; arr < 2; arr++) { for (i = 0; i < MAX_PRIO; i++) { struct list_head *list = &rq->arrays[arr].queue[i]; + while (!list_empty(list)) - migrate_dead(dead_cpu, - list_entry(list->next, task_t, - run_list)); + migrate_dead(dead_cpu, list_entry(list->next, + struct task_struct, run_list)); } } } @@ -4914,13 +5385,13 @@ static void migrate_dead_tasks(unsigned int dead_cpu) * migration_call - callback that gets triggered when a CPU is added. * Here we can start up the necessary migration thread for the new CPU. */ -static int migration_call(struct notifier_block *nfb, unsigned long action, - void *hcpu) +static int __cpuinit +migration_call(struct notifier_block *nfb, unsigned long action, void *hcpu) { - int cpu = (long)hcpu; struct task_struct *p; - struct runqueue *rq; + int cpu = (long)hcpu; unsigned long flags; + struct rq *rq; switch (action) { case CPU_UP_PREPARE: @@ -4935,18 +5406,23 @@ static int migration_call(struct notifier_block *nfb, unsigned long action, task_rq_unlock(rq, &flags); cpu_rq(cpu)->migration_thread = p; break; + case CPU_ONLINE: /* Strictly unneccessary, as first user will wake it. */ wake_up_process(cpu_rq(cpu)->migration_thread); break; + #ifdef CONFIG_HOTPLUG_CPU case CPU_UP_CANCELED: + if (!cpu_rq(cpu)->migration_thread) + break; /* Unbind it from offline cpu so it can run. Fall thru. */ kthread_bind(cpu_rq(cpu)->migration_thread, any_online_cpu(cpu_online_map)); kthread_stop(cpu_rq(cpu)->migration_thread); cpu_rq(cpu)->migration_thread = NULL; break; + case CPU_DEAD: migrate_live_tasks(cpu); rq = cpu_rq(cpu); @@ -4967,9 +5443,10 @@ static int migration_call(struct notifier_block *nfb, unsigned long action, * the requestors. */ spin_lock_irq(&rq->lock); while (!list_empty(&rq->migration_queue)) { - migration_req_t *req; + struct migration_req *req; + req = list_entry(rq->migration_queue.next, - migration_req_t, list); + struct migration_req, list); list_del_init(&req->list); complete(&req->done); } @@ -4983,7 +5460,7 @@ static int migration_call(struct notifier_block *nfb, unsigned long action, /* Register at highest priority so that task migration (migrate_all_tasks) * happens before everything else. */ -static struct notifier_block migration_notifier = { +static struct notifier_block __cpuinitdata migration_notifier = { .notifier_call = migration_call, .priority = 10 }; @@ -4991,10 +5468,12 @@ static struct notifier_block migration_notifier = { int __init migration_init(void) { void *cpu = (void *)(long)smp_processor_id(); - /* Start one for boot CPU. */ + + /* Start one for the boot CPU: */ migration_call(&migration_notifier, CPU_UP_PREPARE, cpu); migration_call(&migration_notifier, CPU_ONLINE, cpu); register_cpu_notifier(&migration_notifier); + return 0; } #endif @@ -5090,7 +5569,7 @@ static void sched_domain_debug(struct sched_domain *sd, int cpu) } while (sd); } #else -#define sched_domain_debug(sd, cpu) {} +# define sched_domain_debug(sd, cpu) do { } while (0) #endif static int sd_degenerate(struct sched_domain *sd) @@ -5116,8 +5595,8 @@ static int sd_degenerate(struct sched_domain *sd) return 1; } -static int sd_parent_degenerate(struct sched_domain *sd, - struct sched_domain *parent) +static int +sd_parent_degenerate(struct sched_domain *sd, struct sched_domain *parent) { unsigned long cflags = sd->flags, pflags = parent->flags; @@ -5150,7 +5629,7 @@ static int sd_parent_degenerate(struct sched_domain *sd, */ static void cpu_attach_domain(struct sched_domain *sd, int cpu) { - runqueue_t *rq = cpu_rq(cpu); + struct rq *rq = cpu_rq(cpu); struct sched_domain *tmp; /* Remove the sched domains which do not contribute to scheduling. */ @@ -5412,8 +5891,8 @@ static void touch_cache(void *__cache, unsigned long __size) /* * Measure the cache-cost of one task migration. Returns in units of nsec. */ -static unsigned long long measure_one(void *cache, unsigned long size, - int source, int target) +static unsigned long long +measure_one(void *cache, unsigned long size, int source, int target) { cpumask_t mask, saved_mask; unsigned long long t0, t1, t2, t3, cost; @@ -5565,7 +6044,7 @@ static unsigned long long measure_migration_cost(int cpu1, int cpu2) cache = vmalloc(max_size); if (!cache) { printk("could not vmalloc %d bytes for cache!\n", 2*max_size); - return 1000000; // return 1 msec on very small boxen + return 1000000; /* return 1 msec on very small boxen */ } while (size <= max_size) { @@ -5765,9 +6244,9 @@ static int find_next_best_node(int node, unsigned long *used_nodes) */ static cpumask_t sched_domain_node_span(int node) { - int i; - cpumask_t span, nodemask; DECLARE_BITMAP(used_nodes, MAX_NUMNODES); + cpumask_t span, nodemask; + int i; cpus_clear(span); bitmap_zero(used_nodes, MAX_NUMNODES); @@ -5778,6 +6257,7 @@ static cpumask_t sched_domain_node_span(int node) for (i = 1; i < SD_NODES_PER_DOMAIN; i++) { int next_node = find_next_best_node(node, used_nodes); + nodemask = node_to_cpumask(next_node); cpus_or(span, span, nodemask); } @@ -5786,22 +6266,27 @@ static cpumask_t sched_domain_node_span(int node) } #endif +int sched_smt_power_savings = 0, sched_mc_power_savings = 0; + /* - * At the moment, CONFIG_SCHED_SMT is never defined, but leave it in so we - * can switch it on easily if needed. + * SMT sched-domains: */ #ifdef CONFIG_SCHED_SMT static DEFINE_PER_CPU(struct sched_domain, cpu_domains); static struct sched_group sched_group_cpus[NR_CPUS]; + static int cpu_to_cpu_group(int cpu) { return cpu; } #endif +/* + * multi-core sched-domains: + */ #ifdef CONFIG_SCHED_MC static DEFINE_PER_CPU(struct sched_domain, core_domains); -static struct sched_group sched_group_core[NR_CPUS]; +static struct sched_group *sched_group_core_bycpu[NR_CPUS]; #endif #if defined(CONFIG_SCHED_MC) && defined(CONFIG_SCHED_SMT) @@ -5817,10 +6302,11 @@ static int cpu_to_core_group(int cpu) #endif static DEFINE_PER_CPU(struct sched_domain, phys_domains); -static struct sched_group sched_group_phys[NR_CPUS]; +static struct sched_group *sched_group_phys_bycpu[NR_CPUS]; + static int cpu_to_phys_group(int cpu) { -#if defined(CONFIG_SCHED_MC) +#ifdef CONFIG_SCHED_MC cpumask_t mask = cpu_coregroup_map(cpu); return first_cpu(mask); #elif defined(CONFIG_SCHED_SMT) @@ -5874,13 +6360,74 @@ next_sg: } #endif +/* Free memory allocated for various sched_group structures */ +static void free_sched_groups(const cpumask_t *cpu_map) +{ + int cpu; +#ifdef CONFIG_NUMA + int i; + + for_each_cpu_mask(cpu, *cpu_map) { + struct sched_group *sched_group_allnodes + = sched_group_allnodes_bycpu[cpu]; + struct sched_group **sched_group_nodes + = sched_group_nodes_bycpu[cpu]; + + if (sched_group_allnodes) { + kfree(sched_group_allnodes); + sched_group_allnodes_bycpu[cpu] = NULL; + } + + if (!sched_group_nodes) + continue; + + for (i = 0; i < MAX_NUMNODES; i++) { + cpumask_t nodemask = node_to_cpumask(i); + struct sched_group *oldsg, *sg = sched_group_nodes[i]; + + cpus_and(nodemask, nodemask, *cpu_map); + if (cpus_empty(nodemask)) + continue; + + if (sg == NULL) + continue; + sg = sg->next; +next_sg: + oldsg = sg; + sg = sg->next; + kfree(oldsg); + if (oldsg != sched_group_nodes[i]) + goto next_sg; + } + kfree(sched_group_nodes); + sched_group_nodes_bycpu[cpu] = NULL; + } +#endif + for_each_cpu_mask(cpu, *cpu_map) { + if (sched_group_phys_bycpu[cpu]) { + kfree(sched_group_phys_bycpu[cpu]); + sched_group_phys_bycpu[cpu] = NULL; + } +#ifdef CONFIG_SCHED_MC + if (sched_group_core_bycpu[cpu]) { + kfree(sched_group_core_bycpu[cpu]); + sched_group_core_bycpu[cpu] = NULL; + } +#endif + } +} + /* * Build sched domains for a given set of cpus and attach the sched domains * to the individual cpus */ -void build_sched_domains(const cpumask_t *cpu_map) +static int build_sched_domains(const cpumask_t *cpu_map) { int i; + struct sched_group *sched_group_phys = NULL; +#ifdef CONFIG_SCHED_MC + struct sched_group *sched_group_core = NULL; +#endif #ifdef CONFIG_NUMA struct sched_group **sched_group_nodes = NULL; struct sched_group *sched_group_allnodes = NULL; @@ -5888,11 +6435,11 @@ void build_sched_domains(const cpumask_t *cpu_map) /* * Allocate the per-node list of sched groups */ - sched_group_nodes = kmalloc(sizeof(struct sched_group*)*MAX_NUMNODES, - GFP_ATOMIC); + sched_group_nodes = kzalloc(sizeof(struct sched_group*)*MAX_NUMNODES, + GFP_KERNEL); if (!sched_group_nodes) { printk(KERN_WARNING "Can not alloc sched group node list\n"); - return; + return -ENOMEM; } sched_group_nodes_bycpu[first_cpu(*cpu_map)] = sched_group_nodes; #endif @@ -5918,7 +6465,7 @@ void build_sched_domains(const cpumask_t *cpu_map) if (!sched_group_allnodes) { printk(KERN_WARNING "Can not alloc allnodes sched group\n"); - break; + goto error; } sched_group_allnodes_bycpu[i] = sched_group_allnodes; @@ -5939,6 +6486,18 @@ void build_sched_domains(const cpumask_t *cpu_map) cpus_and(sd->span, sd->span, *cpu_map); #endif + if (!sched_group_phys) { + sched_group_phys + = kmalloc(sizeof(struct sched_group) * NR_CPUS, + GFP_KERNEL); + if (!sched_group_phys) { + printk (KERN_WARNING "Can not alloc phys sched" + "group\n"); + goto error; + } + sched_group_phys_bycpu[i] = sched_group_phys; + } + p = sd; sd = &per_cpu(phys_domains, i); group = cpu_to_phys_group(i); @@ -5948,6 +6507,18 @@ void build_sched_domains(const cpumask_t *cpu_map) sd->groups = &sched_group_phys[group]; #ifdef CONFIG_SCHED_MC + if (!sched_group_core) { + sched_group_core + = kmalloc(sizeof(struct sched_group) * NR_CPUS, + GFP_KERNEL); + if (!sched_group_core) { + printk (KERN_WARNING "Can not alloc core sched" + "group\n"); + goto error; + } + sched_group_core_bycpu[i] = sched_group_core; + } + p = sd; sd = &per_cpu(core_domains, i); group = cpu_to_core_group(i); @@ -6031,24 +6602,21 @@ void build_sched_domains(const cpumask_t *cpu_map) domainspan = sched_domain_node_span(i); cpus_and(domainspan, domainspan, *cpu_map); - sg = kmalloc(sizeof(struct sched_group), GFP_KERNEL); + sg = kmalloc_node(sizeof(struct sched_group), GFP_KERNEL, i); + if (!sg) { + printk(KERN_WARNING "Can not alloc domain group for " + "node %d\n", i); + goto error; + } sched_group_nodes[i] = sg; for_each_cpu_mask(j, nodemask) { struct sched_domain *sd; sd = &per_cpu(node_domains, j); sd->groups = sg; - if (sd->groups == NULL) { - /* Turn off balancing if we have no groups */ - sd->flags = 0; - } - } - if (!sg) { - printk(KERN_WARNING - "Can not alloc domain group for node %d\n", i); - continue; } sg->cpu_power = 0; sg->cpumask = nodemask; + sg->next = sg; cpus_or(covered, covered, nodemask); prev = sg; @@ -6067,54 +6635,90 @@ void build_sched_domains(const cpumask_t *cpu_map) if (cpus_empty(tmp)) continue; - sg = kmalloc(sizeof(struct sched_group), GFP_KERNEL); + sg = kmalloc_node(sizeof(struct sched_group), + GFP_KERNEL, i); if (!sg) { printk(KERN_WARNING "Can not alloc domain group for node %d\n", j); - break; + goto error; } sg->cpu_power = 0; sg->cpumask = tmp; + sg->next = prev->next; cpus_or(covered, covered, tmp); prev->next = sg; prev = sg; } - prev->next = sched_group_nodes[i]; } #endif /* Calculate CPU power for physical packages and nodes */ +#ifdef CONFIG_SCHED_SMT for_each_cpu_mask(i, *cpu_map) { - int power; struct sched_domain *sd; -#ifdef CONFIG_SCHED_SMT sd = &per_cpu(cpu_domains, i); - power = SCHED_LOAD_SCALE; - sd->groups->cpu_power = power; + sd->groups->cpu_power = SCHED_LOAD_SCALE; + } #endif #ifdef CONFIG_SCHED_MC + for_each_cpu_mask(i, *cpu_map) { + int power; + struct sched_domain *sd; sd = &per_cpu(core_domains, i); - power = SCHED_LOAD_SCALE + (cpus_weight(sd->groups->cpumask)-1) + if (sched_smt_power_savings) + power = SCHED_LOAD_SCALE * cpus_weight(sd->groups->cpumask); + else + power = SCHED_LOAD_SCALE + (cpus_weight(sd->groups->cpumask)-1) * SCHED_LOAD_SCALE / 10; sd->groups->cpu_power = power; + } +#endif + for_each_cpu_mask(i, *cpu_map) { + struct sched_domain *sd; +#ifdef CONFIG_SCHED_MC sd = &per_cpu(phys_domains, i); + if (i != first_cpu(sd->groups->cpumask)) + continue; - /* - * This has to be < 2 * SCHED_LOAD_SCALE - * Lets keep it SCHED_LOAD_SCALE, so that - * while calculating NUMA group's cpu_power - * we can simply do - * numa_group->cpu_power += phys_group->cpu_power; - * - * See "only add power once for each physical pkg" - * comment below - */ - sd->groups->cpu_power = SCHED_LOAD_SCALE; + sd->groups->cpu_power = 0; + if (sched_mc_power_savings || sched_smt_power_savings) { + int j; + + for_each_cpu_mask(j, sd->groups->cpumask) { + struct sched_domain *sd1; + sd1 = &per_cpu(core_domains, j); + /* + * for each core we will add once + * to the group in physical domain + */ + if (j != first_cpu(sd1->groups->cpumask)) + continue; + + if (sched_smt_power_savings) + sd->groups->cpu_power += sd1->groups->cpu_power; + else + sd->groups->cpu_power += SCHED_LOAD_SCALE; + } + } else + /* + * This has to be < 2 * SCHED_LOAD_SCALE + * Lets keep it SCHED_LOAD_SCALE, so that + * while calculating NUMA group's cpu_power + * we can simply do + * numa_group->cpu_power += phys_group->cpu_power; + * + * See "only add power once for each physical pkg" + * comment below + */ + sd->groups->cpu_power = SCHED_LOAD_SCALE; #else + int power; sd = &per_cpu(phys_domains, i); - power = SCHED_LOAD_SCALE + SCHED_LOAD_SCALE * - (cpus_weight(sd->groups->cpumask)-1) / 10; + if (sched_smt_power_savings) + power = SCHED_LOAD_SCALE * cpus_weight(sd->groups->cpumask); + else + power = SCHED_LOAD_SCALE; sd->groups->cpu_power = power; #endif } @@ -6123,7 +6727,12 @@ void build_sched_domains(const cpumask_t *cpu_map) for (i = 0; i < MAX_NUMNODES; i++) init_numa_sched_groups_power(sched_group_nodes[i]); - init_numa_sched_groups_power(sched_group_allnodes); + if (sched_group_allnodes) { + int group = cpu_to_allnodes_group(first_cpu(*cpu_map)); + struct sched_group *sg = &sched_group_allnodes[group]; + + init_numa_sched_groups_power(sg); + } #endif /* Attach the domains */ @@ -6142,13 +6751,20 @@ void build_sched_domains(const cpumask_t *cpu_map) * Tune cache-hot values: */ calibrate_migration_costs(cpu_map); + + return 0; + +error: + free_sched_groups(cpu_map); + return -ENOMEM; } /* * Set up scheduler domains and groups. Callers must hold the hotplug lock. */ -static void arch_init_sched_domains(const cpumask_t *cpu_map) +static int arch_init_sched_domains(const cpumask_t *cpu_map) { cpumask_t cpu_default_map; + int err; /* * Setup mask for cpus without special case scheduling requirements. @@ -6157,51 +6773,14 @@ static void arch_init_sched_domains(const cpumask_t *cpu_map) */ cpus_andnot(cpu_default_map, *cpu_map, cpu_isolated_map); - build_sched_domains(&cpu_default_map); + err = build_sched_domains(&cpu_default_map); + + return err; } static void arch_destroy_sched_domains(const cpumask_t *cpu_map) { -#ifdef CONFIG_NUMA - int i; - int cpu; - - for_each_cpu_mask(cpu, *cpu_map) { - struct sched_group *sched_group_allnodes - = sched_group_allnodes_bycpu[cpu]; - struct sched_group **sched_group_nodes - = sched_group_nodes_bycpu[cpu]; - - if (sched_group_allnodes) { - kfree(sched_group_allnodes); - sched_group_allnodes_bycpu[cpu] = NULL; - } - - if (!sched_group_nodes) - continue; - - for (i = 0; i < MAX_NUMNODES; i++) { - cpumask_t nodemask = node_to_cpumask(i); - struct sched_group *oldsg, *sg = sched_group_nodes[i]; - - cpus_and(nodemask, nodemask, *cpu_map); - if (cpus_empty(nodemask)) - continue; - - if (sg == NULL) - continue; - sg = sg->next; -next_sg: - oldsg = sg; - sg = sg->next; - kfree(oldsg); - if (oldsg != sched_group_nodes[i]) - goto next_sg; - } - kfree(sched_group_nodes); - sched_group_nodes_bycpu[cpu] = NULL; - } -#endif + free_sched_groups(cpu_map); } /* @@ -6226,9 +6805,10 @@ static void detach_destroy_domains(const cpumask_t *cpu_map) * correct sched domains * Call with hotplug lock held */ -void partition_sched_domains(cpumask_t *partition1, cpumask_t *partition2) +int partition_sched_domains(cpumask_t *partition1, cpumask_t *partition2) { cpumask_t change_map; + int err = 0; cpus_and(*partition1, *partition1, cpu_online_map); cpus_and(*partition2, *partition2, cpu_online_map); @@ -6237,10 +6817,89 @@ void partition_sched_domains(cpumask_t *partition1, cpumask_t *partition2) /* Detach sched domains from all of the affected cpus */ detach_destroy_domains(&change_map); if (!cpus_empty(*partition1)) - build_sched_domains(partition1); - if (!cpus_empty(*partition2)) - build_sched_domains(partition2); + err = build_sched_domains(partition1); + if (!err && !cpus_empty(*partition2)) + err = build_sched_domains(partition2); + + return err; +} + +#if defined(CONFIG_SCHED_MC) || defined(CONFIG_SCHED_SMT) +int arch_reinit_sched_domains(void) +{ + int err; + + lock_cpu_hotplug(); + detach_destroy_domains(&cpu_online_map); + err = arch_init_sched_domains(&cpu_online_map); + unlock_cpu_hotplug(); + + return err; +} + +static ssize_t sched_power_savings_store(const char *buf, size_t count, int smt) +{ + int ret; + + if (buf[0] != '0' && buf[0] != '1') + return -EINVAL; + + if (smt) + sched_smt_power_savings = (buf[0] == '1'); + else + sched_mc_power_savings = (buf[0] == '1'); + + ret = arch_reinit_sched_domains(); + + return ret ? ret : count; +} + +int sched_create_sysfs_power_savings_entries(struct sysdev_class *cls) +{ + int err = 0; + +#ifdef CONFIG_SCHED_SMT + if (smt_capable()) + err = sysfs_create_file(&cls->kset.kobj, + &attr_sched_smt_power_savings.attr); +#endif +#ifdef CONFIG_SCHED_MC + if (!err && mc_capable()) + err = sysfs_create_file(&cls->kset.kobj, + &attr_sched_mc_power_savings.attr); +#endif + return err; +} +#endif + +#ifdef CONFIG_SCHED_MC +static ssize_t sched_mc_power_savings_show(struct sys_device *dev, char *page) +{ + return sprintf(page, "%u\n", sched_mc_power_savings); +} +static ssize_t sched_mc_power_savings_store(struct sys_device *dev, + const char *buf, size_t count) +{ + return sched_power_savings_store(buf, count, 0); } +SYSDEV_ATTR(sched_mc_power_savings, 0644, sched_mc_power_savings_show, + sched_mc_power_savings_store); +#endif + +#ifdef CONFIG_SCHED_SMT +static ssize_t sched_smt_power_savings_show(struct sys_device *dev, char *page) +{ + return sprintf(page, "%u\n", sched_smt_power_savings); +} +static ssize_t sched_smt_power_savings_store(struct sys_device *dev, + const char *buf, size_t count) +{ + return sched_power_savings_store(buf, count, 1); +} +SYSDEV_ATTR(sched_smt_power_savings, 0644, sched_smt_power_savings_show, + sched_smt_power_savings_store); +#endif + #ifdef CONFIG_HOTPLUG_CPU /* @@ -6295,6 +6954,7 @@ int in_sched_functions(unsigned long addr) { /* Linker adds these: start and end of __sched functions */ extern char __sched_text_start[], __sched_text_end[]; + return in_lock_functions(addr) || (addr >= (unsigned long)__sched_text_start && addr < (unsigned long)__sched_text_end); @@ -6302,14 +6962,15 @@ int in_sched_functions(unsigned long addr) void __init sched_init(void) { - runqueue_t *rq; int i, j, k; for_each_possible_cpu(i) { - prio_array_t *array; + struct prio_array *array; + struct rq *rq; rq = cpu_rq(i); spin_lock_init(&rq->lock); + lockdep_set_class(&rq->lock, &rq->rq_lock_key); rq->nr_running = 0; rq->active = rq->arrays; rq->expired = rq->arrays + 1; @@ -6321,9 +6982,9 @@ void __init sched_init(void) rq->cpu_load[j] = 0; rq->active_balance = 0; rq->push_cpu = 0; + rq->cpu = i; rq->migration_thread = NULL; INIT_LIST_HEAD(&rq->migration_queue); - rq->cpu = i; #endif atomic_set(&rq->nr_iowait, 0); #ifdef CONFIG_VSERVER_HARDCPU @@ -6341,6 +7002,12 @@ void __init sched_init(void) } } + set_load_weight(&init_task); + +#ifdef CONFIG_RT_MUTEXES + plist_head_init(&init_task.pi_waiters, &init_task.pi_lock); +#endif + /* * The boot idle thread does lazy MMU switching as well: */ @@ -6359,7 +7026,7 @@ void __init sched_init(void) #ifdef CONFIG_DEBUG_SPINLOCK_SLEEP void __might_sleep(char *file, int line) { -#if defined(in_atomic) +#ifdef in_atomic static unsigned long prev_jiffy; /* ratelimiting */ if ((in_atomic() || irqs_disabled()) && @@ -6381,17 +7048,18 @@ EXPORT_SYMBOL(__might_sleep); #ifdef CONFIG_MAGIC_SYSRQ void normalize_rt_tasks(void) { + struct prio_array *array; struct task_struct *p; - prio_array_t *array; unsigned long flags; - runqueue_t *rq; + struct rq *rq; read_lock_irq(&tasklist_lock); - for_each_process (p) { + for_each_process(p) { if (!rt_task(p)) continue; - rq = task_rq_lock(p, &flags); + spin_lock_irqsave(&p->pi_lock, flags); + rq = __task_rq_lock(p); array = p->array; if (array) @@ -6403,7 +7071,8 @@ void normalize_rt_tasks(void) resched_task(rq->curr); } - task_rq_unlock(rq, &flags); + __task_rq_unlock(rq); + spin_unlock_irqrestore(&p->pi_lock, flags); } read_unlock_irq(&tasklist_lock); } @@ -6427,7 +7096,7 @@ void normalize_rt_tasks(void) * * ONLY VALID WHEN THE WHOLE SYSTEM IS STOPPED! */ -task_t *curr_task(int cpu) +struct task_struct *curr_task(int cpu) { return cpu_curr(cpu); } @@ -6447,7 +7116,7 @@ task_t *curr_task(int cpu) * * ONLY VALID WHEN THE WHOLE SYSTEM IS STOPPED! */ -void set_curr_task(int cpu, task_t *p) +void set_curr_task(int cpu, struct task_struct *p) { cpu_curr(cpu) = p; } diff --git a/kernel/signal.c b/kernel/signal.c index 2d4bae2f8..b25ab79a8 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -10,7 +10,6 @@ * to allow signals to be sent reliably. */ -#include #include #include #include @@ -21,15 +20,14 @@ #include #include #include -#include +#include #include -#include #include -#include #include #include #include #include +#include "audit.h" /* audit_signal_info() */ /* * SLAB caches for signal bits. @@ -161,12 +159,6 @@ static int sig_ignored(struct task_struct *t, int sig) { void __user * handler; - /* - * Tracers always want to know about signals.. - */ - if (t->ptrace & PT_PTRACED) - return 0; - /* * Blocked signals are never ignored, since the * signal handler may change by the time it is @@ -177,8 +169,12 @@ static int sig_ignored(struct task_struct *t, int sig) /* Is it explicitly or implicitly ignored? */ handler = t->sighand->action[sig-1].sa.sa_handler; - return handler == SIG_IGN || - (handler == SIG_DFL && sig_kernel_ignore(sig)); + if (handler != SIG_IGN && + (handler != SIG_DFL || !sig_kernel_ignore(sig))) + return 0; + + /* It's ignored, we can short-circuit unless a debugger wants it. */ + return !tracehook_consider_ignored_signal(t, sig, handler); } /* @@ -218,7 +214,8 @@ fastcall void recalc_sigpending_tsk(struct task_struct *t) if (t->signal->group_stop_count > 0 || (freezing(t)) || PENDING(&t->pending, &t->blocked) || - PENDING(&t->signal->shared_pending, &t->blocked)) + PENDING(&t->signal->shared_pending, &t->blocked) || + tracehook_induce_sigpending(t)) set_tsk_thread_flag(t, TIF_SIGPENDING); else clear_tsk_thread_flag(t, TIF_SIGPENDING); @@ -595,14 +592,12 @@ static int check_kill_permission(int sig, struct siginfo *info, if (user && !vx_check(vx_task_xid(t), VX_ADMIN|VX_IDENT)) return error; - error = security_task_kill(t, info, sig); + error = security_task_kill(t, info, sig, 0); if (!error) audit_signal_info(sig, t); /* Let audit system see the signal */ return error; } -/* forward decl */ -static void do_notify_parent_cldstop(struct task_struct *tsk, int why); /* * Handle magic process-wide effects of stop/continue signals. @@ -834,22 +829,31 @@ out: /* * Force a signal that the process can't ignore: if necessary * we unblock the signal and change any SIG_IGN to SIG_DFL. + * + * Note: If we unblock the signal, we always reset it to SIG_DFL, + * since we do not want to have a signal handler that was blocked + * be invoked when user space had explicitly blocked it. + * + * We don't want to have recursive SIGSEGV's etc, for example. */ - int force_sig_info(int sig, struct siginfo *info, struct task_struct *t) { unsigned long int flags; - int ret; + int ret, blocked, ignored; + struct k_sigaction *action; spin_lock_irqsave(&t->sighand->siglock, flags); - if (t->sighand->action[sig-1].sa.sa_handler == SIG_IGN) { - t->sighand->action[sig-1].sa.sa_handler = SIG_DFL; - } - if (sigismember(&t->blocked, sig)) { - sigdelset(&t->blocked, sig); + action = &t->sighand->action[sig-1]; + ignored = action->sa.sa_handler == SIG_IGN; + blocked = sigismember(&t->blocked, sig); + if (blocked || ignored) { + action->sa.sa_handler = SIG_DFL; + if (blocked) { + sigdelset(&t->blocked, sig); + recalc_sigpending_tsk(t); + } } - recalc_sigpending_tsk(t); ret = specific_send_sig_info(sig, info, t); spin_unlock_irqrestore(&t->sighand->siglock, flags); @@ -930,7 +934,7 @@ __group_complete_signal(int sig, struct task_struct *p) */ if (sig_fatal(p, sig) && !(p->signal->flags & SIGNAL_GROUP_EXIT) && !sigismember(&t->real_blocked, sig) && - (sig == SIGKILL || !(t->ptrace & PT_PTRACED))) { + (sig == SIGKILL || !tracehook_consider_fatal_signal(t, sig))) { /* * This signal will be fatal to the whole group. */ @@ -1139,7 +1143,7 @@ kill_proc_info(int sig, struct siginfo *info, pid_t pid) } p = find_task_by_pid(pid); error = -ESRCH; - if (p) + if (p && vx_check(vx_task_xid(p), VX_IDENT)) error = group_send_sig_info(sig, info, p); if (unlikely(acquired_tasklist_lock)) read_unlock(&tasklist_lock); @@ -1149,7 +1153,7 @@ kill_proc_info(int sig, struct siginfo *info, pid_t pid) /* like kill_proc_info(), but doesn't use uid/euid of "current" */ int kill_proc_info_as_uid(int sig, struct siginfo *info, pid_t pid, - uid_t uid, uid_t euid) + uid_t uid, uid_t euid, u32 secid) { int ret = -EINVAL; struct task_struct *p; @@ -1169,6 +1173,9 @@ int kill_proc_info_as_uid(int sig, struct siginfo *info, pid_t pid, ret = -EPERM; goto out_unlock; } + ret = security_task_kill(p, info, sig, secid); + if (ret) + goto out_unlock; if (sig && p->sighand) { unsigned long flags; spin_lock_irqsave(&p->sighand->siglock, flags); @@ -1198,7 +1205,8 @@ static int kill_something_info(int sig, struct siginfo *info, int pid) read_lock(&tasklist_lock); for_each_process(p) { - if (p->pid > 1 && p->tgid != current->tgid) { + if (vx_check(vx_task_xid(p), VX_ADMIN|VX_IDENT) && + p->pid > 1 && p->tgid != current->tgid) { int err = group_send_sig_info(sig, info, p); ++count; if (err != -EPERM) @@ -1469,8 +1477,7 @@ void do_notify_parent(struct task_struct *tsk, int sig) /* do_notify_parent_cldstop should have been called instead. */ BUG_ON(tsk->state & (TASK_STOPPED|TASK_TRACED)); - BUG_ON(!tsk->ptrace && - (tsk->group_leader != tsk || !thread_group_empty(tsk))); + BUG_ON(tsk->group_leader != tsk || !thread_group_empty(tsk)); info.si_signo = sig; info.si_errno = 0; @@ -1495,7 +1502,7 @@ void do_notify_parent(struct task_struct *tsk, int sig) psig = tsk->parent->sighand; spin_lock_irqsave(&psig->siglock, flags); - if (!tsk->ptrace && sig == SIGCHLD && + if (sig == SIGCHLD && (psig->action[SIGCHLD-1].sa.sa_handler == SIG_IGN || (psig->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDWAIT))) { /* @@ -1523,20 +1530,13 @@ void do_notify_parent(struct task_struct *tsk, int sig) spin_unlock_irqrestore(&psig->siglock, flags); } -static void do_notify_parent_cldstop(struct task_struct *tsk, int why) +void do_notify_parent_cldstop(struct task_struct *tsk, int why) { struct siginfo info; unsigned long flags; struct task_struct *parent; struct sighand_struct *sighand; - if (tsk->ptrace & PT_PTRACED) - parent = tsk->parent; - else { - tsk = tsk->group_leader; - parent = tsk->real_parent; - } - info.si_signo = SIGCHLD; info.si_errno = 0; info.si_pid = tsk->pid; @@ -1561,6 +1561,15 @@ static void do_notify_parent_cldstop(struct task_struct *tsk, int why) BUG(); } + /* + * Tracing can decide that we should not do the normal notification. + */ + if (tracehook_notify_cldstop(tsk, &info)) + return; + + tsk = tsk->group_leader; + parent = tsk->parent; + sighand = parent->sighand; spin_lock_irqsave(&sighand->siglock, flags); if (sighand->action[SIGCHLD-1].sa.sa_handler != SIG_IGN && @@ -1573,85 +1582,6 @@ static void do_notify_parent_cldstop(struct task_struct *tsk, int why) spin_unlock_irqrestore(&sighand->siglock, flags); } -/* - * This must be called with current->sighand->siglock held. - * - * This should be the path for all ptrace stops. - * We always set current->last_siginfo while stopped here. - * That makes it a way to test a stopped process for - * being ptrace-stopped vs being job-control-stopped. - * - * If we actually decide not to stop at all because the tracer is gone, - * we leave nostop_code in current->exit_code. - */ -static void ptrace_stop(int exit_code, int nostop_code, siginfo_t *info) -{ - /* - * If there is a group stop in progress, - * we must participate in the bookkeeping. - */ - if (current->signal->group_stop_count > 0) - --current->signal->group_stop_count; - - current->last_siginfo = info; - current->exit_code = exit_code; - - /* Let the debugger run. */ - set_current_state(TASK_TRACED); - spin_unlock_irq(¤t->sighand->siglock); - try_to_freeze(); - read_lock(&tasklist_lock); - if (likely(current->ptrace & PT_PTRACED) && - likely(current->parent != current->real_parent || - !(current->ptrace & PT_ATTACHED)) && - (likely(current->parent->signal != current->signal) || - !unlikely(current->signal->flags & SIGNAL_GROUP_EXIT))) { - do_notify_parent_cldstop(current, CLD_TRAPPED); - read_unlock(&tasklist_lock); - schedule(); - } else { - /* - * By the time we got the lock, our tracer went away. - * Don't stop here. - */ - read_unlock(&tasklist_lock); - set_current_state(TASK_RUNNING); - current->exit_code = nostop_code; - } - - /* - * We are back. Now reacquire the siglock before touching - * last_siginfo, so that we are sure to have synchronized with - * any signal-sending on another CPU that wants to examine it. - */ - spin_lock_irq(¤t->sighand->siglock); - current->last_siginfo = NULL; - - /* - * Queued signals ignored us while we were stopped for tracing. - * So check for any that we should take before resuming user mode. - */ - recalc_sigpending(); -} - -void ptrace_notify(int exit_code) -{ - siginfo_t info; - - BUG_ON((exit_code & (0x7f | ~0xffff)) != SIGTRAP); - - memset(&info, 0, sizeof info); - info.si_signo = SIGTRAP; - info.si_code = exit_code; - info.si_pid = current->pid; - info.si_uid = current->uid; - - /* Let the debugger run. */ - spin_lock_irq(¤t->sighand->siglock); - ptrace_stop(exit_code, 0, &info); - spin_unlock_irq(¤t->sighand->siglock); -} - static void finish_stop(int stop_count) { @@ -1660,7 +1590,7 @@ finish_stop(int stop_count) * a group stop in progress and we are the last to stop, * report to the parent. When ptraced, every thread reports itself. */ - if (stop_count == 0 || (current->ptrace & PT_PTRACED)) { + if (!tracehook_finish_stop(stop_count <= 0) && stop_count <= 0) { read_lock(&tasklist_lock); do_notify_parent_cldstop(current, CLD_STOPPED); read_unlock(&tasklist_lock); @@ -1785,49 +1715,24 @@ relock: handle_group_stop()) goto relock; - signr = dequeue_signal(current, mask, info); - - if (!signr) - break; /* will return 0 */ - - if ((signr == SIGSEGV) && print_fatal_signals) { - spin_unlock_irq(¤t->sighand->siglock); - print_fatal_signal(regs, signr); - spin_lock_irq(¤t->sighand->siglock); - } - if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) { - ptrace_signal_deliver(regs, cookie); - - /* Let the debugger run. */ - ptrace_stop(signr, signr, info); - - /* We're back. Did the debugger cancel the sig? */ - signr = current->exit_code; - if (signr == 0) - continue; - - current->exit_code = 0; - - /* Update the siginfo structure if the signal has - changed. If the debugger wanted something - specific in the siginfo structure then it should - have updated *info via PTRACE_SETSIGINFO. */ - if (signr != info->si_signo) { - info->si_signo = signr; - info->si_errno = 0; - info->si_code = SI_USER; - info->si_pid = current->parent->pid; - info->si_uid = current->parent->uid; - } - - /* If the (new) signal is now blocked, requeue it. */ - if (sigismember(¤t->blocked, signr)) { - specific_send_sig_info(signr, info, current); - continue; - } + /* + * Tracing can induce an artifical signal and choose sigaction. + * The return value in signr determines the default action, + * but info->si_signo is the signal number we will report. + */ + signr = tracehook_get_signal(current, regs, info, return_ka); + if (unlikely(signr < 0)) + goto relock; + if (unlikely(signr != 0)) + ka = return_ka; + else { + signr = dequeue_signal(current, mask, info); + + if (!signr) + break; /* will return 0 */ + ka = ¤t->sighand->action[signr-1]; } - ka = ¤t->sighand->action[signr-1]; if (ka->sa.sa_handler == SIG_IGN) /* Do nothing. */ continue; if (ka->sa.sa_handler != SIG_DFL) { @@ -1877,7 +1782,7 @@ relock: spin_lock_irq(¤t->sighand->siglock); } - if (likely(do_signal_stop(signr))) { + if (likely(do_signal_stop(info->si_signo))) { /* It released the siglock. */ goto relock; } @@ -1906,13 +1811,13 @@ relock: * first and our do_group_exit call below will use * that value and ignore the one we pass it. */ - do_coredump((long)signr, signr, regs); + do_coredump(info->si_signo, info->si_signo, regs); } /* * Death signals, no core dump. */ - do_group_exit(signr); + do_group_exit(info->si_signo); /* NOTREACHED */ } spin_unlock_irq(¤t->sighand->siglock); @@ -1925,7 +1830,6 @@ EXPORT_SYMBOL(flush_signals); EXPORT_SYMBOL(force_sig); EXPORT_SYMBOL(kill_pg); EXPORT_SYMBOL(kill_proc); -EXPORT_SYMBOL(ptrace_notify); EXPORT_SYMBOL(send_sig); EXPORT_SYMBOL(send_sig_info); EXPORT_SYMBOL(sigprocmask); diff --git a/kernel/softirq.c b/kernel/softirq.c index 336f92d64..87e835b59 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -17,6 +17,7 @@ #include #include #include +#include #include /* @@ -61,6 +62,137 @@ static inline void wakeup_softirqd(void) wake_up_process(tsk); } +/* + * This one is for softirq.c-internal use, + * where hardirqs are disabled legitimately: + */ +#ifdef CONFIG_TRACE_IRQFLAGS +static void __local_bh_disable(unsigned long ip) +{ + unsigned long flags; + + WARN_ON_ONCE(in_irq()); + + raw_local_irq_save(flags); + add_preempt_count(SOFTIRQ_OFFSET); + /* + * Were softirqs turned off above: + */ + if (softirq_count() == SOFTIRQ_OFFSET) + trace_softirqs_off(ip); + raw_local_irq_restore(flags); +} +#else /* !CONFIG_TRACE_IRQFLAGS */ +static inline void __local_bh_disable(unsigned long ip) +{ + add_preempt_count(SOFTIRQ_OFFSET); + barrier(); +} +#endif /* CONFIG_TRACE_IRQFLAGS */ + +void local_bh_disable(void) +{ + __local_bh_disable((unsigned long)__builtin_return_address(0)); +} + +EXPORT_SYMBOL(local_bh_disable); + +void __local_bh_enable(void) +{ + WARN_ON_ONCE(in_irq()); + + /* + * softirqs should never be enabled by __local_bh_enable(), + * it always nests inside local_bh_enable() sections: + */ + WARN_ON_ONCE(softirq_count() == SOFTIRQ_OFFSET); + + sub_preempt_count(SOFTIRQ_OFFSET); +} +EXPORT_SYMBOL_GPL(__local_bh_enable); + +/* + * Special-case - softirqs can safely be enabled in + * cond_resched_softirq(), or by __do_softirq(), + * without processing still-pending softirqs: + */ +void _local_bh_enable(void) +{ + WARN_ON_ONCE(in_irq()); + WARN_ON_ONCE(!irqs_disabled()); + + if (softirq_count() == SOFTIRQ_OFFSET) + trace_softirqs_on((unsigned long)__builtin_return_address(0)); + sub_preempt_count(SOFTIRQ_OFFSET); +} + +EXPORT_SYMBOL(_local_bh_enable); + +void local_bh_enable(void) +{ +#ifdef CONFIG_TRACE_IRQFLAGS + unsigned long flags; + + WARN_ON_ONCE(in_irq()); +#endif + WARN_ON_ONCE(irqs_disabled()); + +#ifdef CONFIG_TRACE_IRQFLAGS + local_irq_save(flags); +#endif + /* + * Are softirqs going to be turned on now: + */ + if (softirq_count() == SOFTIRQ_OFFSET) + trace_softirqs_on((unsigned long)__builtin_return_address(0)); + /* + * Keep preemption disabled until we are done with + * softirq processing: + */ + sub_preempt_count(SOFTIRQ_OFFSET - 1); + + if (unlikely(!in_interrupt() && local_softirq_pending())) + do_softirq(); + + dec_preempt_count(); +#ifdef CONFIG_TRACE_IRQFLAGS + local_irq_restore(flags); +#endif + preempt_check_resched(); +} +EXPORT_SYMBOL(local_bh_enable); + +void local_bh_enable_ip(unsigned long ip) +{ +#ifdef CONFIG_TRACE_IRQFLAGS + unsigned long flags; + + WARN_ON_ONCE(in_irq()); + + local_irq_save(flags); +#endif + /* + * Are softirqs going to be turned on now: + */ + if (softirq_count() == SOFTIRQ_OFFSET) + trace_softirqs_on(ip); + /* + * Keep preemption disabled until we are done with + * softirq processing: + */ + sub_preempt_count(SOFTIRQ_OFFSET - 1); + + if (unlikely(!in_interrupt() && local_softirq_pending())) + do_softirq(); + + dec_preempt_count(); +#ifdef CONFIG_TRACE_IRQFLAGS + local_irq_restore(flags); +#endif + preempt_check_resched(); +} +EXPORT_SYMBOL(local_bh_enable_ip); + /* * We restart softirq processing MAX_SOFTIRQ_RESTART times, * and we fall back to softirqd after that. @@ -74,14 +206,19 @@ static inline void wakeup_softirqd(void) asmlinkage void __do_softirq(void) { + struct vx_info_save vxis; struct softirq_action *h; __u32 pending; int max_restart = MAX_SOFTIRQ_RESTART; int cpu; pending = local_softirq_pending(); + account_system_vtime(current); + + __local_bh_disable((unsigned long)__builtin_return_address(0)); + __enter_vx_admin(&vxis); + trace_softirq_enter(); - local_bh_disable(); cpu = smp_processor_id(); restart: /* Reset the pending bitmask before enabling irqs */ @@ -109,7 +246,11 @@ restart: if (pending) wakeup_softirqd(); - __local_bh_enable(); + trace_softirq_exit(); + + __leave_vx_admin(&vxis); + account_system_vtime(current); + _local_bh_enable(); } #ifndef __ARCH_HAS_DO_SOFTIRQ @@ -136,23 +277,6 @@ EXPORT_SYMBOL(do_softirq); #endif -void local_bh_enable(void) -{ - WARN_ON(irqs_disabled()); - /* - * Keep preemption disabled until we are done with - * softirq processing: - */ - sub_preempt_count(SOFTIRQ_OFFSET - 1); - - if (unlikely(!in_interrupt() && local_softirq_pending())) - do_softirq(); - - dec_preempt_count(); - preempt_check_resched(); -} -EXPORT_SYMBOL(local_bh_enable); - #ifdef __ARCH_IRQ_EXIT_IRQS_DISABLED # define invoke_softirq() __do_softirq() #else @@ -165,6 +289,7 @@ EXPORT_SYMBOL(local_bh_enable); void irq_exit(void) { account_system_vtime(current); + trace_hardirq_exit(); sub_preempt_count(IRQ_EXIT_OFFSET); if (!in_interrupt() && local_softirq_pending()) invoke_softirq(); @@ -208,8 +333,6 @@ void open_softirq(int nr, void (*action)(struct softirq_action*), void *data) softirq_vec[nr].action = action; } -EXPORT_SYMBOL(open_softirq); - /* Tasklets */ struct tasklet_head { @@ -446,7 +569,7 @@ static void takeover_tasklets(unsigned int cpu) } #endif /* CONFIG_HOTPLUG_CPU */ -static int cpu_callback(struct notifier_block *nfb, +static int __cpuinit cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) { @@ -470,6 +593,8 @@ static int cpu_callback(struct notifier_block *nfb, break; #ifdef CONFIG_HOTPLUG_CPU case CPU_UP_CANCELED: + if (!per_cpu(ksoftirqd, hotcpu)) + break; /* Unbind so it can run. Fall thru. */ kthread_bind(per_cpu(ksoftirqd, hotcpu), any_online_cpu(cpu_online_map)); @@ -484,7 +609,7 @@ static int cpu_callback(struct notifier_block *nfb, return NOTIFY_OK; } -static struct notifier_block cpu_nfb = { +static struct notifier_block __cpuinitdata cpu_nfb = { .notifier_call = cpu_callback }; diff --git a/kernel/softlockup.c b/kernel/softlockup.c index 14c7faf02..03e6a2b0b 100644 --- a/kernel/softlockup.c +++ b/kernel/softlockup.c @@ -36,7 +36,7 @@ static struct notifier_block panic_block = { void touch_softlockup_watchdog(void) { - per_cpu(touch_timestamp, raw_smp_processor_id()) = jiffies; + __raw_get_cpu_var(touch_timestamp) = jiffies; } EXPORT_SYMBOL(touch_softlockup_watchdog); @@ -104,7 +104,7 @@ static int watchdog(void * __bind_cpu) /* * Create/destroy watchdog threads as CPUs come and go: */ -static int +static int __cpuinit cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) { int hotcpu = (unsigned long)hcpu; @@ -127,6 +127,8 @@ cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) break; #ifdef CONFIG_HOTPLUG_CPU case CPU_UP_CANCELED: + if (!per_cpu(watchdog_task, hotcpu)) + break; /* Unbind so it can run. Fall thru. */ kthread_bind(per_cpu(watchdog_task, hotcpu), any_online_cpu(cpu_online_map)); @@ -140,7 +142,7 @@ cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) return NOTIFY_OK; } -static struct notifier_block cpu_nfb = { +static struct notifier_block __cpuinitdata cpu_nfb = { .notifier_call = cpu_callback }; diff --git a/kernel/spinlock.c b/kernel/spinlock.c index d1b810782..fb524b009 100644 --- a/kernel/spinlock.c +++ b/kernel/spinlock.c @@ -9,11 +9,11 @@ * SMP and the DEBUG_SPINLOCK cases. (UP-nondebug inlines them) */ -#include #include #include #include #include +#include #include /* @@ -30,8 +30,10 @@ EXPORT_SYMBOL(generic__raw_read_trylock); int __lockfunc _spin_trylock(spinlock_t *lock) { preempt_disable(); - if (_raw_spin_trylock(lock)) + if (_raw_spin_trylock(lock)) { + spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); return 1; + } preempt_enable(); return 0; @@ -41,8 +43,10 @@ EXPORT_SYMBOL(_spin_trylock); int __lockfunc _read_trylock(rwlock_t *lock) { preempt_disable(); - if (_raw_read_trylock(lock)) + if (_raw_read_trylock(lock)) { + rwlock_acquire_read(&lock->dep_map, 0, 1, _RET_IP_); return 1; + } preempt_enable(); return 0; @@ -52,19 +56,28 @@ EXPORT_SYMBOL(_read_trylock); int __lockfunc _write_trylock(rwlock_t *lock) { preempt_disable(); - if (_raw_write_trylock(lock)) + if (_raw_write_trylock(lock)) { + rwlock_acquire(&lock->dep_map, 0, 1, _RET_IP_); return 1; + } preempt_enable(); return 0; } EXPORT_SYMBOL(_write_trylock); -#if !defined(CONFIG_PREEMPT) || !defined(CONFIG_SMP) +/* + * If lockdep is enabled then we use the non-preemption spin-ops + * even on CONFIG_PREEMPT, because lockdep assumes that interrupts are + * not re-enabled during lock-acquire (which the preempt-spin-ops do): + */ +#if !defined(CONFIG_PREEMPT) || !defined(CONFIG_SMP) || \ + defined(CONFIG_DEBUG_LOCK_ALLOC) void __lockfunc _read_lock(rwlock_t *lock) { preempt_disable(); + rwlock_acquire_read(&lock->dep_map, 0, 0, _RET_IP_); _raw_read_lock(lock); } EXPORT_SYMBOL(_read_lock); @@ -75,7 +88,17 @@ unsigned long __lockfunc _spin_lock_irqsave(spinlock_t *lock) local_irq_save(flags); preempt_disable(); + spin_acquire(&lock->dep_map, 0, 0, _RET_IP_); + /* + * On lockdep we dont want the hand-coded irq-enable of + * _raw_spin_lock_flags() code, because lockdep assumes + * that interrupts are not re-enabled during lock-acquire: + */ +#ifdef CONFIG_PROVE_LOCKING + _raw_spin_lock(lock); +#else _raw_spin_lock_flags(lock, &flags); +#endif return flags; } EXPORT_SYMBOL(_spin_lock_irqsave); @@ -84,6 +107,7 @@ void __lockfunc _spin_lock_irq(spinlock_t *lock) { local_irq_disable(); preempt_disable(); + spin_acquire(&lock->dep_map, 0, 0, _RET_IP_); _raw_spin_lock(lock); } EXPORT_SYMBOL(_spin_lock_irq); @@ -92,6 +116,7 @@ void __lockfunc _spin_lock_bh(spinlock_t *lock) { local_bh_disable(); preempt_disable(); + spin_acquire(&lock->dep_map, 0, 0, _RET_IP_); _raw_spin_lock(lock); } EXPORT_SYMBOL(_spin_lock_bh); @@ -102,6 +127,7 @@ unsigned long __lockfunc _read_lock_irqsave(rwlock_t *lock) local_irq_save(flags); preempt_disable(); + rwlock_acquire_read(&lock->dep_map, 0, 0, _RET_IP_); _raw_read_lock(lock); return flags; } @@ -111,6 +137,7 @@ void __lockfunc _read_lock_irq(rwlock_t *lock) { local_irq_disable(); preempt_disable(); + rwlock_acquire_read(&lock->dep_map, 0, 0, _RET_IP_); _raw_read_lock(lock); } EXPORT_SYMBOL(_read_lock_irq); @@ -119,6 +146,7 @@ void __lockfunc _read_lock_bh(rwlock_t *lock) { local_bh_disable(); preempt_disable(); + rwlock_acquire_read(&lock->dep_map, 0, 0, _RET_IP_); _raw_read_lock(lock); } EXPORT_SYMBOL(_read_lock_bh); @@ -129,6 +157,7 @@ unsigned long __lockfunc _write_lock_irqsave(rwlock_t *lock) local_irq_save(flags); preempt_disable(); + rwlock_acquire(&lock->dep_map, 0, 0, _RET_IP_); _raw_write_lock(lock); return flags; } @@ -138,6 +167,7 @@ void __lockfunc _write_lock_irq(rwlock_t *lock) { local_irq_disable(); preempt_disable(); + rwlock_acquire(&lock->dep_map, 0, 0, _RET_IP_); _raw_write_lock(lock); } EXPORT_SYMBOL(_write_lock_irq); @@ -146,6 +176,7 @@ void __lockfunc _write_lock_bh(rwlock_t *lock) { local_bh_disable(); preempt_disable(); + rwlock_acquire(&lock->dep_map, 0, 0, _RET_IP_); _raw_write_lock(lock); } EXPORT_SYMBOL(_write_lock_bh); @@ -153,6 +184,7 @@ EXPORT_SYMBOL(_write_lock_bh); void __lockfunc _spin_lock(spinlock_t *lock) { preempt_disable(); + spin_acquire(&lock->dep_map, 0, 0, _RET_IP_); _raw_spin_lock(lock); } @@ -161,6 +193,7 @@ EXPORT_SYMBOL(_spin_lock); void __lockfunc _write_lock(rwlock_t *lock) { preempt_disable(); + rwlock_acquire(&lock->dep_map, 0, 0, _RET_IP_); _raw_write_lock(lock); } @@ -256,8 +289,22 @@ BUILD_LOCK_OPS(write, rwlock); #endif /* CONFIG_PREEMPT */ +#ifdef CONFIG_DEBUG_LOCK_ALLOC + +void __lockfunc _spin_lock_nested(spinlock_t *lock, int subclass) +{ + preempt_disable(); + spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_); + _raw_spin_lock(lock); +} + +EXPORT_SYMBOL(_spin_lock_nested); + +#endif + void __lockfunc _spin_unlock(spinlock_t *lock) { + spin_release(&lock->dep_map, 1, _RET_IP_); _raw_spin_unlock(lock); preempt_enable(); } @@ -265,6 +312,7 @@ EXPORT_SYMBOL(_spin_unlock); void __lockfunc _write_unlock(rwlock_t *lock) { + rwlock_release(&lock->dep_map, 1, _RET_IP_); _raw_write_unlock(lock); preempt_enable(); } @@ -272,6 +320,7 @@ EXPORT_SYMBOL(_write_unlock); void __lockfunc _read_unlock(rwlock_t *lock) { + rwlock_release(&lock->dep_map, 1, _RET_IP_); _raw_read_unlock(lock); preempt_enable(); } @@ -279,6 +328,7 @@ EXPORT_SYMBOL(_read_unlock); void __lockfunc _spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags) { + spin_release(&lock->dep_map, 1, _RET_IP_); _raw_spin_unlock(lock); local_irq_restore(flags); preempt_enable(); @@ -287,6 +337,7 @@ EXPORT_SYMBOL(_spin_unlock_irqrestore); void __lockfunc _spin_unlock_irq(spinlock_t *lock) { + spin_release(&lock->dep_map, 1, _RET_IP_); _raw_spin_unlock(lock); local_irq_enable(); preempt_enable(); @@ -295,14 +346,16 @@ EXPORT_SYMBOL(_spin_unlock_irq); void __lockfunc _spin_unlock_bh(spinlock_t *lock) { + spin_release(&lock->dep_map, 1, _RET_IP_); _raw_spin_unlock(lock); preempt_enable_no_resched(); - local_bh_enable(); + local_bh_enable_ip((unsigned long)__builtin_return_address(0)); } EXPORT_SYMBOL(_spin_unlock_bh); void __lockfunc _read_unlock_irqrestore(rwlock_t *lock, unsigned long flags) { + rwlock_release(&lock->dep_map, 1, _RET_IP_); _raw_read_unlock(lock); local_irq_restore(flags); preempt_enable(); @@ -311,6 +364,7 @@ EXPORT_SYMBOL(_read_unlock_irqrestore); void __lockfunc _read_unlock_irq(rwlock_t *lock) { + rwlock_release(&lock->dep_map, 1, _RET_IP_); _raw_read_unlock(lock); local_irq_enable(); preempt_enable(); @@ -319,14 +373,16 @@ EXPORT_SYMBOL(_read_unlock_irq); void __lockfunc _read_unlock_bh(rwlock_t *lock) { + rwlock_release(&lock->dep_map, 1, _RET_IP_); _raw_read_unlock(lock); preempt_enable_no_resched(); - local_bh_enable(); + local_bh_enable_ip((unsigned long)__builtin_return_address(0)); } EXPORT_SYMBOL(_read_unlock_bh); void __lockfunc _write_unlock_irqrestore(rwlock_t *lock, unsigned long flags) { + rwlock_release(&lock->dep_map, 1, _RET_IP_); _raw_write_unlock(lock); local_irq_restore(flags); preempt_enable(); @@ -335,6 +391,7 @@ EXPORT_SYMBOL(_write_unlock_irqrestore); void __lockfunc _write_unlock_irq(rwlock_t *lock) { + rwlock_release(&lock->dep_map, 1, _RET_IP_); _raw_write_unlock(lock); local_irq_enable(); preempt_enable(); @@ -343,9 +400,10 @@ EXPORT_SYMBOL(_write_unlock_irq); void __lockfunc _write_unlock_bh(rwlock_t *lock) { + rwlock_release(&lock->dep_map, 1, _RET_IP_); _raw_write_unlock(lock); preempt_enable_no_resched(); - local_bh_enable(); + local_bh_enable_ip((unsigned long)__builtin_return_address(0)); } EXPORT_SYMBOL(_write_unlock_bh); @@ -353,11 +411,13 @@ int __lockfunc _spin_trylock_bh(spinlock_t *lock) { local_bh_disable(); preempt_disable(); - if (_raw_spin_trylock(lock)) + if (_raw_spin_trylock(lock)) { + spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); return 1; + } preempt_enable_no_resched(); - local_bh_enable(); + local_bh_enable_ip((unsigned long)__builtin_return_address(0)); return 0; } EXPORT_SYMBOL(_spin_trylock_bh); diff --git a/kernel/sys.c b/kernel/sys.c index d377de555..ca7ce5228 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -4,7 +4,6 @@ * Copyright (C) 1991, 1992 Linus Torvalds */ -#include #include #include #include @@ -14,7 +13,6 @@ #include #include #include -#include #include #include #include @@ -59,6 +57,12 @@ #ifndef GET_FPEXC_CTL # define GET_FPEXC_CTL(a,b) (-EINVAL) #endif +#ifndef GET_ENDIAN +# define GET_ENDIAN(a,b) (-EINVAL) +#endif +#ifndef SET_ENDIAN +# define SET_ENDIAN(a,b) (-EINVAL) +#endif /* * this is where the system-wide overflow UID and GID are defined, for @@ -134,14 +138,15 @@ static int __kprobes notifier_call_chain(struct notifier_block **nl, unsigned long val, void *v) { int ret = NOTIFY_DONE; - struct notifier_block *nb; + struct notifier_block *nb, *next_nb; nb = rcu_dereference(*nl); while (nb) { + next_nb = rcu_dereference(nb->next); ret = nb->notifier_call(nb, val, v); if ((ret & NOTIFY_STOP_MASK) == NOTIFY_STOP_MASK) break; - nb = rcu_dereference(nb->next); + nb = next_nb; } return ret; } @@ -590,7 +595,7 @@ void emergency_restart(void) } EXPORT_SYMBOL_GPL(emergency_restart); -void kernel_restart_prepare(char *cmd) +static void kernel_restart_prepare(char *cmd) { blocking_notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd); system_state = SYSTEM_RESTART; @@ -624,7 +629,7 @@ EXPORT_SYMBOL_GPL(kernel_restart); * Move into place and start executing a preloaded standalone * executable. If nothing was preloaded return an error. */ -void kernel_kexec(void) +static void kernel_kexec(void) { #ifdef CONFIG_KEXEC struct kimage *image; @@ -638,7 +643,6 @@ void kernel_kexec(void) machine_kexec(image); #endif } -EXPORT_SYMBOL_GPL(kernel_kexec); void kernel_shutdown_prepare(enum system_states state) { @@ -1286,7 +1290,7 @@ asmlinkage long sys_setpgid(pid_t pid, pid_t pgid) if (!thread_group_leader(p)) goto out; - if (p->real_parent == group_leader) { + if (p->parent == group_leader) { err = -EPERM; if (p->signal->session != group_leader->signal->session) goto out; @@ -1882,23 +1886,20 @@ out: * fields when reaping, so a sample either gets all the additions of a * given child after it's reaped, or none so this sample is before reaping. * - * tasklist_lock locking optimisation: - * If we are current and single threaded, we do not need to take the tasklist - * lock or the siglock. No one else can take our signal_struct away, - * no one else can reap the children to update signal->c* counters, and - * no one else can race with the signal-> fields. - * If we do not take the tasklist_lock, the signal-> fields could be read - * out of order while another thread was just exiting. So we place a - * read memory barrier when we avoid the lock. On the writer side, - * write memory barrier is implied in __exit_signal as __exit_signal releases - * the siglock spinlock after updating the signal-> fields. - * - * We don't really need the siglock when we access the non c* fields - * of the signal_struct (for RUSAGE_SELF) even in multithreaded - * case, since we take the tasklist lock for read and the non c* signal-> - * fields are updated only in __exit_signal, which is called with - * tasklist_lock taken for write, hence these two threads cannot execute - * concurrently. + * Locking: + * We need to take the siglock for CHILDEREN, SELF and BOTH + * for the cases current multithreaded, non-current single threaded + * non-current multithreaded. Thread traversal is now safe with + * the siglock held. + * Strictly speaking, we donot need to take the siglock if we are current and + * single threaded, as no one else can take our signal_struct away, no one + * else can reap the children to update signal->c* counters, and no one else + * can race with the signal-> fields. If we do not take any lock, the + * signal-> fields could be read out of order while another thread was just + * exiting. So we should place a read memory barrier when we avoid the lock. + * On the writer side, write memory barrier is implied in __exit_signal + * as __exit_signal releases the siglock spinlock after updating the signal-> + * fields. But we don't do this yet to keep things simple. * */ @@ -1907,35 +1908,25 @@ static void k_getrusage(struct task_struct *p, int who, struct rusage *r) struct task_struct *t; unsigned long flags; cputime_t utime, stime; - int need_lock = 0; memset((char *) r, 0, sizeof *r); utime = stime = cputime_zero; - if (p != current || !thread_group_empty(p)) - need_lock = 1; - - if (need_lock) { - read_lock(&tasklist_lock); - if (unlikely(!p->signal)) { - read_unlock(&tasklist_lock); - return; - } - } else - /* See locking comments above */ - smp_rmb(); + rcu_read_lock(); + if (!lock_task_sighand(p, &flags)) { + rcu_read_unlock(); + return; + } switch (who) { case RUSAGE_BOTH: case RUSAGE_CHILDREN: - spin_lock_irqsave(&p->sighand->siglock, flags); utime = p->signal->cutime; stime = p->signal->cstime; r->ru_nvcsw = p->signal->cnvcsw; r->ru_nivcsw = p->signal->cnivcsw; r->ru_minflt = p->signal->cmin_flt; r->ru_majflt = p->signal->cmaj_flt; - spin_unlock_irqrestore(&p->sighand->siglock, flags); if (who == RUSAGE_CHILDREN) break; @@ -1963,8 +1954,9 @@ static void k_getrusage(struct task_struct *p, int who, struct rusage *r) BUG(); } - if (need_lock) - read_unlock(&tasklist_lock); + unlock_task_sighand(p, &flags); + rcu_read_unlock(); + cputime_to_timeval(utime, &r->ru_utime); cputime_to_timeval(stime, &r->ru_stime); } @@ -2079,6 +2071,13 @@ asmlinkage long sys_prctl(int option, unsigned long arg2, unsigned long arg3, return -EFAULT; return 0; } + case PR_GET_ENDIAN: + error = GET_ENDIAN(current, arg2); + break; + case PR_SET_ENDIAN: + error = SET_ENDIAN(current, arg2); + break; + default: error = -EINVAL; break; diff --git a/kernel/sys_ni.c b/kernel/sys_ni.c index 543319504..6991bece6 100644 --- a/kernel/sys_ni.c +++ b/kernel/sys_ni.c @@ -87,6 +87,7 @@ cond_syscall(sys_inotify_init); cond_syscall(sys_inotify_add_watch); cond_syscall(sys_inotify_rm_watch); cond_syscall(sys_migrate_pages); +cond_syscall(sys_move_pages); cond_syscall(sys_chown16); cond_syscall(sys_fchown16); cond_syscall(sys_getegid16); @@ -132,3 +133,4 @@ cond_syscall(sys_mincore); cond_syscall(sys_madvise); cond_syscall(sys_mremap); cond_syscall(sys_remap_file_pages); +cond_syscall(compat_sys_move_pages); diff --git a/kernel/sysctl.c b/kernel/sysctl.c index e357044a5..95a6d7f70 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -18,7 +18,6 @@ * Removed it and replaced it with older style, 03/23/00, Bill Wendling */ -#include #include #include #include @@ -60,6 +59,7 @@ extern int proc_nr_files(ctl_table *table, int write, struct file *filp, extern int C_A_D; extern int sysctl_overcommit_memory; extern int sysctl_overcommit_ratio; +extern int sysctl_panic_on_oom; extern int max_threads; extern int sysrq_enabled; extern int core_uses_pid; @@ -73,6 +73,7 @@ extern int printk_ratelimit_burst; extern int pid_max_min, pid_max_max; extern int sysctl_drop_caches; extern int percpu_pagelist_fraction; +extern int compat_log; #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86) int unknown_nmi_panic; @@ -82,16 +83,15 @@ extern int proc_unknown_nmi_panic(ctl_table *, int, struct file *, extern unsigned int vdso_enabled, vdso_populate; -int exec_shield = (1<<3) | (1<<0); +int exec_shield = (1<<0); /* exec_shield is a bitmask: 0: off; vdso at STACK_TOP, 1 page below TASK_SIZE (1<<0) 1: on [also on if !=0] - (1<<1) 2: noexecstack by default + (1<<1) 2: force noexecstack regardless of PT_GNU_STACK + The old settings (1<<2) 4: vdso just below .text of main (unless too low) (1<<3) 8: vdso just below .text of PT_INTERP (unless too low) -Yes, vdso placement is overloaded here; but exec_shield off -is a strong incentive to place vdso at STACK_TOP, so the bit -for vdso just below .text comes along for the ride. + are ignored because the vdso is placed completely randomly */ static int __init setup_exec_shield(char *str) @@ -156,6 +156,10 @@ extern int acct_parm[]; extern int no_unaligned_warning; #endif +#ifdef CONFIG_RT_MUTEXES +extern int max_lock_depth; +#endif + static int parse_table(int __user *, int, void __user *, size_t __user *, void __user *, size_t, ctl_table *, void **); static int proc_doutsstring(ctl_table *table, int write, struct file *filp, @@ -167,7 +171,6 @@ static struct ctl_table_header root_table_header = static ctl_table kern_table[]; static ctl_table vm_table[]; -static ctl_table proc_table[]; static ctl_table fs_table[]; static ctl_table debug_table[]; static ctl_table dev_table[]; @@ -175,7 +178,7 @@ extern ctl_table random_table[]; #ifdef CONFIG_UNIX98_PTYS extern ctl_table pty_table[]; #endif -#ifdef CONFIG_INOTIFY +#ifdef CONFIG_INOTIFY_USER extern ctl_table inotify_table[]; #endif @@ -226,12 +229,6 @@ static ctl_table root_table[] = { .child = net_table, }, #endif - { - .ctl_name = CTL_PROC, - .procname = "proc", - .mode = 0555, - .child = proc_table, - }, { .ctl_name = CTL_FS, .procname = "fs", @@ -462,7 +459,7 @@ static ctl_table kern_table[] = { .strategy = &sysctl_string, }, #endif -#ifdef CONFIG_HOTPLUG +#if defined(CONFIG_HOTPLUG) && defined(CONFIG_NET) { .ctl_name = KERN_HOTPLUG, .procname = "hotplug", @@ -756,6 +753,27 @@ static ctl_table kern_table[] = { .proc_handler = &proc_dointvec, }, #endif +#ifdef CONFIG_COMPAT + { + .ctl_name = KERN_COMPAT_LOG, + .procname = "compat-log", + .data = &compat_log, + .maxlen = sizeof (int), + .mode = 0644, + .proc_handler = &proc_dointvec, + }, +#endif +#ifdef CONFIG_RT_MUTEXES + { + .ctl_name = KERN_MAX_LOCK_DEPTH, + .procname = "max_lock_depth", + .data = &max_lock_depth, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + }, +#endif + { .ctl_name = 0 } }; @@ -774,6 +792,14 @@ static ctl_table vm_table[] = { .mode = 0644, .proc_handler = &proc_dointvec, }, + { + .ctl_name = VM_PANIC_ON_OOM, + .procname = "panic_on_oom", + .data = &sysctl_panic_on_oom, + .maxlen = sizeof(sysctl_panic_on_oom), + .mode = 0644, + .proc_handler = &proc_dointvec, + }, { .ctl_name = VM_OVERCOMMIT_RATIO, .procname = "overcommit_ratio", @@ -979,19 +1005,40 @@ static ctl_table vm_table[] = { .extra1 = &zero, }, { - .ctl_name = VM_ZONE_RECLAIM_INTERVAL, - .procname = "zone_reclaim_interval", - .data = &zone_reclaim_interval, - .maxlen = sizeof(zone_reclaim_interval), + .ctl_name = VM_MIN_UNMAPPED, + .procname = "min_unmapped_ratio", + .data = &sysctl_min_unmapped_ratio, + .maxlen = sizeof(sysctl_min_unmapped_ratio), .mode = 0644, - .proc_handler = &proc_dointvec_jiffies, - .strategy = &sysctl_jiffies, + .proc_handler = &sysctl_min_unmapped_ratio_sysctl_handler, + .strategy = &sysctl_intvec, + .extra1 = &zero, + .extra2 = &one_hundred, + }, + { + .ctl_name = VM_MIN_SLAB, + .procname = "min_slab_ratio", + .data = &sysctl_min_slab_ratio, + .maxlen = sizeof(sysctl_min_slab_ratio), + .mode = 0644, + .proc_handler = &sysctl_min_slab_ratio_sysctl_handler, + .strategy = &sysctl_intvec, + .extra1 = &zero, + .extra2 = &one_hundred, + }, +#endif +#ifdef CONFIG_X86_32 + { + .ctl_name = VM_VDSO_ENABLED, + .procname = "vdso_enabled", + .data = &vdso_enabled, + .maxlen = sizeof(vdso_enabled), + .mode = 0644, + .proc_handler = &proc_dointvec, + .strategy = &sysctl_intvec, + .extra1 = &zero, }, #endif - { .ctl_name = 0 } -}; - -static ctl_table proc_table[] = { { .ctl_name = 0 } }; @@ -1101,7 +1148,7 @@ static ctl_table fs_table[] = { .mode = 0644, .proc_handler = &proc_doulongvec_minmax, }, -#ifdef CONFIG_INOTIFY +#ifdef CONFIG_INOTIFY_USER { .ctl_name = FS_INOTIFY, .procname = "inotify", diff --git a/kernel/time.c b/kernel/time.c index b00ddc71c..1ea60b2d0 100644 --- a/kernel/time.c +++ b/kernel/time.c @@ -207,6 +207,8 @@ asmlinkage long sys_settimeofday(struct timeval __user *tv, */ void __attribute__ ((weak)) notify_arch_cmos_timer(void) { + /* Workaround http://gcc.gnu.org/PR27781 */ + asm volatile (""); return; } @@ -523,6 +525,7 @@ EXPORT_SYMBOL(do_gettimeofday); #else +#ifndef CONFIG_GENERIC_TIME /* * Simulate gettimeofday using do_gettimeofday which only allows a timeval * and therefore only yields usec accuracy @@ -537,6 +540,7 @@ void getnstimeofday(struct timespec *tv) } EXPORT_SYMBOL_GPL(getnstimeofday); #endif +#endif /* Converts Gregorian date to seconds since 1970-01-01 00:00:00. * Assumes input in normal date format, i.e. 1980-12-31 23:59:59 diff --git a/kernel/timer.c b/kernel/timer.c index 20a4bca5e..a9d5871c3 100644 --- a/kernel/timer.c +++ b/kernel/timer.c @@ -86,7 +86,7 @@ typedef struct tvec_t_base_s tvec_base_t; tvec_base_t boot_tvec_bases; EXPORT_SYMBOL(boot_tvec_bases); -static DEFINE_PER_CPU(tvec_base_t *, tvec_bases) = { &boot_tvec_bases }; +static DEFINE_PER_CPU(tvec_base_t *, tvec_bases) = &boot_tvec_bases; static inline void set_running_timer(tvec_base_t *base, struct timer_list *timer) @@ -148,7 +148,7 @@ static void internal_add_timer(tvec_base_t *base, struct timer_list *timer) void fastcall init_timer(struct timer_list *timer) { timer->entry.next = NULL; - timer->base = per_cpu(tvec_bases, raw_smp_processor_id()); + timer->base = __raw_get_cpu_var(tvec_bases); } EXPORT_SYMBOL(init_timer); @@ -376,6 +376,7 @@ int del_timer_sync(struct timer_list *timer) int ret = try_to_del_timer_sync(timer); if (ret >= 0) return ret; + cpu_relax(); } } @@ -385,23 +386,19 @@ EXPORT_SYMBOL(del_timer_sync); static int cascade(tvec_base_t *base, tvec_t *tv, int index) { /* cascade all the timers from tv up one level */ - struct list_head *head, *curr; + struct timer_list *timer, *tmp; + struct list_head tv_list; + + list_replace_init(tv->vec + index, &tv_list); - head = tv->vec + index; - curr = head->next; /* - * We are removing _all_ timers from the list, so we don't have to - * detach them individually, just clear the list afterwards. + * We are removing _all_ timers from the list, so we + * don't have to detach them individually. */ - while (curr != head) { - struct timer_list *tmp; - - tmp = list_entry(curr, struct timer_list, entry); - BUG_ON(tmp->base != base); - curr = curr->next; - internal_add_timer(base, tmp); + list_for_each_entry_safe(timer, tmp, &tv_list, entry) { + BUG_ON(timer->base != base); + internal_add_timer(base, timer); } - INIT_LIST_HEAD(head); return index; } @@ -413,7 +410,7 @@ static int cascade(tvec_base_t *base, tvec_t *tv, int index) * This function cascades all vectors and executes all expired timer * vectors. */ -#define INDEX(N) (base->timer_jiffies >> (TVR_BITS + N * TVN_BITS)) & TVN_MASK +#define INDEX(N) ((base->timer_jiffies >> (TVR_BITS + (N) * TVN_BITS)) & TVN_MASK) static inline void __run_timers(tvec_base_t *base) { @@ -421,10 +418,10 @@ static inline void __run_timers(tvec_base_t *base) spin_lock_irq(&base->lock); while (time_after_eq(jiffies, base->timer_jiffies)) { - struct list_head work_list = LIST_HEAD_INIT(work_list); + struct list_head work_list; struct list_head *head = &work_list; int index = base->timer_jiffies & TVR_MASK; - + /* * Cascade timers: */ @@ -433,8 +430,8 @@ static inline void __run_timers(tvec_base_t *base) (!cascade(base, &base->tv3, INDEX(1))) && !cascade(base, &base->tv4, INDEX(2))) cascade(base, &base->tv5, INDEX(3)); - ++base->timer_jiffies; - list_splice_init(base->tv1.vec + index, &work_list); + ++base->timer_jiffies; + list_replace_init(base->tv1.vec + index, &work_list); while (!list_empty(head)) { void (*fn)(unsigned long); unsigned long data; @@ -543,22 +540,6 @@ found: } spin_unlock(&base->lock); - /* - * It can happen that other CPUs service timer IRQs and increment - * jiffies, but we have not yet got a local timer tick to process - * the timer wheels. In that case, the expiry time can be before - * jiffies, but since the high-resolution timer here is relative to - * jiffies, the default expression when high-resolution timers are - * not active, - * - * time_before(MAX_JIFFY_OFFSET + jiffies, expires) - * - * would falsely evaluate to true. If that is the case, just - * return jiffies so that we can immediately fire the local timer - */ - if (time_before(expires, jiffies)) - return jiffies; - /* * It can happen that other CPUs service timer IRQs and increment * jiffies, but we have not yet got a local timer tick to process @@ -619,7 +600,6 @@ long time_tolerance = MAXFREQ; /* frequency tolerance (ppm) */ long time_precision = 1; /* clock precision (us) */ long time_maxerror = NTP_PHASE_LIMIT; /* maximum error (us) */ long time_esterror = NTP_PHASE_LIMIT; /* estimated error (us) */ -static long time_phase; /* phase offset (scaled us) */ long time_freq = (((NSEC_PER_SEC + HZ/2) % HZ - HZ/2) << SHIFT_USEC) / NSEC_PER_USEC; /* frequency offset (scaled ppm)*/ static long time_adj; /* tick adjust (scaled 1 / HZ) */ @@ -769,27 +749,14 @@ static long adjtime_adjustment(void) } /* in the NTP reference this is called "hardclock()" */ -static void update_wall_time_one_tick(void) +static void update_ntp_one_tick(void) { - long time_adjust_step, delta_nsec; + long time_adjust_step; time_adjust_step = adjtime_adjustment(); if (time_adjust_step) /* Reduce by this step the amount of time left */ time_adjust -= time_adjust_step; - delta_nsec = tick_nsec + time_adjust_step * 1000; - /* - * Advance the phase, once it gets to one microsecond, then - * advance the tick more. - */ - time_phase += time_adj; - if ((time_phase >= FINENSEC) || (time_phase <= -FINENSEC)) { - long ltemp = shift_right(time_phase, (SHIFT_SCALE - 10)); - time_phase -= ltemp << (SHIFT_SCALE - 10); - delta_nsec += ltemp; - } - xtime.tv_nsec += delta_nsec; - time_interpolator_update(delta_nsec); /* Changes by adjtime() do not take effect till next tick. */ if (time_next_adjust != 0) { @@ -802,36 +769,404 @@ static void update_wall_time_one_tick(void) * Return how long ticks are at the moment, that is, how much time * update_wall_time_one_tick will add to xtime next time we call it * (assuming no calls to do_adjtimex in the meantime). - * The return value is in fixed-point nanoseconds with SHIFT_SCALE-10 - * bits to the right of the binary point. + * The return value is in fixed-point nanoseconds shifted by the + * specified number of bits to the right of the binary point. * This function has no side-effects. */ u64 current_tick_length(void) { long delta_nsec; + u64 ret; + /* calculate the finest interval NTP will allow. + * ie: nanosecond value shifted by (SHIFT_SCALE - 10) + */ delta_nsec = tick_nsec + adjtime_adjustment() * 1000; - return ((u64) delta_nsec << (SHIFT_SCALE - 10)) + time_adj; + ret = (u64)delta_nsec << TICK_LENGTH_SHIFT; + ret += (s64)time_adj << (TICK_LENGTH_SHIFT - (SHIFT_SCALE - 10)); + + return ret; } -/* - * Using a loop looks inefficient, but "ticks" is - * usually just one (we shouldn't be losing ticks, - * we're doing this this way mainly for interrupt - * latency reasons, not because we think we'll - * have lots of lost timer ticks +/* XXX - all of this timekeeping code should be later moved to time.c */ +#include +static struct clocksource *clock; /* pointer to current clocksource */ + +#ifdef CONFIG_GENERIC_TIME +/** + * __get_nsec_offset - Returns nanoseconds since last call to periodic_hook + * + * private function, must hold xtime_lock lock when being + * called. Returns the number of nanoseconds since the + * last call to update_wall_time() (adjusted by NTP scaling) + */ +static inline s64 __get_nsec_offset(void) +{ + cycle_t cycle_now, cycle_delta; + s64 ns_offset; + + /* read clocksource: */ + cycle_now = clocksource_read(clock); + + /* calculate the delta since the last update_wall_time: */ + cycle_delta = (cycle_now - clock->cycle_last) & clock->mask; + + /* convert to nanoseconds: */ + ns_offset = cyc2ns(clock, cycle_delta); + + return ns_offset; +} + +/** + * __get_realtime_clock_ts - Returns the time of day in a timespec + * @ts: pointer to the timespec to be set + * + * Returns the time of day in a timespec. Used by + * do_gettimeofday() and get_realtime_clock_ts(). */ -static void update_wall_time(unsigned long ticks) +static inline void __get_realtime_clock_ts(struct timespec *ts) { + unsigned long seq; + s64 nsecs; + do { - ticks--; - update_wall_time_one_tick(); - if (xtime.tv_nsec >= 1000000000) { - xtime.tv_nsec -= 1000000000; + seq = read_seqbegin(&xtime_lock); + + *ts = xtime; + nsecs = __get_nsec_offset(); + + } while (read_seqretry(&xtime_lock, seq)); + + timespec_add_ns(ts, nsecs); +} + +/** + * getnstimeofday - Returns the time of day in a timespec + * @ts: pointer to the timespec to be set + * + * Returns the time of day in a timespec. + */ +void getnstimeofday(struct timespec *ts) +{ + __get_realtime_clock_ts(ts); +} + +EXPORT_SYMBOL(getnstimeofday); + +/** + * do_gettimeofday - Returns the time of day in a timeval + * @tv: pointer to the timeval to be set + * + * NOTE: Users should be converted to using get_realtime_clock_ts() + */ +void do_gettimeofday(struct timeval *tv) +{ + struct timespec now; + + __get_realtime_clock_ts(&now); + tv->tv_sec = now.tv_sec; + tv->tv_usec = now.tv_nsec/1000; +} + +EXPORT_SYMBOL(do_gettimeofday); +/** + * do_settimeofday - Sets the time of day + * @tv: pointer to the timespec variable containing the new time + * + * Sets the time of day to the new time and update NTP and notify hrtimers + */ +int do_settimeofday(struct timespec *tv) +{ + unsigned long flags; + time_t wtm_sec, sec = tv->tv_sec; + long wtm_nsec, nsec = tv->tv_nsec; + + if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC) + return -EINVAL; + + write_seqlock_irqsave(&xtime_lock, flags); + + nsec -= __get_nsec_offset(); + + wtm_sec = wall_to_monotonic.tv_sec + (xtime.tv_sec - sec); + wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - nsec); + + set_normalized_timespec(&xtime, sec, nsec); + set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec); + + clock->error = 0; + ntp_clear(); + + write_sequnlock_irqrestore(&xtime_lock, flags); + + /* signal hrtimers about time change */ + clock_was_set(); + + return 0; +} + +EXPORT_SYMBOL(do_settimeofday); + +/** + * change_clocksource - Swaps clocksources if a new one is available + * + * Accumulates current time interval and initializes new clocksource + */ +static int change_clocksource(void) +{ + struct clocksource *new; + cycle_t now; + u64 nsec; + new = clocksource_get_next(); + if (clock != new) { + now = clocksource_read(new); + nsec = __get_nsec_offset(); + timespec_add_ns(&xtime, nsec); + + clock = new; + clock->cycle_last = now; + printk(KERN_INFO "Time: %s clocksource has been installed.\n", + clock->name); + return 1; + } else if (clock->update_callback) { + return clock->update_callback(); + } + return 0; +} +#else +#define change_clocksource() (0) +#endif + +/** + * timeofday_is_continuous - check to see if timekeeping is free running + */ +int timekeeping_is_continuous(void) +{ + unsigned long seq; + int ret; + + do { + seq = read_seqbegin(&xtime_lock); + + ret = clock->is_continuous; + + } while (read_seqretry(&xtime_lock, seq)); + + return ret; +} + +/* + * timekeeping_init - Initializes the clocksource and common timekeeping values + */ +void __init timekeeping_init(void) +{ + unsigned long flags; + + write_seqlock_irqsave(&xtime_lock, flags); + clock = clocksource_get_next(); + clocksource_calculate_interval(clock, tick_nsec); + clock->cycle_last = clocksource_read(clock); + ntp_clear(); + write_sequnlock_irqrestore(&xtime_lock, flags); +} + + +static int timekeeping_suspended; +/* + * timekeeping_resume - Resumes the generic timekeeping subsystem. + * @dev: unused + * + * This is for the generic clocksource timekeeping. + * xtime/wall_to_monotonic/jiffies/wall_jiffies/etc are + * still managed by arch specific suspend/resume code. + */ +static int timekeeping_resume(struct sys_device *dev) +{ + unsigned long flags; + + write_seqlock_irqsave(&xtime_lock, flags); + /* restart the last cycle value */ + clock->cycle_last = clocksource_read(clock); + clock->error = 0; + timekeeping_suspended = 0; + write_sequnlock_irqrestore(&xtime_lock, flags); + return 0; +} + +static int timekeeping_suspend(struct sys_device *dev, pm_message_t state) +{ + unsigned long flags; + + write_seqlock_irqsave(&xtime_lock, flags); + timekeeping_suspended = 1; + write_sequnlock_irqrestore(&xtime_lock, flags); + return 0; +} + +/* sysfs resume/suspend bits for timekeeping */ +static struct sysdev_class timekeeping_sysclass = { + .resume = timekeeping_resume, + .suspend = timekeeping_suspend, + set_kset_name("timekeeping"), +}; + +static struct sys_device device_timer = { + .id = 0, + .cls = &timekeeping_sysclass, +}; + +static int __init timekeeping_init_device(void) +{ + int error = sysdev_class_register(&timekeeping_sysclass); + if (!error) + error = sysdev_register(&device_timer); + return error; +} + +device_initcall(timekeeping_init_device); + +/* + * If the error is already larger, we look ahead even further + * to compensate for late or lost adjustments. + */ +static __always_inline int clocksource_bigadjust(s64 error, s64 *interval, s64 *offset) +{ + s64 tick_error, i; + u32 look_ahead, adj; + s32 error2, mult; + + /* + * Use the current error value to determine how much to look ahead. + * The larger the error the slower we adjust for it to avoid problems + * with losing too many ticks, otherwise we would overadjust and + * produce an even larger error. The smaller the adjustment the + * faster we try to adjust for it, as lost ticks can do less harm + * here. This is tuned so that an error of about 1 msec is adusted + * within about 1 sec (or 2^20 nsec in 2^SHIFT_HZ ticks). + */ + error2 = clock->error >> (TICK_LENGTH_SHIFT + 22 - 2 * SHIFT_HZ); + error2 = abs(error2); + for (look_ahead = 0; error2 > 0; look_ahead++) + error2 >>= 2; + + /* + * Now calculate the error in (1 << look_ahead) ticks, but first + * remove the single look ahead already included in the error. + */ + tick_error = current_tick_length() >> (TICK_LENGTH_SHIFT - clock->shift + 1); + tick_error -= clock->xtime_interval >> 1; + error = ((error - tick_error) >> look_ahead) + tick_error; + + /* Finally calculate the adjustment shift value. */ + i = *interval; + mult = 1; + if (error < 0) { + error = -error; + *interval = -*interval; + *offset = -*offset; + mult = -1; + } + for (adj = 0; error > i; adj++) + error >>= 1; + + *interval <<= adj; + *offset <<= adj; + return mult << adj; +} + +/* + * Adjust the multiplier to reduce the error value, + * this is optimized for the most common adjustments of -1,0,1, + * for other values we can do a bit more work. + */ +static void clocksource_adjust(struct clocksource *clock, s64 offset) +{ + s64 error, interval = clock->cycle_interval; + int adj; + + error = clock->error >> (TICK_LENGTH_SHIFT - clock->shift - 1); + if (error > interval) { + error >>= 2; + if (likely(error <= interval)) + adj = 1; + else + adj = clocksource_bigadjust(error, &interval, &offset); + } else if (error < -interval) { + error >>= 2; + if (likely(error >= -interval)) { + adj = -1; + interval = -interval; + offset = -offset; + } else + adj = clocksource_bigadjust(error, &interval, &offset); + } else + return; + + clock->mult += adj; + clock->xtime_interval += interval; + clock->xtime_nsec -= offset; + clock->error -= (interval - offset) << (TICK_LENGTH_SHIFT - clock->shift); +} + +/* + * update_wall_time - Uses the current clocksource to increment the wall time + * + * Called from the timer interrupt, must hold a write on xtime_lock. + */ +static void update_wall_time(void) +{ + cycle_t offset; + + /* Make sure we're fully resumed: */ + if (unlikely(timekeeping_suspended)) + return; + +#ifdef CONFIG_GENERIC_TIME + offset = (clocksource_read(clock) - clock->cycle_last) & clock->mask; +#else + offset = clock->cycle_interval; +#endif + clock->xtime_nsec += (s64)xtime.tv_nsec << clock->shift; + + /* normally this loop will run just once, however in the + * case of lost or late ticks, it will accumulate correctly. + */ + while (offset >= clock->cycle_interval) { + /* accumulate one interval */ + clock->xtime_nsec += clock->xtime_interval; + clock->cycle_last += clock->cycle_interval; + offset -= clock->cycle_interval; + + if (clock->xtime_nsec >= (u64)NSEC_PER_SEC << clock->shift) { + clock->xtime_nsec -= (u64)NSEC_PER_SEC << clock->shift; xtime.tv_sec++; second_overflow(); } - } while (ticks); + + /* interpolator bits */ + time_interpolator_update(clock->xtime_interval + >> clock->shift); + /* increment the NTP state machine */ + update_ntp_one_tick(); + + /* accumulate error between NTP and clock interval */ + clock->error += current_tick_length(); + clock->error -= clock->xtime_interval << (TICK_LENGTH_SHIFT - clock->shift); + } + + /* correct the clock when NTP error is too big */ + clocksource_adjust(clock, offset); + + /* store full nanoseconds into xtime */ + xtime.tv_nsec = (s64)clock->xtime_nsec >> clock->shift; + clock->xtime_nsec -= (s64)xtime.tv_nsec << clock->shift; + + /* check to see if there is a new clocksource to use */ + if (change_clocksource()) { + clock->error = 0; + clock->xtime_nsec = 0; + clocksource_calculate_interval(clock, tick_nsec); + } } /* @@ -902,7 +1237,7 @@ unsigned long wall_jiffies = INITIAL_JIFFIES; * playing with xtime and avenrun. */ #ifndef ARCH_HAVE_XTIME_LOCK -seqlock_t xtime_lock __cacheline_aligned_in_smp = SEQLOCK_UNLOCKED; +__cacheline_aligned_in_smp DEFINE_SEQLOCK(xtime_lock); EXPORT_SYMBOL(xtime_lock); #endif @@ -937,10 +1272,8 @@ static inline void update_times(void) unsigned long ticks; ticks = jiffies - wall_jiffies; - if (ticks) { - wall_jiffies += ticks; - update_wall_time(ticks); - } + wall_jiffies += ticks; + update_wall_time(); calc_load(ticks); } @@ -987,9 +1320,9 @@ asmlinkage long sys_getpid(void) } /* - * Accessing ->real_parent is not SMP-safe, it could + * Accessing ->parent is not SMP-safe, it could * change from under us. However, we can use a stale - * value of ->real_parent under rcu_read_lock(), see + * value of ->parent under rcu_read_lock(), see * release_task()->call_rcu(delayed_put_task_struct). */ asmlinkage long sys_getppid(void) @@ -997,7 +1330,7 @@ asmlinkage long sys_getppid(void) int pid; rcu_read_lock(); - pid = rcu_dereference(current->real_parent)->tgid; + pid = rcu_dereference(current->parent)->tgid; rcu_read_unlock(); return vx_map_pid(pid); } @@ -1044,7 +1377,7 @@ asmlinkage long sys_getegid(void) static void process_timeout(unsigned long __data) { - wake_up_process((task_t *)__data); + wake_up_process((struct task_struct *)__data); } /** @@ -1237,6 +1570,13 @@ asmlinkage long sys_sysinfo(struct sysinfo __user *info) return 0; } +/* + * lockdep: we want to track each per-CPU base as a separate lock-class, + * but timer-bases are kmalloc()-ed, so we need to attach separate + * keys to them: + */ +static struct lock_class_key base_lock_keys[NR_CPUS]; + static int __devinit init_timers_cpu(int cpu) { int j; @@ -1272,6 +1612,8 @@ static int __devinit init_timers_cpu(int cpu) } spin_lock_init(&base->lock); + lockdep_set_class(&base->lock, base_lock_keys + cpu); + for (j = 0; j < TVN_SIZE; j++) { INIT_LIST_HEAD(base->tv5.vec + j); INIT_LIST_HEAD(base->tv4.vec + j); @@ -1330,7 +1672,7 @@ static void __devinit migrate_timers(int cpu) } #endif /* CONFIG_HOTPLUG_CPU */ -static int timer_cpu_notify(struct notifier_block *self, +static int __cpuinit timer_cpu_notify(struct notifier_block *self, unsigned long action, void *hcpu) { long cpu = (long)hcpu; @@ -1350,7 +1692,7 @@ static int timer_cpu_notify(struct notifier_block *self, return NOTIFY_OK; } -static struct notifier_block timers_nb = { +static struct notifier_block __cpuinitdata timers_nb = { .notifier_call = timer_cpu_notify, }; diff --git a/kernel/user.c b/kernel/user.c index bcbd0b363..640ee48c8 100644 --- a/kernel/user.c +++ b/kernel/user.c @@ -141,7 +141,7 @@ struct user_struct * alloc_uid(xid_t xid, uid_t uid) atomic_set(&new->processes, 0); atomic_set(&new->files, 0); atomic_set(&new->sigpending, 0); -#ifdef CONFIG_INOTIFY +#ifdef CONFIG_INOTIFY_USER atomic_set(&new->inotify_watches, 0); atomic_set(&new->inotify_devs, 0); #endif @@ -149,7 +149,7 @@ struct user_struct * alloc_uid(xid_t xid, uid_t uid) new->mq_bytes = 0; new->locked_shm = 0; - if (alloc_uid_keyring(new) < 0) { + if (alloc_uid_keyring(new, current) < 0) { kmem_cache_free(uid_cachep, new); return NULL; } diff --git a/kernel/vserver/Kconfig b/kernel/vserver/Kconfig index 9fc27a3c3..1959ab5c4 100644 --- a/kernel/vserver/Kconfig +++ b/kernel/vserver/Kconfig @@ -38,14 +38,14 @@ config VSERVER_LEGACY_VERSION so better avoid it, unless you really, really need it for backwards compatibility. -config VSERVER_NGNET - bool "Disable Legacy Networking Kernel API" - depends on EXPERIMENTAL - default n +config VSERVER_LEGACYNET + bool "Enable Legacy Networking Kernel API" + default y help - This disables the legacy networking API which is required - by the chbind tool. Do not disable it unless you exactly - know what you are doing. + This enables the legacy networking API which is required + by the chbind tool (for util-vserver versions prior to + 0.30.210). If you use an older version, don't disable + this option. config VSERVER_REMAP_SADDR bool "Remap Source IP Address" @@ -198,8 +198,8 @@ config VSERVER_SECURITY default y select SECURITY_CAPABILITIES -config VSERVER_LEGACYNET +config VSERVER_NGNET bool - depends on !VSERVER_NGNET + depends on EXPERIMENTAL && !VSERVER_LEGACYNET default y diff --git a/kernel/vserver/context.c b/kernel/vserver/context.c index 55a706219..aa2b22024 100644 --- a/kernel/vserver/context.c +++ b/kernel/vserver/context.c @@ -668,11 +668,19 @@ void exit_vx_info(struct task_struct *p, int code) vx_nproc_dec(p); vxi->exit_code = code; + release_vx_info(vxi, p); + } +} + +void exit_vx_info_early(struct task_struct *p, int code) +{ + struct vx_info *vxi = p->vx_info; + + if (vxi) { if (vxi->vx_initpid == p->tgid) vx_exit_init(vxi, p, code); if (vxi->vx_reaper == p) vx_set_reaper(vxi, child_reaper); - release_vx_info(vxi, p); } } diff --git a/kernel/vserver/cvirt_init.h b/kernel/vserver/cvirt_init.h index 52bd4da28..42f5f96d9 100644 --- a/kernel/vserver/cvirt_init.h +++ b/kernel/vserver/cvirt_init.h @@ -1,8 +1,5 @@ -#include - - extern uint64_t vx_idle_jiffies(void); static inline void vx_info_init_cvirt(struct _vx_cvirt *cvirt) diff --git a/kernel/vserver/limit_init.h b/kernel/vserver/limit_init.h index bee92ef02..522dec54b 100644 --- a/kernel/vserver/limit_init.h +++ b/kernel/vserver/limit_init.h @@ -1,8 +1,5 @@ -#include - - static inline void vx_info_init_limit(struct _vx_limit *limit) { int lim; diff --git a/kernel/vserver/sched_init.h b/kernel/vserver/sched_init.h index 6724c286f..d9b292d36 100644 --- a/kernel/vserver/sched_init.h +++ b/kernel/vserver/sched_init.h @@ -1,6 +1,7 @@ static inline void vx_info_init_sched(struct _vx_sched *sched) { + static struct lock_class_key tokens_lock_key; int i; /* scheduling; hard code starting values as constants */ @@ -19,12 +20,14 @@ static inline void vx_info_init_sched(struct _vx_sched *sched) } #endif + lockdep_set_class(&sched->tokens_lock, &tokens_lock_key); + atomic_set(&sched->tokens, HZ >> 2); sched->cpus_allowed = CPU_MASK_ALL; sched->priority_bias = 0; sched->vavavoom = 0; - for_each_cpu(i) { + for_each_possible_cpu(i) { sched->cpu[i].user_ticks = 0; sched->cpu[i].sys_ticks = 0; sched->cpu[i].hold_ticks = 0; diff --git a/kernel/vserver/switch.c b/kernel/vserver/switch.c index 841213f45..bbf1aef7c 100644 --- a/kernel/vserver/switch.c +++ b/kernel/vserver/switch.c @@ -239,7 +239,7 @@ long do_vserver(uint32_t cmd, uint32_t id, void __user *data, int compat) return -ENOSYS; } -extern asmlinkage long +asmlinkage long sys_vserver(uint32_t cmd, uint32_t id, void __user *data) { long ret = do_vserver(cmd, id, data, 0); @@ -253,7 +253,7 @@ sys_vserver(uint32_t cmd, uint32_t id, void __user *data) #ifdef CONFIG_COMPAT -extern asmlinkage long +asmlinkage long sys32_vserver(uint32_t cmd, uint32_t id, void __user *data) { long ret = do_vserver(cmd, id, data, 1); diff --git a/kernel/wait.c b/kernel/wait.c index 5cdf169d7..59a82f632 100644 --- a/kernel/wait.c +++ b/kernel/wait.c @@ -3,7 +3,6 @@ * * (C) 2004 William Irwin, Oracle */ -#include #include #include #include @@ -11,6 +10,14 @@ #include #include +void init_waitqueue_head(wait_queue_head_t *q) +{ + spin_lock_init(&q->lock); + INIT_LIST_HEAD(&q->task_list); +} + +EXPORT_SYMBOL(init_waitqueue_head); + void fastcall add_wait_queue(wait_queue_head_t *q, wait_queue_t *wait) { unsigned long flags; @@ -33,35 +40,13 @@ void fastcall add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_t *wait) } EXPORT_SYMBOL(add_wait_queue_exclusive); -int fastcall remove_wait_queue(wait_queue_head_t *q, wait_queue_t *wait) +void fastcall remove_wait_queue(wait_queue_head_t *q, wait_queue_t *wait) { unsigned long flags; - struct list_head *list; - int seen, retval; spin_lock_irqsave(&q->lock, flags); - list = &q->task_list; - seen = 0; - retval = -1; - - do { - struct list_head *next; - if (list == &wait->task_list) - seen++; - next = list->next; - if (next->prev != list) { - seen += 2; - break; - } - list = next; - } while (list != &q->task_list); - - if (seen == 1) { - __remove_wait_queue(q, wait); - retval = 0; - } + __remove_wait_queue(q, wait); spin_unlock_irqrestore(&q->lock, flags); - return retval; } EXPORT_SYMBOL(remove_wait_queue); diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 880fb415a..835fe28b8 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -51,7 +51,7 @@ struct cpu_workqueue_struct { wait_queue_head_t work_done; struct workqueue_struct *wq; - task_t *thread; + struct task_struct *thread; int run_depth; /* Detect run_workqueue() recursion depth */ } ____cacheline_aligned; @@ -68,7 +68,7 @@ struct workqueue_struct { /* All the per-cpu workqueues on the system, for hotplug cpu to add/remove threads to each one as cpus come/go. */ -static DEFINE_SPINLOCK(workqueue_lock); +static DEFINE_MUTEX(workqueue_mutex); static LIST_HEAD(workqueues); static int singlethread_cpu; @@ -93,9 +93,12 @@ static void __queue_work(struct cpu_workqueue_struct *cwq, spin_unlock_irqrestore(&cwq->lock, flags); } -/* - * Queue work on a workqueue. Return non-zero if it was successfully - * added. +/** + * queue_work - queue work on a workqueue + * @wq: workqueue to use + * @work: work to queue + * + * Returns non-zero if it was successfully added. * * We queue the work to the CPU it was submitted, but there is no * guarantee that it will be processed by that CPU. @@ -114,6 +117,7 @@ int fastcall queue_work(struct workqueue_struct *wq, struct work_struct *work) put_cpu(); return ret; } +EXPORT_SYMBOL_GPL(queue_work); static void delayed_work_timer_fn(unsigned long __data) { @@ -127,6 +131,14 @@ static void delayed_work_timer_fn(unsigned long __data) __queue_work(per_cpu_ptr(wq->cpu_wq, cpu), work); } +/** + * queue_delayed_work - queue work on a workqueue after delay + * @wq: workqueue to use + * @work: work to queue + * @delay: number of jiffies to wait before queueing + * + * Returns non-zero if it was successfully added. + */ int fastcall queue_delayed_work(struct workqueue_struct *wq, struct work_struct *work, unsigned long delay) { @@ -147,6 +159,38 @@ int fastcall queue_delayed_work(struct workqueue_struct *wq, } return ret; } +EXPORT_SYMBOL_GPL(queue_delayed_work); + +/** + * queue_delayed_work_on - queue work on specific CPU after delay + * @cpu: CPU number to execute work on + * @wq: workqueue to use + * @work: work to queue + * @delay: number of jiffies to wait before queueing + * + * Returns non-zero if it was successfully added. + */ +int queue_delayed_work_on(int cpu, struct workqueue_struct *wq, + struct work_struct *work, unsigned long delay) +{ + int ret = 0; + struct timer_list *timer = &work->timer; + + if (!test_and_set_bit(0, &work->pending)) { + BUG_ON(timer_pending(timer)); + BUG_ON(!list_empty(&work->entry)); + + /* This stores wq for the moment, for the timer_fn */ + work->wq_data = wq; + timer->expires = jiffies + delay; + timer->data = (unsigned long)work; + timer->function = delayed_work_timer_fn; + add_timer_on(timer, cpu); + ret = 1; + } + return ret; +} +EXPORT_SYMBOL_GPL(queue_delayed_work_on); static void run_workqueue(struct cpu_workqueue_struct *cwq) { @@ -251,8 +295,9 @@ static void flush_cpu_workqueue(struct cpu_workqueue_struct *cwq) } } -/* +/** * flush_workqueue - ensure that any scheduled work has run to completion. + * @wq: workqueue to flush * * Forces execution of the workqueue and blocks until its completion. * This is typically used in driver shutdown handlers. @@ -275,12 +320,13 @@ void fastcall flush_workqueue(struct workqueue_struct *wq) } else { int cpu; - lock_cpu_hotplug(); + mutex_lock(&workqueue_mutex); for_each_online_cpu(cpu) flush_cpu_workqueue(per_cpu_ptr(wq->cpu_wq, cpu)); - unlock_cpu_hotplug(); + mutex_unlock(&workqueue_mutex); } } +EXPORT_SYMBOL_GPL(flush_workqueue); static struct task_struct *create_workqueue_thread(struct workqueue_struct *wq, int cpu) @@ -325,8 +371,7 @@ struct workqueue_struct *__create_workqueue(const char *name, } wq->name = name; - /* We don't need the distraction of CPUs appearing and vanishing. */ - lock_cpu_hotplug(); + mutex_lock(&workqueue_mutex); if (singlethread) { INIT_LIST_HEAD(&wq->list); p = create_workqueue_thread(wq, singlethread_cpu); @@ -335,9 +380,7 @@ struct workqueue_struct *__create_workqueue(const char *name, else wake_up_process(p); } else { - spin_lock(&workqueue_lock); list_add(&wq->list, &workqueues); - spin_unlock(&workqueue_lock); for_each_online_cpu(cpu) { p = create_workqueue_thread(wq, cpu); if (p) { @@ -347,7 +390,7 @@ struct workqueue_struct *__create_workqueue(const char *name, destroy = 1; } } - unlock_cpu_hotplug(); + mutex_unlock(&workqueue_mutex); /* * Was there any error during startup? If yes then clean up: @@ -358,6 +401,7 @@ struct workqueue_struct *__create_workqueue(const char *name, } return wq; } +EXPORT_SYMBOL_GPL(__create_workqueue); static void cleanup_workqueue_thread(struct workqueue_struct *wq, int cpu) { @@ -374,6 +418,12 @@ static void cleanup_workqueue_thread(struct workqueue_struct *wq, int cpu) kthread_stop(p); } +/** + * destroy_workqueue - safely terminate a workqueue + * @wq: target workqueue + * + * Safely destroy a workqueue. All work currently pending will be done first. + */ void destroy_workqueue(struct workqueue_struct *wq) { int cpu; @@ -381,69 +431,94 @@ void destroy_workqueue(struct workqueue_struct *wq) flush_workqueue(wq); /* We don't need the distraction of CPUs appearing and vanishing. */ - lock_cpu_hotplug(); + mutex_lock(&workqueue_mutex); if (is_single_threaded(wq)) cleanup_workqueue_thread(wq, singlethread_cpu); else { for_each_online_cpu(cpu) cleanup_workqueue_thread(wq, cpu); - spin_lock(&workqueue_lock); list_del(&wq->list); - spin_unlock(&workqueue_lock); } - unlock_cpu_hotplug(); + mutex_unlock(&workqueue_mutex); free_percpu(wq->cpu_wq); kfree(wq); } +EXPORT_SYMBOL_GPL(destroy_workqueue); static struct workqueue_struct *keventd_wq; +/** + * schedule_work - put work task in global workqueue + * @work: job to be done + * + * This puts a job in the kernel-global workqueue. + */ int fastcall schedule_work(struct work_struct *work) { return queue_work(keventd_wq, work); } +EXPORT_SYMBOL(schedule_work); +/** + * schedule_delayed_work - put work task in global workqueue after delay + * @work: job to be done + * @delay: number of jiffies to wait + * + * After waiting for a given time this puts a job in the kernel-global + * workqueue. + */ int fastcall schedule_delayed_work(struct work_struct *work, unsigned long delay) { return queue_delayed_work(keventd_wq, work, delay); } +EXPORT_SYMBOL(schedule_delayed_work); +/** + * schedule_delayed_work_on - queue work in global workqueue on CPU after delay + * @cpu: cpu to use + * @work: job to be done + * @delay: number of jiffies to wait + * + * After waiting for a given time this puts a job in the kernel-global + * workqueue on the specified CPU. + */ int schedule_delayed_work_on(int cpu, struct work_struct *work, unsigned long delay) { - int ret = 0; - struct timer_list *timer = &work->timer; - - if (!test_and_set_bit(0, &work->pending)) { - BUG_ON(timer_pending(timer)); - BUG_ON(!list_empty(&work->entry)); - /* This stores keventd_wq for the moment, for the timer_fn */ - work->wq_data = keventd_wq; - timer->expires = jiffies + delay; - timer->data = (unsigned long)work; - timer->function = delayed_work_timer_fn; - add_timer_on(timer, cpu); - ret = 1; - } - return ret; + return queue_delayed_work_on(cpu, keventd_wq, work, delay); } +EXPORT_SYMBOL(schedule_delayed_work_on); -int schedule_on_each_cpu(void (*func) (void *info), void *info) +/** + * schedule_on_each_cpu - call a function on each online CPU from keventd + * @func: the function to call + * @info: a pointer to pass to func() + * + * Returns zero on success. + * Returns -ve errno on failure. + * + * Appears to be racy against CPU hotplug. + * + * schedule_on_each_cpu() is very slow. + */ +int schedule_on_each_cpu(void (*func)(void *info), void *info) { int cpu; - struct work_struct *work; - - work = kmalloc(NR_CPUS * sizeof(struct work_struct), GFP_KERNEL); + struct work_struct *works; - if (!work) + works = alloc_percpu(struct work_struct); + if (!works) return -ENOMEM; + + mutex_lock(&workqueue_mutex); for_each_online_cpu(cpu) { - INIT_WORK(work + cpu, func, info); + INIT_WORK(per_cpu_ptr(works, cpu), func, info); __queue_work(per_cpu_ptr(keventd_wq->cpu_wq, cpu), - work + cpu); + per_cpu_ptr(works, cpu)); } + mutex_unlock(&workqueue_mutex); flush_workqueue(keventd_wq); - kfree(work); + free_percpu(works); return 0; } @@ -451,6 +526,7 @@ void flush_scheduled_work(void) { flush_workqueue(keventd_wq); } +EXPORT_SYMBOL(flush_scheduled_work); /** * cancel_rearming_delayed_workqueue - reliably kill off a delayed @@ -531,11 +607,11 @@ int current_is_keventd(void) static void take_over_work(struct workqueue_struct *wq, unsigned int cpu) { struct cpu_workqueue_struct *cwq = per_cpu_ptr(wq->cpu_wq, cpu); - LIST_HEAD(list); + struct list_head list; struct work_struct *work; spin_lock_irq(&cwq->lock); - list_splice_init(&cwq->worklist, &list); + list_replace_init(&cwq->worklist, &list); while (!list_empty(&list)) { printk("Taking work for %s\n", wq->name); @@ -547,7 +623,7 @@ static void take_over_work(struct workqueue_struct *wq, unsigned int cpu) } /* We're holding the cpucontrol mutex here */ -static int workqueue_cpu_callback(struct notifier_block *nfb, +static int __devinit workqueue_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) { @@ -556,6 +632,7 @@ static int workqueue_cpu_callback(struct notifier_block *nfb, switch (action) { case CPU_UP_PREPARE: + mutex_lock(&workqueue_mutex); /* Create a new workqueue thread for it. */ list_for_each_entry(wq, &workqueues, list) { if (!create_workqueue_thread(wq, hotcpu)) { @@ -574,15 +651,27 @@ static int workqueue_cpu_callback(struct notifier_block *nfb, kthread_bind(cwq->thread, hotcpu); wake_up_process(cwq->thread); } + mutex_unlock(&workqueue_mutex); break; case CPU_UP_CANCELED: list_for_each_entry(wq, &workqueues, list) { + if (!per_cpu_ptr(wq->cpu_wq, hotcpu)->thread) + continue; /* Unbind so it can run. */ kthread_bind(per_cpu_ptr(wq->cpu_wq, hotcpu)->thread, any_online_cpu(cpu_online_map)); cleanup_workqueue_thread(wq, hotcpu); } + mutex_unlock(&workqueue_mutex); + break; + + case CPU_DOWN_PREPARE: + mutex_lock(&workqueue_mutex); + break; + + case CPU_DOWN_FAILED: + mutex_unlock(&workqueue_mutex); break; case CPU_DEAD: @@ -590,6 +679,7 @@ static int workqueue_cpu_callback(struct notifier_block *nfb, cleanup_workqueue_thread(wq, hotcpu); list_for_each_entry(wq, &workqueues, list) take_over_work(wq, hotcpu); + mutex_unlock(&workqueue_mutex); break; } @@ -605,13 +695,3 @@ void init_workqueues(void) BUG_ON(!keventd_wq); } -EXPORT_SYMBOL_GPL(__create_workqueue); -EXPORT_SYMBOL_GPL(queue_work); -EXPORT_SYMBOL_GPL(queue_delayed_work); -EXPORT_SYMBOL_GPL(flush_workqueue); -EXPORT_SYMBOL_GPL(destroy_workqueue); - -EXPORT_SYMBOL(schedule_work); -EXPORT_SYMBOL(schedule_delayed_work); -EXPORT_SYMBOL(schedule_delayed_work_on); -EXPORT_SYMBOL(flush_scheduled_work); diff --git a/lib/Kconfig b/lib/Kconfig index 3de93357f..734ce95a9 100644 --- a/lib/Kconfig +++ b/lib/Kconfig @@ -38,6 +38,11 @@ config LIBCRC32C require M here. See Castagnoli93. Module will be libcrc32c. +config AUDIT_GENERIC + bool + depends on AUDIT && !AUDIT_ARCH + default y + # # compression support is select'ed if needed # @@ -86,4 +91,10 @@ config TEXTSEARCH_BM config TEXTSEARCH_FSM tristate +# +# plist support is select#ed if needed +# +config PLIST + boolean + endmenu diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 212560acf..4dd46ac36 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -23,6 +23,22 @@ config MAGIC_SYSRQ keys are documented in . Don't say Y unless you really know what this hack does. +config UNUSED_SYMBOLS + bool "Enable unused/obsolete exported symbols" + default y if X86 + help + Unused but exported symbols make the kernel needlessly bigger. For + that reason most of these unused exports will soon be removed. This + option is provided temporarily to provide a transition period in case + some external kernel module needs one of these symbols anyway. If you + encounter such a case in your module, consider if you are actually + using the right API. (rationale: since nobody in the kernel is using + this in a module, there is a pretty good chance it's actually the + wrong interface to use). If you really need the symbol, please send a + mail to the linux kernel mailing list mentioning the symbol and why + you really need it, and what the merge plan to the mainline kernel for + your module is. + config DEBUG_KERNEL bool "Kernel debugging" help @@ -32,7 +48,7 @@ config DEBUG_KERNEL config LOG_BUF_SHIFT int "Kernel log buffer size (16 => 64KB, 17 => 128KB)" if DEBUG_KERNEL range 12 21 - default 17 if S390 + default 17 if S390 || LOCKDEP default 16 if X86_NUMAQ || IA64 default 15 if SMP default 14 @@ -91,7 +107,7 @@ config DEBUG_SLAB_LEAK config DEBUG_PREEMPT bool "Debug preemptible kernel" - depends on DEBUG_KERNEL && PREEMPT + depends on DEBUG_KERNEL && PREEMPT && TRACE_IRQFLAGS_SUPPORT default y help If you say Y here then the kernel will use a debug variant of the @@ -99,16 +115,26 @@ config DEBUG_PREEMPT if kernel code uses it in a preemption-unsafe way. Also, the kernel will detect preemption count underflows. -config DEBUG_MUTEXES - bool "Mutex debugging, deadlock detection" - default n - depends on DEBUG_KERNEL +config DEBUG_RT_MUTEXES + bool "RT Mutex debugging, deadlock detection" + depends on DEBUG_KERNEL && RT_MUTEXES help - This allows mutex semantics violations and mutex related deadlocks - (lockups) to be detected and reported automatically. + This allows rt mutex semantics violations and rt mutex related + deadlocks (lockups) to be detected and reported automatically. + +config DEBUG_PI_LIST + bool + default y + depends on DEBUG_RT_MUTEXES + +config RT_MUTEX_TESTER + bool "Built-in scriptable tester for rt-mutexes" + depends on DEBUG_KERNEL && RT_MUTEXES + help + This option enables a rt-mutex tester. config DEBUG_SPINLOCK - bool "Spinlock debugging" + bool "Spinlock and rw-lock debugging: basic checks" depends on DEBUG_KERNEL help Say Y here and build SMP to catch missing spinlock initialization @@ -116,13 +142,124 @@ config DEBUG_SPINLOCK best used in conjunction with the NMI watchdog so that spinlock deadlocks are also debuggable. +config DEBUG_MUTEXES + bool "Mutex debugging: basic checks" + depends on DEBUG_KERNEL + help + This feature allows mutex semantics violations to be detected and + reported. + +config DEBUG_RWSEMS + bool "RW-sem debugging: basic checks" + depends on DEBUG_KERNEL + help + This feature allows read-write semaphore semantics violations to + be detected and reported. + +config DEBUG_LOCK_ALLOC + bool "Lock debugging: detect incorrect freeing of live locks" + depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT + select DEBUG_SPINLOCK + select DEBUG_MUTEXES + select DEBUG_RWSEMS + select LOCKDEP + help + This feature will check whether any held lock (spinlock, rwlock, + mutex or rwsem) is incorrectly freed by the kernel, via any of the + memory-freeing routines (kfree(), kmem_cache_free(), free_pages(), + vfree(), etc.), whether a live lock is incorrectly reinitialized via + spin_lock_init()/mutex_init()/etc., or whether there is any lock + held during task exit. + +config PROVE_LOCKING + bool "Lock debugging: prove locking correctness" + depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT + select LOCKDEP + select DEBUG_SPINLOCK + select DEBUG_MUTEXES + select DEBUG_RWSEMS + select DEBUG_LOCK_ALLOC + default n + help + This feature enables the kernel to prove that all locking + that occurs in the kernel runtime is mathematically + correct: that under no circumstance could an arbitrary (and + not yet triggered) combination of observed locking + sequences (on an arbitrary number of CPUs, running an + arbitrary number of tasks and interrupt contexts) cause a + deadlock. + + In short, this feature enables the kernel to report locking + related deadlocks before they actually occur. + + The proof does not depend on how hard and complex a + deadlock scenario would be to trigger: how many + participant CPUs, tasks and irq-contexts would be needed + for it to trigger. The proof also does not depend on + timing: if a race and a resulting deadlock is possible + theoretically (no matter how unlikely the race scenario + is), it will be proven so and will immediately be + reported by the kernel (once the event is observed that + makes the deadlock theoretically possible). + + If a deadlock is impossible (i.e. the locking rules, as + observed by the kernel, are mathematically correct), the + kernel reports nothing. + + NOTE: this feature can also be enabled for rwlocks, mutexes + and rwsems - in which case all dependencies between these + different locking variants are observed and mapped too, and + the proof of observed correctness is also maintained for an + arbitrary combination of these separate locking variants. + + For more details, see Documentation/lockdep-design.txt. + +config LOCKDEP + bool + depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT + select STACKTRACE + select FRAME_POINTER if !X86 + select KALLSYMS + select KALLSYMS_ALL + +config DEBUG_LOCKDEP + bool "Lock dependency engine debugging" + depends on DEBUG_KERNEL && LOCKDEP + help + If you say Y here, the lock dependency engine will do + additional runtime checks to debug itself, at the price + of more runtime overhead. + +config TRACE_IRQFLAGS + depends on DEBUG_KERNEL + bool + default y + depends on TRACE_IRQFLAGS_SUPPORT + depends on PROVE_LOCKING + config DEBUG_SPINLOCK_SLEEP - bool "Sleep-inside-spinlock checking" + bool "Spinlock debugging: sleep-inside-spinlock checking" depends on DEBUG_KERNEL help If you say Y here, various routines which may sleep will become very noisy if they are called with a spinlock held. +config DEBUG_LOCKING_API_SELFTESTS + bool "Locking API boot-time self-tests" + depends on DEBUG_KERNEL + help + Say Y here if you want the kernel to run a short self-test during + bootup. The self-test checks whether common types of locking bugs + are detected by debugging mechanisms or not. (if you disable + lock debugging then those bugs wont be detected of course.) + The following locking APIs are covered: spinlocks, rwlocks, + mutexes and rwsems. + +config STACKTRACE + bool + depends on DEBUG_KERNEL + depends on STACKTRACE_SUPPORT + config DEBUG_KOBJECT bool "kobject debugging" depends on DEBUG_KERNEL @@ -176,9 +313,18 @@ config DEBUG_VM If unsure, say N. +config DEBUG_LIST + bool "Debug linked list manipulation" + depends on DEBUG_KERNEL + help + Enable this to turn on extended checks in the linked-list + walking routines. + + If unsure, say N. + config FRAME_POINTER bool "Compile the kernel with frame pointers" - depends on DEBUG_KERNEL && (X86 || CRIS || M68K || M68KNOMMU || FRV || UML) + depends on DEBUG_KERNEL && (X86 || CRIS || M68K || M68KNOMMU || FRV || UML || S390) default y if DEBUG_INFO && UML help If you say Y here the resulting kernel image will be slightly larger @@ -188,14 +334,22 @@ config FRAME_POINTER config UNWIND_INFO bool "Compile the kernel with frame unwind information" - depends on !IA64 - depends on !MODULES || !(MIPS || PARISC || PPC || SUPERH || V850) + depends on !IA64 && !PARISC && !X86_64_XEN + depends on !MODULES || !(MIPS || PPC || SUPERH || V850) help If you say Y here the resulting kernel image will be slightly larger but not slower, and it will give very useful debugging information. If you don't debug the kernel, you can say N, but we may not be able to solve problems without frame unwind information or frame pointers. +config STACK_UNWIND + bool "Stack unwind support" + depends on UNWIND_INFO + depends on X86 + help + This enables more precise stack traces, omitting all unrelated + occurrences of pointers into kernel code from the dump. + config FORCED_INLINING bool "Force gcc to inline functions marked 'inline'" depends on DEBUG_KERNEL diff --git a/lib/Makefile b/lib/Makefile index 033ff7c67..d5b8eb2cf 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -11,13 +11,14 @@ lib-$(CONFIG_SMP) += cpumask.o lib-y += kobject.o kref.o kobject_uevent.o klist.o -obj-y += sort.o parser.o halfmd4.o iomap_copy.o +obj-y += sort.o parser.o halfmd4.o iomap_copy.o debug_locks.o ifeq ($(CONFIG_DEBUG_KOBJECT),y) CFLAGS_kobject.o += -DDEBUG CFLAGS_kobject_uevent.o += -DDEBUG endif +obj-$(CONFIG_DEBUG_LOCKING_API_SELFTESTS) += locking-selftest.o obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock_debug.o lib-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o @@ -25,7 +26,9 @@ lib-$(CONFIG_SEMAPHORE_SLEEPERS) += semaphore-sleepers.o lib-$(CONFIG_GENERIC_FIND_NEXT_BIT) += find_next_bit.o lib-$(CONFIG_GENERIC_HWEIGHT) += hweight.o obj-$(CONFIG_LOCK_KERNEL) += kernel_lock.o +obj-$(CONFIG_PLIST) += plist.o obj-$(CONFIG_DEBUG_PREEMPT) += smp_processor_id.o +obj-$(CONFIG_DEBUG_LIST) += list_debug.o ifneq ($(CONFIG_HAVE_DEC_LOCK),y) lib-y += dec_and_lock.o @@ -46,6 +49,8 @@ obj-$(CONFIG_TEXTSEARCH) += textsearch.o obj-$(CONFIG_TEXTSEARCH_KMP) += ts_kmp.o obj-$(CONFIG_TEXTSEARCH_BM) += ts_bm.o obj-$(CONFIG_TEXTSEARCH_FSM) += ts_fsm.o +obj-$(CONFIG_SMP) += percpu_counter.o +obj-$(CONFIG_AUDIT_GENERIC) += audit.o obj-$(CONFIG_SWIOTLB) += swiotlb.o ifneq ($(CONFIG_XEN_IA64_DOM0_NON_VP),y) diff --git a/lib/bitmap.c b/lib/bitmap.c index ed2ae3b0c..d71e38c54 100644 --- a/lib/bitmap.c +++ b/lib/bitmap.c @@ -317,16 +317,16 @@ EXPORT_SYMBOL(bitmap_scnprintf); /** * bitmap_parse - convert an ASCII hex string into a bitmap. - * @buf: pointer to buffer in user space containing string. - * @buflen: buffer size in bytes. If string is smaller than this + * @ubuf: pointer to buffer in user space containing string. + * @ubuflen: buffer size in bytes. If string is smaller than this * then it must be terminated with a \0. * @maskp: pointer to bitmap array that will contain result. * @nmaskbits: size of bitmap, in bits. * * Commas group hex digits into chunks. Each chunk defines exactly 32 * bits of the resultant bitmask. No chunk may specify a value larger - * than 32 bits (-EOVERFLOW), and if a chunk specifies a smaller value - * then leading 0-bits are prepended. -EINVAL is returned for illegal + * than 32 bits (%-EOVERFLOW), and if a chunk specifies a smaller value + * then leading 0-bits are prepended. %-EINVAL is returned for illegal * characters and for grouping errors such as "1,,5", ",44", "," and "". * Leading and trailing whitespace accepted, but not embedded whitespace. */ @@ -452,8 +452,8 @@ EXPORT_SYMBOL(bitmap_scnlistprintf); /** * bitmap_parselist - convert list format ASCII string to bitmap - * @buf: read nul-terminated user string from this buffer - * @mask: write resulting mask here + * @bp: read nul-terminated user string from this buffer + * @maskp: write resulting mask here * @nmaskbits: number of bits in mask to be written * * Input format is a comma-separated list of decimal numbers and @@ -461,10 +461,11 @@ EXPORT_SYMBOL(bitmap_scnlistprintf); * decimal numbers, the smallest and largest bit numbers set in * the range. * - * Returns 0 on success, -errno on invalid input strings: - * -EINVAL: second number in range smaller than first - * -EINVAL: invalid character in string - * -ERANGE: bit number specified too large for mask + * Returns 0 on success, -errno on invalid input strings. + * Error values: + * %-EINVAL: second number in range smaller than first + * %-EINVAL: invalid character in string + * %-ERANGE: bit number specified too large for mask */ int bitmap_parselist(const char *bp, unsigned long *maskp, int nmaskbits) { @@ -625,10 +626,10 @@ EXPORT_SYMBOL(bitmap_remap); /** * bitmap_bitremap - Apply map defined by a pair of bitmaps to a single bit - * @oldbit - bit position to be mapped - * @old: defines domain of map - * @new: defines range of map - * @bits: number of bits in each of these bitmaps + * @oldbit: bit position to be mapped + * @old: defines domain of map + * @new: defines range of map + * @bits: number of bits in each of these bitmaps * * Let @old and @new define a mapping of bit positions, such that * whatever position is held by the n-th set bit in @old is mapped @@ -790,7 +791,7 @@ EXPORT_SYMBOL(bitmap_release_region); * * Allocate (set bits in) a specified region of a bitmap. * - * Return 0 on success, or -EBUSY if specified region wasn't + * Return 0 on success, or %-EBUSY if specified region wasn't * free (not all bits were zero). */ int bitmap_allocate_region(unsigned long *bitmap, int pos, int order) diff --git a/lib/bust_spinlocks.c b/lib/bust_spinlocks.c index 6bb7319e0..a2055bc3e 100644 --- a/lib/bust_spinlocks.c +++ b/lib/bust_spinlocks.c @@ -7,7 +7,6 @@ * and panic() information from reaching the user. */ -#include #include #include #include diff --git a/lib/crc-ccitt.c b/lib/crc-ccitt.c index 115d149af..7f6dd68d2 100644 --- a/lib/crc-ccitt.c +++ b/lib/crc-ccitt.c @@ -53,9 +53,9 @@ EXPORT_SYMBOL(crc_ccitt_table); /** * crc_ccitt - recompute the CRC for the data buffer - * @crc - previous CRC value - * @buffer - data pointer - * @len - number of bytes in the buffer + * @crc: previous CRC value + * @buffer: data pointer + * @len: number of bytes in the buffer */ u16 crc_ccitt(u16 crc, u8 const *buffer, size_t len) { diff --git a/lib/crc16.c b/lib/crc16.c index 011fe573c..8737b084d 100644 --- a/lib/crc16.c +++ b/lib/crc16.c @@ -47,12 +47,12 @@ u16 const crc16_table[256] = { EXPORT_SYMBOL(crc16_table); /** - * Compute the CRC-16 for the data buffer + * crc16 - compute the CRC-16 for the data buffer + * @crc: previous CRC value + * @buffer: data pointer + * @len: number of bytes in the buffer * - * @param crc previous CRC value - * @param buffer data pointer - * @param len number of bytes in the buffer - * @return the updated CRC value + * Returns the updated CRC value. */ u16 crc16(u16 crc, u8 const *buffer, size_t len) { diff --git a/lib/crc32.c b/lib/crc32.c index 065198f98..285fd9bc6 100644 --- a/lib/crc32.c +++ b/lib/crc32.c @@ -42,20 +42,21 @@ MODULE_AUTHOR("Matt Domsch "); MODULE_DESCRIPTION("Ethernet CRC32 calculations"); MODULE_LICENSE("GPL"); +/** + * crc32_le() - Calculate bitwise little-endian Ethernet AUTODIN II CRC32 + * @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for + * other uses, or the previous crc32 value if computing incrementally. + * @p: pointer to buffer over which CRC is run + * @len: length of buffer @p + */ +u32 __attribute_pure__ crc32_le(u32 crc, unsigned char const *p, size_t len); + #if CRC_LE_BITS == 1 /* * In fact, the table-based code will work in this case, but it can be * simplified by inlining the table in ?: form. */ -/** - * crc32_le() - Calculate bitwise little-endian Ethernet AUTODIN II CRC32 - * @crc - seed value for computation. ~0 for Ethernet, sometimes 0 for - * other uses, or the previous crc32 value if computing incrementally. - * @p - pointer to buffer over which CRC is run - * @len - length of buffer @p - * - */ u32 __attribute_pure__ crc32_le(u32 crc, unsigned char const *p, size_t len) { int i; @@ -68,14 +69,6 @@ u32 __attribute_pure__ crc32_le(u32 crc, unsigned char const *p, size_t len) } #else /* Table-based approach */ -/** - * crc32_le() - Calculate bitwise little-endian Ethernet AUTODIN II CRC32 - * @crc - seed value for computation. ~0 for Ethernet, sometimes 0 for - * other uses, or the previous crc32 value if computing incrementally. - * @p - pointer to buffer over which CRC is run - * @len - length of buffer @p - * - */ u32 __attribute_pure__ crc32_le(u32 crc, unsigned char const *p, size_t len) { # if CRC_LE_BITS == 8 @@ -145,20 +138,21 @@ u32 __attribute_pure__ crc32_le(u32 crc, unsigned char const *p, size_t len) } #endif +/** + * crc32_be() - Calculate bitwise big-endian Ethernet AUTODIN II CRC32 + * @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for + * other uses, or the previous crc32 value if computing incrementally. + * @p: pointer to buffer over which CRC is run + * @len: length of buffer @p + */ +u32 __attribute_pure__ crc32_be(u32 crc, unsigned char const *p, size_t len); + #if CRC_BE_BITS == 1 /* * In fact, the table-based code will work in this case, but it can be * simplified by inlining the table in ?: form. */ -/** - * crc32_be() - Calculate bitwise big-endian Ethernet AUTODIN II CRC32 - * @crc - seed value for computation. ~0 for Ethernet, sometimes 0 for - * other uses, or the previous crc32 value if computing incrementally. - * @p - pointer to buffer over which CRC is run - * @len - length of buffer @p - * - */ u32 __attribute_pure__ crc32_be(u32 crc, unsigned char const *p, size_t len) { int i; @@ -173,14 +167,6 @@ u32 __attribute_pure__ crc32_be(u32 crc, unsigned char const *p, size_t len) } #else /* Table-based approach */ -/** - * crc32_be() - Calculate bitwise big-endian Ethernet AUTODIN II CRC32 - * @crc - seed value for computation. ~0 for Ethernet, sometimes 0 for - * other uses, or the previous crc32 value if computing incrementally. - * @p - pointer to buffer over which CRC is run - * @len - length of buffer @p - * - */ u32 __attribute_pure__ crc32_be(u32 crc, unsigned char const *p, size_t len) { # if CRC_BE_BITS == 8 @@ -249,6 +235,10 @@ u32 __attribute_pure__ crc32_be(u32 crc, unsigned char const *p, size_t len) } #endif +/** + * bitreverse - reverse the order of bits in a u32 value + * @x: value to be bit-reversed + */ u32 bitreverse(u32 x) { x = (x >> 16) | (x << 16); diff --git a/lib/extable.c b/lib/extable.c index 01c08b583..463f4560f 100644 --- a/lib/extable.c +++ b/lib/extable.c @@ -9,7 +9,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include diff --git a/lib/genalloc.c b/lib/genalloc.c index 9ce0a6a3b..71338b48e 100644 --- a/lib/genalloc.c +++ b/lib/genalloc.c @@ -4,10 +4,6 @@ * Uses for this includes on-device special memory, uncached memory * etc. * - * This code is based on the buddy allocator found in the sym53c8xx_2 - * driver Copyright (C) 1999-2001 Gerard Roudier , - * and adapted for general purpose use. - * * Copyright 2005 (C) Jes Sorensen * * This source code is licensed under the GNU General Public License, @@ -15,172 +11,155 @@ */ #include -#include -#include -#include -#include -#include -#include -#include #include -#include - -struct gen_pool *gen_pool_create(int nr_chunks, int max_chunk_shift, - unsigned long (*fp)(struct gen_pool *), - unsigned long data) +/* + * Create a new special memory pool. + * + * @min_alloc_order: log base 2 of number of bytes each bitmap bit represents + * @nid: node id of the node the pool structure should be allocated on, or -1 + */ +struct gen_pool *gen_pool_create(int min_alloc_order, int nid) { - struct gen_pool *poolp; - unsigned long tmp; - int i; - - /* - * This is really an arbitrary limit, +10 is enough for - * IA64_GRANULE_SHIFT, aka 16MB. If anyone needs a large limit - * this can be increased without problems. - */ - if ((max_chunk_shift > (PAGE_SHIFT + 10)) || - ((max_chunk_shift < ALLOC_MIN_SHIFT) && max_chunk_shift)) - return NULL; - - if (!max_chunk_shift) - max_chunk_shift = PAGE_SHIFT; - - poolp = kmalloc(sizeof(struct gen_pool), GFP_KERNEL); - if (!poolp) - return NULL; - memset(poolp, 0, sizeof(struct gen_pool)); - poolp->h = kmalloc(sizeof(struct gen_pool_link) * - (max_chunk_shift - ALLOC_MIN_SHIFT + 1), - GFP_KERNEL); - if (!poolp->h) { - printk(KERN_WARNING "gen_pool_alloc() failed to allocate\n"); - kfree(poolp); - return NULL; - } - memset(poolp->h, 0, sizeof(struct gen_pool_link) * - (max_chunk_shift - ALLOC_MIN_SHIFT + 1)); - - spin_lock_init(&poolp->lock); - poolp->get_new_chunk = fp; - poolp->max_chunk_shift = max_chunk_shift; - poolp->private = data; - - for (i = 0; i < nr_chunks; i++) { - tmp = poolp->get_new_chunk(poolp); - printk(KERN_INFO "allocated %lx\n", tmp); - if (!tmp) - break; - gen_pool_free(poolp, tmp, (1 << poolp->max_chunk_shift)); - } + struct gen_pool *pool; - return poolp; + pool = kmalloc_node(sizeof(struct gen_pool), GFP_KERNEL, nid); + if (pool != NULL) { + rwlock_init(&pool->lock); + INIT_LIST_HEAD(&pool->chunks); + pool->min_alloc_order = min_alloc_order; + } + return pool; } EXPORT_SYMBOL(gen_pool_create); /* - * Simple power of two buddy-like generic allocator. - * Provides naturally aligned memory chunks. + * Add a new chunk of memory to the specified pool. + * + * @pool: pool to add new memory chunk to + * @addr: starting address of memory chunk to add to pool + * @size: size in bytes of the memory chunk to add to pool + * @nid: node id of the node the chunk structure and bitmap should be + * allocated on, or -1 */ -unsigned long gen_pool_alloc(struct gen_pool *poolp, int size) +int gen_pool_add(struct gen_pool *pool, unsigned long addr, size_t size, + int nid) { - int j, i, s, max_chunk_size; - unsigned long a, flags; - struct gen_pool_link *h = poolp->h; + struct gen_pool_chunk *chunk; + int nbits = size >> pool->min_alloc_order; + int nbytes = sizeof(struct gen_pool_chunk) + + (nbits + BITS_PER_BYTE - 1) / BITS_PER_BYTE; - max_chunk_size = 1 << poolp->max_chunk_shift; + chunk = kmalloc_node(nbytes, GFP_KERNEL, nid); + if (unlikely(chunk == NULL)) + return -1; - if (size > max_chunk_size) - return 0; + memset(chunk, 0, nbytes); + spin_lock_init(&chunk->lock); + chunk->start_addr = addr; + chunk->end_addr = addr + size; - size = max(size, 1 << ALLOC_MIN_SHIFT); - i = fls(size - 1); - s = 1 << i; - j = i -= ALLOC_MIN_SHIFT; - - spin_lock_irqsave(&poolp->lock, flags); - while (!h[j].next) { - if (s == max_chunk_size) { - struct gen_pool_link *ptr; - spin_unlock_irqrestore(&poolp->lock, flags); - ptr = (struct gen_pool_link *)poolp->get_new_chunk(poolp); - spin_lock_irqsave(&poolp->lock, flags); - h[j].next = ptr; - if (h[j].next) - h[j].next->next = NULL; - break; - } - j++; - s <<= 1; - } - a = (unsigned long) h[j].next; - if (a) { - h[j].next = h[j].next->next; - /* - * This should be split into a seperate function doing - * the chunk split in order to support custom - * handling memory not physically accessible by host - */ - while (j > i) { - j -= 1; - s >>= 1; - h[j].next = (struct gen_pool_link *) (a + s); - h[j].next->next = NULL; - } - } - spin_unlock_irqrestore(&poolp->lock, flags); - return a; + write_lock(&pool->lock); + list_add(&chunk->next_chunk, &pool->chunks); + write_unlock(&pool->lock); + + return 0; } -EXPORT_SYMBOL(gen_pool_alloc); +EXPORT_SYMBOL(gen_pool_add); /* - * Counter-part of the generic allocator. + * Allocate the requested number of bytes from the specified pool. + * Uses a first-fit algorithm. + * + * @pool: pool to allocate from + * @size: number of bytes to allocate from the pool */ -void gen_pool_free(struct gen_pool *poolp, unsigned long ptr, int size) +unsigned long gen_pool_alloc(struct gen_pool *pool, size_t size) { - struct gen_pool_link *q; - struct gen_pool_link *h = poolp->h; - unsigned long a, b, flags; - int i, s, max_chunk_size; - - max_chunk_size = 1 << poolp->max_chunk_shift; + struct list_head *_chunk; + struct gen_pool_chunk *chunk; + unsigned long addr, flags; + int order = pool->min_alloc_order; + int nbits, bit, start_bit, end_bit; - if (size > max_chunk_size) - return; - - size = max(size, 1 << ALLOC_MIN_SHIFT); - i = fls(size - 1); - s = 1 << i; - i -= ALLOC_MIN_SHIFT; - - a = ptr; + if (size == 0) + return 0; - spin_lock_irqsave(&poolp->lock, flags); - while (1) { - if (s == max_chunk_size) { - ((struct gen_pool_link *)a)->next = h[i].next; - h[i].next = (struct gen_pool_link *)a; - break; + nbits = (size + (1UL << order) - 1) >> order; + + read_lock(&pool->lock); + list_for_each(_chunk, &pool->chunks) { + chunk = list_entry(_chunk, struct gen_pool_chunk, next_chunk); + + end_bit = (chunk->end_addr - chunk->start_addr) >> order; + end_bit -= nbits + 1; + + spin_lock_irqsave(&chunk->lock, flags); + bit = -1; + while (bit + 1 < end_bit) { + bit = find_next_zero_bit(chunk->bits, end_bit, bit + 1); + if (bit >= end_bit) + break; + + start_bit = bit; + if (nbits > 1) { + bit = find_next_bit(chunk->bits, bit + nbits, + bit + 1); + if (bit - start_bit < nbits) + continue; + } + + addr = chunk->start_addr + + ((unsigned long)start_bit << order); + while (nbits--) + __set_bit(start_bit++, &chunk->bits); + spin_unlock_irqrestore(&chunk->lock, flags); + read_unlock(&pool->lock); + return addr; } - b = a ^ s; - q = &h[i]; + spin_unlock_irqrestore(&chunk->lock, flags); + } + read_unlock(&pool->lock); + return 0; +} +EXPORT_SYMBOL(gen_pool_alloc); - while (q->next && q->next != (struct gen_pool_link *)b) - q = q->next; - if (!q->next) { - ((struct gen_pool_link *)a)->next = h[i].next; - h[i].next = (struct gen_pool_link *)a; +/* + * Free the specified memory back to the specified pool. + * + * @pool: pool to free to + * @addr: starting address of memory to free back to pool + * @size: size in bytes of memory to free + */ +void gen_pool_free(struct gen_pool *pool, unsigned long addr, size_t size) +{ + struct list_head *_chunk; + struct gen_pool_chunk *chunk; + unsigned long flags; + int order = pool->min_alloc_order; + int bit, nbits; + + nbits = (size + (1UL << order) - 1) >> order; + + read_lock(&pool->lock); + list_for_each(_chunk, &pool->chunks) { + chunk = list_entry(_chunk, struct gen_pool_chunk, next_chunk); + + if (addr >= chunk->start_addr && addr < chunk->end_addr) { + BUG_ON(addr + size > chunk->end_addr); + spin_lock_irqsave(&chunk->lock, flags); + bit = (addr - chunk->start_addr) >> order; + while (nbits--) + __clear_bit(bit++, &chunk->bits); + spin_unlock_irqrestore(&chunk->lock, flags); break; } - q->next = q->next->next; - a = a & b; - s <<= 1; - i++; } - spin_unlock_irqrestore(&poolp->lock, flags); + BUG_ON(nbits > 0); + read_unlock(&pool->lock); } EXPORT_SYMBOL(gen_pool_free); diff --git a/lib/idr.c b/lib/idr.c index 4d0968195..16d2143fe 100644 --- a/lib/idr.c +++ b/lib/idr.c @@ -38,14 +38,15 @@ static kmem_cache_t *idr_layer_cache; static struct idr_layer *alloc_layer(struct idr *idp) { struct idr_layer *p; + unsigned long flags; - spin_lock(&idp->lock); + spin_lock_irqsave(&idp->lock, flags); if ((p = idp->id_free)) { idp->id_free = p->ary[0]; idp->id_free_cnt--; p->ary[0] = NULL; } - spin_unlock(&idp->lock); + spin_unlock_irqrestore(&idp->lock, flags); return(p); } @@ -59,12 +60,14 @@ static void __free_layer(struct idr *idp, struct idr_layer *p) static void free_layer(struct idr *idp, struct idr_layer *p) { + unsigned long flags; + /* * Depends on the return element being zeroed. */ - spin_lock(&idp->lock); + spin_lock_irqsave(&idp->lock, flags); __free_layer(idp, p); - spin_unlock(&idp->lock); + spin_unlock_irqrestore(&idp->lock, flags); } /** @@ -168,6 +171,7 @@ static int idr_get_new_above_int(struct idr *idp, void *ptr, int starting_id) { struct idr_layer *p, *new; int layers, v, id; + unsigned long flags; id = starting_id; build_up: @@ -191,14 +195,14 @@ build_up: * The allocation failed. If we built part of * the structure tear it down. */ - spin_lock(&idp->lock); + spin_lock_irqsave(&idp->lock, flags); for (new = p; p && p != idp->top; new = p) { p = p->ary[0]; new->ary[0] = NULL; new->bitmap = new->count = 0; __free_layer(idp, new); } - spin_unlock(&idp->lock); + spin_unlock_irqrestore(&idp->lock, flags); return -1; } new->ary[0] = p; diff --git a/lib/iomap_copy.c b/lib/iomap_copy.c index 351045f4f..864fc5ea3 100644 --- a/lib/iomap_copy.c +++ b/lib/iomap_copy.c @@ -40,3 +40,31 @@ void __attribute__((weak)) __iowrite32_copy(void __iomem *to, __raw_writel(*src++, dst++); } EXPORT_SYMBOL_GPL(__iowrite32_copy); + +/** + * __iowrite64_copy - copy data to MMIO space, in 64-bit or 32-bit units + * @to: destination, in MMIO space (must be 64-bit aligned) + * @from: source (must be 64-bit aligned) + * @count: number of 64-bit quantities to copy + * + * Copy data from kernel space to MMIO space, in units of 32 or 64 bits at a + * time. Order of access is not guaranteed, nor is a memory barrier + * performed afterwards. + */ +void __attribute__((weak)) __iowrite64_copy(void __iomem *to, + const void *from, + size_t count) +{ +#ifdef CONFIG_64BIT + u64 __iomem *dst = to; + const u64 *src = from; + const u64 *end = src + count; + + while (src < end) + __raw_writeq(*src++, dst++); +#else + __iowrite32_copy(to, from, count * 2); +#endif +} + +EXPORT_SYMBOL_GPL(__iowrite64_copy); diff --git a/lib/kernel_lock.c b/lib/kernel_lock.c index cb5490ec0..e0fdfddb4 100644 --- a/lib/kernel_lock.c +++ b/lib/kernel_lock.c @@ -14,7 +14,7 @@ * The 'big kernel semaphore' * * This mutex is taken and released recursively by lock_kernel() - * and unlock_kernel(). It is transparently dropped and reaquired + * and unlock_kernel(). It is transparently dropped and reacquired * over schedule(). It is used to protect legacy code that hasn't * been migrated to a proper locking design yet. * @@ -92,7 +92,7 @@ void __lockfunc unlock_kernel(void) * The 'big kernel lock' * * This spinlock is taken and released recursively by lock_kernel() - * and unlock_kernel(). It is transparently dropped and reaquired + * and unlock_kernel(). It is transparently dropped and reacquired * over schedule(). It is used to protect legacy code that hasn't * been migrated to a proper locking design yet. * @@ -177,7 +177,12 @@ static inline void __lock_kernel(void) static inline void __unlock_kernel(void) { - spin_unlock(&kernel_flag); + /* + * the BKL is not covered by lockdep, so we open-code the + * unlocking sequence (and thus avoid the dep-chain ops): + */ + _raw_spin_unlock(&kernel_flag); + preempt_enable(); } /* diff --git a/lib/kobject.c b/lib/kobject.c index 687ab418d..8e7c71993 100644 --- a/lib/kobject.c +++ b/lib/kobject.c @@ -198,14 +198,14 @@ int kobject_add(struct kobject * kobj) /* be noisy on error issues */ if (error == -EEXIST) - pr_debug("kobject_add failed for %s with -EEXIST, " + printk("kobject_add failed for %s with -EEXIST, " "don't try to register things with the " "same name in the same directory.\n", kobject_name(kobj)); else - pr_debug("kobject_add failed for %s (%d)\n", + printk("kobject_add failed for %s (%d)\n", kobject_name(kobj), error); - /* dump_stack(); */ + dump_stack(); } return error; diff --git a/lib/libcrc32c.c b/lib/libcrc32c.c index 52b6dc144..60f46803a 100644 --- a/lib/libcrc32c.c +++ b/lib/libcrc32c.c @@ -88,7 +88,7 @@ crc32c_le(u32 crc, unsigned char const *p, size_t len) * reflect output bytes = true */ -static u32 crc32c_table[256] = { +static const u32 crc32c_table[256] = { 0x00000000L, 0xF26B8303L, 0xE13B70F7L, 0x1350F3F4L, 0xC79A971FL, 0x35F1141CL, 0x26A1E7E8L, 0xD4CA64EBL, 0x8AD958CFL, 0x78B2DBCCL, 0x6BE22838L, 0x9989AB3BL, diff --git a/lib/radix-tree.c b/lib/radix-tree.c index 7097bb239..637d55608 100644 --- a/lib/radix-tree.c +++ b/lib/radix-tree.c @@ -33,7 +33,7 @@ #ifdef __KERNEL__ -#define RADIX_TREE_MAP_SHIFT 6 +#define RADIX_TREE_MAP_SHIFT (CONFIG_BASE_SMALL ? 4 : 6) #else #define RADIX_TREE_MAP_SHIFT 3 /* For more stressful testing */ #endif @@ -74,6 +74,11 @@ struct radix_tree_preload { }; DEFINE_PER_CPU(struct radix_tree_preload, radix_tree_preloads) = { 0, }; +static inline gfp_t root_gfp_mask(struct radix_tree_root *root) +{ + return root->gfp_mask & __GFP_BITS_MASK; +} + /* * This assumes that the caller has performed appropriate preallocation, and * that the caller has pinned this thread of control to the current CPU. @@ -82,9 +87,10 @@ static struct radix_tree_node * radix_tree_node_alloc(struct radix_tree_root *root) { struct radix_tree_node *ret; + gfp_t gfp_mask = root_gfp_mask(root); - ret = kmem_cache_alloc(radix_tree_node_cachep, root->gfp_mask); - if (ret == NULL && !(root->gfp_mask & __GFP_WAIT)) { + ret = kmem_cache_alloc(radix_tree_node_cachep, gfp_mask); + if (ret == NULL && !(gfp_mask & __GFP_WAIT)) { struct radix_tree_preload *rtp; rtp = &__get_cpu_var(radix_tree_preloads); @@ -152,6 +158,27 @@ static inline int tag_get(struct radix_tree_node *node, unsigned int tag, return test_bit(offset, node->tags[tag]); } +static inline void root_tag_set(struct radix_tree_root *root, unsigned int tag) +{ + root->gfp_mask |= (1 << (tag + __GFP_BITS_SHIFT)); +} + + +static inline void root_tag_clear(struct radix_tree_root *root, unsigned int tag) +{ + root->gfp_mask &= ~(1 << (tag + __GFP_BITS_SHIFT)); +} + +static inline void root_tag_clear_all(struct radix_tree_root *root) +{ + root->gfp_mask &= __GFP_BITS_MASK; +} + +static inline int root_tag_get(struct radix_tree_root *root, unsigned int tag) +{ + return root->gfp_mask & (1 << (tag + __GFP_BITS_SHIFT)); +} + /* * Returns 1 if any slot in the node has this tag set. * Otherwise returns 0. @@ -182,7 +209,6 @@ static int radix_tree_extend(struct radix_tree_root *root, unsigned long index) { struct radix_tree_node *node; unsigned int height; - char tags[RADIX_TREE_MAX_TAGS]; int tag; /* Figure out what the height should be. */ @@ -195,16 +221,6 @@ static int radix_tree_extend(struct radix_tree_root *root, unsigned long index) goto out; } - /* - * Prepare the tag status of the top-level node for propagation - * into the newly-pushed top-level node(s) - */ - for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) { - tags[tag] = 0; - if (any_tag_set(root->rnode, tag)) - tags[tag] = 1; - } - do { if (!(node = radix_tree_node_alloc(root))) return -ENOMEM; @@ -214,7 +230,7 @@ static int radix_tree_extend(struct radix_tree_root *root, unsigned long index) /* Propagate the aggregated tag info into the new root */ for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) { - if (tags[tag]) + if (root_tag_get(root, tag)) tag_set(node, tag, 0); } @@ -243,8 +259,7 @@ int radix_tree_insert(struct radix_tree_root *root, int error; /* Make sure the tree is high enough. */ - if ((!index && !root->rnode) || - index > radix_tree_maxindex(root->height)) { + if (index > radix_tree_maxindex(root->height)) { error = radix_tree_extend(root, index); if (error) return error; @@ -255,7 +270,7 @@ int radix_tree_insert(struct radix_tree_root *root, shift = (height-1) * RADIX_TREE_MAP_SHIFT; offset = 0; /* uninitialised var warning */ - do { + while (height > 0) { if (slot == NULL) { /* Have to add a child node. */ if (!(slot = radix_tree_node_alloc(root))) @@ -273,16 +288,21 @@ int radix_tree_insert(struct radix_tree_root *root, slot = node->slots[offset]; shift -= RADIX_TREE_MAP_SHIFT; height--; - } while (height > 0); + } if (slot != NULL) return -EEXIST; - BUG_ON(!node); - node->count++; - node->slots[offset] = item; - BUG_ON(tag_get(node, 0, offset)); - BUG_ON(tag_get(node, 1, offset)); + if (node) { + node->count++; + node->slots[offset] = item; + BUG_ON(tag_get(node, 0, offset)); + BUG_ON(tag_get(node, 1, offset)); + } else { + root->rnode = item; + BUG_ON(root_tag_get(root, 0)); + BUG_ON(root_tag_get(root, 1)); + } return 0; } @@ -295,9 +315,13 @@ static inline void **__lookup_slot(struct radix_tree_root *root, struct radix_tree_node **slot; height = root->height; + if (index > radix_tree_maxindex(height)) return NULL; + if (height == 0 && root->rnode) + return (void **)&root->rnode; + shift = (height-1) * RADIX_TREE_MAP_SHIFT; slot = &root->rnode; @@ -365,11 +389,10 @@ void *radix_tree_tag_set(struct radix_tree_root *root, struct radix_tree_node *slot; height = root->height; - if (index > radix_tree_maxindex(height)) - return NULL; + BUG_ON(index > radix_tree_maxindex(height)); - shift = (height - 1) * RADIX_TREE_MAP_SHIFT; slot = root->rnode; + shift = (height - 1) * RADIX_TREE_MAP_SHIFT; while (height > 0) { int offset; @@ -383,6 +406,10 @@ void *radix_tree_tag_set(struct radix_tree_root *root, height--; } + /* set the root's tag bit */ + if (slot && !root_tag_get(root, tag)) + root_tag_set(root, tag); + return slot; } EXPORT_SYMBOL(radix_tree_tag_set); @@ -405,9 +432,8 @@ void *radix_tree_tag_clear(struct radix_tree_root *root, unsigned long index, unsigned int tag) { struct radix_tree_path path[RADIX_TREE_MAX_PATH], *pathp = path; - struct radix_tree_node *slot; + struct radix_tree_node *slot = NULL; unsigned int height, shift; - void *ret = NULL; height = root->height; if (index > radix_tree_maxindex(height)) @@ -432,20 +458,24 @@ void *radix_tree_tag_clear(struct radix_tree_root *root, height--; } - ret = slot; - if (ret == NULL) + if (slot == NULL) goto out; - do { + while (pathp->node) { if (!tag_get(pathp->node, tag, pathp->offset)) goto out; tag_clear(pathp->node, tag, pathp->offset); if (any_tag_set(pathp->node, tag)) goto out; pathp--; - } while (pathp->node); + } + + /* clear the root's tag bit */ + if (root_tag_get(root, tag)) + root_tag_clear(root, tag); + out: - return ret; + return slot; } EXPORT_SYMBOL(radix_tree_tag_clear); @@ -458,9 +488,8 @@ EXPORT_SYMBOL(radix_tree_tag_clear); * * Return values: * - * 0: tag not present - * 1: tag present, set - * -1: tag present, unset + * 0: tag not present or not set + * 1: tag set */ int radix_tree_tag_get(struct radix_tree_root *root, unsigned long index, unsigned int tag) @@ -473,6 +502,13 @@ int radix_tree_tag_get(struct radix_tree_root *root, if (index > radix_tree_maxindex(height)) return 0; + /* check the root's tag bit */ + if (!root_tag_get(root, tag)) + return 0; + + if (height == 0) + return 1; + shift = (height - 1) * RADIX_TREE_MAP_SHIFT; slot = root->rnode; @@ -494,7 +530,7 @@ int radix_tree_tag_get(struct radix_tree_root *root, int ret = tag_get(slot, tag, offset); BUG_ON(ret && saw_unset_tag); - return ret ? 1 : -1; + return !!ret; } slot = slot->slots[offset]; shift -= RADIX_TREE_MAP_SHIFT; @@ -514,8 +550,11 @@ __lookup(struct radix_tree_root *root, void **results, unsigned long index, unsigned long i; height = root->height; - if (height == 0) + if (height == 0) { + if (root->rnode && index == 0) + results[nr_found++] = root->rnode; goto out; + } shift = (height-1) * RADIX_TREE_MAP_SHIFT; slot = root->rnode; @@ -603,10 +642,16 @@ __lookup_tag(struct radix_tree_root *root, void **results, unsigned long index, unsigned int height = root->height; struct radix_tree_node *slot; + if (height == 0) { + if (root->rnode && index == 0) + results[nr_found++] = root->rnode; + goto out; + } + shift = (height - 1) * RADIX_TREE_MAP_SHIFT; slot = root->rnode; - while (height > 0) { + do { unsigned long i = (index >> shift) & RADIX_TREE_MAP_MASK; for ( ; i < RADIX_TREE_MAP_SIZE; i++) { @@ -637,7 +682,7 @@ __lookup_tag(struct radix_tree_root *root, void **results, unsigned long index, } shift -= RADIX_TREE_MAP_SHIFT; slot = slot->slots[i]; - } + } while (height > 0); out: *next_index = index; return nr_found; @@ -665,6 +710,10 @@ radix_tree_gang_lookup_tag(struct radix_tree_root *root, void **results, unsigned long cur_index = first_index; unsigned int ret = 0; + /* check the root's tag bit */ + if (!root_tag_get(root, tag)) + return 0; + while (ret < max_items) { unsigned int nr_found; unsigned long next_index; /* Index of next search */ @@ -689,7 +738,7 @@ EXPORT_SYMBOL(radix_tree_gang_lookup_tag); static inline void radix_tree_shrink(struct radix_tree_root *root) { /* try to shrink tree height */ - while (root->height > 1 && + while (root->height > 0 && root->rnode->count == 1 && root->rnode->slots[0]) { struct radix_tree_node *to_free = root->rnode; @@ -717,12 +766,8 @@ static inline void radix_tree_shrink(struct radix_tree_root *root) void *radix_tree_delete(struct radix_tree_root *root, unsigned long index) { struct radix_tree_path path[RADIX_TREE_MAX_PATH], *pathp = path; - struct radix_tree_path *orig_pathp; - struct radix_tree_node *slot; + struct radix_tree_node *slot = NULL; unsigned int height, shift; - void *ret = NULL; - char tags[RADIX_TREE_MAX_TAGS]; - int nr_cleared_tags; int tag; int offset; @@ -730,11 +775,17 @@ void *radix_tree_delete(struct radix_tree_root *root, unsigned long index) if (index > radix_tree_maxindex(height)) goto out; + slot = root->rnode; + if (height == 0 && root->rnode) { + root_tag_clear_all(root); + root->rnode = NULL; + goto out; + } + shift = (height - 1) * RADIX_TREE_MAP_SHIFT; pathp->node = NULL; - slot = root->rnode; - for ( ; height > 0; height--) { + do { if (slot == NULL) goto out; @@ -744,44 +795,22 @@ void *radix_tree_delete(struct radix_tree_root *root, unsigned long index) pathp->node = slot; slot = slot->slots[offset]; shift -= RADIX_TREE_MAP_SHIFT; - } + height--; + } while (height > 0); - ret = slot; - if (ret == NULL) + if (slot == NULL) goto out; - orig_pathp = pathp; - /* * Clear all tags associated with the just-deleted item */ - nr_cleared_tags = 0; for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) { - tags[tag] = 1; - if (tag_get(pathp->node, tag, pathp->offset)) { - tag_clear(pathp->node, tag, pathp->offset); - if (!any_tag_set(pathp->node, tag)) { - tags[tag] = 0; - nr_cleared_tags++; - } - } - } - - for (pathp--; nr_cleared_tags && pathp->node; pathp--) { - for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) { - if (tags[tag]) - continue; - - tag_clear(pathp->node, tag, pathp->offset); - if (any_tag_set(pathp->node, tag)) { - tags[tag] = 1; - nr_cleared_tags--; - } - } + if (tag_get(pathp->node, tag, pathp->offset)) + radix_tree_tag_clear(root, index, tag); } /* Now free the nodes we do not need anymore */ - for (pathp = orig_pathp; pathp->node; pathp--) { + while (pathp->node) { pathp->node->slots[pathp->offset] = NULL; pathp->node->count--; @@ -793,11 +822,15 @@ void *radix_tree_delete(struct radix_tree_root *root, unsigned long index) /* Node with zero slots in use so free it */ radix_tree_node_free(pathp->node); + + pathp--; } - root->rnode = NULL; + root_tag_clear_all(root); root->height = 0; + root->rnode = NULL; + out: - return ret; + return slot; } EXPORT_SYMBOL(radix_tree_delete); @@ -808,11 +841,7 @@ EXPORT_SYMBOL(radix_tree_delete); */ int radix_tree_tagged(struct radix_tree_root *root, unsigned int tag) { - struct radix_tree_node *rnode; - rnode = root->rnode; - if (!rnode) - return 0; - return any_tag_set(rnode, tag); + return root_tag_get(root, tag); } EXPORT_SYMBOL(radix_tree_tagged); diff --git a/lib/rbtree.c b/lib/rbtree.c index 14b791ac5..1e55ba1c2 100644 --- a/lib/rbtree.c +++ b/lib/rbtree.c @@ -26,60 +26,66 @@ static void __rb_rotate_left(struct rb_node *node, struct rb_root *root) { struct rb_node *right = node->rb_right; + struct rb_node *parent = rb_parent(node); if ((node->rb_right = right->rb_left)) - right->rb_left->rb_parent = node; + rb_set_parent(right->rb_left, node); right->rb_left = node; - if ((right->rb_parent = node->rb_parent)) + rb_set_parent(right, parent); + + if (parent) { - if (node == node->rb_parent->rb_left) - node->rb_parent->rb_left = right; + if (node == parent->rb_left) + parent->rb_left = right; else - node->rb_parent->rb_right = right; + parent->rb_right = right; } else root->rb_node = right; - node->rb_parent = right; + rb_set_parent(node, right); } static void __rb_rotate_right(struct rb_node *node, struct rb_root *root) { struct rb_node *left = node->rb_left; + struct rb_node *parent = rb_parent(node); if ((node->rb_left = left->rb_right)) - left->rb_right->rb_parent = node; + rb_set_parent(left->rb_right, node); left->rb_right = node; - if ((left->rb_parent = node->rb_parent)) + rb_set_parent(left, parent); + + if (parent) { - if (node == node->rb_parent->rb_right) - node->rb_parent->rb_right = left; + if (node == parent->rb_right) + parent->rb_right = left; else - node->rb_parent->rb_left = left; + parent->rb_left = left; } else root->rb_node = left; - node->rb_parent = left; + rb_set_parent(node, left); } void rb_insert_color(struct rb_node *node, struct rb_root *root) { struct rb_node *parent, *gparent; - while ((parent = node->rb_parent) && parent->rb_color == RB_RED) + while ((parent = rb_parent(node)) && rb_is_red(parent)) { - gparent = parent->rb_parent; + gparent = rb_parent(parent); if (parent == gparent->rb_left) { { register struct rb_node *uncle = gparent->rb_right; - if (uncle && uncle->rb_color == RB_RED) + if (uncle && rb_is_red(uncle)) { - uncle->rb_color = RB_BLACK; - parent->rb_color = RB_BLACK; - gparent->rb_color = RB_RED; + rb_set_black(uncle); + rb_set_black(parent); + rb_set_red(gparent); node = gparent; continue; } @@ -94,17 +100,17 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root) node = tmp; } - parent->rb_color = RB_BLACK; - gparent->rb_color = RB_RED; + rb_set_black(parent); + rb_set_red(gparent); __rb_rotate_right(gparent, root); } else { { register struct rb_node *uncle = gparent->rb_left; - if (uncle && uncle->rb_color == RB_RED) + if (uncle && rb_is_red(uncle)) { - uncle->rb_color = RB_BLACK; - parent->rb_color = RB_BLACK; - gparent->rb_color = RB_RED; + rb_set_black(uncle); + rb_set_black(parent); + rb_set_red(gparent); node = gparent; continue; } @@ -119,13 +125,13 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root) node = tmp; } - parent->rb_color = RB_BLACK; - gparent->rb_color = RB_RED; + rb_set_black(parent); + rb_set_red(gparent); __rb_rotate_left(gparent, root); } } - root->rb_node->rb_color = RB_BLACK; + rb_set_black(root->rb_node); } EXPORT_SYMBOL(rb_insert_color); @@ -134,43 +140,40 @@ static void __rb_erase_color(struct rb_node *node, struct rb_node *parent, { struct rb_node *other; - while ((!node || node->rb_color == RB_BLACK) && node != root->rb_node) + while ((!node || rb_is_black(node)) && node != root->rb_node) { if (parent->rb_left == node) { other = parent->rb_right; - if (other->rb_color == RB_RED) + if (rb_is_red(other)) { - other->rb_color = RB_BLACK; - parent->rb_color = RB_RED; + rb_set_black(other); + rb_set_red(parent); __rb_rotate_left(parent, root); other = parent->rb_right; } - if ((!other->rb_left || - other->rb_left->rb_color == RB_BLACK) - && (!other->rb_right || - other->rb_right->rb_color == RB_BLACK)) + if ((!other->rb_left || rb_is_black(other->rb_left)) && + (!other->rb_right || rb_is_black(other->rb_right))) { - other->rb_color = RB_RED; + rb_set_red(other); node = parent; - parent = node->rb_parent; + parent = rb_parent(node); } else { - if (!other->rb_right || - other->rb_right->rb_color == RB_BLACK) + if (!other->rb_right || rb_is_black(other->rb_right)) { - register struct rb_node *o_left; + struct rb_node *o_left; if ((o_left = other->rb_left)) - o_left->rb_color = RB_BLACK; - other->rb_color = RB_RED; + rb_set_black(o_left); + rb_set_red(other); __rb_rotate_right(other, root); other = parent->rb_right; } - other->rb_color = parent->rb_color; - parent->rb_color = RB_BLACK; + rb_set_color(other, rb_color(parent)); + rb_set_black(parent); if (other->rb_right) - other->rb_right->rb_color = RB_BLACK; + rb_set_black(other->rb_right); __rb_rotate_left(parent, root); node = root->rb_node; break; @@ -179,38 +182,35 @@ static void __rb_erase_color(struct rb_node *node, struct rb_node *parent, else { other = parent->rb_left; - if (other->rb_color == RB_RED) + if (rb_is_red(other)) { - other->rb_color = RB_BLACK; - parent->rb_color = RB_RED; + rb_set_black(other); + rb_set_red(parent); __rb_rotate_right(parent, root); other = parent->rb_left; } - if ((!other->rb_left || - other->rb_left->rb_color == RB_BLACK) - && (!other->rb_right || - other->rb_right->rb_color == RB_BLACK)) + if ((!other->rb_left || rb_is_black(other->rb_left)) && + (!other->rb_right || rb_is_black(other->rb_right))) { - other->rb_color = RB_RED; + rb_set_red(other); node = parent; - parent = node->rb_parent; + parent = rb_parent(node); } else { - if (!other->rb_left || - other->rb_left->rb_color == RB_BLACK) + if (!other->rb_left || rb_is_black(other->rb_left)) { register struct rb_node *o_right; if ((o_right = other->rb_right)) - o_right->rb_color = RB_BLACK; - other->rb_color = RB_RED; + rb_set_black(o_right); + rb_set_red(other); __rb_rotate_left(other, root); other = parent->rb_left; } - other->rb_color = parent->rb_color; - parent->rb_color = RB_BLACK; + rb_set_color(other, rb_color(parent)); + rb_set_black(parent); if (other->rb_left) - other->rb_left->rb_color = RB_BLACK; + rb_set_black(other->rb_left); __rb_rotate_right(parent, root); node = root->rb_node; break; @@ -218,7 +218,7 @@ static void __rb_erase_color(struct rb_node *node, struct rb_node *parent, } } if (node) - node->rb_color = RB_BLACK; + rb_set_black(node); } void rb_erase(struct rb_node *node, struct rb_root *root) @@ -238,48 +238,41 @@ void rb_erase(struct rb_node *node, struct rb_root *root) while ((left = node->rb_left) != NULL) node = left; child = node->rb_right; - parent = node->rb_parent; - color = node->rb_color; + parent = rb_parent(node); + color = rb_color(node); if (child) - child->rb_parent = parent; - if (parent) - { - if (parent->rb_left == node) - parent->rb_left = child; - else - parent->rb_right = child; - } - else - root->rb_node = child; - - if (node->rb_parent == old) + rb_set_parent(child, parent); + if (parent == old) { + parent->rb_right = child; parent = node; - node->rb_parent = old->rb_parent; - node->rb_color = old->rb_color; + } else + parent->rb_left = child; + + node->rb_parent_color = old->rb_parent_color; node->rb_right = old->rb_right; node->rb_left = old->rb_left; - if (old->rb_parent) + if (rb_parent(old)) { - if (old->rb_parent->rb_left == old) - old->rb_parent->rb_left = node; + if (rb_parent(old)->rb_left == old) + rb_parent(old)->rb_left = node; else - old->rb_parent->rb_right = node; + rb_parent(old)->rb_right = node; } else root->rb_node = node; - old->rb_left->rb_parent = node; + rb_set_parent(old->rb_left, node); if (old->rb_right) - old->rb_right->rb_parent = node; + rb_set_parent(old->rb_right, node); goto color; } - parent = node->rb_parent; - color = node->rb_color; + parent = rb_parent(node); + color = rb_color(node); if (child) - child->rb_parent = parent; + rb_set_parent(child, parent); if (parent) { if (parent->rb_left == node) @@ -327,6 +320,8 @@ EXPORT_SYMBOL(rb_last); struct rb_node *rb_next(struct rb_node *node) { + struct rb_node *parent; + /* If we have a right-hand child, go down and then left as far as we can. */ if (node->rb_right) { @@ -342,15 +337,17 @@ struct rb_node *rb_next(struct rb_node *node) ancestor is a right-hand child of its parent, keep going up. First time it's a left-hand child of its parent, said parent is our 'next' node. */ - while (node->rb_parent && node == node->rb_parent->rb_right) - node = node->rb_parent; + while ((parent = rb_parent(node)) && node == parent->rb_right) + node = parent; - return node->rb_parent; + return parent; } EXPORT_SYMBOL(rb_next); struct rb_node *rb_prev(struct rb_node *node) { + struct rb_node *parent; + /* If we have a left-hand child, go down and then right as far as we can. */ if (node->rb_left) { @@ -362,17 +359,17 @@ struct rb_node *rb_prev(struct rb_node *node) /* No left-hand children. Go up till we find an ancestor which is a right-hand child of its parent */ - while (node->rb_parent && node == node->rb_parent->rb_left) - node = node->rb_parent; + while ((parent = rb_parent(node)) && node == parent->rb_left) + node = parent; - return node->rb_parent; + return parent; } EXPORT_SYMBOL(rb_prev); void rb_replace_node(struct rb_node *victim, struct rb_node *new, struct rb_root *root) { - struct rb_node *parent = victim->rb_parent; + struct rb_node *parent = rb_parent(victim); /* Set the surrounding nodes to point to the replacement */ if (parent) { @@ -384,9 +381,9 @@ void rb_replace_node(struct rb_node *victim, struct rb_node *new, root->rb_node = new; } if (victim->rb_left) - victim->rb_left->rb_parent = new; + rb_set_parent(victim->rb_left, new); if (victim->rb_right) - victim->rb_right->rb_parent = new; + rb_set_parent(victim->rb_right, new); /* Copy the pointers/colour from the victim to the replacement */ *new = *victim; diff --git a/lib/reed_solomon/reed_solomon.c b/lib/reed_solomon/reed_solomon.c index f8ac9fa95..2cc11faa4 100644 --- a/lib/reed_solomon/reed_solomon.c +++ b/lib/reed_solomon/reed_solomon.c @@ -54,7 +54,6 @@ static DEFINE_MUTEX(rslistlock); /** * rs_init - Initialize a Reed-Solomon codec - * * @symsize: symbol size, bits (1-8) * @gfpoly: Field generator polynomial coefficients * @fcr: first root of RS code generator polynomial, index form @@ -62,7 +61,7 @@ static DEFINE_MUTEX(rslistlock); * @nroots: RS code generator polynomial degree (number of roots) * * Allocate a control structure and the polynom arrays for faster - * en/decoding. Fill the arrays according to the given parameters + * en/decoding. Fill the arrays according to the given parameters. */ static struct rs_control *rs_init(int symsize, int gfpoly, int fcr, int prim, int nroots) @@ -155,8 +154,7 @@ errrs: /** - * free_rs - Free the rs control structure, if its not longer used - * + * free_rs - Free the rs control structure, if it is no longer used * @rs: the control structure which is not longer used by the * caller */ @@ -176,7 +174,6 @@ void free_rs(struct rs_control *rs) /** * init_rs - Find a matching or allocate a new rs control structure - * * @symsize: the symbol size (number of bits) * @gfpoly: the extended Galois field generator polynomial coefficients, * with the 0th coefficient in the low order bit. The polynomial @@ -236,7 +233,6 @@ out: #ifdef CONFIG_REED_SOLOMON_ENC8 /** * encode_rs8 - Calculate the parity for data values (8bit data width) - * * @rs: the rs control structure * @data: data field of a given type * @len: data length @@ -258,7 +254,6 @@ EXPORT_SYMBOL_GPL(encode_rs8); #ifdef CONFIG_REED_SOLOMON_DEC8 /** * decode_rs8 - Decode codeword (8bit data width) - * * @rs: the rs control structure * @data: data field of a given type * @par: received parity data field @@ -285,7 +280,6 @@ EXPORT_SYMBOL_GPL(decode_rs8); #ifdef CONFIG_REED_SOLOMON_ENC16 /** * encode_rs16 - Calculate the parity for data values (16bit data width) - * * @rs: the rs control structure * @data: data field of a given type * @len: data length @@ -305,7 +299,6 @@ EXPORT_SYMBOL_GPL(encode_rs16); #ifdef CONFIG_REED_SOLOMON_DEC16 /** * decode_rs16 - Decode codeword (16bit data width) - * * @rs: the rs control structure * @data: data field of a given type * @par: received parity data field diff --git a/lib/rwsem-spinlock.c b/lib/rwsem-spinlock.c index 40ffde940..c4cfd6c03 100644 --- a/lib/rwsem-spinlock.c +++ b/lib/rwsem-spinlock.c @@ -17,27 +17,22 @@ struct rwsem_waiter { #define RWSEM_WAITING_FOR_WRITE 0x00000002 }; -#if RWSEM_DEBUG -void rwsemtrace(struct rw_semaphore *sem, const char *str) -{ - if (sem->debug) - printk("[%d] %s({%d,%d})\n", - current->pid, str, sem->activity, - list_empty(&sem->wait_list) ? 0 : 1); -} -#endif - /* * initialise the semaphore */ -void fastcall init_rwsem(struct rw_semaphore *sem) +void __init_rwsem(struct rw_semaphore *sem, const char *name, + struct lock_class_key *key) { +#ifdef CONFIG_DEBUG_LOCK_ALLOC + /* + * Make sure we are not reinitializing a held semaphore: + */ + debug_check_no_locks_freed((void *)sem, sizeof(*sem)); + lockdep_init_map(&sem->dep_map, name, key, 0); +#endif sem->activity = 0; spin_lock_init(&sem->wait_lock); INIT_LIST_HEAD(&sem->wait_list); -#if RWSEM_DEBUG - sem->debug = 0; -#endif } /* @@ -56,8 +51,6 @@ __rwsem_do_wake(struct rw_semaphore *sem, int wakewrite) struct task_struct *tsk; int woken; - rwsemtrace(sem, "Entering __rwsem_do_wake"); - waiter = list_entry(sem->wait_list.next, struct rwsem_waiter, list); if (!wakewrite) { @@ -104,7 +97,6 @@ __rwsem_do_wake(struct rw_semaphore *sem, int wakewrite) sem->activity += woken; out: - rwsemtrace(sem, "Leaving __rwsem_do_wake"); return sem; } @@ -138,8 +130,6 @@ void fastcall __sched __down_read(struct rw_semaphore *sem) struct rwsem_waiter waiter; struct task_struct *tsk; - rwsemtrace(sem, "Entering __down_read"); - spin_lock_irq(&sem->wait_lock); if (sem->activity >= 0 && list_empty(&sem->wait_list)) { @@ -171,9 +161,8 @@ void fastcall __sched __down_read(struct rw_semaphore *sem) } tsk->state = TASK_RUNNING; - out: - rwsemtrace(sem, "Leaving __down_read"); + ; } /* @@ -184,7 +173,6 @@ int fastcall __down_read_trylock(struct rw_semaphore *sem) unsigned long flags; int ret = 0; - rwsemtrace(sem, "Entering __down_read_trylock"); spin_lock_irqsave(&sem->wait_lock, flags); @@ -196,7 +184,6 @@ int fastcall __down_read_trylock(struct rw_semaphore *sem) spin_unlock_irqrestore(&sem->wait_lock, flags); - rwsemtrace(sem, "Leaving __down_read_trylock"); return ret; } @@ -204,13 +191,11 @@ int fastcall __down_read_trylock(struct rw_semaphore *sem) * get a write lock on the semaphore * - we increment the waiting count anyway to indicate an exclusive lock */ -void fastcall __sched __down_write(struct rw_semaphore *sem) +void fastcall __sched __down_write_nested(struct rw_semaphore *sem, int subclass) { struct rwsem_waiter waiter; struct task_struct *tsk; - rwsemtrace(sem, "Entering __down_write"); - spin_lock_irq(&sem->wait_lock); if (sem->activity == 0 && list_empty(&sem->wait_list)) { @@ -242,9 +227,13 @@ void fastcall __sched __down_write(struct rw_semaphore *sem) } tsk->state = TASK_RUNNING; - out: - rwsemtrace(sem, "Leaving __down_write"); + ; +} + +void fastcall __sched __down_write(struct rw_semaphore *sem) +{ + __down_write_nested(sem, 0); } /* @@ -255,8 +244,6 @@ int fastcall __down_write_trylock(struct rw_semaphore *sem) unsigned long flags; int ret = 0; - rwsemtrace(sem, "Entering __down_write_trylock"); - spin_lock_irqsave(&sem->wait_lock, flags); if (sem->activity == 0 && list_empty(&sem->wait_list)) { @@ -267,7 +254,6 @@ int fastcall __down_write_trylock(struct rw_semaphore *sem) spin_unlock_irqrestore(&sem->wait_lock, flags); - rwsemtrace(sem, "Leaving __down_write_trylock"); return ret; } @@ -278,16 +264,12 @@ void fastcall __up_read(struct rw_semaphore *sem) { unsigned long flags; - rwsemtrace(sem, "Entering __up_read"); - spin_lock_irqsave(&sem->wait_lock, flags); if (--sem->activity == 0 && !list_empty(&sem->wait_list)) sem = __rwsem_wake_one_writer(sem); spin_unlock_irqrestore(&sem->wait_lock, flags); - - rwsemtrace(sem, "Leaving __up_read"); } /* @@ -297,8 +279,6 @@ void fastcall __up_write(struct rw_semaphore *sem) { unsigned long flags; - rwsemtrace(sem, "Entering __up_write"); - spin_lock_irqsave(&sem->wait_lock, flags); sem->activity = 0; @@ -306,8 +286,6 @@ void fastcall __up_write(struct rw_semaphore *sem) sem = __rwsem_do_wake(sem, 1); spin_unlock_irqrestore(&sem->wait_lock, flags); - - rwsemtrace(sem, "Leaving __up_write"); } /* @@ -318,8 +296,6 @@ void fastcall __downgrade_write(struct rw_semaphore *sem) { unsigned long flags; - rwsemtrace(sem, "Entering __downgrade_write"); - spin_lock_irqsave(&sem->wait_lock, flags); sem->activity = 1; @@ -327,18 +303,14 @@ void fastcall __downgrade_write(struct rw_semaphore *sem) sem = __rwsem_do_wake(sem, 0); spin_unlock_irqrestore(&sem->wait_lock, flags); - - rwsemtrace(sem, "Leaving __downgrade_write"); } -EXPORT_SYMBOL(init_rwsem); +EXPORT_SYMBOL(__init_rwsem); EXPORT_SYMBOL(__down_read); EXPORT_SYMBOL(__down_read_trylock); +EXPORT_SYMBOL(__down_write_nested); EXPORT_SYMBOL(__down_write); EXPORT_SYMBOL(__down_write_trylock); EXPORT_SYMBOL(__up_read); EXPORT_SYMBOL(__up_write); EXPORT_SYMBOL(__downgrade_write); -#if RWSEM_DEBUG -EXPORT_SYMBOL(rwsemtrace); -#endif diff --git a/lib/rwsem.c b/lib/rwsem.c index 62fa4eba9..a2d725f94 100644 --- a/lib/rwsem.c +++ b/lib/rwsem.c @@ -8,6 +8,26 @@ #include #include +/* + * Initialize an rwsem: + */ +void __init_rwsem(struct rw_semaphore *sem, const char *name, + struct lock_class_key *key) +{ +#ifdef CONFIG_DEBUG_LOCK_ALLOC + /* + * Make sure we are not reinitializing a held semaphore: + */ + debug_check_no_locks_freed((void *)sem, sizeof(*sem)); + lockdep_init_map(&sem->dep_map, name, key, 0); +#endif + sem->count = RWSEM_UNLOCKED_VALUE; + spin_lock_init(&sem->wait_lock); + INIT_LIST_HEAD(&sem->wait_list); +} + +EXPORT_SYMBOL(__init_rwsem); + struct rwsem_waiter { struct list_head list; struct task_struct *task; @@ -16,17 +36,6 @@ struct rwsem_waiter { #define RWSEM_WAITING_FOR_WRITE 0x00000002 }; -#if RWSEM_DEBUG -#undef rwsemtrace -void rwsemtrace(struct rw_semaphore *sem, const char *str) -{ - printk("sem=%p\n", sem); - printk("(sem)=%08lx\n", sem->count); - if (sem->debug) - printk("[%d] %s({%08lx})\n", current->pid, str, sem->count); -} -#endif - /* * handle the lock release when processes blocked on it that can now run * - if we come here from up_xxxx(), then: @@ -45,8 +54,6 @@ __rwsem_do_wake(struct rw_semaphore *sem, int downgrading) struct list_head *next; signed long oldcount, woken, loop; - rwsemtrace(sem, "Entering __rwsem_do_wake"); - if (downgrading) goto dont_wake_writers; @@ -127,7 +134,6 @@ __rwsem_do_wake(struct rw_semaphore *sem, int downgrading) next->prev = &sem->wait_list; out: - rwsemtrace(sem, "Leaving __rwsem_do_wake"); return sem; /* undo the change to count, but check for a transition 1->0 */ @@ -186,13 +192,9 @@ rwsem_down_read_failed(struct rw_semaphore *sem) { struct rwsem_waiter waiter; - rwsemtrace(sem, "Entering rwsem_down_read_failed"); - waiter.flags = RWSEM_WAITING_FOR_READ; rwsem_down_failed_common(sem, &waiter, RWSEM_WAITING_BIAS - RWSEM_ACTIVE_BIAS); - - rwsemtrace(sem, "Leaving rwsem_down_read_failed"); return sem; } @@ -204,12 +206,9 @@ rwsem_down_write_failed(struct rw_semaphore *sem) { struct rwsem_waiter waiter; - rwsemtrace(sem, "Entering rwsem_down_write_failed"); - waiter.flags = RWSEM_WAITING_FOR_WRITE; rwsem_down_failed_common(sem, &waiter, -RWSEM_ACTIVE_BIAS); - rwsemtrace(sem, "Leaving rwsem_down_write_failed"); return sem; } @@ -221,8 +220,6 @@ struct rw_semaphore fastcall *rwsem_wake(struct rw_semaphore *sem) { unsigned long flags; - rwsemtrace(sem, "Entering rwsem_wake"); - spin_lock_irqsave(&sem->wait_lock, flags); /* do nothing if list empty */ @@ -231,8 +228,6 @@ struct rw_semaphore fastcall *rwsem_wake(struct rw_semaphore *sem) spin_unlock_irqrestore(&sem->wait_lock, flags); - rwsemtrace(sem, "Leaving rwsem_wake"); - return sem; } @@ -245,8 +240,6 @@ struct rw_semaphore fastcall *rwsem_downgrade_wake(struct rw_semaphore *sem) { unsigned long flags; - rwsemtrace(sem, "Entering rwsem_downgrade_wake"); - spin_lock_irqsave(&sem->wait_lock, flags); /* do nothing if list empty */ @@ -255,7 +248,6 @@ struct rw_semaphore fastcall *rwsem_downgrade_wake(struct rw_semaphore *sem) spin_unlock_irqrestore(&sem->wait_lock, flags); - rwsemtrace(sem, "Leaving rwsem_downgrade_wake"); return sem; } @@ -263,6 +255,3 @@ EXPORT_SYMBOL(rwsem_down_read_failed); EXPORT_SYMBOL(rwsem_down_write_failed); EXPORT_SYMBOL(rwsem_wake); EXPORT_SYMBOL(rwsem_downgrade_wake); -#if RWSEM_DEBUG -EXPORT_SYMBOL(rwsemtrace); -#endif diff --git a/lib/semaphore-sleepers.c b/lib/semaphore-sleepers.c index 4d5f18889..128180523 100644 --- a/lib/semaphore-sleepers.c +++ b/lib/semaphore-sleepers.c @@ -12,7 +12,6 @@ * * rw semaphores implemented November 1999 by Benjamin LaHaise */ -#include #include #include #include diff --git a/lib/spinlock_debug.c b/lib/spinlock_debug.c index 8ebd8ea08..e249970b1 100644 --- a/lib/spinlock_debug.c +++ b/lib/spinlock_debug.c @@ -6,55 +6,73 @@ * DEBUG_SPINLOCK. */ -#include #include #include +#include #include #include -int nopanic; -static int __init nopanic_setup(char *str) +void __spin_lock_init(spinlock_t *lock, const char *name, + struct lock_class_key *key) { - nopanic = 1; - return 1; +#ifdef CONFIG_DEBUG_LOCK_ALLOC + /* + * Make sure we are not reinitializing a held lock: + */ + debug_check_no_locks_freed((void *)lock, sizeof(*lock)); + lockdep_init_map(&lock->dep_map, name, key, 0); +#endif + lock->raw_lock = (raw_spinlock_t)__RAW_SPIN_LOCK_UNLOCKED; + lock->magic = SPINLOCK_MAGIC; + lock->owner = SPINLOCK_OWNER_INIT; + lock->owner_cpu = -1; } -EXPORT_SYMBOL_GPL(nopanic); -__setup("dontpanic", nopanic_setup); +EXPORT_SYMBOL(__spin_lock_init); + +void __rwlock_init(rwlock_t *lock, const char *name, + struct lock_class_key *key) +{ +#ifdef CONFIG_DEBUG_LOCK_ALLOC + /* + * Make sure we are not reinitializing a held lock: + */ + debug_check_no_locks_freed((void *)lock, sizeof(*lock)); + lockdep_init_map(&lock->dep_map, name, key, 0); +#endif + lock->raw_lock = (raw_rwlock_t) __RAW_RW_LOCK_UNLOCKED; + lock->magic = RWLOCK_MAGIC; + lock->owner = SPINLOCK_OWNER_INIT; + lock->owner_cpu = -1; +} + +EXPORT_SYMBOL(__rwlock_init); static void spin_bug(spinlock_t *lock, const char *msg) { - static long print_once = 1; struct task_struct *owner = NULL; - if (xchg(&print_once, 0)) { - if (lock->owner && lock->owner != SPINLOCK_OWNER_INIT) - owner = lock->owner; - printk(KERN_EMERG "BUG: spinlock %s on CPU#%d, %s/%d (%s)\n", - msg, raw_smp_processor_id(), - current->comm, current->pid, print_tainted()); - printk(KERN_EMERG " lock: %p, .magic: %08x, .owner: %s/%d, " - ".owner_cpu: %d\n", - lock, lock->magic, - owner ? owner->comm : "", - owner ? owner->pid : -1, - lock->owner_cpu); - dump_stack(); -#ifdef CONFIG_SMP - /* - * We cannot continue on SMP: - */ - if (nopanic) - printk("bad locking\n"); - else - panic("bad locking"); -#endif - } + if (!debug_locks_off()) + return; + + if (lock->owner && lock->owner != SPINLOCK_OWNER_INIT) + owner = lock->owner; + printk(KERN_EMERG "BUG: spinlock %s on CPU#%d, %s/%d (%s)\n", + msg, raw_smp_processor_id(), + current->comm, current->pid, print_tainted()); + printk(KERN_EMERG " lock: %p, .magic: %08x, .owner: %s/%d, " + ".owner_cpu: %d\n", + lock, lock->magic, + owner ? owner->comm : "", + owner ? owner->pid : -1, + lock->owner_cpu); + dump_stack(); } #define SPIN_BUG_ON(cond, lock, msg) if (unlikely(cond)) spin_bug(lock, msg) -static inline void debug_spin_lock_before(spinlock_t *lock) +static inline void +debug_spin_lock_before(spinlock_t *lock) { SPIN_BUG_ON(lock->magic != SPINLOCK_MAGIC, lock, "bad magic"); SPIN_BUG_ON(lock->owner == current, lock, "recursion"); @@ -81,11 +99,12 @@ static inline void debug_spin_unlock(spinlock_t *lock) static void __spin_lock_debug(spinlock_t *lock) { - int print_once = 1; u64 i; + u64 loops = loops_per_jiffy * HZ; + int print_once = 1; for (;;) { - for (i = 0; i < loops_per_jiffy * HZ; i++) { + for (i = 0; i < loops; i++) { if (__raw_spin_trylock(&lock->raw_lock)) return; } @@ -132,20 +151,13 @@ void _raw_spin_unlock(spinlock_t *lock) static void rwlock_bug(rwlock_t *lock, const char *msg) { - static long print_once = 1; - - if (xchg(&print_once, 0)) { - printk(KERN_EMERG "BUG: rwlock %s on CPU#%d, %s/%d, %p (%s)\n", - msg, raw_smp_processor_id(), current->comm, - current->pid, lock, print_tainted()); - dump_stack(); -#ifdef CONFIG_SMP - /* - * We cannot continue on SMP: - */ - panic("bad locking"); -#endif - } + if (!debug_locks_off()) + return; + + printk(KERN_EMERG "BUG: rwlock %s on CPU#%d, %s/%d, %p (%s)\n", + msg, raw_smp_processor_id(), current->comm, + current->pid, lock, print_tainted()); + dump_stack(); } #define RWLOCK_BUG_ON(cond, lock, msg) if (unlikely(cond)) rwlock_bug(lock, msg) @@ -153,11 +165,12 @@ static void rwlock_bug(rwlock_t *lock, const char *msg) #if 0 /* __write_lock_debug() can lock up - maybe this can too? */ static void __read_lock_debug(rwlock_t *lock) { - int print_once = 1; u64 i; + u64 loops = loops_per_jiffy * HZ; + int print_once = 1; for (;;) { - for (i = 0; i < loops_per_jiffy * HZ; i++) { + for (i = 0; i < loops; i++) { if (__raw_read_trylock(&lock->raw_lock)) return; } @@ -226,11 +239,12 @@ static inline void debug_write_unlock(rwlock_t *lock) #if 0 /* This can cause lockups */ static void __write_lock_debug(rwlock_t *lock) { - int print_once = 1; u64 i; + u64 loops = loops_per_jiffy * HZ; + int print_once = 1; for (;;) { - for (i = 0; i < loops_per_jiffy * HZ; i++) { + for (i = 0; i < loops; i++) { if (__raw_write_trylock(&lock->raw_lock)) return; } diff --git a/lib/string.c b/lib/string.c index 064f6315b..630772673 100644 --- a/lib/string.c +++ b/lib/string.c @@ -301,6 +301,36 @@ char *strnchr(const char *s, size_t count, int c) EXPORT_SYMBOL(strnchr); #endif +/** + * strstrip - Removes leading and trailing whitespace from @s. + * @s: The string to be stripped. + * + * Note that the first trailing whitespace is replaced with a %NUL-terminator + * in the given string @s. Returns a pointer to the first non-whitespace + * character in @s. + */ +char *strstrip(char *s) +{ + size_t size; + char *end; + + size = strlen(s); + + if (!size) + return s; + + end = s + size - 1; + while (end != s && isspace(*end)) + end--; + *(end + 1) = '\0'; + + while (*s && isspace(*s)) + s++; + + return s; +} +EXPORT_SYMBOL(strstrip); + #ifndef __HAVE_ARCH_STRLEN /** * strlen - Find the length of a string diff --git a/lib/textsearch.c b/lib/textsearch.c index 6f3093efb..2cb4a4379 100644 --- a/lib/textsearch.c +++ b/lib/textsearch.c @@ -93,7 +93,6 @@ * ========================================================================== */ -#include #include #include #include diff --git a/lib/ts_bm.c b/lib/ts_bm.c index 791726579..d90822c37 100644 --- a/lib/ts_bm.c +++ b/lib/ts_bm.c @@ -35,7 +35,6 @@ * matchings spread over multiple fragments, then go BM. */ -#include #include #include #include diff --git a/lib/ts_fsm.c b/lib/ts_fsm.c index ca3211206..87847c2ae 100644 --- a/lib/ts_fsm.c +++ b/lib/ts_fsm.c @@ -26,7 +26,6 @@ * however while in strict mode the average runtime can be better. */ -#include #include #include #include diff --git a/lib/ts_kmp.c b/lib/ts_kmp.c index 7fd45451b..3ced628ca 100644 --- a/lib/ts_kmp.c +++ b/lib/ts_kmp.c @@ -30,7 +30,6 @@ * [2] See finite automation theory */ -#include #include #include #include diff --git a/lib/vsprintf.c b/lib/vsprintf.c index b07db5ca3..bed722937 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -187,49 +187,49 @@ static char * number(char * buf, char * end, unsigned long long num, int base, i size -= precision; if (!(type&(ZEROPAD+LEFT))) { while(size-->0) { - if (buf <= end) + if (buf < end) *buf = ' '; ++buf; } } if (sign) { - if (buf <= end) + if (buf < end) *buf = sign; ++buf; } if (type & SPECIAL) { if (base==8) { - if (buf <= end) + if (buf < end) *buf = '0'; ++buf; } else if (base==16) { - if (buf <= end) + if (buf < end) *buf = '0'; ++buf; - if (buf <= end) + if (buf < end) *buf = digits[33]; ++buf; } } if (!(type & LEFT)) { while (size-- > 0) { - if (buf <= end) + if (buf < end) *buf = c; ++buf; } } while (i < precision--) { - if (buf <= end) + if (buf < end) *buf = '0'; ++buf; } while (i-- > 0) { - if (buf <= end) + if (buf < end) *buf = tmp[i]; ++buf; } while (size-- > 0) { - if (buf <= end) + if (buf < end) *buf = ' '; ++buf; } @@ -272,7 +272,8 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) /* 'z' changed to 'Z' --davidm 1/25/99 */ /* 't' added for ptrdiff_t */ - /* Reject out-of-range values early */ + /* Reject out-of-range values early. Large positive sizes are + used for unknown buffer sizes. */ if (unlikely((int) size < 0)) { /* There can be only one.. */ static int warn = 1; @@ -282,16 +283,17 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) } str = buf; - end = buf + size - 1; + end = buf + size; - if (end < buf - 1) { - end = ((void *) -1); - size = end - buf + 1; + /* Make sure end is always >= buf */ + if (end < buf) { + end = ((void *)-1); + size = end - buf; } for (; *fmt ; ++fmt) { if (*fmt != '%') { - if (str <= end) + if (str < end) *str = *fmt; ++str; continue; @@ -357,17 +359,17 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) case 'c': if (!(flags & LEFT)) { while (--field_width > 0) { - if (str <= end) + if (str < end) *str = ' '; ++str; } } c = (unsigned char) va_arg(args, int); - if (str <= end) + if (str < end) *str = c; ++str; while (--field_width > 0) { - if (str <= end) + if (str < end) *str = ' '; ++str; } @@ -382,18 +384,18 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) if (!(flags & LEFT)) { while (len < field_width--) { - if (str <= end) + if (str < end) *str = ' '; ++str; } } for (i = 0; i < len; ++i) { - if (str <= end) + if (str < end) *str = *s; ++str; ++s; } while (len < field_width--) { - if (str <= end) + if (str < end) *str = ' '; ++str; } @@ -426,7 +428,7 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) continue; case '%': - if (str <= end) + if (str < end) *str = '%'; ++str; continue; @@ -449,11 +451,11 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) break; default: - if (str <= end) + if (str < end) *str = '%'; ++str; if (*fmt) { - if (str <= end) + if (str < end) *str = *fmt; ++str; } else { @@ -483,14 +485,13 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) str = number(str, end, num, base, field_width, precision, flags); } - if (str <= end) - *str = '\0'; - else if (size > 0) - /* don't write out a null byte if the buf size is zero */ - *end = '\0'; - /* the trailing null byte doesn't count towards the total - * ++str; - */ + if (size > 0) { + if (str < end) + *str = '\0'; + else + end[-1] = '\0'; + } + /* the trailing null byte doesn't count towards the total */ return str-buf; } @@ -848,3 +849,26 @@ int sscanf(const char * buf, const char * fmt, ...) } EXPORT_SYMBOL(sscanf); + + +/* Simplified asprintf. */ +char *kasprintf(gfp_t gfp, const char *fmt, ...) +{ + va_list ap; + unsigned int len; + char *p; + + va_start(ap, fmt); + len = vsnprintf(NULL, 0, fmt, ap); + va_end(ap); + + p = kmalloc(len+1, gfp); + if (!p) + return NULL; + va_start(ap, fmt); + vsnprintf(p, len+1, fmt, ap); + va_end(ap); + return p; +} + +EXPORT_SYMBOL(kasprintf); diff --git a/lib/zlib_deflate/deflate.c b/lib/zlib_deflate/deflate.c index 1653dd9bb..c3e4a2baf 100644 --- a/lib/zlib_deflate/deflate.c +++ b/lib/zlib_deflate/deflate.c @@ -164,34 +164,17 @@ static const config configuration_table[10] = { memset((char *)s->head, 0, (unsigned)(s->hash_size-1)*sizeof(*s->head)); /* ========================================================================= */ -int zlib_deflateInit_( - z_streamp strm, - int level, - const char *version, - int stream_size -) -{ - return zlib_deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, - DEF_MEM_LEVEL, - Z_DEFAULT_STRATEGY, version, stream_size); - /* To do: ignore strm->next_in if we use it as window */ -} - -/* ========================================================================= */ -int zlib_deflateInit2_( +int zlib_deflateInit2( z_streamp strm, int level, int method, int windowBits, int memLevel, - int strategy, - const char *version, - int stream_size + int strategy ) { deflate_state *s; int noheader = 0; - static char* my_version = ZLIB_VERSION; deflate_workspace *mem; ush *overlay; @@ -199,10 +182,6 @@ int zlib_deflateInit2_( * output size for (length,distance) codes is <= 24 bits. */ - if (version == NULL || version[0] != my_version[0] || - stream_size != sizeof(z_stream)) { - return Z_VERSION_ERROR; - } if (strm == NULL) return Z_STREAM_ERROR; strm->msg = NULL; diff --git a/lib/zlib_deflate/deflate_syms.c b/lib/zlib_deflate/deflate_syms.c index 767b573d1..ccfe25f39 100644 --- a/lib/zlib_deflate/deflate_syms.c +++ b/lib/zlib_deflate/deflate_syms.c @@ -12,8 +12,7 @@ EXPORT_SYMBOL(zlib_deflate_workspacesize); EXPORT_SYMBOL(zlib_deflate); -EXPORT_SYMBOL(zlib_deflateInit_); -EXPORT_SYMBOL(zlib_deflateInit2_); +EXPORT_SYMBOL(zlib_deflateInit2); EXPORT_SYMBOL(zlib_deflateEnd); EXPORT_SYMBOL(zlib_deflateReset); MODULE_LICENSE("GPL"); diff --git a/lib/zlib_inflate/Makefile b/lib/zlib_inflate/Makefile index 221c139e0..bf065482f 100644 --- a/lib/zlib_inflate/Makefile +++ b/lib/zlib_inflate/Makefile @@ -15,5 +15,5 @@ obj-$(CONFIG_ZLIB_INFLATE) += zlib_inflate.o -zlib_inflate-objs := infblock.o infcodes.o inffast.o inflate.o \ - inflate_sync.o inftrees.o infutil.o inflate_syms.o +zlib_inflate-objs := inffast.o inflate.o \ + inftrees.o inflate_syms.o diff --git a/lib/zlib_inflate/infblock.c b/lib/zlib_inflate/infblock.c deleted file mode 100644 index c16cdeff5..000000000 --- a/lib/zlib_inflate/infblock.c +++ /dev/null @@ -1,365 +0,0 @@ -/* infblock.c -- interpret and process block types to last block - * Copyright (C) 1995-1998 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include -#include "infblock.h" -#include "inftrees.h" -#include "infcodes.h" -#include "infutil.h" - -struct inflate_codes_state; - -/* simplify the use of the inflate_huft type with some defines */ -#define exop word.what.Exop -#define bits word.what.Bits - -/* Table for deflate from PKZIP's appnote.txt. */ -static const uInt border[] = { /* Order of the bit length code lengths */ - 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - -/* - Notes beyond the 1.93a appnote.txt: - - 1. Distance pointers never point before the beginning of the output - stream. - 2. Distance pointers can point back across blocks, up to 32k away. - 3. There is an implied maximum of 7 bits for the bit length table and - 15 bits for the actual data. - 4. If only one code exists, then it is encoded using one bit. (Zero - would be more efficient, but perhaps a little confusing.) If two - codes exist, they are coded using one bit each (0 and 1). - 5. There is no way of sending zero distance codes--a dummy must be - sent if there are none. (History: a pre 2.0 version of PKZIP would - store blocks with no distance codes, but this was discovered to be - too harsh a criterion.) Valid only for 1.93a. 2.04c does allow - zero distance codes, which is sent as one code of zero bits in - length. - 6. There are up to 286 literal/length codes. Code 256 represents the - end-of-block. Note however that the static length tree defines - 288 codes just to fill out the Huffman codes. Codes 286 and 287 - cannot be used though, since there is no length base or extra bits - defined for them. Similarily, there are up to 30 distance codes. - However, static trees define 32 codes (all 5 bits) to fill out the - Huffman codes, but the last two had better not show up in the data. - 7. Unzip can check dynamic Huffman blocks for complete code sets. - The exception is that a single code would not be complete (see #4). - 8. The five bits following the block type is really the number of - literal codes sent minus 257. - 9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits - (1+6+6). Therefore, to output three times the length, you output - three codes (1+1+1), whereas to output four times the same length, - you only need two codes (1+3). Hmm. - 10. In the tree reconstruction algorithm, Code = Code + Increment - only if BitLength(i) is not zero. (Pretty obvious.) - 11. Correction: 4 Bits: # of Bit Length codes - 4 (4 - 19) - 12. Note: length code 284 can represent 227-258, but length code 285 - really is 258. The last length deserves its own, short code - since it gets used a lot in very redundant files. The length - 258 is special since 258 - 3 (the min match length) is 255. - 13. The literal/length and distance code bit lengths are read as a - single stream of lengths. It is possible (and advantageous) for - a repeat code (16, 17, or 18) to go across the boundary between - the two sets of lengths. - */ - - -void zlib_inflate_blocks_reset( - inflate_blocks_statef *s, - z_streamp z, - uLong *c -) -{ - if (c != NULL) - *c = s->check; - if (s->mode == CODES) - zlib_inflate_codes_free(s->sub.decode.codes, z); - s->mode = TYPE; - s->bitk = 0; - s->bitb = 0; - s->read = s->write = s->window; - if (s->checkfn != NULL) - z->adler = s->check = (*s->checkfn)(0L, NULL, 0); -} - -inflate_blocks_statef *zlib_inflate_blocks_new( - z_streamp z, - check_func c, - uInt w -) -{ - inflate_blocks_statef *s; - - s = &WS(z)->working_blocks_state; - s->hufts = WS(z)->working_hufts; - s->window = WS(z)->working_window; - s->end = s->window + w; - s->checkfn = c; - s->mode = TYPE; - zlib_inflate_blocks_reset(s, z, NULL); - return s; -} - - -int zlib_inflate_blocks( - inflate_blocks_statef *s, - z_streamp z, - int r -) -{ - uInt t; /* temporary storage */ - uLong b; /* bit buffer */ - uInt k; /* bits in bit buffer */ - Byte *p; /* input data pointer */ - uInt n; /* bytes available there */ - Byte *q; /* output window write pointer */ - uInt m; /* bytes to end of window or read pointer */ - - /* copy input/output information to locals (UPDATE macro restores) */ - LOAD - - /* process input based on current state */ - while (1) switch (s->mode) - { - case TYPE: - NEEDBITS(3) - t = (uInt)b & 7; - s->last = t & 1; - switch (t >> 1) - { - case 0: /* stored */ - DUMPBITS(3) - t = k & 7; /* go to byte boundary */ - DUMPBITS(t) - s->mode = LENS; /* get length of stored block */ - break; - case 1: /* fixed */ - { - uInt bl, bd; - inflate_huft *tl, *td; - - zlib_inflate_trees_fixed(&bl, &bd, &tl, &td, s->hufts, z); - s->sub.decode.codes = zlib_inflate_codes_new(bl, bd, tl, td, z); - if (s->sub.decode.codes == NULL) - { - r = Z_MEM_ERROR; - LEAVE - } - } - DUMPBITS(3) - s->mode = CODES; - break; - case 2: /* dynamic */ - DUMPBITS(3) - s->mode = TABLE; - break; - case 3: /* illegal */ - DUMPBITS(3) - s->mode = B_BAD; - z->msg = (char*)"invalid block type"; - r = Z_DATA_ERROR; - LEAVE - } - break; - case LENS: - NEEDBITS(32) - if ((((~b) >> 16) & 0xffff) != (b & 0xffff)) - { - s->mode = B_BAD; - z->msg = (char*)"invalid stored block lengths"; - r = Z_DATA_ERROR; - LEAVE - } - s->sub.left = (uInt)b & 0xffff; - b = k = 0; /* dump bits */ - s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE); - break; - case STORED: - if (n == 0) - LEAVE - NEEDOUT - t = s->sub.left; - if (t > n) t = n; - if (t > m) t = m; - memcpy(q, p, t); - p += t; n -= t; - q += t; m -= t; - if ((s->sub.left -= t) != 0) - break; - s->mode = s->last ? DRY : TYPE; - break; - case TABLE: - NEEDBITS(14) - s->sub.trees.table = t = (uInt)b & 0x3fff; -#ifndef PKZIP_BUG_WORKAROUND - if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) - { - s->mode = B_BAD; - z->msg = (char*)"too many length or distance symbols"; - r = Z_DATA_ERROR; - LEAVE - } -#endif - { - s->sub.trees.blens = WS(z)->working_blens; - } - DUMPBITS(14) - s->sub.trees.index = 0; - s->mode = BTREE; - case BTREE: - while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10)) - { - NEEDBITS(3) - s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7; - DUMPBITS(3) - } - while (s->sub.trees.index < 19) - s->sub.trees.blens[border[s->sub.trees.index++]] = 0; - s->sub.trees.bb = 7; - t = zlib_inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb, - &s->sub.trees.tb, s->hufts, z); - if (t != Z_OK) - { - r = t; - if (r == Z_DATA_ERROR) - s->mode = B_BAD; - LEAVE - } - s->sub.trees.index = 0; - s->mode = DTREE; - case DTREE: - while (t = s->sub.trees.table, - s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f)) - { - inflate_huft *h; - uInt i, j, c; - - t = s->sub.trees.bb; - NEEDBITS(t) - h = s->sub.trees.tb + ((uInt)b & zlib_inflate_mask[t]); - t = h->bits; - c = h->base; - if (c < 16) - { - DUMPBITS(t) - s->sub.trees.blens[s->sub.trees.index++] = c; - } - else /* c == 16..18 */ - { - i = c == 18 ? 7 : c - 14; - j = c == 18 ? 11 : 3; - NEEDBITS(t + i) - DUMPBITS(t) - j += (uInt)b & zlib_inflate_mask[i]; - DUMPBITS(i) - i = s->sub.trees.index; - t = s->sub.trees.table; - if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || - (c == 16 && i < 1)) - { - s->mode = B_BAD; - z->msg = (char*)"invalid bit length repeat"; - r = Z_DATA_ERROR; - LEAVE - } - c = c == 16 ? s->sub.trees.blens[i - 1] : 0; - do { - s->sub.trees.blens[i++] = c; - } while (--j); - s->sub.trees.index = i; - } - } - s->sub.trees.tb = NULL; - { - uInt bl, bd; - inflate_huft *tl, *td; - inflate_codes_statef *c; - - bl = 9; /* must be <= 9 for lookahead assumptions */ - bd = 6; /* must be <= 9 for lookahead assumptions */ - t = s->sub.trees.table; - t = zlib_inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), - s->sub.trees.blens, &bl, &bd, &tl, &td, - s->hufts, z); - if (t != Z_OK) - { - if (t == (uInt)Z_DATA_ERROR) - s->mode = B_BAD; - r = t; - LEAVE - } - if ((c = zlib_inflate_codes_new(bl, bd, tl, td, z)) == NULL) - { - r = Z_MEM_ERROR; - LEAVE - } - s->sub.decode.codes = c; - } - s->mode = CODES; - case CODES: - UPDATE - if ((r = zlib_inflate_codes(s, z, r)) != Z_STREAM_END) - return zlib_inflate_flush(s, z, r); - r = Z_OK; - zlib_inflate_codes_free(s->sub.decode.codes, z); - LOAD - if (!s->last) - { - s->mode = TYPE; - break; - } - s->mode = DRY; - case DRY: - FLUSH - if (s->read != s->write) - LEAVE - s->mode = B_DONE; - case B_DONE: - r = Z_STREAM_END; - LEAVE - case B_BAD: - r = Z_DATA_ERROR; - LEAVE - default: - r = Z_STREAM_ERROR; - LEAVE - } -} - - -int zlib_inflate_blocks_free( - inflate_blocks_statef *s, - z_streamp z -) -{ - zlib_inflate_blocks_reset(s, z, NULL); - return Z_OK; -} - - -#if 0 -void zlib_inflate_set_dictionary( - inflate_blocks_statef *s, - const Byte *d, - uInt n -) -{ - memcpy(s->window, d, n); - s->read = s->write = s->window + n; -} -#endif /* 0 */ - - -/* Returns true if inflate is currently at the end of a block generated - * by Z_SYNC_FLUSH or Z_FULL_FLUSH. - * IN assertion: s != NULL - */ -#if 0 -int zlib_inflate_blocks_sync_point( - inflate_blocks_statef *s -) -{ - return s->mode == LENS; -} -#endif /* 0 */ diff --git a/lib/zlib_inflate/infblock.h b/lib/zlib_inflate/infblock.h deleted file mode 100644 index ceee60b51..000000000 --- a/lib/zlib_inflate/infblock.h +++ /dev/null @@ -1,48 +0,0 @@ -/* infblock.h -- header to use infblock.c - * Copyright (C) 1995-1998 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -#ifndef _INFBLOCK_H -#define _INFBLOCK_H - -struct inflate_blocks_state; -typedef struct inflate_blocks_state inflate_blocks_statef; - -extern inflate_blocks_statef * zlib_inflate_blocks_new ( - z_streamp z, - check_func c, /* check function */ - uInt w); /* window size */ - -extern int zlib_inflate_blocks ( - inflate_blocks_statef *, - z_streamp , - int); /* initial return code */ - -extern void zlib_inflate_blocks_reset ( - inflate_blocks_statef *, - z_streamp , - uLong *); /* check value on output */ - -extern int zlib_inflate_blocks_free ( - inflate_blocks_statef *, - z_streamp); - -#if 0 -extern void zlib_inflate_set_dictionary ( - inflate_blocks_statef *s, - const Byte *d, /* dictionary */ - uInt n); /* dictionary length */ -#endif /* 0 */ - -#if 0 -extern int zlib_inflate_blocks_sync_point ( - inflate_blocks_statef *s); -#endif /* 0 */ - -#endif /* _INFBLOCK_H */ diff --git a/lib/zlib_inflate/infcodes.c b/lib/zlib_inflate/infcodes.c deleted file mode 100644 index 07cd7591c..000000000 --- a/lib/zlib_inflate/infcodes.c +++ /dev/null @@ -1,202 +0,0 @@ -/* infcodes.c -- process literals and length/distance pairs - * Copyright (C) 1995-1998 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include -#include "inftrees.h" -#include "infblock.h" -#include "infcodes.h" -#include "infutil.h" -#include "inffast.h" - -/* simplify the use of the inflate_huft type with some defines */ -#define exop word.what.Exop -#define bits word.what.Bits - -inflate_codes_statef *zlib_inflate_codes_new( - uInt bl, - uInt bd, - inflate_huft *tl, - inflate_huft *td, /* need separate declaration for Borland C++ */ - z_streamp z -) -{ - inflate_codes_statef *c; - - c = &WS(z)->working_state; - { - c->mode = START; - c->lbits = (Byte)bl; - c->dbits = (Byte)bd; - c->ltree = tl; - c->dtree = td; - } - return c; -} - - -int zlib_inflate_codes( - inflate_blocks_statef *s, - z_streamp z, - int r -) -{ - uInt j; /* temporary storage */ - inflate_huft *t; /* temporary pointer */ - uInt e; /* extra bits or operation */ - uLong b; /* bit buffer */ - uInt k; /* bits in bit buffer */ - Byte *p; /* input data pointer */ - uInt n; /* bytes available there */ - Byte *q; /* output window write pointer */ - uInt m; /* bytes to end of window or read pointer */ - Byte *f; /* pointer to copy strings from */ - inflate_codes_statef *c = s->sub.decode.codes; /* codes state */ - - /* copy input/output information to locals (UPDATE macro restores) */ - LOAD - - /* process input and output based on current state */ - while (1) switch (c->mode) - { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ - case START: /* x: set up for LEN */ -#ifndef SLOW - if (m >= 258 && n >= 10) - { - UPDATE - r = zlib_inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z); - LOAD - if (r != Z_OK) - { - c->mode = r == Z_STREAM_END ? WASH : BADCODE; - break; - } - } -#endif /* !SLOW */ - c->sub.code.need = c->lbits; - c->sub.code.tree = c->ltree; - c->mode = LEN; - case LEN: /* i: get length/literal/eob next */ - j = c->sub.code.need; - NEEDBITS(j) - t = c->sub.code.tree + ((uInt)b & zlib_inflate_mask[j]); - DUMPBITS(t->bits) - e = (uInt)(t->exop); - if (e == 0) /* literal */ - { - c->sub.lit = t->base; - c->mode = LIT; - break; - } - if (e & 16) /* length */ - { - c->sub.copy.get = e & 15; - c->len = t->base; - c->mode = LENEXT; - break; - } - if ((e & 64) == 0) /* next table */ - { - c->sub.code.need = e; - c->sub.code.tree = t + t->base; - break; - } - if (e & 32) /* end of block */ - { - c->mode = WASH; - break; - } - c->mode = BADCODE; /* invalid code */ - z->msg = (char*)"invalid literal/length code"; - r = Z_DATA_ERROR; - LEAVE - case LENEXT: /* i: getting length extra (have base) */ - j = c->sub.copy.get; - NEEDBITS(j) - c->len += (uInt)b & zlib_inflate_mask[j]; - DUMPBITS(j) - c->sub.code.need = c->dbits; - c->sub.code.tree = c->dtree; - c->mode = DIST; - case DIST: /* i: get distance next */ - j = c->sub.code.need; - NEEDBITS(j) - t = c->sub.code.tree + ((uInt)b & zlib_inflate_mask[j]); - DUMPBITS(t->bits) - e = (uInt)(t->exop); - if (e & 16) /* distance */ - { - c->sub.copy.get = e & 15; - c->sub.copy.dist = t->base; - c->mode = DISTEXT; - break; - } - if ((e & 64) == 0) /* next table */ - { - c->sub.code.need = e; - c->sub.code.tree = t + t->base; - break; - } - c->mode = BADCODE; /* invalid code */ - z->msg = (char*)"invalid distance code"; - r = Z_DATA_ERROR; - LEAVE - case DISTEXT: /* i: getting distance extra */ - j = c->sub.copy.get; - NEEDBITS(j) - c->sub.copy.dist += (uInt)b & zlib_inflate_mask[j]; - DUMPBITS(j) - c->mode = COPY; - case COPY: /* o: copying bytes in window, waiting for space */ - f = q - c->sub.copy.dist; - while (f < s->window) /* modulo window size-"while" instead */ - f += s->end - s->window; /* of "if" handles invalid distances */ - while (c->len) - { - NEEDOUT - OUTBYTE(*f++) - if (f == s->end) - f = s->window; - c->len--; - } - c->mode = START; - break; - case LIT: /* o: got literal, waiting for output space */ - NEEDOUT - OUTBYTE(c->sub.lit) - c->mode = START; - break; - case WASH: /* o: got eob, possibly more output */ - if (k > 7) /* return unused byte, if any */ - { - k -= 8; - n++; - p--; /* can always return one */ - } - FLUSH - if (s->read != s->write) - LEAVE - c->mode = END; - case END: - r = Z_STREAM_END; - LEAVE - case BADCODE: /* x: got error */ - r = Z_DATA_ERROR; - LEAVE - default: - r = Z_STREAM_ERROR; - LEAVE - } -#ifdef NEED_DUMMY_RETURN - return Z_STREAM_ERROR; /* Some dumb compilers complain without this */ -#endif -} - - -void zlib_inflate_codes_free( - inflate_codes_statef *c, - z_streamp z -) -{ -} diff --git a/lib/zlib_inflate/infcodes.h b/lib/zlib_inflate/infcodes.h deleted file mode 100644 index 5cff41752..000000000 --- a/lib/zlib_inflate/infcodes.h +++ /dev/null @@ -1,33 +0,0 @@ -/* infcodes.h -- header to use infcodes.c - * Copyright (C) 1995-1998 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -#ifndef _INFCODES_H -#define _INFCODES_H - -#include "infblock.h" - -struct inflate_codes_state; -typedef struct inflate_codes_state inflate_codes_statef; - -extern inflate_codes_statef *zlib_inflate_codes_new ( - uInt, uInt, - inflate_huft *, inflate_huft *, - z_streamp ); - -extern int zlib_inflate_codes ( - inflate_blocks_statef *, - z_streamp , - int); - -extern void zlib_inflate_codes_free ( - inflate_codes_statef *, - z_streamp ); - -#endif /* _INFCODES_H */ diff --git a/lib/zlib_inflate/inffast.c b/lib/zlib_inflate/inffast.c index 0bd7623fc..d84560c07 100644 --- a/lib/zlib_inflate/inffast.c +++ b/lib/zlib_inflate/inffast.c @@ -1,176 +1,312 @@ -/* inffast.c -- process literals and length/distance pairs fast - * Copyright (C) 1995-1998 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h +/* inffast.c -- fast decoding + * Copyright (C) 1995-2004 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h */ #include #include "inftrees.h" -#include "infblock.h" -#include "infcodes.h" -#include "infutil.h" +#include "inflate.h" #include "inffast.h" -struct inflate_codes_state; - -/* simplify the use of the inflate_huft type with some defines */ -#define exop word.what.Exop -#define bits word.what.Bits - -/* macros for bit input with no checking and for returning unused bytes */ -#define GRABBITS(j) {while(k<(j)){b|=((uLong)NEXTBYTE)<avail_in-n;c=(k>>3)>3:c;n+=c;p-=c;k-=c<<3;} - -/* Called with number of bytes left to write in window at least 258 - (the maximum string length) and number of input bytes available - at least ten. The ten bytes are six bytes for the longest length/ - distance pair plus four bytes for overloading the bit buffer. */ - -int zlib_inflate_fast( - uInt bl, - uInt bd, - inflate_huft *tl, - inflate_huft *td, /* need separate declaration for Borland C++ */ - inflate_blocks_statef *s, - z_streamp z -) +#ifndef ASMINF + +/* Allow machine dependent optimization for post-increment or pre-increment. + Based on testing to date, + Pre-increment preferred for: + - PowerPC G3 (Adler) + - MIPS R5000 (Randers-Pehrson) + Post-increment preferred for: + - none + No measurable difference: + - Pentium III (Anderson) + - M68060 (Nikl) + */ +#ifdef POSTINC +# define OFF 0 +# define PUP(a) *(a)++ +#else +# define OFF 1 +# define PUP(a) *++(a) +#endif + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + + - @start: inflate()'s starting value for strm->avail_out + */ +void inflate_fast(z_streamp strm, unsigned start) { - inflate_huft *t; /* temporary pointer */ - uInt e; /* extra bits or operation */ - uLong b; /* bit buffer */ - uInt k; /* bits in bit buffer */ - Byte *p; /* input data pointer */ - uInt n; /* bytes available there */ - Byte *q; /* output window write pointer */ - uInt m; /* bytes to end of window or read pointer */ - uInt ml; /* mask for literal/length tree */ - uInt md; /* mask for distance tree */ - uInt c; /* bytes to copy */ - uInt d; /* distance back to copy from */ - Byte *r; /* copy source pointer */ - - /* load input, output, bit values */ - LOAD - - /* initialize masks */ - ml = zlib_inflate_mask[bl]; - md = zlib_inflate_mask[bd]; - - /* do until not enough input or output space for fast loop */ - do { /* assume called with m >= 258 && n >= 10 */ - /* get literal/length code */ - GRABBITS(20) /* max bits for literal/length code */ - if ((e = (t = tl + ((uInt)b & ml))->exop) == 0) - { - DUMPBITS(t->bits) - *q++ = (Byte)t->base; - m--; - continue; - } + struct inflate_state *state; + unsigned char *in; /* local strm->next_in */ + unsigned char *last; /* while in < last, enough input available */ + unsigned char *out; /* local strm->next_out */ + unsigned char *beg; /* inflate()'s initial strm->next_out */ + unsigned char *end; /* while out < end, enough space available */ +#ifdef INFLATE_STRICT + unsigned dmax; /* maximum distance from zlib header */ +#endif + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned write; /* window write index */ + unsigned char *window; /* allocated sliding window, if wsize != 0 */ + unsigned long hold; /* local strm->hold */ + unsigned bits; /* local strm->bits */ + code const *lcode; /* local strm->lencode */ + code const *dcode; /* local strm->distcode */ + unsigned lmask; /* mask for first level of length codes */ + unsigned dmask; /* mask for first level of distance codes */ + code this; /* retrieved table entry */ + unsigned op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + unsigned len; /* match length, unused bytes */ + unsigned dist; /* match distance */ + unsigned char *from; /* where to copy match from */ + + /* copy state to local variables */ + state = (struct inflate_state *)strm->state; + in = strm->next_in - OFF; + last = in + (strm->avail_in - 5); + out = strm->next_out - OFF; + beg = out - (start - strm->avail_out); + end = out + (strm->avail_out - 257); +#ifdef INFLATE_STRICT + dmax = state->dmax; +#endif + wsize = state->wsize; + whave = state->whave; + write = state->write; + window = state->window; + hold = state->hold; + bits = state->bits; + lcode = state->lencode; + dcode = state->distcode; + lmask = (1U << state->lenbits) - 1; + dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ do { - DUMPBITS(t->bits) - if (e & 16) - { - /* get extra bits for length */ - e &= 15; - c = t->base + ((uInt)b & zlib_inflate_mask[e]); - DUMPBITS(e) - - /* decode distance base of block to copy */ - GRABBITS(15); /* max bits for distance code */ - e = (t = td + ((uInt)b & md))->exop; - do { - DUMPBITS(t->bits) - if (e & 16) - { - /* get extra bits to add to distance base */ - e &= 15; - GRABBITS(e) /* get extra bits (up to 13) */ - d = t->base + ((uInt)b & zlib_inflate_mask[e]); - DUMPBITS(e) - - /* do the copy */ - m -= c; - r = q - d; - if (r < s->window) /* wrap if needed */ - { - do { - r += s->end - s->window; /* force pointer in window */ - } while (r < s->window); /* covers invalid distances */ - e = s->end - r; - if (c > e) - { - c -= e; /* wrapped copy */ - do { - *q++ = *r++; - } while (--e); - r = s->window; - do { - *q++ = *r++; - } while (--c); - } - else /* normal copy */ - { - *q++ = *r++; c--; - *q++ = *r++; c--; - do { - *q++ = *r++; - } while (--c); - } + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + this = lcode[hold & lmask]; + dolen: + op = (unsigned)(this.bits); + hold >>= op; + bits -= op; + op = (unsigned)(this.op); + if (op == 0) { /* literal */ + PUP(out) = (unsigned char)(this.val); + } + else if (op & 16) { /* length base */ + len = (unsigned)(this.val); + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + len += (unsigned)hold & ((1U << op) - 1); + hold >>= op; + bits -= op; + } + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + this = dcode[hold & dmask]; + dodist: + op = (unsigned)(this.bits); + hold >>= op; + bits -= op; + op = (unsigned)(this.op); + if (op & 16) { /* distance base */ + dist = (unsigned)(this.val); + op &= 15; /* number of extra bits */ + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + } + dist += (unsigned)hold & ((1U << op) - 1); +#ifdef INFLATE_STRICT + if (dist > dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + hold >>= op; + bits -= op; + op = (unsigned)(out - beg); /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + from = window - OFF; + if (write == 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + else if (write < op) { /* wrap around window */ + from += wsize + write - op; + op -= write; + if (op < len) { /* some from end of window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = window - OFF; + if (write < len) { /* some from start of window */ + op = write; + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + } + else { /* contiguous in window */ + from += write - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + while (len > 2) { + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + else { + from = out - dist; /* copy direct from output */ + do { /* minimum length is three */ + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } while (len > 2); + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } } - else /* normal copy */ - { - *q++ = *r++; c--; - *q++ = *r++; c--; - do { - *q++ = *r++; - } while (--c); + else if ((op & 64) == 0) { /* 2nd level distance code */ + this = dcode[this.val + (hold & ((1U << op) - 1))]; + goto dodist; } + else { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + } + else if ((op & 64) == 0) { /* 2nd level length code */ + this = lcode[this.val + (hold & ((1U << op) - 1))]; + goto dolen; + } + else if (op & 32) { /* end-of-block */ + state->mode = TYPE; break; - } - else if ((e & 64) == 0) - { - t += t->base; - e = (t += ((uInt)b & zlib_inflate_mask[e]))->exop; - } - else - { - z->msg = (char*)"invalid distance code"; - UNGRAB - UPDATE - return Z_DATA_ERROR; - } - } while (1); - break; - } - if ((e & 64) == 0) - { - t += t->base; - if ((e = (t += ((uInt)b & zlib_inflate_mask[e]))->exop) == 0) - { - DUMPBITS(t->bits) - *q++ = (Byte)t->base; - m--; - break; } - } - else if (e & 32) - { - UNGRAB - UPDATE - return Z_STREAM_END; - } - else - { - z->msg = (char*)"invalid literal/length code"; - UNGRAB - UPDATE - return Z_DATA_ERROR; - } - } while (1); - } while (m >= 258 && n >= 10); - - /* not enough input or output--restore pointers and return */ - UNGRAB - UPDATE - return Z_OK; + else { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + } while (in < last && out < end); + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + in -= len; + bits -= len << 3; + hold &= (1U << bits) - 1; + + /* update state and return */ + strm->next_in = in + OFF; + strm->next_out = out + OFF; + strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); + strm->avail_out = (unsigned)(out < end ? + 257 + (end - out) : 257 - (out - end)); + state->hold = hold; + state->bits = bits; + return; } + +/* + inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): + - Using bit fields for code structure + - Different op definition to avoid & for extra bits (do & for table bits) + - Three separate decoding do-loops for direct, window, and write == 0 + - Special case for distance > 1 copies to do overlapped load and store copy + - Explicit branch predictions (based on measured branch probabilities) + - Deferring match copy and interspersed it with decoding subsequent codes + - Swapping literal/length else + - Swapping window/direct else + - Larger unrolled copy loops (three is about right) + - Moving len -= 3 statement into middle of loop + */ + +#endif /* !ASMINF */ diff --git a/lib/zlib_inflate/inffast.h b/lib/zlib_inflate/inffast.h index fc720f0fa..40315d9fd 100644 --- a/lib/zlib_inflate/inffast.h +++ b/lib/zlib_inflate/inffast.h @@ -1,6 +1,6 @@ /* inffast.h -- header to use inffast.c - * Copyright (C) 1995-1998 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is @@ -8,10 +8,4 @@ subject to change. Applications should only use zlib.h. */ -extern int zlib_inflate_fast ( - uInt, - uInt, - inflate_huft *, - inflate_huft *, - inflate_blocks_statef *, - z_streamp ); +void inflate_fast (z_streamp strm, unsigned start); diff --git a/lib/zlib_inflate/inffixed.h b/lib/zlib_inflate/inffixed.h new file mode 100644 index 000000000..75ed4b597 --- /dev/null +++ b/lib/zlib_inflate/inffixed.h @@ -0,0 +1,94 @@ + /* inffixed.h -- table for decoding fixed codes + * Generated automatically by makefixed(). + */ + + /* WARNING: this file should *not* be used by applications. It + is part of the implementation of the compression library and + is subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, + {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, + {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, + {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, + {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, + {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, + {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, + {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, + {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, + {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, + {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, + {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, + {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, + {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, + {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, + {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, + {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, + {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, + {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, + {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, + {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, + {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, + {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, + {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, + {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, + {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, + {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, + {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, + {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, + {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, + {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, + {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, + {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, + {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, + {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, + {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, + {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, + {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, + {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, + {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, + {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, + {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, + {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, + {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, + {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, + {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, + {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, + {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, + {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, + {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, + {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, + {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, + {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, + {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, + {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, + {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, + {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, + {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, + {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, + {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, + {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, + {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, + {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, + {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, + {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, + {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, + {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, + {0,9,255} + }; + + static const code distfix[32] = { + {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, + {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, + {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, + {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, + {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, + {22,5,193},{64,5,0} + }; diff --git a/lib/zlib_inflate/inflate.c b/lib/zlib_inflate/inflate.c index 31b9e9054..fceb97c3a 100644 --- a/lib/zlib_inflate/inflate.c +++ b/lib/zlib_inflate/inflate.c @@ -1,89 +1,148 @@ -/* inflate.c -- zlib interface to inflate modules - * Copyright (C) 1995-1998 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h +/* inflate.c -- zlib decompression + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Based on zlib 1.2.3 but modified for the Linux Kernel by + * Richard Purdie + * + * Changes mainly for static instead of dynamic memory allocation + * */ #include -#include "infblock.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" #include "infutil.h" int zlib_inflate_workspacesize(void) { - return sizeof(struct inflate_workspace); + return sizeof(struct inflate_workspace); } +int zlib_inflateReset(z_streamp strm) +{ + struct inflate_state *state; + + if (strm == NULL || strm->state == NULL) return Z_STREAM_ERROR; + state = (struct inflate_state *)strm->state; + strm->total_in = strm->total_out = state->total = 0; + strm->msg = NULL; + strm->adler = 1; /* to support ill-conceived Java test suite */ + state->mode = HEAD; + state->last = 0; + state->havedict = 0; + state->dmax = 32768U; + state->hold = 0; + state->bits = 0; + state->lencode = state->distcode = state->next = state->codes; -int zlib_inflateReset( - z_streamp z -) + /* Initialise Window */ + state->wsize = 1U << state->wbits; + state->write = 0; + state->whave = 0; + + return Z_OK; +} + +#if 0 +int zlib_inflatePrime(z_streamp strm, int bits, int value) { - if (z == NULL || z->state == NULL || z->workspace == NULL) - return Z_STREAM_ERROR; - z->total_in = z->total_out = 0; - z->msg = NULL; - z->state->mode = z->state->nowrap ? BLOCKS : METHOD; - zlib_inflate_blocks_reset(z->state->blocks, z, NULL); - return Z_OK; + struct inflate_state *state; + + if (strm == NULL || strm->state == NULL) return Z_STREAM_ERROR; + state = (struct inflate_state *)strm->state; + if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; + value &= (1L << bits) - 1; + state->hold += value << state->bits; + state->bits += bits; + return Z_OK; } +#endif + +int zlib_inflateInit2(z_streamp strm, int windowBits) +{ + struct inflate_state *state; + + if (strm == NULL) return Z_STREAM_ERROR; + strm->msg = NULL; /* in case we return an error */ + + state = &WS(strm)->inflate_state; + strm->state = (struct internal_state *)state; + + if (windowBits < 0) { + state->wrap = 0; + windowBits = -windowBits; + } + else { + state->wrap = (windowBits >> 4) + 1; + } + if (windowBits < 8 || windowBits > 15) { + return Z_STREAM_ERROR; + } + state->wbits = (unsigned)windowBits; + state->window = &WS(strm)->working_window[0]; + return zlib_inflateReset(strm); +} -int zlib_inflateEnd( - z_streamp z -) +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. This returns fixed tables from inffixed.h. + */ +static void zlib_fixedtables(struct inflate_state *state) { - if (z == NULL || z->state == NULL || z->workspace == NULL) - return Z_STREAM_ERROR; - if (z->state->blocks != NULL) - zlib_inflate_blocks_free(z->state->blocks, z); - z->state = NULL; - return Z_OK; +# include "inffixed.h" + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; } -int zlib_inflateInit2_( - z_streamp z, - int w, - const char *version, - int stream_size -) +/* + Update the window with the last wsize (normally 32K) bytes written before + returning. This is only called when a window is already in use, or when + output has been written during this inflate call, but the end of the deflate + stream has not been reached yet. It is also called to window dictionary data + when a dictionary is loaded. + + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ +static void zlib_updatewindow(z_streamp strm, unsigned out) { - if (version == NULL || version[0] != ZLIB_VERSION[0] || - stream_size != sizeof(z_stream) || z->workspace == NULL) - return Z_VERSION_ERROR; - - /* initialize state */ - z->msg = NULL; - z->state = &WS(z)->internal_state; - z->state->blocks = NULL; - - /* handle undocumented nowrap option (no zlib header or check) */ - z->state->nowrap = 0; - if (w < 0) - { - w = - w; - z->state->nowrap = 1; - } - - /* set window size */ - if (w < 8 || w > 15) - { - zlib_inflateEnd(z); - return Z_STREAM_ERROR; - } - z->state->wbits = (uInt)w; - - /* create inflate_blocks state */ - if ((z->state->blocks = - zlib_inflate_blocks_new(z, z->state->nowrap ? NULL : zlib_adler32, (uInt)1 << w)) - == NULL) - { - zlib_inflateEnd(z); - return Z_MEM_ERROR; - } - - /* reset state */ - zlib_inflateReset(z); - return Z_OK; + struct inflate_state *state; + unsigned copy, dist; + + state = (struct inflate_state *)strm->state; + + /* copy state->wsize or less output bytes into the circular window */ + copy = out - strm->avail_out; + if (copy >= state->wsize) { + memcpy(state->window, strm->next_out - state->wsize, state->wsize); + state->write = 0; + state->whave = state->wsize; + } + else { + dist = state->wsize - state->write; + if (dist > copy) dist = copy; + memcpy(state->window + state->write, strm->next_out - copy, dist); + copy -= dist; + if (copy) { + memcpy(state->window, strm->next_out - copy, copy); + state->write = copy; + state->whave = state->wsize; + } + else { + state->write += dist; + if (state->write == state->wsize) state->write = 0; + if (state->whave < state->wsize) state->whave += dist; + } + } } @@ -91,157 +150,767 @@ int zlib_inflateInit2_( * At the end of a Deflate-compressed PPP packet, we expect to have seen * a `stored' block type value but not the (zero) length bytes. */ -static int zlib_inflate_packet_flush(inflate_blocks_statef *s) +/* + Returns true if inflate is currently at the end of a block generated by + Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP + implementation to provide an additional safety check. PPP uses + Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored + block. When decompressing, PPP checks that at the end of input packet, + inflate is waiting for these length bytes. + */ +static int zlib_inflateSyncPacket(z_streamp strm) { - if (s->mode != LENS) - return Z_DATA_ERROR; - s->mode = TYPE; + struct inflate_state *state; + + if (strm == NULL || strm->state == NULL) return Z_STREAM_ERROR; + state = (struct inflate_state *)strm->state; + + if (state->mode == STORED && state->bits == 0) { + state->mode = TYPE; + return Z_OK; + } + return Z_DATA_ERROR; +} + +/* Macros for inflate(): */ + +/* check function to use adler32() for zlib or crc32() for gzip */ +#define UPDATE(check, buf, len) zlib_adler32(check, buf, len) + +/* Load registers with state in inflate() for speed */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Restore state from registers in inflate() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflate() + if there is no input available. */ +#define PULLBYTE() \ + do { \ + if (have == 0) goto inf_leave; \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflate(). */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Reverse the bytes in a 32-bit value */ +#define REVERSE(q) \ + ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + +/* + inflate() uses a state machine to process as much input data and generate as + much output data as possible before returning. The state machine is + structured roughly as follows: + + for (;;) switch (state) { + ... + case STATEn: + if (not enough input data or output space to make progress) + return; + ... make progress ... + state = STATEm; + break; + ... + } + + so when inflate() is called again, the same case is attempted again, and + if the appropriate resources are provided, the machine proceeds to the + next state. The NEEDBITS() macro is usually the way the state evaluates + whether it can proceed or should return. NEEDBITS() does the return if + the requested bits are not available. The typical use of the BITS macros + is: + + NEEDBITS(n); + ... do something with BITS(n) ... + DROPBITS(n); + + where NEEDBITS(n) either returns from inflate() if there isn't enough + input left to load n bits into the accumulator, or it continues. BITS(n) + gives the low n bits in the accumulator. When done, DROPBITS(n) drops + the low n bits off the accumulator. INITBITS() clears the accumulator + and sets the number of available bits to zero. BYTEBITS() discards just + enough bits to put the accumulator on a byte boundary. After BYTEBITS() + and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. + + NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return + if there is no input available. The decoding of variable length codes uses + PULLBYTE() directly in order to pull just enough bytes to decode the next + code, and no more. + + Some states loop until they get enough input, making sure that enough + state information is maintained to continue the loop where it left off + if NEEDBITS() returns in the loop. For example, want, need, and keep + would all have to actually be part of the saved state in case NEEDBITS() + returns: + + case STATEw: + while (want < need) { + NEEDBITS(n); + keep[want++] = BITS(n); + DROPBITS(n); + } + state = STATEx; + case STATEx: + + As shown above, if the next state is also the next case, then the break + is omitted. + + A state may also return if there is not enough output space available to + complete that state. Those states are copying stored data, writing a + literal byte, and copying a matching string. + + When returning, a "goto inf_leave" is used to update the total counters, + update the check value, and determine whether any progress has been made + during that inflate() call in order to return the proper return code. + Progress is defined as a change in either strm->avail_in or strm->avail_out. + When there is a window, goto inf_leave will update the window with the last + output written. If a goto inf_leave occurs in the middle of decompression + and there is no window currently, goto inf_leave will create one and copy + output to the window for the next call of inflate(). + + In this implementation, the flush parameter of inflate() only affects the + return code (per zlib.h). inflate() always writes as much as possible to + strm->next_out, given the space available and the provided input--the effect + documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers + the allocation of and copying into a sliding window until necessary, which + provides the effect documented in zlib.h for Z_FINISH when the entire input + stream available. So the only thing the flush parameter actually does is: + when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it + will return Z_BUF_ERROR if it has not reached the end of the stream. + */ + +int zlib_inflate(z_streamp strm, int flush) +{ + struct inflate_state *state; + unsigned char *next; /* next input */ + unsigned char *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned in, out; /* save starting available input and output */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char *from; /* where to copy match bytes from */ + code this; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + /* Do not check for strm->next_out == NULL here as ppc zImage + inflates to strm->next_out = 0 */ + + if (strm == NULL || strm->state == NULL || + (strm->next_in == NULL && strm->avail_in != 0)) + return Z_STREAM_ERROR; + + state = (struct inflate_state *)strm->state; + + if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ + LOAD(); + in = have; + out = left; + ret = Z_OK; + for (;;) + switch (state->mode) { + case HEAD: + if (state->wrap == 0) { + state->mode = TYPEDO; + break; + } + NEEDBITS(16); + if ( + ((BITS(8) << 8) + (hold >> 8)) % 31) { + strm->msg = (char *)"incorrect header check"; + state->mode = BAD; + break; + } + if (BITS(4) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + DROPBITS(4); + len = BITS(4) + 8; + if (len > state->wbits) { + strm->msg = (char *)"invalid window size"; + state->mode = BAD; + break; + } + state->dmax = 1U << len; + strm->adler = state->check = zlib_adler32(0L, NULL, 0); + state->mode = hold & 0x200 ? DICTID : TYPE; + INITBITS(); + break; + case DICTID: + NEEDBITS(32); + strm->adler = state->check = REVERSE(hold); + INITBITS(); + state->mode = DICT; + case DICT: + if (state->havedict == 0) { + RESTORE(); + return Z_NEED_DICT; + } + strm->adler = state->check = zlib_adler32(0L, NULL, 0); + state->mode = TYPE; + case TYPE: + if (flush == Z_BLOCK) goto inf_leave; + case TYPEDO: + if (state->last) { + BYTEBITS(); + state->mode = CHECK; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + state->mode = STORED; + break; + case 1: /* fixed block */ + zlib_fixedtables(state); + state->mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + case STORED: + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + INITBITS(); + state->mode = COPY; + case COPY: + copy = state->length; + if (copy) { + if (copy > have) copy = have; + if (copy > left) copy = left; + if (copy == 0) goto inf_leave; + memcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + break; + } + state->mode = TYPE; + break; + case TABLE: + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + state->have = 0; + state->mode = LENLENS; + case LENLENS: + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (code const *)(state->next); + state->lenbits = 7; + ret = zlib_inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + state->have = 0; + state->mode = CODELENS; + case CODELENS: + while (state->have < state->nlen + state->ndist) { + for (;;) { + this = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.val < 16) { + NEEDBITS(this.bits); + DROPBITS(this.bits); + state->lens[state->have++] = this.val; + } + else { + if (this.val == 16) { + NEEDBITS(this.bits + 2); + DROPBITS(this.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = state->lens[state->have - 1]; + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (this.val == 17) { + NEEDBITS(this.bits + 3); + DROPBITS(this.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(this.bits + 7); + DROPBITS(this.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* build code tables */ + state->next = state->codes; + state->lencode = (code const *)(state->next); + state->lenbits = 9; + ret = zlib_inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (code const *)(state->next); + state->distbits = 6; + ret = zlib_inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + state->mode = LEN; + case LEN: + if (have >= 6 && left >= 258) { + RESTORE(); + inflate_fast(strm, out); + LOAD(); + break; + } + for (;;) { + this = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.op && (this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + state->length = (unsigned)this.val; + if ((int)(this.op) == 0) { + state->mode = LIT; + break; + } + if (this.op & 32) { + state->mode = TYPE; + break; + } + if (this.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + state->extra = (unsigned)(this.op) & 15; + state->mode = LENEXT; + case LENEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + } + state->mode = DIST; + case DIST: + for (;;) { + this = state->distcode[BITS(state->distbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if ((this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + if (this.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)this.val; + state->extra = (unsigned)(this.op) & 15; + state->mode = DISTEXT; + case DISTEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + } +#ifdef INFLATE_STRICT + if (state->offset > state->dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + if (state->offset > state->whave + out - left) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + state->mode = MATCH; + case MATCH: + if (left == 0) goto inf_leave; + copy = out - left; + if (state->offset > copy) { /* copy from window */ + copy = state->offset - copy; + if (copy > state->write) { + copy -= state->write; + from = state->window + (state->wsize - copy); + } + else + from = state->window + (state->write - copy); + if (copy > state->length) copy = state->length; + } + else { /* copy from output */ + from = put - state->offset; + copy = state->length; + } + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = *from++; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; + case LIT: + if (left == 0) goto inf_leave; + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + case CHECK: + if (state->wrap) { + NEEDBITS(32); + out -= left; + strm->total_out += out; + state->total += out; + if (out) + strm->adler = state->check = + UPDATE(state->check, put - out, out); + out = left; + if (( + REVERSE(hold)) != state->check) { + strm->msg = (char *)"incorrect data check"; + state->mode = BAD; + break; + } + INITBITS(); + } + state->mode = DONE; + case DONE: + ret = Z_STREAM_END; + goto inf_leave; + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + case MEM: + return Z_MEM_ERROR; + case SYNC: + default: + return Z_STREAM_ERROR; + } + + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call zlib_updatewindow() to create and/or update the window state. + */ + inf_leave: + RESTORE(); + if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) + zlib_updatewindow(strm, out); + + in -= strm->avail_in; + out -= strm->avail_out; + strm->total_in += in; + strm->total_out += out; + state->total += out; + if (state->wrap && out) + strm->adler = state->check = + UPDATE(state->check, strm->next_out - out, out); + + strm->data_type = state->bits + (state->last ? 64 : 0) + + (state->mode == TYPE ? 128 : 0); + if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) + ret = Z_BUF_ERROR; + + if (flush == Z_PACKET_FLUSH && ret == Z_OK && + (strm->avail_out != 0 || strm->avail_in == 0)) + return zlib_inflateSyncPacket(strm); + return ret; +} + +int zlib_inflateEnd(z_streamp strm) +{ + if (strm == NULL || strm->state == NULL) + return Z_STREAM_ERROR; return Z_OK; } +#if 0 +int zlib_inflateSetDictionary(z_streamp strm, const Byte *dictionary, + uInt dictLength) +{ + struct inflate_state *state; + unsigned long id; + + /* check state */ + if (strm == NULL || strm->state == NULL) return Z_STREAM_ERROR; + state = (struct inflate_state *)strm->state; + if (state->wrap != 0 && state->mode != DICT) + return Z_STREAM_ERROR; + + /* check for correct dictionary id */ + if (state->mode == DICT) { + id = zlib_adler32(0L, NULL, 0); + id = zlib_adler32(id, dictionary, dictLength); + if (id != state->check) + return Z_DATA_ERROR; + } + + /* copy dictionary to window */ + zlib_updatewindow(strm, strm->avail_out); -int zlib_inflateInit_( - z_streamp z, - const char *version, - int stream_size -) + if (dictLength > state->wsize) { + memcpy(state->window, dictionary + dictLength - state->wsize, + state->wsize); + state->whave = state->wsize; + } + else { + memcpy(state->window + state->wsize - dictLength, dictionary, + dictLength); + state->whave = dictLength; + } + state->havedict = 1; + return Z_OK; +} +#endif + +#if 0 +/* + Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found + or when out of input. When called, *have is the number of pattern bytes + found in order so far, in 0..3. On return *have is updated to the new + state. If on return *have equals four, then the pattern was found and the + return value is how many bytes were read including the last byte of the + pattern. If *have is less than four, then the pattern has not been found + yet and the return value is len. In the latter case, zlib_syncsearch() can be + called again with more data and the *have state. *have is initialized to + zero for the first call. + */ +static unsigned zlib_syncsearch(unsigned *have, unsigned char *buf, + unsigned len) { - return zlib_inflateInit2_(z, DEF_WBITS, version, stream_size); + unsigned got; + unsigned next; + + got = *have; + next = 0; + while (next < len && got < 4) { + if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) + got++; + else if (buf[next]) + got = 0; + else + got = 4 - got; + next++; + } + *have = got; + return next; } +#endif -#undef NEEDBYTE -#undef NEXTBYTE -#define NEEDBYTE {if(z->avail_in==0)goto empty;r=trv;} -#define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++) +#if 0 +int zlib_inflateSync(z_streamp strm) +{ + unsigned len; /* number of bytes to look at or looked at */ + unsigned long in, out; /* temporary to save total_in and total_out */ + unsigned char buf[4]; /* to restore bit buffer to byte string */ + struct inflate_state *state; + + /* check parameters */ + if (strm == NULL || strm->state == NULL) return Z_STREAM_ERROR; + state = (struct inflate_state *)strm->state; + if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; + + /* if first time, start search in bit buffer */ + if (state->mode != SYNC) { + state->mode = SYNC; + state->hold <<= state->bits & 7; + state->bits -= state->bits & 7; + len = 0; + while (state->bits >= 8) { + buf[len++] = (unsigned char)(state->hold); + state->hold >>= 8; + state->bits -= 8; + } + state->have = 0; + zlib_syncsearch(&(state->have), buf, len); + } + + /* search available input */ + len = zlib_syncsearch(&(state->have), strm->next_in, strm->avail_in); + strm->avail_in -= len; + strm->next_in += len; + strm->total_in += len; + + /* return no joy or set up to restart inflate() on a new block */ + if (state->have != 4) return Z_DATA_ERROR; + in = strm->total_in; out = strm->total_out; + zlib_inflateReset(strm); + strm->total_in = in; strm->total_out = out; + state->mode = TYPE; + return Z_OK; +} +#endif -int zlib_inflate( - z_streamp z, - int f -) +/* + * This subroutine adds the data at next_in/avail_in to the output history + * without performing any output. The output buffer must be "caught up"; + * i.e. no pending output but this should always be the case. The state must + * be waiting on the start of a block (i.e. mode == TYPE or HEAD). On exit, + * the output will also be caught up, and the checksum will have been updated + * if need be. + */ +int zlib_inflateIncomp(z_stream *z) { - int r, trv; - uInt b; - - if (z == NULL || z->state == NULL || z->next_in == NULL) - return Z_STREAM_ERROR; - trv = f == Z_FINISH ? Z_BUF_ERROR : Z_OK; - r = Z_BUF_ERROR; - while (1) switch (z->state->mode) - { - case METHOD: - NEEDBYTE - if (((z->state->sub.method = NEXTBYTE) & 0xf) != Z_DEFLATED) - { - z->state->mode = I_BAD; - z->msg = (char*)"unknown compression method"; - z->state->sub.marker = 5; /* can't try inflateSync */ - break; - } - if ((z->state->sub.method >> 4) + 8 > z->state->wbits) - { - z->state->mode = I_BAD; - z->msg = (char*)"invalid window size"; - z->state->sub.marker = 5; /* can't try inflateSync */ - break; - } - z->state->mode = FLAG; - case FLAG: - NEEDBYTE - b = NEXTBYTE; - if (((z->state->sub.method << 8) + b) % 31) - { - z->state->mode = I_BAD; - z->msg = (char*)"incorrect header check"; - z->state->sub.marker = 5; /* can't try inflateSync */ - break; - } - if (!(b & PRESET_DICT)) - { - z->state->mode = BLOCKS; - break; - } - z->state->mode = DICT4; - case DICT4: - NEEDBYTE - z->state->sub.check.need = (uLong)NEXTBYTE << 24; - z->state->mode = DICT3; - case DICT3: - NEEDBYTE - z->state->sub.check.need += (uLong)NEXTBYTE << 16; - z->state->mode = DICT2; - case DICT2: - NEEDBYTE - z->state->sub.check.need += (uLong)NEXTBYTE << 8; - z->state->mode = DICT1; - case DICT1: - NEEDBYTE - z->state->sub.check.need += (uLong)NEXTBYTE; - z->adler = z->state->sub.check.need; - z->state->mode = DICT0; - return Z_NEED_DICT; - case DICT0: - z->state->mode = I_BAD; - z->msg = (char*)"need dictionary"; - z->state->sub.marker = 0; /* can try inflateSync */ - return Z_STREAM_ERROR; - case BLOCKS: - r = zlib_inflate_blocks(z->state->blocks, z, r); - if (f == Z_PACKET_FLUSH && z->avail_in == 0 && z->avail_out != 0) - r = zlib_inflate_packet_flush(z->state->blocks); - if (r == Z_DATA_ERROR) - { - z->state->mode = I_BAD; - z->state->sub.marker = 0; /* can try inflateSync */ - break; - } - if (r == Z_OK) - r = trv; - if (r != Z_STREAM_END) - return r; - r = trv; - zlib_inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was); - if (z->state->nowrap) - { - z->state->mode = I_DONE; - break; - } - z->state->mode = CHECK4; - case CHECK4: - NEEDBYTE - z->state->sub.check.need = (uLong)NEXTBYTE << 24; - z->state->mode = CHECK3; - case CHECK3: - NEEDBYTE - z->state->sub.check.need += (uLong)NEXTBYTE << 16; - z->state->mode = CHECK2; - case CHECK2: - NEEDBYTE - z->state->sub.check.need += (uLong)NEXTBYTE << 8; - z->state->mode = CHECK1; - case CHECK1: - NEEDBYTE - z->state->sub.check.need += (uLong)NEXTBYTE; - - if (z->state->sub.check.was != z->state->sub.check.need) - { - z->state->mode = I_BAD; - z->msg = (char*)"incorrect data check"; - z->state->sub.marker = 5; /* can't try inflateSync */ - break; - } - z->state->mode = I_DONE; - case I_DONE: - return Z_STREAM_END; - case I_BAD: - return Z_DATA_ERROR; - default: - return Z_STREAM_ERROR; - } - empty: - if (f != Z_PACKET_FLUSH) - return r; - z->state->mode = I_BAD; - z->msg = (char *)"need more for packet flush"; - z->state->sub.marker = 0; /* can try inflateSync */ - return Z_DATA_ERROR; + struct inflate_state *state = (struct inflate_state *)z->state; + Byte *saved_no = z->next_out; + uInt saved_ao = z->avail_out; + + if (state->mode != TYPE && state->mode != HEAD) + return Z_DATA_ERROR; + + /* Setup some variables to allow misuse of updateWindow */ + z->avail_out = 0; + z->next_out = z->next_in + z->avail_in; + + zlib_updatewindow(z, z->avail_in); + + /* Restore saved variables */ + z->avail_out = saved_ao; + z->next_out = saved_no; + + z->adler = state->check = + UPDATE(state->check, z->next_in, z->avail_in); + + z->total_out += z->avail_in; + z->total_in += z->avail_in; + z->next_in += z->avail_in; + state->total += z->avail_in; + z->avail_in = 0; + + return Z_OK; } diff --git a/lib/zlib_inflate/inflate_syms.c b/lib/zlib_inflate/inflate_syms.c index ef49738f5..2061d4f06 100644 --- a/lib/zlib_inflate/inflate_syms.c +++ b/lib/zlib_inflate/inflate_syms.c @@ -12,8 +12,7 @@ EXPORT_SYMBOL(zlib_inflate_workspacesize); EXPORT_SYMBOL(zlib_inflate); -EXPORT_SYMBOL(zlib_inflateInit_); -EXPORT_SYMBOL(zlib_inflateInit2_); +EXPORT_SYMBOL(zlib_inflateInit2); EXPORT_SYMBOL(zlib_inflateEnd); EXPORT_SYMBOL(zlib_inflateReset); EXPORT_SYMBOL(zlib_inflateIncomp); diff --git a/lib/zlib_inflate/inflate_sync.c b/lib/zlib_inflate/inflate_sync.c deleted file mode 100644 index 61411ff89..000000000 --- a/lib/zlib_inflate/inflate_sync.c +++ /dev/null @@ -1,152 +0,0 @@ -/* inflate.c -- zlib interface to inflate modules - * Copyright (C) 1995-1998 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include -#include "infblock.h" -#include "infutil.h" - -#if 0 -int zlib_inflateSync( - z_streamp z -) -{ - uInt n; /* number of bytes to look at */ - Byte *p; /* pointer to bytes */ - uInt m; /* number of marker bytes found in a row */ - uLong r, w; /* temporaries to save total_in and total_out */ - - /* set up */ - if (z == NULL || z->state == NULL) - return Z_STREAM_ERROR; - if (z->state->mode != I_BAD) - { - z->state->mode = I_BAD; - z->state->sub.marker = 0; - } - if ((n = z->avail_in) == 0) - return Z_BUF_ERROR; - p = z->next_in; - m = z->state->sub.marker; - - /* search */ - while (n && m < 4) - { - static const Byte mark[4] = {0, 0, 0xff, 0xff}; - if (*p == mark[m]) - m++; - else if (*p) - m = 0; - else - m = 4 - m; - p++, n--; - } - - /* restore */ - z->total_in += p - z->next_in; - z->next_in = p; - z->avail_in = n; - z->state->sub.marker = m; - - /* return no joy or set up to restart on a new block */ - if (m != 4) - return Z_DATA_ERROR; - r = z->total_in; w = z->total_out; - zlib_inflateReset(z); - z->total_in = r; z->total_out = w; - z->state->mode = BLOCKS; - return Z_OK; -} -#endif /* 0 */ - - -/* Returns true if inflate is currently at the end of a block generated - * by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP - * implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH - * but removes the length bytes of the resulting empty stored block. When - * decompressing, PPP checks that at the end of input packet, inflate is - * waiting for these length bytes. - */ -#if 0 -int zlib_inflateSyncPoint( - z_streamp z -) -{ - if (z == NULL || z->state == NULL || z->state->blocks == NULL) - return Z_STREAM_ERROR; - return zlib_inflate_blocks_sync_point(z->state->blocks); -} -#endif /* 0 */ - -/* - * This subroutine adds the data at next_in/avail_in to the output history - * without performing any output. The output buffer must be "caught up"; - * i.e. no pending output (hence s->read equals s->write), and the state must - * be BLOCKS (i.e. we should be willing to see the start of a series of - * BLOCKS). On exit, the output will also be caught up, and the checksum - * will have been updated if need be. - */ -static int zlib_inflate_addhistory(inflate_blocks_statef *s, - z_stream *z) -{ - uLong b; /* bit buffer */ /* NOT USED HERE */ - uInt k; /* bits in bit buffer */ /* NOT USED HERE */ - uInt t; /* temporary storage */ - Byte *p; /* input data pointer */ - uInt n; /* bytes available there */ - Byte *q; /* output window write pointer */ - uInt m; /* bytes to end of window or read pointer */ - - if (s->read != s->write) - return Z_STREAM_ERROR; - if (s->mode != TYPE) - return Z_DATA_ERROR; - - /* we're ready to rock */ - LOAD - /* while there is input ready, copy to output buffer, moving - * pointers as needed. - */ - while (n) { - t = n; /* how many to do */ - /* is there room until end of buffer? */ - if (t > m) t = m; - /* update check information */ - if (s->checkfn != NULL) - s->check = (*s->checkfn)(s->check, q, t); - memcpy(q, p, t); - q += t; - p += t; - n -= t; - z->total_out += t; - s->read = q; /* drag read pointer forward */ -/* WWRAP */ /* expand WWRAP macro by hand to handle s->read */ - if (q == s->end) { - s->read = q = s->window; - m = WAVAIL; - } - } - UPDATE - return Z_OK; -} - - -/* - * This subroutine adds the data at next_in/avail_in to the output history - * without performing any output. The output buffer must be "caught up"; - * i.e. no pending output (hence s->read equals s->write), and the state must - * be BLOCKS (i.e. we should be willing to see the start of a series of - * BLOCKS). On exit, the output will also be caught up, and the checksum - * will have been updated if need be. - */ - -int zlib_inflateIncomp( - z_stream *z - -) -{ - if (z->state->mode != BLOCKS) - return Z_DATA_ERROR; - return zlib_inflate_addhistory(z->state->blocks, z); -} diff --git a/lib/zlib_inflate/inftrees.c b/lib/zlib_inflate/inftrees.c index 874950ec4..3fe6ce5b5 100644 --- a/lib/zlib_inflate/inftrees.c +++ b/lib/zlib_inflate/inftrees.c @@ -1,412 +1,315 @@ /* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-1998 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h */ #include #include "inftrees.h" -#include "infutil.h" -static const char inflate_copyright[] __attribute_used__ = - " inflate 1.1.3 Copyright 1995-1998 Mark Adler "; +#define MAXBITS 15 + /* - If you use the zlib library in a product, an acknowledgment is welcome - in the documentation of your product. If for some reason you cannot - include such an acknowledgment, I would appreciate that you keep this - copyright string in the executable of your product. + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. */ -struct internal_state; - -/* simplify the use of the inflate_huft type with some defines */ -#define exop word.what.Exop -#define bits word.what.Bits - - -static int huft_build ( - uInt *, /* code lengths in bits */ - uInt, /* number of codes */ - uInt, /* number of "simple" codes */ - const uInt *, /* list of base values for non-simple codes */ - const uInt *, /* list of extra bits for non-simple codes */ - inflate_huft **, /* result: starting table */ - uInt *, /* maximum lookup bits (returns actual) */ - inflate_huft *, /* space for trees */ - uInt *, /* hufts used in space */ - uInt * ); /* space for values */ - -/* Tables for deflate from PKZIP's appnote.txt. */ -static const uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */ +int zlib_inflate_table(codetype type, unsigned short *lens, unsigned codes, + code **table, unsigned *bits, unsigned short *work) +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code this; /* table entry for duplication */ + code *next; /* next available space in table */ + const unsigned short *base; /* base value table to use */ + const unsigned short *extra; /* extra bits table to use */ + int end; /* use base and extra for symbol > end */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; - /* see note #13 above about 258 */ -static const uInt cplext[31] = { /* Extra bits for literal codes 257..285 */ - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, - 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; /* 112==invalid */ -static const uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */ + static const unsigned short lext[31] = { /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 201, 196}; + static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577}; -static const uInt cpdext[30] = { /* Extra bits for distance codes */ - 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, - 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, - 12, 12, 13, 13}; - -/* - Huffman code decoding is performed using a multi-level table lookup. - The fastest way to decode is to simply build a lookup table whose - size is determined by the longest code. However, the time it takes - to build this table can also be a factor if the data being decoded - is not very long. The most common codes are necessarily the - shortest codes, so those codes dominate the decoding time, and hence - the speed. The idea is you can have a shorter table that decodes the - shorter, more probable codes, and then point to subsidiary tables for - the longer codes. The time it costs to decode the longer codes is - then traded against the time it takes to make longer tables. - - This results of this trade are in the variables lbits and dbits - below. lbits is the number of bits the first level table for literal/ - length codes can decode in one step, and dbits is the same thing for - the distance codes. Subsequent tables are also less than or equal to - those sizes. These values may be adjusted either when all of the - codes are shorter than that, in which case the longest code length in - bits is used, or when the shortest code is *longer* than the requested - table size, in which case the length of the shortest code in bits is - used. - - There are two different values for the two tables, since they code a - different number of possibilities each. The literal/length table - codes 286 possible values, or in a flat code, a little over eight - bits. The distance table codes 30 possible values, or a little less - than five bits, flat. The optimum values for speed end up being - about one bit more than those, so lbits is 8+1 and dbits is 5+1. - The optimum values may differ though from machine to machine, and - possibly even between compilers. Your mileage may vary. - */ - - -/* If BMAX needs to be larger than 16, then h and x[] should be uLong. */ -#define BMAX 15 /* maximum bit length of any code */ - -static int huft_build( - uInt *b, /* code lengths in bits (all assumed <= BMAX) */ - uInt n, /* number of codes (assumed <= 288) */ - uInt s, /* number of simple-valued codes (0..s-1) */ - const uInt *d, /* list of base values for non-simple codes */ - const uInt *e, /* list of extra bits for non-simple codes */ - inflate_huft **t, /* result: starting table */ - uInt *m, /* maximum lookup bits, returns actual */ - inflate_huft *hp, /* space for trees */ - uInt *hn, /* hufts used in space */ - uInt *v /* working area: values in order of bit length */ -) -/* Given a list of code lengths and a maximum table size, make a set of - tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR - if the given code set is incomplete (the tables are still built in this - case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of - lengths), or Z_MEM_ERROR if not enough memory. */ -{ + 8193, 12289, 16385, 24577, 0, 0}; + static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) { /* no symbols to code at all */ + this.op = (unsigned char)64; /* invalid code marker */ + this.bits = (unsigned char)1; + this.val = (unsigned short)0; + *(*table)++ = this; /* make a table to force an error */ + *(*table)++ = this; + *bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min <= MAXBITS; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || max != 1)) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked when a LENS table is being made + against the space in *table, ENOUGH, minus the maximum space needed by + the worst case distance code, MAXD. This should never happen, but the + sufficiency of ENOUGH has not been proven exhaustively, hence the check. + This assumes that when type == LENS, bits == 9. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + end = 19; + break; + case LENS: + base = lbase; + base -= 257; + extra = lext; + extra -= 257; + end = 256; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + end = -1; + } - uInt a; /* counter for codes of length k */ - uInt c[BMAX+1]; /* bit length count table */ - uInt f; /* i repeats in table every f entries */ - int g; /* maximum code length */ - int h; /* table level */ - register uInt i; /* counter, current code */ - register uInt j; /* counter */ - register int k; /* number of bits in current code */ - int l; /* bits per table (returned in m) */ - uInt mask; /* (1 << w) - 1, to avoid cc -O bug on HP */ - register uInt *p; /* pointer into c[], b[], or v[] */ - inflate_huft *q; /* points to current table */ - struct inflate_huft_s r; /* table entry for structure assignment */ - inflate_huft *u[BMAX]; /* table stack */ - register int w; /* bits before this table == (l * h) */ - uInt x[BMAX+1]; /* bit offsets, then code stack */ - uInt *xp; /* pointer into x */ - int y; /* number of dummy codes added */ - uInt z; /* number of entries in current table */ - - - /* Generate counts for each bit length */ - p = c; -#define C0 *p++ = 0; -#define C2 C0 C0 C0 C0 -#define C4 C2 C2 C2 C2 - C4 /* clear c[]--assume BMAX+1 is 16 */ - p = b; i = n; - do { - c[*p++]++; /* assume all entries <= BMAX */ - } while (--i); - if (c[0] == n) /* null input--all zero length codes */ - { - *t = NULL; - *m = 0; - return Z_OK; - } - - - /* Find minimum and maximum length, bound *m by those */ - l = *m; - for (j = 1; j <= BMAX; j++) - if (c[j]) - break; - k = j; /* minimum code length */ - if ((uInt)l < j) - l = j; - for (i = BMAX; i; i--) - if (c[i]) - break; - g = i; /* maximum code length */ - if ((uInt)l > i) - l = i; - *m = l; - - - /* Adjust last length count to fill out codes, if needed */ - for (y = 1 << j; j < i; j++, y <<= 1) - if ((y -= c[j]) < 0) - return Z_DATA_ERROR; - if ((y -= c[i]) < 0) - return Z_DATA_ERROR; - c[i] += y; - - - /* Generate starting offsets into the value table for each length */ - x[1] = j = 0; - p = c + 1; xp = x + 2; - while (--i) { /* note that i == g from above */ - *xp++ = (j += *p++); - } - - - /* Make a table of values in order of bit lengths */ - p = b; i = 0; - do { - if ((j = *p++) != 0) - v[x[j]++] = i; - } while (++i < n); - n = x[g]; /* set n to length of v */ - - - /* Generate the Huffman codes and for each, make the table entries */ - x[0] = i = 0; /* first Huffman code is zero */ - p = v; /* grab values in bit order */ - h = -1; /* no tables yet--level -1 */ - w = -l; /* bits decoded == (l * h) */ - u[0] = NULL; /* just to keep compilers happy */ - q = NULL; /* ditto */ - z = 0; /* ditto */ - - /* go through the bit lengths (k already is bits in shortest code) */ - for (; k <= g; k++) - { - a = c[k]; - while (a--) - { - /* here i is the Huffman code of length k bits for value *p */ - /* make tables up to required level */ - while (k > w + l) - { - h++; - w += l; /* previous table always l bits */ - - /* compute minimum size table less than or equal to l bits */ - z = g - w; - z = z > (uInt)l ? l : z; /* table size upper limit */ - if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */ - { /* too few codes for k-w bit table */ - f -= a + 1; /* deduct codes from patterns left */ - xp = c + k; - if (j < z) - while (++j < z) /* try smaller tables up to z bits */ - { - if ((f <<= 1) <= *++xp) - break; /* enough codes to use up j bits */ - f -= *xp; /* else deduct codes from patterns */ - } + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if (type == LENS && used >= ENOUGH - MAXD) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + this.bits = (unsigned char)(len - drop); + if ((int)(work[sym]) < end) { + this.op = (unsigned char)0; + this.val = work[sym]; } - z = 1 << j; /* table entries for j-bit table */ - - /* allocate new table */ - if (*hn + z > MANY) /* (note: doesn't matter for fixed) */ - return Z_DATA_ERROR; /* overflow of MANY */ - u[h] = q = hp + *hn; - *hn += z; - - /* connect to last table, if there is one */ - if (h) - { - x[h] = i; /* save pattern for backing up */ - r.bits = (Byte)l; /* bits to dump before this table */ - r.exop = (Byte)j; /* bits in this table */ - j = i >> (w - l); - r.base = (uInt)(q - u[h-1] - j); /* offset to this table */ - u[h-1][j] = r; /* connect to last table */ + else if ((int)(work[sym]) > end) { + this.op = (unsigned char)(extra[work[sym]]); + this.val = base[work[sym]]; + } + else { + this.op = (unsigned char)(32 + 64); /* end of block */ + this.val = 0; } - else - *t = q; /* first table is returned result */ - } - - /* set up table entry in r */ - r.bits = (Byte)(k - w); - if (p >= v + n) - r.exop = 128 + 64; /* out of values--invalid code */ - else if (*p < s) - { - r.exop = (Byte)(*p < 256 ? 0 : 32 + 64); /* 256 is end-of-block */ - r.base = *p++; /* simple code is just the value */ - } - else - { - r.exop = (Byte)(e[*p - s] + 16 + 64);/* non-simple--look up in lists */ - r.base = d[*p++ - s]; - } - - /* fill code-like entries with r */ - f = 1 << (k - w); - for (j = i >> w; j < z; j += f) - q[j] = r; - - /* backwards increment the k-bit code i */ - for (j = 1 << (k - 1); i & j; j >>= 1) - i ^= j; - i ^= j; - - /* backup over finished tables */ - mask = (1 << w) - 1; /* needed on HP, cc -O bug */ - while ((i & mask) != x[h]) - { - h--; /* don't need to update q */ - w -= l; - mask = (1 << w) - 1; - } - } - } + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + next[(huff >> drop) + fill] = this; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; - /* Return Z_BUF_ERROR if we were given an incomplete table */ - return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK; -} + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += min; /* here min is 1 << curr */ + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } -int zlib_inflate_trees_bits( - uInt *c, /* 19 code lengths */ - uInt *bb, /* bits tree desired/actual depth */ - inflate_huft **tb, /* bits tree result */ - inflate_huft *hp, /* space for trees */ - z_streamp z /* for messages */ -) -{ - int r; - uInt hn = 0; /* hufts used in space */ - uInt *v; /* work area for huft_build */ - - v = WS(z)->tree_work_area_1; - r = huft_build(c, 19, 19, NULL, NULL, tb, bb, hp, &hn, v); - if (r == Z_DATA_ERROR) - z->msg = (char*)"oversubscribed dynamic bit lengths tree"; - else if (r == Z_BUF_ERROR || *bb == 0) - { - z->msg = (char*)"incomplete dynamic bit lengths tree"; - r = Z_DATA_ERROR; - } - return r; -} + /* check for enough space */ + used += 1U << curr; + if (type == LENS && used >= ENOUGH - MAXD) + return 1; -int zlib_inflate_trees_dynamic( - uInt nl, /* number of literal/length codes */ - uInt nd, /* number of distance codes */ - uInt *c, /* that many (total) code lengths */ - uInt *bl, /* literal desired/actual bit depth */ - uInt *bd, /* distance desired/actual bit depth */ - inflate_huft **tl, /* literal/length tree result */ - inflate_huft **td, /* distance tree result */ - inflate_huft *hp, /* space for trees */ - z_streamp z /* for messages */ -) -{ - int r; - uInt hn = 0; /* hufts used in space */ - uInt *v; /* work area for huft_build */ - - /* allocate work area */ - v = WS(z)->tree_work_area_2; - - /* build literal/length tree */ - r = huft_build(c, nl, 257, cplens, cplext, tl, bl, hp, &hn, v); - if (r != Z_OK || *bl == 0) - { - if (r == Z_DATA_ERROR) - z->msg = (char*)"oversubscribed literal/length tree"; - else if (r != Z_MEM_ERROR) - { - z->msg = (char*)"incomplete literal/length tree"; - r = Z_DATA_ERROR; - } - return r; - } - - /* build distance tree */ - r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, hp, &hn, v); - if (r != Z_OK || (*bd == 0 && nl > 257)) - { - if (r == Z_DATA_ERROR) - z->msg = (char*)"oversubscribed distance tree"; - else if (r == Z_BUF_ERROR) { -#ifdef PKZIP_BUG_WORKAROUND - r = Z_OK; - } -#else - z->msg = (char*)"incomplete distance tree"; - r = Z_DATA_ERROR; - } - else if (r != Z_MEM_ERROR) - { - z->msg = (char*)"empty distance tree with lengths"; - r = Z_DATA_ERROR; + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } } - return r; -#endif - } - /* done */ - return Z_OK; -} + /* + Fill in rest of table for incomplete codes. This loop is similar to the + loop above in incrementing huff for table indices. It is assumed that + len is equal to curr + drop, so there is no loop needed to increment + through high index bits. When the current sub-table is filled, the loop + drops back to the root table to fill in any remaining entries there. + */ + this.op = (unsigned char)64; /* invalid code marker */ + this.bits = (unsigned char)(len - drop); + this.val = (unsigned short)0; + while (huff != 0) { + /* when done with sub-table, drop back to root table */ + if (drop != 0 && (huff & mask) != low) { + drop = 0; + len = root; + next = *table; + this.bits = (unsigned char)len; + } + /* put invalid code marker in table */ + next[huff >> drop] = this; -int zlib_inflate_trees_fixed( - uInt *bl, /* literal desired/actual bit depth */ - uInt *bd, /* distance desired/actual bit depth */ - inflate_huft **tl, /* literal/length tree result */ - inflate_huft **td, /* distance tree result */ - inflate_huft *hp, /* space for trees */ - z_streamp z /* for memory allocation */ -) -{ - int i; /* temporary variable */ - unsigned l[288]; /* length list for huft_build */ - uInt *v; /* work area for huft_build */ - - /* set up literal table */ - for (i = 0; i < 144; i++) - l[i] = 8; - for (; i < 256; i++) - l[i] = 9; - for (; i < 280; i++) - l[i] = 7; - for (; i < 288; i++) /* make a complete, but wrong code set */ - l[i] = 8; - *bl = 9; - v = WS(z)->tree_work_area_1; - if ((i = huft_build(l, 288, 257, cplens, cplext, tl, bl, hp, &i, v)) != 0) - return i; - - /* set up distance table */ - for (i = 0; i < 30; i++) /* make an incomplete code set */ - l[i] = 5; - *bd = 5; - if ((i = huft_build(l, 30, 0, cpdist, cpdext, td, bd, hp, &i, v)) > 1) - return i; - - return Z_OK; + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; } diff --git a/lib/zlib_inflate/inftrees.h b/lib/zlib_inflate/inftrees.h index e37705adc..5f5219b12 100644 --- a/lib/zlib_inflate/inftrees.h +++ b/lib/zlib_inflate/inftrees.h @@ -1,6 +1,6 @@ /* inftrees.h -- header to use inftrees.c - * Copyright (C) 1995-1998 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is @@ -8,57 +8,48 @@ subject to change. Applications should only use zlib.h. */ -/* Huffman code lookup table entry--this entry is four bytes for machines - that have 16-bit pointers (e.g. PC's in the small or medium model). */ - -#ifndef _INFTREES_H -#define _INFTREES_H - -typedef struct inflate_huft_s inflate_huft; - -struct inflate_huft_s { - union { - struct { - Byte Exop; /* number of extra bits or operation */ - Byte Bits; /* number of bits in this code or subcode */ - } what; - uInt pad; /* pad structure to a power of 2 (4 bytes for */ - } word; /* 16-bit, 8 bytes for 32-bit int's) */ - uInt base; /* literal, length base, distance base, - or table offset */ -}; +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 0001eeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ /* Maximum size of dynamic tree. The maximum found in a long but non- - exhaustive search was 1004 huft structures (850 for length/literals - and 154 for distances, the latter actually the result of an - exhaustive search). The actual maximum is not known, but the - value below is more than safe. */ -#define MANY 1440 - -extern int zlib_inflate_trees_bits ( - uInt *, /* 19 code lengths */ - uInt *, /* bits tree desired/actual depth */ - inflate_huft **, /* bits tree result */ - inflate_huft *, /* space for trees */ - z_streamp); /* for messages */ - -extern int zlib_inflate_trees_dynamic ( - uInt, /* number of literal/length codes */ - uInt, /* number of distance codes */ - uInt *, /* that many (total) code lengths */ - uInt *, /* literal desired/actual bit depth */ - uInt *, /* distance desired/actual bit depth */ - inflate_huft **, /* literal/length tree result */ - inflate_huft **, /* distance tree result */ - inflate_huft *, /* space for trees */ - z_streamp); /* for messages */ - -extern int zlib_inflate_trees_fixed ( - uInt *, /* literal desired/actual bit depth */ - uInt *, /* distance desired/actual bit depth */ - inflate_huft **, /* literal/length tree result */ - inflate_huft **, /* distance tree result */ - inflate_huft *, /* space for trees */ - z_streamp); /* for memory allocation */ - -#endif /* _INFTREES_H */ + exhaustive search was 1444 code structures (852 for length/literals + and 592 for distances, the latter actually the result of an + exhaustive search). The true maximum is not known, but the value + below is more than safe. */ +#define ENOUGH 2048 +#define MAXD 592 + +/* Type of code to build for inftable() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +extern int zlib_inflate_table (codetype type, unsigned short *lens, + unsigned codes, code **table, + unsigned *bits, unsigned short *work); diff --git a/lib/zlib_inflate/infutil.c b/lib/zlib_inflate/infutil.c deleted file mode 100644 index 00202b343..000000000 --- a/lib/zlib_inflate/infutil.c +++ /dev/null @@ -1,88 +0,0 @@ -/* inflate_util.c -- data and routines common to blocks and codes - * Copyright (C) 1995-1998 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include -#include "infblock.h" -#include "inftrees.h" -#include "infcodes.h" -#include "infutil.h" - -struct inflate_codes_state; - -/* And'ing with mask[n] masks the lower n bits */ -uInt zlib_inflate_mask[17] = { - 0x0000, - 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, - 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff -}; - - -/* copy as much as possible from the sliding window to the output area */ -int zlib_inflate_flush( - inflate_blocks_statef *s, - z_streamp z, - int r -) -{ - uInt n; - Byte *p; - Byte *q; - - /* local copies of source and destination pointers */ - p = z->next_out; - q = s->read; - - /* compute number of bytes to copy as far as end of window */ - n = (uInt)((q <= s->write ? s->write : s->end) - q); - if (n > z->avail_out) n = z->avail_out; - if (n && r == Z_BUF_ERROR) r = Z_OK; - - /* update counters */ - z->avail_out -= n; - z->total_out += n; - - /* update check information */ - if (s->checkfn != NULL) - z->adler = s->check = (*s->checkfn)(s->check, q, n); - - /* copy as far as end of window */ - memcpy(p, q, n); - p += n; - q += n; - - /* see if more to copy at beginning of window */ - if (q == s->end) - { - /* wrap pointers */ - q = s->window; - if (s->write == s->end) - s->write = s->window; - - /* compute bytes to copy */ - n = (uInt)(s->write - q); - if (n > z->avail_out) n = z->avail_out; - if (n && r == Z_BUF_ERROR) r = Z_OK; - - /* update counters */ - z->avail_out -= n; - z->total_out += n; - - /* update check information */ - if (s->checkfn != NULL) - z->adler = s->check = (*s->checkfn)(s->check, q, n); - - /* copy */ - memcpy(p, q, n); - p += n; - q += n; - } - - /* update pointers */ - z->next_out = p; - s->read = q; - - /* done */ - return r; -} diff --git a/lib/zlib_inflate/infutil.h b/lib/zlib_inflate/infutil.h index a15875fc5..eb1a9007b 100644 --- a/lib/zlib_inflate/infutil.h +++ b/lib/zlib_inflate/infutil.h @@ -11,184 +11,12 @@ #ifndef _INFUTIL_H #define _INFUTIL_H -#include -#include "inftrees.h" -#include "infcodes.h" - -typedef enum { - TYPE, /* get type bits (3, including end bit) */ - LENS, /* get lengths for stored */ - STORED, /* processing stored block */ - TABLE, /* get table lengths */ - BTREE, /* get bit lengths tree for a dynamic block */ - DTREE, /* get length, distance trees for a dynamic block */ - CODES, /* processing fixed or dynamic block */ - DRY, /* output remaining window bytes */ - B_DONE, /* finished last block, done */ - B_BAD} /* got a data error--stuck here */ -inflate_block_mode; - -/* inflate blocks semi-private state */ -struct inflate_blocks_state { - - /* mode */ - inflate_block_mode mode; /* current inflate_block mode */ - - /* mode dependent information */ - union { - uInt left; /* if STORED, bytes left to copy */ - struct { - uInt table; /* table lengths (14 bits) */ - uInt index; /* index into blens (or border) */ - uInt *blens; /* bit lengths of codes */ - uInt bb; /* bit length tree depth */ - inflate_huft *tb; /* bit length decoding tree */ - } trees; /* if DTREE, decoding info for trees */ - struct { - inflate_codes_statef - *codes; - } decode; /* if CODES, current state */ - } sub; /* submode */ - uInt last; /* true if this block is the last block */ - - /* mode independent information */ - uInt bitk; /* bits in bit buffer */ - uLong bitb; /* bit buffer */ - inflate_huft *hufts; /* single malloc for tree space */ - Byte *window; /* sliding window */ - Byte *end; /* one byte after sliding window */ - Byte *read; /* window read pointer */ - Byte *write; /* window write pointer */ - check_func checkfn; /* check function */ - uLong check; /* check on output */ - -}; - - -/* defines for inflate input/output */ -/* update pointers and return */ -#define UPDBITS {s->bitb=b;s->bitk=k;} -#define UPDIN {z->avail_in=n;z->total_in+=p-z->next_in;z->next_in=p;} -#define UPDOUT {s->write=q;} -#define UPDATE {UPDBITS UPDIN UPDOUT} -#define LEAVE {UPDATE return zlib_inflate_flush(s,z,r);} -/* get bytes and bits */ -#define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;} -#define NEEDBYTE {if(n)r=Z_OK;else LEAVE} -#define NEXTBYTE (n--,*p++) -#define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<>=(j);k-=(j);} -/* output bytes */ -#define WAVAIL (uInt)(qread?s->read-q-1:s->end-q) -#define LOADOUT {q=s->write;m=(uInt)WAVAIL;} -#define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=(uInt)WAVAIL;}} -#define FLUSH {UPDOUT r=zlib_inflate_flush(s,z,r); LOADOUT} -#define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;} -#define OUTBYTE(a) {*q++=(Byte)(a);m--;} -/* load local pointers */ -#define LOAD {LOADIN LOADOUT} - -/* masks for lower bits (size given to avoid silly warnings with Visual C++) */ -extern uInt zlib_inflate_mask[17]; - -/* copy as much as possible from the sliding window to the output area */ -extern int zlib_inflate_flush ( - inflate_blocks_statef *, - z_streamp , - int); - -/* inflate private state */ -typedef enum { - METHOD, /* waiting for method byte */ - FLAG, /* waiting for flag byte */ - DICT4, /* four dictionary check bytes to go */ - DICT3, /* three dictionary check bytes to go */ - DICT2, /* two dictionary check bytes to go */ - DICT1, /* one dictionary check byte to go */ - DICT0, /* waiting for inflateSetDictionary */ - BLOCKS, /* decompressing blocks */ - CHECK4, /* four check bytes to go */ - CHECK3, /* three check bytes to go */ - CHECK2, /* two check bytes to go */ - CHECK1, /* one check byte to go */ - I_DONE, /* finished check, done */ - I_BAD} /* got an error--stay here */ -inflate_mode; - -struct internal_state { - - /* mode */ - inflate_mode mode; /* current inflate mode */ - - /* mode dependent information */ - union { - uInt method; /* if FLAGS, method byte */ - struct { - uLong was; /* computed check value */ - uLong need; /* stream check value */ - } check; /* if CHECK, check values to compare */ - uInt marker; /* if BAD, inflateSync's marker bytes count */ - } sub; /* submode */ - - /* mode independent information */ - int nowrap; /* flag for no wrapper */ - uInt wbits; /* log2(window size) (8..15, defaults to 15) */ - inflate_blocks_statef - *blocks; /* current inflate_blocks state */ - -}; - -/* inflate codes private state */ -typedef enum { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ - START, /* x: set up for LEN */ - LEN, /* i: get length/literal/eob next */ - LENEXT, /* i: getting length extra (have base) */ - DIST, /* i: get distance next */ - DISTEXT, /* i: getting distance extra */ - COPY, /* o: copying bytes in window, waiting for space */ - LIT, /* o: got literal, waiting for output space */ - WASH, /* o: got eob, possibly still output waiting */ - END, /* x: got eob and all data flushed */ - BADCODE} /* x: got error */ -inflate_codes_mode; - -struct inflate_codes_state { - - /* mode */ - inflate_codes_mode mode; /* current inflate_codes mode */ - - /* mode dependent information */ - uInt len; - union { - struct { - inflate_huft *tree; /* pointer into tree */ - uInt need; /* bits needed */ - } code; /* if LEN or DIST, where in tree */ - uInt lit; /* if LIT, literal */ - struct { - uInt get; /* bits to get for extra */ - uInt dist; /* distance back to copy from */ - } copy; /* if EXT or COPY, where and how much */ - } sub; /* submode */ - - /* mode independent information */ - Byte lbits; /* ltree bits decoded per branch */ - Byte dbits; /* dtree bits decoder per branch */ - inflate_huft *ltree; /* literal/length/eob tree */ - inflate_huft *dtree; /* distance tree */ - -}; +#include /* memory allocation for inflation */ struct inflate_workspace { - inflate_codes_statef working_state; - struct inflate_blocks_state working_blocks_state; - struct internal_state internal_state; - unsigned int tree_work_area_1[19]; - unsigned int tree_work_area_2[288]; - unsigned working_blens[258 + 0x1f + 0x1f]; - inflate_huft working_hufts[MANY]; + struct inflate_state inflate_state; unsigned char working_window[1 << MAX_WBITS]; }; diff --git a/mm/Kconfig b/mm/Kconfig index ab1007556..5511d6ccb 100644 --- a/mm/Kconfig +++ b/mm/Kconfig @@ -142,10 +142,16 @@ config SPLIT_PTLOCK_CPUS # config MIGRATION bool "Page migration" - def_bool y if NUMA - depends on SWAP && NUMA + def_bool y + depends on NUMA help Allows the migration of the physical location of pages of processes while the virtual addresses are not changed. This is useful for example on NUMA systems to put pages nearer to the processors accessing the page. + +config RESOURCES_64BIT + bool "64 bit Memory and IO resources (EXPERIMENTAL)" if (!64BIT && EXPERIMENTAL) + default 64BIT + help + This option allows memory and IO resources to be 64 bit. diff --git a/mm/Makefile b/mm/Makefile index 0b8f73f2e..9dd824c11 100644 --- a/mm/Makefile +++ b/mm/Makefile @@ -10,7 +10,7 @@ mmu-$(CONFIG_MMU) := fremap.o highmem.o madvise.o memory.o mincore.o \ obj-y := bootmem.o filemap.o mempool.o oom_kill.o fadvise.o \ page_alloc.o page-writeback.o pdflush.o \ readahead.o swap.o truncate.o vmscan.o \ - prio_tree.o util.o mmzone.o $(mmu-y) + prio_tree.o util.o mmzone.o vmstat.o $(mmu-y) obj-$(CONFIG_SWAP) += page_io.o swap_state.o swapfile.o thrash.o obj-$(CONFIG_HUGETLBFS) += hugetlb.o diff --git a/mm/bootmem.c b/mm/bootmem.c index d213feded..50353e0da 100644 --- a/mm/bootmem.c +++ b/mm/bootmem.c @@ -29,9 +29,7 @@ unsigned long max_low_pfn; unsigned long min_low_pfn; unsigned long max_pfn; -EXPORT_SYMBOL(max_pfn); /* This is exported so - * dma_get_required_mask(), which uses - * it, can be an inline function */ +EXPORT_UNUSED_SYMBOL(max_pfn); /* June 2006 */ static LIST_HEAD(bdata_list); #ifdef CONFIG_CRASH_DUMP diff --git a/mm/fadvise.c b/mm/fadvise.c index 0a03357a1..168c78a12 100644 --- a/mm/fadvise.c +++ b/mm/fadvise.c @@ -23,18 +23,6 @@ /* * POSIX_FADV_WILLNEED could set PG_Referenced, and POSIX_FADV_NOREUSE could * deactivate the pages and clear PG_Referenced. - * - * LINUX_FADV_ASYNC_WRITE: start async writeout of any dirty pages between file - * offsets `offset' and `offset+len' inclusive. Any pages which are currently - * under writeout are skipped, whether or not they are dirty. - * - * LINUX_FADV_WRITE_WAIT: wait upon writeout of any dirty pages between file - * offsets `offset' and `offset+len'. - * - * By combining these two operations the application may do several things: - * - * LINUX_FADV_ASYNC_WRITE: push some or all of the dirty pages at the disk. - * */ asmlinkage long sys_fadvise64_64(int fd, loff_t offset, loff_t len, int advice) { @@ -85,7 +73,6 @@ asmlinkage long sys_fadvise64_64(int fd, loff_t offset, loff_t len, int advice) file->f_ra.ra_pages = bdi->ra_pages * 2; break; case POSIX_FADV_WILLNEED: - case POSIX_FADV_NOREUSE: if (!mapping->a_ops->readpage) { ret = -EINVAL; break; @@ -106,6 +93,8 @@ asmlinkage long sys_fadvise64_64(int fd, loff_t offset, loff_t len, int advice) if (ret > 0) ret = 0; break; + case POSIX_FADV_NOREUSE: + break; case POSIX_FADV_DONTNEED: if (!bdi_write_congested(mapping->backing_dev_info)) filemap_flush(mapping); diff --git a/mm/filemap.c b/mm/filemap.c index 96f354e18..a3aae8bec 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -9,11 +9,11 @@ * most "normal" filesystems (but you don't /have/ to use this: * the NFS filesystem used to do this differently, for example) */ -#include #include #include #include #include +#include #include #include #include @@ -38,7 +38,6 @@ */ #include /* for generic_osync_inode */ -#include #include static ssize_t @@ -120,7 +119,7 @@ void __remove_from_page_cache(struct page *page) radix_tree_delete(&mapping->page_tree, page->index); page->mapping = NULL; mapping->nrpages--; - pagecache_acct(-1); + __dec_zone_page_state(page, NR_FILE_PAGES); } void remove_from_page_cache(struct page *page) @@ -171,15 +170,17 @@ static int sync_page(void *word) } /** - * filemap_fdatawrite_range - start writeback against all of a mapping's - * dirty pages that lie within the byte offsets + * __filemap_fdatawrite_range - start writeback on mapping dirty pages in range * @mapping: address space structure to write * @start: offset in bytes where the range starts * @end: offset in bytes where the range ends (inclusive) * @sync_mode: enable synchronous operation * + * Start writeback against all of a mapping's dirty pages that lie + * within the byte offsets inclusive. + * * If sync_mode is WB_SYNC_ALL then this is a "data integrity" operation, as - * opposed to a regular memory * cleansing writeback. The difference between + * opposed to a regular memory cleansing writeback. The difference between * these two operations is that if a dirty page/buffer is encountered, it must * be waited upon, and not just skipped over. */ @@ -190,8 +191,8 @@ int __filemap_fdatawrite_range(struct address_space *mapping, loff_t start, struct writeback_control wbc = { .sync_mode = sync_mode, .nr_to_write = mapping->nrpages * 2, - .start = start, - .end = end, + .range_start = start, + .range_end = end, }; if (!mapping_cap_writeback_dirty(mapping)) @@ -204,7 +205,7 @@ int __filemap_fdatawrite_range(struct address_space *mapping, loff_t start, static inline int __filemap_fdatawrite(struct address_space *mapping, int sync_mode) { - return __filemap_fdatawrite_range(mapping, 0, 0, sync_mode); + return __filemap_fdatawrite_range(mapping, 0, LLONG_MAX, sync_mode); } int filemap_fdatawrite(struct address_space *mapping) @@ -219,7 +220,10 @@ static int filemap_fdatawrite_range(struct address_space *mapping, loff_t start, return __filemap_fdatawrite_range(mapping, start, end, WB_SYNC_ALL); } -/* +/** + * filemap_flush - mostly a non-blocking flush + * @mapping: target address_space + * * This is a mostly non-blocking flush. Not suitable for data-integrity * purposes - I/O may not be started against all dirty pages. */ @@ -229,7 +233,12 @@ int filemap_flush(struct address_space *mapping) } EXPORT_SYMBOL(filemap_flush); -/* +/** + * wait_on_page_writeback_range - wait for writeback to complete + * @mapping: target address_space + * @start: beginning page index + * @end: ending page index + * * Wait for writeback to complete against pages indexed by start->end * inclusive */ @@ -276,7 +285,13 @@ int wait_on_page_writeback_range(struct address_space *mapping, return ret; } -/* +/** + * sync_page_range - write and wait on all pages in the passed range + * @inode: target inode + * @mapping: target address_space + * @pos: beginning offset in pages to write + * @count: number of bytes to write + * * Write and wait upon all the pages in the passed range. This is a "data * integrity" operation. It waits upon in-flight writeout before starting and * waiting upon new writeout. If there was an IO error, return it. @@ -305,7 +320,13 @@ int sync_page_range(struct inode *inode, struct address_space *mapping, } EXPORT_SYMBOL(sync_page_range); -/* +/** + * sync_page_range_nolock + * @inode: target inode + * @mapping: target address_space + * @pos: beginning offset in pages to write + * @count: number of bytes to write + * * Note: Holding i_mutex across sync_page_range_nolock is not a good idea * as it forces O_SYNC writers to different parts of the same file * to be serialised right until io completion. @@ -329,10 +350,11 @@ int sync_page_range_nolock(struct inode *inode, struct address_space *mapping, EXPORT_SYMBOL(sync_page_range_nolock); /** - * filemap_fdatawait - walk the list of under-writeback pages of the given - * address space and wait for all of them. - * + * filemap_fdatawait - wait for all under-writeback pages to complete * @mapping: address space structure to wait for + * + * Walk the list of under-writeback pages of the given address space + * and wait for all of them. */ int filemap_fdatawait(struct address_space *mapping) { @@ -368,7 +390,12 @@ int filemap_write_and_wait(struct address_space *mapping) } EXPORT_SYMBOL(filemap_write_and_wait); -/* +/** + * filemap_write_and_wait_range - write out & wait on a file range + * @mapping: the address_space for the pages + * @lstart: offset in bytes where the range starts + * @lend: offset in bytes where the range ends (inclusive) + * * Write out and wait upon file offsets lstart->lend, inclusive. * * Note that `lend' is inclusive (describes the last byte to be written) so @@ -394,8 +421,14 @@ int filemap_write_and_wait_range(struct address_space *mapping, return err; } -/* - * This function is used to add newly allocated pagecache pages: +/** + * add_to_page_cache - add newly allocated pagecache pages + * @page: page to add + * @mapping: the page's address_space + * @offset: page index + * @gfp_mask: page allocation mode + * + * This function is used to add newly allocated pagecache pages; * the page is new, so we can just run SetPageLocked() against it. * The other page state flags were set by rmqueue(). * @@ -415,14 +448,13 @@ int add_to_page_cache(struct page *page, struct address_space *mapping, page->mapping = mapping; page->index = offset; mapping->nrpages++; - pagecache_acct(1); + __inc_zone_page_state(page, NR_FILE_PAGES); } write_unlock_irq(&mapping->tree_lock); radix_tree_preload_end(); } return error; } - EXPORT_SYMBOL(add_to_page_cache); int add_to_page_cache_lru(struct page *page, struct address_space *mapping, @@ -488,9 +520,20 @@ void fastcall wait_on_page_bit(struct page *page, int bit_nr) } EXPORT_SYMBOL(wait_on_page_bit); +void install_page_waitqueue_monitor(struct page *page, wait_queue_t *monitor) +{ + wait_queue_head_t *q = page_waitqueue(page); + unsigned long flags; + + spin_lock_irqsave(&q->lock, flags); + __add_wait_queue(q, monitor); + spin_unlock_irqrestore(&q->lock, flags); +} + +EXPORT_SYMBOL_GPL(install_page_waitqueue_monitor); + /** - * unlock_page() - unlock a locked page - * + * unlock_page - unlock a locked page * @page: the page * * Unlocks the page and wakes up sleepers in ___wait_on_page_locked(). @@ -513,8 +556,9 @@ void fastcall unlock_page(struct page *page) } EXPORT_SYMBOL(unlock_page); -/* - * End writeback against a page. +/** + * end_page_writeback - end writeback against a page + * @page: the page */ void end_page_writeback(struct page *page) { @@ -527,10 +571,11 @@ void end_page_writeback(struct page *page) } EXPORT_SYMBOL(end_page_writeback); -/* - * Get a lock on the page, assuming we need to sleep to get it. +/** + * __lock_page - get a lock on the page, assuming we need to sleep to get it + * @page: the page to lock * - * Ugly: running sync_page() in state TASK_UNINTERRUPTIBLE is scary. If some + * Ugly. Running sync_page() in state TASK_UNINTERRUPTIBLE is scary. If some * random driver's requestfn sets TASK_RUNNING, we could busywait. However * chances are that on the second loop, the block layer's plug list is empty, * so sync_page() will then return in state TASK_UNINTERRUPTIBLE. @@ -545,7 +590,28 @@ void fastcall __lock_page(struct page *page) EXPORT_SYMBOL(__lock_page); /* - * a rather lightweight function, finding and getting a reference to a + * Note completion of filesystem specific page synchronisation + * + * This is used to allow a page to be written to a filesystem cache in the + * background without holding up the completion of readpage + */ +void fastcall end_page_fs_misc(struct page *page) +{ + smp_mb__before_clear_bit(); + if (!TestClearPageFsMisc(page)) + BUG(); + smp_mb__after_clear_bit(); + __wake_up_bit(page_waitqueue(page), &page->flags, PG_fs_misc); +} + +EXPORT_SYMBOL(end_page_fs_misc); + +/** + * find_get_page - find and get a page reference + * @mapping: the address_space to search + * @offset: the page index + * + * A rather lightweight function, finding and getting a reference to a * hashed page atomically. */ struct page * find_get_page(struct address_space *mapping, unsigned long offset) @@ -559,11 +625,14 @@ struct page * find_get_page(struct address_space *mapping, unsigned long offset) read_unlock_irq(&mapping->tree_lock); return page; } - EXPORT_SYMBOL(find_get_page); -/* - * Same as above, but trylock it instead of incrementing the count. +/** + * find_trylock_page - find and lock a page + * @mapping: the address_space to search + * @offset: the page index + * + * Same as find_get_page(), but trylock it instead of incrementing the count. */ struct page *find_trylock_page(struct address_space *mapping, unsigned long offset) { @@ -576,12 +645,10 @@ struct page *find_trylock_page(struct address_space *mapping, unsigned long offs read_unlock_irq(&mapping->tree_lock); return page; } - EXPORT_SYMBOL(find_trylock_page); /** * find_lock_page - locate, pin and lock a pagecache page - * * @mapping: the address_space to search * @offset: the page index * @@ -617,12 +684,10 @@ repeat: read_unlock_irq(&mapping->tree_lock); return page; } - EXPORT_SYMBOL(find_lock_page); /** * find_or_create_page - locate or add a pagecache page - * * @mapping: the page's address_space * @index: the page's index into the mapping * @gfp_mask: page allocation mode @@ -663,7 +728,6 @@ repeat: page_cache_release(cached_page); return page; } - EXPORT_SYMBOL(find_or_create_page); /** @@ -729,9 +793,16 @@ unsigned find_get_pages_contig(struct address_space *mapping, pgoff_t index, return i; } -/* +/** + * find_get_pages_tag - find and return pages that match @tag + * @mapping: the address_space to search + * @index: the starting page index + * @tag: the tag index + * @nr_pages: the maximum number of pages + * @pages: where the resulting pages are placed + * * Like find_get_pages, except we only return pages which are tagged with - * `tag'. We update *index to index the next page for the traversal. + * @tag. We update @index to index the next page for the traversal. */ unsigned find_get_pages_tag(struct address_space *mapping, pgoff_t *index, int tag, unsigned int nr_pages, struct page **pages) @@ -750,7 +821,11 @@ unsigned find_get_pages_tag(struct address_space *mapping, pgoff_t *index, return ret; } -/* +/** + * grab_cache_page_nowait - returns locked page at given index in given cache + * @mapping: target address_space + * @index: the page index + * * Same as grab_cache_page, but do not wait if the page is unavailable. * This is intended for speculative data generators, where the data can * be regenerated if the page couldn't be grabbed. This routine should @@ -779,19 +854,49 @@ grab_cache_page_nowait(struct address_space *mapping, unsigned long index) } return page; } - EXPORT_SYMBOL(grab_cache_page_nowait); /* + * CD/DVDs are error prone. When a medium error occurs, the driver may fail + * a _large_ part of the i/o request. Imagine the worst scenario: + * + * ---R__________________________________________B__________ + * ^ reading here ^ bad block(assume 4k) + * + * read(R) => miss => readahead(R...B) => media error => frustrating retries + * => failing the whole request => read(R) => read(R+1) => + * readahead(R+1...B+1) => bang => read(R+2) => read(R+3) => + * readahead(R+3...B+2) => bang => read(R+3) => read(R+4) => + * readahead(R+4...B+3) => bang => read(R+4) => read(R+5) => ...... + * + * It is going insane. Fix it by quickly scaling down the readahead size. + */ +static void shrink_readahead_size_eio(struct file *filp, + struct file_ra_state *ra) +{ + if (!ra->ra_pages) + return; + + ra->ra_pages /= 4; +} + +/** + * do_generic_mapping_read - generic file read routine + * @mapping: address_space to be read + * @_ra: file's readahead state + * @filp: the file to read + * @ppos: current file position + * @desc: read_descriptor + * @actor: read method + * * This is a generic file read routine, and uses the - * mapping->a_ops->readpage() function for the actual low-level - * stuff. + * mapping->a_ops->readpage() function for the actual low-level stuff. * * This is really ugly. But the goto's actually try to clarify some * of the logic when it comes to error handling etc. * - * Note the struct file* is only passed for the use of readpage. It may be - * NULL. + * Note the struct file* is only passed for the use of readpage. + * It may be NULL. */ void do_generic_mapping_read(struct address_space *mapping, struct file_ra_state *_ra, @@ -943,6 +1048,7 @@ readpage: } unlock_page(page); error = -EIO; + shrink_readahead_size_eio(filp, &ra); goto readpage_error; } unlock_page(page); @@ -1015,7 +1121,6 @@ out: if (filp) file_accessed(filp); } - EXPORT_SYMBOL(do_generic_mapping_read); int file_read_actor(read_descriptor_t *desc, struct page *page, @@ -1056,7 +1161,13 @@ success: return size; } -/* +/** + * __generic_file_aio_read - generic filesystem read routine + * @iocb: kernel I/O control block + * @iov: io vector request + * @nr_segs: number of segments in the iovec + * @ppos: current file position + * * This is the "read()" routine for all filesystems * that can use the page cache directly. */ @@ -1135,7 +1246,6 @@ __generic_file_aio_read(struct kiocb *iocb, const struct iovec *iov, out: return retval; } - EXPORT_SYMBOL(__generic_file_aio_read); ssize_t @@ -1146,7 +1256,6 @@ generic_file_aio_read(struct kiocb *iocb, char __user *buf, size_t count, loff_t BUG_ON(iocb->ki_pos != pos); return __generic_file_aio_read(iocb, &local_iov, 1, &iocb->ki_pos); } - EXPORT_SYMBOL(generic_file_aio_read); ssize_t @@ -1162,7 +1271,6 @@ generic_file_read(struct file *filp, char __user *buf, size_t count, loff_t *ppo ret = wait_on_sync_kiocb(&kiocb); return ret; } - EXPORT_SYMBOL(generic_file_read); int file_send_actor(read_descriptor_t * desc, struct page *page, unsigned long offset, unsigned long size) @@ -1203,7 +1311,6 @@ ssize_t generic_file_sendfile(struct file *in_file, loff_t *ppos, return desc.written; return desc.error; } - EXPORT_SYMBOL(generic_file_sendfile); static ssize_t @@ -1239,11 +1346,15 @@ asmlinkage ssize_t sys_readahead(int fd, loff_t offset, size_t count) } #ifdef CONFIG_MMU -/* +static int FASTCALL(page_cache_read(struct file * file, unsigned long offset)); +/** + * page_cache_read - adds requested page to the page cache if not already there + * @file: file to read + * @offset: page index + * * This adds the requested page to the page cache if it isn't already there, * and schedules an I/O to read in its contents from disk. */ -static int FASTCALL(page_cache_read(struct file * file, unsigned long offset)); static int fastcall page_cache_read(struct file * file, unsigned long offset) { struct address_space *mapping = file->f_mapping; @@ -1270,7 +1381,12 @@ static int fastcall page_cache_read(struct file * file, unsigned long offset) #define MMAP_LOTSAMISS (100) -/* +/** + * filemap_nopage - read in file data for page fault handling + * @area: the applicable vm_area + * @address: target address to read in + * @type: returned with VM_FAULT_{MINOR,MAJOR} if not %NULL + * * filemap_nopage() is invoked via the vma operations vector for a * mapped memory region to read in file data during a page fault. * @@ -1337,7 +1453,7 @@ retry_find: */ if (!did_readaround) { majmin = VM_FAULT_MAJOR; - inc_page_state(pgmajfault); + count_vm_event(PGMAJFAULT); } did_readaround = 1; ra_pages = max_sane_readahead(file->f_ra.ra_pages); @@ -1408,7 +1524,7 @@ no_cached_page: page_not_uptodate: if (!did_readaround) { majmin = VM_FAULT_MAJOR; - inc_page_state(pgmajfault); + count_vm_event(PGMAJFAULT); } lock_page(page); @@ -1470,10 +1586,10 @@ page_not_uptodate: * Things didn't work out. Return zero to tell the * mm layer so, possibly freeing the page cache page first. */ + shrink_readahead_size_eio(file, ra); page_cache_release(page); return NULL; } - EXPORT_SYMBOL(filemap_nopage); static struct page * filemap_getpage(struct file *file, unsigned long pgoff, @@ -1727,7 +1843,13 @@ repeat: return page; } -/* +/** + * read_cache_page - read into page cache, fill it if needed + * @mapping: the page's address_space + * @index: the page index + * @filler: function to perform the read + * @data: destination for read data + * * Read into the page cache. If a page already exists, * and PageUptodate() is not set, try to fill the page. */ @@ -1765,7 +1887,6 @@ retry: out: return page; } - EXPORT_SYMBOL(read_cache_page); /* @@ -1836,7 +1957,7 @@ int remove_suid(struct dentry *dentry) EXPORT_SYMBOL(remove_suid); size_t -__filemap_copy_from_user_iovec(char *vaddr, +__filemap_copy_from_user_iovec_inatomic(char *vaddr, const struct iovec *iov, size_t base, size_t bytes) { size_t copied = 0, left = 0; @@ -1846,18 +1967,14 @@ __filemap_copy_from_user_iovec(char *vaddr, int copy = min(bytes, iov->iov_len - base); base = 0; - left = __copy_from_user_inatomic(vaddr, buf, copy); + left = __copy_from_user_inatomic_nocache(vaddr, buf, copy); copied += copy; bytes -= copy; vaddr += copy; iov++; - if (unlikely(left)) { - /* zero the rest of the target like __copy_from_user */ - if (bytes) - memset(vaddr, 0, bytes); + if (unlikely(left)) break; - } } return copied - left; } @@ -1865,7 +1982,7 @@ __filemap_copy_from_user_iovec(char *vaddr, /* * Performs necessary checks before doing a write * - * Can adjust writing position aor amount of bytes to write. + * Can adjust writing position or amount of bytes to write. * Returns appropriate error code that caller should return or * zero in case that write should be allowed. */ @@ -1989,7 +2106,7 @@ generic_file_buffered_write(struct kiocb *iocb, const struct iovec *iov, { struct file *file = iocb->ki_filp; struct address_space * mapping = file->f_mapping; - struct address_space_operations *a_ops = mapping->a_ops; + const struct address_space_operations *a_ops = mapping->a_ops; struct inode *inode = mapping->host; long status = 0; struct page *page; @@ -2141,12 +2258,98 @@ zero_length_segment: } EXPORT_SYMBOL(generic_file_buffered_write); +/* + * This writes the data from the source page to the specified page offset in + * the nominated file + * - the source page does not need to have any association with the file or the + * page offset + */ +int +generic_file_buffered_write_one_kernel_page(struct address_space *mapping, + pgoff_t index, + struct page *src) +{ + const struct address_space_operations *a_ops = mapping->a_ops; + struct pagevec lru_pvec; + struct page *page, *cached_page = NULL; + long status = 0; + + pagevec_init(&lru_pvec, 0); + +#if 0 + if (mapping->tree_lock.magic != RWLOCK_MAGIC) + printk("RWLOCK magic incorrect: %x != %x\n", + mapping->tree_lock.magic, RWLOCK_MAGIC); +#endif + + page = __grab_cache_page(mapping, index, &cached_page, &lru_pvec); + if (!page) { + BUG_ON(cached_page); + return -ENOMEM; + } + + status = a_ops->prepare_write(NULL, page, 0, PAGE_CACHE_SIZE); + if (unlikely(status)) { + loff_t isize = i_size_read(mapping->host); + + if (status != AOP_TRUNCATED_PAGE) + unlock_page(page); + page_cache_release(page); + if (status == AOP_TRUNCATED_PAGE) + goto sync; + + /* prepare_write() may have instantiated a few blocks outside + * i_size. Trim these off again. + */ + if ((1ULL << (index + 1)) > isize) + vmtruncate(mapping->host, isize); + goto sync; + } + + copy_highpage(page, src); + flush_dcache_page(page); + + status = a_ops->commit_write(NULL, page, 0, PAGE_CACHE_SIZE); + if (status == AOP_TRUNCATED_PAGE) { + page_cache_release(page); + goto sync; + } + + if (status > 0) + status = 0; + + unlock_page(page); + mark_page_accessed(page); + page_cache_release(page); + if (status < 0) + return status; + + balance_dirty_pages_ratelimited(mapping); + cond_resched(); + +sync: + if (cached_page) + page_cache_release(cached_page); + + /* the caller must handle O_SYNC themselves, but we handle S_SYNC and + * MS_SYNCHRONOUS here */ + if (unlikely(IS_SYNC(mapping->host)) && !a_ops->writepage) + status = generic_osync_inode(mapping->host, mapping, + OSYNC_METADATA | OSYNC_DATA); + + /* the caller must handle O_DIRECT for themselves */ + + pagevec_lru_add(&lru_pvec); + return status; +} +EXPORT_SYMBOL(generic_file_buffered_write_one_kernel_page); + static ssize_t __generic_file_aio_write_nolock(struct kiocb *iocb, const struct iovec *iov, unsigned long nr_segs, loff_t *ppos) { struct file *file = iocb->ki_filp; - struct address_space * mapping = file->f_mapping; + const struct address_space * mapping = file->f_mapping; size_t ocount; /* original count */ size_t count; /* after file limit checks */ struct inode *inode = mapping->host; diff --git a/mm/filemap.h b/mm/filemap.h index efd01426b..c2bff04c8 100644 --- a/mm/filemap.h +++ b/mm/filemap.h @@ -12,19 +12,26 @@ #include #include #include -#include -#include +#include size_t -__filemap_copy_from_user_iovec(char *vaddr, - const struct iovec *iov, - size_t base, - size_t bytes); +__filemap_copy_from_user_iovec_inatomic(char *vaddr, + const struct iovec *iov, + size_t base, + size_t bytes); /* * Copy as much as we can into the page and return the number of bytes which * were sucessfully copied. If a fault is encountered then clear the page * out to (offset+bytes) and return the number of bytes which were copied. + * + * NOTE: For this to work reliably we really want copy_from_user_inatomic_nocache + * to *NOT* zero any tail of the buffer that it failed to copy. If it does, + * and if the following non-atomic copy succeeds, then there is a small window + * where the target page contains neither the data before the write, nor the + * data after the write (it contains zero). A read at this time will see + * data that is inconsistent with any ordering of the read and the write. + * (This has been detected in practice). */ static inline size_t filemap_copy_from_user(struct page *page, unsigned long offset, @@ -34,13 +41,13 @@ filemap_copy_from_user(struct page *page, unsigned long offset, int left; kaddr = kmap_atomic(page, KM_USER0); - left = __copy_from_user_inatomic(kaddr + offset, buf, bytes); + left = __copy_from_user_inatomic_nocache(kaddr + offset, buf, bytes); kunmap_atomic(kaddr, KM_USER0); if (left != 0) { /* Do it the slow way */ kaddr = kmap(page); - left = __copy_from_user(kaddr + offset, buf, bytes); + left = __copy_from_user_nocache(kaddr + offset, buf, bytes); kunmap(page); } return bytes - left; @@ -60,13 +67,15 @@ filemap_copy_from_user_iovec(struct page *page, unsigned long offset, size_t copied; kaddr = kmap_atomic(page, KM_USER0); - copied = __filemap_copy_from_user_iovec(kaddr + offset, iov, - base, bytes); + copied = __filemap_copy_from_user_iovec_inatomic(kaddr + offset, iov, + base, bytes); kunmap_atomic(kaddr, KM_USER0); if (copied != bytes) { kaddr = kmap(page); - copied = __filemap_copy_from_user_iovec(kaddr + offset, iov, - base, bytes); + copied = __filemap_copy_from_user_iovec_inatomic(kaddr + offset, iov, + base, bytes); + if (bytes - copied) + memset(kaddr + offset + copied, 0, bytes - copied); kunmap(page); } return copied; diff --git a/mm/filemap_xip.c b/mm/filemap_xip.c index 0c2775950..04a983a34 100644 --- a/mm/filemap_xip.c +++ b/mm/filemap_xip.c @@ -190,7 +190,7 @@ __xip_unmap (struct address_space * mapping, /* Nuke the page table entry. */ flush_cache_page(vma, address, pte_pfn(*pte)); pteval = ptep_clear_flush(vma, address, pte); - page_remove_rmap(page); + page_remove_rmap(page, vma); dec_mm_counter(mm, file_rss); BUG_ON(pte_dirty(pteval)); pte_unmap_unlock(pte, ptl); @@ -274,7 +274,7 @@ __xip_file_write(struct file *filp, const char __user *buf, size_t count, loff_t pos, loff_t *ppos) { struct address_space * mapping = filp->f_mapping; - struct address_space_operations *a_ops = mapping->a_ops; + const struct address_space_operations *a_ops = mapping->a_ops; struct inode *inode = mapping->host; long status = 0; struct page *page; diff --git a/mm/fremap.c b/mm/fremap.c index 414b5bcd0..7be2ae6a5 100644 --- a/mm/fremap.c +++ b/mm/fremap.c @@ -34,7 +34,7 @@ static int zap_pte(struct mm_struct *mm, struct vm_area_struct *vma, if (page) { if (pte_dirty(pte)) set_page_dirty(page); - page_remove_rmap(page); + page_remove_rmap(page, vma); page_cache_release(page); } } else { @@ -76,18 +76,20 @@ int install_page(struct mm_struct *mm, struct vm_area_struct *vma, err = -ENOMEM; if (page_mapcount(page) > INT_MAX/2) goto unlock; - if (!vx_rsspages_avail(mm, 1)) - goto unlock; } + err = -ENOMEM; + if (!vx_rsspages_avail(mm, 1)) + goto unlock; if (pte_none(*pte) || !zap_pte(mm, vma, addr, pte)) inc_mm_counter(mm, file_rss); flush_icache_page(vma, page); - set_pte_at(mm, addr, pte, mk_pte(page, prot)); + pte_val = mk_pte(page, prot); + set_pte_at(mm, addr, pte, pte_val); page_add_file_rmap(page); - pte_val = *pte; update_mmu_cache(vma, addr, pte_val); + lazy_mmu_prot_update(pte_val); err = 0; unlock: pte_unmap_unlock(pte, ptl); @@ -119,7 +121,13 @@ int install_file_pte(struct mm_struct *mm, struct vm_area_struct *vma, set_pte_at(mm, addr, pte, pgoff_to_pte(pgoff)); pte_val = *pte; - update_mmu_cache(vma, addr, pte_val); + /* + * We don't need to run update_mmu_cache() here because the "file pte" + * being installed by install_file_pte() is not a real pte - it's a + * non-present entry (like a swap entry), noting what file offset should + * be mapped there when there's a fault (in a non-linear vma where + * that's not obvious). + */ pte_unmap_unlock(pte, ptl); err = 0; out: diff --git a/mm/highmem.c b/mm/highmem.c index a02c6dec9..821d4cd1f 100644 --- a/mm/highmem.c +++ b/mm/highmem.c @@ -326,8 +326,8 @@ static void bounce_end_io(struct bio *bio, mempool_t *pool, int err) if (bvec->bv_page == org_vec->bv_page) continue; - mempool_free(bvec->bv_page, pool); - dec_page_state(nr_bounce); + dec_zone_page_state(bvec->bv_page, NR_BOUNCE); + mempool_free(bvec->bv_page, pool); } bio_endio(bio_orig, bio_orig->bi_size, err); @@ -408,7 +408,7 @@ static void __blk_queue_bounce(request_queue_t *q, struct bio **bio_orig, to->bv_page = mempool_alloc(pool, q->bounce_gfp); to->bv_len = from->bv_len; to->bv_offset = from->bv_offset; - inc_page_state(nr_bounce); + inc_zone_page_state(to->bv_page, NR_BOUNCE); if (rw == WRITE) { char *vto, *vfrom; diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 2894563b7..f5a8cb24a 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -23,7 +23,7 @@ #include "internal.h" const unsigned long hugetlb_zero = 0, hugetlb_infinity = ~0UL; -static unsigned long nr_huge_pages, free_huge_pages, reserved_huge_pages; +static unsigned long nr_huge_pages, free_huge_pages, resv_huge_pages; unsigned long max_huge_pages; static struct list_head hugepage_freelists[MAX_NUMNODES]; static unsigned int nr_huge_pages_node[MAX_NUMNODES]; @@ -124,39 +124,13 @@ static int alloc_fresh_huge_page(void) static struct page *alloc_huge_page(struct vm_area_struct *vma, unsigned long addr) { - struct inode *inode = vma->vm_file->f_dentry->d_inode; struct page *page; - int use_reserve = 0; - unsigned long idx; spin_lock(&hugetlb_lock); - - if (vma->vm_flags & VM_MAYSHARE) { - - /* idx = radix tree index, i.e. offset into file in - * HPAGE_SIZE units */ - idx = ((addr - vma->vm_start) >> HPAGE_SHIFT) - + (vma->vm_pgoff >> (HPAGE_SHIFT - PAGE_SHIFT)); - - /* The hugetlbfs specific inode info stores the number - * of "guaranteed available" (huge) pages. That is, - * the first 'prereserved_hpages' pages of the inode - * are either already instantiated, or have been - * pre-reserved (by hugetlb_reserve_for_inode()). Here - * we're in the process of instantiating the page, so - * we use this to determine whether to draw from the - * pre-reserved pool or the truly free pool. */ - if (idx < HUGETLBFS_I(inode)->prereserved_hpages) - use_reserve = 1; - } - - if (!use_reserve) { - if (free_huge_pages <= reserved_huge_pages) - goto fail; - } else { - BUG_ON(reserved_huge_pages == 0); - reserved_huge_pages--; - } + if (vma->vm_flags & VM_MAYSHARE) + resv_huge_pages--; + else if (free_huge_pages <= resv_huge_pages) + goto fail; page = dequeue_huge_page(vma, addr); if (!page) @@ -166,96 +140,11 @@ static struct page *alloc_huge_page(struct vm_area_struct *vma, set_page_refcounted(page); return page; - fail: - WARN_ON(use_reserve); /* reserved allocations shouldn't fail */ +fail: spin_unlock(&hugetlb_lock); return NULL; } -/* hugetlb_extend_reservation() - * - * Ensure that at least 'atleast' hugepages are, and will remain, - * available to instantiate the first 'atleast' pages of the given - * inode. If the inode doesn't already have this many pages reserved - * or instantiated, set aside some hugepages in the reserved pool to - * satisfy later faults (or fail now if there aren't enough, rather - * than getting the SIGBUS later). - */ -int hugetlb_extend_reservation(struct hugetlbfs_inode_info *info, - unsigned long atleast) -{ - struct inode *inode = &info->vfs_inode; - unsigned long change_in_reserve = 0; - int ret = 0; - - spin_lock(&hugetlb_lock); - read_lock_irq(&inode->i_mapping->tree_lock); - - if (info->prereserved_hpages >= atleast) - goto out; - - /* Because we always call this on shared mappings, none of the - * pages beyond info->prereserved_hpages can have been - * instantiated, so we need to reserve all of them now. */ - change_in_reserve = atleast - info->prereserved_hpages; - - if ((reserved_huge_pages + change_in_reserve) > free_huge_pages) { - ret = -ENOMEM; - goto out; - } - - reserved_huge_pages += change_in_reserve; - info->prereserved_hpages = atleast; - - out: - read_unlock_irq(&inode->i_mapping->tree_lock); - spin_unlock(&hugetlb_lock); - - return ret; -} - -/* hugetlb_truncate_reservation() - * - * This returns pages reserved for the given inode to the general free - * hugepage pool. If the inode has any pages prereserved, but not - * instantiated, beyond offset (atmost << HPAGE_SIZE), then release - * them. - */ -void hugetlb_truncate_reservation(struct hugetlbfs_inode_info *info, - unsigned long atmost) -{ - struct inode *inode = &info->vfs_inode; - struct address_space *mapping = inode->i_mapping; - unsigned long idx; - unsigned long change_in_reserve = 0; - struct page *page; - - spin_lock(&hugetlb_lock); - read_lock_irq(&inode->i_mapping->tree_lock); - - if (info->prereserved_hpages <= atmost) - goto out; - - /* Count pages which were reserved, but not instantiated, and - * which we can now release. */ - for (idx = atmost; idx < info->prereserved_hpages; idx++) { - page = radix_tree_lookup(&mapping->page_tree, idx); - if (!page) - /* Pages which are already instantiated can't - * be unreserved (and in fact have already - * been removed from the reserved pool) */ - change_in_reserve++; - } - - BUG_ON(reserved_huge_pages < change_in_reserve); - reserved_huge_pages -= change_in_reserve; - info->prereserved_hpages = atmost; - - out: - read_unlock_irq(&inode->i_mapping->tree_lock); - spin_unlock(&hugetlb_lock); -} - static int __init hugetlb_init(void) { unsigned long i; @@ -335,7 +224,7 @@ static unsigned long set_max_huge_pages(unsigned long count) return nr_huge_pages; spin_lock(&hugetlb_lock); - count = max(count, reserved_huge_pages); + count = max(count, resv_huge_pages); try_to_free_low(count); while (count < nr_huge_pages) { struct page *page = dequeue_huge_page(NULL, 0); @@ -362,11 +251,11 @@ int hugetlb_report_meminfo(char *buf) return sprintf(buf, "HugePages_Total: %5lu\n" "HugePages_Free: %5lu\n" - "HugePages_Rsvd: %5lu\n" + "HugePages_Rsvd: %5lu\n" "Hugepagesize: %5lu kB\n", nr_huge_pages, free_huge_pages, - reserved_huge_pages, + resv_huge_pages, HPAGE_SIZE/1024); } @@ -755,3 +644,156 @@ void hugetlb_change_protection(struct vm_area_struct *vma, flush_tlb_range(vma, start, end); } +struct file_region { + struct list_head link; + long from; + long to; +}; + +static long region_add(struct list_head *head, long f, long t) +{ + struct file_region *rg, *nrg, *trg; + + /* Locate the region we are either in or before. */ + list_for_each_entry(rg, head, link) + if (f <= rg->to) + break; + + /* Round our left edge to the current segment if it encloses us. */ + if (f > rg->from) + f = rg->from; + + /* Check for and consume any regions we now overlap with. */ + nrg = rg; + list_for_each_entry_safe(rg, trg, rg->link.prev, link) { + if (&rg->link == head) + break; + if (rg->from > t) + break; + + /* If this area reaches higher then extend our area to + * include it completely. If this is not the first area + * which we intend to reuse, free it. */ + if (rg->to > t) + t = rg->to; + if (rg != nrg) { + list_del(&rg->link); + kfree(rg); + } + } + nrg->from = f; + nrg->to = t; + return 0; +} + +static long region_chg(struct list_head *head, long f, long t) +{ + struct file_region *rg, *nrg; + long chg = 0; + + /* Locate the region we are before or in. */ + list_for_each_entry(rg, head, link) + if (f <= rg->to) + break; + + /* If we are below the current region then a new region is required. + * Subtle, allocate a new region at the position but make it zero + * size such that we can guarentee to record the reservation. */ + if (&rg->link == head || t < rg->from) { + nrg = kmalloc(sizeof(*nrg), GFP_KERNEL); + if (nrg == 0) + return -ENOMEM; + nrg->from = f; + nrg->to = f; + INIT_LIST_HEAD(&nrg->link); + list_add(&nrg->link, rg->link.prev); + + return t - f; + } + + /* Round our left edge to the current segment if it encloses us. */ + if (f > rg->from) + f = rg->from; + chg = t - f; + + /* Check for and consume any regions we now overlap with. */ + list_for_each_entry(rg, rg->link.prev, link) { + if (&rg->link == head) + break; + if (rg->from > t) + return chg; + + /* We overlap with this area, if it extends futher than + * us then we must extend ourselves. Account for its + * existing reservation. */ + if (rg->to > t) { + chg += rg->to - t; + t = rg->to; + } + chg -= rg->to - rg->from; + } + return chg; +} + +static long region_truncate(struct list_head *head, long end) +{ + struct file_region *rg, *trg; + long chg = 0; + + /* Locate the region we are either in or before. */ + list_for_each_entry(rg, head, link) + if (end <= rg->to) + break; + if (&rg->link == head) + return 0; + + /* If we are in the middle of a region then adjust it. */ + if (end > rg->from) { + chg = rg->to - end; + rg->to = end; + rg = list_entry(rg->link.next, typeof(*rg), link); + } + + /* Drop any remaining regions. */ + list_for_each_entry_safe(rg, trg, rg->link.prev, link) { + if (&rg->link == head) + break; + chg += rg->to - rg->from; + list_del(&rg->link); + kfree(rg); + } + return chg; +} + +static int hugetlb_acct_memory(long delta) +{ + int ret = -ENOMEM; + + spin_lock(&hugetlb_lock); + if ((delta + resv_huge_pages) <= free_huge_pages) { + resv_huge_pages += delta; + ret = 0; + } + spin_unlock(&hugetlb_lock); + return ret; +} + +int hugetlb_reserve_pages(struct inode *inode, long from, long to) +{ + long ret, chg; + + chg = region_chg(&inode->i_mapping->private_list, from, to); + if (chg < 0) + return chg; + ret = hugetlb_acct_memory(chg); + if (ret < 0) + return ret; + region_add(&inode->i_mapping->private_list, from, to); + return 0; +} + +void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed) +{ + long chg = region_truncate(&inode->i_mapping->private_list, offset); + hugetlb_acct_memory(freed - chg); +} diff --git a/mm/memory.c b/mm/memory.c index 9f75bb2ca..45a81998a 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -47,7 +47,9 @@ #include #include #include +#include #include +#include #include #include @@ -126,7 +128,7 @@ static void free_pte_range(struct mmu_gather *tlb, pmd_t *pmd) pmd_clear(pmd); pte_lock_deinit(page); pte_free_tlb(tlb, page); - dec_page_state(nr_page_table_pages); + dec_zone_page_state(page, NR_PAGETABLE); tlb->mm->nr_ptes--; } @@ -311,7 +313,7 @@ int __pte_alloc(struct mm_struct *mm, pmd_t *pmd, unsigned long address) pte_free(new); } else { mm->nr_ptes++; - inc_page_state(nr_page_table_pages); + inc_zone_page_state(new, NR_PAGETABLE); pmd_populate(mm, pmd, new); } spin_unlock(&mm->page_table_lock); @@ -435,7 +437,9 @@ copy_one_pte(struct mm_struct *dst_mm, struct mm_struct *src_mm, /* pte contains position in swap or file, so copy. */ if (unlikely(!pte_present(pte))) { if (!pte_file(pte)) { - swap_duplicate(pte_to_swp_entry(pte)); + swp_entry_t entry = pte_to_swp_entry(pte); + + swap_duplicate(entry); /* make sure dst_mm is on swapoff's mmlist. */ if (unlikely(list_empty(&dst_mm->mmlist))) { spin_lock(&mmlist_lock); @@ -444,6 +448,16 @@ copy_one_pte(struct mm_struct *dst_mm, struct mm_struct *src_mm, &src_mm->mmlist); spin_unlock(&mmlist_lock); } + if (is_write_migration_entry(entry) && + is_cow_mapping(vm_flags)) { + /* + * COW mappings require pages in both parent + * and child to be set to read. + */ + make_migration_entry_read(&entry); + pte = swp_entry_to_pte(entry); + set_pte_at(src_mm, addr, src_pte, pte); + } } goto out_set_pte; } @@ -492,7 +506,7 @@ again: return -ENOMEM; src_pte = pte_offset_map_nested(src_pmd, addr); src_ptl = pte_lockptr(src_mm, src_pmd); - spin_lock(src_ptl); + spin_lock_nested(src_ptl, SINGLE_DEPTH_NESTING); do { /* @@ -665,7 +679,7 @@ static unsigned long zap_pte_range(struct mmu_gather *tlb, mark_page_accessed(page); file_rss--; } - page_remove_rmap(page); + page_remove_rmap(page, vma); tlb_remove_page(tlb, page); continue; } @@ -879,6 +893,7 @@ unsigned long zap_page_range(struct vm_area_struct *vma, unsigned long address, tlb_finish_mmu(tlb, address, end); return end; } +EXPORT_SYMBOL(zap_page_range); /* * Do a quick page-table lookup for a single page. @@ -1562,25 +1577,71 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma, { struct page *old_page, *new_page; pte_t entry; - int ret = VM_FAULT_MINOR; + int reuse = 0, ret = VM_FAULT_MINOR; + struct page *dirty_page = NULL; 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, 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); - update_mmu_cache(vma, address, entry); - lazy_mmu_prot_update(entry); - ret |= VM_FAULT_WRITE; - goto unlock; + /* + * Take out anonymous pages first, anonymous shared vmas are + * not dirty accountable. + */ + if (PageAnon(old_page)) { + if (!TestSetPageLocked(old_page)) { + reuse = can_share_swap_page(old_page); + unlock_page(old_page); } + } else if (unlikely((vma->vm_flags & (VM_WRITE|VM_SHARED)) == + (VM_WRITE|VM_SHARED))) { + /* + * Only catch write-faults on shared writable pages, + * read-only shared pages can get COWed by + * get_user_pages(.write=1, .force=1). + */ + if (vma->vm_ops && vma->vm_ops->page_mkwrite) { + /* + * Notify the address space that the page is about to + * become writable so that it can prohibit this or wait + * for the page to get into an appropriate state. + * + * We do this without the lock held, so that it can + * sleep if it needs to. + */ + page_cache_get(old_page); + pte_unmap_unlock(page_table, ptl); + + if (vma->vm_ops->page_mkwrite(vma, old_page) < 0) + goto unwritable_page; + + page_cache_release(old_page); + + /* + * Since we dropped the lock we need to revalidate + * the PTE as someone else may have changed it. If + * they did, we just return, as we can count on the + * MMU to tell us if they didn't also make it writable. + */ + page_table = pte_offset_map_lock(mm, pmd, address, + &ptl); + if (!pte_same(*page_table, orig_pte)) + goto unlock; + } + dirty_page = old_page; + get_page(dirty_page); + reuse = 1; + } + + if (reuse) { + 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); + update_mmu_cache(vma, address, entry); + lazy_mmu_prot_update(entry); + ret |= VM_FAULT_WRITE; + goto unlock; } /* @@ -1609,7 +1670,7 @@ gotten: page_table = pte_offset_map_lock(mm, pmd, address, &ptl); if (likely(pte_same(*page_table, orig_pte))) { if (old_page) { - page_remove_rmap(old_page); + page_remove_rmap(old_page, vma); if (!PageAnon(old_page)) { dec_mm_counter(mm, file_rss); inc_mm_counter(mm, anon_rss); @@ -1619,9 +1680,16 @@ gotten: 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); - update_mmu_cache(vma, address, entry); lazy_mmu_prot_update(entry); + /* + * Clear the pte entry and flush it first, before updating the + * pte with the new entry. This will avoid a race condition + * seen in the presence of one thread doing SMC and another + * thread doing COW. + */ + ptep_clear_flush(vma, address, page_table); + set_pte_at(mm, address, page_table, entry); + update_mmu_cache(vma, address, entry); lru_cache_add_active(new_page); page_add_new_anon_rmap(new_page, vma, address); @@ -1635,11 +1703,19 @@ gotten: page_cache_release(old_page); unlock: pte_unmap_unlock(page_table, ptl); + if (dirty_page) { + set_page_dirty_balance(dirty_page); + put_page(dirty_page); + } return ret; oom: if (old_page) page_cache_release(old_page); return VM_FAULT_OOM; + +unwritable_page: + page_cache_release(old_page); + return VM_FAULT_SIGBUS; } /* @@ -1919,7 +1995,7 @@ int vmtruncate_range(struct inode *inode, loff_t offset, loff_t end) return 0; } -EXPORT_SYMBOL(vmtruncate_range); +EXPORT_UNUSED_SYMBOL(vmtruncate_range); /* June 2006 */ /* * Primitive swap readahead code. We simply read an aligned block of @@ -1996,7 +2072,11 @@ static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma, goto out; entry = pte_to_swp_entry(orig_pte); -again: + if (is_migration_entry(entry)) { + migration_entry_wait(mm, pmd, address); + goto out; + } + delayacct_set_flag(DELAYACCT_PF_SWAPIN); page = lookup_swap_cache(entry); if (!page) { swapin_readahead(entry, address, vma); @@ -2009,12 +2089,13 @@ again: page_table = pte_offset_map_lock(mm, pmd, address, &ptl); if (likely(pte_same(*page_table, orig_pte))) ret = VM_FAULT_OOM; + delayacct_clear_flag(DELAYACCT_PF_SWAPIN); goto unlock; } /* Had to read the page from swap area: Major fault */ ret = VM_FAULT_MAJOR; - inc_page_state(pgmajfault); + count_vm_event(PGMAJFAULT); grab_swap_token(); } @@ -2022,14 +2103,10 @@ again: ret = VM_FAULT_OOM; goto out; } + + delayacct_clear_flag(DELAYACCT_PF_SWAPIN); mark_page_accessed(page); lock_page(page); - if (!PageSwapCache(page)) { - /* Page migration has occured */ - unlock_page(page); - page_cache_release(page); - goto again; - } /* * Back out if somebody else already faulted in this pte. @@ -2169,6 +2246,7 @@ static int do_no_page(struct mm_struct *mm, struct vm_area_struct *vma, unsigned int sequence = 0; int ret = VM_FAULT_MINOR; int anon = 0; + struct page *dirty_page = NULL; pte_unmap(page_table); BUG_ON(vma->vm_flags & VM_PFNMAP); @@ -2200,18 +2278,31 @@ retry: /* * Should we do an early C-O-W break? */ - if (write_access && !(vma->vm_flags & VM_SHARED)) { - struct page *page; + if (write_access) { + if (!(vma->vm_flags & VM_SHARED)) { + struct page *page; - if (unlikely(anon_vma_prepare(vma))) - goto oom; - page = alloc_page_vma(GFP_HIGHUSER, vma, address); - if (!page) - goto oom; - copy_user_highpage(page, new_page, address); - page_cache_release(new_page); - new_page = page; - anon = 1; + if (unlikely(anon_vma_prepare(vma))) + goto oom; + page = alloc_page_vma(GFP_HIGHUSER, vma, address); + if (!page) + goto oom; + copy_user_highpage(page, new_page, address); + page_cache_release(new_page); + new_page = page; + anon = 1; + + } else { + /* if the page will be shareable, see if the backing + * address space wants to know that the page is about + * to become writable */ + if (vma->vm_ops->page_mkwrite && + vma->vm_ops->page_mkwrite(vma, new_page) < 0 + ) { + page_cache_release(new_page); + return VM_FAULT_SIGBUS; + } + } } page_table = pte_offset_map_lock(mm, pmd, address, &ptl); @@ -2253,6 +2344,10 @@ retry: } else { inc_mm_counter(mm, file_rss); page_add_file_rmap(new_page); + if (write_access) { + dirty_page = new_page; + get_page(dirty_page); + } } } else { /* One of our sibling threads was faster, back out. */ @@ -2265,6 +2360,10 @@ retry: lazy_mmu_prot_update(entry); unlock: pte_unmap_unlock(page_table, ptl); + if (dirty_page) { + set_page_dirty_balance(dirty_page); + put_page(dirty_page); + } return ret; oom: page_cache_release(new_page); @@ -2389,7 +2488,7 @@ int __handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma, __set_current_state(TASK_RUNNING); - inc_page_state(pgfault); + count_vm_event(PGFAULT); if (unlikely(is_vm_hugetlb_page(vma))) return hugetlb_fault(mm, vma, address, write_access); diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 70df5c0d9..c37319542 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -4,7 +4,6 @@ * Copyright (C) */ -#include #include #include #include @@ -21,12 +20,13 @@ #include #include #include +#include #include extern void zonetable_add(struct zone *zone, int nid, int zid, unsigned long pfn, unsigned long size); -static void __add_zone(struct zone *zone, unsigned long phys_start_pfn) +static int __add_zone(struct zone *zone, unsigned long phys_start_pfn) { struct pglist_data *pgdat = zone->zone_pgdat; int nr_pages = PAGES_PER_SECTION; @@ -34,8 +34,15 @@ static void __add_zone(struct zone *zone, unsigned long phys_start_pfn) int zone_type; zone_type = zone - pgdat->node_zones; + if (!populated_zone(zone)) { + int ret = 0; + ret = init_currently_empty_zone(zone, phys_start_pfn, nr_pages); + if (ret < 0) + return ret; + } memmap_init_zone(nr_pages, nid, zone_type, phys_start_pfn); zonetable_add(zone, nid, zone_type, phys_start_pfn, nr_pages); + return 0; } extern int sparse_add_one_section(struct zone *zone, unsigned long start_pfn, @@ -45,12 +52,19 @@ static int __add_section(struct zone *zone, unsigned long phys_start_pfn) int nr_pages = PAGES_PER_SECTION; int ret; + if (pfn_valid(phys_start_pfn)) + return -EEXIST; + ret = sparse_add_one_section(zone, phys_start_pfn, nr_pages); if (ret < 0) return ret; - __add_zone(zone, phys_start_pfn); + ret = __add_zone(zone, phys_start_pfn); + + if (ret < 0) + return ret; + return register_new_memory(__pfn_to_section(phys_start_pfn)); } @@ -65,15 +79,22 @@ int __add_pages(struct zone *zone, unsigned long phys_start_pfn, { unsigned long i; int err = 0; + int start_sec, end_sec; + /* during initialize mem_map, align hot-added range to section */ + start_sec = pfn_to_section_nr(phys_start_pfn); + end_sec = pfn_to_section_nr(phys_start_pfn + nr_pages - 1); - for (i = 0; i < nr_pages; i += PAGES_PER_SECTION) { - err = __add_section(zone, phys_start_pfn + i); + for (i = start_sec; i <= end_sec; i++) { + err = __add_section(zone, i << PFN_SECTION_SHIFT); - /* We want to keep adding the rest of the - * sections if the first ones already exist + /* + * EEXIST is finally dealed with by ioresource collision + * check. see add_memory() => register_memory_resource() + * Warning will be printed if there is collision. */ if (err && (err != -EEXIST)) break; + err = 0; } return err; @@ -115,7 +136,11 @@ int online_pages(unsigned long pfn, unsigned long nr_pages) unsigned long i; unsigned long flags; unsigned long onlined_pages = 0; + struct resource res; + u64 section_end; + unsigned long start_pfn; struct zone *zone; + int need_zonelists_rebuild = 0; /* * This doesn't need a lock to do pfn_to_page(). @@ -128,15 +153,154 @@ int online_pages(unsigned long pfn, unsigned long nr_pages) grow_pgdat_span(zone->zone_pgdat, pfn, pfn + nr_pages); pgdat_resize_unlock(zone->zone_pgdat, &flags); - for (i = 0; i < nr_pages; i++) { - struct page *page = pfn_to_page(pfn + i); - online_page(page); - onlined_pages++; + /* + * If this zone is not populated, then it is not in zonelist. + * This means the page allocator ignores this zone. + * So, zonelist must be updated after online. + */ + if (!populated_zone(zone)) + need_zonelists_rebuild = 1; + + res.start = (u64)pfn << PAGE_SHIFT; + res.end = res.start + ((u64)nr_pages << PAGE_SHIFT) - 1; + res.flags = IORESOURCE_MEM; /* we just need system ram */ + section_end = res.end; + + while ((res.start < res.end) && (find_next_system_ram(&res) >= 0)) { + start_pfn = (unsigned long)(res.start >> PAGE_SHIFT); + nr_pages = (unsigned long) + ((res.end + 1 - res.start) >> PAGE_SHIFT); + + if (PageReserved(pfn_to_page(start_pfn))) { + /* this region's page is not onlined now */ + for (i = 0; i < nr_pages; i++) { + struct page *page = pfn_to_page(start_pfn + i); + online_page(page); + onlined_pages++; + } + } + + res.start = res.end + 1; + res.end = section_end; } zone->present_pages += onlined_pages; zone->zone_pgdat->node_present_pages += onlined_pages; setup_per_zone_pages_min(); + if (need_zonelists_rebuild) + build_all_zonelists(); + vm_total_pages = nr_free_pagecache_pages(); return 0; } + +static pg_data_t *hotadd_new_pgdat(int nid, u64 start) +{ + struct pglist_data *pgdat; + unsigned long zones_size[MAX_NR_ZONES] = {0}; + unsigned long zholes_size[MAX_NR_ZONES] = {0}; + unsigned long start_pfn = start >> PAGE_SHIFT; + + pgdat = arch_alloc_nodedata(nid); + if (!pgdat) + return NULL; + + arch_refresh_nodedata(nid, pgdat); + + /* we can use NODE_DATA(nid) from here */ + + /* init node's zones as empty zones, we don't have any present pages.*/ + free_area_init_node(nid, pgdat, zones_size, start_pfn, zholes_size); + + return pgdat; +} + +static void rollback_node_hotadd(int nid, pg_data_t *pgdat) +{ + arch_refresh_nodedata(nid, NULL); + arch_free_nodedata(pgdat); + return; +} + +/* add this memory to iomem resource */ +static struct resource *register_memory_resource(u64 start, u64 size) +{ + struct resource *res; + res = kzalloc(sizeof(struct resource), GFP_KERNEL); + BUG_ON(!res); + + res->name = "System RAM"; + res->start = start; + res->end = start + size - 1; + res->flags = IORESOURCE_MEM; + if (request_resource(&iomem_resource, res) < 0) { + printk("System RAM resource %llx - %llx cannot be added\n", + (unsigned long long)res->start, (unsigned long long)res->end); + kfree(res); + res = NULL; + } + return res; +} + +static void release_memory_resource(struct resource *res) +{ + if (!res) + return; + release_resource(res); + kfree(res); + return; +} + + + +int add_memory(int nid, u64 start, u64 size) +{ + pg_data_t *pgdat = NULL; + int new_pgdat = 0; + struct resource *res; + int ret; + + res = register_memory_resource(start, size); + if (!res) + return -EEXIST; + + if (!node_online(nid)) { + pgdat = hotadd_new_pgdat(nid, start); + if (!pgdat) + return -ENOMEM; + new_pgdat = 1; + ret = kswapd_run(nid); + if (ret) + goto error; + } + + /* call arch's memory hotadd */ + ret = arch_add_memory(nid, start, size); + + if (ret < 0) + goto error; + + /* we online node here. we can't roll back from here. */ + node_set_online(nid); + + if (new_pgdat) { + ret = register_one_node(nid); + /* + * If sysfs file of new node can't create, cpu on the node + * can't be hot-added. There is no rollback way now. + * So, check by BUG_ON() to catch it reluctantly.. + */ + BUG_ON(ret); + } + + return ret; +error: + /* rollback pgdat allocation and others */ + if (new_pgdat) + rollback_node_hotadd(nid, pgdat); + if (res) + release_memory_resource(res); + + return ret; +} +EXPORT_SYMBOL_GPL(add_memory); diff --git a/mm/mempolicy.c b/mm/mempolicy.c index e37584ce7..a9963cedd 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -87,7 +87,8 @@ #include #include #include -#include +#include +#include #include #include @@ -588,6 +589,11 @@ static void migrate_page_add(struct page *page, struct list_head *pagelist, isolate_lru_page(page, pagelist); } +static struct page *new_node_page(struct page *page, unsigned long node, int **x) +{ + return alloc_pages_node(node, GFP_HIGHUSER, 0); +} + /* * Migrate pages from one node to a target node. * Returns error or the number of pages not migrated. @@ -604,11 +610,9 @@ int migrate_to_node(struct mm_struct *mm, int source, int dest, int flags) check_range(mm, mm->mmap->vm_start, TASK_SIZE, &nmask, flags | MPOL_MF_DISCONTIG_OK, &pagelist); - if (!list_empty(&pagelist)) { - err = migrate_pages_to(&pagelist, NULL, dest); - if (!list_empty(&pagelist)) - putback_lru_pages(&pagelist); - } + if (!list_empty(&pagelist)) + err = migrate_pages(&pagelist, new_node_page, dest); + return err; } @@ -628,6 +632,10 @@ int do_migrate_pages(struct mm_struct *mm, down_read(&mm->mmap_sem); + err = migrate_vmas(mm, from_nodes, to_nodes, flags); + if (err) + goto out; + /* * Find a 'source' bit set in 'tmp' whose corresponding 'dest' * bit in 'to' is not also set in 'tmp'. Clear the found 'source' @@ -687,7 +695,7 @@ int do_migrate_pages(struct mm_struct *mm, if (err < 0) break; } - +out: up_read(&mm->mmap_sem); if (err < 0) return err; @@ -695,6 +703,12 @@ int do_migrate_pages(struct mm_struct *mm, } +static struct page *new_vma_page(struct page *page, unsigned long private, int **x) +{ + struct vm_area_struct *vma = (struct vm_area_struct *)private; + + return alloc_page_vma(GFP_HIGHUSER, vma, page_address_in_vma(page, vma)); +} #else static void migrate_page_add(struct page *page, struct list_head *pagelist, @@ -707,6 +721,11 @@ int do_migrate_pages(struct mm_struct *mm, { return -ENOSYS; } + +static struct page *new_vma_page(struct page *page, unsigned long private) +{ + return NULL; +} #endif long do_mbind(unsigned long start, unsigned long len, @@ -768,15 +787,13 @@ long do_mbind(unsigned long start, unsigned long len, err = mbind_range(vma, start, end, new); if (!list_empty(&pagelist)) - nr_failed = migrate_pages_to(&pagelist, vma, -1); + nr_failed = migrate_pages(&pagelist, new_vma_page, + (unsigned long)vma); if (!err && nr_failed && (flags & MPOL_MF_STRICT)) err = -EIO; } - if (!list_empty(&pagelist)) - putback_lru_pages(&pagelist); - up_write(&mm->mmap_sem); mpol_free(new); return err; @@ -930,6 +947,10 @@ asmlinkage long sys_migrate_pages(pid_t pid, unsigned long maxnode, goto out; } + err = security_task_movememory(task); + if (err) + goto out; + err = do_migrate_pages(mm, &old, &new, capable(CAP_SYS_NICE) ? MPOL_MF_MOVE_ALL : MPOL_MF_MOVE); out: @@ -1155,7 +1176,15 @@ static inline unsigned interleave_nid(struct mempolicy *pol, if (vma) { unsigned long off; - off = vma->vm_pgoff; + /* + * for small pages, there is no difference between + * shift and PAGE_SHIFT, so the bit-shift is safe. + * for huge pages, since vm_pgoff is in units of small + * pages, we need to shift off the always 0 bits to get + * a useful offset. + */ + BUG_ON(shift < PAGE_SHIFT); + off = vma->vm_pgoff >> (shift - PAGE_SHIFT); off += (addr - vma->vm_start) >> shift; return offset_il_node(pol, vma, off); } else @@ -1188,10 +1217,8 @@ static struct page *alloc_page_interleave(gfp_t gfp, unsigned order, zl = NODE_DATA(nid)->node_zonelists + gfp_zone(gfp); page = __alloc_pages(gfp, order, zl); - if (page && page_zone(page) == zl->zones[0]) { - zone_pcp(zl->zones[0],get_cpu())->interleave_hit++; - put_cpu(); - } + if (page && page_zone(page) == zl->zones[0]) + inc_zone_page_state(page, NUMA_INTERLEAVE_HIT); return page; } @@ -1800,7 +1827,7 @@ static inline void check_huge_range(struct vm_area_struct *vma, int show_numa_map(struct seq_file *m, void *v) { - struct task_struct *task = m->private; + struct proc_maps_private *priv = m->private; struct vm_area_struct *vma = v; struct numa_maps *md; struct file *file = vma->vm_file; @@ -1816,7 +1843,7 @@ int show_numa_map(struct seq_file *m, void *v) return 0; mpol_to_str(buffer, sizeof(buffer), - get_vma_policy(task, vma, vma->vm_start)); + get_vma_policy(priv->task, vma, vma->vm_start)); seq_printf(m, "%08lx %s", vma->vm_start, buffer); @@ -1870,7 +1897,7 @@ out: kfree(md); if (m->count < m->size) - m->version = (vma != get_gate_vma(task)) ? vma->vm_start : 0; + m->version = (vma != priv->tail_vma) ? vma->vm_start : 0; return 0; } diff --git a/mm/mempool.c b/mm/mempool.c index fe6e05289..ccd8cb8cd 100644 --- a/mm/mempool.c +++ b/mm/mempool.c @@ -238,8 +238,13 @@ repeat_alloc: init_wait(&wait); prepare_to_wait(&pool->wait, &wait, TASK_UNINTERRUPTIBLE); smp_mb(); - if (!pool->curr_nr) - io_schedule(); + if (!pool->curr_nr) { + /* + * FIXME: this should be io_schedule(). The timeout is there + * as a workaround for some DM problems in 2.6.18. + */ + io_schedule_timeout(5*HZ); + } finish_wait(&pool->wait, &wait); goto repeat_alloc; diff --git a/mm/migrate.c b/mm/migrate.c index 1c2504069..08c9fff40 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -23,13 +24,13 @@ #include #include #include -#include +#include +#include +#include +#include #include "internal.h" -/* The maximum number of pages to take off the LRU for migration */ -#define MIGRATE_CHUNK_SIZE 256 - #define lru_to_page(_head) (list_entry((_head)->prev, struct page, lru)) /* @@ -64,16 +65,11 @@ int isolate_lru_page(struct page *page, struct list_head *pagelist) } /* - * migrate_prep() needs to be called after we have compiled the list of pages - * to be migrated using isolate_lru_page() but before we begin a series of calls - * to migrate_pages(). + * migrate_prep() needs to be called before we start compiling a list of pages + * to be migrated using isolate_lru_page(). */ int migrate_prep(void) { - /* Must have swap device for migration */ - if (nr_swap_pages <= 0) - return -ENODEV; - /* * Clear the LRU lists so pages can be isolated. * Note that pages may be moved off the LRU after we have @@ -87,7 +83,6 @@ int migrate_prep(void) static inline void move_to_lru(struct page *page) { - list_del(&page->lru); if (PageActive(page)) { /* * lru_cache_add_active checks that @@ -113,113 +108,200 @@ int putback_lru_pages(struct list_head *l) int count = 0; list_for_each_entry_safe(page, page2, l, lru) { + list_del(&page->lru); move_to_lru(page); count++; } return count; } -/* - * Non migratable page - */ -int fail_migrate_page(struct page *newpage, struct page *page) +static inline int is_swap_pte(pte_t pte) { - return -EIO; + return !pte_none(pte) && !pte_present(pte) && !pte_file(pte); } -EXPORT_SYMBOL(fail_migrate_page); /* - * swapout a single page - * page is locked upon entry, unlocked on exit + * Restore a potential migration pte to a working pte entry */ -static int swap_page(struct page *page) +static void remove_migration_pte(struct vm_area_struct *vma, + struct page *old, struct page *new) { - struct address_space *mapping = page_mapping(page); + struct mm_struct *mm = vma->vm_mm; + swp_entry_t entry; + pgd_t *pgd; + pud_t *pud; + pmd_t *pmd; + pte_t *ptep, pte; + spinlock_t *ptl; + unsigned long addr = page_address_in_vma(new, vma); + + if (addr == -EFAULT) + return; + + pgd = pgd_offset(mm, addr); + if (!pgd_present(*pgd)) + return; + + pud = pud_offset(pgd, addr); + if (!pud_present(*pud)) + return; + + pmd = pmd_offset(pud, addr); + if (!pmd_present(*pmd)) + return; + + ptep = pte_offset_map(pmd, addr); + + if (!is_swap_pte(*ptep)) { + pte_unmap(ptep); + return; + } - if (page_mapped(page) && mapping) - if (try_to_unmap(page, 1) != SWAP_SUCCESS) - goto unlock_retry; + ptl = pte_lockptr(mm, pmd); + spin_lock(ptl); + pte = *ptep; + if (!is_swap_pte(pte)) + goto out; - if (PageDirty(page)) { - /* Page is dirty, try to write it out here */ - switch(pageout(page, mapping)) { - case PAGE_KEEP: - case PAGE_ACTIVATE: - goto unlock_retry; + entry = pte_to_swp_entry(pte); - case PAGE_SUCCESS: - goto retry; + if (!is_migration_entry(entry) || migration_entry_to_page(entry) != old) + goto out; - case PAGE_CLEAN: - ; /* try to free the page below */ - } - } + get_page(new); + pte = pte_mkold(mk_pte(new, vma->vm_page_prot)); + if (is_write_migration_entry(entry)) + pte = pte_mkwrite(pte); + set_pte_at(mm, addr, ptep, pte); - if (PagePrivate(page)) { - if (!try_to_release_page(page, GFP_KERNEL) || - (!mapping && page_count(page) == 1)) - goto unlock_retry; - } + if (PageAnon(new)) + page_add_anon_rmap(new, vma, addr); + else + page_add_file_rmap(new); - if (remove_mapping(mapping, page)) { - /* Success */ - unlock_page(page); - return 0; - } + /* No need to invalidate - it was non-present before */ + update_mmu_cache(vma, addr, pte); + lazy_mmu_prot_update(pte); -unlock_retry: - unlock_page(page); +out: + pte_unmap_unlock(ptep, ptl); +} -retry: - return -EAGAIN; +/* + * Note that remove_file_migration_ptes will only work on regular mappings, + * Nonlinear mappings do not use migration entries. + */ +static void remove_file_migration_ptes(struct page *old, struct page *new) +{ + struct vm_area_struct *vma; + struct address_space *mapping = page_mapping(new); + struct prio_tree_iter iter; + pgoff_t pgoff = new->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); + + if (!mapping) + return; + + spin_lock(&mapping->i_mmap_lock); + + vma_prio_tree_foreach(vma, &iter, &mapping->i_mmap, pgoff, pgoff) + remove_migration_pte(vma, old, new); + + spin_unlock(&mapping->i_mmap_lock); } /* - * Remove references for a page and establish the new page with the correct - * basic settings to be able to stop accesses to the page. + * Must hold mmap_sem lock on at least one of the vmas containing + * the page so that the anon_vma cannot vanish. */ -int migrate_page_remove_references(struct page *newpage, - struct page *page, int nr_refs) +static void remove_anon_migration_ptes(struct page *old, struct page *new) { - struct address_space *mapping = page_mapping(page); - struct page **radix_pointer; + struct anon_vma *anon_vma; + struct vm_area_struct *vma; + unsigned long mapping; - /* - * Avoid doing any of the following work if the page count - * indicates that the page is in use or truncate has removed - * the page. - */ - if (!mapping || page_mapcount(page) + nr_refs != page_count(page)) - return -EAGAIN; + mapping = (unsigned long)new->mapping; - /* - * Establish swap ptes for anonymous pages or destroy pte - * maps for files. - * - * In order to reestablish file backed mappings the fault handlers - * will take the radix tree_lock which may then be used to stop - * processses from accessing this page until the new page is ready. - * - * A process accessing via a swap pte (an anonymous page) will take a - * page_lock on the old page which will block the process until the - * migration attempt is complete. At that time the PageSwapCache bit - * will be examined. If the page was migrated then the PageSwapCache - * bit will be clear and the operation to retrieve the page will be - * retried which will find the new page in the radix tree. Then a new - * direct mapping may be generated based on the radix tree contents. - * - * If the page was not migrated then the PageSwapCache bit - * is still set and the operation may continue. - */ - if (try_to_unmap(page, 1) == SWAP_FAIL) - /* A vma has VM_LOCKED set -> permanent failure */ - return -EPERM; + if (!mapping || (mapping & PAGE_MAPPING_ANON) == 0) + return; /* - * Give up if we were unable to remove all mappings. + * We hold the mmap_sem lock. So no need to call page_lock_anon_vma. */ - if (page_mapcount(page)) - return -EAGAIN; + anon_vma = (struct anon_vma *) (mapping - PAGE_MAPPING_ANON); + spin_lock(&anon_vma->lock); + + list_for_each_entry(vma, &anon_vma->head, anon_vma_node) + remove_migration_pte(vma, old, new); + + spin_unlock(&anon_vma->lock); +} + +/* + * Get rid of all migration entries and replace them by + * references to the indicated page. + */ +static void remove_migration_ptes(struct page *old, struct page *new) +{ + if (PageAnon(new)) + remove_anon_migration_ptes(old, new); + else + remove_file_migration_ptes(old, new); +} + +/* + * Something used the pte of a page under migration. We need to + * get to the page and wait until migration is finished. + * When we return from this function the fault will be retried. + * + * This function is called from do_swap_page(). + */ +void migration_entry_wait(struct mm_struct *mm, pmd_t *pmd, + unsigned long address) +{ + pte_t *ptep, pte; + spinlock_t *ptl; + swp_entry_t entry; + struct page *page; + + ptep = pte_offset_map_lock(mm, pmd, address, &ptl); + pte = *ptep; + if (!is_swap_pte(pte)) + goto out; + + entry = pte_to_swp_entry(pte); + if (!is_migration_entry(entry)) + goto out; + + page = migration_entry_to_page(entry); + + get_page(page); + pte_unmap_unlock(ptep, ptl); + wait_on_page_locked(page); + put_page(page); + return; +out: + pte_unmap_unlock(ptep, ptl); +} + +/* + * Replace the page in the mapping. + * + * The number of remaining references must be: + * 1 for anonymous pages without a mapping + * 2 for pages with a mapping + * 3 for pages with a mapping and PagePrivate set. + */ +static int migrate_page_move_mapping(struct address_space *mapping, + struct page *newpage, struct page *page) +{ + struct page **radix_pointer; + + if (!mapping) { + /* Anonymous page */ + if (page_count(page) != 1) + return -EAGAIN; + return 0; + } write_lock_irq(&mapping->tree_lock); @@ -227,7 +309,7 @@ int migrate_page_remove_references(struct page *newpage, &mapping->page_tree, page_index(page)); - if (!page_mapping(page) || page_count(page) != nr_refs || + if (page_count(page) != 2 + !!PagePrivate(page) || *radix_pointer != page) { write_unlock_irq(&mapping->tree_lock); return -EAGAIN; @@ -235,19 +317,14 @@ int migrate_page_remove_references(struct page *newpage, /* * Now we know that no one else is looking at the page. - * - * Certain minimal information about a page must be available - * in order for other subsystems to properly handle the page if they - * find it through the radix tree update before we are finished - * copying the page. */ get_page(newpage); - newpage->index = page->index; - newpage->mapping = page->mapping; +#ifdef CONFIG_SWAP if (PageSwapCache(page)) { SetPageSwapCache(newpage); set_page_private(newpage, page_private(page)); } +#endif *radix_pointer = newpage; __put_page(page); @@ -255,12 +332,11 @@ int migrate_page_remove_references(struct page *newpage, return 0; } -EXPORT_SYMBOL(migrate_page_remove_references); /* * Copy the page to its new location */ -void migrate_page_copy(struct page *newpage, struct page *page) +static void migrate_page_copy(struct page *newpage, struct page *page) { copy_highpage(newpage, page); @@ -272,8 +348,8 @@ void migrate_page_copy(struct page *newpage, struct page *page) SetPageUptodate(newpage); if (PageActive(page)) SetPageActive(newpage); - if (PageChecked(page)) - SetPageChecked(newpage); + if (PageFsMisc(page)) + SetPageFsMisc(newpage); if (PageMappedToDisk(page)) SetPageMappedToDisk(newpage); @@ -282,7 +358,9 @@ void migrate_page_copy(struct page *newpage, struct page *page) set_page_dirty(newpage); } +#ifdef CONFIG_SWAP ClearPageSwapCache(page); +#endif ClearPageActive(page); ClearPagePrivate(page); set_page_private(page, 0); @@ -295,7 +373,18 @@ void migrate_page_copy(struct page *newpage, struct page *page) if (PageWriteback(newpage)) end_page_writeback(newpage); } -EXPORT_SYMBOL(migrate_page_copy); + +/************************************************************ + * Migration functions + ***********************************************************/ + +/* Always fail migration. Used for mappings that are not movable */ +int fail_migrate_page(struct address_space *mapping, + struct page *newpage, struct page *page) +{ + return -EIO; +} +EXPORT_SYMBOL(fail_migrate_page); /* * Common logic to directly migrate a single page suitable for @@ -303,51 +392,284 @@ EXPORT_SYMBOL(migrate_page_copy); * * Pages are locked upon entry and exit. */ -int migrate_page(struct page *newpage, struct page *page) +int migrate_page(struct address_space *mapping, + struct page *newpage, struct page *page) { int rc; BUG_ON(PageWriteback(page)); /* Writeback must be complete */ - rc = migrate_page_remove_references(newpage, page, 2); + rc = migrate_page_move_mapping(mapping, newpage, page); + + if (rc) + return rc; + + migrate_page_copy(newpage, page); + return 0; +} +EXPORT_SYMBOL(migrate_page); + +/* + * Migration function for pages with buffers. This function can only be used + * if the underlying filesystem guarantees that no other references to "page" + * exist. + */ +int buffer_migrate_page(struct address_space *mapping, + struct page *newpage, struct page *page) +{ + struct buffer_head *bh, *head; + int rc; + + if (!page_has_buffers(page)) + return migrate_page(mapping, newpage, page); + + head = page_buffers(page); + + rc = migrate_page_move_mapping(mapping, newpage, page); if (rc) return rc; + bh = head; + do { + get_bh(bh); + lock_buffer(bh); + bh = bh->b_this_page; + + } while (bh != head); + + ClearPagePrivate(page); + set_page_private(newpage, page_private(page)); + set_page_private(page, 0); + put_page(page); + get_page(newpage); + + bh = head; + do { + set_bh_page(bh, newpage, bh_offset(bh)); + bh = bh->b_this_page; + + } while (bh != head); + + SetPagePrivate(newpage); + migrate_page_copy(newpage, page); + bh = head; + do { + unlock_buffer(bh); + put_bh(bh); + bh = bh->b_this_page; + + } while (bh != head); + + return 0; +} +EXPORT_SYMBOL(buffer_migrate_page); + +/* + * Writeback a page to clean the dirty state + */ +static int writeout(struct address_space *mapping, struct page *page) +{ + struct writeback_control wbc = { + .sync_mode = WB_SYNC_NONE, + .nr_to_write = 1, + .range_start = 0, + .range_end = LLONG_MAX, + .nonblocking = 1, + .for_reclaim = 1 + }; + int rc; + + if (!mapping->a_ops->writepage) + /* No write method for the address space */ + return -EINVAL; + + if (!clear_page_dirty_for_io(page)) + /* Someone else already triggered a write */ + return -EAGAIN; + /* - * Remove auxiliary swap entries and replace - * them with real ptes. - * - * Note that a real pte entry will allow processes that are not - * waiting on the page lock to use the new page via the page tables - * before the new page is unlocked. + * A dirty page may imply that the underlying filesystem has + * the page on some queue. So the page must be clean for + * migration. Writeout may mean we loose the lock and the + * page state is no longer what we checked for earlier. + * At this point we know that the migration attempt cannot + * be successful. */ - remove_from_swap(newpage); - return 0; + remove_migration_ptes(page, page); + + rc = mapping->a_ops->writepage(page, &wbc); + if (rc < 0) + /* I/O Error writing */ + return -EIO; + + if (rc != AOP_WRITEPAGE_ACTIVATE) + /* unlocked. Relock */ + lock_page(page); + + return -EAGAIN; +} + +/* + * Default handling if a filesystem does not provide a migration function. + */ +static int fallback_migrate_page(struct address_space *mapping, + struct page *newpage, struct page *page) +{ + if (PageDirty(page)) + return writeout(mapping, page); + + /* + * Buffers may be managed in a filesystem specific way. + * We must have no buffers or drop them. + */ + if (page_has_buffers(page) && + !try_to_release_page(page, GFP_KERNEL)) + return -EAGAIN; + + return migrate_page(mapping, newpage, page); +} + +/* + * Move a page to a newly allocated page + * The page is locked and all ptes have been successfully removed. + * + * The new page will have replaced the old page if this function + * is successful. + */ +static int move_to_new_page(struct page *newpage, struct page *page) +{ + struct address_space *mapping; + int rc; + + /* + * Block others from accessing the page when we get around to + * establishing additional references. We are the only one + * holding a reference to the new page at this point. + */ + if (TestSetPageLocked(newpage)) + BUG(); + + /* Prepare mapping for the new page.*/ + newpage->index = page->index; + newpage->mapping = page->mapping; + + mapping = page_mapping(page); + if (!mapping) + rc = migrate_page(mapping, newpage, page); + else if (mapping->a_ops->migratepage) + /* + * Most pages have a mapping and most filesystems + * should provide a migration function. Anonymous + * pages are part of swap space which also has its + * own migration function. This is the most common + * path for page migration. + */ + rc = mapping->a_ops->migratepage(mapping, + newpage, page); + else + rc = fallback_migrate_page(mapping, newpage, page); + + if (!rc) + remove_migration_ptes(page, newpage); + else + newpage->mapping = NULL; + + unlock_page(newpage); + + return rc; +} + +/* + * Obtain the lock on page, remove all ptes and migrate the page + * to the newly allocated page in newpage. + */ +static int unmap_and_move(new_page_t get_new_page, unsigned long private, + struct page *page, int force) +{ + int rc = 0; + int *result = NULL; + struct page *newpage = get_new_page(page, private, &result); + + if (!newpage) + return -ENOMEM; + + if (page_count(page) == 1) + /* page was freed from under us. So we are done. */ + goto move_newpage; + + rc = -EAGAIN; + if (TestSetPageLocked(page)) { + if (!force) + goto move_newpage; + lock_page(page); + } + + if (PageWriteback(page)) { + if (!force) + goto unlock; + wait_on_page_writeback(page); + } + + /* + * Establish migration ptes or remove ptes + */ + try_to_unmap(page, 1); + if (!page_mapped(page)) + rc = move_to_new_page(newpage, page); + + if (rc) + remove_migration_ptes(page, page); + +unlock: + unlock_page(page); + + if (rc != -EAGAIN) { + /* + * A page that has been migrated has all references + * removed and will be freed. A page that has not been + * migrated will have kepts its references and be + * restored. + */ + list_del(&page->lru); + move_to_lru(page); + } + +move_newpage: + /* + * Move the new page to the LRU. If migration was not successful + * then this will free the page. + */ + move_to_lru(newpage); + if (result) { + if (rc) + *result = rc; + else + *result = page_to_nid(newpage); + } + return rc; } -EXPORT_SYMBOL(migrate_page); /* * migrate_pages * - * Two lists are passed to this function. The first list - * contains the pages isolated from the LRU to be migrated. - * The second list contains new pages that the pages isolated - * can be moved to. If the second list is NULL then all - * pages are swapped out. + * The function takes one list of pages to migrate and a function + * that determines from the page to be migrated and the private data + * the target of the move and allocates the page. * * The function returns after 10 attempts or if no pages * are movable anymore because to has become empty - * or no retryable pages exist anymore. + * or no retryable pages exist anymore. All pages will be + * retruned to the LRU or freed. * - * Return: Number of pages not migrated when "to" ran empty. + * Return: Number of pages not migrated or error code. */ -int migrate_pages(struct list_head *from, struct list_head *to, - struct list_head *moved, struct list_head *failed) +int migrate_pages(struct list_head *from, + new_page_t get_new_page, unsigned long private) { - int retry; + int retry = 1; int nr_failed = 0; int pass = 0; struct page *page; @@ -358,305 +680,317 @@ int migrate_pages(struct list_head *from, struct list_head *to, if (!swapwrite) current->flags |= PF_SWAPWRITE; -redo: - retry = 0; + for(pass = 0; pass < 10 && retry; pass++) { + retry = 0; + + list_for_each_entry_safe(page, page2, from, lru) { + cond_resched(); + + rc = unmap_and_move(get_new_page, private, + page, pass > 2); + + switch(rc) { + case -ENOMEM: + goto out; + case -EAGAIN: + retry++; + break; + case 0: + break; + default: + /* Permanent failure */ + nr_failed++; + break; + } + } + } + rc = 0; +out: + if (!swapwrite) + current->flags &= ~PF_SWAPWRITE; + + putback_lru_pages(from); + + if (rc) + return rc; - list_for_each_entry_safe(page, page2, from, lru) { - struct page *newpage = NULL; - struct address_space *mapping; + return nr_failed + retry; +} - cond_resched(); +#ifdef CONFIG_NUMA +/* + * Move a list of individual pages + */ +struct page_to_node { + unsigned long addr; + struct page *page; + int node; + int status; +}; - rc = 0; - if (page_count(page) == 1) - /* page was freed from under us. So we are done. */ - goto next; +static struct page *new_page_node(struct page *p, unsigned long private, + int **result) +{ + struct page_to_node *pm = (struct page_to_node *)private; - if (to && list_empty(to)) - break; + while (pm->node != MAX_NUMNODES && pm->page != p) + pm++; - /* - * Skip locked pages during the first two passes to give the - * functions holding the lock time to release the page. Later we - * use lock_page() to have a higher chance of acquiring the - * lock. - */ - rc = -EAGAIN; - if (pass > 2) - lock_page(page); - else - if (TestSetPageLocked(page)) - goto next; + if (pm->node == MAX_NUMNODES) + return NULL; - /* - * Only wait on writeback if we have already done a pass where - * we we may have triggered writeouts for lots of pages. - */ - if (pass > 0) { - wait_on_page_writeback(page); - } else { - if (PageWriteback(page)) - goto unlock_page; - } + *result = &pm->status; - /* - * Anonymous pages must have swap cache references otherwise - * the information contained in the page maps cannot be - * preserved. - */ - if (PageAnon(page) && !PageSwapCache(page)) { - if (!add_to_swap(page, GFP_KERNEL)) { - rc = -ENOMEM; - goto unlock_page; - } - } + return alloc_pages_node(pm->node, GFP_HIGHUSER, 0); +} - if (!to) { - rc = swap_page(page); - goto next; - } +/* + * Move a set of pages as indicated in the pm array. The addr + * field must be set to the virtual address of the page to be moved + * and the node number must contain a valid target node. + */ +static int do_move_pages(struct mm_struct *mm, struct page_to_node *pm, + int migrate_all) +{ + int err; + struct page_to_node *pp; + LIST_HEAD(pagelist); + + down_read(&mm->mmap_sem); - newpage = lru_to_page(to); - lock_page(newpage); + /* + * Build a list of pages to migrate + */ + migrate_prep(); + for (pp = pm; pp->node != MAX_NUMNODES; pp++) { + struct vm_area_struct *vma; + struct page *page; /* - * Pages are properly locked and writeback is complete. - * Try to migrate the page. + * A valid page pointer that will not match any of the + * pages that will be moved. */ - mapping = page_mapping(page); - if (!mapping) - goto unlock_both; + pp->page = ZERO_PAGE(0); - if (mapping->a_ops->migratepage) { - /* - * Most pages have a mapping and most filesystems - * should provide a migration function. Anonymous - * pages are part of swap space which also has its - * own migration function. This is the most common - * path for page migration. - */ - rc = mapping->a_ops->migratepage(newpage, page); - goto unlock_both; - } - - /* Make sure the dirty bit is up to date */ - if (try_to_unmap(page, 1) == SWAP_FAIL) { - rc = -EPERM; - goto unlock_both; - } + err = -EFAULT; + vma = find_vma(mm, pp->addr); + if (!vma) + goto set_status; - if (page_mapcount(page)) { - rc = -EAGAIN; - goto unlock_both; - } + page = follow_page(vma, pp->addr, FOLL_GET); + err = -ENOENT; + if (!page) + goto set_status; - /* - * Default handling if a filesystem does not provide - * a migration function. We can only migrate clean - * pages so try to write out any dirty pages first. - */ - if (PageDirty(page)) { - switch (pageout(page, mapping)) { - case PAGE_KEEP: - case PAGE_ACTIVATE: - goto unlock_both; - - case PAGE_SUCCESS: - unlock_page(newpage); - goto next; - - case PAGE_CLEAN: - ; /* try to migrate the page below */ - } - } + if (PageReserved(page)) /* Check for zero page */ + goto put_and_set; - /* - * Buffers are managed in a filesystem specific way. - * We must have no buffers or drop them. - */ - if (!page_has_buffers(page) || - try_to_release_page(page, GFP_KERNEL)) { - rc = migrate_page(newpage, page); - goto unlock_both; - } + pp->page = page; + err = page_to_nid(page); - /* - * On early passes with mapped pages simply - * retry. There may be a lock held for some - * buffers that may go away. Later - * swap them out. - */ - if (pass > 4) { + if (err == pp->node) /* - * Persistently unable to drop buffers..... As a - * measure of last resort we fall back to - * swap_page(). + * Node already in the right place */ - unlock_page(newpage); - newpage = NULL; - rc = swap_page(page); - goto next; - } + goto put_and_set; -unlock_both: - unlock_page(newpage); - -unlock_page: - unlock_page(page); - -next: - if (rc == -EAGAIN) { - retry++; - } else if (rc) { - /* Permanent failure */ - list_move(&page->lru, failed); - nr_failed++; - } else { - if (newpage) { - /* Successful migration. Return page to LRU */ - move_to_lru(newpage); - } - list_move(&page->lru, moved); - } + err = -EACCES; + if (page_mapcount(page) > 1 && + !migrate_all) + goto put_and_set; + + err = isolate_lru_page(page, &pagelist); +put_and_set: + /* + * Either remove the duplicate refcount from + * isolate_lru_page() or drop the page ref if it was + * not isolated. + */ + put_page(page); +set_status: + pp->status = err; } - if (retry && pass++ < 10) - goto redo; - if (!swapwrite) - current->flags &= ~PF_SWAPWRITE; + if (!list_empty(&pagelist)) + err = migrate_pages(&pagelist, new_page_node, + (unsigned long)pm); + else + err = -ENOENT; - return nr_failed + retry; + up_read(&mm->mmap_sem); + return err; } /* - * Migration function for pages with buffers. This function can only be used - * if the underlying filesystem guarantees that no other references to "page" - * exist. + * Determine the nodes of a list of pages. The addr in the pm array + * must have been set to the virtual address of which we want to determine + * the node number. */ -int buffer_migrate_page(struct page *newpage, struct page *page) +static int do_pages_stat(struct mm_struct *mm, struct page_to_node *pm) { - struct address_space *mapping = page->mapping; - struct buffer_head *bh, *head; - int rc; + down_read(&mm->mmap_sem); + + for ( ; pm->node != MAX_NUMNODES; pm++) { + struct vm_area_struct *vma; + struct page *page; + int err; + + err = -EFAULT; + vma = find_vma(mm, pm->addr); + if (!vma) + goto set_status; + + page = follow_page(vma, pm->addr, 0); + err = -ENOENT; + /* Use PageReserved to check for zero page */ + if (!page || PageReserved(page)) + goto set_status; + + err = page_to_nid(page); +set_status: + pm->status = err; + } - if (!mapping) - return -EAGAIN; + up_read(&mm->mmap_sem); + return 0; +} - if (!page_has_buffers(page)) - return migrate_page(newpage, page); +/* + * Move a list of pages in the address space of the currently executing + * process. + */ +asmlinkage long sys_move_pages(pid_t pid, unsigned long nr_pages, + const void __user * __user *pages, + const int __user *nodes, + int __user *status, int flags) +{ + int err = 0; + int i; + struct task_struct *task; + nodemask_t task_nodes; + struct mm_struct *mm; + struct page_to_node *pm = NULL; - head = page_buffers(page); + /* Check flags */ + if (flags & ~(MPOL_MF_MOVE|MPOL_MF_MOVE_ALL)) + return -EINVAL; - rc = migrate_page_remove_references(newpage, page, 3); + if ((flags & MPOL_MF_MOVE_ALL) && !capable(CAP_SYS_NICE)) + return -EPERM; - if (rc) - return rc; + /* Find the mm_struct */ + read_lock(&tasklist_lock); + task = pid ? find_task_by_pid(pid) : current; + if (!task) { + read_unlock(&tasklist_lock); + return -ESRCH; + } + mm = get_task_mm(task); + read_unlock(&tasklist_lock); - bh = head; - do { - get_bh(bh); - lock_buffer(bh); - bh = bh->b_this_page; + if (!mm) + return -EINVAL; - } while (bh != head); + /* + * Check if this process has the right to modify the specified + * process. The right exists if the process has administrative + * capabilities, superuser privileges or the same + * userid as the target process. + */ + if ((current->euid != task->suid) && (current->euid != task->uid) && + (current->uid != task->suid) && (current->uid != task->uid) && + !capable(CAP_SYS_NICE)) { + err = -EPERM; + goto out2; + } - ClearPagePrivate(page); - set_page_private(newpage, page_private(page)); - set_page_private(page, 0); - put_page(page); - get_page(newpage); + err = security_task_movememory(task); + if (err) + goto out2; - bh = head; - do { - set_bh_page(bh, newpage, bh_offset(bh)); - bh = bh->b_this_page; - } while (bh != head); + task_nodes = cpuset_mems_allowed(task); - SetPagePrivate(newpage); + /* Limit nr_pages so that the multiplication may not overflow */ + if (nr_pages >= ULONG_MAX / sizeof(struct page_to_node) - 1) { + err = -E2BIG; + goto out2; + } - migrate_page_copy(newpage, page); + pm = vmalloc((nr_pages + 1) * sizeof(struct page_to_node)); + if (!pm) { + err = -ENOMEM; + goto out2; + } - bh = head; - do { - unlock_buffer(bh); - put_bh(bh); - bh = bh->b_this_page; + /* + * Get parameters from user space and initialize the pm + * array. Return various errors if the user did something wrong. + */ + for (i = 0; i < nr_pages; i++) { + const void *p; - } while (bh != head); + err = -EFAULT; + if (get_user(p, pages + i)) + goto out; - return 0; -} -EXPORT_SYMBOL(buffer_migrate_page); + pm[i].addr = (unsigned long)p; + if (nodes) { + int node; -/* - * Migrate the list 'pagelist' of pages to a certain destination. - * - * Specify destination with either non-NULL vma or dest_node >= 0 - * Return the number of pages not migrated or error code - */ -int migrate_pages_to(struct list_head *pagelist, - struct vm_area_struct *vma, int dest) -{ - LIST_HEAD(newlist); - LIST_HEAD(moved); - LIST_HEAD(failed); - int err = 0; - unsigned long offset = 0; - int nr_pages; - struct page *page; - struct list_head *p; + if (get_user(node, nodes + i)) + goto out; -redo: - nr_pages = 0; - list_for_each(p, pagelist) { - if (vma) { - /* - * The address passed to alloc_page_vma is used to - * generate the proper interleave behavior. We fake - * the address here by an increasing offset in order - * to get the proper distribution of pages. - * - * No decision has been made as to which page - * a certain old page is moved to so we cannot - * specify the correct address. - */ - page = alloc_page_vma(GFP_HIGHUSER, vma, - offset + vma->vm_start); - offset += PAGE_SIZE; - } - else - page = alloc_pages_node(dest, GFP_HIGHUSER, 0); + err = -ENODEV; + if (!node_online(node)) + goto out; - if (!page) { - err = -ENOMEM; - goto out; + err = -EACCES; + if (!node_isset(node, task_nodes)) + goto out; + + pm[i].node = node; } - list_add_tail(&page->lru, &newlist); - nr_pages++; - if (nr_pages > MIGRATE_CHUNK_SIZE) - break; } - err = migrate_pages(pagelist, &newlist, &moved, &failed); + /* End marker */ + pm[nr_pages].node = MAX_NUMNODES; + + if (nodes) + err = do_move_pages(mm, pm, flags & MPOL_MF_MOVE_ALL); + else + err = do_pages_stat(mm, pm); - putback_lru_pages(&moved); /* Call release pages instead ?? */ + if (err >= 0) + /* Return status information */ + for (i = 0; i < nr_pages; i++) + if (put_user(pm[i].status, status + i)) + err = -EFAULT; - if (err >= 0 && list_empty(&newlist) && !list_empty(pagelist)) - goto redo; out: - /* Return leftover allocated pages */ - while (!list_empty(&newlist)) { - page = list_entry(newlist.next, struct page, lru); - list_del(&page->lru); - __free_page(page); - } - list_splice(&failed, pagelist); - if (err < 0) - return err; - - /* Calculate number of leftover pages */ - nr_pages = 0; - list_for_each(p, pagelist) - nr_pages++; - return nr_pages; + vfree(pm); +out2: + mmput(mm); + return err; +} +#endif + +/* + * Call migration functions in the vma_ops that may prepare + * memory in a vm for migration. migration functions may perform + * the migration for vmas that do not have an underlying page struct. + */ +int migrate_vmas(struct mm_struct *mm, const nodemask_t *to, + const nodemask_t *from, unsigned long flags) +{ + struct vm_area_struct *vma; + int err = 0; + + for(vma = mm->mmap; vma->vm_next && !err; vma = vma->vm_next) { + if (vma->vm_ops && vma->vm_ops->migrate) { + err = vma->vm_ops->migrate(vma, to, from, flags); + if (err) + break; + } + } + return err; } diff --git a/mm/mmap.c b/mm/mmap.c index f6940d1b3..5d92d30c2 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -31,6 +31,10 @@ #include #include +#ifndef arch_mmap_check +#define arch_mmap_check(addr, len, flags) (0) +#endif + static void unmap_region(struct mm_struct *mm, struct vm_area_struct *vma, struct vm_area_struct *prev, unsigned long start, unsigned long end); @@ -61,6 +65,13 @@ pgprot_t protection_map[16] = { __S000, __S001, __S010, __S011, __S100, __S101, __S110, __S111 }; +pgprot_t vm_get_page_prot(unsigned long vm_flags) +{ + return protection_map[vm_flags & + (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)]; +} +EXPORT_SYMBOL(vm_get_page_prot); + int sysctl_overcommit_memory = OVERCOMMIT_GUESS; /* heuristic overcommit */ int sysctl_overcommit_ratio = 50; /* default is 50% */ int sysctl_max_map_count __read_mostly = DEFAULT_MAX_MAP_COUNT; @@ -97,7 +108,7 @@ int __vm_enough_memory(long pages, int cap_sys_admin) if (sysctl_overcommit_memory == OVERCOMMIT_GUESS) { unsigned long n; - free = get_page_cache_size(); + free = global_page_state(NR_FILE_PAGES); free += nr_swap_pages; /* @@ -1076,7 +1087,8 @@ munmap_back: vma->vm_start = addr; vma->vm_end = addr + len; vma->vm_flags = vm_flags; - vma->vm_page_prot = protection_map[vm_flags & 0x0f]; + vma->vm_page_prot = protection_map[vm_flags & + (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)]; vma->vm_pgoff = pgoff; if (file) { @@ -1117,6 +1129,10 @@ munmap_back: pgoff = vma->vm_pgoff; vm_flags = vma->vm_flags; + if (vma_wants_writenotify(vma)) + vma->vm_page_prot = + protection_map[vm_flags & (VM_READ|VM_WRITE|VM_EXEC)]; + if (!file || !vma_merge(mm, prev, addr, vma->vm_end, vma->vm_flags, NULL, file, pgoff, vma_policy(vma))) { file = vma->vm_file; @@ -1392,7 +1408,7 @@ get_unmapped_area_prot(struct file *file, unsigned long addr, unsigned long len, EXPORT_SYMBOL(get_unmapped_area_prot); -#define SHLIB_BASE 0x00111000 +#define SHLIB_BASE 0x00110000 unsigned long arch_get_unmapped_exec_area(struct file *filp, unsigned long addr0, unsigned long len0, unsigned long pgoff, unsigned long flags) @@ -2021,7 +2037,8 @@ unsigned long do_brk(unsigned long addr, unsigned long len) vma->vm_end = addr + len; vma->vm_pgoff = pgoff; vma->vm_flags = flags; - vma->vm_page_prot = protection_map[flags & 0x0f]; + vma->vm_page_prot = protection_map[flags & + (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)]; vma_link(mm, vma, prev, rb_link, rb_parent); out: vx_vmpages_add(mm, len >> PAGE_SHIFT); @@ -2238,7 +2255,7 @@ int install_special_mapping(struct mm_struct *mm, vma->vm_private_data = pages; insert_vm_struct(mm, vma); - mm->total_vm += len >> PAGE_SHIFT; + vx_vmpages_add(mm, len >> PAGE_SHIFT); if (!vdso_populate) return 0; diff --git a/mm/mmzone.c b/mm/mmzone.c index b022370e6..febea1c98 100644 --- a/mm/mmzone.c +++ b/mm/mmzone.c @@ -5,7 +5,6 @@ */ -#include #include #include #include @@ -15,7 +14,7 @@ struct pglist_data *first_online_pgdat(void) return NODE_DATA(first_online_node); } -EXPORT_SYMBOL(first_online_pgdat); +EXPORT_UNUSED_SYMBOL(first_online_pgdat); /* June 2006 */ struct pglist_data *next_online_pgdat(struct pglist_data *pgdat) { @@ -25,7 +24,7 @@ struct pglist_data *next_online_pgdat(struct pglist_data *pgdat) return NULL; return NODE_DATA(nid); } -EXPORT_SYMBOL(next_online_pgdat); +EXPORT_UNUSED_SYMBOL(next_online_pgdat); /* June 2006 */ /* @@ -46,5 +45,5 @@ struct zone *next_zone(struct zone *zone) } return zone; } -EXPORT_SYMBOL(next_zone); +EXPORT_UNUSED_SYMBOL(next_zone); /* June 2006 */ diff --git a/mm/mprotect.c b/mm/mprotect.c index 05dc34246..f23231f7e 100644 --- a/mm/mprotect.c +++ b/mm/mprotect.c @@ -19,7 +19,8 @@ #include #include #include - +#include +#include #include #include #include @@ -27,30 +28,55 @@ #include static void change_pte_range(struct mm_struct *mm, pmd_t *pmd, - unsigned long addr, unsigned long end, pgprot_t newprot) + unsigned long addr, unsigned long end, pgprot_t newprot, + int dirty_accountable) { - pte_t *pte; + pte_t *pte, oldpte; spinlock_t *ptl; pte = pte_offset_map_lock(mm, pmd, addr, &ptl); do { - if (pte_present(*pte)) { + oldpte = *pte; + if (pte_present(oldpte)) { pte_t ptent; /* Avoid an SMP race with hardware updated dirty/clean * bits by wiping the pte and then setting the new pte * into place. */ - ptent = pte_modify(ptep_get_and_clear(mm, addr, pte), newprot); + ptent = ptep_get_and_clear(mm, addr, pte); + ptent = pte_modify(ptent, newprot); + /* + * Avoid taking write faults for pages we know to be + * dirty. + */ + if (dirty_accountable && pte_dirty(ptent)) + ptent = pte_mkwrite(ptent); set_pte_at(mm, addr, pte, ptent); lazy_mmu_prot_update(ptent); +#ifdef CONFIG_MIGRATION + } else if (!pte_file(oldpte)) { + swp_entry_t entry = pte_to_swp_entry(oldpte); + + if (is_write_migration_entry(entry)) { + /* + * A protection check is difficult so + * just be safe and disable write + */ + make_migration_entry_read(&entry); + set_pte_at(mm, addr, pte, + swp_entry_to_pte(entry)); + } +#endif } + } while (pte++, addr += PAGE_SIZE, addr != end); pte_unmap_unlock(pte - 1, ptl); } static inline void change_pmd_range(struct mm_struct *mm, pud_t *pud, - unsigned long addr, unsigned long end, pgprot_t newprot) + unsigned long addr, unsigned long end, pgprot_t newprot, + int dirty_accountable) { pmd_t *pmd; unsigned long next; @@ -60,12 +86,13 @@ static inline void change_pmd_range(struct mm_struct *mm, pud_t *pud, next = pmd_addr_end(addr, end); if (pmd_none_or_clear_bad(pmd)) continue; - change_pte_range(mm, pmd, addr, next, newprot); + change_pte_range(mm, pmd, addr, next, newprot, dirty_accountable); } while (pmd++, addr = next, addr != end); } static inline void change_pud_range(struct mm_struct *mm, pgd_t *pgd, - unsigned long addr, unsigned long end, pgprot_t newprot) + unsigned long addr, unsigned long end, pgprot_t newprot, + int dirty_accountable) { pud_t *pud; unsigned long next; @@ -75,12 +102,13 @@ static inline void change_pud_range(struct mm_struct *mm, pgd_t *pgd, next = pud_addr_end(addr, end); if (pud_none_or_clear_bad(pud)) continue; - change_pmd_range(mm, pud, addr, next, newprot); + change_pmd_range(mm, pud, addr, next, newprot, dirty_accountable); } while (pud++, addr = next, addr != end); } static void change_protection(struct vm_area_struct *vma, - unsigned long addr, unsigned long end, pgprot_t newprot) + unsigned long addr, unsigned long end, pgprot_t newprot, + int dirty_accountable) { struct mm_struct *mm = vma->vm_mm; pgd_t *pgd; @@ -94,7 +122,7 @@ static void change_protection(struct vm_area_struct *vma, next = pgd_addr_end(addr, end); if (pgd_none_or_clear_bad(pgd)) continue; - change_pud_range(mm, pgd, addr, next, newprot); + change_pud_range(mm, pgd, addr, next, newprot, dirty_accountable); } while (pgd++, addr = next, addr != end); flush_tlb_range(vma, start, end); } @@ -107,9 +135,9 @@ mprotect_fixup(struct vm_area_struct *vma, struct vm_area_struct **pprev, unsigned long oldflags = vma->vm_flags; long nrpages = (end - start) >> PAGE_SHIFT; unsigned long charged = 0, old_end = vma->vm_end; - pgprot_t newprot; pgoff_t pgoff; int error; + int dirty_accountable = 0; if (newflags == oldflags) { *pprev = vma; @@ -133,8 +161,6 @@ mprotect_fixup(struct vm_area_struct *vma, struct vm_area_struct **pprev, } } - newprot = protection_map[newflags & 0xf]; - /* * First try to merge with previous and/or next vma. */ @@ -166,13 +192,20 @@ success: * held in write mode. */ vma->vm_flags = newflags; - vma->vm_page_prot = newprot; if (oldflags & VM_EXEC) arch_remove_exec_range(current->mm, old_end); + vma->vm_page_prot = protection_map[newflags & + (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)]; + if (vma_wants_writenotify(vma)) { + vma->vm_page_prot = protection_map[newflags & + (VM_READ|VM_WRITE|VM_EXEC)]; + dirty_accountable = 1; + } + if (is_vm_hugetlb_page(vma)) - hugetlb_change_protection(vma, start, end, newprot); + hugetlb_change_protection(vma, start, end, vma->vm_page_prot); else - change_protection(vma, start, end, newprot); + change_protection(vma, start, end, vma->vm_page_prot, dirty_accountable); vm_stat_account(mm, oldflags, vma->vm_file, -nrpages); vm_stat_account(mm, newflags, vma->vm_file, nrpages); return 0; @@ -208,8 +241,7 @@ sys_mprotect(unsigned long start, size_t len, unsigned long prot) /* * Does the application expect PROT_READ to imply PROT_EXEC: */ - if (unlikely((prot & PROT_READ) && - (current->personality & READ_IMPLIES_EXEC))) + if ((prot & PROT_READ) && (current->personality & READ_IMPLIES_EXEC)) prot |= PROT_EXEC; vm_flags = calc_vm_prot_bits(prot); diff --git a/mm/mremap.c b/mm/mremap.c index c6b8da25e..989af55dd 100644 --- a/mm/mremap.c +++ b/mm/mremap.c @@ -98,7 +98,7 @@ static void move_ptes(struct vm_area_struct *vma, pmd_t *old_pmd, new_pte = pte_offset_map_nested(new_pmd, new_addr); new_ptl = pte_lockptr(mm, new_pmd); if (new_ptl != old_ptl) - spin_lock(new_ptl); + spin_lock_nested(new_ptl, SINGLE_DEPTH_NESTING); for (; old_addr < old_end; old_pte++, old_addr += PAGE_SIZE, new_pte++, new_addr += PAGE_SIZE) { diff --git a/mm/msync.c b/mm/msync.c index bc6c95376..358d73cf7 100644 --- a/mm/msync.c +++ b/mm/msync.c @@ -7,149 +7,33 @@ /* * The msync() system call. */ -#include -#include #include #include #include -#include -#include #include #include -#include -#include - -static unsigned long msync_pte_range(struct vm_area_struct *vma, pmd_t *pmd, - unsigned long addr, unsigned long end) -{ - pte_t *pte; - spinlock_t *ptl; - int progress = 0; - unsigned long ret = 0; - -again: - pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl); - do { - struct page *page; - - if (progress >= 64) { - progress = 0; - if (need_resched() || need_lockbreak(ptl)) - break; - } - progress++; - if (!pte_present(*pte)) - continue; - if (!pte_maybe_dirty(*pte)) - continue; - page = vm_normal_page(vma, addr, *pte); - if (!page) - continue; - if (ptep_clear_flush_dirty(vma, addr, pte) || - page_test_and_clear_dirty(page)) - ret += set_page_dirty(page); - progress += 3; - } while (pte++, addr += PAGE_SIZE, addr != end); - pte_unmap_unlock(pte - 1, ptl); - cond_resched(); - if (addr != end) - goto again; - return ret; -} - -static inline unsigned long msync_pmd_range(struct vm_area_struct *vma, - pud_t *pud, unsigned long addr, unsigned long end) -{ - pmd_t *pmd; - unsigned long next; - unsigned long ret = 0; - - pmd = pmd_offset(pud, addr); - do { - next = pmd_addr_end(addr, end); - if (pmd_none_or_clear_bad(pmd)) - continue; - ret += msync_pte_range(vma, pmd, addr, next); - } while (pmd++, addr = next, addr != end); - return ret; -} - -static inline unsigned long msync_pud_range(struct vm_area_struct *vma, - pgd_t *pgd, unsigned long addr, unsigned long end) -{ - pud_t *pud; - unsigned long next; - unsigned long ret = 0; - - pud = pud_offset(pgd, addr); - do { - next = pud_addr_end(addr, end); - if (pud_none_or_clear_bad(pud)) - continue; - ret += msync_pmd_range(vma, pud, addr, next); - } while (pud++, addr = next, addr != end); - return ret; -} - -static unsigned long msync_page_range(struct vm_area_struct *vma, - unsigned long addr, unsigned long end) -{ - pgd_t *pgd; - unsigned long next; - unsigned long ret = 0; - - /* 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(). - */ - if (vma->vm_flags & VM_HUGETLB) - return 0; - - BUG_ON(addr >= end); - pgd = pgd_offset(vma->vm_mm, addr); - flush_cache_range(vma, addr, end); - do { - next = pgd_addr_end(addr, end); - if (pgd_none_or_clear_bad(pgd)) - continue; - ret += msync_pud_range(vma, pgd, addr, next); - } while (pgd++, addr = next, addr != end); - return ret; -} - /* * MS_SYNC syncs the entire file - including mappings. * - * MS_ASYNC does not start I/O (it used to, up to 2.5.67). Instead, it just - * marks the relevant pages dirty. The application may now run fsync() to + * MS_ASYNC does not start I/O (it used to, up to 2.5.67). + * Nor does it marks the relevant pages dirty (it used to up to 2.6.17). + * Now it doesn't do anything, since dirty pages are properly tracked. + * + * The application may now run fsync() to * write out the dirty pages and wait on the writeout and check the result. * Or the application may run fadvise(FADV_DONTNEED) against the fd to start * async writeout immediately. * So by _not_ starting I/O in MS_ASYNC we provide complete flexibility to * applications. */ -static int msync_interval(struct vm_area_struct *vma, unsigned long addr, - unsigned long end, int flags, - unsigned long *nr_pages_dirtied) -{ - struct file *file = vma->vm_file; - - if ((flags & MS_INVALIDATE) && (vma->vm_flags & VM_LOCKED)) - return -EBUSY; - - if (file && (vma->vm_flags & VM_SHARED)) - *nr_pages_dirtied = msync_page_range(vma, addr, end); - return 0; -} - asmlinkage long sys_msync(unsigned long start, size_t len, int flags) { unsigned long end; + struct mm_struct *mm = current->mm; struct vm_area_struct *vma; int unmapped_error = 0; int error = -EINVAL; - int done = 0; if (flags & ~(MS_ASYNC | MS_INVALIDATE | MS_SYNC)) goto out; @@ -169,67 +53,50 @@ asmlinkage long sys_msync(unsigned long start, size_t len, int flags) * If the interval [start,end) covers some unmapped address ranges, * just ignore them, but return -ENOMEM at the end. */ - down_read(¤t->mm->mmap_sem); - if (flags & MS_SYNC) - current->flags |= PF_SYNCWRITE; - vma = find_vma(current->mm, start); - if (!vma) { - error = -ENOMEM; - goto out_unlock; - } - do { - unsigned long nr_pages_dirtied = 0; + down_read(&mm->mmap_sem); + vma = find_vma(mm, start); + for (;;) { struct file *file; + /* Still start < end. */ + error = -ENOMEM; + if (!vma) + goto out_unlock; /* Here start < vma->vm_end. */ if (start < vma->vm_start) { - unmapped_error = -ENOMEM; start = vma->vm_start; + if (start >= end) + goto out_unlock; + unmapped_error = -ENOMEM; } /* Here vma->vm_start <= start < vma->vm_end. */ - if (end <= vma->vm_end) { - if (start < end) { - error = msync_interval(vma, start, end, flags, - &nr_pages_dirtied); - if (error) - goto out_unlock; - } - error = unmapped_error; - done = 1; - } else { - /* Here vma->vm_start <= start < vma->vm_end < end. */ - error = msync_interval(vma, start, vma->vm_end, flags, - &nr_pages_dirtied); - if (error) - goto out_unlock; + if ((flags & MS_INVALIDATE) && + (vma->vm_flags & VM_LOCKED)) { + error = -EBUSY; + goto out_unlock; } file = vma->vm_file; start = vma->vm_end; - if ((flags & MS_ASYNC) && file && nr_pages_dirtied) { - get_file(file); - up_read(¤t->mm->mmap_sem); - balance_dirty_pages_ratelimited_nr(file->f_mapping, - nr_pages_dirtied); - fput(file); - down_read(¤t->mm->mmap_sem); - vma = find_vma(current->mm, start); - } else if ((flags & MS_SYNC) && file && + if ((flags & MS_SYNC) && file && (vma->vm_flags & VM_SHARED)) { get_file(file); - up_read(¤t->mm->mmap_sem); + up_read(&mm->mmap_sem); error = do_fsync(file, 0); fput(file); - down_read(¤t->mm->mmap_sem); - if (error) - goto out_unlock; - vma = find_vma(current->mm, start); + if (error || start >= end) + goto out; + down_read(&mm->mmap_sem); + vma = find_vma(mm, start); } else { + if (start >= end) { + error = 0; + goto out_unlock; + } vma = vma->vm_next; } - } while (vma && !done); + } out_unlock: - current->flags &= ~PF_SYNCWRITE; - up_read(¤t->mm->mmap_sem); + up_read(&mm->mmap_sem); out: - return error; + return error ? : unmapped_error; } diff --git a/mm/nommu.c b/mm/nommu.c index 1a8051ef7..2fff336a2 100644 --- a/mm/nommu.c +++ b/mm/nommu.c @@ -1070,6 +1070,7 @@ int remap_pfn_range(struct vm_area_struct *vma, unsigned long from, vma->vm_start = vma->vm_pgoff << PAGE_SHIFT; return 0; } +EXPORT_SYMBOL(remap_pfn_range); void swap_unplug_io_fn(struct backing_dev_info *bdi, struct page *page) { @@ -1090,6 +1091,7 @@ void unmap_mapping_range(struct address_space *mapping, int even_cows) { } +EXPORT_SYMBOL(unmap_mapping_range); /* * Check that a process has enough memory to allocate a new virtual @@ -1122,7 +1124,7 @@ int __vm_enough_memory(long pages, int cap_sys_admin) if (sysctl_overcommit_memory == OVERCOMMIT_GUESS) { unsigned long n; - free = get_page_cache_size(); + free = global_page_state(NR_FILE_PAGES); free += nr_swap_pages; /* diff --git a/mm/oom_kill.c b/mm/oom_kill.c index a9cfca26d..659ec7829 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -23,10 +23,11 @@ #include #include +int sysctl_panic_on_oom; /* #define DEBUG */ /** - * oom_badness - calculate a numeric value for how bad this task has been + * badness - calculate a numeric value for how bad this task has been * @p: task struct of which task we should calculate * @uptime: current uptime in seconds * @@ -57,6 +58,12 @@ unsigned long badness(struct task_struct *p, unsigned long uptime) return 0; } + /* + * swapoff can easily use up all memory, so kill those first. + */ + if (p->flags & PF_SWAPOFF) + return ULONG_MAX; + /* * The memory size of the process is the basis for the badness. */ @@ -128,6 +135,14 @@ unsigned long badness(struct task_struct *p, unsigned long uptime) if (cap_t(p->cap_effective) & CAP_TO_MASK(CAP_SYS_RAWIO)) points /= 4; + /* + * If p's nodes don't overlap ours, it may still help to kill p + * because p may have allocated or otherwise mapped memory on + * this node before. However it will be less likely. + */ + if (!cpuset_excl_nodes_overlap(p)) + points /= 8; + /* * Adjust the score by oomkilladj. */ @@ -198,25 +213,38 @@ static struct task_struct *select_bad_process(unsigned long *ppoints) unsigned long points; int releasing; + /* skip kernel threads */ + if (!p->mm) + continue; + /* skip the init task with pid == 1 */ if (p->pid == 1) continue; - if (p->oomkilladj == OOM_DISABLE) - continue; - /* If p's nodes don't overlap ours, it won't help to kill p. */ - if (!cpuset_excl_nodes_overlap(p)) - continue; - /* - * This is in the process of releasing memory so for wait it + * This is in the process of releasing memory so wait for it * to finish before killing some other task by mistake. + * + * However, if p is the current task, we allow the 'kill' to + * go ahead if it is exiting: this will simply set TIF_MEMDIE, + * which will allow it to gain access to memory reserves in + * the process of exiting and releasing its resources. + * Otherwise we could get an OOM deadlock. */ releasing = test_tsk_thread_flag(p, TIF_MEMDIE) || p->flags & PF_EXITING; - if (releasing && !(p->flags & PF_DEAD)) + if (releasing) { + /* PF_DEAD tasks have already released their mm */ + if (p->flags & PF_DEAD) + continue; + if (p->flags & PF_EXITING && p == current) { + chosen = p; + *ppoints = ULONG_MAX; + break; + } return ERR_PTR(-1UL); - if (p->flags & PF_SWAPOFF) - return p; + } + if (p->oomkilladj == OOM_DISABLE) + continue; points = badness(p, uptime.tv_sec); if (points > *ppoints || !chosen) { @@ -232,7 +260,7 @@ static struct task_struct *select_bad_process(unsigned long *ppoints) * CAP_SYS_RAW_IO set, send SIGTERM instead (but it's unlikely that * we select a process with CAP_SYS_RAW_IO set). */ -static void __oom_kill_task(task_t *p, const char *message) +static void __oom_kill_task(struct task_struct *p, const char *message) { if (p->pid == 1) { WARN_ON(1); @@ -248,7 +276,8 @@ static void __oom_kill_task(task_t *p, const char *message) return; } task_unlock(p); - printk(KERN_ERR "%s: Killed process %d (%s).\n", + if (message) + printk(KERN_ERR "%s: Killed process %d (%s).\n", message, p->pid, p->comm); /* @@ -262,10 +291,10 @@ static void __oom_kill_task(task_t *p, const char *message) force_sig(SIGKILL, p); } -static int oom_kill_task(task_t *p, const char *message) +static int oom_kill_task(struct task_struct *p, const char *message) { struct mm_struct *mm; - task_t * g, * q; + struct task_struct *g, *q; mm = p->mm; @@ -300,8 +329,15 @@ static int oom_kill_process(struct task_struct *p, unsigned long points, struct task_struct *c; struct list_head *tsk; - printk(KERN_ERR "Out of Memory: Kill process %d (%s) score %li and " - "children.\n", p->pid, p->comm, points); + /* + * If the task is already exiting, don't alarm the sysadmin or kill + * its children or threads, just set TIF_MEMDIE so it can die quickly + */ + if (p->flags & PF_EXITING) { + __oom_kill_task(p, NULL); + return 0; + } + /* Try to kill a child first */ list_for_each(tsk, &p->children) { c = list_entry(tsk, struct task_struct, sibling); @@ -313,8 +349,71 @@ static int oom_kill_process(struct task_struct *p, unsigned long points, return oom_kill_task(p, message); } +int should_oom_kill(void) +{ + static spinlock_t oom_lock = SPIN_LOCK_UNLOCKED; + static unsigned long first, last, count, lastkill; + unsigned long now, since; + int ret = 0; + + spin_lock(&oom_lock); + now = jiffies; + since = now - last; + last = now; + + /* + * If it's been a long time since last failure, + * we're not oom. + */ + if (since > 5*HZ) + goto reset; + + /* + * If we haven't tried for at least one second, + * we're not really oom. + */ + since = now - first; + if (since < HZ) + goto out_unlock; + + /* + * If we have gotten only a few failures, + * we're not really oom. + */ + if (++count < 10) + goto out_unlock; + + /* + * If we just killed a process, wait a while + * to give that task a chance to exit. This + * avoids killing multiple processes needlessly. + */ + since = now - lastkill; + if (since < HZ*5) + goto out_unlock; + + /* + * Ok, really out of memory. Kill something. + */ + lastkill = now; + ret = 1; + +reset: +/* + * We dropped the lock above, so check to be sure the variable + * first only ever increases to prevent false OOM's. + */ + if (time_after(now, first)) + first = now; + count = 0; + +out_unlock: + spin_unlock(&oom_lock); + return ret; +} + /** - * oom_kill - kill the "best" process when we run out of memory + * out_of_memory - kill the "best" process when we run out of memory * * If we run out of memory, we have the choice between either * killing a random task (bad), letting the system crash (worse) @@ -323,16 +422,20 @@ static int oom_kill_process(struct task_struct *p, unsigned long points, */ void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, int order) { - task_t *p; + struct task_struct *p; unsigned long points = 0; if (printk_ratelimit()) { - printk("oom-killer: gfp_mask=0x%x, order=%d\n", - gfp_mask, order); + printk(KERN_WARNING "%s invoked oom-killer: " + "gfp_mask=0x%x, order=%d, oomkilladj=%d\n", + current->comm, gfp_mask, order, current->oomkilladj); dump_stack(); show_mem(); } + if (!should_oom_kill()) + return; + cpuset_lock(); read_lock(&tasklist_lock); @@ -352,6 +455,8 @@ void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, int order) break; case CONSTRAINT_NONE: + if (sysctl_panic_on_oom) + panic("out of memory. panic_on_oom is selected\n"); retry: /* * Rambo mode: Shoot down a process and hope it solves whatever diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 75d7f48b7..d42361aa0 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -29,6 +29,7 @@ #include #include #include +#include /* * The maximum number of pages to writeout in a single bdflush/kupdate @@ -99,22 +100,6 @@ EXPORT_SYMBOL(laptop_mode); static void background_writeout(unsigned long _min_pages); -struct writeback_state -{ - unsigned long nr_dirty; - unsigned long nr_unstable; - unsigned long nr_mapped; - unsigned long nr_writeback; -}; - -static void get_writeback_state(struct writeback_state *wbs) -{ - wbs->nr_dirty = read_page_state(nr_dirty); - wbs->nr_unstable = read_page_state(nr_unstable); - wbs->nr_mapped = read_page_state(nr_mapped); - wbs->nr_writeback = read_page_state(nr_writeback); -} - /* * Work out the current dirty-memory clamping and background writeout * thresholds. @@ -133,8 +118,8 @@ static void get_writeback_state(struct writeback_state *wbs) * clamping level. */ static void -get_dirty_limits(struct writeback_state *wbs, long *pbackground, long *pdirty, - struct address_space *mapping) +get_dirty_limits(long *pbackground, long *pdirty, + struct address_space *mapping) { int background_ratio; /* Percentages */ int dirty_ratio; @@ -144,8 +129,6 @@ get_dirty_limits(struct writeback_state *wbs, long *pbackground, long *pdirty, unsigned long available_memory = total_pages; struct task_struct *tsk; - get_writeback_state(wbs); - #ifdef CONFIG_HIGHMEM /* * If this mapping can only allocate from low memory, @@ -156,7 +139,9 @@ get_dirty_limits(struct writeback_state *wbs, long *pbackground, long *pdirty, #endif - unmapped_ratio = 100 - (wbs->nr_mapped * 100) / total_pages; + unmapped_ratio = 100 - ((global_page_state(NR_FILE_MAPPED) + + global_page_state(NR_ANON_PAGES)) * 100) / + total_pages; dirty_ratio = vm_dirty_ratio; if (dirty_ratio > unmapped_ratio / 2) @@ -189,7 +174,6 @@ get_dirty_limits(struct writeback_state *wbs, long *pbackground, long *pdirty, */ static void balance_dirty_pages(struct address_space *mapping) { - struct writeback_state wbs; long nr_reclaimable; long background_thresh; long dirty_thresh; @@ -204,13 +188,15 @@ static void balance_dirty_pages(struct address_space *mapping) .sync_mode = WB_SYNC_NONE, .older_than_this = NULL, .nr_to_write = write_chunk, + .range_cyclic = 1, }; - get_dirty_limits(&wbs, &background_thresh, - &dirty_thresh, mapping); - nr_reclaimable = wbs.nr_dirty + wbs.nr_unstable; - if (nr_reclaimable + wbs.nr_writeback <= dirty_thresh) - break; + get_dirty_limits(&background_thresh, &dirty_thresh, mapping); + nr_reclaimable = global_page_state(NR_FILE_DIRTY) + + global_page_state(NR_UNSTABLE_NFS); + if (nr_reclaimable + global_page_state(NR_WRITEBACK) <= + dirty_thresh) + break; if (!dirty_exceeded) dirty_exceeded = 1; @@ -223,11 +209,14 @@ static void balance_dirty_pages(struct address_space *mapping) */ if (nr_reclaimable) { writeback_inodes(&wbc); - get_dirty_limits(&wbs, &background_thresh, - &dirty_thresh, mapping); - nr_reclaimable = wbs.nr_dirty + wbs.nr_unstable; - if (nr_reclaimable + wbs.nr_writeback <= dirty_thresh) - break; + get_dirty_limits(&background_thresh, + &dirty_thresh, mapping); + nr_reclaimable = global_page_state(NR_FILE_DIRTY) + + global_page_state(NR_UNSTABLE_NFS); + if (nr_reclaimable + + global_page_state(NR_WRITEBACK) + <= dirty_thresh) + break; pages_written += write_chunk - wbc.nr_to_write; if (pages_written >= write_chunk) break; /* We've done our duty */ @@ -235,8 +224,9 @@ static void balance_dirty_pages(struct address_space *mapping) blk_congestion_wait(WRITE, HZ/10); } - if (nr_reclaimable + wbs.nr_writeback <= dirty_thresh && dirty_exceeded) - dirty_exceeded = 0; + if (nr_reclaimable + global_page_state(NR_WRITEBACK) + <= dirty_thresh && dirty_exceeded) + dirty_exceeded = 0; if (writeback_in_progress(bdi)) return; /* pdflush is already working this queue */ @@ -254,6 +244,16 @@ static void balance_dirty_pages(struct address_space *mapping) pdflush_operation(background_writeout, 0); } +void set_page_dirty_balance(struct page *page) +{ + if (set_page_dirty(page)) { + struct address_space *mapping = page_mapping(page); + + if (mapping) + balance_dirty_pages_ratelimited(mapping); + } +} + /** * balance_dirty_pages_ratelimited_nr - balance dirty memory state * @mapping: address_space which was dirtied @@ -298,12 +298,11 @@ EXPORT_SYMBOL(balance_dirty_pages_ratelimited_nr); void throttle_vm_writeout(void) { - struct writeback_state wbs; long background_thresh; long dirty_thresh; for ( ; ; ) { - get_dirty_limits(&wbs, &background_thresh, &dirty_thresh, NULL); + get_dirty_limits(&background_thresh, &dirty_thresh, NULL); /* * Boost the allowable dirty threshold a bit for page @@ -311,8 +310,9 @@ void throttle_vm_writeout(void) */ dirty_thresh += dirty_thresh / 10; /* wheeee... */ - if (wbs.nr_unstable + wbs.nr_writeback <= dirty_thresh) - break; + if (global_page_state(NR_UNSTABLE_NFS) + + global_page_state(NR_WRITEBACK) <= dirty_thresh) + break; blk_congestion_wait(WRITE, HZ/10); } } @@ -331,15 +331,16 @@ static void background_writeout(unsigned long _min_pages) .older_than_this = NULL, .nr_to_write = 0, .nonblocking = 1, + .range_cyclic = 1, }; for ( ; ; ) { - struct writeback_state wbs; long background_thresh; long dirty_thresh; - get_dirty_limits(&wbs, &background_thresh, &dirty_thresh, NULL); - if (wbs.nr_dirty + wbs.nr_unstable < background_thresh + get_dirty_limits(&background_thresh, &dirty_thresh, NULL); + if (global_page_state(NR_FILE_DIRTY) + + global_page_state(NR_UNSTABLE_NFS) < background_thresh && min_pages <= 0) break; wbc.encountered_congestion = 0; @@ -363,12 +364,9 @@ static void background_writeout(unsigned long _min_pages) */ int wakeup_pdflush(long nr_pages) { - if (nr_pages == 0) { - struct writeback_state wbs; - - get_writeback_state(&wbs); - nr_pages = wbs.nr_dirty + wbs.nr_unstable; - } + if (nr_pages == 0) + nr_pages = global_page_state(NR_FILE_DIRTY) + + global_page_state(NR_UNSTABLE_NFS); return pdflush_operation(background_writeout, nr_pages); } @@ -399,7 +397,6 @@ static void wb_kupdate(unsigned long arg) unsigned long start_jif; unsigned long next_jif; long nr_to_write; - struct writeback_state wbs; struct writeback_control wbc = { .bdi = NULL, .sync_mode = WB_SYNC_NONE, @@ -407,15 +404,16 @@ static void wb_kupdate(unsigned long arg) .nr_to_write = 0, .nonblocking = 1, .for_kupdate = 1, + .range_cyclic = 1, }; sync_supers(); - get_writeback_state(&wbs); oldest_jif = jiffies - dirty_expire_interval; start_jif = jiffies; next_jif = start_jif + dirty_writeback_interval; - nr_to_write = wbs.nr_dirty + wbs.nr_unstable + + nr_to_write = global_page_state(NR_FILE_DIRTY) + + global_page_state(NR_UNSTABLE_NFS) + (inodes_stat.nr_inodes - inodes_stat.nr_unused); while (nr_to_write > 0) { wbc.encountered_congestion = 0; @@ -513,14 +511,14 @@ static void set_ratelimit(void) ratelimit_pages = (4096 * 1024) / PAGE_CACHE_SIZE; } -static int +static int __cpuinit ratelimit_handler(struct notifier_block *self, unsigned long u, void *v) { set_ratelimit(); return 0; } -static struct notifier_block ratelimit_nb = { +static struct notifier_block __cpuinitdata ratelimit_nb = { .notifier_call = ratelimit_handler, .next = NULL, }; @@ -563,7 +561,7 @@ int do_writepages(struct address_space *mapping, struct writeback_control *wbc) return 0; wbc->for_writepages = 1; if (mapping->a_ops->writepages) - ret = mapping->a_ops->writepages(mapping, wbc); + ret = mapping->a_ops->writepages(mapping, wbc); else ret = generic_writepages(mapping, wbc); wbc->for_writepages = 0; @@ -637,7 +635,8 @@ int __set_page_dirty_nobuffers(struct page *page) if (mapping2) { /* Race with truncate? */ BUG_ON(mapping2 != mapping); if (mapping_cap_account_dirty(mapping)) - inc_page_state(nr_dirty); + __inc_zone_page_state(page, + NR_FILE_DIRTY); radix_tree_tag_set(&mapping->page_tree, page_index(page), PAGECACHE_TAG_DIRTY); } @@ -718,6 +717,7 @@ int test_clear_page_dirty(struct page *page) struct address_space *mapping = page_mapping(page); unsigned long flags; + WARN_ON_ONCE(!PageLocked(page)); if (mapping) { write_lock_irqsave(&mapping->tree_lock, flags); if (TestClearPageDirty(page)) { @@ -725,8 +725,14 @@ int test_clear_page_dirty(struct page *page) page_index(page), PAGECACHE_TAG_DIRTY); write_unlock_irqrestore(&mapping->tree_lock, flags); - if (mapping_cap_account_dirty(mapping)) - dec_page_state(nr_dirty); + /* + * We can continue to use `mapping' here because the + * page is locked, which pins the address_space + */ + if (mapping_cap_account_dirty(mapping)) { + page_mkclean(page); + dec_zone_page_state(page, NR_FILE_DIRTY); + } return 1; } write_unlock_irqrestore(&mapping->tree_lock, flags); @@ -754,10 +760,13 @@ int clear_page_dirty_for_io(struct page *page) { struct address_space *mapping = page_mapping(page); + WARN_ON_ONCE(!PageLocked(page)); if (mapping) { if (TestClearPageDirty(page)) { - if (mapping_cap_account_dirty(mapping)) - dec_page_state(nr_dirty); + if (mapping_cap_account_dirty(mapping)) { + page_mkclean(page); + dec_zone_page_state(page, NR_FILE_DIRTY); + } return 1; } return 0; diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 5581dd1a4..4cd6faf93 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -14,7 +14,6 @@ * (lots of bits borrowed from Ingo Molnar & Andrew Morton) */ -#include #include #include #include @@ -37,6 +36,7 @@ #include #include #include +#include #include #include @@ -84,8 +84,8 @@ EXPORT_SYMBOL(zone_table); static char *zone_names[MAX_NR_ZONES] = { "DMA", "DMA32", "Normal", "HighMem" }; int min_free_kbytes = 1024; -unsigned long __initdata nr_kernel_pages; -unsigned long __initdata nr_all_pages; +unsigned long __meminitdata nr_kernel_pages; +unsigned long __meminitdata nr_all_pages; #ifdef CONFIG_DEBUG_VM static int page_outside_zone_boundaries(struct zone *zone, struct page *page) @@ -266,7 +266,7 @@ static inline void rmv_page_order(struct page *page) * satisfies the following equation: * P = B & ~(1 << O) * - * Assumption: *_mem_map is contigious at least up to MAX_ORDER + * Assumption: *_mem_map is contiguous at least up to MAX_ORDER */ static inline struct page * __page_find_buddy(struct page *page, unsigned long page_idx, unsigned int order) @@ -287,22 +287,27 @@ __find_combined_index(unsigned long page_idx, unsigned int order) * we can do coalesce a page and its buddy if * (a) the buddy is not in a hole && * (b) the buddy is in the buddy system && - * (c) a page and its buddy have the same order. + * (c) a page and its buddy have the same order && + * (d) a page and its buddy are in the same zone. * * For recording whether a page is in the buddy system, we use PG_buddy. * Setting, clearing, and testing PG_buddy is serialized by zone->lock. * * For recording page's order, we use page_private(page). */ -static inline int page_is_buddy(struct page *page, int order) +static inline int page_is_buddy(struct page *page, struct page *buddy, + int order) { #ifdef CONFIG_HOLES_IN_ZONE - if (!pfn_valid(page_to_pfn(page))) + if (!pfn_valid(page_to_pfn(buddy))) return 0; #endif - if (PageBuddy(page) && page_order(page) == order) { - BUG_ON(page_count(page) != 0); + if (page_zone_id(page) != page_zone_id(buddy)) + return 0; + + if (PageBuddy(buddy) && page_order(buddy) == order) { + BUG_ON(page_count(buddy) != 0); return 1; } return 0; @@ -353,7 +358,7 @@ static inline void __free_one_page(struct page *page, struct page *buddy; buddy = __page_find_buddy(page, page_idx, order); - if (!page_is_buddy(buddy, order)) + if (!page_is_buddy(page, buddy, order)) break; /* Move the buddy up one level. */ list_del(&buddy->lru); @@ -442,8 +447,8 @@ static void __free_pages_ok(struct page *page, unsigned int order) if (arch_free_page(page, order)) return; if (!PageHighMem(page)) - mutex_debug_check_no_locks_freed(page_address(page), - PAGE_SIZE<flags &= ~(1 << PG_uptodate | 1 << PG_error | 1 << PG_referenced | 1 << PG_arch_1 | - 1 << PG_checked | 1 << PG_mappedtodisk); + 1 << PG_fs_misc | 1 << PG_mappedtodisk); set_page_private(page, 0); set_page_refcounted(page); kernel_map_pages(page, 1 << order, 1); @@ -705,27 +710,6 @@ void drain_local_pages(void) } #endif /* CONFIG_PM */ -static void zone_statistics(struct zonelist *zonelist, struct zone *z, int cpu) -{ -#ifdef CONFIG_NUMA - pg_data_t *pg = z->zone_pgdat; - pg_data_t *orig = zonelist->zones[0]->zone_pgdat; - struct per_cpu_pageset *p; - - p = zone_pcp(z, cpu); - if (pg == orig) { - p->numa_hit++; - } else { - p->numa_miss++; - zone_pcp(zonelist->zones[0], cpu)->numa_foreign++; - } - if (pg == NODE_DATA(numa_node_id())) - p->local_node++; - else - p->other_node++; -#endif -} - /* * Free a 0-order page */ @@ -747,7 +731,7 @@ static void fastcall free_hot_cold_page(struct page *page, int cold) pcp = &zone_pcp(zone, get_cpu())->pcp[cold]; local_irq_save(flags); - __inc_page_state(pgfree); + __count_vm_event(PGFREE); list_add(&page->lru, &pcp->list); pcp->count++; if (pcp->count >= pcp->high) { @@ -823,8 +807,8 @@ again: goto failed; } - __mod_page_state_zone(zone, pgalloc, 1 << order); - zone_statistics(zonelist, zone, cpu); + __count_zone_vm_events(PGALLOC, zone, 1 << order); + zone_statistics(zonelist, zone); local_irq_restore(flags); put_cpu(); @@ -954,8 +938,7 @@ restart: goto got_pg; do { - if (cpuset_zone_allowed(*z, gfp_mask|__GFP_HARDWALL)) - wakeup_kswapd(*z, order); + wakeup_kswapd(*z, order); } while (*(++z)); /* @@ -1229,141 +1212,6 @@ static void show_node(struct zone *zone) #define show_node(zone) do { } while (0) #endif -/* - * Accumulate the page_state information across all CPUs. - * The result is unavoidably approximate - it can change - * during and after execution of this function. - */ -static DEFINE_PER_CPU(struct page_state, page_states) = {0}; - -atomic_t nr_pagecache = ATOMIC_INIT(0); -EXPORT_SYMBOL(nr_pagecache); -#ifdef CONFIG_SMP -DEFINE_PER_CPU(long, nr_pagecache_local) = 0; -#endif - -static void __get_page_state(struct page_state *ret, int nr, cpumask_t *cpumask) -{ - unsigned cpu; - - memset(ret, 0, nr * sizeof(unsigned long)); - cpus_and(*cpumask, *cpumask, cpu_online_map); - - for_each_cpu_mask(cpu, *cpumask) { - unsigned long *in; - unsigned long *out; - unsigned off; - unsigned next_cpu; - - in = (unsigned long *)&per_cpu(page_states, cpu); - - next_cpu = next_cpu(cpu, *cpumask); - if (likely(next_cpu < NR_CPUS)) - prefetch(&per_cpu(page_states, next_cpu)); - - out = (unsigned long *)ret; - for (off = 0; off < nr; off++) - *out++ += *in++; - } -} - -void get_page_state_node(struct page_state *ret, int node) -{ - int nr; - cpumask_t mask = node_to_cpumask(node); - - nr = offsetof(struct page_state, GET_PAGE_STATE_LAST); - nr /= sizeof(unsigned long); - - __get_page_state(ret, nr+1, &mask); -} - -void get_page_state(struct page_state *ret) -{ - int nr; - cpumask_t mask = CPU_MASK_ALL; - - nr = offsetof(struct page_state, GET_PAGE_STATE_LAST); - nr /= sizeof(unsigned long); - - __get_page_state(ret, nr + 1, &mask); -} - -void get_full_page_state(struct page_state *ret) -{ - cpumask_t mask = CPU_MASK_ALL; - - __get_page_state(ret, sizeof(*ret) / sizeof(unsigned long), &mask); -} - -unsigned long read_page_state_offset(unsigned long offset) -{ - unsigned long ret = 0; - int cpu; - - for_each_online_cpu(cpu) { - unsigned long in; - - in = (unsigned long)&per_cpu(page_states, cpu) + offset; - ret += *((unsigned long *)in); - } - return ret; -} - -void __mod_page_state_offset(unsigned long offset, unsigned long delta) -{ - void *ptr; - - ptr = &__get_cpu_var(page_states); - *(unsigned long *)(ptr + offset) += delta; -} -EXPORT_SYMBOL(__mod_page_state_offset); - -void mod_page_state_offset(unsigned long offset, unsigned long delta) -{ - unsigned long flags; - void *ptr; - - local_irq_save(flags); - ptr = &__get_cpu_var(page_states); - *(unsigned long *)(ptr + offset) += delta; - local_irq_restore(flags); -} -EXPORT_SYMBOL(mod_page_state_offset); - -void __get_zone_counts(unsigned long *active, unsigned long *inactive, - unsigned long *free, struct pglist_data *pgdat) -{ - struct zone *zones = pgdat->node_zones; - int i; - - *active = 0; - *inactive = 0; - *free = 0; - for (i = 0; i < MAX_NR_ZONES; i++) { - *active += zones[i].nr_active; - *inactive += zones[i].nr_inactive; - *free += zones[i].free_pages; - } -} - -void get_zone_counts(unsigned long *active, - unsigned long *inactive, unsigned long *free) -{ - struct pglist_data *pgdat; - - *active = 0; - *inactive = 0; - *free = 0; - for_each_online_pgdat(pgdat) { - unsigned long l, m, n; - __get_zone_counts(&l, &m, &n, pgdat); - *active += l; - *inactive += m; - *free += n; - } -} - void si_meminfo(struct sysinfo *val) { val->totalram = totalram_pages; @@ -1408,7 +1256,6 @@ void si_meminfo_node(struct sysinfo *val, int nid) */ void show_free_areas(void) { - struct page_state ps; int cpu, temperature; unsigned long active; unsigned long inactive; @@ -1440,7 +1287,6 @@ void show_free_areas(void) } } - get_page_state(&ps); get_zone_counts(&active, &inactive, &free); printk("Free pages: %11ukB (%ukB HighMem)\n", @@ -1451,13 +1297,13 @@ void show_free_areas(void) "unstable:%lu free:%u slab:%lu mapped:%lu pagetables:%lu\n", active, inactive, - ps.nr_dirty, - ps.nr_writeback, - ps.nr_unstable, + global_page_state(NR_FILE_DIRTY), + global_page_state(NR_WRITEBACK), + global_page_state(NR_UNSTABLE_NFS), nr_free_pages(), - ps.nr_slab, - ps.nr_mapped, - ps.nr_page_table_pages); + global_page_state(NR_SLAB), + global_page_state(NR_FILE_MAPPED), + global_page_state(NR_PAGETABLE)); for_each_zone(zone) { int i; @@ -1492,7 +1338,7 @@ void show_free_areas(void) } for_each_zone(zone) { - unsigned long nr, flags, order, total = 0; + unsigned long nr[MAX_ORDER], flags, order, total = 0; show_node(zone); printk("%s: ", zone->name); @@ -1503,11 +1349,12 @@ void show_free_areas(void) spin_lock_irqsave(&zone->lock, flags); for (order = 0; order < MAX_ORDER; order++) { - nr = zone->free_area[order].nr_free; - total += nr << order; - printk("%lu*%lukB ", nr, K(1UL) << order); + nr[order] = zone->free_area[order].nr_free; + total += nr[order] << order; } spin_unlock_irqrestore(&zone->lock, flags); + for (order = 0; order < MAX_ORDER; order++) + printk("%lu*%lukB ", nr[order], K(1UL) << order); printk("= %lukB\n", K(total)); } @@ -1519,7 +1366,7 @@ void show_free_areas(void) * * Add all populated zones of a node to the zonelist. */ -static int __init build_zonelists_node(pg_data_t *pgdat, +static int __meminit build_zonelists_node(pg_data_t *pgdat, struct zonelist *zonelist, int nr_zones, int zone_type) { struct zone *zone; @@ -1555,7 +1402,7 @@ static inline int highest_zone(int zone_bits) #ifdef CONFIG_NUMA #define MAX_NODE_LOAD (num_online_nodes()) -static int __initdata node_load[MAX_NUMNODES]; +static int __meminitdata node_load[MAX_NUMNODES]; /** * find_next_best_node - find the next node that should appear in a given node's fallback list * @node: node whose fallback list we're appending @@ -1570,7 +1417,7 @@ static int __initdata node_load[MAX_NUMNODES]; * on them otherwise. * It returns -1 if no node is found. */ -static int __init find_next_best_node(int node, nodemask_t *used_node_mask) +static int __meminit find_next_best_node(int node, nodemask_t *used_node_mask) { int n, val; int min_val = INT_MAX; @@ -1616,7 +1463,7 @@ static int __init find_next_best_node(int node, nodemask_t *used_node_mask) return best_node; } -static void __init build_zonelists(pg_data_t *pgdat) +static void __meminit build_zonelists(pg_data_t *pgdat) { int i, j, k, node, local_node; int prev_node, load; @@ -1668,7 +1515,7 @@ static void __init build_zonelists(pg_data_t *pgdat) #else /* CONFIG_NUMA */ -static void __init build_zonelists(pg_data_t *pgdat) +static void __meminit build_zonelists(pg_data_t *pgdat) { int i, j, k, node, local_node; @@ -1706,14 +1553,29 @@ static void __init build_zonelists(pg_data_t *pgdat) #endif /* CONFIG_NUMA */ -void __init build_all_zonelists(void) +/* return values int ....just for stop_machine_run() */ +static int __meminit __build_all_zonelists(void *dummy) { - int i; + int nid; + for_each_online_node(nid) + build_zonelists(NODE_DATA(nid)); + return 0; +} - for_each_online_node(i) - build_zonelists(NODE_DATA(i)); - printk("Built %i zonelists\n", num_online_nodes()); - cpuset_init_current_mems_allowed(); +void __meminit build_all_zonelists(void) +{ + if (system_state == SYSTEM_BOOTING) { + __build_all_zonelists(0); + cpuset_init_current_mems_allowed(); + } else { + /* we have to stop all cpus to guaranntee there is no user + of zonelist */ + stop_machine_run(__build_all_zonelists, NULL, NR_CPUS); + /* cpuset refresh routine should be here */ + } + vm_total_pages = nr_free_pagecache_pages(); + printk("Built %i zonelists. Total pages: %ld\n", + num_online_nodes(), vm_total_pages); } /* @@ -1729,7 +1591,8 @@ void __init build_all_zonelists(void) */ #define PAGES_PER_WAITQUEUE 256 -static inline unsigned long wait_table_size(unsigned long pages) +#ifndef CONFIG_MEMORY_HOTPLUG +static inline unsigned long wait_table_hash_nr_entries(unsigned long pages) { unsigned long size = 1; @@ -1747,6 +1610,29 @@ static inline unsigned long wait_table_size(unsigned long pages) return max(size, 4UL); } +#else +/* + * A zone's size might be changed by hot-add, so it is not possible to determine + * a suitable size for its wait_table. So we use the maximum size now. + * + * The max wait table size = 4096 x sizeof(wait_queue_head_t). ie: + * + * i386 (preemption config) : 4096 x 16 = 64Kbyte. + * ia64, x86-64 (no preemption): 4096 x 20 = 80Kbyte. + * ia64, x86-64 (preemption) : 4096 x 24 = 96Kbyte. + * + * The maximum entries are prepared when a zone's memory is (512K + 256) pages + * or more by the traditional way. (See above). It equals: + * + * i386, x86-64, powerpc(4K page size) : = ( 2G + 1M)byte. + * ia64(16K page size) : = ( 8G + 4M)byte. + * powerpc (64K page size) : = (32G +16M)byte. + */ +static inline unsigned long wait_table_hash_nr_entries(unsigned long pages) +{ + return 4096UL; +} +#endif /* * This is an integer logarithm so that shifts can be used later @@ -1794,6 +1680,8 @@ void __meminit memmap_init_zone(unsigned long size, int nid, unsigned long zone, for (pfn = start_pfn; pfn < end_pfn; pfn++) { if (!early_pfn_valid(pfn)) continue; + if (!early_pfn_in_nid(pfn, nid)) + continue; page = pfn_to_page(pfn); set_page_links(page, zone, nid, pfn); init_page_count(page); @@ -1966,12 +1854,14 @@ static inline void free_zone_pagesets(int cpu) for_each_zone(zone) { struct per_cpu_pageset *pset = zone_pcp(zone, cpu); + /* Free per_cpu_pageset if it is slab allocated */ + if (pset != &boot_pageset[cpu]) + kfree(pset); zone_pcp(zone, cpu) = NULL; - kfree(pset); } } -static int pageset_cpuup_callback(struct notifier_block *nfb, +static int __cpuinit pageset_cpuup_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) { @@ -1993,7 +1883,7 @@ static int pageset_cpuup_callback(struct notifier_block *nfb, return ret; } -static struct notifier_block pageset_notifier = +static struct notifier_block __cpuinitdata pageset_notifier = { &pageset_cpuup_callback, NULL, 0 }; void __init setup_per_cpu_pageset(void) @@ -2012,23 +1902,46 @@ void __init setup_per_cpu_pageset(void) #endif static __meminit -void zone_wait_table_init(struct zone *zone, unsigned long zone_size_pages) +int zone_wait_table_init(struct zone *zone, unsigned long zone_size_pages) { int i; struct pglist_data *pgdat = zone->zone_pgdat; + size_t alloc_size; /* * The per-page waitqueue mechanism uses hashed waitqueues * per zone. */ - zone->wait_table_size = wait_table_size(zone_size_pages); - zone->wait_table_bits = wait_table_bits(zone->wait_table_size); - zone->wait_table = (wait_queue_head_t *) - alloc_bootmem_node(pgdat, zone->wait_table_size - * sizeof(wait_queue_head_t)); + zone->wait_table_hash_nr_entries = + wait_table_hash_nr_entries(zone_size_pages); + zone->wait_table_bits = + wait_table_bits(zone->wait_table_hash_nr_entries); + alloc_size = zone->wait_table_hash_nr_entries + * sizeof(wait_queue_head_t); + + if (system_state == SYSTEM_BOOTING) { + zone->wait_table = (wait_queue_head_t *) + alloc_bootmem_node(pgdat, alloc_size); + } else { + /* + * This case means that a zone whose size was 0 gets new memory + * via memory hot-add. + * But it may be the case that a new node was hot-added. In + * this case vmalloc() will not be able to use this new node's + * memory - this wait_table must be initialized to use this new + * node itself as well. + * To use this new node's memory, further consideration will be + * necessary. + */ + zone->wait_table = (wait_queue_head_t *)vmalloc(alloc_size); + } + if (!zone->wait_table) + return -ENOMEM; - for(i = 0; i < zone->wait_table_size; ++i) + for(i = 0; i < zone->wait_table_hash_nr_entries; ++i) init_waitqueue_head(zone->wait_table + i); + + return 0; } static __meminit void zone_pcp_init(struct zone *zone) @@ -2050,12 +1963,15 @@ static __meminit void zone_pcp_init(struct zone *zone) zone->name, zone->present_pages, batch); } -static __meminit void init_currently_empty_zone(struct zone *zone, - unsigned long zone_start_pfn, unsigned long size) +__meminit int init_currently_empty_zone(struct zone *zone, + unsigned long zone_start_pfn, + unsigned long size) { struct pglist_data *pgdat = zone->zone_pgdat; - - zone_wait_table_init(zone, size); + int ret; + ret = zone_wait_table_init(zone, size); + if (ret) + return ret; pgdat->nr_zones = zone_idx(zone) + 1; zone->zone_start_pfn = zone_start_pfn; @@ -2063,6 +1979,8 @@ static __meminit void init_currently_empty_zone(struct zone *zone, memmap_init(size, pgdat->node_id, zone_idx(zone), zone_start_pfn); zone_init_free_lists(pgdat, zone, zone->spanned_pages); + + return 0; } /* @@ -2071,12 +1989,13 @@ static __meminit void init_currently_empty_zone(struct zone *zone, * - mark all memory queues empty * - clear the memory bitmaps */ -static void __init free_area_init_core(struct pglist_data *pgdat, +static void __meminit free_area_init_core(struct pglist_data *pgdat, unsigned long *zones_size, unsigned long *zholes_size) { unsigned long j; int nid = pgdat->node_id; unsigned long zone_start_pfn = pgdat->node_start_pfn; + int ret; pgdat_resize_init(pgdat); pgdat->nr_zones = 0; @@ -2097,6 +2016,11 @@ static void __init free_area_init_core(struct pglist_data *pgdat, zone->spanned_pages = size; zone->present_pages = realsize; +#ifdef CONFIG_NUMA + zone->min_unmapped_ratio = (realsize*sysctl_min_unmapped_ratio) + / 100; + zone->min_slab_pages = (realsize * sysctl_min_slab_ratio) / 100; +#endif zone->name = zone_names[j]; spin_lock_init(&zone->lock); spin_lock_init(&zone->lru_lock); @@ -2104,7 +2028,7 @@ static void __init free_area_init_core(struct pglist_data *pgdat, zone->zone_pgdat = pgdat; zone->free_pages = 0; - zone->temp_priority = zone->prev_priority = DEF_PRIORITY; + zone->prev_priority = DEF_PRIORITY; zone_pcp_init(zone); INIT_LIST_HEAD(&zone->active_list); @@ -2113,12 +2037,14 @@ static void __init free_area_init_core(struct pglist_data *pgdat, zone->nr_scan_inactive = 0; zone->nr_active = 0; zone->nr_inactive = 0; + zap_zone_vm_stats(zone); atomic_set(&zone->reclaim_in_progress, 0); if (!size) continue; zonetable_add(zone, nid, j, zone_start_pfn, size); - init_currently_empty_zone(zone, zone_start_pfn, size); + ret = init_currently_empty_zone(zone, zone_start_pfn, size); + BUG_ON(ret); zone_start_pfn += size; } } @@ -2159,7 +2085,7 @@ static void __init alloc_node_mem_map(struct pglist_data *pgdat) #endif /* CONFIG_FLAT_NODE_MEM_MAP */ } -void __init free_area_init_node(int nid, struct pglist_data *pgdat, +void __meminit free_area_init_node(int nid, struct pglist_data *pgdat, unsigned long *zones_size, unsigned long node_start_pfn, unsigned long *zholes_size) { @@ -2185,307 +2111,18 @@ void __init free_area_init(unsigned long *zones_size) __pa(PAGE_OFFSET) >> PAGE_SHIFT, NULL); } -#ifdef CONFIG_PROC_FS - -#include - -static void *frag_start(struct seq_file *m, loff_t *pos) -{ - pg_data_t *pgdat; - loff_t node = *pos; - for (pgdat = first_online_pgdat(); - pgdat && node; - pgdat = next_online_pgdat(pgdat)) - --node; - - return pgdat; -} - -static void *frag_next(struct seq_file *m, void *arg, loff_t *pos) -{ - pg_data_t *pgdat = (pg_data_t *)arg; - - (*pos)++; - return next_online_pgdat(pgdat); -} - -static void frag_stop(struct seq_file *m, void *arg) -{ -} - -/* - * This walks the free areas for each zone. - */ -static int frag_show(struct seq_file *m, void *arg) -{ - pg_data_t *pgdat = (pg_data_t *)arg; - struct zone *zone; - struct zone *node_zones = pgdat->node_zones; - unsigned long flags; - int order; - - for (zone = node_zones; zone - node_zones < MAX_NR_ZONES; ++zone) { - if (!populated_zone(zone)) - continue; - - spin_lock_irqsave(&zone->lock, flags); - seq_printf(m, "Node %d, zone %8s ", pgdat->node_id, zone->name); - for (order = 0; order < MAX_ORDER; ++order) - seq_printf(m, "%6lu ", zone->free_area[order].nr_free); - spin_unlock_irqrestore(&zone->lock, flags); - seq_putc(m, '\n'); - } - return 0; -} - -struct seq_operations fragmentation_op = { - .start = frag_start, - .next = frag_next, - .stop = frag_stop, - .show = frag_show, -}; - -/* - * Output information about zones in @pgdat. - */ -static int zoneinfo_show(struct seq_file *m, void *arg) -{ - pg_data_t *pgdat = arg; - struct zone *zone; - struct zone *node_zones = pgdat->node_zones; - unsigned long flags; - - for (zone = node_zones; zone - node_zones < MAX_NR_ZONES; zone++) { - int i; - - if (!populated_zone(zone)) - continue; - - spin_lock_irqsave(&zone->lock, flags); - seq_printf(m, "Node %d, zone %8s", pgdat->node_id, zone->name); - seq_printf(m, - "\n pages free %lu" - "\n min %lu" - "\n low %lu" - "\n high %lu" - "\n active %lu" - "\n inactive %lu" - "\n scanned %lu (a: %lu i: %lu)" - "\n spanned %lu" - "\n present %lu", - zone->free_pages, - zone->pages_min, - zone->pages_low, - zone->pages_high, - zone->nr_active, - zone->nr_inactive, - zone->pages_scanned, - zone->nr_scan_active, zone->nr_scan_inactive, - zone->spanned_pages, - zone->present_pages); - seq_printf(m, - "\n protection: (%lu", - zone->lowmem_reserve[0]); - for (i = 1; i < ARRAY_SIZE(zone->lowmem_reserve); i++) - seq_printf(m, ", %lu", zone->lowmem_reserve[i]); - seq_printf(m, - ")" - "\n pagesets"); - for_each_online_cpu(i) { - struct per_cpu_pageset *pageset; - int j; - - pageset = zone_pcp(zone, i); - for (j = 0; j < ARRAY_SIZE(pageset->pcp); j++) { - if (pageset->pcp[j].count) - break; - } - if (j == ARRAY_SIZE(pageset->pcp)) - continue; - for (j = 0; j < ARRAY_SIZE(pageset->pcp); j++) { - seq_printf(m, - "\n cpu: %i pcp: %i" - "\n count: %i" - "\n high: %i" - "\n batch: %i", - i, j, - pageset->pcp[j].count, - pageset->pcp[j].high, - pageset->pcp[j].batch); - } -#ifdef CONFIG_NUMA - seq_printf(m, - "\n numa_hit: %lu" - "\n numa_miss: %lu" - "\n numa_foreign: %lu" - "\n interleave_hit: %lu" - "\n local_node: %lu" - "\n other_node: %lu", - pageset->numa_hit, - pageset->numa_miss, - pageset->numa_foreign, - pageset->interleave_hit, - pageset->local_node, - pageset->other_node); -#endif - } - seq_printf(m, - "\n all_unreclaimable: %u" - "\n prev_priority: %i" - "\n temp_priority: %i" - "\n start_pfn: %lu", - zone->all_unreclaimable, - zone->prev_priority, - zone->temp_priority, - zone->zone_start_pfn); - spin_unlock_irqrestore(&zone->lock, flags); - seq_putc(m, '\n'); - } - return 0; -} - -struct seq_operations zoneinfo_op = { - .start = frag_start, /* iterate over all zones. The same as in - * fragmentation. */ - .next = frag_next, - .stop = frag_stop, - .show = zoneinfo_show, -}; - -static char *vmstat_text[] = { - "nr_dirty", - "nr_writeback", - "nr_unstable", - "nr_page_table_pages", - "nr_mapped", - "nr_slab", - - "pgpgin", - "pgpgout", - "pswpin", - "pswpout", - - "pgalloc_high", - "pgalloc_normal", - "pgalloc_dma32", - "pgalloc_dma", - - "pgfree", - "pgactivate", - "pgdeactivate", - - "pgfault", - "pgmajfault", - - "pgrefill_high", - "pgrefill_normal", - "pgrefill_dma32", - "pgrefill_dma", - - "pgsteal_high", - "pgsteal_normal", - "pgsteal_dma32", - "pgsteal_dma", - - "pgscan_kswapd_high", - "pgscan_kswapd_normal", - "pgscan_kswapd_dma32", - "pgscan_kswapd_dma", - - "pgscan_direct_high", - "pgscan_direct_normal", - "pgscan_direct_dma32", - "pgscan_direct_dma", - - "pginodesteal", - "slabs_scanned", - "kswapd_steal", - "kswapd_inodesteal", - "pageoutrun", - "allocstall", - - "pgrotated", - "nr_bounce", -}; - -static void *vmstat_start(struct seq_file *m, loff_t *pos) -{ - struct page_state *ps; - - if (*pos >= ARRAY_SIZE(vmstat_text)) - return NULL; - - ps = kmalloc(sizeof(*ps), GFP_KERNEL); - m->private = ps; - if (!ps) - return ERR_PTR(-ENOMEM); - get_full_page_state(ps); - ps->pgpgin /= 2; /* sectors -> kbytes */ - ps->pgpgout /= 2; - return (unsigned long *)ps + *pos; -} - -static void *vmstat_next(struct seq_file *m, void *arg, loff_t *pos) -{ - (*pos)++; - if (*pos >= ARRAY_SIZE(vmstat_text)) - return NULL; - return (unsigned long *)m->private + *pos; -} - -static int vmstat_show(struct seq_file *m, void *arg) -{ - unsigned long *l = arg; - unsigned long off = l - (unsigned long *)m->private; - - seq_printf(m, "%s %lu\n", vmstat_text[off], *l); - return 0; -} - -static void vmstat_stop(struct seq_file *m, void *arg) -{ - kfree(m->private); - m->private = NULL; -} - -struct seq_operations vmstat_op = { - .start = vmstat_start, - .next = vmstat_next, - .stop = vmstat_stop, - .show = vmstat_show, -}; - -#endif /* CONFIG_PROC_FS */ - #ifdef CONFIG_HOTPLUG_CPU static int page_alloc_cpu_notify(struct notifier_block *self, unsigned long action, void *hcpu) { int cpu = (unsigned long)hcpu; - long *count; - unsigned long *src, *dest; if (action == CPU_DEAD) { - int i; - - /* Drain local pagecache count. */ - count = &per_cpu(nr_pagecache_local, cpu); - atomic_add(*count, &nr_pagecache); - *count = 0; local_irq_disable(); __drain_pages(cpu); - - /* Add dead cpu's page_states to our own. */ - dest = (unsigned long *)&__get_cpu_var(page_states); - src = (unsigned long *)&per_cpu(page_states, cpu); - - for (i = 0; i < sizeof(struct page_state)/sizeof(unsigned long); - i++) { - dest[i] += src[i]; - src[i] = 0; - } - + vm_events_fold_cpu(cpu); local_irq_enable(); + refresh_cpu_vm_stats(cpu); } return NOTIFY_OK; } @@ -2677,6 +2314,40 @@ int min_free_kbytes_sysctl_handler(ctl_table *table, int write, return 0; } +#ifdef CONFIG_NUMA +int sysctl_min_unmapped_ratio_sysctl_handler(ctl_table *table, int write, + struct file *file, void __user *buffer, size_t *length, loff_t *ppos) +{ + struct zone *zone; + int rc; + + rc = proc_dointvec_minmax(table, write, file, buffer, length, ppos); + if (rc) + return rc; + + for_each_zone(zone) + zone->min_unmapped_ratio = (zone->present_pages * + sysctl_min_unmapped_ratio) / 100; + return 0; +} + +int sysctl_min_slab_ratio_sysctl_handler(ctl_table *table, int write, + struct file *file, void __user *buffer, size_t *length, loff_t *ppos) +{ + struct zone *zone; + int rc; + + rc = proc_dointvec_minmax(table, write, file, buffer, length, ppos); + if (rc) + return rc; + + for_each_zone(zone) + zone->min_slab_pages = (zone->present_pages * + sysctl_min_slab_ratio) / 100; + return 0; +} +#endif + /* * lowmem_reserve_ratio_sysctl_handler - just a wrapper around * proc_dointvec() so that we can call setup_per_zone_lowmem_reserve() @@ -2811,42 +2482,14 @@ void *__init alloc_large_system_hash(const char *tablename, } #ifdef CONFIG_OUT_OF_LINE_PFN_TO_PAGE -/* - * pfn <-> page translation. out-of-line version. - * (see asm-generic/memory_model.h) - */ -#if defined(CONFIG_FLATMEM) struct page *pfn_to_page(unsigned long pfn) { - return mem_map + (pfn - ARCH_PFN_OFFSET); + return __pfn_to_page(pfn); } unsigned long page_to_pfn(struct page *page) { - return (page - mem_map) + ARCH_PFN_OFFSET; -} -#elif defined(CONFIG_DISCONTIGMEM) -struct page *pfn_to_page(unsigned long pfn) -{ - int nid = arch_pfn_to_nid(pfn); - return NODE_DATA(nid)->node_mem_map + arch_local_page_offset(pfn,nid); -} -unsigned long page_to_pfn(struct page *page) -{ - struct pglist_data *pgdat = NODE_DATA(page_to_nid(page)); - return (page - pgdat->node_mem_map) + pgdat->node_start_pfn; -} -#elif defined(CONFIG_SPARSEMEM) -struct page *pfn_to_page(unsigned long pfn) -{ - return __section_mem_map_addr(__pfn_to_section(pfn)) + pfn; -} - -unsigned long page_to_pfn(struct page *page) -{ - long section_id = page_to_section(page); - return page - __section_mem_map_addr(__nr_to_section(section_id)); + return __page_to_pfn(page); } -#endif /* CONFIG_FLATMEM/DISCONTIGMME/SPARSEMEM */ EXPORT_SYMBOL(pfn_to_page); EXPORT_SYMBOL(page_to_pfn); #endif /* CONFIG_OUT_OF_LINE_PFN_TO_PAGE */ diff --git a/mm/page_io.c b/mm/page_io.c index bb2b0d538..a0ea98f25 100644 --- a/mm/page_io.c +++ b/mm/page_io.c @@ -59,7 +59,7 @@ static int end_swap_bio_write(struct bio *bio, unsigned int bytes_done, int err) return 0; } -static int end_swap_bio_read(struct bio *bio, unsigned int bytes_done, int err) +int end_swap_bio_read(struct bio *bio, unsigned int bytes_done, int err) { const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags); struct page *page = bio->bi_io_vec[0].bv_page; @@ -101,7 +101,7 @@ int swap_writepage(struct page *page, struct writeback_control *wbc) } if (wbc->sync_mode == WB_SYNC_ALL) rw |= (1 << BIO_RW_SYNC); - inc_page_state(pswpout); + count_vm_event(PSWPOUT); set_page_writeback(page); unlock_page(page); submit_bio(rw, bio); @@ -123,7 +123,7 @@ int swap_readpage(struct file *file, struct page *page) ret = -ENOMEM; goto out; } - inc_page_state(pswpin); + count_vm_event(PSWPIN); submit_bio(READ, bio); out: return ret; @@ -137,10 +137,12 @@ out: * We use end_swap_bio_read() even for writes, because it happens to do what * we want. */ -int rw_swap_page_sync(int rw, swp_entry_t entry, struct page *page) +int rw_swap_page_sync(int rw, swp_entry_t entry, struct page *page, + struct bio **bio_chain) { struct bio *bio; int ret = 0; + int bio_rw; lock_page(page); @@ -151,11 +153,22 @@ int rw_swap_page_sync(int rw, swp_entry_t entry, struct page *page) goto out; } - submit_bio(rw | (1 << BIO_RW_SYNC), bio); - wait_on_page_locked(page); - - if (!PageUptodate(page) || PageError(page)) - ret = -EIO; + bio_rw = rw; + if (!bio_chain) + bio_rw |= (1 << BIO_RW_SYNC); + if (bio_chain) + bio_get(bio); + submit_bio(bio_rw, bio); + if (bio_chain == NULL) { + wait_on_page_locked(page); + + if (!PageUptodate(page) || PageError(page)) + ret = -EIO; + } + if (bio_chain) { + bio->bi_private = *bio_chain; + *bio_chain = bio; + } out: return ret; } diff --git a/mm/pdflush.c b/mm/pdflush.c index 4842716d1..b02102fee 100644 --- a/mm/pdflush.c +++ b/mm/pdflush.c @@ -201,8 +201,7 @@ int pdflush_operation(void (*fn)(unsigned long), unsigned long arg0) unsigned long flags; int ret = 0; - if (fn == NULL) - BUG(); /* Hard to diagnose if it's deferred */ + BUG_ON(fn == NULL); /* Hard to diagnose if it's deferred */ spin_lock_irqsave(&pdflush_lock, flags); if (list_empty(&pdflush_list)) { diff --git a/mm/readahead.c b/mm/readahead.c index 0f142a409..54d339321 100644 --- a/mm/readahead.c +++ b/mm/readahead.c @@ -14,6 +14,7 @@ #include #include #include +#include void default_unplug_io_fn(struct backing_dev_info *bdi, struct page *page) { @@ -117,9 +118,28 @@ static inline unsigned long get_next_ra_size(struct file_ra_state *ra) #define list_to_page(head) (list_entry((head)->prev, struct page, lru)) +/* + * see if a page needs releasing upon read_cache_pages() failure + * - the caller of read_cache_pages() may have set PG_private before calling, + * such as the NFS fs marking pages that are cached locally on disk, thus we + * need to give the fs a chance to clean up in the event of an error + */ +static void read_cache_pages_release_page(struct address_space *mapping, + struct page *page) +{ + if (PagePrivate(page)) { + if (TestSetPageLocked(page)) + BUG(); + page->mapping = mapping; + try_to_release_page(page, GFP_KERNEL); + page->mapping = NULL; + unlock_page(page); + } + page_cache_release(page); +} + /** - * read_cache_pages - populate an address space with some pages, and - * start reads against them. + * read_cache_pages - populate an address space with some pages & start reads against them * @mapping: the address_space * @pages: The address of a list_head which contains the target pages. These * pages have their ->index populated and are otherwise uninitialised. @@ -141,7 +161,7 @@ int read_cache_pages(struct address_space *mapping, struct list_head *pages, page = list_to_page(pages); list_del(&page->lru); if (add_to_page_cache(page, mapping, page->index, GFP_KERNEL)) { - page_cache_release(page); + read_cache_pages_release_page(mapping, page); continue; } ret = filler(data, page); @@ -153,7 +173,7 @@ int read_cache_pages(struct address_space *mapping, struct list_head *pages, victim = list_to_page(pages); list_del(&victim->lru); - page_cache_release(victim); + read_cache_pages_release_page(mapping, victim); } break; } @@ -182,14 +202,11 @@ static int read_pages(struct address_space *mapping, struct file *filp, list_del(&page->lru); if (!add_to_page_cache(page, mapping, page->index, GFP_KERNEL)) { - ret = mapping->a_ops->readpage(filp, page); - if (ret != AOP_TRUNCATED_PAGE) { - if (!pagevec_add(&lru_pvec, page)) - __pagevec_lru_add(&lru_pvec); - continue; - } /* else fall through to release */ - } - page_cache_release(page); + mapping->a_ops->readpage(filp, page); + if (!pagevec_add(&lru_pvec, page)) + __pagevec_lru_add(&lru_pvec); + } else + page_cache_release(page); } pagevec_lru_add(&lru_pvec); ret = 0; @@ -394,8 +411,8 @@ int do_page_cache_readahead(struct address_space *mapping, struct file *filp, * Read 'nr_to_read' pages starting at page 'offset'. If the flag 'block' * is set wait till the read completes. Otherwise attempt to read without * blocking. - * Returns 1 meaning 'success' if read is succesfull without switching off - * readhaead mode. Otherwise return failure. + * Returns 1 meaning 'success' if read is successful without switching off + * readahead mode. Otherwise return failure. */ static int blockable_page_cache_readahead(struct address_space *mapping, struct file *filp, diff --git a/mm/rmap.c b/mm/rmap.c index a4658b4e4..bca42f9d2 100644 --- a/mm/rmap.c +++ b/mm/rmap.c @@ -53,6 +53,7 @@ #include #include #include +#include #include #include @@ -104,7 +105,7 @@ int anon_vma_prepare(struct vm_area_struct *vma) spin_lock(&mm->page_table_lock); if (likely(!vma->anon_vma)) { vma->anon_vma = anon_vma; - list_add(&vma->anon_vma_node, &anon_vma->head); + list_add_tail(&vma->anon_vma_node, &anon_vma->head); allocated = NULL; } spin_unlock(&mm->page_table_lock); @@ -128,7 +129,7 @@ void __anon_vma_link(struct vm_area_struct *vma) struct anon_vma *anon_vma = vma->anon_vma; if (anon_vma) { - list_add(&vma->anon_vma_node, &anon_vma->head); + list_add_tail(&vma->anon_vma_node, &anon_vma->head); validate_anon_vma(vma); } } @@ -139,7 +140,7 @@ void anon_vma_link(struct vm_area_struct *vma) if (anon_vma) { spin_lock(&anon_vma->lock); - list_add(&vma->anon_vma_node, &anon_vma->head); + list_add_tail(&vma->anon_vma_node, &anon_vma->head); validate_anon_vma(vma); spin_unlock(&anon_vma->lock); } @@ -206,44 +207,6 @@ out: return anon_vma; } -#ifdef CONFIG_MIGRATION -/* - * Remove an anonymous page from swap replacing the swap pte's - * through real pte's pointing to valid pages and then releasing - * the page from the swap cache. - * - * Must hold page lock on page and mmap_sem of one vma that contains - * the page. - */ -void remove_from_swap(struct page *page) -{ - struct anon_vma *anon_vma; - struct vm_area_struct *vma; - unsigned long mapping; - - if (!PageSwapCache(page)) - return; - - mapping = (unsigned long)page->mapping; - - if (!mapping || (mapping & PAGE_MAPPING_ANON) == 0) - return; - - /* - * We hold the mmap_sem lock. So no need to call page_lock_anon_vma. - */ - anon_vma = (struct anon_vma *) (mapping - PAGE_MAPPING_ANON); - spin_lock(&anon_vma->lock); - - list_for_each_entry(vma, &anon_vma->head, anon_vma_node) - remove_vma_swap(vma, page); - - spin_unlock(&anon_vma->lock); - delete_from_swap_cache(page); -} -EXPORT_SYMBOL(remove_from_swap); -#endif - /* * At what user virtual address is page expected in vma? */ @@ -473,6 +436,71 @@ int page_referenced(struct page *page, int is_locked) return referenced; } +static int page_mkclean_one(struct page *page, struct vm_area_struct *vma) +{ + struct mm_struct *mm = vma->vm_mm; + unsigned long address; + pte_t *pte, entry; + spinlock_t *ptl; + int ret = 0; + + address = vma_address(page, vma); + if (address == -EFAULT) + goto out; + + pte = page_check_address(page, mm, address, &ptl); + if (!pte) + goto out; + + if (!pte_dirty(*pte) && !pte_write(*pte)) + goto unlock; + + entry = ptep_get_and_clear(mm, address, pte); + entry = pte_mkclean(entry); + entry = pte_wrprotect(entry); + ptep_establish(vma, address, pte, entry); + lazy_mmu_prot_update(entry); + ret = 1; + +unlock: + pte_unmap_unlock(pte, ptl); +out: + return ret; +} + +static int page_mkclean_file(struct address_space *mapping, struct page *page) +{ + pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); + struct vm_area_struct *vma; + struct prio_tree_iter iter; + int ret = 0; + + BUG_ON(PageAnon(page)); + + spin_lock(&mapping->i_mmap_lock); + vma_prio_tree_foreach(vma, &iter, &mapping->i_mmap, pgoff, pgoff) { + if (vma->vm_flags & VM_SHARED) + ret += page_mkclean_one(page, vma); + } + spin_unlock(&mapping->i_mmap_lock); + return ret; +} + +int page_mkclean(struct page *page) +{ + int ret = 0; + + WARN_ON_ONCE(!PageLocked(page)); + + if (page_mapped(page)) { + struct address_space *mapping = page_mapping(page); + if (mapping) + ret = page_mkclean_file(mapping, page); + } + + return ret; +} + /** * page_set_anon_rmap - setup new anonymous rmap * @page: the page to add the mapping to @@ -494,7 +522,7 @@ static void __page_set_anon_rmap(struct page *page, * nr_mapped state can be updated without turning off * interrupts because it is not modified via interrupt. */ - __inc_page_state(nr_mapped); + __inc_zone_page_state(page, NR_ANON_PAGES); } /** @@ -538,7 +566,7 @@ void page_add_new_anon_rmap(struct page *page, void page_add_file_rmap(struct page *page) { if (atomic_inc_and_test(&page->_mapcount)) - __inc_page_state(nr_mapped); + __inc_zone_page_state(page, NR_FILE_MAPPED); } /** @@ -547,18 +575,18 @@ void page_add_file_rmap(struct page *page) * * The caller needs to hold the pte lock. */ -void page_remove_rmap(struct page *page) +void page_remove_rmap(struct page *page, struct vm_area_struct *vma) { if (atomic_add_negative(-1, &page->_mapcount)) { -#ifdef CONFIG_DEBUG_VM if (unlikely(page_mapcount(page) < 0)) { printk (KERN_EMERG "Eeek! page_mapcount(page) went negative! (%d)\n", page_mapcount(page)); printk (KERN_EMERG " page->flags = %lx\n", page->flags); printk (KERN_EMERG " page->count = %x\n", page_count(page)); printk (KERN_EMERG " page->mapping = %p\n", page->mapping); + if (vma->vm_ops) + print_symbol (KERN_EMERG " vma->vm_ops->nopage = %s\n", (unsigned long)vma->vm_ops->nopage); + BUG(); } -#endif - BUG_ON(page_mapcount(page) < 0); /* * It would be tidy to reset the PageAnon mapping here, * but that might overwrite a racing page_add_anon_rmap @@ -570,7 +598,8 @@ void page_remove_rmap(struct page *page) */ if (page_test_and_clear_dirty(page)) set_page_dirty(page); - __dec_page_state(nr_mapped); + __dec_zone_page_state(page, + PageAnon(page) ? NR_ANON_PAGES : NR_FILE_MAPPED); } } @@ -579,7 +608,7 @@ void page_remove_rmap(struct page *page) * repeatedly from either try_to_unmap_anon or try_to_unmap_file. */ static int try_to_unmap_one(struct page *page, struct vm_area_struct *vma, - int ignore_refs) + int migration) { struct mm_struct *mm = vma->vm_mm; unsigned long address; @@ -601,9 +630,8 @@ static int try_to_unmap_one(struct page *page, struct vm_area_struct *vma, * If it's recently referenced (perhaps page_referenced * skipped over this mm) then we should reactivate it. */ - if ((vma->vm_flags & VM_LOCKED) || - (ptep_clear_flush_young(vma, address, pte) - && !ignore_refs)) { + if (!migration && ((vma->vm_flags & VM_LOCKED) || + (ptep_clear_flush_young(vma, address, pte)))) { ret = SWAP_FAIL; goto out_unmap; } @@ -621,25 +649,46 @@ static int try_to_unmap_one(struct page *page, struct vm_area_struct *vma, if (PageAnon(page)) { swp_entry_t entry = { .val = page_private(page) }; - /* - * Store the swap location in the pte. - * See handle_pte_fault() ... - */ - BUG_ON(!PageSwapCache(page)); - swap_duplicate(entry); - if (list_empty(&mm->mmlist)) { - spin_lock(&mmlist_lock); - if (list_empty(&mm->mmlist)) - list_add(&mm->mmlist, &init_mm.mmlist); - spin_unlock(&mmlist_lock); + + if (PageSwapCache(page)) { + /* + * Store the swap location in the pte. + * See handle_pte_fault() ... + */ + swap_duplicate(entry); + if (list_empty(&mm->mmlist)) { + spin_lock(&mmlist_lock); + if (list_empty(&mm->mmlist)) + list_add(&mm->mmlist, &init_mm.mmlist); + spin_unlock(&mmlist_lock); + } + dec_mm_counter(mm, anon_rss); +#ifdef CONFIG_MIGRATION + } else { + /* + * Store the pfn of the page in a special migration + * pte. do_swap_page() will wait until the migration + * pte is removed and then restart fault handling. + */ + BUG_ON(!migration); + entry = make_migration_entry(page, pte_write(pteval)); +#endif } set_pte_at(mm, address, pte, swp_entry_to_pte(entry)); BUG_ON(pte_file(*pte)); - dec_mm_counter(mm, anon_rss); } else +#ifdef CONFIG_MIGRATION + if (migration) { + /* Establish migration entry for a file page */ + swp_entry_t entry; + entry = make_migration_entry(page, pte_write(pteval)); + set_pte_at(mm, address, pte, swp_entry_to_pte(entry)); + } else +#endif dec_mm_counter(mm, file_rss); - page_remove_rmap(page); + + page_remove_rmap(page, vma); page_cache_release(page); out_unmap: @@ -729,7 +778,7 @@ static void try_to_unmap_cluster(unsigned long cursor, if (pte_dirty(pteval)) set_page_dirty(page); - page_remove_rmap(page); + page_remove_rmap(page, vma); page_cache_release(page); dec_mm_counter(mm, file_rss); (*mapcount)--; @@ -737,7 +786,7 @@ static void try_to_unmap_cluster(unsigned long cursor, pte_unmap_unlock(pte - 1, ptl); } -static int try_to_unmap_anon(struct page *page, int ignore_refs) +static int try_to_unmap_anon(struct page *page, int migration) { struct anon_vma *anon_vma; struct vm_area_struct *vma; @@ -748,7 +797,7 @@ static int try_to_unmap_anon(struct page *page, int ignore_refs) return ret; list_for_each_entry(vma, &anon_vma->head, anon_vma_node) { - ret = try_to_unmap_one(page, vma, ignore_refs); + ret = try_to_unmap_one(page, vma, migration); if (ret == SWAP_FAIL || !page_mapped(page)) break; } @@ -765,7 +814,7 @@ static int try_to_unmap_anon(struct page *page, int ignore_refs) * * This function is only called from try_to_unmap for object-based pages. */ -static int try_to_unmap_file(struct page *page, int ignore_refs) +static int try_to_unmap_file(struct page *page, int migration) { struct address_space *mapping = page->mapping; pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); @@ -779,7 +828,7 @@ static int try_to_unmap_file(struct page *page, int ignore_refs) spin_lock(&mapping->i_mmap_lock); vma_prio_tree_foreach(vma, &iter, &mapping->i_mmap, pgoff, pgoff) { - ret = try_to_unmap_one(page, vma, ignore_refs); + ret = try_to_unmap_one(page, vma, migration); if (ret == SWAP_FAIL || !page_mapped(page)) goto out; } @@ -789,7 +838,7 @@ static int try_to_unmap_file(struct page *page, int ignore_refs) list_for_each_entry(vma, &mapping->i_mmap_nonlinear, shared.vm_set.list) { - if (vma->vm_flags & VM_LOCKED) + if ((vma->vm_flags & VM_LOCKED) && !migration) continue; cursor = (unsigned long) vma->vm_private_data; if (cursor > max_nl_cursor) @@ -823,7 +872,7 @@ static int try_to_unmap_file(struct page *page, int ignore_refs) do { list_for_each_entry(vma, &mapping->i_mmap_nonlinear, shared.vm_set.list) { - if (vma->vm_flags & VM_LOCKED) + if ((vma->vm_flags & VM_LOCKED) && !migration) continue; cursor = (unsigned long) vma->vm_private_data; while ( cursor < max_nl_cursor && @@ -864,16 +913,16 @@ out: * SWAP_AGAIN - we missed a mapping, try again later * SWAP_FAIL - the page is unswappable */ -int try_to_unmap(struct page *page, int ignore_refs) +int try_to_unmap(struct page *page, int migration) { int ret; BUG_ON(!PageLocked(page)); if (PageAnon(page)) - ret = try_to_unmap_anon(page, ignore_refs); + ret = try_to_unmap_anon(page, migration); else - ret = try_to_unmap_file(page, ignore_refs); + ret = try_to_unmap_file(page, migration); if (!page_mapped(page)) ret = SWAP_SUCCESS; diff --git a/mm/shmem.c b/mm/shmem.c index c066617be..6704b3c9b 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -23,10 +23,8 @@ * which makes it a completely usable filesystem. */ -#include #include #include -#include #include #include #include @@ -173,7 +171,7 @@ static inline void shmem_unacct_blocks(unsigned long flags, long pages) } static struct super_operations shmem_ops; -static struct address_space_operations shmem_aops; +static const struct address_space_operations shmem_aops; static struct file_operations shmem_file_operations; static struct inode_operations shmem_inode_operations; static struct inode_operations shmem_dir_inode_operations; @@ -1045,12 +1043,12 @@ repeat: swappage = lookup_swap_cache(swap); if (!swappage) { shmem_swp_unmap(entry); - spin_unlock(&info->lock); /* here we actually do the io */ if (type && *type == VM_FAULT_MINOR) { - inc_page_state(pgmajfault); + __count_vm_event(PGMAJFAULT); *type = VM_FAULT_MAJOR; } + spin_unlock(&info->lock); swappage = shmem_swapin(info, swap, idx); if (!swappage) { spin_lock(&info->lock); @@ -1080,14 +1078,6 @@ repeat: page_cache_release(swappage); goto repeat; } - if (!PageSwapCache(swappage)) { - /* Page migration has occured */ - shmem_swp_unmap(entry); - spin_unlock(&info->lock); - unlock_page(swappage); - page_cache_release(swappage); - goto repeat; - } if (PageWriteback(swappage)) { shmem_swp_unmap(entry); spin_unlock(&info->lock); @@ -1359,7 +1349,6 @@ shmem_get_inode(struct super_block *sb, int mode, dev_t dev) inode->i_mode = mode; inode->i_uid = current->fsuid; inode->i_gid = current->fsgid; - inode->i_blksize = PAGE_CACHE_SIZE; inode->i_blocks = 0; inode->i_mapping->a_ops = &shmem_aops; inode->i_mapping->backing_dev_info = &shmem_backing_dev_info; @@ -1653,9 +1642,9 @@ static ssize_t shmem_file_sendfile(struct file *in_file, loff_t *ppos, return desc.error; } -static int shmem_statfs(struct super_block *sb, struct kstatfs *buf) +static int shmem_statfs(struct dentry *dentry, struct kstatfs *buf) { - struct shmem_sb_info *sbinfo = SHMEM_SB(sb); + struct shmem_sb_info *sbinfo = SHMEM_SB(dentry->d_sb); buf->f_type = TMPFS_SUPER_MAGIC; buf->f_bsize = PAGE_CACHE_SIZE; @@ -2169,7 +2158,7 @@ static void destroy_inodecache(void) printk(KERN_INFO "shmem_inode_cache: not all structures were freed\n"); } -static struct address_space_operations shmem_aops = { +static const struct address_space_operations shmem_aops = { .writepage = shmem_writepage, .set_page_dirty = __set_page_dirty_nobuffers, #ifdef CONFIG_TMPFS @@ -2232,10 +2221,10 @@ static struct vm_operations_struct shmem_vm_ops = { }; -static struct super_block *shmem_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int shmem_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_nodev(fs_type, flags, data, shmem_fill_super); + return get_sb_nodev(fs_type, flags, data, shmem_fill_super, mnt); } static struct file_system_type tmpfs_fs_type = { @@ -2259,10 +2248,8 @@ static int __init init_tmpfs(void) printk(KERN_ERR "Could not register tmpfs\n"); goto out2; } -#ifdef CONFIG_TMPFS - devfs_mk_dir("shm"); -#endif - shm_mnt = do_kern_mount(tmpfs_fs_type.name, MS_NOUSER, + + shm_mnt = vfs_kern_mount(&tmpfs_fs_type, MS_NOUSER, tmpfs_fs_type.name, NULL); if (IS_ERR(shm_mnt)) { error = PTR_ERR(shm_mnt); diff --git a/mm/slab.c b/mm/slab.c index 33ae564b8..4a5634ee8 100644 --- a/mm/slab.c +++ b/mm/slab.c @@ -86,9 +86,9 @@ * All object allocations for a node occur from node specific slab lists. */ -#include #include #include +#include #include #include #include @@ -106,6 +106,7 @@ #include #include #include +#include #include #include @@ -307,6 +308,13 @@ struct kmem_list3 __initdata initkmem_list3[NUM_INIT_LISTS]; #define SIZE_AC 1 #define SIZE_L3 (1 + MAX_NUMNODES) +static int drain_freelist(struct kmem_cache *cache, + struct kmem_list3 *l3, int tofree); +static void free_block(struct kmem_cache *cachep, void **objpp, int len, + int node); +static void enable_cpucache(struct kmem_cache *cachep); +static void cache_reap(void *unused); + /* * This function must be completely optimized away if a constant is passed to * it. Mostly the same as what is in linux/slab.h except it returns an index. @@ -331,6 +339,8 @@ static __always_inline int index_of(const size_t size) return 0; } +static int slab_early_init = 1; + #define INDEX_AC index_of(sizeof(struct arraycache_init)) #define INDEX_L3 index_of(sizeof(struct kmem_list3)) @@ -452,7 +462,7 @@ struct kmem_cache { #define STATS_DEC_ACTIVE(x) ((x)->num_active--) #define STATS_INC_ALLOCED(x) ((x)->num_allocations++) #define STATS_INC_GROWN(x) ((x)->grown++) -#define STATS_INC_REAPED(x) ((x)->reaped++) +#define STATS_ADD_REAPED(x,y) ((x)->reaped += (y)) #define STATS_SET_HIGH(x) \ do { \ if ((x)->num_active > (x)->high_mark) \ @@ -476,7 +486,7 @@ struct kmem_cache { #define STATS_DEC_ACTIVE(x) do { } while (0) #define STATS_INC_ALLOCED(x) do { } while (0) #define STATS_INC_GROWN(x) do { } while (0) -#define STATS_INC_REAPED(x) do { } while (0) +#define STATS_ADD_REAPED(x,y) do { } while (0) #define STATS_SET_HIGH(x) do { } while (0) #define STATS_INC_ERR(x) do { } while (0) #define STATS_INC_NODEALLOCS(x) do { } while (0) @@ -490,17 +500,6 @@ struct kmem_cache { #endif #if DEBUG -/* - * Magic nums for obj red zoning. - * Placed in the first word before and the first word after an obj. - */ -#define RED_INACTIVE 0x5A2CF071UL /* when obj is inactive */ -#define RED_ACTIVE 0x170FC2A5UL /* when obj is active */ - -/* ...and for poisoning */ -#define POISON_INUSE 0x5a /* for use-uninitialised poisoning */ -#define POISON_FREE 0x6b /* for use-after-free poisoning */ -#define POISON_END 0xa5 /* end-byte of poisoning */ /* * memory layout of objects: @@ -592,6 +591,7 @@ static inline struct kmem_cache *page_get_cache(struct page *page) { if (unlikely(PageCompound(page))) page = (struct page *)page_private(page); + BUG_ON(!PageSlab(page)); return (struct kmem_cache *)page->lru.next; } @@ -604,6 +604,7 @@ static inline struct slab *page_get_slab(struct page *page) { if (unlikely(PageCompound(page))) page = (struct page *)page_private(page); + BUG_ON(!PageSlab(page)); return (struct slab *)page->lru.prev; } @@ -672,6 +673,63 @@ static struct kmem_cache cache_cache = { #endif }; +#define BAD_ALIEN_MAGIC 0x01020304ul + +#ifdef CONFIG_LOCKDEP + +/* + * Slab sometimes uses the kmalloc slabs to store the slab headers + * for other slabs "off slab". + * The locking for this is tricky in that it nests within the locks + * of all other slabs in a few places; to deal with this special + * locking we put on-slab caches into a separate lock-class. + * + * We set lock class for alien array caches which are up during init. + * The lock annotation will be lost if all cpus of a node goes down and + * then comes back up during hotplug + */ +static struct lock_class_key on_slab_l3_key; +static struct lock_class_key on_slab_alc_key; + +static inline void init_lock_keys(void) + +{ + int q; + struct cache_sizes *s = malloc_sizes; + + while (s->cs_size != ULONG_MAX) { + for_each_node(q) { + struct array_cache **alc; + int r; + struct kmem_list3 *l3 = s->cs_cachep->nodelists[q]; + if (!l3 || OFF_SLAB(s->cs_cachep)) + continue; + lockdep_set_class(&l3->list_lock, &on_slab_l3_key); + alc = l3->alien; + /* + * FIXME: This check for BAD_ALIEN_MAGIC + * should go away when common slab code is taught to + * work even without alien caches. + * Currently, non NUMA code returns BAD_ALIEN_MAGIC + * for alloc_alien_cache, + */ + if (!alc || (unsigned long)alc == BAD_ALIEN_MAGIC) + continue; + for_each_node(r) { + if (alc[r]) + lockdep_set_class(&alc[r]->lock, + &on_slab_alc_key); + } + } + s++; + } +} +#else +static inline void init_lock_keys(void) +{ +} +#endif + /* Guard access to the cache-chain. */ static DEFINE_MUTEX(cache_chain_mutex); static struct list_head cache_chain; @@ -705,12 +763,6 @@ int slab_is_available(void) static DEFINE_PER_CPU(struct work_struct, reap_work); -static void free_block(struct kmem_cache *cachep, void **objpp, int len, - int node); -static void enable_cpucache(struct kmem_cache *cachep); -static void cache_reap(void *unused); -static int __node_shrink(struct kmem_cache *cachep, int node); - static inline struct array_cache *cpu_cache_get(struct kmem_cache *cachep) { return cachep->array[smp_processor_id()]; @@ -1024,6 +1076,40 @@ static void drain_alien_cache(struct kmem_cache *cachep, } } } + +static inline int cache_free_alien(struct kmem_cache *cachep, void *objp) +{ + struct slab *slabp = virt_to_slab(objp); + int nodeid = slabp->nodeid; + struct kmem_list3 *l3; + struct array_cache *alien = NULL; + + /* + * Make sure we are not freeing a object from another node to the array + * cache on this cpu. + */ + if (likely(slabp->nodeid == numa_node_id())) + return 0; + + l3 = cachep->nodelists[numa_node_id()]; + STATS_INC_NODEFREES(cachep); + if (l3->alien && l3->alien[nodeid]) { + alien = l3->alien[nodeid]; + spin_lock(&alien->lock); + if (unlikely(alien->avail == alien->limit)) { + STATS_INC_ACOVERFLOW(cachep); + __drain_alien_cache(cachep, alien, nodeid); + } + alien->entry[alien->avail++] = objp; + spin_unlock(&alien->lock); + } else { + spin_lock(&(cachep->nodelists[nodeid])->list_lock); + free_block(cachep, &objp, 1, nodeid); + spin_unlock(&(cachep->nodelists[nodeid])->list_lock); + } + return 1; +} + #else #define drain_alien_cache(cachep, alien) do { } while (0) @@ -1031,16 +1117,21 @@ static void drain_alien_cache(struct kmem_cache *cachep, static inline struct array_cache **alloc_alien_cache(int node, int limit) { - return (struct array_cache **) 0x01020304ul; + return (struct array_cache **)BAD_ALIEN_MAGIC; } static inline void free_alien_cache(struct array_cache **ac_ptr) { } +static inline int cache_free_alien(struct kmem_cache *cachep, void *objp) +{ + return 0; +} + #endif -static int cpuup_callback(struct notifier_block *nfb, +static int __cpuinit cpuup_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) { long cpu = (long)hcpu; @@ -1207,10 +1298,7 @@ free_array_cache: l3 = cachep->nodelists[node]; if (!l3) continue; - spin_lock_irq(&l3->list_lock); - /* free slabs belonging to this node */ - __node_shrink(cachep, node); - spin_unlock_irq(&l3->list_lock); + drain_freelist(cachep, l3, l3->free_objects); } mutex_unlock(&cache_chain_mutex); break; @@ -1222,7 +1310,9 @@ bad: return NOTIFY_BAD; } -static struct notifier_block cpucache_notifier = { &cpuup_callback, NULL, 0 }; +static struct notifier_block __cpuinitdata cpucache_notifier = { + &cpuup_callback, NULL, 0 +}; /* * swap the static kmem_list3 with kmalloced memory @@ -1238,6 +1328,11 @@ static void init_list(struct kmem_cache *cachep, struct kmem_list3 *list, local_irq_disable(); memcpy(ptr, list, sizeof(struct kmem_list3)); + /* + * Do not assume that spinlocks can be initialized via memcpy: + */ + spin_lock_init(&ptr->list_lock); + MAKE_ALL_LISTS(cachep, ptr, nodeid); cachep->nodelists[nodeid] = ptr; local_irq_enable(); @@ -1335,6 +1430,8 @@ void __init kmem_cache_init(void) NULL, NULL); } + slab_early_init = 0; + while (sizes->cs_size != ULONG_MAX) { /* * For performance, all the general caches are L1 aligned. @@ -1362,7 +1459,7 @@ void __init kmem_cache_init(void) } /* 4) Replace the bootstrap head arrays */ { - void *ptr; + struct array_cache *ptr; ptr = kmalloc(sizeof(struct arraycache_init), GFP_KERNEL); @@ -1370,6 +1467,11 @@ void __init kmem_cache_init(void) BUG_ON(cpu_cache_get(&cache_cache) != &initarray_cache.cache); memcpy(ptr, cpu_cache_get(&cache_cache), sizeof(struct arraycache_init)); + /* + * Do not assume that spinlocks can be initialized via memcpy: + */ + spin_lock_init(&ptr->lock); + cache_cache.array[smp_processor_id()] = ptr; local_irq_enable(); @@ -1380,6 +1482,11 @@ void __init kmem_cache_init(void) != &initarray_generic.cache); memcpy(ptr, cpu_cache_get(malloc_sizes[INDEX_AC].cs_cachep), sizeof(struct arraycache_init)); + /* + * Do not assume that spinlocks can be initialized via memcpy: + */ + spin_lock_init(&ptr->lock); + malloc_sizes[INDEX_AC].cs_cachep->array[smp_processor_id()] = ptr; local_irq_enable(); @@ -1412,6 +1519,10 @@ void __init kmem_cache_init(void) mutex_unlock(&cache_chain_mutex); } + /* Annotate slab for lockdep -- annotate the malloc caches */ + init_lock_keys(); + + /* Done! */ g_cpucache_up = FULL; @@ -1450,31 +1561,29 @@ __initcall(cpucache_init); static void *kmem_getpages(struct kmem_cache *cachep, gfp_t flags, int nodeid) { struct page *page; - void *addr; + int nr_pages; int i; - flags |= cachep->gfpflags; #ifndef CONFIG_MMU - /* nommu uses slab's for process anonymous memory allocations, so - * requires __GFP_COMP to properly refcount higher order allocations" + /* + * Nommu uses slab's for process anonymous memory allocations, and thus + * requires __GFP_COMP to properly refcount higher order allocations */ - page = alloc_pages_node(nodeid, (flags | __GFP_COMP), cachep->gfporder); -#else - page = alloc_pages_node(nodeid, flags, cachep->gfporder); + flags |= __GFP_COMP; #endif + flags |= cachep->gfpflags; + + page = alloc_pages_node(nodeid, flags, cachep->gfporder); if (!page) return NULL; - addr = page_address(page); - i = (1 << cachep->gfporder); + nr_pages = (1 << cachep->gfporder); if (cachep->flags & SLAB_RECLAIM_ACCOUNT) - atomic_add(i, &slab_reclaim_pages); - add_page_state(nr_slab, i); - while (i--) { - __SetPageSlab(page); - page++; - } - return addr; + atomic_add(nr_pages, &slab_reclaim_pages); + add_zone_page_state(page_zone(page), NR_SLAB, nr_pages); + for (i = 0; i < nr_pages; i++) + __SetPageSlab(page + i); + return page_address(page); } /* @@ -1486,12 +1595,12 @@ static void kmem_freepages(struct kmem_cache *cachep, void *addr) struct page *page = virt_to_page(addr); const unsigned long nr_freed = i; + sub_zone_page_state(page_zone(page), NR_SLAB, nr_freed); while (i--) { BUG_ON(!PageSlab(page)); __ClearPageSlab(page); page++; } - sub_page_state(nr_slab, nr_freed); if (current->reclaim_state) current->reclaim_state->reclaimed_slab += nr_freed; free_pages((unsigned long)addr, cachep->gfporder); @@ -1557,31 +1666,26 @@ static void poison_obj(struct kmem_cache *cachep, void *addr, unsigned char val) static void dump_line(char *data, int offset, int limit) { int i; - unsigned char total=0, bad_count=0; + unsigned char total = 0, bad_count = 0, errors; printk(KERN_ERR "%03x:", offset); for (i = 0; i < limit; i++) { - if (data[offset+i] != POISON_FREE) { - total += data[offset+i]; - ++bad_count; + if (data[offset + i] != POISON_FREE) { + total += data[offset + i]; + bad_count++; } printk(" %02x", (unsigned char)data[offset + i]); } printk("\n"); + if (bad_count == 1) { - switch (total) { - case POISON_FREE ^ 0x01: - case POISON_FREE ^ 0x02: - case POISON_FREE ^ 0x04: - case POISON_FREE ^ 0x08: - case POISON_FREE ^ 0x10: - case POISON_FREE ^ 0x20: - case POISON_FREE ^ 0x40: - case POISON_FREE ^ 0x80: - printk (KERN_ERR "Single bit error detected. Possibly bad RAM.\n"); + errors = total ^ POISON_FREE; + if (errors && !(errors & (errors-1))) { + printk(KERN_ERR "Single bit error detected. Probably bad RAM.\n"); #ifdef CONFIG_X86 - printk (KERN_ERR "Run memtest86 or other memory test tool.\n"); + printk(KERN_ERR "Run memtest86+ or a similar memory test tool.\n"); +#else + printk(KERN_ERR "Run a memory test tool.\n"); #endif - return; } } } @@ -1937,8 +2041,7 @@ kmem_cache_create (const char *name, size_t size, size_t align, void (*dtor)(void*, struct kmem_cache *, unsigned long)) { size_t left_over, slab_size, ralign; - struct kmem_cache *cachep = NULL; - struct list_head *p; + struct kmem_cache *cachep = NULL, *pc; /* * Sanity checks... these are all serious usage bugs. @@ -1958,8 +2061,7 @@ kmem_cache_create (const char *name, size_t size, size_t align, mutex_lock(&cache_chain_mutex); - list_for_each(p, &cache_chain) { - struct kmem_cache *pc = list_entry(p, struct kmem_cache, next); + list_for_each_entry(pc, &cache_chain, next) { mm_segment_t old_fs = get_fs(); char tmp; int res; @@ -2093,8 +2195,12 @@ kmem_cache_create (const char *name, size_t size, size_t align, #endif #endif - /* Determine if the slab management is 'on' or 'off' slab. */ - if (size >= (PAGE_SIZE >> 3)) + /* + * Determine if the slab management is 'on' or 'off' slab. + * (bootstrapping cannot cope with offslab caches so don't do + * it too early on.) + */ + if ((size >= (PAGE_SIZE >> 3)) && !slab_early_init) /* * Size is large, assume best to place the slab management obj * off-slab (should allow better packing of objs). @@ -2234,32 +2340,45 @@ static void drain_cpu_caches(struct kmem_cache *cachep) } } -static int __node_shrink(struct kmem_cache *cachep, int node) +/* + * Remove slabs from the list of free slabs. + * Specify the number of slabs to drain in tofree. + * + * Returns the actual number of slabs released. + */ +static int drain_freelist(struct kmem_cache *cache, + struct kmem_list3 *l3, int tofree) { + struct list_head *p; + int nr_freed; struct slab *slabp; - struct kmem_list3 *l3 = cachep->nodelists[node]; - int ret; - for (;;) { - struct list_head *p; + nr_freed = 0; + while (nr_freed < tofree && !list_empty(&l3->slabs_free)) { + spin_lock_irq(&l3->list_lock); p = l3->slabs_free.prev; - if (p == &l3->slabs_free) - break; + if (p == &l3->slabs_free) { + spin_unlock_irq(&l3->list_lock); + goto out; + } - slabp = list_entry(l3->slabs_free.prev, struct slab, list); + slabp = list_entry(p, struct slab, list); #if DEBUG BUG_ON(slabp->inuse); #endif list_del(&slabp->list); - - l3->free_objects -= cachep->num; + /* + * Safe to drop the lock. The slab is no longer linked + * to the cache. + */ + l3->free_objects -= cache->num; spin_unlock_irq(&l3->list_lock); - slab_destroy(cachep, slabp); - spin_lock_irq(&l3->list_lock); + slab_destroy(cache, slabp); + nr_freed++; } - ret = !list_empty(&l3->slabs_full) || !list_empty(&l3->slabs_partial); - return ret; +out: + return nr_freed; } static int __cache_shrink(struct kmem_cache *cachep) @@ -2272,11 +2391,13 @@ static int __cache_shrink(struct kmem_cache *cachep) check_irq_on(); for_each_online_node(i) { l3 = cachep->nodelists[i]; - if (l3) { - spin_lock_irq(&l3->list_lock); - ret += __node_shrink(cachep, i); - spin_unlock_irq(&l3->list_lock); - } + if (!l3) + continue; + + drain_freelist(cachep, l3, l3->free_objects); + + ret += !list_empty(&l3->slabs_full) || + !list_empty(&l3->slabs_partial); } return (ret ? 1 : 0); } @@ -2484,23 +2605,28 @@ static void slab_put_obj(struct kmem_cache *cachep, struct slab *slabp, slabp->inuse--; } -static void set_slab_attr(struct kmem_cache *cachep, struct slab *slabp, - void *objp) +/* + * Map pages beginning at addr to the given cache and slab. This is required + * for the slab allocator to be able to lookup the cache and slab of a + * virtual address for kfree, ksize, kmem_ptr_validate, and slab debugging. + */ +static void slab_map_pages(struct kmem_cache *cache, struct slab *slab, + void *addr) { - int i; + int nr_pages; struct page *page; - /* Nasty!!!!!! I hope this is OK. */ - page = virt_to_page(objp); + page = virt_to_page(addr); - i = 1; + nr_pages = 1; if (likely(!PageCompound(page))) - i <<= cachep->gfporder; + nr_pages <<= cache->gfporder; + do { - page_set_cache(page, cachep); - page_set_slab(page, slabp); + page_set_cache(page, cache); + page_set_slab(page, slab); page++; - } while (--i); + } while (--nr_pages); } /* @@ -2572,7 +2698,7 @@ static int cache_grow(struct kmem_cache *cachep, gfp_t flags, int nodeid) goto opps1; slabp->nodeid = nodeid; - set_slab_attr(cachep, slabp, objp); + slab_map_pages(cachep, slabp, objp); cache_init_objs(cachep, slabp, ctor_flags); @@ -2620,6 +2746,28 @@ static void kfree_debugcheck(const void *objp) } } +static inline void verify_redzone_free(struct kmem_cache *cache, void *obj) +{ + unsigned long redzone1, redzone2; + + redzone1 = *dbg_redzone1(cache, obj); + redzone2 = *dbg_redzone2(cache, obj); + + /* + * Redzone is ok. + */ + if (redzone1 == RED_ACTIVE && redzone2 == RED_ACTIVE) + return; + + if (redzone1 == RED_INACTIVE && redzone2 == RED_INACTIVE) + slab_error(cache, "double free detected"); + else + slab_error(cache, "memory outside object was overwritten"); + + printk(KERN_ERR "%p: redzone 1:0x%lx, redzone 2:0x%lx.\n", + obj, redzone1, redzone2); +} + static void *cache_free_debugcheck(struct kmem_cache *cachep, void *objp, void *caller) { @@ -2631,27 +2779,10 @@ static void *cache_free_debugcheck(struct kmem_cache *cachep, void *objp, kfree_debugcheck(objp); page = virt_to_page(objp); - if (page_get_cache(page) != cachep) { - printk(KERN_ERR "mismatch in kmem_cache_free: expected " - "cache %p, got %p\n", - page_get_cache(page), cachep); - printk(KERN_ERR "%p is %s.\n", cachep, cachep->name); - printk(KERN_ERR "%p is %s.\n", page_get_cache(page), - page_get_cache(page)->name); - WARN_ON(1); - } slabp = page_get_slab(page); if (cachep->flags & SLAB_RED_ZONE) { - if (*dbg_redzone1(cachep, objp) != RED_ACTIVE || - *dbg_redzone2(cachep, objp) != RED_ACTIVE) { - slab_error(cachep, "double free, or memory outside" - " object was overwritten"); - printk(KERN_ERR "%p: redzone 1:0x%lx, " - "redzone 2:0x%lx.\n", - objp, *dbg_redzone1(cachep, objp), - *dbg_redzone2(cachep, objp)); - } + verify_redzone_free(cachep, objp); *dbg_redzone1(cachep, objp) = RED_INACTIVE; *dbg_redzone2(cachep, objp) = RED_INACTIVE; } @@ -3111,41 +3242,9 @@ static inline void __cache_free(struct kmem_cache *cachep, void *objp) check_irq_off(); objp = cache_free_debugcheck(cachep, objp, __builtin_return_address(0)); - /* Make sure we are not freeing a object from another - * node to the array cache on this cpu. - */ -#ifdef CONFIG_NUMA - { - struct slab *slabp; - slabp = virt_to_slab(objp); - if (unlikely(slabp->nodeid != numa_node_id())) { - struct array_cache *alien = NULL; - int nodeid = slabp->nodeid; - struct kmem_list3 *l3; - - l3 = cachep->nodelists[numa_node_id()]; - STATS_INC_NODEFREES(cachep); - if (l3->alien && l3->alien[nodeid]) { - alien = l3->alien[nodeid]; - spin_lock(&alien->lock); - if (unlikely(alien->avail == alien->limit)) { - STATS_INC_ACOVERFLOW(cachep); - __drain_alien_cache(cachep, - alien, nodeid); - } - alien->entry[alien->avail++] = objp; - spin_unlock(&alien->lock); - } else { - spin_lock(&(cachep->nodelists[nodeid])-> - list_lock); - free_block(cachep, &objp, 1, nodeid); - spin_unlock(&(cachep->nodelists[nodeid])-> - list_lock); - } - return; - } - } -#endif + if (cache_free_alien(cachep, objp)) + return; + if (likely(ac->avail < ac->limit)) { STATS_INC_FREEHIT(cachep); ac->entry[ac->avail++] = objp; @@ -3172,7 +3271,7 @@ void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags) EXPORT_SYMBOL(kmem_cache_alloc); /** - * kmem_cache_alloc - Allocate an object. The memory is set to zero. + * kmem_cache_zalloc - Allocate an object. The memory is set to zero. * @cache: The cache to allocate from. * @flags: See kmalloc(). * @@ -3278,26 +3377,10 @@ EXPORT_SYMBOL(kmalloc_node); #endif /** - * kmalloc - allocate memory + * __do_kmalloc - allocate memory * @size: how many bytes of memory are required. - * @flags: the type of memory to allocate. + * @flags: the type of memory to allocate (see kmalloc). * @caller: function caller for debug tracking of the caller - * - * kmalloc is the normal method of allocating memory - * in the kernel. - * - * The @flags argument may be one of: - * - * %GFP_USER - Allocate memory on behalf of user. May sleep. - * - * %GFP_KERNEL - Allocate normal kernel ram. May sleep. - * - * %GFP_ATOMIC - Allocation will not sleep. Use inside interrupt handlers. - * - * Additionally, the %GFP_DMA flag may be set to indicate the memory - * must be suitable for DMA. This can mean different things on different - * platforms. For example, on i386, it means that the memory must come - * from the first 16MB. */ static __always_inline void *__do_kmalloc(size_t size, gfp_t flags, void *caller) @@ -3395,6 +3478,8 @@ void kmem_cache_free(struct kmem_cache *cachep, void *objp) { unsigned long flags; + BUG_ON(virt_to_cache(objp) != cachep); + local_irq_save(flags); __cache_free(cachep, objp); local_irq_restore(flags); @@ -3420,7 +3505,7 @@ void kfree(const void *objp) local_irq_save(flags); kfree_debugcheck(objp); c = virt_to_cache(objp); - mutex_debug_check_no_locks_freed(objp, obj_size(c)); + debug_check_no_locks_freed(objp, obj_size(c)); __cache_free(c, (void *)objp); local_irq_restore(flags); } @@ -3704,7 +3789,7 @@ void drain_array(struct kmem_cache *cachep, struct kmem_list3 *l3, */ static void cache_reap(void *unused) { - struct list_head *walk; + struct kmem_cache *searchp; struct kmem_list3 *l3; int node = numa_node_id(); @@ -3715,13 +3800,7 @@ static void cache_reap(void *unused) return; } - list_for_each(walk, &cache_chain) { - struct kmem_cache *searchp; - struct list_head *p; - int tofree; - struct slab *slabp; - - searchp = list_entry(walk, struct kmem_cache, next); + list_for_each_entry(searchp, &cache_chain, next) { check_irq_on(); /* @@ -3746,47 +3825,22 @@ static void cache_reap(void *unused) drain_array(searchp, l3, l3->shared, 0, node); - if (l3->free_touched) { + if (l3->free_touched) l3->free_touched = 0; - goto next; - } + else { + int freed; - tofree = (l3->free_limit + 5 * searchp->num - 1) / - (5 * searchp->num); - do { - /* - * Do not lock if there are no free blocks. - */ - if (list_empty(&l3->slabs_free)) - break; - - spin_lock_irq(&l3->list_lock); - p = l3->slabs_free.next; - if (p == &(l3->slabs_free)) { - spin_unlock_irq(&l3->list_lock); - break; - } - - slabp = list_entry(p, struct slab, list); - BUG_ON(slabp->inuse); - list_del(&slabp->list); - STATS_INC_REAPED(searchp); - - /* - * Safe to drop the lock. The slab is no longer linked - * to the cache. searchp cannot disappear, we hold - * cache_chain_lock - */ - l3->free_objects -= searchp->num; - spin_unlock_irq(&l3->list_lock); - slab_destroy(searchp, slabp); - } while (--tofree > 0); + freed = drain_freelist(searchp, l3, (l3->free_limit + + 5 * searchp->num - 1) / (5 * searchp->num)); + STATS_ADD_REAPED(searchp, freed); + } next: cond_resched(); } check_irq_on(); mutex_unlock(&cache_chain_mutex); next_reap_node(); + refresh_cpu_vm_stats(smp_processor_id()); /* Set up the next iteration */ schedule_delayed_work(&__get_cpu_var(reap_work), REAPTIMEOUT_CPUC); } @@ -3849,7 +3903,6 @@ static void s_stop(struct seq_file *m, void *p) static int s_show(struct seq_file *m, void *p) { struct kmem_cache *cachep = p; - struct list_head *q; struct slab *slabp; unsigned long active_objs; unsigned long num_objs; @@ -3870,15 +3923,13 @@ static int s_show(struct seq_file *m, void *p) check_irq_on(); spin_lock_irq(&l3->list_lock); - list_for_each(q, &l3->slabs_full) { - slabp = list_entry(q, struct slab, list); + list_for_each_entry(slabp, &l3->slabs_full, list) { if (slabp->inuse != cachep->num && !error) error = "slabs_full accounting error"; active_objs += cachep->num; active_slabs++; } - list_for_each(q, &l3->slabs_partial) { - slabp = list_entry(q, struct slab, list); + list_for_each_entry(slabp, &l3->slabs_partial, list) { if (slabp->inuse == cachep->num && !error) error = "slabs_partial inuse accounting error"; if (!slabp->inuse && !error) @@ -3886,8 +3937,7 @@ static int s_show(struct seq_file *m, void *p) active_objs += slabp->inuse; active_slabs++; } - list_for_each(q, &l3->slabs_free) { - slabp = list_entry(q, struct slab, list); + list_for_each_entry(slabp, &l3->slabs_free, list) { if (slabp->inuse && !error) error = "slabs_free/inuse accounting error"; num_slabs++; @@ -3980,7 +4030,7 @@ ssize_t slabinfo_write(struct file *file, const char __user * buffer, { char kbuf[MAX_SLABINFO_WRITE + 1], *tmp; int limit, batchcount, shared, res; - struct list_head *p; + struct kmem_cache *cachep; if (count > MAX_SLABINFO_WRITE) return -EINVAL; @@ -3999,10 +4049,7 @@ ssize_t slabinfo_write(struct file *file, const char __user * buffer, /* Find the cache in the chain of caches. */ mutex_lock(&cache_chain_mutex); res = -EINVAL; - list_for_each(p, &cache_chain) { - struct kmem_cache *cachep; - - cachep = list_entry(p, struct kmem_cache, next); + list_for_each_entry(cachep, &cache_chain, next) { if (!strcmp(cachep->name, kbuf)) { if (limit < 1 || batchcount < 1 || batchcount > limit || shared < 0) { @@ -4104,7 +4151,6 @@ static void show_symbol(struct seq_file *m, unsigned long address) static int leaks_show(struct seq_file *m, void *p) { struct kmem_cache *cachep = p; - struct list_head *q; struct slab *slabp; struct kmem_list3 *l3; const char *name; @@ -4129,14 +4175,10 @@ static int leaks_show(struct seq_file *m, void *p) check_irq_on(); spin_lock_irq(&l3->list_lock); - list_for_each(q, &l3->slabs_full) { - slabp = list_entry(q, struct slab, list); + list_for_each_entry(slabp, &l3->slabs_full, list) handle_slab(n, cachep, slabp); - } - list_for_each(q, &l3->slabs_partial) { - slabp = list_entry(q, struct slab, list); + list_for_each_entry(slabp, &l3->slabs_partial, list) handle_slab(n, cachep, slabp); - } spin_unlock_irq(&l3->list_lock); } name = cachep->name; diff --git a/mm/slob.c b/mm/slob.c index a68255ba4..7b52b20b9 100644 --- a/mm/slob.c +++ b/mm/slob.c @@ -29,7 +29,6 @@ * essentially no allocation space overhead. */ -#include #include #include #include diff --git a/mm/sparse.c b/mm/sparse.c index 100040c0d..86c52ab80 100644 --- a/mm/sparse.c +++ b/mm/sparse.c @@ -1,7 +1,6 @@ /* * sparse memory mappings. */ -#include #include #include #include @@ -45,7 +44,7 @@ static struct mem_section *sparse_index_alloc(int nid) static int sparse_index_init(unsigned long section_nr, int nid) { - static spinlock_t index_init_lock = SPIN_LOCK_UNLOCKED; + static DEFINE_SPINLOCK(index_init_lock); unsigned long root = SECTION_NR_TO_ROOT(section_nr); struct mem_section *section; int ret = 0; @@ -99,6 +98,22 @@ int __section_nr(struct mem_section* ms) return (root_nr * SECTIONS_PER_ROOT) + (ms - root); } +/* + * During early boot, before section_mem_map is used for an actual + * mem_map, we use section_mem_map to store the section's NUMA + * node. This keeps us from having to use another data structure. The + * node information is cleared just before we store the real mem_map. + */ +static inline unsigned long sparse_encode_early_nid(int nid) +{ + return (nid << SECTION_NID_SHIFT); +} + +static inline int sparse_early_nid(struct mem_section *section) +{ + return (section->section_mem_map >> SECTION_NID_SHIFT); +} + /* Record a memory area against a node. */ void memory_present(int nid, unsigned long start, unsigned long end) { @@ -113,7 +128,8 @@ void memory_present(int nid, unsigned long start, unsigned long end) ms = __nr_to_section(section); if (!ms->section_mem_map) - ms->section_mem_map = SECTION_MARKED_PRESENT; + ms->section_mem_map = sparse_encode_early_nid(nid) | + SECTION_MARKED_PRESENT; } } @@ -164,6 +180,7 @@ static int sparse_init_one_section(struct mem_section *ms, if (!valid_section(ms)) return -EINVAL; + ms->section_mem_map &= ~SECTION_MAP_MASK; ms->section_mem_map |= sparse_encode_mem_map(mem_map, pnum); return 1; @@ -172,8 +189,8 @@ static int sparse_init_one_section(struct mem_section *ms, static struct page *sparse_early_mem_map_alloc(unsigned long pnum) { struct page *map; - int nid = early_pfn_to_nid(section_nr_to_pfn(pnum)); struct mem_section *ms = __nr_to_section(pnum); + int nid = sparse_early_nid(ms); map = alloc_remap(nid, sizeof(struct page) * PAGES_PER_SECTION); if (map) diff --git a/mm/swap.c b/mm/swap.c index 88895c249..687686a61 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -54,6 +54,26 @@ void put_page(struct page *page) } EXPORT_SYMBOL(put_page); +/** + * put_pages_list(): release a list of pages + * + * Release a list of pages which are strung together on page.lru. Currently + * used by read_cache_pages() and related error recovery code. + * + * @pages: list of pages threaded on page->lru + */ +void put_pages_list(struct list_head *pages) +{ + while (!list_empty(pages)) { + struct page *victim; + + victim = list_entry(pages->prev, struct page, lru); + list_del(&victim->lru); + page_cache_release(victim); + } +} +EXPORT_SYMBOL(put_pages_list); + /* * Writeback is about to end against a page which has been marked for immediate * reclaim. If it still appears to be reclaimable, move it to the tail of the @@ -86,9 +106,8 @@ int rotate_reclaimable_page(struct page *page) zone = page_zone(page); spin_lock_irqsave(&zone->lru_lock, flags); if (PageLRU(page) && !PageActive(page)) { - list_del(&page->lru); - list_add_tail(&page->lru, &zone->inactive_list); - inc_page_state(pgrotated); + list_move_tail(&page->lru, &zone->inactive_list); + __count_vm_event(PGROTATED); } if (!test_clear_page_writeback(page)) BUG(); @@ -108,7 +127,7 @@ void fastcall activate_page(struct page *page) del_page_from_inactive_list(zone, page); SetPageActive(page); add_page_to_active_list(zone, page); - inc_page_state(pgactivate); + __count_vm_event(PGACTIVATE); } spin_unlock_irq(&zone->lru_lock); } @@ -480,48 +499,6 @@ static int cpu_swap_callback(struct notifier_block *nfb, #endif /* CONFIG_HOTPLUG_CPU */ #endif /* CONFIG_SMP */ -#ifdef CONFIG_SMP -void percpu_counter_mod(struct percpu_counter *fbc, long amount) -{ - long count; - long *pcount; - int cpu = get_cpu(); - - pcount = per_cpu_ptr(fbc->counters, cpu); - count = *pcount + amount; - if (count >= FBC_BATCH || count <= -FBC_BATCH) { - spin_lock(&fbc->lock); - fbc->count += count; - *pcount = 0; - spin_unlock(&fbc->lock); - } else { - *pcount = count; - } - put_cpu(); -} -EXPORT_SYMBOL(percpu_counter_mod); - -/* - * Add up all the per-cpu counts, return the result. This is a more accurate - * but much slower version of percpu_counter_read_positive() - */ -long percpu_counter_sum(struct percpu_counter *fbc) -{ - long ret; - int cpu; - - spin_lock(&fbc->lock); - ret = fbc->count; - for_each_possible_cpu(cpu) { - long *pcount = per_cpu_ptr(fbc->counters, cpu); - ret += *pcount; - } - spin_unlock(&fbc->lock); - return ret < 0 ? 0 : ret; -} -EXPORT_SYMBOL(percpu_counter_sum); -#endif - /* * Perform any setup for the swap system */ diff --git a/mm/swap_state.c b/mm/swap_state.c index e0e1583f3..5f7cf2a4c 100644 --- a/mm/swap_state.c +++ b/mm/swap_state.c @@ -24,7 +24,7 @@ * vmscan's shrink_list, to make sync_page look nicer, and to allow * future use of radix_tree tags in the swap cache. */ -static struct address_space_operations swap_aops = { +static const struct address_space_operations swap_aops = { .writepage = swap_writepage, .sync_page = block_sync_page, .set_page_dirty = __set_page_dirty_nobuffers, @@ -38,7 +38,7 @@ static struct backing_dev_info swap_backing_dev_info = { struct address_space swapper_space = { .page_tree = RADIX_TREE_INIT(GFP_ATOMIC|__GFP_NOWARN), - .tree_lock = RW_LOCK_UNLOCKED, + .tree_lock = __RW_LOCK_UNLOCKED(swapper_space.tree_lock), .a_ops = &swap_aops, .i_mmap_nonlinear = LIST_HEAD_INIT(swapper_space.i_mmap_nonlinear), .backing_dev_info = &swap_backing_dev_info, @@ -87,7 +87,7 @@ static int __add_to_swap_cache(struct page *page, swp_entry_t entry, SetPageSwapCache(page); set_page_private(page, entry.val); total_swapcache_pages++; - pagecache_acct(1); + __inc_zone_page_state(page, NR_FILE_PAGES); } write_unlock_irq(&swapper_space.tree_lock); radix_tree_preload_end(); @@ -132,7 +132,7 @@ void __delete_from_swap_cache(struct page *page) set_page_private(page, 0); ClearPageSwapCache(page); total_swapcache_pages--; - pagecache_acct(-1); + __dec_zone_page_state(page, NR_FILE_PAGES); INC_CACHE_INFO(del_total); } diff --git a/mm/swapfile.c b/mm/swapfile.c index a3bed3ff3..e6a6a5b9c 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -5,7 +5,6 @@ * Swap reorganised 29.12.95, Stephen Tweedie */ -#include #include #include #include @@ -396,6 +395,9 @@ void free_swap_and_cache(swp_entry_t entry) struct swap_info_struct * p; struct page *page = NULL; + if (is_migration_entry(entry)) + return; + p = swap_info_get(entry); if (p) { if (swap_entry_free(p, swp_offset(entry)) == 1) { @@ -617,15 +619,6 @@ static int unuse_mm(struct mm_struct *mm, return 0; } -#ifdef CONFIG_MIGRATION -int remove_vma_swap(struct vm_area_struct *vma, struct page *page) -{ - swp_entry_t entry = { .val = page_private(page) }; - - return unuse_vma(vma, entry, page); -} -#endif - /* * Scan swap_map from current position to next entry still in use. * Recycle to start on reaching the end, returning 0 when empty. @@ -718,7 +711,6 @@ static int try_to_unuse(unsigned int type) */ swap_map = &si->swap_map[i]; entry = swp_entry(type, i); -again: page = read_swap_cache_async(entry, NULL, 0); if (!page) { /* @@ -753,12 +745,6 @@ again: wait_on_page_locked(page); wait_on_page_writeback(page); lock_page(page); - if (!PageSwapCache(page)) { - /* Page migration has occured */ - unlock_page(page); - page_cache_release(page); - goto again; - } wait_on_page_writeback(page); /* @@ -787,10 +773,8 @@ again: while (*swap_map > 1 && !retval && (p = p->next) != &start_mm->mmlist) { mm = list_entry(p, struct mm_struct, mmlist); - if (atomic_inc_return(&mm->mm_users) == 1) { - atomic_dec(&mm->mm_users); + if (!atomic_inc_not_zero(&mm->mm_users)) continue; - } spin_unlock(&mmlist_lock); mmput(prev_mm); prev_mm = mm; @@ -1409,19 +1393,7 @@ asmlinkage long sys_swapon(const char __user * specialfile, int swap_flags) if (!(p->flags & SWP_USED)) break; error = -EPERM; - /* - * Test if adding another swap device is possible. There are - * two limiting factors: 1) the number of bits for the swap - * type swp_entry_t definition and 2) the number of bits for - * the swap type in the swap ptes as defined by the different - * architectures. To honor both limitations a swap entry - * with swap offset 0 and swap type ~0UL is created, encoded - * to a swap pte, decoded to a swp_entry_t again and finally - * the swap type part is extracted. This will mask all bits - * from the initial ~0UL that can't be encoded in either the - * swp_entry_t or the architecture definition of a swap pte. - */ - if (type > swp_type(pte_to_swp_entry(swp_entry_to_pte(swp_entry(~0UL,0))))) { + if (type >= MAX_SWAPFILES) { spin_unlock(&swap_lock); goto out; } @@ -1506,8 +1478,7 @@ asmlinkage long sys_swapon(const char __user * specialfile, int swap_flags) error = -EINVAL; goto bad_swap; } - page = read_cache_page(mapping, 0, - (filler_t *)mapping->a_ops->readpage, swap_file); + page = read_mapping_page(mapping, 0, swap_file); if (IS_ERR(page)) { error = PTR_ERR(page); goto bad_swap; @@ -1713,6 +1684,9 @@ int swap_duplicate(swp_entry_t entry) unsigned long offset, type; int result = 0; + if (is_migration_entry(entry)) + return 1; + type = swp_type(entry); if (type >= nr_swapfiles) goto bad_file; diff --git a/mm/tiny-shmem.c b/mm/tiny-shmem.c index f9d6a9cc9..5f2cbf0f1 100644 --- a/mm/tiny-shmem.c +++ b/mm/tiny-shmem.c @@ -12,7 +12,6 @@ #include #include -#include #include #include #include @@ -33,9 +32,6 @@ static int __init init_tmpfs(void) { BUG_ON(register_filesystem(&tmpfs_fs_type) != 0); -#ifdef CONFIG_TMPFS - devfs_mk_dir("shm"); -#endif shm_mnt = kern_mount(&tmpfs_fs_type); BUG_ON(IS_ERR(shm_mnt)); diff --git a/mm/truncate.c b/mm/truncate.c index 993844fef..6772c4172 100644 --- a/mm/truncate.c +++ b/mm/truncate.c @@ -68,10 +68,10 @@ invalidate_complete_page(struct address_space *mapping, struct page *page) return 0; write_lock_irq(&mapping->tree_lock); - if (PageDirty(page)) { - write_unlock_irq(&mapping->tree_lock); - return 0; - } + if (PageDirty(page)) + goto failed; + if (page_count(page) != 2) /* caller's ref + pagecache ref */ + goto failed; BUG_ON(PagePrivate(page)); __remove_from_page_cache(page); @@ -79,6 +79,9 @@ invalidate_complete_page(struct address_space *mapping, struct page *page) ClearPageUptodate(page); page_cache_release(page); /* pagecache ref */ return 1; +failed: + write_unlock_irq(&mapping->tree_lock); + return 0; } /** @@ -230,14 +233,24 @@ unsigned long invalidate_mapping_pages(struct address_space *mapping, pagevec_lookup(&pvec, mapping, next, PAGEVEC_SIZE)) { for (i = 0; i < pagevec_count(&pvec); i++) { struct page *page = pvec.pages[i]; + pgoff_t index; + int lock_failed; - if (TestSetPageLocked(page)) { - next++; - continue; - } - if (page->index > next) - next = page->index; + lock_failed = TestSetPageLocked(page); + + /* + * We really shouldn't be looking at the ->index of an + * unlocked page. But we're not allowed to lock these + * pages. So we rely upon nobody altering the ->index + * of this (pinned-by-us) page. + */ + index = page->index; + if (index > next) + next = index; next++; + if (lock_failed) + continue; + if (PageDirty(page) || PageWriteback(page)) goto unlock; if (page_mapped(page)) @@ -259,9 +272,39 @@ unsigned long invalidate_inode_pages(struct address_space *mapping) { return invalidate_mapping_pages(mapping, 0, ~0UL); } - EXPORT_SYMBOL(invalidate_inode_pages); +/* + * This is like invalidate_complete_page(), except it ignores the page's + * refcount. We do this because invalidate_inode_pages2() needs stronger + * invalidation guarantees, and cannot afford to leave pages behind because + * shrink_list() has a temp ref on them, or because they're transiently sitting + * in the lru_cache_add() pagevecs. + */ +static int +invalidate_complete_page2(struct address_space *mapping, struct page *page) +{ + if (page->mapping != mapping) + return 0; + + if (PagePrivate(page) && !try_to_release_page(page, GFP_KERNEL)) + return 0; + + write_lock_irq(&mapping->tree_lock); + if (PageDirty(page)) + goto failed; + + BUG_ON(PagePrivate(page)); + __remove_from_page_cache(page); + write_unlock_irq(&mapping->tree_lock); + ClearPageUptodate(page); + page_cache_release(page); /* pagecache ref */ + return 1; +failed: + write_unlock_irq(&mapping->tree_lock); + return 0; +} + /** * invalidate_inode_pages2_range - remove range of pages from an address_space * @mapping: the address_space @@ -328,7 +371,7 @@ int invalidate_inode_pages2_range(struct address_space *mapping, } } was_dirty = test_clear_page_dirty(page); - if (!invalidate_complete_page(mapping, page)) { + if (!invalidate_complete_page2(mapping, page)) { if (was_dirty) set_page_dirty(page); ret = -EIO; diff --git a/mm/vmalloc.c b/mm/vmalloc.c index c0504f1e3..266162d2b 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -256,6 +256,19 @@ struct vm_struct *get_vm_area_node(unsigned long size, unsigned long flags, int return __get_vm_area_node(size, flags, VMALLOC_START, VMALLOC_END, node); } +/* Caller must hold vmlist_lock */ +static struct vm_struct *__find_vm_area(void *addr) +{ + struct vm_struct *tmp; + + for (tmp = vmlist; tmp != NULL; tmp = tmp->next) { + if (tmp->addr == addr) + break; + } + + return tmp; +} + /* Caller must hold vmlist_lock */ struct vm_struct *__remove_vm_area(void *addr) { @@ -317,6 +330,8 @@ void __vunmap(void *addr, int deallocate_pages) return; } + debug_check_no_locks_freed(addr, area->size); + if (deallocate_pages) { int i; @@ -325,7 +340,7 @@ void __vunmap(void *addr, int deallocate_pages) __free_page(area->pages[i]); } - if (area->nr_pages > PAGE_SIZE/sizeof(struct page *)) + if (area->flags & VM_VPAGES) vfree(area->pages); else kfree(area->pages); @@ -412,9 +427,10 @@ void *__vmalloc_area_node(struct vm_struct *area, gfp_t gfp_mask, area->nr_pages = nr_pages; /* Please note that the recursion is strictly bounded. */ - if (array_size > PAGE_SIZE) + if (array_size > PAGE_SIZE) { pages = __vmalloc_node(array_size, gfp_mask, PAGE_KERNEL, node); - else + area->flags |= VM_VPAGES; + } else pages = kmalloc_node(array_size, (gfp_mask & ~__GFP_HIGHMEM), node); area->pages = pages; if (!area->pages) { @@ -498,10 +514,32 @@ EXPORT_SYMBOL(__vmalloc); */ void *vmalloc(unsigned long size) { - return __vmalloc(size, GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL); + return __vmalloc(size, GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL); } EXPORT_SYMBOL(vmalloc); +/** + * vmalloc_user - allocate virtually contiguous memory which has + * been zeroed so it can be mapped to userspace without + * leaking data. + * + * @size: allocation size + */ +void *vmalloc_user(unsigned long size) +{ + struct vm_struct *area; + void *ret; + + ret = __vmalloc(size, GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO, PAGE_KERNEL); + write_lock(&vmlist_lock); + area = __find_vm_area(ret); + area->flags |= VM_USERMAP; + write_unlock(&vmlist_lock); + + return ret; +} +EXPORT_SYMBOL(vmalloc_user); + /** * vmalloc_node - allocate memory on a specific node * @@ -516,7 +554,7 @@ EXPORT_SYMBOL(vmalloc); */ void *vmalloc_node(unsigned long size, int node) { - return __vmalloc_node(size, GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL, node); + return __vmalloc_node(size, GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL, node); } EXPORT_SYMBOL(vmalloc_node); @@ -556,6 +594,28 @@ void *vmalloc_32(unsigned long size) } EXPORT_SYMBOL(vmalloc_32); +/** + * vmalloc_32_user - allocate virtually contiguous memory (32bit + * addressable) which is zeroed so it can be + * mapped to userspace without leaking data. + * + * @size: allocation size + */ +void *vmalloc_32_user(unsigned long size) +{ + struct vm_struct *area; + void *ret; + + ret = __vmalloc(size, GFP_KERNEL | __GFP_ZERO, PAGE_KERNEL); + write_lock(&vmlist_lock); + area = __find_vm_area(ret); + area->flags |= VM_USERMAP; + write_unlock(&vmlist_lock); + + return ret; +} +EXPORT_SYMBOL(vmalloc_32_user); + long vread(char *buf, char *addr, unsigned long count) { struct vm_struct *tmp; @@ -630,3 +690,64 @@ finished: read_unlock(&vmlist_lock); return buf - buf_start; } + +/** + * remap_vmalloc_range - map vmalloc pages to userspace + * + * @vma: vma to cover (map full range of vma) + * @addr: vmalloc memory + * @pgoff: number of pages into addr before first page to map + * @returns: 0 for success, -Exxx on failure + * + * This function checks that addr is a valid vmalloc'ed area, and + * that it is big enough to cover the vma. Will return failure if + * that criteria isn't met. + * + * Similar to remap_pfn_range (see mm/memory.c) + */ +int remap_vmalloc_range(struct vm_area_struct *vma, void *addr, + unsigned long pgoff) +{ + struct vm_struct *area; + unsigned long uaddr = vma->vm_start; + unsigned long usize = vma->vm_end - vma->vm_start; + int ret; + + if ((PAGE_SIZE-1) & (unsigned long)addr) + return -EINVAL; + + read_lock(&vmlist_lock); + area = __find_vm_area(addr); + if (!area) + goto out_einval_locked; + + if (!(area->flags & VM_USERMAP)) + goto out_einval_locked; + + if (usize + (pgoff << PAGE_SHIFT) > area->size - PAGE_SIZE) + goto out_einval_locked; + read_unlock(&vmlist_lock); + + addr += pgoff << PAGE_SHIFT; + do { + struct page *page = vmalloc_to_page(addr); + ret = vm_insert_page(vma, uaddr, page); + if (ret) + return ret; + + uaddr += PAGE_SIZE; + addr += PAGE_SIZE; + usize -= PAGE_SIZE; + } while (usize > 0); + + /* Prevent "things" like memory migration? VM_flags need a cleanup... */ + vma->vm_flags |= VM_RESERVED; + + return ret; + +out_einval_locked: + read_unlock(&vmlist_lock); + return -EINVAL; +} +EXPORT_SYMBOL(remap_vmalloc_range); + diff --git a/mm/vmscan.c b/mm/vmscan.c index 840092d46..37951bacb 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -46,8 +47,6 @@ struct scan_control { /* Incremented by the number of inactive pages that were scanned */ unsigned long nr_scanned; - unsigned long nr_mapped; /* From page_state */ - /* This context's GFP mask */ gfp_t gfp_mask; @@ -61,6 +60,10 @@ struct scan_control { * In this context, it doesn't matter that we scan the * whole list at once. */ int swap_cluster_max; + + int swappiness; + + int all_unreclaimable; }; /* @@ -108,7 +111,7 @@ struct shrinker { * From 0 .. 100. Higher means more swappy. */ int vm_swappiness = 60; -static long total_memory; +long vm_total_pages; /* The total number of pages which the VM controls */ static LIST_HEAD(shrinker_list); static DECLARE_RWSEM(shrinker_rwsem); @@ -214,7 +217,7 @@ unsigned long shrink_slab(unsigned long scanned, gfp_t gfp_mask, break; if (shrink_ret < nr_before) ret += nr_before - shrink_ret; - mod_page_state(slabs_scanned, this_scan); + count_vm_events(SLABS_SCANNED, this_scan); total_scan -= this_scan; cond_resched(); @@ -288,11 +291,23 @@ static void handle_write_error(struct address_space *mapping, unlock_page(page); } +/* possible outcome of pageout() */ +typedef enum { + /* failed to write page out, page is locked */ + PAGE_KEEP, + /* move page to the active list, page is locked */ + PAGE_ACTIVATE, + /* page has been sent to the disk successfully, page is unlocked */ + PAGE_SUCCESS, + /* page is clean and locked */ + PAGE_CLEAN, +} pageout_t; + /* * pageout is called by shrink_page_list() for each dirty page. * Calls ->writepage(). */ -pageout_t pageout(struct page *page, struct address_space *mapping) +static pageout_t pageout(struct page *page, struct address_space *mapping) { /* * If the page is dirty, only perform writeback if that write @@ -337,6 +352,8 @@ pageout_t pageout(struct page *page, struct address_space *mapping) struct writeback_control wbc = { .sync_mode = WB_SYNC_NONE, .nr_to_write = SWAP_CLUSTER_MAX, + .range_start = 0, + .range_end = LLONG_MAX, .nonblocking = 1, .for_reclaim = 1, }; @@ -554,7 +571,7 @@ keep: list_splice(&ret_pages, page_list); if (pagevec_count(&freed_pvec)) __pagevec_release_nonlru(&freed_pvec); - mod_page_state(pgactivate, pgactivate); + count_vm_events(PGACTIVATE, pgactivate); return nr_reclaimed; } @@ -644,11 +661,11 @@ static unsigned long shrink_inactive_list(unsigned long max_scan, nr_reclaimed += nr_freed; local_irq_disable(); if (current_is_kswapd()) { - __mod_page_state_zone(zone, pgscan_kswapd, nr_scan); - __mod_page_state(kswapd_steal, nr_freed); + __count_zone_vm_events(PGSCAN_KSWAPD, zone, nr_scan); + __count_vm_events(KSWAPD_STEAL, nr_freed); } else - __mod_page_state_zone(zone, pgscan_direct, nr_scan); - __mod_page_state_zone(zone, pgsteal, nr_freed); + __count_zone_vm_events(PGSCAN_DIRECT, zone, nr_scan); + __count_vm_events(PGACTIVATE, nr_freed); if (nr_taken == 0) goto done; @@ -680,6 +697,25 @@ done: return nr_reclaimed; } +/* + * We are about to scan this zone at a certain priority level. If that priority + * level is smaller (ie: more urgent) than the previous priority, then note + * that priority level within the zone. This is done so that when the next + * process comes in to scan this zone, it will immediately start out at this + * priority level rather than having to build up its own scanning priority. + * Here, this priority affects only the reclaim-mapped threshold. + */ +static inline void note_zone_scanning_priority(struct zone *zone, int priority) +{ + if (priority < zone->prev_priority) + zone->prev_priority = priority; +} + +static inline int zone_is_near_oom(struct zone *zone) +{ + return zone->pages_scanned >= (zone->nr_active + zone->nr_inactive)*3; +} + /* * This moves pages from the active list to the inactive list. * @@ -698,7 +734,7 @@ done: * But we had to alter page->flags anyway. */ static void shrink_active_list(unsigned long nr_pages, struct zone *zone, - struct scan_control *sc) + struct scan_control *sc, int priority) { unsigned long pgmoved; int pgdeactivate = 0; @@ -715,11 +751,14 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone, long distress; long swap_tendency; + if (zone_is_near_oom(zone)) + goto force_reclaim_mapped; + /* * `distress' is a measure of how much trouble we're having * reclaiming pages. 0 -> no problems. 100 -> great trouble. */ - distress = 100 >> zone->prev_priority; + distress = 100 >> min(zone->prev_priority, priority); /* * The point of this algorithm is to decide when to start @@ -727,7 +766,9 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone, * how much memory * is mapped. */ - mapped_ratio = (sc->nr_mapped * 100) / total_memory; + mapped_ratio = ((global_page_state(NR_FILE_MAPPED) + + global_page_state(NR_ANON_PAGES)) * 100) / + vm_total_pages; /* * Now decide how much we really want to unmap some pages. The @@ -741,13 +782,14 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone, * A 100% value of vm_swappiness overrides this algorithm * altogether. */ - swap_tendency = mapped_ratio / 2 + distress + vm_swappiness; + swap_tendency = mapped_ratio / 2 + distress + sc->swappiness; /* * Now use this metric to decide whether to start moving mapped * memory onto the inactive list. */ if (swap_tendency >= 100) +force_reclaim_mapped: reclaim_mapped = 1; } @@ -824,11 +866,10 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone, } } zone->nr_active += pgmoved; - spin_unlock(&zone->lru_lock); - __mod_page_state_zone(zone, pgrefill, pgscanned); - __mod_page_state(pgdeactivate, pgdeactivate); - local_irq_enable(); + __count_zone_vm_events(PGREFILL, zone, pgscanned); + __count_vm_events(PGDEACTIVATE, pgdeactivate); + spin_unlock_irq(&zone->lru_lock); pagevec_release(&pvec); } @@ -869,7 +910,7 @@ static unsigned long shrink_zone(int priority, struct zone *zone, nr_to_scan = min(nr_active, (unsigned long)sc->swap_cluster_max); nr_active -= nr_to_scan; - shrink_active_list(nr_to_scan, zone, sc); + shrink_active_list(nr_to_scan, zone, sc, priority); } if (nr_inactive) { @@ -909,6 +950,7 @@ static unsigned long shrink_zones(int priority, struct zone **zones, unsigned long nr_reclaimed = 0; int i; + sc->all_unreclaimable = 1; for (i = 0; zones[i] != NULL; i++) { struct zone *zone = zones[i]; @@ -918,13 +960,13 @@ static unsigned long shrink_zones(int priority, struct zone **zones, if (!cpuset_zone_allowed(zone, __GFP_HARDWALL)) continue; - zone->temp_priority = priority; - if (zone->prev_priority > priority) - zone->prev_priority = priority; + note_zone_scanning_priority(zone, priority); if (zone->all_unreclaimable && priority != DEF_PRIORITY) continue; /* Let kswapd poll it */ + sc->all_unreclaimable = 0; + nr_reclaimed += shrink_zone(priority, zone, sc); } return nr_reclaimed; @@ -957,9 +999,10 @@ unsigned long try_to_free_pages(struct zone **zones, gfp_t gfp_mask) .may_writepage = !laptop_mode, .swap_cluster_max = SWAP_CLUSTER_MAX, .may_swap = 1, + .swappiness = vm_swappiness, }; - inc_page_state(allocstall); + count_vm_event(ALLOCSTALL); for (i = 0; zones[i] != NULL; i++) { struct zone *zone = zones[i]; @@ -967,12 +1010,10 @@ unsigned long try_to_free_pages(struct zone **zones, gfp_t gfp_mask) if (!cpuset_zone_allowed(zone, __GFP_HARDWALL)) continue; - zone->temp_priority = DEF_PRIORITY; lru_pages += zone->nr_active + zone->nr_inactive; } for (priority = DEF_PRIORITY; priority >= 0; priority--) { - sc.nr_mapped = read_page_state(nr_mapped); sc.nr_scanned = 0; if (!priority) disable_swap_token(); @@ -1005,14 +1046,27 @@ unsigned long try_to_free_pages(struct zone **zones, gfp_t gfp_mask) if (sc.nr_scanned && priority < DEF_PRIORITY - 2) blk_congestion_wait(WRITE, HZ/10); } + /* top priority shrink_caches still had more to do? don't OOM, then */ + if (!sc.all_unreclaimable || nr_reclaimed) + ret = 1; + out: + /* + * Now that we've scanned all the zones at this priority level, note + * that level within the zone so that the next thread which performs + * scanning of this zone will immediately start out at this priority + * level. This affects only the decision whether or not to bring + * mapped pages onto the inactive list. + */ + if (priority < 0) + priority = 0; for (i = 0; zones[i] != 0; i++) { struct zone *zone = zones[i]; if (!cpuset_zone_allowed(zone, __GFP_HARDWALL)) continue; - zone->prev_priority = zone->temp_priority; + zone->prev_priority = priority; } return ret; } @@ -1021,10 +1075,6 @@ out: * For kswapd, balance_pgdat() will work across all this node's zones until * they are all at pages_high. * - * If `nr_pages' is non-zero then it is the number of pages which are to be - * reclaimed, regardless of the zone occupancies. This is a software suspend - * special. - * * Returns the number of pages which were actually freed. * * There is special handling here for zones which are full of pinned pages. @@ -1042,10 +1092,8 @@ out: * the page allocator fallback scheme to ensure that aging of pages is balanced * across the zones. */ -static unsigned long balance_pgdat(pg_data_t *pgdat, unsigned long nr_pages, - int order) +static unsigned long balance_pgdat(pg_data_t *pgdat, int order) { - unsigned long to_free = nr_pages; int all_zones_ok; int priority; int i; @@ -1055,22 +1103,23 @@ static unsigned long balance_pgdat(pg_data_t *pgdat, unsigned long nr_pages, struct scan_control sc = { .gfp_mask = GFP_KERNEL, .may_swap = 1, - .swap_cluster_max = nr_pages ? nr_pages : SWAP_CLUSTER_MAX, + .swap_cluster_max = SWAP_CLUSTER_MAX, + .swappiness = vm_swappiness, }; + /* + * temp_priority is used to remember the scanning priority at which + * this zone was successfully refilled to free_pages == pages_high. + */ + int temp_priority[MAX_NR_ZONES]; loop_again: total_scanned = 0; nr_reclaimed = 0; sc.may_writepage = !laptop_mode; - sc.nr_mapped = read_page_state(nr_mapped); + count_vm_event(PAGEOUTRUN); - inc_page_state(pageoutrun); - - for (i = 0; i < pgdat->nr_zones; i++) { - struct zone *zone = pgdat->node_zones + i; - - zone->temp_priority = DEF_PRIORITY; - } + for (i = 0; i < pgdat->nr_zones; i++) + temp_priority[i] = DEF_PRIORITY; for (priority = DEF_PRIORITY; priority >= 0; priority--) { int end_zone = 0; /* Inclusive. 0 = ZONE_DMA */ @@ -1082,31 +1131,26 @@ loop_again: all_zones_ok = 1; - if (nr_pages == 0) { - /* - * Scan in the highmem->dma direction for the highest - * zone which needs scanning - */ - for (i = pgdat->nr_zones - 1; i >= 0; i--) { - struct zone *zone = pgdat->node_zones + i; + /* + * Scan in the highmem->dma direction for the highest + * zone which needs scanning + */ + for (i = pgdat->nr_zones - 1; i >= 0; i--) { + struct zone *zone = pgdat->node_zones + i; - if (!populated_zone(zone)) - continue; + if (!populated_zone(zone)) + continue; - if (zone->all_unreclaimable && - priority != DEF_PRIORITY) - continue; + if (zone->all_unreclaimable && priority != DEF_PRIORITY) + continue; - if (!zone_watermark_ok(zone, order, - zone->pages_high, 0, 0)) { - end_zone = i; - goto scan; - } + if (!zone_watermark_ok(zone, order, zone->pages_high, + 0, 0)) { + end_zone = i; + goto scan; } - goto out; - } else { - end_zone = pgdat->nr_zones - 1; } + goto out; scan: for (i = 0; i <= end_zone; i++) { struct zone *zone = pgdat->node_zones + i; @@ -1133,15 +1177,12 @@ scan: if (zone->all_unreclaimable && priority != DEF_PRIORITY) continue; - if (nr_pages == 0) { /* Not software suspend */ - if (!zone_watermark_ok(zone, order, - zone->pages_high, end_zone, 0)) - all_zones_ok = 0; - } - zone->temp_priority = priority; - if (zone->prev_priority > priority) - zone->prev_priority = priority; + if (!zone_watermark_ok(zone, order, zone->pages_high, + end_zone, 0)) + all_zones_ok = 0; + temp_priority[i] = priority; sc.nr_scanned = 0; + note_zone_scanning_priority(zone, priority); nr_reclaimed += shrink_zone(priority, zone, &sc); reclaim_state->reclaimed_slab = 0; nr_slab = shrink_slab(sc.nr_scanned, GFP_KERNEL, @@ -1151,7 +1192,7 @@ scan: if (zone->all_unreclaimable) continue; if (nr_slab == 0 && zone->pages_scanned >= - (zone->nr_active + zone->nr_inactive) * 4) + (zone->nr_active + zone->nr_inactive) * 6) zone->all_unreclaimable = 1; /* * If we've done a decent amount of scanning and @@ -1162,8 +1203,6 @@ scan: total_scanned > nr_reclaimed + nr_reclaimed / 2) sc.may_writepage = 1; } - if (nr_pages && to_free > nr_reclaimed) - continue; /* swsusp: need to do more work */ if (all_zones_ok) break; /* kswapd: all done */ /* @@ -1179,14 +1218,19 @@ scan: * matches the direct reclaim path behaviour in terms of impact * on zone->*_priority. */ - if ((nr_reclaimed >= SWAP_CLUSTER_MAX) && !nr_pages) + if (nr_reclaimed >= SWAP_CLUSTER_MAX) break; } out: + /* + * Note within each zone the priority level at which this zone was + * brought into a happy state. So that the next thread which scans this + * zone will start out at that priority level. + */ for (i = 0; i < pgdat->nr_zones; i++) { struct zone *zone = pgdat->node_zones + i; - zone->prev_priority = zone->temp_priority; + zone->prev_priority = temp_priority[i]; } if (!all_zones_ok) { cond_resched(); @@ -1220,7 +1264,6 @@ static int kswapd(void *p) }; cpumask_t cpumask; - daemonize("kswapd%d", pgdat->node_id); cpumask = node_to_cpumask(pgdat->node_id); if (!cpus_empty(cpumask)) set_cpus_allowed(tsk, cpumask); @@ -1261,7 +1304,7 @@ static int kswapd(void *p) } finish_wait(&pgdat->kswapd_wait, &wait); - balance_pgdat(pgdat, 0, order); + balance_pgdat(pgdat, order); } return 0; } @@ -1290,35 +1333,152 @@ void wakeup_kswapd(struct zone *zone, int order) #ifdef CONFIG_PM /* - * Try to free `nr_pages' of memory, system-wide. Returns the number of freed - * pages. + * Helper function for shrink_all_memory(). Tries to reclaim 'nr_pages' pages + * from LRU lists system-wide, for given pass and priority, and returns the + * number of reclaimed pages + * + * For pass > 3 we also try to shrink the LRU lists that contain a few pages + */ +static unsigned long shrink_all_zones(unsigned long nr_pages, int pass, + int prio, struct scan_control *sc) +{ + struct zone *zone; + unsigned long nr_to_scan, ret = 0; + + for_each_zone(zone) { + + if (!populated_zone(zone)) + continue; + + if (zone->all_unreclaimable && prio != DEF_PRIORITY) + continue; + + /* For pass = 0 we don't shrink the active list */ + if (pass > 0) { + zone->nr_scan_active += (zone->nr_active >> prio) + 1; + if (zone->nr_scan_active >= nr_pages || pass > 3) { + zone->nr_scan_active = 0; + nr_to_scan = min(nr_pages, zone->nr_active); + shrink_active_list(nr_to_scan, zone, sc, prio); + } + } + + zone->nr_scan_inactive += (zone->nr_inactive >> prio) + 1; + if (zone->nr_scan_inactive >= nr_pages || pass > 3) { + zone->nr_scan_inactive = 0; + nr_to_scan = min(nr_pages, zone->nr_inactive); + ret += shrink_inactive_list(nr_to_scan, zone, sc); + if (ret >= nr_pages) + return ret; + } + } + + return ret; +} + +/* + * Try to free `nr_pages' of memory, system-wide, and return the number of + * freed pages. + * + * Rather than trying to age LRUs the aim is to preserve the overall + * LRU order by reclaiming preferentially + * inactive > active > active referenced > active mapped */ unsigned long shrink_all_memory(unsigned long nr_pages) { - pg_data_t *pgdat; - unsigned long nr_to_free = nr_pages; + unsigned long lru_pages, nr_slab; unsigned long ret = 0; - unsigned retry = 2; - struct reclaim_state reclaim_state = { - .reclaimed_slab = 0, + int pass; + struct reclaim_state reclaim_state; + struct zone *zone; + struct scan_control sc = { + .gfp_mask = GFP_KERNEL, + .may_swap = 0, + .swap_cluster_max = nr_pages, + .may_writepage = 1, + .swappiness = vm_swappiness, }; current->reclaim_state = &reclaim_state; -repeat: - for_each_online_pgdat(pgdat) { - unsigned long freed; - - freed = balance_pgdat(pgdat, nr_to_free, 0); - ret += freed; - nr_to_free -= freed; - if ((long)nr_to_free <= 0) + + lru_pages = 0; + for_each_zone(zone) + lru_pages += zone->nr_active + zone->nr_inactive; + + nr_slab = global_page_state(NR_SLAB); + /* If slab caches are huge, it's better to hit them first */ + while (nr_slab >= lru_pages) { + reclaim_state.reclaimed_slab = 0; + shrink_slab(nr_pages, sc.gfp_mask, lru_pages); + if (!reclaim_state.reclaimed_slab) break; + + ret += reclaim_state.reclaimed_slab; + if (ret >= nr_pages) + goto out; + + nr_slab -= reclaim_state.reclaimed_slab; } - if (retry-- && ret < nr_pages) { - blk_congestion_wait(WRITE, HZ/5); - goto repeat; + + /* + * We try to shrink LRUs in 5 passes: + * 0 = Reclaim from inactive_list only + * 1 = Reclaim from active list but don't reclaim mapped + * 2 = 2nd pass of type 1 + * 3 = Reclaim mapped (normal reclaim) + * 4 = 2nd pass of type 3 + */ + for (pass = 0; pass < 5; pass++) { + int prio; + + /* Needed for shrinking slab caches later on */ + if (!lru_pages) + for_each_zone(zone) { + lru_pages += zone->nr_active; + lru_pages += zone->nr_inactive; + } + + /* Force reclaiming mapped pages in the passes #3 and #4 */ + if (pass > 2) { + sc.may_swap = 1; + sc.swappiness = 100; + } + + for (prio = DEF_PRIORITY; prio >= 0; prio--) { + unsigned long nr_to_scan = nr_pages - ret; + + sc.nr_scanned = 0; + ret += shrink_all_zones(nr_to_scan, prio, pass, &sc); + if (ret >= nr_pages) + goto out; + + reclaim_state.reclaimed_slab = 0; + shrink_slab(sc.nr_scanned, sc.gfp_mask, lru_pages); + ret += reclaim_state.reclaimed_slab; + if (ret >= nr_pages) + goto out; + + if (sc.nr_scanned && prio < DEF_PRIORITY - 2) + blk_congestion_wait(WRITE, HZ / 10); + } + + lru_pages = 0; } + + /* + * If ret = 0, we could not shrink LRUs, but there may be something + * in slab caches + */ + if (!ret) + do { + reclaim_state.reclaimed_slab = 0; + shrink_slab(nr_pages, sc.gfp_mask, lru_pages); + ret += reclaim_state.reclaimed_slab; + } while (ret < nr_pages && reclaim_state.reclaimed_slab > 0); + +out: current->reclaim_state = NULL; + return ret; } #endif @@ -1328,7 +1488,7 @@ repeat: not required for correctness. So if the last cpu in a node goes away, we get changed to run anywhere: as the first one comes back, restore their cpu bindings. */ -static int cpu_callback(struct notifier_block *nfb, +static int __devinit cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) { pg_data_t *pgdat; @@ -1346,21 +1506,35 @@ static int cpu_callback(struct notifier_block *nfb, } #endif /* CONFIG_HOTPLUG_CPU */ +/* + * This kswapd start function will be called by init and node-hot-add. + * On node-hot-add, kswapd will moved to proper cpus if cpus are hot-added. + */ +int kswapd_run(int nid) +{ + pg_data_t *pgdat = NODE_DATA(nid); + int ret = 0; + + if (pgdat->kswapd) + return 0; + + pgdat->kswapd = kthread_run(kswapd, pgdat, "kswapd%d", nid); + if (IS_ERR(pgdat->kswapd)) { + /* failure at boot is fatal */ + BUG_ON(system_state == SYSTEM_BOOTING); + printk("Failed to start kswapd on node %d\n",nid); + ret = -1; + } + return ret; +} + static int __init kswapd_init(void) { - pg_data_t *pgdat; + int nid; swap_setup(); - for_each_online_pgdat(pgdat) { - pid_t pid; - - pid = kernel_thread(kswapd, pgdat, CLONE_KERNEL); - BUG_ON(pid < 0); - read_lock(&tasklist_lock); - pgdat->kswapd = find_task_by_real_pid(pid); - read_unlock(&tasklist_lock); - } - total_memory = nr_free_pagecache_pages(); + for_each_online_node(nid) + kswapd_run(nid); hotcpu_notifier(cpu_callback, 0); return 0; } @@ -1373,10 +1547,6 @@ module_init(kswapd_init) * * If non-zero call zone_reclaim when the number of free pages falls below * the watermarks. - * - * In the future we may add flags to the mode. However, the page allocator - * should only have to check that zone_reclaim_mode != 0 before calling - * zone_reclaim(). */ int zone_reclaim_mode __read_mostly; @@ -1384,12 +1554,6 @@ int zone_reclaim_mode __read_mostly; #define RECLAIM_ZONE (1<<0) /* Run shrink_cache on the zone */ #define RECLAIM_WRITE (1<<1) /* Writeout pages during reclaim */ #define RECLAIM_SWAP (1<<2) /* Swap pages out during reclaim */ -#define RECLAIM_SLAB (1<<3) /* Do a global slab shrink if the zone is out of memory */ - -/* - * Mininum time between zone reclaim scans - */ -int zone_reclaim_interval __read_mostly = 30*HZ; /* * Priority for ZONE_RECLAIM. This determines the fraction of pages @@ -1398,6 +1562,18 @@ int zone_reclaim_interval __read_mostly = 30*HZ; */ #define ZONE_RECLAIM_PRIORITY 4 +/* + * Percentage of pages in a zone that must be unmapped for zone_reclaim to + * occur. + */ +int sysctl_min_unmapped_ratio = 1; + +/* + * If the number of slab pages in a zone grows beyond this percentage then + * slab reclaim needs to occur. + */ +int sysctl_min_slab_ratio = 5; + /* * Try to free up some pages from this zone through reclaim. */ @@ -1412,10 +1588,10 @@ static int __zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order) struct scan_control sc = { .may_writepage = !!(zone_reclaim_mode & RECLAIM_WRITE), .may_swap = !!(zone_reclaim_mode & RECLAIM_SWAP), - .nr_mapped = read_page_state(nr_mapped), .swap_cluster_max = max_t(unsigned long, nr_pages, SWAP_CLUSTER_MAX), .gfp_mask = gfp_mask, + .swappiness = vm_swappiness, }; disable_swap_token(); @@ -1429,43 +1605,42 @@ static int __zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order) reclaim_state.reclaimed_slab = 0; p->reclaim_state = &reclaim_state; - /* - * Free memory by calling shrink zone with increasing priorities - * until we have enough memory freed. - */ - priority = ZONE_RECLAIM_PRIORITY; - do { - nr_reclaimed += shrink_zone(priority, zone, &sc); - priority--; - } while (priority >= 0 && nr_reclaimed < nr_pages); + if (zone_page_state(zone, NR_FILE_PAGES) - + zone_page_state(zone, NR_FILE_MAPPED) > + zone->min_unmapped_ratio) { + /* + * Free memory by calling shrink zone with increasing + * priorities until we have enough memory freed. + */ + priority = ZONE_RECLAIM_PRIORITY; + do { + note_zone_scanning_priority(zone, priority); + nr_reclaimed += shrink_zone(priority, zone, &sc); + priority--; + } while (priority >= 0 && nr_reclaimed < nr_pages); + } - if (nr_reclaimed < nr_pages && (zone_reclaim_mode & RECLAIM_SLAB)) { + if (zone_page_state(zone, NR_SLAB) > zone->min_slab_pages) { /* * shrink_slab() does not currently allow us to determine how - * many pages were freed in this zone. So we just shake the slab - * a bit and then go off node for this particular allocation - * despite possibly having freed enough memory to allocate in - * this zone. If we freed local memory then the next - * allocations will be local again. + * many pages were freed in this zone. So we take the current + * number of slab pages and shake the slab until it is reduced + * by the same nr_pages that we used for reclaiming unmapped + * pages. * - * shrink_slab will free memory on all zones and may take - * a long time. + * Note that shrink_slab will free memory on all zones and may + * take a long time. */ - shrink_slab(sc.nr_scanned, gfp_mask, order); + unsigned long limit = zone_page_state(zone, + NR_SLAB) - nr_pages; + + while (shrink_slab(sc.nr_scanned, gfp_mask, order) && + zone_page_state(zone, NR_SLAB) > limit) + ; } p->reclaim_state = NULL; current->flags &= ~(PF_MEMALLOC | PF_SWAPWRITE); - - if (nr_reclaimed == 0) { - /* - * We were unable to reclaim enough pages to stay on node. We - * now allow off node accesses for a certain time period before - * trying again to reclaim pages from the local zone. - */ - zone->last_unsuccessful_zone_reclaim = jiffies; - } - return nr_reclaimed >= nr_pages; } @@ -1475,14 +1650,20 @@ int zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order) int node_id; /* - * Do not reclaim if there was a recent unsuccessful attempt at zone - * reclaim. In that case we let allocations go off node for the - * zone_reclaim_interval. Otherwise we would scan for each off-node - * page allocation. + * Zone reclaim reclaims unmapped file backed pages and + * slab pages if we are over the defined limits. + * + * A small portion of unmapped file backed pages is needed for + * file I/O otherwise pages read by file I/O will be immediately + * thrown out if the zone is overallocated. So we do not reclaim + * if less than a specified percentage of the zone is used by + * unmapped file backed pages. */ - if (time_before(jiffies, - zone->last_unsuccessful_zone_reclaim + zone_reclaim_interval)) - return 0; + if (zone_page_state(zone, NR_FILE_PAGES) - + zone_page_state(zone, NR_FILE_MAPPED) <= zone->min_unmapped_ratio + && zone_page_state(zone, NR_SLAB) + <= zone->min_slab_pages) + return 0; /* * Avoid concurrent zone reclaims, do not reclaim in a zone that does diff --git a/net/802/fc.c b/net/802/fc.c index 282c4ab1a..2a27e37bc 100644 --- a/net/802/fc.c +++ b/net/802/fc.c @@ -10,7 +10,6 @@ * v 1.0 03/22/99 */ -#include #include #include #include diff --git a/net/802/fddi.c b/net/802/fddi.c index ac242a4bc..797c6d961 100644 --- a/net/802/fddi.c +++ b/net/802/fddi.c @@ -26,7 +26,6 @@ * Maciej W. Rozycki : IPv6 support */ -#include #include #include #include diff --git a/net/802/sysctl_net_802.c b/net/802/sysctl_net_802.c index 700129556..ead560373 100644 --- a/net/802/sysctl_net_802.c +++ b/net/802/sysctl_net_802.c @@ -10,7 +10,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include diff --git a/net/802/tr.c b/net/802/tr.c index e9dc803f2..d7d8f40c4 100644 --- a/net/802/tr.c +++ b/net/802/tr.c @@ -17,7 +17,6 @@ #include #include -#include #include #include #include diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c index 729abc439..18fcb9fa5 100644 --- a/net/8021q/vlan.c +++ b/net/8021q/vlan.c @@ -360,6 +360,14 @@ static void vlan_transfer_operstate(const struct net_device *dev, struct net_dev } } +/* + * vlan network devices have devices nesting below it, and are a special + * "super class" of normal network devices; split their locks off into a + * separate class since they always nest. + */ +static struct lock_class_key vlan_netdev_xmit_lock_key; + + /* Attach a VLAN device to a mac address (ie Ethernet Card). * Returns the device that was created, or NULL if there was * an error of some kind. @@ -456,6 +464,7 @@ static struct net_device *register_vlan_device(const char *eth_IF_name, new_dev = alloc_netdev(sizeof(struct vlan_dev_info), name, vlan_setup); + if (new_dev == NULL) goto out_unlock; @@ -468,7 +477,7 @@ static struct net_device *register_vlan_device(const char *eth_IF_name, new_dev->state = (real_dev->state & ((1<<__LINK_STATE_NOCARRIER) | (1<<__LINK_STATE_DORMANT))) | - (1<<__LINK_STATE_PRESENT); + (1<<__LINK_STATE_PRESENT); /* need 4 bytes for extra VLAN header info, * hope the underlying device can handle it. @@ -516,6 +525,8 @@ static struct net_device *register_vlan_device(const char *eth_IF_name, if (register_netdevice(new_dev)) goto out_free_newdev; + lockdep_set_class(&new_dev->_xmit_lock, &vlan_netdev_xmit_lock_key); + new_dev->iflink = real_dev->ifindex; vlan_transfer_operstate(real_dev, new_dev); linkwatch_fire_event(new_dev); /* _MUST_ call rfc2863_policy() */ @@ -529,12 +540,11 @@ static struct net_device *register_vlan_device(const char *eth_IF_name, * so it cannot "appear" on us. */ if (!grp) { /* need to add a new group */ - grp = kmalloc(sizeof(struct vlan_group), GFP_KERNEL); + grp = kzalloc(sizeof(struct vlan_group), GFP_KERNEL); if (!grp) goto out_free_unregister; /* printk(KERN_ALERT "VLAN REGISTER: Allocated new group.\n"); */ - memset(grp, 0, sizeof(struct vlan_group)); grp->real_dev_ifindex = real_dev->ifindex; hlist_add_head_rcu(&grp->hlist, diff --git a/net/8021q/vlanproc.c b/net/8021q/vlanproc.c index 7b214cffc..a8fc0de1f 100644 --- a/net/8021q/vlanproc.c +++ b/net/8021q/vlanproc.c @@ -17,7 +17,6 @@ * Jan 20, 1998 Ben Greear Initial Version *****************************************************************************/ -#include #include #include /* offsetof(), etc. */ #include /* return codes */ diff --git a/net/Kconfig b/net/Kconfig index 79328dda7..705e6793c 100644 --- a/net/Kconfig +++ b/net/Kconfig @@ -66,6 +66,13 @@ source "net/ipv6/Kconfig" endif # if INET +config NETWORK_SECMARK + bool "Security Marking" + help + This enables security marking of network packets, similar + to nfmark, but designated for security purposes. + If you are unsure how to answer this question, answer N. + menuconfig NETFILTER bool "Network packet filtering (replaces ipchains)" ---help--- @@ -185,7 +192,7 @@ source "net/lapb/Kconfig" config NET_DIVERT bool "Frame Diverter (EXPERIMENTAL)" - depends on EXPERIMENTAL + depends on EXPERIMENTAL && BROKEN ---help--- The Frame Diverter allows you to divert packets from the network, that are not aimed at the interface receiving it (in @@ -230,6 +237,21 @@ config NET_PKTGEN To compile this code as a module, choose M here: the module will be called pktgen. +config NET_TCPPROBE + tristate "TCP connection probing" + depends on INET && EXPERIMENTAL && PROC_FS && KPROBES + ---help--- + This module allows for capturing the changes to TCP connection + state in response to incoming packets. It is used for debugging + TCP congestion avoidance modules. If you don't understand + what was just said, you don't need it: say N. + + Documentation on how to use the packet generator can be found + at http://linux-net.osdl.org/index.php/TcpProbe + + To compile this code as a module, choose M here: the + module will be called tcp_probe. + endmenu endmenu diff --git a/net/appletalk/aarp.c b/net/appletalk/aarp.c index 7076097de..f3777ec5b 100644 --- a/net/appletalk/aarp.c +++ b/net/appletalk/aarp.c @@ -29,7 +29,6 @@ * */ -#include #include #include #include diff --git a/net/appletalk/atalk_proc.c b/net/appletalk/atalk_proc.c index dc4048dd9..7ae4916cd 100644 --- a/net/appletalk/atalk_proc.c +++ b/net/appletalk/atalk_proc.c @@ -8,7 +8,6 @@ * Free Software Foundation, version 2. */ -#include #include #include #include diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c index 7b1eb9a4f..96dc6bb52 100644 --- a/net/appletalk/ddp.c +++ b/net/appletalk/ddp.c @@ -51,7 +51,6 @@ * */ -#include #include #include #include @@ -228,12 +227,11 @@ static void atif_drop_device(struct net_device *dev) static struct atalk_iface *atif_add_device(struct net_device *dev, struct atalk_addr *sa) { - struct atalk_iface *iface = kmalloc(sizeof(*iface), GFP_KERNEL); + struct atalk_iface *iface = kzalloc(sizeof(*iface), GFP_KERNEL); if (!iface) goto out; - memset(iface, 0, sizeof(*iface)); dev_hold(dev); iface->dev = dev; dev->atalk_ptr = iface; @@ -560,12 +558,11 @@ static int atrtr_create(struct rtentry *r, struct net_device *devhint) } if (!rt) { - rt = kmalloc(sizeof(*rt), GFP_ATOMIC); + rt = kzalloc(sizeof(*rt), GFP_ATOMIC); retval = -ENOBUFS; if (!rt) goto out_unlock; - memset(rt, 0, sizeof(*rt)); rt->next = atalk_routes; atalk_routes = rt; diff --git a/net/appletalk/sysctl_net_atalk.c b/net/appletalk/sysctl_net_atalk.c index af7f06043..40b0af743 100644 --- a/net/appletalk/sysctl_net_atalk.c +++ b/net/appletalk/sysctl_net_atalk.c @@ -6,7 +6,6 @@ * Dynamic registration, added aarp entries. (5/30/97 Chris Horn) */ -#include #include #include #include diff --git a/net/atm/Makefile b/net/atm/Makefile index d5818751f..89656d6c0 100644 --- a/net/atm/Makefile +++ b/net/atm/Makefile @@ -2,7 +2,7 @@ # Makefile for the ATM Protocol Families. # -atm-y := addr.o pvc.o signaling.o svc.o ioctl.o common.o atm_misc.o raw.o resources.o +atm-y := addr.o pvc.o signaling.o svc.o ioctl.o common.o atm_misc.o raw.o resources.o atm_sysfs.o mpoa-objs := mpc.o mpoa_caches.o mpoa_proc.o obj-$(CONFIG_ATM) += atm.o diff --git a/net/atm/br2684.c b/net/atm/br2684.c index 680ccb12a..d00cca97e 100644 --- a/net/atm/br2684.c +++ b/net/atm/br2684.c @@ -5,7 +5,6 @@ Author: Marcell GAL, 2000, XDSL Ltd, Hungary */ #include -#include #include #include #include @@ -509,10 +508,9 @@ Note: we do not have explicit unassign, but look at _push() if (copy_from_user(&be, arg, sizeof be)) return -EFAULT; - brvcc = kmalloc(sizeof(struct br2684_vcc), GFP_KERNEL); + brvcc = kzalloc(sizeof(struct br2684_vcc), GFP_KERNEL); if (!brvcc) return -ENOMEM; - memset(brvcc, 0, sizeof(struct br2684_vcc)); write_lock_irq(&devs_lock); net_dev = br2684_find_dev(&be.ifspec); if (net_dev == NULL) { diff --git a/net/atm/clip.c b/net/atm/clip.c index 4f44e98f1..7af2c411d 100644 --- a/net/atm/clip.c +++ b/net/atm/clip.c @@ -2,7 +2,6 @@ /* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */ -#include #include #include #include /* for UINT_MAX */ @@ -24,6 +23,7 @@ #include /* for IFF_UP */ #include #include +#include #include #include #include @@ -120,8 +120,8 @@ static void unlink_clip_vcc(struct clip_vcc *clip_vcc) goto out; } printk(KERN_CRIT "ATMARP: unlink_clip_vcc failed (entry %p, vcc " - "0x%p)\n",entry,clip_vcc); -out: + "0x%p)\n", entry, clip_vcc); + out: netif_tx_unlock_bh(entry->neigh->dev); } @@ -267,7 +267,7 @@ static void clip_neigh_destroy(struct neighbour *neigh) DPRINTK("clip_neigh_destroy (neigh %p)\n", neigh); if (NEIGH2ENTRY(neigh)->vccs) printk(KERN_CRIT "clip_neigh_destroy: vccs != NULL !!!\n"); - NEIGH2ENTRY(neigh)->vccs = (void *) 0xdeadbeef; + NEIGH2ENTRY(neigh)->vccs = (void *) NEIGHBOR_DEAD; } static void clip_neigh_solicit(struct neighbour *neigh, struct sk_buff *skb) @@ -500,9 +500,11 @@ static int clip_mkip(struct atm_vcc *vcc, int timeout) } else { unsigned int len = skb->len; + skb_get(skb); clip_push(vcc, skb); PRIV(skb->dev)->stats.rx_packets--; PRIV(skb->dev)->stats.rx_bytes -= len; + kfree_skb(skb); } return 0; } @@ -929,12 +931,11 @@ static int arp_seq_open(struct inode *inode, struct file *file) struct seq_file *seq; int rc = -EAGAIN; - state = kmalloc(sizeof(*state), GFP_KERNEL); + state = kzalloc(sizeof(*state), GFP_KERNEL); if (!state) { rc = -ENOMEM; goto out_kfree; } - memset(state, 0, sizeof(*state)); state->ns.neigh_sub_iter = clip_seq_sub_iter; rc = seq_open(file, &arp_seq_ops); @@ -962,7 +963,6 @@ static struct file_operations arp_seq_fops = { static int __init atm_clip_init(void) { - struct proc_dir_entry *p; neigh_table_init_no_netlink(&clip_tbl); clip_tbl_hook = &clip_tbl; @@ -972,9 +972,15 @@ static int __init atm_clip_init(void) setup_timer(&idle_timer, idle_timer_check, 0); - p = create_proc_entry("arp", S_IRUGO, atm_proc_root); - if (p) - p->proc_fops = &arp_seq_fops; +#ifdef CONFIG_PROC_FS + { + struct proc_dir_entry *p; + + p = create_proc_entry("arp", S_IRUGO, atm_proc_root); + if (p) + p->proc_fops = &arp_seq_fops; + } +#endif return 0; } diff --git a/net/atm/common.c b/net/atm/common.c index ae002220f..fbabff494 100644 --- a/net/atm/common.c +++ b/net/atm/common.c @@ -3,7 +3,6 @@ /* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */ -#include #include #include #include /* struct socket, struct proto_ops */ @@ -791,8 +790,14 @@ static int __init atm_init(void) printk(KERN_ERR "atm_proc_init() failed with %d\n",error); goto out_atmsvc_exit; } + if ((error = atm_sysfs_init()) < 0) { + printk(KERN_ERR "atm_sysfs_init() failed with %d\n",error); + goto out_atmproc_exit; + } out: return error; +out_atmproc_exit: + atm_proc_exit(); out_atmsvc_exit: atmsvc_exit(); out_atmpvc_exit: @@ -805,6 +810,7 @@ out_unregister_vcc_proto: static void __exit atm_exit(void) { atm_proc_exit(); + atm_sysfs_exit(); atmsvc_exit(); atmpvc_exit(); proto_unregister(&vcc_proto); diff --git a/net/atm/common.h b/net/atm/common.h index 4887c317c..a422da778 100644 --- a/net/atm/common.h +++ b/net/atm/common.h @@ -28,6 +28,8 @@ int atmpvc_init(void); void atmpvc_exit(void); int atmsvc_init(void); void atmsvc_exit(void); +int atm_sysfs_init(void); +void atm_sysfs_exit(void); #ifdef CONFIG_PROC_FS int atm_proc_init(void); diff --git a/net/atm/ioctl.c b/net/atm/ioctl.c index 851cfa631..8c2022c3e 100644 --- a/net/atm/ioctl.c +++ b/net/atm/ioctl.c @@ -4,7 +4,6 @@ /* 2003 John Levon */ -#include #include #include #include /* struct socket, struct proto_ops */ diff --git a/net/atm/ipcommon.c b/net/atm/ipcommon.c index 4b1faca50..1d3de42fa 100644 --- a/net/atm/ipcommon.c +++ b/net/atm/ipcommon.c @@ -25,22 +25,27 @@ /* * skb_migrate appends the list at "from" to "to", emptying "from" in the * process. skb_migrate is atomic with respect to all other skb operations on - * "from" and "to". Note that it locks both lists at the same time, so beware - * of potential deadlocks. + * "from" and "to". Note that it locks both lists at the same time, so to deal + * with the lock ordering, the locks are taken in address order. * * This function should live in skbuff.c or skbuff.h. */ -void skb_migrate(struct sk_buff_head *from,struct sk_buff_head *to) +void skb_migrate(struct sk_buff_head *from, struct sk_buff_head *to) { unsigned long flags; struct sk_buff *skb_from = (struct sk_buff *) from; struct sk_buff *skb_to = (struct sk_buff *) to; struct sk_buff *prev; - spin_lock_irqsave(&from->lock,flags); - spin_lock(&to->lock); + if ((unsigned long) from < (unsigned long) to) { + spin_lock_irqsave(&from->lock, flags); + spin_lock_nested(&to->lock, SINGLE_DEPTH_NESTING); + } else { + spin_lock_irqsave(&to->lock, flags); + spin_lock_nested(&from->lock, SINGLE_DEPTH_NESTING); + } prev = from->prev; from->next->prev = to->prev; prev->next = skb_to; @@ -51,7 +56,7 @@ void skb_migrate(struct sk_buff_head *from,struct sk_buff_head *to) from->prev = skb_from; from->next = skb_from; from->qlen = 0; - spin_unlock_irqrestore(&from->lock,flags); + spin_unlock_irqrestore(&from->lock, flags); } diff --git a/net/atm/lec.c b/net/atm/lec.c index c4fc722fe..b4aa48984 100644 --- a/net/atm/lec.c +++ b/net/atm/lec.c @@ -4,7 +4,6 @@ * */ -#include #include #include #include @@ -1812,12 +1811,11 @@ make_entry(struct lec_priv *priv, unsigned char *mac_addr) { struct lec_arp_table *to_return; - to_return = kmalloc(sizeof(struct lec_arp_table), GFP_ATOMIC); + to_return = kzalloc(sizeof(struct lec_arp_table), GFP_ATOMIC); if (!to_return) { printk("LEC: Arp entry kmalloc failed\n"); return NULL; } - memset(to_return, 0, sizeof(struct lec_arp_table)); memcpy(to_return->mac_addr, mac_addr, ETH_ALEN); init_timer(&to_return->timer); to_return->timer.function = lec_arp_expire_arp; diff --git a/net/atm/lec.h b/net/atm/lec.h index 6606082b2..c22a8bfa1 100644 --- a/net/atm/lec.h +++ b/net/atm/lec.h @@ -9,7 +9,6 @@ #ifndef _LEC_H_ #define _LEC_H_ -#include #include #include #include diff --git a/net/atm/mpc.c b/net/atm/mpc.c index c304ef151..00704661e 100644 --- a/net/atm/mpc.c +++ b/net/atm/mpc.c @@ -25,7 +25,6 @@ #include #include /* Modular too */ -#include #include #include "lec.h" @@ -229,20 +228,15 @@ int atm_mpoa_delete_qos(struct atm_mpoa_qos *entry) /* this is buggered - we need locking for qos_head */ void atm_mpoa_disp_qos(struct seq_file *m) { - unsigned char *ip; - char ipaddr[16]; struct atm_mpoa_qos *qos; qos = qos_head; seq_printf(m, "QoS entries for shortcuts:\n"); seq_printf(m, "IP address\n TX:max_pcr pcr min_pcr max_cdv max_sdu\n RX:max_pcr pcr min_pcr max_cdv max_sdu\n"); - ipaddr[sizeof(ipaddr)-1] = '\0'; while (qos != NULL) { - ip = (unsigned char *)&qos->ipaddr; - sprintf(ipaddr, "%u.%u.%u.%u", NIPQUAD(ip)); seq_printf(m, "%u.%u.%u.%u\n %-7d %-7d %-7d %-7d %-7d\n %-7d %-7d %-7d %-7d %-7d\n", - NIPQUAD(ipaddr), + NIPQUAD(qos->ipaddr), qos->qos.txtp.max_pcr, qos->qos.txtp.pcr, qos->qos.txtp.min_pcr, qos->qos.txtp.max_cdv, qos->qos.txtp.max_sdu, qos->qos.rxtp.max_pcr, qos->qos.rxtp.pcr, qos->qos.rxtp.min_pcr, qos->qos.rxtp.max_cdv, qos->qos.rxtp.max_sdu); qos = qos->next; @@ -264,10 +258,9 @@ static struct mpoa_client *alloc_mpc(void) { struct mpoa_client *mpc; - mpc = kmalloc(sizeof (struct mpoa_client), GFP_KERNEL); + mpc = kzalloc(sizeof (struct mpoa_client), GFP_KERNEL); if (mpc == NULL) return NULL; - memset(mpc, 0, sizeof(struct mpoa_client)); rwlock_init(&mpc->ingress_lock); rwlock_init(&mpc->egress_lock); mpc->next = mpcs; @@ -1083,7 +1076,6 @@ static void MPOA_trigger_rcvd(struct k_message *msg, struct mpoa_client *mpc) static void check_qos_and_open_shortcut(struct k_message *msg, struct mpoa_client *client, in_cache_entry *entry) { uint32_t dst_ip = msg->content.in_info.in_dst_ip; - unsigned char *ip __attribute__ ((unused)) = (unsigned char *)&dst_ip; struct atm_mpoa_qos *qos = atm_mpoa_search_qos(dst_ip); eg_cache_entry *eg_entry = client->eg_ops->get_by_src_ip(dst_ip, client); @@ -1097,7 +1089,7 @@ static void check_qos_and_open_shortcut(struct k_message *msg, struct mpoa_clien entry->shortcut = eg_entry->shortcut; } if(entry->shortcut){ - dprintk("mpoa: (%s) using egress SVC to reach %u.%u.%u.%u\n",client->dev->name, NIPQUAD(ip)); + dprintk("mpoa: (%s) using egress SVC to reach %u.%u.%u.%u\n",client->dev->name, NIPQUAD(dst_ip)); client->eg_ops->put(eg_entry); return; } @@ -1119,12 +1111,10 @@ static void check_qos_and_open_shortcut(struct k_message *msg, struct mpoa_clien static void MPOA_res_reply_rcvd(struct k_message *msg, struct mpoa_client *mpc) { - unsigned char *ip; - uint32_t dst_ip = msg->content.in_info.in_dst_ip; in_cache_entry *entry = mpc->in_ops->get(dst_ip, mpc); - ip = (unsigned char *)&dst_ip; - dprintk("mpoa: (%s) MPOA_res_reply_rcvd: ip %u.%u.%u.%u\n", mpc->dev->name, NIPQUAD(ip)); + + dprintk("mpoa: (%s) MPOA_res_reply_rcvd: ip %u.%u.%u.%u\n", mpc->dev->name, NIPQUAD(dst_ip)); ddprintk("mpoa: (%s) MPOA_res_reply_rcvd() entry = %p", mpc->dev->name, entry); if(entry == NULL){ printk("\nmpoa: (%s) ARGH, received res. reply for an entry that doesn't exist.\n", mpc->dev->name); diff --git a/net/atm/mpoa_caches.c b/net/atm/mpoa_caches.c index 64ddebb64..781ed1b93 100644 --- a/net/atm/mpoa_caches.c +++ b/net/atm/mpoa_caches.c @@ -223,7 +223,6 @@ static void in_cache_remove_entry(in_cache_entry *entry, but an easy one... */ static void clear_count_and_expired(struct mpoa_client *client) { - unsigned char *ip; in_cache_entry *entry, *next_entry; struct timeval now; @@ -236,8 +235,7 @@ static void clear_count_and_expired(struct mpoa_client *client) next_entry = entry->next; if((now.tv_sec - entry->tv.tv_sec) > entry->ctrl_info.holding_time){ - ip = (unsigned char*)&entry->ctrl_info.in_dst_ip; - dprintk("mpoa: mpoa_caches.c: holding time expired, ip = %u.%u.%u.%u\n", NIPQUAD(ip)); + dprintk("mpoa: mpoa_caches.c: holding time expired, ip = %u.%u.%u.%u\n", NIPQUAD(entry->ctrl_info.in_dst_ip)); client->in_ops->remove_entry(entry, client); } entry = next_entry; @@ -455,7 +453,6 @@ static void eg_cache_remove_entry(eg_cache_entry *entry, static eg_cache_entry *eg_cache_add_entry(struct k_message *msg, struct mpoa_client *client) { - unsigned char *ip; eg_cache_entry *entry = kmalloc(sizeof(eg_cache_entry), GFP_KERNEL); if (entry == NULL) { @@ -463,8 +460,7 @@ static eg_cache_entry *eg_cache_add_entry(struct k_message *msg, struct mpoa_cli return NULL; } - ip = (unsigned char *)&msg->content.eg_info.eg_dst_ip; - dprintk("mpoa: mpoa_caches.c: adding an egress entry, ip = %u.%u.%u.%u, this should be our IP\n", NIPQUAD(ip)); + dprintk("mpoa: mpoa_caches.c: adding an egress entry, ip = %u.%u.%u.%u, this should be our IP\n", NIPQUAD(msg->content.eg_info.eg_dst_ip)); memset(entry, 0, sizeof(eg_cache_entry)); atomic_set(&entry->use, 1); @@ -481,8 +477,8 @@ static eg_cache_entry *eg_cache_add_entry(struct k_message *msg, struct mpoa_cli do_gettimeofday(&(entry->tv)); entry->entry_state = EGRESS_RESOLVED; dprintk("mpoa: mpoa_caches.c: new_eg_cache_entry cache_id %lu\n", ntohl(entry->ctrl_info.cache_id)); - ip = (unsigned char *)&entry->ctrl_info.mps_ip; - dprintk("mpoa: mpoa_caches.c: mps_ip = %u.%u.%u.%u\n", NIPQUAD(ip)); + dprintk("mpoa: mpoa_caches.c: mps_ip = %u.%u.%u.%u\n", + NIPQUAD(entry->ctrl_info.mps_ip)); atomic_inc(&entry->use); write_unlock_irq(&client->egress_lock); diff --git a/net/atm/mpoa_proc.c b/net/atm/mpoa_proc.c index 60834b5a1..d37b8911b 100644 --- a/net/atm/mpoa_proc.c +++ b/net/atm/mpoa_proc.c @@ -1,4 +1,3 @@ -#include #ifdef CONFIG_PROC_FS #include diff --git a/net/atm/pppoatm.c b/net/atm/pppoatm.c index 1489067c1..19d5dfc07 100644 --- a/net/atm/pppoatm.c +++ b/net/atm/pppoatm.c @@ -34,7 +34,6 @@ */ #include -#include #include #include #include @@ -288,10 +287,9 @@ static int pppoatm_assign_vcc(struct atm_vcc *atmvcc, void __user *arg) if (be.encaps != PPPOATM_ENCAPS_AUTODETECT && be.encaps != PPPOATM_ENCAPS_VC && be.encaps != PPPOATM_ENCAPS_LLC) return -EINVAL; - pvcc = kmalloc(sizeof(*pvcc), GFP_KERNEL); + pvcc = kzalloc(sizeof(*pvcc), GFP_KERNEL); if (pvcc == NULL) return -ENOMEM; - memset(pvcc, 0, sizeof(*pvcc)); pvcc->atmvcc = atmvcc; pvcc->old_push = atmvcc->push; pvcc->old_pop = atmvcc->pop; diff --git a/net/atm/proc.c b/net/atm/proc.c index 4041054e5..91fe5f53f 100644 --- a/net/atm/proc.c +++ b/net/atm/proc.c @@ -8,7 +8,6 @@ * the reader. */ -#include #include /* for EXPORT_SYMBOL */ #include #include @@ -508,7 +507,7 @@ err_out: goto out; } -void __exit atm_proc_exit(void) +void atm_proc_exit(void) { atm_proc_dirs_remove(); } diff --git a/net/atm/pvc.c b/net/atm/pvc.c index f2c541774..b2148b43a 100644 --- a/net/atm/pvc.c +++ b/net/atm/pvc.c @@ -3,7 +3,6 @@ /* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */ -#include #include /* struct socket, struct proto_ops */ #include /* ATM stuff */ #include /* ATM devices */ diff --git a/net/atm/resources.c b/net/atm/resources.c index 18ac80698..529f7e64a 100644 --- a/net/atm/resources.c +++ b/net/atm/resources.c @@ -8,7 +8,6 @@ * use the default destruct function initialized by sock_init_data */ -#include #include #include #include @@ -34,10 +33,9 @@ static struct atm_dev *__alloc_atm_dev(const char *type) { struct atm_dev *dev; - dev = kmalloc(sizeof(*dev), GFP_KERNEL); + dev = kzalloc(sizeof(*dev), GFP_KERNEL); if (!dev) return NULL; - memset(dev, 0, sizeof(*dev)); dev->type = type; dev->signal = ATM_PHY_SIG_UNKNOWN; dev->link_rate = ATM_OC3_PCR; @@ -114,14 +112,27 @@ struct atm_dev *atm_dev_register(const char *type, const struct atmdev_ops *ops, printk(KERN_ERR "atm_dev_register: " "atm_proc_dev_register failed for dev %s\n", type); - mutex_unlock(&atm_dev_mutex); - kfree(dev); - return NULL; + goto out_fail; + } + + if (atm_register_sysfs(dev) < 0) { + printk(KERN_ERR "atm_dev_register: " + "atm_register_sysfs failed for dev %s\n", + type); + atm_proc_dev_deregister(dev); + goto out_fail; } + list_add_tail(&dev->dev_list, &atm_devs); - mutex_unlock(&atm_dev_mutex); +out: + mutex_unlock(&atm_dev_mutex); return dev; + +out_fail: + kfree(dev); + dev = NULL; + goto out; } @@ -140,6 +151,7 @@ void atm_dev_deregister(struct atm_dev *dev) mutex_unlock(&atm_dev_mutex); atm_dev_release_vccs(dev); + atm_unregister_sysfs(dev); atm_proc_dev_deregister(dev); atm_dev_put(dev); diff --git a/net/atm/resources.h b/net/atm/resources.h index ac7222fee..1d004aaae 100644 --- a/net/atm/resources.h +++ b/net/atm/resources.h @@ -6,7 +6,6 @@ #ifndef NET_ATM_RESOURCES_H #define NET_ATM_RESOURCES_H -#include #include #include @@ -43,4 +42,6 @@ static inline void atm_proc_dev_deregister(struct atm_dev *dev) #endif /* CONFIG_PROC_FS */ +int atm_register_sysfs(struct atm_dev *adev); +void atm_unregister_sysfs(struct atm_dev *adev); #endif diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c index a2e0dd047..000695c48 100644 --- a/net/ax25/af_ax25.c +++ b/net/ax25/af_ax25.c @@ -13,7 +13,6 @@ * Copyright (C) Hans Alblas PE1AYX (hans@esrac.ele.tue.nl) * Copyright (C) Frederic Rible F1OAT (frible@teaser.fr) */ -#include #include #include #include @@ -146,7 +145,7 @@ struct sock *ax25_find_listener(ax25_address *addr, int digi, ax25_cb *s; struct hlist_node *node; - spin_lock_bh(&ax25_list_lock); + spin_lock(&ax25_list_lock); ax25_for_each(s, node, &ax25_list) { if ((s->iamdigi && !digi) || (!s->iamdigi && digi)) continue; @@ -155,12 +154,12 @@ struct sock *ax25_find_listener(ax25_address *addr, int digi, /* If device is null we match any device */ if (s->ax25_dev == NULL || s->ax25_dev->dev == dev) { sock_hold(s->sk); - spin_unlock_bh(&ax25_list_lock); + spin_unlock(&ax25_list_lock); return s->sk; } } } - spin_unlock_bh(&ax25_list_lock); + spin_unlock(&ax25_list_lock); return NULL; } @@ -175,7 +174,7 @@ struct sock *ax25_get_socket(ax25_address *my_addr, ax25_address *dest_addr, ax25_cb *s; struct hlist_node *node; - spin_lock_bh(&ax25_list_lock); + spin_lock(&ax25_list_lock); ax25_for_each(s, node, &ax25_list) { if (s->sk && !ax25cmp(&s->source_addr, my_addr) && !ax25cmp(&s->dest_addr, dest_addr) && @@ -186,7 +185,7 @@ struct sock *ax25_get_socket(ax25_address *my_addr, ax25_address *dest_addr, } } - spin_unlock_bh(&ax25_list_lock); + spin_unlock(&ax25_list_lock); return sk; } @@ -236,7 +235,7 @@ void ax25_send_to_raw(ax25_address *addr, struct sk_buff *skb, int proto) struct sk_buff *copy; struct hlist_node *node; - spin_lock_bh(&ax25_list_lock); + spin_lock(&ax25_list_lock); ax25_for_each(s, node, &ax25_list) { if (s->sk != NULL && ax25cmp(&s->source_addr, addr) == 0 && s->sk->sk_type == SOCK_RAW && @@ -249,7 +248,7 @@ void ax25_send_to_raw(ax25_address *addr, struct sk_buff *skb, int proto) kfree_skb(copy); } } - spin_unlock_bh(&ax25_list_lock); + spin_unlock(&ax25_list_lock); } /* @@ -487,10 +486,9 @@ ax25_cb *ax25_create_cb(void) { ax25_cb *ax25; - if ((ax25 = kmalloc(sizeof(*ax25), GFP_ATOMIC)) == NULL) + if ((ax25 = kzalloc(sizeof(*ax25), GFP_ATOMIC)) == NULL) return NULL; - memset(ax25, 0x00, sizeof(*ax25)); atomic_set(&ax25->refcount, 1); skb_queue_head_init(&ax25->write_queue); diff --git a/net/ax25/ax25_dev.c b/net/ax25/ax25_dev.c index dab77efe3..b78767822 100644 --- a/net/ax25/ax25_dev.c +++ b/net/ax25/ax25_dev.c @@ -6,7 +6,6 @@ * * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk) */ -#include #include #include #include @@ -56,15 +55,13 @@ void ax25_dev_device_up(struct net_device *dev) { ax25_dev *ax25_dev; - if ((ax25_dev = kmalloc(sizeof(*ax25_dev), GFP_ATOMIC)) == NULL) { + if ((ax25_dev = kzalloc(sizeof(*ax25_dev), GFP_ATOMIC)) == NULL) { printk(KERN_ERR "AX.25: ax25_dev_device_up - out of memory\n"); return; } ax25_unregister_sysctl(); - memset(ax25_dev, 0x00, sizeof(*ax25_dev)); - dev->ax25_ptr = ax25_dev; ax25_dev->dev = dev; dev_hold(dev); diff --git a/net/ax25/ax25_ds_subr.c b/net/ax25/ax25_ds_subr.c index 1d4ab641f..4d22d4430 100644 --- a/net/ax25/ax25_ds_subr.c +++ b/net/ax25/ax25_ds_subr.c @@ -80,7 +80,7 @@ void ax25_ds_enquiry_response(ax25_cb *ax25) ax25_start_t3timer(ax25); ax25_ds_set_timer(ax25->ax25_dev); - spin_lock_bh(&ax25_list_lock); + spin_lock(&ax25_list_lock); ax25_for_each(ax25o, node, &ax25_list) { if (ax25o == ax25) continue; @@ -106,7 +106,7 @@ void ax25_ds_enquiry_response(ax25_cb *ax25) if (ax25o->state != AX25_STATE_0) ax25_start_t3timer(ax25o); } - spin_unlock_bh(&ax25_list_lock); + spin_unlock(&ax25_list_lock); } void ax25_ds_establish_data_link(ax25_cb *ax25) @@ -162,13 +162,13 @@ static int ax25_check_dama_slave(ax25_dev *ax25_dev) int res = 0; struct hlist_node *node; - spin_lock_bh(&ax25_list_lock); + spin_lock(&ax25_list_lock); ax25_for_each(ax25, node, &ax25_list) if (ax25->ax25_dev == ax25_dev && (ax25->condition & AX25_COND_DAMA_MODE) && ax25->state > AX25_STATE_1) { res = 1; break; } - spin_unlock_bh(&ax25_list_lock); + spin_unlock(&ax25_list_lock); return res; } diff --git a/net/ax25/ax25_ds_timer.c b/net/ax25/ax25_ds_timer.c index 596145993..4f4418595 100644 --- a/net/ax25/ax25_ds_timer.c +++ b/net/ax25/ax25_ds_timer.c @@ -85,7 +85,7 @@ static void ax25_ds_timeout(unsigned long arg) return; } - spin_lock_bh(&ax25_list_lock); + spin_lock(&ax25_list_lock); ax25_for_each(ax25, node, &ax25_list) { if (ax25->ax25_dev != ax25_dev || !(ax25->condition & AX25_COND_DAMA_MODE)) continue; @@ -93,7 +93,7 @@ static void ax25_ds_timeout(unsigned long arg) ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND); ax25_disconnect(ax25, ETIMEDOUT); } - spin_unlock_bh(&ax25_list_lock); + spin_unlock(&ax25_list_lock); ax25_dev_dama_off(ax25_dev); } diff --git a/net/ax25/ax25_iface.c b/net/ax25/ax25_iface.c index 3bb152710..07ac0207e 100644 --- a/net/ax25/ax25_iface.c +++ b/net/ax25/ax25_iface.c @@ -6,7 +6,6 @@ * * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk) */ -#include #include #include #include @@ -67,10 +66,10 @@ int ax25_protocol_register(unsigned int pid, protocol->pid = pid; protocol->func = func; - write_lock(&protocol_list_lock); + write_lock_bh(&protocol_list_lock); protocol->next = protocol_list; protocol_list = protocol; - write_unlock(&protocol_list_lock); + write_unlock_bh(&protocol_list_lock); return 1; } @@ -81,16 +80,16 @@ void ax25_protocol_release(unsigned int pid) { struct protocol_struct *s, *protocol; - write_lock(&protocol_list_lock); + write_lock_bh(&protocol_list_lock); protocol = protocol_list; if (protocol == NULL) { - write_unlock(&protocol_list_lock); + write_unlock_bh(&protocol_list_lock); return; } if (protocol->pid == pid) { protocol_list = protocol->next; - write_unlock(&protocol_list_lock); + write_unlock_bh(&protocol_list_lock); kfree(protocol); return; } @@ -99,14 +98,14 @@ void ax25_protocol_release(unsigned int pid) if (protocol->next->pid == pid) { s = protocol->next; protocol->next = protocol->next->next; - write_unlock(&protocol_list_lock); + write_unlock_bh(&protocol_list_lock); kfree(s); return; } protocol = protocol->next; } - write_unlock(&protocol_list_lock); + write_unlock_bh(&protocol_list_lock); } EXPORT_SYMBOL(ax25_protocol_release); @@ -267,13 +266,13 @@ int ax25_protocol_is_registered(unsigned int pid) struct protocol_struct *protocol; int res = 0; - read_lock(&protocol_list_lock); + read_lock_bh(&protocol_list_lock); for (protocol = protocol_list; protocol != NULL; protocol = protocol->next) if (protocol->pid == pid) { res = 1; break; } - read_unlock(&protocol_list_lock); + read_unlock_bh(&protocol_list_lock); return res; } diff --git a/net/ax25/ax25_in.c b/net/ax25/ax25_in.c index 4cf87540f..e9d942915 100644 --- a/net/ax25/ax25_in.c +++ b/net/ax25/ax25_in.c @@ -102,8 +102,8 @@ static int ax25_rx_fragment(ax25_cb *ax25, struct sk_buff *skb) int ax25_rx_iframe(ax25_cb *ax25, struct sk_buff *skb) { int (*func)(struct sk_buff *, ax25_cb *); - volatile int queued = 0; unsigned char pid; + int queued = 0; if (skb == NULL) return 0; diff --git a/net/ax25/ax25_ip.c b/net/ax25/ax25_ip.c index a0b534f80..136c3aefa 100644 --- a/net/ax25/ax25_ip.c +++ b/net/ax25/ax25_ip.c @@ -6,7 +6,6 @@ * * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk) */ -#include #include #include #include @@ -104,11 +103,13 @@ int ax25_rebuild_header(struct sk_buff *skb) { struct sk_buff *ourskb; unsigned char *bp = skb->data; - struct net_device *dev; + ax25_route *route; + struct net_device *dev = NULL; ax25_address *src, *dst; + ax25_digi *digipeat = NULL; ax25_dev *ax25_dev; - ax25_route _route, *route = &_route; ax25_cb *ax25; + char ip_mode = ' '; dst = (ax25_address *)(bp + 1); src = (ax25_address *)(bp + 8); @@ -116,8 +117,12 @@ int ax25_rebuild_header(struct sk_buff *skb) if (arp_find(bp + 1, skb)) return 1; - route = ax25_rt_find_route(route, dst, NULL); - dev = route->dev; + route = ax25_get_route(dst, NULL); + if (route) { + digipeat = route->digipeat; + dev = route->dev; + ip_mode = route->ip_mode; + }; if (dev == NULL) dev = skb->dev; @@ -127,7 +132,7 @@ int ax25_rebuild_header(struct sk_buff *skb) } if (bp[16] == AX25_P_IP) { - if (route->ip_mode == 'V' || (route->ip_mode == ' ' && ax25_dev->values[AX25_VALUES_IPDEFMODE])) { + if (ip_mode == 'V' || (ip_mode == ' ' && ax25_dev->values[AX25_VALUES_IPDEFMODE])) { /* * We copy the buffer and release the original thereby * keeping it straight @@ -173,7 +178,7 @@ int ax25_rebuild_header(struct sk_buff *skb) ourskb, ax25_dev->values[AX25_VALUES_PACLEN], &src_c, - &dst_c, route->digipeat, dev); + &dst_c, digipeat, dev); if (ax25) { ax25_cb_put(ax25); } @@ -191,7 +196,7 @@ int ax25_rebuild_header(struct sk_buff *skb) skb_pull(skb, AX25_KISS_HEADER_LEN); - if (route->digipeat != NULL) { + if (digipeat != NULL) { if ((ourskb = ax25_rt_build_path(skb, src, dst, route->digipeat)) == NULL) { kfree_skb(skb); goto put; @@ -203,7 +208,8 @@ int ax25_rebuild_header(struct sk_buff *skb) ax25_queue_xmit(skb, dev); put: - ax25_put_route(route); + if (route) + ax25_put_route(route); return 1; } diff --git a/net/ax25/ax25_out.c b/net/ax25/ax25_out.c index 5d99852b2..d7736e585 100644 --- a/net/ax25/ax25_out.c +++ b/net/ax25/ax25_out.c @@ -8,7 +8,6 @@ * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk) * Copyright (C) Joerg Reuter DL1BKE (jreuter@yaina.de) */ -#include #include #include #include diff --git a/net/ax25/ax25_route.c b/net/ax25/ax25_route.c index 5ac982507..51b7bdaf2 100644 --- a/net/ax25/ax25_route.c +++ b/net/ax25/ax25_route.c @@ -41,8 +41,6 @@ static ax25_route *ax25_route_list; static DEFINE_RWLOCK(ax25_route_lock); -static ax25_route *ax25_get_route(ax25_address *, struct net_device *); - void ax25_rt_device_down(struct net_device *dev) { ax25_route *s, *t, *ax25_rt; @@ -115,7 +113,7 @@ static int ax25_rt_add(struct ax25_routes_struct *route) return -ENOMEM; } - atomic_set(&ax25_rt->ref, 0); + atomic_set(&ax25_rt->refcount, 1); ax25_rt->callsign = route->dest_addr; ax25_rt->dev = ax25_dev->dev; ax25_rt->digipeat = NULL; @@ -140,23 +138,10 @@ static int ax25_rt_add(struct ax25_routes_struct *route) return 0; } -static void ax25_rt_destroy(ax25_route *ax25_rt) +void __ax25_put_route(ax25_route *ax25_rt) { - if (atomic_read(&ax25_rt->ref) == 0) { - kfree(ax25_rt->digipeat); - kfree(ax25_rt); - return; - } - - /* - * Uh... Route is still in use; we can't yet destroy it. Retry later. - */ - init_timer(&ax25_rt->timer); - ax25_rt->timer.data = (unsigned long) ax25_rt; - ax25_rt->timer.function = (void *) ax25_rt_destroy; - ax25_rt->timer.expires = jiffies + 5 * HZ; - - add_timer(&ax25_rt->timer); + kfree(ax25_rt->digipeat); + kfree(ax25_rt); } static int ax25_rt_del(struct ax25_routes_struct *route) @@ -177,12 +162,12 @@ static int ax25_rt_del(struct ax25_routes_struct *route) ax25cmp(&route->dest_addr, &s->callsign) == 0) { if (ax25_route_list == s) { ax25_route_list = s->next; - ax25_rt_destroy(s); + ax25_put_route(s); } else { for (t = ax25_route_list; t != NULL; t = t->next) { if (t->next == s) { t->next = s->next; - ax25_rt_destroy(s); + ax25_put_route(s); break; } } @@ -362,7 +347,7 @@ struct file_operations ax25_route_fops = { * * Only routes with a reference count of zero can be destroyed. */ -static ax25_route *ax25_get_route(ax25_address *addr, struct net_device *dev) +ax25_route *ax25_get_route(ax25_address *addr, struct net_device *dev) { ax25_route *ax25_spe_rt = NULL; ax25_route *ax25_def_rt = NULL; @@ -392,7 +377,7 @@ static ax25_route *ax25_get_route(ax25_address *addr, struct net_device *dev) ax25_rt = ax25_spe_rt; if (ax25_rt != NULL) - atomic_inc(&ax25_rt->ref); + ax25_hold_route(ax25_rt); read_unlock(&ax25_route_lock); @@ -467,24 +452,6 @@ put: return 0; } -ax25_route *ax25_rt_find_route(ax25_route * route, ax25_address *addr, - struct net_device *dev) -{ - ax25_route *ax25_rt; - - if ((ax25_rt = ax25_get_route(addr, dev))) - return ax25_rt; - - route->next = NULL; - atomic_set(&route->ref, 1); - route->callsign = *addr; - route->dev = dev; - route->digipeat = NULL; - route->ip_mode = ' '; - - return route; -} - struct sk_buff *ax25_rt_build_path(struct sk_buff *skb, ax25_address *src, ax25_address *dest, ax25_digi *digi) { diff --git a/net/ax25/ax25_timer.c b/net/ax25/ax25_timer.c index ec254057f..72594867f 100644 --- a/net/ax25/ax25_timer.c +++ b/net/ax25/ax25_timer.c @@ -12,7 +12,6 @@ * Copyright (C) Frederic Rible F1OAT (frible@teaser.fr) * Copyright (C) 2002 Ralf Baechle DO1GRB (ralf@gnu.org) */ -#include #include #include #include diff --git a/net/ax25/sysctl_net_ax25.c b/net/ax25/sysctl_net_ax25.c index bdb64c36d..867d42537 100644 --- a/net/ax25/sysctl_net_ax25.c +++ b/net/ax25/sysctl_net_ax25.c @@ -6,7 +6,6 @@ * * Copyright (C) 1996 Mike Shaver (shaver@zeroknowledge.com) */ -#include #include #include #include @@ -204,13 +203,11 @@ void ax25_register_sysctl(void) for (ax25_table_size = sizeof(ctl_table), ax25_dev = ax25_dev_list; ax25_dev != NULL; ax25_dev = ax25_dev->next) ax25_table_size += sizeof(ctl_table); - if ((ax25_table = kmalloc(ax25_table_size, GFP_ATOMIC)) == NULL) { + if ((ax25_table = kzalloc(ax25_table_size, GFP_ATOMIC)) == NULL) { spin_unlock_bh(&ax25_dev_lock); return; } - memset(ax25_table, 0x00, ax25_table_size); - for (n = 0, ax25_dev = ax25_dev_list; ax25_dev != NULL; ax25_dev = ax25_dev->next) { ctl_table *child = kmalloc(sizeof(ax25_param_table), GFP_ATOMIC); if (!child) { diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c index 469eda0f0..788ea7a2b 100644 --- a/net/bluetooth/af_bluetooth.c +++ b/net/bluetooth/af_bluetooth.c @@ -24,7 +24,6 @@ /* Bluetooth address family and sockets. */ -#include #include #include @@ -49,7 +48,7 @@ #define BT_DBG(D...) #endif -#define VERSION "2.8" +#define VERSION "2.10" /* Bluetooth sockets */ #define BT_MAX_PROTO 8 @@ -308,13 +307,21 @@ static struct net_proto_family bt_sock_family_ops = { static int __init bt_init(void) { + int err; + BT_INFO("Core ver %s", VERSION); - sock_register(&bt_sock_family_ops); + err = bt_sysfs_init(); + if (err < 0) + return err; - BT_INFO("HCI device and connection manager initialized"); + err = sock_register(&bt_sock_family_ops); + if (err < 0) { + bt_sysfs_cleanup(); + return err; + } - bt_sysfs_init(); + BT_INFO("HCI device and connection manager initialized"); hci_sock_init(); @@ -325,9 +332,9 @@ static void __exit bt_exit(void) { hci_sock_cleanup(); - bt_sysfs_cleanup(); - sock_unregister(PF_BLUETOOTH); + + bt_sysfs_cleanup(); } subsys_initcall(bt_init); diff --git a/net/bluetooth/bnep/core.c b/net/bluetooth/bnep/core.c index d908d49dc..e620061fb 100644 --- a/net/bluetooth/bnep/core.c +++ b/net/bluetooth/bnep/core.c @@ -29,7 +29,6 @@ * $Id: core.c,v 1.20 2002/08/04 21:23:58 maxk Exp $ */ -#include #include #include diff --git a/net/bluetooth/bnep/netdev.c b/net/bluetooth/bnep/netdev.c index 921204f95..7f7b27db6 100644 --- a/net/bluetooth/bnep/netdev.c +++ b/net/bluetooth/bnep/netdev.c @@ -29,7 +29,6 @@ * $Id: netdev.c,v 1.8 2002/08/04 21:23:58 maxk Exp $ */ -#include #include #include diff --git a/net/bluetooth/bnep/sock.c b/net/bluetooth/bnep/sock.c index 2bfe796cf..28c558354 100644 --- a/net/bluetooth/bnep/sock.c +++ b/net/bluetooth/bnep/sock.c @@ -28,7 +28,6 @@ * $Id: sock.c,v 1.4 2002/08/04 21:23:58 maxk Exp $ */ -#include #include #include diff --git a/net/bluetooth/cmtp/capi.c b/net/bluetooth/cmtp/capi.c index b2e7e3853..be04e9fb1 100644 --- a/net/bluetooth/cmtp/capi.c +++ b/net/bluetooth/cmtp/capi.c @@ -20,7 +20,6 @@ SOFTWARE IS DISCLAIMED. */ -#include #include #include @@ -76,15 +75,13 @@ static struct cmtp_application *cmtp_application_add(struct cmtp_session *session, __u16 appl) { - struct cmtp_application *app = kmalloc(sizeof(*app), GFP_KERNEL); + struct cmtp_application *app = kzalloc(sizeof(*app), GFP_KERNEL); BT_DBG("session %p application %p appl %d", session, app, appl); if (!app) return NULL; - memset(app, 0, sizeof(*app)); - app->state = BT_OPEN; app->appl = appl; diff --git a/net/bluetooth/cmtp/core.c b/net/bluetooth/cmtp/core.c index 901eff7eb..b81a01c64 100644 --- a/net/bluetooth/cmtp/core.c +++ b/net/bluetooth/cmtp/core.c @@ -20,7 +20,6 @@ SOFTWARE IS DISCLAIMED. */ -#include #include #include @@ -336,10 +335,9 @@ int cmtp_add_connection(struct cmtp_connadd_req *req, struct socket *sock) baswap(&src, &bt_sk(sock->sk)->src); baswap(&dst, &bt_sk(sock->sk)->dst); - session = kmalloc(sizeof(struct cmtp_session), GFP_KERNEL); + session = kzalloc(sizeof(struct cmtp_session), GFP_KERNEL); if (!session) return -ENOMEM; - memset(session, 0, sizeof(struct cmtp_session)); down_write(&cmtp_session_sem); diff --git a/net/bluetooth/cmtp/sock.c b/net/bluetooth/cmtp/sock.c index 8f8fad23f..10ad7fd91 100644 --- a/net/bluetooth/cmtp/sock.c +++ b/net/bluetooth/cmtp/sock.c @@ -20,7 +20,6 @@ SOFTWARE IS DISCLAIMED. */ -#include #include #include diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index f812ed129..420ed4d7e 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c @@ -24,7 +24,6 @@ /* Bluetooth HCI connection handling. */ -#include #include #include @@ -116,8 +115,8 @@ void hci_add_sco(struct hci_conn *conn, __u16 handle) static void hci_conn_timeout(unsigned long arg) { - struct hci_conn *conn = (void *)arg; - struct hci_dev *hdev = conn->hdev; + struct hci_conn *conn = (void *) arg; + struct hci_dev *hdev = conn->hdev; BT_DBG("conn %p state %d", conn, conn->state); @@ -133,11 +132,13 @@ static void hci_conn_timeout(unsigned long arg) return; } -static void hci_conn_init_timer(struct hci_conn *conn) +static void hci_conn_idle(unsigned long arg) { - init_timer(&conn->timer); - conn->timer.function = hci_conn_timeout; - conn->timer.data = (unsigned long)conn; + struct hci_conn *conn = (void *) arg; + + BT_DBG("conn %p mode %d", conn, conn->mode); + + hci_conn_enter_sniff_mode(conn); } struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst) @@ -146,17 +147,27 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst) BT_DBG("%s dst %s", hdev->name, batostr(dst)); - if (!(conn = kmalloc(sizeof(struct hci_conn), GFP_ATOMIC))) + conn = kzalloc(sizeof(struct hci_conn), GFP_ATOMIC); + if (!conn) return NULL; - memset(conn, 0, sizeof(struct hci_conn)); bacpy(&conn->dst, dst); - conn->type = type; conn->hdev = hdev; + conn->type = type; + conn->mode = HCI_CM_ACTIVE; conn->state = BT_OPEN; + conn->power_save = 1; + skb_queue_head_init(&conn->data_q); - hci_conn_init_timer(conn); + + init_timer(&conn->disc_timer); + conn->disc_timer.function = hci_conn_timeout; + conn->disc_timer.data = (unsigned long) conn; + + init_timer(&conn->idle_timer); + conn->idle_timer.function = hci_conn_idle; + conn->idle_timer.data = (unsigned long) conn; atomic_set(&conn->refcnt, 0); @@ -179,7 +190,9 @@ int hci_conn_del(struct hci_conn *conn) BT_DBG("%s conn %p handle %d", hdev->name, conn, conn->handle); - hci_conn_del_timer(conn); + del_timer(&conn->idle_timer); + + del_timer(&conn->disc_timer); if (conn->type == SCO_LINK) { struct hci_conn *acl = conn->link; @@ -365,6 +378,70 @@ int hci_conn_switch_role(struct hci_conn *conn, uint8_t role) } EXPORT_SYMBOL(hci_conn_switch_role); +/* Enter active mode */ +void hci_conn_enter_active_mode(struct hci_conn *conn) +{ + struct hci_dev *hdev = conn->hdev; + + BT_DBG("conn %p mode %d", conn, conn->mode); + + if (test_bit(HCI_RAW, &hdev->flags)) + return; + + if (conn->mode != HCI_CM_SNIFF || !conn->power_save) + goto timer; + + if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend)) { + struct hci_cp_exit_sniff_mode cp; + cp.handle = __cpu_to_le16(conn->handle); + hci_send_cmd(hdev, OGF_LINK_POLICY, + OCF_EXIT_SNIFF_MODE, sizeof(cp), &cp); + } + +timer: + if (hdev->idle_timeout > 0) + mod_timer(&conn->idle_timer, + jiffies + msecs_to_jiffies(hdev->idle_timeout)); +} + +/* Enter sniff mode */ +void hci_conn_enter_sniff_mode(struct hci_conn *conn) +{ + struct hci_dev *hdev = conn->hdev; + + BT_DBG("conn %p mode %d", conn, conn->mode); + + if (test_bit(HCI_RAW, &hdev->flags)) + return; + + if (!lmp_sniff_capable(hdev) || !lmp_sniff_capable(conn)) + return; + + if (conn->mode != HCI_CM_ACTIVE || !(conn->link_policy & HCI_LP_SNIFF)) + return; + + if (lmp_sniffsubr_capable(hdev) && lmp_sniffsubr_capable(conn)) { + struct hci_cp_sniff_subrate cp; + cp.handle = __cpu_to_le16(conn->handle); + cp.max_latency = __constant_cpu_to_le16(0); + cp.min_remote_timeout = __constant_cpu_to_le16(0); + cp.min_local_timeout = __constant_cpu_to_le16(0); + hci_send_cmd(hdev, OGF_LINK_POLICY, + OCF_SNIFF_SUBRATE, sizeof(cp), &cp); + } + + if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend)) { + struct hci_cp_sniff_mode cp; + cp.handle = __cpu_to_le16(conn->handle); + cp.max_interval = __cpu_to_le16(hdev->sniff_max_interval); + cp.min_interval = __cpu_to_le16(hdev->sniff_min_interval); + cp.attempt = __constant_cpu_to_le16(4); + cp.timeout = __constant_cpu_to_le16(1); + hci_send_cmd(hdev, OGF_LINK_POLICY, + OCF_SNIFF_MODE, sizeof(cp), &cp); + } +} + /* Drop all connection on the device */ void hci_conn_hash_flush(struct hci_dev *hdev) { diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index a49a69750..5ed474277 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c @@ -24,7 +24,6 @@ /* Bluetooth HCI core. */ -#include #include #include @@ -337,9 +336,8 @@ void hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data) if (!(e = hci_inquiry_cache_lookup(hdev, &data->bdaddr))) { /* Entry not in the cache. Add new one. */ - if (!(e = kmalloc(sizeof(struct inquiry_entry), GFP_ATOMIC))) + if (!(e = kzalloc(sizeof(struct inquiry_entry), GFP_ATOMIC))) return; - memset(e, 0, sizeof(struct inquiry_entry)); e->next = cache->list; cache->list = e; } @@ -412,7 +410,7 @@ int hci_inquiry(void __user *arg) } hci_dev_unlock_bh(hdev); - timeo = ir.length * 2 * HZ; + timeo = ir.length * msecs_to_jiffies(2000); if (do_inquiry && (err = hci_request(hdev, hci_inq_req, (unsigned long)&ir, timeo)) < 0) goto done; @@ -480,7 +478,8 @@ int hci_dev_open(__u16 dev) set_bit(HCI_INIT, &hdev->flags); //__hci_request(hdev, hci_reset_req, 0, HZ); - ret = __hci_request(hdev, hci_init_req, 0, HCI_INIT_TIMEOUT); + ret = __hci_request(hdev, hci_init_req, 0, + msecs_to_jiffies(HCI_INIT_TIMEOUT)); clear_bit(HCI_INIT, &hdev->flags); } @@ -547,7 +546,8 @@ static int hci_dev_do_close(struct hci_dev *hdev) atomic_set(&hdev->cmd_cnt, 1); if (!test_bit(HCI_RAW, &hdev->flags)) { set_bit(HCI_INIT, &hdev->flags); - __hci_request(hdev, hci_reset_req, 0, HZ/4); + __hci_request(hdev, hci_reset_req, 0, + msecs_to_jiffies(250)); clear_bit(HCI_INIT, &hdev->flags); } @@ -620,7 +620,8 @@ int hci_dev_reset(__u16 dev) hdev->acl_cnt = 0; hdev->sco_cnt = 0; if (!test_bit(HCI_RAW, &hdev->flags)) - ret = __hci_request(hdev, hci_reset_req, 0, HCI_INIT_TIMEOUT); + ret = __hci_request(hdev, hci_reset_req, 0, + msecs_to_jiffies(HCI_INIT_TIMEOUT)); done: tasklet_enable(&hdev->tx_task); @@ -658,7 +659,8 @@ int hci_dev_cmd(unsigned int cmd, void __user *arg) switch (cmd) { case HCISETAUTH: - err = hci_request(hdev, hci_auth_req, dr.dev_opt, HCI_INIT_TIMEOUT); + err = hci_request(hdev, hci_auth_req, dr.dev_opt, + msecs_to_jiffies(HCI_INIT_TIMEOUT)); break; case HCISETENCRYPT: @@ -669,18 +671,19 @@ int hci_dev_cmd(unsigned int cmd, void __user *arg) if (!test_bit(HCI_AUTH, &hdev->flags)) { /* Auth must be enabled first */ - err = hci_request(hdev, hci_auth_req, - dr.dev_opt, HCI_INIT_TIMEOUT); + err = hci_request(hdev, hci_auth_req, dr.dev_opt, + msecs_to_jiffies(HCI_INIT_TIMEOUT)); if (err) break; } - err = hci_request(hdev, hci_encrypt_req, - dr.dev_opt, HCI_INIT_TIMEOUT); + err = hci_request(hdev, hci_encrypt_req, dr.dev_opt, + msecs_to_jiffies(HCI_INIT_TIMEOUT)); break; case HCISETSCAN: - err = hci_request(hdev, hci_scan_req, dr.dev_opt, HCI_INIT_TIMEOUT); + err = hci_request(hdev, hci_scan_req, dr.dev_opt, + msecs_to_jiffies(HCI_INIT_TIMEOUT)); break; case HCISETPTYPE: @@ -796,12 +799,10 @@ struct hci_dev *hci_alloc_dev(void) { struct hci_dev *hdev; - hdev = kmalloc(sizeof(struct hci_dev), GFP_KERNEL); + hdev = kzalloc(sizeof(struct hci_dev), GFP_KERNEL); if (!hdev) return NULL; - memset(hdev, 0, sizeof(struct hci_dev)); - skb_queue_head_init(&hdev->driver_init); return hdev; @@ -813,8 +814,8 @@ void hci_free_dev(struct hci_dev *hdev) { skb_queue_purge(&hdev->driver_init); - /* will free via class release */ - class_device_put(&hdev->class_dev); + /* will free via device release */ + put_device(&hdev->dev); } EXPORT_SYMBOL(hci_free_dev); @@ -849,6 +850,10 @@ int hci_register_dev(struct hci_dev *hdev) hdev->pkt_type = (HCI_DM1 | HCI_DH1 | HCI_HV1); hdev->link_mode = (HCI_LM_ACCEPT); + hdev->idle_timeout = 0; + hdev->sniff_max_interval = 800; + hdev->sniff_min_interval = 80; + tasklet_init(&hdev->cmd_task, hci_cmd_task,(unsigned long) hdev); tasklet_init(&hdev->rx_task, hci_rx_task, (unsigned long) hdev); tasklet_init(&hdev->tx_task, hci_tx_task, (unsigned long) hdev); @@ -1221,6 +1226,9 @@ static inline void hci_sched_acl(struct hci_dev *hdev) while (hdev->acl_cnt && (conn = hci_low_sent(hdev, ACL_LINK, "e))) { while (quote-- && (skb = skb_dequeue(&conn->data_q))) { BT_DBG("skb %p len %d", skb, skb->len); + + hci_conn_enter_active_mode(conn); + hci_send_frame(skb); hdev->acl_last_tx = jiffies; @@ -1299,6 +1307,8 @@ static inline void hci_acldata_packet(struct hci_dev *hdev, struct sk_buff *skb) if (conn) { register struct hci_proto *hp; + hci_conn_enter_active_mode(conn); + /* Send to upper protocol */ if ((hp = hci_proto[HCI_PROTO_L2CAP]) && hp->recv_acldata) { hp->recv_acldata(conn, skb, flags); diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index eb64555d1..3896dabab 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c @@ -24,7 +24,6 @@ /* Bluetooth HCI event handling. */ -#include #include #include @@ -84,6 +83,8 @@ static void hci_cc_link_policy(struct hci_dev *hdev, __u16 ocf, struct sk_buff * { struct hci_conn *conn; struct hci_rp_role_discovery *rd; + struct hci_rp_write_link_policy *lp; + void *sent; BT_DBG("%s ocf 0x%x", hdev->name, ocf); @@ -107,6 +108,27 @@ static void hci_cc_link_policy(struct hci_dev *hdev, __u16 ocf, struct sk_buff * hci_dev_unlock(hdev); break; + case OCF_WRITE_LINK_POLICY: + sent = hci_sent_cmd_data(hdev, OGF_LINK_POLICY, OCF_WRITE_LINK_POLICY); + if (!sent) + break; + + lp = (struct hci_rp_write_link_policy *) skb->data; + + if (lp->status) + break; + + hci_dev_lock(hdev); + + conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(lp->handle)); + if (conn) { + __le16 policy = get_unaligned((__le16 *) (sent + 2)); + conn->link_policy = __le16_to_cpu(policy); + } + + hci_dev_unlock(hdev); + break; + default: BT_DBG("%s: Command complete: ogf LINK_POLICY ocf %x", hdev->name, ocf); @@ -275,7 +297,7 @@ static void hci_cc_host_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb /* Command Complete OGF INFO_PARAM */ static void hci_cc_info_param(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb) { - struct hci_rp_read_loc_features *lf; + struct hci_rp_read_local_features *lf; struct hci_rp_read_buffer_size *bs; struct hci_rp_read_bd_addr *ba; @@ -283,7 +305,7 @@ static void hci_cc_info_param(struct hci_dev *hdev, __u16 ocf, struct sk_buff *s switch (ocf) { case OCF_READ_LOCAL_FEATURES: - lf = (struct hci_rp_read_loc_features *) skb->data; + lf = (struct hci_rp_read_local_features *) skb->data; if (lf->status) { BT_DBG("%s READ_LOCAL_FEATURES failed %d", hdev->name, lf->status); @@ -320,9 +342,17 @@ static void hci_cc_info_param(struct hci_dev *hdev, __u16 ocf, struct sk_buff *s } hdev->acl_mtu = __le16_to_cpu(bs->acl_mtu); - hdev->sco_mtu = bs->sco_mtu ? bs->sco_mtu : 64; - hdev->acl_pkts = hdev->acl_cnt = __le16_to_cpu(bs->acl_max_pkt); - hdev->sco_pkts = hdev->sco_cnt = __le16_to_cpu(bs->sco_max_pkt); + hdev->sco_mtu = bs->sco_mtu; + hdev->acl_pkts = __le16_to_cpu(bs->acl_max_pkt); + hdev->sco_pkts = __le16_to_cpu(bs->sco_max_pkt); + + if (test_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks)) { + hdev->sco_mtu = 64; + hdev->sco_pkts = 8; + } + + hdev->acl_cnt = hdev->acl_pkts; + hdev->sco_cnt = hdev->sco_pkts; BT_DBG("%s mtu: acl %d, sco %d max_pkt: acl %d, sco %d", hdev->name, hdev->acl_mtu, hdev->sco_mtu, hdev->acl_pkts, hdev->sco_pkts); @@ -440,8 +470,46 @@ static void hci_cs_link_policy(struct hci_dev *hdev, __u16 ocf, __u8 status) BT_DBG("%s ocf 0x%x", hdev->name, ocf); switch (ocf) { + case OCF_SNIFF_MODE: + if (status) { + struct hci_conn *conn; + struct hci_cp_sniff_mode *cp = hci_sent_cmd_data(hdev, OGF_LINK_POLICY, OCF_SNIFF_MODE); + + if (!cp) + break; + + hci_dev_lock(hdev); + + conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle)); + if (conn) { + clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend); + } + + hci_dev_unlock(hdev); + } + break; + + case OCF_EXIT_SNIFF_MODE: + if (status) { + struct hci_conn *conn; + struct hci_cp_exit_sniff_mode *cp = hci_sent_cmd_data(hdev, OGF_LINK_POLICY, OCF_EXIT_SNIFF_MODE); + + if (!cp) + break; + + hci_dev_lock(hdev); + + conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle)); + if (conn) { + clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend); + } + + hci_dev_unlock(hdev); + } + break; + default: - BT_DBG("%s Command status: ogf HOST_POLICY ocf %x", hdev->name, ocf); + BT_DBG("%s Command status: ogf LINK_POLICY ocf %x", hdev->name, ocf); break; } } @@ -623,14 +691,16 @@ static inline void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *sk else cp.role = 0x01; /* Remain slave */ - hci_send_cmd(hdev, OGF_LINK_CTL, OCF_ACCEPT_CONN_REQ, sizeof(cp), &cp); + hci_send_cmd(hdev, OGF_LINK_CTL, + OCF_ACCEPT_CONN_REQ, sizeof(cp), &cp); } else { /* Connection rejected */ struct hci_cp_reject_conn_req cp; bacpy(&cp.bdaddr, &ev->bdaddr); cp.reason = 0x0f; - hci_send_cmd(hdev, OGF_LINK_CTL, OCF_REJECT_CONN_REQ, sizeof(cp), &cp); + hci_send_cmd(hdev, OGF_LINK_CTL, + OCF_REJECT_CONN_REQ, sizeof(cp), &cp); } } @@ -638,7 +708,7 @@ static inline void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *sk static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) { struct hci_ev_conn_complete *ev = (struct hci_ev_conn_complete *) skb->data; - struct hci_conn *conn = NULL; + struct hci_conn *conn; BT_DBG("%s", hdev->name); @@ -660,12 +730,21 @@ static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *s if (test_bit(HCI_ENCRYPT, &hdev->flags)) conn->link_mode |= HCI_LM_ENCRYPT; + /* Get remote features */ + if (conn->type == ACL_LINK) { + struct hci_cp_read_remote_features cp; + cp.handle = ev->handle; + hci_send_cmd(hdev, OGF_LINK_CTL, + OCF_READ_REMOTE_FEATURES, sizeof(cp), &cp); + } + /* Set link policy */ if (conn->type == ACL_LINK && hdev->link_policy) { struct hci_cp_write_link_policy cp; cp.handle = ev->handle; cp.policy = __cpu_to_le16(hdev->link_policy); - hci_send_cmd(hdev, OGF_LINK_POLICY, OCF_WRITE_LINK_POLICY, sizeof(cp), &cp); + hci_send_cmd(hdev, OGF_LINK_POLICY, + OCF_WRITE_LINK_POLICY, sizeof(cp), &cp); } /* Set packet type for incoming connection */ @@ -676,7 +755,8 @@ static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *s __cpu_to_le16(hdev->pkt_type & ACL_PTYPE_MASK): __cpu_to_le16(hdev->pkt_type & SCO_PTYPE_MASK); - hci_send_cmd(hdev, OGF_LINK_CTL, OCF_CHANGE_CONN_PTYPE, sizeof(cp), &cp); + hci_send_cmd(hdev, OGF_LINK_CTL, + OCF_CHANGE_CONN_PTYPE, sizeof(cp), &cp); } } else conn->state = BT_CLOSED; @@ -704,8 +784,7 @@ static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *s static inline void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) { struct hci_ev_disconn_complete *ev = (struct hci_ev_disconn_complete *) skb->data; - struct hci_conn *conn = NULL; - __u16 handle = __le16_to_cpu(ev->handle); + struct hci_conn *conn; BT_DBG("%s status %d", hdev->name, ev->status); @@ -714,7 +793,7 @@ static inline void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff hci_dev_lock(hdev); - conn = hci_conn_hash_lookup_handle(hdev, handle); + conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle)); if (conn) { conn->state = BT_CLOSED; hci_proto_disconn_ind(conn, ev->reason); @@ -771,7 +850,7 @@ static inline void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *s static inline void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb) { struct hci_ev_role_change *ev = (struct hci_ev_role_change *) skb->data; - struct hci_conn *conn = NULL; + struct hci_conn *conn; BT_DBG("%s status %d", hdev->name, ev->status); @@ -794,18 +873,43 @@ static inline void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb hci_dev_unlock(hdev); } +/* Mode Change */ +static inline void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb) +{ + struct hci_ev_mode_change *ev = (struct hci_ev_mode_change *) skb->data; + struct hci_conn *conn; + + BT_DBG("%s status %d", hdev->name, ev->status); + + hci_dev_lock(hdev); + + conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle)); + if (conn) { + conn->mode = ev->mode; + conn->interval = __le16_to_cpu(ev->interval); + + if (!test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend)) { + if (conn->mode == HCI_CM_ACTIVE) + conn->power_save = 1; + else + conn->power_save = 0; + } + } + + hci_dev_unlock(hdev); +} + /* Authentication Complete */ static inline void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) { struct hci_ev_auth_complete *ev = (struct hci_ev_auth_complete *) skb->data; - struct hci_conn *conn = NULL; - __u16 handle = __le16_to_cpu(ev->handle); + struct hci_conn *conn; BT_DBG("%s status %d", hdev->name, ev->status); hci_dev_lock(hdev); - conn = hci_conn_hash_lookup_handle(hdev, handle); + conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle)); if (conn) { if (!ev->status) conn->link_mode |= HCI_LM_AUTH; @@ -820,8 +924,7 @@ static inline void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *s cp.handle = __cpu_to_le16(conn->handle); cp.encrypt = 1; hci_send_cmd(conn->hdev, OGF_LINK_CTL, - OCF_SET_CONN_ENCRYPT, - sizeof(cp), &cp); + OCF_SET_CONN_ENCRYPT, sizeof(cp), &cp); } else { clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend); hci_encrypt_cfm(conn, ev->status, 0x00); @@ -836,14 +939,13 @@ static inline void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *s static inline void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb) { struct hci_ev_encrypt_change *ev = (struct hci_ev_encrypt_change *) skb->data; - struct hci_conn *conn = NULL; - __u16 handle = __le16_to_cpu(ev->handle); + struct hci_conn *conn; BT_DBG("%s status %d", hdev->name, ev->status); hci_dev_lock(hdev); - conn = hci_conn_hash_lookup_handle(hdev, handle); + conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle)); if (conn) { if (!ev->status) { if (ev->encrypt) @@ -864,14 +966,13 @@ static inline void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff * static inline void hci_change_conn_link_key_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) { struct hci_ev_change_conn_link_key_complete *ev = (struct hci_ev_change_conn_link_key_complete *) skb->data; - struct hci_conn *conn = NULL; - __u16 handle = __le16_to_cpu(ev->handle); + struct hci_conn *conn; BT_DBG("%s status %d", hdev->name, ev->status); hci_dev_lock(hdev); - conn = hci_conn_hash_lookup_handle(hdev, handle); + conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle)); if (conn) { if (!ev->status) conn->link_mode |= HCI_LM_SECURE; @@ -899,18 +1000,35 @@ static inline void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff { } +/* Remote Features */ +static inline void hci_remote_features_evt(struct hci_dev *hdev, struct sk_buff *skb) +{ + struct hci_ev_remote_features *ev = (struct hci_ev_remote_features *) skb->data; + struct hci_conn *conn; + + BT_DBG("%s status %d", hdev->name, ev->status); + + hci_dev_lock(hdev); + + conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle)); + if (conn && !ev->status) { + memcpy(conn->features, ev->features, sizeof(conn->features)); + } + + hci_dev_unlock(hdev); +} + /* Clock Offset */ static inline void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *skb) { struct hci_ev_clock_offset *ev = (struct hci_ev_clock_offset *) skb->data; - struct hci_conn *conn = NULL; - __u16 handle = __le16_to_cpu(ev->handle); + struct hci_conn *conn; BT_DBG("%s status %d", hdev->name, ev->status); hci_dev_lock(hdev); - conn = hci_conn_hash_lookup_handle(hdev, handle); + conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle)); if (conn && !ev->status) { struct inquiry_entry *ie; @@ -941,6 +1059,23 @@ static inline void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff * hci_dev_unlock(hdev); } +/* Sniff Subrate */ +static inline void hci_sniff_subrate_evt(struct hci_dev *hdev, struct sk_buff *skb) +{ + struct hci_ev_sniff_subrate *ev = (struct hci_ev_sniff_subrate *) skb->data; + struct hci_conn *conn; + + BT_DBG("%s status %d", hdev->name, ev->status); + + hci_dev_lock(hdev); + + conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle)); + if (conn) { + } + + hci_dev_unlock(hdev); +} + void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb) { struct hci_event_hdr *hdr = (struct hci_event_hdr *) skb->data; @@ -989,6 +1124,10 @@ void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb) hci_role_change_evt(hdev, skb); break; + case HCI_EV_MODE_CHANGE: + hci_mode_change_evt(hdev, skb); + break; + case HCI_EV_AUTH_COMPLETE: hci_auth_complete_evt(hdev, skb); break; @@ -1013,6 +1152,10 @@ void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb) hci_link_key_notify_evt(hdev, skb); break; + case HCI_EV_REMOTE_FEATURES: + hci_remote_features_evt(hdev, skb); + break; + case HCI_EV_CLOCK_OFFSET: hci_clock_offset_evt(hdev, skb); break; @@ -1021,6 +1164,10 @@ void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb) hci_pscan_rep_mode_evt(hdev, skb); break; + case HCI_EV_SNIFF_SUBRATE: + hci_sniff_subrate_evt(hdev, skb); + break; + case HCI_EV_CMD_STATUS: cs = (struct hci_ev_cmd_status *) skb->data; skb_pull(skb, sizeof(cs)); diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index 97bdec73d..1a35d343e 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c @@ -24,7 +24,6 @@ /* Bluetooth HCI sockets. */ -#include #include #include diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c index 0ed387403..3987d167f 100644 --- a/net/bluetooth/hci_sysfs.c +++ b/net/bluetooth/hci_sysfs.c @@ -1,9 +1,10 @@ /* Bluetooth HCI driver model support. */ -#include #include #include +#include + #include #include @@ -12,35 +13,35 @@ #define BT_DBG(D...) #endif -static ssize_t show_name(struct class_device *cdev, char *buf) +static ssize_t show_name(struct device *dev, struct device_attribute *attr, char *buf) { - struct hci_dev *hdev = class_get_devdata(cdev); + struct hci_dev *hdev = dev_get_drvdata(dev); return sprintf(buf, "%s\n", hdev->name); } -static ssize_t show_type(struct class_device *cdev, char *buf) +static ssize_t show_type(struct device *dev, struct device_attribute *attr, char *buf) { - struct hci_dev *hdev = class_get_devdata(cdev); + struct hci_dev *hdev = dev_get_drvdata(dev); return sprintf(buf, "%d\n", hdev->type); } -static ssize_t show_address(struct class_device *cdev, char *buf) +static ssize_t show_address(struct device *dev, struct device_attribute *attr, char *buf) { - struct hci_dev *hdev = class_get_devdata(cdev); + struct hci_dev *hdev = dev_get_drvdata(dev); bdaddr_t bdaddr; baswap(&bdaddr, &hdev->bdaddr); return sprintf(buf, "%s\n", batostr(&bdaddr)); } -static ssize_t show_flags(struct class_device *cdev, char *buf) +static ssize_t show_flags(struct device *dev, struct device_attribute *attr, char *buf) { - struct hci_dev *hdev = class_get_devdata(cdev); + struct hci_dev *hdev = dev_get_drvdata(dev); return sprintf(buf, "0x%lx\n", hdev->flags); } -static ssize_t show_inquiry_cache(struct class_device *cdev, char *buf) +static ssize_t show_inquiry_cache(struct device *dev, struct device_attribute *attr, char *buf) { - struct hci_dev *hdev = class_get_devdata(cdev); + struct hci_dev *hdev = dev_get_drvdata(dev); struct inquiry_cache *cache = &hdev->inq_cache; struct inquiry_entry *e; int n = 0; @@ -62,94 +63,193 @@ static ssize_t show_inquiry_cache(struct class_device *cdev, char *buf) return n; } -static CLASS_DEVICE_ATTR(name, S_IRUGO, show_name, NULL); -static CLASS_DEVICE_ATTR(type, S_IRUGO, show_type, NULL); -static CLASS_DEVICE_ATTR(address, S_IRUGO, show_address, NULL); -static CLASS_DEVICE_ATTR(flags, S_IRUGO, show_flags, NULL); -static CLASS_DEVICE_ATTR(inquiry_cache, S_IRUGO, show_inquiry_cache, NULL); +static ssize_t show_idle_timeout(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct hci_dev *hdev = dev_get_drvdata(dev); + return sprintf(buf, "%d\n", hdev->idle_timeout); +} -static struct class_device_attribute *bt_attrs[] = { - &class_device_attr_name, - &class_device_attr_type, - &class_device_attr_address, - &class_device_attr_flags, - &class_device_attr_inquiry_cache, - NULL -}; +static ssize_t store_idle_timeout(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct hci_dev *hdev = dev_get_drvdata(dev); + char *ptr; + __u32 val; + + val = simple_strtoul(buf, &ptr, 10); + if (ptr == buf) + return -EINVAL; -#ifdef CONFIG_HOTPLUG -static int bt_uevent(struct class_device *cdev, char **envp, int num_envp, char *buf, int size) + if (val != 0 && (val < 500 || val > 3600000)) + return -EINVAL; + + hdev->idle_timeout = val; + + return count; +} + +static ssize_t show_sniff_max_interval(struct device *dev, struct device_attribute *attr, char *buf) { - struct hci_dev *hdev = class_get_devdata(cdev); - int n, i = 0; + struct hci_dev *hdev = dev_get_drvdata(dev); + return sprintf(buf, "%d\n", hdev->sniff_max_interval); +} - envp[i++] = buf; - n = snprintf(buf, size, "INTERFACE=%s", hdev->name) + 1; - buf += n; - size -= n; +static ssize_t store_sniff_max_interval(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct hci_dev *hdev = dev_get_drvdata(dev); + char *ptr; + __u16 val; - if ((size <= 0) || (i >= num_envp)) - return -ENOMEM; + val = simple_strtoul(buf, &ptr, 10); + if (ptr == buf) + return -EINVAL; - envp[i] = NULL; - return 0; + if (val < 0x0002 || val > 0xFFFE || val % 2) + return -EINVAL; + + if (val < hdev->sniff_min_interval) + return -EINVAL; + + hdev->sniff_max_interval = val; + + return count; +} + +static ssize_t show_sniff_min_interval(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct hci_dev *hdev = dev_get_drvdata(dev); + return sprintf(buf, "%d\n", hdev->sniff_min_interval); } -#endif -static void bt_release(struct class_device *cdev) +static ssize_t store_sniff_min_interval(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { - struct hci_dev *hdev = class_get_devdata(cdev); + struct hci_dev *hdev = dev_get_drvdata(dev); + char *ptr; + __u16 val; - kfree(hdev); + val = simple_strtoul(buf, &ptr, 10); + if (ptr == buf) + return -EINVAL; + + if (val < 0x0002 || val > 0xFFFE || val % 2) + return -EINVAL; + + if (val > hdev->sniff_max_interval) + return -EINVAL; + + hdev->sniff_min_interval = val; + + return count; } -struct class bt_class = { - .name = "bluetooth", - .release = bt_release, -#ifdef CONFIG_HOTPLUG - .uevent = bt_uevent, -#endif +static DEVICE_ATTR(name, S_IRUGO, show_name, NULL); +static DEVICE_ATTR(type, S_IRUGO, show_type, NULL); +static DEVICE_ATTR(address, S_IRUGO, show_address, NULL); +static DEVICE_ATTR(flags, S_IRUGO, show_flags, NULL); +static DEVICE_ATTR(inquiry_cache, S_IRUGO, show_inquiry_cache, NULL); + +static DEVICE_ATTR(idle_timeout, S_IRUGO | S_IWUSR, + show_idle_timeout, store_idle_timeout); +static DEVICE_ATTR(sniff_max_interval, S_IRUGO | S_IWUSR, + show_sniff_max_interval, store_sniff_max_interval); +static DEVICE_ATTR(sniff_min_interval, S_IRUGO | S_IWUSR, + show_sniff_min_interval, store_sniff_min_interval); + +static struct device_attribute *bt_attrs[] = { + &dev_attr_name, + &dev_attr_type, + &dev_attr_address, + &dev_attr_flags, + &dev_attr_inquiry_cache, + &dev_attr_idle_timeout, + &dev_attr_sniff_max_interval, + &dev_attr_sniff_min_interval, + NULL }; +struct class *bt_class = NULL; EXPORT_SYMBOL_GPL(bt_class); +static struct bus_type bt_bus = { + .name = "bluetooth", +}; + +static struct platform_device *bt_platform; + +static void bt_release(struct device *dev) +{ + struct hci_dev *hdev = dev_get_drvdata(dev); + kfree(hdev); +} + int hci_register_sysfs(struct hci_dev *hdev) { - struct class_device *cdev = &hdev->class_dev; + struct device *dev = &hdev->dev; unsigned int i; int err; BT_DBG("%p name %s type %d", hdev, hdev->name, hdev->type); - cdev->class = &bt_class; - class_set_devdata(cdev, hdev); + dev->class = bt_class; + + if (hdev->parent) + dev->parent = hdev->parent; + else + dev->parent = &bt_platform->dev; + + strlcpy(dev->bus_id, hdev->name, BUS_ID_SIZE); + + dev->release = bt_release; - strlcpy(cdev->class_id, hdev->name, BUS_ID_SIZE); - err = class_device_register(cdev); + dev_set_drvdata(dev, hdev); + + err = device_register(dev); if (err < 0) return err; for (i = 0; bt_attrs[i]; i++) - class_device_create_file(cdev, bt_attrs[i]); + device_create_file(dev, bt_attrs[i]); return 0; } void hci_unregister_sysfs(struct hci_dev *hdev) { - struct class_device * cdev = &hdev->class_dev; + struct device *dev = &hdev->dev; BT_DBG("%p name %s type %d", hdev, hdev->name, hdev->type); - class_device_del(cdev); + device_del(dev); } int __init bt_sysfs_init(void) { - return class_register(&bt_class); + int err; + + bt_platform = platform_device_register_simple("bluetooth", -1, NULL, 0); + if (IS_ERR(bt_platform)) + return PTR_ERR(bt_platform); + + err = bus_register(&bt_bus); + if (err < 0) { + platform_device_unregister(bt_platform); + return err; + } + + bt_class = class_create(THIS_MODULE, "bluetooth"); + if (IS_ERR(bt_class)) { + bus_unregister(&bt_bus); + platform_device_unregister(bt_platform); + return PTR_ERR(bt_class); + } + + return 0; } void __exit bt_sysfs_cleanup(void) { - class_unregister(&bt_class); + class_destroy(bt_class); + + bus_unregister(&bt_bus); + + platform_device_unregister(bt_platform); } diff --git a/net/bluetooth/hidp/Kconfig b/net/bluetooth/hidp/Kconfig index 4e958f7d9..c6abf2a5a 100644 --- a/net/bluetooth/hidp/Kconfig +++ b/net/bluetooth/hidp/Kconfig @@ -1,7 +1,6 @@ config BT_HIDP tristate "HIDP protocol support" - depends on BT && BT_L2CAP - select INPUT + depends on BT && BT_L2CAP && INPUT help HIDP (Human Interface Device Protocol) is a transport layer for HID reports. HIDP is required for the Bluetooth Human diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c index affbc5546..c6e3a2c27 100644 --- a/net/bluetooth/hidp/core.c +++ b/net/bluetooth/hidp/core.c @@ -20,7 +20,6 @@ SOFTWARE IS DISCLAIMED. */ -#include #include #include @@ -428,7 +427,7 @@ static int hidp_send_frame(struct socket *sock, unsigned char *data, int len) return kernel_sendmsg(sock, &msg, &iv, 1, len); } -static int hidp_process_transmit(struct hidp_session *session) +static void hidp_process_transmit(struct hidp_session *session) { struct sk_buff *skb; @@ -453,9 +452,6 @@ static int hidp_process_transmit(struct hidp_session *session) hidp_set_timer(session); kfree_skb(skb); } - - return skb_queue_len(&session->ctrl_transmit) + - skb_queue_len(&session->intr_transmit); } static int hidp_session(void *arg) @@ -523,7 +519,7 @@ static int hidp_session(void *arg) if (session->input) { input_unregister_device(session->input); - kfree(session->input); + session->input = NULL; } up_write(&hidp_session_sem); @@ -539,6 +535,8 @@ static inline void hidp_setup_input(struct hidp_session *session, struct hidp_co input->private = session; + input->name = "Bluetooth HID Boot Protocol Device"; + input->id.bustype = BUS_BLUETOOTH; input->id.vendor = req->vendor; input->id.product = req->product; @@ -584,17 +582,15 @@ int hidp_add_connection(struct hidp_connadd_req *req, struct socket *ctrl_sock, bacmp(&bt_sk(ctrl_sock->sk)->dst, &bt_sk(intr_sock->sk)->dst)) return -ENOTUNIQ; - session = kmalloc(sizeof(struct hidp_session), GFP_KERNEL); - if (!session) + session = kzalloc(sizeof(struct hidp_session), GFP_KERNEL); + if (!session) return -ENOMEM; - memset(session, 0, sizeof(struct hidp_session)); - session->input = kmalloc(sizeof(struct input_dev), GFP_KERNEL); + session->input = input_allocate_device(); if (!session->input) { kfree(session); return -ENOMEM; } - memset(session->input, 0, sizeof(struct input_dev)); down_write(&hidp_session_sem); @@ -654,15 +650,15 @@ unlink: __hidp_unlink_session(session); - if (session->input) + if (session->input) { input_unregister_device(session->input); + session->input = NULL; /* don't try to free it here */ + } failed: up_write(&hidp_session_sem); - if (session->input) - kfree(session->input); - + kfree(session->input); kfree(session); return err; } diff --git a/net/bluetooth/hidp/sock.c b/net/bluetooth/hidp/sock.c index f8986f881..099646e4e 100644 --- a/net/bluetooth/hidp/sock.c +++ b/net/bluetooth/hidp/sock.c @@ -20,10 +20,10 @@ SOFTWARE IS DISCLAIMED. */ -#include #include #include +#include #include #include #include @@ -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, diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index f6b4a8085..d56f60b39 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c @@ -24,7 +24,6 @@ /* Bluetooth L2CAP core and sockets. */ -#include #include #include @@ -64,11 +63,6 @@ static struct bt_sock_list l2cap_sk_list = { .lock = RW_LOCK_UNLOCKED }; -static int l2cap_conn_del(struct hci_conn *conn, int err); - -static void __l2cap_chan_add(struct l2cap_conn *conn, struct sock *sk, struct sock *parent); -static void l2cap_chan_del(struct sock *sk, int err); - static void __l2cap_sock_close(struct sock *sk, int reason); static void l2cap_sock_close(struct sock *sk); static void l2cap_sock_kill(struct sock *sk); @@ -110,24 +104,177 @@ static void l2cap_sock_init_timer(struct sock *sk) sk->sk_timer.data = (unsigned long)sk; } +/* ---- L2CAP channels ---- */ +static struct sock *__l2cap_get_chan_by_dcid(struct l2cap_chan_list *l, u16 cid) +{ + struct sock *s; + for (s = l->head; s; s = l2cap_pi(s)->next_c) { + if (l2cap_pi(s)->dcid == cid) + break; + } + return s; +} + +static struct sock *__l2cap_get_chan_by_scid(struct l2cap_chan_list *l, u16 cid) +{ + struct sock *s; + for (s = l->head; s; s = l2cap_pi(s)->next_c) { + if (l2cap_pi(s)->scid == cid) + break; + } + return s; +} + +/* Find channel with given SCID. + * Returns locked socket */ +static inline struct sock *l2cap_get_chan_by_scid(struct l2cap_chan_list *l, u16 cid) +{ + struct sock *s; + read_lock(&l->lock); + s = __l2cap_get_chan_by_scid(l, cid); + if (s) bh_lock_sock(s); + read_unlock(&l->lock); + return s; +} + +static struct sock *__l2cap_get_chan_by_ident(struct l2cap_chan_list *l, u8 ident) +{ + struct sock *s; + for (s = l->head; s; s = l2cap_pi(s)->next_c) { + if (l2cap_pi(s)->ident == ident) + break; + } + return s; +} + +static inline struct sock *l2cap_get_chan_by_ident(struct l2cap_chan_list *l, u8 ident) +{ + struct sock *s; + read_lock(&l->lock); + s = __l2cap_get_chan_by_ident(l, ident); + if (s) bh_lock_sock(s); + read_unlock(&l->lock); + return s; +} + +static u16 l2cap_alloc_cid(struct l2cap_chan_list *l) +{ + u16 cid = 0x0040; + + for (; cid < 0xffff; cid++) { + if(!__l2cap_get_chan_by_scid(l, cid)) + return cid; + } + + return 0; +} + +static inline void __l2cap_chan_link(struct l2cap_chan_list *l, struct sock *sk) +{ + sock_hold(sk); + + if (l->head) + l2cap_pi(l->head)->prev_c = sk; + + l2cap_pi(sk)->next_c = l->head; + l2cap_pi(sk)->prev_c = NULL; + l->head = sk; +} + +static inline void l2cap_chan_unlink(struct l2cap_chan_list *l, struct sock *sk) +{ + struct sock *next = l2cap_pi(sk)->next_c, *prev = l2cap_pi(sk)->prev_c; + + write_lock_bh(&l->lock); + if (sk == l->head) + l->head = next; + + if (next) + l2cap_pi(next)->prev_c = prev; + if (prev) + l2cap_pi(prev)->next_c = next; + write_unlock_bh(&l->lock); + + __sock_put(sk); +} + +static void __l2cap_chan_add(struct l2cap_conn *conn, struct sock *sk, struct sock *parent) +{ + struct l2cap_chan_list *l = &conn->chan_list; + + BT_DBG("conn %p, psm 0x%2.2x, dcid 0x%4.4x", conn, l2cap_pi(sk)->psm, l2cap_pi(sk)->dcid); + + l2cap_pi(sk)->conn = conn; + + if (sk->sk_type == SOCK_SEQPACKET) { + /* Alloc CID for connection-oriented socket */ + l2cap_pi(sk)->scid = l2cap_alloc_cid(l); + } else if (sk->sk_type == SOCK_DGRAM) { + /* Connectionless socket */ + l2cap_pi(sk)->scid = 0x0002; + l2cap_pi(sk)->dcid = 0x0002; + l2cap_pi(sk)->omtu = L2CAP_DEFAULT_MTU; + } else { + /* Raw socket can send/recv signalling messages only */ + l2cap_pi(sk)->scid = 0x0001; + l2cap_pi(sk)->dcid = 0x0001; + l2cap_pi(sk)->omtu = L2CAP_DEFAULT_MTU; + } + + __l2cap_chan_link(l, sk); + + if (parent) + bt_accept_enqueue(parent, sk); +} + +/* Delete channel. + * Must be called on the locked socket. */ +static void l2cap_chan_del(struct sock *sk, int err) +{ + struct l2cap_conn *conn = l2cap_pi(sk)->conn; + struct sock *parent = bt_sk(sk)->parent; + + l2cap_sock_clear_timer(sk); + + BT_DBG("sk %p, conn %p, err %d", sk, conn, err); + + if (conn) { + /* Unlink from channel list */ + l2cap_chan_unlink(&conn->chan_list, sk); + l2cap_pi(sk)->conn = NULL; + hci_conn_put(conn->hcon); + } + + sk->sk_state = BT_CLOSED; + sock_set_flag(sk, SOCK_ZAPPED); + + if (err) + sk->sk_err = err; + + if (parent) { + bt_accept_unlink(sk); + parent->sk_data_ready(parent, 0); + } else + sk->sk_state_change(sk); +} + /* ---- L2CAP connections ---- */ static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon, u8 status) { - struct l2cap_conn *conn; - - if ((conn = hcon->l2cap_data)) - return conn; + struct l2cap_conn *conn = hcon->l2cap_data; - if (status) + if (conn || status) return conn; - if (!(conn = kmalloc(sizeof(struct l2cap_conn), GFP_ATOMIC))) + conn = kzalloc(sizeof(struct l2cap_conn), GFP_ATOMIC); + if (!conn) return NULL; - memset(conn, 0, sizeof(struct l2cap_conn)); hcon->l2cap_data = conn; conn->hcon = hcon; + BT_DBG("hcon %p conn %p", hcon, conn); + conn->mtu = hcon->hdev->acl_mtu; conn->src = &hcon->hdev->bdaddr; conn->dst = &hcon->dst; @@ -135,17 +282,16 @@ static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon, u8 status) spin_lock_init(&conn->lock); rwlock_init(&conn->chan_list.lock); - BT_DBG("hcon %p conn %p", hcon, conn); return conn; } -static int l2cap_conn_del(struct hci_conn *hcon, int err) +static void l2cap_conn_del(struct hci_conn *hcon, int err) { - struct l2cap_conn *conn; + struct l2cap_conn *conn = hcon->l2cap_data; struct sock *sk; - if (!(conn = hcon->l2cap_data)) - return 0; + if (!conn) + return; BT_DBG("hcon %p conn %p, err %d", hcon, conn, err); @@ -162,15 +308,14 @@ static int l2cap_conn_del(struct hci_conn *hcon, int err) hcon->l2cap_data = NULL; kfree(conn); - return 0; } static inline void l2cap_chan_add(struct l2cap_conn *conn, struct sock *sk, struct sock *parent) { struct l2cap_chan_list *l = &conn->chan_list; - write_lock(&l->lock); + write_lock_bh(&l->lock); __l2cap_chan_add(conn, sk, parent); - write_unlock(&l->lock); + write_unlock_bh(&l->lock); } static inline u8 l2cap_get_ident(struct l2cap_conn *conn) @@ -183,14 +328,14 @@ static inline u8 l2cap_get_ident(struct l2cap_conn *conn) * 200 - 254 are used by utilities like l2ping, etc. */ - spin_lock(&conn->lock); + spin_lock_bh(&conn->lock); if (++conn->tx_ident > 128) conn->tx_ident = 1; id = conn->tx_ident; - spin_unlock(&conn->lock); + spin_unlock_bh(&conn->lock); return id; } @@ -926,160 +1071,6 @@ static int l2cap_sock_release(struct socket *sock) return err; } -/* ---- L2CAP channels ---- */ -static struct sock *__l2cap_get_chan_by_dcid(struct l2cap_chan_list *l, u16 cid) -{ - struct sock *s; - for (s = l->head; s; s = l2cap_pi(s)->next_c) { - if (l2cap_pi(s)->dcid == cid) - break; - } - return s; -} - -static struct sock *__l2cap_get_chan_by_scid(struct l2cap_chan_list *l, u16 cid) -{ - struct sock *s; - for (s = l->head; s; s = l2cap_pi(s)->next_c) { - if (l2cap_pi(s)->scid == cid) - break; - } - return s; -} - -/* Find channel with given SCID. - * Returns locked socket */ -static inline struct sock *l2cap_get_chan_by_scid(struct l2cap_chan_list *l, u16 cid) -{ - struct sock *s; - read_lock(&l->lock); - s = __l2cap_get_chan_by_scid(l, cid); - if (s) bh_lock_sock(s); - read_unlock(&l->lock); - return s; -} - -static struct sock *__l2cap_get_chan_by_ident(struct l2cap_chan_list *l, u8 ident) -{ - struct sock *s; - for (s = l->head; s; s = l2cap_pi(s)->next_c) { - if (l2cap_pi(s)->ident == ident) - break; - } - return s; -} - -static inline struct sock *l2cap_get_chan_by_ident(struct l2cap_chan_list *l, u8 ident) -{ - struct sock *s; - read_lock(&l->lock); - s = __l2cap_get_chan_by_ident(l, ident); - if (s) bh_lock_sock(s); - read_unlock(&l->lock); - return s; -} - -static u16 l2cap_alloc_cid(struct l2cap_chan_list *l) -{ - u16 cid = 0x0040; - - for (; cid < 0xffff; cid++) { - if(!__l2cap_get_chan_by_scid(l, cid)) - return cid; - } - - return 0; -} - -static inline void __l2cap_chan_link(struct l2cap_chan_list *l, struct sock *sk) -{ - sock_hold(sk); - - if (l->head) - l2cap_pi(l->head)->prev_c = sk; - - l2cap_pi(sk)->next_c = l->head; - l2cap_pi(sk)->prev_c = NULL; - l->head = sk; -} - -static inline void l2cap_chan_unlink(struct l2cap_chan_list *l, struct sock *sk) -{ - struct sock *next = l2cap_pi(sk)->next_c, *prev = l2cap_pi(sk)->prev_c; - - write_lock(&l->lock); - if (sk == l->head) - l->head = next; - - if (next) - l2cap_pi(next)->prev_c = prev; - if (prev) - l2cap_pi(prev)->next_c = next; - write_unlock(&l->lock); - - __sock_put(sk); -} - -static void __l2cap_chan_add(struct l2cap_conn *conn, struct sock *sk, struct sock *parent) -{ - struct l2cap_chan_list *l = &conn->chan_list; - - BT_DBG("conn %p, psm 0x%2.2x, dcid 0x%4.4x", conn, l2cap_pi(sk)->psm, l2cap_pi(sk)->dcid); - - l2cap_pi(sk)->conn = conn; - - if (sk->sk_type == SOCK_SEQPACKET) { - /* Alloc CID for connection-oriented socket */ - l2cap_pi(sk)->scid = l2cap_alloc_cid(l); - } else if (sk->sk_type == SOCK_DGRAM) { - /* Connectionless socket */ - l2cap_pi(sk)->scid = 0x0002; - l2cap_pi(sk)->dcid = 0x0002; - l2cap_pi(sk)->omtu = L2CAP_DEFAULT_MTU; - } else { - /* Raw socket can send/recv signalling messages only */ - l2cap_pi(sk)->scid = 0x0001; - l2cap_pi(sk)->dcid = 0x0001; - l2cap_pi(sk)->omtu = L2CAP_DEFAULT_MTU; - } - - __l2cap_chan_link(l, sk); - - if (parent) - bt_accept_enqueue(parent, sk); -} - -/* Delete channel. - * Must be called on the locked socket. */ -static void l2cap_chan_del(struct sock *sk, int err) -{ - struct l2cap_conn *conn = l2cap_pi(sk)->conn; - struct sock *parent = bt_sk(sk)->parent; - - l2cap_sock_clear_timer(sk); - - BT_DBG("sk %p, conn %p, err %d", sk, conn, err); - - if (conn) { - /* Unlink from channel list */ - l2cap_chan_unlink(&conn->chan_list, sk); - l2cap_pi(sk)->conn = NULL; - hci_conn_put(conn->hcon); - } - - sk->sk_state = BT_CLOSED; - sock_set_flag(sk, SOCK_ZAPPED); - - if (err) - sk->sk_err = err; - - if (parent) { - bt_accept_unlink(sk); - parent->sk_data_ready(parent, 0); - } else - sk->sk_state_change(sk); -} - static void l2cap_conn_ready(struct l2cap_conn *conn) { struct l2cap_chan_list *l = &conn->chan_list; @@ -1425,11 +1416,11 @@ static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hd if (!sk) goto response; - write_lock(&list->lock); + write_lock_bh(&list->lock); /* Check if we already have channel with that dcid */ if (__l2cap_get_chan_by_dcid(list, scid)) { - write_unlock(&list->lock); + write_unlock_bh(&list->lock); sock_set_flag(sk, SOCK_ZAPPED); l2cap_sock_kill(sk); goto response; @@ -1467,7 +1458,7 @@ static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hd result = status = 0; done: - write_unlock(&list->lock); + write_unlock_bh(&list->lock); response: bh_unlock_sock(parent); @@ -1835,7 +1826,9 @@ drop: kfree_skb(skb); done: - if (sk) bh_unlock_sock(sk); + if (sk) + bh_unlock_sock(sk); + return 0; } @@ -1926,18 +1919,18 @@ static int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type) static int l2cap_connect_cfm(struct hci_conn *hcon, u8 status) { + struct l2cap_conn *conn; + BT_DBG("hcon %p bdaddr %s status %d", hcon, batostr(&hcon->dst), status); if (hcon->type != ACL_LINK) return 0; if (!status) { - struct l2cap_conn *conn; - conn = l2cap_conn_add(hcon, status); if (conn) l2cap_conn_ready(conn); - } else + } else l2cap_conn_del(hcon, bt_err(status)); return 0; @@ -1951,19 +1944,21 @@ static int l2cap_disconn_ind(struct hci_conn *hcon, u8 reason) return 0; l2cap_conn_del(hcon, bt_err(reason)); + return 0; } static int l2cap_auth_cfm(struct hci_conn *hcon, u8 status) { struct l2cap_chan_list *l; - struct l2cap_conn *conn; + struct l2cap_conn *conn = conn = hcon->l2cap_data; struct l2cap_conn_rsp rsp; struct sock *sk; int result; - if (!(conn = hcon->l2cap_data)) + if (!conn) return 0; + l = &conn->chan_list; BT_DBG("conn %p", conn); @@ -2006,13 +2001,14 @@ static int l2cap_auth_cfm(struct hci_conn *hcon, u8 status) static int l2cap_encrypt_cfm(struct hci_conn *hcon, u8 status) { struct l2cap_chan_list *l; - struct l2cap_conn *conn; + struct l2cap_conn *conn = hcon->l2cap_data; struct l2cap_conn_rsp rsp; struct sock *sk; int result; - if (!(conn = hcon->l2cap_data)) + if (!conn) return 0; + l = &conn->chan_list; BT_DBG("conn %p", conn); @@ -2220,7 +2216,7 @@ static int __init l2cap_init(void) goto error; } - class_create_file(&bt_class, &class_attr_l2cap); + class_create_file(bt_class, &class_attr_l2cap); BT_INFO("L2CAP ver %s", VERSION); BT_INFO("L2CAP socket layer initialized"); @@ -2234,7 +2230,7 @@ error: static void __exit l2cap_exit(void) { - class_remove_file(&bt_class, &class_attr_l2cap); + class_remove_file(bt_class, &class_attr_l2cap); if (bt_sock_unregister(BTPROTO_L2CAP) < 0) BT_ERR("L2CAP socket unregistration failed"); diff --git a/net/bluetooth/lib.c b/net/bluetooth/lib.c index ee6a66979..e5fd0cb70 100644 --- a/net/bluetooth/lib.c +++ b/net/bluetooth/lib.c @@ -24,7 +24,6 @@ /* Bluetooth kernel library. */ -#include #include #include diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c index e99010ce8..332dd8f43 100644 --- a/net/bluetooth/rfcomm/core.c +++ b/net/bluetooth/rfcomm/core.c @@ -27,7 +27,6 @@ * $Id: core.c,v 1.42 2002/10/01 23:26:25 maxk Exp $ */ -#include #include #include #include @@ -53,8 +52,10 @@ #define BT_DBG(D...) #endif -#define VERSION "1.7" +#define VERSION "1.8" +static int disable_cfc = 0; +static int channel_mtu = -1; static unsigned int l2cap_mtu = RFCOMM_MAX_L2CAP_MTU; static struct task_struct *rfcomm_thread; @@ -273,10 +274,10 @@ static void rfcomm_dlc_clear_state(struct rfcomm_dlc *d) struct rfcomm_dlc *rfcomm_dlc_alloc(gfp_t prio) { - struct rfcomm_dlc *d = kmalloc(sizeof(*d), prio); + struct rfcomm_dlc *d = kzalloc(sizeof(*d), prio); + if (!d) return NULL; - memset(d, 0, sizeof(*d)); init_timer(&d->timer); d->timer.function = rfcomm_dlc_timeout; @@ -289,6 +290,7 @@ struct rfcomm_dlc *rfcomm_dlc_alloc(gfp_t prio) rfcomm_dlc_clear_state(d); BT_DBG("%p", d); + return d; } @@ -522,10 +524,10 @@ int rfcomm_dlc_get_modem_status(struct rfcomm_dlc *d, u8 *v24_sig) /* ---- RFCOMM sessions ---- */ static struct rfcomm_session *rfcomm_session_add(struct socket *sock, int state) { - struct rfcomm_session *s = kmalloc(sizeof(*s), GFP_KERNEL); + struct rfcomm_session *s = kzalloc(sizeof(*s), GFP_KERNEL); + if (!s) return NULL; - memset(s, 0, sizeof(*s)); BT_DBG("session %p sock %p", s, sock); @@ -534,7 +536,7 @@ static struct rfcomm_session *rfcomm_session_add(struct socket *sock, int state) s->sock = sock; s->mtu = RFCOMM_DEFAULT_MTU; - s->cfc = RFCOMM_CFC_UNKNOWN; + s->cfc = disable_cfc ? RFCOMM_CFC_DISABLED : RFCOMM_CFC_UNKNOWN; /* Do not increment module usage count for listening sessions. * Otherwise we won't be able to unload the module. */ @@ -811,7 +813,10 @@ static int rfcomm_send_pn(struct rfcomm_session *s, int cr, struct rfcomm_dlc *d pn->credits = 0; } - pn->mtu = htobs(d->mtu); + if (cr && channel_mtu >= 0) + pn->mtu = htobs(channel_mtu); + else + pn->mtu = htobs(d->mtu); *ptr = __fcs(buf); ptr++; @@ -1150,6 +1155,8 @@ static inline int rfcomm_check_link_mode(struct rfcomm_dlc *d) static void rfcomm_dlc_accept(struct rfcomm_dlc *d) { + struct sock *sk = d->session->sock->sk; + BT_DBG("dlc %p", d); rfcomm_send_ua(d->session, d->dlci); @@ -1159,6 +1166,9 @@ static void rfcomm_dlc_accept(struct rfcomm_dlc *d) d->state_change(d, 0); rfcomm_dlc_unlock(d); + if (d->link_mode & RFCOMM_LM_MASTER) + hci_conn_switch_role(l2cap_pi(sk)->conn->hcon, 0x00); + rfcomm_send_msc(d->session, 1, d->dlci, d->v24_sig); } @@ -1223,17 +1233,24 @@ static int rfcomm_apply_pn(struct rfcomm_dlc *d, int cr, struct rfcomm_pn *pn) BT_DBG("dlc %p state %ld dlci %d mtu %d fc 0x%x credits %d", d, d->state, d->dlci, pn->mtu, pn->flow_ctrl, pn->credits); - if (pn->flow_ctrl == 0xf0 || pn->flow_ctrl == 0xe0) { - d->cfc = s->cfc = RFCOMM_CFC_ENABLED; + if ((pn->flow_ctrl == 0xf0 && s->cfc != RFCOMM_CFC_DISABLED) || + pn->flow_ctrl == 0xe0) { + d->cfc = RFCOMM_CFC_ENABLED; d->tx_credits = pn->credits; } else { - d->cfc = s->cfc = RFCOMM_CFC_DISABLED; + d->cfc = RFCOMM_CFC_DISABLED; set_bit(RFCOMM_TX_THROTTLED, &d->flags); } + if (s->cfc == RFCOMM_CFC_UNKNOWN) + s->cfc = d->cfc; + d->priority = pn->priority; - d->mtu = s->mtu = btohs(pn->mtu); + d->mtu = btohs(pn->mtu); + + if (cr && d->mtu > s->mtu) + d->mtu = s->mtu; return 0; } @@ -1760,6 +1777,11 @@ static inline void rfcomm_accept_connection(struct rfcomm_session *s) s = rfcomm_session_add(nsock, BT_OPEN); if (s) { rfcomm_session_hold(s); + + /* We should adjust MTU on incoming sessions. + * L2CAP MTU minus UIH header and FCS. */ + s->mtu = min(l2cap_pi(nsock->sk)->omtu, l2cap_pi(nsock->sk)->imtu) - 5; + rfcomm_schedule(RFCOMM_SCHED_RX); } else sock_release(nsock); @@ -2036,7 +2058,7 @@ static int __init rfcomm_init(void) kernel_thread(rfcomm_run, NULL, CLONE_KERNEL); - class_create_file(&bt_class, &class_attr_rfcomm_dlc); + class_create_file(bt_class, &class_attr_rfcomm_dlc); rfcomm_init_sockets(); @@ -2051,7 +2073,7 @@ static int __init rfcomm_init(void) static void __exit rfcomm_exit(void) { - class_remove_file(&bt_class, &class_attr_rfcomm_dlc); + class_remove_file(bt_class, &class_attr_rfcomm_dlc); hci_unregister_cb(&rfcomm_cb); @@ -2074,6 +2096,12 @@ static void __exit rfcomm_exit(void) module_init(rfcomm_init); module_exit(rfcomm_exit); +module_param(disable_cfc, bool, 0644); +MODULE_PARM_DESC(disable_cfc, "Disable credit based flow control"); + +module_param(channel_mtu, int, 0644); +MODULE_PARM_DESC(channel_mtu, "Default MTU for the RFCOMM channel"); + module_param(l2cap_mtu, uint, 0644); MODULE_PARM_DESC(l2cap_mtu, "Default MTU for the L2CAP connection"); diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c index 757d2dd3b..220fee04e 100644 --- a/net/bluetooth/rfcomm/sock.c +++ b/net/bluetooth/rfcomm/sock.c @@ -27,7 +27,6 @@ * $Id: sock.c,v 1.24 2002/10/03 01:00:34 maxk Exp $ */ -#include #include #include @@ -945,7 +944,7 @@ int __init rfcomm_init_sockets(void) if (err < 0) goto error; - class_create_file(&bt_class, &class_attr_rfcomm); + class_create_file(bt_class, &class_attr_rfcomm); BT_INFO("RFCOMM socket layer initialized"); @@ -959,7 +958,7 @@ error: void __exit rfcomm_cleanup_sockets(void) { - class_remove_file(&bt_class, &class_attr_rfcomm); + class_remove_file(bt_class, &class_attr_rfcomm); if (bt_sock_unregister(BTPROTO_RFCOMM) < 0) BT_ERR("RFCOMM socket layer unregistration failed"); diff --git a/net/bluetooth/rfcomm/tty.c b/net/bluetooth/rfcomm/tty.c index 74368f79e..5d65cebda 100644 --- a/net/bluetooth/rfcomm/tty.c +++ b/net/bluetooth/rfcomm/tty.c @@ -27,7 +27,6 @@ * $Id: tty.c,v 1.24 2002/10/03 01:54:38 holtmann Exp $ */ -#include #include #include @@ -170,10 +169,9 @@ static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc) BT_DBG("id %d channel %d", req->dev_id, req->channel); - dev = kmalloc(sizeof(struct rfcomm_dev), GFP_KERNEL); + dev = kzalloc(sizeof(struct rfcomm_dev), GFP_KERNEL); if (!dev) return -ENOMEM; - memset(dev, 0, sizeof(struct rfcomm_dev)); write_lock_bh(&rfcomm_dev_lock); @@ -480,12 +478,8 @@ static void rfcomm_dev_data_ready(struct rfcomm_dlc *dlc, struct sk_buff *skb) BT_DBG("dlc %p tty %p len %d", dlc, tty, skb->len); - if (test_bit(TTY_DONT_FLIP, &tty->flags)) { - tty_buffer_request_room(tty, skb->len); - tty_insert_flip_string(tty, skb->data, skb->len); - tty_flip_buffer_push(tty); - } else - tty->ldisc.receive_buf(tty, skb->data, NULL, skb->len); + tty_insert_flip_string(tty, skb->data, skb->len); + tty_flip_buffer_push(tty); kfree_skb(skb); } @@ -754,6 +748,9 @@ static void rfcomm_tty_set_termios(struct tty_struct *tty, struct termios *old) BT_DBG("tty %p termios %p", tty, old); + if (!dev) + return; + /* Handle turning off CRTSCTS */ if ((old->c_cflag & CRTSCTS) && !(new->c_cflag & CRTSCTS)) BT_DBG("Turning off CRTSCTS unsupported"); @@ -1025,13 +1022,12 @@ int rfcomm_init_ttys(void) rfcomm_tty_driver->owner = THIS_MODULE; rfcomm_tty_driver->driver_name = "rfcomm"; - rfcomm_tty_driver->devfs_name = "bluetooth/rfcomm/"; rfcomm_tty_driver->name = "rfcomm"; rfcomm_tty_driver->major = RFCOMM_TTY_MAJOR; rfcomm_tty_driver->minor_start = RFCOMM_TTY_MINOR; rfcomm_tty_driver->type = TTY_DRIVER_TYPE_SERIAL; rfcomm_tty_driver->subtype = SERIAL_TYPE_NORMAL; - rfcomm_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS; + rfcomm_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV; rfcomm_tty_driver->init_termios = tty_std_termios; rfcomm_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; tty_set_operations(rfcomm_tty_driver, &rfcomm_ops); diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index 0c2d13ad6..7714a2ec3 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c @@ -24,7 +24,6 @@ /* Bluetooth SCO sockets. */ -#include #include #include @@ -109,17 +108,14 @@ static void sco_sock_init_timer(struct sock *sk) static struct sco_conn *sco_conn_add(struct hci_conn *hcon, __u8 status) { struct hci_dev *hdev = hcon->hdev; - struct sco_conn *conn; - - if ((conn = hcon->sco_data)) - return conn; + struct sco_conn *conn = hcon->sco_data; - if (status) + if (conn || status) return conn; - if (!(conn = kmalloc(sizeof(struct sco_conn), GFP_ATOMIC))) + conn = kzalloc(sizeof(struct sco_conn), GFP_ATOMIC); + if (!conn) return NULL; - memset(conn, 0, sizeof(struct sco_conn)); spin_lock_init(&conn->lock); @@ -135,6 +131,7 @@ static struct sco_conn *sco_conn_add(struct hci_conn *hcon, __u8 status) conn->mtu = 60; BT_DBG("hcon %p conn %p", hcon, conn); + return conn; } @@ -970,7 +967,7 @@ static int __init sco_init(void) goto error; } - class_create_file(&bt_class, &class_attr_sco); + class_create_file(bt_class, &class_attr_sco); BT_INFO("SCO (Voice Link) ver %s", VERSION); BT_INFO("SCO socket layer initialized"); @@ -984,7 +981,7 @@ error: static void __exit sco_exit(void) { - class_remove_file(&bt_class, &class_attr_sco); + class_remove_file(bt_class, &class_attr_sco); if (bt_sock_unregister(BTPROTO_SCO) < 0) BT_ERR("SCO socket unregistration failed"); diff --git a/net/bridge/Makefile b/net/bridge/Makefile index 59556e40e..f444c12cd 100644 --- a/net/bridge/Makefile +++ b/net/bridge/Makefile @@ -6,7 +6,7 @@ obj-$(CONFIG_BRIDGE) += bridge.o bridge-y := br.o br_device.o br_fdb.o br_forward.o br_if.o br_input.o \ br_ioctl.o br_notify.o br_stp.o br_stp_bpdu.o \ - br_stp_if.o br_stp_timer.o + br_stp_if.o br_stp_timer.o br_netlink.o bridge-$(CONFIG_SYSFS) += br_sysfs_if.o br_sysfs_br.o diff --git a/net/bridge/br.c b/net/bridge/br.c index 12da21afb..299438799 100644 --- a/net/bridge/br.c +++ b/net/bridge/br.c @@ -13,7 +13,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include @@ -30,36 +29,46 @@ static struct llc_sap *br_stp_sap; static int __init br_init(void) { + int err; + br_stp_sap = llc_sap_open(LLC_SAP_BSPAN, br_stp_rcv); if (!br_stp_sap) { printk(KERN_ERR "bridge: can't register sap for STP\n"); - return -EBUSY; + return -EADDRINUSE; } br_fdb_init(); -#ifdef CONFIG_BRIDGE_NETFILTER - if (br_netfilter_init()) - return 1; -#endif + err = br_netfilter_init(); + if (err) + goto err_out1; + + err = register_netdevice_notifier(&br_device_notifier); + if (err) + goto err_out2; + + br_netlink_init(); brioctl_set(br_ioctl_deviceless_stub); br_handle_frame_hook = br_handle_frame; br_fdb_get_hook = br_fdb_get; br_fdb_put_hook = br_fdb_put; - register_netdevice_notifier(&br_device_notifier); - return 0; + +err_out2: + br_netfilter_fini(); +err_out1: + llc_sap_put(br_stp_sap); + return err; } static void __exit br_deinit(void) { rcu_assign_pointer(br_stp_sap->rcv_func, NULL); -#ifdef CONFIG_BRIDGE_NETFILTER + br_netlink_fini(); br_netfilter_fini(); -#endif unregister_netdevice_notifier(&br_device_notifier); brioctl_set(NULL); diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c index 056df7ceb..864fbbc7b 100644 --- a/net/bridge/br_forward.c +++ b/net/bridge/br_forward.c @@ -20,14 +20,11 @@ #include #include "br_private.h" +/* Don't forward packets to originating port or forwarding diasabled */ static inline int should_deliver(const struct net_bridge_port *p, const struct sk_buff *skb) { - if (skb->dev == p->dev || - p->state != BR_STATE_FORWARDING) - return 0; - - return 1; + return (skb->dev != p->dev && p->state == BR_STATE_FORWARDING); } static inline unsigned packet_length(const struct sk_buff *skb) @@ -37,8 +34,8 @@ static inline unsigned packet_length(const struct sk_buff *skb) int br_dev_queue_push_xmit(struct sk_buff *skb) { - /* drop mtu oversized packets except tso */ - if (skb->len > skb->dev->mtu && !skb_is_gso(skb)) + /* drop mtu oversized packets except gso */ + if (packet_length(skb) > skb->dev->mtu && !skb_is_gso(skb)) kfree_skb(skb); else { #ifdef CONFIG_BRIDGE_NETFILTER @@ -59,10 +56,9 @@ int br_dev_queue_push_xmit(struct sk_buff *skb) int br_forward_finish(struct sk_buff *skb) { - NF_HOOK(PF_BRIDGE, NF_BR_POST_ROUTING, skb, NULL, skb->dev, - br_dev_queue_push_xmit); + return NF_HOOK(PF_BRIDGE, NF_BR_POST_ROUTING, skb, NULL, skb->dev, + br_dev_queue_push_xmit); - return 0; } static void __br_deliver(const struct net_bridge_port *to, struct sk_buff *skb) diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c index f55ef682e..b1211d534 100644 --- a/net/bridge/br_if.c +++ b/net/bridge/br_if.c @@ -386,12 +386,17 @@ void br_features_recompute(struct net_bridge *br) checksum = 0; if (feature & NETIF_F_GSO) - feature |= NETIF_F_TSO; + feature |= NETIF_F_GSO_SOFTWARE; feature |= NETIF_F_GSO; features &= feature; } + if (!(checksum & NETIF_F_ALL_CSUM)) + features &= ~NETIF_F_SG; + if (!(features & NETIF_F_SG)) + features &= ~NETIF_F_GSO_MASK; + br->dev->features = features | checksum | NETIF_F_LLTX | NETIF_F_GSO_ROBUST; } diff --git a/net/bridge/br_ioctl.c b/net/bridge/br_ioctl.c index 159fb8409..4e4119a12 100644 --- a/net/bridge/br_ioctl.c +++ b/net/bridge/br_ioctl.c @@ -162,12 +162,10 @@ static int old_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) if (num > BR_MAX_PORTS) num = BR_MAX_PORTS; - indices = kmalloc(num*sizeof(int), GFP_KERNEL); + indices = kcalloc(num, sizeof(int), GFP_KERNEL); if (indices == NULL) return -ENOMEM; - memset(indices, 0, num*sizeof(int)); - get_port_ifindices(br, indices, num); if (copy_to_user((void __user *)args[1], indices, num*sizeof(int))) num = -EFAULT; @@ -327,11 +325,10 @@ static int old_deviceless(void __user *uarg) if (args[2] >= 2048) return -ENOMEM; - indices = kmalloc(args[2]*sizeof(int), GFP_KERNEL); + indices = kcalloc(args[2], sizeof(int), GFP_KERNEL); if (indices == NULL) return -ENOMEM; - memset(indices, 0, args[2]*sizeof(int)); args[2] = get_bridge_ifindices(indices, args[2]); ret = copy_to_user((void __user *)args[1], indices, args[2]*sizeof(int)) diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c index a64272783..05b3de888 100644 --- a/net/bridge/br_netfilter.c +++ b/net/bridge/br_netfilter.c @@ -61,6 +61,9 @@ static int brnf_filter_vlan_tagged = 1; #define brnf_filter_vlan_tagged 1 #endif +int brnf_deferred_hooks; +EXPORT_SYMBOL_GPL(brnf_deferred_hooks); + static __be16 inline vlan_proto(const struct sk_buff *skb) { return vlan_eth_hdr(skb)->h_vlan_encapsulated_proto; @@ -407,12 +410,8 @@ static unsigned int br_nf_pre_routing_ipv6(unsigned int hook, if (pkt_len || hdr->nexthdr != NEXTHDR_HOP) { if (pkt_len + sizeof(struct ipv6hdr) > skb->len) goto inhdr_error; - if (pkt_len + sizeof(struct ipv6hdr) < skb->len) { - if (__pskb_trim(skb, pkt_len + sizeof(struct ipv6hdr))) - goto inhdr_error; - if (skb->ip_summed == CHECKSUM_HW) - skb->ip_summed = CHECKSUM_NONE; - } + if (pskb_trim_rcsum(skb, pkt_len + sizeof(struct ipv6hdr))) + goto inhdr_error; } if (hdr->nexthdr == NEXTHDR_HOP && check_hbh_len(skb)) goto inhdr_error; @@ -495,11 +494,7 @@ static unsigned int br_nf_pre_routing(unsigned int hook, struct sk_buff **pskb, if (skb->len < len || len < 4 * iph->ihl) goto inhdr_error; - if (skb->len > len) { - __pskb_trim(skb, len); - if (skb->ip_summed == CHECKSUM_HW) - skb->ip_summed = CHECKSUM_NONE; - } + pskb_trim_rcsum(skb, len); nf_bridge_put(skb->nf_bridge); if (!nf_bridge_alloc(skb)) @@ -877,9 +872,8 @@ static unsigned int ip_sabotage_out(unsigned int hook, struct sk_buff **pskb, struct sk_buff *skb = *pskb; if ((out->hard_start_xmit == br_dev_xmit && - okfn != br_nf_forward_finish && - okfn != br_nf_local_out_finish && - okfn != br_nf_dev_queue_xmit) + okfn != br_nf_forward_finish && + okfn != br_nf_local_out_finish && okfn != br_nf_dev_queue_xmit) #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) || ((out->priv_flags & IFF_802_1Q_VLAN) && VLAN_DEV_INFO(out)->real_dev->hard_start_xmit == br_dev_xmit) @@ -899,6 +893,8 @@ static unsigned int ip_sabotage_out(unsigned int hook, struct sk_buff **pskb, return NF_ACCEPT; else if (ip->version == 6 && !brnf_call_ip6tables) return NF_ACCEPT; + else if (!brnf_deferred_hooks) + return NF_ACCEPT; #endif if (hook == NF_IP_POST_ROUTING) return NF_ACCEPT; diff --git a/net/bridge/br_notify.c b/net/bridge/br_notify.c index a43a9c1d5..20278494e 100644 --- a/net/bridge/br_notify.c +++ b/net/bridge/br_notify.c @@ -14,6 +14,7 @@ */ #include +#include #include "br_private.h" @@ -49,6 +50,7 @@ static int br_device_event(struct notifier_block *unused, unsigned long event, v case NETDEV_CHANGEADDR: br_fdb_changeaddr(p, dev->dev_addr); + br_ifinfo_notify(RTM_NEWLINK, p); br_stp_recalculate_bridge_id(br); break; diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h index 86ecea7ed..c491fb2f2 100644 --- a/net/bridge/br_private.h +++ b/net/bridge/br_private.h @@ -29,7 +29,7 @@ #define BR_PORT_DEBOUNCE (HZ/10) -#define BR_VERSION "2.1" +#define BR_VERSION "2.2" typedef struct bridge_id bridge_id; typedef struct mac_addr mac_addr; @@ -192,8 +192,13 @@ extern int br_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); extern int br_ioctl_deviceless_stub(unsigned int cmd, void __user *arg); /* br_netfilter.c */ +#ifdef CONFIG_BRIDGE_NETFILTER extern int br_netfilter_init(void); extern void br_netfilter_fini(void); +#else +#define br_netfilter_init() (0) +#define br_netfilter_fini() do { } while(0) +#endif /* br_stp.c */ extern void br_log_state(const struct net_bridge_port *p); @@ -232,6 +237,11 @@ extern struct net_bridge_fdb_entry *(*br_fdb_get_hook)(struct net_bridge *br, extern void (*br_fdb_put_hook)(struct net_bridge_fdb_entry *ent); +/* br_netlink.c */ +extern void br_netlink_init(void); +extern void br_netlink_fini(void); +extern void br_ifinfo_notify(int event, struct net_bridge_port *port); + #ifdef CONFIG_SYSFS /* br_sysfs_if.c */ extern struct sysfs_ops brport_sysfs_ops; diff --git a/net/bridge/br_stp_bpdu.c b/net/bridge/br_stp_bpdu.c index a7ba0cce0..068d8afbf 100644 --- a/net/bridge/br_stp_bpdu.c +++ b/net/bridge/br_stp_bpdu.c @@ -121,7 +121,7 @@ void br_send_tcn_bpdu(struct net_bridge_port *p) buf[1] = 0; buf[2] = 0; buf[3] = BPDU_TYPE_TCN; - br_send_bpdu(p, buf, 7); + br_send_bpdu(p, buf, 4); } /* diff --git a/net/bridge/br_stp_if.c b/net/bridge/br_stp_if.c index 23dea1422..14cd02507 100644 --- a/net/bridge/br_stp_if.c +++ b/net/bridge/br_stp_if.c @@ -16,6 +16,7 @@ #include #include #include +#include #include "br_private.h" #include "br_private_stp.h" @@ -86,6 +87,7 @@ void br_stp_disable_bridge(struct net_bridge *br) void br_stp_enable_port(struct net_bridge_port *p) { br_init_port(p); + br_ifinfo_notify(RTM_NEWLINK, p); br_port_state_selection(p->br); } @@ -99,6 +101,8 @@ void br_stp_disable_port(struct net_bridge_port *p) printk(KERN_INFO "%s: port %i(%s) entering %s state\n", br->dev->name, p->port_no, p->dev->name, "disabled"); + br_ifinfo_notify(RTM_DELLINK, p); + wasroot = br_is_root_bridge(br); br_become_designated_port(p); p->state = BR_STATE_DISABLED; diff --git a/net/bridge/netfilter/ebt_ulog.c b/net/bridge/netfilter/ebt_ulog.c index 1b37fa7ac..ffc18703c 100644 --- a/net/bridge/netfilter/ebt_ulog.c +++ b/net/bridge/netfilter/ebt_ulog.c @@ -29,7 +29,6 @@ */ #include -#include #include #include #include diff --git a/net/core/Makefile b/net/core/Makefile index 79fe12cce..2645ba428 100644 --- a/net/core/Makefile +++ b/net/core/Makefile @@ -7,7 +7,7 @@ obj-y := sock.o request_sock.o skbuff.o iovec.o datagram.o stream.o scm.o \ obj-$(CONFIG_SYSCTL) += sysctl_net_core.o -obj-y += dev.o ethtool.o dev_mcast.o dst.o \ +obj-y += dev.o ethtool.o dev_mcast.o dst.o netevent.o \ neighbour.o rtnetlink.o utils.o link_watch.o filter.o obj-$(CONFIG_XFRM) += flow.o @@ -16,3 +16,4 @@ obj-$(CONFIG_NET_DIVERT) += dv.o obj-$(CONFIG_NET_PKTGEN) += pktgen.o obj-$(CONFIG_WIRELESS_EXT) += wireless.o obj-$(CONFIG_NETPOLL) += netpoll.o +obj-$(CONFIG_NET_DMA) += user_dma.o diff --git a/net/core/dev.c b/net/core/dev.c index 50eff3771..4a54e888a 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -76,7 +76,6 @@ #include #include #include -#include #include #include #include @@ -115,7 +114,9 @@ #include #include #include +#include #include +#include #include #ifdef CONFIG_XEN @@ -156,6 +157,12 @@ static DEFINE_SPINLOCK(ptype_lock); static struct list_head ptype_base[16]; /* 16 way hashed list */ static struct list_head ptype_all; /* Taps */ +#ifdef CONFIG_NET_DMA +static struct dma_client *net_dma_client; +static unsigned int net_dma_count; +static spinlock_t net_dma_event_lock; +#endif + /* * The @dev_base list is protected by @dev_base_lock and the rtnl * semaphore. @@ -230,7 +237,7 @@ extern void netdev_unregister_sysfs(struct net_device *); * For efficiency */ -int netdev_nit; +static int netdev_nit; /* * Add a protocol ID to the list. Now that the input handler is @@ -633,14 +640,22 @@ struct net_device * dev_get_by_flags(unsigned short if_flags, unsigned short mas * @name: name string * * Network device names need to be valid file names to - * to allow sysfs to work + * to allow sysfs to work. We also disallow any kind of + * whitespace. */ int dev_valid_name(const char *name) { - return !(*name == '\0' - || !strcmp(name, ".") - || !strcmp(name, "..") - || strchr(name, '/')); + if (*name == '\0') + return 0; + if (!strcmp(name, ".") || !strcmp(name, "..")) + return 0; + + while (*name) { + if (*name == '/' || isspace(*name)) + return 0; + name++; + } + return 1; } /** @@ -1166,9 +1181,12 @@ int skb_checksum_help(struct sk_buff *skb, int inward) unsigned int csum; int ret = 0, offset = skb->h.raw - skb->data; - if (inward) { - skb->ip_summed = CHECKSUM_NONE; - goto out; + if (inward) + goto out_set_summed; + + if (unlikely(skb_shinfo(skb)->gso_size)) { + /* Let GSO fix up the checksum. */ + goto out_set_summed; } if (skb_cloned(skb)) { @@ -1185,6 +1203,8 @@ int skb_checksum_help(struct sk_buff *skb, int inward) BUG_ON(skb->csum + 2 > offset); *(u16*)(skb->h.raw + skb->csum) = csum_fold(csum); + +out_set_summed: skb->ip_summed = CHECKSUM_NONE; out: return ret; @@ -1205,17 +1225,30 @@ struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features) struct sk_buff *segs = ERR_PTR(-EPROTONOSUPPORT); struct packet_type *ptype; int type = skb->protocol; + int err; BUG_ON(skb_shinfo(skb)->frag_list); - BUG_ON(skb->ip_summed != CHECKSUM_HW); skb->mac.raw = skb->data; skb->mac_len = skb->nh.raw - skb->data; __skb_pull(skb, skb->mac_len); + if (unlikely(skb->ip_summed != CHECKSUM_HW)) { + if (skb_header_cloned(skb) && + (err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC))) + return ERR_PTR(err); + } + rcu_read_lock(); list_for_each_entry_rcu(ptype, &ptype_base[ntohs(type) & 15], list) { if (ptype->type == type && !ptype->dev && ptype->gso_segment) { + if (unlikely(skb->ip_summed != CHECKSUM_HW)) { + err = ptype->gso_send_check(skb); + segs = ERR_PTR(err); + if (err || skb_gso_ok(skb, features)) + break; + __skb_push(skb, skb->data - skb->nh.raw); + } segs = ptype->gso_segment(skb, features); break; } @@ -1242,7 +1275,6 @@ void netdev_rx_csum_fault(struct net_device *dev) EXPORT_SYMBOL(netdev_rx_csum_fault); #endif -#ifdef CONFIG_HIGHMEM /* Actually, we should eliminate this check as soon as we know, that: * 1. IOMMU is present and allows to map all the memory. * 2. No high memory really exists on this machine. @@ -1250,6 +1282,7 @@ EXPORT_SYMBOL(netdev_rx_csum_fault); static inline int illegal_highdma(struct net_device *dev, struct sk_buff *skb) { +#ifdef CONFIG_HIGHMEM int i; if (dev->features & NETIF_F_HIGHDMA) @@ -1259,11 +1292,9 @@ static inline int illegal_highdma(struct net_device *dev, struct sk_buff *skb) if (PageHighMem(skb_shinfo(skb)->frags[i].page)) return 1; +#endif return 0; } -#else -#define illegal_highdma(dev, skb) (0) -#endif struct dev_gso_cb { void (*destructor)(struct sk_buff *skb); @@ -1500,14 +1531,16 @@ gso: if (q->enqueue) { /* Grab device queue */ spin_lock(&dev->queue_lock); + q = dev->qdisc; + if (q->enqueue) { + rc = q->enqueue(skb, q); + qdisc_run(dev); + spin_unlock(&dev->queue_lock); - rc = q->enqueue(skb, q); - - qdisc_run(dev); - + rc = rc == NET_XMIT_BYPASS ? NET_XMIT_SUCCESS : rc; + goto out; + } spin_unlock(&dev->queue_lock); - rc = rc == NET_XMIT_BYPASS ? NET_XMIT_SUCCESS : rc; - goto out; } /* The device has no queue. Common case for software devices: @@ -1650,26 +1683,10 @@ static inline struct net_device *skb_bond(struct sk_buff *skb) struct net_device *dev = skb->dev; if (dev->master) { - /* - * On bonding slaves other than the currently active - * slave, suppress duplicates except for 802.3ad - * ETH_P_SLOW and alb non-mcast/bcast. - */ - if (dev->priv_flags & IFF_SLAVE_INACTIVE) { - if (dev->master->priv_flags & IFF_MASTER_ALB) { - if (skb->pkt_type != PACKET_BROADCAST && - skb->pkt_type != PACKET_MULTICAST) - goto keep; - } - - if (dev->master->priv_flags & IFF_MASTER_8023AD && - skb->protocol == __constant_htons(ETH_P_SLOW)) - goto keep; - + if (skb_bond_should_drop(skb)) { kfree_skb(skb); return NULL; } -keep: skb->dev = dev->master; } @@ -1776,7 +1793,7 @@ static int ing_filter(struct sk_buff *skb) if (dev->qdisc_ingress) { __u32 ttl = (__u32) G_TC_RTTL(skb->tc_verd); if (MAX_RED_LOOP < ttl++) { - printk("Redir loop detected Dropping packet (%s->%s)\n", + printk(KERN_WARNING "Redir loop detected Dropping packet (%s->%s)\n", skb->input_dev->name, skb->dev->name); return TC_ACT_SHOT; } @@ -1987,6 +2004,19 @@ static void net_rx_action(struct softirq_action *h) } } out: +#ifdef CONFIG_NET_DMA + /* + * There may not be any more sk_buffs coming right now, so push + * any pending DMA copies to hardware + */ + if (net_dma_client) { + struct dma_chan *chan; + rcu_read_lock(); + list_for_each_entry_rcu(chan, &net_dma_client->channels, client_node) + dma_async_memcpy_issue_pending(chan); + rcu_read_unlock(); + } +#endif local_irq_enable(); return; @@ -2978,7 +3008,7 @@ int register_netdevice(struct net_device *dev) /* Fix illegal SG+CSUM combinations. */ if ((dev->features & NETIF_F_SG) && !(dev->features & NETIF_F_ALL_CSUM)) { - printk("%s: Dropping NETIF_F_SG since no checksum feature.\n", + printk(KERN_NOTICE "%s: Dropping NETIF_F_SG since no checksum feature.\n", dev->name); dev->features &= ~NETIF_F_SG; } @@ -2986,7 +3016,7 @@ int register_netdevice(struct net_device *dev) /* TSO requires that SG is present as well. */ if ((dev->features & NETIF_F_TSO) && !(dev->features & NETIF_F_SG)) { - printk("%s: Dropping NETIF_F_TSO since no SG feature.\n", + printk(KERN_NOTICE "%s: Dropping NETIF_F_TSO since no SG feature.\n", dev->name); dev->features &= ~NETIF_F_TSO; } @@ -3168,7 +3198,7 @@ static void netdev_wait_allrefs(struct net_device *dev) static DEFINE_MUTEX(net_todo_run_mutex); void netdev_run_todo(void) { - struct list_head list = LIST_HEAD_INIT(list); + struct list_head list; /* Need to guard against multiple cpu's getting out of order. */ mutex_lock(&net_todo_run_mutex); @@ -3183,9 +3213,9 @@ void netdev_run_todo(void) /* Snapshot list, allow later requests */ spin_lock(&net_todo_list_lock); - list_splice_init(&net_todo_list, &list); + list_replace_init(&net_todo_list, &list); spin_unlock(&net_todo_list_lock); - + while (!list_empty(&list)) { struct net_device *dev = list_entry(list.next, struct net_device, todo_list); @@ -3446,6 +3476,83 @@ static int dev_cpu_callback(struct notifier_block *nfb, } #endif /* CONFIG_HOTPLUG_CPU */ +#ifdef CONFIG_NET_DMA +/** + * net_dma_rebalance - + * This is called when the number of channels allocated to the net_dma_client + * changes. The net_dma_client tries to have one DMA channel per CPU. + */ +static void net_dma_rebalance(void) +{ + unsigned int cpu, i, n; + struct dma_chan *chan; + + if (net_dma_count == 0) { + for_each_online_cpu(cpu) + rcu_assign_pointer(per_cpu(softnet_data, cpu).net_dma, NULL); + return; + } + + i = 0; + cpu = first_cpu(cpu_online_map); + + rcu_read_lock(); + list_for_each_entry(chan, &net_dma_client->channels, client_node) { + n = ((num_online_cpus() / net_dma_count) + + (i < (num_online_cpus() % net_dma_count) ? 1 : 0)); + + while(n) { + per_cpu(softnet_data, cpu).net_dma = chan; + cpu = next_cpu(cpu, cpu_online_map); + n--; + } + i++; + } + rcu_read_unlock(); +} + +/** + * netdev_dma_event - event callback for the net_dma_client + * @client: should always be net_dma_client + * @chan: DMA channel for the event + * @event: event type + */ +static void netdev_dma_event(struct dma_client *client, struct dma_chan *chan, + enum dma_event event) +{ + spin_lock(&net_dma_event_lock); + switch (event) { + case DMA_RESOURCE_ADDED: + net_dma_count++; + net_dma_rebalance(); + break; + case DMA_RESOURCE_REMOVED: + net_dma_count--; + net_dma_rebalance(); + break; + default: + break; + } + spin_unlock(&net_dma_event_lock); +} + +/** + * netdev_dma_regiser - register the networking subsystem as a DMA client + */ +static int __init netdev_dma_register(void) +{ + spin_lock_init(&net_dma_event_lock); + net_dma_client = dma_async_client_register(netdev_dma_event); + if (net_dma_client == NULL) + return -ENOMEM; + + dma_async_client_chan_request(net_dma_client, num_online_cpus()); + return 0; +} + +#else +static int __init netdev_dma_register(void) { return -ENODEV; } +#endif /* CONFIG_NET_DMA */ /* * Initialize the DEV module. At boot time this walks the device list and @@ -3499,6 +3606,8 @@ static int __init net_dev_init(void) atomic_set(&queue->backlog_dev.refcnt, 1); } + netdev_dma_register(); + dev_boot_phase = 0; open_softirq(NET_TX_SOFTIRQ, net_tx_action, NULL); diff --git a/net/core/dev_mcast.c b/net/core/dev_mcast.c index c57d887da..eb674ea7d 100644 --- a/net/core/dev_mcast.c +++ b/net/core/dev_mcast.c @@ -21,7 +21,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include diff --git a/net/core/ethtool.c b/net/core/ethtool.c index 987cccaa0..2797e2815 100644 --- a/net/core/ethtool.c +++ b/net/core/ethtool.c @@ -559,7 +559,7 @@ static int ethtool_set_sg(struct net_device *dev, char __user *useraddr) static int ethtool_get_tso(struct net_device *dev, char __user *useraddr) { - struct ethtool_value edata = { ETHTOOL_GUFO }; + struct ethtool_value edata = { ETHTOOL_GTSO }; if (!dev->ethtool_ops->get_tso) return -EOPNOTSUPP; diff --git a/net/core/link_watch.c b/net/core/link_watch.c index 646937cc2..4b3611474 100644 --- a/net/core/link_watch.c +++ b/net/core/link_watch.c @@ -11,7 +11,6 @@ * */ -#include #include #include #include @@ -91,11 +90,10 @@ static void rfc2863_policy(struct net_device *dev) /* Must be called with the rtnl semaphore held */ void linkwatch_run_queue(void) { - LIST_HEAD(head); - struct list_head *n, *next; + struct list_head head, *n, *next; spin_lock_irq(&lweventlist_lock); - list_splice_init(&lweventlist, &head); + list_replace_init(&lweventlist, &head); spin_unlock_irq(&lweventlist_lock); list_for_each_safe(n, next, &head) { diff --git a/net/core/neighbour.c b/net/core/neighbour.c index 50a8c73ca..fe2113f54 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c @@ -15,7 +15,6 @@ * Harald Welte Add neighbour cache statistics like rtstat */ -#include #include #include #include @@ -30,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -755,6 +755,7 @@ static void neigh_timer_handler(unsigned long arg) neigh->nud_state = NUD_STALE; neigh->updated = jiffies; neigh_suspect(neigh); + notify = 1; } } else if (state & NUD_DELAY) { if (time_before_eq(now, @@ -763,6 +764,7 @@ static void neigh_timer_handler(unsigned long arg) neigh->nud_state = NUD_REACHABLE; neigh->updated = jiffies; neigh_connect(neigh); + notify = 1; next = neigh->confirmed + neigh->parms->reachable_time; } else { NEIGH_PRINTK2("neigh %p is probed.\n", neigh); @@ -820,6 +822,8 @@ static void neigh_timer_handler(unsigned long arg) out: write_unlock(&neigh->lock); } + if (notify) + call_netevent_notifiers(NETEVENT_NEIGH_UPDATE, neigh); #ifdef CONFIG_ARPD if (notify && neigh->parms->app_probes) @@ -927,9 +931,7 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new, { u8 old; int err; -#ifdef CONFIG_ARPD int notify = 0; -#endif struct net_device *dev; int update_isrouter = 0; @@ -949,9 +951,7 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new, neigh_suspect(neigh); neigh->nud_state = new; err = 0; -#ifdef CONFIG_ARPD notify = old & NUD_VALID; -#endif goto out; } @@ -1023,9 +1023,7 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new, if (!(new & NUD_CONNECTED)) neigh->confirmed = jiffies - (neigh->parms->base_reachable_time << 1); -#ifdef CONFIG_ARPD notify = 1; -#endif } if (new == old) goto out; @@ -1057,6 +1055,9 @@ out: (neigh->flags & ~NTF_ROUTER); } write_unlock_bh(&neigh->lock); + + if (notify) + call_netevent_notifiers(NETEVENT_NEIGH_UPDATE, neigh); #ifdef CONFIG_ARPD if (notify && neigh->parms->app_probes) neigh_app_notify(neigh); @@ -1431,6 +1432,9 @@ int neigh_table_clear(struct neigh_table *tbl) kfree(tbl->phash_buckets); tbl->phash_buckets = NULL; + free_percpu(tbl->stats); + tbl->stats = NULL; + return 0; } diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c index 47a6fceb6..13472762b 100644 --- a/net/core/net-sysfs.c +++ b/net/core/net-sysfs.c @@ -10,7 +10,6 @@ */ #include -#include #include #include #include diff --git a/net/core/netpoll.c b/net/core/netpoll.c index 9cb781830..1799a7473 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c @@ -54,6 +54,7 @@ static atomic_t trapped; sizeof(struct iphdr) + sizeof(struct ethhdr)) static void zap_completion_queue(void); +static void arp_reply(struct sk_buff *skb); static void queue_process(void *p) { @@ -153,6 +154,22 @@ static void poll_napi(struct netpoll *np) } } +static void service_arp_queue(struct netpoll_info *npi) +{ + struct sk_buff *skb; + + if (unlikely(!npi)) + return; + + skb = skb_dequeue(&npi->arp_tx); + + while (skb != NULL) { + arp_reply(skb); + skb = skb_dequeue(&npi->arp_tx); + } + return; +} + void netpoll_poll(struct netpoll *np) { if(!np->dev || !netif_running(np->dev) || !np->dev->poll_controller) @@ -163,6 +180,8 @@ void netpoll_poll(struct netpoll *np) if (np->dev->poll) poll_napi(np); + service_arp_queue(np->dev->npinfo); + zap_completion_queue(); } @@ -254,10 +273,8 @@ static void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb) int status; struct netpoll_info *npinfo; - if (!np || !np->dev || !netif_running(np->dev)) { - __kfree_skb(skb); - return; - } + if (!np || !np->dev || !netif_running(np->dev)) + goto free_skb; npinfo = np->dev->npinfo; @@ -279,14 +296,10 @@ static void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb) * network drivers do not expect to be called if the queue is * stopped. */ - if (netif_queue_stopped(np->dev)) { - netif_tx_unlock(np->dev); - netpoll_poll(np); - udelay(50); - continue; - } + status = NETDEV_TX_BUSY; + if (!netif_queue_stopped(np->dev)) + status = np->dev->hard_start_xmit(skb, np->dev); - status = np->dev->hard_start_xmit(skb, np->dev); netif_tx_unlock(np->dev); /* success */ @@ -299,6 +312,8 @@ static void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb) netpoll_poll(np); udelay(50); } while (npinfo->tries > 0); +free_skb: + __kfree_skb(skb); } void netpoll_send_udp(struct netpoll *np, const char *msg, int len) @@ -320,13 +335,13 @@ void netpoll_send_udp(struct netpoll *np, const char *msg, int len) memcpy(skb->data, msg, len); skb->len += len; - udph = (struct udphdr *) skb_push(skb, sizeof(*udph)); + skb->h.uh = udph = (struct udphdr *) skb_push(skb, sizeof(*udph)); udph->source = htons(np->local_port); udph->dest = htons(np->remote_port); udph->len = htons(udp_len); udph->check = 0; - iph = (struct iphdr *)skb_push(skb, sizeof(*iph)); + skb->nh.iph = iph = (struct iphdr *)skb_push(skb, sizeof(*iph)); /* iph->version = 4; iph->ihl = 5; */ put_unaligned(0x45, (unsigned char *)iph); @@ -342,8 +357,8 @@ void netpoll_send_udp(struct netpoll *np, const char *msg, int len) iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl); eth = (struct ethhdr *) skb_push(skb, ETH_HLEN); - - eth->h_proto = htons(ETH_P_IP); + skb->mac.raw = skb->data; + skb->protocol = eth->h_proto = htons(ETH_P_IP); memcpy(eth->h_source, np->local_mac, 6); memcpy(eth->h_dest, np->remote_mac, 6); @@ -446,7 +461,9 @@ int __netpoll_rx(struct sk_buff *skb) int proto, len, ulen; struct iphdr *iph; struct udphdr *uh; - struct netpoll *np = skb->dev->npinfo->rx_np; + struct netpoll_info *npi = skb->dev->npinfo; + struct netpoll *np = npi->rx_np; + if (!np) goto out; @@ -456,7 +473,7 @@ int __netpoll_rx(struct sk_buff *skb) /* check if netpoll clients need ARP */ if (skb->protocol == __constant_htons(ETH_P_ARP) && atomic_read(&trapped)) { - arp_reply(skb); + skb_queue_tail(&npi->arp_tx, skb); return 1; } @@ -651,6 +668,7 @@ int netpoll_setup(struct netpoll *np) npinfo->poll_owner = -1; npinfo->tries = MAX_RETRIES; spin_lock_init(&npinfo->rx_lock); + skb_queue_head_init(&npinfo->arp_tx); } else npinfo = ndev->npinfo; diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 4e7437a56..6a7320b39 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -2900,7 +2900,7 @@ static __inline__ void pktgen_xmit(struct pktgen_dev *pkt_dev) pkt_dev->clone_count = 0; /* reset counter */ } } - + netif_tx_lock_bh(odev); if (!netif_queue_stopped(odev)) { @@ -2947,7 +2947,7 @@ static __inline__ void pktgen_xmit(struct pktgen_dev *pkt_dev) } netif_tx_unlock_bh(odev); - + /* If pkt_dev->count is zero, then run forever */ if ((pkt_dev->count != 0) && (pkt_dev->sofar >= pkt_dev->count)) { if (atomic_read(&(pkt_dev->skb->users)) != 1) { diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 375dd9061..84ca035d8 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -16,7 +16,6 @@ * Vitaly E. Lavrov RTA_OK arithmetics was wrong. */ -#include #include #include #include @@ -682,7 +681,7 @@ rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, int *errp) sz_idx = type>>2; kind = type&3; - if (kind != 2 && security_netlink_recv(skb)) { + if (kind != 2 && security_netlink_recv(skb, CAP_NET_ADMIN)) { *errp = -EPERM; return -1; } diff --git a/net/core/skbuff.c b/net/core/skbuff.c index e5b26c279..f2a958a5c 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -38,7 +38,6 @@ * The functions in this file will not compile correctly with gcc 2.4.x */ -#include #include #include #include @@ -217,7 +216,6 @@ struct sk_buff *alloc_skb_from_cache(kmem_cache_t *cp, int fclone) { kmem_cache_t *cache; - struct skb_shared_info *shinfo; struct sk_buff *skb; u8 *data; @@ -241,15 +239,13 @@ struct sk_buff *alloc_skb_from_cache(kmem_cache_t *cp, 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->gso_size = 0; - shinfo->gso_segs = 0; - shinfo->gso_type = 0; - shinfo->ip6_frag_id = 0; - shinfo->frag_list = NULL; + + atomic_set(&(skb_shinfo(skb)->dataref), 1); + skb_shinfo(skb)->nr_frags = 0; + skb_shinfo(skb)->gso_size = 0; + skb_shinfo(skb)->gso_segs = 0; + skb_shinfo(skb)->gso_type = 0; + skb_shinfo(skb)->frag_list = NULL; if (fclone) { struct sk_buff *child = skb + 1; @@ -268,6 +264,31 @@ nodata: goto out; } +/** + * __netdev_alloc_skb - allocate an skbuff for rx on a specific device + * @dev: network device to receive on + * @length: length to allocate + * @gfp_mask: get_free_pages mask, passed to alloc_skb + * + * Allocate a new &sk_buff and assign it a usage count of one. The + * buffer has unspecified headroom built in. Users should allocate + * the headroom they think they need without accounting for the + * built in space. The built in space is used for optimisations. + * + * %NULL is returned if there is no free memory. + */ +struct sk_buff *__netdev_alloc_skb(struct net_device *dev, + unsigned int length, gfp_t gfp_mask) +{ + struct sk_buff *skb; + + skb = alloc_skb(length + NET_SKB_PAD, gfp_mask); + if (likely(skb)) { + skb_reserve(skb, NET_SKB_PAD); + skb->dev = dev; + } + return skb; +} static void skb_drop_list(struct sk_buff **listp) { @@ -295,7 +316,7 @@ static void skb_clone_fraglist(struct sk_buff *skb) skb_get(list); } -void skb_release_data(struct sk_buff *skb) +static void skb_release_data(struct sk_buff *skb) { if (!skb->cloned || !atomic_sub_return(skb->nohdr ? (1 << SKB_DATAREF_SHIFT) + 1 : 1, @@ -492,7 +513,7 @@ struct sk_buff *skb_clone(struct sk_buff *skb, gfp_t gfp_mask) n->tc_verd = CLR_TC_MUNGED(n->tc_verd); C(input_dev); #endif - + skb_copy_secmark(n, skb); #endif #if defined(CONFIG_VNET) || defined(CONFIG_VNET_MODULE) C(xid); @@ -560,6 +581,7 @@ static void copy_skb_header(struct sk_buff *new, const struct sk_buff *old) #if defined(CONFIG_VNET) || defined(CONFIG_VNET_MODULE) new->xid = old->xid; #endif + skb_copy_secmark(new, old); atomic_set(&new->users, 1); skb_shinfo(new)->gso_size = skb_shinfo(old)->gso_size; skb_shinfo(new)->gso_segs = skb_shinfo(old)->gso_segs; @@ -815,24 +837,40 @@ struct sk_buff *skb_copy_expand(const struct sk_buff *skb, * filled. Used by network drivers which may DMA or transfer data * beyond the buffer end onto the wire. * - * May return NULL in out of memory cases. + * May return error in out of memory cases. The skb is freed on error. */ -struct sk_buff *skb_pad(struct sk_buff *skb, int pad) +int skb_pad(struct sk_buff *skb, int pad) { - struct sk_buff *nskb; + int err; + int ntail; /* If the skbuff is non linear tailroom is always zero.. */ - if (skb_tailroom(skb) >= pad) { + if (!skb_cloned(skb) && skb_tailroom(skb) >= pad) { memset(skb->data+skb->len, 0, pad); - return skb; + return 0; } - - nskb = skb_copy_expand(skb, skb_headroom(skb), skb_tailroom(skb) + pad, GFP_ATOMIC); + + ntail = skb->data_len + pad - (skb->end - skb->tail); + if (likely(skb_cloned(skb) || ntail > 0)) { + err = pskb_expand_head(skb, 0, ntail, GFP_ATOMIC); + if (unlikely(err)) + goto free_skb; + } + + /* FIXME: The use of this function with non-linear skb's really needs + * to be audited. + */ + err = skb_linearize(skb); + if (unlikely(err)) + goto free_skb; + + memset(skb->data + skb->len, 0, pad); + return 0; + +free_skb: kfree_skb(skb); - if (nskb) - memset(nskb->data+nskb->len, 0, pad); - return nskb; + return err; } /* Trims skb to length len. It can change skb pointers. @@ -1795,12 +1833,15 @@ unsigned int skb_find_text(struct sk_buff *skb, unsigned int from, unsigned int to, struct ts_config *config, struct ts_state *state) { + unsigned int ret; + config->get_next_block = skb_ts_get_next_block; config->finish = skb_ts_finish; skb_prepare_seq_read(skb, from, to, TS_SKB_CB(state)); - return textsearch_find(config, state); + ret = textsearch_find(config, state); + return (ret <= to - from ? ret : UINT_MAX); } /** @@ -1929,7 +1970,7 @@ struct sk_buff *skb_segment(struct sk_buff *skb, int features) do { struct sk_buff *nskb; skb_frag_t *frag; - int hsize, nsize; + int hsize; int k; int size; @@ -1940,11 +1981,10 @@ struct sk_buff *skb_segment(struct sk_buff *skb, int features) hsize = skb_headlen(skb) - offset; if (hsize < 0) hsize = 0; - nsize = hsize + doffset; - if (nsize > len + doffset || !sg) - nsize = len + doffset; + if (hsize > len || !sg) + hsize = len; - nskb = alloc_skb(nsize + headroom, GFP_ATOMIC); + nskb = alloc_skb(hsize + doffset + headroom, GFP_ATOMIC); if (unlikely(!nskb)) goto err; @@ -2050,6 +2090,7 @@ EXPORT_SYMBOL(__kfree_skb); EXPORT_SYMBOL(kfree_skb); EXPORT_SYMBOL(__pskb_pull_tail); EXPORT_SYMBOL(__alloc_skb); +EXPORT_SYMBOL(__netdev_alloc_skb); EXPORT_SYMBOL(pskb_copy); EXPORT_SYMBOL(pskb_expand_head); EXPORT_SYMBOL(skb_checksum); diff --git a/net/core/sock.c b/net/core/sock.c index 5ccf75ee3..272b3e3fc 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -92,7 +92,6 @@ */ #include -#include #include #include #include @@ -133,6 +132,53 @@ #include #endif +/* + * Each address family might have different locking rules, so we have + * one slock key per address family: + */ +static struct lock_class_key af_family_keys[AF_MAX]; +static struct lock_class_key af_family_slock_keys[AF_MAX]; + +#ifdef CONFIG_DEBUG_LOCK_ALLOC +/* + * Make lock validator output more readable. (we pre-construct these + * strings build-time, so that runtime initialization of socket + * locks is fast): + */ +static const char *af_family_key_strings[AF_MAX+1] = { + "sk_lock-AF_UNSPEC", "sk_lock-AF_UNIX" , "sk_lock-AF_INET" , + "sk_lock-AF_AX25" , "sk_lock-AF_IPX" , "sk_lock-AF_APPLETALK", + "sk_lock-AF_NETROM", "sk_lock-AF_BRIDGE" , "sk_lock-AF_ATMPVC" , + "sk_lock-AF_X25" , "sk_lock-AF_INET6" , "sk_lock-AF_ROSE" , + "sk_lock-AF_DECnet", "sk_lock-AF_NETBEUI" , "sk_lock-AF_SECURITY" , + "sk_lock-AF_KEY" , "sk_lock-AF_NETLINK" , "sk_lock-AF_PACKET" , + "sk_lock-AF_ASH" , "sk_lock-AF_ECONET" , "sk_lock-AF_ATMSVC" , + "sk_lock-21" , "sk_lock-AF_SNA" , "sk_lock-AF_IRDA" , + "sk_lock-AF_PPPOX" , "sk_lock-AF_WANPIPE" , "sk_lock-AF_LLC" , + "sk_lock-27" , "sk_lock-28" , "sk_lock-29" , + "sk_lock-AF_TIPC" , "sk_lock-AF_BLUETOOTH", "sk_lock-AF_MAX" +}; +static const char *af_family_slock_key_strings[AF_MAX+1] = { + "slock-AF_UNSPEC", "slock-AF_UNIX" , "slock-AF_INET" , + "slock-AF_AX25" , "slock-AF_IPX" , "slock-AF_APPLETALK", + "slock-AF_NETROM", "slock-AF_BRIDGE" , "slock-AF_ATMPVC" , + "slock-AF_X25" , "slock-AF_INET6" , "slock-AF_ROSE" , + "slock-AF_DECnet", "slock-AF_NETBEUI" , "slock-AF_SECURITY" , + "slock-AF_KEY" , "slock-AF_NETLINK" , "slock-AF_PACKET" , + "slock-AF_ASH" , "slock-AF_ECONET" , "slock-AF_ATMSVC" , + "slock-21" , "slock-AF_SNA" , "slock-AF_IRDA" , + "slock-AF_PPPOX" , "slock-AF_WANPIPE" , "slock-AF_LLC" , + "slock-27" , "slock-28" , "slock-29" , + "slock-AF_TIPC" , "slock-AF_BLUETOOTH", "slock-AF_MAX" +}; +#endif + +/* + * sk_callback_lock locking rules are per-address-family, + * so split the lock classes by using a per-AF key: + */ +static struct lock_class_key af_callback_keys[AF_MAX]; + /* Take into consideration the size of the struct sk_buff overhead in the * determination of these values, since that is non-constant across * platforms. This makes socket queueing behavior and performance @@ -253,9 +299,16 @@ int sk_receive_skb(struct sock *sk, struct sk_buff *skb) skb->dev = NULL; bh_lock_sock(sk); - if (!sock_owned_by_user(sk)) + if (!sock_owned_by_user(sk)) { + /* + * trylock + unlock semantics: + */ + mutex_acquire(&sk->sk_lock.dep_map, 0, 1, _RET_IP_); + rc = sk->sk_backlog_rcv(sk, skb); - else + + mutex_release(&sk->sk_lock.dep_map, 1, _RET_IP_); + } else sk_add_backlog(sk, skb); bh_unlock_sock(sk); out: @@ -594,6 +647,13 @@ set_rcvbuf: ret = -ENONET; break; + case SO_PASSSEC: + if (valbool) + set_bit(SOCK_PASSSEC, &sock->flags); + else + clear_bit(SOCK_PASSSEC, &sock->flags); + break; + /* We implement the SO_SNDLOWAT etc to not be settable (1003.1g 5.3) */ default: @@ -752,6 +812,10 @@ int sock_getsockopt(struct socket *sock, int level, int optname, v.val = sk->sk_state == TCP_LISTEN; break; + case SO_PASSSEC: + v.val = test_bit(SOCK_PASSSEC, &sock->flags) ? 1 : 0; + break; + case SO_PEERSEC: return security_socket_getpeersec_stream(sock, optval, optlen, len); @@ -768,6 +832,20 @@ lenout: return 0; } +/* + * Initialize an sk_lock. + * + * (We also register the sk_lock with the lock validator.) + */ +static void inline sock_lock_init(struct sock *sk) +{ + sock_lock_init_class_and_name(sk, + af_family_slock_key_strings[sk->sk_family], + af_family_slock_keys + sk->sk_family, + af_family_key_strings[sk->sk_family], + af_family_keys + sk->sk_family); +} + /** * sk_alloc - All socket objects are allocated here * @family: protocol family @@ -870,9 +948,14 @@ struct sock *sk_clone(struct sock *sk, const gfp_t priority) atomic_set(&newsk->sk_omem_alloc, 0); skb_queue_head_init(&newsk->sk_receive_queue); skb_queue_head_init(&newsk->sk_write_queue); +#ifdef CONFIG_NET_DMA + skb_queue_head_init(&newsk->sk_async_wait_queue); +#endif rwlock_init(&newsk->sk_dst_lock); rwlock_init(&newsk->sk_callback_lock); + lockdep_set_class(&newsk->sk_callback_lock, + af_callback_keys + newsk->sk_family); newsk->sk_dst_cache = NULL; newsk->sk_wmem_queued = 0; @@ -1430,6 +1513,9 @@ void sock_init_data(struct socket *sock, struct sock *sk) skb_queue_head_init(&sk->sk_receive_queue); skb_queue_head_init(&sk->sk_write_queue); skb_queue_head_init(&sk->sk_error_queue); +#ifdef CONFIG_NET_DMA + skb_queue_head_init(&sk->sk_async_wait_queue); +#endif sk->sk_send_head = NULL; @@ -1453,6 +1539,8 @@ void sock_init_data(struct socket *sock, struct sock *sk) rwlock_init(&sk->sk_dst_lock); rwlock_init(&sk->sk_callback_lock); + lockdep_set_class(&sk->sk_callback_lock, + af_callback_keys + sk->sk_family); sk->sk_state_change = sock_def_wakeup; sk->sk_data_ready = sock_def_readable; @@ -1485,24 +1573,34 @@ void sock_init_data(struct socket *sock, struct sock *sk) void fastcall lock_sock(struct sock *sk) { might_sleep(); - spin_lock_bh(&(sk->sk_lock.slock)); + spin_lock_bh(&sk->sk_lock.slock); if (sk->sk_lock.owner) __lock_sock(sk); sk->sk_lock.owner = (void *)1; - spin_unlock_bh(&(sk->sk_lock.slock)); + spin_unlock(&sk->sk_lock.slock); + /* + * The sk_lock has mutex_lock() semantics here: + */ + mutex_acquire(&sk->sk_lock.dep_map, 0, 0, _RET_IP_); + local_bh_enable(); } EXPORT_SYMBOL(lock_sock); void fastcall release_sock(struct sock *sk) { - spin_lock_bh(&(sk->sk_lock.slock)); + /* + * The sk_lock has mutex_unlock() semantics: + */ + mutex_release(&sk->sk_lock.dep_map, 1, _RET_IP_); + + spin_lock_bh(&sk->sk_lock.slock); if (sk->sk_backlog.tail) __release_sock(sk); sk->sk_lock.owner = NULL; - if (waitqueue_active(&(sk->sk_lock.wq))) - wake_up(&(sk->sk_lock.wq)); - spin_unlock_bh(&(sk->sk_lock.slock)); + if (waitqueue_active(&sk->sk_lock.wq)) + wake_up(&sk->sk_lock.wq); + spin_unlock_bh(&sk->sk_lock.slock); } EXPORT_SYMBOL(release_sock); diff --git a/net/core/stream.c b/net/core/stream.c index ac9edfdf8..d1d7decf7 100644 --- a/net/core/stream.c +++ b/net/core/stream.c @@ -52,10 +52,12 @@ int sk_stream_wait_connect(struct sock *sk, long *timeo_p) { struct task_struct *tsk = current; DEFINE_WAIT(wait); + int done; - while (1) { - if (sk->sk_err) - return sock_error(sk); + do { + 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) @@ -65,13 +67,13 @@ int sk_stream_wait_connect(struct sock *sk, long *timeo_p) prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); sk->sk_write_pending++; - if (sk_wait_event(sk, timeo_p, - !((1 << sk->sk_state) & - ~(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)))) - break; + 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); sk->sk_write_pending--; - } + } while (!done); return 0; } @@ -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, ¤t_timeo, sk_stream_memory_free(sk) && + sk_wait_event(sk, ¤t_timeo, !sk->sk_err && + !(sk->sk_shutdown & SEND_SHUTDOWN) && + sk_stream_memory_free(sk) && vm_wait); sk->sk_write_pending--; @@ -172,6 +176,7 @@ void sk_stream_rfree(struct sk_buff *skb) { struct sock *sk = skb->sk; + skb_truesize_check(skb); atomic_sub(skb->truesize, &sk->sk_rmem_alloc); sk->sk_forward_alloc += skb->truesize; } @@ -191,15 +196,13 @@ EXPORT_SYMBOL(sk_stream_error); void __sk_stream_mem_reclaim(struct sock *sk) { - if (sk->sk_forward_alloc >= SK_STREAM_MEM_QUANTUM) { - atomic_sub(sk->sk_forward_alloc / SK_STREAM_MEM_QUANTUM, - sk->sk_prot->memory_allocated); - sk->sk_forward_alloc &= SK_STREAM_MEM_QUANTUM - 1; - if (*sk->sk_prot->memory_pressure && - (atomic_read(sk->sk_prot->memory_allocated) < - sk->sk_prot->sysctl_mem[0])) - *sk->sk_prot->memory_pressure = 0; - } + atomic_sub(sk->sk_forward_alloc / SK_STREAM_MEM_QUANTUM, + sk->sk_prot->memory_allocated); + sk->sk_forward_alloc &= SK_STREAM_MEM_QUANTUM - 1; + if (*sk->sk_prot->memory_pressure && + (atomic_read(sk->sk_prot->memory_allocated) < + sk->sk_prot->sysctl_mem[0])) + *sk->sk_prot->memory_pressure = 0; } EXPORT_SYMBOL(__sk_stream_mem_reclaim); diff --git a/net/core/sysctl_net_core.c b/net/core/sysctl_net_core.c index 710453656..02534131d 100644 --- a/net/core/sysctl_net_core.c +++ b/net/core/sysctl_net_core.c @@ -7,7 +7,6 @@ #include #include -#include #include #include #include diff --git a/net/core/utils.c b/net/core/utils.c index 4f96f3892..e31c90e05 100644 --- a/net/core/utils.c +++ b/net/core/utils.c @@ -130,12 +130,13 @@ void __init net_random_init(void) static int net_random_reseed(void) { int i; - unsigned long seed[NR_CPUS]; + unsigned long seed; - get_random_bytes(seed, sizeof(seed)); for_each_possible_cpu(i) { struct nrnd_state *state = &per_cpu(net_rand_state,i); - __net_srandom(state, seed[i]); + + get_random_bytes(&seed, sizeof(seed)); + __net_srandom(state, seed); } return 0; } diff --git a/net/core/wireless.c b/net/core/wireless.c index d2bc72d31..348b9da73 100644 --- a/net/core/wireless.c +++ b/net/core/wireless.c @@ -72,7 +72,6 @@ /***************************** INCLUDES *****************************/ -#include /* Not needed ??? */ #include #include /* off_t */ #include /* struct ifreq, dev_get_by_name() */ @@ -82,6 +81,7 @@ #include /* for __init */ #include /* ARPHRD_ETHER */ #include /* compare_ether_addr */ +#include #include /* Pretty obvious */ #include /* New driver API */ @@ -1842,6 +1842,18 @@ int wireless_rtnetlink_set(struct net_device * dev, */ #ifdef WE_EVENT_RTNETLINK +static struct sk_buff_head wireless_nlevent_queue; + +static void wireless_nlevent_process(unsigned long data) +{ + struct sk_buff *skb; + + while ((skb = skb_dequeue(&wireless_nlevent_queue))) + netlink_broadcast(rtnl, skb, 0, RTNLGRP_LINK, GFP_ATOMIC); +} + +static DECLARE_TASKLET(wireless_nlevent_tasklet, wireless_nlevent_process, 0); + /* ---------------------------------------------------------------- */ /* * Fill a rtnetlink message with our event data. @@ -1904,8 +1916,17 @@ static inline void rtmsg_iwinfo(struct net_device * dev, return; } NETLINK_CB(skb).dst_group = RTNLGRP_LINK; - netlink_broadcast(rtnl, skb, 0, RTNLGRP_LINK, GFP_ATOMIC); + skb_queue_tail(&wireless_nlevent_queue, skb); + tasklet_schedule(&wireless_nlevent_tasklet); +} + +static int __init wireless_nlevent_init(void) +{ + skb_queue_head_init(&wireless_nlevent_queue); + return 0; } + +subsys_initcall(wireless_nlevent_init); #endif /* WE_EVENT_RTNETLINK */ /* ---------------------------------------------------------------- */ diff --git a/net/dccp/Kconfig b/net/dccp/Kconfig index 7e096ba84..859e3359f 100644 --- a/net/dccp/Kconfig +++ b/net/dccp/Kconfig @@ -26,7 +26,7 @@ config INET_DCCP_DIAG config IP_DCCP_ACKVEC depends on IP_DCCP - def_bool N + bool source "net/dccp/ccids/Kconfig" diff --git a/net/dccp/ackvec.h b/net/dccp/ackvec.h index ec7a89bb7..0adf4b56c 100644 --- a/net/dccp/ackvec.h +++ b/net/dccp/ackvec.h @@ -11,7 +11,6 @@ * published by the Free Software Foundation. */ -#include #include #include #include diff --git a/net/dccp/ccids/ccid2.c b/net/dccp/ccids/ccid2.c index d4f9e2d33..e9615627d 100644 --- a/net/dccp/ccids/ccid2.c +++ b/net/dccp/ccids/ccid2.c @@ -30,7 +30,6 @@ * - jiffies wrapping */ -#include #include "../ccid.h" #include "../dccp.h" #include "ccid2.h" diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c index b4a51d035..090bc39e8 100644 --- a/net/dccp/ccids/ccid3.c +++ b/net/dccp/ccids/ccid3.c @@ -2,7 +2,7 @@ * net/dccp/ccids/ccid3.c * * Copyright (c) 2005 The University of Waikato, Hamilton, New Zealand. - * Copyright (c) 2005-6 Ian McDonald + * Copyright (c) 2005-6 Ian McDonald * * An implementation of the DCCP protocol * @@ -34,7 +34,6 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include "../ccid.h" #include "../dccp.h" #include "lib/packet_history.h" @@ -343,6 +342,8 @@ static int ccid3_hc_tx_send_packet(struct sock *sk, new_packet->dccphtx_ccval = DCCP_SKB_CB(skb)->dccpd_ccval = hctx->ccid3hctx_last_win_count; + timeval_add_usecs(&hctx->ccid3hctx_t_nom, + hctx->ccid3hctx_t_ipi); } out: return rc; @@ -414,7 +415,8 @@ static void ccid3_hc_tx_packet_sent(struct sock *sk, int more, int len) case TFRC_SSTATE_NO_FBACK: case TFRC_SSTATE_FBACK: if (len > 0) { - hctx->ccid3hctx_t_nom = now; + timeval_sub_usecs(&hctx->ccid3hctx_t_nom, + hctx->ccid3hctx_t_ipi); ccid3_calc_new_t_ipi(hctx); ccid3_calc_new_delta(hctx); timeval_add_usecs(&hctx->ccid3hctx_t_nom, @@ -758,8 +760,7 @@ static void ccid3_hc_rx_send_feedback(struct sock *sk) } hcrx->ccid3hcrx_tstamp_last_feedback = now; - hcrx->ccid3hcrx_last_counter = packet->dccphrx_ccval; - hcrx->ccid3hcrx_seqno_last_counter = packet->dccphrx_seqno; + hcrx->ccid3hcrx_ccval_last_counter = packet->dccphrx_ccval; hcrx->ccid3hcrx_bytes_recv = 0; /* Convert to multiples of 10us */ @@ -783,7 +784,7 @@ static int ccid3_hc_rx_insert_options(struct sock *sk, struct sk_buff *skb) if (!(sk->sk_state == DCCP_OPEN || sk->sk_state == DCCP_PARTOPEN)) return 0; - DCCP_SKB_CB(skb)->dccpd_ccval = hcrx->ccid3hcrx_last_counter; + DCCP_SKB_CB(skb)->dccpd_ccval = hcrx->ccid3hcrx_ccval_last_counter; if (dccp_packet_without_ack(skb)) return 0; @@ -855,6 +856,11 @@ static u32 ccid3_hc_rx_calc_first_li(struct sock *sk) interval = 1; } found: + if (!tail) { + LIMIT_NETDEBUG(KERN_WARNING "%s: tail is null\n", + __FUNCTION__); + return ~0; + } rtt = timeval_delta(&tstamp, &tail->dccphrx_tstamp) * 4 / interval; ccid3_pr_debug("%s, sk=%p, approximated RTT to %uus\n", dccp_role(sk), sk, rtt); @@ -865,9 +871,20 @@ found: delta = timeval_delta(&tstamp, &hcrx->ccid3hcrx_tstamp_last_feedback); x_recv = usecs_div(hcrx->ccid3hcrx_bytes_recv, delta); + if (x_recv == 0) + x_recv = hcrx->ccid3hcrx_x_recv; + tmp1 = (u64)x_recv * (u64)rtt; do_div(tmp1,10000000); tmp2 = (u32)tmp1; + + if (!tmp2) { + LIMIT_NETDEBUG(KERN_WARNING "tmp2 = 0 " + "%s: x_recv = %u, rtt =%u\n", + __FUNCTION__, x_recv, rtt); + return ~0; + } + fval = (hcrx->ccid3hcrx_s * 100000) / tmp2; /* do not alter order above or you will get overflow on 32 bit */ p = tfrc_calc_x_reverse_lookup(fval); @@ -883,31 +900,101 @@ found: static void ccid3_hc_rx_update_li(struct sock *sk, u64 seq_loss, u8 win_loss) { struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk); + struct dccp_li_hist_entry *next, *head; + u64 seq_temp; - if (seq_loss != DCCP_MAX_SEQNO + 1 && - list_empty(&hcrx->ccid3hcrx_li_hist)) { - struct dccp_li_hist_entry *li_tail; + if (list_empty(&hcrx->ccid3hcrx_li_hist)) { + if (!dccp_li_hist_interval_new(ccid3_li_hist, + &hcrx->ccid3hcrx_li_hist, seq_loss, win_loss)) + return; - li_tail = dccp_li_hist_interval_new(ccid3_li_hist, - &hcrx->ccid3hcrx_li_hist, - seq_loss, win_loss); - if (li_tail == NULL) + next = (struct dccp_li_hist_entry *) + hcrx->ccid3hcrx_li_hist.next; + next->dccplih_interval = ccid3_hc_rx_calc_first_li(sk); + } else { + struct dccp_li_hist_entry *entry; + struct list_head *tail; + + head = (struct dccp_li_hist_entry *) + hcrx->ccid3hcrx_li_hist.next; + /* FIXME win count check removed as was wrong */ + /* should make this check with receive history */ + /* and compare there as per section 10.2 of RFC4342 */ + + /* new loss event detected */ + /* calculate last interval length */ + seq_temp = dccp_delta_seqno(head->dccplih_seqno, seq_loss); + entry = dccp_li_hist_entry_new(ccid3_li_hist, SLAB_ATOMIC); + + if (entry == NULL) { + printk(KERN_CRIT "%s: out of memory\n",__FUNCTION__); + dump_stack(); return; - li_tail->dccplih_interval = ccid3_hc_rx_calc_first_li(sk); - } else - LIMIT_NETDEBUG(KERN_WARNING "%s: FIXME: find end of " - "interval\n", __FUNCTION__); + } + + list_add(&entry->dccplih_node, &hcrx->ccid3hcrx_li_hist); + + tail = hcrx->ccid3hcrx_li_hist.prev; + list_del(tail); + kmem_cache_free(ccid3_li_hist->dccplih_slab, tail); + + /* Create the newest interval */ + entry->dccplih_seqno = seq_loss; + entry->dccplih_interval = seq_temp; + entry->dccplih_win_count = win_loss; + } } -static void ccid3_hc_rx_detect_loss(struct sock *sk) +static int ccid3_hc_rx_detect_loss(struct sock *sk, + struct dccp_rx_hist_entry *packet) { struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk); - u8 win_loss; - const u64 seq_loss = dccp_rx_hist_detect_loss(&hcrx->ccid3hcrx_hist, - &hcrx->ccid3hcrx_li_hist, - &win_loss); + struct dccp_rx_hist_entry *rx_hist = dccp_rx_hist_head(&hcrx->ccid3hcrx_hist); + u64 seqno = packet->dccphrx_seqno; + u64 tmp_seqno; + int loss = 0; + u8 ccval; + + + tmp_seqno = hcrx->ccid3hcrx_seqno_nonloss; + + if (!rx_hist || + follows48(packet->dccphrx_seqno, hcrx->ccid3hcrx_seqno_nonloss)) { + hcrx->ccid3hcrx_seqno_nonloss = seqno; + hcrx->ccid3hcrx_ccval_nonloss = packet->dccphrx_ccval; + goto detect_out; + } + - ccid3_hc_rx_update_li(sk, seq_loss, win_loss); + while (dccp_delta_seqno(hcrx->ccid3hcrx_seqno_nonloss, seqno) + > TFRC_RECV_NUM_LATE_LOSS) { + loss = 1; + ccid3_hc_rx_update_li(sk, hcrx->ccid3hcrx_seqno_nonloss, + hcrx->ccid3hcrx_ccval_nonloss); + tmp_seqno = hcrx->ccid3hcrx_seqno_nonloss; + dccp_inc_seqno(&tmp_seqno); + hcrx->ccid3hcrx_seqno_nonloss = tmp_seqno; + dccp_inc_seqno(&tmp_seqno); + while (dccp_rx_hist_find_entry(&hcrx->ccid3hcrx_hist, + tmp_seqno, &ccval)) { + hcrx->ccid3hcrx_seqno_nonloss = tmp_seqno; + hcrx->ccid3hcrx_ccval_nonloss = ccval; + dccp_inc_seqno(&tmp_seqno); + } + } + + /* FIXME - this code could be simplified with above while */ + /* but works at moment */ + if (follows48(packet->dccphrx_seqno, hcrx->ccid3hcrx_seqno_nonloss)) { + hcrx->ccid3hcrx_seqno_nonloss = seqno; + hcrx->ccid3hcrx_ccval_nonloss = packet->dccphrx_ccval; + } + +detect_out: + dccp_rx_hist_add_packet(ccid3_rx_hist, &hcrx->ccid3hcrx_hist, + &hcrx->ccid3hcrx_li_hist, packet, + hcrx->ccid3hcrx_seqno_nonloss); + return loss; } static void ccid3_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb) @@ -917,8 +1004,8 @@ static void ccid3_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb) struct dccp_rx_hist_entry *packet; struct timeval now; u8 win_count; - u32 p_prev, r_sample, t_elapsed; - int ins; + u32 p_prev, rtt_prev, r_sample, t_elapsed; + int loss; BUG_ON(hcrx == NULL || !(hcrx->ccid3hcrx_state == TFRC_RSTATE_NO_DATA || @@ -933,7 +1020,7 @@ static void ccid3_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb) case DCCP_PKT_DATAACK: if (opt_recv->dccpor_timestamp_echo == 0) break; - p_prev = hcrx->ccid3hcrx_rtt; + rtt_prev = hcrx->ccid3hcrx_rtt; dccp_timestamp(sk, &now); timeval_sub_usecs(&now, opt_recv->dccpor_timestamp_echo * 10); r_sample = timeval_usecs(&now); @@ -952,8 +1039,8 @@ static void ccid3_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb) hcrx->ccid3hcrx_rtt = (hcrx->ccid3hcrx_rtt * 9) / 10 + r_sample / 10; - if (p_prev != hcrx->ccid3hcrx_rtt) - ccid3_pr_debug("%s, New RTT=%luus, elapsed time=%u\n", + if (rtt_prev != hcrx->ccid3hcrx_rtt) + ccid3_pr_debug("%s, New RTT=%uus, elapsed time=%u\n", dccp_role(sk), hcrx->ccid3hcrx_rtt, opt_recv->dccpor_elapsed_time); break; @@ -974,8 +1061,7 @@ static void ccid3_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb) win_count = packet->dccphrx_ccval; - ins = dccp_rx_hist_add_packet(ccid3_rx_hist, &hcrx->ccid3hcrx_hist, - &hcrx->ccid3hcrx_li_hist, packet); + loss = ccid3_hc_rx_detect_loss(sk, packet); if (DCCP_SKB_CB(skb)->dccpd_type == DCCP_PKT_ACK) return; @@ -992,7 +1078,7 @@ static void ccid3_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb) case TFRC_RSTATE_DATA: hcrx->ccid3hcrx_bytes_recv += skb->len - dccp_hdr(skb)->dccph_doff * 4; - if (ins != 0) + if (loss) break; dccp_timestamp(sk, &now); @@ -1013,7 +1099,6 @@ static void ccid3_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb) ccid3_pr_debug("%s, sk=%p(%s), data loss! Reacting...\n", dccp_role(sk), sk, dccp_state_name(sk->sk_state)); - ccid3_hc_rx_detect_loss(sk); p_prev = hcrx->ccid3hcrx_p; /* Calculate loss event rate */ @@ -1023,6 +1108,9 @@ static void ccid3_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb) /* Scaling up by 1000000 as fixed decimal */ if (i_mean != 0) hcrx->ccid3hcrx_p = 1000000 / i_mean; + } else { + printk(KERN_CRIT "%s: empty loss hist\n",__FUNCTION__); + dump_stack(); } if (hcrx->ccid3hcrx_p > p_prev) { @@ -1231,7 +1319,7 @@ static __exit void ccid3_module_exit(void) } module_exit(ccid3_module_exit); -MODULE_AUTHOR("Ian McDonald , " +MODULE_AUTHOR("Ian McDonald , " "Arnaldo Carvalho de Melo "); MODULE_DESCRIPTION("DCCP TFRC CCID3 CCID"); MODULE_LICENSE("GPL"); diff --git a/net/dccp/ccids/ccid3.h b/net/dccp/ccids/ccid3.h index f18b96d4e..0a2cb7536 100644 --- a/net/dccp/ccids/ccid3.h +++ b/net/dccp/ccids/ccid3.h @@ -1,13 +1,13 @@ /* * net/dccp/ccids/ccid3.h * - * Copyright (c) 2005 The University of Waikato, Hamilton, New Zealand. + * Copyright (c) 2005-6 The University of Waikato, Hamilton, New Zealand. * * An implementation of the DCCP protocol * * This code has been developed by the University of Waikato WAND * research group. For further information please see http://www.wand.net.nz/ - * or e-mail Ian McDonald - iam4@cs.waikato.ac.nz + * or e-mail Ian McDonald - ian.mcdonald@jandi.co.nz * * This code also uses code from Lulea University, rereleased as GPL by its * authors: @@ -36,7 +36,6 @@ #ifndef _DCCP_CCID3_H_ #define _DCCP_CCID3_H_ -#include #include #include #include @@ -121,9 +120,10 @@ struct ccid3_hc_rx_sock { #define ccid3hcrx_x_recv ccid3hcrx_tfrc.tfrcrx_x_recv #define ccid3hcrx_rtt ccid3hcrx_tfrc.tfrcrx_rtt #define ccid3hcrx_p ccid3hcrx_tfrc.tfrcrx_p - u64 ccid3hcrx_seqno_last_counter:48, + u64 ccid3hcrx_seqno_nonloss:48, + ccid3hcrx_ccval_nonloss:4, ccid3hcrx_state:8, - ccid3hcrx_last_counter:4; + ccid3hcrx_ccval_last_counter:4; u32 ccid3hcrx_bytes_recv; struct timeval ccid3hcrx_tstamp_last_feedback; struct timeval ccid3hcrx_tstamp_last_ack; diff --git a/net/dccp/ccids/lib/loss_interval.c b/net/dccp/ccids/lib/loss_interval.c index 4c01a5414..906c81ab9 100644 --- a/net/dccp/ccids/lib/loss_interval.c +++ b/net/dccp/ccids/lib/loss_interval.c @@ -2,7 +2,7 @@ * net/dccp/ccids/lib/loss_interval.c * * Copyright (c) 2005 The University of Waikato, Hamilton, New Zealand. - * Copyright (c) 2005 Ian McDonald + * Copyright (c) 2005-6 Ian McDonald * Copyright (c) 2005 Arnaldo Carvalho de Melo * * This program is free software; you can redistribute it and/or modify @@ -11,8 +11,8 @@ * (at your option) any later version. */ -#include #include +#include #include "loss_interval.h" @@ -91,13 +91,13 @@ u32 dccp_li_hist_calc_i_mean(struct list_head *list) u32 w_tot = 0; list_for_each_entry_safe(li_entry, li_next, list, dccplih_node) { - if (i < DCCP_LI_HIST_IVAL_F_LENGTH) { + if (li_entry->dccplih_interval != ~0) { i_tot0 += li_entry->dccplih_interval * dccp_li_hist_w[i]; w_tot += dccp_li_hist_w[i]; + if (i != 0) + i_tot1 += li_entry->dccplih_interval * dccp_li_hist_w[i - 1]; } - if (i != 0) - i_tot1 += li_entry->dccplih_interval * dccp_li_hist_w[i - 1]; if (++i > DCCP_LI_HIST_IVAL_F_LENGTH) break; @@ -108,37 +108,36 @@ u32 dccp_li_hist_calc_i_mean(struct list_head *list) i_tot = max(i_tot0, i_tot1); - /* FIXME: Why do we do this? -Ian McDonald */ - if (i_tot * 4 < w_tot) - i_tot = w_tot * 4; + if (!w_tot) { + LIMIT_NETDEBUG(KERN_WARNING "%s: w_tot = 0\n", __FUNCTION__); + return 1; + } - return i_tot * 4 / w_tot; + return i_tot / w_tot; } EXPORT_SYMBOL_GPL(dccp_li_hist_calc_i_mean); -struct dccp_li_hist_entry *dccp_li_hist_interval_new(struct dccp_li_hist *hist, - struct list_head *list, - const u64 seq_loss, - const u8 win_loss) +int dccp_li_hist_interval_new(struct dccp_li_hist *hist, + struct list_head *list, const u64 seq_loss, const u8 win_loss) { - struct dccp_li_hist_entry *tail = NULL, *entry; + struct dccp_li_hist_entry *entry; int i; - for (i = 0; i <= DCCP_LI_HIST_IVAL_F_LENGTH; ++i) { + for (i = 0; i < DCCP_LI_HIST_IVAL_F_LENGTH; i++) { entry = dccp_li_hist_entry_new(hist, SLAB_ATOMIC); if (entry == NULL) { dccp_li_hist_purge(hist, list); - return NULL; + dump_stack(); + return 0; } - if (tail == NULL) - tail = entry; + entry->dccplih_interval = ~0; list_add(&entry->dccplih_node, list); } entry->dccplih_seqno = seq_loss; entry->dccplih_win_count = win_loss; - return tail; + return 1; } EXPORT_SYMBOL_GPL(dccp_li_hist_interval_new); diff --git a/net/dccp/ccids/lib/loss_interval.h b/net/dccp/ccids/lib/loss_interval.h index 417d9d82d..0ae85f034 100644 --- a/net/dccp/ccids/lib/loss_interval.h +++ b/net/dccp/ccids/lib/loss_interval.h @@ -4,7 +4,7 @@ * net/dccp/ccids/lib/loss_interval.h * * Copyright (c) 2005 The University of Waikato, Hamilton, New Zealand. - * Copyright (c) 2005 Ian McDonald + * Copyright (c) 2005 Ian McDonald * Copyright (c) 2005 Arnaldo Carvalho de Melo * * This program is free software; you can redistribute it and/or modify it @@ -13,7 +13,6 @@ * any later version. */ -#include #include #include #include @@ -53,9 +52,6 @@ extern void dccp_li_hist_purge(struct dccp_li_hist *hist, extern u32 dccp_li_hist_calc_i_mean(struct list_head *list); -extern struct dccp_li_hist_entry * - dccp_li_hist_interval_new(struct dccp_li_hist *hist, - struct list_head *list, - const u64 seq_loss, - const u8 win_loss); +extern int dccp_li_hist_interval_new(struct dccp_li_hist *hist, + struct list_head *list, const u64 seq_loss, const u8 win_loss); #endif /* _DCCP_LI_HIST_ */ diff --git a/net/dccp/ccids/lib/packet_history.c b/net/dccp/ccids/lib/packet_history.c index d3f9d2053..b876c9c81 100644 --- a/net/dccp/ccids/lib/packet_history.c +++ b/net/dccp/ccids/lib/packet_history.c @@ -1,13 +1,13 @@ /* - * net/dccp/packet_history.h + * net/dccp/packet_history.c * - * Copyright (c) 2005 The University of Waikato, Hamilton, New Zealand. + * Copyright (c) 2005-6 The University of Waikato, Hamilton, New Zealand. * * An implementation of the DCCP protocol * * This code has been developed by the University of Waikato WAND * research group. For further information please see http://www.wand.net.nz/ - * or e-mail Ian McDonald - iam4@cs.waikato.ac.nz + * or e-mail Ian McDonald - ian.mcdonald@jandi.co.nz * * This code also uses code from Lulea University, rereleased as GPL by its * authors: @@ -34,7 +34,6 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include #include @@ -113,64 +112,27 @@ struct dccp_rx_hist_entry * EXPORT_SYMBOL_GPL(dccp_rx_hist_find_data_packet); -int dccp_rx_hist_add_packet(struct dccp_rx_hist *hist, +void dccp_rx_hist_add_packet(struct dccp_rx_hist *hist, struct list_head *rx_list, struct list_head *li_list, - struct dccp_rx_hist_entry *packet) + struct dccp_rx_hist_entry *packet, + u64 nonloss_seqno) { - struct dccp_rx_hist_entry *entry, *next, *iter; + struct dccp_rx_hist_entry *entry, *next; u8 num_later = 0; - iter = dccp_rx_hist_head(rx_list); - if (iter == NULL) - dccp_rx_hist_add_entry(rx_list, packet); - else { - const u64 seqno = packet->dccphrx_seqno; - - if (after48(seqno, iter->dccphrx_seqno)) - dccp_rx_hist_add_entry(rx_list, packet); - else { - if (dccp_rx_hist_entry_data_packet(iter)) - num_later = 1; - - list_for_each_entry_continue(iter, rx_list, - dccphrx_node) { - if (after48(seqno, iter->dccphrx_seqno)) { - dccp_rx_hist_add_entry(&iter->dccphrx_node, - packet); - goto trim_history; - } - - if (dccp_rx_hist_entry_data_packet(iter)) - num_later++; + list_add(&packet->dccphrx_node, rx_list); - if (num_later == TFRC_RECV_NUM_LATE_LOSS) { - dccp_rx_hist_entry_delete(hist, packet); - return 1; - } - } - - if (num_later < TFRC_RECV_NUM_LATE_LOSS) - dccp_rx_hist_add_entry(rx_list, packet); - /* - * FIXME: else what? should we destroy the packet - * like above? - */ - } - } - -trim_history: - /* - * Trim history (remove all packets after the NUM_LATE_LOSS + 1 - * data packets) - */ num_later = TFRC_RECV_NUM_LATE_LOSS + 1; if (!list_empty(li_list)) { list_for_each_entry_safe(entry, next, rx_list, dccphrx_node) { if (num_later == 0) { - list_del_init(&entry->dccphrx_node); - dccp_rx_hist_entry_delete(hist, entry); + if (after48(nonloss_seqno, + entry->dccphrx_seqno)) { + list_del_init(&entry->dccphrx_node); + dccp_rx_hist_entry_delete(hist, entry); + } } else if (dccp_rx_hist_entry_data_packet(entry)) --num_later; } @@ -218,94 +180,10 @@ trim_history: --num_later; } } - - return 0; } EXPORT_SYMBOL_GPL(dccp_rx_hist_add_packet); -u64 dccp_rx_hist_detect_loss(struct list_head *rx_list, - struct list_head *li_list, u8 *win_loss) -{ - struct dccp_rx_hist_entry *entry, *next, *packet; - struct dccp_rx_hist_entry *a_loss = NULL; - struct dccp_rx_hist_entry *b_loss = NULL; - u64 seq_loss = DCCP_MAX_SEQNO + 1; - u8 num_later = TFRC_RECV_NUM_LATE_LOSS; - - list_for_each_entry_safe(entry, next, rx_list, dccphrx_node) { - if (num_later == 0) { - b_loss = entry; - break; - } else if (dccp_rx_hist_entry_data_packet(entry)) - --num_later; - } - - if (b_loss == NULL) - goto out; - - num_later = 1; - list_for_each_entry_safe_continue(entry, next, rx_list, dccphrx_node) { - if (num_later == 0) { - a_loss = entry; - break; - } else if (dccp_rx_hist_entry_data_packet(entry)) - --num_later; - } - - if (a_loss == NULL) { - if (list_empty(li_list)) { - /* no loss event have occured yet */ - LIMIT_NETDEBUG("%s: TODO: find a lost data packet by " - "comparing to initial seqno\n", - __FUNCTION__); - goto out; - } else { - LIMIT_NETDEBUG("%s: Less than 4 data pkts in history!", - __FUNCTION__); - goto out; - } - } - - /* Locate a lost data packet */ - entry = packet = b_loss; - list_for_each_entry_safe_continue(entry, next, rx_list, dccphrx_node) { - u64 delta = dccp_delta_seqno(entry->dccphrx_seqno, - packet->dccphrx_seqno); - - if (delta != 0) { - if (dccp_rx_hist_entry_data_packet(packet)) - --delta; - /* - * FIXME: check this, probably this % usage is because - * in earlier drafts the ndp count was just 8 bits - * long, but now it cam be up to 24 bits long. - */ -#if 0 - if (delta % DCCP_NDP_LIMIT != - (packet->dccphrx_ndp - - entry->dccphrx_ndp) % DCCP_NDP_LIMIT) -#endif - if (delta != packet->dccphrx_ndp - entry->dccphrx_ndp) { - seq_loss = entry->dccphrx_seqno; - dccp_inc_seqno(&seq_loss); - } - } - packet = entry; - if (packet == a_loss) - break; - } -out: - if (seq_loss != DCCP_MAX_SEQNO + 1) - *win_loss = a_loss->dccphrx_ccval; - else - *win_loss = 0; /* Paranoia */ - - return seq_loss; -} - -EXPORT_SYMBOL_GPL(dccp_rx_hist_detect_loss); - struct dccp_tx_hist *dccp_tx_hist_new(const char *name) { struct dccp_tx_hist *hist = kmalloc(sizeof(*hist), GFP_ATOMIC); @@ -366,6 +244,25 @@ struct dccp_tx_hist_entry * EXPORT_SYMBOL_GPL(dccp_tx_hist_find_entry); +int dccp_rx_hist_find_entry(const struct list_head *list, const u64 seq, + u8 *ccval) +{ + struct dccp_rx_hist_entry *packet = NULL, *entry; + + list_for_each_entry(entry, list, dccphrx_node) + if (entry->dccphrx_seqno == seq) { + packet = entry; + break; + } + + if (packet) + *ccval = packet->dccphrx_ccval; + + return packet != NULL; +} + +EXPORT_SYMBOL_GPL(dccp_rx_hist_find_entry); + void dccp_tx_hist_purge_older(struct dccp_tx_hist *hist, struct list_head *list, struct dccp_tx_hist_entry *packet) @@ -392,7 +289,7 @@ void dccp_tx_hist_purge(struct dccp_tx_hist *hist, struct list_head *list) EXPORT_SYMBOL_GPL(dccp_tx_hist_purge); -MODULE_AUTHOR("Ian McDonald , " +MODULE_AUTHOR("Ian McDonald , " "Arnaldo Carvalho de Melo "); MODULE_DESCRIPTION("DCCP TFRC library"); MODULE_LICENSE("GPL"); diff --git a/net/dccp/ccids/lib/packet_history.h b/net/dccp/ccids/lib/packet_history.h index 122e96737..067cf1c85 100644 --- a/net/dccp/ccids/lib/packet_history.h +++ b/net/dccp/ccids/lib/packet_history.h @@ -1,13 +1,13 @@ /* * net/dccp/packet_history.h * - * Copyright (c) 2005 The University of Waikato, Hamilton, New Zealand. + * Copyright (c) 2005-6 The University of Waikato, Hamilton, New Zealand. * * An implementation of the DCCP protocol * * This code has been developed by the University of Waikato WAND * research group. For further information please see http://www.wand.net.nz/ - * or e-mail Ian McDonald - iam4@cs.waikato.ac.nz + * or e-mail Ian McDonald - ian.mcdonald@jandi.co.nz * * This code also uses code from Lulea University, rereleased as GPL by its * authors: @@ -37,7 +37,6 @@ #ifndef _DCCP_PKT_HIST_ #define _DCCP_PKT_HIST_ -#include #include #include #include @@ -107,6 +106,8 @@ static inline void dccp_tx_hist_entry_delete(struct dccp_tx_hist *hist, extern struct dccp_tx_hist_entry * dccp_tx_hist_find_entry(const struct list_head *list, const u64 seq); +extern int dccp_rx_hist_find_entry(const struct list_head *list, const u64 seq, + u8 *ccval); static inline void dccp_tx_hist_add_entry(struct list_head *list, struct dccp_tx_hist_entry *entry) @@ -165,12 +166,6 @@ static inline void dccp_rx_hist_entry_delete(struct dccp_rx_hist *hist, extern void dccp_rx_hist_purge(struct dccp_rx_hist *hist, struct list_head *list); -static inline void dccp_rx_hist_add_entry(struct list_head *list, - struct dccp_rx_hist_entry *entry) -{ - list_add(&entry->dccphrx_node, list); -} - static inline struct dccp_rx_hist_entry * dccp_rx_hist_head(struct list_head *list) { @@ -189,10 +184,11 @@ static inline int entry->dccphrx_type == DCCP_PKT_DATAACK; } -extern int dccp_rx_hist_add_packet(struct dccp_rx_hist *hist, +extern void dccp_rx_hist_add_packet(struct dccp_rx_hist *hist, struct list_head *rx_list, struct list_head *li_list, - struct dccp_rx_hist_entry *packet); + struct dccp_rx_hist_entry *packet, + u64 nonloss_seqno); extern u64 dccp_rx_hist_detect_loss(struct list_head *rx_list, struct list_head *li_list, u8 *win_loss); diff --git a/net/dccp/ccids/lib/tfrc.h b/net/dccp/ccids/lib/tfrc.h index 130c4c40c..45f30f59e 100644 --- a/net/dccp/ccids/lib/tfrc.h +++ b/net/dccp/ccids/lib/tfrc.h @@ -4,7 +4,7 @@ * net/dccp/ccids/lib/tfrc.h * * Copyright (c) 2005 The University of Waikato, Hamilton, New Zealand. - * Copyright (c) 2005 Ian McDonald + * Copyright (c) 2005 Ian McDonald * Copyright (c) 2005 Arnaldo Carvalho de Melo * Copyright (c) 2003 Nils-Erik Mattsson, Joacim Haggmark, Magnus Erixzon * diff --git a/net/dccp/ccids/lib/tfrc_equation.c b/net/dccp/ccids/lib/tfrc_equation.c index add3cae65..44076e0c6 100644 --- a/net/dccp/ccids/lib/tfrc_equation.c +++ b/net/dccp/ccids/lib/tfrc_equation.c @@ -2,7 +2,7 @@ * net/dccp/ccids/lib/tfrc_equation.c * * Copyright (c) 2005 The University of Waikato, Hamilton, New Zealand. - * Copyright (c) 2005 Ian McDonald + * Copyright (c) 2005 Ian McDonald * Copyright (c) 2005 Arnaldo Carvalho de Melo * Copyright (c) 2003 Nils-Erik Mattsson, Joacim Haggmark, Magnus Erixzon * @@ -12,7 +12,6 @@ * (at your option) any later version. */ -#include #include #include diff --git a/net/dccp/dccp.h b/net/dccp/dccp.h index 1fe509148..a5c547572 100644 --- a/net/dccp/dccp.h +++ b/net/dccp/dccp.h @@ -5,14 +5,13 @@ * * An implementation of the DCCP protocol * Copyright (c) 2005 Arnaldo Carvalho de Melo - * Copyright (c) 2005 Ian McDonald + * Copyright (c) 2005-6 Ian McDonald * * 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 #include #include #include @@ -82,6 +81,14 @@ static inline u64 max48(const u64 seq1, const u64 seq2) return after48(seq1, seq2) ? seq1 : seq2; } +/* is seq1 next seqno after seq2 */ +static inline int follows48(const u64 seq1, const u64 seq2) +{ + int diff = (seq1 & 0xFFFF) - (seq2 & 0xFFFF); + + return diff==1; +} + enum { DCCP_MIB_NUM = 0, DCCP_MIB_ACTIVEOPENS, /* ActiveOpens */ diff --git a/net/dccp/diag.c b/net/dccp/diag.c index 0f25dc395..0f3745585 100644 --- a/net/dccp/diag.c +++ b/net/dccp/diag.c @@ -9,7 +9,6 @@ * published by the Free Software Foundation. */ -#include #include #include diff --git a/net/dccp/feat.c b/net/dccp/feat.c index b39e2a597..a1b0682ee 100644 --- a/net/dccp/feat.c +++ b/net/dccp/feat.c @@ -10,7 +10,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include "dccp.h" diff --git a/net/dccp/feat.h b/net/dccp/feat.h index 6048373c7..b44c45504 100644 --- a/net/dccp/feat.h +++ b/net/dccp/feat.h @@ -26,4 +26,6 @@ extern void dccp_feat_clean(struct dccp_minisock *dmsk); extern int dccp_feat_clone(struct sock *oldsk, struct sock *newsk); extern int dccp_feat_init(struct dccp_minisock *dmsk); +extern int dccp_feat_default_sequence_window; + #endif /* _DCCP_FEAT_H */ diff --git a/net/dccp/input.c b/net/dccp/input.c index bfc536655..7f9dc6ac5 100644 --- a/net/dccp/input.c +++ b/net/dccp/input.c @@ -10,7 +10,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c index f2c011fd2..7f56f7e8f 100644 --- a/net/dccp/ipv4.c +++ b/net/dccp/ipv4.c @@ -10,7 +10,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include @@ -505,8 +504,7 @@ int dccp_v4_conn_request(struct sock *sk, struct sk_buff *skb) ireq = inet_rsk(req); ireq->loc_addr = daddr; ireq->rmt_addr = saddr; - req->rcv_wnd = 100; /* Fake, option parsing will get the - right value */ + req->rcv_wnd = dccp_feat_default_sequence_window; ireq->opt = NULL; /* diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c index 65e2ab088..610c722ac 100644 --- a/net/dccp/ipv6.c +++ b/net/dccp/ipv6.c @@ -12,7 +12,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include @@ -32,6 +31,7 @@ #include "dccp.h" #include "ipv6.h" +#include "feat.h" /* Socket used for sending RSTs and ACKs */ static struct socket *dccp_v6_ctl_socket; @@ -230,7 +230,7 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr, ipv6_addr_copy(&np->saddr, saddr); inet->rcv_saddr = LOOPBACK4_IPV6; - ip6_dst_store(sk, dst, NULL); + __ip6_dst_store(sk, dst, NULL); icsk->icsk_ext_hdr_len = 0; if (np->opt != NULL) @@ -708,8 +708,7 @@ static int dccp_v6_conn_request(struct sock *sk, struct sk_buff *skb) 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 */ + req->rcv_wnd = dccp_feat_default_sequence_window; ireq6->pktopts = NULL; if (ipv6_opt_accepted(sk, skb) || @@ -864,7 +863,7 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk, * comment in that function for the gory details. -acme */ - ip6_dst_store(newsk, dst, NULL); + __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; diff --git a/net/dccp/ipv6.h b/net/dccp/ipv6.h index e4d4e9309..6eef81fdb 100644 --- a/net/dccp/ipv6.h +++ b/net/dccp/ipv6.h @@ -11,7 +11,6 @@ * published by the Free Software Foundation. */ -#include #include #include diff --git a/net/dccp/minisocks.c b/net/dccp/minisocks.c index c0349e5b0..9045438d6 100644 --- a/net/dccp/minisocks.c +++ b/net/dccp/minisocks.c @@ -10,7 +10,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include diff --git a/net/dccp/options.c b/net/dccp/options.c index e9feb2a0c..07a34696a 100644 --- a/net/dccp/options.c +++ b/net/dccp/options.c @@ -4,14 +4,13 @@ * An implementation of the DCCP protocol * Copyright (c) 2005 Aristeu Sergio Rozanski Filho * Copyright (c) 2005 Arnaldo Carvalho de Melo - * Copyright (c) 2005 Ian McDonald + * Copyright (c) 2005 Ian McDonald * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ -#include #include #include #include @@ -30,6 +29,8 @@ int dccp_feat_default_ack_ratio = DCCPF_INITIAL_ACK_RATIO; int dccp_feat_default_send_ack_vector = DCCPF_INITIAL_SEND_ACK_VECTOR; int dccp_feat_default_send_ndp_count = DCCPF_INITIAL_SEND_NDP_COUNT; +EXPORT_SYMBOL_GPL(dccp_feat_default_sequence_window); + void dccp_minisock_init(struct dccp_minisock *dmsk) { dmsk->dccpms_sequence_window = dccp_feat_default_sequence_window; diff --git a/net/dccp/output.c b/net/dccp/output.c index 7409e4a3a..58669beee 100644 --- a/net/dccp/output.c +++ b/net/dccp/output.c @@ -10,7 +10,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include diff --git a/net/dccp/proto.c b/net/dccp/proto.c index 2e0ee8355..6f14bb5a2 100644 --- a/net/dccp/proto.c +++ b/net/dccp/proto.c @@ -9,7 +9,6 @@ * published by the Free Software Foundation. */ -#include #include #include #include @@ -485,7 +484,7 @@ static int do_dccp_setsockopt(struct sock *sk, int level, int optname, err = -EINVAL; else err = dccp_setsockopt_change(sk, DCCPO_CHANGE_L, - (struct dccp_so_feat *) + (struct dccp_so_feat __user *) optval); break; @@ -494,7 +493,7 @@ static int do_dccp_setsockopt(struct sock *sk, int level, int optname, err = -EINVAL; else err = dccp_setsockopt_change(sk, DCCPO_CHANGE_R, - (struct dccp_so_feat *) + (struct dccp_so_feat __user *) optval); break; @@ -719,7 +718,7 @@ int dccp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, } dccp_pr_debug("packet_type=%s\n", dccp_packet_name(dh->dccph_type)); - sk_eat_skb(sk, skb); + sk_eat_skb(sk, skb, 0); verify_sock_status: if (sock_flag(sk, SOCK_DONE)) { len = 0; @@ -773,7 +772,7 @@ verify_sock_status: } found_fin_ok: if (!(flags & MSG_PEEK)) - sk_eat_skb(sk, skb); + sk_eat_skb(sk, skb, 0); break; } while (1); out: diff --git a/net/dccp/sysctl.c b/net/dccp/sysctl.c index 64c89e9c2..c1ba9451b 100644 --- a/net/dccp/sysctl.c +++ b/net/dccp/sysctl.c @@ -9,7 +9,6 @@ * as published by the Free Software Foundation. */ -#include #include #include diff --git a/net/dccp/timer.c b/net/dccp/timer.c index 5244415e5..8447742f5 100644 --- a/net/dccp/timer.c +++ b/net/dccp/timer.c @@ -10,7 +10,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include diff --git a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c index 2b289ef20..07d98695d 100644 --- a/net/decnet/af_decnet.c +++ b/net/decnet/af_decnet.c @@ -99,7 +99,6 @@ Version 0.0.6 2.1.110 07-aug-98 Eduardo Marcelo Serrat dn_bind fixes *******************************************************************************/ -#include #include #include #include @@ -1178,8 +1177,10 @@ static int dn_getname(struct socket *sock, struct sockaddr *uaddr,int *uaddr_len if (peer) { if ((sock->state != SS_CONNECTED && sock->state != SS_CONNECTING) && - scp->accept_mode == ACC_IMMED) + scp->accept_mode == ACC_IMMED) { + release_sock(sk); return -ENOTCONN; + } memcpy(sa, &scp->peer, sizeof(struct sockaddr_dn)); } else { diff --git a/net/decnet/dn_dev.c b/net/decnet/dn_dev.c index a26ff9f44..476455fbd 100644 --- a/net/decnet/dn_dev.c +++ b/net/decnet/dn_dev.c @@ -24,7 +24,6 @@ * devices. All mtu based now. */ -#include #include #include #include @@ -414,11 +413,7 @@ static struct dn_ifaddr *dn_dev_alloc_ifa(void) { struct dn_ifaddr *ifa; - ifa = kmalloc(sizeof(*ifa), GFP_KERNEL); - - if (ifa) { - memset(ifa, 0, sizeof(*ifa)); - } + ifa = kzalloc(sizeof(*ifa), GFP_KERNEL); return ifa; } @@ -1106,10 +1101,9 @@ struct dn_dev *dn_dev_create(struct net_device *dev, int *err) return NULL; *err = -ENOBUFS; - if ((dn_db = kmalloc(sizeof(struct dn_dev), GFP_ATOMIC)) == NULL) + if ((dn_db = kzalloc(sizeof(struct dn_dev), GFP_ATOMIC)) == NULL) return NULL; - memset(dn_db, 0, sizeof(struct dn_dev)); memcpy(&dn_db->parms, p, sizeof(struct dn_dev_parms)); smp_wmb(); dev->dn_ptr = dn_db; diff --git a/net/decnet/dn_fib.c b/net/decnet/dn_fib.c index bd4ce8681..fa20e2efc 100644 --- a/net/decnet/dn_fib.c +++ b/net/decnet/dn_fib.c @@ -17,7 +17,6 @@ * this code was copied from it. * */ -#include #include #include #include @@ -284,11 +283,10 @@ struct dn_fib_info *dn_fib_create_info(const struct rtmsg *r, struct dn_kern_rta goto err_inval; } - fi = kmalloc(sizeof(*fi)+nhs*sizeof(struct dn_fib_nh), GFP_KERNEL); + fi = kzalloc(sizeof(*fi)+nhs*sizeof(struct dn_fib_nh), GFP_KERNEL); err = -ENOBUFS; if (fi == NULL) goto failure; - memset(fi, 0, sizeof(*fi)+nhs*sizeof(struct dn_fib_nh)); fi->fib_protocol = r->rtm_protocol; fi->fib_nhs = nhs; diff --git a/net/decnet/dn_neigh.c b/net/decnet/dn_neigh.c index 66e230c3b..ff0ebe991 100644 --- a/net/decnet/dn_neigh.c +++ b/net/decnet/dn_neigh.c @@ -24,7 +24,6 @@ * */ -#include #include #include #include @@ -581,12 +580,11 @@ static int dn_neigh_seq_open(struct inode *inode, struct file *file) { struct seq_file *seq; int rc = -ENOMEM; - struct neigh_seq_state *s = kmalloc(sizeof(*s), GFP_KERNEL); + struct neigh_seq_state *s = kzalloc(sizeof(*s), GFP_KERNEL); if (!s) goto out; - memset(s, 0, sizeof(*s)); rc = seq_open(file, &dn_neigh_seq_ops); if (rc) goto out_kfree; diff --git a/net/decnet/dn_nsp_in.c b/net/decnet/dn_nsp_in.c index a2ba9db1c..86f7f3b28 100644 --- a/net/decnet/dn_nsp_in.c +++ b/net/decnet/dn_nsp_in.c @@ -45,7 +45,6 @@ GNU General Public License for more details. *******************************************************************************/ -#include #include #include #include diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c index 5abf7057a..743e9fcf7 100644 --- a/net/decnet/dn_route.c +++ b/net/decnet/dn_route.c @@ -55,7 +55,6 @@ GNU General Public License for more details. *******************************************************************************/ -#include #include #include #include @@ -926,8 +925,13 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old for(dev_out = dev_base; dev_out; dev_out = dev_out->next) { if (!dev_out->dn_ptr) continue; - if (dn_dev_islocal(dev_out, oldflp->fld_src)) - break; + if (!dn_dev_islocal(dev_out, oldflp->fld_src)) + continue; + if ((dev_out->flags & IFF_LOOPBACK) && + oldflp->fld_dst && + !dn_dev_islocal(dev_out, oldflp->fld_dst)) + continue; + break; } read_unlock(&dev_base_lock); if (dev_out == NULL) diff --git a/net/decnet/dn_rules.c b/net/decnet/dn_rules.c index 2440d0504..6986be754 100644 --- a/net/decnet/dn_rules.c +++ b/net/decnet/dn_rules.c @@ -13,7 +13,6 @@ * Changes: * */ -#include #include #include #include @@ -152,10 +151,9 @@ int dn_fib_rtm_newrule(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) } } - new_r = kmalloc(sizeof(*new_r), GFP_KERNEL); + new_r = kzalloc(sizeof(*new_r), GFP_KERNEL); if (!new_r) return -ENOMEM; - memset(new_r, 0, sizeof(*new_r)); if (rta[RTA_SRC-1]) memcpy(&new_r->r_src, RTA_DATA(rta[RTA_SRC-1]), 2); diff --git a/net/decnet/dn_table.c b/net/decnet/dn_table.c index 0ebc46af1..e926c952e 100644 --- a/net/decnet/dn_table.c +++ b/net/decnet/dn_table.c @@ -12,7 +12,6 @@ * Changes: * */ -#include #include #include #include @@ -159,12 +158,10 @@ static void dn_rehash_zone(struct dn_zone *dz) break; } - ht = kmalloc(new_divisor*sizeof(struct dn_fib_node*), GFP_KERNEL); - + ht = kcalloc(new_divisor, sizeof(struct dn_fib_node*), GFP_KERNEL); if (ht == NULL) return; - memset(ht, 0, new_divisor*sizeof(struct dn_fib_node *)); write_lock_bh(&dn_fib_tables_lock); old_ht = dz->dz_hash; dz->dz_hash = ht; @@ -185,11 +182,10 @@ static void dn_free_node(struct dn_fib_node *f) static struct dn_zone *dn_new_zone(struct dn_hash *table, int z) { int i; - struct dn_zone *dz = kmalloc(sizeof(struct dn_zone), GFP_KERNEL); + struct dn_zone *dz = kzalloc(sizeof(struct dn_zone), GFP_KERNEL); if (!dz) return NULL; - memset(dz, 0, sizeof(struct dn_zone)); if (z) { dz->dz_divisor = 16; dz->dz_hashmask = 0x0F; @@ -198,14 +194,12 @@ static struct dn_zone *dn_new_zone(struct dn_hash *table, int z) dz->dz_hashmask = 0; } - dz->dz_hash = kmalloc(dz->dz_divisor*sizeof(struct dn_fib_node *), GFP_KERNEL); - + dz->dz_hash = kcalloc(dz->dz_divisor, sizeof(struct dn_fib_node *), GFP_KERNEL); if (!dz->dz_hash) { kfree(dz); return NULL; } - memset(dz->dz_hash, 0, dz->dz_divisor*sizeof(struct dn_fib_node*)); dz->dz_order = z; dz->dz_mask = dnet_make_mask(z); diff --git a/net/decnet/netfilter/dn_rtmsg.c b/net/decnet/netfilter/dn_rtmsg.c index 74133ecd7..8b99bd335 100644 --- a/net/decnet/netfilter/dn_rtmsg.c +++ b/net/decnet/netfilter/dn_rtmsg.c @@ -107,7 +107,7 @@ static inline void dnrmg_receive_user_skb(struct sk_buff *skb) if (nlh->nlmsg_len < sizeof(*nlh) || skb->len < nlh->nlmsg_len) return; - if (!cap_raised(NETLINK_CB(skb).eff_cap, CAP_NET_ADMIN)) + if (security_netlink_recv(skb, CAP_NET_ADMIN)) RCV_SKB_FAIL(-EPERM); /* Eventually we might send routing messages too */ diff --git a/net/decnet/sysctl_net_decnet.c b/net/decnet/sysctl_net_decnet.c index bda592021..e246f054f 100644 --- a/net/decnet/sysctl_net_decnet.c +++ b/net/decnet/sysctl_net_decnet.c @@ -13,7 +13,6 @@ * Steve Whitehouse - Memory buffer settings, like the tcp ones * */ -#include #include #include #include diff --git a/net/econet/af_econet.c b/net/econet/af_econet.c index 868265619..4d66aac13 100644 --- a/net/econet/af_econet.c +++ b/net/econet/af_econet.c @@ -9,7 +9,6 @@ * */ -#include #include #include @@ -674,12 +673,11 @@ static int ec_dev_ioctl(struct socket *sock, unsigned int cmd, void __user *arg) edev = dev->ec_ptr; if (edev == NULL) { /* Magic up a new one. */ - edev = kmalloc(sizeof(struct ec_device), GFP_KERNEL); + edev = kzalloc(sizeof(struct ec_device), GFP_KERNEL); if (edev == NULL) { err = -ENOMEM; break; } - memset(edev, 0, sizeof(struct ec_device)); dev->ec_ptr = edev; } else net2dev_map[edev->net] = NULL; diff --git a/net/ethernet/eth.c b/net/ethernet/eth.c index c971f1471..387c71c58 100644 --- a/net/ethernet/eth.c +++ b/net/ethernet/eth.c @@ -51,7 +51,6 @@ #include #include #include -#include #include #include #include diff --git a/net/ieee80211/ieee80211_crypt.c b/net/ieee80211/ieee80211_crypt.c index cb71d794a..5ed0a98b2 100644 --- a/net/ieee80211/ieee80211_crypt.c +++ b/net/ieee80211/ieee80211_crypt.c @@ -110,11 +110,10 @@ int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops) unsigned long flags; struct ieee80211_crypto_alg *alg; - alg = kmalloc(sizeof(*alg), GFP_KERNEL); + alg = kzalloc(sizeof(*alg), GFP_KERNEL); if (alg == NULL) return -ENOMEM; - memset(alg, 0, sizeof(*alg)); alg->ops = ops; spin_lock_irqsave(&ieee80211_crypto_lock, flags); diff --git a/net/ieee80211/ieee80211_crypt_ccmp.c b/net/ieee80211/ieee80211_crypt_ccmp.c index 78b2d13e8..ed90a8af1 100644 --- a/net/ieee80211/ieee80211_crypt_ccmp.c +++ b/net/ieee80211/ieee80211_crypt_ccmp.c @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -77,10 +76,9 @@ static void *ieee80211_ccmp_init(int key_idx) { struct ieee80211_ccmp_data *priv; - priv = kmalloc(sizeof(*priv), GFP_ATOMIC); + priv = kzalloc(sizeof(*priv), GFP_ATOMIC); if (priv == NULL) goto fail; - memset(priv, 0, sizeof(*priv)); priv->key_idx = key_idx; priv->tfm = crypto_alloc_tfm("aes", 0); diff --git a/net/ieee80211/ieee80211_crypt_tkip.c b/net/ieee80211/ieee80211_crypt_tkip.c index 93def94c1..34dba0ba5 100644 --- a/net/ieee80211/ieee80211_crypt_tkip.c +++ b/net/ieee80211/ieee80211_crypt_tkip.c @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -501,8 +500,11 @@ static int michael_mic(struct ieee80211_tkip_data *tkey, u8 * key, u8 * hdr, static void michael_mic_hdr(struct sk_buff *skb, u8 * hdr) { struct ieee80211_hdr_4addr *hdr11; + u16 stype; hdr11 = (struct ieee80211_hdr_4addr *)skb->data; + stype = WLAN_FC_GET_STYPE(le16_to_cpu(hdr11->frame_ctl)); + switch (le16_to_cpu(hdr11->frame_ctl) & (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) { case IEEE80211_FCTL_TODS: @@ -523,7 +525,13 @@ static void michael_mic_hdr(struct sk_buff *skb, u8 * hdr) break; } - hdr[12] = 0; /* priority */ + if (stype & IEEE80211_STYPE_QOS_DATA) { + const struct ieee80211_hdr_3addrqos *qoshdr = + (struct ieee80211_hdr_3addrqos *)skb->data; + hdr[12] = le16_to_cpu(qoshdr->qos_ctl) & IEEE80211_QCTL_TID; + } else + hdr[12] = 0; /* priority */ + hdr[13] = hdr[14] = hdr[15] = 0; /* reserved */ } diff --git a/net/ieee80211/ieee80211_crypt_wep.c b/net/ieee80211/ieee80211_crypt_wep.c index 649e581fa..0ebf235f6 100644 --- a/net/ieee80211/ieee80211_crypt_wep.c +++ b/net/ieee80211/ieee80211_crypt_wep.c @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -40,10 +39,9 @@ static void *prism2_wep_init(int keyidx) { struct prism2_wep_data *priv; - priv = kmalloc(sizeof(*priv), GFP_ATOMIC); + priv = kzalloc(sizeof(*priv), GFP_ATOMIC); if (priv == NULL) goto fail; - memset(priv, 0, sizeof(*priv)); priv->key_idx = keyidx; priv->tfm = crypto_alloc_tfm("arc4", 0); diff --git a/net/ieee80211/ieee80211_geo.c b/net/ieee80211/ieee80211_geo.c index 192243ab3..305a09de8 100644 --- a/net/ieee80211/ieee80211_geo.c +++ b/net/ieee80211/ieee80211_geo.c @@ -24,7 +24,6 @@ ******************************************************************************/ #include -#include #include #include #include diff --git a/net/ieee80211/ieee80211_module.c b/net/ieee80211/ieee80211_module.c index 2cb84d84f..13b1e5fff 100644 --- a/net/ieee80211/ieee80211_module.c +++ b/net/ieee80211/ieee80211_module.c @@ -31,7 +31,6 @@ *******************************************************************************/ #include -#include #include #include #include diff --git a/net/ieee80211/ieee80211_rx.c b/net/ieee80211/ieee80211_rx.c index 604b7b009..72d4d4e04 100644 --- a/net/ieee80211/ieee80211_rx.c +++ b/net/ieee80211/ieee80211_rx.c @@ -14,7 +14,6 @@ */ #include -#include #include #include #include @@ -405,9 +404,9 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, #endif if (ieee->iw_mode == IW_MODE_MONITOR) { - ieee80211_monitor_rx(ieee, skb, rx_stats); stats->rx_packets++; stats->rx_bytes += skb->len; + ieee80211_monitor_rx(ieee, skb, rx_stats); return 1; } @@ -1692,8 +1691,8 @@ void ieee80211_rx_mgt(struct ieee80211_device *ieee, WLAN_FC_GET_STYPE(le16_to_cpu (header->frame_ctl))); - IEEE80211_WARNING("%s: IEEE80211_REASSOC_REQ received\n", - ieee->dev->name); + IEEE80211_DEBUG_MGMT("%s: IEEE80211_REASSOC_REQ received\n", + ieee->dev->name); if (ieee->handle_reassoc_request != NULL) ieee->handle_reassoc_request(ieee->dev, (struct ieee80211_reassoc_request *) @@ -1705,8 +1704,8 @@ void ieee80211_rx_mgt(struct ieee80211_device *ieee, WLAN_FC_GET_STYPE(le16_to_cpu (header->frame_ctl))); - IEEE80211_WARNING("%s: IEEE80211_ASSOC_REQ received\n", - ieee->dev->name); + IEEE80211_DEBUG_MGMT("%s: IEEE80211_ASSOC_REQ received\n", + ieee->dev->name); if (ieee->handle_assoc_request != NULL) ieee->handle_assoc_request(ieee->dev); break; @@ -1722,10 +1721,10 @@ void ieee80211_rx_mgt(struct ieee80211_device *ieee, IEEE80211_DEBUG_MGMT("received UNKNOWN (%d)\n", WLAN_FC_GET_STYPE(le16_to_cpu (header->frame_ctl))); - IEEE80211_WARNING("%s: Unknown management packet: %d\n", - ieee->dev->name, - WLAN_FC_GET_STYPE(le16_to_cpu - (header->frame_ctl))); + IEEE80211_DEBUG_MGMT("%s: Unknown management packet: %d\n", + ieee->dev->name, + WLAN_FC_GET_STYPE(le16_to_cpu + (header->frame_ctl))); break; } } diff --git a/net/ieee80211/ieee80211_tx.c b/net/ieee80211/ieee80211_tx.c index 8b4332f53..bf042139c 100644 --- a/net/ieee80211/ieee80211_tx.c +++ b/net/ieee80211/ieee80211_tx.c @@ -24,7 +24,6 @@ ******************************************************************************/ #include -#include #include #include #include @@ -220,13 +219,43 @@ static struct ieee80211_txb *ieee80211_alloc_txb(int nr_frags, int txb_size, return txb; } +static int ieee80211_classify(struct sk_buff *skb) +{ + struct ethhdr *eth; + struct iphdr *ip; + + eth = (struct ethhdr *)skb->data; + if (eth->h_proto != __constant_htons(ETH_P_IP)) + return 0; + + ip = skb->nh.iph; + switch (ip->tos & 0xfc) { + case 0x20: + return 2; + case 0x40: + return 1; + case 0x60: + return 3; + case 0x80: + return 4; + case 0xa0: + return 5; + case 0xc0: + return 6; + case 0xe0: + return 7; + default: + return 0; + } +} + /* Incoming skb is converted to a txb which consists of * a block of 802.11 fragment packets (stored as skbs) */ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); struct ieee80211_txb *txb = NULL; - struct ieee80211_hdr_3addr *frag_hdr; + struct ieee80211_hdr_3addrqos *frag_hdr; int i, bytes_per_frag, nr_frags, bytes_last_frag, frag_size, rts_required; unsigned long flags; @@ -234,9 +263,10 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) int ether_type, encrypt, host_encrypt, host_encrypt_msdu, host_build_iv; int bytes, fc, hdr_len; struct sk_buff *skb_frag; - struct ieee80211_hdr_3addr header = { /* Ensure zero initialized */ + struct ieee80211_hdr_3addrqos header = {/* Ensure zero initialized */ .duration_id = 0, - .seq_ctl = 0 + .seq_ctl = 0, + .qos_ctl = 0 }; u8 dest[ETH_ALEN], src[ETH_ALEN]; struct ieee80211_crypt_data *crypt; @@ -282,12 +312,6 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) memcpy(dest, skb->data, ETH_ALEN); memcpy(src, skb->data + ETH_ALEN, ETH_ALEN); - /* Advance the SKB to the start of the payload */ - skb_pull(skb, sizeof(struct ethhdr)); - - /* Determine total amount of storage required for TXB packets */ - bytes = skb->len + SNAP_SIZE + sizeof(u16); - if (host_encrypt || host_build_iv) fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA | IEEE80211_FCTL_PROTECTED; @@ -306,9 +330,23 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) memcpy(header.addr2, src, ETH_ALEN); memcpy(header.addr3, ieee->bssid, ETH_ALEN); } - header.frame_ctl = cpu_to_le16(fc); hdr_len = IEEE80211_3ADDR_LEN; + if (ieee->is_qos_active && ieee->is_qos_active(dev, skb)) { + fc |= IEEE80211_STYPE_QOS_DATA; + hdr_len += 2; + + skb->priority = ieee80211_classify(skb); + header.qos_ctl |= skb->priority & IEEE80211_QCTL_TID; + } + header.frame_ctl = cpu_to_le16(fc); + + /* Advance the SKB to the start of the payload */ + skb_pull(skb, sizeof(struct ethhdr)); + + /* Determine total amount of storage required for TXB packets */ + bytes = skb->len + SNAP_SIZE + sizeof(u16); + /* Encrypt msdu first on the whole data packet. */ if ((host_encrypt || host_encrypt_msdu) && crypt && crypt->ops && crypt->ops->encrypt_msdu) { @@ -402,7 +440,7 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) if (rts_required) { skb_frag = txb->fragments[0]; frag_hdr = - (struct ieee80211_hdr_3addr *)skb_put(skb_frag, hdr_len); + (struct ieee80211_hdr_3addrqos *)skb_put(skb_frag, hdr_len); /* * Set header frame_ctl to the RTS. @@ -433,7 +471,7 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) crypt->ops->extra_mpdu_prefix_len); frag_hdr = - (struct ieee80211_hdr_3addr *)skb_put(skb_frag, hdr_len); + (struct ieee80211_hdr_3addrqos *)skb_put(skb_frag, hdr_len); memcpy(frag_hdr, &header, hdr_len); /* If this is not the last fragment, then add the MOREFRAGS @@ -516,16 +554,23 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) /* Incoming 802.11 strucure is converted to a TXB * a block of 802.11 fragment packets (stored as skbs) */ int ieee80211_tx_frame(struct ieee80211_device *ieee, - struct ieee80211_hdr *frame, int len) + struct ieee80211_hdr *frame, int hdr_len, int total_len, + int encrypt_mpdu) { struct ieee80211_txb *txb = NULL; unsigned long flags; struct net_device_stats *stats = &ieee->stats; struct sk_buff *skb_frag; int priority = -1; + int fraglen = total_len; + int headroom = ieee->tx_headroom; + struct ieee80211_crypt_data *crypt = ieee->crypt[ieee->tx_keyidx]; spin_lock_irqsave(&ieee->lock, flags); + if (encrypt_mpdu && (!ieee->sec.encrypt || !crypt)) + encrypt_mpdu = 0; + /* If there is no driver handler to take the TXB, dont' bother * creating it... */ if (!ieee->hard_start_xmit) { @@ -533,32 +578,45 @@ int ieee80211_tx_frame(struct ieee80211_device *ieee, goto success; } - if (unlikely(len < 24)) { + if (unlikely(total_len < 24)) { printk(KERN_WARNING "%s: skb too small (%d).\n", - ieee->dev->name, len); + ieee->dev->name, total_len); goto success; } + if (encrypt_mpdu) { + frame->frame_ctl |= cpu_to_le16(IEEE80211_FCTL_PROTECTED); + fraglen += crypt->ops->extra_mpdu_prefix_len + + crypt->ops->extra_mpdu_postfix_len; + headroom += crypt->ops->extra_mpdu_prefix_len; + } + /* When we allocate the TXB we allocate enough space for the reserve * and full fragment bytes (bytes_per_frag doesn't include prefix, * postfix, header, FCS, etc.) */ - txb = ieee80211_alloc_txb(1, len, ieee->tx_headroom, GFP_ATOMIC); + txb = ieee80211_alloc_txb(1, fraglen, headroom, GFP_ATOMIC); if (unlikely(!txb)) { printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); goto failed; } txb->encrypted = 0; - txb->payload_size = len; + txb->payload_size = fraglen; skb_frag = txb->fragments[0]; - memcpy(skb_put(skb_frag, len), frame, len); + memcpy(skb_put(skb_frag, total_len), frame, total_len); if (ieee->config & (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS)) skb_put(skb_frag, 4); + /* To avoid overcomplicating things, we do the corner-case frame + * encryption in software. The only real situation where encryption is + * needed here is during software-based shared key authentication. */ + if (encrypt_mpdu) + ieee80211_encrypt_fragment(ieee, skb_frag, hdr_len); + success: spin_unlock_irqrestore(&ieee->lock, flags); diff --git a/net/ieee80211/ieee80211_wx.c b/net/ieee80211/ieee80211_wx.c index b885fd189..5cb9cfd35 100644 --- a/net/ieee80211/ieee80211_wx.c +++ b/net/ieee80211/ieee80211_wx.c @@ -50,7 +50,8 @@ static char *ieee80211_translate_scan(struct ieee80211_device *ieee, char *p; struct iw_event iwe; int i, j; - u8 max_rate, rate; + char *current_val; /* For rates */ + u8 rate; /* First entry *MUST* be the AP MAC address */ iwe.cmd = SIOCGIWAP; @@ -107,9 +108,13 @@ static char *ieee80211_translate_scan(struct ieee80211_device *ieee, start = iwe_stream_add_point(start, stop, &iwe, network->ssid); /* Add basic and extended rates */ - max_rate = 0; - p = custom; - p += snprintf(p, MAX_CUSTOM_LEN - (p - custom), " Rates (Mb/s): "); + /* Rate : stuffing multiple values in a single event require a bit + * more of magic - Jean II */ + current_val = start + IW_EV_LCP_LEN; + iwe.cmd = SIOCGIWRATE; + /* Those two flags are ignored... */ + iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0; + for (i = 0, j = 0; i < network->rates_len;) { if (j < network->rates_ex_len && ((network->rates_ex[j] & 0x7F) < @@ -117,28 +122,21 @@ static char *ieee80211_translate_scan(struct ieee80211_device *ieee, rate = network->rates_ex[j++] & 0x7F; else rate = network->rates[i++] & 0x7F; - if (rate > max_rate) - max_rate = rate; - p += snprintf(p, MAX_CUSTOM_LEN - (p - custom), - "%d%s ", rate >> 1, (rate & 1) ? ".5" : ""); + /* Bit rate given in 500 kb/s units (+ 0x80) */ + iwe.u.bitrate.value = ((rate & 0x7f) * 500000); + /* Add new value to event */ + current_val = iwe_stream_add_value(start, current_val, stop, &iwe, IW_EV_PARAM_LEN); } for (; j < network->rates_ex_len; j++) { rate = network->rates_ex[j] & 0x7F; - p += snprintf(p, MAX_CUSTOM_LEN - (p - custom), - "%d%s ", rate >> 1, (rate & 1) ? ".5" : ""); - if (rate > max_rate) - max_rate = rate; + /* Bit rate given in 500 kb/s units (+ 0x80) */ + iwe.u.bitrate.value = ((rate & 0x7f) * 500000); + /* Add new value to event */ + current_val = iwe_stream_add_value(start, current_val, stop, &iwe, IW_EV_PARAM_LEN); } - - iwe.cmd = SIOCGIWRATE; - iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0; - iwe.u.bitrate.value = max_rate * 500000; - start = iwe_stream_add_event(start, stop, &iwe, IW_EV_PARAM_LEN); - - iwe.cmd = IWEVCUSTOM; - iwe.u.data.length = p - custom; - if (iwe.u.data.length) - start = iwe_stream_add_point(start, stop, &iwe, custom); + /* Check if we added any rate */ + if((current_val - start) > IW_EV_LCP_LEN) + start = current_val; /* Add quality statistics */ iwe.cmd = IWEVQUAL; @@ -371,11 +369,10 @@ int ieee80211_wx_set_encode(struct ieee80211_device *ieee, struct ieee80211_crypt_data *new_crypt; /* take WEP into use */ - new_crypt = kmalloc(sizeof(struct ieee80211_crypt_data), + new_crypt = kzalloc(sizeof(struct ieee80211_crypt_data), GFP_KERNEL); if (new_crypt == NULL) return -ENOMEM; - memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); new_crypt->ops = ieee80211_get_crypto_ops("WEP"); if (!new_crypt->ops) { request_module("ieee80211_crypt_wep"); @@ -505,7 +502,7 @@ int ieee80211_wx_get_encode(struct ieee80211_device *ieee, len = sec->key_sizes[key]; memcpy(keybuf, sec->keys[key], len); - erq->length = (len >= 0 ? len : 0); + erq->length = len; erq->flags |= IW_ENCODE_ENABLED; if (ieee->open_wep) @@ -618,13 +615,11 @@ int ieee80211_wx_set_encodeext(struct ieee80211_device *ieee, ieee80211_crypt_delayed_deinit(ieee, crypt); - new_crypt = (struct ieee80211_crypt_data *) - kmalloc(sizeof(*new_crypt), GFP_KERNEL); + new_crypt = kzalloc(sizeof(*new_crypt), GFP_KERNEL); if (new_crypt == NULL) { ret = -ENOMEM; goto done; } - memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); new_crypt->ops = ops; if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) new_crypt->priv = new_crypt->ops->init(idx); diff --git a/net/ieee80211/softmac/Kconfig b/net/ieee80211/softmac/Kconfig index f2a27cc6e..2811651cb 100644 --- a/net/ieee80211/softmac/Kconfig +++ b/net/ieee80211/softmac/Kconfig @@ -2,6 +2,7 @@ config IEEE80211_SOFTMAC tristate "Software MAC add-on to the IEEE 802.11 networking stack" depends on IEEE80211 && EXPERIMENTAL select WIRELESS_EXT + select IEEE80211_CRYPT_WEP ---help--- This option enables the hardware independent software MAC addon for the IEEE 802.11 networking stack. diff --git a/net/ieee80211/softmac/ieee80211softmac_assoc.c b/net/ieee80211/softmac/ieee80211softmac_assoc.c index 57ea9f6f4..44215ce64 100644 --- a/net/ieee80211/softmac/ieee80211softmac_assoc.c +++ b/net/ieee80211/softmac/ieee80211softmac_assoc.c @@ -47,9 +47,7 @@ ieee80211softmac_assoc(struct ieee80211softmac_device *mac, struct ieee80211soft dprintk(KERN_INFO PFX "sent association request!\n"); - /* Change the state to associating */ spin_lock_irqsave(&mac->lock, flags); - mac->associnfo.associating = 1; mac->associated = 0; /* just to make sure */ /* Set a timer for timeout */ @@ -63,6 +61,7 @@ void ieee80211softmac_assoc_timeout(void *d) { struct ieee80211softmac_device *mac = (struct ieee80211softmac_device *)d; + struct ieee80211softmac_network *n; unsigned long flags; spin_lock_irqsave(&mac->lock, flags); @@ -75,58 +74,60 @@ ieee80211softmac_assoc_timeout(void *d) mac->associnfo.associating = 0; mac->associnfo.bssvalid = 0; mac->associated = 0; + + n = ieee80211softmac_get_network_by_bssid_locked(mac, mac->associnfo.bssid); spin_unlock_irqrestore(&mac->lock, flags); dprintk(KERN_INFO PFX "assoc request timed out!\n"); - /* FIXME: we need to know the network here. that requires a bit of restructuring */ - ieee80211softmac_call_events(mac, IEEE80211SOFTMAC_EVENT_ASSOCIATE_TIMEOUT, NULL); + ieee80211softmac_call_events(mac, IEEE80211SOFTMAC_EVENT_ASSOCIATE_TIMEOUT, n); } -/* Sends out a disassociation request to the desired AP */ -static void -ieee80211softmac_disassoc(struct ieee80211softmac_device *mac, u16 reason) +void +ieee80211softmac_disassoc(struct ieee80211softmac_device *mac) { unsigned long flags; + + spin_lock_irqsave(&mac->lock, flags); + if (mac->associnfo.associating) + cancel_delayed_work(&mac->associnfo.timeout); + + netif_carrier_off(mac->dev); + + mac->associated = 0; + mac->associnfo.bssvalid = 0; + mac->associnfo.associating = 0; + ieee80211softmac_init_txrates(mac); + ieee80211softmac_call_events_locked(mac, IEEE80211SOFTMAC_EVENT_DISASSOCIATED, NULL); + spin_unlock_irqrestore(&mac->lock, flags); +} + +/* Sends out a disassociation request to the desired AP */ +void +ieee80211softmac_send_disassoc_req(struct ieee80211softmac_device *mac, u16 reason) +{ struct ieee80211softmac_network *found; if (mac->associnfo.bssvalid && mac->associated) { found = ieee80211softmac_get_network_by_bssid(mac, mac->associnfo.bssid); if (found) ieee80211softmac_send_mgt_frame(mac, found, IEEE80211_STYPE_DISASSOC, reason); - } else if (mac->associnfo.associating) { - cancel_delayed_work(&mac->associnfo.timeout); } - /* Change our state */ - spin_lock_irqsave(&mac->lock, flags); - /* Do NOT clear bssvalid as that will break ieee80211softmac_assoc_work! */ - mac->associated = 0; - mac->associnfo.associating = 0; - ieee80211softmac_call_events_locked(mac, IEEE80211SOFTMAC_EVENT_DISASSOCIATED, NULL); - spin_unlock_irqrestore(&mac->lock, flags); + ieee80211softmac_disassoc(mac); } static inline int we_support_all_basic_rates(struct ieee80211softmac_device *mac, u8 *from, u8 from_len) { - int idx, search, found; - u8 rate, search_rate; + int idx; + u8 rate; for (idx = 0; idx < (from_len); idx++) { rate = (from)[idx]; if (!(rate & IEEE80211_BASIC_RATE_MASK)) continue; - found = 0; rate &= ~IEEE80211_BASIC_RATE_MASK; - for (search = 0; search < mac->ratesinfo.count; search++) { - search_rate = mac->ratesinfo.rates[search]; - search_rate &= ~IEEE80211_BASIC_RATE_MASK; - if (rate == search_rate) { - found = 1; - break; - } - } - if (!found) + if (!ieee80211softmac_ratesinfo_rate_supported(&mac->ratesinfo, rate)) return 0; } return 1; @@ -163,12 +164,28 @@ network_matches_request(struct ieee80211softmac_device *mac, struct ieee80211_ne } static void -ieee80211softmac_assoc_notify(struct net_device *dev, void *context) +ieee80211softmac_assoc_notify_scan(struct net_device *dev, int event_type, void *context) { struct ieee80211softmac_device *mac = ieee80211_priv(dev); ieee80211softmac_assoc_work((void*)mac); } +static void +ieee80211softmac_assoc_notify_auth(struct net_device *dev, int event_type, void *context) +{ + struct ieee80211softmac_device *mac = ieee80211_priv(dev); + + switch (event_type) { + case IEEE80211SOFTMAC_EVENT_AUTHENTICATED: + ieee80211softmac_assoc_work((void*)mac); + break; + case IEEE80211SOFTMAC_EVENT_AUTH_FAILED: + case IEEE80211SOFTMAC_EVENT_AUTH_TIMEOUT: + ieee80211softmac_disassoc(mac); + break; + } +} + /* This function is called to handle userspace requests (asynchronously) */ void ieee80211softmac_assoc_work(void *d) @@ -176,14 +193,22 @@ ieee80211softmac_assoc_work(void *d) struct ieee80211softmac_device *mac = (struct ieee80211softmac_device *)d; struct ieee80211softmac_network *found = NULL; struct ieee80211_network *net = NULL, *best = NULL; + int bssvalid; unsigned long flags; - + + /* ieee80211_disassoc might clear this */ + bssvalid = mac->associnfo.bssvalid; + /* meh */ if (mac->associated) - ieee80211softmac_disassoc(mac, WLAN_REASON_DISASSOC_STA_HAS_LEFT); + ieee80211softmac_send_disassoc_req(mac, WLAN_REASON_DISASSOC_STA_HAS_LEFT); + + spin_lock_irqsave(&mac->lock, flags); + mac->associnfo.associating = 1; + spin_unlock_irqrestore(&mac->lock, flags); /* try to find the requested network in our list, if we found one already */ - if (mac->associnfo.bssvalid || mac->associnfo.bssfixed) + if (bssvalid || mac->associnfo.bssfixed) found = ieee80211softmac_get_network_by_bssid(mac, mac->associnfo.bssid); /* Search the ieee80211 networks for this network if we didn't find it by bssid, @@ -244,7 +269,7 @@ ieee80211softmac_assoc_work(void *d) * Maybe we can hope to have more memory after scanning finishes ;) */ dprintk(KERN_INFO PFX "Associate: Scanning for networks first.\n"); - ieee80211softmac_notify(mac->dev, IEEE80211SOFTMAC_EVENT_SCAN_FINISHED, ieee80211softmac_assoc_notify, NULL); + ieee80211softmac_notify(mac->dev, IEEE80211SOFTMAC_EVENT_SCAN_FINISHED, ieee80211softmac_assoc_notify_scan, NULL); if (ieee80211softmac_start_scan(mac)) dprintk(KERN_INFO PFX "Associate: failed to initiate scan. Is device up?\n"); return; @@ -274,19 +299,32 @@ ieee80211softmac_assoc_work(void *d) memcpy(mac->associnfo.associate_essid.data, found->essid.data, IW_ESSID_MAX_SIZE + 1); /* we found a network! authenticate (if necessary) and associate to it. */ - if (!found->authenticated) { + if (found->authenticating) { + dprintk(KERN_INFO PFX "Already requested authentication, waiting...\n"); + if(!mac->associnfo.assoc_wait) { + mac->associnfo.assoc_wait = 1; + ieee80211softmac_notify_internal(mac, IEEE80211SOFTMAC_EVENT_ANY, found, ieee80211softmac_assoc_notify_auth, NULL, GFP_KERNEL); + } + return; + } + if (!found->authenticated && !found->authenticating) { /* This relies on the fact that _auth_req only queues the work, * otherwise adding the notification would be racy. */ if (!ieee80211softmac_auth_req(mac, found)) { - dprintk(KERN_INFO PFX "cannot associate without being authenticated, requested authentication\n"); - ieee80211softmac_notify_internal(mac, IEEE80211SOFTMAC_EVENT_ANY, found, ieee80211softmac_assoc_notify, NULL, GFP_KERNEL); + if(!mac->associnfo.assoc_wait) { + dprintk(KERN_INFO PFX "Cannot associate without being authenticated, requested authentication\n"); + mac->associnfo.assoc_wait = 1; + ieee80211softmac_notify_internal(mac, IEEE80211SOFTMAC_EVENT_ANY, found, ieee80211softmac_assoc_notify_auth, NULL, GFP_KERNEL); + } } else { printkl(KERN_WARNING PFX "Not authenticated, but requesting authentication failed. Giving up to associate\n"); + mac->associnfo.assoc_wait = 0; ieee80211softmac_call_events(mac, IEEE80211SOFTMAC_EVENT_ASSOCIATE_FAILED, found); } return; } /* finally! now we can start associating */ + mac->associnfo.assoc_wait = 0; ieee80211softmac_assoc(mac, found); } @@ -297,6 +335,9 @@ ieee80211softmac_associated(struct ieee80211softmac_device *mac, struct ieee80211softmac_network *net) { mac->associnfo.associating = 0; + mac->associnfo.supported_rates = net->supported_rates; + ieee80211softmac_recalc_txrates(mac); + mac->associated = 1; if (mac->set_bssid_filter) mac->set_bssid_filter(mac->dev, net->bssid); @@ -380,7 +421,6 @@ ieee80211softmac_handle_disassoc(struct net_device * dev, struct ieee80211_disassoc *disassoc) { struct ieee80211softmac_device *mac = ieee80211_priv(dev); - unsigned long flags; if (unlikely(!mac->running)) return -ENODEV; @@ -392,14 +432,11 @@ ieee80211softmac_handle_disassoc(struct net_device * dev, return 0; dprintk(KERN_INFO PFX "got disassoc frame\n"); - netif_carrier_off(dev); - spin_lock_irqsave(&mac->lock, flags); - mac->associnfo.bssvalid = 0; - mac->associated = 0; - ieee80211softmac_call_events_locked(mac, IEEE80211SOFTMAC_EVENT_DISASSOCIATED, NULL); + ieee80211softmac_disassoc(mac); + + /* try to reassociate */ schedule_work(&mac->associnfo.work); - spin_unlock_irqrestore(&mac->lock, flags); - + return 0; } diff --git a/net/ieee80211/softmac/ieee80211softmac_auth.c b/net/ieee80211/softmac/ieee80211softmac_auth.c index 06e332624..4cef39e17 100644 --- a/net/ieee80211/softmac/ieee80211softmac_auth.c +++ b/net/ieee80211/softmac/ieee80211softmac_auth.c @@ -36,8 +36,9 @@ ieee80211softmac_auth_req(struct ieee80211softmac_device *mac, struct ieee80211softmac_auth_queue_item *auth; unsigned long flags; - if (net->authenticating) + if (net->authenticating || net->authenticated) return 0; + net->authenticating = 1; /* Add the network if it's not already added */ ieee80211softmac_add_network(mac, net); @@ -92,7 +93,6 @@ ieee80211softmac_auth_queue(void *data) return; } net->authenticated = 0; - net->authenticating = 1; /* add a timeout call so we eventually give up waiting for an auth reply */ schedule_delayed_work(&auth->work, IEEE80211SOFTMAC_AUTH_TIMEOUT); auth->retry--; @@ -107,6 +107,7 @@ ieee80211softmac_auth_queue(void *data) printkl(KERN_WARNING PFX "Authentication timed out with "MAC_FMT"\n", MAC_ARG(net->bssid)); /* Remove this item from the queue */ spin_lock_irqsave(&mac->lock, flags); + net->authenticating = 0; ieee80211softmac_call_events_locked(mac, IEEE80211SOFTMAC_EVENT_AUTH_TIMEOUT, net); cancel_delayed_work(&auth->work); /* just to make sure... */ list_del(&auth->list); @@ -115,6 +116,16 @@ ieee80211softmac_auth_queue(void *data) kfree(auth); } +/* Sends a response to an auth challenge (for shared key auth). */ +static void +ieee80211softmac_auth_challenge_response(void *_aq) +{ + struct ieee80211softmac_auth_queue_item *aq = _aq; + + /* Send our response */ + ieee80211softmac_send_mgt_frame(aq->mac, aq->net, IEEE80211_STYPE_AUTH, aq->state); +} + /* Handle the auth response from the AP * This should be registered with ieee80211 as handle_auth */ @@ -196,29 +207,35 @@ ieee80211softmac_auth_resp(struct net_device *dev, struct ieee80211_auth *auth) case IEEE80211SOFTMAC_AUTH_SHARED_CHALLENGE: /* Check to make sure we have a challenge IE */ data = (u8 *)auth->info_element; - if(*data++ != MFIE_TYPE_CHALLENGE){ + if (*data++ != MFIE_TYPE_CHALLENGE) { printkl(KERN_NOTICE PFX "Shared Key Authentication failed due to a missing challenge.\n"); break; } /* Save the challenge */ spin_lock_irqsave(&mac->lock, flags); net->challenge_len = *data++; - if(net->challenge_len > WLAN_AUTH_CHALLENGE_LEN) + if (net->challenge_len > WLAN_AUTH_CHALLENGE_LEN) net->challenge_len = WLAN_AUTH_CHALLENGE_LEN; - if(net->challenge != NULL) + if (net->challenge != NULL) kfree(net->challenge); net->challenge = kmalloc(net->challenge_len, GFP_ATOMIC); memcpy(net->challenge, data, net->challenge_len); aq->state = IEEE80211SOFTMAC_AUTH_SHARED_RESPONSE; - spin_unlock_irqrestore(&mac->lock, flags); - /* Switch to correct channel for this network */ - mac->set_channel(mac->dev, net->channel); - - /* Send our response (How to encrypt?) */ - ieee80211softmac_send_mgt_frame(mac, aq->net, IEEE80211_STYPE_AUTH, aq->state); - break; + /* We reuse the work struct from the auth request here. + * It is safe to do so as each one is per-request, and + * at this point (dealing with authentication response) + * we have obviously already sent the initial auth + * request. */ + cancel_delayed_work(&aq->work); + INIT_WORK(&aq->work, &ieee80211softmac_auth_challenge_response, (void *)aq); + schedule_work(&aq->work); + spin_unlock_irqrestore(&mac->lock, flags); + return 0; case IEEE80211SOFTMAC_AUTH_SHARED_PASS: + kfree(net->challenge); + net->challenge = NULL; + net->challenge_len = 0; /* Check the status code of the response */ switch(auth->status) { case WLAN_STATUS_SUCCESS: @@ -229,6 +246,7 @@ ieee80211softmac_auth_resp(struct net_device *dev, struct ieee80211_auth *auth) spin_unlock_irqrestore(&mac->lock, flags); printkl(KERN_NOTICE PFX "Shared Key Authentication completed with "MAC_FMT"\n", MAC_ARG(net->bssid)); + ieee80211softmac_call_events(mac, IEEE80211SOFTMAC_EVENT_AUTHENTICATED, net); break; default: printkl(KERN_NOTICE PFX "Shared Key Authentication with "MAC_FMT" failed, error code: %i\n", @@ -279,6 +297,9 @@ ieee80211softmac_deauth_from_net(struct ieee80211softmac_device *mac, struct list_head *list_ptr; unsigned long flags; + /* deauthentication implies disassociation */ + ieee80211softmac_disassoc(mac); + /* Lock and reset status flags */ spin_lock_irqsave(&mac->lock, flags); net->authenticating = 0; diff --git a/net/ieee80211/softmac/ieee80211softmac_event.c b/net/ieee80211/softmac/ieee80211softmac_event.c index 8cc8f3f0f..f34fa2ef6 100644 --- a/net/ieee80211/softmac/ieee80211softmac_event.c +++ b/net/ieee80211/softmac/ieee80211softmac_event.c @@ -38,7 +38,8 @@ * The event context is private and can only be used from * within this module. Its meaning varies with the event * type: - * SCAN_FINISHED: no special meaning + * SCAN_FINISHED, + * DISASSOCIATED: NULL * ASSOCIATED, * ASSOCIATE_FAILED, * ASSOCIATE_TIMEOUT, @@ -59,15 +60,15 @@ */ static char *event_descriptions[IEEE80211SOFTMAC_EVENT_LAST+1] = { - "scan finished", - "associated", + NULL, /* scan finished */ + NULL, /* associated */ "associating failed", "associating timed out", "authenticated", "authenticating failed", "authenticating timed out", "associating failed because no suitable network was found", - "disassociated", + NULL, /* disassociated */ }; @@ -77,7 +78,7 @@ ieee80211softmac_notify_callback(void *d) struct ieee80211softmac_event event = *(struct ieee80211softmac_event*) d; kfree(d); - event.fun(event.mac->dev, event.context); + event.fun(event.mac->dev, event.event_type, event.context); } int @@ -136,30 +137,24 @@ ieee80211softmac_call_events_locked(struct ieee80211softmac_device *mac, int eve int we_event; char *msg = NULL; + memset(&wrqu, '\0', sizeof (union iwreq_data)); + switch(event) { case IEEE80211SOFTMAC_EVENT_ASSOCIATED: network = (struct ieee80211softmac_network *)event_ctx; - wrqu.data.length = 0; - wrqu.data.flags = 0; memcpy(wrqu.ap_addr.sa_data, &network->bssid[0], ETH_ALEN); - wrqu.ap_addr.sa_family = ARPHRD_ETHER; - we_event = SIOCGIWAP; - break; + /* fall through */ case IEEE80211SOFTMAC_EVENT_DISASSOCIATED: - wrqu.data.length = 0; - wrqu.data.flags = 0; - memset(&wrqu, '\0', sizeof (union iwreq_data)); wrqu.ap_addr.sa_family = ARPHRD_ETHER; we_event = SIOCGIWAP; break; case IEEE80211SOFTMAC_EVENT_SCAN_FINISHED: - wrqu.data.length = 0; - wrqu.data.flags = 0; - memset(&wrqu, '\0', sizeof (union iwreq_data)); we_event = SIOCGIWSCAN; break; default: msg = event_descriptions[event]; + if (!msg) + msg = "SOFTMAC EVENT BUG"; wrqu.data.length = strlen(msg); we_event = IWEVCUSTOM; break; @@ -172,6 +167,9 @@ ieee80211softmac_call_events_locked(struct ieee80211softmac_device *mac, int eve if ((eventptr->event_type == event || eventptr->event_type == -1) && (eventptr->event_context == NULL || eventptr->event_context == event_ctx)) { list_del(&eventptr->list); + /* User may have subscribed to ANY event, so + * we tell them which event triggered it. */ + eventptr->event_type = event; schedule_work(&eventptr->work); } } diff --git a/net/ieee80211/softmac/ieee80211softmac_io.c b/net/ieee80211/softmac/ieee80211softmac_io.c index cc6cd56c8..6ae5a1dc7 100644 --- a/net/ieee80211/softmac/ieee80211softmac_io.c +++ b/net/ieee80211/softmac/ieee80211softmac_io.c @@ -96,8 +96,7 @@ ieee80211softmac_alloc_mgt(u32 size) if(size > IEEE80211_DATA_LEN) return NULL; /* Allocate the frame */ - data = kmalloc(size, GFP_ATOMIC); - memset(data, 0, size); + data = kzalloc(size, GFP_ATOMIC); return data; } @@ -149,6 +148,56 @@ ieee80211softmac_hdr_3addr(struct ieee80211softmac_device *mac, * shouldn't the sequence number be in ieee80211? */ } +static u16 +ieee80211softmac_capabilities(struct ieee80211softmac_device *mac, + struct ieee80211softmac_network *net) +{ + u16 capability = 0; + + /* ESS and IBSS bits are set according to the current mode */ + switch (mac->ieee->iw_mode) { + case IW_MODE_INFRA: + capability = cpu_to_le16(WLAN_CAPABILITY_ESS); + break; + case IW_MODE_ADHOC: + capability = cpu_to_le16(WLAN_CAPABILITY_IBSS); + break; + case IW_MODE_AUTO: + capability = net->capabilities & + (WLAN_CAPABILITY_ESS|WLAN_CAPABILITY_IBSS); + break; + default: + /* bleh. we don't ever go to these modes */ + printk(KERN_ERR PFX "invalid iw_mode!\n"); + break; + } + + /* CF Pollable / CF Poll Request */ + /* Needs to be implemented, for now, the 0's == not supported */ + + /* Privacy Bit */ + capability |= mac->ieee->sec.level ? + cpu_to_le16(WLAN_CAPABILITY_PRIVACY) : 0; + + /* Short Preamble */ + /* Always supported: we probably won't ever be powering devices which + * dont support this... */ + capability |= WLAN_CAPABILITY_SHORT_PREAMBLE; + + /* PBCC */ + /* Not widely used */ + + /* Channel Agility */ + /* Not widely used */ + + /* Short Slot */ + /* Will be implemented later */ + + /* DSSS-OFDM */ + /* Not widely used */ + + return capability; +} /***************************************************************************** * Create Management packets @@ -179,27 +228,9 @@ ieee80211softmac_assoc_req(struct ieee80211_assoc_request **pkt, return 0; ieee80211softmac_hdr_3addr(mac, &((*pkt)->header), IEEE80211_STYPE_ASSOC_REQ, net->bssid, net->bssid); - /* Fill in capability Info */ - switch (mac->ieee->iw_mode) { - case IW_MODE_INFRA: - (*pkt)->capability = cpu_to_le16(WLAN_CAPABILITY_ESS); - break; - case IW_MODE_ADHOC: - (*pkt)->capability = cpu_to_le16(WLAN_CAPABILITY_IBSS); - break; - case IW_MODE_AUTO: - (*pkt)->capability = net->capabilities & (WLAN_CAPABILITY_ESS|WLAN_CAPABILITY_IBSS); - break; - default: - /* bleh. we don't ever go to these modes */ - printk(KERN_ERR PFX "invalid iw_mode!\n"); - break; - } - /* Need to add this - (*pkt)->capability |= mac->ieee->short_slot ? - cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT_TIME) : 0; - */ - (*pkt)->capability |= mac->ieee->sec.level ? cpu_to_le16(WLAN_CAPABILITY_PRIVACY) : 0; + /* Fill in the capabilities */ + (*pkt)->capability = ieee80211softmac_capabilities(mac, net); + /* Fill in Listen Interval (?) */ (*pkt)->listen_interval = cpu_to_le16(10); @@ -239,17 +270,9 @@ ieee80211softmac_reassoc_req(struct ieee80211_reassoc_request **pkt, return 0; ieee80211softmac_hdr_3addr(mac, &((*pkt)->header), IEEE80211_STYPE_REASSOC_REQ, net->bssid, net->bssid); - /* Fill in capability Info */ - (*pkt)->capability = mac->ieee->iw_mode == IW_MODE_MASTER ? - cpu_to_le16(WLAN_CAPABILITY_ESS) : - cpu_to_le16(WLAN_CAPABILITY_IBSS); - /* - (*pkt)->capability |= mac->ieee->short_slot ? - cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT_TIME) : 0; - */ - (*pkt)->capability |= mac->ieee->sec.level ? - cpu_to_le16(WLAN_CAPABILITY_PRIVACY) : 0; - + /* Fill in the capabilities */ + (*pkt)->capability = ieee80211softmac_capabilities(mac, net); + /* Fill in Listen Interval (?) */ (*pkt)->listen_interval = cpu_to_le16(10); /* Fill in the current AP MAC */ @@ -268,26 +291,27 @@ ieee80211softmac_reassoc_req(struct ieee80211_reassoc_request **pkt, static u32 ieee80211softmac_auth(struct ieee80211_auth **pkt, struct ieee80211softmac_device *mac, struct ieee80211softmac_network *net, - u16 transaction, u16 status) + u16 transaction, u16 status, int *encrypt_mpdu) { u8 *data; + int auth_mode = mac->ieee->sec.auth_mode; + int is_shared_response = (auth_mode == WLAN_AUTH_SHARED_KEY + && transaction == IEEE80211SOFTMAC_AUTH_SHARED_RESPONSE); + /* Allocate Packet */ (*pkt) = (struct ieee80211_auth *)ieee80211softmac_alloc_mgt( 2 + /* Auth Algorithm */ 2 + /* Auth Transaction Seq */ 2 + /* Status Code */ /* Challenge Text IE */ - mac->ieee->open_wep ? 0 : - 1 + 1 + WLAN_AUTH_CHALLENGE_LEN - ); + is_shared_response ? 0 : 1 + 1 + net->challenge_len + ); if (unlikely((*pkt) == NULL)) return 0; ieee80211softmac_hdr_3addr(mac, &((*pkt)->header), IEEE80211_STYPE_AUTH, net->bssid, net->bssid); /* Algorithm */ - (*pkt)->algorithm = mac->ieee->open_wep ? - cpu_to_le16(WLAN_AUTH_OPEN) : - cpu_to_le16(WLAN_AUTH_SHARED_KEY); + (*pkt)->algorithm = cpu_to_le16(auth_mode); /* Transaction */ (*pkt)->transaction = cpu_to_le16(transaction); /* Status */ @@ -295,18 +319,20 @@ ieee80211softmac_auth(struct ieee80211_auth **pkt, data = (u8 *)(*pkt)->info_element; /* Challenge Text */ - if(!mac->ieee->open_wep){ + if (is_shared_response) { *data = MFIE_TYPE_CHALLENGE; data++; /* Copy the challenge in */ - // *data = challenge length - // data += sizeof(u16); - // memcpy(data, challenge, challenge length); - // data += challenge length; - - /* Add the full size to the packet length */ - } + *data = net->challenge_len; + data++; + memcpy(data, net->challenge, net->challenge_len); + data += net->challenge_len; + + /* Make sure this frame gets encrypted with the shared key */ + *encrypt_mpdu = 1; + } else + *encrypt_mpdu = 0; /* Return the packet size */ return (data - (u8 *)(*pkt)); @@ -396,6 +422,7 @@ ieee80211softmac_send_mgt_frame(struct ieee80211softmac_device *mac, { void *pkt = NULL; u32 pkt_size = 0; + int encrypt_mpdu = 0; switch(type) { case IEEE80211_STYPE_ASSOC_REQ: @@ -405,7 +432,7 @@ ieee80211softmac_send_mgt_frame(struct ieee80211softmac_device *mac, pkt_size = ieee80211softmac_reassoc_req((struct ieee80211_reassoc_request **)(&pkt), mac, (struct ieee80211softmac_network *)ptrarg); break; case IEEE80211_STYPE_AUTH: - pkt_size = ieee80211softmac_auth((struct ieee80211_auth **)(&pkt), mac, (struct ieee80211softmac_network *)ptrarg, (u16)(arg & 0xFFFF), (u16) (arg >> 16)); + pkt_size = ieee80211softmac_auth((struct ieee80211_auth **)(&pkt), mac, (struct ieee80211softmac_network *)ptrarg, (u16)(arg & 0xFFFF), (u16) (arg >> 16), &encrypt_mpdu); break; case IEEE80211_STYPE_DISASSOC: case IEEE80211_STYPE_DEAUTH: @@ -434,52 +461,8 @@ ieee80211softmac_send_mgt_frame(struct ieee80211softmac_device *mac, * or get rid of it alltogether? * Does this work for you now? */ - ieee80211_tx_frame(mac->ieee, (struct ieee80211_hdr *)pkt, pkt_size); - - kfree(pkt); - return 0; -} - - -/* Create an rts/cts frame */ -static u32 -ieee80211softmac_rts_cts(struct ieee80211_hdr_2addr **pkt, - struct ieee80211softmac_device *mac, struct ieee80211softmac_network *net, - u32 type) -{ - /* Allocate Packet */ - (*pkt) = kmalloc(IEEE80211_2ADDR_LEN, GFP_ATOMIC); - memset(*pkt, 0, IEEE80211_2ADDR_LEN); - if((*pkt) == NULL) - return 0; - ieee80211softmac_hdr_2addr(mac, (*pkt), type, net->bssid); - return IEEE80211_2ADDR_LEN; -} - - -/* Sends a control packet */ -static int -ieee80211softmac_send_ctl_frame(struct ieee80211softmac_device *mac, - struct ieee80211softmac_network *net, u32 type, u32 arg) -{ - void *pkt = NULL; - u32 pkt_size = 0; - - switch(type) { - case IEEE80211_STYPE_RTS: - case IEEE80211_STYPE_CTS: - pkt_size = ieee80211softmac_rts_cts((struct ieee80211_hdr_2addr **)(&pkt), mac, net, type); - break; - default: - printkl(KERN_DEBUG PFX "Unsupported Control Frame type: %i\n", type); - return -EINVAL; - } - - if(pkt_size == 0) - return -ENOMEM; - - /* Send the packet to the ieee80211 layer for tx */ - ieee80211_tx_frame(mac->ieee, (struct ieee80211_hdr *) pkt, pkt_size); + ieee80211_tx_frame(mac->ieee, (struct ieee80211_hdr *)pkt, + IEEE80211_3ADDR_LEN, pkt_size, encrypt_mpdu); kfree(pkt); return 0; diff --git a/net/ieee80211/softmac/ieee80211softmac_module.c b/net/ieee80211/softmac/ieee80211softmac_module.c index 6252be2c0..4b2e57d12 100644 --- a/net/ieee80211/softmac/ieee80211softmac_module.c +++ b/net/ieee80211/softmac/ieee80211softmac_module.c @@ -26,6 +26,7 @@ #include "ieee80211softmac_priv.h" #include +#include struct net_device *alloc_ieee80211softmac(int sizeof_priv) { @@ -61,14 +62,6 @@ struct net_device *alloc_ieee80211softmac(int sizeof_priv) softmac->wait_for_scan = ieee80211softmac_wait_for_scan_implementation; softmac->stop_scan = ieee80211softmac_stop_scan_implementation; - //TODO: The mcast rate has to be assigned dynamically somewhere (in scanning, association. Not sure...) - // It has to be set to the highest rate all stations in the current network can handle. - softmac->txrates.mcast_rate = IEEE80211_CCK_RATE_1MB; - softmac->txrates.mcast_fallback = IEEE80211_CCK_RATE_1MB; - /* This is reassigned in ieee80211softmac_start to sane values. */ - softmac->txrates.default_rate = IEEE80211_CCK_RATE_1MB; - softmac->txrates.default_fallback = IEEE80211_CCK_RATE_1MB; - /* to start with, we can't send anything ... */ netif_carrier_off(dev); @@ -170,15 +163,82 @@ static void ieee80211softmac_start_check_rates(struct ieee80211softmac_device *m } } -void ieee80211softmac_start(struct net_device *dev) +int ieee80211softmac_ratesinfo_rate_supported(struct ieee80211softmac_ratesinfo *ri, u8 rate) +{ + int search; + u8 search_rate; + + for (search = 0; search < ri->count; search++) { + search_rate = ri->rates[search]; + search_rate &= ~IEEE80211_BASIC_RATE_MASK; + if (rate == search_rate) + return 1; + } + + return 0; +} + +/* Finds the highest rate which is: + * 1. Present in ri (optionally a basic rate) + * 2. Supported by the device + * 3. Less than or equal to the user-defined rate + */ +static u8 highest_supported_rate(struct ieee80211softmac_device *mac, + struct ieee80211softmac_ratesinfo *ri, int basic_only) +{ + u8 user_rate = mac->txrates.user_rate; + int i; + + if (ri->count == 0) { + dprintk(KERN_ERR PFX "empty ratesinfo?\n"); + return IEEE80211_CCK_RATE_1MB; + } + + for (i = ri->count - 1; i >= 0; i--) { + u8 rate = ri->rates[i]; + if (basic_only && !(rate & IEEE80211_BASIC_RATE_MASK)) + continue; + rate &= ~IEEE80211_BASIC_RATE_MASK; + if (rate > user_rate) + continue; + if (ieee80211softmac_ratesinfo_rate_supported(&mac->ratesinfo, rate)) + return rate; + } + + /* If we haven't found a suitable rate by now, just trust the user */ + return user_rate; +} + +void ieee80211softmac_recalc_txrates(struct ieee80211softmac_device *mac) +{ + struct ieee80211softmac_txrates *txrates = &mac->txrates; + struct ieee80211softmac_txrates oldrates; + u32 change = 0; + + if (mac->txrates_change) + oldrates = mac->txrates; + + change |= IEEE80211SOFTMAC_TXRATECHG_DEFAULT; + txrates->default_rate = highest_supported_rate(mac, &mac->associnfo.supported_rates, 0); + + change |= IEEE80211SOFTMAC_TXRATECHG_DEFAULT_FBACK; + txrates->default_fallback = lower_rate(mac, txrates->default_rate); + + change |= IEEE80211SOFTMAC_TXRATECHG_MCAST; + txrates->mcast_rate = highest_supported_rate(mac, &mac->associnfo.supported_rates, 1); + + if (mac->txrates_change) + mac->txrates_change(mac->dev, change, &oldrates); + +} + +void ieee80211softmac_init_txrates(struct ieee80211softmac_device *mac) { - struct ieee80211softmac_device *mac = ieee80211_priv(dev); struct ieee80211_device *ieee = mac->ieee; u32 change = 0; + struct ieee80211softmac_txrates *txrates = &mac->txrates; struct ieee80211softmac_txrates oldrates; - ieee80211softmac_start_check_rates(mac); - /* TODO: We need some kind of state machine to lower the default rates * if we loose too many packets. */ @@ -193,22 +253,37 @@ void ieee80211softmac_start(struct net_device *dev) more reliable. Note similar logic in ieee80211softmac_wx_set_rate() */ if (ieee->modulation & IEEE80211_CCK_MODULATION) { - mac->txrates.default_rate = IEEE80211_CCK_RATE_11MB; - change |= IEEE80211SOFTMAC_TXRATECHG_DEFAULT; - mac->txrates.default_fallback = IEEE80211_CCK_RATE_5MB; - change |= IEEE80211SOFTMAC_TXRATECHG_DEFAULT_FBACK; + txrates->user_rate = IEEE80211_CCK_RATE_11MB; } else if (ieee->modulation & IEEE80211_OFDM_MODULATION) { - mac->txrates.default_rate = IEEE80211_OFDM_RATE_54MB; - change |= IEEE80211SOFTMAC_TXRATECHG_DEFAULT; - mac->txrates.default_fallback = IEEE80211_OFDM_RATE_24MB; - change |= IEEE80211SOFTMAC_TXRATECHG_DEFAULT_FBACK; + txrates->user_rate = IEEE80211_OFDM_RATE_54MB; } else assert(0); + + txrates->default_rate = IEEE80211_CCK_RATE_1MB; + change |= IEEE80211SOFTMAC_TXRATECHG_DEFAULT; + + txrates->default_fallback = IEEE80211_CCK_RATE_1MB; + change |= IEEE80211SOFTMAC_TXRATECHG_DEFAULT_FBACK; + + txrates->mcast_rate = IEEE80211_CCK_RATE_1MB; + change |= IEEE80211SOFTMAC_TXRATECHG_MCAST; + + txrates->mgt_mcast_rate = IEEE80211_CCK_RATE_1MB; + change |= IEEE80211SOFTMAC_TXRATECHG_MGT_MCAST; + if (mac->txrates_change) - mac->txrates_change(dev, change, &oldrates); + mac->txrates_change(mac->dev, change, &oldrates); mac->running = 1; } + +void ieee80211softmac_start(struct net_device *dev) +{ + struct ieee80211softmac_device *mac = ieee80211_priv(dev); + + ieee80211softmac_start_check_rates(mac); + ieee80211softmac_init_txrates(mac); +} EXPORT_SYMBOL_GPL(ieee80211softmac_start); void ieee80211softmac_stop(struct net_device *dev) diff --git a/net/ieee80211/softmac/ieee80211softmac_priv.h b/net/ieee80211/softmac/ieee80211softmac_priv.h index 65d9816c8..fa1f8e3ac 100644 --- a/net/ieee80211/softmac/ieee80211softmac_priv.h +++ b/net/ieee80211/softmac/ieee80211softmac_priv.h @@ -116,7 +116,10 @@ ieee80211softmac_get_network_by_essid(struct ieee80211softmac_device *mac, struct ieee80211softmac_essid *essid); /* Rates related */ +int ieee80211softmac_ratesinfo_rate_supported(struct ieee80211softmac_ratesinfo *ri, u8 rate); u8 ieee80211softmac_lower_rate_delta(struct ieee80211softmac_device *mac, u8 rate, int delta); +void ieee80211softmac_init_txrates(struct ieee80211softmac_device *mac); +void ieee80211softmac_recalc_txrates(struct ieee80211softmac_device *mac); static inline u8 lower_rate(struct ieee80211softmac_device *mac, u8 rate) { return ieee80211softmac_lower_rate_delta(mac, rate, 1); } @@ -150,6 +153,8 @@ int ieee80211softmac_handle_disassoc(struct net_device * dev, int ieee80211softmac_handle_reassoc_req(struct net_device * dev, struct ieee80211_reassoc_request * reassoc); void ieee80211softmac_assoc_timeout(void *d); +void ieee80211softmac_send_disassoc_req(struct ieee80211softmac_device *mac, u16 reason); +void ieee80211softmac_disassoc(struct ieee80211softmac_device *mac); /* some helper functions */ static inline int ieee80211softmac_scan_handlers_check_self(struct ieee80211softmac_device *sm) diff --git a/net/ieee80211/softmac/ieee80211softmac_wx.c b/net/ieee80211/softmac/ieee80211softmac_wx.c index 27edb2b55..75320b684 100644 --- a/net/ieee80211/softmac/ieee80211softmac_wx.c +++ b/net/ieee80211/softmac/ieee80211softmac_wx.c @@ -70,12 +70,44 @@ ieee80211softmac_wx_set_essid(struct net_device *net_dev, char *extra) { struct ieee80211softmac_device *sm = ieee80211_priv(net_dev); + struct ieee80211softmac_network *n; + struct ieee80211softmac_auth_queue_item *authptr; int length = 0; unsigned long flags; - + + /* Check if we're already associating to this or another network + * If it's another network, cancel and start over with our new network + * If it's our network, ignore the change, we're already doing it! + */ + if((sm->associnfo.associating || sm->associated) && + (data->essid.flags && data->essid.length && extra)) { + /* Get the associating network */ + n = ieee80211softmac_get_network_by_bssid(sm, sm->associnfo.bssid); + if(n && n->essid.len == (data->essid.length - 1) && + !memcmp(n->essid.data, extra, n->essid.len)) { + dprintk(KERN_INFO PFX "Already associating or associated to "MAC_FMT"\n", + MAC_ARG(sm->associnfo.bssid)); + return 0; + } else { + dprintk(KERN_INFO PFX "Canceling existing associate request!\n"); + spin_lock_irqsave(&sm->lock,flags); + /* Cancel assoc work */ + cancel_delayed_work(&sm->associnfo.work); + /* We don't have to do this, but it's a little cleaner */ + list_for_each_entry(authptr, &sm->auth_queue, list) + cancel_delayed_work(&authptr->work); + sm->associnfo.bssvalid = 0; + sm->associnfo.bssfixed = 0; + spin_unlock_irqrestore(&sm->lock,flags); + flush_scheduled_work(); + } + } + + spin_lock_irqsave(&sm->lock, flags); - + sm->associnfo.static_essid = 0; + sm->associnfo.assoc_wait = 0; if (data->essid.flags && data->essid.length && extra /*required?*/) { length = min(data->essid.length - 1, IW_ESSID_MAX_SIZE); @@ -211,8 +243,8 @@ ieee80211softmac_wx_set_rate(struct net_device *net_dev, if (is_ofdm && !(ieee->modulation & IEEE80211_OFDM_MODULATION)) goto out_unlock; - mac->txrates.default_rate = rate; - mac->txrates.default_fallback = lower_rate(mac, rate); + mac->txrates.user_rate = rate; + ieee80211softmac_recalc_txrates(mac); err = 0; out_unlock: @@ -388,7 +420,7 @@ ieee80211softmac_wx_set_genie(struct net_device *dev, memcpy(mac->wpa.IE, extra, wrqu->data.length); dprintk(KERN_INFO PFX "generic IE set to "); for (i=0;idata.length;i++) - dprintk("%.2x", mac->wpa.IE[i]); + dprintk("%.2x", (u8)mac->wpa.IE[i]); dprintk("\n"); mac->wpa.IElen = wrqu->data.length; } else { @@ -431,3 +463,35 @@ ieee80211softmac_wx_get_genie(struct net_device *dev, } EXPORT_SYMBOL_GPL(ieee80211softmac_wx_get_genie); +int +ieee80211softmac_wx_set_mlme(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, + char *extra) +{ + struct ieee80211softmac_device *mac = ieee80211_priv(dev); + struct iw_mlme *mlme = (struct iw_mlme *)extra; + u16 reason = cpu_to_le16(mlme->reason_code); + struct ieee80211softmac_network *net; + + if (memcmp(mac->associnfo.bssid, mlme->addr.sa_data, ETH_ALEN)) { + printk(KERN_DEBUG PFX "wx_set_mlme: requested operation on net we don't use\n"); + return -EINVAL; + } + + switch (mlme->cmd) { + case IW_MLME_DEAUTH: + net = ieee80211softmac_get_network_by_bssid_locked(mac, mlme->addr.sa_data); + if (!net) { + printk(KERN_DEBUG PFX "wx_set_mlme: we should know the net here...\n"); + return -EINVAL; + } + return ieee80211softmac_deauth_req(mac, net, reason); + case IW_MLME_DISASSOC: + ieee80211softmac_send_disassoc_req(mac, reason); + return 0; + default: + return -EOPNOTSUPP; + } +} +EXPORT_SYMBOL_GPL(ieee80211softmac_wx_set_mlme); diff --git a/net/ipv4/Kconfig b/net/ipv4/Kconfig index e2c848df6..ff4872242 100644 --- a/net/ipv4/Kconfig +++ b/net/ipv4/Kconfig @@ -414,6 +414,24 @@ config INET_TUNNEL tristate default n +config INET_XFRM_MODE_TRANSPORT + tristate "IP: IPsec transport mode" + default y + select XFRM + ---help--- + Support for IPsec transport mode. + + If unsure, say Y. + +config INET_XFRM_MODE_TUNNEL + tristate "IP: IPsec tunnel mode" + default y + select XFRM + ---help--- + Support for IPsec tunnel mode. + + If unsure, say Y. + config INET_DIAG tristate "INET: socket monitoring interface" default y @@ -532,6 +550,28 @@ config TCP_CONG_SCALABLE properties, though is known to have fairness issues. See http://www-lce.eng.cam.ac.uk/~ctk21/scalable/ +config TCP_CONG_LP + tristate "TCP Low Priority" + depends on EXPERIMENTAL + default n + ---help--- + TCP Low Priority (TCP-LP), a distributed algorithm whose goal is + to utiliza only the excess network bandwidth as compared to the + ``fair share`` of bandwidth as targeted by TCP. + See http://www-ece.rice.edu/networks/TCP-LP/ + +config TCP_CONG_VENO + tristate "TCP Veno" + depends on EXPERIMENTAL + default n + ---help--- + TCP Veno is a sender-side only enhancement of TCP to obtain better + throughput over wireless networks. TCP Veno makes use of state + distinguishing to circumvent the difficult judgment of the packet loss + type. TCP Veno cuts down less congestion window in response to random + loss packets. + See http://www.ntu.edu.sg/home5/ZHOU0022/papers/CPFu03a.pdf + endmenu config TCP_CONG_BIC diff --git a/net/ipv4/Makefile b/net/ipv4/Makefile index 9ef50a0b9..4878fc5be 100644 --- a/net/ipv4/Makefile +++ b/net/ipv4/Makefile @@ -24,6 +24,8 @@ obj-$(CONFIG_INET_ESP) += esp4.o obj-$(CONFIG_INET_IPCOMP) += ipcomp.o obj-$(CONFIG_INET_XFRM_TUNNEL) += xfrm4_tunnel.o obj-$(CONFIG_INET_TUNNEL) += tunnel4.o +obj-$(CONFIG_INET_XFRM_MODE_TRANSPORT) += xfrm4_mode_transport.o +obj-$(CONFIG_INET_XFRM_MODE_TUNNEL) += xfrm4_mode_tunnel.o obj-$(CONFIG_IP_PNP) += ipconfig.o obj-$(CONFIG_IP_ROUTE_MULTIPATH_RR) += multipath_rr.o obj-$(CONFIG_IP_ROUTE_MULTIPATH_RANDOM) += multipath_random.o @@ -34,6 +36,7 @@ obj-$(CONFIG_IP_VS) += ipvs/ 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_NET_TCPPROBE) += tcp_probe.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 @@ -41,7 +44,9 @@ obj-$(CONFIG_TCP_CONG_HSTCP) += tcp_highspeed.o obj-$(CONFIG_TCP_CONG_HYBLA) += tcp_hybla.o obj-$(CONFIG_TCP_CONG_HTCP) += tcp_htcp.o obj-$(CONFIG_TCP_CONG_VEGAS) += tcp_vegas.o +obj-$(CONFIG_TCP_CONG_VENO) += tcp_veno.o obj-$(CONFIG_TCP_CONG_SCALABLE) += tcp_scalable.o +obj-$(CONFIG_TCP_CONG_LP) += tcp_lp.o obj-$(CONFIG_XFRM) += xfrm4_policy.o xfrm4_state.o xfrm4_input.o \ xfrm4_output.o diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 7351fa14d..5537aebec 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c @@ -67,7 +67,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include @@ -1201,7 +1200,15 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb, int features) int ihl; int id; - if (!pskb_may_pull(skb, sizeof(*iph))) + if (unlikely(skb_shinfo(skb)->gso_type & + ~(SKB_GSO_TCPV4 | + SKB_GSO_UDP | + SKB_GSO_DODGY | + SKB_GSO_TCP_ECN | + 0))) + goto out; + + if (unlikely(!pskb_may_pull(skb, sizeof(*iph)))) goto out; iph = skb->nh.iph; @@ -1209,7 +1216,7 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb, int features) if (ihl < sizeof(*iph)) goto out; - if (!pskb_may_pull(skb, ihl)) + if (unlikely(!pskb_may_pull(skb, ihl))) goto out; skb->h.raw = __skb_pull(skb, ihl); @@ -1220,7 +1227,7 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb, int features) rcu_read_lock(); ops = rcu_dereference(inet_protos[proto]); - if (ops && ops->gso_segment) + if (likely(ops && ops->gso_segment)) segs = ops->gso_segment(skb, features); rcu_read_unlock(); diff --git a/net/ipv4/ah4.c b/net/ipv4/ah4.c index e2e4771fa..1366bc6ce 100644 --- a/net/ipv4/ah4.c +++ b/net/ipv4/ah4.c @@ -1,4 +1,3 @@ -#include #include #include #include @@ -119,6 +118,7 @@ error: static int ah_input(struct xfrm_state *x, struct sk_buff *skb) { int ah_hlen; + int ihl; struct iphdr *iph; struct ip_auth_hdr *ah; struct ah_data *ahp; @@ -149,13 +149,14 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb) ah = (struct ip_auth_hdr*)skb->data; iph = skb->nh.iph; - memcpy(work_buf, iph, iph->ihl*4); + ihl = skb->data - skb->nh.raw; + memcpy(work_buf, iph, ihl); iph->ttl = 0; iph->tos = 0; iph->frag_off = 0; iph->check = 0; - if (iph->ihl != 5) { + if (ihl > sizeof(*iph)) { u32 dummy; if (ip_clear_mutable_options(iph, &dummy)) goto out; @@ -164,7 +165,7 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb) u8 auth_data[MAX_AH_AUTH_LEN]; memcpy(auth_data, ah->auth_data, ahp->icv_trunc_len); - skb_push(skb, skb->data - skb->nh.raw); + skb_push(skb, ihl); ahp->icv(ahp, skb, ah->auth_data); if (memcmp(ah->auth_data, auth_data, ahp->icv_trunc_len)) { x->stats.integrity_failed++; @@ -172,11 +173,8 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb) } } ((struct iphdr*)work_buf)->protocol = ah->nexthdr; - skb->nh.raw = skb_pull(skb, ah_hlen); - memcpy(skb->nh.raw, work_buf, iph->ihl*4); - skb->nh.iph->tot_len = htons(skb->len); - skb_pull(skb, skb->nh.iph->ihl*4); - skb->h.raw = skb->data; + skb->h.raw = memcpy(skb->nh.raw += ah_hlen, work_buf, ihl); + __skb_pull(skb, ah_hlen + ihl); return 0; @@ -217,12 +215,10 @@ static int ah_init_state(struct xfrm_state *x) if (x->encap) goto error; - ahp = kmalloc(sizeof(*ahp), GFP_KERNEL); + ahp = kzalloc(sizeof(*ahp), GFP_KERNEL); if (ahp == NULL) return -ENOMEM; - memset(ahp, 0, sizeof(*ahp)); - ahp->key = x->aalg->alg_key; ahp->key_len = (x->aalg->alg_key_len+7)/8; ahp->tfm = crypto_alloc_tfm(x->aalg->alg_name, 0); diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index 4749d504c..c8a3723bc 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c @@ -80,7 +80,6 @@ #include #include #include -#include #include #include #include @@ -1373,12 +1372,11 @@ static int arp_seq_open(struct inode *inode, struct file *file) { struct seq_file *seq; int rc = -ENOMEM; - struct neigh_seq_state *s = kmalloc(sizeof(*s), GFP_KERNEL); + struct neigh_seq_state *s = kzalloc(sizeof(*s), GFP_KERNEL); if (!s) goto out; - memset(s, 0, sizeof(*s)); rc = seq_open(file, &arp_seq_ops); if (rc) goto out_kfree; diff --git a/net/ipv4/datagram.c b/net/ipv4/datagram.c index b1db561f2..ec5da4fbd 100644 --- a/net/ipv4/datagram.c +++ b/net/ipv4/datagram.c @@ -11,14 +11,14 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include #include +#include #include -#include #include +#include int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) { diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index f7b5ddd6e..dc62b7816 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c @@ -27,7 +27,6 @@ * if no match found. */ -#include #include #include @@ -94,10 +93,9 @@ static void devinet_sysctl_unregister(struct ipv4_devconf *p); static struct in_ifaddr *inet_alloc_ifa(void) { - struct in_ifaddr *ifa = kmalloc(sizeof(*ifa), GFP_KERNEL); + struct in_ifaddr *ifa = kzalloc(sizeof(*ifa), GFP_KERNEL); if (ifa) { - memset(ifa, 0, sizeof(*ifa)); INIT_RCU_HEAD(&ifa->rcu_head); } @@ -141,10 +139,9 @@ struct in_device *inetdev_init(struct net_device *dev) ASSERT_RTNL(); - in_dev = kmalloc(sizeof(*in_dev), GFP_KERNEL); + in_dev = kzalloc(sizeof(*in_dev), GFP_KERNEL); if (!in_dev) goto out; - memset(in_dev, 0, sizeof(*in_dev)); INIT_RCU_HEAD(&in_dev->rcu_head); memcpy(&in_dev->cnf, &ipv4_devconf_dflt, sizeof(in_dev->cnf)); in_dev->cnf.sysctl = NULL; diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c index 9d1881c07..fc2f8ce44 100644 --- a/net/ipv4/esp4.c +++ b/net/ipv4/esp4.c @@ -1,4 +1,3 @@ -#include #include #include #include @@ -143,10 +142,9 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb) int alen = esp->auth.icv_trunc_len; int elen = skb->len - sizeof(struct ip_esp_hdr) - esp->conf.ivlen - alen; int nfrags; - int encap_len = 0; + int ihl; u8 nexthdr[2]; struct scatterlist *sg; - u8 workbuf[60]; int padlen; if (!pskb_may_pull(skb, sizeof(struct ip_esp_hdr))) @@ -177,7 +175,6 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb) skb->ip_summed = CHECKSUM_NONE; esph = (struct ip_esp_hdr*)skb->data; - iph = skb->nh.iph; /* Get ivec. This can be wrong, check against another impls. */ if (esp->conf.ivlen) @@ -204,12 +201,12 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb) /* ... check padding bits here. Silly. :-) */ + iph = skb->nh.iph; + ihl = iph->ihl * 4; + if (x->encap) { struct xfrm_encap_tmpl *encap = x->encap; - struct udphdr *uh; - - uh = (struct udphdr *)(iph + 1); - encap_len = (void*)esph - (void*)uh; + struct udphdr *uh = (void *)(skb->nh.raw + ihl); /* * 1) if the NAT-T peer's IP or port changed then @@ -246,11 +243,7 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb) iph->protocol = nexthdr[1]; pskb_trim(skb, skb->len - alen - padlen - 2); - memcpy(workbuf, skb->nh.raw, iph->ihl*4); - skb->h.raw = skb_pull(skb, sizeof(struct ip_esp_hdr) + esp->conf.ivlen); - skb->nh.raw += encap_len + sizeof(struct ip_esp_hdr) + esp->conf.ivlen; - memcpy(skb->nh.raw, workbuf, iph->ihl*4); - skb->nh.iph->tot_len = htons(skb->len); + skb->h.raw = __skb_pull(skb, sizeof(*esph) + esp->conf.ivlen) - ihl; return 0; @@ -323,12 +316,10 @@ static int esp_init_state(struct xfrm_state *x) if (x->ealg == NULL) goto error; - esp = kmalloc(sizeof(*esp), GFP_KERNEL); + esp = kzalloc(sizeof(*esp), GFP_KERNEL); if (esp == NULL) return -ENOMEM; - memset(esp, 0, sizeof(*esp)); - if (x->aalg) { struct xfrm_algo_desc *aalg_desc; diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c index cdde96390..ba2a70745 100644 --- a/net/ipv4/fib_frontend.c +++ b/net/ipv4/fib_frontend.c @@ -15,7 +15,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include @@ -666,3 +665,4 @@ void __init ip_fib_init(void) } EXPORT_SYMBOL(inet_addr_type); +EXPORT_SYMBOL(ip_dev_find); diff --git a/net/ipv4/fib_hash.c b/net/ipv4/fib_hash.c index c9b54bbea..6350e2974 100644 --- a/net/ipv4/fib_hash.c +++ b/net/ipv4/fib_hash.c @@ -15,7 +15,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include @@ -205,11 +204,10 @@ static struct fn_zone * fn_new_zone(struct fn_hash *table, int z) { int i; - struct fn_zone *fz = kmalloc(sizeof(struct fn_zone), GFP_KERNEL); + struct fn_zone *fz = kzalloc(sizeof(struct fn_zone), GFP_KERNEL); if (!fz) return NULL; - memset(fz, 0, sizeof(struct fn_zone)); if (z) { fz->fz_divisor = 16; } else { @@ -1050,7 +1048,7 @@ static int fib_seq_open(struct inode *inode, struct file *file) { struct seq_file *seq; int rc = -ENOMEM; - struct fib_iter_state *s = kmalloc(sizeof(*s), GFP_KERNEL); + struct fib_iter_state *s = kzalloc(sizeof(*s), GFP_KERNEL); if (!s) goto out; @@ -1061,7 +1059,6 @@ static int fib_seq_open(struct inode *inode, struct file *file) seq = file->private_data; seq->private = s; - memset(s, 0, sizeof(*s)); out: return rc; out_kfree: diff --git a/net/ipv4/fib_rules.c b/net/ipv4/fib_rules.c index a66c96a25..79b04718b 100644 --- a/net/ipv4/fib_rules.c +++ b/net/ipv4/fib_rules.c @@ -19,7 +19,6 @@ * Marc Boucher : routing by fwmark */ -#include #include #include #include @@ -197,10 +196,9 @@ int inet_rtm_newrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) } } - new_r = kmalloc(sizeof(*new_r), GFP_KERNEL); + new_r = kzalloc(sizeof(*new_r), GFP_KERNEL); if (!new_r) return -ENOMEM; - memset(new_r, 0, sizeof(*new_r)); if (rta[RTA_SRC-1]) memcpy(&new_r->r_src, RTA_DATA(rta[RTA_SRC-1]), 4); diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c index 1de08c186..51738000f 100644 --- a/net/ipv4/fib_semantics.c +++ b/net/ipv4/fib_semantics.c @@ -15,7 +15,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include @@ -710,11 +709,10 @@ fib_create_info(const struct rtmsg *r, struct kern_rta *rta, goto failure; } - fi = kmalloc(sizeof(*fi)+nhs*sizeof(struct fib_nh), GFP_KERNEL); + fi = kzalloc(sizeof(*fi)+nhs*sizeof(struct fib_nh), GFP_KERNEL); if (fi == NULL) goto failure; fib_info_cnt++; - memset(fi, 0, sizeof(*fi)+nhs*sizeof(struct fib_nh)); fi->fib_protocol = r->rtm_protocol; @@ -963,10 +961,6 @@ fib_dump_info(struct sk_buff *skb, u32 pid, u32 seq, int event, rtm->rtm_protocol = fi->fib_protocol; if (fi->fib_priority) RTA_PUT(skb, RTA_PRIORITY, 4, &fi->fib_priority); -#ifdef CONFIG_NET_CLS_ROUTE - if (fi->fib_nh[0].nh_tclassid) - RTA_PUT(skb, RTA_FLOW, 4, &fi->fib_nh[0].nh_tclassid); -#endif if (rtnetlink_put_metrics(skb, fi->fib_metrics) < 0) goto rtattr_failure; if (fi->fib_prefsrc) @@ -976,6 +970,10 @@ fib_dump_info(struct sk_buff *skb, u32 pid, u32 seq, int event, RTA_PUT(skb, RTA_GATEWAY, 4, &fi->fib_nh->nh_gw); if (fi->fib_nh->nh_oif) RTA_PUT(skb, RTA_OIF, sizeof(int), &fi->fib_nh->nh_oif); +#ifdef CONFIG_NET_CLS_ROUTE + if (fi->fib_nh[0].nh_tclassid) + RTA_PUT(skb, RTA_FLOW, 4, &fi->fib_nh[0].nh_tclassid); +#endif } #ifdef CONFIG_IP_ROUTE_MULTIPATH if (fi->fib_nhs > 1) { @@ -994,6 +992,10 @@ fib_dump_info(struct sk_buff *skb, u32 pid, u32 seq, int event, nhp->rtnh_ifindex = nh->nh_oif; if (nh->nh_gw) RTA_PUT(skb, RTA_GATEWAY, 4, &nh->nh_gw); +#ifdef CONFIG_NET_CLS_ROUTE + if (nh->nh_tclassid) + RTA_PUT(skb, RTA_FLOW, 4, &nh->nh_tclassid); +#endif nhp->rtnh_len = skb->tail - (unsigned char*)nhp; } endfor_nexthops(fi); mp_head->rta_type = RTA_MULTIPATH; diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index 95a639f2e..01801c0f8 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c @@ -52,7 +52,6 @@ #define VERSION "0.407" -#include #include #include #include @@ -1253,8 +1252,8 @@ fn_trie_insert(struct fib_table *tb, struct rtmsg *r, struct kern_rta *rta, */ if (!fa_head) { - fa_head = fib_insert_node(t, &err, key, plen); err = 0; + fa_head = fib_insert_node(t, &err, key, plen); if (err) goto out_free_new_fa; } @@ -1282,18 +1281,18 @@ static inline int check_leaf(struct trie *t, struct leaf *l, struct fib_result *res) { int err, i; - t_key mask; + __be32 mask; struct leaf_info *li; struct hlist_head *hhead = &l->list; struct hlist_node *node; hlist_for_each_entry_rcu(li, node, hhead, hlist) { i = li->plen; - mask = ntohl(inet_make_mask(i)); - if (l->key != (key & mask)) + mask = inet_make_mask(i); + if (l->key != (key & ntohl(mask))) continue; - if ((err = fib_semantic_match(&li->falh, flp, res, l->key, mask, i)) <= 0) { + if ((err = fib_semantic_match(&li->falh, flp, res, htonl(l->key), mask, i)) <= 0) { *plen = i; #ifdef CONFIG_IP_FIB_TRIE_STATS t->stats.semantic_match_passed++; diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c index 26a140547..58ad168d5 100644 --- a/net/ipv4/icmp.c +++ b/net/ipv4/icmp.c @@ -64,7 +64,6 @@ * */ -#include #include #include #include @@ -730,7 +729,6 @@ out_err: static void icmp_redirect(struct sk_buff *skb) { struct iphdr *iph; - unsigned long ip; if (skb->len < sizeof(struct iphdr)) goto out_err; @@ -742,7 +740,6 @@ static void icmp_redirect(struct sk_buff *skb) goto out; iph = (struct iphdr *)skb->data; - ip = iph->daddr; switch (skb->h.icmph->code & 7) { case ICMP_REDIR_NET: @@ -752,7 +749,8 @@ static void icmp_redirect(struct sk_buff *skb) */ case ICMP_REDIR_HOST: case ICMP_REDIR_HOSTTOS: - ip_rt_redirect(skb->nh.iph->saddr, ip, skb->h.icmph->un.gateway, + ip_rt_redirect(skb->nh.iph->saddr, iph->daddr, + skb->h.icmph->un.gateway, iph->saddr, skb->dev); break; } diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c index d512239a1..8e8117c19 100644 --- a/net/ipv4/igmp.c +++ b/net/ipv4/igmp.c @@ -72,7 +72,6 @@ * Vinay Kulkarni */ -#include #include #include #include @@ -1029,10 +1028,9 @@ static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im) * for deleted items allows change reports to use common code with * non-deleted or query-response MCA's. */ - pmc = kmalloc(sizeof(*pmc), GFP_KERNEL); + pmc = kzalloc(sizeof(*pmc), GFP_KERNEL); if (!pmc) return; - memset(pmc, 0, sizeof(*pmc)); spin_lock_bh(&im->lock); pmc->interface = im->interface; in_dev_hold(in_dev); @@ -1530,10 +1528,9 @@ static int ip_mc_add1_src(struct ip_mc_list *pmc, int sfmode, psf_prev = psf; } if (!psf) { - psf = kmalloc(sizeof(*psf), GFP_ATOMIC); + psf = kzalloc(sizeof(*psf), GFP_ATOMIC); if (!psf) return -ENOBUFS; - memset(psf, 0, sizeof(*psf)); psf->sf_inaddr = *psfsrc; if (psf_prev) { psf_prev->sf_next = psf; @@ -1796,29 +1793,35 @@ int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr) struct in_device *in_dev; u32 group = imr->imr_multiaddr.s_addr; u32 ifindex; + int ret = -EADDRNOTAVAIL; rtnl_lock(); in_dev = ip_mc_find_dev(imr); - if (!in_dev) { - rtnl_unlock(); - return -ENODEV; - } ifindex = imr->imr_ifindex; for (imlp = &inet->mc_list; (iml = *imlp) != NULL; imlp = &iml->next) { - if (iml->multi.imr_multiaddr.s_addr == group && - iml->multi.imr_ifindex == ifindex) { - (void) ip_mc_leave_src(sk, iml, in_dev); + if (iml->multi.imr_multiaddr.s_addr != group) + continue; + if (ifindex) { + if (iml->multi.imr_ifindex != ifindex) + continue; + } else if (imr->imr_address.s_addr && imr->imr_address.s_addr != + iml->multi.imr_address.s_addr) + continue; + + (void) ip_mc_leave_src(sk, iml, in_dev); - *imlp = iml->next; + *imlp = iml->next; + if (in_dev) ip_mc_dec_group(in_dev, group); - rtnl_unlock(); - sock_kfree_s(sk, iml, sizeof(*iml)); - return 0; - } + rtnl_unlock(); + sock_kfree_s(sk, iml, sizeof(*iml)); + return 0; } + if (!in_dev) + ret = -ENODEV; rtnl_unlock(); - return -EADDRNOTAVAIL; + return ret; } int ip_mc_source(int add, int omode, struct sock *sk, struct @@ -2202,13 +2205,13 @@ void ip_mc_drop_socket(struct sock *sk) struct in_device *in_dev; inet->mc_list = iml->next; - if ((in_dev = inetdev_by_index(iml->multi.imr_ifindex)) != NULL) { - (void) ip_mc_leave_src(sk, iml, in_dev); + in_dev = inetdev_by_index(iml->multi.imr_ifindex); + (void) ip_mc_leave_src(sk, iml, in_dev); + if (in_dev != NULL) { ip_mc_dec_group(in_dev, iml->multi.imr_multiaddr.s_addr); in_dev_put(in_dev); } sock_kfree_s(sk, iml, sizeof(*iml)); - } rtnl_unlock(); } @@ -2361,7 +2364,7 @@ static int igmp_mc_seq_show(struct seq_file *seq, void *v) } seq_printf(seq, - "\t\t\t\t%08lX %5d %d:%08lX\t\t%d\n", + "\t\t\t\t%08X %5d %d:%08lX\t\t%d\n", im->multiaddr, im->users, im->tm_running, im->tm_running ? jiffies_to_clock_t(im->timer.expires-jiffies) : 0, @@ -2381,7 +2384,7 @@ static int igmp_mc_seq_open(struct inode *inode, struct file *file) { struct seq_file *seq; int rc = -ENOMEM; - struct igmp_mc_iter_state *s = kmalloc(sizeof(*s), GFP_KERNEL); + struct igmp_mc_iter_state *s = kzalloc(sizeof(*s), GFP_KERNEL); if (!s) goto out; @@ -2391,7 +2394,6 @@ static int igmp_mc_seq_open(struct inode *inode, struct file *file) seq = file->private_data; seq->private = s; - memset(s, 0, sizeof(*s)); out: return rc; out_kfree: @@ -2556,7 +2558,7 @@ static int igmp_mcf_seq_open(struct inode *inode, struct file *file) { struct seq_file *seq; int rc = -ENOMEM; - struct igmp_mcf_iter_state *s = kmalloc(sizeof(*s), GFP_KERNEL); + struct igmp_mcf_iter_state *s = kzalloc(sizeof(*s), GFP_KERNEL); if (!s) goto out; @@ -2566,7 +2568,6 @@ static int igmp_mcf_seq_open(struct inode *inode, struct file *file) seq = file->private_data; seq->private = s; - memset(s, 0, sizeof(*s)); out: return rc; out_kfree: diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index 826f9744f..7a262aa5d 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c @@ -13,7 +13,6 @@ * 2 of the License, or(at your option) any later version. */ -#include #include #include diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c index 03cfe8fb4..06df7806b 100644 --- a/net/ipv4/inet_diag.c +++ b/net/ipv4/inet_diag.c @@ -11,7 +11,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include @@ -916,11 +915,10 @@ static int __init inet_diag_init(void) sizeof(struct inet_diag_handler *)); int err = -ENOMEM; - inet_diag_table = kmalloc(inet_diag_table_size, GFP_KERNEL); + inet_diag_table = kzalloc(inet_diag_table_size, GFP_KERNEL); if (!inet_diag_table) goto out; - memset(inet_diag_table, 0, inet_diag_table_size); idiagnl = netlink_kernel_create(NETLINK_INET_DIAG, 0, inet_diag_rcv, THIS_MODULE); if (idiagnl == NULL) diff --git a/net/ipv4/inet_hashtables.c b/net/ipv4/inet_hashtables.c index 1de39062d..19829f508 100644 --- a/net/ipv4/inet_hashtables.c +++ b/net/ipv4/inet_hashtables.c @@ -13,7 +13,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include diff --git a/net/ipv4/inet_timewait_sock.c b/net/ipv4/inet_timewait_sock.c index 417f126c7..cdd805344 100644 --- a/net/ipv4/inet_timewait_sock.c +++ b/net/ipv4/inet_timewait_sock.c @@ -8,7 +8,6 @@ * From code orinally in TCP */ -#include #include #include diff --git a/net/ipv4/inetpeer.c b/net/ipv4/inetpeer.c index 2160874ce..03ff62ebc 100644 --- a/net/ipv4/inetpeer.c +++ b/net/ipv4/inetpeer.c @@ -86,7 +86,7 @@ static struct inet_peer *peer_root = peer_avl_empty; static DEFINE_RWLOCK(peer_pool_lock); #define PEER_MAXDEPTH 40 /* sufficient for about 2^27 nodes */ -static volatile int peer_total; +static int peer_total; /* Exported for sysctl_net_ipv4. */ int inet_peer_threshold = 65536 + 128; /* start to throw entries more * aggressively at this stage */ diff --git a/net/ipv4/ip_forward.c b/net/ipv4/ip_forward.c index 9f0bb529a..a22d11d29 100644 --- a/net/ipv4/ip_forward.c +++ b/net/ipv4/ip_forward.c @@ -21,7 +21,6 @@ * Mike McLagan : Routing by source */ -#include #include #include #include diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c index da734c439..b84b53a47 100644 --- a/net/ipv4/ip_fragment.c +++ b/net/ipv4/ip_fragment.c @@ -23,7 +23,6 @@ */ #include -#include #include #include #include diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index ab99bebdc..0f9b3a319 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c @@ -11,7 +11,6 @@ */ #include -#include #include #include #include @@ -618,7 +617,6 @@ 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->h.raw, offset); - memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); skb->pkt_type = PACKET_HOST; #ifdef CONFIG_NET_IPGRE_BROADCAST if (MULTICAST(iph->daddr)) { diff --git a/net/ipv4/ip_input.c b/net/ipv4/ip_input.c index 595d0bfde..b0495c5b6 100644 --- a/net/ipv4/ip_input.c +++ b/net/ipv4/ip_input.c @@ -121,7 +121,6 @@ #include #include #include -#include #include #include @@ -429,6 +428,9 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, goto drop; } + /* Remove any debris in the socket control block */ + memset(IPCB(skb), 0, sizeof(struct inet_skb_parm)); + return NF_HOOK(PF_INET, NF_IP_PRE_ROUTING, skb, dev, NULL, ip_rcv_finish); diff --git a/net/ipv4/ip_options.c b/net/ipv4/ip_options.c index cbcae6544..406056edc 100644 --- a/net/ipv4/ip_options.c +++ b/net/ipv4/ip_options.c @@ -256,7 +256,6 @@ int ip_options_compile(struct ip_options * opt, struct sk_buff * skb) if (!opt) { opt = &(IPCB(skb)->opt); - memset(opt, 0, sizeof(struct ip_options)); iph = skb->nh.raw; opt->optlen = ((struct iphdr *)iph)->ihl*4 - sizeof(struct iphdr); optptr = iph + sizeof(struct iphdr); diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 20b17047c..a2ede167e 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c @@ -53,7 +53,6 @@ #include #include #include -#include #include #include @@ -409,6 +408,7 @@ static void ip_copy_metadata(struct sk_buff *to, struct sk_buff *from) nf_bridge_get(to->nf_bridge); #endif #endif + skb_copy_secmark(to, from); } /* @@ -440,6 +440,7 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*)) iph = skb->nh.iph; if (unlikely((iph->frag_off & htons(IP_DF)) && !skb->local_df)) { + IP_INC_STATS(IPSTATS_MIB_FRAGFAILS); icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(dst_mtu(&rt->u.dst))); kfree_skb(skb); @@ -526,6 +527,8 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*)) err = output(skb); + if (!err) + IP_INC_STATS(IPSTATS_MIB_FRAGCREATES); if (err || !frag) break; @@ -649,9 +652,6 @@ slow_path: /* * Put this fragment into the sending queue. */ - - IP_INC_STATS(IPSTATS_MIB_FRAGCREATES); - iph->tot_len = htons(len + hlen); ip_send_check(iph); @@ -659,6 +659,8 @@ slow_path: err = output(skb2); if (err) goto fail; + + IP_INC_STATS(IPSTATS_MIB_FRAGCREATES); } kfree_skb(skb); IP_INC_STATS(IPSTATS_MIB_FRAGOKS); @@ -743,7 +745,7 @@ static inline int ip_ufo_append_data(struct sock *sk, if (!err) { /* specify the length of each IP datagram fragment*/ skb_shinfo(skb)->gso_size = mtu - fragheaderlen; - skb_shinfo(skb)->gso_type = SKB_GSO_UDPV4; + skb_shinfo(skb)->gso_type = SKB_GSO_UDP; __skb_queue_tail(&sk->sk_write_queue, skb); return 0; @@ -1088,7 +1090,7 @@ ssize_t ip_append_page(struct sock *sk, struct page *page, if ((sk->sk_protocol == IPPROTO_UDP) && (rt->u.dst.dev->features & NETIF_F_UFO)) { skb_shinfo(skb)->gso_size = mtu - fragheaderlen; - skb_shinfo(skb)->gso_type = SKB_GSO_UDPV4; + skb_shinfo(skb)->gso_type = SKB_GSO_UDP; } diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index 12e0bf19f..2d05c4133 100644 --- a/net/ipv4/ip_sockglue.c +++ b/net/ipv4/ip_sockglue.c @@ -17,7 +17,6 @@ * Mike McLagan : Routing by source */ -#include #include #include #include @@ -113,14 +112,19 @@ static void ip_cmsg_recv_retopts(struct msghdr *msg, struct sk_buff *skb) static void ip_cmsg_recv_security(struct msghdr *msg, struct sk_buff *skb) { char *secdata; - u32 seclen; + u32 seclen, secid; int err; - err = security_socket_getpeersec_dgram(skb, &secdata, &seclen); + err = security_socket_getpeersec_dgram(NULL, skb, &secid); + if (err) + return; + + err = security_secid_to_secctx(secid, &secdata, &seclen); if (err) return; put_cmsg(msg, SOL_IP, SCM_SECURITY, seclen, secdata); + security_release_secctx(secdata, seclen); } diff --git a/net/ipv4/ipcomp.c b/net/ipv4/ipcomp.c index 098d103ec..a0c28b2b7 100644 --- a/net/ipv4/ipcomp.c +++ b/net/ipv4/ipcomp.c @@ -13,7 +13,6 @@ * - Compression stats. * - Adaptive compression. */ -#include #include #include #include @@ -45,7 +44,6 @@ static LIST_HEAD(ipcomp_tfms_list); static int ipcomp_decompress(struct xfrm_state *x, struct sk_buff *skb) { int err, plen, dlen; - struct iphdr *iph; struct ipcomp_data *ipcd = x->data; u8 *start, *scratch; struct crypto_tfm *tfm; @@ -72,10 +70,9 @@ static int ipcomp_decompress(struct xfrm_state *x, struct sk_buff *skb) if (err) goto out; - skb_put(skb, dlen - plen); + skb->truesize += dlen - plen; + __skb_put(skb, dlen - plen); memcpy(skb->data, scratch, dlen); - iph = skb->nh.iph; - iph->tot_len = htons(dlen + iph->ihl * 4); out: put_cpu(); return err; @@ -83,14 +80,9 @@ out: static int ipcomp_input(struct xfrm_state *x, struct sk_buff *skb) { - u8 nexthdr; int err = -ENOMEM; struct iphdr *iph; - union { - struct iphdr iph; - char buf[60]; - } tmp_iph; - + struct ip_comp_hdr *ipch; if (skb_linearize_cow(skb)) goto out; @@ -99,15 +91,10 @@ static int ipcomp_input(struct xfrm_state *x, struct sk_buff *skb) /* Remove ipcomp header and decompress original payload */ iph = skb->nh.iph; - memcpy(&tmp_iph, iph, iph->ihl * 4); - nexthdr = *(u8 *)skb->data; - skb_pull(skb, sizeof(struct ip_comp_hdr)); - skb->nh.raw += sizeof(struct ip_comp_hdr); - memcpy(skb->nh.raw, &tmp_iph, tmp_iph.iph.ihl * 4); - iph = skb->nh.iph; - iph->tot_len = htons(ntohs(iph->tot_len) - sizeof(struct ip_comp_hdr)); - iph->protocol = nexthdr; - skb->h.raw = skb->data; + ipch = (void *)skb->data; + iph->protocol = ipch->nexthdr; + skb->h.raw = skb->nh.raw + sizeof(*ipch); + __skb_pull(skb, sizeof(*ipch)); err = ipcomp_decompress(x, skb); out: @@ -423,11 +410,10 @@ static int ipcomp_init_state(struct xfrm_state *x) goto out; err = -ENOMEM; - ipcd = kmalloc(sizeof(*ipcd), GFP_KERNEL); + ipcd = kzalloc(sizeof(*ipcd), GFP_KERNEL); if (!ipcd) goto out; - memset(ipcd, 0, sizeof(*ipcd)); x->props.header_len = 0; if (x->props.mode) x->props.header_len += sizeof(struct iphdr); diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c index cb8a92f18..1fbb38415 100644 --- a/net/ipv4/ipconfig.c +++ b/net/ipv4/ipconfig.c @@ -31,7 +31,6 @@ * -- Josef Siemes , Aug 2002 */ -#include #include #include #include diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c index ea398ee43..76ab50b0d 100644 --- a/net/ipv4/ipip.c +++ b/net/ipv4/ipip.c @@ -94,7 +94,6 @@ #include -#include #include #include #include @@ -488,7 +487,6 @@ static int ipip_rcv(struct sk_buff *skb) skb->mac.raw = skb->nh.raw; skb->nh.raw = skb->data; - memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); skb->protocol = htons(ETH_P_IP); skb->pkt_type = PACKET_HOST; diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 717ab7d6d..85893eef6 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c @@ -28,7 +28,6 @@ * */ -#include #include #include #include @@ -1462,7 +1461,6 @@ int pim_rcv_v1(struct sk_buff * skb) skb_pull(skb, (u8*)encap - skb->data); skb->nh.iph = (struct iphdr *)skb->data; skb->dev = reg_dev; - memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); skb->protocol = htons(ETH_P_IP); skb->ip_summed = 0; skb->pkt_type = PACKET_HOST; @@ -1518,7 +1516,6 @@ static int pim_rcv(struct sk_buff * skb) skb_pull(skb, (u8*)encap - skb->data); skb->nh.iph = (struct iphdr *)skb->data; skb->dev = reg_dev; - memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); skb->protocol = htons(ETH_P_IP); skb->ip_summed = 0; skb->pkt_type = PACKET_HOST; @@ -1581,6 +1578,7 @@ int ipmr_get_route(struct sk_buff *skb, struct rtmsg *rtm, int nowait) cache = ipmr_cache_find(rt->rt_src, rt->rt_dst); if (cache==NULL) { + struct sk_buff *skb2; struct net_device *dev; int vif; @@ -1594,12 +1592,18 @@ int ipmr_get_route(struct sk_buff *skb, struct rtmsg *rtm, int nowait) read_unlock(&mrt_lock); return -ENODEV; } - skb->nh.raw = skb_push(skb, sizeof(struct iphdr)); - skb->nh.iph->ihl = sizeof(struct iphdr)>>2; - skb->nh.iph->saddr = rt->rt_src; - skb->nh.iph->daddr = rt->rt_dst; - skb->nh.iph->version = 0; - err = ipmr_cache_unresolved(vif, skb); + skb2 = skb_clone(skb, GFP_ATOMIC); + if (!skb2) { + read_unlock(&mrt_lock); + return -ENOMEM; + } + + skb2->nh.raw = skb_push(skb2, sizeof(struct iphdr)); + skb2->nh.iph->ihl = sizeof(struct iphdr)>>2; + skb2->nh.iph->saddr = rt->rt_src; + skb2->nh.iph->daddr = rt->rt_dst; + skb2->nh.iph->version = 0; + err = ipmr_cache_unresolved(vif, skb2); read_unlock(&mrt_lock); return err; } diff --git a/net/ipv4/ipvs/ip_vs_ctl.c b/net/ipv4/ipvs/ip_vs_ctl.c index f28ec6882..6a28fafe9 100644 --- a/net/ipv4/ipvs/ip_vs_ctl.c +++ b/net/ipv4/ipvs/ip_vs_ctl.c @@ -735,12 +735,11 @@ ip_vs_new_dest(struct ip_vs_service *svc, struct ip_vs_dest_user *udest, if (atype != RTN_LOCAL && atype != RTN_UNICAST) return -EINVAL; - dest = kmalloc(sizeof(struct ip_vs_dest), GFP_ATOMIC); + dest = kzalloc(sizeof(struct ip_vs_dest), GFP_ATOMIC); if (dest == NULL) { IP_VS_ERR("ip_vs_new_dest: kmalloc failed.\n"); return -ENOMEM; } - memset(dest, 0, sizeof(struct ip_vs_dest)); dest->protocol = svc->protocol; dest->vaddr = svc->addr; @@ -1050,14 +1049,12 @@ ip_vs_add_service(struct ip_vs_service_user *u, struct ip_vs_service **svc_p) goto out_mod_dec; } - svc = (struct ip_vs_service *) - kmalloc(sizeof(struct ip_vs_service), GFP_ATOMIC); + svc = kzalloc(sizeof(struct ip_vs_service), GFP_ATOMIC); if (svc == NULL) { IP_VS_DBG(1, "ip_vs_add_service: kmalloc failed.\n"); ret = -ENOMEM; goto out_err; } - memset(svc, 0, sizeof(struct ip_vs_service)); /* I'm the first user of the service */ atomic_set(&svc->usecnt, 1); @@ -1797,7 +1794,7 @@ static int ip_vs_info_open(struct inode *inode, struct file *file) { struct seq_file *seq; int rc = -ENOMEM; - struct ip_vs_iter *s = kmalloc(sizeof(*s), GFP_KERNEL); + struct ip_vs_iter *s = kzalloc(sizeof(*s), GFP_KERNEL); if (!s) goto out; @@ -1808,7 +1805,6 @@ static int ip_vs_info_open(struct inode *inode, struct file *file) seq = file->private_data; seq->private = s; - memset(s, 0, sizeof(*s)); out: return rc; out_kfree: diff --git a/net/ipv4/ipvs/ip_vs_est.c b/net/ipv4/ipvs/ip_vs_est.c index c453e1e57..7d68b80c4 100644 --- a/net/ipv4/ipvs/ip_vs_est.c +++ b/net/ipv4/ipvs/ip_vs_est.c @@ -13,7 +13,6 @@ * Changes: * */ -#include #include #include #include @@ -124,11 +123,10 @@ int ip_vs_new_estimator(struct ip_vs_stats *stats) { struct ip_vs_estimator *est; - est = kmalloc(sizeof(*est), GFP_KERNEL); + est = kzalloc(sizeof(*est), GFP_KERNEL); if (est == NULL) return -ENOMEM; - memset(est, 0, sizeof(*est)); est->stats = stats; est->last_conns = stats->conns; est->cps = stats->cps<<10; diff --git a/net/ipv4/ipvs/ip_vs_ftp.c b/net/ipv4/ipvs/ip_vs_ftp.c index a19a33ceb..37fafb1fb 100644 --- a/net/ipv4/ipvs/ip_vs_ftp.c +++ b/net/ipv4/ipvs/ip_vs_ftp.c @@ -46,14 +46,7 @@ */ static int ports[IP_VS_APP_MAX_PORTS] = {21, 0}; module_param_array(ports, int, NULL, 0); - -/* - * Debug level - */ -#ifdef CONFIG_IP_VS_DEBUG -static int debug=0; -module_param(debug, int, 0); -#endif +MODULE_PARM_DESC(ports, "Ports to monitor for FTP control commands"); /* Dummy variable */ @@ -177,7 +170,7 @@ static int ip_vs_ftp_out(struct ip_vs_app *app, struct ip_vs_conn *cp, &start, &end) != 1) return 1; - IP_VS_DBG(1-debug, "PASV response (%u.%u.%u.%u:%d) -> " + IP_VS_DBG(7, "PASV response (%u.%u.%u.%u:%d) -> " "%u.%u.%u.%u:%d detected\n", NIPQUAD(from), ntohs(port), NIPQUAD(cp->caddr), 0); @@ -280,7 +273,7 @@ static int ip_vs_ftp_in(struct ip_vs_app *app, struct ip_vs_conn *cp, while (data <= data_limit - 6) { if (strnicmp(data, "PASV\r\n", 6) == 0) { /* Passive mode on */ - IP_VS_DBG(1-debug, "got PASV at %zd of %zd\n", + IP_VS_DBG(7, "got PASV at %zd of %zd\n", data - data_start, data_limit - data_start); cp->app_data = &ip_vs_ftp_pasv; @@ -302,7 +295,7 @@ static int ip_vs_ftp_in(struct ip_vs_app *app, struct ip_vs_conn *cp, &start, &end) != 1) return 1; - IP_VS_DBG(1-debug, "PORT %u.%u.%u.%u:%d detected\n", + IP_VS_DBG(7, "PORT %u.%u.%u.%u:%d detected\n", NIPQUAD(to), ntohs(port)); /* Passive mode off */ @@ -311,7 +304,7 @@ static int ip_vs_ftp_in(struct ip_vs_app *app, struct ip_vs_conn *cp, /* * Now update or create a connection entry for it */ - IP_VS_DBG(1-debug, "protocol %s %u.%u.%u.%u:%d %u.%u.%u.%u:%d\n", + IP_VS_DBG(7, "protocol %s %u.%u.%u.%u:%d %u.%u.%u.%u:%d\n", ip_vs_proto_name(iph->protocol), NIPQUAD(to), ntohs(port), NIPQUAD(cp->vaddr), 0); @@ -372,11 +365,17 @@ static int __init ip_vs_ftp_init(void) for (i=0; i 0xffff) { + IP_VS_WARNING("ip_vs_ftp: Ignoring invalid " + "configuration port[%d] = %d\n", + i, ports[i]); + continue; + } ret = register_ip_vs_app_inc(app, app->protocol, ports[i]); if (ret) break; - IP_VS_DBG(1-debug, "%s: loaded support on port[%d] = %d\n", - app->name, i, ports[i]); + IP_VS_INFO("%s: loaded support on port[%d] = %d\n", + app->name, i, ports[i]); } if (ret) diff --git a/net/ipv4/ipvs/ip_vs_sync.c b/net/ipv4/ipvs/ip_vs_sync.c index 1bca714bd..b05034945 100644 --- a/net/ipv4/ipvs/ip_vs_sync.c +++ b/net/ipv4/ipvs/ip_vs_sync.c @@ -836,7 +836,7 @@ static int fork_sync_thread(void *startup) int start_sync_thread(int state, char *mcast_ifn, __u8 syncid) { - DECLARE_COMPLETION(startup); + DECLARE_COMPLETION_ONSTACK(startup); pid_t pid; if ((state == IP_VS_STATE_MASTER && sync_master_pid) || diff --git a/net/ipv4/multipath_drr.c b/net/ipv4/multipath_drr.c index c9cf87260..252e837b1 100644 --- a/net/ipv4/multipath_drr.c +++ b/net/ipv4/multipath_drr.c @@ -12,7 +12,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include @@ -107,7 +106,7 @@ static int drr_dev_event(struct notifier_block *this, return NOTIFY_DONE; } -struct notifier_block drr_dev_notifier = { +static struct notifier_block drr_dev_notifier = { .notifier_call = drr_dev_event, }; diff --git a/net/ipv4/multipath_random.c b/net/ipv4/multipath_random.c index 5249dbe7c..b8c289f24 100644 --- a/net/ipv4/multipath_random.c +++ b/net/ipv4/multipath_random.c @@ -12,7 +12,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include diff --git a/net/ipv4/multipath_rr.c b/net/ipv4/multipath_rr.c index b6cd28704..bba5abe55 100644 --- a/net/ipv4/multipath_rr.c +++ b/net/ipv4/multipath_rr.c @@ -12,7 +12,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include diff --git a/net/ipv4/multipath_wrandom.c b/net/ipv4/multipath_wrandom.c index bd7d75b6a..d25ec4ae0 100644 --- a/net/ipv4/multipath_wrandom.c +++ b/net/ipv4/multipath_wrandom.c @@ -12,7 +12,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include @@ -207,16 +206,12 @@ static void wrandom_select_route(const struct flowi *flp, decision = mpc->rt; last_power = mpc->power; - if (last_mpc) - kfree(last_mpc); - + kfree(last_mpc); last_mpc = mpc; } - if (last_mpc) { - /* concurrent __multipath_flush may lead to !last_mpc */ - kfree(last_mpc); - } + /* concurrent __multipath_flush may lead to !last_mpc */ + kfree(last_mpc); decision->u.dst.__use++; *rp = decision; @@ -232,7 +227,7 @@ static void wrandom_set_nhinfo(__u32 network, struct multipath_dest *d, *target_dest = NULL; /* store the weight information for a certain route */ - spin_lock(&state[state_idx].lock); + spin_lock_bh(&state[state_idx].lock); /* find state entry for gateway or add one if necessary */ list_for_each_entry_rcu(r, &state[state_idx].head, list) { @@ -280,7 +275,7 @@ static void wrandom_set_nhinfo(__u32 network, * we are finished */ - spin_unlock(&state[state_idx].lock); + spin_unlock_bh(&state[state_idx].lock); } static void __multipath_free(struct rcu_head *head) @@ -306,7 +301,7 @@ static void wrandom_flush(void) for (i = 0; i < MULTIPATH_STATE_SIZE; ++i) { struct multipath_route *r; - spin_lock(&state[i].lock); + spin_lock_bh(&state[i].lock); list_for_each_entry_rcu(r, &state[i].head, list) { struct multipath_dest *d; list_for_each_entry_rcu(d, &r->dests, list) { @@ -319,7 +314,7 @@ static void wrandom_flush(void) __multipath_free); } - spin_unlock(&state[i].lock); + spin_unlock_bh(&state[i].lock); } } diff --git a/net/ipv4/netfilter/Kconfig b/net/ipv4/netfilter/Kconfig index 5da114edf..a43ed1aee 100644 --- a/net/ipv4/netfilter/Kconfig +++ b/net/ipv4/netfilter/Kconfig @@ -55,6 +55,18 @@ config IP_NF_CONNTRACK_MARK of packets, but this mark value is kept in the conntrack session instead of the individual packets. +config IP_NF_CONNTRACK_SECMARK + bool 'Connection tracking security mark support' + depends on IP_NF_CONNTRACK && NETWORK_SECMARK + help + This option enables security markings to be applied to + connections. Typically they are copied to connections from + packets using the CONNSECMARK target and copied back from + connections to packets with the same target, with the packets + being originally labeled via SECMARK. + + If unsure, say 'N'. + config IP_NF_CONNTRACK_EVENTS bool "Connection tracking events (EXPERIMENTAL)" depends on EXPERIMENTAL && IP_NF_CONNTRACK @@ -142,6 +154,8 @@ config IP_NF_TFTP config IP_NF_AMANDA tristate "Amanda backup protocol support" depends on IP_NF_CONNTRACK + select TEXTSEARCH + select TEXTSEARCH_KMP help If you are running the Amanda backup package on this machine or machines that will be MASQUERADED through this @@ -181,14 +195,26 @@ config IP_NF_H323 With this module you can support H.323 on a connection tracking/NAT firewall. - This module supports RAS, Fast-start, H.245 tunnelling, RTP/RTCP - and T.120 based data and applications including audio, video, FAX, - chat, whiteboard, file transfer, etc. For more information, please - see http://nath323.sourceforge.net/. + This module supports RAS, Fast Start, H.245 Tunnelling, Call + Forwarding, RTP/RTCP and T.120 based audio, video, fax, chat, + whiteboard, file transfer, etc. For more information, please + visit http://nath323.sourceforge.net/. If you want to compile it as a module, say 'M' here and read Documentation/modules.txt. If unsure, say 'N'. +config IP_NF_SIP + tristate "SIP protocol support (EXPERIMENTAL)" + depends on IP_NF_CONNTRACK && EXPERIMENTAL + help + SIP is an application-layer control protocol that can establish, + modify, and terminate multimedia sessions (conferences) such as + Internet telephony calls. With the ip_conntrack_sip and + the ip_nat_sip modules you can support the protocol on a connection + tracking/NATing firewall. + + To compile it as a module, choose M here. If unsure, say Y. + config IP_NF_QUEUE tristate "IP Userspace queueing via NETLINK (OBSOLETE)" help @@ -306,7 +332,7 @@ config IP_NF_MATCH_HASHLIMIT help This option adds a new iptables `hashlimit' match. - As opposed to `limit', this match dynamically crates a hash table + As opposed to `limit', this match dynamically creates a hash table of limit buckets, based on your selection of source/destination ip addresses and/or ports. @@ -501,6 +527,12 @@ config IP_NF_NAT_H323 default IP_NF_NAT if IP_NF_H323=y default m if IP_NF_H323=m +config IP_NF_NAT_SIP + tristate + depends on IP_NF_IPTABLES!=n && IP_NF_CONNTRACK!=n && IP_NF_NAT!=n + default IP_NF_NAT if IP_NF_SIP=y + default m if IP_NF_SIP=m + # mangle + specific targets config IP_NF_MANGLE tristate "Packet mangling" diff --git a/net/ipv4/netfilter/Makefile b/net/ipv4/netfilter/Makefile index 751fe0ce2..943e54f12 100644 --- a/net/ipv4/netfilter/Makefile +++ b/net/ipv4/netfilter/Makefile @@ -31,6 +31,7 @@ obj-$(CONFIG_IP_NF_AMANDA) += ip_conntrack_amanda.o obj-$(CONFIG_IP_NF_TFTP) += ip_conntrack_tftp.o obj-$(CONFIG_IP_NF_FTP) += ip_conntrack_ftp.o obj-$(CONFIG_IP_NF_IRC) += ip_conntrack_irc.o +obj-$(CONFIG_IP_NF_SIP) += ip_conntrack_sip.o obj-$(CONFIG_IP_NF_NETBIOS_NS) += ip_conntrack_netbios_ns.o # NAT helpers @@ -40,6 +41,7 @@ obj-$(CONFIG_IP_NF_NAT_AMANDA) += ip_nat_amanda.o obj-$(CONFIG_IP_NF_NAT_TFTP) += ip_nat_tftp.o obj-$(CONFIG_IP_NF_NAT_FTP) += ip_nat_ftp.o obj-$(CONFIG_IP_NF_NAT_IRC) += ip_nat_irc.o +obj-$(CONFIG_IP_NF_NAT_SIP) += ip_nat_sip.o # generic IP tables obj-$(CONFIG_IP_NF_IPTABLES) += ip_tables.o diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c index 92adfebec..8d1d7a6e7 100644 --- a/net/ipv4/netfilter/arp_tables.c +++ b/net/ipv4/netfilter/arp_tables.c @@ -9,7 +9,6 @@ * */ -#include #include #include #include @@ -1121,7 +1120,8 @@ int arpt_register_table(struct arpt_table *table, return ret; } - if (xt_register_table(table, &bootstrap, newinfo) != 0) { + ret = xt_register_table(table, &bootstrap, newinfo); + if (ret != 0) { xt_free_table_info(newinfo); return ret; } @@ -1171,21 +1171,34 @@ static int __init arp_tables_init(void) { int ret; - xt_proto_init(NF_ARP); + ret = xt_proto_init(NF_ARP); + if (ret < 0) + goto err1; /* Noone else will be downing sem now, so we won't sleep */ - xt_register_target(&arpt_standard_target); - xt_register_target(&arpt_error_target); + ret = xt_register_target(&arpt_standard_target); + if (ret < 0) + goto err2; + ret = xt_register_target(&arpt_error_target); + if (ret < 0) + goto err3; /* Register setsockopt */ ret = nf_register_sockopt(&arpt_sockopts); - if (ret < 0) { - duprintf("Unable to register sockopts.\n"); - return ret; - } + if (ret < 0) + goto err4; printk("arp_tables: (C) 2002 David S. Miller\n"); return 0; + +err4: + xt_unregister_target(&arpt_error_target); +err3: + xt_unregister_target(&arpt_standard_target); +err2: + xt_proto_fini(NF_ARP); +err1: + return ret; } static void __exit arp_tables_fini(void) diff --git a/net/ipv4/netfilter/ip_conntrack_amanda.c b/net/ipv4/netfilter/ip_conntrack_amanda.c index a604b1ccf..0a7bd7f04 100644 --- a/net/ipv4/netfilter/ip_conntrack_amanda.c +++ b/net/ipv4/netfilter/ip_conntrack_amanda.c @@ -17,33 +17,29 @@ * this value. * */ - -#include #include #include -#include -#include #include +#include +#include +#include +#include #include -#include -#include +#include #include #include static unsigned int master_timeout = 300; +static char *ts_algo = "kmp"; MODULE_AUTHOR("Brian J. Murrell "); MODULE_DESCRIPTION("Amanda connection tracking module"); MODULE_LICENSE("GPL"); module_param(master_timeout, uint, 0600); MODULE_PARM_DESC(master_timeout, "timeout for the master connection"); - -static const char *conns[] = { "DATA ", "MESG ", "INDEX " }; - -/* This is slow, but it's simple. --RR */ -static char *amanda_buffer; -static DEFINE_SPINLOCK(amanda_buffer_lock); +module_param(ts_algo, charp, 0400); +MODULE_PARM_DESC(ts_algo, "textsearch algorithm to use (default kmp)"); unsigned int (*ip_nat_amanda_hook)(struct sk_buff **pskb, enum ip_conntrack_info ctinfo, @@ -52,12 +48,48 @@ unsigned int (*ip_nat_amanda_hook)(struct sk_buff **pskb, struct ip_conntrack_expect *exp); EXPORT_SYMBOL_GPL(ip_nat_amanda_hook); +enum amanda_strings { + SEARCH_CONNECT, + SEARCH_NEWLINE, + SEARCH_DATA, + SEARCH_MESG, + SEARCH_INDEX, +}; + +static struct { + char *string; + size_t len; + struct ts_config *ts; +} search[] = { + [SEARCH_CONNECT] = { + .string = "CONNECT ", + .len = 8, + }, + [SEARCH_NEWLINE] = { + .string = "\n", + .len = 1, + }, + [SEARCH_DATA] = { + .string = "DATA ", + .len = 5, + }, + [SEARCH_MESG] = { + .string = "MESG ", + .len = 5, + }, + [SEARCH_INDEX] = { + .string = "INDEX ", + .len = 6, + }, +}; + static int help(struct sk_buff **pskb, struct ip_conntrack *ct, enum ip_conntrack_info ctinfo) { + struct ts_state ts; struct ip_conntrack_expect *exp; - char *data, *data_limit, *tmp; - unsigned int dataoff, i; + unsigned int dataoff, start, stop, off, i; + char pbuf[sizeof("65535")], *tmp; u_int16_t port, len; int ret = NF_ACCEPT; @@ -77,29 +109,34 @@ static int help(struct sk_buff **pskb, return NF_ACCEPT; } - spin_lock_bh(&amanda_buffer_lock); - skb_copy_bits(*pskb, dataoff, amanda_buffer, (*pskb)->len - dataoff); - data = amanda_buffer; - data_limit = amanda_buffer + (*pskb)->len - dataoff; - *data_limit = '\0'; - - /* Search for the CONNECT string */ - data = strstr(data, "CONNECT "); - if (!data) + memset(&ts, 0, sizeof(ts)); + start = skb_find_text(*pskb, dataoff, (*pskb)->len, + search[SEARCH_CONNECT].ts, &ts); + if (start == UINT_MAX) goto out; - data += strlen("CONNECT "); + start += dataoff + search[SEARCH_CONNECT].len; - /* Only search first line. */ - if ((tmp = strchr(data, '\n'))) - *tmp = '\0'; + memset(&ts, 0, sizeof(ts)); + stop = skb_find_text(*pskb, start, (*pskb)->len, + search[SEARCH_NEWLINE].ts, &ts); + if (stop == UINT_MAX) + goto out; + stop += start; - for (i = 0; i < ARRAY_SIZE(conns); i++) { - char *match = strstr(data, conns[i]); - if (!match) + for (i = SEARCH_DATA; i <= SEARCH_INDEX; i++) { + memset(&ts, 0, sizeof(ts)); + off = skb_find_text(*pskb, start, stop, search[i].ts, &ts); + if (off == UINT_MAX) continue; - tmp = data = match + strlen(conns[i]); - port = simple_strtoul(data, &data, 10); - len = data - tmp; + off += start + search[i].len; + + len = min_t(unsigned int, sizeof(pbuf) - 1, stop - off); + if (skb_copy_bits(*pskb, off, pbuf, len)) + break; + pbuf[len] = '\0'; + + port = simple_strtoul(pbuf, &tmp, 10); + len = tmp - pbuf; if (port == 0 || len > 5) break; @@ -125,8 +162,7 @@ static int help(struct sk_buff **pskb, exp->mask.dst.u.tcp.port = 0xFFFF; if (ip_nat_amanda_hook) - ret = ip_nat_amanda_hook(pskb, ctinfo, - tmp - amanda_buffer, + ret = ip_nat_amanda_hook(pskb, ctinfo, off - dataoff, len, exp); else if (ip_conntrack_expect_related(exp) != 0) ret = NF_DROP; @@ -134,12 +170,11 @@ static int help(struct sk_buff **pskb, } out: - spin_unlock_bh(&amanda_buffer_lock); return ret; } static struct ip_conntrack_helper amanda_helper = { - .max_expected = ARRAY_SIZE(conns), + .max_expected = 3, .timeout = 180, .me = THIS_MODULE, .help = help, @@ -155,26 +190,36 @@ static struct ip_conntrack_helper amanda_helper = { static void __exit ip_conntrack_amanda_fini(void) { + int i; + ip_conntrack_helper_unregister(&amanda_helper); - kfree(amanda_buffer); + for (i = 0; i < ARRAY_SIZE(search); i++) + textsearch_destroy(search[i].ts); } static int __init ip_conntrack_amanda_init(void) { - int ret; - - amanda_buffer = kmalloc(65536, GFP_KERNEL); - if (!amanda_buffer) - return -ENOMEM; - - ret = ip_conntrack_helper_register(&amanda_helper); - if (ret < 0) { - kfree(amanda_buffer); - return ret; + int ret, i; + + ret = -ENOMEM; + for (i = 0; i < ARRAY_SIZE(search); i++) { + search[i].ts = textsearch_prepare(ts_algo, search[i].string, + search[i].len, + GFP_KERNEL, TS_AUTOLOAD); + if (search[i].ts == NULL) + goto err; } + ret = ip_conntrack_helper_register(&amanda_helper); + if (ret < 0) + goto err; return 0; - +err: + for (; i >= 0; i--) { + if (search[i].ts) + textsearch_destroy(search[i].ts); + } + return ret; } module_init(ip_conntrack_amanda_init); diff --git a/net/ipv4/netfilter/ip_conntrack_core.c b/net/ipv4/netfilter/ip_conntrack_core.c index 444d82571..c58783404 100644 --- a/net/ipv4/netfilter/ip_conntrack_core.c +++ b/net/ipv4/netfilter/ip_conntrack_core.c @@ -17,7 +17,6 @@ * - export ip_conntrack[_expect]_{find_get,put} functions * */ -#include #include #include #include @@ -728,6 +727,9 @@ init_conntrack(struct ip_conntrack_tuple *tuple, defined(CONFIG_IP_NF_TARGET_MASQUERADE_MODULE) /* this is ugly, but there is no other place where to put it */ conntrack->nat.masq_index = exp->master->nat.masq_index; +#endif +#ifdef CONFIG_IP_NF_CONNTRACK_SECMARK + conntrack->secmark = exp->master->secmark; #endif nf_conntrack_get(&conntrack->master->ct_general); CONNTRACK_STAT_INC(expect_new); @@ -1135,6 +1137,12 @@ void __ip_ct_refresh_acct(struct ip_conntrack *ct, write_lock_bh(&ip_conntrack_lock); + /* Only update if this is not a fixed timeout */ + if (test_bit(IPS_FIXED_TIMEOUT_BIT, &ct->status)) { + write_unlock_bh(&ip_conntrack_lock); + return; + } + /* If not in hash table, timer will not be active yet */ if (!is_confirmed(ct)) { ct->timeout.expires = extra_jiffies; diff --git a/net/ipv4/netfilter/ip_conntrack_ftp.c b/net/ipv4/netfilter/ip_conntrack_ftp.c index 3e542bf28..1d18c863f 100644 --- a/net/ipv4/netfilter/ip_conntrack_ftp.c +++ b/net/ipv4/netfilter/ip_conntrack_ftp.c @@ -8,7 +8,6 @@ * published by the Free Software Foundation. */ -#include #include #include #include @@ -56,37 +55,48 @@ 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 const struct ftp_search { - enum ip_conntrack_dir dir; const char *pattern; size_t plen; char skip; char term; enum ip_ct_ftp_type ftptype; int (*getnum)(const char *, size_t, u_int32_t[], char); -} search[] = { - { - IP_CT_DIR_ORIGINAL, - "PORT", sizeof("PORT") - 1, ' ', '\r', - IP_CT_FTP_PORT, - try_rfc959, +} search[IP_CT_DIR_MAX][2] = { + [IP_CT_DIR_ORIGINAL] = { + { + .pattern = "PORT", + .plen = sizeof("PORT") - 1, + .skip = ' ', + .term = '\r', + .ftptype = IP_CT_FTP_PORT, + .getnum = try_rfc959, + }, + { + .pattern = "EPRT", + .plen = sizeof("EPRT") - 1, + .skip = ' ', + .term = '\r', + .ftptype = IP_CT_FTP_EPRT, + .getnum = try_eprt, + }, }, - { - IP_CT_DIR_REPLY, - "227 ", sizeof("227 ") - 1, '(', ')', - IP_CT_FTP_PASV, - try_rfc959, - }, - { - IP_CT_DIR_ORIGINAL, - "EPRT", sizeof("EPRT") - 1, ' ', '\r', - IP_CT_FTP_EPRT, - try_eprt, - }, - { - IP_CT_DIR_REPLY, - "229 ", sizeof("229 ") - 1, '(', ')', - IP_CT_FTP_EPSV, - try_epsv_response, + [IP_CT_DIR_REPLY] = { + { + .pattern = "227 ", + .plen = sizeof("227 ") - 1, + .skip = '(', + .term = ')', + .ftptype = IP_CT_FTP_PASV, + .getnum = try_rfc959, + }, + { + .pattern = "229 ", + .plen = sizeof("229 ") - 1, + .skip = '(', + .term = ')', + .ftptype = IP_CT_FTP_EPSV, + .getnum = try_epsv_response, + }, }, }; @@ -346,17 +356,15 @@ static int help(struct sk_buff **pskb, array[2] = (ntohl(ct->tuplehash[dir].tuple.src.ip) >> 8) & 0xFF; array[3] = ntohl(ct->tuplehash[dir].tuple.src.ip) & 0xFF; - for (i = 0; i < ARRAY_SIZE(search); i++) { - if (search[i].dir != dir) continue; - + for (i = 0; i < ARRAY_SIZE(search[dir]); i++) { found = find_pattern(fb_ptr, (*pskb)->len - dataoff, - search[i].pattern, - search[i].plen, - search[i].skip, - search[i].term, + search[dir][i].pattern, + search[dir][i].plen, + search[dir][i].skip, + search[dir][i].term, &matchoff, &matchlen, array, - search[i].getnum); + search[dir][i].getnum); if (found) break; } if (found == -1) { @@ -366,7 +374,7 @@ static int help(struct sk_buff **pskb, this case. */ if (net_ratelimit()) printk("conntrack_ftp: partial %s %u+%u\n", - search[i].pattern, + search[dir][i].pattern, ntohl(th->seq), datalen); ret = NF_DROP; goto out; @@ -426,7 +434,7 @@ static int help(struct sk_buff **pskb, /* Now, NAT might want to mangle the packet, and register the * (possibly changed) expectation itself. */ if (ip_nat_ftp_hook) - ret = ip_nat_ftp_hook(pskb, ctinfo, search[i].ftptype, + ret = ip_nat_ftp_hook(pskb, ctinfo, search[dir][i].ftptype, matchoff, matchlen, exp, &seq); else { /* Can't expect this? Best to drop packet now. */ diff --git a/net/ipv4/netfilter/ip_conntrack_helper_h323.c b/net/ipv4/netfilter/ip_conntrack_helper_h323.c index 853a3d512..9a39e2969 100644 --- a/net/ipv4/netfilter/ip_conntrack_helper_h323.c +++ b/net/ipv4/netfilter/ip_conntrack_helper_h323.c @@ -11,7 +11,6 @@ * For more information, please see http://nath323.sourceforge.net/ */ -#include #include #include #include @@ -22,6 +21,8 @@ #include #include #include +#include +#include #if 0 #define DEBUGP printk @@ -38,6 +39,12 @@ static int gkrouted_only = 1; module_param(gkrouted_only, int, 0600); MODULE_PARM_DESC(gkrouted_only, "only accept calls from gatekeeper"); +static int callforward_filter = 1; +module_param(callforward_filter, bool, 0600); +MODULE_PARM_DESC(callforward_filter, "only create call forwarding expectations " + "if both endpoints are on different sides " + "(determined by routing information)"); + /* Hooks for NAT */ int (*set_h245_addr_hook) (struct sk_buff ** pskb, unsigned char **data, int dataoff, @@ -77,6 +84,12 @@ int (*nat_h245_hook) (struct sk_buff ** pskb, unsigned char **data, int dataoff, TransportAddress * addr, u_int16_t port, struct ip_conntrack_expect * exp); +int (*nat_callforwarding_hook) (struct sk_buff ** pskb, + struct ip_conntrack * ct, + enum ip_conntrack_info ctinfo, + unsigned char **data, int dataoff, + TransportAddress * addr, u_int16_t port, + struct ip_conntrack_expect * exp); int (*nat_q931_hook) (struct sk_buff ** pskb, struct ip_conntrack * ct, enum ip_conntrack_info ctinfo, @@ -683,6 +696,92 @@ static int expect_h245(struct sk_buff **pskb, struct ip_conntrack *ct, return ret; } +/* Forwarding declaration */ +void ip_conntrack_q931_expect(struct ip_conntrack *new, + struct ip_conntrack_expect *this); + +/****************************************************************************/ +static int expect_callforwarding(struct sk_buff **pskb, + struct ip_conntrack *ct, + enum ip_conntrack_info ctinfo, + unsigned char **data, int dataoff, + TransportAddress * addr) +{ + int dir = CTINFO2DIR(ctinfo); + int ret = 0; + u_int32_t ip; + u_int16_t port; + struct ip_conntrack_expect *exp = NULL; + + /* Read alternativeAddress */ + if (!get_h225_addr(*data, addr, &ip, &port) || port == 0) + return 0; + + /* If the calling party is on the same side of the forward-to party, + * we don't need to track the second call */ + if (callforward_filter) { + struct rtable *rt1, *rt2; + struct flowi fl1 = { + .fl4_dst = ip, + }; + struct flowi fl2 = { + .fl4_dst = ct->tuplehash[!dir].tuple.src.ip, + }; + + if (ip_route_output_key(&rt1, &fl1) == 0) { + if (ip_route_output_key(&rt2, &fl2) == 0) { + if (rt1->rt_gateway == rt2->rt_gateway && + rt1->u.dst.dev == rt2->u.dst.dev) + ret = 1; + dst_release(&rt2->u.dst); + } + dst_release(&rt1->u.dst); + } + if (ret) { + DEBUGP("ip_ct_q931: Call Forwarding not tracked\n"); + return 0; + } + } + + /* Create expect for the second call leg */ + if ((exp = ip_conntrack_expect_alloc(ct)) == NULL) + return -1; + exp->tuple.src.ip = ct->tuplehash[!dir].tuple.src.ip; + exp->tuple.src.u.tcp.port = 0; + exp->tuple.dst.ip = ip; + exp->tuple.dst.u.tcp.port = htons(port); + exp->tuple.dst.protonum = IPPROTO_TCP; + exp->mask.src.ip = 0xFFFFFFFF; + exp->mask.src.u.tcp.port = 0; + exp->mask.dst.ip = 0xFFFFFFFF; + exp->mask.dst.u.tcp.port = 0xFFFF; + exp->mask.dst.protonum = 0xFF; + exp->flags = 0; + + if (ct->tuplehash[dir].tuple.src.ip != + ct->tuplehash[!dir].tuple.dst.ip && nat_callforwarding_hook) { + /* Need NAT */ + ret = nat_callforwarding_hook(pskb, ct, ctinfo, data, dataoff, + addr, port, exp); + } else { /* Conntrack only */ + exp->expectfn = ip_conntrack_q931_expect; + + if (ip_conntrack_expect_related(exp) == 0) { + DEBUGP("ip_ct_q931: expect Call Forwarding " + "%u.%u.%u.%u:%hu->%u.%u.%u.%u:%hu\n", + NIPQUAD(exp->tuple.src.ip), + ntohs(exp->tuple.src.u.tcp.port), + NIPQUAD(exp->tuple.dst.ip), + ntohs(exp->tuple.dst.u.tcp.port)); + } else + ret = -1; + } + + ip_conntrack_expect_put(exp); + + return ret; +} + /****************************************************************************/ static int process_setup(struct sk_buff **pskb, struct ip_conntrack *ct, enum ip_conntrack_info ctinfo, @@ -878,6 +977,15 @@ static int process_facility(struct sk_buff **pskb, struct ip_conntrack *ct, DEBUGP("ip_ct_q931: Facility\n"); + if (facility->reason.choice == eFacilityReason_callForwarded) { + if (facility->options & eFacility_UUIE_alternativeAddress) + return expect_callforwarding(pskb, ct, ctinfo, data, + dataoff, + &facility-> + alternativeAddress); + return 0; + } + if (facility->options & eFacility_UUIE_h245Address) { ret = expect_h245(pskb, ct, ctinfo, data, dataoff, &facility->h245Address); @@ -1677,7 +1785,6 @@ static int __init init(void) fini(); return ret; } - DEBUGP("ip_ct_h323: init success\n"); return 0; } @@ -1696,6 +1803,7 @@ EXPORT_SYMBOL_GPL(set_ras_addr_hook); EXPORT_SYMBOL_GPL(nat_rtp_rtcp_hook); EXPORT_SYMBOL_GPL(nat_t120_hook); EXPORT_SYMBOL_GPL(nat_h245_hook); +EXPORT_SYMBOL_GPL(nat_callforwarding_hook); EXPORT_SYMBOL_GPL(nat_q931_hook); MODULE_AUTHOR("Jing Min Zhao "); diff --git a/net/ipv4/netfilter/ip_conntrack_helper_h323_types.c b/net/ipv4/netfilter/ip_conntrack_helper_h323_types.c index 022c47b9f..4b359618b 100644 --- a/net/ipv4/netfilter/ip_conntrack_helper_h323_types.c +++ b/net/ipv4/netfilter/ip_conntrack_helper_h323_types.c @@ -1,4 +1,4 @@ -/* Generated by Jing Min Zhao's ASN.1 parser, Mar 15 2006 +/* Generated by Jing Min Zhao's ASN.1 parser, Apr 20 2006 * * Copyright (c) 2006 Jing Min Zhao * @@ -1069,8 +1069,8 @@ static field_t _Facility_UUIE_fastStart[] = { /* SEQUENCE OF */ static field_t _Facility_UUIE[] = { /* SEQUENCE */ {FNAME("protocolIdentifier") OID, BYTE, 0, 0, SKIP, 0, NULL}, - {FNAME("alternativeAddress") CHOICE, 3, 7, 7, SKIP | EXT | OPT, 0, - _TransportAddress}, + {FNAME("alternativeAddress") CHOICE, 3, 7, 7, DECODE | EXT | OPT, + offsetof(Facility_UUIE, alternativeAddress), _TransportAddress}, {FNAME("alternativeAliasAddress") SEQOF, SEMI, 0, 0, SKIP | OPT, 0, _Facility_UUIE_alternativeAliasAddress}, {FNAME("conferenceID") OCTSTR, FIXD, 16, 0, SKIP | OPT, 0, NULL}, diff --git a/net/ipv4/netfilter/ip_conntrack_helper_pptp.c b/net/ipv4/netfilter/ip_conntrack_helper_pptp.c index 8ccfe17bb..b020a33e6 100644 --- a/net/ipv4/netfilter/ip_conntrack_helper_pptp.c +++ b/net/ipv4/netfilter/ip_conntrack_helper_pptp.c @@ -46,7 +46,6 @@ * */ -#include #include #include #include diff --git a/net/ipv4/netfilter/ip_conntrack_irc.c b/net/ipv4/netfilter/ip_conntrack_irc.c index a2ac5ce54..44889075f 100644 --- a/net/ipv4/netfilter/ip_conntrack_irc.c +++ b/net/ipv4/netfilter/ip_conntrack_irc.c @@ -22,7 +22,6 @@ * */ -#include #include #include #include diff --git a/net/ipv4/netfilter/ip_conntrack_netlink.c b/net/ipv4/netfilter/ip_conntrack_netlink.c index 01bd7cab9..0d4cc9239 100644 --- a/net/ipv4/netfilter/ip_conntrack_netlink.c +++ b/net/ipv4/netfilter/ip_conntrack_netlink.c @@ -399,42 +399,55 @@ nfattr_failure: static int ctnetlink_done(struct netlink_callback *cb) { DEBUGP("entered %s\n", __FUNCTION__); + if (cb->args[1]) + ip_conntrack_put((struct ip_conntrack *)cb->args[1]); return 0; } static int ctnetlink_dump_table(struct sk_buff *skb, struct netlink_callback *cb) { - struct ip_conntrack *ct = NULL; + struct ip_conntrack *ct, *last; struct ip_conntrack_tuple_hash *h; struct list_head *i; - u_int32_t *id = (u_int32_t *) &cb->args[1]; DEBUGP("entered %s, last bucket=%lu id=%u\n", __FUNCTION__, cb->args[0], *id); read_lock_bh(&ip_conntrack_lock); - for (; cb->args[0] < ip_conntrack_htable_size; cb->args[0]++, *id = 0) { + last = (struct ip_conntrack *)cb->args[1]; + for (; cb->args[0] < ip_conntrack_htable_size; cb->args[0]++) { +restart: list_for_each_prev(i, &ip_conntrack_hash[cb->args[0]]) { h = (struct ip_conntrack_tuple_hash *) i; if (DIRECTION(h) != IP_CT_DIR_ORIGINAL) continue; ct = tuplehash_to_ctrack(h); - if (ct->id <= *id) - continue; + if (cb->args[1]) { + if (ct != last) + continue; + cb->args[1] = 0; + } if (ctnetlink_fill_info(skb, NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_seq, IPCTNL_MSG_CT_NEW, - 1, ct) < 0) + 1, ct) < 0) { + nf_conntrack_get(&ct->ct_general); + cb->args[1] = (unsigned long)ct; goto out; - *id = ct->id; + } + } + if (cb->args[1]) { + cb->args[1] = 0; + goto restart; } } -out: +out: read_unlock_bh(&ip_conntrack_lock); + if (last) + ip_conntrack_put(last); DEBUGP("leaving, last bucket=%lu id=%u\n", cb->args[0], *id); - return skb->len; } @@ -629,7 +642,7 @@ static const size_t cta_min_nat[CTA_NAT_MAX] = { }; static inline int -ctnetlink_parse_nat(struct nfattr *cda[], +ctnetlink_parse_nat(struct nfattr *nat, const struct ip_conntrack *ct, struct ip_nat_range *range) { struct nfattr *tb[CTA_NAT_MAX]; @@ -639,7 +652,7 @@ ctnetlink_parse_nat(struct nfattr *cda[], memset(range, 0, sizeof(*range)); - nfattr_parse_nested(tb, CTA_NAT_MAX, cda[CTA_NAT-1]); + nfattr_parse_nested(tb, CTA_NAT_MAX, nat); if (nfattr_bad_size(tb, CTA_NAT_MAX, cta_min_nat)) return -EINVAL; @@ -854,39 +867,30 @@ ctnetlink_change_status(struct ip_conntrack *ct, struct nfattr *cda[]) /* ASSURED bit can only be set */ return -EINVAL; - if (cda[CTA_NAT-1]) { + if (cda[CTA_NAT_SRC-1] || cda[CTA_NAT_DST-1]) { #ifndef CONFIG_IP_NF_NAT_NEEDED return -EINVAL; #else - unsigned int hooknum; struct ip_nat_range range; - if (ctnetlink_parse_nat(cda, ct, &range) < 0) - return -EINVAL; - - DEBUGP("NAT: %u.%u.%u.%u-%u.%u.%u.%u:%u-%u\n", - NIPQUAD(range.min_ip), NIPQUAD(range.max_ip), - htons(range.min.all), htons(range.max.all)); - - /* This is tricky but it works. ip_nat_setup_info needs the - * hook number as parameter, so let's do the correct - * conversion and run away */ - if (status & IPS_SRC_NAT_DONE) - hooknum = NF_IP_POST_ROUTING; /* IP_NAT_MANIP_SRC */ - else if (status & IPS_DST_NAT_DONE) - hooknum = NF_IP_PRE_ROUTING; /* IP_NAT_MANIP_DST */ - else - return -EINVAL; /* Missing NAT flags */ - - DEBUGP("NAT status: %lu\n", - status & (IPS_NAT_MASK | IPS_NAT_DONE_MASK)); - - if (ip_nat_initialized(ct, HOOK2MANIP(hooknum))) - return -EEXIST; - ip_nat_setup_info(ct, &range, hooknum); - - DEBUGP("NAT status after setup_info: %lu\n", - ct->status & (IPS_NAT_MASK | IPS_NAT_DONE_MASK)); + if (cda[CTA_NAT_DST-1]) { + if (ctnetlink_parse_nat(cda[CTA_NAT_DST-1], ct, + &range) < 0) + return -EINVAL; + if (ip_nat_initialized(ct, + HOOK2MANIP(NF_IP_PRE_ROUTING))) + return -EEXIST; + ip_nat_setup_info(ct, &range, NF_IP_PRE_ROUTING); + } + if (cda[CTA_NAT_SRC-1]) { + if (ctnetlink_parse_nat(cda[CTA_NAT_SRC-1], ct, + &range) < 0) + return -EINVAL; + if (ip_nat_initialized(ct, + HOOK2MANIP(NF_IP_POST_ROUTING))) + return -EEXIST; + ip_nat_setup_info(ct, &range, NF_IP_POST_ROUTING); + } #endif } @@ -1106,7 +1110,7 @@ ctnetlink_new_conntrack(struct sock *ctnl, struct sk_buff *skb, /* implicit 'else' */ /* we only allow nat config for new conntracks */ - if (cda[CTA_NAT-1]) { + if (cda[CTA_NAT_SRC-1] || cda[CTA_NAT_DST-1]) { err = -EINVAL; goto out_unlock; } diff --git a/net/ipv4/netfilter/ip_conntrack_proto_gre.c b/net/ipv4/netfilter/ip_conntrack_proto_gre.c index 56794797d..4ee016c42 100644 --- a/net/ipv4/netfilter/ip_conntrack_proto_gre.c +++ b/net/ipv4/netfilter/ip_conntrack_proto_gre.c @@ -23,7 +23,6 @@ * */ -#include #include #include #include @@ -77,10 +76,10 @@ static inline int gre_key_cmpfn(const struct ip_ct_gre_keymap *km, } /* look up the source key for a given tuple */ -static u_int32_t gre_keymap_lookup(struct ip_conntrack_tuple *t) +static __be16 gre_keymap_lookup(struct ip_conntrack_tuple *t) { struct ip_ct_gre_keymap *km; - u_int32_t key = 0; + __be16 key = 0; read_lock_bh(&ip_ct_gre_lock); km = LIST_FIND(&gre_keymap_list, gre_key_cmpfn, @@ -190,7 +189,7 @@ static int gre_pkt_to_tuple(const struct sk_buff *skb, struct ip_conntrack_tuple *tuple) { struct gre_hdr_pptp _pgrehdr, *pgrehdr; - u_int32_t srckey; + __be16 srckey; struct gre_hdr _grehdr, *grehdr; /* first only delinearize old RFC1701 GRE header */ diff --git a/net/ipv4/netfilter/ip_conntrack_proto_icmp.c b/net/ipv4/netfilter/ip_conntrack_proto_icmp.c index d8b14a901..23f1c5045 100644 --- a/net/ipv4/netfilter/ip_conntrack_proto_icmp.c +++ b/net/ipv4/netfilter/ip_conntrack_proto_icmp.c @@ -224,7 +224,7 @@ icmp_error(struct sk_buff *skb, enum ip_conntrack_info *ctinfo, } /* See ip_conntrack_proto_tcp.c */ - if (hooknum == NF_IP_PRE_ROUTING && + if (ip_conntrack_checksum && hooknum == NF_IP_PRE_ROUTING && nf_ip_checksum(skb, hooknum, skb->nh.iph->ihl * 4, 0)) { if (LOG_INVALID(IPPROTO_ICMP)) nf_log_packet(PF_INET, 0, skb, NULL, NULL, NULL, diff --git a/net/ipv4/netfilter/ip_conntrack_proto_tcp.c b/net/ipv4/netfilter/ip_conntrack_proto_tcp.c index 062b252b5..fb920e76e 100644 --- a/net/ipv4/netfilter/ip_conntrack_proto_tcp.c +++ b/net/ipv4/netfilter/ip_conntrack_proto_tcp.c @@ -19,7 +19,6 @@ * version 2.2 */ -#include #include #include #include @@ -870,7 +869,7 @@ static int tcp_error(struct sk_buff *skb, * and moreover root might send raw packets. */ /* FIXME: Source route IP option packets --RR */ - if (hooknum == NF_IP_PRE_ROUTING && + if (ip_conntrack_checksum && hooknum == NF_IP_PRE_ROUTING && nf_ip_checksum(skb, hooknum, iph->ihl * 4, IPPROTO_TCP)) { if (LOG_INVALID(IPPROTO_TCP)) nf_log_packet(PF_INET, 0, skb, NULL, NULL, NULL, diff --git a/net/ipv4/netfilter/ip_conntrack_proto_udp.c b/net/ipv4/netfilter/ip_conntrack_proto_udp.c index 708998687..9b2c16b4d 100644 --- a/net/ipv4/netfilter/ip_conntrack_proto_udp.c +++ b/net/ipv4/netfilter/ip_conntrack_proto_udp.c @@ -120,7 +120,7 @@ static int udp_error(struct sk_buff *skb, enum ip_conntrack_info *ctinfo, * because the semantic of CHECKSUM_HW is different there * and moreover root might send raw packets. * FIXME: Source route IP option packets --RR */ - if (hooknum == NF_IP_PRE_ROUTING && + if (ip_conntrack_checksum && hooknum == NF_IP_PRE_ROUTING && nf_ip_checksum(skb, hooknum, iph->ihl * 4, IPPROTO_UDP)) { if (LOG_INVALID(IPPROTO_UDP)) nf_log_packet(PF_INET, 0, skb, NULL, NULL, NULL, diff --git a/net/ipv4/netfilter/ip_conntrack_standalone.c b/net/ipv4/netfilter/ip_conntrack_standalone.c index 57361408d..b2f38f190 100644 --- a/net/ipv4/netfilter/ip_conntrack_standalone.c +++ b/net/ipv4/netfilter/ip_conntrack_standalone.c @@ -12,7 +12,6 @@ * published by the Free Software Foundation. */ -#include #include #include #include @@ -199,6 +198,11 @@ static int ct_seq_show(struct seq_file *s, void *v) return -ENOSPC; #endif +#ifdef CONFIG_IP_NF_CONNTRACK_SECMARK + if (seq_printf(s, "secmark=%u ", conntrack->secmark)) + return -ENOSPC; +#endif + if (seq_printf(s, "use=%u\n", atomic_read(&conntrack->ct_general.use))) return -ENOSPC; @@ -427,7 +431,7 @@ static unsigned int ip_conntrack_help(unsigned int hooknum, /* This is where we call the helper: as the packet goes out. */ ct = ip_conntrack_get(*pskb, &ctinfo); - if (ct && ct->helper) { + if (ct && ct->helper && ctinfo != IP_CT_RELATED + IP_CT_IS_REPLY) { unsigned int ret; ret = ct->helper->help(pskb, ct, ctinfo); if (ret != NF_ACCEPT) @@ -540,6 +544,8 @@ static struct nf_hook_ops ip_conntrack_ops[] = { /* Sysctl support */ +int ip_conntrack_checksum = 1; + #ifdef CONFIG_SYSCTL /* From ip_conntrack_core.c */ @@ -601,6 +607,14 @@ static ctl_table ip_ct_sysctl_table[] = { .mode = 0444, .proc_handler = &proc_dointvec, }, + { + .ctl_name = NET_IPV4_NF_CONNTRACK_CHECKSUM, + .procname = "ip_conntrack_checksum", + .data = &ip_conntrack_checksum, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + }, { .ctl_name = NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_SYN_SENT, .procname = "ip_conntrack_tcp_timeout_syn_sent", @@ -956,6 +970,7 @@ EXPORT_SYMBOL_GPL(__ip_conntrack_helper_find_byname); EXPORT_SYMBOL_GPL(ip_conntrack_proto_find_get); EXPORT_SYMBOL_GPL(ip_conntrack_proto_put); EXPORT_SYMBOL_GPL(__ip_conntrack_proto_find); +EXPORT_SYMBOL_GPL(ip_conntrack_checksum); #if defined(CONFIG_IP_NF_CONNTRACK_NETLINK) || \ defined(CONFIG_IP_NF_CONNTRACK_NETLINK_MODULE) EXPORT_SYMBOL_GPL(ip_ct_port_tuple_to_nfattr); diff --git a/net/ipv4/netfilter/ip_nat_helper.c b/net/ipv4/netfilter/ip_nat_helper.c index 5d506e056..cbcaa4537 100644 --- a/net/ipv4/netfilter/ip_nat_helper.c +++ b/net/ipv4/netfilter/ip_nat_helper.c @@ -15,7 +15,6 @@ * - make ip_nat_resize_packet more generic (TCP and UDP) * - add ip_nat_mangle_udp_packet */ -#include #include #include #include diff --git a/net/ipv4/netfilter/ip_nat_helper_h323.c b/net/ipv4/netfilter/ip_nat_helper_h323.c index d45663d13..419b878fb 100644 --- a/net/ipv4/netfilter/ip_nat_helper_h323.c +++ b/net/ipv4/netfilter/ip_nat_helper_h323.c @@ -486,6 +486,80 @@ static int nat_q931(struct sk_buff **pskb, struct ip_conntrack *ct, return 0; } +/****************************************************************************/ +static void ip_nat_callforwarding_expect(struct ip_conntrack *new, + struct ip_conntrack_expect *this) +{ + struct ip_nat_range range; + + /* This must be a fresh one. */ + BUG_ON(new->status & IPS_NAT_DONE_MASK); + + /* Change src to where master sends to */ + range.flags = IP_NAT_RANGE_MAP_IPS; + range.min_ip = range.max_ip = new->tuplehash[!this->dir].tuple.src.ip; + + /* hook doesn't matter, but it has to do source manip */ + ip_nat_setup_info(new, &range, NF_IP_POST_ROUTING); + + /* For DST manip, map port here to where it's expected. */ + range.flags = (IP_NAT_RANGE_MAP_IPS | IP_NAT_RANGE_PROTO_SPECIFIED); + range.min = range.max = this->saved_proto; + range.min_ip = range.max_ip = this->saved_ip; + + /* hook doesn't matter, but it has to do destination manip */ + ip_nat_setup_info(new, &range, NF_IP_PRE_ROUTING); + + ip_conntrack_q931_expect(new, this); +} + +/****************************************************************************/ +static int nat_callforwarding(struct sk_buff **pskb, struct ip_conntrack *ct, + enum ip_conntrack_info ctinfo, + unsigned char **data, int dataoff, + TransportAddress * addr, u_int16_t port, + struct ip_conntrack_expect *exp) +{ + int dir = CTINFO2DIR(ctinfo); + u_int16_t nated_port; + + /* Set expectations for NAT */ + exp->saved_ip = exp->tuple.dst.ip; + exp->tuple.dst.ip = ct->tuplehash[!dir].tuple.dst.ip; + exp->saved_proto.tcp.port = exp->tuple.dst.u.tcp.port; + exp->expectfn = ip_nat_callforwarding_expect; + exp->dir = !dir; + + /* Try to get same port: if not, try to change it. */ + for (nated_port = port; nated_port != 0; nated_port++) { + exp->tuple.dst.u.tcp.port = htons(nated_port); + if (ip_conntrack_expect_related(exp) == 0) + break; + } + + if (nated_port == 0) { /* No port available */ + if (net_ratelimit()) + printk("ip_nat_q931: out of TCP ports\n"); + return 0; + } + + /* Modify signal */ + if (!set_h225_addr(pskb, data, dataoff, addr, + ct->tuplehash[!dir].tuple.dst.ip, + nated_port) == 0) { + ip_conntrack_unexpect_related(exp); + return -1; + } + + /* Success */ + DEBUGP("ip_nat_q931: expect Call Forwarding " + "%u.%u.%u.%u:%hu->%u.%u.%u.%u:%hu\n", + NIPQUAD(exp->tuple.src.ip), ntohs(exp->tuple.src.u.tcp.port), + NIPQUAD(exp->tuple.dst.ip), ntohs(exp->tuple.dst.u.tcp.port)); + + return 0; +} + /****************************************************************************/ static int __init init(void) { @@ -496,6 +570,7 @@ static int __init init(void) BUG_ON(nat_rtp_rtcp_hook != NULL); BUG_ON(nat_t120_hook != NULL); BUG_ON(nat_h245_hook != NULL); + BUG_ON(nat_callforwarding_hook != NULL); BUG_ON(nat_q931_hook != NULL); set_h245_addr_hook = set_h245_addr; @@ -505,6 +580,7 @@ static int __init init(void) nat_rtp_rtcp_hook = nat_rtp_rtcp; nat_t120_hook = nat_t120; nat_h245_hook = nat_h245; + nat_callforwarding_hook = nat_callforwarding; nat_q931_hook = nat_q931; DEBUGP("ip_nat_h323: init success\n"); @@ -521,6 +597,7 @@ static void __exit fini(void) nat_rtp_rtcp_hook = NULL; nat_t120_hook = NULL; nat_h245_hook = NULL; + nat_callforwarding_hook = NULL; nat_q931_hook = NULL; synchronize_net(); } diff --git a/net/ipv4/netfilter/ip_nat_helper_pptp.c b/net/ipv4/netfilter/ip_nat_helper_pptp.c index f3977726f..1d149964d 100644 --- a/net/ipv4/netfilter/ip_nat_helper_pptp.c +++ b/net/ipv4/netfilter/ip_nat_helper_pptp.c @@ -35,7 +35,6 @@ * */ -#include #include #include #include diff --git a/net/ipv4/netfilter/ip_nat_proto_gre.c b/net/ipv4/netfilter/ip_nat_proto_gre.c index 96ceabaec..38acfdf54 100644 --- a/net/ipv4/netfilter/ip_nat_proto_gre.c +++ b/net/ipv4/netfilter/ip_nat_proto_gre.c @@ -23,7 +23,6 @@ * */ -#include #include #include #include diff --git a/net/ipv4/netfilter/ip_nat_proto_udp.c b/net/ipv4/netfilter/ip_nat_proto_udp.c index e8eaf6a37..802ceb70d 100644 --- a/net/ipv4/netfilter/ip_nat_proto_udp.c +++ b/net/ipv4/netfilter/ip_nat_proto_udp.c @@ -113,7 +113,7 @@ udp_manip_pkt(struct sk_buff **pskb, newport = tuple->dst.u.udp.port; portptr = &hdr->dest; } - if (hdr->check) { /* 0 is a special case meaning no checksum */ + if (hdr->check) /* 0 is a special case meaning no checksum */ #ifdef CONFIG_XEN if ((*pskb)->proto_csum_blank) hdr->check = ip_nat_cheat_check(oldip, ~newip, hdr->check); @@ -123,7 +123,6 @@ udp_manip_pkt(struct sk_buff **pskb, ip_nat_cheat_check(*portptr ^ 0xFFFF, newport, hdr->check)); - } *portptr = newport; return 1; } diff --git a/net/ipv4/netfilter/ip_nat_snmp_basic.c b/net/ipv4/netfilter/ip_nat_snmp_basic.c index c33244263..18b7fbdcc 100644 --- a/net/ipv4/netfilter/ip_nat_snmp_basic.c +++ b/net/ipv4/netfilter/ip_nat_snmp_basic.c @@ -43,7 +43,6 @@ * 2000-08-06: Convert to new helper API (Harald Welte). * */ -#include #include #include #include @@ -1256,9 +1255,9 @@ static int help(struct sk_buff **pskb, struct udphdr *udph = (struct udphdr *)((u_int32_t *)iph + iph->ihl); /* SNMP replies and originating SNMP traps get mangled */ - if (udph->source == ntohs(SNMP_PORT) && dir != IP_CT_DIR_REPLY) + if (udph->source == htons(SNMP_PORT) && dir != IP_CT_DIR_REPLY) return NF_ACCEPT; - if (udph->dest == ntohs(SNMP_TRAP_PORT) && dir != IP_CT_DIR_ORIGINAL) + if (udph->dest == htons(SNMP_TRAP_PORT) && dir != IP_CT_DIR_ORIGINAL) return NF_ACCEPT; /* No NAT? */ @@ -1348,4 +1347,4 @@ static void __exit ip_nat_snmp_basic_fini(void) module_init(ip_nat_snmp_basic_init); module_exit(ip_nat_snmp_basic_fini); -module_param(debug, bool, 0600); +module_param(debug, int, 0600); diff --git a/net/ipv4/netfilter/ip_nat_standalone.c b/net/ipv4/netfilter/ip_nat_standalone.c index 67e676783..6db485f2c 100644 --- a/net/ipv4/netfilter/ip_nat_standalone.c +++ b/net/ipv4/netfilter/ip_nat_standalone.c @@ -18,7 +18,6 @@ * - now capable of multiple expectations for one master * */ -#include #include #include #include @@ -111,12 +110,17 @@ ip_nat_fn(unsigned int hooknum, IP_NF_ASSERT(!((*pskb)->nh.iph->frag_off & htons(IP_MF|IP_OFFSET))); + ct = ip_conntrack_get(*pskb, &ctinfo); + + /* Don't try to NAT if this packet is not conntracked */ + if (ct == &ip_conntrack_untracked) + return NF_ACCEPT; + /* If we had a hardware checksum before, it's now invalid */ if ((*pskb)->ip_summed == CHECKSUM_HW) if (skb_checksum_help(*pskb, (out == NULL))) return NF_DROP; - ct = ip_conntrack_get(*pskb, &ctinfo); /* Can't track? It's not due to stress, or conntrack would have dropped it. Hence it's the user's responsibilty to packet filter it out, or implement conntrack/NAT for that @@ -138,10 +142,6 @@ ip_nat_fn(unsigned int hooknum, return NF_ACCEPT; } - /* Don't try to NAT if this packet is not conntracked */ - if (ct == &ip_conntrack_untracked) - return NF_ACCEPT; - switch (ctinfo) { case IP_CT_RELATED: case IP_CT_RELATED+IP_CT_IS_REPLY: diff --git a/net/ipv4/netfilter/ip_queue.c b/net/ipv4/netfilter/ip_queue.c index b93f04943..198ac36db 100644 --- a/net/ipv4/netfilter/ip_queue.c +++ b/net/ipv4/netfilter/ip_queue.c @@ -457,11 +457,19 @@ dev_cmp(struct ipq_queue_entry *entry, unsigned long ifindex) if (entry->info->indev) if (entry->info->indev->ifindex == ifindex) return 1; - if (entry->info->outdev) if (entry->info->outdev->ifindex == ifindex) return 1; - +#ifdef CONFIG_BRIDGE_NETFILTER + if (entry->skb->nf_bridge) { + if (entry->skb->nf_bridge->physindev && + entry->skb->nf_bridge->physindev->ifindex == ifindex) + return 1; + if (entry->skb->nf_bridge->physoutdev && + entry->skb->nf_bridge->physoutdev->ifindex == ifindex) + return 1; + } +#endif return 0; } @@ -507,7 +515,7 @@ ipq_rcv_skb(struct sk_buff *skb) if (type <= IPQM_BASE) return; - if (security_netlink_recv(skb)) + if (security_netlink_recv(skb, CAP_NET_ADMIN)) RCV_SKB_FAIL(-EPERM); write_lock_bh(&queue_lock); diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c index 71871c4f9..048514f15 100644 --- a/net/ipv4/netfilter/ip_tables.c +++ b/net/ipv4/netfilter/ip_tables.c @@ -14,7 +14,6 @@ * 08 Oct 2005 Harald Welte * - Generalize into "x_tables" layer and "{ip,ip6,arp}_tables" */ -#include #include #include #include @@ -1762,7 +1761,7 @@ translate_compat_table(const char *name, goto free_newinfo; /* And one copy for every other CPU */ - for_each_cpu(i) + for_each_possible_cpu(i) if (newinfo->entries[i] && newinfo->entries[i] != entry1) memcpy(newinfo->entries[i], entry1, newinfo->size); @@ -2114,7 +2113,8 @@ int ipt_register_table(struct xt_table *table, const struct ipt_replace *repl) return ret; } - if (xt_register_table(table, &bootstrap, newinfo) != 0) { + ret = xt_register_table(table, &bootstrap, newinfo); + if (ret != 0) { xt_free_table_info(newinfo); return ret; } @@ -2240,22 +2240,39 @@ static int __init ip_tables_init(void) { int ret; - xt_proto_init(AF_INET); + ret = xt_proto_init(AF_INET); + if (ret < 0) + goto err1; /* Noone else will be downing sem now, so we won't sleep */ - xt_register_target(&ipt_standard_target); - xt_register_target(&ipt_error_target); - xt_register_match(&icmp_matchstruct); + ret = xt_register_target(&ipt_standard_target); + if (ret < 0) + goto err2; + ret = xt_register_target(&ipt_error_target); + if (ret < 0) + goto err3; + ret = xt_register_match(&icmp_matchstruct); + if (ret < 0) + goto err4; /* Register setsockopt */ ret = nf_register_sockopt(&ipt_sockopts); - if (ret < 0) { - duprintf("Unable to register sockopts.\n"); - return ret; - } + if (ret < 0) + goto err5; printk("ip_tables: (C) 2000-2006 Netfilter Core Team\n"); return 0; + +err5: + xt_unregister_match(&icmp_matchstruct); +err4: + xt_unregister_target(&ipt_error_target); +err3: + xt_unregister_target(&ipt_standard_target); +err2: + xt_proto_fini(AF_INET); +err1: + return ret; } static void __exit ip_tables_fini(void) diff --git a/net/ipv4/netfilter/ipt_CLUSTERIP.c b/net/ipv4/netfilter/ipt_CLUSTERIP.c index aad9d28c8..d994c5f57 100644 --- a/net/ipv4/netfilter/ipt_CLUSTERIP.c +++ b/net/ipv4/netfilter/ipt_CLUSTERIP.c @@ -10,7 +10,6 @@ * */ #include -#include #include #include #include @@ -173,11 +172,10 @@ clusterip_config_init(struct ipt_clusterip_tgt_info *i, u_int32_t ip, struct clusterip_config *c; char buffer[16]; - c = kmalloc(sizeof(*c), GFP_ATOMIC); + c = kzalloc(sizeof(*c), GFP_ATOMIC); if (!c) return NULL; - memset(c, 0, sizeof(*c)); c->dev = dev; c->clusterip = ip; memcpy(&c->clustermac, &i->clustermac, ETH_ALEN); @@ -241,25 +239,17 @@ clusterip_hashfn(struct sk_buff *skb, struct clusterip_config *config) struct iphdr *iph = skb->nh.iph; unsigned long hashval; u_int16_t sport, dport; - struct tcphdr *th; - struct udphdr *uh; - struct icmphdr *ih; + u_int16_t *ports; switch (iph->protocol) { case IPPROTO_TCP: - th = (void *)iph+iph->ihl*4; - sport = ntohs(th->source); - dport = ntohs(th->dest); - break; case IPPROTO_UDP: - uh = (void *)iph+iph->ihl*4; - sport = ntohs(uh->source); - dport = ntohs(uh->dest); - break; + case IPPROTO_SCTP: + case IPPROTO_DCCP: case IPPROTO_ICMP: - ih = (void *)iph+iph->ihl*4; - sport = ntohs(ih->un.echo.id); - dport = (ih->type<<8)|ih->code; + ports = (void *)iph+iph->ihl*4; + sport = ports[0]; + dport = ports[1]; break; default: if (net_ratelimit()) { diff --git a/net/ipv4/netfilter/ipt_MASQUERADE.c b/net/ipv4/netfilter/ipt_MASQUERADE.c index 8b3e7f99b..ebd94f2ab 100644 --- a/net/ipv4/netfilter/ipt_MASQUERADE.c +++ b/net/ipv4/netfilter/ipt_MASQUERADE.c @@ -9,7 +9,6 @@ * published by the Free Software Foundation. */ -#include #include #include #include diff --git a/net/ipv4/netfilter/ipt_NETMAP.c b/net/ipv4/netfilter/ipt_NETMAP.c index 2fcf1075b..736c4b5a8 100644 --- a/net/ipv4/netfilter/ipt_NETMAP.c +++ b/net/ipv4/netfilter/ipt_NETMAP.c @@ -10,7 +10,6 @@ * published by the Free Software Foundation. */ -#include #include #include #include diff --git a/net/ipv4/netfilter/ipt_REJECT.c b/net/ipv4/netfilter/ipt_REJECT.c index 0bba3c2bb..269bc2067 100644 --- a/net/ipv4/netfilter/ipt_REJECT.c +++ b/net/ipv4/netfilter/ipt_REJECT.c @@ -12,7 +12,6 @@ * published by the Free Software Foundation. */ -#include #include #include #include @@ -147,6 +146,7 @@ static void send_reset(struct sk_buff *oldskb, int hook) /* This packet will not be the same as the other: clear nf fields */ nf_reset(nskb); nskb->nfmark = 0; + skb_init_secmark(nskb); tcph = (struct tcphdr *)((u_int32_t*)nskb->nh.iph + nskb->nh.iph->ihl); diff --git a/net/ipv4/netfilter/ipt_ULOG.c b/net/ipv4/netfilter/ipt_ULOG.c index 2a79b6137..58ba51994 100644 --- a/net/ipv4/netfilter/ipt_ULOG.c +++ b/net/ipv4/netfilter/ipt_ULOG.c @@ -47,7 +47,6 @@ */ #include -#include #include #include #include diff --git a/net/ipv4/netfilter/ipt_hashlimit.c b/net/ipv4/netfilter/ipt_hashlimit.c index 7c6836c46..3bd2368e1 100644 --- a/net/ipv4/netfilter/ipt_hashlimit.c +++ b/net/ipv4/netfilter/ipt_hashlimit.c @@ -28,9 +28,6 @@ #include #include #include -#include -#include -#include #include #include #include @@ -83,6 +80,7 @@ struct ipt_hashlimit_htable { /* used internally */ spinlock_t lock; /* lock for list_head */ u_int32_t rnd; /* random seed for hash */ + int rnd_initialized; struct timer_list timer; /* timer for gc */ atomic_t count; /* number entries in table */ @@ -137,8 +135,10 @@ __dsthash_alloc_init(struct ipt_hashlimit_htable *ht, struct dsthash_dst *dst) /* initialize hash with random val at the time we allocate * the first hashtable entry */ - if (!ht->rnd) + if (!ht->rnd_initialized) { get_random_bytes(&ht->rnd, 4); + ht->rnd_initialized = 1; + } if (ht->cfg.max && atomic_read(&ht->count) >= ht->cfg.max) { @@ -217,7 +217,7 @@ static int htable_create(struct ipt_hashlimit_info *minfo) atomic_set(&hinfo->count, 0); atomic_set(&hinfo->use, 1); - hinfo->rnd = 0; + hinfo->rnd_initialized = 0; spin_lock_init(&hinfo->lock); hinfo->pde = create_proc_entry(minfo->name, 0, hashlimit_procdir); if (!hinfo->pde) { @@ -381,49 +381,6 @@ static inline void rateinfo_recalc(struct dsthash_ent *dh, unsigned long now) dh->rateinfo.credit = dh->rateinfo.credit_cap; } -static inline int get_ports(const struct sk_buff *skb, int offset, - u16 ports[2]) -{ - union { - struct tcphdr th; - struct udphdr uh; - sctp_sctphdr_t sctph; - } hdr_u, *ptr_u; - - /* Must not be a fragment. */ - if (offset) - return 1; - - /* Must be big enough to read ports (both UDP and TCP have - them at the start). */ - ptr_u = skb_header_pointer(skb, skb->nh.iph->ihl*4, 8, &hdr_u); - if (!ptr_u) - return 1; - - switch (skb->nh.iph->protocol) { - case IPPROTO_TCP: - ports[0] = ptr_u->th.source; - ports[1] = ptr_u->th.dest; - break; - case IPPROTO_UDP: - ports[0] = ptr_u->uh.source; - ports[1] = ptr_u->uh.dest; - break; - case IPPROTO_SCTP: - ports[0] = ptr_u->sctph.source; - ports[1] = ptr_u->sctph.dest; - break; - default: - /* all other protocols don't supprot per-port hash - * buckets */ - ports[0] = ports[1] = 0; - break; - } - - return 0; -} - - static int hashlimit_match(const struct sk_buff *skb, const struct net_device *in, @@ -449,8 +406,22 @@ hashlimit_match(const struct sk_buff *skb, dst.src_ip = skb->nh.iph->saddr; if (hinfo->cfg.mode & IPT_HASHLIMIT_HASH_DPT ||hinfo->cfg.mode & IPT_HASHLIMIT_HASH_SPT) { - u_int16_t ports[2]; - if (get_ports(skb, offset, ports)) { + u_int16_t _ports[2], *ports; + + switch (skb->nh.iph->protocol) { + case IPPROTO_TCP: + case IPPROTO_UDP: + case IPPROTO_SCTP: + case IPPROTO_DCCP: + ports = skb_header_pointer(skb, skb->nh.iph->ihl*4, + sizeof(_ports), &_ports); + break; + default: + _ports[0] = _ports[1] = 0; + ports = _ports; + break; + } + if (!ports) { /* We've been asked to examine this packet, and we can't. Hence, no choice but to drop. */ *hotdrop = 1; @@ -483,15 +454,12 @@ hashlimit_match(const struct sk_buff *skb, dh->rateinfo.credit_cap = user2credits(hinfo->cfg.avg * hinfo->cfg.burst); dh->rateinfo.cost = user2credits(hinfo->cfg.avg); - - spin_unlock_bh(&hinfo->lock); - return 1; + } else { + /* update expiration timeout */ + dh->expires = now + msecs_to_jiffies(hinfo->cfg.expire); + rateinfo_recalc(dh, now); } - /* update expiration timeout */ - dh->expires = now + msecs_to_jiffies(hinfo->cfg.expire); - - rateinfo_recalc(dh, now); if (dh->rateinfo.credit >= dh->rateinfo.cost) { /* We're underlimit. */ dh->rateinfo.credit -= dh->rateinfo.cost; @@ -537,6 +505,9 @@ hashlimit_checkentry(const char *tablename, if (!r->cfg.expire) return 0; + if (r->name[sizeof(r->name) - 1] != '\0') + return 0; + /* This is the best we've got: We cannot release and re-grab lock, * since checkentry() is called before ip_tables.c grabs ipt_mutex. * We also cannot grab the hashtable spinlock, since htable_create will @@ -561,7 +532,7 @@ static void hashlimit_destroy(const struct xt_match *match, void *matchinfo, unsigned int matchsize) { - struct ipt_hashlimit_info *r = (struct ipt_hashlimit_info *) matchinfo; + struct ipt_hashlimit_info *r = matchinfo; htable_put(r->hinfo); } diff --git a/net/ipv4/netfilter/ipt_recent.c b/net/ipv4/netfilter/ipt_recent.c index b847ee409..61a2139f9 100644 --- a/net/ipv4/netfilter/ipt_recent.c +++ b/net/ipv4/netfilter/ipt_recent.c @@ -1,1007 +1,499 @@ -/* Kernel module to check if the source address has been seen recently. */ -/* Copyright 2002-2003, Stephen Frost, 2.5.x port by laforge@netfilter.org */ -/* Author: Stephen Frost */ -/* Project Page: http://snowman.net/projects/ipt_recent/ */ -/* This software is distributed under the terms of the GPL, Version 2 */ -/* This copyright does not cover user programs that use kernel services - * by normal system calls. */ - -#include -#include +/* + * Copyright (c) 2006 Patrick McHardy + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This is a replacement of the old ipt_recent module, which carried the + * following copyright notice: + * + * Author: Stephen Frost + * Copyright 2002-2003, Stephen Frost, 2.5.x port by laforge@netfilter.org + */ +#include +#include #include -#include -#include -#include +#include +#include #include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include #include -#undef DEBUG -#define HASH_LOG 9 +MODULE_AUTHOR("Patrick McHardy "); +MODULE_DESCRIPTION("IP tables recently seen matching module"); +MODULE_LICENSE("GPL"); -/* Defaults, these can be overridden on the module command-line. */ static unsigned int ip_list_tot = 100; static unsigned int ip_pkt_list_tot = 20; static unsigned int ip_list_hash_size = 0; static unsigned int ip_list_perms = 0644; -#ifdef DEBUG -static int debug = 1; -#endif - -static char version[] = -KERN_INFO RECENT_NAME " " RECENT_VER ": Stephen Frost . http://snowman.net/projects/ipt_recent/\n"; - -MODULE_AUTHOR("Stephen Frost "); -MODULE_DESCRIPTION("IP tables recently seen matching module " RECENT_VER); -MODULE_LICENSE("GPL"); module_param(ip_list_tot, uint, 0400); module_param(ip_pkt_list_tot, uint, 0400); module_param(ip_list_hash_size, uint, 0400); module_param(ip_list_perms, uint, 0400); -#ifdef DEBUG -module_param(debug, bool, 0600); -MODULE_PARM_DESC(debug,"enable debugging output"); -#endif -MODULE_PARM_DESC(ip_list_tot,"number of IPs to remember per list"); -MODULE_PARM_DESC(ip_pkt_list_tot,"number of packets per IP to remember"); -MODULE_PARM_DESC(ip_list_hash_size,"size of hash table used to look up IPs"); -MODULE_PARM_DESC(ip_list_perms,"permissions on /proc/net/ipt_recent/* files"); - -/* Structure of our list of recently seen addresses. */ -struct recent_ip_list { - u_int32_t addr; - u_int8_t ttl; - unsigned long last_seen; - unsigned long *last_pkts; - u_int32_t oldest_pkt; - u_int32_t hash_entry; - u_int32_t time_pos; -}; - -struct time_info_list { - u_int32_t position; - u_int32_t time; +MODULE_PARM_DESC(ip_list_tot, "number of IPs to remember per list"); +MODULE_PARM_DESC(ip_pkt_list_tot, "number of packets per IP to remember (max. 255)"); +MODULE_PARM_DESC(ip_list_hash_size, "size of hash table used to look up IPs"); +MODULE_PARM_DESC(ip_list_perms, "permissions on /proc/net/ipt_recent/* files"); + + +struct recent_entry { + struct list_head list; + struct list_head lru_list; + u_int32_t addr; + u_int8_t ttl; + u_int8_t index; + u_int16_t nstamps; + unsigned long stamps[0]; }; -/* Structure of our linked list of tables of recent lists. */ -struct recent_ip_tables { - char name[IPT_RECENT_NAME_LEN]; - int count; - int time_pos; - struct recent_ip_list *table; - struct recent_ip_tables *next; - spinlock_t list_lock; - int *hash_table; - struct time_info_list *time_info; +struct recent_table { + struct list_head list; + char name[IPT_RECENT_NAME_LEN]; #ifdef CONFIG_PROC_FS - struct proc_dir_entry *status_proc; -#endif /* CONFIG_PROC_FS */ + struct proc_dir_entry *proc; +#endif + unsigned int refcnt; + unsigned int entries; + struct list_head lru_list; + struct list_head iphash[0]; }; -/* Our current list of addresses we have recently seen. - * Only added to on a --set, and only updated on --set || --update - */ -static struct recent_ip_tables *r_tables = NULL; - -/* We protect r_list with this spinlock so two processors are not modifying - * the list at the same time. - */ +static LIST_HEAD(tables); static DEFINE_SPINLOCK(recent_lock); +static DEFINE_MUTEX(recent_mutex); #ifdef CONFIG_PROC_FS -/* Our /proc/net/ipt_recent entry */ -static struct proc_dir_entry *proc_net_ipt_recent = NULL; -#endif - -/* Function declaration for later. */ -static int -match(const struct sk_buff *skb, - const struct net_device *in, - const struct net_device *out, - const struct xt_match *match, - const void *matchinfo, - int offset, - unsigned int protoff, - int *hotdrop); - -/* Function to hash a given address into the hash table of table_size size */ -static int hash_func(unsigned int addr, int table_size) -{ - int result = 0; - unsigned int value = addr; - do { result ^= value; } while((value >>= HASH_LOG)); - -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": %d = hash_func(%u,%d)\n", - result & (table_size - 1), - addr, - table_size); +static struct proc_dir_entry *proc_dir; +static struct file_operations recent_fops; #endif - return(result & (table_size - 1)); -} +static u_int32_t hash_rnd; +static int hash_rnd_initted; -#ifdef CONFIG_PROC_FS -/* This is the function which produces the output for our /proc output - * interface which lists each IP address, the last seen time and the - * other recent times the address was seen. - */ - -static int ip_recent_get_info(char *buffer, char **start, off_t offset, int length, int *eof, void *data) +static unsigned int recent_entry_hash(u_int32_t addr) { - int len = 0, count, last_len = 0, pkt_count; - off_t pos = 0; - off_t begin = 0; - struct recent_ip_tables *curr_table; - - curr_table = (struct recent_ip_tables*) data; - - spin_lock_bh(&curr_table->list_lock); - for(count = 0; count < ip_list_tot; count++) { - if(!curr_table->table[count].addr) continue; - last_len = len; - len += sprintf(buffer+len,"src=%u.%u.%u.%u ",NIPQUAD(curr_table->table[count].addr)); - len += sprintf(buffer+len,"ttl: %u ",curr_table->table[count].ttl); - len += sprintf(buffer+len,"last_seen: %lu ",curr_table->table[count].last_seen); - len += sprintf(buffer+len,"oldest_pkt: %u ",curr_table->table[count].oldest_pkt); - len += sprintf(buffer+len,"last_pkts: %lu",curr_table->table[count].last_pkts[0]); - for(pkt_count = 1; pkt_count < ip_pkt_list_tot; pkt_count++) { - if(!curr_table->table[count].last_pkts[pkt_count]) break; - len += sprintf(buffer+len,", %lu",curr_table->table[count].last_pkts[pkt_count]); - } - len += sprintf(buffer+len,"\n"); - pos = begin + len; - if(pos < offset) { len = 0; begin = pos; } - if(pos > offset + length) { len = last_len; break; } + if (!hash_rnd_initted) { + get_random_bytes(&hash_rnd, 4); + hash_rnd_initted = 1; } - - *start = buffer + (offset - begin); - len -= (offset - begin); - if(len > length) len = length; - - spin_unlock_bh(&curr_table->list_lock); - return len; + return jhash_1word(addr, hash_rnd) & (ip_list_hash_size - 1); } -/* ip_recent_ctrl provides an interface for users to modify the table - * directly. This allows adding entries, removing entries, and - * flushing the entire table. - * This is done by opening up the appropriate table for writing and - * sending one of: - * xx.xx.xx.xx -- Add entry to table with current time - * +xx.xx.xx.xx -- Add entry to table with current time - * -xx.xx.xx.xx -- Remove entry from table - * clear -- Flush table, remove all entries - */ - -static int ip_recent_ctrl(struct file *file, const char __user *input, unsigned long size, void *data) +static struct recent_entry * +recent_entry_lookup(const struct recent_table *table, u_int32_t addr, u_int8_t ttl) { - static const u_int32_t max[4] = { 0xffffffff, 0xffffff, 0xffff, 0xff }; - u_int32_t val; - int base, used = 0; - char c, *cp; - union iaddr { - uint8_t bytes[4]; - uint32_t word; - } res; - uint8_t *pp = res.bytes; - int digit; - - char buffer[20]; - int len, check_set = 0, count; - u_int32_t addr = 0; - struct sk_buff *skb; - struct ipt_recent_info *info; - struct recent_ip_tables *curr_table; - - curr_table = (struct recent_ip_tables*) data; - - if(size > 20) len = 20; else len = size; - - if(copy_from_user(buffer,input,len)) return -EFAULT; - - if(len < 20) buffer[len] = '\0'; - -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": ip_recent_ctrl len: %d, input: `%.20s'\n",len,buffer); -#endif + struct recent_entry *e; + unsigned int h; + + h = recent_entry_hash(addr); + list_for_each_entry(e, &table->iphash[h], list) + if (e->addr == addr && (ttl == e->ttl || !ttl || !e->ttl)) + return e; + return NULL; +} - cp = buffer; - while(isspace(*cp)) { cp++; used++; if(used >= len-5) return used; } +static void recent_entry_remove(struct recent_table *t, struct recent_entry *e) +{ + list_del(&e->list); + list_del(&e->lru_list); + kfree(e); + t->entries--; +} - /* Check if we are asked to flush the entire table */ - if(!memcmp(cp,"clear",5)) { - used += 5; - spin_lock_bh(&curr_table->list_lock); - curr_table->time_pos = 0; - for(count = 0; count < ip_list_hash_size; count++) { - curr_table->hash_table[count] = -1; - } - for(count = 0; count < ip_list_tot; count++) { - curr_table->table[count].last_seen = 0; - curr_table->table[count].addr = 0; - curr_table->table[count].ttl = 0; - memset(curr_table->table[count].last_pkts,0,ip_pkt_list_tot*sizeof(unsigned long)); - curr_table->table[count].oldest_pkt = 0; - curr_table->table[count].time_pos = 0; - curr_table->time_info[count].position = count; - curr_table->time_info[count].time = 0; - } - spin_unlock_bh(&curr_table->list_lock); - return used; - } +static struct recent_entry * +recent_entry_init(struct recent_table *t, u_int32_t addr, u_int8_t ttl) +{ + struct recent_entry *e; - check_set = IPT_RECENT_SET; - switch(*cp) { - case '+': check_set = IPT_RECENT_SET; cp++; used++; break; - case '-': check_set = IPT_RECENT_REMOVE; cp++; used++; break; - default: if(!isdigit(*cp)) return (used+1); break; + if (t->entries >= ip_list_tot) { + e = list_entry(t->lru_list.next, struct recent_entry, lru_list); + recent_entry_remove(t, e); } + e = kmalloc(sizeof(*e) + sizeof(e->stamps[0]) * ip_pkt_list_tot, + GFP_ATOMIC); + if (e == NULL) + return NULL; + e->addr = addr; + e->ttl = ttl; + e->stamps[0] = jiffies; + e->nstamps = 1; + e->index = 1; + list_add_tail(&e->list, &t->iphash[recent_entry_hash(addr)]); + list_add_tail(&e->lru_list, &t->lru_list); + t->entries++; + return e; +} -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": ip_recent_ctrl cp: `%c', check_set: %d\n",*cp,check_set); -#endif - /* Get addr (effectively inet_aton()) */ - /* Shamelessly stolen from libc, a function in the kernel for doing - * this would, of course, be greatly preferred, but our options appear - * to be rather limited, so we will just do it ourselves here. - */ - res.word = 0; - - c = *cp; - for(;;) { - if(!isdigit(c)) return used; - val = 0; base = 10; digit = 0; - if(c == '0') { - c = *++cp; - if(c == 'x' || c == 'X') base = 16, c = *++cp; - else { base = 8; digit = 1; } - } - for(;;) { - if(isascii(c) && isdigit(c)) { - if(base == 8 && (c == '8' || c == '0')) return used; - val = (val * base) + (c - '0'); - c = *++cp; - digit = 1; - } else if(base == 16 && isascii(c) && isxdigit(c)) { - val = (val << 4) | (c + 10 - (islower(c) ? 'a' : 'A')); - c = *++cp; - digit = 1; - } else break; - } - if(c == '.') { - if(pp > res.bytes + 2 || val > 0xff) return used; - *pp++ = val; - c = *++cp; - } else break; - } - used = cp - buffer; - if(c != '\0' && (!isascii(c) || !isspace(c))) return used; - if(c == '\n') used++; - if(!digit) return used; +static void recent_entry_update(struct recent_table *t, struct recent_entry *e) +{ + e->stamps[e->index++] = jiffies; + if (e->index > e->nstamps) + e->nstamps = e->index; + e->index %= ip_pkt_list_tot; + list_move_tail(&e->lru_list, &t->lru_list); +} - if(val > max[pp - res.bytes]) return used; - addr = res.word | htonl(val); +static struct recent_table *recent_table_lookup(const char *name) +{ + struct recent_table *t; - if(!addr && check_set == IPT_RECENT_SET) return used; + list_for_each_entry(t, &tables, list) + if (!strcmp(t->name, name)) + return t; + return NULL; +} -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": ip_recent_ctrl c: %c, addr: %u used: %d\n",c,addr,used); -#endif +static void recent_table_flush(struct recent_table *t) +{ + struct recent_entry *e, *next; + unsigned int i; - /* Set up and just call match */ - info = kmalloc(sizeof(struct ipt_recent_info),GFP_KERNEL); - if(!info) { return -ENOMEM; } - info->seconds = 0; - info->hit_count = 0; - info->check_set = check_set; - info->invert = 0; - info->side = IPT_RECENT_SOURCE; - strncpy(info->name,curr_table->name,IPT_RECENT_NAME_LEN); - info->name[IPT_RECENT_NAME_LEN-1] = '\0'; - - skb = kmalloc(sizeof(struct sk_buff),GFP_KERNEL); - if (!skb) { - used = -ENOMEM; - goto out_free_info; - } - skb->nh.iph = kmalloc(sizeof(struct iphdr),GFP_KERNEL); - if (!skb->nh.iph) { - used = -ENOMEM; - goto out_free_skb; + for (i = 0; i < ip_list_hash_size; i++) { + list_for_each_entry_safe(e, next, &t->iphash[i], list) + recent_entry_remove(t, e); } - - skb->nh.iph->saddr = addr; - skb->nh.iph->daddr = 0; - /* Clear ttl since we have no way of knowing it */ - skb->nh.iph->ttl = 0; - match(skb,NULL,NULL,NULL,info,0,0,NULL); - - kfree(skb->nh.iph); -out_free_skb: - kfree(skb); -out_free_info: - kfree(info); - -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": Leaving ip_recent_ctrl addr: %u used: %d\n",addr,used); -#endif - return used; } -#endif /* CONFIG_PROC_FS */ - -/* 'match' is our primary function, called by the kernel whenever a rule is - * hit with our module as an option to it. - * What this function does depends on what was specifically asked of it by - * the user: - * --set -- Add or update last seen time of the source address of the packet - * -- matchinfo->check_set == IPT_RECENT_SET - * --rcheck -- Just check if the source address is in the list - * -- matchinfo->check_set == IPT_RECENT_CHECK - * --update -- If the source address is in the list, update last_seen - * -- matchinfo->check_set == IPT_RECENT_UPDATE - * --remove -- If the source address is in the list, remove it - * -- matchinfo->check_set == IPT_RECENT_REMOVE - * --seconds -- Option to --rcheck/--update, only match if last_seen within seconds - * -- matchinfo->seconds - * --hitcount -- Option to --rcheck/--update, only match if seen hitcount times - * -- matchinfo->hit_count - * --seconds and --hitcount can be combined - */ static int -match(const struct sk_buff *skb, - const struct net_device *in, - const struct net_device *out, - const struct xt_match *match, - const void *matchinfo, - int offset, - unsigned int protoff, - int *hotdrop) +ipt_recent_match(const struct sk_buff *skb, + const struct net_device *in, const struct net_device *out, + const struct xt_match *match, const void *matchinfo, + int offset, unsigned int protoff, int *hotdrop) { - int pkt_count, hits_found, ans; - unsigned long now; const struct ipt_recent_info *info = matchinfo; - u_int32_t addr = 0, time_temp; - u_int8_t ttl = skb->nh.iph->ttl; - int *hash_table; - int orig_hash_result, hash_result, temp, location = 0, time_loc, end_collision_chain = -1; - struct time_info_list *time_info; - struct recent_ip_tables *curr_table; - struct recent_ip_tables *last_table; - struct recent_ip_list *r_list; - -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": match() called\n"); -#endif - - /* Default is false ^ info->invert */ - ans = info->invert; + struct recent_table *t; + struct recent_entry *e; + u_int32_t addr; + u_int8_t ttl; + int ret = info->invert; -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": match(): name = '%s'\n",info->name); -#endif + if (info->side == IPT_RECENT_DEST) + addr = skb->nh.iph->daddr; + else + addr = skb->nh.iph->saddr; - /* if out != NULL then routing has been done and TTL changed. - * We change it back here internally for match what came in before routing. */ - if(out) ttl++; + ttl = skb->nh.iph->ttl; + /* use TTL as seen before forwarding */ + if (out && !skb->sk) + ttl++; - /* Find the right table */ spin_lock_bh(&recent_lock); - curr_table = r_tables; - while( (last_table = curr_table) && strncmp(info->name,curr_table->name,IPT_RECENT_NAME_LEN) && (curr_table = curr_table->next) ); - -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": match(): table found('%s')\n",info->name); -#endif - - spin_unlock_bh(&recent_lock); - - /* Table with this name not found, match impossible */ - if(!curr_table) { return ans; } - - /* Make sure no one is changing the list while we work with it */ - spin_lock_bh(&curr_table->list_lock); - - r_list = curr_table->table; - if(info->side == IPT_RECENT_DEST) addr = skb->nh.iph->daddr; else addr = skb->nh.iph->saddr; - - if(!addr) { -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": match() address (%u) invalid, leaving.\n",addr); -#endif - spin_unlock_bh(&curr_table->list_lock); - return ans; - } - -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": match(): checking table, addr: %u, ttl: %u, orig_ttl: %u\n",addr,ttl,skb->nh.iph->ttl); -#endif - - /* Get jiffies now in case they changed while we were waiting for a lock */ - now = jiffies; - hash_table = curr_table->hash_table; - time_info = curr_table->time_info; - - orig_hash_result = hash_result = hash_func(addr,ip_list_hash_size); - /* Hash entry at this result used */ - /* Check for TTL match if requested. If TTL is zero then a match would never - * happen, so match regardless of existing TTL in that case. Zero means the - * entry was added via the /proc interface anyway, so we will just use the - * first TTL we get for that IP address. */ - if(info->check_set & IPT_RECENT_TTL) { - while(hash_table[hash_result] != -1 && !(r_list[hash_table[hash_result]].addr == addr && - (!r_list[hash_table[hash_result]].ttl || r_list[hash_table[hash_result]].ttl == ttl))) { - /* Collision in hash table */ - hash_result = (hash_result + 1) % ip_list_hash_size; - } - } else { - while(hash_table[hash_result] != -1 && r_list[hash_table[hash_result]].addr != addr) { - /* Collision in hash table */ - hash_result = (hash_result + 1) % ip_list_hash_size; - } - } - - if(hash_table[hash_result] == -1 && !(info->check_set & IPT_RECENT_SET)) { - /* IP not in list and not asked to SET */ - spin_unlock_bh(&curr_table->list_lock); - return ans; - } - - /* Check if we need to handle the collision, do not need to on REMOVE */ - if(orig_hash_result != hash_result && !(info->check_set & IPT_RECENT_REMOVE)) { -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": match(): Collision in hash table. (or: %d,hr: %d,oa: %u,ha: %u)\n", - orig_hash_result, - hash_result, - r_list[hash_table[orig_hash_result]].addr, - addr); -#endif - - /* We had a collision. - * orig_hash_result is where we started, hash_result is where we ended up. - * So, swap them because we are likely to see the same guy again sooner */ -#ifdef DEBUG - if(debug) { - printk(KERN_INFO RECENT_NAME ": match(): Collision; hash_table[orig_hash_result] = %d\n",hash_table[orig_hash_result]); - printk(KERN_INFO RECENT_NAME ": match(): Collision; r_list[hash_table[orig_hash_result]].hash_entry = %d\n", - r_list[hash_table[orig_hash_result]].hash_entry); - } -#endif - - r_list[hash_table[orig_hash_result]].hash_entry = hash_result; - - - temp = hash_table[orig_hash_result]; -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": match(): Collision; hash_table[hash_result] = %d\n",hash_table[hash_result]); -#endif - hash_table[orig_hash_result] = hash_table[hash_result]; - hash_table[hash_result] = temp; - temp = hash_result; - hash_result = orig_hash_result; - orig_hash_result = temp; - time_info[r_list[hash_table[orig_hash_result]].time_pos].position = hash_table[orig_hash_result]; - if(hash_table[hash_result] != -1) { - r_list[hash_table[hash_result]].hash_entry = hash_result; - time_info[r_list[hash_table[hash_result]].time_pos].position = hash_table[hash_result]; - } - -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": match(): Collision handled.\n"); -#endif + t = recent_table_lookup(info->name); + e = recent_entry_lookup(t, addr, + info->check_set & IPT_RECENT_TTL ? ttl : 0); + if (e == NULL) { + if (!(info->check_set & IPT_RECENT_SET)) + goto out; + e = recent_entry_init(t, addr, ttl); + if (e == NULL) + *hotdrop = 1; + ret ^= 1; + goto out; } - if(hash_table[hash_result] == -1) { -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": match(): New table entry. (hr: %d,ha: %u)\n", - hash_result, addr); -#endif - - /* New item found and IPT_RECENT_SET, so we need to add it */ - location = time_info[curr_table->time_pos].position; - hash_table[r_list[location].hash_entry] = -1; - hash_table[hash_result] = location; - memset(r_list[location].last_pkts,0,ip_pkt_list_tot*sizeof(unsigned long)); - r_list[location].time_pos = curr_table->time_pos; - r_list[location].addr = addr; - r_list[location].ttl = ttl; - r_list[location].last_seen = now; - r_list[location].oldest_pkt = 1; - r_list[location].last_pkts[0] = now; - r_list[location].hash_entry = hash_result; - time_info[curr_table->time_pos].time = r_list[location].last_seen; - curr_table->time_pos = (curr_table->time_pos + 1) % ip_list_tot; - - ans = !info->invert; - } else { -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": match(): Existing table entry. (hr: %d,ha: %u)\n", - hash_result, - addr); -#endif - - /* Existing item found */ - location = hash_table[hash_result]; - /* We have a match on address, now to make sure it meets all requirements for a - * full match. */ - if(info->check_set & IPT_RECENT_CHECK || info->check_set & IPT_RECENT_UPDATE) { - if(!info->seconds && !info->hit_count) ans = !info->invert; else ans = info->invert; - if(info->seconds && !info->hit_count) { - if(time_before_eq(now,r_list[location].last_seen+info->seconds*HZ)) ans = !info->invert; else ans = info->invert; - } - 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; - } - if(info->hit_count && !info->seconds) { - 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; - hits_found++; - } - if(hits_found >= info->hit_count) ans = !info->invert; else ans = info->invert; + if (info->check_set & IPT_RECENT_SET) + ret ^= 1; + else if (info->check_set & IPT_RECENT_REMOVE) { + recent_entry_remove(t, e); + ret ^= 1; + } else if (info->check_set & (IPT_RECENT_CHECK | IPT_RECENT_UPDATE)) { + unsigned long t = jiffies - info->seconds * HZ; + unsigned int i, hits = 0; + + for (i = 0; i < e->nstamps; i++) { + if (info->seconds && time_after(t, e->stamps[i])) + continue; + if (++hits >= info->hit_count) { + ret ^= 1; + break; } } -#ifdef DEBUG - if(debug) { - if(ans) - printk(KERN_INFO RECENT_NAME ": match(): match addr: %u\n",addr); - else - printk(KERN_INFO RECENT_NAME ": match(): no match addr: %u\n",addr); - } -#endif - - /* If and only if we have been asked to SET, or to UPDATE (on match) do we add the - * current timestamp to the last_seen. */ - if((info->check_set & IPT_RECENT_SET && (ans = !info->invert)) || (info->check_set & IPT_RECENT_UPDATE && ans)) { -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": match(): SET or UPDATE; updating time info.\n"); -#endif - /* Have to update our time info */ - time_loc = r_list[location].time_pos; - time_info[time_loc].time = now; - time_info[time_loc].position = location; - while((time_info[(time_loc+1) % ip_list_tot].time < time_info[time_loc].time) && ((time_loc+1) % ip_list_tot) != curr_table->time_pos) { - time_temp = time_info[time_loc].time; - time_info[time_loc].time = time_info[(time_loc+1)%ip_list_tot].time; - time_info[(time_loc+1)%ip_list_tot].time = time_temp; - time_temp = time_info[time_loc].position; - time_info[time_loc].position = time_info[(time_loc+1)%ip_list_tot].position; - time_info[(time_loc+1)%ip_list_tot].position = time_temp; - r_list[time_info[time_loc].position].time_pos = time_loc; - r_list[time_info[(time_loc+1)%ip_list_tot].position].time_pos = (time_loc+1)%ip_list_tot; - time_loc = (time_loc+1) % ip_list_tot; - } - r_list[location].time_pos = time_loc; - r_list[location].ttl = ttl; - r_list[location].last_pkts[r_list[location].oldest_pkt] = now; - r_list[location].oldest_pkt = ++r_list[location].oldest_pkt % ip_pkt_list_tot; - r_list[location].last_seen = now; - } - /* If we have been asked to remove the entry from the list, just set it to 0 */ - if(info->check_set & IPT_RECENT_REMOVE) { -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": match(): REMOVE; clearing entry (or: %d, hr: %d).\n",orig_hash_result,hash_result); -#endif - /* Check if this is part of a collision chain */ - while(hash_table[(orig_hash_result+1) % ip_list_hash_size] != -1) { - orig_hash_result++; - if(hash_func(r_list[hash_table[orig_hash_result]].addr,ip_list_hash_size) == hash_result) { - /* Found collision chain, how deep does this rabbit hole go? */ -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": match(): REMOVE; found collision chain.\n"); -#endif - end_collision_chain = orig_hash_result; - } - } - if(end_collision_chain != -1) { -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": match(): REMOVE; part of collision chain, moving to end.\n"); -#endif - /* Part of a collision chain, swap it with the end of the chain - * before removing. */ - r_list[hash_table[end_collision_chain]].hash_entry = hash_result; - temp = hash_table[end_collision_chain]; - hash_table[end_collision_chain] = hash_table[hash_result]; - hash_table[hash_result] = temp; - time_info[r_list[hash_table[hash_result]].time_pos].position = hash_table[hash_result]; - hash_result = end_collision_chain; - r_list[hash_table[hash_result]].hash_entry = hash_result; - time_info[r_list[hash_table[hash_result]].time_pos].position = hash_table[hash_result]; - } - location = hash_table[hash_result]; - hash_table[r_list[location].hash_entry] = -1; - time_loc = r_list[location].time_pos; - time_info[time_loc].time = 0; - time_info[time_loc].position = location; - while((time_info[(time_loc+1) % ip_list_tot].time < time_info[time_loc].time) && ((time_loc+1) % ip_list_tot) != curr_table->time_pos) { - time_temp = time_info[time_loc].time; - time_info[time_loc].time = time_info[(time_loc+1)%ip_list_tot].time; - time_info[(time_loc+1)%ip_list_tot].time = time_temp; - time_temp = time_info[time_loc].position; - time_info[time_loc].position = time_info[(time_loc+1)%ip_list_tot].position; - time_info[(time_loc+1)%ip_list_tot].position = time_temp; - r_list[time_info[time_loc].position].time_pos = time_loc; - r_list[time_info[(time_loc+1)%ip_list_tot].position].time_pos = (time_loc+1)%ip_list_tot; - time_loc = (time_loc+1) % ip_list_tot; - } - r_list[location].time_pos = time_loc; - r_list[location].last_seen = 0; - r_list[location].addr = 0; - r_list[location].ttl = 0; - memset(r_list[location].last_pkts,0,ip_pkt_list_tot*sizeof(unsigned long)); - r_list[location].oldest_pkt = 0; - ans = !info->invert; - } - spin_unlock_bh(&curr_table->list_lock); - return ans; } - spin_unlock_bh(&curr_table->list_lock); -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": match() left.\n"); -#endif - return ans; + if (info->check_set & IPT_RECENT_SET || + (info->check_set & IPT_RECENT_UPDATE && ret)) { + recent_entry_update(t, e); + e->ttl = ttl; + } +out: + spin_unlock_bh(&recent_lock); + return ret; } -/* This function is to verify that the rule given during the userspace iptables - * command is correct. - * If the command is valid then we check if the table name referred to by the - * rule exists, if not it is created. - */ static int -checkentry(const char *tablename, - const void *ip, - const struct xt_match *match, - void *matchinfo, - unsigned int matchsize, - unsigned int hook_mask) +ipt_recent_checkentry(const char *tablename, const void *ip, + const struct xt_match *match, void *matchinfo, + unsigned int matchsize, unsigned int hook_mask) { - int flag = 0, c; - unsigned long *hold; const struct ipt_recent_info *info = matchinfo; - struct recent_ip_tables *curr_table, *find_table, *last_table; - -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": checkentry() entered.\n"); -#endif - - /* seconds and hit_count only valid for CHECK/UPDATE */ - if(info->check_set & IPT_RECENT_SET) { flag++; if(info->seconds || info->hit_count) return 0; } - if(info->check_set & IPT_RECENT_REMOVE) { flag++; if(info->seconds || info->hit_count) return 0; } - if(info->check_set & IPT_RECENT_CHECK) flag++; - if(info->check_set & IPT_RECENT_UPDATE) flag++; - - /* One and only one of these should ever be set */ - if(flag != 1) return 0; - - /* Name must be set to something */ - if(!info->name || !info->name[0]) return 0; + struct recent_table *t; + unsigned i; + int ret = 0; - /* Things look good, create a list for this if it does not exist */ - /* Lock the linked list while we play with it */ - spin_lock_bh(&recent_lock); - - /* Look for an entry with this name already created */ - /* Finds the end of the list and the entry before the end if current name does not exist */ - find_table = r_tables; - while( (last_table = find_table) && strncmp(info->name,find_table->name,IPT_RECENT_NAME_LEN) && (find_table = find_table->next) ); + if (hweight8(info->check_set & + (IPT_RECENT_SET | IPT_RECENT_REMOVE | + IPT_RECENT_CHECK | IPT_RECENT_UPDATE)) != 1) + return 0; + if ((info->check_set & (IPT_RECENT_SET | IPT_RECENT_REMOVE)) && + (info->seconds || info->hit_count)) + return 0; + if (info->name[0] == '\0' || + strnlen(info->name, IPT_RECENT_NAME_LEN) == IPT_RECENT_NAME_LEN) + return 0; - /* If a table already exists just increment the count on that table and return */ - if(find_table) { -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": checkentry: table found (%s), incrementing count.\n",info->name); -#endif - find_table->count++; - spin_unlock_bh(&recent_lock); - return 1; + mutex_lock(&recent_mutex); + t = recent_table_lookup(info->name); + if (t != NULL) { + t->refcnt++; + ret = 1; + goto out; } - spin_unlock_bh(&recent_lock); - - /* Table with this name not found */ - /* Allocate memory for new linked list item */ - -#ifdef DEBUG - if(debug) { - printk(KERN_INFO RECENT_NAME ": checkentry: no table found (%s)\n",info->name); - printk(KERN_INFO RECENT_NAME ": checkentry: Allocationg %d for link-list entry.\n",sizeof(struct recent_ip_tables)); + t = kzalloc(sizeof(*t) + sizeof(t->iphash[0]) * ip_list_hash_size, + GFP_KERNEL); + if (t == NULL) + goto out; + t->refcnt = 1; + strcpy(t->name, info->name); + INIT_LIST_HEAD(&t->lru_list); + for (i = 0; i < ip_list_hash_size; i++) + INIT_LIST_HEAD(&t->iphash[i]); +#ifdef CONFIG_PROC_FS + t->proc = create_proc_entry(t->name, ip_list_perms, proc_dir); + if (t->proc == NULL) { + kfree(t); + goto out; } + t->proc->proc_fops = &recent_fops; + t->proc->data = t; #endif + spin_lock_bh(&recent_lock); + list_add_tail(&t->list, &tables); + spin_unlock_bh(&recent_lock); + ret = 1; +out: + mutex_unlock(&recent_mutex); + return ret; +} - curr_table = vmalloc(sizeof(struct recent_ip_tables)); - if(curr_table == NULL) return 0; - - spin_lock_init(&curr_table->list_lock); - curr_table->next = NULL; - curr_table->count = 1; - curr_table->time_pos = 0; - strncpy(curr_table->name,info->name,IPT_RECENT_NAME_LEN); - curr_table->name[IPT_RECENT_NAME_LEN-1] = '\0'; - - /* Allocate memory for this table and the list of packets in each entry. */ -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": checkentry: Allocating %d for table (%s).\n", - sizeof(struct recent_ip_list)*ip_list_tot, - info->name); -#endif - - curr_table->table = vmalloc(sizeof(struct recent_ip_list)*ip_list_tot); - if(curr_table->table == NULL) { vfree(curr_table); return 0; } - memset(curr_table->table,0,sizeof(struct recent_ip_list)*ip_list_tot); -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": checkentry: Allocating %d for pkt_list.\n", - sizeof(unsigned long)*ip_pkt_list_tot*ip_list_tot); -#endif - - hold = vmalloc(sizeof(unsigned long)*ip_pkt_list_tot*ip_list_tot); -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": checkentry: After pkt_list allocation.\n"); -#endif - if(hold == NULL) { - printk(KERN_INFO RECENT_NAME ": checkentry: unable to allocate for pkt_list.\n"); - vfree(curr_table->table); - vfree(curr_table); - return 0; - } - for(c = 0; c < ip_list_tot; c++) { - curr_table->table[c].last_pkts = hold + c*ip_pkt_list_tot; - } +static void +ipt_recent_destroy(const struct xt_match *match, void *matchinfo, + unsigned int matchsize) +{ + const struct ipt_recent_info *info = matchinfo; + struct recent_table *t; - /* Allocate memory for the hash table */ -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": checkentry: Allocating %d for hash_table.\n", - sizeof(int)*ip_list_hash_size); + mutex_lock(&recent_mutex); + t = recent_table_lookup(info->name); + if (--t->refcnt == 0) { + spin_lock_bh(&recent_lock); + list_del(&t->list); + spin_unlock_bh(&recent_lock); + recent_table_flush(t); +#ifdef CONFIG_PROC_FS + remove_proc_entry(t->name, proc_dir); #endif - - curr_table->hash_table = vmalloc(sizeof(int)*ip_list_hash_size); - if(!curr_table->hash_table) { - printk(KERN_INFO RECENT_NAME ": checkentry: unable to allocate for hash_table.\n"); - vfree(hold); - vfree(curr_table->table); - vfree(curr_table); - return 0; - } - - for(c = 0; c < ip_list_hash_size; c++) { - curr_table->hash_table[c] = -1; + kfree(t); } + mutex_unlock(&recent_mutex); +} - /* Allocate memory for the time info */ -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": checkentry: Allocating %d for time_info.\n", - sizeof(struct time_info_list)*ip_list_tot); -#endif +#ifdef CONFIG_PROC_FS +struct recent_iter_state { + struct recent_table *table; + unsigned int bucket; +}; - curr_table->time_info = vmalloc(sizeof(struct time_info_list)*ip_list_tot); - if(!curr_table->time_info) { - printk(KERN_INFO RECENT_NAME ": checkentry: unable to allocate for time_info.\n"); - vfree(curr_table->hash_table); - vfree(hold); - vfree(curr_table->table); - vfree(curr_table); - return 0; - } - for(c = 0; c < ip_list_tot; c++) { - curr_table->time_info[c].position = c; - curr_table->time_info[c].time = 0; - } +static void *recent_seq_start(struct seq_file *seq, loff_t *pos) +{ + struct recent_iter_state *st = seq->private; + struct recent_table *t = st->table; + struct recent_entry *e; + loff_t p = *pos; - /* Put the new table in place */ spin_lock_bh(&recent_lock); - find_table = r_tables; - while( (last_table = find_table) && strncmp(info->name,find_table->name,IPT_RECENT_NAME_LEN) && (find_table = find_table->next) ); - - /* If a table already exists just increment the count on that table and return */ - if(find_table) { - find_table->count++; - spin_unlock_bh(&recent_lock); -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": checkentry: table found (%s), created by other process.\n",info->name); -#endif - vfree(curr_table->time_info); - vfree(curr_table->hash_table); - vfree(hold); - vfree(curr_table->table); - vfree(curr_table); - return 1; - } - if(!last_table) r_tables = curr_table; else last_table->next = curr_table; - - spin_unlock_bh(&recent_lock); -#ifdef CONFIG_PROC_FS - /* Create our proc 'status' entry. */ - curr_table->status_proc = create_proc_entry(curr_table->name, ip_list_perms, proc_net_ipt_recent); - if (!curr_table->status_proc) { - vfree(hold); - printk(KERN_INFO RECENT_NAME ": checkentry: unable to allocate for /proc entry.\n"); - /* Destroy the created table */ - spin_lock_bh(&recent_lock); - last_table = NULL; - curr_table = r_tables; - if(!curr_table) { -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": checkentry() create_proc failed, no tables.\n"); -#endif - spin_unlock_bh(&recent_lock); - return 0; - } - while( strncmp(info->name,curr_table->name,IPT_RECENT_NAME_LEN) && (last_table = curr_table) && (curr_table = curr_table->next) ); - if(!curr_table) { -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": checkentry() create_proc failed, table already destroyed.\n"); -#endif - spin_unlock_bh(&recent_lock); - return 0; + for (st->bucket = 0; st->bucket < ip_list_hash_size; st->bucket++) { + list_for_each_entry(e, &t->iphash[st->bucket], list) { + if (p-- == 0) + return e; } - if(last_table) last_table->next = curr_table->next; else r_tables = curr_table->next; - spin_unlock_bh(&recent_lock); - vfree(curr_table->time_info); - vfree(curr_table->hash_table); - vfree(curr_table->table); - vfree(curr_table); - return 0; } - - curr_table->status_proc->owner = THIS_MODULE; - curr_table->status_proc->data = curr_table; - wmb(); - curr_table->status_proc->read_proc = ip_recent_get_info; - curr_table->status_proc->write_proc = ip_recent_ctrl; -#endif /* CONFIG_PROC_FS */ - -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": checkentry() left.\n"); -#endif + return NULL; +} - return 1; +static void *recent_seq_next(struct seq_file *seq, void *v, loff_t *pos) +{ + struct recent_iter_state *st = seq->private; + struct recent_table *t = st->table; + struct recent_entry *e = v; + struct list_head *head = e->list.next; + + while (head == &t->iphash[st->bucket]) { + if (++st->bucket >= ip_list_hash_size) + return NULL; + head = t->iphash[st->bucket].next; + } + (*pos)++; + return list_entry(head, struct recent_entry, list); } -/* This function is called in the event that a rule matching this module is - * removed. - * When this happens we need to check if there are no other rules matching - * the table given. If that is the case then we remove the table and clean - * up its memory. - */ -static void -destroy(const struct xt_match *match, void *matchinfo, unsigned int matchsize) +static void recent_seq_stop(struct seq_file *s, void *v) { - const struct ipt_recent_info *info = matchinfo; - struct recent_ip_tables *curr_table, *last_table; + spin_unlock_bh(&recent_lock); +} -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": destroy() entered.\n"); -#endif +static int recent_seq_show(struct seq_file *seq, void *v) +{ + struct recent_entry *e = v; + unsigned int i; + + i = (e->index - 1) % ip_pkt_list_tot; + seq_printf(seq, "src=%u.%u.%u.%u ttl: %u last_seen: %lu oldest_pkt: %u", + NIPQUAD(e->addr), e->ttl, e->stamps[i], e->index); + for (i = 0; i < e->nstamps; i++) + seq_printf(seq, "%s %lu", i ? "," : "", e->stamps[i]); + seq_printf(seq, "\n"); + return 0; +} - if(matchsize != IPT_ALIGN(sizeof(struct ipt_recent_info))) return; +static struct seq_operations recent_seq_ops = { + .start = recent_seq_start, + .next = recent_seq_next, + .stop = recent_seq_stop, + .show = recent_seq_show, +}; - /* Lock the linked list while we play with it */ - spin_lock_bh(&recent_lock); +static int recent_seq_open(struct inode *inode, struct file *file) +{ + struct proc_dir_entry *pde = PDE(inode); + struct seq_file *seq; + struct recent_iter_state *st; + int ret; + + st = kzalloc(sizeof(*st), GFP_KERNEL); + if (st == NULL) + return -ENOMEM; + ret = seq_open(file, &recent_seq_ops); + if (ret) + kfree(st); + st->table = pde->data; + seq = file->private_data; + seq->private = st; + return ret; +} - /* Look for an entry with this name already created */ - /* Finds the end of the list and the entry before the end if current name does not exist */ - last_table = NULL; - curr_table = r_tables; - if(!curr_table) { -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": destroy() No tables found, leaving.\n"); -#endif +static ssize_t recent_proc_write(struct file *file, const char __user *input, + size_t size, loff_t *loff) +{ + struct proc_dir_entry *pde = PDE(file->f_dentry->d_inode); + struct recent_table *t = pde->data; + struct recent_entry *e; + char buf[sizeof("+255.255.255.255")], *c = buf; + u_int32_t addr; + int add; + + if (size > sizeof(buf)) + size = sizeof(buf); + if (copy_from_user(buf, input, size)) + return -EFAULT; + while (isspace(*c)) + c++; + + if (size - (c - buf) < 5) + return c - buf; + if (!strncmp(c, "clear", 5)) { + c += 5; + spin_lock_bh(&recent_lock); + recent_table_flush(t); spin_unlock_bh(&recent_lock); - return; + return c - buf; } - while( strncmp(info->name,curr_table->name,IPT_RECENT_NAME_LEN) && (last_table = curr_table) && (curr_table = curr_table->next) ); - /* If a table does not exist then do nothing and return */ - if(!curr_table) { -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": destroy() table not found, leaving.\n"); -#endif - spin_unlock_bh(&recent_lock); - return; + switch (*c) { + case '-': + add = 0; + c++; + break; + case '+': + c++; + default: + add = 1; + break; } + addr = in_aton(c); - curr_table->count--; - - /* If count is still non-zero then there are still rules referenceing it so we do nothing */ - if(curr_table->count) { -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": destroy() table found, non-zero count, leaving.\n"); -#endif - spin_unlock_bh(&recent_lock); - return; + spin_lock_bh(&recent_lock); + e = recent_entry_lookup(t, addr, 0); + if (e == NULL) { + if (add) + recent_entry_init(t, addr, 0); + } else { + if (add) + recent_entry_update(t, e); + else + recent_entry_remove(t, e); } - -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": destroy() table found, zero count, removing.\n"); -#endif - - /* Count must be zero so we remove this table from the list */ - if(last_table) last_table->next = curr_table->next; else r_tables = curr_table->next; - spin_unlock_bh(&recent_lock); + return size; +} - /* lock to make sure any late-runners still using this after we removed it from - * the list finish up then remove everything */ - spin_lock_bh(&curr_table->list_lock); - spin_unlock_bh(&curr_table->list_lock); - -#ifdef CONFIG_PROC_FS - if(curr_table->status_proc) remove_proc_entry(curr_table->name,proc_net_ipt_recent); +static struct file_operations recent_fops = { + .open = recent_seq_open, + .read = seq_read, + .write = recent_proc_write, + .release = seq_release_private, + .owner = THIS_MODULE, +}; #endif /* CONFIG_PROC_FS */ - vfree(curr_table->table[0].last_pkts); - vfree(curr_table->table); - vfree(curr_table->hash_table); - vfree(curr_table->time_info); - vfree(curr_table); - -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": destroy() left.\n"); -#endif - return; -} - -/* This is the structure we pass to ipt_register to register our - * module with iptables. - */ static struct ipt_match recent_match = { .name = "recent", - .match = match, + .match = ipt_recent_match, .matchsize = sizeof(struct ipt_recent_info), - .checkentry = checkentry, - .destroy = destroy, - .me = THIS_MODULE + .checkentry = ipt_recent_checkentry, + .destroy = ipt_recent_destroy, + .me = THIS_MODULE, }; -/* Kernel module initialization. */ static int __init ipt_recent_init(void) { - int err, count; + int err; - printk(version); -#ifdef CONFIG_PROC_FS - proc_net_ipt_recent = proc_mkdir("ipt_recent",proc_net); - if(!proc_net_ipt_recent) return -ENOMEM; -#endif - - if(ip_list_hash_size && ip_list_hash_size <= ip_list_tot) { - printk(KERN_WARNING RECENT_NAME ": ip_list_hash_size too small, resetting to default.\n"); - ip_list_hash_size = 0; - } - - if(!ip_list_hash_size) { - ip_list_hash_size = ip_list_tot*3; - count = 2*2; - while(ip_list_hash_size > count) count = count*2; - ip_list_hash_size = count; - } - -#ifdef DEBUG - if(debug) printk(KERN_INFO RECENT_NAME ": ip_list_hash_size: %d\n",ip_list_hash_size); -#endif + if (!ip_list_tot || !ip_pkt_list_tot || ip_pkt_list_tot > 255) + return -EINVAL; + ip_list_hash_size = 1 << fls(ip_list_tot); err = ipt_register_match(&recent_match); +#ifdef CONFIG_PROC_FS if (err) - remove_proc_entry("ipt_recent", proc_net); + return err; + proc_dir = proc_mkdir("ipt_recent", proc_net); + if (proc_dir == NULL) { + ipt_unregister_match(&recent_match); + err = -ENOMEM; + } +#endif return err; } -/* Kernel module destruction. */ -static void __exit ipt_recent_fini(void) +static void __exit ipt_recent_exit(void) { + BUG_ON(!list_empty(&tables)); ipt_unregister_match(&recent_match); - - remove_proc_entry("ipt_recent",proc_net); +#ifdef CONFIG_PROC_FS + remove_proc_entry("ipt_recent", proc_net); +#endif } -/* Register our module with the kernel. */ module_init(ipt_recent_init); -module_exit(ipt_recent_fini); +module_exit(ipt_recent_exit); diff --git a/net/ipv4/netfilter/iptable_mangle.c b/net/ipv4/netfilter/iptable_mangle.c index 397b95cc0..4e7998bed 100644 --- a/net/ipv4/netfilter/iptable_mangle.c +++ b/net/ipv4/netfilter/iptable_mangle.c @@ -10,7 +10,6 @@ * * Extended to all five netfilter hooks by Brad Chapman & Harald Welte */ -#include #include #include #include diff --git a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c index 77d974443..0af803df8 100644 --- a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c +++ b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c @@ -14,7 +14,6 @@ * Derived from net/ipv4/netfilter/ip_conntrack_standalone.c */ -#include #include #include #include @@ -145,7 +144,7 @@ static unsigned int ipv4_conntrack_help(unsigned int hooknum, /* This is where we call the helper: as the packet goes out. */ ct = nf_ct_get(*pskb, &ctinfo); - if (!ct) + if (!ct || ctinfo == IP_CT_RELATED + IP_CT_IS_REPLY) return NF_ACCEPT; help = nfct_help(ct); diff --git a/net/ipv4/netfilter/nf_conntrack_proto_icmp.c b/net/ipv4/netfilter/nf_conntrack_proto_icmp.c index 4b0d361cc..663a73ee3 100644 --- a/net/ipv4/netfilter/nf_conntrack_proto_icmp.c +++ b/net/ipv4/netfilter/nf_conntrack_proto_icmp.c @@ -235,7 +235,7 @@ icmp_error(struct sk_buff *skb, unsigned int dataoff, } /* See ip_conntrack_proto_tcp.c */ - if (hooknum == NF_IP_PRE_ROUTING && + if (nf_conntrack_checksum && hooknum == NF_IP_PRE_ROUTING && nf_ip_checksum(skb, hooknum, dataoff, 0)) { if (LOG_INVALID(IPPROTO_ICMP)) nf_log_packet(PF_INET, 0, skb, NULL, NULL, NULL, diff --git a/net/ipv4/protocol.c b/net/ipv4/protocol.c index 291831e79..05f511482 100644 --- a/net/ipv4/protocol.c +++ b/net/ipv4/protocol.c @@ -32,7 +32,6 @@ #include #include #include -#include #include #include #include diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index a4db06cb1..c9caff232 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c @@ -38,8 +38,7 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ - -#include + #include #include #include @@ -124,7 +123,7 @@ static inline int raw_addr_match ( } struct sock *__raw_v4_lookup(struct sock *sk, unsigned short num, - unsigned long raddr, unsigned long laddr, + __be32 raddr, __be32 laddr, int dif) { struct hlist_node *node; @@ -643,6 +642,7 @@ static int raw_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, if (sin) { sin->sin_family = AF_INET; sin->sin_addr.s_addr = skb->nh.iph->saddr; + sin->sin_port = 0; memset(&sin->sin_zero, 0, sizeof(sin->sin_zero)); } if (inet->cmsg_flags) diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 5fe2fcf99..b873cbcdd 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -64,7 +64,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include @@ -105,6 +104,7 @@ #include #include #include +#include #ifdef CONFIG_SYSCTL #include #endif @@ -206,21 +206,27 @@ __u8 ip_tos2prio[16] = { struct rt_hash_bucket { struct rtable *chain; }; -#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) +#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) || \ + defined(CONFIG_PROVE_LOCKING) /* * Instead of using one spinlock for each rt_hash_bucket, we use a table of spinlocks * The size of this table is a power of two and depends on the number of CPUS. + * (on lockdep we have a quite big spinlock_t, so keep the size down there) */ -#if NR_CPUS >= 32 -#define RT_HASH_LOCK_SZ 4096 -#elif NR_CPUS >= 16 -#define RT_HASH_LOCK_SZ 2048 -#elif NR_CPUS >= 8 -#define RT_HASH_LOCK_SZ 1024 -#elif NR_CPUS >= 4 -#define RT_HASH_LOCK_SZ 512 +#ifdef CONFIG_LOCKDEP +# define RT_HASH_LOCK_SZ 256 #else -#define RT_HASH_LOCK_SZ 256 +# if NR_CPUS >= 32 +# define RT_HASH_LOCK_SZ 4096 +# elif NR_CPUS >= 16 +# define RT_HASH_LOCK_SZ 2048 +# elif NR_CPUS >= 8 +# define RT_HASH_LOCK_SZ 1024 +# elif NR_CPUS >= 4 +# define RT_HASH_LOCK_SZ 512 +# else +# define RT_HASH_LOCK_SZ 256 +# endif #endif static spinlock_t *rt_hash_locks; @@ -244,7 +250,7 @@ static unsigned int rt_hash_rnd; static DEFINE_PER_CPU(struct rt_cache_stat, rt_cache_stat); #define RT_CACHE_STAT_INC(field) \ - (per_cpu(rt_cache_stat, raw_smp_processor_id()).field++) + (__raw_get_cpu_var(rt_cache_stat).field++) static int rt_intern_hash(unsigned hash, struct rtable *rth, struct rtable **res); @@ -1120,6 +1126,7 @@ void ip_rt_redirect(u32 old_gw, u32 daddr, u32 new_gw, struct rtable *rth, **rthp; u32 skeys[2] = { saddr, 0 }; int ikeys[2] = { dev->ifindex, 0 }; + struct netevent_redirect netevent; if (!in_dev) return; @@ -1211,6 +1218,11 @@ void ip_rt_redirect(u32 old_gw, u32 daddr, u32 new_gw, rt_drop(rt); goto do_next; } + + netevent.old = &rth->u.dst; + netevent.new = &rt->u.dst; + call_netevent_notifiers(NETEVENT_REDIRECT, + &netevent); rt_del(hash, rth); if (!rt_intern_hash(hash, rt, &rt)) @@ -1447,6 +1459,7 @@ static void ip_rt_update_pmtu(struct dst_entry *dst, u32 mtu) } dst->metrics[RTAX_MTU-1] = mtu; dst_set_expires(dst, ip_rt_mtu_expires); + call_netevent_notifiers(NETEVENT_PMTU_UPDATE, dst); } } diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c index 334b6ffa8..3b09153ba 100644 --- a/net/ipv4/sysctl_net_ipv4.c +++ b/net/ipv4/sysctl_net_ipv4.c @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include @@ -181,14 +180,6 @@ ctl_table ipv4_table[] = { .proc_handler = &ipv4_doint_and_flush, .strategy = &ipv4_doint_and_flush_strategy, }, - { - .ctl_name = NET_IPV4_AUTOCONFIG, - .procname = "ip_autoconfig", - .data = &ipv4_config.autoconfig, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = &proc_dointvec - }, { .ctl_name = NET_IPV4_NO_PMTU_DISC, .procname = "ip_no_pmtu_disc", @@ -731,6 +722,24 @@ ctl_table ipv4_table[] = { .mode = 0644, .proc_handler = &proc_dointvec }, +#ifdef CONFIG_NET_DMA + { + .ctl_name = NET_TCP_DMA_COPYBREAK, + .procname = "tcp_dma_copybreak", + .data = &sysctl_tcp_dma_copybreak, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec + }, +#endif + { + .ctl_name = NET_TCP_SLOW_START_AFTER_IDLE, + .procname = "tcp_slow_start_after_idle", + .data = &sysctl_tcp_slow_start_after_idle, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec + }, { .ctl_name = 0 } }; diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index e369c0b9d..f28f40642 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -247,7 +247,6 @@ * TCP_CLOSE socket is finished */ -#include #include #include #include @@ -265,7 +264,7 @@ #include #include #include - +#include #include #include @@ -644,7 +643,7 @@ static inline int select_size(struct sock *sk, struct tcp_sock *tp) int tmp = tp->mss_cache; if (sk->sk_route_caps & NETIF_F_SG) { - if (sk->sk_route_caps & NETIF_F_TSO) + if (sk_can_gso(sk)) tmp = 0; else { int pgbreak = SKB_MAX_HEAD(MAX_TCP_HEADER); @@ -933,7 +932,7 @@ static int tcp_recv_urg(struct sock *sk, long timeo, * calculation of whether or not we must ACK for the sake of * a window update. */ -void cleanup_rbuf(struct sock *sk, int copied) +void tcp_cleanup_rbuf(struct sock *sk, int copied) { struct tcp_sock *tp = tcp_sk(sk); int time_to_ack = 0; @@ -1068,11 +1067,11 @@ int tcp_read_sock(struct sock *sk, read_descriptor_t *desc, break; } if (skb->h.th->fin) { - sk_eat_skb(sk, skb); + sk_eat_skb(sk, skb, 0); ++seq; break; } - sk_eat_skb(sk, skb); + sk_eat_skb(sk, skb, 0); if (!desc->count) break; } @@ -1082,7 +1081,7 @@ int tcp_read_sock(struct sock *sk, read_descriptor_t *desc, /* Clean up data we have read: This will do ACK frames. */ if (copied) - cleanup_rbuf(sk, copied); + tcp_cleanup_rbuf(sk, copied); return copied; } @@ -1106,6 +1105,7 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, int target; /* Read at least this many bytes */ long timeo; struct task_struct *user_recv = NULL; + int copied_early = 0; lock_sock(sk); @@ -1129,6 +1129,17 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, target = sock_rcvlowat(sk, flags & MSG_WAITALL, len); +#ifdef CONFIG_NET_DMA + tp->ucopy.dma_chan = NULL; + preempt_disable(); + if ((len > sysctl_tcp_dma_copybreak) && !(flags & MSG_PEEK) && + !sysctl_tcp_low_latency && __get_cpu_var(softnet_data).net_dma) { + preempt_enable_no_resched(); + tp->ucopy.pinned_list = dma_pin_iovec_pages(msg->msg_iov, len); + } else + preempt_enable_no_resched(); +#endif + do { struct sk_buff *skb; u32 offset; @@ -1216,7 +1227,7 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, } } - cleanup_rbuf(sk, copied); + tcp_cleanup_rbuf(sk, copied); if (!sysctl_tcp_low_latency && tp->ucopy.task == user_recv) { /* Install new reader */ @@ -1270,6 +1281,10 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, } else sk_wait_data(sk, &timeo); +#ifdef CONFIG_NET_DMA + tp->ucopy.wakeup = 0; +#endif + if (user_recv) { int chunk; @@ -1325,13 +1340,39 @@ do_prequeue: } if (!(flags & MSG_TRUNC)) { - err = skb_copy_datagram_iovec(skb, offset, - msg->msg_iov, used); - if (err) { - /* Exception. Bailout! */ - if (!copied) - copied = -EFAULT; - break; +#ifdef CONFIG_NET_DMA + if (!tp->ucopy.dma_chan && tp->ucopy.pinned_list) + tp->ucopy.dma_chan = get_softnet_dma(); + + if (tp->ucopy.dma_chan) { + tp->ucopy.dma_cookie = dma_skb_copy_datagram_iovec( + tp->ucopy.dma_chan, skb, offset, + msg->msg_iov, used, + tp->ucopy.pinned_list); + + if (tp->ucopy.dma_cookie < 0) { + + printk(KERN_ALERT "dma_cookie < 0\n"); + + /* Exception. Bailout! */ + if (!copied) + copied = -EFAULT; + break; + } + if ((offset + used) == skb->len) + copied_early = 1; + + } else +#endif + { + err = skb_copy_datagram_iovec(skb, offset, + msg->msg_iov, used); + if (err) { + /* Exception. Bailout! */ + if (!copied) + copied = -EFAULT; + break; + } } } @@ -1351,15 +1392,19 @@ skip_copy: if (skb->h.th->fin) goto found_fin_ok; - if (!(flags & MSG_PEEK)) - sk_eat_skb(sk, skb); + if (!(flags & MSG_PEEK)) { + sk_eat_skb(sk, skb, copied_early); + copied_early = 0; + } continue; found_fin_ok: /* Process the FIN. */ ++*seq; - if (!(flags & MSG_PEEK)) - sk_eat_skb(sk, skb); + if (!(flags & MSG_PEEK)) { + sk_eat_skb(sk, skb, copied_early); + copied_early = 0; + } break; } while (len > 0); @@ -1382,12 +1427,42 @@ skip_copy: tp->ucopy.len = 0; } +#ifdef CONFIG_NET_DMA + if (tp->ucopy.dma_chan) { + struct sk_buff *skb; + dma_cookie_t done, used; + + dma_async_memcpy_issue_pending(tp->ucopy.dma_chan); + + while (dma_async_memcpy_complete(tp->ucopy.dma_chan, + tp->ucopy.dma_cookie, &done, + &used) == DMA_IN_PROGRESS) { + /* do partial cleanup of sk_async_wait_queue */ + while ((skb = skb_peek(&sk->sk_async_wait_queue)) && + (dma_async_is_complete(skb->dma_cookie, done, + used) == DMA_SUCCESS)) { + __skb_dequeue(&sk->sk_async_wait_queue); + kfree_skb(skb); + } + } + + /* Safe to free early-copied skbs now */ + __skb_queue_purge(&sk->sk_async_wait_queue); + dma_chan_put(tp->ucopy.dma_chan); + tp->ucopy.dma_chan = NULL; + } + if (tp->ucopy.pinned_list) { + dma_unpin_iovec_pages(tp->ucopy.pinned_list); + tp->ucopy.pinned_list = NULL; + } +#endif + /* According to UNIX98, msg_name/msg_namelen are ignored * on connected socket. I was just happy when found this 8) --ANK */ /* Clean up data we have read: This will do ACK frames. */ - cleanup_rbuf(sk, copied); + tcp_cleanup_rbuf(sk, copied); TCP_CHECK_TIMER(sk); release_sock(sk); @@ -1585,7 +1660,8 @@ adjudge_to_death: const int tmo = tcp_fin_time(sk); if (tmo > TCP_TIMEWAIT_LEN) { - inet_csk_reset_keepalive_timer(sk, tcp_fin_time(sk)); + inet_csk_reset_keepalive_timer(sk, + tmo - TCP_TIMEWAIT_LEN); } else { tcp_time_wait(sk, TCP_FIN_WAIT2, tmo); goto out; @@ -1654,6 +1730,9 @@ int tcp_disconnect(struct sock *sk, int flags) __skb_queue_purge(&sk->sk_receive_queue); sk_stream_writequeue_purge(sk); __skb_queue_purge(&tp->out_of_order_queue); +#ifdef CONFIG_NET_DMA + __skb_queue_purge(&sk->sk_async_wait_queue); +#endif inet->dport = 0; @@ -1854,7 +1933,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level, (TCPF_ESTABLISHED | TCPF_CLOSE_WAIT) && inet_csk_ack_scheduled(sk)) { icsk->icsk_ack.pending |= ICSK_ACK_PUSHED; - cleanup_rbuf(sk, 1); + tcp_cleanup_rbuf(sk, 1); if (!(val & 1)) icsk->icsk_ack.pingpong = 1; } @@ -2093,8 +2172,19 @@ struct sk_buff *tcp_tso_segment(struct sk_buff *skb, int features) if (skb_gso_ok(skb, features | NETIF_F_GSO_ROBUST)) { /* Packet is from an untrusted source, reset gso_segs. */ - int mss = skb_shinfo(skb)->gso_size; + int type = skb_shinfo(skb)->gso_type; + int mss; + + if (unlikely(type & + ~(SKB_GSO_TCPV4 | + SKB_GSO_DODGY | + SKB_GSO_TCP_ECN | + SKB_GSO_TCPV6 | + 0) || + !(type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6)))) + goto out; + mss = skb_shinfo(skb)->gso_size; skb_shinfo(skb)->gso_segs = (skb->len + mss - 1) / mss; segs = NULL; @@ -2137,6 +2227,7 @@ struct sk_buff *tcp_tso_segment(struct sk_buff *skb, int features) out: return segs; } +EXPORT_SYMBOL(tcp_tso_segment); extern void __skb_cb_too_small_for_tcp(int, int); extern struct tcp_congestion_ops tcp_reno; @@ -2259,4 +2350,4 @@ EXPORT_SYMBOL(tcp_sendpage); EXPORT_SYMBOL(tcp_setsockopt); EXPORT_SYMBOL(tcp_shutdown); EXPORT_SYMBOL(tcp_statistics); -EXPORT_SYMBOL_GPL(cleanup_rbuf); +EXPORT_SYMBOL_GPL(tcp_cleanup_rbuf); diff --git a/net/ipv4/tcp_bic.c b/net/ipv4/tcp_bic.c index 035f2092d..b0134ab08 100644 --- a/net/ipv4/tcp_bic.c +++ b/net/ipv4/tcp_bic.c @@ -12,7 +12,6 @@ * this behaves the same as the original Reno. */ -#include #include #include #include @@ -198,12 +197,6 @@ static u32 bictcp_undo_cwnd(struct sock *sk) return max(tp->snd_cwnd, ca->last_max_cwnd); } -static u32 bictcp_min_cwnd(struct sock *sk) -{ - const struct tcp_sock *tp = tcp_sk(sk); - return tp->snd_ssthresh; -} - static void bictcp_state(struct sock *sk, u8 new_state) { if (new_state == TCP_CA_Loss) @@ -231,7 +224,6 @@ static struct tcp_congestion_ops bictcp = { .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 = "bic", diff --git a/net/ipv4/tcp_cong.c b/net/ipv4/tcp_cong.c index 91c2f41c7..7ff2e4273 100644 --- a/net/ipv4/tcp_cong.c +++ b/net/ipv4/tcp_cong.c @@ -6,7 +6,6 @@ * Copyright (C) 2005 Stephen Hemminger */ -#include #include #include #include @@ -38,7 +37,7 @@ int tcp_register_congestion_control(struct tcp_congestion_ops *ca) int ret = 0; /* all algorithms must implement ssthresh and cong_avoid ops */ - if (!ca->ssthresh || !ca->cong_avoid || !ca->min_cwnd) { + if (!ca->ssthresh || !ca->cong_avoid) { printk(KERN_ERR "TCP %s does not implement required ops\n", ca->name); return -EINVAL; @@ -190,7 +189,7 @@ void tcp_slow_start(struct tcp_sock *tp) return; /* We MAY increase by 2 if discovered delayed ack */ - if (sysctl_tcp_abc > 1 && tp->bytes_acked > 2*tp->mss_cache) { + if (sysctl_tcp_abc > 1 && tp->bytes_acked >= 2*tp->mss_cache) { if (tp->snd_cwnd < tp->snd_cwnd_clamp) tp->snd_cwnd++; } @@ -251,8 +250,8 @@ u32 tcp_reno_ssthresh(struct sock *sk) } EXPORT_SYMBOL_GPL(tcp_reno_ssthresh); -/* Lower bound on congestion window. */ -u32 tcp_reno_min_cwnd(struct sock *sk) +/* Lower bound on congestion window with halving. */ +u32 tcp_reno_min_cwnd(const struct sock *sk) { const struct tcp_sock *tp = tcp_sk(sk); return tp->snd_ssthresh/2; diff --git a/net/ipv4/tcp_cubic.c b/net/ipv4/tcp_cubic.c index 31a4986df..c3b01b571 100644 --- a/net/ipv4/tcp_cubic.c +++ b/net/ipv4/tcp_cubic.c @@ -12,7 +12,6 @@ * this behaves the same as the original Reno. */ -#include #include #include #include @@ -191,7 +190,7 @@ static inline void bictcp_update(struct bictcp *ca, u32 cwnd) */ /* change the unit from HZ to bictcp_HZ */ - t = ((tcp_time_stamp + ca->delay_min - ca->epoch_start) + t = ((tcp_time_stamp + (ca->delay_min>>3) - ca->epoch_start) << BICTCP_HZ) / HZ; if (t < ca->bic_K) /* t - K */ @@ -260,7 +259,7 @@ static inline void measure_delay(struct sock *sk) (s32)(tcp_time_stamp - ca->epoch_start) < HZ) return; - delay = tcp_time_stamp - tp->rx_opt.rcv_tsecr; + delay = (tcp_time_stamp - tp->rx_opt.rcv_tsecr)<<3; if (delay == 0) delay = 1; @@ -325,11 +324,6 @@ static u32 bictcp_undo_cwnd(struct sock *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) @@ -357,7 +351,6 @@ static struct tcp_congestion_ops cubictcp = { .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", @@ -373,7 +366,7 @@ static int __init cubictcp_register(void) beta_scale = 8*(BICTCP_BETA_SCALE+beta)/ 3 / (BICTCP_BETA_SCALE - beta); - cube_rtt_scale = (bic_scale << 3) / 10; /* 1024*c/rtt */ + cube_rtt_scale = (bic_scale * 10); /* 1024*c/rtt */ /* calculate the "K" for (wmax-cwnd) = c/rtt * K^3 * so K = cubic_root( (wmax-cwnd)*rtt/c ) diff --git a/net/ipv4/tcp_diag.c b/net/ipv4/tcp_diag.c index c148c1081..57c5f0b10 100644 --- a/net/ipv4/tcp_diag.c +++ b/net/ipv4/tcp_diag.c @@ -11,7 +11,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include @@ -26,7 +25,10 @@ static void tcp_diag_get_info(struct sock *sk, struct inet_diag_msg *r, const struct tcp_sock *tp = tcp_sk(sk); struct tcp_info *info = _info; - r->idiag_rqueue = tp->rcv_nxt - tp->copied_seq; + if (sk->sk_state == TCP_LISTEN) + r->idiag_rqueue = sk->sk_ack_backlog; + else + r->idiag_rqueue = tp->rcv_nxt - tp->copied_seq; r->idiag_wqueue = tp->write_seq - tp->snd_una; if (info != NULL) tcp_get_info(sk, info); diff --git a/net/ipv4/tcp_highspeed.c b/net/ipv4/tcp_highspeed.c index ba7c63ca5..fa3e1aad6 100644 --- a/net/ipv4/tcp_highspeed.c +++ b/net/ipv4/tcp_highspeed.c @@ -6,7 +6,6 @@ * John Heffner */ -#include #include #include @@ -98,6 +97,10 @@ struct hstcp { u32 ai; }; +static int max_ssthresh = 100; +module_param(max_ssthresh, int, 0644); +MODULE_PARM_DESC(max_ssthresh, "limited slow start threshold (RFC3742)"); + static void hstcp_init(struct sock *sk) { struct tcp_sock *tp = tcp_sk(sk); @@ -119,17 +122,36 @@ static void hstcp_cong_avoid(struct sock *sk, u32 adk, u32 rtt, if (!tcp_is_cwnd_limited(sk, in_flight)) return; - if (tp->snd_cwnd <= tp->snd_ssthresh) - tcp_slow_start(tp); - else { - /* Update AIMD parameters */ + if (tp->snd_cwnd <= tp->snd_ssthresh) { + /* RFC3742: limited slow start + * the window is increased by 1/K MSS for each arriving ACK, + * for K = int(cwnd/(0.5 max_ssthresh)) + */ + if (max_ssthresh > 0 && tp->snd_cwnd > max_ssthresh) { + u32 k = max(tp->snd_cwnd / (max_ssthresh >> 1), 1U); + if (++tp->snd_cwnd_cnt >= k) { + if (tp->snd_cwnd < tp->snd_cwnd_clamp) + tp->snd_cwnd++; + tp->snd_cwnd_cnt = 0; + } + } else { + if (tp->snd_cwnd < tp->snd_cwnd_clamp) + tp->snd_cwnd++; + } + } else { + /* Update AIMD parameters. + * + * We want to guarantee that: + * hstcp_aimd_vals[ca->ai-1].cwnd < + * snd_cwnd <= + * hstcp_aimd_vals[ca->ai].cwnd + */ if (tp->snd_cwnd > hstcp_aimd_vals[ca->ai].cwnd) { while (tp->snd_cwnd > hstcp_aimd_vals[ca->ai].cwnd && ca->ai < HSTCP_AIMD_MAX - 1) ca->ai++; - } else if (tp->snd_cwnd < hstcp_aimd_vals[ca->ai].cwnd) { - while (tp->snd_cwnd > hstcp_aimd_vals[ca->ai].cwnd && - ca->ai > 0) + } else if (ca->ai && tp->snd_cwnd <= hstcp_aimd_vals[ca->ai-1].cwnd) { + while (ca->ai && tp->snd_cwnd <= hstcp_aimd_vals[ca->ai-1].cwnd) ca->ai--; } diff --git a/net/ipv4/tcp_htcp.c b/net/ipv4/tcp_htcp.c index 1b2ff53f9..6edfe5e45 100644 --- a/net/ipv4/tcp_htcp.c +++ b/net/ipv4/tcp_htcp.c @@ -6,7 +6,6 @@ * http://www.hamilton.ie/net/htcp3.pdf */ -#include #include #include #include @@ -246,14 +245,6 @@ static void htcp_cong_avoid(struct sock *sk, u32 ack, u32 rtt, } } -/* Lower bound on congestion window. */ -static u32 htcp_min_cwnd(struct sock *sk) -{ - const struct tcp_sock *tp = tcp_sk(sk); - return tp->snd_ssthresh; -} - - static void htcp_init(struct sock *sk) { struct htcp *ca = inet_csk_ca(sk); @@ -285,7 +276,6 @@ static void htcp_state(struct sock *sk, u8 new_state) static struct tcp_congestion_ops htcp = { .init = htcp_init, .ssthresh = htcp_recalc_ssthresh, - .min_cwnd = htcp_min_cwnd, .cong_avoid = htcp_cong_avoid, .set_state = htcp_state, .undo_cwnd = htcp_cwnd_undo, diff --git a/net/ipv4/tcp_hybla.c b/net/ipv4/tcp_hybla.c index 40dbb3877..7406e0c5f 100644 --- a/net/ipv4/tcp_hybla.c +++ b/net/ipv4/tcp_hybla.c @@ -10,7 +10,6 @@ * root at danielinux.net */ -#include #include #include diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 0eadd3a27..39dca516d 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -63,7 +63,6 @@ * Pasi Sarolahti: F-RTO for dealing with spurious RTOs */ -#include #include #include #include @@ -71,6 +70,7 @@ #include #include #include +#include int sysctl_tcp_timestamps = 1; int sysctl_tcp_window_scaling = 1; @@ -89,7 +89,7 @@ int sysctl_tcp_frto; int sysctl_tcp_nometrics_save; int sysctl_tcp_moderate_rcvbuf = 1; -int sysctl_tcp_abc = 1; +int sysctl_tcp_abc; #define FLAG_DATA 0x01 /* Incoming frame contained data. */ #define FLAG_WIN_UPDATE 0x02 /* Incoming ACK was a window update. */ @@ -1688,17 +1688,26 @@ static inline void tcp_moderate_cwnd(struct tcp_sock *tp) tp->snd_cwnd_stamp = tcp_time_stamp; } +/* Lower bound on congestion window is slow start threshold + * unless congestion avoidance choice decides to overide it. + */ +static inline u32 tcp_cwnd_min(const struct sock *sk) +{ + const struct tcp_congestion_ops *ca_ops = inet_csk(sk)->icsk_ca_ops; + + return ca_ops->min_cwnd ? ca_ops->min_cwnd(sk) : tcp_sk(sk)->snd_ssthresh; +} + /* Decrease cwnd each second ack. */ static void tcp_cwnd_down(struct sock *sk) { - const struct inet_connection_sock *icsk = inet_csk(sk); struct tcp_sock *tp = tcp_sk(sk); int decr = tp->snd_cwnd_cnt + 1; tp->snd_cwnd_cnt = decr&1; decr >>= 1; - if (decr && tp->snd_cwnd > icsk->icsk_ca_ops->min_cwnd(sk)) + if (decr && tp->snd_cwnd > tcp_cwnd_min(sk)) tp->snd_cwnd -= decr; tp->snd_cwnd = min(tp->snd_cwnd, tcp_packets_in_flight(tp)+1); @@ -2228,13 +2237,12 @@ static int tcp_tso_acked(struct sock *sk, struct sk_buff *skb, return acked; } -static u32 tcp_usrtt(const struct sk_buff *skb) +static u32 tcp_usrtt(struct timeval *tv) { - struct timeval tv, now; + struct timeval now; do_gettimeofday(&now); - skb_get_timestamp(skb, &tv); - return (now.tv_sec - tv.tv_sec) * 1000000 + (now.tv_usec - tv.tv_usec); + return (now.tv_sec - tv->tv_sec) * 1000000 + (now.tv_usec - tv->tv_usec); } /* Remove acknowledged frames from the retransmission queue. */ @@ -2249,6 +2257,7 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p) u32 pkts_acked = 0; void (*rtt_sample)(struct sock *sk, u32 usrtt) = icsk->icsk_ca_ops->rtt_sample; + struct timeval tv; while ((skb = skb_peek(&sk->sk_write_queue)) && skb != sk->sk_send_head) { @@ -2297,8 +2306,7 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p) seq_rtt = -1; } else if (seq_rtt < 0) { seq_rtt = now - scb->when; - if (rtt_sample) - (*rtt_sample)(sk, tcp_usrtt(skb)); + skb_get_timestamp(skb, &tv); } if (sacked & TCPCB_SACKED_ACKED) tp->sacked_out -= tcp_skb_pcount(skb); @@ -2311,8 +2319,7 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p) } } else if (seq_rtt < 0) { seq_rtt = now - scb->when; - if (rtt_sample) - (*rtt_sample)(sk, tcp_usrtt(skb)); + skb_get_timestamp(skb, &tv); } tcp_dec_pcount_approx(&tp->fackets_out, skb); tcp_packets_out_dec(tp, skb); @@ -2324,6 +2331,8 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p) if (acked&FLAG_ACKED) { tcp_ack_update_rtt(sk, acked, seq_rtt); tcp_ack_packets_out(sk, tp); + if (rtt_sample && !(acked & FLAG_RETRANS_DATA_ACKED)) + (*rtt_sample)(sk, tcp_usrtt(&tv)); if (icsk->icsk_ca_ops->pkts_acked) icsk->icsk_ca_ops->pkts_acked(sk, pkts_acked); @@ -2496,8 +2505,13 @@ static int tcp_ack(struct sock *sk, struct sk_buff *skb, int flag) if (before(ack, prior_snd_una)) goto old_ack; - if (sysctl_tcp_abc && icsk->icsk_ca_state < TCP_CA_CWR) - tp->bytes_acked += ack - prior_snd_una; + if (sysctl_tcp_abc) { + if (icsk->icsk_ca_state < TCP_CA_CWR) + tp->bytes_acked += ack - prior_snd_una; + else if (icsk->icsk_ca_state == TCP_CA_Loss) + /* we assume just one segment left network */ + tp->bytes_acked += min(ack - prior_snd_una, tp->mss_cache); + } if (!(flag&FLAG_SLOWPATH) && after(ack, prior_snd_una)) { /* Window is constant, pure forward advance. @@ -3533,7 +3547,8 @@ void tcp_cwnd_application_limited(struct sock *sk) if (inet_csk(sk)->icsk_ca_state == TCP_CA_Open && sk->sk_socket && !test_bit(SOCK_NOSPACE, &sk->sk_socket->flags)) { /* Limited by application or receiver window. */ - u32 win_used = max(tp->snd_cwnd_used, 2U); + u32 init_win = tcp_init_cwnd(tp, __sk_dst_get(sk)); + u32 win_used = max(tp->snd_cwnd_used, init_win); if (win_used < tp->snd_cwnd) { tp->snd_ssthresh = tcp_current_ssthresh(sk); tp->snd_cwnd = (tp->snd_cwnd + win_used) >> 1; @@ -3786,6 +3801,50 @@ static inline int tcp_checksum_complete_user(struct sock *sk, struct sk_buff *sk __tcp_checksum_complete_user(sk, skb); } +#ifdef CONFIG_NET_DMA +static int tcp_dma_try_early_copy(struct sock *sk, struct sk_buff *skb, int hlen) +{ + struct tcp_sock *tp = tcp_sk(sk); + int chunk = skb->len - hlen; + int dma_cookie; + int copied_early = 0; + + if (tp->ucopy.wakeup) + return 0; + + if (!tp->ucopy.dma_chan && tp->ucopy.pinned_list) + tp->ucopy.dma_chan = get_softnet_dma(); + + if (tp->ucopy.dma_chan && skb->ip_summed == CHECKSUM_UNNECESSARY) { + + dma_cookie = dma_skb_copy_datagram_iovec(tp->ucopy.dma_chan, + skb, hlen, tp->ucopy.iov, chunk, tp->ucopy.pinned_list); + + if (dma_cookie < 0) + goto out; + + tp->ucopy.dma_cookie = dma_cookie; + copied_early = 1; + + tp->ucopy.len -= chunk; + tp->copied_seq += chunk; + tcp_rcv_space_adjust(sk); + + if ((tp->ucopy.len == 0) || + (tcp_flag_word(skb->h.th) & TCP_FLAG_PSH) || + (atomic_read(&sk->sk_rmem_alloc) > (sk->sk_rcvbuf >> 1))) { + tp->ucopy.wakeup = 1; + sk->sk_data_ready(sk, 0); + } + } else if (chunk > 0) { + tp->ucopy.wakeup = 1; + sk->sk_data_ready(sk, 0); + } +out: + return copied_early; +} +#endif /* CONFIG_NET_DMA */ + /* * TCP receive function for the ESTABLISHED state. * @@ -3887,8 +3946,6 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb, tp->rcv_nxt == tp->rcv_wup) tcp_store_ts_recent(tp); - tcp_rcv_rtt_measure_ts(sk, skb); - /* We know that such packets are checksummed * on entry. */ @@ -3902,14 +3959,23 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb, } } else { int eaten = 0; + int copied_early = 0; - if (tp->ucopy.task == current && - tp->copied_seq == tp->rcv_nxt && - len - tcp_header_len <= tp->ucopy.len && - sock_owned_by_user(sk)) { - __set_current_state(TASK_RUNNING); + if (tp->copied_seq == tp->rcv_nxt && + len - tcp_header_len <= tp->ucopy.len) { +#ifdef CONFIG_NET_DMA + if (tcp_dma_try_early_copy(sk, skb, tcp_header_len)) { + copied_early = 1; + eaten = 1; + } +#endif + if (tp->ucopy.task == current && sock_owned_by_user(sk) && !copied_early) { + __set_current_state(TASK_RUNNING); - if (!tcp_copy_to_iovec(sk, skb, tcp_header_len)) { + if (!tcp_copy_to_iovec(sk, skb, tcp_header_len)) + eaten = 1; + } + if (eaten) { /* Predicted packet is in window by definition. * seq == rcv_nxt and rcv_wup <= rcv_nxt. * Hence, check seq<=rcv_wup reduces to: @@ -3925,8 +3991,9 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb, __skb_pull(skb, tcp_header_len); tp->rcv_nxt = TCP_SKB_CB(skb)->end_seq; NET_INC_STATS_BH(LINUX_MIB_TCPHPHITSTOUSER); - eaten = 1; } + if (copied_early) + tcp_cleanup_rbuf(sk, skb->len); } if (!eaten) { if (tcp_checksum_complete_user(sk, skb)) @@ -3967,6 +4034,11 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb, __tcp_ack_snd_check(sk, 0); no_ack: +#ifdef CONFIG_NET_DMA + if (copied_early) + __skb_queue_tail(&sk->sk_async_wait_queue, skb); + else +#endif if (eaten) __kfree_skb(skb); else @@ -4112,8 +4184,6 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, */ TCP_ECN_rcv_synack(tp, th); - if (tp->ecn_flags&TCP_ECN_OK) - sock_set_flag(sk, SOCK_NO_LARGESEND); tp->snd_wl1 = TCP_SKB_CB(skb)->seq; tcp_ack(sk, skb, FLAG_SLOWPATH); @@ -4256,8 +4326,6 @@ discard: tp->max_window = tp->snd_wnd; TCP_ECN_rcv_syn(tp, th); - if (tp->ecn_flags&TCP_ECN_OK) - sock_set_flag(sk, SOCK_NO_LARGESEND); tcp_mtup_init(sk); tcp_sync_mss(sk, icsk->icsk_pmtu_cookie); diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 17f5857c5..2a54ae010 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -52,7 +52,6 @@ * a single port at the same time. */ -#include #include #include @@ -71,6 +70,7 @@ #include #include #include +#include #include #include @@ -91,7 +91,7 @@ static struct socket *tcp_socket; 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, + .lhash_lock = __RW_LOCK_UNLOCKED(tcp_hashinfo.lhash_lock), .lhash_users = ATOMIC_INIT(0), .lhash_wait = __WAIT_QUEUE_HEAD_INITIALIZER(tcp_hashinfo.lhash_wait), }; @@ -242,6 +242,7 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) goto failure; /* OK, now commit destination to socket. */ + sk->sk_gso_type = SKB_GSO_TCPV4; sk_setup_caps(sk, &rt->u.dst); if (!tp->write_seq) @@ -438,7 +439,6 @@ void tcp_v4_err(struct sk_buff *skb, u32 info) It can f.e. if SYNs crossed. */ if (!sock_owned_by_user(sk)) { - TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS); sk->sk_err = err; sk->sk_error_report(sk); @@ -874,7 +874,6 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb) drop_and_free: reqsk_free(req); drop: - TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS); return 0; } @@ -902,6 +901,7 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb, if (!newsk) goto exit; + newsk->sk_gso_type = SKB_GSO_TCPV4; sk_setup_caps(newsk, dst); newtp = tcp_sk(newsk); @@ -1123,11 +1123,21 @@ process: skb->dev = NULL; - bh_lock_sock(sk); + bh_lock_sock_nested(sk); ret = 0; if (!sock_owned_by_user(sk)) { - if (!tcp_prequeue(sk, skb)) +#ifdef CONFIG_NET_DMA + struct tcp_sock *tp = tcp_sk(sk); + if (!tp->ucopy.dma_chan && tp->ucopy.pinned_list) + tp->ucopy.dma_chan = get_softnet_dma(); + if (tp->ucopy.dma_chan) + ret = tcp_v4_do_rcv(sk, skb); + else +#endif + { + if (!tcp_prequeue(sk, skb)) ret = tcp_v4_do_rcv(sk, skb); + } } else sk_add_backlog(sk, skb); bh_unlock_sock(sk); @@ -1335,6 +1345,11 @@ int tcp_v4_destroy_sock(struct sock *sk) /* Cleans up our, hopefully empty, out_of_order_queue. */ __skb_queue_purge(&tp->out_of_order_queue); +#ifdef CONFIG_NET_DMA + /* Cleans up our sk_async_wait_queue */ + __skb_queue_purge(&sk->sk_async_wait_queue); +#endif + /* Clean prequeue, it must be empty really */ __skb_queue_purge(&tp->ucopy.prequeue); @@ -1668,10 +1683,9 @@ static int tcp_seq_open(struct inode *inode, struct file *file) if (unlikely(afinfo == NULL)) return -EINVAL; - s = kmalloc(sizeof(*s), GFP_KERNEL); + s = kzalloc(sizeof(*s), GFP_KERNEL); if (!s) return -ENOMEM; - memset(s, 0, sizeof(*s)); s->family = afinfo->family; s->seq_ops.start = tcp_seq_start; s->seq_ops.next = tcp_seq_next; @@ -1773,7 +1787,8 @@ static void get_tcp4_sock(struct sock *sp, char *tmpbuf, int i) sprintf(tmpbuf, "%4d: %08X:%04X %08X:%04X %02X %08X:%08X %02X:%08lX " "%08X %5d %8d %lu %d %p %u %u %u %u %d", i, src, srcp, dest, destp, sp->sk_state, - tp->write_seq - tp->snd_una, tp->rcv_nxt - tp->copied_seq, + tp->write_seq - tp->snd_una, + (sp->sk_state == TCP_LISTEN) ? sp->sk_ack_backlog : (tp->rcv_nxt - tp->copied_seq), timer_active, jiffies_to_clock_t(timer_expires - jiffies), icsk->icsk_retransmits, diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c index 0582ec2ce..c4a8402a7 100644 --- a/net/ipv4/tcp_minisocks.c +++ b/net/ipv4/tcp_minisocks.c @@ -20,7 +20,6 @@ * Jorge Cwik, */ -#include #include #include #include @@ -45,7 +44,7 @@ int sysctl_tcp_abort_on_overflow; struct inet_timewait_death_row tcp_death_row = { .sysctl_max_tw_buckets = NR_FILE * 2, .period = TCP_TIMEWAIT_LEN / INET_TWDR_TWKILL_SLOTS, - .death_lock = SPIN_LOCK_UNLOCKED, + .death_lock = __SPIN_LOCK_UNLOCKED(tcp_death_row.death_lock), .hashinfo = &tcp_hashinfo, .tw_timer = TIMER_INITIALIZER(inet_twdr_hangman, 0, (unsigned long)&tcp_death_row), @@ -449,8 +448,6 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct request_sock *req, newicsk->icsk_ack.last_seg_size = skb->len - newtp->tcp_header_len; newtp->rx_opt.mss_clamp = req->mss; TCP_ECN_openreq_child(newtp, req); - if (newtp->ecn_flags&TCP_ECN_OK) - sock_set_flag(newsk, SOCK_NO_LARGESEND); TCP_INC_STATS_BH(TCP_MIB_PASSIVEOPENS); } @@ -601,8 +598,10 @@ struct sock *tcp_check_req(struct sock *sk,struct sk_buff *skb, /* RFC793: "second check the RST bit" and * "fourth, check the SYN bit" */ - if (flg & (TCP_FLAG_RST|TCP_FLAG_SYN)) + if (flg & (TCP_FLAG_RST|TCP_FLAG_SYN)) { + TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS); goto embryonic_reset; + } /* ACK sequence verified above, just make sure ACK is * set. If ACK not set, just silently drop the packet. diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index ba50b52f8..5dc3118df 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c @@ -59,6 +59,9 @@ int sysctl_tcp_tso_win_divisor = 3; int sysctl_tcp_mtu_probing = 0; int sysctl_tcp_base_mss = 512; +/* By default, RFC2861 behavior. */ +int sysctl_tcp_slow_start_after_idle = 1; + static void update_send_head(struct sock *sk, struct tcp_sock *tp, struct sk_buff *skb) { @@ -138,7 +141,8 @@ static void tcp_event_data_sent(struct tcp_sock *tp, struct inet_connection_sock *icsk = inet_csk(sk); const u32 now = tcp_time_stamp; - if (!tp->packets_out && (s32)(now - tp->lsndtime) > icsk->icsk_rto) + if (sysctl_tcp_slow_start_after_idle && + (!tp->packets_out && (s32)(now - tp->lsndtime) > icsk->icsk_rto)) tcp_cwnd_restart(sk, __sk_dst_get(sk)); tp->lsndtime = now; @@ -463,7 +467,8 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it, if (skb->len != tcp_header_size) tcp_event_data_sent(tp, skb, sk); - TCP_INC_STATS(TCP_MIB_OUTSEGS); + if (after(tcb->end_seq, tp->snd_nxt) || tcb->seq == tcb->end_seq) + TCP_INC_STATS(TCP_MIB_OUTSEGS); err = icsk->icsk_af_ops->queue_xmit(skb, 0); if (likely(err <= 0)) @@ -507,8 +512,7 @@ static void tcp_queue_skb(struct sock *sk, struct sk_buff *skb) static void tcp_set_skb_tso_segs(struct sock *sk, struct sk_buff *skb, unsigned int mss_now) { - if (skb->len <= mss_now || - !(sk->sk_route_caps & NETIF_F_TSO)) { + if (skb->len <= mss_now || !sk_can_gso(sk)) { /* Avoid the costly divide in the normal * non-TSO case. */ @@ -522,7 +526,7 @@ static void tcp_set_skb_tso_segs(struct sock *sk, struct sk_buff *skb, unsigned factor /= mss_now; skb_shinfo(skb)->gso_segs = factor; skb_shinfo(skb)->gso_size = mss_now; - skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4; + skb_shinfo(skb)->gso_type = sk->sk_gso_type; } } @@ -821,9 +825,7 @@ unsigned int tcp_current_mss(struct sock *sk, int large_allowed) mss_now = tp->mss_cache; - if (large_allowed && - (sk->sk_route_caps & NETIF_F_TSO) && - !tp->urg_mode) + if (large_allowed && sk_can_gso(sk) && !tp->urg_mode) doing_tso = 1; if (dst) { @@ -2044,8 +2046,6 @@ struct sk_buff * tcp_make_synack(struct sock *sk, struct dst_entry *dst, memset(th, 0, sizeof(struct tcphdr)); th->syn = 1; th->ack = 1; - if (dst->dev->features&NETIF_F_TSO) - ireq->ecn_ok = 0; TCP_ECN_make_synack(req, th); th->source = inet_sk(sk)->sport; th->dest = ireq->rmt_port; @@ -2162,10 +2162,9 @@ int tcp_connect(struct sock *sk) skb_shinfo(buff)->gso_size = 0; skb_shinfo(buff)->gso_type = 0; buff->csum = 0; + tp->snd_nxt = tp->write_seq; TCP_SKB_CB(buff)->seq = tp->write_seq++; TCP_SKB_CB(buff)->end_seq = tp->write_seq; - tp->snd_nxt = tp->write_seq; - tp->pushed_seq = tp->write_seq; /* Send it off. */ TCP_SKB_CB(buff)->when = tcp_time_stamp; @@ -2175,6 +2174,12 @@ int tcp_connect(struct sock *sk) sk_charge_skb(sk, buff); tp->packets_out += tcp_skb_pcount(buff); tcp_transmit_skb(sk, buff, 1, GFP_KERNEL); + + /* We change tp->snd_nxt after the tcp_transmit_skb() call + * in order to make this packet get counted in tcpOutSegs. + */ + tp->snd_nxt = tp->write_seq; + tp->pushed_seq = tp->write_seq; TCP_INC_STATS(TCP_MIB_ACTIVEOPENS); /* Timer for repeating the SYN until an answer. */ diff --git a/net/ipv4/tcp_scalable.c b/net/ipv4/tcp_scalable.c index 26d7486ee..4624501e9 100644 --- a/net/ipv4/tcp_scalable.c +++ b/net/ipv4/tcp_scalable.c @@ -5,7 +5,6 @@ * John Heffner */ -#include #include #include diff --git a/net/ipv4/tcp_vegas.c b/net/ipv4/tcp_vegas.c index 3b7403495..490360b5b 100644 --- a/net/ipv4/tcp_vegas.c +++ b/net/ipv4/tcp_vegas.c @@ -31,7 +31,6 @@ * assumed senders never went idle. */ -#include #include #include #include diff --git a/net/ipv4/tcp_westwood.c b/net/ipv4/tcp_westwood.c index 0c340c375..5446312ff 100644 --- a/net/ipv4/tcp_westwood.c +++ b/net/ipv4/tcp_westwood.c @@ -1,10 +1,26 @@ /* - * TCP Westwood+ + * TCP Westwood+: end-to-end bandwidth estimation for TCP * - * Angelo Dell'Aera: TCP Westwood+ support + * Angelo Dell'Aera: author of the first version of TCP Westwood+ in Linux 2.4 + * + * Support at http://c3lab.poliba.it/index.php/Westwood + * Main references in literature: + * + * - Mascolo S, Casetti, M. Gerla et al. + * "TCP Westwood: bandwidth estimation for TCP" Proc. ACM Mobicom 2001 + * + * - A. Grieco, s. Mascolo + * "Performance evaluation of New Reno, Vegas, Westwood+ TCP" ACM Computer + * Comm. Review, 2004 + * + * - A. Dell'Aera, L. Grieco, S. Mascolo. + * "Linux 2.4 Implementation of Westwood+ TCP with Rate-Halving : + * A Performance Evaluation Over the Internet" (ICC 2004), Paris, June 2004 + * + * Westwood+ employs end-to-end bandwidth measurement to set cwnd and + * ssthresh after packet loss. The probing phase is as the original Reno. */ -#include #include #include #include @@ -22,6 +38,8 @@ struct westwood { u32 accounted; u32 rtt; u32 rtt_min; /* minimum observed RTT */ + u8 first_ack; /* flag which infers that this is the first ack */ + u8 reset_rtt_min; /* Reset RTT min to next RTT sample*/ }; @@ -49,9 +67,11 @@ static void tcp_westwood_init(struct sock *sk) w->bw_est = 0; w->accounted = 0; w->cumul_ack = 0; + w->reset_rtt_min = 1; w->rtt_min = w->rtt = TCP_WESTWOOD_INIT_RTT; w->rtt_win_sx = tcp_time_stamp; w->snd_una = tcp_sk(sk)->snd_una; + w->first_ack = 1; } /* @@ -63,10 +83,16 @@ static inline u32 westwood_do_filter(u32 a, u32 b) return (((7 * a) + b) >> 3); } -static inline void westwood_filter(struct westwood *w, u32 delta) +static void westwood_filter(struct westwood *w, u32 delta) { - w->bw_ns_est = westwood_do_filter(w->bw_ns_est, w->bk / delta); - w->bw_est = westwood_do_filter(w->bw_est, w->bw_ns_est); + /* If the filter is empty fill it with the first sample of bandwidth */ + if (w->bw_ns_est == 0 && w->bw_est == 0) { + w->bw_ns_est = w->bk / delta; + w->bw_est = w->bw_ns_est; + } else { + w->bw_ns_est = westwood_do_filter(w->bw_ns_est, w->bk / delta); + w->bw_est = westwood_do_filter(w->bw_est, w->bw_ns_est); + } } /* @@ -91,6 +117,15 @@ static void westwood_update_window(struct sock *sk) struct westwood *w = inet_csk_ca(sk); s32 delta = tcp_time_stamp - w->rtt_win_sx; + /* Initialize w->snd_una with the first acked sequence number in order + * to fix mismatch between tp->snd_una and w->snd_una for the first + * bandwidth sample + */ + if (w->first_ack) { + w->snd_una = tcp_sk(sk)->snd_una; + w->first_ack = 0; + } + /* * See if a RTT-window has passed. * Be careful since if RTT is less than @@ -108,6 +143,16 @@ static void westwood_update_window(struct sock *sk) } } +static inline void update_rtt_min(struct westwood *w) +{ + if (w->reset_rtt_min) { + w->rtt_min = w->rtt; + w->reset_rtt_min = 0; + } else + w->rtt_min = min(w->rtt, w->rtt_min); +} + + /* * @westwood_fast_bw * It is called when we are in fast path. In particular it is called when @@ -123,7 +168,7 @@ static inline void westwood_fast_bw(struct sock *sk) w->bk += tp->snd_una - w->snd_una; w->snd_una = tp->snd_una; - w->rtt_min = min(w->rtt, w->rtt_min); + update_rtt_min(w); } /* @@ -162,12 +207,6 @@ static inline u32 westwood_acked_count(struct sock *sk) return w->cumul_ack; } -static inline u32 westwood_bw_rttmin(const struct sock *sk) -{ - const struct tcp_sock *tp = tcp_sk(sk); - const struct westwood *w = inet_csk_ca(sk); - return max_t(u32, (w->bw_est * w->rtt_min) / tp->mss_cache, 2); -} /* * TCP Westwood @@ -175,9 +214,11 @@ static inline u32 westwood_bw_rttmin(const struct sock *sk) * in packets we use mss_cache). Rttmin is guaranteed to be >= 2 * so avoids ever returning 0. */ -static u32 tcp_westwood_cwnd_min(struct sock *sk) +static u32 tcp_westwood_bw_rttmin(const struct sock *sk) { - return westwood_bw_rttmin(sk); + const struct tcp_sock *tp = tcp_sk(sk); + const struct westwood *w = inet_csk_ca(sk); + return max_t(u32, (w->bw_est * w->rtt_min) / tp->mss_cache, 2); } static void tcp_westwood_event(struct sock *sk, enum tcp_ca_event event) @@ -191,17 +232,19 @@ static void tcp_westwood_event(struct sock *sk, enum tcp_ca_event event) break; case CA_EVENT_COMPLETE_CWR: - tp->snd_cwnd = tp->snd_ssthresh = westwood_bw_rttmin(sk); + tp->snd_cwnd = tp->snd_ssthresh = tcp_westwood_bw_rttmin(sk); break; case CA_EVENT_FRTO: - tp->snd_ssthresh = westwood_bw_rttmin(sk); + tp->snd_ssthresh = tcp_westwood_bw_rttmin(sk); + /* Update RTT_min when next ack arrives */ + w->reset_rtt_min = 1; break; case CA_EVENT_SLOW_ACK: westwood_update_window(sk); w->bk += westwood_acked_count(sk); - w->rtt_min = min(w->rtt, w->rtt_min); + update_rtt_min(w); break; default: @@ -235,7 +278,7 @@ static struct tcp_congestion_ops tcp_westwood = { .init = tcp_westwood_init, .ssthresh = tcp_reno_ssthresh, .cong_avoid = tcp_reno_cong_avoid, - .min_cwnd = tcp_westwood_cwnd_min, + .min_cwnd = tcp_westwood_bw_rttmin, .cwnd_event = tcp_westwood_event, .get_info = tcp_westwood_info, .pkts_acked = tcp_westwood_pkts_acked, diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index f2f34a4a1..993a80090 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -91,7 +91,6 @@ #include #include #include -#include #include #include #include @@ -1570,11 +1569,10 @@ static int udp_seq_open(struct inode *inode, struct file *file) struct udp_seq_afinfo *afinfo = PDE(inode)->data; struct seq_file *seq; int rc = -ENOMEM; - struct udp_iter_state *s = kmalloc(sizeof(*s), GFP_KERNEL); + struct udp_iter_state *s = kzalloc(sizeof(*s), GFP_KERNEL); if (!s) goto out; - memset(s, 0, sizeof(*s)); s->family = afinfo->family; s->seq_ops.start = udp_seq_start; s->seq_ops.next = udp_seq_next; diff --git a/net/ipv4/xfrm4_input.c b/net/ipv4/xfrm4_input.c index 3e174c83b..817ed8451 100644 --- a/net/ipv4/xfrm4_input.c +++ b/net/ipv4/xfrm4_input.c @@ -13,7 +13,6 @@ #include #include #include -#include #include #include @@ -24,15 +23,6 @@ int xfrm4_rcv(struct sk_buff *skb) EXPORT_SYMBOL(xfrm4_rcv); -static inline void ipip_ecn_decapsulate(struct sk_buff *skb) -{ - struct iphdr *outer_iph = skb->nh.iph; - struct iphdr *inner_iph = skb->h.ipiph; - - if (INET_ECN_is_ce(outer_iph->tos)) - IP_ECN_set_ce(inner_iph); -} - static int xfrm4_parse_spi(struct sk_buff *skb, u8 nexthdr, u32 *spi, u32 *seq) { switch (nexthdr) { @@ -113,24 +103,10 @@ int xfrm4_rcv_encap(struct sk_buff *skb, __u16 encap_type) xfrm_vec[xfrm_nr++] = x; - iph = skb->nh.iph; + if (x->mode->input(x, skb)) + goto drop; if (x->props.mode) { - if (iph->protocol != IPPROTO_IPIP) - goto drop; - if (!pskb_may_pull(skb, sizeof(struct iphdr))) - goto drop; - if (skb_cloned(skb) && - pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) - goto drop; - if (x->props.flags & XFRM_STATE_DECAP_DSCP) - ipv4_copy_dscp(iph, skb->h.ipiph); - if (!(x->props.flags & XFRM_STATE_NOECN)) - ipip_ecn_decapsulate(skb); - skb->mac.raw = memmove(skb->data - skb->mac_len, - skb->mac.raw, skb->mac_len); - skb->nh.raw = skb->data; - memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); decaps = 1; break; } diff --git a/net/ipv4/xfrm4_output.c b/net/ipv4/xfrm4_output.c index ecc4119df..dda359f0d 100644 --- a/net/ipv4/xfrm4_output.c +++ b/net/ipv4/xfrm4_output.c @@ -14,69 +14,12 @@ #include #include #include -#include #include #include #include extern int skb_checksum_setup(struct sk_buff *skb); -/* Add encapsulation header. - * - * In transport mode, the IP header will be moved forward to make space - * for the encapsulation header. - * - * In tunnel mode, the top IP header will be constructed per RFC 2401. - * The following fields in it shall be filled in by x->type->output: - * tot_len - * check - * - * On exit, skb->h will be set to the start of the payload to be processed - * by x->type->output and skb->nh will be set to the top IP header. - */ -static void xfrm4_encap(struct sk_buff *skb) -{ - struct dst_entry *dst = skb->dst; - struct xfrm_state *x = dst->xfrm; - struct iphdr *iph, *top_iph; - int flags; - - iph = skb->nh.iph; - skb->h.ipiph = iph; - - skb->nh.raw = skb_push(skb, x->props.header_len); - top_iph = skb->nh.iph; - - if (!x->props.mode) { - skb->h.raw += iph->ihl*4; - memmove(top_iph, iph, iph->ihl*4); - return; - } - - top_iph->ihl = 5; - top_iph->version = 4; - - /* DS disclosed */ - top_iph->tos = INET_ECN_encapsulate(iph->tos, iph->tos); - - flags = x->props.flags; - if (flags & XFRM_STATE_NOECN) - IP_ECN_clear(top_iph); - - top_iph->frag_off = (flags & XFRM_STATE_NOPMTUDISC) ? - 0 : (iph->frag_off & htons(IP_DF)); - if (!top_iph->frag_off) - __ip_select_ident(top_iph, dst->child, 0); - - top_iph->ttl = dst_metric(dst->child, RTAX_HOPLIMIT); - - top_iph->saddr = x->props.saddr.a4; - top_iph->daddr = x->id.daddr.a4; - top_iph->protocol = IPPROTO_IPIP; - - memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); -} - static int xfrm4_tunnel_check_size(struct sk_buff *skb) { int mtu, ret = 0; @@ -129,7 +72,9 @@ static int xfrm4_output_one(struct sk_buff *skb) if (err) goto error; - xfrm4_encap(skb); + err = x->mode->output(skb); + if (err) + goto error; err = x->type->output(x, skb); if (err) diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c index 8604c747b..8f50eae47 100644 --- a/net/ipv4/xfrm4_policy.c +++ b/net/ipv4/xfrm4_policy.c @@ -9,7 +9,6 @@ */ #include -#include #include #include #include @@ -17,8 +16,6 @@ static struct dst_ops xfrm4_dst_ops; static struct xfrm_policy_afinfo xfrm4_policy_afinfo; -static struct xfrm_type_map xfrm4_type_map = { .lock = RW_LOCK_UNLOCKED }; - static int xfrm4_dst_lookup(struct xfrm_dst **dst, struct flowi *fl) { return __ip_route_output_key((struct rtable**)dst, fl); @@ -237,9 +234,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl) static inline int xfrm4_garbage_collect(void) { - read_lock(&xfrm4_policy_afinfo.lock); xfrm4_policy_afinfo.garbage_collect(); - read_unlock(&xfrm4_policy_afinfo.lock); return (atomic_read(&xfrm4_dst_ops.entries) > xfrm4_dst_ops.gc_thresh*2); } @@ -299,8 +294,6 @@ static struct dst_ops xfrm4_dst_ops = { static struct xfrm_policy_afinfo xfrm4_policy_afinfo = { .family = AF_INET, - .lock = RW_LOCK_UNLOCKED, - .type_map = &xfrm4_type_map, .dst_ops = &xfrm4_dst_ops, .dst_lookup = xfrm4_dst_lookup, .find_bundle = __xfrm4_find_bundle, diff --git a/net/ipv4/xfrm4_state.c b/net/ipv4/xfrm4_state.c index dbabf81a9..81e1751c9 100644 --- a/net/ipv4/xfrm4_state.c +++ b/net/ipv4/xfrm4_state.c @@ -131,7 +131,6 @@ __xfrm4_find_acq(u8 mode, u32 reqid, u8 proto, static struct xfrm_state_afinfo xfrm4_state_afinfo = { .family = AF_INET, - .lock = RW_LOCK_UNLOCKED, .init_flags = xfrm4_init_flags, .init_tempsel = __xfrm4_init_tempsel, .state_lookup = __xfrm4_state_lookup, diff --git a/net/ipv6/Kconfig b/net/ipv6/Kconfig index f8a107ab5..e923d4dea 100644 --- a/net/ipv6/Kconfig +++ b/net/ipv6/Kconfig @@ -106,6 +106,26 @@ config INET6_TUNNEL tristate default n +config INET6_XFRM_MODE_TRANSPORT + tristate "IPv6: IPsec transport mode" + depends on IPV6 + default IPV6 + select XFRM + ---help--- + Support for IPsec transport mode. + + If unsure, say Y. + +config INET6_XFRM_MODE_TUNNEL + tristate "IPv6: IPsec tunnel mode" + depends on IPV6 + default IPV6 + select XFRM + ---help--- + Support for IPsec tunnel mode. + + If unsure, say Y. + config IPV6_TUNNEL tristate "IPv6: IPv6-in-IPv6 tunnel" select INET6_TUNNEL diff --git a/net/ipv6/Makefile b/net/ipv6/Makefile index a760b0988..386e0a626 100644 --- a/net/ipv6/Makefile +++ b/net/ipv6/Makefile @@ -20,6 +20,8 @@ obj-$(CONFIG_INET6_ESP) += esp6.o obj-$(CONFIG_INET6_IPCOMP) += ipcomp6.o obj-$(CONFIG_INET6_XFRM_TUNNEL) += xfrm6_tunnel.o obj-$(CONFIG_INET6_TUNNEL) += tunnel6.o +obj-$(CONFIG_INET6_XFRM_MODE_TRANSPORT) += xfrm6_mode_transport.o +obj-$(CONFIG_INET6_XFRM_MODE_TUNNEL) += xfrm6_mode_tunnel.o obj-$(CONFIG_NETFILTER) += netfilter/ obj-$(CONFIG_IPV6_TUNNEL) += ip6_tunnel.o diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 386ca5c41..5c1b33f40 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -40,7 +40,6 @@ * status etc. */ -#include #include #include #include @@ -509,6 +508,26 @@ void inet6_ifa_finish_destroy(struct inet6_ifaddr *ifp) kfree(ifp); } +static void +ipv6_link_dev_addr(struct inet6_dev *idev, struct inet6_ifaddr *ifp) +{ + struct inet6_ifaddr *ifa, **ifap; + int ifp_scope = ipv6_addr_src_scope(&ifp->addr); + + /* + * Each device address list is sorted in order of scope - + * global before linklocal. + */ + for (ifap = &idev->addr_list; (ifa = *ifap) != NULL; + ifap = &ifa->if_next) { + if (ifp_scope >= ipv6_addr_src_scope(&ifa->addr)) + break; + } + + ifp->if_next = *ifap; + *ifap = ifp; +} + /* On success it returns ifp with increased reference count */ static struct inet6_ifaddr * @@ -559,6 +578,8 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, int pfxlen, ifa->flags = flags | IFA_F_TENTATIVE; ifa->cstamp = ifa->tstamp = jiffies; + ifa->rt = rt; + ifa->idev = idev; in6_dev_hold(idev); /* For caller */ @@ -574,8 +595,7 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, int pfxlen, write_lock(&idev->lock); /* Add to inet6_dev unicast addr list. */ - ifa->if_next = idev->addr_list; - idev->addr_list = ifa; + ipv6_link_dev_addr(idev, ifa); #ifdef CONFIG_IPV6_PRIVACY if (ifa->flags&IFA_F_TEMPORARY) { @@ -585,8 +605,6 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, int pfxlen, } #endif - ifa->rt = rt; - in6_ifa_hold(ifa); write_unlock(&idev->lock); out2: @@ -988,7 +1006,7 @@ int ipv6_dev_get_saddr(struct net_device *daddr_dev, continue; } else if (score.scope < hiscore.scope) { if (score.scope < daddr_scope) - continue; + break; /* addresses sorted by scope */ else { score.rule = 2; goto record_it; @@ -1851,15 +1869,21 @@ err_exit: /* * Manual configuration of address on an interface */ -static int inet6_addr_add(int ifindex, struct in6_addr *pfx, int plen) +static int inet6_addr_add(int ifindex, struct in6_addr *pfx, int plen, + __u32 prefered_lft, __u32 valid_lft) { struct inet6_ifaddr *ifp; struct inet6_dev *idev; struct net_device *dev; + __u8 ifa_flags = 0; int scope; ASSERT_RTNL(); + /* check the lifetime */ + if (!valid_lft || prefered_lft > valid_lft) + return -EINVAL; + if ((dev = __dev_get_by_index(ifindex)) == NULL) return -ENODEV; @@ -1871,10 +1895,29 @@ static int inet6_addr_add(int ifindex, struct in6_addr *pfx, int plen) scope = ipv6_addr_scope(pfx); - ifp = ipv6_add_addr(idev, pfx, plen, scope, IFA_F_PERMANENT); + if (valid_lft == INFINITY_LIFE_TIME) + ifa_flags |= IFA_F_PERMANENT; + else if (valid_lft >= 0x7FFFFFFF/HZ) + valid_lft = 0x7FFFFFFF/HZ; + + if (prefered_lft == 0) + ifa_flags |= IFA_F_DEPRECATED; + else if ((prefered_lft >= 0x7FFFFFFF/HZ) && + (prefered_lft != INFINITY_LIFE_TIME)) + prefered_lft = 0x7FFFFFFF/HZ; + + ifp = ipv6_add_addr(idev, pfx, plen, scope, ifa_flags); + if (!IS_ERR(ifp)) { + spin_lock_bh(&ifp->lock); + ifp->valid_lft = valid_lft; + ifp->prefered_lft = prefered_lft; + ifp->tstamp = jiffies; + spin_unlock_bh(&ifp->lock); + addrconf_dad_start(ifp, 0); in6_ifa_put(ifp); + addrconf_verify(0); return 0; } @@ -1927,7 +1970,8 @@ int addrconf_add_ifaddr(void __user *arg) return -EFAULT; rtnl_lock(); - err = inet6_addr_add(ireq.ifr6_ifindex, &ireq.ifr6_addr, ireq.ifr6_prefixlen); + err = inet6_addr_add(ireq.ifr6_ifindex, &ireq.ifr6_addr, ireq.ifr6_prefixlen, + INFINITY_LIFE_TIME, INFINITY_LIFE_TIME); rtnl_unlock(); return err; } @@ -2758,12 +2802,16 @@ restart: ifp->idev->nd_parms->retrans_time / HZ; #endif - if (age >= ifp->valid_lft) { + if (ifp->valid_lft != INFINITY_LIFE_TIME && + age >= ifp->valid_lft) { spin_unlock(&ifp->lock); in6_ifa_hold(ifp); read_unlock(&addrconf_hash_lock); ipv6_del_addr(ifp); goto restart; + } else if (ifp->prefered_lft == INFINITY_LIFE_TIME) { + spin_unlock(&ifp->lock); + continue; } else if (age >= ifp->prefered_lft) { /* jiffies - ifp->tsamp > age >= ifp->prefered_lft */ int deprecate = 0; @@ -2840,7 +2888,8 @@ inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) pfx = RTA_DATA(rta[IFA_ADDRESS-1]); } if (rta[IFA_LOCAL-1]) { - if (pfx && memcmp(pfx, RTA_DATA(rta[IFA_LOCAL-1]), sizeof(*pfx))) + if (RTA_PAYLOAD(rta[IFA_LOCAL-1]) < sizeof(*pfx) || + (pfx && memcmp(pfx, RTA_DATA(rta[IFA_LOCAL-1]), sizeof(*pfx)))) return -EINVAL; pfx = RTA_DATA(rta[IFA_LOCAL-1]); } @@ -2850,12 +2899,62 @@ inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) return inet6_addr_del(ifm->ifa_index, pfx, ifm->ifa_prefixlen); } +static int +inet6_addr_modify(int ifindex, struct in6_addr *pfx, + __u32 prefered_lft, __u32 valid_lft) +{ + struct inet6_ifaddr *ifp = NULL; + struct net_device *dev; + int ifa_flags = 0; + + if ((dev = __dev_get_by_index(ifindex)) == NULL) + return -ENODEV; + + if (!(dev->flags&IFF_UP)) + return -ENETDOWN; + + if (!valid_lft || (prefered_lft > valid_lft)) + return -EINVAL; + + ifp = ipv6_get_ifaddr(pfx, dev, 1); + if (ifp == NULL) + return -ENOENT; + + if (valid_lft == INFINITY_LIFE_TIME) + ifa_flags = IFA_F_PERMANENT; + else if (valid_lft >= 0x7FFFFFFF/HZ) + valid_lft = 0x7FFFFFFF/HZ; + + if (prefered_lft == 0) + ifa_flags = IFA_F_DEPRECATED; + else if ((prefered_lft >= 0x7FFFFFFF/HZ) && + (prefered_lft != INFINITY_LIFE_TIME)) + prefered_lft = 0x7FFFFFFF/HZ; + + spin_lock_bh(&ifp->lock); + ifp->flags = (ifp->flags & ~(IFA_F_DEPRECATED|IFA_F_PERMANENT)) | ifa_flags; + + ifp->tstamp = jiffies; + ifp->valid_lft = valid_lft; + ifp->prefered_lft = prefered_lft; + + spin_unlock_bh(&ifp->lock); + if (!(ifp->flags&IFA_F_TENTATIVE)) + ipv6_ifa_notify(0, ifp); + in6_ifa_put(ifp); + + addrconf_verify(0); + + return 0; +} + static int inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) { struct rtattr **rta = arg; struct ifaddrmsg *ifm = NLMSG_DATA(nlh); struct in6_addr *pfx; + __u32 valid_lft = INFINITY_LIFE_TIME, prefered_lft = INFINITY_LIFE_TIME; pfx = NULL; if (rta[IFA_ADDRESS-1]) { @@ -2864,14 +2963,34 @@ inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) pfx = RTA_DATA(rta[IFA_ADDRESS-1]); } if (rta[IFA_LOCAL-1]) { - if (pfx && memcmp(pfx, RTA_DATA(rta[IFA_LOCAL-1]), sizeof(*pfx))) + if (RTA_PAYLOAD(rta[IFA_LOCAL-1]) < sizeof(*pfx) || + (pfx && memcmp(pfx, RTA_DATA(rta[IFA_LOCAL-1]), sizeof(*pfx)))) return -EINVAL; pfx = RTA_DATA(rta[IFA_LOCAL-1]); } if (pfx == NULL) return -EINVAL; - return inet6_addr_add(ifm->ifa_index, pfx, ifm->ifa_prefixlen); + if (rta[IFA_CACHEINFO-1]) { + struct ifa_cacheinfo *ci; + if (RTA_PAYLOAD(rta[IFA_CACHEINFO-1]) < sizeof(*ci)) + return -EINVAL; + ci = RTA_DATA(rta[IFA_CACHEINFO-1]); + valid_lft = ci->ifa_valid; + prefered_lft = ci->ifa_prefered; + } + + if (nlh->nlmsg_flags & NLM_F_REPLACE) { + int ret; + ret = inet6_addr_modify(ifm->ifa_index, pfx, + prefered_lft, valid_lft); + if (ret == 0 || !(nlh->nlmsg_flags & NLM_F_CREATE)) + return ret; + } + + return inet6_addr_add(ifm->ifa_index, pfx, ifm->ifa_prefixlen, + prefered_lft, valid_lft); + } /* Maximum length of ifa_cacheinfo attributes */ @@ -3112,6 +3231,62 @@ static int inet6_dump_ifacaddr(struct sk_buff *skb, struct netlink_callback *cb) return inet6_dump_addr(skb, cb, type); } +static int inet6_rtm_getaddr(struct sk_buff *in_skb, + struct nlmsghdr* nlh, void *arg) +{ + struct rtattr **rta = arg; + struct ifaddrmsg *ifm = NLMSG_DATA(nlh); + struct in6_addr *addr = NULL; + struct net_device *dev = NULL; + struct inet6_ifaddr *ifa; + struct sk_buff *skb; + int size = NLMSG_SPACE(sizeof(struct ifaddrmsg) + INET6_IFADDR_RTA_SPACE); + int err; + + if (rta[IFA_ADDRESS-1]) { + if (RTA_PAYLOAD(rta[IFA_ADDRESS-1]) < sizeof(*addr)) + return -EINVAL; + addr = RTA_DATA(rta[IFA_ADDRESS-1]); + } + if (rta[IFA_LOCAL-1]) { + if (RTA_PAYLOAD(rta[IFA_LOCAL-1]) < sizeof(*addr) || + (addr && memcmp(addr, RTA_DATA(rta[IFA_LOCAL-1]), sizeof(*addr)))) + return -EINVAL; + addr = RTA_DATA(rta[IFA_LOCAL-1]); + } + if (addr == NULL) + return -EINVAL; + + if (ifm->ifa_index) + dev = __dev_get_by_index(ifm->ifa_index); + + if ((ifa = ipv6_get_ifaddr(addr, dev, 1)) == NULL) + return -EADDRNOTAVAIL; + + if ((skb = alloc_skb(size, GFP_KERNEL)) == NULL) { + err = -ENOBUFS; + goto out; + } + + NETLINK_CB(skb).dst_pid = NETLINK_CB(in_skb).pid; + err = inet6_fill_ifaddr(skb, ifa, NETLINK_CB(in_skb).pid, + nlh->nlmsg_seq, RTM_NEWADDR, 0); + if (err < 0) { + err = -EMSGSIZE; + goto out_free; + } + + err = netlink_unicast(rtnl, skb, NETLINK_CB(in_skb).pid, MSG_DONTWAIT); + if (err > 0) + err = 0; +out: + in6_ifa_put(ifa); + return err; +out_free: + kfree_skb(skb); + goto out; +} + static void inet6_ifa_notify(int event, struct inet6_ifaddr *ifa) { struct sk_buff *skb; @@ -3358,7 +3533,8 @@ static struct rtnetlink_link inet6_rtnetlink_table[RTM_NR_MSGTYPES] = { [RTM_GETLINK - RTM_BASE] = { .dumpit = inet6_dump_ifinfo, }, [RTM_NEWADDR - RTM_BASE] = { .doit = inet6_rtm_newaddr, }, [RTM_DELADDR - RTM_BASE] = { .doit = inet6_rtm_deladdr, }, - [RTM_GETADDR - RTM_BASE] = { .dumpit = inet6_dump_ifaddr, }, + [RTM_GETADDR - RTM_BASE] = { .doit = inet6_rtm_getaddr, + .dumpit = inet6_dump_ifaddr, }, [RTM_GETMULTICAST - RTM_BASE] = { .dumpit = inet6_dump_ifmcaddr, }, [RTM_GETANYCAST - RTM_BASE] = { .dumpit = inet6_dump_ifacaddr, }, [RTM_NEWROUTE - RTM_BASE] = { .doit = inet6_rtm_newroute, }, diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index e19457fe4..ac85e9c53 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c @@ -23,7 +23,6 @@ #include #include -#include #include #include #include @@ -659,9 +658,7 @@ int inet6_sk_rebuild_header(struct sock *sk) return err; } - ip6_dst_store(sk, dst, NULL); - sk->sk_route_caps = dst->dev->features & - ~(NETIF_F_IP_CSUM | NETIF_F_TSO); + __ip6_dst_store(sk, dst, NULL); } return 0; diff --git a/net/ipv6/ah6.c b/net/ipv6/ah6.c index 6778173a3..9d4831bd4 100644 --- a/net/ipv6/ah6.c +++ b/net/ipv6/ah6.c @@ -24,7 +24,6 @@ * This file is derived from net/ipv4/ah.c. */ -#include #include #include #include @@ -292,7 +291,7 @@ static int ah6_input(struct xfrm_state *x, struct sk_buff *skb) memcpy(auth_data, ah->auth_data, ahp->icv_trunc_len); memset(ah->auth_data, 0, ahp->icv_trunc_len); - skb_push(skb, skb->data - skb->nh.raw); + skb_push(skb, hdr_len); ahp->icv(ahp, skb, ah->auth_data); if (memcmp(ah->auth_data, auth_data, ahp->icv_trunc_len)) { LIMIT_NETDEBUG(KERN_WARNING "ipsec ah authentication error\n"); @@ -301,12 +300,8 @@ static int ah6_input(struct xfrm_state *x, struct sk_buff *skb) } } - skb->nh.raw = skb_pull(skb, ah_hlen); - memcpy(skb->nh.raw, tmp_hdr, hdr_len); - skb->nh.ipv6h->payload_len = htons(skb->len - sizeof(struct ipv6hdr)); - skb_pull(skb, hdr_len); - skb->h.raw = skb->data; - + skb->h.raw = memcpy(skb->nh.raw += ah_hlen, tmp_hdr, hdr_len); + __skb_pull(skb, ah_hlen + hdr_len); kfree(tmp_hdr); diff --git a/net/ipv6/anycast.c b/net/ipv6/anycast.c index 39ec52892..f6881d7a0 100644 --- a/net/ipv6/anycast.c +++ b/net/ipv6/anycast.c @@ -14,7 +14,6 @@ */ #include -#include #include #include #include diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c index 99a6eb233..3b55b4c8e 100644 --- a/net/ipv6/datagram.c +++ b/net/ipv6/datagram.c @@ -696,7 +696,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl, } tc = *(int *)CMSG_DATA(cmsg); - if (tc < 0 || tc > 0xff) + if (tc < -1 || tc > 0xff) goto exit_f; err = 0; diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c index 22f046079..a278d5e86 100644 --- a/net/ipv6/esp6.c +++ b/net/ipv6/esp6.c @@ -24,7 +24,6 @@ * This file is derived from net/ipv4/esp.c */ -#include #include #include #include @@ -142,25 +141,17 @@ static int esp6_input(struct xfrm_state *x, struct sk_buff *skb) int hdr_len = skb->h.raw - skb->nh.raw; int nfrags; - unsigned char *tmp_hdr = NULL; int ret = 0; if (!pskb_may_pull(skb, sizeof(struct ipv6_esp_hdr))) { ret = -EINVAL; - goto out_nofree; + goto out; } if (elen <= 0 || (elen & (blksize-1))) { ret = -EINVAL; - goto out_nofree; - } - - tmp_hdr = kmalloc(hdr_len, GFP_ATOMIC); - if (!tmp_hdr) { - ret = -ENOMEM; - goto out_nofree; + goto out; } - memcpy(tmp_hdr, skb->nh.raw, hdr_len); /* If integrity check is required, do this. */ if (esp->auth.icv_full_len) { @@ -222,16 +213,12 @@ static int esp6_input(struct xfrm_state *x, struct sk_buff *skb) /* ... check padding bits here. Silly. :-) */ pskb_trim(skb, skb->len - alen - padlen - 2); - skb->h.raw = skb_pull(skb, sizeof(struct ipv6_esp_hdr) + esp->conf.ivlen); - skb->nh.raw += sizeof(struct ipv6_esp_hdr) + esp->conf.ivlen; - memcpy(skb->nh.raw, tmp_hdr, hdr_len); - skb->nh.ipv6h->payload_len = htons(skb->len - sizeof(struct ipv6hdr)); ret = nexthdr[1]; } + skb->h.raw = __skb_pull(skb, sizeof(*esph) + esp->conf.ivlen) - hdr_len; + out: - kfree(tmp_hdr); -out_nofree: return ret; } diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c index 9ca783dcc..86dac1068 100644 --- a/net/ipv6/exthdrs.c +++ b/net/ipv6/exthdrs.c @@ -179,7 +179,7 @@ static int ipv6_destopt_rcv(struct sk_buff **skbp) static struct inet6_protocol destopt_protocol = { .handler = ipv6_destopt_rcv, - .flags = INET6_PROTO_NOPOLICY, + .flags = INET6_PROTO_NOPOLICY | INET6_PROTO_GSO_EXTHDR, }; void __init ipv6_destopt_init(void) @@ -340,7 +340,7 @@ looped_back: static struct inet6_protocol rthdr_protocol = { .handler = ipv6_rthdr_rcv, - .flags = INET6_PROTO_NOPOLICY, + .flags = INET6_PROTO_NOPOLICY | INET6_PROTO_GSO_EXTHDR, }; void __init ipv6_rthdr_init(void) diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c index 1044b6fce..356a8a7ef 100644 --- a/net/ipv6/icmp.c +++ b/net/ipv6/icmp.c @@ -401,7 +401,7 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info, if (hlimit < 0) hlimit = ipv6_get_hoplimit(dst->dev); - tclass = np->cork.tclass; + tclass = np->tclass; if (tclass < 0) tclass = 0; @@ -497,7 +497,7 @@ static void icmpv6_echo_reply(struct sk_buff *skb) if (hlimit < 0) hlimit = ipv6_get_hoplimit(dst->dev); - tclass = np->cork.tclass; + tclass = np->tclass; if (tclass < 0) tclass = 0; @@ -712,6 +712,11 @@ discard_it: return 0; } +/* + * Special lock-class for __icmpv6_socket: + */ +static struct lock_class_key icmpv6_socket_sk_dst_lock_key; + int __init icmpv6_init(struct net_proto_family *ops) { struct sock *sk; @@ -730,6 +735,14 @@ int __init icmpv6_init(struct net_proto_family *ops) sk = per_cpu(__icmpv6_socket, i)->sk; sk->sk_allocation = GFP_ATOMIC; + /* + * Split off their lock-class, because sk->sk_dst_lock + * gets used from softirqs, which is safe for + * __icmpv6_socket (because those never get directly used + * via userspace syscalls), but unsafe for normal sockets. + */ + lockdep_set_class(&sk->sk_dst_lock, + &icmpv6_socket_sk_dst_lock_key); /* Enough space for 2 64K ICMP packets, including * sk_buff struct overhead. diff --git a/net/ipv6/inet6_connection_sock.c b/net/ipv6/inet6_connection_sock.c index eb2865d5a..bf491077b 100644 --- a/net/ipv6/inet6_connection_sock.c +++ b/net/ipv6/inet6_connection_sock.c @@ -13,7 +13,6 @@ * 2 of the License, or(at your option) any later version. */ -#include #include #include #include @@ -186,9 +185,7 @@ int inet6_csk_xmit(struct sk_buff *skb, int ipfragok) return err; } - ip6_dst_store(sk, dst, NULL); - sk->sk_route_caps = dst->dev->features & - ~(NETIF_F_IP_CSUM | NETIF_F_TSO); + __ip6_dst_store(sk, dst, NULL); } skb->dst = dst_clone(dst); diff --git a/net/ipv6/inet6_hashtables.c b/net/ipv6/inet6_hashtables.c index 2ae84c961..d2f3fc990 100644 --- a/net/ipv6/inet6_hashtables.c +++ b/net/ipv6/inet6_hashtables.c @@ -14,7 +14,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c index 2cb614934..764221220 100644 --- a/net/ipv6/ip6_fib.c +++ b/net/ipv6/ip6_fib.c @@ -19,7 +19,6 @@ * remove ip6_null_entry from the top of * routing table. */ -#include #include #include #include diff --git a/net/ipv6/ip6_flowlabel.c b/net/ipv6/ip6_flowlabel.c index f9ca63912..062e526a6 100644 --- a/net/ipv6/ip6_flowlabel.c +++ b/net/ipv6/ip6_flowlabel.c @@ -10,7 +10,6 @@ */ #include -#include #include #include #include @@ -588,6 +587,8 @@ static struct ip6_flowlabel *ip6fl_get_next(struct seq_file *seq, struct ip6_flo while (!fl) { if (++state->bucket <= FL_HASH_MASK) fl = fl_ht[state->bucket]; + else + break; } return fl; } diff --git a/net/ipv6/ip6_input.c b/net/ipv6/ip6_input.c index aceee2525..25c2a9e03 100644 --- a/net/ipv6/ip6_input.c +++ b/net/ipv6/ip6_input.c @@ -71,6 +71,8 @@ int ipv6_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt goto out; } + memset(IP6CB(skb), 0, sizeof(struct inet6_skb_parm)); + /* * Store incoming device index. When the packet will * be queued, we cannot refer to skb->dev anymore. @@ -84,14 +86,9 @@ int ipv6_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt */ IP6CB(skb)->iif = skb->dst ? ((struct rt6_info *)skb->dst)->rt6i_idev->dev->ifindex : dev->ifindex; - if (skb->len < sizeof(struct ipv6hdr)) + if (unlikely(!pskb_may_pull(skb, sizeof(*hdr)))) goto err; - if (!pskb_may_pull(skb, sizeof(struct ipv6hdr))) { - IP6_INC_STATS_BH(IPSTATS_MIB_INHDRERRORS); - goto drop; - } - hdr = skb->nh.ipv6h; if (hdr->version != 6) diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 1d5dfeb26..4fb47a252 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c @@ -28,7 +28,6 @@ * for datagram xmit */ -#include #include #include #include @@ -39,6 +38,7 @@ #include #include #include +#include #include #include @@ -229,7 +229,7 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl, skb->priority = sk->sk_priority; mtu = dst_mtu(dst); - if ((skb->len <= mtu) || ipfragok) { + if ((skb->len <= mtu) || ipfragok || skb_is_gso(skb)) { IP6_INC_STATS(IPSTATS_MIB_OUTREQUESTS); return NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, dst->dev, dst_output); @@ -356,6 +356,7 @@ int ip6_forward(struct sk_buff *skb) skb->dev = dst->dev; icmpv6_send(skb, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT, 0, skb->dev); + IP6_INC_STATS_BH(IPSTATS_MIB_INHDRERRORS); kfree_skb(skb); return -ETIMEDOUT; @@ -458,6 +459,7 @@ static void ip6_copy_metadata(struct sk_buff *to, struct sk_buff *from) nf_bridge_get(to->nf_bridge); #endif #endif + skb_copy_secmark(to, from); } int ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr) @@ -488,6 +490,7 @@ int ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr) return offset; } +EXPORT_SYMBOL_GPL(ip6_find_1stfragopt); static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) { @@ -593,6 +596,9 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) } err = output(skb); + if(!err) + IP6_INC_STATS(IPSTATS_MIB_FRAGCREATES); + if (err || !frag) break; @@ -704,12 +710,11 @@ slow_path: /* * Put this fragment into the sending queue. */ - - IP6_INC_STATS(IPSTATS_MIB_FRAGCREATES); - err = output(frag); if (err) goto fail; + + IP6_INC_STATS(IPSTATS_MIB_FRAGCREATES); } kfree_skb(skb); IP6_INC_STATS(IPSTATS_MIB_FRAGOKS); @@ -721,48 +726,51 @@ fail: return err; } -int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi *fl) +static struct dst_entry *ip6_sk_dst_check(struct sock *sk, + struct dst_entry *dst, + struct flowi *fl) { - int err = 0; + struct ipv6_pinfo *np = inet6_sk(sk); + struct rt6_info *rt = (struct rt6_info *)dst; - *dst = NULL; - if (sk) { - struct ipv6_pinfo *np = inet6_sk(sk); - - *dst = sk_dst_check(sk, np->dst_cookie); - if (*dst) { - struct rt6_info *rt = (struct rt6_info*)*dst; - - /* Yes, checking route validity in not connected - * case is not very simple. Take into account, - * that we do not support routing by source, TOS, - * and MSG_DONTROUTE --ANK (980726) - * - * 1. If route was host route, check that - * cached destination is current. - * If it is network route, we still may - * check its validity using saved pointer - * to the last used address: daddr_cache. - * We do not want to save whole address now, - * (because main consumer of this service - * is tcp, which has not this problem), - * so that the last trick works only on connected - * sockets. - * 2. oif also should be the same. - */ - if (((rt->rt6i_dst.plen != 128 || - !ipv6_addr_equal(&fl->fl6_dst, - &rt->rt6i_dst.addr)) - && (np->daddr_cache == NULL || - !ipv6_addr_equal(&fl->fl6_dst, - np->daddr_cache))) - || (fl->oif && fl->oif != (*dst)->dev->ifindex)) { - dst_release(*dst); - *dst = NULL; - } - } + if (!dst) + goto out; + + /* Yes, checking route validity in not connected + * case is not very simple. Take into account, + * that we do not support routing by source, TOS, + * and MSG_DONTROUTE --ANK (980726) + * + * 1. If route was host route, check that + * cached destination is current. + * If it is network route, we still may + * check its validity using saved pointer + * to the last used address: daddr_cache. + * We do not want to save whole address now, + * (because main consumer of this service + * is tcp, which has not this problem), + * so that the last trick works only on connected + * sockets. + * 2. oif also should be the same. + */ + if (((rt->rt6i_dst.plen != 128 || + !ipv6_addr_equal(&fl->fl6_dst, &rt->rt6i_dst.addr)) + && (np->daddr_cache == NULL || + !ipv6_addr_equal(&fl->fl6_dst, np->daddr_cache))) + || (fl->oif && fl->oif != dst->dev->ifindex)) { + dst_release(dst); + dst = NULL; } +out: + return dst; +} + +static int ip6_dst_lookup_tail(struct sock *sk, + struct dst_entry **dst, struct flowi *fl) +{ + int err; + if (*dst == NULL) *dst = ip6_route_output(sk, fl); @@ -771,7 +779,6 @@ int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi *fl) if (ipv6_addr_any(&fl->fl6_src)) { err = ipv6_get_saddr(*dst, &fl->fl6_dst, &fl->fl6_src); - if (err) goto out_err_release; } @@ -784,8 +791,48 @@ out_err_release: return err; } +/** + * ip6_dst_lookup - perform route lookup on flow + * @sk: socket which provides route info + * @dst: pointer to dst_entry * for result + * @fl: flow to lookup + * + * This function performs a route lookup on the given flow. + * + * It returns zero on success, or a standard errno code on error. + */ +int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi *fl) +{ + *dst = NULL; + return ip6_dst_lookup_tail(sk, dst, fl); +} EXPORT_SYMBOL_GPL(ip6_dst_lookup); +/** + * ip6_sk_dst_lookup - perform socket cached route lookup on flow + * @sk: socket which provides the dst cache and route info + * @dst: pointer to dst_entry * for result + * @fl: flow to lookup + * + * This function performs a route lookup on the given flow with the + * possibility of using the cached route in the socket if it is valid. + * It will take the socket dst lock when operating on the dst cache. + * As a result, this function can only be used in process context. + * + * It returns zero on success, or a standard errno code on error. + */ +int ip6_sk_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi *fl) +{ + *dst = NULL; + if (sk) { + *dst = sk_dst_check(sk, inet6_sk(sk)->dst_cookie); + *dst = ip6_sk_dst_check(sk, *dst, fl); + } + + return ip6_dst_lookup_tail(sk, dst, fl); +} +EXPORT_SYMBOL_GPL(ip6_sk_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), @@ -832,7 +879,7 @@ static inline int ip6_ufo_append_data(struct sock *sk, /* specify the length of each IP datagram fragment*/ skb_shinfo(skb)->gso_size = mtu - fragheaderlen - sizeof(struct frag_hdr); - skb_shinfo(skb)->gso_type = SKB_GSO_UDPV4; + skb_shinfo(skb)->gso_type = SKB_GSO_UDP; ipv6_select_ident(skb, &fhdr); skb_shinfo(skb)->ip6_frag_id = fhdr.identification; __skb_queue_tail(&sk->sk_write_queue, skb); diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c index a995796b5..84d7ebdb9 100644 --- a/net/ipv6/ip6_tunnel.c +++ b/net/ipv6/ip6_tunnel.c @@ -19,7 +19,6 @@ * */ -#include #include #include #include @@ -568,10 +567,9 @@ static inline struct ipv6_txoptions *create_tel(__u8 encap_limit) int opt_len = sizeof(*opt) + 8; - if (!(opt = kmalloc(opt_len, GFP_ATOMIC))) { + if (!(opt = kzalloc(opt_len, GFP_ATOMIC))) { return NULL; } - memset(opt, 0, opt_len); opt->tot_len = opt_len; opt->dst0opt = (struct ipv6_opt_hdr *) (opt + 1); opt->opt_nflen = 8; diff --git a/net/ipv6/ipcomp6.c b/net/ipv6/ipcomp6.c index 96cac9a94..7e4d1c17b 100644 --- a/net/ipv6/ipcomp6.c +++ b/net/ipv6/ipcomp6.c @@ -30,7 +30,6 @@ * The decompression of IP datagram MUST be done after the reassembly, * AH/ESP processing. */ -#include #include #include #include @@ -66,10 +65,8 @@ static LIST_HEAD(ipcomp6_tfms_list); static int ipcomp6_input(struct xfrm_state *x, struct sk_buff *skb) { int err = -ENOMEM; - u8 nexthdr = 0; - int hdr_len = skb->h.raw - skb->nh.raw; - unsigned char *tmp_hdr = NULL; struct ipv6hdr *iph; + struct ipv6_comp_hdr *ipch; int plen, dlen; struct ipcomp_data *ipcd = x->data; u8 *start, *scratch; @@ -83,17 +80,9 @@ static int ipcomp6_input(struct xfrm_state *x, struct sk_buff *skb) /* Remove ipcomp header and decompress original payload */ iph = skb->nh.ipv6h; - tmp_hdr = kmalloc(hdr_len, GFP_ATOMIC); - if (!tmp_hdr) - goto out; - memcpy(tmp_hdr, iph, hdr_len); - nexthdr = *(u8 *)skb->data; - skb_pull(skb, sizeof(struct ipv6_comp_hdr)); - skb->nh.raw += sizeof(struct ipv6_comp_hdr); - memcpy(skb->nh.raw, tmp_hdr, hdr_len); - iph = skb->nh.ipv6h; - iph->payload_len = htons(ntohs(iph->payload_len) - sizeof(struct ipv6_comp_hdr)); - skb->h.raw = skb->data; + ipch = (void *)skb->data; + skb->h.raw = skb->nh.raw + sizeof(*ipch); + __skb_pull(skb, sizeof(*ipch)); /* decompression */ plen = skb->len; @@ -120,20 +109,14 @@ static int ipcomp6_input(struct xfrm_state *x, struct sk_buff *skb) goto out_put_cpu; } - skb_put(skb, dlen - plen); + skb->truesize += dlen - plen; + __skb_put(skb, dlen - plen); memcpy(skb->data, scratch, dlen); + err = ipch->nexthdr; - iph = skb->nh.ipv6h; - iph->payload_len = htons(skb->len); - out_put_cpu: put_cpu(); out: - kfree(tmp_hdr); - if (err) - goto error_out; - return nexthdr; -error_out: return err; } diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c index 4c20eeb3d..1c50e6a63 100644 --- a/net/ipv6/ipv6_sockglue.c +++ b/net/ipv6/ipv6_sockglue.c @@ -27,7 +27,6 @@ #include #include -#include #include #include #include @@ -58,9 +57,116 @@ DEFINE_SNMP_STAT(struct ipstats_mib, ipv6_statistics) __read_mostly; +static struct inet6_protocol *ipv6_gso_pull_exthdrs(struct sk_buff *skb, + int proto) +{ + struct inet6_protocol *ops = NULL; + + for (;;) { + struct ipv6_opt_hdr *opth; + int len; + + if (proto != NEXTHDR_HOP) { + ops = rcu_dereference(inet6_protos[proto]); + + if (unlikely(!ops)) + break; + + if (!(ops->flags & INET6_PROTO_GSO_EXTHDR)) + break; + } + + if (unlikely(!pskb_may_pull(skb, 8))) + break; + + opth = (void *)skb->data; + len = opth->hdrlen * 8 + 8; + + if (unlikely(!pskb_may_pull(skb, len))) + break; + + proto = opth->nexthdr; + __skb_pull(skb, len); + } + + return ops; +} + +static int ipv6_gso_send_check(struct sk_buff *skb) +{ + struct ipv6hdr *ipv6h; + struct inet6_protocol *ops; + int err = -EINVAL; + + if (unlikely(!pskb_may_pull(skb, sizeof(*ipv6h)))) + goto out; + + ipv6h = skb->nh.ipv6h; + __skb_pull(skb, sizeof(*ipv6h)); + err = -EPROTONOSUPPORT; + + rcu_read_lock(); + ops = ipv6_gso_pull_exthdrs(skb, ipv6h->nexthdr); + if (likely(ops && ops->gso_send_check)) { + skb->h.raw = skb->data; + err = ops->gso_send_check(skb); + } + rcu_read_unlock(); + +out: + return err; +} + +static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb, int features) +{ + struct sk_buff *segs = ERR_PTR(-EINVAL); + struct ipv6hdr *ipv6h; + struct inet6_protocol *ops; + + if (!(features & NETIF_F_HW_CSUM)) + features &= ~NETIF_F_SG; + + if (unlikely(skb_shinfo(skb)->gso_type & + ~(SKB_GSO_UDP | + SKB_GSO_DODGY | + SKB_GSO_TCP_ECN | + SKB_GSO_TCPV6 | + 0))) + goto out; + + if (unlikely(!pskb_may_pull(skb, sizeof(*ipv6h)))) + goto out; + + ipv6h = skb->nh.ipv6h; + __skb_pull(skb, sizeof(*ipv6h)); + segs = ERR_PTR(-EPROTONOSUPPORT); + + rcu_read_lock(); + ops = ipv6_gso_pull_exthdrs(skb, ipv6h->nexthdr); + if (likely(ops && ops->gso_segment)) { + skb->h.raw = skb->data; + segs = ops->gso_segment(skb, features); + } + rcu_read_unlock(); + + if (unlikely(IS_ERR(segs))) + goto out; + + for (skb = segs; skb; skb = skb->next) { + ipv6h = skb->nh.ipv6h; + ipv6h->payload_len = htons(skb->len - skb->mac_len - + sizeof(*ipv6h)); + } + +out: + return segs; +} + static struct packet_type ipv6_packet_type = { .type = __constant_htons(ETH_P_IPV6), .func = ipv6_rcv, + .gso_send_check = ipv6_gso_send_check, + .gso_segment = ipv6_gso_segment, }; struct ip6_ra_chain *ip6_ra_chain; @@ -259,7 +365,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname, break; case IPV6_TCLASS: - if (val < 0 || val > 0xff) + if (val < -1 || val > 0xff) goto e_inval; np->tclass = val; retv = 0; @@ -844,6 +950,8 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname, case IPV6_TCLASS: val = np->tclass; + if (val < 0) + val = 0; break; case IPV6_RECVTCLASS: diff --git a/net/ipv6/ipv6_syms.c b/net/ipv6/ipv6_syms.c index 16482785b..dd4d1ce77 100644 --- a/net/ipv6/ipv6_syms.c +++ b/net/ipv6/ipv6_syms.c @@ -1,5 +1,4 @@ -#include #include #include #include diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c index 6e871afbb..639eb20c9 100644 --- a/net/ipv6/mcast.c +++ b/net/ipv6/mcast.c @@ -28,7 +28,6 @@ * - MLDv2 support */ -#include #include #include #include @@ -269,13 +268,14 @@ int ipv6_sock_mc_drop(struct sock *sk, int ifindex, struct in6_addr *addr) if ((dev = dev_get_by_index(mc_lst->ifindex)) != NULL) { struct inet6_dev *idev = in6_dev_get(dev); + (void) ip6_mc_leave_src(sk, mc_lst, idev); if (idev) { - (void) ip6_mc_leave_src(sk,mc_lst,idev); __ipv6_dev_mc_dec(idev, &mc_lst->addr); in6_dev_put(idev); } dev_put(dev); - } + } else + (void) ip6_mc_leave_src(sk, mc_lst, NULL); sock_kfree_s(sk, mc_lst, sizeof(*mc_lst)); return 0; } @@ -335,13 +335,14 @@ void ipv6_sock_mc_close(struct sock *sk) if (dev) { struct inet6_dev *idev = in6_dev_get(dev); + (void) ip6_mc_leave_src(sk, mc_lst, idev); if (idev) { - (void) ip6_mc_leave_src(sk, mc_lst, idev); __ipv6_dev_mc_dec(idev, &mc_lst->addr); in6_dev_put(idev); } dev_put(dev); - } + } else + (void) ip6_mc_leave_src(sk, mc_lst, NULL); sock_kfree_s(sk, mc_lst, sizeof(*mc_lst)); diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index dfa20d3be..b50055b92 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c @@ -48,7 +48,6 @@ #endif #include -#include #include #include #include diff --git a/net/ipv6/netfilter/ip6_queue.c b/net/ipv6/netfilter/ip6_queue.c index b4b7d441a..968a14be0 100644 --- a/net/ipv6/netfilter/ip6_queue.c +++ b/net/ipv6/netfilter/ip6_queue.c @@ -505,7 +505,7 @@ ipq_rcv_skb(struct sk_buff *skb) if (type <= IPQM_BASE) return; - if (security_netlink_recv(skb)) + if (security_netlink_recv(skb, CAP_NET_ADMIN)) RCV_SKB_FAIL(-EPERM); write_lock_bh(&queue_lock); diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c index 2e72f89a7..c9d6b23cd 100644 --- a/net/ipv6/netfilter/ip6_tables.c +++ b/net/ipv6/netfilter/ip6_tables.c @@ -19,13 +19,13 @@ */ #include -#include #include #include #include #include #include #include +#include #include #include #include @@ -377,7 +377,7 @@ ip6t_do_table(struct sk_buff **pskb, } while (!hotdrop); #ifdef CONFIG_NETFILTER_DEBUG - ((struct ip6t_entry *)table_base)->comefrom = 0xdead57ac; + ((struct ip6t_entry *)table_base)->comefrom = NETFILTER_LINK_POISON; #endif read_unlock_bh(&table->lock); @@ -1281,7 +1281,8 @@ int ip6t_register_table(struct xt_table *table, return ret; } - if (xt_register_table(table, &bootstrap, newinfo) != 0) { + ret = xt_register_table(table, &bootstrap, newinfo); + if (ret != 0) { xt_free_table_info(newinfo); return ret; } @@ -1397,23 +1398,39 @@ static int __init ip6_tables_init(void) { int ret; - xt_proto_init(AF_INET6); + ret = xt_proto_init(AF_INET6); + if (ret < 0) + goto err1; /* Noone else will be downing sem now, so we won't sleep */ - xt_register_target(&ip6t_standard_target); - xt_register_target(&ip6t_error_target); - xt_register_match(&icmp6_matchstruct); + ret = xt_register_target(&ip6t_standard_target); + if (ret < 0) + goto err2; + ret = xt_register_target(&ip6t_error_target); + if (ret < 0) + goto err3; + ret = xt_register_match(&icmp6_matchstruct); + if (ret < 0) + goto err4; /* Register setsockopt */ ret = nf_register_sockopt(&ip6t_sockopts); - if (ret < 0) { - duprintf("Unable to register sockopts.\n"); - xt_proto_fini(AF_INET6); - return ret; - } + if (ret < 0) + goto err5; printk("ip6_tables: (C) 2000-2006 Netfilter Core Team\n"); return 0; + +err5: + xt_unregister_match(&icmp6_matchstruct); +err4: + xt_unregister_target(&ip6t_error_target); +err3: + xt_unregister_target(&ip6t_standard_target); +err2: + xt_proto_fini(AF_INET6); +err1: + return ret; } static void __exit ip6_tables_fini(void) diff --git a/net/ipv6/netfilter/ip6t_REJECT.c b/net/ipv6/netfilter/ip6t_REJECT.c index de1175c27..8629ba195 100644 --- a/net/ipv6/netfilter/ip6t_REJECT.c +++ b/net/ipv6/netfilter/ip6t_REJECT.c @@ -15,7 +15,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include diff --git a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c index 93bae36f2..c2ab38ff4 100644 --- a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c +++ b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c @@ -20,7 +20,6 @@ * structures. */ -#include #include #include #include @@ -189,7 +188,7 @@ static unsigned int ipv6_confirm(unsigned int hooknum, /* This is where we call the helper: as the packet goes out. */ ct = nf_ct_get(*pskb, &ctinfo); - if (!ct) + if (!ct || ctinfo == IP_CT_RELATED + IP_CT_IS_REPLY) goto out; help = nfct_help(ct); diff --git a/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c b/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c index 86c670326..ef18a7b70 100644 --- a/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c +++ b/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c @@ -233,7 +233,7 @@ icmpv6_error(struct sk_buff *skb, unsigned int dataoff, return -NF_ACCEPT; } - if (hooknum == NF_IP6_PRE_ROUTING && + if (nf_conntrack_checksum && hooknum == NF_IP6_PRE_ROUTING && nf_ip6_checksum(skb, hooknum, dataoff, IPPROTO_ICMPV6)) { nf_log_packet(PF_INET6, 0, skb, NULL, NULL, NULL, "nf_ct_icmpv6: ICMPv6 checksum failed\n"); diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c index 3e319035f..00d558380 100644 --- a/net/ipv6/netfilter/nf_conntrack_reasm.c +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c @@ -14,7 +14,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include @@ -456,13 +455,9 @@ static int nf_ct_frag6_queue(struct nf_ct_frag6_queue *fq, struct sk_buff *skb, DEBUGP("queue: message is too short.\n"); goto err; } - if (end-offset < skb->len) { - if (pskb_trim(skb, end - offset)) { - DEBUGP("Can't trim\n"); - goto err; - } - if (skb->ip_summed != CHECKSUM_UNNECESSARY) - skb->ip_summed = CHECKSUM_NONE; + if (pskb_trim_rcsum(skb, end - offset)) { + DEBUGP("Can't trim\n"); + goto err; } /* Find out which fragments are in front and at the back of us diff --git a/net/ipv6/proc.c b/net/ipv6/proc.c index 779ddf77f..efee7a630 100644 --- a/net/ipv6/proc.c +++ b/net/ipv6/proc.c @@ -17,7 +17,6 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ -#include #include #include #include diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index fa1ce0ae1..15b862d8a 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c @@ -411,6 +411,7 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk, /* Copy the address. */ if (sin6) { sin6->sin6_family = AF_INET6; + sin6->sin6_port = 0; ipv6_addr_copy(&sin6->sin6_addr, &skb->nh.ipv6h->saddr); sin6->sin6_flowinfo = 0; sin6->sin6_scope_id = 0; @@ -780,7 +781,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, } if (tclass < 0) { - tclass = np->cork.tclass; + tclass = np->tclass; if (tclass < 0) tclass = 0; } diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c index eef985e01..4e299c69e 100644 --- a/net/ipv6/reassembly.c +++ b/net/ipv6/reassembly.c @@ -28,7 +28,6 @@ * YOSHIFUJI,H. @USAGI Always remove fragment header to * calculate ICV correctly. */ -#include #include #include #include diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 8a7779327..d9baca062 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -25,7 +25,6 @@ */ #include -#include #include #include #include @@ -54,6 +53,7 @@ #include #include #include +#include #include @@ -349,7 +349,7 @@ static struct rt6_info *rt6_select(struct rt6_info **head, int oif, (strict & RT6_SELECT_F_REACHABLE) && last && last != rt0) { /* no entries matched; do round-robin */ - static spinlock_t lock = SPIN_LOCK_UNLOCKED; + static DEFINE_SPINLOCK(lock); spin_lock(&lock); *head = rt0->u.next; rt0->u.next = last->u.next; @@ -743,6 +743,7 @@ static void ip6_rt_update_pmtu(struct dst_entry *dst, u32 mtu) dst->metrics[RTAX_FEATURES-1] |= RTAX_FEATURE_ALLFRAG; } dst->metrics[RTAX_MTU-1] = mtu; + call_netevent_notifiers(NETEVENT_PMTU_UPDATE, dst); } } @@ -1156,6 +1157,7 @@ void rt6_redirect(struct in6_addr *dest, struct in6_addr *saddr, struct rt6_info *rt, *nrt = NULL; int strict; struct fib6_node *fn; + struct netevent_redirect netevent; /* * Get the "current" route for this destination and @@ -1253,6 +1255,10 @@ restart: if (ip6_ins_rt(nrt, NULL, NULL, NULL)) goto out; + netevent.old = &rt->u.dst; + netevent.new = &nrt->u.dst; + call_netevent_notifiers(NETEVENT_REDIRECT, &netevent); + if (rt->rt6i_flags&RTF_CACHE) { ip6_del_rt(rt, NULL, NULL, NULL); return; @@ -1526,6 +1532,10 @@ int ipv6_route_ioctl(unsigned int cmd, void __user *arg) static int ip6_pkt_discard(struct sk_buff *skb) { + int type = ipv6_addr_type(&skb->nh.ipv6h->daddr); + if (type == IPV6_ADDR_ANY || type == IPV6_ADDR_RESERVED) + IP6_INC_STATS(IPSTATS_MIB_INADDRERRORS); + IP6_INC_STATS(IPSTATS_MIB_OUTNOROUTES); icmpv6_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_NOROUTE, 0, skb->dev); kfree_skb(skb); diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index 6578c3080..836eecd7e 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c @@ -18,7 +18,6 @@ * Nate Thompson : 6to4 support */ -#include #include #include #include @@ -381,7 +380,6 @@ static int ipip6_rcv(struct sk_buff *skb) secpath_reset(skb); skb->mac.raw = skb->nh.raw; skb->nh.raw = skb->data; - memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); IPCB(skb)->flags = 0; skb->protocol = htons(ETH_P_IPV6); skb->pkt_type = PACKET_HOST; diff --git a/net/ipv6/sysctl_net_ipv6.c b/net/ipv6/sysctl_net_ipv6.c index 8eff9fa1e..7a4639db1 100644 --- a/net/ipv6/sysctl_net_ipv6.c +++ b/net/ipv6/sysctl_net_ipv6.c @@ -7,7 +7,6 @@ #include #include -#include #include #include #include diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 301eee726..72c074ce4 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c @@ -26,7 +26,6 @@ */ #include -#include #include #include #include @@ -270,9 +269,8 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr, ipv6_addr_copy(&np->saddr, saddr); inet->rcv_saddr = LOOPBACK4_IPV6; - ip6_dst_store(sk, dst, NULL); - sk->sk_route_caps = dst->dev->features & - ~(NETIF_F_IP_CSUM | NETIF_F_TSO); + sk->sk_gso_type = SKB_GSO_TCPV6; + __ip6_dst_store(sk, dst, NULL); icsk->icsk_ext_hdr_len = 0; if (np->opt) @@ -429,7 +427,6 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, case TCP_SYN_RECV: /* Cannot happen. It can, it SYNs are crossed. --ANK */ if (!sock_owned_by_user(sk)) { - TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS); sk->sk_err = err; sk->sk_error_report(sk); /* Wake people up to see the error (see connect in sock.c) */ @@ -554,6 +551,24 @@ static void tcp_v6_send_check(struct sock *sk, int len, struct sk_buff *skb) } } +static int tcp_v6_gso_send_check(struct sk_buff *skb) +{ + struct ipv6hdr *ipv6h; + struct tcphdr *th; + + if (!pskb_may_pull(skb, sizeof(*th))) + return -EINVAL; + + ipv6h = skb->nh.ipv6h; + th = skb->h.th; + + th->check = 0; + th->check = ~csum_ipv6_magic(&ipv6h->saddr, &ipv6h->daddr, skb->len, + IPPROTO_TCP, 0); + skb->csum = offsetof(struct tcphdr, check); + skb->ip_summed = CHECKSUM_HW; + return 0; +} static void tcp_v6_send_reset(struct sk_buff *skb) { @@ -815,7 +830,6 @@ drop: if (req) reqsk_free(req); - TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS); return 0; /* don't send reset */ } @@ -930,9 +944,8 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, * 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); + newsk->sk_gso_type = SKB_GSO_TCPV6; + __ip6_dst_store(newsk, dst, NULL); newtcp6sk = (struct tcp6_sock *)newsk; inet_sk(newsk)->pinet6 = &newtcp6sk->inet6; @@ -1215,11 +1228,19 @@ process: skb->dev = NULL; - bh_lock_sock(sk); + bh_lock_sock_nested(sk); ret = 0; if (!sock_owned_by_user(sk)) { - if (!tcp_prequeue(sk, skb)) - ret = tcp_v6_do_rcv(sk, skb); +#ifdef CONFIG_NET_DMA + struct tcp_sock *tp = tcp_sk(sk); + if (tp->ucopy.dma_chan) + ret = tcp_v6_do_rcv(sk, skb); + else +#endif + { + if (!tcp_prequeue(sk, skb)) + ret = tcp_v6_do_rcv(sk, skb); + } } else sk_add_backlog(sk, skb); bh_unlock_sock(sk); @@ -1461,7 +1482,8 @@ static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i) dest->s6_addr32[0], dest->s6_addr32[1], dest->s6_addr32[2], dest->s6_addr32[3], destp, sp->sk_state, - tp->write_seq-tp->snd_una, tp->rcv_nxt-tp->copied_seq, + tp->write_seq-tp->snd_una, + (sp->sk_state == TCP_LISTEN) ? sp->sk_ack_backlog : (tp->rcv_nxt - tp->copied_seq), timer_active, jiffies_to_clock_t(timer_expires - jiffies), icsk->icsk_retransmits, @@ -1597,6 +1619,8 @@ struct proto tcpv6_prot = { static struct inet6_protocol tcpv6_protocol = { .handler = tcp_v6_rcv, .err_handler = tcp_v6_err, + .gso_send_check = tcp_v6_gso_send_check, + .gso_segment = tcp_tso_segment, .flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL, }; diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 8d3432a70..3d54f2464 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -23,7 +23,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include @@ -783,7 +782,7 @@ do_udp_sendmsg: connected = 0; } - err = ip6_dst_lookup(sk, &dst, fl); + err = ip6_sk_dst_lookup(sk, &dst, fl); if (err) goto out; if (final_p) diff --git a/net/ipv6/xfrm6_input.c b/net/ipv6/xfrm6_input.c index 00cfdee18..0405d74ff 100644 --- a/net/ipv6/xfrm6_input.c +++ b/net/ipv6/xfrm6_input.c @@ -13,21 +13,9 @@ #include #include #include -#include -#include -#include #include #include -static inline void ipip6_ecn_decapsulate(struct sk_buff *skb) -{ - struct ipv6hdr *outer_iph = skb->nh.ipv6h; - struct ipv6hdr *inner_iph = skb->h.ipv6h; - - if (INET_ECN_is_ce(ipv6_get_dsfield(outer_iph))) - IP6_ECN_set_ce(inner_iph); -} - int xfrm6_rcv_spi(struct sk_buff *skb, u32 spi) { int err; @@ -81,21 +69,10 @@ int xfrm6_rcv_spi(struct sk_buff *skb, u32 spi) xfrm_vec[xfrm_nr++] = x; + if (x->mode->input(x, skb)) + goto drop; + if (x->props.mode) { /* XXX */ - if (nexthdr != IPPROTO_IPV6) - goto drop; - if (!pskb_may_pull(skb, sizeof(struct ipv6hdr))) - goto drop; - if (skb_cloned(skb) && - pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) - goto drop; - if (x->props.flags & XFRM_STATE_DECAP_DSCP) - ipv6_copy_dscp(skb->nh.ipv6h, skb->h.ipv6h); - if (!(x->props.flags & XFRM_STATE_NOECN)) - ipip6_ecn_decapsulate(skb); - skb->mac.raw = memmove(skb->data - skb->mac_len, - skb->mac.raw, skb->mac_len); - skb->nh.raw = skb->data; decaps = 1; break; } diff --git a/net/ipv6/xfrm6_output.c b/net/ipv6/xfrm6_output.c index e9ea33892..c8c8b44a0 100644 --- a/net/ipv6/xfrm6_output.c +++ b/net/ipv6/xfrm6_output.c @@ -14,68 +14,9 @@ #include #include #include -#include -#include #include #include -/* Add encapsulation header. - * - * In transport mode, the IP header and mutable extension headers will be moved - * forward to make space for the encapsulation header. - * - * In tunnel mode, the top IP header will be constructed per RFC 2401. - * The following fields in it shall be filled in by x->type->output: - * payload_len - * - * On exit, skb->h will be set to the start of the encapsulation header to be - * filled in by x->type->output and skb->nh will be set to the nextheader field - * of the extension header directly preceding the encapsulation header, or in - * its absence, that of the top IP header. The value of skb->data will always - * point to the top IP header. - */ -static void xfrm6_encap(struct sk_buff *skb) -{ - struct dst_entry *dst = skb->dst; - struct xfrm_state *x = dst->xfrm; - struct ipv6hdr *iph, *top_iph; - int dsfield; - - skb_push(skb, x->props.header_len); - iph = skb->nh.ipv6h; - - if (!x->props.mode) { - u8 *prevhdr; - int hdr_len; - - hdr_len = ip6_find_1stfragopt(skb, &prevhdr); - skb->nh.raw = prevhdr - x->props.header_len; - skb->h.raw = skb->data + hdr_len; - memmove(skb->data, iph, hdr_len); - return; - } - - skb->nh.raw = skb->data; - top_iph = skb->nh.ipv6h; - skb->nh.raw = &top_iph->nexthdr; - skb->h.ipv6h = top_iph + 1; - - top_iph->version = 6; - top_iph->priority = iph->priority; - top_iph->flow_lbl[0] = iph->flow_lbl[0]; - top_iph->flow_lbl[1] = iph->flow_lbl[1]; - top_iph->flow_lbl[2] = iph->flow_lbl[2]; - dsfield = ipv6_get_dsfield(top_iph); - dsfield = INET_ECN_encapsulate(dsfield, dsfield); - if (x->props.flags & XFRM_STATE_NOECN) - dsfield &= ~INET_ECN_MASK; - ipv6_change_dsfield(top_iph, 0, dsfield); - top_iph->nexthdr = IPPROTO_IPV6; - top_iph->hop_limit = dst_metric(dst->child, RTAX_HOPLIMIT); - ipv6_addr_copy(&top_iph->saddr, (struct in6_addr *)&x->props.saddr); - ipv6_addr_copy(&top_iph->daddr, (struct in6_addr *)&x->id.daddr); -} - static int xfrm6_tunnel_check_size(struct sk_buff *skb) { int mtu, ret = 0; @@ -118,7 +59,9 @@ static int xfrm6_output_one(struct sk_buff *skb) if (err) goto error; - xfrm6_encap(skb); + err = x->mode->output(skb); + if (err) + goto error; err = x->type->output(x, skb); if (err) @@ -182,7 +125,7 @@ static int xfrm6_output_finish(struct sk_buff *skb) if (!skb_is_gso(skb)) return xfrm6_output_finish2(skb); - skb->protocol = htons(ETH_P_IP); + skb->protocol = htons(ETH_P_IPV6); segs = skb_gso_segment(skb, 0); kfree_skb(skb); if (unlikely(IS_ERR(segs))) diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c index 88c840f1b..73cd250ae 100644 --- a/net/ipv6/xfrm6_policy.c +++ b/net/ipv6/xfrm6_policy.c @@ -12,7 +12,6 @@ */ #include -#include #include #include #include @@ -23,8 +22,6 @@ static struct dst_ops xfrm6_dst_ops; static struct xfrm_policy_afinfo xfrm6_policy_afinfo; -static struct xfrm_type_map xfrm6_type_map = { .lock = RW_LOCK_UNLOCKED }; - static int xfrm6_dst_lookup(struct xfrm_dst **dst, struct flowi *fl) { int err = 0; @@ -249,9 +246,7 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl) static inline int xfrm6_garbage_collect(void) { - read_lock(&xfrm6_policy_afinfo.lock); xfrm6_policy_afinfo.garbage_collect(); - read_unlock(&xfrm6_policy_afinfo.lock); return (atomic_read(&xfrm6_dst_ops.entries) > xfrm6_dst_ops.gc_thresh*2); } @@ -311,8 +306,6 @@ static struct dst_ops xfrm6_dst_ops = { static struct xfrm_policy_afinfo xfrm6_policy_afinfo = { .family = AF_INET6, - .lock = RW_LOCK_UNLOCKED, - .type_map = &xfrm6_type_map, .dst_ops = &xfrm6_dst_ops, .dst_lookup = xfrm6_dst_lookup, .find_bundle = __xfrm6_find_bundle, diff --git a/net/ipv6/xfrm6_state.c b/net/ipv6/xfrm6_state.c index a5723024d..b33296b3f 100644 --- a/net/ipv6/xfrm6_state.c +++ b/net/ipv6/xfrm6_state.c @@ -135,7 +135,6 @@ __xfrm6_find_acq(u8 mode, u32 reqid, u8 proto, static struct xfrm_state_afinfo xfrm6_state_afinfo = { .family = AF_INET6, - .lock = RW_LOCK_UNLOCKED, .init_tempsel = __xfrm6_init_tempsel, .state_lookup = __xfrm6_state_lookup, .find_acq = __xfrm6_find_acq, diff --git a/net/ipv6/xfrm6_tunnel.c b/net/ipv6/xfrm6_tunnel.c index ffcadd68b..c8f9369c2 100644 --- a/net/ipv6/xfrm6_tunnel.c +++ b/net/ipv6/xfrm6_tunnel.c @@ -21,37 +21,15 @@ * Based on net/ipv4/xfrm4_tunnel.c * */ -#include #include #include #include #include #include #include -#include #include #include - -#ifdef CONFIG_IPV6_XFRM6_TUNNEL_DEBUG -# define X6TDEBUG 3 -#else -# define X6TDEBUG 1 -#endif - -#define X6TPRINTK(fmt, args...) printk(fmt, ## args) -#define X6TNOPRINTK(fmt, args...) do { ; } while(0) - -#if X6TDEBUG >= 1 -# define X6TPRINTK1 X6TPRINTK -#else -# define X6TPRINTK1 X6TNOPRINTK -#endif - -#if X6TDEBUG >= 3 -# define X6TPRINTK3 X6TPRINTK -#else -# define X6TPRINTK3 X6TNOPRINTK -#endif +#include /* * xfrm_tunnel_spi things are for allocating unique id ("spi") @@ -63,15 +41,8 @@ struct xfrm6_tunnel_spi { xfrm_address_t addr; u32 spi; atomic_t refcnt; -#ifdef XFRM6_TUNNEL_SPI_MAGIC - u32 magic; -#endif }; -#ifdef CONFIG_IPV6_XFRM6_TUNNEL_DEBUG -# define XFRM6_TUNNEL_SPI_MAGIC 0xdeadbeef -#endif - static DEFINE_RWLOCK(xfrm6_tunnel_spi_lock); static u32 xfrm6_tunnel_spi; @@ -79,7 +50,7 @@ static u32 xfrm6_tunnel_spi; #define XFRM6_TUNNEL_SPI_MIN 1 #define XFRM6_TUNNEL_SPI_MAX 0xffffffff -static kmem_cache_t *xfrm6_tunnel_spi_kmem; +static kmem_cache_t *xfrm6_tunnel_spi_kmem __read_mostly; #define XFRM6_TUNNEL_SPI_BYADDR_HSIZE 256 #define XFRM6_TUNNEL_SPI_BYSPI_HSIZE 256 @@ -87,43 +58,15 @@ static kmem_cache_t *xfrm6_tunnel_spi_kmem; static struct hlist_head xfrm6_tunnel_spi_byaddr[XFRM6_TUNNEL_SPI_BYADDR_HSIZE]; static struct hlist_head xfrm6_tunnel_spi_byspi[XFRM6_TUNNEL_SPI_BYSPI_HSIZE]; -#ifdef XFRM6_TUNNEL_SPI_MAGIC -static int x6spi_check_magic(const struct xfrm6_tunnel_spi *x6spi, - const char *name) -{ - if (unlikely(x6spi->magic != XFRM6_TUNNEL_SPI_MAGIC)) { - X6TPRINTK3(KERN_DEBUG "%s(): x6spi object " - "at %p has corrupted magic %08x " - "(should be %08x)\n", - name, x6spi, x6spi->magic, XFRM6_TUNNEL_SPI_MAGIC); - return -1; - } - return 0; -} -#else -static int inline x6spi_check_magic(const struct xfrm6_tunnel_spi *x6spi, - const char *name) -{ - return 0; -} -#endif - -#define X6SPI_CHECK_MAGIC(x6spi) x6spi_check_magic((x6spi), __FUNCTION__) - - static unsigned inline xfrm6_tunnel_spi_hash_byaddr(xfrm_address_t *addr) { unsigned h; - X6TPRINTK3(KERN_DEBUG "%s(addr=%p)\n", __FUNCTION__, addr); - h = addr->a6[0] ^ addr->a6[1] ^ addr->a6[2] ^ addr->a6[3]; h ^= h >> 16; h ^= h >> 8; h &= XFRM6_TUNNEL_SPI_BYADDR_HSIZE - 1; - X6TPRINTK3(KERN_DEBUG "%s() = %u\n", __FUNCTION__, h); - return h; } @@ -137,19 +80,13 @@ static int xfrm6_tunnel_spi_init(void) { int i; - X6TPRINTK3(KERN_DEBUG "%s()\n", __FUNCTION__); - xfrm6_tunnel_spi = 0; xfrm6_tunnel_spi_kmem = kmem_cache_create("xfrm6_tunnel_spi", sizeof(struct xfrm6_tunnel_spi), 0, SLAB_HWCACHE_ALIGN, NULL, NULL); - if (!xfrm6_tunnel_spi_kmem) { - X6TPRINTK1(KERN_ERR - "%s(): failed to allocate xfrm6_tunnel_spi_kmem\n", - __FUNCTION__); + if (!xfrm6_tunnel_spi_kmem) return -ENOMEM; - } for (i = 0; i < XFRM6_TUNNEL_SPI_BYADDR_HSIZE; i++) INIT_HLIST_HEAD(&xfrm6_tunnel_spi_byaddr[i]); @@ -162,22 +99,16 @@ static void xfrm6_tunnel_spi_fini(void) { int i; - X6TPRINTK3(KERN_DEBUG "%s()\n", __FUNCTION__); - for (i = 0; i < XFRM6_TUNNEL_SPI_BYADDR_HSIZE; i++) { if (!hlist_empty(&xfrm6_tunnel_spi_byaddr[i])) - goto err; + return; } for (i = 0; i < XFRM6_TUNNEL_SPI_BYSPI_HSIZE; i++) { if (!hlist_empty(&xfrm6_tunnel_spi_byspi[i])) - goto err; + return; } kmem_cache_destroy(xfrm6_tunnel_spi_kmem); xfrm6_tunnel_spi_kmem = NULL; - return; -err: - X6TPRINTK1(KERN_ERR "%s(): table is not empty\n", __FUNCTION__); - return; } static struct xfrm6_tunnel_spi *__xfrm6_tunnel_spi_lookup(xfrm_address_t *saddr) @@ -185,19 +116,13 @@ static struct xfrm6_tunnel_spi *__xfrm6_tunnel_spi_lookup(xfrm_address_t *saddr) struct xfrm6_tunnel_spi *x6spi; struct hlist_node *pos; - X6TPRINTK3(KERN_DEBUG "%s(saddr=%p)\n", __FUNCTION__, saddr); - hlist_for_each_entry(x6spi, pos, &xfrm6_tunnel_spi_byaddr[xfrm6_tunnel_spi_hash_byaddr(saddr)], list_byaddr) { - if (memcmp(&x6spi->addr, saddr, sizeof(x6spi->addr)) == 0) { - X6SPI_CHECK_MAGIC(x6spi); - X6TPRINTK3(KERN_DEBUG "%s() = %p(%u)\n", __FUNCTION__, x6spi, x6spi->spi); + if (memcmp(&x6spi->addr, saddr, sizeof(x6spi->addr)) == 0) return x6spi; - } } - X6TPRINTK3(KERN_DEBUG "%s() = NULL(0)\n", __FUNCTION__); return NULL; } @@ -206,8 +131,6 @@ u32 xfrm6_tunnel_spi_lookup(xfrm_address_t *saddr) struct xfrm6_tunnel_spi *x6spi; u32 spi; - X6TPRINTK3(KERN_DEBUG "%s(saddr=%p)\n", __FUNCTION__, saddr); - read_lock_bh(&xfrm6_tunnel_spi_lock); x6spi = __xfrm6_tunnel_spi_lookup(saddr); spi = x6spi ? x6spi->spi : 0; @@ -224,8 +147,6 @@ static u32 __xfrm6_tunnel_alloc_spi(xfrm_address_t *saddr) struct hlist_node *pos; unsigned index; - X6TPRINTK3(KERN_DEBUG "%s(saddr=%p)\n", __FUNCTION__, saddr); - if (xfrm6_tunnel_spi < XFRM6_TUNNEL_SPI_MIN || xfrm6_tunnel_spi >= XFRM6_TUNNEL_SPI_MAX) xfrm6_tunnel_spi = XFRM6_TUNNEL_SPI_MIN; @@ -259,19 +180,10 @@ try_next_2:; spi = 0; goto out; alloc_spi: - X6TPRINTK3(KERN_DEBUG "%s(): allocate new spi for " - "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n", - __FUNCTION__, - NIP6(*(struct in6_addr *)saddr)); x6spi = kmem_cache_alloc(xfrm6_tunnel_spi_kmem, SLAB_ATOMIC); - if (!x6spi) { - X6TPRINTK1(KERN_ERR "%s(): kmem_cache_alloc() failed\n", - __FUNCTION__); + if (!x6spi) goto out; - } -#ifdef XFRM6_TUNNEL_SPI_MAGIC - x6spi->magic = XFRM6_TUNNEL_SPI_MAGIC; -#endif + memcpy(&x6spi->addr, saddr, sizeof(x6spi->addr)); x6spi->spi = spi; atomic_set(&x6spi->refcnt, 1); @@ -280,9 +192,7 @@ alloc_spi: index = xfrm6_tunnel_spi_hash_byaddr(saddr); hlist_add_head(&x6spi->list_byaddr, &xfrm6_tunnel_spi_byaddr[index]); - X6SPI_CHECK_MAGIC(x6spi); out: - X6TPRINTK3(KERN_DEBUG "%s() = %u\n", __FUNCTION__, spi); return spi; } @@ -291,8 +201,6 @@ u32 xfrm6_tunnel_alloc_spi(xfrm_address_t *saddr) struct xfrm6_tunnel_spi *x6spi; u32 spi; - X6TPRINTK3(KERN_DEBUG "%s(saddr=%p)\n", __FUNCTION__, saddr); - write_lock_bh(&xfrm6_tunnel_spi_lock); x6spi = __xfrm6_tunnel_spi_lookup(saddr); if (x6spi) { @@ -302,8 +210,6 @@ u32 xfrm6_tunnel_alloc_spi(xfrm_address_t *saddr) spi = __xfrm6_tunnel_alloc_spi(saddr); write_unlock_bh(&xfrm6_tunnel_spi_lock); - X6TPRINTK3(KERN_DEBUG "%s() = %u\n", __FUNCTION__, spi); - return spi; } @@ -314,8 +220,6 @@ void xfrm6_tunnel_free_spi(xfrm_address_t *saddr) struct xfrm6_tunnel_spi *x6spi; struct hlist_node *pos, *n; - X6TPRINTK3(KERN_DEBUG "%s(saddr=%p)\n", __FUNCTION__, saddr); - write_lock_bh(&xfrm6_tunnel_spi_lock); hlist_for_each_entry_safe(x6spi, pos, n, @@ -323,13 +227,6 @@ void xfrm6_tunnel_free_spi(xfrm_address_t *saddr) list_byaddr) { if (memcmp(&x6spi->addr, saddr, sizeof(x6spi->addr)) == 0) { - X6TPRINTK3(KERN_DEBUG "%s(): x6spi object " - "for %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x " - "found at %p\n", - __FUNCTION__, - NIP6(*(struct in6_addr *)saddr), - x6spi); - X6SPI_CHECK_MAGIC(x6spi); if (atomic_dec_and_test(&x6spi->refcnt)) { hlist_del(&x6spi->list_byaddr); hlist_del(&x6spi->list_byspi); @@ -353,76 +250,23 @@ static int xfrm6_tunnel_output(struct xfrm_state *x, struct sk_buff *skb) return 0; } -static int xfrm6_tunnel_input(struct xfrm_state *x, struct xfrm_decap_state *decap, struct sk_buff *skb) +static int xfrm6_tunnel_input(struct xfrm_state *x, struct sk_buff *skb) { return 0; } -static struct xfrm6_tunnel *xfrm6_tunnel_handler; -static DECLARE_MUTEX(xfrm6_tunnel_sem); - -int xfrm6_tunnel_register(struct xfrm6_tunnel *handler) -{ - int ret; - - down(&xfrm6_tunnel_sem); - ret = 0; - if (xfrm6_tunnel_handler != NULL) - ret = -EINVAL; - if (!ret) - xfrm6_tunnel_handler = handler; - up(&xfrm6_tunnel_sem); - - return ret; -} - -EXPORT_SYMBOL(xfrm6_tunnel_register); - -int xfrm6_tunnel_deregister(struct xfrm6_tunnel *handler) +static int xfrm6_tunnel_rcv(struct sk_buff *skb) { - int ret; - - down(&xfrm6_tunnel_sem); - ret = 0; - if (xfrm6_tunnel_handler != handler) - ret = -EINVAL; - if (!ret) - xfrm6_tunnel_handler = NULL; - up(&xfrm6_tunnel_sem); - - synchronize_net(); - - return ret; -} - -EXPORT_SYMBOL(xfrm6_tunnel_deregister); - -static int xfrm6_tunnel_rcv(struct sk_buff **pskb, unsigned int *nhoffp) -{ - struct sk_buff *skb = *pskb; - struct xfrm6_tunnel *handler = xfrm6_tunnel_handler; struct ipv6hdr *iph = skb->nh.ipv6h; u32 spi; - /* device-like_ip6ip6_handler() */ - if (handler && handler->handler(pskb, nhoffp) == 0) - return 0; - spi = xfrm6_tunnel_spi_lookup((xfrm_address_t *)&iph->saddr); - return xfrm6_rcv_spi(pskb, nhoffp, spi); + return xfrm6_rcv_spi(skb, spi); } -static void xfrm6_tunnel_err(struct sk_buff *skb, struct inet6_skb_parm *opt, - int type, int code, int offset, __u32 info) +static int xfrm6_tunnel_err(struct sk_buff *skb, struct inet6_skb_parm *opt, + int type, int code, int offset, __u32 info) { - struct xfrm6_tunnel *handler = xfrm6_tunnel_handler; - - /* call here first for device-like ip6ip6 err handling */ - if (handler) { - handler->err_handler(skb, opt, type, code, offset, info); - return; - } - /* xfrm6_tunnel native err handling */ switch (type) { case ICMPV6_DEST_UNREACH: @@ -433,20 +277,14 @@ static void xfrm6_tunnel_err(struct sk_buff *skb, struct inet6_skb_parm *opt, case ICMPV6_ADDR_UNREACH: case ICMPV6_PORT_UNREACH: default: - X6TPRINTK3(KERN_DEBUG - "xfrm6_tunnel: Destination Unreach.\n"); break; } break; case ICMPV6_PKT_TOOBIG: - X6TPRINTK3(KERN_DEBUG - "xfrm6_tunnel: Packet Too Big.\n"); break; case ICMPV6_TIME_EXCEED: switch (code) { case ICMPV6_EXC_HOPLIMIT: - X6TPRINTK3(KERN_DEBUG - "xfrm6_tunnel: Too small Hoplimit.\n"); break; case ICMPV6_EXC_FRAGTIME: default: @@ -463,10 +301,11 @@ static void xfrm6_tunnel_err(struct sk_buff *skb, struct inet6_skb_parm *opt, default: break; } - return; + + return 0; } -static int xfrm6_tunnel_init_state(struct xfrm_state *x, void *args) +static int xfrm6_tunnel_init_state(struct xfrm_state *x) { if (!x->props.mode) return -EINVAL; @@ -494,31 +333,23 @@ static struct xfrm_type xfrm6_tunnel_type = { .output = xfrm6_tunnel_output, }; -static struct inet6_protocol xfrm6_tunnel_protocol = { +static struct xfrm6_tunnel xfrm6_tunnel_handler = { .handler = xfrm6_tunnel_rcv, - .err_handler = xfrm6_tunnel_err, - .flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL, + .err_handler = xfrm6_tunnel_err, + .priority = 2, }; static int __init xfrm6_tunnel_init(void) { - X6TPRINTK3(KERN_DEBUG "%s()\n", __FUNCTION__); - - if (xfrm_register_type(&xfrm6_tunnel_type, AF_INET6) < 0) { - X6TPRINTK1(KERN_ERR - "xfrm6_tunnel init: can't add xfrm type\n"); + if (xfrm_register_type(&xfrm6_tunnel_type, AF_INET6) < 0) return -EAGAIN; - } - if (inet6_add_protocol(&xfrm6_tunnel_protocol, IPPROTO_IPV6) < 0) { - X6TPRINTK1(KERN_ERR - "xfrm6_tunnel init(): can't add protocol\n"); + + if (xfrm6_tunnel_register(&xfrm6_tunnel_handler)) { xfrm_unregister_type(&xfrm6_tunnel_type, AF_INET6); return -EAGAIN; } if (xfrm6_tunnel_spi_init() < 0) { - X6TPRINTK1(KERN_ERR - "xfrm6_tunnel init: failed to initialize spi\n"); - inet6_del_protocol(&xfrm6_tunnel_protocol, IPPROTO_IPV6); + xfrm6_tunnel_deregister(&xfrm6_tunnel_handler); xfrm_unregister_type(&xfrm6_tunnel_type, AF_INET6); return -EAGAIN; } @@ -527,15 +358,9 @@ static int __init xfrm6_tunnel_init(void) static void __exit xfrm6_tunnel_fini(void) { - X6TPRINTK3(KERN_DEBUG "%s()\n", __FUNCTION__); - xfrm6_tunnel_spi_fini(); - if (inet6_del_protocol(&xfrm6_tunnel_protocol, IPPROTO_IPV6) < 0) - X6TPRINTK1(KERN_ERR - "xfrm6_tunnel close: can't remove protocol\n"); - if (xfrm_unregister_type(&xfrm6_tunnel_type, AF_INET6) < 0) - X6TPRINTK1(KERN_ERR - "xfrm6_tunnel close: can't remove xfrm type\n"); + xfrm6_tunnel_deregister(&xfrm6_tunnel_handler); + xfrm_unregister_type(&xfrm6_tunnel_type, AF_INET6); } module_init(xfrm6_tunnel_init); diff --git a/net/ipx/af_ipx.c b/net/ipx/af_ipx.c index e6a50e826..bef3f6156 100644 --- a/net/ipx/af_ipx.c +++ b/net/ipx/af_ipx.c @@ -28,7 +28,6 @@ * See net/ipx/ChangeLog. */ -#include #include #include #include @@ -1643,14 +1642,17 @@ static int ipx_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_ty if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) goto out; - ipx = ipx_hdr(skb); - ipx_pktsize = ntohs(ipx->ipx_pktsize); + if (!pskb_may_pull(skb, sizeof(struct ipxhdr))) + goto drop; + + ipx_pktsize = ntohs(ipx_hdr(skb)->ipx_pktsize); /* Too small or invalid header? */ - if (ipx_pktsize < sizeof(struct ipxhdr) - || !pskb_may_pull(skb, ipx_pktsize)) + if (ipx_pktsize < sizeof(struct ipxhdr) || + !pskb_may_pull(skb, ipx_pktsize)) goto drop; + ipx = ipx_hdr(skb); if (ipx->ipx_checksum != IPX_NO_CHECKSUM && ipx->ipx_checksum != ipx_cksum(ipx, ipx_pktsize)) goto drop; diff --git a/net/ipx/ipx_proc.c b/net/ipx/ipx_proc.c index 1f73d9ea4..4c0c71206 100644 --- a/net/ipx/ipx_proc.c +++ b/net/ipx/ipx_proc.c @@ -4,7 +4,6 @@ * Copyright(C) Arnaldo Carvalho de Melo , 2002 */ -#include #include #ifdef CONFIG_PROC_FS #include diff --git a/net/ipx/ipx_route.c b/net/ipx/ipx_route.c index a394c6fe1..a30dbb1e0 100644 --- a/net/ipx/ipx_route.c +++ b/net/ipx/ipx_route.c @@ -7,7 +7,6 @@ * See net/ipx/ChangeLog. */ -#include #include #include #include @@ -238,7 +237,7 @@ int ipxrtr_route_packet(struct sock *sk, struct sockaddr_ipx *usipx, } /* Apply checksum. Not allowed on 802.3 links. */ - if (sk->sk_no_check || intrfc->if_dlink_type == IPX_FRAME_8023) + if (sk->sk_no_check || intrfc->if_dlink_type == htons(IPX_FRAME_8023)) ipx->ipx_checksum = 0xFFFF; else ipx->ipx_checksum = ipx_cksum(ipx, len + sizeof(struct ipxhdr)); diff --git a/net/ipx/sysctl_net_ipx.c b/net/ipx/sysctl_net_ipx.c index 510eda96d..fa574735c 100644 --- a/net/ipx/sysctl_net_ipx.c +++ b/net/ipx/sysctl_net_ipx.c @@ -6,7 +6,6 @@ * Added /proc/sys/net/ipx/ipx_pprop_broadcasting - acme March 4, 2001 */ -#include #include #include diff --git a/net/irda/af_irda.c b/net/irda/af_irda.c index 2f37c9f35..17699eeb6 100644 --- a/net/irda/af_irda.c +++ b/net/irda/af_irda.c @@ -42,7 +42,6 @@ * ********************************************************************/ -#include #include #include #include @@ -309,7 +308,7 @@ static void irda_connect_response(struct irda_sock *self) IRDA_ASSERT(self != NULL, return;); - skb = dev_alloc_skb(64); + skb = alloc_skb(64, GFP_ATOMIC); if (skb == NULL) { IRDA_DEBUG(0, "%s() Unable to allocate sk_buff!\n", __FUNCTION__); diff --git a/net/irda/ircomm/ircomm_core.c b/net/irda/ircomm/ircomm_core.c index 286881978..ad6b6af3d 100644 --- a/net/irda/ircomm/ircomm_core.c +++ b/net/irda/ircomm/ircomm_core.c @@ -29,7 +29,6 @@ * ********************************************************************/ -#include #include #include #include @@ -116,12 +115,10 @@ struct ircomm_cb *ircomm_open(notify_t *notify, __u8 service_type, int line) IRDA_ASSERT(ircomm != NULL, return NULL;); - self = kmalloc(sizeof(struct ircomm_cb), GFP_ATOMIC); + self = kzalloc(sizeof(struct ircomm_cb), GFP_ATOMIC); if (self == NULL) return NULL; - memset(self, 0, sizeof(struct ircomm_cb)); - self->notify = *notify; self->magic = IRCOMM_MAGIC; diff --git a/net/irda/ircomm/ircomm_lmp.c b/net/irda/ircomm/ircomm_lmp.c index d9097207a..959874b64 100644 --- a/net/irda/ircomm/ircomm_lmp.c +++ b/net/irda/ircomm/ircomm_lmp.c @@ -81,7 +81,7 @@ static int ircomm_lmp_connect_response(struct ircomm_cb *self, /* Any userdata supplied? */ if (userdata == NULL) { - tx_skb = dev_alloc_skb(64); + tx_skb = alloc_skb(64, GFP_ATOMIC); if (!tx_skb) return -ENOMEM; @@ -115,7 +115,7 @@ static int ircomm_lmp_disconnect_request(struct ircomm_cb *self, IRDA_DEBUG(0, "%s()\n", __FUNCTION__ ); if (!userdata) { - tx_skb = dev_alloc_skb(64); + tx_skb = alloc_skb(64, GFP_ATOMIC); if (!tx_skb) return -ENOMEM; diff --git a/net/irda/ircomm/ircomm_param.c b/net/irda/ircomm/ircomm_param.c index 6009bab05..a39f5735a 100644 --- a/net/irda/ircomm/ircomm_param.c +++ b/net/irda/ircomm/ircomm_param.c @@ -121,7 +121,7 @@ int ircomm_param_request(struct ircomm_tty_cb *self, __u8 pi, int flush) skb = self->ctrl_skb; if (!skb) { - skb = dev_alloc_skb(256); + skb = alloc_skb(256, GFP_ATOMIC); if (!skb) { spin_unlock_irqrestore(&self->spinlock, flags); return -ENOMEM; diff --git a/net/irda/ircomm/ircomm_tty.c b/net/irda/ircomm/ircomm_tty.c index 6f20b4206..3bcdb467e 100644 --- a/net/irda/ircomm/ircomm_tty.c +++ b/net/irda/ircomm/ircomm_tty.c @@ -30,7 +30,6 @@ * ********************************************************************/ -#include #include #include #include @@ -124,7 +123,6 @@ static int __init ircomm_tty_init(void) driver->owner = THIS_MODULE; driver->driver_name = "ircomm"; driver->name = "ircomm"; - driver->devfs_name = "ircomm"; driver->major = IRCOMM_TTY_MAJOR; driver->minor_start = IRCOMM_TTY_MINOR; driver->type = TTY_DRIVER_TYPE_SERIAL; @@ -381,12 +379,11 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp) self = hashbin_lock_find(ircomm_tty, line, NULL); if (!self) { /* No, so make new instance */ - self = kmalloc(sizeof(struct ircomm_tty_cb), GFP_KERNEL); + self = kzalloc(sizeof(struct ircomm_tty_cb), GFP_KERNEL); if (self == NULL) { IRDA_ERROR("%s(), kmalloc failed!\n", __FUNCTION__); return -ENOMEM; } - memset(self, 0, sizeof(struct ircomm_tty_cb)); self->magic = IRCOMM_TTY_MAGIC; self->flow = FLOW_STOP; @@ -761,8 +758,9 @@ static int ircomm_tty_write(struct tty_struct *tty, } } else { /* Prepare a full sized frame */ - skb = dev_alloc_skb(self->max_data_size+ - self->max_header_size); + skb = alloc_skb(self->max_data_size+ + self->max_header_size, + GFP_ATOMIC); if (!skb) { spin_unlock_irqrestore(&self->spinlock, flags); return -ENOBUFS; diff --git a/net/irda/irda_device.c b/net/irda/irda_device.c index e3debbdb6..7e7a31798 100644 --- a/net/irda/irda_device.c +++ b/net/irda/irda_device.c @@ -29,7 +29,6 @@ * ********************************************************************/ -#include #include #include #include @@ -402,12 +401,10 @@ dongle_t *irda_device_dongle_init(struct net_device *dev, int type) } /* Allocate dongle info for this instance */ - dongle = kmalloc(sizeof(dongle_t), GFP_KERNEL); + dongle = kzalloc(sizeof(dongle_t), GFP_KERNEL); if (!dongle) goto out; - memset(dongle, 0, sizeof(dongle_t)); - /* Bind the registration info to this particular instance */ dongle->issue = reg; dongle->dev = dev; diff --git a/net/irda/iriap.c b/net/irda/iriap.c index 2d2e2b191..61128aa05 100644 --- a/net/irda/iriap.c +++ b/net/irda/iriap.c @@ -24,7 +24,6 @@ * ********************************************************************/ -#include #include #include #include @@ -346,7 +345,7 @@ static void iriap_disconnect_request(struct iriap_cb *self) IRDA_ASSERT(self != NULL, return;); IRDA_ASSERT(self->magic == IAS_MAGIC, return;); - tx_skb = dev_alloc_skb(64); + tx_skb = alloc_skb(64, GFP_ATOMIC); if (tx_skb == NULL) { IRDA_DEBUG(0, "%s(), Could not allocate an sk_buff of length %d\n", __FUNCTION__, 64); @@ -397,7 +396,7 @@ int iriap_getvaluebyclass_request(struct iriap_cb *self, attr_len = strlen(attr); /* Up to IAS_MAX_ATTRIBNAME = 60 */ skb_len = self->max_header_size+2+name_len+1+attr_len+4; - tx_skb = dev_alloc_skb(skb_len); + tx_skb = alloc_skb(skb_len, GFP_ATOMIC); if (!tx_skb) return -ENOMEM; @@ -563,7 +562,8 @@ static void iriap_getvaluebyclass_response(struct iriap_cb *self, * value. We add 32 bytes because of the 6 bytes for the frame and * max 5 bytes for the value coding. */ - tx_skb = dev_alloc_skb(value->len + self->max_header_size + 32); + tx_skb = alloc_skb(value->len + self->max_header_size + 32, + GFP_ATOMIC); if (!tx_skb) return; @@ -701,7 +701,7 @@ void iriap_send_ack(struct iriap_cb *self) IRDA_ASSERT(self != NULL, return;); IRDA_ASSERT(self->magic == IAS_MAGIC, return;); - tx_skb = dev_alloc_skb(64); + tx_skb = alloc_skb(64, GFP_ATOMIC); if (!tx_skb) return; diff --git a/net/irda/iriap_event.c b/net/irda/iriap_event.c index a73607450..da17395df 100644 --- a/net/irda/iriap_event.c +++ b/net/irda/iriap_event.c @@ -365,7 +365,7 @@ static void state_r_disconnect(struct iriap_cb *self, IRIAP_EVENT event, switch (event) { case IAP_LM_CONNECT_INDICATION: - tx_skb = dev_alloc_skb(64); + tx_skb = alloc_skb(64, GFP_ATOMIC); if (tx_skb == NULL) { IRDA_WARNING("%s: unable to malloc!\n", __FUNCTION__); return; diff --git a/net/irda/irias_object.c b/net/irda/irias_object.c index 82e665c79..a154b1d71 100644 --- a/net/irda/irias_object.c +++ b/net/irda/irias_object.c @@ -82,13 +82,12 @@ struct ias_object *irias_new_object( char *name, int id) IRDA_DEBUG( 4, "%s()\n", __FUNCTION__); - obj = kmalloc(sizeof(struct ias_object), GFP_ATOMIC); + obj = kzalloc(sizeof(struct ias_object), GFP_ATOMIC); if (obj == NULL) { IRDA_WARNING("%s(), Unable to allocate object!\n", __FUNCTION__); return NULL; } - memset(obj, 0, sizeof( struct ias_object)); obj->magic = IAS_OBJECT_MAGIC; obj->name = strndup(name, IAS_MAX_CLASSNAME); @@ -346,13 +345,12 @@ void irias_add_integer_attrib(struct ias_object *obj, char *name, int value, IRDA_ASSERT(obj->magic == IAS_OBJECT_MAGIC, return;); IRDA_ASSERT(name != NULL, return;); - attrib = kmalloc(sizeof(struct ias_attrib), GFP_ATOMIC); + attrib = kzalloc(sizeof(struct ias_attrib), GFP_ATOMIC); if (attrib == NULL) { IRDA_WARNING("%s: Unable to allocate attribute!\n", __FUNCTION__); return; } - memset(attrib, 0, sizeof( struct ias_attrib)); attrib->magic = IAS_ATTRIB_MAGIC; attrib->name = strndup(name, IAS_MAX_ATTRIBNAME); @@ -382,13 +380,12 @@ void irias_add_octseq_attrib(struct ias_object *obj, char *name, __u8 *octets, IRDA_ASSERT(name != NULL, return;); IRDA_ASSERT(octets != NULL, return;); - attrib = kmalloc(sizeof(struct ias_attrib), GFP_ATOMIC); + attrib = kzalloc(sizeof(struct ias_attrib), GFP_ATOMIC); if (attrib == NULL) { IRDA_WARNING("%s: Unable to allocate attribute!\n", __FUNCTION__); return; } - memset(attrib, 0, sizeof( struct ias_attrib)); attrib->magic = IAS_ATTRIB_MAGIC; attrib->name = strndup(name, IAS_MAX_ATTRIBNAME); @@ -416,13 +413,12 @@ void irias_add_string_attrib(struct ias_object *obj, char *name, char *value, IRDA_ASSERT(name != NULL, return;); IRDA_ASSERT(value != NULL, return;); - attrib = kmalloc(sizeof( struct ias_attrib), GFP_ATOMIC); + attrib = kzalloc(sizeof( struct ias_attrib), GFP_ATOMIC); if (attrib == NULL) { IRDA_WARNING("%s: Unable to allocate attribute!\n", __FUNCTION__); return; } - memset(attrib, 0, sizeof( struct ias_attrib)); attrib->magic = IAS_ATTRIB_MAGIC; attrib->name = strndup(name, IAS_MAX_ATTRIBNAME); @@ -443,12 +439,11 @@ struct ias_value *irias_new_integer_value(int integer) { struct ias_value *value; - value = kmalloc(sizeof(struct ias_value), GFP_ATOMIC); + value = kzalloc(sizeof(struct ias_value), GFP_ATOMIC); if (value == NULL) { IRDA_WARNING("%s: Unable to kmalloc!\n", __FUNCTION__); return NULL; } - memset(value, 0, sizeof(struct ias_value)); value->type = IAS_INTEGER; value->len = 4; @@ -469,12 +464,11 @@ struct ias_value *irias_new_string_value(char *string) { struct ias_value *value; - value = kmalloc(sizeof(struct ias_value), GFP_ATOMIC); + value = kzalloc(sizeof(struct ias_value), GFP_ATOMIC); if (value == NULL) { IRDA_WARNING("%s: Unable to kmalloc!\n", __FUNCTION__); return NULL; } - memset( value, 0, sizeof( struct ias_value)); value->type = IAS_STRING; value->charset = CS_ASCII; @@ -495,12 +489,11 @@ struct ias_value *irias_new_octseq_value(__u8 *octseq , int len) { struct ias_value *value; - value = kmalloc(sizeof(struct ias_value), GFP_ATOMIC); + value = kzalloc(sizeof(struct ias_value), GFP_ATOMIC); if (value == NULL) { IRDA_WARNING("%s: Unable to kmalloc!\n", __FUNCTION__); return NULL; } - memset(value, 0, sizeof(struct ias_value)); value->type = IAS_OCT_SEQ; /* Check length */ @@ -522,12 +515,11 @@ struct ias_value *irias_new_missing_value(void) { struct ias_value *value; - value = kmalloc(sizeof(struct ias_value), GFP_ATOMIC); + value = kzalloc(sizeof(struct ias_value), GFP_ATOMIC); if (value == NULL) { IRDA_WARNING("%s: Unable to kmalloc!\n", __FUNCTION__); return NULL; } - memset(value, 0, sizeof(struct ias_value)); value->type = IAS_MISSING; value->len = 0; diff --git a/net/irda/irlan/irlan_client.c b/net/irda/irlan/irlan_client.c index f8e6cb0db..95cf1234e 100644 --- a/net/irda/irlan/irlan_client.c +++ b/net/irda/irlan/irlan_client.c @@ -173,13 +173,14 @@ void irlan_client_discovery_indication(discinfo_t *discovery, rcu_read_lock(); self = irlan_get_any(); if (self) { - IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;); + IRDA_ASSERT(self->magic == IRLAN_MAGIC, goto out;); IRDA_DEBUG(1, "%s(), Found instance (%08x)!\n", __FUNCTION__ , daddr); irlan_client_wakeup(self, saddr, daddr); } +IRDA_ASSERT_LABEL(out:) rcu_read_unlock(); } diff --git a/net/irda/irlan/irlan_common.c b/net/irda/irlan/irlan_common.c index 657d12210..7dd0a2fe1 100644 --- a/net/irda/irlan/irlan_common.c +++ b/net/irda/irlan/irlan_common.c @@ -23,7 +23,6 @@ * ********************************************************************/ -#include #include #include @@ -637,7 +636,7 @@ void irlan_get_provider_info(struct irlan_cb *self) IRDA_ASSERT(self != NULL, return;); IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;); - skb = dev_alloc_skb(64); + skb = alloc_skb(64, GFP_ATOMIC); if (!skb) return; @@ -669,7 +668,7 @@ void irlan_open_data_channel(struct irlan_cb *self) IRDA_ASSERT(self != NULL, return;); IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;); - skb = dev_alloc_skb(64); + skb = alloc_skb(64, GFP_ATOMIC); if (!skb) return; @@ -705,7 +704,7 @@ void irlan_close_data_channel(struct irlan_cb *self) if (self->client.tsap_ctrl == NULL) return; - skb = dev_alloc_skb(64); + skb = alloc_skb(64, GFP_ATOMIC); if (!skb) return; @@ -740,7 +739,7 @@ static void irlan_open_unicast_addr(struct irlan_cb *self) IRDA_ASSERT(self != NULL, return;); IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;); - skb = dev_alloc_skb(128); + skb = alloc_skb(128, GFP_ATOMIC); if (!skb) return; @@ -778,7 +777,7 @@ void irlan_set_broadcast_filter(struct irlan_cb *self, int status) IRDA_ASSERT(self != NULL, return;); IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;); - skb = dev_alloc_skb(128); + skb = alloc_skb(128, GFP_ATOMIC); if (!skb) return; @@ -817,7 +816,7 @@ void irlan_set_multicast_filter(struct irlan_cb *self, int status) IRDA_ASSERT(self != NULL, return;); IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;); - skb = dev_alloc_skb(128); + skb = alloc_skb(128, GFP_ATOMIC); if (!skb) return; @@ -857,7 +856,7 @@ static void irlan_get_unicast_addr(struct irlan_cb *self) IRDA_ASSERT(self != NULL, return;); IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;); - skb = dev_alloc_skb(128); + skb = alloc_skb(128, GFP_ATOMIC); if (!skb) return; @@ -892,7 +891,7 @@ void irlan_get_media_char(struct irlan_cb *self) IRDA_ASSERT(self != NULL, return;); IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;); - skb = dev_alloc_skb(64); + skb = alloc_skb(64, GFP_ATOMIC); if (!skb) return; diff --git a/net/irda/irlan/irlan_eth.c b/net/irda/irlan/irlan_eth.c index 953e255d2..b0ccc455b 100644 --- a/net/irda/irlan/irlan_eth.c +++ b/net/irda/irlan/irlan_eth.c @@ -25,7 +25,6 @@ * ********************************************************************/ -#include #include #include #include diff --git a/net/irda/irlan/irlan_provider.c b/net/irda/irlan/irlan_provider.c index 39c202d1c..9c0df8604 100644 --- a/net/irda/irlan/irlan_provider.c +++ b/net/irda/irlan/irlan_provider.c @@ -296,7 +296,7 @@ void irlan_provider_send_reply(struct irlan_cb *self, int command, IRDA_ASSERT(self != NULL, return;); IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;); - skb = dev_alloc_skb(128); + skb = alloc_skb(128, GFP_ATOMIC); if (!skb) return; diff --git a/net/irda/irlap.c b/net/irda/irlap.c index a16528657..e7852a074 100644 --- a/net/irda/irlap.c +++ b/net/irda/irlap.c @@ -29,7 +29,6 @@ * ********************************************************************/ -#include #include #include #include @@ -117,11 +116,10 @@ struct irlap_cb *irlap_open(struct net_device *dev, struct qos_info *qos, IRDA_DEBUG(4, "%s()\n", __FUNCTION__); /* Initialize the irlap structure. */ - self = kmalloc(sizeof(struct irlap_cb), GFP_KERNEL); + self = kzalloc(sizeof(struct irlap_cb), GFP_KERNEL); if (self == NULL) return NULL; - memset(self, 0, sizeof(struct irlap_cb)); self->magic = LAP_MAGIC; /* Make a binding between the layers */ @@ -883,7 +881,7 @@ static void irlap_change_speed(struct irlap_cb *self, __u32 speed, int now) /* Change speed now, or just piggyback speed on frames */ if (now) { /* Send down empty frame to trigger speed change */ - skb = dev_alloc_skb(0); + skb = alloc_skb(0, GFP_ATOMIC); if (skb) irlap_queue_xmit(self, skb); } @@ -1223,7 +1221,7 @@ static int irlap_seq_open(struct inode *inode, struct file *file) { struct seq_file *seq; int rc = -ENOMEM; - struct irlap_iter_state *s = kmalloc(sizeof(*s), GFP_KERNEL); + struct irlap_iter_state *s = kzalloc(sizeof(*s), GFP_KERNEL); if (!s) goto out; @@ -1239,7 +1237,6 @@ static int irlap_seq_open(struct inode *inode, struct file *file) seq = file->private_data; seq->private = s; - memset(s, 0, sizeof(*s)); out: return rc; out_kfree: diff --git a/net/irda/irlap_event.c b/net/irda/irlap_event.c index a505b5457..99faff68c 100644 --- a/net/irda/irlap_event.c +++ b/net/irda/irlap_event.c @@ -25,7 +25,6 @@ * ********************************************************************/ -#include #include #include #include diff --git a/net/irda/irlap_frame.c b/net/irda/irlap_frame.c index 3e9a06abb..ccb983bf0 100644 --- a/net/irda/irlap_frame.c +++ b/net/irda/irlap_frame.c @@ -117,7 +117,7 @@ void irlap_send_snrm_frame(struct irlap_cb *self, struct qos_info *qos) IRDA_ASSERT(self->magic == LAP_MAGIC, return;); /* Allocate frame */ - tx_skb = dev_alloc_skb(64); + tx_skb = alloc_skb(64, GFP_ATOMIC); if (!tx_skb) return; @@ -210,7 +210,7 @@ void irlap_send_ua_response_frame(struct irlap_cb *self, struct qos_info *qos) IRDA_ASSERT(self->magic == LAP_MAGIC, return;); /* Allocate frame */ - tx_skb = dev_alloc_skb(64); + tx_skb = alloc_skb(64, GFP_ATOMIC); if (!tx_skb) return; @@ -250,7 +250,7 @@ void irlap_send_dm_frame( struct irlap_cb *self) IRDA_ASSERT(self != NULL, return;); IRDA_ASSERT(self->magic == LAP_MAGIC, return;); - tx_skb = dev_alloc_skb(32); + tx_skb = alloc_skb(32, GFP_ATOMIC); if (!tx_skb) return; @@ -282,7 +282,7 @@ void irlap_send_disc_frame(struct irlap_cb *self) IRDA_ASSERT(self != NULL, return;); IRDA_ASSERT(self->magic == LAP_MAGIC, return;); - tx_skb = dev_alloc_skb(16); + tx_skb = alloc_skb(16, GFP_ATOMIC); if (!tx_skb) return; @@ -315,7 +315,7 @@ void irlap_send_discovery_xid_frame(struct irlap_cb *self, int S, __u8 s, IRDA_ASSERT(self->magic == LAP_MAGIC, return;); IRDA_ASSERT(discovery != NULL, return;); - tx_skb = dev_alloc_skb(64); + tx_skb = alloc_skb(64, GFP_ATOMIC); if (!tx_skb) return; @@ -422,11 +422,10 @@ static void irlap_recv_discovery_xid_rsp(struct irlap_cb *self, return; } - if ((discovery = kmalloc(sizeof(discovery_t), GFP_ATOMIC)) == NULL) { + if ((discovery = kzalloc(sizeof(discovery_t), GFP_ATOMIC)) == NULL) { IRDA_WARNING("%s: kmalloc failed!\n", __FUNCTION__); return; } - memset(discovery, 0, sizeof(discovery_t)); discovery->data.daddr = info->daddr; discovery->data.saddr = self->saddr; @@ -576,7 +575,7 @@ void irlap_send_rr_frame(struct irlap_cb *self, int command) struct sk_buff *tx_skb; __u8 *frame; - tx_skb = dev_alloc_skb(16); + tx_skb = alloc_skb(16, GFP_ATOMIC); if (!tx_skb) return; @@ -601,7 +600,7 @@ void irlap_send_rd_frame(struct irlap_cb *self) struct sk_buff *tx_skb; __u8 *frame; - tx_skb = dev_alloc_skb(16); + tx_skb = alloc_skb(16, GFP_ATOMIC); if (!tx_skb) return; @@ -1215,7 +1214,7 @@ void irlap_send_test_frame(struct irlap_cb *self, __u8 caddr, __u32 daddr, struct test_frame *frame; __u8 *info; - tx_skb = dev_alloc_skb(cmd->len+sizeof(struct test_frame)); + tx_skb = alloc_skb(cmd->len+sizeof(struct test_frame), GFP_ATOMIC); if (!tx_skb) return; diff --git a/net/irda/irlmp.c b/net/irda/irlmp.c index c19e9ce05..c440913de 100644 --- a/net/irda/irlmp.c +++ b/net/irda/irlmp.c @@ -24,7 +24,6 @@ * ********************************************************************/ -#include #include #include #include @@ -44,6 +43,8 @@ #include #include +#include + static __u8 irlmp_find_free_slsap(void); static int irlmp_slsap_inuse(__u8 slsap_sel); @@ -77,10 +78,9 @@ int __init irlmp_init(void) { IRDA_DEBUG(1, "%s()\n", __FUNCTION__); /* Initialize the irlmp structure. */ - irlmp = kmalloc( sizeof(struct irlmp_cb), GFP_KERNEL); + irlmp = kzalloc( sizeof(struct irlmp_cb), GFP_KERNEL); if (irlmp == NULL) return -ENOMEM; - memset(irlmp, 0, sizeof(struct irlmp_cb)); irlmp->magic = LMP_MAGIC; @@ -159,12 +159,11 @@ struct lsap_cb *irlmp_open_lsap(__u8 slsap_sel, notify_t *notify, __u8 pid) return NULL; /* Allocate new instance of a LSAP connection */ - self = kmalloc(sizeof(struct lsap_cb), GFP_ATOMIC); + self = kzalloc(sizeof(struct lsap_cb), GFP_ATOMIC); if (self == NULL) { IRDA_ERROR("%s: can't allocate memory\n", __FUNCTION__); return NULL; } - memset(self, 0, sizeof(struct lsap_cb)); self->magic = LMP_LSAP_MAGIC; self->slsap_sel = slsap_sel; @@ -287,12 +286,11 @@ void irlmp_register_link(struct irlap_cb *irlap, __u32 saddr, notify_t *notify) /* * Allocate new instance of a LSAP connection */ - lap = kmalloc(sizeof(struct lap_cb), GFP_KERNEL); + lap = kzalloc(sizeof(struct lap_cb), GFP_KERNEL); if (lap == NULL) { IRDA_ERROR("%s: unable to kmalloc\n", __FUNCTION__); return; } - memset(lap, 0, sizeof(struct lap_cb)); lap->irlap = irlap; lap->magic = LMP_LAP_MAGIC; @@ -394,7 +392,7 @@ int irlmp_connect_request(struct lsap_cb *self, __u8 dlsap_sel, /* Any userdata? */ if (tx_skb == NULL) { - tx_skb = dev_alloc_skb(64); + tx_skb = alloc_skb(64, GFP_ATOMIC); if (!tx_skb) return -ENOMEM; @@ -840,6 +838,7 @@ void irlmp_do_expiry(void) void irlmp_do_discovery(int nslots) { struct lap_cb *lap; + __u16 *data_hintsp; /* Make sure the value is sane */ if ((nslots != 1) && (nslots != 6) && (nslots != 8) && (nslots != 16)){ @@ -849,7 +848,8 @@ void irlmp_do_discovery(int nslots) } /* Construct new discovery info to be used by IrLAP, */ - u16ho(irlmp->discovery_cmd.data.hints) = irlmp->hints.word; + data_hintsp = (__u16 *) irlmp->discovery_cmd.data.hints; + put_unaligned(irlmp->hints.word, data_hintsp); /* * Set character set for device name (we use ASCII), and diff --git a/net/irda/irlmp_event.c b/net/irda/irlmp_event.c index 26649f652..4c90dd1b4 100644 --- a/net/irda/irlmp_event.c +++ b/net/irda/irlmp_event.c @@ -24,7 +24,6 @@ * ********************************************************************/ -#include #include #include diff --git a/net/irda/irlmp_frame.c b/net/irda/irlmp_frame.c index 91cd26817..39761a1d1 100644 --- a/net/irda/irlmp_frame.c +++ b/net/irda/irlmp_frame.c @@ -24,7 +24,6 @@ * ********************************************************************/ -#include #include #include diff --git a/net/irda/irmod.c b/net/irda/irmod.c index 634901dd1..2869b16e4 100644 --- a/net/irda/irmod.c +++ b/net/irda/irmod.c @@ -31,7 +31,6 @@ * Jean II */ -#include #include #include diff --git a/net/irda/irnet/irnet.h b/net/irda/irnet/irnet.h index e4fe1e800..80887528e 100644 --- a/net/irda/irnet/irnet.h +++ b/net/irda/irnet/irnet.h @@ -244,12 +244,10 @@ #include #include #include -#include #include #include #include #include -#include #include /* isspace() */ #include #include diff --git a/net/irda/irnet/irnet_ppp.c b/net/irda/irnet/irnet_ppp.c index e53bf9e00..a1e502ff9 100644 --- a/net/irda/irnet/irnet_ppp.c +++ b/net/irda/irnet/irnet_ppp.c @@ -476,11 +476,10 @@ dev_irnet_open(struct inode * inode, #endif /* SECURE_DEVIRNET */ /* Allocate a private structure for this IrNET instance */ - ap = kmalloc(sizeof(*ap), GFP_KERNEL); + ap = kzalloc(sizeof(*ap), GFP_KERNEL); DABORT(ap == NULL, -ENOMEM, FS_ERROR, "Can't allocate struct irnet...\n"); /* initialize the irnet structure */ - memset(ap, 0, sizeof(*ap)); ap->file = file; /* PPP channel setup */ diff --git a/net/irda/irsysctl.c b/net/irda/irsysctl.c index 1b1c41933..86805c3d8 100644 --- a/net/irda/irsysctl.c +++ b/net/irda/irsysctl.c @@ -23,7 +23,6 @@ * ********************************************************************/ -#include #include #include #include diff --git a/net/irda/irttp.c b/net/irda/irttp.c index 8aff254cb..42acf1cde 100644 --- a/net/irda/irttp.c +++ b/net/irda/irttp.c @@ -24,7 +24,6 @@ * ********************************************************************/ -#include #include #include #include @@ -86,10 +85,9 @@ static pi_param_info_t param_info = { pi_major_call_table, 1, 0x0f, 4 }; */ int __init irttp_init(void) { - irttp = kmalloc(sizeof(struct irttp_cb), GFP_KERNEL); + irttp = kzalloc(sizeof(struct irttp_cb), GFP_KERNEL); if (irttp == NULL) return -ENOMEM; - memset(irttp, 0, sizeof(struct irttp_cb)); irttp->magic = TTP_MAGIC; @@ -307,7 +305,8 @@ static inline void irttp_fragment_skb(struct tsap_cb *self, IRDA_DEBUG(2, "%s(), fragmenting ...\n", __FUNCTION__); /* Make new segment */ - frag = dev_alloc_skb(self->max_seg_size+self->max_header_size); + frag = alloc_skb(self->max_seg_size+self->max_header_size, + GFP_ATOMIC); if (!frag) return; @@ -390,12 +389,11 @@ struct tsap_cb *irttp_open_tsap(__u8 stsap_sel, int credit, notify_t *notify) return NULL; } - self = kmalloc(sizeof(struct tsap_cb), GFP_ATOMIC); + self = kzalloc(sizeof(struct tsap_cb), GFP_ATOMIC); if (self == NULL) { IRDA_DEBUG(0, "%s(), unable to kmalloc!\n", __FUNCTION__); return NULL; } - memset(self, 0, sizeof(struct tsap_cb)); spin_lock_init(&self->lock); /* Initialise todo timer */ @@ -806,7 +804,7 @@ static inline void irttp_give_credit(struct tsap_cb *self) self->send_credit, self->avail_credit, self->remote_credit); /* Give credit to peer */ - tx_skb = dev_alloc_skb(64); + tx_skb = alloc_skb(64, GFP_ATOMIC); if (!tx_skb) return; @@ -1095,7 +1093,7 @@ int irttp_connect_request(struct tsap_cb *self, __u8 dtsap_sel, /* Any userdata supplied? */ if (userdata == NULL) { - tx_skb = dev_alloc_skb(64); + tx_skb = alloc_skb(64, GFP_ATOMIC); if (!tx_skb) return -ENOMEM; @@ -1343,7 +1341,7 @@ int irttp_connect_response(struct tsap_cb *self, __u32 max_sdu_size, /* Any userdata supplied? */ if (userdata == NULL) { - tx_skb = dev_alloc_skb(64); + tx_skb = alloc_skb(64, GFP_ATOMIC); if (!tx_skb) return -ENOMEM; @@ -1542,7 +1540,7 @@ int irttp_disconnect_request(struct tsap_cb *self, struct sk_buff *userdata, if (!userdata) { struct sk_buff *tx_skb; - tx_skb = dev_alloc_skb(64); + tx_skb = alloc_skb(64, GFP_ATOMIC); if (!tx_skb) return -ENOMEM; @@ -1877,7 +1875,7 @@ static int irttp_seq_open(struct inode *inode, struct file *file) int rc = -ENOMEM; struct irttp_iter_state *s; - s = kmalloc(sizeof(*s), GFP_KERNEL); + s = kzalloc(sizeof(*s), GFP_KERNEL); if (!s) goto out; @@ -1887,7 +1885,6 @@ static int irttp_seq_open(struct inode *inode, struct file *file) seq = file->private_data; seq->private = s; - memset(s, 0, sizeof(*s)); out: return rc; out_kfree: diff --git a/net/irda/qos.c b/net/irda/qos.c index ddfb5c502..95a69c013 100644 --- a/net/irda/qos.c +++ b/net/irda/qos.c @@ -30,7 +30,6 @@ * ********************************************************************/ -#include #include #include diff --git a/net/irda/timer.c b/net/irda/timer.c index 0e17f976a..3871a2b91 100644 --- a/net/irda/timer.c +++ b/net/irda/timer.c @@ -25,7 +25,6 @@ ********************************************************************/ #include -#include #include #include diff --git a/net/key/af_key.c b/net/key/af_key.c index 859582275..3a95b2ee4 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c @@ -14,7 +14,6 @@ * Derek Atkins */ -#include #include #include #include @@ -1454,21 +1453,23 @@ static int pfkey_delete(struct sock *sk, struct sk_buff *skb, struct sadb_msg *h if (x == NULL) return -ESRCH; + if ((err = security_xfrm_state_delete(x))) + goto out; + if (xfrm_state_kern(x)) { - xfrm_state_put(x); - return -EPERM; + err = -EPERM; + goto out; } err = xfrm_state_delete(x); - if (err < 0) { - xfrm_state_put(x); - return err; - } + if (err < 0) + goto out; c.seq = hdr->sadb_msg_seq; c.pid = hdr->sadb_msg_pid; c.event = XFRM_MSG_DELSA; km_state_notify(x, &c); +out: xfrm_state_put(x); return err; @@ -2274,11 +2275,14 @@ static int pfkey_spddelete(struct sock *sk, struct sk_buff *skb, struct sadb_msg err = 0; + if ((err = security_xfrm_policy_delete(xp))) + goto out; c.seq = hdr->sadb_msg_seq; c.pid = hdr->sadb_msg_pid; c.event = XFRM_MSG_DELPOLICY; km_policy_notify(xp, pol->sadb_x_policy_dir-1, &c); +out: xfrm_pol_put(xp); return err; } diff --git a/net/lapb/lapb_iface.c b/net/lapb/lapb_iface.c index aea6616ce..7e6bc41ee 100644 --- a/net/lapb/lapb_iface.c +++ b/net/lapb/lapb_iface.c @@ -115,14 +115,12 @@ static struct lapb_cb *lapb_devtostruct(struct net_device *dev) */ static struct lapb_cb *lapb_create_cb(void) { - struct lapb_cb *lapb = kmalloc(sizeof(*lapb), GFP_ATOMIC); + struct lapb_cb *lapb = kzalloc(sizeof(*lapb), GFP_ATOMIC); if (!lapb) goto out; - memset(lapb, 0x00, sizeof(*lapb)); - skb_queue_head_init(&lapb->write_queue); skb_queue_head_init(&lapb->ack_queue); @@ -240,11 +238,13 @@ int lapb_setparms(struct net_device *dev, struct lapb_parms_struct *parms) goto out_put; if (lapb->state == LAPB_STATE_0) { - if (((parms->mode & LAPB_EXTENDED) && - (parms->window < 1 || parms->window > 127)) || - (parms->window < 1 || parms->window > 7)) - goto out_put; - + if (parms->mode & LAPB_EXTENDED) { + if (parms->window < 1 || parms->window > 127) + goto out_put; + } else { + if (parms->window < 1 || parms->window > 7) + goto out_put; + } lapb->mode = parms->mode; lapb->window = parms->window; } diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c index 5a04db745..2652ead96 100644 --- a/net/llc/af_llc.c +++ b/net/llc/af_llc.c @@ -20,7 +20,6 @@ * * See the GNU General Public License for more details. */ -#include #include #include #include @@ -674,7 +673,7 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock, lock_sock(sk); copied = -ENOTCONN; - if (sk->sk_state == TCP_LISTEN) + if (unlikely(sk->sk_type == SOCK_STREAM && sk->sk_state == TCP_LISTEN)) goto out; timeo = sock_rcvtimeo(sk, nonblock); @@ -733,7 +732,7 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock, if (sk->sk_shutdown & RCV_SHUTDOWN) break; - if (sk->sk_state == TCP_CLOSE) { + if (sk->sk_type == SOCK_STREAM && sk->sk_state == TCP_CLOSE) { if (!sock_flag(sk, SOCK_DONE)) { /* * This occurs when user tries to read @@ -785,24 +784,20 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock, copied += used; len -= used; - if (used + offset < skb->len) - continue; - if (!(flags & MSG_PEEK)) { - sk_eat_skb(sk, skb); + sk_eat_skb(sk, skb, 0); *seq = 0; } + + /* For non stream protcols we get one packet per recvmsg call */ + if (sk->sk_type != SOCK_STREAM) + goto copy_uaddr; + + /* Partial read */ + if (used + offset < skb->len) + continue; } while (len > 0); - /* - * According to UNIX98, msg_name/msg_namelen are ignored - * on connected socket. -ANK - * But... af_llc still doesn't have separate sets of methods for - * SOCK_DGRAM and SOCK_STREAM :-( So we have to do this test, will - * eventually fix this tho :-) -acme - */ - if (sk->sk_type == SOCK_DGRAM) - goto copy_uaddr; out: release_sock(sk); return copied; diff --git a/net/llc/llc_core.c b/net/llc/llc_core.c index bd242a495..d12413cff 100644 --- a/net/llc/llc_core.c +++ b/net/llc/llc_core.c @@ -33,10 +33,9 @@ unsigned char llc_station_mac_sa[ETH_ALEN]; */ static struct llc_sap *llc_sap_alloc(void) { - struct llc_sap *sap = kmalloc(sizeof(*sap), GFP_ATOMIC); + struct llc_sap *sap = kzalloc(sizeof(*sap), GFP_ATOMIC); if (sap) { - memset(sap, 0, sizeof(*sap)); sap->state = LLC_SAP_STATE_ACTIVE; memcpy(sap->laddr.mac, llc_station_mac_sa, ETH_ALEN); rwlock_init(&sap->sk_list.lock); diff --git a/net/llc/llc_if.c b/net/llc/llc_if.c index ba90f7f08..a89917130 100644 --- a/net/llc/llc_if.c +++ b/net/llc/llc_if.c @@ -11,7 +11,6 @@ * * See the GNU General Public License for more details. */ -#include #include #include #include @@ -26,8 +25,6 @@ #include #include -u8 llc_mac_null_var[IFHWADDRLEN]; - /** * llc_build_and_send_pkt - Connection data sending for upper layers. * @sk: connection diff --git a/net/llc/llc_input.c b/net/llc/llc_input.c index d62e0f9b9..94d2368ad 100644 --- a/net/llc/llc_input.c +++ b/net/llc/llc_input.c @@ -142,6 +142,8 @@ int llc_rcv(struct sk_buff *skb, struct net_device *dev, struct llc_sap *sap; struct llc_pdu_sn *pdu; int dest; + int (*rcv)(struct sk_buff *, struct net_device *, + struct packet_type *, struct net_device *); /* * When the interface is in promisc. mode, drop all the crap that it @@ -169,9 +171,11 @@ int llc_rcv(struct sk_buff *skb, struct net_device *dev, * First the upper layer protocols that don't need the full * LLC functionality */ - if (sap->rcv_func) { - sap->rcv_func(skb, dev, pt, orig_dev); - goto out_put; + rcv = rcu_dereference(sap->rcv_func); + if (rcv) { + struct sk_buff *cskb = skb_clone(skb, GFP_ATOMIC); + if (cskb) + rcv(cskb, dev, pt, orig_dev); } dest = llc_pdu_type(skb); if (unlikely(!dest || !llc_type_handlers[dest - 1])) diff --git a/net/llc/llc_proc.c b/net/llc/llc_proc.c index bd531cb23..19308fece 100644 --- a/net/llc/llc_proc.c +++ b/net/llc/llc_proc.c @@ -12,7 +12,6 @@ * See the GNU General Public License for more details. */ -#include #include #include #include diff --git a/net/llc/llc_sap.c b/net/llc/llc_sap.c index 4029ceee9..61cb8cf7d 100644 --- a/net/llc/llc_sap.c +++ b/net/llc/llc_sap.c @@ -51,10 +51,10 @@ void llc_save_primitive(struct sock *sk, struct sk_buff* skb, u8 prim) { struct sockaddr_llc *addr; - if (skb->sk->sk_type == SOCK_STREAM) /* See UNIX98 */ - return; /* save primitive for use by the user. */ addr = llc_ui_skb_cb(skb); + + memset(addr, 0, sizeof(*addr)); addr->sllc_family = sk->sk_family; addr->sllc_arphrd = skb->dev->type; addr->sllc_test = prim == LLC_TEST_PRIM; @@ -282,7 +282,7 @@ static void llc_sap_rcv(struct llc_sap *sap, struct sk_buff *skb) * mac, and local sap. Returns pointer for socket found, %NULL otherwise. */ static struct sock *llc_lookup_dgram(struct llc_sap *sap, - struct llc_addr *laddr) + const struct llc_addr *laddr) { struct sock *rc; struct hlist_node *node; @@ -304,19 +304,65 @@ found: return rc; } +/** + * llc_sap_mcast - Deliver multicast PDU's to all matching datagram sockets. + * @sap: SAP + * @laddr: address of local LLC (MAC + SAP) + * + * Search socket list of the SAP and finds connections with same sap. + * Deliver clone to each. + */ +static void llc_sap_mcast(struct llc_sap *sap, + const struct llc_addr *laddr, + struct sk_buff *skb) +{ + struct sock *sk; + struct hlist_node *node; + + read_lock_bh(&sap->sk_list.lock); + sk_for_each(sk, node, &sap->sk_list.list) { + struct llc_sock *llc = llc_sk(sk); + struct sk_buff *skb1; + + if (sk->sk_type != SOCK_DGRAM) + continue; + + if (llc->laddr.lsap != laddr->lsap) + continue; + + if (llc->dev != skb->dev) + continue; + + skb1 = skb_clone(skb, GFP_ATOMIC); + if (!skb1) + break; + + sock_hold(sk); + skb_set_owner_r(skb1, sk); + llc_sap_rcv(sap, skb1); + sock_put(sk); + } + read_unlock_bh(&sap->sk_list.lock); +} + + void llc_sap_handler(struct llc_sap *sap, struct sk_buff *skb) { struct llc_addr laddr; - struct sock *sk; llc_pdu_decode_da(skb, laddr.mac); llc_pdu_decode_dsap(skb, &laddr.lsap); - sk = llc_lookup_dgram(sap, &laddr); - if (sk) { - skb_set_owner_r(skb, sk); - llc_sap_rcv(sap, skb); - sock_put(sk); - } else + if (llc_mac_multicast(laddr.mac)) { + llc_sap_mcast(sap, &laddr, skb); kfree_skb(skb); + } else { + struct sock *sk = llc_lookup_dgram(sap, &laddr); + if (sk) { + skb_set_owner_r(skb, sk); + llc_sap_rcv(sap, skb); + sock_put(sk); + } else + kfree_skb(skb); + } } diff --git a/net/llc/llc_station.c b/net/llc/llc_station.c index f37dbf8ef..8275bd33b 100644 --- a/net/llc/llc_station.c +++ b/net/llc/llc_station.c @@ -11,7 +11,6 @@ * * See the GNU General Public License for more details. */ -#include #include #include #include diff --git a/net/llc/sysctl_net_llc.c b/net/llc/sysctl_net_llc.c index d1eaddb13..45d7dd92a 100644 --- a/net/llc/sysctl_net_llc.c +++ b/net/llc/sysctl_net_llc.c @@ -4,7 +4,6 @@ * Arnaldo Carvalho de Melo */ -#include #include #include #include diff --git a/net/netfilter/Kconfig b/net/netfilter/Kconfig index e2893effd..a9894ddfd 100644 --- a/net/netfilter/Kconfig +++ b/net/netfilter/Kconfig @@ -60,6 +60,18 @@ config NF_CONNTRACK_MARK of packets, but this mark value is kept in the conntrack session instead of the individual packets. +config NF_CONNTRACK_SECMARK + bool 'Connection tracking security mark support' + depends on NF_CONNTRACK && NETWORK_SECMARK + help + This option enables security markings to be applied to + connections. Typically they are copied to connections from + packets using the CONNSECMARK target and copied back from + connections to packets with the same target, with the packets + being originally labeled via SECMARK. + + If unsure, say 'N'. + config NF_CONNTRACK_EVENTS bool "Connection tracking events (EXPERIMENTAL)" depends on EXPERIMENTAL && NF_CONNTRACK @@ -174,6 +186,26 @@ config NETFILTER_XT_TARGET_NOTRACK If you want to compile it as a module, say M here and read . If unsure, say `N'. +config NETFILTER_XT_TARGET_SECMARK + tristate '"SECMARK" target support' + depends on NETFILTER_XTABLES && NETWORK_SECMARK + help + The SECMARK target allows security marking of network + packets, for use with security subsystems. + + To compile it as a module, choose M here. If unsure, say N. + +config NETFILTER_XT_TARGET_CONNSECMARK + tristate '"CONNSECMARK" target support' + depends on NETFILTER_XTABLES && (NF_CONNTRACK_SECMARK || IP_NF_CONNTRACK_SECMARK) + help + The CONNSECMARK target copies security markings from packets + to connections, and restores security markings from connections + to packets (if the packets are not already marked). This would + normally be used in conjunction with the SECMARK target. + + To compile it as a module, choose M here. If unsure, say N. + config NETFILTER_XT_MATCH_COMMENT tristate '"comment" match support' depends on NETFILTER_XTABLES @@ -329,6 +361,16 @@ config NETFILTER_XT_MATCH_PKTTYPE To compile it as a module, choose M here. If unsure, say N. +config NETFILTER_XT_MATCH_QUOTA + tristate '"quota" match support' + depends on NETFILTER_XTABLES + help + This option adds a `quota' match, which allows to match on a + byte counter. + + If you want to compile it as a module, say M here and read + . If unsure, say `N'. + config NETFILTER_XT_MATCH_REALM tristate '"realm" match support' depends on NETFILTER_XTABLES @@ -344,8 +386,8 @@ config NETFILTER_XT_MATCH_REALM . If unsure, say `N'. config NETFILTER_XT_MATCH_SCTP - tristate '"sctp" protocol match support' - depends on NETFILTER_XTABLES + tristate '"sctp" protocol match support (EXPERIMENTAL)' + depends on NETFILTER_XTABLES && EXPERIMENTAL help With this option enabled, you will be able to use the `sctp' match in order to match on SCTP source/destination ports @@ -365,6 +407,15 @@ config NETFILTER_XT_MATCH_STATE To compile it as a module, choose M here. If unsure, say N. +config NETFILTER_XT_MATCH_STATISTIC + tristate '"statistic" match support' + depends on NETFILTER_XTABLES + help + This option adds a `statistic' match, which allows you to match + on packets periodically or randomly with a given percentage. + + To compile it as a module, choose M here. If unsure, say N. + config NETFILTER_XT_MATCH_STRING tristate '"string" match support' depends on NETFILTER_XTABLES diff --git a/net/netfilter/Makefile b/net/netfilter/Makefile index 95b7e4165..6fa4b7580 100644 --- a/net/netfilter/Makefile +++ b/net/netfilter/Makefile @@ -28,6 +28,8 @@ obj-$(CONFIG_NETFILTER_XT_TARGET_CONNMARK) += xt_CONNMARK.o obj-$(CONFIG_NETFILTER_XT_TARGET_MARK) += xt_MARK.o obj-$(CONFIG_NETFILTER_XT_TARGET_NFQUEUE) += xt_NFQUEUE.o obj-$(CONFIG_NETFILTER_XT_TARGET_NOTRACK) += xt_NOTRACK.o +obj-$(CONFIG_NETFILTER_XT_TARGET_SECMARK) += xt_SECMARK.o +obj-$(CONFIG_NETFILTER_XT_TARGET_CONNSECMARK) += xt_CONNSECMARK.o # matches obj-$(CONFIG_NETFILTER_XT_MATCH_COMMENT) += xt_comment.o @@ -44,9 +46,11 @@ obj-$(CONFIG_NETFILTER_XT_MATCH_MARK) += xt_mark.o obj-$(CONFIG_NETFILTER_XT_MATCH_MULTIPORT) += xt_multiport.o obj-$(CONFIG_NETFILTER_XT_MATCH_POLICY) += xt_policy.o obj-$(CONFIG_NETFILTER_XT_MATCH_PKTTYPE) += xt_pkttype.o +obj-$(CONFIG_NETFILTER_XT_MATCH_QUOTA) += xt_quota.o obj-$(CONFIG_NETFILTER_XT_MATCH_REALM) += xt_realm.o obj-$(CONFIG_NETFILTER_XT_MATCH_SCTP) += xt_sctp.o obj-$(CONFIG_NETFILTER_XT_MATCH_STATE) += xt_state.o +obj-$(CONFIG_NETFILTER_XT_MATCH_STATISTIC) += xt_statistic.o obj-$(CONFIG_NETFILTER_XT_MATCH_STRING) += xt_string.o obj-$(CONFIG_NETFILTER_XT_MATCH_TCPMSS) += xt_tcpmss.o obj-$(CONFIG_NETFILTER_XT_MATCH_PHYSDEV) += xt_physdev.o diff --git a/net/netfilter/core.c b/net/netfilter/core.c index 8455a32ea..5d29d5e23 100644 --- a/net/netfilter/core.c +++ b/net/netfilter/core.c @@ -10,7 +10,6 @@ * 15-Mar-2000: Added NF_REPEAT --RR. * 08-May-2003: Internal logging interface added by Jozsef Kadlecsik. */ -#include #include #include #include diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index f9b83f913..8f2261965 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c @@ -29,7 +29,6 @@ * Derived from net/ipv4/netfilter/ip_conntrack_core.c */ -#include #include #include #include @@ -989,6 +988,9 @@ init_conntrack(const struct nf_conntrack_tuple *tuple, conntrack->master = exp->master; #ifdef CONFIG_NF_CONNTRACK_MARK conntrack->mark = exp->master->mark; +#endif +#ifdef CONFIG_NF_CONNTRACK_SECMARK + conntrack->secmark = exp->master->secmark; #endif nf_conntrack_get(&conntrack->master->ct_general); NF_CT_STAT_INC(expect_new); @@ -1396,6 +1398,12 @@ void __nf_ct_refresh_acct(struct nf_conn *ct, write_lock_bh(&nf_conntrack_lock); + /* Only update if this is not a fixed timeout */ + if (test_bit(IPS_FIXED_TIMEOUT_BIT, &ct->status)) { + write_unlock_bh(&nf_conntrack_lock); + return; + } + /* If not in hash table, timer will not be active yet */ if (!nf_ct_is_confirmed(ct)) { ct->timeout.expires = extra_jiffies; diff --git a/net/netfilter/nf_conntrack_ftp.c b/net/netfilter/nf_conntrack_ftp.c index e38a4b5a3..960972d22 100644 --- a/net/netfilter/nf_conntrack_ftp.c +++ b/net/netfilter/nf_conntrack_ftp.c @@ -15,7 +15,6 @@ * Derived from net/ipv4/netfilter/ip_conntrack_ftp.c */ -#include #include #include #include @@ -67,37 +66,48 @@ static int try_epsv_response(const char *, size_t, struct nf_conntrack_man *, char); static struct ftp_search { - enum ip_conntrack_dir dir; const char *pattern; size_t plen; char skip; char term; enum ip_ct_ftp_type ftptype; int (*getnum)(const char *, size_t, struct nf_conntrack_man *, char); -} search[] = { - { - IP_CT_DIR_ORIGINAL, - "PORT", sizeof("PORT") - 1, ' ', '\r', - IP_CT_FTP_PORT, - try_rfc959, +} search[IP_CT_DIR_MAX][2] = { + [IP_CT_DIR_ORIGINAL] = { + { + .pattern = "PORT", + .plen = sizeof("PORT") - 1, + .skip = ' ', + .term = '\r', + .ftptype = IP_CT_FTP_PORT, + .getnum = try_rfc959, + }, + { + .pattern = "EPRT", + .plen = sizeof("EPRT") - 1, + .skip = ' ', + .term = '\r', + .ftptype = IP_CT_FTP_EPRT, + .getnum = try_eprt, + }, }, - { - IP_CT_DIR_REPLY, - "227 ", sizeof("227 ") - 1, '(', ')', - IP_CT_FTP_PASV, - try_rfc959, - }, - { - IP_CT_DIR_ORIGINAL, - "EPRT", sizeof("EPRT") - 1, ' ', '\r', - IP_CT_FTP_EPRT, - try_eprt, - }, - { - IP_CT_DIR_REPLY, - "229 ", sizeof("229 ") - 1, '(', ')', - IP_CT_FTP_EPSV, - try_epsv_response, + [IP_CT_DIR_REPLY] = { + { + .pattern = "227 ", + .plen = sizeof("227 ") - 1, + .skip = '(', + .term = ')', + .ftptype = IP_CT_FTP_PASV, + .getnum = try_rfc959, + }, + { + .pattern = "229 ", + .plen = sizeof("229 ") - 1, + .skip = '(', + .term = ')', + .ftptype = IP_CT_FTP_EPSV, + .getnum = try_epsv_response, + }, }, }; @@ -492,17 +502,15 @@ static int help(struct sk_buff **pskb, memcpy(cmd.u3.all, &ct->tuplehash[dir].tuple.src.u3.all, sizeof(cmd.u3.all)); - for (i = 0; i < ARRAY_SIZE(search); i++) { - if (search[i].dir != dir) continue; - + for (i = 0; i < ARRAY_SIZE(search[dir]); i++) { found = find_pattern(fb_ptr, datalen, - search[i].pattern, - search[i].plen, - search[i].skip, - search[i].term, + search[dir][i].pattern, + search[dir][i].plen, + search[dir][i].skip, + search[dir][i].term, &matchoff, &matchlen, &cmd, - search[i].getnum); + search[dir][i].getnum); if (found) break; } if (found == -1) { @@ -512,7 +520,7 @@ static int help(struct sk_buff **pskb, this case. */ if (net_ratelimit()) printk("conntrack_ftp: partial %s %u+%u\n", - search[i].pattern, + search[dir][i].pattern, ntohl(th->seq), datalen); ret = NF_DROP; goto out; @@ -597,7 +605,7 @@ static int help(struct sk_buff **pskb, /* Now, NAT might want to mangle the packet, and register the * (possibly changed) expectation itself. */ if (nf_nat_ftp_hook) - ret = nf_nat_ftp_hook(pskb, ctinfo, search[i].ftptype, + ret = nf_nat_ftp_hook(pskb, ctinfo, search[dir][i].ftptype, matchoff, matchlen, exp, &seq); else { /* Can't expect this? Best to drop packet now. */ diff --git a/net/netfilter/nf_conntrack_l3proto_generic.c b/net/netfilter/nf_conntrack_l3proto_generic.c index 3fc58e454..21e0bc91c 100644 --- a/net/netfilter/nf_conntrack_l3proto_generic.c +++ b/net/netfilter/nf_conntrack_l3proto_generic.c @@ -15,7 +15,6 @@ * Yasuyuki Kozakai @USAGI */ -#include #include #include #include diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index bd10eb944..6527d4e04 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -407,6 +408,8 @@ nfattr_failure: static int ctnetlink_done(struct netlink_callback *cb) { + if (cb->args[1]) + nf_ct_put((struct nf_conn *)cb->args[1]); DEBUGP("entered %s\n", __FUNCTION__); return 0; } @@ -416,10 +419,9 @@ static int ctnetlink_done(struct netlink_callback *cb) static int ctnetlink_dump_table(struct sk_buff *skb, struct netlink_callback *cb) { - struct nf_conn *ct = NULL; + struct nf_conn *ct, *last; struct nf_conntrack_tuple_hash *h; struct list_head *i; - u_int32_t *id = (u_int32_t *) &cb->args[1]; struct nfgenmsg *nfmsg = NLMSG_DATA(cb->nlh); u_int8_t l3proto = nfmsg->nfgen_family; @@ -427,7 +429,9 @@ ctnetlink_dump_table(struct sk_buff *skb, struct netlink_callback *cb) cb->args[0], *id); read_lock_bh(&nf_conntrack_lock); - for (; cb->args[0] < nf_conntrack_htable_size; cb->args[0]++, *id = 0) { + last = (struct nf_conn *)cb->args[1]; + for (; cb->args[0] < nf_conntrack_htable_size; cb->args[0]++) { +restart: list_for_each_prev(i, &nf_conntrack_hash[cb->args[0]]) { h = (struct nf_conntrack_tuple_hash *) i; if (DIRECTION(h) != IP_CT_DIR_ORIGINAL) @@ -438,21 +442,31 @@ ctnetlink_dump_table(struct sk_buff *skb, struct netlink_callback *cb) * then dump everything. */ if (l3proto && L3PROTO(ct) != l3proto) continue; - if (ct->id <= *id) - continue; + if (cb->args[1]) { + if (ct != last) + continue; + cb->args[1] = 0; + } if (ctnetlink_fill_info(skb, NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_seq, IPCTNL_MSG_CT_NEW, - 1, ct) < 0) + 1, ct) < 0) { + nf_conntrack_get(&ct->ct_general); + cb->args[1] = (unsigned long)ct; goto out; - *id = ct->id; + } + } + if (cb->args[1]) { + cb->args[1] = 0; + goto restart; } } -out: +out: read_unlock_bh(&nf_conntrack_lock); + if (last) + nf_ct_put(last); DEBUGP("leaving, last bucket=%lu id=%u\n", cb->args[0], *id); - return skb->len; } @@ -641,7 +655,7 @@ static const size_t cta_min_nat[CTA_NAT_MAX] = { }; static inline int -ctnetlink_parse_nat(struct nfattr *cda[], +ctnetlink_parse_nat(struct nfattr *nat, const struct nf_conn *ct, struct ip_nat_range *range) { struct nfattr *tb[CTA_NAT_MAX]; @@ -651,7 +665,7 @@ ctnetlink_parse_nat(struct nfattr *cda[], memset(range, 0, sizeof(*range)); - nfattr_parse_nested(tb, CTA_NAT_MAX, cda[CTA_NAT-1]); + nfattr_parse_nested(tb, CTA_NAT_MAX, nat); if (nfattr_bad_size(tb, CTA_NAT_MAX, cta_min_nat)) return -EINVAL; @@ -866,39 +880,30 @@ ctnetlink_change_status(struct nf_conn *ct, struct nfattr *cda[]) /* ASSURED bit can only be set */ return -EINVAL; - if (cda[CTA_NAT-1]) { + if (cda[CTA_NAT_SRC-1] || cda[CTA_NAT_DST-1]) { #ifndef CONFIG_IP_NF_NAT_NEEDED return -EINVAL; #else - unsigned int hooknum; struct ip_nat_range range; - if (ctnetlink_parse_nat(cda, ct, &range) < 0) - return -EINVAL; - - DEBUGP("NAT: %u.%u.%u.%u-%u.%u.%u.%u:%u-%u\n", - NIPQUAD(range.min_ip), NIPQUAD(range.max_ip), - htons(range.min.all), htons(range.max.all)); - - /* This is tricky but it works. ip_nat_setup_info needs the - * hook number as parameter, so let's do the correct - * conversion and run away */ - if (status & IPS_SRC_NAT_DONE) - hooknum = NF_IP_POST_ROUTING; /* IP_NAT_MANIP_SRC */ - else if (status & IPS_DST_NAT_DONE) - hooknum = NF_IP_PRE_ROUTING; /* IP_NAT_MANIP_DST */ - else - return -EINVAL; /* Missing NAT flags */ - - DEBUGP("NAT status: %lu\n", - status & (IPS_NAT_MASK | IPS_NAT_DONE_MASK)); - - if (ip_nat_initialized(ct, HOOK2MANIP(hooknum))) - return -EEXIST; - ip_nat_setup_info(ct, &range, hooknum); - - DEBUGP("NAT status after setup_info: %lu\n", - ct->status & (IPS_NAT_MASK | IPS_NAT_DONE_MASK)); + if (cda[CTA_NAT_DST-1]) { + if (ctnetlink_parse_nat(cda[CTA_NAT_DST-1], ct, + &range) < 0) + return -EINVAL; + if (ip_nat_initialized(ct, + HOOK2MANIP(NF_IP_PRE_ROUTING))) + return -EEXIST; + ip_nat_setup_info(ct, &range, hooknum); + } + if (cda[CTA_NAT_SRC-1]) { + if (ctnetlink_parse_nat(cda[CTA_NAT_SRC-1], ct, + &range) < 0) + return -EINVAL; + if (ip_nat_initialized(ct, + HOOK2MANIP(NF_IP_POST_ROUTING))) + return -EEXIST; + ip_nat_setup_info(ct, &range, hooknum); + } #endif } @@ -1122,7 +1127,7 @@ ctnetlink_new_conntrack(struct sock *ctnl, struct sk_buff *skb, /* implicit 'else' */ /* we only allow nat config for new conntracks */ - if (cda[CTA_NAT-1]) { + if (cda[CTA_NAT_SRC-1] || cda[CTA_NAT_DST-1]) { err = -EINVAL; goto out_unlock; } diff --git a/net/netfilter/nf_conntrack_proto_sctp.c b/net/netfilter/nf_conntrack_proto_sctp.c index 9dab81d31..9bd8a7877 100644 --- a/net/netfilter/nf_conntrack_proto_sctp.c +++ b/net/netfilter/nf_conntrack_proto_sctp.c @@ -28,6 +28,8 @@ #include #include #include +#include +#include #include #include diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c index 69899f27d..af8adcba2 100644 --- a/net/netfilter/nf_conntrack_proto_tcp.c +++ b/net/netfilter/nf_conntrack_proto_tcp.c @@ -24,7 +24,6 @@ * version 2.2 */ -#include #include #include #include @@ -828,8 +827,9 @@ static int tcp_error(struct sk_buff *skb, * and moreover root might send raw packets. */ /* FIXME: Source route IP option packets --RR */ - if (((pf == PF_INET && hooknum == NF_IP_PRE_ROUTING) || - (pf == PF_INET6 && hooknum == NF_IP6_PRE_ROUTING)) && + if (nf_conntrack_checksum && + ((pf == PF_INET && hooknum == NF_IP_PRE_ROUTING) || + (pf == PF_INET6 && hooknum == NF_IP6_PRE_ROUTING)) && nf_checksum(skb, hooknum, dataoff, IPPROTO_TCP, pf)) { if (LOG_INVALID(IPPROTO_TCP)) nf_log_packet(pf, 0, skb, NULL, NULL, NULL, diff --git a/net/netfilter/nf_conntrack_proto_udp.c b/net/netfilter/nf_conntrack_proto_udp.c index d93edbfde..ae07ebe3a 100644 --- a/net/netfilter/nf_conntrack_proto_udp.c +++ b/net/netfilter/nf_conntrack_proto_udp.c @@ -134,7 +134,8 @@ static int udp_error(struct sk_buff *skb, unsigned int dataoff, * because the semantic of CHECKSUM_HW is different there * and moreover root might send raw packets. * FIXME: Source route IP option packets --RR */ - if (((pf == PF_INET && hooknum == NF_IP_PRE_ROUTING) || + if (nf_conntrack_checksum && + ((pf == PF_INET && hooknum == NF_IP_PRE_ROUTING) || (pf == PF_INET6 && hooknum == NF_IP6_PRE_ROUTING)) && nf_checksum(skb, hooknum, dataoff, IPPROTO_UDP, pf)) { if (LOG_INVALID(IPPROTO_UDP)) diff --git a/net/netfilter/nf_conntrack_standalone.c b/net/netfilter/nf_conntrack_standalone.c index 408960c6a..4ef836699 100644 --- a/net/netfilter/nf_conntrack_standalone.c +++ b/net/netfilter/nf_conntrack_standalone.c @@ -17,7 +17,6 @@ * Derived from net/ipv4/netfilter/ip_conntrack_standalone.c */ -#include #include #include #include @@ -213,6 +212,11 @@ static int ct_seq_show(struct seq_file *s, void *v) return -ENOSPC; #endif +#ifdef CONFIG_NF_CONNTRACK_SECMARK + if (seq_printf(s, "secmark=%u ", conntrack->secmark)) + return -ENOSPC; +#endif + if (seq_printf(s, "use=%u\n", atomic_read(&conntrack->ct_general.use))) return -ENOSPC; @@ -424,6 +428,8 @@ static struct file_operations ct_cpu_seq_fops = { /* Sysctl support */ +int nf_conntrack_checksum = 1; + #ifdef CONFIG_SYSCTL /* From nf_conntrack_core.c */ @@ -482,6 +488,14 @@ static ctl_table nf_ct_sysctl_table[] = { .mode = 0444, .proc_handler = &proc_dointvec, }, + { + .ctl_name = NET_NF_CONNTRACK_CHECKSUM, + .procname = "nf_conntrack_checksum", + .data = &nf_conntrack_checksum, + .maxlen = sizeof(unsigned int), + .mode = 0644, + .proc_handler = &proc_dointvec, + }, { .ctl_name = NET_NF_CONNTRACK_TCP_TIMEOUT_SYN_SENT, .procname = "nf_conntrack_tcp_timeout_syn_sent", @@ -851,6 +865,7 @@ EXPORT_SYMBOL(nf_ct_proto_put); EXPORT_SYMBOL(nf_ct_l3proto_find_get); EXPORT_SYMBOL(nf_ct_l3proto_put); EXPORT_SYMBOL(nf_ct_l3protos); +EXPORT_SYMBOL_GPL(nf_conntrack_checksum); EXPORT_SYMBOL(nf_conntrack_expect_alloc); EXPORT_SYMBOL(nf_conntrack_expect_put); EXPORT_SYMBOL(nf_conntrack_expect_related); diff --git a/net/netfilter/nf_internals.h b/net/netfilter/nf_internals.h index 6bdee2910..86e392bfe 100644 --- a/net/netfilter/nf_internals.h +++ b/net/netfilter/nf_internals.h @@ -1,7 +1,6 @@ #ifndef _NF_INTERNALS_H #define _NF_INTERNALS_H -#include #include #include #include diff --git a/net/netfilter/nf_log.c b/net/netfilter/nf_log.c index 3e76bd082..8901b3a07 100644 --- a/net/netfilter/nf_log.c +++ b/net/netfilter/nf_log.c @@ -1,4 +1,3 @@ -#include #include #include #include diff --git a/net/netfilter/nf_queue.c b/net/netfilter/nf_queue.c index ee8f70889..662a86959 100644 --- a/net/netfilter/nf_queue.c +++ b/net/netfilter/nf_queue.c @@ -1,4 +1,3 @@ -#include #include #include #include @@ -220,21 +219,20 @@ void nf_reinject(struct sk_buff *skb, struct nf_info *info, switch (verdict & NF_VERDICT_MASK) { case NF_ACCEPT: + case NF_STOP: info->okfn(skb); + case NF_STOLEN: break; - case NF_QUEUE: if (!nf_queue(&skb, elem, info->pf, info->hook, info->indev, info->outdev, info->okfn, verdict >> NF_VERDICT_BITS)) goto next_hook; break; + default: + kfree_skb(skb); } rcu_read_unlock(); - - if (verdict == NF_DROP) - kfree_skb(skb); - kfree(info); return; } diff --git a/net/netfilter/nf_sockopt.c b/net/netfilter/nf_sockopt.c index 0a63d7dac..c2e44e90e 100644 --- a/net/netfilter/nf_sockopt.c +++ b/net/netfilter/nf_sockopt.c @@ -1,4 +1,3 @@ -#include #include #include #include diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c index b88e82a1a..52fdfa268 100644 --- a/net/netfilter/nfnetlink.c +++ b/net/netfilter/nfnetlink.c @@ -14,7 +14,6 @@ * of the GNU General Public License, incorporated herein by reference. */ -#include #include #include #include @@ -229,7 +228,7 @@ static int nfnetlink_rcv_msg(struct sk_buff *skb, NFNL_SUBSYS_ID(nlh->nlmsg_type), NFNL_MSG_TYPE(nlh->nlmsg_type)); - if (!cap_raised(NETLINK_CB(skb).eff_cap, CAP_NET_ADMIN)) { + if (security_netlink_recv(skb, CAP_NET_ADMIN)) { DEBUGP("missing CAP_NET_ADMIN\n"); *errp = -EPERM; return -1; diff --git a/net/netfilter/nfnetlink_queue.c b/net/netfilter/nfnetlink_queue.c index 86a4ac33d..49ef41e34 100644 --- a/net/netfilter/nfnetlink_queue.c +++ b/net/netfilter/nfnetlink_queue.c @@ -680,11 +680,19 @@ dev_cmp(struct nfqnl_queue_entry *entry, unsigned long ifindex) if (entinf->indev) if (entinf->indev->ifindex == ifindex) return 1; - if (entinf->outdev) if (entinf->outdev->ifindex == ifindex) return 1; - +#ifdef CONFIG_BRIDGE_NETFILTER + if (entry->skb->nf_bridge) { + if (entry->skb->nf_bridge->physindev && + entry->skb->nf_bridge->physindev->ifindex == ifindex) + return 1; + if (entry->skb->nf_bridge->physoutdev && + entry->skb->nf_bridge->physoutdev->ifindex == ifindex) + return 1; + } +#endif return 0; } diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c index 99293c63f..174e8f970 100644 --- a/net/netfilter/x_tables.c +++ b/net/netfilter/x_tables.c @@ -13,7 +13,6 @@ * */ -#include #include #include #include diff --git a/net/netfilter/xt_connmark.c b/net/netfilter/xt_connmark.c index dc26a27cb..56324c8af 100644 --- a/net/netfilter/xt_connmark.c +++ b/net/netfilter/xt_connmark.c @@ -58,7 +58,7 @@ checkentry(const char *tablename, unsigned int matchsize, unsigned int hook_mask) { - struct xt_connmark_info *cm = (struct xt_connmark_info *)matchinfo; + struct xt_connmark_info *cm = matchinfo; if (cm->mark > 0xffffffff || cm->mask > 0xffffffff) { printk(KERN_WARNING "connmark: only support 32bit mark\n"); diff --git a/net/netfilter/xt_dccp.c b/net/netfilter/xt_dccp.c index dfb10b648..2e2f825da 100644 --- a/net/netfilter/xt_dccp.c +++ b/net/netfilter/xt_dccp.c @@ -101,8 +101,7 @@ match(const struct sk_buff *skb, unsigned int protoff, int *hotdrop) { - const struct xt_dccp_info *info = - (const struct xt_dccp_info *)matchinfo; + const struct xt_dccp_info *info = matchinfo; struct dccp_hdr _dh, *dh; if (offset) diff --git a/net/netfilter/xt_mark.c b/net/netfilter/xt_mark.c index 8b385a348..876bc5797 100644 --- a/net/netfilter/xt_mark.c +++ b/net/netfilter/xt_mark.c @@ -42,7 +42,7 @@ checkentry(const char *tablename, unsigned int matchsize, unsigned int hook_mask) { - struct xt_mark_info *minfo = (struct xt_mark_info *) matchinfo; + const struct xt_mark_info *minfo = matchinfo; if (minfo->mark > 0xffffffff || minfo->mask > 0xffffffff) { printk(KERN_WARNING "mark: only supports 32bit mark\n"); diff --git a/net/netfilter/xt_multiport.c b/net/netfilter/xt_multiport.c index b56cd2baa..1ff0a2539 100644 --- a/net/netfilter/xt_multiport.c +++ b/net/netfilter/xt_multiport.c @@ -1,4 +1,4 @@ -/* Kernel module to match one of a list of TCP/UDP ports: ports are in +/* Kernel module to match one of a list of TCP/UDP/SCTP/DCCP ports: ports are in the same place so we can treat them as equal. */ /* (C) 1999-2001 Paul `Rusty' Russell @@ -160,8 +160,9 @@ check(u_int16_t proto, u_int8_t match_flags, u_int8_t count) { - /* Must specify proto == TCP/UDP, no unknown flags or bad count */ - return (proto == IPPROTO_TCP || proto == IPPROTO_UDP) + /* Must specify supported protocol, no unknown flags or bad count */ + return (proto == IPPROTO_TCP || proto == IPPROTO_UDP + || proto == IPPROTO_SCTP || proto == IPPROTO_DCCP) && !(ip_invflags & XT_INV_PROTO) && (match_flags == XT_MULTIPORT_SOURCE || match_flags == XT_MULTIPORT_DESTINATION diff --git a/net/netfilter/xt_physdev.c b/net/netfilter/xt_physdev.c index 5fe4c9df1..63a965467 100644 --- a/net/netfilter/xt_physdev.c +++ b/net/netfilter/xt_physdev.c @@ -10,6 +10,7 @@ #include #include +#include #include #include #include @@ -113,6 +114,21 @@ checkentry(const char *tablename, if (!(info->bitmask & XT_PHYSDEV_OP_MASK) || info->bitmask & ~XT_PHYSDEV_OP_MASK) return 0; + if (brnf_deferred_hooks == 0 && + info->bitmask & XT_PHYSDEV_OP_OUT && + (!(info->bitmask & XT_PHYSDEV_OP_BRIDGED) || + info->invert & XT_PHYSDEV_OP_BRIDGED) && + hook_mask & ((1 << NF_IP_LOCAL_OUT) | (1 << NF_IP_FORWARD) | + (1 << NF_IP_POST_ROUTING))) { + printk(KERN_WARNING "physdev match: using --physdev-out in the " + "OUTPUT, FORWARD and POSTROUTING chains for non-bridged " + "traffic is deprecated and breaks other things, it will " + "be removed in January 2007. See Documentation/" + "feature-removal-schedule.txt for details. This doesn't " + "affect you in case you're using it for purely bridged " + "traffic.\n"); + brnf_deferred_hooks = 1; + } return 1; } diff --git a/net/netfilter/xt_pkttype.c b/net/netfilter/xt_pkttype.c index 3ac703b5c..d2f5320a8 100644 --- a/net/netfilter/xt_pkttype.c +++ b/net/netfilter/xt_pkttype.c @@ -9,6 +9,8 @@ #include #include #include +#include +#include #include #include @@ -28,9 +30,17 @@ static int match(const struct sk_buff *skb, unsigned int protoff, int *hotdrop) { + u_int8_t type; const struct xt_pkttype_info *info = matchinfo; - return (skb->pkt_type == info->pkttype) ^ info->invert; + if (skb->pkt_type == PACKET_LOOPBACK) + type = (MULTICAST(skb->nh.iph->daddr) + ? PACKET_MULTICAST + : PACKET_BROADCAST); + else + type = skb->pkt_type; + + return (type == info->pkttype) ^ info->invert; } static struct xt_match pkttype_match = { diff --git a/net/netfilter/xt_policy.c b/net/netfilter/xt_policy.c index a3aa62fbd..ba1ca03ab 100644 --- a/net/netfilter/xt_policy.c +++ b/net/netfilter/xt_policy.c @@ -8,7 +8,6 @@ */ #include -#include #include #include #include diff --git a/net/netfilter/xt_sctp.c b/net/netfilter/xt_sctp.c index c29692c7c..843383e01 100644 --- a/net/netfilter/xt_sctp.c +++ b/net/netfilter/xt_sctp.c @@ -129,11 +129,9 @@ match(const struct sk_buff *skb, unsigned int protoff, int *hotdrop) { - const struct xt_sctp_info *info; + const struct xt_sctp_info *info = matchinfo; sctp_sctphdr_t _sh, *sh; - info = (const struct xt_sctp_info *)matchinfo; - if (offset) { duprintf("Dropping non-first fragment.. FIXME\n"); return 0; @@ -153,7 +151,7 @@ match(const struct sk_buff *skb, && SCCHECK(((ntohs(sh->dest) >= info->dpts[0]) && (ntohs(sh->dest) <= info->dpts[1])), XT_SCTP_DEST_PORTS, info->flags, info->invflags) - && SCCHECK(match_packet(skb, protoff, + && SCCHECK(match_packet(skb, protoff + sizeof (sctp_sctphdr_t), info->chunkmap, info->chunk_match_type, info->flag_info, info->flag_count, hotdrop), diff --git a/net/netfilter/xt_string.c b/net/netfilter/xt_string.c index 79d9ea696..275330fcd 100644 --- a/net/netfilter/xt_string.c +++ b/net/netfilter/xt_string.c @@ -30,14 +30,14 @@ static int match(const struct sk_buff *skb, unsigned int protoff, int *hotdrop) { + const struct xt_string_info *conf = matchinfo; struct ts_state state; - struct xt_string_info *conf = (struct xt_string_info *) matchinfo; memset(&state, 0, sizeof(struct ts_state)); return (skb_find_text((struct sk_buff *)skb, conf->from_offset, conf->to_offset, conf->config, &state) - != UINT_MAX) && !conf->invert; + != UINT_MAX) ^ conf->invert; } #define STRING_TEXT_PRIV(m) ((struct xt_string_info *) m) @@ -55,7 +55,10 @@ static int checkentry(const char *tablename, /* Damn, can't handle this case properly with iptables... */ if (conf->from_offset > conf->to_offset) return 0; - + if (conf->algo[XT_STRING_MAX_ALGO_NAME_SIZE - 1] != '\0') + return 0; + if (conf->patlen > XT_STRING_MAX_PATTERN_SIZE) + return 0; ts_conf = textsearch_prepare(conf->algo, conf->pattern, conf->patlen, GFP_KERNEL, TS_AUTOLOAD); if (IS_ERR(ts_conf)) diff --git a/net/netfilter/xt_tcpudp.c b/net/netfilter/xt_tcpudp.c index 1b61dac9c..a9a63aa68 100644 --- a/net/netfilter/xt_tcpudp.c +++ b/net/netfilter/xt_tcpudp.c @@ -260,7 +260,7 @@ static int __init xt_tcpudp_init(void) return ret; out_unreg_udp: - xt_unregister_match(&tcp_matchstruct); + xt_unregister_match(&udp_matchstruct); out_unreg_tcp6: xt_unregister_match(&tcp6_matchstruct); out_unreg_tcp: diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 524d3e8c7..dbd5c1100 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -21,7 +21,6 @@ * mandatory if CONFIG_NET=y these days */ -#include #include #include @@ -160,7 +159,7 @@ static void netlink_sock_destruct(struct sock *sk) static void netlink_table_grab(void) { - write_lock_bh(&nl_table_lock); + write_lock_irq(&nl_table_lock); if (atomic_read(&nl_table_users)) { DECLARE_WAITQUEUE(wait, current); @@ -170,9 +169,9 @@ static void netlink_table_grab(void) set_current_state(TASK_UNINTERRUPTIBLE); if (atomic_read(&nl_table_users) == 0) break; - write_unlock_bh(&nl_table_lock); + write_unlock_irq(&nl_table_lock); schedule(); - write_lock_bh(&nl_table_lock); + write_lock_irq(&nl_table_lock); } __set_current_state(TASK_RUNNING); @@ -182,7 +181,7 @@ static void netlink_table_grab(void) static __inline__ void netlink_table_ungrab(void) { - write_unlock_bh(&nl_table_lock); + write_unlock_irq(&nl_table_lock); wake_up(&nl_table_wait); } @@ -566,10 +565,9 @@ static int netlink_alloc_groups(struct sock *sk) if (err) return err; - nlk->groups = kmalloc(NLGRPSZ(groups), GFP_KERNEL); + nlk->groups = kzalloc(NLGRPSZ(groups), GFP_KERNEL); if (nlk->groups == NULL) return -ENOMEM; - memset(nlk->groups, 0, NLGRPSZ(groups)); nlk->ngroups = groups; return 0; } @@ -1278,8 +1276,7 @@ netlink_kernel_create(int unit, unsigned int groups, struct netlink_sock *nlk; unsigned long *listeners = NULL; - if (!nl_table) - return NULL; + BUG_ON(!nl_table); if (unit<0 || unit>=MAX_LINKS) return NULL; @@ -1397,11 +1394,10 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb, struct sock *sk; struct netlink_sock *nlk; - cb = kmalloc(sizeof(*cb), GFP_KERNEL); + cb = kzalloc(sizeof(*cb), GFP_KERNEL); if (cb == NULL) return -ENOBUFS; - memset(cb, 0, sizeof(*cb)); cb->dump = dump; cb->done = done; cb->nlh = nlh; @@ -1672,7 +1668,7 @@ static int netlink_seq_open(struct inode *inode, struct file *file) struct nl_seq_iter *iter; int err; - iter = kmalloc(sizeof(*iter), GFP_KERNEL); + iter = kzalloc(sizeof(*iter), GFP_KERNEL); if (!iter) return -ENOMEM; @@ -1682,7 +1678,6 @@ static int netlink_seq_open(struct inode *inode, struct file *file) return err; } - memset(iter, 0, sizeof(*iter)); seq = file->private_data; seq->private = iter; return 0; @@ -1751,14 +1746,9 @@ static int __init netlink_proto_init(void) if (sizeof(struct netlink_skb_parms) > sizeof(dummy_skb->cb)) netlink_skb_parms_too_large(); - nl_table = kmalloc(sizeof(*nl_table) * MAX_LINKS, GFP_KERNEL); - if (!nl_table) { -enomem: - printk(KERN_CRIT "netlink_init: Cannot allocate nl_table\n"); - return -ENOMEM; - } - - memset(nl_table, 0, sizeof(*nl_table) * MAX_LINKS); + nl_table = kcalloc(MAX_LINKS, sizeof(*nl_table), GFP_KERNEL); + if (!nl_table) + goto panic; if (num_physpages >= (128 * 1024)) max = num_physpages >> (21 - PAGE_SHIFT); @@ -1778,7 +1768,7 @@ enomem: nl_pid_hash_free(nl_table[i].hash.table, 1 * sizeof(*hash->table)); kfree(nl_table); - goto enomem; + goto panic; } memset(hash->table, 0, 1 * sizeof(*hash->table)); hash->max_shift = order; @@ -1795,6 +1785,8 @@ enomem: rtnetlink_init(); out: return err; +panic: + panic("netlink_init: Cannot allocate nl_table\n"); } core_initcall(netlink_proto_init); diff --git a/net/netlink/attr.c b/net/netlink/attr.c index fffef4ab2..dddbd1513 100644 --- a/net/netlink/attr.c +++ b/net/netlink/attr.c @@ -5,7 +5,6 @@ * Alexey Kuznetsov */ -#include #include #include #include diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c index f329b7257..a298f77cc 100644 --- a/net/netlink/genetlink.c +++ b/net/netlink/genetlink.c @@ -5,7 +5,6 @@ * Thomas Graf */ -#include #include #include #include @@ -320,7 +319,7 @@ static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, goto errout; } - if ((ops->flags & GENL_ADMIN_PERM) && security_netlink_recv(skb)) { + if ((ops->flags & GENL_ADMIN_PERM) && security_netlink_recv(skb, CAP_NET_ADMIN)) { err = -EPERM; goto errout; } diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c index 3669cb953..1d50f801f 100644 --- a/net/netrom/af_netrom.c +++ b/net/netrom/af_netrom.c @@ -8,7 +8,6 @@ * Copyright Alan Cox GW4PTS (alan@lxorguk.ukuu.org.uk) * Copyright Darryl Miles G7LED (dlm@g7led.demon.co.uk) */ -#include #include #include #include @@ -66,6 +65,14 @@ static DEFINE_SPINLOCK(nr_list_lock); static const struct proto_ops nr_proto_ops; +/* + * NETROM network devices are virtual network devices encapsulating NETROM + * frames into AX.25 which will be sent through an AX.25 device, so form a + * special "super class" of normal net devices; split their locks off into a + * separate class since they always nest. + */ +static struct lock_class_key nr_netdev_xmit_lock_key; + /* * Socket removal during an interrupt is now safe. */ @@ -801,7 +808,7 @@ static int nr_accept(struct socket *sock, struct socket *newsock, int flags) /* Now attach up the new socket */ kfree_skb(skb); - sk->sk_ack_backlog--; + sk_acceptq_removed(sk); newsock->sk = newsk; out: @@ -986,19 +993,19 @@ int nr_rx_frame(struct sk_buff *skb, struct net_device *dev) nr_make->vr = 0; nr_make->vl = 0; nr_make->state = NR_STATE_3; - sk->sk_ack_backlog++; - - nr_insert_socket(make); - + sk_acceptq_added(sk); skb_queue_head(&sk->sk_receive_queue, skb); - nr_start_heartbeat(make); - nr_start_idletimer(make); - if (!sock_flag(sk, SOCK_DEAD)) sk->sk_data_ready(sk, skb->len); bh_unlock_sock(sk); + + nr_insert_socket(make); + + nr_start_heartbeat(make); + nr_start_idletimer(make); + return 1; } @@ -1383,14 +1390,12 @@ static int __init nr_proto_init(void) return -1; } - dev_nr = kmalloc(nr_ndevs * sizeof(struct net_device *), GFP_KERNEL); + dev_nr = kzalloc(nr_ndevs * sizeof(struct net_device *), GFP_KERNEL); if (dev_nr == NULL) { printk(KERN_ERR "NET/ROM: nr_proto_init - unable to allocate device array\n"); return -1; } - memset(dev_nr, 0x00, nr_ndevs * sizeof(struct net_device *)); - for (i = 0; i < nr_ndevs; i++) { char name[IFNAMSIZ]; struct net_device *dev; @@ -1408,6 +1413,7 @@ static int __init nr_proto_init(void) free_netdev(dev); goto fail; } + lockdep_set_class(&dev->_xmit_lock, &nr_netdev_xmit_lock_key); dev_nr[i] = dev; } diff --git a/net/netrom/nr_dev.c b/net/netrom/nr_dev.c index 621e5586a..9b8eb5497 100644 --- a/net/netrom/nr_dev.c +++ b/net/netrom/nr_dev.c @@ -6,7 +6,6 @@ * * Copyright Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk) */ -#include #include #include #include diff --git a/net/netrom/nr_route.c b/net/netrom/nr_route.c index b3b9097c8..c11737f47 100644 --- a/net/netrom/nr_route.c +++ b/net/netrom/nr_route.c @@ -725,15 +725,17 @@ void nr_link_failed(ax25_cb *ax25, int reason) struct nr_node *nr_node = NULL; spin_lock_bh(&nr_neigh_list_lock); - nr_neigh_for_each(s, node, &nr_neigh_list) + nr_neigh_for_each(s, node, &nr_neigh_list) { if (s->ax25 == ax25) { nr_neigh_hold(s); nr_neigh = s; break; } + } spin_unlock_bh(&nr_neigh_list_lock); - if (nr_neigh == NULL) return; + if (nr_neigh == NULL) + return; nr_neigh->ax25 = NULL; ax25_cb_put(ax25); @@ -743,11 +745,13 @@ void nr_link_failed(ax25_cb *ax25, int reason) return; } spin_lock_bh(&nr_node_list_lock); - nr_node_for_each(nr_node, node, &nr_node_list) + nr_node_for_each(nr_node, node, &nr_node_list) { nr_node_lock(nr_node); - if (nr_node->which < nr_node->count && nr_node->routes[nr_node->which].neighbour == nr_neigh) + if (nr_node->which < nr_node->count && + nr_node->routes[nr_node->which].neighbour == nr_neigh) nr_node->which++; nr_node_unlock(nr_node); + } spin_unlock_bh(&nr_node_list_lock); nr_neigh_put(nr_neigh); } diff --git a/net/netrom/nr_timer.c b/net/netrom/nr_timer.c index 75b72d389..ddba1c144 100644 --- a/net/netrom/nr_timer.c +++ b/net/netrom/nr_timer.c @@ -138,8 +138,8 @@ static void nr_heartbeat_expiry(unsigned long param) if (sock_flag(sk, SOCK_DESTROY) || (sk->sk_state == TCP_LISTEN && sock_flag(sk, SOCK_DEAD))) { sock_hold(sk); - nr_destroy_socket(sk); bh_unlock_sock(sk); + nr_destroy_socket(sk); sock_put(sk); return; } diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index d36b3c955..e8cb33495 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -49,7 +49,6 @@ * */ -#include #include #include #include @@ -639,8 +638,6 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, struct packe if ((int)snaplen < 0) snaplen = 0; } - if (snaplen > skb->len-skb->data_len) - snaplen = skb->len-skb->data_len; spin_lock(&sk->sk_receive_queue.lock); h = (struct tpacket_hdr *)packet_lookup_frame(po, po->head); @@ -657,7 +654,7 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, struct packe status &= ~TP_STATUS_LOSING; spin_unlock(&sk->sk_receive_queue.lock); - memcpy((u8*)h + macoff, skb->data, snaplen); + skb_copy_bits(skb, 0, (u8*)h + macoff, snaplen); h->tp_len = skb->len; h->tp_snaplen = snaplen; diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c index 55564efcc..08a542855 100644 --- a/net/rose/af_rose.c +++ b/net/rose/af_rose.c @@ -10,7 +10,6 @@ * Copyright (C) Tomi Manninen OH2BNS (oh2bns@sral.fi) */ -#include #include #include #include @@ -67,6 +66,14 @@ static struct proto_ops rose_proto_ops; ax25_address rose_callsign; +/* + * ROSE network devices are virtual network devices encapsulating ROSE + * frames into AX.25 which will be sent through an AX.25 device, so form a + * special "super class" of normal net devices; split their locks off into a + * separate class since they always nest. + */ +static struct lock_class_key rose_netdev_xmit_lock_key; + /* * Convert a ROSE address into text. */ @@ -753,7 +760,7 @@ static int rose_connect(struct socket *sock, struct sockaddr *uaddr, int addr_le rose_insert_socket(sk); /* Finish the bind */ } - +rose_try_next_neigh: rose->dest_addr = addr->srose_addr; rose->dest_call = addr->srose_call; rose->rand = ((long)rose & 0xFFFF) + rose->lci; @@ -811,6 +818,11 @@ static int rose_connect(struct socket *sock, struct sockaddr *uaddr, int addr_le } if (sk->sk_state != TCP_ESTABLISHED) { + /* Try next neighbour */ + rose->neighbour = rose_get_neigh(&addr->srose_addr, &cause, &diagnostic); + if (rose->neighbour) + goto rose_try_next_neigh; + /* No more neighbour */ sock->state = SS_UNCONNECTED; return sock_error(sk); /* Always set at this point */ } @@ -1486,14 +1498,13 @@ static int __init rose_proto_init(void) rose_callsign = null_ax25_address; - dev_rose = kmalloc(rose_ndevs * sizeof(struct net_device *), GFP_KERNEL); + dev_rose = kzalloc(rose_ndevs * sizeof(struct net_device *), GFP_KERNEL); if (dev_rose == NULL) { printk(KERN_ERR "ROSE: rose_proto_init - unable to allocate device structure\n"); rc = -ENOMEM; goto out_proto_unregister; } - memset(dev_rose, 0x00, rose_ndevs * sizeof(struct net_device*)); for (i = 0; i < rose_ndevs; i++) { struct net_device *dev; char name[IFNAMSIZ]; @@ -1512,6 +1523,7 @@ static int __init rose_proto_init(void) free_netdev(dev); goto fail; } + lockdep_set_class(&dev->_xmit_lock, &rose_netdev_xmit_lock_key); dev_rose[i] = dev; } diff --git a/net/rose/rose_dev.c b/net/rose/rose_dev.c index 2a1bf8e11..7c279e265 100644 --- a/net/rose/rose_dev.c +++ b/net/rose/rose_dev.c @@ -6,7 +6,6 @@ * * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk) */ -#include #include #include #include @@ -60,6 +59,7 @@ static int rose_rebuild_header(struct sk_buff *skb) struct net_device_stats *stats = netdev_priv(dev); unsigned char *bp = (unsigned char *)skb->data; struct sk_buff *skbn; + unsigned int len; #ifdef CONFIG_INET if (arp_find(bp + 7, skb)) { @@ -76,6 +76,8 @@ static int rose_rebuild_header(struct sk_buff *skb) kfree_skb(skb); + len = skbn->len; + if (!rose_route_frame(skbn, NULL)) { kfree_skb(skbn); stats->tx_errors++; @@ -83,7 +85,7 @@ static int rose_rebuild_header(struct sk_buff *skb) } stats->tx_packets++; - stats->tx_bytes += skbn->len; + stats->tx_bytes += len; #endif return 1; } diff --git a/net/rxrpc/call.c b/net/rxrpc/call.c index c4aeb7d40..d07122b57 100644 --- a/net/rxrpc/call.c +++ b/net/rxrpc/call.c @@ -1098,8 +1098,7 @@ static void rxrpc_call_receive_data_packet(struct rxrpc_call *call, call->app_ready_seq = pmsg->seq; call->app_ready_qty += pmsg->dsize; - list_del_init(&pmsg->link); - list_add_tail(&pmsg->link, &call->app_readyq); + list_move_tail(&pmsg->link, &call->app_readyq); } /* see if we've got the last packet yet */ diff --git a/net/rxrpc/connection.c b/net/rxrpc/connection.c index 0e0a45534..93d2c55ad 100644 --- a/net/rxrpc/connection.c +++ b/net/rxrpc/connection.c @@ -58,13 +58,12 @@ static inline int __rxrpc_create_connection(struct rxrpc_peer *peer, _enter("%p",peer); /* allocate and initialise a connection record */ - conn = kmalloc(sizeof(struct rxrpc_connection), GFP_KERNEL); + conn = kzalloc(sizeof(struct rxrpc_connection), GFP_KERNEL); if (!conn) { _leave(" = -ENOMEM"); return -ENOMEM; } - memset(conn, 0, sizeof(struct rxrpc_connection)); atomic_set(&conn->usage, 1); INIT_LIST_HEAD(&conn->link); @@ -402,8 +401,7 @@ void rxrpc_put_connection(struct rxrpc_connection *conn) /* move to graveyard queue */ _debug("burying connection: {%08x}", ntohl(conn->conn_id)); - list_del(&conn->link); - list_add_tail(&conn->link, &peer->conn_graveyard); + list_move_tail(&conn->link, &peer->conn_graveyard); rxrpc_krxtimod_add_timer(&conn->timeout, rxrpc_conn_timeout * HZ); @@ -536,13 +534,12 @@ int rxrpc_conn_newmsg(struct rxrpc_connection *conn, return -EINVAL; } - msg = kmalloc(sizeof(struct rxrpc_message), alloc_flags); + msg = kzalloc(sizeof(struct rxrpc_message), alloc_flags); if (!msg) { _leave(" = -ENOMEM"); return -ENOMEM; } - memset(msg, 0, sizeof(*msg)); atomic_set(&msg->usage, 1); INIT_LIST_HEAD(&msg->link); diff --git a/net/rxrpc/krxsecd.c b/net/rxrpc/krxsecd.c index 1aadd026d..cea4eb5e2 100644 --- a/net/rxrpc/krxsecd.c +++ b/net/rxrpc/krxsecd.c @@ -160,8 +160,7 @@ void rxrpc_krxsecd_clear_transport(struct rxrpc_transport *trans) list_for_each_safe(_p, _n, &rxrpc_krxsecd_initmsgq) { msg = list_entry(_p, struct rxrpc_message, link); if (msg->trans == trans) { - list_del(&msg->link); - list_add_tail(&msg->link, &tmp); + list_move_tail(&msg->link, &tmp); atomic_dec(&rxrpc_krxsecd_qcount); } } diff --git a/net/rxrpc/peer.c b/net/rxrpc/peer.c index ed38f5b17..8a275157a 100644 --- a/net/rxrpc/peer.c +++ b/net/rxrpc/peer.c @@ -58,13 +58,12 @@ static int __rxrpc_create_peer(struct rxrpc_transport *trans, __be32 addr, _enter("%p,%08x", trans, ntohl(addr)); /* allocate and initialise a peer record */ - peer = kmalloc(sizeof(struct rxrpc_peer), GFP_KERNEL); + peer = kzalloc(sizeof(struct rxrpc_peer), GFP_KERNEL); if (!peer) { _leave(" = -ENOMEM"); return -ENOMEM; } - memset(peer, 0, sizeof(struct rxrpc_peer)); atomic_set(&peer->usage, 1); INIT_LIST_HEAD(&peer->link); diff --git a/net/rxrpc/rxrpc_syms.c b/net/rxrpc/rxrpc_syms.c index 56adf16fe..9896fd87a 100644 --- a/net/rxrpc/rxrpc_syms.c +++ b/net/rxrpc/rxrpc_syms.c @@ -9,7 +9,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include diff --git a/net/rxrpc/sysctl.c b/net/rxrpc/sysctl.c index fbf98729c..6374df7e7 100644 --- a/net/rxrpc/sysctl.c +++ b/net/rxrpc/sysctl.c @@ -9,7 +9,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include diff --git a/net/rxrpc/transport.c b/net/rxrpc/transport.c index dbe6105e8..465efc86f 100644 --- a/net/rxrpc/transport.c +++ b/net/rxrpc/transport.c @@ -68,11 +68,10 @@ int rxrpc_create_transport(unsigned short port, _enter("%hu", port); - trans = kmalloc(sizeof(struct rxrpc_transport), GFP_KERNEL); + trans = kzalloc(sizeof(struct rxrpc_transport), GFP_KERNEL); if (!trans) return -ENOMEM; - memset(trans, 0, sizeof(struct rxrpc_transport)); atomic_set(&trans->usage, 1); INIT_LIST_HEAD(&trans->services); INIT_LIST_HEAD(&trans->link); @@ -312,13 +311,12 @@ static int rxrpc_incoming_msg(struct rxrpc_transport *trans, _enter(""); - msg = kmalloc(sizeof(struct rxrpc_message), GFP_KERNEL); + msg = kzalloc(sizeof(struct rxrpc_message), GFP_KERNEL); if (!msg) { _leave(" = -ENOMEM"); return -ENOMEM; } - memset(msg, 0, sizeof(*msg)); atomic_set(&msg->usage, 1); list_add_tail(&msg->link,msgq); diff --git a/net/sched/Kconfig b/net/sched/Kconfig index 13eeee582..8298ea9ff 100644 --- a/net/sched/Kconfig +++ b/net/sched/Kconfig @@ -305,7 +305,7 @@ config NET_CLS_U32 tristate "Universal 32bit comparisons w/ hashing (U32)" select NET_CLS ---help--- - Say Y here to be able to classify packetes using a universal + Say Y here to be able to classify packets using a universal 32bit pieces based comparison scheme. To compile this code as a module, choose M here: the @@ -485,7 +485,7 @@ config NET_ACT_IPT tristate "IPtables targets" depends on NET_CLS_ACT && NETFILTER && IP_NF_IPTABLES ---help--- - Say Y here to be able to invoke iptables targets after succesful + Say Y here to be able to invoke iptables targets after successful classification. To compile this code as a module, choose M here: the @@ -537,8 +537,8 @@ config NET_ESTIMATOR ---help--- Say Y here to allow using rate estimators to estimate the current rate-of-flow for network devices, queues, etc. This module is - automaticaly selected if needed but can be selected manually for - statstical purposes. + automatically selected if needed but can be selected manually for + statistical purposes. endif # NET_SCHED diff --git a/net/sched/act_api.c b/net/sched/act_api.c index eb7dc2947..a2587b52e 100644 --- a/net/sched/act_api.c +++ b/net/sched/act_api.c @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include @@ -313,10 +312,9 @@ struct tc_action *tcf_action_init_1(struct rtattr *rta, struct rtattr *est, } *err = -ENOMEM; - a = kmalloc(sizeof(*a), GFP_KERNEL); + a = kzalloc(sizeof(*a), GFP_KERNEL); if (a == NULL) goto err_mod; - memset(a, 0, sizeof(*a)); /* backward compatibility for policer */ if (name == NULL) @@ -493,10 +491,9 @@ tcf_action_get_1(struct rtattr *rta, struct nlmsghdr *n, u32 pid, int *err) index = *(int *)RTA_DATA(tb[TCA_ACT_INDEX - 1]); *err = -ENOMEM; - a = kmalloc(sizeof(struct tc_action), GFP_KERNEL); + a = kzalloc(sizeof(struct tc_action), GFP_KERNEL); if (a == NULL) return NULL; - memset(a, 0, sizeof(struct tc_action)); *err = -EINVAL; a->ops = tc_lookup_action(tb[TCA_ACT_KIND - 1]); @@ -532,12 +529,11 @@ static struct tc_action *create_a(int i) { struct tc_action *act; - act = kmalloc(sizeof(*act), GFP_KERNEL); + act = kzalloc(sizeof(*act), GFP_KERNEL); if (act == NULL) { printk("create_a: failed to alloc!\n"); return NULL; } - memset(act, 0, sizeof(*act)); act->order = i; return act; } @@ -603,8 +599,8 @@ static int tca_action_flush(struct rtattr *rta, struct nlmsghdr *n, u32 pid) return err; rtattr_failure: - module_put(a->ops->owner); nlmsg_failure: + module_put(a->ops->owner); err_out: kfree_skb(skb); kfree(a); @@ -885,8 +881,6 @@ static int __init tc_action_init(void) link_p[RTM_GETACTION-RTM_BASE].dumpit = tc_dump_action; } - printk("TC classifier action (bugs to netdev@vger.kernel.org cc " - "hadi@cyberus.ca)\n"); return 0; } diff --git a/net/sched/act_gact.c b/net/sched/act_gact.c index a1e68f78d..e75a147ad 100644 --- a/net/sched/act_gact.c +++ b/net/sched/act_gact.c @@ -13,7 +13,6 @@ #include #include #include -#include #include #include #include diff --git a/net/sched/act_ipt.c b/net/sched/act_ipt.c index 37640c6fc..d799e0124 100644 --- a/net/sched/act_ipt.c +++ b/net/sched/act_ipt.c @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include diff --git a/net/sched/act_mirred.c b/net/sched/act_mirred.c index 4fcccbd50..fc562047e 100644 --- a/net/sched/act_mirred.c +++ b/net/sched/act_mirred.c @@ -15,7 +15,6 @@ #include #include #include -#include #include #include #include diff --git a/net/sched/act_pedit.c b/net/sched/act_pedit.c index 1742a68e0..f257475e0 100644 --- a/net/sched/act_pedit.c +++ b/net/sched/act_pedit.c @@ -12,7 +12,6 @@ #include #include #include -#include #include #include #include @@ -210,10 +209,9 @@ tcf_pedit_dump(struct sk_buff *skb, struct tc_action *a,int bind, int ref) s = sizeof(*opt) + p->nkeys * sizeof(struct tc_pedit_key); /* netlink spinlocks held above us - must use ATOMIC */ - opt = kmalloc(s, GFP_ATOMIC); + opt = kzalloc(s, GFP_ATOMIC); if (opt == NULL) return -ENOBUFS; - memset(opt, 0, s); memcpy(opt->keys, p->keys, p->nkeys * sizeof(struct tc_pedit_key)); opt->index = p->index; diff --git a/net/sched/act_police.c b/net/sched/act_police.c index 24c348fa8..da905d7b4 100644 --- a/net/sched/act_police.c +++ b/net/sched/act_police.c @@ -13,7 +13,6 @@ #include #include #include -#include #include #include #include @@ -197,10 +196,9 @@ static int tcf_act_police_locate(struct rtattr *rta, struct rtattr *est, return ret; } - p = kmalloc(sizeof(*p), GFP_KERNEL); + p = kzalloc(sizeof(*p), GFP_KERNEL); if (p == NULL) return -ENOMEM; - memset(p, 0, sizeof(*p)); ret = ACT_P_CREATED; p->refcnt = 1; @@ -430,11 +428,10 @@ struct tcf_police * tcf_police_locate(struct rtattr *rta, struct rtattr *est) return p; } - p = kmalloc(sizeof(*p), GFP_KERNEL); + p = kzalloc(sizeof(*p), GFP_KERNEL); if (p == NULL) return NULL; - memset(p, 0, sizeof(*p)); p->refcnt = 1; spin_lock_init(&p->lock); p->stats_lock = &p->lock; diff --git a/net/sched/act_simple.c b/net/sched/act_simple.c index e5f2e1f43..17105c825 100644 --- a/net/sched/act_simple.c +++ b/net/sched/act_simple.c @@ -10,7 +10,6 @@ * */ -#include #include #include #include diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c index b4d89fbb3..37a184021 100644 --- a/net/sched/cls_api.c +++ b/net/sched/cls_api.c @@ -17,7 +17,6 @@ #include #include #include -#include #include #include #include @@ -402,7 +401,7 @@ static int tc_dump_tfilter(struct sk_buff *skb, struct netlink_callback *cb) if ((dev = dev_get_by_index(tcm->tcm_ifindex)) == NULL) return skb->len; - read_lock_bh(&qdisc_tree_lock); + read_lock(&qdisc_tree_lock); if (!tcm->tcm_parent) q = dev->qdisc_sleeping; else @@ -459,7 +458,7 @@ errout: if (cl) cops->put(q, cl); out: - read_unlock_bh(&qdisc_tree_lock); + read_unlock(&qdisc_tree_lock); dev_put(dev); return skb->len; } diff --git a/net/sched/cls_basic.c b/net/sched/cls_basic.c index dfb300bb6..09fda68c8 100644 --- a/net/sched/cls_basic.c +++ b/net/sched/cls_basic.c @@ -9,7 +9,6 @@ * Authors: Thomas Graf */ -#include #include #include #include @@ -179,25 +178,23 @@ static int basic_change(struct tcf_proto *tp, unsigned long base, u32 handle, err = -ENOBUFS; if (head == NULL) { - head = kmalloc(sizeof(*head), GFP_KERNEL); + head = kzalloc(sizeof(*head), GFP_KERNEL); if (head == NULL) goto errout; - memset(head, 0, sizeof(*head)); INIT_LIST_HEAD(&head->flist); tp->root = head; } - f = kmalloc(sizeof(*f), GFP_KERNEL); + f = kzalloc(sizeof(*f), GFP_KERNEL); if (f == NULL) goto errout; - memset(f, 0, sizeof(*f)); err = -EINVAL; if (handle) f->handle = handle; else { - int i = 0x80000000; + unsigned int i = 0x80000000; do { if (++head->hgenerator == 0x7FFFFFFF) head->hgenerator = 1; diff --git a/net/sched/cls_fw.c b/net/sched/cls_fw.c index 75470486e..e6973d9b6 100644 --- a/net/sched/cls_fw.c +++ b/net/sched/cls_fw.c @@ -18,7 +18,6 @@ * */ -#include #include #include #include @@ -268,20 +267,18 @@ static int fw_change(struct tcf_proto *tp, unsigned long base, return -EINVAL; if (head == NULL) { - head = kmalloc(sizeof(struct fw_head), GFP_KERNEL); + head = kzalloc(sizeof(struct fw_head), GFP_KERNEL); if (head == NULL) return -ENOBUFS; - memset(head, 0, sizeof(*head)); tcf_tree_lock(tp); tp->root = head; tcf_tree_unlock(tp); } - f = kmalloc(sizeof(struct fw_filter), GFP_KERNEL); + f = kzalloc(sizeof(struct fw_filter), GFP_KERNEL); if (f == NULL) return -ENOBUFS; - memset(f, 0, sizeof(*f)); f->id = handle; diff --git a/net/sched/cls_route.c b/net/sched/cls_route.c index 520ff716d..d3aea730d 100644 --- a/net/sched/cls_route.c +++ b/net/sched/cls_route.c @@ -10,7 +10,6 @@ */ #include -#include #include #include #include @@ -397,10 +396,9 @@ static int route4_set_parms(struct tcf_proto *tp, unsigned long base, h1 = to_hash(nhandle); if ((b = head->table[h1]) == NULL) { err = -ENOBUFS; - b = kmalloc(sizeof(struct route4_bucket), GFP_KERNEL); + b = kzalloc(sizeof(struct route4_bucket), GFP_KERNEL); if (b == NULL) goto errout; - memset(b, 0, sizeof(*b)); tcf_tree_lock(tp); head->table[h1] = b; @@ -476,20 +474,18 @@ static int route4_change(struct tcf_proto *tp, unsigned long base, err = -ENOBUFS; if (head == NULL) { - head = kmalloc(sizeof(struct route4_head), GFP_KERNEL); + head = kzalloc(sizeof(struct route4_head), GFP_KERNEL); if (head == NULL) goto errout; - memset(head, 0, sizeof(struct route4_head)); tcf_tree_lock(tp); tp->root = head; tcf_tree_unlock(tp); } - f = kmalloc(sizeof(struct route4_filter), GFP_KERNEL); + f = kzalloc(sizeof(struct route4_filter), GFP_KERNEL); if (f == NULL) goto errout; - memset(f, 0, sizeof(*f)); err = route4_set_parms(tp, base, f, handle, head, tb, tca[TCA_RATE-1], 1); diff --git a/net/sched/cls_rsvp.h b/net/sched/cls_rsvp.h index 572f06be3..6e230ecfb 100644 --- a/net/sched/cls_rsvp.h +++ b/net/sched/cls_rsvp.h @@ -65,7 +65,6 @@ Well, as result, despite its simplicity, we get a pretty powerful classification engine. */ -#include struct rsvp_head { @@ -241,9 +240,8 @@ static int rsvp_init(struct tcf_proto *tp) { struct rsvp_head *data; - data = kmalloc(sizeof(struct rsvp_head), GFP_KERNEL); + data = kzalloc(sizeof(struct rsvp_head), GFP_KERNEL); if (data) { - memset(data, 0, sizeof(struct rsvp_head)); tp->root = data; return 0; } @@ -447,11 +445,10 @@ static int rsvp_change(struct tcf_proto *tp, unsigned long base, goto errout2; err = -ENOBUFS; - f = kmalloc(sizeof(struct rsvp_filter), GFP_KERNEL); + f = kzalloc(sizeof(struct rsvp_filter), GFP_KERNEL); if (f == NULL) goto errout2; - memset(f, 0, sizeof(*f)); h2 = 16; if (tb[TCA_RSVP_SRC-1]) { err = -EINVAL; @@ -533,10 +530,9 @@ insert: /* No session found. Create new one. */ err = -ENOBUFS; - s = kmalloc(sizeof(struct rsvp_session), GFP_KERNEL); + s = kzalloc(sizeof(struct rsvp_session), GFP_KERNEL); if (s == NULL) goto errout; - memset(s, 0, sizeof(*s)); memcpy(s->dst, dst, sizeof(s->dst)); if (pinfo) { diff --git a/net/sched/cls_tcindex.c b/net/sched/cls_tcindex.c index 9f921174c..5af8a59e1 100644 --- a/net/sched/cls_tcindex.c +++ b/net/sched/cls_tcindex.c @@ -4,7 +4,6 @@ * Written 1998,1999 by Werner Almesberger, EPFL ICA */ -#include #include #include #include @@ -149,11 +148,10 @@ static int tcindex_init(struct tcf_proto *tp) struct tcindex_data *p; DPRINTK("tcindex_init(tp %p)\n",tp); - p = kmalloc(sizeof(struct tcindex_data),GFP_KERNEL); + p = kzalloc(sizeof(struct tcindex_data),GFP_KERNEL); if (!p) return -ENOMEM; - memset(p, 0, sizeof(*p)); p->mask = 0xffff; p->hash = DEFAULT_HASH_SIZE; p->fall_through = 1; @@ -297,16 +295,14 @@ tcindex_set_parms(struct tcf_proto *tp, unsigned long base, u32 handle, err = -ENOMEM; if (!cp.perfect && !cp.h) { if (valid_perfect_hash(&cp)) { - cp.perfect = kmalloc(cp.hash * sizeof(*r), GFP_KERNEL); + cp.perfect = kcalloc(cp.hash, sizeof(*r), GFP_KERNEL); if (!cp.perfect) goto errout; - memset(cp.perfect, 0, cp.hash * sizeof(*r)); balloc = 1; } else { - cp.h = kmalloc(cp.hash * sizeof(f), GFP_KERNEL); + cp.h = kcalloc(cp.hash, sizeof(f), GFP_KERNEL); if (!cp.h) goto errout; - memset(cp.h, 0, cp.hash * sizeof(f)); balloc = 2; } } @@ -317,10 +313,9 @@ tcindex_set_parms(struct tcf_proto *tp, unsigned long base, u32 handle, r = tcindex_lookup(&cp, handle) ? : &new_filter_result; if (r == &new_filter_result) { - f = kmalloc(sizeof(*f), GFP_KERNEL); + f = kzalloc(sizeof(*f), GFP_KERNEL); if (!f) goto errout_alloc; - memset(f, 0, sizeof(*f)); } if (tb[TCA_TCINDEX_CLASSID-1]) { diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c index 78e052591..0a6cfa000 100644 --- a/net/sched/cls_u32.c +++ b/net/sched/cls_u32.c @@ -33,7 +33,6 @@ #include #include #include -#include #include #include #include @@ -308,23 +307,21 @@ static int u32_init(struct tcf_proto *tp) if (tp_c->q == tp->q) break; - root_ht = kmalloc(sizeof(*root_ht), GFP_KERNEL); + root_ht = kzalloc(sizeof(*root_ht), GFP_KERNEL); if (root_ht == NULL) return -ENOBUFS; - memset(root_ht, 0, sizeof(*root_ht)); root_ht->divisor = 0; root_ht->refcnt++; root_ht->handle = tp_c ? gen_new_htid(tp_c) : 0x80000000; root_ht->prio = tp->prio; if (tp_c == NULL) { - tp_c = kmalloc(sizeof(*tp_c), GFP_KERNEL); + tp_c = kzalloc(sizeof(*tp_c), GFP_KERNEL); if (tp_c == NULL) { kfree(root_ht); return -ENOBUFS; } - memset(tp_c, 0, sizeof(*tp_c)); tp_c->q = tp->q; tp_c->next = u32_list; u32_list = tp_c; @@ -572,10 +569,9 @@ static int u32_change(struct tcf_proto *tp, unsigned long base, u32 handle, if (handle == 0) return -ENOMEM; } - ht = kmalloc(sizeof(*ht) + divisor*sizeof(void*), GFP_KERNEL); + ht = kzalloc(sizeof(*ht) + divisor*sizeof(void*), GFP_KERNEL); if (ht == NULL) return -ENOBUFS; - memset(ht, 0, sizeof(*ht) + divisor*sizeof(void*)); ht->tp_c = tp_c; ht->refcnt = 0; ht->divisor = divisor; @@ -618,18 +614,16 @@ static int u32_change(struct tcf_proto *tp, unsigned long base, u32 handle, s = RTA_DATA(tb[TCA_U32_SEL-1]); - n = kmalloc(sizeof(*n) + s->nkeys*sizeof(struct tc_u32_key), GFP_KERNEL); + n = kzalloc(sizeof(*n) + s->nkeys*sizeof(struct tc_u32_key), GFP_KERNEL); if (n == NULL) return -ENOBUFS; - memset(n, 0, sizeof(*n) + s->nkeys*sizeof(struct tc_u32_key)); #ifdef CONFIG_CLS_U32_PERF - n->pf = kmalloc(sizeof(struct tc_u32_pcnt) + s->nkeys*sizeof(u64), GFP_KERNEL); + n->pf = kzalloc(sizeof(struct tc_u32_pcnt) + s->nkeys*sizeof(u64), GFP_KERNEL); if (n->pf == NULL) { kfree(n); return -ENOBUFS; } - memset(n->pf, 0, sizeof(struct tc_u32_pcnt) + s->nkeys*sizeof(u64)); #endif memcpy(&n->sel, s, sizeof(*s) + s->nkeys*sizeof(struct tc_u32_key)); @@ -802,7 +796,7 @@ static int __init init_u32(void) { printk("u32 classifier\n"); #ifdef CONFIG_CLS_U32_PERF - printk(" Perfomance counters on\n"); + printk(" Performance counters on\n"); #endif #ifdef CONFIG_NET_CLS_POLICE printk(" OLD policer on \n"); diff --git a/net/sched/em_cmp.c b/net/sched/em_cmp.c index bf1f00f8b..8ed93c39b 100644 --- a/net/sched/em_cmp.c +++ b/net/sched/em_cmp.c @@ -9,7 +9,6 @@ * Authors: Thomas Graf */ -#include #include #include #include diff --git a/net/sched/em_meta.c b/net/sched/em_meta.c index 48bb23c2a..61e3b740a 100644 --- a/net/sched/em_meta.c +++ b/net/sched/em_meta.c @@ -27,17 +27,17 @@ * lvalue rvalue * +-----------+ +-----------+ * | type: INT | | type: INT | - * def | id: INDEV | | id: VALUE | + * def | id: DEV | | id: VALUE | * | data: | | data: 3 | * +-----------+ +-----------+ * | | - * ---> meta_ops[INT][INDEV](...) | + * ---> meta_ops[INT][DEV](...) | * | | * ----------- | * V V * +-----------+ +-----------+ * | type: INT | | type: INT | - * obj | id: INDEV | | id: VALUE | + * obj | id: DEV | | id: VALUE | * | data: 2 |<--data got filled out | data: 3 | * +-----------+ +-----------+ * | | @@ -58,7 +58,6 @@ * only available if that subsytem is enabled in the kernel. */ -#include #include #include #include @@ -170,26 +169,6 @@ META_COLLECTOR(var_dev) *err = var_dev(skb->dev, dst); } -META_COLLECTOR(int_indev) -{ - *err = int_dev(skb->input_dev, dst); -} - -META_COLLECTOR(var_indev) -{ - *err = var_dev(skb->input_dev, dst); -} - -META_COLLECTOR(int_realdev) -{ - *err = int_dev(skb->real_dev, dst); -} - -META_COLLECTOR(var_realdev) -{ - *err = var_dev(skb->real_dev, dst); -} - /************************************************************************** * skb attributes **************************************************************************/ @@ -205,11 +184,6 @@ META_COLLECTOR(int_protocol) dst->value = skb->protocol; } -META_COLLECTOR(int_security) -{ - dst->value = skb->security; -} - META_COLLECTOR(int_pkttype) { dst->value = skb->pkt_type; @@ -234,12 +208,14 @@ META_COLLECTOR(int_maclen) * Netfilter **************************************************************************/ -#ifdef CONFIG_NETFILTER META_COLLECTOR(int_nfmark) { +#ifdef CONFIG_NETFILTER dst->value = skb->nfmark; -} +#else + dst->value = 0; #endif +} /************************************************************************** * Traffic Control @@ -250,31 +226,21 @@ META_COLLECTOR(int_tcindex) dst->value = skb->tc_index; } -#ifdef CONFIG_NET_CLS_ACT -META_COLLECTOR(int_tcverd) -{ - dst->value = skb->tc_verd; -} - -META_COLLECTOR(int_tcclassid) -{ - dst->value = skb->tc_classid; -} -#endif - /************************************************************************** * Routing **************************************************************************/ -#ifdef CONFIG_NET_CLS_ROUTE META_COLLECTOR(int_rtclassid) { if (unlikely(skb->dst == NULL)) *err = -1; else +#ifdef CONFIG_NET_CLS_ROUTE dst->value = skb->dst->tclassid; -} +#else + dst->value = 0; #endif +} META_COLLECTOR(int_rtiif) { @@ -426,10 +392,10 @@ META_COLLECTOR(int_sk_route_caps) dst->value = skb->sk->sk_route_caps; } -META_COLLECTOR(int_sk_hashent) +META_COLLECTOR(int_sk_hash) { SKIP_NONLOCAL(skb); - dst->value = skb->sk->sk_hashent; + dst->value = skb->sk->sk_hash; } META_COLLECTOR(int_sk_lingertime) @@ -510,8 +476,6 @@ struct meta_ops static struct meta_ops __meta_ops[TCF_META_TYPE_MAX+1][TCF_META_ID_MAX+1] = { [TCF_META_TYPE_VAR] = { [META_ID(DEV)] = META_FUNC(var_dev), - [META_ID(INDEV)] = META_FUNC(var_indev), - [META_ID(REALDEV)] = META_FUNC(var_realdev), [META_ID(SK_BOUND_IF)] = META_FUNC(var_sk_bound_if), }, [TCF_META_TYPE_INT] = { @@ -520,26 +484,15 @@ static struct meta_ops __meta_ops[TCF_META_TYPE_MAX+1][TCF_META_ID_MAX+1] = { [META_ID(LOADAVG_1)] = META_FUNC(int_loadavg_1), [META_ID(LOADAVG_2)] = META_FUNC(int_loadavg_2), [META_ID(DEV)] = META_FUNC(int_dev), - [META_ID(INDEV)] = META_FUNC(int_indev), - [META_ID(REALDEV)] = META_FUNC(int_realdev), [META_ID(PRIORITY)] = META_FUNC(int_priority), [META_ID(PROTOCOL)] = META_FUNC(int_protocol), - [META_ID(SECURITY)] = META_FUNC(int_security), [META_ID(PKTTYPE)] = META_FUNC(int_pkttype), [META_ID(PKTLEN)] = META_FUNC(int_pktlen), [META_ID(DATALEN)] = META_FUNC(int_datalen), [META_ID(MACLEN)] = META_FUNC(int_maclen), -#ifdef CONFIG_NETFILTER [META_ID(NFMARK)] = META_FUNC(int_nfmark), -#endif [META_ID(TCINDEX)] = META_FUNC(int_tcindex), -#ifdef CONFIG_NET_CLS_ACT - [META_ID(TCVERDICT)] = META_FUNC(int_tcverd), - [META_ID(TCCLASSID)] = META_FUNC(int_tcclassid), -#endif -#ifdef CONFIG_NET_CLS_ROUTE [META_ID(RTCLASSID)] = META_FUNC(int_rtclassid), -#endif [META_ID(RTIIF)] = META_FUNC(int_rtiif), [META_ID(SK_FAMILY)] = META_FUNC(int_sk_family), [META_ID(SK_STATE)] = META_FUNC(int_sk_state), @@ -561,7 +514,7 @@ static struct meta_ops __meta_ops[TCF_META_TYPE_MAX+1][TCF_META_ID_MAX+1] = { [META_ID(SK_FORWARD_ALLOCS)] = META_FUNC(int_sk_fwd_alloc), [META_ID(SK_ALLOCS)] = META_FUNC(int_sk_alloc), [META_ID(SK_ROUTE_CAPS)] = META_FUNC(int_sk_route_caps), - [META_ID(SK_HASHENT)] = META_FUNC(int_sk_hashent), + [META_ID(SK_HASH)] = META_FUNC(int_sk_hash), [META_ID(SK_LINGERTIME)] = META_FUNC(int_sk_lingertime), [META_ID(SK_ACK_BACKLOG)] = META_FUNC(int_sk_ack_bl), [META_ID(SK_MAX_ACK_BACKLOG)] = META_FUNC(int_sk_max_ack_bl), @@ -607,8 +560,7 @@ static int meta_var_change(struct meta_value *dst, struct rtattr *rta) static void meta_var_destroy(struct meta_value *v) { - if (v->val) - kfree((void *) v->val); + kfree((void *) v->val); } static void meta_var_apply_extras(struct meta_value *v, @@ -821,10 +773,9 @@ static int em_meta_change(struct tcf_proto *tp, void *data, int len, TCF_META_ID(hdr->right.kind) > TCF_META_ID_MAX) goto errout; - meta = kmalloc(sizeof(*meta), GFP_KERNEL); + meta = kzalloc(sizeof(*meta), GFP_KERNEL); if (meta == NULL) goto errout; - memset(meta, 0, sizeof(*meta)); memcpy(&meta->lvalue.hdr, &hdr->left, sizeof(hdr->left)); memcpy(&meta->rvalue.hdr, &hdr->right, sizeof(hdr->right)); diff --git a/net/sched/em_nbyte.c b/net/sched/em_nbyte.c index 71ea926a9..cc80babfd 100644 --- a/net/sched/em_nbyte.c +++ b/net/sched/em_nbyte.c @@ -9,7 +9,6 @@ * Authors: Thomas Graf */ -#include #include #include #include diff --git a/net/sched/em_text.c b/net/sched/em_text.c index 77beabc91..aa17d8f7c 100644 --- a/net/sched/em_text.c +++ b/net/sched/em_text.c @@ -9,7 +9,6 @@ * Authors: Thomas Graf */ -#include #include #include #include diff --git a/net/sched/em_u32.c b/net/sched/em_u32.c index 34e7e51e6..e3ddfce0a 100644 --- a/net/sched/em_u32.c +++ b/net/sched/em_u32.c @@ -12,7 +12,6 @@ * Based on net/sched/cls_u32.c */ -#include #include #include #include diff --git a/net/sched/ematch.c b/net/sched/ematch.c index ebfe2e7d2..0fd0768a1 100644 --- a/net/sched/ematch.c +++ b/net/sched/ematch.c @@ -81,7 +81,6 @@ * open up a beer to watch the compilation going. */ -#include #include #include #include @@ -92,7 +91,6 @@ #include #include #include -#include static LIST_HEAD(ematch_ops); static DEFINE_RWLOCK(ematch_mod_lock); @@ -298,6 +296,11 @@ int tcf_em_tree_validate(struct tcf_proto *tp, struct rtattr *rta, struct tcf_ematch_tree_hdr *tree_hdr; struct tcf_ematch *em; + if (!rta) { + memset(tree, 0, sizeof(*tree)); + return 0; + } + if (rtattr_parse_nested(tb, TCA_EMATCH_TREE_MAX, rta) < 0) goto errout; @@ -318,10 +321,9 @@ int tcf_em_tree_validate(struct tcf_proto *tp, struct rtattr *rta, list_len = RTA_PAYLOAD(rt_list); matches_len = tree_hdr->nmatches * sizeof(*em); - tree->matches = kmalloc(matches_len, GFP_KERNEL); + tree->matches = kzalloc(matches_len, GFP_KERNEL); if (tree->matches == NULL) goto errout; - memset(tree->matches, 0, matches_len); /* We do not use rtattr_parse_nested here because the maximum * number of attributes is unknown. This saves us the allocation diff --git a/net/sched/estimator.c b/net/sched/estimator.c index 5d3ae03e2..0ebc98e9b 100644 --- a/net/sched/estimator.c +++ b/net/sched/estimator.c @@ -139,11 +139,10 @@ int qdisc_new_estimator(struct tc_stats *stats, spinlock_t *stats_lock, struct r if (parm->interval < -2 || parm->interval > 3) return -EINVAL; - est = kmalloc(sizeof(*est), GFP_KERNEL); + est = kzalloc(sizeof(*est), GFP_KERNEL); if (est == NULL) return -ENOBUFS; - memset(est, 0, sizeof(*est)); est->interval = parm->interval + 2; est->stats = stats; est->stats_lock = stats_lock; diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index 31570b9a6..0b6489291 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c @@ -15,7 +15,6 @@ * Jamal Hadi Salim : 990601: ingress support */ -#include #include #include #include @@ -196,14 +195,14 @@ struct Qdisc *qdisc_lookup(struct net_device *dev, u32 handle) { struct Qdisc *q; - read_lock_bh(&qdisc_tree_lock); + read_lock(&qdisc_tree_lock); list_for_each_entry(q, &dev->qdisc_list, list) { if (q->handle == handle) { - read_unlock_bh(&qdisc_tree_lock); + read_unlock(&qdisc_tree_lock); return q; } } - read_unlock_bh(&qdisc_tree_lock); + read_unlock(&qdisc_tree_lock); return NULL; } @@ -431,7 +430,7 @@ qdisc_create(struct net_device *dev, u32 handle, struct rtattr **tca, int *errp) } #endif - err = -EINVAL; + err = -ENOENT; if (ops == NULL) goto err_out; @@ -838,7 +837,7 @@ static int tc_dump_qdisc(struct sk_buff *skb, struct netlink_callback *cb) continue; if (idx > s_idx) s_q_idx = 0; - read_lock_bh(&qdisc_tree_lock); + read_lock(&qdisc_tree_lock); q_idx = 0; list_for_each_entry(q, &dev->qdisc_list, list) { if (q_idx < s_q_idx) { @@ -847,12 +846,12 @@ static int tc_dump_qdisc(struct sk_buff *skb, struct netlink_callback *cb) } if (tc_fill_qdisc(skb, q, q->parent, NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_seq, NLM_F_MULTI, RTM_NEWQDISC) <= 0) { - read_unlock_bh(&qdisc_tree_lock); + read_unlock(&qdisc_tree_lock); goto done; } q_idx++; } - read_unlock_bh(&qdisc_tree_lock); + read_unlock(&qdisc_tree_lock); } done: @@ -1075,7 +1074,7 @@ static int tc_dump_tclass(struct sk_buff *skb, struct netlink_callback *cb) s_t = cb->args[0]; t = 0; - read_lock_bh(&qdisc_tree_lock); + read_lock(&qdisc_tree_lock); list_for_each_entry(q, &dev->qdisc_list, list) { if (t < s_t || !q->ops->cl_ops || (tcm->tcm_parent && @@ -1097,7 +1096,7 @@ static int tc_dump_tclass(struct sk_buff *skb, struct netlink_callback *cb) break; t++; } - read_unlock_bh(&qdisc_tree_lock); + read_unlock(&qdisc_tree_lock); cb->args[0] = t; diff --git a/net/sched/sch_atm.c b/net/sched/sch_atm.c index ac7cb60d1..dbf44da09 100644 --- a/net/sched/sch_atm.c +++ b/net/sched/sch_atm.c @@ -3,7 +3,6 @@ /* Written 1998-2000 by Werner Almesberger, EPFL ICA */ -#include #include #include #include diff --git a/net/sched/sch_blackhole.c b/net/sched/sch_blackhole.c index 81f0b8346..cb0c456aa 100644 --- a/net/sched/sch_blackhole.c +++ b/net/sched/sch_blackhole.c @@ -11,7 +11,6 @@ * Note: Quantum tunneling is not supported. */ -#include #include #include #include diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c index 6cd81708b..bac881bfe 100644 --- a/net/sched/sch_cbq.c +++ b/net/sched/sch_cbq.c @@ -10,7 +10,6 @@ * */ -#include #include #include #include @@ -1927,10 +1926,9 @@ cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct rtattr **t } err = -ENOBUFS; - cl = kmalloc(sizeof(*cl), GFP_KERNEL); + cl = kzalloc(sizeof(*cl), GFP_KERNEL); if (cl == NULL) goto failure; - memset(cl, 0, sizeof(*cl)); cl->R_tab = rtab; rtab = NULL; cl->refcnt = 1; diff --git a/net/sched/sch_dsmark.c b/net/sched/sch_dsmark.c index f6320ca70..11c8a2119 100644 --- a/net/sched/sch_dsmark.c +++ b/net/sched/sch_dsmark.c @@ -3,7 +3,6 @@ /* Written 1998-2000 by Werner Almesberger, EPFL ICA */ -#include #include #include #include diff --git a/net/sched/sch_fifo.c b/net/sched/sch_fifo.c index 033083bf0..c2689f4ba 100644 --- a/net/sched/sch_fifo.c +++ b/net/sched/sch_fifo.c @@ -9,7 +9,6 @@ * Authors: Alexey Kuznetsov, */ -#include #include #include #include diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index 74d4a1dce..88c6a99ce 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include @@ -46,11 +45,10 @@ The idea is the following: - enqueue, dequeue are serialized via top level device spinlock dev->queue_lock. - - tree walking is protected by read_lock_bh(qdisc_tree_lock) + - tree walking is protected by read_lock(qdisc_tree_lock) and this lock is used only in process context. - - updates to tree are made under rtnl semaphore or - from softirq context (__qdisc_destroy rcu-callback) - hence this lock needs local bh disabling. + - updates to tree are made only under rtnl semaphore, + hence this lock may be made without local bh disabling. qdisc_tree_lock must be grabbed BEFORE dev->queue_lock! */ @@ -58,14 +56,14 @@ DEFINE_RWLOCK(qdisc_tree_lock); void qdisc_lock_tree(struct net_device *dev) { - write_lock_bh(&qdisc_tree_lock); + write_lock(&qdisc_tree_lock); spin_lock_bh(&dev->queue_lock); } void qdisc_unlock_tree(struct net_device *dev) { spin_unlock_bh(&dev->queue_lock); - write_unlock_bh(&qdisc_tree_lock); + write_unlock(&qdisc_tree_lock); } /* @@ -239,9 +237,7 @@ void __netdev_watchdog_up(struct net_device *dev) static void dev_watchdog_up(struct net_device *dev) { - netif_tx_lock_bh(dev); __netdev_watchdog_up(dev); - netif_tx_unlock_bh(dev); } static void dev_watchdog_down(struct net_device *dev) @@ -433,10 +429,9 @@ struct Qdisc *qdisc_alloc(struct net_device *dev, struct Qdisc_ops *ops) size = QDISC_ALIGN(sizeof(*sch)); size += ops->priv_size + (QDISC_ALIGNTO - 1); - p = kmalloc(size, GFP_KERNEL); + p = kzalloc(size, GFP_KERNEL); if (!p) goto errout; - memset(p, 0, size); sch = (struct Qdisc *) QDISC_ALIGN((unsigned long) p); sch->padded = (char *) sch - (char *) p; @@ -487,20 +482,6 @@ void qdisc_reset(struct Qdisc *qdisc) static void __qdisc_destroy(struct rcu_head *head) { struct Qdisc *qdisc = container_of(head, struct Qdisc, q_rcu); - struct Qdisc_ops *ops = qdisc->ops; - -#ifdef CONFIG_NET_ESTIMATOR - gen_kill_estimator(&qdisc->bstats, &qdisc->rate_est); -#endif - write_lock(&qdisc_tree_lock); - if (ops->reset) - ops->reset(qdisc); - if (ops->destroy) - ops->destroy(qdisc); - write_unlock(&qdisc_tree_lock); - module_put(ops->owner); - - dev_put(qdisc->dev); kfree((char *) qdisc - qdisc->padded); } @@ -508,32 +489,23 @@ static void __qdisc_destroy(struct rcu_head *head) void qdisc_destroy(struct Qdisc *qdisc) { - struct list_head cql = LIST_HEAD_INIT(cql); - struct Qdisc *cq, *q, *n; + struct Qdisc_ops *ops = qdisc->ops; if (qdisc->flags & TCQ_F_BUILTIN || - !atomic_dec_and_test(&qdisc->refcnt)) + !atomic_dec_and_test(&qdisc->refcnt)) return; - if (!list_empty(&qdisc->list)) { - if (qdisc->ops->cl_ops == NULL) - list_del(&qdisc->list); - else - list_move(&qdisc->list, &cql); - } - - /* unlink inner qdiscs from dev->qdisc_list immediately */ - list_for_each_entry(cq, &cql, list) - list_for_each_entry_safe(q, n, &qdisc->dev->qdisc_list, list) - if (TC_H_MAJ(q->parent) == TC_H_MAJ(cq->handle)) { - if (q->ops->cl_ops == NULL) - list_del_init(&q->list); - else - list_move_tail(&q->list, &cql); - } - list_for_each_entry_safe(cq, n, &cql, list) - list_del_init(&cq->list); + list_del(&qdisc->list); +#ifdef CONFIG_NET_ESTIMATOR + gen_kill_estimator(&qdisc->bstats, &qdisc->rate_est); +#endif + if (ops->reset) + ops->reset(qdisc); + if (ops->destroy) + ops->destroy(qdisc); + module_put(ops->owner); + dev_put(qdisc->dev); call_rcu(&qdisc->q_rcu, __qdisc_destroy); } @@ -553,15 +525,15 @@ void dev_activate(struct net_device *dev) printk(KERN_INFO "%s: activation failed\n", dev->name); return; } - write_lock_bh(&qdisc_tree_lock); + write_lock(&qdisc_tree_lock); list_add_tail(&qdisc->list, &dev->qdisc_list); - write_unlock_bh(&qdisc_tree_lock); + write_unlock(&qdisc_tree_lock); } else { qdisc = &noqueue_qdisc; } - write_lock_bh(&qdisc_tree_lock); + write_lock(&qdisc_tree_lock); dev->qdisc_sleeping = qdisc; - write_unlock_bh(&qdisc_tree_lock); + write_unlock(&qdisc_tree_lock); } if (!netif_carrier_ok(dev)) diff --git a/net/sched/sch_gred.c b/net/sched/sch_gred.c index 29a2dd9f3..18e81a8ff 100644 --- a/net/sched/sch_gred.c +++ b/net/sched/sch_gred.c @@ -18,7 +18,6 @@ * For all the glorious comments look at include/net/red.h */ -#include #include #include #include @@ -407,10 +406,9 @@ static inline int gred_change_vq(struct Qdisc *sch, int dp, struct gred_sched_data *q; if (table->tab[dp] == NULL) { - table->tab[dp] = kmalloc(sizeof(*q), GFP_KERNEL); + table->tab[dp] = kzalloc(sizeof(*q), GFP_KERNEL); if (table->tab[dp] == NULL) return -ENOMEM; - memset(table->tab[dp], 0, sizeof(*q)); } q = table->tab[dp]; diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c index f1c7bd29f..6a6735a2e 100644 --- a/net/sched/sch_hfsc.c +++ b/net/sched/sch_hfsc.c @@ -50,7 +50,6 @@ */ #include -#include #include #include #include @@ -1124,10 +1123,9 @@ hfsc_change_class(struct Qdisc *sch, u32 classid, u32 parentid, if (rsc == NULL && fsc == NULL) return -EINVAL; - cl = kmalloc(sizeof(struct hfsc_class), GFP_KERNEL); + cl = kzalloc(sizeof(struct hfsc_class), GFP_KERNEL); if (cl == NULL) return -ENOBUFS; - memset(cl, 0, sizeof(struct hfsc_class)); if (rsc != NULL) hfsc_change_rsc(cl, rsc, 0); diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index 3ec95df4a..880a3394a 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c @@ -27,7 +27,6 @@ * * $Id: sch_htb.c,v 1.25 2003/12/07 11:08:25 devik Exp devik $ */ -#include #include #include #include @@ -197,7 +196,7 @@ struct htb_class struct qdisc_rate_table *rate; /* rate table of the class itself */ struct qdisc_rate_table *ceil; /* ceiling rate (limits borrows too) */ long buffer,cbuffer; /* token bucket depth/rate */ - long mbuffer; /* max wait time */ + psched_tdiff_t mbuffer; /* max wait time */ long tokens,ctokens; /* current number of tokens */ psched_time_t t_c; /* checkpoint time */ }; @@ -1560,10 +1559,9 @@ static int htb_change_class(struct Qdisc *sch, u32 classid, goto failure; } err = -ENOBUFS; - if ((cl = kmalloc(sizeof(*cl), GFP_KERNEL)) == NULL) + if ((cl = kzalloc(sizeof(*cl), GFP_KERNEL)) == NULL) goto failure; - memset(cl, 0, sizeof(*cl)); cl->refcnt = 1; INIT_LIST_HEAD(&cl->sibling); INIT_LIST_HEAD(&cl->hlist); @@ -1602,7 +1600,7 @@ static int htb_change_class(struct Qdisc *sch, u32 classid, /* set class to be in HTB_CAN_SEND state */ cl->tokens = hopt->buffer; cl->ctokens = hopt->cbuffer; - cl->mbuffer = 60000000; /* 1min */ + cl->mbuffer = PSCHED_JIFFIE2US(HZ*60); /* 1min */ PSCHED_GET_TIME(cl->t_c); cl->cmode = HTB_CAN_SEND; diff --git a/net/sched/sch_ingress.c b/net/sched/sch_ingress.c index 8edc32a6a..c3242f727 100644 --- a/net/sched/sch_ingress.c +++ b/net/sched/sch_ingress.c @@ -7,7 +7,6 @@ * Authors: Jamal Hadi Salim 1999 */ -#include #include #include #include diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c index bb9bf8d50..a08ec4c7c 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c @@ -13,7 +13,6 @@ * Catalin(ux aka Dino) BOIE */ -#include #include #include #include @@ -25,6 +24,8 @@ #include +#define VERSION "1.2" + /* Network Emulation Queuing algorithm. ==================================== @@ -63,11 +64,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; @@ -146,7 +148,8 @@ static long tabledist(unsigned long mu, long sigma, static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) { struct netem_sched_data *q = qdisc_priv(sch); - struct netem_skb_cb *cb = (struct netem_skb_cb *)skb->cb; + /* We don't fill cb now as skb_unshare() may invalidate it */ + struct netem_skb_cb *cb; struct sk_buff *skb2; int ret; int count = 1; @@ -164,7 +167,7 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) if (count == 0) { sch->qstats.drops++; kfree_skb(skb); - return NET_XMIT_DROP; + return NET_XMIT_BYPASS; } /* @@ -181,14 +184,35 @@ 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); + } + + cb = (struct netem_skb_cb *)skb->cb; if (q->gap == 0 /* not doing reordering */ || q->counter < q->gap /* inside last reordering gap */ || q->reorder < get_crandom(&q->reorder_cor)) { psched_time_t now; + psched_tdiff_t delay; + + delay = tabledist(q->latency, q->jitter, + &q->delay_cor, q->delay_dist); + PSCHED_GET_TIME(now); - PSCHED_TADD2(now, tabledist(q->latency, q->jitter, - &q->delay_cor, q->delay_dist), - cb->time_to_send); + PSCHED_TADD2(now, delay, cb->time_to_send); ++q->counter; ret = q->qdisc->enqueue(skb, q->qdisc); } else { @@ -229,9 +253,9 @@ static int netem_requeue(struct sk_buff *skb, struct Qdisc *sch) static unsigned int netem_drop(struct Qdisc* sch) { struct netem_sched_data *q = qdisc_priv(sch); - unsigned int len; + unsigned int len = 0; - if ((len = q->qdisc->ops->drop(q->qdisc)) != 0) { + if (q->qdisc->ops->drop && (len = q->qdisc->ops->drop(q->qdisc)) != 0) { sch->q.qlen--; sch->qstats.drops++; } @@ -248,24 +272,31 @@ static struct sk_buff *netem_dequeue(struct Qdisc *sch) const struct netem_skb_cb *cb = (const struct netem_skb_cb *)skb->cb; psched_time_t now; - long delay; /* if more time remaining? */ PSCHED_GET_TIME(now); - delay = PSCHED_US2JIFFIE(PSCHED_TDIFF(cb->time_to_send, now)); - pr_debug("netem_run: skb=%p delay=%ld\n", skb, delay); - if (delay <= 0) { + + if (PSCHED_TLESS(cb->time_to_send, now)) { pr_debug("netem_dequeue: return skb=%p\n", skb); sch->q.qlen--; sch->flags &= ~TCQ_F_THROTTLED; return skb; - } + } else { + psched_tdiff_t delay = PSCHED_TDIFF(cb->time_to_send, now); - mod_timer(&q->timer, jiffies + delay); - sch->flags |= TCQ_F_THROTTLED; + if (q->qdisc->ops->requeue(skb, q->qdisc) != NET_XMIT_SUCCESS) { + sch->qstats.drops++; - if (q->qdisc->ops->requeue(skb, q->qdisc) != 0) - sch->qstats.drops++; + /* After this qlen is confused */ + printk(KERN_ERR "netem: queue discpline %s could not requeue\n", + q->qdisc->ops->id); + + sch->q.qlen--; + } + + mod_timer(&q->timer, jiffies + PSCHED_US2JIFFIE(delay)); + sch->flags |= TCQ_F_THROTTLED; + } } return NULL; @@ -290,11 +321,16 @@ static void netem_reset(struct Qdisc *sch) del_timer_sync(&q->timer); } +/* Pass size change message down to embedded FIFO */ static int set_fifo_limit(struct Qdisc *q, int limit) { struct rtattr *rta; int ret = -ENOMEM; + /* Hack to avoid sending change message to non-FIFO */ + if (strncmp(q->ops->id + 1, "fifo", 4) != 0) + return 0; + rta = kmalloc(RTA_LENGTH(sizeof(struct tc_fifo_qopt)), GFP_KERNEL); if (rta) { rta->rta_type = RTM_NEWQDISC; @@ -365,6 +401,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); @@ -415,17 +465,101 @@ 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; +} + +/* + * Special case version of FIFO queue for use by netem. + * It queues in order based on timestamps in skb's + */ +struct fifo_sched_data { + u32 limit; +}; + +static int tfifo_enqueue(struct sk_buff *nskb, struct Qdisc *sch) +{ + struct fifo_sched_data *q = qdisc_priv(sch); + struct sk_buff_head *list = &sch->q; + const struct netem_skb_cb *ncb + = (const struct netem_skb_cb *)nskb->cb; + struct sk_buff *skb; + + if (likely(skb_queue_len(list) < q->limit)) { + skb_queue_reverse_walk(list, skb) { + const struct netem_skb_cb *cb + = (const struct netem_skb_cb *)skb->cb; + + if (!PSCHED_TLESS(ncb->time_to_send, cb->time_to_send)) + break; + } + + __skb_queue_after(list, skb, nskb); + + sch->qstats.backlog += nskb->len; + sch->bstats.bytes += nskb->len; + sch->bstats.packets++; + + return NET_XMIT_SUCCESS; + } + + return qdisc_drop(nskb, sch); +} + +static int tfifo_init(struct Qdisc *sch, struct rtattr *opt) +{ + struct fifo_sched_data *q = qdisc_priv(sch); + + if (opt) { + struct tc_fifo_qopt *ctl = RTA_DATA(opt); + if (RTA_PAYLOAD(opt) < sizeof(*ctl)) + return -EINVAL; + + q->limit = ctl->limit; + } else + q->limit = max_t(u32, sch->dev->tx_queue_len, 1); return 0; } +static int tfifo_dump(struct Qdisc *sch, struct sk_buff *skb) +{ + struct fifo_sched_data *q = qdisc_priv(sch); + struct tc_fifo_qopt opt = { .limit = q->limit }; + + RTA_PUT(skb, TCA_OPTIONS, sizeof(opt), &opt); + return skb->len; + +rtattr_failure: + return -1; +} + +static struct Qdisc_ops tfifo_qdisc_ops = { + .id = "tfifo", + .priv_size = sizeof(struct fifo_sched_data), + .enqueue = tfifo_enqueue, + .dequeue = qdisc_dequeue_head, + .requeue = qdisc_requeue, + .drop = qdisc_queue_drop, + .init = tfifo_init, + .reset = qdisc_reset_queue, + .change = tfifo_init, + .dump = tfifo_dump, +}; + static int netem_init(struct Qdisc *sch, struct rtattr *opt) { struct netem_sched_data *q = qdisc_priv(sch); @@ -438,7 +572,7 @@ static int netem_init(struct Qdisc *sch, struct rtattr *opt) q->timer.function = netem_watchdog; q->timer.data = (unsigned long) sch; - q->qdisc = qdisc_create_dflt(sch->dev, &pfifo_qdisc_ops); + q->qdisc = qdisc_create_dflt(sch->dev, &tfifo_qdisc_ops); if (!q->qdisc) { pr_debug("netem: qdisc create failed\n"); return -ENOMEM; @@ -469,6 +603,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; @@ -487,6 +622,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; @@ -601,6 +740,7 @@ static struct Qdisc_ops netem_qdisc_ops = { static int __init netem_module_init(void) { + pr_info("netem: version " VERSION "\n"); return register_qdisc(&netem_qdisc_ops); } static void __exit netem_module_exit(void) diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c index 3395ca7bc..a5fa03c0c 100644 --- a/net/sched/sch_prio.c +++ b/net/sched/sch_prio.c @@ -11,7 +11,6 @@ * Init -- EINVAL when opt undefined */ -#include #include #include #include diff --git a/net/sched/sch_red.c b/net/sched/sch_red.c index 2be563cba..d65caddde 100644 --- a/net/sched/sch_red.c +++ b/net/sched/sch_red.c @@ -14,7 +14,6 @@ * J Hadi Salim 980816: ECN support */ -#include #include #include #include diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c index e057768f6..d0d6e595a 100644 --- a/net/sched/sch_sfq.c +++ b/net/sched/sch_sfq.c @@ -9,7 +9,6 @@ * Authors: Alexey Kuznetsov, */ -#include #include #include #include diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c index d8e03c74c..d9a5d298d 100644 --- a/net/sched/sch_tbf.c +++ b/net/sched/sch_tbf.c @@ -12,7 +12,6 @@ * */ -#include #include #include #include diff --git a/net/sctp/associola.c b/net/sctp/associola.c index 9d05e13e9..27329ce9c 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c @@ -441,7 +441,8 @@ void sctp_assoc_set_primary(struct sctp_association *asoc, /* If the primary path is changing, assume that the * user wants to use this new path. */ - if (transport->state != SCTP_INACTIVE) + if ((transport->state == SCTP_ACTIVE) || + (transport->state == SCTP_UNKNOWN)) asoc->peer.active_path = transport; /* @@ -532,11 +533,11 @@ struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc, port = addr->v4.sin_port; SCTP_DEBUG_PRINTK_IPADDR("sctp_assoc_add_peer:association %p addr: ", - " port: %d state:%s\n", + " port: %d state:%d\n", asoc, addr, addr->v4.sin_port, - peer_state == SCTP_UNKNOWN?"UNKNOWN":"ACTIVE"); + peer_state); /* Set the port if it has not been set yet. */ if (0 == asoc->peer.port) @@ -545,9 +546,12 @@ struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc, /* Check to see if this is a duplicate. */ peer = sctp_assoc_lookup_paddr(asoc, addr); if (peer) { - if (peer_state == SCTP_ACTIVE && - peer->state == SCTP_UNKNOWN) - peer->state = SCTP_ACTIVE; + if (peer->state == SCTP_UNKNOWN) { + if (peer_state == SCTP_ACTIVE) + peer->state = SCTP_ACTIVE; + if (peer_state == SCTP_UNCONFIRMED) + peer->state = SCTP_UNCONFIRMED; + } return peer; } @@ -739,7 +743,8 @@ void sctp_assoc_control_transport(struct sctp_association *asoc, list_for_each(pos, &asoc->peer.transport_addr_list) { t = list_entry(pos, struct sctp_transport, transports); - if (t->state == SCTP_INACTIVE) + if ((t->state == SCTP_INACTIVE) || + (t->state == SCTP_UNCONFIRMED)) continue; if (!first || t->last_time_heard > first->last_time_heard) { second = first; @@ -759,7 +764,8 @@ void sctp_assoc_control_transport(struct sctp_association *asoc, * [If the primary is active but not most recent, bump the most * recently used transport.] */ - if (asoc->peer.primary_path->state != SCTP_INACTIVE && + if (((asoc->peer.primary_path->state == SCTP_ACTIVE) || + (asoc->peer.primary_path->state == SCTP_UNKNOWN)) && first != asoc->peer.primary_path) { second = first; first = asoc->peer.primary_path; @@ -1054,7 +1060,7 @@ void sctp_assoc_update(struct sctp_association *asoc, transports); if (!sctp_assoc_lookup_paddr(asoc, &trans->ipaddr)) sctp_assoc_add_peer(asoc, &trans->ipaddr, - GFP_ATOMIC, SCTP_ACTIVE); + GFP_ATOMIC, trans->state); } asoc->ctsn_ack_point = asoc->next_tsn - 1; @@ -1094,7 +1100,8 @@ void sctp_assoc_update_retran_path(struct sctp_association *asoc) /* Try to find an active transport. */ - if (t->state != SCTP_INACTIVE) { + if ((t->state == SCTP_ACTIVE) || + (t->state == SCTP_UNKNOWN)) { break; } else { /* Keep track of the next transport in case diff --git a/net/sctp/bind_addr.c b/net/sctp/bind_addr.c index 2b962627f..2b9c12a17 100644 --- a/net/sctp/bind_addr.c +++ b/net/sctp/bind_addr.c @@ -146,7 +146,7 @@ void sctp_bind_addr_free(struct sctp_bind_addr *bp) /* Add an address to the bind address list in the SCTP_bind_addr structure. */ int sctp_add_bind_addr(struct sctp_bind_addr *bp, union sctp_addr *new, - gfp_t gfp) + __u8 use_as_src, gfp_t gfp) { struct sctp_sockaddr_entry *addr; @@ -163,6 +163,8 @@ int sctp_add_bind_addr(struct sctp_bind_addr *bp, union sctp_addr *new, if (!addr->a.v4.sin_port) addr->a.v4.sin_port = bp->port; + addr->use_as_src = use_as_src; + INIT_LIST_HEAD(&addr->list); list_add_tail(&addr->list, &bp->address_list); SCTP_DBG_OBJCNT_INC(addr); @@ -274,7 +276,7 @@ int sctp_raw_to_bind_addrs(struct sctp_bind_addr *bp, __u8 *raw_addr_list, } af->from_addr_param(&addr, rawaddr, port, 0); - retval = sctp_add_bind_addr(bp, &addr, gfp); + retval = sctp_add_bind_addr(bp, &addr, 1, gfp); if (retval) { /* Can't finish building the list, clean up. */ sctp_bind_addr_clean(bp); @@ -367,7 +369,7 @@ static int sctp_copy_one_addr(struct sctp_bind_addr *dest, (((AF_INET6 == addr->sa.sa_family) && (flags & SCTP_ADDR6_ALLOWED) && (flags & SCTP_ADDR6_PEERSUPP)))) - error = sctp_add_bind_addr(dest, addr, gfp); + error = sctp_add_bind_addr(dest, addr, 1, gfp); } return error; diff --git a/net/sctp/endpointola.c b/net/sctp/endpointola.c index 67bd53070..ffda1d680 100644 --- a/net/sctp/endpointola.c +++ b/net/sctp/endpointola.c @@ -158,6 +158,12 @@ void sctp_endpoint_add_asoc(struct sctp_endpoint *ep, void sctp_endpoint_free(struct sctp_endpoint *ep) { ep->base.dead = 1; + + ep->base.sk->sk_state = SCTP_SS_CLOSED; + + /* Unlink this endpoint, so we can't find it again! */ + sctp_unhash_endpoint(ep); + sctp_endpoint_put(ep); } @@ -166,11 +172,6 @@ static void sctp_endpoint_destroy(struct sctp_endpoint *ep) { SCTP_ASSERT(ep->base.dead, "Endpoint is not dead", return); - ep->base.sk->sk_state = SCTP_SS_CLOSED; - - /* Unlink this endpoint, so we can't find it again! */ - sctp_unhash_endpoint(ep); - /* Free up the HMAC transform. */ sctp_crypto_free_tfm(sctp_sk(ep->base.sk)->hmac); diff --git a/net/sctp/input.c b/net/sctp/input.c index 70d6606e2..2060bbeb3 100644 --- a/net/sctp/input.c +++ b/net/sctp/input.c @@ -135,13 +135,17 @@ int sctp_rcv(struct sk_buff *skb) SCTP_INC_STATS_BH(SCTP_MIB_INSCTPPACKS); + if (skb_linearize(skb)) + goto discard_it; + sh = (struct sctphdr *) skb->h.raw; /* Pull up the IP and SCTP headers. */ __skb_pull(skb, skb->h.raw - skb->data); if (skb->len < sizeof(struct sctphdr)) goto discard_it; - if (sctp_rcv_checksum(skb) < 0) + if ((skb->ip_summed != CHECKSUM_UNNECESSARY) && + (sctp_rcv_checksum(skb) < 0)) goto discard_it; skb_pull(skb, sizeof(struct sctphdr)); diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c index 8ef08070c..99c0cefc0 100644 --- a/net/sctp/ipv6.c +++ b/net/sctp/ipv6.c @@ -290,7 +290,8 @@ static void sctp_v6_get_saddr(struct sctp_association *asoc, sctp_read_lock(addr_lock); list_for_each(pos, &bp->address_list) { laddr = list_entry(pos, struct sctp_sockaddr_entry, list); - if ((laddr->a.sa.sa_family == AF_INET6) && + if ((laddr->use_as_src) && + (laddr->a.sa.sa_family == AF_INET6) && (scope <= sctp_scope(&laddr->a))) { bmatchlen = sctp_v6_addr_match_len(daddr, &laddr->a); if (!baddr || (matchlen < bmatchlen)) { diff --git a/net/sctp/output.c b/net/sctp/output.c index 437cba726..cdc5a3936 100644 --- a/net/sctp/output.c +++ b/net/sctp/output.c @@ -295,14 +295,14 @@ int sctp_packet_transmit(struct sctp_packet *packet) struct sctp_transport *tp = packet->transport; struct sctp_association *asoc = tp->asoc; struct sctphdr *sh; - __u32 crc32; + __u32 crc32 = 0; struct sk_buff *nskb; struct sctp_chunk *chunk, *tmp; struct sock *sk; int err = 0; int padding; /* How much padding do we need? */ __u8 has_data = 0; - struct dst_entry *dst; + struct dst_entry *dst = tp->dst; SCTP_DEBUG_PRINTK("%s: packet:%p\n", __FUNCTION__, packet); @@ -327,6 +327,19 @@ int sctp_packet_transmit(struct sctp_packet *packet) */ skb_set_owner_w(nskb, sk); + /* The 'obsolete' field of dst is set to 2 when a dst is freed. */ + if (!dst || (dst->obsolete > 1)) { + dst_release(dst); + sctp_transport_route(tp, NULL, sctp_sk(sk)); + if (asoc && (asoc->param_flags & SPP_PMTUD_ENABLE)) { + sctp_assoc_sync_pmtu(asoc); + } + } + nskb->dst = dst_clone(tp->dst); + if (!nskb->dst) + goto no_route; + dst = nskb->dst; + /* Build the SCTP header. */ sh = (struct sctphdr *)skb_push(nskb, sizeof(struct sctphdr)); sh->source = htons(packet->source_port); @@ -350,7 +363,8 @@ int sctp_packet_transmit(struct sctp_packet *packet) * Note: Adler-32 is no longer applicable, as has been replaced * by CRC32-C as described in . */ - crc32 = sctp_start_cksum((__u8 *)sh, sizeof(struct sctphdr)); + if (!(dst->dev->features & NETIF_F_NO_CSUM)) + crc32 = sctp_start_cksum((__u8 *)sh, sizeof(struct sctphdr)); /** * 6.10 Bundling @@ -402,9 +416,14 @@ int sctp_packet_transmit(struct sctp_packet *packet) if (padding) memset(skb_put(chunk->skb, padding), 0, padding); - crc32 = sctp_update_copy_cksum(skb_put(nskb, chunk->skb->len), - chunk->skb->data, - chunk->skb->len, crc32); + if (dst->dev->features & NETIF_F_NO_CSUM) + memcpy(skb_put(nskb, chunk->skb->len), + chunk->skb->data, chunk->skb->len); + else + crc32 = sctp_update_copy_cksum(skb_put(nskb, + chunk->skb->len), + chunk->skb->data, + chunk->skb->len, crc32); SCTP_DEBUG_PRINTK("%s %p[%s] %s 0x%x, %s %d, %s %d, %s %d\n", "*** Chunk", chunk, @@ -427,7 +446,8 @@ int sctp_packet_transmit(struct sctp_packet *packet) } /* Perform final transformation on checksum. */ - crc32 = sctp_end_cksum(crc32); + if (!(dst->dev->features & NETIF_F_NO_CSUM)) + crc32 = sctp_end_cksum(crc32); /* 3) Put the resultant value into the checksum field in the * common header, and leave the rest of the bits unchanged. @@ -477,20 +497,6 @@ int sctp_packet_transmit(struct sctp_packet *packet) } } - dst = tp->dst; - /* The 'obsolete' field of dst is set to 2 when a dst is freed. */ - if (!dst || (dst->obsolete > 1)) { - dst_release(dst); - sctp_transport_route(tp, NULL, sctp_sk(sk)); - if (asoc->param_flags & SPP_PMTUD_ENABLE) { - sctp_assoc_sync_pmtu(asoc); - } - } - - nskb->dst = dst_clone(tp->dst); - if (!nskb->dst) - goto no_route; - SCTP_DEBUG_PRINTK("***sctp_transmit_packet*** skb len %d\n", nskb->len); diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c index e5faa351a..30b710c54 100644 --- a/net/sctp/outqueue.c +++ b/net/sctp/outqueue.c @@ -691,7 +691,8 @@ int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout) if (!new_transport) { new_transport = asoc->peer.active_path; - } else if (new_transport->state == SCTP_INACTIVE) { + } else if ((new_transport->state == SCTP_INACTIVE) || + (new_transport->state == SCTP_UNCONFIRMED)) { /* If the chunk is Heartbeat or Heartbeat Ack, * send it to chunk->transport, even if it's * inactive. @@ -848,7 +849,8 @@ int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout) */ new_transport = chunk->transport; if (!new_transport || - new_transport->state == SCTP_INACTIVE) + ((new_transport->state == SCTP_INACTIVE) || + (new_transport->state == SCTP_UNCONFIRMED))) new_transport = asoc->peer.active_path; /* Change packets if necessary. */ @@ -1464,7 +1466,8 @@ static void sctp_check_transmitted(struct sctp_outq *q, /* Mark the destination transport address as * active if it is not so marked. */ - if (transport->state == SCTP_INACTIVE) { + if ((transport->state == SCTP_INACTIVE) || + (transport->state == SCTP_UNCONFIRMED)) { sctp_assoc_control_transport( transport->asoc, transport, diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index 816c033d7..1ab03a27a 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c @@ -240,7 +240,7 @@ int sctp_copy_local_addr_list(struct sctp_bind_addr *bp, sctp_scope_t scope, (((AF_INET6 == addr->a.sa.sa_family) && (copy_flags & SCTP_ADDR6_ALLOWED) && (copy_flags & SCTP_ADDR6_PEERSUPP)))) { - error = sctp_add_bind_addr(bp, &addr->a, + error = sctp_add_bind_addr(bp, &addr->a, 1, GFP_ATOMIC); if (error) goto end_copy; @@ -486,6 +486,8 @@ static struct dst_entry *sctp_v4_get_dst(struct sctp_association *asoc, list_for_each(pos, &bp->address_list) { laddr = list_entry(pos, struct sctp_sockaddr_entry, list); + if (!laddr->use_as_src) + continue; sctp_v4_dst_saddr(&dst_saddr, dst, bp->port); if (sctp_v4_cmp_addr(&dst_saddr, &laddr->a)) goto out_unlock; @@ -506,7 +508,8 @@ static struct dst_entry *sctp_v4_get_dst(struct sctp_association *asoc, list_for_each(pos, &bp->address_list) { laddr = list_entry(pos, struct sctp_sockaddr_entry, list); - if (AF_INET == laddr->a.sa.sa_family) { + if ((laddr->use_as_src) && + (AF_INET == laddr->a.sa.sa_family)) { fl.fl4_src = laddr->a.v4.sin_addr.s_addr; if (!ip_route_output_key(&rt, &fl)) { dst = &rt->u.dst; diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c index b9b907023..17b509282 100644 --- a/net/sctp/sm_make_chunk.c +++ b/net/sctp/sm_make_chunk.c @@ -1390,14 +1390,14 @@ struct sctp_association *sctp_unpack_cookie( sg.length = bodysize; key = (char *)ep->secret_key[ep->current_key]; - memset(digest, 0x00, sizeof(digest)); + memset(digest, 0x00, SCTP_SIGNATURE_SIZE); sctp_crypto_hmac(sctp_sk(ep->base.sk)->hmac, key, &keylen, &sg, 1, digest); if (memcmp(digest, cookie->signature, SCTP_SIGNATURE_SIZE)) { /* Try the previous key. */ key = (char *)ep->secret_key[ep->last_key]; - memset(digest, 0x00, sizeof(digest)); + memset(digest, 0x00, SCTP_SIGNATURE_SIZE); sctp_crypto_hmac(sctp_sk(ep->base.sk)->hmac, key, &keylen, &sg, 1, digest); @@ -1481,7 +1481,7 @@ no_hmac: /* Also, add the destination address. */ if (list_empty(&retval->base.bind_addr.address_list)) { - sctp_add_bind_addr(&retval->base.bind_addr, &chunk->dest, + sctp_add_bind_addr(&retval->base.bind_addr, &chunk->dest, 1, GFP_ATOMIC); } @@ -2005,7 +2005,7 @@ static int sctp_process_param(struct sctp_association *asoc, af->from_addr_param(&addr, param.addr, asoc->peer.port, 0); scope = sctp_scope(peer_addr); if (sctp_in_scope(&addr, scope)) - if (!sctp_assoc_add_peer(asoc, &addr, gfp, SCTP_ACTIVE)) + if (!sctp_assoc_add_peer(asoc, &addr, gfp, SCTP_UNCONFIRMED)) return 0; break; @@ -2406,7 +2406,7 @@ static __u16 sctp_process_asconf_param(struct sctp_association *asoc, * Due to Resource Shortage'. */ - peer = sctp_assoc_add_peer(asoc, &addr, GFP_ATOMIC, SCTP_ACTIVE); + peer = sctp_assoc_add_peer(asoc, &addr, GFP_ATOMIC, SCTP_UNCONFIRMED); if (!peer) return SCTP_ERROR_RSRC_LOW; @@ -2553,6 +2553,7 @@ static int sctp_asconf_param_success(struct sctp_association *asoc, union sctp_addr_param *addr_param; struct list_head *pos; struct sctp_transport *transport; + struct sctp_sockaddr_entry *saddr; int retval = 0; addr_param = (union sctp_addr_param *) @@ -2566,7 +2567,11 @@ static int sctp_asconf_param_success(struct sctp_association *asoc, case SCTP_PARAM_ADD_IP: sctp_local_bh_disable(); sctp_write_lock(&asoc->base.addr_lock); - retval = sctp_add_bind_addr(bp, &addr, GFP_ATOMIC); + list_for_each(pos, &bp->address_list) { + saddr = list_entry(pos, struct sctp_sockaddr_entry, list); + if (sctp_cmp_addr_exact(&saddr->a, &addr)) + saddr->use_as_src = 1; + } sctp_write_unlock(&asoc->base.addr_lock); sctp_local_bh_enable(); break; @@ -2579,6 +2584,7 @@ static int sctp_asconf_param_success(struct sctp_association *asoc, list_for_each(pos, &asoc->peer.transport_addr_list) { transport = list_entry(pos, struct sctp_transport, transports); + dst_release(transport->dst); sctp_transport_route(transport, NULL, sctp_sk(asoc->base.sk)); } diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c index c5beb2ad7..9c10bdec1 100644 --- a/net/sctp/sm_sideeffect.c +++ b/net/sctp/sm_sideeffect.c @@ -430,7 +430,11 @@ static void sctp_do_8_2_transport_strike(struct sctp_association *asoc, /* The check for association's overall error counter exceeding the * threshold is done in the state function. */ - asoc->overall_error_count++; + /* When probing UNCONFIRMED addresses, the association overall + * error count is NOT incremented + */ + if (transport->state != SCTP_UNCONFIRMED) + asoc->overall_error_count++; if (transport->state != SCTP_INACTIVE && (transport->error_count++ >= transport->pathmaxrxt)) { @@ -610,7 +614,7 @@ static void sctp_cmd_transport_on(sctp_cmd_seq_t *cmds, /* Mark the destination transport address as active if it is not so * marked. */ - if (t->state == SCTP_INACTIVE) + if ((t->state == SCTP_INACTIVE) || (t->state == SCTP_UNCONFIRMED)) sctp_assoc_control_transport(asoc, t, SCTP_TRANSPORT_UP, SCTP_HEARTBEAT_SUCCESS); @@ -620,6 +624,10 @@ static void sctp_cmd_transport_on(sctp_cmd_seq_t *cmds, */ hbinfo = (sctp_sender_hb_info_t *) chunk->skb->data; sctp_transport_update_rto(t, (jiffies - hbinfo->sent_at)); + + /* Update the heartbeat timer. */ + if (!mod_timer(&t->hb_timer, sctp_transport_timeout(t))) + sctp_transport_hold(t); } /* Helper function to do a transport reset at the expiry of the hearbeat diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c index 66e9c5b27..5b5ae7958 100644 --- a/net/sctp/sm_statefuns.c +++ b/net/sctp/sm_statefuns.c @@ -846,6 +846,7 @@ static sctp_disposition_t sctp_sf_heartbeat(const struct sctp_endpoint *ep, hbinfo.param_hdr.length = htons(sizeof(sctp_sender_hb_info_t)); hbinfo.daddr = transport->ipaddr; hbinfo.sent_at = jiffies; + hbinfo.hb_nonce = transport->hb_nonce; /* Send a heartbeat to our peer. */ paylen = sizeof(sctp_sender_hb_info_t); @@ -1048,6 +1049,10 @@ sctp_disposition_t sctp_sf_backbeat_8_3(const struct sctp_endpoint *ep, return SCTP_DISPOSITION_DISCARD; } + /* Validate the 64-bit random nonce. */ + if (hbinfo->hb_nonce != link->hb_nonce) + return SCTP_DISPOSITION_DISCARD; + max_interval = link->hbinterval + link->rto; /* Check if the timestamp looks valid. */ @@ -5266,7 +5271,6 @@ static int sctp_eat_data(const struct sctp_association *asoc, datalen -= sizeof(sctp_data_chunk_t); deliver = SCTP_CMD_CHUNK_ULP; - chunk->data_accepted = 1; /* Think about partial delivery. */ if ((datalen >= asoc->rwnd) && (!asoc->ulpq.pd_mode)) { @@ -5345,6 +5349,8 @@ static int sctp_eat_data(const struct sctp_association *asoc, if (SCTP_CMD_CHUNK_ULP == deliver) sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_TSN, SCTP_U32(tsn)); + chunk->data_accepted = 1; + /* Note: Some chunks may get overcounted (if we drop) or overcounted * if we renege and the chunk arrives again. */ diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 5b1c8375c..dab159499 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -57,7 +57,6 @@ * be incorporated into the next SCTP release. */ -#include #include #include #include @@ -370,7 +369,7 @@ SCTP_STATIC int sctp_do_bind(struct sock *sk, union sctp_addr *addr, int len) /* Use GFP_ATOMIC since BHs are disabled. */ addr->v4.sin_port = ntohs(addr->v4.sin_port); - ret = sctp_add_bind_addr(bp, addr, GFP_ATOMIC); + ret = sctp_add_bind_addr(bp, addr, 1, GFP_ATOMIC); addr->v4.sin_port = htons(addr->v4.sin_port); sctp_write_unlock(&ep->base.addr_lock); sctp_local_bh_enable(); @@ -492,6 +491,7 @@ static int sctp_send_asconf_add_ip(struct sock *sk, struct sctp_chunk *chunk; struct sctp_sockaddr_entry *laddr; union sctp_addr *addr; + union sctp_addr saveaddr; void *addr_buf; struct sctp_af *af; struct list_head *pos; @@ -559,14 +559,26 @@ static int sctp_send_asconf_add_ip(struct sock *sk, } retval = sctp_send_asconf(asoc, chunk); + if (retval) + goto out; - /* FIXME: After sending the add address ASCONF chunk, we - * cannot append the address to the association's binding - * address list, because the new address may be used as the - * source of a message sent to the peer before the ASCONF - * chunk is received by the peer. So we should wait until - * ASCONF_ACK is received. + /* Add the new addresses to the bind address list with + * use_as_src set to 0. */ + sctp_local_bh_disable(); + sctp_write_lock(&asoc->base.addr_lock); + addr_buf = addrs; + for (i = 0; i < addrcnt; i++) { + addr = (union sctp_addr *)addr_buf; + af = sctp_get_af_specific(addr->v4.sin_family); + memcpy(&saveaddr, addr, af->sockaddr_len); + saveaddr.v4.sin_port = ntohs(saveaddr.v4.sin_port); + retval = sctp_add_bind_addr(bp, &saveaddr, 0, + GFP_ATOMIC); + addr_buf += af->sockaddr_len; + } + sctp_write_unlock(&asoc->base.addr_lock); + sctp_local_bh_enable(); } out: @@ -677,12 +689,15 @@ static int sctp_send_asconf_del_ip(struct sock *sk, struct sctp_sock *sp; struct sctp_endpoint *ep; struct sctp_association *asoc; + struct sctp_transport *transport; struct sctp_bind_addr *bp; struct sctp_chunk *chunk; union sctp_addr *laddr; + union sctp_addr saveaddr; void *addr_buf; struct sctp_af *af; - struct list_head *pos; + struct list_head *pos, *pos1; + struct sctp_sockaddr_entry *saddr; int i; int retval = 0; @@ -749,14 +764,42 @@ static int sctp_send_asconf_del_ip(struct sock *sk, goto out; } - retval = sctp_send_asconf(asoc, chunk); + /* Reset use_as_src flag for the addresses in the bind address + * list that are to be deleted. + */ + sctp_local_bh_disable(); + sctp_write_lock(&asoc->base.addr_lock); + addr_buf = addrs; + for (i = 0; i < addrcnt; i++) { + laddr = (union sctp_addr *)addr_buf; + af = sctp_get_af_specific(laddr->v4.sin_family); + memcpy(&saveaddr, laddr, af->sockaddr_len); + saveaddr.v4.sin_port = ntohs(saveaddr.v4.sin_port); + list_for_each(pos1, &bp->address_list) { + saddr = list_entry(pos1, + struct sctp_sockaddr_entry, + list); + if (sctp_cmp_addr_exact(&saddr->a, &saveaddr)) + saddr->use_as_src = 0; + } + addr_buf += af->sockaddr_len; + } + sctp_write_unlock(&asoc->base.addr_lock); + sctp_local_bh_enable(); - /* FIXME: After sending the delete address ASCONF chunk, we - * cannot remove the addresses from the association's bind - * address list, because there maybe some packet send to - * the delete addresses, so we should wait until ASCONF_ACK - * packet is received. + /* Update the route and saddr entries for all the transports + * as some of the addresses in the bind address list are + * about to be deleted and cannot be used as source addresses. */ + list_for_each(pos1, &asoc->peer.transport_addr_list) { + transport = list_entry(pos1, struct sctp_transport, + transports); + dst_release(transport->dst); + sctp_transport_route(transport, NULL, + sctp_sk(asoc->base.sk)); + } + + retval = sctp_send_asconf(asoc, chunk); } out: return retval; @@ -4990,7 +5033,7 @@ static struct sctp_bind_bucket *sctp_bucket_create( /* Caller must hold hashbucket lock for this tb with local BH disabled */ static void sctp_bucket_destroy(struct sctp_bind_bucket *pp) { - if (hlist_empty(&pp->owner)) { + if (pp && hlist_empty(&pp->owner)) { if (pp->next) pp->next->pprev = pp->pprev; *(pp->pprev) = pp->next; diff --git a/net/sctp/transport.c b/net/sctp/transport.c index 160f62ad1..2763aa93d 100644 --- a/net/sctp/transport.c +++ b/net/sctp/transport.c @@ -49,6 +49,7 @@ */ #include +#include #include #include @@ -85,7 +86,6 @@ static struct sctp_transport *sctp_transport_init(struct sctp_transport *peer, peer->init_sent_count = 0; - peer->state = SCTP_ACTIVE; peer->param_flags = SPP_HB_DISABLE | SPP_PMTUD_ENABLE | SPP_SACKDELAY_ENABLE; @@ -109,6 +109,9 @@ static struct sctp_transport *sctp_transport_init(struct sctp_transport *peer, peer->hb_timer.function = sctp_generate_heartbeat_event; peer->hb_timer.data = (unsigned long)peer; + /* Initialize the 64-bit random nonce sent with heartbeat. */ + get_random_bytes(&peer->hb_nonce, sizeof(peer->hb_nonce)); + atomic_set(&peer->refcnt, 1); peer->dead = 0; @@ -517,7 +520,9 @@ void sctp_transport_lower_cwnd(struct sctp_transport *transport, unsigned long sctp_transport_timeout(struct sctp_transport *t) { unsigned long timeout; - timeout = t->hbinterval + t->rto + sctp_jitter(t->rto); + timeout = t->rto + sctp_jitter(t->rto); + if (t->state != SCTP_UNCONFIRMED) + timeout += t->hbinterval; timeout += jiffies; return timeout; } diff --git a/net/socket.c b/net/socket.c index e2e3d9b02..3ca7c864c 100644 --- a/net/socket.c +++ b/net/socket.c @@ -58,7 +58,6 @@ * Based upon Swansea University Computer Society NET3.039 */ -#include #include #include #include @@ -337,10 +336,11 @@ static struct super_operations sockfs_ops = { .statfs = simple_statfs, }; -static struct super_block *sockfs_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int sockfs_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_pseudo(fs_type, "socket:", &sockfs_ops, SOCKFS_MAGIC); + return get_sb_pseudo(fs_type, "socket:", &sockfs_ops, SOCKFS_MAGIC, + mnt); } static struct vfsmount *sock_mnt __read_mostly; @@ -1212,7 +1212,8 @@ static int __sock_create(int family, int type, int protocol, struct socket **res */ if (!(sock = sock_alloc())) { - printk(KERN_WARNING "socket: no more sockets\n"); + if (net_ratelimit()) + printk(KERN_WARNING "socket: no more sockets\n"); err = -ENFILE; /* Not exactly a match, but its the closest posix thing */ goto out; @@ -1266,7 +1267,13 @@ int sock_create(int family, int type, int protocol, struct socket **res) int sock_create_kern(int family, int type, int protocol, struct socket **res) { - return __sock_create(family, type, protocol, res, 1); + static struct lock_class_key sk_lock_internal_key; + int ret; + ret = __sock_create(family, type, protocol, res, 1); + if (!ret) + lockdep_set_class(&(*res)->sk->sk_lock.slock, + &sk_lock_internal_key); + return ret; } asmlinkage long sys_socket(int family, int type, int protocol) diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c index 519ebc17c..ef1cf5b47 100644 --- a/net/sunrpc/auth_gss/auth_gss.c +++ b/net/sunrpc/auth_gss/auth_gss.c @@ -225,9 +225,8 @@ gss_alloc_context(void) { struct gss_cl_ctx *ctx; - ctx = kmalloc(sizeof(*ctx), GFP_KERNEL); + ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); if (ctx != NULL) { - memset(ctx, 0, sizeof(*ctx)); ctx->gc_proc = RPC_GSS_PROC_DATA; ctx->gc_seq = 1; /* NetApp 6.4R1 doesn't accept seq. no. 0 */ spin_lock_init(&ctx->gc_seq_lock); @@ -391,9 +390,8 @@ gss_alloc_msg(struct gss_auth *gss_auth, uid_t uid) { struct gss_upcall_msg *gss_msg; - gss_msg = kmalloc(sizeof(*gss_msg), GFP_KERNEL); + gss_msg = kzalloc(sizeof(*gss_msg), GFP_KERNEL); if (gss_msg != NULL) { - memset(gss_msg, 0, sizeof(*gss_msg)); INIT_LIST_HEAD(&gss_msg->list); rpc_init_wait_queue(&gss_msg->rpc_waitqueue, "RPCSEC_GSS upcall waitq"); init_waitqueue_head(&gss_msg->waitqueue); @@ -720,8 +718,7 @@ gss_destroy(struct rpc_auth *auth) auth, auth->au_flavor); gss_auth = container_of(auth, struct gss_auth, rpc_auth); - rpc_unlink(gss_auth->path); - dput(gss_auth->dentry); + rpc_unlink(gss_auth->dentry); gss_auth->dentry = NULL; gss_mech_put(gss_auth->mech); @@ -776,10 +773,9 @@ gss_create_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags) dprintk("RPC: gss_create_cred for uid %d, flavor %d\n", acred->uid, auth->au_flavor); - if (!(cred = kmalloc(sizeof(*cred), GFP_KERNEL))) + if (!(cred = kzalloc(sizeof(*cred), GFP_KERNEL))) goto out_err; - memset(cred, 0, sizeof(*cred)); atomic_set(&cred->gc_count, 1); cred->gc_uid = acred->uid; /* diff --git a/net/sunrpc/auth_gss/gss_krb5_mech.c b/net/sunrpc/auth_gss/gss_krb5_mech.c index 129e2bd36..70e1e53a6 100644 --- a/net/sunrpc/auth_gss/gss_krb5_mech.c +++ b/net/sunrpc/auth_gss/gss_krb5_mech.c @@ -129,9 +129,8 @@ gss_import_sec_context_kerberos(const void *p, const void *end = (const void *)((const char *)p + len); struct krb5_ctx *ctx; - if (!(ctx = kmalloc(sizeof(*ctx), GFP_KERNEL))) + if (!(ctx = kzalloc(sizeof(*ctx), GFP_KERNEL))) goto out_err; - memset(ctx, 0, sizeof(*ctx)); p = simple_get_bytes(p, end, &ctx->initiate, sizeof(ctx->initiate)); if (IS_ERR(p)) @@ -169,7 +168,7 @@ gss_import_sec_context_kerberos(const void *p, } ctx_id->internal_ctx_id = ctx; - dprintk("RPC: Succesfully imported new context.\n"); + dprintk("RPC: Successfully imported new context.\n"); return 0; out_err_free_key2: diff --git a/net/sunrpc/auth_gss/gss_krb5_seal.c b/net/sunrpc/auth_gss/gss_krb5_seal.c index f43311221..2f312164d 100644 --- a/net/sunrpc/auth_gss/gss_krb5_seal.c +++ b/net/sunrpc/auth_gss/gss_krb5_seal.c @@ -70,7 +70,7 @@ # define RPCDBG_FACILITY RPCDBG_AUTH #endif -spinlock_t krb5_seq_lock = SPIN_LOCK_UNLOCKED; +DEFINE_SPINLOCK(krb5_seq_lock); u32 gss_get_mic_kerberos(struct gss_ctx *gss_ctx, struct xdr_buf *text, diff --git a/net/sunrpc/auth_gss/gss_mech_switch.c b/net/sunrpc/auth_gss/gss_mech_switch.c index f8bac6ccd..3db745379 100644 --- a/net/sunrpc/auth_gss/gss_mech_switch.c +++ b/net/sunrpc/auth_gss/gss_mech_switch.c @@ -224,7 +224,8 @@ EXPORT_SYMBOL(gss_service_to_auth_domain_name); void gss_mech_put(struct gss_api_mech * gm) { - module_put(gm->gm_owner); + if (gm) + module_put(gm->gm_owner); } EXPORT_SYMBOL(gss_mech_put); @@ -236,9 +237,8 @@ gss_import_sec_context(const void *input_token, size_t bufsize, struct gss_api_mech *mech, struct gss_ctx **ctx_id) { - if (!(*ctx_id = kmalloc(sizeof(**ctx_id), GFP_KERNEL))) + if (!(*ctx_id = kzalloc(sizeof(**ctx_id), GFP_KERNEL))) return GSS_S_FAILURE; - memset(*ctx_id, 0, sizeof(**ctx_id)); (*ctx_id)->mech_type = gss_mech_get(mech); return mech->gm_ops @@ -307,8 +307,7 @@ gss_delete_sec_context(struct gss_ctx **context_handle) (*context_handle)->mech_type->gm_ops ->gss_delete_sec_context((*context_handle) ->internal_ctx_id); - if ((*context_handle)->mech_type) - gss_mech_put((*context_handle)->mech_type); + gss_mech_put((*context_handle)->mech_type); kfree(*context_handle); *context_handle=NULL; return GSS_S_COMPLETE; diff --git a/net/sunrpc/auth_gss/gss_spkm3_mech.c b/net/sunrpc/auth_gss/gss_spkm3_mech.c index 5bf11ccba..88dcb52d1 100644 --- a/net/sunrpc/auth_gss/gss_spkm3_mech.c +++ b/net/sunrpc/auth_gss/gss_spkm3_mech.c @@ -152,9 +152,8 @@ gss_import_sec_context_spkm3(const void *p, size_t len, const void *end = (const void *)((const char *)p + len); struct spkm3_ctx *ctx; - if (!(ctx = kmalloc(sizeof(*ctx), GFP_KERNEL))) + if (!(ctx = kzalloc(sizeof(*ctx), GFP_KERNEL))) goto out_err; - memset(ctx, 0, sizeof(*ctx)); p = simple_get_netobj(p, end, &ctx->ctx_id); if (IS_ERR(p)) @@ -201,7 +200,7 @@ gss_import_sec_context_spkm3(const void *p, size_t len, ctx_id->internal_ctx_id = ctx; - dprintk("Succesfully imported new spkm context.\n"); + dprintk("Successfully imported new spkm context.\n"); return 0; out_err_free_key2: diff --git a/net/sunrpc/auth_gss/gss_spkm3_token.c b/net/sunrpc/auth_gss/gss_spkm3_token.c index af0d7ce74..854a983cc 100644 --- a/net/sunrpc/auth_gss/gss_spkm3_token.c +++ b/net/sunrpc/auth_gss/gss_spkm3_token.c @@ -90,10 +90,9 @@ asn1_bitstring_len(struct xdr_netobj *in, int *enclen, int *zerobits) int decode_asn1_bitstring(struct xdr_netobj *out, char *in, int enclen, int explen) { - if (!(out->data = kmalloc(explen,GFP_KERNEL))) + if (!(out->data = kzalloc(explen,GFP_KERNEL))) return 0; out->len = explen; - memset(out->data, 0, explen); memcpy(out->data, in, enclen); return 1; } diff --git a/net/sunrpc/auth_gss/svcauth_gss.c b/net/sunrpc/auth_gss/svcauth_gss.c index d51e316c5..94217ec9e 100644 --- a/net/sunrpc/auth_gss/svcauth_gss.c +++ b/net/sunrpc/auth_gss/svcauth_gss.c @@ -425,6 +425,7 @@ static int rsc_parse(struct cache_detail *cd, struct rsc rsci, *rscp = NULL; time_t expiry; int status = -EINVAL; + struct gss_api_mech *gm = NULL; memset(&rsci, 0, sizeof(rsci)); /* context handle */ @@ -453,7 +454,6 @@ static int rsc_parse(struct cache_detail *cd, set_bit(CACHE_NEGATIVE, &rsci.h.flags); else { int N, i; - struct gss_api_mech *gm; /* gid */ if (get_int(&mesg, &rsci.cred.cr_gid)) @@ -488,21 +488,17 @@ static int rsc_parse(struct cache_detail *cd, status = -EINVAL; /* mech-specific data: */ len = qword_get(&mesg, buf, mlen); - if (len < 0) { - gss_mech_put(gm); + if (len < 0) goto out; - } status = gss_import_sec_context(buf, len, gm, &rsci.mechctx); - if (status) { - gss_mech_put(gm); + if (status) goto out; - } - gss_mech_put(gm); } rsci.h.expiry_time = expiry; rscp = rsc_update(&rsci, rscp); status = 0; out: + gss_mech_put(gm); rsc_free(&rsci); if (rscp) cache_put(&rscp->h, &rsc_cache); @@ -836,6 +832,74 @@ out: return stat; } +static inline int +total_buf_len(struct xdr_buf *buf) +{ + return buf->head[0].iov_len + buf->page_len + buf->tail[0].iov_len; +} + +static void +fix_priv_head(struct xdr_buf *buf, int pad) +{ + if (buf->page_len == 0) { + /* We need to adjust head and buf->len in tandem in this + * case to make svc_defer() work--it finds the original + * buffer start using buf->len - buf->head[0].iov_len. */ + buf->head[0].iov_len -= pad; + } +} + +static int +unwrap_priv_data(struct svc_rqst *rqstp, struct xdr_buf *buf, u32 seq, struct gss_ctx *ctx) +{ + u32 priv_len, maj_stat; + int pad, saved_len, remaining_len, offset; + + rqstp->rq_sendfile_ok = 0; + + priv_len = ntohl(svc_getu32(&buf->head[0])); + if (rqstp->rq_deferred) { + /* Already decrypted last time through! The sequence number + * check at out_seq is unnecessary but harmless: */ + goto out_seq; + } + /* buf->len is the number of bytes from the original start of the + * request to the end, where head[0].iov_len is just the bytes + * not yet read from the head, so these two values are different: */ + remaining_len = total_buf_len(buf); + if (priv_len > remaining_len) + return -EINVAL; + pad = remaining_len - priv_len; + buf->len -= pad; + fix_priv_head(buf, pad); + + /* Maybe it would be better to give gss_unwrap a length parameter: */ + saved_len = buf->len; + buf->len = priv_len; + maj_stat = gss_unwrap(ctx, 0, buf); + pad = priv_len - buf->len; + buf->len = saved_len; + buf->len -= pad; + /* The upper layers assume the buffer is aligned on 4-byte boundaries. + * In the krb5p case, at least, the data ends up offset, so we need to + * move it around. */ + /* XXX: This is very inefficient. It would be better to either do + * this while we encrypt, or maybe in the receive code, if we can peak + * ahead and work out the service and mechanism there. */ + offset = buf->head[0].iov_len % 4; + if (offset) { + buf->buflen = RPCSVC_MAXPAYLOAD; + xdr_shift_buf(buf, offset); + fix_priv_head(buf, pad); + } + if (maj_stat != GSS_S_COMPLETE) + return -EINVAL; +out_seq: + if (ntohl(svc_getu32(&buf->head[0])) != seq) + return -EINVAL; + return 0; +} + struct gss_svc_data { /* decoded gss client cred: */ struct rpc_gss_wire_cred clcred; @@ -1051,7 +1115,14 @@ svcauth_gss_accept(struct svc_rqst *rqstp, u32 *authp) svc_putu32(resv, 0); break; case RPC_GSS_SVC_PRIVACY: - /* currently unsupported */ + if (unwrap_priv_data(rqstp, &rqstp->rq_arg, + gc->gc_seq, rsci->mechctx)) + goto auth_err; + /* placeholders for length and seq. number: */ + svcdata->body_start = resv->iov_base + resv->iov_len; + svc_putu32(resv, 0); + svc_putu32(resv, 0); + break; default: goto auth_err; } @@ -1076,8 +1147,8 @@ out: return ret; } -static int -svcauth_gss_release(struct svc_rqst *rqstp) +static inline int +svcauth_gss_wrap_resp_integ(struct svc_rqst *rqstp) { struct gss_svc_data *gsd = (struct gss_svc_data *)rqstp->rq_auth_data; struct rpc_gss_wire_cred *gc = &gsd->clcred; @@ -1089,69 +1160,147 @@ svcauth_gss_release(struct svc_rqst *rqstp) int integ_offset, integ_len; int stat = -EINVAL; + p = gsd->body_start; + gsd->body_start = NULL; + /* move accept_stat to right place: */ + memcpy(p, p + 2, 4); + /* Don't wrap in failure case: */ + /* Counting on not getting here if call was not even accepted! */ + if (*p != rpc_success) { + resbuf->head[0].iov_len -= 2 * 4; + goto out; + } + p++; + integ_offset = (u8 *)(p + 1) - (u8 *)resbuf->head[0].iov_base; + integ_len = resbuf->len - integ_offset; + BUG_ON(integ_len % 4); + *p++ = htonl(integ_len); + *p++ = htonl(gc->gc_seq); + if (xdr_buf_subsegment(resbuf, &integ_buf, integ_offset, + integ_len)) + BUG(); + if (resbuf->page_len == 0 + && resbuf->head[0].iov_len + RPC_MAX_AUTH_SIZE + < PAGE_SIZE) { + BUG_ON(resbuf->tail[0].iov_len); + /* Use head for everything */ + resv = &resbuf->head[0]; + } else if (resbuf->tail[0].iov_base == NULL) { + if (resbuf->head[0].iov_len + RPC_MAX_AUTH_SIZE > PAGE_SIZE) + goto out_err; + resbuf->tail[0].iov_base = resbuf->head[0].iov_base + + resbuf->head[0].iov_len; + resbuf->tail[0].iov_len = 0; + rqstp->rq_restailpage = 0; + resv = &resbuf->tail[0]; + } else { + resv = &resbuf->tail[0]; + } + mic.data = (u8 *)resv->iov_base + resv->iov_len + 4; + if (gss_get_mic(gsd->rsci->mechctx, &integ_buf, &mic)) + goto out_err; + svc_putu32(resv, htonl(mic.len)); + memset(mic.data + mic.len, 0, + round_up_to_quad(mic.len) - mic.len); + resv->iov_len += XDR_QUADLEN(mic.len) << 2; + /* not strictly required: */ + resbuf->len += XDR_QUADLEN(mic.len) << 2; + BUG_ON(resv->iov_len > PAGE_SIZE); +out: + stat = 0; +out_err: + return stat; +} + +static inline int +svcauth_gss_wrap_resp_priv(struct svc_rqst *rqstp) +{ + struct gss_svc_data *gsd = (struct gss_svc_data *)rqstp->rq_auth_data; + struct rpc_gss_wire_cred *gc = &gsd->clcred; + struct xdr_buf *resbuf = &rqstp->rq_res; + struct page **inpages = NULL; + u32 *p; + int offset, *len; + int pad; + + p = gsd->body_start; + gsd->body_start = NULL; + /* move accept_stat to right place: */ + memcpy(p, p + 2, 4); + /* Don't wrap in failure case: */ + /* Counting on not getting here if call was not even accepted! */ + if (*p != rpc_success) { + resbuf->head[0].iov_len -= 2 * 4; + return 0; + } + p++; + len = p++; + offset = (u8 *)p - (u8 *)resbuf->head[0].iov_base; + *p++ = htonl(gc->gc_seq); + inpages = resbuf->pages; + /* XXX: Would be better to write some xdr helper functions for + * nfs{2,3,4}xdr.c that place the data right, instead of copying: */ + if (resbuf->tail[0].iov_base && rqstp->rq_restailpage == 0) { + BUG_ON(resbuf->tail[0].iov_base >= resbuf->head[0].iov_base + + PAGE_SIZE); + BUG_ON(resbuf->tail[0].iov_base < resbuf->head[0].iov_base); + if (resbuf->tail[0].iov_len + resbuf->head[0].iov_len + + 2 * RPC_MAX_AUTH_SIZE > PAGE_SIZE) + return -ENOMEM; + memmove(resbuf->tail[0].iov_base + RPC_MAX_AUTH_SIZE, + resbuf->tail[0].iov_base, + resbuf->tail[0].iov_len); + resbuf->tail[0].iov_base += RPC_MAX_AUTH_SIZE; + } + if (resbuf->tail[0].iov_base == NULL) { + if (resbuf->head[0].iov_len + 2*RPC_MAX_AUTH_SIZE > PAGE_SIZE) + return -ENOMEM; + resbuf->tail[0].iov_base = resbuf->head[0].iov_base + + resbuf->head[0].iov_len + RPC_MAX_AUTH_SIZE; + resbuf->tail[0].iov_len = 0; + rqstp->rq_restailpage = 0; + } + if (gss_wrap(gsd->rsci->mechctx, offset, resbuf, inpages)) + return -ENOMEM; + *len = htonl(resbuf->len - offset); + pad = 3 - ((resbuf->len - offset - 1)&3); + p = (u32 *)(resbuf->tail[0].iov_base + resbuf->tail[0].iov_len); + memset(p, 0, pad); + resbuf->tail[0].iov_len += pad; + resbuf->len += pad; + return 0; +} + +static int +svcauth_gss_release(struct svc_rqst *rqstp) +{ + struct gss_svc_data *gsd = (struct gss_svc_data *)rqstp->rq_auth_data; + struct rpc_gss_wire_cred *gc = &gsd->clcred; + struct xdr_buf *resbuf = &rqstp->rq_res; + int stat = -EINVAL; + if (gc->gc_proc != RPC_GSS_PROC_DATA) goto out; /* Release can be called twice, but we only wrap once. */ if (gsd->body_start == NULL) goto out; /* normally not set till svc_send, but we need it here: */ - resbuf->len = resbuf->head[0].iov_len - + resbuf->page_len + resbuf->tail[0].iov_len; + /* XXX: what for? Do we mess it up the moment we call svc_putu32 + * or whatever? */ + resbuf->len = total_buf_len(resbuf); switch (gc->gc_svc) { case RPC_GSS_SVC_NONE: break; case RPC_GSS_SVC_INTEGRITY: - p = gsd->body_start; - gsd->body_start = NULL; - /* move accept_stat to right place: */ - memcpy(p, p + 2, 4); - /* don't wrap in failure case: */ - /* Note: counting on not getting here if call was not even - * accepted! */ - if (*p != rpc_success) { - resbuf->head[0].iov_len -= 2 * 4; - goto out; - } - p++; - integ_offset = (u8 *)(p + 1) - (u8 *)resbuf->head[0].iov_base; - integ_len = resbuf->len - integ_offset; - BUG_ON(integ_len % 4); - *p++ = htonl(integ_len); - *p++ = htonl(gc->gc_seq); - if (xdr_buf_subsegment(resbuf, &integ_buf, integ_offset, - integ_len)) - BUG(); - if (resbuf->page_len == 0 - && resbuf->head[0].iov_len + RPC_MAX_AUTH_SIZE - < PAGE_SIZE) { - BUG_ON(resbuf->tail[0].iov_len); - /* Use head for everything */ - resv = &resbuf->head[0]; - } else if (resbuf->tail[0].iov_base == NULL) { - if (resbuf->head[0].iov_len + RPC_MAX_AUTH_SIZE - > PAGE_SIZE) - goto out_err; - resbuf->tail[0].iov_base = - resbuf->head[0].iov_base - + resbuf->head[0].iov_len; - resbuf->tail[0].iov_len = 0; - rqstp->rq_restailpage = 0; - resv = &resbuf->tail[0]; - } else { - resv = &resbuf->tail[0]; - } - mic.data = (u8 *)resv->iov_base + resv->iov_len + 4; - if (gss_get_mic(gsd->rsci->mechctx, &integ_buf, &mic)) + stat = svcauth_gss_wrap_resp_integ(rqstp); + if (stat) goto out_err; - svc_putu32(resv, htonl(mic.len)); - memset(mic.data + mic.len, 0, - round_up_to_quad(mic.len) - mic.len); - resv->iov_len += XDR_QUADLEN(mic.len) << 2; - /* not strictly required: */ - resbuf->len += XDR_QUADLEN(mic.len) << 2; - BUG_ON(resv->iov_len > PAGE_SIZE); break; case RPC_GSS_SVC_PRIVACY: + stat = svcauth_gss_wrap_resp_priv(rqstp); + if (stat) + goto out_err; + break; default: goto out_err; } diff --git a/net/sunrpc/auth_null.c b/net/sunrpc/auth_null.c index f56767aaa..2eccffa96 100644 --- a/net/sunrpc/auth_null.c +++ b/net/sunrpc/auth_null.c @@ -118,6 +118,8 @@ struct rpc_auth null_auth = { .au_cslack = 4, .au_rslack = 2, .au_ops = &authnull_ops, + .au_flavor = RPC_AUTH_NULL, + .au_count = ATOMIC_INIT(0), }; static diff --git a/net/sunrpc/auth_unix.c b/net/sunrpc/auth_unix.c index 4f2ad4f0f..86da84a46 100644 --- a/net/sunrpc/auth_unix.c +++ b/net/sunrpc/auth_unix.c @@ -233,6 +233,7 @@ struct rpc_auth unix_auth = { .au_cslack = UNX_WRITESLACK, .au_rslack = 2, /* assume AUTH_NULL verf */ .au_ops = &authunix_ops, + .au_flavor = RPC_AUTH_UNIX, .au_count = ATOMIC_INIT(0), .au_credcache = &unix_cred_cache, }; diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index aa8965e9d..3e19d3210 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c @@ -125,10 +125,9 @@ rpc_new_client(struct rpc_xprt *xprt, char *servname, goto out_err; err = -ENOMEM; - clnt = kmalloc(sizeof(*clnt), GFP_KERNEL); + clnt = kzalloc(sizeof(*clnt), GFP_KERNEL); if (!clnt) goto out_err; - memset(clnt, 0, sizeof(*clnt)); atomic_set(&clnt->cl_users, 0); atomic_set(&clnt->cl_count, 1); clnt->cl_parent = clnt; @@ -184,8 +183,7 @@ rpc_new_client(struct rpc_xprt *xprt, char *servname, out_no_auth: if (!IS_ERR(clnt->cl_dentry)) { - rpc_rmdir(clnt->cl_pathname); - dput(clnt->cl_dentry); + rpc_rmdir(clnt->cl_dentry); rpc_put_mount(); } out_no_path: @@ -252,10 +250,8 @@ rpc_clone_client(struct rpc_clnt *clnt) new->cl_autobind = 0; new->cl_oneshot = 0; new->cl_dead = 0; - if (!IS_ERR(new->cl_dentry)) { + if (!IS_ERR(new->cl_dentry)) dget(new->cl_dentry); - rpc_get_mount(); - } rpc_init_rtt(&new->cl_rtt_default, clnt->cl_xprt->timeout.to_initval); if (new->cl_auth) atomic_inc(&new->cl_auth->au_count); @@ -318,11 +314,15 @@ rpc_destroy_client(struct rpc_clnt *clnt) clnt->cl_auth = NULL; } if (clnt->cl_parent != clnt) { + if (!IS_ERR(clnt->cl_dentry)) + dput(clnt->cl_dentry); rpc_destroy_client(clnt->cl_parent); goto out_free; } - if (clnt->cl_pathname[0]) - rpc_rmdir(clnt->cl_pathname); + if (!IS_ERR(clnt->cl_dentry)) { + rpc_rmdir(clnt->cl_dentry); + rpc_put_mount(); + } if (clnt->cl_xprt) { xprt_destroy(clnt->cl_xprt); clnt->cl_xprt = NULL; @@ -332,10 +332,6 @@ rpc_destroy_client(struct rpc_clnt *clnt) out_free: rpc_free_iostats(clnt->cl_metrics); clnt->cl_metrics = NULL; - if (!IS_ERR(clnt->cl_dentry)) { - dput(clnt->cl_dentry); - rpc_put_mount(); - } kfree(clnt); return 0; } @@ -922,26 +918,43 @@ call_transmit(struct rpc_task *task) task->tk_status = xprt_prepare_transmit(task); if (task->tk_status != 0) return; + task->tk_action = call_transmit_status; /* Encode here so that rpcsec_gss can use correct sequence number. */ if (rpc_task_need_encode(task)) { - task->tk_rqstp->rq_bytes_sent = 0; + BUG_ON(task->tk_rqstp->rq_bytes_sent != 0); call_encode(task); /* Did the encode result in an error condition? */ if (task->tk_status != 0) - goto out_nosend; + return; } - task->tk_action = call_transmit_status; xprt_transmit(task); if (task->tk_status < 0) return; - if (!task->tk_msg.rpc_proc->p_decode) { - task->tk_action = rpc_exit_task; - rpc_wake_up_task(task); - } - return; -out_nosend: - /* release socket write lock before attempting to handle error */ - xprt_abort_transmit(task); + /* + * On success, ensure that we call xprt_end_transmit() before sleeping + * in order to allow access to the socket to other RPC requests. + */ + call_transmit_status(task); + if (task->tk_msg.rpc_proc->p_decode != NULL) + return; + task->tk_action = rpc_exit_task; + rpc_wake_up_task(task); +} + +/* + * 5a. Handle cleanup after a transmission + */ +static void +call_transmit_status(struct rpc_task *task) +{ + task->tk_action = call_status; + /* + * Special case: if we've been waiting on the socket's write_space() + * callback, then don't call xprt_end_transmit(). + */ + if (task->tk_status == -EAGAIN) + return; + xprt_end_transmit(task); rpc_task_force_reencode(task); } @@ -993,18 +1006,7 @@ call_status(struct rpc_task *task) } /* - * 6a. Handle transmission errors. - */ -static void -call_transmit_status(struct rpc_task *task) -{ - if (task->tk_status != -EAGAIN) - rpc_task_force_reencode(task); - call_status(task); -} - -/* - * 6b. Handle RPC timeout + * 6a. Handle RPC timeout * We do not release the request slot, so we keep using the * same XID for all retransmits. */ @@ -1179,6 +1181,17 @@ call_verify(struct rpc_task *task) u32 *p = iov->iov_base, n; int error = -EACCES; + if ((task->tk_rqstp->rq_rcv_buf.len & 3) != 0) { + /* RFC-1014 says that the representation of XDR data must be a + * multiple of four bytes + * - if it isn't pointer subtraction in the NFS client may give + * undefined results + */ + printk(KERN_WARNING + "call_verify: XDR representation not a multiple of" + " 4 bytes: 0x%x\n", task->tk_rqstp->rq_rcv_buf.len); + goto out_eio; + } if ((len -= 3) < 0) goto out_overflow; p += 1; /* skip XID */ diff --git a/net/sunrpc/pmap_clnt.c b/net/sunrpc/pmap_clnt.c index d25b054ec..623180f22 100644 --- a/net/sunrpc/pmap_clnt.c +++ b/net/sunrpc/pmap_clnt.c @@ -6,7 +6,6 @@ * Copyright (C) 1996, Olaf Kirch */ -#include #include #include #include diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c index cc673dd84..0573df512 100644 --- a/net/sunrpc/rpc_pipe.c +++ b/net/sunrpc/rpc_pipe.c @@ -8,7 +8,6 @@ * Copyright (c) 2002, Trond Myklebust * */ -#include #include #include #include @@ -439,7 +438,7 @@ struct vfsmount *rpc_get_mount(void) { int err; - err = simple_pin_fs("rpc_pipefs", &rpc_mount, &rpc_mount_count); + err = simple_pin_fs(&rpc_pipe_fs_type, &rpc_mount, &rpc_mount_count); if (err != 0) return ERR_PTR(err); return rpc_mount; @@ -491,7 +490,6 @@ rpc_get_inode(struct super_block *sb, int mode) return NULL; inode->i_mode = mode; inode->i_uid = inode->i_gid = 0; - inode->i_blksize = PAGE_CACHE_SIZE; inode->i_blocks = 0; inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; switch(mode & S_IFMT) { @@ -516,7 +514,7 @@ rpc_depopulate(struct dentry *parent) struct dentry *dentry, *dvec[10]; int n = 0; - mutex_lock(&dir->i_mutex); + mutex_lock_nested(&dir->i_mutex, I_MUTEX_CHILD); repeat: spin_lock(&dcache_lock); list_for_each_safe(pos, next, &parent->d_subdirs) { @@ -540,6 +538,7 @@ repeat: rpc_close_pipes(dentry->d_inode); simple_unlink(dir, dentry); } + inode_dir_notify(dir, DN_DELETE); dput(dentry); } while (n); goto repeat; @@ -611,8 +610,8 @@ __rpc_rmdir(struct inode *dir, struct dentry *dentry) int error; shrink_dcache_parent(dentry); - if (dentry->d_inode) - rpc_close_pipes(dentry->d_inode); + if (d_unhashed(dentry)) + return 0; if ((error = simple_rmdir(dir, dentry)) != 0) return error; if (!error) { @@ -632,7 +631,7 @@ rpc_lookup_negative(char *path, struct nameidata *nd) if ((error = rpc_lookup_parent(path, nd)) != 0) return ERR_PTR(error); dir = nd->dentry->d_inode; - mutex_lock(&dir->i_mutex); + mutex_lock_nested(&dir->i_mutex, I_MUTEX_PARENT); dentry = lookup_one_len(nd->last.name, nd->dentry, nd->last.len); if (IS_ERR(dentry)) goto out_err; @@ -668,10 +667,11 @@ rpc_mkdir(char *path, struct rpc_clnt *rpc_client) RPCAUTH_info, RPCAUTH_EOF); if (error) goto err_depopulate; + dget(dentry); out: mutex_unlock(&dir->i_mutex); rpc_release_path(&nd); - return dget(dentry); + return dentry; err_depopulate: rpc_depopulate(dentry); __rpc_rmdir(dir, dentry); @@ -684,28 +684,20 @@ err_dput: } int -rpc_rmdir(char *path) +rpc_rmdir(struct dentry *dentry) { - struct nameidata nd; - struct dentry *dentry; + struct dentry *parent; struct inode *dir; int error; - if ((error = rpc_lookup_parent(path, &nd)) != 0) - return error; - dir = nd.dentry->d_inode; - mutex_lock(&dir->i_mutex); - dentry = lookup_one_len(nd.last.name, nd.dentry, nd.last.len); - if (IS_ERR(dentry)) { - error = PTR_ERR(dentry); - goto out_release; - } + parent = dget_parent(dentry); + dir = parent->d_inode; + mutex_lock_nested(&dir->i_mutex, I_MUTEX_PARENT); rpc_depopulate(dentry); error = __rpc_rmdir(dir, dentry); dput(dentry); -out_release: mutex_unlock(&dir->i_mutex); - rpc_release_path(&nd); + dput(parent); return error; } @@ -721,7 +713,7 @@ rpc_mkpipe(char *path, void *private, struct rpc_pipe_ops *ops, int flags) if (IS_ERR(dentry)) return dentry; dir = nd.dentry->d_inode; - inode = rpc_get_inode(dir->i_sb, S_IFSOCK | S_IRUSR | S_IWUSR); + inode = rpc_get_inode(dir->i_sb, S_IFIFO | S_IRUSR | S_IWUSR); if (!inode) goto err_dput; inode->i_ino = iunique(dir->i_sb, 100); @@ -732,10 +724,11 @@ rpc_mkpipe(char *path, void *private, struct rpc_pipe_ops *ops, int flags) rpci->flags = flags; rpci->ops = ops; inode_dir_notify(dir, DN_CREATE); + dget(dentry); out: mutex_unlock(&dir->i_mutex); rpc_release_path(&nd); - return dget(dentry); + return dentry; err_dput: dput(dentry); dentry = ERR_PTR(-ENOMEM); @@ -745,32 +738,26 @@ err_dput: } int -rpc_unlink(char *path) +rpc_unlink(struct dentry *dentry) { - struct nameidata nd; - struct dentry *dentry; + struct dentry *parent; struct inode *dir; - int error; + int error = 0; - if ((error = rpc_lookup_parent(path, &nd)) != 0) - return error; - dir = nd.dentry->d_inode; - mutex_lock(&dir->i_mutex); - dentry = lookup_one_len(nd.last.name, nd.dentry, nd.last.len); - if (IS_ERR(dentry)) { - error = PTR_ERR(dentry); - goto out_release; - } - d_drop(dentry); - if (dentry->d_inode) { - rpc_close_pipes(dentry->d_inode); - error = simple_unlink(dir, dentry); + parent = dget_parent(dentry); + dir = parent->d_inode; + mutex_lock_nested(&dir->i_mutex, I_MUTEX_PARENT); + if (!d_unhashed(dentry)) { + d_drop(dentry); + if (dentry->d_inode) { + rpc_close_pipes(dentry->d_inode); + error = simple_unlink(dir, dentry); + } + inode_dir_notify(dir, DN_DELETE); } dput(dentry); - inode_dir_notify(dir, DN_DELETE); -out_release: mutex_unlock(&dir->i_mutex); - rpc_release_path(&nd); + dput(parent); return error; } @@ -815,11 +802,11 @@ out: return -ENOMEM; } -static struct super_block * +static int rpc_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) + int flags, const char *dev_name, void *data, struct vfsmount *mnt) { - return get_sb_single(fs_type, flags, data, rpc_fill_super); + return get_sb_single(fs_type, flags, data, rpc_fill_super, mnt); } static struct file_system_type rpc_pipe_fs_type = { diff --git a/net/sunrpc/stats.c b/net/sunrpc/stats.c index 15c2db267..bd98124c3 100644 --- a/net/sunrpc/stats.c +++ b/net/sunrpc/stats.c @@ -114,13 +114,8 @@ void svc_seq_show(struct seq_file *seq, const struct svc_stat *statp) { */ struct rpc_iostats *rpc_alloc_iostats(struct rpc_clnt *clnt) { - unsigned int ops = clnt->cl_maxproc; - size_t size = ops * sizeof(struct rpc_iostats); struct rpc_iostats *new; - - new = kmalloc(size, GFP_KERNEL); - if (new) - memset(new, 0 , size); + new = kcalloc(clnt->cl_maxproc, sizeof(struct rpc_iostats), GFP_KERNEL); return new; } EXPORT_SYMBOL(rpc_alloc_iostats); diff --git a/net/sunrpc/sunrpc_syms.c b/net/sunrpc/sunrpc_syms.c index 769114f0f..f38f939ce 100644 --- a/net/sunrpc/sunrpc_syms.c +++ b/net/sunrpc/sunrpc_syms.c @@ -6,7 +6,6 @@ * Copyright (C) 1997 Olaf Kirch */ -#include #include #include diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c index b08419e1f..b76a227dd 100644 --- a/net/sunrpc/svc.c +++ b/net/sunrpc/svc.c @@ -32,9 +32,8 @@ svc_create(struct svc_program *prog, unsigned int bufsize) int vers; unsigned int xdrsize; - if (!(serv = kmalloc(sizeof(*serv), GFP_KERNEL))) + if (!(serv = kzalloc(sizeof(*serv), GFP_KERNEL))) return NULL; - memset(serv, 0, sizeof(*serv)); serv->sv_name = prog->pg_name; serv->sv_program = prog; serv->sv_nrthreads = 1; @@ -159,11 +158,10 @@ svc_create_thread(svc_thread_fn func, struct svc_serv *serv) struct svc_rqst *rqstp; int error = -ENOMEM; - rqstp = kmalloc(sizeof(*rqstp), GFP_KERNEL); + rqstp = kzalloc(sizeof(*rqstp), GFP_KERNEL); if (!rqstp) goto out; - memset(rqstp, 0, sizeof(*rqstp)); init_waitqueue_head(&rqstp->rq_wait); if (!(rqstp->rq_argp = kmalloc(serv->sv_xdrsize, GFP_KERNEL)) @@ -280,7 +278,10 @@ svc_process(struct svc_serv *serv, struct svc_rqst *rqstp) rqstp->rq_res.page_base = 0; rqstp->rq_res.page_len = 0; rqstp->rq_res.buflen = PAGE_SIZE; + rqstp->rq_res.tail[0].iov_base = NULL; rqstp->rq_res.tail[0].iov_len = 0; + /* Will be turned off only in gss privacy case: */ + rqstp->rq_sendfile_ok = 1; /* tcp needs a space for the record length... */ if (rqstp->rq_prot == IPPROTO_TCP) svc_putu32(resv, 0); diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index a27905a0a..425ec7ffc 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c @@ -73,6 +73,37 @@ static struct svc_deferred_req *svc_deferred_dequeue(struct svc_sock *svsk); static int svc_deferred_recv(struct svc_rqst *rqstp); static struct cache_deferred_req *svc_defer(struct cache_req *req); +#ifdef CONFIG_DEBUG_LOCK_ALLOC +static struct lock_class_key svc_key[2]; +static struct lock_class_key svc_slock_key[2]; + +static inline void svc_reclassify_socket(struct socket *sock) +{ + struct sock *sk = sock->sk; + BUG_ON(sk->sk_lock.owner != NULL); + switch (sk->sk_family) { + case AF_INET: + sock_lock_init_class_and_name(sk, + "slock-AF_INET-NFSD", &svc_slock_key[0], + "sk_lock-AF_INET-NFSD", &svc_key[0]); + break; + + case AF_INET6: + sock_lock_init_class_and_name(sk, + "slock-AF_INET6-NFSD", &svc_slock_key[1], + "sk_lock-AF_INET6-NFSD", &svc_key[1]); + break; + + default: + BUG(); + } +} +#else +static inline void svc_reclassify_socket(struct socket *sock) +{ +} +#endif + /* * Queue up an idle server thread. Must have serv->sv_lock held. * Note: this is really a stack rather than a queue, so that we only @@ -902,7 +933,7 @@ svc_tcp_recvfrom(struct svc_rqst *rqstp) return 0; } - if (test_bit(SK_CONN, &svsk->sk_flags)) { + if (svsk->sk_sk->sk_state == TCP_LISTEN) { svc_tcp_accept(svsk); svc_sock_received(svsk); return 0; @@ -1322,11 +1353,10 @@ svc_setup_socket(struct svc_serv *serv, struct socket *sock, struct sock *inet; dprintk("svc: svc_setup_socket %p\n", sock); - if (!(svsk = kmalloc(sizeof(*svsk), GFP_KERNEL))) { + if (!(svsk = kzalloc(sizeof(*svsk), GFP_KERNEL))) { *errp = -ENOMEM; return NULL; } - memset(svsk, 0, sizeof(*svsk)); inet = sock->sk; @@ -1404,6 +1434,8 @@ svc_create_socket(struct svc_serv *serv, int protocol, struct sockaddr_in *sin) if ((error = sock_create_kern(PF_INET, type, protocol, &sock)) < 0) return error; + svc_reclassify_socket(sock); + if (sin != NULL) { if (type == SOCK_STREAM) sock->sk->sk_reuse = 1; /* allow address reuse */ diff --git a/net/sunrpc/sysctl.c b/net/sunrpc/sysctl.c index 106590484..d89b048ad 100644 --- a/net/sunrpc/sysctl.c +++ b/net/sunrpc/sysctl.c @@ -7,7 +7,6 @@ * impossible at the moment. */ -#include #include #include #include diff --git a/net/sunrpc/xdr.c b/net/sunrpc/xdr.c index ca4bfa57e..6ac45103a 100644 --- a/net/sunrpc/xdr.c +++ b/net/sunrpc/xdr.c @@ -191,7 +191,6 @@ _shift_data_right_pages(struct page **pages, size_t pgto_base, do { /* Are any pointers crossing a page boundary? */ if (pgto_base == 0) { - flush_dcache_page(*pgto); pgto_base = PAGE_CACHE_SIZE; pgto--; } @@ -211,11 +210,11 @@ _shift_data_right_pages(struct page **pages, size_t pgto_base, vto = kmap_atomic(*pgto, KM_USER0); vfrom = kmap_atomic(*pgfrom, KM_USER1); memmove(vto + pgto_base, vfrom + pgfrom_base, copy); + flush_dcache_page(*pgto); kunmap_atomic(vfrom, KM_USER1); kunmap_atomic(vto, KM_USER0); } while ((len -= copy) != 0); - flush_dcache_page(*pgto); } /* @@ -568,8 +567,7 @@ EXPORT_SYMBOL(xdr_inline_decode); * * Moves data beyond the current pointer position from the XDR head[] buffer * into the page list. Any data that lies beyond current position + "len" - * bytes is moved into the XDR tail[]. The current pointer is then - * repositioned at the beginning of the XDR tail. + * bytes is moved into the XDR tail[]. */ void xdr_read_pages(struct xdr_stream *xdr, unsigned int len) { @@ -606,6 +604,31 @@ void xdr_read_pages(struct xdr_stream *xdr, unsigned int len) } EXPORT_SYMBOL(xdr_read_pages); +/** + * xdr_enter_page - decode data from the XDR page + * @xdr: pointer to xdr_stream struct + * @len: number of bytes of page data + * + * Moves data beyond the current pointer position from the XDR head[] buffer + * into the page list. Any data that lies beyond current position + "len" + * bytes is moved into the XDR tail[]. The current pointer is then + * repositioned at the beginning of the first XDR page. + */ +void xdr_enter_page(struct xdr_stream *xdr, unsigned int len) +{ + char * kaddr = page_address(xdr->buf->pages[0]); + xdr_read_pages(xdr, len); + /* + * Position current pointer at beginning of tail, and + * set remaining message length. + */ + if (len > PAGE_CACHE_SIZE - xdr->buf->page_base) + len = PAGE_CACHE_SIZE - xdr->buf->page_base; + xdr->p = (uint32_t *)(kaddr + xdr->buf->page_base); + xdr->end = (uint32_t *)((char *)xdr->p + len); +} +EXPORT_SYMBOL(xdr_enter_page); + static struct kvec empty_iov = {.iov_base = NULL, .iov_len = 0}; void diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index 4dd5b3cfe..e8c2bc497 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c @@ -41,7 +41,7 @@ #include #include #include -#include +#include #include #include @@ -707,12 +707,9 @@ out_unlock: return err; } -void -xprt_abort_transmit(struct rpc_task *task) +void xprt_end_transmit(struct rpc_task *task) { - struct rpc_xprt *xprt = task->tk_xprt; - - xprt_release_write(xprt, task); + xprt_release_write(task->tk_xprt, task); } /** @@ -761,8 +758,6 @@ void xprt_transmit(struct rpc_task *task) task->tk_status = -ENOTCONN; else if (!req->rq_received) rpc_sleep_on(&xprt->pending, task, NULL, xprt_timer); - - xprt->ops->release_xprt(xprt, task); spin_unlock_bh(&xprt->transport_lock); return; } @@ -772,18 +767,8 @@ void xprt_transmit(struct rpc_task *task) * schedq, and being picked up by a parallel run of rpciod(). */ task->tk_status = status; - - switch (status) { - case -ECONNREFUSED: + if (status == -ECONNREFUSED) rpc_sleep_on(&xprt->sending, task, NULL, NULL); - case -EAGAIN: - case -ENOTCONN: - return; - default: - break; - } - xprt_release_write(xprt, task); - return; } static inline void do_xprt_reserve(struct rpc_task *task) @@ -830,7 +815,7 @@ static inline u32 xprt_alloc_xid(struct rpc_xprt *xprt) static inline void xprt_init_xid(struct rpc_xprt *xprt) { - get_random_bytes(&xprt->xid, sizeof(xprt->xid)); + xprt->xid = net_random(); } static void xprt_request_init(struct rpc_task *task, struct rpc_xprt *xprt) @@ -908,9 +893,8 @@ static struct rpc_xprt *xprt_setup(int proto, struct sockaddr_in *ap, struct rpc struct rpc_xprt *xprt; struct rpc_rqst *req; - if ((xprt = kmalloc(sizeof(struct rpc_xprt), GFP_KERNEL)) == NULL) + if ((xprt = kzalloc(sizeof(struct rpc_xprt), GFP_KERNEL)) == NULL) return ERR_PTR(-ENOMEM); - memset(xprt, 0, sizeof(*xprt)); /* Nnnngh! */ xprt->addr = *ap; diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 4b4e7dfdf..9e300a327 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c @@ -413,6 +413,33 @@ static int xs_tcp_send_request(struct rpc_task *task) return status; } +/** + * xs_tcp_release_xprt - clean up after a tcp transmission + * @xprt: transport + * @task: rpc task + * + * This cleans up if an error causes us to abort the transmission of a request. + * In this case, the socket may need to be reset in order to avoid confusing + * the server. + */ +static void xs_tcp_release_xprt(struct rpc_xprt *xprt, struct rpc_task *task) +{ + struct rpc_rqst *req; + + if (task != xprt->snd_task) + return; + if (task == NULL) + goto out_release; + req = task->tk_rqstp; + if (req->rq_bytes_sent == 0) + goto out_release; + if (req->rq_bytes_sent == req->rq_snd_buf.len) + goto out_release; + set_bit(XPRT_CLOSE_WAIT, &task->tk_xprt->state); +out_release: + xprt_release_xprt(xprt, task); +} + /** * xs_close - close a socket * @xprt: transport @@ -930,6 +957,13 @@ static void xs_udp_timer(struct rpc_task *task) xprt_adjust_cwnd(task, -ETIMEDOUT); } +static unsigned short xs_get_random_port(void) +{ + unsigned short range = xprt_max_resvport - xprt_min_resvport; + unsigned short rand = (unsigned short) net_random() % range; + return rand + xprt_min_resvport; +} + /** * xs_set_port - reset the port number in the remote endpoint address * @xprt: generic transport @@ -970,6 +1004,37 @@ static int xs_bindresvport(struct rpc_xprt *xprt, struct socket *sock) return err; } +#ifdef CONFIG_DEBUG_LOCK_ALLOC +static struct lock_class_key xs_key[2]; +static struct lock_class_key xs_slock_key[2]; + +static inline void xs_reclassify_socket(struct socket *sock) +{ + struct sock *sk = sock->sk; + BUG_ON(sk->sk_lock.owner != NULL); + switch (sk->sk_family) { + case AF_INET: + sock_lock_init_class_and_name(sk, + "slock-AF_INET-NFS", &xs_slock_key[0], + "sk_lock-AF_INET-NFS", &xs_key[0]); + break; + + case AF_INET6: + sock_lock_init_class_and_name(sk, + "slock-AF_INET6-NFS", &xs_slock_key[1], + "sk_lock-AF_INET6-NFS", &xs_key[1]); + break; + + default: + BUG(); + } +} +#else +static inline void xs_reclassify_socket(struct socket *sock) +{ +} +#endif + /** * xs_udp_connect_worker - set up a UDP socket * @args: RPC transport to connect @@ -994,6 +1059,7 @@ static void xs_udp_connect_worker(void *args) dprintk("RPC: can't create UDP transport socket (%d).\n", -err); goto out; } + xs_reclassify_socket(sock); if (xprt->resvport && xs_bindresvport(xprt, sock) < 0) { sock_release(sock); @@ -1076,6 +1142,7 @@ static void xs_tcp_connect_worker(void *args) dprintk("RPC: can't create TCP transport socket (%d).\n", -err); goto out; } + xs_reclassify_socket(sock); if (xprt->resvport && xs_bindresvport(xprt, sock) < 0) { sock_release(sock); @@ -1243,7 +1310,7 @@ static struct rpc_xprt_ops xs_udp_ops = { static struct rpc_xprt_ops xs_tcp_ops = { .reserve_xprt = xprt_reserve_xprt, - .release_xprt = xprt_release_xprt, + .release_xprt = xs_tcp_release_xprt, .set_port = xs_set_port, .connect = xs_connect, .buf_alloc = rpc_malloc, @@ -1269,13 +1336,12 @@ int xs_setup_udp(struct rpc_xprt *xprt, struct rpc_timeout *to) xprt->max_reqs = xprt_udp_slot_table_entries; slot_table_size = xprt->max_reqs * sizeof(xprt->slot[0]); - xprt->slot = kmalloc(slot_table_size, GFP_KERNEL); + xprt->slot = kzalloc(slot_table_size, GFP_KERNEL); if (xprt->slot == NULL) return -ENOMEM; - memset(xprt->slot, 0, slot_table_size); xprt->prot = IPPROTO_UDP; - xprt->port = xprt_max_resvport; + xprt->port = xs_get_random_port(); xprt->tsh_size = 0; xprt->resvport = capable(CAP_NET_BIND_SERVICE) ? 1 : 0; /* XXX: header size can vary due to auth type, IPv6, etc. */ @@ -1311,13 +1377,12 @@ int xs_setup_tcp(struct rpc_xprt *xprt, struct rpc_timeout *to) xprt->max_reqs = xprt_tcp_slot_table_entries; slot_table_size = xprt->max_reqs * sizeof(xprt->slot[0]); - xprt->slot = kmalloc(slot_table_size, GFP_KERNEL); + xprt->slot = kzalloc(slot_table_size, GFP_KERNEL); if (xprt->slot == NULL) return -ENOMEM; - memset(xprt->slot, 0, slot_table_size); xprt->prot = IPPROTO_TCP; - xprt->port = xprt_max_resvport; + xprt->port = xs_get_random_port(); xprt->tsh_size = sizeof(rpc_fraghdr) / sizeof(u32); xprt->resvport = capable(CAP_NET_BIND_SERVICE) ? 1 : 0; xprt->max_payload = RPC_MAX_FRAGMENT_SIZE; diff --git a/net/sysctl_net.c b/net/sysctl_net.c index 58a1b6b42..cd4eafbab 100644 --- a/net/sysctl_net.c +++ b/net/sysctl_net.c @@ -12,7 +12,6 @@ * */ -#include #include #include diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c index 2c4ecbe50..1bb75703f 100644 --- a/net/tipc/bcast.c +++ b/net/tipc/bcast.c @@ -49,13 +49,19 @@ #include "name_table.h" #include "bcast.h" - #define MAX_PKT_DEFAULT_MCAST 1500 /* bcast link max packet size (fixed) */ #define BCLINK_WIN_DEFAULT 20 /* bcast link window size (default) */ #define BCLINK_LOG_BUF_SIZE 0 +/* + * Loss rate for incoming broadcast frames; used to test retransmission code. + * Set to N to cause every N'th frame to be discarded; 0 => don't discard any. + */ + +#define TIPC_BCAST_LOSS_RATE 0 + /** * struct bcbearer_pair - a pair of bearers used by broadcast link * @primary: pointer to primary bearer @@ -75,7 +81,14 @@ struct bcbearer_pair { * @bearer: (non-standard) broadcast bearer structure * @media: (non-standard) broadcast media structure * @bpairs: array of bearer pairs - * @bpairs_temp: array of bearer pairs used during creation of "bpairs" + * @bpairs_temp: temporary array of bearer pairs used by tipc_bcbearer_sort() + * @remains: temporary node map used by tipc_bcbearer_send() + * @remains_new: temporary node map used tipc_bcbearer_send() + * + * Note: The fields labelled "temporary" are incorporated into the bearer + * to avoid consuming potentially limited stack space through the use of + * large local variables within multicast routines. Concurrent access is + * prevented through use of the spinlock "bc_lock". */ struct bcbearer { @@ -83,6 +96,8 @@ struct bcbearer { struct media media; struct bcbearer_pair bpairs[MAX_BEARERS]; struct bcbearer_pair bpairs_temp[TIPC_MAX_LINK_PRI + 1]; + struct node_map remains; + struct node_map remains_new; }; /** @@ -102,7 +117,7 @@ struct bclink { static struct bcbearer *bcbearer = NULL; static struct bclink *bclink = NULL; static struct link *bcl = NULL; -static spinlock_t bc_lock = SPIN_LOCK_UNLOCKED; +static DEFINE_SPINLOCK(bc_lock); char tipc_bclink_name[] = "multicast-link"; @@ -165,21 +180,18 @@ static int bclink_ack_allowed(u32 n) * @after: sequence number of last packet to *not* retransmit * @to: sequence number of last packet to retransmit * - * Called with 'node' locked, bc_lock unlocked + * Called with bc_lock locked */ static void bclink_retransmit_pkt(u32 after, u32 to) { struct sk_buff *buf; - spin_lock_bh(&bc_lock); buf = bcl->first_out; while (buf && less_eq(buf_seqno(buf), after)) { buf = buf->next; } - if (buf != NULL) - tipc_link_retransmit(bcl, buf, mod(to - after)); - spin_unlock_bh(&bc_lock); + tipc_link_retransmit(bcl, buf, mod(to - after)); } /** @@ -346,8 +358,10 @@ static void tipc_bclink_peek_nack(u32 dest, u32 sender_tag, u32 gap_after, u32 g for (; buf; buf = buf->next) { u32 seqno = buf_seqno(buf); - if (mod(seqno - prev) != 1) + if (mod(seqno - prev) != 1) { buf = NULL; + break; + } if (seqno == gap_after) break; prev = seqno; @@ -399,7 +413,10 @@ int tipc_bclink_send_msg(struct sk_buff *buf) */ void tipc_bclink_recv_pkt(struct sk_buff *buf) -{ +{ +#if (TIPC_BCAST_LOSS_RATE) + static int rx_count = 0; +#endif struct tipc_msg *msg = buf_msg(buf); struct node* node = tipc_node_find(msg_prevnode(msg)); u32 next_in; @@ -420,9 +437,13 @@ void tipc_bclink_recv_pkt(struct sk_buff *buf) tipc_node_lock(node); tipc_bclink_acknowledge(node, msg_bcast_ack(msg)); tipc_node_unlock(node); + spin_lock_bh(&bc_lock); bcl->stats.recv_nacks++; + bcl->owner->next = node; /* remember requestor */ bclink_retransmit_pkt(msg_bcgap_after(msg), msg_bcgap_to(msg)); + bcl->owner->next = NULL; + spin_unlock_bh(&bc_lock); } else { tipc_bclink_peek_nack(msg_destnode(msg), msg_bcast_tag(msg), @@ -433,6 +454,14 @@ void tipc_bclink_recv_pkt(struct sk_buff *buf) return; } +#if (TIPC_BCAST_LOSS_RATE) + if (++rx_count == TIPC_BCAST_LOSS_RATE) { + rx_count = 0; + buf_discard(buf); + return; + } +#endif + tipc_node_lock(node); receive: deferred = node->bclink.deferred_head; @@ -531,12 +560,8 @@ static int tipc_bcbearer_send(struct sk_buff *buf, { static int send_count = 0; - struct node_map *remains; - struct node_map *remains_new; - struct node_map *remains_tmp; int bp_index; int swap_time; - int err; /* Prepare buffer for broadcasting (if first time trying to send it) */ @@ -557,9 +582,7 @@ static int tipc_bcbearer_send(struct sk_buff *buf, /* Send buffer over bearers until all targets reached */ - remains = kmalloc(sizeof(struct node_map), GFP_ATOMIC); - remains_new = kmalloc(sizeof(struct node_map), GFP_ATOMIC); - *remains = tipc_cltr_bcast_nodes; + bcbearer->remains = tipc_cltr_bcast_nodes; for (bp_index = 0; bp_index < MAX_BEARERS; bp_index++) { struct bearer *p = bcbearer->bpairs[bp_index].primary; @@ -568,8 +591,8 @@ static int tipc_bcbearer_send(struct sk_buff *buf, if (!p) break; /* no more bearers to try */ - tipc_nmap_diff(remains, &p->nodes, remains_new); - if (remains_new->count == remains->count) + tipc_nmap_diff(&bcbearer->remains, &p->nodes, &bcbearer->remains_new); + if (bcbearer->remains_new.count == bcbearer->remains.count) continue; /* bearer pair doesn't add anything */ if (!p->publ.blocked && @@ -587,27 +610,17 @@ swap: bcbearer->bpairs[bp_index].primary = s; bcbearer->bpairs[bp_index].secondary = p; update: - if (remains_new->count == 0) { - err = TIPC_OK; - goto out; - } + if (bcbearer->remains_new.count == 0) + return TIPC_OK; - /* swap map */ - remains_tmp = remains; - remains = remains_new; - remains_new = remains_tmp; + bcbearer->remains = bcbearer->remains_new; } /* Unable to reach all targets */ bcbearer->bearer.publ.blocked = 1; bcl->stats.bearer_congs++; - err = ~TIPC_OK; - - out: - kfree(remains_new); - kfree(remains); - return err; + return ~TIPC_OK; } /** @@ -765,7 +778,7 @@ int tipc_bclink_init(void) bclink = kmalloc(sizeof(*bclink), GFP_ATOMIC); if (!bcbearer || !bclink) { nomem: - warn("Memory squeeze; Failed to create multicast link\n"); + warn("Multicast link creation failed, no memory\n"); kfree(bcbearer); bcbearer = NULL; kfree(bclink); @@ -783,7 +796,7 @@ int tipc_bclink_init(void) memset(bclink, 0, sizeof(struct bclink)); INIT_LIST_HEAD(&bcl->waiting_ports); bcl->next_out_no = 1; - bclink->node.lock = SPIN_LOCK_UNLOCKED; + spin_lock_init(&bclink->node.lock); bcl->owner = &bclink->node; bcl->max_pkt = MAX_PKT_DEFAULT_MCAST; tipc_link_set_queue_limits(bcl, BCLINK_WIN_DEFAULT); diff --git a/net/tipc/bcast.h b/net/tipc/bcast.h index 0e3be2ab3..b243d9d49 100644 --- a/net/tipc/bcast.h +++ b/net/tipc/bcast.h @@ -180,7 +180,7 @@ static inline void tipc_port_list_add(struct port_list *pl_ptr, u32 port) if (!item->next) { item->next = kmalloc(sizeof(*item), GFP_ATOMIC); if (!item->next) { - warn("Memory squeeze: multicast destination port list is incomplete\n"); + warn("Incomplete multicast delivery, no memory\n"); return; } item->next->next = NULL; diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c index e213a8e54..75a5968c2 100644 --- a/net/tipc/bearer.c +++ b/net/tipc/bearer.c @@ -112,39 +112,42 @@ int tipc_register_media(u32 media_type, goto exit; if (!media_name_valid(name)) { - warn("Media registration error: illegal name <%s>\n", name); + warn("Media <%s> rejected, illegal name\n", name); goto exit; } if (!bcast_addr) { - warn("Media registration error: no broadcast address supplied\n"); + warn("Media <%s> rejected, no broadcast address\n", name); goto exit; } if ((bearer_priority < TIPC_MIN_LINK_PRI) && (bearer_priority > TIPC_MAX_LINK_PRI)) { - warn("Media registration error: priority %u\n", bearer_priority); + warn("Media <%s> rejected, illegal priority (%u)\n", name, + bearer_priority); goto exit; } if ((link_tolerance < TIPC_MIN_LINK_TOL) || (link_tolerance > TIPC_MAX_LINK_TOL)) { - warn("Media registration error: tolerance %u\n", link_tolerance); + warn("Media <%s> rejected, illegal tolerance (%u)\n", name, + link_tolerance); goto exit; } media_id = media_count++; if (media_id >= MAX_MEDIA) { - warn("Attempt to register more than %u media\n", MAX_MEDIA); + warn("Media <%s> rejected, media limit reached (%u)\n", name, + MAX_MEDIA); media_count--; goto exit; } for (i = 0; i < media_id; i++) { if (media_list[i].type_id == media_type) { - warn("Attempt to register second media with type %u\n", + warn("Media <%s> rejected, duplicate type (%u)\n", name, media_type); media_count--; goto exit; } if (!strcmp(name, media_list[i].name)) { - warn("Attempt to re-register media name <%s>\n", name); + warn("Media <%s> rejected, duplicate name\n", name); media_count--; goto exit; } @@ -283,6 +286,9 @@ static struct bearer *bearer_find(const char *name) struct bearer *b_ptr; u32 i; + if (tipc_mode != TIPC_NET_MODE) + return NULL; + for (i = 0, b_ptr = tipc_bearers; i < MAX_BEARERS; i++, b_ptr++) { if (b_ptr->active && (!strcmp(b_ptr->publ.name, name))) return b_ptr; @@ -475,26 +481,33 @@ int tipc_enable_bearer(const char *name, u32 bcast_scope, u32 priority) u32 i; int res = -EINVAL; - if (tipc_mode != TIPC_NET_MODE) + if (tipc_mode != TIPC_NET_MODE) { + warn("Bearer <%s> rejected, not supported in standalone mode\n", + name); return -ENOPROTOOPT; - - if (!bearer_name_validate(name, &b_name) || - !tipc_addr_domain_valid(bcast_scope) || - !in_scope(bcast_scope, tipc_own_addr)) + } + if (!bearer_name_validate(name, &b_name)) { + warn("Bearer <%s> rejected, illegal name\n", name); return -EINVAL; - + } + if (!tipc_addr_domain_valid(bcast_scope) || + !in_scope(bcast_scope, tipc_own_addr)) { + warn("Bearer <%s> rejected, illegal broadcast scope\n", name); + return -EINVAL; + } if ((priority < TIPC_MIN_LINK_PRI || priority > TIPC_MAX_LINK_PRI) && - (priority != TIPC_MEDIA_LINK_PRI)) + (priority != TIPC_MEDIA_LINK_PRI)) { + warn("Bearer <%s> rejected, illegal priority\n", name); return -EINVAL; + } write_lock_bh(&tipc_net_lock); - if (!tipc_bearers) - goto failed; m_ptr = media_find(b_name.media_name); if (!m_ptr) { - warn("No media <%s>\n", b_name.media_name); + warn("Bearer <%s> rejected, media <%s> not registered\n", name, + b_name.media_name); goto failed; } @@ -510,23 +523,24 @@ restart: continue; } if (!strcmp(name, tipc_bearers[i].publ.name)) { - warn("Bearer <%s> already enabled\n", name); + warn("Bearer <%s> rejected, already enabled\n", name); goto failed; } if ((tipc_bearers[i].priority == priority) && (++with_this_prio > 2)) { if (priority-- == 0) { - warn("Third bearer <%s> with priority %u, unable to lower to %u\n", - name, priority + 1, priority); + warn("Bearer <%s> rejected, duplicate priority\n", + name); goto failed; } - warn("Third bearer <%s> with priority %u, lowering to %u\n", + warn("Bearer <%s> priority adjustment required %u->%u\n", name, priority + 1, priority); goto restart; } } if (bearer_id >= MAX_BEARERS) { - warn("Attempt to enable more than %d bearers\n", MAX_BEARERS); + warn("Bearer <%s> rejected, bearer limit reached (%u)\n", + name, MAX_BEARERS); goto failed; } @@ -536,7 +550,7 @@ restart: strcpy(b_ptr->publ.name, name); res = m_ptr->enable_bearer(&b_ptr->publ); if (res) { - warn("Failed to enable bearer <%s>\n", name); + warn("Bearer <%s> rejected, enable failure (%d)\n", name, -res); goto failed; } @@ -552,7 +566,7 @@ restart: b_ptr->link_req = tipc_disc_init_link_req(b_ptr, &m_ptr->bcast_addr, bcast_scope, 2); } - b_ptr->publ.lock = SPIN_LOCK_UNLOCKED; + spin_lock_init(&b_ptr->publ.lock); write_unlock_bh(&tipc_net_lock); info("Enabled bearer <%s>, discovery domain %s, priority %u\n", name, addr_string_fill(addr_string, bcast_scope), priority); @@ -573,9 +587,6 @@ int tipc_block_bearer(const char *name) struct link *l_ptr; struct link *temp_l_ptr; - if (tipc_mode != TIPC_NET_MODE) - return -ENOPROTOOPT; - read_lock_bh(&tipc_net_lock); b_ptr = bearer_find(name); if (!b_ptr) { @@ -584,6 +595,7 @@ int tipc_block_bearer(const char *name) return -EINVAL; } + info("Blocking bearer <%s>\n", name); spin_lock_bh(&b_ptr->publ.lock); b_ptr->publ.blocked = 1; list_for_each_entry_safe(l_ptr, temp_l_ptr, &b_ptr->links, link_list) { @@ -595,7 +607,6 @@ int tipc_block_bearer(const char *name) } spin_unlock_bh(&b_ptr->publ.lock); read_unlock_bh(&tipc_net_lock); - info("Blocked bearer <%s>\n", name); return TIPC_OK; } @@ -611,15 +622,13 @@ static int bearer_disable(const char *name) struct link *l_ptr; struct link *temp_l_ptr; - if (tipc_mode != TIPC_NET_MODE) - return -ENOPROTOOPT; - b_ptr = bearer_find(name); if (!b_ptr) { warn("Attempt to disable unknown bearer <%s>\n", name); return -EINVAL; } + info("Disabling bearer <%s>\n", name); tipc_disc_stop_link_req(b_ptr->link_req); spin_lock_bh(&b_ptr->publ.lock); b_ptr->link_req = NULL; @@ -635,7 +644,6 @@ static int bearer_disable(const char *name) tipc_link_delete(l_ptr); } spin_unlock_bh(&b_ptr->publ.lock); - info("Disabled bearer <%s>\n", name); memset(b_ptr, 0, sizeof(struct bearer)); return TIPC_OK; } @@ -657,11 +665,9 @@ int tipc_bearer_init(void) int res; write_lock_bh(&tipc_net_lock); - tipc_bearers = kmalloc(MAX_BEARERS * sizeof(struct bearer), GFP_ATOMIC); - media_list = kmalloc(MAX_MEDIA * sizeof(struct media), GFP_ATOMIC); + tipc_bearers = kcalloc(MAX_BEARERS, sizeof(struct bearer), GFP_ATOMIC); + media_list = kcalloc(MAX_MEDIA, sizeof(struct media), GFP_ATOMIC); if (tipc_bearers && media_list) { - memset(tipc_bearers, 0, MAX_BEARERS * sizeof(struct bearer)); - memset(media_list, 0, MAX_MEDIA * sizeof(struct media)); res = TIPC_OK; } else { kfree(tipc_bearers); diff --git a/net/tipc/cluster.c b/net/tipc/cluster.c index 1aed81584..b46b5188a 100644 --- a/net/tipc/cluster.c +++ b/net/tipc/cluster.c @@ -57,43 +57,43 @@ struct cluster *tipc_cltr_create(u32 addr) struct _zone *z_ptr; struct cluster *c_ptr; int max_nodes; - int alloc; - c_ptr = (struct cluster *)kmalloc(sizeof(*c_ptr), GFP_ATOMIC); - if (c_ptr == NULL) + c_ptr = kzalloc(sizeof(*c_ptr), GFP_ATOMIC); + if (c_ptr == NULL) { + warn("Cluster creation failure, no memory\n"); return NULL; - memset(c_ptr, 0, sizeof(*c_ptr)); + } c_ptr->addr = tipc_addr(tipc_zone(addr), tipc_cluster(addr), 0); if (in_own_cluster(addr)) max_nodes = LOWEST_SLAVE + tipc_max_slaves; else max_nodes = tipc_max_nodes + 1; - alloc = sizeof(void *) * (max_nodes + 1); - c_ptr->nodes = (struct node **)kmalloc(alloc, GFP_ATOMIC); + + c_ptr->nodes = kcalloc(max_nodes + 1, sizeof(void*), GFP_ATOMIC); if (c_ptr->nodes == NULL) { + warn("Cluster creation failure, no memory for node area\n"); kfree(c_ptr); return NULL; } - memset(c_ptr->nodes, 0, alloc); + if (in_own_cluster(addr)) tipc_local_nodes = c_ptr->nodes; c_ptr->highest_slave = LOWEST_SLAVE - 1; c_ptr->highest_node = 0; z_ptr = tipc_zone_find(tipc_zone(addr)); - if (z_ptr == NULL) { + if (!z_ptr) { z_ptr = tipc_zone_create(addr); } - if (z_ptr != NULL) { - tipc_zone_attach_cluster(z_ptr, c_ptr); - c_ptr->owner = z_ptr; - } - else { + if (!z_ptr) { + kfree(c_ptr->nodes); kfree(c_ptr); - c_ptr = NULL; + return NULL; } + tipc_zone_attach_cluster(z_ptr, c_ptr); + c_ptr->owner = z_ptr; return c_ptr; } diff --git a/net/tipc/config.c b/net/tipc/config.c index 48b5de2db..285e1bc2d 100644 --- a/net/tipc/config.c +++ b/net/tipc/config.c @@ -63,7 +63,7 @@ struct manager { static struct manager mng = { 0}; -static spinlock_t config_lock = SPIN_LOCK_UNLOCKED; +static DEFINE_SPINLOCK(config_lock); static const void *req_tlv_area; /* request message TLV area */ static int req_tlv_space; /* request message TLV area size */ @@ -291,13 +291,22 @@ static struct sk_buff *cfg_set_own_addr(void) if (!tipc_addr_node_valid(addr)) return tipc_cfg_reply_error_string(TIPC_CFG_INVALID_VALUE " (node address)"); - if (tipc_own_addr) + if (tipc_mode == TIPC_NET_MODE) return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED " (cannot change node address once assigned)"); + tipc_own_addr = addr; + + /* + * Must release all spinlocks before calling start_net() because + * Linux version of TIPC calls eth_media_start() which calls + * register_netdevice_notifier() which may block! + * + * Temporarily releasing the lock should be harmless for non-Linux TIPC, + * but Linux version of eth_media_start() should really be reworked + * so that it can be called with spinlocks held. + */ spin_unlock_bh(&config_lock); - tipc_core_stop_net(); - tipc_own_addr = addr; tipc_core_start_net(); spin_lock_bh(&config_lock); return tipc_cfg_reply_none(); @@ -350,50 +359,21 @@ static struct sk_buff *cfg_set_max_subscriptions(void) static struct sk_buff *cfg_set_max_ports(void) { - int orig_mode; u32 value; if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_UNSIGNED)) return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR); value = *(u32 *)TLV_DATA(req_tlv_area); value = ntohl(value); + if (value == tipc_max_ports) + return tipc_cfg_reply_none(); if (value != delimit(value, 127, 65535)) return tipc_cfg_reply_error_string(TIPC_CFG_INVALID_VALUE " (max ports must be 127-65535)"); - - if (value == tipc_max_ports) - return tipc_cfg_reply_none(); - - if (atomic_read(&tipc_user_count) > 2) + if (tipc_mode != TIPC_NOT_RUNNING) return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED - " (cannot change max ports while TIPC users exist)"); - - spin_unlock_bh(&config_lock); - orig_mode = tipc_get_mode(); - if (orig_mode == TIPC_NET_MODE) - tipc_core_stop_net(); - tipc_core_stop(); + " (cannot change max ports while TIPC is active)"); tipc_max_ports = value; - tipc_core_start(); - if (orig_mode == TIPC_NET_MODE) - tipc_core_start_net(); - spin_lock_bh(&config_lock); - return tipc_cfg_reply_none(); -} - -static struct sk_buff *set_net_max(int value, int *parameter) -{ - int orig_mode; - - if (value != *parameter) { - orig_mode = tipc_get_mode(); - if (orig_mode == TIPC_NET_MODE) - tipc_core_stop_net(); - *parameter = value; - if (orig_mode == TIPC_NET_MODE) - tipc_core_start_net(); - } - return tipc_cfg_reply_none(); } @@ -405,10 +385,16 @@ static struct sk_buff *cfg_set_max_zones(void) return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR); value = *(u32 *)TLV_DATA(req_tlv_area); value = ntohl(value); + if (value == tipc_max_zones) + return tipc_cfg_reply_none(); if (value != delimit(value, 1, 255)) return tipc_cfg_reply_error_string(TIPC_CFG_INVALID_VALUE " (max zones must be 1-255)"); - return set_net_max(value, &tipc_max_zones); + if (tipc_mode == TIPC_NET_MODE) + return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED + " (cannot change max zones once TIPC has joined a network)"); + tipc_max_zones = value; + return tipc_cfg_reply_none(); } static struct sk_buff *cfg_set_max_clusters(void) @@ -419,8 +405,8 @@ static struct sk_buff *cfg_set_max_clusters(void) return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR); value = *(u32 *)TLV_DATA(req_tlv_area); value = ntohl(value); - if (value != 1) - return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED + if (value != delimit(value, 1, 1)) + return tipc_cfg_reply_error_string(TIPC_CFG_INVALID_VALUE " (max clusters fixed at 1)"); return tipc_cfg_reply_none(); } @@ -433,10 +419,16 @@ static struct sk_buff *cfg_set_max_nodes(void) return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR); value = *(u32 *)TLV_DATA(req_tlv_area); value = ntohl(value); + if (value == tipc_max_nodes) + return tipc_cfg_reply_none(); if (value != delimit(value, 8, 2047)) return tipc_cfg_reply_error_string(TIPC_CFG_INVALID_VALUE " (max nodes must be 8-2047)"); - return set_net_max(value, &tipc_max_nodes); + if (tipc_mode == TIPC_NET_MODE) + return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED + " (cannot change max nodes once TIPC has joined a network)"); + tipc_max_nodes = value; + return tipc_cfg_reply_none(); } static struct sk_buff *cfg_set_max_slaves(void) @@ -461,15 +453,16 @@ static struct sk_buff *cfg_set_netid(void) return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR); value = *(u32 *)TLV_DATA(req_tlv_area); value = ntohl(value); + if (value == tipc_net_id) + return tipc_cfg_reply_none(); if (value != delimit(value, 1, 9999)) return tipc_cfg_reply_error_string(TIPC_CFG_INVALID_VALUE " (network id must be 1-9999)"); - - if (tipc_own_addr) + if (tipc_mode == TIPC_NET_MODE) return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED - " (cannot change network id once part of network)"); - - return set_net_max(value, &tipc_net_id); + " (cannot change network id once TIPC has joined a network)"); + tipc_net_id = value; + return tipc_cfg_reply_none(); } struct sk_buff *tipc_cfg_do_cmd(u32 orig_node, u16 cmd, const void *request_area, @@ -649,7 +642,7 @@ static void cfg_named_msg_event(void *userdata, if ((size < sizeof(*req_hdr)) || (size != TCM_ALIGN(ntohl(req_hdr->tcm_len))) || (ntohs(req_hdr->tcm_flags) != TCM_F_REQUEST)) { - warn("discarded invalid configuration message\n"); + warn("Invalid configuration message discarded\n"); return; } diff --git a/net/tipc/core.c b/net/tipc/core.c index 3d0a8ee4e..0539a8362 100644 --- a/net/tipc/core.c +++ b/net/tipc/core.c @@ -2,7 +2,7 @@ * net/tipc/core.c: TIPC module code * * Copyright (c) 2003-2006, Ericsson AB - * Copyright (c) 2005, Wind River Systems + * Copyright (c) 2005-2006, Wind River Systems * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -57,7 +57,7 @@ void tipc_socket_stop(void); int tipc_netlink_start(void); void tipc_netlink_stop(void); -#define MOD_NAME "tipc_start: " +#define TIPC_MOD_VER "1.6.1" #ifndef CONFIG_TIPC_ZONES #define CONFIG_TIPC_ZONES 3 @@ -191,14 +191,15 @@ static int __init tipc_init(void) int res; tipc_log_reinit(CONFIG_TIPC_LOG); - info("Activated (compiled " __DATE__ " " __TIME__ ")\n"); + info("Activated (version " TIPC_MOD_VER + " compiled " __DATE__ " " __TIME__ ")\n"); tipc_own_addr = 0; tipc_remote_management = 1; tipc_max_publications = 10000; tipc_max_subscriptions = 2000; tipc_max_ports = delimit(CONFIG_TIPC_PORTS, 127, 65536); - tipc_max_zones = delimit(CONFIG_TIPC_ZONES, 1, 511); + tipc_max_zones = delimit(CONFIG_TIPC_ZONES, 1, 255); tipc_max_clusters = delimit(CONFIG_TIPC_CLUSTERS, 1, 1); tipc_max_nodes = delimit(CONFIG_TIPC_NODES, 8, 2047); tipc_max_slaves = delimit(CONFIG_TIPC_SLAVE_NODES, 0, 2047); @@ -224,6 +225,7 @@ module_exit(tipc_exit); MODULE_DESCRIPTION("TIPC: Transparent Inter Process Communication"); MODULE_LICENSE("Dual BSD/GPL"); +MODULE_VERSION(TIPC_MOD_VER); /* Native TIPC API for kernel-space applications (see tipc.h) */ diff --git a/net/tipc/core.h b/net/tipc/core.h index 1f2e8b27a..762aac257 100644 --- a/net/tipc/core.h +++ b/net/tipc/core.h @@ -2,7 +2,7 @@ * net/tipc/core.h: Include file for TIPC global declarations * * Copyright (c) 2005-2006, Ericsson AB - * Copyright (c) 2005, Wind River Systems + * Copyright (c) 2005-2006, Wind River Systems * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -111,10 +111,6 @@ void tipc_dump(struct print_buf*,const char *fmt, ...); #else -#ifndef DBG_OUTPUT -#define DBG_OUTPUT NULL -#endif - /* * TIPC debug support not included: * - system messages are printed to system console @@ -129,6 +125,19 @@ void tipc_dump(struct print_buf*,const char *fmt, ...); #define msg_dbg(msg,txt) do {} while (0) #define dump(fmt,arg...) do {} while (0) + +/* + * TIPC_OUTPUT is defined to be the system console, while DBG_OUTPUT is + * the null print buffer. Thes ensures that any system or debug messages + * that are generated without using the above macros are handled correctly. + */ + +#undef TIPC_OUTPUT +#define TIPC_OUTPUT TIPC_CONS + +#undef DBG_OUTPUT +#define DBG_OUTPUT NULL + #endif @@ -288,7 +297,10 @@ static inline struct tipc_msg *buf_msg(struct sk_buff *skb) * buf_acquire - creates a TIPC message buffer * @size: message size (including TIPC header) * - * Returns a new buffer. Space is reserved for a data link header. + * Returns a new buffer with data pointers set to the specified size. + * + * NOTE: Headroom is reserved to allow prepending of a data link header. + * There may also be unrequested tailroom present at the buffer's end. */ static inline struct sk_buff *buf_acquire(u32 size) @@ -309,7 +321,7 @@ static inline struct sk_buff *buf_acquire(u32 size) * buf_discard - frees a TIPC message buffer * @skb: message buffer * - * Frees a new buffer. If passed NULL, just returns. + * Frees a message buffer. If passed NULL, just returns. */ static inline void buf_discard(struct sk_buff *skb) diff --git a/net/tipc/dbg.c b/net/tipc/dbg.c index 26ef95d5f..55130655e 100644 --- a/net/tipc/dbg.c +++ b/net/tipc/dbg.c @@ -41,7 +41,7 @@ #define MAX_STRING 512 static char print_string[MAX_STRING]; -static spinlock_t print_lock = SPIN_LOCK_UNLOCKED; +static DEFINE_SPINLOCK(print_lock); static struct print_buf cons_buf = { NULL, 0, NULL, NULL }; struct print_buf *TIPC_CONS = &cons_buf; diff --git a/net/tipc/discover.c b/net/tipc/discover.c index 92601385e..ee94de92a 100644 --- a/net/tipc/discover.c +++ b/net/tipc/discover.c @@ -2,7 +2,7 @@ * net/tipc/discover.c * * Copyright (c) 2003-2006, Ericsson AB - * Copyright (c) 2005, Wind River Systems + * Copyright (c) 2005-2006, Wind River Systems * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -176,7 +176,6 @@ void tipc_disc_recv_msg(struct sk_buff *buf) n_ptr = tipc_node_create(orig); } if (n_ptr == NULL) { - warn("Memory squeeze; Failed to create node\n"); return; } spin_lock_bh(&n_ptr->lock); @@ -191,10 +190,8 @@ void tipc_disc_recv_msg(struct sk_buff *buf) } addr = &link->media_addr; if (memcmp(addr, &media_addr, sizeof(*addr))) { - char addr_string[16]; - - warn("New bearer address for %s\n", - addr_string_fill(addr_string, orig)); + warn("Resetting link <%s>, peer interface address changed\n", + link->name); memcpy(addr, &media_addr, sizeof(*addr)); tipc_link_reset(link); } @@ -270,8 +267,8 @@ static void disc_timeout(struct link_req *req) /* leave timer interval "as is" if already at a "normal" rate */ } else { req->timer_intv *= 2; - if (req->timer_intv > TIPC_LINK_REQ_SLOW) - req->timer_intv = TIPC_LINK_REQ_SLOW; + if (req->timer_intv > TIPC_LINK_REQ_FAST) + req->timer_intv = TIPC_LINK_REQ_FAST; if ((req->timer_intv == TIPC_LINK_REQ_FAST) && (req->bearer->nodes.count)) req->timer_intv = TIPC_LINK_REQ_SLOW; @@ -298,7 +295,7 @@ struct link_req *tipc_disc_init_link_req(struct bearer *b_ptr, { struct link_req *req; - req = (struct link_req *)kmalloc(sizeof(*req), GFP_ATOMIC); + req = kmalloc(sizeof(*req), GFP_ATOMIC); if (!req) return NULL; diff --git a/net/tipc/eth_media.c b/net/tipc/eth_media.c index 7a252785f..682da4a28 100644 --- a/net/tipc/eth_media.c +++ b/net/tipc/eth_media.c @@ -2,7 +2,7 @@ * net/tipc/eth_media.c: Ethernet bearer support for TIPC * * Copyright (c) 2001-2006, Ericsson AB - * Copyright (c) 2005, Wind River Systems + * Copyright (c) 2005-2006, Wind River Systems * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -98,17 +98,19 @@ static int recv_msg(struct sk_buff *buf, struct net_device *dev, u32 size; if (likely(eb_ptr->bearer)) { - size = msg_size((struct tipc_msg *)buf->data); - skb_trim(buf, size); - if (likely(buf->len == size)) { - buf->next = NULL; - tipc_recv_msg(buf, eb_ptr->bearer); - } else { - kfree_skb(buf); + if (likely(!dev->promiscuity) || + !memcmp(buf->mac.raw,dev->dev_addr,ETH_ALEN) || + !memcmp(buf->mac.raw,dev->broadcast,ETH_ALEN)) { + size = msg_size((struct tipc_msg *)buf->data); + skb_trim(buf, size); + if (likely(buf->len == size)) { + buf->next = NULL; + tipc_recv_msg(buf, eb_ptr->bearer); + return TIPC_OK; + } } - } else { - kfree_skb(buf); } + kfree_skb(buf); return TIPC_OK; } @@ -125,8 +127,7 @@ static int enable_bearer(struct tipc_bearer *tb_ptr) /* Find device with specified name */ - while (dev && dev->name && - (memcmp(dev->name, driver_name, strlen(dev->name)))) { + while (dev && dev->name && strncmp(dev->name, driver_name, IFNAMSIZ)) { dev = dev->next; } if (!dev) @@ -252,7 +253,9 @@ int tipc_eth_media_start(void) if (eth_started) return -EINVAL; - memset(&bcast_addr, 0xff, sizeof(bcast_addr)); + bcast_addr.type = htonl(TIPC_MEDIA_TYPE_ETH); + memset(&bcast_addr.dev_addr, 0xff, ETH_ALEN); + memset(eth_bearers, 0, sizeof(eth_bearers)); res = tipc_register_media(TIPC_MEDIA_TYPE_ETH, "eth", diff --git a/net/tipc/handler.c b/net/tipc/handler.c index 966f70a1b..ae6ddf00a 100644 --- a/net/tipc/handler.c +++ b/net/tipc/handler.c @@ -44,7 +44,7 @@ struct queue_item { static kmem_cache_t *tipc_queue_item_cache; static struct list_head signal_queue_head; -static spinlock_t qitem_lock = SPIN_LOCK_UNLOCKED; +static DEFINE_SPINLOCK(qitem_lock); static int handler_enabled = 0; static void process_signal_queue(unsigned long dummy); diff --git a/net/tipc/link.c b/net/tipc/link.c index 784b24b6d..693f02eca 100644 --- a/net/tipc/link.c +++ b/net/tipc/link.c @@ -2,7 +2,7 @@ * net/tipc/link.c: TIPC link code * * Copyright (c) 1996-2006, Ericsson AB - * Copyright (c) 2004-2005, Wind River Systems + * Copyright (c) 2004-2006, Wind River Systems * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -417,12 +417,11 @@ struct link *tipc_link_create(struct bearer *b_ptr, const u32 peer, struct tipc_msg *msg; char *if_name; - l_ptr = (struct link *)kmalloc(sizeof(*l_ptr), GFP_ATOMIC); + l_ptr = kzalloc(sizeof(*l_ptr), GFP_ATOMIC); if (!l_ptr) { - warn("Memory squeeze; Failed to create link\n"); + warn("Link creation failed, no memory\n"); return NULL; } - memset(l_ptr, 0, sizeof(*l_ptr)); l_ptr->addr = peer; if_name = strchr(b_ptr->publ.name, ':') + 1; @@ -469,7 +468,7 @@ struct link *tipc_link_create(struct bearer *b_ptr, const u32 peer, if (!pb) { kfree(l_ptr); - warn("Memory squeeze; Failed to create link\n"); + warn("Link creation failed, no memory for print buffer\n"); return NULL; } tipc_printbuf_init(&l_ptr->print_buf, pb, LINK_LOG_BUF_SIZE); @@ -574,7 +573,6 @@ void tipc_link_wakeup_ports(struct link *l_ptr, int all) break; list_del_init(&p_ptr->wait_list); p_ptr->congested_link = NULL; - assert(p_ptr->wakeup); spin_lock_bh(p_ptr->publ.lock); p_ptr->publ.congested = 0; p_ptr->wakeup(&p_ptr->publ); @@ -691,6 +689,7 @@ void tipc_link_reset(struct link *l_ptr) struct sk_buff *buf; u32 prev_state = l_ptr->state; u32 checkpoint = l_ptr->next_in_no; + int was_active_link = tipc_link_is_active(l_ptr); msg_set_session(l_ptr->pmsg, msg_session(l_ptr->pmsg) + 1); @@ -712,7 +711,7 @@ void tipc_link_reset(struct link *l_ptr) tipc_printf(TIPC_CONS, "\nReset link <%s>\n", l_ptr->name); dbg_link_dump(); #endif - if (tipc_node_has_active_links(l_ptr->owner) && + if (was_active_link && tipc_node_has_active_links(l_ptr->owner) && l_ptr->owner->permit_changeover) { l_ptr->reset_checkpoint = checkpoint; l_ptr->exp_msg_count = START_CHANGEOVER; @@ -755,7 +754,7 @@ void tipc_link_reset(struct link *l_ptr) static void link_activate(struct link *l_ptr) { - l_ptr->next_in_no = 1; + l_ptr->next_in_no = l_ptr->stats.recv_info = 1; tipc_node_link_up(l_ptr->owner, l_ptr); tipc_bearer_add_dest(l_ptr->b_ptr, l_ptr->addr); link_send_event(tipc_cfg_link_event, l_ptr, 1); @@ -820,6 +819,8 @@ static void link_state_event(struct link *l_ptr, unsigned event) break; case RESET_MSG: dbg_link("RES -> RR\n"); + info("Resetting link <%s>, requested by peer\n", + l_ptr->name); tipc_link_reset(l_ptr); l_ptr->state = RESET_RESET; l_ptr->fsm_msg_cnt = 0; @@ -844,6 +845,8 @@ static void link_state_event(struct link *l_ptr, unsigned event) break; case RESET_MSG: dbg_link("RES -> RR\n"); + info("Resetting link <%s>, requested by peer " + "while probing\n", l_ptr->name); tipc_link_reset(l_ptr); l_ptr->state = RESET_RESET; l_ptr->fsm_msg_cnt = 0; @@ -875,6 +878,8 @@ static void link_state_event(struct link *l_ptr, unsigned event) } else { /* Link has failed */ dbg_link("-> RU (%u probes unanswered)\n", l_ptr->fsm_msg_cnt); + warn("Resetting link <%s>, peer not responding\n", + l_ptr->name); tipc_link_reset(l_ptr); l_ptr->state = RESET_UNKNOWN; l_ptr->fsm_msg_cnt = 0; @@ -982,17 +987,20 @@ static int link_bundle_buf(struct link *l_ptr, struct tipc_msg *bundler_msg = buf_msg(bundler); struct tipc_msg *msg = buf_msg(buf); u32 size = msg_size(msg); - u32 to_pos = align(msg_size(bundler_msg)); - u32 rest = link_max_pkt(l_ptr) - to_pos; + u32 bundle_size = msg_size(bundler_msg); + u32 to_pos = align(bundle_size); + u32 pad = to_pos - bundle_size; if (msg_user(bundler_msg) != MSG_BUNDLER) return 0; if (msg_type(bundler_msg) != OPEN_MSG) return 0; - if (rest < align(size)) + if (skb_tailroom(bundler) < (pad + size)) + return 0; + if (link_max_pkt(l_ptr) < (to_pos + size)) return 0; - skb_put(bundler, (to_pos - msg_size(bundler_msg)) + size); + skb_put(bundler, pad + size); memcpy(bundler->data + to_pos, buf->data, size); msg_set_size(bundler_msg, to_pos + size); msg_set_msgcnt(bundler_msg, msg_msgcnt(bundler_msg) + 1); @@ -1050,7 +1058,7 @@ int tipc_link_send_buf(struct link *l_ptr, struct sk_buff *buf) msg_dbg(msg, "TIPC: Congestion, throwing away\n"); buf_discard(buf); if (imp > CONN_MANAGER) { - warn("Resetting <%s>, send queue full", l_ptr->name); + warn("Resetting link <%s>, send queue full", l_ptr->name); tipc_link_reset(l_ptr); } return dsz; @@ -1135,9 +1143,13 @@ int tipc_link_send(struct sk_buff *buf, u32 dest, u32 selector) if (n_ptr) { tipc_node_lock(n_ptr); l_ptr = n_ptr->active_links[selector & 1]; - dbg("tipc_link_send: found link %x for dest %x\n", l_ptr, dest); if (l_ptr) { + dbg("tipc_link_send: found link %x for dest %x\n", l_ptr, dest); res = tipc_link_send_buf(l_ptr, buf); + } else { + dbg("Attempt to send msg to unreachable node:\n"); + msg_dbg(buf_msg(buf),">>>"); + buf_discard(buf); } tipc_node_unlock(n_ptr); } else { @@ -1242,8 +1254,6 @@ int tipc_link_send_sections_fast(struct port *sender, int res; u32 selector = msg_origport(hdr) & 1; - assert(destaddr != tipc_own_addr); - again: /* * Try building message using port's max_pkt hint. @@ -1604,40 +1614,121 @@ void tipc_link_push_queue(struct link *l_ptr) tipc_bearer_schedule(l_ptr->b_ptr, l_ptr); } +static void link_reset_all(unsigned long addr) +{ + struct node *n_ptr; + char addr_string[16]; + u32 i; + + read_lock_bh(&tipc_net_lock); + n_ptr = tipc_node_find((u32)addr); + if (!n_ptr) { + read_unlock_bh(&tipc_net_lock); + return; /* node no longer exists */ + } + + tipc_node_lock(n_ptr); + + warn("Resetting all links to %s\n", + addr_string_fill(addr_string, n_ptr->addr)); + + for (i = 0; i < MAX_BEARERS; i++) { + if (n_ptr->links[i]) { + link_print(n_ptr->links[i], TIPC_OUTPUT, + "Resetting link\n"); + tipc_link_reset(n_ptr->links[i]); + } + } + + tipc_node_unlock(n_ptr); + read_unlock_bh(&tipc_net_lock); +} + +static void link_retransmit_failure(struct link *l_ptr, struct sk_buff *buf) +{ + struct tipc_msg *msg = buf_msg(buf); + + warn("Retransmission failure on link <%s>\n", l_ptr->name); + tipc_msg_print(TIPC_OUTPUT, msg, ">RETR-FAIL>"); + + if (l_ptr->addr) { + + /* Handle failure on standard link */ + + link_print(l_ptr, TIPC_OUTPUT, "Resetting link\n"); + tipc_link_reset(l_ptr); + + } else { + + /* Handle failure on broadcast link */ + + struct node *n_ptr; + char addr_string[16]; + + tipc_printf(TIPC_OUTPUT, "Msg seq number: %u, ", msg_seqno(msg)); + tipc_printf(TIPC_OUTPUT, "Outstanding acks: %u\n", (u32)TIPC_SKB_CB(buf)->handle); + + n_ptr = l_ptr->owner->next; + tipc_node_lock(n_ptr); + + addr_string_fill(addr_string, n_ptr->addr); + tipc_printf(TIPC_OUTPUT, "Multicast link info for %s\n", addr_string); + tipc_printf(TIPC_OUTPUT, "Supported: %d, ", n_ptr->bclink.supported); + tipc_printf(TIPC_OUTPUT, "Acked: %u\n", n_ptr->bclink.acked); + tipc_printf(TIPC_OUTPUT, "Last in: %u, ", n_ptr->bclink.last_in); + tipc_printf(TIPC_OUTPUT, "Gap after: %u, ", n_ptr->bclink.gap_after); + tipc_printf(TIPC_OUTPUT, "Gap to: %u\n", n_ptr->bclink.gap_to); + tipc_printf(TIPC_OUTPUT, "Nack sync: %u\n\n", n_ptr->bclink.nack_sync); + + tipc_k_signal((Handler)link_reset_all, (unsigned long)n_ptr->addr); + + tipc_node_unlock(n_ptr); + + l_ptr->stale_count = 0; + } +} + void tipc_link_retransmit(struct link *l_ptr, struct sk_buff *buf, u32 retransmits) { struct tipc_msg *msg; + if (!buf) + return; + + msg = buf_msg(buf); + dbg("Retransmitting %u in link %x\n", retransmits, l_ptr); - if (tipc_bearer_congested(l_ptr->b_ptr, l_ptr) && buf && !skb_cloned(buf)) { - msg_dbg(buf_msg(buf), ">NO_RETR->BCONG>"); - dbg_print_link(l_ptr, " "); - l_ptr->retransm_queue_head = msg_seqno(buf_msg(buf)); - l_ptr->retransm_queue_size = retransmits; - return; + if (tipc_bearer_congested(l_ptr->b_ptr, l_ptr)) { + if (!skb_cloned(buf)) { + msg_dbg(msg, ">NO_RETR->BCONG>"); + dbg_print_link(l_ptr, " "); + l_ptr->retransm_queue_head = msg_seqno(msg); + l_ptr->retransm_queue_size = retransmits; + return; + } else { + /* Don't retransmit if driver already has the buffer */ + } + } else { + /* Detect repeated retransmit failures on uncongested bearer */ + + if (l_ptr->last_retransmitted == msg_seqno(msg)) { + if (++l_ptr->stale_count > 100) { + link_retransmit_failure(l_ptr, buf); + return; + } + } else { + l_ptr->last_retransmitted = msg_seqno(msg); + l_ptr->stale_count = 1; + } } + while (retransmits && (buf != l_ptr->next_out) && buf && !skb_cloned(buf)) { msg = buf_msg(buf); msg_set_ack(msg, mod(l_ptr->next_in_no - 1)); msg_set_bcast_ack(msg, l_ptr->owner->bclink.last_in); if (tipc_bearer_send(l_ptr->b_ptr, buf, &l_ptr->media_addr)) { - /* Catch if retransmissions fail repeatedly: */ - if (l_ptr->last_retransmitted == msg_seqno(msg)) { - if (++l_ptr->stale_count > 100) { - tipc_msg_print(TIPC_CONS, buf_msg(buf), ">RETR>"); - info("...Retransmitted %u times\n", - l_ptr->stale_count); - link_print(l_ptr, TIPC_CONS, "Resetting Link\n"); - tipc_link_reset(l_ptr); - break; - } - } else { - l_ptr->stale_count = 0; - } - l_ptr->last_retransmitted = msg_seqno(msg); - msg_dbg(buf_msg(buf), ">RETR>"); buf = buf->next; retransmits--; @@ -1650,6 +1741,7 @@ void tipc_link_retransmit(struct link *l_ptr, struct sk_buff *buf, return; } } + l_ptr->retransm_queue_head = l_ptr->retransm_queue_size = 0; } @@ -1720,6 +1812,11 @@ void tipc_recv_msg(struct sk_buff *head, struct tipc_bearer *tb_ptr) link_recv_non_seq(buf); continue; } + + if (unlikely(!msg_short(msg) && + (msg_destnode(msg) != tipc_own_addr))) + goto cont; + n_ptr = tipc_node_find(msg_prevnode(msg)); if (unlikely(!n_ptr)) goto cont; @@ -2140,7 +2237,7 @@ static void link_recv_proto_msg(struct link *l_ptr, struct sk_buff *buf) if (msg_linkprio(msg) && (msg_linkprio(msg) != l_ptr->priority)) { - warn("Changing prio <%s>: %u->%u\n", + warn("Resetting link <%s>, priority change %u->%u\n", l_ptr->name, l_ptr->priority, msg_linkprio(msg)); l_ptr->priority = msg_linkprio(msg); tipc_link_reset(l_ptr); /* Enforce change to take effect */ @@ -2209,17 +2306,22 @@ void tipc_link_tunnel(struct link *l_ptr, u32 length = msg_size(msg); tunnel = l_ptr->owner->active_links[selector & 1]; - if (!tipc_link_is_up(tunnel)) + if (!tipc_link_is_up(tunnel)) { + warn("Link changeover error, " + "tunnel link no longer available\n"); return; + } msg_set_size(tunnel_hdr, length + INT_H_SIZE); buf = buf_acquire(length + INT_H_SIZE); - if (!buf) + if (!buf) { + warn("Link changeover error, " + "unable to send tunnel msg\n"); return; + } memcpy(buf->data, (unchar *)tunnel_hdr, INT_H_SIZE); memcpy(buf->data + INT_H_SIZE, (unchar *)msg, length); dbg("%c->%c:", l_ptr->b_ptr->net_plane, tunnel->b_ptr->net_plane); msg_dbg(buf_msg(buf), ">SEND>"); - assert(tunnel); tipc_link_send_buf(tunnel, buf); } @@ -2235,23 +2337,27 @@ void tipc_link_changeover(struct link *l_ptr) u32 msgcount = l_ptr->out_queue_size; struct sk_buff *crs = l_ptr->first_out; struct link *tunnel = l_ptr->owner->active_links[0]; - int split_bundles = tipc_node_has_redundant_links(l_ptr->owner); struct tipc_msg tunnel_hdr; + int split_bundles; if (!tunnel) return; - if (!l_ptr->owner->permit_changeover) + if (!l_ptr->owner->permit_changeover) { + warn("Link changeover error, " + "peer did not permit changeover\n"); return; + } msg_init(&tunnel_hdr, CHANGEOVER_PROTOCOL, ORIGINAL_MSG, TIPC_OK, INT_H_SIZE, l_ptr->addr); msg_set_bearer_id(&tunnel_hdr, l_ptr->peer_bearer_id); msg_set_msgcnt(&tunnel_hdr, msgcount); + dbg("Link changeover requires %u tunnel messages\n", msgcount); + if (!l_ptr->first_out) { struct sk_buff *buf; - assert(!msgcount); buf = buf_acquire(INT_H_SIZE); if (buf) { memcpy(buf->data, (unchar *)&tunnel_hdr, INT_H_SIZE); @@ -2261,10 +2367,15 @@ void tipc_link_changeover(struct link *l_ptr) msg_dbg(&tunnel_hdr, "EMPTY>SEND>"); tipc_link_send_buf(tunnel, buf); } else { - warn("Memory squeeze; link changeover failed\n"); + warn("Link changeover error, " + "unable to send changeover msg\n"); } return; } + + split_bundles = (l_ptr->owner->active_links[0] != + l_ptr->owner->active_links[1]); + while (crs) { struct tipc_msg *msg = buf_msg(crs); @@ -2310,7 +2421,8 @@ void tipc_link_send_duplicate(struct link *l_ptr, struct link *tunnel) msg_set_size(&tunnel_hdr, length + INT_H_SIZE); outbuf = buf_acquire(length + INT_H_SIZE); if (outbuf == NULL) { - warn("Memory squeeze; buffer duplication failed\n"); + warn("Link changeover error, " + "unable to send duplicate msg\n"); return; } memcpy(outbuf->data, (unchar *)&tunnel_hdr, INT_H_SIZE); @@ -2364,11 +2476,15 @@ static int link_recv_changeover_msg(struct link **l_ptr, u32 msg_count = msg_msgcnt(tunnel_msg); dest_link = (*l_ptr)->owner->links[msg_bearer_id(tunnel_msg)]; - assert(dest_link != *l_ptr); if (!dest_link) { msg_dbg(tunnel_msg, "NOLINK/\n", + (*l_ptr)->name); + goto exit; + } dbg("%c<-%c:", dest_link->b_ptr->net_plane, (*l_ptr)->b_ptr->net_plane); *l_ptr = dest_link; @@ -2381,7 +2497,7 @@ static int link_recv_changeover_msg(struct link **l_ptr, } *buf = buf_extract(tunnel_buf,INT_H_SIZE); if (*buf == NULL) { - warn("Memory squeeze; failed to extract msg\n"); + warn("Link changeover error, duplicate msg dropped\n"); goto exit; } msg_dbg(tunnel_msg, "TNL, changeover initiated by peer\n", + dest_link->name); tipc_link_reset(dest_link); dest_link->exp_msg_count = msg_count; + dbg("Expecting %u tunnelled messages\n", msg_count); if (!msg_count) goto exit; } else if (dest_link->exp_msg_count == START_CHANGEOVER) { msg_dbg(tunnel_msg, "BLK/FIRST/exp_msg_count = msg_count; + dbg("Expecting %u tunnelled messages\n", msg_count); if (!msg_count) goto exit; } @@ -2407,6 +2527,8 @@ static int link_recv_changeover_msg(struct link **l_ptr, /* Receive original message */ if (dest_link->exp_msg_count == 0) { + warn("Link switchover error, " + "got too many tunnelled messages\n"); msg_dbg(tunnel_msg, "OVERDUE/DROP/type, publ->lower, publ->upper); publ->key += 1222345; p = tipc_nametbl_remove_publ(publ->type, publ->lower, publ->node, publ->ref, publ->key); - assert(p == publ); write_unlock_bh(&tipc_nametbl_lock); - kfree(publ); + + if (p != publ) { + err("Unable to remove publication from failed node\n" + "(type=%u, lower=%u, node=0x%x, ref=%u, key=%u)\n", + publ->type, publ->lower, publ->node, publ->ref, publ->key); + } + + if (p) { + kfree(p); + } } /** @@ -275,9 +283,15 @@ void tipc_named_recv(struct sk_buff *buf) if (publ) { tipc_nodesub_unsubscribe(&publ->subscr); kfree(publ); + } else { + err("Unable to remove publication by node 0x%x\n" + "(type=%u, lower=%u, ref=%u, key=%u)\n", + msg_orignode(msg), + ntohl(item->type), ntohl(item->lower), + ntohl(item->ref), ntohl(item->key)); } } else { - warn("tipc_named_recv: unknown msg\n"); + warn("Unrecognized name table message received\n"); } item++; } diff --git a/net/tipc/name_table.c b/net/tipc/name_table.c index d129422fc..049242ea5 100644 --- a/net/tipc/name_table.c +++ b/net/tipc/name_table.c @@ -71,7 +71,7 @@ struct sub_seq { * @sseq: pointer to dynamically-sized array of sub-sequences of this 'type'; * sub-sequences are sorted in ascending order * @alloc: number of sub-sequences currently in array - * @first_free: upper bound of highest sub-sequence + 1 + * @first_free: array index of first unused sub-sequence entry * @ns_list: links to adjacent name sequences in hash chain * @subscriptions: list of subscriptions for this 'type' * @lock: spinlock controlling access to name sequence structure @@ -101,7 +101,7 @@ struct name_table { static struct name_table table = { NULL } ; static atomic_t rsv_publ_ok = ATOMIC_INIT(0); -rwlock_t tipc_nametbl_lock = RW_LOCK_UNLOCKED; +DEFINE_RWLOCK(tipc_nametbl_lock); static int hash(int x) @@ -117,14 +117,12 @@ static struct publication *publ_create(u32 type, u32 lower, u32 upper, u32 scope, u32 node, u32 port_ref, u32 key) { - struct publication *publ = - (struct publication *)kmalloc(sizeof(*publ), GFP_ATOMIC); + struct publication *publ = kzalloc(sizeof(*publ), GFP_ATOMIC); if (publ == NULL) { - warn("Memory squeeze; failed to create publication\n"); + warn("Publication creation failure, no memory\n"); return NULL; } - memset(publ, 0, sizeof(*publ)); publ->type = type; publ->lower = lower; publ->upper = upper; @@ -144,11 +142,7 @@ static struct publication *publ_create(u32 type, u32 lower, u32 upper, static struct sub_seq *tipc_subseq_alloc(u32 cnt) { - u32 sz = cnt * sizeof(struct sub_seq); - struct sub_seq *sseq = (struct sub_seq *)kmalloc(sz, GFP_ATOMIC); - - if (sseq) - memset(sseq, 0, sz); + struct sub_seq *sseq = kcalloc(cnt, sizeof(struct sub_seq), GFP_ATOMIC); return sseq; } @@ -160,22 +154,20 @@ static struct sub_seq *tipc_subseq_alloc(u32 cnt) static struct name_seq *tipc_nameseq_create(u32 type, struct hlist_head *seq_head) { - struct name_seq *nseq = - (struct name_seq *)kmalloc(sizeof(*nseq), GFP_ATOMIC); + struct name_seq *nseq = kzalloc(sizeof(*nseq), GFP_ATOMIC); struct sub_seq *sseq = tipc_subseq_alloc(1); if (!nseq || !sseq) { - warn("Memory squeeze; failed to create name sequence\n"); + warn("Name sequence creation failed, no memory\n"); kfree(nseq); kfree(sseq); return NULL; } - memset(nseq, 0, sizeof(*nseq)); - nseq->lock = SPIN_LOCK_UNLOCKED; + spin_lock_init(&nseq->lock); nseq->type = type; nseq->sseqs = sseq; - dbg("tipc_nameseq_create() nseq = %x type %u, ssseqs %x, ff: %u\n", + dbg("tipc_nameseq_create(): nseq = %p, type %u, ssseqs %p, ff: %u\n", nseq, type, nseq->sseqs, nseq->first_free); nseq->alloc = 1; INIT_HLIST_NODE(&nseq->ns_list); @@ -253,16 +245,16 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq, struct sub_seq *sseq; int created_subseq = 0; - assert(nseq->first_free <= nseq->alloc); sseq = nameseq_find_subseq(nseq, lower); - dbg("nameseq_ins: for seq %x,<%u,%u>, found sseq %x\n", + dbg("nameseq_ins: for seq %p, {%u,%u}, found sseq %p\n", nseq, type, lower, sseq); if (sseq) { /* Lower end overlaps existing entry => need an exact match */ if ((sseq->lower != lower) || (sseq->upper != upper)) { - warn("Overlapping publ <%u,%u,%u>\n", type, lower, upper); + warn("Cannot publish {%u,%u,%u}, overlap error\n", + type, lower, upper); return NULL; } } else { @@ -277,25 +269,27 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq, if ((inspos < nseq->first_free) && (upper >= nseq->sseqs[inspos].lower)) { - warn("Overlapping publ <%u,%u,%u>\n", type, lower, upper); + warn("Cannot publish {%u,%u,%u}, overlap error\n", + type, lower, upper); return NULL; } /* Ensure there is space for new sub-sequence */ if (nseq->first_free == nseq->alloc) { - struct sub_seq *sseqs = nseq->sseqs; - nseq->sseqs = tipc_subseq_alloc(nseq->alloc * 2); - if (nseq->sseqs != NULL) { - memcpy(nseq->sseqs, sseqs, - nseq->alloc * sizeof (struct sub_seq)); - kfree(sseqs); - dbg("Allocated %u sseqs\n", nseq->alloc); - nseq->alloc *= 2; - } else { - warn("Memory squeeze; failed to create sub-sequence\n"); + struct sub_seq *sseqs = tipc_subseq_alloc(nseq->alloc * 2); + + if (!sseqs) { + warn("Cannot publish {%u,%u,%u}, no memory\n", + type, lower, upper); return NULL; } + dbg("Allocated %u more sseqs\n", nseq->alloc); + memcpy(sseqs, nseq->sseqs, + nseq->alloc * sizeof(struct sub_seq)); + kfree(nseq->sseqs); + nseq->sseqs = sseqs; + nseq->alloc *= 2; } dbg("Have %u sseqs for type %u\n", nseq->alloc, type); @@ -311,7 +305,7 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq, sseq->upper = upper; created_subseq = 1; } - dbg("inserting (%u %u %u) from %x:%u into sseq %x(%u,%u) of seq %x\n", + dbg("inserting {%u,%u,%u} from <0x%x:%u> into sseq %p(%u,%u) of seq %p\n", type, lower, upper, node, port, sseq, sseq->lower, sseq->upper, nseq); @@ -320,7 +314,7 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq, publ = publ_create(type, lower, upper, scope, node, port, key); if (!publ) return NULL; - dbg("inserting publ %x, node=%x publ->node=%x, subscr->node=%x\n", + dbg("inserting publ %p, node=0x%x publ->node=0x%x, subscr->node=%p\n", publ, node, publ->node, publ->subscr.node); if (!sseq->zone_list) @@ -367,45 +361,47 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq, /** * tipc_nameseq_remove_publ - + * + * NOTE: There may be cases where TIPC is asked to remove a publication + * that is not in the name table. For example, if another node issues a + * publication for a name sequence that overlaps an existing name sequence + * the publication will not be recorded, which means the publication won't + * be found when the name sequence is later withdrawn by that node. + * A failed withdraw request simply returns a failure indication and lets the + * caller issue any error or warning messages associated with such a problem. */ static struct publication *tipc_nameseq_remove_publ(struct name_seq *nseq, u32 inst, u32 node, u32 ref, u32 key) { struct publication *publ; + struct publication *curr; struct publication *prev; struct sub_seq *sseq = nameseq_find_subseq(nseq, inst); struct sub_seq *free; struct subscription *s, *st; int removed_subseq = 0; - assert(nseq); - - if (!sseq) { - int i; - - warn("Withdraw unknown <%u,%u>?\n", nseq->type, inst); - assert(nseq->sseqs); - dbg("Dumping subseqs %x for %x, alloc = %u,ff=%u\n", - nseq->sseqs, nseq, nseq->alloc, - nseq->first_free); - for (i = 0; i < nseq->first_free; i++) { - dbg("Subseq %u(%x): lower = %u,upper = %u\n", - i, &nseq->sseqs[i], nseq->sseqs[i].lower, - nseq->sseqs[i].upper); - } + if (!sseq) return NULL; - } - dbg("nameseq_remove: seq: %x, sseq %x, <%u,%u> key %u\n", + + dbg("tipc_nameseq_remove_publ: seq: %p, sseq %p, {%u,%u}, key %u\n", nseq, sseq, nseq->type, inst, key); + /* Remove publication from zone scope list */ + prev = sseq->zone_list; publ = sseq->zone_list->zone_list_next; while ((publ->key != key) || (publ->ref != ref) || (publ->node && (publ->node != node))) { prev = publ; publ = publ->zone_list_next; - assert(prev != sseq->zone_list); + if (prev == sseq->zone_list) { + + /* Prevent endless loop if publication not found */ + + return NULL; + } } if (publ != sseq->zone_list) prev->zone_list_next = publ->zone_list_next; @@ -416,14 +412,24 @@ static struct publication *tipc_nameseq_remove_publ(struct name_seq *nseq, u32 i sseq->zone_list = NULL; } + /* Remove publication from cluster scope list, if present */ + if (in_own_cluster(node)) { prev = sseq->cluster_list; - publ = sseq->cluster_list->cluster_list_next; - while ((publ->key != key) || (publ->ref != ref) || - (publ->node && (publ->node != node))) { - prev = publ; - publ = publ->cluster_list_next; - assert(prev != sseq->cluster_list); + curr = sseq->cluster_list->cluster_list_next; + while (curr != publ) { + prev = curr; + curr = curr->cluster_list_next; + if (prev == sseq->cluster_list) { + + /* Prevent endless loop for malformed list */ + + err("Unable to de-list cluster publication\n" + "{%u%u}, node=0x%x, ref=%u, key=%u)\n", + publ->type, publ->lower, publ->node, + publ->ref, publ->key); + goto end_cluster; + } } if (publ != sseq->cluster_list) prev->cluster_list_next = publ->cluster_list_next; @@ -434,15 +440,26 @@ static struct publication *tipc_nameseq_remove_publ(struct name_seq *nseq, u32 i sseq->cluster_list = NULL; } } +end_cluster: + + /* Remove publication from node scope list, if present */ if (node == tipc_own_addr) { prev = sseq->node_list; - publ = sseq->node_list->node_list_next; - while ((publ->key != key) || (publ->ref != ref) || - (publ->node && (publ->node != node))) { - prev = publ; - publ = publ->node_list_next; - assert(prev != sseq->node_list); + curr = sseq->node_list->node_list_next; + while (curr != publ) { + prev = curr; + curr = curr->node_list_next; + if (prev == sseq->node_list) { + + /* Prevent endless loop for malformed list */ + + err("Unable to de-list node publication\n" + "{%u%u}, node=0x%x, ref=%u, key=%u)\n", + publ->type, publ->lower, publ->node, + publ->ref, publ->key); + goto end_node; + } } if (publ != sseq->node_list) prev->node_list_next = publ->node_list_next; @@ -453,22 +470,18 @@ static struct publication *tipc_nameseq_remove_publ(struct name_seq *nseq, u32 i sseq->node_list = NULL; } } - assert(!publ->node || (publ->node == node)); - assert(publ->ref == ref); - assert(publ->key == key); +end_node: - /* - * Contract subseq list if no more publications: - */ - if (!sseq->node_list && !sseq->cluster_list && !sseq->zone_list) { + /* Contract subseq list if no more publications for that subseq */ + + if (!sseq->zone_list) { free = &nseq->sseqs[nseq->first_free--]; memmove(sseq, sseq + 1, (free - (sseq + 1)) * sizeof (*sseq)); removed_subseq = 1; } - /* - * Any subscriptions waiting ? - */ + /* Notify any waiting subscriptions */ + list_for_each_entry_safe(s, st, &nseq->subscriptions, nameseq_list) { tipc_subscr_report_overlap(s, publ->lower, @@ -478,6 +491,7 @@ static struct publication *tipc_nameseq_remove_publ(struct name_seq *nseq, u32 i publ->node, removed_subseq); } + return publ; } @@ -530,7 +544,7 @@ static struct name_seq *nametbl_find_seq(u32 type) seq_head = &table.types[hash(type)]; hlist_for_each_entry(ns, seq_node, seq_head, ns_list) { if (ns->type == type) { - dbg("found %x\n", ns); + dbg("found %p\n", ns); return ns; } } @@ -543,22 +557,21 @@ struct publication *tipc_nametbl_insert_publ(u32 type, u32 lower, u32 upper, { struct name_seq *seq = nametbl_find_seq(type); - dbg("ins_publ: <%u,%x,%x> found %x\n", type, lower, upper, seq); + dbg("tipc_nametbl_insert_publ: {%u,%u,%u} found %p\n", type, lower, upper, seq); if (lower > upper) { - warn("Failed to publish illegal <%u,%u,%u>\n", + warn("Failed to publish illegal {%u,%u,%u}\n", type, lower, upper); return NULL; } - dbg("Publishing <%u,%u,%u> from %x\n", type, lower, upper, node); + dbg("Publishing {%u,%u,%u} from 0x%x\n", type, lower, upper, node); if (!seq) { seq = tipc_nameseq_create(type, &table.types[hash(type)]); - dbg("tipc_nametbl_insert_publ: created %x\n", seq); + dbg("tipc_nametbl_insert_publ: created %p\n", seq); } if (!seq) return NULL; - assert(seq->type == type); return tipc_nameseq_insert_publ(seq, type, lower, upper, scope, node, port, key); } @@ -572,7 +585,7 @@ struct publication *tipc_nametbl_remove_publ(u32 type, u32 lower, if (!seq) return NULL; - dbg("Withdrawing <%u,%u> from %x\n", type, lower, node); + dbg("Withdrawing {%u,%u} from 0x%x\n", type, lower, node); publ = tipc_nameseq_remove_publ(seq, lower, node, ref, key); if (!seq->first_free && list_empty(&seq->subscriptions)) { @@ -738,12 +751,12 @@ struct publication *tipc_nametbl_publish(u32 type, u32 lower, u32 upper, struct publication *publ; if (table.local_publ_count >= tipc_max_publications) { - warn("Failed publish: max %u local publication\n", + warn("Publication failed, local publication limit reached (%u)\n", tipc_max_publications); return NULL; } if ((type < TIPC_RESERVED_TYPES) && !atomic_read(&rsv_publ_ok)) { - warn("Failed to publish reserved name <%u,%u,%u>\n", + warn("Publication failed, reserved name {%u,%u,%u}\n", type, lower, upper); return NULL; } @@ -767,10 +780,10 @@ int tipc_nametbl_withdraw(u32 type, u32 lower, u32 ref, u32 key) { struct publication *publ; - dbg("tipc_nametbl_withdraw:<%d,%d,%d>\n", type, lower, key); + dbg("tipc_nametbl_withdraw: {%u,%u}, key=%u\n", type, lower, key); write_lock_bh(&tipc_nametbl_lock); publ = tipc_nametbl_remove_publ(type, lower, tipc_own_addr, ref, key); - if (publ) { + if (likely(publ)) { table.local_publ_count--; if (publ->scope != TIPC_NODE_SCOPE) tipc_named_withdraw(publ); @@ -780,6 +793,9 @@ int tipc_nametbl_withdraw(u32 type, u32 lower, u32 ref, u32 key) return 1; } write_unlock_bh(&tipc_nametbl_lock); + err("Unable to remove local publication\n" + "(type=%u, lower=%u, ref=%u, key=%u)\n", + type, lower, ref, key); return 0; } @@ -787,8 +803,7 @@ int tipc_nametbl_withdraw(u32 type, u32 lower, u32 ref, u32 key) * tipc_nametbl_subscribe - add a subscription object to the name table */ -void -tipc_nametbl_subscribe(struct subscription *s) +void tipc_nametbl_subscribe(struct subscription *s) { u32 type = s->seq.type; struct name_seq *seq; @@ -800,11 +815,13 @@ tipc_nametbl_subscribe(struct subscription *s) } if (seq){ spin_lock_bh(&seq->lock); - dbg("tipc_nametbl_subscribe:found %x for <%u,%u,%u>\n", + dbg("tipc_nametbl_subscribe:found %p for {%u,%u,%u}\n", seq, type, s->seq.lower, s->seq.upper); - assert(seq->type == type); tipc_nameseq_subscribe(seq, s); spin_unlock_bh(&seq->lock); + } else { + warn("Failed to create subscription for {%u,%u,%u}\n", + s->seq.type, s->seq.lower, s->seq.upper); } write_unlock_bh(&tipc_nametbl_lock); } @@ -813,8 +830,7 @@ tipc_nametbl_subscribe(struct subscription *s) * tipc_nametbl_unsubscribe - remove a subscription object from name table */ -void -tipc_nametbl_unsubscribe(struct subscription *s) +void tipc_nametbl_unsubscribe(struct subscription *s) { struct name_seq *seq; @@ -1036,7 +1052,7 @@ int tipc_nametbl_init(void) { int array_size = sizeof(struct hlist_head) * tipc_nametbl_size; - table.types = (struct hlist_head *)kmalloc(array_size, GFP_ATOMIC); + table.types = kmalloc(array_size, GFP_ATOMIC); if (!table.types) return -ENOMEM; @@ -1049,35 +1065,20 @@ int tipc_nametbl_init(void) void tipc_nametbl_stop(void) { - struct hlist_head *seq_head; - struct hlist_node *seq_node; - struct hlist_node *tmp; - struct name_seq *seq; u32 i; if (!table.types) return; + /* Verify name table is empty, then release it */ + write_lock_bh(&tipc_nametbl_lock); for (i = 0; i < tipc_nametbl_size; i++) { - seq_head = &table.types[i]; - hlist_for_each_entry_safe(seq, seq_node, tmp, seq_head, ns_list) { - struct sub_seq *sseq = seq->sseqs; - - for (; sseq != &seq->sseqs[seq->first_free]; sseq++) { - struct publication *publ = sseq->zone_list; - assert(publ); - do { - struct publication *next = - publ->zone_list_next; - kfree(publ); - publ = next; - } - while (publ != sseq->zone_list); - } - } + if (!hlist_empty(&table.types[i])) + err("tipc_nametbl_stop(): hash chain %u is non-null\n", i); } kfree(table.types); table.types = NULL; write_unlock_bh(&tipc_nametbl_lock); } + diff --git a/net/tipc/net.c b/net/tipc/net.c index f7c8223dd..a991bf8a7 100644 --- a/net/tipc/net.c +++ b/net/tipc/net.c @@ -115,7 +115,7 @@ * - A local spin_lock protecting the queue of subscriber events. */ -rwlock_t tipc_net_lock = RW_LOCK_UNLOCKED; +DEFINE_RWLOCK(tipc_net_lock); struct network tipc_net = { NULL }; struct node *tipc_net_select_remote_node(u32 addr, u32 ref) @@ -160,14 +160,11 @@ void tipc_net_send_external_routes(u32 dest) static int net_init(void) { - u32 sz = sizeof(struct _zone *) * (tipc_max_zones + 1); - memset(&tipc_net, 0, sizeof(tipc_net)); - tipc_net.zones = (struct _zone **)kmalloc(sz, GFP_ATOMIC); + tipc_net.zones = kcalloc(tipc_max_zones + 1, sizeof(struct _zone *), GFP_ATOMIC); if (!tipc_net.zones) { return -ENOMEM; } - memset(tipc_net.zones, 0, sz); return TIPC_OK; } diff --git a/net/tipc/node.c b/net/tipc/node.c index 0d5db06e2..fc6d09630 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c @@ -2,7 +2,7 @@ * net/tipc/node.c: TIPC node management routines * * Copyright (c) 2000-2006, Ericsson AB - * Copyright (c) 2005, Wind River Systems + * Copyright (c) 2005-2006, Wind River Systems * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -61,34 +61,37 @@ struct node *tipc_node_create(u32 addr) struct node **curr_node; n_ptr = kmalloc(sizeof(*n_ptr),GFP_ATOMIC); - if (n_ptr != NULL) { - memset(n_ptr, 0, sizeof(*n_ptr)); - n_ptr->addr = addr; - n_ptr->lock = SPIN_LOCK_UNLOCKED; - INIT_LIST_HEAD(&n_ptr->nsub); - - c_ptr = tipc_cltr_find(addr); - if (c_ptr == NULL) - c_ptr = tipc_cltr_create(addr); - if (c_ptr != NULL) { - n_ptr->owner = c_ptr; - tipc_cltr_attach_node(c_ptr, n_ptr); - n_ptr->last_router = -1; - - /* Insert node into ordered list */ - for (curr_node = &tipc_nodes; *curr_node; - curr_node = &(*curr_node)->next) { - if (addr < (*curr_node)->addr) { - n_ptr->next = *curr_node; - break; - } - } - (*curr_node) = n_ptr; - } else { - kfree(n_ptr); - n_ptr = NULL; - } - } + if (!n_ptr) { + warn("Node creation failed, no memory\n"); + return NULL; + } + + c_ptr = tipc_cltr_find(addr); + if (!c_ptr) { + c_ptr = tipc_cltr_create(addr); + } + if (!c_ptr) { + kfree(n_ptr); + return NULL; + } + + memset(n_ptr, 0, sizeof(*n_ptr)); + n_ptr->addr = addr; + spin_lock_init(&n_ptr->lock); + INIT_LIST_HEAD(&n_ptr->nsub); + n_ptr->owner = c_ptr; + tipc_cltr_attach_node(c_ptr, n_ptr); + n_ptr->last_router = -1; + + /* Insert node into ordered list */ + for (curr_node = &tipc_nodes; *curr_node; + curr_node = &(*curr_node)->next) { + if (addr < (*curr_node)->addr) { + n_ptr->next = *curr_node; + break; + } + } + (*curr_node) = n_ptr; return n_ptr; } @@ -122,6 +125,8 @@ void tipc_node_link_up(struct node *n_ptr, struct link *l_ptr) { struct link **active = &n_ptr->active_links[0]; + n_ptr->working_links++; + info("Established link <%s> on network plane %c\n", l_ptr->name, l_ptr->b_ptr->net_plane); @@ -132,7 +137,7 @@ void tipc_node_link_up(struct node *n_ptr, struct link *l_ptr) return; } if (l_ptr->priority < active[0]->priority) { - info("Link is standby\n"); + info("New link <%s> becomes standby\n", l_ptr->name); return; } tipc_link_send_duplicate(active[0], l_ptr); @@ -140,8 +145,9 @@ void tipc_node_link_up(struct node *n_ptr, struct link *l_ptr) active[0] = l_ptr; return; } - info("Link <%s> on network plane %c becomes standby\n", - active[0]->name, active[0]->b_ptr->net_plane); + info("Old link <%s> becomes standby\n", active[0]->name); + if (active[1] != active[0]) + info("Old link <%s> becomes standby\n", active[1]->name); active[0] = active[1] = l_ptr; } @@ -181,6 +187,8 @@ void tipc_node_link_down(struct node *n_ptr, struct link *l_ptr) { struct link **active; + n_ptr->working_links--; + if (!tipc_link_is_active(l_ptr)) { info("Lost standby link <%s> on network plane %c\n", l_ptr->name, l_ptr->b_ptr->net_plane); @@ -210,8 +218,7 @@ int tipc_node_has_active_links(struct node *n_ptr) int tipc_node_has_redundant_links(struct node *n_ptr) { - return (tipc_node_has_active_links(n_ptr) && - (n_ptr->active_links[0] != n_ptr->active_links[1])); + return (n_ptr->working_links > 1); } static int tipc_node_has_active_routes(struct node *n_ptr) @@ -234,7 +241,6 @@ struct node *tipc_node_attach_link(struct link *l_ptr) u32 bearer_id = l_ptr->b_ptr->identity; char addr_string[16]; - assert(bearer_id < MAX_BEARERS); if (n_ptr->link_cnt >= 2) { char addr_string[16]; @@ -249,7 +255,7 @@ struct node *tipc_node_attach_link(struct link *l_ptr) n_ptr->link_cnt++; return n_ptr; } - err("Attempt to establish second link on <%s> to <%s> \n", + err("Attempt to establish second link on <%s> to %s \n", l_ptr->b_ptr->publ.name, addr_string_fill(addr_string, l_ptr->addr)); } @@ -314,7 +320,7 @@ static void node_established_contact(struct node *n_ptr) struct cluster *c_ptr; dbg("node_established_contact:-> %x\n", n_ptr->addr); - if (!tipc_node_has_active_routes(n_ptr)) { + if (!tipc_node_has_active_routes(n_ptr) && in_own_cluster(n_ptr->addr)) { tipc_k_signal((Handler)tipc_named_node_up, n_ptr->addr); } @@ -586,6 +592,7 @@ struct sk_buff *tipc_node_get_nodes(const void *req_tlv_area, int req_tlv_space) struct sk_buff *buf; struct node *n_ptr; struct tipc_node_info node_info; + u32 payload_size; if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_NET_ADDR)) return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR); @@ -602,8 +609,11 @@ struct sk_buff *tipc_node_get_nodes(const void *req_tlv_area, int req_tlv_space) /* For now, get space for all other nodes (will need to modify this when slave nodes are supported */ - buf = tipc_cfg_reply_alloc(TLV_SPACE(sizeof(node_info)) * - (tipc_max_nodes - 1)); + payload_size = TLV_SPACE(sizeof(node_info)) * (tipc_max_nodes - 1); + if (payload_size > 32768u) + return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED + " (too many nodes)"); + buf = tipc_cfg_reply_alloc(payload_size); if (!buf) return NULL; @@ -627,6 +637,7 @@ struct sk_buff *tipc_node_get_links(const void *req_tlv_area, int req_tlv_space) struct sk_buff *buf; struct node *n_ptr; struct tipc_link_info link_info; + u32 payload_size; if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_NET_ADDR)) return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR); @@ -639,12 +650,15 @@ struct sk_buff *tipc_node_get_links(const void *req_tlv_area, int req_tlv_space) if (!tipc_nodes) return tipc_cfg_reply_none(); - - /* For now, get space for 2 links to all other nodes + bcast link - (will need to modify this when slave nodes are supported */ - - buf = tipc_cfg_reply_alloc(TLV_SPACE(sizeof(link_info)) * - (2 * (tipc_max_nodes - 1) + 1)); + + /* Get space for all unicast links + multicast link */ + + payload_size = TLV_SPACE(sizeof(link_info)) * + (tipc_net.zones[tipc_zone(tipc_own_addr)]->links + 1); + if (payload_size > 32768u) + return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED + " (too many links)"); + buf = tipc_cfg_reply_alloc(payload_size); if (!buf) return NULL; diff --git a/net/tipc/node.h b/net/tipc/node.h index 781126e08..a07cc79ea 100644 --- a/net/tipc/node.h +++ b/net/tipc/node.h @@ -51,6 +51,7 @@ * @nsub: list of "node down" subscriptions monitoring node * @active_links: pointers to active links to node * @links: pointers to all links to node + * @working_links: number of working links to node (both active and standby) * @link_cnt: number of links to node * @permit_changeover: non-zero if node has redundant links to this system * @routers: bitmap (used for multicluster communication) @@ -76,6 +77,7 @@ struct node { struct link *active_links[2]; struct link *links[MAX_BEARERS]; int link_cnt; + int working_links; int permit_changeover; u32 routers[512/32]; int last_router; diff --git a/net/tipc/node_subscr.c b/net/tipc/node_subscr.c index cff4068cc..cc3fff3de 100644 --- a/net/tipc/node_subscr.c +++ b/net/tipc/node_subscr.c @@ -47,18 +47,19 @@ void tipc_nodesub_subscribe(struct node_subscr *node_sub, u32 addr, void *usr_handle, net_ev_handler handle_down) { - node_sub->node = NULL; - if (addr == tipc_own_addr) + if (addr == tipc_own_addr) { + node_sub->node = NULL; return; - if (!tipc_addr_node_valid(addr)) { - warn("node_subscr with illegal %x\n", addr); + } + + node_sub->node = tipc_node_find(addr); + if (!node_sub->node) { + warn("Node subscription rejected, unknown node 0x%x\n", addr); return; } - node_sub->handle_node_down = handle_down; node_sub->usr_handle = usr_handle; - node_sub->node = tipc_node_find(addr); - assert(node_sub->node); + tipc_node_lock(node_sub->node); list_add_tail(&node_sub->nodesub_list, &node_sub->node->nsub); tipc_node_unlock(node_sub->node); diff --git a/net/tipc/port.c b/net/tipc/port.c index 67e96cb1e..b9c8c6b9e 100644 --- a/net/tipc/port.c +++ b/net/tipc/port.c @@ -57,8 +57,8 @@ static struct sk_buff *msg_queue_head = NULL; static struct sk_buff *msg_queue_tail = NULL; -spinlock_t tipc_port_list_lock = SPIN_LOCK_UNLOCKED; -static spinlock_t queue_lock = SPIN_LOCK_UNLOCKED; +DEFINE_SPINLOCK(tipc_port_list_lock); +static DEFINE_SPINLOCK(queue_lock); static LIST_HEAD(ports); static void port_handle_node_down(unsigned long ref); @@ -168,7 +168,6 @@ void tipc_port_recv_mcast(struct sk_buff *buf, struct port_list *dp) struct port_list *item = dp; int cnt = 0; - assert(buf); msg = buf_msg(buf); /* Create destination port list, if one wasn't supplied */ @@ -196,7 +195,7 @@ void tipc_port_recv_mcast(struct sk_buff *buf, struct port_list *dp) struct sk_buff *b = skb_clone(buf, GFP_ATOMIC); if (b == NULL) { - warn("Buffer allocation failure\n"); + warn("Unable to deliver multicast message(s)\n"); msg_dbg(msg, "LOST:"); goto exit; } @@ -227,15 +226,14 @@ u32 tipc_createport_raw(void *usr_handle, struct tipc_msg *msg; u32 ref; - p_ptr = kmalloc(sizeof(*p_ptr), GFP_ATOMIC); - if (p_ptr == NULL) { - warn("Memory squeeze; failed to create port\n"); + p_ptr = kzalloc(sizeof(*p_ptr), GFP_ATOMIC); + if (!p_ptr) { + warn("Port creation failed, no memory\n"); return 0; } - memset(p_ptr, 0, sizeof(*p_ptr)); ref = tipc_ref_acquire(p_ptr, &p_ptr->publ.lock); if (!ref) { - warn("Reference Table Exhausted\n"); + warn("Port creation failed, reference table exhausted\n"); kfree(p_ptr); return 0; } @@ -810,18 +808,20 @@ static void port_dispatcher_sigh(void *dummy) void *usr_handle; int connected; int published; + u32 message_type; struct sk_buff *next = buf->next; struct tipc_msg *msg = buf_msg(buf); u32 dref = msg_destport(msg); + message_type = msg_type(msg); + if (message_type > TIPC_DIRECT_MSG) + goto reject; /* Unsupported message type */ + p_ptr = tipc_port_lock(dref); - if (!p_ptr) { - /* Port deleted while msg in queue */ - tipc_reject_msg(buf, TIPC_ERR_NO_PORT); - buf = next; - continue; - } + if (!p_ptr) + goto reject; /* Port deleted while msg in queue */ + orig.ref = msg_origport(msg); orig.node = msg_orignode(msg); up_ptr = p_ptr->user_port; @@ -832,7 +832,7 @@ static void port_dispatcher_sigh(void *dummy) if (unlikely(msg_errcode(msg))) goto err; - switch (msg_type(msg)) { + switch (message_type) { case TIPC_CONN_MSG:{ tipc_conn_msg_event cb = up_ptr->conn_msg_cb; @@ -874,6 +874,7 @@ static void port_dispatcher_sigh(void *dummy) &orig); break; } + case TIPC_MCAST_MSG: case TIPC_NAMED_MSG:{ tipc_named_msg_event cb = up_ptr->named_msg_cb; @@ -886,7 +887,8 @@ static void port_dispatcher_sigh(void *dummy) goto reject; dseq.type = msg_nametype(msg); dseq.lower = msg_nameinst(msg); - dseq.upper = dseq.lower; + dseq.upper = (message_type == TIPC_NAMED_MSG) + ? dseq.lower : msg_nameupper(msg); skb_pull(buf, msg_hdr_sz(msg)); cb(usr_handle, dref, &buf, msg_data(msg), msg_data_sz(msg), msg_importance(msg), @@ -899,7 +901,7 @@ static void port_dispatcher_sigh(void *dummy) buf = next; continue; err: - switch (msg_type(msg)) { + switch (message_type) { case TIPC_CONN_MSG:{ tipc_conn_shutdown_event cb = @@ -931,6 +933,7 @@ err: msg_data_sz(msg), msg_errcode(msg), &orig); break; } + case TIPC_MCAST_MSG: case TIPC_NAMED_MSG:{ tipc_named_msg_err_event cb = up_ptr->named_err_cb; @@ -940,7 +943,8 @@ err: break; dseq.type = msg_nametype(msg); dseq.lower = msg_nameinst(msg); - dseq.upper = dseq.lower; + dseq.upper = (message_type == TIPC_NAMED_MSG) + ? dseq.lower : msg_nameupper(msg); skb_pull(buf, msg_hdr_sz(msg)); cb(usr_handle, dref, &buf, msg_data(msg), msg_data_sz(msg), msg_errcode(msg), &dseq); @@ -1053,8 +1057,9 @@ int tipc_createport(u32 user_ref, struct port *p_ptr; u32 ref; - up_ptr = (struct user_port *)kmalloc(sizeof(*up_ptr), GFP_ATOMIC); - if (up_ptr == NULL) { + up_ptr = kmalloc(sizeof(*up_ptr), GFP_ATOMIC); + if (!up_ptr) { + warn("Port creation failed, no memory\n"); return -ENOMEM; } ref = tipc_createport_raw(NULL, port_dispatcher, port_wakeup, importance); @@ -1165,8 +1170,6 @@ int tipc_withdraw(u32 ref, unsigned int scope, struct tipc_name_seq const *seq) p_ptr = tipc_port_lock(ref); if (!p_ptr) return -EINVAL; - if (!p_ptr->publ.published) - goto exit; if (!seq) { list_for_each_entry_safe(publ, tpubl, &p_ptr->publications, pport_list) { @@ -1193,7 +1196,6 @@ int tipc_withdraw(u32 ref, unsigned int scope, struct tipc_name_seq const *seq) } if (list_empty(&p_ptr->publications)) p_ptr->publ.published = 0; -exit: tipc_port_unlock(p_ptr); return res; } diff --git a/net/tipc/ref.c b/net/tipc/ref.c index 33bbf5095..e6d6ae22e 100644 --- a/net/tipc/ref.c +++ b/net/tipc/ref.c @@ -63,7 +63,7 @@ struct ref_table tipc_ref_table = { NULL }; -static rwlock_t ref_table_lock = RW_LOCK_UNLOCKED; +static DEFINE_RWLOCK(ref_table_lock); /** * tipc_ref_table_init - create reference table for objects @@ -79,7 +79,7 @@ int tipc_ref_table_init(u32 requested_size, u32 start) while (sz < requested_size) { sz <<= 1; } - table = (struct reference *)vmalloc(sz * sizeof(struct reference)); + table = vmalloc(sz * sizeof(*table)); if (table == NULL) return -ENOMEM; @@ -87,7 +87,7 @@ int tipc_ref_table_init(u32 requested_size, u32 start) index_mask = sz - 1; for (i = sz - 1; i >= 0; i--) { table[i].object = NULL; - table[i].lock = SPIN_LOCK_UNLOCKED; + spin_lock_init(&table[i].lock); table[i].data.next_plus_upper = (start & ~index_mask) + i - 1; } tipc_ref_table.entries = table; @@ -127,7 +127,14 @@ u32 tipc_ref_acquire(void *object, spinlock_t **lock) u32 next_plus_upper; u32 reference = 0; - assert(tipc_ref_table.entries && object); + if (!object) { + err("Attempt to acquire reference to non-existent object\n"); + return 0; + } + if (!tipc_ref_table.entries) { + err("Reference table not found during acquisition attempt\n"); + return 0; + } write_lock_bh(&ref_table_lock); if (tipc_ref_table.first_free) { @@ -162,15 +169,28 @@ void tipc_ref_discard(u32 ref) u32 index; u32 index_mask; - assert(tipc_ref_table.entries); - assert(ref != 0); + if (!ref) { + err("Attempt to discard reference 0\n"); + return; + } + if (!tipc_ref_table.entries) { + err("Reference table not found during discard attempt\n"); + return; + } write_lock_bh(&ref_table_lock); index_mask = tipc_ref_table.index_mask; index = ref & index_mask; entry = &(tipc_ref_table.entries[index]); - assert(entry->object != 0); - assert(entry->data.reference == ref); + + if (!entry->object) { + err("Attempt to discard reference to non-existent object\n"); + goto exit; + } + if (entry->data.reference != ref) { + err("Attempt to discard non-existent reference\n"); + goto exit; + } /* mark entry as unused */ entry->object = NULL; @@ -184,6 +204,7 @@ void tipc_ref_discard(u32 ref) /* increment upper bits of entry to invalidate subsequent references */ entry->data.next_plus_upper = (ref & ~index_mask) + (index_mask + 1); +exit: write_unlock_bh(&ref_table_lock); } diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 648a734e6..32d778448 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c @@ -169,12 +169,6 @@ static int tipc_create(struct socket *sock, int protocol) struct sock *sk; u32 ref; - if ((sock->type != SOCK_STREAM) && - (sock->type != SOCK_SEQPACKET) && - (sock->type != SOCK_DGRAM) && - (sock->type != SOCK_RDM)) - return -EPROTOTYPE; - if (unlikely(protocol != 0)) return -EPROTONOSUPPORT; @@ -199,6 +193,9 @@ static int tipc_create(struct socket *sock, int protocol) sock->ops = &msg_ops; sock->state = SS_READY; break; + default: + tipc_deleteport(ref); + return -EPROTOTYPE; } sk = sk_alloc(AF_TIPC, GFP_KERNEL, &tipc_proto, 1); @@ -426,7 +423,7 @@ static int dest_name_check(struct sockaddr_tipc *dest, struct msghdr *m) if (copy_from_user(&hdr, m->msg_iov[0].iov_base, sizeof(hdr))) return -EFAULT; - if ((ntohs(hdr.tcm_type) & 0xC000) & (!capable(CAP_NET_ADMIN))) + if ((ntohs(hdr.tcm_type) & 0xC000) && (!capable(CAP_NET_ADMIN))) return -EACCES; return 0; @@ -437,7 +434,7 @@ static int dest_name_check(struct sockaddr_tipc *dest, struct msghdr *m) * @iocb: (unused) * @sock: socket structure * @m: message to send - * @total_len: (unused) + * @total_len: length of message * * Message must have an destination specified explicitly. * Used for SOCK_RDM and SOCK_DGRAM messages, @@ -458,7 +455,8 @@ static int send_msg(struct kiocb *iocb, struct socket *sock, if (unlikely(!dest)) return -EDESTADDRREQ; - if (unlikely(dest->family != AF_TIPC)) + if (unlikely((m->msg_namelen < sizeof(*dest)) || + (dest->family != AF_TIPC))) return -EINVAL; needs_conn = (sock->state != SS_READY); @@ -470,6 +468,10 @@ static int send_msg(struct kiocb *iocb, struct socket *sock, if ((tsock->p->published) || ((sock->type == SOCK_STREAM) && (total_len != 0))) return -EOPNOTSUPP; + if (dest->addrtype == TIPC_ADDR_NAME) { + tsock->p->conn_type = dest->addr.name.name.type; + tsock->p->conn_instance = dest->addr.name.name.instance; + } } if (down_interruptible(&tsock->sem)) @@ -538,7 +540,7 @@ exit: * @iocb: (unused) * @sock: socket structure * @m: message to send - * @total_len: (unused) + * @total_len: length of message * * Used for SOCK_SEQPACKET messages and SOCK_STREAM data. * @@ -561,15 +563,15 @@ static int send_packet(struct kiocb *iocb, struct socket *sock, return -ERESTARTSYS; } - if (unlikely(sock->state != SS_CONNECTED)) { - if (sock->state == SS_DISCONNECTING) - res = -EPIPE; - else - res = -ENOTCONN; - goto exit; - } - do { + if (unlikely(sock->state != SS_CONNECTED)) { + if (sock->state == SS_DISCONNECTING) + res = -EPIPE; + else + res = -ENOTCONN; + goto exit; + } + res = tipc_send(tsock->p->ref, m->msg_iovlen, m->msg_iov); if (likely(res != -ELINKCONG)) { exit: @@ -597,7 +599,8 @@ exit: * * Used for SOCK_STREAM data. * - * Returns the number of bytes sent on success, or errno otherwise + * Returns the number of bytes sent on success (or partial success), + * or errno if no data sent */ @@ -611,6 +614,7 @@ static int send_stream(struct kiocb *iocb, struct socket *sock, char __user *curr_start; int curr_left; int bytes_to_send; + int bytes_sent; int res; if (likely(total_len <= TIPC_MAX_USER_MSG_SIZE)) @@ -633,11 +637,11 @@ static int send_stream(struct kiocb *iocb, struct socket *sock, * of small iovec entries into send_packet(). */ - my_msg = *m; - curr_iov = my_msg.msg_iov; - curr_iovlen = my_msg.msg_iovlen; + curr_iov = m->msg_iov; + curr_iovlen = m->msg_iovlen; my_msg.msg_iov = &my_iov; my_msg.msg_iovlen = 1; + bytes_sent = 0; while (curr_iovlen--) { curr_start = curr_iov->iov_base; @@ -648,16 +652,18 @@ static int send_stream(struct kiocb *iocb, struct socket *sock, ? curr_left : TIPC_MAX_USER_MSG_SIZE; my_iov.iov_base = curr_start; my_iov.iov_len = bytes_to_send; - if ((res = send_packet(iocb, sock, &my_msg, 0)) < 0) - return res; + if ((res = send_packet(iocb, sock, &my_msg, 0)) < 0) { + return bytes_sent ? bytes_sent : res; + } curr_left -= bytes_to_send; curr_start += bytes_to_send; + bytes_sent += bytes_to_send; } curr_iov++; } - return total_len; + return bytes_sent; } /** @@ -727,6 +733,7 @@ static int anc_data_recv(struct msghdr *m, struct tipc_msg *msg, u32 anc_data[3]; u32 err; u32 dest_type; + int has_name; int res; if (likely(m->msg_controllen == 0)) @@ -738,10 +745,10 @@ static int anc_data_recv(struct msghdr *m, struct tipc_msg *msg, if (unlikely(err)) { anc_data[0] = err; anc_data[1] = msg_data_sz(msg); - if ((res = put_cmsg(m, SOL_SOCKET, TIPC_ERRINFO, 8, anc_data))) + if ((res = put_cmsg(m, SOL_TIPC, TIPC_ERRINFO, 8, anc_data))) return res; if (anc_data[1] && - (res = put_cmsg(m, SOL_SOCKET, TIPC_RETDATA, anc_data[1], + (res = put_cmsg(m, SOL_TIPC, TIPC_RETDATA, anc_data[1], msg_data(msg)))) return res; } @@ -751,25 +758,28 @@ static int anc_data_recv(struct msghdr *m, struct tipc_msg *msg, dest_type = msg ? msg_type(msg) : TIPC_DIRECT_MSG; switch (dest_type) { case TIPC_NAMED_MSG: + has_name = 1; anc_data[0] = msg_nametype(msg); anc_data[1] = msg_namelower(msg); anc_data[2] = msg_namelower(msg); break; case TIPC_MCAST_MSG: + has_name = 1; anc_data[0] = msg_nametype(msg); anc_data[1] = msg_namelower(msg); anc_data[2] = msg_nameupper(msg); break; case TIPC_CONN_MSG: + has_name = (tport->conn_type != 0); anc_data[0] = tport->conn_type; anc_data[1] = tport->conn_instance; anc_data[2] = tport->conn_instance; break; default: - anc_data[0] = 0; + has_name = 0; } - if (anc_data[0] && - (res = put_cmsg(m, SOL_SOCKET, TIPC_DESTNAME, 12, anc_data))) + if (has_name && + (res = put_cmsg(m, SOL_TIPC, TIPC_DESTNAME, 12, anc_data))) return res; return 0; @@ -960,7 +970,7 @@ static int recv_stream(struct kiocb *iocb, struct socket *sock, restart: if (unlikely((skb_queue_len(&sock->sk->sk_receive_queue) == 0) && (flags & MSG_DONTWAIT))) { - res = (sz_copied == 0) ? -EWOULDBLOCK : 0; + res = -EWOULDBLOCK; goto exit; } @@ -1051,7 +1061,7 @@ restart: exit: up(&tsock->sem); - return res ? res : sz_copied; + return sz_copied ? sz_copied : res; } /** @@ -1236,7 +1246,8 @@ static int connect(struct socket *sock, struct sockaddr *dest, int destlen, if (sock->state == SS_READY) return -EOPNOTSUPP; - /* MOVE THE REST OF THIS ERROR CHECKING TO send_msg()? */ + /* Issue Posix-compliant error code if socket is in the wrong state */ + if (sock->state == SS_LISTENING) return -EOPNOTSUPP; if (sock->state == SS_CONNECTING) @@ -1244,13 +1255,20 @@ static int connect(struct socket *sock, struct sockaddr *dest, int destlen, if (sock->state != SS_UNCONNECTED) return -EISCONN; - if ((dst->family != AF_TIPC) || - ((dst->addrtype != TIPC_ADDR_NAME) && (dst->addrtype != TIPC_ADDR_ID))) + /* + * Reject connection attempt using multicast address + * + * Note: send_msg() validates the rest of the address fields, + * so there's no need to do it here + */ + + if (dst->addrtype == TIPC_ADDR_MCAST) return -EINVAL; /* Send a 'SYN-' to destination */ m.msg_name = dest; + m.msg_namelen = destlen; if ((res = send_msg(NULL, sock, &m, 0)) < 0) { sock->state = SS_DISCONNECTING; return res; @@ -1269,10 +1287,6 @@ static int connect(struct socket *sock, struct sockaddr *dest, int destlen, msg = buf_msg(buf); res = auto_connect(sock, tsock, msg); if (!res) { - if (dst->addrtype == TIPC_ADDR_NAME) { - tsock->p->conn_type = dst->addr.name.name.type; - tsock->p->conn_instance = dst->addr.name.name.instance; - } if (!msg_data_sz(msg)) advance_queue(tsock); } @@ -1386,7 +1400,7 @@ exit: /** * shutdown - shutdown socket connection * @sock: socket structure - * @how: direction to close (always treated as read + write) + * @how: direction to close (unused; always treated as read + write) * * Terminates connection (if necessary), then purges socket's receive queue. * @@ -1469,7 +1483,8 @@ restart: * Returns 0 on success, errno otherwise */ -static int setsockopt(struct socket *sock, int lvl, int opt, char *ov, int ol) +static int setsockopt(struct socket *sock, + int lvl, int opt, char __user *ov, int ol) { struct tipc_sock *tsock = tipc_sk(sock->sk); u32 value; @@ -1525,7 +1540,8 @@ static int setsockopt(struct socket *sock, int lvl, int opt, char *ov, int ol) * Returns 0 on success, errno otherwise */ -static int getsockopt(struct socket *sock, int lvl, int opt, char *ov, int *ol) +static int getsockopt(struct socket *sock, + int lvl, int opt, char __user *ov, int *ol) { struct tipc_sock *tsock = tipc_sk(sock->sk); int len; diff --git a/net/tipc/subscr.c b/net/tipc/subscr.c index c5f026c7f..c51600ba5 100644 --- a/net/tipc/subscr.c +++ b/net/tipc/subscr.c @@ -266,7 +266,8 @@ static void subscr_subscribe(struct tipc_subscr *s, /* Refuse subscription if global limit exceeded */ if (atomic_read(&topsrv.subscription_count) >= tipc_max_subscriptions) { - warn("Failed: max %u subscriptions\n", tipc_max_subscriptions); + warn("Subscription rejected, subscription limit reached (%u)\n", + tipc_max_subscriptions); subscr_terminate(subscriber); return; } @@ -274,8 +275,8 @@ static void subscr_subscribe(struct tipc_subscr *s, /* Allocate subscription object */ sub = kmalloc(sizeof(*sub), GFP_ATOMIC); - if (sub == NULL) { - warn("Memory squeeze; ignoring subscription\n"); + if (!sub) { + warn("Subscription rejected, no memory\n"); subscr_terminate(subscriber); return; } @@ -298,8 +299,7 @@ static void subscr_subscribe(struct tipc_subscr *s, if ((((sub->filter != TIPC_SUB_PORTS) && (sub->filter != TIPC_SUB_SERVICE))) || (sub->seq.lower > sub->seq.upper)) { - warn("Rejecting illegal subscription %u,%u,%u\n", - sub->seq.type, sub->seq.lower, sub->seq.upper); + warn("Subscription rejected, illegal request\n"); kfree(sub); subscr_terminate(subscriber); return; @@ -387,23 +387,22 @@ static void subscr_named_msg_event(void *usr_handle, dbg("subscr_named_msg_event: orig = %x own = %x,\n", orig->node, tipc_own_addr); if (size && (size != sizeof(struct tipc_subscr))) { - warn("Received tipc_subscr of invalid size\n"); + warn("Subscriber rejected, invalid subscription size\n"); return; } /* Create subscriber object */ - subscriber = kmalloc(sizeof(struct subscriber), GFP_ATOMIC); + subscriber = kzalloc(sizeof(struct subscriber), GFP_ATOMIC); if (subscriber == NULL) { - warn("Memory squeeze; ignoring subscriber setup\n"); + warn("Subscriber rejected, no memory\n"); return; } - memset(subscriber, 0, sizeof(struct subscriber)); INIT_LIST_HEAD(&subscriber->subscription_list); INIT_LIST_HEAD(&subscriber->subscriber_list); subscriber->ref = tipc_ref_acquire(subscriber, &subscriber->lock); if (subscriber->ref == 0) { - warn("Failed to acquire subscriber reference\n"); + warn("Subscriber rejected, reference table exhausted\n"); kfree(subscriber); return; } @@ -422,7 +421,7 @@ static void subscr_named_msg_event(void *usr_handle, NULL, &subscriber->port_ref); if (subscriber->port_ref == 0) { - warn("Memory squeeze; failed to create subscription port\n"); + warn("Subscriber rejected, unable to create port\n"); tipc_ref_discard(subscriber->ref); kfree(subscriber); return; @@ -457,7 +456,7 @@ int tipc_subscr_start(void) int res = -1; memset(&topsrv, 0, sizeof (topsrv)); - topsrv.lock = SPIN_LOCK_UNLOCKED; + spin_lock_init(&topsrv.lock); INIT_LIST_HEAD(&topsrv.subscriber_list); spin_lock_bh(&topsrv.lock); diff --git a/net/tipc/user_reg.c b/net/tipc/user_reg.c index 3f3f93397..04d1b9be9 100644 --- a/net/tipc/user_reg.c +++ b/net/tipc/user_reg.c @@ -67,7 +67,7 @@ struct tipc_user { static struct tipc_user *users = NULL; static u32 next_free_user = MAX_USERID + 1; -static spinlock_t reg_lock = SPIN_LOCK_UNLOCKED; +static DEFINE_SPINLOCK(reg_lock); /** * reg_init - create TIPC user registry (but don't activate it) @@ -82,9 +82,8 @@ static int reg_init(void) spin_lock_bh(®_lock); if (!users) { - users = (struct tipc_user *)kmalloc(USER_LIST_SIZE, GFP_ATOMIC); + users = kzalloc(USER_LIST_SIZE, GFP_ATOMIC); if (users) { - memset(users, 0, USER_LIST_SIZE); for (i = 1; i <= MAX_USERID; i++) { users[i].next = i - 1; } diff --git a/net/tipc/zone.c b/net/tipc/zone.c index 2803e1b4f..f5b00ea2d 100644 --- a/net/tipc/zone.c +++ b/net/tipc/zone.c @@ -44,19 +44,23 @@ struct _zone *tipc_zone_create(u32 addr) { - struct _zone *z_ptr = NULL; + struct _zone *z_ptr; u32 z_num; - if (!tipc_addr_domain_valid(addr)) + if (!tipc_addr_domain_valid(addr)) { + err("Zone creation failed, invalid domain 0x%x\n", addr); return NULL; + } - z_ptr = (struct _zone *)kmalloc(sizeof(*z_ptr), GFP_ATOMIC); - if (z_ptr != NULL) { - memset(z_ptr, 0, sizeof(*z_ptr)); - z_num = tipc_zone(addr); - z_ptr->addr = tipc_addr(z_num, 0, 0); - tipc_net.zones[z_num] = z_ptr; + z_ptr = kzalloc(sizeof(*z_ptr), GFP_ATOMIC); + if (!z_ptr) { + warn("Zone creation failed, insufficient memory\n"); + return NULL; } + + z_num = tipc_zone(addr); + z_ptr->addr = tipc_addr(z_num, 0, 0); + tipc_net.zones[z_num] = z_ptr; return z_ptr; } diff --git a/net/tipc/zone.h b/net/tipc/zone.h index 267999c5a..5ab3d0860 100644 --- a/net/tipc/zone.h +++ b/net/tipc/zone.h @@ -2,7 +2,7 @@ * net/tipc/zone.h: Include file for TIPC zone management routines * * Copyright (c) 2000-2006, Ericsson AB - * Copyright (c) 2005, Wind River Systems + * Copyright (c) 2005-2006, Wind River Systems * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -45,7 +45,7 @@ * struct _zone - TIPC zone structure * @addr: network address of zone * @clusters: array of pointers to all clusters within zone - * @links: (used for inter-zone communication) + * @links: number of (unicast) links to zone */ struct _zone { diff --git a/net/tux/cachemiss.c b/net/tux/cachemiss.c index 1a96ab6b8..240eb901f 100644 --- a/net/tux/cachemiss.c +++ b/net/tux/cachemiss.c @@ -236,7 +236,7 @@ int start_cachemiss_threads (threadinfo_t *ti) memset(iot, 0, sizeof(*iot)); iot->ti = ti; - iot->async_lock = SPIN_LOCK_UNLOCKED; + spin_lock_init(&iot->async_lock); iot->nr_async_pending = 0; INIT_LIST_HEAD(&iot->async_queue); init_waitqueue_head(&iot->async_sleep); diff --git a/net/tux/directory.c b/net/tux/directory.c index 03c5474f1..ff221fc29 100644 --- a/net/tux/directory.c +++ b/net/tux/directory.c @@ -205,7 +205,7 @@ next_dir: #define ROUND_UP64(x) (((x)+sizeof(u64)-1) & ~(sizeof(u64)-1)) static int filldir64(void * __buf, const char * name, int namlen, loff_t offset, - ino_t ino, unsigned int d_type) + u64 ino, unsigned int d_type) { struct linux_dirent64 * dirent, d; struct getdents_callback64 * buf = (struct getdents_callback64 *) __buf; diff --git a/net/tux/input.c b/net/tux/input.c index 28cebcb34..792ffb4e9 100644 --- a/net/tux/input.c +++ b/net/tux/input.c @@ -270,7 +270,7 @@ static int read_request (struct socket *sock, char *buf, int max_size) int len; - msg.msg_name = 0; + msg.msg_name = NULL; msg.msg_namelen = 0; msg.msg_iov = &iov; msg.msg_iovlen = 1; @@ -320,7 +320,7 @@ static int zap_urg_data (struct socket *sock) oldmm = get_fs(); set_fs(KERNEL_DS); - msg.msg_name = 0; + msg.msg_name = NULL; msg.msg_namelen = 0; msg.msg_iov = &iov; msg.msg_iovlen = 1; @@ -479,7 +479,7 @@ restart: lock_sock(sk); icsk->icsk_ack.pingpong = 0; icsk->icsk_ack.pending |= ICSK_ACK_PUSHED; - cleanup_rbuf(sk, 1); + tcp_cleanup_rbuf(sk, 1); release_sock(sk); } if (len >= tux_max_header_len-1) diff --git a/net/tux/logger.c b/net/tux/logger.c index c0c2cc3f4..67ef7c162 100644 --- a/net/tux/logger.c +++ b/net/tux/logger.c @@ -29,7 +29,7 @@ * ****************************************************************/ -static spinlock_t log_lock = SPIN_LOCK_UNLOCKED; +static DEFINE_SPINLOCK(log_lock); static unsigned int log_head, log_tail; static char * log_buffer = NULL; static DECLARE_WAIT_QUEUE_HEAD(log_wait); @@ -767,6 +767,10 @@ static int logger_thread (void *data) if (log_buffer) TUX_BUG(); log_buffer = vmalloc(LOG_LEN); + if (!log_buffer) { + TUX_BUG(); + goto out; + } memset(log_buffer, 0, LOG_LEN); log_head = log_tail = 0; @@ -804,7 +808,7 @@ static int logger_thread (void *data) log_buffer = NULL; stop_logger = 0; wake_up(&stop_logger_wait); - +out: set_fs(oldmm); return 0; diff --git a/net/tux/main.c b/net/tux/main.c index d62263b88..663ce9737 100644 --- a/net/tux/main.c +++ b/net/tux/main.c @@ -170,10 +170,10 @@ static int init_queues (int nr_tux_threads) INIT_LIST_HEAD(&ti->all_requests); - ti->free_requests_lock = SPIN_LOCK_UNLOCKED; + spin_lock_init(&ti->free_requests_lock); INIT_LIST_HEAD(&ti->free_requests); - ti->work_lock = SPIN_LOCK_UNLOCKED; + spin_lock_init(&ti->work_lock); INIT_LIST_HEAD(&ti->work_pending); INIT_LIST_HEAD(&ti->lru); @@ -1197,7 +1197,7 @@ eventloop: if (ret) GOTO_ERR_unlock; addr = (char *)(unsigned long)u_addr; - filp = dentry_open(req->dentry, O_RDONLY, 0); + filp = dentry_open(req->dentry, NULL, O_RDONLY); dget(req->dentry); generic_file_read(filp, addr, req->total_file_len, &ppos); fput(filp); diff --git a/net/tux/mod.c b/net/tux/mod.c index e3e192de6..fc52566af 100644 --- a/net/tux/mod.c +++ b/net/tux/mod.c @@ -26,7 +26,7 @@ * ****************************************************************/ -spinlock_t tuxmodules_lock = SPIN_LOCK_UNLOCKED; +DEFINE_SPINLOCK(tuxmodules_lock); static LIST_HEAD(tuxmodules_list); tcapi_template_t * get_first_usermodule (void) diff --git a/net/tux/output.c b/net/tux/output.c index 00d360b31..0cfc22021 100644 --- a/net/tux/output.c +++ b/net/tux/output.c @@ -34,7 +34,7 @@ int send_sync_buf (tux_req_t *req, struct socket *sock, const char *buf, const s tp->nonagle = 2; - msg.msg_name = 0; + msg.msg_name = NULL; msg.msg_namelen = 0; msg.msg_iov = &iov; msg.msg_iovlen = 1; diff --git a/net/tux/proc.c b/net/tux/proc.c index ca78f3d21..1e535ef1c 100644 --- a/net/tux/proc.c +++ b/net/tux/proc.c @@ -742,17 +742,17 @@ static ctl_table tux_table[] = { NULL, NULL }, - {0,0,0,0,0,0,0,0,0,0,0} }; + {0, NULL, NULL, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL} }; static ctl_table tux_dir_table[] = { - {NET_TUX, "tux", NULL, 0, 0555, tux_table,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0} + {NET_TUX, "tux", NULL, 0, 0555, tux_table, NULL, NULL, NULL, NULL, NULL}, + {0, NULL, NULL, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL} }; static ctl_table tux_root_table[] = { - {CTL_NET, "net", NULL, 0, 0555, tux_dir_table,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0,0} + {CTL_NET, "net", NULL, 0, 0555, tux_dir_table, NULL, NULL, NULL, NULL, NULL}, + {0, NULL, NULL, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL} }; diff --git a/net/tux/proto_ftp.c b/net/tux/proto_ftp.c index 29c72e37c..03ad4f5f6 100644 --- a/net/tux/proto_ftp.c +++ b/net/tux/proto_ftp.c @@ -895,7 +895,7 @@ void ftp_accept_pasv (tux_req_t *req, int cachemiss) icsk1 = inet_csk(req->data_sock->sk); Dprintk("PASV accept on req %p, accept_queue: %p.\n", - req, &icsk->icsk_accept_queue); + req, &icsk1->icsk_accept_queue); if (req->error || (req->data_sock->sk->sk_state != TCP_LISTEN)) goto error; new_socket: @@ -1541,15 +1541,15 @@ static void ftp_pre_log (tux_req_t *req) } tux_proto_t tux_proto_ftp = { - defer_accept: 0, - can_redirect: 0, - got_request: ftp_got_request, - parse_message: parse_ftp_message, - illegal_request: ftp_close, - request_timeout: ftp_timeout, - pre_log: ftp_pre_log, - check_req_err: ftp_check_req_err, - print_dir_line: ftp_print_dir_line, - name: "ftp", + .defer_accept = 0, + .can_redirect = 0, + .got_request = ftp_got_request, + .parse_message = parse_ftp_message, + .illegal_request = ftp_close, + .request_timeout = ftp_timeout, + .pre_log = ftp_pre_log, + .check_req_err = ftp_check_req_err, + .print_dir_line = ftp_print_dir_line, + .name = "ftp", }; diff --git a/net/tux/proto_http.c b/net/tux/proto_http.c index 6656f8529..bb126ddfa 100644 --- a/net/tux/proto_http.c +++ b/net/tux/proto_http.c @@ -1012,11 +1012,11 @@ int handle_gzip_req (tux_req_t *req, unsigned int flags) return 0; } -static spinlock_t mimetypes_lock = SPIN_LOCK_UNLOCKED; +static DEFINE_SPINLOCK(mimetypes_lock); static LIST_HEAD(mimetypes_head); -static mimetype_t default_mimetype = { type: "text/plain", type_len: 10, expire_str: "", expire_str_len: 0 }; +static mimetype_t default_mimetype = { .type = "text/plain", .type_len = 10, .expire_str = "", .expire_str_len = 0 }; #define MAX_MIMETYPE_LEN 128 #define MAX_CACHE_CONTROL_AGE_LEN 30 @@ -2185,13 +2185,13 @@ out_dput: } tux_proto_t tux_proto_http = { - defer_accept: 1, - can_redirect: 1, - got_request: http_got_request, - parse_message: parse_http_message, - illegal_request: http_illegal_request, - check_req_err: http_check_req_err, - print_dir_line: http_print_dir_line, - name: "http", + .defer_accept = 1, + .can_redirect = 1, + .got_request = http_got_request, + .parse_message = parse_http_message, + .illegal_request = http_illegal_request, + .check_req_err = http_check_req_err, + .print_dir_line = http_print_dir_line, + .name = "http", }; diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index d2bdd0116..bcda09eb8 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -83,7 +83,6 @@ */ #include -#include #include #include #include @@ -131,6 +130,24 @@ static atomic_t unix_nr_socks = ATOMIC_INIT(0); #define UNIX_ABSTRACT(sk) (unix_sk(sk)->addr->hash != UNIX_HASH_SIZE) +#ifdef CONFIG_SECURITY_NETWORK +static void unix_get_secdata(struct scm_cookie *scm, struct sk_buff *skb) +{ + memcpy(UNIXSID(skb), &scm->secid, sizeof(u32)); +} + +static inline void unix_set_secdata(struct scm_cookie *scm, struct sk_buff *skb) +{ + scm->secid = *UNIXSID(skb); +} +#else +static inline void unix_get_secdata(struct scm_cookie *scm, struct sk_buff *skb) +{ } + +static inline void unix_set_secdata(struct scm_cookie *scm, struct sk_buff *skb) +{ } +#endif /* CONFIG_SECURITY_NETWORK */ + /* * SMP locking strategy: * hash table is protected with spinlock unix_table_lock @@ -547,6 +564,14 @@ static struct proto unix_proto = { .obj_size = sizeof(struct unix_sock), }; +/* + * AF_UNIX sockets do not interact with hardware, hence they + * dont trigger interrupts - so it's safe for them to have + * bh-unsafe locking for their sk_receive_queue.lock. Split off + * this special lock-class by reinitializing the spinlock key: + */ +static struct lock_class_key af_unix_sk_receive_queue_lock_key; + static struct sock * unix_create1(struct socket *sock) { struct sock *sk = NULL; @@ -562,6 +587,8 @@ static struct sock * unix_create1(struct socket *sock) atomic_inc(&unix_nr_socks); sock_init_data(sock,sk); + lockdep_set_class(&sk->sk_receive_queue.lock, + &af_unix_sk_receive_queue_lock_key); sk->sk_write_space = unix_write_space; sk->sk_max_ack_backlog = sysctl_unix_max_dgram_qlen; @@ -635,11 +662,10 @@ static int unix_autobind(struct socket *sock) goto out; err = -ENOMEM; - addr = kmalloc(sizeof(*addr) + sizeof(short) + 16, GFP_KERNEL); + addr = kzalloc(sizeof(*addr) + sizeof(short) + 16, GFP_KERNEL); if (!addr) goto out; - memset(addr, 0, sizeof(*addr) + sizeof(short) + 16); addr->name->sun_family = AF_UNIX; atomic_set(&addr->refcnt, 1); @@ -1027,7 +1053,7 @@ restart: goto out_unlock; } - unix_state_wlock(sk); + unix_state_wlock_nested(sk); if (sk->sk_state != st) { unix_state_wunlock(sk); @@ -1295,6 +1321,7 @@ static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock, memcpy(UNIXCREDS(skb), &siocb->scm->creds, sizeof(struct ucred)); if (siocb->scm->fp) unix_attach_fds(siocb->scm, skb); + unix_get_secdata(siocb->scm, skb); skb->h.raw = skb->data; err = memcpy_fromiovec(skb_put(skb,len), msg->msg_iov, len); @@ -1575,6 +1602,7 @@ static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock, memset(&tmp_scm, 0, sizeof(tmp_scm)); } siocb->scm->creds = *UNIXCREDS(skb); + unix_set_secdata(siocb->scm, skb); if (!(flags & MSG_PEEK)) { diff --git a/net/wanrouter/af_wanpipe.c b/net/wanrouter/af_wanpipe.c index b1265187b..6f39faa15 100644 --- a/net/wanrouter/af_wanpipe.c +++ b/net/wanrouter/af_wanpipe.c @@ -32,7 +32,6 @@ * ******************************************************************************/ -#include #include #include #include @@ -371,12 +370,11 @@ static int wanpipe_listen_rcv (struct sk_buff *skb, struct sock *sk) * used by the ioctl call to read call information * and to execute commands. */ - if ((mbox_ptr = kmalloc(sizeof(mbox_cmd_t), GFP_ATOMIC)) == NULL) { + if ((mbox_ptr = kzalloc(sizeof(mbox_cmd_t), GFP_ATOMIC)) == NULL) { wanpipe_kill_sock_irq (newsk); release_device(dev); return -ENOMEM; } - memset(mbox_ptr, 0, sizeof(mbox_cmd_t)); memcpy(mbox_ptr,skb->data,skb->len); /* Register the lcn on which incoming call came @@ -508,11 +506,10 @@ static struct sock *wanpipe_alloc_socket(void) if ((sk = sk_alloc(PF_WANPIPE, GFP_ATOMIC, &wanpipe_proto, 1)) == NULL) return NULL; - if ((wan_opt = kmalloc(sizeof(struct wanpipe_opt), GFP_ATOMIC)) == NULL) { + if ((wan_opt = kzalloc(sizeof(struct wanpipe_opt), GFP_ATOMIC)) == NULL) { sk_free(sk); return NULL; } - memset(wan_opt, 0x00, sizeof(struct wanpipe_opt)); wp_sk(sk) = wan_opt; @@ -2012,10 +2009,9 @@ static int set_ioctl_cmd (struct sock *sk, void *arg) dev_put(dev); - if ((mbox_ptr = kmalloc(sizeof(mbox_cmd_t), GFP_ATOMIC)) == NULL) + if ((mbox_ptr = kzalloc(sizeof(mbox_cmd_t), GFP_ATOMIC)) == NULL) return -ENOMEM; - memset(mbox_ptr, 0, sizeof(mbox_cmd_t)); wp_sk(sk)->mbox = mbox_ptr; wanpipe_link_driver(dev,sk); diff --git a/net/wanrouter/wanmain.c b/net/wanrouter/wanmain.c index c34833dc7..947965927 100644 --- a/net/wanrouter/wanmain.c +++ b/net/wanrouter/wanmain.c @@ -42,7 +42,6 @@ * Jun 02, 1999 Gideon Hack Updates for Linux 2.0.X and 2.2.X kernels. *****************************************************************************/ -#include #include /* offsetof(), etc. */ #include #include /* return codes */ @@ -643,18 +642,16 @@ static int wanrouter_device_new_if(struct wan_device *wandev, if (cnf->config_id == WANCONFIG_MPPP) { #ifdef CONFIG_WANPIPE_MULTPPP - pppdev = kmalloc(sizeof(struct ppp_device), GFP_KERNEL); + pppdev = kzalloc(sizeof(struct ppp_device), GFP_KERNEL); err = -ENOBUFS; if (pppdev == NULL) goto out; - memset(pppdev, 0, sizeof(struct ppp_device)); - pppdev->dev = kmalloc(sizeof(struct net_device), GFP_KERNEL); + pppdev->dev = kzalloc(sizeof(struct net_device), GFP_KERNEL); if (pppdev->dev == NULL) { kfree(pppdev); err = -ENOBUFS; goto out; } - memset(pppdev->dev, 0, sizeof(struct net_device)); err = wandev->new_if(wandev, (struct net_device *)pppdev, cnf); dev = pppdev->dev; #else @@ -664,11 +661,10 @@ static int wanrouter_device_new_if(struct wan_device *wandev, goto out; #endif } else { - dev = kmalloc(sizeof(struct net_device), GFP_KERNEL); + dev = kzalloc(sizeof(struct net_device), GFP_KERNEL); err = -ENOBUFS; if (dev == NULL) goto out; - memset(dev, 0, sizeof(struct net_device)); err = wandev->new_if(wandev, dev, cnf); } diff --git a/net/wanrouter/wanproc.c b/net/wanrouter/wanproc.c index c28ba5a47..930ea5946 100644 --- a/net/wanrouter/wanproc.c +++ b/net/wanrouter/wanproc.c @@ -20,7 +20,6 @@ * Dec 13, 1996 Gene Kozin Initial version (based on Sangoma's WANPIPE) *****************************************************************************/ -#include #include /* __initfunc et al. */ #include /* offsetof(), etc. */ #include /* return codes */ diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c index f404f67be..471e49dd2 100644 --- a/net/x25/af_x25.c +++ b/net/x25/af_x25.c @@ -35,7 +35,6 @@ * response */ -#include #include #include #include diff --git a/net/x25/x25_dev.c b/net/x25/x25_dev.c index adfe7b8df..47b68a301 100644 --- a/net/x25/x25_dev.c +++ b/net/x25/x25_dev.c @@ -17,7 +17,6 @@ * 2000-09-04 Henner Eisen Prevent freeing a dangling skb. */ -#include #include #include #include diff --git a/net/x25/x25_proc.c b/net/x25/x25_proc.c index dfb80116c..a11837d36 100644 --- a/net/x25/x25_proc.c +++ b/net/x25/x25_proc.c @@ -17,7 +17,6 @@ * 2002/10/06 Arnaldo Carvalho de Melo seq_file support */ -#include #include #include #include diff --git a/net/x25/x25_route.c b/net/x25/x25_route.c index 6c5d37517..2a3fe986b 100644 --- a/net/x25/x25_route.c +++ b/net/x25/x25_route.c @@ -17,7 +17,6 @@ * X.25 001 Jonathan Naylor Started coding. */ -#include #include #include #include diff --git a/net/xfrm/xfrm_algo.c b/net/xfrm/xfrm_algo.c index 6ed330231..04e1aea58 100644 --- a/net/xfrm/xfrm_algo.c +++ b/net/xfrm/xfrm_algo.c @@ -9,7 +9,6 @@ * any later version. */ -#include #include #include #include diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index b469c8b54..3da67ca2c 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c @@ -13,7 +13,6 @@ * */ -#include #include #include #include @@ -46,45 +45,43 @@ static DEFINE_SPINLOCK(xfrm_policy_gc_lock); static struct xfrm_policy_afinfo *xfrm_policy_get_afinfo(unsigned short family); static void xfrm_policy_put_afinfo(struct xfrm_policy_afinfo *afinfo); +static struct xfrm_policy_afinfo *xfrm_policy_lock_afinfo(unsigned int family); +static void xfrm_policy_unlock_afinfo(struct xfrm_policy_afinfo *afinfo); int xfrm_register_type(struct xfrm_type *type, unsigned short family) { - struct xfrm_policy_afinfo *afinfo = xfrm_policy_get_afinfo(family); - struct xfrm_type_map *typemap; + struct xfrm_policy_afinfo *afinfo = xfrm_policy_lock_afinfo(family); + struct xfrm_type **typemap; int err = 0; if (unlikely(afinfo == NULL)) return -EAFNOSUPPORT; typemap = afinfo->type_map; - write_lock_bh(&typemap->lock); - if (likely(typemap->map[type->proto] == NULL)) - typemap->map[type->proto] = type; + if (likely(typemap[type->proto] == NULL)) + typemap[type->proto] = type; else err = -EEXIST; - write_unlock_bh(&typemap->lock); - xfrm_policy_put_afinfo(afinfo); + xfrm_policy_unlock_afinfo(afinfo); return err; } EXPORT_SYMBOL(xfrm_register_type); int xfrm_unregister_type(struct xfrm_type *type, unsigned short family) { - struct xfrm_policy_afinfo *afinfo = xfrm_policy_get_afinfo(family); - struct xfrm_type_map *typemap; + struct xfrm_policy_afinfo *afinfo = xfrm_policy_lock_afinfo(family); + struct xfrm_type **typemap; int err = 0; if (unlikely(afinfo == NULL)) return -EAFNOSUPPORT; typemap = afinfo->type_map; - write_lock_bh(&typemap->lock); - if (unlikely(typemap->map[type->proto] != type)) + if (unlikely(typemap[type->proto] != type)) err = -ENOENT; else - typemap->map[type->proto] = NULL; - write_unlock_bh(&typemap->lock); - xfrm_policy_put_afinfo(afinfo); + typemap[type->proto] = NULL; + xfrm_policy_unlock_afinfo(afinfo); return err; } EXPORT_SYMBOL(xfrm_unregister_type); @@ -92,7 +89,7 @@ EXPORT_SYMBOL(xfrm_unregister_type); struct xfrm_type *xfrm_get_type(u8 proto, unsigned short family) { struct xfrm_policy_afinfo *afinfo; - struct xfrm_type_map *typemap; + struct xfrm_type **typemap; struct xfrm_type *type; int modload_attempted = 0; @@ -102,11 +99,9 @@ retry: return NULL; typemap = afinfo->type_map; - read_lock(&typemap->lock); - type = typemap->map[proto]; + type = typemap[proto]; if (unlikely(type && !try_module_get(type->owner))) type = NULL; - read_unlock(&typemap->lock); if (!type && !modload_attempted) { xfrm_policy_put_afinfo(afinfo); request_module("xfrm-type-%d-%d", @@ -142,6 +137,89 @@ void xfrm_put_type(struct xfrm_type *type) module_put(type->owner); } +int xfrm_register_mode(struct xfrm_mode *mode, int family) +{ + struct xfrm_policy_afinfo *afinfo; + struct xfrm_mode **modemap; + int err; + + if (unlikely(mode->encap >= XFRM_MODE_MAX)) + return -EINVAL; + + afinfo = xfrm_policy_lock_afinfo(family); + if (unlikely(afinfo == NULL)) + return -EAFNOSUPPORT; + + err = -EEXIST; + modemap = afinfo->mode_map; + if (likely(modemap[mode->encap] == NULL)) { + modemap[mode->encap] = mode; + err = 0; + } + + xfrm_policy_unlock_afinfo(afinfo); + return err; +} +EXPORT_SYMBOL(xfrm_register_mode); + +int xfrm_unregister_mode(struct xfrm_mode *mode, int family) +{ + struct xfrm_policy_afinfo *afinfo; + struct xfrm_mode **modemap; + int err; + + if (unlikely(mode->encap >= XFRM_MODE_MAX)) + return -EINVAL; + + afinfo = xfrm_policy_lock_afinfo(family); + if (unlikely(afinfo == NULL)) + return -EAFNOSUPPORT; + + err = -ENOENT; + modemap = afinfo->mode_map; + if (likely(modemap[mode->encap] == mode)) { + modemap[mode->encap] = NULL; + err = 0; + } + + xfrm_policy_unlock_afinfo(afinfo); + return err; +} +EXPORT_SYMBOL(xfrm_unregister_mode); + +struct xfrm_mode *xfrm_get_mode(unsigned int encap, int family) +{ + struct xfrm_policy_afinfo *afinfo; + struct xfrm_mode *mode; + int modload_attempted = 0; + + if (unlikely(encap >= XFRM_MODE_MAX)) + return NULL; + +retry: + afinfo = xfrm_policy_get_afinfo(family); + if (unlikely(afinfo == NULL)) + return NULL; + + mode = afinfo->mode_map[encap]; + if (unlikely(mode && !try_module_get(mode->owner))) + mode = NULL; + if (!mode && !modload_attempted) { + xfrm_policy_put_afinfo(afinfo); + request_module("xfrm-mode-%d-%d", family, encap); + modload_attempted = 1; + goto retry; + } + + xfrm_policy_put_afinfo(afinfo); + return mode; +} + +void xfrm_put_mode(struct xfrm_mode *mode) +{ + module_put(mode->owner); +} + static inline unsigned long make_jiffies(long secs) { if (secs >= (MAX_SCHEDULE_TIMEOUT-1)/HZ) @@ -229,10 +307,9 @@ struct xfrm_policy *xfrm_policy_alloc(gfp_t gfp) { struct xfrm_policy *policy; - policy = kmalloc(sizeof(struct xfrm_policy), gfp); + policy = kzalloc(sizeof(struct xfrm_policy), gfp); if (policy) { - memset(policy, 0, sizeof(struct xfrm_policy)); atomic_set(&policy->refcnt, 1); rwlock_init(&policy->lock); init_timer(&policy->timer); @@ -1057,12 +1134,33 @@ 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 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. + /* Code (such as __xfrm4_bundle_create()) sets dst->obsolete + * to "-1" to force all XFRM destinations to get validated by + * dst_ops->check on every use. We do this because when a + * normal route referenced by an XFRM dst is obsoleted we do + * not go looking around for all parent referencing XFRM dsts + * so that we can invalidate them. It is just too much work. + * Instead we make the checks here on every use. For example: + * + * XFRM dst A --> IPv4 dst X + * + * X is the "xdst->route" of A (X is also the "dst->path" of A + * in this example). If X is marked obsolete, "A" will not + * notice. That's what we are validating here via the + * stale_bundle() check. + * + * When a policy's bundle is pruned, we dst_free() the XFRM + * dst which causes it's ->obsolete field to be set to a + * positive non-zero integer. If an XFRM dst has been pruned + * like this, we want to force a new route lookup. */ + if (dst->obsolete < 0 && !stale_bundle(dst)) + return dst; + return NULL; } @@ -1306,17 +1404,31 @@ static struct xfrm_policy_afinfo *xfrm_policy_get_afinfo(unsigned short family) return NULL; read_lock(&xfrm_policy_afinfo_lock); afinfo = xfrm_policy_afinfo[family]; - if (likely(afinfo != NULL)) - read_lock(&afinfo->lock); - read_unlock(&xfrm_policy_afinfo_lock); + if (unlikely(!afinfo)) + read_unlock(&xfrm_policy_afinfo_lock); return afinfo; } static void xfrm_policy_put_afinfo(struct xfrm_policy_afinfo *afinfo) { - if (unlikely(afinfo == NULL)) - return; - read_unlock(&afinfo->lock); + read_unlock(&xfrm_policy_afinfo_lock); +} + +static struct xfrm_policy_afinfo *xfrm_policy_lock_afinfo(unsigned int family) +{ + struct xfrm_policy_afinfo *afinfo; + if (unlikely(family >= NPROTO)) + return NULL; + write_lock_bh(&xfrm_policy_afinfo_lock); + afinfo = xfrm_policy_afinfo[family]; + if (unlikely(!afinfo)) + write_unlock_bh(&xfrm_policy_afinfo_lock); + return afinfo; +} + +static void xfrm_policy_unlock_afinfo(struct xfrm_policy_afinfo *afinfo) +{ + write_unlock_bh(&xfrm_policy_afinfo_lock); } static int xfrm_dev_event(struct notifier_block *this, unsigned long event, void *ptr) diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index 93a2f36ad..0021aad5d 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c @@ -77,6 +77,8 @@ static void xfrm_state_gc_destroy(struct xfrm_state *x) kfree(x->ealg); kfree(x->calg); kfree(x->encap); + if (x->mode) + xfrm_put_mode(x->mode); if (x->type) { x->type->destructor(x); xfrm_put_type(x->type); @@ -192,10 +194,9 @@ struct xfrm_state *xfrm_state_alloc(void) { struct xfrm_state *x; - x = kmalloc(sizeof(struct xfrm_state), GFP_ATOMIC); + x = kzalloc(sizeof(struct xfrm_state), GFP_ATOMIC); if (x) { - memset(x, 0, sizeof(struct xfrm_state)); atomic_set(&x->refcnt, 1); atomic_set(&x->tunnel_users, 0); INIT_LIST_HEAD(&x->bydst); @@ -1103,17 +1104,14 @@ static struct xfrm_state_afinfo *xfrm_state_get_afinfo(unsigned short family) return NULL; read_lock(&xfrm_state_afinfo_lock); afinfo = xfrm_state_afinfo[family]; - if (likely(afinfo != NULL)) - read_lock(&afinfo->lock); - read_unlock(&xfrm_state_afinfo_lock); + if (unlikely(!afinfo)) + read_unlock(&xfrm_state_afinfo_lock); return afinfo; } static void xfrm_state_put_afinfo(struct xfrm_state_afinfo *afinfo) { - if (unlikely(afinfo == NULL)) - return; - read_unlock(&afinfo->lock); + read_unlock(&xfrm_state_afinfo_lock); } /* Temporarily located here until net/xfrm/xfrm_tunnel.c is created */ @@ -1165,8 +1163,6 @@ int xfrm_state_mtu(struct xfrm_state *x, int mtu) return res; } -EXPORT_SYMBOL(xfrm_state_mtu); - int xfrm_init_state(struct xfrm_state *x) { struct xfrm_state_afinfo *afinfo; @@ -1196,6 +1192,10 @@ int xfrm_init_state(struct xfrm_state *x) if (err) goto error; + x->mode = xfrm_get_mode(x->props.mode, family); + if (x->mode == NULL) + goto error; + x->km.state = XFRM_STATE_VALID; error: diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index 81d100583..3e6a722d0 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c @@ -427,23 +427,25 @@ static int xfrm_del_sa(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfrma) if (x == NULL) return -ESRCH; + if ((err = security_xfrm_state_delete(x)) != 0) + goto out; + if (xfrm_state_kern(x)) { - xfrm_state_put(x); - return -EPERM; + err = -EPERM; + goto out; } err = xfrm_state_delete(x); - if (err < 0) { - xfrm_state_put(x); - return err; - } + if (err < 0) + goto out; c.seq = nlh->nlmsg_seq; c.pid = nlh->nlmsg_pid; c.event = nlh->nlmsg_type; km_state_notify(x, &c); - xfrm_state_put(x); +out: + xfrm_state_put(x); return err; } @@ -1055,6 +1057,8 @@ static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfr MSG_DONTWAIT); } } else { + if ((err = security_xfrm_policy_delete(xp)) != 0) + goto out; c.data.byid = p->index; c.event = nlh->nlmsg_type; c.seq = nlh->nlmsg_seq; @@ -1064,6 +1068,7 @@ static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfr xfrm_pol_put(xp); +out: return err; } @@ -1430,7 +1435,7 @@ static int xfrm_user_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, int *err link = &xfrm_dispatch[type]; /* All operations require privileges, even GET */ - if (security_netlink_recv(skb)) { + if (security_netlink_recv(skb, CAP_NET_ADMIN)) { *errp = -EPERM; return -1; } diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include index b0d067be7..bb19c1561 100644 --- a/scripts/Kbuild.include +++ b/scripts/Kbuild.include @@ -12,6 +12,10 @@ space := $(empty) $(empty) # contain a comma depfile = $(subst $(comma),_,$(@D)/.$(@F).d) +### +# filename of target with directory and extension stripped +basetarget = $(basename $(notdir $@)) + ### # Escape single quote for use in echo statements escsq = $(subst $(squote),'\$(squote)',$1) @@ -73,14 +77,20 @@ cc-option-align = $(subst -functions=0,,\ # cc-version # Usage gcc-ver := $(call cc-version, $(CC)) -cc-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-version.sh \ - $(if $(1), $(1), $(CC))) +cc-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-version.sh $(CC)) # cc-ifversion # Usage: EXTRA_CFLAGS += $(call cc-ifversion, -lt, 0402, -O1) cc-ifversion = $(shell if [ $(call cc-version, $(CC)) $(1) $(2) ]; then \ echo $(3); fi;) +# ld-option +# Usage: ldflags += $(call ld-option, -Wl$(comma)--hash-style=both) +ld-option = $(shell if $(CC) $(1) \ + -nostdlib -o ldtest$$$$.out -xc /dev/null \ + > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi; \ + rm -f ldtest$$$$.out) + ### # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj= # Usage: diff --git a/scripts/Makefile.build b/scripts/Makefile.build index e48e60da3..3cb445cc7 100644 --- a/scripts/Makefile.build +++ b/scripts/Makefile.build @@ -8,7 +8,7 @@ PHONY := __build __build: # Read .config if it exist, otherwise ignore --include .config +-include include/config/auto.conf include scripts/Kbuild.include @@ -117,7 +117,7 @@ $(real-objs-m:.o=.lst): quiet_modtag := [M] $(obj-m) : quiet_modtag := [M] # Default for not multi-part modules -modname = $(*F) +modname = $(basetarget) $(multi-objs-m) : modname = $(modname-multi) $(multi-objs-m:.o=.i) : modname = $(modname-multi) @@ -140,6 +140,15 @@ cmd_cc_i_c = $(CPP) $(c_flags) -o $@ $< %.i: %.c FORCE $(call if_changed_dep,cc_i_c) +quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@ +cmd_cc_symtypes_c = \ + $(CPP) -D__GENKSYMS__ $(c_flags) $< \ + | $(GENKSYMS) -T $@ >/dev/null; \ + test -s $@ || rm -f $@ + +%.symtypes : %.c FORCE + $(call if_changed_dep,cc_symtypes_c) + # C (.c) files # The C file is compiled and updated dependency information is generated. # (See cmd_cc_o_c + relevant part of rule_cc_o_c) @@ -166,7 +175,8 @@ cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $< cmd_modversions = \ if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \ $(CPP) -D__GENKSYMS__ $(c_flags) $< \ - | $(GENKSYMS) -a $(ARCH) \ + | $(GENKSYMS) $(if $(KBUILD_SYMTYPES), \ + -T $(@D)/$(@F:.o=.symtypes)) -a $(ARCH) \ > $(@D)/.tmp_$(@F:.o=.ver); \ \ $(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) \ diff --git a/scripts/Makefile.host b/scripts/Makefile.host index 2d519704b..060f4c563 100644 --- a/scripts/Makefile.host +++ b/scripts/Makefile.host @@ -30,11 +30,11 @@ # libkconfig.so as the executable conf. # Note: Shared libraries consisting of C++ files are not supported -__hostprogs := $(sort $(hostprogs-y)$(hostprogs-m)) +__hostprogs := $(sort $(hostprogs-y) $(hostprogs-m)) # hostprogs-y := tools/build may have been specified. Retreive directory -obj-dirs += $(foreach f,$(__hostprogs), $(if $(dir $(f)),$(dir $(f)))) -obj-dirs := $(strip $(sort $(filter-out ./,$(obj-dirs)))) +host-objdirs := $(foreach f,$(__hostprogs), $(if $(dir $(f)),$(dir $(f)))) +host-objdirs := $(strip $(sort $(filter-out ./,$(host-objdirs)))) # C code @@ -73,13 +73,17 @@ host-cxxmulti := $(addprefix $(obj)/,$(host-cxxmulti)) host-cxxobjs := $(addprefix $(obj)/,$(host-cxxobjs)) host-cshlib := $(addprefix $(obj)/,$(host-cshlib)) host-cshobjs := $(addprefix $(obj)/,$(host-cshobjs)) -obj-dirs := $(addprefix $(obj)/,$(obj-dirs)) +host-objdirs := $(addprefix $(obj)/,$(host-objdirs)) + +obj-dirs += $(host-objdirs) ##### # Handle options to gcc. Support building with separate output directory -_hostc_flags = $(HOSTCFLAGS) $(HOST_EXTRACFLAGS) $(HOSTCFLAGS_$(*F).o) -_hostcxx_flags = $(HOSTCXXFLAGS) $(HOST_EXTRACXXFLAGS) $(HOSTCXXFLAGS_$(*F).o) +_hostc_flags = $(HOSTCFLAGS) $(HOST_EXTRACFLAGS) \ + $(HOSTCFLAGS_$(basetarget).o) +_hostcxx_flags = $(HOSTCXXFLAGS) $(HOST_EXTRACXXFLAGS) \ + $(HOSTCXXFLAGS_$(basetarget).o) ifeq ($(KBUILD_SRC),) __hostc_flags = $(_hostc_flags) diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index 2cb4935e8..fc498fee6 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib @@ -82,12 +82,12 @@ obj-dirs := $(addprefix $(obj)/,$(obj-dirs)) # than one module. In that case KBUILD_MODNAME will be set to foo_bar, # where foo and bar are the name of the modules. name-fix = $(subst $(comma),_,$(subst -,_,$1)) -basename_flags = -D"KBUILD_BASENAME=KBUILD_STR($(call name-fix,$(*F)))" +basename_flags = -D"KBUILD_BASENAME=KBUILD_STR($(call name-fix,$(basetarget)))" modname_flags = $(if $(filter 1,$(words $(modname))),\ -D"KBUILD_MODNAME=KBUILD_STR($(call name-fix,$(modname)))") -_c_flags = $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$(*F).o) -_a_flags = $(AFLAGS) $(EXTRA_AFLAGS) $(AFLAGS_$(*F).o) +_c_flags = $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$(basetarget).o) +_a_flags = $(AFLAGS) $(EXTRA_AFLAGS) $(AFLAGS_$(basetarget).o) _cpp_flags = $(CPPFLAGS) $(EXTRA_CPPFLAGS) $(CPPFLAGS_$(@F)) # If building the kernel in a separate objtree expand all occurrences diff --git a/scripts/Makefile.modinst b/scripts/Makefile.modinst index 2686dd5dc..f0ff248f5 100644 --- a/scripts/Makefile.modinst +++ b/scripts/Makefile.modinst @@ -17,7 +17,7 @@ __modinst: $(modules) @: quiet_cmd_modules_install = INSTALL $@ - cmd_modules_install = mkdir -p $(2); cp $@ $(2) + cmd_modules_install = mkdir -p $(2); cp $@ $(2) ; $(mod_strip_cmd) $(2)/$(notdir $@) # Modules built outside the kernel source tree go into extra by default INSTALL_MOD_DIR ?= extra diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost index 0e056cfff..0a64688c2 100644 --- a/scripts/Makefile.modpost +++ b/scripts/Makefile.modpost @@ -35,12 +35,12 @@ PHONY := _modpost _modpost: __modpost -include .config +include include/config/auto.conf include scripts/Kbuild.include include scripts/Makefile.lib kernelsymfile := $(objtree)/Module.symvers -modulesymfile := $(KBUILD_EXTMOD)/Modules.symvers +modulesymfile := $(KBUILD_EXTMOD)/Module.symvers # Step 1), find all modules listed in $(MODVERDIR)/ __modules := $(sort $(shell grep -h '\.ko' /dev/null $(wildcard $(MODVERDIR)/*.mod))) @@ -72,7 +72,7 @@ $(modules:.ko=.mod.c): __modpost ; # Step 5), compile all *.mod.c files # modname is set to make c_flags define KBUILD_MODNAME -modname = $(*F) +modname = $(notdir $(@:.mod.o=)) quiet_cmd_cc_o_c = CC $@ cmd_cc_o_c = $(CC) $(c_flags) $(CFLAGS_MODULE) \ diff --git a/scripts/basic/Makefile b/scripts/basic/Makefile index f22e94c3a..2f60070f9 100644 --- a/scripts/basic/Makefile +++ b/scripts/basic/Makefile @@ -1,17 +1,15 @@ ### # Makefile.basic list the most basic programs used during the build process. # The programs listed herein is what is needed to do the basic stuff, -# such as splitting .config and fix dependency file. +# such as fix dependency file. # This initial step is needed to avoid files to be recompiled # when kernel configuration changes (which is what happens when # .config is included by main Makefile. # --------------------------------------------------------------------------- # fixdep: Used to generate dependency information during build process -# split-include: Divide all config symbols up in a number of files in -# include/config/... # docproc: Used in Documentation/docbook -hostprogs-y := fixdep split-include docproc +hostprogs-y := fixdep docproc always := $(hostprogs-y) # fixdep is needed to compile other host programs diff --git a/scripts/basic/split-include.c b/scripts/basic/split-include.c deleted file mode 100644 index 459c45276..000000000 --- a/scripts/basic/split-include.c +++ /dev/null @@ -1,226 +0,0 @@ -/* - * split-include.c - * - * Copyright abandoned, Michael Chastain, . - * This is a C version of syncdep.pl by Werner Almesberger. - * - * This program takes autoconf.h as input and outputs a directory full - * of one-line include files, merging onto the old values. - * - * Think of the configuration options as key-value pairs. Then there - * are five cases: - * - * key old value new value action - * - * KEY-1 VALUE-1 VALUE-1 leave file alone - * KEY-2 VALUE-2A VALUE-2B write VALUE-2B into file - * KEY-3 - VALUE-3 write VALUE-3 into file - * KEY-4 VALUE-4 - write an empty file - * KEY-5 (empty) - leave old empty file alone - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#define ERROR_EXIT(strExit) \ - { \ - const int errnoSave = errno; \ - fprintf(stderr, "%s: ", str_my_name); \ - errno = errnoSave; \ - perror((strExit)); \ - exit(1); \ - } - - - -int main(int argc, const char * argv []) -{ - const char * str_my_name; - const char * str_file_autoconf; - const char * str_dir_config; - - FILE * fp_config; - FILE * fp_target; - FILE * fp_find; - - int buffer_size; - - char * line; - char * old_line; - char * list_target; - char * ptarget; - - struct stat stat_buf; - - /* Check arg count. */ - if (argc != 3) - { - fprintf(stderr, "%s: wrong number of arguments.\n", argv[0]); - exit(1); - } - - str_my_name = argv[0]; - str_file_autoconf = argv[1]; - str_dir_config = argv[2]; - - /* Find a buffer size. */ - if (stat(str_file_autoconf, &stat_buf) != 0) - ERROR_EXIT(str_file_autoconf); - buffer_size = 2 * stat_buf.st_size + 4096; - - /* Allocate buffers. */ - if ( (line = malloc(buffer_size)) == NULL - || (old_line = malloc(buffer_size)) == NULL - || (list_target = malloc(buffer_size)) == NULL ) - ERROR_EXIT(str_file_autoconf); - - /* Open autoconfig file. */ - if ((fp_config = fopen(str_file_autoconf, "r")) == NULL) - ERROR_EXIT(str_file_autoconf); - - /* Make output directory if needed. */ - if (stat(str_dir_config, &stat_buf) != 0) - { - if (mkdir(str_dir_config, 0755) != 0) - ERROR_EXIT(str_dir_config); - } - - /* Change to output directory. */ - if (chdir(str_dir_config) != 0) - ERROR_EXIT(str_dir_config); - - /* Put initial separator into target list. */ - ptarget = list_target; - *ptarget++ = '\n'; - - /* Read config lines. */ - while (fgets(line, buffer_size, fp_config)) - { - const char * str_config; - int is_same; - int itarget; - - if (line[0] != '#') - continue; - if ((str_config = strstr(line, "CONFIG_")) == NULL) - continue; - - /* Make the output file name. */ - str_config += sizeof("CONFIG_") - 1; - for (itarget = 0; !isspace(str_config[itarget]); itarget++) - { - int c = (unsigned char) str_config[itarget]; - if (isupper(c)) c = tolower(c); - if (c == '_') c = '/'; - ptarget[itarget] = c; - } - ptarget[itarget++] = '.'; - ptarget[itarget++] = 'h'; - ptarget[itarget++] = '\0'; - - /* Check for existing file. */ - is_same = 0; - if ((fp_target = fopen(ptarget, "r")) != NULL) - { - fgets(old_line, buffer_size, fp_target); - if (fclose(fp_target) != 0) - ERROR_EXIT(ptarget); - if (!strcmp(line, old_line)) - is_same = 1; - } - - if (!is_same) - { - /* Auto-create directories. */ - int islash; - for (islash = 0; islash < itarget; islash++) - { - if (ptarget[islash] == '/') - { - ptarget[islash] = '\0'; - if (stat(ptarget, &stat_buf) != 0 - && mkdir(ptarget, 0755) != 0) - ERROR_EXIT( ptarget ); - ptarget[islash] = '/'; - } - } - - /* Write the file. */ - if ((fp_target = fopen(ptarget, "w" )) == NULL) - ERROR_EXIT(ptarget); - fputs(line, fp_target); - if (ferror(fp_target) || fclose(fp_target) != 0) - ERROR_EXIT(ptarget); - } - - /* Update target list */ - ptarget += itarget; - *(ptarget-1) = '\n'; - } - - /* - * Close autoconfig file. - * Terminate the target list. - */ - if (fclose(fp_config) != 0) - ERROR_EXIT(str_file_autoconf); - *ptarget = '\0'; - - /* - * Fix up existing files which have no new value. - * This is Case 4 and Case 5. - * - * I re-read the tree and filter it against list_target. - * This is crude. But it avoids data copies. Also, list_target - * is compact and contiguous, so it easily fits into cache. - * - * Notice that list_target contains strings separated by \n, - * with a \n before the first string and after the last. - * fgets gives the incoming names a terminating \n. - * So by having an initial \n, strstr will find exact matches. - */ - - fp_find = popen("find * -type f -name \"*.h\" -print", "r"); - if (fp_find == 0) - ERROR_EXIT( "find" ); - - line[0] = '\n'; - while (fgets(line+1, buffer_size, fp_find)) - { - if (strstr(list_target, line) == NULL) - { - /* - * This is an old file with no CONFIG_* flag in autoconf.h. - */ - - /* First strip the \n. */ - line[strlen(line)-1] = '\0'; - - /* Grab size. */ - if (stat(line+1, &stat_buf) != 0) - ERROR_EXIT(line); - - /* If file is not empty, make it empty and give it a fresh date. */ - if (stat_buf.st_size != 0) - { - if ((fp_target = fopen(line+1, "w")) == NULL) - ERROR_EXIT(line); - if (fclose(fp_target) != 0) - ERROR_EXIT(line); - } - } - } - - if (pclose(fp_find) != 0) - ERROR_EXIT("find"); - - return 0; -} diff --git a/scripts/bloat-o-meter b/scripts/bloat-o-meter index 75f21d843..ce59fc2d8 100755 --- a/scripts/bloat-o-meter +++ b/scripts/bloat-o-meter @@ -18,7 +18,8 @@ def getsizes(file): for l in os.popen("nm --size-sort " + file).readlines(): size, type, name = l[:-1].split() if type in "tTdDbB": - sym[name] = int(size, 16) + if "." in name: name = "static." + name.split(".")[0] + sym[name] = sym.get(name, 0) + int(size, 16) return sym old = getsizes(sys.argv[1]) diff --git a/scripts/checkstack.pl b/scripts/checkstack.pl index dadfa20ff..b34924663 100644 --- a/scripts/checkstack.pl +++ b/scripts/checkstack.pl @@ -89,11 +89,21 @@ sub bysize($) { # my $funcre = qr/^$x* <(.*)>:$/; my $func; +my $file, $lastslash; + while (my $line = ) { if ($line =~ m/$funcre/) { $func = $1; } - if ($line =~ m/$re/) { + elsif ($line =~ m/(.*):\s*file format/) { + $file = $1; + $file =~ s/\.ko//; + $lastslash = rindex($file, "/"); + if ($lastslash != -1) { + $file = substr($file, $lastslash + 1); + } + } + elsif ($line =~ m/$re/) { my $size = $1; $size = hex($size) if ($size =~ /^0x/); @@ -109,7 +119,7 @@ while (my $line = ) { $addr =~ s/ /0/g; $addr = "0x$addr"; - my $intro = "$addr $func:"; + my $intro = "$addr $func [$file]:"; my $padlen = 56 - length($intro); while ($padlen > 0) { $intro .= ' '; diff --git a/scripts/checkversion.pl b/scripts/checkversion.pl index 9f84e5623..ec7d21161 100755 --- a/scripts/checkversion.pl +++ b/scripts/checkversion.pl @@ -1,7 +1,7 @@ #! /usr/bin/perl # -# checkversion find uses of LINUX_VERSION_CODE, KERNEL_VERSION, or -# UTS_RELEASE without including , or cases of +# checkversion find uses of LINUX_VERSION_CODE or KERNEL_VERSION +# without including , or cases of # including that don't need it. # Copyright (C) 2003, Randy Dunlap @@ -41,8 +41,7 @@ foreach $file (@ARGV) } # Look for uses: LINUX_VERSION_CODE, KERNEL_VERSION, UTS_RELEASE - if (($_ =~ /LINUX_VERSION_CODE/) || ($_ =~ /\WKERNEL_VERSION/) || - ($_ =~ /UTS_RELEASE/)) { + if (($_ =~ /LINUX_VERSION_CODE/) || ($_ =~ /\WKERNEL_VERSION/)) { $fUseVersion = 1; last LINE if $iLinuxVersion; } diff --git a/scripts/genksyms/genksyms.c b/scripts/genksyms/genksyms.c index 5b0344e20..b0381823e 100644 --- a/scripts/genksyms/genksyms.c +++ b/scripts/genksyms/genksyms.c @@ -42,7 +42,7 @@ static FILE *debugfile; int cur_line = 1; char *cur_filename; -static int flag_debug, flag_dump_defs, flag_warnings; +static int flag_debug, flag_dump_defs, flag_dump_types, flag_warnings; static const char *arch = ""; static const char *mod_prefix = ""; @@ -50,6 +50,7 @@ static int errors; static int nsyms; static struct symbol *expansion_trail; +static struct symbol *visited_symbols; static const char *const symbol_type_name[] = { "normal", "typedef", "enum", "struct", "union" @@ -176,6 +177,7 @@ struct symbol *add_symbol(const char *name, enum symbol_type type, sym->type = type; sym->defn = defn; sym->expansion_trail = NULL; + sym->visited = NULL; sym->is_extern = is_extern; sym->hash_next = symtab[h]; @@ -236,26 +238,11 @@ static int equal_list(struct string_list *a, struct string_list *b) static void print_node(FILE * f, struct string_list *list) { - switch (list->tag) { - case SYM_STRUCT: - putc('s', f); - goto printit; - case SYM_UNION: - putc('u', f); - goto printit; - case SYM_ENUM: - putc('e', f); - goto printit; - case SYM_TYPEDEF: - putc('t', f); - goto printit; - - printit: + if (list->tag != SYM_NORMAL) { + putc(symbol_type_name[list->tag][0], f); putc('#', f); - case SYM_NORMAL: - fputs(list->string, f); - break; } + fputs(list->string, f); } static void print_list(FILE * f, struct string_list *list) @@ -287,9 +274,9 @@ static void print_list(FILE * f, struct string_list *list) } } -static unsigned long expand_and_crc_list(struct string_list *list, - unsigned long crc) +static unsigned long expand_and_crc_sym(struct symbol *sym, unsigned long crc) { + struct string_list *list = sym->defn; struct string_list **e, **b; struct string_list *tmp, **tmp2; int elem = 1; @@ -332,7 +319,7 @@ static unsigned long expand_and_crc_list(struct string_list *list, } else { subsym->expansion_trail = expansion_trail; expansion_trail = subsym; - crc = expand_and_crc_list(subsym->defn, crc); + crc = expand_and_crc_sym(subsym, crc); } break; @@ -382,12 +369,22 @@ static unsigned long expand_and_crc_list(struct string_list *list, } else { subsym->expansion_trail = expansion_trail; expansion_trail = subsym; - crc = expand_and_crc_list(subsym->defn, crc); + crc = expand_and_crc_sym(subsym, crc); } break; } } + { + static struct symbol **end = &visited_symbols; + + if (!sym->visited) { + *end = sym; + end = &sym->visited; + sym->visited = (struct symbol *)-1L; + } + } + return crc; } @@ -406,7 +403,7 @@ void export_symbol(const char *name) expansion_trail = (struct symbol *)-1L; - crc = expand_and_crc_list(sym->defn, 0xffffffff) ^ 0xffffffff; + crc = expand_and_crc_sym(sym, 0xffffffff) ^ 0xffffffff; sym = expansion_trail; while (sym != (struct symbol *)-1L) { @@ -464,6 +461,7 @@ static void genksyms_usage(void) int main(int argc, char **argv) { + FILE *dumpfile = NULL; int o; #ifdef __GNU_LIBRARY__ @@ -473,15 +471,16 @@ int main(int argc, char **argv) {"warnings", 0, 0, 'w'}, {"quiet", 0, 0, 'q'}, {"dump", 0, 0, 'D'}, + {"dump-types", 1, 0, 'T'}, {"version", 0, 0, 'V'}, {"help", 0, 0, 'h'}, {0, 0, 0, 0} }; - while ((o = getopt_long(argc, argv, "a:dwqVDk:p:", + while ((o = getopt_long(argc, argv, "a:dwqVDT:k:p:", &long_opts[0], NULL)) != EOF) #else /* __GNU_LIBRARY__ */ - while ((o = getopt(argc, argv, "a:dwqVDk:p:")) != EOF) + while ((o = getopt(argc, argv, "a:dwqVDT:k:p:")) != EOF) #endif /* __GNU_LIBRARY__ */ switch (o) { case 'a': @@ -502,6 +501,14 @@ int main(int argc, char **argv) case 'D': flag_dump_defs = 1; break; + case 'T': + flag_dump_types = 1; + dumpfile = fopen(optarg, "w"); + if (!dumpfile) { + perror(optarg); + return 1; + } + break; case 'h': genksyms_usage(); return 0; @@ -524,6 +531,24 @@ int main(int argc, char **argv) yyparse(); + if (flag_dump_types && visited_symbols) { + while (visited_symbols != (struct symbol *)-1L) { + struct symbol *sym = visited_symbols; + + if (sym->type != SYM_NORMAL) { + putc(symbol_type_name[sym->type][0], dumpfile); + putc('#', dumpfile); + } + fputs(sym->name, dumpfile); + putc(' ', dumpfile); + print_list(dumpfile, sym->defn); + putc('\n', dumpfile); + + visited_symbols = sym->visited; + sym->visited = NULL; + } + } + if (flag_debug) { fprintf(debugfile, "Hash table occupancy %d/%d = %g\n", nsyms, HASH_BUCKETS, diff --git a/scripts/genksyms/genksyms.h b/scripts/genksyms/genksyms.h index ab6f34f38..2668287aa 100644 --- a/scripts/genksyms/genksyms.h +++ b/scripts/genksyms/genksyms.h @@ -41,6 +41,7 @@ struct symbol { enum symbol_type type; struct string_list *defn; struct symbol *expansion_trail; + struct symbol *visited; int is_extern; }; diff --git a/scripts/genksyms/lex.c_shipped b/scripts/genksyms/lex.c_shipped index 1218053ee..37ba98241 100644 --- a/scripts/genksyms/lex.c_shipped +++ b/scripts/genksyms/lex.c_shipped @@ -2023,7 +2023,7 @@ repeat: break; default: - abort(); + exit(1); } fini: diff --git a/scripts/genksyms/lex.l b/scripts/genksyms/lex.l index fe0dfeedf..5e544a066 100644 --- a/scripts/genksyms/lex.l +++ b/scripts/genksyms/lex.l @@ -392,7 +392,7 @@ repeat: break; default: - abort(); + exit(1); } fini: diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c index 52159cfca..175e5933a 100644 --- a/scripts/kconfig/conf.c +++ b/scripts/kconfig/conf.c @@ -558,6 +558,7 @@ int main(int ac, char **av) name = av[i]; if (!name) { printf(_("%s: Kconfig file missing\n"), av[0]); + exit(1); } conf_parse(name); //zconfdump(stdout); @@ -593,7 +594,7 @@ int main(int ac, char **av) case set_random: name = getenv("KCONFIG_ALLCONFIG"); if (name && !stat(name, &tmpstat)) { - conf_read_simple(name); + conf_read_simple(name, S_DEF_USER); break; } switch (input_mode) { @@ -604,9 +605,9 @@ int main(int ac, char **av) default: break; } if (!stat(name, &tmpstat)) - conf_read_simple(name); + conf_read_simple(name, S_DEF_USER); else if (!stat("all.config", &tmpstat)) - conf_read_simple("all.config"); + conf_read_simple("all.config", S_DEF_USER); break; default: break; @@ -619,7 +620,15 @@ int main(int ac, char **av) input_mode = ask_silent; valid_stdin = 1; } - } + } else if (sym_change_count) { + name = getenv("KCONFIG_NOSILENTUPDATE"); + if (name && *name) { + fprintf(stderr, _("\n*** Kernel configuration requires explicit update.\n\n")); + return 1; + } + } else + goto skip_check; + do { conf_cnt = 0; check_conf(&rootmenu); @@ -628,5 +637,11 @@ int main(int ac, char **av) fprintf(stderr, _("\n*** Error during writing of the kernel configuration.\n\n")); return 1; } +skip_check: + if (input_mode == ask_silent && conf_write_autoconf()) { + fprintf(stderr, _("\n*** Error during writing of the kernel configuration.\n\n")); + return 1; + } + return return_value; } diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index c1702d82b..f777c9143 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c @@ -5,6 +5,7 @@ #include #include +#include #include #include #include @@ -20,19 +21,8 @@ static void conf_warning(const char *fmt, ...) static const char *conf_filename; static int conf_lineno, conf_warnings, conf_unsaved; -const char conf_def_filename[] = ".config"; - const char conf_defname[] = "arch/$ARCH/defconfig"; -const char *conf_confnames[] = { - ".config", - "/lib/modules/$UNAME_RELEASE/.config", - "/etc/kernel-config", - "/boot/config-$UNAME_RELEASE", - conf_defname, - NULL, -}; - static void conf_warning(const char *fmt, ...) { va_list ap; @@ -44,6 +34,13 @@ static void conf_warning(const char *fmt, ...) conf_warnings++; } +const char *conf_get_configname(void) +{ + char *name = getenv("KCONFIG_CONFIG"); + + return name ? name : ".config"; +} + static char *conf_expand_value(const char *in) { struct symbol *sym; @@ -86,51 +83,65 @@ char *conf_get_default_confname(void) return name; } -int conf_read_simple(const char *name) +int conf_read_simple(const char *name, int def) { FILE *in = NULL; char line[1024]; char *p, *p2; struct symbol *sym; - int i; + int i, def_flags; if (name) { in = zconf_fopen(name); } else { - const char **names = conf_confnames; - while ((name = *names++)) { - name = conf_expand_value(name); + struct property *prop; + + name = conf_get_configname(); + in = zconf_fopen(name); + if (in) + goto load; + sym_change_count++; + if (!sym_defconfig_list) + return 1; + + for_all_defaults(sym_defconfig_list, prop) { + if (expr_calc_value(prop->visible.expr) == no || + prop->expr->type != E_SYMBOL) + continue; + name = conf_expand_value(prop->expr->left.sym->name); in = zconf_fopen(name); if (in) { printf(_("#\n" - "# using defaults found in %s\n" - "#\n"), name); - break; + "# using defaults found in %s\n" + "#\n"), name); + goto load; } } } if (!in) return 1; +load: conf_filename = name; conf_lineno = 0; conf_warnings = 0; conf_unsaved = 0; + def_flags = SYMBOL_DEF << def; for_all_symbols(i, sym) { - sym->flags |= SYMBOL_NEW | SYMBOL_CHANGED; + sym->flags |= SYMBOL_CHANGED; + sym->flags &= ~(def_flags|SYMBOL_VALID); if (sym_is_choice(sym)) - sym->flags &= ~SYMBOL_NEW; - sym->flags &= ~SYMBOL_VALID; + sym->flags |= def_flags; switch (sym->type) { case S_INT: case S_HEX: case S_STRING: - if (sym->user.val) - free(sym->user.val); + if (sym->def[def].val) + free(sym->def[def].val); default: - sym->user.val = NULL; - sym->user.tri = no; + sym->def[def].val = NULL; + sym->def[def].tri = no; } } @@ -147,18 +158,25 @@ int conf_read_simple(const char *name) *p++ = 0; if (strncmp(p, "is not set", 10)) continue; - sym = sym_find(line + 9); - if (!sym) { - conf_warning("trying to assign nonexistent symbol %s", line + 9); - break; - } else if (!(sym->flags & SYMBOL_NEW)) { + if (def == S_DEF_USER) { + sym = sym_find(line + 9); + if (!sym) { + conf_warning("trying to assign nonexistent symbol %s", line + 9); + break; + } + } else { + sym = sym_lookup(line + 9, 0); + if (sym->type == S_UNKNOWN) + sym->type = S_BOOLEAN; + } + if (sym->flags & def_flags) { conf_warning("trying to reassign symbol %s", sym->name); } switch (sym->type) { case S_BOOLEAN: case S_TRISTATE: - sym->user.tri = no; - sym->flags &= ~SYMBOL_NEW; + sym->def[def].tri = no; + sym->flags |= def_flags; break; default: ; @@ -176,33 +194,47 @@ int conf_read_simple(const char *name) p2 = strchr(p, '\n'); if (p2) *p2 = 0; - sym = sym_find(line + 7); - if (!sym) { - conf_warning("trying to assign nonexistent symbol %s", line + 7); - break; - } else if (!(sym->flags & SYMBOL_NEW)) { + if (def == S_DEF_USER) { + sym = sym_find(line + 7); + if (!sym) { + conf_warning("trying to assign nonexistent symbol %s", line + 7); + break; + } + } else { + sym = sym_lookup(line + 7, 0); + if (sym->type == S_UNKNOWN) + sym->type = S_OTHER; + } + if (sym->flags & def_flags) { conf_warning("trying to reassign symbol %s", sym->name); } switch (sym->type) { case S_TRISTATE: if (p[0] == 'm') { - sym->user.tri = mod; - sym->flags &= ~SYMBOL_NEW; + sym->def[def].tri = mod; + sym->flags |= def_flags; break; } case S_BOOLEAN: if (p[0] == 'y') { - sym->user.tri = yes; - sym->flags &= ~SYMBOL_NEW; + sym->def[def].tri = yes; + sym->flags |= def_flags; break; } if (p[0] == 'n') { - sym->user.tri = no; - sym->flags &= ~SYMBOL_NEW; + sym->def[def].tri = no; + sym->flags |= def_flags; break; } conf_warning("symbol value '%s' invalid for %s", p, sym->name); break; + case S_OTHER: + if (*p != '"') { + for (p2 = p; *p2 && !isspace(*p2); p2++) + ; + sym->type = S_STRING; + goto done; + } case S_STRING: if (*p++ != '"') break; @@ -219,9 +251,10 @@ int conf_read_simple(const char *name) } case S_INT: case S_HEX: + done: if (sym_string_valid(sym, p)) { - sym->user.val = strdup(p); - sym->flags &= ~SYMBOL_NEW; + sym->def[def].val = strdup(p); + sym->flags |= def_flags; } else { conf_warning("symbol value '%s' invalid for %s", p, sym->name); continue; @@ -239,24 +272,24 @@ int conf_read_simple(const char *name) } if (sym && sym_is_choice_value(sym)) { struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym)); - switch (sym->user.tri) { + switch (sym->def[def].tri) { case no: break; case mod: - if (cs->user.tri == yes) { + if (cs->def[def].tri == yes) { conf_warning("%s creates inconsistent choice state", sym->name); - cs->flags |= SYMBOL_NEW; + cs->flags &= ~def_flags; } break; case yes: - if (cs->user.tri != no) { + if (cs->def[def].tri != no) { conf_warning("%s creates inconsistent choice state", sym->name); - cs->flags |= SYMBOL_NEW; + cs->flags &= ~def_flags; } else - cs->user.val = sym; - //break; + cs->def[def].val = sym; + break; } - cs->user.tri = E_OR(cs->user.tri, sym->user.tri); + cs->def[def].tri = E_OR(cs->def[def].tri, sym->def[def].tri); } } fclose(in); @@ -271,9 +304,11 @@ int conf_read(const char *name) struct symbol *sym; struct property *prop; struct expr *e; - int i; + int i, flags; + + sym_change_count = 0; - if (conf_read_simple(name)) + if (conf_read_simple(name, S_DEF_USER)) return 1; for_all_symbols(i, sym) { @@ -285,12 +320,12 @@ int conf_read(const char *name) switch (sym->type) { case S_BOOLEAN: case S_TRISTATE: - if (sym->user.tri != sym_get_tristate_value(sym)) + if (sym->def[S_DEF_USER].tri != sym_get_tristate_value(sym)) break; if (!sym_is_choice(sym)) goto sym_ok; default: - if (!strcmp(sym->curr.val, sym->user.val)) + if (!strcmp(sym->curr.val, sym->def[S_DEF_USER].val)) goto sym_ok; break; } @@ -302,15 +337,13 @@ int conf_read(const char *name) sym_ok: if (sym_has_value(sym) && !sym_is_choice_value(sym)) { if (sym->visible == no) - sym->flags |= SYMBOL_NEW; + sym->flags &= ~SYMBOL_DEF_USER; switch (sym->type) { case S_STRING: case S_INT: case S_HEX: - if (!sym_string_within_range(sym, sym->user.val)) { - sym->flags |= SYMBOL_NEW; - sym->flags &= ~SYMBOL_VALID; - } + if (!sym_string_within_range(sym, sym->def[S_DEF_USER].val)) + sym->flags &= ~(SYMBOL_VALID|SYMBOL_DEF_USER); default: break; } @@ -318,19 +351,21 @@ int conf_read(const char *name) if (!sym_is_choice(sym)) continue; prop = sym_get_choice_prop(sym); + flags = sym->flags; for (e = prop->expr; e; e = e->left.expr) if (e->right.sym->visible != no) - sym->flags |= e->right.sym->flags & SYMBOL_NEW; + flags &= e->right.sym->flags; + sym->flags &= flags | ~SYMBOL_DEF_USER; } - sym_change_count = conf_warnings || conf_unsaved; + sym_change_count += conf_warnings || conf_unsaved; return 0; } int conf_write(const char *name) { - FILE *out, *out_h; + FILE *out; struct symbol *sym; struct menu *menu; const char *basename; @@ -349,7 +384,7 @@ int conf_write(const char *name) if (!stat(name, &st) && S_ISDIR(st.st_mode)) { strcpy(dirname, name); strcat(dirname, "/"); - basename = conf_def_filename; + basename = conf_get_configname(); } else if ((slash = strrchr(name, '/'))) { int size = slash - name + 1; memcpy(dirname, name, size); @@ -357,23 +392,24 @@ int conf_write(const char *name) if (slash[1]) basename = slash + 1; else - basename = conf_def_filename; + basename = conf_get_configname(); } else basename = name; } else - basename = conf_def_filename; + basename = conf_get_configname(); - sprintf(newname, "%s.tmpconfig.%d", dirname, (int)getpid()); - out = fopen(newname, "w"); + sprintf(newname, "%s%s", dirname, basename); + env = getenv("KCONFIG_OVERWRITECONFIG"); + if (!env || !*env) { + sprintf(tmpname, "%s.tmpconfig.%d", dirname, (int)getpid()); + out = fopen(tmpname, "w"); + } else { + *tmpname = 0; + out = fopen(newname, "w"); + } if (!out) return 1; - out_h = NULL; - if (!name) { - out_h = fopen(".tmpconfig.h", "w"); - if (!out_h) - return 1; - file_write_dep(NULL); - } + sym = sym_lookup("KERNELVERSION", 0); sym_calc_value(sym); time(&now); @@ -389,16 +425,6 @@ int conf_write(const char *name) sym_get_string_value(sym), use_timestamp ? "# " : "", use_timestamp ? ctime(&now) : ""); - if (out_h) - fprintf(out_h, "/*\n" - " * Automatically generated C config: don't edit\n" - " * Linux kernel version: %s\n" - "%s%s" - " */\n" - "#define AUTOCONF_INCLUDED\n", - sym_get_string_value(sym), - use_timestamp ? " * " : "", - use_timestamp ? ctime(&now) : ""); if (!sym_change_count) sym_clear_all_valid(); @@ -414,11 +440,6 @@ int conf_write(const char *name) "#\n" "# %s\n" "#\n", str); - if (out_h) - fprintf(out_h, "\n" - "/*\n" - " * %s\n" - " */\n", str); } else if (!(sym->flags & SYMBOL_CHOICE)) { sym_calc_value(sym); if (!(sym->flags & SYMBOL_WRITE)) @@ -436,59 +457,39 @@ int conf_write(const char *name) switch (sym_get_tristate_value(sym)) { case no: fprintf(out, "# CONFIG_%s is not set\n", sym->name); - if (out_h) - fprintf(out_h, "#undef CONFIG_%s\n", sym->name); break; case mod: fprintf(out, "CONFIG_%s=m\n", sym->name); - if (out_h) - fprintf(out_h, "#define CONFIG_%s_MODULE 1\n", sym->name); break; case yes: fprintf(out, "CONFIG_%s=y\n", sym->name); - if (out_h) - fprintf(out_h, "#define CONFIG_%s 1\n", sym->name); break; } break; case S_STRING: - // fix me str = sym_get_string_value(sym); fprintf(out, "CONFIG_%s=\"", sym->name); - if (out_h) - fprintf(out_h, "#define CONFIG_%s \"", sym->name); - do { + while (1) { l = strcspn(str, "\"\\"); if (l) { fwrite(str, l, 1, out); - if (out_h) - fwrite(str, l, 1, out_h); + str += l; } - str += l; - while (*str == '\\' || *str == '"') { - fprintf(out, "\\%c", *str); - if (out_h) - fprintf(out_h, "\\%c", *str); - str++; - } - } while (*str); + if (!*str) + break; + fprintf(out, "\\%c", *str++); + } fputs("\"\n", out); - if (out_h) - fputs("\"\n", out_h); break; case S_HEX: str = sym_get_string_value(sym); if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) { fprintf(out, "CONFIG_%s=%s\n", sym->name, str); - if (out_h) - fprintf(out_h, "#define CONFIG_%s 0x%s\n", sym->name, str); break; } case S_INT: str = sym_get_string_value(sym); fprintf(out, "CONFIG_%s=%s\n", sym->name, str); - if (out_h) - fprintf(out_h, "#define CONFIG_%s %s\n", sym->name, str); break; } } @@ -508,21 +509,253 @@ int conf_write(const char *name) } } fclose(out); - if (out_h) { - fclose(out_h); - rename(".tmpconfig.h", "include/linux/autoconf.h"); + + if (*tmpname) { + strcat(dirname, name ? name : conf_get_configname()); + strcat(dirname, ".old"); + rename(newname, dirname); + if (rename(tmpname, newname)) + return 1; } - if (!name || basename != conf_def_filename) { - if (!name) - name = conf_def_filename; - sprintf(tmpname, "%s.old", name); - rename(name, tmpname); + + printf(_("#\n" + "# configuration written to %s\n" + "#\n"), newname); + + sym_change_count = 0; + + return 0; +} + +int conf_split_config(void) +{ + char *name, path[128]; + char *s, *d, c; + struct symbol *sym; + struct stat sb; + int res, i, fd; + + name = getenv("KCONFIG_AUTOCONFIG"); + if (!name) + name = "include/config/auto.conf"; + conf_read_simple(name, S_DEF_AUTO); + + if (chdir("include/config")) + return 1; + + res = 0; + for_all_symbols(i, sym) { + sym_calc_value(sym); + if ((sym->flags & SYMBOL_AUTO) || !sym->name) + continue; + if (sym->flags & SYMBOL_WRITE) { + if (sym->flags & SYMBOL_DEF_AUTO) { + /* + * symbol has old and new value, + * so compare them... + */ + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + if (sym_get_tristate_value(sym) == + sym->def[S_DEF_AUTO].tri) + continue; + break; + case S_STRING: + case S_HEX: + case S_INT: + if (!strcmp(sym_get_string_value(sym), + sym->def[S_DEF_AUTO].val)) + continue; + break; + default: + break; + } + } else { + /* + * If there is no old value, only 'no' (unset) + * is allowed as new value. + */ + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + if (sym_get_tristate_value(sym) == no) + continue; + break; + default: + break; + } + } + } else if (!(sym->flags & SYMBOL_DEF_AUTO)) + /* There is neither an old nor a new value. */ + continue; + /* else + * There is an old value, but no new value ('no' (unset) + * isn't saved in auto.conf, so the old value is always + * different from 'no'). + */ + + /* Replace all '_' and append ".h" */ + s = sym->name; + d = path; + while ((c = *s++)) { + c = tolower(c); + *d++ = (c == '_') ? '/' : c; + } + strcpy(d, ".h"); + + /* Assume directory path already exists. */ + fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd == -1) { + if (errno != ENOENT) { + res = 1; + break; + } + /* + * Create directory components, + * unless they exist already. + */ + d = path; + while ((d = strchr(d, '/'))) { + *d = 0; + if (stat(path, &sb) && mkdir(path, 0755)) { + res = 1; + goto out; + } + *d++ = '/'; + } + /* Try it again. */ + fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd == -1) { + res = 1; + break; + } + } + close(fd); } - sprintf(tmpname, "%s%s", dirname, basename); - if (rename(newname, tmpname)) +out: + if (chdir("../..")) return 1; - sym_change_count = 0; + return res; +} + +int conf_write_autoconf(void) +{ + struct symbol *sym; + const char *str; + char *name; + FILE *out, *out_h; + time_t now; + int i, l; + + sym_clear_all_valid(); + + file_write_dep("include/config/auto.conf.cmd"); + + if (conf_split_config()) + return 1; + + out = fopen(".tmpconfig", "w"); + if (!out) + return 1; + + out_h = fopen(".tmpconfig.h", "w"); + if (!out_h) { + fclose(out); + return 1; + } + + sym = sym_lookup("KERNELVERSION", 0); + sym_calc_value(sym); + time(&now); + fprintf(out, "#\n" + "# Automatically generated make config: don't edit\n" + "# Linux kernel version: %s\n" + "# %s" + "#\n", + sym_get_string_value(sym), ctime(&now)); + fprintf(out_h, "/*\n" + " * Automatically generated C config: don't edit\n" + " * Linux kernel version: %s\n" + " * %s" + " */\n" + "#define AUTOCONF_INCLUDED\n", + sym_get_string_value(sym), ctime(&now)); + + for_all_symbols(i, sym) { + sym_calc_value(sym); + if (!(sym->flags & SYMBOL_WRITE) || !sym->name) + continue; + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + switch (sym_get_tristate_value(sym)) { + case no: + break; + case mod: + fprintf(out, "CONFIG_%s=m\n", sym->name); + fprintf(out_h, "#define CONFIG_%s_MODULE 1\n", sym->name); + break; + case yes: + fprintf(out, "CONFIG_%s=y\n", sym->name); + fprintf(out_h, "#define CONFIG_%s 1\n", sym->name); + break; + } + break; + case S_STRING: + str = sym_get_string_value(sym); + fprintf(out, "CONFIG_%s=\"", sym->name); + fprintf(out_h, "#define CONFIG_%s \"", sym->name); + while (1) { + l = strcspn(str, "\"\\"); + if (l) { + fwrite(str, l, 1, out); + fwrite(str, l, 1, out_h); + str += l; + } + if (!*str) + break; + fprintf(out, "\\%c", *str); + fprintf(out_h, "\\%c", *str); + str++; + } + fputs("\"\n", out); + fputs("\"\n", out_h); + break; + case S_HEX: + str = sym_get_string_value(sym); + if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) { + fprintf(out, "CONFIG_%s=%s\n", sym->name, str); + fprintf(out_h, "#define CONFIG_%s 0x%s\n", sym->name, str); + break; + } + case S_INT: + str = sym_get_string_value(sym); + fprintf(out, "CONFIG_%s=%s\n", sym->name, str); + fprintf(out_h, "#define CONFIG_%s %s\n", sym->name, str); + break; + default: + break; + } + } + fclose(out); + fclose(out_h); + + name = getenv("KCONFIG_AUTOHEADER"); + if (!name) + name = "include/linux/autoconf.h"; + if (rename(".tmpconfig.h", name)) + return 1; + name = getenv("KCONFIG_AUTOCONFIG"); + if (!name) + name = "include/config/auto.conf"; + /* + * This must be the last step, kbuild has a dependency on auto.conf + * and this marks the successful completion of the previous steps. + */ + if (rename(".tmpconfig", name)) + return 1; return 0; } diff --git a/scripts/kconfig/expr.c b/scripts/kconfig/expr.c index 30e4f9d69..6f98dbfe7 100644 --- a/scripts/kconfig/expr.c +++ b/scripts/kconfig/expr.c @@ -145,7 +145,8 @@ static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct e return; } if (e1->type == E_SYMBOL && e2->type == E_SYMBOL && - e1->left.sym == e2->left.sym && (e1->left.sym->flags & (SYMBOL_YES|SYMBOL_NO))) + e1->left.sym == e2->left.sym && + (e1->left.sym == &symbol_yes || e1->left.sym == &symbol_no)) return; if (!expr_eq(e1, e2)) return; @@ -1012,73 +1013,73 @@ int expr_compare_type(enum expr_type t1, enum expr_type t2) #endif } -void expr_print(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken) +void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken) { if (!e) { - fn(data, "y"); + fn(data, NULL, "y"); return; } if (expr_compare_type(prevtoken, e->type) > 0) - fn(data, "("); + fn(data, NULL, "("); switch (e->type) { case E_SYMBOL: if (e->left.sym->name) - fn(data, e->left.sym->name); + fn(data, e->left.sym, e->left.sym->name); else - fn(data, ""); + fn(data, NULL, ""); break; case E_NOT: - fn(data, "!"); + fn(data, NULL, "!"); expr_print(e->left.expr, fn, data, E_NOT); break; case E_EQUAL: - fn(data, e->left.sym->name); - fn(data, "="); - fn(data, e->right.sym->name); + fn(data, e->left.sym, e->left.sym->name); + fn(data, NULL, "="); + fn(data, e->right.sym, e->right.sym->name); break; case E_UNEQUAL: - fn(data, e->left.sym->name); - fn(data, "!="); - fn(data, e->right.sym->name); + fn(data, e->left.sym, e->left.sym->name); + fn(data, NULL, "!="); + fn(data, e->right.sym, e->right.sym->name); break; case E_OR: expr_print(e->left.expr, fn, data, E_OR); - fn(data, " || "); + fn(data, NULL, " || "); expr_print(e->right.expr, fn, data, E_OR); break; case E_AND: expr_print(e->left.expr, fn, data, E_AND); - fn(data, " && "); + fn(data, NULL, " && "); expr_print(e->right.expr, fn, data, E_AND); break; case E_CHOICE: - fn(data, e->right.sym->name); + fn(data, e->right.sym, e->right.sym->name); if (e->left.expr) { - fn(data, " ^ "); + fn(data, NULL, " ^ "); expr_print(e->left.expr, fn, data, E_CHOICE); } break; case E_RANGE: - fn(data, "["); - fn(data, e->left.sym->name); - fn(data, " "); - fn(data, e->right.sym->name); - fn(data, "]"); + fn(data, NULL, "["); + fn(data, e->left.sym, e->left.sym->name); + fn(data, NULL, " "); + fn(data, e->right.sym, e->right.sym->name); + fn(data, NULL, "]"); break; default: { char buf[32]; sprintf(buf, "", e->type); - fn(data, buf); + fn(data, NULL, buf); break; } } if (expr_compare_type(prevtoken, e->type) > 0) - fn(data, ")"); + fn(data, NULL, ")"); } -static void expr_print_file_helper(void *data, const char *str) +static void expr_print_file_helper(void *data, struct symbol *sym, const char *str) { fwrite(str, strlen(str), 1, data); } @@ -1088,7 +1089,7 @@ void expr_fprint(struct expr *e, FILE *out) expr_print(e, expr_print_file_helper, out, E_NONE); } -static void expr_print_gstr_helper(void *data, const char *str) +static void expr_print_gstr_helper(void *data, struct symbol *sym, const char *str) { str_append((struct gstr*)data, str); } diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h index 1b36ef18c..6084525f6 100644 --- a/scripts/kconfig/expr.h +++ b/scripts/kconfig/expr.h @@ -63,12 +63,18 @@ enum symbol_type { S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING, S_OTHER }; +enum { + S_DEF_USER, /* main user value */ + S_DEF_AUTO, +}; + struct symbol { struct symbol *next; char *name; char *help; enum symbol_type type; - struct symbol_value curr, user; + struct symbol_value curr; + struct symbol_value def[4]; tristate visible; int flags; struct property *prop; @@ -78,10 +84,7 @@ struct symbol { #define for_all_symbols(i, sym) for (i = 0; i < 257; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER) -#define SYMBOL_YES 0x0001 -#define SYMBOL_MOD 0x0002 -#define SYMBOL_NO 0x0004 -#define SYMBOL_CONST 0x0007 +#define SYMBOL_CONST 0x0001 #define SYMBOL_CHECK 0x0008 #define SYMBOL_CHOICE 0x0010 #define SYMBOL_CHOICEVAL 0x0020 @@ -90,10 +93,14 @@ struct symbol { #define SYMBOL_OPTIONAL 0x0100 #define SYMBOL_WRITE 0x0200 #define SYMBOL_CHANGED 0x0400 -#define SYMBOL_NEW 0x0800 #define SYMBOL_AUTO 0x1000 #define SYMBOL_CHECKED 0x2000 #define SYMBOL_WARNED 0x8000 +#define SYMBOL_DEF 0x10000 +#define SYMBOL_DEF_USER 0x10000 +#define SYMBOL_DEF_AUTO 0x20000 +#define SYMBOL_DEF3 0x40000 +#define SYMBOL_DEF4 0x80000 #define SYMBOL_MAXLENGTH 256 #define SYMBOL_HASHSIZE 257 @@ -149,6 +156,7 @@ struct file *lookup_file(const char *name); extern struct symbol symbol_yes, symbol_no, symbol_mod; extern struct symbol *modules_sym; +extern struct symbol *sym_defconfig_list; extern int cdebug; struct expr *expr_alloc_symbol(struct symbol *sym); struct expr *expr_alloc_one(enum expr_type type, struct expr *ce); diff --git a/scripts/kconfig/gconf.c b/scripts/kconfig/gconf.c index 665bd5300..7b0d3a93d 100644 --- a/scripts/kconfig/gconf.c +++ b/scripts/kconfig/gconf.c @@ -114,12 +114,6 @@ const char *dbg_print_flags(int val) bzero(buf, 256); - if (val & SYMBOL_YES) - strcat(buf, "yes/"); - if (val & SYMBOL_MOD) - strcat(buf, "mod/"); - if (val & SYMBOL_NO) - strcat(buf, "no/"); if (val & SYMBOL_CONST) strcat(buf, "const/"); if (val & SYMBOL_CHECK) @@ -138,8 +132,6 @@ const char *dbg_print_flags(int val) strcat(buf, "write/"); if (val & SYMBOL_CHANGED) strcat(buf, "changed/"); - if (val & SYMBOL_NEW) - strcat(buf, "new/"); if (val & SYMBOL_AUTO) strcat(buf, "auto/"); @@ -1192,9 +1184,7 @@ static gchar **fill_row(struct menu *menu) row[COL_OPTION] = g_strdup_printf("%s %s", menu_get_prompt(menu), - sym ? (sym-> - flags & SYMBOL_NEW ? "(NEW)" : "") : - ""); + sym && sym_has_value(sym) ? "(NEW)" : ""); if (show_all && !menu_is_visible(menu)) row[COL_COLOR] = g_strdup("DarkGray"); diff --git a/scripts/kconfig/lex.zconf.c_shipped b/scripts/kconfig/lex.zconf.c_shipped index 24e3c8cbb..800f8c71c 100644 --- a/scripts/kconfig/lex.zconf.c_shipped +++ b/scripts/kconfig/lex.zconf.c_shipped @@ -8,7 +8,7 @@ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 -#define YY_FLEX_SUBMINOR_VERSION 31 +#define YY_FLEX_SUBMINOR_VERSION 33 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif @@ -30,7 +30,15 @@ /* C99 systems have . Non-C99 systems may or may not. */ -#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L +#if __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; @@ -134,6 +142,10 @@ typedef unsigned int flex_uint32_t; #define YY_BUF_SIZE 16384 #endif +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) + #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; @@ -267,7 +279,7 @@ int zconfleng; /* Points to current character in buffer. */ static char *yy_c_buf_p = (char *) 0; -static int yy_init = 1; /* whether we need to initialize */ +static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* Flag which is used to allow zconfwrap()'s to do buffer switches @@ -820,6 +832,8 @@ void alloc_string(const char *str, int size) #define YY_EXTRA_TYPE void * #endif +static int yy_init_globals (void ); + /* Macros after this point can all be overridden by user definitions in * section 1. */ @@ -942,9 +956,9 @@ YY_DECL int str = 0; int ts, i; - if ( (yy_init) ) + if ( !(yy_init) ) { - (yy_init) = 0; + (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; @@ -1452,7 +1466,7 @@ static int yy_get_next_buffer (void) else { - size_t num_to_read = + int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) @@ -1969,16 +1983,16 @@ YY_BUFFER_STATE zconf_scan_buffer (char * base, yy_size_t size ) /** Setup the input buffer state to scan a string. The next call to zconflex() will * scan from a @e copy of @a str. - * @param yy_str a NUL-terminated string to scan + * @param yystr a NUL-terminated string to scan * * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * zconf_scan_bytes() instead. */ -YY_BUFFER_STATE zconf_scan_string (yyconst char * yy_str ) +YY_BUFFER_STATE zconf_scan_string (yyconst char * yystr ) { - return zconf_scan_bytes(yy_str,strlen(yy_str) ); + return zconf_scan_bytes(yystr,strlen(yystr) ); } /** Setup the input buffer state to scan the given bytes. The next call to zconflex() will @@ -1988,7 +2002,7 @@ YY_BUFFER_STATE zconf_scan_string (yyconst char * yy_str ) * * @return the newly allocated buffer state object. */ -YY_BUFFER_STATE zconf_scan_bytes (yyconst char * bytes, int len ) +YY_BUFFER_STATE zconf_scan_bytes (yyconst char * yybytes, int _yybytes_len ) { YY_BUFFER_STATE b; char *buf; @@ -1996,15 +2010,15 @@ YY_BUFFER_STATE zconf_scan_bytes (yyconst char * bytes, int len ) int i; /* Get memory for full buffer, including space for trailing EOB's. */ - n = len + 2; + n = _yybytes_len + 2; buf = (char *) zconfalloc(n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in zconf_scan_bytes()" ); - for ( i = 0; i < len; ++i ) - buf[i] = bytes[i]; + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; - buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; b = zconf_scan_buffer(buf,n ); if ( ! b ) @@ -2125,6 +2139,34 @@ void zconfset_debug (int bdebug ) zconf_flex_debug = bdebug ; } +static int yy_init_globals (void) +{ + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from zconflex_destroy(), so don't allocate here. + */ + + (yy_buffer_stack) = 0; + (yy_buffer_stack_top) = 0; + (yy_buffer_stack_max) = 0; + (yy_c_buf_p) = (char *) 0; + (yy_init) = 0; + (yy_start) = 0; + +/* Defined in main.c */ +#ifdef YY_STDINIT + zconfin = stdin; + zconfout = stdout; +#else + zconfin = (FILE *) 0; + zconfout = (FILE *) 0; +#endif + + /* For future reference: Set errno on error, since we are called by + * zconflex_init() + */ + return 0; +} + /* zconflex_destroy is for both reentrant and non-reentrant scanners. */ int zconflex_destroy (void) { @@ -2140,6 +2182,10 @@ int zconflex_destroy (void) zconffree((yy_buffer_stack) ); (yy_buffer_stack) = NULL; + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * zconflex() is called, initialization will occur. */ + yy_init_globals( ); + return 0; } @@ -2151,7 +2197,7 @@ int zconflex_destroy (void) static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; - for ( i = 0; i < n; ++i ) + for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif @@ -2160,7 +2206,7 @@ static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) static int yy_flex_strlen (yyconst char * s ) { register int n; - for ( n = 0; s[n]; ++n ) + for ( n = 0; s[n]; ++n ) ; return n; @@ -2191,19 +2237,6 @@ void zconffree (void * ptr ) #define YYTABLES_NAME "yytables" -#undef YY_NEW_FILE -#undef YY_FLUSH_BUFFER -#undef yy_set_bol -#undef yy_new_buffer -#undef yy_set_interactive -#undef yytext_ptr -#undef YY_DO_BEFORE_ACTION - -#ifdef YY_DECL_IS_OURS -#undef YY_DECL_IS_OURS -#undef YY_DECL -#endif - void zconf_starthelp(void) { new_string(); diff --git a/scripts/kconfig/lkc.h b/scripts/kconfig/lkc.h index 527f60c99..2628023a1 100644 --- a/scripts/kconfig/lkc.h +++ b/scripts/kconfig/lkc.h @@ -40,6 +40,10 @@ extern "C" { #define TF_COMMAND 0x0001 #define TF_PARAM 0x0002 +#define TF_OPTION 0x0004 + +#define T_OPT_MODULES 1 +#define T_OPT_DEFCONFIG_LIST 2 struct kconf_id { int name; @@ -60,8 +64,6 @@ int zconf_lineno(void); char *zconf_curname(void); /* confdata.c */ -extern const char conf_def_filename[]; - char *conf_get_default_confname(void); /* kconfig_load.c */ @@ -78,6 +80,7 @@ struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *e struct property *menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep); void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep); void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep); +void menu_add_option(int token, char *arg); void menu_finalize(struct menu *parent); void menu_set_type(int type); @@ -99,6 +102,7 @@ const char *str_get(struct gstr *gs); /* symbol.c */ void sym_init(void); void sym_clear_all_valid(void); +void sym_set_all_changed(void); void sym_set_changed(struct symbol *sym); struct symbol *sym_check_deps(struct symbol *sym); struct property *prop_alloc(enum prop_type type, struct symbol *sym); @@ -137,7 +141,7 @@ static inline bool sym_is_optional(struct symbol *sym) static inline bool sym_has_value(struct symbol *sym) { - return sym->flags & SYMBOL_NEW ? false : true; + return sym->flags & SYMBOL_DEF_USER ? true : false; } #ifdef __cplusplus diff --git a/scripts/kconfig/lkc_proto.h b/scripts/kconfig/lkc_proto.h index b6a389c5f..a263746cf 100644 --- a/scripts/kconfig/lkc_proto.h +++ b/scripts/kconfig/lkc_proto.h @@ -2,8 +2,9 @@ /* confdata.c */ P(conf_parse,void,(const char *name)); P(conf_read,int,(const char *name)); -P(conf_read_simple,int,(const char *name)); +P(conf_read_simple,int,(const char *name, int)); P(conf_write,int,(const char *name)); +P(conf_write_autoconf,int,(void)); /* menu.c */ P(rootmenu,struct menu,); @@ -38,4 +39,4 @@ P(prop_get_type_name,const char *,(enum prop_type type)); /* expr.c */ P(expr_compare_type,int,(enum expr_type t1, enum expr_type t2)); -P(expr_print,void,(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken)); +P(expr_print,void,(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken)); diff --git a/scripts/kconfig/lxdialog/checklist.c b/scripts/kconfig/lxdialog/checklist.c index be0200e9c..79886413b 100644 --- a/scripts/kconfig/lxdialog/checklist.c +++ b/scripts/kconfig/lxdialog/checklist.c @@ -187,9 +187,12 @@ int dialog_checklist(const char *title, const char *prompt, int height, /* Print the list */ for (i = 0; i < max_choice; i++) { - print_item(list, items[(scroll + i) * 3 + 1], - status[i + scroll], i, i == choice); + if (i != choice) + print_item(list, items[(scroll + i) * 3 + 1], + status[i + scroll], i, 0); } + print_item(list, items[(scroll + choice) * 3 + 1], + status[choice + scroll], choice, 1); print_arrows(dialog, choice, item_no, scroll, box_y, box_x + check_x + 5, list_height); diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c index 0fce20cb7..c86c27f2c 100644 --- a/scripts/kconfig/menu.c +++ b/scripts/kconfig/menu.c @@ -114,7 +114,7 @@ void menu_set_type(int type) sym->type = type; return; } - menu_warn(current_entry, "type of '%s' redefined from '%s' to '%s'\n", + menu_warn(current_entry, "type of '%s' redefined from '%s' to '%s'", sym->name ? sym->name : "", sym_type_name(sym->type), sym_type_name(type)); } @@ -124,15 +124,20 @@ struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *e struct property *prop = prop_alloc(type, current_entry->sym); prop->menu = current_entry; - prop->text = prompt; prop->expr = expr; prop->visible.expr = menu_check_dep(dep); if (prompt) { + if (isspace(*prompt)) { + prop_warn(prop, "leading whitespace ignored"); + while (isspace(*prompt)) + prompt++; + } if (current_entry->prompt) - menu_warn(current_entry, "prompt redefined\n"); + prop_warn(prop, "prompt redefined"); current_entry->prompt = prop; } + prop->text = prompt; return prop; } @@ -152,6 +157,24 @@ void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep) menu_add_prop(type, NULL, expr_alloc_symbol(sym), dep); } +void menu_add_option(int token, char *arg) +{ + struct property *prop; + + switch (token) { + case T_OPT_MODULES: + prop = prop_alloc(P_DEFAULT, modules_sym); + prop->expr = expr_alloc_symbol(current_entry->sym); + break; + case T_OPT_DEFCONFIG_LIST: + if (!sym_defconfig_list) + sym_defconfig_list = current_entry->sym; + else if (sym_defconfig_list != current_entry->sym) + zconf_error("trying to redefine defconfig symbol"); + break; + } +} + static int menu_range_valid_sym(struct symbol *sym, struct symbol *sym2) { return sym2->type == S_INT || sym2->type == S_HEX || @@ -325,11 +348,10 @@ void menu_finalize(struct menu *parent) if (sym && !(sym->flags & SYMBOL_WARNED)) { if (sym->type == S_UNKNOWN) - menu_warn(parent, "config symbol defined " - "without type\n"); + menu_warn(parent, "config symbol defined without type"); if (sym_is_choice(sym) && !parent->prompt) - menu_warn(parent, "choice must have a prompt\n"); + menu_warn(parent, "choice must have a prompt"); /* Check properties connected to this symbol */ sym_check_prop(sym); diff --git a/scripts/kconfig/qconf.cc b/scripts/kconfig/qconf.cc index 4590cd316..393f3749f 100644 --- a/scripts/kconfig/qconf.cc +++ b/scripts/kconfig/qconf.cc @@ -6,16 +6,20 @@ #include #include #include +#include #include #include #include -#include +#include #include +#include +#include #include #include #include #include #include +#include #include #include @@ -32,32 +36,16 @@ #endif static QApplication *configApp; +static ConfigSettings *configSettings; static inline QString qgettext(const char* str) { - return QString::fromLocal8Bit(gettext(str)); + return QString::fromLocal8Bit(gettext(str)); } static inline QString qgettext(const QString& str) { - return QString::fromLocal8Bit(gettext(str.latin1())); -} - -ConfigSettings::ConfigSettings() - : showAll(false), showName(false), showRange(false), showData(false) -{ -} - -#if QT_VERSION >= 300 -/** - * Reads the list column settings from the application settings. - */ -void ConfigSettings::readListSettings() -{ - showAll = readBoolEntry("/kconfig/qconf/showAll", false); - showName = readBoolEntry("/kconfig/qconf/showName", false); - showRange = readBoolEntry("/kconfig/qconf/showRange", false); - showData = readBoolEntry("/kconfig/qconf/showData", false); + return QString::fromLocal8Bit(gettext(str.latin1())); } /** @@ -88,76 +76,7 @@ bool ConfigSettings::writeSizes(const QString& key, const QValueList& value stringList.push_back(QString::number(*it)); return writeEntry(key, stringList); } -#endif - - -/* - * update all the children of a menu entry - * removes/adds the entries from the parent widget as necessary - * - * parent: either the menu list widget or a menu entry widget - * menu: entry to be updated - */ -template -void ConfigList::updateMenuList(P* parent, struct menu* menu) -{ - struct menu* child; - ConfigItem* item; - ConfigItem* last; - bool visible; - enum prop_type type; - if (!menu) { - while ((item = parent->firstChild())) - delete item; - return; - } - - last = parent->firstChild(); - if (last && !last->goParent) - last = 0; - for (child = menu->list; child; child = child->next) { - item = last ? last->nextSibling() : parent->firstChild(); - type = child->prompt ? child->prompt->type : P_UNKNOWN; - - switch (mode) { - case menuMode: - if (!(child->flags & MENU_ROOT)) - goto hide; - break; - case symbolMode: - if (child->flags & MENU_ROOT) - goto hide; - break; - default: - break; - } - - visible = menu_is_visible(child); - if (showAll || visible) { - if (!item || item->menu != child) - item = new ConfigItem(parent, last, child, visible); - else - item->testUpdateMenu(visible); - - if (mode == fullMode || mode == menuMode || type != P_MENU) - updateMenuList(item, child); - else - updateMenuList(item, 0); - last = item; - continue; - } - hide: - if (item && item->menu == child) { - last = parent->firstChild(); - if (last == item) - last = 0; - else while (last->nextSibling() != item) - last = last->nextSibling(); - delete item; - } - } -} #if QT_VERSION >= 300 /* @@ -355,6 +274,12 @@ ConfigItem::~ConfigItem(void) } } +ConfigLineEdit::ConfigLineEdit(ConfigView* parent) + : Parent(parent) +{ + connect(this, SIGNAL(lostFocus()), SLOT(hide())); +} + void ConfigLineEdit::show(ConfigItem* i) { item = i; @@ -385,14 +310,14 @@ void ConfigLineEdit::keyPressEvent(QKeyEvent* e) hide(); } -ConfigList::ConfigList(ConfigView* p, ConfigMainWindow* cv, ConfigSettings* configSettings) - : Parent(p), cview(cv), +ConfigList::ConfigList(ConfigView* p, const char *name) + : Parent(p, name), updateAll(false), symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no), choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no), menuPix(xpm_menu), menuInvPix(xpm_menu_inv), menuBackPix(xpm_menuback), voidPix(xpm_void), showAll(false), showName(false), showRange(false), showData(false), - rootEntry(0) + rootEntry(0), headerPopup(0) { int i; @@ -406,11 +331,14 @@ ConfigList::ConfigList(ConfigView* p, ConfigMainWindow* cv, ConfigSettings* conf connect(this, SIGNAL(selectionChanged(void)), SLOT(updateSelection(void))); - if (configSettings) { - showAll = configSettings->showAll; - showName = configSettings->showName; - showRange = configSettings->showRange; - showData = configSettings->showData; + if (name) { + configSettings->beginGroup(name); + showAll = configSettings->readBoolEntry("/showAll", false); + showName = configSettings->readBoolEntry("/showName", false); + showRange = configSettings->readBoolEntry("/showRange", false); + showData = configSettings->readBoolEntry("/showData", false); + configSettings->endGroup(); + connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); } for (i = 0; i < colNr; i++) @@ -441,6 +369,30 @@ void ConfigList::reinit(void) updateListAll(); } +void ConfigList::saveSettings(void) +{ + if (name()) { + configSettings->beginGroup(name()); + configSettings->writeEntry("/showName", showName); + configSettings->writeEntry("/showRange", showRange); + configSettings->writeEntry("/showData", showData); + configSettings->writeEntry("/showAll", showAll); + configSettings->endGroup(); + } +} + +ConfigItem* ConfigList::findConfigItem(struct menu *menu) +{ + ConfigItem* item = (ConfigItem*)menu->data; + + for (; item; item = item->nextItem) { + if (this == item->listView()) + break; + } + + return item; +} + void ConfigList::updateSelection(void) { struct menu *menu; @@ -450,9 +402,8 @@ void ConfigList::updateSelection(void) if (!item) return; - cview->setHelp(item); - menu = item->menu; + emit menuChanged(menu); if (!menu) return; type = menu->prompt ? menu->prompt->type : P_UNKNOWN; @@ -464,8 +415,20 @@ void ConfigList::updateList(ConfigItem* item) { ConfigItem* last = 0; - if (!rootEntry) - goto update; + if (!rootEntry) { + if (mode != listMode) + goto update; + QListViewItemIterator it(this); + ConfigItem* item; + + for (; it.current(); ++it) { + item = (ConfigItem*)it.current(); + if (!item->menu) + continue; + item->testUpdateMenu(menu_is_visible(item->menu)); + } + return; + } if (rootEntry != &rootmenu && (mode == singleMode || (mode == symbolMode && rootEntry->parent != &rootmenu))) { @@ -491,14 +454,6 @@ update: triggerUpdate(); } -void ConfigList::setAllOpen(bool open) -{ - QListViewItemIterator it(this); - - for (; it.current(); it++) - it.current()->setOpen(open); -} - void ConfigList::setValue(ConfigItem* item, tristate val) { struct symbol* sym; @@ -581,6 +536,7 @@ void ConfigList::setRootMenu(struct menu *menu) rootEntry = menu; updateListAll(); setSelected(currentItem(), hasFocus()); + ensureItemVisible(currentItem()); } void ConfigList::setParentMenu(void) @@ -603,6 +559,74 @@ void ConfigList::setParentMenu(void) } } +/* + * update all the children of a menu entry + * removes/adds the entries from the parent widget as necessary + * + * parent: either the menu list widget or a menu entry widget + * menu: entry to be updated + */ +template +void ConfigList::updateMenuList(P* parent, struct menu* menu) +{ + struct menu* child; + ConfigItem* item; + ConfigItem* last; + bool visible; + enum prop_type type; + + if (!menu) { + while ((item = parent->firstChild())) + delete item; + return; + } + + last = parent->firstChild(); + if (last && !last->goParent) + last = 0; + for (child = menu->list; child; child = child->next) { + item = last ? last->nextSibling() : parent->firstChild(); + type = child->prompt ? child->prompt->type : P_UNKNOWN; + + switch (mode) { + case menuMode: + if (!(child->flags & MENU_ROOT)) + goto hide; + break; + case symbolMode: + if (child->flags & MENU_ROOT) + goto hide; + break; + default: + break; + } + + visible = menu_is_visible(child); + if (showAll || visible) { + if (!item || item->menu != child) + item = new ConfigItem(parent, last, child, visible); + else + item->testUpdateMenu(visible); + + if (mode == fullMode || mode == menuMode || type != P_MENU) + updateMenuList(item, child); + else + updateMenuList(item, 0); + last = item; + continue; + } + hide: + if (item && item->menu == child) { + last = parent->firstChild(); + if (last == item) + last = 0; + else while (last->nextSibling() != item) + last = last->nextSibling(); + delete item; + } + } +} + void ConfigList::keyPressEvent(QKeyEvent* ev) { QListViewItem* i = currentItem(); @@ -610,7 +634,7 @@ void ConfigList::keyPressEvent(QKeyEvent* ev) struct menu *menu; enum prop_type type; - if (ev->key() == Key_Escape && mode != fullMode) { + if (ev->key() == Key_Escape && mode != fullMode && mode != listMode) { emit parentSelected(); ev->accept(); return; @@ -755,23 +779,62 @@ skip: void ConfigList::focusInEvent(QFocusEvent *e) { + struct menu *menu = NULL; + Parent::focusInEvent(e); - QListViewItem* item = currentItem(); - if (!item) - return; + ConfigItem* item = (ConfigItem *)currentItem(); + if (item) { + setSelected(item, TRUE); + menu = item->menu; + } + emit gotFocus(menu); +} - setSelected(item, TRUE); - emit gotFocus(); +void ConfigList::contextMenuEvent(QContextMenuEvent *e) +{ + if (e->y() <= header()->geometry().bottom()) { + if (!headerPopup) { + QAction *action; + + headerPopup = new QPopupMenu(this); + action = new QAction("Show Name", 0, this); + action->setToggleAction(TRUE); + connect(action, SIGNAL(toggled(bool)), + parent(), SLOT(setShowName(bool))); + connect(parent(), SIGNAL(showNameChanged(bool)), + action, SLOT(setOn(bool))); + action->setOn(showName); + action->addTo(headerPopup); + action = new QAction("Show Range", 0, this); + action->setToggleAction(TRUE); + connect(action, SIGNAL(toggled(bool)), + parent(), SLOT(setShowRange(bool))); + connect(parent(), SIGNAL(showRangeChanged(bool)), + action, SLOT(setOn(bool))); + action->setOn(showRange); + action->addTo(headerPopup); + action = new QAction("Show Data", 0, this); + action->setToggleAction(TRUE); + connect(action, SIGNAL(toggled(bool)), + parent(), SLOT(setShowData(bool))); + connect(parent(), SIGNAL(showDataChanged(bool)), + action, SLOT(setOn(bool))); + action->setOn(showData); + action->addTo(headerPopup); + } + headerPopup->exec(e->globalPos()); + e->accept(); + } else + e->ignore(); } ConfigView* ConfigView::viewList; -ConfigView::ConfigView(QWidget* parent, ConfigMainWindow* cview, - ConfigSettings *configSettings) - : Parent(parent) +ConfigView::ConfigView(QWidget* parent, const char *name) + : Parent(parent, name) { - list = new ConfigList(this, cview, configSettings); + list = new ConfigList(this, name); lineEdit = new ConfigLineEdit(this); lineEdit->hide(); @@ -791,6 +854,50 @@ ConfigView::~ConfigView(void) } } +void ConfigView::setShowAll(bool b) +{ + if (list->showAll != b) { + list->showAll = b; + list->updateListAll(); + emit showAllChanged(b); + } +} + +void ConfigView::setShowName(bool b) +{ + if (list->showName != b) { + list->showName = b; + list->reinit(); + emit showNameChanged(b); + } +} + +void ConfigView::setShowRange(bool b) +{ + if (list->showRange != b) { + list->showRange = b; + list->reinit(); + emit showRangeChanged(b); + } +} + +void ConfigView::setShowData(bool b) +{ + if (list->showData != b) { + list->showData = b; + list->reinit(); + emit showDataChanged(b); + } +} + +void ConfigList::setAllOpen(bool open) +{ + QListViewItemIterator it(this); + + for (; it.current(); it++) + it.current()->setOpen(open); +} + void ConfigView::updateList(ConfigItem* item) { ConfigView* v; @@ -807,6 +914,347 @@ void ConfigView::updateListAll(void) v->list->updateListAll(); } +ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name) + : Parent(parent, name), menu(0) +{ + if (name) { + configSettings->beginGroup(name); + _showDebug = configSettings->readBoolEntry("/showDebug", false); + configSettings->endGroup(); + connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); + } +} + +void ConfigInfoView::saveSettings(void) +{ + if (name()) { + configSettings->beginGroup(name()); + configSettings->writeEntry("/showDebug", showDebug()); + configSettings->endGroup(); + } +} + +void ConfigInfoView::setShowDebug(bool b) +{ + if (_showDebug != b) { + _showDebug = b; + if (menu) + menuInfo(); + else if (sym) + symbolInfo(); + emit showDebugChanged(b); + } +} + +void ConfigInfoView::setInfo(struct menu *m) +{ + if (menu == m) + return; + menu = m; + if (!menu) + clear(); + else + menuInfo(); +} + +void ConfigInfoView::setSource(const QString& name) +{ + const char *p = name.latin1(); + + menu = NULL; + sym = NULL; + + switch (p[0]) { + case 'm': + struct menu *m; + + if (sscanf(p, "m%p", &m) == 1 && menu != m) { + menu = m; + menuInfo(); + emit menuSelected(menu); + } + break; + case 's': + struct symbol *s; + + if (sscanf(p, "s%p", &s) == 1 && sym != s) { + sym = s; + symbolInfo(); + } + break; + } +} + +void ConfigInfoView::symbolInfo(void) +{ + QString str; + + str += "Symbol: "; + str += print_filter(sym->name); + str += "

value: "; + str += print_filter(sym_get_string_value(sym)); + str += "
visibility: "; + str += sym->visible == yes ? "y" : sym->visible == mod ? "m" : "n"; + str += "
"; + str += debug_info(sym); + + setText(str); +} + +void ConfigInfoView::menuInfo(void) +{ + struct symbol* sym; + QString head, debug, help; + + sym = menu->sym; + if (sym) { + if (menu->prompt) { + head += ""; + head += print_filter(_(menu->prompt->text)); + head += ""; + if (sym->name) { + head += " ("; + if (showDebug()) + head += QString().sprintf("
", sym); + head += print_filter(sym->name); + if (showDebug()) + head += ""; + head += ")"; + } + } else if (sym->name) { + head += ""; + if (showDebug()) + head += QString().sprintf("", sym); + head += print_filter(sym->name); + if (showDebug()) + head += ""; + head += ""; + } + head += "

"; + + if (showDebug()) + debug = debug_info(sym); + + help = print_filter(_(sym->help)); + } else if (menu->prompt) { + head += ""; + head += print_filter(_(menu->prompt->text)); + head += "

"; + if (showDebug()) { + if (menu->prompt->visible.expr) { + debug += "  dep: "; + expr_print(menu->prompt->visible.expr, expr_print_help, &debug, E_NONE); + debug += "

"; + } + } + } + if (showDebug()) + debug += QString().sprintf("defined at %s:%d

", menu->file->name, menu->lineno); + + setText(head + debug + help); +} + +QString ConfigInfoView::debug_info(struct symbol *sym) +{ + QString debug; + + debug += "type: "; + debug += print_filter(sym_type_name(sym->type)); + if (sym_is_choice(sym)) + debug += " (choice)"; + debug += "
"; + if (sym->rev_dep.expr) { + debug += "reverse dep: "; + expr_print(sym->rev_dep.expr, expr_print_help, &debug, E_NONE); + debug += "
"; + } + for (struct property *prop = sym->prop; prop; prop = prop->next) { + switch (prop->type) { + case P_PROMPT: + case P_MENU: + debug += QString().sprintf("prompt: ", prop->menu); + debug += print_filter(_(prop->text)); + debug += "
"; + break; + case P_DEFAULT: + debug += "default: "; + expr_print(prop->expr, expr_print_help, &debug, E_NONE); + debug += "
"; + break; + case P_CHOICE: + if (sym_is_choice(sym)) { + debug += "choice: "; + expr_print(prop->expr, expr_print_help, &debug, E_NONE); + debug += "
"; + } + break; + case P_SELECT: + debug += "select: "; + expr_print(prop->expr, expr_print_help, &debug, E_NONE); + debug += "
"; + break; + case P_RANGE: + debug += "range: "; + expr_print(prop->expr, expr_print_help, &debug, E_NONE); + debug += "
"; + break; + default: + debug += "unknown property: "; + debug += prop_get_type_name(prop->type); + debug += "
"; + } + if (prop->visible.expr) { + debug += "    dep: "; + expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE); + debug += "
"; + } + } + debug += "
"; + + return debug; +} + +QString ConfigInfoView::print_filter(const QString &str) +{ + QRegExp re("[<>&\"\\n]"); + QString res = str; + for (int i = 0; (i = res.find(re, i)) >= 0;) { + switch (res[i].latin1()) { + case '<': + res.replace(i, 1, "<"); + i += 4; + break; + case '>': + res.replace(i, 1, ">"); + i += 4; + break; + case '&': + res.replace(i, 1, "&"); + i += 5; + break; + case '"': + res.replace(i, 1, """); + i += 6; + break; + case '\n': + res.replace(i, 1, "
"); + i += 4; + break; + } + } + return res; +} + +void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char *str) +{ + QString* text = reinterpret_cast(data); + QString str2 = print_filter(str); + + if (sym && sym->name && !(sym->flags & SYMBOL_CONST)) { + *text += QString().sprintf("", sym); + *text += str2; + *text += ""; + } else + *text += str2; +} + +QPopupMenu* ConfigInfoView::createPopupMenu(const QPoint& pos) +{ + QPopupMenu* popup = Parent::createPopupMenu(pos); + QAction* action = new QAction("Show Debug Info", 0, popup); + action->setToggleAction(TRUE); + connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool))); + connect(this, SIGNAL(showDebugChanged(bool)), action, SLOT(setOn(bool))); + action->setOn(showDebug()); + popup->insertSeparator(); + action->addTo(popup); + return popup; +} + +void ConfigInfoView::contentsContextMenuEvent(QContextMenuEvent *e) +{ + Parent::contentsContextMenuEvent(e); +} + +ConfigSearchWindow::ConfigSearchWindow(QWidget* parent, const char *name) + : Parent(parent, name), result(NULL) +{ + setCaption("Search Config"); + + QVBoxLayout* layout1 = new QVBoxLayout(this, 11, 6); + QHBoxLayout* layout2 = new QHBoxLayout(0, 0, 6); + layout2->addWidget(new QLabel("Find:", this)); + editField = new QLineEdit(this); + connect(editField, SIGNAL(returnPressed()), SLOT(search())); + layout2->addWidget(editField); + searchButton = new QPushButton("Search", this); + searchButton->setAutoDefault(FALSE); + connect(searchButton, SIGNAL(clicked()), SLOT(search())); + layout2->addWidget(searchButton); + layout1->addLayout(layout2); + + split = new QSplitter(this); + split->setOrientation(QSplitter::Vertical); + list = new ConfigView(split, name); + list->list->mode = listMode; + info = new ConfigInfoView(split, name); + connect(list->list, SIGNAL(menuChanged(struct menu *)), + info, SLOT(setInfo(struct menu *))); + layout1->addWidget(split); + + if (name) { + int x, y, width, height; + bool ok; + + configSettings->beginGroup(name); + width = configSettings->readNumEntry("/window width", parent->width() / 2); + height = configSettings->readNumEntry("/window height", parent->height() / 2); + resize(width, height); + x = configSettings->readNumEntry("/window x", 0, &ok); + if (ok) + y = configSettings->readNumEntry("/window y", 0, &ok); + if (ok) + move(x, y); + QValueList sizes = configSettings->readSizes("/split", &ok); + if (ok) + split->setSizes(sizes); + configSettings->endGroup(); + connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); + } +} + +void ConfigSearchWindow::saveSettings(void) +{ + if (name()) { + configSettings->beginGroup(name()); + configSettings->writeEntry("/window x", pos().x()); + configSettings->writeEntry("/window y", pos().y()); + configSettings->writeEntry("/window width", size().width()); + configSettings->writeEntry("/window height", size().height()); + configSettings->writeSizes("/split", split->sizes()); + configSettings->endGroup(); + } +} + +void ConfigSearchWindow::search(void) +{ + struct symbol **p; + struct property *prop; + ConfigItem *lastItem = NULL; + + free(result); + list->list->clear(); + + result = sym_re_search(editField->text().latin1()); + if (!result) + return; + for (p = result; *p; p++) { + for_all_prompts((*p), prop) + lastItem = new ConfigItem(list->list, lastItem, prop->menu, + menu_is_visible(prop->menu)); + } +} + /* * Construct the complete config widget */ @@ -818,42 +1266,30 @@ ConfigMainWindow::ConfigMainWindow(void) QWidget *d = configApp->desktop(); - ConfigSettings* configSettings = new ConfigSettings(); -#if QT_VERSION >= 300 - width = configSettings->readNumEntry("/kconfig/qconf/window width", d->width() - 64); - height = configSettings->readNumEntry("/kconfig/qconf/window height", d->height() - 64); + width = configSettings->readNumEntry("/window width", d->width() - 64); + height = configSettings->readNumEntry("/window height", d->height() - 64); resize(width, height); - x = configSettings->readNumEntry("/kconfig/qconf/window x", 0, &ok); + x = configSettings->readNumEntry("/window x", 0, &ok); if (ok) - y = configSettings->readNumEntry("/kconfig/qconf/window y", 0, &ok); + y = configSettings->readNumEntry("/window y", 0, &ok); if (ok) move(x, y); - showDebug = configSettings->readBoolEntry("/kconfig/qconf/showDebug", false); - - // read list settings into configSettings, will be used later for ConfigList setup - configSettings->readListSettings(); -#else - width = d->width() - 64; - height = d->height() - 64; - resize(width, height); - showDebug = false; -#endif split1 = new QSplitter(this); split1->setOrientation(QSplitter::Horizontal); setCentralWidget(split1); - menuView = new ConfigView(split1, this, configSettings); + menuView = new ConfigView(split1, "menu"); menuList = menuView->list; split2 = new QSplitter(split1); split2->setOrientation(QSplitter::Vertical); // create config tree - configView = new ConfigView(split2, this, configSettings); + configView = new ConfigView(split2, "config"); configList = configView->list; - helpText = new QTextView(split2); + helpText = new ConfigInfoView(split2, "help"); helpText->setTextFormat(Qt::RichText); setTabOrder(configList, helpText); @@ -873,6 +1309,8 @@ ConfigMainWindow::ConfigMainWindow(void) connect(saveAction, SIGNAL(activated()), SLOT(saveConfig())); QAction *saveAsAction = new QAction("Save As...", "Save &As...", 0, this); connect(saveAsAction, SIGNAL(activated()), SLOT(saveConfigAs())); + QAction *searchAction = new QAction("Search", "&Search", CTRL+Key_F, this); + connect(searchAction, SIGNAL(activated()), SLOT(searchConfig())); QAction *singleViewAction = new QAction("Single View", QPixmap(xpm_single_view), "Split View", 0, this); connect(singleViewAction, SIGNAL(activated()), SLOT(showSingleView())); QAction *splitViewAction = new QAction("Split View", QPixmap(xpm_split_view), "Split View", 0, this); @@ -882,24 +1320,29 @@ ConfigMainWindow::ConfigMainWindow(void) QAction *showNameAction = new QAction(NULL, "Show Name", 0, this); showNameAction->setToggleAction(TRUE); - showNameAction->setOn(configList->showName); - connect(showNameAction, SIGNAL(toggled(bool)), SLOT(setShowName(bool))); + connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool))); + connect(configView, SIGNAL(showNameChanged(bool)), showNameAction, SLOT(setOn(bool))); + showNameAction->setOn(configView->showName()); QAction *showRangeAction = new QAction(NULL, "Show Range", 0, this); showRangeAction->setToggleAction(TRUE); + connect(showRangeAction, SIGNAL(toggled(bool)), configView, SLOT(setShowRange(bool))); + connect(configView, SIGNAL(showRangeChanged(bool)), showRangeAction, SLOT(setOn(bool))); showRangeAction->setOn(configList->showRange); - connect(showRangeAction, SIGNAL(toggled(bool)), SLOT(setShowRange(bool))); QAction *showDataAction = new QAction(NULL, "Show Data", 0, this); showDataAction->setToggleAction(TRUE); + connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool))); + connect(configView, SIGNAL(showDataChanged(bool)), showDataAction, SLOT(setOn(bool))); showDataAction->setOn(configList->showData); - connect(showDataAction, SIGNAL(toggled(bool)), SLOT(setShowData(bool))); QAction *showAllAction = new QAction(NULL, "Show All Options", 0, this); showAllAction->setToggleAction(TRUE); + connect(showAllAction, SIGNAL(toggled(bool)), configView, SLOT(setShowAll(bool))); + connect(showAllAction, SIGNAL(toggled(bool)), menuView, SLOT(setShowAll(bool))); showAllAction->setOn(configList->showAll); - connect(showAllAction, SIGNAL(toggled(bool)), SLOT(setShowAll(bool))); QAction *showDebugAction = new QAction(NULL, "Show Debug Info", 0, this); showDebugAction->setToggleAction(TRUE); - showDebugAction->setOn(showDebug); - connect(showDebugAction, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool))); + connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool))); + connect(helpText, SIGNAL(showDebugChanged(bool)), showDebugAction, SLOT(setOn(bool))); + showDebugAction->setOn(helpText->showDebug()); QAction *showIntroAction = new QAction(NULL, "Introduction", 0, this); connect(showIntroAction, SIGNAL(activated()), SLOT(showIntro())); @@ -923,6 +1366,8 @@ ConfigMainWindow::ConfigMainWindow(void) saveAction->addTo(config); saveAsAction->addTo(config); config->insertSeparator(); + searchAction->addTo(config); + config->insertSeparator(); quitAction->addTo(config); // create options menu @@ -942,20 +1387,27 @@ ConfigMainWindow::ConfigMainWindow(void) showIntroAction->addTo(helpMenu); showAboutAction->addTo(helpMenu); + connect(configList, SIGNAL(menuChanged(struct menu *)), + helpText, SLOT(setInfo(struct menu *))); connect(configList, SIGNAL(menuSelected(struct menu *)), SLOT(changeMenu(struct menu *))); connect(configList, SIGNAL(parentSelected()), SLOT(goBack())); + connect(menuList, SIGNAL(menuChanged(struct menu *)), + helpText, SLOT(setInfo(struct menu *))); connect(menuList, SIGNAL(menuSelected(struct menu *)), SLOT(changeMenu(struct menu *))); - connect(configList, SIGNAL(gotFocus(void)), - SLOT(listFocusChanged(void))); - connect(menuList, SIGNAL(gotFocus(void)), + connect(configList, SIGNAL(gotFocus(struct menu *)), + helpText, SLOT(setInfo(struct menu *))); + connect(menuList, SIGNAL(gotFocus(struct menu *)), + helpText, SLOT(setInfo(struct menu *))); + connect(menuList, SIGNAL(gotFocus(struct menu *)), SLOT(listFocusChanged(void))); + connect(helpText, SIGNAL(menuSelected(struct menu *)), + SLOT(setMenuLink(struct menu *))); -#if QT_VERSION >= 300 - QString listMode = configSettings->readEntry("/kconfig/qconf/listMode", "symbol"); + QString listMode = configSettings->readEntry("/listMode", "symbol"); if (listMode == "single") showSingleView(); else if (listMode == "full") @@ -964,162 +1416,13 @@ ConfigMainWindow::ConfigMainWindow(void) showSplitView(); // UI setup done, restore splitter positions - QValueList sizes = configSettings->readSizes("/kconfig/qconf/split1", &ok); + QValueList sizes = configSettings->readSizes("/split1", &ok); if (ok) split1->setSizes(sizes); - sizes = configSettings->readSizes("/kconfig/qconf/split2", &ok); + sizes = configSettings->readSizes("/split2", &ok); if (ok) split2->setSizes(sizes); -#else - showSplitView(); -#endif - delete configSettings; -} - -static QString print_filter(const QString &str) -{ - QRegExp re("[<>&\"\\n]"); - QString res = str; - for (int i = 0; (i = res.find(re, i)) >= 0;) { - switch (res[i].latin1()) { - case '<': - res.replace(i, 1, "<"); - i += 4; - break; - case '>': - res.replace(i, 1, ">"); - i += 4; - break; - case '&': - res.replace(i, 1, "&"); - i += 5; - break; - case '"': - res.replace(i, 1, """); - i += 6; - break; - case '\n': - res.replace(i, 1, "
"); - i += 4; - break; - } - } - return res; -} - -static void expr_print_help(void *data, const char *str) -{ - reinterpret_cast(data)->append(print_filter(str)); -} - -/* - * display a new help entry as soon as a new menu entry is selected - */ -void ConfigMainWindow::setHelp(QListViewItem* item) -{ - struct symbol* sym; - struct menu* menu = 0; - - configList->parent()->lineEdit->hide(); - if (item) - menu = ((ConfigItem*)item)->menu; - if (!menu) { - helpText->setText(QString::null); - return; - } - - QString head, debug, help; - menu = ((ConfigItem*)item)->menu; - sym = menu->sym; - if (sym) { - if (menu->prompt) { - head += ""; - head += print_filter(_(menu->prompt->text)); - head += ""; - if (sym->name) { - head += " ("; - head += print_filter(_(sym->name)); - head += ")"; - } - } else if (sym->name) { - head += ""; - head += print_filter(_(sym->name)); - head += ""; - } - head += "

"; - - if (showDebug) { - debug += "type: "; - debug += print_filter(sym_type_name(sym->type)); - if (sym_is_choice(sym)) - debug += " (choice)"; - debug += "
"; - if (sym->rev_dep.expr) { - debug += "reverse dep: "; - expr_print(sym->rev_dep.expr, expr_print_help, &debug, E_NONE); - debug += "
"; - } - for (struct property *prop = sym->prop; prop; prop = prop->next) { - switch (prop->type) { - case P_PROMPT: - case P_MENU: - debug += "prompt: "; - debug += print_filter(_(prop->text)); - debug += "
"; - break; - case P_DEFAULT: - debug += "default: "; - expr_print(prop->expr, expr_print_help, &debug, E_NONE); - debug += "
"; - break; - case P_CHOICE: - if (sym_is_choice(sym)) { - debug += "choice: "; - expr_print(prop->expr, expr_print_help, &debug, E_NONE); - debug += "
"; - } - break; - case P_SELECT: - debug += "select: "; - expr_print(prop->expr, expr_print_help, &debug, E_NONE); - debug += "
"; - break; - case P_RANGE: - debug += "range: "; - expr_print(prop->expr, expr_print_help, &debug, E_NONE); - debug += "
"; - break; - default: - debug += "unknown property: "; - debug += prop_get_type_name(prop->type); - debug += "
"; - } - if (prop->visible.expr) { - debug += "    dep: "; - expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE); - debug += "
"; - } - } - debug += "
"; - } - - help = print_filter(_(sym->help)); - } else if (menu->prompt) { - head += ""; - head += print_filter(_(menu->prompt->text)); - head += "

"; - if (showDebug) { - if (menu->prompt->visible.expr) { - debug += "  dep: "; - expr_print(menu->prompt->visible.expr, expr_print_help, &debug, E_NONE); - debug += "

"; - } - } - } - if (showDebug) - debug += QString().sprintf("defined at %s:%d

", menu->file->name, menu->lineno); - helpText->setText(head + debug + help); } void ConfigMainWindow::loadConfig(void) @@ -1147,21 +1450,73 @@ void ConfigMainWindow::saveConfigAs(void) QMessageBox::information(this, "qconf", "Unable to save configuration!"); } +void ConfigMainWindow::searchConfig(void) +{ + if (!searchWindow) + searchWindow = new ConfigSearchWindow(this, "search"); + searchWindow->show(); +} + void ConfigMainWindow::changeMenu(struct menu *menu) { configList->setRootMenu(menu); backAction->setEnabled(TRUE); } -void ConfigMainWindow::listFocusChanged(void) +void ConfigMainWindow::setMenuLink(struct menu *menu) { - if (menuList->hasFocus()) { - if (menuList->mode == menuMode) + struct menu *parent; + ConfigList* list = NULL; + ConfigItem* item; + + if (!menu_is_visible(menu) && !configView->showAll()) + return; + + switch (configList->mode) { + case singleMode: + list = configList; + parent = menu_get_parent_menu(menu); + if (!parent) + return; + list->setRootMenu(parent); + break; + case symbolMode: + if (menu->flags & MENU_ROOT) { + configList->setRootMenu(menu); configList->clearSelection(); - setHelp(menuList->selectedItem()); - } else if (configList->hasFocus()) { - setHelp(configList->selectedItem()); + list = menuList; + } else { + list = configList; + parent = menu_get_parent_menu(menu->parent); + if (!parent) + return; + item = menuList->findConfigItem(parent); + if (item) { + menuList->setSelected(item, TRUE); + menuList->ensureItemVisible(item); + } + list->setRootMenu(parent); + } + break; + case fullMode: + list = configList; + break; } + + if (list) { + item = list->findConfigItem(menu); + if (item) { + list->setSelected(item, TRUE); + list->ensureItemVisible(item); + list->setFocus(); + } + } +} + +void ConfigMainWindow::listFocusChanged(void) +{ + if (menuList->mode == menuMode) + configList->clearSelection(); } void ConfigMainWindow::goBack(void) @@ -1223,53 +1578,6 @@ void ConfigMainWindow::showFullView(void) configList->setFocus(); } -void ConfigMainWindow::setShowAll(bool b) -{ - if (configList->showAll == b) - return; - configList->showAll = b; - configList->updateListAll(); - menuList->showAll = b; - menuList->updateListAll(); -} - -void ConfigMainWindow::setShowDebug(bool b) -{ - if (showDebug == b) - return; - showDebug = b; -} - -void ConfigMainWindow::setShowName(bool b) -{ - if (configList->showName == b) - return; - configList->showName = b; - configList->reinit(); - menuList->showName = b; - menuList->reinit(); -} - -void ConfigMainWindow::setShowRange(bool b) -{ - if (configList->showRange == b) - return; - configList->showRange = b; - configList->reinit(); - menuList->showRange = b; - menuList->reinit(); -} - -void ConfigMainWindow::setShowData(bool b) -{ - if (configList->showData == b) - return; - configList->showData = b; - configList->reinit(); - menuList->showData = b; - menuList->reinit(); -} - /* * ask for saving configuration before quitting * TODO ask only when something changed @@ -1324,17 +1632,10 @@ void ConfigMainWindow::showAbout(void) void ConfigMainWindow::saveSettings(void) { -#if QT_VERSION >= 300 - ConfigSettings *configSettings = new ConfigSettings; - configSettings->writeEntry("/kconfig/qconf/window x", pos().x()); - configSettings->writeEntry("/kconfig/qconf/window y", pos().y()); - configSettings->writeEntry("/kconfig/qconf/window width", size().width()); - configSettings->writeEntry("/kconfig/qconf/window height", size().height()); - configSettings->writeEntry("/kconfig/qconf/showName", configList->showName); - configSettings->writeEntry("/kconfig/qconf/showRange", configList->showRange); - configSettings->writeEntry("/kconfig/qconf/showData", configList->showData); - configSettings->writeEntry("/kconfig/qconf/showAll", configList->showAll); - configSettings->writeEntry("/kconfig/qconf/showDebug", showDebug); + configSettings->writeEntry("/window x", pos().x()); + configSettings->writeEntry("/window y", pos().y()); + configSettings->writeEntry("/window width", size().width()); + configSettings->writeEntry("/window height", size().height()); QString entry; switch(configList->mode) { @@ -1350,13 +1651,10 @@ void ConfigMainWindow::saveSettings(void) entry = "full"; break; } - configSettings->writeEntry("/kconfig/qconf/listMode", entry); + configSettings->writeEntry("/listMode", entry); - configSettings->writeSizes("/kconfig/qconf/split1", split1->sizes()); - configSettings->writeSizes("/kconfig/qconf/split2", split2->sizes()); - - delete configSettings; -#endif + configSettings->writeSizes("/split1", split1->sizes()); + configSettings->writeSizes("/split2", split2->sizes()); } void fixup_rootmenu(struct menu *menu) @@ -1414,13 +1712,19 @@ int main(int ac, char** av) conf_read(NULL); //zconfdump(stdout); + configSettings = new ConfigSettings(); + configSettings->beginGroup("/kconfig/qconf"); v = new ConfigMainWindow(); //zconfdump(stdout); - v->show(); + configApp->setMainWidget(v); configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit())); configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings())); + v->show(); configApp->exec(); + configSettings->endGroup(); + delete configSettings; + return 0; } diff --git a/scripts/kconfig/qconf.h b/scripts/kconfig/qconf.h index e52f3e90b..6a9e3b14c 100644 --- a/scripts/kconfig/qconf.h +++ b/scripts/kconfig/qconf.h @@ -7,9 +7,25 @@ #if QT_VERSION >= 300 #include #else -class QSettings { }; +class QSettings { +public: + void beginGroup(const QString& group) { } + void endGroup(void) { } + bool readBoolEntry(const QString& key, bool def = FALSE, bool* ok = 0) const + { if (ok) *ok = FALSE; return def; } + int readNumEntry(const QString& key, int def = 0, bool* ok = 0) const + { if (ok) *ok = FALSE; return def; } + QString readEntry(const QString& key, const QString& def = QString::null, bool* ok = 0) const + { if (ok) *ok = FALSE; return def; } + QStringList readListEntry(const QString& key, bool* ok = 0) const + { if (ok) *ok = FALSE; return QStringList(); } + template + bool writeEntry(const QString& key, t value) + { return TRUE; } +}; #endif +class ConfigView; class ConfigList; class ConfigItem; class ConfigLineEdit; @@ -18,64 +34,38 @@ class ConfigMainWindow; class ConfigSettings : public QSettings { public: - ConfigSettings(); - -#if QT_VERSION >= 300 - void readListSettings(); QValueList readSizes(const QString& key, bool *ok); bool writeSizes(const QString& key, const QValueList& value); -#endif - - bool showAll; - bool showName; - bool showRange; - bool showData; -}; - -class ConfigView : public QVBox { - Q_OBJECT - typedef class QVBox Parent; -public: - ConfigView(QWidget* parent, ConfigMainWindow* cview, ConfigSettings* configSettings); - ~ConfigView(void); - static void updateList(ConfigItem* item); - static void updateListAll(void); - -public: - ConfigList* list; - ConfigLineEdit* lineEdit; - - static ConfigView* viewList; - ConfigView* nextView; }; enum colIdx { promptColIdx, nameColIdx, noColIdx, modColIdx, yesColIdx, dataColIdx, colNr }; enum listMode { - singleMode, menuMode, symbolMode, fullMode + singleMode, menuMode, symbolMode, fullMode, listMode }; class ConfigList : public QListView { Q_OBJECT typedef class QListView Parent; public: - ConfigList(ConfigView* p, ConfigMainWindow* cview, ConfigSettings *configSettings); + ConfigList(ConfigView* p, const char *name = 0); void reinit(void); ConfigView* parent(void) const { return (ConfigView*)Parent::parent(); } + ConfigItem* findConfigItem(struct menu *); protected: - ConfigMainWindow* cview; - void keyPressEvent(QKeyEvent *e); void contentsMousePressEvent(QMouseEvent *e); void contentsMouseReleaseEvent(QMouseEvent *e); void contentsMouseMoveEvent(QMouseEvent *e); void contentsMouseDoubleClickEvent(QMouseEvent *e); void focusInEvent(QFocusEvent *e); + void contextMenuEvent(QContextMenuEvent *e); + public slots: void setRootMenu(struct menu *menu); @@ -83,10 +73,12 @@ public slots: void setValue(ConfigItem* item, tristate val); void changeValue(ConfigItem* item); void updateSelection(void); + void saveSettings(void); signals: + void menuChanged(struct menu *menu); void menuSelected(struct menu *menu); void parentSelected(void); - void gotFocus(void); + void gotFocus(struct menu *); public: void updateListAll(void) @@ -137,6 +129,7 @@ public: struct menu *rootEntry; QColorGroup disabledColorGroup; QColorGroup inactivedColorGroup; + QPopupMenu* headerPopup; private: int colMap[colNr]; @@ -208,9 +201,7 @@ class ConfigLineEdit : public QLineEdit { Q_OBJECT typedef class QLineEdit Parent; public: - ConfigLineEdit(ConfigView* parent) - : Parent(parent) - { } + ConfigLineEdit(ConfigView* parent); ConfigView* parent(void) const { return (ConfigView*)Parent::parent(); @@ -222,26 +213,104 @@ public: ConfigItem *item; }; +class ConfigView : public QVBox { + Q_OBJECT + typedef class QVBox Parent; +public: + ConfigView(QWidget* parent, const char *name = 0); + ~ConfigView(void); + static void updateList(ConfigItem* item); + static void updateListAll(void); + + bool showAll(void) const { return list->showAll; } + bool showName(void) const { return list->showName; } + bool showRange(void) const { return list->showRange; } + bool showData(void) const { return list->showData; } +public slots: + void setShowAll(bool); + void setShowName(bool); + void setShowRange(bool); + void setShowData(bool); +signals: + void showAllChanged(bool); + void showNameChanged(bool); + void showRangeChanged(bool); + void showDataChanged(bool); +public: + ConfigList* list; + ConfigLineEdit* lineEdit; + + static ConfigView* viewList; + ConfigView* nextView; +}; + +class ConfigInfoView : public QTextBrowser { + Q_OBJECT + typedef class QTextBrowser Parent; +public: + ConfigInfoView(QWidget* parent, const char *name = 0); + bool showDebug(void) const { return _showDebug; } + +public slots: + void setInfo(struct menu *menu); + void saveSettings(void); + void setSource(const QString& name); + void setShowDebug(bool); + +signals: + void showDebugChanged(bool); + void menuSelected(struct menu *); + +protected: + void symbolInfo(void); + void menuInfo(void); + QString debug_info(struct symbol *sym); + static QString print_filter(const QString &str); + static void expr_print_help(void *data, struct symbol *sym, const char *str); + QPopupMenu* createPopupMenu(const QPoint& pos); + void contentsContextMenuEvent(QContextMenuEvent *e); + + struct symbol *sym; + struct menu *menu; + bool _showDebug; +}; + +class ConfigSearchWindow : public QDialog { + Q_OBJECT + typedef class QDialog Parent; +public: + ConfigSearchWindow(QWidget* parent, const char *name = 0); + +public slots: + void saveSettings(void); + void search(void); + +protected: + QLineEdit* editField; + QPushButton* searchButton; + QSplitter* split; + ConfigView* list; + ConfigInfoView* info; + + struct symbol **result; +}; + class ConfigMainWindow : public QMainWindow { Q_OBJECT public: ConfigMainWindow(void); public slots: - void setHelp(QListViewItem* item); void changeMenu(struct menu *); + void setMenuLink(struct menu *); void listFocusChanged(void); void goBack(void); void loadConfig(void); void saveConfig(void); void saveConfigAs(void); + void searchConfig(void); void showSingleView(void); void showSplitView(void); void showFullView(void); - void setShowAll(bool); - void setShowDebug(bool); - void setShowRange(bool); - void setShowName(bool); - void setShowData(bool); void showIntro(void); void showAbout(void); void saveSettings(void); @@ -249,15 +318,14 @@ public slots: protected: void closeEvent(QCloseEvent *e); + ConfigSearchWindow *searchWindow; ConfigView *menuView; ConfigList *menuList; ConfigView *configView; ConfigList *configList; - QTextView *helpText; + ConfigInfoView *helpText; QToolBar *toolBar; QAction *backAction; QSplitter* split1; QSplitter* split2; - - bool showDebug; }; diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c index 3d7877afc..ee225ced2 100644 --- a/scripts/kconfig/symbol.c +++ b/scripts/kconfig/symbol.c @@ -15,15 +15,15 @@ struct symbol symbol_yes = { .name = "y", .curr = { "y", yes }, - .flags = SYMBOL_YES|SYMBOL_VALID, + .flags = SYMBOL_CONST|SYMBOL_VALID, }, symbol_mod = { .name = "m", .curr = { "m", mod }, - .flags = SYMBOL_MOD|SYMBOL_VALID, + .flags = SYMBOL_CONST|SYMBOL_VALID, }, symbol_no = { .name = "n", .curr = { "n", no }, - .flags = SYMBOL_NO|SYMBOL_VALID, + .flags = SYMBOL_CONST|SYMBOL_VALID, }, symbol_empty = { .name = "", .curr = { "", no }, @@ -31,6 +31,7 @@ struct symbol symbol_yes = { }; int sym_change_count; +struct symbol *sym_defconfig_list; struct symbol *modules_sym; tristate modules_val; @@ -227,7 +228,7 @@ static struct symbol *sym_calc_choice(struct symbol *sym) struct expr *e; /* is the user choice visible? */ - def_sym = sym->user.val; + def_sym = sym->def[S_DEF_USER].val; if (def_sym) { sym_calc_visibility(def_sym); if (def_sym->visible != no) @@ -306,7 +307,7 @@ void sym_calc_value(struct symbol *sym) } else if (E_OR(sym->visible, sym->rev_dep.tri) != no) { sym->flags |= SYMBOL_WRITE; if (sym_has_value(sym)) - newval.tri = sym->user.tri; + newval.tri = sym->def[S_DEF_USER].tri; else if (!sym_is_choice(sym)) { prop = sym_get_default_prop(sym); if (prop) @@ -329,7 +330,7 @@ void sym_calc_value(struct symbol *sym) if (sym->visible != no) { sym->flags |= SYMBOL_WRITE; if (sym_has_value(sym)) { - newval.val = sym->user.val; + newval.val = sym->def[S_DEF_USER].val; break; } } @@ -352,10 +353,13 @@ void sym_calc_value(struct symbol *sym) sym->curr.val = sym_calc_choice(sym); sym_validate_range(sym); - if (memcmp(&oldval, &sym->curr, sizeof(oldval))) + if (memcmp(&oldval, &sym->curr, sizeof(oldval))) { sym_set_changed(sym); - if (modules_sym == sym) - modules_val = modules_sym->curr.tri; + if (modules_sym == sym) { + sym_set_all_changed(); + modules_val = modules_sym->curr.tri; + } + } if (sym_is_choice(sym)) { int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE); @@ -426,8 +430,8 @@ bool sym_set_tristate_value(struct symbol *sym, tristate val) if (oldval != val && !sym_tristate_within_range(sym, val)) return false; - if (sym->flags & SYMBOL_NEW) { - sym->flags &= ~SYMBOL_NEW; + if (!(sym->flags & SYMBOL_DEF_USER)) { + sym->flags |= SYMBOL_DEF_USER; sym_set_changed(sym); } /* @@ -439,21 +443,18 @@ bool sym_set_tristate_value(struct symbol *sym, tristate val) struct property *prop; struct expr *e; - cs->user.val = sym; - cs->flags &= ~SYMBOL_NEW; + cs->def[S_DEF_USER].val = sym; + cs->flags |= SYMBOL_DEF_USER; prop = sym_get_choice_prop(cs); for (e = prop->expr; e; e = e->left.expr) { if (e->right.sym->visible != no) - e->right.sym->flags &= ~SYMBOL_NEW; + e->right.sym->flags |= SYMBOL_DEF_USER; } } - sym->user.tri = val; - if (oldval != val) { + sym->def[S_DEF_USER].tri = val; + if (oldval != val) sym_clear_all_valid(); - if (sym == modules_sym) - sym_set_all_changed(); - } return true; } @@ -591,20 +592,20 @@ bool sym_set_string_value(struct symbol *sym, const char *newval) if (!sym_string_within_range(sym, newval)) return false; - if (sym->flags & SYMBOL_NEW) { - sym->flags &= ~SYMBOL_NEW; + if (!(sym->flags & SYMBOL_DEF_USER)) { + sym->flags |= SYMBOL_DEF_USER; sym_set_changed(sym); } - oldval = sym->user.val; + oldval = sym->def[S_DEF_USER].val; size = strlen(newval) + 1; if (sym->type == S_HEX && (newval[0] != '0' || (newval[1] != 'x' && newval[1] != 'X'))) { size += 2; - sym->user.val = val = malloc(size); + sym->def[S_DEF_USER].val = val = malloc(size); *val++ = '0'; *val++ = 'x'; } else if (!oldval || strcmp(oldval, newval)) - sym->user.val = val = malloc(size); + sym->def[S_DEF_USER].val = val = malloc(size); else return true; @@ -679,7 +680,6 @@ struct symbol *sym_lookup(const char *name, int isconst) memset(symbol, 0, sizeof(*symbol)); symbol->name = new_name; symbol->type = S_UNKNOWN; - symbol->flags = SYMBOL_NEW; if (isconst) symbol->flags |= SYMBOL_CONST; diff --git a/scripts/kconfig/util.c b/scripts/kconfig/util.c index 1fa4c0b80..e3f28b9d5 100644 --- a/scripts/kconfig/util.c +++ b/scripts/kconfig/util.c @@ -33,7 +33,7 @@ int file_write_dep(const char *name) FILE *out; if (!name) - name = ".config.cmd"; + name = ".kconfig.d"; out = fopen("..config.tmp", "w"); if (!out) return 1; @@ -44,7 +44,9 @@ int file_write_dep(const char *name) else fprintf(out, "\t%s\n", file->name); } - fprintf(out, "\n.config include/linux/autoconf.h: $(deps_config)\n\n$(deps_config):\n"); + fprintf(out, "\ninclude/config/auto.conf: \\\n" + "\t$(deps_config)\n\n" + "$(deps_config): ;\n"); fclose(out); rename("..config.tmp", name); return 0; @@ -101,7 +103,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; diff --git a/scripts/kconfig/zconf.gperf b/scripts/kconfig/zconf.gperf index b03220600..9b44c80dd 100644 --- a/scripts/kconfig/zconf.gperf +++ b/scripts/kconfig/zconf.gperf @@ -39,5 +39,8 @@ string, T_TYPE, TF_COMMAND, S_STRING select, T_SELECT, TF_COMMAND enable, T_SELECT, TF_COMMAND range, T_RANGE, TF_COMMAND +option, T_OPTION, TF_COMMAND on, T_ON, TF_PARAM +modules, T_OPT_MODULES, TF_OPTION +defconfig_list, T_OPT_DEFCONFIG_LIST,TF_OPTION %% diff --git a/scripts/kconfig/zconf.hash.c_shipped b/scripts/kconfig/zconf.hash.c_shipped index 345f0fc07..47c8b5bab 100644 --- a/scripts/kconfig/zconf.hash.c_shipped +++ b/scripts/kconfig/zconf.hash.c_shipped @@ -53,10 +53,10 @@ kconf_id_hash (register const char *str, register unsigned int len) 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 25, 10, 15, - 0, 0, 5, 47, 0, 0, 47, 47, 0, 10, - 0, 20, 20, 20, 5, 0, 0, 20, 47, 47, - 20, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 25, 30, 15, + 0, 15, 0, 47, 5, 15, 47, 47, 30, 20, + 5, 0, 25, 15, 0, 0, 10, 35, 47, 47, + 5, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, @@ -88,69 +88,75 @@ kconf_id_hash (register const char *str, register unsigned int len) struct kconf_id_strings_t { - char kconf_id_strings_str2[sizeof("if")]; - char kconf_id_strings_str3[sizeof("int")]; - char kconf_id_strings_str4[sizeof("help")]; - char kconf_id_strings_str5[sizeof("endif")]; - char kconf_id_strings_str6[sizeof("select")]; - char kconf_id_strings_str7[sizeof("endmenu")]; - char kconf_id_strings_str8[sizeof("tristate")]; - char kconf_id_strings_str9[sizeof("endchoice")]; + char kconf_id_strings_str2[sizeof("on")]; + char kconf_id_strings_str6[sizeof("string")]; + char kconf_id_strings_str7[sizeof("default")]; + char kconf_id_strings_str8[sizeof("def_bool")]; char kconf_id_strings_str10[sizeof("range")]; - char kconf_id_strings_str11[sizeof("string")]; - char kconf_id_strings_str12[sizeof("default")]; - char kconf_id_strings_str13[sizeof("def_bool")]; - char kconf_id_strings_str14[sizeof("menu")]; - char kconf_id_strings_str16[sizeof("def_boolean")]; - char kconf_id_strings_str17[sizeof("def_tristate")]; - char kconf_id_strings_str18[sizeof("mainmenu")]; - char kconf_id_strings_str20[sizeof("menuconfig")]; - char kconf_id_strings_str21[sizeof("config")]; - char kconf_id_strings_str22[sizeof("on")]; - char kconf_id_strings_str23[sizeof("hex")]; - char kconf_id_strings_str26[sizeof("source")]; - char kconf_id_strings_str27[sizeof("depends")]; - char kconf_id_strings_str28[sizeof("optional")]; - char kconf_id_strings_str31[sizeof("enable")]; - char kconf_id_strings_str32[sizeof("comment")]; - char kconf_id_strings_str33[sizeof("requires")]; + char kconf_id_strings_str11[sizeof("def_boolean")]; + char kconf_id_strings_str12[sizeof("def_tristate")]; + char kconf_id_strings_str13[sizeof("hex")]; + char kconf_id_strings_str14[sizeof("defconfig_list")]; + char kconf_id_strings_str16[sizeof("option")]; + char kconf_id_strings_str17[sizeof("if")]; + char kconf_id_strings_str18[sizeof("optional")]; + char kconf_id_strings_str20[sizeof("endif")]; + char kconf_id_strings_str21[sizeof("choice")]; + char kconf_id_strings_str22[sizeof("endmenu")]; + char kconf_id_strings_str23[sizeof("requires")]; + char kconf_id_strings_str24[sizeof("endchoice")]; + char kconf_id_strings_str26[sizeof("config")]; + char kconf_id_strings_str27[sizeof("modules")]; + char kconf_id_strings_str28[sizeof("int")]; + char kconf_id_strings_str29[sizeof("menu")]; + char kconf_id_strings_str31[sizeof("prompt")]; + char kconf_id_strings_str32[sizeof("depends")]; + char kconf_id_strings_str33[sizeof("tristate")]; char kconf_id_strings_str34[sizeof("bool")]; + char kconf_id_strings_str35[sizeof("menuconfig")]; + char kconf_id_strings_str36[sizeof("select")]; char kconf_id_strings_str37[sizeof("boolean")]; - char kconf_id_strings_str41[sizeof("choice")]; - char kconf_id_strings_str46[sizeof("prompt")]; + char kconf_id_strings_str39[sizeof("help")]; + char kconf_id_strings_str41[sizeof("source")]; + char kconf_id_strings_str42[sizeof("comment")]; + char kconf_id_strings_str43[sizeof("mainmenu")]; + char kconf_id_strings_str46[sizeof("enable")]; }; static struct kconf_id_strings_t kconf_id_strings_contents = { - "if", - "int", - "help", - "endif", - "select", - "endmenu", - "tristate", - "endchoice", - "range", + "on", "string", "default", "def_bool", - "menu", + "range", "def_boolean", "def_tristate", - "mainmenu", - "menuconfig", - "config", - "on", "hex", - "source", - "depends", + "defconfig_list", + "option", + "if", "optional", - "enable", - "comment", + "endif", + "choice", + "endmenu", "requires", + "endchoice", + "config", + "modules", + "int", + "menu", + "prompt", + "depends", + "tristate", "bool", + "menuconfig", + "select", "boolean", - "choice", - "prompt" + "help", + "source", + "comment", + "mainmenu", + "enable" }; #define kconf_id_strings ((const char *) &kconf_id_strings_contents) #ifdef __GNUC__ @@ -161,9 +167,9 @@ kconf_id_lookup (register const char *str, register unsigned int len) { enum { - TOTAL_KEYWORDS = 30, + TOTAL_KEYWORDS = 33, MIN_WORD_LENGTH = 2, - MAX_WORD_LENGTH = 12, + MAX_WORD_LENGTH = 14, MIN_HASH_VALUE = 2, MAX_HASH_VALUE = 46 }; @@ -171,43 +177,48 @@ kconf_id_lookup (register const char *str, register unsigned int len) static struct kconf_id wordlist[] = { {-1}, {-1}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str2, T_IF, TF_COMMAND|TF_PARAM}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str3, T_TYPE, TF_COMMAND, S_INT}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str4, T_HELP, TF_COMMAND}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str5, T_ENDIF, TF_COMMAND}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str6, T_SELECT, TF_COMMAND}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str7, T_ENDMENU, TF_COMMAND}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str8, T_TYPE, TF_COMMAND, S_TRISTATE}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str9, T_ENDCHOICE, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str2, T_ON, TF_PARAM}, + {-1}, {-1}, {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str6, T_TYPE, TF_COMMAND, S_STRING}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str7, T_DEFAULT, TF_COMMAND, S_UNKNOWN}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str8, T_DEFAULT, TF_COMMAND, S_BOOLEAN}, + {-1}, {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str10, T_RANGE, TF_COMMAND}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str11, T_TYPE, TF_COMMAND, S_STRING}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str12, T_DEFAULT, TF_COMMAND, S_UNKNOWN}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str13, T_DEFAULT, TF_COMMAND, S_BOOLEAN}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str14, T_MENU, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str11, T_DEFAULT, TF_COMMAND, S_BOOLEAN}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str12, T_DEFAULT, TF_COMMAND, S_TRISTATE}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str13, T_TYPE, TF_COMMAND, S_HEX}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str14, T_OPT_DEFCONFIG_LIST,TF_OPTION}, {-1}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str16, T_DEFAULT, TF_COMMAND, S_BOOLEAN}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str17, T_DEFAULT, TF_COMMAND, S_TRISTATE}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str18, T_MAINMENU, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str16, T_OPTION, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str17, T_IF, TF_COMMAND|TF_PARAM}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str18, T_OPTIONAL, TF_COMMAND}, {-1}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str20, T_MENUCONFIG, TF_COMMAND}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str21, T_CONFIG, TF_COMMAND}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str22, T_ON, TF_PARAM}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str23, T_TYPE, TF_COMMAND, S_HEX}, - {-1}, {-1}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str26, T_SOURCE, TF_COMMAND}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str27, T_DEPENDS, TF_COMMAND}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str28, T_OPTIONAL, TF_COMMAND}, - {-1}, {-1}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str31, T_SELECT, TF_COMMAND}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str32, T_COMMENT, TF_COMMAND}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str33, T_REQUIRES, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str20, T_ENDIF, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str21, T_CHOICE, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str22, T_ENDMENU, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str23, T_REQUIRES, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str24, T_ENDCHOICE, TF_COMMAND}, + {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str26, T_CONFIG, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str27, T_OPT_MODULES, TF_OPTION}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str28, T_TYPE, TF_COMMAND, S_INT}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str29, T_MENU, TF_COMMAND}, + {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str31, T_PROMPT, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str32, T_DEPENDS, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str33, T_TYPE, TF_COMMAND, S_TRISTATE}, {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str34, T_TYPE, TF_COMMAND, S_BOOLEAN}, - {-1}, {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str35, T_MENUCONFIG, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str36, T_SELECT, TF_COMMAND}, {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str37, T_TYPE, TF_COMMAND, S_BOOLEAN}, - {-1}, {-1}, {-1}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str41, T_CHOICE, TF_COMMAND}, - {-1}, {-1}, {-1}, {-1}, - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str46, T_PROMPT, TF_COMMAND} + {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str39, T_HELP, TF_COMMAND}, + {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str41, T_SOURCE, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str42, T_COMMENT, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str43, T_MAINMENU, TF_COMMAND}, + {-1}, {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str46, T_SELECT, TF_COMMAND} }; if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) diff --git a/scripts/kconfig/zconf.tab.c_shipped b/scripts/kconfig/zconf.tab.c_shipped index ea7755da8..2fb0a4fc6 100644 --- a/scripts/kconfig/zconf.tab.c_shipped +++ b/scripts/kconfig/zconf.tab.c_shipped @@ -1,7 +1,7 @@ -/* A Bison parser, made by GNU Bison 2.0. */ +/* A Bison parser, made by GNU Bison 2.1. */ /* Skeleton parser for Yacc-like parsing with Bison, - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, 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 @@ -15,8 +15,8 @@ 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. */ + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ /* As a special exception, when this file is copied by Bison into a Bison output file, you may use that output file without restriction. @@ -36,6 +36,9 @@ /* Identify Bison output. */ #define YYBISON 1 +/* Bison version. */ +#define YYBISON_VERSION "2.1" + /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -82,19 +85,21 @@ T_DEFAULT = 276, T_SELECT = 277, T_RANGE = 278, - T_ON = 279, - T_WORD = 280, - T_WORD_QUOTE = 281, - T_UNEQUAL = 282, - T_CLOSE_PAREN = 283, - T_OPEN_PAREN = 284, - T_EOL = 285, - T_OR = 286, - T_AND = 287, - T_EQUAL = 288, - T_NOT = 289 + T_OPTION = 279, + T_ON = 280, + T_WORD = 281, + T_WORD_QUOTE = 282, + T_UNEQUAL = 283, + T_CLOSE_PAREN = 284, + T_OPEN_PAREN = 285, + T_EOL = 286, + T_OR = 287, + T_AND = 288, + T_EQUAL = 289, + T_NOT = 290 }; #endif +/* Tokens. */ #define T_MAINMENU 258 #define T_MENU 259 #define T_ENDMENU 260 @@ -116,17 +121,18 @@ #define T_DEFAULT 276 #define T_SELECT 277 #define T_RANGE 278 -#define T_ON 279 -#define T_WORD 280 -#define T_WORD_QUOTE 281 -#define T_UNEQUAL 282 -#define T_CLOSE_PAREN 283 -#define T_OPEN_PAREN 284 -#define T_EOL 285 -#define T_OR 286 -#define T_AND 287 -#define T_EQUAL 288 -#define T_NOT 289 +#define T_OPTION 279 +#define T_ON 280 +#define T_WORD 281 +#define T_WORD_QUOTE 282 +#define T_UNEQUAL 283 +#define T_CLOSE_PAREN 284 +#define T_OPEN_PAREN 285 +#define T_EOL 286 +#define T_OR 287 +#define T_AND 288 +#define T_EQUAL 289 +#define T_NOT 290 @@ -187,6 +193,11 @@ static struct menu *current_menu, *current_entry; # define YYERROR_VERBOSE 0 #endif +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) typedef union YYSTYPE { @@ -197,7 +208,7 @@ typedef union YYSTYPE { struct menu *menu; struct kconf_id *id; } YYSTYPE; -/* Line 190 of yacc.c. */ +/* Line 196 of yacc.c. */ # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 @@ -209,17 +220,36 @@ typedef union YYSTYPE { /* Copy the second part of user declarations. */ -/* Line 213 of yacc.c. */ +/* Line 219 of yacc.c. */ -#if ! defined (yyoverflow) || YYERROR_VERBOSE +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ +#endif +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) && (defined (__STDC__) || defined (__cplusplus)) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int +#endif -# ifndef YYFREE -# define YYFREE free +#ifndef YY_ +# if YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif # endif -# ifndef YYMALLOC -# define YYMALLOC malloc +# ifndef YY_ +# define YY_(msgid) msgid # endif +#endif + +#if ! defined (yyoverflow) || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ @@ -229,6 +259,10 @@ typedef union YYSTYPE { # define YYSTACK_ALLOC __builtin_alloca # else # define YYSTACK_ALLOC alloca +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYINCLUDED_STDLIB_H +# endif # endif # endif # endif @@ -236,13 +270,39 @@ typedef union YYSTYPE { # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) -# else -# if defined (__STDC__) || defined (__cplusplus) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2005 */ # endif +# else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM ((YYSIZE_T) -1) +# endif +# ifdef __cplusplus +extern "C" { +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if (! defined (malloc) && ! defined (YYINCLUDED_STDLIB_H) \ + && (defined (__STDC__) || defined (__cplusplus))) +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if (! defined (free) && ! defined (YYINCLUDED_STDLIB_H) \ + && (defined (__STDC__) || defined (__cplusplus))) +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifdef __cplusplus +} +# endif # endif #endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ @@ -277,7 +337,7 @@ union yyalloc # define YYCOPY(To, From, Count) \ do \ { \ - register YYSIZE_T yyi; \ + YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ @@ -312,22 +372,22 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 264 +#define YYLAST 275 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 35 +#define YYNTOKENS 36 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 42 +#define YYNNTS 45 /* YYNRULES -- Number of rules. */ -#define YYNRULES 104 +#define YYNRULES 110 /* YYNRULES -- Number of states. */ -#define YYNSTATES 175 +#define YYNSTATES 183 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 289 +#define YYMAXUTOK 290 -#define YYTRANSLATE(YYX) \ +#define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ @@ -361,7 +421,8 @@ static const unsigned char yytranslate[] = 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34 + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35 }; #if YYDEBUG @@ -372,72 +433,75 @@ static const unsigned short int yyprhs[] = 0, 0, 3, 5, 6, 9, 12, 15, 20, 23, 28, 33, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 67, 70, 74, 77, - 81, 84, 85, 88, 91, 94, 97, 100, 104, 109, - 114, 119, 125, 128, 131, 133, 137, 138, 141, 144, - 147, 150, 153, 158, 162, 165, 170, 171, 174, 178, - 180, 184, 185, 188, 191, 194, 198, 201, 203, 207, - 208, 211, 214, 217, 221, 225, 228, 231, 234, 235, - 238, 241, 244, 249, 253, 257, 258, 261, 263, 265, - 268, 271, 274, 276, 279, 280, 283, 285, 289, 293, - 297, 300, 304, 308, 310 + 81, 84, 85, 88, 91, 94, 97, 100, 103, 107, + 112, 117, 122, 128, 132, 133, 137, 138, 141, 144, + 147, 149, 153, 154, 157, 160, 163, 166, 169, 174, + 178, 181, 186, 187, 190, 194, 196, 200, 201, 204, + 207, 210, 214, 217, 219, 223, 224, 227, 230, 233, + 237, 241, 244, 247, 250, 251, 254, 257, 260, 265, + 269, 273, 274, 277, 279, 281, 284, 287, 290, 292, + 295, 296, 299, 301, 305, 309, 313, 316, 320, 324, + 326 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yysigned_char yyrhs[] = { - 36, 0, -1, 37, -1, -1, 37, 39, -1, 37, - 50, -1, 37, 61, -1, 37, 3, 71, 73, -1, - 37, 72, -1, 37, 25, 1, 30, -1, 37, 38, - 1, 30, -1, 37, 1, 30, -1, 16, -1, 19, + 37, 0, -1, 38, -1, -1, 38, 40, -1, 38, + 54, -1, 38, 65, -1, 38, 3, 75, 77, -1, + 38, 76, -1, 38, 26, 1, 31, -1, 38, 39, + 1, 31, -1, 38, 1, 31, -1, 16, -1, 19, -1, 20, -1, 22, -1, 18, -1, 23, -1, 21, - -1, 30, -1, 56, -1, 65, -1, 42, -1, 44, - -1, 63, -1, 25, 1, 30, -1, 1, 30, -1, - 10, 25, 30, -1, 41, 45, -1, 11, 25, 30, - -1, 43, 45, -1, -1, 45, 46, -1, 45, 69, - -1, 45, 67, -1, 45, 40, -1, 45, 30, -1, - 20, 70, 30, -1, 19, 71, 74, 30, -1, 21, - 75, 74, 30, -1, 22, 25, 74, 30, -1, 23, - 76, 76, 74, 30, -1, 7, 30, -1, 47, 51, - -1, 72, -1, 48, 53, 49, -1, -1, 51, 52, - -1, 51, 69, -1, 51, 67, -1, 51, 30, -1, - 51, 40, -1, 19, 71, 74, 30, -1, 20, 70, - 30, -1, 18, 30, -1, 21, 25, 74, 30, -1, - -1, 53, 39, -1, 14, 75, 73, -1, 72, -1, - 54, 57, 55, -1, -1, 57, 39, -1, 57, 61, - -1, 57, 50, -1, 4, 71, 30, -1, 58, 68, - -1, 72, -1, 59, 62, 60, -1, -1, 62, 39, - -1, 62, 61, -1, 62, 50, -1, 6, 71, 30, - -1, 9, 71, 30, -1, 64, 68, -1, 12, 30, - -1, 66, 13, -1, -1, 68, 69, -1, 68, 30, - -1, 68, 40, -1, 16, 24, 75, 30, -1, 16, - 75, 30, -1, 17, 75, 30, -1, -1, 71, 74, - -1, 25, -1, 26, -1, 5, 30, -1, 8, 30, - -1, 15, 30, -1, 30, -1, 73, 30, -1, -1, - 14, 75, -1, 76, -1, 76, 33, 76, -1, 76, - 27, 76, -1, 29, 75, 28, -1, 34, 75, -1, - 75, 31, 75, -1, 75, 32, 75, -1, 25, -1, - 26, -1 + -1, 31, -1, 60, -1, 69, -1, 43, -1, 45, + -1, 67, -1, 26, 1, 31, -1, 1, 31, -1, + 10, 26, 31, -1, 42, 46, -1, 11, 26, 31, + -1, 44, 46, -1, -1, 46, 47, -1, 46, 48, + -1, 46, 73, -1, 46, 71, -1, 46, 41, -1, + 46, 31, -1, 20, 74, 31, -1, 19, 75, 78, + 31, -1, 21, 79, 78, 31, -1, 22, 26, 78, + 31, -1, 23, 80, 80, 78, 31, -1, 24, 49, + 31, -1, -1, 49, 26, 50, -1, -1, 34, 75, + -1, 7, 31, -1, 51, 55, -1, 76, -1, 52, + 57, 53, -1, -1, 55, 56, -1, 55, 73, -1, + 55, 71, -1, 55, 31, -1, 55, 41, -1, 19, + 75, 78, 31, -1, 20, 74, 31, -1, 18, 31, + -1, 21, 26, 78, 31, -1, -1, 57, 40, -1, + 14, 79, 77, -1, 76, -1, 58, 61, 59, -1, + -1, 61, 40, -1, 61, 65, -1, 61, 54, -1, + 4, 75, 31, -1, 62, 72, -1, 76, -1, 63, + 66, 64, -1, -1, 66, 40, -1, 66, 65, -1, + 66, 54, -1, 6, 75, 31, -1, 9, 75, 31, + -1, 68, 72, -1, 12, 31, -1, 70, 13, -1, + -1, 72, 73, -1, 72, 31, -1, 72, 41, -1, + 16, 25, 79, 31, -1, 16, 79, 31, -1, 17, + 79, 31, -1, -1, 75, 78, -1, 26, -1, 27, + -1, 5, 31, -1, 8, 31, -1, 15, 31, -1, + 31, -1, 77, 31, -1, -1, 14, 79, -1, 80, + -1, 80, 34, 80, -1, 80, 28, 80, -1, 30, + 79, 29, -1, 35, 79, -1, 79, 32, 79, -1, + 79, 33, 79, -1, 26, -1, 27, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const unsigned short int yyrline[] = { - 0, 103, 103, 105, 107, 108, 109, 110, 111, 112, - 113, 117, 121, 121, 121, 121, 121, 121, 121, 125, - 126, 127, 128, 129, 130, 134, 135, 141, 149, 155, - 163, 173, 175, 176, 177, 178, 179, 182, 190, 196, - 206, 212, 220, 229, 234, 242, 245, 247, 248, 249, - 250, 251, 254, 260, 271, 277, 287, 289, 294, 302, - 310, 313, 315, 316, 317, 322, 329, 334, 342, 345, - 347, 348, 349, 352, 360, 367, 374, 380, 387, 389, - 390, 391, 394, 399, 404, 412, 414, 419, 420, 423, - 424, 425, 429, 430, 433, 434, 437, 438, 439, 440, - 441, 442, 443, 446, 447 + 0, 105, 105, 107, 109, 110, 111, 112, 113, 114, + 115, 119, 123, 123, 123, 123, 123, 123, 123, 127, + 128, 129, 130, 131, 132, 136, 137, 143, 151, 157, + 165, 175, 177, 178, 179, 180, 181, 182, 185, 193, + 199, 209, 215, 221, 224, 226, 237, 238, 243, 252, + 257, 265, 268, 270, 271, 272, 273, 274, 277, 283, + 294, 300, 310, 312, 317, 325, 333, 336, 338, 339, + 340, 345, 352, 357, 365, 368, 370, 371, 372, 375, + 383, 390, 397, 403, 410, 412, 413, 414, 417, 422, + 427, 435, 437, 442, 443, 446, 447, 448, 452, 453, + 456, 457, 460, 461, 462, 463, 464, 465, 466, 469, + 470 }; #endif -#if YYDEBUG || YYERROR_VERBOSE -/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { @@ -445,17 +509,18 @@ static const char *const yytname[] = "T_SOURCE", "T_CHOICE", "T_ENDCHOICE", "T_COMMENT", "T_CONFIG", "T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF", "T_DEPENDS", "T_REQUIRES", "T_OPTIONAL", "T_PROMPT", "T_TYPE", "T_DEFAULT", - "T_SELECT", "T_RANGE", "T_ON", "T_WORD", "T_WORD_QUOTE", "T_UNEQUAL", - "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_EOL", "T_OR", "T_AND", "T_EQUAL", - "T_NOT", "$accept", "input", "stmt_list", "option_name", "common_stmt", - "option_error", "config_entry_start", "config_stmt", + "T_SELECT", "T_RANGE", "T_OPTION", "T_ON", "T_WORD", "T_WORD_QUOTE", + "T_UNEQUAL", "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_EOL", "T_OR", "T_AND", + "T_EQUAL", "T_NOT", "$accept", "input", "stmt_list", "option_name", + "common_stmt", "option_error", "config_entry_start", "config_stmt", "menuconfig_entry_start", "menuconfig_stmt", "config_option_list", - "config_option", "choice", "choice_entry", "choice_end", "choice_stmt", - "choice_option_list", "choice_option", "choice_block", "if_entry", - "if_end", "if_stmt", "if_block", "menu", "menu_entry", "menu_end", - "menu_stmt", "menu_block", "source_stmt", "comment", "comment_stmt", - "help_start", "help", "depends_list", "depends", "prompt_stmt_opt", - "prompt", "end", "nl", "if_expr", "expr", "symbol", 0 + "config_option", "symbol_option", "symbol_option_list", + "symbol_option_arg", "choice", "choice_entry", "choice_end", + "choice_stmt", "choice_option_list", "choice_option", "choice_block", + "if_entry", "if_end", "if_stmt", "if_block", "menu", "menu_entry", + "menu_end", "menu_stmt", "menu_block", "source_stmt", "comment", + "comment_stmt", "help_start", "help", "depends_list", "depends", + "prompt_stmt_opt", "prompt", "end", "nl", "if_expr", "expr", "symbol", 0 }; #endif @@ -467,24 +532,25 @@ static const unsigned short int yytoknum[] = 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289 + 285, 286, 287, 288, 289, 290 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const unsigned char yyr1[] = { - 0, 35, 36, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 38, 38, 38, 38, 38, 38, 38, 39, - 39, 39, 39, 39, 39, 40, 40, 41, 42, 43, - 44, 45, 45, 45, 45, 45, 45, 46, 46, 46, - 46, 46, 47, 48, 49, 50, 51, 51, 51, 51, - 51, 51, 52, 52, 52, 52, 53, 53, 54, 55, - 56, 57, 57, 57, 57, 58, 59, 60, 61, 62, - 62, 62, 62, 63, 64, 65, 66, 67, 68, 68, - 68, 68, 69, 69, 69, 70, 70, 71, 71, 72, - 72, 72, 73, 73, 74, 74, 75, 75, 75, 75, - 75, 75, 75, 76, 76 + 0, 36, 37, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 39, 39, 39, 39, 39, 39, 39, 40, + 40, 40, 40, 40, 40, 41, 41, 42, 43, 44, + 45, 46, 46, 46, 46, 46, 46, 46, 47, 47, + 47, 47, 47, 48, 49, 49, 50, 50, 51, 52, + 53, 54, 55, 55, 55, 55, 55, 55, 56, 56, + 56, 56, 57, 57, 58, 59, 60, 61, 61, 61, + 61, 62, 63, 64, 65, 66, 66, 66, 66, 67, + 68, 69, 70, 71, 72, 72, 72, 72, 73, 73, + 73, 74, 74, 75, 75, 76, 76, 76, 77, 77, + 78, 78, 79, 79, 79, 79, 79, 79, 79, 80, + 80 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -493,14 +559,15 @@ static const unsigned char yyr2[] = 0, 2, 1, 0, 2, 2, 2, 4, 2, 4, 4, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 3, 2, 3, - 2, 0, 2, 2, 2, 2, 2, 3, 4, 4, - 4, 5, 2, 2, 1, 3, 0, 2, 2, 2, - 2, 2, 4, 3, 2, 4, 0, 2, 3, 1, - 3, 0, 2, 2, 2, 3, 2, 1, 3, 0, - 2, 2, 2, 3, 3, 2, 2, 2, 0, 2, - 2, 2, 4, 3, 3, 0, 2, 1, 1, 2, - 2, 2, 1, 2, 0, 2, 1, 3, 3, 3, - 2, 3, 3, 1, 1 + 2, 0, 2, 2, 2, 2, 2, 2, 3, 4, + 4, 4, 5, 3, 0, 3, 0, 2, 2, 2, + 1, 3, 0, 2, 2, 2, 2, 2, 4, 3, + 2, 4, 0, 2, 3, 1, 3, 0, 2, 2, + 2, 3, 2, 1, 3, 0, 2, 2, 2, 3, + 3, 2, 2, 2, 0, 2, 2, 2, 4, 3, + 3, 0, 2, 1, 1, 2, 2, 2, 1, 2, + 0, 2, 1, 3, 3, 3, 2, 3, 3, 1, + 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -511,175 +578,164 @@ static const unsigned char yydefact[] = 3, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 16, 13, 14, 18, 15, 17, 0, 19, 0, 4, 31, 22, 31, - 23, 46, 56, 5, 61, 20, 78, 69, 6, 24, - 78, 21, 8, 11, 87, 88, 0, 0, 89, 0, - 42, 90, 0, 0, 0, 103, 104, 0, 0, 0, - 96, 91, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 92, 7, 65, 73, 74, 27, 29, 0, - 100, 0, 0, 58, 0, 0, 9, 10, 0, 0, - 0, 0, 0, 85, 0, 0, 0, 0, 36, 35, - 32, 0, 34, 33, 0, 0, 85, 0, 50, 51, - 47, 49, 48, 57, 45, 44, 62, 64, 60, 63, - 59, 80, 81, 79, 70, 72, 68, 71, 67, 93, - 99, 101, 102, 98, 97, 26, 76, 0, 0, 0, - 94, 0, 94, 94, 94, 0, 0, 77, 54, 94, - 0, 94, 0, 83, 84, 0, 0, 37, 86, 0, - 0, 94, 25, 0, 53, 0, 82, 95, 38, 39, - 40, 0, 52, 55, 41 + 23, 52, 62, 5, 67, 20, 84, 75, 6, 24, + 84, 21, 8, 11, 93, 94, 0, 0, 95, 0, + 48, 96, 0, 0, 0, 109, 110, 0, 0, 0, + 102, 97, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 98, 7, 71, 79, 80, 27, 29, 0, + 106, 0, 0, 64, 0, 0, 9, 10, 0, 0, + 0, 0, 0, 91, 0, 0, 0, 44, 0, 37, + 36, 32, 33, 0, 35, 34, 0, 0, 91, 0, + 56, 57, 53, 55, 54, 63, 51, 50, 68, 70, + 66, 69, 65, 86, 87, 85, 76, 78, 74, 77, + 73, 99, 105, 107, 108, 104, 103, 26, 82, 0, + 0, 0, 100, 0, 100, 100, 100, 0, 0, 0, + 83, 60, 100, 0, 100, 0, 89, 90, 0, 0, + 38, 92, 0, 0, 100, 46, 43, 25, 0, 59, + 0, 88, 101, 39, 40, 41, 0, 0, 45, 58, + 61, 42, 47 }; /* YYDEFGOTO[NTERM-NUM]. */ static const short int yydefgoto[] = { - -1, 1, 2, 25, 26, 99, 27, 28, 29, 30, - 64, 100, 31, 32, 114, 33, 66, 110, 67, 34, - 118, 35, 68, 36, 37, 126, 38, 70, 39, 40, - 41, 101, 102, 69, 103, 141, 142, 42, 73, 156, - 59, 60 + -1, 1, 2, 25, 26, 100, 27, 28, 29, 30, + 64, 101, 102, 148, 178, 31, 32, 116, 33, 66, + 112, 67, 34, 120, 35, 68, 36, 37, 128, 38, + 70, 39, 40, 41, 103, 104, 69, 105, 143, 144, + 42, 73, 159, 59, 60 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -78 +#define YYPACT_NINF -135 static const short int yypact[] = { - -78, 2, 159, -78, -21, 0, 0, -12, 0, 1, - 4, 0, 27, 38, 60, 58, -78, -78, -78, -78, - -78, -78, -78, 100, -78, 104, -78, -78, -78, -78, - -78, -78, -78, -78, -78, -78, -78, -78, -78, -78, - -78, -78, -78, -78, -78, -78, 86, 113, -78, 114, - -78, -78, 125, 127, 128, -78, -78, 60, 60, 210, - 65, -78, 141, 142, 39, 103, 182, 200, 6, 66, - 6, 131, -78, 146, -78, -78, -78, -78, -78, 196, - -78, 60, 60, 146, 40, 40, -78, -78, 155, 156, - -2, 60, 0, 0, 60, 105, 40, 194, -78, -78, - -78, 206, -78, -78, 183, 0, 0, 195, -78, -78, - -78, -78, -78, -78, -78, -78, -78, -78, -78, -78, - -78, -78, -78, -78, -78, -78, -78, -78, -78, -78, - -78, 197, -78, -78, -78, -78, -78, 60, 213, 216, - 212, 203, 212, 190, 212, 40, 208, -78, -78, 212, - 222, 212, 219, -78, -78, 60, 223, -78, -78, 224, - 225, 212, -78, 226, -78, 227, -78, 47, -78, -78, - -78, 228, -78, -78, -78 + -135, 2, 170, -135, -14, 56, 56, -8, 56, 24, + 67, 56, 7, 14, 62, 97, -135, -135, -135, -135, + -135, -135, -135, 156, -135, 166, -135, -135, -135, -135, + -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, + -135, -135, -135, -135, -135, -135, 138, 151, -135, 152, + -135, -135, 163, 167, 176, -135, -135, 62, 62, 185, + -19, -135, 188, 190, 42, 103, 194, 85, 70, 222, + 70, 132, -135, 191, -135, -135, -135, -135, -135, 127, + -135, 62, 62, 191, 104, 104, -135, -135, 193, 203, + 9, 62, 56, 56, 62, 161, 104, -135, 196, -135, + -135, -135, -135, 233, -135, -135, 204, 56, 56, 221, + -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, + -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, + -135, -135, -135, 219, -135, -135, -135, -135, -135, 62, + 209, 212, 240, 224, 240, -1, 240, 104, 41, 225, + -135, -135, 240, 226, 240, 218, -135, -135, 62, 227, + -135, -135, 228, 229, 240, 230, -135, -135, 231, -135, + 232, -135, 112, -135, -135, -135, 234, 56, -135, -135, + -135, -135, -135 }; /* YYPGOTO[NTERM-NUM]. */ static const short int yypgoto[] = { - -78, -78, -78, -78, 164, -36, -78, -78, -78, -78, - 230, -78, -78, -78, -78, 29, -78, -78, -78, -78, - -78, -78, -78, -78, -78, -78, 59, -78, -78, -78, - -78, -78, 198, 220, 24, 157, -5, 169, 202, 74, - -53, -77 + -135, -135, -135, -135, 94, -45, -135, -135, -135, -135, + 237, -135, -135, -135, -135, -135, -135, -135, -54, -135, + -135, -135, -135, -135, -135, -135, -135, -135, -135, 1, + -135, -135, -135, -135, -135, 195, 235, -44, 159, -5, + 98, 210, -134, -53, -77 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -76 +#define YYTABLE_NINF -82 static const short int yytable[] = { - 46, 47, 3, 49, 79, 80, 52, 133, 134, 43, - 6, 7, 8, 9, 10, 11, 12, 13, 48, 145, - 14, 15, 137, 55, 56, 44, 45, 57, 131, 132, - 109, 50, 58, 122, 51, 122, 24, 138, 139, -28, - 88, 143, -28, -28, -28, -28, -28, -28, -28, -28, - -28, 89, 53, -28, -28, 90, 91, -28, 92, 93, - 94, 95, 96, 54, 97, 55, 56, 88, 161, 98, - -66, -66, -66, -66, -66, -66, -66, -66, 81, 82, - -66, -66, 90, 91, 152, 55, 56, 140, 61, 57, - 112, 97, 84, 123, 58, 123, 121, 117, 85, 125, - 149, 62, 167, -30, 88, 63, -30, -30, -30, -30, - -30, -30, -30, -30, -30, 89, 72, -30, -30, 90, - 91, -30, 92, 93, 94, 95, 96, 119, 97, 127, - 144, -75, 88, 98, -75, -75, -75, -75, -75, -75, - -75, -75, -75, 74, 75, -75, -75, 90, 91, -75, - -75, -75, -75, -75, -75, 76, 97, 77, 78, -2, - 4, 121, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 86, 87, 14, 15, 16, 129, 17, 18, 19, - 20, 21, 22, 88, 23, 135, 136, -43, -43, 24, - -43, -43, -43, -43, 89, 146, -43, -43, 90, 91, - 104, 105, 106, 107, 155, 7, 8, 97, 10, 11, - 12, 13, 108, 148, 14, 15, 158, 159, 160, 147, - 151, 81, 82, 163, 130, 165, 155, 81, 82, 82, - 24, 113, 116, 157, 124, 171, 115, 120, 162, 128, - 72, 81, 82, 153, 81, 82, 154, 81, 82, 166, - 81, 82, 164, 168, 169, 170, 172, 173, 174, 65, - 71, 83, 0, 150, 111 + 46, 47, 3, 49, 79, 80, 52, 135, 136, 84, + 161, 162, 163, 158, 119, 85, 127, 43, 168, 147, + 170, 111, 114, 48, 124, 125, 124, 125, 133, 134, + 176, 81, 82, 53, 139, 55, 56, 140, 141, 57, + 54, 145, -28, 88, 58, -28, -28, -28, -28, -28, + -28, -28, -28, -28, 89, 50, -28, -28, 90, 91, + -28, 92, 93, 94, 95, 96, 97, 165, 98, 121, + 164, 129, 166, 99, 6, 7, 8, 9, 10, 11, + 12, 13, 44, 45, 14, 15, 155, 142, 55, 56, + 7, 8, 57, 10, 11, 12, 13, 58, 51, 14, + 15, 24, 152, -30, 88, 172, -30, -30, -30, -30, + -30, -30, -30, -30, -30, 89, 24, -30, -30, 90, + 91, -30, 92, 93, 94, 95, 96, 97, 61, 98, + 55, 56, -81, 88, 99, -81, -81, -81, -81, -81, + -81, -81, -81, -81, 81, 82, -81, -81, 90, 91, + -81, -81, -81, -81, -81, -81, 132, 62, 98, 81, + 82, 115, 118, 123, 126, 117, 122, 63, 130, 72, + -2, 4, 182, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 74, 75, 14, 15, 16, 146, 17, 18, + 19, 20, 21, 22, 76, 88, 23, 149, 77, -49, + -49, 24, -49, -49, -49, -49, 89, 78, -49, -49, + 90, 91, 106, 107, 108, 109, 72, 81, 82, 86, + 98, 87, 131, 88, 137, 110, -72, -72, -72, -72, + -72, -72, -72, -72, 138, 151, -72, -72, 90, 91, + 156, 81, 82, 157, 81, 82, 150, 154, 98, 171, + 81, 82, 82, 123, 158, 160, 167, 169, 173, 174, + 175, 113, 179, 180, 177, 181, 65, 153, 0, 83, + 0, 0, 0, 0, 0, 71 }; static const short int yycheck[] = { - 5, 6, 0, 8, 57, 58, 11, 84, 85, 30, - 4, 5, 6, 7, 8, 9, 10, 11, 30, 96, - 14, 15, 24, 25, 26, 25, 26, 29, 81, 82, - 66, 30, 34, 69, 30, 71, 30, 90, 91, 0, - 1, 94, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 25, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 25, 25, 25, 26, 1, 145, 30, - 4, 5, 6, 7, 8, 9, 10, 11, 31, 32, - 14, 15, 16, 17, 137, 25, 26, 92, 30, 29, - 66, 25, 27, 69, 34, 71, 30, 68, 33, 70, - 105, 1, 155, 0, 1, 1, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 30, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 68, 25, 70, - 25, 0, 1, 30, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 30, 30, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 30, 25, 30, 30, 0, - 1, 30, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 30, 30, 14, 15, 16, 30, 18, 19, 20, - 21, 22, 23, 1, 25, 30, 30, 5, 6, 30, - 8, 9, 10, 11, 12, 1, 14, 15, 16, 17, - 18, 19, 20, 21, 14, 5, 6, 25, 8, 9, - 10, 11, 30, 30, 14, 15, 142, 143, 144, 13, - 25, 31, 32, 149, 28, 151, 14, 31, 32, 32, - 30, 67, 68, 30, 70, 161, 67, 68, 30, 70, - 30, 31, 32, 30, 31, 32, 30, 31, 32, 30, - 31, 32, 30, 30, 30, 30, 30, 30, 30, 29, - 40, 59, -1, 106, 66 + 5, 6, 0, 8, 57, 58, 11, 84, 85, 28, + 144, 145, 146, 14, 68, 34, 70, 31, 152, 96, + 154, 66, 66, 31, 69, 69, 71, 71, 81, 82, + 164, 32, 33, 26, 25, 26, 27, 90, 91, 30, + 26, 94, 0, 1, 35, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 31, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 26, 26, 68, + 147, 70, 31, 31, 4, 5, 6, 7, 8, 9, + 10, 11, 26, 27, 14, 15, 139, 92, 26, 27, + 5, 6, 30, 8, 9, 10, 11, 35, 31, 14, + 15, 31, 107, 0, 1, 158, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 31, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 31, 26, + 26, 27, 0, 1, 31, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 32, 33, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 29, 1, 26, 32, + 33, 67, 68, 31, 70, 67, 68, 1, 70, 31, + 0, 1, 177, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 31, 31, 14, 15, 16, 26, 18, 19, + 20, 21, 22, 23, 31, 1, 26, 1, 31, 5, + 6, 31, 8, 9, 10, 11, 12, 31, 14, 15, + 16, 17, 18, 19, 20, 21, 31, 32, 33, 31, + 26, 31, 31, 1, 31, 31, 4, 5, 6, 7, + 8, 9, 10, 11, 31, 31, 14, 15, 16, 17, + 31, 32, 33, 31, 32, 33, 13, 26, 26, 31, + 32, 33, 33, 31, 14, 31, 31, 31, 31, 31, + 31, 66, 31, 31, 34, 31, 29, 108, -1, 59, + -1, -1, -1, -1, -1, 40 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const unsigned char yystos[] = { - 0, 36, 37, 0, 1, 3, 4, 5, 6, 7, + 0, 37, 38, 0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 18, 19, 20, - 21, 22, 23, 25, 30, 38, 39, 41, 42, 43, - 44, 47, 48, 50, 54, 56, 58, 59, 61, 63, - 64, 65, 72, 30, 25, 26, 71, 71, 30, 71, - 30, 30, 71, 25, 25, 25, 26, 29, 34, 75, - 76, 30, 1, 1, 45, 45, 51, 53, 57, 68, - 62, 68, 30, 73, 30, 30, 30, 30, 30, 75, - 75, 31, 32, 73, 27, 33, 30, 30, 1, 12, - 16, 17, 19, 20, 21, 22, 23, 25, 30, 40, - 46, 66, 67, 69, 18, 19, 20, 21, 30, 40, - 52, 67, 69, 39, 49, 72, 39, 50, 55, 61, - 72, 30, 40, 69, 39, 50, 60, 61, 72, 30, - 28, 75, 75, 76, 76, 30, 30, 24, 75, 75, - 71, 70, 71, 75, 25, 76, 1, 13, 30, 71, - 70, 25, 75, 30, 30, 14, 74, 30, 74, 74, - 74, 76, 30, 74, 30, 74, 30, 75, 30, 30, - 30, 74, 30, 30, 30 + 21, 22, 23, 26, 31, 39, 40, 42, 43, 44, + 45, 51, 52, 54, 58, 60, 62, 63, 65, 67, + 68, 69, 76, 31, 26, 27, 75, 75, 31, 75, + 31, 31, 75, 26, 26, 26, 27, 30, 35, 79, + 80, 31, 1, 1, 46, 46, 55, 57, 61, 72, + 66, 72, 31, 77, 31, 31, 31, 31, 31, 79, + 79, 32, 33, 77, 28, 34, 31, 31, 1, 12, + 16, 17, 19, 20, 21, 22, 23, 24, 26, 31, + 41, 47, 48, 70, 71, 73, 18, 19, 20, 21, + 31, 41, 56, 71, 73, 40, 53, 76, 40, 54, + 59, 65, 76, 31, 41, 73, 40, 54, 64, 65, + 76, 31, 29, 79, 79, 80, 80, 31, 31, 25, + 79, 79, 75, 74, 75, 79, 26, 80, 49, 1, + 13, 31, 75, 74, 26, 79, 31, 31, 14, 78, + 31, 78, 78, 78, 80, 26, 31, 31, 78, 31, + 78, 31, 79, 31, 31, 31, 78, 34, 50, 31, + 31, 31, 75 }; -#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) -# define YYSIZE_T __SIZE_TYPE__ -#endif -#if ! defined (YYSIZE_T) && defined (size_t) -# define YYSIZE_T size_t -#endif -#if ! defined (YYSIZE_T) -# if defined (__STDC__) || defined (__cplusplus) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# endif -#endif -#if ! defined (YYSIZE_T) -# define YYSIZE_T unsigned int -#endif - #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) @@ -709,8 +765,8 @@ do \ goto yybackup; \ } \ else \ - { \ - yyerror ("syntax error: cannot back up");\ + { \ + yyerror (YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (0) @@ -789,7 +845,7 @@ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ - yysymprint (stderr, \ + yysymprint (stderr, \ Type, Value); \ YYFPRINTF (stderr, "\n"); \ } \ @@ -837,13 +893,13 @@ yy_reduce_print (yyrule) #endif { int yyi; - unsigned int yylno = yyrline[yyrule]; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ", + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu), ", yyrule - 1, yylno); /* Print the symbols being reduced, and their result. */ for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) - YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]); - YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]); + YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]); + YYFPRINTF (stderr, "-> %s\n", yytname[yyr1[yyrule]]); } # define YY_REDUCE_PRINT(Rule) \ @@ -872,7 +928,7 @@ int yydebug; if the built-in stack extension method is used). Do not make this value too large; the results are undefined if - SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH @@ -896,7 +952,7 @@ yystrlen (yystr) const char *yystr; # endif { - register const char *yys = yystr; + const char *yys = yystr; while (*yys++ != '\0') continue; @@ -921,8 +977,8 @@ yystpcpy (yydest, yysrc) const char *yysrc; # endif { - register char *yyd = yydest; - register const char *yys = yysrc; + char *yyd = yydest; + const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; @@ -932,7 +988,55 @@ yystpcpy (yydest, yysrc) # endif # endif -#endif /* !YYERROR_VERBOSE */ +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + size_t yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +#endif /* YYERROR_VERBOSE */ @@ -998,7 +1102,7 @@ yydestruct (yymsg, yytype, yyvaluep) switch (yytype) { - case 48: /* choice_entry */ + case 52: /* "choice_entry" */ { fprintf(stderr, "%s:%d: missing end statement for this entry\n", @@ -1008,7 +1112,7 @@ yydestruct (yymsg, yytype, yyvaluep) }; break; - case 54: /* if_entry */ + case 58: /* "if_entry" */ { fprintf(stderr, "%s:%d: missing end statement for this entry\n", @@ -1018,7 +1122,7 @@ yydestruct (yymsg, yytype, yyvaluep) }; break; - case 59: /* menu_entry */ + case 63: /* "menu_entry" */ { fprintf(stderr, "%s:%d: missing end statement for this entry\n", @@ -1082,13 +1186,13 @@ yyparse (void) #else int yyparse () - + ; #endif #endif { - register int yystate; - register int yyn; + int yystate; + int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; @@ -1106,12 +1210,12 @@ yyparse () /* The state stack. */ short int yyssa[YYINITDEPTH]; short int *yyss = yyssa; - register short int *yyssp; + short int *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; - register YYSTYPE *yyvsp; + YYSTYPE *yyvsp; @@ -1143,9 +1247,6 @@ yyparse () yyssp = yyss; yyvsp = yyvs; - - yyvsp[0] = yylval; - goto yysetstate; /*------------------------------------------------------------. @@ -1178,7 +1279,7 @@ yyparse () data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ - yyoverflow ("parser stack overflow", + yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), @@ -1189,11 +1290,11 @@ yyparse () } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE - goto yyoverflowlab; + goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) - goto yyoverflowlab; + goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; @@ -1203,7 +1304,7 @@ yyparse () union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) - goto yyoverflowlab; + goto yyexhaustedlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); @@ -1403,7 +1504,7 @@ yyreduce: ;} break; - case 37: + case 38: { menu_set_type((yyvsp[-2].id)->stype); @@ -1413,7 +1514,7 @@ yyreduce: ;} break; - case 38: + case 39: { menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr)); @@ -1421,7 +1522,7 @@ yyreduce: ;} break; - case 39: + case 40: { menu_add_expr(P_DEFAULT, (yyvsp[-2].expr), (yyvsp[-1].expr)); @@ -1433,7 +1534,7 @@ yyreduce: ;} break; - case 40: + case 41: { menu_add_symbol(P_SELECT, sym_lookup((yyvsp[-2].string), 0), (yyvsp[-1].expr)); @@ -1441,7 +1542,7 @@ yyreduce: ;} break; - case 41: + case 42: { menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,(yyvsp[-3].symbol), (yyvsp[-2].symbol)), (yyvsp[-1].expr)); @@ -1449,7 +1550,29 @@ yyreduce: ;} break; - case 42: + case 45: + + { + struct kconf_id *id = kconf_id_lookup((yyvsp[-1].string), strlen((yyvsp[-1].string))); + if (id && id->flags & TF_OPTION) + menu_add_option(id->token, (yyvsp[0].string)); + else + zconfprint("warning: ignoring unknown option %s", (yyvsp[-1].string)); + free((yyvsp[-1].string)); +;} + break; + + case 46: + + { (yyval.string) = NULL; ;} + break; + + case 47: + + { (yyval.string) = (yyvsp[0].string); ;} + break; + + case 48: { struct symbol *sym = sym_lookup(NULL, 0); @@ -1460,14 +1583,14 @@ yyreduce: ;} break; - case 43: + case 49: { (yyval.menu) = menu_add_menu(); ;} break; - case 44: + case 50: { if (zconf_endtoken((yyvsp[0].id), T_CHOICE, T_ENDCHOICE)) { @@ -1477,7 +1600,7 @@ yyreduce: ;} break; - case 52: + case 58: { menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr)); @@ -1485,7 +1608,7 @@ yyreduce: ;} break; - case 53: + case 59: { if ((yyvsp[-2].id)->stype == S_BOOLEAN || (yyvsp[-2].id)->stype == S_TRISTATE) { @@ -1498,7 +1621,7 @@ yyreduce: ;} break; - case 54: + case 60: { current_entry->sym->flags |= SYMBOL_OPTIONAL; @@ -1506,7 +1629,7 @@ yyreduce: ;} break; - case 55: + case 61: { if ((yyvsp[-3].id)->stype == S_UNKNOWN) { @@ -1518,7 +1641,7 @@ yyreduce: ;} break; - case 58: + case 64: { printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno()); @@ -1528,7 +1651,7 @@ yyreduce: ;} break; - case 59: + case 65: { if (zconf_endtoken((yyvsp[0].id), T_IF, T_ENDIF)) { @@ -1538,7 +1661,7 @@ yyreduce: ;} break; - case 65: + case 71: { menu_add_entry(NULL); @@ -1547,14 +1670,14 @@ yyreduce: ;} break; - case 66: + case 72: { (yyval.menu) = menu_add_menu(); ;} break; - case 67: + case 73: { if (zconf_endtoken((yyvsp[0].id), T_MENU, T_ENDMENU)) { @@ -1564,7 +1687,7 @@ yyreduce: ;} break; - case 73: + case 79: { printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string)); @@ -1572,7 +1695,7 @@ yyreduce: ;} break; - case 74: + case 80: { menu_add_entry(NULL); @@ -1581,14 +1704,14 @@ yyreduce: ;} break; - case 75: + case 81: { menu_end_entry(); ;} break; - case 76: + case 82: { printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno()); @@ -1596,14 +1719,14 @@ yyreduce: ;} break; - case 77: + case 83: { current_entry->sym->help = (yyvsp[0].string); ;} break; - case 82: + case 88: { menu_add_dep((yyvsp[-1].expr)); @@ -1611,7 +1734,7 @@ yyreduce: ;} break; - case 83: + case 89: { menu_add_dep((yyvsp[-1].expr)); @@ -1619,7 +1742,7 @@ yyreduce: ;} break; - case 84: + case 90: { menu_add_dep((yyvsp[-1].expr)); @@ -1627,87 +1750,88 @@ yyreduce: ;} break; - case 86: + case 92: { menu_add_prompt(P_PROMPT, (yyvsp[-1].string), (yyvsp[0].expr)); ;} break; - case 89: + case 95: { (yyval.id) = (yyvsp[-1].id); ;} break; - case 90: + case 96: { (yyval.id) = (yyvsp[-1].id); ;} break; - case 91: + case 97: { (yyval.id) = (yyvsp[-1].id); ;} break; - case 94: + case 100: { (yyval.expr) = NULL; ;} break; - case 95: + case 101: { (yyval.expr) = (yyvsp[0].expr); ;} break; - case 96: + case 102: { (yyval.expr) = expr_alloc_symbol((yyvsp[0].symbol)); ;} break; - case 97: + case 103: { (yyval.expr) = expr_alloc_comp(E_EQUAL, (yyvsp[-2].symbol), (yyvsp[0].symbol)); ;} break; - case 98: + case 104: { (yyval.expr) = expr_alloc_comp(E_UNEQUAL, (yyvsp[-2].symbol), (yyvsp[0].symbol)); ;} break; - case 99: + case 105: { (yyval.expr) = (yyvsp[-1].expr); ;} break; - case 100: + case 106: { (yyval.expr) = expr_alloc_one(E_NOT, (yyvsp[0].expr)); ;} break; - case 101: + case 107: { (yyval.expr) = expr_alloc_two(E_OR, (yyvsp[-2].expr), (yyvsp[0].expr)); ;} break; - case 102: + case 108: { (yyval.expr) = expr_alloc_two(E_AND, (yyvsp[-2].expr), (yyvsp[0].expr)); ;} break; - case 103: + case 109: { (yyval.symbol) = sym_lookup((yyvsp[0].string), 0); free((yyvsp[0].string)); ;} break; - case 104: + case 110: { (yyval.symbol) = sym_lookup((yyvsp[0].string), 1); free((yyvsp[0].string)); ;} break; + default: break; } -/* Line 1037 of yacc.c. */ +/* Line 1126 of yacc.c. */ yyvsp -= yylen; @@ -1747,12 +1871,36 @@ yyerrlab: if (YYPACT_NINF < yyn && yyn < YYLAST) { - YYSIZE_T yysize = 0; int yytype = YYTRANSLATE (yychar); - const char* yyprefix; - char *yymsg; + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + int yysize_overflow = 0; + char *yymsg = 0; +# define YYERROR_VERBOSE_ARGS_MAXIMUM 5 + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; int yyx; +#if 0 + /* This is so xgettext sees the translatable formats that are + constructed on the fly. */ + YY_("syntax error, unexpected %s"); + YY_("syntax error, unexpected %s, expecting %s"); + YY_("syntax error, unexpected %s, expecting %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +#endif + char *yyfmt; + char const *yyf; + static char const yyunexpected[] = "syntax error, unexpected %s"; + static char const yyexpecting[] = ", expecting %s"; + static char const yyor[] = " or %s"; + char yyformat[sizeof yyunexpected + + sizeof yyexpecting - 1 + + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) + * (sizeof yyor - 1))]; + char const *yyprefix = yyexpecting; + /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; @@ -1760,48 +1908,68 @@ yyerrlab: /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yycount = 0; + int yycount = 1; + + yyarg[0] = yytname[yytype]; + yyfmt = yystpcpy (yyformat, yyunexpected); - yyprefix = ", expecting "; for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { - yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]); - yycount += 1; - if (yycount == 5) + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { - yysize = 0; + yycount = 1; + yysize = yysize0; + yyformat[sizeof yyunexpected - 1] = '\0'; break; } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + yysize_overflow |= yysize1 < yysize; + yysize = yysize1; + yyfmt = yystpcpy (yyfmt, yyprefix); + yyprefix = yyor; } - yysize += (sizeof ("syntax error, unexpected ") - + yystrlen (yytname[yytype])); - yymsg = (char *) YYSTACK_ALLOC (yysize); - if (yymsg != 0) - { - char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); - yyp = yystpcpy (yyp, yytname[yytype]); - if (yycount < 5) + yyf = YY_(yyformat); + yysize1 = yysize + yystrlen (yyf); + yysize_overflow |= yysize1 < yysize; + yysize = yysize1; + + if (!yysize_overflow && yysize <= YYSTACK_ALLOC_MAXIMUM) + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg) + { + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + char *yyp = yymsg; + int yyi = 0; + while ((*yyp = *yyf)) { - yyprefix = ", expecting "; - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) - { - yyp = yystpcpy (yyp, yyprefix); - yyp = yystpcpy (yyp, yytname[yyx]); - yyprefix = " or "; - } + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyf += 2; + } + else + { + yyp++; + yyf++; + } } yyerror (yymsg); YYSTACK_FREE (yymsg); } else - yyerror ("syntax error; also virtual memory exhausted"); + { + yyerror (YY_("syntax error")); + goto yyexhaustedlab; + } } else #endif /* YYERROR_VERBOSE */ - yyerror ("syntax error"); + yyerror (YY_("syntax error")); } @@ -1813,18 +1981,9 @@ yyerrlab: if (yychar <= YYEOF) { - /* If at end of input, pop the error token, - then the rest of the stack, then return failure. */ + /* Return failure if at end of input. */ if (yychar == YYEOF) - for (;;) - { - - YYPOPSTACK; - if (yyssp == yyss) - YYABORT; - yydestruct ("Error: popping", - yystos[*yyssp], yyvsp); - } + YYABORT; } else { @@ -1843,12 +2002,11 @@ yyerrlab: `---------------------------------------------------*/ yyerrorlab: -#ifdef __GNUC__ - /* Pacify GCC when the user code never invokes YYERROR and the label - yyerrorlab therefore never appears in user code. */ + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ if (0) goto yyerrorlab; -#endif yyvsp -= yylen; yyssp -= yylen; @@ -1911,23 +2069,29 @@ yyacceptlab: | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: - yydestruct ("Error: discarding lookahead", - yytoken, &yylval); - yychar = YYEMPTY; yyresult = 1; goto yyreturn; #ifndef yyoverflow -/*----------------------------------------------. -| yyoverflowlab -- parser overflow comes here. | -`----------------------------------------------*/ -yyoverflowlab: - yyerror ("parser stack overflow"); +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: + if (yychar != YYEOF && yychar != YYEMPTY) + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp); + YYPOPSTACK; + } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); @@ -1948,7 +2112,9 @@ void conf_parse(const char *name) sym_init(); menu_init(); - modules_sym = sym_lookup("MODULES", 0); + modules_sym = sym_lookup(NULL, 0); + modules_sym->type = S_BOOLEAN; + modules_sym->flags |= SYMBOL_AUTO; rootmenu.prompt = menu_add_prompt(P_MENU, "Linux Kernel Configuration", NULL); #if YYDEBUG @@ -1958,6 +2124,12 @@ void conf_parse(const char *name) zconfparse(); if (zconfnerrs) exit(1); + if (!modules_sym->prop) { + struct property *prop; + + prop = prop_alloc(P_DEFAULT, modules_sym); + prop->expr = expr_alloc_symbol(sym_lookup("MODULES", 0)); + } menu_finalize(&rootmenu); for_all_symbols(i, sym) { sym_check_deps(sym); diff --git a/scripts/kconfig/zconf.y b/scripts/kconfig/zconf.y index 1f61fba6a..ab44feb3c 100644 --- a/scripts/kconfig/zconf.y +++ b/scripts/kconfig/zconf.y @@ -71,6 +71,7 @@ static struct menu *current_menu, *current_entry; %token T_DEFAULT %token T_SELECT %token T_RANGE +%token T_OPTION %token T_ON %token T_WORD %token T_WORD_QUOTE @@ -91,6 +92,7 @@ static struct menu *current_menu, *current_entry; %type end %type option_name %type if_entry menu_entry choice_entry +%type symbol_option_arg %destructor { fprintf(stderr, "%s:%d: missing end statement for this entry\n", @@ -173,6 +175,7 @@ menuconfig_stmt: menuconfig_entry_start config_option_list config_option_list: /* empty */ | config_option_list config_option + | config_option_list symbol_option | config_option_list depends | config_option_list help | config_option_list option_error @@ -215,6 +218,26 @@ config_option: T_RANGE symbol symbol if_expr T_EOL printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno()); }; +symbol_option: T_OPTION symbol_option_list T_EOL +; + +symbol_option_list: + /* empty */ + | symbol_option_list T_WORD symbol_option_arg +{ + struct kconf_id *id = kconf_id_lookup($2, strlen($2)); + if (id && id->flags & TF_OPTION) + menu_add_option(id->token, $3); + else + zconfprint("warning: ignoring unknown option %s", $2); + free($2); +}; + +symbol_option_arg: + /* empty */ { $$ = NULL; } + | T_EQUAL prompt { $$ = $2; } +; + /* choice entry */ choice: T_CHOICE T_EOL @@ -458,7 +481,9 @@ void conf_parse(const char *name) sym_init(); menu_init(); - modules_sym = sym_lookup("MODULES", 0); + modules_sym = sym_lookup(NULL, 0); + modules_sym->type = S_BOOLEAN; + modules_sym->flags |= SYMBOL_AUTO; rootmenu.prompt = menu_add_prompt(P_MENU, "Linux Kernel Configuration", NULL); #if YYDEBUG @@ -468,6 +493,12 @@ void conf_parse(const char *name) zconfparse(); if (zconfnerrs) exit(1); + if (!modules_sym->prop) { + struct property *prop; + + prop = prop_alloc(P_DEFAULT, modules_sym); + prop->expr = expr_alloc_symbol(sym_lookup("MODULES", 0)); + } menu_finalize(&rootmenu); for_all_symbols(i, sym) { sym_check_deps(sym); diff --git a/scripts/kernel-2.6-planetlab.spec b/scripts/kernel-2.6-planetlab.spec index abafd7499..dbaa60291 100644 --- a/scripts/kernel-2.6-planetlab.spec +++ b/scripts/kernel-2.6-planetlab.spec @@ -3,11 +3,11 @@ Summary: The Linux kernel (the core of the Linux operating system) # What parts do we want to build? We must build at least one kernel. # These are the kernels that are built IF the architecture allows it. -%define buildup 1 -%define buildsmp 1 -%define builduml 1 +%define buildup 0 +%define buildsmp 0 +%define builduml 0 %define buildxen 1 -%define builddoc 1 +%define builddoc 0 # Versions of various parts diff --git a/scripts/kernel-doc b/scripts/kernel-doc index 99fe4b7fb..c9ca0c23b 100755 --- a/scripts/kernel-doc +++ b/scripts/kernel-doc @@ -253,6 +253,7 @@ my $lineprefix=""; # 3 - scanning prototype. # 4 - documentation block my $state; +my $in_doc_sect; #declaration types: can be # 'function', 'struct', 'union', 'enum', 'typedef' @@ -1055,7 +1056,8 @@ sub output_struct_man(%) { # pointer-to-function print ".BI \" ".$1."\" ".$parameter." \") (".$2.")"."\"\n;\n"; } elsif ($type =~ m/^(.*?)\s*(:.*)/) { - print ".BI \" ".$1."\" ".$parameter.$2." \""."\"\n;\n"; + # bitfield + print ".BI \" ".$1."\ \" ".$parameter.$2." \""."\"\n;\n"; } else { $type =~ s/([^\*])$/$1 /; print ".BI \" ".$type."\" ".$parameter." \""."\"\n;\n"; @@ -1064,7 +1066,7 @@ sub output_struct_man(%) { } print "};\n.br\n"; - print ".SH Arguments\n"; + print ".SH Members\n"; foreach $parameter (@{$args{'parameterlist'}}) { ($parameter =~ /^#/) && next; @@ -1117,7 +1119,10 @@ sub output_function_text(%) { my %args = %{$_[0]}; my ($parameter, $section); - print "Function:\n\n"; + print "Name:\n\n"; + print $args{'function'}." - ".$args{'purpose'}."\n"; + + print "\nSynopsis:\n\n"; my $start=$args{'functiontype'}." ".$args{'function'}." ("; print $start; my $count = 0; @@ -1168,6 +1173,7 @@ sub output_enum_text(%) { my $count; print "Enum:\n\n"; + print "enum ".$args{'enum'}." - ".$args{'purpose'}."\n\n"; print "enum ".$args{'enum'}." {\n"; $count = 0; foreach $parameter (@{$args{'parameterlist'}}) { @@ -1196,7 +1202,7 @@ sub output_typedef_text(%) { my $count; print "Typedef:\n\n"; - print "typedef ".$args{'typedef'}."\n"; + print "typedef ".$args{'typedef'}." - ".$args{'purpose'}."\n"; output_section_text(@_); } @@ -1205,7 +1211,7 @@ sub output_struct_text(%) { my %args = %{$_[0]}; my ($parameter); - print $args{'type'}." ".$args{'struct'}.":\n\n"; + print $args{'type'}." ".$args{'struct'}." - ".$args{'purpose'}."\n\n"; print $args{'type'}." ".$args{'struct'}." {\n"; foreach $parameter (@{$args{'parameterlist'}}) { if ($parameter =~ /^#/) { @@ -1512,6 +1518,7 @@ sub dump_function($$) { $prototype =~ s/^asmlinkage +//; $prototype =~ s/^inline +//; $prototype =~ s/^__inline__ +//; + $prototype =~ s/__devinit +//; $prototype =~ s/^#define +//; #ak added $prototype =~ s/__attribute__ \(\([a-z,]*\)\)//; @@ -1673,6 +1680,9 @@ sub process_state3_type($$) { # replace <, >, and & sub xml_escape($) { my $text = shift; + if (($output_mode eq "text") || ($output_mode eq "man")) { + return $text; + } $text =~ s/\&/\\\\\\amp;/g; $text =~ s/\/\\\\\\gt;/g; @@ -1706,6 +1716,7 @@ sub process_file($) { if ($state == 0) { if (/$doc_start/o) { $state = 1; # next line is always the function name + $in_doc_sect = 0; } } elsif ($state == 1) { # this line is the function name (always) if (/$doc_block/o) { @@ -1756,12 +1767,20 @@ sub process_file($) { $newcontents = $2; if ($contents ne "") { + if (!$in_doc_sect && $verbose) { + print STDERR "Warning(${file}:$.): contents before sections\n"; + ++$warnings; + } dump_section($section, xml_escape($contents)); $section = $section_default; } + $in_doc_sect = 1; $contents = $newcontents; if ($contents ne "") { + if (substr($contents, 0, 1) eq " ") { + $contents = substr($contents, 1); + } $contents .= "\n"; } $section = $newsection; @@ -1776,7 +1795,7 @@ sub process_file($) { $prototype = ""; $state = 3; $brcount = 0; -# print STDERR "end of doc comment, looking for prototype\n"; +# print STDERR "end of doc comment, looking for prototype\n"; } elsif (/$doc_content/) { # miguel-style comment kludge, look for blank lines after # @parameter line to signify start of description @@ -1793,7 +1812,7 @@ sub process_file($) { print STDERR "Warning(${file}:$.): bad line: $_"; ++$warnings; } - } elsif ($state == 3) { # scanning for function { (end of prototype) + } elsif ($state == 3) { # scanning for function '{' (end of prototype) if ($decl_type eq 'function') { process_state3_function($_, $file); } else { diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index 32197efe6..e2de650d3 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c @@ -16,8 +16,10 @@ * use either stdint.h or inttypes.h for the rest. */ #if KERNEL_ELFCLASS == ELFCLASS32 typedef Elf32_Addr kernel_ulong_t; +#define BITS_PER_LONG 32 #else typedef Elf64_Addr kernel_ulong_t; +#define BITS_PER_LONG 64 #endif #ifdef __sun__ #include @@ -25,14 +27,17 @@ typedef Elf64_Addr kernel_ulong_t; #include #endif +#include + typedef uint32_t __u32; typedef uint16_t __u16; typedef unsigned char __u8; /* Big exception to the "don't include kernel headers into userspace, which - * even potentially has different endianness and word sizes, since + * even potentially has different endianness and word sizes, since * we handle those differences explicitly below */ #include "../../include/linux/mod_devicetable.h" +#include "../../include/linux/input.h" #define ADD(str, sep, cond, field) \ do { \ @@ -47,6 +52,23 @@ do { \ sprintf(str + strlen(str), "*"); \ } while(0) +/** + * Check that sizeof(device_id type) are consistent with size of section + * in .o file. If in-consistent then userspace and kernel does not agree + * on actual size which is a bug. + **/ +static void device_id_size_check(const char *modname, const char *device_id, + unsigned long size, unsigned long id_size) +{ + if (size % id_size || size < id_size) { + fatal("%s: sizeof(struct %s_device_id)=%lu is not a modulo " + "of the size of section __mod_%s_device_table=%lu.\n" + "Fix definition of struct %s_device_id " + "in mod_devicetable.h\n", + modname, device_id, id_size, device_id, size, device_id); + } +} + /* USB is special because the bcdDevice can be matched against a numeric range */ /* Looks like "usb:vNpNdNdcNdscNdpNicNiscNipN" */ static void do_usb_entry(struct usb_device_id *id, @@ -147,10 +169,8 @@ static void do_usb_table(void *symval, unsigned long size, unsigned int i; const unsigned long id_size = sizeof(struct usb_device_id); - if (size % id_size || size < id_size) { - fprintf(stderr, "*** Warning: %s ids %lu bad size " - "(each on %lu)\n", mod->name, size, id_size); - } + device_id_size_check(mod->name, "usb", size, id_size); + /* Leave last one: it's the terminator. */ size -= id_size; @@ -212,9 +232,8 @@ static int do_pci_entry(const char *filename, if ((baseclass_mask != 0 && baseclass_mask != 0xFF) || (subclass_mask != 0 && subclass_mask != 0xFF) || (interface_mask != 0 && interface_mask != 0xFF)) { - fprintf(stderr, - "*** Warning: Can't handle masks in %s:%04X\n", - filename, id->class_mask); + warn("Can't handle masks in %s:%04X\n", + filename, id->class_mask); return 0; } @@ -224,7 +243,7 @@ static int do_pci_entry(const char *filename, return 1; } -/* looks like: "ccw:tNmNdtNdmN" */ +/* looks like: "ccw:tNmNdtNdmN" */ static int do_ccw_entry(const char *filename, struct ccw_device_id *id, char *alias) { @@ -241,7 +260,7 @@ static int do_ccw_entry(const char *filename, id->cu_model); ADD(alias, "dt", id->match_flags&CCW_DEVICE_ID_MATCH_DEVICE_TYPE, id->dev_type); - ADD(alias, "dm", id->match_flags&CCW_DEVICE_ID_MATCH_DEVICE_TYPE, + ADD(alias, "dm", id->match_flags&CCW_DEVICE_ID_MATCH_DEVICE_MODEL, id->dev_model); return 1; } @@ -287,6 +306,136 @@ static int do_pnp_card_entry(const char *filename, return 1; } +/* Looks like: pcmcia:mNcNfNfnNpfnNvaNvbNvcNvdN. */ +static int do_pcmcia_entry(const char *filename, + struct pcmcia_device_id *id, char *alias) +{ + unsigned int i; + + id->match_flags = TO_NATIVE(id->match_flags); + id->manf_id = TO_NATIVE(id->manf_id); + id->card_id = TO_NATIVE(id->card_id); + id->func_id = TO_NATIVE(id->func_id); + id->function = TO_NATIVE(id->function); + id->device_no = TO_NATIVE(id->device_no); + + for (i=0; i<4; i++) { + id->prod_id_hash[i] = TO_NATIVE(id->prod_id_hash[i]); + } + + strcpy(alias, "pcmcia:"); + ADD(alias, "m", id->match_flags & PCMCIA_DEV_ID_MATCH_MANF_ID, + id->manf_id); + ADD(alias, "c", id->match_flags & PCMCIA_DEV_ID_MATCH_CARD_ID, + id->card_id); + ADD(alias, "f", id->match_flags & PCMCIA_DEV_ID_MATCH_FUNC_ID, + id->func_id); + ADD(alias, "fn", id->match_flags & PCMCIA_DEV_ID_MATCH_FUNCTION, + id->function); + ADD(alias, "pfn", id->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO, + id->device_no); + ADD(alias, "pa", id->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID1, id->prod_id_hash[0]); + ADD(alias, "pb", id->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID2, id->prod_id_hash[1]); + ADD(alias, "pc", id->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID3, id->prod_id_hash[2]); + ADD(alias, "pd", id->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID4, id->prod_id_hash[3]); + + return 1; +} + + + +static int do_of_entry (const char *filename, struct of_device_id *of, char *alias) +{ + char *tmp; + sprintf (alias, "of:N%sT%sC%s", + of->name[0] ? of->name : "*", + of->type[0] ? of->type : "*", + of->compatible[0] ? of->compatible : "*"); + + /* Replace all whitespace with underscores */ + for (tmp = alias; tmp && *tmp; tmp++) + if (isspace (*tmp)) + *tmp = '_'; + + return 1; +} + +static int do_vio_entry(const char *filename, struct vio_device_id *vio, + char *alias) +{ + char *tmp; + + sprintf(alias, "vio:T%sS%s", vio->type[0] ? vio->type : "*", + vio->compat[0] ? vio->compat : "*"); + + /* Replace all whitespace with underscores */ + for (tmp = alias; tmp && *tmp; tmp++) + if (isspace (*tmp)) + *tmp = '_'; + + return 1; +} + +static int do_i2c_entry(const char *filename, struct i2c_device_id *i2c, char *alias) +{ + strcpy(alias, "i2c:"); + ADD(alias, "id", 1, i2c->id); + return 1; +} + +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) + +static void do_input(char *alias, + kernel_ulong_t *arr, unsigned int min, unsigned int max) +{ + unsigned int i; + + for (i = min; i < max; i++) + if (arr[i / BITS_PER_LONG] & (1L << (i%BITS_PER_LONG))) + sprintf(alias + strlen(alias), "%X,*", i); +} + +/* input:b0v0p0e0-eXkXrXaXmXlXsXfXwX where X is comma-separated %02X. */ +static int do_input_entry(const char *filename, struct input_device_id *id, + char *alias) +{ + sprintf(alias, "input:"); + + ADD(alias, "b", id->flags & INPUT_DEVICE_ID_MATCH_BUS, id->bustype); + ADD(alias, "v", id->flags & INPUT_DEVICE_ID_MATCH_VENDOR, id->vendor); + ADD(alias, "p", id->flags & INPUT_DEVICE_ID_MATCH_PRODUCT, id->product); + ADD(alias, "e", id->flags & INPUT_DEVICE_ID_MATCH_VERSION, id->version); + + sprintf(alias + strlen(alias), "-e*"); + if (id->flags & INPUT_DEVICE_ID_MATCH_EVBIT) + do_input(alias, id->evbit, 0, EV_MAX); + sprintf(alias + strlen(alias), "k*"); + if (id->flags & INPUT_DEVICE_ID_MATCH_KEYBIT) + do_input(alias, id->keybit, KEY_MIN_INTERESTING, KEY_MAX); + sprintf(alias + strlen(alias), "r*"); + if (id->flags & INPUT_DEVICE_ID_MATCH_RELBIT) + do_input(alias, id->relbit, 0, REL_MAX); + sprintf(alias + strlen(alias), "a*"); + if (id->flags & INPUT_DEVICE_ID_MATCH_ABSBIT) + do_input(alias, id->absbit, 0, ABS_MAX); + sprintf(alias + strlen(alias), "m*"); + if (id->flags & INPUT_DEVICE_ID_MATCH_MSCIT) + do_input(alias, id->mscbit, 0, MSC_MAX); + sprintf(alias + strlen(alias), "l*"); + if (id->flags & INPUT_DEVICE_ID_MATCH_LEDBIT) + do_input(alias, id->ledbit, 0, LED_MAX); + sprintf(alias + strlen(alias), "s*"); + if (id->flags & INPUT_DEVICE_ID_MATCH_SNDBIT) + do_input(alias, id->sndbit, 0, SND_MAX); + sprintf(alias + strlen(alias), "f*"); + if (id->flags & INPUT_DEVICE_ID_MATCH_FFBIT) + do_input(alias, id->ffbit, 0, FF_MAX); + sprintf(alias + strlen(alias), "w*"); + if (id->flags & INPUT_DEVICE_ID_MATCH_SWBIT) + do_input(alias, id->swbit, 0, SW_MAX); + return 1; +} + /* Ignore any prefix, eg. v850 prepends _ */ static inline int sym_is(const char *symbol, const char *name) { @@ -300,6 +449,7 @@ static inline int sym_is(const char *symbol, const char *name) static void do_table(void *symval, unsigned long size, unsigned long id_size, + const char *device_id, void *function, struct module *mod) { @@ -307,10 +457,7 @@ static void do_table(void *symval, unsigned long size, char alias[500]; int (*do_entry)(const char *, void *entry, char *alias) = function; - if (size % id_size || size < id_size) { - fprintf(stderr, "*** Warning: %s ids %lu bad size " - "(each on %lu)\n", mod->name, size, id_size); - } + device_id_size_check(mod->name, device_id, size, id_size); /* Leave last one: it's the terminator. */ size -= id_size; @@ -342,26 +489,52 @@ void handle_moddevtable(struct module *mod, struct elf_info *info, + sym->st_value; if (sym_is(symname, "__mod_pci_device_table")) - do_table(symval, sym->st_size, sizeof(struct pci_device_id), + do_table(symval, sym->st_size, + sizeof(struct pci_device_id), "pci", do_pci_entry, mod); else if (sym_is(symname, "__mod_usb_device_table")) /* special case to handle bcdDevice ranges */ do_usb_table(symval, sym->st_size, mod); else if (sym_is(symname, "__mod_ieee1394_device_table")) - do_table(symval, sym->st_size, sizeof(struct ieee1394_device_id), + do_table(symval, sym->st_size, + sizeof(struct ieee1394_device_id), "ieee1394", do_ieee1394_entry, mod); else if (sym_is(symname, "__mod_ccw_device_table")) - do_table(symval, sym->st_size, sizeof(struct ccw_device_id), + do_table(symval, sym->st_size, + sizeof(struct ccw_device_id), "ccw", do_ccw_entry, mod); else if (sym_is(symname, "__mod_serio_device_table")) - do_table(symval, sym->st_size, sizeof(struct serio_device_id), + do_table(symval, sym->st_size, + sizeof(struct serio_device_id), "serio", do_serio_entry, mod); else if (sym_is(symname, "__mod_pnp_device_table")) - do_table(symval, sym->st_size, sizeof(struct pnp_device_id), + do_table(symval, sym->st_size, + sizeof(struct pnp_device_id), "pnp", do_pnp_entry, mod); else if (sym_is(symname, "__mod_pnp_card_device_table")) - do_table(symval, sym->st_size, sizeof(struct pnp_card_device_id), + do_table(symval, sym->st_size, + sizeof(struct pnp_card_device_id), "pnp_card", do_pnp_card_entry, mod); + else if (sym_is(symname, "__mod_pcmcia_device_table")) + do_table(symval, sym->st_size, + sizeof(struct pcmcia_device_id), "pcmcia", + do_pcmcia_entry, mod); + else if (sym_is(symname, "__mod_of_device_table")) + do_table(symval, sym->st_size, + sizeof(struct of_device_id), "of", + do_of_entry, mod); + else if (sym_is(symname, "__mod_vio_device_table")) + do_table(symval, sym->st_size, + sizeof(struct vio_device_id), "vio", + do_vio_entry, mod); + else if (sym_is(symname, "__mod_i2c_device_table")) + do_table(symval, sym->st_size, + sizeof(struct i2c_device_id), "i2c", + do_i2c_entry, mod); + else if (sym_is(symname, "__mod_input_device_table")) + do_table(symval, sym->st_size, + sizeof(struct input_device_id), "input", + do_input_entry, mod); } /* Now add out buffered information to the generated C source */ diff --git a/scripts/mod/mk_elfconfig.c b/scripts/mod/mk_elfconfig.c index de2aabf89..725d61c0f 100644 --- a/scripts/mod/mk_elfconfig.c +++ b/scripts/mod/mk_elfconfig.c @@ -6,7 +6,7 @@ int main(int argc, char **argv) { - unsigned char ei[EI_NIDENT]; + unsigned char ei[EI_NIDENT]; union { short s; char c[2]; } endian_test; if (argc != 2) { @@ -28,7 +28,7 @@ main(int argc, char **argv) printf("#define KERNEL_ELFCLASS ELFCLASS64\n"); break; default: - abort(); + exit(1); } switch (ei[EI_DATA]) { case ELFDATA2LSB: @@ -38,7 +38,7 @@ main(int argc, char **argv) printf("#define KERNEL_ELFDATA ELFDATA2MSB\n"); break; default: - abort(); + exit(1); } if (sizeof(unsigned long) == 4) { @@ -53,11 +53,11 @@ main(int argc, char **argv) else if (memcmp(endian_test.c, "\x02\x01", 2) == 0) printf("#define HOST_ELFDATA ELFDATA2LSB\n"); else - abort(); + exit(1); if ((strcmp(argv[1], "v850") == 0) || (strcmp(argv[1], "h8300") == 0)) printf("#define MODULE_SYMBOL_PREFIX \"_\"\n"); - else + else printf("#define MODULE_SYMBOL_PREFIX \"\"\n"); return 0; diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 9b9f94c91..dfde0e87a 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c @@ -2,7 +2,7 @@ * * Copyright 2003 Kai Germaschewski * Copyright 2002-2004 Rusty Russell, IBM Corporation - * + * Copyright 2006 Sam Ravnborg * Based in part on module-init-tools/depmod.c,file2alias * * This software may be used and distributed according to the terms @@ -13,6 +13,7 @@ #include #include "modpost.h" +#include "../../include/linux/license.h" /* Are we using CONFIG_MODVERSIONS? */ int modversions = 0; @@ -20,9 +21,15 @@ int modversions = 0; int have_vmlinux = 0; /* Is CONFIG_MODULE_SRCVERSION_ALL set? */ static int all_versions = 0; +/* If we are modposting external module set to 1 */ +static int external_module = 0; +/* How a symbol is exported */ +enum export { + export_plain, export_unused, export_gpl, + export_unused_gpl, export_gpl_future, export_unknown +}; -void -fatal(const char *fmt, ...) +void fatal(const char *fmt, ...) { va_list arglist; @@ -35,8 +42,7 @@ fatal(const char *fmt, ...) exit(1); } -void -warn(const char *fmt, ...) +void warn(const char *fmt, ...) { va_list arglist; @@ -47,6 +53,18 @@ warn(const char *fmt, ...) va_end(arglist); } +static int is_vmlinux(const char *modname) +{ + const char *myname; + + if ((myname = strrchr(modname, '/'))) + myname++; + else + myname = modname; + + return strcmp(myname, "vmlinux") == 0; +} + void *do_nofail(void *ptr, const char *expr) { if (!ptr) { @@ -59,8 +77,7 @@ void *do_nofail(void *ptr, const char *expr) static struct module *modules; -struct module * -find_module(char *modname) +static struct module *find_module(char *modname) { struct module *mod; @@ -70,12 +87,11 @@ find_module(char *modname) return mod; } -struct module * -new_module(char *modname) +static struct module *new_module(char *modname) { struct module *mod; char *p, *s; - + mod = NOFAIL(malloc(sizeof(*mod))); memset(mod, 0, sizeof(*mod)); p = NOFAIL(strdup(modname)); @@ -87,6 +103,7 @@ new_module(char *modname) /* add to list */ mod->name = p; + mod->gpl_compatible = -1; mod->next = modules; modules = mod; @@ -104,6 +121,11 @@ struct symbol { unsigned int crc; int crc_valid; unsigned int weak:1; + unsigned int vmlinux:1; /* 1 if symbol is defined in vmlinux */ + unsigned int kernel:1; /* 1 if symbol is from kernel + * (only for external modules) **/ + unsigned int preloaded:1; /* 1 if symbol from Module.symvers */ + enum export export; /* Type of export */ char name[0]; }; @@ -122,11 +144,12 @@ static inline unsigned int tdb_hash(const char *name) return (1103515243 * value + 12345); } -/* Allocate a new symbols for use in the hash of exported symbols or - * the list of unresolved symbols per module */ - -struct symbol * -alloc_symbol(const char *name, unsigned int weak, struct symbol *next) +/** + * Allocate a new symbols for use in the hash of exported symbols or + * the list of unresolved symbols per module + **/ +static struct symbol *alloc_symbol(const char *name, unsigned int weak, + struct symbol *next) { struct symbol *s = NOFAIL(malloc(sizeof(*s) + strlen(name) + 1)); @@ -138,9 +161,8 @@ alloc_symbol(const char *name, unsigned int weak, struct symbol *next) } /* For the hash of exported symbols */ - -void -new_symbol(const char *name, struct module *module, unsigned int *crc) +static struct symbol *new_symbol(const char *name, struct module *module, + enum export export) { unsigned int hash; struct symbol *new; @@ -148,14 +170,11 @@ new_symbol(const char *name, struct module *module, unsigned int *crc) hash = tdb_hash(name) % SYMBOL_HASH_SIZE; new = symbolhash[hash] = alloc_symbol(name, 0, symbolhash[hash]); new->module = module; - if (crc) { - new->crc = *crc; - new->crc_valid = 1; - } + new->export = export; + return new; } -struct symbol * -find_symbol(const char *name) +static struct symbol *find_symbol(const char *name) { struct symbol *s; @@ -170,25 +189,90 @@ find_symbol(const char *name) return NULL; } -/* Add an exported symbol - it may have already been added without a - * CRC, in this case just update the CRC */ -void -add_exported_symbol(const char *name, struct module *module, unsigned int *crc) +static struct { + const char *str; + enum export export; +} export_list[] = { + { .str = "EXPORT_SYMBOL", .export = export_plain }, + { .str = "EXPORT_UNUSED_SYMBOL", .export = export_unused }, + { .str = "EXPORT_SYMBOL_GPL", .export = export_gpl }, + { .str = "EXPORT_UNUSED_SYMBOL_GPL", .export = export_unused_gpl }, + { .str = "EXPORT_SYMBOL_GPL_FUTURE", .export = export_gpl_future }, + { .str = "(unknown)", .export = export_unknown }, +}; + + +static const char *export_str(enum export ex) +{ + return export_list[ex].str; +} + +static enum export export_no(const char * s) +{ + int i; + if (!s) + return export_unknown; + for (i = 0; export_list[i].export != export_unknown; i++) { + if (strcmp(export_list[i].str, s) == 0) + return export_list[i].export; + } + return export_unknown; +} + +static enum export export_from_sec(struct elf_info *elf, Elf_Section sec) +{ + if (sec == elf->export_sec) + return export_plain; + else if (sec == elf->export_unused_sec) + return export_unused; + else if (sec == elf->export_gpl_sec) + return export_gpl; + else if (sec == elf->export_unused_gpl_sec) + return export_unused_gpl; + else if (sec == elf->export_gpl_future_sec) + return export_gpl_future; + else + return export_unknown; +} + +/** + * Add an exported symbol - it may have already been added without a + * CRC, in this case just update the CRC + **/ +static struct symbol *sym_add_exported(const char *name, struct module *mod, + enum export export) { struct symbol *s = find_symbol(name); if (!s) { - new_symbol(name, module, crc); - return; - } - if (crc) { - s->crc = *crc; - s->crc_valid = 1; + s = new_symbol(name, mod, export); + } else { + if (!s->preloaded) { + warn("%s: '%s' exported twice. Previous export " + "was in %s%s\n", mod->name, name, + s->module->name, + is_vmlinux(s->module->name) ?"":".ko"); + } } + s->preloaded = 0; + s->vmlinux = is_vmlinux(mod->name); + s->kernel = 0; + s->export = export; + return s; } -void * -grab_file(const char *filename, unsigned long *size) +static void sym_update_crc(const char *name, struct module *mod, + unsigned int crc, enum export export) +{ + struct symbol *s = find_symbol(name); + + if (!s) + s = new_symbol(name, mod, export); + s->crc = crc; + s->crc_valid = 1; +} + +void *grab_file(const char *filename, unsigned long *size) { struct stat st; void *map; @@ -207,13 +291,12 @@ grab_file(const char *filename, unsigned long *size) return map; } -/* - Return a copy of the next line in a mmap'ed file. - spaces in the beginning of the line is trimmed away. - Return a pointer to a static buffer. -*/ -char* -get_next_line(unsigned long *pos, void *file, unsigned long size) +/** + * Return a copy of the next line in a mmap'ed file. + * spaces in the beginning of the line is trimmed away. + * Return a pointer to a static buffer. + **/ +char* get_next_line(unsigned long *pos, void *file, unsigned long size) { static char line[4096]; int skip = 1; @@ -243,14 +326,12 @@ get_next_line(unsigned long *pos, void *file, unsigned long size) return NULL; } -void -release_file(void *file, unsigned long size) +void release_file(void *file, unsigned long size) { munmap(file, size); } -void -parse_elf(struct elf_info *info, const char *filename) +static void parse_elf(struct elf_info *info, const char *filename) { unsigned int i; Elf_Ehdr *hdr = info->hdr; @@ -260,7 +341,7 @@ parse_elf(struct elf_info *info, const char *filename) hdr = grab_file(filename, &info->size); if (!hdr) { perror(filename); - abort(); + exit(1); } info->hdr = hdr; if (info->size < sizeof(*hdr)) @@ -286,25 +367,36 @@ parse_elf(struct elf_info *info, const char *filename) for (i = 1; i < hdr->e_shnum; i++) { const char *secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; + const char *secname; if (sechdrs[i].sh_offset > info->size) goto truncated; - if (strcmp(secstrings+sechdrs[i].sh_name, ".modinfo") == 0) { + secname = secstrings + sechdrs[i].sh_name; + if (strcmp(secname, ".modinfo") == 0) { info->modinfo = (void *)hdr + sechdrs[i].sh_offset; info->modinfo_len = sechdrs[i].sh_size; - } + } else if (strcmp(secname, "__ksymtab") == 0) + info->export_sec = i; + else if (strcmp(secname, "__ksymtab_unused") == 0) + info->export_unused_sec = i; + else if (strcmp(secname, "__ksymtab_gpl") == 0) + info->export_gpl_sec = i; + else if (strcmp(secname, "__ksymtab_unused_gpl") == 0) + info->export_unused_gpl_sec = i; + else if (strcmp(secname, "__ksymtab_gpl_future") == 0) + info->export_gpl_future_sec = i; + if (sechdrs[i].sh_type != SHT_SYMTAB) continue; info->symtab_start = (void *)hdr + sechdrs[i].sh_offset; - info->symtab_stop = (void *)hdr + sechdrs[i].sh_offset + info->symtab_stop = (void *)hdr + sechdrs[i].sh_offset + sechdrs[i].sh_size; - info->strtab = (void *)hdr + + info->strtab = (void *)hdr + sechdrs[sechdrs[i].sh_link].sh_offset; } if (!info->symtab_start) { - fprintf(stderr, "modpost: %s no symtab?\n", filename); - abort(); + fatal("%s has no symtab?\n", filename); } /* Fix endianness in symbols */ for (sym = info->symtab_start; sym < info->symtab_stop; sym++) { @@ -316,12 +408,10 @@ parse_elf(struct elf_info *info, const char *filename) return; truncated: - fprintf(stderr, "modpost: %s is truncated.\n", filename); - abort(); + fatal("%s is truncated.\n", filename); } -void -parse_elf_finish(struct elf_info *info) +static void parse_elf_finish(struct elf_info *info) { release_file(info->hdr, info->size); } @@ -329,23 +419,22 @@ parse_elf_finish(struct elf_info *info) #define CRC_PFX MODULE_SYMBOL_PREFIX "__crc_" #define KSYMTAB_PFX MODULE_SYMBOL_PREFIX "__ksymtab_" -void -handle_modversions(struct module *mod, struct elf_info *info, - Elf_Sym *sym, const char *symname) +static void handle_modversions(struct module *mod, struct elf_info *info, + Elf_Sym *sym, const char *symname) { unsigned int crc; + enum export export = export_from_sec(info, sym->st_shndx); switch (sym->st_shndx) { case SHN_COMMON: - fprintf(stderr, "*** Warning: \"%s\" [%s] is COMMON symbol\n", - symname, mod->name); + warn("\"%s\" [%s] is COMMON symbol\n", symname, mod->name); break; case SHN_ABS: /* CRC'd symbol */ if (memcmp(symname, CRC_PFX, strlen(CRC_PFX)) == 0) { crc = (unsigned int) sym->st_value; - add_exported_symbol(symname + strlen(CRC_PFX), - mod, &crc); + sym_update_crc(symname + strlen(CRC_PFX), mod, crc, + export); } break; case SHN_UNDEF: @@ -359,15 +448,26 @@ handle_modversions(struct module *mod, struct elf_info *info, /* ignore __this_module, it will be resolved shortly */ if (strcmp(symname, MODULE_SYMBOL_PREFIX "__this_module") == 0) break; -#ifdef STT_REGISTER +/* cope with newer glibc (2.3.4 or higher) STT_ definition in elf.h */ +#if defined(STT_REGISTER) || defined(STT_SPARC_REGISTER) +/* add compatibility with older glibc */ +#ifndef STT_SPARC_REGISTER +#define STT_SPARC_REGISTER STT_REGISTER +#endif if (info->hdr->e_machine == EM_SPARC || info->hdr->e_machine == EM_SPARCV9) { /* Ignore register directives. */ - if (ELF_ST_TYPE(sym->st_info) == STT_REGISTER) + if (ELF_ST_TYPE(sym->st_info) == STT_SPARC_REGISTER) break; + if (symname[0] == '.') { + char *munged = strdup(symname); + munged[0] = '_'; + munged[1] = toupper(munged[1]); + symname = munged; + } } #endif - + if (memcmp(symname, MODULE_SYMBOL_PREFIX, strlen(MODULE_SYMBOL_PREFIX)) == 0) mod->unres = alloc_symbol(symname + @@ -378,8 +478,8 @@ handle_modversions(struct module *mod, struct elf_info *info, default: /* All exported symbols */ if (memcmp(symname, KSYMTAB_PFX, strlen(KSYMTAB_PFX)) == 0) { - add_exported_symbol(symname + strlen(KSYMTAB_PFX), - mod, NULL); + sym_add_exported(symname + strlen(KSYMTAB_PFX), mod, + export); } if (strcmp(symname, MODULE_SYMBOL_PREFIX "init_module") == 0) mod->has_init = 1; @@ -389,20 +489,9 @@ handle_modversions(struct module *mod, struct elf_info *info, } } -int -is_vmlinux(const char *modname) -{ - const char *myname; - - if ((myname = strrchr(modname, '/'))) - myname++; - else - myname = modname; - - return strcmp(myname, "vmlinux") == 0; -} - -/* Parse tag=value strings from .modinfo section */ +/** + * Parse tag=value strings from .modinfo section + **/ static char *next_string(char *string, unsigned long *secsize) { /* Skip non-zero chars */ @@ -421,13 +510,18 @@ static char *next_string(char *string, unsigned long *secsize) return string; } -static char *get_modinfo(void *modinfo, unsigned long modinfo_len, - const char *tag) +static char *get_next_modinfo(void *modinfo, unsigned long modinfo_len, + const char *tag, char *info) { char *p; unsigned int taglen = strlen(tag); unsigned long size = modinfo_len; + if (info) { + size -= info - (char *)modinfo; + modinfo = next_string(info, &size); + } + for (p = modinfo; p; p = next_string(p, &size)) { if (strncmp(p, tag, taglen) == 0 && p[taglen] == '=') return p + taglen + 1; @@ -435,11 +529,494 @@ static char *get_modinfo(void *modinfo, unsigned long modinfo_len, return NULL; } -void -read_symbols(char *modname) +static char *get_modinfo(void *modinfo, unsigned long modinfo_len, + const char *tag) + +{ + return get_next_modinfo(modinfo, modinfo_len, tag, NULL); +} + +/** + * Test if string s ends in string sub + * return 0 if match + **/ +static int strrcmp(const char *s, const char *sub) +{ + int slen, sublen; + + if (!s || !sub) + return 1; + + slen = strlen(s); + sublen = strlen(sub); + + if ((slen == 0) || (sublen == 0)) + return 1; + + if (sublen > slen) + return 1; + + return memcmp(s + slen - sublen, sub, sublen); +} + +/** + * Whitelist to allow certain references to pass with no warning. + * Pattern 1: + * If a module parameter is declared __initdata and permissions=0 + * then this is legal despite the warning generated. + * We cannot see value of permissions here, so just ignore + * this pattern. + * The pattern is identified by: + * tosec = .init.data + * fromsec = .data* + * atsym =__param* + * + * Pattern 2: + * Many drivers utilise a *driver container with references to + * add, remove, probe functions etc. + * These functions may often be marked __init and we do not want to + * warn here. + * the pattern is identified by: + * tosec = .init.text | .exit.text | .init.data + * fromsec = .data + * atsym = *driver, *_template, *_sht, *_ops, *_probe, *probe_one + **/ +static int secref_whitelist(const char *tosec, const char *fromsec, + const char *atsym) +{ + int f1 = 1, f2 = 1; + const char **s; + const char *pat2sym[] = { + "driver", + "_template", /* scsi uses *_template a lot */ + "_sht", /* scsi also used *_sht to some extent */ + "_ops", + "_probe", + "_probe_one", + NULL + }; + + /* Check for pattern 1 */ + if (strcmp(tosec, ".init.data") != 0) + f1 = 0; + if (strncmp(fromsec, ".data", strlen(".data")) != 0) + f1 = 0; + if (strncmp(atsym, "__param", strlen("__param")) != 0) + f1 = 0; + + if (f1) + return f1; + + /* Check for pattern 2 */ + if ((strcmp(tosec, ".init.text") != 0) && + (strcmp(tosec, ".exit.text") != 0) && + (strcmp(tosec, ".init.data") != 0)) + f2 = 0; + if (strcmp(fromsec, ".data") != 0) + f2 = 0; + + for (s = pat2sym; *s; s++) + if (strrcmp(atsym, *s) == 0) + f1 = 1; + + return f1 && f2; +} + +/** + * Find symbol based on relocation record info. + * In some cases the symbol supplied is a valid symbol so + * return refsym. If st_name != 0 we assume this is a valid symbol. + * In other cases the symbol needs to be looked up in the symbol table + * based on section and address. + * **/ +static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf_Addr addr, + Elf_Sym *relsym) +{ + Elf_Sym *sym; + + if (relsym->st_name != 0) + return relsym; + for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) { + if (sym->st_shndx != relsym->st_shndx) + continue; + if (sym->st_value == addr) + return sym; + } + return NULL; +} + +/* + * Find symbols before or equal addr and after addr - in the section sec. + * If we find two symbols with equal offset prefer one with a valid name. + * The ELF format may have a better way to detect what type of symbol + * it is, but this works for now. + **/ +static void find_symbols_between(struct elf_info *elf, Elf_Addr addr, + const char *sec, + Elf_Sym **before, Elf_Sym **after) +{ + Elf_Sym *sym; + Elf_Ehdr *hdr = elf->hdr; + Elf_Addr beforediff = ~0; + Elf_Addr afterdiff = ~0; + const char *secstrings = (void *)hdr + + elf->sechdrs[hdr->e_shstrndx].sh_offset; + + *before = NULL; + *after = NULL; + + for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) { + const char *symsec; + + if (sym->st_shndx >= SHN_LORESERVE) + continue; + symsec = secstrings + elf->sechdrs[sym->st_shndx].sh_name; + if (strcmp(symsec, sec) != 0) + continue; + if (sym->st_value <= addr) { + if ((addr - sym->st_value) < beforediff) { + beforediff = addr - sym->st_value; + *before = sym; + } + else if ((addr - sym->st_value) == beforediff) { + /* equal offset, valid name? */ + const char *name = elf->strtab + sym->st_name; + if (name && strlen(name)) + *before = sym; + } + } + else + { + if ((sym->st_value - addr) < afterdiff) { + afterdiff = sym->st_value - addr; + *after = sym; + } + else if ((sym->st_value - addr) == afterdiff) { + /* equal offset, valid name? */ + const char *name = elf->strtab + sym->st_name; + if (name && strlen(name)) + *after = sym; + } + } + } +} + +/** + * Print a warning about a section mismatch. + * Try to find symbols near it so user can find it. + * Check whitelist before warning - it may be a false positive. + **/ +static void warn_sec_mismatch(const char *modname, const char *fromsec, + struct elf_info *elf, Elf_Sym *sym, Elf_Rela r) +{ + const char *refsymname = ""; + Elf_Sym *before, *after; + Elf_Sym *refsym; + Elf_Ehdr *hdr = elf->hdr; + Elf_Shdr *sechdrs = elf->sechdrs; + const char *secstrings = (void *)hdr + + sechdrs[hdr->e_shstrndx].sh_offset; + const char *secname = secstrings + sechdrs[sym->st_shndx].sh_name; + + find_symbols_between(elf, r.r_offset, fromsec, &before, &after); + + refsym = find_elf_symbol(elf, r.r_addend, sym); + if (refsym && strlen(elf->strtab + refsym->st_name)) + refsymname = elf->strtab + refsym->st_name; + + /* check whitelist - we may ignore it */ + if (before && + secref_whitelist(secname, fromsec, elf->strtab + before->st_name)) + return; + + if (before && after) { + warn("%s - Section mismatch: reference to %s:%s from %s " + "between '%s' (at offset 0x%llx) and '%s'\n", + modname, secname, refsymname, fromsec, + elf->strtab + before->st_name, + (long long)r.r_offset, + elf->strtab + after->st_name); + } else if (before) { + warn("%s - Section mismatch: reference to %s:%s from %s " + "after '%s' (at offset 0x%llx)\n", + modname, secname, refsymname, fromsec, + elf->strtab + before->st_name, + (long long)r.r_offset); + } else if (after) { + warn("%s - Section mismatch: reference to %s:%s from %s " + "before '%s' (at offset -0x%llx)\n", + modname, secname, refsymname, fromsec, + elf->strtab + after->st_name, + (long long)r.r_offset); + } else { + warn("%s - Section mismatch: reference to %s:%s from %s " + "(offset 0x%llx)\n", + modname, secname, fromsec, refsymname, + (long long)r.r_offset); + } +} + +/** + * A module includes a number of sections that are discarded + * either when loaded or when used as built-in. + * For loaded modules all functions marked __init and all data + * marked __initdata will be discarded when the module has been intialized. + * Likewise for modules used built-in the sections marked __exit + * are discarded because __exit marked function are supposed to be called + * only when a moduel is unloaded which never happes for built-in modules. + * The check_sec_ref() function traverses all relocation records + * to find all references to a section that reference a section that will + * be discarded and warns about it. + **/ +static void check_sec_ref(struct module *mod, const char *modname, + struct elf_info *elf, + int section(const char*), + int section_ref_ok(const char *)) +{ + int i; + Elf_Sym *sym; + Elf_Ehdr *hdr = elf->hdr; + Elf_Shdr *sechdrs = elf->sechdrs; + const char *secstrings = (void *)hdr + + sechdrs[hdr->e_shstrndx].sh_offset; + + /* Walk through all sections */ + for (i = 0; i < hdr->e_shnum; i++) { + const char *name = secstrings + sechdrs[i].sh_name; + const char *secname; + Elf_Rela r; + unsigned int r_sym; + /* We want to process only relocation sections and not .init */ + if (sechdrs[i].sh_type == SHT_RELA) { + Elf_Rela *rela; + Elf_Rela *start = (void *)hdr + sechdrs[i].sh_offset; + Elf_Rela *stop = (void*)start + sechdrs[i].sh_size; + name += strlen(".rela"); + if (section_ref_ok(name)) + continue; + + for (rela = start; rela < stop; rela++) { + r.r_offset = TO_NATIVE(rela->r_offset); +#if KERNEL_ELFCLASS == ELFCLASS64 + if (hdr->e_machine == EM_MIPS) { + r_sym = ELF64_MIPS_R_SYM(rela->r_info); + r_sym = TO_NATIVE(r_sym); + } else { + r.r_info = TO_NATIVE(rela->r_info); + r_sym = ELF_R_SYM(r.r_info); + } +#else + r.r_info = TO_NATIVE(rela->r_info); + r_sym = ELF_R_SYM(r.r_info); +#endif + r.r_addend = TO_NATIVE(rela->r_addend); + sym = elf->symtab_start + r_sym; + /* Skip special sections */ + if (sym->st_shndx >= SHN_LORESERVE) + continue; + + secname = secstrings + + sechdrs[sym->st_shndx].sh_name; + if (section(secname)) + warn_sec_mismatch(modname, name, + elf, sym, r); + } + } else if (sechdrs[i].sh_type == SHT_REL) { + Elf_Rel *rel; + Elf_Rel *start = (void *)hdr + sechdrs[i].sh_offset; + Elf_Rel *stop = (void*)start + sechdrs[i].sh_size; + name += strlen(".rel"); + if (section_ref_ok(name)) + continue; + + for (rel = start; rel < stop; rel++) { + r.r_offset = TO_NATIVE(rel->r_offset); +#if KERNEL_ELFCLASS == ELFCLASS64 + if (hdr->e_machine == EM_MIPS) { + r_sym = ELF64_MIPS_R_SYM(rel->r_info); + r_sym = TO_NATIVE(r_sym); + } else { + r.r_info = TO_NATIVE(rel->r_info); + r_sym = ELF_R_SYM(r.r_info); + } +#else + r.r_info = TO_NATIVE(rel->r_info); + r_sym = ELF_R_SYM(r.r_info); +#endif + r.r_addend = 0; + sym = elf->symtab_start + r_sym; + /* Skip special sections */ + if (sym->st_shndx >= SHN_LORESERVE) + continue; + + secname = secstrings + + sechdrs[sym->st_shndx].sh_name; + if (section(secname)) + warn_sec_mismatch(modname, name, + elf, sym, r); + } + } + } +} + +/** + * Functions used only during module init is marked __init and is stored in + * a .init.text section. Likewise data is marked __initdata and stored in + * a .init.data section. + * If this section is one of these sections return 1 + * See include/linux/init.h for the details + **/ +static int init_section(const char *name) +{ + if (strcmp(name, ".init") == 0) + return 1; + if (strncmp(name, ".init.", strlen(".init.")) == 0) + return 1; + return 0; +} + +/** + * Identify sections from which references to a .init section is OK. + * + * Unfortunately references to read only data that referenced .init + * sections had to be excluded. Almost all of these are false + * positives, they are created by gcc. The downside of excluding rodata + * is that there really are some user references from rodata to + * init code, e.g. drivers/video/vgacon.c: + * + * const struct consw vga_con = { + * con_startup: vgacon_startup, + * + * where vgacon_startup is __init. If you want to wade through the false + * positives, take out the check for rodata. + **/ +static int init_section_ref_ok(const char *name) +{ + const char **s; + /* Absolute section names */ + const char *namelist1[] = { + ".init", + ".opd", /* see comment [OPD] at exit_section_ref_ok() */ + ".toc1", /* used by ppc64 */ + ".stab", + ".rodata", + ".text.lock", + "__bug_table", /* used by powerpc for BUG() */ + ".pci_fixup_header", + ".pci_fixup_final", + ".pdr", + "__param", + "__ex_table", + ".fixup", + ".smp_locks", + ".plt", /* seen on ARCH=um build on x86_64. Harmless */ + NULL + }; + /* Start of section names */ + const char *namelist2[] = { + ".init.", + ".altinstructions", + ".eh_frame", + ".debug", + NULL + }; + /* part of section name */ + const char *namelist3 [] = { + ".unwind", /* sample: IA_64.unwind.init.text */ + NULL + }; + + for (s = namelist1; *s; s++) + if (strcmp(*s, name) == 0) + return 1; + for (s = namelist2; *s; s++) + if (strncmp(*s, name, strlen(*s)) == 0) + return 1; + for (s = namelist3; *s; s++) + if (strstr(name, *s) != NULL) + return 1; + if (strrcmp(name, ".init") == 0) + return 1; + return 0; +} + +/* + * Functions used only during module exit is marked __exit and is stored in + * a .exit.text section. Likewise data is marked __exitdata and stored in + * a .exit.data section. + * If this section is one of these sections return 1 + * See include/linux/init.h for the details + **/ +static int exit_section(const char *name) +{ + if (strcmp(name, ".exit.text") == 0) + return 1; + if (strcmp(name, ".exit.data") == 0) + return 1; + return 0; + +} + +/* + * Identify sections from which references to a .exit section is OK. + * + * [OPD] Keith Ownes commented: + * For our future {in}sanity, add a comment that this is the ppc .opd + * section, not the ia64 .opd section. + * ia64 .opd should not point to discarded sections. + * [.rodata] like for .init.text we ignore .rodata references -same reason + **/ +static int exit_section_ref_ok(const char *name) +{ + const char **s; + /* Absolute section names */ + const char *namelist1[] = { + ".exit.text", + ".exit.data", + ".init.text", + ".rodata", + ".opd", /* See comment [OPD] */ + ".toc1", /* used by ppc64 */ + ".altinstructions", + ".pdr", + "__bug_table", /* used by powerpc for BUG() */ + ".exitcall.exit", + ".eh_frame", + ".stab", + "__ex_table", + ".fixup", + ".smp_locks", + ".plt", /* seen on ARCH=um build on x86_64. Harmless */ + NULL + }; + /* Start of section names */ + const char *namelist2[] = { + ".debug", + NULL + }; + /* part of section name */ + const char *namelist3 [] = { + ".unwind", /* Sample: IA_64.unwind.exit.text */ + NULL + }; + + for (s = namelist1; *s; s++) + if (strcmp(*s, name) == 0) + return 1; + for (s = namelist2; *s; s++) + if (strncmp(*s, name, strlen(*s)) == 0) + return 1; + for (s = namelist3; *s; s++) + if (strstr(name, *s) != NULL) + return 1; + return 0; +} + +static void read_symbols(char *modname) { const char *symname; char *version; + char *license; struct module *mod; struct elf_info info = { }; Elf_Sym *sym; @@ -451,18 +1028,30 @@ read_symbols(char *modname) /* When there's no vmlinux, don't print warnings about * unresolved symbols (since there'll be too many ;) */ if (is_vmlinux(modname)) { - unsigned int fake_crc = 0; have_vmlinux = 1; - add_exported_symbol("struct_module", mod, &fake_crc); mod->skip = 1; } + license = get_modinfo(info.modinfo, info.modinfo_len, "license"); + while (license) { + if (license_is_gpl_compatible(license)) + mod->gpl_compatible = 1; + else { + mod->gpl_compatible = 0; + break; + } + license = get_next_modinfo(info.modinfo, info.modinfo_len, + "license", license); + } + for (sym = info.symtab_start; sym < info.symtab_stop; sym++) { symname = info.strtab + sym->st_name; handle_modversions(mod, &info, sym, symname); handle_moddevtable(mod, &info, sym, symname); } + check_sec_ref(mod, modname, &info, init_section, init_section_ref_ok); + check_sec_ref(mod, modname, &info, exit_section, exit_section_ref_ok); version = get_modinfo(info.modinfo, info.modinfo_len, "version"); if (version) @@ -488,39 +1077,94 @@ read_symbols(char *modname) * following helper, then compare to the file on disk and * only update the later if anything changed */ -void __attribute__((format(printf, 2, 3))) -buf_printf(struct buffer *buf, const char *fmt, ...) +void __attribute__((format(printf, 2, 3))) buf_printf(struct buffer *buf, + const char *fmt, ...) { char tmp[SZ]; int len; va_list ap; - + va_start(ap, fmt); len = vsnprintf(tmp, SZ, fmt, ap); - if (buf->size - buf->pos < len + 1) { - buf->size += 128; - buf->p = realloc(buf->p, buf->size); - } - strncpy(buf->p + buf->pos, tmp, len + 1); - buf->pos += len; + buf_write(buf, tmp, len); va_end(ap); } -void -buf_write(struct buffer *buf, const char *s, int len) +void buf_write(struct buffer *buf, const char *s, int len) { if (buf->size - buf->pos < len) { - buf->size += len; + buf->size += len + SZ; buf->p = realloc(buf->p, buf->size); } strncpy(buf->p + buf->pos, s, len); buf->pos += len; } -/* Header for the generated file */ +static void check_for_gpl_usage(enum export exp, const char *m, const char *s) +{ + const char *e = is_vmlinux(m) ?"":".ko"; -void -add_header(struct buffer *b, struct module *mod) + switch (exp) { + case export_gpl: + fatal("modpost: GPL-incompatible module %s%s " + "uses GPL-only symbol '%s'\n", m, e, s); + break; + case export_unused_gpl: + fatal("modpost: GPL-incompatible module %s%s " + "uses GPL-only symbol marked UNUSED '%s'\n", m, e, s); + break; + case export_gpl_future: + warn("modpost: GPL-incompatible module %s%s " + "uses future GPL-only symbol '%s'\n", m, e, s); + break; + case export_plain: + case export_unused: + case export_unknown: + /* ignore */ + break; + } +} + +static void check_for_unused(enum export exp, const char* m, const char* s) +{ + const char *e = is_vmlinux(m) ?"":".ko"; + + switch (exp) { + case export_unused: + case export_unused_gpl: + warn("modpost: module %s%s " + "uses symbol '%s' marked UNUSED\n", m, e, s); + break; + default: + /* ignore */ + break; + } +} + +static void check_exports(struct module *mod) +{ + struct symbol *s, *exp; + + for (s = mod->unres; s; s = s->next) { + const char *basename; + exp = find_symbol(s->name); + if (!exp || exp->module == mod) + continue; + basename = strrchr(mod->name, '/'); + if (basename) + basename++; + else + basename = mod->name; + if (!mod->gpl_compatible) + check_for_gpl_usage(exp->export, basename, exp->name); + check_for_unused(exp->export, basename, exp->name); + } +} + +/** + * Header for the generated file + **/ +static void add_header(struct buffer *b, struct module *mod) { buf_printf(b, "#include \n"); buf_printf(b, "#include \n"); @@ -528,10 +1172,9 @@ add_header(struct buffer *b, struct module *mod) buf_printf(b, "\n"); buf_printf(b, "MODULE_INFO(vermagic, VERMAGIC_STRING);\n"); buf_printf(b, "\n"); - buf_printf(b, "#undef unix\n"); /* We have a module called "unix" */ buf_printf(b, "struct module __this_module\n"); buf_printf(b, "__attribute__((section(\".gnu.linkonce.this_module\"))) = {\n"); - buf_printf(b, " .name = __stringify(KBUILD_MODNAME),\n"); + buf_printf(b, " .name = KBUILD_MODNAME,\n"); if (mod->has_init) buf_printf(b, " .init = init_module,\n"); if (mod->has_cleanup) @@ -541,10 +1184,10 @@ add_header(struct buffer *b, struct module *mod) buf_printf(b, "};\n"); } -/* Record CRCs for unresolved symbols */ - -void -add_versions(struct buffer *b, struct module *mod) +/** + * Record CRCs for unresolved symbols + **/ +static void add_versions(struct buffer *b, struct module *mod) { struct symbol *s, *exp; @@ -552,8 +1195,8 @@ add_versions(struct buffer *b, struct module *mod) exp = find_symbol(s->name); if (!exp || exp->module == mod) { if (have_vmlinux && !s->weak) - fprintf(stderr, "*** Warning: \"%s\" [%s.ko] " - "undefined!\n", s->name, mod->name); + warn("\"%s\" [%s.ko] undefined!\n", + s->name, mod->name); continue; } s->module = exp->module; @@ -574,8 +1217,7 @@ add_versions(struct buffer *b, struct module *mod) continue; } if (!s->crc_valid) { - fprintf(stderr, "*** Warning: \"%s\" [%s.ko] " - "has no CRC!\n", + warn("\"%s\" [%s.ko] has no CRC!\n", s->name, mod->name); continue; } @@ -585,8 +1227,8 @@ add_versions(struct buffer *b, struct module *mod) buf_printf(b, "};\n"); } -void -add_depends(struct buffer *b, struct module *mod, struct module *modules) +static void add_depends(struct buffer *b, struct module *mod, + struct module *modules) { struct symbol *s; struct module *m; @@ -616,8 +1258,7 @@ add_depends(struct buffer *b, struct module *mod, struct module *modules) buf_printf(b, "\";\n"); } -void -add_srcversion(struct buffer *b, struct module *mod) +static void add_srcversion(struct buffer *b, struct module *mod) { if (mod->srcversion[0]) { buf_printf(b, "\n"); @@ -626,8 +1267,7 @@ add_srcversion(struct buffer *b, struct module *mod) } } -void -write_if_changed(struct buffer *b, const char *fname) +static void write_if_changed(struct buffer *b, const char *fname) { char *tmp; FILE *file; @@ -671,8 +1311,10 @@ write_if_changed(struct buffer *b, const char *fname) fclose(file); } -void -read_dump(const char *fname) +/* parse Module.symvers file. line format: + * 0x12345678symbolmodule[[export]something] + **/ +static void read_dump(const char *fname, unsigned int kernel) { unsigned long size, pos = 0; void *file = grab_file(fname, &size); @@ -683,9 +1325,10 @@ read_dump(const char *fname) return; while ((line = get_next_line(&pos, file, size))) { - char *symname, *modname, *d; + char *symname, *modname, *d, *export, *end; unsigned int crc; struct module *mod; + struct symbol *s; if (!(symname = strchr(line, '\t'))) goto fail; @@ -693,8 +1336,10 @@ read_dump(const char *fname) if (!(modname = strchr(symname, '\t'))) goto fail; *modname++ = '\0'; - if (strchr(modname, '\t')) - goto fail; + if ((export = strchr(modname, '\t')) != NULL) + *export++ = '\0'; + if (export && ((end = strchr(export, '\t')) != NULL)) + *end = '\0'; crc = strtoul(line, &d, 16); if (*symname == '\0' || *modname == '\0' || *d != '\0') goto fail; @@ -706,15 +1351,30 @@ read_dump(const char *fname) mod = new_module(NOFAIL(strdup(modname))); mod->skip = 1; } - add_exported_symbol(symname, mod, &crc); + s = sym_add_exported(symname, mod, export_no(export)); + s->kernel = kernel; + s->preloaded = 1; + sym_update_crc(symname, mod, crc, export_no(export)); } return; fail: fatal("parse error in symbol dump file\n"); } -void -write_dump(const char *fname) +/* For normal builds always dump all symbols. + * For external modules only dump symbols + * that are not read from kernel Module.symvers. + **/ +static int dump_sym(struct symbol *sym) +{ + if (!external_module) + return 1; + if (sym->vmlinux || sym->kernel) + return 0; + return 1; +} + +static void write_dump(const char *fname) { struct buffer buf = { }; struct symbol *symbol; @@ -723,34 +1383,34 @@ write_dump(const char *fname) for (n = 0; n < SYMBOL_HASH_SIZE ; n++) { symbol = symbolhash[n]; while (symbol) { - symbol = symbol->next; - } - } - - for (n = 0; n < SYMBOL_HASH_SIZE ; n++) { - symbol = symbolhash[n]; - while (symbol) { - buf_printf(&buf, "0x%08x\t%s\t%s\n", symbol->crc, - symbol->name, symbol->module->name); + if (dump_sym(symbol)) + buf_printf(&buf, "0x%08x\t%s\t%s\t%s\n", + symbol->crc, symbol->name, + symbol->module->name, + export_str(symbol->export)); symbol = symbol->next; } } write_if_changed(&buf, fname); } -int -main(int argc, char **argv) +int main(int argc, char **argv) { struct module *mod; struct buffer buf = { }; char fname[SZ]; - char *dump_read = NULL, *dump_write = NULL; + char *kernel_read = NULL, *module_read = NULL; + char *dump_write = NULL; int opt; - while ((opt = getopt(argc, argv, "i:mo:a")) != -1) { + while ((opt = getopt(argc, argv, "i:I:mo:a")) != -1) { switch(opt) { case 'i': - dump_read = optarg; + kernel_read = optarg; + break; + case 'I': + module_read = optarg; + external_module = 1; break; case 'm': modversions = 1; @@ -766,13 +1426,21 @@ main(int argc, char **argv) } } - if (dump_read) - read_dump(dump_read); + if (kernel_read) + read_dump(kernel_read, 1); + if (module_read) + read_dump(module_read, 0); while (optind < argc) { read_symbols(argv[optind++]); } + for (mod = modules; mod; mod = mod->next) { + if (mod->skip) + continue; + check_exports(mod); + } + for (mod = modules; mod; mod = mod->next) { if (mod->skip) continue; @@ -794,4 +1462,3 @@ main(int argc, char **argv) return 0; } - diff --git a/scripts/mod/modpost.h b/scripts/mod/modpost.h index 7334d8391..d398c61e5 100644 --- a/scripts/mod/modpost.h +++ b/scripts/mod/modpost.h @@ -13,22 +13,53 @@ #if KERNEL_ELFCLASS == ELFCLASS32 -#define Elf_Ehdr Elf32_Ehdr -#define Elf_Shdr Elf32_Shdr +#define Elf_Ehdr Elf32_Ehdr +#define Elf_Shdr Elf32_Shdr #define Elf_Sym Elf32_Sym +#define Elf_Addr Elf32_Addr +#define Elf_Section Elf32_Section #define ELF_ST_BIND ELF32_ST_BIND #define ELF_ST_TYPE ELF32_ST_TYPE +#define Elf_Rel Elf32_Rel +#define Elf_Rela Elf32_Rela +#define ELF_R_SYM ELF32_R_SYM +#define ELF_R_TYPE ELF32_R_TYPE #else -#define Elf_Ehdr Elf64_Ehdr -#define Elf_Shdr Elf64_Shdr +#define Elf_Ehdr Elf64_Ehdr +#define Elf_Shdr Elf64_Shdr #define Elf_Sym Elf64_Sym +#define Elf_Addr Elf64_Addr +#define Elf_Section Elf64_Section #define ELF_ST_BIND ELF64_ST_BIND #define ELF_ST_TYPE ELF64_ST_TYPE +#define Elf_Rel Elf64_Rel +#define Elf_Rela Elf64_Rela +#define ELF_R_SYM ELF64_R_SYM +#define ELF_R_TYPE ELF64_R_TYPE #endif +/* The 64-bit MIPS ELF ABI uses an unusual reloc format. */ +typedef struct +{ + Elf32_Word r_sym; /* Symbol index */ + unsigned char r_ssym; /* Special symbol for 2nd relocation */ + unsigned char r_type3; /* 3rd relocation type */ + unsigned char r_type2; /* 2nd relocation type */ + unsigned char r_type1; /* 1st relocation type */ +} _Elf64_Mips_R_Info; + +typedef union +{ + Elf64_Xword r_info_number; + _Elf64_Mips_R_Info r_info_fields; +} _Elf64_Mips_R_Info_union; + +#define ELF64_MIPS_R_SYM(i) \ + ((__extension__ (_Elf64_Mips_R_Info_union)(i)).r_info_fields.r_sym) + #if KERNEL_ELFDATA != HOST_ELFDATA static inline void __endian(const void *src, void *dest, unsigned int size) @@ -38,8 +69,6 @@ static inline void __endian(const void *src, void *dest, unsigned int size) ((unsigned char*)dest)[i] = ((unsigned char*)src)[size - i-1]; } - - #define TO_NATIVE(x) \ ({ \ typeof(x) __x; \ @@ -71,6 +100,7 @@ buf_write(struct buffer *buf, const char *s, int len); struct module { struct module *next; const char *name; + int gpl_compatible; struct symbol *unres; int seen; int skip; @@ -86,22 +116,32 @@ struct elf_info { Elf_Shdr *sechdrs; Elf_Sym *symtab_start; Elf_Sym *symtab_stop; + Elf_Section export_sec; + Elf_Section export_unused_sec; + Elf_Section export_gpl_sec; + Elf_Section export_unused_gpl_sec; + Elf_Section export_gpl_future_sec; const char *strtab; char *modinfo; unsigned int modinfo_len; }; +/* file2alias.c */ void handle_moddevtable(struct module *mod, struct elf_info *info, Elf_Sym *sym, const char *symname); - void add_moddevtable(struct buffer *buf, struct module *mod); +/* sumversion.c */ void maybe_frob_rcs_version(const char *modfilename, char *version, void *modinfo, unsigned long modinfo_offset); void get_src_version(const char *modname, char sum[], unsigned sumlen); +/* from modpost.c */ void *grab_file(const char *filename, unsigned long *size); char* get_next_line(unsigned long *pos, void *file, unsigned long size); void release_file(void *file, unsigned long size); + +void fatal(const char *fmt, ...); +void warn(const char *fmt, ...); diff --git a/scripts/package/mkspec b/scripts/package/mkspec index 6e7a58f14..df892841b 100644 --- a/scripts/package/mkspec +++ b/scripts/package/mkspec @@ -62,10 +62,24 @@ echo "" fi echo "%install" +echo "%ifarch ia64" +echo 'mkdir -p $RPM_BUILD_ROOT/boot/efi $RPM_BUILD_ROOT/lib $RPM_BUILD_ROOT/lib/modules' +echo "%else" echo 'mkdir -p $RPM_BUILD_ROOT/boot $RPM_BUILD_ROOT/lib $RPM_BUILD_ROOT/lib/modules' +echo "%endif" echo 'INSTALL_MOD_PATH=$RPM_BUILD_ROOT make %{_smp_mflags} modules_install' +echo "%ifarch ia64" +echo 'cp $KBUILD_IMAGE $RPM_BUILD_ROOT'"/boot/efi/vmlinuz-$KERNELRELEASE" +echo 'ln -s '"efi/vmlinuz-$KERNELRELEASE" '$RPM_BUILD_ROOT'"/boot/" +echo "%else" +echo "%ifarch ppc64" +echo "cp vmlinux arch/powerpc/boot" +echo "cp arch/powerpc/boot/"'$KBUILD_IMAGE $RPM_BUILD_ROOT'"/boot/vmlinuz-$KERNELRELEASE" +echo "%else" echo 'cp $KBUILD_IMAGE $RPM_BUILD_ROOT'"/boot/vmlinuz-$KERNELRELEASE" +echo "%endif" +echo "%endif" echo 'cp System.map $RPM_BUILD_ROOT'"/boot/System.map-$KERNELRELEASE" diff --git a/scripts/setlocalversion b/scripts/setlocalversion index 9a2382521..82e4993f0 100644 --- a/scripts/setlocalversion +++ b/scripts/setlocalversion @@ -11,12 +11,12 @@ cd "${1:-.}" || usage # Check for git and a git repo. if head=`git rev-parse --verify HEAD 2>/dev/null`; then # Do we have an untagged version? - if [ "`git name-rev --tags HEAD`" = "HEAD undefined" ]; then + if git name-rev --tags HEAD | grep -E '^HEAD[[:space:]]+(.*~[0-9]*|undefined)$' > /dev/null; then printf '%s%s' -g `echo "$head" | cut -c1-8` fi # Are there uncommitted changes? - if git diff-files | read dummy; then + if git diff-index HEAD | read dummy; then printf '%s' -dirty fi fi diff --git a/security/Kconfig b/security/Kconfig index 34f593410..67785df26 100644 --- a/security/Kconfig +++ b/security/Kconfig @@ -22,16 +22,22 @@ config KEYS If you are unsure as to whether this is required, answer N. config KEYS_DEBUG_PROC_KEYS - bool "Enable the /proc/keys file by which all keys may be viewed" + bool "Enable the /proc/keys file by which keys may be viewed" depends on KEYS help - This option turns on support for the /proc/keys file through which - all the keys on the system can be listed. + This option turns on support for the /proc/keys file - through which + can be listed all the keys on the system that are viewable by the + reading process. - This option is a slight security risk in that it makes it possible - for anyone to see all the keys on the system. Normally the manager - pretends keys that are inaccessible to a process don't exist as far - as that process is concerned. + The only keys included in the list are those that grant View + permission to the reading process whether or not it possesses them. + Note that LSM security checks are still performed, and may further + filter out keys that the current process is not authorised to view. + + Only key attributes are listed here; key payloads are not included in + the resulting table. + + If you are unsure as to whether this is required, answer N. config SECURITY bool "Enable different security models" diff --git a/security/capability.c b/security/capability.c index f9b35cc0b..b868e7eda 100644 --- a/security/capability.c +++ b/security/capability.c @@ -8,7 +8,6 @@ * */ -#include #include #include #include diff --git a/security/commoncap.c b/security/commoncap.c index cd90b22d7..a0b8d8252 100644 --- a/security/commoncap.c +++ b/security/commoncap.c @@ -8,7 +8,6 @@ */ #include -#include #include #include #include @@ -33,9 +32,9 @@ int cap_netlink_send(struct sock *sk, struct sk_buff *skb) EXPORT_SYMBOL(cap_netlink_send); -int cap_netlink_recv(struct sk_buff *skb) +int cap_netlink_recv(struct sk_buff *skb, int cap) { - if (!cap_raised(NETLINK_CB(skb).eff_cap, CAP_NET_ADMIN)) + if (!cap_raised(NETLINK_CB(skb).eff_cap, cap)) return -EPERM; return 0; } diff --git a/security/dummy.c b/security/dummy.c index 8ccccccc1..58c6d399c 100644 --- a/security/dummy.c +++ b/security/dummy.c @@ -15,7 +15,6 @@ #undef DEBUG #include -#include #include #include #include @@ -191,7 +190,7 @@ static int dummy_sb_kern_mount (struct super_block *sb, void *data) return 0; } -static int dummy_sb_statfs (struct super_block *sb) +static int dummy_sb_statfs (struct dentry *dentry) { return 0; } @@ -506,6 +505,9 @@ static int dummy_task_getsid (struct task_struct *p) return 0; } +static void dummy_task_getsecid (struct task_struct *p, u32 *secid) +{ } + static int dummy_task_setgroups (struct group_info *group_info) { return 0; @@ -516,6 +518,16 @@ static int dummy_task_setnice (struct task_struct *p, int nice) return 0; } +static int dummy_task_setioprio (struct task_struct *p, int ioprio) +{ + return 0; +} + +static int dummy_task_getioprio (struct task_struct *p) +{ + return 0; +} + static int dummy_task_setrlimit (unsigned int resource, struct rlimit *new_rlim) { return 0; @@ -532,13 +544,18 @@ static int dummy_task_getscheduler (struct task_struct *p) return 0; } +static int dummy_task_movememory (struct task_struct *p) +{ + return 0; +} + static int dummy_task_wait (struct task_struct *p) { return 0; } static int dummy_task_kill (struct task_struct *p, struct siginfo *info, - int sig) + int sig, u32 secid) { return 0; } @@ -665,9 +682,9 @@ static int dummy_netlink_send (struct sock *sk, struct sk_buff *skb) return 0; } -static int dummy_netlink_recv (struct sk_buff *skb) +static int dummy_netlink_recv (struct sk_buff *skb, int cap) { - if (!cap_raised (NETLINK_CB (skb).eff_cap, CAP_NET_ADMIN)) + if (!cap_raised (NETLINK_CB (skb).eff_cap, cap)) return -EPERM; return 0; } @@ -774,8 +791,7 @@ static int dummy_socket_getpeersec_stream(struct socket *sock, char __user *optv return -ENOPROTOOPT; } -static int dummy_socket_getpeersec_dgram(struct sk_buff *skb, char **secdata, - u32 *seclen) +static int dummy_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid) { return -ENOPROTOOPT; } @@ -810,6 +826,11 @@ static void dummy_xfrm_policy_free_security(struct xfrm_policy *xp) { } +static int dummy_xfrm_policy_delete_security(struct xfrm_policy *xp) +{ + return 0; +} + static int dummy_xfrm_state_alloc_security(struct xfrm_state *x, struct xfrm_user_sec_ctx *sec_ctx) { return 0; @@ -819,6 +840,11 @@ static void dummy_xfrm_state_free_security(struct xfrm_state *x) { } +static int dummy_xfrm_state_delete_security(struct xfrm_state *x) +{ + return 0; +} + static int dummy_xfrm_policy_lookup(struct xfrm_policy *xp, u32 sk_sid, u8 dir) { return 0; @@ -849,8 +875,18 @@ static int dummy_setprocattr(struct task_struct *p, char *name, void *value, siz return -EINVAL; } +static int dummy_secid_to_secctx(u32 secid, char **secdata, u32 *seclen) +{ + return -EOPNOTSUPP; +} + +static void dummy_release_secctx(char *secdata, u32 seclen) +{ +} + #ifdef CONFIG_KEYS -static inline int dummy_key_alloc(struct key *key) +static inline int dummy_key_alloc(struct key *key, struct task_struct *ctx, + unsigned long flags) { return 0; } @@ -960,11 +996,15 @@ void security_fixup_ops (struct security_operations *ops) set_to_dummy_if_null(ops, task_setpgid); set_to_dummy_if_null(ops, task_getpgid); set_to_dummy_if_null(ops, task_getsid); + set_to_dummy_if_null(ops, task_getsecid); set_to_dummy_if_null(ops, task_setgroups); set_to_dummy_if_null(ops, task_setnice); + set_to_dummy_if_null(ops, task_setioprio); + set_to_dummy_if_null(ops, task_getioprio); set_to_dummy_if_null(ops, task_setrlimit); set_to_dummy_if_null(ops, task_setscheduler); set_to_dummy_if_null(ops, task_getscheduler); + set_to_dummy_if_null(ops, task_movememory); set_to_dummy_if_null(ops, task_wait); set_to_dummy_if_null(ops, task_kill); set_to_dummy_if_null(ops, task_prctl); @@ -996,6 +1036,8 @@ void security_fixup_ops (struct security_operations *ops) set_to_dummy_if_null(ops, d_instantiate); set_to_dummy_if_null(ops, getprocattr); set_to_dummy_if_null(ops, setprocattr); + set_to_dummy_if_null(ops, secid_to_secctx); + set_to_dummy_if_null(ops, release_secctx); #ifdef CONFIG_SECURITY_NETWORK set_to_dummy_if_null(ops, unix_stream_connect); set_to_dummy_if_null(ops, unix_may_send); @@ -1024,8 +1066,10 @@ void security_fixup_ops (struct security_operations *ops) 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_policy_delete_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_state_delete_security); set_to_dummy_if_null(ops, xfrm_policy_lookup); #endif /* CONFIG_SECURITY_NETWORK_XFRM */ #ifdef CONFIG_KEYS diff --git a/security/inode.c b/security/inode.c index 0f77b0223..49ee51529 100644 --- a/security/inode.c +++ b/security/inode.c @@ -13,7 +13,6 @@ */ /* #define DEBUG */ -#include #include #include #include @@ -45,8 +44,8 @@ static ssize_t default_write_file(struct file *file, const char __user *buf, static int default_open(struct inode *inode, struct file *file) { - if (inode->u.generic_ip) - file->private_data = inode->u.generic_ip; + if (inode->i_private) + file->private_data = inode->i_private; return 0; } @@ -65,7 +64,6 @@ static struct inode *get_inode(struct super_block *sb, int mode, dev_t dev) inode->i_mode = mode; inode->i_uid = 0; inode->i_gid = 0; - inode->i_blksize = PAGE_CACHE_SIZE; inode->i_blocks = 0; inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; switch (mode & S_IFMT) { @@ -135,11 +133,11 @@ static int fill_super(struct super_block *sb, void *data, int silent) return simple_fill_super(sb, SECURITYFS_MAGIC, files); } -static struct super_block *get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, - void *data) +static int get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, + void *data, struct vfsmount *mnt) { - return get_sb_single(fs_type, flags, data, fill_super); + return get_sb_single(fs_type, flags, data, fill_super, mnt); } static struct file_system_type fs_type = { @@ -195,7 +193,7 @@ static int create_by_name(const char *name, mode_t mode, * directory dentry if set. If this paramater is NULL, then the * file will be created in the root of the securityfs filesystem. * @data: a pointer to something that the caller will want to get to later - * on. The inode.u.generic_ip pointer will point to this value on + * on. The inode.i_private pointer will point to this value on * the open() call. * @fops: a pointer to a struct file_operations that should be used for * this file. @@ -224,7 +222,7 @@ struct dentry *securityfs_create_file(const char *name, mode_t mode, pr_debug("securityfs: creating file '%s'\n",name); - error = simple_pin_fs("securityfs", &mount, &mount_count); + error = simple_pin_fs(&fs_type, &mount, &mount_count); if (error) { dentry = ERR_PTR(error); goto exit; @@ -241,7 +239,7 @@ struct dentry *securityfs_create_file(const char *name, mode_t mode, if (fops) dentry->d_inode->i_fop = fops; if (data) - dentry->d_inode->u.generic_ip = data; + dentry->d_inode->i_private = data; } exit: return dentry; diff --git a/security/keys/internal.h b/security/keys/internal.h index e066e6057..1bb416f4b 100644 --- a/security/keys/internal.h +++ b/security/keys/internal.h @@ -99,7 +99,9 @@ extern int install_process_keyring(struct task_struct *tsk); extern struct key *request_key_and_link(struct key_type *type, const char *description, const char *callout_info, - struct key *dest_keyring); + void *aux, + struct key *dest_keyring, + unsigned long flags); /* * request_key authorisation diff --git a/security/keys/key.c b/security/keys/key.c index b6061fa29..80de8c3e9 100644 --- a/security/keys/key.c +++ b/security/keys/key.c @@ -11,15 +11,16 @@ #include #include +#include #include #include #include #include +#include #include #include "internal.h" static kmem_cache_t *key_jar; -static key_serial_t key_serial_next = 3; struct rb_root key_serial_tree; /* tree of keys indexed by serial */ DEFINE_SPINLOCK(key_serial_lock); @@ -169,22 +170,23 @@ static void __init __key_insert_serial(struct key *key) /*****************************************************************************/ /* * assign a key the next unique serial number - * - we work through all the serial numbers between 2 and 2^31-1 in turn and - * then wrap + * - these are assigned randomly to avoid security issues through covert + * channel problems */ static inline void key_alloc_serial(struct key *key) { struct rb_node *parent, **p; struct key *xkey; - spin_lock(&key_serial_lock); - - /* propose a likely serial number and look for a hole for it in the + /* propose a random serial number and look for a hole for it in the * serial number tree */ - key->serial = key_serial_next; - if (key->serial < 3) - key->serial = 3; - key_serial_next = key->serial + 1; + do { + get_random_bytes(&key->serial, sizeof(key->serial)); + + key->serial >>= 1; /* negative numbers are not permitted */ + } while (key->serial < 3); + + spin_lock(&key_serial_lock); parent = NULL; p = &key_serial_tree.rb_node; @@ -204,19 +206,18 @@ static inline void key_alloc_serial(struct key *key) /* we found a key with the proposed serial number - walk the tree from * that point looking for the next unused serial number */ - serial_exists: +serial_exists: for (;;) { - key->serial = key_serial_next; + key->serial++; if (key->serial < 2) key->serial = 2; - key_serial_next = key->serial + 1; - if (!parent->rb_parent) + if (!rb_parent(parent)) p = &key_serial_tree.rb_node; - else if (parent->rb_parent->rb_left == parent) - p = &parent->rb_parent->rb_left; + else if (rb_parent(parent)->rb_left == parent) + p = &(rb_parent(parent)->rb_left); else - p = &parent->rb_parent->rb_right; + p = &(rb_parent(parent)->rb_right); parent = rb_next(parent); if (!parent) @@ -228,7 +229,7 @@ static inline void key_alloc_serial(struct key *key) } /* we've found a suitable hole - arrange for this key to occupy it */ - insert_here: +insert_here: rb_link_node(&key->serial_node, parent, p); rb_insert_color(&key->serial_node, &key_serial_tree); @@ -247,8 +248,8 @@ static inline void key_alloc_serial(struct key *key) * instantiate the key or discard it before returning */ struct key *key_alloc(struct key_type *type, const char *desc, - uid_t uid, gid_t gid, key_perm_t perm, - int not_in_quota) + uid_t uid, gid_t gid, struct task_struct *ctx, + key_perm_t perm, unsigned long flags) { struct key_user *user = NULL; struct key *key; @@ -269,12 +270,14 @@ struct key *key_alloc(struct key_type *type, const char *desc, /* check that the user's quota permits allocation of another key and * its description */ - if (!not_in_quota) { + if (!(flags & KEY_ALLOC_NOT_IN_QUOTA)) { spin_lock(&user->lock); - if (user->qnkeys + 1 >= KEYQUOTA_MAX_KEYS || - user->qnbytes + quotalen >= KEYQUOTA_MAX_BYTES - ) - goto no_quota; + if (!(flags & KEY_ALLOC_QUOTA_OVERRUN)) { + if (user->qnkeys + 1 >= KEYQUOTA_MAX_KEYS || + user->qnbytes + quotalen >= KEYQUOTA_MAX_BYTES + ) + goto no_quota; + } user->qnkeys++; user->qnbytes += quotalen; @@ -308,7 +311,7 @@ struct key *key_alloc(struct key_type *type, const char *desc, key->payload.data = NULL; key->security = NULL; - if (!not_in_quota) + if (!(flags & KEY_ALLOC_NOT_IN_QUOTA)) key->flags |= 1 << KEY_FLAG_IN_QUOTA; memset(&key->type_data, 0, sizeof(key->type_data)); @@ -318,7 +321,7 @@ struct key *key_alloc(struct key_type *type, const char *desc, #endif /* let the security module know about the key */ - ret = security_key_alloc(key); + ret = security_key_alloc(key, ctx, flags); if (ret < 0) goto security_error; @@ -332,7 +335,7 @@ error: security_error: kfree(key->description); kmem_cache_free(key_jar, key); - if (!not_in_quota) { + if (!(flags & KEY_ALLOC_NOT_IN_QUOTA)) { spin_lock(&user->lock); user->qnkeys--; user->qnbytes -= quotalen; @@ -345,7 +348,7 @@ security_error: no_memory_3: kmem_cache_free(key_jar, key); no_memory_2: - if (!not_in_quota) { + if (!(flags & KEY_ALLOC_NOT_IN_QUOTA)) { spin_lock(&user->lock); user->qnkeys--; user->qnbytes -= quotalen; @@ -761,7 +764,7 @@ key_ref_t key_create_or_update(key_ref_t keyring_ref, const char *description, const void *payload, size_t plen, - int not_in_quota) + unsigned long flags) { struct key_type *ktype; struct key *keyring, *key = NULL; @@ -822,7 +825,7 @@ key_ref_t key_create_or_update(key_ref_t keyring_ref, /* allocate a new key */ key = key_alloc(ktype, description, current->fsuid, current->fsgid, - perm, not_in_quota); + current, perm, flags); if (IS_ERR(key)) { key_ref = ERR_PTR(PTR_ERR(key)); goto error_3; @@ -907,6 +910,10 @@ void key_revoke(struct key *key) * it */ down_write(&key->sem); set_bit(KEY_FLAG_REVOKED, &key->flags); + + if (key->type->revoke) + key->type->revoke(key); + up_write(&key->sem); } /* end key_revoke() */ @@ -982,7 +989,7 @@ void unregister_key_type(struct key_type *ktype) if (key->type == ktype) { if (ktype->destroy) ktype->destroy(key); - memset(&key->payload, 0xbd, sizeof(key->payload)); + memset(&key->payload, KEY_DESTROY, sizeof(key->payload)); } } diff --git a/security/keys/keyctl.c b/security/keys/keyctl.c index ed71d86d2..d9ca15c10 100644 --- a/security/keys/keyctl.c +++ b/security/keys/keyctl.c @@ -102,7 +102,7 @@ asmlinkage long sys_add_key(const char __user *_type, /* create or update the requested key and add it to the target * keyring */ key_ref = key_create_or_update(keyring_ref, type, description, - payload, plen, 0); + payload, plen, KEY_ALLOC_IN_QUOTA); if (!IS_ERR(key_ref)) { ret = key_ref_to_ptr(key_ref)->serial; key_ref_put(key_ref); @@ -183,8 +183,9 @@ asmlinkage long sys_request_key(const char __user *_type, } /* do the search */ - key = request_key_and_link(ktype, description, callout_info, - key_ref_to_ptr(dest_ref)); + key = request_key_and_link(ktype, description, callout_info, NULL, + key_ref_to_ptr(dest_ref), + KEY_ALLOC_IN_QUOTA); if (IS_ERR(key)) { ret = PTR_ERR(key); goto error5; @@ -672,6 +673,7 @@ long keyctl_read_key(key_serial_t keyid, char __user *buffer, size_t buflen) */ long keyctl_chown_key(key_serial_t id, uid_t uid, gid_t gid) { + struct key_user *newowner, *zapowner = NULL; struct key *key; key_ref_t key_ref; long ret; @@ -695,19 +697,50 @@ long keyctl_chown_key(key_serial_t id, uid_t uid, gid_t gid) if (!capable(CAP_SYS_ADMIN)) { /* only the sysadmin can chown a key to some other UID */ if (uid != (uid_t) -1 && key->uid != uid) - goto no_access; + goto error_put; /* only the sysadmin can set the key's GID to a group other * than one of those that the current process subscribes to */ if (gid != (gid_t) -1 && gid != key->gid && !in_group_p(gid)) - goto no_access; + goto error_put; } - /* change the UID (have to update the quotas) */ + /* change the UID */ if (uid != (uid_t) -1 && uid != key->uid) { - /* don't support UID changing yet */ - ret = -EOPNOTSUPP; - goto no_access; + ret = -ENOMEM; + newowner = key_user_lookup(uid); + if (!newowner) + goto error_put; + + /* transfer the quota burden to the new user */ + if (test_bit(KEY_FLAG_IN_QUOTA, &key->flags)) { + spin_lock(&newowner->lock); + if (newowner->qnkeys + 1 >= KEYQUOTA_MAX_KEYS || + newowner->qnbytes + key->quotalen >= + KEYQUOTA_MAX_BYTES) + goto quota_overrun; + + newowner->qnkeys++; + newowner->qnbytes += key->quotalen; + spin_unlock(&newowner->lock); + + spin_lock(&key->user->lock); + key->user->qnkeys--; + key->user->qnbytes -= key->quotalen; + spin_unlock(&key->user->lock); + } + + atomic_dec(&key->user->nkeys); + atomic_inc(&newowner->nkeys); + + if (test_bit(KEY_FLAG_INSTANTIATED, &key->flags)) { + atomic_dec(&key->user->nikeys); + atomic_inc(&newowner->nikeys); + } + + zapowner = key->user; + key->user = newowner; + key->uid = uid; } /* change the GID */ @@ -716,12 +749,20 @@ long keyctl_chown_key(key_serial_t id, uid_t uid, gid_t gid) ret = 0; - no_access: +error_put: up_write(&key->sem); key_put(key); - error: + if (zapowner) + key_user_put(zapowner); +error: return ret; +quota_overrun: + spin_unlock(&newowner->lock); + zapowner = newowner; + ret = -EDQUOT; + goto error_put; + } /* end keyctl_chown_key() */ /*****************************************************************************/ diff --git a/security/keys/keyring.c b/security/keys/keyring.c index bffa924c1..e8d02acc5 100644 --- a/security/keys/keyring.c +++ b/security/keys/keyring.c @@ -49,6 +49,7 @@ static inline unsigned keyring_hash(const char *desc) static int keyring_instantiate(struct key *keyring, const void *data, size_t datalen); static int keyring_match(const struct key *keyring, const void *criterion); +static void keyring_revoke(struct key *keyring); static void keyring_destroy(struct key *keyring); static void keyring_describe(const struct key *keyring, struct seq_file *m); static long keyring_read(const struct key *keyring, @@ -59,6 +60,7 @@ struct key_type key_type_keyring = { .def_datalen = sizeof(struct keyring_list), .instantiate = keyring_instantiate, .match = keyring_match, + .revoke = keyring_revoke, .destroy = keyring_destroy, .describe = keyring_describe, .read = keyring_read, @@ -240,15 +242,16 @@ static long keyring_read(const struct key *keyring, * allocate a keyring and link into the destination keyring */ struct key *keyring_alloc(const char *description, uid_t uid, gid_t gid, - int not_in_quota, struct key *dest) + struct task_struct *ctx, unsigned long flags, + struct key *dest) { struct key *keyring; int ret; keyring = key_alloc(&key_type_keyring, description, - uid, gid, + uid, gid, ctx, (KEY_POS_ALL & ~KEY_POS_SETATTR) | KEY_USR_ALL, - not_in_quota); + flags); if (!IS_ERR(keyring)) { ret = key_instantiate_and_link(keyring, NULL, 0, dest, NULL); @@ -952,3 +955,22 @@ int keyring_clear(struct key *keyring) } /* end keyring_clear() */ EXPORT_SYMBOL(keyring_clear); + +/*****************************************************************************/ +/* + * dispose of the links from a revoked keyring + * - called with the key sem write-locked + */ +static void keyring_revoke(struct key *keyring) +{ + struct keyring_list *klist = keyring->payload.subscriptions; + + /* adjust the quota */ + key_payload_reserve(keyring, 0); + + if (klist) { + rcu_assign_pointer(keyring->payload.subscriptions, NULL); + call_rcu(&klist->rcu, keyring_clear_rcu_disposal); + } + +} /* end keyring_revoke() */ diff --git a/security/keys/proc.c b/security/keys/proc.c index 12b750e51..686a9ee0c 100644 --- a/security/keys/proc.c +++ b/security/keys/proc.c @@ -137,6 +137,13 @@ static int proc_keys_show(struct seq_file *m, void *v) struct timespec now; unsigned long timo; char xbuf[12]; + int rc; + + /* check whether the current task is allowed to view the key (assuming + * non-possession) */ + rc = key_task_permission(make_key_ref(key, 0), current, KEY_VIEW); + if (rc < 0) + return 0; now = current_kernel_time(); diff --git a/security/keys/process_keys.c b/security/keys/process_keys.c index 217a0bef3..32150cf7c 100644 --- a/security/keys/process_keys.c +++ b/security/keys/process_keys.c @@ -67,7 +67,8 @@ struct key root_session_keyring = { /* * allocate the keyrings to be associated with a UID */ -int alloc_uid_keyring(struct user_struct *user) +int alloc_uid_keyring(struct user_struct *user, + struct task_struct *ctx) { struct key *uid_keyring, *session_keyring; char buf[20]; @@ -76,7 +77,8 @@ int alloc_uid_keyring(struct user_struct *user) /* concoct a default session keyring */ sprintf(buf, "_uid_ses.%u", user->uid); - session_keyring = keyring_alloc(buf, user->uid, (gid_t) -1, 0, NULL); + session_keyring = keyring_alloc(buf, user->uid, (gid_t) -1, ctx, + KEY_ALLOC_IN_QUOTA, NULL); if (IS_ERR(session_keyring)) { ret = PTR_ERR(session_keyring); goto error; @@ -86,8 +88,8 @@ int alloc_uid_keyring(struct user_struct *user) * keyring */ sprintf(buf, "_uid.%u", user->uid); - uid_keyring = keyring_alloc(buf, user->uid, (gid_t) -1, 0, - session_keyring); + uid_keyring = keyring_alloc(buf, user->uid, (gid_t) -1, ctx, + KEY_ALLOC_IN_QUOTA, session_keyring); if (IS_ERR(uid_keyring)) { key_put(session_keyring); ret = PTR_ERR(uid_keyring); @@ -143,7 +145,8 @@ int install_thread_keyring(struct task_struct *tsk) sprintf(buf, "_tid.%u", tsk->pid); - keyring = keyring_alloc(buf, tsk->uid, tsk->gid, 1, NULL); + keyring = keyring_alloc(buf, tsk->uid, tsk->gid, tsk, + KEY_ALLOC_QUOTA_OVERRUN, NULL); if (IS_ERR(keyring)) { ret = PTR_ERR(keyring); goto error; @@ -177,7 +180,8 @@ int install_process_keyring(struct task_struct *tsk) if (!tsk->signal->process_keyring) { sprintf(buf, "_pid.%u", tsk->tgid); - keyring = keyring_alloc(buf, tsk->uid, tsk->gid, 1, NULL); + keyring = keyring_alloc(buf, tsk->uid, tsk->gid, tsk, + KEY_ALLOC_QUOTA_OVERRUN, NULL); if (IS_ERR(keyring)) { ret = PTR_ERR(keyring); goto error; @@ -208,6 +212,7 @@ error: static int install_session_keyring(struct task_struct *tsk, struct key *keyring) { + unsigned long flags; struct key *old; char buf[20]; @@ -217,7 +222,12 @@ static int install_session_keyring(struct task_struct *tsk, if (!keyring) { sprintf(buf, "_ses.%u", tsk->tgid); - keyring = keyring_alloc(buf, tsk->uid, tsk->gid, 1, NULL); + flags = KEY_ALLOC_QUOTA_OVERRUN; + if (tsk->signal->session_keyring) + flags = KEY_ALLOC_IN_QUOTA; + + keyring = keyring_alloc(buf, tsk->uid, tsk->gid, tsk, + flags, NULL); if (IS_ERR(keyring)) return PTR_ERR(keyring); } @@ -390,6 +400,8 @@ key_ref_t search_process_keyrings(struct key_type *type, struct request_key_auth *rka; key_ref_t key_ref, ret, err; + might_sleep(); + /* we want to return -EAGAIN or -ENOKEY if any of the keyrings were * searchable, but we failed to find a key or we found a negative key; * otherwise we want to return a sample error (probably -EACCES) if @@ -495,27 +507,35 @@ key_ref_t search_process_keyrings(struct key_type *type, */ if (context->request_key_auth && context == current && - type != &key_type_request_key_auth && - key_validate(context->request_key_auth) == 0 + type != &key_type_request_key_auth ) { - rka = context->request_key_auth->payload.data; + /* defend against the auth key being revoked */ + down_read(&context->request_key_auth->sem); - key_ref = search_process_keyrings(type, description, match, - rka->context); + if (key_validate(context->request_key_auth) == 0) { + rka = context->request_key_auth->payload.data; - if (!IS_ERR(key_ref)) - goto found; + key_ref = search_process_keyrings(type, description, + match, rka->context); - switch (PTR_ERR(key_ref)) { - case -EAGAIN: /* no key */ - if (ret) + up_read(&context->request_key_auth->sem); + + if (!IS_ERR(key_ref)) + goto found; + + switch (PTR_ERR(key_ref)) { + case -EAGAIN: /* no key */ + if (ret) + break; + case -ENOKEY: /* negative key */ + ret = key_ref; break; - case -ENOKEY: /* negative key */ - ret = key_ref; - break; - default: - err = key_ref; - break; + default: + err = key_ref; + break; + } + } else { + up_read(&context->request_key_auth->sem); } } @@ -717,7 +737,8 @@ long join_session_keyring(const char *name) keyring = find_keyring_by_name(name, 0); if (PTR_ERR(keyring) == -ENOKEY) { /* not found - try and create a new one */ - keyring = keyring_alloc(name, tsk->uid, tsk->gid, 0, NULL); + keyring = keyring_alloc(name, tsk->uid, tsk->gid, tsk, + KEY_ALLOC_IN_QUOTA, NULL); if (IS_ERR(keyring)) { ret = PTR_ERR(keyring); goto error2; diff --git a/security/keys/request_key.c b/security/keys/request_key.c index f030a0ccb..f573ac189 100644 --- a/security/keys/request_key.c +++ b/security/keys/request_key.c @@ -1,6 +1,6 @@ /* request_key.c: request a key from userspace * - * Copyright (C) 2004-5 Red Hat, Inc. All Rights Reserved. + * Copyright (C) 2004-6 Red Hat, Inc. All Rights Reserved. * Written by David Howells (dhowells@redhat.com) * * This program is free software; you can redistribute it and/or @@ -33,7 +33,8 @@ DECLARE_WAIT_QUEUE_HEAD(request_key_conswq); */ static int call_sbin_request_key(struct key *key, struct key *authkey, - const char *op) + const char *op, + void *aux) { struct task_struct *tsk = current; key_serial_t prkey, sskey; @@ -48,7 +49,8 @@ static int call_sbin_request_key(struct key *key, /* allocate a new session keyring */ sprintf(desc, "_req.%u", key->serial); - keyring = keyring_alloc(desc, current->fsuid, current->fsgid, 1, NULL); + keyring = keyring_alloc(desc, current->fsuid, current->fsgid, current, + KEY_ALLOC_QUOTA_OVERRUN, NULL); if (IS_ERR(keyring)) { ret = PTR_ERR(keyring); goto error_alloc; @@ -125,7 +127,9 @@ error_alloc: */ static struct key *__request_key_construction(struct key_type *type, const char *description, - const char *callout_info) + const char *callout_info, + void *aux, + unsigned long flags) { request_key_actor_t actor; struct key_construction cons; @@ -133,11 +137,12 @@ static struct key *__request_key_construction(struct key_type *type, struct key *key, *authkey; int ret, negated; - kenter("%s,%s,%s", type->name, description, callout_info); + kenter("%s,%s,%s,%lx", type->name, description, callout_info, flags); /* create a key and add it to the queue */ key = key_alloc(type, description, - current->fsuid, current->fsgid, KEY_POS_ALL, 0); + current->fsuid, current->fsgid, current, KEY_POS_ALL, + flags); if (IS_ERR(key)) goto alloc_failed; @@ -161,7 +166,7 @@ static struct key *__request_key_construction(struct key_type *type, actor = call_sbin_request_key; if (type->request_key) actor = type->request_key; - ret = actor(key, authkey, "create"); + ret = actor(key, authkey, "create", aux); if (ret < 0) goto request_failed; @@ -255,16 +260,18 @@ alloc_failed: */ static struct key *request_key_construction(struct key_type *type, const char *description, + const char *callout_info, + void *aux, struct key_user *user, - const char *callout_info) + unsigned long flags) { struct key_construction *pcons; struct key *key, *ckey; DECLARE_WAITQUEUE(myself, current); - kenter("%s,%s,{%d},%s", - type->name, description, user->uid, callout_info); + kenter("%s,%s,{%d},%s,%lx", + type->name, description, user->uid, callout_info, flags); /* see if there's such a key under construction already */ down_write(&key_construction_sem); @@ -280,7 +287,8 @@ static struct key *request_key_construction(struct key_type *type, } /* see about getting userspace to construct the key */ - key = __request_key_construction(type, description, callout_info); + key = __request_key_construction(type, description, callout_info, aux, + flags); error: kleave(" = %p", key); return key; @@ -387,14 +395,17 @@ static void request_key_link(struct key *key, struct key *dest_keyring) struct key *request_key_and_link(struct key_type *type, const char *description, const char *callout_info, - struct key *dest_keyring) + void *aux, + struct key *dest_keyring, + unsigned long flags) { struct key_user *user; struct key *key; key_ref_t key_ref; - kenter("%s,%s,%s,%p", - type->name, description, callout_info, dest_keyring); + kenter("%s,%s,%s,%p,%p,%lx", + type->name, description, callout_info, aux, + dest_keyring, flags); /* search all the process keyrings for a key */ key_ref = search_process_keyrings(type, description, type->match, @@ -427,7 +438,8 @@ struct key *request_key_and_link(struct key_type *type, /* ask userspace (returns NULL if it waited on a key * being constructed) */ key = request_key_construction(type, description, - user, callout_info); + callout_info, aux, + user, flags); if (key) break; @@ -483,8 +495,28 @@ struct key *request_key(struct key_type *type, const char *description, const char *callout_info) { - return request_key_and_link(type, description, callout_info, NULL); + return request_key_and_link(type, description, callout_info, NULL, + NULL, KEY_ALLOC_IN_QUOTA); } /* end request_key() */ EXPORT_SYMBOL(request_key); + +/*****************************************************************************/ +/* + * request a key with auxiliary data for the upcaller + * - search the process's keyrings + * - check the list of keys being created or updated + * - call out to userspace for a key if supplementary info was provided + */ +struct key *request_key_with_auxdata(struct key_type *type, + const char *description, + const char *callout_info, + void *aux) +{ + return request_key_and_link(type, description, callout_info, aux, + NULL, KEY_ALLOC_IN_QUOTA); + +} /* end request_key_with_auxdata() */ + +EXPORT_SYMBOL(request_key_with_auxdata); diff --git a/security/keys/request_key_auth.c b/security/keys/request_key_auth.c index cce6ba6b0..cbf58a91b 100644 --- a/security/keys/request_key_auth.c +++ b/security/keys/request_key_auth.c @@ -20,6 +20,7 @@ static int request_key_auth_instantiate(struct key *, const void *, size_t); static void request_key_auth_describe(const struct key *, struct seq_file *); +static void request_key_auth_revoke(struct key *); static void request_key_auth_destroy(struct key *); static long request_key_auth_read(const struct key *, char __user *, size_t); @@ -31,6 +32,7 @@ struct key_type key_type_request_key_auth = { .def_datalen = sizeof(struct request_key_auth), .instantiate = request_key_auth_instantiate, .describe = request_key_auth_describe, + .revoke = request_key_auth_revoke, .destroy = request_key_auth_destroy, .read = request_key_auth_read, }; @@ -91,6 +93,24 @@ static long request_key_auth_read(const struct key *key, } /* end request_key_auth_read() */ +/*****************************************************************************/ +/* + * handle revocation of an authorisation token key + * - called with the key sem write-locked + */ +static void request_key_auth_revoke(struct key *key) +{ + struct request_key_auth *rka = key->payload.data; + + kenter("{%d}", key->serial); + + if (rka->context) { + put_task_struct(rka->context); + rka->context = NULL; + } + +} /* end request_key_auth_revoke() */ + /*****************************************************************************/ /* * destroy an instantiation authorisation token key @@ -101,6 +121,11 @@ static void request_key_auth_destroy(struct key *key) kenter("{%d}", key->serial); + if (rka->context) { + put_task_struct(rka->context); + rka->context = NULL; + } + key_put(rka->target_key); kfree(rka); @@ -131,14 +156,26 @@ struct key *request_key_auth_new(struct key *target, const char *callout_info) * another process */ if (current->request_key_auth) { /* it is - use that instantiation context here too */ + down_read(¤t->request_key_auth->sem); + + /* if the auth key has been revoked, then the key we're + * servicing is already instantiated */ + if (test_bit(KEY_FLAG_REVOKED, + ¤t->request_key_auth->flags)) + goto auth_key_revoked; + irka = current->request_key_auth->payload.data; rka->context = irka->context; rka->pid = irka->pid; + get_task_struct(rka->context); + + up_read(¤t->request_key_auth->sem); } else { /* it isn't - use this process as the context */ rka->context = current; rka->pid = current->pid; + get_task_struct(rka->context); } rka->target_key = key_get(target); @@ -148,9 +185,9 @@ struct key *request_key_auth_new(struct key *target, const char *callout_info) sprintf(desc, "%x", target->serial); authkey = key_alloc(&key_type_request_key_auth, desc, - current->fsuid, current->fsgid, + current->fsuid, current->fsgid, current, KEY_POS_VIEW | KEY_POS_READ | KEY_POS_SEARCH | - KEY_USR_VIEW, 1); + KEY_USR_VIEW, KEY_ALLOC_NOT_IN_QUOTA); if (IS_ERR(authkey)) { ret = PTR_ERR(authkey); goto error_alloc; @@ -161,9 +198,15 @@ struct key *request_key_auth_new(struct key *target, const char *callout_info) if (ret < 0) goto error_inst; - kleave(" = {%d})", authkey->serial); + kleave(" = {%d}", authkey->serial); return authkey; +auth_key_revoked: + up_read(¤t->request_key_auth->sem); + kfree(rka); + kleave("= -EKEYREVOKED"); + return ERR_PTR(-EKEYREVOKED); + error_inst: key_revoke(authkey); key_put(authkey); diff --git a/security/keys/user_defined.c b/security/keys/user_defined.c index 8e71895b9..5bbfdebb7 100644 --- a/security/keys/user_defined.c +++ b/security/keys/user_defined.c @@ -28,6 +28,7 @@ struct key_type key_type_user = { .instantiate = user_instantiate, .update = user_update, .match = user_match, + .revoke = user_revoke, .destroy = user_destroy, .describe = user_describe, .read = user_read, @@ -67,6 +68,7 @@ error: return ret; } /* end user_instantiate() */ + EXPORT_SYMBOL_GPL(user_instantiate); /*****************************************************************************/ @@ -141,7 +143,28 @@ EXPORT_SYMBOL_GPL(user_match); /*****************************************************************************/ /* - * dispose of the data dangling from the corpse of a user + * dispose of the links from a revoked keyring + * - called with the key sem write-locked + */ +void user_revoke(struct key *key) +{ + struct user_key_payload *upayload = key->payload.data; + + /* clear the quota */ + key_payload_reserve(key, 0); + + if (upayload) { + rcu_assign_pointer(key->payload.data, NULL); + call_rcu(&upayload->rcu, user_update_rcu_disposal); + } + +} /* end user_revoke() */ + +EXPORT_SYMBOL(user_revoke); + +/*****************************************************************************/ +/* + * dispose of the data dangling from the corpse of a user key */ void user_destroy(struct key *key) { diff --git a/security/root_plug.c b/security/root_plug.c index 07651def2..38dd4f3e6 100644 --- a/security/root_plug.c +++ b/security/root_plug.c @@ -22,7 +22,6 @@ * License. */ -#include #include #include #include diff --git a/security/seclvl.c b/security/seclvl.c index 441beaf1b..c26dd7de0 100644 --- a/security/seclvl.c +++ b/security/seclvl.c @@ -16,7 +16,6 @@ * (at your option) any later version. */ -#include #include #include #include diff --git a/security/security.c b/security/security.c index 51ef50971..ee4e0701b 100644 --- a/security/security.c +++ b/security/security.c @@ -12,7 +12,6 @@ */ #include -#include #include #include #include diff --git a/security/selinux/Kconfig b/security/selinux/Kconfig index f636f53ca..4e98f66b3 100644 --- a/security/selinux/Kconfig +++ b/security/selinux/Kconfig @@ -1,6 +1,7 @@ config SECURITY_SELINUX bool "NSA SELinux Support" depends on SECURITY_NETWORK && AUDIT && NET && INET + select NETWORK_SECMARK default n help This selects NSA Security-Enhanced Linux (SELinux). @@ -95,3 +96,64 @@ config SECURITY_SELINUX_CHECKREQPROT_VALUE via /selinux/checkreqprot if authorized by policy. If you are unsure how to answer this question, answer 1. + +config SECURITY_SELINUX_ENABLE_SECMARK_DEFAULT + bool "NSA SELinux enable new secmark network controls by default" + depends on SECURITY_SELINUX + default n + help + This option determines whether the new secmark-based network + controls will be enabled by default. If not, the old internal + per-packet controls will be enabled by default, preserving + old behavior. + + If you enable the new controls, you will need updated + SELinux userspace libraries, tools and policy. Typically, + your distribution will provide these and enable the new controls + in the kernel they also distribute. + + Note that this option can be overriden at boot with the + selinux_compat_net parameter, and after boot via + /selinux/compat_net. See Documentation/kernel-parameters.txt + for details on this parameter. + + If you enable the new network controls, you will likely + also require the SECMARK and CONNSECMARK targets, as + well as any conntrack helpers for protocols which you + wish to control. + + If you are unsure what do do here, select N. + +config SECURITY_SELINUX_POLICYDB_VERSION_MAX + bool "NSA SELinux maximum supported policy format version" + depends on SECURITY_SELINUX + default n + help + This option enables the maximum policy format version supported + by SELinux to be set to a particular value. This value is reported + to userspace via /selinux/policyvers and used at policy load time. + It can be adjusted downward to support legacy userland (init) that + does not correctly handle kernels that support newer policy versions. + + Examples: For FC3 or FC4, enable this option and set the value via + the next option. For FC5 and later, do not enable this option. + + If you are unsure how to answer this question, answer N. + +config SECURITY_SELINUX_POLICYDB_VERSION_MAX_VALUE + int "NSA SELinux maximum supported policy format version value" + depends on SECURITY_SELINUX_POLICYDB_VERSION_MAX + range 15 21 + default 19 + help + This option sets the value for the maximum policy format version + supported by SELinux. + + Examples: For FC3, use 18. For FC4, use 19. + + If you are unsure how to answer this question, look for the + policy format version supported by your policy toolchain, by + running 'checkpolicy -V'. Or look at what policy you have + installed under /etc/selinux/$SELINUXTYPE/policy, where + SELINUXTYPE is defined in your /etc/selinux/config. + diff --git a/security/selinux/exports.c b/security/selinux/exports.c index ae4c73eb3..9d7737db5 100644 --- a/security/selinux/exports.c +++ b/security/selinux/exports.c @@ -72,3 +72,25 @@ void selinux_get_task_sid(struct task_struct *tsk, u32 *sid) *sid = 0; } +int selinux_string_to_sid(char *str, u32 *sid) +{ + if (selinux_enabled) + return security_context_to_sid(str, strlen(str), sid); + else { + *sid = 0; + return 0; + } +} +EXPORT_SYMBOL_GPL(selinux_string_to_sid); + +int selinux_relabel_packet_permission(u32 sid) +{ + if (selinux_enabled) { + struct task_security_struct *tsec = current->security; + + return avc_has_perm(tsec->sid, sid, SECCLASS_PACKET, + PACKET__RELABELTO, NULL); + } + return 0; +} +EXPORT_SYMBOL_GPL(selinux_relabel_packet_permission); diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 9fcb30dab..4d6ba97d4 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -18,11 +18,10 @@ * as published by the Free Software Foundation. */ -#include #include #include #include -#include +#include #include #include #include @@ -69,6 +68,7 @@ #include #include #include +#include #include "avc.h" #include "objsec.h" @@ -80,6 +80,7 @@ extern unsigned int policydb_loaded_version; extern int selinux_nlmsg_lookup(u16 sclass, u16 nlmsg_type, u32 *perm); +extern int selinux_compat_net; #ifdef CONFIG_SECURITY_SELINUX_DEVELOP int selinux_enforcing = 0; @@ -158,7 +159,7 @@ static int task_alloc_security(struct task_struct *task) return -ENOMEM; tsec->task = task; - tsec->osid = tsec->sid = tsec->ptrace_sid = SECINITSID_UNLABELED; + tsec->osid = tsec->sid = SECINITSID_UNLABELED; task->security = tsec; return 0; @@ -245,6 +246,7 @@ static int superblock_alloc_security(struct super_block *sb) sbsec->sb = sb; sbsec->sid = SECINITSID_UNLABELED; sbsec->def_sid = SECINITSID_FILE; + sbsec->mntpoint_sid = SECINITSID_UNLABELED; sb->s_security = sbsec; return 0; @@ -318,19 +320,53 @@ enum { Opt_context = 1, Opt_fscontext = 2, Opt_defcontext = 4, + Opt_rootcontext = 8, }; static match_table_t tokens = { {Opt_context, "context=%s"}, {Opt_fscontext, "fscontext=%s"}, {Opt_defcontext, "defcontext=%s"}, + {Opt_rootcontext, "rootcontext=%s"}, }; #define SEL_MOUNT_FAIL_MSG "SELinux: duplicate or incompatible mount options\n" +static int may_context_mount_sb_relabel(u32 sid, + struct superblock_security_struct *sbsec, + struct task_security_struct *tsec) +{ + int rc; + + rc = avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM, + FILESYSTEM__RELABELFROM, NULL); + if (rc) + return rc; + + rc = avc_has_perm(tsec->sid, sid, SECCLASS_FILESYSTEM, + FILESYSTEM__RELABELTO, NULL); + return rc; +} + +static int may_context_mount_inode_relabel(u32 sid, + struct superblock_security_struct *sbsec, + struct task_security_struct *tsec) +{ + int rc; + rc = avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM, + FILESYSTEM__RELABELFROM, NULL); + if (rc) + return rc; + + rc = avc_has_perm(sid, sbsec->sid, SECCLASS_FILESYSTEM, + FILESYSTEM__ASSOCIATE, NULL); + return rc; +} + static int try_context_mount(struct super_block *sb, void *data) { char *context = NULL, *defcontext = NULL; + char *fscontext = NULL, *rootcontext = NULL; const char *name; u32 sid; int alloc = 0, rc = 0, seen = 0; @@ -373,7 +409,7 @@ static int try_context_mount(struct super_block *sb, void *data) switch (token) { case Opt_context: - if (seen) { + if (seen & (Opt_context|Opt_defcontext)) { rc = -EINVAL; printk(KERN_WARNING SEL_MOUNT_FAIL_MSG); goto out_free; @@ -389,13 +425,13 @@ static int try_context_mount(struct super_block *sb, void *data) break; case Opt_fscontext: - if (seen & (Opt_context|Opt_fscontext)) { + if (seen & Opt_fscontext) { rc = -EINVAL; printk(KERN_WARNING SEL_MOUNT_FAIL_MSG); goto out_free; } - context = match_strdup(&args[0]); - if (!context) { + fscontext = match_strdup(&args[0]); + if (!fscontext) { rc = -ENOMEM; goto out_free; } @@ -404,6 +440,22 @@ static int try_context_mount(struct super_block *sb, void *data) seen |= Opt_fscontext; break; + case Opt_rootcontext: + if (seen & Opt_rootcontext) { + rc = -EINVAL; + printk(KERN_WARNING SEL_MOUNT_FAIL_MSG); + goto out_free; + } + rootcontext = match_strdup(&args[0]); + if (!rootcontext) { + rc = -ENOMEM; + goto out_free; + } + if (!alloc) + alloc = 1; + seen |= Opt_rootcontext; + break; + case Opt_defcontext: if (sbsec->behavior != SECURITY_FS_USE_XATTR) { rc = -EINVAL; @@ -440,6 +492,28 @@ static int try_context_mount(struct super_block *sb, void *data) if (!seen) goto out; + /* sets the context of the superblock for the fs being mounted. */ + if (fscontext) { + rc = security_context_to_sid(fscontext, strlen(fscontext), &sid); + if (rc) { + printk(KERN_WARNING "SELinux: security_context_to_sid" + "(%s) failed for (dev %s, type %s) errno=%d\n", + fscontext, sb->s_id, name, rc); + goto out_free; + } + + rc = may_context_mount_sb_relabel(sid, sbsec, tsec); + if (rc) + goto out_free; + + sbsec->sid = sid; + } + + /* + * Switch to using mount point labeling behavior. + * sets the label used on all file below the mountpoint, and will set + * the superblock context if not already set. + */ if (context) { rc = security_context_to_sid(context, strlen(context), &sid); if (rc) { @@ -449,20 +523,38 @@ static int try_context_mount(struct super_block *sb, void *data) goto out_free; } - rc = avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM, - FILESYSTEM__RELABELFROM, NULL); - if (rc) + if (!fscontext) { + rc = may_context_mount_sb_relabel(sid, sbsec, tsec); + if (rc) + goto out_free; + sbsec->sid = sid; + } else { + rc = may_context_mount_inode_relabel(sid, sbsec, tsec); + if (rc) + goto out_free; + } + sbsec->mntpoint_sid = sid; + + sbsec->behavior = SECURITY_FS_USE_MNTPOINT; + } + + if (rootcontext) { + struct inode *inode = sb->s_root->d_inode; + struct inode_security_struct *isec = inode->i_security; + rc = security_context_to_sid(rootcontext, strlen(rootcontext), &sid); + if (rc) { + printk(KERN_WARNING "SELinux: security_context_to_sid" + "(%s) failed for (dev %s, type %s) errno=%d\n", + rootcontext, sb->s_id, name, rc); goto out_free; + } - rc = avc_has_perm(tsec->sid, sid, SECCLASS_FILESYSTEM, - FILESYSTEM__RELABELTO, NULL); + rc = may_context_mount_inode_relabel(sid, sbsec, tsec); if (rc) goto out_free; - sbsec->sid = sid; - - if (seen & Opt_context) - sbsec->behavior = SECURITY_FS_USE_MNTPOINT; + isec->sid = sid; + isec->initialized = 1; } if (defcontext) { @@ -477,13 +569,7 @@ static int try_context_mount(struct super_block *sb, void *data) if (sid == sbsec->def_sid) goto out_free; - rc = avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM, - FILESYSTEM__RELABELFROM, NULL); - if (rc) - goto out_free; - - rc = avc_has_perm(sid, sbsec->sid, SECCLASS_FILESYSTEM, - FILESYSTEM__ASSOCIATE, NULL); + rc = may_context_mount_inode_relabel(sid, sbsec, tsec); if (rc) goto out_free; @@ -494,6 +580,8 @@ out_free: if (alloc) { kfree(context); kfree(defcontext); + kfree(fscontext); + kfree(rootcontext); } out: return rc; @@ -696,6 +784,8 @@ static inline u16 socket_type_to_security_class(int family, int type, int protoc return SECCLASS_PACKET_SOCKET; case PF_KEY: return SECCLASS_KEY_SOCKET; + case PF_APPLETALK: + return SECCLASS_APPLETALK_SOCKET; } return SECCLASS_SOCKET; @@ -873,8 +963,11 @@ static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dent goto out; isec->sid = sid; break; + case SECURITY_FS_USE_MNTPOINT: + isec->sid = sbsec->mntpoint_sid; + break; default: - /* Default to the fs SID. */ + /* Default to the fs superblock SID. */ isec->sid = sbsec->sid; if (sbsec->proc) { @@ -1096,6 +1189,17 @@ static int may_create(struct inode *dir, FILESYSTEM__ASSOCIATE, &ad); } +/* Check whether a task can create a key. */ +static int may_create_key(u32 ksid, + struct task_struct *ctx) +{ + struct task_security_struct *tsec; + + tsec = ctx->security; + + return avc_has_perm(tsec->sid, ksid, SECCLASS_KEY, KEY__CREATE, NULL); +} + #define MAY_LINK 0 #define MAY_UNLINK 1 #define MAY_RMDIR 2 @@ -1283,19 +1387,13 @@ static int inode_security_set_sid(struct inode *inode, u32 sid) static int selinux_ptrace(struct task_struct *parent, struct task_struct *child) { - struct task_security_struct *psec = parent->security; - struct task_security_struct *csec = child->security; int rc; rc = secondary_ops->ptrace(parent,child); if (rc) return rc; - rc = task_has_perm(parent, child, PROCESS__PTRACE); - /* Save the SID of the tracing process for later use in apply_creds. */ - if (!(child->ptrace & PT_PTRACED) && !rc) - csec->ptrace_sid = psec->sid; - return rc; + return task_has_perm(parent, child, PROCESS__PTRACE); } static int selinux_capget(struct task_struct *target, kernel_cap_t *effective, @@ -1518,8 +1616,10 @@ static int selinux_bprm_set_security(struct linux_binprm *bprm) /* Default to the current task SID. */ bsec->sid = tsec->sid; - /* Reset create SID on execve. */ + /* Reset fs, key, and sock SIDs on execve. */ tsec->create_sid = 0; + tsec->keycreate_sid = 0; + tsec->sockcreate_sid = 0; if (tsec->exec_sid) { newsid = tsec->exec_sid; @@ -1715,12 +1815,24 @@ static void selinux_bprm_apply_creds(struct linux_binprm *bprm, int unsafe) /* Check for ptracing, and update the task SID if ok. Otherwise, leave SID unchanged and kill. */ if (unsafe & (LSM_UNSAFE_PTRACE | LSM_UNSAFE_PTRACE_CAP)) { - rc = avc_has_perm(tsec->ptrace_sid, sid, - SECCLASS_PROCESS, PROCESS__PTRACE, - NULL); - if (rc) { - bsec->unsafe = 1; - return; + struct task_struct *t; + + rcu_read_lock(); + t = tracehook_tracer_task(current); + if (unlikely(t == NULL)) + rcu_read_unlock(); + else { + struct task_security_struct *sec = t->security; + u32 ptsid = sec->sid; + rcu_read_unlock(); + + rc = avc_has_perm(ptsid, sid, + SECCLASS_PROCESS, + PROCESS__PTRACE, NULL); + if (rc) { + bsec->unsafe = 1; + return; + } } } tsec->sid = sid; @@ -1827,7 +1939,8 @@ static inline int selinux_option(char *option, int len) { return (match_prefix("context=", sizeof("context=")-1, option, len) || match_prefix("fscontext=", sizeof("fscontext=")-1, option, len) || - match_prefix("defcontext=", sizeof("defcontext=")-1, option, len)); + match_prefix("defcontext=", sizeof("defcontext=")-1, option, len) || + match_prefix("rootcontext=", sizeof("rootcontext=")-1, option, len)); } static inline void take_option(char **to, char *from, int *first, int len) @@ -1900,13 +2013,13 @@ static int selinux_sb_kern_mount(struct super_block *sb, void *data) return superblock_has_perm(current, sb, FILESYSTEM__MOUNT, &ad); } -static int selinux_sb_statfs(struct super_block *sb) +static int selinux_sb_statfs(struct dentry *dentry) { struct avc_audit_data ad; AVC_AUDIT_DATA_INIT(&ad,FS); - ad.u.fs.dentry = sb->s_root; - return superblock_has_perm(current, sb, FILESYSTEM__GETATTR, &ad); + ad.u.fs.dentry = dentry->d_sb->s_root; + return superblock_has_perm(current, dentry->d_sb, FILESYSTEM__GETATTR, &ad); } static int selinux_mount(char * dev_name, @@ -2567,14 +2680,11 @@ static int selinux_task_alloc_security(struct task_struct *tsk) tsec2->osid = tsec1->osid; tsec2->sid = tsec1->sid; - /* Retain the exec and create SIDs across fork */ + /* Retain the exec, fs, key, and sock SIDs across fork */ tsec2->exec_sid = tsec1->exec_sid; tsec2->create_sid = tsec1->create_sid; - - /* Retain ptracer SID across fork, if any. - This will be reset by the ptrace hook upon any - subsequent ptrace_attach operations. */ - tsec2->ptrace_sid = tsec1->ptrace_sid; + tsec2->keycreate_sid = tsec1->keycreate_sid; + tsec2->sockcreate_sid = tsec1->sockcreate_sid; return 0; } @@ -2621,6 +2731,11 @@ static int selinux_task_getsid(struct task_struct *p) return task_has_perm(current, p, PROCESS__GETSESSION); } +static void selinux_task_getsecid(struct task_struct *p, u32 *secid) +{ + selinux_get_task_sid(p, secid); +} + static int selinux_task_setgroups(struct group_info *group_info) { /* See the comment for setuid above. */ @@ -2638,6 +2753,16 @@ static int selinux_task_setnice(struct task_struct *p, int nice) return task_has_perm(current,p, PROCESS__SETSCHED); } +static int selinux_task_setioprio(struct task_struct *p, int ioprio) +{ + return task_has_perm(current, p, PROCESS__SETSCHED); +} + +static int selinux_task_getioprio(struct task_struct *p) +{ + return task_has_perm(current, p, PROCESS__GETSCHED); +} + static int selinux_task_setrlimit(unsigned int resource, struct rlimit *new_rlim) { struct rlimit *old_rlim = current->signal->rlim + resource; @@ -2667,12 +2792,19 @@ static int selinux_task_getscheduler(struct task_struct *p) return task_has_perm(current, p, PROCESS__GETSCHED); } -static int selinux_task_kill(struct task_struct *p, struct siginfo *info, int sig) +static int selinux_task_movememory(struct task_struct *p) +{ + return task_has_perm(current, p, PROCESS__SETSCHED); +} + +static int selinux_task_kill(struct task_struct *p, struct siginfo *info, + int sig, u32 secid) { u32 perm; int rc; + struct task_security_struct *tsec; - rc = secondary_ops->task_kill(p, info, sig); + rc = secondary_ops->task_kill(p, info, sig, secid); if (rc) return rc; @@ -2683,8 +2815,12 @@ static int selinux_task_kill(struct task_struct *p, struct siginfo *info, int si perm = PROCESS__SIGNULL; /* null signal; existence test */ else perm = signal_to_av(sig); - - return task_has_perm(current, p, perm); + tsec = p->security; + if (secid) + rc = avc_has_perm(secid, tsec->sid, SECCLASS_PROCESS, perm, NULL); + else + rc = task_has_perm(current, p, perm); + return rc; } static int selinux_task_prctl(int option, @@ -2909,12 +3045,14 @@ static int selinux_socket_create(int family, int type, { int err = 0; struct task_security_struct *tsec; + u32 newsid; if (kern) goto out; tsec = current->security; - err = avc_has_perm(tsec->sid, tsec->sid, + newsid = tsec->sockcreate_sid ? : tsec->sid; + err = avc_has_perm(tsec->sid, newsid, socket_type_to_security_class(family, type, protocol), SOCKET__CREATE, NULL); @@ -2927,12 +3065,14 @@ static void selinux_socket_post_create(struct socket *sock, int family, { struct inode_security_struct *isec; struct task_security_struct *tsec; + u32 newsid; isec = SOCK_INODE(sock)->i_security; tsec = current->security; + newsid = tsec->sockcreate_sid ? : tsec->sid; isec->sclass = socket_type_to_security_class(family, type, protocol); - isec->sid = kern ? SECINITSID_KERNEL : tsec->sid; + isec->sid = kern ? SECINITSID_KERNEL : newsid; isec->initialized = 1; return; @@ -3210,47 +3350,17 @@ static int selinux_socket_unix_may_send(struct socket *sock, return 0; } -static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb) +static int selinux_sock_rcv_skb_compat(struct sock *sk, struct sk_buff *skb, + struct avc_audit_data *ad, u32 sock_sid, u16 sock_class, + u16 family, char *addrp, int len) { - u16 family; - char *addrp; - int len, err = 0; + int err = 0; u32 netif_perm, node_perm, node_sid, if_sid, recv_perm = 0; - u32 sock_sid = 0; - u16 sock_class = 0; - struct socket *sock; - struct net_device *dev; - struct avc_audit_data ad; - - family = sk->sk_family; - if (family != PF_INET && family != PF_INET6) - goto out; - - /* Handle mapped IPv4 packets arriving via IPv6 sockets */ - if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP)) - family = PF_INET; - - read_lock_bh(&sk->sk_callback_lock); - sock = sk->sk_socket; - if (sock) { - struct inode *inode; - inode = SOCK_INODE(sock); - if (inode) { - struct inode_security_struct *isec; - isec = inode->i_security; - sock_sid = isec->sid; - sock_class = isec->sclass; - } - } - read_unlock_bh(&sk->sk_callback_lock); - if (!sock_sid) - goto out; - dev = skb->dev; - if (!dev) + if (!skb->dev) goto out; - err = sel_netif_sids(dev, &if_sid, NULL); + err = sel_netif_sids(skb->dev, &if_sid, NULL); if (err) goto out; @@ -3273,44 +3383,88 @@ static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb) break; } - AVC_AUDIT_DATA_INIT(&ad, NET); - ad.u.net.netif = dev->name; - ad.u.net.family = family; - - err = selinux_parse_skb(skb, &ad, &addrp, &len, 1); - if (err) - goto out; - - err = avc_has_perm(sock_sid, if_sid, SECCLASS_NETIF, netif_perm, &ad); + err = avc_has_perm(sock_sid, if_sid, SECCLASS_NETIF, netif_perm, ad); if (err) goto out; - /* Fixme: this lookup is inefficient */ err = security_node_sid(family, addrp, len, &node_sid); if (err) goto out; - err = avc_has_perm(sock_sid, node_sid, SECCLASS_NODE, node_perm, &ad); + err = avc_has_perm(sock_sid, node_sid, SECCLASS_NODE, node_perm, ad); if (err) goto out; if (recv_perm) { u32 port_sid; - /* Fixme: make this more efficient */ err = security_port_sid(sk->sk_family, sk->sk_type, - sk->sk_protocol, ntohs(ad.u.net.sport), + sk->sk_protocol, ntohs(ad->u.net.sport), &port_sid); if (err) goto out; err = avc_has_perm(sock_sid, port_sid, - sock_class, recv_perm, &ad); + sock_class, recv_perm, ad); } - if (!err) - err = selinux_xfrm_sock_rcv_skb(sock_sid, skb); +out: + return err; +} + +static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb) +{ + u16 family; + u16 sock_class = 0; + char *addrp; + int len, err = 0; + u32 sock_sid = 0; + struct socket *sock; + struct avc_audit_data ad; + + family = sk->sk_family; + if (family != PF_INET && family != PF_INET6) + goto out; + /* Handle mapped IPv4 packets arriving via IPv6 sockets */ + if (family == PF_INET6 && skb->protocol == ntohs(ETH_P_IP)) + family = PF_INET; + + read_lock_bh(&sk->sk_callback_lock); + sock = sk->sk_socket; + if (sock) { + struct inode *inode; + inode = SOCK_INODE(sock); + if (inode) { + struct inode_security_struct *isec; + isec = inode->i_security; + sock_sid = isec->sid; + sock_class = isec->sclass; + } + } + read_unlock_bh(&sk->sk_callback_lock); + if (!sock_sid) + goto out; + + AVC_AUDIT_DATA_INIT(&ad, NET); + ad.u.net.netif = skb->dev ? skb->dev->name : "[unknown]"; + ad.u.net.family = family; + + err = selinux_parse_skb(skb, &ad, &addrp, &len, 1); + if (err) + goto out; + + if (selinux_compat_net) + err = selinux_sock_rcv_skb_compat(sk, skb, &ad, sock_sid, + sock_class, family, + addrp, len); + else + err = avc_has_perm(sock_sid, skb->secmark, SECCLASS_PACKET, + PACKET__RECV, &ad); + if (err) + goto out; + + err = selinux_xfrm_sock_rcv_skb(sock_sid, skb); out: return err; } @@ -3367,23 +3521,23 @@ out: return err; } -static int selinux_socket_getpeersec_dgram(struct sk_buff *skb, char **secdata, u32 *seclen) +static int selinux_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid) { + u32 peer_secid = SECSID_NULL; int err = 0; - u32 peer_sid = selinux_socket_getpeer_dgram(skb); - if (peer_sid == SECSID_NULL) - return -EINVAL; + if (sock && (sock->sk->sk_family == PF_UNIX)) + selinux_get_inode_sid(SOCK_INODE(sock), &peer_secid); + else if (skb) + peer_secid = selinux_socket_getpeer_dgram(skb); - err = security_sid_to_context(peer_sid, secdata, seclen); - if (err) - return err; + if (peer_secid == SECSID_NULL) + err = -EINVAL; + *secid = peer_secid; - return 0; + return err; } - - static int selinux_sk_alloc_security(struct sock *sk, int family, gfp_t priority) { return sk_alloc_security(sk, family, priority); @@ -3450,42 +3604,18 @@ out: #ifdef CONFIG_NETFILTER -static unsigned int selinux_ip_postroute_last(unsigned int hooknum, - struct sk_buff **pskb, - const struct net_device *in, - const struct net_device *out, - int (*okfn)(struct sk_buff *), - u16 family) +static int selinux_ip_postroute_last_compat(struct sock *sk, struct net_device *dev, + struct inode_security_struct *isec, + struct avc_audit_data *ad, + u16 family, char *addrp, int len) { - char *addrp; - int len, err = NF_ACCEPT; + int err; u32 netif_perm, node_perm, node_sid, if_sid, send_perm = 0; - struct sock *sk; - struct socket *sock; - struct inode *inode; - struct sk_buff *skb = *pskb; - struct inode_security_struct *isec; - struct avc_audit_data ad; - struct net_device *dev = (struct net_device *)out; - sk = skb->sk; - if (!sk) - goto out; - - sock = sk->sk_socket; - if (!sock) - goto out; - - inode = SOCK_INODE(sock); - if (!inode) - goto out; - err = sel_netif_sids(dev, &if_sid, NULL); if (err) goto out; - isec = inode->i_security; - switch (isec->sclass) { case SECCLASS_UDP_SOCKET: netif_perm = NETIF__UDP_SEND; @@ -3505,55 +3635,88 @@ static unsigned int selinux_ip_postroute_last(unsigned int hooknum, break; } - - AVC_AUDIT_DATA_INIT(&ad, NET); - ad.u.net.netif = dev->name; - ad.u.net.family = family; - - err = selinux_parse_skb(skb, &ad, &addrp, - &len, 0) ? NF_DROP : NF_ACCEPT; - if (err != NF_ACCEPT) - goto out; - - err = avc_has_perm(isec->sid, if_sid, SECCLASS_NETIF, - netif_perm, &ad) ? NF_DROP : NF_ACCEPT; - if (err != NF_ACCEPT) + err = avc_has_perm(isec->sid, if_sid, SECCLASS_NETIF, netif_perm, ad); + if (err) goto out; - /* Fixme: this lookup is inefficient */ - err = security_node_sid(family, addrp, len, - &node_sid) ? NF_DROP : NF_ACCEPT; - if (err != NF_ACCEPT) + err = security_node_sid(family, addrp, len, &node_sid); + if (err) goto out; - err = avc_has_perm(isec->sid, node_sid, SECCLASS_NODE, - node_perm, &ad) ? NF_DROP : NF_ACCEPT; - if (err != NF_ACCEPT) + err = avc_has_perm(isec->sid, node_sid, SECCLASS_NODE, node_perm, ad); + if (err) goto out; if (send_perm) { u32 port_sid; - /* Fixme: make this more efficient */ err = security_port_sid(sk->sk_family, sk->sk_type, sk->sk_protocol, - ntohs(ad.u.net.dport), - &port_sid) ? NF_DROP : NF_ACCEPT; - if (err != NF_ACCEPT) + ntohs(ad->u.net.dport), + &port_sid); + if (err) goto out; err = avc_has_perm(isec->sid, port_sid, isec->sclass, - send_perm, &ad) ? NF_DROP : NF_ACCEPT; + send_perm, ad); } +out: + return err; +} + +static unsigned int selinux_ip_postroute_last(unsigned int hooknum, + struct sk_buff **pskb, + const struct net_device *in, + const struct net_device *out, + int (*okfn)(struct sk_buff *), + u16 family) +{ + char *addrp; + int len, err = 0; + struct sock *sk; + struct socket *sock; + struct inode *inode; + struct sk_buff *skb = *pskb; + struct inode_security_struct *isec; + struct avc_audit_data ad; + struct net_device *dev = (struct net_device *)out; - if (err != NF_ACCEPT) + sk = skb->sk; + if (!sk) goto out; - err = selinux_xfrm_postroute_last(isec->sid, skb); + sock = sk->sk_socket; + if (!sock) + goto out; + + inode = SOCK_INODE(sock); + if (!inode) + goto out; + + isec = inode->i_security; + + AVC_AUDIT_DATA_INIT(&ad, NET); + ad.u.net.netif = dev->name; + ad.u.net.family = family; + err = selinux_parse_skb(skb, &ad, &addrp, &len, 0); + if (err) + goto out; + + if (selinux_compat_net) + err = selinux_ip_postroute_last_compat(sk, dev, isec, &ad, + family, addrp, len); + else + err = avc_has_perm(isec->sid, skb->secmark, SECCLASS_PACKET, + PACKET__SEND, &ad); + + if (err) + goto out; + + err = selinux_xfrm_postroute_last(isec->sid, skb); out: - return err; + return err ? NF_DROP : NF_ACCEPT; } static unsigned int selinux_ipv4_postroute_last(unsigned int hooknum, @@ -3582,32 +3745,32 @@ static unsigned int selinux_ipv6_postroute_last(unsigned int hooknum, static int selinux_netlink_send(struct sock *sk, struct sk_buff *skb) { - struct task_security_struct *tsec; - struct av_decision avd; int err; err = secondary_ops->netlink_send(sk, skb); if (err) return err; - tsec = current->security; - - avd.allowed = 0; - avc_has_perm_noaudit(tsec->sid, tsec->sid, - SECCLASS_CAPABILITY, ~0, &avd); - cap_mask(NETLINK_CB(skb).eff_cap, avd.allowed); - if (policydb_loaded_version >= POLICYDB_VERSION_NLCLASS) err = selinux_nlmsg_perm(sk, skb); return err; } -static int selinux_netlink_recv(struct sk_buff *skb) +static int selinux_netlink_recv(struct sk_buff *skb, int capability) { - if (!cap_raised(NETLINK_CB(skb).eff_cap, CAP_NET_ADMIN)) - return -EPERM; - return 0; + int err; + struct avc_audit_data ad; + + err = secondary_ops->netlink_recv(skb, capability); + if (err) + return err; + + AVC_AUDIT_DATA_INIT(&ad, CAP); + ad.u.cap = capability; + + return avc_has_perm(NETLINK_CB(skb).sid, NETLINK_CB(skb).sid, + SECCLASS_CAPABILITY, CAP_TO_MASK(capability), &ad); } static int ipc_alloc_security(struct task_struct *task, @@ -4110,6 +4273,10 @@ static int selinux_getprocattr(struct task_struct *p, sid = tsec->exec_sid; else if (!strcmp(name, "fscreate")) sid = tsec->create_sid; + else if (!strcmp(name, "keycreate")) + sid = tsec->keycreate_sid; + else if (!strcmp(name, "sockcreate")) + sid = tsec->sockcreate_sid; else return -EINVAL; @@ -4123,6 +4290,7 @@ static int selinux_setprocattr(struct task_struct *p, char *name, void *value, size_t size) { struct task_security_struct *tsec; + struct task_struct *tracer; u32 sid = 0; int error; char *str = value; @@ -4142,6 +4310,10 @@ static int selinux_setprocattr(struct task_struct *p, error = task_has_perm(current, p, PROCESS__SETEXEC); else if (!strcmp(name, "fscreate")) error = task_has_perm(current, p, PROCESS__SETFSCREATE); + else if (!strcmp(name, "keycreate")) + error = task_has_perm(current, p, PROCESS__SETKEYCREATE); + else if (!strcmp(name, "sockcreate")) + error = task_has_perm(current, p, PROCESS__SETSOCKCREATE); else if (!strcmp(name, "current")) error = task_has_perm(current, p, PROCESS__SETCURRENT); else @@ -4171,6 +4343,13 @@ static int selinux_setprocattr(struct task_struct *p, tsec->exec_sid = sid; else if (!strcmp(name, "fscreate")) tsec->create_sid = sid; + else if (!strcmp(name, "keycreate")) { + error = may_create_key(sid, p); + if (error) + return error; + tsec->keycreate_sid = sid; + } else if (!strcmp(name, "sockcreate")) + tsec->sockcreate_sid = sid; else if (!strcmp(name, "current")) { struct av_decision avd; @@ -4200,18 +4379,24 @@ static int selinux_setprocattr(struct task_struct *p, /* Check for ptracing, and update the task SID if ok. Otherwise, leave SID unchanged and fail. */ task_lock(p); - if (p->ptrace & PT_PTRACED) { - error = avc_has_perm_noaudit(tsec->ptrace_sid, sid, + rcu_read_lock(); + tracer = tracehook_tracer_task(p); + if (tracer != NULL) { + struct task_security_struct *ptsec = tracer->security; + u32 ptsid = ptsec->sid; + rcu_read_unlock(); + error = avc_has_perm_noaudit(ptsid, sid, SECCLASS_PROCESS, PROCESS__PTRACE, &avd); if (!error) tsec->sid = sid; task_unlock(p); - avc_audit(tsec->ptrace_sid, sid, SECCLASS_PROCESS, + avc_audit(ptsid, sid, SECCLASS_PROCESS, PROCESS__PTRACE, &avd, error, NULL); if (error) return error; } else { + rcu_read_unlock(); tsec->sid = sid; task_unlock(p); } @@ -4222,6 +4407,72 @@ static int selinux_setprocattr(struct task_struct *p, return size; } +static int selinux_secid_to_secctx(u32 secid, char **secdata, u32 *seclen) +{ + return security_sid_to_context(secid, secdata, seclen); +} + +static void selinux_release_secctx(char *secdata, u32 seclen) +{ + if (secdata) + kfree(secdata); +} + +#ifdef CONFIG_KEYS + +static int selinux_key_alloc(struct key *k, struct task_struct *tsk, + unsigned long flags) +{ + struct task_security_struct *tsec = tsk->security; + struct key_security_struct *ksec; + + ksec = kzalloc(sizeof(struct key_security_struct), GFP_KERNEL); + if (!ksec) + return -ENOMEM; + + ksec->obj = k; + if (tsec->keycreate_sid) + ksec->sid = tsec->keycreate_sid; + else + ksec->sid = tsec->sid; + k->security = ksec; + + return 0; +} + +static void selinux_key_free(struct key *k) +{ + struct key_security_struct *ksec = k->security; + + k->security = NULL; + kfree(ksec); +} + +static int selinux_key_permission(key_ref_t key_ref, + struct task_struct *ctx, + key_perm_t perm) +{ + struct key *key; + struct task_security_struct *tsec; + struct key_security_struct *ksec; + + key = key_ref_to_ptr(key_ref); + + tsec = ctx->security; + ksec = key->security; + + /* if no specific permissions are requested, we skip the + permission check. No serious, additional covert channels + appear to be created. */ + if (perm == 0) + return 0; + + return avc_has_perm(tsec->sid, ksec->sid, + SECCLASS_KEY, perm, NULL); +} + +#endif + static struct security_operations selinux_ops = { .ptrace = selinux_ptrace, .capget = selinux_capget, @@ -4300,11 +4551,15 @@ static struct security_operations selinux_ops = { .task_setpgid = selinux_task_setpgid, .task_getpgid = selinux_task_getpgid, .task_getsid = selinux_task_getsid, + .task_getsecid = selinux_task_getsecid, .task_setgroups = selinux_task_setgroups, .task_setnice = selinux_task_setnice, + .task_setioprio = selinux_task_setioprio, + .task_getioprio = selinux_task_getioprio, .task_setrlimit = selinux_task_setrlimit, .task_setscheduler = selinux_task_setscheduler, .task_getscheduler = selinux_task_getscheduler, + .task_movememory = selinux_task_movememory, .task_kill = selinux_task_kill, .task_wait = selinux_task_wait, .task_prctl = selinux_task_prctl, @@ -4343,6 +4598,9 @@ static struct security_operations selinux_ops = { .getprocattr = selinux_getprocattr, .setprocattr = selinux_setprocattr, + .secid_to_secctx = selinux_secid_to_secctx, + .release_secctx = selinux_release_secctx, + .unix_stream_connect = selinux_socket_unix_stream_connect, .unix_may_send = selinux_socket_unix_may_send, @@ -4370,10 +4628,18 @@ static struct security_operations selinux_ops = { .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_policy_delete_security = selinux_xfrm_policy_delete, .xfrm_state_alloc_security = selinux_xfrm_state_alloc, .xfrm_state_free_security = selinux_xfrm_state_free, + .xfrm_state_delete_security = selinux_xfrm_state_delete, .xfrm_policy_lookup = selinux_xfrm_policy_lookup, #endif + +#ifdef CONFIG_KEYS + .key_alloc = selinux_key_alloc, + .key_free = selinux_key_free, + .key_permission = selinux_key_permission, +#endif }; static __init int selinux_init(void) @@ -4409,6 +4675,15 @@ static __init int selinux_init(void) } else { printk(KERN_INFO "SELinux: Starting in permissive mode\n"); } + +#ifdef CONFIG_KEYS + /* Add security information to initial keyrings */ + selinux_key_alloc(&root_user_keyring, current, + KEY_ALLOC_NOT_IN_QUOTA); + selinux_key_alloc(&root_session_keyring, current, + KEY_ALLOC_NOT_IN_QUOTA); +#endif + return 0; } diff --git a/security/selinux/include/av_inherit.h b/security/selinux/include/av_inherit.h index b0e6b1293..a68fdd555 100644 --- a/security/selinux/include/av_inherit.h +++ b/security/selinux/include/av_inherit.h @@ -29,3 +29,4 @@ S_(SECCLASS_NETLINK_IP6FW_SOCKET, socket, 0x00400000UL) S_(SECCLASS_NETLINK_DNRT_SOCKET, socket, 0x00400000UL) S_(SECCLASS_NETLINK_KOBJECT_UEVENT_SOCKET, socket, 0x00400000UL) + S_(SECCLASS_APPLETALK_SOCKET, socket, 0x00400000UL) diff --git a/security/selinux/include/av_perm_to_string.h b/security/selinux/include/av_perm_to_string.h index 591e98d93..7c9b58380 100644 --- a/security/selinux/include/av_perm_to_string.h +++ b/security/selinux/include/av_perm_to_string.h @@ -72,6 +72,8 @@ S_(SECCLASS_PROCESS, PROCESS__EXECMEM, "execmem") S_(SECCLASS_PROCESS, PROCESS__EXECSTACK, "execstack") S_(SECCLASS_PROCESS, PROCESS__EXECHEAP, "execheap") + S_(SECCLASS_PROCESS, PROCESS__SETKEYCREATE, "setkeycreate") + S_(SECCLASS_PROCESS, PROCESS__SETSOCKCREATE, "setsockcreate") S_(SECCLASS_MSGQ, MSGQ__ENQUEUE, "enqueue") S_(SECCLASS_MSG, MSG__SEND, "send") S_(SECCLASS_MSG, MSG__RECEIVE, "receive") @@ -239,3 +241,13 @@ S_(SECCLASS_ASSOCIATION, ASSOCIATION__SENDTO, "sendto") S_(SECCLASS_ASSOCIATION, ASSOCIATION__RECVFROM, "recvfrom") S_(SECCLASS_ASSOCIATION, ASSOCIATION__SETCONTEXT, "setcontext") + S_(SECCLASS_PACKET, PACKET__SEND, "send") + S_(SECCLASS_PACKET, PACKET__RECV, "recv") + S_(SECCLASS_PACKET, PACKET__RELABELTO, "relabelto") + S_(SECCLASS_KEY, KEY__VIEW, "view") + S_(SECCLASS_KEY, KEY__READ, "read") + S_(SECCLASS_KEY, KEY__WRITE, "write") + S_(SECCLASS_KEY, KEY__SEARCH, "search") + S_(SECCLASS_KEY, KEY__LINK, "link") + S_(SECCLASS_KEY, KEY__SETATTR, "setattr") + S_(SECCLASS_KEY, KEY__CREATE, "create") diff --git a/security/selinux/include/av_permissions.h b/security/selinux/include/av_permissions.h index d7f02edf3..69fd4b482 100644 --- a/security/selinux/include/av_permissions.h +++ b/security/selinux/include/av_permissions.h @@ -467,6 +467,8 @@ #define PROCESS__EXECMEM 0x02000000UL #define PROCESS__EXECSTACK 0x04000000UL #define PROCESS__EXECHEAP 0x08000000UL +#define PROCESS__SETKEYCREATE 0x10000000UL +#define PROCESS__SETSOCKCREATE 0x20000000UL #define IPC__CREATE 0x00000001UL #define IPC__DESTROY 0x00000002UL @@ -933,3 +935,37 @@ #define NETLINK_KOBJECT_UEVENT_SOCKET__SEND_MSG 0x00100000UL #define NETLINK_KOBJECT_UEVENT_SOCKET__NAME_BIND 0x00200000UL +#define APPLETALK_SOCKET__IOCTL 0x00000001UL +#define APPLETALK_SOCKET__READ 0x00000002UL +#define APPLETALK_SOCKET__WRITE 0x00000004UL +#define APPLETALK_SOCKET__CREATE 0x00000008UL +#define APPLETALK_SOCKET__GETATTR 0x00000010UL +#define APPLETALK_SOCKET__SETATTR 0x00000020UL +#define APPLETALK_SOCKET__LOCK 0x00000040UL +#define APPLETALK_SOCKET__RELABELFROM 0x00000080UL +#define APPLETALK_SOCKET__RELABELTO 0x00000100UL +#define APPLETALK_SOCKET__APPEND 0x00000200UL +#define APPLETALK_SOCKET__BIND 0x00000400UL +#define APPLETALK_SOCKET__CONNECT 0x00000800UL +#define APPLETALK_SOCKET__LISTEN 0x00001000UL +#define APPLETALK_SOCKET__ACCEPT 0x00002000UL +#define APPLETALK_SOCKET__GETOPT 0x00004000UL +#define APPLETALK_SOCKET__SETOPT 0x00008000UL +#define APPLETALK_SOCKET__SHUTDOWN 0x00010000UL +#define APPLETALK_SOCKET__RECVFROM 0x00020000UL +#define APPLETALK_SOCKET__SENDTO 0x00040000UL +#define APPLETALK_SOCKET__RECV_MSG 0x00080000UL +#define APPLETALK_SOCKET__SEND_MSG 0x00100000UL +#define APPLETALK_SOCKET__NAME_BIND 0x00200000UL + +#define PACKET__SEND 0x00000001UL +#define PACKET__RECV 0x00000002UL +#define PACKET__RELABELTO 0x00000004UL + +#define KEY__VIEW 0x00000001UL +#define KEY__READ 0x00000002UL +#define KEY__WRITE 0x00000004UL +#define KEY__SEARCH 0x00000008UL +#define KEY__LINK 0x00000010UL +#define KEY__SETATTR 0x00000020UL +#define KEY__CREATE 0x00000040UL diff --git a/security/selinux/include/class_to_string.h b/security/selinux/include/class_to_string.h index 77b2c5996..24303b613 100644 --- a/security/selinux/include/class_to_string.h +++ b/security/selinux/include/class_to_string.h @@ -58,3 +58,6 @@ S_("nscd") S_("association") S_("netlink_kobject_uevent_socket") + S_("appletalk_socket") + S_("packet") + S_("key") diff --git a/security/selinux/include/flask.h b/security/selinux/include/flask.h index eb9f50823..95887aed2 100644 --- a/security/selinux/include/flask.h +++ b/security/selinux/include/flask.h @@ -60,6 +60,9 @@ #define SECCLASS_NSCD 53 #define SECCLASS_ASSOCIATION 54 #define SECCLASS_NETLINK_KOBJECT_UEVENT_SOCKET 55 +#define SECCLASS_APPLETALK_SOCKET 56 +#define SECCLASS_PACKET 57 +#define SECCLASS_KEY 58 /* * Security identifier indices for initial entities diff --git a/security/selinux/include/objsec.h b/security/selinux/include/objsec.h index 54c030778..116b17bda 100644 --- a/security/selinux/include/objsec.h +++ b/security/selinux/include/objsec.h @@ -32,7 +32,8 @@ struct task_security_struct { u32 sid; /* current SID */ u32 exec_sid; /* exec SID */ u32 create_sid; /* fscreate SID */ - u32 ptrace_sid; /* SID of ptrace parent */ + u32 keycreate_sid; /* keycreate SID */ + u32 sockcreate_sid; /* fscreate SID */ }; struct inode_security_struct { @@ -55,8 +56,9 @@ struct file_security_struct { struct superblock_security_struct { struct super_block *sb; /* back pointer to sb object */ struct list_head list; /* list of superblock_security_struct */ - u32 sid; /* SID of file system */ + u32 sid; /* SID of file system superblock */ u32 def_sid; /* default SID for labeling */ + u32 mntpoint_sid; /* SECURITY_FS_USE_MNTPOINT context for files */ unsigned int behavior; /* labeling behavior */ unsigned char initialized; /* initialization flag */ unsigned char proc; /* proc fs */ @@ -99,6 +101,11 @@ struct sk_security_struct { u32 peer_sid; /* SID of peer */ }; +struct key_security_struct { + struct key *obj; /* back pointer */ + u32 sid; /* SID of key */ +}; + extern unsigned int selinux_checkreqprot; #endif /* _SELINUX_OBJSEC_H_ */ diff --git a/security/selinux/include/security.h b/security/selinux/include/security.h index 063af47bb..c28b7934a 100644 --- a/security/selinux/include/security.h +++ b/security/selinux/include/security.h @@ -24,10 +24,15 @@ #define POLICYDB_VERSION_VALIDATETRANS 19 #define POLICYDB_VERSION_MLS 19 #define POLICYDB_VERSION_AVTAB 20 +#define POLICYDB_VERSION_RANGETRANS 21 /* Range of policy versions we understand*/ #define POLICYDB_VERSION_MIN POLICYDB_VERSION_BASE -#define POLICYDB_VERSION_MAX POLICYDB_VERSION_AVTAB +#ifdef CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX +#define POLICYDB_VERSION_MAX CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX_VALUE +#else +#define POLICYDB_VERSION_MAX POLICYDB_VERSION_RANGETRANS +#endif extern int selinux_enabled; extern int selinux_mls_enabled; diff --git a/security/selinux/include/xfrm.h b/security/selinux/include/xfrm.h index c10f1fc41..c96498a10 100644 --- a/security/selinux/include/xfrm.h +++ b/security/selinux/include/xfrm.h @@ -9,8 +9,10 @@ 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_policy_delete(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_state_delete(struct xfrm_state *x); int selinux_xfrm_policy_lookup(struct xfrm_policy *xp, u32 sk_sid, u8 dir); /* @@ -49,7 +51,7 @@ static inline int selinux_xfrm_sock_rcv_skb(u32 isec_sid, struct sk_buff *skb) static inline int selinux_xfrm_postroute_last(u32 isec_sid, struct sk_buff *skb) { - return NF_ACCEPT; + return 0; } static inline int selinux_socket_getpeer_stream(struct sock *sk) diff --git a/security/selinux/nlmsgtab.c b/security/selinux/nlmsgtab.c index b3adb481b..b8f4d25cf 100644 --- a/security/selinux/nlmsgtab.c +++ b/security/selinux/nlmsgtab.c @@ -16,7 +16,7 @@ #include #include #include -#include +#include #include #include @@ -63,6 +63,8 @@ static struct nlmsg_perm nlmsg_route_perms[] = { RTM_GETPREFIX, NETLINK_ROUTE_SOCKET__NLMSG_READ }, { RTM_GETMULTICAST, NETLINK_ROUTE_SOCKET__NLMSG_READ }, { RTM_GETANYCAST, NETLINK_ROUTE_SOCKET__NLMSG_READ }, + { RTM_GETNEIGHTBL, NETLINK_ROUTE_SOCKET__NLMSG_READ }, + { RTM_SETNEIGHTBL, NETLINK_ROUTE_SOCKET__NLMSG_WRITE }, }; static struct nlmsg_perm nlmsg_firewall_perms[] = @@ -74,6 +76,7 @@ static struct nlmsg_perm nlmsg_firewall_perms[] = static struct nlmsg_perm nlmsg_tcpdiag_perms[] = { { TCPDIAG_GETSOCK, NETLINK_TCPDIAG_SOCKET__NLMSG_READ }, + { DCCPDIAG_GETSOCK, NETLINK_TCPDIAG_SOCKET__NLMSG_READ }, }; static struct nlmsg_perm nlmsg_xfrm_perms[] = @@ -85,8 +88,15 @@ static struct nlmsg_perm nlmsg_xfrm_perms[] = { XFRM_MSG_DELPOLICY, NETLINK_XFRM_SOCKET__NLMSG_WRITE }, { XFRM_MSG_GETPOLICY, NETLINK_XFRM_SOCKET__NLMSG_READ }, { XFRM_MSG_ALLOCSPI, NETLINK_XFRM_SOCKET__NLMSG_WRITE }, + { XFRM_MSG_ACQUIRE, NETLINK_XFRM_SOCKET__NLMSG_WRITE }, + { XFRM_MSG_EXPIRE, NETLINK_XFRM_SOCKET__NLMSG_WRITE }, { XFRM_MSG_UPDPOLICY, NETLINK_XFRM_SOCKET__NLMSG_WRITE }, { XFRM_MSG_UPDSA, NETLINK_XFRM_SOCKET__NLMSG_WRITE }, + { XFRM_MSG_POLEXPIRE, NETLINK_XFRM_SOCKET__NLMSG_WRITE }, + { XFRM_MSG_FLUSHSA, NETLINK_XFRM_SOCKET__NLMSG_WRITE }, + { XFRM_MSG_FLUSHPOLICY, NETLINK_XFRM_SOCKET__NLMSG_WRITE }, + { XFRM_MSG_NEWAE, NETLINK_XFRM_SOCKET__NLMSG_WRITE }, + { XFRM_MSG_GETAE, NETLINK_XFRM_SOCKET__NLMSG_READ }, }; static struct nlmsg_perm nlmsg_audit_perms[] = @@ -96,7 +106,11 @@ static struct nlmsg_perm nlmsg_audit_perms[] = { AUDIT_LIST, NETLINK_AUDIT_SOCKET__NLMSG_READPRIV }, { AUDIT_ADD, NETLINK_AUDIT_SOCKET__NLMSG_WRITE }, { AUDIT_DEL, NETLINK_AUDIT_SOCKET__NLMSG_WRITE }, + { AUDIT_LIST_RULES, NETLINK_AUDIT_SOCKET__NLMSG_READPRIV }, + { AUDIT_ADD_RULE, NETLINK_AUDIT_SOCKET__NLMSG_WRITE }, + { AUDIT_DEL_RULE, NETLINK_AUDIT_SOCKET__NLMSG_WRITE }, { AUDIT_USER, NETLINK_AUDIT_SOCKET__NLMSG_RELAY }, + { AUDIT_SIGNAL_INFO, NETLINK_AUDIT_SOCKET__NLMSG_READ }, }; @@ -141,8 +155,15 @@ int selinux_nlmsg_lookup(u16 sclass, u16 nlmsg_type, u32 *perm) break; case SECCLASS_NETLINK_AUDIT_SOCKET: - err = nlmsg_perm(nlmsg_type, perm, nlmsg_audit_perms, - sizeof(nlmsg_audit_perms)); + if ((nlmsg_type >= AUDIT_FIRST_USER_MSG && + nlmsg_type <= AUDIT_LAST_USER_MSG) || + (nlmsg_type >= AUDIT_FIRST_USER_MSG2 && + nlmsg_type <= AUDIT_LAST_USER_MSG2)) { + *perm = NETLINK_AUDIT_SOCKET__NLMSG_RELAY; + } else { + err = nlmsg_perm(nlmsg_type, perm, nlmsg_audit_perms, + sizeof(nlmsg_audit_perms)); + } break; /* No messaging from userspace, or class unknown/unhandled */ diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c index a4efc966f..bab7b386c 100644 --- a/security/selinux/selinuxfs.c +++ b/security/selinux/selinuxfs.c @@ -9,7 +9,6 @@ * the Free Software Foundation, version 2. */ -#include #include #include #include @@ -38,6 +37,14 @@ unsigned int selinux_checkreqprot = CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE; +#ifdef CONFIG_SECURITY_SELINUX_ENABLE_SECMARK_DEFAULT +#define SELINUX_COMPAT_NET_VALUE 0 +#else +#define SELINUX_COMPAT_NET_VALUE 1 +#endif + +int selinux_compat_net = SELINUX_COMPAT_NET_VALUE; + static int __init checkreqprot_setup(char *str) { selinux_checkreqprot = simple_strtoul(str,NULL,0) ? 1 : 0; @@ -45,6 +52,13 @@ static int __init checkreqprot_setup(char *str) } __setup("checkreqprot=", checkreqprot_setup); +static int __init selinux_compat_net_setup(char *str) +{ + selinux_compat_net = simple_strtoul(str,NULL,0) ? 1 : 0; + return 1; +} +__setup("selinux_compat_net=", selinux_compat_net_setup); + static DEFINE_MUTEX(sel_mutex); @@ -85,6 +99,7 @@ enum sel_inos { SEL_AVC, /* AVC management directory */ SEL_MEMBER, /* compute polyinstantiation membership decision */ SEL_CHECKREQPROT, /* check requested protection, not kernel-applied one */ + SEL_COMPAT_NET, /* whether to use old compat network packet controls */ }; #define TMPBUFLEN 12 @@ -364,6 +379,55 @@ static struct file_operations sel_checkreqprot_ops = { .write = sel_write_checkreqprot, }; +static ssize_t sel_read_compat_net(struct file *filp, char __user *buf, + size_t count, loff_t *ppos) +{ + char tmpbuf[TMPBUFLEN]; + ssize_t length; + + length = scnprintf(tmpbuf, TMPBUFLEN, "%d", selinux_compat_net); + return simple_read_from_buffer(buf, count, ppos, tmpbuf, length); +} + +static ssize_t sel_write_compat_net(struct file * file, const char __user * buf, + size_t count, loff_t *ppos) +{ + char *page; + ssize_t length; + int new_value; + + length = task_has_security(current, SECURITY__LOAD_POLICY); + if (length) + return length; + + if (count >= PAGE_SIZE) + return -ENOMEM; + if (*ppos != 0) { + /* No partial writes. */ + return -EINVAL; + } + page = (char*)get_zeroed_page(GFP_KERNEL); + if (!page) + return -ENOMEM; + length = -EFAULT; + if (copy_from_user(page, buf, count)) + goto out; + + length = -EINVAL; + if (sscanf(page, "%d", &new_value) != 1) + goto out; + + selinux_compat_net = new_value ? 1 : 0; + length = count; +out: + free_page((unsigned long) page); + return length; +} +static struct file_operations sel_compat_net_ops = { + .read = sel_read_compat_net, + .write = sel_write_compat_net, +}; + /* * Remaining nodes use transaction based IO methods like nfsd/nfsctl.c */ @@ -707,7 +771,6 @@ static struct inode *sel_make_inode(struct super_block *sb, int mode) if (ret) { ret->i_mode = mode; ret->i_uid = ret->i_gid = 0; - ret->i_blksize = PAGE_CACHE_SIZE; ret->i_blocks = 0; ret->i_atime = ret->i_mtime = ret->i_ctime = CURRENT_TIME; } @@ -1219,6 +1282,7 @@ static int sel_fill_super(struct super_block * sb, void * data, int silent) [SEL_DISABLE] = {"disable", &sel_disable_ops, S_IWUSR}, [SEL_MEMBER] = {"member", &transaction_ops, S_IRUGO|S_IWUGO}, [SEL_CHECKREQPROT] = {"checkreqprot", &sel_checkreqprot_ops, S_IRUGO|S_IWUSR}, + [SEL_COMPAT_NET] = {"compat_net", &sel_compat_net_ops, S_IRUGO|S_IWUSR}, /* last one */ {""} }; ret = simple_fill_super(sb, SELINUX_MAGIC, selinux_files); @@ -1279,10 +1343,11 @@ err: goto out; } -static struct super_block *sel_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) +static int sel_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, void *data, + struct vfsmount *mnt) { - return get_sb_single(fs_type, flags, data, sel_fill_super); + return get_sb_single(fs_type, flags, data, sel_fill_super, mnt); } static struct file_system_type sel_fs_type = { diff --git a/security/selinux/ss/mls.c b/security/selinux/ss/mls.c index 7bc5b6440..df2540cc3 100644 --- a/security/selinux/ss/mls.c +++ b/security/selinux/ss/mls.c @@ -543,22 +543,21 @@ int mls_compute_sid(struct context *scontext, u32 specified, struct context *newcontext) { + struct range_trans *rtr; + if (!selinux_mls_enabled) return 0; switch (specified) { case AVTAB_TRANSITION: - if (tclass == SECCLASS_PROCESS) { - struct range_trans *rangetr; - /* Look for a range transition rule. */ - for (rangetr = policydb.range_tr; rangetr; - rangetr = rangetr->next) { - if (rangetr->dom == scontext->type && - rangetr->type == tcontext->type) { - /* Set the range from the rule */ - return mls_range_set(newcontext, - &rangetr->range); - } + /* Look for a range transition rule. */ + for (rtr = policydb.range_tr; rtr; rtr = rtr->next) { + if (rtr->source_type == scontext->type && + rtr->target_type == tcontext->type && + rtr->target_class == tclass) { + /* Set the range from the rule */ + return mls_range_set(newcontext, + &rtr->target_range); } } /* Fallthrough */ diff --git a/security/selinux/ss/policydb.c b/security/selinux/ss/policydb.c index 0111990ba..b18895302 100644 --- a/security/selinux/ss/policydb.c +++ b/security/selinux/ss/policydb.c @@ -96,6 +96,11 @@ static struct policydb_compat_info policydb_compat[] = { .sym_num = SYM_NUM, .ocon_num = OCON_NUM, }, + { + .version = POLICYDB_VERSION_RANGETRANS, + .sym_num = SYM_NUM, + .ocon_num = OCON_NUM, + }, }; static struct policydb_compat_info *policydb_lookup_compat(int version) @@ -644,10 +649,18 @@ void policydb_destroy(struct policydb *p) kfree(lra); for (rt = p->range_tr; rt; rt = rt -> next) { - kfree(lrt); + if (lrt) { + ebitmap_destroy(&lrt->target_range.level[0].cat); + ebitmap_destroy(&lrt->target_range.level[1].cat); + kfree(lrt); + } lrt = rt; } - kfree(lrt); + if (lrt) { + ebitmap_destroy(&lrt->target_range.level[0].cat); + ebitmap_destroy(&lrt->target_range.level[1].cat); + kfree(lrt); + } if (p->type_attr_map) { for (i = 0; i < p->p_types.nprim; i++) @@ -1821,6 +1834,7 @@ int policydb_read(struct policydb *p, void *fp) } if (p->policyvers >= POLICYDB_VERSION_MLS) { + int new_rangetr = p->policyvers >= POLICYDB_VERSION_RANGETRANS; rc = next_entry(buf, fp, sizeof(u32)); if (rc < 0) goto bad; @@ -1839,9 +1853,16 @@ int policydb_read(struct policydb *p, void *fp) rc = next_entry(buf, fp, (sizeof(u32) * 2)); if (rc < 0) goto bad; - rt->dom = le32_to_cpu(buf[0]); - rt->type = le32_to_cpu(buf[1]); - rc = mls_read_range_helper(&rt->range, fp); + rt->source_type = le32_to_cpu(buf[0]); + rt->target_type = le32_to_cpu(buf[1]); + if (new_rangetr) { + rc = next_entry(buf, fp, sizeof(u32)); + if (rc < 0) + goto bad; + rt->target_class = le32_to_cpu(buf[0]); + } else + rt->target_class = SECCLASS_PROCESS; + rc = mls_read_range_helper(&rt->target_range, fp); if (rc) goto bad; lrt = rt; diff --git a/security/selinux/ss/policydb.h b/security/selinux/ss/policydb.h index b1340711f..8319d5ff5 100644 --- a/security/selinux/ss/policydb.h +++ b/security/selinux/ss/policydb.h @@ -106,9 +106,10 @@ struct cat_datum { }; struct range_trans { - u32 dom; /* current process domain */ - u32 type; /* program executable type */ - struct mls_range range; /* new range */ + u32 source_type; + u32 target_type; + u32 target_class; + struct mls_range target_range; struct range_trans *next; }; diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c index c284dbb8b..85e429884 100644 --- a/security/selinux/ss/services.c +++ b/security/selinux/ss/services.c @@ -833,6 +833,8 @@ static int security_compute_sid(u32 ssid, goto out; } + context_init(&newcontext); + POLICY_RDLOCK; scontext = sidtab_search(&sidtab, ssid); @@ -850,8 +852,6 @@ static int security_compute_sid(u32 ssid, goto out_unlock; } - context_init(&newcontext); - /* Set the user identity. */ switch (specified) { case AVTAB_TRANSITION: @@ -1845,15 +1845,20 @@ int selinux_audit_rule_init(u32 field, u32 op, char *rulestr, return -ENOTSUPP; switch (field) { - case AUDIT_SE_USER: - case AUDIT_SE_ROLE: - case AUDIT_SE_TYPE: + case AUDIT_SUBJ_USER: + case AUDIT_SUBJ_ROLE: + case AUDIT_SUBJ_TYPE: + case AUDIT_OBJ_USER: + case AUDIT_OBJ_ROLE: + case AUDIT_OBJ_TYPE: /* only 'equals' and 'not equals' fit user, role, and type */ if (op != AUDIT_EQUAL && op != AUDIT_NOT_EQUAL) return -EINVAL; break; - case AUDIT_SE_SEN: - case AUDIT_SE_CLR: + case AUDIT_SUBJ_SEN: + case AUDIT_SUBJ_CLR: + case AUDIT_OBJ_LEV_LOW: + case AUDIT_OBJ_LEV_HIGH: /* we do not allow a range, indicated by the presense of '-' */ if (strchr(rulestr, '-')) return -EINVAL; @@ -1874,29 +1879,34 @@ int selinux_audit_rule_init(u32 field, u32 op, char *rulestr, tmprule->au_seqno = latest_granting; switch (field) { - case AUDIT_SE_USER: + case AUDIT_SUBJ_USER: + case AUDIT_OBJ_USER: userdatum = hashtab_search(policydb.p_users.table, rulestr); if (!userdatum) rc = -EINVAL; else tmprule->au_ctxt.user = userdatum->value; break; - case AUDIT_SE_ROLE: + case AUDIT_SUBJ_ROLE: + case AUDIT_OBJ_ROLE: roledatum = hashtab_search(policydb.p_roles.table, rulestr); if (!roledatum) rc = -EINVAL; else tmprule->au_ctxt.role = roledatum->value; break; - case AUDIT_SE_TYPE: + case AUDIT_SUBJ_TYPE: + case AUDIT_OBJ_TYPE: typedatum = hashtab_search(policydb.p_types.table, rulestr); if (!typedatum) rc = -EINVAL; else tmprule->au_ctxt.type = typedatum->value; break; - case AUDIT_SE_SEN: - case AUDIT_SE_CLR: + case AUDIT_SUBJ_SEN: + case AUDIT_SUBJ_CLR: + case AUDIT_OBJ_LEV_LOW: + case AUDIT_OBJ_LEV_HIGH: rc = mls_from_string(rulestr, &tmprule->au_ctxt, GFP_ATOMIC); break; } @@ -1948,7 +1958,8 @@ int selinux_audit_rule_match(u32 ctxid, u32 field, u32 op, /* a field/op pair that is not caught here will simply fall through without a match */ switch (field) { - case AUDIT_SE_USER: + case AUDIT_SUBJ_USER: + case AUDIT_OBJ_USER: switch (op) { case AUDIT_EQUAL: match = (ctxt->user == rule->au_ctxt.user); @@ -1958,7 +1969,8 @@ int selinux_audit_rule_match(u32 ctxid, u32 field, u32 op, break; } break; - case AUDIT_SE_ROLE: + case AUDIT_SUBJ_ROLE: + case AUDIT_OBJ_ROLE: switch (op) { case AUDIT_EQUAL: match = (ctxt->role == rule->au_ctxt.role); @@ -1968,7 +1980,8 @@ int selinux_audit_rule_match(u32 ctxid, u32 field, u32 op, break; } break; - case AUDIT_SE_TYPE: + case AUDIT_SUBJ_TYPE: + case AUDIT_OBJ_TYPE: switch (op) { case AUDIT_EQUAL: match = (ctxt->type == rule->au_ctxt.type); @@ -1978,9 +1991,12 @@ int selinux_audit_rule_match(u32 ctxid, u32 field, u32 op, break; } break; - case AUDIT_SE_SEN: - case AUDIT_SE_CLR: - level = (op == AUDIT_SE_SEN ? + case AUDIT_SUBJ_SEN: + case AUDIT_SUBJ_CLR: + case AUDIT_OBJ_LEV_LOW: + case AUDIT_OBJ_LEV_HIGH: + level = ((field == AUDIT_SUBJ_SEN || + field == AUDIT_OBJ_LEV_LOW) ? &ctxt->range.level[0] : &ctxt->range.level[1]); switch (op) { case AUDIT_EQUAL: diff --git a/security/selinux/xfrm.c b/security/selinux/xfrm.c index abe99d881..6c985ced8 100644 --- a/security/selinux/xfrm.c +++ b/security/selinux/xfrm.c @@ -26,7 +26,6 @@ * 2. Emulating a reasonable SO_PEERSEC across machines * 3. Testing addition of sk_policy's with security context via setsockopt */ -#include #include #include #include @@ -132,10 +131,7 @@ static int selinux_xfrm_sec_ctx_alloc(struct xfrm_sec_ctx **ctxp, struct xfrm_us 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 + * Does the subject have permission to set security context? */ rc = avc_has_perm(tsec->sid, ctx->ctx_sid, SECCLASS_ASSOCIATION, @@ -200,6 +196,23 @@ void selinux_xfrm_policy_free(struct xfrm_policy *xp) kfree(ctx); } +/* + * LSM hook implementation that authorizes deletion of labeled policies. + */ +int selinux_xfrm_policy_delete(struct xfrm_policy *xp) +{ + struct task_security_struct *tsec = current->security; + struct xfrm_sec_ctx *ctx = xp->security; + int rc = 0; + + if (ctx) + rc = avc_has_perm(tsec->sid, ctx->ctx_sid, + SECCLASS_ASSOCIATION, + ASSOCIATION__SETCONTEXT, NULL); + + return rc; +} + /* * LSM hook implementation that allocs and transfers sec_ctx spec to * xfrm_state. @@ -292,6 +305,23 @@ u32 selinux_socket_getpeer_dgram(struct sk_buff *skb) return SECSID_NULL; } + /* + * LSM hook implementation that authorizes deletion of labeled SAs. + */ +int selinux_xfrm_state_delete(struct xfrm_state *x) +{ + struct task_security_struct *tsec = current->security; + struct xfrm_sec_ctx *ctx = x->security; + int rc = 0; + + if (ctx) + rc = avc_has_perm(tsec->sid, ctx->ctx_sid, + SECCLASS_ASSOCIATION, + ASSOCIATION__SETCONTEXT, NULL); + + return rc; +} + /* * LSM hook that controls access to unlabelled packets. If * a xfrm_state is authorizable (defined by macro) then it was @@ -356,18 +386,12 @@ int selinux_xfrm_postroute_last(u32 isec_sid, struct sk_buff *skb) struct xfrm_state *x = dst_test->xfrm; if (x && selinux_authorizable_xfrm(x)) - goto accept; + goto out; } } 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; +out: + return rc; } diff --git a/sound/Kconfig b/sound/Kconfig index b65ee4701..e0d791a98 100644 --- a/sound/Kconfig +++ b/sound/Kconfig @@ -58,6 +58,8 @@ source "sound/pci/Kconfig" source "sound/ppc/Kconfig" +source "sound/aoa/Kconfig" + source "sound/arm/Kconfig" source "sound/mips/Kconfig" diff --git a/sound/Makefile b/sound/Makefile index f352bb235..1f60797af 100644 --- a/sound/Makefile +++ b/sound/Makefile @@ -5,6 +5,7 @@ obj-$(CONFIG_SOUND) += soundcore.o obj-$(CONFIG_SOUND_PRIME) += oss/ obj-$(CONFIG_DMASOUND) += oss/ obj-$(CONFIG_SND) += core/ i2c/ drivers/ isa/ pci/ ppc/ arm/ synth/ usb/ sparc/ parisc/ pcmcia/ mips/ +obj-$(CONFIG_SND_AOA) += aoa/ ifeq ($(CONFIG_SND),y) obj-y += last.o diff --git a/sound/arm/aaci.c b/sound/arm/aaci.c index 5f22d70fe..8435fdd1c 100644 --- a/sound/arm/aaci.c +++ b/sound/arm/aaci.c @@ -360,7 +360,7 @@ static int aaci_pcm_open(struct aaci *aaci, struct snd_pcm_substream *substream, if (ret) goto out; - ret = request_irq(aaci->dev->irq[0], aaci_irq, SA_SHIRQ|SA_INTERRUPT, + ret = request_irq(aaci->dev->irq[0], aaci_irq, IRQF_SHARED|IRQF_DISABLED, DRIVER_NAME, aaci); if (ret) goto out; @@ -779,8 +779,9 @@ static struct aaci * __devinit aaci_init_card(struct amba_device *dev) strlcpy(card->driver, DRIVER_NAME, sizeof(card->driver)); strlcpy(card->shortname, "ARM AC'97 Interface", sizeof(card->shortname)); snprintf(card->longname, sizeof(card->longname), - "%s at 0x%08lx, irq %d", - card->shortname, dev->res.start, dev->irq[0]); + "%s at 0x%016llx, irq %d", + card->shortname, (unsigned long long)dev->res.start, + dev->irq[0]); aaci = card->private_data; mutex_init(&aaci->ac97_sem); diff --git a/sound/arm/sa11xx-uda1341.c b/sound/arm/sa11xx-uda1341.c index 13057d92f..c79a9afd0 100644 --- a/sound/arm/sa11xx-uda1341.c +++ b/sound/arm/sa11xx-uda1341.c @@ -59,7 +59,6 @@ * ***************************************************************************************************/ -#include #include #include #include @@ -112,7 +111,7 @@ MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("SA1100/SA1111 + UDA1341TS driver for ALSA"); MODULE_SUPPORTED_DEVICE("{{UDA1341,iPAQ H3600 UDA1341TS}}"); -static char *id = NULL; /* ID for this card */ +static char *id; /* ID for this card */ module_param(id, charp, 0444); MODULE_PARM_DESC(id, "ID string for SA1100/SA1111 + UDA1341TS soundcard."); @@ -984,11 +983,15 @@ static int __init sa11xx_uda1341_init(void) if ((err = platform_driver_register(&sa11xx_uda1341_driver)) < 0) return err; device = platform_device_register_simple(SA11XX_UDA1341_DRIVER, -1, NULL, 0); - if (IS_ERR(device)) { - platform_driver_unregister(&sa11xx_uda1341_driver); - return PTR_ERR(device); - } - return 0; + if (!IS_ERR(device)) { + if (platform_get_drvdata(device)) + return 0; + platform_device_unregister(device); + err = -ENODEV + } else + err = PTR_ERR(device); + platform_driver_unregister(&sa11xx_uda1341_driver); + return err; } static void __exit sa11xx_uda1341_exit(void) diff --git a/sound/core/Kconfig b/sound/core/Kconfig index 4262a1c87..b2927523d 100644 --- a/sound/core/Kconfig +++ b/sound/core/Kconfig @@ -122,8 +122,8 @@ config SND_SEQ_RTCTIMER_DEFAULT If in doubt, say Y. config SND_DYNAMIC_MINORS - bool "Dynamic device file minor numbers (EXPERIMENTAL)" - depends on SND && EXPERIMENTAL + bool "Dynamic device file minor numbers" + depends on SND help If you say Y here, the minor numbers of ALSA device files in /dev/snd/ are allocated dynamically. This allows you to have diff --git a/sound/core/control.c b/sound/core/control.c index 22565c9b9..ac890d9c7 100644 --- a/sound/core/control.c +++ b/sound/core/control.c @@ -176,6 +176,8 @@ void snd_ctl_notify(struct snd_card *card, unsigned int mask, read_unlock(&card->ctl_files_rwlock); } +EXPORT_SYMBOL(snd_ctl_notify); + /** * snd_ctl_new - create a control instance from the template * @control: the control template @@ -204,6 +206,8 @@ struct snd_kcontrol *snd_ctl_new(struct snd_kcontrol *control, unsigned int acce return kctl; } +EXPORT_SYMBOL(snd_ctl_new); + /** * snd_ctl_new1 - create a control instance from the template * @ncontrol: the initialization record @@ -242,6 +246,8 @@ struct snd_kcontrol *snd_ctl_new1(const struct snd_kcontrol_new *ncontrol, return snd_ctl_new(&kctl, access); } +EXPORT_SYMBOL(snd_ctl_new1); + /** * snd_ctl_free_one - release the control instance * @kcontrol: the control instance @@ -259,6 +265,8 @@ void snd_ctl_free_one(struct snd_kcontrol *kcontrol) } } +EXPORT_SYMBOL(snd_ctl_free_one); + static unsigned int snd_ctl_hole_check(struct snd_card *card, unsigned int count) { @@ -347,6 +355,8 @@ int snd_ctl_add(struct snd_card *card, struct snd_kcontrol *kcontrol) return err; } +EXPORT_SYMBOL(snd_ctl_add); + /** * snd_ctl_remove - remove the control from the card and release it * @card: the card instance @@ -373,6 +383,8 @@ int snd_ctl_remove(struct snd_card *card, struct snd_kcontrol *kcontrol) return 0; } +EXPORT_SYMBOL(snd_ctl_remove); + /** * snd_ctl_remove_id - remove the control of the given id and release it * @card: the card instance @@ -399,6 +411,8 @@ int snd_ctl_remove_id(struct snd_card *card, struct snd_ctl_elem_id *id) return ret; } +EXPORT_SYMBOL(snd_ctl_remove_id); + /** * snd_ctl_remove_unlocked_id - remove the unlocked control of the given id and release it * @file: active control handle @@ -461,6 +475,8 @@ int snd_ctl_rename_id(struct snd_card *card, struct snd_ctl_elem_id *src_id, return 0; } +EXPORT_SYMBOL(snd_ctl_rename_id); + /** * snd_ctl_find_numid - find the control instance with the given number-id * @card: the card instance @@ -487,6 +503,8 @@ struct snd_kcontrol *snd_ctl_find_numid(struct snd_card *card, unsigned int numi return NULL; } +EXPORT_SYMBOL(snd_ctl_find_numid); + /** * snd_ctl_find_id - find the control instance with the given id * @card: the card instance @@ -527,6 +545,8 @@ struct snd_kcontrol *snd_ctl_find_id(struct snd_card *card, return NULL; } +EXPORT_SYMBOL(snd_ctl_find_id); + static int snd_ctl_card_info(struct snd_card *card, struct snd_ctl_file * ctl, unsigned int cmd, void __user *arg) { @@ -704,6 +724,8 @@ int snd_ctl_elem_read(struct snd_card *card, struct snd_ctl_elem_value *control) return result; } +EXPORT_SYMBOL(snd_ctl_elem_read); + static int snd_ctl_elem_read_user(struct snd_card *card, struct snd_ctl_elem_value __user *_control) { @@ -767,6 +789,8 @@ int snd_ctl_elem_write(struct snd_card *card, struct snd_ctl_file *file, return result; } +EXPORT_SYMBOL(snd_ctl_elem_write); + static int snd_ctl_elem_write_user(struct snd_ctl_file *file, struct snd_ctl_elem_value __user *_control) { @@ -973,6 +997,7 @@ static int snd_ctl_elem_add(struct snd_ctl_file *file, if (ue == NULL) return -ENOMEM; ue->info = *info; + ue->info.access = 0; ue->elem_data = (char *)ue + sizeof(*ue); ue->elem_data_size = private_size; kctl.private_free = snd_ctl_elem_user_free; @@ -1199,11 +1224,15 @@ int snd_ctl_register_ioctl(snd_kctl_ioctl_func_t fcn) return _snd_ctl_register_ioctl(fcn, &snd_control_ioctls); } +EXPORT_SYMBOL(snd_ctl_register_ioctl); + #ifdef CONFIG_COMPAT int snd_ctl_register_ioctl_compat(snd_kctl_ioctl_func_t fcn) { return _snd_ctl_register_ioctl(fcn, &snd_control_compat_ioctls); } + +EXPORT_SYMBOL(snd_ctl_register_ioctl_compat); #endif /* @@ -1236,12 +1265,15 @@ int snd_ctl_unregister_ioctl(snd_kctl_ioctl_func_t fcn) return _snd_ctl_unregister_ioctl(fcn, &snd_control_ioctls); } +EXPORT_SYMBOL(snd_ctl_unregister_ioctl); + #ifdef CONFIG_COMPAT int snd_ctl_unregister_ioctl_compat(snd_kctl_ioctl_func_t fcn) { return _snd_ctl_unregister_ioctl(fcn, &snd_control_compat_ioctls); } +EXPORT_SYMBOL(snd_ctl_unregister_ioctl_compat); #endif static int snd_ctl_fasync(int fd, struct file * file, int on) diff --git a/sound/core/device.c b/sound/core/device.c index b1cf6ec56..6ce4da4a1 100644 --- a/sound/core/device.c +++ b/sound/core/device.c @@ -63,6 +63,8 @@ int snd_device_new(struct snd_card *card, snd_device_type_t type, return 0; } +EXPORT_SYMBOL(snd_device_new); + /** * snd_device_free - release the device from the card * @card: the card instance @@ -107,6 +109,8 @@ int snd_device_free(struct snd_card *card, void *device_data) return -ENXIO; } +EXPORT_SYMBOL(snd_device_free); + /** * snd_device_disconnect - disconnect the device * @card: the card instance @@ -182,6 +186,8 @@ int snd_device_register(struct snd_card *card, void *device_data) return -ENXIO; } +EXPORT_SYMBOL(snd_device_register); + /* * register all the devices on the card. * called from init.c diff --git a/sound/core/hwdep.c b/sound/core/hwdep.c index 2524e66ec..a562f96f3 100644 --- a/sound/core/hwdep.c +++ b/sound/core/hwdep.c @@ -158,6 +158,7 @@ static int snd_hwdep_release(struct inode *inode, struct file * file) { int err = -ENXIO; struct snd_hwdep *hw = file->private_data; + struct module *mod = hw->card->module; mutex_lock(&hw->open_mutex); if (hw->ops.release) { err = hw->ops.release(hw, file); @@ -167,7 +168,7 @@ static int snd_hwdep_release(struct inode *inode, struct file * file) hw->used--; snd_card_file_remove(hw->card, file); mutex_unlock(&hw->open_mutex); - module_put(hw->card->module); + module_put(mod); return err; } @@ -486,7 +487,6 @@ static void __init snd_hwdep_proc_init(void) struct snd_info_entry *entry; if ((entry = snd_info_create_module_entry(THIS_MODULE, "hwdep", NULL)) != NULL) { - entry->c.text.read_size = PAGE_SIZE; entry->c.text.read = snd_hwdep_proc_read; if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); diff --git a/sound/core/info.c b/sound/core/info.c index 2582b74d3..57821ceb1 100644 --- a/sound/core/info.c +++ b/sound/core/info.c @@ -21,7 +21,6 @@ #include #include -#include #include #include #include @@ -30,7 +29,6 @@ #include #include #include -#include #include #include @@ -82,6 +80,24 @@ static int snd_info_version_init(void); static int snd_info_version_done(void); +/* resize the proc r/w buffer */ +static int resize_info_buffer(struct snd_info_buffer *buffer, + unsigned int nsize) +{ + char *nbuf; + + nsize = PAGE_ALIGN(nsize); + nbuf = kmalloc(nsize, GFP_KERNEL); + if (! nbuf) + return -ENOMEM; + + memcpy(nbuf, buffer->buffer, buffer->len); + kfree(buffer->buffer); + buffer->buffer = nbuf; + buffer->len = nsize; + return 0; +} + /** * snd_iprintf - printf on the procfs buffer * @buffer: the procfs buffer @@ -95,30 +111,46 @@ int snd_iprintf(struct snd_info_buffer *buffer, char *fmt,...) { va_list args; int len, res; + int err = 0; + might_sleep(); if (buffer->stop || buffer->error) return 0; len = buffer->len - buffer->size; va_start(args, fmt); - res = vsnprintf(buffer->curr, len, fmt, args); - va_end(args); - if (res >= len) { - buffer->stop = 1; - return 0; + for (;;) { + va_list ap; + va_copy(ap, args); + res = vsnprintf(buffer->buffer + buffer->curr, len, fmt, ap); + va_end(ap); + if (res < len) + break; + err = resize_info_buffer(buffer, buffer->len + PAGE_SIZE); + if (err < 0) + break; + len = buffer->len - buffer->size; } + va_end(args); + + if (err < 0) + return err; buffer->curr += res; buffer->size += res; return res; } +EXPORT_SYMBOL(snd_iprintf); + /* */ -static struct proc_dir_entry *snd_proc_root = NULL; -struct snd_info_entry *snd_seq_root = NULL; +static struct proc_dir_entry *snd_proc_root; +struct snd_info_entry *snd_seq_root; +EXPORT_SYMBOL(snd_seq_root); + #ifdef CONFIG_SND_OSSEMUL -struct snd_info_entry *snd_oss_root = NULL; +struct snd_info_entry *snd_oss_root; #endif static inline void snd_info_entry_prepare(struct proc_dir_entry *de) @@ -221,7 +253,7 @@ static ssize_t snd_info_entry_write(struct file *file, const char __user *buffer struct snd_info_private_data *data; struct snd_info_entry *entry; struct snd_info_buffer *buf; - size_t size = 0; + ssize_t size = 0; loff_t pos; data = file->private_data; @@ -237,14 +269,20 @@ static ssize_t snd_info_entry_write(struct file *file, const char __user *buffer buf = data->wbuffer; if (buf == NULL) return -EIO; - if (pos >= buf->len) - return -ENOMEM; - size = buf->len - pos; - size = min(count, size); - if (copy_from_user(buf->buffer + pos, buffer, size)) + mutex_lock(&entry->access); + if (pos + count >= buf->len) { + if (resize_info_buffer(buf, pos + count)) { + mutex_unlock(&entry->access); + return -ENOMEM; + } + } + if (copy_from_user(buf->buffer + pos, buffer, count)) { + mutex_unlock(&entry->access); return -EFAULT; - if ((long)buf->size < pos + size) - buf->size = pos + size; + } + buf->size = pos + count; + mutex_unlock(&entry->access); + size = count; break; case SNDRV_INFO_CONTENT_DATA: if (entry->c.ops->write) @@ -279,18 +317,14 @@ static int snd_info_entry_open(struct inode *inode, struct file *file) } mode = file->f_flags & O_ACCMODE; if (mode == O_RDONLY || mode == O_RDWR) { - if ((entry->content == SNDRV_INFO_CONTENT_TEXT && - !entry->c.text.read_size) || - (entry->content == SNDRV_INFO_CONTENT_DATA && + if ((entry->content == SNDRV_INFO_CONTENT_DATA && entry->c.ops->read == NULL)) { err = -ENODEV; goto __error; } } if (mode == O_WRONLY || mode == O_RDWR) { - if ((entry->content == SNDRV_INFO_CONTENT_TEXT && - !entry->c.text.write_size) || - (entry->content == SNDRV_INFO_CONTENT_DATA && + if ((entry->content == SNDRV_INFO_CONTENT_DATA && entry->c.ops->write == NULL)) { err = -ENODEV; goto __error; @@ -306,49 +340,23 @@ static int snd_info_entry_open(struct inode *inode, struct file *file) case SNDRV_INFO_CONTENT_TEXT: if (mode == O_RDONLY || mode == O_RDWR) { buffer = kzalloc(sizeof(*buffer), GFP_KERNEL); - if (buffer == NULL) { - kfree(data); - err = -ENOMEM; - goto __error; - } - buffer->len = (entry->c.text.read_size + - (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1); - buffer->buffer = vmalloc(buffer->len); - if (buffer->buffer == NULL) { - kfree(buffer); - kfree(data); - err = -ENOMEM; - goto __error; - } - buffer->curr = buffer->buffer; + if (buffer == NULL) + goto __nomem; data->rbuffer = buffer; + buffer->len = PAGE_SIZE; + buffer->buffer = kmalloc(buffer->len, GFP_KERNEL); + if (buffer->buffer == NULL) + goto __nomem; } if (mode == O_WRONLY || mode == O_RDWR) { buffer = kzalloc(sizeof(*buffer), GFP_KERNEL); - if (buffer == NULL) { - if (mode == O_RDWR) { - vfree(data->rbuffer->buffer); - kfree(data->rbuffer); - } - kfree(data); - err = -ENOMEM; - goto __error; - } - buffer->len = (entry->c.text.write_size + - (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1); - buffer->buffer = vmalloc(buffer->len); - if (buffer->buffer == NULL) { - if (mode == O_RDWR) { - vfree(data->rbuffer->buffer); - kfree(data->rbuffer); - } - kfree(buffer); - kfree(data); - err = -ENOMEM; - goto __error; - } - buffer->curr = buffer->buffer; + if (buffer == NULL) + goto __nomem; data->wbuffer = buffer; + buffer->len = PAGE_SIZE; + buffer->buffer = kmalloc(buffer->len, GFP_KERNEL); + if (buffer->buffer == NULL) + goto __nomem; } break; case SNDRV_INFO_CONTENT_DATA: /* data */ @@ -373,6 +381,17 @@ static int snd_info_entry_open(struct inode *inode, struct file *file) } return 0; + __nomem: + if (data->rbuffer) { + kfree(data->rbuffer->buffer); + kfree(data->rbuffer); + } + if (data->wbuffer) { + kfree(data->wbuffer->buffer); + kfree(data->wbuffer); + } + kfree(data); + err = -ENOMEM; __error: module_put(entry->module); __error1: @@ -391,11 +410,11 @@ static int snd_info_entry_release(struct inode *inode, struct file *file) entry = data->entry; switch (entry->content) { case SNDRV_INFO_CONTENT_TEXT: - if (mode == O_RDONLY || mode == O_RDWR) { - vfree(data->rbuffer->buffer); + if (data->rbuffer) { + kfree(data->rbuffer->buffer); kfree(data->rbuffer); } - if (mode == O_WRONLY || mode == O_RDWR) { + if (data->wbuffer) { if (entry->c.text.write) { entry->c.text.write(entry, data->wbuffer); if (data->wbuffer->error) { @@ -404,7 +423,7 @@ static int snd_info_entry_release(struct inode *inode, struct file *file) data->wbuffer->error); } } - vfree(data->wbuffer->buffer); + kfree(data->wbuffer->buffer); kfree(data->wbuffer); } break; @@ -664,29 +683,29 @@ int snd_info_get_line(struct snd_info_buffer *buffer, char *line, int len) if (len <= 0 || buffer->stop || buffer->error) return 1; while (--len > 0) { - c = *buffer->curr++; + c = buffer->buffer[buffer->curr++]; if (c == '\n') { - if ((buffer->curr - buffer->buffer) >= (long)buffer->size) { + if (buffer->curr >= buffer->size) buffer->stop = 1; - } break; } *line++ = c; - if ((buffer->curr - buffer->buffer) >= (long)buffer->size) { + if (buffer->curr >= buffer->size) { buffer->stop = 1; break; } } while (c != '\n' && !buffer->stop) { - c = *buffer->curr++; - if ((buffer->curr - buffer->buffer) >= (long)buffer->size) { + c = buffer->buffer[buffer->curr++]; + if (buffer->curr >= buffer->size) buffer->stop = 1; - } } *line = '\0'; return 0; } +EXPORT_SYMBOL(snd_info_get_line); + /** * snd_info_get_str - parse a string token * @dest: the buffer to store the string token @@ -723,6 +742,8 @@ char *snd_info_get_str(char *dest, char *src, int len) return src; } +EXPORT_SYMBOL(snd_info_get_str); + /** * snd_info_create_entry - create an info entry * @name: the proc file name @@ -774,6 +795,8 @@ struct snd_info_entry *snd_info_create_module_entry(struct module * module, return entry; } +EXPORT_SYMBOL(snd_info_create_module_entry); + /** * snd_info_create_card_entry - create an info entry for the given card * @card: the card instance @@ -797,6 +820,8 @@ struct snd_info_entry *snd_info_create_card_entry(struct snd_card *card, return entry; } +EXPORT_SYMBOL(snd_info_create_card_entry); + static int snd_info_dev_free_entry(struct snd_device *device) { struct snd_info_entry *entry = device->device_data; @@ -867,6 +892,8 @@ int snd_card_proc_new(struct snd_card *card, const char *name, return 0; } +EXPORT_SYMBOL(snd_card_proc_new); + /** * snd_info_free_entry - release the info entry * @entry: the info entry @@ -883,6 +910,8 @@ void snd_info_free_entry(struct snd_info_entry * entry) kfree(entry); } +EXPORT_SYMBOL(snd_info_free_entry); + /** * snd_info_register - register the info entry * @entry: the info entry @@ -913,6 +942,8 @@ int snd_info_register(struct snd_info_entry * entry) return 0; } +EXPORT_SYMBOL(snd_info_register); + /** * snd_info_unregister - de-register the info entry * @entry: the info entry @@ -937,11 +968,13 @@ int snd_info_unregister(struct snd_info_entry * entry) return 0; } +EXPORT_SYMBOL(snd_info_unregister); + /* */ -static struct snd_info_entry *snd_info_version_entry = NULL; +static struct snd_info_entry *snd_info_version_entry; static void snd_info_version_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) { @@ -958,7 +991,6 @@ static int __init snd_info_version_init(void) entry = snd_info_create_module_entry(THIS_MODULE, "version", NULL); if (entry == NULL) return -ENOMEM; - entry->c.text.read_size = 256; entry->c.text.read = snd_info_version_read; if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); diff --git a/sound/core/info_oss.c b/sound/core/info_oss.c index f9ce854b3..bb2c40d0a 100644 --- a/sound/core/info_oss.c +++ b/sound/core/info_oss.c @@ -64,6 +64,8 @@ int snd_oss_info_register(int dev, int num, char *string) return 0; } +EXPORT_SYMBOL(snd_oss_info_register); + extern void snd_card_info_read_oss(struct snd_info_buffer *buffer); static int snd_sndstat_show_strings(struct snd_info_buffer *buf, char *id, int dev) @@ -117,7 +119,6 @@ int snd_info_minor_register(void) memset(snd_sndstat_strings, 0, sizeof(snd_sndstat_strings)); if ((entry = snd_info_create_module_entry(THIS_MODULE, "sndstat", snd_oss_root)) != NULL) { - entry->c.text.read_size = 2048; entry->c.text.read = snd_sndstat_proc_read; if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); diff --git a/sound/core/init.c b/sound/core/init.c index 39ed2e5bb..4d9258884 100644 --- a/sound/core/init.c +++ b/sound/core/init.c @@ -38,12 +38,15 @@ struct snd_shutdown_f_ops { struct snd_shutdown_f_ops *next; }; -unsigned int snd_cards_lock = 0; /* locked for registering/using */ -struct snd_card *snd_cards[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = NULL}; -DEFINE_RWLOCK(snd_card_rwlock); +static unsigned int snd_cards_lock; /* locked for registering/using */ +struct snd_card *snd_cards[SNDRV_CARDS]; +EXPORT_SYMBOL(snd_cards); + +static DEFINE_MUTEX(snd_card_mutex); #if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE) int (*snd_mixer_oss_notify_callback)(struct snd_card *card, int free_flag); +EXPORT_SYMBOL(snd_mixer_oss_notify_callback); #endif #ifdef CONFIG_PROC_FS @@ -66,7 +69,6 @@ static inline int init_info_for_card(struct snd_card *card) snd_printd("unable to create card entry\n"); return err; } - entry->c.text.read_size = PAGE_SIZE; entry->c.text.read = snd_card_id_read; if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); @@ -110,7 +112,7 @@ struct snd_card *snd_card_new(int idx, const char *xid, strlcpy(card->id, xid, sizeof(card->id)); } err = 0; - write_lock(&snd_card_rwlock); + mutex_lock(&snd_card_mutex); if (idx < 0) { int idx2; for (idx2 = 0; idx2 < SNDRV_CARDS; idx2++) @@ -128,12 +130,12 @@ struct snd_card *snd_card_new(int idx, const char *xid, else err = -ENODEV; if (idx < 0 || err < 0) { - write_unlock(&snd_card_rwlock); + mutex_unlock(&snd_card_mutex); snd_printk(KERN_ERR "cannot find the slot for index %d (range 0-%i)\n", idx, snd_ecards_limit - 1); goto __error; } snd_cards_lock |= 1 << idx; /* lock it */ - write_unlock(&snd_card_rwlock); + mutex_unlock(&snd_card_mutex); card->number = idx; card->module = module; INIT_LIST_HEAD(&card->devices); @@ -169,6 +171,19 @@ struct snd_card *snd_card_new(int idx, const char *xid, return NULL; } +EXPORT_SYMBOL(snd_card_new); + +/* return non-zero if a card is already locked */ +int snd_card_locked(int card) +{ + int locked; + + mutex_lock(&snd_card_mutex); + locked = snd_cards_lock & (1 << card); + mutex_unlock(&snd_card_mutex); + return locked; +} + static loff_t snd_disconnect_llseek(struct file *file, loff_t offset, int orig) { return -ENODEV; @@ -236,9 +251,9 @@ int snd_card_disconnect(struct snd_card *card) spin_unlock(&card->files_lock); /* phase 1: disable fops (user space) operations for ALSA API */ - write_lock(&snd_card_rwlock); + mutex_lock(&snd_card_mutex); snd_cards[card->number] = NULL; - write_unlock(&snd_card_rwlock); + mutex_unlock(&snd_card_mutex); /* phase 2: replace file->f_op with special dummy operations */ @@ -298,6 +313,8 @@ int snd_card_disconnect(struct snd_card *card) return 0; } +EXPORT_SYMBOL(snd_card_disconnect); + /** * snd_card_free - frees given soundcard structure * @card: soundcard structure @@ -315,9 +332,9 @@ int snd_card_free(struct snd_card *card) if (card == NULL) return -EINVAL; - write_lock(&snd_card_rwlock); + mutex_lock(&snd_card_mutex); snd_cards[card->number] = NULL; - write_unlock(&snd_card_rwlock); + mutex_unlock(&snd_card_mutex); #ifdef CONFIG_PM wake_up(&card->power_sleep); @@ -353,13 +370,15 @@ int snd_card_free(struct snd_card *card) card->s_f_ops = s_f_ops->next; kfree(s_f_ops); } - write_lock(&snd_card_rwlock); + mutex_lock(&snd_card_mutex); snd_cards_lock &= ~(1 << card->number); - write_unlock(&snd_card_rwlock); + mutex_unlock(&snd_card_mutex); kfree(card); return 0; } +EXPORT_SYMBOL(snd_card_free); + static void snd_card_free_thread(void * __card) { struct snd_card *card = __card; @@ -405,6 +424,8 @@ int snd_card_free_in_thread(struct snd_card *card) return -EFAULT; } +EXPORT_SYMBOL(snd_card_free_in_thread); + static void choose_default_id(struct snd_card *card) { int i, len, idx_flag = 0, loops = SNDRV_CARDS; @@ -487,16 +508,16 @@ int snd_card_register(struct snd_card *card) snd_assert(card != NULL, return -EINVAL); if ((err = snd_device_register_all(card)) < 0) return err; - write_lock(&snd_card_rwlock); + mutex_lock(&snd_card_mutex); if (snd_cards[card->number]) { /* already registered */ - write_unlock(&snd_card_rwlock); + mutex_unlock(&snd_card_mutex); return 0; } if (card->id[0] == '\0') choose_default_id(card); snd_cards[card->number] = card; - write_unlock(&snd_card_rwlock); + mutex_unlock(&snd_card_mutex); init_info_for_card(card); #if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE) if (snd_mixer_oss_notify_callback) @@ -505,8 +526,10 @@ int snd_card_register(struct snd_card *card) return 0; } +EXPORT_SYMBOL(snd_card_register); + #ifdef CONFIG_PROC_FS -static struct snd_info_entry *snd_card_info_entry = NULL; +static struct snd_info_entry *snd_card_info_entry; static void snd_card_info_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) @@ -515,7 +538,7 @@ static void snd_card_info_read(struct snd_info_entry *entry, struct snd_card *card; for (idx = count = 0; idx < SNDRV_CARDS; idx++) { - read_lock(&snd_card_rwlock); + mutex_lock(&snd_card_mutex); if ((card = snd_cards[idx]) != NULL) { count++; snd_iprintf(buffer, "%2i [%-15s]: %s - %s\n", @@ -526,7 +549,7 @@ static void snd_card_info_read(struct snd_info_entry *entry, snd_iprintf(buffer, " %s\n", card->longname); } - read_unlock(&snd_card_rwlock); + mutex_unlock(&snd_card_mutex); } if (!count) snd_iprintf(buffer, "--- no soundcards ---\n"); @@ -540,12 +563,12 @@ void snd_card_info_read_oss(struct snd_info_buffer *buffer) struct snd_card *card; for (idx = count = 0; idx < SNDRV_CARDS; idx++) { - read_lock(&snd_card_rwlock); + mutex_lock(&snd_card_mutex); if ((card = snd_cards[idx]) != NULL) { count++; snd_iprintf(buffer, "%s\n", card->longname); } - read_unlock(&snd_card_rwlock); + mutex_unlock(&snd_card_mutex); } if (!count) { snd_iprintf(buffer, "--- no soundcards ---\n"); @@ -563,11 +586,11 @@ static void snd_card_module_info_read(struct snd_info_entry *entry, struct snd_card *card; for (idx = 0; idx < SNDRV_CARDS; idx++) { - read_lock(&snd_card_rwlock); + mutex_lock(&snd_card_mutex); if ((card = snd_cards[idx]) != NULL) snd_iprintf(buffer, "%2i %s\n", idx, card->module->name); - read_unlock(&snd_card_rwlock); + mutex_unlock(&snd_card_mutex); } } #endif @@ -579,7 +602,6 @@ int __init snd_card_info_init(void) entry = snd_info_create_module_entry(THIS_MODULE, "cards", NULL); if (! entry) return -ENOMEM; - entry->c.text.read_size = PAGE_SIZE; entry->c.text.read = snd_card_info_read; if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); @@ -590,7 +612,6 @@ int __init snd_card_info_init(void) #ifdef MODULE entry = snd_info_create_module_entry(THIS_MODULE, "modules", NULL); if (entry) { - entry->c.text.read_size = PAGE_SIZE; entry->c.text.read = snd_card_module_info_read; if (snd_info_register(entry) < 0) snd_info_free_entry(entry); @@ -644,6 +665,8 @@ int snd_component_add(struct snd_card *card, const char *component) return 0; } +EXPORT_SYMBOL(snd_component_add); + /** * snd_card_file_add - add the file to the file list of the card * @card: soundcard structure @@ -676,6 +699,8 @@ int snd_card_file_add(struct snd_card *card, struct file *file) return 0; } +EXPORT_SYMBOL(snd_card_file_add); + /** * snd_card_file_remove - remove the file from the file list * @card: soundcard structure @@ -717,6 +742,8 @@ int snd_card_file_remove(struct snd_card *card, struct file *file) return 0; } +EXPORT_SYMBOL(snd_card_file_remove); + #ifdef CONFIG_PM /** * snd_power_wait - wait until the power-state is changed. @@ -753,4 +780,5 @@ int snd_power_wait(struct snd_card *card, unsigned int power_state) return result; } +EXPORT_SYMBOL(snd_power_wait); #endif /* CONFIG_PM */ diff --git a/sound/core/isadma.c b/sound/core/isadma.c index 1a378951d..d52398727 100644 --- a/sound/core/isadma.c +++ b/sound/core/isadma.c @@ -56,6 +56,8 @@ void snd_dma_program(unsigned long dma, release_dma_lock(flags); } +EXPORT_SYMBOL(snd_dma_program); + /** * snd_dma_disable - stop the ISA DMA transfer * @dma: the dma number @@ -72,6 +74,8 @@ void snd_dma_disable(unsigned long dma) release_dma_lock(flags); } +EXPORT_SYMBOL(snd_dma_disable); + /** * snd_dma_pointer - return the current pointer to DMA transfer buffer in bytes * @dma: the dma number @@ -101,3 +105,5 @@ unsigned int snd_dma_pointer(unsigned long dma, unsigned int size) else return size - result; } + +EXPORT_SYMBOL(snd_dma_pointer); diff --git a/sound/core/memalloc.c b/sound/core/memalloc.c index 3fc6f9707..bc0bd0910 100644 --- a/sound/core/memalloc.c +++ b/sound/core/memalloc.c @@ -21,7 +21,6 @@ * */ -#include #include #include #include diff --git a/sound/core/memory.c b/sound/core/memory.c index 862d62d2e..93537ab7c 100644 --- a/sound/core/memory.c +++ b/sound/core/memory.c @@ -20,7 +20,7 @@ * */ -#include +#include #include #include @@ -55,6 +55,8 @@ int copy_to_user_fromio(void __user *dst, const volatile void __iomem *src, size #endif } +EXPORT_SYMBOL(copy_to_user_fromio); + /** * copy_from_user_toio - copy data from user-space to mmio-space * @dst: the destination pointer on mmio-space @@ -85,3 +87,5 @@ int copy_from_user_toio(volatile void __iomem *dst, const void __user *src, size return 0; #endif } + +EXPORT_SYMBOL(copy_from_user_toio); diff --git a/sound/core/misc.c b/sound/core/misc.c index b53e563c0..03fc711f4 100644 --- a/sound/core/misc.c +++ b/sound/core/misc.c @@ -34,6 +34,8 @@ void release_and_free_resource(struct resource *res) } } +EXPORT_SYMBOL(release_and_free_resource); + #ifdef CONFIG_SND_VERBOSE_PRINTK void snd_verbose_printk(const char *file, int line, const char *format, ...) { @@ -51,6 +53,8 @@ void snd_verbose_printk(const char *file, int line, const char *format, ...) vprintk(format, args); va_end(args); } + +EXPORT_SYMBOL(snd_verbose_printk); #endif #if defined(CONFIG_SND_DEBUG) && defined(CONFIG_SND_VERBOSE_PRINTK) @@ -71,4 +75,6 @@ void snd_verbose_printd(const char *file, int line, const char *format, ...) va_end(args); } + +EXPORT_SYMBOL(snd_verbose_printd); #endif diff --git a/sound/core/oss/mixer_oss.c b/sound/core/oss/mixer_oss.c index 9c68bc3f9..75a9505c7 100644 --- a/sound/core/oss/mixer_oss.c +++ b/sound/core/oss/mixer_oss.c @@ -988,13 +988,12 @@ static int snd_mixer_oss_build_input(struct snd_mixer_oss *mixer, struct snd_mix if (ptr->index == 0 && (kctl = snd_mixer_oss_test_id(mixer, "Capture Source", 0)) != NULL) { struct snd_ctl_elem_info *uinfo; - uinfo = kmalloc(sizeof(*uinfo), GFP_KERNEL); + uinfo = kzalloc(sizeof(*uinfo), GFP_KERNEL); if (! uinfo) { up_read(&mixer->card->controls_rwsem); return -ENOMEM; } - memset(uinfo, 0, sizeof(*uinfo)); if (kctl->info(kctl, uinfo)) { up_read(&mixer->card->controls_rwsem); return 0; @@ -1182,9 +1181,7 @@ static void snd_mixer_oss_proc_init(struct snd_mixer_oss *mixer) return; entry->content = SNDRV_INFO_CONTENT_TEXT; entry->mode = S_IFREG | S_IRUGO | S_IWUSR; - entry->c.text.read_size = 8192; entry->c.text.read = snd_mixer_oss_proc_read; - entry->c.text.write_size = 8192; entry->c.text.write = snd_mixer_oss_proc_write; entry->private_data = mixer; if (snd_info_register(entry) < 0) { diff --git a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c index 0691aca51..48f7ed474 100644 --- a/sound/core/oss/pcm_oss.c +++ b/sound/core/oss/pcm_oss.c @@ -45,7 +45,7 @@ #define OSS_ALSAEMULVER _SIOR ('M', 249, int) -static int dsp_map[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = 0}; +static int dsp_map[SNDRV_CARDS]; static int adsp_map[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = 1}; static int nonblock_open = 1; @@ -78,6 +78,487 @@ static inline void snd_leave_user(mm_segment_t fs) set_fs(fs); } +/* + * helper functions to process hw_params + */ +static int snd_interval_refine_min(struct snd_interval *i, unsigned int min, int openmin) +{ + int changed = 0; + if (i->min < min) { + i->min = min; + i->openmin = openmin; + changed = 1; + } else if (i->min == min && !i->openmin && openmin) { + i->openmin = 1; + changed = 1; + } + if (i->integer) { + if (i->openmin) { + i->min++; + i->openmin = 0; + } + } + if (snd_interval_checkempty(i)) { + snd_interval_none(i); + return -EINVAL; + } + return changed; +} + +static int snd_interval_refine_max(struct snd_interval *i, unsigned int max, int openmax) +{ + int changed = 0; + if (i->max > max) { + i->max = max; + i->openmax = openmax; + changed = 1; + } else if (i->max == max && !i->openmax && openmax) { + i->openmax = 1; + changed = 1; + } + if (i->integer) { + if (i->openmax) { + i->max--; + i->openmax = 0; + } + } + if (snd_interval_checkempty(i)) { + snd_interval_none(i); + return -EINVAL; + } + return changed; +} + +static int snd_interval_refine_set(struct snd_interval *i, unsigned int val) +{ + struct snd_interval t; + t.empty = 0; + t.min = t.max = val; + t.openmin = t.openmax = 0; + t.integer = 1; + return snd_interval_refine(i, &t); +} + +/** + * snd_pcm_hw_param_value_min + * @params: the hw_params instance + * @var: parameter to retrieve + * @dir: pointer to the direction (-1,0,1) or NULL + * + * Return the minimum value for field PAR. + */ +static unsigned int +snd_pcm_hw_param_value_min(const struct snd_pcm_hw_params *params, + snd_pcm_hw_param_t var, int *dir) +{ + if (hw_is_mask(var)) { + if (dir) + *dir = 0; + return snd_mask_min(hw_param_mask_c(params, var)); + } + if (hw_is_interval(var)) { + const struct snd_interval *i = hw_param_interval_c(params, var); + if (dir) + *dir = i->openmin; + return snd_interval_min(i); + } + return -EINVAL; +} + +/** + * snd_pcm_hw_param_value_max + * @params: the hw_params instance + * @var: parameter to retrieve + * @dir: pointer to the direction (-1,0,1) or NULL + * + * Return the maximum value for field PAR. + */ +static unsigned int +snd_pcm_hw_param_value_max(const struct snd_pcm_hw_params *params, + snd_pcm_hw_param_t var, int *dir) +{ + if (hw_is_mask(var)) { + if (dir) + *dir = 0; + return snd_mask_max(hw_param_mask_c(params, var)); + } + if (hw_is_interval(var)) { + const struct snd_interval *i = hw_param_interval_c(params, var); + if (dir) + *dir = - (int) i->openmax; + return snd_interval_max(i); + } + return -EINVAL; +} + +static int _snd_pcm_hw_param_mask(struct snd_pcm_hw_params *params, + snd_pcm_hw_param_t var, + const struct snd_mask *val) +{ + int changed; + changed = snd_mask_refine(hw_param_mask(params, var), val); + if (changed) { + params->cmask |= 1 << var; + params->rmask |= 1 << var; + } + return changed; +} + +static int snd_pcm_hw_param_mask(struct snd_pcm_substream *pcm, + struct snd_pcm_hw_params *params, + snd_pcm_hw_param_t var, + const struct snd_mask *val) +{ + int changed = _snd_pcm_hw_param_mask(params, var, val); + if (changed < 0) + return changed; + if (params->rmask) { + int err = snd_pcm_hw_refine(pcm, params); + if (err < 0) + return err; + } + return 0; +} + +static int _snd_pcm_hw_param_min(struct snd_pcm_hw_params *params, + snd_pcm_hw_param_t var, unsigned int val, + int dir) +{ + int changed; + int open = 0; + if (dir) { + if (dir > 0) { + open = 1; + } else if (dir < 0) { + if (val > 0) { + open = 1; + val--; + } + } + } + if (hw_is_mask(var)) + changed = snd_mask_refine_min(hw_param_mask(params, var), + val + !!open); + else if (hw_is_interval(var)) + changed = snd_interval_refine_min(hw_param_interval(params, var), + val, open); + else + return -EINVAL; + if (changed) { + params->cmask |= 1 << var; + params->rmask |= 1 << var; + } + return changed; +} + +/** + * snd_pcm_hw_param_min + * @pcm: PCM instance + * @params: the hw_params instance + * @var: parameter to retrieve + * @val: minimal value + * @dir: pointer to the direction (-1,0,1) or NULL + * + * Inside configuration space defined by PARAMS remove from PAR all + * values < VAL. Reduce configuration space accordingly. + * Return new minimum or -EINVAL if the configuration space is empty + */ +static int snd_pcm_hw_param_min(struct snd_pcm_substream *pcm, + struct snd_pcm_hw_params *params, + snd_pcm_hw_param_t var, unsigned int val, + int *dir) +{ + int changed = _snd_pcm_hw_param_min(params, var, val, dir ? *dir : 0); + if (changed < 0) + return changed; + if (params->rmask) { + int err = snd_pcm_hw_refine(pcm, params); + if (err < 0) + return err; + } + return snd_pcm_hw_param_value_min(params, var, dir); +} + +static int _snd_pcm_hw_param_max(struct snd_pcm_hw_params *params, + snd_pcm_hw_param_t var, unsigned int val, + int dir) +{ + int changed; + int open = 0; + if (dir) { + if (dir < 0) { + open = 1; + } else if (dir > 0) { + open = 1; + val++; + } + } + if (hw_is_mask(var)) { + if (val == 0 && open) { + snd_mask_none(hw_param_mask(params, var)); + changed = -EINVAL; + } else + changed = snd_mask_refine_max(hw_param_mask(params, var), + val - !!open); + } else if (hw_is_interval(var)) + changed = snd_interval_refine_max(hw_param_interval(params, var), + val, open); + else + return -EINVAL; + if (changed) { + params->cmask |= 1 << var; + params->rmask |= 1 << var; + } + return changed; +} + +/** + * snd_pcm_hw_param_max + * @pcm: PCM instance + * @params: the hw_params instance + * @var: parameter to retrieve + * @val: maximal value + * @dir: pointer to the direction (-1,0,1) or NULL + * + * Inside configuration space defined by PARAMS remove from PAR all + * values >= VAL + 1. Reduce configuration space accordingly. + * Return new maximum or -EINVAL if the configuration space is empty + */ +static int snd_pcm_hw_param_max(struct snd_pcm_substream *pcm, + struct snd_pcm_hw_params *params, + snd_pcm_hw_param_t var, unsigned int val, + int *dir) +{ + int changed = _snd_pcm_hw_param_max(params, var, val, dir ? *dir : 0); + if (changed < 0) + return changed; + if (params->rmask) { + int err = snd_pcm_hw_refine(pcm, params); + if (err < 0) + return err; + } + return snd_pcm_hw_param_value_max(params, var, dir); +} + +static int boundary_sub(int a, int adir, + int b, int bdir, + int *c, int *cdir) +{ + adir = adir < 0 ? -1 : (adir > 0 ? 1 : 0); + bdir = bdir < 0 ? -1 : (bdir > 0 ? 1 : 0); + *c = a - b; + *cdir = adir - bdir; + if (*cdir == -2) { + (*c)--; + } else if (*cdir == 2) { + (*c)++; + } + return 0; +} + +static int boundary_lt(unsigned int a, int adir, + unsigned int b, int bdir) +{ + if (adir < 0) { + a--; + adir = 1; + } else if (adir > 0) + adir = 1; + if (bdir < 0) { + b--; + bdir = 1; + } else if (bdir > 0) + bdir = 1; + return a < b || (a == b && adir < bdir); +} + +/* Return 1 if min is nearer to best than max */ +static int boundary_nearer(int min, int mindir, + int best, int bestdir, + int max, int maxdir) +{ + int dmin, dmindir; + int dmax, dmaxdir; + boundary_sub(best, bestdir, min, mindir, &dmin, &dmindir); + boundary_sub(max, maxdir, best, bestdir, &dmax, &dmaxdir); + return boundary_lt(dmin, dmindir, dmax, dmaxdir); +} + +/** + * snd_pcm_hw_param_near + * @pcm: PCM instance + * @params: the hw_params instance + * @var: parameter to retrieve + * @best: value to set + * @dir: pointer to the direction (-1,0,1) or NULL + * + * Inside configuration space defined by PARAMS set PAR to the available value + * nearest to VAL. Reduce configuration space accordingly. + * This function cannot be called for SNDRV_PCM_HW_PARAM_ACCESS, + * SNDRV_PCM_HW_PARAM_FORMAT, SNDRV_PCM_HW_PARAM_SUBFORMAT. + * Return the value found. + */ +static int snd_pcm_hw_param_near(struct snd_pcm_substream *pcm, + struct snd_pcm_hw_params *params, + snd_pcm_hw_param_t var, unsigned int best, + int *dir) +{ + struct snd_pcm_hw_params *save = NULL; + int v; + unsigned int saved_min; + int last = 0; + int min, max; + int mindir, maxdir; + int valdir = dir ? *dir : 0; + /* FIXME */ + if (best > INT_MAX) + best = INT_MAX; + min = max = best; + mindir = maxdir = valdir; + if (maxdir > 0) + maxdir = 0; + else if (maxdir == 0) + maxdir = -1; + else { + maxdir = 1; + max--; + } + save = kmalloc(sizeof(*save), GFP_KERNEL); + if (save == NULL) + return -ENOMEM; + *save = *params; + saved_min = min; + min = snd_pcm_hw_param_min(pcm, params, var, min, &mindir); + if (min >= 0) { + struct snd_pcm_hw_params *params1; + if (max < 0) + goto _end; + if ((unsigned int)min == saved_min && mindir == valdir) + goto _end; + params1 = kmalloc(sizeof(*params1), GFP_KERNEL); + if (params1 == NULL) { + kfree(save); + return -ENOMEM; + } + *params1 = *save; + max = snd_pcm_hw_param_max(pcm, params1, var, max, &maxdir); + if (max < 0) { + kfree(params1); + goto _end; + } + if (boundary_nearer(max, maxdir, best, valdir, min, mindir)) { + *params = *params1; + last = 1; + } + kfree(params1); + } else { + *params = *save; + max = snd_pcm_hw_param_max(pcm, params, var, max, &maxdir); + snd_assert(max >= 0, return -EINVAL); + last = 1; + } + _end: + kfree(save); + if (last) + v = snd_pcm_hw_param_last(pcm, params, var, dir); + else + v = snd_pcm_hw_param_first(pcm, params, var, dir); + snd_assert(v >= 0, return -EINVAL); + return v; +} + +static int _snd_pcm_hw_param_set(struct snd_pcm_hw_params *params, + snd_pcm_hw_param_t var, unsigned int val, + int dir) +{ + int changed; + if (hw_is_mask(var)) { + struct snd_mask *m = hw_param_mask(params, var); + if (val == 0 && dir < 0) { + changed = -EINVAL; + snd_mask_none(m); + } else { + if (dir > 0) + val++; + else if (dir < 0) + val--; + changed = snd_mask_refine_set(hw_param_mask(params, var), val); + } + } else if (hw_is_interval(var)) { + struct snd_interval *i = hw_param_interval(params, var); + if (val == 0 && dir < 0) { + changed = -EINVAL; + snd_interval_none(i); + } else if (dir == 0) + changed = snd_interval_refine_set(i, val); + else { + struct snd_interval t; + t.openmin = 1; + t.openmax = 1; + t.empty = 0; + t.integer = 0; + if (dir < 0) { + t.min = val - 1; + t.max = val; + } else { + t.min = val; + t.max = val+1; + } + changed = snd_interval_refine(i, &t); + } + } else + return -EINVAL; + if (changed) { + params->cmask |= 1 << var; + params->rmask |= 1 << var; + } + return changed; +} + +/** + * snd_pcm_hw_param_set + * @pcm: PCM instance + * @params: the hw_params instance + * @var: parameter to retrieve + * @val: value to set + * @dir: pointer to the direction (-1,0,1) or NULL + * + * Inside configuration space defined by PARAMS remove from PAR all + * values != VAL. Reduce configuration space accordingly. + * Return VAL or -EINVAL if the configuration space is empty + */ +static int snd_pcm_hw_param_set(struct snd_pcm_substream *pcm, + struct snd_pcm_hw_params *params, + snd_pcm_hw_param_t var, unsigned int val, + int dir) +{ + int changed = _snd_pcm_hw_param_set(params, var, val, dir); + if (changed < 0) + return changed; + if (params->rmask) { + int err = snd_pcm_hw_refine(pcm, params); + if (err < 0) + return err; + } + return snd_pcm_hw_param_value(params, var, NULL); +} + +static int _snd_pcm_hw_param_setinteger(struct snd_pcm_hw_params *params, + snd_pcm_hw_param_t var) +{ + int changed; + changed = snd_interval_setinteger(hw_param_interval(params, var)); + if (changed) { + params->cmask |= 1 << var; + params->rmask |= 1 << var; + } + return changed; +} + +/* + * plugin + */ + #ifdef CONFIG_SND_PCM_OSS_PLUGINS static int snd_pcm_oss_plugin_clear(struct snd_pcm_substream *substream) { @@ -203,7 +684,7 @@ static int snd_pcm_oss_period_size(struct snd_pcm_substream *substream, oss_buffer_size = snd_pcm_plug_client_size(substream, snd_pcm_hw_param_value_max(slave_params, SNDRV_PCM_HW_PARAM_BUFFER_SIZE, NULL)) * oss_frame_size; oss_buffer_size = 1 << ld2(oss_buffer_size); - if (atomic_read(&runtime->mmap_count)) { + if (atomic_read(&substream->mmap_count)) { if (oss_buffer_size > runtime->oss.mmap_bytes) oss_buffer_size = runtime->oss.mmap_bytes; } @@ -338,7 +819,7 @@ static int snd_pcm_oss_change_params(struct snd_pcm_substream *substream) goto failure; } - if (atomic_read(&runtime->mmap_count)) + if (atomic_read(&substream->mmap_count)) direct = 1; else direct = substream->oss.setup.direct; @@ -347,7 +828,7 @@ static int snd_pcm_oss_change_params(struct snd_pcm_substream *substream) _snd_pcm_hw_param_setinteger(sparams, SNDRV_PCM_HW_PARAM_PERIODS); _snd_pcm_hw_param_min(sparams, SNDRV_PCM_HW_PARAM_PERIODS, 2, 0); snd_mask_none(&mask); - if (atomic_read(&runtime->mmap_count)) + if (atomic_read(&substream->mmap_count)) snd_mask_set(&mask, SNDRV_PCM_ACCESS_MMAP_INTERLEAVED); else { snd_mask_set(&mask, SNDRV_PCM_ACCESS_RW_INTERLEAVED); @@ -466,7 +947,8 @@ static int snd_pcm_oss_change_params(struct snd_pcm_substream *substream) } else { sw_params->start_threshold = runtime->boundary; } - if (atomic_read(&runtime->mmap_count) || substream->stream == SNDRV_PCM_STREAM_CAPTURE) + if (atomic_read(&substream->mmap_count) || + substream->stream == SNDRV_PCM_STREAM_CAPTURE) sw_params->stop_threshold = runtime->boundary; else sw_params->stop_threshold = runtime->buffer_size; @@ -476,7 +958,7 @@ static int snd_pcm_oss_change_params(struct snd_pcm_substream *substream) sw_params->avail_min = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 1 : runtime->period_size; sw_params->xfer_align = 1; - if (atomic_read(&runtime->mmap_count) || + if (atomic_read(&substream->mmap_count) || substream->oss.setup.nosilence) { sw_params->silence_threshold = 0; sw_params->silence_size = 0; @@ -820,7 +1302,7 @@ static ssize_t snd_pcm_oss_write1(struct snd_pcm_substream *substream, const cha ssize_t tmp; struct snd_pcm_runtime *runtime = substream->runtime; - if (atomic_read(&runtime->mmap_count)) + if (atomic_read(&substream->mmap_count)) return -ENXIO; if ((tmp = snd_pcm_oss_make_ready(substream)) < 0) @@ -850,7 +1332,7 @@ static ssize_t snd_pcm_oss_write1(struct snd_pcm_substream *substream, const cha if (runtime->oss.period_ptr == 0 || runtime->oss.period_ptr == runtime->oss.buffer_used) runtime->oss.buffer_used = 0; - else if ((substream->ffile->f_flags & O_NONBLOCK) != 0) + else if ((substream->f_flags & O_NONBLOCK) != 0) return xfer > 0 ? xfer : -EAGAIN; } } else { @@ -863,7 +1345,7 @@ static ssize_t snd_pcm_oss_write1(struct snd_pcm_substream *substream, const cha buf += tmp; bytes -= tmp; xfer += tmp; - if ((substream->ffile->f_flags & O_NONBLOCK) != 0 && + if ((substream->f_flags & O_NONBLOCK) != 0 && tmp != runtime->oss.period_bytes) break; } @@ -910,7 +1392,7 @@ static ssize_t snd_pcm_oss_read1(struct snd_pcm_substream *substream, char __use ssize_t tmp; struct snd_pcm_runtime *runtime = substream->runtime; - if (atomic_read(&runtime->mmap_count)) + if (atomic_read(&substream->mmap_count)) return -ENXIO; if ((tmp = snd_pcm_oss_make_ready(substream)) < 0) @@ -987,6 +1469,13 @@ static int snd_pcm_oss_sync1(struct snd_pcm_substream *substream, size_t size) ssize_t result = 0; long res; wait_queue_t wait; + static char printed_comm[16]; + + if (strncmp(printed_comm, current->comm, 16)) { + printk(KERN_DEBUG "application %s uses obsolete OSS audio interface\n", + current->comm); + memcpy(printed_comm, current->comm, 16); + } runtime = substream->runtime; init_waitqueue_entry(&wait, current); @@ -1040,7 +1529,7 @@ static int snd_pcm_oss_sync(struct snd_pcm_oss_file *pcm_oss_file) substream = pcm_oss_file->streams[SNDRV_PCM_STREAM_PLAYBACK]; if (substream != NULL) { runtime = substream->runtime; - if (atomic_read(&runtime->mmap_count)) + if (atomic_read(&substream->mmap_count)) goto __direct; if ((err = snd_pcm_oss_make_ready(substream)) < 0) return err; @@ -1101,10 +1590,10 @@ static int snd_pcm_oss_sync(struct snd_pcm_oss_file *pcm_oss_file) * finish sync: drain the buffer */ __direct: - saved_f_flags = substream->ffile->f_flags; - substream->ffile->f_flags &= ~O_NONBLOCK; + saved_f_flags = substream->f_flags; + substream->f_flags &= ~O_NONBLOCK; err = snd_pcm_kernel_ioctl(substream, SNDRV_PCM_IOCTL_DRAIN, NULL); - substream->ffile->f_flags = saved_f_flags; + substream->f_flags = saved_f_flags; if (err < 0) return err; runtime->oss.prepare = 1; @@ -1209,7 +1698,7 @@ static int snd_pcm_oss_get_formats(struct snd_pcm_oss_file *pcm_oss_file) if ((err = snd_pcm_oss_get_active_substream(pcm_oss_file, &substream)) < 0) return err; - if (atomic_read(&substream->runtime->mmap_count)) + if (atomic_read(&substream->mmap_count)) direct = 1; else direct = substream->oss.setup.direct; @@ -1419,7 +1908,7 @@ static int snd_pcm_oss_set_trigger(struct snd_pcm_oss_file *pcm_oss_file, int tr if (trigger & PCM_ENABLE_OUTPUT) { if (runtime->oss.trigger) goto _skip1; - if (atomic_read(&psubstream->runtime->mmap_count)) + if (atomic_read(&psubstream->mmap_count)) snd_pcm_oss_simulate_fill(psubstream, runtime->hw_ptr_interrupt); runtime->oss.trigger = 1; runtime->start_threshold = 1; @@ -1537,7 +2026,7 @@ static int snd_pcm_oss_get_ptr(struct snd_pcm_oss_file *pcm_oss_file, int stream if (err < 0) return err; info.ptr = snd_pcm_oss_bytes(substream, runtime->status->hw_ptr % runtime->buffer_size); - if (atomic_read(&runtime->mmap_count)) { + if (atomic_read(&substream->mmap_count)) { snd_pcm_sframes_t n; n = (delay = runtime->hw_ptr_interrupt) - runtime->oss.prev_hw_ptr_interrupt; if (n < 0) @@ -1683,9 +2172,9 @@ static void snd_pcm_oss_init_substream(struct snd_pcm_substream *substream, substream->oss.oss = 1; substream->oss.setup = *setup; if (setup->nonblock) - substream->ffile->f_flags |= O_NONBLOCK; + substream->f_flags |= O_NONBLOCK; else if (setup->block) - substream->ffile->f_flags &= ~O_NONBLOCK; + substream->f_flags &= ~O_NONBLOCK; runtime = substream->runtime; runtime->oss.params = 1; runtime->oss.trigger = 1; @@ -1742,6 +2231,7 @@ static int snd_pcm_oss_open_file(struct file *file, (pcm->info_flags & SNDRV_PCM_INFO_HALF_DUPLEX)) f_mode = FMODE_WRITE; + file->f_flags &= ~O_APPEND; for (idx = 0; idx < 2; idx++) { if (setup[idx].disable) continue; @@ -1796,13 +2286,6 @@ static int snd_pcm_oss_open(struct inode *inode, struct file *file) struct snd_pcm_oss_setup setup[2]; int nonblock; wait_queue_t wait; - static char printed_comm[16]; - - if (strncmp(printed_comm, current->comm, 16)) { - printk(KERN_DEBUG "application %s uses obsolete OSS audio interface\n", - current->comm); - memcpy(printed_comm, current->comm, 16); - } pcm = snd_lookup_oss_minor_data(iminor(inode), SNDRV_OSS_DEVICE_TYPE_PCM); @@ -2068,6 +2551,7 @@ static ssize_t snd_pcm_oss_read(struct file *file, char __user *buf, size_t coun substream = pcm_oss_file->streams[SNDRV_PCM_STREAM_CAPTURE]; if (substream == NULL) return -ENXIO; + substream->f_flags = file->f_flags & O_NONBLOCK; #ifndef OSS_DEBUG return snd_pcm_oss_read1(substream, buf, count); #else @@ -2089,6 +2573,7 @@ static ssize_t snd_pcm_oss_write(struct file *file, const char __user *buf, size substream = pcm_oss_file->streams[SNDRV_PCM_STREAM_PLAYBACK]; if (substream == NULL) return -ENXIO; + substream->f_flags = file->f_flags & O_NONBLOCK; result = snd_pcm_oss_write1(substream, buf, count); #ifdef OSS_DEBUG printk("pcm_oss: write %li bytes (wrote %li bytes)\n", (long)count, (long)result); @@ -2099,7 +2584,7 @@ static ssize_t snd_pcm_oss_write(struct file *file, const char __user *buf, size static int snd_pcm_oss_playback_ready(struct snd_pcm_substream *substream) { struct snd_pcm_runtime *runtime = substream->runtime; - if (atomic_read(&runtime->mmap_count)) + if (atomic_read(&substream->mmap_count)) return runtime->oss.prev_hw_ptr_interrupt != runtime->hw_ptr_interrupt; else return snd_pcm_playback_avail(runtime) >= runtime->oss.period_frames; @@ -2108,7 +2593,7 @@ static int snd_pcm_oss_playback_ready(struct snd_pcm_substream *substream) static int snd_pcm_oss_capture_ready(struct snd_pcm_substream *substream) { struct snd_pcm_runtime *runtime = substream->runtime; - if (atomic_read(&runtime->mmap_count)) + if (atomic_read(&substream->mmap_count)) return runtime->oss.prev_hw_ptr_interrupt != runtime->hw_ptr_interrupt; else return snd_pcm_capture_avail(runtime) >= runtime->oss.period_frames; @@ -2351,9 +2836,7 @@ static void snd_pcm_oss_proc_init(struct snd_pcm *pcm) if ((entry = snd_info_create_card_entry(pcm->card, "oss", pstr->proc_root)) != NULL) { entry->content = SNDRV_INFO_CONTENT_TEXT; entry->mode = S_IFREG | S_IRUGO | S_IWUSR; - entry->c.text.read_size = 8192; entry->c.text.read = snd_pcm_oss_proc_read; - entry->c.text.write_size = 8192; entry->c.text.write = snd_pcm_oss_proc_write; entry->private_data = pstr; if (snd_info_register(entry) < 0) { diff --git a/sound/core/pcm.c b/sound/core/pcm.c index 84b000382..7581edd7b 100644 --- a/sound/core/pcm.c +++ b/sound/core/pcm.c @@ -351,10 +351,8 @@ static void snd_pcm_substream_proc_hw_params_read(struct snd_info_entry *entry, snd_iprintf(buffer, "closed\n"); return; } - snd_pcm_stream_lock_irq(substream); if (runtime->status->state == SNDRV_PCM_STATE_OPEN) { snd_iprintf(buffer, "no setup\n"); - snd_pcm_stream_unlock_irq(substream); return; } snd_iprintf(buffer, "access: %s\n", snd_pcm_access_name(runtime->access)); @@ -375,7 +373,6 @@ static void snd_pcm_substream_proc_hw_params_read(struct snd_info_entry *entry, snd_iprintf(buffer, "OSS period frames: %lu\n", (unsigned long)runtime->oss.period_frames); } #endif - snd_pcm_stream_unlock_irq(substream); } static void snd_pcm_substream_proc_sw_params_read(struct snd_info_entry *entry, @@ -387,10 +384,8 @@ static void snd_pcm_substream_proc_sw_params_read(struct snd_info_entry *entry, snd_iprintf(buffer, "closed\n"); return; } - snd_pcm_stream_lock_irq(substream); if (runtime->status->state == SNDRV_PCM_STATE_OPEN) { snd_iprintf(buffer, "no setup\n"); - snd_pcm_stream_unlock_irq(substream); return; } snd_iprintf(buffer, "tstamp_mode: %s\n", snd_pcm_tstamp_mode_name(runtime->tstamp_mode)); @@ -403,7 +398,6 @@ static void snd_pcm_substream_proc_sw_params_read(struct snd_info_entry *entry, snd_iprintf(buffer, "silence_threshold: %lu\n", runtime->silence_threshold); snd_iprintf(buffer, "silence_size: %lu\n", runtime->silence_size); snd_iprintf(buffer, "boundary: %lu\n", runtime->boundary); - snd_pcm_stream_unlock_irq(substream); } static void snd_pcm_substream_proc_status_read(struct snd_info_entry *entry, @@ -472,7 +466,7 @@ static int snd_pcm_stream_proc_init(struct snd_pcm_str *pstr) pstr->proc_root = entry; if ((entry = snd_info_create_card_entry(pcm->card, "info", pstr->proc_root)) != NULL) { - snd_info_set_text_ops(entry, pstr, 256, snd_pcm_stream_proc_info_read); + snd_info_set_text_ops(entry, pstr, snd_pcm_stream_proc_info_read); if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); entry = NULL; @@ -483,9 +477,7 @@ static int snd_pcm_stream_proc_init(struct snd_pcm_str *pstr) #ifdef CONFIG_SND_PCM_XRUN_DEBUG if ((entry = snd_info_create_card_entry(pcm->card, "xrun_debug", pstr->proc_root)) != NULL) { - entry->c.text.read_size = 64; entry->c.text.read = snd_pcm_xrun_debug_read; - entry->c.text.write_size = 64; entry->c.text.write = snd_pcm_xrun_debug_write; entry->mode |= S_IWUSR; entry->private_data = pstr; @@ -537,7 +529,8 @@ static int snd_pcm_substream_proc_init(struct snd_pcm_substream *substream) substream->proc_root = entry; if ((entry = snd_info_create_card_entry(card, "info", substream->proc_root)) != NULL) { - snd_info_set_text_ops(entry, substream, 256, snd_pcm_substream_proc_info_read); + snd_info_set_text_ops(entry, substream, + snd_pcm_substream_proc_info_read); if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); entry = NULL; @@ -546,7 +539,8 @@ static int snd_pcm_substream_proc_init(struct snd_pcm_substream *substream) substream->proc_info_entry = entry; if ((entry = snd_info_create_card_entry(card, "hw_params", substream->proc_root)) != NULL) { - snd_info_set_text_ops(entry, substream, 256, snd_pcm_substream_proc_hw_params_read); + snd_info_set_text_ops(entry, substream, + snd_pcm_substream_proc_hw_params_read); if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); entry = NULL; @@ -555,7 +549,8 @@ static int snd_pcm_substream_proc_init(struct snd_pcm_substream *substream) substream->proc_hw_params_entry = entry; if ((entry = snd_info_create_card_entry(card, "sw_params", substream->proc_root)) != NULL) { - snd_info_set_text_ops(entry, substream, 256, snd_pcm_substream_proc_sw_params_read); + snd_info_set_text_ops(entry, substream, + snd_pcm_substream_proc_sw_params_read); if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); entry = NULL; @@ -564,7 +559,8 @@ static int snd_pcm_substream_proc_init(struct snd_pcm_substream *substream) substream->proc_sw_params_entry = entry; if ((entry = snd_info_create_card_entry(card, "status", substream->proc_root)) != NULL) { - snd_info_set_text_ops(entry, substream, 256, snd_pcm_substream_proc_status_read); + snd_info_set_text_ops(entry, substream, + snd_pcm_substream_proc_status_read); if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); entry = NULL; @@ -666,11 +662,14 @@ int snd_pcm_new_stream(struct snd_pcm *pcm, int stream, int substream_count) INIT_LIST_HEAD(&substream->self_group.substreams); list_add_tail(&substream->link_list, &substream->self_group.substreams); spin_lock_init(&substream->timer_lock); + atomic_set(&substream->mmap_count, 0); prev = substream; } return 0; } +EXPORT_SYMBOL(snd_pcm_new_stream); + /** * snd_pcm_new - create a new PCM instance * @card: the card instance @@ -730,6 +729,8 @@ int snd_pcm_new(struct snd_card *card, char *id, int device, return 0; } +EXPORT_SYMBOL(snd_pcm_new); + static void snd_pcm_free_stream(struct snd_pcm_str * pstr) { struct snd_pcm_substream *substream, *substream_next; @@ -829,6 +830,26 @@ int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream, return -EINVAL; } + if (file->f_flags & O_APPEND) { + if (prefer_subdevice < 0) { + if (pstr->substream_count > 1) + return -EINVAL; /* must be unique */ + substream = pstr->substream; + } else { + for (substream = pstr->substream; substream; + substream = substream->next) + if (substream->number == prefer_subdevice) + break; + } + if (! substream) + return -ENODEV; + if (! SUBSTREAM_BUSY(substream)) + return -EBADFD; + substream->ref_count++; + *rsubstream = substream; + return 0; + } + if (prefer_subdevice >= 0) { for (substream = pstr->substream; substream; substream = substream->next) if (!SUBSTREAM_BUSY(substream) && substream->number == prefer_subdevice) @@ -864,7 +885,6 @@ int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream, memset((void*)runtime->control, 0, size); init_waitqueue_head(&runtime->sleep); - atomic_set(&runtime->mmap_count, 0); init_timer(&runtime->tick_timer); runtime->tick_timer.function = snd_pcm_tick_timer_func; runtime->tick_timer.data = (unsigned long) substream; @@ -873,7 +893,8 @@ int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream, substream->runtime = runtime; substream->private_data = pcm->private_data; - substream->ffile = file; + substream->ref_count = 1; + substream->f_flags = file->f_flags; pstr->substream_opened++; *rsubstream = substream; return 0; @@ -882,7 +903,7 @@ int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream, void snd_pcm_detach_substream(struct snd_pcm_substream *substream) { struct snd_pcm_runtime *runtime; - substream->file = NULL; + runtime = substream->runtime; snd_assert(runtime != NULL, return); if (runtime->private_free != NULL) @@ -1022,6 +1043,8 @@ int snd_pcm_notify(struct snd_pcm_notify *notify, int nfree) return 0; } +EXPORT_SYMBOL(snd_pcm_notify); + #ifdef CONFIG_PROC_FS /* * Info interface @@ -1049,15 +1072,14 @@ static void snd_pcm_proc_read(struct snd_info_entry *entry, mutex_unlock(®ister_mutex); } -static struct snd_info_entry *snd_pcm_proc_entry = NULL; +static struct snd_info_entry *snd_pcm_proc_entry; static void snd_pcm_proc_init(void) { struct snd_info_entry *entry; if ((entry = snd_info_create_module_entry(THIS_MODULE, "pcm", NULL)) != NULL) { - snd_info_set_text_ops(entry, NULL, SNDRV_CARDS * SNDRV_PCM_DEVICES * 128, - snd_pcm_proc_read); + snd_info_set_text_ops(entry, NULL, snd_pcm_proc_read); if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); entry = NULL; @@ -1099,33 +1121,3 @@ static void __exit alsa_pcm_exit(void) module_init(alsa_pcm_init) module_exit(alsa_pcm_exit) - -EXPORT_SYMBOL(snd_pcm_new); -EXPORT_SYMBOL(snd_pcm_new_stream); -EXPORT_SYMBOL(snd_pcm_notify); -EXPORT_SYMBOL(snd_pcm_open_substream); -EXPORT_SYMBOL(snd_pcm_release_substream); - /* pcm_native.c */ -EXPORT_SYMBOL(snd_pcm_link_rwlock); -#ifdef CONFIG_PM -EXPORT_SYMBOL(snd_pcm_suspend); -EXPORT_SYMBOL(snd_pcm_suspend_all); -#endif -EXPORT_SYMBOL(snd_pcm_kernel_ioctl); -EXPORT_SYMBOL(snd_pcm_mmap_data); -#if SNDRV_PCM_INFO_MMAP_IOMEM -EXPORT_SYMBOL(snd_pcm_lib_mmap_iomem); -#endif - /* pcm_misc.c */ -EXPORT_SYMBOL(snd_pcm_format_signed); -EXPORT_SYMBOL(snd_pcm_format_unsigned); -EXPORT_SYMBOL(snd_pcm_format_linear); -EXPORT_SYMBOL(snd_pcm_format_little_endian); -EXPORT_SYMBOL(snd_pcm_format_big_endian); -EXPORT_SYMBOL(snd_pcm_format_width); -EXPORT_SYMBOL(snd_pcm_format_physical_width); -EXPORT_SYMBOL(snd_pcm_format_size); -EXPORT_SYMBOL(snd_pcm_format_silence_64); -EXPORT_SYMBOL(snd_pcm_format_set_silence); -EXPORT_SYMBOL(snd_pcm_build_linear_format); -EXPORT_SYMBOL(snd_pcm_limit_hw_rates); diff --git a/sound/core/pcm_compat.c b/sound/core/pcm_compat.c index 3920bf0ee..2b8aab6fd 100644 --- a/sound/core/pcm_compat.c +++ b/sound/core/pcm_compat.c @@ -22,7 +22,7 @@ #include -static int snd_pcm_ioctl_delay_compat(snd_pcm_substream_t *substream, +static int snd_pcm_ioctl_delay_compat(struct snd_pcm_substream *substream, s32 __user *src) { snd_pcm_sframes_t delay; @@ -39,7 +39,7 @@ static int snd_pcm_ioctl_delay_compat(snd_pcm_substream_t *substream, return err; } -static int snd_pcm_ioctl_rewind_compat(snd_pcm_substream_t *substream, +static int snd_pcm_ioctl_rewind_compat(struct snd_pcm_substream *substream, u32 __user *src) { snd_pcm_uframes_t frames; @@ -56,7 +56,7 @@ static int snd_pcm_ioctl_rewind_compat(snd_pcm_substream_t *substream, return err < 0 ? err : 0; } -static int snd_pcm_ioctl_forward_compat(snd_pcm_substream_t *substream, +static int snd_pcm_ioctl_forward_compat(struct snd_pcm_substream *substream, u32 __user *src) { snd_pcm_uframes_t frames; @@ -73,12 +73,12 @@ static int snd_pcm_ioctl_forward_compat(snd_pcm_substream_t *substream, return err < 0 ? err : 0; } -struct sndrv_pcm_hw_params32 { +struct snd_pcm_hw_params32 { u32 flags; - struct sndrv_mask masks[SNDRV_PCM_HW_PARAM_LAST_MASK - SNDRV_PCM_HW_PARAM_FIRST_MASK + 1]; /* this must be identical */ - struct sndrv_mask mres[5]; /* reserved masks */ - struct sndrv_interval intervals[SNDRV_PCM_HW_PARAM_LAST_INTERVAL - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL + 1]; - struct sndrv_interval ires[9]; /* reserved intervals */ + struct snd_mask masks[SNDRV_PCM_HW_PARAM_LAST_MASK - SNDRV_PCM_HW_PARAM_FIRST_MASK + 1]; /* this must be identical */ + struct snd_mask mres[5]; /* reserved masks */ + struct snd_interval intervals[SNDRV_PCM_HW_PARAM_LAST_INTERVAL - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL + 1]; + struct snd_interval ires[9]; /* reserved intervals */ u32 rmask; u32 cmask; u32 info; @@ -89,7 +89,7 @@ struct sndrv_pcm_hw_params32 { unsigned char reserved[64]; }; -struct sndrv_pcm_sw_params32 { +struct snd_pcm_sw_params32 { s32 tstamp_mode; u32 period_step; u32 sleep_min; @@ -103,10 +103,24 @@ struct sndrv_pcm_sw_params32 { unsigned char reserved[64]; }; -static int snd_pcm_ioctl_sw_params_compat(snd_pcm_substream_t *substream, - struct sndrv_pcm_sw_params32 __user *src) +/* recalcuate the boundary within 32bit */ +static snd_pcm_uframes_t recalculate_boundary(struct snd_pcm_runtime *runtime) { - snd_pcm_sw_params_t params; + snd_pcm_uframes_t boundary; + + if (! runtime->buffer_size) + return 0; + boundary = runtime->buffer_size; + while (boundary * 2 <= 0x7fffffffUL - runtime->buffer_size) + boundary *= 2; + return boundary; +} + +static int snd_pcm_ioctl_sw_params_compat(struct snd_pcm_substream *substream, + struct snd_pcm_sw_params32 __user *src) +{ + struct snd_pcm_sw_params params; + snd_pcm_uframes_t boundary; int err; memset(¶ms, 0, sizeof(params)); @@ -120,25 +134,32 @@ static int snd_pcm_ioctl_sw_params_compat(snd_pcm_substream_t *substream, get_user(params.silence_threshold, &src->silence_threshold) || get_user(params.silence_size, &src->silence_size)) return -EFAULT; + /* + * Check silent_size parameter. Since we have 64bit boundary, + * silence_size must be compared with the 32bit boundary. + */ + boundary = recalculate_boundary(substream->runtime); + if (boundary && params.silence_size >= boundary) + params.silence_size = substream->runtime->boundary; err = snd_pcm_sw_params(substream, ¶ms); if (err < 0) return err; - if (put_user(params.boundary, &src->boundary)) + if (boundary && put_user(boundary, &src->boundary)) return -EFAULT; return err; } -struct sndrv_pcm_channel_info32 { +struct snd_pcm_channel_info32 { u32 channel; u32 offset; u32 first; u32 step; }; -static int snd_pcm_ioctl_channel_info_compat(snd_pcm_substream_t *substream, - struct sndrv_pcm_channel_info32 __user *src) +static int snd_pcm_ioctl_channel_info_compat(struct snd_pcm_substream *substream, + struct snd_pcm_channel_info32 __user *src) { - snd_pcm_channel_info_t info; + struct snd_pcm_channel_info info; int err; if (get_user(info.channel, &src->channel) || @@ -157,7 +178,7 @@ static int snd_pcm_ioctl_channel_info_compat(snd_pcm_substream_t *substream, return err; } -struct sndrv_pcm_status32 { +struct snd_pcm_status32 { s32 state; struct compat_timespec trigger_tstamp; struct compat_timespec tstamp; @@ -172,10 +193,10 @@ struct sndrv_pcm_status32 { } __attribute__((packed)); -static int snd_pcm_status_user_compat(snd_pcm_substream_t *substream, - struct sndrv_pcm_status32 __user *src) +static int snd_pcm_status_user_compat(struct snd_pcm_substream *substream, + struct snd_pcm_status32 __user *src) { - snd_pcm_status_t status; + struct snd_pcm_status status; int err; err = snd_pcm_status(substream, &status); @@ -199,23 +220,13 @@ static int snd_pcm_status_user_compat(snd_pcm_substream_t *substream, return err; } -/* recalcuate the boundary within 32bit */ -static void recalculate_boundary(snd_pcm_runtime_t *runtime) -{ - if (! runtime->buffer_size) - return; - runtime->boundary = runtime->buffer_size; - while (runtime->boundary * 2 <= 0x7fffffffUL - runtime->buffer_size) - runtime->boundary *= 2; -} - /* both for HW_PARAMS and HW_REFINE */ -static int snd_pcm_ioctl_hw_params_compat(snd_pcm_substream_t *substream, +static int snd_pcm_ioctl_hw_params_compat(struct snd_pcm_substream *substream, int refine, - struct sndrv_pcm_hw_params32 __user *data32) + struct snd_pcm_hw_params32 __user *data32) { - struct sndrv_pcm_hw_params *data; - snd_pcm_runtime_t *runtime; + struct snd_pcm_hw_params *data; + struct snd_pcm_runtime *runtime; int err; if (! (runtime = substream->runtime)) @@ -241,8 +252,11 @@ static int snd_pcm_ioctl_hw_params_compat(snd_pcm_substream_t *substream, goto error; } - if (! refine) - recalculate_boundary(runtime); + if (! refine) { + unsigned int new_boundary = recalculate_boundary(runtime); + if (new_boundary) + runtime->boundary = new_boundary; + } error: kfree(data); return err; @@ -251,14 +265,14 @@ static int snd_pcm_ioctl_hw_params_compat(snd_pcm_substream_t *substream, /* */ -struct sndrv_xferi32 { +struct snd_xferi32 { s32 result; u32 buf; u32 frames; }; -static int snd_pcm_ioctl_xferi_compat(snd_pcm_substream_t *substream, - int dir, struct sndrv_xferi32 __user *data32) +static int snd_pcm_ioctl_xferi_compat(struct snd_pcm_substream *substream, + int dir, struct snd_xferi32 __user *data32) { compat_caddr_t buf; u32 frames; @@ -289,7 +303,7 @@ static int snd_pcm_ioctl_xferi_compat(snd_pcm_substream_t *substream, /* snd_xfern needs remapping of bufs */ -struct sndrv_xfern32 { +struct snd_xfern32 { s32 result; u32 bufs; /* this is void **; */ u32 frames; @@ -301,8 +315,8 @@ struct sndrv_xfern32 { * handler there expands again the same 128 pointers on stack, so it is better * to handle the function (calling pcm_readv/writev) directly in this handler. */ -static int snd_pcm_ioctl_xfern_compat(snd_pcm_substream_t *substream, - int dir, struct sndrv_xfern32 __user *data32) +static int snd_pcm_ioctl_xfern_compat(struct snd_pcm_substream *substream, + int dir, struct snd_xfern32 __user *data32) { compat_caddr_t buf; compat_caddr_t __user *bufptr; @@ -346,7 +360,7 @@ static int snd_pcm_ioctl_xfern_compat(snd_pcm_substream_t *substream, } -struct sndrv_pcm_mmap_status32 { +struct snd_pcm_mmap_status32 { s32 state; s32 pad1; u32 hw_ptr; @@ -354,32 +368,33 @@ struct sndrv_pcm_mmap_status32 { s32 suspended_state; } __attribute__((packed)); -struct sndrv_pcm_mmap_control32 { +struct snd_pcm_mmap_control32 { u32 appl_ptr; u32 avail_min; }; -struct sndrv_pcm_sync_ptr32 { +struct snd_pcm_sync_ptr32 { u32 flags; union { - struct sndrv_pcm_mmap_status32 status; + struct snd_pcm_mmap_status32 status; unsigned char reserved[64]; } s; union { - struct sndrv_pcm_mmap_control32 control; + struct snd_pcm_mmap_control32 control; unsigned char reserved[64]; } c; } __attribute__((packed)); -static int snd_pcm_ioctl_sync_ptr_compat(snd_pcm_substream_t *substream, - struct sndrv_pcm_sync_ptr32 __user *src) +static int snd_pcm_ioctl_sync_ptr_compat(struct snd_pcm_substream *substream, + struct snd_pcm_sync_ptr32 __user *src) { - snd_pcm_runtime_t *runtime = substream->runtime; - volatile struct sndrv_pcm_mmap_status *status; - volatile struct sndrv_pcm_mmap_control *control; + struct snd_pcm_runtime *runtime = substream->runtime; + volatile struct snd_pcm_mmap_status *status; + volatile struct snd_pcm_mmap_control *control; u32 sflags; - struct sndrv_pcm_mmap_control scontrol; - struct sndrv_pcm_mmap_status sstatus; + struct snd_pcm_mmap_control scontrol; + struct snd_pcm_mmap_status sstatus; + snd_pcm_uframes_t boundary; int err; snd_assert(runtime, return -EINVAL); @@ -395,17 +410,21 @@ static int snd_pcm_ioctl_sync_ptr_compat(snd_pcm_substream_t *substream, } status = runtime->status; control = runtime->control; + boundary = recalculate_boundary(runtime); + if (! boundary) + boundary = 0x7fffffff; snd_pcm_stream_lock_irq(substream); + /* FIXME: we should consider the boundary for the sync from app */ if (!(sflags & SNDRV_PCM_SYNC_PTR_APPL)) control->appl_ptr = scontrol.appl_ptr; else - scontrol.appl_ptr = control->appl_ptr; + scontrol.appl_ptr = control->appl_ptr % boundary; if (!(sflags & SNDRV_PCM_SYNC_PTR_AVAIL_MIN)) control->avail_min = scontrol.avail_min; else scontrol.avail_min = control->avail_min; sstatus.state = status->state; - sstatus.hw_ptr = status->hw_ptr; + sstatus.hw_ptr = status->hw_ptr % boundary; sstatus.tstamp = status->tstamp; sstatus.suspended_state = status->suspended_state; snd_pcm_stream_unlock_irq(substream); @@ -425,26 +444,26 @@ static int snd_pcm_ioctl_sync_ptr_compat(snd_pcm_substream_t *substream, /* */ enum { - SNDRV_PCM_IOCTL_HW_REFINE32 = _IOWR('A', 0x10, struct sndrv_pcm_hw_params32), - SNDRV_PCM_IOCTL_HW_PARAMS32 = _IOWR('A', 0x11, struct sndrv_pcm_hw_params32), - SNDRV_PCM_IOCTL_SW_PARAMS32 = _IOWR('A', 0x13, struct sndrv_pcm_sw_params32), - SNDRV_PCM_IOCTL_STATUS32 = _IOR('A', 0x20, struct sndrv_pcm_status32), + SNDRV_PCM_IOCTL_HW_REFINE32 = _IOWR('A', 0x10, struct snd_pcm_hw_params32), + SNDRV_PCM_IOCTL_HW_PARAMS32 = _IOWR('A', 0x11, struct snd_pcm_hw_params32), + SNDRV_PCM_IOCTL_SW_PARAMS32 = _IOWR('A', 0x13, struct snd_pcm_sw_params32), + SNDRV_PCM_IOCTL_STATUS32 = _IOR('A', 0x20, struct snd_pcm_status32), SNDRV_PCM_IOCTL_DELAY32 = _IOR('A', 0x21, s32), - SNDRV_PCM_IOCTL_CHANNEL_INFO32 = _IOR('A', 0x32, struct sndrv_pcm_channel_info32), + SNDRV_PCM_IOCTL_CHANNEL_INFO32 = _IOR('A', 0x32, struct snd_pcm_channel_info32), SNDRV_PCM_IOCTL_REWIND32 = _IOW('A', 0x46, u32), SNDRV_PCM_IOCTL_FORWARD32 = _IOW('A', 0x49, u32), - SNDRV_PCM_IOCTL_WRITEI_FRAMES32 = _IOW('A', 0x50, struct sndrv_xferi32), - SNDRV_PCM_IOCTL_READI_FRAMES32 = _IOR('A', 0x51, struct sndrv_xferi32), - SNDRV_PCM_IOCTL_WRITEN_FRAMES32 = _IOW('A', 0x52, struct sndrv_xfern32), - SNDRV_PCM_IOCTL_READN_FRAMES32 = _IOR('A', 0x53, struct sndrv_xfern32), - SNDRV_PCM_IOCTL_SYNC_PTR32 = _IOWR('A', 0x23, struct sndrv_pcm_sync_ptr32), + SNDRV_PCM_IOCTL_WRITEI_FRAMES32 = _IOW('A', 0x50, struct snd_xferi32), + SNDRV_PCM_IOCTL_READI_FRAMES32 = _IOR('A', 0x51, struct snd_xferi32), + SNDRV_PCM_IOCTL_WRITEN_FRAMES32 = _IOW('A', 0x52, struct snd_xfern32), + SNDRV_PCM_IOCTL_READN_FRAMES32 = _IOR('A', 0x53, struct snd_xfern32), + SNDRV_PCM_IOCTL_SYNC_PTR32 = _IOWR('A', 0x23, struct snd_pcm_sync_ptr32), }; static long snd_pcm_ioctl_compat(struct file *file, unsigned int cmd, unsigned long arg) { - snd_pcm_file_t *pcm_file; - snd_pcm_substream_t *substream; + struct snd_pcm_file *pcm_file; + struct snd_pcm_substream *substream; void __user *argp = compat_ptr(arg); pcm_file = file->private_data; @@ -478,9 +497,9 @@ static long snd_pcm_ioctl_compat(struct file *file, unsigned int cmd, unsigned l case SNDRV_PCM_IOCTL_LINK: case SNDRV_PCM_IOCTL_UNLINK: if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - return snd_pcm_playback_ioctl1(substream, cmd, argp); + return snd_pcm_playback_ioctl1(file, substream, cmd, argp); else - return snd_pcm_capture_ioctl1(substream, cmd, argp); + return snd_pcm_capture_ioctl1(file, substream, cmd, argp); case SNDRV_PCM_IOCTL_HW_REFINE32: return snd_pcm_ioctl_hw_params_compat(substream, 1, argp); case SNDRV_PCM_IOCTL_HW_PARAMS32: diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c index eedc6cb03..0bb142a28 100644 --- a/sound/core/pcm_lib.c +++ b/sound/core/pcm_lib.c @@ -289,6 +289,7 @@ void snd_pcm_set_ops(struct snd_pcm *pcm, int direction, struct snd_pcm_ops *ops substream->ops = ops; } +EXPORT_SYMBOL(snd_pcm_set_ops); /** * snd_pcm_sync - set the PCM sync id @@ -306,13 +307,12 @@ void snd_pcm_set_sync(struct snd_pcm_substream *substream) runtime->sync.id32[3] = -1; } +EXPORT_SYMBOL(snd_pcm_set_sync); + /* * Standard ioctl routine */ -/* Code taken from alsa-lib */ -#define assert(a) snd_assert((a), return -EINVAL) - static inline unsigned int div32(unsigned int a, unsigned int b, unsigned int *r) { @@ -369,56 +369,6 @@ static inline unsigned int muldiv32(unsigned int a, unsigned int b, return n; } -static int snd_interval_refine_min(struct snd_interval *i, unsigned int min, int openmin) -{ - int changed = 0; - assert(!snd_interval_empty(i)); - if (i->min < min) { - i->min = min; - i->openmin = openmin; - changed = 1; - } else if (i->min == min && !i->openmin && openmin) { - i->openmin = 1; - changed = 1; - } - if (i->integer) { - if (i->openmin) { - i->min++; - i->openmin = 0; - } - } - if (snd_interval_checkempty(i)) { - snd_interval_none(i); - return -EINVAL; - } - return changed; -} - -static int snd_interval_refine_max(struct snd_interval *i, unsigned int max, int openmax) -{ - int changed = 0; - assert(!snd_interval_empty(i)); - if (i->max > max) { - i->max = max; - i->openmax = openmax; - changed = 1; - } else if (i->max == max && !i->openmax && openmax) { - i->openmax = 1; - changed = 1; - } - if (i->integer) { - if (i->openmax) { - i->max--; - i->openmax = 0; - } - } - if (snd_interval_checkempty(i)) { - snd_interval_none(i); - return -EINVAL; - } - return changed; -} - /** * snd_interval_refine - refine the interval value of configurator * @i: the interval value to refine @@ -433,7 +383,7 @@ static int snd_interval_refine_max(struct snd_interval *i, unsigned int max, int int snd_interval_refine(struct snd_interval *i, const struct snd_interval *v) { int changed = 0; - assert(!snd_interval_empty(i)); + snd_assert(!snd_interval_empty(i), return -EINVAL); if (i->min < v->min) { i->min = v->min; i->openmin = v->openmin; @@ -472,9 +422,11 @@ int snd_interval_refine(struct snd_interval *i, const struct snd_interval *v) return changed; } +EXPORT_SYMBOL(snd_interval_refine); + static int snd_interval_refine_first(struct snd_interval *i) { - assert(!snd_interval_empty(i)); + snd_assert(!snd_interval_empty(i), return -EINVAL); if (snd_interval_single(i)) return 0; i->max = i->min; @@ -486,7 +438,7 @@ static int snd_interval_refine_first(struct snd_interval *i) static int snd_interval_refine_last(struct snd_interval *i) { - assert(!snd_interval_empty(i)); + snd_assert(!snd_interval_empty(i), return -EINVAL); if (snd_interval_single(i)) return 0; i->min = i->max; @@ -496,16 +448,6 @@ static int snd_interval_refine_last(struct snd_interval *i) return 1; } -static int snd_interval_refine_set(struct snd_interval *i, unsigned int val) -{ - struct snd_interval t; - t.empty = 0; - t.min = t.max = val; - t.openmin = t.openmax = 0; - t.integer = 1; - return snd_interval_refine(i, &t); -} - void snd_interval_mul(const struct snd_interval *a, const struct snd_interval *b, struct snd_interval *c) { if (a->empty || b->empty) { @@ -621,7 +563,6 @@ void snd_interval_mulkdiv(const struct snd_interval *a, unsigned int k, c->integer = 0; } -#undef assert /* ---- */ @@ -727,6 +668,8 @@ int snd_interval_ratnum(struct snd_interval *i, return err; } +EXPORT_SYMBOL(snd_interval_ratnum); + /** * snd_interval_ratden - refine the interval value * @i: interval to refine @@ -877,6 +820,8 @@ int snd_interval_list(struct snd_interval *i, unsigned int count, unsigned int * return changed; } +EXPORT_SYMBOL(snd_interval_list); + static int snd_interval_step(struct snd_interval *i, unsigned int min, unsigned int step) { unsigned int n; @@ -953,6 +898,8 @@ int snd_pcm_hw_rule_add(struct snd_pcm_runtime *runtime, unsigned int cond, return 0; } +EXPORT_SYMBOL(snd_pcm_hw_rule_add); + /** * snd_pcm_hw_constraint_mask * @runtime: PCM runtime instance @@ -1007,6 +954,8 @@ int snd_pcm_hw_constraint_integer(struct snd_pcm_runtime *runtime, snd_pcm_hw_pa return snd_interval_setinteger(constrs_interval(constrs, var)); } +EXPORT_SYMBOL(snd_pcm_hw_constraint_integer); + /** * snd_pcm_hw_constraint_minmax * @runtime: PCM runtime instance @@ -1028,6 +977,8 @@ int snd_pcm_hw_constraint_minmax(struct snd_pcm_runtime *runtime, snd_pcm_hw_par return snd_interval_refine(constrs_interval(constrs, var), &t); } +EXPORT_SYMBOL(snd_pcm_hw_constraint_minmax); + static int snd_pcm_hw_rule_list(struct snd_pcm_hw_params *params, struct snd_pcm_hw_rule *rule) { @@ -1055,6 +1006,8 @@ int snd_pcm_hw_constraint_list(struct snd_pcm_runtime *runtime, var, -1); } +EXPORT_SYMBOL(snd_pcm_hw_constraint_list); + static int snd_pcm_hw_rule_ratnums(struct snd_pcm_hw_params *params, struct snd_pcm_hw_rule *rule) { @@ -1087,6 +1040,8 @@ int snd_pcm_hw_constraint_ratnums(struct snd_pcm_runtime *runtime, var, -1); } +EXPORT_SYMBOL(snd_pcm_hw_constraint_ratnums); + static int snd_pcm_hw_rule_ratdens(struct snd_pcm_hw_params *params, struct snd_pcm_hw_rule *rule) { @@ -1118,6 +1073,8 @@ int snd_pcm_hw_constraint_ratdens(struct snd_pcm_runtime *runtime, var, -1); } +EXPORT_SYMBOL(snd_pcm_hw_constraint_ratdens); + static int snd_pcm_hw_rule_msbits(struct snd_pcm_hw_params *params, struct snd_pcm_hw_rule *rule) { @@ -1149,6 +1106,8 @@ int snd_pcm_hw_constraint_msbits(struct snd_pcm_runtime *runtime, SNDRV_PCM_HW_PARAM_SAMPLE_BITS, -1); } +EXPORT_SYMBOL(snd_pcm_hw_constraint_msbits); + static int snd_pcm_hw_rule_step(struct snd_pcm_hw_params *params, struct snd_pcm_hw_rule *rule) { @@ -1173,6 +1132,8 @@ int snd_pcm_hw_constraint_step(struct snd_pcm_runtime *runtime, var, -1); } +EXPORT_SYMBOL(snd_pcm_hw_constraint_step); + static int snd_pcm_hw_rule_pow2(struct snd_pcm_hw_params *params, struct snd_pcm_hw_rule *rule) { static int pow2_sizes[] = { @@ -1200,11 +1161,7 @@ int snd_pcm_hw_constraint_pow2(struct snd_pcm_runtime *runtime, var, -1); } -/* To use the same code we have in alsa-lib */ -#define assert(i) snd_assert((i), return -EINVAL) -#ifndef INT_MIN -#define INT_MIN ((int)((unsigned int)INT_MAX+1)) -#endif +EXPORT_SYMBOL(snd_pcm_hw_constraint_pow2); static void _snd_pcm_hw_param_any(struct snd_pcm_hw_params *params, snd_pcm_hw_param_t var) @@ -1224,18 +1181,6 @@ static void _snd_pcm_hw_param_any(struct snd_pcm_hw_params *params, snd_BUG(); } -#if 0 -/* - * snd_pcm_hw_param_any - */ -int snd_pcm_hw_param_any(struct snd_pcm_substream *pcm, struct snd_pcm_hw_params *params, - snd_pcm_hw_param_t var) -{ - _snd_pcm_hw_param_any(params, var); - return snd_pcm_hw_refine(pcm, params); -} -#endif /* 0 */ - void _snd_pcm_hw_params_any(struct snd_pcm_hw_params *params) { unsigned int k; @@ -1247,18 +1192,7 @@ void _snd_pcm_hw_params_any(struct snd_pcm_hw_params *params) params->info = ~0U; } -#if 0 -/* - * snd_pcm_hw_params_any - * - * Fill PARAMS with full configuration space boundaries - */ -int snd_pcm_hw_params_any(struct snd_pcm_substream *pcm, struct snd_pcm_hw_params *params) -{ - _snd_pcm_hw_params_any(params); - return snd_pcm_hw_refine(pcm, params); -} -#endif /* 0 */ +EXPORT_SYMBOL(_snd_pcm_hw_params_any); /** * snd_pcm_hw_param_value @@ -1269,8 +1203,8 @@ int snd_pcm_hw_params_any(struct snd_pcm_substream *pcm, struct snd_pcm_hw_param * Return the value for field PAR if it's fixed in configuration space * defined by PARAMS. Return -EINVAL otherwise */ -static int snd_pcm_hw_param_value(const struct snd_pcm_hw_params *params, - snd_pcm_hw_param_t var, int *dir) +int snd_pcm_hw_param_value(const struct snd_pcm_hw_params *params, + snd_pcm_hw_param_t var, int *dir) { if (hw_is_mask(var)) { const struct snd_mask *mask = hw_param_mask_c(params, var); @@ -1288,61 +1222,10 @@ static int snd_pcm_hw_param_value(const struct snd_pcm_hw_params *params, *dir = i->openmin; return snd_interval_value(i); } - assert(0); - return -EINVAL; -} - -/** - * snd_pcm_hw_param_value_min - * @params: the hw_params instance - * @var: parameter to retrieve - * @dir: pointer to the direction (-1,0,1) or NULL - * - * Return the minimum value for field PAR. - */ -unsigned int snd_pcm_hw_param_value_min(const struct snd_pcm_hw_params *params, - snd_pcm_hw_param_t var, int *dir) -{ - if (hw_is_mask(var)) { - if (dir) - *dir = 0; - return snd_mask_min(hw_param_mask_c(params, var)); - } - if (hw_is_interval(var)) { - const struct snd_interval *i = hw_param_interval_c(params, var); - if (dir) - *dir = i->openmin; - return snd_interval_min(i); - } - assert(0); return -EINVAL; } -/** - * snd_pcm_hw_param_value_max - * @params: the hw_params instance - * @var: parameter to retrieve - * @dir: pointer to the direction (-1,0,1) or NULL - * - * Return the maximum value for field PAR. - */ -unsigned int snd_pcm_hw_param_value_max(const struct snd_pcm_hw_params *params, - snd_pcm_hw_param_t var, int *dir) -{ - if (hw_is_mask(var)) { - if (dir) - *dir = 0; - return snd_mask_max(hw_param_mask_c(params, var)); - } - if (hw_is_interval(var)) { - const struct snd_interval *i = hw_param_interval_c(params, var); - if (dir) - *dir = - (int) i->openmax; - return snd_interval_max(i); - } - assert(0); - return -EINVAL; -} +EXPORT_SYMBOL(snd_pcm_hw_param_value); void _snd_pcm_hw_param_setempty(struct snd_pcm_hw_params *params, snd_pcm_hw_param_t var) @@ -1360,42 +1243,7 @@ void _snd_pcm_hw_param_setempty(struct snd_pcm_hw_params *params, } } -int _snd_pcm_hw_param_setinteger(struct snd_pcm_hw_params *params, - snd_pcm_hw_param_t var) -{ - int changed; - assert(hw_is_interval(var)); - changed = snd_interval_setinteger(hw_param_interval(params, var)); - if (changed) { - params->cmask |= 1 << var; - params->rmask |= 1 << var; - } - return changed; -} - -#if 0 -/* - * snd_pcm_hw_param_setinteger - * - * Inside configuration space defined by PARAMS remove from PAR all - * non integer values. Reduce configuration space accordingly. - * Return -EINVAL if the configuration space is empty - */ -int snd_pcm_hw_param_setinteger(struct snd_pcm_substream *pcm, - struct snd_pcm_hw_params *params, - snd_pcm_hw_param_t var) -{ - int changed = _snd_pcm_hw_param_setinteger(params, var); - if (changed < 0) - return changed; - if (params->rmask) { - int err = snd_pcm_hw_refine(pcm, params); - if (err < 0) - return err; - } - return 0; -} -#endif /* 0 */ +EXPORT_SYMBOL(_snd_pcm_hw_param_setempty); static int _snd_pcm_hw_param_first(struct snd_pcm_hw_params *params, snd_pcm_hw_param_t var) @@ -1405,10 +1253,8 @@ static int _snd_pcm_hw_param_first(struct snd_pcm_hw_params *params, changed = snd_mask_refine_first(hw_param_mask(params, var)); else if (hw_is_interval(var)) changed = snd_interval_refine_first(hw_param_interval(params, var)); - else { - assert(0); + else return -EINVAL; - } if (changed) { params->cmask |= 1 << var; params->rmask |= 1 << var; @@ -1428,20 +1274,22 @@ static int _snd_pcm_hw_param_first(struct snd_pcm_hw_params *params, * values > minimum. Reduce configuration space accordingly. * Return the minimum. */ -static int snd_pcm_hw_param_first(struct snd_pcm_substream *pcm, - struct snd_pcm_hw_params *params, - snd_pcm_hw_param_t var, int *dir) +int snd_pcm_hw_param_first(struct snd_pcm_substream *pcm, + struct snd_pcm_hw_params *params, + snd_pcm_hw_param_t var, int *dir) { int changed = _snd_pcm_hw_param_first(params, var); if (changed < 0) return changed; if (params->rmask) { int err = snd_pcm_hw_refine(pcm, params); - assert(err >= 0); + snd_assert(err >= 0, return err); } return snd_pcm_hw_param_value(params, var, dir); } +EXPORT_SYMBOL(snd_pcm_hw_param_first); + static int _snd_pcm_hw_param_last(struct snd_pcm_hw_params *params, snd_pcm_hw_param_t var) { @@ -1450,10 +1298,8 @@ static int _snd_pcm_hw_param_last(struct snd_pcm_hw_params *params, changed = snd_mask_refine_last(hw_param_mask(params, var)); else if (hw_is_interval(var)) changed = snd_interval_refine_last(hw_param_interval(params, var)); - else { - assert(0); + else return -EINVAL; - } if (changed) { params->cmask |= 1 << var; params->rmask |= 1 << var; @@ -1473,381 +1319,21 @@ static int _snd_pcm_hw_param_last(struct snd_pcm_hw_params *params, * values < maximum. Reduce configuration space accordingly. * Return the maximum. */ -static int snd_pcm_hw_param_last(struct snd_pcm_substream *pcm, - struct snd_pcm_hw_params *params, - snd_pcm_hw_param_t var, int *dir) +int snd_pcm_hw_param_last(struct snd_pcm_substream *pcm, + struct snd_pcm_hw_params *params, + snd_pcm_hw_param_t var, int *dir) { int changed = _snd_pcm_hw_param_last(params, var); if (changed < 0) return changed; if (params->rmask) { int err = snd_pcm_hw_refine(pcm, params); - assert(err >= 0); + snd_assert(err >= 0, return err); } return snd_pcm_hw_param_value(params, var, dir); } -int _snd_pcm_hw_param_min(struct snd_pcm_hw_params *params, - snd_pcm_hw_param_t var, unsigned int val, int dir) -{ - int changed; - int open = 0; - if (dir) { - if (dir > 0) { - open = 1; - } else if (dir < 0) { - if (val > 0) { - open = 1; - val--; - } - } - } - if (hw_is_mask(var)) - changed = snd_mask_refine_min(hw_param_mask(params, var), val + !!open); - else if (hw_is_interval(var)) - changed = snd_interval_refine_min(hw_param_interval(params, var), val, open); - else { - assert(0); - return -EINVAL; - } - if (changed) { - params->cmask |= 1 << var; - params->rmask |= 1 << var; - } - return changed; -} - -/** - * snd_pcm_hw_param_min - * @pcm: PCM instance - * @params: the hw_params instance - * @var: parameter to retrieve - * @val: minimal value - * @dir: pointer to the direction (-1,0,1) or NULL - * - * Inside configuration space defined by PARAMS remove from PAR all - * values < VAL. Reduce configuration space accordingly. - * Return new minimum or -EINVAL if the configuration space is empty - */ -static int snd_pcm_hw_param_min(struct snd_pcm_substream *pcm, struct snd_pcm_hw_params *params, - snd_pcm_hw_param_t var, unsigned int val, - int *dir) -{ - int changed = _snd_pcm_hw_param_min(params, var, val, dir ? *dir : 0); - if (changed < 0) - return changed; - if (params->rmask) { - int err = snd_pcm_hw_refine(pcm, params); - if (err < 0) - return err; - } - return snd_pcm_hw_param_value_min(params, var, dir); -} - -static int _snd_pcm_hw_param_max(struct snd_pcm_hw_params *params, - snd_pcm_hw_param_t var, unsigned int val, - int dir) -{ - int changed; - int open = 0; - if (dir) { - if (dir < 0) { - open = 1; - } else if (dir > 0) { - open = 1; - val++; - } - } - if (hw_is_mask(var)) { - if (val == 0 && open) { - snd_mask_none(hw_param_mask(params, var)); - changed = -EINVAL; - } else - changed = snd_mask_refine_max(hw_param_mask(params, var), val - !!open); - } else if (hw_is_interval(var)) - changed = snd_interval_refine_max(hw_param_interval(params, var), val, open); - else { - assert(0); - return -EINVAL; - } - if (changed) { - params->cmask |= 1 << var; - params->rmask |= 1 << var; - } - return changed; -} - -/** - * snd_pcm_hw_param_max - * @pcm: PCM instance - * @params: the hw_params instance - * @var: parameter to retrieve - * @val: maximal value - * @dir: pointer to the direction (-1,0,1) or NULL - * - * Inside configuration space defined by PARAMS remove from PAR all - * values >= VAL + 1. Reduce configuration space accordingly. - * Return new maximum or -EINVAL if the configuration space is empty - */ -static int snd_pcm_hw_param_max(struct snd_pcm_substream *pcm, struct snd_pcm_hw_params *params, - snd_pcm_hw_param_t var, unsigned int val, - int *dir) -{ - int changed = _snd_pcm_hw_param_max(params, var, val, dir ? *dir : 0); - if (changed < 0) - return changed; - if (params->rmask) { - int err = snd_pcm_hw_refine(pcm, params); - if (err < 0) - return err; - } - return snd_pcm_hw_param_value_max(params, var, dir); -} - -int _snd_pcm_hw_param_set(struct snd_pcm_hw_params *params, - snd_pcm_hw_param_t var, unsigned int val, int dir) -{ - int changed; - if (hw_is_mask(var)) { - struct snd_mask *m = hw_param_mask(params, var); - if (val == 0 && dir < 0) { - changed = -EINVAL; - snd_mask_none(m); - } else { - if (dir > 0) - val++; - else if (dir < 0) - val--; - changed = snd_mask_refine_set(hw_param_mask(params, var), val); - } - } else if (hw_is_interval(var)) { - struct snd_interval *i = hw_param_interval(params, var); - if (val == 0 && dir < 0) { - changed = -EINVAL; - snd_interval_none(i); - } else if (dir == 0) - changed = snd_interval_refine_set(i, val); - else { - struct snd_interval t; - t.openmin = 1; - t.openmax = 1; - t.empty = 0; - t.integer = 0; - if (dir < 0) { - t.min = val - 1; - t.max = val; - } else { - t.min = val; - t.max = val+1; - } - changed = snd_interval_refine(i, &t); - } - } else { - assert(0); - return -EINVAL; - } - if (changed) { - params->cmask |= 1 << var; - params->rmask |= 1 << var; - } - return changed; -} - -/** - * snd_pcm_hw_param_set - * @pcm: PCM instance - * @params: the hw_params instance - * @var: parameter to retrieve - * @val: value to set - * @dir: pointer to the direction (-1,0,1) or NULL - * - * Inside configuration space defined by PARAMS remove from PAR all - * values != VAL. Reduce configuration space accordingly. - * Return VAL or -EINVAL if the configuration space is empty - */ -int snd_pcm_hw_param_set(struct snd_pcm_substream *pcm, struct snd_pcm_hw_params *params, - snd_pcm_hw_param_t var, unsigned int val, int dir) -{ - int changed = _snd_pcm_hw_param_set(params, var, val, dir); - if (changed < 0) - return changed; - if (params->rmask) { - int err = snd_pcm_hw_refine(pcm, params); - if (err < 0) - return err; - } - return snd_pcm_hw_param_value(params, var, NULL); -} - -static int _snd_pcm_hw_param_mask(struct snd_pcm_hw_params *params, - snd_pcm_hw_param_t var, const struct snd_mask *val) -{ - int changed; - assert(hw_is_mask(var)); - changed = snd_mask_refine(hw_param_mask(params, var), val); - if (changed) { - params->cmask |= 1 << var; - params->rmask |= 1 << var; - } - return changed; -} - -/** - * snd_pcm_hw_param_mask - * @pcm: PCM instance - * @params: the hw_params instance - * @var: parameter to retrieve - * @val: mask to apply - * - * Inside configuration space defined by PARAMS remove from PAR all values - * not contained in MASK. Reduce configuration space accordingly. - * This function can be called only for SNDRV_PCM_HW_PARAM_ACCESS, - * SNDRV_PCM_HW_PARAM_FORMAT, SNDRV_PCM_HW_PARAM_SUBFORMAT. - * Return 0 on success or -EINVAL - * if the configuration space is empty - */ -int snd_pcm_hw_param_mask(struct snd_pcm_substream *pcm, struct snd_pcm_hw_params *params, - snd_pcm_hw_param_t var, const struct snd_mask *val) -{ - int changed = _snd_pcm_hw_param_mask(params, var, val); - if (changed < 0) - return changed; - if (params->rmask) { - int err = snd_pcm_hw_refine(pcm, params); - if (err < 0) - return err; - } - return 0; -} - -static int boundary_sub(int a, int adir, - int b, int bdir, - int *c, int *cdir) -{ - adir = adir < 0 ? -1 : (adir > 0 ? 1 : 0); - bdir = bdir < 0 ? -1 : (bdir > 0 ? 1 : 0); - *c = a - b; - *cdir = adir - bdir; - if (*cdir == -2) { - assert(*c > INT_MIN); - (*c)--; - } else if (*cdir == 2) { - assert(*c < INT_MAX); - (*c)++; - } - return 0; -} - -static int boundary_lt(unsigned int a, int adir, - unsigned int b, int bdir) -{ - assert(a > 0 || adir >= 0); - assert(b > 0 || bdir >= 0); - if (adir < 0) { - a--; - adir = 1; - } else if (adir > 0) - adir = 1; - if (bdir < 0) { - b--; - bdir = 1; - } else if (bdir > 0) - bdir = 1; - return a < b || (a == b && adir < bdir); -} - -/* Return 1 if min is nearer to best than max */ -static int boundary_nearer(int min, int mindir, - int best, int bestdir, - int max, int maxdir) -{ - int dmin, dmindir; - int dmax, dmaxdir; - boundary_sub(best, bestdir, min, mindir, &dmin, &dmindir); - boundary_sub(max, maxdir, best, bestdir, &dmax, &dmaxdir); - return boundary_lt(dmin, dmindir, dmax, dmaxdir); -} - -/** - * snd_pcm_hw_param_near - * @pcm: PCM instance - * @params: the hw_params instance - * @var: parameter to retrieve - * @best: value to set - * @dir: pointer to the direction (-1,0,1) or NULL - * - * Inside configuration space defined by PARAMS set PAR to the available value - * nearest to VAL. Reduce configuration space accordingly. - * This function cannot be called for SNDRV_PCM_HW_PARAM_ACCESS, - * SNDRV_PCM_HW_PARAM_FORMAT, SNDRV_PCM_HW_PARAM_SUBFORMAT. - * Return the value found. - */ -int snd_pcm_hw_param_near(struct snd_pcm_substream *pcm, struct snd_pcm_hw_params *params, - snd_pcm_hw_param_t var, unsigned int best, int *dir) -{ - struct snd_pcm_hw_params *save = NULL; - int v; - unsigned int saved_min; - int last = 0; - int min, max; - int mindir, maxdir; - int valdir = dir ? *dir : 0; - /* FIXME */ - if (best > INT_MAX) - best = INT_MAX; - min = max = best; - mindir = maxdir = valdir; - if (maxdir > 0) - maxdir = 0; - else if (maxdir == 0) - maxdir = -1; - else { - maxdir = 1; - max--; - } - save = kmalloc(sizeof(*save), GFP_KERNEL); - if (save == NULL) - return -ENOMEM; - *save = *params; - saved_min = min; - min = snd_pcm_hw_param_min(pcm, params, var, min, &mindir); - if (min >= 0) { - struct snd_pcm_hw_params *params1; - if (max < 0) - goto _end; - if ((unsigned int)min == saved_min && mindir == valdir) - goto _end; - params1 = kmalloc(sizeof(*params1), GFP_KERNEL); - if (params1 == NULL) { - kfree(save); - return -ENOMEM; - } - *params1 = *save; - max = snd_pcm_hw_param_max(pcm, params1, var, max, &maxdir); - if (max < 0) { - kfree(params1); - goto _end; - } - if (boundary_nearer(max, maxdir, best, valdir, min, mindir)) { - *params = *params1; - last = 1; - } - kfree(params1); - } else { - *params = *save; - max = snd_pcm_hw_param_max(pcm, params, var, max, &maxdir); - assert(max >= 0); - last = 1; - } - _end: - kfree(save); - if (last) - v = snd_pcm_hw_param_last(pcm, params, var, dir); - else - v = snd_pcm_hw_param_first(pcm, params, var, dir); - assert(v >= 0); - return v; -} +EXPORT_SYMBOL(snd_pcm_hw_param_last); /** * snd_pcm_hw_param_choose @@ -1859,39 +1345,32 @@ int snd_pcm_hw_param_near(struct snd_pcm_substream *pcm, struct snd_pcm_hw_param * first access, first format, first subformat, min channels, * min rate, min period time, max buffer size, min tick time */ -int snd_pcm_hw_params_choose(struct snd_pcm_substream *pcm, struct snd_pcm_hw_params *params) -{ - int err; - - err = snd_pcm_hw_param_first(pcm, params, SNDRV_PCM_HW_PARAM_ACCESS, NULL); - assert(err >= 0); - - err = snd_pcm_hw_param_first(pcm, params, SNDRV_PCM_HW_PARAM_FORMAT, NULL); - assert(err >= 0); - - err = snd_pcm_hw_param_first(pcm, params, SNDRV_PCM_HW_PARAM_SUBFORMAT, NULL); - assert(err >= 0); - - err = snd_pcm_hw_param_first(pcm, params, SNDRV_PCM_HW_PARAM_CHANNELS, NULL); - assert(err >= 0); - - err = snd_pcm_hw_param_first(pcm, params, SNDRV_PCM_HW_PARAM_RATE, NULL); - assert(err >= 0); - - err = snd_pcm_hw_param_first(pcm, params, SNDRV_PCM_HW_PARAM_PERIOD_TIME, NULL); - assert(err >= 0); - - err = snd_pcm_hw_param_last(pcm, params, SNDRV_PCM_HW_PARAM_BUFFER_SIZE, NULL); - assert(err >= 0); - - err = snd_pcm_hw_param_first(pcm, params, SNDRV_PCM_HW_PARAM_TICK_TIME, NULL); - assert(err >= 0); +int snd_pcm_hw_params_choose(struct snd_pcm_substream *pcm, + struct snd_pcm_hw_params *params) +{ + static int vars[] = { + SNDRV_PCM_HW_PARAM_ACCESS, + SNDRV_PCM_HW_PARAM_FORMAT, + SNDRV_PCM_HW_PARAM_SUBFORMAT, + SNDRV_PCM_HW_PARAM_CHANNELS, + SNDRV_PCM_HW_PARAM_RATE, + SNDRV_PCM_HW_PARAM_PERIOD_TIME, + SNDRV_PCM_HW_PARAM_BUFFER_SIZE, + SNDRV_PCM_HW_PARAM_TICK_TIME, + -1 + }; + int err, *v; + for (v = vars; *v != -1; v++) { + if (*v != SNDRV_PCM_HW_PARAM_BUFFER_SIZE) + err = snd_pcm_hw_param_first(pcm, params, *v, NULL); + else + err = snd_pcm_hw_param_last(pcm, params, *v, NULL); + snd_assert(err >= 0, return err); + } return 0; } -#undef assert - static int snd_pcm_lib_ioctl_reset(struct snd_pcm_substream *substream, void *arg) { @@ -1967,6 +1446,8 @@ int snd_pcm_lib_ioctl(struct snd_pcm_substream *substream, return -ENXIO; } +EXPORT_SYMBOL(snd_pcm_lib_ioctl); + /* * Conditions */ @@ -2101,6 +1582,8 @@ void snd_pcm_period_elapsed(struct snd_pcm_substream *substream) kill_fasync(&runtime->fasync, SIGIO, POLL_IN); } +EXPORT_SYMBOL(snd_pcm_period_elapsed); + static int snd_pcm_lib_write_transfer(struct snd_pcm_substream *substream, unsigned int hwoff, unsigned long data, unsigned int off, @@ -2299,7 +1782,7 @@ snd_pcm_sframes_t snd_pcm_lib_write(struct snd_pcm_substream *substream, const v if (runtime->status->state == SNDRV_PCM_STATE_OPEN) return -EBADFD; - nonblock = !!(substream->ffile->f_flags & O_NONBLOCK); + nonblock = !!(substream->f_flags & O_NONBLOCK); if (runtime->access != SNDRV_PCM_ACCESS_RW_INTERLEAVED && runtime->channels > 1) @@ -2308,6 +1791,8 @@ snd_pcm_sframes_t snd_pcm_lib_write(struct snd_pcm_substream *substream, const v snd_pcm_lib_write_transfer); } +EXPORT_SYMBOL(snd_pcm_lib_write); + static int snd_pcm_lib_writev_transfer(struct snd_pcm_substream *substream, unsigned int hwoff, unsigned long data, unsigned int off, @@ -2362,7 +1847,7 @@ snd_pcm_sframes_t snd_pcm_lib_writev(struct snd_pcm_substream *substream, if (runtime->status->state == SNDRV_PCM_STATE_OPEN) return -EBADFD; - nonblock = !!(substream->ffile->f_flags & O_NONBLOCK); + nonblock = !!(substream->f_flags & O_NONBLOCK); if (runtime->access != SNDRV_PCM_ACCESS_RW_NONINTERLEAVED) return -EINVAL; @@ -2370,6 +1855,8 @@ snd_pcm_sframes_t snd_pcm_lib_writev(struct snd_pcm_substream *substream, nonblock, snd_pcm_lib_writev_transfer); } +EXPORT_SYMBOL(snd_pcm_lib_writev); + static int snd_pcm_lib_read_transfer(struct snd_pcm_substream *substream, unsigned int hwoff, unsigned long data, unsigned int off, @@ -2572,12 +2059,14 @@ snd_pcm_sframes_t snd_pcm_lib_read(struct snd_pcm_substream *substream, void __u if (runtime->status->state == SNDRV_PCM_STATE_OPEN) return -EBADFD; - nonblock = !!(substream->ffile->f_flags & O_NONBLOCK); + nonblock = !!(substream->f_flags & O_NONBLOCK); if (runtime->access != SNDRV_PCM_ACCESS_RW_INTERLEAVED) return -EINVAL; return snd_pcm_lib_read1(substream, (unsigned long)buf, size, nonblock, snd_pcm_lib_read_transfer); } +EXPORT_SYMBOL(snd_pcm_lib_read); + static int snd_pcm_lib_readv_transfer(struct snd_pcm_substream *substream, unsigned int hwoff, unsigned long data, unsigned int off, @@ -2629,58 +2118,10 @@ snd_pcm_sframes_t snd_pcm_lib_readv(struct snd_pcm_substream *substream, if (runtime->status->state == SNDRV_PCM_STATE_OPEN) return -EBADFD; - nonblock = !!(substream->ffile->f_flags & O_NONBLOCK); + nonblock = !!(substream->f_flags & O_NONBLOCK); if (runtime->access != SNDRV_PCM_ACCESS_RW_NONINTERLEAVED) return -EINVAL; return snd_pcm_lib_read1(substream, (unsigned long)bufs, frames, nonblock, snd_pcm_lib_readv_transfer); } -/* - * Exported symbols - */ - -EXPORT_SYMBOL(snd_interval_refine); -EXPORT_SYMBOL(snd_interval_list); -EXPORT_SYMBOL(snd_interval_ratnum); -EXPORT_SYMBOL(_snd_pcm_hw_params_any); -EXPORT_SYMBOL(_snd_pcm_hw_param_min); -EXPORT_SYMBOL(_snd_pcm_hw_param_set); -EXPORT_SYMBOL(_snd_pcm_hw_param_setempty); -EXPORT_SYMBOL(_snd_pcm_hw_param_setinteger); -EXPORT_SYMBOL(snd_pcm_hw_param_value_min); -EXPORT_SYMBOL(snd_pcm_hw_param_value_max); -EXPORT_SYMBOL(snd_pcm_hw_param_mask); -EXPORT_SYMBOL(snd_pcm_hw_param_first); -EXPORT_SYMBOL(snd_pcm_hw_param_last); -EXPORT_SYMBOL(snd_pcm_hw_param_near); -EXPORT_SYMBOL(snd_pcm_hw_param_set); -EXPORT_SYMBOL(snd_pcm_hw_refine); -EXPORT_SYMBOL(snd_pcm_hw_constraints_init); -EXPORT_SYMBOL(snd_pcm_hw_constraints_complete); -EXPORT_SYMBOL(snd_pcm_hw_constraint_list); -EXPORT_SYMBOL(snd_pcm_hw_constraint_step); -EXPORT_SYMBOL(snd_pcm_hw_constraint_ratnums); -EXPORT_SYMBOL(snd_pcm_hw_constraint_ratdens); -EXPORT_SYMBOL(snd_pcm_hw_constraint_msbits); -EXPORT_SYMBOL(snd_pcm_hw_constraint_minmax); -EXPORT_SYMBOL(snd_pcm_hw_constraint_integer); -EXPORT_SYMBOL(snd_pcm_hw_constraint_pow2); -EXPORT_SYMBOL(snd_pcm_hw_rule_add); -EXPORT_SYMBOL(snd_pcm_set_ops); -EXPORT_SYMBOL(snd_pcm_set_sync); -EXPORT_SYMBOL(snd_pcm_lib_ioctl); -EXPORT_SYMBOL(snd_pcm_stop); -EXPORT_SYMBOL(snd_pcm_period_elapsed); -EXPORT_SYMBOL(snd_pcm_lib_write); -EXPORT_SYMBOL(snd_pcm_lib_read); -EXPORT_SYMBOL(snd_pcm_lib_writev); EXPORT_SYMBOL(snd_pcm_lib_readv); -EXPORT_SYMBOL(snd_pcm_lib_buffer_bytes); -EXPORT_SYMBOL(snd_pcm_lib_period_bytes); -/* pcm_memory.c */ -EXPORT_SYMBOL(snd_pcm_lib_preallocate_free_for_all); -EXPORT_SYMBOL(snd_pcm_lib_preallocate_pages); -EXPORT_SYMBOL(snd_pcm_lib_preallocate_pages_for_all); -EXPORT_SYMBOL(snd_pcm_sgbuf_ops_page); -EXPORT_SYMBOL(snd_pcm_lib_malloc_pages); -EXPORT_SYMBOL(snd_pcm_lib_free_pages); diff --git a/sound/core/pcm_memory.c b/sound/core/pcm_memory.c index 428f8c169..067d2056d 100644 --- a/sound/core/pcm_memory.c +++ b/sound/core/pcm_memory.c @@ -126,6 +126,8 @@ int snd_pcm_lib_preallocate_free_for_all(struct snd_pcm *pcm) return 0; } +EXPORT_SYMBOL(snd_pcm_lib_preallocate_free_for_all); + #ifdef CONFIG_SND_VERBOSE_PROCFS /* * read callback for prealloc proc file @@ -191,9 +193,7 @@ static inline void preallocate_info_init(struct snd_pcm_substream *substream) struct snd_info_entry *entry; if ((entry = snd_info_create_card_entry(substream->pcm->card, "prealloc", substream->proc_root)) != NULL) { - entry->c.text.read_size = 64; entry->c.text.read = snd_pcm_lib_preallocate_proc_read; - entry->c.text.write_size = 64; entry->c.text.write = snd_pcm_lib_preallocate_proc_write; entry->mode |= S_IWUSR; entry->private_data = substream; @@ -253,6 +253,8 @@ int snd_pcm_lib_preallocate_pages(struct snd_pcm_substream *substream, return snd_pcm_lib_preallocate_pages1(substream, size, max); } +EXPORT_SYMBOL(snd_pcm_lib_preallocate_pages); + /** * snd_pcm_lib_preallocate_pages_for_all - pre-allocation for continous memory type (all substreams) * @pcm: the pcm instance @@ -280,6 +282,8 @@ int snd_pcm_lib_preallocate_pages_for_all(struct snd_pcm *pcm, return 0; } +EXPORT_SYMBOL(snd_pcm_lib_preallocate_pages_for_all); + /** * snd_pcm_sgbuf_ops_page - get the page struct at the given offset * @substream: the pcm substream instance @@ -298,6 +302,8 @@ struct page *snd_pcm_sgbuf_ops_page(struct snd_pcm_substream *substream, unsigne return sgbuf->page_table[idx]; } +EXPORT_SYMBOL(snd_pcm_sgbuf_ops_page); + /** * snd_pcm_lib_malloc_pages - allocate the DMA buffer * @substream: the substream to allocate the DMA buffer to @@ -349,6 +355,8 @@ int snd_pcm_lib_malloc_pages(struct snd_pcm_substream *substream, size_t size) return 1; /* area was changed */ } +EXPORT_SYMBOL(snd_pcm_lib_malloc_pages); + /** * snd_pcm_lib_free_pages - release the allocated DMA buffer. * @substream: the substream to release the DMA buffer @@ -374,3 +382,5 @@ int snd_pcm_lib_free_pages(struct snd_pcm_substream *substream) snd_pcm_set_runtime_buffer(substream, NULL); return 0; } + +EXPORT_SYMBOL(snd_pcm_lib_free_pages); diff --git a/sound/core/pcm_misc.c b/sound/core/pcm_misc.c index 593c77f4d..0019c59a7 100644 --- a/sound/core/pcm_misc.c +++ b/sound/core/pcm_misc.c @@ -207,6 +207,8 @@ int snd_pcm_format_signed(snd_pcm_format_t format) return val; } +EXPORT_SYMBOL(snd_pcm_format_signed); + /** * snd_pcm_format_unsigned - Check the PCM format is unsigned linear * @format: the format to check @@ -224,6 +226,8 @@ int snd_pcm_format_unsigned(snd_pcm_format_t format) return !val; } +EXPORT_SYMBOL(snd_pcm_format_unsigned); + /** * snd_pcm_format_linear - Check the PCM format is linear * @format: the format to check @@ -235,6 +239,8 @@ int snd_pcm_format_linear(snd_pcm_format_t format) return snd_pcm_format_signed(format) >= 0; } +EXPORT_SYMBOL(snd_pcm_format_linear); + /** * snd_pcm_format_little_endian - Check the PCM format is little-endian * @format: the format to check @@ -252,6 +258,8 @@ int snd_pcm_format_little_endian(snd_pcm_format_t format) return val; } +EXPORT_SYMBOL(snd_pcm_format_little_endian); + /** * snd_pcm_format_big_endian - Check the PCM format is big-endian * @format: the format to check @@ -269,6 +277,8 @@ int snd_pcm_format_big_endian(snd_pcm_format_t format) return !val; } +EXPORT_SYMBOL(snd_pcm_format_big_endian); + /** * snd_pcm_format_width - return the bit-width of the format * @format: the format to check @@ -286,6 +296,8 @@ int snd_pcm_format_width(snd_pcm_format_t format) return val; } +EXPORT_SYMBOL(snd_pcm_format_width); + /** * snd_pcm_format_physical_width - return the physical bit-width of the format * @format: the format to check @@ -303,6 +315,8 @@ int snd_pcm_format_physical_width(snd_pcm_format_t format) return val; } +EXPORT_SYMBOL(snd_pcm_format_physical_width); + /** * snd_pcm_format_size - return the byte size of samples on the given format * @format: the format to check @@ -318,6 +332,8 @@ ssize_t snd_pcm_format_size(snd_pcm_format_t format, size_t samples) return samples * phys_width / 8; } +EXPORT_SYMBOL(snd_pcm_format_size); + /** * snd_pcm_format_silence_64 - return the silent data in 8 bytes array * @format: the format to check @@ -333,6 +349,8 @@ const unsigned char *snd_pcm_format_silence_64(snd_pcm_format_t format) return pcm_formats[format].silence; } +EXPORT_SYMBOL(snd_pcm_format_silence_64); + /** * snd_pcm_format_set_silence - set the silence data on the buffer * @format: the PCM format @@ -402,6 +420,8 @@ int snd_pcm_format_set_silence(snd_pcm_format_t format, void *data, unsigned int return 0; } +EXPORT_SYMBOL(snd_pcm_format_set_silence); + /* [width][unsigned][bigendian] */ static int linear_formats[4][2][2] = { {{ SNDRV_PCM_FORMAT_S8, SNDRV_PCM_FORMAT_S8}, @@ -432,6 +452,8 @@ snd_pcm_format_t snd_pcm_build_linear_format(int width, int unsignd, int big_end return linear_formats[width][!!unsignd][!!big_endian]; } +EXPORT_SYMBOL(snd_pcm_build_linear_format); + /** * snd_pcm_limit_hw_rates - determine rate_min/rate_max fields * @runtime: the runtime instance @@ -463,3 +485,5 @@ int snd_pcm_limit_hw_rates(struct snd_pcm_runtime *runtime) } return 0; } + +EXPORT_SYMBOL(snd_pcm_limit_hw_rates); diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index 0860c5a84..439f04792 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -71,8 +71,9 @@ static int snd_pcm_open(struct file *file, struct snd_pcm *pcm, int stream); */ DEFINE_RWLOCK(snd_pcm_link_rwlock); -static DECLARE_RWSEM(snd_pcm_link_rwsem); +EXPORT_SYMBOL(snd_pcm_link_rwlock); +static DECLARE_RWSEM(snd_pcm_link_rwsem); static inline mm_segment_t snd_enter_user(void) { @@ -319,6 +320,8 @@ int snd_pcm_hw_refine(struct snd_pcm_substream *substream, return 0; } +EXPORT_SYMBOL(snd_pcm_hw_refine); + static int snd_pcm_hw_refine_user(struct snd_pcm_substream *substream, struct snd_pcm_hw_params __user * _params) { @@ -369,7 +372,7 @@ static int snd_pcm_hw_params(struct snd_pcm_substream *substream, #if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE) if (!substream->oss.oss) #endif - if (atomic_read(&runtime->mmap_count)) + if (atomic_read(&substream->mmap_count)) return -EBADFD; params->rmask = ~0U; @@ -482,7 +485,7 @@ static int snd_pcm_hw_free(struct snd_pcm_substream *substream) return -EBADFD; } snd_pcm_stream_unlock_irq(substream); - if (atomic_read(&runtime->mmap_count)) + if (atomic_read(&substream->mmap_count)) return -EBADFD; if (substream->ops->hw_free) result = substream->ops->hw_free(substream); @@ -936,6 +939,8 @@ int snd_pcm_stop(struct snd_pcm_substream *substream, int state) return snd_pcm_action(&snd_pcm_action_stop, substream, state); } +EXPORT_SYMBOL(snd_pcm_stop); + /** * snd_pcm_drain_done * @substream: the PCM substream @@ -1085,6 +1090,8 @@ int snd_pcm_suspend(struct snd_pcm_substream *substream) return err; } +EXPORT_SYMBOL(snd_pcm_suspend); + /** * snd_pcm_suspend_all * @pcm: the PCM instance @@ -1114,6 +1121,8 @@ int snd_pcm_suspend_all(struct snd_pcm *pcm) return 0; } +EXPORT_SYMBOL(snd_pcm_suspend_all); + /* resume */ static int snd_pcm_pre_resume(struct snd_pcm_substream *substream, int state) @@ -1275,13 +1284,16 @@ static int snd_pcm_reset(struct snd_pcm_substream *substream) /* * prepare ioctl */ -static int snd_pcm_pre_prepare(struct snd_pcm_substream *substream, int state) +/* we use the second argument for updating f_flags */ +static int snd_pcm_pre_prepare(struct snd_pcm_substream *substream, + int f_flags) { struct snd_pcm_runtime *runtime = substream->runtime; if (runtime->status->state == SNDRV_PCM_STATE_OPEN) return -EBADFD; if (snd_pcm_running(substream)) return -EBUSY; + substream->f_flags = f_flags; return 0; } @@ -1310,17 +1322,26 @@ static struct action_ops snd_pcm_action_prepare = { /** * snd_pcm_prepare * @substream: the PCM substream instance + * @file: file to refer f_flags * * Prepare the PCM substream to be triggerable. */ -static int snd_pcm_prepare(struct snd_pcm_substream *substream) +static int snd_pcm_prepare(struct snd_pcm_substream *substream, + struct file *file) { int res; struct snd_card *card = substream->pcm->card; + int f_flags; + + if (file) + f_flags = file->f_flags; + else + f_flags = substream->f_flags; snd_power_lock(card); if ((res = snd_power_wait(card, SNDRV_CTL_POWER_D0)) >= 0) - res = snd_pcm_action_nonatomic(&snd_pcm_action_prepare, substream, 0); + res = snd_pcm_action_nonatomic(&snd_pcm_action_prepare, + substream, f_flags); snd_power_unlock(card); return res; } @@ -1331,7 +1352,7 @@ static int snd_pcm_prepare(struct snd_pcm_substream *substream) static int snd_pcm_pre_drain_init(struct snd_pcm_substream *substream, int state) { - if (substream->ffile->f_flags & O_NONBLOCK) + if (substream->f_flags & O_NONBLOCK) return -EAGAIN; substream->runtime->trigger_master = substream; return 0; @@ -1448,8 +1469,6 @@ static int snd_pcm_drain(struct snd_pcm_substream *substream) } } up_read(&snd_pcm_link_rwsem); - if (! num_drecs) - goto _error; snd_pcm_stream_lock_irq(substream); /* resume pause */ @@ -2006,6 +2025,10 @@ static void pcm_release_private(struct snd_pcm_substream *substream) void snd_pcm_release_substream(struct snd_pcm_substream *substream) { + substream->ref_count--; + if (substream->ref_count > 0) + return; + snd_pcm_drop(substream); if (substream->hw_opened) { if (substream->ops->hw_free != NULL) @@ -2020,6 +2043,8 @@ void snd_pcm_release_substream(struct snd_pcm_substream *substream) snd_pcm_detach_substream(substream); } +EXPORT_SYMBOL(snd_pcm_release_substream); + int snd_pcm_open_substream(struct snd_pcm *pcm, int stream, struct file *file, struct snd_pcm_substream **rsubstream) @@ -2030,6 +2055,11 @@ int snd_pcm_open_substream(struct snd_pcm *pcm, int stream, err = snd_pcm_attach_substream(pcm, stream, file, &substream); if (err < 0) return err; + if (substream->ref_count > 1) { + *rsubstream = substream; + return 0; + } + substream->no_mmap_ctrl = 0; err = snd_pcm_hw_constraints_init(substream); if (err < 0) { @@ -2056,6 +2086,8 @@ int snd_pcm_open_substream(struct snd_pcm *pcm, int stream, return err; } +EXPORT_SYMBOL(snd_pcm_open_substream); + static int snd_pcm_open_file(struct file *file, struct snd_pcm *pcm, int stream, @@ -2073,17 +2105,20 @@ static int snd_pcm_open_file(struct file *file, if (err < 0) return err; - pcm_file = kzalloc(sizeof(*pcm_file), GFP_KERNEL); - if (pcm_file == NULL) { - snd_pcm_release_substream(substream); - return -ENOMEM; + if (substream->ref_count > 1) + pcm_file = substream->file; + else { + pcm_file = kzalloc(sizeof(*pcm_file), GFP_KERNEL); + if (pcm_file == NULL) { + snd_pcm_release_substream(substream); + return -ENOMEM; + } + str = substream->pstr; + substream->file = pcm_file; + substream->pcm_release = pcm_release_private; + pcm_file->substream = substream; + snd_pcm_add_file(str, pcm_file); } - str = substream->pstr; - substream->file = pcm_file; - substream->pcm_release = pcm_release_private; - pcm_file->substream = substream; - snd_pcm_add_file(str, pcm_file); - file->private_data = pcm_file; *rpcm_file = pcm_file; return 0; @@ -2170,7 +2205,6 @@ static int snd_pcm_release(struct inode *inode, struct file *file) pcm_file = file->private_data; substream = pcm_file->substream; snd_assert(substream != NULL, return -ENXIO); - snd_assert(!atomic_read(&substream->runtime->mmap_count), ); pcm = substream->pcm; fasync_helper(-1, file, 0, &substream->runtime->fasync); mutex_lock(&pcm->open_mutex); @@ -2493,7 +2527,8 @@ static int snd_pcm_sync_ptr(struct snd_pcm_substream *substream, return 0; } -static int snd_pcm_common_ioctl1(struct snd_pcm_substream *substream, +static int snd_pcm_common_ioctl1(struct file *file, + struct snd_pcm_substream *substream, unsigned int cmd, void __user *arg) { snd_assert(substream != NULL, return -ENXIO); @@ -2518,7 +2553,7 @@ static int snd_pcm_common_ioctl1(struct snd_pcm_substream *substream, case SNDRV_PCM_IOCTL_CHANNEL_INFO: return snd_pcm_channel_info_user(substream, arg); case SNDRV_PCM_IOCTL_PREPARE: - return snd_pcm_prepare(substream); + return snd_pcm_prepare(substream, file); case SNDRV_PCM_IOCTL_RESET: return snd_pcm_reset(substream); case SNDRV_PCM_IOCTL_START: @@ -2560,7 +2595,8 @@ static int snd_pcm_common_ioctl1(struct snd_pcm_substream *substream, return -ENOTTY; } -static int snd_pcm_playback_ioctl1(struct snd_pcm_substream *substream, +static int snd_pcm_playback_ioctl1(struct file *file, + struct snd_pcm_substream *substream, unsigned int cmd, void __user *arg) { snd_assert(substream != NULL, return -ENXIO); @@ -2636,10 +2672,11 @@ static int snd_pcm_playback_ioctl1(struct snd_pcm_substream *substream, return result < 0 ? result : 0; } } - return snd_pcm_common_ioctl1(substream, cmd, arg); + return snd_pcm_common_ioctl1(file, substream, cmd, arg); } -static int snd_pcm_capture_ioctl1(struct snd_pcm_substream *substream, +static int snd_pcm_capture_ioctl1(struct file *file, + struct snd_pcm_substream *substream, unsigned int cmd, void __user *arg) { snd_assert(substream != NULL, return -ENXIO); @@ -2715,7 +2752,7 @@ static int snd_pcm_capture_ioctl1(struct snd_pcm_substream *substream, return result < 0 ? result : 0; } } - return snd_pcm_common_ioctl1(substream, cmd, arg); + return snd_pcm_common_ioctl1(file, substream, cmd, arg); } static long snd_pcm_playback_ioctl(struct file *file, unsigned int cmd, @@ -2728,7 +2765,8 @@ static long snd_pcm_playback_ioctl(struct file *file, unsigned int cmd, if (((cmd >> 8) & 0xff) != 'A') return -ENOTTY; - return snd_pcm_playback_ioctl1(pcm_file->substream, cmd, (void __user *)arg); + return snd_pcm_playback_ioctl1(file, pcm_file->substream, cmd, + (void __user *)arg); } static long snd_pcm_capture_ioctl(struct file *file, unsigned int cmd, @@ -2741,7 +2779,8 @@ static long snd_pcm_capture_ioctl(struct file *file, unsigned int cmd, if (((cmd >> 8) & 0xff) != 'A') return -ENOTTY; - return snd_pcm_capture_ioctl1(pcm_file->substream, cmd, (void __user *)arg); + return snd_pcm_capture_ioctl1(file, pcm_file->substream, cmd, + (void __user *)arg); } int snd_pcm_kernel_ioctl(struct snd_pcm_substream *substream, @@ -2753,12 +2792,12 @@ int snd_pcm_kernel_ioctl(struct snd_pcm_substream *substream, fs = snd_enter_user(); switch (substream->stream) { case SNDRV_PCM_STREAM_PLAYBACK: - result = snd_pcm_playback_ioctl1(substream, - cmd, (void __user *)arg); + result = snd_pcm_playback_ioctl1(NULL, substream, cmd, + (void __user *)arg); break; case SNDRV_PCM_STREAM_CAPTURE: - result = snd_pcm_capture_ioctl1(substream, - cmd, (void __user *)arg); + result = snd_pcm_capture_ioctl1(NULL, substream, cmd, + (void __user *)arg); break; default: result = -EINVAL; @@ -2768,6 +2807,8 @@ int snd_pcm_kernel_ioctl(struct snd_pcm_substream *substream, return result; } +EXPORT_SYMBOL(snd_pcm_kernel_ioctl); + static ssize_t snd_pcm_read(struct file *file, char __user *buf, size_t count, loff_t * offset) { @@ -3134,7 +3175,7 @@ static int snd_pcm_default_mmap(struct snd_pcm_substream *substream, area->vm_ops = &snd_pcm_vm_ops_data; area->vm_private_data = substream; area->vm_flags |= VM_RESERVED; - atomic_inc(&substream->runtime->mmap_count); + atomic_inc(&substream->mmap_count); return 0; } @@ -3166,9 +3207,11 @@ int snd_pcm_lib_mmap_iomem(struct snd_pcm_substream *substream, (substream->runtime->dma_addr + offset) >> PAGE_SHIFT, size, area->vm_page_prot)) return -EAGAIN; - atomic_inc(&substream->runtime->mmap_count); + atomic_inc(&substream->mmap_count); return 0; } + +EXPORT_SYMBOL(snd_pcm_lib_mmap_iomem); #endif /* SNDRV_PCM_INFO_MMAP */ /* @@ -3212,6 +3255,8 @@ int snd_pcm_mmap_data(struct snd_pcm_substream *substream, struct file *file, return snd_pcm_default_mmap(substream, area); } +EXPORT_SYMBOL(snd_pcm_mmap_data); + static int snd_pcm_mmap(struct file *file, struct vm_area_struct *area) { struct snd_pcm_file * pcm_file; diff --git a/sound/core/rawmidi.c b/sound/core/rawmidi.c index 87b47c956..8c15c66eb 100644 --- a/sound/core/rawmidi.c +++ b/sound/core/rawmidi.c @@ -43,7 +43,7 @@ MODULE_DESCRIPTION("Midlevel RawMidi code for ALSA."); MODULE_LICENSE("GPL"); #ifdef CONFIG_SND_OSSEMUL -static int midi_map[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = 0}; +static int midi_map[SNDRV_CARDS]; static int amidi_map[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = 1}; module_param_array(midi_map, int, NULL, 0444); MODULE_PARM_DESC(midi_map, "Raw MIDI device number assigned to 1st OSS device."); @@ -1561,7 +1561,6 @@ static int snd_rawmidi_dev_register(struct snd_device *device) entry = snd_info_create_card_entry(rmidi->card, name, rmidi->card->proc_root); if (entry) { entry->private_data = rmidi; - entry->c.text.read_size = 1024; entry->c.text.read = snd_rawmidi_proc_info_read; if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); diff --git a/sound/core/rtctimer.c b/sound/core/rtctimer.c index 84704ccb1..15b6c8a3f 100644 --- a/sound/core/rtctimer.c +++ b/sound/core/rtctimer.c @@ -50,7 +50,9 @@ static int rtctimer_stop(struct snd_timer *t); * The hardware dependent description for this timer. */ static struct snd_timer_hardware rtc_hw = { - .flags = SNDRV_TIMER_HW_FIRST|SNDRV_TIMER_HW_AUTO, + .flags = SNDRV_TIMER_HW_AUTO | + SNDRV_TIMER_HW_FIRST | + SNDRV_TIMER_HW_TASKLET, .ticks = 100000000L, /* FIXME: XXX */ .open = rtctimer_open, .close = rtctimer_close, @@ -60,6 +62,7 @@ static struct snd_timer_hardware rtc_hw = { static int rtctimer_freq = RTC_FREQ; /* frequency */ static struct snd_timer *rtctimer; +static struct tasklet_struct rtc_tasklet; static rtc_task_t rtc_task; @@ -81,6 +84,7 @@ rtctimer_close(struct snd_timer *t) rtc_task_t *rtc = t->private_data; if (rtc) { rtc_unregister(rtc); + tasklet_kill(&rtc_tasklet); t->private_data = NULL; } return 0; @@ -105,12 +109,17 @@ rtctimer_stop(struct snd_timer *timer) return 0; } +static void rtctimer_tasklet(unsigned long data) +{ + snd_timer_interrupt((struct snd_timer *)data, 1); +} + /* * interrupt */ static void rtctimer_interrupt(void *private_data) { - snd_timer_interrupt(private_data, 1); + tasklet_hi_schedule(private_data); } @@ -139,9 +148,11 @@ static int __init rtctimer_init(void) timer->hw = rtc_hw; timer->hw.resolution = NANO_SEC / rtctimer_freq; + tasklet_init(&rtc_tasklet, rtctimer_tasklet, (unsigned long)timer); + /* set up RTC callback */ rtc_task.func = rtctimer_interrupt; - rtc_task.private_data = timer; + rtc_task.private_data = &rtc_tasklet; err = snd_timer_global_register(timer); if (err < 0) { diff --git a/sound/core/seq/oss/seq_oss.c b/sound/core/seq/oss/seq_oss.c index b99197851..e72341356 100644 --- a/sound/core/seq/oss/seq_oss.c +++ b/sound/core/seq/oss/seq_oss.c @@ -291,7 +291,6 @@ register_proc(void) entry->content = SNDRV_INFO_CONTENT_TEXT; entry->private_data = NULL; - entry->c.text.read_size = 1024; entry->c.text.read = info_read; if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); diff --git a/sound/core/seq/seq.c b/sound/core/seq/seq.c index 20f954bc7..2f0d8773a 100644 --- a/sound/core/seq/seq.c +++ b/sound/core/seq/seq.c @@ -129,25 +129,3 @@ static void __exit alsa_seq_exit(void) module_init(alsa_seq_init) module_exit(alsa_seq_exit) - - /* seq_clientmgr.c */ -EXPORT_SYMBOL(snd_seq_create_kernel_client); -EXPORT_SYMBOL(snd_seq_delete_kernel_client); -EXPORT_SYMBOL(snd_seq_kernel_client_enqueue); -EXPORT_SYMBOL(snd_seq_kernel_client_enqueue_blocking); -EXPORT_SYMBOL(snd_seq_kernel_client_dispatch); -EXPORT_SYMBOL(snd_seq_kernel_client_ctl); -EXPORT_SYMBOL(snd_seq_kernel_client_write_poll); -EXPORT_SYMBOL(snd_seq_set_queue_tempo); - /* seq_memory.c */ -EXPORT_SYMBOL(snd_seq_expand_var_event); -EXPORT_SYMBOL(snd_seq_dump_var_event); - /* seq_ports.c */ -EXPORT_SYMBOL(snd_seq_event_port_attach); -EXPORT_SYMBOL(snd_seq_event_port_detach); - /* seq_lock.c */ -#if defined(CONFIG_SMP) || defined(CONFIG_SND_DEBUG) -/*EXPORT_SYMBOL(snd_seq_sleep_in_lock);*/ -/*EXPORT_SYMBOL(snd_seq_sleep_timeout_in_lock);*/ -EXPORT_SYMBOL(snd_use_lock_sync_helper); -#endif diff --git a/sound/core/seq/seq_clientmgr.c b/sound/core/seq/seq_clientmgr.c index bb15d9ee8..532a660df 100644 --- a/sound/core/seq/seq_clientmgr.c +++ b/sound/core/seq/seq_clientmgr.c @@ -1714,6 +1714,8 @@ int snd_seq_set_queue_tempo(int client, struct snd_seq_queue_tempo *tempo) return snd_seq_queue_timer_set_tempo(tempo->queue, client, tempo); } +EXPORT_SYMBOL(snd_seq_set_queue_tempo); + static int snd_seq_ioctl_set_queue_tempo(struct snd_seq_client *client, void __user *arg) { @@ -2264,6 +2266,8 @@ int snd_seq_create_kernel_client(struct snd_card *card, int client_index, return client->number; } +EXPORT_SYMBOL(snd_seq_create_kernel_client); + /* exported to kernel modules */ int snd_seq_delete_kernel_client(int client) { @@ -2280,6 +2284,7 @@ int snd_seq_delete_kernel_client(int client) return 0; } +EXPORT_SYMBOL(snd_seq_delete_kernel_client); /* skeleton to enqueue event, called from snd_seq_kernel_client_enqueue * and snd_seq_kernel_client_enqueue_blocking @@ -2328,6 +2333,8 @@ int snd_seq_kernel_client_enqueue(int client, struct snd_seq_event * ev, return kernel_client_enqueue(client, ev, NULL, 0, atomic, hop); } +EXPORT_SYMBOL(snd_seq_kernel_client_enqueue); + /* * exported, called by kernel clients to enqueue events (with blocking) * @@ -2340,6 +2347,7 @@ int snd_seq_kernel_client_enqueue_blocking(int client, struct snd_seq_event * ev return kernel_client_enqueue(client, ev, file, 1, atomic, hop); } +EXPORT_SYMBOL(snd_seq_kernel_client_enqueue_blocking); /* * exported, called by kernel clients to dispatch events directly to other @@ -2376,6 +2384,7 @@ int snd_seq_kernel_client_dispatch(int client, struct snd_seq_event * ev, return result; } +EXPORT_SYMBOL(snd_seq_kernel_client_dispatch); /* * exported, called by kernel clients to perform same functions as with @@ -2396,6 +2405,7 @@ int snd_seq_kernel_client_ctl(int clientid, unsigned int cmd, void *arg) return result; } +EXPORT_SYMBOL(snd_seq_kernel_client_ctl); /* exported (for OSS emulator) */ int snd_seq_kernel_client_write_poll(int clientid, struct file *file, poll_table *wait) @@ -2413,6 +2423,8 @@ int snd_seq_kernel_client_write_poll(int clientid, struct file *file, poll_table return 0; } +EXPORT_SYMBOL(snd_seq_kernel_client_write_poll); + /*---------------------------------------------------------------------------*/ #ifdef CONFIG_PROC_FS diff --git a/sound/core/seq/seq_device.c b/sound/core/seq/seq_device.c index d9a3e5a18..102ff548c 100644 --- a/sound/core/seq/seq_device.c +++ b/sound/core/seq/seq_device.c @@ -80,7 +80,7 @@ static LIST_HEAD(opslist); static int num_ops; static DEFINE_MUTEX(ops_mutex); #ifdef CONFIG_PROC_FS -static struct snd_info_entry *info_entry = NULL; +static struct snd_info_entry *info_entry; #endif /* @@ -372,14 +372,19 @@ static struct ops_list * create_driver(char *id) { struct ops_list *ops; - ops = kmalloc(sizeof(*ops), GFP_KERNEL); + ops = kzalloc(sizeof(*ops), GFP_KERNEL); if (ops == NULL) return ops; - memset(ops, 0, sizeof(*ops)); /* set up driver entry */ strlcpy(ops->id, id, sizeof(ops->id)); mutex_init(&ops->reg_mutex); + /* + * The ->reg_mutex locking rules are per-driver, so we create + * separate per-driver lock classes: + */ + lockdep_set_class(&ops->reg_mutex, (struct lock_class_key *)id); + ops->driver = DRIVER_EMPTY; INIT_LIST_HEAD(&ops->dev_list); /* lock this instance */ @@ -555,7 +560,6 @@ static int __init alsa_seq_device_init(void) if (info_entry == NULL) return -ENOMEM; info_entry->content = SNDRV_INFO_CONTENT_TEXT; - info_entry->c.text.read_size = 2048; info_entry->c.text.read = snd_seq_device_info; if (snd_info_register(info_entry) < 0) { snd_info_free_entry(info_entry); diff --git a/sound/core/seq/seq_dummy.c b/sound/core/seq/seq_dummy.c index 2a283a59e..e55488d12 100644 --- a/sound/core/seq/seq_dummy.c +++ b/sound/core/seq/seq_dummy.c @@ -66,7 +66,7 @@ MODULE_LICENSE("GPL"); MODULE_ALIAS("snd-seq-client-" __stringify(SNDRV_SEQ_CLIENT_DUMMY)); static int ports = 1; -static int duplex = 0; +static int duplex; module_param(ports, int, 0444); MODULE_PARM_DESC(ports, "number of ports to be created"); @@ -171,7 +171,9 @@ create_port(int idx, int type) pinfo.capability |= SNDRV_SEQ_PORT_CAP_WRITE | SNDRV_SEQ_PORT_CAP_SUBS_WRITE; if (duplex) pinfo.capability |= SNDRV_SEQ_PORT_CAP_DUPLEX; - pinfo.type = SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC; + pinfo.type = SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC + | SNDRV_SEQ_PORT_TYPE_SOFTWARE + | SNDRV_SEQ_PORT_TYPE_PORT; memset(&pcb, 0, sizeof(pcb)); pcb.owner = THIS_MODULE; pcb.unuse = dummy_unuse; diff --git a/sound/core/seq/seq_info.c b/sound/core/seq/seq_info.c index acce21afd..142e9e688 100644 --- a/sound/core/seq/seq_info.c +++ b/sound/core/seq/seq_info.c @@ -34,8 +34,8 @@ static struct snd_info_entry *timer_entry; static struct snd_info_entry * __init -create_info_entry(char *name, int size, void (*read)(struct snd_info_entry *, - struct snd_info_buffer *)) +create_info_entry(char *name, void (*read)(struct snd_info_entry *, + struct snd_info_buffer *)) { struct snd_info_entry *entry; @@ -43,7 +43,6 @@ create_info_entry(char *name, int size, void (*read)(struct snd_info_entry *, if (entry == NULL) return NULL; entry->content = SNDRV_INFO_CONTENT_TEXT; - entry->c.text.read_size = size; entry->c.text.read = read; if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); @@ -55,11 +54,11 @@ create_info_entry(char *name, int size, void (*read)(struct snd_info_entry *, /* create all our /proc entries */ int __init snd_seq_info_init(void) { - queues_entry = create_info_entry("queues", 512 + (256 * SNDRV_SEQ_MAX_QUEUES), + queues_entry = create_info_entry("queues", snd_seq_info_queues_read); - clients_entry = create_info_entry("clients", 512 + (256 * SNDRV_SEQ_MAX_CLIENTS), + clients_entry = create_info_entry("clients", snd_seq_info_clients_read); - timer_entry = create_info_entry("timer", 1024, snd_seq_info_timer_read); + timer_entry = create_info_entry("timer", snd_seq_info_timer_read); return 0; } diff --git a/sound/core/seq/seq_lock.c b/sound/core/seq/seq_lock.c index a837a94b2..1a34941d4 100644 --- a/sound/core/seq/seq_lock.c +++ b/sound/core/seq/seq_lock.c @@ -44,4 +44,6 @@ void snd_use_lock_sync_helper(snd_use_lock_t *lockp, const char *file, int line) } } +EXPORT_SYMBOL(snd_use_lock_sync_helper); + #endif diff --git a/sound/core/seq/seq_memory.c b/sound/core/seq/seq_memory.c index 40b4f679c..4bffe509f 100644 --- a/sound/core/seq/seq_memory.c +++ b/sound/core/seq/seq_memory.c @@ -118,6 +118,8 @@ int snd_seq_dump_var_event(const struct snd_seq_event *event, return 0; } +EXPORT_SYMBOL(snd_seq_dump_var_event); + /* * exported: @@ -167,6 +169,7 @@ int snd_seq_expand_var_event(const struct snd_seq_event *event, int count, char return err < 0 ? err : newlen; } +EXPORT_SYMBOL(snd_seq_expand_var_event); /* * release this cell, free extended data if available diff --git a/sound/core/seq/seq_memory.h b/sound/core/seq/seq_memory.h index 39c60d9e1..63e91431a 100644 --- a/sound/core/seq/seq_memory.h +++ b/sound/core/seq/seq_memory.h @@ -31,7 +31,7 @@ struct snd_seq_event_cell { struct snd_seq_event_cell *next; /* next cell */ }; -/* design note: the pool is a contigious block of memory, if we dynamicly +/* design note: the pool is a contiguous block of memory, if we dynamicly want to add additional cells to the pool be better store this in another pool as we need to know the base address of the pool when releasing memory. */ diff --git a/sound/core/seq/seq_midi.c b/sound/core/seq/seq_midi.c index 9caa1372b..1daa5b069 100644 --- a/sound/core/seq/seq_midi.c +++ b/sound/core/seq/seq_midi.c @@ -278,6 +278,7 @@ snd_seq_midisynth_register_port(struct snd_seq_device *dev) struct seq_midisynth *msynth, *ms; struct snd_seq_port_info *port; struct snd_rawmidi_info *info; + struct snd_rawmidi *rmidi = dev->private_data; int newclient = 0; unsigned int p, ports; struct snd_seq_port_callback pcallbacks; @@ -320,8 +321,8 @@ snd_seq_midisynth_register_port(struct snd_seq_device *dev) } client->seq_client = snd_seq_create_kernel_client( - card, 0, "%s", info->name[0] ? - (const char *)info->name : "External MIDI"); + card, 0, "%s", card->shortname[0] ? + (const char *)card->shortname : "External MIDI"); if (client->seq_client < 0) { kfree(client); mutex_unlock(®ister_mutex); @@ -376,7 +377,9 @@ snd_seq_midisynth_register_port(struct snd_seq_device *dev) if ((port->capability & (SNDRV_SEQ_PORT_CAP_WRITE|SNDRV_SEQ_PORT_CAP_READ)) == (SNDRV_SEQ_PORT_CAP_WRITE|SNDRV_SEQ_PORT_CAP_READ) && info->flags & SNDRV_RAWMIDI_INFO_DUPLEX) port->capability |= SNDRV_SEQ_PORT_CAP_DUPLEX; - port->type = SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC; + port->type = SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC + | SNDRV_SEQ_PORT_TYPE_HARDWARE + | SNDRV_SEQ_PORT_TYPE_PORT; port->midi_channels = 16; memset(&pcallbacks, 0, sizeof(pcallbacks)); pcallbacks.owner = THIS_MODULE; @@ -387,6 +390,8 @@ snd_seq_midisynth_register_port(struct snd_seq_device *dev) pcallbacks.unuse = midisynth_unuse; pcallbacks.event_input = event_process_midi; port->kernel = &pcallbacks; + if (rmidi->ops && rmidi->ops->get_port_info) + rmidi->ops->get_port_info(rmidi, p, port); if (snd_seq_kernel_client_ctl(client->seq_client, SNDRV_SEQ_IOCTL_CREATE_PORT, port)<0) goto __nomem; ms->seq_client = client->seq_client; diff --git a/sound/core/seq/seq_ports.c b/sound/core/seq/seq_ports.c index 2ef8fb52e..8c64b58ff 100644 --- a/sound/core/seq/seq_ports.c +++ b/sound/core/seq/seq_ports.c @@ -221,7 +221,6 @@ static void clear_subscriber_list(struct snd_seq_client *client, { struct list_head *p, *n; - down_write(&grp->list_mutex); list_for_each_safe(p, n, &grp->list_head) { struct snd_seq_subscribers *subs; struct snd_seq_client *c; @@ -259,7 +258,6 @@ static void clear_subscriber_list(struct snd_seq_client *client, snd_seq_client_unlock(c); } } - up_write(&grp->list_mutex); } /* delete port data */ @@ -516,7 +514,7 @@ int snd_seq_port_connect(struct snd_seq_client *connector, atomic_set(&subs->ref_count, 2); down_write(&src->list_mutex); - down_write(&dest->list_mutex); + down_write_nested(&dest->list_mutex, SINGLE_DEPTH_NESTING); exclusive = info->flags & SNDRV_SEQ_PORT_SUBS_EXCLUSIVE ? 1 : 0; err = -EBUSY; @@ -589,7 +587,7 @@ int snd_seq_port_disconnect(struct snd_seq_client *connector, unsigned long flags; down_write(&src->list_mutex); - down_write(&dest->list_mutex); + down_write_nested(&dest->list_mutex, SINGLE_DEPTH_NESTING); /* look for the connection */ list_for_each(p, &src->list_head) { @@ -675,6 +673,7 @@ int snd_seq_event_port_attach(int client, return ret; } +EXPORT_SYMBOL(snd_seq_event_port_attach); /* * Detach the driver from a port. @@ -694,3 +693,5 @@ int snd_seq_event_port_detach(int client, int port) return err; } + +EXPORT_SYMBOL(snd_seq_event_port_detach); diff --git a/sound/core/seq/seq_virmidi.c b/sound/core/seq/seq_virmidi.c index f4edec603..0cfa06c6b 100644 --- a/sound/core/seq/seq_virmidi.c +++ b/sound/core/seq/seq_virmidi.c @@ -390,7 +390,9 @@ static int snd_virmidi_dev_attach_seq(struct snd_virmidi_dev *rdev) pinfo->capability |= SNDRV_SEQ_PORT_CAP_WRITE | SNDRV_SEQ_PORT_CAP_SYNC_WRITE | SNDRV_SEQ_PORT_CAP_SUBS_WRITE; pinfo->capability |= SNDRV_SEQ_PORT_CAP_READ | SNDRV_SEQ_PORT_CAP_SYNC_READ | SNDRV_SEQ_PORT_CAP_SUBS_READ; pinfo->capability |= SNDRV_SEQ_PORT_CAP_DUPLEX; - pinfo->type = SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC; + pinfo->type = SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC + | SNDRV_SEQ_PORT_TYPE_SOFTWARE + | SNDRV_SEQ_PORT_TYPE_PORT; pinfo->midi_channels = 16; memset(&pcallbacks, 0, sizeof(pcallbacks)); pcallbacks.owner = THIS_MODULE; diff --git a/sound/core/sgbuf.c b/sound/core/sgbuf.c index 74745da9d..c30669f14 100644 --- a/sound/core/sgbuf.c +++ b/sound/core/sgbuf.c @@ -19,7 +19,6 @@ * */ -#include #include #include #include @@ -69,21 +68,18 @@ void *snd_malloc_sgbuf_pages(struct device *device, dmab->area = NULL; dmab->addr = 0; - dmab->private_data = sgbuf = kmalloc(sizeof(*sgbuf), GFP_KERNEL); + dmab->private_data = sgbuf = kzalloc(sizeof(*sgbuf), GFP_KERNEL); if (! sgbuf) return NULL; - memset(sgbuf, 0, sizeof(*sgbuf)); sgbuf->dev = device; pages = snd_sgbuf_aligned_pages(size); sgbuf->tblsize = sgbuf_align_table(pages); - sgbuf->table = kmalloc(sizeof(*sgbuf->table) * sgbuf->tblsize, GFP_KERNEL); + sgbuf->table = kcalloc(sgbuf->tblsize, sizeof(*sgbuf->table), GFP_KERNEL); if (! sgbuf->table) goto _failed; - memset(sgbuf->table, 0, sizeof(*sgbuf->table) * sgbuf->tblsize); - sgbuf->page_table = kmalloc(sizeof(*sgbuf->page_table) * sgbuf->tblsize, GFP_KERNEL); + sgbuf->page_table = kcalloc(sgbuf->tblsize, sizeof(*sgbuf->page_table), GFP_KERNEL); if (! sgbuf->page_table) goto _failed; - memset(sgbuf->page_table, 0, sizeof(*sgbuf->page_table) * sgbuf->tblsize); /* allocate each page */ for (i = 0; i < pages; i++) { diff --git a/sound/core/sound.c b/sound/core/sound.c index 108e430b5..7edd1fc58 100644 --- a/sound/core/sound.c +++ b/sound/core/sound.c @@ -32,15 +32,15 @@ #include #include #include -#include #include #define SNDRV_OS_MINORS 256 static int major = CONFIG_SND_MAJOR; int snd_major; +EXPORT_SYMBOL(snd_major); + static int cards_limit = 1; -static int device_mode = S_IFCHR | S_IRUGO | S_IWUGO; MODULE_AUTHOR("Jaroslav Kysela "); MODULE_DESCRIPTION("Advanced Linux Sound Architecture driver for soundcards."); @@ -49,10 +49,6 @@ module_param(major, int, 0444); MODULE_PARM_DESC(major, "Major # for sound driver."); module_param(cards_limit, int, 0444); MODULE_PARM_DESC(cards_limit, "Count of auto-loadable soundcards."); -#ifdef CONFIG_DEVFS_FS -module_param(device_mode, int, 0444); -MODULE_PARM_DESC(device_mode, "Device file permission mask for devfs."); -#endif MODULE_ALIAS_CHARDEV_MAJOR(CONFIG_SND_MAJOR); /* this one holds the actual max. card number currently available. @@ -60,6 +56,7 @@ MODULE_ALIAS_CHARDEV_MAJOR(CONFIG_SND_MAJOR); * modules are loaded manually, this limit number increases, too. */ int snd_ecards_limit; +EXPORT_SYMBOL(snd_ecards_limit); static struct snd_minor *snd_minors[SNDRV_OS_MINORS]; static DEFINE_MUTEX(sound_mutex); @@ -78,20 +75,17 @@ extern struct class *sound_class; */ void snd_request_card(int card) { - int locked; - if (! current->fs->root) return; - read_lock(&snd_card_rwlock); - locked = snd_cards_lock & (1 << card); - read_unlock(&snd_card_rwlock); - if (locked) + if (snd_card_locked(card)) return; if (card < 0 || card >= cards_limit) return; request_module("snd-card-%i", card); } +EXPORT_SYMBOL(snd_request_card); + static void snd_request_other(int minor) { char *str; @@ -133,6 +127,8 @@ void *snd_lookup_minor_data(unsigned int minor, int type) return private_data; } +EXPORT_SYMBOL(snd_lookup_minor_data); + static int snd_open(struct inode *inode, struct file *file) { unsigned int minor = iminor(inode); @@ -248,7 +244,7 @@ int snd_register_device(int type, struct snd_card *card, int dev, struct device *device = NULL; snd_assert(name, return -EINVAL); - preg = kmalloc(sizeof(struct snd_minor) + strlen(name) + 1, GFP_KERNEL); + preg = kmalloc(sizeof *preg, GFP_KERNEL); if (preg == NULL) return -ENOMEM; preg->type = type; @@ -256,7 +252,6 @@ int snd_register_device(int type, struct snd_card *card, int dev, preg->device = dev; preg->f_ops = f_ops; preg->private_data = private_data; - strcpy(preg->name, name); mutex_lock(&sound_mutex); #ifdef CONFIG_SND_DYNAMIC_MINORS minor = snd_find_free_minor(); @@ -271,8 +266,6 @@ int snd_register_device(int type, struct snd_card *card, int dev, return minor; } snd_minors[minor] = preg; - if (type != SNDRV_DEVICE_TYPE_CONTROL || preg->card >= cards_limit) - devfs_mk_cdev(MKDEV(major, minor), S_IFCHR | device_mode, "snd/%s", name); if (card) device = card->dev; class_device_create(sound_class, NULL, MKDEV(major, minor), device, "%s", name); @@ -281,6 +274,8 @@ int snd_register_device(int type, struct snd_card *card, int dev, return 0; } +EXPORT_SYMBOL(snd_register_device); + /** * snd_unregister_device - unregister the device on the given card * @type: the device type, SNDRV_DEVICE_TYPE_XXX @@ -310,9 +305,6 @@ int snd_unregister_device(int type, struct snd_card *card, int dev) return -EINVAL; } - if (mptr->type != SNDRV_DEVICE_TYPE_CONTROL || - mptr->card >= cards_limit) /* created in sound.c */ - devfs_remove("snd/%s", mptr->name); class_device_destroy(sound_class, MKDEV(major, minor)); snd_minors[minor] = NULL; @@ -321,12 +313,14 @@ int snd_unregister_device(int type, struct snd_card *card, int dev) return 0; } +EXPORT_SYMBOL(snd_unregister_device); + #ifdef CONFIG_PROC_FS /* * INFO PART */ -static struct snd_info_entry *snd_minor_info_entry = NULL; +static struct snd_info_entry *snd_minor_info_entry; static const char *snd_device_type_name(int type) { @@ -381,7 +375,6 @@ int __init snd_minor_info_init(void) entry = snd_info_create_module_entry(THIS_MODULE, "devices", NULL); if (entry) { - entry->c.text.read_size = PAGE_SIZE; entry->c.text.read = snd_minor_info_read; if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); @@ -406,24 +399,17 @@ int __exit snd_minor_info_done(void) static int __init alsa_sound_init(void) { - short controlnum; - snd_major = major; snd_ecards_limit = cards_limit; - devfs_mk_dir("snd"); if (register_chrdev(major, "alsa", &snd_fops)) { snd_printk(KERN_ERR "unable to register native major device number %d\n", major); - devfs_remove("snd"); return -EIO; } if (snd_info_init() < 0) { unregister_chrdev(major, "alsa"); - devfs_remove("snd"); return -ENOMEM; } snd_info_minor_register(); - for (controlnum = 0; controlnum < cards_limit; controlnum++) - devfs_mk_cdev(MKDEV(major, controlnum<<5), S_IFCHR | device_mode, "snd/controlC%d", controlnum); #ifndef MODULE printk(KERN_INFO "Advanced Linux Sound Architecture Driver Version " CONFIG_SND_VERSION CONFIG_SND_DATE ".\n"); #endif @@ -432,105 +418,11 @@ static int __init alsa_sound_init(void) static void __exit alsa_sound_exit(void) { - short controlnum; - - for (controlnum = 0; controlnum < cards_limit; controlnum++) - devfs_remove("snd/controlC%d", controlnum); - snd_info_minor_unregister(); snd_info_done(); if (unregister_chrdev(major, "alsa") != 0) snd_printk(KERN_ERR "unable to unregister major device number %d\n", major); - devfs_remove("snd"); } module_init(alsa_sound_init) module_exit(alsa_sound_exit) - - /* sound.c */ -EXPORT_SYMBOL(snd_major); -EXPORT_SYMBOL(snd_ecards_limit); -#if defined(CONFIG_KMOD) -EXPORT_SYMBOL(snd_request_card); -#endif -EXPORT_SYMBOL(snd_register_device); -EXPORT_SYMBOL(snd_unregister_device); -EXPORT_SYMBOL(snd_lookup_minor_data); -#if defined(CONFIG_SND_OSSEMUL) -EXPORT_SYMBOL(snd_register_oss_device); -EXPORT_SYMBOL(snd_unregister_oss_device); -EXPORT_SYMBOL(snd_lookup_oss_minor_data); -#endif - /* memory.c */ -EXPORT_SYMBOL(copy_to_user_fromio); -EXPORT_SYMBOL(copy_from_user_toio); - /* init.c */ -EXPORT_SYMBOL(snd_cards); -#if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE) -EXPORT_SYMBOL(snd_mixer_oss_notify_callback); -#endif -EXPORT_SYMBOL(snd_card_new); -EXPORT_SYMBOL(snd_card_disconnect); -EXPORT_SYMBOL(snd_card_free); -EXPORT_SYMBOL(snd_card_free_in_thread); -EXPORT_SYMBOL(snd_card_register); -EXPORT_SYMBOL(snd_component_add); -EXPORT_SYMBOL(snd_card_file_add); -EXPORT_SYMBOL(snd_card_file_remove); -#ifdef CONFIG_PM -EXPORT_SYMBOL(snd_power_wait); -#endif - /* device.c */ -EXPORT_SYMBOL(snd_device_new); -EXPORT_SYMBOL(snd_device_register); -EXPORT_SYMBOL(snd_device_free); - /* isadma.c */ -#ifdef CONFIG_ISA_DMA_API -EXPORT_SYMBOL(snd_dma_program); -EXPORT_SYMBOL(snd_dma_disable); -EXPORT_SYMBOL(snd_dma_pointer); -#endif - /* info.c */ -#ifdef CONFIG_PROC_FS -EXPORT_SYMBOL(snd_seq_root); -EXPORT_SYMBOL(snd_iprintf); -EXPORT_SYMBOL(snd_info_get_line); -EXPORT_SYMBOL(snd_info_get_str); -EXPORT_SYMBOL(snd_info_create_module_entry); -EXPORT_SYMBOL(snd_info_create_card_entry); -EXPORT_SYMBOL(snd_info_free_entry); -EXPORT_SYMBOL(snd_info_register); -EXPORT_SYMBOL(snd_info_unregister); -EXPORT_SYMBOL(snd_card_proc_new); -#endif - /* info_oss.c */ -#if defined(CONFIG_SND_OSSEMUL) && defined(CONFIG_PROC_FS) -EXPORT_SYMBOL(snd_oss_info_register); -#endif - /* control.c */ -EXPORT_SYMBOL(snd_ctl_new); -EXPORT_SYMBOL(snd_ctl_new1); -EXPORT_SYMBOL(snd_ctl_free_one); -EXPORT_SYMBOL(snd_ctl_add); -EXPORT_SYMBOL(snd_ctl_remove); -EXPORT_SYMBOL(snd_ctl_remove_id); -EXPORT_SYMBOL(snd_ctl_rename_id); -EXPORT_SYMBOL(snd_ctl_find_numid); -EXPORT_SYMBOL(snd_ctl_find_id); -EXPORT_SYMBOL(snd_ctl_notify); -EXPORT_SYMBOL(snd_ctl_register_ioctl); -EXPORT_SYMBOL(snd_ctl_unregister_ioctl); -#ifdef CONFIG_COMPAT -EXPORT_SYMBOL(snd_ctl_register_ioctl_compat); -EXPORT_SYMBOL(snd_ctl_unregister_ioctl_compat); -#endif -EXPORT_SYMBOL(snd_ctl_elem_read); -EXPORT_SYMBOL(snd_ctl_elem_write); - /* misc.c */ -EXPORT_SYMBOL(release_and_free_resource); -#ifdef CONFIG_SND_VERBOSE_PRINTK -EXPORT_SYMBOL(snd_verbose_printk); -#endif -#if defined(CONFIG_SND_DEBUG) && defined(CONFIG_SND_VERBOSE_PRINTK) -EXPORT_SYMBOL(snd_verbose_printd); -#endif diff --git a/sound/core/sound_oss.c b/sound/core/sound_oss.c index 9055c6de9..74f0fe5a1 100644 --- a/sound/core/sound_oss.c +++ b/sound/core/sound_oss.c @@ -58,6 +58,8 @@ void *snd_lookup_oss_minor_data(unsigned int minor, int type) return private_data; } +EXPORT_SYMBOL(snd_lookup_oss_minor_data); + static int snd_oss_kernel_minor(int type, struct snd_card *card, int dev) { int minor; @@ -158,6 +160,8 @@ int snd_register_oss_device(int type, struct snd_card *card, int dev, return -EBUSY; } +EXPORT_SYMBOL(snd_register_oss_device); + int snd_unregister_oss_device(int type, struct snd_card *card, int dev) { int minor = snd_oss_kernel_minor(type, card, dev); @@ -197,13 +201,15 @@ int snd_unregister_oss_device(int type, struct snd_card *card, int dev) return 0; } +EXPORT_SYMBOL(snd_unregister_oss_device); + /* * INFO PART */ #ifdef CONFIG_PROC_FS -static struct snd_info_entry *snd_minor_info_oss_entry = NULL; +static struct snd_info_entry *snd_minor_info_oss_entry; static const char *snd_oss_device_type_name(int type) { @@ -252,7 +258,6 @@ int __init snd_minor_info_oss_init(void) entry = snd_info_create_module_entry(THIS_MODULE, "devices", snd_oss_root); if (entry) { - entry->c.text.read_size = PAGE_SIZE; entry->c.text.read = snd_minor_info_oss_read; if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); diff --git a/sound/core/timer.c b/sound/core/timer.c index 4585600ba..0a984e881 100644 --- a/sound/core/timer.c +++ b/sound/core/timer.c @@ -1062,7 +1062,6 @@ static int snd_timer_register_system(void) static void snd_timer_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) { - unsigned long flags; struct snd_timer *timer; struct snd_timer_instance *ti; struct list_head *p, *q; @@ -1096,7 +1095,6 @@ static void snd_timer_proc_read(struct snd_info_entry *entry, if (timer->hw.flags & SNDRV_TIMER_HW_SLAVE) snd_iprintf(buffer, " SLAVE"); snd_iprintf(buffer, "\n"); - spin_lock_irqsave(&timer->lock, flags); list_for_each(q, &timer->open_list_head) { ti = list_entry(q, struct snd_timer_instance, open_list); snd_iprintf(buffer, " Client %s : %s\n", @@ -1105,12 +1103,11 @@ static void snd_timer_proc_read(struct snd_info_entry *entry, SNDRV_TIMER_IFLG_RUNNING) ? "running" : "stopped"); } - spin_unlock_irqrestore(&timer->lock, flags); } mutex_unlock(®ister_mutex); } -static struct snd_info_entry *snd_timer_proc_entry = NULL; +static struct snd_info_entry *snd_timer_proc_entry; static void __init snd_timer_proc_init(void) { @@ -1118,7 +1115,6 @@ static void __init snd_timer_proc_init(void) entry = snd_info_create_module_entry(THIS_MODULE, "timers", NULL); if (entry != NULL) { - entry->c.text.read_size = SNDRV_TIMER_DEVICES * 128; entry->c.text.read = snd_timer_proc_read; if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); diff --git a/sound/drivers/dummy.c b/sound/drivers/dummy.c index ae0df549f..ffeafaf2e 100644 --- a/sound/drivers/dummy.c +++ b/sound/drivers/dummy.c @@ -677,6 +677,10 @@ static int __init alsa_card_dummy_init(void) i, NULL, 0); if (IS_ERR(device)) continue; + if (!platform_get_drvdata(device)) { + platform_device_unregister(device); + continue; + } devices[i] = device; cards++; } diff --git a/sound/drivers/mpu401/mpu401.c b/sound/drivers/mpu401/mpu401.c index 77b060097..17cc105b2 100644 --- a/sound/drivers/mpu401/mpu401.c +++ b/sound/drivers/mpu401/mpu401.c @@ -83,7 +83,7 @@ static int snd_mpu401_create(int dev, struct snd_card **rcard) if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401, port[dev], 0, - irq[dev], irq[dev] >= 0 ? SA_INTERRUPT : 0, NULL)) < 0) { + irq[dev], irq[dev] >= 0 ? IRQF_DISABLED : 0, NULL)) < 0) { printk(KERN_ERR "MPU401 not detected at 0x%lx\n", port[dev]); goto _err; } @@ -160,8 +160,9 @@ static int __devinit snd_mpu401_pnp(int dev, struct pnp_dev *device, return -ENODEV; } if (pnp_port_len(device, 0) < IO_EXTENT) { - snd_printk(KERN_ERR "PnP port length is %ld, expected %d\n", - pnp_port_len(device, 0), IO_EXTENT); + snd_printk(KERN_ERR "PnP port length is %llu, expected %d\n", + (unsigned long long)pnp_port_len(device, 0), + IO_EXTENT); return -ENODEV; } port[dev] = pnp_port_start(device, 0); @@ -253,6 +254,10 @@ static int __init alsa_card_mpu401_init(void) i, NULL, 0); if (IS_ERR(device)) continue; + if (!platform_get_drvdata(device)) { + platform_device_unregister(device); + continue; + } platform_devices[i] = device; snd_mpu401_devices++; } diff --git a/sound/drivers/mpu401/mpu401_uart.c b/sound/drivers/mpu401/mpu401_uart.c index b49a45cbf..4bf07ca9b 100644 --- a/sound/drivers/mpu401/mpu401_uart.c +++ b/sound/drivers/mpu401/mpu401_uart.c @@ -58,22 +58,26 @@ static void snd_mpu401_uart_output_write(struct snd_mpu401 * mpu); #define MPU401_ACK 0xfe /* Build in lowlevel io */ -static void mpu401_write_port(struct snd_mpu401 *mpu, unsigned char data, unsigned long addr) +static void mpu401_write_port(struct snd_mpu401 *mpu, unsigned char data, + unsigned long addr) { outb(data, addr); } -static unsigned char mpu401_read_port(struct snd_mpu401 *mpu, unsigned long addr) +static unsigned char mpu401_read_port(struct snd_mpu401 *mpu, + unsigned long addr) { return inb(addr); } -static void mpu401_write_mmio(struct snd_mpu401 *mpu, unsigned char data, unsigned long addr) +static void mpu401_write_mmio(struct snd_mpu401 *mpu, unsigned char data, + unsigned long addr) { writeb(data, (void __iomem *)addr); } -static unsigned char mpu401_read_mmio(struct snd_mpu401 *mpu, unsigned long addr) +static unsigned char mpu401_read_mmio(struct snd_mpu401 *mpu, + unsigned long addr) { return readb((void __iomem *)addr); } @@ -86,20 +90,13 @@ static void snd_mpu401_uart_clear_rx(struct snd_mpu401 *mpu) mpu->read(mpu, MPU401D(mpu)); #ifdef CONFIG_SND_DEBUG if (timeout <= 0) - snd_printk("cmd: clear rx timeout (status = 0x%x)\n", mpu->read(mpu, MPU401C(mpu))); + snd_printk(KERN_ERR "cmd: clear rx timeout (status = 0x%x)\n", + mpu->read(mpu, MPU401C(mpu))); #endif } -static void _snd_mpu401_uart_interrupt(struct snd_mpu401 *mpu) +static void uart_interrupt_tx(struct snd_mpu401 *mpu) { - spin_lock(&mpu->input_lock); - if (test_bit(MPU401_MODE_BIT_INPUT, &mpu->mode)) { - snd_mpu401_uart_input_read(mpu); - } else { - snd_mpu401_uart_clear_rx(mpu); - } - spin_unlock(&mpu->input_lock); - /* ok. for better Tx performance try do some output when input is done */ if (test_bit(MPU401_MODE_BIT_OUTPUT, &mpu->mode) && test_bit(MPU401_MODE_BIT_OUTPUT_TRIGGER, &mpu->mode)) { spin_lock(&mpu->output_lock); @@ -108,6 +105,22 @@ static void _snd_mpu401_uart_interrupt(struct snd_mpu401 *mpu) } } +static void _snd_mpu401_uart_interrupt(struct snd_mpu401 *mpu) +{ + if (mpu->info_flags & MPU401_INFO_INPUT) { + spin_lock(&mpu->input_lock); + if (test_bit(MPU401_MODE_BIT_INPUT, &mpu->mode)) + snd_mpu401_uart_input_read(mpu); + else + snd_mpu401_uart_clear_rx(mpu); + spin_unlock(&mpu->input_lock); + } + if (! (mpu->info_flags & MPU401_INFO_TX_IRQ)) + /* ok. for better Tx performance try do some output + when input is done */ + uart_interrupt_tx(mpu); +} + /** * snd_mpu401_uart_interrupt - generic MPU401-UART interrupt handler * @irq: the irq number @@ -116,7 +129,8 @@ static void _snd_mpu401_uart_interrupt(struct snd_mpu401 *mpu) * * Processes the interrupt for MPU401-UART i/o. */ -irqreturn_t snd_mpu401_uart_interrupt(int irq, void *dev_id, struct pt_regs *regs) +irqreturn_t snd_mpu401_uart_interrupt(int irq, void *dev_id, + struct pt_regs *regs) { struct snd_mpu401 *mpu = dev_id; @@ -126,6 +140,29 @@ irqreturn_t snd_mpu401_uart_interrupt(int irq, void *dev_id, struct pt_regs *reg return IRQ_HANDLED; } +EXPORT_SYMBOL(snd_mpu401_uart_interrupt); + +/** + * snd_mpu401_uart_interrupt_tx - generic MPU401-UART transmit irq handler + * @irq: the irq number + * @dev_id: mpu401 instance + * @regs: the reigster + * + * Processes the interrupt for MPU401-UART output. + */ +irqreturn_t snd_mpu401_uart_interrupt_tx(int irq, void *dev_id, + struct pt_regs *regs) +{ + struct snd_mpu401 *mpu = dev_id; + + if (mpu == NULL) + return IRQ_NONE; + uart_interrupt_tx(mpu); + return IRQ_HANDLED; +} + +EXPORT_SYMBOL(snd_mpu401_uart_interrupt_tx); + /* * timer callback * reprogram the timer and call the interrupt job @@ -159,7 +196,8 @@ static void snd_mpu401_uart_add_timer (struct snd_mpu401 *mpu, int input) mpu->timer.expires = 1 + jiffies; add_timer(&mpu->timer); } - mpu->timer_invoked |= input ? MPU401_MODE_INPUT_TIMER : MPU401_MODE_OUTPUT_TIMER; + mpu->timer_invoked |= input ? MPU401_MODE_INPUT_TIMER : + MPU401_MODE_OUTPUT_TIMER; spin_unlock_irqrestore (&mpu->timer_lock, flags); } @@ -172,7 +210,8 @@ static void snd_mpu401_uart_remove_timer (struct snd_mpu401 *mpu, int input) spin_lock_irqsave (&mpu->timer_lock, flags); if (mpu->timer_invoked) { - mpu->timer_invoked &= input ? ~MPU401_MODE_INPUT_TIMER : ~MPU401_MODE_OUTPUT_TIMER; + mpu->timer_invoked &= input ? ~MPU401_MODE_INPUT_TIMER : + ~MPU401_MODE_OUTPUT_TIMER; if (! mpu->timer_invoked) del_timer(&mpu->timer); } @@ -180,11 +219,12 @@ static void snd_mpu401_uart_remove_timer (struct snd_mpu401 *mpu, int input) } /* - + * send a UART command + * return zero if successful, non-zero for some errors */ static int snd_mpu401_uart_cmd(struct snd_mpu401 * mpu, unsigned char cmd, - int ack) + int ack) { unsigned long flags; int timeout, ok; @@ -196,11 +236,13 @@ static int snd_mpu401_uart_cmd(struct snd_mpu401 * mpu, unsigned char cmd, } /* ok. standard MPU-401 initialization */ if (mpu->hardware != MPU401_HW_SB) { - for (timeout = 1000; timeout > 0 && !snd_mpu401_output_ready(mpu); timeout--) + for (timeout = 1000; timeout > 0 && + !snd_mpu401_output_ready(mpu); timeout--) udelay(10); #ifdef CONFIG_SND_DEBUG if (!timeout) - snd_printk("cmd: tx timeout (status = 0x%x)\n", mpu->read(mpu, MPU401C(mpu))); + snd_printk(KERN_ERR "cmd: tx timeout (status = 0x%x)\n", + mpu->read(mpu, MPU401C(mpu))); #endif } mpu->write(mpu, cmd, MPU401C(mpu)); @@ -215,12 +257,14 @@ static int snd_mpu401_uart_cmd(struct snd_mpu401 * mpu, unsigned char cmd, } if (!ok && mpu->read(mpu, MPU401D(mpu)) == MPU401_ACK) ok = 1; - } else { + } else ok = 1; - } spin_unlock_irqrestore(&mpu->input_lock, flags); if (!ok) { - snd_printk("cmd: 0x%x failed at 0x%lx (status = 0x%x, data = 0x%x)\n", cmd, mpu->port, mpu->read(mpu, MPU401C(mpu)), mpu->read(mpu, MPU401D(mpu))); + snd_printk(KERN_ERR "cmd: 0x%x failed at 0x%lx " + "(status = 0x%x, data = 0x%x)\n", cmd, mpu->port, + mpu->read(mpu, MPU401C(mpu)), + mpu->read(mpu, MPU401D(mpu))); return 1; } return 0; @@ -314,7 +358,8 @@ static int snd_mpu401_uart_output_close(struct snd_rawmidi_substream *substream) /* * trigger input callback */ -static void snd_mpu401_uart_input_trigger(struct snd_rawmidi_substream *substream, int up) +static void +snd_mpu401_uart_input_trigger(struct snd_rawmidi_substream *substream, int up) { unsigned long flags; struct snd_mpu401 *mpu; @@ -322,7 +367,8 @@ static void snd_mpu401_uart_input_trigger(struct snd_rawmidi_substream *substrea mpu = substream->rmidi->private_data; if (up) { - if (! test_and_set_bit(MPU401_MODE_BIT_INPUT_TRIGGER, &mpu->mode)) { + if (! test_and_set_bit(MPU401_MODE_BIT_INPUT_TRIGGER, + &mpu->mode)) { /* first time - flush FIFO */ while (max-- > 0) mpu->read(mpu, MPU401D(mpu)); @@ -352,13 +398,11 @@ static void snd_mpu401_uart_input_read(struct snd_mpu401 * mpu) unsigned char byte; while (max-- > 0) { - if (snd_mpu401_input_avail(mpu)) { - byte = mpu->read(mpu, MPU401D(mpu)); - if (test_bit(MPU401_MODE_BIT_INPUT_TRIGGER, &mpu->mode)) - snd_rawmidi_receive(mpu->substream_input, &byte, 1); - } else { + if (! snd_mpu401_input_avail(mpu)) break; /* input not available */ - } + byte = mpu->read(mpu, MPU401D(mpu)); + if (test_bit(MPU401_MODE_BIT_INPUT_TRIGGER, &mpu->mode)) + snd_rawmidi_receive(mpu->substream_input, &byte, 1); } } @@ -380,16 +424,16 @@ static void snd_mpu401_uart_output_write(struct snd_mpu401 * mpu) int max = 256, timeout; do { - if (snd_rawmidi_transmit_peek(mpu->substream_output, &byte, 1) == 1) { + if (snd_rawmidi_transmit_peek(mpu->substream_output, + &byte, 1) == 1) { for (timeout = 100; timeout > 0; timeout--) { - if (snd_mpu401_output_ready(mpu)) { - mpu->write(mpu, byte, MPU401D(mpu)); - snd_rawmidi_transmit_ack(mpu->substream_output, 1); + if (snd_mpu401_output_ready(mpu)) break; - } } if (timeout == 0) break; /* Tx FIFO full - try again later */ + mpu->write(mpu, byte, MPU401D(mpu)); + snd_rawmidi_transmit_ack(mpu->substream_output, 1); } else { snd_mpu401_uart_remove_timer (mpu, 0); break; /* no other data - leave the tx loop */ @@ -400,7 +444,8 @@ static void snd_mpu401_uart_output_write(struct snd_mpu401 * mpu) /* * output trigger callback */ -static void snd_mpu401_uart_output_trigger(struct snd_rawmidi_substream *substream, int up) +static void +snd_mpu401_uart_output_trigger(struct snd_rawmidi_substream *substream, int up) { unsigned long flags; struct snd_mpu401 *mpu; @@ -413,14 +458,16 @@ static void snd_mpu401_uart_output_trigger(struct snd_rawmidi_substream *substre * since the output timer might have been removed in * snd_mpu401_uart_output_write(). */ - snd_mpu401_uart_add_timer(mpu, 0); + if (! (mpu->info_flags & MPU401_INFO_TX_IRQ)) + snd_mpu401_uart_add_timer(mpu, 0); /* output pending data */ spin_lock_irqsave(&mpu->output_lock, flags); snd_mpu401_uart_output_write(mpu); spin_unlock_irqrestore(&mpu->output_lock, flags); } else { - snd_mpu401_uart_remove_timer(mpu, 0); + if (! (mpu->info_flags & MPU401_INFO_TX_IRQ)) + snd_mpu401_uart_remove_timer(mpu, 0); clear_bit(MPU401_MODE_BIT_OUTPUT_TRIGGER, &mpu->mode); } } @@ -458,7 +505,7 @@ static void snd_mpu401_uart_free(struct snd_rawmidi *rmidi) * @device: the device index, zero-based * @hardware: the hardware type, MPU401_HW_XXXX * @port: the base address of MPU401 port - * @integrated: non-zero if the port was already reserved by the chip + * @info_flags: bitflags MPU401_INFO_XXX * @irq: the irq number, -1 if no interrupt for mpu * @irq_flags: the irq request flags (SA_XXX), 0 if irq was already reserved. * @rrawmidi: the pointer to store the new rawmidi instance @@ -473,17 +520,24 @@ static void snd_mpu401_uart_free(struct snd_rawmidi *rmidi) */ int snd_mpu401_uart_new(struct snd_card *card, int device, unsigned short hardware, - unsigned long port, int integrated, + unsigned long port, + unsigned int info_flags, int irq, int irq_flags, struct snd_rawmidi ** rrawmidi) { struct snd_mpu401 *mpu; struct snd_rawmidi *rmidi; + int in_enable, out_enable; int err; if (rrawmidi) *rrawmidi = NULL; - if ((err = snd_rawmidi_new(card, "MPU-401U", device, 1, 1, &rmidi)) < 0) + if (! (info_flags & (MPU401_INFO_INPUT | MPU401_INFO_OUTPUT))) + info_flags |= MPU401_INFO_INPUT | MPU401_INFO_OUTPUT; + in_enable = (info_flags & MPU401_INFO_INPUT) ? 1 : 0; + out_enable = (info_flags & MPU401_INFO_OUTPUT) ? 1 : 0; + if ((err = snd_rawmidi_new(card, "MPU-401U", device, + out_enable, in_enable, &rmidi)) < 0) return err; mpu = kzalloc(sizeof(*mpu), GFP_KERNEL); if (mpu == NULL) { @@ -497,23 +551,23 @@ int snd_mpu401_uart_new(struct snd_card *card, int device, spin_lock_init(&mpu->output_lock); spin_lock_init(&mpu->timer_lock); mpu->hardware = hardware; - if (!integrated) { + if (! (info_flags & MPU401_INFO_INTEGRATED)) { int res_size = hardware == MPU401_HW_PC98II ? 4 : 2; - if ((mpu->res = request_region(port, res_size, "MPU401 UART")) == NULL) { - snd_printk(KERN_ERR "mpu401_uart: unable to grab port 0x%lx size %d\n", port, res_size); + mpu->res = request_region(port, res_size, "MPU401 UART"); + if (mpu->res == NULL) { + snd_printk(KERN_ERR "mpu401_uart: " + "unable to grab port 0x%lx size %d\n", + port, res_size); snd_device_free(card, rmidi); return -EBUSY; } } - switch (hardware) { - case MPU401_HW_AUREAL: + if (info_flags & MPU401_INFO_MMIO) { mpu->write = mpu401_write_mmio; mpu->read = mpu401_read_mmio; - break; - default: + } else { mpu->write = mpu401_write_port; mpu->read = mpu401_read_port; - break; } mpu->port = port; if (hardware == MPU401_HW_PC98II) @@ -521,30 +575,40 @@ int snd_mpu401_uart_new(struct snd_card *card, int device, else mpu->cport = port + 1; if (irq >= 0 && irq_flags) { - if (request_irq(irq, snd_mpu401_uart_interrupt, irq_flags, "MPU401 UART", (void *) mpu)) { - snd_printk(KERN_ERR "mpu401_uart: unable to grab IRQ %d\n", irq); + if (request_irq(irq, snd_mpu401_uart_interrupt, irq_flags, + "MPU401 UART", (void *) mpu)) { + snd_printk(KERN_ERR "mpu401_uart: " + "unable to grab IRQ %d\n", irq); snd_device_free(card, rmidi); return -EBUSY; } } + mpu->info_flags = info_flags; mpu->irq = irq; mpu->irq_flags = irq_flags; if (card->shortname[0]) - snprintf(rmidi->name, sizeof(rmidi->name), "%s MIDI", card->shortname); + snprintf(rmidi->name, sizeof(rmidi->name), "%s MIDI", + card->shortname); else - sprintf(rmidi->name, "MPU-401 MIDI %d-%d", card->number, device); - snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_OUTPUT, &snd_mpu401_uart_output); - snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_INPUT, &snd_mpu401_uart_input); - rmidi->info_flags |= SNDRV_RAWMIDI_INFO_OUTPUT | - SNDRV_RAWMIDI_INFO_INPUT | - SNDRV_RAWMIDI_INFO_DUPLEX; + sprintf(rmidi->name, "MPU-401 MIDI %d-%d",card->number, device); + if (out_enable) { + snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_OUTPUT, + &snd_mpu401_uart_output); + rmidi->info_flags |= SNDRV_RAWMIDI_INFO_OUTPUT; + } + if (in_enable) { + snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_INPUT, + &snd_mpu401_uart_input); + rmidi->info_flags |= SNDRV_RAWMIDI_INFO_INPUT; + if (out_enable) + rmidi->info_flags |= SNDRV_RAWMIDI_INFO_DUPLEX; + } mpu->rmidi = rmidi; if (rrawmidi) *rrawmidi = rmidi; return 0; } -EXPORT_SYMBOL(snd_mpu401_uart_interrupt); EXPORT_SYMBOL(snd_mpu401_uart_new); /* diff --git a/sound/drivers/mtpav.c b/sound/drivers/mtpav.c index b7a0b4281..e064d6c56 100644 --- a/sound/drivers/mtpav.c +++ b/sound/drivers/mtpav.c @@ -590,7 +590,7 @@ static int __init snd_mtpav_get_ISA(struct mtpav * mcard) return -EBUSY; } mcard->port = port; - if (request_irq(irq, snd_mtpav_irqh, SA_INTERRUPT, "MOTU MTPAV", mcard)) { + if (request_irq(irq, snd_mtpav_irqh, IRQF_DISABLED, "MOTU MTPAV", mcard)) { snd_printk("MTVAP IRQ %d busy\n", irq); return -EBUSY; } @@ -770,11 +770,15 @@ static int __init alsa_card_mtpav_init(void) return err; device = platform_device_register_simple(SND_MTPAV_DRIVER, -1, NULL, 0); - if (IS_ERR(device)) { - platform_driver_unregister(&snd_mtpav_driver); - return PTR_ERR(device); - } - return 0; + if (!IS_ERR(device)) { + if (platform_get_drvdata(device)) + return 0; + platform_device_unregister(device); + err = -ENODEV; + } else + err = PTR_ERR(device); + platform_driver_unregister(&snd_mtpav_driver); + return err; } static void __exit alsa_card_mtpav_exit(void) diff --git a/sound/drivers/opl3/opl3_lib.c b/sound/drivers/opl3/opl3_lib.c index 4f8556976..87fe376f3 100644 --- a/sound/drivers/opl3/opl3_lib.c +++ b/sound/drivers/opl3/opl3_lib.c @@ -316,6 +316,8 @@ void snd_opl3_interrupt(struct snd_hwdep * hw) } } +EXPORT_SYMBOL(snd_opl3_interrupt); + /* */ @@ -369,6 +371,8 @@ int snd_opl3_new(struct snd_card *card, return 0; } +EXPORT_SYMBOL(snd_opl3_new); + int snd_opl3_init(struct snd_opl3 *opl3) { if (! opl3->command) { @@ -393,6 +397,8 @@ int snd_opl3_init(struct snd_opl3 *opl3) return 0; } +EXPORT_SYMBOL(snd_opl3_init); + int snd_opl3_create(struct snd_card *card, unsigned long l_port, unsigned long r_port, @@ -451,6 +457,8 @@ int snd_opl3_create(struct snd_card *card, return 0; } +EXPORT_SYMBOL(snd_opl3_create); + int snd_opl3_timer_new(struct snd_opl3 * opl3, int timer1_dev, int timer2_dev) { int err; @@ -468,6 +476,8 @@ int snd_opl3_timer_new(struct snd_opl3 * opl3, int timer1_dev, int timer2_dev) return 0; } +EXPORT_SYMBOL(snd_opl3_timer_new); + int snd_opl3_hwdep_new(struct snd_opl3 * opl3, int device, int seq_device, struct snd_hwdep ** rhwdep) @@ -526,17 +536,8 @@ int snd_opl3_hwdep_new(struct snd_opl3 * opl3, return 0; } -EXPORT_SYMBOL(snd_opl3_interrupt); -EXPORT_SYMBOL(snd_opl3_new); -EXPORT_SYMBOL(snd_opl3_init); -EXPORT_SYMBOL(snd_opl3_create); -EXPORT_SYMBOL(snd_opl3_timer_new); EXPORT_SYMBOL(snd_opl3_hwdep_new); -/* opl3_synth.c */ -EXPORT_SYMBOL(snd_opl3_regmap); -EXPORT_SYMBOL(snd_opl3_reset); - /* * INIT part */ diff --git a/sound/drivers/opl3/opl3_oss.c b/sound/drivers/opl3/opl3_oss.c index fccf019a6..5fd3a4c95 100644 --- a/sound/drivers/opl3/opl3_oss.c +++ b/sound/drivers/opl3/opl3_oss.c @@ -100,7 +100,8 @@ static int snd_opl3_oss_create_port(struct snd_opl3 * opl3) SNDRV_SEQ_PORT_CAP_WRITE, SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC | SNDRV_SEQ_PORT_TYPE_MIDI_GM | - SNDRV_SEQ_PORT_TYPE_SYNTH, + SNDRV_SEQ_PORT_TYPE_HARDWARE | + SNDRV_SEQ_PORT_TYPE_SYNTHESIZER, voices, voices, name); if (opl3->oss_chset->port < 0) { diff --git a/sound/drivers/opl3/opl3_seq.c b/sound/drivers/opl3/opl3_seq.c index 57becf34f..96762c9d4 100644 --- a/sound/drivers/opl3/opl3_seq.c +++ b/sound/drivers/opl3/opl3_seq.c @@ -203,7 +203,9 @@ static int snd_opl3_synth_create_port(struct snd_opl3 * opl3) SNDRV_SEQ_PORT_CAP_SUBS_WRITE, SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC | SNDRV_SEQ_PORT_TYPE_MIDI_GM | - SNDRV_SEQ_PORT_TYPE_SYNTH, + SNDRV_SEQ_PORT_TYPE_DIRECT_SAMPLE | + SNDRV_SEQ_PORT_TYPE_HARDWARE | + SNDRV_SEQ_PORT_TYPE_SYNTHESIZER, 16, voices, name); if (opl3->chset->port < 0) { diff --git a/sound/drivers/opl3/opl3_synth.c b/sound/drivers/opl3/opl3_synth.c index 6db503f02..a4b3543a7 100644 --- a/sound/drivers/opl3/opl3_synth.c +++ b/sound/drivers/opl3/opl3_synth.c @@ -58,6 +58,8 @@ char snd_opl3_regmap[MAX_OPL2_VOICES][4] = { 0x12, 0x15, 0x00, 0x00 } /* is selected (only left reg block) */ }; +EXPORT_SYMBOL(snd_opl3_regmap); + /* * prototypes */ @@ -228,6 +230,7 @@ void snd_opl3_reset(struct snd_opl3 * opl3) opl3->rhythm = 0; } +EXPORT_SYMBOL(snd_opl3_reset); static int snd_opl3_play_note(struct snd_opl3 * opl3, struct snd_dm_fm_note * note) { @@ -445,3 +448,4 @@ static int snd_opl3_set_connection(struct snd_opl3 * opl3, int connection) return 0; } + diff --git a/sound/drivers/opl4/opl4_lib.c b/sound/drivers/opl4/opl4_lib.c index 4bc860ae0..01997f24c 100644 --- a/sound/drivers/opl4/opl4_lib.c +++ b/sound/drivers/opl4/opl4_lib.c @@ -43,6 +43,8 @@ void snd_opl4_write(struct snd_opl4 *opl4, u8 reg, u8 value) outb(value, opl4->pcm_port + 1); } +EXPORT_SYMBOL(snd_opl4_write); + u8 snd_opl4_read(struct snd_opl4 *opl4, u8 reg) { snd_opl4_wait(opl4); @@ -52,6 +54,8 @@ u8 snd_opl4_read(struct snd_opl4 *opl4, u8 reg) return inb(opl4->pcm_port + 1); } +EXPORT_SYMBOL(snd_opl4_read); + void snd_opl4_read_memory(struct snd_opl4 *opl4, char *buf, int offset, int size) { unsigned long flags; @@ -76,6 +80,8 @@ void snd_opl4_read_memory(struct snd_opl4 *opl4, char *buf, int offset, int size spin_unlock_irqrestore(&opl4->reg_lock, flags); } +EXPORT_SYMBOL(snd_opl4_read_memory); + void snd_opl4_write_memory(struct snd_opl4 *opl4, const char *buf, int offset, int size) { unsigned long flags; @@ -100,6 +106,8 @@ void snd_opl4_write_memory(struct snd_opl4 *opl4, const char *buf, int offset, i spin_unlock_irqrestore(&opl4->reg_lock, flags); } +EXPORT_SYMBOL(snd_opl4_write_memory); + static void snd_opl4_enable_opl4(struct snd_opl4 *opl4) { outb(OPL3_REG_MODE, opl4->fm_port + 2); @@ -256,10 +264,6 @@ int snd_opl4_create(struct snd_card *card, return 0; } -EXPORT_SYMBOL(snd_opl4_write); -EXPORT_SYMBOL(snd_opl4_read); -EXPORT_SYMBOL(snd_opl4_write_memory); -EXPORT_SYMBOL(snd_opl4_read_memory); EXPORT_SYMBOL(snd_opl4_create); static int __init alsa_opl4_init(void) diff --git a/sound/drivers/opl4/opl4_seq.c b/sound/drivers/opl4/opl4_seq.c index dc0dcdc6c..43d8a2bdd 100644 --- a/sound/drivers/opl4/opl4_seq.c +++ b/sound/drivers/opl4/opl4_seq.c @@ -164,7 +164,9 @@ static int snd_opl4_seq_new_device(struct snd_seq_device *dev) SNDRV_SEQ_PORT_CAP_WRITE | SNDRV_SEQ_PORT_CAP_SUBS_WRITE, SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC | - SNDRV_SEQ_PORT_TYPE_MIDI_GM, + SNDRV_SEQ_PORT_TYPE_MIDI_GM | + SNDRV_SEQ_PORT_TYPE_HARDWARE | + SNDRV_SEQ_PORT_TYPE_SYNTHESIZER, 16, 24, "OPL4 Wavetable Port"); if (opl4->chset->port < 0) { diff --git a/sound/drivers/serial-u16550.c b/sound/drivers/serial-u16550.c index c01b4c511..52afb4bd2 100644 --- a/sound/drivers/serial-u16550.c +++ b/sound/drivers/serial-u16550.c @@ -795,7 +795,7 @@ static int __init snd_uart16550_create(struct snd_card *card, if (irq >= 0 && irq != SNDRV_AUTO_IRQ) { if (request_irq(irq, snd_uart16550_interrupt, - SA_INTERRUPT, "Serial MIDI", (void *) uart)) { + IRQF_DISABLED, "Serial MIDI", (void *) uart)) { snd_printk("irq %d busy. Using Polling.\n", irq); } else { uart->irq = irq; @@ -998,6 +998,10 @@ static int __init alsa_card_serial_init(void) i, NULL, 0); if (IS_ERR(device)) continue; + if (!platform_get_drvdata(device)) { + platform_device_unregister(device); + continue; + } devices[i] = device; cards++; } diff --git a/sound/drivers/virmidi.c b/sound/drivers/virmidi.c index 26eb2499d..59171f820 100644 --- a/sound/drivers/virmidi.c +++ b/sound/drivers/virmidi.c @@ -171,6 +171,10 @@ static int __init alsa_card_virmidi_init(void) i, NULL, 0); if (IS_ERR(device)) continue; + if (!platform_get_drvdata(device)) { + platform_device_unregister(device); + continue; + } devices[i] = device; cards++; } diff --git a/sound/drivers/vx/vx_core.c b/sound/drivers/vx/vx_core.c index fa4a2b5c2..a60168268 100644 --- a/sound/drivers/vx/vx_core.c +++ b/sound/drivers/vx/vx_core.c @@ -70,6 +70,8 @@ int snd_vx_check_reg_bit(struct vx_core *chip, int reg, int mask, int bit, int t return -EIO; } +EXPORT_SYMBOL(snd_vx_check_reg_bit); + /* * vx_send_irq_dsp - set command irq bit * @num: the requested IRQ type, IRQ_XXX @@ -465,6 +467,8 @@ int snd_vx_load_boot_image(struct vx_core *chip, const struct firmware *boot) return 0; } +EXPORT_SYMBOL(snd_vx_load_boot_image); + /* * vx_test_irq_src - query the source of interrupts * @@ -545,6 +549,7 @@ irqreturn_t snd_vx_irq_handler(int irq, void *dev, struct pt_regs *regs) return IRQ_HANDLED; } +EXPORT_SYMBOL(snd_vx_irq_handler); /* */ @@ -635,7 +640,7 @@ static void vx_proc_init(struct vx_core *chip) struct snd_info_entry *entry; if (! snd_card_proc_new(chip->card, "vx-status", &entry)) - snd_info_set_text_ops(entry, chip, 1024, vx_proc_read); + snd_info_set_text_ops(entry, chip, vx_proc_read); } @@ -657,6 +662,8 @@ int snd_vx_dsp_boot(struct vx_core *chip, const struct firmware *boot) return 0; } +EXPORT_SYMBOL(snd_vx_dsp_boot); + /** * snd_vx_dsp_load - load the DSP image */ @@ -705,6 +712,8 @@ int snd_vx_dsp_load(struct vx_core *chip, const struct firmware *dsp) return 0; } +EXPORT_SYMBOL(snd_vx_dsp_load); + #ifdef CONFIG_PM /* * suspend @@ -721,6 +730,8 @@ int snd_vx_suspend(struct vx_core *chip, pm_message_t state) return 0; } +EXPORT_SYMBOL(snd_vx_suspend); + /* * resume */ @@ -747,6 +758,7 @@ int snd_vx_resume(struct vx_core *chip) return 0; } +EXPORT_SYMBOL(snd_vx_resume); #endif /** @@ -790,6 +802,8 @@ struct vx_core *snd_vx_create(struct snd_card *card, struct snd_vx_hardware *hw, return chip; } +EXPORT_SYMBOL(snd_vx_create); + /* * module entries */ @@ -804,19 +818,3 @@ static void __exit alsa_vx_core_exit(void) module_init(alsa_vx_core_init) module_exit(alsa_vx_core_exit) - -/* - * exports - */ -EXPORT_SYMBOL(snd_vx_check_reg_bit); -EXPORT_SYMBOL(snd_vx_create); -EXPORT_SYMBOL(snd_vx_setup_firmware); -EXPORT_SYMBOL(snd_vx_free_firmware); -EXPORT_SYMBOL(snd_vx_irq_handler); -EXPORT_SYMBOL(snd_vx_dsp_boot); -EXPORT_SYMBOL(snd_vx_dsp_load); -EXPORT_SYMBOL(snd_vx_load_boot_image); -#ifdef CONFIG_PM -EXPORT_SYMBOL(snd_vx_suspend); -EXPORT_SYMBOL(snd_vx_resume); -#endif diff --git a/sound/drivers/vx/vx_hwdep.c b/sound/drivers/vx/vx_hwdep.c index d837783fb..e1920af45 100644 --- a/sound/drivers/vx/vx_hwdep.c +++ b/sound/drivers/vx/vx_hwdep.c @@ -250,3 +250,6 @@ void snd_vx_free_firmware(struct vx_core *chip) } #endif /* SND_VX_FW_LOADER */ + +EXPORT_SYMBOL(snd_vx_setup_firmware); +EXPORT_SYMBOL(snd_vx_free_firmware); diff --git a/sound/drivers/vx/vx_pcm.c b/sound/drivers/vx/vx_pcm.c index c4af84995..7e65a103f 100644 --- a/sound/drivers/vx/vx_pcm.c +++ b/sound/drivers/vx/vx_pcm.c @@ -1252,18 +1252,15 @@ static int vx_init_audio_io(struct vx_core *chip) chip->audio_info = rmh.Stat[1]; /* allocate pipes */ - chip->playback_pipes = kmalloc(sizeof(struct vx_pipe *) * chip->audio_outs, GFP_KERNEL); + chip->playback_pipes = kcalloc(chip->audio_outs, sizeof(struct vx_pipe *), GFP_KERNEL); if (!chip->playback_pipes) return -ENOMEM; - chip->capture_pipes = kmalloc(sizeof(struct vx_pipe *) * chip->audio_ins, GFP_KERNEL); + chip->capture_pipes = kcalloc(chip->audio_ins, sizeof(struct vx_pipe *), GFP_KERNEL); if (!chip->capture_pipes) { kfree(chip->playback_pipes); return -ENOMEM; } - memset(chip->playback_pipes, 0, sizeof(struct vx_pipe *) * chip->audio_outs); - memset(chip->capture_pipes, 0, sizeof(struct vx_pipe *) * chip->audio_ins); - preferred = chip->ibl.size; chip->ibl.size = 0; vx_set_ibl(chip, &chip->ibl); /* query the info */ diff --git a/sound/i2c/cs8427.c b/sound/i2c/cs8427.c index cb89f7eb9..64388cb8d 100644 --- a/sound/i2c/cs8427.c +++ b/sound/i2c/cs8427.c @@ -76,23 +76,28 @@ int snd_cs8427_reg_write(struct snd_i2c_device *device, unsigned char reg, buf[0] = reg & 0x7f; buf[1] = val; if ((err = snd_i2c_sendbytes(device, buf, 2)) != 2) { - snd_printk(KERN_ERR "unable to send bytes 0x%02x:0x%02x to CS8427 (%i)\n", buf[0], buf[1], err); + snd_printk(KERN_ERR "unable to send bytes 0x%02x:0x%02x " + "to CS8427 (%i)\n", buf[0], buf[1], err); return err < 0 ? err : -EIO; } return 0; } +EXPORT_SYMBOL(snd_cs8427_reg_write); + static int snd_cs8427_reg_read(struct snd_i2c_device *device, unsigned char reg) { int err; unsigned char buf; if ((err = snd_i2c_sendbytes(device, ®, 1)) != 1) { - snd_printk(KERN_ERR "unable to send register 0x%x byte to CS8427\n", reg); + snd_printk(KERN_ERR "unable to send register 0x%x byte " + "to CS8427\n", reg); return err < 0 ? err : -EIO; } if ((err = snd_i2c_readbytes(device, &buf, 1)) != 1) { - snd_printk(KERN_ERR "unable to read register 0x%x byte from CS8427\n", reg); + snd_printk(KERN_ERR "unable to read register 0x%x byte " + "from CS8427\n", reg); return err < 0 ? err : -EIO; } return buf; @@ -121,7 +126,8 @@ static int snd_cs8427_send_corudata(struct snd_i2c_device *device, int count) { struct cs8427 *chip = device->private_data; - char *hw_data = udata ? chip->playback.hw_udata : chip->playback.hw_status; + char *hw_data = udata ? + chip->playback.hw_udata : chip->playback.hw_status; char data[32]; int err, idx; @@ -134,11 +140,11 @@ static int snd_cs8427_send_corudata(struct snd_i2c_device *device, memset(data, 0, sizeof(data)); if (memcmp(hw_data, data, count) == 0) { chip->regmap[CS8427_REG_UDATABUF] &= ~CS8427_UBMMASK; - chip->regmap[CS8427_REG_UDATABUF] |= CS8427_UBMZEROS | CS8427_EFTUI; - if ((err = snd_cs8427_reg_write(device, CS8427_REG_UDATABUF, - chip->regmap[CS8427_REG_UDATABUF])) < 0) - return err; - return 0; + chip->regmap[CS8427_REG_UDATABUF] |= CS8427_UBMZEROS | + CS8427_EFTUI; + err = snd_cs8427_reg_write(device, CS8427_REG_UDATABUF, + chip->regmap[CS8427_REG_UDATABUF]); + return err < 0 ? err : 0; } } data[0] = CS8427_REG_AUTOINC | CS8427_REG_CORU_DATABUF; @@ -161,24 +167,32 @@ int snd_cs8427_create(struct snd_i2c_bus *bus, { static unsigned char initvals1[] = { CS8427_REG_CONTROL1 | CS8427_REG_AUTOINC, - /* CS8427_REG_CONTROL1: RMCK to OMCK, valid PCM audio, disable mutes, TCBL=output */ + /* CS8427_REG_CONTROL1: RMCK to OMCK, valid PCM audio, disable mutes, + TCBL=output */ CS8427_SWCLK | CS8427_TCBLDIR, - /* CS8427_REG_CONTROL2: hold last valid audio sample, RMCK=256*Fs, normal stereo operation */ + /* CS8427_REG_CONTROL2: hold last valid audio sample, RMCK=256*Fs, + normal stereo operation */ 0x00, - /* CS8427_REG_DATAFLOW: output drivers normal operation, Tx<=serial, Rx=>serial */ + /* CS8427_REG_DATAFLOW: output drivers normal operation, Tx<=serial, + Rx=>serial */ CS8427_TXDSERIAL | CS8427_SPDAES3RECEIVER, - /* CS8427_REG_CLOCKSOURCE: Run off, CMCK=256*Fs, output time base = OMCK, input time base = - recovered input clock, recovered input clock source is ILRCK changed to AES3INPUT (workaround, see snd_cs8427_reset) */ + /* CS8427_REG_CLOCKSOURCE: Run off, CMCK=256*Fs, + output time base = OMCK, input time base = recovered input clock, + recovered input clock source is ILRCK changed to AES3INPUT + (workaround, see snd_cs8427_reset) */ CS8427_RXDILRCK, - /* CS8427_REG_SERIALINPUT: Serial audio input port data format = I2S, 24-bit, 64*Fsi */ + /* CS8427_REG_SERIALINPUT: Serial audio input port data format = I2S, + 24-bit, 64*Fsi */ CS8427_SIDEL | CS8427_SILRPOL, - /* CS8427_REG_SERIALOUTPUT: Serial audio output port data format = I2S, 24-bit, 64*Fsi */ + /* CS8427_REG_SERIALOUTPUT: Serial audio output port data format + = I2S, 24-bit, 64*Fsi */ CS8427_SODEL | CS8427_SOLRPOL, }; static unsigned char initvals2[] = { CS8427_REG_RECVERRMASK | CS8427_REG_AUTOINC, - /* CS8427_REG_RECVERRMASK: unmask the input PLL clock, V, confidence, biphase, parity status bits */ - /* CS8427_UNLOCK | CS8427_V | CS8427_CONF | CS8427_BIP | CS8427_PAR, */ + /* CS8427_REG_RECVERRMASK: unmask the input PLL clock, V, confidence, + biphase, parity status bits */ + /* CS8427_UNLOCK | CS8427_V | CS8427_CONF | CS8427_BIP | CS8427_PAR,*/ 0xff, /* set everything */ /* CS8427_REG_CSDATABUF: Registers 32-55 window to CS buffer @@ -201,7 +215,8 @@ int snd_cs8427_create(struct snd_i2c_bus *bus, struct snd_i2c_device *device; unsigned char buf[24]; - if ((err = snd_i2c_device_create(bus, "CS8427", CS8427_ADDR | (addr & 7), + if ((err = snd_i2c_device_create(bus, "CS8427", + CS8427_ADDR | (addr & 7), &device)) < 0) return err; chip = device->private_data = kzalloc(sizeof(*chip), GFP_KERNEL); @@ -212,8 +227,8 @@ int snd_cs8427_create(struct snd_i2c_bus *bus, device->private_free = snd_cs8427_free; snd_i2c_lock(bus); - if ((err = snd_cs8427_reg_read(device, CS8427_REG_ID_AND_VER)) != - CS8427_VER8427A) { + err = snd_cs8427_reg_read(device, CS8427_REG_ID_AND_VER); + if (err != CS8427_VER8427A) { snd_i2c_unlock(bus); snd_printk(KERN_ERR "unable to find CS8427 signature " "(expected 0x%x, read 0x%x),\n", @@ -222,7 +237,8 @@ int snd_cs8427_create(struct snd_i2c_bus *bus, return -EFAULT; } /* turn off run bit while making changes to configuration */ - if ((err = snd_cs8427_reg_write(device, CS8427_REG_CLOCKSOURCE, 0x00)) < 0) + err = snd_cs8427_reg_write(device, CS8427_REG_CLOCKSOURCE, 0x00); + if (err < 0) goto __fail; /* send initial values */ memcpy(chip->regmap + (initvals1[0] & 0x7f), initvals1 + 1, 6); @@ -282,6 +298,8 @@ int snd_cs8427_create(struct snd_i2c_bus *bus, return err < 0 ? err : -EIO; } +EXPORT_SYMBOL(snd_cs8427_create); + /* * Reset the chip using run bit, also lock PLL using ILRCK and * put back AES3INPUT. This workaround is described in latest @@ -296,7 +314,8 @@ static void snd_cs8427_reset(struct snd_i2c_device *cs8427) snd_assert(cs8427, return); chip = cs8427->private_data; snd_i2c_lock(cs8427->bus); - if ((chip->regmap[CS8427_REG_CLOCKSOURCE] & CS8427_RXDAES3INPUT) == CS8427_RXDAES3INPUT) /* AES3 bit is set */ + if ((chip->regmap[CS8427_REG_CLOCKSOURCE] & CS8427_RXDAES3INPUT) == + CS8427_RXDAES3INPUT) /* AES3 bit is set */ aes3input = 1; chip->regmap[CS8427_REG_CLOCKSOURCE] &= ~(CS8427_RUN | CS8427_RXDMASK); snd_cs8427_reg_write(cs8427, CS8427_REG_CLOCKSOURCE, @@ -367,12 +386,15 @@ static int snd_cs8427_qsubcode_get(struct snd_kcontrol *kcontrol, snd_i2c_lock(device->bus); if ((err = snd_i2c_sendbytes(device, ®, 1)) != 1) { - snd_printk(KERN_ERR "unable to send register 0x%x byte to CS8427\n", reg); + snd_printk(KERN_ERR "unable to send register 0x%x byte " + "to CS8427\n", reg); snd_i2c_unlock(device->bus); return err < 0 ? err : -EIO; } - if ((err = snd_i2c_readbytes(device, ucontrol->value.bytes.data, 10)) != 10) { - snd_printk(KERN_ERR "unable to read Q-subcode bytes from CS8427\n"); + err = snd_i2c_readbytes(device, ucontrol->value.bytes.data, 10); + if (err != 10) { + snd_printk(KERN_ERR "unable to read Q-subcode bytes " + "from CS8427\n"); snd_i2c_unlock(device->bus); return err < 0 ? err : -EIO; } @@ -380,7 +402,8 @@ static int snd_cs8427_qsubcode_get(struct snd_kcontrol *kcontrol, return 0; } -static int snd_cs8427_spdif_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) +static int snd_cs8427_spdif_info(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) { uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958; uinfo->count = 1; @@ -413,7 +436,8 @@ static int snd_cs8427_spdif_put(struct snd_kcontrol *kcontrol, snd_i2c_lock(device->bus); change = memcmp(ucontrol->value.iec958.status, status, 24) != 0; memcpy(status, ucontrol->value.iec958.status, 24); - if (change && (kcontrol->private_value ? runtime != NULL : runtime == NULL)) { + if (change && (kcontrol->private_value ? + runtime != NULL : runtime == NULL)) { err = snd_cs8427_send_corudata(device, 0, status, 24); if (err < 0) change = err; @@ -442,7 +466,8 @@ static struct snd_kcontrol_new snd_cs8427_iec958_controls[] = { .iface = SNDRV_CTL_ELEM_IFACE_PCM, .info = snd_cs8427_in_status_info, .name = "IEC958 CS8427 Input Status", - .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, + .access = (SNDRV_CTL_ELEM_ACCESS_READ | + SNDRV_CTL_ELEM_ACCESS_VOLATILE), .get = snd_cs8427_in_status_get, .private_value = 15, }, @@ -450,7 +475,8 @@ static struct snd_kcontrol_new snd_cs8427_iec958_controls[] = { .iface = SNDRV_CTL_ELEM_IFACE_PCM, .info = snd_cs8427_in_status_info, .name = "IEC958 CS8427 Error Status", - .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, + .access = (SNDRV_CTL_ELEM_ACCESS_READ | + SNDRV_CTL_ELEM_ACCESS_VOLATILE), .get = snd_cs8427_in_status_get, .private_value = 16, }, @@ -470,7 +496,8 @@ static struct snd_kcontrol_new snd_cs8427_iec958_controls[] = { .private_value = 0 }, { - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE, + .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_INACTIVE), .iface = SNDRV_CTL_ELEM_IFACE_PCM, .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,PCM_STREAM), .info = snd_cs8427_spdif_info, @@ -482,7 +509,8 @@ static struct snd_kcontrol_new snd_cs8427_iec958_controls[] = { .iface = SNDRV_CTL_ELEM_IFACE_PCM, .info = snd_cs8427_qsubcode_info, .name = "IEC958 Q-subcode Capture Default", - .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, + .access = (SNDRV_CTL_ELEM_ACCESS_READ | + SNDRV_CTL_ELEM_ACCESS_VOLATILE), .get = snd_cs8427_qsubcode_get }}; @@ -505,7 +533,8 @@ int snd_cs8427_iec958_build(struct snd_i2c_device *cs8427, err = snd_ctl_add(cs8427->bus->card, kctl); if (err < 0) return err; - if (!strcmp(kctl->id.name, SNDRV_CTL_NAME_IEC958("",PLAYBACK,PCM_STREAM))) + if (! strcmp(kctl->id.name, + SNDRV_CTL_NAME_IEC958("",PLAYBACK,PCM_STREAM))) chip->playback.pcm_ctl = kctl; } @@ -515,6 +544,8 @@ int snd_cs8427_iec958_build(struct snd_i2c_device *cs8427, return 0; } +EXPORT_SYMBOL(snd_cs8427_iec958_build); + int snd_cs8427_iec958_active(struct snd_i2c_device *cs8427, int active) { struct cs8427 *chip; @@ -522,13 +553,17 @@ int snd_cs8427_iec958_active(struct snd_i2c_device *cs8427, int active) snd_assert(cs8427, return -ENXIO); chip = cs8427->private_data; if (active) - memcpy(chip->playback.pcm_status, chip->playback.def_status, 24); + memcpy(chip->playback.pcm_status, + chip->playback.def_status, 24); chip->playback.pcm_ctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE; - snd_ctl_notify(cs8427->bus->card, SNDRV_CTL_EVENT_MASK_VALUE | - SNDRV_CTL_EVENT_MASK_INFO, &chip->playback.pcm_ctl->id); + snd_ctl_notify(cs8427->bus->card, + SNDRV_CTL_EVENT_MASK_VALUE | SNDRV_CTL_EVENT_MASK_INFO, + &chip->playback.pcm_ctl->id); return 0; } +EXPORT_SYMBOL(snd_cs8427_iec958_active); + int snd_cs8427_iec958_pcm(struct snd_i2c_device *cs8427, unsigned int rate) { struct cs8427 *chip; @@ -568,6 +603,8 @@ int snd_cs8427_iec958_pcm(struct snd_i2c_device *cs8427, unsigned int rate) return err < 0 ? err : 0; } +EXPORT_SYMBOL(snd_cs8427_iec958_pcm); + static int __init alsa_cs8427_module_init(void) { return 0; @@ -579,10 +616,3 @@ static void __exit alsa_cs8427_module_exit(void) module_init(alsa_cs8427_module_init) module_exit(alsa_cs8427_module_exit) - -EXPORT_SYMBOL(snd_cs8427_create); -EXPORT_SYMBOL(snd_cs8427_reset); -EXPORT_SYMBOL(snd_cs8427_reg_write); -EXPORT_SYMBOL(snd_cs8427_iec958_build); -EXPORT_SYMBOL(snd_cs8427_iec958_active); -EXPORT_SYMBOL(snd_cs8427_iec958_pcm); diff --git a/sound/i2c/i2c.c b/sound/i2c/i2c.c index edfe76fb0..b60fb1892 100644 --- a/sound/i2c/i2c.c +++ b/sound/i2c/i2c.c @@ -106,6 +106,8 @@ int snd_i2c_bus_create(struct snd_card *card, const char *name, return 0; } +EXPORT_SYMBOL(snd_i2c_bus_create); + int snd_i2c_device_create(struct snd_i2c_bus *bus, const char *name, unsigned char addr, struct snd_i2c_device **rdevice) { @@ -124,6 +126,8 @@ int snd_i2c_device_create(struct snd_i2c_bus *bus, const char *name, return 0; } +EXPORT_SYMBOL(snd_i2c_device_create); + int snd_i2c_device_free(struct snd_i2c_device *device) { if (device->bus) @@ -134,22 +138,29 @@ int snd_i2c_device_free(struct snd_i2c_device *device) return 0; } +EXPORT_SYMBOL(snd_i2c_device_free); + int snd_i2c_sendbytes(struct snd_i2c_device *device, unsigned char *bytes, int count) { return device->bus->ops->sendbytes(device, bytes, count); } +EXPORT_SYMBOL(snd_i2c_sendbytes); int snd_i2c_readbytes(struct snd_i2c_device *device, unsigned char *bytes, int count) { return device->bus->ops->readbytes(device, bytes, count); } +EXPORT_SYMBOL(snd_i2c_readbytes); + int snd_i2c_probeaddr(struct snd_i2c_bus *bus, unsigned short addr) { return bus->ops->probeaddr(bus, addr); } +EXPORT_SYMBOL(snd_i2c_probeaddr); + /* * bit-operations */ @@ -320,12 +331,6 @@ static int snd_i2c_bit_probeaddr(struct snd_i2c_bus *bus, unsigned short addr) return err; } -EXPORT_SYMBOL(snd_i2c_bus_create); -EXPORT_SYMBOL(snd_i2c_device_create); -EXPORT_SYMBOL(snd_i2c_device_free); -EXPORT_SYMBOL(snd_i2c_sendbytes); -EXPORT_SYMBOL(snd_i2c_readbytes); -EXPORT_SYMBOL(snd_i2c_probeaddr); static int __init alsa_i2c_init(void) { diff --git a/sound/i2c/l3/uda1341.c b/sound/i2c/l3/uda1341.c index 746500e06..b074fddde 100644 --- a/sound/i2c/l3/uda1341.c +++ b/sound/i2c/l3/uda1341.c @@ -517,9 +517,9 @@ static void __devinit snd_uda1341_proc_init(struct snd_card *card, struct l3_cli struct snd_info_entry *entry; if (! snd_card_proc_new(card, "uda1341", &entry)) - snd_info_set_text_ops(entry, clnt, 1024, snd_uda1341_proc_read); + snd_info_set_text_ops(entry, clnt, snd_uda1341_proc_read); if (! snd_card_proc_new(card, "uda1341-regs", &entry)) - snd_info_set_text_ops(entry, clnt, 1024, snd_uda1341_proc_regs_read); + snd_info_set_text_ops(entry, clnt, snd_uda1341_proc_regs_read); } /* }}} */ diff --git a/sound/i2c/other/ak4xxx-adda.c b/sound/i2c/other/ak4xxx-adda.c index 045e32a31..dc7cc2001 100644 --- a/sound/i2c/other/ak4xxx-adda.c +++ b/sound/i2c/other/ak4xxx-adda.c @@ -34,7 +34,8 @@ MODULE_AUTHOR("Jaroslav Kysela , Takashi Iwai "); MODULE_DESCRIPTION("Routines for control of AK452x / AK43xx AD/DA converters"); MODULE_LICENSE("GPL"); -void snd_akm4xxx_write(struct snd_akm4xxx *ak, int chip, unsigned char reg, unsigned char val) +void snd_akm4xxx_write(struct snd_akm4xxx *ak, int chip, unsigned char reg, + unsigned char val) { ak->ops.lock(ak, chip); ak->ops.write(ak, chip, reg, val); @@ -52,6 +53,67 @@ void snd_akm4xxx_write(struct snd_akm4xxx *ak, int chip, unsigned char reg, unsi ak->ops.unlock(ak, chip); } +EXPORT_SYMBOL(snd_akm4xxx_write); + +/* reset procedure for AK4524 and AK4528 */ +static void ak4524_reset(struct snd_akm4xxx *ak, int state) +{ + unsigned int chip; + unsigned char reg, maxreg; + + if (ak->type == SND_AK4528) + maxreg = 0x06; + else + maxreg = 0x08; + for (chip = 0; chip < ak->num_dacs/2; chip++) { + snd_akm4xxx_write(ak, chip, 0x01, state ? 0x00 : 0x03); + if (state) + continue; + /* DAC volumes */ + for (reg = 0x04; reg < maxreg; reg++) + snd_akm4xxx_write(ak, chip, reg, + snd_akm4xxx_get(ak, chip, reg)); + if (ak->type == SND_AK4528) + continue; + /* IPGA */ + for (reg = 0x04; reg < 0x06; reg++) + snd_akm4xxx_write(ak, chip, reg, + snd_akm4xxx_get_ipga(ak, chip, reg)); + } +} + +/* reset procedure for AK4355 and AK4358 */ +static void ak4355_reset(struct snd_akm4xxx *ak, int state) +{ + unsigned char reg; + + if (state) { + snd_akm4xxx_write(ak, 0, 0x01, 0x02); /* reset and soft-mute */ + return; + } + for (reg = 0x00; reg < 0x0b; reg++) + if (reg != 0x01) + snd_akm4xxx_write(ak, 0, reg, + snd_akm4xxx_get(ak, 0, reg)); + snd_akm4xxx_write(ak, 0, 0x01, 0x01); /* un-reset, unmute */ +} + +/* reset procedure for AK4381 */ +static void ak4381_reset(struct snd_akm4xxx *ak, int state) +{ + unsigned int chip; + unsigned char reg; + + for (chip = 0; chip < ak->num_dacs/2; chip++) { + snd_akm4xxx_write(ak, chip, 0x00, state ? 0x0c : 0x0f); + if (state) + continue; + for (reg = 0x01; reg < 0x05; reg++) + snd_akm4xxx_write(ak, chip, reg, + snd_akm4xxx_get(ak, chip, reg)); + } +} + /* * reset the AKM codecs * @state: 1 = reset codec, 0 = restore the registers @@ -60,52 +122,26 @@ void snd_akm4xxx_write(struct snd_akm4xxx *ak, int chip, unsigned char reg, unsi */ void snd_akm4xxx_reset(struct snd_akm4xxx *ak, int state) { - unsigned int chip; - unsigned char reg; - switch (ak->type) { case SND_AK4524: case SND_AK4528: - for (chip = 0; chip < ak->num_dacs/2; chip++) { - snd_akm4xxx_write(ak, chip, 0x01, state ? 0x00 : 0x03); - if (state) - continue; - /* DAC volumes */ - for (reg = 0x04; reg < (ak->type == SND_AK4528 ? 0x06 : 0x08); reg++) - snd_akm4xxx_write(ak, chip, reg, snd_akm4xxx_get(ak, chip, reg)); - if (ak->type == SND_AK4528) - continue; - /* IPGA */ - for (reg = 0x04; reg < 0x06; reg++) - snd_akm4xxx_write(ak, chip, reg, snd_akm4xxx_get_ipga(ak, chip, reg)); - } + ak4524_reset(ak, state); break; case SND_AK4529: /* FIXME: needed for ak4529? */ break; case SND_AK4355: case SND_AK4358: - if (state) { - snd_akm4xxx_write(ak, 0, 0x01, 0x02); /* reset and soft-mute */ - return; - } - for (reg = 0x00; reg < 0x0b; reg++) - if (reg != 0x01) - snd_akm4xxx_write(ak, 0, reg, snd_akm4xxx_get(ak, 0, reg)); - snd_akm4xxx_write(ak, 0, 0x01, 0x01); /* un-reset, unmute */ + ak4355_reset(ak, state); break; case SND_AK4381: - for (chip = 0; chip < ak->num_dacs/2; chip++) { - snd_akm4xxx_write(ak, chip, 0x00, state ? 0x0c : 0x0f); - if (state) - continue; - for (reg = 0x01; reg < 0x05; reg++) - snd_akm4xxx_write(ak, chip, reg, snd_akm4xxx_get(ak, chip, reg)); - } + ak4381_reset(ak, state); break; } } +EXPORT_SYMBOL(snd_akm4xxx_reset); + /* * initialize all the ak4xxx chips */ @@ -153,7 +189,8 @@ void snd_akm4xxx_init(struct snd_akm4xxx *ak) }; static unsigned char inits_ak4355[] = { 0x01, 0x02, /* 1: reset and soft-mute */ - 0x00, 0x06, /* 0: mode3(i2s), disable auto-clock detect, disable DZF, sharp roll-off, RSTN#=0 */ + 0x00, 0x06, /* 0: mode3(i2s), disable auto-clock detect, + * disable DZF, sharp roll-off, RSTN#=0 */ 0x02, 0x0e, /* 2: DA's power up, normal speed, RSTN#=0 */ // 0x02, 0x2e, /* quad speed */ 0x03, 0x01, /* 3: de-emphasis off */ @@ -169,7 +206,8 @@ void snd_akm4xxx_init(struct snd_akm4xxx *ak) }; static unsigned char inits_ak4358[] = { 0x01, 0x02, /* 1: reset and soft-mute */ - 0x00, 0x06, /* 0: mode3(i2s), disable auto-clock detect, disable DZF, sharp roll-off, RSTN#=0 */ + 0x00, 0x06, /* 0: mode3(i2s), disable auto-clock detect, + * disable DZF, sharp roll-off, RSTN#=0 */ 0x02, 0x0e, /* 2: DA's power up, normal speed, RSTN#=0 */ // 0x02, 0x2e, /* quad speed */ 0x03, 0x01, /* 3: de-emphasis off */ @@ -187,7 +225,8 @@ void snd_akm4xxx_init(struct snd_akm4xxx *ak) }; static unsigned char inits_ak4381[] = { 0x00, 0x0c, /* 0: mode3(i2s), disable auto-clock detect */ - 0x01, 0x02, /* 1: de-emphasis off, normal speed, sharp roll-off, DZF off */ + 0x01, 0x02, /* 1: de-emphasis off, normal speed, + * sharp roll-off, DZF off */ // 0x01, 0x12, /* quad speed */ 0x02, 0x00, /* 2: DZF disabled */ 0x03, 0x00, /* 3: LATT 0 */ @@ -239,12 +278,15 @@ void snd_akm4xxx_init(struct snd_akm4xxx *ak) } } +EXPORT_SYMBOL(snd_akm4xxx_init); + #define AK_GET_CHIP(val) (((val) >> 8) & 0xff) #define AK_GET_ADDR(val) ((val) & 0xff) #define AK_GET_SHIFT(val) (((val) >> 16) & 0x7f) #define AK_GET_INVERT(val) (((val) >> 23) & 1) #define AK_GET_MASK(val) (((val) >> 24) & 0xff) -#define AK_COMPOSE(chip,addr,shift,mask) (((chip) << 8) | (addr) | ((shift) << 16) | ((mask) << 24)) +#define AK_COMPOSE(chip,addr,shift,mask) \ + (((chip) << 8) | (addr) | ((shift) << 16) | ((mask) << 24)) #define AK_INVERT (1<<23) static int snd_akm4xxx_volume_info(struct snd_kcontrol *kcontrol, @@ -292,6 +334,64 @@ static int snd_akm4xxx_volume_put(struct snd_kcontrol *kcontrol, return change; } +static int snd_akm4xxx_stereo_volume_info(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) +{ + unsigned int mask = AK_GET_MASK(kcontrol->private_value); + + uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; + uinfo->count = 2; + uinfo->value.integer.min = 0; + uinfo->value.integer.max = mask; + return 0; +} + +static int snd_akm4xxx_stereo_volume_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol); + int chip = AK_GET_CHIP(kcontrol->private_value); + int addr = AK_GET_ADDR(kcontrol->private_value); + int invert = AK_GET_INVERT(kcontrol->private_value); + unsigned int mask = AK_GET_MASK(kcontrol->private_value); + unsigned char val = snd_akm4xxx_get(ak, chip, addr); + + ucontrol->value.integer.value[0] = invert ? mask - val : val; + + val = snd_akm4xxx_get(ak, chip, addr+1); + ucontrol->value.integer.value[1] = invert ? mask - val : val; + + return 0; +} + +static int snd_akm4xxx_stereo_volume_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol); + int chip = AK_GET_CHIP(kcontrol->private_value); + int addr = AK_GET_ADDR(kcontrol->private_value); + int invert = AK_GET_INVERT(kcontrol->private_value); + unsigned int mask = AK_GET_MASK(kcontrol->private_value); + unsigned char nval = ucontrol->value.integer.value[0] % (mask+1); + int change0, change1; + + if (invert) + nval = mask - nval; + change0 = snd_akm4xxx_get(ak, chip, addr) != nval; + if (change0) + snd_akm4xxx_write(ak, chip, addr, nval); + + nval = ucontrol->value.integer.value[1] % (mask+1); + if (invert) + nval = mask - nval; + change1 = snd_akm4xxx_get(ak, chip, addr+1) != nval; + if (change1) + snd_akm4xxx_write(ak, chip, addr+1, nval); + + + return change0 || change1; +} + static int snd_akm4xxx_ipga_gain_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) { @@ -308,7 +408,8 @@ static int snd_akm4xxx_ipga_gain_get(struct snd_kcontrol *kcontrol, struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol); int chip = AK_GET_CHIP(kcontrol->private_value); int addr = AK_GET_ADDR(kcontrol->private_value); - ucontrol->value.integer.value[0] = snd_akm4xxx_get_ipga(ak, chip, addr) & 0x7f; + ucontrol->value.integer.value[0] = + snd_akm4xxx_get_ipga(ak, chip, addr) & 0x7f; return 0; } @@ -336,7 +437,8 @@ static int snd_akm4xxx_deemphasis_info(struct snd_kcontrol *kcontrol, uinfo->value.enumerated.items = 4; if (uinfo->value.enumerated.item >= 4) uinfo->value.enumerated.item = 3; - strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]); + strcpy(uinfo->value.enumerated.name, + texts[uinfo->value.enumerated.item]); return 0; } @@ -347,7 +449,8 @@ static int snd_akm4xxx_deemphasis_get(struct snd_kcontrol *kcontrol, int chip = AK_GET_CHIP(kcontrol->private_value); int addr = AK_GET_ADDR(kcontrol->private_value); int shift = AK_GET_SHIFT(kcontrol->private_value); - ucontrol->value.enumerated.item[0] = (snd_akm4xxx_get(ak, chip, addr) >> shift) & 3; + ucontrol->value.enumerated.item[0] = + (snd_akm4xxx_get(ak, chip, addr) >> shift) & 3; return 0; } @@ -361,7 +464,8 @@ static int snd_akm4xxx_deemphasis_put(struct snd_kcontrol *kcontrol, unsigned char nval = ucontrol->value.enumerated.item[0] & 3; int change; - nval = (nval << shift) | (snd_akm4xxx_get(ak, chip, addr) & ~(3 << shift)); + nval = (nval << shift) | + (snd_akm4xxx_get(ak, chip, addr) & ~(3 << shift)); change = snd_akm4xxx_get(ak, chip, addr) != nval; if (change) snd_akm4xxx_write(ak, chip, addr, nval); @@ -377,51 +481,86 @@ int snd_akm4xxx_build_controls(struct snd_akm4xxx *ak) unsigned int idx, num_emphs; struct snd_kcontrol *ctl; int err; + int mixer_ch = 0; + int num_stereo; ctl = kmalloc(sizeof(*ctl), GFP_KERNEL); if (! ctl) return -ENOMEM; - for (idx = 0; idx < ak->num_dacs; ++idx) { + for (idx = 0; idx < ak->num_dacs; ) { memset(ctl, 0, sizeof(*ctl)); - strcpy(ctl->id.name, "DAC Volume"); - ctl->id.index = idx + ak->idx_offset * 2; + if (ak->channel_names == NULL) { + strcpy(ctl->id.name, "DAC Volume"); + num_stereo = 1; + ctl->id.index = mixer_ch + ak->idx_offset * 2; + } else { + strcpy(ctl->id.name, ak->channel_names[mixer_ch]); + num_stereo = ak->num_stereo[mixer_ch]; + ctl->id.index = 0; + } ctl->id.iface = SNDRV_CTL_ELEM_IFACE_MIXER; ctl->count = 1; - ctl->info = snd_akm4xxx_volume_info; - ctl->get = snd_akm4xxx_volume_get; - ctl->put = snd_akm4xxx_volume_put; + if (num_stereo == 2) { + ctl->info = snd_akm4xxx_stereo_volume_info; + ctl->get = snd_akm4xxx_stereo_volume_get; + ctl->put = snd_akm4xxx_stereo_volume_put; + } else { + ctl->info = snd_akm4xxx_volume_info; + ctl->get = snd_akm4xxx_volume_get; + ctl->put = snd_akm4xxx_volume_put; + } switch (ak->type) { case SND_AK4524: - ctl->private_value = AK_COMPOSE(idx/2, (idx%2) + 6, 0, 127); /* register 6 & 7 */ + /* register 6 & 7 */ + ctl->private_value = + AK_COMPOSE(idx/2, (idx%2) + 6, 0, 127); break; case SND_AK4528: - ctl->private_value = AK_COMPOSE(idx/2, (idx%2) + 4, 0, 127); /* register 4 & 5 */ + /* register 4 & 5 */ + ctl->private_value = + AK_COMPOSE(idx/2, (idx%2) + 4, 0, 127); break; case SND_AK4529: { - int val = idx < 6 ? idx + 2 : (idx - 6) + 0xb; /* registers 2-7 and b,c */ - ctl->private_value = AK_COMPOSE(0, val, 0, 255) | AK_INVERT; + /* registers 2-7 and b,c */ + int val = idx < 6 ? idx + 2 : (idx - 6) + 0xb; + ctl->private_value = + AK_COMPOSE(0, val, 0, 255) | AK_INVERT; break; } case SND_AK4355: - ctl->private_value = AK_COMPOSE(0, idx + 4, 0, 255); /* register 4-9, chip #0 only */ + /* register 4-9, chip #0 only */ + ctl->private_value = AK_COMPOSE(0, idx + 4, 0, 255); break; case SND_AK4358: if (idx >= 6) - ctl->private_value = AK_COMPOSE(0, idx + 5, 0, 255); /* register 4-9, chip #0 only */ + /* register 4-9, chip #0 only */ + ctl->private_value = + AK_COMPOSE(0, idx + 5, 0, 255); else - ctl->private_value = AK_COMPOSE(0, idx + 4, 0, 255); /* register 4-9, chip #0 only */ + /* register 4-9, chip #0 only */ + ctl->private_value = + AK_COMPOSE(0, idx + 4, 0, 255); break; case SND_AK4381: - ctl->private_value = AK_COMPOSE(idx/2, (idx%2) + 3, 0, 255); /* register 3 & 4 */ + /* register 3 & 4 */ + ctl->private_value = + AK_COMPOSE(idx/2, (idx%2) + 3, 0, 255); break; default: err = -EINVAL; goto __error; } + ctl->private_data = ak; - if ((err = snd_ctl_add(ak->card, snd_ctl_new(ctl, SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE))) < 0) + err = snd_ctl_add(ak->card, + snd_ctl_new(ctl, SNDRV_CTL_ELEM_ACCESS_READ| + SNDRV_CTL_ELEM_ACCESS_WRITE)); + if (err < 0) goto __error; + + idx += num_stereo; + mixer_ch++; } for (idx = 0; idx < ak->num_adcs && ak->type == SND_AK4524; ++idx) { memset(ctl, 0, sizeof(*ctl)); @@ -432,9 +571,14 @@ int snd_akm4xxx_build_controls(struct snd_akm4xxx *ak) ctl->info = snd_akm4xxx_volume_info; ctl->get = snd_akm4xxx_volume_get; ctl->put = snd_akm4xxx_volume_put; - ctl->private_value = AK_COMPOSE(idx/2, (idx%2) + 4, 0, 127); /* register 4 & 5 */ + /* register 4 & 5 */ + ctl->private_value = + AK_COMPOSE(idx/2, (idx%2) + 4, 0, 127); ctl->private_data = ak; - if ((err = snd_ctl_add(ak->card, snd_ctl_new(ctl, SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE))) < 0) + err = snd_ctl_add(ak->card, + snd_ctl_new(ctl, SNDRV_CTL_ELEM_ACCESS_READ| + SNDRV_CTL_ELEM_ACCESS_WRITE)); + if (err < 0) goto __error; memset(ctl, 0, sizeof(*ctl)); @@ -445,9 +589,13 @@ int snd_akm4xxx_build_controls(struct snd_akm4xxx *ak) ctl->info = snd_akm4xxx_ipga_gain_info; ctl->get = snd_akm4xxx_ipga_gain_get; ctl->put = snd_akm4xxx_ipga_gain_put; - ctl->private_value = AK_COMPOSE(idx/2, (idx%2) + 4, 0, 0); /* register 4 & 5 */ + /* register 4 & 5 */ + ctl->private_value = AK_COMPOSE(idx/2, (idx%2) + 4, 0, 0); ctl->private_data = ak; - if ((err = snd_ctl_add(ak->card, snd_ctl_new(ctl, SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE))) < 0) + err = snd_ctl_add(ak->card, + snd_ctl_new(ctl, SNDRV_CTL_ELEM_ACCESS_READ| + SNDRV_CTL_ELEM_ACCESS_WRITE)); + if (err < 0) goto __error; } if (ak->type == SND_AK4355 || ak->type == SND_AK4358) @@ -466,11 +614,13 @@ int snd_akm4xxx_build_controls(struct snd_akm4xxx *ak) switch (ak->type) { case SND_AK4524: case SND_AK4528: - ctl->private_value = AK_COMPOSE(idx, 3, 0, 0); /* register 3 */ + /* register 3 */ + ctl->private_value = AK_COMPOSE(idx, 3, 0, 0); break; case SND_AK4529: { int shift = idx == 3 ? 6 : (2 - idx) * 2; - ctl->private_value = AK_COMPOSE(0, 8, shift, 0); /* register 8 with shift */ + /* register 8 with shift */ + ctl->private_value = AK_COMPOSE(0, 8, shift, 0); break; } case SND_AK4355: @@ -482,7 +632,10 @@ int snd_akm4xxx_build_controls(struct snd_akm4xxx *ak) break; } ctl->private_data = ak; - if ((err = snd_ctl_add(ak->card, snd_ctl_new(ctl, SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE))) < 0) + err = snd_ctl_add(ak->card, + snd_ctl_new(ctl, SNDRV_CTL_ELEM_ACCESS_READ| + SNDRV_CTL_ELEM_ACCESS_WRITE)); + if (err < 0) goto __error; } err = 0; @@ -492,6 +645,8 @@ int snd_akm4xxx_build_controls(struct snd_akm4xxx *ak) return err; } +EXPORT_SYMBOL(snd_akm4xxx_build_controls); + static int __init alsa_akm4xxx_module_init(void) { return 0; @@ -503,8 +658,3 @@ static void __exit alsa_akm4xxx_module_exit(void) module_init(alsa_akm4xxx_module_init) module_exit(alsa_akm4xxx_module_exit) - -EXPORT_SYMBOL(snd_akm4xxx_write); -EXPORT_SYMBOL(snd_akm4xxx_reset); -EXPORT_SYMBOL(snd_akm4xxx_init); -EXPORT_SYMBOL(snd_akm4xxx_build_controls); diff --git a/sound/isa/ad1816a/ad1816a.c b/sound/isa/ad1816a/ad1816a.c index 31f299aed..b33a5fb59 100644 --- a/sound/isa/ad1816a/ad1816a.c +++ b/sound/isa/ad1816a/ad1816a.c @@ -232,7 +232,7 @@ static int __devinit snd_card_ad1816a_probe(int dev, struct pnp_card_link *pcard if (mpu_port[dev] > 0) { if (snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401, - mpu_port[dev], 0, mpu_irq[dev], SA_INTERRUPT, + mpu_port[dev], 0, mpu_irq[dev], IRQF_DISABLED, NULL) < 0) printk(KERN_ERR PFX "no MPU-401 device at 0x%lx.\n", mpu_port[dev]); } diff --git a/sound/isa/ad1816a/ad1816a_lib.c b/sound/isa/ad1816a/ad1816a_lib.c index fd8fe16c0..8fcf2c151 100644 --- a/sound/isa/ad1816a/ad1816a_lib.c +++ b/sound/isa/ad1816a/ad1816a_lib.c @@ -599,7 +599,7 @@ int __devinit snd_ad1816a_create(struct snd_card *card, snd_ad1816a_free(chip); return -EBUSY; } - if (request_irq(irq, snd_ad1816a_interrupt, SA_INTERRUPT, "AD1816A", (void *) chip)) { + if (request_irq(irq, snd_ad1816a_interrupt, IRQF_DISABLED, "AD1816A", (void *) chip)) { snd_printk(KERN_ERR "ad1816a: can't grab IRQ %d\n", irq); snd_ad1816a_free(chip); return -EBUSY; diff --git a/sound/isa/ad1848/ad1848_lib.c b/sound/isa/ad1848/ad1848_lib.c index e0f8baa84..e711f87d5 100644 --- a/sound/isa/ad1848/ad1848_lib.c +++ b/sound/isa/ad1848/ad1848_lib.c @@ -902,7 +902,7 @@ int snd_ad1848_create(struct snd_card *card, snd_ad1848_free(chip); return -EBUSY; } - if (request_irq(irq, snd_ad1848_interrupt, SA_INTERRUPT, "AD1848", (void *) chip)) { + if (request_irq(irq, snd_ad1848_interrupt, IRQF_DISABLED, "AD1848", (void *) chip)) { snd_printk(KERN_ERR "ad1848: can't grab IRQ %d\n", irq); snd_ad1848_free(chip); return -EBUSY; diff --git a/sound/isa/als100.c b/sound/isa/als100.c index a52bd8a14..f2bcfb2cf 100644 --- a/sound/isa/als100.c +++ b/sound/isa/als100.c @@ -250,7 +250,7 @@ static int __devinit snd_card_als100_probe(int dev, if (mpu_port[dev] > 0 && mpu_port[dev] != SNDRV_AUTO_PORT) { if (snd_mpu401_uart_new(card, 0, MPU401_HW_ALS100, mpu_port[dev], 0, - mpu_irq[dev], SA_INTERRUPT, + mpu_irq[dev], IRQF_DISABLED, NULL) < 0) snd_printk(KERN_ERR PFX "no MPU-401 device at 0x%lx\n", mpu_port[dev]); } diff --git a/sound/isa/azt2320.c b/sound/isa/azt2320.c index 15e59283a..b615538a9 100644 --- a/sound/isa/azt2320.c +++ b/sound/isa/azt2320.c @@ -279,7 +279,7 @@ static int __devinit snd_card_azt2320_probe(int dev, if (mpu_port[dev] > 0 && mpu_port[dev] != SNDRV_AUTO_PORT) { if (snd_mpu401_uart_new(card, 0, MPU401_HW_AZT2320, mpu_port[dev], 0, - mpu_irq[dev], SA_INTERRUPT, + mpu_irq[dev], IRQF_DISABLED, NULL) < 0) snd_printk(KERN_ERR PFX "no MPU-401 device at 0x%lx\n", mpu_port[dev]); } diff --git a/sound/isa/cs423x/cs4231.c b/sound/isa/cs423x/cs4231.c index 397310f35..696a5c86b 100644 --- a/sound/isa/cs423x/cs4231.c +++ b/sound/isa/cs423x/cs4231.c @@ -122,7 +122,7 @@ static int __init snd_cs4231_probe(struct platform_device *pdev) if (snd_mpu401_uart_new(card, 0, MPU401_HW_CS4232, mpu_port[dev], 0, mpu_irq[dev], - mpu_irq[dev] >= 0 ? SA_INTERRUPT : 0, + mpu_irq[dev] >= 0 ? IRQF_DISABLED : 0, NULL) < 0) printk(KERN_WARNING "cs4231: MPU401 not detected\n"); } diff --git a/sound/isa/cs423x/cs4231_lib.c b/sound/isa/cs423x/cs4231_lib.c index 823db8246..fbb20176c 100644 --- a/sound/isa/cs423x/cs4231_lib.c +++ b/sound/isa/cs423x/cs4231_lib.c @@ -1454,7 +1454,7 @@ int snd_cs4231_create(struct snd_card *card, return -ENODEV; } chip->cport = cport; - if (!(hwshare & CS4231_HWSHARE_IRQ) && request_irq(irq, snd_cs4231_interrupt, SA_INTERRUPT, "CS4231", (void *) chip)) { + if (!(hwshare & CS4231_HWSHARE_IRQ) && request_irq(irq, snd_cs4231_interrupt, IRQF_DISABLED, "CS4231", (void *) chip)) { snd_printk(KERN_ERR "cs4231: can't grab IRQ %d\n", irq); snd_cs4231_free(chip); return -EBUSY; diff --git a/sound/isa/cs423x/cs4236.c b/sound/isa/cs423x/cs4236.c index f7fa77934..07ffd5c22 100644 --- a/sound/isa/cs423x/cs4236.c +++ b/sound/isa/cs423x/cs4236.c @@ -535,7 +535,7 @@ static int __devinit snd_cs423x_probe(struct snd_card *card, int dev) if (snd_mpu401_uart_new(card, 0, MPU401_HW_CS4232, mpu_port[dev], 0, mpu_irq[dev], - mpu_irq[dev] >= 0 ? SA_INTERRUPT : 0, NULL) < 0) + mpu_irq[dev] >= 0 ? IRQF_DISABLED : 0, NULL) < 0) printk(KERN_WARNING IDENT ": MPU401 not detected\n"); } diff --git a/sound/isa/dt019x.c b/sound/isa/dt019x.c index 0acb4e5da..c20a4b1b1 100644 --- a/sound/isa/dt019x.c +++ b/sound/isa/dt019x.c @@ -240,7 +240,7 @@ static int __devinit snd_card_dt019x_probe(int dev, struct pnp_card_link *pcard, MPU401_HW_MPU401, mpu_port[dev], 0, mpu_irq[dev], - mpu_irq[dev] >= 0 ? SA_INTERRUPT : 0, + mpu_irq[dev] >= 0 ? IRQF_DISABLED : 0, NULL) < 0) snd_printk(KERN_ERR PFX "no MPU-401 device at 0x%lx ?\n", mpu_port[dev]); } diff --git a/sound/isa/es1688/es1688.c b/sound/isa/es1688/es1688.c index e90689ee1..7f29f56e4 100644 --- a/sound/isa/es1688/es1688.c +++ b/sound/isa/es1688/es1688.c @@ -153,7 +153,7 @@ static int __init snd_es1688_probe(struct platform_device *pdev) if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_ES1688, chip->mpu_port, 0, xmpu_irq, - SA_INTERRUPT, + IRQF_DISABLED, NULL)) < 0) goto _err; } diff --git a/sound/isa/es1688/es1688_lib.c b/sound/isa/es1688/es1688_lib.c index 702ad51ee..7e985d3bc 100644 --- a/sound/isa/es1688/es1688_lib.c +++ b/sound/isa/es1688/es1688_lib.c @@ -659,7 +659,7 @@ int snd_es1688_create(struct snd_card *card, snd_es1688_free(chip); return -EBUSY; } - if (request_irq(irq, snd_es1688_interrupt, SA_INTERRUPT, "ES1688", (void *) chip)) { + if (request_irq(irq, snd_es1688_interrupt, IRQF_DISABLED, "ES1688", (void *) chip)) { snd_printk(KERN_ERR "es1688: can't grab IRQ %d\n", irq); snd_es1688_free(chip); return -EBUSY; diff --git a/sound/isa/es18xx.c b/sound/isa/es18xx.c index e6945db8e..34998de99 100644 --- a/sound/isa/es18xx.c +++ b/sound/isa/es18xx.c @@ -1837,7 +1837,7 @@ static int __devinit snd_es18xx_new_device(struct snd_card *card, return -EBUSY; } - if (request_irq(irq, snd_es18xx_interrupt, SA_INTERRUPT, "ES18xx", (void *) chip)) { + if (request_irq(irq, snd_es18xx_interrupt, IRQF_DISABLED, "ES18xx", (void *) chip)) { snd_es18xx_free(chip); snd_printk(KERN_ERR PFX "unable to grap IRQ %d\n", irq); return -EBUSY; @@ -2088,7 +2088,8 @@ static int __devinit snd_audiodrive_pnp(int dev, struct snd_audiodrive *acard, kfree(cfg); return -EAGAIN; } - snd_printdd("pnp: port=0x%lx\n", pnp_port_start(acard->devc, 0)); + snd_printdd("pnp: port=0x%llx\n", + (unsigned long long)pnp_port_start(acard->devc, 0)); /* PnP initialization */ pdev = acard->dev; pnp_init_resource_table(cfg); diff --git a/sound/isa/gus/gus_irq.c b/sound/isa/gus/gus_irq.c index c19ba2910..42db37552 100644 --- a/sound/isa/gus/gus_irq.c +++ b/sound/isa/gus/gus_irq.c @@ -136,7 +136,7 @@ void snd_gus_irq_profile_init(struct snd_gus_card *gus) struct snd_info_entry *entry; if (! snd_card_proc_new(gus->card, "gusirq", &entry)) - snd_info_set_text_ops(entry, gus, 1024, snd_gus_irq_info_read); + snd_info_set_text_ops(entry, gus, snd_gus_irq_info_read); } #endif diff --git a/sound/isa/gus/gus_main.c b/sound/isa/gus/gus_main.c index 53eeaf370..b680fddf0 100644 --- a/sound/isa/gus/gus_main.c +++ b/sound/isa/gus/gus_main.c @@ -179,7 +179,7 @@ int snd_gus_create(struct snd_card *card, snd_gus_free(gus); return -EBUSY; } - if (irq >= 0 && request_irq(irq, snd_gus_interrupt, SA_INTERRUPT, "GUS GF1", (void *) gus)) { + if (irq >= 0 && request_irq(irq, snd_gus_interrupt, IRQF_DISABLED, "GUS GF1", (void *) gus)) { snd_printk(KERN_ERR "gus: can't grab irq %d\n", irq); snd_gus_free(gus); return -EBUSY; diff --git a/sound/isa/gus/gus_mem.c b/sound/isa/gus/gus_mem.c index 3c0d27aa0..f50c276ca 100644 --- a/sound/isa/gus/gus_mem.c +++ b/sound/isa/gus/gus_mem.c @@ -264,10 +264,8 @@ int snd_gf1_mem_init(struct snd_gus_card * gus) if (snd_gf1_mem_xalloc(alloc, &block) == NULL) return -ENOMEM; #ifdef CONFIG_SND_DEBUG - if (! snd_card_proc_new(gus->card, "gusmem", &entry)) { - snd_info_set_text_ops(entry, gus, 1024, snd_gf1_mem_info_read); - entry->c.text.read_size = 256 * 1024; - } + if (! snd_card_proc_new(gus->card, "gusmem", &entry)) + snd_info_set_text_ops(entry, gus, snd_gf1_mem_info_read); #endif return 0; } diff --git a/sound/isa/gus/gus_synth.c b/sound/isa/gus/gus_synth.c index 2767cc187..3e4d4d6ed 100644 --- a/sound/isa/gus/gus_synth.c +++ b/sound/isa/gus/gus_synth.c @@ -194,7 +194,9 @@ static int snd_gus_synth_create_port(struct snd_gus_card * gus, int idx) &callbacks, SNDRV_SEQ_PORT_CAP_WRITE | SNDRV_SEQ_PORT_CAP_SUBS_WRITE, SNDRV_SEQ_PORT_TYPE_DIRECT_SAMPLE | - SNDRV_SEQ_PORT_TYPE_SYNTH, + SNDRV_SEQ_PORT_TYPE_SYNTH | + SNDRV_SEQ_PORT_TYPE_HARDWARE | + SNDRV_SEQ_PORT_TYPE_SYNTHESIZER, 16, 0, name); if (p->chset->port < 0) { diff --git a/sound/isa/gus/gusextreme.c b/sound/isa/gus/gusextreme.c index 05852fcc6..532c56e35 100644 --- a/sound/isa/gus/gusextreme.c +++ b/sound/isa/gus/gusextreme.c @@ -87,7 +87,7 @@ MODULE_PARM_DESC(channels, "GF1 channels for GUS Extreme driver."); module_param_array(pcm_channels, int, NULL, 0444); MODULE_PARM_DESC(pcm_channels, "Reserved PCM channels for GUS Extreme driver."); -struct platform_device *devices[SNDRV_CARDS]; +static struct platform_device *devices[SNDRV_CARDS]; #define PFX "gusextreme: " @@ -301,7 +301,7 @@ static int __init snd_gusextreme_probe(struct platform_device *pdev) (err = snd_mpu401_uart_new(card, 0, MPU401_HW_ES1688, es1688->mpu_port, 0, xmpu_irq, - SA_INTERRUPT, + IRQF_DISABLED, NULL)) < 0) goto out; diff --git a/sound/isa/gus/gusmax.c b/sound/isa/gus/gusmax.c index fcf2c8fe6..ac11cae85 100644 --- a/sound/isa/gus/gusmax.c +++ b/sound/isa/gus/gusmax.c @@ -292,7 +292,7 @@ static int __init snd_gusmax_probe(struct platform_device *pdev) goto _err; } - if (request_irq(xirq, snd_gusmax_interrupt, SA_INTERRUPT, "GUS MAX", (void *)maxcard)) { + if (request_irq(xirq, snd_gusmax_interrupt, IRQF_DISABLED, "GUS MAX", (void *)maxcard)) { snd_printk(KERN_ERR PFX "unable to grab IRQ %d\n", xirq); err = -EBUSY; goto _err; diff --git a/sound/isa/gus/interwave.c b/sound/isa/gus/interwave.c index 4298d339e..ea69f2550 100644 --- a/sound/isa/gus/interwave.c +++ b/sound/isa/gus/interwave.c @@ -70,9 +70,9 @@ static int dma1[SNDRV_CARDS] = SNDRV_DEFAULT_DMA; /* 0,1,3,5,6,7 */ static int dma2[SNDRV_CARDS] = SNDRV_DEFAULT_DMA; /* 0,1,3,5,6,7 */ static int joystick_dac[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 29}; /* 0 to 31, (0.59V-4.52V or 0.389V-2.98V) */ -static int midi[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; +static int midi[SNDRV_CARDS]; static int pcm_channels[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 2}; -static int effect[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; +static int effect[SNDRV_CARDS]; #ifdef SNDRV_STB #define PFX "interwave-stb: " @@ -611,10 +611,10 @@ static int __devinit snd_interwave_pnp(int dev, struct snd_interwave *iwcard, if (dma2[dev] >= 0) dma2[dev] = pnp_dma(pdev, 1); irq[dev] = pnp_irq(pdev, 0); - snd_printdd("isapnp IW: sb port=0x%lx, gf1 port=0x%lx, codec port=0x%lx\n", - pnp_port_start(pdev, 0), - pnp_port_start(pdev, 1), - pnp_port_start(pdev, 2)); + snd_printdd("isapnp IW: sb port=0x%llx, gf1 port=0x%llx, codec port=0x%llx\n", + (unsigned long long)pnp_port_start(pdev, 0), + (unsigned long long)pnp_port_start(pdev, 1), + (unsigned long long)pnp_port_start(pdev, 2)); snd_printdd("isapnp IW: dma1=%i, dma2=%i, irq=%i\n", dma1[dev], dma2[dev], irq[dev]); #ifdef SNDRV_STB /* Tone Control initialization */ @@ -706,7 +706,7 @@ static int __devinit snd_interwave_probe(struct snd_card *card, int dev) if ((err = snd_gus_initialize(gus)) < 0) return err; - if (request_irq(xirq, snd_interwave_interrupt, SA_INTERRUPT, + if (request_irq(xirq, snd_interwave_interrupt, IRQF_DISABLED, "InterWave", iwcard)) { snd_printk(KERN_ERR PFX "unable to grab IRQ %d\n", xirq); return -EBUSY; diff --git a/sound/isa/opl3sa2.c b/sound/isa/opl3sa2.c index 6d889052c..4031b61b7 100644 --- a/sound/isa/opl3sa2.c +++ b/sound/isa/opl3sa2.c @@ -59,7 +59,7 @@ static long midi_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;/* 0x330,0x300 */ static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ; /* 0,1,3,5,9,11,12,15 */ static int dma1[SNDRV_CARDS] = SNDRV_DEFAULT_DMA; /* 1,3,5,6,7 */ static int dma2[SNDRV_CARDS] = SNDRV_DEFAULT_DMA; /* 1,3,5,6,7 */ -static int opl3sa3_ymode[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 0 }; /* 0,1,2,3 */ /*SL Added*/ +static int opl3sa3_ymode[SNDRV_CARDS]; /* 0,1,2,3 */ /*SL Added*/ module_param_array(index, int, NULL, 0444); MODULE_PARM_DESC(index, "Index value for OPL3-SA soundcard."); @@ -221,7 +221,7 @@ static void snd_opl3sa2_write(struct snd_opl3sa2 *chip, unsigned char reg, unsig spin_unlock_irqrestore(&chip->reg_lock, flags); } -static int __init snd_opl3sa2_detect(struct snd_opl3sa2 *chip) +static int __devinit snd_opl3sa2_detect(struct snd_opl3sa2 *chip) { struct snd_card *card; unsigned long port; @@ -489,7 +489,7 @@ static void snd_opl3sa2_master_free(struct snd_kcontrol *kcontrol) chip->master_volume = NULL; } -static int __init snd_opl3sa2_mixer(struct snd_opl3sa2 *chip) +static int __devinit snd_opl3sa2_mixer(struct snd_opl3sa2 *chip) { struct snd_card *card = chip->card; struct snd_ctl_elem_id id1, id2; @@ -583,8 +583,8 @@ static int snd_opl3sa2_resume(struct snd_card *card) #endif /* CONFIG_PM */ #ifdef CONFIG_PNP -static int __init snd_opl3sa2_pnp(int dev, struct snd_opl3sa2 *chip, - struct pnp_dev *pdev) +static int __devinit snd_opl3sa2_pnp(int dev, struct snd_opl3sa2 *chip, + struct pnp_dev *pdev) { struct pnp_resource_table * cfg; int err; @@ -683,7 +683,7 @@ static int __devinit snd_opl3sa2_probe(struct snd_card *card, int dev) chip->single_dma = 1; if ((err = snd_opl3sa2_detect(chip)) < 0) return err; - if (request_irq(xirq, snd_opl3sa2_interrupt, SA_INTERRUPT, "OPL3-SA2", chip)) { + if (request_irq(xirq, snd_opl3sa2_interrupt, IRQF_DISABLED, "OPL3-SA2", chip)) { snd_printk(KERN_ERR PFX "can't grab IRQ %d\n", xirq); return -ENODEV; } @@ -862,7 +862,7 @@ static struct pnp_card_driver opl3sa2_pnpc_driver = { }; #endif /* CONFIG_PNP */ -static int __init snd_opl3sa2_nonpnp_probe(struct platform_device *pdev) +static int __devinit snd_opl3sa2_nonpnp_probe(struct platform_device *pdev) { struct snd_card *card; int err; diff --git a/sound/isa/opti9xx/miro.c b/sound/isa/opti9xx/miro.c index e6bfcf74c..1dd98375a 100644 --- a/sound/isa/opti9xx/miro.c +++ b/sound/isa/opti9xx/miro.c @@ -967,7 +967,7 @@ static void __init snd_miro_proc_init(struct snd_miro * miro) struct snd_info_entry *entry; if (! snd_card_proc_new(miro->card, "miro", &entry)) - snd_info_set_text_ops(entry, miro, 1024, snd_miro_proc_read); + snd_info_set_text_ops(entry, miro, snd_miro_proc_read); } /* @@ -1382,7 +1382,7 @@ static int __init snd_miro_probe(struct platform_device *devptr) rmidi = NULL; else if ((error = snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401, - miro->mpu_port, 0, miro->mpu_irq, SA_INTERRUPT, + miro->mpu_port, 0, miro->mpu_irq, IRQF_DISABLED, &rmidi))) snd_printk(KERN_WARNING "no MPU-401 device at 0x%lx?\n", miro->mpu_port); diff --git a/sound/isa/opti9xx/opti92x-ad1848.c b/sound/isa/opti9xx/opti92x-ad1848.c index 8ee0d7053..9d528ae00 100644 --- a/sound/isa/opti9xx/opti92x-ad1848.c +++ b/sound/isa/opti9xx/opti92x-ad1848.c @@ -1291,7 +1291,7 @@ static int snd_opti93x_create(struct snd_card *card, struct snd_opti9xx *chip, } codec->dma2 = chip->dma2; - if (request_irq(chip->irq, snd_opti93x_interrupt, SA_INTERRUPT, DRIVER_NAME" - WSS", codec)) { + if (request_irq(chip->irq, snd_opti93x_interrupt, IRQF_DISABLED, DRIVER_NAME" - WSS", codec)) { snd_printk(KERN_ERR "opti9xx: can't grab IRQ %d\n", chip->irq); snd_opti93x_free(codec); return -EBUSY; @@ -1863,7 +1863,7 @@ static int __init snd_opti9xx_probe(struct snd_card *card) rmidi = NULL; else if ((error = snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401, - chip->mpu_port, 0, chip->mpu_irq, SA_INTERRUPT, + chip->mpu_port, 0, chip->mpu_irq, IRQF_DISABLED, &rmidi))) snd_printk(KERN_WARNING "no MPU-401 device at 0x%lx?\n", chip->mpu_port); diff --git a/sound/isa/sb/emu8000.c b/sound/isa/sb/emu8000.c index c0b8d61b7..658179e86 100644 --- a/sound/isa/sb/emu8000.c +++ b/sound/isa/sb/emu8000.c @@ -131,7 +131,7 @@ snd_emu8000_dma_chan(struct snd_emu8000 *emu, int ch, int mode) /* */ -static void __init +static void __devinit snd_emu8000_read_wait(struct snd_emu8000 *emu) { while ((EMU8000_SMALR_READ(emu) & 0x80000000) != 0) { @@ -143,7 +143,7 @@ snd_emu8000_read_wait(struct snd_emu8000 *emu) /* */ -static void __init +static void __devinit snd_emu8000_write_wait(struct snd_emu8000 *emu) { while ((EMU8000_SMALW_READ(emu) & 0x80000000) != 0) { @@ -156,7 +156,7 @@ snd_emu8000_write_wait(struct snd_emu8000 *emu) /* * detect a card at the given port */ -static int __init +static int __devinit snd_emu8000_detect(struct snd_emu8000 *emu) { /* Initialise */ @@ -182,7 +182,7 @@ snd_emu8000_detect(struct snd_emu8000 *emu) /* * intiailize audio channels */ -static void __init +static void __devinit init_audio(struct snd_emu8000 *emu) { int ch; @@ -223,7 +223,7 @@ init_audio(struct snd_emu8000 *emu) /* * initialize DMA address */ -static void __init +static void __devinit init_dma(struct snd_emu8000 *emu) { EMU8000_SMALR_WRITE(emu, 0); @@ -327,7 +327,7 @@ static unsigned short init4[128] /*__devinitdata*/ = { * Taken from the oss driver, not obvious from the doc how this * is meant to work */ -static void __init +static void __devinit send_array(struct snd_emu8000 *emu, unsigned short *data, int size) { int i; @@ -349,7 +349,7 @@ send_array(struct snd_emu8000 *emu, unsigned short *data, int size) * Send initialization arrays to start up, this just follows the * initialisation sequence in the adip. */ -static void __init +static void __devinit init_arrays(struct snd_emu8000 *emu) { send_array(emu, init1, ARRAY_SIZE(init1)/4); @@ -375,7 +375,7 @@ init_arrays(struct snd_emu8000 *emu) * seems that the only way to do this is to use the one channel and keep * reallocating between read and write. */ -static void __init +static void __devinit size_dram(struct snd_emu8000 *emu) { int i, size; @@ -500,7 +500,7 @@ snd_emu8000_init_fm(struct snd_emu8000 *emu) /* * The main initialization routine. */ -static void __init +static void __devinit snd_emu8000_init_hw(struct snd_emu8000 *emu) { int i; @@ -1019,7 +1019,7 @@ static struct snd_kcontrol_new *mixer_defs[EMU8000_NUM_CONTROLS] = { /* * create and attach mixer elements for WaveTable treble/bass controls */ -static int __init +static int __devinit snd_emu8000_create_mixer(struct snd_card *card, struct snd_emu8000 *emu) { int i, err = 0; @@ -1069,7 +1069,7 @@ static int snd_emu8000_dev_free(struct snd_device *device) /* * initialize and register emu8000 synth device. */ -int __init +int __devinit snd_emu8000_new(struct snd_card *card, int index, long port, int seq_ports, struct snd_seq_device **awe_ret) { diff --git a/sound/isa/sb/emu8000_patch.c b/sound/isa/sb/emu8000_patch.c index 80b1cf84a..1be16c970 100644 --- a/sound/isa/sb/emu8000_patch.c +++ b/sound/isa/sb/emu8000_patch.c @@ -23,7 +23,7 @@ #include #include -static int emu8000_reset_addr = 0; +static int emu8000_reset_addr; module_param(emu8000_reset_addr, int, 0444); MODULE_PARM_DESC(emu8000_reset_addr, "reset write address at each time (makes slowdown)"); diff --git a/sound/isa/sb/sb16.c b/sound/isa/sb/sb16.c index 6333f900e..d64e67f2b 100644 --- a/sound/isa/sb/sb16.c +++ b/sound/isa/sb/sb16.c @@ -85,7 +85,7 @@ static int dma8[SNDRV_CARDS] = SNDRV_DEFAULT_DMA; /* 0,1,3 */ static int dma16[SNDRV_CARDS] = SNDRV_DEFAULT_DMA; /* 5,6,7 */ static int mic_agc[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1}; #ifdef CONFIG_SND_SB16_CSP -static int csp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; +static int csp[SNDRV_CARDS]; #endif #ifdef SNDRV_SBAWE_EMU8000 static int seq_ports[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 4}; @@ -327,7 +327,8 @@ static int __devinit snd_card_sb16_pnp(int dev, struct snd_card_sb16 *acard, goto __wt_error; } awe_port[dev] = pnp_port_start(pdev, 0); - snd_printdd("pnp SB16: wavetable port=0x%lx\n", pnp_port_start(pdev, 0)); + snd_printdd("pnp SB16: wavetable port=0x%llx\n", + (unsigned long long)pnp_port_start(pdev, 0)); } else { __wt_error: if (pdev) { diff --git a/sound/isa/sb/sb16_csp.c b/sound/isa/sb/sb16_csp.c index 9703c68e4..fcd638090 100644 --- a/sound/isa/sb/sb16_csp.c +++ b/sound/isa/sb/sb16_csp.c @@ -1101,7 +1101,7 @@ static int init_proc_entry(struct snd_sb_csp * p, int device) struct snd_info_entry *entry; sprintf(name, "cspD%d", device); if (! snd_card_proc_new(p->chip->card, name, &entry)) - snd_info_set_text_ops(entry, p, 1024, info_read); + snd_info_set_text_ops(entry, p, info_read); return 0; } diff --git a/sound/isa/sb/sb8_midi.c b/sound/isa/sb/sb8_midi.c index c549aceea..0b67edd7a 100644 --- a/sound/isa/sb/sb8_midi.c +++ b/sound/isa/sb/sb8_midi.c @@ -32,20 +32,22 @@ #include #include -/* - - */ -irqreturn_t snd_sb8dsp_midi_interrupt(struct snd_sb * chip) +irqreturn_t snd_sb8dsp_midi_interrupt(struct snd_sb *chip) { struct snd_rawmidi *rmidi; int max = 64; char byte; - if (chip == NULL || (rmidi = chip->rmidi) == NULL) { + if (!chip) + return IRQ_NONE; + + rmidi = chip->rmidi; + if (!rmidi) { inb(SBP(chip, DATA_AVAIL)); /* ack interrupt */ return IRQ_NONE; } + spin_lock(&chip->midi_input_lock); while (max-- > 0) { if (inb(SBP(chip, DATA_AVAIL)) & 0x80) { @@ -59,10 +61,6 @@ irqreturn_t snd_sb8dsp_midi_interrupt(struct snd_sb * chip) return IRQ_HANDLED; } -/* - - */ - static int snd_sb8dsp_midi_input_open(struct snd_rawmidi_substream *substream) { unsigned long flags; @@ -252,10 +250,6 @@ static void snd_sb8dsp_midi_output_trigger(struct snd_rawmidi_substream *substre snd_sb8dsp_midi_output_write(substream); } -/* - - */ - static struct snd_rawmidi_ops snd_sb8dsp_midi_output = { .open = snd_sb8dsp_midi_output_open, diff --git a/sound/isa/sb/sb_common.c b/sound/isa/sb/sb_common.c index f343a8211..f17de2bdd 100644 --- a/sound/isa/sb/sb_common.c +++ b/sound/isa/sb/sb_common.c @@ -232,7 +232,7 @@ int snd_sbdsp_create(struct snd_card *card, chip->port = port; if (request_irq(irq, irq_handler, hardware == SB_HW_ALS4000 ? - SA_INTERRUPT | SA_SHIRQ : SA_INTERRUPT, + IRQF_DISABLED | IRQF_SHARED : IRQF_DISABLED, "SoundBlaster", (void *) chip)) { snd_printk(KERN_ERR "sb: can't grab irq %d\n", irq); snd_sbdsp_free(chip); diff --git a/sound/isa/sgalaxy.c b/sound/isa/sgalaxy.c index 09c8e8c6b..8742fa517 100644 --- a/sound/isa/sgalaxy.c +++ b/sound/isa/sgalaxy.c @@ -147,7 +147,7 @@ static int __init snd_sgalaxy_setup_wss(unsigned long port, int irq, int dma) if (tmp < 0) return -EINVAL; - if (request_irq(irq, snd_sgalaxy_dummy_interrupt, SA_INTERRUPT, "sgalaxy", NULL)) { + if (request_irq(irq, snd_sgalaxy_dummy_interrupt, IRQF_DISABLED, "sgalaxy", NULL)) { snd_printk(KERN_ERR "sgalaxy: can't grab irq %d\n", irq); return -EIO; } diff --git a/sound/isa/sscape.c b/sound/isa/sscape.c index d2a856f0f..b1f25823c 100644 --- a/sound/isa/sscape.c +++ b/sound/isa/sscape.c @@ -897,11 +897,10 @@ static int __devinit create_mpu401(struct snd_card *card, int devnum, unsigned l struct snd_rawmidi *rawmidi; int err; -#define MPU401_SHARE_HARDWARE 1 if ((err = snd_mpu401_uart_new(card, devnum, MPU401_HW_MPU401, - port, MPU401_SHARE_HARDWARE, - irq, SA_INTERRUPT, + port, MPU401_INFO_INTEGRATED, + irq, IRQF_DISABLED, &rawmidi)) == 0) { struct snd_mpu401 *mpu = (struct snd_mpu401 *) rawmidi->private_data; mpu->open_input = mpu401_open; diff --git a/sound/isa/wavefront/wavefront.c b/sound/isa/wavefront/wavefront.c index 7ae86f82c..a8f8d2fa9 100644 --- a/sound/isa/wavefront/wavefront.c +++ b/sound/isa/wavefront/wavefront.c @@ -50,7 +50,7 @@ static int ics2115_irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ; /* 2,9,11,12,15 */ static long fm_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* PnP setup */ static int dma1[SNDRV_CARDS] = SNDRV_DEFAULT_DMA; /* 0,1,3,5,6,7 */ static int dma2[SNDRV_CARDS] = SNDRV_DEFAULT_DMA; /* 0,1,3,5,6,7 */ -static int use_cs4232_midi[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; +static int use_cs4232_midi[SNDRV_CARDS]; module_param_array(index, int, NULL, 0444); MODULE_PARM_DESC(index, "Index value for WaveFront soundcard."); @@ -467,7 +467,7 @@ snd_wavefront_probe (struct snd_card *card, int dev) return -EBUSY; } if (request_irq(ics2115_irq[dev], snd_wavefront_ics2115_interrupt, - SA_INTERRUPT, "ICS2115", acard)) { + IRQF_DISABLED, "ICS2115", acard)) { snd_printk(KERN_ERR "unable to use ICS2115 IRQ %d\n", ics2115_irq[dev]); return -EBUSY; } @@ -497,7 +497,7 @@ snd_wavefront_probe (struct snd_card *card, int dev) if ((err = snd_mpu401_uart_new(card, midi_dev, MPU401_HW_CS4232, cs4232_mpu_port[dev], 0, cs4232_mpu_irq[dev], - SA_INTERRUPT, + IRQF_DISABLED, NULL)) < 0) { snd_printk (KERN_ERR "can't allocate CS4232 MPU-401 device\n"); return err; diff --git a/sound/isa/wavefront/wavefront_fx.c b/sound/isa/wavefront/wavefront_fx.c index 180661c5f..4f0846feb 100644 --- a/sound/isa/wavefront/wavefront_fx.c +++ b/sound/isa/wavefront/wavefront_fx.c @@ -34,7 +34,7 @@ /* weird stuff, derived from port I/O tracing with dosemu */ -static unsigned char page_zero[] __initdata = { +static unsigned char page_zero[] __devinitdata = { 0x01, 0x7c, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf5, 0x00, 0x11, 0x00, 0x20, 0x00, 0x32, 0x00, 0x40, 0x00, 0x13, 0x00, 0x00, 0x00, 0x14, 0x02, 0x76, 0x00, 0x60, 0x00, 0x80, 0x02, 0x00, 0x00, @@ -61,7 +61,7 @@ static unsigned char page_zero[] __initdata = { 0x1d, 0x02, 0xdf }; -static unsigned char page_one[] __initdata = { +static unsigned char page_one[] __devinitdata = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x19, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xd8, 0x00, 0x00, 0x02, 0x20, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x01, @@ -88,7 +88,7 @@ static unsigned char page_one[] __initdata = { 0x60, 0x00, 0x1b }; -static unsigned char page_two[] __initdata = { +static unsigned char page_two[] __devinitdata = { 0xc4, 0x00, 0x44, 0x07, 0x44, 0x00, 0x40, 0x25, 0x01, 0x06, 0xc4, 0x07, 0x40, 0x25, 0x01, 0x00, 0x46, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -103,7 +103,7 @@ static unsigned char page_two[] __initdata = { 0x46, 0x05, 0x46, 0x07, 0x46, 0x07, 0x44 }; -static unsigned char page_three[] __initdata = { +static unsigned char page_three[] __devinitdata = { 0x07, 0x40, 0x00, 0x00, 0x00, 0x47, 0x00, 0x40, 0x00, 0x40, 0x06, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -118,7 +118,7 @@ static unsigned char page_three[] __initdata = { 0x02, 0x00, 0x42, 0x00, 0xc0, 0x00, 0x40 }; -static unsigned char page_four[] __initdata = { +static unsigned char page_four[] __devinitdata = { 0x63, 0x03, 0x26, 0x02, 0x2c, 0x00, 0x24, 0x00, 0x2e, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -133,7 +133,7 @@ static unsigned char page_four[] __initdata = { 0x02, 0x62, 0x02, 0x20, 0x01, 0x21, 0x01 }; -static unsigned char page_six[] __initdata = { +static unsigned char page_six[] __devinitdata = { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x10, 0x00, 0x00, 0x12, 0x00, 0x00, 0x14, 0x00, 0x00, @@ -154,7 +154,7 @@ static unsigned char page_six[] __initdata = { 0x80, 0x00, 0x7e, 0x80, 0x80 }; -static unsigned char page_seven[] __initdata = { +static unsigned char page_seven[] __devinitdata = { 0x0f, 0xff, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x0f, @@ -181,7 +181,7 @@ static unsigned char page_seven[] __initdata = { 0x00, 0x02, 0x00 }; -static unsigned char page_zero_v2[] __initdata = { +static unsigned char page_zero_v2[] __devinitdata = { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -193,7 +193,7 @@ static unsigned char page_zero_v2[] __initdata = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -static unsigned char page_one_v2[] __initdata = { +static unsigned char page_one_v2[] __devinitdata = { 0x01, 0xc0, 0x01, 0xfa, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -205,21 +205,21 @@ static unsigned char page_one_v2[] __initdata = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -static unsigned char page_two_v2[] __initdata = { +static unsigned char page_two_v2[] __devinitdata = { 0x46, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -static unsigned char page_three_v2[] __initdata = { +static unsigned char page_three_v2[] __devinitdata = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -static unsigned char page_four_v2[] __initdata = { +static unsigned char page_four_v2[] __devinitdata = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -227,7 +227,7 @@ static unsigned char page_four_v2[] __initdata = { 0x00, 0x00, 0x00, 0x00 }; -static unsigned char page_seven_v2[] __initdata = { +static unsigned char page_seven_v2[] __devinitdata = { 0x0f, 0xff, 0x0f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -239,7 +239,7 @@ static unsigned char page_seven_v2[] __initdata = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -static unsigned char mod_v2[] __initdata = { +static unsigned char mod_v2[] __devinitdata = { 0x01, 0x00, 0x02, 0x00, 0x01, 0x01, 0x02, 0x00, 0x01, 0x02, 0x02, 0x00, 0x01, 0x03, 0x02, 0x00, 0x01, 0x04, 0x02, 0x00, 0x01, 0x05, 0x02, 0x00, 0x01, 0x06, 0x02, 0x00, 0x01, 0x07, 0x02, 0x00, 0xb0, @@ -269,7 +269,7 @@ static unsigned char mod_v2[] __initdata = { 0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x05, 0x02, 0x01, 0x01, 0x06, 0x02, 0x01, 0x01, 0x07, 0x02, 0x01 }; -static unsigned char coefficients[] __initdata = { +static unsigned char coefficients[] __devinitdata = { 0x07, 0x46, 0x00, 0x00, 0x07, 0x49, 0x00, 0x00, 0x00, 0x4b, 0x03, 0x11, 0x00, 0x4d, 0x01, 0x32, 0x07, 0x46, 0x00, 0x00, 0x07, 0x49, 0x00, 0x00, 0x07, 0x40, 0x00, 0x00, 0x07, 0x41, 0x00, 0x00, 0x01, @@ -305,14 +305,14 @@ static unsigned char coefficients[] __initdata = { 0x06, 0x6c, 0x4c, 0x6c, 0x06, 0x50, 0x52, 0xe2, 0x06, 0x42, 0x02, 0xba }; -static unsigned char coefficients2[] __initdata = { +static unsigned char coefficients2[] __devinitdata = { 0x07, 0x46, 0x00, 0x00, 0x07, 0x49, 0x00, 0x00, 0x07, 0x45, 0x0f, 0xff, 0x07, 0x48, 0x0f, 0xff, 0x07, 0x7b, 0x04, 0xcc, 0x07, 0x7d, 0x04, 0xcc, 0x07, 0x7c, 0x00, 0x00, 0x07, 0x7e, 0x00, 0x00, 0x07, 0x46, 0x00, 0x00, 0x07, 0x49, 0x00, 0x00, 0x07, 0x47, 0x00, 0x00, 0x07, 0x4a, 0x00, 0x00, 0x07, 0x4c, 0x00, 0x00, 0x07, 0x4e, 0x00, 0x00 }; -static unsigned char coefficients3[] __initdata = { +static unsigned char coefficients3[] __devinitdata = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x28, 0x00, 0x51, 0x00, 0x51, 0x00, 0x7a, 0x00, 0x7a, 0x00, 0xa3, 0x00, 0xa3, 0x00, 0xcc, 0x00, 0xcc, 0x00, 0xf5, 0x00, 0xf5, 0x01, 0x1e, 0x01, 0x1e, 0x01, @@ -563,7 +563,7 @@ snd_wavefront_fx_ioctl (struct snd_hwdep *sdev, struct file *file, */ -int __init +int __devinit snd_wavefront_fx_start (snd_wavefront_t *dev) { diff --git a/sound/isa/wavefront/wavefront_midi.c b/sound/isa/wavefront/wavefront_midi.c index 15888ba21..cb3460094 100644 --- a/sound/isa/wavefront/wavefront_midi.c +++ b/sound/isa/wavefront/wavefront_midi.c @@ -474,7 +474,7 @@ snd_wavefront_midi_disable_virtual (snd_wavefront_card_t *card) spin_unlock_irqrestore (&card->wavefront.midi.virtual, flags); } -int __init +int __devinit snd_wavefront_midi_start (snd_wavefront_card_t *card) { diff --git a/sound/isa/wavefront/wavefront_synth.c b/sound/isa/wavefront/wavefront_synth.c index 68aa091e8..bed329edb 100644 --- a/sound/isa/wavefront/wavefront_synth.c +++ b/sound/isa/wavefront/wavefront_synth.c @@ -1738,7 +1738,7 @@ snd_wavefront_internal_interrupt (snd_wavefront_card_t *card) 7 Unused */ -static int __init +static int __devinit snd_wavefront_interrupt_bits (int irq) { @@ -1766,7 +1766,7 @@ snd_wavefront_interrupt_bits (int irq) return bits; } -static void __init +static void __devinit wavefront_should_cause_interrupt (snd_wavefront_t *dev, int val, int port, int timeout) @@ -1787,7 +1787,7 @@ wavefront_should_cause_interrupt (snd_wavefront_t *dev, } } -static int __init +static int __devinit wavefront_reset_to_cleanliness (snd_wavefront_t *dev) { @@ -1946,7 +1946,7 @@ wavefront_reset_to_cleanliness (snd_wavefront_t *dev) #include -static int __init +static int __devinit wavefront_download_firmware (snd_wavefront_t *dev, char *path) { @@ -2047,7 +2047,7 @@ wavefront_download_firmware (snd_wavefront_t *dev, char *path) } -static int __init +static int __devinit wavefront_do_reset (snd_wavefront_t *dev) { @@ -2136,7 +2136,7 @@ wavefront_do_reset (snd_wavefront_t *dev) return 1; } -int __init +int __devinit snd_wavefront_start (snd_wavefront_t *dev) { @@ -2178,7 +2178,7 @@ snd_wavefront_start (snd_wavefront_t *dev) return (0); } -int __init +int __devinit snd_wavefront_detect (snd_wavefront_card_t *card) { diff --git a/sound/mips/au1x00.c b/sound/mips/au1x00.c index c20522b02..c31b38659 100644 --- a/sound/mips/au1x00.c +++ b/sound/mips/au1x00.c @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -50,14 +51,7 @@ MODULE_AUTHOR("Charles Eidsness "); MODULE_DESCRIPTION("Au1000 AC'97 ALSA Driver"); MODULE_LICENSE("GPL"); -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,8) MODULE_SUPPORTED_DEVICE("{{AMD,Au1000 AC'97}}"); -#else -MODULE_CLASSES("{sound}"); -MODULE_DEVICES("{{AMD,Au1000 AC'97}}"); -#endif - -#define chip_t au1000_t #define PLAYBACK 0 #define CAPTURE 1 @@ -70,18 +64,14 @@ MODULE_DEVICES("{{AMD,Au1000 AC'97}}"); #define READ_WAIT 2 #define RW_DONE 3 -DECLARE_WAIT_QUEUE_HEAD(ac97_command_wq); - -typedef struct au1000_period au1000_period_t; struct au1000_period { u32 start; u32 relative_end; /*realtive to start of buffer*/ - au1000_period_t * next; + struct au1000_period * next; }; /*Au1000 AC97 Port Control Reisters*/ -typedef struct au1000_ac97_reg au1000_ac97_reg_t; struct au1000_ac97_reg { u32 volatile config; u32 volatile status; @@ -90,32 +80,30 @@ struct au1000_ac97_reg { u32 volatile cntrl; }; -typedef struct audio_stream audio_stream_t; struct audio_stream { - snd_pcm_substream_t * substream; + struct snd_pcm_substream *substream; int dma; spinlock_t dma_lock; - au1000_period_t * buffer; - unsigned long period_size; + struct au1000_period * buffer; + unsigned int period_size; + unsigned int periods; }; -typedef struct snd_card_au1000 { - snd_card_t *card; - au1000_ac97_reg_t volatile *ac97_ioport; +struct snd_au1000 { + struct snd_card *card; + struct au1000_ac97_reg volatile *ac97_ioport; struct resource *ac97_res_port; spinlock_t ac97_lock; - ac97_t *ac97; - - snd_pcm_t *pcm; - audio_stream_t *stream[2]; /* playback & capture */ -} au1000_t; + struct snd_ac97 *ac97; -static au1000_t *au1000 = NULL; + struct snd_pcm *pcm; + struct audio_stream *stream[2]; /* playback & capture */ +}; /*--------------------------- Local Functions --------------------------------*/ static void -au1000_set_ac97_xmit_slots(long xmit_slots) +au1000_set_ac97_xmit_slots(struct snd_au1000 *au1000, long xmit_slots) { u32 volatile ac97_config; @@ -128,7 +116,7 @@ au1000_set_ac97_xmit_slots(long xmit_slots) } static void -au1000_set_ac97_recv_slots(long recv_slots) +au1000_set_ac97_recv_slots(struct snd_au1000 *au1000, long recv_slots) { u32 volatile ac97_config; @@ -142,86 +130,100 @@ au1000_set_ac97_recv_slots(long recv_slots) static void -au1000_dma_stop(audio_stream_t *stream) +au1000_release_dma_link(struct audio_stream *stream) +{ + struct au1000_period * pointer; + struct au1000_period * pointer_next; + + stream->period_size = 0; + stream->periods = 0; + pointer = stream->buffer; + if (! pointer) + return; + do { + pointer_next = pointer->next; + kfree(pointer); + pointer = pointer_next; + } while (pointer != stream->buffer); + stream->buffer = NULL; +} + +static int +au1000_setup_dma_link(struct audio_stream *stream, unsigned int period_bytes, + unsigned int periods) { - unsigned long flags; - au1000_period_t * pointer; - au1000_period_t * pointer_next; + struct snd_pcm_substream *substream = stream->substream; + struct snd_pcm_runtime *runtime = substream->runtime; + struct au1000_period *pointer; + unsigned long dma_start; + int i; + + dma_start = virt_to_phys(runtime->dma_area); - if (stream->buffer != NULL) { - spin_lock_irqsave(&stream->dma_lock, flags); - disable_dma(stream->dma); - spin_unlock_irqrestore(&stream->dma_lock, flags); + if (stream->period_size == period_bytes && + stream->periods == periods) + return 0; /* not changed */ - pointer = stream->buffer; - pointer_next = stream->buffer->next; + au1000_release_dma_link(stream); - do { - kfree(pointer); - pointer = pointer_next; - pointer_next = pointer->next; - } while (pointer != stream->buffer); + stream->period_size = period_bytes; + stream->periods = periods; - stream->buffer = NULL; + stream->buffer = kmalloc(sizeof(struct au1000_period), GFP_KERNEL); + if (! stream->buffer) + return -ENOMEM; + pointer = stream->buffer; + for (i = 0; i < periods; i++) { + pointer->start = (u32)(dma_start + (i * period_bytes)); + pointer->relative_end = (u32) (((i+1) * period_bytes) - 0x1); + if (i < periods - 1) { + pointer->next = kmalloc(sizeof(struct au1000_period), GFP_KERNEL); + if (! pointer->next) { + au1000_release_dma_link(stream); + return -ENOMEM; + } + pointer = pointer->next; + } } + pointer->next = stream->buffer; + return 0; } static void -au1000_dma_start(audio_stream_t *stream) +au1000_dma_stop(struct audio_stream *stream) { - snd_pcm_substream_t *substream = stream->substream; - snd_pcm_runtime_t *runtime = substream->runtime; + snd_assert(stream->buffer, return); + disable_dma(stream->dma); +} - unsigned long flags, dma_start; - int i; - au1000_period_t * pointer; - - if (stream->buffer == NULL) { - dma_start = virt_to_phys(runtime->dma_area); - - stream->period_size = frames_to_bytes(runtime, - runtime->period_size); - stream->buffer = kmalloc(sizeof(au1000_period_t), GFP_KERNEL); - pointer = stream->buffer; - for (i = 0 ; i < runtime->periods ; i++) { - pointer->start = (u32)(dma_start + - (i * stream->period_size)); - pointer->relative_end = (u32) - (((i+1) * stream->period_size) - 0x1); - if ( i < runtime->periods - 1) { - pointer->next = kmalloc(sizeof(au1000_period_t) - , GFP_KERNEL); - pointer = pointer->next; - } - } - pointer->next = stream->buffer; - - spin_lock_irqsave(&stream->dma_lock, flags); - init_dma(stream->dma); - if (get_dma_active_buffer(stream->dma) == 0) { - clear_dma_done0(stream->dma); - set_dma_addr0(stream->dma, stream->buffer->start); - set_dma_count0(stream->dma, stream->period_size >> 1); - set_dma_addr1(stream->dma, stream->buffer->next->start); - set_dma_count1(stream->dma, stream->period_size >> 1); - } else { - clear_dma_done1(stream->dma); - set_dma_addr1(stream->dma, stream->buffer->start); - set_dma_count1(stream->dma, stream->period_size >> 1); - set_dma_addr0(stream->dma, stream->buffer->next->start); - set_dma_count0(stream->dma, stream->period_size >> 1); - } - enable_dma_buffers(stream->dma); - start_dma(stream->dma); - spin_unlock_irqrestore(&stream->dma_lock, flags); +static void +au1000_dma_start(struct audio_stream *stream) +{ + snd_assert(stream->buffer, return); + + init_dma(stream->dma); + if (get_dma_active_buffer(stream->dma) == 0) { + clear_dma_done0(stream->dma); + set_dma_addr0(stream->dma, stream->buffer->start); + set_dma_count0(stream->dma, stream->period_size >> 1); + set_dma_addr1(stream->dma, stream->buffer->next->start); + set_dma_count1(stream->dma, stream->period_size >> 1); + } else { + clear_dma_done1(stream->dma); + set_dma_addr1(stream->dma, stream->buffer->start); + set_dma_count1(stream->dma, stream->period_size >> 1); + set_dma_addr0(stream->dma, stream->buffer->next->start); + set_dma_count0(stream->dma, stream->period_size >> 1); } + enable_dma_buffers(stream->dma); + start_dma(stream->dma); } static irqreturn_t au1000_dma_interrupt(int irq, void *dev_id, struct pt_regs *regs) { - audio_stream_t *stream = (audio_stream_t *) dev_id; - snd_pcm_substream_t *substream = stream->substream; + struct audio_stream *stream = (struct audio_stream *) dev_id; + struct snd_pcm_substream *substream = stream->substream; spin_lock(&stream->dma_lock); switch (get_dma_buffer_done(stream->dma)) { @@ -240,11 +242,9 @@ au1000_dma_interrupt(int irq, void *dev_id, struct pt_regs *regs) enable_dma_buffer1(stream->dma); break; case (DMA_D0 | DMA_D1): - spin_unlock(&stream->dma_lock); printk(KERN_ERR "DMA %d missed interrupt.\n",stream->dma); au1000_dma_stop(stream); au1000_dma_start(stream); - spin_lock(&stream->dma_lock); break; case (~DMA_D0 & ~DMA_D1): printk(KERN_ERR "DMA %d empty irq.\n",stream->dma); @@ -257,13 +257,13 @@ au1000_dma_interrupt(int irq, void *dev_id, struct pt_regs *regs) /*-------------------------- PCM Audio Streams -------------------------------*/ static unsigned int rates[] = {8000, 11025, 16000, 22050}; -static snd_pcm_hw_constraint_list_t hw_constraints_rates = { +static struct snd_pcm_hw_constraint_list hw_constraints_rates = { .count = sizeof(rates) / sizeof(rates[0]), .list = rates, .mask = 0, }; -static snd_pcm_hardware_t snd_au1000 = +static struct snd_pcm_hardware snd_au1000_hw = { .info = (SNDRV_PCM_INFO_INTERLEAVED | \ SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID), @@ -283,88 +283,108 @@ static snd_pcm_hardware_t snd_au1000 = }; static int -snd_au1000_playback_open(snd_pcm_substream_t * substream) +snd_au1000_playback_open(struct snd_pcm_substream *substream) { + struct snd_au1000 *au1000 = substream->pcm->private_data; + au1000->stream[PLAYBACK]->substream = substream; au1000->stream[PLAYBACK]->buffer = NULL; substream->private_data = au1000->stream[PLAYBACK]; - substream->runtime->hw = snd_au1000; + substream->runtime->hw = snd_au1000_hw; return (snd_pcm_hw_constraint_list(substream->runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_constraints_rates) < 0); } static int -snd_au1000_capture_open(snd_pcm_substream_t * substream) +snd_au1000_capture_open(struct snd_pcm_substream *substream) { + struct snd_au1000 *au1000 = substream->pcm->private_data; + au1000->stream[CAPTURE]->substream = substream; au1000->stream[CAPTURE]->buffer = NULL; substream->private_data = au1000->stream[CAPTURE]; - substream->runtime->hw = snd_au1000; + substream->runtime->hw = snd_au1000_hw; return (snd_pcm_hw_constraint_list(substream->runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_constraints_rates) < 0); - } static int -snd_au1000_playback_close(snd_pcm_substream_t * substream) +snd_au1000_playback_close(struct snd_pcm_substream *substream) { + struct snd_au1000 *au1000 = substream->pcm->private_data; + au1000->stream[PLAYBACK]->substream = NULL; return 0; } static int -snd_au1000_capture_close(snd_pcm_substream_t * substream) +snd_au1000_capture_close(struct snd_pcm_substream *substream) { + struct snd_au1000 *au1000 = substream->pcm->private_data; + au1000->stream[CAPTURE]->substream = NULL; return 0; } static int -snd_au1000_hw_params(snd_pcm_substream_t * substream, - snd_pcm_hw_params_t * hw_params) +snd_au1000_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *hw_params) { - return snd_pcm_lib_malloc_pages(substream, - params_buffer_bytes(hw_params)); + struct audio_stream *stream = substream->private_data; + int err; + + err = snd_pcm_lib_malloc_pages(substream, + params_buffer_bytes(hw_params)); + if (err < 0) + return err; + return au1000_setup_dma_link(stream, + params_period_bytes(hw_params), + params_periods(hw_params)); } static int -snd_au1000_hw_free(snd_pcm_substream_t * substream) +snd_au1000_hw_free(struct snd_pcm_substream *substream) { + struct audio_stream *stream = substream->private_data; + au1000_release_dma_link(stream); return snd_pcm_lib_free_pages(substream); } static int -snd_au1000_playback_prepare(snd_pcm_substream_t * substream) +snd_au1000_playback_prepare(struct snd_pcm_substream *substream) { - snd_pcm_runtime_t *runtime = substream->runtime; + struct snd_au1000 *au1000 = substream->pcm->private_data; + struct snd_pcm_runtime *runtime = substream->runtime; - if (runtime->channels == 1 ) - au1000_set_ac97_xmit_slots(AC97_SLOT_4); + if (runtime->channels == 1) + au1000_set_ac97_xmit_slots(au1000, AC97_SLOT_4); else - au1000_set_ac97_xmit_slots(AC97_SLOT_3 | AC97_SLOT_4); + au1000_set_ac97_xmit_slots(au1000, AC97_SLOT_3 | AC97_SLOT_4); snd_ac97_set_rate(au1000->ac97, AC97_PCM_FRONT_DAC_RATE, runtime->rate); return 0; } static int -snd_au1000_capture_prepare(snd_pcm_substream_t * substream) +snd_au1000_capture_prepare(struct snd_pcm_substream *substream) { - snd_pcm_runtime_t *runtime = substream->runtime; + struct snd_au1000 *au1000 = substream->pcm->private_data; + struct snd_pcm_runtime *runtime = substream->runtime; - if (runtime->channels == 1 ) - au1000_set_ac97_recv_slots(AC97_SLOT_4); + if (runtime->channels == 1) + au1000_set_ac97_recv_slots(au1000, AC97_SLOT_4); else - au1000_set_ac97_recv_slots(AC97_SLOT_3 | AC97_SLOT_4); + au1000_set_ac97_recv_slots(au1000, AC97_SLOT_3 | AC97_SLOT_4); snd_ac97_set_rate(au1000->ac97, AC97_PCM_LR_ADC_RATE, runtime->rate); return 0; } static int -snd_au1000_trigger(snd_pcm_substream_t * substream, int cmd) +snd_au1000_trigger(struct snd_pcm_substream *substream, int cmd) { - audio_stream_t *stream = substream->private_data; + struct audio_stream *stream = substream->private_data; int err = 0; + spin_lock(&stream->dma_lock); switch (cmd) { case SNDRV_PCM_TRIGGER_START: au1000_dma_start(stream); @@ -376,27 +396,27 @@ snd_au1000_trigger(snd_pcm_substream_t * substream, int cmd) err = -EINVAL; break; } + spin_unlock(&stream->dma_lock); return err; } static snd_pcm_uframes_t -snd_au1000_pointer(snd_pcm_substream_t * substream) +snd_au1000_pointer(struct snd_pcm_substream *substream) { - audio_stream_t *stream = substream->private_data; - snd_pcm_runtime_t *runtime = substream->runtime; - unsigned long flags; + struct audio_stream *stream = substream->private_data; + struct snd_pcm_runtime *runtime = substream->runtime; long location; - spin_lock_irqsave(&stream->dma_lock, flags); + spin_lock(&stream->dma_lock); location = get_dma_residue(stream->dma); - spin_unlock_irqrestore(&stream->dma_lock, flags); + spin_unlock(&stream->dma_lock); location = stream->buffer->relative_end - location; if (location == -1) location = 0; return bytes_to_frames(runtime,location); } -static snd_pcm_ops_t snd_card_au1000_playback_ops = { +static struct snd_pcm_ops snd_card_au1000_playback_ops = { .open = snd_au1000_playback_open, .close = snd_au1000_playback_close, .ioctl = snd_pcm_lib_ioctl, @@ -407,7 +427,7 @@ static snd_pcm_ops_t snd_card_au1000_playback_ops = { .pointer = snd_au1000_pointer, }; -static snd_pcm_ops_t snd_card_au1000_capture_ops = { +static struct snd_pcm_ops snd_card_au1000_capture_ops = { .open = snd_au1000_capture_open, .close = snd_au1000_capture_close, .ioctl = snd_pcm_lib_ioctl, @@ -419,9 +439,9 @@ static snd_pcm_ops_t snd_card_au1000_capture_ops = { }; static int __devinit -snd_au1000_pcm_new(void) +snd_au1000_pcm_new(struct snd_au1000 *au1000) { - snd_pcm_t *pcm; + struct snd_pcm *pcm; int err; unsigned long flags; @@ -440,15 +460,18 @@ snd_au1000_pcm_new(void) pcm->info_flags = 0; strcpy(pcm->name, "Au1000 AC97 PCM"); + spin_lock_init(&au1000->stream[PLAYBACK]->dma_lock); + spin_lock_init(&au1000->stream[CAPTURE]->dma_lock); + flags = claim_dma_lock(); if ((au1000->stream[PLAYBACK]->dma = request_au1000_dma(DMA_ID_AC97C_TX, - "AC97 TX", au1000_dma_interrupt, SA_INTERRUPT, + "AC97 TX", au1000_dma_interrupt, IRQF_DISABLED, au1000->stream[PLAYBACK])) < 0) { release_dma_lock(flags); return -EBUSY; } if ((au1000->stream[CAPTURE]->dma = request_au1000_dma(DMA_ID_AC97C_RX, - "AC97 RX", au1000_dma_interrupt, SA_INTERRUPT, + "AC97 RX", au1000_dma_interrupt, IRQF_DISABLED, au1000->stream[CAPTURE])) < 0){ release_dma_lock(flags); return -EBUSY; @@ -459,8 +482,6 @@ snd_au1000_pcm_new(void) set_dma_mode(au1000->stream[CAPTURE]->dma, get_dma_mode(au1000->stream[CAPTURE]->dma) & ~DMA_NC); release_dma_lock(flags); - spin_lock_init(&au1000->stream[PLAYBACK]->dma_lock); - spin_lock_init(&au1000->stream[CAPTURE]->dma_lock); au1000->pcm = pcm; return 0; } @@ -469,12 +490,14 @@ snd_au1000_pcm_new(void) /*-------------------------- AC97 CODEC Control ------------------------------*/ static unsigned short -snd_au1000_ac97_read(ac97_t *ac97, unsigned short reg) +snd_au1000_ac97_read(struct snd_ac97 *ac97, unsigned short reg) { + struct snd_au1000 *au1000 = ac97->private_data; u32 volatile cmd; u16 volatile data; int i; - spin_lock(au1000->ac97_lock); + + spin_lock(&au1000->ac97_lock); /* would rather use the interupt than this polling but it works and I can't get the interupt driven case to work efficiently */ for (i = 0; i < 0x5000; i++) @@ -497,7 +520,7 @@ get the interupt driven case to work efficiently */ } data = au1000->ac97_ioport->cmd & 0xffff; - spin_unlock(au1000->ac97_lock); + spin_unlock(&au1000->ac97_lock); return data; @@ -505,11 +528,13 @@ get the interupt driven case to work efficiently */ static void -snd_au1000_ac97_write(ac97_t *ac97, unsigned short reg, unsigned short val) +snd_au1000_ac97_write(struct snd_ac97 *ac97, unsigned short reg, unsigned short val) { + struct snd_au1000 *au1000 = ac97->private_data; u32 cmd; int i; - spin_lock(au1000->ac97_lock); + + spin_lock(&au1000->ac97_lock); /* would rather use the interupt than this polling but it works and I can't get the interupt driven case to work efficiently */ for (i = 0; i < 0x5000; i++) @@ -522,42 +547,30 @@ get the interupt driven case to work efficiently */ cmd &= ~AC97C_READ; cmd |= ((u32) val << AC97C_WD_BIT); au1000->ac97_ioport->cmd = cmd; - spin_unlock(au1000->ac97_lock); -} -static void -snd_au1000_ac97_free(ac97_t *ac97) -{ - au1000->ac97 = NULL; + spin_unlock(&au1000->ac97_lock); } static int __devinit -snd_au1000_ac97_new(void) +snd_au1000_ac97_new(struct snd_au1000 *au1000) { int err; - -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,8) - ac97_bus_t *pbus; - ac97_template_t ac97; - static ac97_bus_ops_t ops = { + struct snd_ac97_bus *pbus; + struct snd_ac97_template ac97; + static struct snd_ac97_bus_ops ops = { .write = snd_au1000_ac97_write, .read = snd_au1000_ac97_read, }; -#else - ac97_bus_t bus, *pbus; - ac97_t ac97; -#endif - if ((au1000->ac97_res_port = request_region(AC97C_CONFIG, - sizeof(au1000_ac97_reg_t), "Au1x00 AC97")) == NULL) { + if ((au1000->ac97_res_port = request_mem_region(CPHYSADDR(AC97C_CONFIG), + 0x100000, "Au1x00 AC97")) == NULL) { snd_printk(KERN_ERR "ALSA AC97: can't grap AC97 port\n"); return -EBUSY; } - au1000->ac97_ioport = (au1000_ac97_reg_t *) au1000->ac97_res_port->start; + au1000->ac97_ioport = (struct au1000_ac97_reg *) + KSEG1ADDR(au1000->ac97_res_port->start); spin_lock_init(&au1000->ac97_lock); - spin_lock(&au1000->ac97_lock); - /* configure pins for AC'97 TODO: move to board_setup.c */ au_writel(au_readl(SYS_PINFUNC) & ~0x02, SYS_PINFUNC); @@ -574,111 +587,105 @@ snd_au1000_ac97_new(void) au1000->ac97_ioport->config = 0x0; mdelay(5); - spin_unlock(&au1000->ac97_lock); - /* Initialise AC97 middle-layer */ -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,8) if ((err = snd_ac97_bus(au1000->card, 0, &ops, au1000, &pbus)) < 0) return err; -#else - memset(&bus, 0, sizeof(bus)); - bus.write = snd_au1000_ac97_write; - bus.read = snd_au1000_ac97_read; - if ((err = snd_ac97_bus(au1000->card, &bus, &pbus)) < 0) - return err; -#endif + memset(&ac97, 0, sizeof(ac97)); ac97.private_data = au1000; - ac97.private_free = snd_au1000_ac97_free; if ((err = snd_ac97_mixer(pbus, &ac97, &au1000->ac97)) < 0) return err; - return 0; + return 0; } /*------------------------------ Setup / Destroy ----------------------------*/ void -snd_au1000_free(snd_card_t *card) +snd_au1000_free(struct snd_card *card) { + struct snd_au1000 *au1000 = card->private_data; if (au1000->ac97_res_port) { /* put internal AC97 block into reset */ au1000->ac97_ioport->cntrl = AC97C_RS; au1000->ac97_ioport = NULL; - release_resource(au1000->ac97_res_port); - kfree_nocheck(au1000->ac97_res_port); + release_and_free_resource(au1000->ac97_res_port); } - if (au1000->stream[PLAYBACK]->dma >= 0) - free_au1000_dma(au1000->stream[PLAYBACK]->dma); + if (au1000->stream[PLAYBACK]) { + if (au1000->stream[PLAYBACK]->dma >= 0) + free_au1000_dma(au1000->stream[PLAYBACK]->dma); + kfree(au1000->stream[PLAYBACK]); + } - if (au1000->stream[CAPTURE]->dma >= 0) - free_au1000_dma(au1000->stream[CAPTURE]->dma); + if (au1000->stream[CAPTURE]) { + if (au1000->stream[CAPTURE]->dma >= 0) + free_au1000_dma(au1000->stream[CAPTURE]->dma); + kfree(au1000->stream[CAPTURE]); + } +} - kfree(au1000->stream[PLAYBACK]); - au1000->stream[PLAYBACK] = NULL; - kfree(au1000->stream[CAPTURE]); - au1000->stream[CAPTURE] = NULL; - kfree(au1000); - au1000 = NULL; -} +static struct snd_card *au1000_card; static int __init au1000_init(void) { int err; + struct snd_card *card; + struct snd_au1000 *au1000; - au1000 = kmalloc(sizeof(au1000_t), GFP_KERNEL); - if (au1000 == NULL) - return -ENOMEM; - au1000->stream[PLAYBACK] = kmalloc(sizeof(audio_stream_t), GFP_KERNEL); - if (au1000->stream[PLAYBACK] == NULL) - return -ENOMEM; - au1000->stream[CAPTURE] = kmalloc(sizeof(audio_stream_t), GFP_KERNEL); - if (au1000->stream[CAPTURE] == NULL) + card = snd_card_new(-1, "AC97", THIS_MODULE, sizeof(struct snd_au1000)); + if (card == NULL) return -ENOMEM; + + card->private_free = snd_au1000_free; + au1000 = card->private_data; + au1000->card = card; + + au1000->stream[PLAYBACK] = kmalloc(sizeof(struct audio_stream), GFP_KERNEL); + au1000->stream[CAPTURE ] = kmalloc(sizeof(struct audio_stream), GFP_KERNEL); /* so that snd_au1000_free will work as intended */ - au1000->stream[PLAYBACK]->dma = -1; - au1000->stream[CAPTURE]->dma = -1; au1000->ac97_res_port = NULL; - - au1000->card = snd_card_new(-1, "AC97", THIS_MODULE, sizeof(au1000_t)); - if (au1000->card == NULL) { - snd_au1000_free(au1000->card); + if (au1000->stream[PLAYBACK]) + au1000->stream[PLAYBACK]->dma = -1; + if (au1000->stream[CAPTURE ]) + au1000->stream[CAPTURE ]->dma = -1; + + if (au1000->stream[PLAYBACK] == NULL || + au1000->stream[CAPTURE ] == NULL) { + snd_card_free(card); return -ENOMEM; } - au1000->card->private_data = (au1000_t *)au1000; - au1000->card->private_free = snd_au1000_free; - - if ((err = snd_au1000_ac97_new()) < 0 ) { - snd_card_free(au1000->card); + if ((err = snd_au1000_ac97_new(au1000)) < 0 ) { + snd_card_free(card); return err; } - if ((err = snd_au1000_pcm_new()) < 0) { - snd_card_free(au1000->card); + if ((err = snd_au1000_pcm_new(au1000)) < 0) { + snd_card_free(card); return err; } - strcpy(au1000->card->driver, "AMD-Au1000-AC97"); - strcpy(au1000->card->shortname, "Au1000-AC97"); - sprintf(au1000->card->longname, "AMD Au1000--AC97 ALSA Driver"); + strcpy(card->driver, "Au1000-AC97"); + strcpy(card->shortname, "AMD Au1000-AC97"); + sprintf(card->longname, "AMD Au1000--AC97 ALSA Driver"); - if ((err = snd_card_register(au1000->card)) < 0) { - snd_card_free(au1000->card); + if ((err = snd_card_register(card)) < 0) { + snd_card_free(card); return err; } printk( KERN_INFO "ALSA AC97: Driver Initialized\n" ); + au1000_card = card; return 0; } static void __exit au1000_exit(void) { - snd_card_free(au1000->card); + snd_card_free(au1000_card); } module_init(au1000_init); diff --git a/sound/oss/Kconfig b/sound/oss/Kconfig index 558c6ed44..97e38b665 100644 --- a/sound/oss/Kconfig +++ b/sound/oss/Kconfig @@ -5,6 +5,20 @@ # # Prompt user for primary drivers. +config OSS_OBSOLETE_DRIVER + bool "Obsolete OSS drivers" + depends on SOUND_PRIME + help + This option enables support for obsolete OSS drivers that + are scheduled for removal in the near future since there + are ALSA drivers for the same hardware. + + Please contact Adrian Bunk if you had to + say Y here because your soundcard is not properly supported + by ALSA. + + If unsure, say N. + config SOUND_BT878 tristate "BT878 audio dma" depends on SOUND_PRIME && PCI @@ -23,7 +37,7 @@ config SOUND_BT878 config SOUND_EMU10K1 tristate "Creative SBLive! (EMU10K1)" - depends on SOUND_PRIME && PCI + depends on SOUND_PRIME && PCI && OSS_OBSOLETE_DRIVER ---help--- Say Y or M if you have a PCI sound card using the EMU10K1 chipset, such as the Creative SBLive!, SB PCI512 or Emu-APS. @@ -31,7 +45,7 @@ config SOUND_EMU10K1 For more information on this driver and the degree of support for the different card models please check: - + It is now possible to load dsp microcode patches into the EMU10K1 chip. These patches are used to implement real time sound @@ -49,7 +63,7 @@ config MIDI_EMU10K1 config SOUND_FUSION tristate "Crystal SoundFusion (CS4280/461x)" - depends on SOUND_PRIME && PCI + depends on SOUND_PRIME && PCI && OSS_OBSOLETE_DRIVER help This module drives the Crystal SoundFusion devices (CS4280/46xx series) when wired as native sound drivers with AC97 codecs. If @@ -98,8 +112,8 @@ config SOUND_HAL2 tristate "SGI HAL2 sound (EXPERIMENTAL)" depends on SOUND_PRIME && SGI_IP22 && EXPERIMENTAL help - Say Y or M if you have an SGI Indy system and want to be able to - use it's on-board A2 audio system. + Say Y or M if you have an SGI Indy or Indigo2 system and want to be able to + use its on-board A2 audio system. config SOUND_IT8172 tristate "IT8172G Sound" @@ -114,8 +128,9 @@ config SOUND_VRC5477 with the AC97 codec. config SOUND_AU1550_AC97 - tristate "Au1550 AC97 Sound" - depends on SOUND_PRIME && SOC_AU1550 + tristate "Au1550/Au1200 AC97 Sound" + select SND_AC97_CODEC + depends on SOUND_PRIME && (SOC_AU1550 || SOC_AU1200) config SOUND_TRIDENT tristate "Trident 4DWave DX/NX, SiS 7018 or ALi 5451 PCI Audio Core" @@ -139,7 +154,7 @@ config SOUND_TRIDENT system support" and "Sysctl support", and after the /proc file system has been mounted, executing the command - command what is enabled + command what is enabled echo 0>/proc/ALi5451 pcm out is also set to S/PDIF out. (Default). @@ -439,7 +454,7 @@ config SOUND_DMAP config SOUND_AD1816 tristate "AD1816(A) based cards (EXPERIMENTAL)" - depends on EXPERIMENTAL && SOUND_OSS + depends on EXPERIMENTAL && SOUND_OSS && OSS_OBSOLETE_DRIVER help Say M here if you have a sound card based on the Analog Devices AD1816(A) chip. @@ -449,21 +464,21 @@ config SOUND_AD1816 config SOUND_AD1889 tristate "AD1889 based cards (AD1819 codec) (EXPERIMENTAL)" - depends on EXPERIMENTAL && SOUND_OSS && PCI + depends on EXPERIMENTAL && SOUND_OSS && PCI && OSS_OBSOLETE_DRIVER help Say M here if you have a sound card based on the Analog Devices AD1889 chip. config SOUND_ADLIB tristate "Adlib Cards" - depends on SOUND_OSS + depends on SOUND_OSS && OSS_OBSOLETE_DRIVER help Includes ASB 64 4D. Information on programming AdLib cards is available at . config SOUND_ACI_MIXER tristate "ACI mixer (miroSOUND PCM1-pro/PCM12/PCM20)" - depends on SOUND_OSS + depends on SOUND_OSS && OSS_OBSOLETE_DRIVER ---help--- ACI (Audio Command Interface) is a protocol used to communicate with the microcontroller on some sound cards produced by miro and @@ -492,6 +507,19 @@ config SOUND_CS4232 See for more information on configuring this card. +config SOUND_SSCAPE + tristate "Ensoniq SoundScape support" + depends on SOUND_OSS + help + Answer Y if you have a sound card based on the Ensoniq SoundScape + chipset. Such cards are being manufactured at least by Ensoniq, Spea + and Reveal (Reveal makes also other cards). + + If you compile the driver into the kernel, you have to add + "sscape=,,,," to the kernel command + line. + + config SOUND_VMIDI tristate "Loopback MIDI device support" depends on SOUND_OSS @@ -572,7 +600,7 @@ config SOUND_MPU401 config SOUND_NM256 tristate "NM256AV/NM256ZX audio support" - depends on SOUND_OSS + depends on SOUND_OSS && OSS_OBSOLETE_DRIVER help Say M here to include audio support for the NeoMagic 256AV/256ZX chipsets. These are the audio chipsets found in the Sony @@ -692,7 +720,7 @@ config SOUND_YM3812 config SOUND_OPL3SA2 tristate "Yamaha OPL3-SA2 and SA3 based PnP cards" - depends on SOUND_OSS + depends on SOUND_OSS && OSS_OBSOLETE_DRIVER help Say Y or M if you have a card based on one of these Yamaha sound chipsets or the "SAx", which is actually a SA3. Read @@ -824,7 +852,7 @@ config SOUND_WAVEARTIST config SOUND_TVMIXER tristate "TV card (bt848) mixer support" - depends on SOUND_PRIME && I2C + depends on SOUND_PRIME && I2C && VIDEO_V4L1 help Support for audio mixer facilities on the BT848 TV frame-grabber card. @@ -838,6 +866,6 @@ config SOUND_SH_DAC_AUDIO depends on SOUND_PRIME && CPU_SH3 config SOUND_SH_DAC_AUDIO_CHANNEL - int " DAC channel" + int "DAC channel" default "1" depends on SOUND_SH_DAC_AUDIO diff --git a/sound/oss/ad1816.c b/sound/oss/ad1816.c index 95586de02..29057836c 100644 --- a/sound/oss/ad1816.c +++ b/sound/oss/ad1816.c @@ -41,7 +41,6 @@ */ -#include #include #include #include diff --git a/sound/oss/ad1848.c b/sound/oss/ad1848.c index e04fa49b0..3b45e11e5 100644 --- a/sound/oss/ad1848.c +++ b/sound/oss/ad1848.c @@ -41,7 +41,6 @@ * Tested. Believed fully functional. */ -#include #include #include #include diff --git a/sound/oss/ad1889.c b/sound/oss/ad1889.c index a4ca7569e..f56f870b4 100644 --- a/sound/oss/ad1889.c +++ b/sound/oss/ad1889.c @@ -26,7 +26,6 @@ * * $Id: ad1889.c,v 1.3 2002/10/19 21:31:44 grundler Exp $ */ -#include #include #include #include @@ -1011,7 +1010,7 @@ static int __devinit ad1889_probe(struct pci_dev *pcidev, const struct pci_devic goto out2; } - if (request_irq(pcidev->irq, ad1889_interrupt, SA_SHIRQ, DEVNAME, dev) != 0) { + if (request_irq(pcidev->irq, ad1889_interrupt, IRQF_SHARED, DEVNAME, dev) != 0) { printk(KERN_ERR DEVNAME ": unable to request interrupt\n"); goto out3; } diff --git a/sound/oss/aedsp16.c b/sound/oss/aedsp16.c index b556263a5..51e1fde62 100644 --- a/sound/oss/aedsp16.c +++ b/sound/oss/aedsp16.c @@ -23,7 +23,6 @@ * Include the main OSS Lite header file. It include all the os, OSS Lite, etc * headers needed by this source. */ -#include #include #include #include diff --git a/sound/oss/ali5455.c b/sound/oss/ali5455.c index 62bb936b1..70dcd703a 100644 --- a/sound/oss/ali5455.c +++ b/sound/oss/ali5455.c @@ -3460,7 +3460,7 @@ static int __devinit ali_probe(struct pci_dev *pci_dev, card->channel[4].num = 4; /* claim our iospace and irq */ request_region(card->iobase, 256, card_names[pci_id->driver_data]); - if (request_irq(card->irq, &ali_interrupt, SA_SHIRQ, + if (request_irq(card->irq, &ali_interrupt, IRQF_SHARED, card_names[pci_id->driver_data], card)) { printk(KERN_ERR "ali_audio: unable to allocate irq %d\n", card->irq); diff --git a/sound/oss/au1000.c b/sound/oss/au1000.c index eacb0aef2..e37962314 100644 --- a/sound/oss/au1000.c +++ b/sound/oss/au1000.c @@ -2015,14 +2015,14 @@ static int __devinit au1000_probe(void) if ((s->dma_dac.dmanr = request_au1000_dma(DMA_ID_AC97C_TX, "audio DAC", dac_dma_interrupt, - SA_INTERRUPT, s)) < 0) { + IRQF_DISABLED, s)) < 0) { err("Can't get DAC DMA"); goto err_dma1; } if ((s->dma_adc.dmanr = request_au1000_dma(DMA_ID_AC97C_RX, "audio ADC", adc_dma_interrupt, - SA_INTERRUPT, s)) < 0) { + IRQF_DISABLED, s)) < 0) { err("Can't get ADC DMA"); goto err_dma2; } diff --git a/sound/oss/au1550_ac97.c b/sound/oss/au1550_ac97.c index a78e48d41..4cdb86252 100644 --- a/sound/oss/au1550_ac97.c +++ b/sound/oss/au1550_ac97.c @@ -35,7 +35,6 @@ #undef DEBUG -#include #include #include #include @@ -53,12 +52,14 @@ #include #include #include +#include + #include #include #include -#include #include #include +#include #undef OSS_DOCUMENTED_MIXER_SEMANTICS @@ -78,7 +79,7 @@ * 0 = no VRA, 1 = use VRA if codec supports it */ static int vra = 1; -MODULE_PARM(vra, "i"); +module_param(vra, bool, 0); MODULE_PARM_DESC(vra, "if 1 use VRA if codec supports it"); static struct au1550_state { @@ -91,8 +92,8 @@ static struct au1550_state { int no_vra; /* do not use VRA */ spinlock_t lock; - struct semaphore open_sem; - struct semaphore sem; + struct mutex open_mutex; + struct mutex sem; mode_t open_mode; wait_queue_head_t open_wait; @@ -212,7 +213,8 @@ rdcodec(struct ac97_codec *codec, u8 addr) } if (i == POLL_COUNT) { err("rdcodec: read poll expired!"); - return 0; + data = 0; + goto out; } /* wait for command done? @@ -225,7 +227,8 @@ rdcodec(struct ac97_codec *codec, u8 addr) } if (i == POLL_COUNT) { err("rdcodec: read cmdwait expired!"); - return 0; + data = 0; + goto out; } data = au_readl(PSC_AC97CDC) & 0xffff; @@ -236,6 +239,7 @@ rdcodec(struct ac97_codec *codec, u8 addr) au_writel(PSC_AC97EVNT_CD, PSC_AC97EVNT); au_sync(); + out: spin_unlock_irqrestore(&s->lock, flags); return data; @@ -463,7 +467,7 @@ stop_dac(struct au1550_state *s) /* Wait for Transmit Busy to show disabled. */ do { - stat = readl((void *)PSC_AC97STAT); + stat = au_readl(PSC_AC97STAT); au_sync(); } while ((stat & PSC_AC97STAT_TB) != 0); @@ -492,7 +496,7 @@ stop_adc(struct au1550_state *s) /* Wait for Receive Busy to show disabled. */ do { - stat = readl((void *)PSC_AC97STAT); + stat = au_readl(PSC_AC97STAT); au_sync(); } while ((stat & PSC_AC97STAT_RB) != 0); @@ -542,7 +546,7 @@ set_xmit_slots(int num_channels) /* Wait for Device ready. */ do { - stat = readl((void *)PSC_AC97STAT); + stat = au_readl(PSC_AC97STAT); au_sync(); } while ((stat & PSC_AC97STAT_DR) == 0); } @@ -574,22 +578,20 @@ set_recv_slots(int num_channels) /* Wait for Device ready. */ do { - stat = readl((void *)PSC_AC97STAT); + stat = au_readl(PSC_AC97STAT); au_sync(); } 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(); @@ -599,8 +601,6 @@ start_dac(struct au1550_state *s) au1xxx_dbdma_start(db->dmanr); db->stopped = 0; - - spin_unlock_irqrestore(&s->lock, flags); } static void @@ -719,7 +719,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) { @@ -727,6 +726,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); @@ -748,6 +749,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); } @@ -759,6 +762,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); @@ -766,6 +771,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"); @@ -788,6 +794,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 @@ -1042,16 +1049,16 @@ au1550_read(struct file *file, char *buffer, size_t count, loff_t *ppos) count *= db->cnt_factor; - down(&s->sem); + mutex_lock(&s->sem); add_wait_queue(&db->wait, &wait); while (count > 0) { /* 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); @@ -1062,14 +1069,14 @@ au1550_read(struct file *file, char *buffer, size_t count, loff_t *ppos) ret = -EAGAIN; goto out; } - up(&s->sem); + mutex_unlock(&s->sem); schedule(); if (signal_pending(current)) { if (!ret) ret = -ERESTARTSYS; goto out2; } - down(&s->sem); + mutex_lock(&s->sem); } } while (avail <= 0); @@ -1097,7 +1104,7 @@ au1550_read(struct file *file, char *buffer, size_t count, loff_t *ppos) } /* while (count > 0) */ out: - up(&s->sem); + mutex_unlock(&s->sem); out2: remove_wait_queue(&db->wait, &wait); set_current_state(TASK_RUNNING); @@ -1123,7 +1130,7 @@ au1550_write(struct file *file, const char *buffer, size_t count, loff_t * ppos) count *= db->cnt_factor; - down(&s->sem); + mutex_lock(&s->sem); add_wait_queue(&db->wait, &wait); while (count > 0) { @@ -1141,14 +1148,14 @@ au1550_write(struct file *file, const char *buffer, size_t count, loff_t * ppos) ret = -EAGAIN; goto out; } - up(&s->sem); + mutex_unlock(&s->sem); schedule(); if (signal_pending(current)) { if (!ret) ret = -ERESTARTSYS; goto out2; } - down(&s->sem); + mutex_lock(&s->sem); } } while (avail <= 0); @@ -1194,7 +1201,7 @@ au1550_write(struct file *file, const char *buffer, size_t count, loff_t * ppos) } /* while (count > 0) */ out: - up(&s->sem); + mutex_unlock(&s->sem); out2: remove_wait_queue(&db->wait, &wait); set_current_state(TASK_RUNNING); @@ -1251,7 +1258,7 @@ au1550_mmap(struct file *file, struct vm_area_struct *vma) int ret = 0; lock_kernel(); - down(&s->sem); + mutex_lock(&s->sem); if (vma->vm_flags & VM_WRITE) db = &s->dma_dac; else if (vma->vm_flags & VM_READ) @@ -1277,7 +1284,7 @@ au1550_mmap(struct file *file, struct vm_area_struct *vma) vma->vm_flags &= ~VM_IO; db->mapped = 1; out: - up(&s->sem); + mutex_unlock(&s->sem); unlock_kernel(); return ret; } @@ -1571,15 +1578,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; @@ -1784,21 +1795,21 @@ au1550_open(struct inode *inode, struct file *file) file->private_data = s; /* wait for device to become free */ - down(&s->open_sem); + mutex_lock(&s->open_mutex); while (s->open_mode & file->f_mode) { if (file->f_flags & O_NONBLOCK) { - up(&s->open_sem); + mutex_unlock(&s->open_mutex); return -EBUSY; } add_wait_queue(&s->open_wait, &wait); __set_current_state(TASK_INTERRUPTIBLE); - up(&s->open_sem); + mutex_unlock(&s->open_mutex); schedule(); remove_wait_queue(&s->open_wait, &wait); set_current_state(TASK_RUNNING); if (signal_pending(current)) return -ERESTARTSYS; - down(&s->open_sem); + mutex_lock(&s->open_mutex); } stop_dac(s); @@ -1834,8 +1845,8 @@ au1550_open(struct inode *inode, struct file *file) } s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE); - up(&s->open_sem); - init_MUTEX(&s->sem); + mutex_unlock(&s->open_mutex); + mutex_init(&s->sem); return 0; } @@ -1852,7 +1863,7 @@ au1550_release(struct inode *inode, struct file *file) lock_kernel(); } - down(&s->open_sem); + mutex_lock(&s->open_mutex); if (file->f_mode & FMODE_WRITE) { stop_dac(s); kfree(s->dma_dac.rawbuf); @@ -1864,7 +1875,7 @@ au1550_release(struct inode *inode, struct file *file) s->dma_adc.rawbuf = NULL; } s->open_mode &= ((~file->f_mode) & (FMODE_READ|FMODE_WRITE)); - up(&s->open_sem); + mutex_unlock(&s->open_mutex); wake_up(&s->open_wait); unlock_kernel(); return 0; @@ -1884,6 +1895,8 @@ static /*const */ struct file_operations au1550_audio_fops = { MODULE_AUTHOR("Advanced Micro Devices (AMD), dan@embeddededge.com"); MODULE_DESCRIPTION("Au1550 AC97 Audio Driver"); +MODULE_LICENSE("GPL"); + static int __devinit au1550_probe(void) @@ -1896,7 +1909,7 @@ au1550_probe(void) init_waitqueue_head(&s->dma_adc.wait); init_waitqueue_head(&s->dma_dac.wait); init_waitqueue_head(&s->open_wait); - init_MUTEX(&s->open_sem); + mutex_init(&s->open_mutex); spin_lock_init(&s->lock); s->codec = ac97_alloc_codec(); @@ -1989,7 +2002,7 @@ au1550_probe(void) /* Wait for PSC ready. */ do { - val = readl((void *)PSC_AC97STAT); + val = au_readl(PSC_AC97STAT); au_sync(); } while ((val & PSC_AC97STAT_SR) == 0); @@ -2012,7 +2025,7 @@ au1550_probe(void) /* Wait for Device ready. */ do { - val = readl((void *)PSC_AC97STAT); + val = au_readl(PSC_AC97STAT); au_sync(); } while ((val & PSC_AC97STAT_DR) == 0); diff --git a/sound/oss/btaudio.c b/sound/oss/btaudio.c index bfe3b534e..324a81fd3 100644 --- a/sound/oss/btaudio.c +++ b/sound/oss/btaudio.c @@ -966,7 +966,7 @@ static int __devinit btaudio_probe(struct pci_dev *pci_dev, btwrite(~0U, REG_INT_STAT); pci_set_master(pci_dev); - if ((rc = request_irq(bta->irq, btaudio_irq, SA_SHIRQ|SA_INTERRUPT, + if ((rc = request_irq(bta->irq, btaudio_irq, IRQF_SHARED|IRQF_DISABLED, "btaudio",(void *)bta)) < 0) { printk(KERN_WARNING "btaudio: can't request irq (rc=%d)\n",rc); diff --git a/sound/oss/cmpci.c b/sound/oss/cmpci.c index de60a059f..ea51aafaf 100644 --- a/sound/oss/cmpci.c +++ b/sound/oss/cmpci.c @@ -3122,7 +3122,7 @@ static int __devinit cm_probe(struct pci_dev *pcidev, const struct pci_device_id wrmixer(s, DSP_MIX_DATARESETIDX, 0); /* request irq */ - if ((ret = request_irq(s->irq, cm_interrupt, SA_SHIRQ, "cmpci", s))) { + if ((ret = request_irq(s->irq, cm_interrupt, IRQF_SHARED, "cmpci", s))) { printk(KERN_ERR "cmpci: irq %u in use\n", s->irq); goto err_irq; } diff --git a/sound/oss/cs4232.c b/sound/oss/cs4232.c index c7f86f09c..b6924c7f1 100644 --- a/sound/oss/cs4232.c +++ b/sound/oss/cs4232.c @@ -47,7 +47,6 @@ * Marcus Meissner Added ISA PnP support. */ -#include #include #include #include @@ -405,7 +404,7 @@ static const struct pnp_device_id cs4232_pnp_table[] = { MODULE_DEVICE_TABLE(pnp, cs4232_pnp_table); -static int cs4232_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id) +static int __init cs4232_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id) { struct address_info *isapnpcfg; diff --git a/sound/oss/cs4281/cs4281m.c b/sound/oss/cs4281/cs4281m.c index 0004442f9..0400a416d 100644 --- a/sound/oss/cs4281/cs4281m.c +++ b/sound/oss/cs4281/cs4281m.c @@ -4346,7 +4346,7 @@ static int __devinit cs4281_probe(struct pci_dev *pcidev, s->pcidev = pcidev; s->irq = pcidev->irq; if (request_irq - (s->irq, cs4281_interrupt, SA_SHIRQ, "Crystal CS4281", s)) { + (s->irq, cs4281_interrupt, IRQF_SHARED, "Crystal CS4281", s)) { CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_ERR "cs4281: irq %u in use\n", s->irq)); goto err_irq; diff --git a/sound/oss/cs46xx.c b/sound/oss/cs46xx.c index 53881bc91..5195bf933 100644 --- a/sound/oss/cs46xx.c +++ b/sound/oss/cs46xx.c @@ -147,7 +147,7 @@ * that should be printed on any released driver. */ #if CSDEBUG -#define CS_DBGOUT(mask,level,x) if((cs_debuglevel >= (level)) && ((mask) & cs_debugmask)) {x;} +#define CS_DBGOUT(mask,level,x) if ((cs_debuglevel >= (level)) && ((mask) & cs_debugmask)) {x;} #else #define CS_DBGOUT(mask,level,x) #endif @@ -175,19 +175,19 @@ #define CS_IOCTL_CMD_RESUME 0x2 // resume #if CSDEBUG -static unsigned long cs_debuglevel=1; /* levels range from 1-9 */ +static unsigned long cs_debuglevel = 1; /* levels range from 1-9 */ module_param(cs_debuglevel, ulong, 0644); -static unsigned long cs_debugmask=CS_INIT | CS_ERROR; /* use CS_DBGOUT with various mask values */ +static unsigned long cs_debugmask = CS_INIT | CS_ERROR; /* use CS_DBGOUT with various mask values */ module_param(cs_debugmask, ulong, 0644); #endif static unsigned long hercules_egpio_disable; /* if non-zero set all EGPIO to 0 */ module_param(hercules_egpio_disable, ulong, 0); -static unsigned long initdelay=700; /* PM delay in millisecs */ +static unsigned long initdelay = 700; /* PM delay in millisecs */ module_param(initdelay, ulong, 0); -static unsigned long powerdown=-1; /* turn on/off powerdown processing in driver */ +static unsigned long powerdown = -1; /* turn on/off powerdown processing in driver */ module_param(powerdown, ulong, 0); #define DMABUF_DEFAULTORDER 3 -static unsigned long defaultorder=DMABUF_DEFAULTORDER; +static unsigned long defaultorder = DMABUF_DEFAULTORDER; module_param(defaultorder, ulong, 0); static int external_amp; @@ -200,8 +200,8 @@ module_param(thinkpad, bool, 0); * powerdown. also set thinkpad to 1 to disable powerdown, * but also to enable the clkrun functionality. */ -static unsigned cs_powerdown=1; -static unsigned cs_laptop_wait=1; +static unsigned cs_powerdown = 1; +static unsigned cs_laptop_wait = 1; /* An instance of the 4610 channel */ struct cs_channel @@ -319,7 +319,7 @@ struct cs_card { atomic_t mixer_use_cnt; /* PCI device stuff */ - struct pci_dev * pci_dev; + struct pci_dev *pci_dev; struct list_head list; unsigned int pctl, cctl; /* Hardware DMA flag sets */ @@ -384,7 +384,7 @@ struct cs_card { static int cs_open_mixdev(struct inode *inode, struct file *file); static int cs_release_mixdev(struct inode *inode, struct file *file); static int cs_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd, - unsigned long arg); + unsigned long arg); static int cs_hardware_init(struct cs_card *card); static int cs46xx_powerup(struct cs_card *card, unsigned int type); static int cs461x_powerdown(struct cs_card *card, unsigned int type, int suspendflag); @@ -423,8 +423,7 @@ static void printioctl(unsigned int x) [SOUND_MIXER_VOLUME] = 9 /* Master Volume */ }; - switch(x) - { + switch (x) { case SOUND_MIXER_CS_GETDBGMASK: CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_GETDBGMASK: ") ); break; @@ -521,7 +520,6 @@ static void printioctl(unsigned int x) case SOUND_PCM_READ_FILTER: CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_FILTER: ") ); break; - case SOUND_MIXER_PRIVATE1: CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE1: ") ); break; @@ -543,10 +541,8 @@ static void printioctl(unsigned int x) case SOUND_OLD_MIXER_INFO: CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_OLD_MIXER_INFO: ") ); break; - default: - switch (_IOC_NR(x)) - { + switch (_IOC_NR(x)) { case SOUND_MIXER_VOLUME: CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_VOLUME: ") ); break; @@ -579,14 +575,11 @@ static void printioctl(unsigned int x) break; default: i = _IOC_NR(x); - if (i >= SOUND_MIXER_NRDEVICES || !(vidx = mixtable1[i])) - { + if (i >= SOUND_MIXER_NRDEVICES || !(vidx = mixtable1[i])) { CS_DBGOUT(CS_IOCTL, 4, printk("UNKNOWN IOCTL: 0x%.8x NR=%d ",x,i) ); - } - else - { + } else { CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_IOCTL AC9x: 0x%.8x NR=%d ", - x,i) ); + x,i)); } break; } @@ -601,22 +594,22 @@ static void printioctl(unsigned int x) static void cs461x_poke(struct cs_card *codec, unsigned long reg, unsigned int val) { - writel(val, codec->ba1.idx[(reg >> 16) & 3]+(reg&0xffff)); + writel(val, codec->ba1.idx[(reg >> 16) & 3] + (reg & 0xffff)); } static unsigned int cs461x_peek(struct cs_card *codec, unsigned long reg) { - return readl(codec->ba1.idx[(reg >> 16) & 3]+(reg&0xffff)); + return readl(codec->ba1.idx[(reg >> 16) & 3] + (reg & 0xffff)); } static void cs461x_pokeBA0(struct cs_card *codec, unsigned long reg, unsigned int val) { - writel(val, codec->ba0+reg); + writel(val, codec->ba0 + reg); } static unsigned int cs461x_peekBA0(struct cs_card *codec, unsigned long reg) { - return readl(codec->ba0+reg); + return readl(codec->ba0 + reg); } @@ -625,26 +618,26 @@ static void cs_ac97_set(struct ac97_codec *dev, u8 reg, u16 data); static struct cs_channel *cs_alloc_pcm_channel(struct cs_card *card) { - if(card->channel[1].used==1) + if (card->channel[1].used == 1) return NULL; - card->channel[1].used=1; - card->channel[1].num=1; + card->channel[1].used = 1; + card->channel[1].num = 1; return &card->channel[1]; } static struct cs_channel *cs_alloc_rec_pcm_channel(struct cs_card *card) { - if(card->channel[0].used==1) + if (card->channel[0].used == 1) return NULL; - card->channel[0].used=1; - card->channel[0].num=0; + card->channel[0].used = 1; + card->channel[0].num = 0; return &card->channel[0]; } static void cs_free_pcm_channel(struct cs_card *card, int channel) { card->channel[channel].state = NULL; - card->channel[channel].used=0; + card->channel[channel].used = 0; } /* @@ -655,15 +648,15 @@ static void cs_free_pcm_channel(struct cs_card *card, int channel) */ static void cs_set_divisor(struct dmabuf *dmabuf) { - if(dmabuf->type == CS_TYPE_DAC) + if (dmabuf->type == CS_TYPE_DAC) dmabuf->divisor = 1; - else if( !(dmabuf->fmt & CS_FMT_STEREO) && + else if (!(dmabuf->fmt & CS_FMT_STEREO) && (dmabuf->fmt & CS_FMT_16BIT)) dmabuf->divisor = 2; - else if( (dmabuf->fmt & CS_FMT_STEREO) && + else if ((dmabuf->fmt & CS_FMT_STEREO) && !(dmabuf->fmt & CS_FMT_16BIT)) dmabuf->divisor = 2; - else if( !(dmabuf->fmt & CS_FMT_STEREO) && + else if (!(dmabuf->fmt & CS_FMT_STEREO) && !(dmabuf->fmt & CS_FMT_16BIT)) dmabuf->divisor = 4; else @@ -680,13 +673,12 @@ static void cs_set_divisor(struct dmabuf *dmabuf) */ static void cs_mute(struct cs_card *card, int state) { - struct ac97_codec *dev=card->ac97_codec[0]; + struct ac97_codec *dev = card->ac97_codec[0]; CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO "cs46xx: cs_mute()+ %s\n", - (state == CS_TRUE) ? "Muting" : "UnMuting") ); + (state == CS_TRUE) ? "Muting" : "UnMuting")); - if(state == CS_TRUE) - { + if (state == CS_TRUE) { /* * fix pops when powering up on thinkpads */ @@ -703,9 +695,7 @@ static void cs_mute(struct cs_card *card, int state) cs_ac97_set(dev, (u8)BA0_AC97_HEADPHONE_VOLUME, 0x8000); cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME_MONO, 0x8000); cs_ac97_set(dev, (u8)BA0_AC97_PCM_OUT_VOLUME, 0x8000); - } - else - { + } else { cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME, card->pm.u32AC97_master_volume); cs_ac97_set(dev, (u8)BA0_AC97_HEADPHONE_VOLUME, card->pm.u32AC97_headphone_volume); cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME_MONO, card->pm.u32AC97_master_volume_mono); @@ -757,7 +747,6 @@ static unsigned int cs_set_dac_rate(struct cs_state * state, unsigned int rate) /* * Fill in the SampleRateConverter control block. */ - spin_lock_irqsave(&state->card->lock, flags); cs461x_poke(state->card, BA1_PSRC, ((correctionPerSec << 16) & 0xFFFF0000) | (correctionPerGOF & 0xFFFF)); @@ -770,7 +759,7 @@ static unsigned int cs_set_dac_rate(struct cs_state * state, unsigned int rate) } /* set recording sample rate */ -static unsigned int cs_set_adc_rate(struct cs_state * state, unsigned int rate) +static unsigned int cs_set_adc_rate(struct cs_state *state, unsigned int rate) { struct dmabuf *dmabuf = &state->dmabuf; struct cs_card *card = state->card; @@ -815,7 +804,6 @@ static unsigned int cs_set_adc_rate(struct cs_state * state, unsigned int rate) * dividend:remainder(ulOther / GOF_PER_SEC) * initialDelay = dividend(((24 * Fs,in) + Fs,out - 1) / Fs,out) */ - tmp1 = rate << 16; coeffIncr = tmp1 / 48000; tmp1 -= coeffIncr * 48000; @@ -891,7 +879,7 @@ static void cs_play_setup(struct cs_state *state) CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_play_setup()+\n") ); cs461x_poke(card, BA1_PVOL, 0x80008000); - if(!dmabuf->SGok) + if (!dmabuf->SGok) cs461x_poke(card, BA1_PBA, virt_to_bus(dmabuf->pbuf)); Count = 4; @@ -899,16 +887,14 @@ static void cs_play_setup(struct cs_state *state) if ((dmabuf->fmt & CS_FMT_STEREO)) { playFormat &= ~DMA_RQ_C2_AC_MONO_TO_STEREO; Count *= 2; - } - else + } else playFormat |= DMA_RQ_C2_AC_MONO_TO_STEREO; if ((dmabuf->fmt & CS_FMT_16BIT)) { playFormat &= ~(DMA_RQ_C2_AC_8_TO_16_BIT | DMA_RQ_C2_AC_SIGNED_CONVERT); Count *= 2; - } - else + } else playFormat |= (DMA_RQ_C2_AC_8_TO_16_BIT | DMA_RQ_C2_AC_SIGNED_CONVERT); @@ -919,7 +905,6 @@ static void cs_play_setup(struct cs_state *state) cs461x_poke(card, BA1_PDTC, tmp | --Count); CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_play_setup()-\n") ); - } static struct InitStruct @@ -944,8 +929,7 @@ static void SetCaptureSPValues(struct cs_card *card) { unsigned i, offset; CS_DBGOUT(CS_FUNCTION, 8, printk("cs46xx: SetCaptureSPValues()+\n") ); - for(i=0; icard; struct dmabuf *dmabuf = &state->dmabuf; - CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_rec_setup()+\n") ); + CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_rec_setup()+\n")); SetCaptureSPValues(card); /* @@ -994,14 +978,11 @@ static inline unsigned cs_get_dma_addr(struct cs_state *state) /* * granularity is byte boundary, good part. */ - if(dmabuf->enable & DAC_RUNNING) - { + if (dmabuf->enable & DAC_RUNNING) offset = cs461x_peek(state->card, BA1_PBA); - } else /* ADC_RUNNING must be set */ - { offset = cs461x_peek(state->card, BA1_CBA); - } + CS_DBGOUT(CS_PARMS | CS_FUNCTION, 9, printk("cs46xx: cs_get_dma_addr() %d\n",offset) ); offset = (u32)bus_to_virt((unsigned long)offset) - (u32)dmabuf->rawbuf; @@ -1015,8 +996,7 @@ static void resync_dma_ptrs(struct cs_state *state) struct dmabuf *dmabuf; CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: resync_dma_ptrs()+ \n") ); - if(state) - { + if (state) { dmabuf = &state->dmabuf; dmabuf->hwptr=dmabuf->swptr = 0; dmabuf->pringbuf = 0; @@ -1149,13 +1129,13 @@ static int alloc_dmabuf(struct cs_state *state) /* * check for order within limits, but do not overwrite value. */ - if((defaultorder > 1) && (defaultorder < 12)) + if ((defaultorder > 1) && (defaultorder < 12)) df = defaultorder; else df = 2; for (order = df; order >= DMABUF_MINORDER; order--) - if ( (rawbuf = (void *) pci_alloc_consistent( + if ((rawbuf = (void *)pci_alloc_consistent( card->pci_dev, PAGE_SIZE << order, &dmabuf->dmaaddr))) break; if (!rawbuf) { @@ -1181,8 +1161,7 @@ static int alloc_dmabuf(struct cs_state *state) /* * only allocate the conversion buffer for the ADC */ - if(dmabuf->type == CS_TYPE_DAC) - { + if (dmabuf->type == CS_TYPE_DAC) { dmabuf->tmpbuff = NULL; dmabuf->buforder_tmpbuff = 0; return 0; @@ -1258,8 +1237,7 @@ static int __prog_dmabuf(struct cs_state *state) /* * check for CAPTURE and use only non-sg for initial release */ - if(dmabuf->type == CS_TYPE_ADC) - { + if (dmabuf->type == CS_TYPE_ADC) { CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf() ADC\n")); /* * add in non-sg support for capture. @@ -1313,9 +1291,7 @@ static int __prog_dmabuf(struct cs_state *state) CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()- 0 \n")); return 0; - } - else if (dmabuf->type == CS_TYPE_DAC) - { + } else if (dmabuf->type == CS_TYPE_DAC) { /* * Must be DAC */ @@ -1337,8 +1313,7 @@ static int __prog_dmabuf(struct cs_state *state) allocated_pages = 1 << dmabuf->buforder; allocated_bytes = allocated_pages*PAGE_SIZE; - if(allocated_pages < 2) - { + if (allocated_pages < 2) { CS_DBGOUT(CS_FUNCTION, 4, printk( "cs46xx: prog_dmabuf() Error: allocated_pages too small (%d)\n", (unsigned)allocated_pages)); @@ -1353,14 +1328,14 @@ static int __prog_dmabuf(struct cs_state *state) /* Set up S/G variables. */ *ptmp = virt_to_bus(dmabuf->rawbuf); - *(ptmp+1) = 0x00000008; - for(tmp1= 1; tmp1 < nSGpages; tmp1++) { - *(ptmp+2*tmp1) = virt_to_bus( (dmabuf->rawbuf)+4096*tmp1); - if( tmp1 == nSGpages-1) + *(ptmp + 1) = 0x00000008; + for (tmp1 = 1; tmp1 < nSGpages; tmp1++) { + *(ptmp + 2 * tmp1) = virt_to_bus((dmabuf->rawbuf) + 4096 * tmp1); + if (tmp1 == nSGpages - 1) tmp2 = 0xbfff0000; else - tmp2 = 0x80000000+8*(tmp1+1); - *(ptmp+2*tmp1+1) = tmp2; + tmp2 = 0x80000000 + 8 * (tmp1 + 1); + *(ptmp + 2 * tmp1 + 1) = tmp2; } SGarray[0] = 0x82c0200d; SGarray[1] = 0xffff0000; @@ -1368,18 +1343,17 @@ static int __prog_dmabuf(struct cs_state *state) SGarray[3] = 0x00010600; SGarray[4] = *(ptmp+2); SGarray[5] = 0x80000010; - SGarray[6] = *ptmp; - SGarray[7] = *(ptmp+2); - SGarray[8] = (virt_to_bus(dmabuf->pbuf) & 0xffff000) | 0x10; - - if (dmabuf->SGok) { - dmabuf->numfrag = nSGpages; - dmabuf->fragsize = 4096; - dmabuf->fragsamples = 4096 >> sample_shift[dmabuf->fmt]; - dmabuf->fragshift = 12; - dmabuf->dmasize = dmabuf->numfrag*4096; - } - else { + SGarray[6] = *ptmp; + SGarray[7] = *(ptmp+2); + SGarray[8] = (virt_to_bus(dmabuf->pbuf) & 0xffff000) | 0x10; + + if (dmabuf->SGok) { + dmabuf->numfrag = nSGpages; + dmabuf->fragsize = 4096; + dmabuf->fragsamples = 4096 >> sample_shift[dmabuf->fmt]; + dmabuf->fragshift = 12; + dmabuf->dmasize = dmabuf->numfrag * 4096; + } else { SGarray[0] = 0xf2c0000f; SGarray[1] = 0x00000200; SGarray[2] = 0; @@ -1391,8 +1365,8 @@ static int __prog_dmabuf(struct cs_state *state) dmabuf->dmasize = 4096; dmabuf->fragshift = 11; } - for(tmp1 = 0; tmp1 < sizeof(SGarray)/4; tmp1++) - cs461x_poke( state->card, BA1_PDTC+tmp1*4, SGarray[tmp1]); + for (tmp1 = 0; tmp1 < sizeof(SGarray) / 4; tmp1++) + cs461x_poke(state->card, BA1_PDTC+tmp1 * 4, SGarray[tmp1]); memset(dmabuf->rawbuf, (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80, dmabuf->dmasize); @@ -1416,9 +1390,7 @@ static int __prog_dmabuf(struct cs_state *state) CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()- \n")); return 0; - } - else - { + } else { CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()- Invalid Type %d\n", dmabuf->type)); } @@ -1489,8 +1461,7 @@ static int drain_dac(struct cs_state *state, int nonblock) } remove_wait_queue(&dmabuf->wait, &wait); current->state = TASK_RUNNING; - if (signal_pending(current)) - { + if (signal_pending(current)) { CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()- -ERESTARTSYS\n")); /* * set to silence and let that clear the fifos. @@ -1514,8 +1485,7 @@ static void cs_update_ptr(struct cs_card *card, int wake) /* error handling and process wake up for ADC */ state = card->states[0]; - if(state) - { + if (state) { dmabuf = &state->dmabuf; if (dmabuf->enable & ADC_RUNNING) { /* update hardware pointer */ @@ -1531,12 +1501,10 @@ static void cs_update_ptr(struct cs_card *card, int wake) if (dmabuf->count > dmabuf->dmasize) dmabuf->count = dmabuf->dmasize; - if(dmabuf->mapped) - { + if (dmabuf->mapped) { if (wake && dmabuf->count >= (signed)dmabuf->fragsize) wake_up(&dmabuf->wait); - } else - { + } else { if (wake && dmabuf->count > 0) wake_up(&dmabuf->wait); } @@ -1547,8 +1515,7 @@ static void cs_update_ptr(struct cs_card *card, int wake) * Now the DAC */ state = card->states[1]; - if(state) - { + if (state) { dmabuf = &state->dmabuf; /* error handling and process wake up for DAC */ if (dmabuf->enable & DAC_RUNNING) { @@ -1570,7 +1537,7 @@ static void cs_update_ptr(struct cs_card *card, int wake) * in that, since dmasize is the buffer asked for * via mmap. */ - if( dmabuf->count > dmabuf->dmasize) + if (dmabuf->count > dmabuf->dmasize) dmabuf->count &= dmabuf->dmasize-1; } else { dmabuf->count -= diff; @@ -1578,13 +1545,10 @@ static void cs_update_ptr(struct cs_card *card, int wake) * backfill with silence and clear out the last * "diff" number of bytes. */ - if(hwptr >= diff) - { + if (hwptr >= diff) { memset(dmabuf->rawbuf + hwptr - diff, (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80, diff); - } - else - { + } else { memset(dmabuf->rawbuf, (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80, (unsigned)hwptr); @@ -1602,12 +1566,12 @@ static void cs_update_ptr(struct cs_card *card, int wake) * buffer underrun or buffer overrun, reset the * count of bytes written back to 0. */ - if(dmabuf->count < 0) - dmabuf->underrun=1; + if (dmabuf->count < 0) + dmabuf->underrun = 1; dmabuf->count = 0; dmabuf->error++; } - if (wake && dmabuf->count < (signed)dmabuf->dmasize/2) + if (wake && dmabuf->count < (signed)dmabuf->dmasize / 2) wake_up(&dmabuf->wait); } } @@ -1661,8 +1625,7 @@ static irqreturn_t cs_interrupt(int irq, void *dev_id, struct pt_regs *regs) status = cs461x_peekBA0(card, BA0_HISR); - if ((status & 0x7fffffff) == 0) - { + if ((status & 0x7fffffff) == 0) { cs461x_pokeBA0(card, BA0_HICR, HICR_CHGM|HICR_IEV); spin_unlock(&card->lock); return IRQ_HANDLED; /* Might be IRQ_NONE.. */ @@ -1671,15 +1634,14 @@ static irqreturn_t cs_interrupt(int irq, void *dev_id, struct pt_regs *regs) /* * check for playback or capture interrupt only */ - if( ((status & HISR_VC0) && playstate && playstate->dmabuf.ready) || - (((status & HISR_VC1) && recstate && recstate->dmabuf.ready)) ) - { + if (((status & HISR_VC0) && playstate && playstate->dmabuf.ready) || + (((status & HISR_VC1) && recstate && recstate->dmabuf.ready))) { CS_DBGOUT(CS_INTERRUPT, 8, printk( "cs46xx: cs_interrupt() interrupt bit(s) set (0x%x)\n",status)); cs_update_ptr(card, CS_TRUE); } - if( status & HISR_MIDI ) + if (status & HISR_MIDI) cs_handle_midi(card); /* clear 'em */ @@ -1694,7 +1656,7 @@ static irqreturn_t cs_interrupt(int irq, void *dev_id, struct pt_regs *regs) static ssize_t cs_midi_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) { - struct cs_card *card = (struct cs_card *)file->private_data; + struct cs_card *card = file->private_data; ssize_t ret; unsigned long flags; unsigned ptr; @@ -1737,7 +1699,7 @@ static ssize_t cs_midi_read(struct file *file, char __user *buffer, size_t count static ssize_t cs_midi_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) { - struct cs_card *card = (struct cs_card *)file->private_data; + struct cs_card *card = file->private_data; ssize_t ret; unsigned long flags; unsigned ptr; @@ -1785,7 +1747,7 @@ static ssize_t cs_midi_write(struct file *file, const char __user *buffer, size_ static unsigned int cs_midi_poll(struct file *file, struct poll_table_struct *wait) { - struct cs_card *card = (struct cs_card *)file->private_data; + struct cs_card *card = file->private_data; unsigned long flags; unsigned int mask = 0; @@ -1810,12 +1772,11 @@ static unsigned int cs_midi_poll(struct file *file, struct poll_table_struct *wa static int cs_midi_open(struct inode *inode, struct file *file) { unsigned int minor = iminor(inode); - struct cs_card *card=NULL; + struct cs_card *card = NULL; unsigned long flags; struct list_head *entry; - list_for_each(entry, &cs46xx_devs) - { + list_for_each(entry, &cs46xx_devs) { card = list_entry(entry, struct cs_card, list); if (card->dev_midi == minor) break; @@ -1823,8 +1784,7 @@ static int cs_midi_open(struct inode *inode, struct file *file) if (entry == &cs46xx_devs) return -ENODEV; - if (!card) - { + if (!card) { CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO "cs46xx: cs46xx_midi_open(): Error - unable to find card struct\n")); return -ENODEV; @@ -1852,12 +1812,10 @@ static int cs_midi_open(struct inode *inode, struct file *file) cs461x_pokeBA0(card, BA0_MIDCR, 0x0000000f); /* Enable xmit, rcv. */ cs461x_pokeBA0(card, BA0_HICR, HICR_IEV | HICR_CHGM); /* Enable interrupts */ } - if (file->f_mode & FMODE_READ) { + if (file->f_mode & FMODE_READ) card->midi.ird = card->midi.iwr = card->midi.icnt = 0; - } - if (file->f_mode & FMODE_WRITE) { + if (file->f_mode & FMODE_WRITE) card->midi.ord = card->midi.owr = card->midi.ocnt = 0; - } spin_unlock_irqrestore(&card->midi.lock, flags); card->midi.open_mode |= (file->f_mode & (FMODE_READ | FMODE_WRITE)); mutex_unlock(&card->midi.open_mutex); @@ -1867,7 +1825,7 @@ static int cs_midi_open(struct inode *inode, struct file *file) static int cs_midi_release(struct inode *inode, struct file *file) { - struct cs_card *card = (struct cs_card *)file->private_data; + struct cs_card *card = file->private_data; DECLARE_WAITQUEUE(wait, current); unsigned long flags; unsigned count, tmo; @@ -1933,11 +1891,10 @@ static /*const*/ struct file_operations cs_midi_fops = { static void CopySamples(char *dst, char *src, int count, unsigned fmt, struct dmabuf *dmabuf) { - s32 s32AudioSample; - s16 *psSrc=(s16 *)src; - s16 *psDst=(s16 *)dst; - u8 *pucDst=(u8 *)dst; + s16 *psSrc = (s16 *)src; + s16 *psDst = (s16 *)dst; + u8 *pucDst = (u8 *)dst; CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO "cs46xx: CopySamples()+ ") ); CS_DBGOUT(CS_WAVE_READ, 8, printk(KERN_INFO @@ -1947,34 +1904,29 @@ static void CopySamples(char *dst, char *src, int count, unsigned fmt, /* * See if the data should be output as 8-bit unsigned stereo. */ - if((fmt & CS_FMT_STEREO) && !(fmt & CS_FMT_16BIT)) - { + if ((fmt & CS_FMT_STEREO) && !(fmt & CS_FMT_16BIT)) { /* * Convert each 16-bit signed stereo sample to 8-bit unsigned * stereo using rounding. */ psSrc = (s16 *)src; - count = count/2; - while(count--) - { + count = count / 2; + while (count--) *(pucDst++) = (u8)(((s16)(*psSrc++) + (s16)0x8000) >> 8); - } } /* * See if the data should be output at 8-bit unsigned mono. */ - else if(!(fmt & CS_FMT_STEREO) && !(fmt & CS_FMT_16BIT)) - { + else if (!(fmt & CS_FMT_STEREO) && !(fmt & CS_FMT_16BIT)) { /* * Convert each 16-bit signed stereo sample to 8-bit unsigned * mono using averaging and rounding. */ psSrc = (s16 *)src; - count = count/2; - while(count--) - { - s32AudioSample = ((*psSrc)+(*(psSrc + 1)))/2 + (s32)0x80; - if(s32AudioSample > 0x7fff) + count = count / 2; + while (count--) { + s32AudioSample = ((*psSrc) + (*(psSrc + 1))) / 2 + (s32)0x80; + if (s32AudioSample > 0x7fff) s32AudioSample = 0x7fff; *(pucDst++) = (u8)(((s16)s32AudioSample + (s16)0x8000) >> 8); psSrc += 2; @@ -1983,17 +1935,15 @@ static void CopySamples(char *dst, char *src, int count, unsigned fmt, /* * See if the data should be output at 16-bit signed mono. */ - else if(!(fmt & CS_FMT_STEREO) && (fmt & CS_FMT_16BIT)) - { + else if (!(fmt & CS_FMT_STEREO) && (fmt & CS_FMT_16BIT)) { /* * Convert each 16-bit signed stereo sample to 16-bit signed * mono using averaging. */ psSrc = (s16 *)src; - count = count/2; - while(count--) - { - *(psDst++) = (s16)((*psSrc)+(*(psSrc + 1)))/2; + count = count / 2; + while (count--) { + *(psDst++) = (s16)((*psSrc) + (*(psSrc + 1))) / 2; psSrc += 2; } } @@ -2020,20 +1970,15 @@ static unsigned cs_copy_to_user( "cs_copy_to_user()+ fmt=0x%x cnt=%d dest=%p\n", dmabuf->fmt,(unsigned)cnt,dest) ); - if(cnt > dmabuf->dmasize) - { + if (cnt > dmabuf->dmasize) cnt = dmabuf->dmasize; - } - if(!cnt) - { + if (!cnt) { *copied = 0; return 0; } - if(dmabuf->divisor != 1) - { - if(!dmabuf->tmpbuff) - { - *copied = cnt/dmabuf->divisor; + if (dmabuf->divisor != 1) { + if (!dmabuf->tmpbuff) { + *copied = cnt / dmabuf->divisor; return 0; } @@ -2042,17 +1987,16 @@ static unsigned cs_copy_to_user( src = dmabuf->tmpbuff; cnt = cnt/dmabuf->divisor; } - if (copy_to_user(dest, src, cnt)) - { + if (copy_to_user(dest, src, cnt)) { CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_ERR "cs46xx: cs_copy_to_user()- fault dest=%p src=%p cnt=%d\n", - dest,src,cnt) ); + dest,src,cnt)); *copied = 0; return -EFAULT; } *copied = cnt; CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO - "cs46xx: cs_copy_to_user()- copied bytes is %d \n",cnt) ); + "cs46xx: cs_copy_to_user()- copied bytes is %d \n",cnt)); return 0; } @@ -2060,7 +2004,7 @@ static unsigned cs_copy_to_user( the user's buffer. it is filled by the dma machine and drained by this loop. */ static ssize_t cs_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) { - struct cs_card *card = (struct cs_card *) file->private_data; + struct cs_card *card = file->private_data; struct cs_state *state; DECLARE_WAITQUEUE(wait, current); struct dmabuf *dmabuf; @@ -2068,12 +2012,12 @@ static ssize_t cs_read(struct file *file, char __user *buffer, size_t count, lof unsigned long flags; unsigned swptr; int cnt; - unsigned copied=0; + unsigned copied = 0; CS_DBGOUT(CS_WAVE_READ | CS_FUNCTION, 4, printk("cs46xx: cs_read()+ %zd\n",count) ); - state = (struct cs_state *)card->states[0]; - if(!state) + state = card->states[0]; + if (!state) return -ENODEV; dmabuf = &state->dmabuf; @@ -2088,11 +2032,11 @@ static ssize_t cs_read(struct file *file, char __user *buffer, size_t count, lof add_wait_queue(&state->dmabuf.wait, &wait); while (count > 0) { - while(!(card->pm.flags & CS46XX_PM_IDLE)) - { + while (!(card->pm.flags & CS46XX_PM_IDLE)) { schedule(); if (signal_pending(current)) { - if(!ret) ret = -ERESTARTSYS; + if (!ret) + ret = -ERESTARTSYS; goto out; } } @@ -2112,19 +2056,20 @@ static ssize_t cs_read(struct file *file, char __user *buffer, size_t count, lof recorded */ start_adc(state); if (file->f_flags & O_NONBLOCK) { - if (!ret) ret = -EAGAIN; + if (!ret) + ret = -EAGAIN; goto out; } mutex_unlock(&state->sem); schedule(); if (signal_pending(current)) { - if(!ret) ret = -ERESTARTSYS; + if (!ret) + ret = -ERESTARTSYS; goto out; } mutex_lock(&state->sem); - if (dmabuf->mapped) - { - if(!ret) + if (dmabuf->mapped) { + if (!ret) ret = -ENXIO; goto out; } @@ -2135,12 +2080,12 @@ static ssize_t cs_read(struct file *file, char __user *buffer, size_t count, lof "_read() copy_to cnt=%d count=%zd ", cnt,count) ); CS_DBGOUT(CS_WAVE_READ, 8, printk(KERN_INFO " .dmasize=%d .count=%d buffer=%p ret=%zd\n", - dmabuf->dmasize,dmabuf->count,buffer,ret) ); + dmabuf->dmasize,dmabuf->count,buffer,ret)); if (cs_copy_to_user(state, buffer, - (char *)dmabuf->rawbuf + swptr, cnt, &copied)) - { - if (!ret) ret = -EFAULT; + (char *)dmabuf->rawbuf + swptr, cnt, &copied)) { + if (!ret) + ret = -EFAULT; goto out; } swptr = (swptr + cnt) % dmabuf->dmasize; @@ -2167,7 +2112,7 @@ out2: the soundcard. it is drained by the dma machine and filled by this loop. */ static ssize_t cs_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) { - struct cs_card *card = (struct cs_card *) file->private_data; + struct cs_card *card = file->private_data; struct cs_state *state; DECLARE_WAITQUEUE(wait, current); struct dmabuf *dmabuf; @@ -2178,16 +2123,15 @@ static ssize_t cs_write(struct file *file, const char __user *buffer, size_t cou CS_DBGOUT(CS_WAVE_WRITE | CS_FUNCTION, 4, printk("cs46xx: cs_write called, count = %zd\n", count) ); - state = (struct cs_state *)card->states[1]; - if(!state) + state = card->states[1]; + if (!state) return -ENODEV; if (!access_ok(VERIFY_READ, buffer, count)) return -EFAULT; dmabuf = &state->dmabuf; mutex_lock(&state->sem); - if (dmabuf->mapped) - { + if (dmabuf->mapped) { ret = -ENXIO; goto out; } @@ -2201,11 +2145,11 @@ static ssize_t cs_write(struct file *file, const char __user *buffer, size_t cou * check for PM events and underrun/overrun in the loop. */ while (count > 0) { - while(!(card->pm.flags & CS46XX_PM_IDLE)) - { + while (!(card->pm.flags & CS46XX_PM_IDLE)) { schedule(); if (signal_pending(current)) { - if(!ret) ret = -ERESTARTSYS; + if (!ret) + ret = -ERESTARTSYS; goto out; } } @@ -2216,8 +2160,7 @@ static ssize_t cs_write(struct file *file, const char __user *buffer, size_t cou dmabuf->count = 0; dmabuf->swptr = dmabuf->hwptr; } - if (dmabuf->underrun) - { + if (dmabuf->underrun) { dmabuf->underrun = 0; dmabuf->hwptr = cs_get_dma_addr(state); dmabuf->swptr = dmabuf->hwptr; @@ -2238,34 +2181,35 @@ static ssize_t cs_write(struct file *file, const char __user *buffer, size_t cou played */ start_dac(state); if (file->f_flags & O_NONBLOCK) { - if (!ret) ret = -EAGAIN; + if (!ret) + ret = -EAGAIN; goto out; } mutex_unlock(&state->sem); schedule(); if (signal_pending(current)) { - if(!ret) ret = -ERESTARTSYS; + if (!ret) + ret = -ERESTARTSYS; goto out; } mutex_lock(&state->sem); - if (dmabuf->mapped) - { - if(!ret) + if (dmabuf->mapped) { + if (!ret) ret = -ENXIO; goto out; } continue; } if (copy_from_user(dmabuf->rawbuf + swptr, buffer, cnt)) { - if (!ret) ret = -EFAULT; + if (!ret) + ret = -EFAULT; goto out; } spin_lock_irqsave(&state->card->lock, flags); swptr = (swptr + cnt) % dmabuf->dmasize; dmabuf->swptr = swptr; dmabuf->count += cnt; - if(dmabuf->count > dmabuf->dmasize) - { + if (dmabuf->count > dmabuf->dmasize) { CS_DBGOUT(CS_WAVE_WRITE | CS_ERROR, 2, printk( "cs46xx: cs_write() d->count > dmasize - resetting\n")); dmabuf->count = dmabuf->dmasize; @@ -2284,38 +2228,32 @@ out: set_current_state(TASK_RUNNING); CS_DBGOUT(CS_WAVE_WRITE | CS_FUNCTION, 2, - printk("cs46xx: cs_write()- ret=%zd\n", ret) ); + printk("cs46xx: cs_write()- ret=%zd\n", ret)); return ret; } static unsigned int cs_poll(struct file *file, struct poll_table_struct *wait) { - struct cs_card *card = (struct cs_card *)file->private_data; + struct cs_card *card = file->private_data; struct dmabuf *dmabuf; struct cs_state *state; - unsigned long flags; unsigned int mask = 0; CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_poll()+ \n")); - if (!(file->f_mode & (FMODE_WRITE | FMODE_READ))) - { + if (!(file->f_mode & (FMODE_WRITE | FMODE_READ))) { return -EINVAL; } - if (file->f_mode & FMODE_WRITE) - { + if (file->f_mode & FMODE_WRITE) { state = card->states[1]; - if(state) - { + if (state) { dmabuf = &state->dmabuf; poll_wait(file, &dmabuf->wait, wait); } } - if (file->f_mode & FMODE_READ) - { + if (file->f_mode & FMODE_READ) { state = card->states[0]; - if(state) - { + if (state) { dmabuf = &state->dmabuf; poll_wait(file, &dmabuf->wait, wait); } @@ -2325,8 +2263,7 @@ static unsigned int cs_poll(struct file *file, struct poll_table_struct *wait) cs_update_ptr(card, CS_FALSE); if (file->f_mode & FMODE_READ) { state = card->states[0]; - if(state) - { + if (state) { dmabuf = &state->dmabuf; if (dmabuf->count >= (signed)dmabuf->fragsize) mask |= POLLIN | POLLRDNORM; @@ -2334,8 +2271,7 @@ static unsigned int cs_poll(struct file *file, struct poll_table_struct *wait) } if (file->f_mode & FMODE_WRITE) { state = card->states[1]; - if(state) - { + if (state) { dmabuf = &state->dmabuf; if (dmabuf->mapped) { if (dmabuf->count >= (signed)dmabuf->fragsize) @@ -2364,7 +2300,7 @@ static unsigned int cs_poll(struct file *file, struct poll_table_struct *wait) static int cs_mmap(struct file *file, struct vm_area_struct *vma) { - struct cs_card *card = (struct cs_card *)file->private_data; + struct cs_card *card = file->private_data; struct cs_state *state; struct dmabuf *dmabuf; int ret = 0; @@ -2376,8 +2312,7 @@ static int cs_mmap(struct file *file, struct vm_area_struct *vma) if (vma->vm_flags & VM_WRITE) { state = card->states[1]; - if(state) - { + if (state) { CS_DBGOUT(CS_OPEN, 2, printk( "cs46xx: cs_mmap() VM_WRITE - state TRUE prog_dmabuf DAC\n") ); if ((ret = prog_dmabuf(state)) != 0) @@ -2385,8 +2320,7 @@ static int cs_mmap(struct file *file, struct vm_area_struct *vma) } } else if (vma->vm_flags & VM_READ) { state = card->states[0]; - if(state) - { + if (state) { CS_DBGOUT(CS_OPEN, 2, printk( "cs46xx: cs_mmap() VM_READ - state TRUE prog_dmabuf ADC\n") ); if ((ret = prog_dmabuf(state)) != 0) @@ -2414,8 +2348,7 @@ static int cs_mmap(struct file *file, struct vm_area_struct *vma) mutex_lock(&state->sem); dmabuf = &state->dmabuf; - if (cs4x_pgoff(vma) != 0) - { + if (cs4x_pgoff(vma) != 0) { ret = -EINVAL; goto out; } @@ -2423,15 +2356,13 @@ static int cs_mmap(struct file *file, struct vm_area_struct *vma) CS_DBGOUT(CS_PARMS, 2, printk("cs46xx: cs_mmap(): size=%d\n",(unsigned)size) ); - if (size > (PAGE_SIZE << dmabuf->buforder)) - { + if (size > (PAGE_SIZE << dmabuf->buforder)) { ret = -EINVAL; goto out; } if (remap_pfn_range(vma, vma->vm_start, virt_to_phys(dmabuf->rawbuf) >> PAGE_SHIFT, - size, vma->vm_page_prot)) - { + size, vma->vm_page_prot)) { ret = -EAGAIN; goto out; } @@ -2445,25 +2376,24 @@ out: static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { - struct cs_card *card = (struct cs_card *)file->private_data; + struct cs_card *card = file->private_data; struct cs_state *state; - struct dmabuf *dmabuf=NULL; + struct dmabuf *dmabuf = NULL; unsigned long flags; audio_buf_info abinfo; count_info cinfo; - int val, valsave, mapped, ret; + int val, valsave, ret; + int mapped = 0; void __user *argp = (void __user *)arg; int __user *p = argp; - state = (struct cs_state *)card->states[0]; - if(state) - { + state = card->states[0]; + if (state) { dmabuf = &state->dmabuf; mapped = (file->f_mode & FMODE_READ) && dmabuf->mapped; } - state = (struct cs_state *)card->states[1]; - if(state) - { + state = card->states[1]; + if (state) { dmabuf = &state->dmabuf; mapped |= (file->f_mode & FMODE_WRITE) && dmabuf->mapped; } @@ -2472,17 +2402,14 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un printioctl(cmd); #endif - switch (cmd) - { + switch (cmd) { case OSS_GETVERSION: return put_user(SOUND_VERSION, p); - case SNDCTL_DSP_RESET: /* FIXME: spin_lock ? */ if (file->f_mode & FMODE_WRITE) { - state = (struct cs_state *)card->states[1]; - if(state) - { + state = card->states[1]; + if (state) { dmabuf = &state->dmabuf; stop_dac(state); synchronize_irq(card->irq); @@ -2495,9 +2422,8 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un } } if (file->f_mode & FMODE_READ) { - state = (struct cs_state *)card->states[0]; - if(state) - { + state = card->states[0]; + if (state) { dmabuf = &state->dmabuf; stop_adc(state); synchronize_irq(card->irq); @@ -2511,20 +2437,17 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un } CS_DBGOUT(CS_IOCTL, 2, printk("cs46xx: DSP_RESET()-\n") ); return 0; - case SNDCTL_DSP_SYNC: if (file->f_mode & FMODE_WRITE) return drain_dac(state, file->f_flags & O_NONBLOCK); return 0; - case SNDCTL_DSP_SPEED: /* set sample rate */ if (get_user(val, p)) return -EFAULT; if (val >= 0) { if (file->f_mode & FMODE_READ) { - state = (struct cs_state *)card->states[0]; - if(state) - { + state = card->states[0]; + if (state) { dmabuf = &state->dmabuf; stop_adc(state); dmabuf->ready = 0; @@ -2534,9 +2457,8 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un } } if (file->f_mode & FMODE_WRITE) { - state = (struct cs_state *)card->states[1]; - if(state) - { + state = card->states[1]; + if (state) { dmabuf = &state->dmabuf; stop_dac(state); dmabuf->ready = 0; @@ -2553,19 +2475,17 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un return put_user(dmabuf->rate, p); } return put_user(0, p); - case SNDCTL_DSP_STEREO: /* set stereo or mono channel */ if (get_user(val, p)) return -EFAULT; if (file->f_mode & FMODE_WRITE) { - state = (struct cs_state *)card->states[1]; - if(state) - { + state = card->states[1]; + if (state) { dmabuf = &state->dmabuf; stop_dac(state); dmabuf->ready = 0; dmabuf->SGok = 0; - if(val) + if (val) dmabuf->fmt |= CS_FMT_STEREO; else dmabuf->fmt &= ~CS_FMT_STEREO; @@ -2577,14 +2497,13 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un } } if (file->f_mode & FMODE_READ) { - state = (struct cs_state *)card->states[0]; - if(state) - { + state = card->states[0]; + if (state) { dmabuf = &state->dmabuf; stop_adc(state); dmabuf->ready = 0; dmabuf->SGok = 0; - if(val) + if (val) dmabuf->fmt |= CS_FMT_STEREO; else dmabuf->fmt &= ~CS_FMT_STEREO; @@ -2596,12 +2515,10 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un } } return 0; - case SNDCTL_DSP_GETBLKSIZE: if (file->f_mode & FMODE_WRITE) { - state = (struct cs_state *)card->states[1]; - if(state) - { + state = card->states[1]; + if (state) { dmabuf = &state->dmabuf; if ((val = prog_dmabuf(state))) return val; @@ -2609,9 +2526,8 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un } } if (file->f_mode & FMODE_READ) { - state = (struct cs_state *)card->states[0]; - if(state) - { + state = card->states[0]; + if (state) { dmabuf = &state->dmabuf; if ((val = prog_dmabuf(state))) return val; @@ -2620,10 +2536,8 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un } } return put_user(0, p); - case SNDCTL_DSP_GETFMTS: /* Returns a mask of supported sample format*/ return put_user(AFMT_S16_LE | AFMT_U8, p); - case SNDCTL_DSP_SETFMT: /* Select sample format */ if (get_user(val, p)) return -EFAULT; @@ -2635,88 +2549,75 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un val == AFMT_U8 ? "8Bit Unsigned" : "") ); valsave = val; if (val != AFMT_QUERY) { - if(val==AFMT_S16_LE || val==AFMT_U8) - { + if (val==AFMT_S16_LE || val==AFMT_U8) { if (file->f_mode & FMODE_WRITE) { - state = (struct cs_state *)card->states[1]; - if(state) - { + state = card->states[1]; + if (state) { dmabuf = &state->dmabuf; stop_dac(state); dmabuf->ready = 0; dmabuf->SGok = 0; - if(val==AFMT_S16_LE) + if (val == AFMT_S16_LE) dmabuf->fmt |= CS_FMT_16BIT; else dmabuf->fmt &= ~CS_FMT_16BIT; cs_set_divisor(dmabuf); - if((ret = prog_dmabuf(state))) + if ((ret = prog_dmabuf(state))) return ret; } } if (file->f_mode & FMODE_READ) { val = valsave; - state = (struct cs_state *)card->states[0]; - if(state) - { + state = card->states[0]; + if (state) { dmabuf = &state->dmabuf; stop_adc(state); dmabuf->ready = 0; dmabuf->SGok = 0; - if(val==AFMT_S16_LE) + if (val == AFMT_S16_LE) dmabuf->fmt |= CS_FMT_16BIT; else dmabuf->fmt &= ~CS_FMT_16BIT; cs_set_divisor(dmabuf); - if((ret = prog_dmabuf(state))) + if ((ret = prog_dmabuf(state))) return ret; } } - } - else - { + } else { CS_DBGOUT(CS_IOCTL | CS_ERROR, 2, printk( "cs46xx: DSP_SETFMT() Unsupported format (0x%x)\n", valsave) ); } - } - else - { - if(file->f_mode & FMODE_WRITE) - { - state = (struct cs_state *)card->states[1]; - if(state) + } else { + if (file->f_mode & FMODE_WRITE) { + state = card->states[1]; + if (state) dmabuf = &state->dmabuf; - } - else if(file->f_mode & FMODE_READ) - { - state = (struct cs_state *)card->states[0]; - if(state) + } else if (file->f_mode & FMODE_READ) { + state = card->states[0]; + if (state) dmabuf = &state->dmabuf; } } - if(dmabuf) - { - if(dmabuf->fmt & CS_FMT_16BIT) + if (dmabuf) { + if (dmabuf->fmt & CS_FMT_16BIT) return put_user(AFMT_S16_LE, p); else return put_user(AFMT_U8, p); } return put_user(0, p); - case SNDCTL_DSP_CHANNELS: if (get_user(val, p)) return -EFAULT; if (val != 0) { if (file->f_mode & FMODE_WRITE) { - state = (struct cs_state *)card->states[1]; - if(state) - { + state = card->states[1]; + if (state) { dmabuf = &state->dmabuf; stop_dac(state); dmabuf->ready = 0; dmabuf->SGok = 0; - if(val>1) + if (val > 1) dmabuf->fmt |= CS_FMT_STEREO; else dmabuf->fmt &= ~CS_FMT_STEREO; @@ -2726,14 +2627,13 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un } } if (file->f_mode & FMODE_READ) { - state = (struct cs_state *)card->states[0]; - if(state) - { + state = card->states[0]; + if (state) { dmabuf = &state->dmabuf; stop_adc(state); dmabuf->ready = 0; dmabuf->SGok = 0; - if(val>1) + if (val > 1) dmabuf->fmt |= CS_FMT_STEREO; else dmabuf->fmt &= ~CS_FMT_STEREO; @@ -2745,19 +2645,16 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un } return put_user((dmabuf->fmt & CS_FMT_STEREO) ? 2 : 1, p); - case SNDCTL_DSP_POST: /* * There will be a longer than normal pause in the data. * so... do nothing, because there is nothing that we can do. */ return 0; - case SNDCTL_DSP_SUBDIVIDE: if (file->f_mode & FMODE_WRITE) { - state = (struct cs_state *)card->states[1]; - if(state) - { + state = card->states[1]; + if (state) { dmabuf = &state->dmabuf; if (dmabuf->subdivision) return -EINVAL; @@ -2769,9 +2666,8 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un } } if (file->f_mode & FMODE_READ) { - state = (struct cs_state *)card->states[0]; - if(state) - { + state = card->states[0]; + if (state) { dmabuf = &state->dmabuf; if (dmabuf->subdivision) return -EINVAL; @@ -2783,37 +2679,31 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un } } return 0; - case SNDCTL_DSP_SETFRAGMENT: if (get_user(val, p)) return -EFAULT; - if (file->f_mode & FMODE_WRITE) { - state = (struct cs_state *)card->states[1]; - if(state) - { + state = card->states[1]; + if (state) { dmabuf = &state->dmabuf; dmabuf->ossfragshift = val & 0xffff; dmabuf->ossmaxfrags = (val >> 16) & 0xffff; } } if (file->f_mode & FMODE_READ) { - state = (struct cs_state *)card->states[0]; - if(state) - { + state = card->states[0]; + if (state) { dmabuf = &state->dmabuf; dmabuf->ossfragshift = val & 0xffff; dmabuf->ossmaxfrags = (val >> 16) & 0xffff; } } return 0; - case SNDCTL_DSP_GETOSPACE: if (!(file->f_mode & FMODE_WRITE)) return -EINVAL; - state = (struct cs_state *)card->states[1]; - if(state) - { + state = card->states[1]; + if (state) { dmabuf = &state->dmabuf; spin_lock_irqsave(&state->card->lock, flags); cs_update_ptr(card, CS_TRUE); @@ -2832,13 +2722,11 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un return copy_to_user(argp, &abinfo, sizeof(abinfo)) ? -EFAULT : 0; } return -ENODEV; - case SNDCTL_DSP_GETISPACE: if (!(file->f_mode & FMODE_READ)) return -EINVAL; - state = (struct cs_state *)card->states[0]; - if(state) - { + state = card->states[0]; + if (state) { dmabuf = &state->dmabuf; spin_lock_irqsave(&state->card->lock, flags); cs_update_ptr(card, CS_TRUE); @@ -2850,48 +2738,39 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un return copy_to_user(argp, &abinfo, sizeof(abinfo)) ? -EFAULT : 0; } return -ENODEV; - case SNDCTL_DSP_NONBLOCK: file->f_flags |= O_NONBLOCK; return 0; - case SNDCTL_DSP_GETCAPS: return put_user(DSP_CAP_REALTIME|DSP_CAP_TRIGGER|DSP_CAP_MMAP, p); - case SNDCTL_DSP_GETTRIGGER: val = 0; CS_DBGOUT(CS_IOCTL, 2, printk("cs46xx: DSP_GETTRIGGER()+\n") ); - if (file->f_mode & FMODE_WRITE) - { - state = (struct cs_state *)card->states[1]; - if(state) - { + if (file->f_mode & FMODE_WRITE) { + state = card->states[1]; + if (state) { dmabuf = &state->dmabuf; - if(dmabuf->enable & DAC_RUNNING) + if (dmabuf->enable & DAC_RUNNING) val |= PCM_ENABLE_INPUT; } } - if (file->f_mode & FMODE_READ) - { - if(state) - { - state = (struct cs_state *)card->states[0]; + if (file->f_mode & FMODE_READ) { + if (state) { + state = card->states[0]; dmabuf = &state->dmabuf; - if(dmabuf->enable & ADC_RUNNING) + if (dmabuf->enable & ADC_RUNNING) val |= PCM_ENABLE_OUTPUT; } } CS_DBGOUT(CS_IOCTL, 2, printk("cs46xx: DSP_GETTRIGGER()- val=0x%x\n",val) ); return put_user(val, p); - case SNDCTL_DSP_SETTRIGGER: if (get_user(val, p)) return -EFAULT; if (file->f_mode & FMODE_READ) { - state = (struct cs_state *)card->states[0]; - if(state) - { + state = card->states[0]; + if (state) { dmabuf = &state->dmabuf; if (val & PCM_ENABLE_INPUT) { if (!dmabuf->ready && (ret = prog_dmabuf(state))) @@ -2902,9 +2781,8 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un } } if (file->f_mode & FMODE_WRITE) { - state = (struct cs_state *)card->states[1]; - if(state) - { + state = card->states[1]; + if (state) { dmabuf = &state->dmabuf; if (val & PCM_ENABLE_OUTPUT) { if (!dmabuf->ready && (ret = prog_dmabuf(state))) @@ -2915,13 +2793,11 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un } } return 0; - case SNDCTL_DSP_GETIPTR: if (!(file->f_mode & FMODE_READ)) return -EINVAL; - state = (struct cs_state *)card->states[0]; - if(state) - { + state = card->states[0]; + if (state) { dmabuf = &state->dmabuf; spin_lock_irqsave(&state->card->lock, flags); cs_update_ptr(card, CS_TRUE); @@ -2934,28 +2810,23 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un return 0; } return -ENODEV; - case SNDCTL_DSP_GETOPTR: if (!(file->f_mode & FMODE_WRITE)) return -EINVAL; - state = (struct cs_state *)card->states[1]; - if(state) - { + state = card->states[1]; + if (state) { dmabuf = &state->dmabuf; spin_lock_irqsave(&state->card->lock, flags); cs_update_ptr(card, CS_TRUE); cinfo.bytes = dmabuf->total_bytes; - if (dmabuf->mapped) - { + if (dmabuf->mapped) { cinfo.blocks = (cinfo.bytes >> dmabuf->fragshift) - dmabuf->blocks; CS_DBGOUT(CS_PARMS, 8, printk("total_bytes=%d blocks=%d dmabuf->blocks=%d\n", cinfo.bytes,cinfo.blocks,dmabuf->blocks) ); dmabuf->blocks = cinfo.bytes >> dmabuf->fragshift; - } - else - { + } else { cinfo.blocks = dmabuf->count >> dmabuf->fragshift; } cinfo.ptr = dmabuf->hwptr; @@ -2969,66 +2840,54 @@ static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un return 0; } return -ENODEV; - case SNDCTL_DSP_SETDUPLEX: return 0; - case SNDCTL_DSP_GETODELAY: if (!(file->f_mode & FMODE_WRITE)) return -EINVAL; - state = (struct cs_state *)card->states[1]; - if(state) - { + state = card->states[1]; + if (state) { dmabuf = &state->dmabuf; spin_lock_irqsave(&state->card->lock, flags); cs_update_ptr(card, CS_TRUE); val = dmabuf->count; spin_unlock_irqrestore(&state->card->lock, flags); - } - else + } else val = 0; return put_user(val, p); - case SOUND_PCM_READ_RATE: - if(file->f_mode & FMODE_READ) - state = (struct cs_state *)card->states[0]; + if (file->f_mode & FMODE_READ) + state = card->states[0]; else - state = (struct cs_state *)card->states[1]; - if(state) - { + state = card->states[1]; + if (state) { dmabuf = &state->dmabuf; return put_user(dmabuf->rate, p); } return put_user(0, p); - - case SOUND_PCM_READ_CHANNELS: - if(file->f_mode & FMODE_READ) - state = (struct cs_state *)card->states[0]; + if (file->f_mode & FMODE_READ) + state = card->states[0]; else - state = (struct cs_state *)card->states[1]; - if(state) - { + state = card->states[1]; + if (state) { dmabuf = &state->dmabuf; return put_user((dmabuf->fmt & CS_FMT_STEREO) ? 2 : 1, p); } return put_user(0, p); - case SOUND_PCM_READ_BITS: - if(file->f_mode & FMODE_READ) - state = (struct cs_state *)card->states[0]; + if (file->f_mode & FMODE_READ) + state = card->states[0]; else - state = (struct cs_state *)card->states[1]; - if(state) - { + state = card->states[1]; + if (state) { dmabuf = &state->dmabuf; return put_user((dmabuf->fmt & CS_FMT_16BIT) ? AFMT_S16_LE : AFMT_U8, p); } return put_user(0, p); - case SNDCTL_DSP_MAPINBUF: case SNDCTL_DSP_MAPOUTBUF: case SNDCTL_DSP_SETSYNCRO: @@ -3057,18 +2916,15 @@ static void amp_voyetra(struct cs_card *card, int change) /* Manage the EAPD bit on the Crystal 4297 and the Analog AD1885 */ - int old=card->amplifier; + int old = card->amplifier; card->amplifier+=change; - if(card->amplifier && !old) - { + if (card->amplifier && !old) { /* Turn the EAPD amp on */ cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) | 0x8000); - } - else if(old && !card->amplifier) - { + } else if(old && !card->amplifier) { /* Turn the EAPD amp off */ cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & @@ -3083,25 +2939,21 @@ static void amp_voyetra(struct cs_card *card, int change) static void amp_hercules(struct cs_card *card, int change) { - int old=card->amplifier; - if(!card) - { + int old = card->amplifier; + if (!card) { CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO "cs46xx: amp_hercules() called before initialized.\n")); return; } card->amplifier+=change; - if( (card->amplifier && !old) && !(hercules_egpio_disable)) - { + if ((card->amplifier && !old) && !(hercules_egpio_disable)) { CS_DBGOUT(CS_PARMS, 4, printk(KERN_INFO "cs46xx: amp_hercules() external amp enabled\n")); cs461x_pokeBA0(card, BA0_EGPIODR, EGPIODR_GPOE2); /* enable EGPIO2 output */ cs461x_pokeBA0(card, BA0_EGPIOPTR, EGPIOPTR_GPPT2); /* open-drain on output */ - } - else if(old && !card->amplifier) - { + } else if (old && !card->amplifier) { CS_DBGOUT(CS_PARMS, 4, printk(KERN_INFO "cs46xx: amp_hercules() external amp disabled\n")); cs461x_pokeBA0(card, BA0_EGPIODR, 0); /* disable */ @@ -3124,31 +2976,28 @@ static void clkrun_hack(struct cs_card *card, int change) u16 control; u8 pp; unsigned long port; - int old=card->active; + int old = card->active; card->active+=change; acpi_dev = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, NULL); - if(acpi_dev == NULL) + if (acpi_dev == NULL) return; /* Not a thinkpad thats for sure */ /* Find the control port */ pci_read_config_byte(acpi_dev, 0x41, &pp); - port=pp<<8; + port = pp << 8; /* Read ACPI port */ - control=inw(port+0x10); + control = inw(port + 0x10); /* Flip CLKRUN off while running */ - if(!card->active && old) - { + if (!card->active && old) { CS_DBGOUT(CS_PARMS , 9, printk( KERN_INFO "cs46xx: clkrun() enable clkrun - change=%d active=%d\n", change,card->active)); outw(control|0x2000, port+0x10); - } - else - { + } else { /* * sometimes on a resume the bit is set, so always reset the bit. */ @@ -3162,20 +3011,19 @@ static void clkrun_hack(struct cs_card *card, int change) static int cs_open(struct inode *inode, struct file *file) { - struct cs_card *card = (struct cs_card *)file->private_data; + struct cs_card *card = file->private_data; struct cs_state *state = NULL; struct dmabuf *dmabuf = NULL; struct list_head *entry; unsigned int minor = iminor(inode); - int ret=0; + int ret = 0; unsigned int tmp; CS_DBGOUT(CS_OPEN | CS_FUNCTION, 2, printk("cs46xx: cs_open()+ file=%p %s %s\n", file, file->f_mode & FMODE_WRITE ? "FMODE_WRITE" : "", file->f_mode & FMODE_READ ? "FMODE_READ" : "") ); - list_for_each(entry, &cs46xx_devs) - { + list_for_each(entry, &cs46xx_devs) { card = list_entry(entry, struct cs_card, list); if (!((card->dev_audio ^ minor) & ~0xf)) @@ -3192,11 +3040,10 @@ static int cs_open(struct inode *inode, struct file *file) /* * hardcode state[0] for capture, [1] for playback */ - if(file->f_mode & FMODE_READ) - { + if (file->f_mode & FMODE_READ) { CS_DBGOUT(CS_WAVE_READ, 2, printk("cs46xx: cs_open() FMODE_READ\n") ); if (card->states[0] == NULL) { - state = card->states[0] = (struct cs_state *) + state = card->states[0] = kmalloc(sizeof(struct cs_state), GFP_KERNEL); if (state == NULL) return -ENOMEM; @@ -3204,36 +3051,32 @@ static int cs_open(struct inode *inode, struct file *file) mutex_init(&state->sem); dmabuf = &state->dmabuf; dmabuf->pbuf = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA); - if(dmabuf->pbuf==NULL) - { + if (dmabuf->pbuf == NULL) { kfree(state); - card->states[0]=NULL; + card->states[0] = NULL; return -ENOMEM; } - } - else - { + } else { state = card->states[0]; - if(state->open_mode & FMODE_READ) + if (state->open_mode & FMODE_READ) return -EBUSY; } dmabuf->channel = card->alloc_rec_pcm_channel(card); if (dmabuf->channel == NULL) { - kfree (card->states[0]); + kfree(card->states[0]); card->states[0] = NULL; return -ENODEV; } /* Now turn on external AMP if needed */ state->card = card; - state->card->active_ctrl(state->card,1); - state->card->amplifier_ctrl(state->card,1); + state->card->active_ctrl(state->card, 1); + state->card->amplifier_ctrl(state->card, 1); - if( (tmp = cs46xx_powerup(card, CS_POWER_ADC)) ) - { + if ((tmp = cs46xx_powerup(card, CS_POWER_ADC))) { CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO - "cs46xx: cs46xx_powerup of ADC failed (0x%x)\n",tmp) ); + "cs46xx: cs46xx_powerup of ADC failed (0x%x)\n", tmp)); return -EIO; } @@ -3263,11 +3106,10 @@ static int cs_open(struct inode *inode, struct file *file) state->open_mode |= FMODE_READ; mutex_unlock(&state->open_mutex); } - if(file->f_mode & FMODE_WRITE) - { + if (file->f_mode & FMODE_WRITE) { CS_DBGOUT(CS_OPEN, 2, printk("cs46xx: cs_open() FMODE_WRITE\n") ); if (card->states[1] == NULL) { - state = card->states[1] = (struct cs_state *) + state = card->states[1] = kmalloc(sizeof(struct cs_state), GFP_KERNEL); if (state == NULL) return -ENOMEM; @@ -3275,36 +3117,32 @@ static int cs_open(struct inode *inode, struct file *file) mutex_init(&state->sem); dmabuf = &state->dmabuf; dmabuf->pbuf = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA); - if(dmabuf->pbuf==NULL) - { + if (dmabuf->pbuf == NULL) { kfree(state); - card->states[1]=NULL; + card->states[1] = NULL; return -ENOMEM; } - } - else - { + } else { state = card->states[1]; - if(state->open_mode & FMODE_WRITE) + if (state->open_mode & FMODE_WRITE) return -EBUSY; } dmabuf->channel = card->alloc_pcm_channel(card); if (dmabuf->channel == NULL) { - kfree (card->states[1]); + kfree(card->states[1]); card->states[1] = NULL; return -ENODEV; } /* Now turn on external AMP if needed */ state->card = card; - state->card->active_ctrl(state->card,1); - state->card->amplifier_ctrl(state->card,1); + state->card->active_ctrl(state->card, 1); + state->card->amplifier_ctrl(state->card, 1); - if( (tmp = cs46xx_powerup(card, CS_POWER_DAC)) ) - { + if ((tmp = cs46xx_powerup(card, CS_POWER_DAC))) { CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO - "cs46xx: cs46xx_powerup of DAC failed (0x%x)\n",tmp) ); + "cs46xx: cs46xx_powerup of DAC failed (0x%x)\n", tmp)); return -EIO; } @@ -3333,33 +3171,29 @@ static int cs_open(struct inode *inode, struct file *file) state->open_mode |= FMODE_WRITE; mutex_unlock(&state->open_mutex); - if((ret = prog_dmabuf(state))) + if ((ret = prog_dmabuf(state))) return ret; } - CS_DBGOUT(CS_OPEN | CS_FUNCTION, 2, printk("cs46xx: cs_open()- 0\n") ); + CS_DBGOUT(CS_OPEN | CS_FUNCTION, 2, printk("cs46xx: cs_open()- 0\n")); return nonseekable_open(inode, file); } static int cs_release(struct inode *inode, struct file *file) { - struct cs_card *card = (struct cs_card *)file->private_data; + struct cs_card *card = file->private_data; struct dmabuf *dmabuf; struct cs_state *state; unsigned int tmp; CS_DBGOUT(CS_RELEASE | CS_FUNCTION, 2, printk("cs46xx: cs_release()+ file=%p %s %s\n", file, file->f_mode & FMODE_WRITE ? "FMODE_WRITE" : "", - file->f_mode & FMODE_READ ? "FMODE_READ" : "") ); + file->f_mode & FMODE_READ ? "FMODE_READ" : "")); if (!(file->f_mode & (FMODE_WRITE | FMODE_READ))) - { return -EINVAL; - } state = card->states[1]; - if(state) - { - if ( (state->open_mode & FMODE_WRITE) & (file->f_mode & FMODE_WRITE) ) - { - CS_DBGOUT(CS_RELEASE, 2, printk("cs46xx: cs_release() FMODE_WRITE\n") ); + if (state) { + if ((state->open_mode & FMODE_WRITE) & (file->f_mode & FMODE_WRITE)) { + CS_DBGOUT(CS_RELEASE, 2, printk("cs46xx: cs_release() FMODE_WRITE\n")); dmabuf = &state->dmabuf; cs_clear_tail(state); drain_dac(state, file->f_flags & O_NONBLOCK); @@ -3375,8 +3209,7 @@ static int cs_release(struct inode *inode, struct file *file) state->card->states[state->virt] = NULL; state->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE); - if( (tmp = cs461x_powerdown(card, CS_POWER_DAC, CS_FALSE )) ) - { + if ((tmp = cs461x_powerdown(card, CS_POWER_DAC, CS_FALSE))) { CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO "cs46xx: cs_release_mixdev() powerdown DAC failure (0x%x)\n",tmp) ); } @@ -3384,17 +3217,14 @@ static int cs_release(struct inode *inode, struct file *file) /* Now turn off external AMP if needed */ state->card->amplifier_ctrl(state->card, -1); state->card->active_ctrl(state->card, -1); - kfree(state); } } state = card->states[0]; - if(state) - { - if ( (state->open_mode & FMODE_READ) & (file->f_mode & FMODE_READ) ) - { - CS_DBGOUT(CS_RELEASE, 2, printk("cs46xx: cs_release() FMODE_READ\n") ); + if (state) { + if ((state->open_mode & FMODE_READ) & (file->f_mode & FMODE_READ)) { + CS_DBGOUT(CS_RELEASE, 2, printk("cs46xx: cs_release() FMODE_READ\n")); dmabuf = &state->dmabuf; mutex_lock(&state->open_mutex); stop_adc(state); @@ -3407,8 +3237,7 @@ static int cs_release(struct inode *inode, struct file *file) state->card->states[state->virt] = NULL; state->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE); - if( (tmp = cs461x_powerdown(card, CS_POWER_ADC, CS_FALSE )) ) - { + if ((tmp = cs461x_powerdown(card, CS_POWER_ADC, CS_FALSE))) { CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO "cs46xx: cs_release_mixdev() powerdown ADC failure (0x%x)\n",tmp) ); } @@ -3416,12 +3245,11 @@ static int cs_release(struct inode *inode, struct file *file) /* Now turn off external AMP if needed */ state->card->amplifier_ctrl(state->card, -1); state->card->active_ctrl(state->card, -1); - kfree(state); } } - CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 2, printk("cs46xx: cs_release()- 0\n") ); + CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 2, printk("cs46xx: cs_release()- 0\n")); return 0; } @@ -3474,21 +3302,18 @@ static void cs46xx_ac97_suspend(struct cs_card *card) CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_suspend()+\n")); - if(card->states[1]) - { + if (card->states[1]) { stop_dac(card->states[1]); resync_dma_ptrs(card->states[1]); } - if(card->states[0]) - { + if (card->states[0]) { stop_adc(card->states[0]); resync_dma_ptrs(card->states[0]); } - for(Count = 0x2, i=0; (Count <= CS46XX_AC97_HIGHESTREGTORESTORE) - && (i < CS46XX_AC97_NUMBER_RESTORE_REGS); - Count += 2, i++) - { + for (Count = 0x2, i = 0; (Count <= CS46XX_AC97_HIGHESTREGTORESTORE) + && (i < CS46XX_AC97_NUMBER_RESTORE_REGS); + Count += 2, i++) { card->pm.ac97[i] = cs_ac97_get(dev, BA0_AC97_RESET + Count); } /* @@ -3522,11 +3347,10 @@ static void cs46xx_ac97_suspend(struct cs_card *card) * well, for now, only power down the DAC/ADC and MIXER VREFON components. * trouble with removing VREF. */ - if( (tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC | - CS_POWER_MIXVON, CS_TRUE )) ) - { + if ((tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC | + CS_POWER_MIXVON, CS_TRUE))) { CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO - "cs46xx: cs46xx_ac97_suspend() failure (0x%x)\n",tmp) ); + "cs46xx: cs46xx_ac97_suspend() failure (0x%x)\n",tmp)); } CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_suspend()-\n")); @@ -3566,16 +3390,13 @@ static void cs46xx_ac97_resume(struct cs_card *card) * Restore just the first set of registers, from register number * 0x02 to the register number that ulHighestRegToRestore specifies. */ - for( Count = 0x2, i=0; - (Count <= CS46XX_AC97_HIGHESTREGTORESTORE) - && (i < CS46XX_AC97_NUMBER_RESTORE_REGS); - Count += 2, i++) - { + for (Count = 0x2, i=0; (Count <= CS46XX_AC97_HIGHESTREGTORESTORE) && + (i < CS46XX_AC97_NUMBER_RESTORE_REGS); Count += 2, i++) { cs_ac97_set(dev, (u8)(BA0_AC97_RESET + Count), (u16)card->pm.ac97[i]); } /* Check if we have to init the amplifier */ - if(card->amp_init) + if (card->amp_init) card->amp_init(card); CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_resume()-\n")); @@ -3585,30 +3406,27 @@ static void cs46xx_ac97_resume(struct cs_card *card) static int cs46xx_restart_part(struct cs_card *card) { struct dmabuf *dmabuf; + CS_DBGOUT(CS_PM | CS_FUNCTION, 4, printk( "cs46xx: cs46xx_restart_part()+\n")); - if(card->states[1]) - { + if (card->states[1]) { dmabuf = &card->states[1]->dmabuf; dmabuf->ready = 0; resync_dma_ptrs(card->states[1]); cs_set_divisor(dmabuf); - if(__prog_dmabuf(card->states[1])) - { + if (__prog_dmabuf(card->states[1])) { CS_DBGOUT(CS_PM | CS_ERROR, 1, printk("cs46xx: cs46xx_restart_part()- (-1) prog_dmabuf() dac error\n")); return -1; } cs_set_dac_rate(card->states[1], dmabuf->rate); } - if(card->states[0]) - { + if (card->states[0]) { dmabuf = &card->states[0]->dmabuf; dmabuf->ready = 0; resync_dma_ptrs(card->states[0]); cs_set_divisor(dmabuf); - if(__prog_dmabuf(card->states[0])) - { + if (__prog_dmabuf(card->states[0])) { CS_DBGOUT(CS_PM | CS_ERROR, 1, printk("cs46xx: cs46xx_restart_part()- (-1) prog_dmabuf() adc error\n")); return -1; @@ -3616,17 +3434,17 @@ static int cs46xx_restart_part(struct cs_card *card) cs_set_adc_rate(card->states[0], dmabuf->rate); } card->pm.flags |= CS46XX_PM_RESUMED; - if(card->states[0]) + if (card->states[0]) start_adc(card->states[0]); - if(card->states[1]) + if (card->states[1]) start_dac(card->states[1]); card->pm.flags |= CS46XX_PM_IDLE; card->pm.flags &= ~(CS46XX_PM_SUSPENDING | CS46XX_PM_SUSPENDED | CS46XX_PM_RESUMING | CS46XX_PM_RESUMED); - if(card->states[0]) + if (card->states[0]) wake_up(&card->states[0]->dmabuf.wait); - if(card->states[1]) + if (card->states[1]) wake_up(&card->states[1]->dmabuf.wait); CS_DBGOUT(CS_PM | CS_FUNCTION, 4, @@ -3634,20 +3452,19 @@ static int cs46xx_restart_part(struct cs_card *card) return 0; } - static void cs461x_reset(struct cs_card *card); static void cs461x_proc_stop(struct cs_card *card); static int cs46xx_suspend(struct cs_card *card, pm_message_t state) { unsigned int tmp; + CS_DBGOUT(CS_PM | CS_FUNCTION, 4, printk("cs46xx: cs46xx_suspend()+ flags=0x%x s=%p\n", (unsigned)card->pm.flags,card)); /* * check the current state, only suspend if IDLE */ - if(!(card->pm.flags & CS46XX_PM_IDLE)) - { + if (!(card->pm.flags & CS46XX_PM_IDLE)) { CS_DBGOUT(CS_PM | CS_ERROR, 2, printk("cs46xx: cs46xx_suspend() unable to suspend, not IDLE\n")); return 1; @@ -3679,13 +3496,11 @@ static int cs46xx_suspend(struct cs_card *card, pm_message_t state) tmp = cs461x_peek(card, BA1_CCTL); cs461x_poke(card, BA1_CCTL, tmp & 0xffff0000); - if(card->states[1]) - { + if (card->states[1]) { card->pm.dmabuf_swptr_play = card->states[1]->dmabuf.swptr; card->pm.dmabuf_count_play = card->states[1]->dmabuf.count; } - if(card->states[0]) - { + if (card->states[0]) { card->pm.dmabuf_swptr_capture = card->states[0]->dmabuf.swptr; card->pm.dmabuf_count_capture = card->states[0]->dmabuf.count; } @@ -3736,8 +3551,7 @@ static int cs46xx_resume(struct cs_card *card) CS_DBGOUT(CS_PM | CS_FUNCTION, 4, printk( "cs46xx: cs46xx_resume()+ flags=0x%x\n", (unsigned)card->pm.flags)); - if(!(card->pm.flags & CS46XX_PM_SUSPENDED)) - { + if (!(card->pm.flags & CS46XX_PM_SUSPENDED)) { CS_DBGOUT(CS_PM | CS_ERROR, 2, printk("cs46xx: cs46xx_resume() unable to resume, not SUSPENDED\n")); return 1; @@ -3747,10 +3561,8 @@ static int cs46xx_resume(struct cs_card *card) printpm(card); card->active_ctrl(card, 1); - for(i=0;i<5;i++) - { - if (cs_hardware_init(card) != 0) - { + for (i = 0; i < 5; i++) { + if (cs_hardware_init(card) != 0) { CS_DBGOUT(CS_PM | CS_ERROR, 4, printk( "cs46xx: cs46xx_resume()- ERROR in cs_hardware_init()\n")); mdelay(10 * cs_laptop_wait); @@ -3759,15 +3571,13 @@ static int cs46xx_resume(struct cs_card *card) } break; } - if(i>=4) - { + if (i >= 4) { CS_DBGOUT(CS_PM | CS_ERROR, 1, printk( "cs46xx: cs46xx_resume()- cs_hardware_init() failed, retried %d times.\n",i)); return 0; } - if(cs46xx_restart_part(card)) - { + if (cs46xx_restart_part(card)) { CS_DBGOUT(CS_PM | CS_ERROR, 4, printk( "cs46xx: cs46xx_resume(): cs46xx_restart_part() returned error\n")); } @@ -3835,7 +3645,7 @@ static u16 _cs_ac97_get(struct ac97_codec *dev, u8 reg) /* * Wait for the read to occur. */ - if(!(card->pm.flags & CS46XX_PM_IDLE)) + if (!(card->pm.flags & CS46XX_PM_IDLE)) loopcnt = 2000; else loopcnt = 500 * cs_laptop_wait; @@ -3866,7 +3676,7 @@ static u16 _cs_ac97_get(struct ac97_codec *dev, u8 reg) * Wait for the valid status bit to go active. */ - if(!(card->pm.flags & CS46XX_PM_IDLE)) + if (!(card->pm.flags & CS46XX_PM_IDLE)) loopcnt = 2000; else loopcnt = 1000; @@ -3885,7 +3695,7 @@ static u16 _cs_ac97_get(struct ac97_codec *dev, u8 reg) /* * Make sure we got valid status. */ - if (!( (tmp=cs461x_peekBA0(card, BA0_ACSTS)) & ACSTS_VSTS)) { + if (!((tmp = cs461x_peekBA0(card, BA0_ACSTS)) & ACSTS_VSTS)) { CS_DBGOUT(CS_ERROR, 2, printk(KERN_WARNING "cs46xx: AC'97 read problem (ACSTS_VSTS), reg = 0x%x val=0x%x 0xffff \n", reg, tmp)); @@ -3923,12 +3733,9 @@ static void cs_ac97_set(struct ac97_codec *dev, u8 reg, u16 val) spin_lock(&card->ac97_lock); - if(reg == AC97_CD_VOL) - { + if (reg == AC97_CD_VOL) val2 = _cs_ac97_get(dev, AC97_CD_VOL); - } - - + /* * 1. Write ACCAD = Command Address Register = 46Ch for AC97 register address * 2. Write ACCDA = Command Data Register = 470h for data to write to AC97 @@ -3970,8 +3777,7 @@ static void cs_ac97_set(struct ac97_codec *dev, u8 reg, u16 val) /* * Make sure the write completed. */ - if (cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV) - { + if (cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV) { CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING "cs46xx: AC'97 write problem, reg = 0x%x, val = 0x%x\n", reg, val)); } @@ -3998,25 +3804,23 @@ static void cs_ac97_set(struct ac97_codec *dev, u8 reg, u16 val) /* CD mute change ? */ - if(reg==AC97_CD_VOL) - { + if (reg == AC97_CD_VOL) { /* Mute bit change ? */ - if((val2^val)&0x8000 || ((val2 == 0x1f1f || val == 0x1f1f) && val2 != val)) - { + if ((val2^val) & 0x8000 || + ((val2 == 0x1f1f || val == 0x1f1f) && val2 != val)) { /* This is a hack but its cleaner than the alternatives. Right now card->ac97_codec[0] might be NULL as we are still doing codec setup. This does an early assignment to avoid the problem if it occurs */ - if(card->ac97_codec[0]==NULL) - card->ac97_codec[0]=dev; + if (card->ac97_codec[0] == NULL) + card->ac97_codec[0] = dev; /* Mute on */ - if(val&0x8000 || val == 0x1f1f) + if (val & 0x8000 || val == 0x1f1f) card->amplifier_ctrl(card, -1); - else /* Mute off power on */ - { - if(card->amp_init) + else { /* Mute off power on */ + if (card->amp_init) card->amp_init(card); card->amplifier_ctrl(card, 1); } @@ -4024,46 +3828,41 @@ static void cs_ac97_set(struct ac97_codec *dev, u8 reg, u16 val) } } - /* OSS /dev/mixer file operation methods */ static int cs_open_mixdev(struct inode *inode, struct file *file) { - int i=0; + int i = 0; unsigned int minor = iminor(inode); - struct cs_card *card=NULL; + struct cs_card *card = NULL; struct list_head *entry; unsigned int tmp; CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4, printk(KERN_INFO "cs46xx: cs_open_mixdev()+\n")); - list_for_each(entry, &cs46xx_devs) - { + list_for_each(entry, &cs46xx_devs) { card = list_entry(entry, struct cs_card, list); for (i = 0; i < NR_AC97; i++) if (card->ac97_codec[i] != NULL && card->ac97_codec[i]->dev_mixer == minor) goto match; } - if (!card) - { + if (!card) { CS_DBGOUT(CS_FUNCTION | CS_OPEN | CS_ERROR, 2, printk(KERN_INFO "cs46xx: cs46xx_open_mixdev()- -ENODEV\n")); return -ENODEV; } match: - if(!card->ac97_codec[i]) + if (!card->ac97_codec[i]) return -ENODEV; file->private_data = card->ac97_codec[i]; card->active_ctrl(card,1); - if(!CS_IN_USE(&card->mixer_use_cnt)) - { - if( (tmp = cs46xx_powerup(card, CS_POWER_MIXVON )) ) - { + if (!CS_IN_USE(&card->mixer_use_cnt)) { + if ((tmp = cs46xx_powerup(card, CS_POWER_MIXVON))) { CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO - "cs46xx: cs_open_mixdev() powerup failure (0x%x)\n",tmp) ); + "cs46xx: cs_open_mixdev() powerup failure (0x%x)\n", tmp)); return -EIO; } } @@ -4077,7 +3876,7 @@ static int cs_open_mixdev(struct inode *inode, struct file *file) static int cs_release_mixdev(struct inode *inode, struct file *file) { unsigned int minor = iminor(inode); - struct cs_card *card=NULL; + struct cs_card *card = NULL; struct list_head *entry; int i; unsigned int tmp; @@ -4092,15 +3891,13 @@ static int cs_release_mixdev(struct inode *inode, struct file *file) card->ac97_codec[i]->dev_mixer == minor) goto match; } - if (!card) - { + if (!card) { CS_DBGOUT(CS_FUNCTION | CS_OPEN | CS_ERROR, 2, printk(KERN_INFO "cs46xx: cs46xx_open_mixdev()- -ENODEV\n")); return -ENODEV; } match: - if(!CS_DEC_AND_TEST(&card->mixer_use_cnt)) - { + if (!CS_DEC_AND_TEST(&card->mixer_use_cnt)) { CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 4, printk(KERN_INFO "cs46xx: cs_release_mixdev()- no powerdown, usecnt>0\n")); card->active_ctrl(card, -1); @@ -4110,10 +3907,9 @@ match: /* * ok, no outstanding mixer opens, so powerdown. */ - if( (tmp = cs461x_powerdown(card, CS_POWER_MIXVON, CS_FALSE )) ) - { + if ((tmp = cs461x_powerdown(card, CS_POWER_MIXVON, CS_FALSE))) { CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO - "cs46xx: cs_release_mixdev() powerdown MIXVON failure (0x%x)\n",tmp) ); + "cs46xx: cs_release_mixdev() powerdown MIXVON failure (0x%x)\n", tmp)); card->active_ctrl(card, -1); card->amplifier_ctrl(card, -1); return -EIO; @@ -4126,76 +3922,60 @@ match: } static int cs_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd, - unsigned long arg) + unsigned long arg) { - struct ac97_codec *codec = (struct ac97_codec *)file->private_data; - struct cs_card *card=NULL; + struct ac97_codec *codec = file->private_data; + struct cs_card *card = NULL; struct list_head *entry; unsigned long __user *p = (long __user *)arg; - #if CSDEBUG_INTERFACE int val; - if( (cmd == SOUND_MIXER_CS_GETDBGMASK) || + if ( (cmd == SOUND_MIXER_CS_GETDBGMASK) || (cmd == SOUND_MIXER_CS_SETDBGMASK) || (cmd == SOUND_MIXER_CS_GETDBGLEVEL) || (cmd == SOUND_MIXER_CS_SETDBGLEVEL) || - (cmd == SOUND_MIXER_CS_APM)) - { - switch(cmd) - { - + (cmd == SOUND_MIXER_CS_APM)) { + switch (cmd) { case SOUND_MIXER_CS_GETDBGMASK: return put_user(cs_debugmask, p); - case SOUND_MIXER_CS_GETDBGLEVEL: return put_user(cs_debuglevel, p); - case SOUND_MIXER_CS_SETDBGMASK: if (get_user(val, p)) return -EFAULT; cs_debugmask = val; return 0; - case SOUND_MIXER_CS_SETDBGLEVEL: if (get_user(val, p)) return -EFAULT; cs_debuglevel = val; return 0; - case SOUND_MIXER_CS_APM: if (get_user(val, p)) return -EFAULT; - if(val == CS_IOCTL_CMD_SUSPEND) - { - list_for_each(entry, &cs46xx_devs) - { + if (val == CS_IOCTL_CMD_SUSPEND) { + list_for_each(entry, &cs46xx_devs) { card = list_entry(entry, struct cs_card, list); cs46xx_suspend(card, PMSG_ON); } - } - else if(val == CS_IOCTL_CMD_RESUME) - { - list_for_each(entry, &cs46xx_devs) - { + } else if (val == CS_IOCTL_CMD_RESUME) { + list_for_each(entry, &cs46xx_devs) { card = list_entry(entry, struct cs_card, list); cs46xx_resume(card); } - } - else - { + } else { CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO "cs46xx: mixer_ioctl(): invalid APM cmd (%d)\n", val)); } return 0; - default: CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO - "cs46xx: mixer_ioctl(): ERROR unknown debug cmd\n") ); + "cs46xx: mixer_ioctl(): ERROR unknown debug cmd\n")); return 0; - } + } } #endif return codec->mixer_ioctl(codec, cmd, arg); @@ -4232,8 +4012,7 @@ static int __init cs_ac97_init(struct cs_card *card) codec->codec_read = cs_ac97_get; codec->codec_write = cs_ac97_set; - if (ac97_probe_codec(codec) == 0) - { + if (ac97_probe_codec(codec) == 0) { CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO "cs46xx: cs_ac97_init()- codec number %d not found\n", num_ac97) ); @@ -4241,12 +4020,11 @@ static int __init cs_ac97_init(struct cs_card *card) break; } CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO - "cs46xx: cs_ac97_init() found codec %d\n",num_ac97) ); + "cs46xx: cs_ac97_init() found codec %d\n",num_ac97)); eid = cs_ac97_get(codec, AC97_EXTENDED_ID); - if(eid==0xFFFF) - { + if (eid == 0xFFFF) { printk(KERN_WARNING "cs46xx: codec %d not present\n",num_ac97); ac97_release_codec(codec); break; @@ -4285,27 +4063,23 @@ static void cs461x_download_image(struct cs_card *card) { unsigned i, j, temp1, temp2, offset, count; unsigned char __iomem *pBA1 = ioremap(card->ba1_addr, 0x40000); - for( i=0; i < CLEAR__COUNT; i++) - { + for (i = 0; i < CLEAR__COUNT; i++) { offset = ClrStat[i].BA1__DestByteOffset; count = ClrStat[i].BA1__SourceSize; - for( temp1 = offset; temp1<(offset+count); temp1+=4 ) + for (temp1 = offset; temp1 < (offset + count); temp1 += 4) writel(0, pBA1+temp1); } - for(i=0; iac97_codec[0], AC97_POWER_CONTROL); - if (tmp & CS_AC97_POWER_CONTROL_MIXVOFF_ON) - { - if(!muted) - { + if (tmp & CS_AC97_POWER_CONTROL_MIXVOFF_ON) { + if (!muted) { cs_mute(card, CS_TRUE); - muted=1; + muted = 1; } tmp |= CS_AC97_POWER_CONTROL_MIXVOFF; cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp ); @@ -4492,16 +4259,14 @@ static int cs461x_powerdown(struct cs_card *card, unsigned int type, int suspend * Check the status.. */ if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & - CS_AC97_POWER_CONTROL_MIXVOFF_ON) - { + CS_AC97_POWER_CONTROL_MIXVOFF_ON) { CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING "cs46xx: powerdown MIXVOFF failed\n")); return 1; } } } - if(type & CS_POWER_MIXVON) - { + if (type & CS_POWER_MIXVON) { CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO "cs46xx: cs461x_powerdown()+ MIXVON\n")); @@ -4509,15 +4274,13 @@ static int cs461x_powerdown(struct cs_card *card, unsigned int type, int suspend * Power down the MIXER (VREF ON) on the AC97 card. */ tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL); - if (tmp & CS_AC97_POWER_CONTROL_MIXVON_ON) - { - if(!muted) - { + if (tmp & CS_AC97_POWER_CONTROL_MIXVON_ON) { + if (!muted) { cs_mute(card, CS_TRUE); - muted=1; + muted = 1; } tmp |= CS_AC97_POWER_CONTROL_MIXVON; - cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp ); + cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp); /* * Now, we wait until we sample a ready state. */ @@ -4540,30 +4303,26 @@ static int cs461x_powerdown(struct cs_card *card, unsigned int type, int suspend * Check the status.. */ if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & - CS_AC97_POWER_CONTROL_MIXVON_ON) - { + CS_AC97_POWER_CONTROL_MIXVON_ON) { CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING "cs46xx: powerdown MIXVON failed\n")); return 1; } } } - if(type & CS_POWER_ADC) - { + if (type & CS_POWER_ADC) { /* * Power down the ADC on the AC97 card. */ CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO "cs46xx: cs461x_powerdown()+ ADC\n")); tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL); - if (tmp & CS_AC97_POWER_CONTROL_ADC_ON) - { - if(!muted) - { + if (tmp & CS_AC97_POWER_CONTROL_ADC_ON) { + if (!muted) { cs_mute(card, CS_TRUE); - muted=1; + muted = 1; } tmp |= CS_AC97_POWER_CONTROL_ADC; - cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp ); + cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp); /* * Now, we wait until we sample a ready state. @@ -4587,16 +4346,14 @@ static int cs461x_powerdown(struct cs_card *card, unsigned int type, int suspend * Check the status.. */ if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & - CS_AC97_POWER_CONTROL_ADC_ON) - { + CS_AC97_POWER_CONTROL_ADC_ON) { CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING "cs46xx: powerdown ADC failed\n")); return 1; } } } - if(type & CS_POWER_DAC) - { + if (type & CS_POWER_DAC) { /* * Power down the DAC on the AC97 card. */ @@ -4604,15 +4361,13 @@ static int cs461x_powerdown(struct cs_card *card, unsigned int type, int suspend CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO "cs46xx: cs461x_powerdown()+ DAC\n")); tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL); - if (tmp & CS_AC97_POWER_CONTROL_DAC_ON) - { - if(!muted) - { + if (tmp & CS_AC97_POWER_CONTROL_DAC_ON) { + if (!muted) { cs_mute(card, CS_TRUE); - muted=1; + muted = 1; } tmp |= CS_AC97_POWER_CONTROL_DAC; - cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp ); + cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp); /* * Now, we wait until we sample a ready state. */ @@ -4635,8 +4390,7 @@ static int cs461x_powerdown(struct cs_card *card, unsigned int type, int suspend * Check the status.. */ if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & - CS_AC97_POWER_CONTROL_DAC_ON) - { + CS_AC97_POWER_CONTROL_DAC_ON) { CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING "cs46xx: powerdown DAC failed\n")); return 1; @@ -4644,7 +4398,7 @@ static int cs461x_powerdown(struct cs_card *card, unsigned int type, int suspend } } tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL); - if(muted) + if (muted) cs_mute(card, CS_FALSE); CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO "cs46xx: cs461x_powerdown()- 0 tmp=0x%x\n",tmp)); @@ -4654,23 +4408,22 @@ static int cs461x_powerdown(struct cs_card *card, unsigned int type, int suspend static int cs46xx_powerup(struct cs_card *card, unsigned int type) { int count; - unsigned int tmp=0,muted=0; + unsigned int tmp = 0, muted = 0; CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO "cs46xx: cs46xx_powerup()+ type=0x%x\n",type)); /* * check for VREF and powerup if need to. */ - if(type & CS_POWER_MIXVON) + if (type & CS_POWER_MIXVON) type |= CS_POWER_MIXVOFF; - if(type & (CS_POWER_DAC | CS_POWER_ADC)) + if (type & (CS_POWER_DAC | CS_POWER_ADC)) type |= CS_POWER_MIXVON | CS_POWER_MIXVOFF; /* * Power up indicated areas. */ - if(type & CS_POWER_MIXVOFF) - { + if (type & CS_POWER_MIXVOFF) { CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO "cs46xx: cs46xx_powerup()+ MIXVOFF\n")); @@ -4678,12 +4431,10 @@ static int cs46xx_powerup(struct cs_card *card, unsigned int type) * Power up the MIXER (VREF ON) on the AC97 card. */ tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL); - if (!(tmp & CS_AC97_POWER_CONTROL_MIXVOFF_ON)) - { - if(!muted) - { + if (!(tmp & CS_AC97_POWER_CONTROL_MIXVOFF_ON)) { + if (!muted) { cs_mute(card, CS_TRUE); - muted=1; + muted = 1; } tmp &= ~CS_AC97_POWER_CONTROL_MIXVOFF; cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp ); @@ -4709,16 +4460,14 @@ static int cs46xx_powerup(struct cs_card *card, unsigned int type) * Check the status.. */ if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & - CS_AC97_POWER_CONTROL_MIXVOFF_ON)) - { + CS_AC97_POWER_CONTROL_MIXVOFF_ON)) { CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING "cs46xx: powerup MIXVOFF failed\n")); return 1; } } } - if(type & CS_POWER_MIXVON) - { + if(type & CS_POWER_MIXVON) { CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO "cs46xx: cs46xx_powerup()+ MIXVON\n")); @@ -4726,12 +4475,10 @@ static int cs46xx_powerup(struct cs_card *card, unsigned int type) * Power up the MIXER (VREF ON) on the AC97 card. */ tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL); - if (!(tmp & CS_AC97_POWER_CONTROL_MIXVON_ON)) - { - if(!muted) - { + if (!(tmp & CS_AC97_POWER_CONTROL_MIXVON_ON)) { + if (!muted) { cs_mute(card, CS_TRUE); - muted=1; + muted = 1; } tmp &= ~CS_AC97_POWER_CONTROL_MIXVON; cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp ); @@ -4757,27 +4504,23 @@ static int cs46xx_powerup(struct cs_card *card, unsigned int type) * Check the status.. */ if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & - CS_AC97_POWER_CONTROL_MIXVON_ON)) - { + CS_AC97_POWER_CONTROL_MIXVON_ON)) { CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING "cs46xx: powerup MIXVON failed\n")); return 1; } } } - if(type & CS_POWER_ADC) - { + if (type & CS_POWER_ADC) { /* * Power up the ADC on the AC97 card. */ CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO "cs46xx: cs46xx_powerup()+ ADC\n")); tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL); - if (!(tmp & CS_AC97_POWER_CONTROL_ADC_ON)) - { - if(!muted) - { + if (!(tmp & CS_AC97_POWER_CONTROL_ADC_ON)) { + if (!muted) { cs_mute(card, CS_TRUE); - muted=1; + muted = 1; } tmp &= ~CS_AC97_POWER_CONTROL_ADC; cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp ); @@ -4804,16 +4547,14 @@ static int cs46xx_powerup(struct cs_card *card, unsigned int type) * Check the status.. */ if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & - CS_AC97_POWER_CONTROL_ADC_ON)) - { + CS_AC97_POWER_CONTROL_ADC_ON)) { CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING "cs46xx: powerup ADC failed\n")); return 1; } } } - if(type & CS_POWER_DAC) - { + if (type & CS_POWER_DAC) { /* * Power up the DAC on the AC97 card. */ @@ -4821,12 +4562,10 @@ static int cs46xx_powerup(struct cs_card *card, unsigned int type) CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO "cs46xx: cs46xx_powerup()+ DAC\n")); tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL); - if (!(tmp & CS_AC97_POWER_CONTROL_DAC_ON)) - { - if(!muted) - { + if (!(tmp & CS_AC97_POWER_CONTROL_DAC_ON)) { + if (!muted) { cs_mute(card, CS_TRUE); - muted=1; + muted = 1; } tmp &= ~CS_AC97_POWER_CONTROL_DAC; cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp ); @@ -4852,8 +4591,7 @@ static int cs46xx_powerup(struct cs_card *card, unsigned int type) * Check the status.. */ if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & - CS_AC97_POWER_CONTROL_DAC_ON)) - { + CS_AC97_POWER_CONTROL_DAC_ON)) { CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING "cs46xx: powerup DAC failed\n")); return 1; @@ -4861,14 +4599,13 @@ static int cs46xx_powerup(struct cs_card *card, unsigned int type) } } tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL); - if(muted) + if (muted) cs_mute(card, CS_FALSE); CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO "cs46xx: cs46xx_powerup()- 0 tmp=0x%x\n",tmp)); return 0; } - static void cs461x_proc_start(struct cs_card *card) { int cnt; @@ -4965,7 +4702,7 @@ static int cs_hardware_init(struct cs_card *card) * is not enough for some platforms! tested on an IBM Thinkpads and * reference cards. */ - if(!(card->pm.flags & CS46XX_PM_IDLE)) + if (!(card->pm.flags & CS46XX_PM_IDLE)) mdelay(initdelay); /* * Write the selected clock control setup to the hardware. Do not turn on @@ -5017,8 +4754,7 @@ static int cs_hardware_init(struct cs_card *card) * If we are resuming under 2.2.x then we can not schedule a timeout. * so, just spin the CPU. */ - if(card->pm.flags & CS46XX_PM_IDLE) - { + if (card->pm.flags & CS46XX_PM_IDLE) { /* * Wait for the card ready signal from the AC97 card. */ @@ -5033,9 +4769,7 @@ static int cs_hardware_init(struct cs_card *card) current->state = TASK_UNINTERRUPTIBLE; schedule_timeout(1); } while (time_before(jiffies, end_time)); - } - else - { + } else { for (count = 0; count < 100; count++) { // First, we want to wait for a short time. udelay(25 * cs_laptop_wait); @@ -5064,8 +4798,7 @@ static int cs_hardware_init(struct cs_card *card) */ cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_VFRM | ACCTL_ESYN | ACCTL_RSTN); - if(card->pm.flags & CS46XX_PM_IDLE) - { + if (card->pm.flags & CS46XX_PM_IDLE) { /* * Wait until we've sampled input slots 3 and 4 as valid, meaning that * the card is pumping ADC data across the AC-link. @@ -5081,9 +4814,7 @@ static int cs_hardware_init(struct cs_card *card) current->state = TASK_UNINTERRUPTIBLE; schedule_timeout(1); } while (time_before(jiffies, end_time)); - } - else - { + } else { for (count = 0; count < 100; count++) { // First, we want to wait for a short time. udelay(25 * cs_laptop_wait); @@ -5140,17 +4871,13 @@ static int cs_hardware_init(struct cs_card *card) cs461x_poke(card, BA1_CCTL, tmp & 0xffff0000); /* initialize AC97 codec and register /dev/mixer */ - if(card->pm.flags & CS46XX_PM_IDLE) - { - if (cs_ac97_init(card) <= 0) - { + if (card->pm.flags & CS46XX_PM_IDLE) { + if (cs_ac97_init(card) <= 0) { CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO - "cs46xx: cs_ac97_init() failure\n") ); + "cs46xx: cs_ac97_init() failure\n")); return -EIO; } - } - else - { + } else { cs46xx_ac97_resume(card); } @@ -5174,23 +4901,17 @@ static int cs_hardware_init(struct cs_card *card) * If IDLE then Power down the part. We will power components up * when we need them. */ - if(card->pm.flags & CS46XX_PM_IDLE) - { - if(!cs_powerdown) - { - if( (tmp = cs46xx_powerup(card, CS_POWER_DAC | CS_POWER_ADC | - CS_POWER_MIXVON )) ) - { + if (card->pm.flags & CS46XX_PM_IDLE) { + if (!cs_powerdown) { + if ((tmp = cs46xx_powerup(card, CS_POWER_DAC | CS_POWER_ADC | + CS_POWER_MIXVON))) { CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO "cs46xx: cs461x_powerup() failure (0x%x)\n",tmp) ); return -EIO; } - } - else - { - if( (tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC | - CS_POWER_MIXVON, CS_FALSE )) ) - { + } else { + if ((tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC | + CS_POWER_MIXVON, CS_FALSE))) { CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO "cs46xx: cs461x_powerdown() failure (0x%x)\n",tmp) ); return -EIO; @@ -5310,14 +5031,13 @@ MODULE_AUTHOR("Alan Cox , Jaroslav Kysela, name) { - if(cp->vendor == ss_vendor && cp->id == ss_card) - { + if (cp->vendor == ss_vendor && cp->id == ss_card) { card->amplifier_ctrl = cp->amp; - if(cp->active) + if (cp->active) card->active_ctrl = cp->active; - if(cp->amp_init) + if (cp->amp_init) card->amp_init = cp->amp_init; break; } cp++; } - if (cp->name==NULL) - { + if (cp->name == NULL) { printk(KERN_INFO "cs46xx: Unknown card (%04X:%04X) at 0x%08lx/0x%08lx, IRQ %d\n", ss_vendor, ss_card, card->ba0_addr, card->ba1_addr, card->irq); - } - else - { + } else { printk(KERN_INFO "cs46xx: %s (%04X:%04X) at 0x%08lx/0x%08lx, IRQ %d\n", cp->name, ss_vendor, ss_card, card->ba0_addr, card->ba1_addr, card->irq); } - if (card->amplifier_ctrl==NULL) - { + if (card->amplifier_ctrl == NULL) { card->amplifier_ctrl = amp_none; card->active_ctrl = clkrun_hack; } - if (external_amp == 1) - { + if (external_amp == 1) { printk(KERN_INFO "cs46xx: Crystal EAPD support forced on.\n"); card->amplifier_ctrl = amp_voyetra; } - if (thinkpad == 1) - { + if (thinkpad == 1) { printk(KERN_INFO "cs46xx: Activating CLKRUN hack for Thinkpad.\n"); card->active_ctrl = clkrun_hack; } @@ -5425,13 +5138,11 @@ static int __devinit cs46xx_probe(struct pci_dev *pci_dev, * and mdelay kernel code is replaced by a pm timer, or the delays * work well for battery and/or AC power both. */ - if(card->active_ctrl == clkrun_hack) - { + if (card->active_ctrl == clkrun_hack) { initdelay = 2100; cs_laptop_wait = 5; } - if((card->active_ctrl == clkrun_hack) && !(powerdown == 1)) - { + if ((card->active_ctrl == clkrun_hack) && !(powerdown == 1)) { /* * for some currently unknown reason, powering down the DAC and ADC component * blocks on thinkpads causes some funky behavior... distoorrrtion and ac97 @@ -5440,7 +5151,7 @@ static int __devinit cs46xx_probe(struct pci_dev *pci_dev, */ cs_powerdown = 0; } - if(powerdown == 0) + if (powerdown == 0) cs_powerdown = 0; card->active_ctrl(card, 1); @@ -5461,12 +5172,12 @@ static int __devinit cs46xx_probe(struct pci_dev *pci_dev, card->ba1.name.pmem, card->ba1.name.reg) ); - if(card->ba0 == 0 || card->ba1.name.data0 == 0 || + if (card->ba0 == 0 || card->ba1.name.data0 == 0 || card->ba1.name.data1 == 0 || card->ba1.name.pmem == 0 || card->ba1.name.reg == 0) goto fail2; - if (request_irq(card->irq, &cs_interrupt, SA_SHIRQ, "cs46xx", card)) { + if (request_irq(card->irq, &cs_interrupt, IRQF_SHARED, "cs46xx", card)) { printk(KERN_ERR "cs46xx: unable to allocate irq %d\n", card->irq); goto fail2; } @@ -5477,14 +5188,12 @@ static int __devinit cs46xx_probe(struct pci_dev *pci_dev, } /* register /dev/midi */ - if((card->dev_midi = register_sound_midi(&cs_midi_fops, -1)) < 0) + if ((card->dev_midi = register_sound_midi(&cs_midi_fops, -1)) < 0) printk(KERN_ERR "cs46xx: unable to register midi\n"); card->pm.flags |= CS46XX_PM_IDLE; - for(i=0;i<5;i++) - { - if (cs_hardware_init(card) != 0) - { + for (i = 0; i < 5; i++) { + if (cs_hardware_init(card) != 0) { CS_DBGOUT(CS_ERROR, 4, printk( "cs46xx: ERROR in cs_hardware_init()... retrying\n")); for (j = 0; j < NR_AC97; j++) @@ -5497,12 +5206,11 @@ static int __devinit cs46xx_probe(struct pci_dev *pci_dev, } break; } - if(i>=4) - { + if(i >= 4) { CS_DBGOUT(CS_PM | CS_ERROR, 1, printk( "cs46xx: cs46xx_probe()- cs_hardware_init() failed, retried %d times.\n",i)); unregister_sound_dsp(card->dev_audio); - if(card->dev_midi) + if (card->dev_midi) unregister_sound_midi(card->dev_midi); goto fail; } @@ -5518,7 +5226,7 @@ static int __devinit cs46xx_probe(struct pci_dev *pci_dev, * Check if we have to init the amplifier, but probably already done * since the CD logic in the ac97 init code will turn on the ext amp. */ - if(cp->amp_init) + if (cp->amp_init) cp->amp_init(card); card->active_ctrl(card, -1); @@ -5536,15 +5244,15 @@ static int __devinit cs46xx_probe(struct pci_dev *pci_dev, fail: free_irq(card->irq, card); fail2: - if(card->ba0) + if (card->ba0) iounmap(card->ba0); - if(card->ba1.name.data0) + if (card->ba1.name.data0) iounmap(card->ba1.name.data0); - if(card->ba1.name.data1) + if (card->ba1.name.data1) iounmap(card->ba1.name.data1); - if(card->ba1.name.pmem) + if (card->ba1.name.pmem) iounmap(card->ba1.name.pmem); - if(card->ba1.name.reg) + if (card->ba1.name.reg) iounmap(card->ba1.name.reg); kfree(card); CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_INFO @@ -5598,9 +5306,8 @@ static void __devexit cs46xx_remove(struct pci_dev *pci_dev) * Power down the DAC and ADC. We will power them up (if) when we need * them. */ - if( (tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC | - CS_POWER_MIXVON, CS_TRUE )) ) - { + if ((tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC | + CS_POWER_MIXVON, CS_TRUE))) { CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO "cs46xx: cs461x_powerdown() failure (0x%x)\n",tmp) ); } @@ -5634,7 +5341,7 @@ static void __devexit cs46xx_remove(struct pci_dev *pci_dev) ac97_release_codec(card->ac97_codec[i]); } unregister_sound_dsp(card->dev_audio); - if(card->dev_midi) + if (card->dev_midi) unregister_sound_midi(card->dev_midi); list_del(&card->list); kfree(card); @@ -5693,8 +5400,7 @@ static int __init cs46xx_init_module(void) "cs46xx: cs46xx_init_module()+ \n")); rtn = pci_register_driver(&cs46xx_pci_driver); - if(rtn == -ENODEV) - { + if (rtn == -ENODEV) { CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk( "cs46xx: Unable to detect valid cs46xx device\n")); } diff --git a/sound/oss/dmabuf.c b/sound/oss/dmabuf.c index baf4244a5..15ce7119c 100644 --- a/sound/oss/dmabuf.c +++ b/sound/oss/dmabuf.c @@ -547,7 +547,7 @@ int DMAbuf_activate_recording(int dev, struct dma_buffparms *dmap) } return 0; } -/* aquires lock */ +/* acquires lock */ int DMAbuf_getrdbuffer(int dev, char **buf, int *len, int dontblock) { struct audio_operations *adev = audio_devs[dev]; @@ -821,7 +821,7 @@ static int find_output_space(int dev, char **buf, int *size) *size = len & ~SAMPLE_ROUNDUP; return (*size > 0); } -/* aquires lock */ +/* acquires lock */ int DMAbuf_getwrbuffer(int dev, char **buf, int *size, int dontblock) { struct audio_operations *adev = audio_devs[dev]; @@ -855,7 +855,7 @@ int DMAbuf_getwrbuffer(int dev, char **buf, int *size, int dontblock) spin_unlock_irqrestore(&dmap->lock,flags); return 0; } -/* has to aquire dmap->lock */ +/* has to acquire dmap->lock */ int DMAbuf_move_wrpointer(int dev, int l) { struct audio_operations *adev = audio_devs[dev]; diff --git a/sound/oss/dmasound/dmasound.h b/sound/oss/dmasound/dmasound.h index a1b0b92af..25dd5a318 100644 --- a/sound/oss/dmasound/dmasound.h +++ b/sound/oss/dmasound/dmasound.h @@ -13,7 +13,6 @@ #define _dmasound_h_ #include -#include #define SND_NDEVS 256 /* Number of supported devices */ #define SND_DEV_CTL 0 /* Control port /dev/mixer */ diff --git a/sound/oss/dmasound/dmasound_awacs.c b/sound/oss/dmasound/dmasound_awacs.c index c8e210326..4359903f4 100644 --- a/sound/oss/dmasound/dmasound_awacs.c +++ b/sound/oss/dmasound/dmasound_awacs.c @@ -67,7 +67,6 @@ #include #include -#include #include #include #include @@ -375,10 +374,7 @@ setup_audio_gpio(const char *name, const char* compatible, int *gpio_addr, int* *gpio_pol = *pp; else *gpio_pol = 1; - if (np->n_intrs > 0) - return np->intrs[0].line; - - return 0; + return irq_of_parse_and_map(np, 0); } static inline void @@ -2865,14 +2861,13 @@ printk("dmasound_pmac: couldn't find a Codec we can handle\n"); * other info if necessary (early AWACS we want to read chip ids) */ - if (of_get_address(io, 2, NULL, NULL) == NULL || io->n_intrs < 3) { + if (of_get_address(io, 2, NULL, NULL) == NULL) { /* OK - maybe we need to use the 'awacs' node (on earlier * machines). */ if (awacs_node) { io = awacs_node ; - if (of_get_address(io, 2, NULL, NULL) == NULL || - io->n_intrs < 3) { + if (of_get_address(io, 2, NULL, NULL) == NULL) { printk("dmasound_pmac: can't use %s\n", io->full_name); return -ENODEV; @@ -2941,9 +2936,9 @@ printk("dmasound_pmac: couldn't find a Codec we can handle\n"); if (awacs_revision == AWACS_SCREAMER && awacs) awacs_recalibrate(); - awacs_irq = io->intrs[0].line; - awacs_tx_irq = io->intrs[1].line; - awacs_rx_irq = io->intrs[2].line; + awacs_irq = irq_of_parse_and_map(io, 0); + awacs_tx_irq = irq_of_parse_and_map(io, 1); + awacs_rx_irq = irq_of_parse_and_map(io, 2); /* Hack for legacy crap that will be killed someday */ awacs_node = io; diff --git a/sound/oss/dmasound/dmasound_paula.c b/sound/oss/dmasound/dmasound_paula.c index 494070a3f..68e1d8f6c 100644 --- a/sound/oss/dmasound/dmasound_paula.c +++ b/sound/oss/dmasound/dmasound_paula.c @@ -16,7 +16,6 @@ #include -#include #include #include #include diff --git a/sound/oss/emu10k1/main.c b/sound/oss/emu10k1/main.c index 3721c5857..c4ce94d6e 100644 --- a/sound/oss/emu10k1/main.c +++ b/sound/oss/emu10k1/main.c @@ -1301,7 +1301,7 @@ static int __devinit emu10k1_probe(struct pci_dev *pci_dev, const struct pci_dev card->pci_dev = pci_dev; /* Reserve IRQ Line */ - if (request_irq(card->irq, emu10k1_interrupt, SA_SHIRQ, card_names[pci_id->driver_data], card)) { + if (request_irq(card->irq, emu10k1_interrupt, IRQF_SHARED, card_names[pci_id->driver_data], card)) { printk(KERN_ERR "emu10k1: IRQ in use\n"); ret = -EBUSY; goto err_irq; diff --git a/sound/oss/emu10k1/midi.c b/sound/oss/emu10k1/midi.c index 25ae8e4a4..8ac77df86 100644 --- a/sound/oss/emu10k1/midi.c +++ b/sound/oss/emu10k1/midi.c @@ -45,7 +45,7 @@ #include "../sound_config.h" #endif -static DEFINE_SPINLOCK(midi_spinlock __attribute((unused))); +static DEFINE_SPINLOCK(midi_spinlock); static void init_midi_hdr(struct midi_hdr *midihdr) { diff --git a/sound/oss/es1370.c b/sound/oss/es1370.c index 094f569cc..13f483149 100644 --- a/sound/oss/es1370.c +++ b/sound/oss/es1370.c @@ -2650,7 +2650,7 @@ static int __devinit es1370_probe(struct pci_dev *pcidev, const struct pci_devic ret = -EBUSY; goto err_region; } - if ((ret=request_irq(s->irq, es1370_interrupt, SA_SHIRQ, "es1370",s))) { + if ((ret=request_irq(s->irq, es1370_interrupt, IRQF_SHARED, "es1370",s))) { printk(KERN_ERR "es1370: irq %u in use\n", s->irq); goto err_irq; } diff --git a/sound/oss/es1371.c b/sound/oss/es1371.c index 4400c8538..a2ffe723d 100644 --- a/sound/oss/es1371.c +++ b/sound/oss/es1371.c @@ -2905,7 +2905,7 @@ static int __devinit es1371_probe(struct pci_dev *pcidev, const struct pci_devic res = -EBUSY; goto err_region; } - if ((res=request_irq(s->irq, es1371_interrupt, SA_SHIRQ, "es1371",s))) { + if ((res=request_irq(s->irq, es1371_interrupt, IRQF_SHARED, "es1371",s))) { printk(KERN_ERR PFX "irq %u in use\n", s->irq); goto err_irq; } diff --git a/sound/oss/esssolo1.c b/sound/oss/esssolo1.c index 6861563d7..82f40a0a5 100644 --- a/sound/oss/esssolo1.c +++ b/sound/oss/esssolo1.c @@ -2392,7 +2392,7 @@ static int __devinit solo1_probe(struct pci_dev *pcidev, const struct pci_device printk(KERN_ERR "solo1: io ports in use\n"); goto err_region4; } - if ((ret=request_irq(s->irq,solo1_interrupt,SA_SHIRQ,"ESS Solo1",s))) { + if ((ret=request_irq(s->irq,solo1_interrupt,IRQF_SHARED,"ESS Solo1",s))) { printk(KERN_ERR "solo1: irq %u in use\n", s->irq); goto err_irq; } diff --git a/sound/oss/forte.c b/sound/oss/forte.c index 0294eec8a..ea1c0207a 100644 --- a/sound/oss/forte.c +++ b/sound/oss/forte.c @@ -2026,7 +2026,7 @@ forte_probe (struct pci_dev *pci_dev, const struct pci_device_id *pci_id) chip->iobase = pci_resource_start (pci_dev, 0); chip->irq = pci_dev->irq; - if (request_irq (chip->irq, forte_interrupt, SA_SHIRQ, DRIVER_NAME, + if (request_irq (chip->irq, forte_interrupt, IRQF_SHARED, DRIVER_NAME, chip)) { printk (KERN_WARNING PFX "Unable to reserve IRQ"); ret = -EIO; @@ -2035,8 +2035,9 @@ forte_probe (struct pci_dev *pci_dev, const struct pci_device_id *pci_id) pci_set_drvdata (pci_dev, chip); - printk (KERN_INFO PFX "FM801 chip found at 0x%04lX-0x%04lX IRQ %u\n", - chip->iobase, pci_resource_end (pci_dev, 0), chip->irq); + printk (KERN_INFO PFX "FM801 chip found at 0x%04lX-0x%16llX IRQ %u\n", + chip->iobase, (unsigned long long)pci_resource_end (pci_dev, 0), + chip->irq); /* Power it up */ if ((ret = forte_chip_init (chip)) == 0) diff --git a/sound/oss/hal2.c b/sound/oss/hal2.c index dd4f59d30..80ab402da 100644 --- a/sound/oss/hal2.c +++ b/sound/oss/hal2.c @@ -1479,7 +1479,7 @@ static int hal2_init_card(struct hal2_card **phal2, struct hpc3_regs *hpc3) hpc3->pbus_dmacfg[hal2->dac.pbus.pbusnr][0] = 0x8208844; hpc3->pbus_dmacfg[hal2->adc.pbus.pbusnr][0] = 0x8208844; - if (request_irq(SGI_HPCDMA_IRQ, hal2_interrupt, SA_SHIRQ, + if (request_irq(SGI_HPCDMA_IRQ, hal2_interrupt, IRQF_SHARED, hal2str, hal2)) { printk(KERN_ERR "HAL2: Can't get irq %d\n", SGI_HPCDMA_IRQ); ret = -EAGAIN; diff --git a/sound/oss/i810_audio.c b/sound/oss/i810_audio.c index dd2b871cd..ddcddc234 100644 --- a/sound/oss/i810_audio.c +++ b/sound/oss/i810_audio.c @@ -3413,7 +3413,7 @@ static int __devinit i810_probe(struct pci_dev *pci_dev, const struct pci_device goto out_iospace; } - if (request_irq(card->irq, &i810_interrupt, SA_SHIRQ, + if (request_irq(card->irq, &i810_interrupt, IRQF_SHARED, card_names[pci_id->driver_data], card)) { printk(KERN_ERR "i810_audio: unable to allocate irq %d\n", card->irq); goto out_iospace; diff --git a/sound/oss/ite8172.c b/sound/oss/ite8172.c index 00ac1c95a..68aab3605 100644 --- a/sound/oss/ite8172.c +++ b/sound/oss/ite8172.c @@ -2019,7 +2019,7 @@ static int __devinit it8172_probe(struct pci_dev *pcidev, s->io, s->io + pci_resource_len(pcidev,0)-1); goto err_region; } - if (request_irq(s->irq, it8172_interrupt, SA_INTERRUPT, + if (request_irq(s->irq, it8172_interrupt, IRQF_DISABLED, IT8172_MODULE_NAME, s)) { err("irq %u in use", s->irq); goto err_irq; diff --git a/sound/oss/kahlua.c b/sound/oss/kahlua.c index 2835a7c03..12e7b3038 100644 --- a/sound/oss/kahlua.c +++ b/sound/oss/kahlua.c @@ -27,7 +27,6 @@ * same manner. */ -#include #include #include #include diff --git a/sound/oss/maestro.c b/sound/oss/maestro.c index e647f2f86..1d98d100d 100644 --- a/sound/oss/maestro.c +++ b/sound/oss/maestro.c @@ -3545,7 +3545,7 @@ maestro_probe(struct pci_dev *pcidev,const struct pci_device_id *pdid) mixer_push_state(card); } - if((ret=request_irq(card->irq, ess_interrupt, SA_SHIRQ, card_names[card_type], card))) + if((ret=request_irq(card->irq, ess_interrupt, IRQF_SHARED, card_names[card_type], card))) { printk(KERN_ERR "maestro: unable to allocate irq %d,\n", card->irq); unregister_sound_mixer(card->dev_mixer); diff --git a/sound/oss/maestro3.c b/sound/oss/maestro3.c index 4a5e4237a..5548e3cff 100644 --- a/sound/oss/maestro3.c +++ b/sound/oss/maestro3.c @@ -2694,7 +2694,7 @@ static int __devinit m3_probe(struct pci_dev *pci_dev, const struct pci_device_i } } - if(request_irq(card->irq, m3_interrupt, SA_SHIRQ, card_names[card->card_type], card)) { + if(request_irq(card->irq, m3_interrupt, IRQF_SHARED, card_names[card->card_type], card)) { printk(KERN_ERR PFX "unable to allocate irq %d,\n", card->irq); diff --git a/sound/oss/msnd.c b/sound/oss/msnd.c index 5dbfc0f9c..ba38d6200 100644 --- a/sound/oss/msnd.c +++ b/sound/oss/msnd.c @@ -47,7 +47,7 @@ static multisound_dev_t *devs[MSND_MAX_DEVS]; static int num_devs; -int __init msnd_register(multisound_dev_t *dev) +int msnd_register(multisound_dev_t *dev) { int i; diff --git a/sound/oss/msnd_classic.h b/sound/oss/msnd_classic.h index 83c3c46ff..7ffea5267 100644 --- a/sound/oss/msnd_classic.h +++ b/sound/oss/msnd_classic.h @@ -30,7 +30,6 @@ #ifndef __MSND_CLASSIC_H #define __MSND_CLASSIC_H -#include #define DSP_NUMIO 0x10 diff --git a/sound/oss/msnd_pinnacle.c b/sound/oss/msnd_pinnacle.c index 0c2db657b..6d7763dae 100644 --- a/sound/oss/msnd_pinnacle.c +++ b/sound/oss/msnd_pinnacle.c @@ -39,7 +39,6 @@ ********************************************************************/ #include -#include #include #include #include diff --git a/sound/oss/msnd_pinnacle.h b/sound/oss/msnd_pinnacle.h index e85aef4a5..cce911487 100644 --- a/sound/oss/msnd_pinnacle.h +++ b/sound/oss/msnd_pinnacle.h @@ -30,7 +30,6 @@ #ifndef __MSND_PINNACLE_H #define __MSND_PINNACLE_H -#include #define DSP_NUMIO 0x08 diff --git a/sound/oss/nec_vrc5477.c b/sound/oss/nec_vrc5477.c index 21c1954d9..6f7f2f042 100644 --- a/sound/oss/nec_vrc5477.c +++ b/sound/oss/nec_vrc5477.c @@ -1909,7 +1909,7 @@ static int __devinit vrc5477_ac97_probe(struct pci_dev *pcidev, s->io, s->io + pci_resource_len(pcidev,0)-1); goto err_region; } - if (request_irq(s->irq, vrc5477_ac97_interrupt, SA_INTERRUPT, + if (request_irq(s->irq, vrc5477_ac97_interrupt, IRQF_DISABLED, VRC5477_AC97_MODULE_NAME, s)) { printk(KERN_ERR PFX "irq %u in use\n", s->irq); goto err_irq; diff --git a/sound/oss/nm256_audio.c b/sound/oss/nm256_audio.c index 6e662ac00..7760dddf2 100644 --- a/sound/oss/nm256_audio.c +++ b/sound/oss/nm256_audio.c @@ -733,7 +733,7 @@ static int nm256_grabInterrupt (struct nm256_info *card) { if (card->has_irq++ == 0) { - if (request_irq (card->irq, card->introutine, SA_SHIRQ, + if (request_irq (card->irq, card->introutine, IRQF_SHARED, "NM256_audio", card) < 0) { printk (KERN_ERR "NM256: can't obtain IRQ %d\n", card->irq); return -1; diff --git a/sound/oss/opl3sa2.c b/sound/oss/opl3sa2.c index 0e161c6a0..aec05a2bf 100644 --- a/sound/oss/opl3sa2.c +++ b/sound/oss/opl3sa2.c @@ -64,7 +64,6 @@ * */ -#include #include #include #include diff --git a/sound/oss/pas2_card.c b/sound/oss/pas2_card.c index c9696dc9f..97666007b 100644 --- a/sound/oss/pas2_card.c +++ b/sound/oss/pas2_card.c @@ -4,7 +4,6 @@ * Detection routine for the Pro Audio Spectrum cards. */ -#include #include #include #include diff --git a/sound/oss/pss.c b/sound/oss/pss.c index a617ccb40..37ee234b5 100644 --- a/sound/oss/pss.c +++ b/sound/oss/pss.c @@ -57,7 +57,6 @@ */ -#include #include #include #include diff --git a/sound/oss/rme96xx.c b/sound/oss/rme96xx.c index a1ec9d131..f17d25b6f 100644 --- a/sound/oss/rme96xx.c +++ b/sound/oss/rme96xx.c @@ -994,7 +994,7 @@ static int __devinit rme96xx_probe(struct pci_dev *pcidev, const struct pci_devi if (pci_enable_device(pcidev)) goto err_irq; - if (request_irq(s->irq, rme96xx_interrupt, SA_SHIRQ, "rme96xx", s)) { + if (request_irq(s->irq, rme96xx_interrupt, IRQF_SHARED, "rme96xx", s)) { printk(KERN_ERR RME_MESS" irq %u in use\n", s->irq); goto err_irq; } diff --git a/sound/oss/sb_card.c b/sound/oss/sb_card.c index 4708cbdc3..8666291c0 100644 --- a/sound/oss/sb_card.c +++ b/sound/oss/sb_card.c @@ -22,7 +22,6 @@ * 02-07-2003 Bug made it into first release. Take two. */ -#include #include #include #include diff --git a/sound/oss/sb_common.c b/sound/oss/sb_common.c index 5f955e3d2..35bab6e2f 100644 --- a/sound/oss/sb_common.c +++ b/sound/oss/sb_common.c @@ -26,7 +26,6 @@ * Chris Rankin */ -#include #include #include #include @@ -678,7 +677,7 @@ int sb_dsp_init(struct address_info *hw_config, struct module *owner) * will get shared PCI irq lines we must cope. */ - int i=(devc->caps&SB_PCI_IRQ)?SA_SHIRQ:0; + int i=(devc->caps&SB_PCI_IRQ)?IRQF_SHARED:0; if (request_irq(hw_config->irq, sbintr, i, "soundblaster", devc) < 0) { diff --git a/sound/oss/sb_ess.c b/sound/oss/sb_ess.c index fae05fe3d..180e95c87 100644 --- a/sound/oss/sb_ess.c +++ b/sound/oss/sb_ess.c @@ -97,19 +97,19 @@ * * The documentation is an adventure: it's close but not fully accurate. I * found out that after a reset some registers are *NOT* reset, though the - * docs say the would be. Interresting ones are 0x7f, 0x7d and 0x7a. They are - * related to the Audio 2 channel. I also was suprised about the consequenses + * docs say the would be. Interesting ones are 0x7f, 0x7d and 0x7a. They are + * related to the Audio 2 channel. I also was surprised about the consequences * of writing 0x00 to 0x7f (which should be done by reset): The ES1887 moves * into ES1888 mode. This means that it claims IRQ 11, which happens to be my * ISDN adapter. Needless to say it no longer worked. I now understand why * after rebooting 0x7f already was 0x05, the value of my choice: the BIOS * did it. * - * Oh, and this is another trap: in ES1887 docs mixer register 0x70 is decribed - * as if it's exactly the same as register 0xa1. This is *NOT* true. The - * description of 0x70 in ES1869 docs is accurate however. + * Oh, and this is another trap: in ES1887 docs mixer register 0x70 is + * described as if it's exactly the same as register 0xa1. This is *NOT* true. + * The description of 0x70 in ES1869 docs is accurate however. * Well, the assumption about ES1869 was wrong: register 0x70 is very much - * like register 0xa1, except that bit 7 is allways 1, whatever you want + * like register 0xa1, except that bit 7 is always 1, whatever you want * it to be. * * When using audio 2 mixer register 0x72 seems te be meaningless. Only 0xa2 @@ -117,10 +117,10 @@ * * Software reset not being able to reset all registers is great! Especially * the fact that register 0x78 isn't reset is great when you wanna change back - * to single dma operation (simplex): audio 2 is still operation, and uses the - * same dma as audio 1: your ess changes into a funny echo machine. + * to single dma operation (simplex): audio 2 is still operational, and uses + * the same dma as audio 1: your ess changes into a funny echo machine. * - * Received the new that ES1688 is detected as a ES1788. Did some thinking: + * Received the news that ES1688 is detected as a ES1788. Did some thinking: * the ES1887 detection scheme suggests in step 2 to try if bit 3 of register * 0x64 can be changed. This is inaccurate, first I inverted the * check: "If * can be modified, it's a 1688", which lead to a correct detection @@ -135,7 +135,7 @@ * About recognition of ESS chips * * The distinction of ES688, ES1688, ES1788, ES1887 and ES1888 is described in - * a (preliminary ??) datasheet on ES1887. It's aim is to identify ES1887, but + * a (preliminary ??) datasheet on ES1887. Its aim is to identify ES1887, but * during detection the text claims that "this chip may be ..." when a step * fails. This scheme is used to distinct between the above chips. * It appears however that some PnP chips like ES1868 are recognized as ES1788 @@ -156,9 +156,9 @@ * * The existing ES1688 support didn't take care of the ES1688+ recording * levels very well. Whenever a device was selected (recmask) for recording - * it's recording level was loud, and it couldn't be changed. The fact that + * its recording level was loud, and it couldn't be changed. The fact that * internal register 0xb4 could take care of RECLEV, didn't work meaning until - * it's value was restored every time the chip was reset; this reset the + * its value was restored every time the chip was reset; this reset the * value of 0xb4 too. I guess that's what 4front also had (have?) trouble with. * * About ES1887 support: @@ -169,9 +169,9 @@ * the latter case the recording volumes are 0. * Now recording levels of inputs can be controlled, by changing the playback * levels. Futhermore several devices can be recorded together (which is not - * possible with the ES1688. + * possible with the ES1688). * Besides the separate recording level control for each input, the common - * recordig level can also be controlled by RECLEV as described above. + * recording level can also be controlled by RECLEV as described above. * * Not only ES1887 have this recording mixer. I know the following from the * documentation: diff --git a/sound/oss/sh_dac_audio.c b/sound/oss/sh_dac_audio.c index 3f7427cd1..7b168d85f 100644 --- a/sound/oss/sh_dac_audio.c +++ b/sound/oss/sh_dac_audio.c @@ -1,4 +1,3 @@ -#include #include #include #include @@ -298,7 +297,7 @@ static int __init dac_audio_init(void) dac_audio_set_rate(); retval = - request_irq(TIMER1_IRQ, timer1_interrupt, SA_INTERRUPT, MODNAME, 0); + request_irq(TIMER1_IRQ, timer1_interrupt, IRQF_DISABLED, MODNAME, 0); if (retval < 0) { printk(KERN_ERR "sh_dac_audio: IRQ %d request failed\n", TIMER1_IRQ); diff --git a/sound/oss/sonicvibes.c b/sound/oss/sonicvibes.c index 42bd276cf..8ea532d40 100644 --- a/sound/oss/sonicvibes.c +++ b/sound/oss/sonicvibes.c @@ -2632,7 +2632,7 @@ static int __devinit sv_probe(struct pci_dev *pcidev, const struct pci_device_id wrindir(s, SV_CIPCMSR1, ((8000 * 65536 / FULLRATE) >> 8) & 0xff); wrindir(s, SV_CIADCOUTPUT, 0); /* request irq */ - if ((ret=request_irq(s->irq,sv_interrupt,SA_SHIRQ,"S3 SonicVibes",s))) { + if ((ret=request_irq(s->irq,sv_interrupt,IRQF_SHARED,"S3 SonicVibes",s))) { printk(KERN_ERR "sv: irq %u in use\n", s->irq); goto err_irq; } diff --git a/sound/oss/sound_config.h b/sound/oss/sound_config.h index 9f912b8a2..1a00a3210 100644 --- a/sound/oss/sound_config.h +++ b/sound/oss/sound_config.h @@ -14,7 +14,6 @@ #ifndef _SOUND_CONFIG_H_ #define _SOUND_CONFIG_H_ -#include #include #include diff --git a/sound/oss/soundcard.c b/sound/oss/soundcard.c index d33bb464f..0860d6789 100644 --- a/sound/oss/soundcard.c +++ b/sound/oss/soundcard.c @@ -22,7 +22,6 @@ * Christoph Hellwig : Some cleanup work (2000/03/01) */ -#include #include "sound_config.h" #include @@ -38,7 +37,6 @@ #include #include #include -#include #include #include #include @@ -564,9 +562,6 @@ static int __init oss_init(void) sound_dmap_flag = (dmabuf > 0 ? 1 : 0); for (i = 0; i < sizeof (dev_list) / sizeof *dev_list; i++) { - devfs_mk_cdev(MKDEV(SOUND_MAJOR, dev_list[i].minor), - S_IFCHR | dev_list[i].mode, - "sound/%s", dev_list[i].name); class_device_create(sound_class, NULL, MKDEV(SOUND_MAJOR, dev_list[i].minor), NULL, "%s", dev_list[i].name); @@ -574,15 +569,10 @@ static int __init oss_init(void) if (!dev_list[i].num) continue; - for (j = 1; j < *dev_list[i].num; j++) { - devfs_mk_cdev(MKDEV(SOUND_MAJOR, - dev_list[i].minor + (j*0x10)), - S_IFCHR | dev_list[i].mode, - "sound/%s%d", dev_list[i].name, j); + for (j = 1; j < *dev_list[i].num; j++) class_device_create(sound_class, NULL, MKDEV(SOUND_MAJOR, dev_list[i].minor + (j*0x10)), NULL, "%s%d", dev_list[i].name, j); - } } if (sound_nblocks >= 1024) @@ -596,14 +586,11 @@ static void __exit oss_cleanup(void) int i, j; for (i = 0; i < sizeof (dev_list) / sizeof *dev_list; i++) { - devfs_remove("sound/%s", dev_list[i].name); class_device_destroy(sound_class, MKDEV(SOUND_MAJOR, dev_list[i].minor)); if (!dev_list[i].num) continue; - for (j = 1; j < *dev_list[i].num; j++) { - devfs_remove("sound/%s%d", dev_list[i].name, j); + for (j = 1; j < *dev_list[i].num; j++) class_device_destroy(sound_class, MKDEV(SOUND_MAJOR, dev_list[i].minor + (j*0x10))); - } } unregister_sound_special(1); diff --git a/sound/oss/trident.c b/sound/oss/trident.c index e61a454a8..2813e4c8e 100644 --- a/sound/oss/trident.c +++ b/sound/oss/trident.c @@ -194,7 +194,6 @@ * sem - guard dmabuf, write re-entry etc */ -#include #include #include #include @@ -4473,7 +4472,7 @@ trident_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_id) /* claim our irq */ rc = -ENODEV; - if (request_irq(card->irq, &trident_interrupt, SA_SHIRQ, + if (request_irq(card->irq, &trident_interrupt, IRQF_SHARED, card_names[pci_id->driver_data], card)) { printk(KERN_ERR "trident: unable to allocate irq %d\n", card->irq); diff --git a/sound/oss/via82cxxx_audio.c b/sound/oss/via82cxxx_audio.c index 1a921ee71..08d8c94d0 100644 --- a/sound/oss/via82cxxx_audio.c +++ b/sound/oss/via82cxxx_audio.c @@ -18,12 +18,12 @@ #define VIA_VERSION "1.9.1-ac4-2.5" -#include #include #include #include #include #include +#include #include #include #include @@ -308,7 +308,7 @@ struct via_info { unsigned sixchannel: 1; /* 8233/35 with 6 channel support */ unsigned volume: 1; - int locked_rate : 1; + unsigned locked_rate : 1; int mixer_vol; /* 8233/35 volume - not yet implemented */ @@ -2013,7 +2013,7 @@ static int via_interrupt_init (struct via_info *card) tmp8 |= VIA_CR48_FM_TRAP_TO_NMI; pci_write_config_byte (card->pdev, VIA_FM_NMI_CTRL, tmp8); } - if (request_irq (card->pdev->irq, via_interrupt, SA_SHIRQ, VIA_MODULE_NAME, card)) { + if (request_irq (card->pdev->irq, via_interrupt, IRQF_SHARED, VIA_MODULE_NAME, card)) { printk (KERN_ERR PFX "unable to obtain IRQ %d, aborting\n", card->pdev->irq); DPRINTK ("EXIT, returning -EBUSY\n"); @@ -2022,7 +2022,7 @@ static int via_interrupt_init (struct via_info *card) } else { - if (request_irq (card->pdev->irq, via_new_interrupt, SA_SHIRQ, VIA_MODULE_NAME, card)) { + if (request_irq (card->pdev->irq, via_new_interrupt, IRQF_SHARED, VIA_MODULE_NAME, card)) { printk (KERN_ERR PFX "unable to obtain IRQ %d, aborting\n", card->pdev->irq); DPRINTK ("EXIT, returning -EBUSY\n"); @@ -3522,7 +3522,7 @@ err_out_have_mixer: err_out_kfree: #ifndef VIA_NDEBUG - memset (card, 0xAB, sizeof (*card)); /* poison memory */ + memset (card, OSS_POISON_FREE, sizeof (*card)); /* poison memory */ #endif kfree (card); @@ -3559,7 +3559,7 @@ static void __devexit via_remove_one (struct pci_dev *pdev) via_ac97_cleanup (card); #ifndef VIA_NDEBUG - memset (card, 0xAB, sizeof (*card)); /* poison memory */ + memset (card, OSS_POISON_FREE, sizeof (*card)); /* poison memory */ #endif kfree (card); diff --git a/sound/oss/vidc.c b/sound/oss/vidc.c index 00fe5cec9..8932d8940 100644 --- a/sound/oss/vidc.c +++ b/sound/oss/vidc.c @@ -17,7 +17,6 @@ * We currently support a mixer device, but it is currently non-functional. */ -#include #include #include #include diff --git a/sound/oss/waveartist.c b/sound/oss/waveartist.c index afcb524a4..22d26624b 100644 --- a/sound/oss/waveartist.c +++ b/sound/oss/waveartist.c @@ -35,7 +35,6 @@ #include #include -#include #include #include #include diff --git a/sound/oss/wavfront.c b/sound/oss/wavfront.c index b1a4eeb9d..1dec3958c 100644 --- a/sound/oss/wavfront.c +++ b/sound/oss/wavfront.c @@ -2268,7 +2268,7 @@ static int __init wavefront_hw_reset (void) } if (request_irq (dev.irq, wavefrontintr, - SA_INTERRUPT|SA_SHIRQ, + IRQF_DISABLED|IRQF_SHARED, "wavefront synth", &dev) < 0) { printk (KERN_WARNING LOGNAME "IRQ %d not available!\n", dev.irq); diff --git a/sound/oss/wf_midi.c b/sound/oss/wf_midi.c index 7b167b743..3f3a39001 100644 --- a/sound/oss/wf_midi.c +++ b/sound/oss/wf_midi.c @@ -820,7 +820,7 @@ int __init install_wf_mpu (void) /* OK, now we're configured to handle an interrupt ... */ - if (request_irq (phys_dev->irq, wf_mpuintr, SA_INTERRUPT|SA_SHIRQ, + if (request_irq (phys_dev->irq, wf_mpuintr, IRQF_DISABLED|IRQF_SHARED, "wavefront midi", phys_dev) < 0) { printk (KERN_ERR "WF-MPU: Failed to allocate IRQ%d\n", diff --git a/sound/oss/ymfpci.c b/sound/oss/ymfpci.c index bf90c124a..6e22472df 100644 --- a/sound/oss/ymfpci.c +++ b/sound/oss/ymfpci.c @@ -2573,7 +2573,7 @@ static int __devinit ymf_probe_one(struct pci_dev *pcidev, const struct pci_devi goto out_disable_dsp; ymf_memload(codec); - if (request_irq(pcidev->irq, ymf_interrupt, SA_SHIRQ, "ymfpci", codec) != 0) { + if (request_irq(pcidev->irq, ymf_interrupt, IRQF_SHARED, "ymfpci", codec) != 0) { printk(KERN_ERR "ymfpci: unable to request IRQ %d\n", pcidev->irq); goto out_memfree; diff --git a/sound/pci/Kconfig b/sound/pci/Kconfig index 8f34986dd..e49c0fe21 100644 --- a/sound/pci/Kconfig +++ b/sound/pci/Kconfig @@ -16,16 +16,16 @@ config SND_AD1889 will be called snd-ad1889. config SND_ALS300 - tristate "Avance Logic ALS300/ALS300+" - depends on SND - select SND_PCM - select SND_AC97_CODEC - select SND_OPL3_LIB - help - Say 'Y' or 'M' to include support for Avance Logic ALS300/ALS300+ + tristate "Avance Logic ALS300/ALS300+" + depends on SND + select SND_PCM + select SND_AC97_CODEC + select SND_OPL3_LIB + help + Say 'Y' or 'M' to include support for Avance Logic ALS300/ALS300+ - To compile this driver as a module, choose M here: the module - will be called snd-als300 + To compile this driver as a module, choose M here: the module + will be called snd-als300 config SND_ALS4000 tristate "Avance Logic ALS4000" @@ -78,49 +78,49 @@ config SND_ATIIXP_MODEM will be called snd-atiixp-modem. config SND_AU8810 - tristate "Aureal Advantage" - depends on SND + tristate "Aureal Advantage" + depends on SND select SND_MPU401_UART select SND_AC97_CODEC - help + help Say Y here to include support for Aureal Advantage soundcards. Supported features: Hardware Mixer, SRC, EQ and SPDIF output. - 3D support code is in place, but not yet useable. For more info, - email the ALSA developer list, or . + 3D support code is in place, but not yet useable. For more info, + email the ALSA developer list, or . To compile this driver as a module, choose M here: the module will be called snd-au8810. - + config SND_AU8820 - tristate "Aureal Vortex" - depends on SND + tristate "Aureal Vortex" + depends on SND select SND_MPU401_UART select SND_AC97_CODEC - help + help Say Y here to include support for Aureal Vortex soundcards. - Supported features: Hardware Mixer and SRC. For more info, email - the ALSA developer list, or . + Supported features: Hardware Mixer and SRC. For more info, email + the ALSA developer list, or . To compile this driver as a module, choose M here: the module will be called snd-au8820. - + config SND_AU8830 - tristate "Aureal Vortex 2" - depends on SND + tristate "Aureal Vortex 2" + depends on SND select SND_MPU401_UART select SND_AC97_CODEC - help + help Say Y here to include support for Aureal Vortex 2 soundcards. - Supported features: Hardware Mixer, SRC, EQ and SPDIF output. - 3D support code is in place, but not yet useable. For more info, - email the ALSA developer list, or . + Supported features: Hardware Mixer, SRC, EQ and SPDIF output. + 3D support code is in place, but not yet useable. For more info, + email the ALSA developer list, or . To compile this driver as a module, choose M here: the module will be called snd-au8830. - + config SND_AZT3328 tristate "Aztech AZF3328 / PCI168 (EXPERIMENTAL)" depends on SND && EXPERIMENTAL @@ -135,10 +135,10 @@ config SND_AZT3328 will be called snd-azt3328. config SND_BT87X - tristate "Bt87x Audio Capture" - depends on SND + tristate "Bt87x Audio Capture" + depends on SND select SND_PCM - help + help If you want to record audio from TV cards based on Brooktree Bt878/Bt879 chips, say Y here and read . @@ -209,25 +209,167 @@ config SND_CS46XX config SND_CS46XX_NEW_DSP bool "Cirrus Logic (Sound Fusion) New DSP support" depends on SND_CS46XX - default y + default y help Say Y here to use a new DSP image for SPDIF and dual codecs. This works better than the old code, so say Y. config SND_CS5535AUDIO - tristate "CS5535 Audio" + tristate "CS5535/CS5536 Audio" depends on SND && X86 && !X86_64 select SND_PCM select SND_AC97_CODEC help Say Y here to include support for audio on CS5535 chips. It is referred to as NS CS5535 IO or AMD CS5535 IO companion in - various literature. + various literature. This driver also supports the CS5536 audio + device. However, for both chips, on certain boards, you may + need to use ac97_quirk=hp_only if your board has physically + mapped headphone out to master output. If that works for you, + send lspci -vvv output to the mailing list so that your board + can be identified in the quirks list. To compile this driver as a module, choose M here: the module will be called snd-cs5535audio. +config SND_DARLA20 + tristate "(Echoaudio) Darla20" + depends on SND + depends on FW_LOADER + select SND_PCM + help + Say 'Y' or 'M' to include support for Echoaudio Darla. + + To compile this driver as a module, choose M here: the module + will be called snd-darla20 + +config SND_GINA20 + tristate "(Echoaudio) Gina20" + depends on SND + depends on FW_LOADER + select SND_PCM + help + Say 'Y' or 'M' to include support for Echoaudio Gina. + + To compile this driver as a module, choose M here: the module + will be called snd-gina20 + +config SND_LAYLA20 + tristate "(Echoaudio) Layla20" + depends on SND + depends on FW_LOADER + select SND_RAWMIDI + select SND_PCM + help + Say 'Y' or 'M' to include support for Echoaudio Layla. + + To compile this driver as a module, choose M here: the module + will be called snd-layla20 + +config SND_DARLA24 + tristate "(Echoaudio) Darla24" + depends on SND + depends on FW_LOADER + select SND_PCM + help + Say 'Y' or 'M' to include support for Echoaudio Darla24. + + To compile this driver as a module, choose M here: the module + will be called snd-darla24 + +config SND_GINA24 + tristate "(Echoaudio) Gina24" + depends on SND + depends on FW_LOADER + select SND_PCM + help + Say 'Y' or 'M' to include support for Echoaudio Gina24. + + To compile this driver as a module, choose M here: the module + will be called snd-gina24 + +config SND_LAYLA24 + tristate "(Echoaudio) Layla24" + depends on SND + depends on FW_LOADER + select SND_RAWMIDI + select SND_PCM + help + Say 'Y' or 'M' to include support for Echoaudio Layla24. + + To compile this driver as a module, choose M here: the module + will be called snd-layla24 + +config SND_MONA + tristate "(Echoaudio) Mona" + depends on SND + depends on FW_LOADER + select SND_RAWMIDI + select SND_PCM + help + Say 'Y' or 'M' to include support for Echoaudio Mona. + + To compile this driver as a module, choose M here: the module + will be called snd-mona + +config SND_MIA + tristate "(Echoaudio) Mia" + depends on SND + depends on FW_LOADER + select SND_RAWMIDI + select SND_PCM + help + Say 'Y' or 'M' to include support for Echoaudio Mia and Mia-midi. + + To compile this driver as a module, choose M here: the module + will be called snd-mia + +config SND_ECHO3G + tristate "(Echoaudio) 3G cards" + depends on SND + depends on FW_LOADER + select SND_RAWMIDI + select SND_PCM + help + Say 'Y' or 'M' to include support for Echoaudio Gina3G and Layla3G. + + To compile this driver as a module, choose M here: the module + will be called snd-echo3g + +config SND_INDIGO + tristate "(Echoaudio) Indigo" + depends on SND + depends on FW_LOADER + select SND_PCM + help + Say 'Y' or 'M' to include support for Echoaudio Indigo. + + To compile this driver as a module, choose M here: the module + will be called snd-indigo + +config SND_INDIGOIO + tristate "(Echoaudio) Indigo IO" + depends on SND + depends on FW_LOADER + select SND_PCM + help + Say 'Y' or 'M' to include support for Echoaudio Indigo IO. + + To compile this driver as a module, choose M here: the module + will be called snd-indigoio + +config SND_INDIGODJ + tristate "(Echoaudio) Indigo DJ" + depends on SND + depends on FW_LOADER + select SND_PCM + help + Say 'Y' or 'M' to include support for Echoaudio Indigo DJ. + + To compile this driver as a module, choose M here: the module + will be called snd-indigodj + config SND_EMU10K1 tristate "Emu10k1 (SB Live!, Audigy, E-mu APS)" depends on SND @@ -326,11 +468,13 @@ config SND_FM801_TEA575X_BOOL FM801 chip with a TEA5757 tuner connected to GPIO1-3 pins (Media Forte SF256-PCS-02) into the snd-fm801 driver. + This will enable support for the old V4L1 API. + config SND_FM801_TEA575X - tristate - depends on SND_FM801_TEA575X_BOOL - default SND_FM801 - select VIDEO_DEV + tristate + depends on SND_FM801_TEA575X_BOOL + default SND_FM801 + select VIDEO_V4L1 config SND_HDA_INTEL tristate "Intel HD Audio" @@ -417,8 +561,8 @@ config SND_INTEL8X0 will be called snd-intel8x0. config SND_INTEL8X0M - tristate "Intel/SiS/nVidia/AMD MC97 Modem (EXPERIMENTAL)" - depends on SND && EXPERIMENTAL + tristate "Intel/SiS/nVidia/AMD MC97 Modem" + depends on SND select SND_AC97_CODEC help Say Y here to include support for the integrated MC97 modem on diff --git a/sound/pci/Makefile b/sound/pci/Makefile index cba5105aa..e06736da9 100644 --- a/sound/pci/Makefile +++ b/sound/pci/Makefile @@ -57,6 +57,7 @@ obj-$(CONFIG_SND) += \ ca0106/ \ cs46xx/ \ cs5535audio/ \ + echoaudio/ \ emu10k1/ \ hda/ \ ice1712/ \ diff --git a/sound/pci/ac97/ac97_codec.c b/sound/pci/ac97/ac97_codec.c index fcb00c2a2..51e83d7a8 100644 --- a/sound/pci/ac97/ac97_codec.c +++ b/sound/pci/ac97/ac97_codec.c @@ -253,6 +253,8 @@ void snd_ac97_write(struct snd_ac97 *ac97, unsigned short reg, unsigned short va ac97->bus->ops->write(ac97, reg, value); } +EXPORT_SYMBOL(snd_ac97_write); + /** * snd_ac97_read - read a value from the given register * @@ -281,6 +283,8 @@ static inline unsigned short snd_ac97_read_cache(struct snd_ac97 *ac97, unsigned return ac97->regs[reg]; } +EXPORT_SYMBOL(snd_ac97_read); + /** * snd_ac97_write_cache - write a value on the given register and update the cache * @ac97: the ac97 instance @@ -302,6 +306,8 @@ void snd_ac97_write_cache(struct snd_ac97 *ac97, unsigned short reg, unsigned sh mutex_unlock(&ac97->reg_mutex); } +EXPORT_SYMBOL(snd_ac97_write_cache); + /** * snd_ac97_update - update the value on the given register * @ac97: the ac97 instance @@ -331,6 +337,8 @@ int snd_ac97_update(struct snd_ac97 *ac97, unsigned short reg, unsigned short va return change; } +EXPORT_SYMBOL(snd_ac97_update); + /** * snd_ac97_update_bits - update the bits on the given register * @ac97: the ac97 instance @@ -356,6 +364,8 @@ int snd_ac97_update_bits(struct snd_ac97 *ac97, unsigned short reg, unsigned sho return change; } +EXPORT_SYMBOL(snd_ac97_update_bits); + /* no lock version - see snd_ac97_updat_bits() */ int snd_ac97_update_bits_nolock(struct snd_ac97 *ac97, unsigned short reg, unsigned short mask, unsigned short value) @@ -1204,20 +1214,6 @@ static int snd_ac97_cmix_new_stereo(struct snd_card *card, const char *pfx, int static unsigned int snd_ac97_determine_spdif_rates(struct snd_ac97 *ac97); -static void snd_ctl_elem_remove(struct snd_card *card, - struct snd_kcontrol *kcontrol) -{ - struct snd_kcontrol *kct; - struct snd_ctl_elem_id id = kcontrol->id; - - down_write(&card->controls_rwsem); - - if ((kct = snd_ctl_find_id(card, &id))) - snd_ctl_remove(card, kct); - - up_write(&card->controls_rwsem); -} - static int snd_ac97_mixer_build(struct snd_ac97 * ac97) { struct snd_card *card = ac97->bus->card; @@ -1240,7 +1236,8 @@ static int snd_ac97_mixer_build(struct snd_ac97 * ac97) ac97->regs[AC97_CENTER_LFE_MASTER] = 0x8080; /* build center controls */ - if (snd_ac97_try_volume_mix(ac97, AC97_CENTER_LFE_MASTER)) { + if ((snd_ac97_try_volume_mix(ac97, AC97_CENTER_LFE_MASTER)) + && !(ac97->flags & AC97_AD_MULTI)) { if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_center[0], ac97))) < 0) return err; if ((err = snd_ctl_add(card, kctl = snd_ac97_cnew(&snd_ac97_controls_center[1], ac97))) < 0) @@ -1252,7 +1249,8 @@ static int snd_ac97_mixer_build(struct snd_ac97 * ac97) } /* build LFE controls */ - if (snd_ac97_try_volume_mix(ac97, AC97_CENTER_LFE_MASTER+1)) { + if ((snd_ac97_try_volume_mix(ac97, AC97_CENTER_LFE_MASTER+1)) + && !(ac97->flags & AC97_AD_MULTI)) { if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_lfe[0], ac97))) < 0) return err; if ((err = snd_ctl_add(card, kctl = snd_ac97_cnew(&snd_ac97_controls_lfe[1], ac97))) < 0) @@ -1264,7 +1262,8 @@ static int snd_ac97_mixer_build(struct snd_ac97 * ac97) } /* build surround controls */ - if (snd_ac97_try_volume_mix(ac97, AC97_SURROUND_MASTER)) { + if ((snd_ac97_try_volume_mix(ac97, AC97_SURROUND_MASTER)) + && !(ac97->flags & AC97_AD_MULTI)) { /* Surround Master (0x38) is with stereo mutes */ if ((err = snd_ac97_cmix_new_stereo(card, "Surround Playback", AC97_SURROUND_MASTER, 1, ac97)) < 0) return err; @@ -1349,9 +1348,11 @@ static int snd_ac97_mixer_build(struct snd_ac97 * ac97) } /* build Aux controls */ - if (snd_ac97_try_volume_mix(ac97, AC97_AUX)) { - if ((err = snd_ac97_cmix_new(card, "Aux Playback", AC97_AUX, ac97)) < 0) - return err; + if (!(ac97->flags & AC97_HAS_NO_AUX)) { + if (snd_ac97_try_volume_mix(ac97, AC97_AUX)) { + if ((err = snd_ac97_cmix_new(card, "Aux Playback", AC97_AUX, ac97)) < 0) + return err; + } } /* build PCM controls */ @@ -1361,35 +1362,23 @@ static int snd_ac97_mixer_build(struct snd_ac97 * ac97) init_val = 0x9f9f; else init_val = 0x9f1f; - for (idx = 0; idx < 2; idx++) { - struct snd_kcontrol *kctrl = snd_ac97_cnew(&snd_ac97_controls_ad18xx_pcm[idx], ac97); - snd_ctl_elem_remove(card, kctrl); - if ((err = snd_ctl_add(card, kctrl)) < 0) + for (idx = 0; idx < 2; idx++) + if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_ad18xx_pcm[idx], ac97))) < 0) return err; - } ac97->spec.ad18xx.pcmreg[0] = init_val; if (ac97->scaps & AC97_SCAP_SURROUND_DAC) { - for (idx = 0; idx < 2; idx++) { - struct snd_kcontrol *kctrl = snd_ac97_cnew(&snd_ac97_controls_ad18xx_surround[idx], ac97); - snd_ctl_elem_remove(card, kctrl); - if ((err = snd_ctl_add(card, kctrl)) < 0) + for (idx = 0; idx < 2; idx++) + if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_ad18xx_surround[idx], ac97))) < 0) return err; - } ac97->spec.ad18xx.pcmreg[1] = init_val; } if (ac97->scaps & AC97_SCAP_CENTER_LFE_DAC) { - for (idx = 0; idx < 2; idx++) { - struct snd_kcontrol *kctrl = snd_ac97_cnew(&snd_ac97_controls_ad18xx_center[idx], ac97); - snd_ctl_elem_remove(card, kctrl); - if ((err = snd_ctl_add(card, kctrl)) < 0) + for (idx = 0; idx < 2; idx++) + if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_ad18xx_center[idx], ac97))) < 0) return err; - } - for (idx = 0; idx < 2; idx++) { - struct snd_kcontrol *kctrl = snd_ac97_cnew(&snd_ac97_controls_ad18xx_lfe[idx], ac97); - snd_ctl_elem_remove(card, kctrl); - if ((err = snd_ctl_add(card, kctrl)) < 0) + for (idx = 0; idx < 2; idx++) + if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_ad18xx_lfe[idx], ac97))) < 0) return err; - } ac97->spec.ad18xx.pcmreg[2] = init_val; } snd_ac97_write_cache(ac97, AC97_PCM, init_val); @@ -1708,6 +1697,7 @@ const char *snd_ac97_get_short_name(struct snd_ac97 *ac97) return "unknown codec"; } +EXPORT_SYMBOL(snd_ac97_get_short_name); /* wait for a while until registers are accessible after RESET * return 0 if ok, negative not ready @@ -1800,6 +1790,8 @@ int snd_ac97_bus(struct snd_card *card, int num, struct snd_ac97_bus_ops *ops, return 0; } +EXPORT_SYMBOL(snd_ac97_bus); + /* stop no dev release warning */ static void ac97_device_release(struct device * dev) { @@ -2143,6 +2135,7 @@ int snd_ac97_mixer(struct snd_ac97_bus *bus, struct snd_ac97_template *template, return 0; } +EXPORT_SYMBOL(snd_ac97_mixer); /* * Power down the chip. @@ -2192,6 +2185,8 @@ void snd_ac97_suspend(struct snd_ac97 *ac97) snd_ac97_powerdown(ac97); } +EXPORT_SYMBOL(snd_ac97_suspend); + /* * restore ac97 status */ @@ -2293,6 +2288,8 @@ __reset_ready: snd_ac97_restore_iec958(ac97); } } + +EXPORT_SYMBOL(snd_ac97_resume); #endif @@ -2616,29 +2613,7 @@ int snd_ac97_tune_hardware(struct snd_ac97 *ac97, struct ac97_quirk *quirk, cons return 0; } - -/* - * Exported symbols - */ - -EXPORT_SYMBOL(snd_ac97_write); -EXPORT_SYMBOL(snd_ac97_read); -EXPORT_SYMBOL(snd_ac97_write_cache); -EXPORT_SYMBOL(snd_ac97_update); -EXPORT_SYMBOL(snd_ac97_update_bits); -EXPORT_SYMBOL(snd_ac97_get_short_name); -EXPORT_SYMBOL(snd_ac97_bus); -EXPORT_SYMBOL(snd_ac97_mixer); -EXPORT_SYMBOL(snd_ac97_pcm_assign); -EXPORT_SYMBOL(snd_ac97_pcm_open); -EXPORT_SYMBOL(snd_ac97_pcm_close); -EXPORT_SYMBOL(snd_ac97_pcm_double_rate_rules); EXPORT_SYMBOL(snd_ac97_tune_hardware); -EXPORT_SYMBOL(snd_ac97_set_rate); -#ifdef CONFIG_PM -EXPORT_SYMBOL(snd_ac97_resume); -EXPORT_SYMBOL(snd_ac97_suspend); -#endif /* * INIT part diff --git a/sound/pci/ac97/ac97_patch.c b/sound/pci/ac97/ac97_patch.c index 4d9cf3730..094cfc1f3 100644 --- a/sound/pci/ac97/ac97_patch.c +++ b/sound/pci/ac97/ac97_patch.c @@ -464,6 +464,10 @@ int patch_wolfson05(struct snd_ac97 * ac97) { /* WM9705, WM9710 */ ac97->build_ops = &patch_wolfson_wm9705_ops; +#ifdef CONFIG_TOUCHSCREEN_WM9705 + /* WM9705 touchscreen uses AUX and VIDEO for touch */ + ac97->flags |=3D AC97_HAS_NO_VIDEO | AC97_HAS_NO_AUX; +#endif return 0; } @@ -1367,6 +1371,13 @@ static void ad18xx_resume(struct snd_ac97 *ac97) snd_ac97_restore_iec958(ac97); } + +static void ad1888_resume(struct snd_ac97 *ac97) +{ + ad18xx_resume(ac97); + snd_ac97_write_cache(ac97, AC97_CODEC_CLASS_REV, 0x8080); +} + #endif int patch_ad1819(struct snd_ac97 * ac97) @@ -1627,6 +1638,7 @@ static const struct snd_kcontrol_new snd_ac97_ad1981x_jack_sense[] = { * (SS vendor << 16 | device) */ static unsigned int ad1981_jacks_blacklist[] = { + 0x10140537, /* Thinkpad T41p */ 0x10140554, /* Thinkpad T42p/R50p */ 0 /* end */ }; @@ -1812,6 +1824,8 @@ static const struct snd_kcontrol_new snd_ac97_ad1888_controls[] = { .get = snd_ac97_ad1888_lohpsel_get, .put = snd_ac97_ad1888_lohpsel_put }, + AC97_SINGLE("V_REFOUT Enable", AC97_AD_MISC, 2, 1, 1), + AC97_SINGLE("High Pass Filter Enable", AC97_AD_TEST2, 12, 1, 1), AC97_SINGLE("Spread Front to Surround and Center/LFE", AC97_AD_MISC, 7, 1, 0), { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, @@ -1839,7 +1853,7 @@ static struct snd_ac97_build_ops patch_ad1888_build_ops = { .build_post_spdif = patch_ad198x_post_spdif, .build_specific = patch_ad1888_specific, #ifdef CONFIG_PM - .resume = ad18xx_resume, + .resume = ad1888_resume, #endif .update_jacks = ad1888_update_jacks, }; @@ -2048,7 +2062,10 @@ int patch_alc650(struct snd_ac97 * ac97) /* Enable SPDIF-IN only on Rev.E and above */ val = snd_ac97_read(ac97, AC97_ALC650_CLOCK); /* SPDIF IN with pin 47 */ - if (ac97->spec.dev_flags) + if (ac97->spec.dev_flags && + /* ASUS A6KM requires EAPD */ + ! (ac97->subsystem_vendor == 0x1043 && + ac97->subsystem_device == 0x1103)) val |= 0x03; /* enable */ else val &= ~0x03; /* disable */ diff --git a/sound/pci/ac97/ac97_pcm.c b/sound/pci/ac97/ac97_pcm.c index 512a3583b..f684aa2c0 100644 --- a/sound/pci/ac97/ac97_pcm.c +++ b/sound/pci/ac97/ac97_pcm.c @@ -317,6 +317,8 @@ int snd_ac97_set_rate(struct snd_ac97 *ac97, int reg, unsigned int rate) return 0; } +EXPORT_SYMBOL(snd_ac97_set_rate); + static unsigned short get_pslots(struct snd_ac97 *ac97, unsigned char *rate_table, unsigned short *spdif_slots) { if (!ac97_is_audio(ac97)) @@ -550,6 +552,8 @@ int snd_ac97_pcm_assign(struct snd_ac97_bus *bus, return 0; } +EXPORT_SYMBOL(snd_ac97_pcm_assign); + /** * snd_ac97_pcm_open - opens the given AC97 pcm * @pcm: the ac97 pcm instance @@ -633,6 +637,8 @@ int snd_ac97_pcm_open(struct ac97_pcm *pcm, unsigned int rate, return err; } +EXPORT_SYMBOL(snd_ac97_pcm_open); + /** * snd_ac97_pcm_close - closes the given AC97 pcm * @pcm: the ac97 pcm instance @@ -658,6 +664,8 @@ int snd_ac97_pcm_close(struct ac97_pcm *pcm) return 0; } +EXPORT_SYMBOL(snd_ac97_pcm_close); + static int double_rate_hw_constraint_rate(struct snd_pcm_hw_params *params, struct snd_pcm_hw_rule *rule) { @@ -709,3 +717,5 @@ int snd_ac97_pcm_double_rate_rules(struct snd_pcm_runtime *runtime) SNDRV_PCM_HW_PARAM_RATE, -1); return err; } + +EXPORT_SYMBOL(snd_ac97_pcm_double_rate_rules); diff --git a/sound/pci/ac97/ac97_proc.c b/sound/pci/ac97/ac97_proc.c index 4d523df79..2118df50b 100644 --- a/sound/pci/ac97/ac97_proc.c +++ b/sound/pci/ac97/ac97_proc.c @@ -433,7 +433,7 @@ void snd_ac97_proc_init(struct snd_ac97 * ac97) prefix = ac97_is_audio(ac97) ? "ac97" : "mc97"; sprintf(name, "%s#%d-%d", prefix, ac97->addr, ac97->num); if ((entry = snd_info_create_card_entry(ac97->bus->card, name, ac97->bus->proc)) != NULL) { - snd_info_set_text_ops(entry, ac97, 1024, snd_ac97_proc_read); + snd_info_set_text_ops(entry, ac97, snd_ac97_proc_read); if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); entry = NULL; @@ -442,10 +442,9 @@ void snd_ac97_proc_init(struct snd_ac97 * ac97) ac97->proc = entry; sprintf(name, "%s#%d-%d+regs", prefix, ac97->addr, ac97->num); if ((entry = snd_info_create_card_entry(ac97->bus->card, name, ac97->bus->proc)) != NULL) { - snd_info_set_text_ops(entry, ac97, 1024, snd_ac97_proc_regs_read); + snd_info_set_text_ops(entry, ac97, snd_ac97_proc_regs_read); #ifdef CONFIG_SND_DEBUG entry->mode |= S_IWUSR; - entry->c.text.write_size = 1024; entry->c.text.write = snd_ac97_proc_regs_write; #endif if (snd_info_register(entry) < 0) { diff --git a/sound/pci/ac97/ak4531_codec.c b/sound/pci/ac97/ak4531_codec.c index 0fb7b3407..94c26ec05 100644 --- a/sound/pci/ac97/ak4531_codec.c +++ b/sound/pci/ac97/ak4531_codec.c @@ -453,7 +453,7 @@ static void snd_ak4531_proc_init(struct snd_card *card, struct snd_ak4531 *ak453 struct snd_info_entry *entry; if (! snd_card_proc_new(card, "ak4531", &entry)) - snd_info_set_text_ops(entry, ak4531, 1024, snd_ak4531_proc_read); + snd_info_set_text_ops(entry, ak4531, snd_ak4531_proc_read); } #endif diff --git a/sound/pci/ad1889.c b/sound/pci/ad1889.c index eece1c7e5..0786d0eda 100644 --- a/sound/pci/ad1889.c +++ b/sound/pci/ad1889.c @@ -241,14 +241,14 @@ ad1889_channel_reset(struct snd_ad1889 *chip, unsigned int channel) } } -static inline u16 +static u16 snd_ad1889_ac97_read(struct snd_ac97 *ac97, unsigned short reg) { struct snd_ad1889 *chip = ac97->private_data; return ad1889_readw(chip, AD_AC97_BASE + reg); } -static inline void +static void snd_ad1889_ac97_write(struct snd_ac97 *ac97, unsigned short reg, unsigned short val) { struct snd_ad1889 *chip = ac97->private_data; @@ -753,7 +753,7 @@ snd_ad1889_proc_init(struct snd_ad1889 *chip) struct snd_info_entry *entry; if (!snd_card_proc_new(chip->card, chip->card->driver, &entry)) - snd_info_set_text_ops(entry, chip, 1024, snd_ad1889_proc_read); + snd_info_set_text_ops(entry, chip, snd_ad1889_proc_read); } static struct ac97_quirk ac97_quirks[] = { @@ -873,7 +873,7 @@ skip_hw: return 0; } -static inline int +static int snd_ad1889_dev_free(struct snd_device *device) { struct snd_ad1889 *chip = device->device_data; @@ -947,7 +947,7 @@ snd_ad1889_create(struct snd_card *card, spin_lock_init(&chip->lock); /* only now can we call ad1889_free */ if (request_irq(pci->irq, snd_ad1889_interrupt, - SA_INTERRUPT|SA_SHIRQ, card->driver, (void*)chip)) { + IRQF_DISABLED|IRQF_SHARED, card->driver, (void*)chip)) { printk(KERN_ERR PFX "cannot obtain IRQ %d\n", pci->irq); snd_ad1889_free(chip); return -EBUSY; @@ -1051,7 +1051,7 @@ snd_ad1889_remove(struct pci_dev *pci) pci_set_drvdata(pci, NULL); } -static struct pci_device_id snd_ad1889_ids[] __devinitdata = { +static struct pci_device_id snd_ad1889_ids[] = { { PCI_DEVICE(PCI_VENDOR_ID_ANALOG_DEVICES, PCI_DEVICE_ID_AD1889JS) }, { 0, }, }; diff --git a/sound/pci/ali5451/ali5451.c b/sound/pci/ali5451/ali5451.c index e2dbc2118..74668398e 100644 --- a/sound/pci/ali5451/ali5451.c +++ b/sound/pci/ali5451/ali5451.c @@ -49,7 +49,7 @@ MODULE_SUPPORTED_DEVICE("{{ALI,M5451,pci},{ALI,M5451}}"); static int index = SNDRV_DEFAULT_IDX1; /* Index */ static char *id = SNDRV_DEFAULT_STR1; /* ID for this card */ static int pcm_channels = 32; -static int spdif = 0; +static int spdif; module_param(index, int, 0444); MODULE_PARM_DESC(index, "Index value for ALI M5451 PCI Audio."); @@ -279,7 +279,7 @@ struct snd_ali { #endif }; -static struct pci_device_id snd_ali_ids[] __devinitdata = { +static struct pci_device_id snd_ali_ids[] = { {PCI_DEVICE(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M5451), 0, 0, 0}, {0, } }; @@ -2173,7 +2173,7 @@ static void __devinit snd_ali_proc_init(struct snd_ali *codec) { struct snd_info_entry *entry; if(!snd_card_proc_new(codec->card, "ali5451", &entry)) - snd_info_set_text_ops(entry, codec, 1024, snd_ali_proc_read); + snd_info_set_text_ops(entry, codec, snd_ali_proc_read); } static int __devinit snd_ali_resources(struct snd_ali *codec) @@ -2185,7 +2185,7 @@ static int __devinit snd_ali_resources(struct snd_ali *codec) return err; codec->port = pci_resource_start(codec->pci, 0); - if (request_irq(codec->pci->irq, snd_ali_card_interrupt, SA_INTERRUPT|SA_SHIRQ, "ALI 5451", (void *)codec)) { + if (request_irq(codec->pci->irq, snd_ali_card_interrupt, IRQF_DISABLED|IRQF_SHARED, "ALI 5451", (void *)codec)) { snd_printk(KERN_ERR "Unable to request irq.\n"); return -EBUSY; } diff --git a/sound/pci/als300.c b/sound/pci/als300.c index 901b08ae9..96cfb8ae5 100644 --- a/sound/pci/als300.c +++ b/sound/pci/als300.c @@ -146,7 +146,7 @@ struct snd_als300_substream_data { int block_counter_register; }; -static struct pci_device_id snd_als300_ids[] __devinitdata = { +static struct pci_device_id snd_als300_ids[] = { { 0x4005, 0x0300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_ALS300 }, { 0x4005, 0x0308, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_ALS300_PLUS }, { 0, } @@ -724,7 +724,7 @@ static int __devinit snd_als300_create(snd_card_t *card, else irq_handler = snd_als300_interrupt; - if (request_irq(pci->irq, irq_handler, SA_INTERRUPT|SA_SHIRQ, + if (request_irq(pci->irq, irq_handler, IRQF_DISABLED|IRQF_SHARED, card->shortname, (void *)chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_als300_free(chip); diff --git a/sound/pci/als4000.c b/sound/pci/als4000.c index 60423b1c6..9e596f750 100644 --- a/sound/pci/als4000.c +++ b/sound/pci/als4000.c @@ -116,7 +116,7 @@ struct snd_card_als4000 { #endif }; -static struct pci_device_id snd_als4000_ids[] __devinitdata = { +static struct pci_device_id snd_als4000_ids[] = { { 0x4005, 0x4000, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* ALS4000 */ { 0, } }; @@ -746,8 +746,8 @@ static int __devinit snd_card_als4000_probe(struct pci_dev *pci, card->shortname, chip->alt_port, chip->irq); if ((err = snd_mpu401_uart_new( card, 0, MPU401_HW_ALS4000, - gcr+0x30, 1, pci->irq, 0, - &chip->rmidi)) < 0) { + gcr+0x30, MPU401_INFO_INTEGRATED, + pci->irq, 0, &chip->rmidi)) < 0) { printk(KERN_ERR "als4000: no MPU-401 device at 0x%lx?\n", gcr+0x30); goto out_err; } diff --git a/sound/pci/atiixp.c b/sound/pci/atiixp.c index d0f759d86..347e25ff0 100644 --- a/sound/pci/atiixp.c +++ b/sound/pci/atiixp.c @@ -284,7 +284,7 @@ struct atiixp { /* */ -static struct pci_device_id snd_atiixp_ids[] __devinitdata = { +static struct pci_device_id snd_atiixp_ids[] = { { 0x1002, 0x4341, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB200 */ { 0x1002, 0x4361, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB300 */ { 0x1002, 0x4370, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB400 */ @@ -1504,7 +1504,7 @@ static void __devinit snd_atiixp_proc_init(struct atiixp *chip) struct snd_info_entry *entry; if (! snd_card_proc_new(chip->card, "atiixp", &entry)) - snd_info_set_text_ops(entry, chip, 1024, snd_atiixp_proc_read); + snd_info_set_text_ops(entry, chip, snd_atiixp_proc_read); } #else /* !CONFIG_PROC_FS */ #define snd_atiixp_proc_init(chip) @@ -1578,7 +1578,7 @@ static int __devinit snd_atiixp_create(struct snd_card *card, return -EIO; } - if (request_irq(pci->irq, snd_atiixp_interrupt, SA_INTERRUPT|SA_SHIRQ, + if (request_irq(pci->irq, snd_atiixp_interrupt, IRQF_DISABLED|IRQF_SHARED, card->shortname, chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_atiixp_free(chip); diff --git a/sound/pci/atiixp_modem.c b/sound/pci/atiixp_modem.c index 12a34c39c..a89d67c45 100644 --- a/sound/pci/atiixp_modem.c +++ b/sound/pci/atiixp_modem.c @@ -262,7 +262,7 @@ struct atiixp_modem { /* */ -static struct pci_device_id snd_atiixp_ids[] __devinitdata = { +static struct pci_device_id snd_atiixp_ids[] = { { 0x1002, 0x434d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB200 */ { 0x1002, 0x4378, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB400 */ { 0, } @@ -1177,7 +1177,7 @@ static void __devinit snd_atiixp_proc_init(struct atiixp_modem *chip) struct snd_info_entry *entry; if (! snd_card_proc_new(chip->card, "atiixp-modem", &entry)) - snd_info_set_text_ops(entry, chip, 1024, snd_atiixp_proc_read); + snd_info_set_text_ops(entry, chip, snd_atiixp_proc_read); } #else #define snd_atiixp_proc_init(chip) @@ -1251,7 +1251,7 @@ static int __devinit snd_atiixp_create(struct snd_card *card, return -EIO; } - if (request_irq(pci->irq, snd_atiixp_interrupt, SA_INTERRUPT|SA_SHIRQ, + if (request_irq(pci->irq, snd_atiixp_interrupt, IRQF_DISABLED|IRQF_SHARED, card->shortname, chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_atiixp_free(chip); diff --git a/sound/pci/au88x0/au8810.c b/sound/pci/au88x0/au8810.c index bd3352998..fce22c7af 100644 --- a/sound/pci/au88x0/au8810.c +++ b/sound/pci/au88x0/au8810.c @@ -1,6 +1,6 @@ #include "au8810.h" #include "au88x0.h" -static struct pci_device_id snd_vortex_ids[] __devinitdata = { +static struct pci_device_id snd_vortex_ids[] = { {PCI_VENDOR_ID_AUREAL, PCI_DEVICE_ID_AUREAL_ADVANTAGE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1,}, {0,} diff --git a/sound/pci/au88x0/au8820.c b/sound/pci/au88x0/au8820.c index 7e3fd8372..d1fbcce07 100644 --- a/sound/pci/au88x0/au8820.c +++ b/sound/pci/au88x0/au8820.c @@ -1,6 +1,6 @@ #include "au8820.h" #include "au88x0.h" -static struct pci_device_id snd_vortex_ids[] __devinitdata = { +static struct pci_device_id snd_vortex_ids[] = { {PCI_VENDOR_ID_AUREAL, PCI_DEVICE_ID_AUREAL_VORTEX_1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0,}, {0,} diff --git a/sound/pci/au88x0/au8830.c b/sound/pci/au88x0/au8830.c index b840f6608..d4f2717c1 100644 --- a/sound/pci/au88x0/au8830.c +++ b/sound/pci/au88x0/au8830.c @@ -1,6 +1,6 @@ #include "au8830.h" #include "au88x0.h" -static struct pci_device_id snd_vortex_ids[] __devinitdata = { +static struct pci_device_id snd_vortex_ids[] = { {PCI_VENDOR_ID_AUREAL, PCI_DEVICE_ID_AUREAL_VORTEX_2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0,}, {0,} diff --git a/sound/pci/au88x0/au88x0.c b/sound/pci/au88x0/au88x0.c index 126870ec0..6ed5ad59f 100644 --- a/sound/pci/au88x0/au88x0.c +++ b/sound/pci/au88x0/au88x0.c @@ -128,6 +128,7 @@ static int snd_vortex_dev_free(struct snd_device *device) // Take down PCI interface. synchronize_irq(vortex->irq); free_irq(vortex->irq, vortex); + iounmap(vortex->mmio); pci_release_regions(vortex->pci_dev); pci_disable_device(vortex->pci_dev); kfree(vortex); @@ -197,7 +198,7 @@ snd_vortex_create(struct snd_card *card, struct pci_dev *pci, vortex_t ** rchip) } if ((err = request_irq(pci->irq, vortex_interrupt, - SA_INTERRUPT | SA_SHIRQ, CARD_NAME_SHORT, + IRQF_DISABLED | IRQF_SHARED, CARD_NAME_SHORT, chip)) != 0) { printk(KERN_ERR "cannot grab irq\n"); goto irq_out; @@ -261,6 +262,13 @@ snd_vortex_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) return err; } snd_vortex_workaround(pci, pcifix[dev]); + + // Card details needed in snd_vortex_midi + strcpy(card->driver, CARD_NAME_SHORT); + sprintf(card->shortname, "Aureal Vortex %s", CARD_NAME_SHORT); + sprintf(card->longname, "%s at 0x%lx irq %i", + card->shortname, chip->io, chip->irq); + // (4) Alloc components. // ADB pcm. if ((err = snd_vortex_new_pcm(chip, VORTEX_PCM_ADB, NR_ADB)) < 0) { @@ -323,11 +331,6 @@ snd_vortex_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) #endif // (5) - strcpy(card->driver, CARD_NAME_SHORT); - strcpy(card->shortname, CARD_NAME_SHORT); - sprintf(card->longname, "%s at 0x%lx irq %i", - card->shortname, chip->io, chip->irq); - if ((err = pci_read_config_word(pci, PCI_DEVICE_ID, &(chip->device))) < 0) { snd_card_free(card); diff --git a/sound/pci/au88x0/au88x0.h b/sound/pci/au88x0/au88x0.h index f078b716d..b1cfc3c79 100644 --- a/sound/pci/au88x0/au88x0.h +++ b/sound/pci/au88x0/au88x0.h @@ -270,7 +270,8 @@ static void vortex_mix_setvolumebyte(vortex_t * vortex, unsigned char mix, /* A3D functions. */ #ifndef CHIP_AU8820 -static void vortex_Vort3D(vortex_t * v, int en); +static void vortex_Vort3D_enable(vortex_t * v); +static void vortex_Vort3D_disable(vortex_t * v); static void vortex_Vort3D_connect(vortex_t * vortex, int en); static void vortex_Vort3D_InitializeSource(a3dsrc_t * a, int en); #endif diff --git a/sound/pci/au88x0/au88x0_a3d.c b/sound/pci/au88x0/au88x0_a3d.c index d215f393e..649849e54 100644 --- a/sound/pci/au88x0/au88x0_a3d.c +++ b/sound/pci/au88x0/au88x0_a3d.c @@ -593,24 +593,23 @@ static int Vort3DRend_Initialize(vortex_t * v, unsigned short mode) static int vortex_a3d_register_controls(vortex_t * vortex); static void vortex_a3d_unregister_controls(vortex_t * vortex); /* A3D base support init/shudown */ -static void vortex_Vort3D(vortex_t * v, int en) +static void __devinit vortex_Vort3D_enable(vortex_t * v) { int i; - if (en) { - Vort3DRend_Initialize(v, XT_HEADPHONE); - for (i = 0; i < NR_A3D; i++) { - vortex_A3dSourceHw_Initialize(v, i % 4, i >> 2); - a3dsrc_ZeroStateA3D(&(v->a3d[0])); - } - } else { - vortex_XtalkHw_Disable(v); + + Vort3DRend_Initialize(v, XT_HEADPHONE); + for (i = 0; i < NR_A3D; i++) { + vortex_A3dSourceHw_Initialize(v, i % 4, i >> 2); + a3dsrc_ZeroStateA3D(&(v->a3d[0])); } /* Register ALSA controls */ - if (en) { - vortex_a3d_register_controls(v); - } else { - vortex_a3d_unregister_controls(v); - } + vortex_a3d_register_controls(v); +} + +static void vortex_Vort3D_disable(vortex_t * v) +{ + vortex_XtalkHw_Disable(v); + vortex_a3d_unregister_controls(v); } /* Make A3D subsystem connections. */ @@ -855,7 +854,7 @@ static struct snd_kcontrol_new vortex_a3d_kcontrol __devinitdata = { }; /* Control (un)registration. */ -static int vortex_a3d_register_controls(vortex_t * vortex) +static int __devinit vortex_a3d_register_controls(vortex_t * vortex) { struct snd_kcontrol *kcontrol; int err, i; diff --git a/sound/pci/au88x0/au88x0_core.c b/sound/pci/au88x0/au88x0_core.c index 4347e6abc..5299cce58 100644 --- a/sound/pci/au88x0/au88x0_core.c +++ b/sound/pci/au88x0/au88x0_core.c @@ -2690,7 +2690,7 @@ static int __devinit vortex_core_init(vortex_t * vortex) #ifndef CHIP_AU8820 vortex_eq_init(vortex); vortex_spdif_init(vortex, 48000, 1); - vortex_Vort3D(vortex, 1); + vortex_Vort3D_enable(vortex); #endif #ifndef CHIP_AU8810 vortex_wt_init(vortex); @@ -2718,7 +2718,7 @@ static int vortex_core_shutdown(vortex_t * vortex) printk(KERN_INFO "Vortex: shutdown..."); #ifndef CHIP_AU8820 vortex_eq_free(vortex); - vortex_Vort3D(vortex, 0); + vortex_Vort3D_disable(vortex); #endif //vortex_disable_timer_int(vortex); vortex_disable_int(vortex); diff --git a/sound/pci/au88x0/au88x0_mpu401.c b/sound/pci/au88x0/au88x0_mpu401.c index 118dcc71e..c75d368ea 100644 --- a/sound/pci/au88x0/au88x0_mpu401.c +++ b/sound/pci/au88x0/au88x0_mpu401.c @@ -70,9 +70,6 @@ static int __devinit snd_vortex_midi(vortex_t * vortex) temp |= (MIDI_CLOCK_DIV << 8) | ((mode >> 24) & 0xff) << 4; hwwrite(vortex->mmio, VORTEX_CTRL2, temp); hwwrite(vortex->mmio, VORTEX_MIDI_CMD, MPU401_RESET); - /* Set some kind of mode */ - if (mode) - hwwrite(vortex->mmio, VORTEX_MIDI_CMD, MPU401_ENTER_UART); /* Check if anything is OK. */ temp = hwread(vortex->mmio, VORTEX_MIDI_DATA); @@ -98,7 +95,8 @@ static int __devinit snd_vortex_midi(vortex_t * vortex) port = (unsigned long)(vortex->mmio + VORTEX_MIDI_DATA); if ((temp = snd_mpu401_uart_new(vortex->card, 0, MPU401_HW_AUREAL, port, - 1, 0, 0, &rmidi)) != 0) { + MPU401_INFO_INTEGRATED | MPU401_INFO_MMIO, + 0, 0, &rmidi)) != 0) { hwwrite(vortex->mmio, VORTEX_CTRL, (hwread(vortex->mmio, VORTEX_CTRL) & ~CTRL_MIDI_PORT) & ~CTRL_MIDI_EN); @@ -107,6 +105,9 @@ static int __devinit snd_vortex_midi(vortex_t * vortex) mpu = rmidi->private_data; mpu->cport = (unsigned long)(vortex->mmio + VORTEX_MIDI_CMD); #endif + /* Overwrite MIDI name */ + snprintf(rmidi->name, sizeof(rmidi->name), "%s MIDI %d", CARD_NAME_SHORT , vortex->card->number); + vortex->rmidi = rmidi; return 0; } diff --git a/sound/pci/au88x0/au88x0_xtalk.c b/sound/pci/au88x0/au88x0_xtalk.c index 4534e1882..b4151e208 100644 --- a/sound/pci/au88x0/au88x0_xtalk.c +++ b/sound/pci/au88x0/au88x0_xtalk.c @@ -66,31 +66,20 @@ static xtalk_gains_t const asXtalkGainsAllChan = { 0 //0x7FFF,0x7FFF,0x7FFF,0x7FFF,0x7fff,0x7FFF,0x7FFF,0x7FFF,0x7FFF,0x7fff }; -static xtalk_gains_t const asXtalkGainsZeros = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; +static xtalk_gains_t const asXtalkGainsZeros; -static xtalk_dline_t const alXtalkDlineZeros = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0 -}; +static xtalk_dline_t const alXtalkDlineZeros; static xtalk_dline_t const alXtalkDlineTest = { 0xFC18, 0x03E8FFFF, 0x186A0, 0x7960FFFE, 1, 0xFFFFFFFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static xtalk_instate_t const asXtalkInStateZeros = { 0, 0, 0, 0 }; +static xtalk_instate_t const asXtalkInStateZeros; static xtalk_instate_t const asXtalkInStateTest = { 0xFF80, 0x0080, 0xFFFF, 0x0001 }; -static xtalk_state_t const asXtalkOutStateZeros = { - {0, 0, 0, 0}, - {0, 0, 0, 0}, - {0, 0, 0, 0}, - {0, 0, 0, 0}, - {0, 0, 0, 0} -}; +static xtalk_state_t const asXtalkOutStateZeros; + static short const sDiamondKLeftEq = 0x401d; static short const sDiamondKRightEq = 0x401d; static short const sDiamondKLeftXt = 0xF90E; @@ -162,13 +151,7 @@ static xtalk_coefs_t const asXtalkNarrowCoefsRightXt = { {0, 0, 0, 0, 0} }; -static xtalk_coefs_t const asXtalkCoefsZeros = { - {0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0} -}; +static xtalk_coefs_t const asXtalkCoefsZeros; static xtalk_coefs_t const asXtalkCoefsPipe = { {0, 0, 0x0FA0, 0, 0}, {0, 0, 0x0FA0, 0, 0}, diff --git a/sound/pci/azt3328.c b/sound/pci/azt3328.c index 52a364524..bac8e9cfd 100644 --- a/sound/pci/azt3328.c +++ b/sound/pci/azt3328.c @@ -33,14 +33,21 @@ * in the first place >:-P}), * I was forced to base this driver on reverse engineering * (3 weeks' worth of evenings filled with driver work). - * (and no, I did NOT go the easy way: to pick up a PCI128 for 9 Euros) + * (and no, I did NOT go the easy way: to pick up a SB PCI128 for 9 Euros) * * The AZF3328 chip (note: AZF3328, *not* AZT3328, that's just the driver name * for compatibility reasons) has the following features: * * - builtin AC97 conformant codec (SNR over 80dB) - * (really AC97 compliant?? I really doubt it when looking - * at the mixer register layout) + * Note that "conformant" != "compliant"!! this chip's mixer register layout + * *differs* from the standard AC97 layout: + * they chose to not implement the headphone register (which is not a + * problem since it's merely optional), yet when doing this, they committed + * the grave sin of letting other registers follow immediately instead of + * keeping a headphone dummy register, thereby shifting the mixer register + * addresses illegally. So far unfortunately it looks like the very flexible + * ALSA AC97 support is still not enough to easily compensate for such a + * grave layout violation despite all tweaks and quirks mechanisms it offers. * - builtin genuine OPL3 * - full duplex 16bit playback/record at independent sampling rate * - MPU401 (+ legacy address support) FIXME: how to enable legacy addr?? @@ -90,10 +97,15 @@ * * TODO * - test MPU401 MIDI playback etc. - * - power management. See e.g. intel8x0 or cs4281. - * This would be nice since the chip runs a bit hot, and it's *required* - * anyway for proper ACPI power management. + * - add some power micro-management (disable various units of the card + * as long as they're unused). However this requires I/O ports which I + * haven't figured out yet and which thus might not even exist... + * The standard suspend/resume functionality could probably make use of + * some improvement, too... * - figure out what all unknown port bits are responsible for + * - figure out some cleverly evil scheme to possibly make ALSA AC97 code + * fully accept our quite incompatible ""AC97"" mixer and thus save some + * code (but I'm not too optimistic that doing this is possible at all) */ #include @@ -214,9 +226,19 @@ struct snd_azf3328 { struct pci_dev *pci; int irq; + +#ifdef CONFIG_PM + /* register value containers for power management + * Note: not always full I/O range preserved (just like Win driver!) */ + u16 saved_regs_codec [AZF_IO_SIZE_CODEC_PM / 2]; + u16 saved_regs_io2 [AZF_IO_SIZE_IO2_PM / 2]; + u16 saved_regs_mpu [AZF_IO_SIZE_MPU_PM / 2]; + u16 saved_regs_synth[AZF_IO_SIZE_SYNTH_PM / 2]; + u16 saved_regs_mixer[AZF_IO_SIZE_MIXER_PM / 2]; +#endif }; -static const struct pci_device_id snd_azf3328_ids[] __devinitdata = { +static const struct pci_device_id snd_azf3328_ids[] = { { 0x122D, 0x50DC, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* PCI168/3328 */ { 0x122D, 0x80DA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* 3328 */ { 0, } @@ -317,10 +339,8 @@ snd_azf3328_mixer_write_volume_gradually(const struct snd_azf3328 *chip, int reg else dst_vol_left &= ~0x80; - do - { - if (!left_done) - { + do { + if (!left_done) { if (curr_vol_left > dst_vol_left) curr_vol_left--; else @@ -330,8 +350,7 @@ snd_azf3328_mixer_write_volume_gradually(const struct snd_azf3328 *chip, int reg left_done = 1; outb(curr_vol_left, portbase + 1); } - if (!right_done) - { + if (!right_done) { if (curr_vol_right > dst_vol_right) curr_vol_right--; else @@ -346,8 +365,7 @@ snd_azf3328_mixer_write_volume_gradually(const struct snd_azf3328 *chip, int reg } if (delay) mdelay(delay); - } - while ((!left_done) || (!right_done)); + } while ((!left_done) || (!right_done)); snd_azf3328_dbgcallleave(); } @@ -514,15 +532,18 @@ snd_azf3328_info_mixer_enum(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) { static const char * const texts1[] = { - "ModemOut1", "ModemOut2" + "Mic1", "Mic2" }; static const char * const texts2[] = { - "MonoSelectSource1", "MonoSelectSource2" + "Mix", "Mic" }; static const char * const texts3[] = { "Mic", "CD", "Video", "Aux", "Line", "Mix", "Mix Mono", "Phone" }; + static const char * const texts4[] = { + "pre 3D", "post 3D" + }; struct azf3328_mixer_reg reg; snd_azf3328_mixer_reg_decode(®, kcontrol->private_value); @@ -531,14 +552,19 @@ snd_azf3328_info_mixer_enum(struct snd_kcontrol *kcontrol, uinfo->value.enumerated.items = reg.enum_c; if (uinfo->value.enumerated.item > reg.enum_c - 1U) uinfo->value.enumerated.item = reg.enum_c - 1U; - if (reg.reg == IDX_MIXER_ADVCTL2) - { - if (reg.lchan_shift == 8) /* modem out sel */ + if (reg.reg == IDX_MIXER_ADVCTL2) { + switch(reg.lchan_shift) { + case 8: /* modem out sel */ strcpy(uinfo->value.enumerated.name, texts1[uinfo->value.enumerated.item]); - else /* mono sel source */ + break; + case 9: /* mono sel source */ strcpy(uinfo->value.enumerated.name, texts2[uinfo->value.enumerated.item]); - } - else + break; + case 15: /* PCM Out Path */ + strcpy(uinfo->value.enumerated.name, texts4[uinfo->value.enumerated.item]); + break; + } + } else strcpy(uinfo->value.enumerated.name, texts3[uinfo->value.enumerated.item] ); return 0; @@ -554,12 +580,10 @@ snd_azf3328_get_mixer_enum(struct snd_kcontrol *kcontrol, snd_azf3328_mixer_reg_decode(®, kcontrol->private_value); val = snd_azf3328_mixer_inw(chip, reg.reg); - if (reg.reg == IDX_MIXER_REC_SELECT) - { + if (reg.reg == IDX_MIXER_REC_SELECT) { ucontrol->value.enumerated.item[0] = (val >> 8) & (reg.enum_c - 1); ucontrol->value.enumerated.item[1] = (val >> 0) & (reg.enum_c - 1); - } - else + } else ucontrol->value.enumerated.item[0] = (val >> reg.lchan_shift) & (reg.enum_c - 1); snd_azf3328_dbgmixer("get_enum: %02x is %04x -> %d|%d (shift %02d, enum_c %d)\n", @@ -579,16 +603,13 @@ snd_azf3328_put_mixer_enum(struct snd_kcontrol *kcontrol, snd_azf3328_mixer_reg_decode(®, kcontrol->private_value); oreg = snd_azf3328_mixer_inw(chip, reg.reg); val = oreg; - if (reg.reg == IDX_MIXER_REC_SELECT) - { + if (reg.reg == IDX_MIXER_REC_SELECT) { if (ucontrol->value.enumerated.item[0] > reg.enum_c - 1U || ucontrol->value.enumerated.item[1] > reg.enum_c - 1U) return -EINVAL; val = (ucontrol->value.enumerated.item[0] << 8) | (ucontrol->value.enumerated.item[1] << 0); - } - else - { + } else { if (ucontrol->value.enumerated.item[0] > reg.enum_c - 1U) return -EINVAL; val &= ~((reg.enum_c - 1) << reg.lchan_shift); @@ -629,13 +650,14 @@ static const struct snd_kcontrol_new snd_azf3328_mixer_controls[] __devinitdata AZF3328_MIXER_VOL_MONO("Modem Playback Volume", IDX_MIXER_MODEMOUT, 0x1f, 1), AZF3328_MIXER_SWITCH("Modem Capture Switch", IDX_MIXER_MODEMIN, 15, 1), AZF3328_MIXER_VOL_MONO("Modem Capture Volume", IDX_MIXER_MODEMIN, 0x1f, 1), - AZF3328_MIXER_ENUM("Modem Out Select", IDX_MIXER_ADVCTL2, 2, 8), - AZF3328_MIXER_ENUM("Mono Select Source", IDX_MIXER_ADVCTL2, 2, 9), + AZF3328_MIXER_ENUM("Mic Select", IDX_MIXER_ADVCTL2, 2, 8), + AZF3328_MIXER_ENUM("Mono Output Select", IDX_MIXER_ADVCTL2, 2, 9), + AZF3328_MIXER_ENUM("PCM", IDX_MIXER_ADVCTL2, 2, 15), /* PCM Out Path, place in front since it controls *both* 3D and Bass/Treble! */ AZF3328_MIXER_VOL_SPECIAL("Tone Control - Treble", IDX_MIXER_BASSTREBLE, 0x07, 1, 0), AZF3328_MIXER_VOL_SPECIAL("Tone Control - Bass", IDX_MIXER_BASSTREBLE, 0x07, 9, 0), AZF3328_MIXER_SWITCH("3D Control - Switch", IDX_MIXER_ADVCTL2, 13, 0), - AZF3328_MIXER_VOL_SPECIAL("3D Control - Wide", IDX_MIXER_ADVCTL1, 0x07, 1, 0), /* "3D Width" */ - AZF3328_MIXER_VOL_SPECIAL("3D Control - Space", IDX_MIXER_ADVCTL1, 0x03, 8, 0), /* "Hifi 3D" */ + AZF3328_MIXER_VOL_SPECIAL("3D Control - Width", IDX_MIXER_ADVCTL1, 0x07, 1, 0), /* "3D Width" */ + AZF3328_MIXER_VOL_SPECIAL("3D Control - Depth", IDX_MIXER_ADVCTL1, 0x03, 8, 0), /* "Hifi 3D" */ #if MIXER_TESTING AZF3328_MIXER_SWITCH("0", IDX_MIXER_ADVCTL2, 0, 0), AZF3328_MIXER_SWITCH("1", IDX_MIXER_ADVCTL2, 1, 0), @@ -813,22 +835,18 @@ snd_azf3328_setdmaa(struct snd_azf3328 *chip, unsigned int is_running; snd_azf3328_dbgcallenter(); - if (do_recording) - { + if (do_recording) { /* access capture registers, i.e. skip playback reg section */ portbase = chip->codec_port + 0x20; is_running = chip->is_recording; - } - else - { + } else { /* access the playback register section */ portbase = chip->codec_port + 0x00; is_running = chip->is_playing; } /* AZF3328 uses a two buffer pointer DMA playback approach */ - if (!is_running) - { + if (!is_running) { unsigned long addr_area2; unsigned long count_areas, count_tmp; /* width 32bit -- overflow!! */ count_areas = size/2; @@ -961,6 +979,13 @@ snd_azf3328_playback_trigger(struct snd_pcm_substream *substream, int cmd) chip->is_playing = 1; snd_azf3328_dbgplay("STARTED PLAYBACK\n"); break; + case SNDRV_PCM_TRIGGER_RESUME: + snd_azf3328_dbgplay("RESUME PLAYBACK\n"); + /* resume playback if we were active */ + if (chip->is_playing) + snd_azf3328_codec_outw(chip, IDX_IO_PLAY_FLAGS, + snd_azf3328_codec_inw(chip, IDX_IO_PLAY_FLAGS) | DMA_RESUME); + break; case SNDRV_PCM_TRIGGER_STOP: snd_azf3328_dbgplay("STOP PLAYBACK\n"); @@ -988,6 +1013,12 @@ snd_azf3328_playback_trigger(struct snd_pcm_substream *substream, int cmd) chip->is_playing = 0; snd_azf3328_dbgplay("STOPPED PLAYBACK\n"); break; + case SNDRV_PCM_TRIGGER_SUSPEND: + snd_azf3328_dbgplay("SUSPEND PLAYBACK\n"); + /* make sure playback is stopped */ + snd_azf3328_codec_outw(chip, IDX_IO_PLAY_FLAGS, + snd_azf3328_codec_inw(chip, IDX_IO_PLAY_FLAGS) & ~DMA_RESUME); + break; case SNDRV_PCM_TRIGGER_PAUSE_PUSH: snd_printk(KERN_ERR "FIXME: SNDRV_PCM_TRIGGER_PAUSE_PUSH NIY!\n"); break; @@ -995,6 +1026,7 @@ snd_azf3328_playback_trigger(struct snd_pcm_substream *substream, int cmd) snd_printk(KERN_ERR "FIXME: SNDRV_PCM_TRIGGER_PAUSE_RELEASE NIY!\n"); break; default: + printk(KERN_ERR "FIXME: unknown trigger mode!\n"); return -EINVAL; } @@ -1068,6 +1100,13 @@ snd_azf3328_capture_trigger(struct snd_pcm_substream *substream, int cmd) chip->is_recording = 1; snd_azf3328_dbgplay("STARTED CAPTURE\n"); break; + case SNDRV_PCM_TRIGGER_RESUME: + snd_azf3328_dbgplay("RESUME CAPTURE\n"); + /* resume recording if we were active */ + if (chip->is_recording) + snd_azf3328_codec_outw(chip, IDX_IO_REC_FLAGS, + snd_azf3328_codec_inw(chip, IDX_IO_REC_FLAGS) | DMA_RESUME); + break; case SNDRV_PCM_TRIGGER_STOP: snd_azf3328_dbgplay("STOP CAPTURE\n"); @@ -1088,6 +1127,12 @@ snd_azf3328_capture_trigger(struct snd_pcm_substream *substream, int cmd) chip->is_recording = 0; snd_azf3328_dbgplay("STOPPED CAPTURE\n"); break; + case SNDRV_PCM_TRIGGER_SUSPEND: + snd_azf3328_dbgplay("SUSPEND CAPTURE\n"); + /* make sure recording is stopped */ + snd_azf3328_codec_outw(chip, IDX_IO_REC_FLAGS, + snd_azf3328_codec_inw(chip, IDX_IO_REC_FLAGS) & ~DMA_RESUME); + break; case SNDRV_PCM_TRIGGER_PAUSE_PUSH: snd_printk(KERN_ERR "FIXME: SNDRV_PCM_TRIGGER_PAUSE_PUSH NIY!\n"); break; @@ -1095,6 +1140,7 @@ snd_azf3328_capture_trigger(struct snd_pcm_substream *substream, int cmd) snd_printk(KERN_ERR "FIXME: SNDRV_PCM_TRIGGER_PAUSE_RELEASE NIY!\n"); break; default: + printk(KERN_ERR "FIXME: unknown trigger mode!\n"); return -EINVAL; } @@ -1163,8 +1209,7 @@ snd_azf3328_interrupt(int irq, void *dev_id, struct pt_regs *regs) snd_azf3328_codec_inw(chip, IDX_IO_PLAY_IRQTYPE), status); - if (status & IRQ_TIMER) - { + if (status & IRQ_TIMER) { /* snd_azf3328_dbgplay("timer %ld\n", inl(chip->codec_port+IDX_IO_TIMER_VALUE) & TIMER_VALUE_MASK); */ if (chip->timer) snd_timer_interrupt(chip->timer, chip->timer->sticks); @@ -1174,50 +1219,43 @@ snd_azf3328_interrupt(int irq, void *dev_id, struct pt_regs *regs) spin_unlock(&chip->reg_lock); snd_azf3328_dbgplay("azt3328: timer IRQ\n"); } - if (status & IRQ_PLAYBACK) - { + if (status & IRQ_PLAYBACK) { spin_lock(&chip->reg_lock); which = snd_azf3328_codec_inb(chip, IDX_IO_PLAY_IRQTYPE); /* ack all IRQ types immediately */ snd_azf3328_codec_outb(chip, IDX_IO_PLAY_IRQTYPE, which); spin_unlock(&chip->reg_lock); - if (chip->pcm && chip->playback_substream) - { + if (chip->pcm && chip->playback_substream) { snd_pcm_period_elapsed(chip->playback_substream); snd_azf3328_dbgplay("PLAY period done (#%x), @ %x\n", which, inl(chip->codec_port+IDX_IO_PLAY_DMA_CURRPOS)); - } - else + } else snd_azf3328_dbgplay("azt3328: ouch, irq handler problem!\n"); if (which & IRQ_PLAY_SOMETHING) snd_azf3328_dbgplay("azt3328: unknown play IRQ type occurred, please report!\n"); } - if (status & IRQ_RECORDING) - { + if (status & IRQ_RECORDING) { spin_lock(&chip->reg_lock); which = snd_azf3328_codec_inb(chip, IDX_IO_REC_IRQTYPE); /* ack all IRQ types immediately */ snd_azf3328_codec_outb(chip, IDX_IO_REC_IRQTYPE, which); spin_unlock(&chip->reg_lock); - if (chip->pcm && chip->capture_substream) - { + if (chip->pcm && chip->capture_substream) { snd_pcm_period_elapsed(chip->capture_substream); snd_azf3328_dbgplay("REC period done (#%x), @ %x\n", which, inl(chip->codec_port+IDX_IO_REC_DMA_CURRPOS)); - } - else + } else snd_azf3328_dbgplay("azt3328: ouch, irq handler problem!\n"); if (which & IRQ_REC_SOMETHING) snd_azf3328_dbgplay("azt3328: unknown rec IRQ type occurred, please report!\n"); } /* MPU401 has less critical IRQ requirements * than timer and playback/recording, right? */ - if (status & IRQ_MPU401) - { + if (status & IRQ_MPU401) { snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data, regs); /* hmm, do we have to ack the IRQ here somehow? @@ -1511,8 +1549,7 @@ snd_azf3328_timer_start(struct snd_timer *timer) snd_azf3328_dbgcallenter(); chip = snd_timer_chip(timer); delay = ((timer->sticks * seqtimer_scaling) - 1) & TIMER_VALUE_MASK; - if (delay < 49) - { + if (delay < 49) { /* uhoh, that's not good, since user-space won't know about * this timing tweak * (we need to do it to avoid a lockup, though) */ @@ -1687,7 +1724,7 @@ snd_azf3328_create(struct snd_card *card, chip->synth_port = pci_resource_start(pci, 3); chip->mixer_port = pci_resource_start(pci, 4); - if (request_irq(pci->irq, snd_azf3328_interrupt, SA_INTERRUPT|SA_SHIRQ, card->shortname, (void *)chip)) { + if (request_irq(pci->irq, snd_azf3328_interrupt, IRQF_DISABLED|IRQF_SHARED, card->shortname, (void *)chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); err = -EBUSY; goto out_err; @@ -1766,9 +1803,11 @@ snd_azf3328_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) goto out_err; } + card->private_data = chip; + if ((err = snd_mpu401_uart_new( card, 0, MPU401_HW_MPU401, - chip->mpu_port, 1, pci->irq, 0, - &chip->rmidi)) < 0) { + chip->mpu_port, MPU401_INFO_INTEGRATED, + pci->irq, 0, &chip->rmidi)) < 0) { snd_printk(KERN_ERR "azf3328: no MPU-401 device at 0x%lx?\n", chip->mpu_port); goto out_err; } @@ -1791,6 +1830,8 @@ snd_azf3328_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) } } + opl3->private_data = chip; + sprintf(card->longname, "%s at 0x%lx, irq %i", card->shortname, chip->codec_port, chip->irq); @@ -1834,11 +1875,80 @@ snd_azf3328_remove(struct pci_dev *pci) snd_azf3328_dbgcallleave(); } +#ifdef CONFIG_PM +static int +snd_azf3328_suspend(struct pci_dev *pci, pm_message_t state) +{ + struct snd_card *card = pci_get_drvdata(pci); + struct snd_azf3328 *chip = card->private_data; + int reg; + + snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); + + snd_pcm_suspend_all(chip->pcm); + + for (reg = 0; reg < AZF_IO_SIZE_MIXER_PM / 2; reg++) + chip->saved_regs_mixer[reg] = inw(chip->mixer_port + reg * 2); + + /* make sure to disable master volume etc. to prevent looping sound */ + snd_azf3328_mixer_set_mute(chip, IDX_MIXER_PLAY_MASTER, 1); + snd_azf3328_mixer_set_mute(chip, IDX_MIXER_WAVEOUT, 1); + + for (reg = 0; reg < AZF_IO_SIZE_CODEC_PM / 2; reg++) + chip->saved_regs_codec[reg] = inw(chip->codec_port + reg * 2); + for (reg = 0; reg < AZF_IO_SIZE_IO2_PM / 2; reg++) + chip->saved_regs_io2[reg] = inw(chip->io2_port + reg * 2); + for (reg = 0; reg < AZF_IO_SIZE_MPU_PM / 2; reg++) + chip->saved_regs_mpu[reg] = inw(chip->mpu_port + reg * 2); + for (reg = 0; reg < AZF_IO_SIZE_SYNTH_PM / 2; reg++) + chip->saved_regs_synth[reg] = inw(chip->synth_port + reg * 2); + + pci_set_power_state(pci, PCI_D3hot); + pci_disable_device(pci); + pci_save_state(pci); + return 0; +} + +static int +snd_azf3328_resume(struct pci_dev *pci) +{ + struct snd_card *card = pci_get_drvdata(pci); + struct snd_azf3328 *chip = card->private_data; + int reg; + + pci_restore_state(pci); + pci_enable_device(pci); + pci_set_power_state(pci, PCI_D0); + pci_set_master(pci); + + for (reg = 0; reg < AZF_IO_SIZE_IO2_PM / 2; reg++) + outw(chip->saved_regs_io2[reg], chip->io2_port + reg * 2); + for (reg = 0; reg < AZF_IO_SIZE_MPU_PM / 2; reg++) + outw(chip->saved_regs_mpu[reg], chip->mpu_port + reg * 2); + for (reg = 0; reg < AZF_IO_SIZE_SYNTH_PM / 2; reg++) + outw(chip->saved_regs_synth[reg], chip->synth_port + reg * 2); + for (reg = 0; reg < AZF_IO_SIZE_MIXER_PM / 2; reg++) + outw(chip->saved_regs_mixer[reg], chip->mixer_port + reg * 2); + for (reg = 0; reg < AZF_IO_SIZE_CODEC_PM / 2; reg++) + outw(chip->saved_regs_codec[reg], chip->codec_port + reg * 2); + + snd_power_change_state(card, SNDRV_CTL_POWER_D0); + return 0; +} +#endif + + + + static struct pci_driver driver = { .name = "AZF3328", .id_table = snd_azf3328_ids, .probe = snd_azf3328_probe, .remove = __devexit_p(snd_azf3328_remove), +#ifdef CONFIG_PM + .suspend = snd_azf3328_suspend, + .resume = snd_azf3328_resume, +#endif }; static int __init diff --git a/sound/pci/azt3328.h b/sound/pci/azt3328.h index f489bdaf6..b4f3e3cd0 100644 --- a/sound/pci/azt3328.h +++ b/sound/pci/azt3328.h @@ -5,6 +5,9 @@ /*** main I/O area port indices ***/ /* (only 0x70 of 0x80 bytes saved/restored by Windows driver) */ +#define AZF_IO_SIZE_CODEC 0x80 +#define AZF_IO_SIZE_CODEC_PM 0x70 + /* the driver initialisation suggests a layout of 4 main areas: * from 0x00 (playback), from 0x20 (recording) and from 0x40 (maybe MPU401??). * And another area from 0x60 to 0x6f (DirectX timer, IRQ management, @@ -87,7 +90,7 @@ #define IDX_IO_REC_DMA_CURROFS 0x34 /* PU:0x00000000 */ #define IDX_IO_REC_SOUNDFORMAT 0x36 /* PU:0x0000 */ -/** hmm, what is this I/O area for? MPU401?? (after playback, recording, ???, timer) **/ +/** hmm, what is this I/O area for? MPU401?? or external DAC via I2S?? (after playback, recording, ???, timer) **/ #define IDX_IO_SOMETHING_FLAGS 0x40 /* gets set to 0x34 just like port 0x0 and 0x20 on card init, PU:0x0000 */ /* general */ #define IDX_IO_42H 0x42 /* PU:0x0001 */ @@ -107,7 +110,8 @@ #define IRQ_UNKNOWN2 0x0080 /* probably unused */ #define IDX_IO_66H 0x66 /* writing 0xffff returns 0x0000 */ #define IDX_IO_SOME_VALUE 0x68 /* this is set to e.g. 0x3ff or 0x300, and writable; maybe some buffer limit, but I couldn't find out more, PU:0x00ff */ -#define IDX_IO_6AH 0x6A /* this WORD can be set to have bits 0x0028 activated; actually inhibits PCM playback!!! maybe power management?? */ +#define IDX_IO_6AH 0x6A /* this WORD can be set to have bits 0x0028 activated (FIXME: correct??); actually inhibits PCM playback!!! maybe power management?? */ + #define IO_6A_PAUSE_PLAYBACK 0x0200 /* bit 9; sure, this pauses playback, but what the heck is this really about?? */ #define IDX_IO_6CH 0x6C #define IDX_IO_6EH 0x6E /* writing 0xffff returns 0x83fe */ /* further I/O indices not saved/restored, so probably not used */ @@ -115,15 +119,25 @@ /*** I/O 2 area port indices ***/ /* (only 0x06 of 0x08 bytes saved/restored by Windows driver) */ +#define AZF_IO_SIZE_IO2 0x08 +#define AZF_IO_SIZE_IO2_PM 0x06 + #define IDX_IO2_LEGACY_ADDR 0x04 #define LEGACY_SOMETHING 0x01 /* OPL3?? */ #define LEGACY_JOY 0x08 +#define AZF_IO_SIZE_MPU 0x04 +#define AZF_IO_SIZE_MPU_PM 0x04 + +#define AZF_IO_SIZE_SYNTH 0x08 +#define AZF_IO_SIZE_SYNTH_PM 0x06 /*** mixer I/O area port indices ***/ /* (only 0x22 of 0x40 bytes saved/restored by Windows driver) - * generally spoken: AC97 register index = AZF3328 mixer reg index + 2 - * (in other words: AZF3328 NOT fully AC97 compliant) */ + * UNFORTUNATELY azf3328 is NOT truly AC97 compliant: see main file intro */ +#define AZF_IO_SIZE_MIXER 0x40 +#define AZF_IO_SIZE_MIXER_PM 0x22 + #define MIXER_VOLUME_RIGHT_MASK 0x001f #define MIXER_VOLUME_LEFT_MASK 0x1f00 #define MIXER_MUTE_MASK 0x8000 @@ -156,14 +170,14 @@ #define IDX_MIXER_ADVCTL1 0x1e /* unlisted bits are unmodifiable */ #define MIXER_ADVCTL1_3DWIDTH_MASK 0x000e - #define MIXER_ADVCTL1_HIFI3D_MASK 0x0300 -#define IDX_MIXER_ADVCTL2 0x20 /* resembles AC97_GENERAL_PURPOSE reg! */ + #define MIXER_ADVCTL1_HIFI3D_MASK 0x0300 /* yup, this is missing the high bit that official AC97 contains, plus it doesn't have linear bit value range behaviour but instead acts weirdly (possibly we're dealing with two *different* 3D settings here??) */ +#define IDX_MIXER_ADVCTL2 0x20 /* subset of AC97_GENERAL_PURPOSE reg! */ /* unlisted bits are unmodifiable */ - #define MIXER_ADVCTL2_BIT7 0x0080 /* WaveOut 3D Bypass? mutes WaveOut at LineOut */ - #define MIXER_ADVCTL2_BIT8 0x0100 /* is this Modem Out Select? */ - #define MIXER_ADVCTL2_BIT9 0x0200 /* Mono Select Source? */ - #define MIXER_ADVCTL2_BIT13 0x2000 /* 3D enable? */ - #define MIXER_ADVCTL2_BIT15 0x8000 /* unknown */ + #define MIXER_ADVCTL2_LPBK 0x0080 /* Loopback mode -- Win driver: "WaveOut3DBypass"? mutes WaveOut at LineOut */ + #define MIXER_ADVCTL2_MS 0x0100 /* Mic Select 0=Mic1, 1=Mic2 -- Win driver: "ModemOutSelect"?? */ + #define MIXER_ADVCTL2_MIX 0x0200 /* Mono output select 0=Mix, 1=Mic; Win driver: "MonoSelectSource"?? */ + #define MIXER_ADVCTL2_3D 0x2000 /* 3D Enhancement 1=on */ + #define MIXER_ADVCTL2_POP 0x8000 /* Pcm Out Path, 0=pre 3D, 1=post 3D */ #define IDX_MIXER_SOMETHING30H 0x30 /* used, but unknown??? */ diff --git a/sound/pci/bt87x.c b/sound/pci/bt87x.c index 9ee07d4aa..97a280a24 100644 --- a/sound/pci/bt87x.c +++ b/sound/pci/bt87x.c @@ -44,7 +44,7 @@ MODULE_SUPPORTED_DEVICE("{{Brooktree,Bt878}," static int index[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = -2}; /* Exclude the first card */ static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */ -static int digital_rate[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 0 }; /* digital input rate */ +static int digital_rate[SNDRV_CARDS]; /* digital input rate */ static int load_all; /* allow to load the non-whitelisted cards */ module_param_array(index, int, NULL, 0444); @@ -747,7 +747,7 @@ static int __devinit snd_bt87x_create(struct snd_card *card, snd_bt87x_writel(chip, REG_INT_MASK, 0); snd_bt87x_writel(chip, REG_INT_STAT, MY_INTERRUPTS); - if (request_irq(pci->irq, snd_bt87x_interrupt, SA_INTERRUPT | SA_SHIRQ, + if (request_irq(pci->irq, snd_bt87x_interrupt, IRQF_DISABLED | IRQF_SHARED, "Bt87x audio", chip)) { snd_bt87x_free(chip); snd_printk(KERN_ERR "cannot grab irq\n"); @@ -774,17 +774,19 @@ static int __devinit snd_bt87x_create(struct snd_card *card, .driver_data = rate } /* driver_data is the default digital_rate value for that device */ -static struct pci_device_id snd_bt87x_ids[] __devinitdata = { +static struct pci_device_id snd_bt87x_ids[] = { /* Hauppauge WinTV series */ BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x0070, 0x13eb, 32000), /* Hauppauge WinTV series */ BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_879, 0x0070, 0x13eb, 32000), /* Viewcast Osprey 200 */ BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x0070, 0xff01, 44100), - /* AVerMedia Studio No. 103, 203, ...? */ - BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x1461, 0x0003, 48000), /* Leadtek Winfast tv 2000xp delux */ BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x107d, 0x6606, 32000), + /* Voodoo TV 200 */ + BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x121a, 0x3000, 32000), + /* AVerMedia Studio No. 103, 203, ...? */ + BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x1461, 0x0003, 48000), { } }; MODULE_DEVICE_TABLE(pci, snd_bt87x_ids); @@ -886,8 +888,9 @@ static int __devinit snd_bt87x_probe(struct pci_dev *pci, strcpy(card->driver, "Bt87x"); sprintf(card->shortname, "Brooktree Bt%x", pci->device); - sprintf(card->longname, "%s at %#lx, irq %i", - card->shortname, pci_resource_start(pci, 0), chip->irq); + sprintf(card->longname, "%s at %#llx, irq %i", + card->shortname, (unsigned long long)pci_resource_start(pci, 0), + chip->irq); strcpy(card->mixername, "Bt87x"); err = snd_card_register(card); diff --git a/sound/pci/ca0106/ca0106.h b/sound/pci/ca0106/ca0106.h index deb028851..9cb66c59f 100644 --- a/sound/pci/ca0106/ca0106.h +++ b/sound/pci/ca0106/ca0106.h @@ -1,7 +1,7 @@ /* * Copyright (c) 2004 James Courtier-Dutton * Driver CA0106 chips. e.g. Sound Blaster Audigy LS and Live 24bit - * Version: 0.0.20 + * Version: 0.0.21 * * FEATURES currently supported: * See ca0106_main.c for features. @@ -45,6 +45,8 @@ * Added I2C and SPI registers. Filled in interrupt enable. * 0.0.20 * Added GPIO info for SB Live 24bit. + * 0.0.21 + * Implement support for Line-in capture on SB Live 24bit. * * * This code was initally based on code from ALSA's emu10k1x.c which is: @@ -152,7 +154,7 @@ * bit 9 0 = Mute / 1 = Analog out. * bit 10 0 = Line-in / 1 = Mic-in. * bit 11 0 = ? / 1 = ? - * bit 12 0 = ? / 1 = ? + * bit 12 0 = 48 Khz / 1 = 96 Khz Analog out on SB Live 24bit. * bit 13 0 = ? / 1 = ? * bit 14 0 = Mute / 1 = Analog out * bit 15 0 = ? / 1 = ? @@ -397,10 +399,24 @@ #define PLAYBACK_VOLUME2 0x6a /* Playback Analog volume per channel. Does not effect AC3 output */ /* Similar to register 0x66, except that the destination is the I2S mixer instead of the SPDIF mixer. I.E. Outputs to the Analog outputs instead of SPDIF. */ #define UNKNOWN6b 0x6b /* Unknown. Readonly. Default 00400000 00400000 00400000 00400000 */ -#define UART_A_DATA 0x6c /* Uart, used in setting sample rates, bits per sample etc. */ -#define UART_A_CMD 0x6d /* Uart, used in setting sample rates, bits per sample etc. */ -#define UART_B_DATA 0x6e /* Uart, Unknown. */ -#define UART_B_CMD 0x6f /* Uart, Unknown. */ +#define MIDI_UART_A_DATA 0x6c /* Midi Uart A Data */ +#define MIDI_UART_A_CMD 0x6d /* Midi Uart A Command/Status */ +#define MIDI_UART_B_DATA 0x6e /* Midi Uart B Data (currently unused) */ +#define MIDI_UART_B_CMD 0x6f /* Midi Uart B Command/Status (currently unused) */ + +/* unique channel identifier for midi->channel */ + +#define CA0106_MIDI_CHAN_A 0x1 +#define CA0106_MIDI_CHAN_B 0x2 + +/* from mpu401 */ + +#define CA0106_MIDI_INPUT_AVAIL 0x80 +#define CA0106_MIDI_OUTPUT_READY 0x40 +#define CA0106_MPU401_RESET 0xff +#define CA0106_MPU401_ENTER_UART 0x3f +#define CA0106_MPU401_ACK 0xfe + #define SAMPLE_RATE_TRACKER_STATUS 0x70 /* Readonly. Default 00108000 00108000 00500000 00500000 */ /* Estimated sample rate [19:0] Relative to 48kHz. 0x8000 = 1.0 * Rate Locked [20] @@ -475,9 +491,56 @@ /* Causes interrupts based on timer intervals. */ #define SPI 0x7a /* SPI: Serial Interface Register */ #define I2C_A 0x7b /* I2C Address. 32 bit */ -#define I2C_0 0x7c /* I2C Data Port 0. 32 bit */ -#define I2C_1 0x7d /* I2C Data Port 1. 32 bit */ +#define I2C_D0 0x7c /* I2C Data Port 0. 32 bit */ +#define I2C_D1 0x7d /* I2C Data Port 1. 32 bit */ +//I2C values +#define I2C_A_ADC_ADD_MASK 0x000000fe //The address is a 7 bit address +#define I2C_A_ADC_RW_MASK 0x00000001 //bit mask for R/W +#define I2C_A_ADC_TRANS_MASK 0x00000010 //Bit mask for I2c address DAC value +#define I2C_A_ADC_ABORT_MASK 0x00000020 //Bit mask for I2C transaction abort flag +#define I2C_A_ADC_LAST_MASK 0x00000040 //Bit mask for Last word transaction +#define I2C_A_ADC_BYTE_MASK 0x00000080 //Bit mask for Byte Mode + +#define I2C_A_ADC_ADD 0x00000034 //This is the Device address for ADC +#define I2C_A_ADC_READ 0x00000001 //To perform a read operation +#define I2C_A_ADC_START 0x00000100 //Start I2C transaction +#define I2C_A_ADC_ABORT 0x00000200 //I2C transaction abort +#define I2C_A_ADC_LAST 0x00000400 //I2C last transaction +#define I2C_A_ADC_BYTE 0x00000800 //I2C one byte mode + +#define I2C_D_ADC_REG_MASK 0xfe000000 //ADC address register +#define I2C_D_ADC_DAT_MASK 0x01ff0000 //ADC data register + +#define ADC_TIMEOUT 0x00000007 //ADC Timeout Clock Disable +#define ADC_IFC_CTRL 0x0000000b //ADC Interface Control +#define ADC_MASTER 0x0000000c //ADC Master Mode Control +#define ADC_POWER 0x0000000d //ADC PowerDown Control +#define ADC_ATTEN_ADCL 0x0000000e //ADC Attenuation ADCL +#define ADC_ATTEN_ADCR 0x0000000f //ADC Attenuation ADCR +#define ADC_ALC_CTRL1 0x00000010 //ADC ALC Control 1 +#define ADC_ALC_CTRL2 0x00000011 //ADC ALC Control 2 +#define ADC_ALC_CTRL3 0x00000012 //ADC ALC Control 3 +#define ADC_NOISE_CTRL 0x00000013 //ADC Noise Gate Control +#define ADC_LIMIT_CTRL 0x00000014 //ADC Limiter Control +#define ADC_MUX 0x00000015 //ADC Mux offset +#if 0 +/* FIXME: Not tested yet. */ +#define ADC_GAIN_MASK 0x000000ff //Mask for ADC Gain +#define ADC_ZERODB 0x000000cf //Value to set ADC to 0dB +#define ADC_MUTE_MASK 0x000000c0 //Mask for ADC mute +#define ADC_MUTE 0x000000c0 //Value to mute ADC +#define ADC_OSR 0x00000008 //Mask for ADC oversample rate select +#define ADC_TIMEOUT_DISABLE 0x00000008 //Value and mask to disable Timeout clock +#define ADC_HPF_DISABLE 0x00000100 //Value and mask to disable High pass filter +#define ADC_TRANWIN_MASK 0x00000070 //Mask for Length of Transient Window +#endif + +#define ADC_MUX_MASK 0x0000000f //Mask for ADC Mux +#define ADC_MUX_PHONE 0x00000001 //Value to select TAD at ADC Mux (Not used) +#define ADC_MUX_MIC 0x00000002 //Value to select Mic at ADC Mux +#define ADC_MUX_LINEIN 0x00000004 //Value to select LineIn at ADC Mux +#define ADC_MUX_AUX 0x00000008 //Value to select Aux at ADC Mux #define SET_CHANNEL 0 /* Testing channel outputs 0=Front, 1=Center/LFE, 2=Unknown, 3=Rear */ #define PCM_FRONT_CHANNEL 0 @@ -489,28 +552,38 @@ #define CONTROL_CENTER_LFE_CHANNEL 1 #define CONTROL_UNKNOWN_CHANNEL 2 -typedef struct snd_ca0106_channel ca0106_channel_t; -typedef struct snd_ca0106 ca0106_t; -typedef struct snd_ca0106_pcm ca0106_pcm_t; +#include "ca_midi.h" + +struct snd_ca0106; struct snd_ca0106_channel { - ca0106_t *emu; + struct snd_ca0106 *emu; int number; int use; - void (*interrupt)(ca0106_t *emu, ca0106_channel_t *channel); - ca0106_pcm_t *epcm; + void (*interrupt)(struct snd_ca0106 *emu, struct snd_ca0106_channel *channel); + struct snd_ca0106_pcm *epcm; }; struct snd_ca0106_pcm { - ca0106_t *emu; - snd_pcm_substream_t *substream; + struct snd_ca0106 *emu; + struct snd_pcm_substream *substream; int channel_id; unsigned short running; }; +struct snd_ca0106_details { + u32 serial; + char * name; + int ac97; + int gpio_type; + int i2c_adc; + int spi_dac; +}; + // definition of the chip-specific record struct snd_ca0106 { - snd_card_t *card; + struct snd_card *card; + struct snd_ca0106_details *details; struct pci_dev *pci; unsigned long port; @@ -523,27 +596,36 @@ struct snd_ca0106 { spinlock_t emu_lock; - ac97_t *ac97; - snd_pcm_t *pcm; + struct snd_ac97 *ac97; + struct snd_pcm *pcm; - ca0106_channel_t playback_channels[4]; - ca0106_channel_t capture_channels[4]; + struct snd_ca0106_channel playback_channels[4]; + struct snd_ca0106_channel capture_channels[4]; u32 spdif_bits[4]; /* s/pdif out setup */ int spdif_enable; int capture_source; + int i2c_capture_source; + u8 i2c_capture_volume[4][2]; + int capture_mic_line_in; struct snd_dma_buffer buffer; + + struct snd_ca_midi midi; + struct snd_ca_midi midi2; }; -int __devinit snd_ca0106_mixer(ca0106_t *emu); -int __devinit snd_ca0106_proc_init(ca0106_t * emu); +int snd_ca0106_mixer(struct snd_ca0106 *emu); +int snd_ca0106_proc_init(struct snd_ca0106 * emu); + +unsigned int snd_ca0106_ptr_read(struct snd_ca0106 * emu, + unsigned int reg, + unsigned int chn); + +void snd_ca0106_ptr_write(struct snd_ca0106 *emu, + unsigned int reg, + unsigned int chn, + unsigned int data); -unsigned int snd_ca0106_ptr_read(ca0106_t * emu, - unsigned int reg, - unsigned int chn); +int snd_ca0106_i2c_write(struct snd_ca0106 *emu, u32 reg, u32 value); -void snd_ca0106_ptr_write(ca0106_t *emu, - unsigned int reg, - unsigned int chn, - unsigned int data); diff --git a/sound/pci/ca0106/ca0106_main.c b/sound/pci/ca0106/ca0106_main.c index 82533b45b..12bbbb6af 100644 --- a/sound/pci/ca0106/ca0106_main.c +++ b/sound/pci/ca0106/ca0106_main.c @@ -1,7 +1,7 @@ /* * Copyright (c) 2004 James Courtier-Dutton * Driver CA0106 chips. e.g. Sound Blaster Audigy LS and Live 24bit - * Version: 0.0.22 + * Version: 0.0.23 * * FEATURES currently supported: * Front, Rear and Center/LFE. @@ -77,6 +77,8 @@ * Add SPDIF capture using optional digital I/O module for SB Live 24bit. (Analog capture does not yet work.) * 0.0.22 * Add support for MSI K8N Diamond Motherboard with onboard SB Live 24bit without AC97. From kiksen, bug #901 + * 0.0.23 + * Implement support for Line-in capture on SB Live 24bit. * * BUGS: * Some stability problems when unloading the snd-ca0106 kernel module. @@ -136,6 +138,7 @@ #include #include #include +#include #include #include #include @@ -161,28 +164,77 @@ MODULE_PARM_DESC(enable, "Enable the CA0106 soundcard."); #include "ca0106.h" -typedef struct { - u32 serial; - char * name; -} ca0106_names_t; - -static ca0106_names_t ca0106_chip_names[] = { - { 0x10021102, "AudigyLS [SB0310]"} , - { 0x10051102, "AudigyLS [SB0310b]"} , /* Unknown AudigyLS that also says SB0310 on it */ - { 0x10061102, "Live! 7.1 24bit [SB0410]"} , /* New Sound Blaster Live! 7.1 24bit. This does not have an AC97. 53SB041000001 */ - { 0x10071102, "Live! 7.1 24bit [SB0413]"} , /* New Dell Sound Blaster Live! 7.1 24bit. This does not have an AC97. */ - { 0x10091462, "MSI K8N Diamond MB [SB0438]"}, /* MSI K8N Diamond Motherboard with onboard SB Live 24bit without AC97 */ - { 0, "AudigyLS [Unknown]" } +static struct snd_ca0106_details ca0106_chip_details[] = { + /* AudigyLS[SB0310] */ + { .serial = 0x10021102, + .name = "AudigyLS [SB0310]", + .ac97 = 1 } , + /* Unknown AudigyLS that also says SB0310 on it */ + { .serial = 0x10051102, + .name = "AudigyLS [SB0310b]", + .ac97 = 1 } , + /* New Sound Blaster Live! 7.1 24bit. This does not have an AC97. 53SB041000001 */ + { .serial = 0x10061102, + .name = "Live! 7.1 24bit [SB0410]", + .gpio_type = 1, + .i2c_adc = 1 } , + /* New Dell Sound Blaster Live! 7.1 24bit. This does not have an AC97. */ + { .serial = 0x10071102, + .name = "Live! 7.1 24bit [SB0413]", + .gpio_type = 1, + .i2c_adc = 1 } , + /* New Audigy SE. Has a different DAC. */ + /* SB0570: + * CTRL:CA0106-DAT + * ADC: WM8775EDS + * DAC: WM8768GEDS + */ + { .serial = 0x100a1102, + .name = "Audigy SE [SB0570]", + .gpio_type = 1, + .i2c_adc = 1, + .spi_dac = 1 } , + /* MSI K8N Diamond Motherboard with onboard SB Live 24bit without AC97 */ + /* SB0438 + * CTRL:CA0106-DAT + * ADC: WM8775SEDS + * DAC: CS4382-KQZ + */ + { .serial = 0x10091462, + .name = "MSI K8N Diamond MB [SB0438]", + .gpio_type = 2, + .i2c_adc = 1 } , + /* Shuttle XPC SD31P which has an onboard Creative Labs + * Sound Blaster Live! 24-bit EAX + * high-definition 7.1 audio processor". + * Added using info from andrewvegan in alsa bug #1298 + */ + { .serial = 0x30381297, + .name = "Shuttle XPC SD31P [SD31P]", + .gpio_type = 1, + .i2c_adc = 1 } , + /* Shuttle XPC SD11G5 which has an onboard Creative Labs + * Sound Blaster Live! 24-bit EAX + * high-definition 7.1 audio processor". + * Fixes ALSA bug#1600 + */ + { .serial = 0x30411297, + .name = "Shuttle XPC SD11G5 [SD11G5]", + .gpio_type = 1, + .i2c_adc = 1 } , + { .serial = 0, + .name = "AudigyLS [Unknown]" } }; /* hardware definition */ -static snd_pcm_hardware_t snd_ca0106_playback_hw = { +static struct snd_pcm_hardware snd_ca0106_playback_hw = { .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_MMAP_VALID), .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE, - .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000, + .rates = (SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | + SNDRV_PCM_RATE_192000), .rate_min = 48000, .rate_max = 192000, .channels_min = 2, //1, @@ -195,15 +247,16 @@ static snd_pcm_hardware_t snd_ca0106_playback_hw = { .fifo_size = 0, }; -static snd_pcm_hardware_t snd_ca0106_capture_hw = { +static struct snd_pcm_hardware snd_ca0106_capture_hw = { .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_MMAP_VALID), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rates = SNDRV_PCM_RATE_48000, - .rate_min = 48000, - .rate_max = 48000, + .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE, + .rates = (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 | + SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000), + .rate_min = 44100, + .rate_max = 192000, .channels_min = 2, .channels_max = 2, .buffer_bytes_max = ((65536 - 64) * 8), @@ -214,7 +267,7 @@ static snd_pcm_hardware_t snd_ca0106_capture_hw = { .fifo_size = 0, }; -unsigned int snd_ca0106_ptr_read(ca0106_t * emu, +unsigned int snd_ca0106_ptr_read(struct snd_ca0106 * emu, unsigned int reg, unsigned int chn) { @@ -230,7 +283,7 @@ unsigned int snd_ca0106_ptr_read(ca0106_t * emu, return val; } -void snd_ca0106_ptr_write(ca0106_t *emu, +void snd_ca0106_ptr_write(struct snd_ca0106 *emu, unsigned int reg, unsigned int chn, unsigned int data) @@ -246,7 +299,94 @@ void snd_ca0106_ptr_write(ca0106_t *emu, spin_unlock_irqrestore(&emu->emu_lock, flags); } -static void snd_ca0106_intr_enable(ca0106_t *emu, unsigned int intrenb) +int snd_ca0106_spi_write(struct snd_ca0106 * emu, + unsigned int data) +{ + unsigned int reset, set; + unsigned int reg, tmp; + int n, result; + reg = SPI; + if (data > 0xffff) /* Only 16bit values allowed */ + return 1; + tmp = snd_ca0106_ptr_read(emu, reg, 0); + reset = (tmp & ~0x3ffff) | 0x20000; /* Set xxx20000 */ + set = reset | 0x10000; /* Set xxx1xxxx */ + snd_ca0106_ptr_write(emu, reg, 0, reset | data); + tmp = snd_ca0106_ptr_read(emu, reg, 0); /* write post */ + snd_ca0106_ptr_write(emu, reg, 0, set | data); + result = 1; + /* Wait for status bit to return to 0 */ + for (n = 0; n < 100; n++) { + udelay(10); + tmp = snd_ca0106_ptr_read(emu, reg, 0); + if (!(tmp & 0x10000)) { + result = 0; + break; + } + } + if (result) /* Timed out */ + return 1; + snd_ca0106_ptr_write(emu, reg, 0, reset | data); + tmp = snd_ca0106_ptr_read(emu, reg, 0); /* Write post */ + return 0; +} + +/* The ADC does not support i2c read, so only write is implemented */ +int snd_ca0106_i2c_write(struct snd_ca0106 *emu, + u32 reg, + u32 value) +{ + u32 tmp; + int timeout = 0; + int status; + int retry; + if ((reg > 0x7f) || (value > 0x1ff)) { + snd_printk(KERN_ERR "i2c_write: invalid values.\n"); + return -EINVAL; + } + + tmp = reg << 25 | value << 16; + // snd_printk("I2C-write:reg=0x%x, value=0x%x\n", reg, value); + /* Not sure what this I2C channel controls. */ + /* snd_ca0106_ptr_write(emu, I2C_D0, 0, tmp); */ + + /* This controls the I2C connected to the WM8775 ADC Codec */ + snd_ca0106_ptr_write(emu, I2C_D1, 0, tmp); + + for (retry = 0; retry < 10; retry++) { + /* Send the data to i2c */ + //tmp = snd_ca0106_ptr_read(emu, I2C_A, 0); + //tmp = tmp & ~(I2C_A_ADC_READ|I2C_A_ADC_LAST|I2C_A_ADC_START|I2C_A_ADC_ADD_MASK); + tmp = 0; + tmp = tmp | (I2C_A_ADC_LAST|I2C_A_ADC_START|I2C_A_ADC_ADD); + snd_ca0106_ptr_write(emu, I2C_A, 0, tmp); + + /* Wait till the transaction ends */ + while (1) { + status = snd_ca0106_ptr_read(emu, I2C_A, 0); + //snd_printk("I2C:status=0x%x\n", status); + timeout++; + if ((status & I2C_A_ADC_START) == 0) + break; + + if (timeout > 1000) + break; + } + //Read back and see if the transaction is successful + if ((status & I2C_A_ADC_ABORT) == 0) + break; + } + + if (retry == 10) { + snd_printk(KERN_ERR "Writing to ADC failed!\n"); + return -EINVAL; + } + + return 0; +} + + +static void snd_ca0106_intr_enable(struct snd_ca0106 *emu, unsigned int intrenb) { unsigned long flags; unsigned int enable; @@ -257,25 +397,34 @@ static void snd_ca0106_intr_enable(ca0106_t *emu, unsigned int intrenb) spin_unlock_irqrestore(&emu->emu_lock, flags); } -static void snd_ca0106_pcm_free_substream(snd_pcm_runtime_t *runtime) +static void snd_ca0106_intr_disable(struct snd_ca0106 *emu, unsigned int intrenb) { - ca0106_pcm_t *epcm = runtime->private_data; + unsigned long flags; + unsigned int enable; - if (epcm) { - kfree(epcm); - } + spin_lock_irqsave(&emu->emu_lock, flags); + enable = inl(emu->port + INTE) & ~intrenb; + outl(enable, emu->port + INTE); + spin_unlock_irqrestore(&emu->emu_lock, flags); +} + + +static void snd_ca0106_pcm_free_substream(struct snd_pcm_runtime *runtime) +{ + kfree(runtime->private_data); } /* open_playback callback */ -static int snd_ca0106_pcm_open_playback_channel(snd_pcm_substream_t *substream, int channel_id) +static int snd_ca0106_pcm_open_playback_channel(struct snd_pcm_substream *substream, + int channel_id) { - ca0106_t *chip = snd_pcm_substream_chip(substream); - ca0106_channel_t *channel = &(chip->playback_channels[channel_id]); - ca0106_pcm_t *epcm; - snd_pcm_runtime_t *runtime = substream->runtime; + struct snd_ca0106 *chip = snd_pcm_substream_chip(substream); + struct snd_ca0106_channel *channel = &(chip->playback_channels[channel_id]); + struct snd_ca0106_pcm *epcm; + struct snd_pcm_runtime *runtime = substream->runtime; int err; - epcm = kcalloc(1, sizeof(*epcm), GFP_KERNEL); + epcm = kzalloc(sizeof(*epcm), GFP_KERNEL); if (epcm == NULL) return -ENOMEM; @@ -291,10 +440,10 @@ static int snd_ca0106_pcm_open_playback_channel(snd_pcm_substream_t *substream, channel->emu = chip; channel->number = channel_id; - channel->use=1; + channel->use = 1; //printk("open:channel_id=%d, chip=%p, channel=%p\n",channel_id, chip, channel); //channel->interrupt = snd_ca0106_pcm_channel_interrupt; - channel->epcm=epcm; + channel->epcm = epcm; if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0) return err; if ((err = snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 64)) < 0) @@ -303,48 +452,49 @@ static int snd_ca0106_pcm_open_playback_channel(snd_pcm_substream_t *substream, } /* close callback */ -static int snd_ca0106_pcm_close_playback(snd_pcm_substream_t *substream) +static int snd_ca0106_pcm_close_playback(struct snd_pcm_substream *substream) { - ca0106_t *chip = snd_pcm_substream_chip(substream); - snd_pcm_runtime_t *runtime = substream->runtime; - ca0106_pcm_t *epcm = runtime->private_data; - chip->playback_channels[epcm->channel_id].use=0; -/* FIXME: maybe zero others */ + struct snd_ca0106 *chip = snd_pcm_substream_chip(substream); + struct snd_pcm_runtime *runtime = substream->runtime; + struct snd_ca0106_pcm *epcm = runtime->private_data; + chip->playback_channels[epcm->channel_id].use = 0; + /* FIXME: maybe zero others */ return 0; } -static int snd_ca0106_pcm_open_playback_front(snd_pcm_substream_t *substream) +static int snd_ca0106_pcm_open_playback_front(struct snd_pcm_substream *substream) { return snd_ca0106_pcm_open_playback_channel(substream, PCM_FRONT_CHANNEL); } -static int snd_ca0106_pcm_open_playback_center_lfe(snd_pcm_substream_t *substream) +static int snd_ca0106_pcm_open_playback_center_lfe(struct snd_pcm_substream *substream) { return snd_ca0106_pcm_open_playback_channel(substream, PCM_CENTER_LFE_CHANNEL); } -static int snd_ca0106_pcm_open_playback_unknown(snd_pcm_substream_t *substream) +static int snd_ca0106_pcm_open_playback_unknown(struct snd_pcm_substream *substream) { return snd_ca0106_pcm_open_playback_channel(substream, PCM_UNKNOWN_CHANNEL); } -static int snd_ca0106_pcm_open_playback_rear(snd_pcm_substream_t *substream) +static int snd_ca0106_pcm_open_playback_rear(struct snd_pcm_substream *substream) { return snd_ca0106_pcm_open_playback_channel(substream, PCM_REAR_CHANNEL); } /* open_capture callback */ -static int snd_ca0106_pcm_open_capture_channel(snd_pcm_substream_t *substream, int channel_id) +static int snd_ca0106_pcm_open_capture_channel(struct snd_pcm_substream *substream, + int channel_id) { - ca0106_t *chip = snd_pcm_substream_chip(substream); - ca0106_channel_t *channel = &(chip->capture_channels[channel_id]); - ca0106_pcm_t *epcm; - snd_pcm_runtime_t *runtime = substream->runtime; + struct snd_ca0106 *chip = snd_pcm_substream_chip(substream); + struct snd_ca0106_channel *channel = &(chip->capture_channels[channel_id]); + struct snd_ca0106_pcm *epcm; + struct snd_pcm_runtime *runtime = substream->runtime; int err; - epcm = kcalloc(1, sizeof(*epcm), GFP_KERNEL); + epcm = kzalloc(sizeof(*epcm), GFP_KERNEL); if (epcm == NULL) { - snd_printk("open_capture_channel: failed epcm alloc\n"); + snd_printk(KERN_ERR "open_capture_channel: failed epcm alloc\n"); return -ENOMEM; } epcm->emu = chip; @@ -359,10 +509,10 @@ static int snd_ca0106_pcm_open_capture_channel(snd_pcm_substream_t *substream, i channel->emu = chip; channel->number = channel_id; - channel->use=1; + channel->use = 1; //printk("open:channel_id=%d, chip=%p, channel=%p\n",channel_id, chip, channel); //channel->interrupt = snd_ca0106_pcm_channel_interrupt; - channel->epcm=epcm; + channel->epcm = epcm; if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0) return err; //snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE, &hw_constraints_capture_period_sizes); @@ -372,70 +522,70 @@ static int snd_ca0106_pcm_open_capture_channel(snd_pcm_substream_t *substream, i } /* close callback */ -static int snd_ca0106_pcm_close_capture(snd_pcm_substream_t *substream) +static int snd_ca0106_pcm_close_capture(struct snd_pcm_substream *substream) { - ca0106_t *chip = snd_pcm_substream_chip(substream); - snd_pcm_runtime_t *runtime = substream->runtime; - ca0106_pcm_t *epcm = runtime->private_data; - chip->capture_channels[epcm->channel_id].use=0; -/* FIXME: maybe zero others */ + struct snd_ca0106 *chip = snd_pcm_substream_chip(substream); + struct snd_pcm_runtime *runtime = substream->runtime; + struct snd_ca0106_pcm *epcm = runtime->private_data; + chip->capture_channels[epcm->channel_id].use = 0; + /* FIXME: maybe zero others */ return 0; } -static int snd_ca0106_pcm_open_0_capture(snd_pcm_substream_t *substream) +static int snd_ca0106_pcm_open_0_capture(struct snd_pcm_substream *substream) { return snd_ca0106_pcm_open_capture_channel(substream, 0); } -static int snd_ca0106_pcm_open_1_capture(snd_pcm_substream_t *substream) +static int snd_ca0106_pcm_open_1_capture(struct snd_pcm_substream *substream) { return snd_ca0106_pcm_open_capture_channel(substream, 1); } -static int snd_ca0106_pcm_open_2_capture(snd_pcm_substream_t *substream) +static int snd_ca0106_pcm_open_2_capture(struct snd_pcm_substream *substream) { return snd_ca0106_pcm_open_capture_channel(substream, 2); } -static int snd_ca0106_pcm_open_3_capture(snd_pcm_substream_t *substream) +static int snd_ca0106_pcm_open_3_capture(struct snd_pcm_substream *substream) { return snd_ca0106_pcm_open_capture_channel(substream, 3); } /* hw_params callback */ -static int snd_ca0106_pcm_hw_params_playback(snd_pcm_substream_t *substream, - snd_pcm_hw_params_t * hw_params) +static int snd_ca0106_pcm_hw_params_playback(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *hw_params) { return snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params)); } /* hw_free callback */ -static int snd_ca0106_pcm_hw_free_playback(snd_pcm_substream_t *substream) +static int snd_ca0106_pcm_hw_free_playback(struct snd_pcm_substream *substream) { return snd_pcm_lib_free_pages(substream); } /* hw_params callback */ -static int snd_ca0106_pcm_hw_params_capture(snd_pcm_substream_t *substream, - snd_pcm_hw_params_t * hw_params) +static int snd_ca0106_pcm_hw_params_capture(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *hw_params) { return snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params)); } /* hw_free callback */ -static int snd_ca0106_pcm_hw_free_capture(snd_pcm_substream_t *substream) +static int snd_ca0106_pcm_hw_free_capture(struct snd_pcm_substream *substream) { return snd_pcm_lib_free_pages(substream); } /* prepare playback callback */ -static int snd_ca0106_pcm_prepare_playback(snd_pcm_substream_t *substream) +static int snd_ca0106_pcm_prepare_playback(struct snd_pcm_substream *substream) { - ca0106_t *emu = snd_pcm_substream_chip(substream); - snd_pcm_runtime_t *runtime = substream->runtime; - ca0106_pcm_t *epcm = runtime->private_data; + struct snd_ca0106 *emu = snd_pcm_substream_chip(substream); + struct snd_pcm_runtime *runtime = substream->runtime; + struct snd_ca0106_pcm *epcm = runtime->private_data; int channel = epcm->channel_id; u32 *table_base = (u32 *)(emu->buffer.area+(8*16*channel)); u32 period_size_bytes = frames_to_bytes(runtime, runtime->period_size); @@ -504,8 +654,8 @@ static int snd_ca0106_pcm_prepare_playback(snd_pcm_substream_t *substream) /* FIXME: Check emu->buffer.size before actually writing to it. */ for(i=0; i < runtime->periods; i++) { - table_base[i*2]=runtime->dma_addr+(i*period_size_bytes); - table_base[(i*2)+1]=period_size_bytes<<16; + table_base[i*2] = runtime->dma_addr + (i * period_size_bytes); + table_base[i*2+1] = period_size_bytes << 16; } snd_ca0106_ptr_write(emu, PLAYBACK_LIST_ADDR, channel, emu->buffer.addr+(8*16*channel)); @@ -532,12 +682,67 @@ static int snd_ca0106_pcm_prepare_playback(snd_pcm_substream_t *substream) } /* prepare capture callback */ -static int snd_ca0106_pcm_prepare_capture(snd_pcm_substream_t *substream) +static int snd_ca0106_pcm_prepare_capture(struct snd_pcm_substream *substream) { - ca0106_t *emu = snd_pcm_substream_chip(substream); - snd_pcm_runtime_t *runtime = substream->runtime; - ca0106_pcm_t *epcm = runtime->private_data; + struct snd_ca0106 *emu = snd_pcm_substream_chip(substream); + struct snd_pcm_runtime *runtime = substream->runtime; + struct snd_ca0106_pcm *epcm = runtime->private_data; int channel = epcm->channel_id; + u32 hcfg_mask = HCFG_CAPTURE_S32_LE; + u32 hcfg_set = 0x00000000; + u32 hcfg; + u32 over_sampling=0x2; + u32 reg71_mask = 0x0000c000 ; /* Global. Set ADC rate. */ + u32 reg71_set = 0; + u32 reg71; + + //snd_printk("prepare:channel_number=%d, rate=%d, format=0x%x, channels=%d, buffer_size=%ld, period_size=%ld, periods=%u, frames_to_bytes=%d\n",channel, runtime->rate, runtime->format, runtime->channels, runtime->buffer_size, runtime->period_size, runtime->periods, frames_to_bytes(runtime, 1)); + //snd_printk("dma_addr=%x, dma_area=%p, table_base=%p\n",runtime->dma_addr, runtime->dma_area, table_base); + //snd_printk("dma_addr=%x, dma_area=%p, dma_bytes(size)=%x\n",emu->buffer.addr, emu->buffer.area, emu->buffer.bytes); + /* reg71 controls ADC rate. */ + switch (runtime->rate) { + case 44100: + reg71_set = 0x00004000; + break; + case 48000: + reg71_set = 0; + break; + case 96000: + reg71_set = 0x00008000; + over_sampling=0xa; + break; + case 192000: + reg71_set = 0x0000c000; + over_sampling=0xa; + break; + default: + reg71_set = 0; + break; + } + /* Format is a global setting */ + /* FIXME: Only let the first channel accessed set this. */ + switch (runtime->format) { + case SNDRV_PCM_FORMAT_S16_LE: + hcfg_set = 0; + break; + case SNDRV_PCM_FORMAT_S32_LE: + hcfg_set = HCFG_CAPTURE_S32_LE; + break; + default: + hcfg_set = 0; + break; + } + hcfg = inl(emu->port + HCFG) ; + hcfg = (hcfg & ~hcfg_mask) | hcfg_set; + outl(hcfg, emu->port + HCFG); + reg71 = snd_ca0106_ptr_read(emu, 0x71, 0); + reg71 = (reg71 & ~reg71_mask) | reg71_set; + snd_ca0106_ptr_write(emu, 0x71, 0, reg71); + if (emu->details->i2c_adc == 1) { /* The SB0410 and SB0413 use I2C to control ADC. */ + snd_ca0106_i2c_write(emu, ADC_MASTER, over_sampling); /* Adjust the over sampler to better suit the capture rate. */ + } + + //printk("prepare:channel_number=%d, rate=%d, format=0x%x, channels=%d, buffer_size=%ld, period_size=%ld, frames_to_bytes=%d\n",channel, runtime->rate, runtime->format, runtime->channels, runtime->buffer_size, runtime->period_size, frames_to_bytes(runtime, 1)); snd_ca0106_ptr_write(emu, 0x13, channel, 0); snd_ca0106_ptr_write(emu, CAPTURE_DMA_ADDR, channel, runtime->dma_addr); @@ -548,16 +753,16 @@ static int snd_ca0106_pcm_prepare_capture(snd_pcm_substream_t *substream) } /* trigger_playback callback */ -static int snd_ca0106_pcm_trigger_playback(snd_pcm_substream_t *substream, +static int snd_ca0106_pcm_trigger_playback(struct snd_pcm_substream *substream, int cmd) { - ca0106_t *emu = snd_pcm_substream_chip(substream); - snd_pcm_runtime_t *runtime; - ca0106_pcm_t *epcm; + struct snd_ca0106 *emu = snd_pcm_substream_chip(substream); + struct snd_pcm_runtime *runtime; + struct snd_ca0106_pcm *epcm; int channel; int result = 0; struct list_head *pos; - snd_pcm_substream_t *s; + struct snd_pcm_substream *s; u32 basic = 0; u32 extended = 0; int running=0; @@ -601,12 +806,12 @@ static int snd_ca0106_pcm_trigger_playback(snd_pcm_substream_t *substream, } /* trigger_capture callback */ -static int snd_ca0106_pcm_trigger_capture(snd_pcm_substream_t *substream, +static int snd_ca0106_pcm_trigger_capture(struct snd_pcm_substream *substream, int cmd) { - ca0106_t *emu = snd_pcm_substream_chip(substream); - snd_pcm_runtime_t *runtime = substream->runtime; - ca0106_pcm_t *epcm = runtime->private_data; + struct snd_ca0106 *emu = snd_pcm_substream_chip(substream); + struct snd_pcm_runtime *runtime = substream->runtime; + struct snd_ca0106_pcm *epcm = runtime->private_data; int channel = epcm->channel_id; int result = 0; @@ -630,11 +835,11 @@ static int snd_ca0106_pcm_trigger_capture(snd_pcm_substream_t *substream, /* pointer_playback callback */ static snd_pcm_uframes_t -snd_ca0106_pcm_pointer_playback(snd_pcm_substream_t *substream) +snd_ca0106_pcm_pointer_playback(struct snd_pcm_substream *substream) { - ca0106_t *emu = snd_pcm_substream_chip(substream); - snd_pcm_runtime_t *runtime = substream->runtime; - ca0106_pcm_t *epcm = runtime->private_data; + struct snd_ca0106 *emu = snd_pcm_substream_chip(substream); + struct snd_pcm_runtime *runtime = substream->runtime; + struct snd_ca0106_pcm *epcm = runtime->private_data; snd_pcm_uframes_t ptr, ptr1, ptr2,ptr3,ptr4 = 0; int channel = epcm->channel_id; @@ -657,11 +862,11 @@ snd_ca0106_pcm_pointer_playback(snd_pcm_substream_t *substream) /* pointer_capture callback */ static snd_pcm_uframes_t -snd_ca0106_pcm_pointer_capture(snd_pcm_substream_t *substream) +snd_ca0106_pcm_pointer_capture(struct snd_pcm_substream *substream) { - ca0106_t *emu = snd_pcm_substream_chip(substream); - snd_pcm_runtime_t *runtime = substream->runtime; - ca0106_pcm_t *epcm = runtime->private_data; + struct snd_ca0106 *emu = snd_pcm_substream_chip(substream); + struct snd_pcm_runtime *runtime = substream->runtime; + struct snd_ca0106_pcm *epcm = runtime->private_data; snd_pcm_uframes_t ptr, ptr1, ptr2 = 0; int channel = channel=epcm->channel_id; @@ -679,7 +884,7 @@ snd_ca0106_pcm_pointer_capture(snd_pcm_substream_t *substream) } /* operators */ -static snd_pcm_ops_t snd_ca0106_playback_front_ops = { +static struct snd_pcm_ops snd_ca0106_playback_front_ops = { .open = snd_ca0106_pcm_open_playback_front, .close = snd_ca0106_pcm_close_playback, .ioctl = snd_pcm_lib_ioctl, @@ -690,7 +895,7 @@ static snd_pcm_ops_t snd_ca0106_playback_front_ops = { .pointer = snd_ca0106_pcm_pointer_playback, }; -static snd_pcm_ops_t snd_ca0106_capture_0_ops = { +static struct snd_pcm_ops snd_ca0106_capture_0_ops = { .open = snd_ca0106_pcm_open_0_capture, .close = snd_ca0106_pcm_close_capture, .ioctl = snd_pcm_lib_ioctl, @@ -701,7 +906,7 @@ static snd_pcm_ops_t snd_ca0106_capture_0_ops = { .pointer = snd_ca0106_pcm_pointer_capture, }; -static snd_pcm_ops_t snd_ca0106_capture_1_ops = { +static struct snd_pcm_ops snd_ca0106_capture_1_ops = { .open = snd_ca0106_pcm_open_1_capture, .close = snd_ca0106_pcm_close_capture, .ioctl = snd_pcm_lib_ioctl, @@ -712,7 +917,7 @@ static snd_pcm_ops_t snd_ca0106_capture_1_ops = { .pointer = snd_ca0106_pcm_pointer_capture, }; -static snd_pcm_ops_t snd_ca0106_capture_2_ops = { +static struct snd_pcm_ops snd_ca0106_capture_2_ops = { .open = snd_ca0106_pcm_open_2_capture, .close = snd_ca0106_pcm_close_capture, .ioctl = snd_pcm_lib_ioctl, @@ -723,7 +928,7 @@ static snd_pcm_ops_t snd_ca0106_capture_2_ops = { .pointer = snd_ca0106_pcm_pointer_capture, }; -static snd_pcm_ops_t snd_ca0106_capture_3_ops = { +static struct snd_pcm_ops snd_ca0106_capture_3_ops = { .open = snd_ca0106_pcm_open_3_capture, .close = snd_ca0106_pcm_close_capture, .ioctl = snd_pcm_lib_ioctl, @@ -734,7 +939,7 @@ static snd_pcm_ops_t snd_ca0106_capture_3_ops = { .pointer = snd_ca0106_pcm_pointer_capture, }; -static snd_pcm_ops_t snd_ca0106_playback_center_lfe_ops = { +static struct snd_pcm_ops snd_ca0106_playback_center_lfe_ops = { .open = snd_ca0106_pcm_open_playback_center_lfe, .close = snd_ca0106_pcm_close_playback, .ioctl = snd_pcm_lib_ioctl, @@ -745,7 +950,7 @@ static snd_pcm_ops_t snd_ca0106_playback_center_lfe_ops = { .pointer = snd_ca0106_pcm_pointer_playback, }; -static snd_pcm_ops_t snd_ca0106_playback_unknown_ops = { +static struct snd_pcm_ops snd_ca0106_playback_unknown_ops = { .open = snd_ca0106_pcm_open_playback_unknown, .close = snd_ca0106_pcm_close_playback, .ioctl = snd_pcm_lib_ioctl, @@ -756,7 +961,7 @@ static snd_pcm_ops_t snd_ca0106_playback_unknown_ops = { .pointer = snd_ca0106_pcm_pointer_playback, }; -static snd_pcm_ops_t snd_ca0106_playback_rear_ops = { +static struct snd_pcm_ops snd_ca0106_playback_rear_ops = { .open = snd_ca0106_pcm_open_playback_rear, .close = snd_ca0106_pcm_close_playback, .ioctl = snd_pcm_lib_ioctl, @@ -768,10 +973,10 @@ static snd_pcm_ops_t snd_ca0106_playback_rear_ops = { }; -static unsigned short snd_ca0106_ac97_read(ac97_t *ac97, +static unsigned short snd_ca0106_ac97_read(struct snd_ac97 *ac97, unsigned short reg) { - ca0106_t *emu = ac97->private_data; + struct snd_ca0106 *emu = ac97->private_data; unsigned long flags; unsigned short val; @@ -782,10 +987,10 @@ static unsigned short snd_ca0106_ac97_read(ac97_t *ac97, return val; } -static void snd_ca0106_ac97_write(ac97_t *ac97, +static void snd_ca0106_ac97_write(struct snd_ac97 *ac97, unsigned short reg, unsigned short val) { - ca0106_t *emu = ac97->private_data; + struct snd_ca0106 *emu = ac97->private_data; unsigned long flags; spin_lock_irqsave(&emu->emu_lock, flags); @@ -794,12 +999,12 @@ static void snd_ca0106_ac97_write(ac97_t *ac97, spin_unlock_irqrestore(&emu->emu_lock, flags); } -static int snd_ca0106_ac97(ca0106_t *chip) +static int snd_ca0106_ac97(struct snd_ca0106 *chip) { - ac97_bus_t *pbus; - ac97_template_t ac97; + struct snd_ac97_bus *pbus; + struct snd_ac97_template ac97; int err; - static ac97_bus_ops_t ops = { + static struct snd_ac97_bus_ops ops = { .write = snd_ca0106_ac97_write, .read = snd_ca0106_ac97_read, }; @@ -810,10 +1015,11 @@ static int snd_ca0106_ac97(ca0106_t *chip) memset(&ac97, 0, sizeof(ac97)); ac97.private_data = chip; + ac97.scaps = AC97_SCAP_NO_SPDIF; return snd_ac97_mixer(pbus, &ac97, &chip->ac97); } -static int snd_ca0106_free(ca0106_t *chip) +static int snd_ca0106_free(struct snd_ca0106 *chip) { if (chip->res_port != NULL) { /* avoid access to already used hardware */ // disable interrupts @@ -836,10 +1042,8 @@ static int snd_ca0106_free(ca0106_t *chip) #endif // release the i/o port - if (chip->res_port) { - release_resource(chip->res_port); - kfree_nocheck(chip->res_port); - } + release_and_free_resource(chip->res_port); + // release the irq if (chip->irq >= 0) free_irq(chip->irq, (void *)chip); @@ -848,9 +1052,9 @@ static int snd_ca0106_free(ca0106_t *chip) return 0; } -static int snd_ca0106_dev_free(snd_device_t *device) +static int snd_ca0106_dev_free(struct snd_device *device) { - ca0106_t *chip = device->device_data; + struct snd_ca0106 *chip = device->device_data; return snd_ca0106_free(chip); } @@ -859,19 +1063,13 @@ static irqreturn_t snd_ca0106_interrupt(int irq, void *dev_id, { unsigned int status; - ca0106_t *chip = dev_id; + struct snd_ca0106 *chip = dev_id; int i; int mask; unsigned int stat76; - ca0106_channel_t *pchannel; - - spin_lock(&chip->emu_lock); + struct snd_ca0106_channel *pchannel; status = inl(chip->port + IPR); - - // call updater, unlock before it - spin_unlock(&chip->emu_lock); - if (! status) return IRQ_NONE; @@ -881,11 +1079,11 @@ static irqreturn_t snd_ca0106_interrupt(int irq, void *dev_id, mask = 0x11; /* 0x1 for one half, 0x10 for the other half period. */ for(i = 0; i < 4; i++) { pchannel = &(chip->playback_channels[i]); - if(stat76 & mask) { + if (stat76 & mask) { /* FIXME: Select the correct substream for period elapsed */ if(pchannel->use) { - snd_pcm_period_elapsed(pchannel->epcm->substream); - //printk(KERN_INFO "interrupt [%d] used\n", i); + snd_pcm_period_elapsed(pchannel->epcm->substream); + //printk(KERN_INFO "interrupt [%d] used\n", i); } } //printk(KERN_INFO "channel=%p\n",pchannel); @@ -895,11 +1093,11 @@ static irqreturn_t snd_ca0106_interrupt(int irq, void *dev_id, mask = 0x110000; /* 0x1 for one half, 0x10 for the other half period. */ for(i = 0; i < 4; i++) { pchannel = &(chip->capture_channels[i]); - if(stat76 & mask) { + if (stat76 & mask) { /* FIXME: Select the correct substream for period elapsed */ if(pchannel->use) { - snd_pcm_period_elapsed(pchannel->epcm->substream); - //printk(KERN_INFO "interrupt [%d] used\n", i); + snd_pcm_period_elapsed(pchannel->epcm->substream); + //printk(KERN_INFO "interrupt [%d] used\n", i); } } //printk(KERN_INFO "channel=%p\n",pchannel); @@ -908,26 +1106,25 @@ static irqreturn_t snd_ca0106_interrupt(int irq, void *dev_id, } snd_ca0106_ptr_write(chip, EXTENDED_INT, 0, stat76); - spin_lock(&chip->emu_lock); + + if (chip->midi.dev_id && + (status & (chip->midi.ipr_tx|chip->midi.ipr_rx))) { + if (chip->midi.interrupt) + chip->midi.interrupt(&chip->midi, status); + else + chip->midi.interrupt_disable(&chip->midi, chip->midi.tx_enable | chip->midi.rx_enable); + } + // acknowledge the interrupt if necessary outl(status, chip->port+IPR); - spin_unlock(&chip->emu_lock); - return IRQ_HANDLED; } -static void snd_ca0106_pcm_free(snd_pcm_t *pcm) -{ - ca0106_t *emu = pcm->private_data; - emu->pcm = NULL; - snd_pcm_lib_preallocate_free_for_all(pcm); -} - -static int __devinit snd_ca0106_pcm(ca0106_t *emu, int device, snd_pcm_t **rpcm) +static int __devinit snd_ca0106_pcm(struct snd_ca0106 *emu, int device, struct snd_pcm **rpcm) { - snd_pcm_t *pcm; - snd_pcm_substream_t *substream; + struct snd_pcm *pcm; + struct snd_pcm_substream *substream; int err; if (rpcm) @@ -936,7 +1133,6 @@ static int __devinit snd_ca0106_pcm(ca0106_t *emu, int device, snd_pcm_t **rpcm) return err; pcm->private_data = emu; - pcm->private_free = snd_ca0106_pcm_free; switch (device) { case 0: @@ -988,14 +1184,55 @@ static int __devinit snd_ca0106_pcm(ca0106_t *emu, int device, snd_pcm_t **rpcm) return 0; } -static int __devinit snd_ca0106_create(snd_card_t *card, +static unsigned int spi_dac_init[] = { + 0x00ff, + 0x02ff, + 0x0400, + 0x0520, + 0x0620, /* Set 24 bit. Was 0x0600 */ + 0x08ff, + 0x0aff, + 0x0cff, + 0x0eff, + 0x10ff, + 0x1200, + 0x1400, + 0x1480, + 0x1800, + 0x1aff, + 0x1cff, + 0x1e00, + 0x0530, + 0x0602, + 0x0622, + 0x1400, +}; + +static unsigned int i2c_adc_init[][2] = { + { 0x17, 0x00 }, /* Reset */ + { 0x07, 0x00 }, /* Timeout */ + { 0x0b, 0x22 }, /* Interface control */ + { 0x0c, 0x22 }, /* Master mode control */ + { 0x0d, 0x08 }, /* Powerdown control */ + { 0x0e, 0xcf }, /* Attenuation Left 0x01 = -103dB, 0xff = 24dB */ + { 0x0f, 0xcf }, /* Attenuation Right 0.5dB steps */ + { 0x10, 0x7b }, /* ALC Control 1 */ + { 0x11, 0x00 }, /* ALC Control 2 */ + { 0x12, 0x32 }, /* ALC Control 3 */ + { 0x13, 0x00 }, /* Noise gate control */ + { 0x14, 0xa6 }, /* Limiter control */ + { 0x15, ADC_MUX_LINEIN }, /* ADC Mixer control */ +}; + +static int __devinit snd_ca0106_create(struct snd_card *card, struct pci_dev *pci, - ca0106_t **rchip) + struct snd_ca0106 **rchip) { - ca0106_t *chip; + struct snd_ca0106 *chip; + struct snd_ca0106_details *c; int err; int ch; - static snd_device_ops_t ops = { + static struct snd_device_ops ops = { .dev_free = snd_ca0106_dev_free, }; @@ -1003,14 +1240,14 @@ static int __devinit snd_ca0106_create(snd_card_t *card, if ((err = pci_enable_device(pci)) < 0) return err; - if (pci_set_dma_mask(pci, 0xffffffffUL) < 0 || - pci_set_consistent_dma_mask(pci, 0xffffffffUL) < 0) { + if (pci_set_dma_mask(pci, DMA_32BIT_MASK) < 0 || + pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK) < 0) { printk(KERN_ERR "error to set 32bit mask DMA\n"); pci_disable_device(pci); return -ENXIO; } - chip = kcalloc(1, sizeof(*chip), GFP_KERNEL); + chip = kzalloc(sizeof(*chip), GFP_KERNEL); if (chip == NULL) { pci_disable_device(pci); return -ENOMEM; @@ -1031,7 +1268,7 @@ static int __devinit snd_ca0106_create(snd_card_t *card, } if (request_irq(pci->irq, snd_ca0106_interrupt, - SA_INTERRUPT|SA_SHIRQ, "snd_ca0106", + IRQF_DISABLED|IRQF_SHARED, "snd_ca0106", (void *)chip)) { snd_ca0106_free(chip); printk(KERN_ERR "cannot grab irq\n"); @@ -1054,6 +1291,16 @@ static int __devinit snd_ca0106_create(snd_card_t *card, printk(KERN_INFO "Model %04x Rev %08x Serial %08x\n", chip->model, chip->revision, chip->serial); #endif + strcpy(card->driver, "CA0106"); + strcpy(card->shortname, "CA0106"); + + for (c = ca0106_chip_details; c->serial; c++) { + if (c->serial == chip->serial) + break; + } + chip->details = c; + sprintf(card->longname, "%s at 0x%lx irq %i", + c->name, chip->port, chip->irq); outl(0, chip->port + INTE); @@ -1113,7 +1360,7 @@ static int __devinit snd_ca0106_create(snd_card_t *card, //snd_ca0106_ptr_write(chip, SPDIF_SELECT2, 0, 0xf0f003f); /* OSS drivers set this. */ /* Analog or Digital output */ snd_ca0106_ptr_write(chip, SPDIF_SELECT1, 0, 0xf); - snd_ca0106_ptr_write(chip, SPDIF_SELECT2, 0, 0x000b0000); /* 0x0b000000 for digital, 0x000b0000 for analog, from win2000 drivers */ + snd_ca0106_ptr_write(chip, SPDIF_SELECT2, 0, 0x000f0000); /* 0x0b000000 for digital, 0x000b0000 for analog, from win2000 drivers. Use 0x000f0000 for surround71 */ chip->spdif_enable = 0; /* Set digital SPDIF output off */ chip->capture_source = 3; /* Set CAPTURE_SOURCE */ //snd_ca0106_ptr_write(chip, 0x45, 0, 0); /* Analogue out */ @@ -1138,13 +1385,16 @@ static int __devinit snd_ca0106_create(snd_card_t *card, snd_ca0106_ptr_write(chip, CAPTURE_SOURCE, 0x0, 0x333300e4); /* Select MIC, Line in, TAD in, AUX in */ chip->capture_source = 3; /* Set CAPTURE_SOURCE */ - if ((chip->serial == 0x10061102) || - (chip->serial == 0x10071102) || - (chip->serial == 0x10091462)) { /* The SB0410 and SB0413 use GPIO differently. */ + if (chip->details->gpio_type == 2) { /* The SB0438 use GPIO differently. */ /* FIXME: Still need to find out what the other GPIO bits do. E.g. For digital spdif out. */ outl(0x0, chip->port+GPIO); //outl(0x00f0e000, chip->port+GPIO); /* Analog */ - outl(0x005f4300, chip->port+GPIO); /* Analog */ + outl(0x005f5301, chip->port+GPIO); /* Analog */ + } else if (chip->details->gpio_type == 1) { /* The SB0410 and SB0413 use GPIO differently. */ + /* FIXME: Still need to find out what the other GPIO bits do. E.g. For digital spdif out. */ + outl(0x0, chip->port+GPIO); + //outl(0x00f0e000, chip->port+GPIO); /* Analog */ + outl(0x005f5301, chip->port+GPIO); /* Analog */ } else { outl(0x0, chip->port+GPIO); outl(0x005f03a3, chip->port+GPIO); /* Analog */ @@ -1157,6 +1407,29 @@ static int __devinit snd_ca0106_create(snd_card_t *card, //outl(0x00000009, chip->port+HCFG); outl(HCFG_AC97 | HCFG_AUDIOENABLE, chip->port+HCFG); /* AC97 2.0, Enable outputs. */ + if (chip->details->i2c_adc == 1) { /* The SB0410 and SB0413 use I2C to control ADC. */ + int size, n; + + size = ARRAY_SIZE(i2c_adc_init); + //snd_printk("I2C:array size=0x%x\n", size); + for (n=0; n < size; n++) { + snd_ca0106_i2c_write(chip, i2c_adc_init[n][0], i2c_adc_init[n][1]); + } + for (n=0; n < 4; n++) { + chip->i2c_capture_volume[n][0]= 0xcf; + chip->i2c_capture_volume[n][1]= 0xcf; + } + chip->i2c_capture_source=2; /* Line in */ + //snd_ca0106_i2c_write(chip, ADC_MUX, ADC_MUX_LINEIN); /* Enable Line-in capture. MIC in currently untested. */ + } + if (chip->details->spi_dac == 1) { /* The SB0570 use SPI to control DAC. */ + int size, n; + + size = ARRAY_SIZE(spi_dac_init); + for (n=0; n < size; n++) + snd_ca0106_spi_write(chip, spi_dac_init[n]); + } + if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) { snd_ca0106_free(chip); @@ -1166,13 +1439,95 @@ static int __devinit snd_ca0106_create(snd_card_t *card, return 0; } + +static void ca0106_midi_interrupt_enable(struct snd_ca_midi *midi, int intr) +{ + snd_ca0106_intr_enable((struct snd_ca0106 *)(midi->dev_id), intr); +} + +static void ca0106_midi_interrupt_disable(struct snd_ca_midi *midi, int intr) +{ + snd_ca0106_intr_disable((struct snd_ca0106 *)(midi->dev_id), intr); +} + +static unsigned char ca0106_midi_read(struct snd_ca_midi *midi, int idx) +{ + return (unsigned char)snd_ca0106_ptr_read((struct snd_ca0106 *)(midi->dev_id), + midi->port + idx, 0); +} + +static void ca0106_midi_write(struct snd_ca_midi *midi, int data, int idx) +{ + snd_ca0106_ptr_write((struct snd_ca0106 *)(midi->dev_id), midi->port + idx, 0, data); +} + +static struct snd_card *ca0106_dev_id_card(void *dev_id) +{ + return ((struct snd_ca0106 *)dev_id)->card; +} + +static int ca0106_dev_id_port(void *dev_id) +{ + return ((struct snd_ca0106 *)dev_id)->port; +} + +static int __devinit snd_ca0106_midi(struct snd_ca0106 *chip, unsigned int channel) +{ + struct snd_ca_midi *midi; + char *name; + int err; + + if (channel == CA0106_MIDI_CHAN_B) { + name = "CA0106 MPU-401 (UART) B"; + midi = &chip->midi2; + midi->tx_enable = INTE_MIDI_TX_B; + midi->rx_enable = INTE_MIDI_RX_B; + midi->ipr_tx = IPR_MIDI_TX_B; + midi->ipr_rx = IPR_MIDI_RX_B; + midi->port = MIDI_UART_B_DATA; + } else { + name = "CA0106 MPU-401 (UART)"; + midi = &chip->midi; + midi->tx_enable = INTE_MIDI_TX_A; + midi->rx_enable = INTE_MIDI_TX_B; + midi->ipr_tx = IPR_MIDI_TX_A; + midi->ipr_rx = IPR_MIDI_RX_A; + midi->port = MIDI_UART_A_DATA; + } + + midi->reset = CA0106_MPU401_RESET; + midi->enter_uart = CA0106_MPU401_ENTER_UART; + midi->ack = CA0106_MPU401_ACK; + + midi->input_avail = CA0106_MIDI_INPUT_AVAIL; + midi->output_ready = CA0106_MIDI_OUTPUT_READY; + + midi->channel = channel; + + midi->interrupt_enable = ca0106_midi_interrupt_enable; + midi->interrupt_disable = ca0106_midi_interrupt_disable; + + midi->read = ca0106_midi_read; + midi->write = ca0106_midi_write; + + midi->get_dev_id_card = ca0106_dev_id_card; + midi->get_dev_id_port = ca0106_dev_id_port; + + midi->dev_id = chip; + + if ((err = ca_midi_init(chip, midi, 0, name)) < 0) + return err; + + return 0; +} + + static int __devinit snd_ca0106_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) { static int dev; - snd_card_t *card; - ca0106_t *chip; - ca0106_names_t *c; + struct snd_card *card; + struct snd_ca0106 *chip; int err; if (dev >= SNDRV_CARDS) @@ -1207,9 +1562,7 @@ static int __devinit snd_ca0106_probe(struct pci_dev *pci, snd_card_free(card); return err; } - if ((chip->serial != 0x10061102) && - (chip->serial != 0x10071102) && - (chip->serial != 0x10091462) ) { /* The SB0410 and SB0413 do not have an ac97 chip. */ + if (chip->details->ac97 == 1) { /* The SB0410 and SB0413 do not have an AC97 chip. */ if ((err = snd_ca0106_ac97(chip)) < 0) { snd_card_free(card); return err; @@ -1220,16 +1573,17 @@ static int __devinit snd_ca0106_probe(struct pci_dev *pci, return err; } - snd_ca0106_proc_init(chip); - - strcpy(card->driver, "CA0106"); - strcpy(card->shortname, "CA0106"); - - for (c=ca0106_chip_names; c->serial; c++) { - if (c->serial == chip->serial) break; + snd_printdd("ca0106: probe for MIDI channel A ..."); + if ((err = snd_ca0106_midi(chip,CA0106_MIDI_CHAN_A)) < 0) { + snd_card_free(card); + snd_printdd(" failed, err=0x%x\n",err); + return err; } - sprintf(card->longname, "%s at 0x%lx irq %i", - c->name, chip->port, chip->irq); + snd_printdd(" done.\n"); + +#ifdef CONFIG_PROC_FS + snd_ca0106_proc_init(chip); +#endif if ((err = snd_card_register(card)) < 0) { snd_card_free(card); @@ -1265,12 +1619,7 @@ static struct pci_driver driver = { // initialization of the module static int __init alsa_card_ca0106_init(void) { - int err; - - if ((err = pci_module_init(&driver)) > 0) - return err; - - return 0; + return pci_register_driver(&driver); } // clean up the module diff --git a/sound/pci/ca0106/ca0106_mixer.c b/sound/pci/ca0106/ca0106_mixer.c index 97bed1b08..146eed70d 100644 --- a/sound/pci/ca0106/ca0106_mixer.c +++ b/sound/pci/ca0106/ca0106_mixer.c @@ -1,7 +1,7 @@ /* * Copyright (c) 2004 James Courtier-Dutton * Driver CA0106 chips. e.g. Sound Blaster Audigy LS and Live 24bit - * Version: 0.0.16 + * Version: 0.0.17 * * FEATURES currently supported: * See ca0106_main.c for features. @@ -37,6 +37,8 @@ * Separated ca0106.c into separate functional .c files. * 0.0.16 * Modified Copyright message. + * 0.0.17 + * Implement Mic and Line in Capture. * * This code was initally based on code from ALSA's emu10k1x.c which is: * Copyright (c) by Francisco Moraes @@ -71,7 +73,8 @@ #include "ca0106.h" -static int snd_ca0106_shared_spdif_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo) +static int snd_ca0106_shared_spdif_info(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) { uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; uinfo->count = 1; @@ -80,19 +83,19 @@ static int snd_ca0106_shared_spdif_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_i return 0; } -static int snd_ca0106_shared_spdif_get(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) +static int snd_ca0106_shared_spdif_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { - ca0106_t *emu = snd_kcontrol_chip(kcontrol); + struct snd_ca0106 *emu = snd_kcontrol_chip(kcontrol); ucontrol->value.enumerated.item[0] = emu->spdif_enable; return 0; } -static int snd_ca0106_shared_spdif_put(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) +static int snd_ca0106_shared_spdif_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { - ca0106_t *emu = snd_kcontrol_chip(kcontrol); + struct snd_ca0106 *emu = snd_kcontrol_chip(kcontrol); unsigned int val; int change = 0; u32 mask; @@ -113,7 +116,7 @@ static int snd_ca0106_shared_spdif_put(snd_kcontrol_t * kcontrol, } else { /* Analog */ snd_ca0106_ptr_write(emu, SPDIF_SELECT1, 0, 0xf); - snd_ca0106_ptr_write(emu, SPDIF_SELECT2, 0, 0x000b0000); + snd_ca0106_ptr_write(emu, SPDIF_SELECT2, 0, 0x000f0000); snd_ca0106_ptr_write(emu, CAPTURE_CONTROL, 0, snd_ca0106_ptr_read(emu, CAPTURE_CONTROL, 0) | 0x1000); mask = inl(emu->port + GPIO) | 0x101; @@ -123,18 +126,12 @@ static int snd_ca0106_shared_spdif_put(snd_kcontrol_t * kcontrol, return change; } -static snd_kcontrol_new_t snd_ca0106_shared_spdif __devinitdata = +static int snd_ca0106_capture_source_info(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "SPDIF Out", - .info = snd_ca0106_shared_spdif_info, - .get = snd_ca0106_shared_spdif_get, - .put = snd_ca0106_shared_spdif_put -}; - -static int snd_ca0106_capture_source_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo) -{ - static char *texts[6] = { "SPDIF out", "i2s mixer out", "SPDIF in", "i2s in", "AC97 in", "SRC out" }; + static char *texts[6] = { + "IEC958 out", "i2s mixer out", "IEC958 in", "i2s in", "AC97 in", "SRC out" + }; uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; uinfo->count = 1; @@ -145,19 +142,19 @@ static int snd_ca0106_capture_source_info(snd_kcontrol_t *kcontrol, snd_ctl_elem return 0; } -static int snd_ca0106_capture_source_get(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) +static int snd_ca0106_capture_source_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { - ca0106_t *emu = snd_kcontrol_chip(kcontrol); + struct snd_ca0106 *emu = snd_kcontrol_chip(kcontrol); ucontrol->value.enumerated.item[0] = emu->capture_source; return 0; } -static int snd_ca0106_capture_source_put(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) +static int snd_ca0106_capture_source_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { - ca0106_t *emu = snd_kcontrol_chip(kcontrol); + struct snd_ca0106 *emu = snd_kcontrol_chip(kcontrol); unsigned int val; int change = 0; u32 mask; @@ -174,26 +171,158 @@ static int snd_ca0106_capture_source_put(snd_kcontrol_t * kcontrol, return change; } -static snd_kcontrol_new_t snd_ca0106_capture_source __devinitdata = +static int snd_ca0106_i2c_capture_source_info(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) +{ + static char *texts[6] = { + "Phone", "Mic", "Line in", "Aux" + }; + + uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; + uinfo->count = 1; + uinfo->value.enumerated.items = 4; + if (uinfo->value.enumerated.item > 3) + uinfo->value.enumerated.item = 3; + strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]); + return 0; +} + +static int snd_ca0106_i2c_capture_source_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_ca0106 *emu = snd_kcontrol_chip(kcontrol); + + ucontrol->value.enumerated.item[0] = emu->i2c_capture_source; + return 0; +} + +static int snd_ca0106_i2c_capture_source_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_ca0106 *emu = snd_kcontrol_chip(kcontrol); + unsigned int source_id; + unsigned int ngain, ogain; + int change = 0; + u32 source; + /* If the capture source has changed, + * update the capture volume from the cached value + * for the particular source. + */ + source_id = ucontrol->value.enumerated.item[0] ; + change = (emu->i2c_capture_source != source_id); + if (change) { + snd_ca0106_i2c_write(emu, ADC_MUX, 0); /* Mute input */ + ngain = emu->i2c_capture_volume[source_id][0]; /* Left */ + ogain = emu->i2c_capture_volume[emu->i2c_capture_source][0]; /* Left */ + if (ngain != ogain) + snd_ca0106_i2c_write(emu, ADC_ATTEN_ADCL, ((ngain) & 0xff)); + ngain = emu->i2c_capture_volume[source_id][1]; /* Left */ + ogain = emu->i2c_capture_volume[emu->i2c_capture_source][1]; /* Left */ + if (ngain != ogain) + snd_ca0106_i2c_write(emu, ADC_ATTEN_ADCR, ((ngain) & 0xff)); + source = 1 << source_id; + snd_ca0106_i2c_write(emu, ADC_MUX, source); /* Set source */ + emu->i2c_capture_source = source_id; + } + return change; +} + +static int snd_ca0106_capture_line_in_side_out_info(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) +{ + static char *texts[2] = { "Side out", "Line in" }; + + uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; + uinfo->count = 1; + uinfo->value.enumerated.items = 2; + if (uinfo->value.enumerated.item > 1) + uinfo->value.enumerated.item = 1; + strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]); + return 0; +} + +static int snd_ca0106_capture_mic_line_in_info(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) +{ + static char *texts[2] = { "Line in", "Mic in" }; + + uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; + uinfo->count = 1; + uinfo->value.enumerated.items = 2; + if (uinfo->value.enumerated.item > 1) + uinfo->value.enumerated.item = 1; + strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]); + return 0; +} + +static int snd_ca0106_capture_mic_line_in_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_ca0106 *emu = snd_kcontrol_chip(kcontrol); + + ucontrol->value.enumerated.item[0] = emu->capture_mic_line_in; + return 0; +} + +static int snd_ca0106_capture_mic_line_in_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_ca0106 *emu = snd_kcontrol_chip(kcontrol); + unsigned int val; + int change = 0; + u32 tmp; + + val = ucontrol->value.enumerated.item[0] ; + change = (emu->capture_mic_line_in != val); + if (change) { + emu->capture_mic_line_in = val; + if (val) { + //snd_ca0106_i2c_write(emu, ADC_MUX, 0); /* Mute input */ + tmp = inl(emu->port+GPIO) & ~0x400; + tmp = tmp | 0x400; + outl(tmp, emu->port+GPIO); + //snd_ca0106_i2c_write(emu, ADC_MUX, ADC_MUX_MIC); + } else { + //snd_ca0106_i2c_write(emu, ADC_MUX, 0); /* Mute input */ + tmp = inl(emu->port+GPIO) & ~0x400; + outl(tmp, emu->port+GPIO); + //snd_ca0106_i2c_write(emu, ADC_MUX, ADC_MUX_LINEIN); + } + } + return change; +} + +static struct snd_kcontrol_new snd_ca0106_capture_mic_line_in __devinitdata = { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Capture Source", - .info = snd_ca0106_capture_source_info, - .get = snd_ca0106_capture_source_get, - .put = snd_ca0106_capture_source_put + .name = "Shared Mic/Line in Capture Switch", + .info = snd_ca0106_capture_mic_line_in_info, + .get = snd_ca0106_capture_mic_line_in_get, + .put = snd_ca0106_capture_mic_line_in_put }; -static int snd_ca0106_spdif_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo) +static struct snd_kcontrol_new snd_ca0106_capture_line_in_side_out __devinitdata = +{ + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, + .name = "Shared Line in/Side out Capture Switch", + .info = snd_ca0106_capture_line_in_side_out_info, + .get = snd_ca0106_capture_mic_line_in_get, + .put = snd_ca0106_capture_mic_line_in_put +}; + + +static int snd_ca0106_spdif_info(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) { uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958; uinfo->count = 1; return 0; } -static int snd_ca0106_spdif_get(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) +static int snd_ca0106_spdif_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { - ca0106_t *emu = snd_kcontrol_chip(kcontrol); + struct snd_ca0106 *emu = snd_kcontrol_chip(kcontrol); unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); ucontrol->value.iec958.status[0] = (emu->spdif_bits[idx] >> 0) & 0xff; @@ -203,8 +332,8 @@ static int snd_ca0106_spdif_get(snd_kcontrol_t * kcontrol, return 0; } -static int snd_ca0106_spdif_get_mask(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) +static int snd_ca0106_spdif_get_mask(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { ucontrol->value.iec958.status[0] = 0xff; ucontrol->value.iec958.status[1] = 0xff; @@ -213,10 +342,10 @@ static int snd_ca0106_spdif_get_mask(snd_kcontrol_t * kcontrol, return 0; } -static int snd_ca0106_spdif_put(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) +static int snd_ca0106_spdif_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { - ca0106_t *emu = snd_kcontrol_chip(kcontrol); + struct snd_ca0106 *emu = snd_kcontrol_chip(kcontrol); unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); int change; unsigned int val; @@ -233,27 +362,8 @@ static int snd_ca0106_spdif_put(snd_kcontrol_t * kcontrol, return change; } -static snd_kcontrol_new_t snd_ca0106_spdif_mask_control = -{ - .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,MASK), - .count = 4, - .info = snd_ca0106_spdif_info, - .get = snd_ca0106_spdif_get_mask -}; - -static snd_kcontrol_new_t snd_ca0106_spdif_control = -{ - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT), - .count = 4, - .info = snd_ca0106_spdif_info, - .get = snd_ca0106_spdif_get, - .put = snd_ca0106_spdif_put -}; - -static int snd_ca0106_volume_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo) +static int snd_ca0106_volume_info(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) { uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; uinfo->count = 2; @@ -262,11 +372,15 @@ static int snd_ca0106_volume_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t return 0; } -static int snd_ca0106_volume_get(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol, int reg, int channel_id) +static int snd_ca0106_volume_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { - ca0106_t *emu = snd_kcontrol_chip(kcontrol); + struct snd_ca0106 *emu = snd_kcontrol_chip(kcontrol); unsigned int value; + int channel_id, reg; + + channel_id = (kcontrol->private_value >> 8) & 0xff; + reg = kcontrol->private_value & 0xff; value = snd_ca0106_ptr_read(emu, reg, channel_id); ucontrol->value.integer.value[0] = 0xff - ((value >> 24) & 0xff); /* Left */ @@ -274,237 +388,181 @@ static int snd_ca0106_volume_get(snd_kcontrol_t * kcontrol, return 0; } -static int snd_ca0106_volume_get_spdif_front(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) +static int snd_ca0106_volume_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { - int channel_id = CONTROL_FRONT_CHANNEL; - int reg = PLAYBACK_VOLUME1; - return snd_ca0106_volume_get(kcontrol, ucontrol, reg, channel_id); -} + struct snd_ca0106 *emu = snd_kcontrol_chip(kcontrol); + unsigned int oval, nval; + int channel_id, reg; -static int snd_ca0106_volume_get_spdif_center_lfe(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) -{ - int channel_id = CONTROL_CENTER_LFE_CHANNEL; - int reg = PLAYBACK_VOLUME1; - return snd_ca0106_volume_get(kcontrol, ucontrol, reg, channel_id); -} -static int snd_ca0106_volume_get_spdif_unknown(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) -{ - int channel_id = CONTROL_UNKNOWN_CHANNEL; - int reg = PLAYBACK_VOLUME1; - return snd_ca0106_volume_get(kcontrol, ucontrol, reg, channel_id); -} -static int snd_ca0106_volume_get_spdif_rear(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) -{ - int channel_id = CONTROL_REAR_CHANNEL; - int reg = PLAYBACK_VOLUME1; - return snd_ca0106_volume_get(kcontrol, ucontrol, reg, channel_id); -} -static int snd_ca0106_volume_get_analog_front(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) -{ - int channel_id = CONTROL_FRONT_CHANNEL; - int reg = PLAYBACK_VOLUME2; - return snd_ca0106_volume_get(kcontrol, ucontrol, reg, channel_id); -} + channel_id = (kcontrol->private_value >> 8) & 0xff; + reg = kcontrol->private_value & 0xff; -static int snd_ca0106_volume_get_analog_center_lfe(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) -{ - int channel_id = CONTROL_CENTER_LFE_CHANNEL; - int reg = PLAYBACK_VOLUME2; - return snd_ca0106_volume_get(kcontrol, ucontrol, reg, channel_id); -} -static int snd_ca0106_volume_get_analog_unknown(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) -{ - int channel_id = CONTROL_UNKNOWN_CHANNEL; - int reg = PLAYBACK_VOLUME2; - return snd_ca0106_volume_get(kcontrol, ucontrol, reg, channel_id); -} -static int snd_ca0106_volume_get_analog_rear(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) -{ - int channel_id = CONTROL_REAR_CHANNEL; - int reg = PLAYBACK_VOLUME2; - return snd_ca0106_volume_get(kcontrol, ucontrol, reg, channel_id); + oval = snd_ca0106_ptr_read(emu, reg, channel_id); + nval = ((0xff - ucontrol->value.integer.value[0]) << 24) | + ((0xff - ucontrol->value.integer.value[1]) << 16); + nval |= ((0xff - ucontrol->value.integer.value[0]) << 8) | + ((0xff - ucontrol->value.integer.value[1]) ); + if (oval == nval) + return 0; + snd_ca0106_ptr_write(emu, reg, channel_id, nval); + return 1; } -static int snd_ca0106_volume_get_feedback(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) -{ - int channel_id = 1; - int reg = CAPTURE_CONTROL; - return snd_ca0106_volume_get(kcontrol, ucontrol, reg, channel_id); -} - -static int snd_ca0106_volume_put(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol, int reg, int channel_id) -{ - ca0106_t *emu = snd_kcontrol_chip(kcontrol); - unsigned int value; - //value = snd_ca0106_ptr_read(emu, reg, channel_id); - //value = value & 0xffff; - value = ((0xff - ucontrol->value.integer.value[0]) << 24) | ((0xff - ucontrol->value.integer.value[1]) << 16); - value = value | ((0xff - ucontrol->value.integer.value[0]) << 8) | ((0xff - ucontrol->value.integer.value[1]) ); - snd_ca0106_ptr_write(emu, reg, channel_id, value); - return 1; -} -static int snd_ca0106_volume_put_spdif_front(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) -{ - int channel_id = CONTROL_FRONT_CHANNEL; - int reg = PLAYBACK_VOLUME1; - return snd_ca0106_volume_put(kcontrol, ucontrol, reg, channel_id); -} -static int snd_ca0106_volume_put_spdif_center_lfe(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) -{ - int channel_id = CONTROL_CENTER_LFE_CHANNEL; - int reg = PLAYBACK_VOLUME1; - return snd_ca0106_volume_put(kcontrol, ucontrol, reg, channel_id); -} -static int snd_ca0106_volume_put_spdif_unknown(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) -{ - int channel_id = CONTROL_UNKNOWN_CHANNEL; - int reg = PLAYBACK_VOLUME1; - return snd_ca0106_volume_put(kcontrol, ucontrol, reg, channel_id); -} -static int snd_ca0106_volume_put_spdif_rear(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) -{ - int channel_id = CONTROL_REAR_CHANNEL; - int reg = PLAYBACK_VOLUME1; - return snd_ca0106_volume_put(kcontrol, ucontrol, reg, channel_id); -} -static int snd_ca0106_volume_put_analog_front(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) -{ - int channel_id = CONTROL_FRONT_CHANNEL; - int reg = PLAYBACK_VOLUME2; - return snd_ca0106_volume_put(kcontrol, ucontrol, reg, channel_id); -} -static int snd_ca0106_volume_put_analog_center_lfe(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) -{ - int channel_id = CONTROL_CENTER_LFE_CHANNEL; - int reg = PLAYBACK_VOLUME2; - return snd_ca0106_volume_put(kcontrol, ucontrol, reg, channel_id); -} -static int snd_ca0106_volume_put_analog_unknown(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) +static int snd_ca0106_i2c_volume_info(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) { - int channel_id = CONTROL_UNKNOWN_CHANNEL; - int reg = PLAYBACK_VOLUME2; - return snd_ca0106_volume_put(kcontrol, ucontrol, reg, channel_id); -} -static int snd_ca0106_volume_put_analog_rear(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) -{ - int channel_id = CONTROL_REAR_CHANNEL; - int reg = PLAYBACK_VOLUME2; - return snd_ca0106_volume_put(kcontrol, ucontrol, reg, channel_id); + uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; + uinfo->count = 2; + uinfo->value.integer.min = 0; + uinfo->value.integer.max = 255; + return 0; } -static int snd_ca0106_volume_put_feedback(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) +static int snd_ca0106_i2c_volume_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { - int channel_id = 1; - int reg = CAPTURE_CONTROL; - return snd_ca0106_volume_put(kcontrol, ucontrol, reg, channel_id); + struct snd_ca0106 *emu = snd_kcontrol_chip(kcontrol); + int source_id; + + source_id = kcontrol->private_value; + + ucontrol->value.integer.value[0] = emu->i2c_capture_volume[source_id][0]; + ucontrol->value.integer.value[1] = emu->i2c_capture_volume[source_id][1]; + return 0; } -static snd_kcontrol_new_t snd_ca0106_volume_control_analog_front = -{ - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Analog Front Volume", - .info = snd_ca0106_volume_info, - .get = snd_ca0106_volume_get_analog_front, - .put = snd_ca0106_volume_put_analog_front -}; -static snd_kcontrol_new_t snd_ca0106_volume_control_analog_center_lfe = -{ - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Analog Center/LFE Volume", - .info = snd_ca0106_volume_info, - .get = snd_ca0106_volume_get_analog_center_lfe, - .put = snd_ca0106_volume_put_analog_center_lfe -}; -static snd_kcontrol_new_t snd_ca0106_volume_control_analog_unknown = -{ - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Analog Unknown Volume", - .info = snd_ca0106_volume_info, - .get = snd_ca0106_volume_get_analog_unknown, - .put = snd_ca0106_volume_put_analog_unknown -}; -static snd_kcontrol_new_t snd_ca0106_volume_control_analog_rear = -{ - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Analog Rear Volume", - .info = snd_ca0106_volume_info, - .get = snd_ca0106_volume_get_analog_rear, - .put = snd_ca0106_volume_put_analog_rear -}; -static snd_kcontrol_new_t snd_ca0106_volume_control_spdif_front = -{ - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "SPDIF Front Volume", - .info = snd_ca0106_volume_info, - .get = snd_ca0106_volume_get_spdif_front, - .put = snd_ca0106_volume_put_spdif_front -}; -static snd_kcontrol_new_t snd_ca0106_volume_control_spdif_center_lfe = -{ - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "SPDIF Center/LFE Volume", - .info = snd_ca0106_volume_info, - .get = snd_ca0106_volume_get_spdif_center_lfe, - .put = snd_ca0106_volume_put_spdif_center_lfe -}; -static snd_kcontrol_new_t snd_ca0106_volume_control_spdif_unknown = +static int snd_ca0106_i2c_volume_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "SPDIF Unknown Volume", - .info = snd_ca0106_volume_info, - .get = snd_ca0106_volume_get_spdif_unknown, - .put = snd_ca0106_volume_put_spdif_unknown -}; -static snd_kcontrol_new_t snd_ca0106_volume_control_spdif_rear = -{ - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "SPDIF Rear Volume", - .info = snd_ca0106_volume_info, - .get = snd_ca0106_volume_get_spdif_rear, - .put = snd_ca0106_volume_put_spdif_rear -}; + struct snd_ca0106 *emu = snd_kcontrol_chip(kcontrol); + unsigned int ogain; + unsigned int ngain; + int source_id; + int change = 0; -static snd_kcontrol_new_t snd_ca0106_volume_control_feedback = -{ - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "CAPTURE feedback into PLAYBACK", - .info = snd_ca0106_volume_info, - .get = snd_ca0106_volume_get_feedback, - .put = snd_ca0106_volume_put_feedback -}; + source_id = kcontrol->private_value; + ogain = emu->i2c_capture_volume[source_id][0]; /* Left */ + ngain = ucontrol->value.integer.value[0]; + if (ngain > 0xff) + return 0; + if (ogain != ngain) { + if (emu->i2c_capture_source == source_id) + snd_ca0106_i2c_write(emu, ADC_ATTEN_ADCL, ((ngain) & 0xff) ); + emu->i2c_capture_volume[source_id][0] = ucontrol->value.integer.value[0]; + change = 1; + } + ogain = emu->i2c_capture_volume[source_id][1]; /* Right */ + ngain = ucontrol->value.integer.value[1]; + if (ngain > 0xff) + return 0; + if (ogain != ngain) { + if (emu->i2c_capture_source == source_id) + snd_ca0106_i2c_write(emu, ADC_ATTEN_ADCR, ((ngain) & 0xff)); + emu->i2c_capture_volume[source_id][1] = ucontrol->value.integer.value[1]; + change = 1; + } + return change; +} + +#define CA_VOLUME(xname,chid,reg) \ +{ \ + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ + .info = snd_ca0106_volume_info, \ + .get = snd_ca0106_volume_get, \ + .put = snd_ca0106_volume_put, \ + .private_value = ((chid) << 8) | (reg) \ +} + +#define I2C_VOLUME(xname,chid) \ +{ \ + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ + .info = snd_ca0106_i2c_volume_info, \ + .get = snd_ca0106_i2c_volume_get, \ + .put = snd_ca0106_i2c_volume_put, \ + .private_value = chid \ +} + + +static struct snd_kcontrol_new snd_ca0106_volume_ctls[] __devinitdata = { + CA_VOLUME("Analog Front Playback Volume", + CONTROL_FRONT_CHANNEL, PLAYBACK_VOLUME2), + CA_VOLUME("Analog Rear Playback Volume", + CONTROL_REAR_CHANNEL, PLAYBACK_VOLUME2), + CA_VOLUME("Analog Center/LFE Playback Volume", + CONTROL_CENTER_LFE_CHANNEL, PLAYBACK_VOLUME2), + CA_VOLUME("Analog Side Playback Volume", + CONTROL_UNKNOWN_CHANNEL, PLAYBACK_VOLUME2), + + CA_VOLUME("IEC958 Front Playback Volume", + CONTROL_FRONT_CHANNEL, PLAYBACK_VOLUME1), + CA_VOLUME("IEC958 Rear Playback Volume", + CONTROL_REAR_CHANNEL, PLAYBACK_VOLUME1), + CA_VOLUME("IEC958 Center/LFE Playback Volume", + CONTROL_CENTER_LFE_CHANNEL, PLAYBACK_VOLUME1), + CA_VOLUME("IEC958 Unknown Playback Volume", + CONTROL_UNKNOWN_CHANNEL, PLAYBACK_VOLUME1), + + CA_VOLUME("CAPTURE feedback Playback Volume", + 1, CAPTURE_CONTROL), + + I2C_VOLUME("Phone Capture Volume", 0), + I2C_VOLUME("Mic Capture Volume", 1), + I2C_VOLUME("Line in Capture Volume", 2), + I2C_VOLUME("Aux Capture Volume", 3), + + { + .access = SNDRV_CTL_ELEM_ACCESS_READ, + .iface = SNDRV_CTL_ELEM_IFACE_PCM, + .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,MASK), + .count = 4, + .info = snd_ca0106_spdif_info, + .get = snd_ca0106_spdif_get_mask + }, + { + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, + .name = "IEC958 Playback Switch", + .info = snd_ca0106_shared_spdif_info, + .get = snd_ca0106_shared_spdif_get, + .put = snd_ca0106_shared_spdif_put + }, + { + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, + .name = "Digital Capture Source", + .info = snd_ca0106_capture_source_info, + .get = snd_ca0106_capture_source_get, + .put = snd_ca0106_capture_source_put + }, + { + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, + .name = "Capture Source", + .info = snd_ca0106_i2c_capture_source_info, + .get = snd_ca0106_i2c_capture_source_get, + .put = snd_ca0106_i2c_capture_source_put + }, + { + .iface = SNDRV_CTL_ELEM_IFACE_PCM, + .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT), + .count = 4, + .info = snd_ca0106_spdif_info, + .get = snd_ca0106_spdif_get, + .put = snd_ca0106_spdif_put + }, +}; -static int remove_ctl(snd_card_t *card, const char *name) +static int __devinit remove_ctl(struct snd_card *card, const char *name) { - snd_ctl_elem_id_t id; + struct snd_ctl_elem_id id; memset(&id, 0, sizeof(id)); strcpy(id.name, name); id.iface = SNDRV_CTL_ELEM_IFACE_MIXER; return snd_ctl_remove_id(card, &id); } -static snd_kcontrol_t *ctl_find(snd_card_t *card, const char *name) +static struct snd_kcontrol __devinit *ctl_find(struct snd_card *card, const char *name) { - snd_ctl_elem_id_t sid; + struct snd_ctl_elem_id sid; memset(&sid, 0, sizeof(sid)); /* FIXME: strcpy is bad. */ strcpy(sid.name, name); @@ -512,9 +570,9 @@ static snd_kcontrol_t *ctl_find(snd_card_t *card, const char *name) return snd_ctl_find_id(card, &sid); } -static int rename_ctl(snd_card_t *card, const char *src, const char *dst) +static int __devinit rename_ctl(struct snd_card *card, const char *src, const char *dst) { - snd_kcontrol_t *kctl = ctl_find(card, src); + struct snd_kcontrol *kctl = ctl_find(card, src); if (kctl) { strcpy(kctl->id.name, dst); return 0; @@ -522,11 +580,10 @@ static int rename_ctl(snd_card_t *card, const char *src, const char *dst) return -ENOENT; } -int __devinit snd_ca0106_mixer(ca0106_t *emu) +int __devinit snd_ca0106_mixer(struct snd_ca0106 *emu) { - int err; - snd_kcontrol_t *kctl; - snd_card_t *card = emu->card; + int i, err; + struct snd_card *card = emu->card; char **c; static char *ca0106_remove_ctls[] = { "Master Mono Playback Switch", @@ -566,69 +623,25 @@ int __devinit snd_ca0106_mixer(ca0106_t *emu) NULL }; #if 1 - for (c=ca0106_remove_ctls; *c; c++) + for (c = ca0106_remove_ctls; *c; c++) remove_ctl(card, *c); - for (c=ca0106_rename_ctls; *c; c += 2) + for (c = ca0106_rename_ctls; *c; c += 2) rename_ctl(card, c[0], c[1]); #endif - if ((kctl = snd_ctl_new1(&snd_ca0106_volume_control_analog_front, emu)) == NULL) - return -ENOMEM; - if ((err = snd_ctl_add(card, kctl))) - return err; - if ((kctl = snd_ctl_new1(&snd_ca0106_volume_control_analog_rear, emu)) == NULL) - return -ENOMEM; - if ((err = snd_ctl_add(card, kctl))) - return err; - if ((kctl = snd_ctl_new1(&snd_ca0106_volume_control_analog_center_lfe, emu)) == NULL) - return -ENOMEM; - if ((err = snd_ctl_add(card, kctl))) - return err; - if ((kctl = snd_ctl_new1(&snd_ca0106_volume_control_analog_unknown, emu)) == NULL) - return -ENOMEM; - if ((err = snd_ctl_add(card, kctl))) - return err; - if ((kctl = snd_ctl_new1(&snd_ca0106_volume_control_spdif_front, emu)) == NULL) - return -ENOMEM; - if ((err = snd_ctl_add(card, kctl))) - return err; - if ((kctl = snd_ctl_new1(&snd_ca0106_volume_control_spdif_rear, emu)) == NULL) - return -ENOMEM; - if ((err = snd_ctl_add(card, kctl))) - return err; - if ((kctl = snd_ctl_new1(&snd_ca0106_volume_control_spdif_center_lfe, emu)) == NULL) - return -ENOMEM; - if ((err = snd_ctl_add(card, kctl))) - return err; - if ((kctl = snd_ctl_new1(&snd_ca0106_volume_control_spdif_unknown, emu)) == NULL) - return -ENOMEM; - if ((err = snd_ctl_add(card, kctl))) - return err; - if ((kctl = snd_ctl_new1(&snd_ca0106_volume_control_feedback, emu)) == NULL) - return -ENOMEM; - if ((err = snd_ctl_add(card, kctl))) - return err; - if ((kctl = snd_ctl_new1(&snd_ca0106_spdif_mask_control, emu)) == NULL) - return -ENOMEM; - if ((err = snd_ctl_add(card, kctl))) - return err; - if ((kctl = snd_ctl_new1(&snd_ca0106_shared_spdif, emu)) == NULL) - return -ENOMEM; - if ((err = snd_ctl_add(card, kctl))) - return err; - if ((kctl = snd_ctl_new1(&snd_ca0106_capture_source, emu)) == NULL) - return -ENOMEM; - if ((err = snd_ctl_add(card, kctl))) - return err; - if ((kctl = ctl_find(card, SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT))) != NULL) { - /* already defined by ac97, remove it */ - /* FIXME: or do we need both controls? */ - remove_ctl(card, SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT)); + for (i = 0; i < ARRAY_SIZE(snd_ca0106_volume_ctls); i++) { + err = snd_ctl_add(card, snd_ctl_new1(&snd_ca0106_volume_ctls[i], emu)); + if (err < 0) + return err; + } + if (emu->details->i2c_adc == 1) { + if (emu->details->gpio_type == 1) + err = snd_ctl_add(card, snd_ctl_new1(&snd_ca0106_capture_mic_line_in, emu)); + else /* gpio_type == 2 */ + err = snd_ctl_add(card, snd_ctl_new1(&snd_ca0106_capture_line_in_side_out, emu)); + if (err < 0) + return err; } - if ((kctl = snd_ctl_new1(&snd_ca0106_spdif_control, emu)) == NULL) - return -ENOMEM; - if ((err = snd_ctl_add(card, kctl))) - return err; return 0; } diff --git a/sound/pci/ca0106/ca0106_proc.c b/sound/pci/ca0106/ca0106_proc.c index afb711421..75ca421eb 100644 --- a/sound/pci/ca0106/ca0106_proc.c +++ b/sound/pci/ca0106/ca0106_proc.c @@ -1,7 +1,7 @@ /* * Copyright (c) 2004 James Courtier-Dutton * Driver CA0106 chips. e.g. Sound Blaster Audigy LS and Live 24bit - * Version: 0.0.17 + * Version: 0.0.18 * * FEATURES currently supported: * See ca0106_main.c for features. @@ -39,7 +39,9 @@ * Modified Copyright message. * 0.0.17 * Add iec958 file in proc file system to show status of SPDIF in. - * + * 0.0.18 + * Implement support for Line-in capture on SB Live 24bit. + * * This code was initally based on code from ALSA's emu10k1x.c which is: * Copyright (c) by Francisco Moraes * @@ -75,6 +77,8 @@ #include "ca0106.h" +#ifdef CONFIG_PROC_FS + struct snd_ca0106_category_str { int val; const char *name; @@ -95,7 +99,7 @@ static struct snd_ca0106_category_str snd_ca0106_con_category[] = { }; -void snd_ca0106_proc_dump_iec958( snd_info_buffer_t *buffer, u32 value) +static void snd_ca0106_proc_dump_iec958( struct snd_info_buffer *buffer, u32 value) { int i; u32 status[4]; @@ -269,10 +273,10 @@ void snd_ca0106_proc_dump_iec958( snd_info_buffer_t *buffer, u32 value) } } -static void snd_ca0106_proc_iec958(snd_info_entry_t *entry, - snd_info_buffer_t * buffer) +static void snd_ca0106_proc_iec958(struct snd_info_entry *entry, + struct snd_info_buffer *buffer) { - ca0106_t *emu = entry->private_data; + struct snd_ca0106 *emu = entry->private_data; u32 value; value = snd_ca0106_ptr_read(emu, SAMPLE_RATE_TRACKER_STATUS, 0); @@ -291,10 +295,10 @@ static void snd_ca0106_proc_iec958(snd_info_entry_t *entry, snd_iprintf(buffer, "\n"); } -static void snd_ca0106_proc_reg_write32(snd_info_entry_t *entry, - snd_info_buffer_t * buffer) +static void snd_ca0106_proc_reg_write32(struct snd_info_entry *entry, + struct snd_info_buffer *buffer) { - ca0106_t *emu = entry->private_data; + struct snd_ca0106 *emu = entry->private_data; unsigned long flags; char line[64]; u32 reg, val; @@ -309,10 +313,10 @@ static void snd_ca0106_proc_reg_write32(snd_info_entry_t *entry, } } -static void snd_ca0106_proc_reg_read32(snd_info_entry_t *entry, - snd_info_buffer_t * buffer) +static void snd_ca0106_proc_reg_read32(struct snd_info_entry *entry, + struct snd_info_buffer *buffer) { - ca0106_t *emu = entry->private_data; + struct snd_ca0106 *emu = entry->private_data; unsigned long value; unsigned long flags; int i; @@ -325,10 +329,10 @@ static void snd_ca0106_proc_reg_read32(snd_info_entry_t *entry, } } -static void snd_ca0106_proc_reg_read16(snd_info_entry_t *entry, - snd_info_buffer_t * buffer) +static void snd_ca0106_proc_reg_read16(struct snd_info_entry *entry, + struct snd_info_buffer *buffer) { - ca0106_t *emu = entry->private_data; + struct snd_ca0106 *emu = entry->private_data; unsigned int value; unsigned long flags; int i; @@ -341,10 +345,10 @@ static void snd_ca0106_proc_reg_read16(snd_info_entry_t *entry, } } -static void snd_ca0106_proc_reg_read8(snd_info_entry_t *entry, - snd_info_buffer_t * buffer) +static void snd_ca0106_proc_reg_read8(struct snd_info_entry *entry, + struct snd_info_buffer *buffer) { - ca0106_t *emu = entry->private_data; + struct snd_ca0106 *emu = entry->private_data; unsigned int value; unsigned long flags; int i; @@ -357,10 +361,10 @@ static void snd_ca0106_proc_reg_read8(snd_info_entry_t *entry, } } -static void snd_ca0106_proc_reg_read1(snd_info_entry_t *entry, - snd_info_buffer_t * buffer) +static void snd_ca0106_proc_reg_read1(struct snd_info_entry *entry, + struct snd_info_buffer *buffer) { - ca0106_t *emu = entry->private_data; + struct snd_ca0106 *emu = entry->private_data; unsigned long value; int i,j; @@ -375,10 +379,10 @@ static void snd_ca0106_proc_reg_read1(snd_info_entry_t *entry, } } -static void snd_ca0106_proc_reg_read2(snd_info_entry_t *entry, - snd_info_buffer_t * buffer) +static void snd_ca0106_proc_reg_read2(struct snd_info_entry *entry, + struct snd_info_buffer *buffer) { - ca0106_t *emu = entry->private_data; + struct snd_ca0106 *emu = entry->private_data; unsigned long value; int i,j; @@ -393,10 +397,10 @@ static void snd_ca0106_proc_reg_read2(snd_info_entry_t *entry, } } -static void snd_ca0106_proc_reg_write(snd_info_entry_t *entry, - snd_info_buffer_t * buffer) +static void snd_ca0106_proc_reg_write(struct snd_info_entry *entry, + struct snd_info_buffer *buffer) { - ca0106_t *emu = entry->private_data; + struct snd_ca0106 *emu = entry->private_data; char line[64]; unsigned int reg, channel_id , val; while (!snd_info_get_line(buffer, line, sizeof(line))) { @@ -407,30 +411,51 @@ static void snd_ca0106_proc_reg_write(snd_info_entry_t *entry, } } +static void snd_ca0106_proc_i2c_write(struct snd_info_entry *entry, + struct snd_info_buffer *buffer) +{ + struct snd_ca0106 *emu = entry->private_data; + char line[64]; + unsigned int reg, val; + while (!snd_info_get_line(buffer, line, sizeof(line))) { + if (sscanf(line, "%x %x", ®, &val) != 2) + continue; + if ((reg <= 0x7f) || (val <= 0x1ff)) { + snd_ca0106_i2c_write(emu, reg, val); + } + } +} -int __devinit snd_ca0106_proc_init(ca0106_t * emu) +int __devinit snd_ca0106_proc_init(struct snd_ca0106 * emu) { - snd_info_entry_t *entry; + struct snd_info_entry *entry; if(! snd_card_proc_new(emu->card, "iec958", &entry)) - snd_info_set_text_ops(entry, emu, 1024, snd_ca0106_proc_iec958); + snd_info_set_text_ops(entry, emu, snd_ca0106_proc_iec958); if(! snd_card_proc_new(emu->card, "ca0106_reg32", &entry)) { - snd_info_set_text_ops(entry, emu, 1024, snd_ca0106_proc_reg_read32); - entry->c.text.write_size = 64; + snd_info_set_text_ops(entry, emu, snd_ca0106_proc_reg_read32); entry->c.text.write = snd_ca0106_proc_reg_write32; + entry->mode |= S_IWUSR; } if(! snd_card_proc_new(emu->card, "ca0106_reg16", &entry)) - snd_info_set_text_ops(entry, emu, 1024, snd_ca0106_proc_reg_read16); + snd_info_set_text_ops(entry, emu, snd_ca0106_proc_reg_read16); if(! snd_card_proc_new(emu->card, "ca0106_reg8", &entry)) - snd_info_set_text_ops(entry, emu, 1024, snd_ca0106_proc_reg_read8); + snd_info_set_text_ops(entry, emu, snd_ca0106_proc_reg_read8); if(! snd_card_proc_new(emu->card, "ca0106_regs1", &entry)) { - snd_info_set_text_ops(entry, emu, 1024, snd_ca0106_proc_reg_read1); - entry->c.text.write_size = 64; + snd_info_set_text_ops(entry, emu, snd_ca0106_proc_reg_read1); entry->c.text.write = snd_ca0106_proc_reg_write; + entry->mode |= S_IWUSR; +// entry->private_data = emu; + } + if(! snd_card_proc_new(emu->card, "ca0106_i2c", &entry)) { + snd_info_set_text_ops(entry, emu, snd_ca0106_proc_i2c_write); + entry->c.text.write = snd_ca0106_proc_i2c_write; + entry->mode |= S_IWUSR; // entry->private_data = emu; } if(! snd_card_proc_new(emu->card, "ca0106_regs2", &entry)) - snd_info_set_text_ops(entry, emu, 1024, snd_ca0106_proc_reg_read2); + snd_info_set_text_ops(entry, emu, snd_ca0106_proc_reg_read2); return 0; } +#endif /* CONFIG_PROC_FS */ diff --git a/sound/pci/cmipci.c b/sound/pci/cmipci.c index e5ce2dabd..876b64464 100644 --- a/sound/pci/cmipci.c +++ b/sound/pci/cmipci.c @@ -2121,7 +2121,7 @@ static struct snd_kcontrol_new snd_cmipci_mixers[] __devinitdata = { CMIPCI_MIXER_VOL_MONO("Mic Capture Volume", CM_REG_MIXER2, CM_VADMIC_SHIFT, 7), CMIPCI_SB_VOL_MONO("Phone Playback Volume", CM_REG_EXTENT_IND, 5, 7), CMIPCI_DOUBLE("Phone Playback Switch", CM_REG_EXTENT_IND, CM_REG_EXTENT_IND, 4, 4, 1, 0, 0), - CMIPCI_DOUBLE("PC Speaker Playnack Switch", CM_REG_EXTENT_IND, CM_REG_EXTENT_IND, 3, 3, 1, 0, 0), + CMIPCI_DOUBLE("PC Speaker Playback Switch", CM_REG_EXTENT_IND, CM_REG_EXTENT_IND, 3, 3, 1, 0, 0), CMIPCI_DOUBLE("Mic Boost Capture Switch", CM_REG_EXTENT_IND, CM_REG_EXTENT_IND, 0, 0, 1, 0, 0), }; @@ -2602,14 +2602,14 @@ static void __devinit snd_cmipci_proc_init(struct cmipci *cm) struct snd_info_entry *entry; if (! snd_card_proc_new(cm->card, "cmipci", &entry)) - snd_info_set_text_ops(entry, cm, 1024, snd_cmipci_proc_read); + snd_info_set_text_ops(entry, cm, snd_cmipci_proc_read); } #else /* !CONFIG_PROC_FS */ static inline void snd_cmipci_proc_init(struct cmipci *cm) {} #endif -static struct pci_device_id snd_cmipci_ids[] __devinitdata = { +static struct pci_device_id snd_cmipci_ids[] = { {PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8338A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8338B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8738, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, @@ -2862,7 +2862,7 @@ static int __devinit snd_cmipci_create(struct snd_card *card, struct pci_dev *pc cm->iobase = pci_resource_start(pci, 0); if (request_irq(pci->irq, snd_cmipci_interrupt, - SA_INTERRUPT|SA_SHIRQ, card->driver, cm)) { + IRQF_DISABLED|IRQF_SHARED, card->driver, cm)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_cmipci_free(cm); return -EBUSY; @@ -2932,7 +2932,7 @@ static int __devinit snd_cmipci_create(struct snd_card *card, struct pci_dev *pc } integrated_midi = snd_cmipci_read_b(cm, CM_REG_MPU_PCI) != 0xff; - if (integrated_midi) + if (integrated_midi && mpu_port[dev] == 1) iomidi = cm->iobase + CM_REG_MPU_PCI; else { iomidi = mpu_port[dev]; @@ -2981,7 +2981,9 @@ static int __devinit snd_cmipci_create(struct snd_card *card, struct pci_dev *pc if (iomidi > 0) { if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_CMIPCI, - iomidi, integrated_midi, + iomidi, + (integrated_midi ? + MPU401_INFO_INTEGRATED : 0), cm->irq, 0, &cm->rmidi)) < 0) { printk(KERN_ERR "cmipci: no UART401 device at 0x%lx\n", iomidi); } diff --git a/sound/pci/cs4281.c b/sound/pci/cs4281.c index b3c94d834..9631456ec 100644 --- a/sound/pci/cs4281.c +++ b/sound/pci/cs4281.c @@ -494,7 +494,7 @@ struct cs4281 { static irqreturn_t snd_cs4281_interrupt(int irq, void *dev_id, struct pt_regs *regs); -static struct pci_device_id snd_cs4281_ids[] __devinitdata = { +static struct pci_device_id snd_cs4281_ids[] = { { 0x1013, 0x6005, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* CS4281 */ { 0, } }; @@ -1184,7 +1184,7 @@ static void __devinit snd_cs4281_proc_init(struct cs4281 * chip) struct snd_info_entry *entry; if (! snd_card_proc_new(chip->card, "cs4281", &entry)) - snd_info_set_text_ops(entry, chip, 1024, snd_cs4281_proc_read); + snd_info_set_text_ops(entry, chip, snd_cs4281_proc_read); if (! snd_card_proc_new(chip->card, "cs4281_BA0", &entry)) { entry->content = SNDRV_INFO_CONTENT_DATA; entry->private_data = chip; @@ -1379,14 +1379,6 @@ static int __devinit snd_cs4281_create(struct snd_card *card, chip->ba0_addr = pci_resource_start(pci, 0); chip->ba1_addr = pci_resource_start(pci, 1); - if (request_irq(pci->irq, snd_cs4281_interrupt, SA_INTERRUPT|SA_SHIRQ, - "CS4281", chip)) { - snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); - snd_cs4281_free(chip); - return -ENOMEM; - } - chip->irq = pci->irq; - chip->ba0 = ioremap_nocache(chip->ba0_addr, pci_resource_len(pci, 0)); chip->ba1 = ioremap_nocache(chip->ba1_addr, pci_resource_len(pci, 1)); if (!chip->ba0 || !chip->ba1) { @@ -1394,6 +1386,14 @@ static int __devinit snd_cs4281_create(struct snd_card *card, return -ENOMEM; } + if (request_irq(pci->irq, snd_cs4281_interrupt, IRQF_DISABLED|IRQF_SHARED, + "CS4281", chip)) { + snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); + snd_cs4281_free(chip); + return -ENOMEM; + } + chip->irq = pci->irq; + tmp = snd_cs4281_chip_init(chip); if (tmp) { snd_cs4281_free(chip); diff --git a/sound/pci/cs46xx/cs46xx.c b/sound/pci/cs46xx/cs46xx.c index 848d772ae..8b6cd144d 100644 --- a/sound/pci/cs46xx/cs46xx.c +++ b/sound/pci/cs46xx/cs46xx.c @@ -48,8 +48,8 @@ MODULE_SUPPORTED_DEVICE("{{Cirrus Logic,Sound Fusion (CS4280)}," 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] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */ -static int external_amp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; -static int thinkpad[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; +static int external_amp[SNDRV_CARDS]; +static int thinkpad[SNDRV_CARDS]; static int mmap_valid[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1}; module_param_array(index, int, NULL, 0444); @@ -65,7 +65,7 @@ MODULE_PARM_DESC(thinkpad, "Force to enable Thinkpad's CLKRUN control."); module_param_array(mmap_valid, bool, NULL, 0444); MODULE_PARM_DESC(mmap_valid, "Support OSS mmap."); -static struct pci_device_id snd_cs46xx_ids[] __devinitdata = { +static struct pci_device_id snd_cs46xx_ids[] = { { 0x1013, 0x6001, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* CS4280 */ { 0x1013, 0x6003, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* CS4612 */ { 0x1013, 0x6004, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* CS4615 */ diff --git a/sound/pci/cs46xx/cs46xx_lib.c b/sound/pci/cs46xx/cs46xx_lib.c index 69dbf542a..485184718 100644 --- a/sound/pci/cs46xx/cs46xx_lib.c +++ b/sound/pci/cs46xx/cs46xx_lib.c @@ -2317,7 +2317,7 @@ static struct snd_kcontrol_new snd_cs46xx_front_dup_ctl = { #ifdef CONFIG_SND_CS46XX_NEW_DSP /* Only available on the Hercules Game Theater XP soundcard */ -static struct snd_kcontrol_new snd_hercules_controls[] __devinitdata = { +static struct snd_kcontrol_new snd_hercules_controls[] = { { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = "Optical/Coaxial SPDIF Input Switch", @@ -2877,14 +2877,15 @@ static int snd_cs46xx_free(struct snd_cs46xx *chip) if (chip->region.idx[0].resource) snd_cs46xx_hw_stop(chip); + if (chip->irq >= 0) + free_irq(chip->irq, chip); + for (idx = 0; idx < 5; idx++) { struct snd_cs46xx_region *region = &chip->region.idx[idx]; if (region->remap_addr) iounmap(region->remap_addr); release_and_free_resource(region->resource); } - if (chip->irq >= 0) - free_irq(chip->irq, chip); if (chip->active_ctrl) chip->active_ctrl(chip, -chip->amplifier); @@ -3457,6 +3458,9 @@ static void hercules_mixer_init (struct snd_cs46xx *chip) snd_printdd ("initializing Hercules mixer\n"); #ifdef CONFIG_SND_CS46XX_NEW_DSP + if (chip->in_suspend) + return; + for (idx = 0 ; idx < ARRAY_SIZE(snd_hercules_controls); idx++) { struct snd_kcontrol *kctl; @@ -3668,6 +3672,7 @@ int snd_cs46xx_suspend(struct pci_dev *pci, pm_message_t state) int amp_saved; snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); + chip->in_suspend = 1; snd_pcm_suspend_all(chip->pcm); // chip->ac97_powerdown = snd_cs46xx_codec_read(chip, AC97_POWER_CONTROL); // chip->ac97_general_purpose = snd_cs46xx_codec_read(chip, BA0_AC97_GENERAL_PURPOSE); @@ -3721,6 +3726,7 @@ int snd_cs46xx_resume(struct pci_dev *pci) else chip->active_ctrl(chip, -1); /* disable CLKRUN */ chip->amplifier = amp_saved; + chip->in_suspend = 0; snd_power_change_state(card, SNDRV_CTL_POWER_D0); return 0; } @@ -3852,7 +3858,7 @@ int __devinit snd_cs46xx_create(struct snd_card *card, } } - if (request_irq(pci->irq, snd_cs46xx_interrupt, SA_INTERRUPT|SA_SHIRQ, + if (request_irq(pci->irq, snd_cs46xx_interrupt, IRQF_DISABLED|IRQF_SHARED, "CS46XX", chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_cs46xx_free(chip); diff --git a/sound/pci/cs46xx/dsp_spos.c b/sound/pci/cs46xx/dsp_spos.c index f407d2a5c..5c9711c02 100644 --- a/sound/pci/cs46xx/dsp_spos.c +++ b/sound/pci/cs46xx/dsp_spos.c @@ -767,7 +767,6 @@ int cs46xx_dsp_proc_init (struct snd_card *card, struct snd_cs46xx *chip) if ((entry = snd_info_create_card_entry(card, "dsp", card->proc_root)) != NULL) { entry->content = SNDRV_INFO_CONTENT_TEXT; entry->mode = S_IFDIR | S_IRUGO | S_IXUGO; - entry->c.text.read_size = 512; if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); @@ -784,7 +783,6 @@ int cs46xx_dsp_proc_init (struct snd_card *card, struct snd_cs46xx *chip) entry->content = SNDRV_INFO_CONTENT_TEXT; entry->private_data = chip; entry->mode = S_IFREG | S_IRUGO | S_IWUSR; - entry->c.text.read_size = 512; entry->c.text.read = cs46xx_dsp_proc_symbol_table_read; if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); @@ -797,7 +795,6 @@ int cs46xx_dsp_proc_init (struct snd_card *card, struct snd_cs46xx *chip) entry->content = SNDRV_INFO_CONTENT_TEXT; entry->private_data = chip; entry->mode = S_IFREG | S_IRUGO | S_IWUSR; - entry->c.text.read_size = 512; entry->c.text.read = cs46xx_dsp_proc_modules_read; if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); @@ -810,7 +807,6 @@ int cs46xx_dsp_proc_init (struct snd_card *card, struct snd_cs46xx *chip) entry->content = SNDRV_INFO_CONTENT_TEXT; entry->private_data = chip; entry->mode = S_IFREG | S_IRUGO | S_IWUSR; - entry->c.text.read_size = 512; entry->c.text.read = cs46xx_dsp_proc_parameter_dump_read; if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); @@ -823,7 +819,6 @@ int cs46xx_dsp_proc_init (struct snd_card *card, struct snd_cs46xx *chip) entry->content = SNDRV_INFO_CONTENT_TEXT; entry->private_data = chip; entry->mode = S_IFREG | S_IRUGO | S_IWUSR; - entry->c.text.read_size = 512; entry->c.text.read = cs46xx_dsp_proc_sample_dump_read; if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); @@ -836,7 +831,6 @@ int cs46xx_dsp_proc_init (struct snd_card *card, struct snd_cs46xx *chip) entry->content = SNDRV_INFO_CONTENT_TEXT; entry->private_data = chip; entry->mode = S_IFREG | S_IRUGO | S_IWUSR; - entry->c.text.read_size = 512; entry->c.text.read = cs46xx_dsp_proc_task_tree_read; if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); @@ -849,7 +843,6 @@ int cs46xx_dsp_proc_init (struct snd_card *card, struct snd_cs46xx *chip) entry->content = SNDRV_INFO_CONTENT_TEXT; entry->private_data = chip; entry->mode = S_IFREG | S_IRUGO | S_IWUSR; - entry->c.text.read_size = 1024; entry->c.text.read = cs46xx_dsp_proc_scb_read; if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); diff --git a/sound/pci/cs46xx/dsp_spos_scb_lib.c b/sound/pci/cs46xx/dsp_spos_scb_lib.c index 2c4ee45fe..232b33785 100644 --- a/sound/pci/cs46xx/dsp_spos_scb_lib.c +++ b/sound/pci/cs46xx/dsp_spos_scb_lib.c @@ -180,6 +180,7 @@ static void _dsp_clear_sample_buffer (struct snd_cs46xx *chip, u32 sample_buffer void cs46xx_dsp_remove_scb (struct snd_cs46xx *chip, struct dsp_scb_descriptor * scb) { struct dsp_spos_instance * ins = chip->dsp_spos_instance; + unsigned long flags; /* check integrety */ snd_assert ( (scb->index >= 0 && @@ -194,9 +195,9 @@ void cs46xx_dsp_remove_scb (struct snd_cs46xx *chip, struct dsp_scb_descriptor * goto _end); #endif - spin_lock(&scb->lock); + spin_lock_irqsave(&scb->lock, flags); _dsp_unlink_scb (chip,scb); - spin_unlock(&scb->lock); + spin_unlock_irqrestore(&scb->lock, flags); cs46xx_dsp_proc_free_scb_desc(scb); snd_assert (scb->scb_symbol != NULL, return ); @@ -267,7 +268,6 @@ void cs46xx_dsp_proc_register_scb_desc (struct snd_cs46xx *chip, entry->private_data = scb_info; entry->mode = S_IFREG | S_IRUGO | S_IWUSR; - entry->c.text.read_size = 512; entry->c.text.read = cs46xx_dsp_proc_scb_info_read; if (snd_info_register(entry) < 0) { diff --git a/sound/pci/cs5535audio/Makefile b/sound/pci/cs5535audio/Makefile index 08d8ee654..2911a8adc 100644 --- a/sound/pci/cs5535audio/Makefile +++ b/sound/pci/cs5535audio/Makefile @@ -4,5 +4,9 @@ snd-cs5535audio-objs := cs5535audio.o cs5535audio_pcm.o +ifdef CONFIG_PM +snd-cs5535audio-objs += cs5535audio_pm.o +endif + # Toplevel Module Dependency obj-$(CONFIG_SND_CS5535AUDIO) += snd-cs5535audio.o diff --git a/sound/pci/cs5535audio/cs5535audio.c b/sound/pci/cs5535audio/cs5535audio.c index 2c1213a35..64c7826e8 100644 --- a/sound/pci/cs5535audio/cs5535audio.c +++ b/sound/pci/cs5535audio/cs5535audio.c @@ -1,5 +1,5 @@ /* - * Driver for audio on multifunction CS5535 companion device + * Driver for audio on multifunction CS5535/6 companion device * Copyright (C) Jaya Kumar * * Based on Jaroslav Kysela and Takashi Iwai's examples. @@ -40,16 +40,36 @@ #define DRIVER_NAME "cs5535audio" +static char *ac97_quirk; +module_param(ac97_quirk, charp, 0444); +MODULE_PARM_DESC(ac97_quirk, "AC'97 board specific workarounds."); + +static struct ac97_quirk ac97_quirks[] __devinitdata = { +#if 0 /* Not yet confirmed if all 5536 boards are HP only */ + { + .subvendor = PCI_VENDOR_ID_AMD, + .subdevice = PCI_DEVICE_ID_AMD_CS5536_AUDIO, + .name = "AMD RDK", + .type = AC97_TUNE_HP_ONLY + }, +#endif + {} +}; static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; -static struct pci_device_id snd_cs5535audio_ids[] __devinitdata = { - { PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_CS5535_AUDIO, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, - { PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_AUDIO, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, +module_param_array(index, int, NULL, 0444); +MODULE_PARM_DESC(index, "Index value for " DRIVER_NAME); +module_param_array(id, charp, NULL, 0444); +MODULE_PARM_DESC(id, "ID string for " DRIVER_NAME); +module_param_array(enable, bool, NULL, 0444); +MODULE_PARM_DESC(enable, "Enable " DRIVER_NAME); + +static struct pci_device_id snd_cs5535audio_ids[] = { + { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_CS5535_AUDIO) }, + { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_AUDIO) }, {} }; @@ -90,7 +110,8 @@ static unsigned short snd_cs5535audio_codec_read(struct cs5535audio *cs5535au, udelay(1); } while (--timeout); if (!timeout) - snd_printk(KERN_ERR "Failure reading cs5535 codec\n"); + snd_printk(KERN_ERR "Failure reading codec reg 0x%x," + "Last value=0x%x\n", reg, val); return (unsigned short) val; } @@ -148,6 +169,8 @@ static int snd_cs5535audio_mixer(struct cs5535audio *cs5535au) return err; } + snd_ac97_tune_hardware(cs5535au->ac97, ac97_quirks, ac97_quirk); + return 0; } @@ -298,7 +321,7 @@ static int __devinit snd_cs5535audio_create(struct snd_card *card, cs5535au->port = pci_resource_start(pci, 0); if (request_irq(pci->irq, snd_cs5535audio_interrupt, - SA_INTERRUPT|SA_SHIRQ, "CS5535 Audio", cs5535au)) { + IRQF_DISABLED|IRQF_SHARED, "CS5535 Audio", cs5535au)) { snd_printk("unable to grab IRQ %d\n", pci->irq); err = -EBUSY; goto sndfail; @@ -347,6 +370,8 @@ static int __devinit snd_cs5535audio_probe(struct pci_dev *pci, if ((err = snd_cs5535audio_create(card, pci, &cs5535au)) < 0) goto probefail_out; + card->private_data = cs5535au; + if ((err = snd_cs5535audio_mixer(cs5535au)) < 0) goto probefail_out; @@ -383,6 +408,10 @@ static struct pci_driver driver = { .id_table = snd_cs5535audio_ids, .probe = snd_cs5535audio_probe, .remove = __devexit_p(snd_cs5535audio_remove), +#ifdef CONFIG_PM + .suspend = snd_cs5535audio_suspend, + .resume = snd_cs5535audio_resume, +#endif }; static int __init alsa_card_cs5535audio_init(void) diff --git a/sound/pci/cs5535audio/cs5535audio.h b/sound/pci/cs5535audio/cs5535audio.h index 5e55a1a1e..4fd1f31a6 100644 --- a/sound/pci/cs5535audio/cs5535audio.h +++ b/sound/pci/cs5535audio/cs5535audio.h @@ -74,6 +74,8 @@ #define PRM_RDY_STS 0x00800000 #define ACC_CODEC_CNTL_WR_CMD (~0x80000000) #define ACC_CODEC_CNTL_RD_CMD 0x80000000 +#define ACC_CODEC_CNTL_LNK_SHUTDOWN 0x00040000 +#define ACC_CODEC_CNTL_LNK_WRM_RST 0x00020000 #define PRD_JMP 0x2000 #define PRD_EOP 0x4000 #define PRD_EOT 0x8000 @@ -88,6 +90,7 @@ struct cs5535audio_dma_ops { void (*disable_dma)(struct cs5535audio *cs5535au); void (*pause_dma)(struct cs5535audio *cs5535au); void (*setup_prd)(struct cs5535audio *cs5535au, u32 prd_addr); + u32 (*read_prd)(struct cs5535audio *cs5535au); u32 (*read_dma_pntr)(struct cs5535audio *cs5535au); }; @@ -103,11 +106,14 @@ struct cs5535audio_dma { struct snd_pcm_substream *substream; unsigned int buf_addr, buf_bytes; unsigned int period_bytes, periods; + int suspended; + u32 saved_prd; }; struct cs5535audio { struct snd_card *card; struct snd_ac97 *ac97; + struct snd_pcm *pcm; int irq; struct pci_dev *pci; unsigned long port; @@ -117,6 +123,8 @@ struct cs5535audio { struct cs5535audio_dma dmas[NUM_CS5535AUDIO_DMAS]; }; +int snd_cs5535audio_suspend(struct pci_dev *pci, pm_message_t state); +int snd_cs5535audio_resume(struct pci_dev *pci); int __devinit snd_cs5535audio_pcm(struct cs5535audio *cs5535audio); #endif /* __SOUND_CS5535AUDIO_H */ diff --git a/sound/pci/cs5535audio/cs5535audio_pcm.c b/sound/pci/cs5535audio/cs5535audio_pcm.c index 60bb82b2f..5450a9e8f 100644 --- a/sound/pci/cs5535audio/cs5535audio_pcm.c +++ b/sound/pci/cs5535audio/cs5535audio_pcm.c @@ -43,7 +43,8 @@ static struct snd_pcm_hardware snd_cs5535audio_playback = SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_PAUSE | - SNDRV_PCM_INFO_SYNC_START + SNDRV_PCM_INFO_SYNC_START | + SNDRV_PCM_INFO_RESUME ), .formats = ( SNDRV_PCM_FMTBIT_S16_LE @@ -142,7 +143,7 @@ static int cs5535audio_build_dma_packets(struct cs5535audio *cs5535au, if (dma->periods == periods && dma->period_bytes == period_bytes) return 0; - /* the u32 cast is okay because in snd*create we succesfully told + /* the u32 cast is okay because in snd*create we successfully told pci alloc that we're only 32 bit capable so the uppper will be 0 */ addr = (u32) substream->runtime->dma_addr; desc_addr = (u32) dma->desc_buf.addr; @@ -193,6 +194,11 @@ static void cs5535audio_playback_setup_prd(struct cs5535audio *cs5535au, cs_writel(cs5535au, ACC_BM0_PRD, prd_addr); } +static u32 cs5535audio_playback_read_prd(struct cs5535audio *cs5535au) +{ + return cs_readl(cs5535au, ACC_BM0_PRD); +} + static u32 cs5535audio_playback_read_dma_pntr(struct cs5535audio *cs5535au) { return cs_readl(cs5535au, ACC_BM0_PNTR); @@ -219,6 +225,11 @@ static void cs5535audio_capture_setup_prd(struct cs5535audio *cs5535au, cs_writel(cs5535au, ACC_BM1_PRD, prd_addr); } +static u32 cs5535audio_capture_read_prd(struct cs5535audio *cs5535au) +{ + return cs_readl(cs5535au, ACC_BM1_PRD); +} + static u32 cs5535audio_capture_read_dma_pntr(struct cs5535audio *cs5535au) { return cs_readl(cs5535au, ACC_BM1_PNTR); @@ -285,9 +296,17 @@ static int snd_cs5535audio_trigger(struct snd_pcm_substream *substream, int cmd) case SNDRV_PCM_TRIGGER_START: dma->ops->enable_dma(cs5535au); break; + case SNDRV_PCM_TRIGGER_RESUME: + dma->ops->enable_dma(cs5535au); + dma->suspended = 0; + break; case SNDRV_PCM_TRIGGER_STOP: dma->ops->disable_dma(cs5535au); break; + case SNDRV_PCM_TRIGGER_SUSPEND: + dma->ops->disable_dma(cs5535au); + dma->suspended = 1; + break; default: snd_printk(KERN_ERR "unhandled trigger\n"); err = -EINVAL; @@ -375,6 +394,7 @@ static struct cs5535audio_dma_ops snd_cs5535audio_playback_dma_ops = { .enable_dma = cs5535audio_playback_enable_dma, .disable_dma = cs5535audio_playback_disable_dma, .setup_prd = cs5535audio_playback_setup_prd, + .read_prd = cs5535audio_playback_read_prd, .pause_dma = cs5535audio_playback_pause_dma, .read_dma_pntr = cs5535audio_playback_read_dma_pntr, }; @@ -384,6 +404,7 @@ static struct cs5535audio_dma_ops snd_cs5535audio_capture_dma_ops = { .enable_dma = cs5535audio_capture_enable_dma, .disable_dma = cs5535audio_capture_disable_dma, .setup_prd = cs5535audio_capture_setup_prd, + .read_prd = cs5535audio_capture_read_prd, .pause_dma = cs5535audio_capture_pause_dma, .read_dma_pntr = cs5535audio_capture_read_dma_pntr, }; @@ -413,6 +434,7 @@ int __devinit snd_cs5535audio_pcm(struct cs5535audio *cs5535au) snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(cs5535au->pci), 64*1024, 128*1024); + cs5535au->pcm = pcm; return 0; } diff --git a/sound/pci/emu10k1/emu10k1.c b/sound/pci/emu10k1/emu10k1.c index 42b11ba1d..289bcd99c 100644 --- a/sound/pci/emu10k1/emu10k1.c +++ b/sound/pci/emu10k1/emu10k1.c @@ -46,13 +46,13 @@ MODULE_SUPPORTED_DEVICE("{{Creative Labs,SB Live!/PCI512/E-mu APS}," 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] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */ -static int extin[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; -static int extout[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; +static int extin[SNDRV_CARDS]; +static int extout[SNDRV_CARDS]; static int seq_ports[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 4}; static int max_synth_voices[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 64}; static int max_buffer_size[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 128}; -static int enable_ir[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; -static uint subsystem[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; /* Force card subsystem model */ +static int enable_ir[SNDRV_CARDS]; +static uint subsystem[SNDRV_CARDS]; /* Force card subsystem model */ module_param_array(index, int, NULL, 0444); MODULE_PARM_DESC(index, "Index value for the EMU10K1 soundcard."); @@ -77,7 +77,7 @@ MODULE_PARM_DESC(subsystem, "Force card subsystem model."); /* * Class 0401: 1102:0008 (rev 00) Subsystem: 1102:1001 -> Audigy2 Value Model:SB0400 */ -static struct pci_device_id snd_emu10k1_ids[] __devinitdata = { +static struct pci_device_id snd_emu10k1_ids[] = { { 0x1102, 0x0002, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* EMU10K1 */ { 0x1102, 0x0004, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 }, /* Audigy */ { 0x1102, 0x0008, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 }, /* Audigy 2 Value SB0400 */ diff --git a/sound/pci/emu10k1/emu10k1_main.c b/sound/pci/emu10k1/emu10k1_main.c index 6bfa08436..bc1dfdc92 100644 --- a/sound/pci/emu10k1/emu10k1_main.c +++ b/sound/pci/emu10k1/emu10k1_main.c @@ -531,7 +531,7 @@ static void snd_emu10k1_ecard_setadcgain(struct snd_emu10k1 * emu, snd_emu10k1_ecard_write(emu, emu->ecard_ctrl); } -static int __devinit snd_emu10k1_ecard_init(struct snd_emu10k1 * emu) +static int snd_emu10k1_ecard_init(struct snd_emu10k1 * emu) { unsigned int hc_value; @@ -571,7 +571,7 @@ static int __devinit snd_emu10k1_ecard_init(struct snd_emu10k1 * emu) return 0; } -static int __devinit snd_emu10k1_cardbus_init(struct snd_emu10k1 * emu) +static int snd_emu10k1_cardbus_init(struct snd_emu10k1 * emu) { unsigned long special_port; unsigned int value; @@ -633,7 +633,7 @@ static int snd_emu1212m_fpga_netlist_write(struct snd_emu10k1 * emu, int reg, in return 0; } -static int __devinit snd_emu10k1_emu1212m_init(struct snd_emu10k1 * emu) +static int snd_emu10k1_emu1212m_init(struct snd_emu10k1 * emu) { unsigned int i; int tmp; @@ -777,14 +777,6 @@ static int snd_emu10k1_dev_free(struct snd_device *device) static struct snd_emu_chip_details emu_chip_details[] = { /* Audigy 2 Value AC3 out does not work yet. Need to find out how to turn off interpolators.*/ - /* Audigy4 SB0400 */ - {.vendor = 0x1102, .device = 0x0008, .subsystem = 0x10211102, - .driver = "Audigy2", .name = "Audigy 4 [SB0400]", - .id = "Audigy2", - .emu10k2_chip = 1, - .ca0108_chip = 1, - .spk71 = 1, - .ac97_chip = 1} , /* Tested by James@superbug.co.uk 3rd July 2005 */ /* DSP: CA0108-IAT * DAC: CS4382-KQ @@ -799,13 +791,59 @@ static struct snd_emu_chip_details emu_chip_details[] = { .ca0108_chip = 1, .spk71 = 1, .ac97_chip = 1} , + /* Audigy4 (Not PRO) SB0610 */ + /* Tested by James@superbug.co.uk 4th April 2006 */ + /* A_IOCFG bits + * Output + * 0: ? + * 1: ? + * 2: ? + * 3: 0 - Digital Out, 1 - Line in + * 4: ? + * 5: ? + * 6: ? + * 7: ? + * Input + * 8: ? + * 9: ? + * A: Green jack sense (Front) + * B: ? + * C: Black jack sense (Rear/Side Right) + * D: Yellow jack sense (Center/LFE/Side Left) + * E: ? + * F: ? + * + * Digital Out/Line in switch using A_IOCFG bit 3 (0x08) + * 0 - Digital Out + * 1 - Line in + */ + /* Mic input not tested. + * Analog CD input not tested + * Digital Out not tested. + * Line in working. + * Audio output 5.1 working. Side outputs not working. + */ + /* DSP: CA10300-IAT LF + * DAC: Cirrus Logic CS4382-KQZ + * ADC: Philips 1361T + * AC97: Sigmatel STAC9750 + * CA0151: None + */ + {.vendor = 0x1102, .device = 0x0008, .subsystem = 0x10211102, + .driver = "Audigy2", .name = "Audigy 4 [SB0610]", + .id = "Audigy2", + .emu10k2_chip = 1, + .ca0108_chip = 1, + .spk71 = 1, + .adc_1361t = 1, /* 24 bit capture instead of 16bit */ + .ac97_chip = 1} , /* Audigy 2 ZS Notebook Cardbus card.*/ /* Tested by James@superbug.co.uk 22th December 2005 */ /* Audio output 7.1/Headphones working. * Digital output working. (AC3 not checked, only PCM) * Audio inputs not tested. */ - /* DSP: Tiny2 + /* DSP: Tina2 * DAC: Wolfson WM8768/WM8568 * ADC: Wolfson WM8775 * AC97: None @@ -898,6 +936,17 @@ static struct snd_emu_chip_details emu_chip_details[] = { .ca0151_chip = 1, .spk71 = 1, .spdif_bug = 1} , + /* Dell OEM/Creative Labs Audigy 2 ZS */ + /* See ALSA bug#1365 */ + {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10031102, + .driver = "Audigy2", .name = "Audigy 2 ZS [SB0353]", + .id = "Audigy2", + .emu10k2_chip = 1, + .ca0102_chip = 1, + .ca0151_chip = 1, + .spk71 = 1, + .spdif_bug = 1, + .ac97_chip = 1} , {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10021102, .driver = "Audigy2", .name = "Audigy 2 Platinum [SB0240P]", .id = "Audigy2", @@ -1195,7 +1244,7 @@ int __devinit snd_emu10k1_create(struct snd_card *card, } emu->port = pci_resource_start(pci, 0); - if (request_irq(pci->irq, snd_emu10k1_interrupt, SA_INTERRUPT|SA_SHIRQ, "EMU10K1", (void *)emu)) { + if (request_irq(pci->irq, snd_emu10k1_interrupt, IRQF_DISABLED|IRQF_SHARED, "EMU10K1", (void *)emu)) { err = -EBUSY; goto error; } @@ -1392,6 +1441,10 @@ void snd_emu10k1_resume_init(struct snd_emu10k1 *emu) { if (emu->card_capabilities->ecard) snd_emu10k1_ecard_init(emu); + else if (emu->card_capabilities->ca_cardbus_chip) + snd_emu10k1_cardbus_init(emu); + else if (emu->card_capabilities->emu1212m) + snd_emu10k1_emu1212m_init(emu); else snd_emu10k1_ptr_write(emu, AC97SLOT, 0, AC97SLOT_CNTR|AC97SLOT_LFE); snd_emu10k1_init(emu, emu->enable_ir, 1); @@ -1407,8 +1460,8 @@ void snd_emu10k1_resume_regs(struct snd_emu10k1 *emu) /* resore for spdif */ if (emu->audigy) - outl(emu->port + A_IOCFG, emu->saved_a_iocfg); - outl(emu->port + HCFG, emu->saved_hcfg); + outl(emu->saved_a_iocfg, emu->port + A_IOCFG); + outl(emu->saved_hcfg, emu->port + HCFG); val = emu->saved_ptr; for (reg = saved_regs; *reg != 0xff; reg++) @@ -1421,16 +1474,3 @@ void snd_emu10k1_resume_regs(struct snd_emu10k1 *emu) } } #endif - -/* memory.c */ -EXPORT_SYMBOL(snd_emu10k1_synth_alloc); -EXPORT_SYMBOL(snd_emu10k1_synth_free); -EXPORT_SYMBOL(snd_emu10k1_synth_bzero); -EXPORT_SYMBOL(snd_emu10k1_synth_copy_from_user); -EXPORT_SYMBOL(snd_emu10k1_memblk_map); -/* voice.c */ -EXPORT_SYMBOL(snd_emu10k1_voice_alloc); -EXPORT_SYMBOL(snd_emu10k1_voice_free); -/* io.c */ -EXPORT_SYMBOL(snd_emu10k1_ptr_read); -EXPORT_SYMBOL(snd_emu10k1_ptr_write); diff --git a/sound/pci/emu10k1/emu10k1x.c b/sound/pci/emu10k1/emu10k1x.c index 27dfd8ddd..bda8bdf59 100644 --- a/sound/pci/emu10k1/emu10k1x.c +++ b/sound/pci/emu10k1/emu10k1x.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -195,30 +196,26 @@ MODULE_PARM_DESC(enable, "Enable the EMU10K1X soundcard."); * playback. */ -typedef struct snd_emu10k1x_voice emu10k1x_voice_t; -typedef struct snd_emu10k1x emu10k1x_t; -typedef struct snd_emu10k1x_pcm emu10k1x_pcm_t; - -struct snd_emu10k1x_voice { - emu10k1x_t *emu; +struct emu10k1x_voice { + struct emu10k1x *emu; int number; int use; - emu10k1x_pcm_t *epcm; + struct emu10k1x_pcm *epcm; }; -struct snd_emu10k1x_pcm { - emu10k1x_t *emu; - snd_pcm_substream_t *substream; - emu10k1x_voice_t *voice; +struct emu10k1x_pcm { + struct emu10k1x *emu; + struct snd_pcm_substream *substream; + struct emu10k1x_voice *voice; unsigned short running; }; -typedef struct { - struct snd_emu10k1x *emu; - snd_rawmidi_t *rmidi; - snd_rawmidi_substream_t *substream_input; - snd_rawmidi_substream_t *substream_output; +struct emu10k1x_midi { + struct emu10k1x *emu; + struct snd_rawmidi *rmidi; + struct snd_rawmidi_substream *substream_input; + struct snd_rawmidi_substream *substream_output; unsigned int midi_mode; spinlock_t input_lock; spinlock_t output_lock; @@ -226,12 +223,12 @@ typedef struct { int tx_enable, rx_enable; int port; int ipr_tx, ipr_rx; - void (*interrupt)(emu10k1x_t *emu, unsigned int status); -} emu10k1x_midi_t; + void (*interrupt)(struct emu10k1x *emu, unsigned int status); +}; // definition of the chip-specific record -struct snd_emu10k1x { - snd_card_t *card; +struct emu10k1x { + struct snd_card *card; struct pci_dev *pci; unsigned long port; @@ -245,20 +242,20 @@ struct snd_emu10k1x { spinlock_t emu_lock; spinlock_t voice_lock; - ac97_t *ac97; - snd_pcm_t *pcm; + struct snd_ac97 *ac97; + struct snd_pcm *pcm; - emu10k1x_voice_t voices[3]; - emu10k1x_voice_t capture_voice; + struct emu10k1x_voice voices[3]; + struct emu10k1x_voice capture_voice; u32 spdif_bits[3]; // SPDIF out setup struct snd_dma_buffer dma_buffer; - emu10k1x_midi_t midi; + struct emu10k1x_midi midi; }; /* hardware definition */ -static snd_pcm_hardware_t snd_emu10k1x_playback_hw = { +static struct snd_pcm_hardware snd_emu10k1x_playback_hw = { .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER | @@ -277,7 +274,7 @@ static snd_pcm_hardware_t snd_emu10k1x_playback_hw = { .fifo_size = 0, }; -static snd_pcm_hardware_t snd_emu10k1x_capture_hw = { +static struct snd_pcm_hardware snd_emu10k1x_capture_hw = { .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER | @@ -296,7 +293,7 @@ static snd_pcm_hardware_t snd_emu10k1x_capture_hw = { .fifo_size = 0, }; -static unsigned int snd_emu10k1x_ptr_read(emu10k1x_t * emu, +static unsigned int snd_emu10k1x_ptr_read(struct emu10k1x * emu, unsigned int reg, unsigned int chn) { @@ -312,7 +309,7 @@ static unsigned int snd_emu10k1x_ptr_read(emu10k1x_t * emu, return val; } -static void snd_emu10k1x_ptr_write(emu10k1x_t *emu, +static void snd_emu10k1x_ptr_write(struct emu10k1x *emu, unsigned int reg, unsigned int chn, unsigned int data) @@ -328,7 +325,7 @@ static void snd_emu10k1x_ptr_write(emu10k1x_t *emu, spin_unlock_irqrestore(&emu->emu_lock, flags); } -static void snd_emu10k1x_intr_enable(emu10k1x_t *emu, unsigned int intrenb) +static void snd_emu10k1x_intr_enable(struct emu10k1x *emu, unsigned int intrenb) { unsigned long flags; unsigned int enable; @@ -339,7 +336,7 @@ static void snd_emu10k1x_intr_enable(emu10k1x_t *emu, unsigned int intrenb) spin_unlock_irqrestore(&emu->emu_lock, flags); } -static void snd_emu10k1x_intr_disable(emu10k1x_t *emu, unsigned int intrenb) +static void snd_emu10k1x_intr_disable(struct emu10k1x *emu, unsigned int intrenb) { unsigned long flags; unsigned int enable; @@ -350,7 +347,7 @@ static void snd_emu10k1x_intr_disable(emu10k1x_t *emu, unsigned int intrenb) spin_unlock_irqrestore(&emu->emu_lock, flags); } -static void snd_emu10k1x_gpio_write(emu10k1x_t *emu, unsigned int value) +static void snd_emu10k1x_gpio_write(struct emu10k1x *emu, unsigned int value) { unsigned long flags; @@ -359,17 +356,14 @@ static void snd_emu10k1x_gpio_write(emu10k1x_t *emu, unsigned int value) spin_unlock_irqrestore(&emu->emu_lock, flags); } -static void snd_emu10k1x_pcm_free_substream(snd_pcm_runtime_t *runtime) +static void snd_emu10k1x_pcm_free_substream(struct snd_pcm_runtime *runtime) { - emu10k1x_pcm_t *epcm = runtime->private_data; - - if (epcm) - kfree(epcm); + kfree(runtime->private_data); } -static void snd_emu10k1x_pcm_interrupt(emu10k1x_t *emu, emu10k1x_voice_t *voice) +static void snd_emu10k1x_pcm_interrupt(struct emu10k1x *emu, struct emu10k1x_voice *voice) { - emu10k1x_pcm_t *epcm; + struct emu10k1x_pcm *epcm; if ((epcm = voice->epcm) == NULL) return; @@ -385,11 +379,11 @@ static void snd_emu10k1x_pcm_interrupt(emu10k1x_t *emu, emu10k1x_voice_t *voice) } /* open callback */ -static int snd_emu10k1x_playback_open(snd_pcm_substream_t *substream) +static int snd_emu10k1x_playback_open(struct snd_pcm_substream *substream) { - emu10k1x_t *chip = snd_pcm_substream_chip(substream); - emu10k1x_pcm_t *epcm; - snd_pcm_runtime_t *runtime = substream->runtime; + struct emu10k1x *chip = snd_pcm_substream_chip(substream); + struct emu10k1x_pcm *epcm; + struct snd_pcm_runtime *runtime = substream->runtime; int err; if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0) { @@ -398,7 +392,7 @@ static int snd_emu10k1x_playback_open(snd_pcm_substream_t *substream) if ((err = snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 64)) < 0) return err; - epcm = kcalloc(1, sizeof(*epcm), GFP_KERNEL); + epcm = kzalloc(sizeof(*epcm), GFP_KERNEL); if (epcm == NULL) return -ENOMEM; epcm->emu = chip; @@ -413,17 +407,17 @@ static int snd_emu10k1x_playback_open(snd_pcm_substream_t *substream) } /* close callback */ -static int snd_emu10k1x_playback_close(snd_pcm_substream_t *substream) +static int snd_emu10k1x_playback_close(struct snd_pcm_substream *substream) { return 0; } /* hw_params callback */ -static int snd_emu10k1x_pcm_hw_params(snd_pcm_substream_t *substream, - snd_pcm_hw_params_t * hw_params) +static int snd_emu10k1x_pcm_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *hw_params) { - snd_pcm_runtime_t *runtime = substream->runtime; - emu10k1x_pcm_t *epcm = runtime->private_data; + struct snd_pcm_runtime *runtime = substream->runtime; + struct emu10k1x_pcm *epcm = runtime->private_data; if (! epcm->voice) { epcm->voice = &epcm->emu->voices[substream->pcm->device]; @@ -436,10 +430,10 @@ static int snd_emu10k1x_pcm_hw_params(snd_pcm_substream_t *substream, } /* hw_free callback */ -static int snd_emu10k1x_pcm_hw_free(snd_pcm_substream_t *substream) +static int snd_emu10k1x_pcm_hw_free(struct snd_pcm_substream *substream) { - snd_pcm_runtime_t *runtime = substream->runtime; - emu10k1x_pcm_t *epcm; + struct snd_pcm_runtime *runtime = substream->runtime; + struct emu10k1x_pcm *epcm; if (runtime->private_data == NULL) return 0; @@ -456,11 +450,11 @@ static int snd_emu10k1x_pcm_hw_free(snd_pcm_substream_t *substream) } /* prepare callback */ -static int snd_emu10k1x_pcm_prepare(snd_pcm_substream_t *substream) +static int snd_emu10k1x_pcm_prepare(struct snd_pcm_substream *substream) { - emu10k1x_t *emu = snd_pcm_substream_chip(substream); - snd_pcm_runtime_t *runtime = substream->runtime; - emu10k1x_pcm_t *epcm = runtime->private_data; + struct emu10k1x *emu = snd_pcm_substream_chip(substream); + struct snd_pcm_runtime *runtime = substream->runtime; + struct emu10k1x_pcm *epcm = runtime->private_data; int voice = epcm->voice->number; u32 *table_base = (u32 *)(emu->dma_buffer.area+1024*voice); u32 period_size_bytes = frames_to_bytes(runtime, runtime->period_size); @@ -485,12 +479,12 @@ static int snd_emu10k1x_pcm_prepare(snd_pcm_substream_t *substream) } /* trigger callback */ -static int snd_emu10k1x_pcm_trigger(snd_pcm_substream_t *substream, +static int snd_emu10k1x_pcm_trigger(struct snd_pcm_substream *substream, int cmd) { - emu10k1x_t *emu = snd_pcm_substream_chip(substream); - snd_pcm_runtime_t *runtime = substream->runtime; - emu10k1x_pcm_t *epcm = runtime->private_data; + struct emu10k1x *emu = snd_pcm_substream_chip(substream); + struct snd_pcm_runtime *runtime = substream->runtime; + struct emu10k1x_pcm *epcm = runtime->private_data; int channel = epcm->voice->number; int result = 0; @@ -519,11 +513,11 @@ static int snd_emu10k1x_pcm_trigger(snd_pcm_substream_t *substream, /* pointer callback */ static snd_pcm_uframes_t -snd_emu10k1x_pcm_pointer(snd_pcm_substream_t *substream) +snd_emu10k1x_pcm_pointer(struct snd_pcm_substream *substream) { - emu10k1x_t *emu = snd_pcm_substream_chip(substream); - snd_pcm_runtime_t *runtime = substream->runtime; - emu10k1x_pcm_t *epcm = runtime->private_data; + struct emu10k1x *emu = snd_pcm_substream_chip(substream); + struct snd_pcm_runtime *runtime = substream->runtime; + struct emu10k1x_pcm *epcm = runtime->private_data; int channel = epcm->voice->number; snd_pcm_uframes_t ptr = 0, ptr1 = 0, ptr2= 0,ptr3 = 0,ptr4 = 0; @@ -550,7 +544,7 @@ snd_emu10k1x_pcm_pointer(snd_pcm_substream_t *substream) } /* operators */ -static snd_pcm_ops_t snd_emu10k1x_playback_ops = { +static struct snd_pcm_ops snd_emu10k1x_playback_ops = { .open = snd_emu10k1x_playback_open, .close = snd_emu10k1x_playback_close, .ioctl = snd_pcm_lib_ioctl, @@ -562,11 +556,11 @@ static snd_pcm_ops_t snd_emu10k1x_playback_ops = { }; /* open_capture callback */ -static int snd_emu10k1x_pcm_open_capture(snd_pcm_substream_t *substream) +static int snd_emu10k1x_pcm_open_capture(struct snd_pcm_substream *substream) { - emu10k1x_t *chip = snd_pcm_substream_chip(substream); - emu10k1x_pcm_t *epcm; - snd_pcm_runtime_t *runtime = substream->runtime; + struct emu10k1x *chip = snd_pcm_substream_chip(substream); + struct emu10k1x_pcm *epcm; + struct snd_pcm_runtime *runtime = substream->runtime; int err; if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0) @@ -574,7 +568,7 @@ static int snd_emu10k1x_pcm_open_capture(snd_pcm_substream_t *substream) if ((err = snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 64)) < 0) return err; - epcm = kcalloc(1, sizeof(*epcm), GFP_KERNEL); + epcm = kzalloc(sizeof(*epcm), GFP_KERNEL); if (epcm == NULL) return -ENOMEM; @@ -590,17 +584,17 @@ static int snd_emu10k1x_pcm_open_capture(snd_pcm_substream_t *substream) } /* close callback */ -static int snd_emu10k1x_pcm_close_capture(snd_pcm_substream_t *substream) +static int snd_emu10k1x_pcm_close_capture(struct snd_pcm_substream *substream) { return 0; } /* hw_params callback */ -static int snd_emu10k1x_pcm_hw_params_capture(snd_pcm_substream_t *substream, - snd_pcm_hw_params_t * hw_params) +static int snd_emu10k1x_pcm_hw_params_capture(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *hw_params) { - snd_pcm_runtime_t *runtime = substream->runtime; - emu10k1x_pcm_t *epcm = runtime->private_data; + struct snd_pcm_runtime *runtime = substream->runtime; + struct emu10k1x_pcm *epcm = runtime->private_data; if (! epcm->voice) { if (epcm->emu->capture_voice.use) @@ -615,11 +609,11 @@ static int snd_emu10k1x_pcm_hw_params_capture(snd_pcm_substream_t *substream, } /* hw_free callback */ -static int snd_emu10k1x_pcm_hw_free_capture(snd_pcm_substream_t *substream) +static int snd_emu10k1x_pcm_hw_free_capture(struct snd_pcm_substream *substream) { - snd_pcm_runtime_t *runtime = substream->runtime; + struct snd_pcm_runtime *runtime = substream->runtime; - emu10k1x_pcm_t *epcm; + struct emu10k1x_pcm *epcm; if (runtime->private_data == NULL) return 0; @@ -635,10 +629,10 @@ static int snd_emu10k1x_pcm_hw_free_capture(snd_pcm_substream_t *substream) } /* prepare capture callback */ -static int snd_emu10k1x_pcm_prepare_capture(snd_pcm_substream_t *substream) +static int snd_emu10k1x_pcm_prepare_capture(struct snd_pcm_substream *substream) { - emu10k1x_t *emu = snd_pcm_substream_chip(substream); - snd_pcm_runtime_t *runtime = substream->runtime; + struct emu10k1x *emu = snd_pcm_substream_chip(substream); + struct snd_pcm_runtime *runtime = substream->runtime; snd_emu10k1x_ptr_write(emu, CAPTURE_DMA_ADDR, 0, runtime->dma_addr); snd_emu10k1x_ptr_write(emu, CAPTURE_BUFFER_SIZE, 0, frames_to_bytes(runtime, runtime->buffer_size)<<16); // buffer size in bytes @@ -649,12 +643,12 @@ static int snd_emu10k1x_pcm_prepare_capture(snd_pcm_substream_t *substream) } /* trigger_capture callback */ -static int snd_emu10k1x_pcm_trigger_capture(snd_pcm_substream_t *substream, +static int snd_emu10k1x_pcm_trigger_capture(struct snd_pcm_substream *substream, int cmd) { - emu10k1x_t *emu = snd_pcm_substream_chip(substream); - snd_pcm_runtime_t *runtime = substream->runtime; - emu10k1x_pcm_t *epcm = runtime->private_data; + struct emu10k1x *emu = snd_pcm_substream_chip(substream); + struct snd_pcm_runtime *runtime = substream->runtime; + struct emu10k1x_pcm *epcm = runtime->private_data; int result = 0; switch (cmd) { @@ -679,11 +673,11 @@ static int snd_emu10k1x_pcm_trigger_capture(snd_pcm_substream_t *substream, /* pointer_capture callback */ static snd_pcm_uframes_t -snd_emu10k1x_pcm_pointer_capture(snd_pcm_substream_t *substream) +snd_emu10k1x_pcm_pointer_capture(struct snd_pcm_substream *substream) { - emu10k1x_t *emu = snd_pcm_substream_chip(substream); - snd_pcm_runtime_t *runtime = substream->runtime; - emu10k1x_pcm_t *epcm = runtime->private_data; + struct emu10k1x *emu = snd_pcm_substream_chip(substream); + struct snd_pcm_runtime *runtime = substream->runtime; + struct emu10k1x_pcm *epcm = runtime->private_data; snd_pcm_uframes_t ptr; if (!epcm->running) @@ -696,7 +690,7 @@ snd_emu10k1x_pcm_pointer_capture(snd_pcm_substream_t *substream) return ptr; } -static snd_pcm_ops_t snd_emu10k1x_capture_ops = { +static struct snd_pcm_ops snd_emu10k1x_capture_ops = { .open = snd_emu10k1x_pcm_open_capture, .close = snd_emu10k1x_pcm_close_capture, .ioctl = snd_pcm_lib_ioctl, @@ -707,10 +701,10 @@ static snd_pcm_ops_t snd_emu10k1x_capture_ops = { .pointer = snd_emu10k1x_pcm_pointer_capture, }; -static unsigned short snd_emu10k1x_ac97_read(ac97_t *ac97, +static unsigned short snd_emu10k1x_ac97_read(struct snd_ac97 *ac97, unsigned short reg) { - emu10k1x_t *emu = ac97->private_data; + struct emu10k1x *emu = ac97->private_data; unsigned long flags; unsigned short val; @@ -721,10 +715,10 @@ static unsigned short snd_emu10k1x_ac97_read(ac97_t *ac97, return val; } -static void snd_emu10k1x_ac97_write(ac97_t *ac97, +static void snd_emu10k1x_ac97_write(struct snd_ac97 *ac97, unsigned short reg, unsigned short val) { - emu10k1x_t *emu = ac97->private_data; + struct emu10k1x *emu = ac97->private_data; unsigned long flags; spin_lock_irqsave(&emu->emu_lock, flags); @@ -733,12 +727,12 @@ static void snd_emu10k1x_ac97_write(ac97_t *ac97, spin_unlock_irqrestore(&emu->emu_lock, flags); } -static int snd_emu10k1x_ac97(emu10k1x_t *chip) +static int snd_emu10k1x_ac97(struct emu10k1x *chip) { - ac97_bus_t *pbus; - ac97_template_t ac97; + struct snd_ac97_bus *pbus; + struct snd_ac97_template ac97; int err; - static ac97_bus_ops_t ops = { + static struct snd_ac97_bus_ops ops = { .write = snd_emu10k1x_ac97_write, .read = snd_emu10k1x_ac97_read, }; @@ -753,7 +747,7 @@ static int snd_emu10k1x_ac97(emu10k1x_t *chip) return snd_ac97_mixer(pbus, &ac97, &chip->ac97); } -static int snd_emu10k1x_free(emu10k1x_t *chip) +static int snd_emu10k1x_free(struct emu10k1x *chip) { snd_emu10k1x_ptr_write(chip, TRIGGER_CHANNEL, 0, 0); // disable interrupts @@ -762,10 +756,8 @@ static int snd_emu10k1x_free(emu10k1x_t *chip) outl(HCFG_LOCKSOUNDCACHE, chip->port + HCFG); // release the i/o port - if (chip->res_port) { - release_resource(chip->res_port); - kfree_nocheck(chip->res_port); - } + release_and_free_resource(chip->res_port); + // release the irq if (chip->irq >= 0) free_irq(chip->irq, (void *)chip); @@ -782,9 +774,9 @@ static int snd_emu10k1x_free(emu10k1x_t *chip) return 0; } -static int snd_emu10k1x_dev_free(snd_device_t *device) +static int snd_emu10k1x_dev_free(struct snd_device *device) { - emu10k1x_t *chip = device->device_data; + struct emu10k1x *chip = device->device_data; return snd_emu10k1x_free(chip); } @@ -793,64 +785,56 @@ static irqreturn_t snd_emu10k1x_interrupt(int irq, void *dev_id, { unsigned int status; - emu10k1x_t *chip = dev_id; - emu10k1x_voice_t *pvoice = chip->voices; + struct emu10k1x *chip = dev_id; + struct emu10k1x_voice *pvoice = chip->voices; int i; int mask; status = inl(chip->port + IPR); - if(status) { - // capture interrupt - if(status & (IPR_CAP_0_LOOP | IPR_CAP_0_HALF_LOOP)) { - emu10k1x_voice_t *pvoice = &chip->capture_voice; - if(pvoice->use) - snd_emu10k1x_pcm_interrupt(chip, pvoice); - else - snd_emu10k1x_intr_disable(chip, - INTE_CAP_0_LOOP | - INTE_CAP_0_HALF_LOOP); - } - - mask = IPR_CH_0_LOOP|IPR_CH_0_HALF_LOOP; - for(i = 0; i < 3; i++) { - if(status & mask) { - if(pvoice->use) - snd_emu10k1x_pcm_interrupt(chip, pvoice); - else - snd_emu10k1x_intr_disable(chip, mask); - } - pvoice++; - mask <<= 1; - } + if (! status) + return IRQ_NONE; + + // capture interrupt + if (status & (IPR_CAP_0_LOOP | IPR_CAP_0_HALF_LOOP)) { + struct emu10k1x_voice *pvoice = &chip->capture_voice; + if (pvoice->use) + snd_emu10k1x_pcm_interrupt(chip, pvoice); + else + snd_emu10k1x_intr_disable(chip, + INTE_CAP_0_LOOP | + INTE_CAP_0_HALF_LOOP); + } - if (status & (IPR_MIDITRANSBUFEMPTY|IPR_MIDIRECVBUFEMPTY)) { - if (chip->midi.interrupt) - chip->midi.interrupt(chip, status); - else - snd_emu10k1x_intr_disable(chip, INTE_MIDITXENABLE|INTE_MIDIRXENABLE); + mask = IPR_CH_0_LOOP|IPR_CH_0_HALF_LOOP; + for (i = 0; i < 3; i++) { + if (status & mask) { + if (pvoice->use) + snd_emu10k1x_pcm_interrupt(chip, pvoice); + else + snd_emu10k1x_intr_disable(chip, mask); } + pvoice++; + mask <<= 1; + } - // acknowledge the interrupt if necessary - if(status) - outl(status, chip->port+IPR); - -// snd_printk(KERN_INFO "interrupt %08x\n", status); + if (status & (IPR_MIDITRANSBUFEMPTY|IPR_MIDIRECVBUFEMPTY)) { + if (chip->midi.interrupt) + chip->midi.interrupt(chip, status); + else + snd_emu10k1x_intr_disable(chip, INTE_MIDITXENABLE|INTE_MIDIRXENABLE); } + + // acknowledge the interrupt if necessary + outl(status, chip->port + IPR); + // snd_printk(KERN_INFO "interrupt %08x\n", status); return IRQ_HANDLED; } -static void snd_emu10k1x_pcm_free(snd_pcm_t *pcm) +static int __devinit snd_emu10k1x_pcm(struct emu10k1x *emu, int device, struct snd_pcm **rpcm) { - emu10k1x_t *emu = pcm->private_data; - emu->pcm = NULL; - snd_pcm_lib_preallocate_free_for_all(pcm); -} - -static int __devinit snd_emu10k1x_pcm(emu10k1x_t *emu, int device, snd_pcm_t **rpcm) -{ - snd_pcm_t *pcm; + struct snd_pcm *pcm; int err; int capture = 0; @@ -863,7 +847,6 @@ static int __devinit snd_emu10k1x_pcm(emu10k1x_t *emu, int device, snd_pcm_t **r return err; pcm->private_data = emu; - pcm->private_free = snd_emu10k1x_pcm_free; switch(device) { case 0: @@ -901,34 +884,34 @@ static int __devinit snd_emu10k1x_pcm(emu10k1x_t *emu, int device, snd_pcm_t **r return 0; } -static int __devinit snd_emu10k1x_create(snd_card_t *card, +static int __devinit snd_emu10k1x_create(struct snd_card *card, struct pci_dev *pci, - emu10k1x_t **rchip) + struct emu10k1x **rchip) { - emu10k1x_t *chip; + struct emu10k1x *chip; int err; int ch; - static snd_device_ops_t ops = { + static struct snd_device_ops ops = { .dev_free = snd_emu10k1x_dev_free, }; - + *rchip = NULL; - + if ((err = pci_enable_device(pci)) < 0) return err; - if (pci_set_dma_mask(pci, 0x0fffffff) < 0 || - pci_set_consistent_dma_mask(pci, 0x0fffffff) < 0) { + if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 || + pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) { snd_printk(KERN_ERR "error to set 28bit mask DMA\n"); pci_disable_device(pci); return -ENXIO; } - - chip = kcalloc(1, sizeof(*chip), GFP_KERNEL); + + chip = kzalloc(sizeof(*chip), GFP_KERNEL); if (chip == NULL) { pci_disable_device(pci); return -ENOMEM; } - + chip->card = card; chip->pci = pci; chip->irq = -1; @@ -945,7 +928,7 @@ static int __devinit snd_emu10k1x_create(snd_card_t *card, } if (request_irq(pci->irq, snd_emu10k1x_interrupt, - SA_INTERRUPT|SA_SHIRQ, "EMU10K1X", + IRQF_DISABLED|IRQF_SHARED, "EMU10K1X", (void *)chip)) { snd_printk(KERN_ERR "emu10k1x: cannot grab irq %d\n", pci->irq); snd_emu10k1x_free(chip); @@ -1022,10 +1005,10 @@ static int __devinit snd_emu10k1x_create(snd_card_t *card, return 0; } -static void snd_emu10k1x_proc_reg_read(snd_info_entry_t *entry, - snd_info_buffer_t * buffer) +static void snd_emu10k1x_proc_reg_read(struct snd_info_entry *entry, + struct snd_info_buffer *buffer) { - emu10k1x_t *emu = entry->private_data; + struct emu10k1x *emu = entry->private_data; unsigned long value,value1,value2; unsigned long flags; int i; @@ -1050,10 +1033,10 @@ static void snd_emu10k1x_proc_reg_read(snd_info_entry_t *entry, } } -static void snd_emu10k1x_proc_reg_write(snd_info_entry_t *entry, - snd_info_buffer_t *buffer) +static void snd_emu10k1x_proc_reg_write(struct snd_info_entry *entry, + struct snd_info_buffer *buffer) { - emu10k1x_t *emu = entry->private_data; + struct emu10k1x *emu = entry->private_data; char line[64]; unsigned int reg, channel_id , val; @@ -1067,21 +1050,21 @@ static void snd_emu10k1x_proc_reg_write(snd_info_entry_t *entry, } } -static int __devinit snd_emu10k1x_proc_init(emu10k1x_t * emu) +static int __devinit snd_emu10k1x_proc_init(struct emu10k1x * emu) { - snd_info_entry_t *entry; + struct snd_info_entry *entry; if(! snd_card_proc_new(emu->card, "emu10k1x_regs", &entry)) { - snd_info_set_text_ops(entry, emu, 1024, snd_emu10k1x_proc_reg_read); - entry->c.text.write_size = 64; + snd_info_set_text_ops(entry, emu, snd_emu10k1x_proc_reg_read); entry->c.text.write = snd_emu10k1x_proc_reg_write; + entry->mode |= S_IWUSR; entry->private_data = emu; } return 0; } -static int snd_emu10k1x_shared_spdif_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo) +static int snd_emu10k1x_shared_spdif_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) { uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; uinfo->count = 1; @@ -1090,20 +1073,20 @@ static int snd_emu10k1x_shared_spdif_info(snd_kcontrol_t *kcontrol, snd_ctl_elem return 0; } -static int snd_emu10k1x_shared_spdif_get(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) +static int snd_emu10k1x_shared_spdif_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { - emu10k1x_t *emu = snd_kcontrol_chip(kcontrol); + struct emu10k1x *emu = snd_kcontrol_chip(kcontrol); ucontrol->value.integer.value[0] = (snd_emu10k1x_ptr_read(emu, SPDIF_SELECT, 0) == 0x700) ? 0 : 1; return 0; } -static int snd_emu10k1x_shared_spdif_put(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) +static int snd_emu10k1x_shared_spdif_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { - emu10k1x_t *emu = snd_kcontrol_chip(kcontrol); + struct emu10k1x *emu = snd_kcontrol_chip(kcontrol); unsigned int val; int change = 0; @@ -1123,7 +1106,7 @@ static int snd_emu10k1x_shared_spdif_put(snd_kcontrol_t * kcontrol, return change; } -static snd_kcontrol_new_t snd_emu10k1x_shared_spdif __devinitdata = +static struct snd_kcontrol_new snd_emu10k1x_shared_spdif __devinitdata = { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = "Analog/Digital Output Jack", @@ -1132,17 +1115,17 @@ static snd_kcontrol_new_t snd_emu10k1x_shared_spdif __devinitdata = .put = snd_emu10k1x_shared_spdif_put }; -static int snd_emu10k1x_spdif_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo) +static int snd_emu10k1x_spdif_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) { uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958; uinfo->count = 1; return 0; } -static int snd_emu10k1x_spdif_get(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) +static int snd_emu10k1x_spdif_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { - emu10k1x_t *emu = snd_kcontrol_chip(kcontrol); + struct emu10k1x *emu = snd_kcontrol_chip(kcontrol); unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); ucontrol->value.iec958.status[0] = (emu->spdif_bits[idx] >> 0) & 0xff; @@ -1152,8 +1135,8 @@ static int snd_emu10k1x_spdif_get(snd_kcontrol_t * kcontrol, return 0; } -static int snd_emu10k1x_spdif_get_mask(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) +static int snd_emu10k1x_spdif_get_mask(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { ucontrol->value.iec958.status[0] = 0xff; ucontrol->value.iec958.status[1] = 0xff; @@ -1162,10 +1145,10 @@ static int snd_emu10k1x_spdif_get_mask(snd_kcontrol_t * kcontrol, return 0; } -static int snd_emu10k1x_spdif_put(snd_kcontrol_t * kcontrol, - snd_ctl_elem_value_t * ucontrol) +static int snd_emu10k1x_spdif_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { - emu10k1x_t *emu = snd_kcontrol_chip(kcontrol); + struct emu10k1x *emu = snd_kcontrol_chip(kcontrol); unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); int change; unsigned int val; @@ -1182,19 +1165,19 @@ static int snd_emu10k1x_spdif_put(snd_kcontrol_t * kcontrol, return change; } -static snd_kcontrol_new_t snd_emu10k1x_spdif_mask_control = +static struct snd_kcontrol_new snd_emu10k1x_spdif_mask_control = { .access = SNDRV_CTL_ELEM_ACCESS_READ, - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, + .iface = SNDRV_CTL_ELEM_IFACE_PCM, .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,MASK), .count = 3, .info = snd_emu10k1x_spdif_info, .get = snd_emu10k1x_spdif_get_mask }; -static snd_kcontrol_new_t snd_emu10k1x_spdif_control = +static struct snd_kcontrol_new snd_emu10k1x_spdif_control = { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, + .iface = SNDRV_CTL_ELEM_IFACE_PCM, .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT), .count = 3, .info = snd_emu10k1x_spdif_info, @@ -1202,11 +1185,11 @@ static snd_kcontrol_new_t snd_emu10k1x_spdif_control = .put = snd_emu10k1x_spdif_put }; -static int __devinit snd_emu10k1x_mixer(emu10k1x_t *emu) +static int __devinit snd_emu10k1x_mixer(struct emu10k1x *emu) { int err; - snd_kcontrol_t *kctl; - snd_card_t *card = emu->card; + struct snd_kcontrol *kctl; + struct snd_card *card = emu->card; if ((kctl = snd_ctl_new1(&snd_emu10k1x_spdif_mask_control, emu)) == NULL) return -ENOMEM; @@ -1227,12 +1210,12 @@ static int __devinit snd_emu10k1x_mixer(emu10k1x_t *emu) #define EMU10K1X_MIDI_MODE_INPUT (1<<0) #define EMU10K1X_MIDI_MODE_OUTPUT (1<<1) -static inline unsigned char mpu401_read(emu10k1x_t *emu, emu10k1x_midi_t *mpu, int idx) +static inline unsigned char mpu401_read(struct emu10k1x *emu, struct emu10k1x_midi *mpu, int idx) { return (unsigned char)snd_emu10k1x_ptr_read(emu, mpu->port + idx, 0); } -static inline void mpu401_write(emu10k1x_t *emu, emu10k1x_midi_t *mpu, int data, int idx) +static inline void mpu401_write(struct emu10k1x *emu, struct emu10k1x_midi *mpu, int data, int idx) { snd_emu10k1x_ptr_write(emu, mpu->port + idx, 0, data); } @@ -1249,7 +1232,7 @@ static inline void mpu401_write(emu10k1x_t *emu, emu10k1x_midi_t *mpu, int data, #define MPU401_ENTER_UART 0x3f #define MPU401_ACK 0xfe -static void mpu401_clear_rx(emu10k1x_t *emu, emu10k1x_midi_t *mpu) +static void mpu401_clear_rx(struct emu10k1x *emu, struct emu10k1x_midi *mpu) { int timeout = 100000; for (; timeout > 0 && mpu401_input_avail(emu, mpu); timeout--) @@ -1264,7 +1247,8 @@ static void mpu401_clear_rx(emu10k1x_t *emu, emu10k1x_midi_t *mpu) */ -static void do_emu10k1x_midi_interrupt(emu10k1x_t *emu, emu10k1x_midi_t *midi, unsigned int status) +static void do_emu10k1x_midi_interrupt(struct emu10k1x *emu, + struct emu10k1x_midi *midi, unsigned int status) { unsigned char byte; @@ -1297,12 +1281,13 @@ static void do_emu10k1x_midi_interrupt(emu10k1x_t *emu, emu10k1x_midi_t *midi, u spin_unlock(&midi->output_lock); } -static void snd_emu10k1x_midi_interrupt(emu10k1x_t *emu, unsigned int status) +static void snd_emu10k1x_midi_interrupt(struct emu10k1x *emu, unsigned int status) { do_emu10k1x_midi_interrupt(emu, &emu->midi, status); } -static void snd_emu10k1x_midi_cmd(emu10k1x_t * emu, emu10k1x_midi_t *midi, unsigned char cmd, int ack) +static int snd_emu10k1x_midi_cmd(struct emu10k1x * emu, + struct emu10k1x_midi *midi, unsigned char cmd, int ack) { unsigned long flags; int timeout, ok; @@ -1327,17 +1312,20 @@ static void snd_emu10k1x_midi_cmd(emu10k1x_t * emu, emu10k1x_midi_t *midi, unsig ok = 1; } spin_unlock_irqrestore(&midi->input_lock, flags); - if (!ok) + if (!ok) { snd_printk(KERN_ERR "midi_cmd: 0x%x failed at 0x%lx (status = 0x%x, data = 0x%x)!!!\n", cmd, emu->port, mpu401_read_stat(emu, midi), mpu401_read_data(emu, midi)); + return 1; + } + return 0; } -static int snd_emu10k1x_midi_input_open(snd_rawmidi_substream_t * substream) +static int snd_emu10k1x_midi_input_open(struct snd_rawmidi_substream *substream) { - emu10k1x_t *emu; - emu10k1x_midi_t *midi = (emu10k1x_midi_t *)substream->rmidi->private_data; + struct emu10k1x *emu; + struct emu10k1x_midi *midi = substream->rmidi->private_data; unsigned long flags; emu = midi->emu; @@ -1347,18 +1335,23 @@ static int snd_emu10k1x_midi_input_open(snd_rawmidi_substream_t * substream) midi->substream_input = substream; if (!(midi->midi_mode & EMU10K1X_MIDI_MODE_OUTPUT)) { spin_unlock_irqrestore(&midi->open_lock, flags); - snd_emu10k1x_midi_cmd(emu, midi, MPU401_RESET, 1); - snd_emu10k1x_midi_cmd(emu, midi, MPU401_ENTER_UART, 1); + if (snd_emu10k1x_midi_cmd(emu, midi, MPU401_RESET, 1)) + goto error_out; + if (snd_emu10k1x_midi_cmd(emu, midi, MPU401_ENTER_UART, 1)) + goto error_out; } else { spin_unlock_irqrestore(&midi->open_lock, flags); } return 0; + +error_out: + return -EIO; } -static int snd_emu10k1x_midi_output_open(snd_rawmidi_substream_t * substream) +static int snd_emu10k1x_midi_output_open(struct snd_rawmidi_substream *substream) { - emu10k1x_t *emu; - emu10k1x_midi_t *midi = (emu10k1x_midi_t *)substream->rmidi->private_data; + struct emu10k1x *emu; + struct emu10k1x_midi *midi = substream->rmidi->private_data; unsigned long flags; emu = midi->emu; @@ -1368,19 +1361,25 @@ static int snd_emu10k1x_midi_output_open(snd_rawmidi_substream_t * substream) midi->substream_output = substream; if (!(midi->midi_mode & EMU10K1X_MIDI_MODE_INPUT)) { spin_unlock_irqrestore(&midi->open_lock, flags); - snd_emu10k1x_midi_cmd(emu, midi, MPU401_RESET, 1); - snd_emu10k1x_midi_cmd(emu, midi, MPU401_ENTER_UART, 1); + if (snd_emu10k1x_midi_cmd(emu, midi, MPU401_RESET, 1)) + goto error_out; + if (snd_emu10k1x_midi_cmd(emu, midi, MPU401_ENTER_UART, 1)) + goto error_out; } else { spin_unlock_irqrestore(&midi->open_lock, flags); } return 0; + +error_out: + return -EIO; } -static int snd_emu10k1x_midi_input_close(snd_rawmidi_substream_t * substream) +static int snd_emu10k1x_midi_input_close(struct snd_rawmidi_substream *substream) { - emu10k1x_t *emu; - emu10k1x_midi_t *midi = (emu10k1x_midi_t *)substream->rmidi->private_data; + struct emu10k1x *emu; + struct emu10k1x_midi *midi = substream->rmidi->private_data; unsigned long flags; + int err = 0; emu = midi->emu; snd_assert(emu, return -ENXIO); @@ -1390,18 +1389,19 @@ static int snd_emu10k1x_midi_input_close(snd_rawmidi_substream_t * substream) midi->substream_input = NULL; if (!(midi->midi_mode & EMU10K1X_MIDI_MODE_OUTPUT)) { spin_unlock_irqrestore(&midi->open_lock, flags); - snd_emu10k1x_midi_cmd(emu, midi, MPU401_RESET, 0); + err = snd_emu10k1x_midi_cmd(emu, midi, MPU401_RESET, 0); } else { spin_unlock_irqrestore(&midi->open_lock, flags); } - return 0; + return err; } -static int snd_emu10k1x_midi_output_close(snd_rawmidi_substream_t * substream) +static int snd_emu10k1x_midi_output_close(struct snd_rawmidi_substream *substream) { - emu10k1x_t *emu; - emu10k1x_midi_t *midi = (emu10k1x_midi_t *)substream->rmidi->private_data; + struct emu10k1x *emu; + struct emu10k1x_midi *midi = substream->rmidi->private_data; unsigned long flags; + int err = 0; emu = midi->emu; snd_assert(emu, return -ENXIO); @@ -1411,17 +1411,17 @@ static int snd_emu10k1x_midi_output_close(snd_rawmidi_substream_t * substream) midi->substream_output = NULL; if (!(midi->midi_mode & EMU10K1X_MIDI_MODE_INPUT)) { spin_unlock_irqrestore(&midi->open_lock, flags); - snd_emu10k1x_midi_cmd(emu, midi, MPU401_RESET, 0); + err = snd_emu10k1x_midi_cmd(emu, midi, MPU401_RESET, 0); } else { spin_unlock_irqrestore(&midi->open_lock, flags); } - return 0; + return err; } -static void snd_emu10k1x_midi_input_trigger(snd_rawmidi_substream_t * substream, int up) +static void snd_emu10k1x_midi_input_trigger(struct snd_rawmidi_substream *substream, int up) { - emu10k1x_t *emu; - emu10k1x_midi_t *midi = (emu10k1x_midi_t *)substream->rmidi->private_data; + struct emu10k1x *emu; + struct emu10k1x_midi *midi = substream->rmidi->private_data; emu = midi->emu; snd_assert(emu, return); @@ -1431,10 +1431,10 @@ static void snd_emu10k1x_midi_input_trigger(snd_rawmidi_substream_t * substream, snd_emu10k1x_intr_disable(emu, midi->rx_enable); } -static void snd_emu10k1x_midi_output_trigger(snd_rawmidi_substream_t * substream, int up) +static void snd_emu10k1x_midi_output_trigger(struct snd_rawmidi_substream *substream, int up) { - emu10k1x_t *emu; - emu10k1x_midi_t *midi = (emu10k1x_midi_t *)substream->rmidi->private_data; + struct emu10k1x *emu; + struct emu10k1x_midi *midi = substream->rmidi->private_data; unsigned long flags; emu = midi->emu; @@ -1471,30 +1471,31 @@ static void snd_emu10k1x_midi_output_trigger(snd_rawmidi_substream_t * substream */ -static snd_rawmidi_ops_t snd_emu10k1x_midi_output = +static struct snd_rawmidi_ops snd_emu10k1x_midi_output = { .open = snd_emu10k1x_midi_output_open, .close = snd_emu10k1x_midi_output_close, .trigger = snd_emu10k1x_midi_output_trigger, }; -static snd_rawmidi_ops_t snd_emu10k1x_midi_input = +static struct snd_rawmidi_ops snd_emu10k1x_midi_input = { .open = snd_emu10k1x_midi_input_open, .close = snd_emu10k1x_midi_input_close, .trigger = snd_emu10k1x_midi_input_trigger, }; -static void snd_emu10k1x_midi_free(snd_rawmidi_t *rmidi) +static void snd_emu10k1x_midi_free(struct snd_rawmidi *rmidi) { - emu10k1x_midi_t *midi = (emu10k1x_midi_t *)rmidi->private_data; + struct emu10k1x_midi *midi = rmidi->private_data; midi->interrupt = NULL; midi->rmidi = NULL; } -static int __devinit emu10k1x_midi_init(emu10k1x_t *emu, emu10k1x_midi_t *midi, int device, char *name) +static int __devinit emu10k1x_midi_init(struct emu10k1x *emu, + struct emu10k1x_midi *midi, int device, char *name) { - snd_rawmidi_t *rmidi; + struct snd_rawmidi *rmidi; int err; if ((err = snd_rawmidi_new(emu->card, name, device, 1, 1, &rmidi)) < 0) @@ -1515,9 +1516,9 @@ static int __devinit emu10k1x_midi_init(emu10k1x_t *emu, emu10k1x_midi_t *midi, return 0; } -static int __devinit snd_emu10k1x_midi(emu10k1x_t *emu) +static int __devinit snd_emu10k1x_midi(struct emu10k1x *emu) { - emu10k1x_midi_t *midi = &emu->midi; + struct emu10k1x_midi *midi = &emu->midi; int err; if ((err = emu10k1x_midi_init(emu, midi, 0, "EMU10K1X MPU-401 (UART)")) < 0) @@ -1536,8 +1537,8 @@ static int __devinit snd_emu10k1x_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) { static int dev; - snd_card_t *card; - emu10k1x_t *chip; + struct snd_card *card; + struct emu10k1x *chip; int err; if (dev >= SNDRV_CARDS) @@ -1627,7 +1628,7 @@ static int __init alsa_card_emu10k1x_init(void) { int err; - if ((err = pci_module_init(&driver)) > 0) + if ((err = pci_register_driver(&driver)) > 0) return err; return 0; diff --git a/sound/pci/emu10k1/emumixer.c b/sound/pci/emu10k1/emumixer.c index 2a9d12d10..c31f3d087 100644 --- a/sound/pci/emu10k1/emumixer.c +++ b/sound/pci/emu10k1/emumixer.c @@ -777,6 +777,8 @@ int __devinit snd_emu10k1_mixer(struct snd_emu10k1 *emu, }; static char *audigy_remove_ctls[] = { /* Master/PCM controls on ac97 of Audigy has no effect */ + /* On the Audigy2 the AC97 playback is piped into + * the Philips ADC for 24bit capture */ "PCM Playback Switch", "PCM Playback Volume", "Master Mono Playback Switch", @@ -804,6 +806,47 @@ int __devinit snd_emu10k1_mixer(struct snd_emu10k1 *emu, "AMic Playback Volume", "Mic Playback Volume", NULL }; + static char *audigy_remove_ctls_1361t_adc[] = { + /* On the Audigy2 the AC97 playback is piped into + * the Philips ADC for 24bit capture */ + "PCM Playback Switch", + "PCM Playback Volume", + "Master Mono Playback Switch", + "Master Mono Playback Volume", + "Capture Source", + "Capture Switch", + "Capture Volume", + "Mic Capture Volume", + "Headphone Playback Switch", + "Headphone Playback Volume", + "3D Control - Center", + "3D Control - Depth", + "3D Control - Switch", + "Line2 Playback Volume", + "Line2 Capture Volume", + NULL + }; + static char *audigy_rename_ctls_1361t_adc[] = { + "Master Playback Switch", "Master Capture Switch", + "Master Playback Volume", "Master Capture Volume", + "Wave Master Playback Volume", "Master Playback Volume", + "PC Speaker Playback Switch", "PC Speaker Capture Switch", + "PC Speaker Playback Volume", "PC Speaker Capture Volume", + "Phone Playback Switch", "Phone Capture Switch", + "Phone Playback Volume", "Phone Capture Volume", + "Mic Playback Switch", "Mic Capture Switch", + "Mic Playback Volume", "Mic Capture Volume", + "Line Playback Switch", "Line Capture Switch", + "Line Playback Volume", "Line Capture Volume", + "CD Playback Switch", "CD Capture Switch", + "CD Playback Volume", "CD Capture Volume", + "Aux Playback Switch", "Aux Capture Switch", + "Aux Playback Volume", "Aux Capture Volume", + "Video Playback Switch", "Video Capture Switch", + "Video Playback Volume", "Video Capture Volume", + + NULL + }; if (emu->card_capabilities->ac97_chip) { struct snd_ac97_bus *pbus; @@ -834,7 +877,10 @@ int __devinit snd_emu10k1_mixer(struct snd_emu10k1 *emu, snd_ac97_write_cache(emu->ac97, AC97_MASTER, 0x0000); /* set capture source to mic */ snd_ac97_write_cache(emu->ac97, AC97_REC_SEL, 0x0000); - c = audigy_remove_ctls; + if (emu->card_capabilities->adc_1361t) + c = audigy_remove_ctls_1361t_adc; + else + c = audigy_remove_ctls; } else { /* * Credits for cards based on STAC9758: @@ -863,11 +909,15 @@ int __devinit snd_emu10k1_mixer(struct snd_emu10k1 *emu, } if (emu->audigy) - c = audigy_rename_ctls; + if (emu->card_capabilities->adc_1361t) + c = audigy_rename_ctls_1361t_adc; + else + c = audigy_rename_ctls; else c = emu10k1_rename_ctls; for (; *c; c += 2) rename_ctl(card, c[0], c[1]); + if (emu->card_capabilities->subsystem == 0x20071102) { /* Audigy 4 Pro */ rename_ctl(card, "Line2 Capture Volume", "Line1/Mic Capture Volume"); rename_ctl(card, "Analog Mix Capture Volume", "Line2 Capture Volume"); diff --git a/sound/pci/emu10k1/emumpu401.c b/sound/pci/emu10k1/emumpu401.c index d96eb4551..950c6bcd6 100644 --- a/sound/pci/emu10k1/emumpu401.c +++ b/sound/pci/emu10k1/emumpu401.c @@ -116,7 +116,7 @@ static void snd_emu10k1_midi_interrupt2(struct snd_emu10k1 *emu, unsigned int st do_emu10k1_midi_interrupt(emu, &emu->midi2, status); } -static void snd_emu10k1_midi_cmd(struct snd_emu10k1 * emu, struct snd_emu10k1_midi *midi, unsigned char cmd, int ack) +static int snd_emu10k1_midi_cmd(struct snd_emu10k1 * emu, struct snd_emu10k1_midi *midi, unsigned char cmd, int ack) { unsigned long flags; int timeout, ok; @@ -141,11 +141,14 @@ static void snd_emu10k1_midi_cmd(struct snd_emu10k1 * emu, struct snd_emu10k1_mi ok = 1; } spin_unlock_irqrestore(&midi->input_lock, flags); - if (!ok) + if (!ok) { snd_printk(KERN_ERR "midi_cmd: 0x%x failed at 0x%lx (status = 0x%x, data = 0x%x)!!!\n", cmd, emu->port, mpu401_read_stat(emu, midi), mpu401_read_data(emu, midi)); + return 1; + } + return 0; } static int snd_emu10k1_midi_input_open(struct snd_rawmidi_substream *substream) @@ -161,12 +164,17 @@ static int snd_emu10k1_midi_input_open(struct snd_rawmidi_substream *substream) midi->substream_input = substream; if (!(midi->midi_mode & EMU10K1_MIDI_MODE_OUTPUT)) { spin_unlock_irqrestore(&midi->open_lock, flags); - snd_emu10k1_midi_cmd(emu, midi, MPU401_RESET, 1); - snd_emu10k1_midi_cmd(emu, midi, MPU401_ENTER_UART, 1); + if (snd_emu10k1_midi_cmd(emu, midi, MPU401_RESET, 1)) + goto error_out; + if (snd_emu10k1_midi_cmd(emu, midi, MPU401_ENTER_UART, 1)) + goto error_out; } else { spin_unlock_irqrestore(&midi->open_lock, flags); } return 0; + +error_out: + return -EIO; } static int snd_emu10k1_midi_output_open(struct snd_rawmidi_substream *substream) @@ -182,12 +190,17 @@ static int snd_emu10k1_midi_output_open(struct snd_rawmidi_substream *substream) midi->substream_output = substream; if (!(midi->midi_mode & EMU10K1_MIDI_MODE_INPUT)) { spin_unlock_irqrestore(&midi->open_lock, flags); - snd_emu10k1_midi_cmd(emu, midi, MPU401_RESET, 1); - snd_emu10k1_midi_cmd(emu, midi, MPU401_ENTER_UART, 1); + if (snd_emu10k1_midi_cmd(emu, midi, MPU401_RESET, 1)) + goto error_out; + if (snd_emu10k1_midi_cmd(emu, midi, MPU401_ENTER_UART, 1)) + goto error_out; } else { spin_unlock_irqrestore(&midi->open_lock, flags); } return 0; + +error_out: + return -EIO; } static int snd_emu10k1_midi_input_close(struct snd_rawmidi_substream *substream) @@ -195,6 +208,7 @@ static int snd_emu10k1_midi_input_close(struct snd_rawmidi_substream *substream) struct snd_emu10k1 *emu; struct snd_emu10k1_midi *midi = (struct snd_emu10k1_midi *)substream->rmidi->private_data; unsigned long flags; + int err = 0; emu = midi->emu; snd_assert(emu, return -ENXIO); @@ -204,11 +218,11 @@ static int snd_emu10k1_midi_input_close(struct snd_rawmidi_substream *substream) midi->substream_input = NULL; if (!(midi->midi_mode & EMU10K1_MIDI_MODE_OUTPUT)) { spin_unlock_irqrestore(&midi->open_lock, flags); - snd_emu10k1_midi_cmd(emu, midi, MPU401_RESET, 0); + err = snd_emu10k1_midi_cmd(emu, midi, MPU401_RESET, 0); } else { spin_unlock_irqrestore(&midi->open_lock, flags); } - return 0; + return err; } static int snd_emu10k1_midi_output_close(struct snd_rawmidi_substream *substream) @@ -216,6 +230,7 @@ static int snd_emu10k1_midi_output_close(struct snd_rawmidi_substream *substream struct snd_emu10k1 *emu; struct snd_emu10k1_midi *midi = (struct snd_emu10k1_midi *)substream->rmidi->private_data; unsigned long flags; + int err = 0; emu = midi->emu; snd_assert(emu, return -ENXIO); @@ -225,11 +240,11 @@ static int snd_emu10k1_midi_output_close(struct snd_rawmidi_substream *substream midi->substream_output = NULL; if (!(midi->midi_mode & EMU10K1_MIDI_MODE_INPUT)) { spin_unlock_irqrestore(&midi->open_lock, flags); - snd_emu10k1_midi_cmd(emu, midi, MPU401_RESET, 0); + err = snd_emu10k1_midi_cmd(emu, midi, MPU401_RESET, 0); } else { spin_unlock_irqrestore(&midi->open_lock, flags); } - return 0; + return err; } static void snd_emu10k1_midi_input_trigger(struct snd_rawmidi_substream *substream, int up) diff --git a/sound/pci/emu10k1/emuproc.c b/sound/pci/emu10k1/emuproc.c index 90f1c5270..b939e03aa 100644 --- a/sound/pci/emu10k1/emuproc.c +++ b/sound/pci/emu10k1/emuproc.c @@ -532,57 +532,51 @@ int __devinit snd_emu10k1_proc_init(struct snd_emu10k1 * emu) struct snd_info_entry *entry; #ifdef CONFIG_SND_DEBUG if (! snd_card_proc_new(emu->card, "io_regs", &entry)) { - snd_info_set_text_ops(entry, emu, 1024, snd_emu_proc_io_reg_read); - entry->c.text.write_size = 64; + snd_info_set_text_ops(entry, emu, snd_emu_proc_io_reg_read); entry->c.text.write = snd_emu_proc_io_reg_write; entry->mode |= S_IWUSR; } if (! snd_card_proc_new(emu->card, "ptr_regs00a", &entry)) { - snd_info_set_text_ops(entry, emu, 65536, snd_emu_proc_ptr_reg_read00a); - entry->c.text.write_size = 64; + snd_info_set_text_ops(entry, emu, snd_emu_proc_ptr_reg_read00a); entry->c.text.write = snd_emu_proc_ptr_reg_write00; entry->mode |= S_IWUSR; } if (! snd_card_proc_new(emu->card, "ptr_regs00b", &entry)) { - snd_info_set_text_ops(entry, emu, 65536, snd_emu_proc_ptr_reg_read00b); - entry->c.text.write_size = 64; + snd_info_set_text_ops(entry, emu, snd_emu_proc_ptr_reg_read00b); entry->c.text.write = snd_emu_proc_ptr_reg_write00; entry->mode |= S_IWUSR; } if (! snd_card_proc_new(emu->card, "ptr_regs20a", &entry)) { - snd_info_set_text_ops(entry, emu, 65536, snd_emu_proc_ptr_reg_read20a); - entry->c.text.write_size = 64; + snd_info_set_text_ops(entry, emu, snd_emu_proc_ptr_reg_read20a); entry->c.text.write = snd_emu_proc_ptr_reg_write20; entry->mode |= S_IWUSR; } if (! snd_card_proc_new(emu->card, "ptr_regs20b", &entry)) { - snd_info_set_text_ops(entry, emu, 65536, snd_emu_proc_ptr_reg_read20b); - entry->c.text.write_size = 64; + snd_info_set_text_ops(entry, emu, snd_emu_proc_ptr_reg_read20b); entry->c.text.write = snd_emu_proc_ptr_reg_write20; entry->mode |= S_IWUSR; } if (! snd_card_proc_new(emu->card, "ptr_regs20c", &entry)) { - snd_info_set_text_ops(entry, emu, 65536, snd_emu_proc_ptr_reg_read20c); - entry->c.text.write_size = 64; + snd_info_set_text_ops(entry, emu, snd_emu_proc_ptr_reg_read20c); entry->c.text.write = snd_emu_proc_ptr_reg_write20; entry->mode |= S_IWUSR; } #endif if (! snd_card_proc_new(emu->card, "emu10k1", &entry)) - snd_info_set_text_ops(entry, emu, 2048, snd_emu10k1_proc_read); + snd_info_set_text_ops(entry, emu, snd_emu10k1_proc_read); if (emu->card_capabilities->emu10k2_chip) { if (! snd_card_proc_new(emu->card, "spdif-in", &entry)) - snd_info_set_text_ops(entry, emu, 2048, snd_emu10k1_proc_spdif_read); + snd_info_set_text_ops(entry, emu, snd_emu10k1_proc_spdif_read); } if (emu->card_capabilities->ca0151_chip) { if (! snd_card_proc_new(emu->card, "capture-rates", &entry)) - snd_info_set_text_ops(entry, emu, 2048, snd_emu10k1_proc_rates_read); + snd_info_set_text_ops(entry, emu, snd_emu10k1_proc_rates_read); } if (! snd_card_proc_new(emu->card, "voices", &entry)) - snd_info_set_text_ops(entry, emu, 2048, snd_emu10k1_proc_voices_read); + snd_info_set_text_ops(entry, emu, snd_emu10k1_proc_voices_read); if (! snd_card_proc_new(emu->card, "fx8010_gpr", &entry)) { entry->content = SNDRV_INFO_CONTENT_DATA; @@ -616,7 +610,6 @@ int __devinit snd_emu10k1_proc_init(struct snd_emu10k1 * emu) entry->content = SNDRV_INFO_CONTENT_TEXT; entry->private_data = emu; entry->mode = S_IFREG | S_IRUGO /*| S_IWUSR*/; - entry->c.text.read_size = 128*1024; entry->c.text.read = snd_emu10k1_proc_acode_read; } return 0; diff --git a/sound/pci/emu10k1/io.c b/sound/pci/emu10k1/io.c index ef5304df8..029e7856c 100644 --- a/sound/pci/emu10k1/io.c +++ b/sound/pci/emu10k1/io.c @@ -62,6 +62,8 @@ unsigned int snd_emu10k1_ptr_read(struct snd_emu10k1 * emu, unsigned int reg, un } } +EXPORT_SYMBOL(snd_emu10k1_ptr_read); + void snd_emu10k1_ptr_write(struct snd_emu10k1 *emu, unsigned int reg, unsigned int chn, unsigned int data) { unsigned int regptr; @@ -92,6 +94,8 @@ void snd_emu10k1_ptr_write(struct snd_emu10k1 *emu, unsigned int reg, unsigned i } } +EXPORT_SYMBOL(snd_emu10k1_ptr_write); + unsigned int snd_emu10k1_ptr20_read(struct snd_emu10k1 * emu, unsigned int reg, unsigned int chn) diff --git a/sound/pci/emu10k1/irq.c b/sound/pci/emu10k1/irq.c index a8b31286b..1076af4c3 100644 --- a/sound/pci/emu10k1/irq.c +++ b/sound/pci/emu10k1/irq.c @@ -37,9 +37,13 @@ irqreturn_t snd_emu10k1_interrupt(int irq, void *dev_id, struct pt_regs *regs) int handled = 0; while ((status = inl(emu->port + IPR)) != 0) { - //printk("emu10k1 irq - status = 0x%x\n", status); + //snd_printk(KERN_INFO "emu10k1 irq - status = 0x%x\n", status); orig_status = status; handled = 1; + if ((status & 0xffffffff) == 0xffffffff) { + snd_printk(KERN_INFO "snd-emu10k1: Suspected sound card removal\n"); + break; + } if (status & IPR_PCIERROR) { snd_printk(KERN_ERR "interrupt: PCI error\n"); snd_emu10k1_intr_disable(emu, INTE_PCIERRORENABLE); diff --git a/sound/pci/emu10k1/memory.c b/sound/pci/emu10k1/memory.c index e7ec98649..4fcaefe5a 100644 --- a/sound/pci/emu10k1/memory.c +++ b/sound/pci/emu10k1/memory.c @@ -287,6 +287,8 @@ int snd_emu10k1_memblk_map(struct snd_emu10k1 *emu, struct snd_emu10k1_memblk *b return err; } +EXPORT_SYMBOL(snd_emu10k1_memblk_map); + /* * page allocation for DMA */ @@ -387,6 +389,7 @@ snd_emu10k1_synth_alloc(struct snd_emu10k1 *hw, unsigned int size) return (struct snd_util_memblk *)blk; } +EXPORT_SYMBOL(snd_emu10k1_synth_alloc); /* * free a synth sample area @@ -409,6 +412,7 @@ snd_emu10k1_synth_free(struct snd_emu10k1 *emu, struct snd_util_memblk *memblk) return 0; } +EXPORT_SYMBOL(snd_emu10k1_synth_free); /* check new allocation range */ static void get_single_page_range(struct snd_util_memhdr *hdr, @@ -540,6 +544,8 @@ int snd_emu10k1_synth_bzero(struct snd_emu10k1 *emu, struct snd_util_memblk *blk return 0; } +EXPORT_SYMBOL(snd_emu10k1_synth_bzero); + /* * copy_from_user(blk + offset, data, size) */ @@ -568,3 +574,5 @@ int snd_emu10k1_synth_copy_from_user(struct snd_emu10k1 *emu, struct snd_util_me } while (offset < end_offset); return 0; } + +EXPORT_SYMBOL(snd_emu10k1_synth_copy_from_user); diff --git a/sound/pci/emu10k1/tina2.h b/sound/pci/emu10k1/tina2.h index 5c43abf03..f2d8eb6c8 100644 --- a/sound/pci/emu10k1/tina2.h +++ b/sound/pci/emu10k1/tina2.h @@ -1,11 +1,7 @@ /* * Copyright (c) by James Courtier-Dutton - * Driver p16v chips - * Version: 0.21 - * - * - * This code was initally based on code from ALSA's emu10k1x.c which is: - * Copyright (c) by Francisco Moraes + * Driver tina2 chips + * Version: 0.1 * * 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/sound/pci/emu10k1/voice.c b/sound/pci/emu10k1/voice.c index 56ffb7dc3..94eca82dd 100644 --- a/sound/pci/emu10k1/voice.c +++ b/sound/pci/emu10k1/voice.c @@ -139,6 +139,8 @@ int snd_emu10k1_voice_alloc(struct snd_emu10k1 *emu, int type, int number, return result; } +EXPORT_SYMBOL(snd_emu10k1_voice_alloc); + int snd_emu10k1_voice_free(struct snd_emu10k1 *emu, struct snd_emu10k1_voice *pvoice) { @@ -153,3 +155,5 @@ int snd_emu10k1_voice_free(struct snd_emu10k1 *emu, spin_unlock_irqrestore(&emu->voice_lock, flags); return 0; } + +EXPORT_SYMBOL(snd_emu10k1_voice_free); diff --git a/sound/pci/ens1370.c b/sound/pci/ens1370.c index ca9e34e88..a8a601fc7 100644 --- a/sound/pci/ens1370.c +++ b/sound/pci/ens1370.c @@ -446,7 +446,7 @@ struct ensoniq { static irqreturn_t snd_audiopci_interrupt(int irq, void *dev_id, struct pt_regs *regs); -static struct pci_device_id snd_audiopci_ids[] __devinitdata = { +static struct pci_device_id snd_audiopci_ids[] = { #ifdef CHIP1370 { 0x1274, 0x5000, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* ES1370 */ #endif @@ -1915,7 +1915,7 @@ static void __devinit snd_ensoniq_proc_init(struct ensoniq * ensoniq) struct snd_info_entry *entry; if (! snd_card_proc_new(ensoniq->card, "audiopci", &entry)) - snd_info_set_text_ops(entry, ensoniq, 1024, snd_ensoniq_proc_read); + snd_info_set_text_ops(entry, ensoniq, snd_ensoniq_proc_read); } /* @@ -2135,7 +2135,7 @@ static int __devinit snd_ensoniq_create(struct snd_card *card, return err; } ensoniq->port = pci_resource_start(pci, 0); - if (request_irq(pci->irq, snd_audiopci_interrupt, SA_INTERRUPT|SA_SHIRQ, + if (request_irq(pci->irq, snd_audiopci_interrupt, IRQF_DISABLED|IRQF_SHARED, "Ensoniq AudioPCI", ensoniq)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_ensoniq_free(ensoniq); diff --git a/sound/pci/es1938.c b/sound/pci/es1938.c index 6f9094ca4..cc0f34f68 100644 --- a/sound/pci/es1938.c +++ b/sound/pci/es1938.c @@ -242,7 +242,7 @@ struct es1938 { static irqreturn_t snd_es1938_interrupt(int irq, void *dev_id, struct pt_regs *regs); -static struct pci_device_id snd_es1938_ids[] __devinitdata = { +static struct pci_device_id snd_es1938_ids[] = { { 0x125d, 0x1969, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* Solo-1 */ { 0, } }; @@ -1429,7 +1429,7 @@ static int es1938_resume(struct pci_dev *pci) pci_restore_state(pci); pci_enable_device(pci); request_irq(pci->irq, snd_es1938_interrupt, - SA_INTERRUPT|SA_SHIRQ, "ES1938", chip); + IRQF_DISABLED|IRQF_SHARED, "ES1938", chip); chip->irq = pci->irq; snd_es1938_chip_init(chip); @@ -1544,7 +1544,7 @@ static int __devinit snd_es1938_create(struct snd_card *card, chip->vc_port = pci_resource_start(pci, 2); chip->mpu_port = pci_resource_start(pci, 3); chip->game_port = pci_resource_start(pci, 4); - if (request_irq(pci->irq, snd_es1938_interrupt, SA_INTERRUPT|SA_SHIRQ, + if (request_irq(pci->irq, snd_es1938_interrupt, IRQF_DISABLED|IRQF_SHARED, "ES1938", chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_es1938_free(chip); @@ -1756,7 +1756,8 @@ static int __devinit snd_es1938_probe(struct pci_dev *pci, } } if (snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401, - chip->mpu_port, 1, chip->irq, 0, &chip->rmidi) < 0) { + chip->mpu_port, MPU401_INFO_INTEGRATED, + chip->irq, 0, &chip->rmidi) < 0) { printk(KERN_ERR "es1938: unable to initialize MPU-401\n"); } else { // this line is vital for MIDI interrupt handling on ess-solo1 diff --git a/sound/pci/es1968.c b/sound/pci/es1968.c index 5ff4175c7..3c5ab7c2e 100644 --- a/sound/pci/es1968.c +++ b/sound/pci/es1968.c @@ -132,7 +132,7 @@ static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card * static int total_bufsize[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1024 }; static int pcm_substreams_p[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 4 }; static int pcm_substreams_c[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1 }; -static int clock[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; +static int clock[SNDRV_CARDS]; static int use_pm[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 2}; static int enable_mpu[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 2}; #ifdef SUPPORT_JOYSTICK @@ -592,7 +592,7 @@ struct es1968 { static irqreturn_t snd_es1968_interrupt(int irq, void *dev_id, struct pt_regs *regs); -static struct pci_device_id snd_es1968_ids[] __devinitdata = { +static struct pci_device_id snd_es1968_ids[] = { /* Maestro 1 */ { 0x1285, 0x0100, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_MULTIMEDIA_AUDIO << 8, 0xffff00, TYPE_MAESTRO }, /* Maestro 2 */ @@ -2597,7 +2597,7 @@ static int __devinit snd_es1968_create(struct snd_card *card, return err; } chip->io_port = pci_resource_start(pci, 0); - if (request_irq(pci->irq, snd_es1968_interrupt, SA_INTERRUPT|SA_SHIRQ, + if (request_irq(pci->irq, snd_es1968_interrupt, IRQF_DISABLED|IRQF_SHARED, "ESS Maestro", (void*)chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_es1968_free(chip); @@ -2727,7 +2727,8 @@ static int __devinit snd_es1968_probe(struct pci_dev *pci, } if (enable_mpu[dev]) { if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401, - chip->io_port + ESM_MPU401_PORT, 1, + chip->io_port + ESM_MPU401_PORT, + MPU401_INFO_INTEGRATED, chip->irq, 0, &chip->rmidi)) < 0) { printk(KERN_WARNING "es1968: skipping MPU-401 MIDI support..\n"); } diff --git a/sound/pci/fm801.c b/sound/pci/fm801.c index 09a2885ca..13868c985 100644 --- a/sound/pci/fm801.c +++ b/sound/pci/fm801.c @@ -56,7 +56,7 @@ static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card * * 3 = MediaForte 64-PCR * High 16-bits are video (radio) device number + 1 */ -static int tea575x_tuner[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 0 }; +static int tea575x_tuner[SNDRV_CARDS]; module_param_array(index, int, NULL, 0444); MODULE_PARM_DESC(index, "Index value for the FM801 soundcard."); @@ -199,7 +199,7 @@ struct fm801 { #endif }; -static struct pci_device_id snd_fm801_ids[] __devinitdata = { +static struct pci_device_id snd_fm801_ids[] = { { 0x1319, 0x0801, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_MULTIMEDIA_AUDIO << 8, 0xffff00, 0, }, /* FM801 */ { 0x5213, 0x0510, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_MULTIMEDIA_AUDIO << 8, 0xffff00, 0, }, /* Gallant Odyssey Sound 4 */ { 0, } @@ -1371,7 +1371,7 @@ static int __devinit snd_fm801_create(struct snd_card *card, return err; } chip->port = pci_resource_start(pci, 0); - if (request_irq(pci->irq, snd_fm801_interrupt, SA_INTERRUPT|SA_SHIRQ, + if (request_irq(pci->irq, snd_fm801_interrupt, IRQF_DISABLED|IRQF_SHARED, "FM801", chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", chip->irq); snd_fm801_free(chip); @@ -1448,7 +1448,8 @@ static int __devinit snd_card_fm801_probe(struct pci_dev *pci, return err; } if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_FM801, - FM801_REG(chip, MPU401_DATA), 1, + FM801_REG(chip, MPU401_DATA), + MPU401_INFO_INTEGRATED, chip->irq, 0, &chip->rmidi)) < 0) { snd_card_free(card); return err; diff --git a/sound/pci/hda/Makefile b/sound/pci/hda/Makefile index 570a59d33..dbacba617 100644 --- a/sound/pci/hda/Makefile +++ b/sound/pci/hda/Makefile @@ -1,5 +1,5 @@ snd-hda-intel-objs := hda_intel.o -snd-hda-codec-objs := hda_codec.o hda_generic.o patch_realtek.o patch_cmedia.o patch_analog.o +snd-hda-codec-objs := hda_codec.o hda_generic.o patch_realtek.o patch_cmedia.o patch_analog.o patch_sigmatel.o patch_si3054.o patch_atihdmi.o ifdef CONFIG_PROC_FS snd-hda-codec-objs += hda_proc.o endif diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 9ed117ac0..23201f3ee 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include "hda_codec.h" #include @@ -49,8 +50,10 @@ struct hda_vendor_id { /* codec vendor labels */ static struct hda_vendor_id hda_vendor_ids[] = { { 0x10ec, "Realtek" }, + { 0x11d4, "Analog Devices" }, { 0x13f6, "C-Media" }, { 0x434d, "C-Media" }, + { 0x8384, "SigmaTel" }, {} /* terminator */ }; @@ -74,15 +77,17 @@ unsigned int snd_hda_codec_read(struct hda_codec *codec, hda_nid_t nid, int dire unsigned int verb, unsigned int parm) { unsigned int res; - down(&codec->bus->cmd_mutex); + mutex_lock(&codec->bus->cmd_mutex); if (! codec->bus->ops.command(codec, nid, direct, verb, parm)) res = codec->bus->ops.get_response(codec); else res = (unsigned int)-1; - up(&codec->bus->cmd_mutex); + mutex_unlock(&codec->bus->cmd_mutex); return res; } +EXPORT_SYMBOL(snd_hda_codec_read); + /** * snd_hda_codec_write - send a single command without waiting for response * @codec: the HDA codec @@ -99,12 +104,14 @@ int snd_hda_codec_write(struct hda_codec *codec, hda_nid_t nid, int direct, unsigned int verb, unsigned int parm) { int err; - down(&codec->bus->cmd_mutex); + mutex_lock(&codec->bus->cmd_mutex); err = codec->bus->ops.command(codec, nid, direct, verb, parm); - up(&codec->bus->cmd_mutex); + mutex_unlock(&codec->bus->cmd_mutex); return err; } +EXPORT_SYMBOL(snd_hda_codec_write); + /** * snd_hda_sequence_write - sequence writes * @codec: the HDA codec @@ -119,6 +126,8 @@ void snd_hda_sequence_write(struct hda_codec *codec, const struct hda_verb *seq) snd_hda_codec_write(codec, seq->nid, 0, seq->verb, seq->param); } +EXPORT_SYMBOL(snd_hda_sequence_write); + /** * snd_hda_get_sub_nodes - get the range of sub nodes * @codec: the HDA codec @@ -137,6 +146,8 @@ int snd_hda_get_sub_nodes(struct hda_codec *codec, hda_nid_t nid, hda_nid_t *sta return (int)(parm & 0x7fff); } +EXPORT_SYMBOL(snd_hda_get_sub_nodes); + /** * snd_hda_get_connections - get connection list * @codec: the HDA codec @@ -153,8 +164,9 @@ int snd_hda_get_connections(struct hda_codec *codec, hda_nid_t nid, hda_nid_t *conn_list, int max_conns) { unsigned int parm; - int i, j, conn_len, num_tupples, conns; + int i, conn_len, conns; unsigned int shift, num_elems, mask; + hda_nid_t prev_nid; snd_assert(conn_list && max_conns > 0, return -EINVAL); @@ -169,7 +181,6 @@ int snd_hda_get_connections(struct hda_codec *codec, hda_nid_t nid, num_elems = 4; } conn_len = parm & AC_CLIST_LENGTH; - num_tupples = num_elems / 2; mask = (1 << (shift-1)) - 1; if (! conn_len) @@ -184,40 +195,38 @@ int snd_hda_get_connections(struct hda_codec *codec, hda_nid_t nid, /* multi connection */ conns = 0; - for (i = 0; i < conn_len; i += num_elems) { - parm = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_LIST, i); - for (j = 0; j < num_tupples; j++) { - int range_val; - hda_nid_t val1, val2, n; - range_val = parm & (1 << (shift-1)); /* ranges */ - val1 = parm & mask; - parm >>= shift; - val2 = parm & mask; - parm >>= shift; - if (range_val) { - /* ranges between val1 and val2 */ - if (val1 > val2) { - snd_printk(KERN_WARNING "hda_codec: invalid dep_range_val %x:%x\n", val1, val2); - continue; - } - for (n = val1; n <= val2; n++) { - if (conns >= max_conns) - return -EINVAL; - conn_list[conns++] = n; - } - } else { - if (! val1) - break; - if (conns >= max_conns) - return -EINVAL; - conn_list[conns++] = val1; - if (! val2) - break; - if (conns >= max_conns) + prev_nid = 0; + for (i = 0; i < conn_len; i++) { + int range_val; + hda_nid_t val, n; + + if (i % num_elems == 0) + parm = snd_hda_codec_read(codec, nid, 0, + AC_VERB_GET_CONNECT_LIST, i); + range_val = !! (parm & (1 << (shift-1))); /* ranges */ + val = parm & mask; + parm >>= shift; + if (range_val) { + /* ranges between the previous and this one */ + if (! prev_nid || prev_nid >= val) { + snd_printk(KERN_WARNING "hda_codec: invalid dep_range_val %x:%x\n", prev_nid, val); + continue; + } + for (n = prev_nid + 1; n <= val; n++) { + if (conns >= max_conns) { + snd_printk(KERN_ERR "Too many connections\n"); return -EINVAL; - conn_list[conns++] = val2; + } + conn_list[conns++] = n; + } + } else { + if (conns >= max_conns) { + snd_printk(KERN_ERR "Too many connections\n"); + return -EINVAL; } + conn_list[conns++] = val; } + prev_nid = val; } return conns; } @@ -255,6 +264,8 @@ int snd_hda_queue_unsol_event(struct hda_bus *bus, u32 res, u32 res_ex) return 0; } +EXPORT_SYMBOL(snd_hda_queue_unsol_event); + /* * process queueud unsolicited events */ @@ -286,12 +297,15 @@ static int init_unsol_queue(struct hda_bus *bus) { struct hda_bus_unsolicited *unsol; - unsol = kcalloc(1, sizeof(*unsol), GFP_KERNEL); + if (bus->unsol) /* already initialized */ + return 0; + + unsol = kzalloc(sizeof(*unsol), GFP_KERNEL); if (! unsol) { snd_printk(KERN_ERR "hda_codec: can't allocate unsolicited queue\n"); return -ENOMEM; } - unsol->workq = create_workqueue("hda_codec"); + unsol->workq = create_singlethread_workqueue("hda_codec"); if (! unsol->workq) { snd_printk(KERN_ERR "hda_codec: can't create workqueue\n"); kfree(unsol); @@ -327,7 +341,7 @@ static int snd_hda_bus_free(struct hda_bus *bus) return 0; } -static int snd_hda_bus_dev_free(snd_device_t *device) +static int snd_hda_bus_dev_free(struct snd_device *device) { struct hda_bus *bus = device->device_data; return snd_hda_bus_free(bus); @@ -341,12 +355,12 @@ static int snd_hda_bus_dev_free(snd_device_t *device) * * Returns 0 if successful, or a negative error code. */ -int snd_hda_bus_new(snd_card_t *card, const struct hda_bus_template *temp, +int snd_hda_bus_new(struct snd_card *card, const struct hda_bus_template *temp, struct hda_bus **busp) { struct hda_bus *bus; int err; - static snd_device_ops_t dev_ops = { + static struct snd_device_ops dev_ops = { .dev_free = snd_hda_bus_dev_free, }; @@ -356,7 +370,7 @@ int snd_hda_bus_new(snd_card_t *card, const struct hda_bus_template *temp, if (busp) *busp = NULL; - bus = kcalloc(1, sizeof(*bus), GFP_KERNEL); + bus = kzalloc(sizeof(*bus), GFP_KERNEL); if (bus == NULL) { snd_printk(KERN_ERR "can't allocate struct hda_bus\n"); return -ENOMEM; @@ -368,11 +382,9 @@ int snd_hda_bus_new(snd_card_t *card, const struct hda_bus_template *temp, bus->modelname = temp->modelname; bus->ops = temp->ops; - init_MUTEX(&bus->cmd_mutex); + mutex_init(&bus->cmd_mutex); INIT_LIST_HEAD(&bus->codec_list); - init_unsol_queue(bus); - if ((err = snd_device_new(card, SNDRV_DEV_BUS, bus, &dev_ops)) < 0) { snd_hda_bus_free(bus); return err; @@ -382,6 +394,7 @@ int snd_hda_bus_new(snd_card_t *card, const struct hda_bus_template *temp, return 0; } +EXPORT_SYMBOL(snd_hda_bus_new); /* * find a matching codec preset @@ -395,7 +408,9 @@ static const struct hda_codec_preset *find_codec_preset(struct hda_codec *codec) u32 mask = preset->mask; if (! mask) mask = ~0; - if (preset->id == (codec->vendor_id & mask)) + if (preset->id == (codec->vendor_id & mask) && + (! preset->rev || + preset->rev == codec->revision_id)) return preset; } } @@ -430,24 +445,49 @@ void snd_hda_get_codec_name(struct hda_codec *codec, } /* - * look for an AFG node - * - * return 0 if not found + * look for an AFG and MFG nodes */ -static int look_for_afg_node(struct hda_codec *codec) +static void setup_fg_nodes(struct hda_codec *codec) { int i, total_nodes; hda_nid_t nid; total_nodes = snd_hda_get_sub_nodes(codec, AC_NODE_ROOT, &nid); for (i = 0; i < total_nodes; i++, nid++) { - if ((snd_hda_param_read(codec, nid, AC_PAR_FUNCTION_TYPE) & 0xff) == - AC_GRP_AUDIO_FUNCTION) - return nid; + switch((snd_hda_param_read(codec, nid, AC_PAR_FUNCTION_TYPE) & 0xff)) { + case AC_GRP_AUDIO_FUNCTION: + codec->afg = nid; + break; + case AC_GRP_MODEM_FUNCTION: + codec->mfg = nid; + break; + default: + break; + } } +} + +/* + * read widget caps for each widget and store in cache + */ +static int read_widget_caps(struct hda_codec *codec, hda_nid_t fg_node) +{ + int i; + hda_nid_t nid; + + codec->num_nodes = snd_hda_get_sub_nodes(codec, fg_node, + &codec->start_nid); + codec->wcaps = kmalloc(codec->num_nodes * 4, GFP_KERNEL); + if (! codec->wcaps) + return -ENOMEM; + nid = codec->start_nid; + for (i = 0; i < codec->num_nodes; i++, nid++) + codec->wcaps[i] = snd_hda_param_read(codec, nid, + AC_PAR_AUDIO_WIDGET_CAP); return 0; } + /* * codec destructor */ @@ -459,6 +499,8 @@ static void snd_hda_codec_free(struct hda_codec *codec) codec->bus->caddr_tbl[codec->addr] = NULL; if (codec->patch_ops.free) codec->patch_ops.free(codec); + kfree(codec->amp_info); + kfree(codec->wcaps); kfree(codec); } @@ -487,7 +529,7 @@ int snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr, return -EBUSY; } - codec = kcalloc(1, sizeof(*codec), GFP_KERNEL); + codec = kzalloc(sizeof(*codec), GFP_KERNEL); if (codec == NULL) { snd_printk(KERN_ERR "can't allocate struct hda_codec\n"); return -ENOMEM; @@ -495,24 +537,42 @@ int snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr, codec->bus = bus; codec->addr = codec_addr; - init_MUTEX(&codec->spdif_mutex); + mutex_init(&codec->spdif_mutex); init_amp_hash(codec); list_add_tail(&codec->list, &bus->codec_list); bus->caddr_tbl[codec_addr] = codec; codec->vendor_id = snd_hda_param_read(codec, AC_NODE_ROOT, AC_PAR_VENDOR_ID); + if (codec->vendor_id == -1) + /* read again, hopefully the access method was corrected + * in the last read... + */ + codec->vendor_id = snd_hda_param_read(codec, AC_NODE_ROOT, + AC_PAR_VENDOR_ID); codec->subsystem_id = snd_hda_param_read(codec, AC_NODE_ROOT, AC_PAR_SUBSYSTEM_ID); codec->revision_id = snd_hda_param_read(codec, AC_NODE_ROOT, AC_PAR_REV_ID); - /* FIXME: support for multiple AFGs? */ - codec->afg = look_for_afg_node(codec); - if (! codec->afg) { - snd_printk(KERN_ERR "hda_codec: no AFG node found\n"); + setup_fg_nodes(codec); + if (! codec->afg && ! codec->mfg) { + snd_printdd("hda_codec: no AFG or MFG node found\n"); snd_hda_codec_free(codec); return -ENODEV; } + if (read_widget_caps(codec, codec->afg ? codec->afg : codec->mfg) < 0) { + snd_printk(KERN_ERR "hda_codec: cannot malloc\n"); + snd_hda_codec_free(codec); + return -ENOMEM; + } + + if (! codec->subsystem_id) { + hda_nid_t nid = codec->afg ? codec->afg : codec->mfg; + codec->subsystem_id = snd_hda_codec_read(codec, nid, 0, + AC_VERB_GET_SUBSYSTEM_ID, + 0); + } + codec->preset = find_codec_preset(codec); if (! *bus->card->mixername) snd_hda_get_codec_name(codec, bus->card->mixername, @@ -527,6 +587,9 @@ int snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr, return err; } + if (codec->patch_ops.unsol_event) + init_unsol_queue(bus); + snd_hda_codec_proc_new(codec); sprintf(component, "HDA:%08x", codec->vendor_id); @@ -537,6 +600,8 @@ int snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr, return 0; } +EXPORT_SYMBOL(snd_hda_codec_new); + /** * snd_hda_codec_setup_stream - set up the codec for streaming * @codec: the CODEC to set up @@ -548,6 +613,9 @@ int snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr, void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, u32 stream_tag, int channel_id, int format) { + if (! nid) + return; + snd_printdd("hda_codec_setup_stream: NID=0x%x, stream=0x%x, channel=%d, format=0x%x\n", nid, stream_tag, channel_id, format); snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CHANNEL_STREAMID, @@ -556,20 +624,24 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, u32 stre snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_STREAM_FORMAT, format); } +EXPORT_SYMBOL(snd_hda_codec_setup_stream); /* * amp access functions */ -#define HDA_HASH_KEY(nid,dir,idx) (u32)((nid) + (idx) * 32 + (dir) * 64) +/* FIXME: more better hash key? */ +#define HDA_HASH_KEY(nid,dir,idx) (u32)((nid) + ((idx) << 16) + ((dir) << 24)) #define INFO_AMP_CAPS (1<<0) -#define INFO_AMP_VOL (1<<1) +#define INFO_AMP_VOL(ch) (1 << (1 + (ch))) /* initialize the hash table */ static void init_amp_hash(struct hda_codec *codec) { memset(codec->amp_hash, 0xff, sizeof(codec->amp_hash)); codec->num_amp_entries = 0; + codec->amp_info_size = 0; + codec->amp_info = NULL; } /* query the hash. allocate an entry if not found. */ @@ -587,9 +659,22 @@ static struct hda_amp_info *get_alloc_amp_hash(struct hda_codec *codec, u32 key) } /* add a new hash entry */ - if (codec->num_amp_entries >= ARRAY_SIZE(codec->amp_info)) { - snd_printk(KERN_ERR "hda_codec: Tooooo many amps!\n"); - return NULL; + if (codec->num_amp_entries >= codec->amp_info_size) { + /* reallocate the array */ + int new_size = codec->amp_info_size + 64; + struct hda_amp_info *new_info = kcalloc(new_size, sizeof(struct hda_amp_info), + GFP_KERNEL); + if (! new_info) { + snd_printk(KERN_ERR "hda_codec: can't malloc amp_info\n"); + return NULL; + } + if (codec->amp_info) { + memcpy(new_info, codec->amp_info, + codec->amp_info_size * sizeof(struct hda_amp_info)); + kfree(codec->amp_info); + } + codec->amp_info_size = new_size; + codec->amp_info = new_info; } cur = codec->num_amp_entries++; info = &codec->amp_info[cur]; @@ -611,7 +696,7 @@ static u32 query_amp_caps(struct hda_codec *codec, hda_nid_t nid, int direction) if (! info) return 0; if (! (info->status & INFO_AMP_CAPS)) { - if (!(snd_hda_param_read(codec, nid, AC_PAR_AUDIO_WIDGET_CAP) & AC_WCAP_AMP_OVRD)) + if (! (get_wcaps(codec, nid) & AC_WCAP_AMP_OVRD)) nid = codec->afg; info->amp_caps = snd_hda_param_read(codec, nid, direction == HDA_OUTPUT ? AC_PAR_AMP_OUT_CAP : AC_PAR_AMP_IN_CAP); @@ -622,28 +707,29 @@ static u32 query_amp_caps(struct hda_codec *codec, hda_nid_t nid, int direction) /* * read the current volume to info - * if the cache exists, read from the cache. + * if the cache exists, read the cache value. */ -static void get_vol_mute(struct hda_codec *codec, struct hda_amp_info *info, +static unsigned int get_vol_mute(struct hda_codec *codec, struct hda_amp_info *info, hda_nid_t nid, int ch, int direction, int index) { u32 val, parm; - if (info->status & (INFO_AMP_VOL << ch)) - return; + if (info->status & INFO_AMP_VOL(ch)) + return info->vol[ch]; parm = ch ? AC_AMP_GET_RIGHT : AC_AMP_GET_LEFT; parm |= direction == HDA_OUTPUT ? AC_AMP_GET_OUTPUT : AC_AMP_GET_INPUT; parm |= index; val = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_AMP_GAIN_MUTE, parm); info->vol[ch] = val & 0xff; - info->status |= INFO_AMP_VOL << ch; + info->status |= INFO_AMP_VOL(ch); + return info->vol[ch]; } /* - * write the current volume in info to the h/w + * write the current volume in info to the h/w and update the cache */ -static void put_vol_mute(struct hda_codec *codec, +static void put_vol_mute(struct hda_codec *codec, struct hda_amp_info *info, hda_nid_t nid, int ch, int direction, int index, int val) { u32 parm; @@ -653,30 +739,36 @@ static void put_vol_mute(struct hda_codec *codec, parm |= index << AC_AMP_SET_INDEX_SHIFT; parm |= val; snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, parm); + info->vol[ch] = val; } /* - * read/write AMP value. The volume is between 0 to 0x7f, 0x80 = mute bit. + * read AMP value. The volume is between 0 to 0x7f, 0x80 = mute bit. */ -int snd_hda_codec_amp_read(struct hda_codec *codec, hda_nid_t nid, int ch, int direction, int index) +int snd_hda_codec_amp_read(struct hda_codec *codec, hda_nid_t nid, int ch, + int direction, int index) { struct hda_amp_info *info = get_alloc_amp_hash(codec, HDA_HASH_KEY(nid, direction, index)); if (! info) return 0; - get_vol_mute(codec, info, nid, ch, direction, index); - return info->vol[ch]; + return get_vol_mute(codec, info, nid, ch, direction, index); } -int snd_hda_codec_amp_write(struct hda_codec *codec, hda_nid_t nid, int ch, int direction, int idx, int val) +/* + * update the AMP value, mask = bit mask to set, val = the value + */ +int snd_hda_codec_amp_update(struct hda_codec *codec, hda_nid_t nid, int ch, + int direction, int idx, int mask, int val) { struct hda_amp_info *info = get_alloc_amp_hash(codec, HDA_HASH_KEY(nid, direction, idx)); + if (! info) return 0; - get_vol_mute(codec, info, nid, ch, direction, idx); + val &= mask; + val |= get_vol_mute(codec, info, nid, ch, direction, idx) & ~mask; if (info->vol[ch] == val && ! codec->in_resume) return 0; - put_vol_mute(codec, nid, ch, direction, idx, val); - info->vol[ch] = val; + put_vol_mute(codec, info, nid, ch, direction, idx, val); return 1; } @@ -691,7 +783,7 @@ int snd_hda_codec_amp_write(struct hda_codec *codec, hda_nid_t nid, int ch, int #define get_amp_index(kc) (((kc)->private_value >> 19) & 0xf) /* volume */ -int snd_hda_mixer_amp_volume_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo) +int snd_hda_mixer_amp_volume_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); u16 nid = get_amp_nid(kcontrol); @@ -712,7 +804,7 @@ int snd_hda_mixer_amp_volume_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t return 0; } -int snd_hda_mixer_amp_volume_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) +int snd_hda_mixer_amp_volume_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); hda_nid_t nid = get_amp_nid(kcontrol); @@ -728,33 +820,29 @@ int snd_hda_mixer_amp_volume_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t return 0; } -int snd_hda_mixer_amp_volume_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) +int snd_hda_mixer_amp_volume_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); hda_nid_t nid = get_amp_nid(kcontrol); int chs = get_amp_channels(kcontrol); int dir = get_amp_direction(kcontrol); int idx = get_amp_index(kcontrol); - int val; long *valp = ucontrol->value.integer.value; int change = 0; if (chs & 1) { - val = *valp & 0x7f; - val |= snd_hda_codec_amp_read(codec, nid, 0, dir, idx) & 0x80; - change = snd_hda_codec_amp_write(codec, nid, 0, dir, idx, val); + change = snd_hda_codec_amp_update(codec, nid, 0, dir, idx, + 0x7f, *valp); valp++; } - if (chs & 2) { - val = *valp & 0x7f; - val |= snd_hda_codec_amp_read(codec, nid, 1, dir, idx) & 0x80; - change |= snd_hda_codec_amp_write(codec, nid, 1, dir, idx, val); - } + if (chs & 2) + change |= snd_hda_codec_amp_update(codec, nid, 1, dir, idx, + 0x7f, *valp); return change; } /* switch */ -int snd_hda_mixer_amp_switch_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo) +int snd_hda_mixer_amp_switch_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) { int chs = get_amp_channels(kcontrol); @@ -765,7 +853,7 @@ int snd_hda_mixer_amp_switch_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t return 0; } -int snd_hda_mixer_amp_switch_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) +int snd_hda_mixer_amp_switch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); hda_nid_t nid = get_amp_nid(kcontrol); @@ -781,43 +869,85 @@ int snd_hda_mixer_amp_switch_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t return 0; } -int snd_hda_mixer_amp_switch_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) +int snd_hda_mixer_amp_switch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); hda_nid_t nid = get_amp_nid(kcontrol); int chs = get_amp_channels(kcontrol); int dir = get_amp_direction(kcontrol); int idx = get_amp_index(kcontrol); - int val; long *valp = ucontrol->value.integer.value; int change = 0; if (chs & 1) { - val = snd_hda_codec_amp_read(codec, nid, 0, dir, idx) & 0x7f; - val |= *valp ? 0 : 0x80; - change = snd_hda_codec_amp_write(codec, nid, 0, dir, idx, val); + change = snd_hda_codec_amp_update(codec, nid, 0, dir, idx, + 0x80, *valp ? 0 : 0x80); valp++; } - if (chs & 2) { - val = snd_hda_codec_amp_read(codec, nid, 1, dir, idx) & 0x7f; - val |= *valp ? 0 : 0x80; - change = snd_hda_codec_amp_write(codec, nid, 1, dir, idx, val); - } + if (chs & 2) + change |= snd_hda_codec_amp_update(codec, nid, 1, dir, idx, + 0x80, *valp ? 0 : 0x80); + return change; } +/* + * bound volume controls + * + * bind multiple volumes (# indices, from 0) + */ + +#define AMP_VAL_IDX_SHIFT 19 +#define AMP_VAL_IDX_MASK (0x0f<<19) + +int snd_hda_mixer_bind_switch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) +{ + struct hda_codec *codec = snd_kcontrol_chip(kcontrol); + unsigned long pval; + int err; + + mutex_lock(&codec->spdif_mutex); /* reuse spdif_mutex */ + pval = kcontrol->private_value; + kcontrol->private_value = pval & ~AMP_VAL_IDX_MASK; /* index 0 */ + err = snd_hda_mixer_amp_switch_get(kcontrol, ucontrol); + kcontrol->private_value = pval; + mutex_unlock(&codec->spdif_mutex); + return err; +} + +int snd_hda_mixer_bind_switch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) +{ + struct hda_codec *codec = snd_kcontrol_chip(kcontrol); + unsigned long pval; + int i, indices, err = 0, change = 0; + + mutex_lock(&codec->spdif_mutex); /* reuse spdif_mutex */ + pval = kcontrol->private_value; + indices = (pval & AMP_VAL_IDX_MASK) >> AMP_VAL_IDX_SHIFT; + for (i = 0; i < indices; i++) { + kcontrol->private_value = (pval & ~AMP_VAL_IDX_MASK) | (i << AMP_VAL_IDX_SHIFT); + err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol); + if (err < 0) + break; + change |= err; + } + kcontrol->private_value = pval; + mutex_unlock(&codec->spdif_mutex); + return err < 0 ? err : change; +} + /* * SPDIF out controls */ -static int snd_hda_spdif_mask_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo) +static int snd_hda_spdif_mask_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) { uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958; uinfo->count = 1; return 0; } -static int snd_hda_spdif_cmask_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) +static int snd_hda_spdif_cmask_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { ucontrol->value.iec958.status[0] = IEC958_AES0_PROFESSIONAL | IEC958_AES0_NONAUDIO | @@ -828,7 +958,7 @@ static int snd_hda_spdif_cmask_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_ return 0; } -static int snd_hda_spdif_pmask_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) +static int snd_hda_spdif_pmask_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { ucontrol->value.iec958.status[0] = IEC958_AES0_PROFESSIONAL | IEC958_AES0_NONAUDIO | @@ -836,7 +966,7 @@ static int snd_hda_spdif_pmask_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_ return 0; } -static int snd_hda_spdif_default_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) +static int snd_hda_spdif_default_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); @@ -899,14 +1029,14 @@ static unsigned int convert_to_spdif_status(unsigned short val) return sbits; } -static int snd_hda_spdif_default_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) +static int snd_hda_spdif_default_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); hda_nid_t nid = kcontrol->private_value; unsigned short val; int change; - down(&codec->spdif_mutex); + mutex_lock(&codec->spdif_mutex); codec->spdif_status = ucontrol->value.iec958.status[0] | ((unsigned int)ucontrol->value.iec958.status[1] << 8) | ((unsigned int)ucontrol->value.iec958.status[2] << 16) | @@ -921,11 +1051,11 @@ static int snd_hda_spdif_default_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_valu snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_2, val >> 8); } - up(&codec->spdif_mutex); + mutex_unlock(&codec->spdif_mutex); return change; } -static int snd_hda_spdif_out_switch_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo) +static int snd_hda_spdif_out_switch_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) { uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; uinfo->count = 1; @@ -934,7 +1064,7 @@ static int snd_hda_spdif_out_switch_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_ return 0; } -static int snd_hda_spdif_out_switch_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) +static int snd_hda_spdif_out_switch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); @@ -942,14 +1072,14 @@ static int snd_hda_spdif_out_switch_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_v return 0; } -static int snd_hda_spdif_out_switch_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) +static int snd_hda_spdif_out_switch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); hda_nid_t nid = kcontrol->private_value; unsigned short val; int change; - down(&codec->spdif_mutex); + mutex_lock(&codec->spdif_mutex); val = codec->spdif_ctls & ~1; if (ucontrol->value.integer.value[0]) val |= 1; @@ -961,11 +1091,11 @@ static int snd_hda_spdif_out_switch_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_v AC_AMP_SET_RIGHT | AC_AMP_SET_LEFT | AC_AMP_SET_OUTPUT | ((val & 1) ? 0 : 0x80)); } - up(&codec->spdif_mutex); + mutex_unlock(&codec->spdif_mutex); return change; } -static snd_kcontrol_new_t dig_mixes[] = { +static struct snd_kcontrol_new dig_mixes[] = { { .access = SNDRV_CTL_ELEM_ACCESS_READ, .iface = SNDRV_CTL_ELEM_IFACE_MIXER, @@ -1010,8 +1140,8 @@ static snd_kcontrol_new_t dig_mixes[] = { int snd_hda_create_spdif_out_ctls(struct hda_codec *codec, hda_nid_t nid) { int err; - snd_kcontrol_t *kctl; - snd_kcontrol_new_t *dig_mix; + struct snd_kcontrol *kctl; + struct snd_kcontrol_new *dig_mix; for (dig_mix = dig_mixes; dig_mix->name; dig_mix++) { kctl = snd_ctl_new1(dig_mix, codec); @@ -1030,7 +1160,7 @@ int snd_hda_create_spdif_out_ctls(struct hda_codec *codec, hda_nid_t nid) #define snd_hda_spdif_in_switch_info snd_hda_spdif_out_switch_info -static int snd_hda_spdif_in_switch_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) +static int snd_hda_spdif_in_switch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); @@ -1038,24 +1168,24 @@ static int snd_hda_spdif_in_switch_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_va return 0; } -static int snd_hda_spdif_in_switch_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) +static int snd_hda_spdif_in_switch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); hda_nid_t nid = kcontrol->private_value; unsigned int val = !!ucontrol->value.integer.value[0]; int change; - down(&codec->spdif_mutex); + mutex_lock(&codec->spdif_mutex); change = codec->spdif_in_enable != val; if (change || codec->in_resume) { codec->spdif_in_enable = val; snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1, val); } - up(&codec->spdif_mutex); + mutex_unlock(&codec->spdif_mutex); return change; } -static int snd_hda_spdif_in_status_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) +static int snd_hda_spdif_in_status_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); hda_nid_t nid = kcontrol->private_value; @@ -1071,7 +1201,7 @@ static int snd_hda_spdif_in_status_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_va return 0; } -static snd_kcontrol_new_t dig_in_ctls[] = { +static struct snd_kcontrol_new dig_in_ctls[] = { { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = SNDRV_CTL_NAME_IEC958("",CAPTURE,SWITCH), @@ -1102,8 +1232,8 @@ static snd_kcontrol_new_t dig_in_ctls[] = { int snd_hda_create_spdif_in_ctls(struct hda_codec *codec, hda_nid_t nid) { int err; - snd_kcontrol_t *kctl; - snd_kcontrol_new_t *dig_mix; + struct snd_kcontrol *kctl; + struct snd_kcontrol_new *dig_mix; for (dig_mix = dig_in_ctls; dig_mix->name; dig_mix++) { kctl = snd_ctl_new1(dig_mix, codec); @@ -1116,6 +1246,31 @@ int snd_hda_create_spdif_in_ctls(struct hda_codec *codec, hda_nid_t nid) } +/* + * set power state of the codec + */ +static void hda_set_power_state(struct hda_codec *codec, hda_nid_t fg, + unsigned int power_state) +{ + hda_nid_t nid, nid_start; + int nodes; + + snd_hda_codec_write(codec, fg, 0, AC_VERB_SET_POWER_STATE, + power_state); + + nodes = snd_hda_get_sub_nodes(codec, fg, &nid_start); + for (nid = nid_start; nid < nodes + nid_start; nid++) { + if (get_wcaps(codec, nid) & AC_WCAP_POWER) + snd_hda_codec_write(codec, nid, 0, + AC_VERB_SET_POWER_STATE, + power_state); + } + + if (power_state == AC_PWRST_D0) + msleep(10); +} + + /** * snd_hda_build_controls - build mixer controls * @bus: the BUS @@ -1143,6 +1298,9 @@ int snd_hda_build_controls(struct hda_bus *bus) list_for_each(p, &bus->codec_list) { struct hda_codec *codec = list_entry(p, struct hda_codec, list); int err; + hda_set_power_state(codec, + codec->afg ? codec->afg : codec->mfg, + AC_PWRST_D0); if (! codec->patch_ops.init) continue; err = codec->patch_ops.init(codec); @@ -1152,12 +1310,21 @@ int snd_hda_build_controls(struct hda_bus *bus) return 0; } +EXPORT_SYMBOL(snd_hda_build_controls); /* * stream formats */ -static unsigned int rate_bits[][3] = { +struct hda_rate_tbl { + unsigned int hz; + unsigned int alsa_bits; + unsigned int hda_fmt; +}; + +static struct hda_rate_tbl rate_bits[] = { /* rate in Hz, ALSA rate bitmask, HDA format value */ + + /* autodetected value used in snd_hda_query_supported_pcm */ { 8000, SNDRV_PCM_RATE_8000, 0x0500 }, /* 1/6 x 48 */ { 11025, SNDRV_PCM_RATE_11025, 0x4300 }, /* 1/4 x 44 */ { 16000, SNDRV_PCM_RATE_16000, 0x0200 }, /* 1/3 x 48 */ @@ -1169,7 +1336,11 @@ static unsigned int rate_bits[][3] = { { 96000, SNDRV_PCM_RATE_96000, 0x0800 }, /* 2 x 48 */ { 176400, SNDRV_PCM_RATE_176400, 0x5800 },/* 4 x 44 */ { 192000, SNDRV_PCM_RATE_192000, 0x1800 }, /* 4 x 48 */ - { 0 } + + /* not autodetected value */ + { 9600, SNDRV_PCM_RATE_KNOT, 0x0400 }, /* 1/5 x 48 */ + + { 0 } /* terminator */ }; /** @@ -1191,12 +1362,12 @@ unsigned int snd_hda_calc_stream_format(unsigned int rate, int i; unsigned int val = 0; - for (i = 0; rate_bits[i][0]; i++) - if (rate_bits[i][0] == rate) { - val = rate_bits[i][2]; + for (i = 0; rate_bits[i].hz; i++) + if (rate_bits[i].hz == rate) { + val = rate_bits[i].hda_fmt; break; } - if (! rate_bits[i][0]) { + if (! rate_bits[i].hz) { snd_printdd("invalid rate %d\n", rate); return 0; } @@ -1228,6 +1399,8 @@ unsigned int snd_hda_calc_stream_format(unsigned int rate, return val; } +EXPORT_SYMBOL(snd_hda_calc_stream_format); + /** * snd_hda_query_supported_pcm - query the supported PCM rates and formats * @codec: the HDA codec @@ -1249,7 +1422,7 @@ int snd_hda_query_supported_pcm(struct hda_codec *codec, hda_nid_t nid, val = 0; if (nid != codec->afg && - snd_hda_param_read(codec, nid, AC_PAR_AUDIO_WIDGET_CAP) & AC_WCAP_FORMAT_OVRD) { + (get_wcaps(codec, nid) & AC_WCAP_FORMAT_OVRD)) { val = snd_hda_param_read(codec, nid, AC_PAR_PCM); if (val == -1) return -EIO; @@ -1259,9 +1432,9 @@ int snd_hda_query_supported_pcm(struct hda_codec *codec, hda_nid_t nid, if (ratesp) { u32 rates = 0; - for (i = 0; rate_bits[i][0]; i++) { + for (i = 0; rate_bits[i].hz; i++) { if (val & (1 << i)) - rates |= rate_bits[i][1]; + rates |= rate_bits[i].alsa_bits; } *ratesp = rates; } @@ -1271,7 +1444,7 @@ int snd_hda_query_supported_pcm(struct hda_codec *codec, hda_nid_t nid, unsigned int bps; unsigned int wcaps; - wcaps = snd_hda_param_read(codec, nid, AC_PAR_AUDIO_WIDGET_CAP); + wcaps = get_wcaps(codec, nid); streams = snd_hda_param_read(codec, nid, AC_PAR_STREAM); if (streams == -1) return -EIO; @@ -1341,7 +1514,7 @@ int snd_hda_is_supported_format(struct hda_codec *codec, hda_nid_t nid, unsigned int val = 0, rate, stream; if (nid != codec->afg && - snd_hda_param_read(codec, nid, AC_PAR_AUDIO_WIDGET_CAP) & AC_WCAP_FORMAT_OVRD) { + (get_wcaps(codec, nid) & AC_WCAP_FORMAT_OVRD)) { val = snd_hda_param_read(codec, nid, AC_PAR_PCM); if (val == -1) return 0; @@ -1353,13 +1526,13 @@ int snd_hda_is_supported_format(struct hda_codec *codec, hda_nid_t nid, } rate = format & 0xff00; - for (i = 0; rate_bits[i][0]; i++) - if (rate_bits[i][2] == rate) { + for (i = 0; rate_bits[i].hz; i++) + if (rate_bits[i].hda_fmt == rate) { if (val & (1 << i)) break; return 0; } - if (! rate_bits[i][0]) + if (! rate_bits[i].hz) return 0; stream = snd_hda_param_read(codec, nid, AC_PAR_STREAM); @@ -1407,7 +1580,7 @@ int snd_hda_is_supported_format(struct hda_codec *codec, hda_nid_t nid, */ static int hda_pcm_default_open_close(struct hda_pcm_stream *hinfo, struct hda_codec *codec, - snd_pcm_substream_t *substream) + struct snd_pcm_substream *substream) { return 0; } @@ -1416,7 +1589,7 @@ static int hda_pcm_default_prepare(struct hda_pcm_stream *hinfo, struct hda_codec *codec, unsigned int stream_tag, unsigned int format, - snd_pcm_substream_t *substream) + struct snd_pcm_substream *substream) { snd_hda_codec_setup_stream(codec, hinfo->nid, stream_tag, 0, format); return 0; @@ -1424,7 +1597,7 @@ static int hda_pcm_default_prepare(struct hda_pcm_stream *hinfo, static int hda_pcm_default_cleanup(struct hda_pcm_stream *hinfo, struct hda_codec *codec, - snd_pcm_substream_t *substream) + struct snd_pcm_substream *substream) { snd_hda_codec_setup_stream(codec, hinfo->nid, 0, 0, 0); return 0; @@ -1448,10 +1621,6 @@ static int set_pcm_default_values(struct hda_codec *codec, struct hda_pcm_stream snd_assert(info->nid, return -EINVAL); info->ops.prepare = hda_pcm_default_prepare; } - if (info->ops.prepare == NULL) { - snd_assert(info->nid, return -EINVAL); - info->ops.prepare = hda_pcm_default_prepare; - } if (info->ops.cleanup == NULL) { snd_assert(info->nid, return -EINVAL); info->ops.cleanup = hda_pcm_default_cleanup; @@ -1513,6 +1682,7 @@ int snd_hda_build_pcms(struct hda_bus *bus) return 0; } +EXPORT_SYMBOL(snd_hda_build_pcms); /** * snd_hda_check_board_config - compare the current codec with the config table @@ -1525,12 +1695,12 @@ int snd_hda_build_pcms(struct hda_bus *bus) * * If no entries are matching, the function returns a negative value. */ -int snd_hda_check_board_config(struct hda_codec *codec, struct hda_board_config *tbl) +int snd_hda_check_board_config(struct hda_codec *codec, const struct hda_board_config *tbl) { - struct hda_board_config *c; + const struct hda_board_config *c; if (codec->bus->modelname) { - for (c = tbl; c->modelname || c->pci_vendor; c++) { + for (c = tbl; c->modelname || c->pci_subvendor; c++) { if (c->modelname && ! strcmp(codec->bus->modelname, c->modelname)) { snd_printd(KERN_INFO "hda_codec: model '%s' is selected\n", c->modelname); @@ -1543,10 +1713,14 @@ int snd_hda_check_board_config(struct hda_codec *codec, struct hda_board_config u16 subsystem_vendor, subsystem_device; pci_read_config_word(codec->bus->pci, PCI_SUBSYSTEM_VENDOR_ID, &subsystem_vendor); pci_read_config_word(codec->bus->pci, PCI_SUBSYSTEM_ID, &subsystem_device); - for (c = tbl; c->modelname || c->pci_vendor; c++) { - if (c->pci_vendor == subsystem_vendor && - c->pci_device == subsystem_device) + for (c = tbl; c->modelname || c->pci_subvendor; c++) { + if (c->pci_subvendor == subsystem_vendor && + (! c->pci_subdevice /* all match */|| + (c->pci_subdevice == subsystem_device))) { + snd_printdd(KERN_INFO "hda_codec: PCI %x:%x, codec config %d is selected\n", + subsystem_vendor, subsystem_device, c->config); return c->config; + } } } return -1; @@ -1555,30 +1729,90 @@ int snd_hda_check_board_config(struct hda_codec *codec, struct hda_board_config /** * snd_hda_add_new_ctls - create controls from the array * @codec: the HDA codec - * @knew: the array of snd_kcontrol_new_t + * @knew: the array of struct snd_kcontrol_new * * This helper function creates and add new controls in the given array. * The array must be terminated with an empty entry as terminator. * * Returns 0 if successful, or a negative error code. */ -int snd_hda_add_new_ctls(struct hda_codec *codec, snd_kcontrol_new_t *knew) +int snd_hda_add_new_ctls(struct hda_codec *codec, struct snd_kcontrol_new *knew) { int err; for (; knew->name; knew++) { - err = snd_ctl_add(codec->bus->card, snd_ctl_new1(knew, codec)); - if (err < 0) - return err; + struct snd_kcontrol *kctl; + kctl = snd_ctl_new1(knew, codec); + if (! kctl) + return -ENOMEM; + err = snd_ctl_add(codec->bus->card, kctl); + if (err < 0) { + if (! codec->addr) + return err; + kctl = snd_ctl_new1(knew, codec); + if (! kctl) + return -ENOMEM; + kctl->id.device = codec->addr; + if ((err = snd_ctl_add(codec->bus->card, kctl)) < 0) + return err; + } } return 0; } +/* + * Channel mode helper + */ +int snd_hda_ch_mode_info(struct hda_codec *codec, struct snd_ctl_elem_info *uinfo, + const struct hda_channel_mode *chmode, int num_chmodes) +{ + uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; + uinfo->count = 1; + uinfo->value.enumerated.items = num_chmodes; + if (uinfo->value.enumerated.item >= num_chmodes) + uinfo->value.enumerated.item = num_chmodes - 1; + sprintf(uinfo->value.enumerated.name, "%dch", + chmode[uinfo->value.enumerated.item].channels); + return 0; +} + +int snd_hda_ch_mode_get(struct hda_codec *codec, struct snd_ctl_elem_value *ucontrol, + const struct hda_channel_mode *chmode, int num_chmodes, + int max_channels) +{ + int i; + + for (i = 0; i < num_chmodes; i++) { + if (max_channels == chmode[i].channels) { + ucontrol->value.enumerated.item[0] = i; + break; + } + } + return 0; +} + +int snd_hda_ch_mode_put(struct hda_codec *codec, struct snd_ctl_elem_value *ucontrol, + const struct hda_channel_mode *chmode, int num_chmodes, + int *max_channelsp) +{ + unsigned int mode; + + mode = ucontrol->value.enumerated.item[0]; + snd_assert(mode < num_chmodes, return -EINVAL); + if (*max_channelsp == chmode[mode].channels && ! codec->in_resume) + return 0; + /* change the current channel setting */ + *max_channelsp = chmode[mode].channels; + if (chmode[mode].sequence) + snd_hda_sequence_write(codec, chmode[mode].sequence); + return 1; +} + /* * input MUX helper */ -int snd_hda_input_mux_info(const struct hda_input_mux *imux, snd_ctl_elem_info_t *uinfo) +int snd_hda_input_mux_info(const struct hda_input_mux *imux, struct snd_ctl_elem_info *uinfo) { unsigned int index; @@ -1593,7 +1827,7 @@ int snd_hda_input_mux_info(const struct hda_input_mux *imux, snd_ctl_elem_info_t } int snd_hda_input_mux_put(struct hda_codec *codec, const struct hda_input_mux *imux, - snd_ctl_elem_value_t *ucontrol, hda_nid_t nid, + struct snd_ctl_elem_value *ucontrol, hda_nid_t nid, unsigned int *cur_val) { unsigned int idx; @@ -1619,13 +1853,13 @@ int snd_hda_input_mux_put(struct hda_codec *codec, const struct hda_input_mux *i */ int snd_hda_multi_out_dig_open(struct hda_codec *codec, struct hda_multi_out *mout) { - down(&codec->spdif_mutex); + mutex_lock(&codec->spdif_mutex); if (mout->dig_out_used) { - up(&codec->spdif_mutex); + mutex_unlock(&codec->spdif_mutex); return -EBUSY; /* already being used */ } mout->dig_out_used = HDA_DIG_EXCLUSIVE; - up(&codec->spdif_mutex); + mutex_unlock(&codec->spdif_mutex); return 0; } @@ -1634,9 +1868,9 @@ int snd_hda_multi_out_dig_open(struct hda_codec *codec, struct hda_multi_out *mo */ int snd_hda_multi_out_dig_close(struct hda_codec *codec, struct hda_multi_out *mout) { - down(&codec->spdif_mutex); + mutex_lock(&codec->spdif_mutex); mout->dig_out_used = 0; - up(&codec->spdif_mutex); + mutex_unlock(&codec->spdif_mutex); return 0; } @@ -1644,7 +1878,7 @@ int snd_hda_multi_out_dig_close(struct hda_codec *codec, struct hda_multi_out *m * set up more restrictions for analog out */ int snd_hda_multi_out_analog_open(struct hda_codec *codec, struct hda_multi_out *mout, - snd_pcm_substream_t *substream) + struct snd_pcm_substream *substream) { substream->runtime->hw.channels_max = mout->max_channels; return snd_pcm_hw_constraint_step(substream->runtime, 0, @@ -1658,13 +1892,13 @@ int snd_hda_multi_out_analog_open(struct hda_codec *codec, struct hda_multi_out int snd_hda_multi_out_analog_prepare(struct hda_codec *codec, struct hda_multi_out *mout, unsigned int stream_tag, unsigned int format, - snd_pcm_substream_t *substream) + struct snd_pcm_substream *substream) { hda_nid_t *nids = mout->dac_nids; int chs = substream->runtime->channels; int i; - down(&codec->spdif_mutex); + mutex_lock(&codec->spdif_mutex); if (mout->dig_out_nid && mout->dig_out_used != HDA_DIG_EXCLUSIVE) { if (chs == 2 && snd_hda_is_supported_format(codec, mout->dig_out_nid, format) && @@ -1678,20 +1912,28 @@ int snd_hda_multi_out_analog_prepare(struct hda_codec *codec, struct hda_multi_o snd_hda_codec_setup_stream(codec, mout->dig_out_nid, 0, 0, 0); } } - up(&codec->spdif_mutex); + mutex_unlock(&codec->spdif_mutex); /* front */ snd_hda_codec_setup_stream(codec, nids[HDA_FRONT], stream_tag, 0, format); if (mout->hp_nid) /* headphone out will just decode front left/right (stereo) */ snd_hda_codec_setup_stream(codec, mout->hp_nid, stream_tag, 0, format); + /* extra outputs copied from front */ + for (i = 0; i < ARRAY_SIZE(mout->extra_out_nid); i++) + if (mout->extra_out_nid[i]) + snd_hda_codec_setup_stream(codec, + mout->extra_out_nid[i], + stream_tag, 0, format); + /* surrounds */ for (i = 1; i < mout->num_dacs; i++) { - if (i == HDA_REAR && chs == 2) /* copy front to rear */ - snd_hda_codec_setup_stream(codec, nids[i], stream_tag, 0, format); - else if (chs >= (i + 1) * 2) /* independent out */ + if (chs >= (i + 1) * 2) /* independent out */ snd_hda_codec_setup_stream(codec, nids[i], stream_tag, i * 2, format); + else /* copy front */ + snd_hda_codec_setup_stream(codec, nids[i], stream_tag, 0, + format); } return 0; } @@ -1708,15 +1950,213 @@ int snd_hda_multi_out_analog_cleanup(struct hda_codec *codec, struct hda_multi_o snd_hda_codec_setup_stream(codec, nids[i], 0, 0, 0); if (mout->hp_nid) snd_hda_codec_setup_stream(codec, mout->hp_nid, 0, 0, 0); - down(&codec->spdif_mutex); + for (i = 0; i < ARRAY_SIZE(mout->extra_out_nid); i++) + if (mout->extra_out_nid[i]) + snd_hda_codec_setup_stream(codec, + mout->extra_out_nid[i], + 0, 0, 0); + mutex_lock(&codec->spdif_mutex); if (mout->dig_out_nid && mout->dig_out_used == HDA_DIG_ANALOG_DUP) { snd_hda_codec_setup_stream(codec, mout->dig_out_nid, 0, 0, 0); mout->dig_out_used = 0; } - up(&codec->spdif_mutex); + mutex_unlock(&codec->spdif_mutex); return 0; } +/* + * Helper for automatic ping configuration + */ + +static int is_in_nid_list(hda_nid_t nid, hda_nid_t *list) +{ + for (; *list; list++) + if (*list == nid) + return 1; + return 0; +} + +/* + * Parse all pin widgets and store the useful pin nids to cfg + * + * The number of line-outs or any primary output is stored in line_outs, + * and the corresponding output pins are assigned to line_out_pins[], + * in the order of front, rear, CLFE, side, ... + * + * If more extra outputs (speaker and headphone) are found, the pins are + * assisnged to hp_pin and speaker_pins[], respectively. If no line-out jack + * is detected, one of speaker of HP pins is assigned as the primary + * output, i.e. to line_out_pins[0]. So, line_outs is always positive + * if any analog output exists. + * + * The analog input pins are assigned to input_pins array. + * The digital input/output pins are assigned to dig_in_pin and dig_out_pin, + * respectively. + */ +int snd_hda_parse_pin_def_config(struct hda_codec *codec, struct auto_pin_cfg *cfg, + hda_nid_t *ignore_nids) +{ + hda_nid_t nid, nid_start; + int i, j, nodes; + short seq, assoc_line_out, sequences[ARRAY_SIZE(cfg->line_out_pins)]; + + memset(cfg, 0, sizeof(*cfg)); + + memset(sequences, 0, sizeof(sequences)); + assoc_line_out = 0; + + nodes = snd_hda_get_sub_nodes(codec, codec->afg, &nid_start); + for (nid = nid_start; nid < nodes + nid_start; nid++) { + unsigned int wid_caps = get_wcaps(codec, nid); + unsigned int wid_type = (wid_caps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; + unsigned int def_conf; + short assoc, loc; + + /* read all default configuration for pin complex */ + if (wid_type != AC_WID_PIN) + continue; + /* ignore the given nids (e.g. pc-beep returns error) */ + if (ignore_nids && is_in_nid_list(nid, ignore_nids)) + continue; + + def_conf = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONFIG_DEFAULT, 0); + if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE) + continue; + loc = get_defcfg_location(def_conf); + switch (get_defcfg_device(def_conf)) { + case AC_JACK_LINE_OUT: + seq = get_defcfg_sequence(def_conf); + assoc = get_defcfg_association(def_conf); + if (! assoc) + continue; + if (! assoc_line_out) + assoc_line_out = assoc; + else if (assoc_line_out != assoc) + continue; + if (cfg->line_outs >= ARRAY_SIZE(cfg->line_out_pins)) + continue; + cfg->line_out_pins[cfg->line_outs] = nid; + sequences[cfg->line_outs] = seq; + cfg->line_outs++; + break; + case AC_JACK_SPEAKER: + if (cfg->speaker_outs >= ARRAY_SIZE(cfg->speaker_pins)) + continue; + cfg->speaker_pins[cfg->speaker_outs] = nid; + cfg->speaker_outs++; + break; + case AC_JACK_HP_OUT: + cfg->hp_pin = nid; + break; + case AC_JACK_MIC_IN: + if (loc == AC_JACK_LOC_FRONT) + cfg->input_pins[AUTO_PIN_FRONT_MIC] = nid; + else + cfg->input_pins[AUTO_PIN_MIC] = nid; + break; + case AC_JACK_LINE_IN: + if (loc == AC_JACK_LOC_FRONT) + cfg->input_pins[AUTO_PIN_FRONT_LINE] = nid; + else + cfg->input_pins[AUTO_PIN_LINE] = nid; + break; + case AC_JACK_CD: + cfg->input_pins[AUTO_PIN_CD] = nid; + break; + case AC_JACK_AUX: + cfg->input_pins[AUTO_PIN_AUX] = nid; + break; + case AC_JACK_SPDIF_OUT: + cfg->dig_out_pin = nid; + break; + case AC_JACK_SPDIF_IN: + cfg->dig_in_pin = nid; + break; + } + } + + /* sort by sequence */ + for (i = 0; i < cfg->line_outs; i++) + for (j = i + 1; j < cfg->line_outs; j++) + if (sequences[i] > sequences[j]) { + seq = sequences[i]; + sequences[i] = sequences[j]; + sequences[j] = seq; + nid = cfg->line_out_pins[i]; + cfg->line_out_pins[i] = cfg->line_out_pins[j]; + cfg->line_out_pins[j] = nid; + } + + /* Reorder the surround channels + * ALSA sequence is front/surr/clfe/side + * HDA sequence is: + * 4-ch: front/surr => OK as it is + * 6-ch: front/clfe/surr + * 8-ch: front/clfe/side/surr + */ + switch (cfg->line_outs) { + case 3: + nid = cfg->line_out_pins[1]; + cfg->line_out_pins[1] = cfg->line_out_pins[2]; + cfg->line_out_pins[2] = nid; + break; + case 4: + nid = cfg->line_out_pins[1]; + cfg->line_out_pins[1] = cfg->line_out_pins[3]; + cfg->line_out_pins[3] = cfg->line_out_pins[2]; + cfg->line_out_pins[2] = nid; + break; + } + + /* + * debug prints of the parsed results + */ + snd_printd("autoconfig: line_outs=%d (0x%x/0x%x/0x%x/0x%x/0x%x)\n", + cfg->line_outs, cfg->line_out_pins[0], cfg->line_out_pins[1], + cfg->line_out_pins[2], cfg->line_out_pins[3], + cfg->line_out_pins[4]); + snd_printd(" speaker_outs=%d (0x%x/0x%x/0x%x/0x%x/0x%x)\n", + cfg->speaker_outs, cfg->speaker_pins[0], + cfg->speaker_pins[1], cfg->speaker_pins[2], + cfg->speaker_pins[3], cfg->speaker_pins[4]); + snd_printd(" hp=0x%x, dig_out=0x%x, din_in=0x%x\n", + cfg->hp_pin, cfg->dig_out_pin, cfg->dig_in_pin); + snd_printd(" inputs: mic=0x%x, fmic=0x%x, line=0x%x, fline=0x%x," + " cd=0x%x, aux=0x%x\n", + cfg->input_pins[AUTO_PIN_MIC], + cfg->input_pins[AUTO_PIN_FRONT_MIC], + cfg->input_pins[AUTO_PIN_LINE], + cfg->input_pins[AUTO_PIN_FRONT_LINE], + cfg->input_pins[AUTO_PIN_CD], + cfg->input_pins[AUTO_PIN_AUX]); + + /* + * FIX-UP: if no line-outs are detected, try to use speaker or HP pin + * as a primary output + */ + if (! cfg->line_outs) { + if (cfg->speaker_outs) { + cfg->line_outs = cfg->speaker_outs; + memcpy(cfg->line_out_pins, cfg->speaker_pins, + sizeof(cfg->speaker_pins)); + cfg->speaker_outs = 0; + memset(cfg->speaker_pins, 0, sizeof(cfg->speaker_pins)); + } else if (cfg->hp_pin) { + cfg->line_outs = 1; + cfg->line_out_pins[0] = cfg->hp_pin; + cfg->hp_pin = 0; + } + } + + return 0; +} + +/* labels for input pins */ +const char *auto_pin_cfg_labels[AUTO_PIN_LAST] = { + "Mic", "Front Mic", "Line", "Front Line", "CD", "Aux" +}; + + #ifdef CONFIG_PM /* * power management @@ -1738,10 +2178,15 @@ int snd_hda_suspend(struct hda_bus *bus, pm_message_t state) struct hda_codec *codec = list_entry(p, struct hda_codec, list); if (codec->patch_ops.suspend) codec->patch_ops.suspend(codec, state); + hda_set_power_state(codec, + codec->afg ? codec->afg : codec->mfg, + AC_PWRST_D3); } return 0; } +EXPORT_SYMBOL(snd_hda_suspend); + /** * snd_hda_resume - resume the codecs * @bus: the HDA bus @@ -1755,24 +2200,29 @@ int snd_hda_resume(struct hda_bus *bus) list_for_each(p, &bus->codec_list) { struct hda_codec *codec = list_entry(p, struct hda_codec, list); + hda_set_power_state(codec, + codec->afg ? codec->afg : codec->mfg, + AC_PWRST_D0); if (codec->patch_ops.resume) codec->patch_ops.resume(codec); } return 0; } +EXPORT_SYMBOL(snd_hda_resume); + /** * snd_hda_resume_ctls - resume controls in the new control list * @codec: the HDA codec - * @knew: the array of snd_kcontrol_new_t + * @knew: the array of struct snd_kcontrol_new * - * This function resumes the mixer controls in the snd_kcontrol_new_t array, + * This function resumes the mixer controls in the struct snd_kcontrol_new array, * originally for snd_hda_add_new_ctls(). * The array must be terminated with an empty entry as terminator. */ -int snd_hda_resume_ctls(struct hda_codec *codec, snd_kcontrol_new_t *knew) +int snd_hda_resume_ctls(struct hda_codec *codec, struct snd_kcontrol_new *knew) { - snd_ctl_elem_value_t *val; + struct snd_ctl_elem_value *val; val = kmalloc(sizeof(*val), GFP_KERNEL); if (! val) @@ -1820,25 +2270,6 @@ int snd_hda_resume_spdif_in(struct hda_codec *codec) } #endif -/* - * symbols exported for controller modules - */ -EXPORT_SYMBOL(snd_hda_codec_read); -EXPORT_SYMBOL(snd_hda_codec_write); -EXPORT_SYMBOL(snd_hda_sequence_write); -EXPORT_SYMBOL(snd_hda_get_sub_nodes); -EXPORT_SYMBOL(snd_hda_queue_unsol_event); -EXPORT_SYMBOL(snd_hda_bus_new); -EXPORT_SYMBOL(snd_hda_codec_new); -EXPORT_SYMBOL(snd_hda_codec_setup_stream); -EXPORT_SYMBOL(snd_hda_calc_stream_format); -EXPORT_SYMBOL(snd_hda_build_pcms); -EXPORT_SYMBOL(snd_hda_build_controls); -#ifdef CONFIG_PM -EXPORT_SYMBOL(snd_hda_suspend); -EXPORT_SYMBOL(snd_hda_resume); -#endif - /* * INIT part */ diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 9dd541df6..79d63c99f 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -82,6 +82,7 @@ MODULE_SUPPORTED_DEVICE("{{Intel, ICH6}," "{Intel, ICH8}," "{ATI, SB450}," "{ATI, SB600}," + "{ATI, RS600}," "{VIA, VT8251}," "{VIA, VT8237A}," "{SiS, SIS966}," @@ -167,6 +168,12 @@ enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 }; #define ULI_PLAYBACK_INDEX 5 #define ULI_NUM_PLAYBACK 6 +/* ATI HDMI has 1 playback and 0 capture */ +#define ATIHDMI_CAPTURE_INDEX 0 +#define ATIHDMI_NUM_CAPTURE 0 +#define ATIHDMI_PLAYBACK_INDEX 0 +#define ATIHDMI_NUM_PLAYBACK 1 + /* this number is statically defined for simplicity */ #define MAX_AZX_DEV 16 @@ -331,6 +338,7 @@ struct azx { enum { AZX_DRIVER_ICH, AZX_DRIVER_ATI, + AZX_DRIVER_ATIHDMI, AZX_DRIVER_VIA, AZX_DRIVER_SIS, AZX_DRIVER_ULI, @@ -340,6 +348,7 @@ enum { static char *driver_short_names[] __devinitdata = { [AZX_DRIVER_ICH] = "HDA Intel", [AZX_DRIVER_ATI] = "HDA ATI SB", + [AZX_DRIVER_ATIHDMI] = "HDA ATI HDMI", [AZX_DRIVER_VIA] = "HDA VIA VT82xx", [AZX_DRIVER_SIS] = "HDA SIS966", [AZX_DRIVER_ULI] = "HDA ULI M5461", @@ -1477,7 +1486,7 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, goto errout; } - if (request_irq(pci->irq, azx_interrupt, SA_INTERRUPT|SA_SHIRQ, + if (request_irq(pci->irq, azx_interrupt, IRQF_DISABLED|IRQF_SHARED, "HDA Intel", (void*)chip)) { snd_printk(KERN_ERR SFX "unable to grab IRQ %d\n", pci->irq); err = -EBUSY; @@ -1495,6 +1504,12 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, chip->playback_index_offset = ULI_PLAYBACK_INDEX; chip->capture_index_offset = ULI_CAPTURE_INDEX; break; + case AZX_DRIVER_ATIHDMI: + chip->playback_streams = ATIHDMI_NUM_PLAYBACK; + chip->capture_streams = ATIHDMI_NUM_CAPTURE; + chip->playback_index_offset = ATIHDMI_PLAYBACK_INDEX; + chip->capture_index_offset = ATIHDMI_CAPTURE_INDEX; + break; default: chip->playback_streams = ICH6_NUM_PLAYBACK; chip->capture_streams = ICH6_NUM_CAPTURE; @@ -1614,13 +1629,14 @@ static void __devexit azx_remove(struct pci_dev *pci) } /* PCI IDs */ -static struct pci_device_id azx_ids[] __devinitdata = { +static struct pci_device_id azx_ids[] = { { 0x8086, 0x2668, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ICH }, /* ICH6 */ { 0x8086, 0x27d8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ICH }, /* ICH7 */ { 0x8086, 0x269a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ICH }, /* ESB2 */ { 0x8086, 0x284b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ICH }, /* ICH8 */ { 0x1002, 0x437b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ATI }, /* ATI SB450 */ { 0x1002, 0x4383, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ATI }, /* ATI SB600 */ + { 0x1002, 0x793b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ATIHDMI }, /* ATI RS600 HDMI */ { 0x1106, 0x3288, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_VIA }, /* VIA VT8251/VT8237A */ { 0x1039, 0x7502, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_SIS }, /* SIS966 */ { 0x10b9, 0x5461, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ULI }, /* ULI M5461 */ diff --git a/sound/pci/hda/hda_patch.h b/sound/pci/hda/hda_patch.h index cf6abce42..0b668793f 100644 --- a/sound/pci/hda/hda_patch.h +++ b/sound/pci/hda/hda_patch.h @@ -8,10 +8,19 @@ extern struct hda_codec_preset snd_hda_preset_realtek[]; extern struct hda_codec_preset snd_hda_preset_cmedia[]; /* Analog Devices codecs */ extern struct hda_codec_preset snd_hda_preset_analog[]; +/* SigmaTel codecs */ +extern struct hda_codec_preset snd_hda_preset_sigmatel[]; +/* SiLabs 3054/3055 modem codecs */ +extern struct hda_codec_preset snd_hda_preset_si3054[]; +/* ATI HDMI codecs */ +extern struct hda_codec_preset snd_hda_preset_atihdmi[]; static const struct hda_codec_preset *hda_preset_tables[] = { snd_hda_preset_realtek, snd_hda_preset_cmedia, snd_hda_preset_analog, + snd_hda_preset_sigmatel, + snd_hda_preset_si3054, + snd_hda_preset_atihdmi, NULL }; diff --git a/sound/pci/hda/hda_proc.c b/sound/pci/hda/hda_proc.c index 4d5db7faa..c2f0fe85b 100644 --- a/sound/pci/hda/hda_proc.c +++ b/sound/pci/hda/hda_proc.c @@ -26,6 +26,7 @@ #include #include #include "hda_codec.h" +#include "hda_local.h" static const char *get_wid_type_name(unsigned int wid_value) { @@ -47,7 +48,7 @@ static const char *get_wid_type_name(unsigned int wid_value) return "UNKOWN Widget"; } -static void print_amp_caps(snd_info_buffer_t *buffer, +static void print_amp_caps(struct snd_info_buffer *buffer, struct hda_codec *codec, hda_nid_t nid, int dir) { unsigned int caps; @@ -66,26 +67,32 @@ static void print_amp_caps(snd_info_buffer_t *buffer, (caps & AC_AMPCAP_MUTE) >> AC_AMPCAP_MUTE_SHIFT); } -static void print_amp_vals(snd_info_buffer_t *buffer, +static void print_amp_vals(struct snd_info_buffer *buffer, struct hda_codec *codec, hda_nid_t nid, - int dir, int stereo) + int dir, int stereo, int indices) { unsigned int val; - if (stereo) { + int i; + + if (dir == HDA_OUTPUT) + dir = AC_AMP_GET_OUTPUT; + else + dir = AC_AMP_GET_INPUT; + for (i = 0; i < indices; i++) { + snd_iprintf(buffer, " ["); + if (stereo) { + val = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_AMP_GAIN_MUTE, + AC_AMP_GET_LEFT | dir | i); + snd_iprintf(buffer, "0x%02x ", val); + } val = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_AMP_GAIN_MUTE, - AC_AMP_GET_LEFT | - (dir == HDA_OUTPUT ? AC_AMP_GET_OUTPUT : - AC_AMP_GET_INPUT)); - snd_iprintf(buffer, "0x%02x ", val); + AC_AMP_GET_RIGHT | dir | i); + snd_iprintf(buffer, "0x%02x]", val); } - val = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_AMP_GAIN_MUTE, - AC_AMP_GET_RIGHT | - (dir == HDA_OUTPUT ? AC_AMP_GET_OUTPUT : - AC_AMP_GET_INPUT)); - snd_iprintf(buffer, "0x%02x\n", val); + snd_iprintf(buffer, "\n"); } -static void print_pcm_caps(snd_info_buffer_t *buffer, +static void print_pcm_caps(struct snd_info_buffer *buffer, struct hda_codec *codec, hda_nid_t nid) { unsigned int pcm = snd_hda_param_read(codec, nid, AC_PAR_PCM); @@ -154,9 +161,10 @@ static const char *get_jack_color(u32 cfg) return "UNKNOWN"; } -static void print_pin_caps(snd_info_buffer_t *buffer, +static void print_pin_caps(struct snd_info_buffer *buffer, struct hda_codec *codec, hda_nid_t nid) { + static char *jack_conns[4] = { "Jack", "N/A", "Fixed", "Both" }; static char *jack_types[16] = { "Line Out", "Speaker", "HP Out", "CD", "SPDIF Out", "Digital Out", "Modem Line", "Modem Hand", @@ -174,9 +182,14 @@ static void print_pin_caps(snd_info_buffer_t *buffer, snd_iprintf(buffer, " OUT"); if (caps & AC_PINCAP_HP_DRV) snd_iprintf(buffer, " HP"); + if (caps & AC_PINCAP_EAPD) + snd_iprintf(buffer, " EAPD"); + if (caps & AC_PINCAP_PRES_DETECT) + snd_iprintf(buffer, " Detect"); snd_iprintf(buffer, "\n"); caps = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONFIG_DEFAULT, 0); - snd_iprintf(buffer, " Pin Default 0x%08x: %s at %s %s\n", caps, + snd_iprintf(buffer, " Pin Default 0x%08x: [%s] %s at %s %s\n", caps, + jack_conns[(caps & AC_DEFCFG_PORT_CONN) >> AC_DEFCFG_PORT_CONN_SHIFT], jack_types[(caps & AC_DEFCFG_DEVICE) >> AC_DEFCFG_DEVICE_SHIFT], jack_locations[(caps >> (AC_DEFCFG_LOCATION_SHIFT + 4)) & 3], get_jack_location(caps)); @@ -186,7 +199,7 @@ static void print_pin_caps(snd_info_buffer_t *buffer, } -static void print_codec_info(snd_info_entry_t *entry, snd_info_buffer_t *buffer) +static void print_codec_info(struct snd_info_entry *entry, struct snd_info_buffer *buffer) { struct hda_codec *codec = entry->private_data; char buf[32]; @@ -199,6 +212,8 @@ static void print_codec_info(snd_info_entry_t *entry, snd_info_buffer_t *buffer) snd_iprintf(buffer, "Vendor Id: 0x%x\n", codec->vendor_id); snd_iprintf(buffer, "Subsystem Id: 0x%x\n", codec->subsystem_id); snd_iprintf(buffer, "Revision Id: 0x%x\n", codec->revision_id); + if (! codec->afg) + return; snd_iprintf(buffer, "Default PCM: "); print_pcm_caps(buffer, codec, codec->afg); snd_iprintf(buffer, "Default Amp-In caps: "); @@ -215,6 +230,9 @@ static void print_codec_info(snd_info_entry_t *entry, snd_info_buffer_t *buffer) unsigned int wid_caps = snd_hda_param_read(codec, nid, AC_PAR_AUDIO_WIDGET_CAP); unsigned int wid_type = (wid_caps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; + int conn_len = 0; + hda_nid_t conn[HDA_MAX_CONNECTIONS]; + snd_iprintf(buffer, "Node 0x%02x [%s] wcaps 0x%x:", nid, get_wid_type_name(wid_type), wid_caps); if (wid_caps & AC_WCAP_STEREO) @@ -229,19 +247,23 @@ static void print_codec_info(snd_info_entry_t *entry, snd_info_buffer_t *buffer) snd_iprintf(buffer, " Amp-Out"); snd_iprintf(buffer, "\n"); + if (wid_caps & AC_WCAP_CONN_LIST) + conn_len = snd_hda_get_connections(codec, nid, conn, + HDA_MAX_CONNECTIONS); + if (wid_caps & AC_WCAP_IN_AMP) { snd_iprintf(buffer, " Amp-In caps: "); print_amp_caps(buffer, codec, nid, HDA_INPUT); snd_iprintf(buffer, " Amp-In vals: "); print_amp_vals(buffer, codec, nid, HDA_INPUT, - wid_caps & AC_WCAP_STEREO); + wid_caps & AC_WCAP_STEREO, conn_len); } if (wid_caps & AC_WCAP_OUT_AMP) { snd_iprintf(buffer, " Amp-Out caps: "); print_amp_caps(buffer, codec, nid, HDA_OUTPUT); snd_iprintf(buffer, " Amp-Out vals: "); print_amp_vals(buffer, codec, nid, HDA_OUTPUT, - wid_caps & AC_WCAP_STEREO); + wid_caps & AC_WCAP_STEREO, 1); } if (wid_type == AC_WID_PIN) { @@ -264,15 +286,23 @@ static void print_codec_info(snd_info_entry_t *entry, snd_info_buffer_t *buffer) print_pcm_caps(buffer, codec, nid); } + if (wid_caps & AC_WCAP_POWER) + snd_iprintf(buffer, " Power: 0x%x\n", + snd_hda_codec_read(codec, nid, 0, + AC_VERB_GET_POWER_STATE, 0)); + if (wid_caps & AC_WCAP_CONN_LIST) { - hda_nid_t conn[HDA_MAX_CONNECTIONS]; - int c, conn_len; - conn_len = snd_hda_get_connections(codec, nid, conn, - HDA_MAX_CONNECTIONS); + int c, curr = -1; + if (conn_len > 1 && wid_type != AC_WID_AUD_MIX) + curr = snd_hda_codec_read(codec, nid, 0, + AC_VERB_GET_CONNECT_SEL, 0); snd_iprintf(buffer, " Connection: %d\n", conn_len); snd_iprintf(buffer, " "); - for (c = 0; c < conn_len; c++) + for (c = 0; c < conn_len; c++) { snd_iprintf(buffer, " 0x%02x", conn[c]); + if (c == curr) + snd_iprintf(buffer, "*"); + } snd_iprintf(buffer, "\n"); } } @@ -284,7 +314,7 @@ static void print_codec_info(snd_info_entry_t *entry, snd_info_buffer_t *buffer) int snd_hda_codec_proc_new(struct hda_codec *codec) { char name[32]; - snd_info_entry_t *entry; + struct snd_info_entry *entry; int err; snprintf(name, sizeof(name), "codec#%d", codec->addr); @@ -292,7 +322,7 @@ int snd_hda_codec_proc_new(struct hda_codec *codec) if (err < 0) return err; - snd_info_set_text_ops(entry, codec, 32 * 1024, print_codec_info); + snd_info_set_text_ops(entry, codec, print_codec_info); return 0; } diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index d7343dc82..6823f2bc1 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c @@ -789,6 +789,8 @@ static struct hda_board_config ad1986a_cfg_tbl[] = { { .modelname = "3stack", .config = AD1986A_3STACK }, { .pci_subvendor = 0x10de, .pci_subdevice = 0xcb84, .config = AD1986A_3STACK }, /* ASUS A8N-VM CSM */ + { .pci_subvendor = 0x1043, .pci_subdevice = 0x81b3, + .config = AD1986A_3STACK }, /* ASUS P5RD2-VM / P5GPL-X SE */ { .modelname = "laptop", .config = AD1986A_LAPTOP }, { .pci_subvendor = 0x144d, .pci_subdevice = 0xc01e, .config = AD1986A_LAPTOP }, /* FSC V2060 */ @@ -797,6 +799,8 @@ static struct hda_board_config ad1986a_cfg_tbl[] = { { .pci_subvendor = 0x1043, .pci_subdevice = 0x818f, .config = AD1986A_LAPTOP }, /* ASUS P5GV-MX */ { .modelname = "laptop-eapd", .config = AD1986A_LAPTOP_EAPD }, + { .pci_subvendor = 0x144d, .pci_subdevice = 0xc023, + .config = AD1986A_LAPTOP_EAPD }, /* Samsung X60 Chane */ { .pci_subvendor = 0x144d, .pci_subdevice = 0xc024, .config = AD1986A_LAPTOP_EAPD }, /* Samsung R65-T2300 Charis */ { .pci_subvendor = 0x1043, .pci_subdevice = 0x1153, @@ -809,6 +813,8 @@ static struct hda_board_config ad1986a_cfg_tbl[] = { .config = AD1986A_LAPTOP_EAPD }, /* ASUS Z62F */ { .pci_subvendor = 0x103c, .pci_subdevice = 0x30af, .config = AD1986A_LAPTOP_EAPD }, /* HP Compaq Presario B2800 */ + { .pci_subvendor = 0x17aa, .pci_subdevice = 0x2066, + .config = AD1986A_LAPTOP_EAPD }, /* Lenovo 3000 N100-07684JU */ {} }; @@ -963,7 +969,7 @@ static struct snd_kcontrol_new ad1983_mixers[] = { }, { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Route", + .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source", .info = ad1983_spdif_route_info, .get = ad1983_spdif_route_get, .put = ad1983_spdif_route_put, @@ -1103,7 +1109,7 @@ static struct snd_kcontrol_new ad1981_mixers[] = { /* identical with AD1983 */ { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Route", + .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source", .info = ad1983_spdif_route_info, .get = ad1983_spdif_route_get, .put = ad1983_spdif_route_put, @@ -1329,13 +1335,60 @@ static int ad1981_hp_init(struct hda_codec *codec) return 0; } +/* configuration for Lenovo Thinkpad T60 */ +static struct snd_kcontrol_new ad1981_thinkpad_mixers[] = { + HDA_CODEC_VOLUME("Master Playback Volume", 0x05, 0x0, HDA_OUTPUT), + HDA_CODEC_MUTE("Master Playback Switch", 0x05, 0x0, HDA_OUTPUT), + HDA_CODEC_VOLUME("PCM Playback Volume", 0x11, 0x0, HDA_OUTPUT), + HDA_CODEC_MUTE("PCM Playback Switch", 0x11, 0x0, HDA_OUTPUT), + HDA_CODEC_VOLUME("Mic Playback Volume", 0x12, 0x0, HDA_OUTPUT), + HDA_CODEC_MUTE("Mic Playback Switch", 0x12, 0x0, HDA_OUTPUT), + HDA_CODEC_VOLUME("CD Playback Volume", 0x1d, 0x0, HDA_OUTPUT), + HDA_CODEC_MUTE("CD Playback Switch", 0x1d, 0x0, HDA_OUTPUT), + HDA_CODEC_VOLUME("Mic Boost", 0x08, 0x0, HDA_INPUT), + HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT), + HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT), + { + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, + .name = "Capture Source", + .info = ad198x_mux_enum_info, + .get = ad198x_mux_enum_get, + .put = ad198x_mux_enum_put, + }, + /* identical with AD1983 */ + { + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, + .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source", + .info = ad1983_spdif_route_info, + .get = ad1983_spdif_route_get, + .put = ad1983_spdif_route_put, + }, + { } /* end */ +}; + +static struct hda_input_mux ad1981_thinkpad_capture_source = { + .num_items = 3, + .items = { + { "Mic", 0x0 }, + { "Mix", 0x2 }, + { "CD", 0x4 }, + }, +}; + /* models */ -enum { AD1981_BASIC, AD1981_HP }; +enum { AD1981_BASIC, AD1981_HP, AD1981_THINKPAD }; static struct hda_board_config ad1981_cfg_tbl[] = { { .modelname = "hp", .config = AD1981_HP }, /* All HP models */ { .pci_subvendor = 0x103c, .config = AD1981_HP }, + { .pci_subvendor = 0x30b0, .pci_subdevice = 0x103c, + .config = AD1981_HP }, /* HP nx6320 (reversed SSID, H/W bug) */ + { .modelname = "thinkpad", .config = AD1981_THINKPAD }, + /* Lenovo Thinkpad T60/X60/Z6xx */ + { .pci_subvendor = 0x17aa, .config = AD1981_THINKPAD }, + { .pci_subvendor = 0x1014, .pci_subdevice = 0x0597, + .config = AD1981_THINKPAD }, /* Z60m/t */ { .modelname = "basic", .config = AD1981_BASIC }, {} }; @@ -1381,6 +1434,10 @@ static int patch_ad1981(struct hda_codec *codec) codec->patch_ops.init = ad1981_hp_init; codec->patch_ops.unsol_event = ad1981_hp_unsol_event; break; + case AD1981_THINKPAD: + spec->mixers[0] = ad1981_thinkpad_mixers; + spec->input_mux = &ad1981_thinkpad_capture_source; + break; } return 0; diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 94cf292d9..18d105263 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -78,6 +78,7 @@ enum { enum { ALC262_BASIC, ALC262_FUJITSU, + ALC262_HP_BPC, ALC262_AUTO, ALC262_MODEL_LAST /* last tag */ }; @@ -85,6 +86,7 @@ enum { /* ALC861 models */ enum { ALC861_3ST, + ALC660_3ST, ALC861_3ST_DIG, ALC861_6ST_DIG, ALC861_AUTO, @@ -99,6 +101,17 @@ enum { ALC882_MODEL_LAST, }; +/* ALC883 models */ +enum { + ALC883_3ST_2ch_DIG, + ALC883_3ST_6ch_DIG, + ALC883_3ST_6ch, + ALC883_6ST_DIG, + ALC888_DEMO_BOARD, + ALC883_AUTO, + ALC883_MODEL_LAST, +}; + /* for GPIO Poll */ #define GPIO_MASK 0x03 @@ -108,7 +121,8 @@ struct alc_spec { unsigned int num_mixers; const struct hda_verb *init_verbs[5]; /* initialization verbs - * don't forget NULL termination! + * don't forget NULL + * termination! */ unsigned int num_init_verbs; @@ -163,7 +177,9 @@ struct alc_spec { * configuration template - to be copied to the spec instance */ struct alc_config_preset { - struct snd_kcontrol_new *mixers[5]; /* should be identical size with spec */ + struct snd_kcontrol_new *mixers[5]; /* should be identical size + * with spec + */ const struct hda_verb *init_verbs[5]; unsigned int num_dacs; hda_nid_t *dac_nids; @@ -184,7 +200,8 @@ struct alc_config_preset { /* * input MUX handling */ -static int alc_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) +static int alc_mux_enum_info(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct alc_spec *spec = codec->spec; @@ -194,7 +211,8 @@ static int alc_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_ return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo); } -static int alc_mux_enum_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) +static int alc_mux_enum_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct alc_spec *spec = codec->spec; @@ -204,21 +222,24 @@ static int alc_mux_enum_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_v return 0; } -static int alc_mux_enum_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) +static int alc_mux_enum_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct alc_spec *spec = codec->spec; unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); unsigned int mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx; return snd_hda_input_mux_put(codec, &spec->input_mux[mux_idx], ucontrol, - spec->adc_nids[adc_idx], &spec->cur_mux[adc_idx]); + spec->adc_nids[adc_idx], + &spec->cur_mux[adc_idx]); } /* * channel mode setting */ -static int alc_ch_mode_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) +static int alc_ch_mode_info(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct alc_spec *spec = codec->spec; @@ -226,20 +247,24 @@ static int alc_ch_mode_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_i spec->num_channel_mode); } -static int alc_ch_mode_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) +static int alc_ch_mode_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct alc_spec *spec = codec->spec; return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode, - spec->num_channel_mode, spec->multiout.max_channels); + spec->num_channel_mode, + spec->multiout.max_channels); } -static int alc_ch_mode_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) +static int alc_ch_mode_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct alc_spec *spec = codec->spec; return snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode, - spec->num_channel_mode, &spec->multiout.max_channels); + spec->num_channel_mode, + &spec->multiout.max_channels); } /* @@ -290,7 +315,8 @@ static signed char alc_pin_mode_dir_info[5][2] = { #define alc_pin_mode_n_items(_dir) \ (alc_pin_mode_max(_dir)-alc_pin_mode_min(_dir)+1) -static int alc_pin_mode_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) +static int alc_pin_mode_info(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) { unsigned int item_num = uinfo->value.enumerated.item; unsigned char dir = (kcontrol->private_value >> 16) & 0xff; @@ -305,40 +331,46 @@ static int alc_pin_mode_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_ return 0; } -static int alc_pin_mode_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) +static int alc_pin_mode_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { unsigned int i; struct hda_codec *codec = snd_kcontrol_chip(kcontrol); hda_nid_t nid = kcontrol->private_value & 0xffff; unsigned char dir = (kcontrol->private_value >> 16) & 0xff; long *valp = ucontrol->value.integer.value; - unsigned int pinctl = snd_hda_codec_read(codec,nid,0,AC_VERB_GET_PIN_WIDGET_CONTROL,0x00); + unsigned int pinctl = snd_hda_codec_read(codec, nid, 0, + AC_VERB_GET_PIN_WIDGET_CONTROL, + 0x00); /* Find enumerated value for current pinctl setting */ i = alc_pin_mode_min(dir); - while (alc_pin_mode_values[i]!=pinctl && i<=alc_pin_mode_max(dir)) + while (alc_pin_mode_values[i] != pinctl && i <= alc_pin_mode_max(dir)) i++; - *valp = i<=alc_pin_mode_max(dir)?i:alc_pin_mode_min(dir); + *valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir); return 0; } -static int alc_pin_mode_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) +static int alc_pin_mode_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { signed int change; struct hda_codec *codec = snd_kcontrol_chip(kcontrol); hda_nid_t nid = kcontrol->private_value & 0xffff; unsigned char dir = (kcontrol->private_value >> 16) & 0xff; long val = *ucontrol->value.integer.value; - unsigned int pinctl = snd_hda_codec_read(codec,nid,0,AC_VERB_GET_PIN_WIDGET_CONTROL,0x00); + unsigned int pinctl = snd_hda_codec_read(codec, nid, 0, + AC_VERB_GET_PIN_WIDGET_CONTROL, + 0x00); - if (valalc_pin_mode_max(dir)) + if (val < alc_pin_mode_min(dir) || val > alc_pin_mode_max(dir)) val = alc_pin_mode_min(dir); change = pinctl != alc_pin_mode_values[val]; if (change) { /* Set pin mode to that requested */ snd_hda_codec_write(codec,nid,0,AC_VERB_SET_PIN_WIDGET_CONTROL, - alc_pin_mode_values[val]); + alc_pin_mode_values[val]); /* Also enable the retasking pin's input/output as required * for the requested pin mode. Enum values of 2 or less are @@ -351,15 +383,19 @@ static int alc_pin_mode_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_v * this turns out to be necessary in the future. */ if (val <= 2) { - snd_hda_codec_write(codec,nid,0,AC_VERB_SET_AMP_GAIN_MUTE, - AMP_OUT_MUTE); - snd_hda_codec_write(codec,nid,0,AC_VERB_SET_AMP_GAIN_MUTE, - AMP_IN_UNMUTE(0)); + snd_hda_codec_write(codec, nid, 0, + AC_VERB_SET_AMP_GAIN_MUTE, + AMP_OUT_MUTE); + snd_hda_codec_write(codec, nid, 0, + AC_VERB_SET_AMP_GAIN_MUTE, + AMP_IN_UNMUTE(0)); } else { - snd_hda_codec_write(codec,nid,0,AC_VERB_SET_AMP_GAIN_MUTE, - AMP_IN_MUTE(0)); - snd_hda_codec_write(codec,nid,0,AC_VERB_SET_AMP_GAIN_MUTE, - AMP_OUT_UNMUTE); + snd_hda_codec_write(codec, nid, 0, + AC_VERB_SET_AMP_GAIN_MUTE, + AMP_IN_MUTE(0)); + snd_hda_codec_write(codec, nid, 0, + AC_VERB_SET_AMP_GAIN_MUTE, + AMP_OUT_UNMUTE); } } return change; @@ -378,7 +414,8 @@ static int alc_pin_mode_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_v * needed for any "production" models. */ #ifdef CONFIG_SND_DEBUG -static int alc_gpio_data_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) +static int alc_gpio_data_info(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) { uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; uinfo->count = 1; @@ -386,33 +423,38 @@ static int alc_gpio_data_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem uinfo->value.integer.max = 1; return 0; } -static int alc_gpio_data_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) +static int alc_gpio_data_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); hda_nid_t nid = kcontrol->private_value & 0xffff; unsigned char mask = (kcontrol->private_value >> 16) & 0xff; long *valp = ucontrol->value.integer.value; - unsigned int val = snd_hda_codec_read(codec,nid,0,AC_VERB_GET_GPIO_DATA,0x00); + unsigned int val = snd_hda_codec_read(codec, nid, 0, + AC_VERB_GET_GPIO_DATA, 0x00); *valp = (val & mask) != 0; return 0; } -static int alc_gpio_data_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) +static int alc_gpio_data_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { signed int change; struct hda_codec *codec = snd_kcontrol_chip(kcontrol); hda_nid_t nid = kcontrol->private_value & 0xffff; unsigned char mask = (kcontrol->private_value >> 16) & 0xff; long val = *ucontrol->value.integer.value; - unsigned int gpio_data = snd_hda_codec_read(codec,nid,0,AC_VERB_GET_GPIO_DATA,0x00); + unsigned int gpio_data = snd_hda_codec_read(codec, nid, 0, + AC_VERB_GET_GPIO_DATA, + 0x00); /* Set/unset the masked GPIO bit(s) as needed */ - change = (val==0?0:mask) != (gpio_data & mask); - if (val==0) + change = (val == 0 ? 0 : mask) != (gpio_data & mask); + if (val == 0) gpio_data &= ~mask; else gpio_data |= mask; - snd_hda_codec_write(codec,nid,0,AC_VERB_SET_GPIO_DATA,gpio_data); + snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_GPIO_DATA, gpio_data); return change; } @@ -432,7 +474,8 @@ static int alc_gpio_data_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_ * necessary. */ #ifdef CONFIG_SND_DEBUG -static int alc_spdif_ctrl_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) +static int alc_spdif_ctrl_info(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) { uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; uinfo->count = 1; @@ -440,33 +483,39 @@ static int alc_spdif_ctrl_info(struct snd_kcontrol *kcontrol, struct snd_ctl_ele uinfo->value.integer.max = 1; return 0; } -static int alc_spdif_ctrl_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) +static int alc_spdif_ctrl_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); hda_nid_t nid = kcontrol->private_value & 0xffff; unsigned char mask = (kcontrol->private_value >> 16) & 0xff; long *valp = ucontrol->value.integer.value; - unsigned int val = snd_hda_codec_read(codec,nid,0,AC_VERB_GET_DIGI_CONVERT,0x00); + unsigned int val = snd_hda_codec_read(codec, nid, 0, + AC_VERB_GET_DIGI_CONVERT, 0x00); *valp = (val & mask) != 0; return 0; } -static int alc_spdif_ctrl_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) +static int alc_spdif_ctrl_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { signed int change; struct hda_codec *codec = snd_kcontrol_chip(kcontrol); hda_nid_t nid = kcontrol->private_value & 0xffff; unsigned char mask = (kcontrol->private_value >> 16) & 0xff; long val = *ucontrol->value.integer.value; - unsigned int ctrl_data = snd_hda_codec_read(codec,nid,0,AC_VERB_GET_DIGI_CONVERT,0x00); + unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0, + AC_VERB_GET_DIGI_CONVERT, + 0x00); /* Set/unset the masked control bit(s) as needed */ - change = (val==0?0:mask) != (ctrl_data & mask); + change = (val == 0 ? 0 : mask) != (ctrl_data & mask); if (val==0) ctrl_data &= ~mask; else ctrl_data |= mask; - snd_hda_codec_write(codec,nid,0,AC_VERB_SET_DIGI_CONVERT_1,ctrl_data); + snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1, + ctrl_data); return change; } @@ -481,14 +530,17 @@ static int alc_spdif_ctrl_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem /* * set up from the preset table */ -static void setup_preset(struct alc_spec *spec, const struct alc_config_preset *preset) +static void setup_preset(struct alc_spec *spec, + const struct alc_config_preset *preset) { int i; for (i = 0; i < ARRAY_SIZE(preset->mixers) && preset->mixers[i]; i++) spec->mixers[spec->num_mixers++] = preset->mixers[i]; - for (i = 0; i < ARRAY_SIZE(preset->init_verbs) && preset->init_verbs[i]; i++) - spec->init_verbs[spec->num_init_verbs++] = preset->init_verbs[i]; + for (i = 0; i < ARRAY_SIZE(preset->init_verbs) && preset->init_verbs[i]; + i++) + spec->init_verbs[spec->num_init_verbs++] = + preset->init_verbs[i]; spec->channel_mode = preset->channel_mode; spec->num_channel_mode = preset->num_channel_mode; @@ -517,8 +569,8 @@ static void setup_preset(struct alc_spec *spec, const struct alc_config_preset * * ALC880 3-stack model * * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0e) - * Pin assignment: Front = 0x14, Line-In/Surr = 0x1a, Mic/CLFE = 0x18, F-Mic = 0x1b - * HP = 0x19 + * Pin assignment: Front = 0x14, Line-In/Surr = 0x1a, Mic/CLFE = 0x18, + * F-Mic = 0x1b, HP = 0x19 */ static hda_nid_t alc880_dac_nids[4] = { @@ -662,7 +714,8 @@ static struct snd_kcontrol_new alc880_capture_alt_mixer[] = { /* * ALC880 5-stack model * - * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0d), Side = 0x02 (0xd) + * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0d), + * Side = 0x02 (0xd) * Pin assignment: Front = 0x14, Surr = 0x17, CLFE = 0x16 * Line-In/Side = 0x1a, Mic = 0x18, F-Mic = 0x1b, HP = 0x19 */ @@ -700,7 +753,8 @@ static struct hda_channel_mode alc880_fivestack_modes[2] = { /* * ALC880 6-stack model * - * DAC: Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e), Side = 0x05 (0x0f) + * DAC: Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e), + * Side = 0x05 (0x0f) * Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, Side = 0x17, * Mic = 0x18, F-Mic = 0x19, Line = 0x1a, HP = 0x1b */ @@ -811,7 +865,8 @@ static struct snd_kcontrol_new alc880_w810_base_mixer[] = { * Z710V model * * DAC: Front = 0x02 (0x0c), HP = 0x03 (0x0d) - * Pin assignment: Front = 0x14, HP = 0x15, Mic = 0x18, Mic2 = 0x19(?), Line = 0x1a + * Pin assignment: Front = 0x14, HP = 0x15, Mic = 0x18, Mic2 = 0x19(?), + * Line = 0x1a */ static hda_nid_t alc880_z71v_dac_nids[1] = { @@ -966,7 +1021,8 @@ static int alc_build_controls(struct hda_codec *codec) } if (spec->multiout.dig_out_nid) { - err = snd_hda_create_spdif_out_ctls(codec, spec->multiout.dig_out_nid); + err = snd_hda_create_spdif_out_ctls(codec, + spec->multiout.dig_out_nid); if (err < 0) return err; } @@ -999,8 +1055,8 @@ static struct hda_verb alc880_volume_init_verbs[] = { /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback * mixer widget - * Note: PASD motherboards uses the Line In 2 as the input for front panel - * mic (mic 2) + * Note: PASD motherboards uses the Line In 2 as the input for front + * panel mic (mic 2) */ /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, @@ -1154,8 +1210,8 @@ static struct hda_verb alc880_pin_z71v_init_verbs[] = { /* * 6-stack pin configuration: - * front = 0x14, surr = 0x15, clfe = 0x16, side = 0x17, mic = 0x18, f-mic = 0x19, - * line = 0x1a, HP = 0x1b + * front = 0x14, surr = 0x15, clfe = 0x16, side = 0x17, mic = 0x18, + * f-mic = 0x19, line = 0x1a, HP = 0x1b */ static struct hda_verb alc880_pin_6stack_init_verbs[] = { {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ @@ -1587,8 +1643,8 @@ static int alc880_playback_pcm_prepare(struct hda_pcm_stream *hinfo, struct snd_pcm_substream *substream) { struct alc_spec *spec = codec->spec; - return snd_hda_multi_out_analog_prepare(codec, &spec->multiout, stream_tag, - format, substream); + return snd_hda_multi_out_analog_prepare(codec, &spec->multiout, + stream_tag, format, substream); } static int alc880_playback_pcm_cleanup(struct hda_pcm_stream *hinfo, @@ -1640,7 +1696,8 @@ static int alc880_capture_pcm_cleanup(struct hda_pcm_stream *hinfo, { struct alc_spec *spec = codec->spec; - snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number], 0, 0, 0); + snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number], + 0, 0, 0); return 0; } @@ -1822,7 +1879,8 @@ static struct hda_channel_mode alc880_test_modes[4] = { { 8, NULL }, }; -static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) +static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) { static char *texts[] = { "N/A", "Line Out", "HP Out", @@ -1837,7 +1895,8 @@ static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol, struct snd_ctl_e return 0; } -static int alc_test_pin_ctl_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) +static int alc_test_pin_ctl_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); hda_nid_t nid = (hda_nid_t)kcontrol->private_value; @@ -1863,7 +1922,8 @@ static int alc_test_pin_ctl_get(struct snd_kcontrol *kcontrol, struct snd_ctl_el return 0; } -static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) +static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); hda_nid_t nid = (hda_nid_t)kcontrol->private_value; @@ -1881,15 +1941,18 @@ static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol, struct snd_ctl_el AC_VERB_GET_PIN_WIDGET_CONTROL, 0); new_ctl = ctls[ucontrol->value.enumerated.item[0]]; if (old_ctl != new_ctl) { - snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, new_ctl); + snd_hda_codec_write(codec, nid, 0, + AC_VERB_SET_PIN_WIDGET_CONTROL, new_ctl); snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, - ucontrol->value.enumerated.item[0] >= 3 ? 0xb080 : 0xb000); + (ucontrol->value.enumerated.item[0] >= 3 ? + 0xb080 : 0xb000)); return 1; } return 0; } -static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) +static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) { static char *texts[] = { "Front", "Surround", "CLFE", "Side" @@ -1903,7 +1966,8 @@ static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol, struct snd_ctl_e return 0; } -static int alc_test_pin_src_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) +static int alc_test_pin_src_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); hda_nid_t nid = (hda_nid_t)kcontrol->private_value; @@ -1914,7 +1978,8 @@ static int alc_test_pin_src_get(struct snd_kcontrol *kcontrol, struct snd_ctl_el return 0; } -static int alc_test_pin_src_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) +static int alc_test_pin_src_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); hda_nid_t nid = (hda_nid_t)kcontrol->private_value; @@ -2174,6 +2239,7 @@ static struct hda_board_config alc880_cfg_tbl[] = { { .modelname = "lg", .config = ALC880_LG }, { .pci_subvendor = 0x1854, .pci_subdevice = 0x003b, .config = ALC880_LG }, + { .pci_subvendor = 0x1854, .pci_subdevice = 0x0068, .config = ALC880_LG }, { .modelname = "lg-lw", .config = ALC880_LG_LW }, { .pci_subvendor = 0x1854, .pci_subdevice = 0x0018, .config = ALC880_LG_LW }, @@ -2738,7 +2804,8 @@ static int patch_alc880(struct hda_codec *codec) board_config = snd_hda_check_board_config(codec, alc880_cfg_tbl); if (board_config < 0 || board_config >= ALC880_MODEL_LAST) { - printk(KERN_INFO "hda_codec: Unknown model for ALC880, trying auto-probe from BIOS...\n"); + printk(KERN_INFO "hda_codec: Unknown model for ALC880, " + "trying auto-probe from BIOS...\n"); board_config = ALC880_AUTO; } @@ -2749,7 +2816,9 @@ static int patch_alc880(struct hda_codec *codec) alc_free(codec); return err; } else if (! err) { - printk(KERN_INFO "hda_codec: Cannot set up configuration from BIOS. Using 3-stack mode...\n"); + printk(KERN_INFO + "hda_codec: Cannot set up configuration " + "from BIOS. Using 3-stack mode...\n"); board_config = ALC880_3ST; } } @@ -3105,6 +3174,7 @@ static struct hda_verb alc260_init_verbs[] = { { } }; +#if 0 /* should be identical with alc260_init_verbs? */ static struct hda_verb alc260_hp_init_verbs[] = { /* Headphone and output */ {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, @@ -3151,6 +3221,7 @@ static struct hda_verb alc260_hp_init_verbs[] = { {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, { } }; +#endif static struct hda_verb alc260_hp_3013_init_verbs[] = { /* Line out and output */ @@ -3822,6 +3893,10 @@ static struct hda_board_config alc260_cfg_tbl[] = { { .modelname = "basic", .config = ALC260_BASIC }, { .pci_subvendor = 0x104d, .pci_subdevice = 0x81bb, .config = ALC260_BASIC }, /* Sony VAIO */ + { .pci_subvendor = 0x104d, .pci_subdevice = 0x81cc, + .config = ALC260_BASIC }, /* Sony VAIO VGN-S3HP */ + { .pci_subvendor = 0x104d, .pci_subdevice = 0x81cd, + .config = ALC260_BASIC }, /* Sony VAIO */ { .pci_subvendor = 0x152d, .pci_subdevice = 0x0729, .config = ALC260_BASIC }, /* CTL Travel Master U553W */ { .modelname = "hp", .config = ALC260_HP }, @@ -3862,7 +3937,7 @@ static struct alc_config_preset alc260_presets[] = { .mixers = { alc260_base_output_mixer, alc260_input_mixer, alc260_capture_alt_mixer }, - .init_verbs = { alc260_hp_init_verbs }, + .init_verbs = { alc260_init_verbs }, .num_dacs = ARRAY_SIZE(alc260_dac_nids), .dac_nids = alc260_dac_nids, .num_adc_nids = ARRAY_SIZE(alc260_hp_adc_nids), @@ -3940,7 +4015,8 @@ static int patch_alc260(struct hda_codec *codec) board_config = snd_hda_check_board_config(codec, alc260_cfg_tbl); if (board_config < 0 || board_config >= ALC260_MODEL_LAST) { - snd_printd(KERN_INFO "hda_codec: Unknown model for ALC260\n"); + snd_printd(KERN_INFO "hda_codec: Unknown model for ALC260, " + "trying auto-probe from BIOS...\n"); board_config = ALC260_AUTO; } @@ -3951,7 +4027,9 @@ static int patch_alc260(struct hda_codec *codec) alc_free(codec); return err; } else if (! err) { - printk(KERN_INFO "hda_codec: Cannot set up configuration from BIOS. Using base mode...\n"); + printk(KERN_INFO + "hda_codec: Cannot set up configuration " + "from BIOS. Using base mode...\n"); board_config = ALC260_BASIC; } } @@ -4094,21 +4172,6 @@ static struct snd_kcontrol_new alc882_base_mixer[] = { HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT), HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT), - HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT), - HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT), - HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x08, 0x0, HDA_INPUT), - HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x08, 0x0, HDA_INPUT), - HDA_CODEC_VOLUME_IDX("Capture Volume", 2, 0x09, 0x0, HDA_INPUT), - HDA_CODEC_MUTE_IDX("Capture Switch", 2, 0x09, 0x0, HDA_INPUT), - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - /* .name = "Capture Source", */ - .name = "Input Source", - .count = 3, - .info = alc882_mux_enum_info, - .get = alc882_mux_enum_get, - .put = alc882_mux_enum_put, - }, { } /* end */ }; @@ -4328,9 +4391,12 @@ static struct snd_kcontrol_new alc882_capture_mixer[] = { static struct hda_board_config alc882_cfg_tbl[] = { { .modelname = "3stack-dig", .config = ALC882_3ST_DIG }, { .modelname = "6stack-dig", .config = ALC882_6ST_DIG }, - { .pci_subvendor = 0x1462, .pci_subdevice = 0x6668, .config = ALC882_6ST_DIG }, /* MSI */ - { .pci_subvendor = 0x105b, .pci_subdevice = 0x6668, .config = ALC882_6ST_DIG }, /* Foxconn */ - { .pci_subvendor = 0x1019, .pci_subdevice = 0x6668, .config = ALC882_6ST_DIG }, /* ECS */ + { .pci_subvendor = 0x1462, .pci_subdevice = 0x6668, + .config = ALC882_6ST_DIG }, /* MSI */ + { .pci_subvendor = 0x105b, .pci_subdevice = 0x6668, + .config = ALC882_6ST_DIG }, /* Foxconn */ + { .pci_subvendor = 0x1019, .pci_subdevice = 0x6668, + .config = ALC882_6ST_DIG }, /* ECS to Intel*/ { .modelname = "auto", .config = ALC882_AUTO }, {} }; @@ -4342,8 +4408,6 @@ static struct alc_config_preset alc882_presets[] = { .num_dacs = ARRAY_SIZE(alc882_dac_nids), .dac_nids = alc882_dac_nids, .dig_out_nid = ALC882_DIGOUT_NID, - .num_adc_nids = ARRAY_SIZE(alc882_adc_nids), - .adc_nids = alc882_adc_nids, .dig_in_nid = ALC882_DIGIN_NID, .num_channel_mode = ARRAY_SIZE(alc882_ch_modes), .channel_mode = alc882_ch_modes, @@ -4355,8 +4419,6 @@ static struct alc_config_preset alc882_presets[] = { .num_dacs = ARRAY_SIZE(alc882_dac_nids), .dac_nids = alc882_dac_nids, .dig_out_nid = ALC882_DIGOUT_NID, - .num_adc_nids = ARRAY_SIZE(alc882_adc_nids), - .adc_nids = alc882_adc_nids, .dig_in_nid = ALC882_DIGIN_NID, .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes), .channel_mode = alc882_sixstack_modes, @@ -4451,10 +4513,6 @@ static void alc882_auto_init(struct hda_codec *codec) alc882_auto_init_analog_input(codec); } -/* - * ALC882 Headphone poll in 3.5.1a or 3.5.2 - */ - static int patch_alc882(struct hda_codec *codec) { struct alc_spec *spec; @@ -4469,7 +4527,8 @@ static int patch_alc882(struct hda_codec *codec) board_config = snd_hda_check_board_config(codec, alc882_cfg_tbl); if (board_config < 0 || board_config >= ALC882_MODEL_LAST) { - printk(KERN_INFO "hda_codec: Unknown model for ALC882, trying auto-probe from BIOS...\n"); + printk(KERN_INFO "hda_codec: Unknown model for ALC882, " + "trying auto-probe from BIOS...\n"); board_config = ALC882_AUTO; } @@ -4480,7 +4539,9 @@ static int patch_alc882(struct hda_codec *codec) alc_free(codec); return err; } else if (! err) { - printk(KERN_INFO "hda_codec: Cannot set up configuration from BIOS. Using base mode...\n"); + printk(KERN_INFO + "hda_codec: Cannot set up configuration " + "from BIOS. Using base mode...\n"); board_config = ALC882_3ST_DIG; } } @@ -4521,144 +4582,823 @@ static int patch_alc882(struct hda_codec *codec) } /* - * ALC262 support + * ALC883 support + * + * ALC883 is almost identical with ALC880 but has cleaner and more flexible + * configuration. Each pin widget can choose any input DACs and a mixer. + * Each ADC is connected from a mixer of all inputs. This makes possible + * 6-channel independent captures. + * + * In addition, an independent DAC for the multi-playback (not used in this + * driver yet). */ +#define ALC883_DIGOUT_NID 0x06 +#define ALC883_DIGIN_NID 0x0a -#define ALC262_DIGOUT_NID ALC880_DIGOUT_NID -#define ALC262_DIGIN_NID ALC880_DIGIN_NID - -#define alc262_dac_nids alc260_dac_nids -#define alc262_adc_nids alc882_adc_nids -#define alc262_adc_nids_alt alc882_adc_nids_alt +static hda_nid_t alc883_dac_nids[4] = { + /* front, rear, clfe, rear_surr */ + 0x02, 0x04, 0x03, 0x05 +}; -#define alc262_modes alc260_modes -#define alc262_capture_source alc882_capture_source +static hda_nid_t alc883_adc_nids[2] = { + /* ADC1-2 */ + 0x08, 0x09, +}; +/* input MUX */ +/* FIXME: should be a matrix-type input source selection */ -static struct snd_kcontrol_new alc262_base_mixer[] = { - HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), - HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), - HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), - HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), - HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), - HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), - HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), - HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), - HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), - /* HDA_CODEC_VOLUME("PC Beep Playback Volume", 0x0b, 0x05, HDA_INPUT), - HDA_CODEC_MUTE("PC Beelp Playback Switch", 0x0b, 0x05, HDA_INPUT), */ - HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT), - HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), - HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), - HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT), - { } /* end */ +static struct hda_input_mux alc883_capture_source = { + .num_items = 4, + .items = { + { "Mic", 0x0 }, + { "Front Mic", 0x1 }, + { "Line", 0x2 }, + { "CD", 0x4 }, + }, }; +#define alc883_mux_enum_info alc_mux_enum_info +#define alc883_mux_enum_get alc_mux_enum_get -#define alc262_capture_mixer alc882_capture_mixer -#define alc262_capture_alt_mixer alc882_capture_alt_mixer +static int alc883_mux_enum_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct hda_codec *codec = snd_kcontrol_chip(kcontrol); + struct alc_spec *spec = codec->spec; + const struct hda_input_mux *imux = spec->input_mux; + unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); + static hda_nid_t capture_mixers[3] = { 0x24, 0x23, 0x22 }; + hda_nid_t nid = capture_mixers[adc_idx]; + unsigned int *cur_val = &spec->cur_mux[adc_idx]; + unsigned int i, idx; + idx = ucontrol->value.enumerated.item[0]; + if (idx >= imux->num_items) + idx = imux->num_items - 1; + if (*cur_val == idx && ! codec->in_resume) + return 0; + for (i = 0; i < imux->num_items; i++) { + unsigned int v = (i == idx) ? 0x7000 : 0x7080; + snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, + v | (imux->items[i].index << 8)); + } + *cur_val = idx; + return 1; +} /* - * generic initialization of ADC, input mixers and output mixers + * 2ch mode */ -static struct hda_verb alc262_init_verbs[] = { - /* - * Unmute ADC0-2 and set the default input to mic-in - */ - {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, - {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, - {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, - {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, - {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, - {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, - - /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback - * mixer widget - * Note: PASD motherboards uses the Line In 2 as the input for front panel - * mic (mic 2) - */ - /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ - {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, - {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, - {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, - {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, - {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)}, - - /* - * Set up output mixers (0x0c - 0x0e) - */ - /* set vol=0 to output mixers */ - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, - {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, - {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, - /* set up input amps for analog loopback */ - /* Amp Indices: DAC = 0, mixer = 1 */ - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, - {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, - {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, - {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, - {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, +static struct hda_channel_mode alc883_3ST_2ch_modes[1] = { + { 2, NULL } +}; - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, - {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, - {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, - {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, - {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, +/* + * 2ch mode + */ +static struct hda_verb alc883_3ST_ch2_init[] = { + { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, + { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, + { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, + { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, + { } /* end */ +}; - {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, - {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, - {0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, - {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, - {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, - - {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, - {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, - - /* FIXME: use matrix-type input source selection */ - /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ - /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, - {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, - /* Input mixer2 */ - {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, - {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, - {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, - {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, - /* Input mixer3 */ - {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, - {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, - {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, - {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, +/* + * 6ch mode + */ +static struct hda_verb alc883_3ST_ch6_init[] = { + { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, + { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, + { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 }, + { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, + { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, + { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, + { } /* end */ +}; - { } +static struct hda_channel_mode alc883_3ST_6ch_modes[2] = { + { 2, alc883_3ST_ch2_init }, + { 6, alc883_3ST_ch6_init }, }; /* - * fujitsu model - * 0x14 = headphone/spdif-out, 0x15 = internal speaker + * 6ch mode */ +static struct hda_verb alc883_sixstack_ch6_init[] = { + { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, + { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, + { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, + { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, + { } /* end */ +}; -#define ALC_HP_EVENT 0x37 +/* + * 8ch mode + */ +static struct hda_verb alc883_sixstack_ch8_init[] = { + { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, + { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, + { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, + { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, + { } /* end */ +}; -static struct hda_verb alc262_fujitsu_unsol_verbs[] = { - {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT}, - {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, - {} +static struct hda_channel_mode alc883_sixstack_modes[2] = { + { 6, alc883_sixstack_ch6_init }, + { 8, alc883_sixstack_ch8_init }, }; -static struct hda_input_mux alc262_fujitsu_capture_source = { - .num_items = 2, - .items = { - { "Mic", 0x0 }, - { "CD", 0x4 }, +/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17 + * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b + */ + +static struct snd_kcontrol_new alc883_base_mixer[] = { + HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), + HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), + HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), + HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), + HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), + HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), + HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), + HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), + HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), + HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), + HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), + HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), + HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), + HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), + HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), + HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), + HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), + HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), + HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), + HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT), + HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT), + HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT), + HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT), + HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x09, 0x0, HDA_INPUT), + HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x09, 0x0, HDA_INPUT), + { + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, + /* .name = "Capture Source", */ + .name = "Input Source", + .count = 2, + .info = alc883_mux_enum_info, + .get = alc883_mux_enum_get, + .put = alc883_mux_enum_put, }, + { } /* end */ }; -/* mute/unmute internal speaker according to the hp jack and mute state */ -static void alc262_fujitsu_automute(struct hda_codec *codec, int force) +static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = { + HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), + HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), + HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), + HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), + HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), + HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), + HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), + HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), + HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), + HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), + HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), + HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT), + HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT), + HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT), + HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT), + HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x09, 0x0, HDA_INPUT), + HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x09, 0x0, HDA_INPUT), + { + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, + /* .name = "Capture Source", */ + .name = "Input Source", + .count = 2, + .info = alc883_mux_enum_info, + .get = alc883_mux_enum_get, + .put = alc883_mux_enum_put, + }, + { } /* end */ +}; + +static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = { + HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), + HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), + HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), + HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), + HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), + HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), + HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), + HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), + HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), + HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), + HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), + HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), + HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), + HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), + HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), + HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), + HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), + HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT), + HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT), + HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT), + HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT), + HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x09, 0x0, HDA_INPUT), + HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x09, 0x0, HDA_INPUT), + { + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, + /* .name = "Capture Source", */ + .name = "Input Source", + .count = 2, + .info = alc883_mux_enum_info, + .get = alc883_mux_enum_get, + .put = alc883_mux_enum_put, + }, + { } /* end */ +}; + +static struct snd_kcontrol_new alc883_chmode_mixer[] = { + { + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, + .name = "Channel Mode", + .info = alc_ch_mode_info, + .get = alc_ch_mode_get, + .put = alc_ch_mode_put, + }, + { } /* end */ +}; + +static struct hda_verb alc883_init_verbs[] = { + /* ADC1: mute amp left and right */ + {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, + {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, + /* ADC2: mute amp left and right */ + {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, + {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, + /* Front mixer: unmute input/output amp left and right (volume = 0) */ + {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, + {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, + {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, + /* Rear mixer */ + {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, + {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, + {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, + /* CLFE mixer */ + {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, + {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, + {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, + /* Side mixer */ + {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, + {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, + {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, + + {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, + {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, + {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, + {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)}, + + /* Front Pin: output 0 (0x0c) */ + {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, + {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, + {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, + /* Rear Pin: output 1 (0x0d) */ + {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, + {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, + {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, + /* CLFE Pin: output 2 (0x0e) */ + {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, + {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, + {0x16, AC_VERB_SET_CONNECT_SEL, 0x02}, + /* Side Pin: output 3 (0x0f) */ + {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, + {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, + {0x17, AC_VERB_SET_CONNECT_SEL, 0x03}, + /* Mic (rear) pin: input vref at 80% */ + {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, + {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, + /* Front Mic pin: input vref at 80% */ + {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, + {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, + /* Line In pin: input */ + {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, + {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, + /* Line-2 In: Headphone output (output 0 - 0x0c) */ + {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, + {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, + {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, + /* CD pin widget for input */ + {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, + + /* FIXME: use matrix-type input source selection */ + /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ + /* Input mixer2 */ + {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, + {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, + {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)}, + /* Input mixer3 */ + {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, + {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, + {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)}, + { } +}; + +/* + * generic initialization of ADC, input mixers and output mixers + */ +static struct hda_verb alc883_auto_init_verbs[] = { + /* + * Unmute ADC0-2 and set the default input to mic-in + */ + {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, + {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, + {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + + /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback + * mixer widget + * Note: PASD motherboards uses the Line In 2 as the input for front panel + * mic (mic 2) + */ + /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ + {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, + {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, + {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, + {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)}, + + /* + * Set up output mixers (0x0c - 0x0f) + */ + /* set vol=0 to output mixers */ + {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, + {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, + {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, + {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, + /* set up input amps for analog loopback */ + /* Amp Indices: DAC = 0, mixer = 1 */ + {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, + {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, + {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, + {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, + {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, + + /* FIXME: use matrix-type input source selection */ + /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ + /* Input mixer1 */ + {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, + {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, + //{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, + {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)}, + /* Input mixer2 */ + {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, + {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, + //{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, + {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)}, + + { } +}; + +/* capture mixer elements */ +static struct snd_kcontrol_new alc883_capture_mixer[] = { + HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT), + HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT), + HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x09, 0x0, HDA_INPUT), + HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x09, 0x0, HDA_INPUT), + { + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, + /* The multiple "Capture Source" controls confuse alsamixer + * So call somewhat different.. + * FIXME: the controls appear in the "playback" view! + */ + /* .name = "Capture Source", */ + .name = "Input Source", + .count = 2, + .info = alc882_mux_enum_info, + .get = alc882_mux_enum_get, + .put = alc882_mux_enum_put, + }, + { } /* end */ +}; + +/* pcm configuration: identiacal with ALC880 */ +#define alc883_pcm_analog_playback alc880_pcm_analog_playback +#define alc883_pcm_analog_capture alc880_pcm_analog_capture +#define alc883_pcm_digital_playback alc880_pcm_digital_playback +#define alc883_pcm_digital_capture alc880_pcm_digital_capture + +/* + * configuration and preset + */ +static struct hda_board_config alc883_cfg_tbl[] = { + { .modelname = "3stack-dig", .config = ALC883_3ST_2ch_DIG }, + { .modelname = "6stack-dig", .config = ALC883_6ST_DIG }, + { .modelname = "6stack-dig-demo", .config = ALC888_DEMO_BOARD }, + { .pci_subvendor = 0x1462, .pci_subdevice = 0x6668, + .config = ALC883_6ST_DIG }, /* MSI */ + { .pci_subvendor = 0x105b, .pci_subdevice = 0x6668, + .config = ALC883_6ST_DIG }, /* Foxconn */ + { .pci_subvendor = 0x1019, .pci_subdevice = 0x6668, + .config = ALC883_3ST_6ch_DIG }, /* ECS to Intel*/ + { .pci_subvendor = 0x108e, .pci_subdevice = 0x534d, + .config = ALC883_3ST_6ch }, + { .modelname = "auto", .config = ALC883_AUTO }, + {} +}; + +static struct alc_config_preset alc883_presets[] = { + [ALC883_3ST_2ch_DIG] = { + .mixers = { alc883_3ST_2ch_mixer }, + .init_verbs = { alc883_init_verbs }, + .num_dacs = ARRAY_SIZE(alc883_dac_nids), + .dac_nids = alc883_dac_nids, + .dig_out_nid = ALC883_DIGOUT_NID, + .num_adc_nids = ARRAY_SIZE(alc883_adc_nids), + .adc_nids = alc883_adc_nids, + .dig_in_nid = ALC883_DIGIN_NID, + .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), + .channel_mode = alc883_3ST_2ch_modes, + .input_mux = &alc883_capture_source, + }, + [ALC883_3ST_6ch_DIG] = { + .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, + .init_verbs = { alc883_init_verbs }, + .num_dacs = ARRAY_SIZE(alc883_dac_nids), + .dac_nids = alc883_dac_nids, + .dig_out_nid = ALC883_DIGOUT_NID, + .num_adc_nids = ARRAY_SIZE(alc883_adc_nids), + .adc_nids = alc883_adc_nids, + .dig_in_nid = ALC883_DIGIN_NID, + .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), + .channel_mode = alc883_3ST_6ch_modes, + .input_mux = &alc883_capture_source, + }, + [ALC883_3ST_6ch] = { + .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, + .init_verbs = { alc883_init_verbs }, + .num_dacs = ARRAY_SIZE(alc883_dac_nids), + .dac_nids = alc883_dac_nids, + .num_adc_nids = ARRAY_SIZE(alc883_adc_nids), + .adc_nids = alc883_adc_nids, + .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), + .channel_mode = alc883_3ST_6ch_modes, + .input_mux = &alc883_capture_source, + }, + [ALC883_6ST_DIG] = { + .mixers = { alc883_base_mixer, alc883_chmode_mixer }, + .init_verbs = { alc883_init_verbs }, + .num_dacs = ARRAY_SIZE(alc883_dac_nids), + .dac_nids = alc883_dac_nids, + .dig_out_nid = ALC883_DIGOUT_NID, + .num_adc_nids = ARRAY_SIZE(alc883_adc_nids), + .adc_nids = alc883_adc_nids, + .dig_in_nid = ALC883_DIGIN_NID, + .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), + .channel_mode = alc883_sixstack_modes, + .input_mux = &alc883_capture_source, + }, + [ALC888_DEMO_BOARD] = { + .mixers = { alc883_base_mixer, alc883_chmode_mixer }, + .init_verbs = { alc883_init_verbs }, + .num_dacs = ARRAY_SIZE(alc883_dac_nids), + .dac_nids = alc883_dac_nids, + .dig_out_nid = ALC883_DIGOUT_NID, + .num_adc_nids = ARRAY_SIZE(alc883_adc_nids), + .adc_nids = alc883_adc_nids, + .dig_in_nid = ALC883_DIGIN_NID, + .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), + .channel_mode = alc883_sixstack_modes, + .input_mux = &alc883_capture_source, + }, +}; + + +/* + * BIOS auto configuration + */ +static void alc883_auto_set_output_and_unmute(struct hda_codec *codec, + hda_nid_t nid, int pin_type, + int dac_idx) +{ + /* set as output */ + struct alc_spec *spec = codec->spec; + int idx; + + if (spec->multiout.dac_nids[dac_idx] == 0x25) + idx = 4; + else + idx = spec->multiout.dac_nids[dac_idx] - 2; + + snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, + pin_type); + snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, + AMP_OUT_UNMUTE); + snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx); + +} + +static void alc883_auto_init_multi_out(struct hda_codec *codec) +{ + struct alc_spec *spec = codec->spec; + int i; + + for (i = 0; i <= HDA_SIDE; i++) { + hda_nid_t nid = spec->autocfg.line_out_pins[i]; + if (nid) + alc883_auto_set_output_and_unmute(codec, nid, PIN_OUT, i); + } +} + +static void alc883_auto_init_hp_out(struct hda_codec *codec) +{ + struct alc_spec *spec = codec->spec; + hda_nid_t pin; + + pin = spec->autocfg.hp_pin; + if (pin) /* connect to front */ + /* use dac 0 */ + alc883_auto_set_output_and_unmute(codec, pin, PIN_HP, 0); +} + +#define alc883_is_input_pin(nid) alc880_is_input_pin(nid) +#define ALC883_PIN_CD_NID ALC880_PIN_CD_NID + +static void alc883_auto_init_analog_input(struct hda_codec *codec) +{ + struct alc_spec *spec = codec->spec; + int i; + + for (i = 0; i < AUTO_PIN_LAST; i++) { + hda_nid_t nid = spec->autocfg.input_pins[i]; + if (alc883_is_input_pin(nid)) { + snd_hda_codec_write(codec, nid, 0, + AC_VERB_SET_PIN_WIDGET_CONTROL, + (i <= AUTO_PIN_FRONT_MIC ? + PIN_VREF80 : PIN_IN)); + if (nid != ALC883_PIN_CD_NID) + snd_hda_codec_write(codec, nid, 0, + AC_VERB_SET_AMP_GAIN_MUTE, + AMP_OUT_MUTE); + } + } +} + +/* almost identical with ALC880 parser... */ +static int alc883_parse_auto_config(struct hda_codec *codec) +{ + struct alc_spec *spec = codec->spec; + int err = alc880_parse_auto_config(codec); + + if (err < 0) + return err; + else if (err > 0) + /* hack - override the init verbs */ + spec->init_verbs[0] = alc883_auto_init_verbs; + spec->mixers[spec->num_mixers] = alc883_capture_mixer; + spec->num_mixers++; + return err; +} + +/* additional initialization for auto-configuration model */ +static void alc883_auto_init(struct hda_codec *codec) +{ + alc883_auto_init_multi_out(codec); + alc883_auto_init_hp_out(codec); + alc883_auto_init_analog_input(codec); +} + +static int patch_alc883(struct hda_codec *codec) +{ + struct alc_spec *spec; + int err, board_config; + + spec = kzalloc(sizeof(*spec), GFP_KERNEL); + if (spec == NULL) + return -ENOMEM; + + codec->spec = spec; + + board_config = snd_hda_check_board_config(codec, alc883_cfg_tbl); + if (board_config < 0 || board_config >= ALC883_MODEL_LAST) { + printk(KERN_INFO "hda_codec: Unknown model for ALC883, " + "trying auto-probe from BIOS...\n"); + board_config = ALC883_AUTO; + } + + if (board_config == ALC883_AUTO) { + /* automatic parse from the BIOS config */ + err = alc883_parse_auto_config(codec); + if (err < 0) { + alc_free(codec); + return err; + } else if (! err) { + printk(KERN_INFO + "hda_codec: Cannot set up configuration " + "from BIOS. Using base mode...\n"); + board_config = ALC883_3ST_2ch_DIG; + } + } + + if (board_config != ALC883_AUTO) + setup_preset(spec, &alc883_presets[board_config]); + + spec->stream_name_analog = "ALC883 Analog"; + spec->stream_analog_playback = &alc883_pcm_analog_playback; + spec->stream_analog_capture = &alc883_pcm_analog_capture; + + spec->stream_name_digital = "ALC883 Digital"; + spec->stream_digital_playback = &alc883_pcm_digital_playback; + spec->stream_digital_capture = &alc883_pcm_digital_capture; + + spec->adc_nids = alc883_adc_nids; + spec->num_adc_nids = ARRAY_SIZE(alc883_adc_nids); + + codec->patch_ops = alc_patch_ops; + if (board_config == ALC883_AUTO) + spec->init_hook = alc883_auto_init; + + return 0; +} + +/* + * ALC262 support + */ + +#define ALC262_DIGOUT_NID ALC880_DIGOUT_NID +#define ALC262_DIGIN_NID ALC880_DIGIN_NID + +#define alc262_dac_nids alc260_dac_nids +#define alc262_adc_nids alc882_adc_nids +#define alc262_adc_nids_alt alc882_adc_nids_alt + +#define alc262_modes alc260_modes +#define alc262_capture_source alc882_capture_source + +static struct snd_kcontrol_new alc262_base_mixer[] = { + HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), + HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), + HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), + HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), + HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), + HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), + HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), + HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), + HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), + HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), + /* HDA_CODEC_VOLUME("PC Beep Playback Volume", 0x0b, 0x05, HDA_INPUT), + HDA_CODEC_MUTE("PC Beelp Playback Switch", 0x0b, 0x05, HDA_INPUT), */ + HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT), + HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), + HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), + HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT), + { } /* end */ +}; + +static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = { + HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), + HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT), + HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), + HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), + HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT), + + HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), + HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), + HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), + HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), + HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), + HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), + HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), + HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), + HDA_CODEC_VOLUME("PC Beep Playback Volume", 0x0b, 0x05, HDA_INPUT), + HDA_CODEC_MUTE("PC Beep Playback Switch", 0x0b, 0x05, HDA_INPUT), + HDA_CODEC_VOLUME("AUX IN Playback Volume", 0x0b, 0x06, HDA_INPUT), + HDA_CODEC_MUTE("AUX IN Playback Switch", 0x0b, 0x06, HDA_INPUT), + { } /* end */ +}; + +#define alc262_capture_mixer alc882_capture_mixer +#define alc262_capture_alt_mixer alc882_capture_alt_mixer + +/* + * generic initialization of ADC, input mixers and output mixers + */ +static struct hda_verb alc262_init_verbs[] = { + /* + * Unmute ADC0-2 and set the default input to mic-in + */ + {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, + {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, + {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, + {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + + /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback + * mixer widget + * Note: PASD motherboards uses the Line In 2 as the input for front panel + * mic (mic 2) + */ + /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ + {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, + {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, + {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, + {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)}, + + /* + * Set up output mixers (0x0c - 0x0e) + */ + /* set vol=0 to output mixers */ + {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, + {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, + {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, + /* set up input amps for analog loopback */ + /* Amp Indices: DAC = 0, mixer = 1 */ + {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, + {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, + {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, + + {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, + {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, + {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, + {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, + {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, + {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, + + {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, + {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, + {0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, + {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, + {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, + + {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, + {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, + + /* FIXME: use matrix-type input source selection */ + /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ + /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ + {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, + {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, + {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, + {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, + /* Input mixer2 */ + {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, + {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, + {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, + {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, + /* Input mixer3 */ + {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, + {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, + {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, + {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, + + { } +}; + +/* + * fujitsu model + * 0x14 = headphone/spdif-out, 0x15 = internal speaker + */ + +#define ALC_HP_EVENT 0x37 + +static struct hda_verb alc262_fujitsu_unsol_verbs[] = { + {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT}, + {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, + {} +}; + +static struct hda_input_mux alc262_fujitsu_capture_source = { + .num_items = 2, + .items = { + { "Mic", 0x0 }, + { "CD", 0x4 }, + }, +}; + +static struct hda_input_mux alc262_HP_capture_source = { + .num_items = 5, + .items = { + { "Mic", 0x0 }, + { "Front Mic", 0x3 }, + { "Line", 0x2 }, + { "CD", 0x4 }, + { "AUX IN", 0x6 }, + }, +}; + +/* mute/unmute internal speaker according to the hp jack and mute state */ +static void alc262_fujitsu_automute(struct hda_codec *codec, int force) { struct alc_spec *spec = codec->spec; unsigned int mute; @@ -4880,6 +5620,93 @@ static struct hda_verb alc262_volume_init_verbs[] = { { } }; +static struct hda_verb alc262_HP_BPC_init_verbs[] = { + /* + * Unmute ADC0-2 and set the default input to mic-in + */ + {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, + {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, + {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, + {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + + /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback + * mixer widget + * Note: PASD motherboards uses the Line In 2 as the input for front panel + * mic (mic 2) + */ + /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */ + {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, + {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, + {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, + {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)}, + {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5)}, + {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(6)}, + + /* + * Set up output mixers (0x0c - 0x0e) + */ + /* set vol=0 to output mixers */ + {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, + {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, + {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, + + /* set up input amps for analog loopback */ + /* Amp Indices: DAC = 0, mixer = 1 */ + {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, + {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, + {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, + {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, + + {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, + {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, + {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, + + {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, + {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, + + {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, + {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, + + {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, + {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, + {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, + {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, + {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, + + {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, + {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, + {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, + {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, + {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, + {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, + + + /* FIXME: use matrix-type input source selection */ + /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ + /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ + {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, + {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, + {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, + {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, + /* Input mixer2 */ + {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, + {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, + {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, + {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, + /* Input mixer3 */ + {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, + {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, + {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, + {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, + + { } +}; + /* pcm configuration: identiacal with ALC880 */ #define alc262_pcm_analog_playback alc880_pcm_analog_playback #define alc262_pcm_analog_capture alc880_pcm_analog_capture @@ -4940,7 +5767,16 @@ static void alc262_auto_init(struct hda_codec *codec) static struct hda_board_config alc262_cfg_tbl[] = { { .modelname = "basic", .config = ALC262_BASIC }, { .modelname = "fujitsu", .config = ALC262_FUJITSU }, - { .pci_subvendor = 0x10cf, .pci_subdevice = 0x1397, .config = ALC262_FUJITSU }, + { .pci_subvendor = 0x10cf, .pci_subdevice = 0x1397, + .config = ALC262_FUJITSU }, + { .pci_subvendor = 0x103c, .pci_subdevice = 0x208c, + .config = ALC262_HP_BPC }, /* xw4400 */ + { .pci_subvendor = 0x103c, .pci_subdevice = 0x3014, + .config = ALC262_HP_BPC }, /* xw6400 */ + { .pci_subvendor = 0x103c, .pci_subdevice = 0x3015, + .config = ALC262_HP_BPC }, /* xw8400 */ + { .pci_subvendor = 0x103c, .pci_subdevice = 0x12fe, + .config = ALC262_HP_BPC }, /* xw9400 */ { .modelname = "auto", .config = ALC262_AUTO }, {} }; @@ -4968,6 +5804,16 @@ static struct alc_config_preset alc262_presets[] = { .input_mux = &alc262_fujitsu_capture_source, .unsol_event = alc262_fujitsu_unsol_event, }, + [ALC262_HP_BPC] = { + .mixers = { alc262_HP_BPC_mixer }, + .init_verbs = { alc262_HP_BPC_init_verbs }, + .num_dacs = ARRAY_SIZE(alc262_dac_nids), + .dac_nids = alc262_dac_nids, + .hp_nid = 0x03, + .num_channel_mode = ARRAY_SIZE(alc262_modes), + .channel_mode = alc262_modes, + .input_mux = &alc262_HP_capture_source, + }, }; static int patch_alc262(struct hda_codec *codec) @@ -4993,8 +5839,10 @@ static int patch_alc262(struct hda_codec *codec) #endif board_config = snd_hda_check_board_config(codec, alc262_cfg_tbl); + if (board_config < 0 || board_config >= ALC262_MODEL_LAST) { - printk(KERN_INFO "hda_codec: Unknown model for ALC262, trying auto-probe from BIOS...\n"); + printk(KERN_INFO "hda_codec: Unknown model for ALC262, " + "trying auto-probe from BIOS...\n"); board_config = ALC262_AUTO; } @@ -5005,7 +5853,9 @@ static int patch_alc262(struct hda_codec *codec) alc_free(codec); return err; } else if (! err) { - printk(KERN_INFO "hda_codec: Cannot set up configuration from BIOS. Using base mode...\n"); + printk(KERN_INFO + "hda_codec: Cannot set up configuration " + "from BIOS. Using base mode...\n"); board_config = ALC262_BASIC; } } @@ -5046,7 +5896,6 @@ static int patch_alc262(struct hda_codec *codec) return 0; } - /* * ALC861 channel source setting (2/6 channel selection for 3-stack) */ @@ -5061,9 +5910,11 @@ static struct hda_verb alc861_threestack_ch2_init[] = { /* set pin widget 18h (mic1/2) for input, for mic also enable the vref */ { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, - { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c }, - { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, //mic - { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, //line in + { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c }, +#if 0 + { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/ + { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/ +#endif { } /* end */ }; /* @@ -5077,11 +5928,13 @@ static struct hda_verb alc861_threestack_ch6_init[] = { { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 }, - { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 }, + { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 }, - { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 }, - { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, //mic - { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, //line in + { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 }, +#if 0 + { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/ + { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/ +#endif { } /* end */ }; @@ -5365,6 +6218,11 @@ static hda_nid_t alc861_dac_nids[4] = { 0x03, 0x06, 0x05, 0x04 }; +static hda_nid_t alc660_dac_nids[3] = { + /* front, clfe, surround */ + 0x03, 0x05, 0x06 +}; + static hda_nid_t alc861_adc_nids[1] = { /* ADC0-2 */ 0x08, @@ -5617,7 +6475,10 @@ static void alc861_auto_init(struct hda_codec *codec) */ static struct hda_board_config alc861_cfg_tbl[] = { { .modelname = "3stack", .config = ALC861_3ST }, - { .pci_subvendor = 0x8086, .pci_subdevice = 0xd600, .config = ALC861_3ST }, + { .pci_subvendor = 0x8086, .pci_subdevice = 0xd600, + .config = ALC861_3ST }, + { .pci_subvendor = 0x1043, .pci_subdevice = 0x81e7, + .config = ALC660_3ST }, { .modelname = "3stack-dig", .config = ALC861_3ST_DIG }, { .modelname = "6stack-dig", .config = ALC861_6ST_DIG }, { .modelname = "auto", .config = ALC861_AUTO }, @@ -5660,6 +6521,17 @@ static struct alc_config_preset alc861_presets[] = { .adc_nids = alc861_adc_nids, .input_mux = &alc861_capture_source, }, + [ALC660_3ST] = { + .mixers = { alc861_3ST_mixer }, + .init_verbs = { alc861_threestack_init_verbs }, + .num_dacs = ARRAY_SIZE(alc660_dac_nids), + .dac_nids = alc660_dac_nids, + .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes), + .channel_mode = alc861_threestack_modes, + .num_adc_nids = ARRAY_SIZE(alc861_adc_nids), + .adc_nids = alc861_adc_nids, + .input_mux = &alc861_capture_source, + }, }; @@ -5676,8 +6548,10 @@ static int patch_alc861(struct hda_codec *codec) codec->spec = spec; board_config = snd_hda_check_board_config(codec, alc861_cfg_tbl); + if (board_config < 0 || board_config >= ALC861_MODEL_LAST) { - printk(KERN_INFO "hda_codec: Unknown model for ALC861, trying auto-probe from BIOS...\n"); + printk(KERN_INFO "hda_codec: Unknown model for ALC861, " + "trying auto-probe from BIOS...\n"); board_config = ALC861_AUTO; } @@ -5688,7 +6562,9 @@ static int patch_alc861(struct hda_codec *codec) alc_free(codec); return err; } else if (! err) { - printk(KERN_INFO "hda_codec: Cannot set up configuration from BIOS. Using base mode...\n"); + printk(KERN_INFO + "hda_codec: Cannot set up configuration " + "from BIOS. Using base mode...\n"); board_config = ALC861_3ST_DIG; } } @@ -5719,8 +6595,12 @@ struct hda_codec_preset snd_hda_preset_realtek[] = { { .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 }, { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 }, { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 }, - { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 }, + { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc883 }, { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 }, - { .id = 0x10ec0861, .name = "ALC861", .patch = patch_alc861 }, + { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc883 }, + { .id = 0x10ec0861, .rev = 0x100300, .name = "ALC861", + .patch = patch_alc861 }, + { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660", + .patch = patch_alc861 }, {} /* terminator */ }; diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index d8622951c..ea99083a1 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c @@ -41,6 +41,10 @@ #define STAC_REF 0 #define STAC_D945GTP3 1 #define STAC_D945GTP5 2 +#define STAC_MACMINI 3 +#define STAC_D965_2112 4 +#define STAC_D965_284B 5 +#define STAC_922X_MODELS 6 /* number of 922x models */ struct sigmatel_spec { struct snd_kcontrol_new *mixers[4]; @@ -52,6 +56,7 @@ struct sigmatel_spec { unsigned int mic_switch: 1; unsigned int alt_switch: 1; unsigned int hp_detect: 1; + unsigned int gpio_mute: 1; /* playback */ struct hda_multi_out multiout; @@ -105,10 +110,24 @@ static hda_nid_t stac922x_adc_nids[2] = { 0x06, 0x07, }; +static hda_nid_t stac9227_adc_nids[2] = { + 0x07, 0x08, +}; + +#if 0 +static hda_nid_t d965_2112_dac_nids[3] = { + 0x02, 0x03, 0x05, +}; +#endif + static hda_nid_t stac922x_mux_nids[2] = { 0x12, 0x13, }; +static hda_nid_t stac9227_mux_nids[2] = { + 0x15, 0x16, +}; + static hda_nid_t stac927x_adc_nids[3] = { 0x07, 0x08, 0x09 }; @@ -171,6 +190,24 @@ static struct hda_verb stac922x_core_init[] = { {} }; +static struct hda_verb stac9227_core_init[] = { + /* set master volume and direct control */ + { 0x16, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, + /* unmute node 0x1b */ + { 0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, + {} +}; + +static struct hda_verb d965_2112_core_init[] = { + /* set master volume and direct control */ + { 0x16, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, + /* unmute node 0x1b */ + { 0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, + /* select node 0x03 as DAC */ + { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x01}, + {} +}; + static struct hda_verb stac927x_core_init[] = { /* set master volume and direct control */ { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, @@ -210,6 +247,21 @@ static struct snd_kcontrol_new stac922x_mixer[] = { { } /* end */ }; +/* This needs to be generated dynamically based on sequence */ +static struct snd_kcontrol_new stac9227_mixer[] = { + { + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, + .name = "Input Source", + .count = 1, + .info = stac92xx_mux_enum_info, + .get = stac92xx_mux_enum_get, + .put = stac92xx_mux_enum_put, + }, + HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT), + HDA_CODEC_MUTE("Capture Switch", 0x1b, 0x0, HDA_OUTPUT), + { } /* end */ +}; + static snd_kcontrol_new_t stac927x_mixer[] = { { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, @@ -289,10 +341,18 @@ static unsigned int d945gtp5_pin_configs[10] = { 0x02a19320, 0x40000100, }; -static unsigned int *stac922x_brd_tbl[] = { - ref922x_pin_configs, - d945gtp3_pin_configs, - d945gtp5_pin_configs, +static unsigned int d965_2112_pin_configs[10] = { + 0x0221401f, 0x40000100, 0x40000100, 0x01014011, + 0x01a19021, 0x01813024, 0x01452130, 0x40000100, + 0x02a19320, 0x40000100, +}; + +static unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = { + [STAC_REF] = ref922x_pin_configs, + [STAC_D945GTP3] = d945gtp3_pin_configs, + [STAC_D945GTP5] = d945gtp5_pin_configs, + [STAC_MACMINI] = d945gtp5_pin_configs, + [STAC_D965_2112] = d965_2112_pin_configs, }; static struct hda_board_config stac922x_cfg_tbl[] = { @@ -324,6 +384,15 @@ static struct hda_board_config stac922x_cfg_tbl[] = { { .pci_subvendor = PCI_VENDOR_ID_INTEL, .pci_subdevice = 0x0417, .config = STAC_D945GTP5 }, /* Intel D975XBK - 5 Stack */ + { .pci_subvendor = 0x8384, + .pci_subdevice = 0x7680, + .config = STAC_MACMINI }, /* Apple Mac Mini (early 2006) */ + { .pci_subvendor = PCI_VENDOR_ID_INTEL, + .pci_subdevice = 0x2112, + .config = STAC_D965_2112 }, + { .pci_subvendor = PCI_VENDOR_ID_INTEL, + .pci_subdevice = 0x284b, + .config = STAC_D965_284B }, {} /* terminator */ }; @@ -707,7 +776,8 @@ static int stac92xx_add_dyn_out_pins(struct hda_codec *codec, struct auto_pin_cf * A and B is not supported. */ /* fill in the dac_nids table from the parsed pin configuration */ -static int stac92xx_auto_fill_dac_nids(struct hda_codec *codec, const struct auto_pin_cfg *cfg) +static int stac92xx_auto_fill_dac_nids(struct hda_codec *codec, + const struct auto_pin_cfg *cfg) { struct sigmatel_spec *spec = codec->spec; hda_nid_t nid; @@ -726,10 +796,13 @@ static int stac92xx_auto_fill_dac_nids(struct hda_codec *codec, const struct aut } /* add playback controls from the parsed DAC table */ -static int stac92xx_auto_create_multi_out_ctls(struct sigmatel_spec *spec, const struct auto_pin_cfg *cfg) +static int stac92xx_auto_create_multi_out_ctls(struct sigmatel_spec *spec, + const struct auto_pin_cfg *cfg) { char name[32]; - static const char *chname[4] = { "Front", "Surround", NULL /*CLFE*/, "Side" }; + static const char *chname[4] = { + "Front", "Surround", NULL /*CLFE*/, "Side" + }; hda_nid_t nid; int i, err; @@ -841,6 +914,19 @@ static int stac92xx_auto_create_analog_input_ctls(struct hda_codec *codec, const } } + if (imux->num_items == 1) { + /* + * Set the current input for the muxes. + * The STAC9221 has two input muxes with identical source + * NID lists. Hopefully this won't get confused. + */ + for (i = 0; i < spec->num_muxes; i++) { + snd_hda_codec_write(codec, spec->mux_nids[i], 0, + AC_VERB_SET_CONNECT_SEL, + imux->items[0].index); + } + } + return 0; } @@ -874,10 +960,12 @@ static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out return err; if (! spec->autocfg.line_outs) return 0; /* can't find valid pin config */ + if ((err = stac92xx_add_dyn_out_pins(codec, &spec->autocfg)) < 0) return err; - if ((err = stac92xx_auto_fill_dac_nids(codec, &spec->autocfg)) < 0) - return err; + if (spec->multiout.num_dacs == 0) + if ((err = stac92xx_auto_fill_dac_nids(codec, &spec->autocfg)) < 0) + return err; if ((err = stac92xx_auto_create_multi_out_ctls(spec, &spec->autocfg)) < 0 || (err = stac92xx_auto_create_hp_ctls(codec, &spec->autocfg)) < 0 || @@ -946,6 +1034,45 @@ static int stac9200_parse_auto_config(struct hda_codec *codec) return 1; } +/* + * Early 2006 Intel Macintoshes with STAC9220X5 codecs seem to have a + * funky external mute control using GPIO pins. + */ + +static void stac922x_gpio_mute(struct hda_codec *codec, int pin, int muted) +{ + unsigned int gpiostate, gpiomask, gpiodir; + + gpiostate = snd_hda_codec_read(codec, codec->afg, 0, + AC_VERB_GET_GPIO_DATA, 0); + + if (!muted) + gpiostate |= (1 << pin); + else + gpiostate &= ~(1 << pin); + + gpiomask = snd_hda_codec_read(codec, codec->afg, 0, + AC_VERB_GET_GPIO_MASK, 0); + gpiomask |= (1 << pin); + + gpiodir = snd_hda_codec_read(codec, codec->afg, 0, + AC_VERB_GET_GPIO_DIRECTION, 0); + gpiodir |= (1 << pin); + + /* AppleHDA seems to do this -- WTF is this verb?? */ + snd_hda_codec_write(codec, codec->afg, 0, 0x7e7, 0); + + snd_hda_codec_write(codec, codec->afg, 0, + AC_VERB_SET_GPIO_MASK, gpiomask); + snd_hda_codec_write(codec, codec->afg, 0, + AC_VERB_SET_GPIO_DIRECTION, gpiodir); + + msleep(1); + + snd_hda_codec_write(codec, codec->afg, 0, + AC_VERB_SET_GPIO_DATA, gpiostate); +} + static int stac92xx_init(struct hda_codec *codec) { struct sigmatel_spec *spec = codec->spec; @@ -982,6 +1109,11 @@ static int stac92xx_init(struct hda_codec *codec) stac92xx_auto_set_pinctl(codec, cfg->dig_in_pin, AC_PINCTL_IN_EN); + if (spec->gpio_mute) { + stac922x_gpio_mute(codec, 0, 0); + stac922x_gpio_mute(codec, 1, 0); + } + return 0; } @@ -1131,8 +1263,9 @@ static int patch_stac922x(struct hda_codec *codec) codec->spec = spec; spec->board_config = snd_hda_check_board_config(codec, stac922x_cfg_tbl); if (spec->board_config < 0) - snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC922x, using BIOS defaults\n"); - else { + snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC922x, " + "using BIOS defaults\n"); + else if (stac922x_brd_tbl[spec->board_config] != NULL) { spec->num_pins = 10; spec->pin_nids = stac922x_pin_nids; spec->pin_configs = stac922x_brd_tbl[spec->board_config]; @@ -1147,6 +1280,25 @@ static int patch_stac922x(struct hda_codec *codec) spec->mixer = stac922x_mixer; spec->multiout.dac_nids = spec->dac_nids; + + switch (spec->board_config) { + case STAC_D965_2112: + spec->adc_nids = stac9227_adc_nids; + spec->mux_nids = stac9227_mux_nids; +#if 0 + spec->multiout.dac_nids = d965_2112_dac_nids; + spec->multiout.num_dacs = ARRAY_SIZE(d965_2112_dac_nids); +#endif + spec->init = d965_2112_core_init; + spec->mixer = stac9227_mixer; + break; + case STAC_D965_284B: + spec->adc_nids = stac9227_adc_nids; + spec->mux_nids = stac9227_mux_nids; + spec->init = stac9227_core_init; + spec->mixer = stac9227_mixer; + break; + } err = stac92xx_parse_auto_config(codec, 0x08, 0x09); if (err < 0) { @@ -1154,6 +1306,9 @@ static int patch_stac922x(struct hda_codec *codec) return err; } + if (spec->board_config == STAC_MACMINI) + spec->gpio_mute = 1; + codec->patch_ops = stac92xx_patch_ops; return 0; @@ -1370,6 +1525,12 @@ struct hda_codec_preset snd_hda_preset_sigmatel[] = { { .id = 0x83847681, .name = "STAC9220D/9223D A2", .patch = patch_stac922x }, { .id = 0x83847682, .name = "STAC9221 A2", .patch = patch_stac922x }, { .id = 0x83847683, .name = "STAC9221D A2", .patch = patch_stac922x }, + { .id = 0x83847618, .name = "STAC9227", .patch = patch_stac922x }, + { .id = 0x83847619, .name = "STAC9227", .patch = patch_stac922x }, + { .id = 0x83847616, .name = "STAC9228", .patch = patch_stac922x }, + { .id = 0x83847617, .name = "STAC9228", .patch = patch_stac922x }, + { .id = 0x83847614, .name = "STAC9229", .patch = patch_stac922x }, + { .id = 0x83847615, .name = "STAC9229", .patch = patch_stac922x }, { .id = 0x83847620, .name = "STAC9274", .patch = patch_stac927x }, { .id = 0x83847621, .name = "STAC9274D", .patch = patch_stac927x }, { .id = 0x83847622, .name = "STAC9273X", .patch = patch_stac927x }, diff --git a/sound/pci/ice1712/aureon.c b/sound/pci/ice1712/aureon.c index 336dc489a..9492f3d24 100644 --- a/sound/pci/ice1712/aureon.c +++ b/sound/pci/ice1712/aureon.c @@ -1281,9 +1281,15 @@ static int aureon_set_headphone_amp(struct snd_ice1712 *ice, int enable) tmp2 = tmp = snd_ice1712_gpio_read(ice); if (enable) - tmp |= AUREON_HP_SEL; + if (ice->eeprom.subvendor != VT1724_SUBDEVICE_PRODIGY71LT) + tmp |= AUREON_HP_SEL; + else + tmp |= PRODIGY_HP_SEL; else - tmp &= ~ AUREON_HP_SEL; + if (ice->eeprom.subvendor != VT1724_SUBDEVICE_PRODIGY71LT) + tmp &= ~ AUREON_HP_SEL; + else + tmp &= ~ PRODIGY_HP_SEL; if (tmp != tmp2) { snd_ice1712_gpio_write(ice, tmp); return 1; @@ -2079,16 +2085,16 @@ static unsigned char prodigy71_eeprom[] __devinitdata = { }; static unsigned char prodigy71lt_eeprom[] __devinitdata = { - 0x0b, /* SYSCINF: clock 512, spdif-in/ADC, 4DACs */ + 0x4b, /* SYSCINF: clock 512, spdif-in/ADC, 4DACs */ 0x80, /* ACLINK: I2S */ 0xfc, /* I2S: vol, 96k, 24bit, 192k */ - 0xc3, /* SPDUF: out-en, out-int */ - 0x00, /* GPIO_DIR */ - 0x07, /* GPIO_DIR1 */ - 0x00, /* GPIO_DIR2 */ - 0xff, /* GPIO_MASK */ - 0xf8, /* GPIO_MASK1 */ - 0xff, /* GPIO_MASK2 */ + 0xc3, /* SPDIF: out-en, out-int, spdif-in */ + 0xff, /* GPIO_DIR */ + 0xff, /* GPIO_DIR1 */ + 0x5f, /* GPIO_DIR2 */ + 0x00, /* GPIO_MASK */ + 0x00, /* GPIO_MASK1 */ + 0x00, /* GPIO_MASK2 */ 0x00, /* GPIO_STATE */ 0x00, /* GPIO_STATE1 */ 0x00, /* GPIO_STATE2 */ @@ -2125,7 +2131,7 @@ struct snd_ice1712_card_info snd_vt1724_aureon_cards[] __devinitdata = { .build_controls = aureon_add_controls, .eeprom_size = sizeof(aureon71_eeprom), .eeprom_data = aureon71_eeprom, - .driver = "Aureon71Universe", + .driver = "Aureon71Univ", /* keep in 15 letters */ }, { .subvendor = VT1724_SUBDEVICE_PRODIGY71, diff --git a/sound/pci/ice1712/aureon.h b/sound/pci/ice1712/aureon.h index 98a675228..3b7bea656 100644 --- a/sound/pci/ice1712/aureon.h +++ b/sound/pci/ice1712/aureon.h @@ -58,5 +58,6 @@ extern struct snd_ice1712_card_info snd_vt1724_aureon_cards[]; #define PRODIGY_WM_CS (1 << 8) #define PRODIGY_SPI_MOSI (1 << 10) #define PRODIGY_SPI_CLK (1 << 9) +#define PRODIGY_HP_SEL (1 << 5) #endif /* __SOUND_AUREON_H */ diff --git a/sound/pci/ice1712/ews.c b/sound/pci/ice1712/ews.c index 2c529e741..b135389fe 100644 --- a/sound/pci/ice1712/ews.c +++ b/sound/pci/ice1712/ews.c @@ -1031,6 +1031,9 @@ struct snd_ice1712_card_info snd_ice1712_ews_cards[] __devinitdata = { .model = "dmx6fire", .chip_init = snd_ice1712_ews_init, .build_controls = snd_ice1712_ews_add_controls, + .mpu401_1_name = "MIDI-Front DMX6fire", + .mpu401_2_name = "Wavetable DMX6fire", + .mpu401_2_info_flags = MPU401_INFO_OUTPUT, }, { } /* terminator */ }; diff --git a/sound/pci/ice1712/ice1712.c b/sound/pci/ice1712/ice1712.c index c56793b38..bf20858d9 100644 --- a/sound/pci/ice1712/ice1712.c +++ b/sound/pci/ice1712/ice1712.c @@ -61,7 +61,6 @@ #include #include #include -#include #include #include @@ -107,7 +106,7 @@ module_param_array(dxr_enable, int, NULL, 0444); MODULE_PARM_DESC(dxr_enable, "Enable DXR support for Terratec DMX6FIRE."); -static struct pci_device_id snd_ice1712_ids[] __devinitdata = { +static struct pci_device_id snd_ice1712_ids[] = { { PCI_VENDOR_ID_ICE, PCI_DEVICE_ID_ICE_1712, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* ICE1712 */ { 0, } }; @@ -1596,7 +1595,7 @@ static void __devinit snd_ice1712_proc_init(struct snd_ice1712 * ice) struct snd_info_entry *entry; if (! snd_card_proc_new(ice->card, "ice1712", &entry)) - snd_info_set_text_ops(entry, ice, 1024, snd_ice1712_proc_read); + snd_info_set_text_ops(entry, ice, snd_ice1712_proc_read); } /* @@ -2398,13 +2397,14 @@ static int __devinit snd_ice1712_chip_init(struct snd_ice1712 *ice) udelay(200); outb(ICE1712_NATIVE, ICEREG(ice, CONTROL)); udelay(200); - if (ice->eeprom.subvendor == ICE1712_SUBDEVICE_DMX6FIRE && !ice->dxr_enable) { - /* Limit active ADCs and DACs to 6; */ - /* Note: DXR extension not supported */ - pci_write_config_byte(ice->pci, 0x60, 0x2a); - } else { - pci_write_config_byte(ice->pci, 0x60, ice->eeprom.data[ICE_EEP1_CODEC]); - } + if (ice->eeprom.subvendor == ICE1712_SUBDEVICE_DMX6FIRE && + !ice->dxr_enable) + /* Set eeprom value to limit active ADCs and DACs to 6; + * Also disable AC97 as no hardware in standard 6fire card/box + * Note: DXR extensions are not currently supported + */ + ice->eeprom.data[ICE_EEP1_CODEC] = 0x3a; + pci_write_config_byte(ice->pci, 0x60, ice->eeprom.data[ICE_EEP1_CODEC]); pci_write_config_byte(ice->pci, 0x61, ice->eeprom.data[ICE_EEP1_ACLINK]); pci_write_config_byte(ice->pci, 0x62, ice->eeprom.data[ICE_EEP1_I2SID]); pci_write_config_byte(ice->pci, 0x63, ice->eeprom.data[ICE_EEP1_SPDIF]); @@ -2606,7 +2606,7 @@ static int __devinit snd_ice1712_create(struct snd_card *card, ice->dmapath_port = pci_resource_start(pci, 2); ice->profi_port = pci_resource_start(pci, 3); - if (request_irq(pci->irq, snd_ice1712_interrupt, SA_INTERRUPT|SA_SHIRQ, + if (request_irq(pci->irq, snd_ice1712_interrupt, IRQF_DISABLED|IRQF_SHARED, "ICE1712", ice)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_ice1712_free(ice); @@ -2737,21 +2737,38 @@ static int __devinit snd_ice1712_probe(struct pci_dev *pci, if (! c->no_mpu401) { if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_ICE1712, - ICEREG(ice, MPU1_CTRL), 1, + ICEREG(ice, MPU1_CTRL), + (c->mpu401_1_info_flags | + MPU401_INFO_INTEGRATED), ice->irq, 0, &ice->rmidi[0])) < 0) { snd_card_free(card); return err; } - - if (ice->eeprom.data[ICE_EEP1_CODEC] & ICE1712_CFG_2xMPU401) + if (c->mpu401_1_name) + /* Prefered name available in card_info */ + snprintf(ice->rmidi[0]->name, + sizeof(ice->rmidi[0]->name), + "%s %d", c->mpu401_1_name, card->number); + + if (ice->eeprom.data[ICE_EEP1_CODEC] & ICE1712_CFG_2xMPU401) { + /* 2nd port used */ if ((err = snd_mpu401_uart_new(card, 1, MPU401_HW_ICE1712, - ICEREG(ice, MPU2_CTRL), 1, + ICEREG(ice, MPU2_CTRL), + (c->mpu401_2_info_flags | + MPU401_INFO_INTEGRATED), ice->irq, 0, &ice->rmidi[1])) < 0) { snd_card_free(card); return err; } + if (c->mpu401_2_name) + /* Prefered name available in card_info */ + snprintf(ice->rmidi[1]->name, + sizeof(ice->rmidi[1]->name), + "%s %d", c->mpu401_2_name, + card->number); + } } snd_ice1712_set_input_clock_source(ice, 0); diff --git a/sound/pci/ice1712/ice1712.h b/sound/pci/ice1712/ice1712.h index 053f8e56f..ce27eac40 100644 --- a/sound/pci/ice1712/ice1712.h +++ b/sound/pci/ice1712/ice1712.h @@ -29,6 +29,7 @@ #include #include #include +#include /* @@ -495,6 +496,10 @@ struct snd_ice1712_card_info { int (*chip_init)(struct snd_ice1712 *); int (*build_controls)(struct snd_ice1712 *); unsigned int no_mpu401: 1; + unsigned int mpu401_1_info_flags; + unsigned int mpu401_2_info_flags; + const char *mpu401_1_name; + const char *mpu401_2_name; unsigned int eeprom_size; unsigned char *eeprom_data; }; diff --git a/sound/pci/ice1712/ice1724.c b/sound/pci/ice1712/ice1724.c index b1c007e02..71d6aedc0 100644 --- a/sound/pci/ice1712/ice1724.c +++ b/sound/pci/ice1712/ice1724.c @@ -86,7 +86,7 @@ MODULE_PARM_DESC(model, "Use the given board model."); /* Both VT1720 and VT1724 have the same PCI IDs */ -static struct pci_device_id snd_vt1724_ids[] __devinitdata = { +static struct pci_device_id snd_vt1724_ids[] = { { PCI_VENDOR_ID_ICE, PCI_DEVICE_ID_VT1724, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, { 0, } }; @@ -1293,7 +1293,7 @@ static void __devinit snd_vt1724_proc_init(struct snd_ice1712 * ice) struct snd_info_entry *entry; if (! snd_card_proc_new(ice->card, "ice1724", &entry)) - snd_info_set_text_ops(entry, ice, 1024, snd_vt1724_proc_read); + snd_info_set_text_ops(entry, ice, snd_vt1724_proc_read); } /* @@ -2253,7 +2253,7 @@ static int __devinit snd_vt1724_create(struct snd_card *card, ice->profi_port = pci_resource_start(pci, 1); if (request_irq(pci->irq, snd_vt1724_interrupt, - SA_INTERRUPT|SA_SHIRQ, "ICE1724", ice)) { + IRQF_DISABLED|IRQF_SHARED, "ICE1724", ice)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_vt1724_free(ice); return -EIO; @@ -2388,7 +2388,8 @@ static int __devinit snd_vt1724_probe(struct pci_dev *pci, if (! c->no_mpu401) { if (ice->eeprom.data[ICE_EEP2_SYSCONF] & VT1724_CFG_MPU401) { if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_ICE1712, - ICEREG1724(ice, MPU_CTRL), 1, + ICEREG1724(ice, MPU_CTRL), + MPU401_INFO_INTEGRATED, ice->irq, 0, &ice->rmidi[0])) < 0) { snd_card_free(card); diff --git a/sound/pci/ice1712/pontis.c b/sound/pci/ice1712/pontis.c index d23fb3fc2..0efcad926 100644 --- a/sound/pci/ice1712/pontis.c +++ b/sound/pci/ice1712/pontis.c @@ -680,9 +680,8 @@ static void wm_proc_init(struct snd_ice1712 *ice) { struct snd_info_entry *entry; if (! snd_card_proc_new(ice->card, "wm_codec", &entry)) { - snd_info_set_text_ops(entry, ice, 1024, wm_proc_regs_read); + snd_info_set_text_ops(entry, ice, wm_proc_regs_read); entry->mode |= S_IWUSR; - entry->c.text.write_size = 1024; entry->c.text.write = wm_proc_regs_write; } } @@ -705,9 +704,8 @@ static void cs_proc_regs_read(struct snd_info_entry *entry, struct snd_info_buff static void cs_proc_init(struct snd_ice1712 *ice) { struct snd_info_entry *entry; - if (! snd_card_proc_new(ice->card, "cs_codec", &entry)) { - snd_info_set_text_ops(entry, ice, 1024, cs_proc_regs_read); - } + if (! snd_card_proc_new(ice->card, "cs_codec", &entry)) + snd_info_set_text_ops(entry, ice, cs_proc_regs_read); } diff --git a/sound/pci/ice1712/revo.c b/sound/pci/ice1712/revo.c index b5754b32b..fec9440cb 100644 --- a/sound/pci/ice1712/revo.c +++ b/sound/pci/ice1712/revo.c @@ -87,12 +87,25 @@ static void revo_set_rate_val(struct snd_akm4xxx *ak, unsigned int rate) * initialize the chips on M-Audio Revolution cards */ +static unsigned int revo71_num_stereo_front[] = {2}; +static char *revo71_channel_names_front[] = {"PCM Playback Volume"}; + +static unsigned int revo71_num_stereo_surround[] = {1, 1, 2, 2}; +static char *revo71_channel_names_surround[] = {"PCM Center Playback Volume", "PCM LFE Playback Volume", + "PCM Side Playback Volume", "PCM Rear Playback Volume"}; + +static unsigned int revo51_num_stereo[] = {2, 1, 1, 2}; +static char *revo51_channel_names[] = {"PCM Playback Volume", "PCM Center Playback Volume", + "PCM LFE Playback Volume", "PCM Rear Playback Volume"}; + static struct snd_akm4xxx akm_revo_front __devinitdata = { .type = SND_AK4381, .num_dacs = 2, .ops = { .set_rate_val = revo_set_rate_val - } + }, + .num_stereo = revo71_num_stereo_front, + .channel_names = revo71_channel_names_front }; static struct snd_ak4xxx_private akm_revo_front_priv __devinitdata = { @@ -113,7 +126,9 @@ static struct snd_akm4xxx akm_revo_surround __devinitdata = { .num_dacs = 6, .ops = { .set_rate_val = revo_set_rate_val - } + }, + .num_stereo = revo71_num_stereo_surround, + .channel_names = revo71_channel_names_surround }; static struct snd_ak4xxx_private akm_revo_surround_priv __devinitdata = { @@ -133,7 +148,9 @@ static struct snd_akm4xxx akm_revo51 __devinitdata = { .num_dacs = 6, .ops = { .set_rate_val = revo_set_rate_val - } + }, + .num_stereo = revo51_num_stereo, + .channel_names = revo51_channel_names }; static struct snd_ak4xxx_private akm_revo51_priv __devinitdata = { diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c index 0df760256..6874263f1 100644 --- a/sound/pci/intel8x0.c +++ b/sound/pci/intel8x0.c @@ -66,7 +66,7 @@ MODULE_SUPPORTED_DEVICE("{{Intel,82801AA-ICH}," static int index = SNDRV_DEFAULT_IDX1; /* Index 0-MAX */ static char *id = SNDRV_DEFAULT_STR1; /* ID for this card */ -static int ac97_clock = 0; +static int ac97_clock; static char *ac97_quirk; static int buggy_semaphore; static int buggy_irq = -1; /* auto-check */ @@ -413,7 +413,7 @@ struct intel8x0 { u32 int_sta_mask; /* interrupt status mask */ }; -static struct pci_device_id snd_intel8x0_ids[] __devinitdata = { +static struct pci_device_id snd_intel8x0_ids[] = { { 0x8086, 0x2415, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* 82801AA */ { 0x8086, 0x2425, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* 82901AB */ { 0x8086, 0x2445, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* 82801BA */ @@ -1805,6 +1805,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = { .name = "Dell Optiplex GX270", /* AD1981B */ .type = AC97_TUNE_HP_ONLY }, + { + .subvendor = 0x1028, + .subdevice = 0x014e, + .name = "Dell D800", /* STAC9750/51 */ + .type = AC97_TUNE_HP_ONLY + }, { .subvendor = 0x1028, .subdevice = 0x0163, @@ -1949,6 +1955,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = { .name = "AMD64 Mobo", /* ALC650 */ .type = AC97_TUNE_HP_ONLY }, + { + .subvendor = 0x10f1, + .subdevice = 0x2895, + .name = "Tyan Thunder K8WE", + .type = AC97_TUNE_HP_ONLY + }, { .subvendor = 0x110a, .subdevice = 0x0056, @@ -2469,7 +2481,7 @@ static int intel8x0_resume(struct pci_dev *pci) pci_restore_state(pci); pci_enable_device(pci); pci_set_master(pci); - request_irq(pci->irq, snd_intel8x0_interrupt, SA_INTERRUPT|SA_SHIRQ, + request_irq(pci->irq, snd_intel8x0_interrupt, IRQF_DISABLED|IRQF_SHARED, card->shortname, chip); chip->irq = pci->irq; synchronize_irq(chip->irq); @@ -2645,7 +2657,7 @@ static void __devinit snd_intel8x0_proc_init(struct intel8x0 * chip) struct snd_info_entry *entry; if (! snd_card_proc_new(chip->card, "intel8x0", &entry)) - snd_info_set_text_ops(entry, chip, 1024, snd_intel8x0_proc_read); + snd_info_set_text_ops(entry, chip, snd_intel8x0_proc_read); } #else #define snd_intel8x0_proc_init(x) @@ -2842,7 +2854,7 @@ static int __devinit snd_intel8x0_create(struct snd_card *card, /* request irq after initializaing int_sta_mask, etc */ if (request_irq(pci->irq, snd_intel8x0_interrupt, - SA_INTERRUPT|SA_SHIRQ, card->shortname, chip)) { + IRQF_DISABLED|IRQF_SHARED, card->shortname, chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_intel8x0_free(chip); return -EBUSY; diff --git a/sound/pci/intel8x0m.c b/sound/pci/intel8x0m.c index 720635f0c..91850281f 100644 --- a/sound/pci/intel8x0m.c +++ b/sound/pci/intel8x0m.c @@ -59,7 +59,7 @@ MODULE_SUPPORTED_DEVICE("{{Intel,82801AA-ICH}," static int index = -2; /* Exclude the first card */ static char *id = SNDRV_DEFAULT_STR1; /* ID for this card */ -static int ac97_clock = 0; +static int ac97_clock; module_param(index, int, 0444); MODULE_PARM_DESC(index, "Index value for Intel i8x0 modemcard."); @@ -224,7 +224,7 @@ struct intel8x0m { unsigned int pcm_pos_shift; }; -static struct pci_device_id snd_intel8x0m_ids[] __devinitdata = { +static struct pci_device_id snd_intel8x0m_ids[] = { { 0x8086, 0x2416, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* 82801AA */ { 0x8086, 0x2426, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* 82901AB */ { 0x8086, 0x2446, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* 82801BA */ @@ -1092,7 +1092,7 @@ static void __devinit snd_intel8x0m_proc_init(struct intel8x0m * chip) struct snd_info_entry *entry; if (! snd_card_proc_new(chip->card, "intel8x0m", &entry)) - snd_info_set_text_ops(entry, chip, 1024, snd_intel8x0m_proc_read); + snd_info_set_text_ops(entry, chip, snd_intel8x0m_proc_read); } #else /* !CONFIG_PROC_FS */ #define snd_intel8x0m_proc_init(chip) @@ -1185,7 +1185,7 @@ static int __devinit snd_intel8x0m_create(struct snd_card *card, } port_inited: - if (request_irq(pci->irq, snd_intel8x0_interrupt, SA_INTERRUPT|SA_SHIRQ, + if (request_irq(pci->irq, snd_intel8x0_interrupt, IRQF_DISABLED|IRQF_SHARED, card->shortname, chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_intel8x0_free(chip); diff --git a/sound/pci/korg1212/korg1212.c b/sound/pci/korg1212/korg1212.c index e39fad1a4..cfea51f44 100644 --- a/sound/pci/korg1212/korg1212.c +++ b/sound/pci/korg1212/korg1212.c @@ -424,7 +424,7 @@ module_param_array(enable, bool, NULL, 0444); MODULE_PARM_DESC(enable, "Enable Korg 1212 soundcard."); MODULE_AUTHOR("Haroldo Gamal "); -static struct pci_device_id snd_korg1212_ids[] __devinitdata = { +static struct pci_device_id snd_korg1212_ids[] = { { .vendor = 0x10b5, .device = 0x906d, @@ -2085,7 +2085,7 @@ static void __devinit snd_korg1212_proc_init(struct snd_korg1212 *korg1212) struct snd_info_entry *entry; if (! snd_card_proc_new(korg1212->card, "korg1212", &entry)) - snd_info_set_text_ops(entry, korg1212, 1024, snd_korg1212_proc_read); + snd_info_set_text_ops(entry, korg1212, snd_korg1212_proc_read); } static int @@ -2237,7 +2237,7 @@ static int __devinit snd_korg1212_create(struct snd_card *card, struct pci_dev * } err = request_irq(pci->irq, snd_korg1212_interrupt, - SA_INTERRUPT|SA_SHIRQ, + IRQF_DISABLED|IRQF_SHARED, "korg1212", korg1212); if (err) { diff --git a/sound/pci/maestro3.c b/sound/pci/maestro3.c index 1928e06b6..45214b3b8 100644 --- a/sound/pci/maestro3.c +++ b/sound/pci/maestro3.c @@ -869,7 +869,7 @@ struct snd_m3 { /* * pci ids */ -static struct pci_device_id snd_m3_ids[] __devinitdata = { +static struct pci_device_id snd_m3_ids[] = { {PCI_VENDOR_ID_ESS, PCI_DEVICE_ID_ESS_ALLEGRO_1, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_MULTIMEDIA_AUDIO << 8, 0xffff00, 0}, {PCI_VENDOR_ID_ESS, PCI_DEVICE_ID_ESS_ALLEGRO, PCI_ANY_ID, PCI_ANY_ID, @@ -2137,7 +2137,7 @@ static int __devinit snd_m3_mixer(struct snd_m3 *chip) * DSP Code images */ -static const u16 assp_kernel_image[] __devinitdata = { +static const u16 assp_kernel_image[] = { 0x7980, 0x0030, 0x7980, 0x03B4, 0x7980, 0x03B4, 0x7980, 0x00FB, 0x7980, 0x00DD, 0x7980, 0x03B4, 0x7980, 0x0332, 0x7980, 0x0287, 0x7980, 0x03B4, 0x7980, 0x03B4, 0x7980, 0x03B4, 0x7980, 0x03B4, 0x7980, 0x031A, 0x7980, 0x03B4, 0x7980, 0x022F, 0x7980, 0x03B4, 0x7980, 0x03B4, 0x7980, 0x03B4, @@ -2224,7 +2224,7 @@ static const u16 assp_kernel_image[] __devinitdata = { * Mini sample rate converter code image * that is to be loaded at 0x400 on the DSP. */ -static const u16 assp_minisrc_image[] __devinitdata = { +static const u16 assp_minisrc_image[] = { 0xBF80, 0x101E, 0x906E, 0x006E, 0x8B88, 0x6980, 0xEF88, 0x906F, 0x0D6F, 0x6900, 0xEB08, 0x0412, 0xBC20, 0x696E, 0xB801, 0x906E, 0x7980, 0x0403, 0xB90E, 0x8807, 0xBE43, 0xBF01, 0xBE47, 0xBE41, @@ -2267,12 +2267,12 @@ static const u16 assp_minisrc_image[] __devinitdata = { */ #define MINISRC_LPF_LEN 10 -static const u16 minisrc_lpf[MINISRC_LPF_LEN] __devinitdata = { +static const u16 minisrc_lpf[MINISRC_LPF_LEN] = { 0X0743, 0X1104, 0X0A4C, 0XF88D, 0X242C, 0X1023, 0X1AA9, 0X0B60, 0XEFDD, 0X186F }; -static void __devinit snd_m3_assp_init(struct snd_m3 *chip) +static void snd_m3_assp_init(struct snd_m3 *chip) { unsigned int i; @@ -2760,7 +2760,7 @@ snd_m3_create(struct snd_card *card, struct pci_dev *pci, tasklet_init(&chip->hwvol_tq, snd_m3_update_hw_volume, (unsigned long)chip); - if (request_irq(pci->irq, snd_m3_interrupt, SA_INTERRUPT|SA_SHIRQ, + if (request_irq(pci->irq, snd_m3_interrupt, IRQF_DISABLED|IRQF_SHARED, card->driver, chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_m3_free(chip); @@ -2861,7 +2861,8 @@ snd_m3_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) #if 0 /* TODO: not supported yet */ /* TODO enable MIDI IRQ and I/O */ err = snd_mpu401_uart_new(chip->card, 0, MPU401_HW_MPU401, - chip->iobase + MPU401_DATA_PORT, 1, + chip->iobase + MPU401_DATA_PORT, + MPU401_INFO_INTEGRATED, chip->irq, 0, &chip->rmidi); if (err < 0) printk(KERN_WARNING "maestro3: no MIDI support.\n"); diff --git a/sound/pci/mixart/mixart.c b/sound/pci/mixart/mixart.c index 09cc07864..cc43ecd67 100644 --- a/sound/pci/mixart/mixart.c +++ b/sound/pci/mixart/mixart.c @@ -61,7 +61,7 @@ MODULE_PARM_DESC(enable, "Enable Digigram " CARD_NAME " soundcard."); /* */ -static struct pci_device_id snd_mixart_ids[] __devinitdata = { +static struct pci_device_id snd_mixart_ids[] = { { 0x1057, 0x0003, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* MC8240 */ { 0, } }; @@ -1244,7 +1244,6 @@ static void __devinit snd_mixart_proc_init(struct snd_mixart *chip) /* text interface to read perf and temp meters */ if (! snd_card_proc_new(chip->card, "board_info", &entry)) { entry->private_data = chip; - entry->c.text.read_size = 1024; entry->c.text.read = snd_mixart_proc_read; } @@ -1320,7 +1319,7 @@ static int __devinit snd_mixart_probe(struct pci_dev *pci, pci_resource_len(pci, i)); } - if (request_irq(pci->irq, snd_mixart_interrupt, SA_INTERRUPT|SA_SHIRQ, CARD_NAME, (void *)mgr)) { + if (request_irq(pci->irq, snd_mixart_interrupt, IRQF_DISABLED|IRQF_SHARED, CARD_NAME, (void *)mgr)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_mixart_free(mgr); return -EBUSY; diff --git a/sound/pci/nm256/nm256.c b/sound/pci/nm256/nm256.c index b92d6600d..101eee0aa 100644 --- a/sound/pci/nm256/nm256.c +++ b/sound/pci/nm256/nm256.c @@ -263,7 +263,7 @@ struct nm256 { /* * PCI ids */ -static struct pci_device_id snd_nm256_ids[] __devinitdata = { +static struct pci_device_id snd_nm256_ids[] = { {PCI_VENDOR_ID_NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256AV_AUDIO, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {PCI_VENDOR_ID_NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {PCI_VENDOR_ID_NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256XL_PLUS_AUDIO, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, @@ -465,7 +465,7 @@ static int snd_nm256_acquire_irq(struct nm256 *chip) { mutex_lock(&chip->irq_mutex); if (chip->irq < 0) { - if (request_irq(chip->pci->irq, chip->interrupt, SA_INTERRUPT|SA_SHIRQ, + if (request_irq(chip->pci->irq, chip->interrupt, IRQF_DISABLED|IRQF_SHARED, chip->card->driver, chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", chip->pci->irq); mutex_unlock(&chip->irq_mutex); diff --git a/sound/pci/pcxhr/pcxhr.c b/sound/pci/pcxhr/pcxhr.c index dafa2235a..533c672ae 100644 --- a/sound/pci/pcxhr/pcxhr.c +++ b/sound/pci/pcxhr/pcxhr.c @@ -73,7 +73,7 @@ enum { PCI_ID_LAST }; -static struct pci_device_id pcxhr_ids[] __devinitdata = { +static struct pci_device_id pcxhr_ids[] = { { 0x10b5, 0x9656, 0x1369, 0xb001, 0, 0, PCI_ID_VX882HR, }, /* VX882HR */ { 0x10b5, 0x9656, 0x1369, 0xb101, 0, 0, PCI_ID_PCX882HR, }, /* PCX882HR */ { 0x10b5, 0x9656, 0x1369, 0xb201, 0, 0, PCI_ID_VX881HR, }, /* VX881HR */ @@ -1150,9 +1150,9 @@ static void __devinit pcxhr_proc_init(struct snd_pcxhr *chip) struct snd_info_entry *entry; if (! snd_card_proc_new(chip->card, "info", &entry)) - snd_info_set_text_ops(entry, chip, 1024, pcxhr_proc_info); + snd_info_set_text_ops(entry, chip, pcxhr_proc_info); if (! snd_card_proc_new(chip->card, "sync", &entry)) - snd_info_set_text_ops(entry, chip, 1024, pcxhr_proc_sync); + snd_info_set_text_ops(entry, chip, pcxhr_proc_sync); } /* end of proc interface */ @@ -1250,7 +1250,7 @@ static int __devinit pcxhr_probe(struct pci_dev *pci, const struct pci_device_id mgr->pci = pci; mgr->irq = -1; - if (request_irq(pci->irq, pcxhr_interrupt, SA_INTERRUPT|SA_SHIRQ, + if (request_irq(pci->irq, pcxhr_interrupt, IRQF_DISABLED|IRQF_SHARED, card_name, mgr)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); pcxhr_free(mgr); diff --git a/sound/pci/riptide/riptide.c b/sound/pci/riptide/riptide.c index d8cc985d7..f435fcd6d 100644 --- a/sound/pci/riptide/riptide.c +++ b/sound/pci/riptide/riptide.c @@ -506,7 +506,7 @@ static int riptide_reset(struct cmdif *cif, struct snd_riptide *chip); /* */ -static struct pci_device_id snd_riptide_ids[] __devinitdata = { +static struct pci_device_id snd_riptide_ids[] = { { .vendor = 0x127a,.device = 0x4310, .subvendor = PCI_ANY_ID,.subdevice = PCI_ANY_ID, @@ -1836,11 +1836,11 @@ static int snd_riptide_free(struct snd_riptide *chip) UNSET_GRESET(cif->hwport); kfree(chip->cif); } + if (chip->irq >= 0) + free_irq(chip->irq, chip); if (chip->fw_entry) release_firmware(chip->fw_entry); release_and_free_resource(chip->res_port); - if (chip->irq >= 0) - free_irq(chip->irq, chip); kfree(chip); return 0; } @@ -1892,7 +1892,7 @@ snd_riptide_create(struct snd_card *card, struct pci_dev *pci, UNSET_AIE(hwport); if (request_irq - (pci->irq, snd_riptide_interrupt, SA_INTERRUPT | SA_SHIRQ, + (pci->irq, snd_riptide_interrupt, IRQF_DISABLED | IRQF_SHARED, "RIPTIDE", chip)) { snd_printk(KERN_ERR "Riptide: unable to grab IRQ %d\n", pci->irq); @@ -1992,7 +1992,7 @@ static void __devinit snd_riptide_proc_init(struct snd_riptide *chip) struct snd_info_entry *entry; if (!snd_card_proc_new(chip->card, "riptide", &entry)) - snd_info_set_text_ops(entry, chip, 4096, snd_riptide_proc_read); + snd_info_set_text_ops(entry, chip, snd_riptide_proc_read); } static int __devinit snd_riptide_mixer(struct snd_riptide *chip) diff --git a/sound/pci/rme32.c b/sound/pci/rme32.c index 55b1d4838..2a7149924 100644 --- a/sound/pci/rme32.c +++ b/sound/pci/rme32.c @@ -227,7 +227,7 @@ struct rme32 { struct snd_kcontrol *spdif_ctl; }; -static struct pci_device_id snd_rme32_ids[] __devinitdata = { +static struct pci_device_id snd_rme32_ids[] = { {PCI_VENDOR_ID_XILINX_RME, PCI_DEVICE_ID_RME_DIGI32, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0,}, {PCI_VENDOR_ID_XILINX_RME, PCI_DEVICE_ID_RME_DIGI32_8, @@ -1368,18 +1368,18 @@ static int __devinit snd_rme32_create(struct rme32 * rme32) return err; rme32->port = pci_resource_start(rme32->pci, 0); - if (request_irq(pci->irq, snd_rme32_interrupt, SA_INTERRUPT | SA_SHIRQ, "RME32", (void *) rme32)) { - snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); - return -EBUSY; - } - rme32->irq = pci->irq; - if ((rme32->iobase = ioremap_nocache(rme32->port, RME32_IO_SIZE)) == 0) { snd_printk(KERN_ERR "unable to remap memory region 0x%lx-0x%lx\n", rme32->port, rme32->port + RME32_IO_SIZE - 1); return -ENOMEM; } + if (request_irq(pci->irq, snd_rme32_interrupt, IRQF_DISABLED | IRQF_SHARED, "RME32", (void *) rme32)) { + snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); + return -EBUSY; + } + rme32->irq = pci->irq; + /* read the card's revision number */ pci_read_config_byte(pci, 8, &rme32->rev); @@ -1578,7 +1578,7 @@ static void __devinit snd_rme32_proc_init(struct rme32 * rme32) struct snd_info_entry *entry; if (! snd_card_proc_new(rme32->card, "rme32", &entry)) - snd_info_set_text_ops(entry, rme32, 1024, snd_rme32_proc_read); + snd_info_set_text_ops(entry, rme32, snd_rme32_proc_read); } /* diff --git a/sound/pci/rme96.c b/sound/pci/rme96.c index 3c1bc533d..f8de7c997 100644 --- a/sound/pci/rme96.c +++ b/sound/pci/rme96.c @@ -232,7 +232,7 @@ struct rme96 { struct snd_kcontrol *spdif_ctl; }; -static struct pci_device_id snd_rme96_ids[] __devinitdata = { +static struct pci_device_id snd_rme96_ids[] = { { PCI_VENDOR_ID_XILINX, PCI_DEVICE_ID_RME_DIGI96, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, { PCI_VENDOR_ID_XILINX, PCI_DEVICE_ID_RME_DIGI96_8, @@ -1151,6 +1151,25 @@ static struct snd_pcm_hw_constraint_list hw_constraints_period_bytes = { .mask = 0 }; +static void +rme96_set_buffer_size_constraint(struct rme96 *rme96, + struct snd_pcm_runtime *runtime) +{ + unsigned int size; + + snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, + RME96_BUFFER_SIZE, RME96_BUFFER_SIZE); + if ((size = rme96->playback_periodsize) != 0 || + (size = rme96->capture_periodsize) != 0) + snd_pcm_hw_constraint_minmax(runtime, + SNDRV_PCM_HW_PARAM_PERIOD_BYTES, + size, size); + else + snd_pcm_hw_constraint_list(runtime, 0, + SNDRV_PCM_HW_PARAM_PERIOD_BYTES, + &hw_constraints_period_bytes); +} + static int snd_rme96_playback_spdif_open(struct snd_pcm_substream *substream) { @@ -1180,8 +1199,7 @@ snd_rme96_playback_spdif_open(struct snd_pcm_substream *substream) runtime->hw.rate_min = rate; runtime->hw.rate_max = rate; } - snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, RME96_BUFFER_SIZE, RME96_BUFFER_SIZE); - snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, &hw_constraints_period_bytes); + rme96_set_buffer_size_constraint(rme96, runtime); rme96->wcreg_spdif_stream = rme96->wcreg_spdif; rme96->spdif_ctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE; @@ -1219,9 +1237,7 @@ snd_rme96_capture_spdif_open(struct snd_pcm_substream *substream) rme96->capture_substream = substream; spin_unlock_irq(&rme96->lock); - snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, RME96_BUFFER_SIZE, RME96_BUFFER_SIZE); - snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, &hw_constraints_period_bytes); - + rme96_set_buffer_size_constraint(rme96, runtime); return 0; } @@ -1254,8 +1270,7 @@ snd_rme96_playback_adat_open(struct snd_pcm_substream *substream) runtime->hw.rate_min = rate; runtime->hw.rate_max = rate; } - snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, RME96_BUFFER_SIZE, RME96_BUFFER_SIZE); - snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, &hw_constraints_period_bytes); + rme96_set_buffer_size_constraint(rme96, runtime); return 0; } @@ -1291,8 +1306,7 @@ snd_rme96_capture_adat_open(struct snd_pcm_substream *substream) rme96->capture_substream = substream; spin_unlock_irq(&rme96->lock); - snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, RME96_BUFFER_SIZE, RME96_BUFFER_SIZE); - snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, &hw_constraints_period_bytes); + rme96_set_buffer_size_constraint(rme96, runtime); return 0; } @@ -1569,17 +1583,17 @@ snd_rme96_create(struct rme96 *rme96) return err; rme96->port = pci_resource_start(rme96->pci, 0); - if (request_irq(pci->irq, snd_rme96_interrupt, SA_INTERRUPT|SA_SHIRQ, "RME96", (void *)rme96)) { - snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); - return -EBUSY; - } - rme96->irq = pci->irq; - if ((rme96->iobase = ioremap_nocache(rme96->port, RME96_IO_SIZE)) == 0) { snd_printk(KERN_ERR "unable to remap memory region 0x%lx-0x%lx\n", rme96->port, rme96->port + RME96_IO_SIZE - 1); return -ENOMEM; } + if (request_irq(pci->irq, snd_rme96_interrupt, IRQF_DISABLED|IRQF_SHARED, "RME96", (void *)rme96)) { + snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); + return -EBUSY; + } + rme96->irq = pci->irq; + /* read the card's revision number */ pci_read_config_byte(pci, 8, &rme96->rev); @@ -1805,7 +1819,7 @@ snd_rme96_proc_init(struct rme96 *rme96) struct snd_info_entry *entry; if (! snd_card_proc_new(rme96->card, "rme96", &entry)) - snd_info_set_text_ops(entry, rme96, 1024, snd_rme96_proc_read); + snd_info_set_text_ops(entry, rme96, snd_rme96_proc_read); } /* diff --git a/sound/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c index 10586e48a..e5a52da77 100644 --- a/sound/pci/rme9652/hdsp.c +++ b/sound/pci/rme9652/hdsp.c @@ -568,7 +568,7 @@ static void snd_hammerfall_free_buffer(struct snd_dma_buffer *dmab, struct pci_d } -static struct pci_device_id snd_hdsp_ids[] __devinitdata = { +static struct pci_device_id snd_hdsp_ids[] = { { .vendor = PCI_VENDOR_ID_XILINX, .device = PCI_DEVICE_ID_XILINX_HAMMERFALL_DSP, @@ -1356,7 +1356,7 @@ static struct snd_rawmidi_ops snd_hdsp_midi_input = .trigger = snd_hdsp_midi_input_trigger, }; -static int __devinit snd_hdsp_create_midi (struct snd_card *card, struct hdsp *hdsp, int id) +static int snd_hdsp_create_midi (struct snd_card *card, struct hdsp *hdsp, int id) { char buf[32]; @@ -3471,7 +3471,7 @@ static void __devinit snd_hdsp_proc_init(struct hdsp *hdsp) struct snd_info_entry *entry; if (! snd_card_proc_new(hdsp->card, "hdsp", &entry)) - snd_info_set_text_ops(entry, hdsp, 1024, snd_hdsp_proc_read); + snd_info_set_text_ops(entry, hdsp, snd_hdsp_proc_read); } static void snd_hdsp_free_buffers(struct hdsp *hdsp) @@ -4912,7 +4912,7 @@ static int __devinit snd_hdsp_create(struct snd_card *card, return -EBUSY; } - if (request_irq(pci->irq, snd_hdsp_interrupt, SA_INTERRUPT|SA_SHIRQ, "hdsp", (void *)hdsp)) { + if (request_irq(pci->irq, snd_hdsp_interrupt, IRQF_DISABLED|IRQF_SHARED, "hdsp", (void *)hdsp)) { snd_printk(KERN_ERR "Hammerfall-DSP: unable to use IRQ %d\n", pci->irq); return -EBUSY; } diff --git a/sound/pci/rme9652/hdspm.c b/sound/pci/rme9652/hdspm.c index 722b9e6ce..7d03ae066 100644 --- a/sound/pci/rme9652/hdspm.c +++ b/sound/pci/rme9652/hdspm.c @@ -2489,7 +2489,7 @@ static void __devinit snd_hdspm_proc_init(struct hdspm * hdspm) struct snd_info_entry *entry; if (!snd_card_proc_new(hdspm->card, "hdspm", &entry)) - snd_info_set_text_ops(entry, hdspm, 1024, + snd_info_set_text_ops(entry, hdspm, snd_hdspm_proc_read); } @@ -3497,7 +3497,7 @@ static int __devinit snd_hdspm_create(struct snd_card *card, struct hdspm * hdsp hdspm->port + io_extent - 1); if (request_irq(pci->irq, snd_hdspm_interrupt, - SA_INTERRUPT | SA_SHIRQ, "hdspm", + IRQF_DISABLED | IRQF_SHARED, "hdspm", (void *) hdspm)) { snd_printk(KERN_ERR "HDSPM: unable to use IRQ %d\n", pci->irq); return -EBUSY; diff --git a/sound/pci/rme9652/rme9652.c b/sound/pci/rme9652/rme9652.c index 75d640630..fc15f61ad 100644 --- a/sound/pci/rme9652/rme9652.c +++ b/sound/pci/rme9652/rme9652.c @@ -41,7 +41,7 @@ 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] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */ -static int precise_ptr[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 0 }; /* Enable precise pointer */ +static int precise_ptr[SNDRV_CARDS]; /* Enable precise pointer */ module_param_array(index, int, NULL, 0444); MODULE_PARM_DESC(index, "Index value for RME Digi9652 (Hammerfall) soundcard."); @@ -315,7 +315,7 @@ static void snd_hammerfall_free_buffer(struct snd_dma_buffer *dmab, struct pci_d } -static struct pci_device_id snd_rme9652_ids[] __devinitdata = { +static struct pci_device_id snd_rme9652_ids[] = { { .vendor = 0x10ee, .device = 0x3fc4, @@ -1787,7 +1787,7 @@ static void __devinit snd_rme9652_proc_init(struct snd_rme9652 *rme9652) struct snd_info_entry *entry; if (! snd_card_proc_new(rme9652->card, "rme9652", &entry)) - snd_info_set_text_ops(entry, rme9652, 1024, snd_rme9652_proc_read); + snd_info_set_text_ops(entry, rme9652, snd_rme9652_proc_read); } static void snd_rme9652_free_buffers(struct snd_rme9652 *rme9652) @@ -2500,7 +2500,7 @@ static int __devinit snd_rme9652_create(struct snd_card *card, return -EBUSY; } - if (request_irq(pci->irq, snd_rme9652_interrupt, SA_INTERRUPT|SA_SHIRQ, "rme9652", (void *)rme9652)) { + if (request_irq(pci->irq, snd_rme9652_interrupt, IRQF_DISABLED|IRQF_SHARED, "rme9652", (void *)rme9652)) { snd_printk(KERN_ERR "unable to request IRQ %d\n", pci->irq); return -EBUSY; } diff --git a/sound/pci/sonicvibes.c b/sound/pci/sonicvibes.c index 91f8bf3ae..e5d4def1a 100644 --- a/sound/pci/sonicvibes.c +++ b/sound/pci/sonicvibes.c @@ -54,8 +54,8 @@ MODULE_SUPPORTED_DEVICE("{{S3,SonicVibes PCI}}"); 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] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */ -static int reverb[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; -static int mge[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; +static int reverb[SNDRV_CARDS]; +static int mge[SNDRV_CARDS]; static unsigned int dmaio = 0x7a00; /* DDMA i/o address */ module_param_array(index, int, NULL, 0444); @@ -243,7 +243,7 @@ struct sonicvibes { #endif }; -static struct pci_device_id snd_sonic_ids[] __devinitdata = { +static struct pci_device_id snd_sonic_ids[] = { { 0x5333, 0xca00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, { 0, } }; @@ -1144,7 +1144,7 @@ static void __devinit snd_sonicvibes_proc_init(struct sonicvibes * sonic) struct snd_info_entry *entry; if (! snd_card_proc_new(sonic->card, "sonicvibes", &entry)) - snd_info_set_text_ops(entry, sonic, 1024, snd_sonicvibes_proc_read); + snd_info_set_text_ops(entry, sonic, snd_sonicvibes_proc_read); } /* @@ -1257,7 +1257,7 @@ static int __devinit snd_sonicvibes_create(struct snd_card *card, sonic->midi_port = pci_resource_start(pci, 3); sonic->game_port = pci_resource_start(pci, 4); - if (request_irq(pci->irq, snd_sonicvibes_interrupt, SA_INTERRUPT|SA_SHIRQ, "S3 SonicVibes", (void *)sonic)) { + if (request_irq(pci->irq, snd_sonicvibes_interrupt, IRQF_DISABLED|IRQF_SHARED, "S3 SonicVibes", (void *)sonic)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_sonicvibes_free(sonic); return -EBUSY; @@ -1441,10 +1441,10 @@ static int __devinit snd_sonic_probe(struct pci_dev *pci, strcpy(card->driver, "SonicVibes"); strcpy(card->shortname, "S3 SonicVibes"); - sprintf(card->longname, "%s rev %i at 0x%lx, irq %i", + sprintf(card->longname, "%s rev %i at 0x%llx, irq %i", card->shortname, sonic->revision, - pci_resource_start(pci, 1), + (unsigned long long)pci_resource_start(pci, 1), sonic->irq); if ((err = snd_sonicvibes_pcm(sonic, 0, NULL)) < 0) { @@ -1456,7 +1456,7 @@ static int __devinit snd_sonic_probe(struct pci_dev *pci, return err; } if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_SONICVIBES, - sonic->midi_port, 1, + sonic->midi_port, MPU401_INFO_INTEGRATED, sonic->irq, 0, &midi_uart)) < 0) { snd_card_free(card); diff --git a/sound/pci/trident/trident.c b/sound/pci/trident/trident.c index 9624a5f2b..9145f7c57 100644 --- a/sound/pci/trident/trident.c +++ b/sound/pci/trident/trident.c @@ -63,7 +63,7 @@ MODULE_PARM_DESC(pcm_channels, "Number of hardware channels assigned for PCM."); module_param_array(wavetable_size, int, NULL, 0444); MODULE_PARM_DESC(wavetable_size, "Maximum memory size in kB for wavetable synth."); -static struct pci_device_id snd_trident_ids[] __devinitdata = { +static struct pci_device_id snd_trident_ids[] = { {PCI_DEVICE(PCI_VENDOR_ID_TRIDENT, PCI_DEVICE_ID_TRIDENT_4DWAVE_DX), PCI_CLASS_MULTIMEDIA_AUDIO << 8, 0xffff00, 0}, {PCI_DEVICE(PCI_VENDOR_ID_TRIDENT, PCI_DEVICE_ID_TRIDENT_4DWAVE_NX), @@ -148,7 +148,8 @@ static int __devinit snd_trident_probe(struct pci_dev *pci, } if (trident->device != TRIDENT_DEVICE_ID_SI7018 && (err = snd_mpu401_uart_new(card, 0, MPU401_HW_TRID4DWAVE, - trident->midi_port, 1, + trident->midi_port, + MPU401_INFO_INTEGRATED, trident->irq, 0, &trident->rmidi)) < 0) { snd_card_free(card); return err; diff --git a/sound/pci/trident/trident_main.c b/sound/pci/trident/trident_main.c index 52178b8ad..4930cc6b0 100644 --- a/sound/pci/trident/trident_main.c +++ b/sound/pci/trident/trident_main.c @@ -306,6 +306,8 @@ void snd_trident_start_voice(struct snd_trident * trident, unsigned int voice) outl(mask, TRID_REG(trident, reg)); } +EXPORT_SYMBOL(snd_trident_start_voice); + /*--------------------------------------------------------------------------- void snd_trident_stop_voice(struct snd_trident * trident, unsigned int voice) @@ -328,6 +330,8 @@ void snd_trident_stop_voice(struct snd_trident * trident, unsigned int voice) outl(mask, TRID_REG(trident, reg)); } +EXPORT_SYMBOL(snd_trident_stop_voice); + /*--------------------------------------------------------------------------- int snd_trident_allocate_pcm_channel(struct snd_trident *trident) @@ -502,6 +506,8 @@ void snd_trident_write_voice_regs(struct snd_trident * trident, #endif } +EXPORT_SYMBOL(snd_trident_write_voice_regs); + /*--------------------------------------------------------------------------- snd_trident_write_cso_reg @@ -3332,7 +3338,7 @@ static void __devinit snd_trident_proc_init(struct snd_trident * trident) if (trident->device == TRIDENT_DEVICE_ID_SI7018) s = "sis7018"; if (! snd_card_proc_new(trident->card, s, &entry)) - snd_info_set_text_ops(entry, trident, 1024, snd_trident_proc_read); + snd_info_set_text_ops(entry, trident, snd_trident_proc_read); } static int snd_trident_dev_free(struct snd_device *device) @@ -3593,7 +3599,7 @@ int __devinit snd_trident_create(struct snd_card *card, } trident->port = pci_resource_start(pci, 0); - if (request_irq(pci->irq, snd_trident_interrupt, SA_INTERRUPT|SA_SHIRQ, + if (request_irq(pci->irq, snd_trident_interrupt, IRQF_DISABLED|IRQF_SHARED, "Trident Audio", trident)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_trident_free(trident); @@ -3884,6 +3890,8 @@ struct snd_trident_voice *snd_trident_alloc_voice(struct snd_trident * trident, return NULL; } +EXPORT_SYMBOL(snd_trident_alloc_voice); + void snd_trident_free_voice(struct snd_trident * trident, struct snd_trident_voice *voice) { unsigned long flags; @@ -3912,6 +3920,8 @@ void snd_trident_free_voice(struct snd_trident * trident, struct snd_trident_voi private_free(voice); } +EXPORT_SYMBOL(snd_trident_free_voice); + static void snd_trident_clear_voices(struct snd_trident * trident, unsigned short v_min, unsigned short v_max) { unsigned int i, val, mask[2] = { 0, 0 }; @@ -3993,13 +4003,3 @@ int snd_trident_resume(struct pci_dev *pci) return 0; } #endif /* CONFIG_PM */ - -EXPORT_SYMBOL(snd_trident_alloc_voice); -EXPORT_SYMBOL(snd_trident_free_voice); -EXPORT_SYMBOL(snd_trident_start_voice); -EXPORT_SYMBOL(snd_trident_stop_voice); -EXPORT_SYMBOL(snd_trident_write_voice_regs); -/* trident_memory.c symbols */ -EXPORT_SYMBOL(snd_trident_synth_alloc); -EXPORT_SYMBOL(snd_trident_synth_free); -EXPORT_SYMBOL(snd_trident_synth_copy_from_user); diff --git a/sound/pci/trident/trident_memory.c b/sound/pci/trident/trident_memory.c index 46c6982c9..aff3f8741 100644 --- a/sound/pci/trident/trident_memory.c +++ b/sound/pci/trident/trident_memory.c @@ -349,6 +349,7 @@ snd_trident_synth_alloc(struct snd_trident *hw, unsigned int size) return blk; } +EXPORT_SYMBOL(snd_trident_synth_alloc); /* * free a synth sample area @@ -365,6 +366,7 @@ snd_trident_synth_free(struct snd_trident *hw, struct snd_util_memblk *blk) return 0; } +EXPORT_SYMBOL(snd_trident_synth_free); /* * reset TLB entry and free kernel page @@ -486,3 +488,4 @@ int snd_trident_synth_copy_from_user(struct snd_trident *trident, return 0; } +EXPORT_SYMBOL(snd_trident_synth_copy_from_user); diff --git a/sound/pci/trident/trident_synth.c b/sound/pci/trident/trident_synth.c index cc7af8bc5..9b7dee847 100644 --- a/sound/pci/trident/trident_synth.c +++ b/sound/pci/trident/trident_synth.c @@ -914,7 +914,9 @@ static int snd_trident_synth_create_port(struct snd_trident * trident, int idx) &callbacks, SNDRV_SEQ_PORT_CAP_WRITE | SNDRV_SEQ_PORT_CAP_SUBS_WRITE, SNDRV_SEQ_PORT_TYPE_DIRECT_SAMPLE | - SNDRV_SEQ_PORT_TYPE_SYNTH, + SNDRV_SEQ_PORT_TYPE_SYNTH | + SNDRV_SEQ_PORT_TYPE_HARDWARE | + SNDRV_SEQ_PORT_TYPE_SYNTHESIZER, 16, 0, name); if (p->chset->port < 0) { diff --git a/sound/pci/via82xx.c b/sound/pci/via82xx.c index 39daf62d2..08da9234e 100644 --- a/sound/pci/via82xx.c +++ b/sound/pci/via82xx.c @@ -396,7 +396,7 @@ struct via82xx { #endif }; -static struct pci_device_id snd_via82xx_ids[] __devinitdata = { +static struct pci_device_id snd_via82xx_ids[] = { /* 0x1106, 0x3058 */ { PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_5, PCI_ANY_ID, PCI_ANY_ID, 0, 0, TYPE_CARD_VIA686, }, /* 686A */ /* 0x1106, 0x3059 */ @@ -1775,6 +1775,12 @@ static struct ac97_quirk ac97_quirks[] = { .name = "Targa Traveller 811", .type = AC97_TUNE_HP_ONLY, }, + { + .subvendor = 0x161f, + .subdevice = 0x2032, + .name = "m680x", + .type = AC97_TUNE_HP_ONLY, /* http://launchpad.net/bugs/38546 */ + }, { } /* terminator */ }; @@ -1973,7 +1979,7 @@ static int __devinit snd_via686_init_misc(struct via82xx *chip) pci_write_config_byte(chip->pci, VIA_PNP_CONTROL, legacy_cfg); if (chip->mpu_res) { if (snd_mpu401_uart_new(chip->card, 0, MPU401_HW_VIA686A, - mpu_port, 1, + mpu_port, MPU401_INFO_INTEGRATED, chip->irq, 0, &chip->rmidi) < 0) { printk(KERN_WARNING "unable to initialize MPU-401" " at 0x%lx, skipping\n", mpu_port); @@ -2015,7 +2021,7 @@ static void __devinit snd_via82xx_proc_init(struct via82xx *chip) struct snd_info_entry *entry; if (! snd_card_proc_new(chip->card, "via82xx", &entry)) - snd_info_set_text_ops(entry, chip, 1024, snd_via82xx_proc_read); + snd_info_set_text_ops(entry, chip, snd_via82xx_proc_read); } /* @@ -2275,7 +2281,7 @@ static int __devinit snd_via82xx_create(struct snd_card *card, if (request_irq(pci->irq, chip_type == TYPE_VIA8233 ? snd_via8233_interrupt : snd_via686_interrupt, - SA_INTERRUPT|SA_SHIRQ, + IRQF_DISABLED|IRQF_SHARED, card->driver, chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_via82xx_free(chip); @@ -2365,7 +2371,7 @@ static int __devinit check_dxs_list(struct pci_dev *pci, int revision) { .subvendor = 0x1462, .subdevice = 0x0470, .action = VIA_DXS_SRC }, /* MSI KT880 Delta-FSR */ { .subvendor = 0x1462, .subdevice = 0x3800, .action = VIA_DXS_ENABLE }, /* MSI KT266 */ { .subvendor = 0x1462, .subdevice = 0x5901, .action = VIA_DXS_NO_VRA }, /* MSI KT6 Delta-SR */ - { .subvendor = 0x1462, .subdevice = 0x7023, .action = VIA_DXS_NO_VRA }, /* MSI K8T Neo2-FI */ + { .subvendor = 0x1462, .subdevice = 0x7023, .action = VIA_DXS_SRC }, /* MSI K8T Neo2-FI */ { .subvendor = 0x1462, .subdevice = 0x7120, .action = VIA_DXS_ENABLE }, /* MSI KT4V */ { .subvendor = 0x1462, .subdevice = 0x7142, .action = VIA_DXS_ENABLE }, /* MSI K8MM-V */ { .subvendor = 0x1462, .subdevice = 0xb012, .action = VIA_DXS_SRC }, /* P4M800/VIA8237R */ diff --git a/sound/pci/via82xx_modem.c b/sound/pci/via82xx_modem.c index ea5c6f640..016f9dac2 100644 --- a/sound/pci/via82xx_modem.c +++ b/sound/pci/via82xx_modem.c @@ -26,7 +26,7 @@ /* * Changes: * - * Sep. 2, 2004 Sasha Khapyorsky + * Sep. 2, 2004 Sasha Khapyorsky * Modified from original audio driver 'via82xx.c' to support AC97 * modems. */ @@ -55,20 +55,21 @@ MODULE_DESCRIPTION("VIA VT82xx modem"); MODULE_LICENSE("GPL"); MODULE_SUPPORTED_DEVICE("{{VIA,VT82C686A/B/C modem,pci}}"); -static int index[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = -2}; /* Exclude the first card */ -static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ -static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */ -static int ac97_clock[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 48000}; +static int index = -2; /* Exclude the first card */ +static char *id = SNDRV_DEFAULT_STR1; /* ID for this card */ +static int ac97_clock = 48000; -module_param_array(index, int, NULL, 0444); +module_param(index, int, 0444); MODULE_PARM_DESC(index, "Index value for VIA 82xx bridge."); -module_param_array(id, charp, NULL, 0444); +module_param(id, charp, 0444); MODULE_PARM_DESC(id, "ID string for VIA 82xx bridge."); -module_param_array(enable, bool, NULL, 0444); -MODULE_PARM_DESC(enable, "Enable modem part of VIA 82xx bridge."); -module_param_array(ac97_clock, int, NULL, 0444); +module_param(ac97_clock, int, 0444); MODULE_PARM_DESC(ac97_clock, "AC'97 codec clock (default 48000Hz)."); +/* just for backward compatibility */ +static int enable; +module_param(enable, bool, 0444); + /* * Direct registers @@ -205,9 +206,6 @@ DEFINE_VIA_REGSET(MI, 0x50); VIA_MC97_CTRL_SECONDARY) -typedef struct _snd_via82xx_modem via82xx_t; -typedef struct via_dev viadev_t; - /* * pcm stream */ @@ -219,11 +217,11 @@ struct snd_via_sg_table { #define VIA_TABLE_SIZE 255 -struct via_dev { +struct viadev { unsigned int reg_offset; unsigned long port; int direction; /* playback = 0, capture = 1 */ - snd_pcm_substream_t *substream; + struct snd_pcm_substream *substream; int running; unsigned int tbl_entries; /* # descriptors */ struct snd_dma_buffer table; @@ -238,7 +236,7 @@ enum { TYPE_CARD_VIA82XX_MODEM = 1 }; #define VIA_MAX_MODEM_DEVS 2 -struct _snd_via82xx_modem { +struct via82xx_modem { int irq; unsigned long port; @@ -246,21 +244,21 @@ struct _snd_via82xx_modem { unsigned int intr_mask; /* SGD_SHADOW mask to check interrupts */ struct pci_dev *pci; - snd_card_t *card; + struct snd_card *card; unsigned int num_devs; unsigned int playback_devno, capture_devno; - viadev_t devs[VIA_MAX_MODEM_DEVS]; + struct viadev devs[VIA_MAX_MODEM_DEVS]; - snd_pcm_t *pcms[2]; + struct snd_pcm *pcms[2]; - ac97_bus_t *ac97_bus; - ac97_t *ac97; + struct snd_ac97_bus *ac97_bus; + struct snd_ac97 *ac97; unsigned int ac97_clock; unsigned int ac97_secondary; /* secondary AC'97 codec is present */ spinlock_t reg_lock; - snd_info_entry_t *proc_entry; + struct snd_info_entry *proc_entry; }; static struct pci_device_id snd_via82xx_modem_ids[] = { @@ -278,12 +276,12 @@ MODULE_DEVICE_TABLE(pci, snd_via82xx_modem_ids); * periods = number of periods * fragsize = period size in bytes */ -static int build_via_table(viadev_t *dev, snd_pcm_substream_t *substream, +static int build_via_table(struct viadev *dev, struct snd_pcm_substream *substream, struct pci_dev *pci, unsigned int periods, unsigned int fragsize) { unsigned int i, idx, ofs, rest; - via82xx_t *chip = snd_pcm_substream_chip(substream); + struct via82xx_modem *chip = snd_pcm_substream_chip(substream); struct snd_sg_buf *sgbuf = snd_pcm_substream_sgbuf(substream); if (dev->table.area == NULL) { @@ -345,17 +343,15 @@ static int build_via_table(viadev_t *dev, snd_pcm_substream_t *substream, } -static int clean_via_table(viadev_t *dev, snd_pcm_substream_t *substream, +static int clean_via_table(struct viadev *dev, struct snd_pcm_substream *substream, struct pci_dev *pci) { if (dev->table.area) { snd_dma_free_pages(&dev->table); dev->table.area = NULL; } - if (dev->idx_table) { - kfree(dev->idx_table); - dev->idx_table = NULL; - } + kfree(dev->idx_table); + dev->idx_table = NULL; return 0; } @@ -363,17 +359,17 @@ static int clean_via_table(viadev_t *dev, snd_pcm_substream_t *substream, * Basic I/O */ -static inline unsigned int snd_via82xx_codec_xread(via82xx_t *chip) +static inline unsigned int snd_via82xx_codec_xread(struct via82xx_modem *chip) { return inl(VIAREG(chip, AC97)); } -static inline void snd_via82xx_codec_xwrite(via82xx_t *chip, unsigned int val) +static inline void snd_via82xx_codec_xwrite(struct via82xx_modem *chip, unsigned int val) { outl(val, VIAREG(chip, AC97)); } -static int snd_via82xx_codec_ready(via82xx_t *chip, int secondary) +static int snd_via82xx_codec_ready(struct via82xx_modem *chip, int secondary) { unsigned int timeout = 1000; /* 1ms */ unsigned int val; @@ -383,11 +379,12 @@ static int snd_via82xx_codec_ready(via82xx_t *chip, int secondary) if (!((val = snd_via82xx_codec_xread(chip)) & VIA_REG_AC97_BUSY)) return val & 0xffff; } - snd_printk(KERN_ERR "codec_ready: codec %i is not ready [0x%x]\n", secondary, snd_via82xx_codec_xread(chip)); + snd_printk(KERN_ERR "codec_ready: codec %i is not ready [0x%x]\n", + secondary, snd_via82xx_codec_xread(chip)); return -EIO; } -static int snd_via82xx_codec_valid(via82xx_t *chip, int secondary) +static int snd_via82xx_codec_valid(struct via82xx_modem *chip, int secondary) { unsigned int timeout = 1000; /* 1ms */ unsigned int val, val1; @@ -404,23 +401,25 @@ static int snd_via82xx_codec_valid(via82xx_t *chip, int secondary) return -EIO; } -static void snd_via82xx_codec_wait(ac97_t *ac97) +static void snd_via82xx_codec_wait(struct snd_ac97 *ac97) { - via82xx_t *chip = ac97->private_data; + struct via82xx_modem *chip = ac97->private_data; int err; err = snd_via82xx_codec_ready(chip, ac97->num); /* here we need to wait fairly for long time.. */ - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ/2); + msleep(500); } -static void snd_via82xx_codec_write(ac97_t *ac97, +static void snd_via82xx_codec_write(struct snd_ac97 *ac97, unsigned short reg, unsigned short val) { - via82xx_t *chip = ac97->private_data; + struct via82xx_modem *chip = ac97->private_data; unsigned int xval; - + if(reg == AC97_GPIO_STATUS) { + outl(val, VIAREG(chip, GPI_STATUS)); + return; + } xval = !ac97->num ? VIA_REG_AC97_CODEC_ID_PRIMARY : VIA_REG_AC97_CODEC_ID_SECONDARY; xval <<= VIA_REG_AC97_CODEC_ID_SHIFT; xval |= reg << VIA_REG_AC97_CMD_SHIFT; @@ -429,9 +428,9 @@ static void snd_via82xx_codec_write(ac97_t *ac97, snd_via82xx_codec_ready(chip, ac97->num); } -static unsigned short snd_via82xx_codec_read(ac97_t *ac97, unsigned short reg) +static unsigned short snd_via82xx_codec_read(struct snd_ac97 *ac97, unsigned short reg) { - via82xx_t *chip = ac97->private_data; + struct via82xx_modem *chip = ac97->private_data; unsigned int xval, val = 0xffff; int again = 0; @@ -441,7 +440,8 @@ static unsigned short snd_via82xx_codec_read(ac97_t *ac97, unsigned short reg) xval |= (reg & 0x7f) << VIA_REG_AC97_CMD_SHIFT; while (1) { if (again++ > 3) { - snd_printk(KERN_ERR "codec_read: codec %i is not valid [0x%x]\n", ac97->num, snd_via82xx_codec_xread(chip)); + snd_printk(KERN_ERR "codec_read: codec %i is not valid [0x%x]\n", + ac97->num, snd_via82xx_codec_xread(chip)); return 0xffff; } snd_via82xx_codec_xwrite(chip, xval); @@ -455,7 +455,7 @@ static unsigned short snd_via82xx_codec_read(ac97_t *ac97, unsigned short reg) return val & 0xffff; } -static void snd_via82xx_channel_reset(via82xx_t *chip, viadev_t *viadev) +static void snd_via82xx_channel_reset(struct via82xx_modem *chip, struct viadev *viadev) { outb(VIA_REG_CTRL_PAUSE | VIA_REG_CTRL_TERMINATE | VIA_REG_CTRL_RESET, VIADEV_REG(viadev, OFFSET_CONTROL)); @@ -477,7 +477,7 @@ static void snd_via82xx_channel_reset(via82xx_t *chip, viadev_t *viadev) static irqreturn_t snd_via82xx_interrupt(int irq, void *dev_id, struct pt_regs *regs) { - via82xx_t *chip = dev_id; + struct via82xx_modem *chip = dev_id; unsigned int status; unsigned int i; @@ -490,7 +490,7 @@ static irqreturn_t snd_via82xx_interrupt(int irq, void *dev_id, struct pt_regs * /* check status for each stream */ spin_lock(&chip->reg_lock); for (i = 0; i < chip->num_devs; i++) { - viadev_t *viadev = &chip->devs[i]; + struct viadev *viadev = &chip->devs[i]; unsigned char c_status = inb(VIADEV_REG(viadev, OFFSET_STATUS)); c_status &= (VIA_REG_STAT_EOL|VIA_REG_STAT_FLAG|VIA_REG_STAT_STOPPED); if (! c_status) @@ -513,14 +513,15 @@ static irqreturn_t snd_via82xx_interrupt(int irq, void *dev_id, struct pt_regs * /* * trigger callback */ -static int snd_via82xx_pcm_trigger(snd_pcm_substream_t * substream, int cmd) +static int snd_via82xx_pcm_trigger(struct snd_pcm_substream *substream, int cmd) { - via82xx_t *chip = snd_pcm_substream_chip(substream); - viadev_t *viadev = (viadev_t *)substream->runtime->private_data; + struct via82xx_modem *chip = snd_pcm_substream_chip(substream); + struct viadev *viadev = substream->runtime->private_data; unsigned char val = 0; switch (cmd) { case SNDRV_PCM_TRIGGER_START: + case SNDRV_PCM_TRIGGER_SUSPEND: val |= VIA_REG_CTRL_START; viadev->running = 1; break; @@ -544,25 +545,6 @@ static int snd_via82xx_pcm_trigger(snd_pcm_substream_t * substream, int cmd) return 0; } -static int snd_via82xx_modem_pcm_trigger(snd_pcm_substream_t * substream, int cmd) -{ - via82xx_t *chip = snd_pcm_substream_chip(substream); - unsigned int val = 0; - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - val = snd_ac97_read(chip->ac97, AC97_GPIO_STATUS); - outl(val|AC97_GPIO_LINE1_OH, VIAREG(chip, GPI_STATUS)); - break; - case SNDRV_PCM_TRIGGER_STOP: - val = snd_ac97_read(chip->ac97, AC97_GPIO_STATUS); - outl(val&~AC97_GPIO_LINE1_OH, VIAREG(chip, GPI_STATUS)); - break; - default: - break; - } - return snd_via82xx_pcm_trigger(substream, cmd); -} - /* * pointer callbacks */ @@ -572,9 +554,11 @@ static int snd_via82xx_modem_pcm_trigger(snd_pcm_substream_t * substream, int cm */ #define check_invalid_pos(viadev,pos) \ - ((pos) < viadev->lastpos && ((pos) >= viadev->bufsize2 || viadev->lastpos < viadev->bufsize2)) + ((pos) < viadev->lastpos && ((pos) >= viadev->bufsize2 ||\ + viadev->lastpos < viadev->bufsize2)) -static inline unsigned int calc_linear_pos(viadev_t *viadev, unsigned int idx, unsigned int count) +static inline unsigned int calc_linear_pos(struct viadev *viadev, unsigned int idx, + unsigned int count) { unsigned int size, res; @@ -583,24 +567,33 @@ static inline unsigned int calc_linear_pos(viadev_t *viadev, unsigned int idx, u /* check the validity of the calculated position */ if (size < count) { - snd_printd(KERN_ERR "invalid via82xx_cur_ptr (size = %d, count = %d)\n", (int)size, (int)count); + snd_printd(KERN_ERR "invalid via82xx_cur_ptr (size = %d, count = %d)\n", + (int)size, (int)count); res = viadev->lastpos; } else if (check_invalid_pos(viadev, res)) { #ifdef POINTER_DEBUG - printk("fail: idx = %i/%i, lastpos = 0x%x, bufsize2 = 0x%x, offsize = 0x%x, size = 0x%x, count = 0x%x\n", idx, viadev->tbl_entries, viadev->lastpos, viadev->bufsize2, viadev->idx_table[idx].offset, viadev->idx_table[idx].size, count); + printk(KERN_DEBUG "fail: idx = %i/%i, lastpos = 0x%x, " + "bufsize2 = 0x%x, offsize = 0x%x, size = 0x%x, " + "count = 0x%x\n", idx, viadev->tbl_entries, viadev->lastpos, + viadev->bufsize2, viadev->idx_table[idx].offset, + viadev->idx_table[idx].size, count); #endif if (count && size < count) { - snd_printd(KERN_ERR "invalid via82xx_cur_ptr, using last valid pointer\n"); + snd_printd(KERN_ERR "invalid via82xx_cur_ptr, " + "using last valid pointer\n"); res = viadev->lastpos; } else { if (! count) /* bogus count 0 on the DMA boundary? */ res = viadev->idx_table[idx].offset; else - /* count register returns full size when end of buffer is reached */ + /* count register returns full size + * when end of buffer is reached + */ res = viadev->idx_table[idx].offset + size; if (check_invalid_pos(viadev, res)) { - snd_printd(KERN_ERR "invalid via82xx_cur_ptr (2), using last valid pointer\n"); + snd_printd(KERN_ERR "invalid via82xx_cur_ptr (2), " + "using last valid pointer\n"); res = viadev->lastpos; } } @@ -614,10 +607,10 @@ static inline unsigned int calc_linear_pos(viadev_t *viadev, unsigned int idx, u /* * get the current pointer on via686 */ -static snd_pcm_uframes_t snd_via686_pcm_pointer(snd_pcm_substream_t *substream) +static snd_pcm_uframes_t snd_via686_pcm_pointer(struct snd_pcm_substream *substream) { - via82xx_t *chip = snd_pcm_substream_chip(substream); - viadev_t *viadev = (viadev_t *)substream->runtime->private_data; + struct via82xx_modem *chip = snd_pcm_substream_chip(substream); + struct viadev *viadev = substream->runtime->private_data; unsigned int idx, ptr, count, res; snd_assert(viadev->tbl_entries, return 0); @@ -633,7 +626,8 @@ static snd_pcm_uframes_t snd_via686_pcm_pointer(snd_pcm_substream_t *substream) if (ptr <= (unsigned int)viadev->table.addr) idx = 0; else /* CURR_PTR holds the address + 8 */ - idx = ((ptr - (unsigned int)viadev->table.addr) / 8 - 1) % viadev->tbl_entries; + idx = ((ptr - (unsigned int)viadev->table.addr) / 8 - 1) % + viadev->tbl_entries; res = calc_linear_pos(viadev, idx, count); spin_unlock(&chip->reg_lock); @@ -644,11 +638,11 @@ static snd_pcm_uframes_t snd_via686_pcm_pointer(snd_pcm_substream_t *substream) * hw_params callback: * allocate the buffer and build up the buffer description table */ -static int snd_via82xx_hw_params(snd_pcm_substream_t * substream, - snd_pcm_hw_params_t * hw_params) +static int snd_via82xx_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *hw_params) { - via82xx_t *chip = snd_pcm_substream_chip(substream); - viadev_t *viadev = (viadev_t *)substream->runtime->private_data; + struct via82xx_modem *chip = snd_pcm_substream_chip(substream); + struct viadev *viadev = substream->runtime->private_data; int err; err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params)); @@ -670,10 +664,10 @@ static int snd_via82xx_hw_params(snd_pcm_substream_t * substream, * hw_free callback: * clean up the buffer description table and release the buffer */ -static int snd_via82xx_hw_free(snd_pcm_substream_t * substream) +static int snd_via82xx_hw_free(struct snd_pcm_substream *substream) { - via82xx_t *chip = snd_pcm_substream_chip(substream); - viadev_t *viadev = (viadev_t *)substream->runtime->private_data; + struct via82xx_modem *chip = snd_pcm_substream_chip(substream); + struct viadev *viadev = substream->runtime->private_data; clean_via_table(viadev, substream, chip->pci); snd_pcm_lib_free_pages(substream); @@ -684,7 +678,7 @@ static int snd_via82xx_hw_free(snd_pcm_substream_t * substream) /* * set up the table pointer */ -static void snd_via82xx_set_table_ptr(via82xx_t *chip, viadev_t *viadev) +static void snd_via82xx_set_table_ptr(struct via82xx_modem *chip, struct viadev *viadev) { snd_via82xx_codec_ready(chip, chip->ac97_secondary); outl((u32)viadev->table.addr, VIADEV_REG(viadev, OFFSET_TABLE_PTR)); @@ -695,10 +689,10 @@ static void snd_via82xx_set_table_ptr(via82xx_t *chip, viadev_t *viadev) /* * prepare callback for playback and capture */ -static int snd_via82xx_pcm_prepare(snd_pcm_substream_t *substream) +static int snd_via82xx_pcm_prepare(struct snd_pcm_substream *substream) { - via82xx_t *chip = snd_pcm_substream_chip(substream); - viadev_t *viadev = (viadev_t *)substream->runtime->private_data; + struct via82xx_modem *chip = snd_pcm_substream_chip(substream); + struct viadev *viadev = substream->runtime->private_data; snd_via82xx_channel_reset(chip, viadev); /* this must be set after channel_reset */ @@ -711,12 +705,12 @@ static int snd_via82xx_pcm_prepare(snd_pcm_substream_t *substream) /* * pcm hardware definition, identical for both playback and capture */ -static snd_pcm_hardware_t snd_via82xx_hw = +static struct snd_pcm_hardware snd_via82xx_hw = { .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_RESUME | + /* SNDRV_PCM_INFO_RESUME | */ SNDRV_PCM_INFO_PAUSE), .formats = SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE, .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_KNOT, @@ -736,12 +730,13 @@ static snd_pcm_hardware_t snd_via82xx_hw = /* * open callback skeleton */ -static int snd_via82xx_modem_pcm_open(via82xx_t *chip, viadev_t *viadev, snd_pcm_substream_t * substream) +static int snd_via82xx_modem_pcm_open(struct via82xx_modem *chip, struct viadev *viadev, + struct snd_pcm_substream *substream) { - snd_pcm_runtime_t *runtime = substream->runtime; + struct snd_pcm_runtime *runtime = substream->runtime; int err; static unsigned int rates[] = { 8000, 9600, 12000, 16000 }; - static snd_pcm_hw_constraint_list_t hw_constraints_rates = { + static struct snd_pcm_hw_constraint_list hw_constraints_rates = { .count = ARRAY_SIZE(rates), .list = rates, .mask = 0, @@ -749,7 +744,8 @@ static int snd_via82xx_modem_pcm_open(via82xx_t *chip, viadev_t *viadev, snd_pcm runtime->hw = snd_via82xx_hw; - if ((err = snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_constraints_rates)) < 0) + if ((err = snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, + &hw_constraints_rates)) < 0) return err; /* we may remove following constaint when we modify table entries @@ -767,10 +763,10 @@ static int snd_via82xx_modem_pcm_open(via82xx_t *chip, viadev_t *viadev, snd_pcm /* * open callback for playback */ -static int snd_via82xx_playback_open(snd_pcm_substream_t * substream) +static int snd_via82xx_playback_open(struct snd_pcm_substream *substream) { - via82xx_t *chip = snd_pcm_substream_chip(substream); - viadev_t *viadev = &chip->devs[chip->playback_devno + substream->number]; + struct via82xx_modem *chip = snd_pcm_substream_chip(substream); + struct viadev *viadev = &chip->devs[chip->playback_devno + substream->number]; return snd_via82xx_modem_pcm_open(chip, viadev, substream); } @@ -778,10 +774,10 @@ static int snd_via82xx_playback_open(snd_pcm_substream_t * substream) /* * open callback for capture */ -static int snd_via82xx_capture_open(snd_pcm_substream_t * substream) +static int snd_via82xx_capture_open(struct snd_pcm_substream *substream) { - via82xx_t *chip = snd_pcm_substream_chip(substream); - viadev_t *viadev = &chip->devs[chip->capture_devno + substream->pcm->device]; + struct via82xx_modem *chip = snd_pcm_substream_chip(substream); + struct viadev *viadev = &chip->devs[chip->capture_devno + substream->pcm->device]; return snd_via82xx_modem_pcm_open(chip, viadev, substream); } @@ -789,9 +785,9 @@ static int snd_via82xx_capture_open(snd_pcm_substream_t * substream) /* * close callback */ -static int snd_via82xx_pcm_close(snd_pcm_substream_t * substream) +static int snd_via82xx_pcm_close(struct snd_pcm_substream *substream) { - viadev_t *viadev = (viadev_t *)substream->runtime->private_data; + struct viadev *viadev = substream->runtime->private_data; viadev->substream = NULL; return 0; @@ -799,33 +795,34 @@ static int snd_via82xx_pcm_close(snd_pcm_substream_t * substream) /* via686 playback callbacks */ -static snd_pcm_ops_t snd_via686_playback_ops = { +static struct snd_pcm_ops snd_via686_playback_ops = { .open = snd_via82xx_playback_open, .close = snd_via82xx_pcm_close, .ioctl = snd_pcm_lib_ioctl, .hw_params = snd_via82xx_hw_params, .hw_free = snd_via82xx_hw_free, .prepare = snd_via82xx_pcm_prepare, - .trigger = snd_via82xx_modem_pcm_trigger, + .trigger = snd_via82xx_pcm_trigger, .pointer = snd_via686_pcm_pointer, .page = snd_pcm_sgbuf_ops_page, }; /* via686 capture callbacks */ -static snd_pcm_ops_t snd_via686_capture_ops = { +static struct snd_pcm_ops snd_via686_capture_ops = { .open = snd_via82xx_capture_open, .close = snd_via82xx_pcm_close, .ioctl = snd_pcm_lib_ioctl, .hw_params = snd_via82xx_hw_params, .hw_free = snd_via82xx_hw_free, .prepare = snd_via82xx_pcm_prepare, - .trigger = snd_via82xx_modem_pcm_trigger, + .trigger = snd_via82xx_pcm_trigger, .pointer = snd_via686_pcm_pointer, .page = snd_pcm_sgbuf_ops_page, }; -static void init_viadev(via82xx_t *chip, int idx, unsigned int reg_offset, int direction) +static void init_viadev(struct via82xx_modem *chip, int idx, unsigned int reg_offset, + int direction) { chip->devs[idx].reg_offset = reg_offset; chip->devs[idx].direction = direction; @@ -835,9 +832,9 @@ static void init_viadev(via82xx_t *chip, int idx, unsigned int reg_offset, int d /* * create a pcm instance for via686a/b */ -static int __devinit snd_via686_pcm_new(via82xx_t *chip) +static int __devinit snd_via686_pcm_new(struct via82xx_modem *chip) { - snd_pcm_t *pcm; + struct snd_pcm *pcm; int err; chip->playback_devno = 0; @@ -850,6 +847,7 @@ static int __devinit snd_via686_pcm_new(via82xx_t *chip) return err; snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_via686_playback_ops); snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_via686_capture_ops); + pcm->dev_class = SNDRV_PCM_CLASS_MODEM; pcm->private_data = chip; strcpy(pcm->name, chip->card->shortname); chip->pcms[0] = pcm; @@ -857,7 +855,8 @@ static int __devinit snd_via686_pcm_new(via82xx_t *chip) init_viadev(chip, 1, VIA_REG_MI_STATUS, 1); if ((err = snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG, - snd_dma_pci_data(chip->pci), 64*1024, 128*1024)) < 0) + snd_dma_pci_data(chip->pci), + 64*1024, 128*1024)) < 0) return err; return 0; @@ -869,24 +868,24 @@ static int __devinit snd_via686_pcm_new(via82xx_t *chip) */ -static void snd_via82xx_mixer_free_ac97_bus(ac97_bus_t *bus) +static void snd_via82xx_mixer_free_ac97_bus(struct snd_ac97_bus *bus) { - via82xx_t *chip = bus->private_data; + struct via82xx_modem *chip = bus->private_data; chip->ac97_bus = NULL; } -static void snd_via82xx_mixer_free_ac97(ac97_t *ac97) +static void snd_via82xx_mixer_free_ac97(struct snd_ac97 *ac97) { - via82xx_t *chip = ac97->private_data; + struct via82xx_modem *chip = ac97->private_data; chip->ac97 = NULL; } -static int __devinit snd_via82xx_mixer_new(via82xx_t *chip) +static int __devinit snd_via82xx_mixer_new(struct via82xx_modem *chip) { - ac97_template_t ac97; + struct snd_ac97_template ac97; int err; - static ac97_bus_ops_t ops = { + static struct snd_ac97_bus_ops ops = { .write = snd_via82xx_codec_write, .read = snd_via82xx_codec_read, .wait = snd_via82xx_codec_wait, @@ -896,7 +895,6 @@ static int __devinit snd_via82xx_mixer_new(via82xx_t *chip) return err; chip->ac97_bus->private_free = snd_via82xx_mixer_free_ac97_bus; chip->ac97_bus->clock = chip->ac97_clock; - chip->ac97_bus->shared_type = AC97_SHARED_TYPE_VIA; memset(&ac97, 0, sizeof(ac97)); ac97.private_data = chip; @@ -915,9 +913,9 @@ static int __devinit snd_via82xx_mixer_new(via82xx_t *chip) /* * proc interface */ -static void snd_via82xx_proc_read(snd_info_entry_t *entry, snd_info_buffer_t *buffer) +static void snd_via82xx_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) { - via82xx_t *chip = entry->private_data; + struct via82xx_modem *chip = entry->private_data; int i; snd_iprintf(buffer, "%s\n\n", chip->card->longname); @@ -926,22 +924,22 @@ static void snd_via82xx_proc_read(snd_info_entry_t *entry, snd_info_buffer_t *bu } } -static void __devinit snd_via82xx_proc_init(via82xx_t *chip) +static void __devinit snd_via82xx_proc_init(struct via82xx_modem *chip) { - snd_info_entry_t *entry; + struct snd_info_entry *entry; if (! snd_card_proc_new(chip->card, "via82xx", &entry)) - snd_info_set_text_ops(entry, chip, 1024, snd_via82xx_proc_read); + snd_info_set_text_ops(entry, chip, snd_via82xx_proc_read); } /* * */ -static int __devinit snd_via82xx_chip_init(via82xx_t *chip) +static int snd_via82xx_chip_init(struct via82xx_modem *chip) { unsigned int val; - int max_count; + unsigned long end_time; unsigned char pval; pci_read_config_byte(chip->pci, VIA_MC97_CTRL, &pval); @@ -980,22 +978,21 @@ static int __devinit snd_via82xx_chip_init(via82xx_t *chip) } /* wait until codec ready */ - max_count = ((3 * HZ) / 4) + 1; + end_time = jiffies + msecs_to_jiffies(750); do { pci_read_config_byte(chip->pci, VIA_ACLINK_STAT, &pval); if (pval & VIA_ACLINK_C00_READY) /* primary codec ready */ break; - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(1); - } while (--max_count > 0); + schedule_timeout_uninterruptible(1); + } while (time_before(jiffies, end_time)); if ((val = snd_via82xx_codec_xread(chip)) & VIA_REG_AC97_BUSY) - snd_printk("AC'97 codec is not ready [0x%x]\n", val); + snd_printk(KERN_ERR "AC'97 codec is not ready [0x%x]\n", val); snd_via82xx_codec_xwrite(chip, VIA_REG_AC97_READ | VIA_REG_AC97_SECONDARY_VALID | (VIA_REG_AC97_CODEC_ID_SECONDARY << VIA_REG_AC97_CODEC_ID_SHIFT)); - max_count = ((3 * HZ) / 4) + 1; + end_time = jiffies + msecs_to_jiffies(750); snd_via82xx_codec_xwrite(chip, VIA_REG_AC97_READ | VIA_REG_AC97_SECONDARY_VALID | (VIA_REG_AC97_CODEC_ID_SECONDARY << VIA_REG_AC97_CODEC_ID_SHIFT)); @@ -1004,9 +1001,8 @@ static int __devinit snd_via82xx_chip_init(via82xx_t *chip) chip->ac97_secondary = 1; goto __ac97_ok2; } - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(1); - } while (--max_count > 0); + schedule_timeout_interruptible(1); + } while (time_before(jiffies, end_time)); /* This is ok, the most of motherboards have only one codec */ __ac97_ok2: @@ -1023,31 +1019,35 @@ static int __devinit snd_via82xx_chip_init(via82xx_t *chip) /* * power management */ -static int snd_via82xx_suspend(snd_card_t *card, pm_message_t state) +static int snd_via82xx_suspend(struct pci_dev *pci, pm_message_t state) { - via82xx_t *chip = card->pm_private_data; + struct snd_card *card = pci_get_drvdata(pci); + struct via82xx_modem *chip = card->private_data; int i; + snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); for (i = 0; i < 2; i++) - if (chip->pcms[i]) - snd_pcm_suspend_all(chip->pcms[i]); + snd_pcm_suspend_all(chip->pcms[i]); for (i = 0; i < chip->num_devs; i++) snd_via82xx_channel_reset(chip, &chip->devs[i]); synchronize_irq(chip->irq); snd_ac97_suspend(chip->ac97); - pci_set_power_state(chip->pci, 3); - pci_disable_device(chip->pci); + pci_set_power_state(pci, PCI_D3hot); + pci_disable_device(pci); + pci_save_state(pci); return 0; } -static int snd_via82xx_resume(snd_card_t *card) +static int snd_via82xx_resume(struct pci_dev *pci) { - via82xx_t *chip = card->pm_private_data; + struct snd_card *card = pci_get_drvdata(pci); + struct via82xx_modem *chip = card->private_data; int i; - pci_enable_device(chip->pci); - pci_set_power_state(chip->pci, 0); - pci_set_master(chip->pci); + pci_restore_state(pci); + pci_enable_device(pci); + pci_set_power_state(pci, PCI_D0); + pci_set_master(pci); snd_via82xx_chip_init(chip); @@ -1056,11 +1056,12 @@ static int snd_via82xx_resume(snd_card_t *card) for (i = 0; i < chip->num_devs; i++) snd_via82xx_channel_reset(chip, &chip->devs[i]); + snd_power_change_state(card, SNDRV_CTL_POWER_D0); return 0; } #endif /* CONFIG_PM */ -static int snd_via82xx_free(via82xx_t *chip) +static int snd_via82xx_free(struct via82xx_modem *chip) { unsigned int i; @@ -1072,36 +1073,36 @@ static int snd_via82xx_free(via82xx_t *chip) synchronize_irq(chip->irq); __end_hw: if (chip->irq >= 0) - free_irq(chip->irq, (void *)chip); + free_irq(chip->irq, chip); pci_release_regions(chip->pci); pci_disable_device(chip->pci); kfree(chip); return 0; } -static int snd_via82xx_dev_free(snd_device_t *device) +static int snd_via82xx_dev_free(struct snd_device *device) { - via82xx_t *chip = device->device_data; + struct via82xx_modem *chip = device->device_data; return snd_via82xx_free(chip); } -static int __devinit snd_via82xx_create(snd_card_t * card, +static int __devinit snd_via82xx_create(struct snd_card *card, struct pci_dev *pci, int chip_type, int revision, unsigned int ac97_clock, - via82xx_t ** r_via) + struct via82xx_modem ** r_via) { - via82xx_t *chip; + struct via82xx_modem *chip; int err; - static snd_device_ops_t ops = { + static struct snd_device_ops ops = { .dev_free = snd_via82xx_dev_free, }; if ((err = pci_enable_device(pci)) < 0) return err; - if ((chip = kcalloc(1, sizeof(*chip), GFP_KERNEL)) == NULL) { + if ((chip = kzalloc(sizeof(*chip), GFP_KERNEL)) == NULL) { pci_disable_device(pci); return -ENOMEM; } @@ -1117,9 +1118,9 @@ static int __devinit snd_via82xx_create(snd_card_t * card, return err; } chip->port = pci_resource_start(pci, 0); - if (request_irq(pci->irq, snd_via82xx_interrupt, SA_INTERRUPT|SA_SHIRQ, - card->driver, (void *)chip)) { - snd_printk("unable to grab IRQ %d\n", pci->irq); + if (request_irq(pci->irq, snd_via82xx_interrupt, IRQF_DISABLED|IRQF_SHARED, + card->driver, chip)) { + snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_via82xx_free(chip); return -EBUSY; } @@ -1153,22 +1154,14 @@ static int __devinit snd_via82xx_create(snd_card_t * card, static int __devinit snd_via82xx_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) { - static int dev; - snd_card_t *card; - via82xx_t *chip; + struct snd_card *card; + struct via82xx_modem *chip; unsigned char revision; int chip_type = 0, card_type; unsigned int i; int err; - if (dev >= SNDRV_CARDS) - return -ENODEV; - if (!enable[dev]) { - dev++; - return -ENOENT; - } - - card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); + card = snd_card_new(index, id, THIS_MODULE, 0); if (card == NULL) return -ENOMEM; @@ -1185,16 +1178,16 @@ static int __devinit snd_via82xx_probe(struct pci_dev *pci, goto __error; } - if ((err = snd_via82xx_create(card, pci, chip_type, revision, ac97_clock[dev], &chip)) < 0) + if ((err = snd_via82xx_create(card, pci, chip_type, revision, + ac97_clock, &chip)) < 0) goto __error; + card->private_data = chip; if ((err = snd_via82xx_mixer_new(chip)) < 0) goto __error; if ((err = snd_via686_pcm_new(chip)) < 0 ) goto __error; - snd_card_set_pm_callback(card, snd_via82xx_suspend, snd_via82xx_resume, chip); - /* disable interrupts */ for (i = 0; i < chip->num_devs; i++) snd_via82xx_channel_reset(chip, &chip->devs[i]); @@ -1209,7 +1202,6 @@ static int __devinit snd_via82xx_probe(struct pci_dev *pci, return err; } pci_set_drvdata(pci, card); - dev++; return 0; __error: @@ -1228,12 +1220,15 @@ static struct pci_driver driver = { .id_table = snd_via82xx_modem_ids, .probe = snd_via82xx_probe, .remove = __devexit_p(snd_via82xx_remove), - SND_PCI_PM_CALLBACKS +#ifdef CONFIG_PM + .suspend = snd_via82xx_suspend, + .resume = snd_via82xx_resume, +#endif }; static int __init alsa_card_via82xx_init(void) { - return pci_module_init(&driver); + return pci_register_driver(&driver); } static void __exit alsa_card_via82xx_exit(void) diff --git a/sound/pci/vx222/vx222.c b/sound/pci/vx222/vx222.c index 0f1ebb010..9c03c6b4e 100644 --- a/sound/pci/vx222/vx222.c +++ b/sound/pci/vx222/vx222.c @@ -60,7 +60,7 @@ enum { VX_PCI_VX222_NEW }; -static struct pci_device_id snd_vx222_ids[] __devinitdata = { +static struct pci_device_id snd_vx222_ids[] = { { 0x10b5, 0x9050, 0x1369, PCI_ANY_ID, 0, 0, VX_PCI_VX222_OLD, }, /* PLX */ { 0x10b5, 0x9030, 0x1369, PCI_ANY_ID, 0, 0, VX_PCI_VX222_NEW, }, /* PLX */ { 0, } @@ -162,7 +162,7 @@ static int __devinit snd_vx222_create(struct snd_card *card, struct pci_dev *pci for (i = 0; i < 2; i++) vx->port[i] = pci_resource_start(pci, i + 1); - if (request_irq(pci->irq, snd_vx_irq_handler, SA_INTERRUPT|SA_SHIRQ, + if (request_irq(pci->irq, snd_vx_irq_handler, IRQF_DISABLED|IRQF_SHARED, CARD_NAME, (void *) chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_vx222_free(chip); diff --git a/sound/pci/ymfpci/ymfpci.c b/sound/pci/ymfpci/ymfpci.c index 65ebf5f19..186453f7a 100644 --- a/sound/pci/ymfpci/ymfpci.c +++ b/sound/pci/ymfpci/ymfpci.c @@ -70,7 +70,7 @@ MODULE_PARM_DESC(rear_switch, "Enable shared rear/line-in switch"); module_param_array(rear_swap, bool, NULL, 0444); MODULE_PARM_DESC(rear_swap, "Swap rear channels (must be enabled for correct IEC958 (S/PDIF)) output"); -static struct pci_device_id snd_ymfpci_ids[] __devinitdata = { +static struct pci_device_id snd_ymfpci_ids[] = { { 0x1073, 0x0004, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* YMF724 */ { 0x1073, 0x000d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* YMF724F */ { 0x1073, 0x000a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* YMF740 */ @@ -308,7 +308,8 @@ static int __devinit snd_card_ymfpci_probe(struct pci_dev *pci, } if (chip->mpu_res) { if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_YMFPCI, - mpu_port[dev], 1, + mpu_port[dev], + MPU401_INFO_INTEGRATED, pci->irq, 0, &chip->rawmidi)) < 0) { printk(KERN_WARNING "ymfpci: cannot initialize MPU401 at 0x%lx, skipping...\n", mpu_port[dev]); legacy_ctrl &= ~YMFPCI_LEGACY_MIEN; /* disable MPU401 irq */ diff --git a/sound/pci/ymfpci/ymfpci_main.c b/sound/pci/ymfpci/ymfpci_main.c index 8ac5ab50b..a55b5fd7d 100644 --- a/sound/pci/ymfpci/ymfpci_main.c +++ b/sound/pci/ymfpci/ymfpci_main.c @@ -1919,7 +1919,7 @@ static int __devinit snd_ymfpci_proc_init(struct snd_card *card, struct snd_ymfp struct snd_info_entry *entry; if (! snd_card_proc_new(card, "ymfpci", &entry)) - snd_info_set_text_ops(entry, chip, 1024, snd_ymfpci_proc_read); + snd_info_set_text_ops(entry, chip, snd_ymfpci_proc_read); return 0; } @@ -2288,7 +2288,7 @@ int __devinit snd_ymfpci_create(struct snd_card *card, snd_ymfpci_free(chip); return -EBUSY; } - if (request_irq(pci->irq, snd_ymfpci_interrupt, SA_INTERRUPT|SA_SHIRQ, "YMFPCI", (void *) chip)) { + if (request_irq(pci->irq, snd_ymfpci_interrupt, IRQF_DISABLED|IRQF_SHARED, "YMFPCI", (void *) chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); snd_ymfpci_free(chip); return -EBUSY; diff --git a/sound/pcmcia/pdaudiocf/pdaudiocf.c b/sound/pcmcia/pdaudiocf/pdaudiocf.c index adfdce749..1c09e5f49 100644 --- a/sound/pcmcia/pdaudiocf/pdaudiocf.c +++ b/sound/pcmcia/pdaudiocf/pdaudiocf.c @@ -241,12 +241,13 @@ static int pdacf_config(struct pcmcia_device *link) CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, &tuple, parse)); link->conf.ConfigBase = parse->config.base; link->conf.ConfigIndex = 0x5; - kfree(parse); CS_CHECK(RequestIO, pcmcia_request_io(link, &link->io)); CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); + kfree(parse); + if (snd_pdacf_assign_resources(pdacf, link->io.BasePort1, link->irq.AssignedIRQ) < 0) goto failed; @@ -254,6 +255,7 @@ static int pdacf_config(struct pcmcia_device *link) return 0; cs_failed: + kfree(parse); cs_error(link, last_fn, last_ret); failed: pcmcia_disable_device(link); diff --git a/sound/pcmcia/pdaudiocf/pdaudiocf_core.c b/sound/pcmcia/pdaudiocf/pdaudiocf_core.c index bd0d70ff3..1dfe29b86 100644 --- a/sound/pcmcia/pdaudiocf/pdaudiocf_core.c +++ b/sound/pcmcia/pdaudiocf/pdaudiocf_core.c @@ -144,7 +144,7 @@ static void pdacf_proc_init(struct snd_pdacf *chip) struct snd_info_entry *entry; if (! snd_card_proc_new(chip->card, "pdaudiocf", &entry)) - snd_info_set_text_ops(entry, chip, 1024, pdacf_proc_read); + snd_info_set_text_ops(entry, chip, pdacf_proc_read); } struct snd_pdacf *snd_pdacf_create(struct snd_card *card) diff --git a/sound/pcmcia/vx/vxp_ops.c b/sound/pcmcia/vx/vxp_ops.c index 7f82f619f..1ee0918c3 100644 --- a/sound/pcmcia/vx/vxp_ops.c +++ b/sound/pcmcia/vx/vxp_ops.c @@ -202,7 +202,7 @@ static int vxp_load_xilinx_binary(struct vx_core *_chip, const struct firmware * c |= (int)vx_inb(chip, RXM) << 8; c |= vx_inb(chip, RXL); - snd_printdd(KERN_DEBUG "xilinx: dsp size received 0x%x, orig 0x%x\n", c, fw->size); + snd_printdd(KERN_DEBUG "xilinx: dsp size received 0x%x, orig 0x%Zx\n", c, fw->size); vx_outb(chip, ICR, ICR_HF0); diff --git a/sound/pcmcia/vx/vxpocket.c b/sound/pcmcia/vx/vxpocket.c index 7e0cda2b6..cafe6640c 100644 --- a/sound/pcmcia/vx/vxpocket.c +++ b/sound/pcmcia/vx/vxpocket.c @@ -261,7 +261,7 @@ static int vxpocket_config(struct pcmcia_device *link) link->dev_node = &vxp->node; kfree(parse); - return 9; + return 0; cs_failed: cs_error(link, last_fn, last_ret); diff --git a/sound/ppc/Makefile b/sound/ppc/Makefile index d6ba99590..4d95c652c 100644 --- a/sound/ppc/Makefile +++ b/sound/ppc/Makefile @@ -3,7 +3,7 @@ # Copyright (c) 2001 by Jaroslav Kysela # -snd-powermac-objs := powermac.o pmac.o awacs.o burgundy.o daca.o tumbler.o toonie.o keywest.o beep.o +snd-powermac-objs := powermac.o pmac.o awacs.o burgundy.o daca.o tumbler.o keywest.o beep.o # Toplevel Module Dependency obj-$(CONFIG_SND_POWERMAC) += snd-powermac.o diff --git a/sound/ppc/awacs.c b/sound/ppc/awacs.c index 82d791be7..05dabe454 100644 --- a/sound/ppc/awacs.c +++ b/sound/ppc/awacs.c @@ -801,11 +801,10 @@ snd_pmac_awacs_init(struct snd_pmac *chip) chip->revision = (in_le32(&chip->awacs->codec_stat) >> 12) & 0xf; #ifdef PMAC_AMP_AVAIL if (chip->revision == 3 && chip->has_iic && CHECK_CUDA_AMP()) { - struct awacs_amp *amp = kmalloc(sizeof(*amp), GFP_KERNEL); + struct awacs_amp *amp = kzalloc(sizeof(*amp), GFP_KERNEL); if (! amp) return -ENOMEM; chip->mixer_data = amp; - memset(amp, 0, sizeof(*amp)); chip->mixer_free = awacs_amp_free; awacs_amp_set_vol(amp, 0, 63, 63, 0); /* mute and zero vol */ awacs_amp_set_vol(amp, 1, 63, 63, 0); diff --git a/sound/ppc/daca.c b/sound/ppc/daca.c index 46eebf561..57202b0f0 100644 --- a/sound/ppc/daca.c +++ b/sound/ppc/daca.c @@ -258,10 +258,9 @@ int __init snd_pmac_daca_init(struct snd_pmac *chip) request_module("i2c-powermac"); #endif /* CONFIG_KMOD */ - mix = kmalloc(sizeof(*mix), GFP_KERNEL); + mix = kzalloc(sizeof(*mix), GFP_KERNEL); if (! mix) return -ENOMEM; - memset(mix, 0, sizeof(*mix)); chip->mixer_data = mix; chip->mixer_free = daca_cleanup; mix->amp_on = 1; /* default on */ diff --git a/sound/ppc/keywest.c b/sound/ppc/keywest.c index fb05938dc..272ae38e9 100644 --- a/sound/ppc/keywest.c +++ b/sound/ppc/keywest.c @@ -64,11 +64,10 @@ static int keywest_attach_adapter(struct i2c_adapter *adapter) if (strncmp(i2c_device_name(adapter), "mac-io", 6)) return 0; /* ignored */ - new_client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL); + new_client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL); if (! new_client) return -ENOMEM; - memset(new_client, 0, sizeof(*new_client)); new_client->addr = keywest_ctx->addr; i2c_set_clientdata(new_client, keywest_ctx); new_client->adapter = adapter; @@ -118,6 +117,9 @@ int __init snd_pmac_tumbler_post_init(void) { int err; + if (!keywest_ctx || !keywest_ctx->client) + return -ENXIO; + if ((err = keywest_ctx->init_client(keywest_ctx)) < 0) { snd_printk(KERN_ERR "tumbler: %i :cannot initialize the MCS\n", err); return err; diff --git a/sound/ppc/pmac.c b/sound/ppc/pmac.c index f0794ef9d..641430631 100644 --- a/sound/ppc/pmac.c +++ b/sound/ppc/pmac.c @@ -867,8 +867,6 @@ static int __init snd_pmac_detect(struct snd_pmac *chip) unsigned int *prop, l; struct macio_chip* macio; - u32 layout_id = 0; - if (!machine_is(powermac)) return -ENODEV; @@ -929,8 +927,14 @@ static int __init snd_pmac_detect(struct snd_pmac *chip) if (prop && *prop < 16) chip->subframe = *prop; prop = (unsigned int *) get_property(sound, "layout-id", NULL); - if (prop) - layout_id = *prop; + if (prop) { + /* partly deprecate snd-powermac, for those machines + * that have a layout-id property for now */ + printk(KERN_INFO "snd-powermac no longer handles any " + "machines with a layout-id property " + "in the device-tree, use snd-aoa.\n"); + return -ENODEV; + } /* This should be verified on older screamers */ if (device_is_compatible(sound, "screamer")) { chip->model = PMAC_SCREAMER; @@ -963,38 +967,6 @@ static int __init snd_pmac_detect(struct snd_pmac *chip) chip->freq_table = tumbler_freqs; chip->control_mask = MASK_IEPC | 0x11; /* disable IEE */ } - if (device_is_compatible(sound, "AOAKeylargo") || - device_is_compatible(sound, "AOAbase") || - device_is_compatible(sound, "AOAK2")) { - /* For now, only support very basic TAS3004 based machines with - * single frequency until proper i2s control is implemented - */ - switch(layout_id) { - case 0x24: - case 0x29: - case 0x33: - case 0x46: - case 0x48: - case 0x50: - case 0x5c: - chip->num_freqs = ARRAY_SIZE(tumbler_freqs); - chip->model = PMAC_SNAPPER; - chip->can_byte_swap = 0; /* FIXME: check this */ - chip->control_mask = MASK_IEPC | 0x11;/* disable IEE */ - break; - case 0x3a: - chip->num_freqs = ARRAY_SIZE(tumbler_freqs); - chip->model = PMAC_TOONIE; - chip->can_byte_swap = 0; /* FIXME: check this */ - chip->control_mask = MASK_IEPC | 0x11;/* disable IEE */ - break; - default: - printk(KERN_ERR "snd: Unknown layout ID 0x%x\n", - layout_id); - return -ENODEV; - - } - } prop = (unsigned int *)get_property(sound, "device-id", NULL); if (prop) chip->device_id = *prop; @@ -1148,6 +1120,7 @@ int __init snd_pmac_new(struct snd_card *card, struct snd_pmac **chip_return) struct snd_pmac *chip; struct device_node *np; int i, err; + unsigned int irq; unsigned long ctrl_addr, txdma_addr, rxdma_addr; static struct snd_device_ops ops = { .dev_free = snd_pmac_dev_free, @@ -1181,10 +1154,6 @@ int __init snd_pmac_new(struct snd_card *card, struct snd_pmac **chip_return) if (chip->is_k2) { static char *rnames[] = { "Sound Control", "Sound DMA" }; - if (np->n_intrs < 3) { - err = -ENODEV; - goto __error; - } for (i = 0; i < 2; i ++) { if (of_address_to_resource(np->parent, i, &chip->rsrc[i])) { @@ -1198,9 +1167,10 @@ int __init snd_pmac_new(struct snd_card *card, struct snd_pmac **chip_return) chip->rsrc[i].start + 1, rnames[i]) == NULL) { printk(KERN_ERR "snd: can't request rsrc " - " %d (%s: 0x%08lx:%08lx)\n", - i, rnames[i], chip->rsrc[i].start, - chip->rsrc[i].end); + " %d (%s: 0x%016llx:%016llx)\n", + i, rnames[i], + (unsigned long long)chip->rsrc[i].start, + (unsigned long long)chip->rsrc[i].end); err = -ENODEV; goto __error; } @@ -1212,10 +1182,6 @@ int __init snd_pmac_new(struct snd_card *card, struct snd_pmac **chip_return) } else { static char *rnames[] = { "Sound Control", "Sound Tx DMA", "Sound Rx DMA" }; - if (np->n_intrs < 3) { - err = -ENODEV; - goto __error; - } for (i = 0; i < 3; i ++) { if (of_address_to_resource(np, i, &chip->rsrc[i])) { @@ -1229,9 +1195,10 @@ int __init snd_pmac_new(struct snd_card *card, struct snd_pmac **chip_return) chip->rsrc[i].start + 1, rnames[i]) == NULL) { printk(KERN_ERR "snd: can't request rsrc " - " %d (%s: 0x%08lx:%08lx)\n", - i, rnames[i], chip->rsrc[i].start, - chip->rsrc[i].end); + " %d (%s: 0x%016llx:%016llx)\n", + i, rnames[i], + (unsigned long long)chip->rsrc[i].start, + (unsigned long long)chip->rsrc[i].end); err = -ENODEV; goto __error; } @@ -1246,28 +1213,30 @@ int __init snd_pmac_new(struct snd_card *card, struct snd_pmac **chip_return) chip->playback.dma = ioremap(txdma_addr, 0x100); chip->capture.dma = ioremap(rxdma_addr, 0x100); if (chip->model <= PMAC_BURGUNDY) { - if (request_irq(np->intrs[0].line, snd_pmac_ctrl_intr, 0, + irq = irq_of_parse_and_map(np, 0); + if (request_irq(irq, snd_pmac_ctrl_intr, 0, "PMac", (void*)chip)) { - snd_printk(KERN_ERR "pmac: unable to grab IRQ %d\n", np->intrs[0].line); + snd_printk(KERN_ERR "pmac: unable to grab IRQ %d\n", + irq); err = -EBUSY; goto __error; } - chip->irq = np->intrs[0].line; + chip->irq = irq; } - if (request_irq(np->intrs[1].line, snd_pmac_tx_intr, 0, - "PMac Output", (void*)chip)) { - snd_printk(KERN_ERR "pmac: unable to grab IRQ %d\n", np->intrs[1].line); + irq = irq_of_parse_and_map(np, 1); + if (request_irq(irq, snd_pmac_tx_intr, 0, "PMac Output", (void*)chip)){ + snd_printk(KERN_ERR "pmac: unable to grab IRQ %d\n", irq); err = -EBUSY; goto __error; } - chip->tx_irq = np->intrs[1].line; - if (request_irq(np->intrs[2].line, snd_pmac_rx_intr, 0, - "PMac Input", (void*)chip)) { - snd_printk(KERN_ERR "pmac: unable to grab IRQ %d\n", np->intrs[2].line); + chip->tx_irq = irq; + irq = irq_of_parse_and_map(np, 2); + if (request_irq(irq, snd_pmac_rx_intr, 0, "PMac Input", (void*)chip)) { + snd_printk(KERN_ERR "pmac: unable to grab IRQ %d\n", irq); err = -EBUSY; goto __error; } - chip->rx_irq = np->intrs[2].line; + chip->rx_irq = irq; snd_pmac_sound_feature(chip, 1); diff --git a/sound/ppc/pmac.h b/sound/ppc/pmac.h index 3a9bd4dbb..8394e66ce 100644 --- a/sound/ppc/pmac.h +++ b/sound/ppc/pmac.h @@ -85,7 +85,7 @@ struct pmac_stream { enum snd_pmac_model { PMAC_AWACS, PMAC_SCREAMER, PMAC_BURGUNDY, PMAC_DACA, PMAC_TUMBLER, - PMAC_SNAPPER, PMAC_TOONIE + PMAC_SNAPPER }; struct snd_pmac { @@ -188,7 +188,6 @@ int snd_pmac_burgundy_init(struct snd_pmac *chip); int snd_pmac_daca_init(struct snd_pmac *chip); int snd_pmac_tumbler_init(struct snd_pmac *chip); int snd_pmac_tumbler_post_init(void); -int snd_pmac_toonie_init(struct snd_pmac *chip); /* i2c functions */ struct pmac_keywest { diff --git a/sound/ppc/powermac.c b/sound/ppc/powermac.c index f4902a219..2264574fa 100644 --- a/sound/ppc/powermac.c +++ b/sound/ppc/powermac.c @@ -94,13 +94,6 @@ static int __init snd_pmac_probe(struct platform_device *devptr) if ( snd_pmac_tumbler_init(chip) < 0 || snd_pmac_tumbler_post_init() < 0) goto __error; break; - case PMAC_TOONIE: - strcpy(card->driver, "PMac Toonie"); - strcpy(card->shortname, "PowerMac Toonie"); - strcpy(card->longname, card->shortname); - if ((err = snd_pmac_toonie_init(chip)) < 0) - goto __error; - break; case PMAC_AWACS: case PMAC_SCREAMER: name_ext = chip->model == PMAC_SCREAMER ? "Screamer" : "AWACS"; @@ -188,17 +181,14 @@ static int __init alsa_card_pmac_init(void) if ((err = platform_driver_register(&snd_pmac_driver)) < 0) return err; device = platform_device_register_simple(SND_PMAC_DRIVER, -1, NULL, 0); - if (IS_ERR(device)) { - platform_driver_unregister(&snd_pmac_driver); - return PTR_ERR(device); - } return 0; } static void __exit alsa_card_pmac_exit(void) { - platform_device_unregister(device); + if (!IS_ERR(device)) + platform_device_unregister(device); platform_driver_unregister(&snd_pmac_driver); } diff --git a/sound/ppc/toonie.c b/sound/ppc/toonie.c deleted file mode 100644 index 082bc4bab..000000000 --- a/sound/ppc/toonie.c +++ /dev/null @@ -1,379 +0,0 @@ -/* - * Mac Mini "toonie" mixer control - * - * Copyright (c) 2005 by Benjamin Herrenschmidt - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "pmac.h" - -#undef DEBUG - -#ifdef DEBUG -#define DBG(fmt...) printk(fmt) -#else -#define DBG(fmt...) -#endif - -struct pmac_gpio { - unsigned int addr; - u8 active_val; - u8 inactive_val; - u8 active_state; -}; - -struct pmac_toonie -{ - struct pmac_gpio hp_detect_gpio; - struct pmac_gpio hp_mute_gpio; - struct pmac_gpio amp_mute_gpio; - int hp_detect_irq; - int auto_mute_notify; - struct work_struct detect_work; -}; - - -/* - * gpio access - */ -#define do_gpio_write(gp, val) \ - pmac_call_feature(PMAC_FTR_WRITE_GPIO, NULL, (gp)->addr, val) -#define do_gpio_read(gp) \ - pmac_call_feature(PMAC_FTR_READ_GPIO, NULL, (gp)->addr, 0) -#define tumbler_gpio_free(gp) /* NOP */ - -static void write_audio_gpio(struct pmac_gpio *gp, int active) -{ - if (! gp->addr) - return; - active = active ? gp->active_val : gp->inactive_val; - do_gpio_write(gp, active); - DBG("(I) gpio %x write %d\n", gp->addr, active); -} - -static int check_audio_gpio(struct pmac_gpio *gp) -{ - int ret; - - if (! gp->addr) - return 0; - - ret = do_gpio_read(gp); - - return (ret & 0xd) == (gp->active_val & 0xd); -} - -static int read_audio_gpio(struct pmac_gpio *gp) -{ - int ret; - if (! gp->addr) - return 0; - ret = ((do_gpio_read(gp) & 0x02) !=0); - return ret == gp->active_state; -} - - -enum { TOONIE_MUTE_HP, TOONIE_MUTE_AMP }; - -static int toonie_get_mute_switch(snd_kcontrol_t *kcontrol, - snd_ctl_elem_value_t *ucontrol) -{ - pmac_t *chip = snd_kcontrol_chip(kcontrol); - struct pmac_toonie *mix = chip->mixer_data; - struct pmac_gpio *gp; - - if (mix == NULL) - return -ENODEV; - switch(kcontrol->private_value) { - case TOONIE_MUTE_HP: - gp = &mix->hp_mute_gpio; - break; - case TOONIE_MUTE_AMP: - gp = &mix->amp_mute_gpio; - break; - default: - return -EINVAL;; - } - ucontrol->value.integer.value[0] = !check_audio_gpio(gp); - return 0; -} - -static int toonie_put_mute_switch(snd_kcontrol_t *kcontrol, - snd_ctl_elem_value_t *ucontrol) -{ - pmac_t *chip = snd_kcontrol_chip(kcontrol); - struct pmac_toonie *mix = chip->mixer_data; - struct pmac_gpio *gp; - int val; - - if (chip->update_automute && chip->auto_mute) - return 0; /* don't touch in the auto-mute mode */ - - if (mix == NULL) - return -ENODEV; - - switch(kcontrol->private_value) { - case TOONIE_MUTE_HP: - gp = &mix->hp_mute_gpio; - break; - case TOONIE_MUTE_AMP: - gp = &mix->amp_mute_gpio; - break; - default: - return -EINVAL;; - } - val = ! check_audio_gpio(gp); - if (val != ucontrol->value.integer.value[0]) { - write_audio_gpio(gp, ! ucontrol->value.integer.value[0]); - return 1; - } - return 0; -} - -static snd_kcontrol_new_t toonie_hp_sw __initdata = { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Headphone Playback Switch", - .info = snd_pmac_boolean_mono_info, - .get = toonie_get_mute_switch, - .put = toonie_put_mute_switch, - .private_value = TOONIE_MUTE_HP, -}; -static snd_kcontrol_new_t toonie_speaker_sw __initdata = { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "PC Speaker Playback Switch", - .info = snd_pmac_boolean_mono_info, - .get = toonie_get_mute_switch, - .put = toonie_put_mute_switch, - .private_value = TOONIE_MUTE_AMP, -}; - -/* - * auto-mute stuffs - */ -static int toonie_detect_headphone(pmac_t *chip) -{ - struct pmac_toonie *mix = chip->mixer_data; - int detect = 0; - - if (mix->hp_detect_gpio.addr) - detect |= read_audio_gpio(&mix->hp_detect_gpio); - return detect; -} - -static void toonie_check_mute(pmac_t *chip, struct pmac_gpio *gp, int val, - int do_notify, snd_kcontrol_t *sw) -{ - if (check_audio_gpio(gp) != val) { - write_audio_gpio(gp, val); - if (do_notify) - snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, - &sw->id); - } -} - -static void toonie_detect_handler(void *self) -{ - pmac_t *chip = (pmac_t*) self; - struct pmac_toonie *mix; - int headphone; - - if (!chip) - return; - - mix = chip->mixer_data; - snd_assert(mix, return); - - headphone = toonie_detect_headphone(chip); - - DBG("headphone: %d, lineout: %d\n", headphone, lineout); - - if (headphone) { - /* unmute headphone/lineout & mute speaker */ - toonie_check_mute(chip, &mix->hp_mute_gpio, 0, - mix->auto_mute_notify, chip->master_sw_ctl); - toonie_check_mute(chip, &mix->amp_mute_gpio, 1, - mix->auto_mute_notify, chip->speaker_sw_ctl); - } else { - /* unmute speaker, mute others */ - toonie_check_mute(chip, &mix->amp_mute_gpio, 0, - mix->auto_mute_notify, chip->speaker_sw_ctl); - toonie_check_mute(chip, &mix->hp_mute_gpio, 1, - mix->auto_mute_notify, chip->master_sw_ctl); - } - if (mix->auto_mute_notify) { - snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, - &chip->hp_detect_ctl->id); - } -} - -static void toonie_update_automute(pmac_t *chip, int do_notify) -{ - if (chip->auto_mute) { - struct pmac_toonie *mix; - mix = chip->mixer_data; - snd_assert(mix, return); - mix->auto_mute_notify = do_notify; - schedule_work(&mix->detect_work); - } -} - -/* interrupt - headphone plug changed */ -static irqreturn_t toonie_hp_intr(int irq, void *devid, struct pt_regs *regs) -{ - pmac_t *chip = devid; - - if (chip->update_automute && chip->initialized) { - chip->update_automute(chip, 1); - return IRQ_HANDLED; - } - return IRQ_NONE; -} - -/* look for audio gpio device */ -static int find_audio_gpio(const char *name, const char *platform, - struct pmac_gpio *gp) -{ - struct device_node *np; - u32 *base, addr; - - if (! (np = find_devices("gpio"))) - return -ENODEV; - - for (np = np->child; np; np = np->sibling) { - char *property = get_property(np, "audio-gpio", NULL); - if (property && strcmp(property, name) == 0) - break; - if (device_is_compatible(np, name)) - break; - } - if (np == NULL) - return -ENODEV; - - base = (u32 *)get_property(np, "AAPL,address", NULL); - if (! base) { - base = (u32 *)get_property(np, "reg", NULL); - if (!base) { - DBG("(E) cannot find address for device %s !\n", name); - return -ENODEV; - } - addr = *base; - if (addr < 0x50) - addr += 0x50; - } else - addr = *base; - - gp->addr = addr & 0x0000ffff; - - /* Try to find the active state, default to 0 ! */ - base = (u32 *)get_property(np, "audio-gpio-active-state", NULL); - if (base) { - gp->active_state = *base; - gp->active_val = (*base) ? 0x5 : 0x4; - gp->inactive_val = (*base) ? 0x4 : 0x5; - } else { - u32 *prop = NULL; - gp->active_state = 0; - gp->active_val = 0x4; - gp->inactive_val = 0x5; - /* Here are some crude hacks to extract the GPIO polarity and - * open collector informations out of the do-platform script - * as we don't yet have an interpreter for these things - */ - if (platform) - prop = (u32 *)get_property(np, platform, NULL); - if (prop) { - if (prop[3] == 0x9 && prop[4] == 0x9) { - gp->active_val = 0xd; - gp->inactive_val = 0xc; - } - if (prop[3] == 0x1 && prop[4] == 0x1) { - gp->active_val = 0x5; - gp->inactive_val = 0x4; - } - } - } - - DBG("(I) GPIO device %s found, offset: %x, active state: %d !\n", - name, gp->addr, gp->active_state); - - return (np->n_intrs > 0) ? np->intrs[0].line : 0; -} - -static void toonie_cleanup(pmac_t *chip) -{ - struct pmac_toonie *mix = chip->mixer_data; - if (! mix) - return; - if (mix->hp_detect_irq >= 0) - free_irq(mix->hp_detect_irq, chip); - kfree(mix); - chip->mixer_data = NULL; -} - -int snd_pmac_toonie_init(pmac_t *chip) -{ - struct pmac_toonie *mix; - - mix = kmalloc(sizeof(*mix), GFP_KERNEL); - if (! mix) - return -ENOMEM; - - chip->mixer_data = mix; - chip->mixer_free = toonie_cleanup; - - find_audio_gpio("headphone-mute", NULL, &mix->hp_mute_gpio); - find_audio_gpio("amp-mute", NULL, &mix->amp_mute_gpio); - mix->hp_detect_irq = find_audio_gpio("headphone-detect", - NULL, &mix->hp_detect_gpio); - - strcpy(chip->card->mixername, "PowerMac Toonie"); - - chip->master_sw_ctl = snd_ctl_new1(&toonie_hp_sw, chip); - snd_ctl_add(chip->card, chip->master_sw_ctl); - - chip->speaker_sw_ctl = snd_ctl_new1(&toonie_speaker_sw, chip); - snd_ctl_add(chip->card, chip->speaker_sw_ctl); - - INIT_WORK(&mix->detect_work, toonie_detect_handler, (void *)chip); - - if (mix->hp_detect_irq >= 0) { - snd_pmac_add_automute(chip); - - chip->detect_headphone = toonie_detect_headphone; - chip->update_automute = toonie_update_automute; - toonie_update_automute(chip, 0); - - if (request_irq(mix->hp_detect_irq, toonie_hp_intr, 0, - "Sound Headphone Detection", chip) < 0) - mix->hp_detect_irq = -1; - } - - return 0; -} - diff --git a/sound/ppc/tumbler.c b/sound/ppc/tumbler.c index 70e4ebc70..84f6b19c0 100644 --- a/sound/ppc/tumbler.c +++ b/sound/ppc/tumbler.c @@ -1121,7 +1121,7 @@ static long tumbler_find_device(const char *device, const char *platform, DBG("(I) GPIO device %s found, offset: %x, active state: %d !\n", device, gp->addr, gp->active_state); - return (node->n_intrs > 0) ? node->intrs[0].line : 0; + return irq_of_parse_and_map(node, 0); } /* reset audio */ @@ -1264,16 +1264,16 @@ static int __init tumbler_init(struct snd_pmac *chip) &mix->line_mute, 1); irq = tumbler_find_device("headphone-detect", NULL, &mix->hp_detect, 0); - if (irq < 0) + if (irq <= NO_IRQ) irq = tumbler_find_device("headphone-detect", NULL, &mix->hp_detect, 1); - if (irq < 0) + if (irq <= NO_IRQ) irq = tumbler_find_device("keywest-gpio15", NULL, &mix->hp_detect, 1); mix->headphone_irq = irq; irq = tumbler_find_device("line-output-detect", NULL, &mix->line_detect, 0); - if (irq < 0) + if (irq <= NO_IRQ) irq = tumbler_find_device("line-output-detect", NULL, &mix->line_detect, 1); mix->lineout_irq = irq; @@ -1316,10 +1316,9 @@ int __init snd_pmac_tumbler_init(struct snd_pmac *chip) request_module("i2c-powermac"); #endif /* CONFIG_KMOD */ - mix = kmalloc(sizeof(*mix), GFP_KERNEL); + mix = kzalloc(sizeof(*mix), GFP_KERNEL); if (! mix) return -ENOMEM; - memset(mix, 0, sizeof(*mix)); mix->headphone_irq = -1; chip->mixer_data = mix; diff --git a/sound/sound_core.c b/sound/sound_core.c index 6f849720a..62d4d0c81 100644 --- a/sound/sound_core.c +++ b/sound/sound_core.c @@ -34,7 +34,6 @@ * locking at some point in 2.3.x. */ -#include #include #include #include @@ -44,7 +43,6 @@ #include #include #include -#include #include #define SOUND_STEP 16 @@ -172,8 +170,6 @@ static int sound_insert_unit(struct sound_unit **list, const struct file_operati else sprintf(s->name, "sound/%s%d", name, r / SOUND_STEP); - devfs_mk_cdev(MKDEV(SOUND_MAJOR, s->unit_minor), - S_IFCHR | mode, s->name); class_device_create(sound_class, NULL, MKDEV(SOUND_MAJOR, s->unit_minor), dev, s->name+6); return r; @@ -197,7 +193,6 @@ static void sound_remove_unit(struct sound_unit **list, int unit) p = __sound_remove_unit(list, unit); spin_unlock(&sound_loader_lock); if (p) { - devfs_remove(p->name); class_device_destroy(sound_class, MKDEV(SOUND_MAJOR, p->unit_minor)); kfree(p); } @@ -570,7 +565,6 @@ static void __exit cleanup_soundcore(void) /* We have nothing to really do here - we know the lists must be empty */ unregister_chrdev(SOUND_MAJOR, "sound"); - devfs_remove("sound"); class_destroy(sound_class); } @@ -580,7 +574,6 @@ static int __init init_soundcore(void) printk(KERN_ERR "soundcore: sound device already in use.\n"); return -EBUSY; } - devfs_mk_dir ("sound"); sound_class = class_create(THIS_MODULE, "sound"); if (IS_ERR(sound_class)) return PTR_ERR(sound_class); diff --git a/sound/sparc/amd7930.c b/sound/sparc/amd7930.c index 55493340f..2bd8e40b8 100644 --- a/sound/sparc/amd7930.c +++ b/sound/sparc/amd7930.c @@ -46,6 +46,7 @@ #include #include #include +#include static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */ static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ @@ -335,7 +336,6 @@ struct snd_amd7930 { int pgain; int mgain; - struct sbus_dev *sdev; unsigned int irq; unsigned int regs_size; struct snd_amd7930 *next; @@ -946,11 +946,9 @@ static struct snd_device_ops snd_amd7930_dev_ops = { }; static int __init snd_amd7930_create(struct snd_card *card, - struct sbus_dev *sdev, struct resource *rp, unsigned int reg_size, - struct linux_prom_irqs *irq_prop, - int dev, + int irq, int dev, struct snd_amd7930 **ramd) { unsigned long flags; @@ -964,7 +962,6 @@ static int __init snd_amd7930_create(struct snd_card *card, spin_lock_init(&amd->lock); amd->card = card; - amd->sdev = sdev; amd->regs_size = reg_size; amd->regs = sbus_ioremap(rp, 0, amd->regs_size, "amd7930"); @@ -975,15 +972,14 @@ static int __init snd_amd7930_create(struct snd_card *card, amd7930_idle(amd); - if (request_irq(irq_prop->pri, snd_amd7930_interrupt, - SA_INTERRUPT | SA_SHIRQ, "amd7930", amd)) { - snd_printk("amd7930-%d: Unable to grab IRQ %s\n", - dev, - __irq_itoa(irq_prop->pri)); + if (request_irq(irq, snd_amd7930_interrupt, + IRQF_DISABLED | IRQF_SHARED, "amd7930", amd)) { + snd_printk("amd7930-%d: Unable to grab IRQ %d\n", + dev, irq); snd_amd7930_free(amd); return -EBUSY; } - amd->irq = irq_prop->pri; + amd->irq = irq; amd7930_enable_ints(amd); @@ -1017,60 +1013,35 @@ static int __init snd_amd7930_create(struct snd_card *card, return 0; } -static int __init amd7930_attach(int prom_node, struct sbus_dev *sdev) +static int __init amd7930_attach_common(struct resource *rp, int irq) { - static int dev; - struct linux_prom_registers reg_prop; - struct linux_prom_irqs irq_prop; - struct resource res, *rp; + static int dev_num; struct snd_card *card; struct snd_amd7930 *amd; int err; - if (dev >= SNDRV_CARDS) + if (dev_num >= SNDRV_CARDS) return -ENODEV; - if (!enable[dev]) { - dev++; + if (!enable[dev_num]) { + dev_num++; return -ENOENT; } - err = prom_getproperty(prom_node, "intr", - (char *) &irq_prop, sizeof(irq_prop)); - if (err < 0) { - snd_printk("amd7930-%d: Firmware node lacks IRQ property.\n", dev); - return -ENODEV; - } - - err = prom_getproperty(prom_node, "reg", - (char *) ®_prop, sizeof(reg_prop)); - if (err < 0) { - snd_printk("amd7930-%d: Firmware node lacks register property.\n", dev); - return -ENODEV; - } - - if (sdev) { - rp = &sdev->resource[0]; - } else { - rp = &res; - rp->start = reg_prop.phys_addr; - rp->end = rp->start + reg_prop.reg_size - 1; - rp->flags = IORESOURCE_IO | (reg_prop.which_io & 0xff); - } - - card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); + card = snd_card_new(index[dev_num], id[dev_num], THIS_MODULE, 0); if (card == NULL) return -ENOMEM; strcpy(card->driver, "AMD7930"); strcpy(card->shortname, "Sun AMD7930"); - sprintf(card->longname, "%s at 0x%02lx:0x%08lx, irq %s", + sprintf(card->longname, "%s at 0x%02lx:0x%08Lx, irq %d", card->shortname, rp->flags & 0xffL, - rp->start, - __irq_itoa(irq_prop.pri)); + (unsigned long long)rp->start, + irq); - if ((err = snd_amd7930_create(card, sdev, rp, reg_prop.reg_size, - &irq_prop, dev, &amd)) < 0) + if ((err = snd_amd7930_create(card, rp, + (rp->end - rp->start) + 1, + irq, dev_num, &amd)) < 0) goto out_err; if ((err = snd_amd7930_pcm(amd)) < 0) @@ -1085,7 +1056,8 @@ static int __init amd7930_attach(int prom_node, struct sbus_dev *sdev) amd->next = amd7930_list; amd7930_list = amd; - dev++; + dev_num++; + return 0; out_err: @@ -1093,29 +1065,71 @@ out_err: return err; } -static int __init amd7930_init(void) +static int __init amd7930_obio_attach(struct device_node *dp) +{ + struct linux_prom_registers *regs; + struct linux_prom_irqs *irqp; + struct resource res, *rp; + int len; + + irqp = of_get_property(dp, "intr", &len); + if (!irqp) { + snd_printk("%s: Firmware node lacks IRQ property.\n", + dp->full_name); + return -ENODEV; + } + + regs = of_get_property(dp, "reg", &len); + if (!regs) { + snd_printk("%s: Firmware node lacks register property.\n", + dp->full_name); + return -ENODEV; + } + + rp = &res; + rp->start = regs->phys_addr; + rp->end = rp->start + regs->reg_size - 1; + rp->flags = IORESOURCE_IO | (regs->which_io & 0xff); + + return amd7930_attach_common(rp, irqp->pri); +} + +static int __devinit amd7930_sbus_probe(struct of_device *dev, const struct of_device_id *match) { - struct sbus_bus *sbus; - struct sbus_dev *sdev; - int node, found; + struct sbus_dev *sdev = to_sbus_device(&dev->dev); - found = 0; + return amd7930_attach_common(&sdev->resource[0], sdev->irqs[0]); +} + +static struct of_device_id amd7930_match[] = { + { + .name = "audio", + }, + {}, +}; + +static struct of_platform_driver amd7930_sbus_driver = { + .name = "audio", + .match_table = amd7930_match, + .probe = amd7930_sbus_probe, +}; + +static int __init amd7930_init(void) +{ + struct device_node *dp; /* Try to find the sun4c "audio" node first. */ - node = prom_getchild(prom_root_node); - node = prom_searchsiblings(node, "audio"); - if (node && amd7930_attach(node, NULL) == 0) - found++; + dp = of_find_node_by_path("/"); + dp = dp->child; + while (dp) { + if (!strcmp(dp->name, "audio")) + amd7930_obio_attach(dp); - /* Probe each SBUS for amd7930 chips. */ - for_all_sbusdev(sdev, sbus) { - if (!strcmp(sdev->prom_name, "audio")) { - if (amd7930_attach(sdev->prom_node, sdev) == 0) - found++; - } + dp = dp->sibling; } - return (found > 0) ? 0 : -EIO; + /* Probe each SBUS for amd7930 chips. */ + return of_register_driver(&amd7930_sbus_driver, &sbus_bus_type); } static void __exit amd7930_exit(void) @@ -1131,6 +1145,8 @@ static void __exit amd7930_exit(void) } amd7930_list = NULL; + + of_unregister_driver(&amd7930_sbus_driver); } module_init(amd7930_init); diff --git a/sound/sparc/cs4231.c b/sound/sparc/cs4231.c index 8804f26dd..9a06c3bd6 100644 --- a/sound/sparc/cs4231.c +++ b/sound/sparc/cs4231.c @@ -8,7 +8,6 @@ * Copyright (c) by Jaroslav Kysela */ -#include #include #include #include @@ -2002,10 +2001,9 @@ static int __init snd_cs4231_sbus_create(struct snd_card *card, chip->c_dma.preallocate = sbus_dma_preallocate; if (request_irq(sdev->irqs[0], snd_cs4231_sbus_interrupt, - SA_SHIRQ, "cs4231", chip)) { - snd_printdd("cs4231-%d: Unable to grab SBUS IRQ %s\n", - dev, - __irq_itoa(sdev->irqs[0])); + IRQF_SHARED, "cs4231", chip)) { + snd_printdd("cs4231-%d: Unable to grab SBUS IRQ %d\n", + dev, sdev->irqs[0]); snd_cs4231_sbus_free(chip); return -EBUSY; } @@ -2038,11 +2036,11 @@ static int __init cs4231_sbus_attach(struct sbus_dev *sdev) if (err) return err; - sprintf(card->longname, "%s at 0x%02lx:0x%08lx, irq %s", + sprintf(card->longname, "%s at 0x%02lx:0x%016Lx, irq %d", card->shortname, rp->flags & 0xffL, - rp->start, - __irq_itoa(sdev->irqs[0])); + (unsigned long long)rp->start, + sdev->irqs[0]); if ((err = snd_cs4231_sbus_create(card, sdev, dev, &cp)) < 0) { snd_card_free(card); @@ -2244,10 +2242,10 @@ static int __init cs4231_ebus_attach(struct linux_ebus_device *edev) if (err) return err; - sprintf(card->longname, "%s at 0x%lx, irq %s", + sprintf(card->longname, "%s at 0x%lx, irq %d", card->shortname, edev->resource[0].start, - __irq_itoa(edev->irqs[0])); + edev->irqs[0]); if ((err = snd_cs4231_ebus_create(card, edev, dev, &chip)) < 0) { snd_card_free(card); @@ -2285,15 +2283,14 @@ static int __init cs4231_init(void) for_each_ebusdev(edev, ebus) { int match = 0; - if (!strcmp(edev->prom_name, "SUNW,CS4231")) { + if (!strcmp(edev->prom_node->name, "SUNW,CS4231")) { match = 1; - } else if (!strcmp(edev->prom_name, "audio")) { - char compat[16]; + } else if (!strcmp(edev->prom_node->name, "audio")) { + char *compat; - prom_getstring(edev->prom_node, "compatible", - compat, sizeof(compat)); - compat[15] = '\0'; - if (!strcmp(compat, "SUNW,CS4231")) + compat = of_get_property(edev->prom_node, + "compatible", NULL); + if (compat && !strcmp(compat, "SUNW,CS4231")) match = 1; } diff --git a/sound/sparc/dbri.c b/sound/sparc/dbri.c index 2164b7d29..f3ae6e236 100644 --- a/sound/sparc/dbri.c +++ b/sound/sparc/dbri.c @@ -46,7 +46,7 @@ * * I've tried to stick to the following function naming conventions: * snd_* ALSA stuff - * cs4215_* CS4215 codec specfic stuff + * cs4215_* CS4215 codec specific stuff * dbri_* DBRI high-level stuff * other DBRI low-level stuff */ @@ -92,7 +92,7 @@ MODULE_PARM_DESC(enable, "Enable Sun DBRI soundcard."); #define D_USR (1<<4) #define D_DESC (1<<5) -static int dbri_debug = 0; +static int dbri_debug; module_param(dbri_debug, int, 0644); MODULE_PARM_DESC(dbri_debug, "Debug value for Sun DBRI soundcard."); @@ -593,7 +593,7 @@ struct snd_dbri { /* Return a pointer to dbri_streaminfo */ #define DBRI_STREAM(dbri, substream) &dbri->stream_info[DBRI_STREAMNO(substream)] -static struct snd_dbri *dbri_list = NULL; /* All DBRI devices */ +static struct snd_dbri *dbri_list; /* All DBRI devices */ /* * Short data pipes transmit LSB first. The CS4215 receives MSB first. Grrr. @@ -2521,11 +2521,11 @@ void snd_dbri_proc(struct snd_dbri * dbri) struct snd_info_entry *entry; if (! snd_card_proc_new(dbri->card, "regs", &entry)) - snd_info_set_text_ops(entry, dbri, 1024, dbri_regs_read); + snd_info_set_text_ops(entry, dbri, dbri_regs_read); #ifdef DBRI_DEBUG if (! snd_card_proc_new(dbri->card, "debug", &entry)) { - snd_info_set_text_ops(entry, dbri, 4096, dbri_debug_read); + snd_info_set_text_ops(entry, dbri, dbri_debug_read); entry->mode = S_IFREG | S_IRUGO; /* Readable only. */ } #endif @@ -2569,7 +2569,7 @@ static int __init snd_dbri_create(struct snd_card *card, return -EIO; } - err = request_irq(dbri->irq, snd_dbri_interrupt, SA_SHIRQ, + err = request_irq(dbri->irq, snd_dbri_interrupt, IRQF_SHARED, "DBRI audio", dbri); if (err) { printk(KERN_ERR "DBRI: Can't get irq %d\n", dbri->irq); @@ -2645,9 +2645,9 @@ static int __init dbri_attach(int prom_node, struct sbus_dev *sdev) strcpy(card->driver, "DBRI"); strcpy(card->shortname, "Sun DBRI"); rp = &sdev->resource[0]; - sprintf(card->longname, "%s at 0x%02lx:0x%08lx, irq %s", + sprintf(card->longname, "%s at 0x%02lx:0x%016Lx, irq %d", card->shortname, - rp->flags & 0xffL, rp->start, __irq_itoa(irq.pri)); + rp->flags & 0xffL, (unsigned long long)rp->start, irq.pri); if ((err = snd_dbri_create(card, sdev, &irq, dev)) < 0) { snd_card_free(card); diff --git a/sound/synth/emux/emux.c b/sound/synth/emux/emux.c index fc733bbf4..573e3701c 100644 --- a/sound/synth/emux/emux.c +++ b/sound/synth/emux/emux.c @@ -63,6 +63,7 @@ int snd_emux_new(struct snd_emux **remu) return 0; } +EXPORT_SYMBOL(snd_emux_new); /* */ @@ -136,6 +137,7 @@ int snd_emux_register(struct snd_emux *emu, struct snd_card *card, int index, ch return 0; } +EXPORT_SYMBOL(snd_emux_register); /* */ @@ -171,18 +173,8 @@ int snd_emux_free(struct snd_emux *emu) return 0; } - -EXPORT_SYMBOL(snd_emux_new); -EXPORT_SYMBOL(snd_emux_register); EXPORT_SYMBOL(snd_emux_free); -EXPORT_SYMBOL(snd_emux_terminate_all); -EXPORT_SYMBOL(snd_emux_lock_voice); -EXPORT_SYMBOL(snd_emux_unlock_voice); - -/* soundfont.c */ -EXPORT_SYMBOL(snd_sf_linear_to_log); - /* * INIT part diff --git a/sound/synth/emux/emux_proc.c b/sound/synth/emux/emux_proc.c index 1ba68ce30..58b9601f3 100644 --- a/sound/synth/emux/emux_proc.c +++ b/sound/synth/emux/emux_proc.c @@ -119,7 +119,6 @@ void snd_emux_proc_init(struct snd_emux *emu, struct snd_card *card, int device) entry->content = SNDRV_INFO_CONTENT_TEXT; entry->private_data = emu; - entry->c.text.read_size = 1024; entry->c.text.read = snd_emux_proc_info_read; if (snd_info_register(entry) < 0) snd_info_free_entry(entry); diff --git a/sound/synth/emux/emux_seq.c b/sound/synth/emux/emux_seq.c index 8f00f0770..d176cc017 100644 --- a/sound/synth/emux/emux_seq.c +++ b/sound/synth/emux/emux_seq.c @@ -55,7 +55,8 @@ static struct snd_midi_op emux_ops = { SNDRV_SEQ_PORT_TYPE_MIDI_GM |\ SNDRV_SEQ_PORT_TYPE_MIDI_GS |\ SNDRV_SEQ_PORT_TYPE_MIDI_XG |\ - SNDRV_SEQ_PORT_TYPE_DIRECT_SAMPLE) + SNDRV_SEQ_PORT_TYPE_HARDWARE |\ + SNDRV_SEQ_PORT_TYPE_SYNTHESIZER) /* * Initialise the EMUX Synth by creating a client and registering diff --git a/sound/synth/emux/emux_synth.c b/sound/synth/emux/emux_synth.c index 24705d15e..3733118d3 100644 --- a/sound/synth/emux/emux_synth.c +++ b/sound/synth/emux/emux_synth.c @@ -434,6 +434,7 @@ snd_emux_terminate_all(struct snd_emux *emu) spin_unlock_irqrestore(&emu->voice_lock, flags); } +EXPORT_SYMBOL(snd_emux_terminate_all); /* * Terminate all voices associated with the given port @@ -951,6 +952,8 @@ void snd_emux_lock_voice(struct snd_emux *emu, int voice) spin_unlock_irqrestore(&emu->voice_lock, flags); } +EXPORT_SYMBOL(snd_emux_lock_voice); + /* */ void snd_emux_unlock_voice(struct snd_emux *emu, int voice) @@ -965,3 +968,5 @@ void snd_emux_unlock_voice(struct snd_emux *emu, int voice) voice, emu->voices[voice].state); spin_unlock_irqrestore(&emu->voice_lock, flags); } + +EXPORT_SYMBOL(snd_emux_unlock_voice); diff --git a/sound/synth/emux/soundfont.c b/sound/synth/emux/soundfont.c index 32c27162d..455e53593 100644 --- a/sound/synth/emux/soundfont.c +++ b/sound/synth/emux/soundfont.c @@ -195,7 +195,7 @@ snd_soundfont_load(struct snd_sf_list *sflist, const void __user *data, break; case SNDRV_SFNT_REMOVE_INFO: /* patch must be opened */ - if (sflist->currsf) { + if (!sflist->currsf) { snd_printk("soundfont: remove_info: patch not opened\n"); rc = -EINVAL; } else { @@ -810,6 +810,9 @@ snd_sf_linear_to_log(unsigned int amount, int offset, int ratio) return v; } +EXPORT_SYMBOL(snd_sf_linear_to_log); + + #define OFFSET_MSEC 653117 /* base = 1000 */ #define OFFSET_ABSCENT 851781 /* base = 8176 */ #define OFFSET_SAMPLERATE 1011119 /* base = 44100 */ @@ -1485,4 +1488,3 @@ snd_soundfont_remove_unlocked(struct snd_sf_list *sflist) unlock_preset(sflist); return 0; } - diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c index 4e614ac39..1b7f499c5 100644 --- a/sound/usb/usbaudio.c +++ b/sound/usb/usbaudio.c @@ -2138,7 +2138,7 @@ static void proc_pcm_format_add(struct snd_usb_stream *stream) sprintf(name, "stream%d", stream->pcm_index); if (! snd_card_proc_new(card, name, &entry)) - snd_info_set_text_ops(entry, stream, 1024, proc_pcm_format_read); + snd_info_set_text_ops(entry, stream, proc_pcm_format_read); } #else @@ -2260,10 +2260,9 @@ static int add_audio_endpoint(struct snd_usb_audio *chip, int stream, struct aud } /* create a new pcm */ - as = kmalloc(sizeof(*as), GFP_KERNEL); + as = kzalloc(sizeof(*as), GFP_KERNEL); if (! as) return -ENOMEM; - memset(as, 0, sizeof(*as)); as->pcm_index = chip->pcm_devs; as->chip = chip; as->fmt_type = fp->fmt_type; @@ -2627,18 +2626,18 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) if (!csep && altsd->bNumEndpoints >= 2) csep = snd_usb_find_desc(alts->endpoint[1].extra, alts->endpoint[1].extralen, NULL, USB_DT_CS_ENDPOINT); if (!csep || csep[0] < 7 || csep[2] != EP_GENERAL) { - snd_printk(KERN_ERR "%d:%u:%d : no or invalid class specific endpoint descriptor\n", + snd_printk(KERN_WARNING "%d:%u:%d : no or invalid" + " class specific endpoint descriptor\n", dev->devnum, iface_no, altno); - continue; + csep = NULL; } - fp = kmalloc(sizeof(*fp), GFP_KERNEL); + fp = kzalloc(sizeof(*fp), GFP_KERNEL); if (! fp) { snd_printk(KERN_ERR "cannot malloc\n"); return -ENOMEM; } - memset(fp, 0, sizeof(*fp)); fp->iface = iface_no; fp->altsetting = altno; fp->altset_idx = i; @@ -2648,7 +2647,7 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) if (snd_usb_get_speed(dev) == USB_SPEED_HIGH) fp->maxpacksize = (((fp->maxpacksize >> 11) & 3) + 1) * (fp->maxpacksize & 0x7ff); - fp->attributes = csep[3]; + fp->attributes = csep ? csep[3] : 0; /* some quirks for attributes here */ @@ -2980,7 +2979,7 @@ static int create_ua1000_quirk(struct snd_usb_audio *chip, return -ENXIO; alts = &iface->altsetting[1]; altsd = get_iface_desc(alts); - if (alts->extralen != 11 || alts->extra[1] != CS_AUDIO_INTERFACE || + if (alts->extralen != 11 || alts->extra[1] != USB_DT_CS_INTERFACE || altsd->bNumEndpoints != 1) return -ENXIO; @@ -3094,6 +3093,32 @@ static int snd_usb_audigy2nx_boot_quirk(struct usb_device *dev) return 0; } +/* + * C-Media CM106/CM106+ have four 16-bit internal registers that are nicely + * documented in the device's data sheet. + */ +static int snd_usb_cm106_write_int_reg(struct usb_device *dev, int reg, u16 value) +{ + u8 buf[4]; + buf[0] = 0x20; + buf[1] = value & 0xff; + buf[2] = (value >> 8) & 0xff; + buf[3] = reg; + return snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), USB_REQ_SET_CONFIGURATION, + USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_ENDPOINT, + 0, 0, &buf, 4, 1000); +} + +static int snd_usb_cm106_boot_quirk(struct usb_device *dev) +{ + /* + * Enable line-out driver mode, set headphone source to front + * channels, enable stereo mic. + */ + return snd_usb_cm106_write_int_reg(dev, 2, 0x8004); +} + + /* * Setup quirks */ @@ -3197,9 +3222,9 @@ static void snd_usb_audio_create_proc(struct snd_usb_audio *chip) { struct snd_info_entry *entry; if (! snd_card_proc_new(chip->card, "usbbus", &entry)) - snd_info_set_text_ops(entry, chip, 1024, proc_audio_usbbus_read); + snd_info_set_text_ops(entry, chip, proc_audio_usbbus_read); if (! snd_card_proc_new(chip->card, "usbid", &entry)) - snd_info_set_text_ops(entry, chip, 1024, proc_audio_usbid_read); + snd_info_set_text_ops(entry, chip, proc_audio_usbid_read); } /* @@ -3364,6 +3389,12 @@ static void *snd_usb_audio_probe(struct usb_device *dev, goto __err_val; } + /* C-Media CM106 / Turtle Beach Audio Advantage Roadie */ + if (id == USB_ID(0x10f5, 0x0200)) { + if (snd_usb_cm106_boot_quirk(dev) < 0) + goto __err_val; + } + /* * found a config. now register to ALSA */ diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h index 88733524d..0f4b2b854 100644 --- a/sound/usb/usbaudio.h +++ b/sound/usb/usbaudio.h @@ -30,13 +30,6 @@ #define USB_SUBCLASS_MIDI_STREAMING 0x03 #define USB_SUBCLASS_VENDOR_SPEC 0xff -#define CS_AUDIO_UNDEFINED 0x20 -#define CS_AUDIO_DEVICE 0x21 -#define CS_AUDIO_CONFIGURATION 0x22 -#define CS_AUDIO_STRING 0x23 -#define CS_AUDIO_INTERFACE 0x24 -#define CS_AUDIO_ENDPOINT 0x25 - #define HEADER 0x01 #define INPUT_TERMINAL 0x02 #define OUTPUT_TERMINAL 0x03 diff --git a/sound/usb/usbmidi.c b/sound/usb/usbmidi.c index 2b9d940c8..5105b6b05 100644 --- a/sound/usb/usbmidi.c +++ b/sound/usb/usbmidi.c @@ -48,6 +48,7 @@ #include #include #include +#include #include "usbaudio.h" @@ -1010,97 +1011,157 @@ static struct snd_rawmidi_substream *snd_usbmidi_find_substream(struct snd_usb_m * "(product) MIDI (n)" schema because they aren't external MIDI ports, * such as internal control or synthesizer ports. */ -static struct { +static struct port_info { u32 id; - int port; - const char *name_format; -} snd_usbmidi_port_names[] = { + short int port; + short int voices; + const char *name; + unsigned int seq_flags; +} snd_usbmidi_port_info[] = { +#define PORT_INFO(vendor, product, num, name_, voices_, flags) \ + { .id = USB_ID(vendor, product), \ + .port = num, .voices = voices_, \ + .name = name_, .seq_flags = flags } +#define EXTERNAL_PORT(vendor, product, num, name) \ + PORT_INFO(vendor, product, num, name, 0, \ + SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC | \ + SNDRV_SEQ_PORT_TYPE_HARDWARE | \ + SNDRV_SEQ_PORT_TYPE_PORT) +#define CONTROL_PORT(vendor, product, num, name) \ + PORT_INFO(vendor, product, num, name, 0, \ + SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC | \ + SNDRV_SEQ_PORT_TYPE_HARDWARE) +#define ROLAND_SYNTH_PORT(vendor, product, num, name, voices) \ + PORT_INFO(vendor, product, num, name, voices, \ + SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC | \ + SNDRV_SEQ_PORT_TYPE_MIDI_GM | \ + SNDRV_SEQ_PORT_TYPE_MIDI_GM2 | \ + SNDRV_SEQ_PORT_TYPE_MIDI_GS | \ + SNDRV_SEQ_PORT_TYPE_MIDI_XG | \ + SNDRV_SEQ_PORT_TYPE_HARDWARE | \ + SNDRV_SEQ_PORT_TYPE_SYNTHESIZER) +#define SOUNDCANVAS_PORT(vendor, product, num, name, voices) \ + PORT_INFO(vendor, product, num, name, voices, \ + SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC | \ + SNDRV_SEQ_PORT_TYPE_MIDI_GM | \ + SNDRV_SEQ_PORT_TYPE_MIDI_GM2 | \ + SNDRV_SEQ_PORT_TYPE_MIDI_GS | \ + SNDRV_SEQ_PORT_TYPE_MIDI_XG | \ + SNDRV_SEQ_PORT_TYPE_MIDI_MT32 | \ + SNDRV_SEQ_PORT_TYPE_HARDWARE | \ + SNDRV_SEQ_PORT_TYPE_SYNTHESIZER) /* Roland UA-100 */ - { USB_ID(0x0582, 0x0000), 2, "%s Control" }, + CONTROL_PORT(0x0582, 0x0000, 2, "%s Control"), /* Roland SC-8850 */ - { USB_ID(0x0582, 0x0003), 0, "%s Part A" }, - { USB_ID(0x0582, 0x0003), 1, "%s Part B" }, - { USB_ID(0x0582, 0x0003), 2, "%s Part C" }, - { USB_ID(0x0582, 0x0003), 3, "%s Part D" }, - { USB_ID(0x0582, 0x0003), 4, "%s MIDI 1" }, - { USB_ID(0x0582, 0x0003), 5, "%s MIDI 2" }, + SOUNDCANVAS_PORT(0x0582, 0x0003, 0, "%s Part A", 128), + SOUNDCANVAS_PORT(0x0582, 0x0003, 1, "%s Part B", 128), + SOUNDCANVAS_PORT(0x0582, 0x0003, 2, "%s Part C", 128), + SOUNDCANVAS_PORT(0x0582, 0x0003, 3, "%s Part D", 128), + EXTERNAL_PORT(0x0582, 0x0003, 4, "%s MIDI 1"), + EXTERNAL_PORT(0x0582, 0x0003, 5, "%s MIDI 2"), /* Roland U-8 */ - { USB_ID(0x0582, 0x0004), 0, "%s MIDI" }, - { USB_ID(0x0582, 0x0004), 1, "%s Control" }, + EXTERNAL_PORT(0x0582, 0x0004, 0, "%s MIDI"), + CONTROL_PORT(0x0582, 0x0004, 1, "%s Control"), /* Roland SC-8820 */ - { USB_ID(0x0582, 0x0007), 0, "%s Part A" }, - { USB_ID(0x0582, 0x0007), 1, "%s Part B" }, - { USB_ID(0x0582, 0x0007), 2, "%s MIDI" }, + SOUNDCANVAS_PORT(0x0582, 0x0007, 0, "%s Part A", 64), + SOUNDCANVAS_PORT(0x0582, 0x0007, 1, "%s Part B", 64), + EXTERNAL_PORT(0x0582, 0x0007, 2, "%s MIDI"), /* Roland SK-500 */ - { USB_ID(0x0582, 0x000b), 0, "%s Part A" }, - { USB_ID(0x0582, 0x000b), 1, "%s Part B" }, - { USB_ID(0x0582, 0x000b), 2, "%s MIDI" }, + SOUNDCANVAS_PORT(0x0582, 0x000b, 0, "%s Part A", 64), + SOUNDCANVAS_PORT(0x0582, 0x000b, 1, "%s Part B", 64), + EXTERNAL_PORT(0x0582, 0x000b, 2, "%s MIDI"), /* Roland SC-D70 */ - { USB_ID(0x0582, 0x000c), 0, "%s Part A" }, - { USB_ID(0x0582, 0x000c), 1, "%s Part B" }, - { USB_ID(0x0582, 0x000c), 2, "%s MIDI" }, + SOUNDCANVAS_PORT(0x0582, 0x000c, 0, "%s Part A", 64), + SOUNDCANVAS_PORT(0x0582, 0x000c, 1, "%s Part B", 64), + EXTERNAL_PORT(0x0582, 0x000c, 2, "%s MIDI"), /* Edirol UM-880 */ - { USB_ID(0x0582, 0x0014), 8, "%s Control" }, + CONTROL_PORT(0x0582, 0x0014, 8, "%s Control"), /* Edirol SD-90 */ - { USB_ID(0x0582, 0x0016), 0, "%s Part A" }, - { USB_ID(0x0582, 0x0016), 1, "%s Part B" }, - { USB_ID(0x0582, 0x0016), 2, "%s MIDI 1" }, - { USB_ID(0x0582, 0x0016), 3, "%s MIDI 2" }, + ROLAND_SYNTH_PORT(0x0582, 0x0016, 0, "%s Part A", 128), + ROLAND_SYNTH_PORT(0x0582, 0x0016, 1, "%s Part B", 128), + EXTERNAL_PORT(0x0582, 0x0016, 2, "%s MIDI 1"), + EXTERNAL_PORT(0x0582, 0x0016, 3, "%s MIDI 2"), /* Edirol UM-550 */ - { USB_ID(0x0582, 0x0023), 5, "%s Control" }, + CONTROL_PORT(0x0582, 0x0023, 5, "%s Control"), /* Edirol SD-20 */ - { USB_ID(0x0582, 0x0027), 0, "%s Part A" }, - { USB_ID(0x0582, 0x0027), 1, "%s Part B" }, - { USB_ID(0x0582, 0x0027), 2, "%s MIDI" }, + ROLAND_SYNTH_PORT(0x0582, 0x0027, 0, "%s Part A", 64), + ROLAND_SYNTH_PORT(0x0582, 0x0027, 1, "%s Part B", 64), + EXTERNAL_PORT(0x0582, 0x0027, 2, "%s MIDI"), /* Edirol SD-80 */ - { USB_ID(0x0582, 0x0029), 0, "%s Part A" }, - { USB_ID(0x0582, 0x0029), 1, "%s Part B" }, - { USB_ID(0x0582, 0x0029), 2, "%s MIDI 1" }, - { USB_ID(0x0582, 0x0029), 3, "%s MIDI 2" }, + ROLAND_SYNTH_PORT(0x0582, 0x0029, 0, "%s Part A", 128), + ROLAND_SYNTH_PORT(0x0582, 0x0029, 1, "%s Part B", 128), + EXTERNAL_PORT(0x0582, 0x0029, 2, "%s MIDI 1"), + EXTERNAL_PORT(0x0582, 0x0029, 3, "%s MIDI 2"), /* Edirol UA-700 */ - { USB_ID(0x0582, 0x002b), 0, "%s MIDI" }, - { USB_ID(0x0582, 0x002b), 1, "%s Control" }, + EXTERNAL_PORT(0x0582, 0x002b, 0, "%s MIDI"), + CONTROL_PORT(0x0582, 0x002b, 1, "%s Control"), /* Roland VariOS */ - { USB_ID(0x0582, 0x002f), 0, "%s MIDI" }, - { USB_ID(0x0582, 0x002f), 1, "%s External MIDI" }, - { USB_ID(0x0582, 0x002f), 2, "%s Sync" }, + EXTERNAL_PORT(0x0582, 0x002f, 0, "%s MIDI"), + EXTERNAL_PORT(0x0582, 0x002f, 1, "%s External MIDI"), + EXTERNAL_PORT(0x0582, 0x002f, 2, "%s Sync"), /* Edirol PCR */ - { USB_ID(0x0582, 0x0033), 0, "%s MIDI" }, - { USB_ID(0x0582, 0x0033), 1, "%s 1" }, - { USB_ID(0x0582, 0x0033), 2, "%s 2" }, + EXTERNAL_PORT(0x0582, 0x0033, 0, "%s MIDI"), + EXTERNAL_PORT(0x0582, 0x0033, 1, "%s 1"), + EXTERNAL_PORT(0x0582, 0x0033, 2, "%s 2"), /* BOSS GS-10 */ - { USB_ID(0x0582, 0x003b), 0, "%s MIDI" }, - { USB_ID(0x0582, 0x003b), 1, "%s Control" }, + EXTERNAL_PORT(0x0582, 0x003b, 0, "%s MIDI"), + CONTROL_PORT(0x0582, 0x003b, 1, "%s Control"), /* Edirol UA-1000 */ - { USB_ID(0x0582, 0x0044), 0, "%s MIDI" }, - { USB_ID(0x0582, 0x0044), 1, "%s Control" }, + EXTERNAL_PORT(0x0582, 0x0044, 0, "%s MIDI"), + CONTROL_PORT(0x0582, 0x0044, 1, "%s Control"), /* Edirol UR-80 */ - { USB_ID(0x0582, 0x0048), 0, "%s MIDI" }, - { USB_ID(0x0582, 0x0048), 1, "%s 1" }, - { USB_ID(0x0582, 0x0048), 2, "%s 2" }, + EXTERNAL_PORT(0x0582, 0x0048, 0, "%s MIDI"), + EXTERNAL_PORT(0x0582, 0x0048, 1, "%s 1"), + EXTERNAL_PORT(0x0582, 0x0048, 2, "%s 2"), /* Edirol PCR-A */ - { USB_ID(0x0582, 0x004d), 0, "%s MIDI" }, - { USB_ID(0x0582, 0x004d), 1, "%s 1" }, - { USB_ID(0x0582, 0x004d), 2, "%s 2" }, + EXTERNAL_PORT(0x0582, 0x004d, 0, "%s MIDI"), + EXTERNAL_PORT(0x0582, 0x004d, 1, "%s 1"), + EXTERNAL_PORT(0x0582, 0x004d, 2, "%s 2"), /* Edirol UM-3EX */ - { USB_ID(0x0582, 0x009a), 3, "%s Control" }, + CONTROL_PORT(0x0582, 0x009a, 3, "%s Control"), /* M-Audio MidiSport 8x8 */ - { USB_ID(0x0763, 0x1031), 8, "%s Control" }, - { USB_ID(0x0763, 0x1033), 8, "%s Control" }, + CONTROL_PORT(0x0763, 0x1031, 8, "%s Control"), + CONTROL_PORT(0x0763, 0x1033, 8, "%s Control"), /* MOTU Fastlane */ - { USB_ID(0x07fd, 0x0001), 0, "%s MIDI A" }, - { USB_ID(0x07fd, 0x0001), 1, "%s MIDI B" }, + EXTERNAL_PORT(0x07fd, 0x0001, 0, "%s MIDI A"), + EXTERNAL_PORT(0x07fd, 0x0001, 1, "%s MIDI B"), /* Emagic Unitor8/AMT8/MT4 */ - { USB_ID(0x086a, 0x0001), 8, "%s Broadcast" }, - { USB_ID(0x086a, 0x0002), 8, "%s Broadcast" }, - { USB_ID(0x086a, 0x0003), 4, "%s Broadcast" }, + EXTERNAL_PORT(0x086a, 0x0001, 8, "%s Broadcast"), + EXTERNAL_PORT(0x086a, 0x0002, 8, "%s Broadcast"), + EXTERNAL_PORT(0x086a, 0x0003, 4, "%s Broadcast"), }; +static struct port_info *find_port_info(struct snd_usb_midi* umidi, int number) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(snd_usbmidi_port_info); ++i) { + if (snd_usbmidi_port_info[i].id == umidi->chip->usb_id && + snd_usbmidi_port_info[i].port == number) + return &snd_usbmidi_port_info[i]; + } + return NULL; +} + +static void snd_usbmidi_get_port_info(struct snd_rawmidi *rmidi, int number, + struct snd_seq_port_info *seq_port_info) +{ + struct snd_usb_midi *umidi = rmidi->private_data; + struct port_info *port_info; + + /* TODO: read port flags from descriptors */ + port_info = find_port_info(umidi, number); + if (port_info) { + seq_port_info->type = port_info->seq_flags; + seq_port_info->midi_voices = port_info->voices; + } +} + static void snd_usbmidi_init_substream(struct snd_usb_midi* umidi, int stream, int number, struct snd_rawmidi_substream ** rsubstream) { - int i; + struct port_info *port_info; const char *name_format; struct snd_rawmidi_substream *substream = snd_usbmidi_find_substream(umidi, stream, number); @@ -1110,14 +1171,8 @@ static void snd_usbmidi_init_substream(struct snd_usb_midi* umidi, } /* TODO: read port name from jack descriptor */ - name_format = "%s MIDI %d"; - for (i = 0; i < ARRAY_SIZE(snd_usbmidi_port_names); ++i) { - if (snd_usbmidi_port_names[i].id == umidi->chip->usb_id && - snd_usbmidi_port_names[i].port == number) { - name_format = snd_usbmidi_port_names[i].name_format; - break; - } - } + port_info = find_port_info(umidi, number); + name_format = port_info ? port_info->name : "%s MIDI %d"; snprintf(substream->name, sizeof(substream->name), name_format, umidi->chip->card->shortname, number + 1); @@ -1358,7 +1413,7 @@ static int snd_usbmidi_detect_yamaha(struct snd_usb_midi* umidi, for (cs_desc = hostif->extra; cs_desc < hostif->extra + hostif->extralen && cs_desc[0] >= 2; cs_desc += cs_desc[0]) { - if (cs_desc[1] == CS_AUDIO_INTERFACE) { + if (cs_desc[1] == USB_DT_CS_INTERFACE) { if (cs_desc[2] == MIDI_IN_JACK) endpoint->in_cables = (endpoint->in_cables << 1) | 1; else if (cs_desc[2] == MIDI_OUT_JACK) @@ -1457,6 +1512,10 @@ static int snd_usbmidi_create_endpoints_midiman(struct snd_usb_midi* umidi, return 0; } +static struct snd_rawmidi_global_ops snd_usbmidi_ops = { + .get_port_info = snd_usbmidi_get_port_info, +}; + static int snd_usbmidi_create_rawmidi(struct snd_usb_midi* umidi, int out_ports, int in_ports) { @@ -1472,6 +1531,7 @@ static int snd_usbmidi_create_rawmidi(struct snd_usb_midi* umidi, rmidi->info_flags = SNDRV_RAWMIDI_INFO_OUTPUT | SNDRV_RAWMIDI_INFO_INPUT | SNDRV_RAWMIDI_INFO_DUPLEX; + rmidi->ops = &snd_usbmidi_ops; rmidi->private_data = umidi; rmidi->private_free = snd_usbmidi_rawmidi_free; snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_OUTPUT, &snd_usbmidi_output_ops); diff --git a/sound/usb/usbmixer.c b/sound/usb/usbmixer.c index ce86283ee..491e975a0 100644 --- a/sound/usb/usbmixer.c +++ b/sound/usb/usbmixer.c @@ -46,6 +46,27 @@ /* ignore error from controls - for debugging */ /* #define IGNORE_CTL_ERROR */ +/* + * Sound Blaster remote control configuration + * + * format of remote control data: + * Extigy: xx 00 + * Audigy 2 NX: 06 80 xx 00 00 00 + * Live! 24-bit: 06 80 xx yy 22 83 + */ +static const struct rc_config { + u32 usb_id; + u8 offset; + u8 length; + u8 packet_length; + u8 mute_mixer_id; + u32 mute_code; +} rc_configs[] = { + { USB_ID(0x041e, 0x3000), 0, 1, 2, 18, 0x0013 }, /* Extigy */ + { USB_ID(0x041e, 0x3020), 2, 1, 6, 18, 0x0013 }, /* Audigy 2 NX */ + { USB_ID(0x041e, 0x3040), 2, 2, 6, 2, 0x6e91 }, /* Live! 24-bit */ +}; + struct usb_mixer_interface { struct snd_usb_audio *chip; unsigned int ctrlif; @@ -55,11 +76,7 @@ struct usb_mixer_interface { struct usb_mixer_elem_info **id_elems; /* array[256], indexed by unit id */ /* Sound Blaster remote control stuff */ - enum { - RC_NONE, - RC_EXTIGY, - RC_AUDIGY2NX, - } rc_type; + const struct rc_config *rc_cfg; unsigned long rc_hwdep_open; u32 rc_code; wait_queue_head_t rc_waitq; @@ -1647,7 +1664,7 @@ static void snd_usb_mixer_notify_id(struct usb_mixer_interface *mixer, static void snd_usb_mixer_memory_change(struct usb_mixer_interface *mixer, int unitid) { - if (mixer->rc_type == RC_NONE) + if (!mixer->rc_cfg) return; /* unit ids specific to Extigy/Audigy 2 NX: */ switch (unitid) { @@ -1732,20 +1749,19 @@ static void snd_usb_soundblaster_remote_complete(struct urb *urb, struct pt_regs *regs) { struct usb_mixer_interface *mixer = urb->context; - /* - * format of remote control data: - * Extigy: xx 00 - * Audigy 2 NX: 06 80 xx 00 00 00 - */ - int offset = mixer->rc_type == RC_EXTIGY ? 0 : 2; + const struct rc_config *rc = mixer->rc_cfg; u32 code; - if (urb->status < 0 || urb->actual_length <= offset) + if (urb->status < 0 || urb->actual_length < rc->packet_length) return; - code = mixer->rc_buffer[offset]; + + code = mixer->rc_buffer[rc->offset]; + if (rc->length == 2) + code |= mixer->rc_buffer[rc->offset + 1] << 8; + /* the Mute button actually changes the mixer control */ - if (code == 13) - snd_usb_mixer_notify_id(mixer, 18); + if (code == rc->mute_code) + snd_usb_mixer_notify_id(mixer, rc->mute_mixer_id); mixer->rc_code = code; wmb(); wake_up(&mixer->rc_waitq); @@ -1801,21 +1817,17 @@ static unsigned int snd_usb_sbrc_hwdep_poll(struct snd_hwdep *hw, struct file *f static int snd_usb_soundblaster_remote_init(struct usb_mixer_interface *mixer) { struct snd_hwdep *hwdep; - int err, len; + int err, len, i; - switch (mixer->chip->usb_id) { - case USB_ID(0x041e, 0x3000): - mixer->rc_type = RC_EXTIGY; - len = 2; - break; - case USB_ID(0x041e, 0x3020): - mixer->rc_type = RC_AUDIGY2NX; - len = 6; - break; - default: + for (i = 0; i < ARRAY_SIZE(rc_configs); ++i) + if (rc_configs[i].usb_id == mixer->chip->usb_id) + break; + if (i >= ARRAY_SIZE(rc_configs)) return 0; - } + mixer->rc_cfg = &rc_configs[i]; + len = mixer->rc_cfg->packet_length; + init_waitqueue_head(&mixer->rc_waitq); err = snd_hwdep_new(mixer->chip->card, "SB remote control", 0, &hwdep); if (err < 0) @@ -1998,7 +2010,7 @@ int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif) if ((err = snd_audigy2nx_controls_create(mixer)) < 0) goto _error; if (!snd_card_proc_new(chip->card, "audigy2nx", &entry)) - snd_info_set_text_ops(entry, mixer, 1024, + snd_info_set_text_ops(entry, mixer, snd_audigy2nx_proc_read); } diff --git a/sound/usb/usx2y/usbusx2yaudio.c b/sound/usb/usx2y/usbusx2yaudio.c index f6bd0dee5..8d2f26db5 100644 --- a/sound/usb/usx2y/usbusx2yaudio.c +++ b/sound/usb/usx2y/usbusx2yaudio.c @@ -322,7 +322,7 @@ static void i_usX2Y_urb_complete(struct urb *urb, struct pt_regs *regs) usX2Y_error_urb_status(usX2Y, subs, urb); return; } - if (likely((0xFFFF & urb->start_frame) == usX2Y->wait_iso_frame)) + if (likely(urb->start_frame == usX2Y->wait_iso_frame)) subs->completed_urb = urb; else { usX2Y_error_sequence(usX2Y, subs, urb); @@ -335,13 +335,9 @@ static void i_usX2Y_urb_complete(struct urb *urb, struct pt_regs *regs) atomic_read(&capsubs->state) >= state_PREPARED && (playbacksubs->completed_urb || atomic_read(&playbacksubs->state) < state_PREPARED)) { - if (!usX2Y_usbframe_complete(capsubs, playbacksubs, urb->start_frame)) { - if (nr_of_packs() <= urb->start_frame && - urb->start_frame <= (2 * nr_of_packs() - 1)) // uhci and ohci - usX2Y->wait_iso_frame = urb->start_frame - nr_of_packs(); - else - usX2Y->wait_iso_frame += nr_of_packs(); - } else { + if (!usX2Y_usbframe_complete(capsubs, playbacksubs, urb->start_frame)) + usX2Y->wait_iso_frame += nr_of_packs(); + else { snd_printdd("\n"); usX2Y_clients_stop(usX2Y); } @@ -495,7 +491,6 @@ static int usX2Y_urbs_start(struct snd_usX2Y_substream *subs) if (subs != NULL && atomic_read(&subs->state) >= state_PREPARED) goto start; } - usX2Y->wait_iso_frame = -1; start: usX2Y_subs_startup(subs); @@ -516,10 +511,9 @@ static int usX2Y_urbs_start(struct snd_usX2Y_substream *subs) snd_printk (KERN_ERR "cannot submit datapipe for urb %d, err = %d\n", i, err); err = -EPIPE; goto cleanup; - } else { - if (0 > usX2Y->wait_iso_frame) + } else + if (i == 0) usX2Y->wait_iso_frame = urb->start_frame; - } urb->transfer_flags = 0; } else { atomic_set(&subs->state, state_STARTING1); diff --git a/sound/usb/usx2y/usx2yhwdeppcm.c b/sound/usb/usx2y/usx2yhwdeppcm.c index bb2c8e900..3bda17de2 100644 --- a/sound/usb/usx2y/usx2yhwdeppcm.c +++ b/sound/usb/usx2y/usx2yhwdeppcm.c @@ -50,6 +50,7 @@ Currently rawusb dma pcm buffer transport (this file) is only available to snd-usb-usx2y. */ +#include #include "usbusx2yaudio.c" #if defined(USX2Y_NRPACKS_VARIABLE) || (!defined(USX2Y_NRPACKS_VARIABLE) && USX2Y_NRPACKS == 1) @@ -57,12 +58,12 @@ #include -static int usX2Y_usbpcm_urb_capt_retire(snd_usX2Y_substream_t *subs) +static int usX2Y_usbpcm_urb_capt_retire(struct snd_usX2Y_substream *subs) { struct urb *urb = subs->completed_urb; - snd_pcm_runtime_t *runtime = subs->pcm_substream->runtime; + struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime; int i, lens = 0, hwptr_done = subs->hwptr_done; - usX2Ydev_t *usX2Y = subs->usX2Y; + struct usX2Ydev *usX2Y = subs->usX2Y; if (0 > usX2Y->hwdep_pcm_shm->capture_iso_start) { //FIXME int head = usX2Y->hwdep_pcm_shm->captured_iso_head + 1; if (head >= ARRAY_SIZE(usX2Y->hwdep_pcm_shm->captured_iso)) @@ -72,7 +73,7 @@ static int usX2Y_usbpcm_urb_capt_retire(snd_usX2Y_substream_t *subs) } for (i = 0; i < nr_of_packs(); i++) { if (urb->iso_frame_desc[i].status) { /* active? hmm, skip this */ - snd_printk("activ frame status %i. Most propably some hardware problem.\n", urb->iso_frame_desc[i].status); + snd_printk(KERN_ERR "activ frame status %i. Most propably some hardware problem.\n", urb->iso_frame_desc[i].status); return urb->iso_frame_desc[i].status; } lens += urb->iso_frame_desc[i].actual_length / usX2Y->stride; @@ -89,7 +90,8 @@ static int usX2Y_usbpcm_urb_capt_retire(snd_usX2Y_substream_t *subs) return 0; } -static inline int usX2Y_iso_frames_per_buffer(snd_pcm_runtime_t *runtime, usX2Ydev_t * usX2Y) +static inline int usX2Y_iso_frames_per_buffer(struct snd_pcm_runtime *runtime, + struct usX2Ydev * usX2Y) { return (runtime->buffer_size * 1000) / usX2Y->rate + 1; //FIXME: so far only correct period_size == 2^x ? } @@ -104,13 +106,13 @@ static inline int usX2Y_iso_frames_per_buffer(snd_pcm_runtime_t *runtime, usX2Yd * it directly from the buffer. thus the data is once copied to * a temporary buffer and urb points to that. */ -static int usX2Y_hwdep_urb_play_prepare(snd_usX2Y_substream_t *subs, - struct urb *urb) +static int usX2Y_hwdep_urb_play_prepare(struct snd_usX2Y_substream *subs, + struct urb *urb) { int count, counts, pack; - usX2Ydev_t *usX2Y = subs->usX2Y; + struct usX2Ydev *usX2Y = subs->usX2Y; struct snd_usX2Y_hwdep_pcm_shm *shm = usX2Y->hwdep_pcm_shm; - snd_pcm_runtime_t *runtime = subs->pcm_substream->runtime; + struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime; if (0 > shm->playback_iso_start) { shm->playback_iso_start = shm->captured_iso_head - @@ -125,7 +127,7 @@ static int usX2Y_hwdep_urb_play_prepare(snd_usX2Y_substream_t *subs, /* calculate the size of a packet */ counts = shm->captured_iso[shm->playback_iso_head].length / usX2Y->stride; if (counts < 43 || counts > 50) { - snd_printk("should not be here with counts=%i\n", counts); + snd_printk(KERN_ERR "should not be here with counts=%i\n", counts); return -EPIPE; } /* set up descriptor */ @@ -143,13 +145,14 @@ static int usX2Y_hwdep_urb_play_prepare(snd_usX2Y_substream_t *subs, } -static inline void usX2Y_usbpcm_urb_capt_iso_advance(snd_usX2Y_substream_t *subs, struct urb *urb) +static inline void usX2Y_usbpcm_urb_capt_iso_advance(struct snd_usX2Y_substream *subs, + struct urb *urb) { int pack; for (pack = 0; pack < nr_of_packs(); ++pack) { struct usb_iso_packet_descriptor *desc = urb->iso_frame_desc + pack; if (NULL != subs) { - snd_usX2Y_hwdep_pcm_shm_t *shm = subs->usX2Y->hwdep_pcm_shm; + struct snd_usX2Y_hwdep_pcm_shm *shm = subs->usX2Y->hwdep_pcm_shm; int head = shm->captured_iso_head + 1; if (head >= ARRAY_SIZE(shm->captured_iso)) head = 0; @@ -165,9 +168,10 @@ static inline void usX2Y_usbpcm_urb_capt_iso_advance(snd_usX2Y_substream_t *subs } } -static inline int usX2Y_usbpcm_usbframe_complete(snd_usX2Y_substream_t *capsubs, - snd_usX2Y_substream_t *capsubs2, - snd_usX2Y_substream_t *playbacksubs, int frame) +static inline int usX2Y_usbpcm_usbframe_complete(struct snd_usX2Y_substream *capsubs, + struct snd_usX2Y_substream *capsubs2, + struct snd_usX2Y_substream *playbacksubs, + int frame) { int err, state; struct urb *urb = playbacksubs->completed_urb; @@ -176,10 +180,8 @@ static inline int usX2Y_usbpcm_usbframe_complete(snd_usX2Y_substream_t *capsubs, if (NULL != urb) { if (state == state_RUNNING) usX2Y_urb_play_retire(playbacksubs, urb); - else - if (state >= state_PRERUNNING) { - atomic_inc(&playbacksubs->state); - } + else if (state >= state_PRERUNNING) + atomic_inc(&playbacksubs->state); } else { switch (state) { case state_STARTING1: @@ -206,10 +208,8 @@ static inline int usX2Y_usbpcm_usbframe_complete(snd_usX2Y_substream_t *capsubs, if (state == state_RUNNING) { if ((err = usX2Y_usbpcm_urb_capt_retire(capsubs))) return err; - } else { - if (state >= state_PRERUNNING) - atomic_inc(&capsubs->state); - } + } else if (state >= state_PRERUNNING) + atomic_inc(&capsubs->state); usX2Y_usbpcm_urb_capt_iso_advance(capsubs, capsubs->completed_urb); if (NULL != capsubs2) usX2Y_usbpcm_urb_capt_iso_advance(NULL, capsubs2->completed_urb); @@ -228,19 +228,22 @@ static inline int usX2Y_usbpcm_usbframe_complete(snd_usX2Y_substream_t *capsubs, static void i_usX2Y_usbpcm_urb_complete(struct urb *urb, struct pt_regs *regs) { - snd_usX2Y_substream_t *subs = (snd_usX2Y_substream_t*)urb->context; - usX2Ydev_t *usX2Y = subs->usX2Y; - snd_usX2Y_substream_t *capsubs, *capsubs2, *playbacksubs; + struct snd_usX2Y_substream *subs = urb->context; + struct usX2Ydev *usX2Y = subs->usX2Y; + struct snd_usX2Y_substream *capsubs, *capsubs2, *playbacksubs; if (unlikely(atomic_read(&subs->state) < state_PREPARED)) { - snd_printdd("hcd_frame=%i ep=%i%s status=%i start_frame=%i\n", usb_get_current_frame_number(usX2Y->chip.dev), subs->endpoint, usb_pipein(urb->pipe) ? "in" : "out", urb->status, urb->start_frame); + snd_printdd("hcd_frame=%i ep=%i%s status=%i start_frame=%i\n", + usb_get_current_frame_number(usX2Y->chip.dev), + subs->endpoint, usb_pipein(urb->pipe) ? "in" : "out", + urb->status, urb->start_frame); return; } if (unlikely(urb->status)) { usX2Y_error_urb_status(usX2Y, subs, urb); return; } - if (likely((0xFFFF & urb->start_frame) == usX2Y->wait_iso_frame)) + if (likely(urb->start_frame == usX2Y->wait_iso_frame)) subs->completed_urb = urb; else { usX2Y_error_sequence(usX2Y, subs, urb); @@ -253,13 +256,9 @@ static void i_usX2Y_usbpcm_urb_complete(struct urb *urb, struct pt_regs *regs) if (capsubs->completed_urb && atomic_read(&capsubs->state) >= state_PREPARED && (NULL == capsubs2 || capsubs2->completed_urb) && (playbacksubs->completed_urb || atomic_read(&playbacksubs->state) < state_PREPARED)) { - if (!usX2Y_usbpcm_usbframe_complete(capsubs, capsubs2, playbacksubs, urb->start_frame)) { - if (nr_of_packs() <= urb->start_frame && - urb->start_frame <= (2 * nr_of_packs() - 1)) // uhci and ohci - usX2Y->wait_iso_frame = urb->start_frame - nr_of_packs(); - else - usX2Y->wait_iso_frame += nr_of_packs(); - } else { + if (!usX2Y_usbpcm_usbframe_complete(capsubs, capsubs2, playbacksubs, urb->start_frame)) + usX2Y->wait_iso_frame += nr_of_packs(); + else { snd_printdd("\n"); usX2Y_clients_stop(usX2Y); } @@ -267,7 +266,7 @@ static void i_usX2Y_usbpcm_urb_complete(struct urb *urb, struct pt_regs *regs) } -static void usX2Y_hwdep_urb_release(struct urb** urb) +static void usX2Y_hwdep_urb_release(struct urb **urb) { usb_kill_urb(*urb); usb_free_urb(*urb); @@ -277,7 +276,7 @@ static void usX2Y_hwdep_urb_release(struct urb** urb) /* * release a substream */ -static void usX2Y_usbpcm_urbs_release(snd_usX2Y_substream_t *subs) +static void usX2Y_usbpcm_urbs_release(struct snd_usX2Y_substream *subs) { int i; snd_printdd("snd_usX2Y_urbs_release() %i\n", subs->endpoint); @@ -285,7 +284,7 @@ static void usX2Y_usbpcm_urbs_release(snd_usX2Y_substream_t *subs) usX2Y_hwdep_urb_release(subs->urb + i); } -static void usX2Y_usbpcm_subs_startup_finish(usX2Ydev_t * usX2Y) +static void usX2Y_usbpcm_subs_startup_finish(struct usX2Ydev * usX2Y) { usX2Y_urbs_set_complete(usX2Y, i_usX2Y_usbpcm_urb_complete); usX2Y->prepare_subs = NULL; @@ -293,14 +292,14 @@ static void usX2Y_usbpcm_subs_startup_finish(usX2Ydev_t * usX2Y) static void i_usX2Y_usbpcm_subs_startup(struct urb *urb, struct pt_regs *regs) { - snd_usX2Y_substream_t *subs = (snd_usX2Y_substream_t*)urb->context; - usX2Ydev_t *usX2Y = subs->usX2Y; - snd_usX2Y_substream_t *prepare_subs = usX2Y->prepare_subs; + struct snd_usX2Y_substream *subs = urb->context; + struct usX2Ydev *usX2Y = subs->usX2Y; + struct snd_usX2Y_substream *prepare_subs = usX2Y->prepare_subs; if (NULL != prepare_subs && urb->start_frame == prepare_subs->urb[0]->start_frame) { atomic_inc(&prepare_subs->state); if (prepare_subs == usX2Y->subs[SNDRV_PCM_STREAM_CAPTURE]) { - snd_usX2Y_substream_t *cap_subs2 = usX2Y->subs[SNDRV_PCM_STREAM_CAPTURE + 2]; + struct snd_usX2Y_substream *cap_subs2 = usX2Y->subs[SNDRV_PCM_STREAM_CAPTURE + 2]; if (cap_subs2 != NULL) atomic_inc(&cap_subs2->state); } @@ -314,7 +313,7 @@ static void i_usX2Y_usbpcm_subs_startup(struct urb *urb, struct pt_regs *regs) /* * initialize a substream's urbs */ -static int usX2Y_usbpcm_urbs_allocate(snd_usX2Y_substream_t *subs) +static int usX2Y_usbpcm_urbs_allocate(struct snd_usX2Y_substream *subs) { int i; unsigned int pipe; @@ -329,7 +328,7 @@ static int usX2Y_usbpcm_urbs_allocate(snd_usX2Y_substream_t *subs) /* allocate and initialize data urbs */ for (i = 0; i < NRURBS; i++) { - struct urb** purb = subs->urb + i; + struct urb **purb = subs->urb + i; if (*purb) { usb_kill_urb(*purb); continue; @@ -358,16 +357,16 @@ static int usX2Y_usbpcm_urbs_allocate(snd_usX2Y_substream_t *subs) /* * free the buffer */ -static int snd_usX2Y_usbpcm_hw_free(snd_pcm_substream_t *substream) +static int snd_usX2Y_usbpcm_hw_free(struct snd_pcm_substream *substream) { - snd_pcm_runtime_t *runtime = substream->runtime; - snd_usX2Y_substream_t *subs = (snd_usX2Y_substream_t *)runtime->private_data, + struct snd_pcm_runtime *runtime = substream->runtime; + struct snd_usX2Y_substream *subs = runtime->private_data, *cap_subs2 = subs->usX2Y->subs[SNDRV_PCM_STREAM_CAPTURE + 2]; - down(&subs->usX2Y->prepare_mutex); + mutex_lock(&subs->usX2Y->prepare_mutex); snd_printdd("snd_usX2Y_usbpcm_hw_free(%p)\n", substream); if (SNDRV_PCM_STREAM_PLAYBACK == substream->stream) { - snd_usX2Y_substream_t *cap_subs = subs->usX2Y->subs[SNDRV_PCM_STREAM_CAPTURE]; + struct snd_usX2Y_substream *cap_subs = subs->usX2Y->subs[SNDRV_PCM_STREAM_CAPTURE]; atomic_set(&subs->state, state_STOPPED); usX2Y_usbpcm_urbs_release(subs); if (!cap_subs->pcm_substream || @@ -382,7 +381,7 @@ static int snd_usX2Y_usbpcm_hw_free(snd_pcm_substream_t *substream) usX2Y_usbpcm_urbs_release(cap_subs2); } } else { - snd_usX2Y_substream_t *playback_subs = subs->usX2Y->subs[SNDRV_PCM_STREAM_PLAYBACK]; + struct snd_usX2Y_substream *playback_subs = subs->usX2Y->subs[SNDRV_PCM_STREAM_PLAYBACK]; if (atomic_read(&playback_subs->state) < state_PREPARED) { atomic_set(&subs->state, state_STOPPED); if (NULL != cap_subs2) @@ -392,24 +391,24 @@ static int snd_usX2Y_usbpcm_hw_free(snd_pcm_substream_t *substream) usX2Y_usbpcm_urbs_release(cap_subs2); } } - up(&subs->usX2Y->prepare_mutex); + mutex_unlock(&subs->usX2Y->prepare_mutex); return snd_pcm_lib_free_pages(substream); } -static void usX2Y_usbpcm_subs_startup(snd_usX2Y_substream_t *subs) +static void usX2Y_usbpcm_subs_startup(struct snd_usX2Y_substream *subs) { - usX2Ydev_t * usX2Y = subs->usX2Y; + struct usX2Ydev * usX2Y = subs->usX2Y; usX2Y->prepare_subs = subs; subs->urb[0]->start_frame = -1; - smp_wmb(); // Make shure above modifications are seen by i_usX2Y_subs_startup() + smp_wmb(); // Make sure above modifications are seen by i_usX2Y_subs_startup() usX2Y_urbs_set_complete(usX2Y, i_usX2Y_usbpcm_subs_startup); } -static int usX2Y_usbpcm_urbs_start(snd_usX2Y_substream_t *subs) +static int usX2Y_usbpcm_urbs_start(struct snd_usX2Y_substream *subs) { int p, u, err, stream = subs->pcm_substream->stream; - usX2Ydev_t *usX2Y = subs->usX2Y; + struct usX2Ydev *usX2Y = subs->usX2Y; if (SNDRV_PCM_STREAM_CAPTURE == stream) { usX2Y->hwdep_pcm_shm->captured_iso_head = -1; @@ -417,7 +416,7 @@ static int usX2Y_usbpcm_urbs_start(snd_usX2Y_substream_t *subs) } for (p = 0; 3 >= (stream + p); p += 2) { - snd_usX2Y_substream_t *subs = usX2Y->subs[stream + p]; + struct snd_usX2Y_substream *subs = usX2Y->subs[stream + p]; if (subs != NULL) { if ((err = usX2Y_usbpcm_urbs_allocate(subs)) < 0) return err; @@ -426,17 +425,16 @@ static int usX2Y_usbpcm_urbs_start(snd_usX2Y_substream_t *subs) } for (p = 0; p < 4; p++) { - snd_usX2Y_substream_t *subs = usX2Y->subs[p]; + struct snd_usX2Y_substream *subs = usX2Y->subs[p]; if (subs != NULL && atomic_read(&subs->state) >= state_PREPARED) goto start; } - usX2Y->wait_iso_frame = -1; start: usX2Y_usbpcm_subs_startup(subs); for (u = 0; u < NRURBS; u++) { for (p = 0; 3 >= (stream + p); p += 2) { - snd_usX2Y_substream_t *subs = usX2Y->subs[stream + p]; + struct snd_usX2Y_substream *subs = usX2Y->subs[stream + p]; if (subs != NULL) { struct urb *urb = subs->urb[u]; if (usb_pipein(urb->pipe)) { @@ -456,7 +454,7 @@ static int usX2Y_usbpcm_urbs_start(snd_usX2Y_substream_t *subs) goto cleanup; } else { snd_printdd("%i\n", urb->start_frame); - if (0 > usX2Y->wait_iso_frame) + if (u == 0) usX2Y->wait_iso_frame = urb->start_frame; } urb->transfer_flags = 0; @@ -485,22 +483,22 @@ static int usX2Y_usbpcm_urbs_start(snd_usX2Y_substream_t *subs) * * set format and initialize urbs */ -static int snd_usX2Y_usbpcm_prepare(snd_pcm_substream_t *substream) +static int snd_usX2Y_usbpcm_prepare(struct snd_pcm_substream *substream) { - snd_pcm_runtime_t *runtime = substream->runtime; - snd_usX2Y_substream_t *subs = (snd_usX2Y_substream_t *)runtime->private_data; - usX2Ydev_t *usX2Y = subs->usX2Y; - snd_usX2Y_substream_t *capsubs = subs->usX2Y->subs[SNDRV_PCM_STREAM_CAPTURE]; + struct snd_pcm_runtime *runtime = substream->runtime; + struct snd_usX2Y_substream *subs = runtime->private_data; + struct usX2Ydev *usX2Y = subs->usX2Y; + struct snd_usX2Y_substream *capsubs = subs->usX2Y->subs[SNDRV_PCM_STREAM_CAPTURE]; int err = 0; snd_printdd("snd_usX2Y_pcm_prepare(%p)\n", substream); if (NULL == usX2Y->hwdep_pcm_shm) { - if (NULL == (usX2Y->hwdep_pcm_shm = snd_malloc_pages(sizeof(snd_usX2Y_hwdep_pcm_shm_t), GFP_KERNEL))) + if (NULL == (usX2Y->hwdep_pcm_shm = snd_malloc_pages(sizeof(struct snd_usX2Y_hwdep_pcm_shm), GFP_KERNEL))) return -ENOMEM; - memset(usX2Y->hwdep_pcm_shm, 0, sizeof(snd_usX2Y_hwdep_pcm_shm_t)); + memset(usX2Y->hwdep_pcm_shm, 0, sizeof(struct snd_usX2Y_hwdep_pcm_shm)); } - down(&usX2Y->prepare_mutex); + mutex_lock(&usX2Y->prepare_mutex); usX2Y_subs_prepare(subs); // Start hardware streams // SyncStream first.... @@ -511,7 +509,8 @@ static int snd_usX2Y_usbpcm_prepare(snd_pcm_substream_t *substream) if (usX2Y->rate != runtime->rate) if ((err = usX2Y_rate_set(usX2Y, runtime->rate)) < 0) goto up_prepare_mutex; - snd_printdd("starting capture pipe for %s\n", subs == capsubs ? "self" : "playpipe"); + snd_printdd("starting capture pipe for %s\n", subs == capsubs ? + "self" : "playpipe"); if (0 > (err = usX2Y_usbpcm_urbs_start(capsubs))) goto up_prepare_mutex; } @@ -519,12 +518,13 @@ static int snd_usX2Y_usbpcm_prepare(snd_pcm_substream_t *substream) if (subs != capsubs) { usX2Y->hwdep_pcm_shm->playback_iso_start = -1; if (atomic_read(&subs->state) < state_PREPARED) { - while (usX2Y_iso_frames_per_buffer(runtime, usX2Y) > usX2Y->hwdep_pcm_shm->captured_iso_frames) { - signed long timeout; - snd_printd("Wait: iso_frames_per_buffer=%i,captured_iso_frames=%i\n", usX2Y_iso_frames_per_buffer(runtime, usX2Y), usX2Y->hwdep_pcm_shm->captured_iso_frames); - set_current_state(TASK_INTERRUPTIBLE); - timeout = schedule_timeout(HZ/100 + 1); - if (signal_pending(current)) { + while (usX2Y_iso_frames_per_buffer(runtime, usX2Y) > + usX2Y->hwdep_pcm_shm->captured_iso_frames) { + snd_printdd("Wait: iso_frames_per_buffer=%i," + "captured_iso_frames=%i\n", + usX2Y_iso_frames_per_buffer(runtime, usX2Y), + usX2Y->hwdep_pcm_shm->captured_iso_frames); + if (msleep_interruptible(10)) { err = -ERESTARTSYS; goto up_prepare_mutex; } @@ -532,16 +532,18 @@ static int snd_usX2Y_usbpcm_prepare(snd_pcm_substream_t *substream) if (0 > (err = usX2Y_usbpcm_urbs_start(subs))) goto up_prepare_mutex; } - snd_printd("Ready: iso_frames_per_buffer=%i,captured_iso_frames=%i\n", usX2Y_iso_frames_per_buffer(runtime, usX2Y), usX2Y->hwdep_pcm_shm->captured_iso_frames); + snd_printdd("Ready: iso_frames_per_buffer=%i,captured_iso_frames=%i\n", + usX2Y_iso_frames_per_buffer(runtime, usX2Y), + usX2Y->hwdep_pcm_shm->captured_iso_frames); } else usX2Y->hwdep_pcm_shm->capture_iso_start = -1; up_prepare_mutex: - up(&usX2Y->prepare_mutex); + mutex_unlock(&usX2Y->prepare_mutex); return err; } -static snd_pcm_hardware_t snd_usX2Y_4c = +static struct snd_pcm_hardware snd_usX2Y_4c = { .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER | @@ -562,11 +564,11 @@ static snd_pcm_hardware_t snd_usX2Y_4c = -static int snd_usX2Y_usbpcm_open(snd_pcm_substream_t *substream) +static int snd_usX2Y_usbpcm_open(struct snd_pcm_substream *substream) { - snd_usX2Y_substream_t *subs = ((snd_usX2Y_substream_t **) + struct snd_usX2Y_substream *subs = ((struct snd_usX2Y_substream **) snd_pcm_substream_chip(substream))[substream->stream]; - snd_pcm_runtime_t *runtime = substream->runtime; + struct snd_pcm_runtime *runtime = substream->runtime; if (!(subs->usX2Y->chip_status & USX2Y_STAT_CHIP_MMAP_PCM_URBS)) return -EBUSY; @@ -580,18 +582,17 @@ static int snd_usX2Y_usbpcm_open(snd_pcm_substream_t *substream) } -static int snd_usX2Y_usbpcm_close(snd_pcm_substream_t *substream) +static int snd_usX2Y_usbpcm_close(struct snd_pcm_substream *substream) { - snd_pcm_runtime_t *runtime = substream->runtime; - snd_usX2Y_substream_t *subs = (snd_usX2Y_substream_t *)runtime->private_data; - int err = 0; - snd_printd("\n"); + struct snd_pcm_runtime *runtime = substream->runtime; + struct snd_usX2Y_substream *subs = runtime->private_data; + subs->pcm_substream = NULL; - return err; + return 0; } -static snd_pcm_ops_t snd_usX2Y_usbpcm_ops = +static struct snd_pcm_ops snd_usX2Y_usbpcm_ops = { .open = snd_usX2Y_usbpcm_open, .close = snd_usX2Y_usbpcm_close, @@ -604,18 +605,18 @@ static snd_pcm_ops_t snd_usX2Y_usbpcm_ops = }; -static int usX2Y_pcms_lock_check(snd_card_t *card) +static int usX2Y_pcms_lock_check(struct snd_card *card) { struct list_head *list; - snd_device_t *dev; - snd_pcm_t *pcm; + struct snd_device *dev; + struct snd_pcm *pcm; int err = 0; list_for_each(list, &card->devices) { dev = snd_device(list); if (dev->type != SNDRV_DEV_PCM) continue; pcm = dev->device_data; - down(&pcm->open_mutex); + mutex_lock(&pcm->open_mutex); } list_for_each(list, &card->devices) { int s; @@ -624,9 +625,9 @@ static int usX2Y_pcms_lock_check(snd_card_t *card) continue; pcm = dev->device_data; for (s = 0; s < 2; ++s) { - snd_pcm_substream_t *substream; + struct snd_pcm_substream *substream; substream = pcm->streams[s].substream; - if (substream && substream->open_flag) + if (substream && SUBSTREAM_BUSY(substream)) err = -EBUSY; } } @@ -634,25 +635,25 @@ static int usX2Y_pcms_lock_check(snd_card_t *card) } -static void usX2Y_pcms_unlock(snd_card_t *card) +static void usX2Y_pcms_unlock(struct snd_card *card) { struct list_head *list; - snd_device_t *dev; - snd_pcm_t *pcm; + struct snd_device *dev; + struct snd_pcm *pcm; list_for_each(list, &card->devices) { dev = snd_device(list); if (dev->type != SNDRV_DEV_PCM) continue; pcm = dev->device_data; - up(&pcm->open_mutex); + mutex_unlock(&pcm->open_mutex); } } -static int snd_usX2Y_hwdep_pcm_open(snd_hwdep_t *hw, struct file *file) +static int snd_usX2Y_hwdep_pcm_open(struct snd_hwdep *hw, struct file *file) { // we need to be the first - snd_card_t *card = hw->card; + struct snd_card *card = hw->card; int err = usX2Y_pcms_lock_check(card); if (0 == err) usX2Y(card)->chip_status |= USX2Y_STAT_CHIP_MMAP_PCM_URBS; @@ -661,9 +662,9 @@ static int snd_usX2Y_hwdep_pcm_open(snd_hwdep_t *hw, struct file *file) } -static int snd_usX2Y_hwdep_pcm_release(snd_hwdep_t *hw, struct file *file) +static int snd_usX2Y_hwdep_pcm_release(struct snd_hwdep *hw, struct file *file) { - snd_card_t *card = hw->card; + struct snd_card *card = hw->card; int err = usX2Y_pcms_lock_check(card); if (0 == err) usX2Y(hw->card)->chip_status &= ~USX2Y_STAT_CHIP_MMAP_PCM_URBS; @@ -691,8 +692,9 @@ static struct page * snd_usX2Y_hwdep_pcm_vm_nopage(struct vm_area_struct *area, offset = area->vm_pgoff << PAGE_SHIFT; offset += address - area->vm_start; snd_assert((offset % PAGE_SIZE) == 0, return NOPAGE_OOM); - vaddr = (char*)((usX2Ydev_t*)area->vm_private_data)->hwdep_pcm_shm + offset; + vaddr = (char*)((struct usX2Ydev *)area->vm_private_data)->hwdep_pcm_shm + offset; page = virt_to_page(vaddr); + get_page(page); if (type) *type = VM_FAULT_MINOR; @@ -708,17 +710,17 @@ static struct vm_operations_struct snd_usX2Y_hwdep_pcm_vm_ops = { }; -static int snd_usX2Y_hwdep_pcm_mmap(snd_hwdep_t * hw, struct file *filp, struct vm_area_struct *area) +static int snd_usX2Y_hwdep_pcm_mmap(struct snd_hwdep * hw, struct file *filp, struct vm_area_struct *area) { unsigned long size = (unsigned long)(area->vm_end - area->vm_start); - usX2Ydev_t *usX2Y = (usX2Ydev_t*)hw->private_data; + struct usX2Ydev *usX2Y = hw->private_data; - if (!(((usX2Ydev_t*)hw->private_data)->chip_status & USX2Y_STAT_CHIP_INIT)) + if (!(usX2Y->chip_status & USX2Y_STAT_CHIP_INIT)) return -EBUSY; /* if userspace tries to mmap beyond end of our buffer, fail */ - if (size > PAGE_ALIGN(sizeof(snd_usX2Y_hwdep_pcm_shm_t))) { - snd_printd("%lu > %lu\n", size, (unsigned long)sizeof(snd_usX2Y_hwdep_pcm_shm_t)); + if (size > PAGE_ALIGN(sizeof(struct snd_usX2Y_hwdep_pcm_shm))) { + snd_printd("%lu > %lu\n", size, (unsigned long)sizeof(struct snd_usX2Y_hwdep_pcm_shm)); return -EINVAL; } @@ -727,39 +729,31 @@ static int snd_usX2Y_hwdep_pcm_mmap(snd_hwdep_t * hw, struct file *filp, struct } area->vm_ops = &snd_usX2Y_hwdep_pcm_vm_ops; area->vm_flags |= VM_RESERVED; - snd_printd("vm_flags=0x%lX\n", area->vm_flags); area->vm_private_data = hw->private_data; return 0; } -static void snd_usX2Y_hwdep_pcm_private_free(snd_hwdep_t *hwdep) +static void snd_usX2Y_hwdep_pcm_private_free(struct snd_hwdep *hwdep) { - usX2Ydev_t *usX2Y = (usX2Ydev_t *)hwdep->private_data; + struct usX2Ydev *usX2Y = hwdep->private_data; if (NULL != usX2Y->hwdep_pcm_shm) - snd_free_pages(usX2Y->hwdep_pcm_shm, sizeof(snd_usX2Y_hwdep_pcm_shm_t)); + snd_free_pages(usX2Y->hwdep_pcm_shm, sizeof(struct snd_usX2Y_hwdep_pcm_shm)); } -static void snd_usX2Y_usbpcm_private_free(snd_pcm_t *pcm) -{ - snd_pcm_lib_preallocate_free_for_all(pcm); -} - - -int usX2Y_hwdep_pcm_new(snd_card_t* card) +int usX2Y_hwdep_pcm_new(struct snd_card *card) { int err; - snd_hwdep_t *hw; - snd_pcm_t *pcm; + struct snd_hwdep *hw; + struct snd_pcm *pcm; struct usb_device *dev = usX2Y(card)->chip.dev; if (1 != nr_of_packs()) return 0; - if ((err = snd_hwdep_new(card, SND_USX2Y_USBPCM_ID, 1, &hw)) < 0) { - snd_printd("\n"); + if ((err = snd_hwdep_new(card, SND_USX2Y_USBPCM_ID, 1, &hw)) < 0) return err; - } + hw->iface = SNDRV_HWDEP_IFACE_USX2Y_PCM; hw->private_data = usX2Y(card); hw->private_free = snd_usX2Y_hwdep_pcm_private_free; @@ -777,7 +771,6 @@ int usX2Y_hwdep_pcm_new(snd_card_t* card) snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_usX2Y_usbpcm_ops); pcm->private_data = usX2Y(card)->subs; - pcm->private_free = snd_usX2Y_usbpcm_private_free; pcm->info_flags = 0; sprintf(pcm->name, NAME_ALLCAPS" hwdep Audio"); @@ -789,7 +782,6 @@ int usX2Y_hwdep_pcm_new(snd_card_t* card) SNDRV_DMA_TYPE_CONTINUOUS, snd_dma_continuous_data(GFP_KERNEL), 64*1024, 128*1024))) { - snd_usX2Y_usbpcm_private_free(pcm); return err; } @@ -799,7 +791,7 @@ int usX2Y_hwdep_pcm_new(snd_card_t* card) #else -int usX2Y_hwdep_pcm_new(snd_card_t* card) +int usX2Y_hwdep_pcm_new(struct snd_card *card) { return 0; } diff --git a/usr/Makefile b/usr/Makefile index e93824269..5b31c0b61 100644 --- a/usr/Makefile +++ b/usr/Makefile @@ -35,6 +35,9 @@ quiet_cmd_initfs = GEN $@ cmd_initfs = $(initramfs) -o $@ $(ramfs-args) $(ramfs-input) targets := initramfs_data.cpio.gz +# do not try to update files included in initramfs +$(deps_initramfs): ; + $(deps_initramfs): klibcdirs # We rebuild initramfs_data.cpio.gz if: # 1) Any included file is newer then initramfs_data.cpio.gz -- 2.47.0